From a44cdef708e26c516d4f347e70f58b1779bd67e8 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 24 Jul 2024 10:35:28 -0400 Subject: [PATCH 001/545] Michael's PoC --- .../src/staking/NativeTokenStakingManager.sol | 41 ++ contracts/src/staking/StakingManager.sol | 453 ++++++++++++++++++ contracts/src/staking/StakingMessages.sol | 289 +++++++++++ .../interfaces/IERC20TokenStakingManager.sol | 28 ++ .../interfaces/INativeTokenStakingManager.sol | 27 ++ .../staking/interfaces/IRewardCalculator.sol | 18 + .../staking/interfaces/IStakingManager.sol | 99 ++++ 7 files changed, 955 insertions(+) create mode 100644 contracts/src/staking/NativeTokenStakingManager.sol create mode 100644 contracts/src/staking/StakingManager.sol create mode 100644 contracts/src/staking/StakingMessages.sol create mode 100644 contracts/src/staking/interfaces/IERC20TokenStakingManager.sol create mode 100644 contracts/src/staking/interfaces/INativeTokenStakingManager.sol create mode 100644 contracts/src/staking/interfaces/IRewardCalculator.sol create mode 100644 contracts/src/staking/interfaces/IStakingManager.sol diff --git a/contracts/src/staking/NativeTokenStakingManager.sol b/contracts/src/staking/NativeTokenStakingManager.sol new file mode 100644 index 000000000..ee5de3cb7 --- /dev/null +++ b/contracts/src/staking/NativeTokenStakingManager.sol @@ -0,0 +1,41 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.18; + +import {INativeTokenStakingManager} from "./interfaces/INativeTokenStakingManager.sol"; +import {Address} from "@openzeppelin/contracts@4.8.1/utils/Address.sol"; +import {StakingManager} from "./StakingManager.sol"; + +contract NativeTokenStakingManager is StakingManager, INativeTokenStakingManager { + using Address for address payable; + /** + * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. + * @param nodeID The node ID of the validator being registered. + * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. + * @param signature The raw bytes of the Ed25519 signature over the concatenated bytes of + * [subnetID]+[nodeID]+[blsPublicKey]+[weight]+[balance]+[expiry]. This signature must correspond to the Ed25519 + * public key that is used for the nodeID. This approach prevents NodeIDs from being unwillingly added to Subnets. + * balance is the minimum initial $nAVAX balance that must be attached to the validator serialized as a uint64. + * The signature field will be validated by the P-Chain. Implementations may choose to validate that the signature + * field is well-formed but it is not required. + */ + + function initializeValidatorRegistration( + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature + ) external payable onlyWhenInitialStakeProvided returns (bytes32) { + return _initializeValidatorRegistration(nodeID, msg.value, registrationExpiry, signature); + } + + function _lock(uint256 value) internal virtual override returns (uint256) { + return value; + } + + function _unlock(uint256 value, address to) internal virtual override { + payable(to).sendValue(value); + } +} diff --git a/contracts/src/staking/StakingManager.sol b/contracts/src/staking/StakingManager.sol new file mode 100644 index 000000000..060f161db --- /dev/null +++ b/contracts/src/staking/StakingManager.sol @@ -0,0 +1,453 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.18; + +import {IStakingManager} from "./interfaces/IStakingManager.sol"; +import { + WarpMessage, + IWarpMessenger +} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; +import {ReentrancyGuard} from "@openzeppelin/contracts@4.8.1/security/ReentrancyGuard.sol"; +import {StakingMessages} from "./StakingMessages.sol"; +import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; + +abstract contract StakingManager is ReentrancyGuard, IStakingManager { + enum ValidatorStatus { + Unknown, + PendingAdded, + Active, + PendingRemoved, + Completed, + Invalidated + } + + struct Validator { + ValidatorStatus status; + bytes32 nodeID; + uint64 weight; + uint64 startedAt; + uint64 endedAt; + uint64 uptimeSeconds; + address owner; + bool rewarded; + uint64 messageNonce; + } + + struct ValidatorChrunPeriod { + uint256 startedAt; + uint64 initialStake; + uint64 churnAmount; + } + + // solhint-disable private-vars-leading-underscore + /// @custom:storage-location erc7201:avalanche-icm.storage.StakingManager + struct StakingManagerStorage { + IWarpMessenger _warpMessenger; + bytes32 _pChainBlockchainID; + bytes32 _subnetID; + uint256 _minimumStakeAmount; + uint256 _maximumStakeAmount; + uint64 _minimumStakeDuration; + IRewardCalculator _rewardCalculator; + uint8 _maximumHourlyChurn; + uint64 _remainingInitialStake; + ValidatorChrunPeriod _churnTracker; + // Maps the validationID to the registration message such that the message can be re-sent if needed. + mapping(bytes32 => bytes) _pendingRegisterValidationMessages; + // Maps the validationID to the validator information. + mapping(bytes32 => Validator) _validationPeriods; + // Maps the nodeID to the validationID for active validation periods. + mapping(bytes32 => bytes32) _activeValidators; + } + + // solhint-enable private-vars-leading-underscore + // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.StakingManager")) - 1)) & ~bytes32(uint256(0xff)); + // TODO: Update to correct storage slot + bytes32 private constant _NATIVE_TOKEN_STAKING_MANAGER_STORAGE_LOCATION = + 0x8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91; + + // solhint-disable ordering + function _getTokenHomeStorage() private pure returns (StakingManagerStorage storage $) { + // solhint-disable-next-line no-inline-assembly + assembly { + $.slot := _NATIVE_TOKEN_STAKING_MANAGER_STORAGE_LOCATION + } + } + + struct InitialStakerInfo { + StakingMessages.ValidationInfo validationInfo; + address owner; + } + + struct StakingManagerSettings { + bytes32 pChainBlockchainID; + bytes32 subnetID; + uint256 minimumStakeAmount; + uint256 maximumStakeAmount; + uint64 minimumStakeDuration; + uint8 maximumHourlyChurn; + InitialStakerInfo[] initialStakers; + IRewardCalculator rewardCalculator; + } + + function initialize(StakingManagerSettings calldata settings) public { + StakingManagerStorage storage $ = _getTokenHomeStorage(); + $._warpMessenger = IWarpMessenger(0x0200000000000000000000000000000000000005); + $._pChainBlockchainID = settings.pChainBlockchainID; + $._subnetID = settings.subnetID; + $._minimumStakeAmount = settings.minimumStakeAmount; + $._maximumStakeAmount = settings.maximumStakeAmount; + $._minimumStakeDuration = settings.minimumStakeDuration; + $._maximumHourlyChurn = settings.maximumHourlyChurn; + // Add each of the initial stakers as validators + uint64 initialStake; + for (uint256 i; i < settings.initialStakers.length; ++i) { + (bytes32 validationID,) = + StakingMessages.packValidationInfo(settings.initialStakers[i].validationInfo); + $._validationPeriods[validationID] = Validator({ + status: ValidatorStatus.Active, + nodeID: settings.initialStakers[i].validationInfo.nodeID, + weight: settings.initialStakers[i].validationInfo.weight, + startedAt: uint64(block.timestamp), + endedAt: 0, + uptimeSeconds: 0, + owner: settings.initialStakers[i].owner, + rewarded: false, + messageNonce: 0 + }); + initialStake += settings.initialStakers[i].validationInfo.weight; + } + $._remainingInitialStake = initialStake; + $._rewardCalculator = settings.rewardCalculator; + } + + /** + * @notice Modifier to ensure that the initial stake has been provided. + */ + modifier onlyWhenInitialStakeProvided() { + StakingManagerStorage storage $ = _getTokenHomeStorage(); + require($._remainingInitialStake > 0, "StakingManager: Initial stake not provided"); + _; + } + + /** + * @notice Called to provide initial stake amount for original validators added prior to the contract's initialization. + */ + function provideInitialStake() external payable { + StakingManagerStorage storage $ = _getTokenHomeStorage(); + uint64 remainingInitialStake = $._remainingInitialStake; + require( + msg.value <= remainingInitialStake, + "StakingManager: Provided stake exceeds remaining initial stake" + ); + $._remainingInitialStake = remainingInitialStake - uint64(msg.value); + } + + /** + * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. + * @param nodeID The node ID of the validator being registered. + * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. + * @param signature The raw bytes of the Ed25519 signature over the concatenated bytes of + * [subnetID]+[nodeID]+[blsPublicKey]+[weight]+[balance]+[expiry]. This signature must correspond to the Ed25519 + * public key that is used for the nodeID. This approach prevents NodeIDs from being unwillingly added to Subnets. + * balance is the minimum initial $nAVAX balance that must be attached to the validator serialized as a uint64. + * The signature field will be validated by the P-Chain. Implementations may choose to validate that the signature + * field is well-formed but it is not required. + */ + function _initializeValidatorRegistration( + bytes32 nodeID, + uint256 value, + uint64 registrationExpiry, + bytes memory signature + ) internal nonReentrant onlyWhenInitialStakeProvided returns (bytes32) { + StakingManagerStorage storage $ = _getTokenHomeStorage(); + + // Ensure the registration expiry is in a valid range. + require( + registrationExpiry > block.timestamp && block.timestamp + 2 days > registrationExpiry, + "StakingManager: Invalid registration expiry" + ); + + // Ensure the nodeID is not the zero address, and is not already an active validator. + require(nodeID != bytes32(0), "StakingManager: Invalid node ID"); + require($._activeValidators[nodeID] == bytes32(0), "StakingManager: Node ID already active"); + + // Ensure the signature is the proper length. The EVM does not provide an Ed25519 precompile to + // validate the signature, but the P-Chain will validate the signature. If the signature is invalid, + // the P-Chain will reject the registration, and the stake can be returned to the staker after the registration + // expiry has passed. + require(signature.length == 64, "StakingManager: Invalid signature length"); + + // Lock the stake in the contract. + uint256 lockedValue = _lock(value); + + // Ensure the stake churn doesn't exceed the maximum churn rate. + uint64 weight = valueToWeight(lockedValue); + _checkAndUpdateChurnTracker(weight); + + // Ensure the weight is within the valid range. + require( + weight >= $._minimumStakeAmount && weight <= $._maximumStakeAmount, + "StakingManager: Invalid stake amount" + ); + + (bytes32 validationID, bytes memory registerSubnetValidatorMessage) = StakingMessages + .packRegisterSubnetValidatorMessage( + StakingMessages.ValidationInfo({ + subnetID: $._subnetID, + nodeID: nodeID, + weight: weight, + registrationExpiry: registrationExpiry, + signature: signature + }) + ); + $._pendingRegisterValidationMessages[validationID] = registerSubnetValidatorMessage; + + // Submit the message to the Warp precompile. + bytes32 messageID = $._warpMessenger.sendWarpMessage(registerSubnetValidatorMessage); + + $._validationPeriods[validationID] = Validator({ + status: ValidatorStatus.PendingAdded, + nodeID: nodeID, + weight: weight, + startedAt: 0, // The validation period only starts once the registration is acknowledged. + endedAt: 0, + uptimeSeconds: 0, + owner: msg.sender, + rewarded: false, + messageNonce: 0 + }); + emit ValidationPeriodCreated(validationID, nodeID, messageID, weight, registrationExpiry); + + return validationID; + } + + /** + * @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. + */ + function resendRegisterValidatorMessage(bytes32 validationID) external { + StakingManagerStorage storage $ = _getTokenHomeStorage(); + require( + $._pendingRegisterValidationMessages[validationID].length > 0 + && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, + "StakingManager: Invalid validation ID" + ); + + // Submit the message to the Warp precompile. + $._warpMessenger.sendWarpMessage($._pendingRegisterValidationMessages[validationID]); + } + + /** + * @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. + */ + function completeValidatorRegistration(uint32 messageIndex) external { + StakingManagerStorage storage $ = _getTokenHomeStorage(); + (WarpMessage memory warpMessage, bool valid) = + $._warpMessenger.getVerifiedWarpMessage(messageIndex); + require(valid, "StakingManager: Invalid warp message"); + + require( + warpMessage.sourceChainID == $._pChainBlockchainID, + "StakingManager: Invalid source chain ID" + ); + require( + warpMessage.originSenderAddress == address(0), + "StakingManager: Invalid origin sender address" + ); + + (bytes32 validationID, bool validRegistration) = + StakingMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); + require(validRegistration, "StakingManager: Registration not valid"); + require( + $._pendingRegisterValidationMessages[validationID].length > 0 + && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, + "StakingManager: Invalid validation ID" + ); + + delete $._pendingRegisterValidationMessages[validationID]; + $._validationPeriods[validationID].status = ValidatorStatus.Active; + $._validationPeriods[validationID].startedAt = uint64(block.timestamp); + $._activeValidators[$._validationPeriods[validationID].nodeID] = validationID; + emit ValidationPeriodRegistered( + validationID, $._validationPeriods[validationID].weight, block.timestamp + ); + } + + /** + * @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. + */ + function initializeEndValidation( + bytes32 validationID, + bool includeUptimeProof, + uint32 messageIndex + ) external onlyWhenInitialStakeProvided { + StakingManagerStorage storage $ = _getTokenHomeStorage(); + + // Ensure the validation period is active. + Validator memory validator = $._validationPeriods[validationID]; + require(validator.status == ValidatorStatus.Active, "StakingManager: Validator not active"); + // TODO: Support use of contexts and _msgSender() instead of msg.sender + require(msg.sender == validator.owner, "StakingManager: Sender not validator owner"); + + // Check that removing this validator would not exceed the maximum churn rate. + _checkAndUpdateChurnTracker(validator.weight); + + // Update the validator status to pending removal. + // They are not removed from the active validators mapping until the P-Chain acknowledges the removal. + validator.status = ValidatorStatus.PendingRemoved; + + // Set the end time of the validation period, since it is no longer known to be an active validator + // on the P-Chain. + validator.endedAt = uint64(block.timestamp); + + uint64 uptimeSeconds; + if (includeUptimeProof) { + (WarpMessage memory warpMessage, bool valid) = + $._warpMessenger.getVerifiedWarpMessage(messageIndex); + require(valid, "StakingManager: Invalid warp message"); + + require( + warpMessage.sourceChainID == $._warpMessenger.getBlockchainID(), + "StakingManager: Invalid source chain ID" + ); + require( + warpMessage.originSenderAddress == address(0), + "StakingManager: Invalid origin sender address" + ); + + (bytes32 uptimeValidationID, uint64 uptime) = + StakingMessages.unpackValidationUptimeMessage(warpMessage.payload); + require( + validationID == uptimeValidationID, "StakingManager: Invalid uptime validation ID" + ); + uptimeSeconds = uptime; + } + validator.uptimeSeconds = uptimeSeconds; + + // Save the validator updates. + // TODO: Optimize storage writes here (probably don't need to write the whole value). + $._validationPeriods[validationID] = validator; + + // Submit the message to the Warp precompile. + bytes memory setValidatorWeightPayload = StakingMessages.packSetSubnetValidatorWeightMessage( + validationID, validator.messageNonce, 0 + ); + bytes32 messageID = $._warpMessenger.sendWarpMessage(setValidatorWeightPayload); + + // Emit the event to signal the start of the validator removal process. + emit ValidatorRemovalInitialized( + validationID, messageID, validator.weight, block.timestamp, uptimeSeconds + ); + } + + /** + * @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. + */ + function resendEndValidatorMessage(bytes32 validationID) external { + // TODO: Allow for these messages to be resent. + } + + /** + * @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. + * @param setWeightMessageType Whether or not the message type is a SetValidatorWeight message, or a + * SubnetValidatorRegistration message (with valid set to false). Both message types are valid for ending + * a validation period. + */ + function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) external { + StakingManagerStorage storage $ = _getTokenHomeStorage(); + + // Get the Warp message. + (WarpMessage memory warpMessage, bool valid) = + $._warpMessenger.getVerifiedWarpMessage(messageIndex); + require(valid, "StakingManager: Invalid warp message"); + + bytes32 validationID; + if (setWeightMessageType) { + uint64 weight; + (validationID,, weight) = + StakingMessages.unpackSetSubnetValidatorWeightMessage(warpMessage.payload); + require(weight == 0, "StakingManager: Weight must be 0"); + } else { + bool validRegistration; + (validationID, validRegistration) = + StakingMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); + require(!validRegistration, "StakingManager: Registration still valid"); + } + + // Note: The validation status is not necessarily PendingRemoved here. It could be PendingAdded if the + // registration was never successfully registered on the P-Chain, or it could be Active if the validator + // removed themselves directly on the P-Chain without going through the contract. + Validator memory validator = $._validationPeriods[validationID]; + // TODO: Support use of contexts and _msgSender() instead of msg.sender + require(msg.sender == validator.owner, "StakingManager: Sender not validator owner"); + + ValidatorStatus endStatus; + if ( + validator.status == ValidatorStatus.PendingRemoved + || validator.status == ValidatorStatus.Active + ) { + // Remove the validator from the active validators mapping. + delete $._activeValidators[validator.nodeID]; + endStatus = ValidatorStatus.Completed; + } else { + endStatus = ValidatorStatus.Invalidated; + } + + $._validationPeriods[validationID] = validator; + + // Unlock the stake. + + // Calculate the reward for the validator. + + // Emit event. + } + + /** + * @notice Helper function to check if the stake amount to be added or removed would exceed the maximum stake churn + * rate for the past hour. If the churn rate is exceeded, the function will revert. If the churn rate is not exceeded, + * the function will update the churn tracker with the new amount. + */ + function _checkAndUpdateChurnTracker(uint64 amount) private { + StakingManagerStorage storage $ = _getTokenHomeStorage(); + ValidatorChrunPeriod storage churnTracker = $._churnTracker; + uint256 currentTime = block.timestamp; + if (currentTime - churnTracker.startedAt >= 1 hours) { + churnTracker.churnAmount = amount; + churnTracker.startedAt = currentTime; + } else { + churnTracker.churnAmount += amount; + } + + uint8 churnPercentage = uint8((churnTracker.churnAmount * 100) / churnTracker.initialStake); + require( + churnPercentage <= $._maximumHourlyChurn, + "StakingManager: Maximum hourly churn rate exceeded" + ); + $._churnTracker = churnTracker; + } + + function valueToWeight(uint256 value) public pure returns (uint64) { + return uint64(value / 1e12); + } + + function weightToValue(uint64 weight) public pure returns (uint256) { + return uint256(weight) * 1e12; + } + + function _lock(uint256 value) internal virtual returns (uint256); + function _unlock(uint256 value, address to) internal virtual; +} diff --git a/contracts/src/staking/StakingMessages.sol b/contracts/src/staking/StakingMessages.sol new file mode 100644 index 000000000..1a77b9a94 --- /dev/null +++ b/contracts/src/staking/StakingMessages.sol @@ -0,0 +1,289 @@ +// (c) 2023, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem +pragma solidity 0.8.18; + +library StakingMessages { + // Subnets send a RegisterSubnetValidator message to the P-Chain to register a validator. + // The P-Chain responds with a RegisterSubnetValidator message indicating whether the registration was successful + // for the given validation ID. + uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 1; + // Subnets can send a SetSubnetValidatorWeight message to the P-Chain to update a validator's weight. + // The P-Chain responds with a SetSubnetValidatorWeight message acknowledging the weight update. + uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID = 2; + // The Subnet will self-sign a ValidationUptimeMessage to be provided when a validator is initiating + // the end of their validation period. + uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 3; + + // The information that uniquely identifies a subnet validation period. + // The SHA-256 hash of the concatenation of these field is the validationID. + struct ValidationInfo { + bytes32 subnetID; + bytes32 nodeID; + uint64 weight; + uint64 registrationExpiry; + bytes signature; + } + + // TODO: The implemenation of these packing and unpacking functions is neither tested or optimzied at all. + // Full test coverage should be provided, and the implementation should be optimized for gas efficiency. + + /** + * @notice Packs a RegisterSubnetValidator message into a byte array. + * The message format specification is: + * +-----------+----------+-----------+ + * | typeID : uint32 | 4 bytes | + * +-----------+----------+-----------+ + * | subnetID : [32]byte | 32 bytes | + * +-----------+----------+-----------+ + * | nodeID : [32]byte | 32 bytes | + * +-----------+----------+-----------+ + * | weight : uint64 | 8 bytes | + * +-----------+----------+-----------+ + * | expiry : uint64 | 8 bytes | + * +-----------+----------+-----------+ + * | signature : [64]byte | 64 bytes | + * +-----------+----------+-----------+ + * | 148 bytes | + * +-----------+ + */ + function packRegisterSubnetValidatorMessage(ValidationInfo memory valiationInfo) + internal + pure + returns (bytes32, bytes memory) + { + (bytes32 validationID, bytes memory serializedValidationInfo) = + packValidationInfo(valiationInfo); + + bytes memory res = new bytes(148); + // Pack the message type + for (uint256 i; i < 4; ++i) { + res[i] = bytes1(uint8(SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID >> (8 * (3 - i)))); + } + // Pack the validation info + for (uint256 i; i < 144; ++i) { + res[i + 4] = serializedValidationInfo[i]; + } + + return (validationID, res); + } + + /** + * @notice Unpacks a byte array as a RegisterSubnetValidator message. + * The message format specification is: + * +--------------+----------+----------+ + * | typeID : uint32 | 4 bytes | + * +--------------+----------+----------+ + * | validationID : [32]byte | 32 bytes | + * +--------------+----------+----------+ + * | valid : bool + 1 byte | + * +--------------+----------+----------+ + * | 37 bytes | + * +----------+ + * @return The validationID and whether or the validation period was registered + * or is not a validator and never will be a validator to do the expiry time passing. + */ + function unpackSubnetValidatorRegistrationMessage(bytes memory input) + internal + pure + returns (bytes32, bool) + { + require(input.length == 37, "StakingMessages: Invalid message length"); + + // Unpack the type ID + uint32 typeID; + for (uint256 i; i < 4; ++i) { + typeID |= uint32(uint8(input[i])) << uint32((8 * (3 - i))); + } + require( + typeID == SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID, + "StakingMessages: Invalid message type" + ); + + // Unpack the validation ID. + bytes32 validationID; + for (uint256 i; i < 32; ++i) { + validationID |= bytes32(uint256(uint8(input[i + 4])) << (8 * (31 - i))); + } + + // Unpack the validity + bool valid = input[36] != 0; + + return (validationID, valid); + } + + /** + * @notice Packs a SetSubnetValidatorWeight message into a byte array. + * The message format specification is: + * +--------------+----------+----------+ + * | typeID : uint32 | 4 bytes | + * +--------------+----------+----------+ + * | validationID : [32]byte | 32 bytes | + * +--------------+----------+----------+ + * | nonce : uint64 | 8 bytes | + * +--------------+----------+----------+ + * | weight : uint64 | 8 bytes | + * +--------------+----------+----------+ + * | 52 bytes | + * +----------+ + */ + function packSetSubnetValidatorWeightMessage( + bytes32 validationID, + uint64 nonce, + uint64 weight + ) internal pure returns (bytes memory) { + bytes memory res = new bytes(52); + // Pack the type ID. + for (uint256 i; i < 4; ++i) { + res[i] = bytes1(uint8(SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID >> (8 * (3 - i)))); + } + // Pack the validation ID. + for (uint256 i; i < 32; ++i) { + res[i + 4] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); + } + // Pack the nonce. + for (uint256 i; i < 8; ++i) { + res[i + 36] = bytes1(uint8(nonce >> (8 * (7 - i)))); + } + // Pack the weight. + for (uint256 i; i < 8; ++i) { + res[i + 44] = bytes1(uint8(weight >> (8 * (7 - i)))); + } + return res; + } + + /** + * @notice Unpacks a byte array as a SetSubnetValidatorWeight message. + * The message format specification is the same as the one used in above for packing. + */ + function unpackSetSubnetValidatorWeightMessage(bytes memory input) + internal + pure + returns (bytes32, uint64, uint64) + { + require(input.length == 52, "StakingMessages: Invalid message length"); + + // Unpack the type ID. + uint32 typeID; + for (uint256 i; i < 4; ++i) { + typeID |= uint32(uint8(input[i])) << uint32((8 * (3 - i))); + } + require( + typeID == SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID, + "StakingMessages: Invalid message type" + ); + + // Unpack the validation ID. + bytes32 validationID; + for (uint256 i; i < 32; ++i) { + validationID |= bytes32(uint256(uint8(input[i + 4])) << (8 * (31 - i))); + } + + // Unpack the nonce. + uint64 nonce; + for (uint256 i; i < 8; ++i) { + nonce |= uint64(uint8(input[i + 36])) << uint64((8 * (7 - i))); + } + + // Unpack the weight. + uint64 weight; + for (uint256 i; i < 8; ++i) { + weight |= uint64(uint8(input[i + 44])) << uint64((8 * (7 - i))); + } + + return (validationID, nonce, weight); + } + + /** + * @notice Unpacks a byte array as a ValidationUptimeMessage. + * The message format specification is: + * +--------------+----------+----------+ + * | typeID : uint32 | 4 bytes | + * +--------------+----------+----------+ + * | validationID : [32]byte | 32 bytes | + * +--------------+----------+----------+ + * | uptime : uint64 | 8 bytes | + * +--------------+----------+----------+ + * | 44 bytes | + * +----------+ + */ + function unpackValidationUptimeMessage(bytes memory input) + internal + pure + returns (bytes32, uint64) + { + require(input.length == 44, "StakingMessages: Invalid message length"); + + // Unpack the type ID. + uint32 typeID; + for (uint256 i; i < 4; ++i) { + typeID |= uint32(uint8(input[i])) << uint32((8 * (3 - i))); + } + require( + typeID == VALIDATION_UPTIME_MESSAGE_TYPE_ID, "StakingMessages: Invalid message type" + ); + + // Unpack the validation ID. + bytes32 validationID; + for (uint256 i; i < 32; ++i) { + validationID |= bytes32(uint256(uint8(input[i + 4])) << (8 * (31 - i))); + } + + // Unpack the uptime. + uint64 uptime; + for (uint256 i; i < 8; ++i) { + uptime |= uint64(uint8(input[i + 36])) << uint64((8 * (7 - i))); + } + + return (validationID, uptime); + } + + /** + * @notice Packs all of the information pertaining to a validation period into a byte array. + * The packed data is used to calculate the validationID as the SHA-256 hash of the packed data. + * The specification of the packed data is: + * +-----------+----------+-----------+ + * | subnetID : [32]byte | 32 bytes | + * +-----------+----------+-----------+ + * | nodeID : [32]byte | 32 bytes | + * +-----------+----------+-----------+ + * | weight : uint64 | 8 bytes | + * +-----------+----------+-----------+ + * | expiry : uint64 | 8 bytes | + * +-----------+----------+-----------+ + * | signature : [64]byte | 64 bytes | + * +-----------+----------+-----------+ + * | 144 bytes | + * +-----------+ + */ + function packValidationInfo(ValidationInfo memory validationInfo) + internal + pure + returns (bytes32, bytes memory) + { + require(validationInfo.signature.length == 64, "StakingMessages: Invalid signature length"); + bytes memory res = new bytes(144); + // Pack the subnetID + for (uint256 i; i < 32; ++i) { + res[i] = validationInfo.subnetID[i]; + } + // Pack the nodeID + for (uint256 i; i < 32; ++i) { + res[i + 32] = validationInfo.nodeID[i]; + } + // Pack the weight + for (uint256 i; i < 8; ++i) { + res[i + 64] = bytes1(uint8(validationInfo.weight >> uint8((8 * (7 - i))))); + } + // Pack the registration expiry + for (uint256 i; i < 8; ++i) { + res[i + 72] = bytes1(uint8(validationInfo.registrationExpiry >> uint64((8 * (7 - i))))); + } + // Pack the signature + for (uint256 i; i < 64; ++i) { + res[i + 80] = validationInfo.signature[i]; + } + return (sha256(res), res); + } +} diff --git a/contracts/src/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/src/staking/interfaces/IERC20TokenStakingManager.sol new file mode 100644 index 000000000..eb2cdc417 --- /dev/null +++ b/contracts/src/staking/interfaces/IERC20TokenStakingManager.sol @@ -0,0 +1,28 @@ +// (c) 2023, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +import {IStakingManager} from "./IStakingManager.sol"; + +pragma solidity 0.8.18; + +interface IERC20TokenStakingManager is IStakingManager { + /** + * @notice Begins the validator registration process. Locks the {stakeAmount} of the managers specified ERC20 token. + * @param nodeID The node ID of the validator being registered. + * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. + * @param signature The raw bytes of the Ed25519 signature over the concatenated bytes of + * [subnetID]+[nodeID]+[blsPublicKey]+[weight]+[balance]+[expiry]. This signature must correspond to the Ed25519 + * public key that is used for the nodeID. This approach prevents NodeIDs from being unwillingly added to Subnets. + * balance is the minimum initial $nAVAX balance that must be attached to the validator serialized as a uint64. + * The signature field will be validated by the P-Chain. Implementations may choose to validate that the signature + * field is well-formed but it is not required. + */ + function initializeValidatorRegistration( + uint256 stakeAmount, + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature + ) external returns (bytes32 validationID); +} diff --git a/contracts/src/staking/interfaces/INativeTokenStakingManager.sol b/contracts/src/staking/interfaces/INativeTokenStakingManager.sol new file mode 100644 index 000000000..a41336982 --- /dev/null +++ b/contracts/src/staking/interfaces/INativeTokenStakingManager.sol @@ -0,0 +1,27 @@ +// (c) 2023, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +import {IStakingManager} from "./IStakingManager.sol"; + +pragma solidity 0.8.18; + +interface INativeTokenStakingManager is IStakingManager { + /** + * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. + * @param nodeID The node ID of the validator being registered. + * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. + * @param signature The raw bytes of the Ed25519 signature over the concatenated bytes of + * [subnetID]+[nodeID]+[blsPublicKey]+[weight]+[balance]+[expiry]. This signature must correspond to the Ed25519 + * public key that is used for the nodeID. This approach prevents NodeIDs from being unwillingly added to Subnets. + * balance is the minimum initial $nAVAX balance that must be attached to the validator serialized as a uint64. + * The signature field will be validated by the P-Chain. Implementations may choose to validate that the signature + * field is well-formed but it is not required. + */ + function initializeValidatorRegistration( + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature + ) external payable returns (bytes32 validationID); +} diff --git a/contracts/src/staking/interfaces/IRewardCalculator.sol b/contracts/src/staking/interfaces/IRewardCalculator.sol new file mode 100644 index 000000000..ea15abf91 --- /dev/null +++ b/contracts/src/staking/interfaces/IRewardCalculator.sol @@ -0,0 +1,18 @@ +// (c) 2023, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +import {IStakingManager} from "./IStakingManager.sol"; + +pragma solidity 0.8.18; + +interface IRewardCalculator { + function calculateReward( + uint64 stakeAmount, + uint64 startTime, + uint64 endTime, + uint256 initialSupply, + uint256 endSupply + ) external returns (uint256); +} diff --git a/contracts/src/staking/interfaces/IStakingManager.sol b/contracts/src/staking/interfaces/IStakingManager.sol new file mode 100644 index 000000000..eec2e099b --- /dev/null +++ b/contracts/src/staking/interfaces/IStakingManager.sol @@ -0,0 +1,99 @@ +// (c) 2023, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.18; + +interface IStakingManager { + /** + * @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, + * and rewards for this validation period will not begin accruing until the {ValidationPeriodRegistered} event is + * emitted. + */ + event ValidationPeriodCreated( + bytes32 indexed validationID, + bytes32 indexed nodeID, + bytes32 indexed registerValidationMessageID, + uint256 weight, + uint64 registrationExpiry + ); + + /** + * @notice Emitted when the staking manager learns that the validation period has been successfully registered + * on the P-Chain. Rewards for this validation period will begin accruing when this event is emitted. + */ + event ValidationPeriodRegistered( + bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp + ); + + /** + * @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. + */ + event ValidatorRemovalInitialized( + bytes32 indexed validationID, + bytes32 indexed setWeightMessageID, + uint256 stakeAmount, + uint256 endTime, + uint64 uptime + ); + + /** + * @notice Emitted when the stake for a validation period is unlocked and returned to the staker. + * This is done by calling {completeEndValidation}, which provides proof from the P-Chain that the + * validation period is not active and will never be active in the future. + */ + event ValidationPeriodEnded(bytes32 indexed validationID); + + /** + * @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. + */ + function resendRegisterValidatorMessage(bytes32 validationID) external; + + /** + * @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. + */ + function completeValidatorRegistration(uint32 messageIndex) external; + + /** + * @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 includeUptimeProof Whether or not an uptime proof is provided for the validation period. + * If no uptime proof is provided, the validation uptime will be assumed to be 0. + * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the + * uptime proof. + */ + function initializeEndValidation( + bytes32 validationID, + bool includeUptimeProof, + uint32 messageIndex + ) external; + + /** + * @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. + */ + function resendEndValidatorMessage(bytes32 validationID) external; + + /** + * @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. + * @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. + * @param setWeightMessageType Whether or not the message type is a SetValidatorWeight message, or a + * SubnetValidatorRegistration message (with valid set to false). Both message types are valid for ending + * a validation period. + */ + function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) external; +} From 911341805c9d88814067b9cfba3c47bbf2636794 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 24 Jul 2024 16:06:43 -0500 Subject: [PATCH 002/545] staking contracts readme --- contracts/src/staking/README.md | 136 ++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 contracts/src/staking/README.md diff --git a/contracts/src/staking/README.md b/contracts/src/staking/README.md new file mode 100644 index 000000000..6667783cd --- /dev/null +++ b/contracts/src/staking/README.md @@ -0,0 +1,136 @@ +## Staking Manager Contract + +`StakingManager.sol` defines the staking contract used to manage subnet-only validators, as defined in [ACP-77](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets) + +_Disclaimer:_ The contracts in this directory are still under active development, are unaudited, and should not be used in production. + +## Usage + +The common case for adding or removing a validator from a Subnet's validator set follows these general steps: +1. Inform the Staking Manager contract of the change. The Staking Manager contract will construct a Warp message attesting to the change in the validator set. +2. Deliver the Warp message containing the validator set change to the P-Chain. The P-Chain will construct a Warp message acknowledging the change to the validator set. +3. Deliver the Warp message containing the P-Chain acknowledgement back to the Staking Manager contract on the Subnet. The Staking Manager contract finalizes the validator set change. + +### Initializing a Validator Set + +If the Subnet has no validators registered on the P-Chain, then it will not be able to sign a Warp message to add a validator (step 1 above). In this case, Subnet recovery must be performed on the P-Chain, which allows an initial validator set to be specified. The P-Chain constructs a Warp message (format specification TBD) describing the initial validator set (step 2 above). + +Once the Subnet has been recovered, the stake specified on the P-Chain must be locked in the Staking Contract before any further validator set changes may be made. This is done via the `provideInitialStake` method, and guarded by the `onlyWhenInitialStakeProvided` modifier. + + +### Registering a Validator + +Validator registration is initiated with a call to `initializeValidatorRegistration` on the concrete Staking Manager contract. The Staking Manager contract constructs a [`RegisterSubnetValidatorMessage`](#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each validator registration request includes all of the information needed to identify the validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. + +The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the payload of a `RegisterSubnetValidatorTx`. Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a [`SubnetValidatorRegistrationMessage`](#subnetvalidatorregistrationmessage) Warp message indicating that the specified validation was successfully registered on the P-Chain. + +The `SubnetValidatorRegistrationMessage` is delivered to the Staking Manager contract via a call to `completeValidatorRegistration`. Staking rewards begin accruing at this time. + +#### Handling a Missed Expiry + +In the case of a missed expiry, the `RegisterSubnetValidatorTx` will result in a `SubnetValidatorRegistrationMessage` Warp message with the `valid` field set to `0`. This serves as proof that the corresponding validation has not started and may never start. The `SubnetValidatorRegistrationMessage` can be provided to the Staking Manager contract by calling `completeEndValidation` with `setWeightMessageType=false`. + +### Removing a Validator + +As an optional first step, an uptime proof may be requested from the P-Chain, which will be used the calculate the staking rewards on the Subnet. The proof is embedded in a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message. + +Validators exit is initiated with a call to `initializeEndValidation` on the Staking Manager contract. A `ValidationUptimeMessage` Warp message may optionally be provided, otherwise the validator's uptime will be set to`0`. Once `initializeEndValidation` staking rewards cease accruing. The Staking Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. + +The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a `SetValidatorWeightTx`. This results in another `SetSubnetValidatorWeightMessage` Warp message, this time constructed by the P-Chain. + +This `SetSubnetValidatorWeightMessage` is delivered to the Staking Manager contract with a call to `completeEndValidation` with `setWeightMessageType=true`, at which point staking rewards are disbursed and the validation is removed from the contract's state. + +#### Exit the Validator Set Directly on the P-Chain + +ACP-77 also provides a method for validators to exit a Subnet's validator set without interacting with the Subnet directly via [`ExitValidatorSetTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#exitvalidatorsettx), which will remove the validator from the Subnet validator set tracked on the P-Chain. The P-Chain will contruct a `SetSubnetValidatorWeightMessage` with the weight set to `0`, that may then be provided to the Staking Manager contract via a call to `completeEndValidation`, as described above. Note however that without the uptime proof provided in the initial call to `initializeEndValidation`, the Staking Manager will not credit any staking rewards to the validator. + +## Warp Message Format Reference + +### `RegisterSubnetValidatorMessage` + +Description: Used to register a Subnet validator on the P-Chain + +Signed by: Subnet + +Specification: +``` ++-----------+----------+-----------+ +| typeID : uint32 | 4 bytes | ++-----------+----------+-----------+ +| subnetID : [32]byte | 32 bytes | ++-----------+----------+-----------+ +| nodeID : [32]byte | 32 bytes | ++-----------+----------+-----------+ +| weight : uint64 | 8 bytes | ++-----------+----------+-----------+ +| expiry : uint64 | 8 bytes | ++-----------+----------+-----------+ +| signature : [64]byte | 64 bytes | ++-----------+----------+-----------+ + | 148 bytes | + +-----------+ + +``` + +### `SubnetValidatorRegistrationMessage` + +Description: Used to confirm Subnet validator registration on the P-Chain + +Signed by: P-Chain + +Specification: +``` ++--------------+----------+----------+ +| typeID : uint32 | 4 bytes | ++--------------+----------+----------+ +| validationID : [32]byte | 32 bytes | ++--------------+----------+----------+ +| valid : bool | 1 byte | ++--------------+----------+----------+ + | 37 bytes | + +----------+ +``` + +### `ValidationUptimeMessage` + +Description: Used to provide validator uptime to the Subnet to calculate staking rewards + +Signed by: P-Chain + +Specification: +``` ++--------------+----------+----------+ +| typeID : uint32 | 4 bytes | ++--------------+----------+----------+ +| validationID : [32]byte | 32 bytes | ++--------------+----------+----------+ +| uptime : uint64 | 8 bytes | ++--------------+----------+----------+ + | 44 bytes | + +----------+ +``` + +### `SetSubnetValidatorWeightMessage` + +Description: Used to set a validator's stake weight on another chain + +Signed by: Subnet, P-Chain + +Specification: +``` ++-----------+----------+-----------+ +| typeID : uint32 | 4 bytes | ++-----------+----------+-----------+ +| subnetID : [32]byte | 32 bytes | ++-----------+----------+-----------+ +| nodeID : [32]byte | 32 bytes | ++-----------+----------+-----------+ +| weight : uint64 | 8 bytes | ++-----------+----------+-----------+ +| expiry : uint64 | 8 bytes | ++-----------+----------+-----------+ +| signature : [64]byte | 64 bytes | ++-----------+----------+-----------+ + | 148 bytes | + +-----------+ +``` \ No newline at end of file From cb8812584e91a49d50f298853b672e660d697485 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 25 Jul 2024 12:15:18 -0400 Subject: [PATCH 003/545] Implement resendEndValidatorMessage --- contracts/src/staking/StakingManager.sol | 55 ++++++++++++++---------- 1 file changed, 33 insertions(+), 22 deletions(-) diff --git a/contracts/src/staking/StakingManager.sol b/contracts/src/staking/StakingManager.sol index 060f161db..b2de77d7b 100644 --- a/contracts/src/staking/StakingManager.sol +++ b/contracts/src/staking/StakingManager.sol @@ -13,8 +13,9 @@ import { import {ReentrancyGuard} from "@openzeppelin/contracts@4.8.1/security/ReentrancyGuard.sol"; import {StakingMessages} from "./StakingMessages.sol"; import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; +import {Context} from "@openzeppelin/contracts@4.8.1/utils/Context.sol"; -abstract contract StakingManager is ReentrancyGuard, IStakingManager { +abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { enum ValidatorStatus { Unknown, PendingAdded, @@ -36,7 +37,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { uint64 messageNonce; } - struct ValidatorChrunPeriod { + struct ValidatorChurnPeriod { uint256 startedAt; uint64 initialStake; uint64 churnAmount; @@ -54,7 +55,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { IRewardCalculator _rewardCalculator; uint8 _maximumHourlyChurn; uint64 _remainingInitialStake; - ValidatorChrunPeriod _churnTracker; + ValidatorChurnPeriod _churnTracker; // Maps the validationID to the registration message such that the message can be re-sent if needed. mapping(bytes32 => bytes) _pendingRegisterValidationMessages; // Maps the validationID to the validator information. @@ -66,14 +67,14 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { // solhint-enable private-vars-leading-underscore // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.StakingManager")) - 1)) & ~bytes32(uint256(0xff)); // TODO: Update to correct storage slot - bytes32 private constant _NATIVE_TOKEN_STAKING_MANAGER_STORAGE_LOCATION = + bytes32 private constant _STAKING_MANAGER_STORAGE_LOCATION = 0x8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91; // solhint-disable ordering - function _getTokenHomeStorage() private pure returns (StakingManagerStorage storage $) { + function _getStakingManagerStorage() private pure returns (StakingManagerStorage storage $) { // solhint-disable-next-line no-inline-assembly assembly { - $.slot := _NATIVE_TOKEN_STAKING_MANAGER_STORAGE_LOCATION + $.slot := _STAKING_MANAGER_STORAGE_LOCATION } } @@ -94,7 +95,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { } function initialize(StakingManagerSettings calldata settings) public { - StakingManagerStorage storage $ = _getTokenHomeStorage(); + StakingManagerStorage storage $ = _getStakingManagerStorage(); $._warpMessenger = IWarpMessenger(0x0200000000000000000000000000000000000005); $._pChainBlockchainID = settings.pChainBlockchainID; $._subnetID = settings.subnetID; @@ -128,7 +129,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { * @notice Modifier to ensure that the initial stake has been provided. */ modifier onlyWhenInitialStakeProvided() { - StakingManagerStorage storage $ = _getTokenHomeStorage(); + StakingManagerStorage storage $ = _getStakingManagerStorage(); require($._remainingInitialStake > 0, "StakingManager: Initial stake not provided"); _; } @@ -137,7 +138,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { * @notice Called to provide initial stake amount for original validators added prior to the contract's initialization. */ function provideInitialStake() external payable { - StakingManagerStorage storage $ = _getTokenHomeStorage(); + StakingManagerStorage storage $ = _getStakingManagerStorage(); uint64 remainingInitialStake = $._remainingInitialStake; require( msg.value <= remainingInitialStake, @@ -163,7 +164,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { uint64 registrationExpiry, bytes memory signature ) internal nonReentrant onlyWhenInitialStakeProvided returns (bytes32) { - StakingManagerStorage storage $ = _getTokenHomeStorage(); + StakingManagerStorage storage $ = _getStakingManagerStorage(); // Ensure the registration expiry is in a valid range. require( @@ -216,7 +217,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { startedAt: 0, // The validation period only starts once the registration is acknowledged. endedAt: 0, uptimeSeconds: 0, - owner: msg.sender, + owner: _msgSender(), rewarded: false, messageNonce: 0 }); @@ -230,7 +231,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { * Only necessary if the original message can't be delivered due to validator churn. */ function resendRegisterValidatorMessage(bytes32 validationID) external { - StakingManagerStorage storage $ = _getTokenHomeStorage(); + StakingManagerStorage storage $ = _getStakingManagerStorage(); require( $._pendingRegisterValidationMessages[validationID].length > 0 && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, @@ -247,7 +248,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { * @param messageIndex The index of the Warp message to be received providing the acknowledgement. */ function completeValidatorRegistration(uint32 messageIndex) external { - StakingManagerStorage storage $ = _getTokenHomeStorage(); + StakingManagerStorage storage $ = _getStakingManagerStorage(); (WarpMessage memory warpMessage, bool valid) = $._warpMessenger.getVerifiedWarpMessage(messageIndex); require(valid, "StakingManager: Invalid warp message"); @@ -290,13 +291,12 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { bool includeUptimeProof, uint32 messageIndex ) external onlyWhenInitialStakeProvided { - StakingManagerStorage storage $ = _getTokenHomeStorage(); + StakingManagerStorage storage $ = _getStakingManagerStorage(); // Ensure the validation period is active. Validator memory validator = $._validationPeriods[validationID]; require(validator.status == ValidatorStatus.Active, "StakingManager: Validator not active"); - // TODO: Support use of contexts and _msgSender() instead of msg.sender - require(msg.sender == validator.owner, "StakingManager: Sender not validator owner"); + require(_msgSender() == validator.owner, "StakingManager: Sender not validator owner"); // Check that removing this validator would not exceed the maximum churn rate. _checkAndUpdateChurnTracker(validator.weight); @@ -332,6 +332,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { uptimeSeconds = uptime; } validator.uptimeSeconds = uptimeSeconds; + validator.messageNonce++; // Save the validator updates. // TODO: Optimize storage writes here (probably don't need to write the whole value). @@ -354,7 +355,18 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { * Only necessary if the original message can't be delivered due to validator churn. */ function resendEndValidatorMessage(bytes32 validationID) external { - // TODO: Allow for these messages to be resent. + StakingManagerStorage storage $ = _getStakingManagerStorage(); + Validator memory validator = $._validationPeriods[validationID]; + + require( + validator.status == ValidatorStatus.PendingRemoved, + "StakingManager: Validator not pending removal" + ); + + bytes memory setValidatorWeightPayload = StakingMessages.packSetSubnetValidatorWeightMessage( + validationID, validator.messageNonce, 0 + ); + $._warpMessenger.sendWarpMessage(setValidatorWeightPayload); } /** @@ -368,7 +380,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { * a validation period. */ function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) external { - StakingManagerStorage storage $ = _getTokenHomeStorage(); + StakingManagerStorage storage $ = _getStakingManagerStorage(); // Get the Warp message. (WarpMessage memory warpMessage, bool valid) = @@ -392,8 +404,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { // registration was never successfully registered on the P-Chain, or it could be Active if the validator // removed themselves directly on the P-Chain without going through the contract. Validator memory validator = $._validationPeriods[validationID]; - // TODO: Support use of contexts and _msgSender() instead of msg.sender - require(msg.sender == validator.owner, "StakingManager: Sender not validator owner"); + require(_msgSender() == validator.owner, "StakingManager: Sender not validator owner"); ValidatorStatus endStatus; if ( @@ -422,8 +433,8 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { * the function will update the churn tracker with the new amount. */ function _checkAndUpdateChurnTracker(uint64 amount) private { - StakingManagerStorage storage $ = _getTokenHomeStorage(); - ValidatorChrunPeriod storage churnTracker = $._churnTracker; + StakingManagerStorage storage $ = _getStakingManagerStorage(); + ValidatorChurnPeriod storage churnTracker = $._churnTracker; uint256 currentTime = block.timestamp; if (currentTime - churnTracker.startedAt >= 1 hours) { churnTracker.churnAmount = amount; From f46ce0910562772147234251955faa7adc924264 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 26 Jul 2024 11:12:10 -0500 Subject: [PATCH 004/545] correct message names in comments --- contracts/src/staking/StakingMessages.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/src/staking/StakingMessages.sol b/contracts/src/staking/StakingMessages.sol index 1a77b9a94..f52cb34f7 100644 --- a/contracts/src/staking/StakingMessages.sol +++ b/contracts/src/staking/StakingMessages.sol @@ -30,7 +30,7 @@ library StakingMessages { // Full test coverage should be provided, and the implementation should be optimized for gas efficiency. /** - * @notice Packs a RegisterSubnetValidator message into a byte array. + * @notice Packs a SetSubnetValidatorWeightMessage message into a byte array. * The message format specification is: * +-----------+----------+-----------+ * | typeID : uint32 | 4 bytes | @@ -70,7 +70,7 @@ library StakingMessages { } /** - * @notice Unpacks a byte array as a RegisterSubnetValidator message. + * @notice Unpacks a byte array as a SubnetValidatorRegistrationMessage message. * The message format specification is: * +--------------+----------+----------+ * | typeID : uint32 | 4 bytes | @@ -114,7 +114,7 @@ library StakingMessages { } /** - * @notice Packs a SetSubnetValidatorWeight message into a byte array. + * @notice Packs a SetSubnetValidatorWeightMessage message into a byte array. * The message format specification is: * +--------------+----------+----------+ * | typeID : uint32 | 4 bytes | From 8b40f9fb83f5d38c7867ac65e40f5f6ff4fb4d9a Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 26 Jul 2024 12:12:47 -0400 Subject: [PATCH 005/545] Integrate changes to main --- .../src/staking/NativeTokenStakingManager.sol | 4 ++-- contracts/src/staking/StakingManager.sol | 4 ++-- contracts/src/staking/StakingMessages.sol | 22 +++++++++---------- .../interfaces/IERC20TokenStakingManager.sol | 4 ++-- .../interfaces/INativeTokenStakingManager.sol | 4 ++-- .../staking/interfaces/IRewardCalculator.sol | 4 +--- .../staking/interfaces/IStakingManager.sol | 2 +- 7 files changed, 21 insertions(+), 23 deletions(-) diff --git a/contracts/src/staking/NativeTokenStakingManager.sol b/contracts/src/staking/NativeTokenStakingManager.sol index ee5de3cb7..84cd06ee5 100644 --- a/contracts/src/staking/NativeTokenStakingManager.sol +++ b/contracts/src/staking/NativeTokenStakingManager.sol @@ -3,10 +3,10 @@ // SPDX-License-Identifier: Ecosystem -pragma solidity 0.8.18; +pragma solidity 0.8.23; import {INativeTokenStakingManager} from "./interfaces/INativeTokenStakingManager.sol"; -import {Address} from "@openzeppelin/contracts@4.8.1/utils/Address.sol"; +import {Address} from "@openzeppelin/contracts@5.0.2/utils/Address.sol"; import {StakingManager} from "./StakingManager.sol"; contract NativeTokenStakingManager is StakingManager, INativeTokenStakingManager { diff --git a/contracts/src/staking/StakingManager.sol b/contracts/src/staking/StakingManager.sol index 060f161db..3b23da143 100644 --- a/contracts/src/staking/StakingManager.sol +++ b/contracts/src/staking/StakingManager.sol @@ -3,14 +3,14 @@ // SPDX-License-Identifier: Ecosystem -pragma solidity 0.8.18; +pragma solidity 0.8.23; import {IStakingManager} from "./interfaces/IStakingManager.sol"; import { WarpMessage, IWarpMessenger } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; -import {ReentrancyGuard} from "@openzeppelin/contracts@4.8.1/security/ReentrancyGuard.sol"; +import {ReentrancyGuard} from "@openzeppelin/contracts@5.0.2/utils/ReentrancyGuard.sol"; import {StakingMessages} from "./StakingMessages.sol"; import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; diff --git a/contracts/src/staking/StakingMessages.sol b/contracts/src/staking/StakingMessages.sol index 1a77b9a94..72b73972c 100644 --- a/contracts/src/staking/StakingMessages.sol +++ b/contracts/src/staking/StakingMessages.sol @@ -2,9 +2,19 @@ // See the file LICENSE for licensing terms. // SPDX-License-Identifier: Ecosystem -pragma solidity 0.8.18; +pragma solidity 0.8.23; library StakingMessages { + // The information that uniquely identifies a subnet validation period. + // The SHA-256 hash of the concatenation of these field is the validationID. + struct ValidationInfo { + bytes32 subnetID; + bytes32 nodeID; + uint64 weight; + uint64 registrationExpiry; + bytes signature; + } + // Subnets send a RegisterSubnetValidator message to the P-Chain to register a validator. // The P-Chain responds with a RegisterSubnetValidator message indicating whether the registration was successful // for the given validation ID. @@ -16,16 +26,6 @@ library StakingMessages { // the end of their validation period. uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 3; - // The information that uniquely identifies a subnet validation period. - // The SHA-256 hash of the concatenation of these field is the validationID. - struct ValidationInfo { - bytes32 subnetID; - bytes32 nodeID; - uint64 weight; - uint64 registrationExpiry; - bytes signature; - } - // TODO: The implemenation of these packing and unpacking functions is neither tested or optimzied at all. // Full test coverage should be provided, and the implementation should be optimized for gas efficiency. diff --git a/contracts/src/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/src/staking/interfaces/IERC20TokenStakingManager.sol index eb2cdc417..751f76599 100644 --- a/contracts/src/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/src/staking/interfaces/IERC20TokenStakingManager.sol @@ -3,9 +3,9 @@ // SPDX-License-Identifier: Ecosystem -import {IStakingManager} from "./IStakingManager.sol"; +pragma solidity 0.8.23; -pragma solidity 0.8.18; +import {IStakingManager} from "./IStakingManager.sol"; interface IERC20TokenStakingManager is IStakingManager { /** diff --git a/contracts/src/staking/interfaces/INativeTokenStakingManager.sol b/contracts/src/staking/interfaces/INativeTokenStakingManager.sol index a41336982..f35baf225 100644 --- a/contracts/src/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/src/staking/interfaces/INativeTokenStakingManager.sol @@ -3,9 +3,9 @@ // SPDX-License-Identifier: Ecosystem -import {IStakingManager} from "./IStakingManager.sol"; +pragma solidity 0.8.23; -pragma solidity 0.8.18; +import {IStakingManager} from "./IStakingManager.sol"; interface INativeTokenStakingManager is IStakingManager { /** diff --git a/contracts/src/staking/interfaces/IRewardCalculator.sol b/contracts/src/staking/interfaces/IRewardCalculator.sol index ea15abf91..a58315f5f 100644 --- a/contracts/src/staking/interfaces/IRewardCalculator.sol +++ b/contracts/src/staking/interfaces/IRewardCalculator.sol @@ -3,9 +3,7 @@ // SPDX-License-Identifier: Ecosystem -import {IStakingManager} from "./IStakingManager.sol"; - -pragma solidity 0.8.18; +pragma solidity 0.8.23; interface IRewardCalculator { function calculateReward( diff --git a/contracts/src/staking/interfaces/IStakingManager.sol b/contracts/src/staking/interfaces/IStakingManager.sol index eec2e099b..909e79229 100644 --- a/contracts/src/staking/interfaces/IStakingManager.sol +++ b/contracts/src/staking/interfaces/IStakingManager.sol @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Ecosystem -pragma solidity 0.8.18; +pragma solidity 0.8.23; interface IStakingManager { /** From 3b4784463719a3494c4cf5f8393be65b4515d627 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 26 Jul 2024 12:21:23 -0400 Subject: [PATCH 006/545] lint --- contracts/src/staking/StakingManager.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/src/staking/StakingManager.sol b/contracts/src/staking/StakingManager.sol index 3b23da143..85bf702e3 100644 --- a/contracts/src/staking/StakingManager.sol +++ b/contracts/src/staking/StakingManager.sol @@ -353,6 +353,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { * @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. */ + // solhint-disable-next-line no-empty-blocks function resendEndValidatorMessage(bytes32 validationID) external { // TODO: Allow for these messages to be resent. } From beee62fb181180098737f5a76ebc95ac2356bca6 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 26 Jul 2024 12:25:55 -0400 Subject: [PATCH 007/545] update --- contracts/src/staking/StakingManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/src/staking/StakingManager.sol b/contracts/src/staking/StakingManager.sol index 68408e6df..59c7e0e82 100644 --- a/contracts/src/staking/StakingManager.sol +++ b/contracts/src/staking/StakingManager.sol @@ -13,7 +13,7 @@ import { import {ReentrancyGuard} from "@openzeppelin/contracts@5.0.2/utils/ReentrancyGuard.sol"; import {StakingMessages} from "./StakingMessages.sol"; import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; -import {Context} from "@openzeppelin/contracts@4.8.1/utils/Context.sol"; +import {Context} from "@openzeppelin/contracts@5.0.2/utils/Context.sol"; abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { enum ValidatorStatus { From 117afbff0b769149944eabc21475cfc744d1a662 Mon Sep 17 00:00:00 2001 From: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Date: Tue, 30 Jul 2024 11:03:18 -0400 Subject: [PATCH 008/545] Update contracts/src/staking/README.md Co-authored-by: Geoff Stuart Signed-off-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> --- contracts/src/staking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/src/staking/README.md b/contracts/src/staking/README.md index 6667783cd..359eb25f5 100644 --- a/contracts/src/staking/README.md +++ b/contracts/src/staking/README.md @@ -38,7 +38,7 @@ Validators exit is initiated with a call to `initializeEndValidation` on the Sta The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a `SetValidatorWeightTx`. This results in another `SetSubnetValidatorWeightMessage` Warp message, this time constructed by the P-Chain. -This `SetSubnetValidatorWeightMessage` is delivered to the Staking Manager contract with a call to `completeEndValidation` with `setWeightMessageType=true`, at which point staking rewards are disbursed and the validation is removed from the contract's state. +This `SetSubnetValidatorWeightMessage` is delivered to the Staking Manager contract with a call to `completeEndValidation` with `setWeightMessageType=true`, at which point staking rewards are disbursed, stake is returned, and the validation is removed from the contract's state. #### Exit the Validator Set Directly on the P-Chain From d63d3df031f0c3ef6865b9e5f6a55d3b4a25a6a2 Mon Sep 17 00:00:00 2001 From: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Date: Tue, 30 Jul 2024 11:03:51 -0400 Subject: [PATCH 009/545] Update contracts/src/staking/StakingMessages.sol Co-authored-by: Geoff Stuart Signed-off-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> --- contracts/src/staking/StakingMessages.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/src/staking/StakingMessages.sol b/contracts/src/staking/StakingMessages.sol index f52cb34f7..73f7852bc 100644 --- a/contracts/src/staking/StakingMessages.sol +++ b/contracts/src/staking/StakingMessages.sol @@ -30,7 +30,7 @@ library StakingMessages { // Full test coverage should be provided, and the implementation should be optimized for gas efficiency. /** - * @notice Packs a SetSubnetValidatorWeightMessage message into a byte array. + * @notice Packs a RegisterSubnetValidatorMessage message into a byte array. * The message format specification is: * +-----------+----------+-----------+ * | typeID : uint32 | 4 bytes | From 44d240928ad0ff55a54f1677f45a01a8839c4157 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 30 Jul 2024 11:06:41 -0400 Subject: [PATCH 010/545] clean up wording --- contracts/src/staking/README.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/contracts/src/staking/README.md b/contracts/src/staking/README.md index 6667783cd..bd810973d 100644 --- a/contracts/src/staking/README.md +++ b/contracts/src/staking/README.md @@ -22,7 +22,7 @@ Once the Subnet has been recovered, the stake specified on the P-Chain must be l Validator registration is initiated with a call to `initializeValidatorRegistration` on the concrete Staking Manager contract. The Staking Manager contract constructs a [`RegisterSubnetValidatorMessage`](#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each validator registration request includes all of the information needed to identify the validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. -The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the payload of a `RegisterSubnetValidatorTx`. Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a [`SubnetValidatorRegistrationMessage`](#subnetvalidatorregistrationmessage) Warp message indicating that the specified validation was successfully registered on the P-Chain. +The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a `RegisterSubnetValidatorTx`. Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a [`SubnetValidatorRegistrationMessage`](#subnetvalidatorregistrationmessage) Warp message indicating that the specified validation was successfully registered on the P-Chain. The `SubnetValidatorRegistrationMessage` is delivered to the Staking Manager contract via a call to `completeValidatorRegistration`. Staking rewards begin accruing at this time. @@ -30,11 +30,9 @@ The `SubnetValidatorRegistrationMessage` is delivered to the Staking Manager con In the case of a missed expiry, the `RegisterSubnetValidatorTx` will result in a `SubnetValidatorRegistrationMessage` Warp message with the `valid` field set to `0`. This serves as proof that the corresponding validation has not started and may never start. The `SubnetValidatorRegistrationMessage` can be provided to the Staking Manager contract by calling `completeEndValidation` with `setWeightMessageType=false`. -### Removing a Validator +### Exiting the Validator Set -As an optional first step, an uptime proof may be requested from the P-Chain, which will be used the calculate the staking rewards on the Subnet. The proof is embedded in a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message. - -Validators exit is initiated with a call to `initializeEndValidation` on the Staking Manager contract. A `ValidationUptimeMessage` Warp message may optionally be provided, otherwise the validator's uptime will be set to`0`. Once `initializeEndValidation` staking rewards cease accruing. The Staking Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. +Validator exit is initiated with a call to `initializeEndValidation` on the Staking Manager contract. A `ValidationUptimeMessage` Warp message may optionally be provided, otherwise the validator's uptime will be set to`0`. This proof may be requested from the P-Chain, which will provide it in a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message. Once `initializeEndValidation` staking rewards cease accruing. The Staking Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a `SetValidatorWeightTx`. This results in another `SetSubnetValidatorWeightMessage` Warp message, this time constructed by the P-Chain. From abe00fa167439d20168a83d5ebae5af1595ff766 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 30 Jul 2024 11:13:27 -0400 Subject: [PATCH 011/545] clarify recover subnet flow --- contracts/src/staking/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/src/staking/README.md b/contracts/src/staking/README.md index 7633bda3f..e59490fe5 100644 --- a/contracts/src/staking/README.md +++ b/contracts/src/staking/README.md @@ -13,7 +13,7 @@ The common case for adding or removing a validator from a Subnet's validator set ### Initializing a Validator Set -If the Subnet has no validators registered on the P-Chain, then it will not be able to sign a Warp message to add a validator (step 1 above). In this case, Subnet recovery must be performed on the P-Chain, which allows an initial validator set to be specified. The P-Chain constructs a Warp message (format specification TBD) describing the initial validator set (step 2 above). +If the Subnet has no validators registered on the P-Chain, then it will not be able to sign a Warp message to add a validator (step 1 above). In this case, Subnet recovery must be performed on the P-Chain, which allows an initial validator set to be specified. For each validator specified in the initial validator set, a signature over a [`SubnetValidatorRegistrationMessage`](#subnetvalidatorregistrationmessage) must be requested from the P-Chain attesting to its inclusion. Once the Subnet has been recovered, the stake specified on the P-Chain must be locked in the Staking Contract before any further validator set changes may be made. This is done via the `provideInitialStake` method, and guarded by the `onlyWhenInitialStakeProvided` modifier. @@ -22,7 +22,7 @@ Once the Subnet has been recovered, the stake specified on the P-Chain must be l Validator registration is initiated with a call to `initializeValidatorRegistration` on the concrete Staking Manager contract. The Staking Manager contract constructs a [`RegisterSubnetValidatorMessage`](#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each validator registration request includes all of the information needed to identify the validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. -The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a `RegisterSubnetValidatorTx`. Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a [`SubnetValidatorRegistrationMessage`](#subnetvalidatorregistrationmessage) Warp message indicating that the specified validation was successfully registered on the P-Chain. +The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a `RegisterSubnetValidatorTx`. Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a `SubnetValidatorRegistrationMessage` Warp message indicating that the specified validation was successfully registered on the P-Chain. The `SubnetValidatorRegistrationMessage` is delivered to the Staking Manager contract via a call to `completeValidatorRegistration`. Staking rewards begin accruing at this time. From f486b798bab91664875ce85c32c05728e577f365 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 30 Jul 2024 12:09:07 -0400 Subject: [PATCH 012/545] solidity 0.8.25 --- contracts/src/staking/NativeTokenStakingManager.sol | 2 +- contracts/src/staking/StakingManager.sol | 2 +- contracts/src/staking/StakingMessages.sol | 2 +- contracts/src/staking/interfaces/IERC20TokenStakingManager.sol | 2 +- contracts/src/staking/interfaces/INativeTokenStakingManager.sol | 2 +- contracts/src/staking/interfaces/IRewardCalculator.sol | 2 +- contracts/src/staking/interfaces/IStakingManager.sol | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/src/staking/NativeTokenStakingManager.sol b/contracts/src/staking/NativeTokenStakingManager.sol index 84cd06ee5..020d96c0c 100644 --- a/contracts/src/staking/NativeTokenStakingManager.sol +++ b/contracts/src/staking/NativeTokenStakingManager.sol @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Ecosystem -pragma solidity 0.8.23; +pragma solidity 0.8.25; import {INativeTokenStakingManager} from "./interfaces/INativeTokenStakingManager.sol"; import {Address} from "@openzeppelin/contracts@5.0.2/utils/Address.sol"; diff --git a/contracts/src/staking/StakingManager.sol b/contracts/src/staking/StakingManager.sol index 85bf702e3..e0d5716aa 100644 --- a/contracts/src/staking/StakingManager.sol +++ b/contracts/src/staking/StakingManager.sol @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Ecosystem -pragma solidity 0.8.23; +pragma solidity 0.8.25; import {IStakingManager} from "./interfaces/IStakingManager.sol"; import { diff --git a/contracts/src/staking/StakingMessages.sol b/contracts/src/staking/StakingMessages.sol index 72b73972c..3d6698b89 100644 --- a/contracts/src/staking/StakingMessages.sol +++ b/contracts/src/staking/StakingMessages.sol @@ -2,7 +2,7 @@ // See the file LICENSE for licensing terms. // SPDX-License-Identifier: Ecosystem -pragma solidity 0.8.23; +pragma solidity 0.8.25; library StakingMessages { // The information that uniquely identifies a subnet validation period. diff --git a/contracts/src/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/src/staking/interfaces/IERC20TokenStakingManager.sol index 751f76599..d6f5179d2 100644 --- a/contracts/src/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/src/staking/interfaces/IERC20TokenStakingManager.sol @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Ecosystem -pragma solidity 0.8.23; +pragma solidity 0.8.25; import {IStakingManager} from "./IStakingManager.sol"; diff --git a/contracts/src/staking/interfaces/INativeTokenStakingManager.sol b/contracts/src/staking/interfaces/INativeTokenStakingManager.sol index f35baf225..74d6f35f8 100644 --- a/contracts/src/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/src/staking/interfaces/INativeTokenStakingManager.sol @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Ecosystem -pragma solidity 0.8.23; +pragma solidity 0.8.25; import {IStakingManager} from "./IStakingManager.sol"; diff --git a/contracts/src/staking/interfaces/IRewardCalculator.sol b/contracts/src/staking/interfaces/IRewardCalculator.sol index a58315f5f..a42038989 100644 --- a/contracts/src/staking/interfaces/IRewardCalculator.sol +++ b/contracts/src/staking/interfaces/IRewardCalculator.sol @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Ecosystem -pragma solidity 0.8.23; +pragma solidity 0.8.25; interface IRewardCalculator { function calculateReward( diff --git a/contracts/src/staking/interfaces/IStakingManager.sol b/contracts/src/staking/interfaces/IStakingManager.sol index 909e79229..963e31587 100644 --- a/contracts/src/staking/interfaces/IStakingManager.sol +++ b/contracts/src/staking/interfaces/IStakingManager.sol @@ -3,7 +3,7 @@ // SPDX-License-Identifier: Ecosystem -pragma solidity 0.8.23; +pragma solidity 0.8.25; interface IStakingManager { /** From 6ecadb7b29fd4023c25f912724664be8c65867df Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 30 Jul 2024 13:45:17 -0400 Subject: [PATCH 013/545] export StakingManagerSettings --- contracts/src/staking/StakingManager.sol | 21 ++++--------------- .../staking/interfaces/IStakingManager.sol | 20 ++++++++++++++++++ 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/contracts/src/staking/StakingManager.sol b/contracts/src/staking/StakingManager.sol index e0d5716aa..41184eb05 100644 --- a/contracts/src/staking/StakingManager.sol +++ b/contracts/src/staking/StakingManager.sol @@ -5,7 +5,10 @@ pragma solidity 0.8.25; -import {IStakingManager} from "./interfaces/IStakingManager.sol"; +import { + IStakingManager, + StakingManagerSettings +} from "./interfaces/IStakingManager.sol"; import { WarpMessage, IWarpMessenger @@ -77,22 +80,6 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { } } - struct InitialStakerInfo { - StakingMessages.ValidationInfo validationInfo; - address owner; - } - - struct StakingManagerSettings { - bytes32 pChainBlockchainID; - bytes32 subnetID; - uint256 minimumStakeAmount; - uint256 maximumStakeAmount; - uint64 minimumStakeDuration; - uint8 maximumHourlyChurn; - InitialStakerInfo[] initialStakers; - IRewardCalculator rewardCalculator; - } - function initialize(StakingManagerSettings calldata settings) public { StakingManagerStorage storage $ = _getTokenHomeStorage(); $._warpMessenger = IWarpMessenger(0x0200000000000000000000000000000000000005); diff --git a/contracts/src/staking/interfaces/IStakingManager.sol b/contracts/src/staking/interfaces/IStakingManager.sol index 963e31587..1a81dc669 100644 --- a/contracts/src/staking/interfaces/IStakingManager.sol +++ b/contracts/src/staking/interfaces/IStakingManager.sol @@ -5,6 +5,26 @@ pragma solidity 0.8.25; +import {StakingMessages} from "../StakingMessages.sol"; +import {IRewardCalculator} from "./IRewardCalculator.sol"; + + +struct InitialStakerInfo { + StakingMessages.ValidationInfo validationInfo; + address owner; +} + +struct StakingManagerSettings { + bytes32 pChainBlockchainID; + bytes32 subnetID; + uint256 minimumStakeAmount; + uint256 maximumStakeAmount; + uint64 minimumStakeDuration; + uint8 maximumHourlyChurn; + InitialStakerInfo[] initialStakers; + IRewardCalculator rewardCalculator; +} + interface IStakingManager { /** * @notice Emitted when a new validation period is created by stake being locked in the manager contract. From 36a8e0fed4b87274ebccf9fff83d4950392f6b55 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 30 Jul 2024 13:45:37 -0400 Subject: [PATCH 014/545] unit test skeleton --- .../NativeTokenStakingManagerTests.t.sol | 41 +++++++++++++ .../staking/tests/StakingManagerTests.t.sol | 58 +++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol create mode 100644 contracts/src/staking/tests/StakingManagerTests.t.sol diff --git a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol new file mode 100644 index 000000000..2efafcb0a --- /dev/null +++ b/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -0,0 +1,41 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {Test} from "forge-std/Test.sol"; +import {StakingManagerTest} from "./StakingManagerTests.t.sol"; +import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; +import { + StakingManagerSettings, + InitialStakerInfo +} from "../interfaces/IStakingManager.sol"; +import { + IRewardCalculator +} from "../interfaces/IRewardCalculator.sol"; + +contract NativeTokenStakingManagerTest is StakingManagerTest { + NativeTokenStakingManager public nativeTokenStakingManager; + + function setup() public override { + StakingManagerTest.setup(); + nativeTokenStakingManager = new NativeTokenStakingManager(); + // TODONOW: Use real values + nativeTokenStakingManager.initialize( + StakingManagerSettings({ + pChainBlockchainID: "P-Chain", + subnetID: "X", + minimumStakeAmount: 1000, + maximumStakeAmount: 1000000, + minimumStakeDuration: 24 hours, + maximumHourlyChurn: 10, + initialStakers: new InitialStakerInfo[](0), + rewardCalculator: IRewardCalculator(address(0)) + }) + ); + } + + function testInitializeValidatorRegistration() public {} +} \ No newline at end of file diff --git a/contracts/src/staking/tests/StakingManagerTests.t.sol b/contracts/src/staking/tests/StakingManagerTests.t.sol new file mode 100644 index 000000000..4696b0eed --- /dev/null +++ b/contracts/src/staking/tests/StakingManagerTests.t.sol @@ -0,0 +1,58 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {Test} from "forge-std/Test.sol"; +import { + StakingManager +} from "../StakingManager.sol"; +import { + IStakingManager +} from "../interfaces/IStakingManager.sol"; + +abstract contract StakingManagerTest is Test { + IStakingManager public stakingManager; + + event ValidationPeriodCreated( + bytes32 indexed validationID, + bytes32 indexed nodeID, + bytes32 indexed registerValidationMessageID, + uint256 weight, + uint64 registrationExpiry + ); + + event ValidationPeriodRegistered( + bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp + ); + + event ValidatorRemovalInitialized( + bytes32 indexed validationID, + bytes32 indexed setWeightMessageID, + uint256 stakeAmount, + uint256 endTime, + uint64 uptime + ); + + event ValidationPeriodEnded(bytes32 indexed validationID); + + function setup() public virtual {} + + function testProvideInitialStake() public {} + + function testResendRegisterValidatorMessage() public {} + + function testCompleteValidatorRegistration() public {} + + function testInitializeEndValidation() public {} + + function testResendEndValidation() public {} + + function testCompleteEndValidation() public {} + + function testValueToWeight() public {} + + function testWeightToValue() public {} +} \ No newline at end of file From 4eff3199687845dfc914cfd818b12315bc923238 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 30 Jul 2024 13:46:14 -0400 Subject: [PATCH 015/545] format --- contracts/src/staking/StakingManager.sol | 5 +---- contracts/src/staking/interfaces/IStakingManager.sol | 1 - .../tests/NativeTokenStakingManagerTests.t.sol | 11 +++-------- contracts/src/staking/tests/StakingManagerTests.t.sol | 10 +++------- 4 files changed, 7 insertions(+), 20 deletions(-) diff --git a/contracts/src/staking/StakingManager.sol b/contracts/src/staking/StakingManager.sol index 41184eb05..4b0210415 100644 --- a/contracts/src/staking/StakingManager.sol +++ b/contracts/src/staking/StakingManager.sol @@ -5,10 +5,7 @@ pragma solidity 0.8.25; -import { - IStakingManager, - StakingManagerSettings -} from "./interfaces/IStakingManager.sol"; +import {IStakingManager, StakingManagerSettings} from "./interfaces/IStakingManager.sol"; import { WarpMessage, IWarpMessenger diff --git a/contracts/src/staking/interfaces/IStakingManager.sol b/contracts/src/staking/interfaces/IStakingManager.sol index 1a81dc669..f15864f48 100644 --- a/contracts/src/staking/interfaces/IStakingManager.sol +++ b/contracts/src/staking/interfaces/IStakingManager.sol @@ -8,7 +8,6 @@ pragma solidity 0.8.25; import {StakingMessages} from "../StakingMessages.sol"; import {IRewardCalculator} from "./IRewardCalculator.sol"; - struct InitialStakerInfo { StakingMessages.ValidationInfo validationInfo; address owner; diff --git a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol index 2efafcb0a..6922eead8 100644 --- a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -8,13 +8,8 @@ pragma solidity 0.8.25; import {Test} from "forge-std/Test.sol"; import {StakingManagerTest} from "./StakingManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; -import { - StakingManagerSettings, - InitialStakerInfo -} from "../interfaces/IStakingManager.sol"; -import { - IRewardCalculator -} from "../interfaces/IRewardCalculator.sol"; +import {StakingManagerSettings, InitialStakerInfo} from "../interfaces/IStakingManager.sol"; +import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; contract NativeTokenStakingManagerTest is StakingManagerTest { NativeTokenStakingManager public nativeTokenStakingManager; @@ -38,4 +33,4 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { } function testInitializeValidatorRegistration() public {} -} \ No newline at end of file +} diff --git a/contracts/src/staking/tests/StakingManagerTests.t.sol b/contracts/src/staking/tests/StakingManagerTests.t.sol index 4696b0eed..0a1d510c7 100644 --- a/contracts/src/staking/tests/StakingManagerTests.t.sol +++ b/contracts/src/staking/tests/StakingManagerTests.t.sol @@ -6,12 +6,8 @@ pragma solidity 0.8.25; import {Test} from "forge-std/Test.sol"; -import { - StakingManager -} from "../StakingManager.sol"; -import { - IStakingManager -} from "../interfaces/IStakingManager.sol"; +import {StakingManager} from "../StakingManager.sol"; +import {IStakingManager} from "../interfaces/IStakingManager.sol"; abstract contract StakingManagerTest is Test { IStakingManager public stakingManager; @@ -55,4 +51,4 @@ abstract contract StakingManagerTest is Test { function testValueToWeight() public {} function testWeightToValue() public {} -} \ No newline at end of file +} From 8154fc594e437884dc1d80c01ce09f53a06643cc Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 31 Jul 2024 11:40:16 -0400 Subject: [PATCH 016/545] call initialize from ctr --- .../src/staking/NativeTokenStakingManager.sol | 6 ++++++ contracts/src/staking/StakingManager.sol | 14 +++++++++++--- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/contracts/src/staking/NativeTokenStakingManager.sol b/contracts/src/staking/NativeTokenStakingManager.sol index 020d96c0c..515cd0142 100644 --- a/contracts/src/staking/NativeTokenStakingManager.sol +++ b/contracts/src/staking/NativeTokenStakingManager.sol @@ -8,9 +8,15 @@ pragma solidity 0.8.25; import {INativeTokenStakingManager} from "./interfaces/INativeTokenStakingManager.sol"; import {Address} from "@openzeppelin/contracts@5.0.2/utils/Address.sol"; import {StakingManager} from "./StakingManager.sol"; +import {StakingManagerSettings} from "./interfaces/IStakingManager.sol"; contract NativeTokenStakingManager is StakingManager, INativeTokenStakingManager { using Address for address payable; + + constructor(StakingManagerSettings memory settings) { + StakingManager.initialize(settings); + } + /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. diff --git a/contracts/src/staking/StakingManager.sol b/contracts/src/staking/StakingManager.sol index 4b0210415..bb40f345d 100644 --- a/contracts/src/staking/StakingManager.sol +++ b/contracts/src/staking/StakingManager.sol @@ -77,7 +77,7 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { } } - function initialize(StakingManagerSettings calldata settings) public { + function initialize(StakingManagerSettings memory settings) public { StakingManagerStorage storage $ = _getTokenHomeStorage(); $._warpMessenger = IWarpMessenger(0x0200000000000000000000000000000000000005); $._pChainBlockchainID = settings.pChainBlockchainID; @@ -112,11 +112,15 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { * @notice Modifier to ensure that the initial stake has been provided. */ modifier onlyWhenInitialStakeProvided() { - StakingManagerStorage storage $ = _getTokenHomeStorage(); - require($._remainingInitialStake > 0, "StakingManager: Initial stake not provided"); + require(initialStakeProvided(), "StakingManager: Initial stake not provided"); _; } + function initialStakeProvided() public view returns (bool) { + StakingManagerStorage storage $ = _getTokenHomeStorage(); + return $._remainingInitialStake == 0; + } + /** * @notice Called to provide initial stake amount for original validators added prior to the contract's initialization. */ @@ -408,6 +412,10 @@ abstract contract StakingManager is ReentrancyGuard, IStakingManager { */ function _checkAndUpdateChurnTracker(uint64 amount) private { StakingManagerStorage storage $ = _getTokenHomeStorage(); + if ($._maximumHourlyChurn == 0) { + return; + } + ValidatorChrunPeriod storage churnTracker = $._churnTracker; uint256 currentTime = block.timestamp; if (currentTime - churnTracker.startedAt >= 1 hours) { From dbc031a845dd2cd51d8e516154dc557ce4dfb4af Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 31 Jul 2024 11:40:55 -0400 Subject: [PATCH 017/545] init vdr registration test --- .../NativeTokenStakingManagerTests.t.sol | 64 +++++++++++++++---- .../staking/tests/StakingManagerTests.t.sol | 41 +++++++++--- 2 files changed, 85 insertions(+), 20 deletions(-) diff --git a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol index 6922eead8..87fe39870 100644 --- a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -10,27 +10,67 @@ import {StakingManagerTest} from "./StakingManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; import {StakingManagerSettings, InitialStakerInfo} from "../interfaces/IStakingManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {IWarpMessenger} from "../StakingManager.sol"; +import {StakingMessages} from "../StakingMessages.sol"; contract NativeTokenStakingManagerTest is StakingManagerTest { - NativeTokenStakingManager public nativeTokenStakingManager; + NativeTokenStakingManager public app; - function setup() public override { - StakingManagerTest.setup(); - nativeTokenStakingManager = new NativeTokenStakingManager(); - // TODONOW: Use real values - nativeTokenStakingManager.initialize( + function setUp() public override { + // Construct the object under test + app = new NativeTokenStakingManager( StakingManagerSettings({ - pChainBlockchainID: "P-Chain", - subnetID: "X", - minimumStakeAmount: 1000, - maximumStakeAmount: 1000000, + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + minimumStakeAmount: 20, + maximumStakeAmount: 1e10, minimumStakeDuration: 24 hours, - maximumHourlyChurn: 10, + maximumHourlyChurn: 0, initialStakers: new InitialStakerInfo[](0), rewardCalculator: IRewardCalculator(address(0)) }) ); + stakingManager = app; + + // Setup the test + StakingManagerTest.setUp(); + } + + function testInitializeValidatorRegistrationSuccess() public { + (bytes32 validationID, ) = StakingMessages.packValidationInfo( + StakingMessages.ValidationInfo({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: 1e6, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE + }) + ); + + vm.warp(DEFAULT_EXPIRY-1); + + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encode(IWarpMessenger.sendWarpMessage.selector), + abi.encode(bytes32(0)) + ); + // TODO: construct the expected message in the same way as the contract + // vm.expectCall( + // WARP_PRECOMPILE_ADDRESS, + // abi.encodeCall(IWarpMessenger.sendWarpMessage, (abi.encode(expectedMessage))) + // ); + vm.expectEmit(true, true, true, true, address(app)); + emit ValidationPeriodCreated(validationID, DEFAULT_NODE_ID, bytes32(0), 1e6, DEFAULT_EXPIRY); + + app.initializeValidatorRegistration{value: 1e18}( + DEFAULT_NODE_ID, + DEFAULT_EXPIRY, + DEFAULT_ED25519_SIGNATURE + ); } - function testInitializeValidatorRegistration() public {} + function testInitializeValidatorRegistrationExcessiveChurn() public {} + function testInitializeValidatorRegistrationInsufficientStake() public {} + function testInitializeValidatorRegistrationExcessiveStake() public {} + function testInitializeValidatorRegistrationInsufficientDuration() public {} } diff --git a/contracts/src/staking/tests/StakingManagerTests.t.sol b/contracts/src/staking/tests/StakingManagerTests.t.sol index 0a1d510c7..94b248cd0 100644 --- a/contracts/src/staking/tests/StakingManagerTests.t.sol +++ b/contracts/src/staking/tests/StakingManagerTests.t.sol @@ -7,10 +7,21 @@ pragma solidity 0.8.25; import {Test} from "forge-std/Test.sol"; import {StakingManager} from "../StakingManager.sol"; -import {IStakingManager} from "../interfaces/IStakingManager.sol"; abstract contract StakingManagerTest is Test { - IStakingManager public stakingManager; + bytes32 public constant P_CHAIN_BLOCKCHAIN_ID = + bytes32(hex"0000000000000000000000000000000000000000000000000000000000000000"); + bytes32 public constant DEFAULT_SUBNET_ID = + bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); + bytes32 public constant DEFAULT_NODE_ID = + bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); + uint64 public constant DEFAULT_EXPIRY = 1000; + bytes public constant DEFAULT_ED25519_SIGNATURE = + bytes(hex"12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678"); + address public constant WARP_PRECOMPILE_ADDRESS = 0x0200000000000000000000000000000000000005; + + + StakingManager public stakingManager; event ValidationPeriodCreated( bytes32 indexed validationID, @@ -34,9 +45,7 @@ abstract contract StakingManagerTest is Test { event ValidationPeriodEnded(bytes32 indexed validationID); - function setup() public virtual {} - - function testProvideInitialStake() public {} + function setUp() public virtual {} function testResendRegisterValidatorMessage() public {} @@ -48,7 +57,23 @@ abstract contract StakingManagerTest is Test { function testCompleteEndValidation() public {} - function testValueToWeight() public {} - - function testWeightToValue() public {} + function testValueToWeight() public { + uint64 w1 = stakingManager.valueToWeight(1e12); + uint64 w2 = stakingManager.valueToWeight(1e18); + uint64 w3 = stakingManager.valueToWeight(1e27); + + assertEq(w1, 1); + assertEq(w2, 1e6); + assertEq(w3, 1e15); + } + + function testWeightToValue() public { + uint256 v1 = stakingManager.weightToValue(1); + uint256 v2 = stakingManager.weightToValue(1e6); + uint256 v3 = stakingManager.weightToValue(1e15); + + assertEq(v1, 1e12); + assertEq(v2, 1e18); + assertEq(v3, 1e27); + } } From 0a29c4379512c3fa18b8a8beed6bb01a38140a05 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 31 Jul 2024 12:07:37 -0400 Subject: [PATCH 018/545] resend register vdr test --- .../NativeTokenStakingManagerTests.t.sol | 83 +++++++++++++++---- .../staking/tests/StakingManagerTests.t.sol | 10 --- 2 files changed, 67 insertions(+), 26 deletions(-) diff --git a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol index 87fe39870..e4a9e4b5e 100644 --- a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -37,13 +37,69 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { } function testInitializeValidatorRegistrationSuccess() public { - (bytes32 validationID, ) = StakingMessages.packValidationInfo( + _setUpInitializeValidatorRegistration( + DEFAULT_NODE_ID, + DEFAULT_SUBNET_ID, + 1e6, + DEFAULT_EXPIRY, + DEFAULT_ED25519_SIGNATURE + ); + } + + function testInitializeValidatorRegistrationExcessiveChurn() public {} + function testInitializeValidatorRegistrationInsufficientStake() public {} + function testInitializeValidatorRegistrationExcessiveStake() public {} + function testInitializeValidatorRegistrationInsufficientDuration() public {} + + // The following tests call functions that are implemented in StakingManager, but access state that's + // only set in NativeTokenStakingManager. Therefore we call them via the concrete type, rather than a + // reference to the abstract type. + function testResendRegisterValidatorMessage() public { + bytes32 validationID = _setUpInitializeValidatorRegistration( + DEFAULT_NODE_ID, + DEFAULT_SUBNET_ID, + 1e6, + DEFAULT_EXPIRY, + DEFAULT_ED25519_SIGNATURE + ); + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encode(IWarpMessenger.sendWarpMessage.selector), + abi.encode(bytes32(0)) + ); + // TODO: construct the expected message in the same way as the contract + // vm.expectCall( + // WARP_PRECOMPILE_ADDRESS, + // abi.encodeCall(IWarpMessenger.sendWarpMessage, (abi.encode(expectedMessage))) + // ); + app.resendRegisterValidatorMessage(validationID); + } + + function testCompleteValidatorRegistration() public {} + + function testInitializeEndValidation() public {} + + function testInitializeEndValidationWithUptimeProof() public {} + + function testResendEndValidation() public {} + + function testCompleteEndValidation() public {} + + // Helpers + function _setUpInitializeValidatorRegistration( + bytes32 nodeID, + bytes32 subnetID, + uint64 weight, + uint64 registrationExpiry, + bytes memory signature + ) internal returns (bytes32 validationID){ + (validationID, ) = StakingMessages.packValidationInfo( StakingMessages.ValidationInfo({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: 1e6, - registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE + nodeID: nodeID, + subnetID: subnetID, + weight: weight, + registrationExpiry: registrationExpiry, + signature: signature }) ); @@ -60,17 +116,12 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { // abi.encodeCall(IWarpMessenger.sendWarpMessage, (abi.encode(expectedMessage))) // ); vm.expectEmit(true, true, true, true, address(app)); - emit ValidationPeriodCreated(validationID, DEFAULT_NODE_ID, bytes32(0), 1e6, DEFAULT_EXPIRY); + emit ValidationPeriodCreated(validationID, DEFAULT_NODE_ID, bytes32(0), weight, DEFAULT_EXPIRY); - app.initializeValidatorRegistration{value: 1e18}( - DEFAULT_NODE_ID, - DEFAULT_EXPIRY, - DEFAULT_ED25519_SIGNATURE + app.initializeValidatorRegistration{value: app.weightToValue(weight)}( + nodeID, + registrationExpiry, + signature ); } - - function testInitializeValidatorRegistrationExcessiveChurn() public {} - function testInitializeValidatorRegistrationInsufficientStake() public {} - function testInitializeValidatorRegistrationExcessiveStake() public {} - function testInitializeValidatorRegistrationInsufficientDuration() public {} } diff --git a/contracts/src/staking/tests/StakingManagerTests.t.sol b/contracts/src/staking/tests/StakingManagerTests.t.sol index 94b248cd0..339581293 100644 --- a/contracts/src/staking/tests/StakingManagerTests.t.sol +++ b/contracts/src/staking/tests/StakingManagerTests.t.sol @@ -47,16 +47,6 @@ abstract contract StakingManagerTest is Test { function setUp() public virtual {} - function testResendRegisterValidatorMessage() public {} - - function testCompleteValidatorRegistration() public {} - - function testInitializeEndValidation() public {} - - function testResendEndValidation() public {} - - function testCompleteEndValidation() public {} - function testValueToWeight() public { uint64 w1 = stakingManager.valueToWeight(1e12); uint64 w2 = stakingManager.valueToWeight(1e18); From a6f2949aa9376882ca8b050d620108d6039c758b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 31 Jul 2024 12:11:54 -0400 Subject: [PATCH 019/545] format --- .../src/staking/NativeTokenStakingManager.sol | 1 - .../NativeTokenStakingManagerTests.t.sol | 28 +++++++------------ .../staking/tests/StakingManagerTests.t.sol | 6 ++-- 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/contracts/src/staking/NativeTokenStakingManager.sol b/contracts/src/staking/NativeTokenStakingManager.sol index 515cd0142..59e6310c9 100644 --- a/contracts/src/staking/NativeTokenStakingManager.sol +++ b/contracts/src/staking/NativeTokenStakingManager.sol @@ -28,7 +28,6 @@ contract NativeTokenStakingManager is StakingManager, INativeTokenStakingManager * The signature field will be validated by the P-Chain. Implementations may choose to validate that the signature * field is well-formed but it is not required. */ - function initializeValidatorRegistration( bytes32 nodeID, uint64 registrationExpiry, diff --git a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol index e4a9e4b5e..c32759c7f 100644 --- a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -38,11 +38,7 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { function testInitializeValidatorRegistrationSuccess() public { _setUpInitializeValidatorRegistration( - DEFAULT_NODE_ID, - DEFAULT_SUBNET_ID, - 1e6, - DEFAULT_EXPIRY, - DEFAULT_ED25519_SIGNATURE + DEFAULT_NODE_ID, DEFAULT_SUBNET_ID, 1e6, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE ); } @@ -56,11 +52,7 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { // reference to the abstract type. function testResendRegisterValidatorMessage() public { bytes32 validationID = _setUpInitializeValidatorRegistration( - DEFAULT_NODE_ID, - DEFAULT_SUBNET_ID, - 1e6, - DEFAULT_EXPIRY, - DEFAULT_ED25519_SIGNATURE + DEFAULT_NODE_ID, DEFAULT_SUBNET_ID, 1e6, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE ); vm.mockCall( WARP_PRECOMPILE_ADDRESS, @@ -92,8 +84,8 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { uint64 weight, uint64 registrationExpiry, bytes memory signature - ) internal returns (bytes32 validationID){ - (validationID, ) = StakingMessages.packValidationInfo( + ) internal returns (bytes32 validationID) { + (validationID,) = StakingMessages.packValidationInfo( StakingMessages.ValidationInfo({ nodeID: nodeID, subnetID: subnetID, @@ -103,8 +95,8 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { }) ); - vm.warp(DEFAULT_EXPIRY-1); - + vm.warp(DEFAULT_EXPIRY - 1); + vm.mockCall( WARP_PRECOMPILE_ADDRESS, abi.encode(IWarpMessenger.sendWarpMessage.selector), @@ -116,12 +108,12 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { // abi.encodeCall(IWarpMessenger.sendWarpMessage, (abi.encode(expectedMessage))) // ); vm.expectEmit(true, true, true, true, address(app)); - emit ValidationPeriodCreated(validationID, DEFAULT_NODE_ID, bytes32(0), weight, DEFAULT_EXPIRY); + emit ValidationPeriodCreated( + validationID, DEFAULT_NODE_ID, bytes32(0), weight, DEFAULT_EXPIRY + ); app.initializeValidatorRegistration{value: app.weightToValue(weight)}( - nodeID, - registrationExpiry, - signature + nodeID, registrationExpiry, signature ); } } diff --git a/contracts/src/staking/tests/StakingManagerTests.t.sol b/contracts/src/staking/tests/StakingManagerTests.t.sol index 339581293..51f7c6fdf 100644 --- a/contracts/src/staking/tests/StakingManagerTests.t.sol +++ b/contracts/src/staking/tests/StakingManagerTests.t.sol @@ -16,11 +16,11 @@ abstract contract StakingManagerTest is Test { bytes32 public constant DEFAULT_NODE_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); uint64 public constant DEFAULT_EXPIRY = 1000; - bytes public constant DEFAULT_ED25519_SIGNATURE = - bytes(hex"12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678"); + bytes public constant DEFAULT_ED25519_SIGNATURE = bytes( + hex"12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" + ); address public constant WARP_PRECOMPILE_ADDRESS = 0x0200000000000000000000000000000000000005; - StakingManager public stakingManager; event ValidationPeriodCreated( From d84f8ee6e286c7eeec2a5be15bac1e2cf9d0c3b5 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 31 Jul 2024 14:56:46 -0400 Subject: [PATCH 020/545] wip --- .../src/staking/tests/NativeTokenStakingManagerTests.t.sol | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol index c32759c7f..827cb1ab7 100644 --- a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -73,7 +73,9 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { function testInitializeEndValidationWithUptimeProof() public {} - function testResendEndValidation() public {} + function testResendEndValidation() public { + // TODO: implement + } function testCompleteEndValidation() public {} @@ -116,4 +118,6 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { nodeID, registrationExpiry, signature ); } + + function _setUpCompleteValidatorRegistration() internal {} } From 1031f809433cf5ddec81955ce2b5e04cb0b66cc4 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 31 Jul 2024 16:31:12 -0400 Subject: [PATCH 021/545] Move contracts --- contracts/{src => }/staking/NativeTokenStakingManager.sol | 0 contracts/{src => }/staking/StakingManager.sol | 0 contracts/{src => }/staking/StakingMessages.sol | 0 .../{src => }/staking/interfaces/IERC20TokenStakingManager.sol | 0 .../{src => }/staking/interfaces/INativeTokenStakingManager.sol | 0 contracts/{src => }/staking/interfaces/IRewardCalculator.sol | 0 contracts/{src => }/staking/interfaces/IStakingManager.sol | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename contracts/{src => }/staking/NativeTokenStakingManager.sol (100%) rename contracts/{src => }/staking/StakingManager.sol (100%) rename contracts/{src => }/staking/StakingMessages.sol (100%) rename contracts/{src => }/staking/interfaces/IERC20TokenStakingManager.sol (100%) rename contracts/{src => }/staking/interfaces/INativeTokenStakingManager.sol (100%) rename contracts/{src => }/staking/interfaces/IRewardCalculator.sol (100%) rename contracts/{src => }/staking/interfaces/IStakingManager.sol (100%) diff --git a/contracts/src/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol similarity index 100% rename from contracts/src/staking/NativeTokenStakingManager.sol rename to contracts/staking/NativeTokenStakingManager.sol diff --git a/contracts/src/staking/StakingManager.sol b/contracts/staking/StakingManager.sol similarity index 100% rename from contracts/src/staking/StakingManager.sol rename to contracts/staking/StakingManager.sol diff --git a/contracts/src/staking/StakingMessages.sol b/contracts/staking/StakingMessages.sol similarity index 100% rename from contracts/src/staking/StakingMessages.sol rename to contracts/staking/StakingMessages.sol diff --git a/contracts/src/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol similarity index 100% rename from contracts/src/staking/interfaces/IERC20TokenStakingManager.sol rename to contracts/staking/interfaces/IERC20TokenStakingManager.sol diff --git a/contracts/src/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol similarity index 100% rename from contracts/src/staking/interfaces/INativeTokenStakingManager.sol rename to contracts/staking/interfaces/INativeTokenStakingManager.sol diff --git a/contracts/src/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol similarity index 100% rename from contracts/src/staking/interfaces/IRewardCalculator.sol rename to contracts/staking/interfaces/IRewardCalculator.sol diff --git a/contracts/src/staking/interfaces/IStakingManager.sol b/contracts/staking/interfaces/IStakingManager.sol similarity index 100% rename from contracts/src/staking/interfaces/IStakingManager.sol rename to contracts/staking/interfaces/IStakingManager.sol From 304bec65fc9405a58fab0ea2e54b6b3cbffe512d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 09:46:51 -0400 Subject: [PATCH 022/545] move files --- .../staking/tests/NativeTokenStakingManagerTests.t.sol | 2 +- contracts/{src => }/staking/tests/StakingManagerTests.t.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename contracts/{src => }/staking/tests/NativeTokenStakingManagerTests.t.sol (99%) rename contracts/{src => }/staking/tests/StakingManagerTests.t.sol (98%) diff --git a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol similarity index 99% rename from contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol rename to contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 827cb1ab7..293e78e4a 100644 --- a/contracts/src/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -5,7 +5,7 @@ pragma solidity 0.8.25; -import {Test} from "forge-std/Test.sol"; +import {Test} from "@forge-std/Test.sol"; import {StakingManagerTest} from "./StakingManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; import {StakingManagerSettings, InitialStakerInfo} from "../interfaces/IStakingManager.sol"; diff --git a/contracts/src/staking/tests/StakingManagerTests.t.sol b/contracts/staking/tests/StakingManagerTests.t.sol similarity index 98% rename from contracts/src/staking/tests/StakingManagerTests.t.sol rename to contracts/staking/tests/StakingManagerTests.t.sol index 51f7c6fdf..8265ac848 100644 --- a/contracts/src/staking/tests/StakingManagerTests.t.sol +++ b/contracts/staking/tests/StakingManagerTests.t.sol @@ -5,7 +5,7 @@ pragma solidity 0.8.25; -import {Test} from "forge-std/Test.sol"; +import {Test} from "@forge-std/Test.sol"; import {StakingManager} from "../StakingManager.sol"; abstract contract StakingManagerTest is Test { From 6a0f4ee80f64706e8dc9cc4446a7713dbbdcc8a5 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 1 Aug 2024 09:56:01 -0400 Subject: [PATCH 023/545] Don't increment nonce --- contracts/staking/StakingManager.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 94c3e1222..a70d7ad91 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -332,7 +332,6 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { uptimeSeconds = uptime; } validator.uptimeSeconds = uptimeSeconds; - validator.messageNonce++; // Save the validator updates. // TODO: Optimize storage writes here (probably don't need to write the whole value). From 1c1985f56704b8c51cf38ec53c13b30a330d00e7 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 10:46:51 -0400 Subject: [PATCH 024/545] full pack/unpack parity --- contracts/staking/StakingMessages.sol | 194 +++++++++++++++++++++++++- 1 file changed, 192 insertions(+), 2 deletions(-) diff --git a/contracts/staking/StakingMessages.sol b/contracts/staking/StakingMessages.sol index 3d6698b89..31e455263 100644 --- a/contracts/staking/StakingMessages.sol +++ b/contracts/staking/StakingMessages.sol @@ -47,6 +47,9 @@ library StakingMessages { * +-----------+----------+-----------+ * | 148 bytes | * +-----------+ + * + * @param valiationInfo The information to pack into the message. + * @return The validationID and the packed message. */ function packRegisterSubnetValidatorMessage(ValidationInfo memory valiationInfo) internal @@ -70,7 +73,70 @@ library StakingMessages { } /** - * @notice Unpacks a byte array as a RegisterSubnetValidator message. + * @notice Unpacks a byte array as a RegisterSubnetValidatorMessage message. + * 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 ValidationInfo. + */ + function unpackRegisterSubnetValidatorMessage(bytes memory input) + internal + pure + returns (ValidationInfo memory) + { + require(input.length == 148, "StakingMessages: Invalid message length"); + + // Unpack the type ID + uint32 typeID; + for (uint256 i; i < 4; ++i) { + typeID |= uint32(uint8(input[i])) << uint32((8 * (3 - i))); + } + require( + typeID == SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID, + "StakingMessages: Invalid message type" + ); + + // Unpack the subnet ID + bytes32 subnetID; + for (uint256 i; i < 32; ++i) { + subnetID |= bytes32(uint256(uint8(input[i + 4])) << (8 * (31 - i))); + } + + // Unpack the node ID + bytes32 nodeID; + for (uint256 i; i < 32; ++i) { + nodeID |= bytes32(uint256(uint8(input[i + 36])) << (8 * (31 - i))); + } + + // Unpack the weight + uint64 weight; + for (uint256 i; i < 8; ++i) { + weight |= uint64(uint8(input[i + 68])) << uint64((8 * (7 - i))); + } + + // Unpack the expiry + uint64 expiry; + for (uint256 i; i < 8; ++i) { + expiry |= uint64(uint8(input[i + 76])) << uint64((8 * (7 - i))); + } + + // Unpack the signature + bytes memory signature = new bytes(64); + for (uint256 i; i < 64; ++i) { + signature[i] = input[i + 84]; + } + + return ValidationInfo({ + subnetID: subnetID, + nodeID: nodeID, + weight: weight, + registrationExpiry: expiry, + signature: signature + }); + } + + /** + * @notice Packs a SubnetValidatorRegistrationMessage into a byte array. * The message format specification is: * +--------------+----------+----------+ * | typeID : uint32 | 4 bytes | @@ -81,6 +147,35 @@ library StakingMessages { * +--------------+----------+----------+ * | 37 bytes | * +----------+ + * + * @param validationID The ID of the validation period. + * @param valid true if the validation period was registered, false if it was not and never will be. + * @return The packed message. + * + */ + function packSubnetValidatorRegistrationMessage( + bytes32 validationID, + bool valid + ) internal pure returns (bytes memory) { + bytes memory res = new bytes(37); + // Pack the type ID. + for (uint256 i; i < 4; ++i) { + res[i] = bytes1(uint8(SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID >> (8 * (3 - i)))); + } + // Pack the validation ID. + for (uint256 i; i < 32; ++i) { + res[i + 4] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); + } + // Pack the validity. + res[36] = bytes1(valid ? 1 : 0); + return res; + } + + /** + * @notice Unpacks a byte array as a SubnetValidatorRegistrationMessage message. + * 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 or the validation period was registered * or is not a validator and never will be a validator to do the expiry time passing. */ @@ -127,6 +222,11 @@ library StakingMessages { * +--------------+----------+----------+ * | 52 bytes | * +----------+ + * + * @param validationID The ID of the validation period. + * @param nonce The nonce of the validation ID. + * @param weight The new weight of the validator. + * @return The packed message. */ function packSetSubnetValidatorWeightMessage( bytes32 validationID, @@ -156,6 +256,9 @@ library StakingMessages { /** * @notice Unpacks a byte array as a SetSubnetValidatorWeight message. * 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, nonce, and weight. */ function unpackSetSubnetValidatorWeightMessage(bytes memory input) internal @@ -196,7 +299,7 @@ library StakingMessages { } /** - * @notice Unpacks a byte array as a ValidationUptimeMessage. + * @notice Packs a ValidationUptimeMessage into a byte array. * The message format specification is: * +--------------+----------+----------+ * | typeID : uint32 | 4 bytes | @@ -207,6 +310,37 @@ library StakingMessages { * +--------------+----------+----------+ * | 44 bytes | * +----------+ + * + * @param validationID The ID of the validation period. + * @param uptime The uptime of the validator. + * @return The packed message. + */ + function packValidationUptimeMessage( + bytes32 validationID, + uint64 uptime + ) internal pure returns (bytes memory) { + bytes memory res = new bytes(44); + // Pack the type ID. + for (uint256 i; i < 4; ++i) { + res[i] = bytes1(uint8(VALIDATION_UPTIME_MESSAGE_TYPE_ID >> (8 * (3 - i)))); + } + // Pack the validation ID. + for (uint256 i; i < 32; ++i) { + res[i + 4] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); + } + // Pack the uptime. + for (uint256 i; i < 8; ++i) { + res[i + 36] = bytes1(uint8(uptime >> (8 * (7 - i)))); + } + return res; + } + + /** + * @notice Unpacks a byte array as a ValidationUptimeMessage. + * 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 uptime. */ function unpackValidationUptimeMessage(bytes memory input) internal @@ -256,6 +390,9 @@ library StakingMessages { * +-----------+----------+-----------+ * | 144 bytes | * +-----------+ + * + * @param validationInfo The information to pack. + * @return The validationID and the packed data. */ function packValidationInfo(ValidationInfo memory validationInfo) internal @@ -286,4 +423,57 @@ library StakingMessages { } return (sha256(res), res); } + + /** + * @notice Unpacks a byte array as a ValidationInfo. + * 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 ValidationInfo. + */ + function unpackValidationInfo(bytes memory input) + internal + pure + returns (ValidationInfo memory) + { + require(input.length == 144, "StakingMessages: Invalid message length"); + + // Unpack the subnetID + bytes32 subnetID; + for (uint256 i; i < 32; ++i) { + subnetID |= bytes32(uint256(uint8(input[i])) << (8 * (31 - i))); + } + + // Unpack the nodeID + bytes32 nodeID; + for (uint256 i; i < 32; ++i) { + nodeID |= bytes32(uint256(uint8(input[i + 32])) << (8 * (31 - i))); + } + + // Unpack the weight + uint64 weight; + for (uint256 i; i < 8; ++i) { + weight |= uint64(uint8(input[i + 64])) << uint64((8 * (7 - i))); + } + + // Unpack the registration expiry + uint64 expiry; + for (uint256 i; i < 8; ++i) { + expiry |= uint64(uint8(input[i + 72])) << uint64((8 * (7 - i))); + } + + // Unpack the signature + bytes memory signature = new bytes(64); + for (uint256 i; i < 64; ++i) { + signature[i] = input[i + 80]; + } + + return ValidationInfo({ + subnetID: subnetID, + nodeID: nodeID, + weight: weight, + registrationExpiry: expiry, + signature: signature + }); + } } From 4d4ed7d89e531570d763dfb3a481ebce64b6a568 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 10:47:08 -0400 Subject: [PATCH 025/545] staking messages tests --- .../staking/tests/StakingMessagesTests.t.sol | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 contracts/staking/tests/StakingMessagesTests.t.sol diff --git a/contracts/staking/tests/StakingMessagesTests.t.sol b/contracts/staking/tests/StakingMessagesTests.t.sol new file mode 100644 index 000000000..e41e38692 --- /dev/null +++ b/contracts/staking/tests/StakingMessagesTests.t.sol @@ -0,0 +1,94 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {Test} from "@forge-std/Test.sol"; +import {StakingMessages} from "../StakingMessages.sol"; + +contract StakingMessagesTest is Test { + bytes32 public constant DEFAULT_SUBNET_ID = + bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); + bytes32 public constant DEFAULT_NODE_ID = + bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); + uint64 public constant DEFAULT_EXPIRY = 1000; + bytes public constant DEFAULT_ED25519_SIGNATURE = bytes( + hex"12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" + ); + uint64 public constant DEFAULT_WEIGHT = 1e6; + bytes32 public constant DEFAULT_VALIDATION_ID = + bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); + + function testRegisterSubnetValidatorMessage() public pure { + (bytes32 validationID, bytes memory packed) = StakingMessages + .packRegisterSubnetValidatorMessage( + StakingMessages.ValidationInfo({ + subnetID: DEFAULT_SUBNET_ID, + nodeID: DEFAULT_NODE_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE + }) + ); + + StakingMessages.ValidationInfo memory info = + StakingMessages.unpackRegisterSubnetValidatorMessage(packed); + assertEq(info.subnetID, DEFAULT_SUBNET_ID); + assertEq(info.nodeID, DEFAULT_NODE_ID); + assertEq(info.weight, DEFAULT_WEIGHT); + assertEq(info.registrationExpiry, DEFAULT_EXPIRY); + assertEq(info.signature, DEFAULT_ED25519_SIGNATURE); + + (bytes32 recoveredID,) = StakingMessages.packValidationInfo(info); + assertEq(recoveredID, validationID); + } + + function testSubnetValidatorRegistrationMessage() public pure { + bytes memory packed = + StakingMessages.packSubnetValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); + (bytes32 validationID, bool valid) = + StakingMessages.unpackSubnetValidatorRegistrationMessage(packed); + assertEq(validationID, DEFAULT_VALIDATION_ID); + assert(valid); + } + + function testSetSubnetValidatorWeightMessage() public pure { + bytes memory packed = StakingMessages.packSetSubnetValidatorWeightMessage( + DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT + ); + (bytes32 validationID, uint64 nonce, uint64 weight) = + StakingMessages.unpackSetSubnetValidatorWeightMessage(packed); + assertEq(validationID, DEFAULT_VALIDATION_ID); + assertEq(nonce, 100); + assertEq(weight, DEFAULT_WEIGHT); + } + + function testValidationUptimeMessage() public pure { + bytes memory packed = + StakingMessages.packValidationUptimeMessage(DEFAULT_VALIDATION_ID, 100); + (bytes32 validationID, uint64 uptime) = + StakingMessages.unpackValidationUptimeMessage(packed); + assertEq(validationID, DEFAULT_VALIDATION_ID); + assertEq(uptime, 100); + } + + function testValidationInfo() public pure { + (, bytes memory packed) = StakingMessages.packValidationInfo( + StakingMessages.ValidationInfo({ + subnetID: DEFAULT_SUBNET_ID, + nodeID: DEFAULT_NODE_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE + }) + ); + StakingMessages.ValidationInfo memory info = StakingMessages.unpackValidationInfo(packed); + assertEq(info.subnetID, DEFAULT_SUBNET_ID); + assertEq(info.nodeID, DEFAULT_NODE_ID); + assertEq(info.weight, DEFAULT_WEIGHT); + assertEq(info.registrationExpiry, DEFAULT_EXPIRY); + assertEq(info.signature, DEFAULT_ED25519_SIGNATURE); + } +} From 23089c01c35e2f4faf25d09b5e5181f8f70146d2 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 10:47:44 -0400 Subject: [PATCH 026/545] restrict to view --- contracts/staking/tests/StakingManagerTests.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/staking/tests/StakingManagerTests.t.sol b/contracts/staking/tests/StakingManagerTests.t.sol index 8265ac848..33a21890c 100644 --- a/contracts/staking/tests/StakingManagerTests.t.sol +++ b/contracts/staking/tests/StakingManagerTests.t.sol @@ -47,7 +47,7 @@ abstract contract StakingManagerTest is Test { function setUp() public virtual {} - function testValueToWeight() public { + function testValueToWeight() public view { uint64 w1 = stakingManager.valueToWeight(1e12); uint64 w2 = stakingManager.valueToWeight(1e18); uint64 w3 = stakingManager.valueToWeight(1e27); @@ -57,7 +57,7 @@ abstract contract StakingManagerTest is Test { assertEq(w3, 1e15); } - function testWeightToValue() public { + function testWeightToValue() public view { uint256 v1 = stakingManager.weightToValue(1); uint256 v2 = stakingManager.weightToValue(1e6); uint256 v3 = stakingManager.weightToValue(1e15); From a80ac9c5b8a626f96b209dfa31b7b42801b283f2 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 11:32:25 -0400 Subject: [PATCH 027/545] complete vdr registration test --- .../NativeTokenStakingManagerTests.t.sol | 66 ++++++++++++++++--- 1 file changed, 57 insertions(+), 9 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 293e78e4a..16b1bf2d0 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -10,7 +10,7 @@ import {StakingManagerTest} from "./StakingManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; import {StakingManagerSettings, InitialStakerInfo} from "../interfaces/IStakingManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; -import {IWarpMessenger} from "../StakingManager.sol"; +import {IWarpMessenger, WarpMessage} from "../StakingManager.sol"; import {StakingMessages} from "../StakingMessages.sol"; contract NativeTokenStakingManagerTest is StakingManagerTest { @@ -42,10 +42,18 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { ); } - function testInitializeValidatorRegistrationExcessiveChurn() public {} - function testInitializeValidatorRegistrationInsufficientStake() public {} - function testInitializeValidatorRegistrationExcessiveStake() public {} - function testInitializeValidatorRegistrationInsufficientDuration() public {} + function testInitializeValidatorRegistrationExcessiveChurn() public { + // TODO: implement + } + function testInitializeValidatorRegistrationInsufficientStake() public { + // TODO: implement + } + function testInitializeValidatorRegistrationExcessiveStake() public { + // TODO: implement + } + function testInitializeValidatorRegistrationInsufficientDuration() public { + // TODO: implement + } // The following tests call functions that are implemented in StakingManager, but access state that's // only set in NativeTokenStakingManager. Therefore we call them via the concrete type, rather than a @@ -67,17 +75,57 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { app.resendRegisterValidatorMessage(validationID); } - function testCompleteValidatorRegistration() public {} + function testCompleteValidatorRegistration() public { + bytes32 validationID = _setUpInitializeValidatorRegistration( + DEFAULT_NODE_ID, DEFAULT_SUBNET_ID, 1e6, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE + ); + bytes memory subnetValidatorRegistrationMessage = StakingMessages.packSubnetValidatorRegistrationMessage( + validationID, + true + ); + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), + abi.encode( + WarpMessage({ + sourceChainID: P_CHAIN_BLOCKCHAIN_ID, + originSenderAddress: address(0), + payload: subnetValidatorRegistrationMessage + }), + true + ) + ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) + ); + + vm.warp(1000); + vm.expectEmit(true, true, true, true, address(app)); + emit ValidationPeriodRegistered(validationID, 1e6, 1000); - function testInitializeEndValidation() public {} + app.completeValidatorRegistration(0); + } + + function testInitializeEndValidation() public { + // TODO: implement + } - function testInitializeEndValidationWithUptimeProof() public {} + function testInitializeEndValidationWithUptimeProof() public { + // TODO: implement + } function testResendEndValidation() public { // TODO: implement } - function testCompleteEndValidation() public {} + function testCompleteEndValidation() public { + // TODO: implement + } + + function testCompleteEndValidationSetWeightMessageType() public { + // TODO: implement + } // Helpers function _setUpInitializeValidatorRegistration( From f8fc4d5c5b3ecc8cac317edece3e1f82431cf922 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 11:32:49 -0400 Subject: [PATCH 028/545] format --- .../tests/NativeTokenStakingManagerTests.t.sol | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 16b1bf2d0..6e58dc1b3 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -75,14 +75,12 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { app.resendRegisterValidatorMessage(validationID); } - function testCompleteValidatorRegistration() public { + function testCompleteValidatorRegistration() public { bytes32 validationID = _setUpInitializeValidatorRegistration( DEFAULT_NODE_ID, DEFAULT_SUBNET_ID, 1e6, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE ); - bytes memory subnetValidatorRegistrationMessage = StakingMessages.packSubnetValidatorRegistrationMessage( - validationID, - true - ); + bytes memory subnetValidatorRegistrationMessage = + StakingMessages.packSubnetValidatorRegistrationMessage(validationID, true); vm.mockCall( WARP_PRECOMPILE_ADDRESS, abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), @@ -96,10 +94,9 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { ) ); vm.expectCall( - WARP_PRECOMPILE_ADDRESS, - abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) + WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) ); - + vm.warp(1000); vm.expectEmit(true, true, true, true, address(app)); emit ValidationPeriodRegistered(validationID, 1e6, 1000); From 727eec5cb9685a3fac6215fad2de0ac53120ba86 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 1 Aug 2024 11:37:41 -0400 Subject: [PATCH 029/545] Remove initial stake for validators --- .../staking/NativeTokenStakingManager.sol | 2 +- contracts/staking/StakingManager.sol | 52 +------------------ 2 files changed, 3 insertions(+), 51 deletions(-) diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 020d96c0c..30b2d18c2 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -27,7 +27,7 @@ contract NativeTokenStakingManager is StakingManager, INativeTokenStakingManager bytes32 nodeID, uint64 registrationExpiry, bytes memory signature - ) external payable onlyWhenInitialStakeProvided returns (bytes32) { + ) external payable returns (bytes32) { return _initializeValidatorRegistration(nodeID, msg.value, registrationExpiry, signature); } diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index a70d7ad91..47ab7216b 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -54,7 +54,6 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { uint64 _minimumStakeDuration; IRewardCalculator _rewardCalculator; uint8 _maximumHourlyChurn; - uint64 _remainingInitialStake; ValidatorChurnPeriod _churnTracker; // Maps the validationID to the registration message such that the message can be re-sent if needed. mapping(bytes32 => bytes) _pendingRegisterValidationMessages; @@ -78,11 +77,6 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { } } - struct InitialStakerInfo { - StakingMessages.ValidationInfo validationInfo; - address owner; - } - struct StakingManagerSettings { bytes32 pChainBlockchainID; bytes32 subnetID; @@ -90,7 +84,6 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { uint256 maximumStakeAmount; uint64 minimumStakeDuration; uint8 maximumHourlyChurn; - InitialStakerInfo[] initialStakers; IRewardCalculator rewardCalculator; } @@ -103,50 +96,9 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { $._maximumStakeAmount = settings.maximumStakeAmount; $._minimumStakeDuration = settings.minimumStakeDuration; $._maximumHourlyChurn = settings.maximumHourlyChurn; - // Add each of the initial stakers as validators - uint64 initialStake; - for (uint256 i; i < settings.initialStakers.length; ++i) { - (bytes32 validationID,) = - StakingMessages.packValidationInfo(settings.initialStakers[i].validationInfo); - $._validationPeriods[validationID] = Validator({ - status: ValidatorStatus.Active, - nodeID: settings.initialStakers[i].validationInfo.nodeID, - weight: settings.initialStakers[i].validationInfo.weight, - startedAt: uint64(block.timestamp), - endedAt: 0, - uptimeSeconds: 0, - owner: settings.initialStakers[i].owner, - rewarded: false, - messageNonce: 0 - }); - initialStake += settings.initialStakers[i].validationInfo.weight; - } - $._remainingInitialStake = initialStake; $._rewardCalculator = settings.rewardCalculator; } - /** - * @notice Modifier to ensure that the initial stake has been provided. - */ - modifier onlyWhenInitialStakeProvided() { - StakingManagerStorage storage $ = _getStakingManagerStorage(); - require($._remainingInitialStake > 0, "StakingManager: Initial stake not provided"); - _; - } - - /** - * @notice Called to provide initial stake amount for original validators added prior to the contract's initialization. - */ - function provideInitialStake() external payable { - StakingManagerStorage storage $ = _getStakingManagerStorage(); - uint64 remainingInitialStake = $._remainingInitialStake; - require( - msg.value <= remainingInitialStake, - "StakingManager: Provided stake exceeds remaining initial stake" - ); - $._remainingInitialStake = remainingInitialStake - uint64(msg.value); - } - /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. @@ -163,7 +115,7 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { uint256 value, uint64 registrationExpiry, bytes memory signature - ) internal nonReentrant onlyWhenInitialStakeProvided returns (bytes32) { + ) internal nonReentrant returns (bytes32) { StakingManagerStorage storage $ = _getStakingManagerStorage(); // Ensure the registration expiry is in a valid range. @@ -290,7 +242,7 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { bytes32 validationID, bool includeUptimeProof, uint32 messageIndex - ) external onlyWhenInitialStakeProvided { + ) external { StakingManagerStorage storage $ = _getStakingManagerStorage(); // Ensure the validation period is active. From cf1e444c50eda1931c70e901f5cdead5295e9e0d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 14:50:46 -0400 Subject: [PATCH 030/545] init end vdr test --- .../NativeTokenStakingManagerTests.t.sol | 90 +++++++++++++------ 1 file changed, 65 insertions(+), 25 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 6e58dc1b3..8669c2894 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -76,39 +76,45 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { } function testCompleteValidatorRegistration() public { - bytes32 validationID = _setUpInitializeValidatorRegistration( - DEFAULT_NODE_ID, DEFAULT_SUBNET_ID, 1e6, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE - ); - bytes memory subnetValidatorRegistrationMessage = - StakingMessages.packSubnetValidatorRegistrationMessage(validationID, true); + _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: 1e6, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE, + registrationTimestamp: 1000 + }); + } + + function testInitializeEndValidation() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: 1e6, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE, + registrationTimestamp: 1000 + }); + + vm.warp(2000); vm.mockCall( WARP_PRECOMPILE_ADDRESS, - abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), - abi.encode( - WarpMessage({ - sourceChainID: P_CHAIN_BLOCKCHAIN_ID, - originSenderAddress: address(0), - payload: subnetValidatorRegistrationMessage - }), - true - ) - ); - vm.expectCall( - WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) + abi.encode(IWarpMessenger.sendWarpMessage.selector), + abi.encode(bytes32(0)) ); - - vm.warp(1000); vm.expectEmit(true, true, true, true, address(app)); - emit ValidationPeriodRegistered(validationID, 1e6, 1000); - - app.completeValidatorRegistration(0); + emit ValidatorRemovalInitialized( + validationID, bytes32(0), 1e6, 2000 , 0 + ); + + app.initializeEndValidation(validationID, false, 0); } - function testInitializeEndValidation() public { + function testInitializeEndValidationWithUptimeProof() public { // TODO: implement } - function testInitializeEndValidationWithUptimeProof() public { + function testInitializeEndValidationExcessiveChurn() public { // TODO: implement } @@ -164,5 +170,39 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { ); } - function _setUpCompleteValidatorRegistration() internal {} + function _setUpCompleteValidatorRegistration( + bytes32 nodeID, + bytes32 subnetID, + uint64 weight, + uint64 registrationExpiry, + bytes memory signature, + uint64 registrationTimestamp + ) internal returns (bytes32 validationID) { + validationID = _setUpInitializeValidatorRegistration( + nodeID, subnetID, weight, registrationExpiry, signature + ); + bytes memory subnetValidatorRegistrationMessage = + StakingMessages.packSubnetValidatorRegistrationMessage(validationID, true); + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), + abi.encode( + WarpMessage({ + sourceChainID: P_CHAIN_BLOCKCHAIN_ID, + originSenderAddress: address(0), + payload: subnetValidatorRegistrationMessage + }), + true + ) + ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) + ); + + vm.warp(registrationTimestamp); + vm.expectEmit(true, true, true, true, address(app)); + emit ValidationPeriodRegistered(validationID, weight, registrationTimestamp); + + app.completeValidatorRegistration(0); + } } From 6ea330ff616145ede87a4379d8fdb8eb8f20fb50 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 15:06:19 -0400 Subject: [PATCH 031/545] resent init vdr end test --- .../NativeTokenStakingManagerTests.t.sol | 81 ++++++++++++++----- 1 file changed, 60 insertions(+), 21 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 8669c2894..f6b60787c 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -87,27 +87,15 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { } function testInitializeEndValidation() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: 1e6, - registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE, - registrationTimestamp: 1000 + _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: 1e6, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE, + registrationTimestamp: 1000, + completionTimestamp: 2000 }); - - vm.warp(2000); - vm.mockCall( - WARP_PRECOMPILE_ADDRESS, - abi.encode(IWarpMessenger.sendWarpMessage.selector), - abi.encode(bytes32(0)) - ); - vm.expectEmit(true, true, true, true, address(app)); - emit ValidatorRemovalInitialized( - validationID, bytes32(0), 1e6, 2000 , 0 - ); - - app.initializeEndValidation(validationID, false, 0); } function testInitializeEndValidationWithUptimeProof() public { @@ -119,7 +107,26 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { } function testResendEndValidation() public { - // TODO: implement + bytes32 validationID = _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: 1e6, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE, + registrationTimestamp: 1000, + completionTimestamp: 2000 + }); + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encode(IWarpMessenger.sendWarpMessage.selector), + abi.encode(bytes32(0)) + ); + // TODO: construct the expected message in the same way as the contract + // vm.expectCall( + // WARP_PRECOMPILE_ADDRESS, + // abi.encodeCall(IWarpMessenger.sendWarpMessage, (abi.encode(expectedMessage))) + // ); + app.resendEndValidatorMessage(validationID); } function testCompleteEndValidation() public { @@ -205,4 +212,36 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { app.completeValidatorRegistration(0); } + + function _setUpInitializeEndValidation( + bytes32 nodeID, + bytes32 subnetID, + uint64 weight, + uint64 registrationExpiry, + bytes memory signature, + uint64 registrationTimestamp, + uint64 completionTimestamp + ) internal returns (bytes32 validationID) { + validationID = _setUpCompleteValidatorRegistration({ + nodeID: nodeID, + subnetID: subnetID, + weight: weight, + registrationExpiry: registrationExpiry, + signature: signature, + registrationTimestamp: registrationTimestamp + }); + + vm.warp(completionTimestamp); + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encode(IWarpMessenger.sendWarpMessage.selector), + abi.encode(bytes32(0)) + ); + vm.expectEmit(true, true, true, true, address(app)); + emit ValidatorRemovalInitialized( + validationID, bytes32(0), weight, completionTimestamp , 0 + ); + + app.initializeEndValidation(validationID, false, 0); + } } From e728e2ff4a9b6e42d286f169a79fa780a5217a0a Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 15:49:01 -0400 Subject: [PATCH 032/545] emit validation period ended --- contracts/staking/StakingManager.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 17b3e0395..3a2d71435 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -413,6 +413,7 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { // Calculate the reward for the validator. // Emit event. + emit ValidationPeriodEnded(validationID); } /** From 5343d39c097092cffed45d743f43d2498ed924f6 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 15:49:13 -0400 Subject: [PATCH 033/545] complete validation test --- .../NativeTokenStakingManagerTests.t.sol | 66 ++++++++++++++++++- 1 file changed, 64 insertions(+), 2 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index f6b60787c..022e38682 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -130,11 +130,73 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { } function testCompleteEndValidation() public { - // TODO: implement + bytes32 validationID = _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: 1e6, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE, + registrationTimestamp: 1000, + completionTimestamp: 2000 + }); + + bytes memory subnetValidatorRegistrationMessage = + StakingMessages.packSubnetValidatorRegistrationMessage(validationID, false); + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), + abi.encode( + WarpMessage({ + sourceChainID: P_CHAIN_BLOCKCHAIN_ID, + originSenderAddress: address(0), + payload: subnetValidatorRegistrationMessage + }), + true + ) + ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) + ); + + vm.expectEmit(true, true, true, true, address(app)); + emit ValidationPeriodEnded(validationID); + + app.completeEndValidation(0, false); } function testCompleteEndValidationSetWeightMessageType() public { - // TODO: implement + bytes32 validationID = _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: 1e6, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE, + registrationTimestamp: 1000, + completionTimestamp: 2000 + }); + + bytes memory setSubnetValidatorWeightMessage = + StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), + abi.encode( + WarpMessage({ + sourceChainID: P_CHAIN_BLOCKCHAIN_ID, + originSenderAddress: address(0), + payload: setSubnetValidatorWeightMessage + }), + true + ) + ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) + ); + + vm.expectEmit(true, true, true, true, address(app)); + emit ValidationPeriodEnded(validationID); + + app.completeEndValidation(0, true); } // Helpers From 5df9ae389c1d66f0360c2f40a954250fb527f274 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 15:50:08 -0400 Subject: [PATCH 034/545] format --- .../NativeTokenStakingManagerTests.t.sol | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 022e38682..0f5f4e0ad 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -77,11 +77,11 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { function testCompleteValidatorRegistration() public { _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: 1e6, - registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE, + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: 1e6, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE, registrationTimestamp: 1000 }); } @@ -107,7 +107,7 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { } function testResendEndValidation() public { - bytes32 validationID = _setUpInitializeEndValidation({ + bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, weight: 1e6, @@ -285,11 +285,11 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { uint64 completionTimestamp ) internal returns (bytes32 validationID) { validationID = _setUpCompleteValidatorRegistration({ - nodeID: nodeID, - subnetID: subnetID, - weight: weight, - registrationExpiry: registrationExpiry, - signature: signature, + nodeID: nodeID, + subnetID: subnetID, + weight: weight, + registrationExpiry: registrationExpiry, + signature: signature, registrationTimestamp: registrationTimestamp }); @@ -300,10 +300,8 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { abi.encode(bytes32(0)) ); vm.expectEmit(true, true, true, true, address(app)); - emit ValidatorRemovalInitialized( - validationID, bytes32(0), weight, completionTimestamp , 0 - ); - + emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp, 0); + app.initializeEndValidation(validationID, false, 0); } } From 988103e43e7521041e655ffe5456e976c2622eba Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 1 Aug 2024 16:05:30 -0400 Subject: [PATCH 035/545] additional upgradability to staking manager --- .../staking/NativeTokenStakingManager.sol | 10 +++- contracts/staking/StakingManager.sol | 59 ++++++++++++++----- 2 files changed, 52 insertions(+), 17 deletions(-) diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 020d96c0c..a4506aa55 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -8,9 +8,16 @@ pragma solidity 0.8.25; import {INativeTokenStakingManager} from "./interfaces/INativeTokenStakingManager.sol"; import {Address} from "@openzeppelin/contracts@5.0.2/utils/Address.sol"; import {StakingManager} from "./StakingManager.sol"; +import {Initializable} from + "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; -contract NativeTokenStakingManager is StakingManager, INativeTokenStakingManager { +contract NativeTokenStakingManager is Initializable, StakingManager, INativeTokenStakingManager { using Address for address payable; + + constructor() { + _disableInitializers(); + } + /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. @@ -22,7 +29,6 @@ contract NativeTokenStakingManager is StakingManager, INativeTokenStakingManager * The signature field will be validated by the P-Chain. Implementations may choose to validate that the signature * field is well-formed but it is not required. */ - function initializeValidatorRegistration( bytes32 nodeID, uint64 registrationExpiry, diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index a70d7ad91..7daadbaa3 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -10,12 +10,21 @@ import { WarpMessage, IWarpMessenger } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; -import {ReentrancyGuard} from "@openzeppelin/contracts@5.0.2/utils/ReentrancyGuard.sol"; +import {ReentrancyGuardUpgradeable} from + "@openzeppelin/contracts-upgradeable@5.0.2/utils/ReentrancyGuardUpgradeable.sol"; import {StakingMessages} from "./StakingMessages.sol"; import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; -import {Context} from "@openzeppelin/contracts@5.0.2/utils/Context.sol"; - -abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { +import {ContextUpgradeable} from + "@openzeppelin/contracts-upgradeable@5.0.2/utils/ContextUpgradeable.sol"; +import {Initializable} from + "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; + +abstract contract StakingManager is + Initializable, + ContextUpgradeable, + ReentrancyGuardUpgradeable, + IStakingManager +{ enum ValidatorStatus { Unknown, PendingAdded, @@ -46,7 +55,6 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.StakingManager struct StakingManagerStorage { - IWarpMessenger _warpMessenger; bytes32 _pChainBlockchainID; bytes32 _subnetID; uint256 _minimumStakeAmount; @@ -94,9 +102,30 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { IRewardCalculator rewardCalculator; } - function initialize(StakingManagerSettings calldata settings) public { + /** + * @notice Warp precompile used for sending and receiving Warp messages. + */ + IWarpMessenger public constant WARP_MESSENGER = + IWarpMessenger(0x0200000000000000000000000000000000000005); + + function initialize(StakingManagerSettings calldata settings) public initializer { + __StakingManager_init(settings); + } + + function __StakingManager_init(StakingManagerSettings calldata settings) + internal + onlyInitializing + { + __ReentrancyGuard_init(); + __Context_init(); + __StakingManager_init_unchained(settings); + } + + function __StakingManager_init_unchained(StakingManagerSettings calldata settings) + internal + onlyInitializing + { StakingManagerStorage storage $ = _getStakingManagerStorage(); - $._warpMessenger = IWarpMessenger(0x0200000000000000000000000000000000000005); $._pChainBlockchainID = settings.pChainBlockchainID; $._subnetID = settings.subnetID; $._minimumStakeAmount = settings.minimumStakeAmount; @@ -208,7 +237,7 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { $._pendingRegisterValidationMessages[validationID] = registerSubnetValidatorMessage; // Submit the message to the Warp precompile. - bytes32 messageID = $._warpMessenger.sendWarpMessage(registerSubnetValidatorMessage); + bytes32 messageID = WARP_MESSENGER.sendWarpMessage(registerSubnetValidatorMessage); $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.PendingAdded, @@ -239,7 +268,7 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { ); // Submit the message to the Warp precompile. - $._warpMessenger.sendWarpMessage($._pendingRegisterValidationMessages[validationID]); + WARP_MESSENGER.sendWarpMessage($._pendingRegisterValidationMessages[validationID]); } /** @@ -250,7 +279,7 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { function completeValidatorRegistration(uint32 messageIndex) external { StakingManagerStorage storage $ = _getStakingManagerStorage(); (WarpMessage memory warpMessage, bool valid) = - $._warpMessenger.getVerifiedWarpMessage(messageIndex); + WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); require(valid, "StakingManager: Invalid warp message"); require( @@ -312,11 +341,11 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { uint64 uptimeSeconds; if (includeUptimeProof) { (WarpMessage memory warpMessage, bool valid) = - $._warpMessenger.getVerifiedWarpMessage(messageIndex); + WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); require(valid, "StakingManager: Invalid warp message"); require( - warpMessage.sourceChainID == $._warpMessenger.getBlockchainID(), + warpMessage.sourceChainID == WARP_MESSENGER.getBlockchainID(), "StakingManager: Invalid source chain ID" ); require( @@ -341,7 +370,7 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { bytes memory setValidatorWeightPayload = StakingMessages.packSetSubnetValidatorWeightMessage( validationID, validator.messageNonce, 0 ); - bytes32 messageID = $._warpMessenger.sendWarpMessage(setValidatorWeightPayload); + bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); // Emit the event to signal the start of the validator removal process. emit ValidatorRemovalInitialized( @@ -366,7 +395,7 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { bytes memory setValidatorWeightPayload = StakingMessages.packSetSubnetValidatorWeightMessage( validationID, validator.messageNonce, 0 ); - $._warpMessenger.sendWarpMessage(setValidatorWeightPayload); + WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); } /** @@ -384,7 +413,7 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { // Get the Warp message. (WarpMessage memory warpMessage, bool valid) = - $._warpMessenger.getVerifiedWarpMessage(messageIndex); + WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); require(valid, "StakingManager: Invalid warp message"); bytes32 validationID; From 3480ed94f63e4f5c671daf204b10f093e68ab19b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 16:14:51 -0400 Subject: [PATCH 036/545] add expected warp msgs --- .../NativeTokenStakingManagerTests.t.sol | 52 +++++++++++++------ 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 0f5f4e0ad..8f4369fc3 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -62,16 +62,25 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { bytes32 validationID = _setUpInitializeValidatorRegistration( DEFAULT_NODE_ID, DEFAULT_SUBNET_ID, 1e6, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE ); + (, bytes memory registerSubnetValidatorMessage) = StakingMessages + .packRegisterSubnetValidatorMessage( + StakingMessages.ValidationInfo({ + subnetID: DEFAULT_SUBNET_ID, + nodeID: DEFAULT_NODE_ID, + weight: 1e6, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE + }) + ); vm.mockCall( WARP_PRECOMPILE_ADDRESS, abi.encode(IWarpMessenger.sendWarpMessage.selector), abi.encode(bytes32(0)) ); - // TODO: construct the expected message in the same way as the contract - // vm.expectCall( - // WARP_PRECOMPILE_ADDRESS, - // abi.encodeCall(IWarpMessenger.sendWarpMessage, (abi.encode(expectedMessage))) - // ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeCall(IWarpMessenger.sendWarpMessage, registerSubnetValidatorMessage) + ); app.resendRegisterValidatorMessage(validationID); } @@ -116,16 +125,18 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { registrationTimestamp: 1000, completionTimestamp: 2000 }); + bytes memory setValidatorWeightPayload = StakingMessages.packSetSubnetValidatorWeightMessage( + validationID, 0, 0 + ); vm.mockCall( WARP_PRECOMPILE_ADDRESS, abi.encode(IWarpMessenger.sendWarpMessage.selector), abi.encode(bytes32(0)) ); - // TODO: construct the expected message in the same way as the contract - // vm.expectCall( - // WARP_PRECOMPILE_ADDRESS, - // abi.encodeCall(IWarpMessenger.sendWarpMessage, (abi.encode(expectedMessage))) - // ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeCall(IWarpMessenger.sendWarpMessage, setValidatorWeightPayload) + ); app.resendEndValidatorMessage(validationID); } @@ -216,19 +227,26 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { signature: signature }) ); - + (, bytes memory registerSubnetValidatorMessage) = StakingMessages + .packRegisterSubnetValidatorMessage( + StakingMessages.ValidationInfo({ + subnetID: subnetID, + nodeID: nodeID, + weight: weight, + registrationExpiry: registrationExpiry, + signature: signature + }) + ); vm.warp(DEFAULT_EXPIRY - 1); - vm.mockCall( WARP_PRECOMPILE_ADDRESS, abi.encode(IWarpMessenger.sendWarpMessage.selector), abi.encode(bytes32(0)) ); - // TODO: construct the expected message in the same way as the contract - // vm.expectCall( - // WARP_PRECOMPILE_ADDRESS, - // abi.encodeCall(IWarpMessenger.sendWarpMessage, (abi.encode(expectedMessage))) - // ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeCall(IWarpMessenger.sendWarpMessage, registerSubnetValidatorMessage) + ); vm.expectEmit(true, true, true, true, address(app)); emit ValidationPeriodCreated( validationID, DEFAULT_NODE_ID, bytes32(0), weight, DEFAULT_EXPIRY From 712ea740f1430074967c3c7b7b85a63d318dac97 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 1 Aug 2024 16:36:03 -0400 Subject: [PATCH 037/545] update storage slot --- contracts/staking/StakingManager.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 7daadbaa3..57f167ec3 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -74,9 +74,9 @@ abstract contract StakingManager is // solhint-enable private-vars-leading-underscore // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.StakingManager")) - 1)) & ~bytes32(uint256(0xff)); - // TODO: Update to correct storage slot + // TODO: Unit test for storage slot bytes32 private constant _STAKING_MANAGER_STORAGE_LOCATION = - 0x8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91; + 0xafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600; // solhint-disable ordering function _getStakingManagerStorage() private pure returns (StakingManagerStorage storage $) { From 0087c0790a02fb67293525044902ea4a36c47e25 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 16:38:39 -0400 Subject: [PATCH 038/545] lint --- .../tests/NativeTokenStakingManagerTests.t.sol | 13 ++++++------- contracts/staking/tests/StakingManagerTests.t.sol | 2 -- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 8f4369fc3..cb25e2762 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -5,7 +5,6 @@ pragma solidity 0.8.25; -import {Test} from "@forge-std/Test.sol"; import {StakingManagerTest} from "./StakingManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; import {StakingManagerSettings, InitialStakerInfo} from "../interfaces/IStakingManager.sol"; @@ -13,6 +12,8 @@ import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {IWarpMessenger, WarpMessage} from "../StakingManager.sol"; import {StakingMessages} from "../StakingMessages.sol"; +// TODO: Remove this once all unit tests implemented +// solhint-disable no-empty-blocks contract NativeTokenStakingManagerTest is StakingManagerTest { NativeTokenStakingManager public app; @@ -31,9 +32,6 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { }) ); stakingManager = app; - - // Setup the test - StakingManagerTest.setUp(); } function testInitializeValidatorRegistrationSuccess() public { @@ -125,9 +123,8 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { registrationTimestamp: 1000, completionTimestamp: 2000 }); - bytes memory setValidatorWeightPayload = StakingMessages.packSetSubnetValidatorWeightMessage( - validationID, 0, 0 - ); + bytes memory setValidatorWeightPayload = + StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); vm.mockCall( WARP_PRECOMPILE_ADDRESS, abi.encode(IWarpMessenger.sendWarpMessage.selector), @@ -323,3 +320,5 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { app.initializeEndValidation(validationID, false, 0); } } +// TODO: Remove this once all unit tests implemented +// solhint-enable no-empty-blocks diff --git a/contracts/staking/tests/StakingManagerTests.t.sol b/contracts/staking/tests/StakingManagerTests.t.sol index 33a21890c..71cf47210 100644 --- a/contracts/staking/tests/StakingManagerTests.t.sol +++ b/contracts/staking/tests/StakingManagerTests.t.sol @@ -45,8 +45,6 @@ abstract contract StakingManagerTest is Test { event ValidationPeriodEnded(bytes32 indexed validationID); - function setUp() public virtual {} - function testValueToWeight() public view { uint64 w1 = stakingManager.valueToWeight(1e12); uint64 w2 = stakingManager.valueToWeight(1e18); From 4a15a81154ea46cc46eaec2bb07797a5c5365892 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 1 Aug 2024 16:41:47 -0400 Subject: [PATCH 039/545] build fix --- contracts/staking/tests/NativeTokenStakingManagerTests.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index cb25e2762..2692cc208 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -17,7 +17,7 @@ import {StakingMessages} from "../StakingMessages.sol"; contract NativeTokenStakingManagerTest is StakingManagerTest { NativeTokenStakingManager public app; - function setUp() public override { + function setUp() public virtual { // Construct the object under test app = new NativeTokenStakingManager( StakingManagerSettings({ From cfa01aefe451b12669d541ca49924026a0991527 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 2 Aug 2024 09:51:18 -0400 Subject: [PATCH 040/545] fix lints --- contracts/staking/NativeTokenStakingManager.sol | 4 ++-- contracts/staking/StakingManager.sol | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index a4506aa55..2b3f72ab2 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -21,10 +21,10 @@ contract NativeTokenStakingManager is Initializable, StakingManager, INativeToke /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. + * @param registrationExpiry The time at which the registration is no longer valid on the P-Chain. * @param signature The raw bytes of the Ed25519 signature over the concatenated bytes of * [subnetID]+[nodeID]+[blsPublicKey]+[weight]+[balance]+[expiry]. This signature must correspond to the Ed25519 - * public key that is used for the nodeID. This approach prevents NodeIDs from being unwillingly added to Subnets. + * public key that is used for the nodeID. This approach prevents nodeIDs from being unwillingly added to Subnets. * balance is the minimum initial $nAVAX balance that must be attached to the validator serialized as a uint64. * The signature field will be validated by the P-Chain. Implementations may choose to validate that the signature * field is well-formed but it is not required. diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 57f167ec3..86148a415 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -112,6 +112,7 @@ abstract contract StakingManager is __StakingManager_init(settings); } + // solhint-disable-next-line func-name-mixedcase function __StakingManager_init(StakingManagerSettings calldata settings) internal onlyInitializing @@ -121,6 +122,7 @@ abstract contract StakingManager is __StakingManager_init_unchained(settings); } + // solhint-disable-next-line func-name-mixedcase function __StakingManager_init_unchained(StakingManagerSettings calldata settings) internal onlyInitializing From 050bbb031a214539b2b3146ee1e043e4db27b213 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 2 Aug 2024 13:34:44 -0400 Subject: [PATCH 041/545] default constants --- .../NativeTokenStakingManagerTests.t.sol | 42 +++++++++---------- .../staking/tests/StakingManagerTests.t.sol | 10 ++++- .../staking/tests/StakingMessagesTests.t.sol | 6 +-- 3 files changed, 33 insertions(+), 25 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 2692cc208..4a44b8e53 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -23,10 +23,10 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { StakingManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, - minimumStakeAmount: 20, - maximumStakeAmount: 1e10, - minimumStakeDuration: 24 hours, - maximumHourlyChurn: 0, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, initialStakers: new InitialStakerInfo[](0), rewardCalculator: IRewardCalculator(address(0)) }) @@ -36,7 +36,7 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { function testInitializeValidatorRegistrationSuccess() public { _setUpInitializeValidatorRegistration( - DEFAULT_NODE_ID, DEFAULT_SUBNET_ID, 1e6, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE + DEFAULT_NODE_ID, DEFAULT_SUBNET_ID, DEFAULT_WEIGHT, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE ); } @@ -58,14 +58,14 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { // reference to the abstract type. function testResendRegisterValidatorMessage() public { bytes32 validationID = _setUpInitializeValidatorRegistration( - DEFAULT_NODE_ID, DEFAULT_SUBNET_ID, 1e6, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE + DEFAULT_NODE_ID, DEFAULT_SUBNET_ID, DEFAULT_WEIGHT, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE ); (, bytes memory registerSubnetValidatorMessage) = StakingMessages .packRegisterSubnetValidatorMessage( StakingMessages.ValidationInfo({ subnetID: DEFAULT_SUBNET_ID, nodeID: DEFAULT_NODE_ID, - weight: 1e6, + weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, signature: DEFAULT_ED25519_SIGNATURE }) @@ -86,10 +86,10 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, - weight: 1e6, + weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, signature: DEFAULT_ED25519_SIGNATURE, - registrationTimestamp: 1000 + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); } @@ -97,11 +97,11 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, - weight: 1e6, + weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, signature: DEFAULT_ED25519_SIGNATURE, - registrationTimestamp: 1000, - completionTimestamp: 2000 + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); } @@ -117,11 +117,11 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, - weight: 1e6, + weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, signature: DEFAULT_ED25519_SIGNATURE, - registrationTimestamp: 1000, - completionTimestamp: 2000 + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); bytes memory setValidatorWeightPayload = StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); @@ -141,11 +141,11 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, - weight: 1e6, + weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, signature: DEFAULT_ED25519_SIGNATURE, - registrationTimestamp: 1000, - completionTimestamp: 2000 + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); bytes memory subnetValidatorRegistrationMessage = @@ -176,11 +176,11 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, - weight: 1e6, + weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, signature: DEFAULT_ED25519_SIGNATURE, - registrationTimestamp: 1000, - completionTimestamp: 2000 + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); bytes memory setSubnetValidatorWeightMessage = diff --git a/contracts/staking/tests/StakingManagerTests.t.sol b/contracts/staking/tests/StakingManagerTests.t.sol index 71cf47210..910f63561 100644 --- a/contracts/staking/tests/StakingManagerTests.t.sol +++ b/contracts/staking/tests/StakingManagerTests.t.sol @@ -15,12 +15,20 @@ abstract contract StakingManagerTest is Test { bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes32 public constant DEFAULT_NODE_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); - uint64 public constant DEFAULT_EXPIRY = 1000; bytes public constant DEFAULT_ED25519_SIGNATURE = bytes( hex"12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); address public constant WARP_PRECOMPILE_ADDRESS = 0x0200000000000000000000000000000000000005; + uint64 public constant DEFAULT_WEIGHT = 1e6; + uint256 public constant DEFAULT_MINIMUM_STAKE = 20; + uint256 public constant DEFAULT_MAXIMUM_STAKE = 1e10; + uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; + uint8 public constant DEFAULT_MAXIMUM_HOURLY_CHURN = 0; + uint64 public constant DEFAULT_EXPIRY = 1000; + uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; + uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = 2000; + StakingManager public stakingManager; event ValidationPeriodCreated( diff --git a/contracts/staking/tests/StakingMessagesTests.t.sol b/contracts/staking/tests/StakingMessagesTests.t.sol index e41e38692..3ecf2deec 100644 --- a/contracts/staking/tests/StakingMessagesTests.t.sol +++ b/contracts/staking/tests/StakingMessagesTests.t.sol @@ -12,14 +12,14 @@ contract StakingMessagesTest is Test { bytes32 public constant DEFAULT_SUBNET_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes32 public constant DEFAULT_NODE_ID = - bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); - uint64 public constant DEFAULT_EXPIRY = 1000; + bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes public constant DEFAULT_ED25519_SIGNATURE = bytes( hex"12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); - uint64 public constant DEFAULT_WEIGHT = 1e6; bytes32 public constant DEFAULT_VALIDATION_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); + uint64 public constant DEFAULT_WEIGHT = 1e6; + uint64 public constant DEFAULT_EXPIRY = 1000; function testRegisterSubnetValidatorMessage() public pure { (bytes32 validationID, bytes memory packed) = StakingMessages From 5b59a1fb207b11d5915a132394e2e84e8ff8bec9 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 2 Aug 2024 13:49:54 -0400 Subject: [PATCH 042/545] warp precompile mock helpers --- .../NativeTokenStakingManagerTests.t.sol | 102 ++++++------------ 1 file changed, 34 insertions(+), 68 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 4a44b8e53..a60fff4da 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -70,15 +70,7 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { signature: DEFAULT_ED25519_SIGNATURE }) ); - vm.mockCall( - WARP_PRECOMPILE_ADDRESS, - abi.encode(IWarpMessenger.sendWarpMessage.selector), - abi.encode(bytes32(0)) - ); - vm.expectCall( - WARP_PRECOMPILE_ADDRESS, - abi.encodeCall(IWarpMessenger.sendWarpMessage, registerSubnetValidatorMessage) - ); + _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); app.resendRegisterValidatorMessage(validationID); } @@ -125,15 +117,7 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { }); bytes memory setValidatorWeightPayload = StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); - vm.mockCall( - WARP_PRECOMPILE_ADDRESS, - abi.encode(IWarpMessenger.sendWarpMessage.selector), - abi.encode(bytes32(0)) - ); - vm.expectCall( - WARP_PRECOMPILE_ADDRESS, - abi.encodeCall(IWarpMessenger.sendWarpMessage, setValidatorWeightPayload) - ); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); app.resendEndValidatorMessage(validationID); } @@ -150,21 +134,8 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { bytes memory subnetValidatorRegistrationMessage = StakingMessages.packSubnetValidatorRegistrationMessage(validationID, false); - vm.mockCall( - WARP_PRECOMPILE_ADDRESS, - abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), - abi.encode( - WarpMessage({ - sourceChainID: P_CHAIN_BLOCKCHAIN_ID, - originSenderAddress: address(0), - payload: subnetValidatorRegistrationMessage - }), - true - ) - ); - vm.expectCall( - WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) - ); + + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); vm.expectEmit(true, true, true, true, address(app)); emit ValidationPeriodEnded(validationID); @@ -185,6 +156,17 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { bytes memory setSubnetValidatorWeightMessage = StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + + _mockGetVerifiedWarpMessage(setSubnetValidatorWeightMessage, true); + + vm.expectEmit(true, true, true, true, address(app)); + emit ValidationPeriodEnded(validationID); + + app.completeEndValidation(0, true); + } + + // Helpers + function _mockGetVerifiedWarpMessage(bytes memory expectedPayload, bool valid) internal { vm.mockCall( WARP_PRECOMPILE_ADDRESS, abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), @@ -192,22 +174,28 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { WarpMessage({ sourceChainID: P_CHAIN_BLOCKCHAIN_ID, originSenderAddress: address(0), - payload: setSubnetValidatorWeightMessage + payload: expectedPayload }), - true + valid ) ); vm.expectCall( WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) ); + } - vm.expectEmit(true, true, true, true, address(app)); - emit ValidationPeriodEnded(validationID); - - app.completeEndValidation(0, true); + function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encode(IWarpMessenger.sendWarpMessage.selector), + abi.encode(expectedMessageID) + ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeCall(IWarpMessenger.sendWarpMessage, payload) + ); } - // Helpers function _setUpInitializeValidatorRegistration( bytes32 nodeID, bytes32 subnetID, @@ -235,15 +223,7 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { }) ); vm.warp(DEFAULT_EXPIRY - 1); - vm.mockCall( - WARP_PRECOMPILE_ADDRESS, - abi.encode(IWarpMessenger.sendWarpMessage.selector), - abi.encode(bytes32(0)) - ); - vm.expectCall( - WARP_PRECOMPILE_ADDRESS, - abi.encodeCall(IWarpMessenger.sendWarpMessage, registerSubnetValidatorMessage) - ); + _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); vm.expectEmit(true, true, true, true, address(app)); emit ValidationPeriodCreated( validationID, DEFAULT_NODE_ID, bytes32(0), weight, DEFAULT_EXPIRY @@ -267,21 +247,8 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { ); bytes memory subnetValidatorRegistrationMessage = StakingMessages.packSubnetValidatorRegistrationMessage(validationID, true); - vm.mockCall( - WARP_PRECOMPILE_ADDRESS, - abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), - abi.encode( - WarpMessage({ - sourceChainID: P_CHAIN_BLOCKCHAIN_ID, - originSenderAddress: address(0), - payload: subnetValidatorRegistrationMessage - }), - true - ) - ); - vm.expectCall( - WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) - ); + + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); vm.warp(registrationTimestamp); vm.expectEmit(true, true, true, true, address(app)); @@ -309,11 +276,10 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { }); vm.warp(completionTimestamp); - vm.mockCall( - WARP_PRECOMPILE_ADDRESS, - abi.encode(IWarpMessenger.sendWarpMessage.selector), - abi.encode(bytes32(0)) + bytes memory setValidatorWeightPayload = StakingMessages.packSetSubnetValidatorWeightMessage( + validationID, 0, 0 ); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(app)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp, 0); From 85fb6abeca50d6aa571c912b74a9988f293d728d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 2 Aug 2024 13:54:16 -0400 Subject: [PATCH 043/545] format --- .../NativeTokenStakingManagerTests.t.sol | 24 ++++++++++++------- .../staking/tests/StakingMessagesTests.t.sol | 2 +- 2 files changed, 16 insertions(+), 10 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index a60fff4da..a892ae1a3 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -36,7 +36,11 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { function testInitializeValidatorRegistrationSuccess() public { _setUpInitializeValidatorRegistration( - DEFAULT_NODE_ID, DEFAULT_SUBNET_ID, DEFAULT_WEIGHT, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE + DEFAULT_NODE_ID, + DEFAULT_SUBNET_ID, + DEFAULT_WEIGHT, + DEFAULT_EXPIRY, + DEFAULT_ED25519_SIGNATURE ); } @@ -58,7 +62,11 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { // reference to the abstract type. function testResendRegisterValidatorMessage() public { bytes32 validationID = _setUpInitializeValidatorRegistration( - DEFAULT_NODE_ID, DEFAULT_SUBNET_ID, DEFAULT_WEIGHT, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE + DEFAULT_NODE_ID, + DEFAULT_SUBNET_ID, + DEFAULT_WEIGHT, + DEFAULT_EXPIRY, + DEFAULT_ED25519_SIGNATURE ); (, bytes memory registerSubnetValidatorMessage) = StakingMessages .packRegisterSubnetValidatorMessage( @@ -134,7 +142,7 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { bytes memory subnetValidatorRegistrationMessage = StakingMessages.packSubnetValidatorRegistrationMessage(validationID, false); - + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); vm.expectEmit(true, true, true, true, address(app)); @@ -191,8 +199,7 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { abi.encode(expectedMessageID) ); vm.expectCall( - WARP_PRECOMPILE_ADDRESS, - abi.encodeCall(IWarpMessenger.sendWarpMessage, payload) + WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.sendWarpMessage, payload) ); } @@ -247,7 +254,7 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { ); bytes memory subnetValidatorRegistrationMessage = StakingMessages.packSubnetValidatorRegistrationMessage(validationID, true); - + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); vm.warp(registrationTimestamp); @@ -276,9 +283,8 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { }); vm.warp(completionTimestamp); - bytes memory setValidatorWeightPayload = StakingMessages.packSetSubnetValidatorWeightMessage( - validationID, 0, 0 - ); + bytes memory setValidatorWeightPayload = + StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(app)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp, 0); diff --git a/contracts/staking/tests/StakingMessagesTests.t.sol b/contracts/staking/tests/StakingMessagesTests.t.sol index 3ecf2deec..4b3b44dd9 100644 --- a/contracts/staking/tests/StakingMessagesTests.t.sol +++ b/contracts/staking/tests/StakingMessagesTests.t.sol @@ -12,7 +12,7 @@ contract StakingMessagesTest is Test { bytes32 public constant DEFAULT_SUBNET_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes32 public constant DEFAULT_NODE_ID = - bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); + bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes public constant DEFAULT_ED25519_SIGNATURE = bytes( hex"12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); From 797930805a4743329bde933ca7b5f4d818d0afb0 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 2 Aug 2024 15:52:50 -0400 Subject: [PATCH 044/545] draft erc20 staking manager --- .../staking/ERC20TokenStakingManager.sol | 75 +++++++++++++++++++ contracts/staking/StakingManager.sol | 26 ++----- .../staking/interfaces/IStakingManager.sol | 19 +++++ 3 files changed, 101 insertions(+), 19 deletions(-) create mode 100644 contracts/staking/ERC20TokenStakingManager.sol diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol new file mode 100644 index 000000000..581222c33 --- /dev/null +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -0,0 +1,75 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {IERC20TokenStakingManager} from "./interfaces/IERC20TokenStakingManager.sol"; +import {StakingManager, StakingManagerSettings} from "./StakingManager.sol"; +import {Initializable} from + "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; +import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; +import {SafeERC20TransferFrom} from "@utilities/SafeERC20TransferFrom.sol"; +import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; + +contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenStakingManager { + using SafeERC20 for IERC20; + using SafeERC20TransferFrom for IERC20; + + // solhint-disable private-vars-leading-underscore + /// @custom:storage-location erc7201:avalanche-icm.storage.ERC20TokenStakingManager + + struct ERC20TokenStakingManagerStorage { + IERC20 _token; + } + // solhint-enable private-vars-leading-underscore + + // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.ERC20TokenStakingManager")) - 1)) & ~bytes32(uint256(0xff)); + // TODO: Update to correct storage slot + bytes32 private constant _ERC20_STAKING_MANAGER_STORAGE_LOCATION = + 0x8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91; + + // solhint-disable ordering + function _getERC20StakingManagerStorage() + private + pure + returns (ERC20TokenStakingManagerStorage storage $) + { + // solhint-disable-next-line no-inline-assembly + assembly { + $.slot := _ERC20_STAKING_MANAGER_STORAGE_LOCATION + } + } + + constructor() { + _disableInitializers(); + } + + function initialize( + StakingManagerSettings calldata settings, + IERC20 token + ) external initializer { + initialize(settings); + require(address(token) != address(0), "ERC20TokenStakingManager: zero token address"); + _getERC20StakingManagerStorage()._token = token; + } + + function initializeValidatorRegistration( + uint256 stakeAmount, + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature + ) external override returns (bytes32 validationID) { + return _initializeValidatorRegistration(nodeID, stakeAmount, registrationExpiry, signature); + } + + // Must be guarded with reentrancy guard for safe transfer from + function _lock(uint256 value) internal virtual override returns (uint256) { + return _getERC20StakingManagerStorage()._token.safeTransferFrom(value); + } + + function _unlock(uint256 value, address to) internal virtual override { + _getERC20StakingManagerStorage()._token.safeTransfer(to, value); + } +} diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index a70d7ad91..556dfab93 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -5,7 +5,11 @@ pragma solidity 0.8.25; -import {IStakingManager} from "./interfaces/IStakingManager.sol"; +import { + IStakingManager, + InitialStakerInfo, + StakingManagerSettings +} from "./interfaces/IStakingManager.sol"; import { WarpMessage, IWarpMessenger @@ -63,8 +67,8 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { // Maps the nodeID to the validationID for active validation periods. mapping(bytes32 => bytes32) _activeValidators; } - // solhint-enable private-vars-leading-underscore + // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.StakingManager")) - 1)) & ~bytes32(uint256(0xff)); // TODO: Update to correct storage slot bytes32 private constant _STAKING_MANAGER_STORAGE_LOCATION = @@ -78,22 +82,6 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { } } - struct InitialStakerInfo { - StakingMessages.ValidationInfo validationInfo; - address owner; - } - - struct StakingManagerSettings { - bytes32 pChainBlockchainID; - bytes32 subnetID; - uint256 minimumStakeAmount; - uint256 maximumStakeAmount; - uint64 minimumStakeDuration; - uint8 maximumHourlyChurn; - InitialStakerInfo[] initialStakers; - IRewardCalculator rewardCalculator; - } - function initialize(StakingManagerSettings calldata settings) public { StakingManagerStorage storage $ = _getStakingManagerStorage(); $._warpMessenger = IWarpMessenger(0x0200000000000000000000000000000000000005); @@ -434,7 +422,7 @@ abstract contract StakingManager is Context, ReentrancyGuard, IStakingManager { */ function _checkAndUpdateChurnTracker(uint64 amount) private { StakingManagerStorage storage $ = _getStakingManagerStorage(); - ValidatorChurnPeriod storage churnTracker = $._churnTracker; + ValidatorChurnPeriod memory churnTracker = $._churnTracker; uint256 currentTime = block.timestamp; if (currentTime - churnTracker.startedAt >= 1 hours) { churnTracker.churnAmount = amount; diff --git a/contracts/staking/interfaces/IStakingManager.sol b/contracts/staking/interfaces/IStakingManager.sol index 963e31587..f15864f48 100644 --- a/contracts/staking/interfaces/IStakingManager.sol +++ b/contracts/staking/interfaces/IStakingManager.sol @@ -5,6 +5,25 @@ pragma solidity 0.8.25; +import {StakingMessages} from "../StakingMessages.sol"; +import {IRewardCalculator} from "./IRewardCalculator.sol"; + +struct InitialStakerInfo { + StakingMessages.ValidationInfo validationInfo; + address owner; +} + +struct StakingManagerSettings { + bytes32 pChainBlockchainID; + bytes32 subnetID; + uint256 minimumStakeAmount; + uint256 maximumStakeAmount; + uint64 minimumStakeDuration; + uint8 maximumHourlyChurn; + InitialStakerInfo[] initialStakers; + IRewardCalculator rewardCalculator; +} + interface IStakingManager { /** * @notice Emitted when a new validation period is created by stake being locked in the manager contract. From 361ce6010f4ce3d85f8951ca26122df21c2a5a61 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 5 Aug 2024 09:42:22 -0500 Subject: [PATCH 045/545] icm initializable --- .../staking/tests/NativeTokenStakingManagerTests.t.sol | 9 +++++---- contracts/utilities/ICMInitializable.sol | 10 ++++++++++ 2 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 contracts/utilities/ICMInitializable.sol diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index a892ae1a3..0a76c5572 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -11,6 +11,8 @@ import {StakingManagerSettings, InitialStakerInfo} from "../interfaces/IStakingM import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {IWarpMessenger, WarpMessage} from "../StakingManager.sol"; import {StakingMessages} from "../StakingMessages.sol"; +import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; + // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks @@ -19,8 +21,8 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { function setUp() public virtual { // Construct the object under test - app = new NativeTokenStakingManager( - StakingManagerSettings({ + app = new NativeTokenStakingManager(ICMInitializable.Allowed); + app.initialize(StakingManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, minimumStakeAmount: DEFAULT_MINIMUM_STAKE, @@ -29,8 +31,7 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, initialStakers: new InitialStakerInfo[](0), rewardCalculator: IRewardCalculator(address(0)) - }) - ); + })); stakingManager = app; } diff --git a/contracts/utilities/ICMInitializable.sol b/contracts/utilities/ICMInitializable.sol new file mode 100644 index 000000000..9e9c1ae88 --- /dev/null +++ b/contracts/utilities/ICMInitializable.sol @@ -0,0 +1,10 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem +pragma solidity 0.8.25; + +enum ICMInitializable { + Allowed, + Disallowed +} From 9735935fef1b5c48f349f545b3203325540eca10 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 5 Aug 2024 09:42:57 -0500 Subject: [PATCH 046/545] format --- .../staking/tests/NativeTokenStakingManagerTests.t.sol | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 0a76c5572..b58b4f918 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -13,7 +13,6 @@ import {IWarpMessenger, WarpMessage} from "../StakingManager.sol"; import {StakingMessages} from "../StakingMessages.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; - // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks contract NativeTokenStakingManagerTest is StakingManagerTest { @@ -22,7 +21,8 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { function setUp() public virtual { // Construct the object under test app = new NativeTokenStakingManager(ICMInitializable.Allowed); - app.initialize(StakingManagerSettings({ + app.initialize( + StakingManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, minimumStakeAmount: DEFAULT_MINIMUM_STAKE, @@ -31,7 +31,8 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, initialStakers: new InitialStakerInfo[](0), rewardCalculator: IRewardCalculator(address(0)) - })); + }) + ); stakingManager = app; } From 838dbb61113f5bbb1ff776fd53e53347073b4366 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 6 Aug 2024 12:28:06 -0400 Subject: [PATCH 047/545] Initial rewards calculator --- contracts/staking/ExampleRewardCalculator.sol | 23 +++++++++++++++++++ .../staking/interfaces/IRewardCalculator.sol | 3 ++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 contracts/staking/ExampleRewardCalculator.sol diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol new file mode 100644 index 000000000..bdde961b4 --- /dev/null +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -0,0 +1,23 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; + +contract ExampleRewardCalculator is IRewardCalculator { + uint256 public constant SECONDS_IN_YEAR = 31536000; + + function calculateReward( + uint64 stakeAmount, + uint64 startTime, + uint64 endTime, + uint256, // initialSupply + uint256, // endSupply + uint256 rewardBasisPoints + ) external pure returns (uint256) { + return stakeAmount * rewardBasisPoints * (endTime - startTime) / SECONDS_IN_YEAR / 1000; + } +} diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol index a42038989..4cbe84466 100644 --- a/contracts/staking/interfaces/IRewardCalculator.sol +++ b/contracts/staking/interfaces/IRewardCalculator.sol @@ -11,6 +11,7 @@ interface IRewardCalculator { uint64 startTime, uint64 endTime, uint256 initialSupply, - uint256 endSupply + uint256 endSupply, + uint256 rewardBasisPoints ) external returns (uint256); } From e3f78341a2db4dbbc7bced84246fab8b8fb1c712 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 7 Aug 2024 11:43:40 -0400 Subject: [PATCH 048/545] move initialize to parent contracts --- .../staking/ERC20TokenStakingManager.sol | 22 ++++++-- .../staking/NativeTokenStakingManager.sol | 15 +++++- contracts/staking/StakingManager.sol | 52 +++++++++---------- contracts/staking/StakingMessages.sol | 4 +- 4 files changed, 60 insertions(+), 33 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 581222c33..321eb476c 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -19,9 +19,9 @@ contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenS // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.ERC20TokenStakingManager - struct ERC20TokenStakingManagerStorage { IERC20 _token; + uint8 _tokenDecimals; } // solhint-enable private-vars-leading-underscore @@ -48,11 +48,25 @@ contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenS function initialize( StakingManagerSettings calldata settings, - IERC20 token + IERC20 token, + uint8 tokenDecimals ) external initializer { - initialize(settings); + __ERC20TokenStakingManager_init(settings, token, tokenDecimals); + } + + function __ERC20TokenStakingManager_init( + StakingManagerSettings calldata settings, + IERC20 token, + uint8 tokenDecimals + ) internal onlyInitializing { + __StakingManager_init(settings, tokenDecimals); + __ERC20TokenStakingManager_init_unchained(token); + } + + function __ERC20TokenStakingManager_init_unchained(IERC20 token) internal onlyInitializing { + ERC20TokenStakingManagerStorage storage $ = _getERC20StakingManagerStorage(); require(address(token) != address(0), "ERC20TokenStakingManager: zero token address"); - _getERC20StakingManagerStorage()._token = token; + $._token = token; } function initializeValidatorRegistration( diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 62e7c4fb8..70f044826 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -7,7 +7,7 @@ pragma solidity 0.8.25; import {INativeTokenStakingManager} from "./interfaces/INativeTokenStakingManager.sol"; import {Address} from "@openzeppelin/contracts@5.0.2/utils/Address.sol"; -import {StakingManager} from "./StakingManager.sol"; +import {StakingManager, StakingManagerSettings} from "./StakingManager.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; @@ -18,6 +18,19 @@ contract NativeTokenStakingManager is Initializable, StakingManager, INativeToke _disableInitializers(); } + function initialize(StakingManagerSettings calldata settings) external initializer { + __NativeTokenStakingManager_init(settings); + } + + function __NativeTokenStakingManager_init(StakingManagerSettings calldata settings) + internal + onlyInitializing + { + __StakingManager_init(settings, 12); + } + + function __NativeTokenStakingManager_init_unchained() internal onlyInitializing {} + /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 0449a2300..4e6ebf31b 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -5,11 +5,7 @@ pragma solidity 0.8.25; -import { - IStakingManager, - InitialStakerInfo, - StakingManagerSettings -} from "./interfaces/IStakingManager.sol"; +import {IStakingManager, StakingManagerSettings} from "./interfaces/IStakingManager.sol"; import { WarpMessage, IWarpMessenger @@ -67,6 +63,7 @@ abstract contract StakingManager is IRewardCalculator _rewardCalculator; uint8 _maximumHourlyChurn; ValidatorChurnPeriod _churnTracker; + uint8 _tokenDecimals; // Maps the validationID to the registration message such that the message can be re-sent if needed. mapping(bytes32 => bytes) _pendingRegisterValidationMessages; // Maps the validationID to the validator information. @@ -95,25 +92,21 @@ abstract contract StakingManager is IWarpMessenger public constant WARP_MESSENGER = IWarpMessenger(0x0200000000000000000000000000000000000005); - function initialize(StakingManagerSettings calldata settings) public initializer { - __StakingManager_init(settings); - } - // solhint-disable-next-line func-name-mixedcase - function __StakingManager_init(StakingManagerSettings calldata settings) - internal - onlyInitializing - { + function __StakingManager_init( + StakingManagerSettings calldata settings, + uint8 tokenDecimals + ) internal onlyInitializing { __ReentrancyGuard_init(); __Context_init(); - __StakingManager_init_unchained(settings); + __StakingManager_init_unchained(settings, tokenDecimals); } // solhint-disable-next-line func-name-mixedcase - function __StakingManager_init_unchained(StakingManagerSettings calldata settings) - internal - onlyInitializing - { + function __StakingManager_init_unchained( + StakingManagerSettings calldata settings, + uint8 tokenDecimals + ) internal onlyInitializing { StakingManagerStorage storage $ = _getStakingManagerStorage(); $._pChainBlockchainID = settings.pChainBlockchainID; $._subnetID = settings.subnetID; @@ -122,6 +115,7 @@ abstract contract StakingManager is $._minimumStakeDuration = settings.minimumStakeDuration; $._maximumHourlyChurn = settings.maximumHourlyChurn; $._rewardCalculator = settings.rewardCalculator; + $._tokenDecimals = tokenDecimals; } /** @@ -163,7 +157,7 @@ abstract contract StakingManager is uint256 lockedValue = _lock(value); // Ensure the stake churn doesn't exceed the maximum churn rate. - uint64 weight = valueToWeight(lockedValue); + uint64 weight = _valueToWeight($, lockedValue); _checkAndUpdateChurnTracker(weight); // Ensure the weight is within the valid range. @@ -428,14 +422,20 @@ abstract contract StakingManager is $._churnTracker = churnTracker; } - function valueToWeight(uint256 value) public pure returns (uint64) { - return uint64(value / 1e12); - } + function _lock(uint256 value) internal virtual returns (uint256); + function _unlock(uint256 value, address to) internal virtual; - function weightToValue(uint64 weight) public pure returns (uint256) { - return uint256(weight) * 1e12; + function _valueToWeight( + StakingManagerStorage storage $, + uint256 value + ) private view returns (uint64) { + return uint64(value / (10 ** $._tokenDecimals)); } - function _lock(uint256 value) internal virtual returns (uint256); - function _unlock(uint256 value, address to) internal virtual; + function _weightToValue( + StakingManagerStorage storage $, + uint64 weight + ) private view returns (uint256) { + return uint256(weight) * (10 ** $._tokenDecimals); + } } diff --git a/contracts/staking/StakingMessages.sol b/contracts/staking/StakingMessages.sol index 3d6698b89..6bf423c29 100644 --- a/contracts/staking/StakingMessages.sol +++ b/contracts/staking/StakingMessages.sol @@ -48,13 +48,13 @@ library StakingMessages { * | 148 bytes | * +-----------+ */ - function packRegisterSubnetValidatorMessage(ValidationInfo memory valiationInfo) + function packRegisterSubnetValidatorMessage(ValidationInfo memory validationInfo) internal pure returns (bytes32, bytes memory) { (bytes32 validationID, bytes memory serializedValidationInfo) = - packValidationInfo(valiationInfo); + packValidationInfo(validationInfo); bytes memory res = new bytes(148); // Pack the message type From 8f71e238beb698cae0689695a5700298eae27fda Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 7 Aug 2024 12:54:24 -0400 Subject: [PATCH 049/545] Documentation --- contracts/staking/ExampleRewardCalculator.sol | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index bdde961b4..af3621eac 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -10,6 +10,11 @@ import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; contract ExampleRewardCalculator is IRewardCalculator { uint256 public constant SECONDS_IN_YEAR = 31536000; + /** + * @notice A linear, non-compounding reward calculation that rewards a set percentage of tokens per year. + * + * @param rewardBasisPoints annual reward percentage in basis points (units of 0.1%). + */ function calculateReward( uint64 stakeAmount, uint64 startTime, From 87975ab0fd6e4ed53555469111d27c282076410a Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 7 Aug 2024 13:24:52 -0400 Subject: [PATCH 050/545] uint256 for stake amount --- contracts/staking/ExampleRewardCalculator.sol | 2 +- contracts/staking/interfaces/IRewardCalculator.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index af3621eac..ae9e23d8e 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -16,7 +16,7 @@ contract ExampleRewardCalculator is IRewardCalculator { * @param rewardBasisPoints annual reward percentage in basis points (units of 0.1%). */ function calculateReward( - uint64 stakeAmount, + uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256, // initialSupply diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol index 4cbe84466..1f4a3ce9b 100644 --- a/contracts/staking/interfaces/IRewardCalculator.sol +++ b/contracts/staking/interfaces/IRewardCalculator.sol @@ -7,7 +7,7 @@ pragma solidity 0.8.25; interface IRewardCalculator { function calculateReward( - uint64 stakeAmount, + uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 initialSupply, From 22ab27847c1709b668e0b2d47c8200ef0a1b5eda Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 7 Aug 2024 16:04:41 -0400 Subject: [PATCH 051/545] remove token decimals from staking manager --- .../staking/ERC20TokenStakingManager.sol | 10 ++--- contracts/staking/StakingManager.sol | 42 ++++++++----------- 2 files changed, 21 insertions(+), 31 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 321eb476c..27a4d5448 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -48,18 +48,16 @@ contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenS function initialize( StakingManagerSettings calldata settings, - IERC20 token, - uint8 tokenDecimals + IERC20 token ) external initializer { - __ERC20TokenStakingManager_init(settings, token, tokenDecimals); + __ERC20TokenStakingManager_init(settings, token); } function __ERC20TokenStakingManager_init( StakingManagerSettings calldata settings, - IERC20 token, - uint8 tokenDecimals + IERC20 token ) internal onlyInitializing { - __StakingManager_init(settings, tokenDecimals); + __StakingManager_init(settings); __ERC20TokenStakingManager_init_unchained(token); } diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 4e6ebf31b..48b795e4e 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -63,7 +63,6 @@ abstract contract StakingManager is IRewardCalculator _rewardCalculator; uint8 _maximumHourlyChurn; ValidatorChurnPeriod _churnTracker; - uint8 _tokenDecimals; // Maps the validationID to the registration message such that the message can be re-sent if needed. mapping(bytes32 => bytes) _pendingRegisterValidationMessages; // Maps the validationID to the validator information. @@ -93,20 +92,20 @@ abstract contract StakingManager is IWarpMessenger(0x0200000000000000000000000000000000000005); // solhint-disable-next-line func-name-mixedcase - function __StakingManager_init( - StakingManagerSettings calldata settings, - uint8 tokenDecimals - ) internal onlyInitializing { + function __StakingManager_init(StakingManagerSettings calldata settings) + internal + onlyInitializing + { __ReentrancyGuard_init(); __Context_init(); - __StakingManager_init_unchained(settings, tokenDecimals); + __StakingManager_init_unchained(settings); } // solhint-disable-next-line func-name-mixedcase - function __StakingManager_init_unchained( - StakingManagerSettings calldata settings, - uint8 tokenDecimals - ) internal onlyInitializing { + function __StakingManager_init_unchained(StakingManagerSettings calldata settings) + internal + onlyInitializing + { StakingManagerStorage storage $ = _getStakingManagerStorage(); $._pChainBlockchainID = settings.pChainBlockchainID; $._subnetID = settings.subnetID; @@ -115,7 +114,6 @@ abstract contract StakingManager is $._minimumStakeDuration = settings.minimumStakeDuration; $._maximumHourlyChurn = settings.maximumHourlyChurn; $._rewardCalculator = settings.rewardCalculator; - $._tokenDecimals = tokenDecimals; } /** @@ -157,7 +155,7 @@ abstract contract StakingManager is uint256 lockedValue = _lock(value); // Ensure the stake churn doesn't exceed the maximum churn rate. - uint64 weight = _valueToWeight($, lockedValue); + uint64 weight = valueToWeightt(lockedValue); _checkAndUpdateChurnTracker(weight); // Ensure the weight is within the valid range. @@ -422,20 +420,14 @@ abstract contract StakingManager is $._churnTracker = churnTracker; } - function _lock(uint256 value) internal virtual returns (uint256); - function _unlock(uint256 value, address to) internal virtual; - - function _valueToWeight( - StakingManagerStorage storage $, - uint256 value - ) private view returns (uint64) { - return uint64(value / (10 ** $._tokenDecimals)); + function valueToWeightt(uint256 value) public pure returns (uint64) { + return uint64(value / 1e12); } - function _weightToValue( - StakingManagerStorage storage $, - uint64 weight - ) private view returns (uint256) { - return uint256(weight) * (10 ** $._tokenDecimals); + function weightToValuee(uint64 weight) public pure returns (uint256) { + return uint256(weight) * 1e12; } + + function _lock(uint256 value) internal virtual returns (uint256); + function _unlock(uint256 value, address to) internal virtual; } From 3718367598789d92c698e41d5181e6fc4a6b848a Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 7 Aug 2024 16:15:07 -0400 Subject: [PATCH 052/545] fix compilation and lints --- contracts/staking/ERC20TokenStakingManager.sol | 2 ++ contracts/staking/NativeTokenStakingManager.sol | 6 +++++- contracts/staking/StakingManager.sol | 2 +- contracts/staking/interfaces/IStakingManager.sol | 1 - 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 27a4d5448..f12785bc2 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -53,6 +53,7 @@ contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenS __ERC20TokenStakingManager_init(settings, token); } + // solhint-disable func-name-mixedcase function __ERC20TokenStakingManager_init( StakingManagerSettings calldata settings, IERC20 token @@ -61,6 +62,7 @@ contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenS __ERC20TokenStakingManager_init_unchained(token); } + // solhint-disable func-name-mixedcase function __ERC20TokenStakingManager_init_unchained(IERC20 token) internal onlyInitializing { ERC20TokenStakingManagerStorage storage $ = _getERC20StakingManagerStorage(); require(address(token) != address(0), "ERC20TokenStakingManager: zero token address"); diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 70f044826..f8ff628f9 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -18,18 +18,22 @@ contract NativeTokenStakingManager is Initializable, StakingManager, INativeToke _disableInitializers(); } + // solhint-disable ordering function initialize(StakingManagerSettings calldata settings) external initializer { __NativeTokenStakingManager_init(settings); } + // solhint-disable-next-line func-name-mixedcase function __NativeTokenStakingManager_init(StakingManagerSettings calldata settings) internal onlyInitializing { - __StakingManager_init(settings, 12); + __StakingManager_init(settings); } + // solhint-disable-next-line func-name-mixedcase, no-empty-blocks function __NativeTokenStakingManager_init_unchained() internal onlyInitializing {} + // solhint-enable ordering /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 48b795e4e..6a43d1478 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -322,7 +322,7 @@ abstract contract StakingManager is * @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. */ - // solhint-disable-next-line no-empty-blocks + // solhint-disable-next-line function resendEndValidatorMessage(bytes32 validationID) external { StakingManagerStorage storage $ = _getStakingManagerStorage(); Validator memory validator = $._validationPeriods[validationID]; diff --git a/contracts/staking/interfaces/IStakingManager.sol b/contracts/staking/interfaces/IStakingManager.sol index 66ca57a63..c235e9a4c 100644 --- a/contracts/staking/interfaces/IStakingManager.sol +++ b/contracts/staking/interfaces/IStakingManager.sol @@ -5,7 +5,6 @@ pragma solidity 0.8.25; -import {StakingMessages} from "../StakingMessages.sol"; import {IRewardCalculator} from "./IRewardCalculator.sol"; struct StakingManagerSettings { From d079ae91178eab306f2ec314146b9feec5a5ec11 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 8 Aug 2024 10:24:36 -0400 Subject: [PATCH 053/545] unit tests for ERC20TokenStakingManager --- .../staking/ERC20TokenStakingManager.sol | 7 +- contracts/staking/StakingManager.sol | 6 +- contracts/staking/StakingMessages.sol | 2 +- .../tests/ERC20TokenStakingManagerTests.t.sol | 60 ++++ .../NativeTokenStakingManagerTests.t.sol | 259 +---------------- .../staking/tests/StakingManagerTests.t.sol | 273 ++++++++++++++++++ 6 files changed, 350 insertions(+), 257 deletions(-) create mode 100644 contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index f12785bc2..9fe936db6 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -12,6 +12,7 @@ import {Initializable} from import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; import {SafeERC20TransferFrom} from "@utilities/SafeERC20TransferFrom.sol"; import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; +import {ICMInitializable} from "../utilities/ICMInitializable.sol"; contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenStakingManager { using SafeERC20 for IERC20; @@ -42,8 +43,10 @@ contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenS } } - constructor() { - _disableInitializers(); + constructor(ICMInitializable init) { + if (init == ICMInitializable.Disallowed) { + _disableInitializers(); + } } function initialize( diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 845a7f2ed..4636c0cc5 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -155,7 +155,7 @@ abstract contract StakingManager is uint256 lockedValue = _lock(value); // Ensure the stake churn doesn't exceed the maximum churn rate. - uint64 weight = valueToWeightt(lockedValue); + uint64 weight = valueToWeight(lockedValue); _checkAndUpdateChurnTracker(weight); // Ensure the weight is within the valid range. @@ -425,11 +425,11 @@ abstract contract StakingManager is $._churnTracker = churnTracker; } - function valueToWeightt(uint256 value) public pure returns (uint64) { + function valueToWeight(uint256 value) public pure returns (uint64) { return uint64(value / 1e12); } - function weightToValuee(uint64 weight) public pure returns (uint256) { + function weightToValue(uint64 weight) public pure returns (uint256) { return uint256(weight) * 1e12; } diff --git a/contracts/staking/StakingMessages.sol b/contracts/staking/StakingMessages.sol index d46cac2e9..d9072f205 100644 --- a/contracts/staking/StakingMessages.sol +++ b/contracts/staking/StakingMessages.sol @@ -48,7 +48,7 @@ library StakingMessages { * | 148 bytes | * +-----------+ * - * @param valiationInfo The information to pack into the message. + * @param validationInfo The information to pack into the message. * @return The validationID and the packed message. */ function packRegisterSubnetValidatorMessage(ValidationInfo memory validationInfo) diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol new file mode 100644 index 000000000..2c1e2de4e --- /dev/null +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -0,0 +1,60 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {StakingManagerTest} from "./StakingManagerTests.t.sol"; +import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; +import {StakingManagerSettings} from "../interfaces/IStakingManager.sol"; +import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {IWarpMessenger, WarpMessage} from "../StakingManager.sol"; +import {StakingMessages} from "../StakingMessages.sol"; +import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; +import {ExampleERC20} from "@mocks/ExampleERC20.sol"; +import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; +import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; + +// TODO: Remove this once all unit tests implemented +// solhint-disable no-empty-blocks +contract ERC20TokenStakingManagerTest is StakingManagerTest { + using SafeERC20 for IERC20; + + ERC20TokenStakingManager public app; + IERC20 public token; + + function setUp() public virtual { + // Construct the object under test + app = new ERC20TokenStakingManager(ICMInitializable.Allowed); + token = new ExampleERC20(); + app.initialize( + StakingManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, + rewardCalculator: IRewardCalculator(address(0)) + }), + token + ); + stakingManager = app; + } + + function _initializeValidatorRegistration( + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature, + uint256 stakeAmount + ) internal virtual override returns (bytes32) { + return + app.initializeValidatorRegistration(stakeAmount, nodeID, registrationExpiry, signature); + } + + function _beforeSend(uint256 value) internal override { + // ERC20 tokens need to be pre-approved + token.safeIncreaseAllowance(address(app), value); + } +} diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index b58b4f918..dd22c42b3 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -7,7 +7,7 @@ pragma solidity 0.8.25; import {StakingManagerTest} from "./StakingManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; -import {StakingManagerSettings, InitialStakerInfo} from "../interfaces/IStakingManager.sol"; +import {StakingManagerSettings} from "../interfaces/IStakingManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {IWarpMessenger, WarpMessage} from "../StakingManager.sol"; import {StakingMessages} from "../StakingMessages.sol"; @@ -29,269 +29,26 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, - initialStakers: new InitialStakerInfo[](0), rewardCalculator: IRewardCalculator(address(0)) }) ); stakingManager = app; } - function testInitializeValidatorRegistrationSuccess() public { - _setUpInitializeValidatorRegistration( - DEFAULT_NODE_ID, - DEFAULT_SUBNET_ID, - DEFAULT_WEIGHT, - DEFAULT_EXPIRY, - DEFAULT_ED25519_SIGNATURE - ); - } - - function testInitializeValidatorRegistrationExcessiveChurn() public { - // TODO: implement - } - function testInitializeValidatorRegistrationInsufficientStake() public { - // TODO: implement - } - function testInitializeValidatorRegistrationExcessiveStake() public { - // TODO: implement - } - function testInitializeValidatorRegistrationInsufficientDuration() public { - // TODO: implement - } - - // The following tests call functions that are implemented in StakingManager, but access state that's - // only set in NativeTokenStakingManager. Therefore we call them via the concrete type, rather than a - // reference to the abstract type. - function testResendRegisterValidatorMessage() public { - bytes32 validationID = _setUpInitializeValidatorRegistration( - DEFAULT_NODE_ID, - DEFAULT_SUBNET_ID, - DEFAULT_WEIGHT, - DEFAULT_EXPIRY, - DEFAULT_ED25519_SIGNATURE - ); - (, bytes memory registerSubnetValidatorMessage) = StakingMessages - .packRegisterSubnetValidatorMessage( - StakingMessages.ValidationInfo({ - subnetID: DEFAULT_SUBNET_ID, - nodeID: DEFAULT_NODE_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE - }) - ); - _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); - app.resendRegisterValidatorMessage(validationID); - } - - function testCompleteValidatorRegistration() public { - _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); - } - - function testInitializeEndValidation() public { - _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP - }); - } - - function testInitializeEndValidationWithUptimeProof() public { - // TODO: implement - } - - function testInitializeEndValidationExcessiveChurn() public { - // TODO: implement - } - - function testResendEndValidation() public { - bytes32 validationID = _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP - }); - bytes memory setValidatorWeightPayload = - StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); - _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - app.resendEndValidatorMessage(validationID); - } - - function testCompleteEndValidation() public { - bytes32 validationID = _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP - }); - - bytes memory subnetValidatorRegistrationMessage = - StakingMessages.packSubnetValidatorRegistrationMessage(validationID, false); - - _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); - - vm.expectEmit(true, true, true, true, address(app)); - emit ValidationPeriodEnded(validationID); - - app.completeEndValidation(0, false); - } - - function testCompleteEndValidationSetWeightMessageType() public { - bytes32 validationID = _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP - }); - - bytes memory setSubnetValidatorWeightMessage = - StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); - - _mockGetVerifiedWarpMessage(setSubnetValidatorWeightMessage, true); - - vm.expectEmit(true, true, true, true, address(app)); - emit ValidationPeriodEnded(validationID); - - app.completeEndValidation(0, true); - } - // Helpers - function _mockGetVerifiedWarpMessage(bytes memory expectedPayload, bool valid) internal { - vm.mockCall( - WARP_PRECOMPILE_ADDRESS, - abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), - abi.encode( - WarpMessage({ - sourceChainID: P_CHAIN_BLOCKCHAIN_ID, - originSenderAddress: address(0), - payload: expectedPayload - }), - valid - ) - ); - vm.expectCall( - WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) - ); - } - - function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { - vm.mockCall( - WARP_PRECOMPILE_ADDRESS, - abi.encode(IWarpMessenger.sendWarpMessage.selector), - abi.encode(expectedMessageID) - ); - vm.expectCall( - WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.sendWarpMessage, payload) - ); - } - - function _setUpInitializeValidatorRegistration( - bytes32 nodeID, - bytes32 subnetID, - uint64 weight, - uint64 registrationExpiry, - bytes memory signature - ) internal returns (bytes32 validationID) { - (validationID,) = StakingMessages.packValidationInfo( - StakingMessages.ValidationInfo({ - nodeID: nodeID, - subnetID: subnetID, - weight: weight, - registrationExpiry: registrationExpiry, - signature: signature - }) - ); - (, bytes memory registerSubnetValidatorMessage) = StakingMessages - .packRegisterSubnetValidatorMessage( - StakingMessages.ValidationInfo({ - subnetID: subnetID, - nodeID: nodeID, - weight: weight, - registrationExpiry: registrationExpiry, - signature: signature - }) - ); - vm.warp(DEFAULT_EXPIRY - 1); - _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); - vm.expectEmit(true, true, true, true, address(app)); - emit ValidationPeriodCreated( - validationID, DEFAULT_NODE_ID, bytes32(0), weight, DEFAULT_EXPIRY - ); - - app.initializeValidatorRegistration{value: app.weightToValue(weight)}( - nodeID, registrationExpiry, signature - ); - } - - function _setUpCompleteValidatorRegistration( + function _initializeValidatorRegistration( bytes32 nodeID, - bytes32 subnetID, - uint64 weight, uint64 registrationExpiry, bytes memory signature, - uint64 registrationTimestamp - ) internal returns (bytes32 validationID) { - validationID = _setUpInitializeValidatorRegistration( - nodeID, subnetID, weight, registrationExpiry, signature + uint256 stakeAmount + ) internal virtual override returns (bytes32) { + return app.initializeValidatorRegistration{value: stakeAmount}( + nodeID, registrationExpiry, signature ); - bytes memory subnetValidatorRegistrationMessage = - StakingMessages.packSubnetValidatorRegistrationMessage(validationID, true); - - _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); - - vm.warp(registrationTimestamp); - vm.expectEmit(true, true, true, true, address(app)); - emit ValidationPeriodRegistered(validationID, weight, registrationTimestamp); - - app.completeValidatorRegistration(0); } - function _setUpInitializeEndValidation( - bytes32 nodeID, - bytes32 subnetID, - uint64 weight, - uint64 registrationExpiry, - bytes memory signature, - uint64 registrationTimestamp, - uint64 completionTimestamp - ) internal returns (bytes32 validationID) { - validationID = _setUpCompleteValidatorRegistration({ - nodeID: nodeID, - subnetID: subnetID, - weight: weight, - registrationExpiry: registrationExpiry, - signature: signature, - registrationTimestamp: registrationTimestamp - }); - - vm.warp(completionTimestamp); - bytes memory setValidatorWeightPayload = - StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); - _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - vm.expectEmit(true, true, true, true, address(app)); - emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp, 0); - - app.initializeEndValidation(validationID, false, 0); + function _beforeSend(uint256 value) internal override { + // Native tokens no need pre approve } } // TODO: Remove this once all unit tests implemented diff --git a/contracts/staking/tests/StakingManagerTests.t.sol b/contracts/staking/tests/StakingManagerTests.t.sol index 910f63561..553df49cf 100644 --- a/contracts/staking/tests/StakingManagerTests.t.sol +++ b/contracts/staking/tests/StakingManagerTests.t.sol @@ -7,6 +7,8 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {StakingManager} from "../StakingManager.sol"; +import {StakingMessages} from "../StakingMessages.sol"; +import {IWarpMessenger, WarpMessage} from "../StakingManager.sol"; abstract contract StakingManagerTest is Test { bytes32 public constant P_CHAIN_BLOCKCHAIN_ID = @@ -53,6 +55,148 @@ abstract contract StakingManagerTest is Test { event ValidationPeriodEnded(bytes32 indexed validationID); + function testInitializeValidatorRegistrationSuccess() public { + _setUpInitializeValidatorRegistration( + DEFAULT_NODE_ID, + DEFAULT_SUBNET_ID, + DEFAULT_WEIGHT, + DEFAULT_EXPIRY, + DEFAULT_ED25519_SIGNATURE + ); + } + + function testInitializeValidatorRegistrationExcessiveChurn() public { + // TODO: implement + } + + function testInitializeValidatorRegistrationInsufficientStake() public { + // TODO: implement + } + + function testInitializeValidatorRegistrationExcessiveStake() public { + // TODO: implement + } + + function testInitializeValidatorRegistrationInsufficientDuration() public { + // TODO: implement + } + + // The following tests call functions that are implemented in StakingManager, but access state that's + // only set in NativeTokenStakingManager. Therefore we call them via the concrete type, rather than a + // reference to the abstract type. + function testResendRegisterValidatorMessage() public { + bytes32 validationID = _setUpInitializeValidatorRegistration( + DEFAULT_NODE_ID, + DEFAULT_SUBNET_ID, + DEFAULT_WEIGHT, + DEFAULT_EXPIRY, + DEFAULT_ED25519_SIGNATURE + ); + (, bytes memory registerSubnetValidatorMessage) = StakingMessages + .packRegisterSubnetValidatorMessage( + StakingMessages.ValidationInfo({ + subnetID: DEFAULT_SUBNET_ID, + nodeID: DEFAULT_NODE_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE + }) + ); + _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); + stakingManager.resendRegisterValidatorMessage(validationID); + } + + function testCompleteValidatorRegistration() public { + _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + } + + function testInitializeEndValidation() public { + _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + }); + } + + function testInitializeEndValidationWithUptimeProof() public { + // TODO: implement + } + + function testInitializeEndValidationExcessiveChurn() public { + // TODO: implement + } + + function testResendEndValidation() public { + bytes32 validationID = _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + }); + bytes memory setValidatorWeightPayload = + StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + stakingManager.resendEndValidatorMessage(validationID); + } + + function testCompleteEndValidation() public { + bytes32 validationID = _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + }); + + bytes memory subnetValidatorRegistrationMessage = + StakingMessages.packSubnetValidatorRegistrationMessage(validationID, false); + + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + + vm.expectEmit(true, true, true, true, address(stakingManager)); + emit ValidationPeriodEnded(validationID); + + stakingManager.completeEndValidation(0, false); + } + + function testCompleteEndValidationSetWeightMessageType() public { + bytes32 validationID = _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + signature: DEFAULT_ED25519_SIGNATURE, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + }); + + bytes memory setSubnetValidatorWeightMessage = + StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + + _mockGetVerifiedWarpMessage(setSubnetValidatorWeightMessage, true); + + vm.expectEmit(true, true, true, true, address(stakingManager)); + emit ValidationPeriodEnded(validationID); + + stakingManager.completeEndValidation(0, true); + } + function testValueToWeight() public view { uint64 w1 = stakingManager.valueToWeight(1e12); uint64 w2 = stakingManager.valueToWeight(1e18); @@ -72,4 +216,133 @@ abstract contract StakingManagerTest is Test { assertEq(v2, 1e18); assertEq(v3, 1e27); } + + function _setUpInitializeValidatorRegistration( + bytes32 nodeID, + bytes32 subnetID, + uint64 weight, + uint64 registrationExpiry, + bytes memory signature + ) internal returns (bytes32 validationID) { + (validationID,) = StakingMessages.packValidationInfo( + StakingMessages.ValidationInfo({ + nodeID: nodeID, + subnetID: subnetID, + weight: weight, + registrationExpiry: registrationExpiry, + signature: signature + }) + ); + (, bytes memory registerSubnetValidatorMessage) = StakingMessages + .packRegisterSubnetValidatorMessage( + StakingMessages.ValidationInfo({ + subnetID: subnetID, + nodeID: nodeID, + weight: weight, + registrationExpiry: registrationExpiry, + signature: signature + }) + ); + vm.warp(DEFAULT_EXPIRY - 1); + _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); + + _beforeSend(stakingManager.weightToValue(weight)); + vm.expectEmit(true, true, true, true, address(stakingManager)); + emit ValidationPeriodCreated( + validationID, DEFAULT_NODE_ID, bytes32(0), weight, DEFAULT_EXPIRY + ); + + _initializeValidatorRegistration( + nodeID, registrationExpiry, signature, stakingManager.weightToValue(weight) + ); + } + + function _setUpCompleteValidatorRegistration( + bytes32 nodeID, + bytes32 subnetID, + uint64 weight, + uint64 registrationExpiry, + bytes memory signature, + uint64 registrationTimestamp + ) internal returns (bytes32 validationID) { + validationID = _setUpInitializeValidatorRegistration( + nodeID, subnetID, weight, registrationExpiry, signature + ); + bytes memory subnetValidatorRegistrationMessage = + StakingMessages.packSubnetValidatorRegistrationMessage(validationID, true); + + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + + vm.warp(registrationTimestamp); + vm.expectEmit(true, true, true, true, address(stakingManager)); + emit ValidationPeriodRegistered(validationID, weight, registrationTimestamp); + + stakingManager.completeValidatorRegistration(0); + } + + function _setUpInitializeEndValidation( + bytes32 nodeID, + bytes32 subnetID, + uint64 weight, + uint64 registrationExpiry, + bytes memory signature, + uint64 registrationTimestamp, + uint64 completionTimestamp + ) internal returns (bytes32 validationID) { + validationID = _setUpCompleteValidatorRegistration({ + nodeID: nodeID, + subnetID: subnetID, + weight: weight, + registrationExpiry: registrationExpiry, + signature: signature, + registrationTimestamp: registrationTimestamp + }); + + vm.warp(completionTimestamp); + bytes memory setValidatorWeightPayload = + StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + vm.expectEmit(true, true, true, true, address(stakingManager)); + emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp, 0); + + stakingManager.initializeEndValidation(validationID, false, 0); + } + + function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encode(IWarpMessenger.sendWarpMessage.selector), + abi.encode(expectedMessageID) + ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.sendWarpMessage, payload) + ); + } + + function _mockGetVerifiedWarpMessage(bytes memory expectedPayload, bool valid) internal { + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), + abi.encode( + WarpMessage({ + sourceChainID: P_CHAIN_BLOCKCHAIN_ID, + originSenderAddress: address(0), + payload: expectedPayload + }), + valid + ) + ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) + ); + } + + function _initializeValidatorRegistration( + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature, + uint256 stakeAmount + ) internal virtual returns (bytes32); + + function _beforeSend(uint256 value) internal virtual; } From ce41941b9a65864e9ba8b05f21b3e6220ea6c71c Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 8 Aug 2024 11:06:01 -0400 Subject: [PATCH 054/545] fix lints --- contracts/staking/NativeTokenStakingManager.sol | 2 +- contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol | 2 -- contracts/staking/tests/NativeTokenStakingManagerTests.t.sol | 2 -- contracts/staking/tests/StakingManagerTests.t.sol | 3 +++ 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index d2f6859ba..a57f2354d 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -36,7 +36,6 @@ contract NativeTokenStakingManager is Initializable, StakingManager, INativeToke // solhint-disable-next-line func-name-mixedcase, no-empty-blocks function __NativeTokenStakingManager_init_unchained() internal onlyInitializing {} - // solhint-enable ordering /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. @@ -56,6 +55,7 @@ contract NativeTokenStakingManager is Initializable, StakingManager, INativeToke ) external payable returns (bytes32) { return _initializeValidatorRegistration(nodeID, msg.value, registrationExpiry, signature); } + // solhint-enable ordering function _lock(uint256 value) internal virtual override returns (uint256) { return value; diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 2c1e2de4e..009f7b412 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -9,8 +9,6 @@ import {StakingManagerTest} from "./StakingManagerTests.t.sol"; import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; import {StakingManagerSettings} from "../interfaces/IStakingManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; -import {IWarpMessenger, WarpMessage} from "../StakingManager.sol"; -import {StakingMessages} from "../StakingMessages.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {ExampleERC20} from "@mocks/ExampleERC20.sol"; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index dd22c42b3..6fa9bda3d 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -9,8 +9,6 @@ import {StakingManagerTest} from "./StakingManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; import {StakingManagerSettings} from "../interfaces/IStakingManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; -import {IWarpMessenger, WarpMessage} from "../StakingManager.sol"; -import {StakingMessages} from "../StakingMessages.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; // TODO: Remove this once all unit tests implemented diff --git a/contracts/staking/tests/StakingManagerTests.t.sol b/contracts/staking/tests/StakingManagerTests.t.sol index 553df49cf..171fad73a 100644 --- a/contracts/staking/tests/StakingManagerTests.t.sol +++ b/contracts/staking/tests/StakingManagerTests.t.sol @@ -10,6 +10,8 @@ import {StakingManager} from "../StakingManager.sol"; import {StakingMessages} from "../StakingMessages.sol"; import {IWarpMessenger, WarpMessage} from "../StakingManager.sol"; +// TODO: Remove this once all unit tests implemented +// solhint-disable no-empty-blocks abstract contract StakingManagerTest is Test { bytes32 public constant P_CHAIN_BLOCKCHAIN_ID = bytes32(hex"0000000000000000000000000000000000000000000000000000000000000000"); @@ -346,3 +348,4 @@ abstract contract StakingManagerTest is Test { function _beforeSend(uint256 value) internal virtual; } +// solhint-enable no-empty-blocks From 9d1f56d658bb7a800dba091b0fd0c13626e58a81 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 9 Aug 2024 10:11:03 -0500 Subject: [PATCH 055/545] native staking manager abi --- .../NativeTokenStakingManager.go | 1214 +++++++++++++++++ scripts/abi_bindings.sh | 2 +- 2 files changed, 1215 insertions(+), 1 deletion(-) create mode 100644 abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go new file mode 100644 index 000000000..89dca2386 --- /dev/null +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -0,0 +1,1214 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package nativetokenstakingmanager + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// InitialStakerInfo is an auto generated low-level Go binding around an user-defined struct. +type InitialStakerInfo struct { + ValidationInfo StakingMessagesValidationInfo + Owner common.Address +} + +// StakingManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type StakingManagerSettings struct { + PChainBlockchainID [32]byte + SubnetID [32]byte + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + MinimumStakeDuration uint64 + MaximumHourlyChurn uint8 + InitialStakers []InitialStakerInfo + RewardCalculator common.Address +} + +// StakingMessagesValidationInfo is an auto generated low-level Go binding around an user-defined struct. +type StakingMessagesValidationInfo struct { + SubnetID [32]byte + NodeID [32]byte + Weight uint64 + RegistrationExpiry uint64 + Signature []byte +} + +// 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"initialStakers\",\"type\":\"tuple[]\",\"internalType\":\"structInitialStakerInfo[]\",\"components\":[{\"name\":\"validationInfo\",\"type\":\"tuple\",\"internalType\":\"structStakingMessages.ValidationInfo\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161302038038061302083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612ed38061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780631a0d36fe146100b45780632e2194d8146100d3578063620658561461010f57806376f786211461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad3660046125d3565b6101fd565b005b3480156100bf575f80fd5b506100b26100ce3660046125ea565b6103f3565b3480156100de575f80fd5b506100f26100ed3660046125d3565b6104ff565b6040516001600160401b0390911681526020015b60405180910390f35b34801561011a575f80fd5b5061012e610129366004612643565b610515565b604051908152602001610106565b348015610147575f80fd5b506100b261015636600461267c565b61052e565b348015610166575f80fd5b506100b26101753660046126b7565b610aae565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b039091168152602001610106565b3480156101b7575f80fd5b506100b26101c63660046125d3565b610d36565b61012e6101d9366004612762565b610e4a565b3480156101e9575f80fd5b506100b26101f83660046127f4565b610e5f565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612ea783398151915293929190829060ff16600581111561025e5761025e612829565b600581111561026f5761026f612829565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561030657610306612829565b1461036e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61037f848361010001515f611286565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ac90849060040161285f565b6020604051808303815f875af11580156103c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ec9190612891565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104375750825b90505f826001600160401b031660011480156104525750303b155b905081158015610460575080155b1561047e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104a857845460ff60401b1916600160401b1785555b6104b186611448565b83156104f757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f61050f64e8d4a51000836128d0565b92915050565b5f61050f6001600160401b03831664e8d4a510006128e3565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612ea783398151915293929190829060ff16600581111561058f5761058f612829565b60058111156105a0576105a0612829565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561063a5761063a612829565b146106935760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610365565b60c08101516001600160a01b0316336001600160a01b0316146106c85760405162461bcd60e51b8152600401610365906128fa565b6106d5816040015161146c565b60038152426001600160401b031660808201525f84156108ae576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610738573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261075f9190810190612963565b91509150806107805760405162461bcd60e51b815260040161036590612a35565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e79190612891565b8251146108065760405162461bcd60e51b815260040161036590612a79565b60208201516001600160a01b0316156108315760405162461bcd60e51b815260040161036590612ac0565b5f806108408460400151611650565b91509150818a146108a85760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610365565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff191660018360058111156108ee576108ee612829565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f906109df90889083611286565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90610a0e90859060040161285f565b6020604051808303815f875af1158015610a2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4e9190612891565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f5f80516020612ea78339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b09573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b309190810190612963565b9150915080610b515760405162461bcd60e51b815260040161036590612a35565b8254825114610b725760405162461bcd60e51b815260040161036590612a79565b60208201516001600160a01b031615610b9d5760405162461bcd60e51b815260040161036590612ac0565b5f80610bac84604001516117ab565b9150915080610c0c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610365565b5f82815260078601602052604081208054610c2690612b0d565b9050118015610c58575060015f83815260088701602052604090205460ff166005811115610c5657610c56612829565b145b610c745760405162461bcd60e51b815260040161036590612b45565b5f8281526007860160205260408120610c8c91612589565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020612ea7833981519152929190610d7e90612b0d565b9050118015610db0575060015f83815260088301602052604090205460ff166005811115610dae57610dae612829565b145b610dcc5760405162461bcd60e51b815260040161036590612b45565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e059190600401612b8a565b6020604051808303815f875af1158015610e21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e459190612891565b505050565b5f610e57843485856118cf565b949350505050565b5f5f80516020612ea78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610eba573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ee19190810190612963565b9150915080610f025760405162461bcd60e51b815260040161036590612a35565b5f8415610f7b575f610f178460400151611dd1565b919350909150506001600160401b03811615610f755760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610365565b50610fef565b5f610f8984604001516117ab565b90925090508015610fed5760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610365565b505b5f818152600885016020526040808220815161012081019092528054829060ff16600581111561102157611021612829565b600581111561103257611032612829565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110e35760405162461bcd60e51b8152600401610365906128fa565b5f6003825160058111156110f9576110f9612829565b1480611117575060028251600581111561111557611115612829565b145b1561113a57506020808201515f908152600987019091526040812055600461113e565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561116f5761116f612829565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603480825260608281019093525f91906020820181803683370190505090505f5b6004811015611307576112bf816003612c14565b6112ca9060086128e3565b600263ffffffff16901c60f81b8282815181106112e9576112e9612c27565b60200101906001600160f81b03191690815f1a9053506001016112ab565b505f5b60208110156113695761131e81601f612c14565b6113299060086128e3565b86901c60f81b8261133b836004612c3b565b8151811061134b5761134b612c27565b60200101906001600160f81b03191690815f1a90535060010161130a565b505f5b60088110156113d457611380816007612c14565b61138b9060086128e3565b6001600160401b038616901c60f81b826113a6836024612c3b565b815181106113b6576113b6612c27565b60200101906001600160f81b03191690815f1a90535060010161136c565b505f5b600881101561143f576113eb816007612c14565b6113f69060086128e3565b6001600160401b038516901c60f81b8261141183602c612c3b565b8151811061142157611421612c27565b60200101906001600160f81b03191690815f1a9053506001016113d7565b50949350505050565b611450611f8f565b611458611fda565b611460611fea565b61146981611ff2565b50565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f80516020612ea783398151915290600160e01b900460ff165f036114b1575050565b6005810180544290610e10906114c79083612c14565b106114fb5760018201805467ffffffffffffffff60401b1916600160401b6001600160401b03871602179055808255611546565b838260010160088282829054906101000a90046001600160401b03166115219190612c4e565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b60018201545f906001600160401b038082169161156d91600160401b909104166064612c75565b6115779190612ca0565b600485015490915060ff600160e01b909104811690821611156115f75760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610365565b5050805460058301556001018054600690920180546001600160401b0393841667ffffffffffffffff1982168117835592546001600160801b0319909116909217600160401b9283900490931690910291909117905550565b5f808251602c146116735760405162461bcd60e51b815260040161036590612cc5565b5f805b60048110156116c45761168a816003612c14565b6116959060086128e3565b63ffffffff168582815181106116ad576116ad612c27565b016020015160f81c901b9190911790600101611676565b5063ffffffff81166003146116eb5760405162461bcd60e51b815260040161036590612d0c565b5f805b60208110156117405761170281601f612c14565b61170d9060086128e3565b86611719836004612c3b565b8151811061172957611729612c27565b016020015160f81c901b91909117906001016116ee565b505f805b600881101561179f57611758816007612c14565b6117639060086128e3565b6001600160401b031687611778836024612c3b565b8151811061178857611788612c27565b016020015160f81c901b9190911790600101611744565b50909590945092505050565b5f8082516025146117ce5760405162461bcd60e51b815260040161036590612cc5565b5f805b600481101561181f576117e5816003612c14565b6117f09060086128e3565b63ffffffff1685828151811061180857611808612c27565b016020015160f81c901b91909117906001016117d1565b5063ffffffff81166001146118465760405162461bcd60e51b815260040161036590612d0c565b5f805b602081101561189b5761185d81601f612c14565b6118689060086128e3565b86611874836004612c3b565b8151811061188457611884612c27565b016020015160f81c901b9190911790600101611849565b505f856024815181106118b0576118b0612c27565b016020015191966001600160f81b031990921615159550909350505050565b5f6118d8612123565b5f80516020612ea7833981519152426001600160401b03851611801561191257506001600160401b038416611910426202a300612c3b565b115b6119725760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610365565b856119bf5760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610365565b5f86815260098201602052604090205415611a2b5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610365565b8251604014611a8d5760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20496e76616c6964207369676e617475726044820152670ca40d8cadccee8d60c31b6064820152608401610365565b845f611a98826104ff565b9050611aa38161146c565b8260020154816001600160401b031610158015611acd57508260030154816001600160401b031611155b611b255760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610365565b5f80611b6c6040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b031681526020018981525061216d565b5f82815260078801602052604090209193509150611b8a8282612d95565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611bb790859060040161285f565b6020604051808303815f875af1158015611bd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf79190612891565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611c7d57611c7d612829565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610e5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603414611df55760405162461bcd60e51b815260040161036590612cc5565b5f805b6004811015611e4657611e0c816003612c14565b611e179060086128e3565b63ffffffff16868281518110611e2f57611e2f612c27565b016020015160f81c901b9190911790600101611df8565b5063ffffffff8116600214611e6d5760405162461bcd60e51b815260040161036590612d0c565b5f805b6020811015611ec257611e8481601f612c14565b611e8f9060086128e3565b87611e9b836004612c3b565b81518110611eab57611eab612c27565b016020015160f81c901b9190911790600101611e70565b505f805b6008811015611f2157611eda816007612c14565b611ee59060086128e3565b6001600160401b031688611efa836024612c3b565b81518110611f0a57611f0a612c27565b016020015160f81c901b9190911790600101611ec6565b505f805b6008811015611f8057611f39816007612c14565b611f449060086128e3565b6001600160401b031689611f5983602c612c3b565b81518110611f6957611f69612c27565b016020015160f81c901b9190911790600101611f25565b50919790965090945092505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611fd857604051631afcd79f60e31b815260040160405180910390fd5b565b611fe2611f8f565b611fd861229b565b611fd8611f8f565b611ffa611f8f565b80355f80516020612ea783398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561209260a0830160808401612643565b60048201805467ffffffffffffffff19166001600160401b03929092169190911790556120c560c0830160a08401612e50565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556120f7610100830160e08401612e70565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161216757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60605f8061217b856122a3565b60408051609480825260c082019092529294509092505f91906020820181803683370190505090505f5b6004811015612201576121b9816003612c14565b6121c49060086128e3565b600163ffffffff16901c60f81b8282815181106121e3576121e3612c27565b60200101906001600160f81b03191690815f1a9053506001016121a5565b505f5b60908110156122685782818151811061221f5761221f612c27565b01602001516001600160f81b0319168261223a836004612c3b565b8151811061224a5761224a612c27565b60200101906001600160f81b03191690815f1a905350600101612204565b5091959194509092505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612275611f8f565b5f606082608001515160401461230d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610365565b60408051609080825260c082019092525f916020820181803683370190505090505f5b6020811015612380578451816020811061234c5761234c612c27565b1a60f81b82828151811061236257612362612c27565b60200101906001600160f81b03191690815f1a905350600101612330565b505f5b60208110156123e057846020015181602081106123a2576123a2612c27565b1a60f81b826123b2836020612c3b565b815181106123c2576123c2612c27565b60200101906001600160f81b03191690815f1a905350600101612383565b505f5b6008811015612454576123f7816007612c14565b6124029060086128e3565b60ff1685604001516001600160401b0316901c60f81b828260406124269190612c3b565b8151811061243657612436612c27565b60200101906001600160f81b03191690815f1a9053506001016123e3565b505f5b60088110156124c65761246b816007612c14565b6124769060086128e3565b60608601516001600160401b0390811691161c60f81b82612498836048612c3b565b815181106124a8576124a8612c27565b60200101906001600160f81b03191690815f1a905350600101612457565b505f5b604081101561253157846080015181815181106124e8576124e8612c27565b01602001516001600160f81b03191682612503836050612c3b565b8151811061251357612513612c27565b60200101906001600160f81b03191690815f1a9053506001016124c9565b506002816040516125429190612e8b565b602060405180830381855afa15801561255d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906125809190612891565b94909350915050565b50805461259590612b0d565b5f825580601f106125a4575050565b601f0160209004905f5260205f209081019061146991905b808211156125cf575f81556001016125bc565b5090565b5f602082840312156125e3575f80fd5b5035919050565b5f602082840312156125fa575f80fd5b81356001600160401b0381111561260f575f80fd5b82016101008185031215612621575f80fd5b9392505050565b80356001600160401b038116811461263e575f80fd5b919050565b5f60208284031215612653575f80fd5b61262182612628565b8015158114611469575f80fd5b803563ffffffff8116811461263e575f80fd5b5f805f6060848603121561268e575f80fd5b8335925060208401356126a08161265c565b91506126ae60408501612669565b90509250925092565b5f602082840312156126c7575f80fd5b61262182612669565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612706576127066126d0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612734576127346126d0565b604052919050565b5f6001600160401b03821115612754576127546126d0565b50601f01601f191660200190565b5f805f60608486031215612774575f80fd5b8335925061278460208501612628565b915060408401356001600160401b0381111561279e575f80fd5b8401601f810186136127ae575f80fd5b80356127c16127bc8261273c565b61270c565b8181528760208385010111156127d5575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612805575f80fd5b61280e83612669565b9150602083013561281e8161265c565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561285757818101518382015260200161283f565b50505f910152565b602081525f825180602084015261287d81604085016020870161283d565b601f01601f19169190910160400192915050565b5f602082840312156128a1575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826128de576128de6128a8565b500490565b808202811582820484141761050f5761050f6128bc565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b6001600160a01b0381168114611469575f80fd5b805161263e8161265c565b5f8060408385031215612974575f80fd5b82516001600160401b038082111561298a575f80fd5b908401906060828703121561299d575f80fd5b6129a56126e4565b825181526020808401516129b881612944565b828201526040840151838111156129cd575f80fd5b80850194505087601f8501126129e1575f80fd5b835192506129f16127bc8461273c565b8381528882858701011115612a04575f80fd5b612a138483830184880161283d565b80604084015250819550612a28818801612958565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612b2157607f821691505b602082108103612b3f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612b9c81612b0d565b806020870152604060018084165f8114612bbd5760018114612bd957612c06565b60ff19851660408a0152604084151560051b8a01019550612c06565b895f5260205f205f5b85811015612bfd5781548b8201860152908301908801612be2565b8a016040019650505b509398975050505050505050565b8181038181111561050f5761050f6128bc565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561050f5761050f6128bc565b6001600160401b03818116838216019080821115612c6e57612c6e6128bc565b5092915050565b6001600160401b03818116838216028082169190828114612c9857612c986128bc565b505092915050565b5f6001600160401b0380841680612cb957612cb96128a8565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e4557805f5260205f20601f840160051c81016020851015612d765750805b601f840160051c820191505b818110156103ec575f8155600101612d82565b81516001600160401b03811115612dae57612dae6126d0565b612dc281612dbc8454612b0d565b84612d51565b602080601f831160018114612df5575f8415612dde5750858301515b5f19600386901b1c1916600185901b1785556104f7565b5f85815260208120601f198616915b82811015612e2357888601518255948401946001909101908401612e04565b5085821015612e4057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612e60575f80fd5b813560ff81168114612621575f80fd5b5f60208284031215612e80575f80fd5b813561262181612944565b5f8251612e9c81846020870161283d565b919091019291505056feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", +} + +// NativeTokenStakingManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use NativeTokenStakingManagerMetaData.ABI instead. +var NativeTokenStakingManagerABI = NativeTokenStakingManagerMetaData.ABI + +// NativeTokenStakingManagerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use NativeTokenStakingManagerMetaData.Bin instead. +var NativeTokenStakingManagerBin = NativeTokenStakingManagerMetaData.Bin + +// DeployNativeTokenStakingManager deploys a new Ethereum contract, binding an instance of NativeTokenStakingManager to it. +func DeployNativeTokenStakingManager(auth *bind.TransactOpts, backend bind.ContractBackend, init uint8) (common.Address, *types.Transaction, *NativeTokenStakingManager, error) { + parsed, err := NativeTokenStakingManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(NativeTokenStakingManagerBin), backend, init) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &NativeTokenStakingManager{NativeTokenStakingManagerCaller: NativeTokenStakingManagerCaller{contract: contract}, NativeTokenStakingManagerTransactor: NativeTokenStakingManagerTransactor{contract: contract}, NativeTokenStakingManagerFilterer: NativeTokenStakingManagerFilterer{contract: contract}}, nil +} + +// NativeTokenStakingManager is an auto generated Go binding around an Ethereum contract. +type NativeTokenStakingManager struct { + NativeTokenStakingManagerCaller // Read-only binding to the contract + NativeTokenStakingManagerTransactor // Write-only binding to the contract + NativeTokenStakingManagerFilterer // Log filterer for contract events +} + +// NativeTokenStakingManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type NativeTokenStakingManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// NativeTokenStakingManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type NativeTokenStakingManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// NativeTokenStakingManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type NativeTokenStakingManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// NativeTokenStakingManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type NativeTokenStakingManagerSession struct { + Contract *NativeTokenStakingManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// NativeTokenStakingManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type NativeTokenStakingManagerCallerSession struct { + Contract *NativeTokenStakingManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// NativeTokenStakingManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type NativeTokenStakingManagerTransactorSession struct { + Contract *NativeTokenStakingManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// NativeTokenStakingManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type NativeTokenStakingManagerRaw struct { + Contract *NativeTokenStakingManager // Generic contract binding to access the raw methods on +} + +// NativeTokenStakingManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type NativeTokenStakingManagerCallerRaw struct { + Contract *NativeTokenStakingManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// NativeTokenStakingManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type NativeTokenStakingManagerTransactorRaw struct { + Contract *NativeTokenStakingManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewNativeTokenStakingManager creates a new instance of NativeTokenStakingManager, bound to a specific deployed contract. +func NewNativeTokenStakingManager(address common.Address, backend bind.ContractBackend) (*NativeTokenStakingManager, error) { + contract, err := bindNativeTokenStakingManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &NativeTokenStakingManager{NativeTokenStakingManagerCaller: NativeTokenStakingManagerCaller{contract: contract}, NativeTokenStakingManagerTransactor: NativeTokenStakingManagerTransactor{contract: contract}, NativeTokenStakingManagerFilterer: NativeTokenStakingManagerFilterer{contract: contract}}, nil +} + +// NewNativeTokenStakingManagerCaller creates a new read-only instance of NativeTokenStakingManager, bound to a specific deployed contract. +func NewNativeTokenStakingManagerCaller(address common.Address, caller bind.ContractCaller) (*NativeTokenStakingManagerCaller, error) { + contract, err := bindNativeTokenStakingManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerCaller{contract: contract}, nil +} + +// NewNativeTokenStakingManagerTransactor creates a new write-only instance of NativeTokenStakingManager, bound to a specific deployed contract. +func NewNativeTokenStakingManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*NativeTokenStakingManagerTransactor, error) { + contract, err := bindNativeTokenStakingManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerTransactor{contract: contract}, nil +} + +// NewNativeTokenStakingManagerFilterer creates a new log filterer instance of NativeTokenStakingManager, bound to a specific deployed contract. +func NewNativeTokenStakingManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*NativeTokenStakingManagerFilterer, error) { + contract, err := bindNativeTokenStakingManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerFilterer{contract: contract}, nil +} + +// bindNativeTokenStakingManager binds a generic wrapper to an already deployed contract. +func bindNativeTokenStakingManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := NativeTokenStakingManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_NativeTokenStakingManager *NativeTokenStakingManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _NativeTokenStakingManager.Contract.NativeTokenStakingManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_NativeTokenStakingManager *NativeTokenStakingManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.NativeTokenStakingManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_NativeTokenStakingManager *NativeTokenStakingManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.NativeTokenStakingManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _NativeTokenStakingManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.contract.Transact(opts, method, params...) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) WARPMESSENGER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "WARP_MESSENGER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) WARPMESSENGER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.WARPMESSENGER(&_NativeTokenStakingManager.CallOpts) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) WARPMESSENGER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.WARPMESSENGER(&_NativeTokenStakingManager.CallOpts) +} + +// ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. +// +// Solidity: function valueToWeight(uint256 value) pure 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) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. +// +// Solidity: function valueToWeight(uint256 value) pure 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) +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) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) WeightToValue(opts *bind.CallOpts, weight uint64) (*big.Int, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "weightToValue", weight) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// WeightToValue is a free data retrieval call binding the contract method 0x62065856. +// +// Solidity: function weightToValue(uint64 weight) pure 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) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) WeightToValue(weight uint64) (*big.Int, error) { + return _NativeTokenStakingManager.Contract.WeightToValue(&_NativeTokenStakingManager.CallOpts, weight) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// +// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeEndValidation", messageIndex, setWeightMessageType) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// +// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndValidation(messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndValidation(&_NativeTokenStakingManager.TransactOpts, messageIndex, setWeightMessageType) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// +// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndValidation(messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndValidation(&_NativeTokenStakingManager.TransactOpts, messageIndex, setWeightMessageType) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteValidatorRegistration(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeValidatorRegistration", messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) +} + +// Initialize is a paid mutator transaction binding the contract method 0x1a0d36fe. +// +// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,((bytes32,bytes32,uint64,uint64,bytes),address)[],address) settings) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) Initialize(opts *bind.TransactOpts, settings StakingManagerSettings) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initialize", settings) +} + +// Initialize is a paid mutator transaction binding the contract method 0x1a0d36fe. +// +// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,((bytes32,bytes32,uint64,uint64,bytes),address)[],address) settings) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) Initialize(settings StakingManagerSettings) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) +} + +// Initialize is a paid mutator transaction binding the contract method 0x1a0d36fe. +// +// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,((bytes32,bytes32,uint64,uint64,bytes),address)[],address) settings) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings StakingManagerSettings) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeEndValidation", validationID, includeUptimeProof, messageIndex) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xf40797d7. +// +// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes signature) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", nodeID, registrationExpiry, signature) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xf40797d7. +// +// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes signature) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, signature) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xf40797d7. +// +// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes signature) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, signature) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendEndValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "resendEndValidatorMessage", validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendEndValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendEndValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendRegisterValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "resendRegisterValidatorMessage", validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendRegisterValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendRegisterValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// NativeTokenStakingManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerInitializedIterator struct { + Event *NativeTokenStakingManagerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerInitialized represents a Initialized event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*NativeTokenStakingManagerInitializedIterator, error) { + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerInitialized) (event.Subscription, error) { + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerInitialized) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseInitialized(log types.Log) (*NativeTokenStakingManagerInitialized, error) { + event := new(NativeTokenStakingManagerInitialized) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationPeriodCreatedIterator struct { + Event *NativeTokenStakingManagerValidationPeriodCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerValidationPeriodCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerValidationPeriodCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerValidationPeriodCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationPeriodCreated struct { + ValidationID [32]byte + NodeID [32]byte + RegisterValidationMessageID [32]byte + Weight *big.Int + RegistrationExpiry uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (*NativeTokenStakingManagerValidationPeriodCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerValidationPeriodCreatedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerValidationPeriodCreated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*NativeTokenStakingManagerValidationPeriodCreated, error) { + event := new(NativeTokenStakingManagerValidationPeriodCreated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerValidationPeriodEndedIterator is returned from FilterValidationPeriodEnded and is used to iterate over the raw logs and unpacked data for ValidationPeriodEnded events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationPeriodEndedIterator struct { + Event *NativeTokenStakingManagerValidationPeriodEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerValidationPeriodEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerValidationPeriodEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerValidationPeriodEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationPeriodEnded struct { + ValidationID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte) (*NativeTokenStakingManagerValidationPeriodEndedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerValidationPeriodEndedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodEnded, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerValidationPeriodEnded) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*NativeTokenStakingManagerValidationPeriodEnded, error) { + event := new(NativeTokenStakingManagerValidationPeriodEnded) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerValidationPeriodRegisteredIterator is returned from FilterValidationPeriodRegistered and is used to iterate over the raw logs and unpacked data for ValidationPeriodRegistered events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationPeriodRegisteredIterator struct { + Event *NativeTokenStakingManagerValidationPeriodRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerValidationPeriodRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerValidationPeriodRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerValidationPeriodRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationPeriodRegistered struct { + ValidationID [32]byte + StakeAmount *big.Int + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*NativeTokenStakingManagerValidationPeriodRegisteredIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerValidationPeriodRegisteredIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerValidationPeriodRegistered) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*NativeTokenStakingManagerValidationPeriodRegistered, error) { + event := new(NativeTokenStakingManagerValidationPeriodRegistered) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidatorRemovalInitializedIterator struct { + Event *NativeTokenStakingManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerValidatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerValidatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerValidatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerValidatorRemovalInitialized represents a ValidatorRemovalInitialized event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidatorRemovalInitialized struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + StakeAmount *big.Int + EndTime *big.Int + Uptime uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, uint256 endTime, uint64 uptime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*NativeTokenStakingManagerValidatorRemovalInitializedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerValidatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, uint256 endTime, uint64 uptime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerValidatorRemovalInitialized) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, uint256 endTime, uint64 uptime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerValidatorRemovalInitialized, error) { + event := new(NativeTokenStakingManagerValidatorRemovalInitialized) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index 737b13eec..4c8cca62a 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -16,7 +16,7 @@ export ARCH=$(uname -m) [ $ARCH = x86_64 ] && ARCH=amd64 echo "ARCH set to $ARCH" -DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 TestMessenger ValidatorSetSig" +DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 TestMessenger ValidatorSetSig NativeTokenStakingManager" CONTRACT_LIST= HELP= From a49fce536e6e2c9d0c71552f9859fa7313efd4e9 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 9 Aug 2024 12:33:18 -0400 Subject: [PATCH 056/545] Add unit test --- contracts/staking/ExampleRewardCalculator.sol | 2 +- .../staking/interfaces/IRewardCalculator.sol | 4 +-- .../tests/ExamplesRewardCalculatorTests.t.sol | 35 +++++++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index ae9e23d8e..a99dcc306 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -21,7 +21,7 @@ contract ExampleRewardCalculator is IRewardCalculator { uint64 endTime, uint256, // initialSupply uint256, // endSupply - uint256 rewardBasisPoints + uint64 rewardBasisPoints ) external pure returns (uint256) { return stakeAmount * rewardBasisPoints * (endTime - startTime) / SECONDS_IN_YEAR / 1000; } diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol index 1f4a3ce9b..cf7fa6557 100644 --- a/contracts/staking/interfaces/IRewardCalculator.sol +++ b/contracts/staking/interfaces/IRewardCalculator.sol @@ -12,6 +12,6 @@ interface IRewardCalculator { uint64 endTime, uint256 initialSupply, uint256 endSupply, - uint256 rewardBasisPoints - ) external returns (uint256); + uint64 rewardBasisPoints + ) external pure returns (uint256); } diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol new file mode 100644 index 000000000..1429bc997 --- /dev/null +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -0,0 +1,35 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {Test} from "@forge-std/Test.sol"; +import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; + +contract ExampleRewardCalculatorTest is Test { + ExampleRewardCalculator public exampleRewardCalculator; + + uint256 public constant DEFAULT_STAKE_AMOUNT = 1e12; + uint64 public constant DEFAULT_START_TIME = 1000; + uint64 public constant DEFAULT_END_TIME = 31537000; // a year + 1000 seonds + uint64 public constant DEFAULT_REWARD_BASIS_POINTS = 42; + + function setUp() public { + exampleRewardCalculator = new ExampleRewardCalculator(); + } + + function testRewardCalculation() public view { + // solhint-disable-next-line func-named-parameters + uint256 output = exampleRewardCalculator.calculateReward( + DEFAULT_STAKE_AMOUNT, + DEFAULT_START_TIME, + DEFAULT_END_TIME, + 0, + 0, + DEFAULT_REWARD_BASIS_POINTS + ); + assertEq(output, 42e9); + } +} From bbe5124d419dd8768e35c37100c33ab6a9df20c5 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 9 Aug 2024 13:00:35 -0400 Subject: [PATCH 057/545] lint --- .../staking/tests/ExamplesRewardCalculatorTests.t.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol index 1429bc997..3b76371b6 100644 --- a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -23,11 +23,11 @@ contract ExampleRewardCalculatorTest is Test { function testRewardCalculation() public view { // solhint-disable-next-line func-named-parameters uint256 output = exampleRewardCalculator.calculateReward( - DEFAULT_STAKE_AMOUNT, - DEFAULT_START_TIME, - DEFAULT_END_TIME, - 0, - 0, + DEFAULT_STAKE_AMOUNT, + DEFAULT_START_TIME, + DEFAULT_END_TIME, + 0, + 0, DEFAULT_REWARD_BASIS_POINTS ); assertEq(output, 42e9); From 088810db036566196e05d167464a833ad79459ed Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 9 Aug 2024 13:06:13 -0500 Subject: [PATCH 058/545] grab commit from go mod --- scripts/versions.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/scripts/versions.sh b/scripts/versions.sh index e1b97e297..d3b6ff089 100755 --- a/scripts/versions.sh +++ b/scripts/versions.sh @@ -16,7 +16,7 @@ function getDepVersion() { grep -m1 "^\s*$1" $TELEPORTER_PATH/go.mod | cut -d ' ' -f2 } -extract_commit() { +function extract_commit() { local version=$1 if [[ $version == *-* ]]; then # Extract the substring after the last '-' @@ -29,9 +29,10 @@ extract_commit() { AWM_RELAYER_VERSION=${AWM_RELAYER_VERSION:-'v1.0.0'} # Don't export them as they're used in the context of other calls -AVALANCHEGO_VERSION=${AVALANCHEGO_VERSION:-$(getDepVersion github.com/ava-labs/avalanchego)} -GINKGO_VERSION=${GINKGO_VERSION:-$(getDepVersion github.com/onsi/ginkgo/v2)} -SUBNET_EVM_VERSION=${SUBNET_EVM_VERSION:-$(getDepVersion github.com/ava-labs/subnet-evm)} +AVALANCHEGO_VERSION=${AVALANCHEGO_VERSION:-$(extract_commit "$(getDepVersion github.com/ava-labs/avalanchego)")} +GINKGO_VERSION=${GINKGO_VERSION:-$(extract_commit "$(getDepVersion github.com/onsi/ginkgo/v2)")} +SUBNET_EVM_VERSION=${SUBNET_EVM_VERSION:-$(extract_commit "$(getDepVersion github.com/ava-labs/subnet-evm)")} + # Set golangci-lint version GOLANGCI_LINT_VERSION=${GOLANGCI_LINT_VERSION:-'v1.55'} From 17ae18f595ce5752f6b7925959f4471958bccbb1 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 9 Aug 2024 13:06:24 -0500 Subject: [PATCH 059/545] update deps --- go.mod | 6 +++--- go.sum | 14 ++++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 47defd6a5..62d99a002 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,12 @@ module github.com/ava-labs/teleporter go 1.21.13 require ( - github.com/ava-labs/avalanchego v1.11.10 + github.com/ava-labs/avalanchego v1.11.11-0.20240807224540-c7cf573a95ff github.com/supranational/blst v0.3.11 // indirect ) require ( - github.com/ava-labs/subnet-evm v0.6.8 + github.com/ava-labs/subnet-evm v0.6.9-0.20240809021034-3ceec5c96a5f github.com/ethereum/go-ethereum v1.13.8 github.com/onsi/ginkgo/v2 v2.19.1 github.com/onsi/gomega v1.34.1 @@ -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.7 // indirect + github.com/ava-labs/coreth v0.13.8-0.20240807212152-f7acfafec094 // 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 diff --git a/go.sum b/go.sum index bab5300d6..2338ac37d 100644 --- a/go.sum +++ b/go.sum @@ -56,12 +56,18 @@ 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.10 h1:QujciF5OEp5FwAoe/RciFF/i47rxU5rkEr6fVuUBS1Q= -github.com/ava-labs/avalanchego v1.11.10/go.mod h1:POgZPryqe80OeHCDNrXrPOKoFre736iFuMgmUBeKaLc= -github.com/ava-labs/coreth v0.13.7 h1:k8T9u/ROifl8f7oXjHRc1KvSISRl9txvy7gGVmHEz6g= -github.com/ava-labs/coreth v0.13.7/go.mod h1:tXDujonxXFOF6oK5HS2EmgtSXJK3Gy6RpZxb5WzR9rM= +github.com/ava-labs/avalanchego v1.11.11-0.20240807224540-c7cf573a95ff h1:Nz97kwcbf9DCQxVegBF+GZiUt9HqodeJHR9TtXw8rR8= +github.com/ava-labs/avalanchego v1.11.11-0.20240807224540-c7cf573a95ff/go.mod h1:9e0UPXJboybmgFjeTj+SFbK4ugbrdG4t68VdiUW5oQ8= +github.com/ava-labs/coreth v0.13.8-0.20240802110637-b3e5088d062d h1:klPTcKVvqfA2KSKaRvQAO56Pd4XAqGhwgMTQ6/W+w7w= +github.com/ava-labs/coreth v0.13.8-0.20240802110637-b3e5088d062d/go.mod h1:tXDujonxXFOF6oK5HS2EmgtSXJK3Gy6RpZxb5WzR9rM= +github.com/ava-labs/coreth v0.13.8-0.20240807212152-f7acfafec094 h1:e7TvIKDGzsMsKU3Y4HreRcK7f16EcEPUO04UwSCFtng= +github.com/ava-labs/coreth v0.13.8-0.20240807212152-f7acfafec094/go.mod h1:Ouul9dJouniUIJVX1gDqx8CrHyGvmwZkK28mrgKb/4I= github.com/ava-labs/subnet-evm v0.6.8 h1:IrHGajBYWs692YIYdd5J0oVWWt88Q/XAZQq/dOtkHFw= github.com/ava-labs/subnet-evm v0.6.8/go.mod h1:qt8DXyGm40CY9yffNOe1+4yUyL9mD3v5RPWqAuGj5u4= +github.com/ava-labs/subnet-evm v0.6.9-0.20240809021034-3ceec5c96a5f h1:moqjaNZ1RSXL2/yYUXvwSEpIWjmXcWxTORMBHWuwrtE= +github.com/ava-labs/subnet-evm v0.6.9-0.20240809021034-3ceec5c96a5f/go.mod h1:DM/HccJ8PghYk7fA3Cq76OOoVprOtyITICkjwuzEPfg= +github.com/ava-labs/subnet-evm v0.6.9-0.20240809152905-7387c7129d6f h1:uf7WgXJXOKbNuO7F5BzQ2VBFHbXCAHECinz1FxSXENY= +github.com/ava-labs/subnet-evm v0.6.9-0.20240809152905-7387c7129d6f/go.mod h1:BryiYmD6HWmugkSUpDdj/KyMi7ou5pJzPRNPMbMgpbA= 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= From 460a9434446f9f6b0962793c226e2893bd09eb03 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 9 Aug 2024 13:10:02 -0500 Subject: [PATCH 060/545] erc20 staking manager abi --- .../ERC20TokenStakingManager.go | 1198 +++++++++++++++++ .../NativeTokenStakingManager.go | 32 +- scripts/abi_bindings.sh | 2 +- 3 files changed, 1207 insertions(+), 25 deletions(-) create mode 100644 abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go new file mode 100644 index 000000000..eac8acbfe --- /dev/null +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -0,0 +1,1198 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package erc20tokenstakingmanager + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// StakingManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type StakingManagerSettings struct { + PChainBlockchainID [32]byte + SubnetID [32]byte + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + MinimumStakeDuration uint64 + MaximumHourlyChurn uint8 + RewardCalculator common.Address +} + +// 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516132dc3803806132dc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61318f8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f5780632e2194d8146100b45780635d0d7466146100e457806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612886565b61019d565b005b6100c76100c2366004612886565b610393565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26100f23660046128b1565b6103a9565b61010a610105366004612909565b6104b7565b6040519081526020016100db565b6100b2610126366004612949565b6104d0565b61010a610139366004612a16565b610a50565b6100b261014c366004612ab2565b610a68565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100db565b6100b2610185366004612886565b610cf5565b6100b2610198366004612acb565b610e09565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061316383398151915293929190829060ff1660058111156101fe576101fe612af5565b600581111561020f5761020f612af5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612af5565b1461030e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61031f848361010001515f611230565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034c908490600401612b2b565b6020604051808303815f875af1158015610368573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038c9190612b5d565b5050505050565b5f6103a364e8d4a5100083612b9c565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103ed5750825b90505f826001600160401b031660011480156104085750303b155b905081158015610416575080155b156104345760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045e57845460ff60401b1916600160401b1785555b61046887876113f2565b83156104ae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6103a36001600160401b03831664e8d4a51000612baf565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061316383398151915293929190829060ff16600581111561053157610531612af5565b600581111561054257610542612af5565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156105dc576105dc612af5565b146106355760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610305565b60c08101516001600160a01b0316336001600160a01b03161461066a5760405162461bcd60e51b815260040161030590612bc6565b6106778160400151611410565b60038152426001600160401b031660808201525f8415610850576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156106da573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107019190810190612c1b565b91509150806107225760405162461bcd60e51b815260040161030590612ced565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107899190612b5d565b8251146107a85760405162461bcd60e51b815260040161030590612d31565b60208201516001600160a01b0316156107d35760405162461bcd60e51b815260040161030590612d78565b5f806107e284604001516115bd565b91509150818a1461084a5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610305565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff1916600183600581111561089057610890612af5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f9061098190889083611230565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109b0908590600401612b2b565b6020604051808303815f875af11580156109cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f09190612b5d565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f610a5d84868585611718565b90505b949350505050565b5f5f805160206131638339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ac3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610aea9190810190612c1b565b9150915080610b0b5760405162461bcd60e51b815260040161030590612ced565b8254825114610b2c5760405162461bcd60e51b815260040161030590612d31565b60208201516001600160a01b031615610b575760405162461bcd60e51b815260040161030590612d78565b5f80610b668460400151611c25565b9150915080610bc65760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610305565b5f82815260078601602052604081208054610be090612dc5565b9050118015610c12575060015f83815260088701602052604090205460ff166005811115610c1057610c10612af5565b145b610c2e5760405162461bcd60e51b815260040161030590612dfd565b5f8281526007860160205260408120610c469161283c565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020613163833981519152929190610d3d90612dc5565b9050118015610d6f575060015f83815260088301602052604090205460ff166005811115610d6d57610d6d612af5565b145b610d8b5760405162461bcd60e51b815260040161030590612dfd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dc49190600401612e42565b6020604051808303815f875af1158015610de0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e049190612b5d565b505050565b5f5f805160206131638339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8b9190810190612c1b565b9150915080610eac5760405162461bcd60e51b815260040161030590612ced565b5f8415610f25575f610ec18460400151611d49565b919350909150506001600160401b03811615610f1f5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610305565b50610f99565b5f610f338460400151611c25565b90925090508015610f975760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610305565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115610fcb57610fcb612af5565b6005811115610fdc57610fdc612af5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b9092049093166101009092019190915282015191925016331461108d5760405162461bcd60e51b815260040161030590612bc6565b5f6003825160058111156110a3576110a3612af5565b14806110c157506002825160058111156110bf576110bf612af5565b145b156110e457506020808201515f90815260098701909152604081205560046110e8565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561111957611119612af5565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603480825260608281019093525f91906020820181803683370190505090505f5b60048110156112b157611269816003612ecc565b611274906008612baf565b600263ffffffff16901c60f81b82828151811061129357611293612edf565b60200101906001600160f81b03191690815f1a905350600101611255565b505f5b6020811015611313576112c881601f612ecc565b6112d3906008612baf565b86901c60f81b826112e5836004612ef3565b815181106112f5576112f5612edf565b60200101906001600160f81b03191690815f1a9053506001016112b4565b505f5b600881101561137e5761132a816007612ecc565b611335906008612baf565b6001600160401b038616901c60f81b82611350836024612ef3565b8151811061136057611360612edf565b60200101906001600160f81b03191690815f1a905350600101611316565b505f5b60088110156113e957611395816007612ecc565b6113a0906008612baf565b6001600160401b038516901c60f81b826113bb83602c612ef3565b815181106113cb576113cb612edf565b60200101906001600160f81b03191690815f1a905350600101611381565b50949350505050565b6113fa611f07565b61140382611f52565b61140c81611f76565b5050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f8051602061316383398151915290600160e01b900460ff165f03611455575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061149d9083612ecc565b106114b9576001600160401b03841660408301528082526114d8565b83826040018181516114cb9190612f06565b6001600160401b03169052505b5f8260200151836040015160646114ef9190612f2d565b6114f99190612f58565b600485015490915060ff600160e01b909104811690821611156115795760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610305565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602c146115e05760405162461bcd60e51b815260040161030590612f7d565b5f805b6004811015611631576115f7816003612ecc565b611602906008612baf565b63ffffffff1685828151811061161a5761161a612edf565b016020015160f81c901b91909117906001016115e3565b5063ffffffff81166003146116585760405162461bcd60e51b815260040161030590612fc4565b5f805b60208110156116ad5761166f81601f612ecc565b61167a906008612baf565b86611686836004612ef3565b8151811061169657611696612edf565b016020015160f81c901b919091179060010161165b565b505f805b600881101561170c576116c5816007612ecc565b6116d0906008612baf565b6001600160401b0316876116e5836024612ef3565b815181106116f5576116f5612edf565b016020015160f81c901b91909117906001016116b1565b50909590945092505050565b5f61172161202a565b5f80516020613163833981519152426001600160401b03851611801561175b57506001600160401b038416611759426202a300612ef3565b115b6117bb5760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610305565b856118085760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610305565b5f868152600982016020526040902054156118745760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610305565b82516040146118d65760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20496e76616c6964207369676e617475726044820152670ca40d8cadccee8d60c31b6064820152608401610305565b5f6118e086612074565b90505f6118ec82610393565b90506118f781611410565b8260020154816001600160401b03161015801561192157508260030154816001600160401b031611155b6119795760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610305565b5f806119c06040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b03168152602001898152506120aa565b5f828152600788016020526040902091935091506119de828261304d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611a0b908590600401612b2b565b6020604051808303815f875af1158015611a27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4b9190612b5d565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611ad157611ad1612af5565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610a6060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602514611c485760405162461bcd60e51b815260040161030590612f7d565b5f805b6004811015611c9957611c5f816003612ecc565b611c6a906008612baf565b63ffffffff16858281518110611c8257611c82612edf565b016020015160f81c901b9190911790600101611c4b565b5063ffffffff8116600114611cc05760405162461bcd60e51b815260040161030590612fc4565b5f805b6020811015611d1557611cd781601f612ecc565b611ce2906008612baf565b86611cee836004612ef3565b81518110611cfe57611cfe612edf565b016020015160f81c901b9190911790600101611cc3565b505f85602481518110611d2a57611d2a612edf565b016020015191966001600160f81b031990921615159550909350505050565b5f805f8351603414611d6d5760405162461bcd60e51b815260040161030590612f7d565b5f805b6004811015611dbe57611d84816003612ecc565b611d8f906008612baf565b63ffffffff16868281518110611da757611da7612edf565b016020015160f81c901b9190911790600101611d70565b5063ffffffff8116600214611de55760405162461bcd60e51b815260040161030590612fc4565b5f805b6020811015611e3a57611dfc81601f612ecc565b611e07906008612baf565b87611e13836004612ef3565b81518110611e2357611e23612edf565b016020015160f81c901b9190911790600101611de8565b505f805b6008811015611e9957611e52816007612ecc565b611e5d906008612baf565b6001600160401b031688611e72836024612ef3565b81518110611e8257611e82612edf565b016020015160f81c901b9190911790600101611e3e565b505f805b6008811015611ef857611eb1816007612ecc565b611ebc906008612baf565b6001600160401b031689611ed183602c612ef3565b81518110611ee157611ee1612edf565b016020015160f81c901b9190911790600101611e9d565b50919790965090945092505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611f5057604051631afcd79f60e31b815260040160405180910390fd5b565b611f5a611f07565b611f626121d8565b611f6a6121e8565b611f73816121f0565b50565b611f7e611f07565b7f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f916001600160a01b03821661200a5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610305565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161206e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6103a3827f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91546001600160a01b031690612320565b5f60605f806120b885612482565b60408051609480825260c082019092529294509092505f91906020820181803683370190505090505f5b600481101561213e576120f6816003612ecc565b612101906008612baf565b600163ffffffff16901c60f81b82828151811061212057612120612edf565b60200101906001600160f81b03191690815f1a9053506001016120e2565b505f5b60908110156121a55782818151811061215c5761215c612edf565b01602001516001600160f81b03191682612177836004612ef3565b8151811061218757612187612edf565b60200101906001600160f81b03191690815f1a905350600101612141565b5091959194509092505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6121e0611f07565b611f50612768565b611f50611f07565b6121f8611f07565b80355f8051602061316383398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561229060a0830160808401612909565b60048201805467ffffffffffffffff19166001600160401b03929092169190911790556122c360c0830160a0840161310c565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556122f460e0830160c0840161312c565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612366573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238a9190612b5d565b90506123a16001600160a01b038516333086612770565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156123e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124099190612b5d565b905081811161246f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610305565b6124798282612ecc565b95945050505050565b5f60608260800151516040146124ec5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610305565b60408051609080825260c082019092525f916020820181803683370190505090505f5b602081101561255f578451816020811061252b5761252b612edf565b1a60f81b82828151811061254157612541612edf565b60200101906001600160f81b03191690815f1a90535060010161250f565b505f5b60208110156125bf578460200151816020811061258157612581612edf565b1a60f81b82612591836020612ef3565b815181106125a1576125a1612edf565b60200101906001600160f81b03191690815f1a905350600101612562565b505f5b6008811015612633576125d6816007612ecc565b6125e1906008612baf565b60ff1685604001516001600160401b0316901c60f81b828260406126059190612ef3565b8151811061261557612615612edf565b60200101906001600160f81b03191690815f1a9053506001016125c2565b505f5b60088110156126a55761264a816007612ecc565b612655906008612baf565b60608601516001600160401b0390811691161c60f81b82612677836048612ef3565b8151811061268757612687612edf565b60200101906001600160f81b03191690815f1a905350600101612636565b505f5b604081101561271057846080015181815181106126c7576126c7612edf565b01602001516001600160f81b031916826126e2836050612ef3565b815181106126f2576126f2612edf565b60200101906001600160f81b03191690815f1a9053506001016126a8565b506002816040516127219190613147565b602060405180830381855afa15801561273c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061275f9190612b5d565b94909350915050565b6121b2611f07565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526127ca9085906127d0565b50505050565b5f8060205f8451602086015f885af1806127ef576040513d5f823e3d81fd5b50505f513d91508115612806578060011415612813565b6001600160a01b0384163b155b156127ca57604051635274afe760e01b81526001600160a01b0385166004820152602401610305565b50805461284890612dc5565b5f825580601f10612857575050565b601f0160209004905f5260205f2090810190611f7391905b80821115612882575f815560010161286f565b5090565b5f60208284031215612896575f80fd5b5035919050565b6001600160a01b0381168114611f73575f80fd5b5f808284036101008112156128c4575f80fd5b60e08112156128d1575f80fd5b5082915060e08301356128e38161289d565b809150509250929050565b80356001600160401b0381168114612904575f80fd5b919050565b5f60208284031215612919575f80fd5b612922826128ee565b9392505050565b8015158114611f73575f80fd5b803563ffffffff81168114612904575f80fd5b5f805f6060848603121561295b575f80fd5b83359250602084013561296d81612929565b915061297b60408501612936565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129ba576129ba612984565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129e8576129e8612984565b604052919050565b5f6001600160401b03821115612a0857612a08612984565b50601f01601f191660200190565b5f805f8060808587031215612a29575f80fd5b8435935060208501359250612a40604086016128ee565b915060608501356001600160401b03811115612a5a575f80fd5b8501601f81018713612a6a575f80fd5b8035612a7d612a78826129f0565b6129c0565b818152886020838501011115612a91575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612ac2575f80fd5b61292282612936565b5f8060408385031215612adc575f80fd5b612ae583612936565b915060208301356128e381612929565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612b23578181015183820152602001612b0b565b50505f910152565b602081525f8251806020840152612b49816040850160208701612b09565b601f01601f19169190910160400192915050565b5f60208284031215612b6d575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612baa57612baa612b74565b500490565b80820281158282048414176103a3576103a3612b88565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b805161290481612929565b5f8060408385031215612c2c575f80fd5b82516001600160401b0380821115612c42575f80fd5b9084019060608287031215612c55575f80fd5b612c5d612998565b82518152602080840151612c708161289d565b82820152604084015183811115612c85575f80fd5b80850194505087601f850112612c99575f80fd5b83519250612ca9612a78846129f0565b8381528882858701011115612cbc575f80fd5b612ccb84838301848801612b09565b80604084015250819550612ce0818801612c10565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612dd957607f821691505b602082108103612df757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612e5481612dc5565b806020870152604060018084165f8114612e755760018114612e9157612ebe565b60ff19851660408a0152604084151560051b8a01019550612ebe565b895f5260205f205f5b85811015612eb55781548b8201860152908301908801612e9a565b8a016040019650505b509398975050505050505050565b818103818111156103a3576103a3612b88565b634e487b7160e01b5f52603260045260245ffd5b808201808211156103a3576103a3612b88565b6001600160401b03818116838216019080821115612f2657612f26612b88565b5092915050565b6001600160401b03818116838216028082169190828114612f5057612f50612b88565b505092915050565b5f6001600160401b0380841680612f7157612f71612b74565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e0457805f5260205f20601f840160051c8101602085101561302e5750805b601f840160051c820191505b8181101561038c575f815560010161303a565b81516001600160401b0381111561306657613066612984565b61307a816130748454612dc5565b84613009565b602080601f8311600181146130ad575f84156130965750858301515b5f19600386901b1c1916600185901b178555613104565b5f85815260208120601f198616915b828110156130db578886015182559484019460019091019084016130bc565b50858210156130f857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561311c575f80fd5b813560ff81168114612922575f80fd5b5f6020828403121561313c575f80fd5b81356129228161289d565b5f8251613158818460208701612b09565b919091019291505056feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", +} + +// ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use ERC20TokenStakingManagerMetaData.ABI instead. +var ERC20TokenStakingManagerABI = ERC20TokenStakingManagerMetaData.ABI + +// ERC20TokenStakingManagerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ERC20TokenStakingManagerMetaData.Bin instead. +var ERC20TokenStakingManagerBin = ERC20TokenStakingManagerMetaData.Bin + +// DeployERC20TokenStakingManager deploys a new Ethereum contract, binding an instance of ERC20TokenStakingManager to it. +func DeployERC20TokenStakingManager(auth *bind.TransactOpts, backend bind.ContractBackend, init uint8) (common.Address, *types.Transaction, *ERC20TokenStakingManager, error) { + parsed, err := ERC20TokenStakingManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ERC20TokenStakingManagerBin), backend, init) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ERC20TokenStakingManager{ERC20TokenStakingManagerCaller: ERC20TokenStakingManagerCaller{contract: contract}, ERC20TokenStakingManagerTransactor: ERC20TokenStakingManagerTransactor{contract: contract}, ERC20TokenStakingManagerFilterer: ERC20TokenStakingManagerFilterer{contract: contract}}, nil +} + +// ERC20TokenStakingManager is an auto generated Go binding around an Ethereum contract. +type ERC20TokenStakingManager struct { + ERC20TokenStakingManagerCaller // Read-only binding to the contract + ERC20TokenStakingManagerTransactor // Write-only binding to the contract + ERC20TokenStakingManagerFilterer // Log filterer for contract events +} + +// ERC20TokenStakingManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type ERC20TokenStakingManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ERC20TokenStakingManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ERC20TokenStakingManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ERC20TokenStakingManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ERC20TokenStakingManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ERC20TokenStakingManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ERC20TokenStakingManagerSession struct { + Contract *ERC20TokenStakingManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ERC20TokenStakingManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ERC20TokenStakingManagerCallerSession struct { + Contract *ERC20TokenStakingManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ERC20TokenStakingManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ERC20TokenStakingManagerTransactorSession struct { + Contract *ERC20TokenStakingManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ERC20TokenStakingManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type ERC20TokenStakingManagerRaw struct { + Contract *ERC20TokenStakingManager // Generic contract binding to access the raw methods on +} + +// ERC20TokenStakingManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ERC20TokenStakingManagerCallerRaw struct { + Contract *ERC20TokenStakingManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// ERC20TokenStakingManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ERC20TokenStakingManagerTransactorRaw struct { + Contract *ERC20TokenStakingManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewERC20TokenStakingManager creates a new instance of ERC20TokenStakingManager, bound to a specific deployed contract. +func NewERC20TokenStakingManager(address common.Address, backend bind.ContractBackend) (*ERC20TokenStakingManager, error) { + contract, err := bindERC20TokenStakingManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManager{ERC20TokenStakingManagerCaller: ERC20TokenStakingManagerCaller{contract: contract}, ERC20TokenStakingManagerTransactor: ERC20TokenStakingManagerTransactor{contract: contract}, ERC20TokenStakingManagerFilterer: ERC20TokenStakingManagerFilterer{contract: contract}}, nil +} + +// NewERC20TokenStakingManagerCaller creates a new read-only instance of ERC20TokenStakingManager, bound to a specific deployed contract. +func NewERC20TokenStakingManagerCaller(address common.Address, caller bind.ContractCaller) (*ERC20TokenStakingManagerCaller, error) { + contract, err := bindERC20TokenStakingManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerCaller{contract: contract}, nil +} + +// NewERC20TokenStakingManagerTransactor creates a new write-only instance of ERC20TokenStakingManager, bound to a specific deployed contract. +func NewERC20TokenStakingManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*ERC20TokenStakingManagerTransactor, error) { + contract, err := bindERC20TokenStakingManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerTransactor{contract: contract}, nil +} + +// NewERC20TokenStakingManagerFilterer creates a new log filterer instance of ERC20TokenStakingManager, bound to a specific deployed contract. +func NewERC20TokenStakingManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*ERC20TokenStakingManagerFilterer, error) { + contract, err := bindERC20TokenStakingManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerFilterer{contract: contract}, nil +} + +// bindERC20TokenStakingManager binds a generic wrapper to an already deployed contract. +func bindERC20TokenStakingManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ERC20TokenStakingManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ERC20TokenStakingManager.Contract.ERC20TokenStakingManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ERC20TokenStakingManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ERC20TokenStakingManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ERC20TokenStakingManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.contract.Transact(opts, method, params...) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) WARPMESSENGER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "WARP_MESSENGER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) WARPMESSENGER() (common.Address, error) { + return _ERC20TokenStakingManager.Contract.WARPMESSENGER(&_ERC20TokenStakingManager.CallOpts) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WARPMESSENGER() (common.Address, error) { + return _ERC20TokenStakingManager.Contract.WARPMESSENGER(&_ERC20TokenStakingManager.CallOpts) +} + +// ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. +// +// Solidity: function valueToWeight(uint256 value) pure 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) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. +// +// Solidity: function valueToWeight(uint256 value) pure 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) +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) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) WeightToValue(opts *bind.CallOpts, weight uint64) (*big.Int, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "weightToValue", weight) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// WeightToValue is a free data retrieval call binding the contract method 0x62065856. +// +// Solidity: function weightToValue(uint64 weight) pure 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) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WeightToValue(weight uint64) (*big.Int, error) { + return _ERC20TokenStakingManager.Contract.WeightToValue(&_ERC20TokenStakingManager.CallOpts, weight) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// +// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndValidation", messageIndex, setWeightMessageType) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// +// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndValidation(messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndValidation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, setWeightMessageType) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// +// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndValidation(messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndValidation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, setWeightMessageType) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteValidatorRegistration(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeValidatorRegistration", messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) +} + +// Initialize is a paid mutator transaction binding the contract method 0x5d0d7466. +// +// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,address) settings, address token) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) Initialize(opts *bind.TransactOpts, settings StakingManagerSettings, token common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initialize", settings, token) +} + +// Initialize is a paid mutator transaction binding the contract method 0x5d0d7466. +// +// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,address) settings, address token) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) Initialize(settings StakingManagerSettings, token common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.Initialize(&_ERC20TokenStakingManager.TransactOpts, settings, token) +} + +// Initialize is a paid mutator transaction binding the contract method 0x5d0d7466. +// +// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,address) settings, address token) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Initialize(settings StakingManagerSettings, token common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.Initialize(&_ERC20TokenStakingManager.TransactOpts, settings, token) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeEndValidation", validationID, includeUptimeProof, messageIndex) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x872fda64. +// +// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes signature) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", stakeAmount, nodeID, registrationExpiry, signature) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x872fda64. +// +// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes signature) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, signature) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x872fda64. +// +// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes signature) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, signature) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendEndValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "resendEndValidatorMessage", validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendEndValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendEndValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendRegisterValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "resendRegisterValidatorMessage", validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendRegisterValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendRegisterValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + +// ERC20TokenStakingManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerInitializedIterator struct { + Event *ERC20TokenStakingManagerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerInitialized represents a Initialized event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*ERC20TokenStakingManagerInitializedIterator, error) { + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerInitialized) (event.Subscription, error) { + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerInitialized) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseInitialized(log types.Log) (*ERC20TokenStakingManagerInitialized, error) { + event := new(ERC20TokenStakingManagerInitialized) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationPeriodCreatedIterator struct { + Event *ERC20TokenStakingManagerValidationPeriodCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerValidationPeriodCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerValidationPeriodCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerValidationPeriodCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationPeriodCreated struct { + ValidationID [32]byte + NodeID [32]byte + RegisterValidationMessageID [32]byte + Weight *big.Int + RegistrationExpiry uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerValidationPeriodCreatedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerValidationPeriodCreated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*ERC20TokenStakingManagerValidationPeriodCreated, error) { + event := new(ERC20TokenStakingManagerValidationPeriodCreated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerValidationPeriodEndedIterator is returned from FilterValidationPeriodEnded and is used to iterate over the raw logs and unpacked data for ValidationPeriodEnded events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationPeriodEndedIterator struct { + Event *ERC20TokenStakingManagerValidationPeriodEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerValidationPeriodEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerValidationPeriodEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerValidationPeriodEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationPeriodEnded struct { + ValidationID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodEndedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerValidationPeriodEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodEnded, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerValidationPeriodEnded) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*ERC20TokenStakingManagerValidationPeriodEnded, error) { + event := new(ERC20TokenStakingManagerValidationPeriodEnded) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerValidationPeriodRegisteredIterator is returned from FilterValidationPeriodRegistered and is used to iterate over the raw logs and unpacked data for ValidationPeriodRegistered events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationPeriodRegisteredIterator struct { + Event *ERC20TokenStakingManagerValidationPeriodRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerValidationPeriodRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerValidationPeriodRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerValidationPeriodRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationPeriodRegistered struct { + ValidationID [32]byte + StakeAmount *big.Int + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodRegisteredIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerValidationPeriodRegisteredIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerValidationPeriodRegistered) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*ERC20TokenStakingManagerValidationPeriodRegistered, error) { + event := new(ERC20TokenStakingManagerValidationPeriodRegistered) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidatorRemovalInitializedIterator struct { + Event *ERC20TokenStakingManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerValidatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerValidatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerValidatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerValidatorRemovalInitialized represents a ValidatorRemovalInitialized event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidatorRemovalInitialized struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + StakeAmount *big.Int + EndTime *big.Int + Uptime uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, uint256 endTime, uint64 uptime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*ERC20TokenStakingManagerValidatorRemovalInitializedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerValidatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, uint256 endTime, uint64 uptime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerValidatorRemovalInitialized) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, uint256 endTime, uint64 uptime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerValidatorRemovalInitialized, error) { + event := new(ERC20TokenStakingManagerValidatorRemovalInitialized) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 89dca2386..0a045fe68 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -29,12 +29,6 @@ var ( _ = abi.ConvertType ) -// InitialStakerInfo is an auto generated low-level Go binding around an user-defined struct. -type InitialStakerInfo struct { - ValidationInfo StakingMessagesValidationInfo - Owner common.Address -} - // StakingManagerSettings is an auto generated low-level Go binding around an user-defined struct. type StakingManagerSettings struct { PChainBlockchainID [32]byte @@ -43,23 +37,13 @@ type StakingManagerSettings struct { MaximumStakeAmount *big.Int MinimumStakeDuration uint64 MaximumHourlyChurn uint8 - InitialStakers []InitialStakerInfo RewardCalculator common.Address } -// StakingMessagesValidationInfo is an auto generated low-level Go binding around an user-defined struct. -type StakingMessagesValidationInfo struct { - SubnetID [32]byte - NodeID [32]byte - Weight uint64 - RegistrationExpiry uint64 - Signature []byte -} - // 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"initialStakers\",\"type\":\"tuple[]\",\"internalType\":\"structInitialStakerInfo[]\",\"components\":[{\"name\":\"validationInfo\",\"type\":\"tuple\",\"internalType\":\"structStakingMessages.ValidationInfo\",\"components\":[{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161302038038061302083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612ed38061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780631a0d36fe146100b45780632e2194d8146100d3578063620658561461010f57806376f786211461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad3660046125d3565b6101fd565b005b3480156100bf575f80fd5b506100b26100ce3660046125ea565b6103f3565b3480156100de575f80fd5b506100f26100ed3660046125d3565b6104ff565b6040516001600160401b0390911681526020015b60405180910390f35b34801561011a575f80fd5b5061012e610129366004612643565b610515565b604051908152602001610106565b348015610147575f80fd5b506100b261015636600461267c565b61052e565b348015610166575f80fd5b506100b26101753660046126b7565b610aae565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b039091168152602001610106565b3480156101b7575f80fd5b506100b26101c63660046125d3565b610d36565b61012e6101d9366004612762565b610e4a565b3480156101e9575f80fd5b506100b26101f83660046127f4565b610e5f565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612ea783398151915293929190829060ff16600581111561025e5761025e612829565b600581111561026f5761026f612829565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561030657610306612829565b1461036e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61037f848361010001515f611286565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ac90849060040161285f565b6020604051808303815f875af11580156103c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ec9190612891565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104375750825b90505f826001600160401b031660011480156104525750303b155b905081158015610460575080155b1561047e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104a857845460ff60401b1916600160401b1785555b6104b186611448565b83156104f757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f61050f64e8d4a51000836128d0565b92915050565b5f61050f6001600160401b03831664e8d4a510006128e3565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612ea783398151915293929190829060ff16600581111561058f5761058f612829565b60058111156105a0576105a0612829565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561063a5761063a612829565b146106935760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610365565b60c08101516001600160a01b0316336001600160a01b0316146106c85760405162461bcd60e51b8152600401610365906128fa565b6106d5816040015161146c565b60038152426001600160401b031660808201525f84156108ae576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610738573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261075f9190810190612963565b91509150806107805760405162461bcd60e51b815260040161036590612a35565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e79190612891565b8251146108065760405162461bcd60e51b815260040161036590612a79565b60208201516001600160a01b0316156108315760405162461bcd60e51b815260040161036590612ac0565b5f806108408460400151611650565b91509150818a146108a85760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610365565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff191660018360058111156108ee576108ee612829565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f906109df90889083611286565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90610a0e90859060040161285f565b6020604051808303815f875af1158015610a2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4e9190612891565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f5f80516020612ea78339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b09573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b309190810190612963565b9150915080610b515760405162461bcd60e51b815260040161036590612a35565b8254825114610b725760405162461bcd60e51b815260040161036590612a79565b60208201516001600160a01b031615610b9d5760405162461bcd60e51b815260040161036590612ac0565b5f80610bac84604001516117ab565b9150915080610c0c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610365565b5f82815260078601602052604081208054610c2690612b0d565b9050118015610c58575060015f83815260088701602052604090205460ff166005811115610c5657610c56612829565b145b610c745760405162461bcd60e51b815260040161036590612b45565b5f8281526007860160205260408120610c8c91612589565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020612ea7833981519152929190610d7e90612b0d565b9050118015610db0575060015f83815260088301602052604090205460ff166005811115610dae57610dae612829565b145b610dcc5760405162461bcd60e51b815260040161036590612b45565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e059190600401612b8a565b6020604051808303815f875af1158015610e21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e459190612891565b505050565b5f610e57843485856118cf565b949350505050565b5f5f80516020612ea78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610eba573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ee19190810190612963565b9150915080610f025760405162461bcd60e51b815260040161036590612a35565b5f8415610f7b575f610f178460400151611dd1565b919350909150506001600160401b03811615610f755760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610365565b50610fef565b5f610f8984604001516117ab565b90925090508015610fed5760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610365565b505b5f818152600885016020526040808220815161012081019092528054829060ff16600581111561102157611021612829565b600581111561103257611032612829565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110e35760405162461bcd60e51b8152600401610365906128fa565b5f6003825160058111156110f9576110f9612829565b1480611117575060028251600581111561111557611115612829565b145b1561113a57506020808201515f908152600987019091526040812055600461113e565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561116f5761116f612829565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603480825260608281019093525f91906020820181803683370190505090505f5b6004811015611307576112bf816003612c14565b6112ca9060086128e3565b600263ffffffff16901c60f81b8282815181106112e9576112e9612c27565b60200101906001600160f81b03191690815f1a9053506001016112ab565b505f5b60208110156113695761131e81601f612c14565b6113299060086128e3565b86901c60f81b8261133b836004612c3b565b8151811061134b5761134b612c27565b60200101906001600160f81b03191690815f1a90535060010161130a565b505f5b60088110156113d457611380816007612c14565b61138b9060086128e3565b6001600160401b038616901c60f81b826113a6836024612c3b565b815181106113b6576113b6612c27565b60200101906001600160f81b03191690815f1a90535060010161136c565b505f5b600881101561143f576113eb816007612c14565b6113f69060086128e3565b6001600160401b038516901c60f81b8261141183602c612c3b565b8151811061142157611421612c27565b60200101906001600160f81b03191690815f1a9053506001016113d7565b50949350505050565b611450611f8f565b611458611fda565b611460611fea565b61146981611ff2565b50565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f80516020612ea783398151915290600160e01b900460ff165f036114b1575050565b6005810180544290610e10906114c79083612c14565b106114fb5760018201805467ffffffffffffffff60401b1916600160401b6001600160401b03871602179055808255611546565b838260010160088282829054906101000a90046001600160401b03166115219190612c4e565b92506101000a8154816001600160401b0302191690836001600160401b031602179055505b60018201545f906001600160401b038082169161156d91600160401b909104166064612c75565b6115779190612ca0565b600485015490915060ff600160e01b909104811690821611156115f75760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610365565b5050805460058301556001018054600690920180546001600160401b0393841667ffffffffffffffff1982168117835592546001600160801b0319909116909217600160401b9283900490931690910291909117905550565b5f808251602c146116735760405162461bcd60e51b815260040161036590612cc5565b5f805b60048110156116c45761168a816003612c14565b6116959060086128e3565b63ffffffff168582815181106116ad576116ad612c27565b016020015160f81c901b9190911790600101611676565b5063ffffffff81166003146116eb5760405162461bcd60e51b815260040161036590612d0c565b5f805b60208110156117405761170281601f612c14565b61170d9060086128e3565b86611719836004612c3b565b8151811061172957611729612c27565b016020015160f81c901b91909117906001016116ee565b505f805b600881101561179f57611758816007612c14565b6117639060086128e3565b6001600160401b031687611778836024612c3b565b8151811061178857611788612c27565b016020015160f81c901b9190911790600101611744565b50909590945092505050565b5f8082516025146117ce5760405162461bcd60e51b815260040161036590612cc5565b5f805b600481101561181f576117e5816003612c14565b6117f09060086128e3565b63ffffffff1685828151811061180857611808612c27565b016020015160f81c901b91909117906001016117d1565b5063ffffffff81166001146118465760405162461bcd60e51b815260040161036590612d0c565b5f805b602081101561189b5761185d81601f612c14565b6118689060086128e3565b86611874836004612c3b565b8151811061188457611884612c27565b016020015160f81c901b9190911790600101611849565b505f856024815181106118b0576118b0612c27565b016020015191966001600160f81b031990921615159550909350505050565b5f6118d8612123565b5f80516020612ea7833981519152426001600160401b03851611801561191257506001600160401b038416611910426202a300612c3b565b115b6119725760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610365565b856119bf5760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610365565b5f86815260098201602052604090205415611a2b5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610365565b8251604014611a8d5760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20496e76616c6964207369676e617475726044820152670ca40d8cadccee8d60c31b6064820152608401610365565b845f611a98826104ff565b9050611aa38161146c565b8260020154816001600160401b031610158015611acd57508260030154816001600160401b031611155b611b255760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610365565b5f80611b6c6040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b031681526020018981525061216d565b5f82815260078801602052604090209193509150611b8a8282612d95565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611bb790859060040161285f565b6020604051808303815f875af1158015611bd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf79190612891565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611c7d57611c7d612829565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610e5760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603414611df55760405162461bcd60e51b815260040161036590612cc5565b5f805b6004811015611e4657611e0c816003612c14565b611e179060086128e3565b63ffffffff16868281518110611e2f57611e2f612c27565b016020015160f81c901b9190911790600101611df8565b5063ffffffff8116600214611e6d5760405162461bcd60e51b815260040161036590612d0c565b5f805b6020811015611ec257611e8481601f612c14565b611e8f9060086128e3565b87611e9b836004612c3b565b81518110611eab57611eab612c27565b016020015160f81c901b9190911790600101611e70565b505f805b6008811015611f2157611eda816007612c14565b611ee59060086128e3565b6001600160401b031688611efa836024612c3b565b81518110611f0a57611f0a612c27565b016020015160f81c901b9190911790600101611ec6565b505f805b6008811015611f8057611f39816007612c14565b611f449060086128e3565b6001600160401b031689611f5983602c612c3b565b81518110611f6957611f69612c27565b016020015160f81c901b9190911790600101611f25565b50919790965090945092505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611fd857604051631afcd79f60e31b815260040160405180910390fd5b565b611fe2611f8f565b611fd861229b565b611fd8611f8f565b611ffa611f8f565b80355f80516020612ea783398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561209260a0830160808401612643565b60048201805467ffffffffffffffff19166001600160401b03929092169190911790556120c560c0830160a08401612e50565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556120f7610100830160e08401612e70565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161216757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60605f8061217b856122a3565b60408051609480825260c082019092529294509092505f91906020820181803683370190505090505f5b6004811015612201576121b9816003612c14565b6121c49060086128e3565b600163ffffffff16901c60f81b8282815181106121e3576121e3612c27565b60200101906001600160f81b03191690815f1a9053506001016121a5565b505f5b60908110156122685782818151811061221f5761221f612c27565b01602001516001600160f81b0319168261223a836004612c3b565b8151811061224a5761224a612c27565b60200101906001600160f81b03191690815f1a905350600101612204565b5091959194509092505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612275611f8f565b5f606082608001515160401461230d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610365565b60408051609080825260c082019092525f916020820181803683370190505090505f5b6020811015612380578451816020811061234c5761234c612c27565b1a60f81b82828151811061236257612362612c27565b60200101906001600160f81b03191690815f1a905350600101612330565b505f5b60208110156123e057846020015181602081106123a2576123a2612c27565b1a60f81b826123b2836020612c3b565b815181106123c2576123c2612c27565b60200101906001600160f81b03191690815f1a905350600101612383565b505f5b6008811015612454576123f7816007612c14565b6124029060086128e3565b60ff1685604001516001600160401b0316901c60f81b828260406124269190612c3b565b8151811061243657612436612c27565b60200101906001600160f81b03191690815f1a9053506001016123e3565b505f5b60088110156124c65761246b816007612c14565b6124769060086128e3565b60608601516001600160401b0390811691161c60f81b82612498836048612c3b565b815181106124a8576124a8612c27565b60200101906001600160f81b03191690815f1a905350600101612457565b505f5b604081101561253157846080015181815181106124e8576124e8612c27565b01602001516001600160f81b03191682612503836050612c3b565b8151811061251357612513612c27565b60200101906001600160f81b03191690815f1a9053506001016124c9565b506002816040516125429190612e8b565b602060405180830381855afa15801561255d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906125809190612891565b94909350915050565b50805461259590612b0d565b5f825580601f106125a4575050565b601f0160209004905f5260205f209081019061146991905b808211156125cf575f81556001016125bc565b5090565b5f602082840312156125e3575f80fd5b5035919050565b5f602082840312156125fa575f80fd5b81356001600160401b0381111561260f575f80fd5b82016101008185031215612621575f80fd5b9392505050565b80356001600160401b038116811461263e575f80fd5b919050565b5f60208284031215612653575f80fd5b61262182612628565b8015158114611469575f80fd5b803563ffffffff8116811461263e575f80fd5b5f805f6060848603121561268e575f80fd5b8335925060208401356126a08161265c565b91506126ae60408501612669565b90509250925092565b5f602082840312156126c7575f80fd5b61262182612669565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612706576127066126d0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612734576127346126d0565b604052919050565b5f6001600160401b03821115612754576127546126d0565b50601f01601f191660200190565b5f805f60608486031215612774575f80fd5b8335925061278460208501612628565b915060408401356001600160401b0381111561279e575f80fd5b8401601f810186136127ae575f80fd5b80356127c16127bc8261273c565b61270c565b8181528760208385010111156127d5575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612805575f80fd5b61280e83612669565b9150602083013561281e8161265c565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561285757818101518382015260200161283f565b50505f910152565b602081525f825180602084015261287d81604085016020870161283d565b601f01601f19169190910160400192915050565b5f602082840312156128a1575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826128de576128de6128a8565b500490565b808202811582820484141761050f5761050f6128bc565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b6001600160a01b0381168114611469575f80fd5b805161263e8161265c565b5f8060408385031215612974575f80fd5b82516001600160401b038082111561298a575f80fd5b908401906060828703121561299d575f80fd5b6129a56126e4565b825181526020808401516129b881612944565b828201526040840151838111156129cd575f80fd5b80850194505087601f8501126129e1575f80fd5b835192506129f16127bc8461273c565b8381528882858701011115612a04575f80fd5b612a138483830184880161283d565b80604084015250819550612a28818801612958565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612b2157607f821691505b602082108103612b3f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612b9c81612b0d565b806020870152604060018084165f8114612bbd5760018114612bd957612c06565b60ff19851660408a0152604084151560051b8a01019550612c06565b895f5260205f205f5b85811015612bfd5781548b8201860152908301908801612be2565b8a016040019650505b509398975050505050505050565b8181038181111561050f5761050f6128bc565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561050f5761050f6128bc565b6001600160401b03818116838216019080821115612c6e57612c6e6128bc565b5092915050565b6001600160401b03818116838216028082169190828114612c9857612c986128bc565b505092915050565b5f6001600160401b0380841680612cb957612cb96128a8565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e4557805f5260205f20601f840160051c81016020851015612d765750805b601f840160051c820191505b818110156103ec575f8155600101612d82565b81516001600160401b03811115612dae57612dae6126d0565b612dc281612dbc8454612b0d565b84612d51565b602080601f831160018114612df5575f8415612dde5750858301515b5f19600386901b1c1916600185901b1785556104f7565b5f85815260208120601f198616915b82811015612e2357888601518255948401946001909101908401612e04565b5085821015612e4057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612e60575f80fd5b813560ff81168114612621575f80fd5b5f60208284031215612e80575f80fd5b813561262181612944565b5f8251612e9c81846020870161283d565b919091019291505056feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612fd7380380612fd783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612e8a8061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780632e2194d8146100b457806362065856146100f057806376f786211461011d57806379f54eb11461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad3660046125b1565b6101fd565b005b3480156100bf575f80fd5b506100d36100ce3660046125b1565b6103f3565b6040516001600160401b0390911681526020015b60405180910390f35b3480156100fb575f80fd5b5061010f61010a3660046125e3565b610409565b6040519081526020016100e7565b348015610128575f80fd5b506100b2610137366004612623565b610422565b348015610147575f80fd5b506100b261015636600461265e565b6109a2565b348015610166575f80fd5b506100b2610175366004612674565b610aae565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b0390911681526020016100e7565b3480156101b7575f80fd5b506100b26101c63660046125b1565b610d3b565b61010f6101d936600461271f565b610e4f565b3480156101e9575f80fd5b506100b26101f83660046127b1565b610e64565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612e5e83398151915293929190829060ff16600581111561025e5761025e6127e6565b600581111561026f5761026f6127e6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004166101009091015290915081516005811115610306576103066127e6565b1461036e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61037f848361010001515f61128b565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ac90849060040161281c565b6020604051808303815f875af11580156103c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ec919061284e565b5050505050565b5f61040364e8d4a510008361288d565b92915050565b5f6104036001600160401b03831664e8d4a510006128a0565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612e5e83398151915293929190829060ff166005811115610483576104836127e6565b6005811115610494576104946127e6565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561052e5761052e6127e6565b146105875760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610365565b60c08101516001600160a01b0316336001600160a01b0316146105bc5760405162461bcd60e51b8152600401610365906128b7565b6105c9816040015161144d565b60038152426001600160401b031660808201525f84156107a2576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561062c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106539190810190612920565b91509150806106745760405162461bcd60e51b8152600401610365906129f2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db919061284e565b8251146106fa5760405162461bcd60e51b815260040161036590612a36565b60208201516001600160a01b0316156107255760405162461bcd60e51b815260040161036590612a7d565b5f8061073484604001516115fa565b91509150818a1461079c5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610365565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff191660018360058111156107e2576107e26127e6565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f906108d39088908361128b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061090290859060040161281c565b6020604051808303815f875af115801561091e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610942919061284e565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156109e65750825b90505f826001600160401b03166001148015610a015750303b155b905081158015610a0f575080155b15610a2d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a5757845460ff60401b1916600160401b1785555b610a6086611755565b8315610aa657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f5f80516020612e5e8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b09573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b309190810190612920565b9150915080610b515760405162461bcd60e51b8152600401610365906129f2565b8254825114610b725760405162461bcd60e51b815260040161036590612a36565b60208201516001600160a01b031615610b9d5760405162461bcd60e51b815260040161036590612a7d565b5f80610bac8460400151611769565b9150915080610c0c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610365565b5f82815260078601602052604081208054610c2690612aca565b9050118015610c58575060015f83815260088701602052604090205460ff166005811115610c5657610c566127e6565b145b610c745760405162461bcd60e51b815260040161036590612afc565b5f8281526007860160205260408120610c8c91612567565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020612e5e833981519152929190610d8390612aca565b9050118015610db5575060015f83815260088301602052604090205460ff166005811115610db357610db36127e6565b145b610dd15760405162461bcd60e51b815260040161036590612afc565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e0a9190600401612b41565b6020604051808303815f875af1158015610e26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4a919061284e565b505050565b5f610e5c8434858561188d565b949350505050565b5f5f80516020612e5e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ebf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ee69190810190612920565b9150915080610f075760405162461bcd60e51b8152600401610365906129f2565b5f8415610f80575f610f1c8460400151611d8f565b919350909150506001600160401b03811615610f7a5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610365565b50610ff4565b5f610f8e8460400151611769565b90925090508015610ff25760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610365565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115611026576110266127e6565b6005811115611037576110376127e6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110e85760405162461bcd60e51b8152600401610365906128b7565b5f6003825160058111156110fe576110fe6127e6565b148061111c575060028251600581111561111a5761111a6127e6565b145b1561113f57506020808201515f9081526009870190915260408120556004611143565b5060055b5f83815260088701602052604090208251815484929190829060ff19166001836005811115611174576111746127e6565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603480825260608281019093525f91906020820181803683370190505090505f5b600481101561130c576112c4816003612bcb565b6112cf9060086128a0565b600263ffffffff16901c60f81b8282815181106112ee576112ee612bde565b60200101906001600160f81b03191690815f1a9053506001016112b0565b505f5b602081101561136e5761132381601f612bcb565b61132e9060086128a0565b86901c60f81b82611340836004612bf2565b8151811061135057611350612bde565b60200101906001600160f81b03191690815f1a90535060010161130f565b505f5b60088110156113d957611385816007612bcb565b6113909060086128a0565b6001600160401b038616901c60f81b826113ab836024612bf2565b815181106113bb576113bb612bde565b60200101906001600160f81b03191690815f1a905350600101611371565b505f5b6008811015611444576113f0816007612bcb565b6113fb9060086128a0565b6001600160401b038516901c60f81b8261141683602c612bf2565b8151811061142657611426612bde565b60200101906001600160f81b03191690815f1a9053506001016113dc565b50949350505050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f80516020612e5e83398151915290600160e01b900460ff165f03611492575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906114da9083612bcb565b106114f6576001600160401b0384166040830152808252611515565b83826040018181516115089190612c05565b6001600160401b03169052505b5f82602001518360400151606461152c9190612c2c565b6115369190612c57565b600485015490915060ff600160e01b909104811690821611156115b65760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610365565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602c1461161d5760405162461bcd60e51b815260040161036590612c7c565b5f805b600481101561166e57611634816003612bcb565b61163f9060086128a0565b63ffffffff1685828151811061165757611657612bde565b016020015160f81c901b9190911790600101611620565b5063ffffffff81166003146116955760405162461bcd60e51b815260040161036590612cc3565b5f805b60208110156116ea576116ac81601f612bcb565b6116b79060086128a0565b866116c3836004612bf2565b815181106116d3576116d3612bde565b016020015160f81c901b9190911790600101611698565b505f805b600881101561174957611702816007612bcb565b61170d9060086128a0565b6001600160401b031687611722836024612bf2565b8151811061173257611732612bde565b016020015160f81c901b91909117906001016116ee565b50909590945092505050565b61175d611f4d565b61176681611f98565b50565b5f80825160251461178c5760405162461bcd60e51b815260040161036590612c7c565b5f805b60048110156117dd576117a3816003612bcb565b6117ae9060086128a0565b63ffffffff168582815181106117c6576117c6612bde565b016020015160f81c901b919091179060010161178f565b5063ffffffff81166001146118045760405162461bcd60e51b815260040161036590612cc3565b5f805b60208110156118595761181b81601f612bcb565b6118269060086128a0565b86611832836004612bf2565b8151811061184257611842612bde565b016020015160f81c901b9190911790600101611807565b505f8560248151811061186e5761186e612bde565b016020015191966001600160f81b031990921615159550909350505050565b5f611896611fb9565b5f80516020612e5e833981519152426001600160401b0385161180156118d057506001600160401b0384166118ce426202a300612bf2565b115b6119305760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610365565b8561197d5760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610365565b5f868152600982016020526040902054156119e95760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610365565b8251604014611a4b5760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20496e76616c6964207369676e617475726044820152670ca40d8cadccee8d60c31b6064820152608401610365565b845f611a56826103f3565b9050611a618161144d565b8260020154816001600160401b031610158015611a8b57508260030154816001600160401b031611155b611ae35760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610365565b5f80611b2a6040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b0316815260200189815250612003565b5f82815260078801602052604090209193509150611b488282612d4c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b7590859060040161281c565b6020604051808303815f875af1158015611b91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb5919061284e565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611c3b57611c3b6127e6565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610e5c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603414611db35760405162461bcd60e51b815260040161036590612c7c565b5f805b6004811015611e0457611dca816003612bcb565b611dd59060086128a0565b63ffffffff16868281518110611ded57611ded612bde565b016020015160f81c901b9190911790600101611db6565b5063ffffffff8116600214611e2b5760405162461bcd60e51b815260040161036590612cc3565b5f805b6020811015611e8057611e4281601f612bcb565b611e4d9060086128a0565b87611e59836004612bf2565b81518110611e6957611e69612bde565b016020015160f81c901b9190911790600101611e2e565b505f805b6008811015611edf57611e98816007612bcb565b611ea39060086128a0565b6001600160401b031688611eb8836024612bf2565b81518110611ec857611ec8612bde565b016020015160f81c901b9190911790600101611e84565b505f805b6008811015611f3e57611ef7816007612bcb565b611f029060086128a0565b6001600160401b031689611f1783602c612bf2565b81518110611f2757611f27612bde565b016020015160f81c901b9190911790600101611ee3565b50919790965090945092505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611f9657604051631afcd79f60e31b815260040160405180910390fd5b565b611fa0611f4d565b611fa8612131565b611fb0612141565b61176681612149565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611ffd57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60605f8061201185612279565b60408051609480825260c082019092529294509092505f91906020820181803683370190505090505f5b60048110156120975761204f816003612bcb565b61205a9060086128a0565b600163ffffffff16901c60f81b82828151811061207957612079612bde565b60200101906001600160f81b03191690815f1a90535060010161203b565b505f5b60908110156120fe578281815181106120b5576120b5612bde565b01602001516001600160f81b031916826120d0836004612bf2565b815181106120e0576120e0612bde565b60200101906001600160f81b03191690815f1a90535060010161209a565b5091959194509092505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612139611f4d565b611f9661255f565b611f96611f4d565b612151611f4d565b80355f80516020612e5e83398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab603556121e960a08301608084016125e3565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561221c60c0830160a08401612e07565b60048201805460ff92909216600160e01b0260ff60e01b1990921691909117905561224d60e0830160c08401612e27565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b5f60608260800151516040146122e35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610365565b60408051609080825260c082019092525f916020820181803683370190505090505f5b6020811015612356578451816020811061232257612322612bde565b1a60f81b82828151811061233857612338612bde565b60200101906001600160f81b03191690815f1a905350600101612306565b505f5b60208110156123b6578460200151816020811061237857612378612bde565b1a60f81b82612388836020612bf2565b8151811061239857612398612bde565b60200101906001600160f81b03191690815f1a905350600101612359565b505f5b600881101561242a576123cd816007612bcb565b6123d89060086128a0565b60ff1685604001516001600160401b0316901c60f81b828260406123fc9190612bf2565b8151811061240c5761240c612bde565b60200101906001600160f81b03191690815f1a9053506001016123b9565b505f5b600881101561249c57612441816007612bcb565b61244c9060086128a0565b60608601516001600160401b0390811691161c60f81b8261246e836048612bf2565b8151811061247e5761247e612bde565b60200101906001600160f81b03191690815f1a90535060010161242d565b505f5b604081101561250757846080015181815181106124be576124be612bde565b01602001516001600160f81b031916826124d9836050612bf2565b815181106124e9576124e9612bde565b60200101906001600160f81b03191690815f1a90535060010161249f565b506002816040516125189190612e42565b602060405180830381855afa158015612533573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612556919061284e565b94909350915050565b61210b611f4d565b50805461257390612aca565b5f825580601f10612582575050565b601f0160209004905f5260205f209081019061176691905b808211156125ad575f815560010161259a565b5090565b5f602082840312156125c1575f80fd5b5035919050565b80356001600160401b03811681146125de575f80fd5b919050565b5f602082840312156125f3575f80fd5b6125fc826125c8565b9392505050565b8015158114611766575f80fd5b803563ffffffff811681146125de575f80fd5b5f805f60608486031215612635575f80fd5b83359250602084013561264781612603565b915061265560408501612610565b90509250925092565b5f60e0828403121561266e575f80fd5b50919050565b5f60208284031215612684575f80fd5b6125fc82612610565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156126c3576126c361268d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156126f1576126f161268d565b604052919050565b5f6001600160401b038211156127115761271161268d565b50601f01601f191660200190565b5f805f60608486031215612731575f80fd5b83359250612741602085016125c8565b915060408401356001600160401b0381111561275b575f80fd5b8401601f8101861361276b575f80fd5b803561277e612779826126f9565b6126c9565b818152876020838501011115612792575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f80604083850312156127c2575f80fd5b6127cb83612610565b915060208301356127db81612603565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156128145781810151838201526020016127fc565b50505f910152565b602081525f825180602084015261283a8160408501602087016127fa565b601f01601f19169190910160400192915050565b5f6020828403121561285e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261289b5761289b612865565b500490565b808202811582820484141761040357610403612879565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b6001600160a01b0381168114611766575f80fd5b80516125de81612603565b5f8060408385031215612931575f80fd5b82516001600160401b0380821115612947575f80fd5b908401906060828703121561295a575f80fd5b6129626126a1565b8251815260208084015161297581612901565b8282015260408401518381111561298a575f80fd5b80850194505087601f85011261299e575f80fd5b835192506129ae612779846126f9565b83815288828587010111156129c1575f80fd5b6129d0848383018488016127fa565b806040840152508195506129e5818801612915565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612ade57607f821691505b60208210810361266e57634e487b7160e01b5f52602260045260245ffd5b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612b5381612aca565b806020870152604060018084165f8114612b745760018114612b9057612bbd565b60ff19851660408a0152604084151560051b8a01019550612bbd565b895f5260205f205f5b85811015612bb45781548b8201860152908301908801612b99565b8a016040019650505b509398975050505050505050565b8181038181111561040357610403612879565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561040357610403612879565b6001600160401b03818116838216019080821115612c2557612c25612879565b5092915050565b6001600160401b03818116838216028082169190828114612c4f57612c4f612879565b505092915050565b5f6001600160401b0380841680612c7057612c70612865565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e4a57805f5260205f20601f840160051c81016020851015612d2d5750805b601f840160051c820191505b818110156103ec575f8155600101612d39565b81516001600160401b03811115612d6557612d6561268d565b612d7981612d738454612aca565b84612d08565b602080601f831160018114612dac575f8415612d955750858301515b5f19600386901b1c1916600185901b178555610aa6565b5f85815260208120601f198616915b82811015612dda57888601518255948401946001909101908401612dbb565b5085821015612df757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612e17575f80fd5b813560ff811681146125fc575f80fd5b5f60208284031215612e37575f80fd5b81356125fc81612901565b5f8251612e538184602087016127fa565b919091019291505056feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -364,23 +348,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x1a0d36fe. +// Initialize is a paid mutator transaction binding the contract method 0x79f54eb1. // -// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,((bytes32,bytes32,uint64,uint64,bytes),address)[],address) settings) returns() +// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) Initialize(opts *bind.TransactOpts, settings StakingManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.contract.Transact(opts, "initialize", settings) } -// Initialize is a paid mutator transaction binding the contract method 0x1a0d36fe. +// Initialize is a paid mutator transaction binding the contract method 0x79f54eb1. // -// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,((bytes32,bytes32,uint64,uint64,bytes),address)[],address) settings) returns() +// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) Initialize(settings StakingManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } -// Initialize is a paid mutator transaction binding the contract method 0x1a0d36fe. +// Initialize is a paid mutator transaction binding the contract method 0x79f54eb1. // -// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,((bytes32,bytes32,uint64,uint64,bytes),address)[],address) settings) returns() +// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings StakingManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index 4c8cca62a..4b2f09dce 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -16,7 +16,7 @@ export ARCH=$(uname -m) [ $ARCH = x86_64 ] && ARCH=amd64 echo "ARCH set to $ARCH" -DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 TestMessenger ValidatorSetSig NativeTokenStakingManager" +DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager" CONTRACT_LIST= HELP= From 5aa935a494d6c15430debe701e32f625056ad785 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 13 Aug 2024 09:57:29 -0400 Subject: [PATCH 061/545] poa staking manager and unit tests --- contracts/staking/PoAStakingManager.sol | 59 +++++++++++++++++++ .../interfaces/IERC20TokenStakingManager.sol | 2 +- .../interfaces/INativeTokenStakingManager.sol | 2 +- .../staking/interfaces/IPoAStakingManager.sol | 22 +++++++ .../staking/interfaces/IRewardCalculator.sol | 2 +- .../staking/interfaces/IStakingManager.sol | 2 +- .../tests/PoAStakingManagerTests.t.sol | 47 +++++++++++++++ 7 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 contracts/staking/PoAStakingManager.sol create mode 100644 contracts/staking/interfaces/IPoAStakingManager.sol create mode 100644 contracts/staking/tests/PoAStakingManagerTests.t.sol diff --git a/contracts/staking/PoAStakingManager.sol b/contracts/staking/PoAStakingManager.sol new file mode 100644 index 000000000..3a13661cb --- /dev/null +++ b/contracts/staking/PoAStakingManager.sol @@ -0,0 +1,59 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {IPoAStakingManager} from "./interfaces/IPoAStakingManager.sol"; +import {StakingManager} from "./StakingManager.sol"; +import {OwnableUpgradeable} from + "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; +import {ICMInitializable} from "../utilities/ICMInitializable.sol"; +import {StakingManager, StakingManagerSettings} from "./StakingManager.sol"; +import {Initializable} from + "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; + +contract PoAStakingManager is IPoAStakingManager, StakingManager, OwnableUpgradeable { + constructor(ICMInitializable init) { + if (init == ICMInitializable.Disallowed) { + _disableInitializers(); + } + } + + function initialize( + StakingManagerSettings calldata settings, + address initialOwner + ) external initializer { + __PoAStakingManager_init(settings, initialOwner); + } + + // solhint-disable func-name-mixedcase + function __PoAStakingManager_init( + StakingManagerSettings calldata settings, + address initialOwner + ) internal onlyInitializing { + __StakingManager_init(settings); + __Ownable_init(initialOwner); + __PoAStakingManager_init_unchained(); + } + + // solhint-disable func-name-mixedcase + function __PoAStakingManager_init_unchained() internal onlyInitializing {} + + function initializeValidatorRegistration( + uint256 stakeAmount, + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature + ) external override onlyOwner returns (bytes32 validationID) { + return _initializeValidatorRegistration(nodeID, stakeAmount, registrationExpiry, signature); + } + + // Must be guarded with reentrancy guard for safe transfer from + function _lock(uint256 value) internal virtual override returns (uint256) { + return value; + } + + function _unlock(uint256 value, address to) internal virtual override {} +} diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index d6f5179d2..807094e8e 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -1,4 +1,4 @@ -// (c) 2023, Ava Labs, Inc. All rights reserved. +// (c) 2024, Ava Labs, Inc. All rights reserved. // See the file LICENSE for licensing terms. // SPDX-License-Identifier: Ecosystem diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index 74d6f35f8..e823bc590 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -1,4 +1,4 @@ -// (c) 2023, Ava Labs, Inc. All rights reserved. +// (c) 2024, Ava Labs, Inc. All rights reserved. // See the file LICENSE for licensing terms. // SPDX-License-Identifier: Ecosystem diff --git a/contracts/staking/interfaces/IPoAStakingManager.sol b/contracts/staking/interfaces/IPoAStakingManager.sol new file mode 100644 index 000000000..627967039 --- /dev/null +++ b/contracts/staking/interfaces/IPoAStakingManager.sol @@ -0,0 +1,22 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {IStakingManager} from "./IStakingManager.sol"; + +interface IPoAStakingManager is IStakingManager { + /** + * @notice Begins the validator registration process. Locks the {stakeAmount} of the managers specified ERC20 token. + * @param nodeID The node ID of the validator being registered. + * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. + */ + function initializeValidatorRegistration( + uint256 stakeAmount, + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature + ) external returns (bytes32 validationID); +} diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol index a42038989..68d46ef85 100644 --- a/contracts/staking/interfaces/IRewardCalculator.sol +++ b/contracts/staking/interfaces/IRewardCalculator.sol @@ -1,4 +1,4 @@ -// (c) 2023, Ava Labs, Inc. All rights reserved. +// (c) 2024, Ava Labs, Inc. All rights reserved. // See the file LICENSE for licensing terms. // SPDX-License-Identifier: Ecosystem diff --git a/contracts/staking/interfaces/IStakingManager.sol b/contracts/staking/interfaces/IStakingManager.sol index c235e9a4c..05212d581 100644 --- a/contracts/staking/interfaces/IStakingManager.sol +++ b/contracts/staking/interfaces/IStakingManager.sol @@ -1,4 +1,4 @@ -// (c) 2023, Ava Labs, Inc. All rights reserved. +// (c) 2024, Ava Labs, Inc. All rights reserved. // See the file LICENSE for licensing terms. // SPDX-License-Identifier: Ecosystem diff --git a/contracts/staking/tests/PoAStakingManagerTests.t.sol b/contracts/staking/tests/PoAStakingManagerTests.t.sol new file mode 100644 index 000000000..f09564f3c --- /dev/null +++ b/contracts/staking/tests/PoAStakingManagerTests.t.sol @@ -0,0 +1,47 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {StakingManagerTest} from "./StakingManagerTests.t.sol"; +import {PoAStakingManager} from "../PoAStakingManager.sol"; +import {ICMInitializable} from "@utilities/ICMInitializable.sol"; +import {StakingManagerSettings} from "../interfaces/IStakingManager.sol"; +import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; + +contract PoAStakingManagerTest is StakingManagerTest { + PoAStakingManager public app; + + address public constant DEFAULT_OWNER = address(0x1); + + function setUp() public { + app = new PoAStakingManager(ICMInitializable.Allowed); + app.initialize( + StakingManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, + rewardCalculator: IRewardCalculator(address(0)) + }), + address(this) + ); + stakingManager = app; + } + + function _initializeValidatorRegistration( + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature, + uint256 stakeAmount + ) internal virtual override returns (bytes32) { + return + app.initializeValidatorRegistration(stakeAmount, nodeID, registrationExpiry, signature); + } + + function _beforeSend(uint256 value) internal virtual override {} +} From 3e4f7d3130f37bdca3163a08df8b0dc5b598f7fc Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 13 Aug 2024 13:59:56 -0400 Subject: [PATCH 062/545] readme --- contracts/staking/README.md | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/contracts/staking/README.md b/contracts/staking/README.md index e59490fe5..8a08eeb40 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -1,4 +1,4 @@ -## Staking Manager Contract +# Staking Manager Contract `StakingManager.sol` defines the staking contract used to manage subnet-only validators, as defined in [ACP-77](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets) @@ -7,6 +7,7 @@ _Disclaimer:_ The contracts in this directory are still under active development ## Usage The common case for adding or removing a validator from a Subnet's validator set follows these general steps: + 1. Inform the Staking Manager contract of the change. The Staking Manager contract will construct a Warp message attesting to the change in the validator set. 2. Deliver the Warp message containing the validator set change to the P-Chain. The P-Chain will construct a Warp message acknowledging the change to the validator set. 3. Deliver the Warp message containing the P-Chain acknowledgement back to the Staking Manager contract on the Subnet. The Staking Manager contract finalizes the validator set change. @@ -17,7 +18,6 @@ If the Subnet has no validators registered on the P-Chain, then it will not be a Once the Subnet has been recovered, the stake specified on the P-Chain must be locked in the Staking Contract before any further validator set changes may be made. This is done via the `provideInitialStake` method, and guarded by the `onlyWhenInitialStakeProvided` modifier. - ### Registering a Validator Validator registration is initiated with a call to `initializeValidatorRegistration` on the concrete Staking Manager contract. The Staking Manager contract constructs a [`RegisterSubnetValidatorMessage`](#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each validator registration request includes all of the information needed to identify the validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. @@ -51,6 +51,7 @@ Description: Used to register a Subnet validator on the P-Chain Signed by: Subnet Specification: + ``` +-----------+----------+-----------+ | typeID : uint32 | 4 bytes | @@ -67,7 +68,7 @@ Specification: +-----------+----------+-----------+ | 148 bytes | +-----------+ - + ``` ### `SubnetValidatorRegistrationMessage` @@ -77,6 +78,7 @@ Description: Used to confirm Subnet validator registration on the P-Chain Signed by: P-Chain Specification: + ``` +--------------+----------+----------+ | typeID : uint32 | 4 bytes | @@ -96,6 +98,7 @@ Description: Used to provide validator uptime to the Subnet to calculate staking Signed by: P-Chain Specification: + ``` +--------------+----------+----------+ | typeID : uint32 | 4 bytes | @@ -115,6 +118,7 @@ Description: Used to set a validator's stake weight on another chain Signed by: Subnet, P-Chain Specification: + ``` +-----------+----------+-----------+ | typeID : uint32 | 4 bytes | @@ -130,5 +134,15 @@ Specification: | signature : [64]byte | 64 bytes | +-----------+----------+-----------+ | 148 bytes | - +-----------+ -``` \ No newline at end of file + +-----------+ +``` + +## Types of Staking Managers + +### Proof of Authority + +The Proof of Authority (PoA) staking manager is ownable, and only allows the owner to modify changes to the validator set of the Subnet. Validators are given a weight by the owner, but do not accrue staking rewards. + +### Proof of Stake + +The Proof of Stake (PoS) staking manager allows any validator to register and exit the Subnet validator set. Validators are given a weight based on the amount of stake they provide, and accrue staking rewards based on their uptime. The staking rewards can be either native or erc20 tokens. From 733cdbac7408c0d0a2d5f63af70fd1328e2d843c Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 13 Aug 2024 14:05:37 -0400 Subject: [PATCH 063/545] remove extra line and add unit test --- contracts/staking/PoAStakingManager.sol | 1 - .../staking/tests/PoAStakingManagerTests.t.sol | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/contracts/staking/PoAStakingManager.sol b/contracts/staking/PoAStakingManager.sol index 3a13661cb..ddb14a0c4 100644 --- a/contracts/staking/PoAStakingManager.sol +++ b/contracts/staking/PoAStakingManager.sol @@ -50,7 +50,6 @@ contract PoAStakingManager is IPoAStakingManager, StakingManager, OwnableUpgrade return _initializeValidatorRegistration(nodeID, stakeAmount, registrationExpiry, signature); } - // Must be guarded with reentrancy guard for safe transfer from function _lock(uint256 value) internal virtual override returns (uint256) { return value; } diff --git a/contracts/staking/tests/PoAStakingManagerTests.t.sol b/contracts/staking/tests/PoAStakingManagerTests.t.sol index f09564f3c..051d261d8 100644 --- a/contracts/staking/tests/PoAStakingManagerTests.t.sol +++ b/contracts/staking/tests/PoAStakingManagerTests.t.sol @@ -10,6 +10,8 @@ import {PoAStakingManager} from "../PoAStakingManager.sol"; import {ICMInitializable} from "@utilities/ICMInitializable.sol"; import {StakingManagerSettings} from "../interfaces/IStakingManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {OwnableUpgradeable} from + "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; contract PoAStakingManagerTest is StakingManagerTest { PoAStakingManager public app; @@ -33,6 +35,18 @@ contract PoAStakingManagerTest is StakingManagerTest { stakingManager = app; } + function testInvalidOwnerRegistration() public { + vm.prank(vm.addr(1)); + vm.expectRevert( + abi.encodeWithSelector( + OwnableUpgradeable.OwnableUnauthorizedAccount.selector, vm.addr(1) + ) + ); + _initializeValidatorRegistration( + DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE, DEFAULT_WEIGHT + ); + } + function _initializeValidatorRegistration( bytes32 nodeID, uint64 registrationExpiry, From 93cd2556c9071a17bea7215e685236a3b02308e0 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 13 Aug 2024 13:09:36 -0500 Subject: [PATCH 064/545] wip --- go.mod | 25 ++-- go.sum | 57 ++++----- tests/flows/native_token_staking.go | 59 +++++++++ tests/local/e2e_test.go | 180 ++++++++++++++-------------- 4 files changed, 190 insertions(+), 131 deletions(-) create mode 100644 tests/flows/native_token_staking.go diff --git a/go.mod b/go.mod index 62d99a002..13ce2a9f8 100644 --- a/go.mod +++ b/go.mod @@ -8,11 +8,13 @@ require ( ) require ( + github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240812210713-0fc39ab2d471 github.com/ava-labs/subnet-evm v0.6.9-0.20240809021034-3ceec5c96a5f github.com/ethereum/go-ethereum v1.13.8 - github.com/onsi/ginkgo/v2 v2.19.1 + github.com/onsi/ginkgo/v2 v2.20.0 github.com/onsi/gomega v1.34.1 github.com/pkg/errors v0.9.1 + github.com/prometheus/client_golang v1.19.1 github.com/spf13/cobra v1.8.1 github.com/stretchr/testify v1.9.0 go.uber.org/zap v1.27.0 @@ -29,7 +31,7 @@ require ( github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect github.com/btcsuite/btcd/btcutil v1.1.3 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/pebble v0.0.0-20230928194634-aa077af62593 // indirect @@ -58,18 +60,17 @@ require ( github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect github.com/google/btree v1.1.2 // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect + github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 // indirect github.com/google/renameio/v2 v2.0.0 // indirect 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/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect github.com/hashicorp/hcl v1.0.0 // indirect @@ -87,7 +88,6 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -97,10 +97,9 @@ require ( github.com/pelletier/go-toml/v2 v2.0.8 // indirect github.com/pires/go-proxyproto v0.6.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.16.0 // indirect - github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.10.1 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.48.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/rs/cors v1.7.0 // indirect @@ -140,9 +139,9 @@ require ( golang.org/x/text v0.17.0 // indirect golang.org/x/time v0.3.0 // indirect gonum.org/v1/gonum v0.11.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect - google.golang.org/grpc v1.64.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect + google.golang.org/grpc v1.65.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect diff --git a/go.sum b/go.sum index 2338ac37d..e786b7f4e 100644 --- a/go.sum +++ b/go.sum @@ -58,16 +58,12 @@ 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-0.20240807224540-c7cf573a95ff h1:Nz97kwcbf9DCQxVegBF+GZiUt9HqodeJHR9TtXw8rR8= github.com/ava-labs/avalanchego v1.11.11-0.20240807224540-c7cf573a95ff/go.mod h1:9e0UPXJboybmgFjeTj+SFbK4ugbrdG4t68VdiUW5oQ8= -github.com/ava-labs/coreth v0.13.8-0.20240802110637-b3e5088d062d h1:klPTcKVvqfA2KSKaRvQAO56Pd4XAqGhwgMTQ6/W+w7w= -github.com/ava-labs/coreth v0.13.8-0.20240802110637-b3e5088d062d/go.mod h1:tXDujonxXFOF6oK5HS2EmgtSXJK3Gy6RpZxb5WzR9rM= +github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240812210713-0fc39ab2d471 h1:7tF/hjIeUqd7DTLWkQUG136gTWsJzT5s6wkUsZcTL0s= +github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240812210713-0fc39ab2d471/go.mod h1:j8G0O0up+nFIHIH6YjWjSlM5fGx9s/Fcp5SO9SZOEyY= github.com/ava-labs/coreth v0.13.8-0.20240807212152-f7acfafec094 h1:e7TvIKDGzsMsKU3Y4HreRcK7f16EcEPUO04UwSCFtng= github.com/ava-labs/coreth v0.13.8-0.20240807212152-f7acfafec094/go.mod h1:Ouul9dJouniUIJVX1gDqx8CrHyGvmwZkK28mrgKb/4I= -github.com/ava-labs/subnet-evm v0.6.8 h1:IrHGajBYWs692YIYdd5J0oVWWt88Q/XAZQq/dOtkHFw= -github.com/ava-labs/subnet-evm v0.6.8/go.mod h1:qt8DXyGm40CY9yffNOe1+4yUyL9mD3v5RPWqAuGj5u4= github.com/ava-labs/subnet-evm v0.6.9-0.20240809021034-3ceec5c96a5f h1:moqjaNZ1RSXL2/yYUXvwSEpIWjmXcWxTORMBHWuwrtE= github.com/ava-labs/subnet-evm v0.6.9-0.20240809021034-3ceec5c96a5f/go.mod h1:DM/HccJ8PghYk7fA3Cq76OOoVprOtyITICkjwuzEPfg= -github.com/ava-labs/subnet-evm v0.6.9-0.20240809152905-7387c7129d6f h1:uf7WgXJXOKbNuO7F5BzQ2VBFHbXCAHECinz1FxSXENY= -github.com/ava-labs/subnet-evm v0.6.9-0.20240809152905-7387c7129d6f/go.mod h1:BryiYmD6HWmugkSUpDdj/KyMi7ou5pJzPRNPMbMgpbA= 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= @@ -102,8 +98,9 @@ github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= @@ -236,8 +233,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= -github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= +github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -303,8 +300,8 @@ github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/renameio/v2 v2.0.0 h1:UifI23ZTGY8Tt29JbYFiuyIU3eX+RNFtUwefq9qAhxg= github.com/google/renameio/v2 v2.0.0/go.mod h1:BtmJXm5YlszgC+TD4HOEEUFgkJP3nLxehU6hfe7jRt4= @@ -325,8 +322,8 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U github.com/gorilla/websocket v1.4.2/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= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -420,8 +417,6 @@ github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -461,8 +456,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= -github.com/onsi/ginkgo/v2 v2.19.1 h1:QXgq3Z8Crl5EL1WBAC98A5sEBHARrAJNzAmMxzLcRF0= -github.com/onsi/ginkgo/v2 v2.19.1/go.mod h1:O3DtEWQkPa/F7fBMgmZQKKsluAy8pd3rEQdrjkPb9zA= +github.com/onsi/ginkgo/v2 v2.20.0 h1:PE84V2mHqoT1sglvHc8ZdQtPcwmvvt29WLEEO3xmdZw= +github.com/onsi/ginkgo/v2 v2.20.0/go.mod h1:lG9ey2Z29hR41WMVthyJBGUBcBhGOtoPF2VFMvBXFCI= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= @@ -485,15 +480,15 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= +github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4= -github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -968,10 +963,10 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237 h1:RFiFrvy37/mpSpdySBDrUdipW/dHwsRwh3J3+A9VgT4= -google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= +google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -990,8 +985,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.64.1 h1:LKtvyfbX3UGVPFcGqJ9ItpVWW6oN/2XqTxfAnwRRXiA= -google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go new file mode 100644 index 000000000..fe0ea0093 --- /dev/null +++ b/tests/flows/native_token_staking.go @@ -0,0 +1,59 @@ +package flows + +import ( + "github.com/ava-labs/avalanchego/message" + "github.com/ava-labs/avalanchego/utils/constants" + "github.com/ava-labs/avalanchego/utils/logging" + "github.com/ava-labs/awm-relayer/peers" + "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" + sigAggConfig "github.com/ava-labs/awm-relayer/signature-aggregator/config" + sigAggMetrics "github.com/ava-labs/awm-relayer/signature-aggregator/metrics" + "github.com/ava-labs/teleporter/tests/interfaces" + . "github.com/onsi/gomega" + "github.com/prometheus/client_golang/prometheus" +) + +func NativeTokenStakingManager(network interfaces.Network) { + // Get the subnets info + + // Create the signature aggregator + logger := logging.NoLog{} + cfg := sigAggConfig.Config{} + appRequestNetwork, err := peers.NewNetwork( + logging.Debug, + prometheus.DefaultRegisterer, + trackedSubnets, + &cfg, + ) + Expect(err).Should(BeNil()) + + messageCreator, err := message.NewCreator( + logger, + prometheus.DefaultRegisterer, + constants.DefaultNetworkCompressionType, + constants.DefaultNetworkMaximumInboundTimeout, + ) + signatureAggregator := aggregator.NewSignatureAggregator( + appRequestNetwork, + logger, + sigAggMetrics.NewSignatureAggregatorMetrics( + prometheus.DefaultRegisterer, + ), + messageCreator, + ) + + // Deploy the staking manager contract + + // Iniatiate validator registration + + // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Query P-Chain validators for the Warp message + + // Deliver the Warp message to the subnet + + // Check that the validator is registered in the staking contract + +} diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index 95d934855..35d021d12 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -22,6 +22,7 @@ const ( upgradabilityLabel = "upgradability" utilsLabel = "utils" validatorSetSigLabel = "ValidatorSetSig" + stakingManagerLabel = "StakingManager" ) var ( @@ -102,93 +103,98 @@ var _ = ginkgo.AfterSuite(func() { var _ = ginkgo.Describe("[Teleporter integration tests]", func() { // Teleporter tests - ginkgo.It("Send a message from Subnet A to Subnet B, and one from B to A", - ginkgo.Label(teleporterMessengerLabel), - func() { - flows.BasicSendReceive(LocalNetworkInstance) - }) - ginkgo.It("Deliver to the wrong chain", - ginkgo.Label(teleporterMessengerLabel), - func() { - flows.DeliverToWrongChain(LocalNetworkInstance) - }) - ginkgo.It("Deliver to non-existent contract", - ginkgo.Label(teleporterMessengerLabel), - func() { - flows.DeliverToNonExistentContract(LocalNetworkInstance) - }) - ginkgo.It("Retry successful execution", - ginkgo.Label(teleporterMessengerLabel), - func() { - flows.RetrySuccessfulExecution(LocalNetworkInstance) - }) - ginkgo.It("Unallowed relayer", - ginkgo.Label(teleporterMessengerLabel), - func() { - flows.UnallowedRelayer(LocalNetworkInstance) - }) - ginkgo.It("Relay message twice", - ginkgo.Label(teleporterMessengerLabel), - func() { - flows.RelayMessageTwice(LocalNetworkInstance) - }) - ginkgo.It("Add additional fee amount", - ginkgo.Label(teleporterMessengerLabel), - func() { - flows.AddFeeAmount(LocalNetworkInstance) - }) - ginkgo.It("Send specific receipts", - ginkgo.Label(teleporterMessengerLabel), - func() { - flows.SendSpecificReceipts(LocalNetworkInstance) - }) - ginkgo.It("Insufficient gas", - ginkgo.Label(teleporterMessengerLabel), - func() { - flows.InsufficientGas(LocalNetworkInstance) - }) - ginkgo.It("Resubmit altered message", - ginkgo.Label(teleporterMessengerLabel), - func() { - flows.ResubmitAlteredMessage(LocalNetworkInstance) - }) - ginkgo.It("Check upgrade access", - ginkgo.Label(upgradabilityLabel), - func() { - flows.CheckUpgradeAccess(LocalNetworkInstance) - }) - ginkgo.It("Pause and Unpause Teleporter", - ginkgo.Label(upgradabilityLabel), - func() { - flows.PauseTeleporter(LocalNetworkInstance) - }) - ginkgo.It("Calculate Teleporter message IDs", - ginkgo.Label(utilsLabel), - func() { - flows.CalculateMessageID(LocalNetworkInstance) - }) - - // The following tests require special behavior by the relayer, so we only run them on a local network - ginkgo.It("Relayer modifies message", - ginkgo.Label(teleporterMessengerLabel), - func() { - flows.RelayerModifiesMessage(LocalNetworkInstance) - }) - ginkgo.It("Teleporter registry", - ginkgo.Label(upgradabilityLabel), - func() { - flows.TeleporterRegistry(LocalNetworkInstance) - }) - ginkgo.It("Deliver ValidatorSetSig signed message", - ginkgo.Label(validatorSetSigLabel), - func() { - flows.ValidatorSetSig(LocalNetworkInstance) - }) - ginkgo.It("Validator churn", - ginkgo.Label(teleporterMessengerLabel), - func() { - flows.ValidatorChurn(LocalNetworkInstance) - }) + ginkgo.It("Native token staking manager", + ginkgo.Label(stakingManagerLabel), + func() { + flows.NativeTokenStakingManager(LocalNetworkInstance) + }) + // ginkgo.It("Send a message from Subnet A to Subnet B, and one from B to A", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // flows.BasicSendReceive(LocalNetworkInstance) + // }) + // ginkgo.It("Deliver to the wrong chain", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // flows.DeliverToWrongChain(LocalNetworkInstance) + // }) + // ginkgo.It("Deliver to non-existent contract", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // flows.DeliverToNonExistentContract(LocalNetworkInstance) + // }) + // ginkgo.It("Retry successful execution", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // flows.RetrySuccessfulExecution(LocalNetworkInstance) + // }) + // ginkgo.It("Unallowed relayer", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // flows.UnallowedRelayer(LocalNetworkInstance) + // }) + // ginkgo.It("Relay message twice", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // flows.RelayMessageTwice(LocalNetworkInstance) + // }) + // ginkgo.It("Add additional fee amount", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // flows.AddFeeAmount(LocalNetworkInstance) + // }) + // ginkgo.It("Send specific receipts", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // flows.SendSpecificReceipts(LocalNetworkInstance) + // }) + // ginkgo.It("Insufficient gas", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // flows.InsufficientGas(LocalNetworkInstance) + // }) + // ginkgo.It("Resubmit altered message", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // flows.ResubmitAlteredMessage(LocalNetworkInstance) + // }) + // ginkgo.It("Check upgrade access", + // ginkgo.Label(upgradabilityLabel), + // func() { + // flows.CheckUpgradeAccess(LocalNetworkInstance) + // }) + // ginkgo.It("Pause and Unpause Teleporter", + // ginkgo.Label(upgradabilityLabel), + // func() { + // flows.PauseTeleporter(LocalNetworkInstance) + // }) + // ginkgo.It("Calculate Teleporter message IDs", + // ginkgo.Label(utilsLabel), + // func() { + // flows.CalculateMessageID(LocalNetworkInstance) + // }) + + // // The following tests require special behavior by the relayer, so we only run them on a local network + // ginkgo.It("Relayer modifies message", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // flows.RelayerModifiesMessage(LocalNetworkInstance) + // }) + // ginkgo.It("Teleporter registry", + // ginkgo.Label(upgradabilityLabel), + // func() { + // flows.TeleporterRegistry(LocalNetworkInstance) + // }) + // ginkgo.It("Deliver ValidatorSetSig signed message", + // ginkgo.Label(validatorSetSigLabel), + // func() { + // flows.ValidatorSetSig(LocalNetworkInstance) + // }) + // ginkgo.It("Validator churn", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // flows.ValidatorChurn(LocalNetworkInstance) + // }) // Since the validator churn test modifies the network topology, we put it last for now. // It should not affect the other tests, but we get some errors if we run it before the other tests. // TODO: we should fix this so that the order of the tests does not matter. From b4360d16100f9e04d0331da3d4b103cf39f55004 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Aug 2024 12:31:46 -0400 Subject: [PATCH 065/545] Remove basis points from interface --- contracts/staking/ExampleRewardCalculator.sol | 13 ++++++++----- contracts/staking/interfaces/IRewardCalculator.sol | 5 ++--- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index a99dcc306..f6117dd2d 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -10,19 +10,22 @@ import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; contract ExampleRewardCalculator is IRewardCalculator { uint256 public constant SECONDS_IN_YEAR = 31536000; + uint64 public immutable rewardBasisPoints; + + constructor(uint64 rewardBasisPoints_) { + rewardBasisPoints = rewardBasisPoints_; + } + /** * @notice A linear, non-compounding reward calculation that rewards a set percentage of tokens per year. - * - * @param rewardBasisPoints annual reward percentage in basis points (units of 0.1%). */ function calculateReward( uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256, // initialSupply - uint256, // endSupply - uint64 rewardBasisPoints - ) external pure returns (uint256) { + uint256 // endSupply + ) external view returns (uint256) { return stakeAmount * rewardBasisPoints * (endTime - startTime) / SECONDS_IN_YEAR / 1000; } } diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol index cf7fa6557..8f25f9616 100644 --- a/contracts/staking/interfaces/IRewardCalculator.sol +++ b/contracts/staking/interfaces/IRewardCalculator.sol @@ -11,7 +11,6 @@ interface IRewardCalculator { uint64 startTime, uint64 endTime, uint256 initialSupply, - uint256 endSupply, - uint64 rewardBasisPoints - ) external pure returns (uint256); + uint256 endSupply + ) external view returns (uint256); } From 2ad692239a60ecff0c62548f0c345b12f8f9e5c3 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Aug 2024 12:40:03 -0400 Subject: [PATCH 066/545] Fix test --- contracts/staking/ExampleRewardCalculator.sol | 2 +- contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index f6117dd2d..4603d73f4 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -24,7 +24,7 @@ contract ExampleRewardCalculator is IRewardCalculator { uint64 startTime, uint64 endTime, uint256, // initialSupply - uint256 // endSupply + uint256 // endSupply ) external view returns (uint256) { return stakeAmount * rewardBasisPoints * (endTime - startTime) / SECONDS_IN_YEAR / 1000; } diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol index 3b76371b6..7a9844ad1 100644 --- a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -17,7 +17,7 @@ contract ExampleRewardCalculatorTest is Test { uint64 public constant DEFAULT_REWARD_BASIS_POINTS = 42; function setUp() public { - exampleRewardCalculator = new ExampleRewardCalculator(); + exampleRewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_BASIS_POINTS); } function testRewardCalculation() public view { @@ -27,8 +27,7 @@ contract ExampleRewardCalculatorTest is Test { DEFAULT_START_TIME, DEFAULT_END_TIME, 0, - 0, - DEFAULT_REWARD_BASIS_POINTS + 0 ); assertEq(output, 42e9); } From e65d554fe2f4cc945d8060b2432cc96d2d364158 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Aug 2024 12:53:50 -0400 Subject: [PATCH 067/545] lint --- contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol index 7a9844ad1..6dab18bea 100644 --- a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -23,11 +23,7 @@ contract ExampleRewardCalculatorTest is Test { function testRewardCalculation() public view { // solhint-disable-next-line func-named-parameters uint256 output = exampleRewardCalculator.calculateReward( - DEFAULT_STAKE_AMOUNT, - DEFAULT_START_TIME, - DEFAULT_END_TIME, - 0, - 0 + DEFAULT_STAKE_AMOUNT, DEFAULT_START_TIME, DEFAULT_END_TIME, 0, 0 ); assertEq(output, 42e9); } From f10e0834a0cc331fbb70ba59e0baafbf102a8506 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 14 Aug 2024 15:47:52 -0400 Subject: [PATCH 068/545] lint fixes --- contracts/staking/PoAStakingManager.sol | 9 +++++---- contracts/staking/tests/PoAStakingManagerTests.t.sol | 1 + 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/contracts/staking/PoAStakingManager.sol b/contracts/staking/PoAStakingManager.sol index ddb14a0c4..286033540 100644 --- a/contracts/staking/PoAStakingManager.sol +++ b/contracts/staking/PoAStakingManager.sol @@ -11,8 +11,6 @@ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; import {ICMInitializable} from "../utilities/ICMInitializable.sol"; import {StakingManager, StakingManagerSettings} from "./StakingManager.sol"; -import {Initializable} from - "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; contract PoAStakingManager is IPoAStakingManager, StakingManager, OwnableUpgradeable { constructor(ICMInitializable init) { @@ -28,7 +26,7 @@ contract PoAStakingManager is IPoAStakingManager, StakingManager, OwnableUpgrade __PoAStakingManager_init(settings, initialOwner); } - // solhint-disable func-name-mixedcase + // solhint-disable func-name-mixedcase, ordering function __PoAStakingManager_init( StakingManagerSettings calldata settings, address initialOwner @@ -38,8 +36,9 @@ contract PoAStakingManager is IPoAStakingManager, StakingManager, OwnableUpgrade __PoAStakingManager_init_unchained(); } - // solhint-disable func-name-mixedcase + // solhint-disable-next-line no-empty-blocks function __PoAStakingManager_init_unchained() internal onlyInitializing {} + // solhint-enable func-name-mixedcase function initializeValidatorRegistration( uint256 stakeAmount, @@ -49,10 +48,12 @@ contract PoAStakingManager is IPoAStakingManager, StakingManager, OwnableUpgrade ) external override onlyOwner returns (bytes32 validationID) { return _initializeValidatorRegistration(nodeID, stakeAmount, registrationExpiry, signature); } + // solhint-enable ordering function _lock(uint256 value) internal virtual override returns (uint256) { return value; } + // solhint-disable-next-line no-empty-blocks function _unlock(uint256 value, address to) internal virtual override {} } diff --git a/contracts/staking/tests/PoAStakingManagerTests.t.sol b/contracts/staking/tests/PoAStakingManagerTests.t.sol index 051d261d8..36278b5ef 100644 --- a/contracts/staking/tests/PoAStakingManagerTests.t.sol +++ b/contracts/staking/tests/PoAStakingManagerTests.t.sol @@ -57,5 +57,6 @@ contract PoAStakingManagerTest is StakingManagerTest { app.initializeValidatorRegistration(stakeAmount, nodeID, registrationExpiry, signature); } + // solhint-disable-next-line no-empty-blocks function _beforeSend(uint256 value) internal virtual override {} } From 3d21241b8f35f517ffb786d680f474451bee7c08 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 14 Aug 2024 14:51:20 -0500 Subject: [PATCH 069/545] passing --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/StakingManager.sol | 14 +- contracts/staking/StakingMessages.sol | 34 ++-- go.mod | 8 +- go.sum | 16 +- tests/flows/native_token_staking.go | 155 +++++++++++++++++- tests/local/network.go | 69 +++++--- tests/utils/utils.go | 21 +++ 9 files changed, 264 insertions(+), 57 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index eac8acbfe..61754be97 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -43,7 +43,7 @@ type StakingManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516132dc3803806132dc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61318f8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f5780632e2194d8146100b45780635d0d7466146100e457806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612886565b61019d565b005b6100c76100c2366004612886565b610393565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26100f23660046128b1565b6103a9565b61010a610105366004612909565b6104b7565b6040519081526020016100db565b6100b2610126366004612949565b6104d0565b61010a610139366004612a16565b610a50565b6100b261014c366004612ab2565b610a68565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100db565b6100b2610185366004612886565b610cf5565b6100b2610198366004612acb565b610e09565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061316383398151915293929190829060ff1660058111156101fe576101fe612af5565b600581111561020f5761020f612af5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612af5565b1461030e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61031f848361010001515f611230565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034c908490600401612b2b565b6020604051808303815f875af1158015610368573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038c9190612b5d565b5050505050565b5f6103a364e8d4a5100083612b9c565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103ed5750825b90505f826001600160401b031660011480156104085750303b155b905081158015610416575080155b156104345760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045e57845460ff60401b1916600160401b1785555b61046887876113f2565b83156104ae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6103a36001600160401b03831664e8d4a51000612baf565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061316383398151915293929190829060ff16600581111561053157610531612af5565b600581111561054257610542612af5565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156105dc576105dc612af5565b146106355760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610305565b60c08101516001600160a01b0316336001600160a01b03161461066a5760405162461bcd60e51b815260040161030590612bc6565b6106778160400151611410565b60038152426001600160401b031660808201525f8415610850576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156106da573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107019190810190612c1b565b91509150806107225760405162461bcd60e51b815260040161030590612ced565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107899190612b5d565b8251146107a85760405162461bcd60e51b815260040161030590612d31565b60208201516001600160a01b0316156107d35760405162461bcd60e51b815260040161030590612d78565b5f806107e284604001516115bd565b91509150818a1461084a5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610305565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff1916600183600581111561089057610890612af5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f9061098190889083611230565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109b0908590600401612b2b565b6020604051808303815f875af11580156109cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f09190612b5d565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f610a5d84868585611718565b90505b949350505050565b5f5f805160206131638339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ac3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610aea9190810190612c1b565b9150915080610b0b5760405162461bcd60e51b815260040161030590612ced565b8254825114610b2c5760405162461bcd60e51b815260040161030590612d31565b60208201516001600160a01b031615610b575760405162461bcd60e51b815260040161030590612d78565b5f80610b668460400151611c25565b9150915080610bc65760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610305565b5f82815260078601602052604081208054610be090612dc5565b9050118015610c12575060015f83815260088701602052604090205460ff166005811115610c1057610c10612af5565b145b610c2e5760405162461bcd60e51b815260040161030590612dfd565b5f8281526007860160205260408120610c469161283c565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020613163833981519152929190610d3d90612dc5565b9050118015610d6f575060015f83815260088301602052604090205460ff166005811115610d6d57610d6d612af5565b145b610d8b5760405162461bcd60e51b815260040161030590612dfd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dc49190600401612e42565b6020604051808303815f875af1158015610de0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e049190612b5d565b505050565b5f5f805160206131638339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8b9190810190612c1b565b9150915080610eac5760405162461bcd60e51b815260040161030590612ced565b5f8415610f25575f610ec18460400151611d49565b919350909150506001600160401b03811615610f1f5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610305565b50610f99565b5f610f338460400151611c25565b90925090508015610f975760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610305565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115610fcb57610fcb612af5565b6005811115610fdc57610fdc612af5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b9092049093166101009092019190915282015191925016331461108d5760405162461bcd60e51b815260040161030590612bc6565b5f6003825160058111156110a3576110a3612af5565b14806110c157506002825160058111156110bf576110bf612af5565b145b156110e457506020808201515f90815260098701909152604081205560046110e8565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561111957611119612af5565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603480825260608281019093525f91906020820181803683370190505090505f5b60048110156112b157611269816003612ecc565b611274906008612baf565b600263ffffffff16901c60f81b82828151811061129357611293612edf565b60200101906001600160f81b03191690815f1a905350600101611255565b505f5b6020811015611313576112c881601f612ecc565b6112d3906008612baf565b86901c60f81b826112e5836004612ef3565b815181106112f5576112f5612edf565b60200101906001600160f81b03191690815f1a9053506001016112b4565b505f5b600881101561137e5761132a816007612ecc565b611335906008612baf565b6001600160401b038616901c60f81b82611350836024612ef3565b8151811061136057611360612edf565b60200101906001600160f81b03191690815f1a905350600101611316565b505f5b60088110156113e957611395816007612ecc565b6113a0906008612baf565b6001600160401b038516901c60f81b826113bb83602c612ef3565b815181106113cb576113cb612edf565b60200101906001600160f81b03191690815f1a905350600101611381565b50949350505050565b6113fa611f07565b61140382611f52565b61140c81611f76565b5050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f8051602061316383398151915290600160e01b900460ff165f03611455575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061149d9083612ecc565b106114b9576001600160401b03841660408301528082526114d8565b83826040018181516114cb9190612f06565b6001600160401b03169052505b5f8260200151836040015160646114ef9190612f2d565b6114f99190612f58565b600485015490915060ff600160e01b909104811690821611156115795760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610305565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602c146115e05760405162461bcd60e51b815260040161030590612f7d565b5f805b6004811015611631576115f7816003612ecc565b611602906008612baf565b63ffffffff1685828151811061161a5761161a612edf565b016020015160f81c901b91909117906001016115e3565b5063ffffffff81166003146116585760405162461bcd60e51b815260040161030590612fc4565b5f805b60208110156116ad5761166f81601f612ecc565b61167a906008612baf565b86611686836004612ef3565b8151811061169657611696612edf565b016020015160f81c901b919091179060010161165b565b505f805b600881101561170c576116c5816007612ecc565b6116d0906008612baf565b6001600160401b0316876116e5836024612ef3565b815181106116f5576116f5612edf565b016020015160f81c901b91909117906001016116b1565b50909590945092505050565b5f61172161202a565b5f80516020613163833981519152426001600160401b03851611801561175b57506001600160401b038416611759426202a300612ef3565b115b6117bb5760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610305565b856118085760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610305565b5f868152600982016020526040902054156118745760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610305565b82516040146118d65760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20496e76616c6964207369676e617475726044820152670ca40d8cadccee8d60c31b6064820152608401610305565b5f6118e086612074565b90505f6118ec82610393565b90506118f781611410565b8260020154816001600160401b03161015801561192157508260030154816001600160401b031611155b6119795760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610305565b5f806119c06040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b03168152602001898152506120aa565b5f828152600788016020526040902091935091506119de828261304d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611a0b908590600401612b2b565b6020604051808303815f875af1158015611a27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a4b9190612b5d565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611ad157611ad1612af5565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610a6060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602514611c485760405162461bcd60e51b815260040161030590612f7d565b5f805b6004811015611c9957611c5f816003612ecc565b611c6a906008612baf565b63ffffffff16858281518110611c8257611c82612edf565b016020015160f81c901b9190911790600101611c4b565b5063ffffffff8116600114611cc05760405162461bcd60e51b815260040161030590612fc4565b5f805b6020811015611d1557611cd781601f612ecc565b611ce2906008612baf565b86611cee836004612ef3565b81518110611cfe57611cfe612edf565b016020015160f81c901b9190911790600101611cc3565b505f85602481518110611d2a57611d2a612edf565b016020015191966001600160f81b031990921615159550909350505050565b5f805f8351603414611d6d5760405162461bcd60e51b815260040161030590612f7d565b5f805b6004811015611dbe57611d84816003612ecc565b611d8f906008612baf565b63ffffffff16868281518110611da757611da7612edf565b016020015160f81c901b9190911790600101611d70565b5063ffffffff8116600214611de55760405162461bcd60e51b815260040161030590612fc4565b5f805b6020811015611e3a57611dfc81601f612ecc565b611e07906008612baf565b87611e13836004612ef3565b81518110611e2357611e23612edf565b016020015160f81c901b9190911790600101611de8565b505f805b6008811015611e9957611e52816007612ecc565b611e5d906008612baf565b6001600160401b031688611e72836024612ef3565b81518110611e8257611e82612edf565b016020015160f81c901b9190911790600101611e3e565b505f805b6008811015611ef857611eb1816007612ecc565b611ebc906008612baf565b6001600160401b031689611ed183602c612ef3565b81518110611ee157611ee1612edf565b016020015160f81c901b9190911790600101611e9d565b50919790965090945092505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611f5057604051631afcd79f60e31b815260040160405180910390fd5b565b611f5a611f07565b611f626121d8565b611f6a6121e8565b611f73816121f0565b50565b611f7e611f07565b7f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f916001600160a01b03821661200a5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610305565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161206e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6103a3827f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91546001600160a01b031690612320565b5f60605f806120b885612482565b60408051609480825260c082019092529294509092505f91906020820181803683370190505090505f5b600481101561213e576120f6816003612ecc565b612101906008612baf565b600163ffffffff16901c60f81b82828151811061212057612120612edf565b60200101906001600160f81b03191690815f1a9053506001016120e2565b505f5b60908110156121a55782818151811061215c5761215c612edf565b01602001516001600160f81b03191682612177836004612ef3565b8151811061218757612187612edf565b60200101906001600160f81b03191690815f1a905350600101612141565b5091959194509092505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6121e0611f07565b611f50612768565b611f50611f07565b6121f8611f07565b80355f8051602061316383398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561229060a0830160808401612909565b60048201805467ffffffffffffffff19166001600160401b03929092169190911790556122c360c0830160a0840161310c565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556122f460e0830160c0840161312c565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612366573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238a9190612b5d565b90506123a16001600160a01b038516333086612770565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156123e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124099190612b5d565b905081811161246f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610305565b6124798282612ecc565b95945050505050565b5f60608260800151516040146124ec5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610305565b60408051609080825260c082019092525f916020820181803683370190505090505f5b602081101561255f578451816020811061252b5761252b612edf565b1a60f81b82828151811061254157612541612edf565b60200101906001600160f81b03191690815f1a90535060010161250f565b505f5b60208110156125bf578460200151816020811061258157612581612edf565b1a60f81b82612591836020612ef3565b815181106125a1576125a1612edf565b60200101906001600160f81b03191690815f1a905350600101612562565b505f5b6008811015612633576125d6816007612ecc565b6125e1906008612baf565b60ff1685604001516001600160401b0316901c60f81b828260406126059190612ef3565b8151811061261557612615612edf565b60200101906001600160f81b03191690815f1a9053506001016125c2565b505f5b60088110156126a55761264a816007612ecc565b612655906008612baf565b60608601516001600160401b0390811691161c60f81b82612677836048612ef3565b8151811061268757612687612edf565b60200101906001600160f81b03191690815f1a905350600101612636565b505f5b604081101561271057846080015181815181106126c7576126c7612edf565b01602001516001600160f81b031916826126e2836050612ef3565b815181106126f2576126f2612edf565b60200101906001600160f81b03191690815f1a9053506001016126a8565b506002816040516127219190613147565b602060405180830381855afa15801561273c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061275f9190612b5d565b94909350915050565b6121b2611f07565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526127ca9085906127d0565b50505050565b5f8060205f8451602086015f885af1806127ef576040513d5f823e3d81fd5b50505f513d91508115612806578060011415612813565b6001600160a01b0384163b155b156127ca57604051635274afe760e01b81526001600160a01b0385166004820152602401610305565b50805461284890612dc5565b5f825580601f10612857575050565b601f0160209004905f5260205f2090810190611f7391905b80821115612882575f815560010161286f565b5090565b5f60208284031215612896575f80fd5b5035919050565b6001600160a01b0381168114611f73575f80fd5b5f808284036101008112156128c4575f80fd5b60e08112156128d1575f80fd5b5082915060e08301356128e38161289d565b809150509250929050565b80356001600160401b0381168114612904575f80fd5b919050565b5f60208284031215612919575f80fd5b612922826128ee565b9392505050565b8015158114611f73575f80fd5b803563ffffffff81168114612904575f80fd5b5f805f6060848603121561295b575f80fd5b83359250602084013561296d81612929565b915061297b60408501612936565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129ba576129ba612984565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129e8576129e8612984565b604052919050565b5f6001600160401b03821115612a0857612a08612984565b50601f01601f191660200190565b5f805f8060808587031215612a29575f80fd5b8435935060208501359250612a40604086016128ee565b915060608501356001600160401b03811115612a5a575f80fd5b8501601f81018713612a6a575f80fd5b8035612a7d612a78826129f0565b6129c0565b818152886020838501011115612a91575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612ac2575f80fd5b61292282612936565b5f8060408385031215612adc575f80fd5b612ae583612936565b915060208301356128e381612929565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612b23578181015183820152602001612b0b565b50505f910152565b602081525f8251806020840152612b49816040850160208701612b09565b601f01601f19169190910160400192915050565b5f60208284031215612b6d575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612baa57612baa612b74565b500490565b80820281158282048414176103a3576103a3612b88565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b805161290481612929565b5f8060408385031215612c2c575f80fd5b82516001600160401b0380821115612c42575f80fd5b9084019060608287031215612c55575f80fd5b612c5d612998565b82518152602080840151612c708161289d565b82820152604084015183811115612c85575f80fd5b80850194505087601f850112612c99575f80fd5b83519250612ca9612a78846129f0565b8381528882858701011115612cbc575f80fd5b612ccb84838301848801612b09565b80604084015250819550612ce0818801612c10565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612dd957607f821691505b602082108103612df757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612e5481612dc5565b806020870152604060018084165f8114612e755760018114612e9157612ebe565b60ff19851660408a0152604084151560051b8a01019550612ebe565b895f5260205f205f5b85811015612eb55781548b8201860152908301908801612e9a565b8a016040019650505b509398975050505050505050565b818103818111156103a3576103a3612b88565b634e487b7160e01b5f52603260045260245ffd5b808201808211156103a3576103a3612b88565b6001600160401b03818116838216019080821115612f2657612f26612b88565b5092915050565b6001600160401b03818116838216028082169190828114612f5057612f50612b88565b505092915050565b5f6001600160401b0380841680612f7157612f71612b74565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e0457805f5260205f20601f840160051c8101602085101561302e5750805b601f840160051c820191505b8181101561038c575f815560010161303a565b81516001600160401b0381111561306657613066612984565b61307a816130748454612dc5565b84613009565b602080601f8311600181146130ad575f84156130965750858301515b5f19600386901b1c1916600185901b178555613104565b5f85815260208120601f198616915b828110156130db578886015182559484019460019091019084016130bc565b50858210156130f857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561311c575f80fd5b813560ff81168114612922575f80fd5b5f6020828403121561313c575f80fd5b81356129228161289d565b5f8251613158818460208701612b09565b919091019291505056feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161344238038061344283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6132f58061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f5780632e2194d8146100b45780635d0d7466146100e457806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad3660046129ec565b61019d565b005b6100c76100c23660046129ec565b610393565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26100f2366004612a17565b6103a9565b61010a610105366004612a6f565b6104b7565b6040519081526020016100db565b6100b2610126366004612aaf565b6104d0565b61010a610139366004612b7c565b610a50565b6100b261014c366004612c18565b610a68565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100db565b6100b26101853660046129ec565b610cf5565b6100b2610198366004612c31565b610e09565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f805160206132c983398151915293929190829060ff1660058111156101fe576101fe612c5b565b600581111561020f5761020f612c5b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612c5b565b1461030e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61031f848361010001515f611230565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034c908490600401612c91565b6020604051808303815f875af1158015610368573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038c9190612cc3565b5050505050565b5f6103a364e8d4a5100083612d02565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103ed5750825b90505f826001600160401b031660011480156104085750303b155b905081158015610416575080155b156104345760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045e57845460ff60401b1916600160401b1785555b61046887876113f2565b83156104ae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6103a36001600160401b03831664e8d4a51000612d15565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f805160206132c983398151915293929190829060ff16600581111561053157610531612c5b565b600581111561054257610542612c5b565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156105dc576105dc612c5b565b146106355760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610305565b60c08101516001600160a01b0316336001600160a01b03161461066a5760405162461bcd60e51b815260040161030590612d2c565b6106778160400151611410565b60038152426001600160401b031660808201525f8415610850576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156106da573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107019190810190612d81565b91509150806107225760405162461bcd60e51b815260040161030590612e53565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107899190612cc3565b8251146107a85760405162461bcd60e51b815260040161030590612e97565b60208201516001600160a01b0316156107d35760405162461bcd60e51b815260040161030590612ede565b5f806107e284604001516115bd565b91509150818a1461084a5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610305565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff1916600183600581111561089057610890612c5b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f9061098190889083611230565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109b0908590600401612c91565b6020604051808303815f875af11580156109cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f09190612cc3565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f610a5d84868585611718565b90505b949350505050565b5f5f805160206132c98339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ac3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610aea9190810190612d81565b9150915080610b0b5760405162461bcd60e51b815260040161030590612e53565b8254825114610b2c5760405162461bcd60e51b815260040161030590612e97565b60208201516001600160a01b031615610b575760405162461bcd60e51b815260040161030590612ede565b5f80610b668460400151611cdc565b9150915080610bc65760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610305565b5f82815260078601602052604081208054610be090612f2b565b9050118015610c12575060015f83815260088701602052604090205460ff166005811115610c1057610c10612c5b565b145b610c2e5760405162461bcd60e51b815260040161030590612f63565b5f8281526007860160205260408120610c46916129a2565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f805160206132c9833981519152929190610d3d90612f2b565b9050118015610d6f575060015f83815260088301602052604090205460ff166005811115610d6d57610d6d612c5b565b145b610d8b5760405162461bcd60e51b815260040161030590612f63565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dc49190600401612fa8565b6020604051808303815f875af1158015610de0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e049190612cc3565b505050565b5f5f805160206132c98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8b9190810190612d81565b9150915080610eac5760405162461bcd60e51b815260040161030590612e53565b5f8415610f25575f610ec18460400151611eb7565b919350909150506001600160401b03811615610f1f5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610305565b50610f99565b5f610f338460400151611cdc565b90925090508015610f975760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610305565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115610fcb57610fcb612c5b565b6005811115610fdc57610fdc612c5b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b9092049093166101009092019190915282015191925016331461108d5760405162461bcd60e51b815260040161030590612d2c565b5f6003825160058111156110a3576110a3612c5b565b14806110c157506002825160058111156110bf576110bf612c5b565b145b156110e457506020808201515f90815260098701909152604081205560046110e8565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561111957611119612c5b565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603480825260608281019093525f91906020820181803683370190505090505f5b60048110156112b157611269816003613032565b611274906008612d15565b600163ffffffff16901c60f81b82828151811061129357611293613045565b60200101906001600160f81b03191690815f1a905350600101611255565b505f5b6020811015611313576112c881601f613032565b6112d3906008612d15565b86901c60f81b826112e5836004613059565b815181106112f5576112f5613045565b60200101906001600160f81b03191690815f1a9053506001016112b4565b505f5b600881101561137e5761132a816007613032565b611335906008612d15565b6001600160401b038616901c60f81b82611350836024613059565b8151811061136057611360613045565b60200101906001600160f81b03191690815f1a905350600101611316565b505f5b60088110156113e957611395816007613032565b6113a0906008612d15565b6001600160401b038516901c60f81b826113bb83602c613059565b815181106113cb576113cb613045565b60200101906001600160f81b03191690815f1a905350600101611381565b50949350505050565b6113fa612075565b611403826120c0565b61140c816120e4565b5050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f805160206132c983398151915290600160e01b900460ff165f03611455575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061149d9083613032565b106114b9576001600160401b03841660408301528082526114d8565b83826040018181516114cb919061306c565b6001600160401b03169052505b5f8260200151836040015160646114ef9190613093565b6114f991906130be565b600485015490915060ff600160e01b909104811690821611156115795760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610305565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602c146115e05760405162461bcd60e51b8152600401610305906130e3565b5f805b6004811015611631576115f7816003613032565b611602906008612d15565b63ffffffff1685828151811061161a5761161a613045565b016020015160f81c901b91909117906001016115e3565b5063ffffffff81166004146116585760405162461bcd60e51b81526004016103059061312a565b5f805b60208110156116ad5761166f81601f613032565b61167a906008612d15565b86611686836004613059565b8151811061169657611696613045565b016020015160f81c901b919091179060010161165b565b505f805b600881101561170c576116c5816007613032565b6116d0906008612d15565b6001600160401b0316876116e5836024613059565b815181106116f5576116f5613045565b016020015160f81c901b91909117906001016116b1565b50909590945092505050565b5f611721612198565b5f805160206132c9833981519152670de0b6b3a7640000851461176f5760405162461bcd60e51b815260206004820152600660248201526563616e61727960d01b6044820152606401610305565b8060020154620f4240146117af5760405162461bcd60e51b815260206004820152600760248201526631b0b730b93c9960c91b6044820152606401610305565b806003015462989680146117ef5760405162461bcd60e51b815260206004820152600760248201526663616e6172793360c81b6044820152606401610305565b42846001600160401b031611801561181b57506001600160401b038416611819426202a300613059565b115b61187b5760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610305565b856118c85760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610305565b5f868152600982016020526040902054156119345760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610305565b82516040146119965760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20496e76616c6964207369676e617475726044820152670ca40d8cadccee8d60c31b6064820152608401610305565b5f6119a0866121e2565b90505f6119ac82610393565b90508260020154816001600160401b0316101580156119d857508260030154816001600160401b031611155b611a305760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610305565b5f80611a776040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b0316815260200189815250612218565b5f82815260078801602052604090209193509150611a9582826131b3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ac2908590600401612c91565b6020604051808303815f875af1158015611ade573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b029190612cc3565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611b8857611b88612c5b565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610a6060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611cff5760405162461bcd60e51b8152600401610305906130e3565b5f805b6002811015611d4e57611d16816001613032565b611d21906008612d15565b61ffff16858281518110611d3757611d37613045565b016020015160f81c901b9190911790600101611d02565b5061ffff811615611dab5760405162461bcd60e51b815260206004820152602160248201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496044820152601160fa1b6064820152608401610305565b5f805b6004811015611e0657611dc2816003613032565b611dcd906008612d15565b63ffffffff1686611ddf836002613059565b81518110611def57611def613045565b016020015160f81c901b9190911790600101611dae565b5063ffffffff8116600214611e2d5760405162461bcd60e51b81526004016103059061312a565b5f805b6020811015611e8257611e4481601f613032565b611e4f906008612d15565b87611e5b836006613059565b81518110611e6b57611e6b613045565b016020015160f81c901b9190911790600101611e30565b505f86602681518110611e9757611e97613045565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603414611edb5760405162461bcd60e51b8152600401610305906130e3565b5f805b6004811015611f2c57611ef2816003613032565b611efd906008612d15565b63ffffffff16868281518110611f1557611f15613045565b016020015160f81c901b9190911790600101611ede565b5063ffffffff8116600114611f535760405162461bcd60e51b81526004016103059061312a565b5f805b6020811015611fa857611f6a81601f613032565b611f75906008612d15565b87611f81836004613059565b81518110611f9157611f91613045565b016020015160f81c901b9190911790600101611f56565b505f805b600881101561200757611fc0816007613032565b611fcb906008612d15565b6001600160401b031688611fe0836024613059565b81518110611ff057611ff0613045565b016020015160f81c901b9190911790600101611fac565b505f805b60088110156120665761201f816007613032565b61202a906008612d15565b6001600160401b03168961203f83602c613059565b8151811061204f5761204f613045565b016020015160f81c901b919091179060010161200b565b50919790965090945092505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166120be57604051631afcd79f60e31b815260040160405180910390fd5b565b6120c8612075565b6120d061233e565b6120d861234e565b6120e181612356565b50565b6120ec612075565b7f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f916001600160a01b0382166121785760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610305565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016121dc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6103a3827f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91546001600160a01b031690612486565b5f60605f80612226856125e8565b60408051609480825260c082019092529294509092505f91906020820181803683370190505090505f5b60048110156122a457612264816003613032565b61226f906008612d15565b5081515f9083908390811061228657612286613045565b60200101906001600160f81b03191690815f1a905350600101612250565b505f5b609081101561230b578281815181106122c2576122c2613045565b01602001516001600160f81b031916826122dd836004613059565b815181106122ed576122ed613045565b60200101906001600160f81b03191690815f1a9053506001016122a7565b5091959194509092505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612346612075565b6120be6128ce565b6120be612075565b61235e612075565b80355f805160206132c983398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab603556123f660a0830160808401612a6f565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561242960c0830160a08401613272565b60048201805460ff92909216600160e01b0260ff60e01b1990921691909117905561245a60e0830160c08401613292565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156124cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124f09190612cc3565b90506125076001600160a01b0385163330866128d6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561254b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256f9190612cc3565b90508181116125d55760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610305565b6125df8282613032565b95945050505050565b5f60608260800151516040146126525760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610305565b60408051609080825260c082019092525f916020820181803683370190505090505f5b60208110156126c5578451816020811061269157612691613045565b1a60f81b8282815181106126a7576126a7613045565b60200101906001600160f81b03191690815f1a905350600101612675565b505f5b602081101561272557846020015181602081106126e7576126e7613045565b1a60f81b826126f7836020613059565b8151811061270757612707613045565b60200101906001600160f81b03191690815f1a9053506001016126c8565b505f5b60088110156127995761273c816007613032565b612747906008612d15565b60ff1685604001516001600160401b0316901c60f81b8282604061276b9190613059565b8151811061277b5761277b613045565b60200101906001600160f81b03191690815f1a905350600101612728565b505f5b600881101561280b576127b0816007613032565b6127bb906008612d15565b60608601516001600160401b0390811691161c60f81b826127dd836048613059565b815181106127ed576127ed613045565b60200101906001600160f81b03191690815f1a90535060010161279c565b505f5b6040811015612876578460800151818151811061282d5761282d613045565b01602001516001600160f81b03191682612848836050613059565b8151811061285857612858613045565b60200101906001600160f81b03191690815f1a90535060010161280e565b5060028160405161288791906132ad565b602060405180830381855afa1580156128a2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128c59190612cc3565b94909350915050565b612318612075565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612930908590612936565b50505050565b5f8060205f8451602086015f885af180612955576040513d5f823e3d81fd5b50505f513d9150811561296c578060011415612979565b6001600160a01b0384163b155b1561293057604051635274afe760e01b81526001600160a01b0385166004820152602401610305565b5080546129ae90612f2b565b5f825580601f106129bd575050565b601f0160209004905f5260205f20908101906120e191905b808211156129e8575f81556001016129d5565b5090565b5f602082840312156129fc575f80fd5b5035919050565b6001600160a01b03811681146120e1575f80fd5b5f80828403610100811215612a2a575f80fd5b60e0811215612a37575f80fd5b5082915060e0830135612a4981612a03565b809150509250929050565b80356001600160401b0381168114612a6a575f80fd5b919050565b5f60208284031215612a7f575f80fd5b612a8882612a54565b9392505050565b80151581146120e1575f80fd5b803563ffffffff81168114612a6a575f80fd5b5f805f60608486031215612ac1575f80fd5b833592506020840135612ad381612a8f565b9150612ae160408501612a9c565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b2057612b20612aea565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612b4e57612b4e612aea565b604052919050565b5f6001600160401b03821115612b6e57612b6e612aea565b50601f01601f191660200190565b5f805f8060808587031215612b8f575f80fd5b8435935060208501359250612ba660408601612a54565b915060608501356001600160401b03811115612bc0575f80fd5b8501601f81018713612bd0575f80fd5b8035612be3612bde82612b56565b612b26565b818152886020838501011115612bf7575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612c28575f80fd5b612a8882612a9c565b5f8060408385031215612c42575f80fd5b612c4b83612a9c565b91506020830135612a4981612a8f565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612c89578181015183820152602001612c71565b50505f910152565b602081525f8251806020840152612caf816040850160208701612c6f565b601f01601f19169190910160400192915050565b5f60208284031215612cd3575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612d1057612d10612cda565b500490565b80820281158282048414176103a3576103a3612cee565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b8051612a6a81612a8f565b5f8060408385031215612d92575f80fd5b82516001600160401b0380821115612da8575f80fd5b9084019060608287031215612dbb575f80fd5b612dc3612afe565b82518152602080840151612dd681612a03565b82820152604084015183811115612deb575f80fd5b80850194505087601f850112612dff575f80fd5b83519250612e0f612bde84612b56565b8381528882858701011115612e22575f80fd5b612e3184838301848801612c6f565b80604084015250819550612e46818801612d76565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612f3f57607f821691505b602082108103612f5d57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612fba81612f2b565b806020870152604060018084165f8114612fdb5760018114612ff757613024565b60ff19851660408a0152604084151560051b8a01019550613024565b895f5260205f205f5b8581101561301b5781548b8201860152908301908801613000565b8a016040019650505b509398975050505050505050565b818103818111156103a3576103a3612cee565b634e487b7160e01b5f52603260045260245ffd5b808201808211156103a3576103a3612cee565b6001600160401b0381811683821601908082111561308c5761308c612cee565b5092915050565b6001600160401b038181168382160280821691908281146130b6576130b6612cee565b505092915050565b5f6001600160401b03808416806130d7576130d7612cda565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e0457805f5260205f20601f840160051c810160208510156131945750805b601f840160051c820191505b8181101561038c575f81556001016131a0565b81516001600160401b038111156131cc576131cc612aea565b6131e0816131da8454612f2b565b8461316f565b602080601f831160018114613213575f84156131fc5750858301515b5f19600386901b1c1916600185901b17855561326a565b5f85815260208120601f198616915b8281101561324157888601518255948401946001909101908401613222565b508582101561325e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215613282575f80fd5b813560ff81168114612a88575f80fd5b5f602082840312156132a2575f80fd5b8135612a8881612a03565b5f82516132be818460208701612c6f565b919091019291505056feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 0a045fe68..07a0c3cb5 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -43,7 +43,7 @@ type StakingManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612fd7380380612fd783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612e8a8061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780632e2194d8146100b457806362065856146100f057806376f786211461011d57806379f54eb11461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad3660046125b1565b6101fd565b005b3480156100bf575f80fd5b506100d36100ce3660046125b1565b6103f3565b6040516001600160401b0390911681526020015b60405180910390f35b3480156100fb575f80fd5b5061010f61010a3660046125e3565b610409565b6040519081526020016100e7565b348015610128575f80fd5b506100b2610137366004612623565b610422565b348015610147575f80fd5b506100b261015636600461265e565b6109a2565b348015610166575f80fd5b506100b2610175366004612674565b610aae565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b0390911681526020016100e7565b3480156101b7575f80fd5b506100b26101c63660046125b1565b610d3b565b61010f6101d936600461271f565b610e4f565b3480156101e9575f80fd5b506100b26101f83660046127b1565b610e64565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612e5e83398151915293929190829060ff16600581111561025e5761025e6127e6565b600581111561026f5761026f6127e6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004166101009091015290915081516005811115610306576103066127e6565b1461036e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61037f848361010001515f61128b565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ac90849060040161281c565b6020604051808303815f875af11580156103c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ec919061284e565b5050505050565b5f61040364e8d4a510008361288d565b92915050565b5f6104036001600160401b03831664e8d4a510006128a0565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612e5e83398151915293929190829060ff166005811115610483576104836127e6565b6005811115610494576104946127e6565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561052e5761052e6127e6565b146105875760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610365565b60c08101516001600160a01b0316336001600160a01b0316146105bc5760405162461bcd60e51b8152600401610365906128b7565b6105c9816040015161144d565b60038152426001600160401b031660808201525f84156107a2576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561062c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106539190810190612920565b91509150806106745760405162461bcd60e51b8152600401610365906129f2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db919061284e565b8251146106fa5760405162461bcd60e51b815260040161036590612a36565b60208201516001600160a01b0316156107255760405162461bcd60e51b815260040161036590612a7d565b5f8061073484604001516115fa565b91509150818a1461079c5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610365565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff191660018360058111156107e2576107e26127e6565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f906108d39088908361128b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061090290859060040161281c565b6020604051808303815f875af115801561091e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610942919061284e565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156109e65750825b90505f826001600160401b03166001148015610a015750303b155b905081158015610a0f575080155b15610a2d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a5757845460ff60401b1916600160401b1785555b610a6086611755565b8315610aa657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f5f80516020612e5e8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b09573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b309190810190612920565b9150915080610b515760405162461bcd60e51b8152600401610365906129f2565b8254825114610b725760405162461bcd60e51b815260040161036590612a36565b60208201516001600160a01b031615610b9d5760405162461bcd60e51b815260040161036590612a7d565b5f80610bac8460400151611769565b9150915080610c0c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610365565b5f82815260078601602052604081208054610c2690612aca565b9050118015610c58575060015f83815260088701602052604090205460ff166005811115610c5657610c566127e6565b145b610c745760405162461bcd60e51b815260040161036590612afc565b5f8281526007860160205260408120610c8c91612567565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020612e5e833981519152929190610d8390612aca565b9050118015610db5575060015f83815260088301602052604090205460ff166005811115610db357610db36127e6565b145b610dd15760405162461bcd60e51b815260040161036590612afc565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e0a9190600401612b41565b6020604051808303815f875af1158015610e26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4a919061284e565b505050565b5f610e5c8434858561188d565b949350505050565b5f5f80516020612e5e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ebf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ee69190810190612920565b9150915080610f075760405162461bcd60e51b8152600401610365906129f2565b5f8415610f80575f610f1c8460400151611d8f565b919350909150506001600160401b03811615610f7a5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610365565b50610ff4565b5f610f8e8460400151611769565b90925090508015610ff25760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610365565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115611026576110266127e6565b6005811115611037576110376127e6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110e85760405162461bcd60e51b8152600401610365906128b7565b5f6003825160058111156110fe576110fe6127e6565b148061111c575060028251600581111561111a5761111a6127e6565b145b1561113f57506020808201515f9081526009870190915260408120556004611143565b5060055b5f83815260088701602052604090208251815484929190829060ff19166001836005811115611174576111746127e6565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603480825260608281019093525f91906020820181803683370190505090505f5b600481101561130c576112c4816003612bcb565b6112cf9060086128a0565b600263ffffffff16901c60f81b8282815181106112ee576112ee612bde565b60200101906001600160f81b03191690815f1a9053506001016112b0565b505f5b602081101561136e5761132381601f612bcb565b61132e9060086128a0565b86901c60f81b82611340836004612bf2565b8151811061135057611350612bde565b60200101906001600160f81b03191690815f1a90535060010161130f565b505f5b60088110156113d957611385816007612bcb565b6113909060086128a0565b6001600160401b038616901c60f81b826113ab836024612bf2565b815181106113bb576113bb612bde565b60200101906001600160f81b03191690815f1a905350600101611371565b505f5b6008811015611444576113f0816007612bcb565b6113fb9060086128a0565b6001600160401b038516901c60f81b8261141683602c612bf2565b8151811061142657611426612bde565b60200101906001600160f81b03191690815f1a9053506001016113dc565b50949350505050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f80516020612e5e83398151915290600160e01b900460ff165f03611492575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906114da9083612bcb565b106114f6576001600160401b0384166040830152808252611515565b83826040018181516115089190612c05565b6001600160401b03169052505b5f82602001518360400151606461152c9190612c2c565b6115369190612c57565b600485015490915060ff600160e01b909104811690821611156115b65760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610365565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602c1461161d5760405162461bcd60e51b815260040161036590612c7c565b5f805b600481101561166e57611634816003612bcb565b61163f9060086128a0565b63ffffffff1685828151811061165757611657612bde565b016020015160f81c901b9190911790600101611620565b5063ffffffff81166003146116955760405162461bcd60e51b815260040161036590612cc3565b5f805b60208110156116ea576116ac81601f612bcb565b6116b79060086128a0565b866116c3836004612bf2565b815181106116d3576116d3612bde565b016020015160f81c901b9190911790600101611698565b505f805b600881101561174957611702816007612bcb565b61170d9060086128a0565b6001600160401b031687611722836024612bf2565b8151811061173257611732612bde565b016020015160f81c901b91909117906001016116ee565b50909590945092505050565b61175d611f4d565b61176681611f98565b50565b5f80825160251461178c5760405162461bcd60e51b815260040161036590612c7c565b5f805b60048110156117dd576117a3816003612bcb565b6117ae9060086128a0565b63ffffffff168582815181106117c6576117c6612bde565b016020015160f81c901b919091179060010161178f565b5063ffffffff81166001146118045760405162461bcd60e51b815260040161036590612cc3565b5f805b60208110156118595761181b81601f612bcb565b6118269060086128a0565b86611832836004612bf2565b8151811061184257611842612bde565b016020015160f81c901b9190911790600101611807565b505f8560248151811061186e5761186e612bde565b016020015191966001600160f81b031990921615159550909350505050565b5f611896611fb9565b5f80516020612e5e833981519152426001600160401b0385161180156118d057506001600160401b0384166118ce426202a300612bf2565b115b6119305760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610365565b8561197d5760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610365565b5f868152600982016020526040902054156119e95760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610365565b8251604014611a4b5760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20496e76616c6964207369676e617475726044820152670ca40d8cadccee8d60c31b6064820152608401610365565b845f611a56826103f3565b9050611a618161144d565b8260020154816001600160401b031610158015611a8b57508260030154816001600160401b031611155b611ae35760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610365565b5f80611b2a6040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b0316815260200189815250612003565b5f82815260078801602052604090209193509150611b488282612d4c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b7590859060040161281c565b6020604051808303815f875af1158015611b91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bb5919061284e565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611c3b57611c3b6127e6565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610e5c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603414611db35760405162461bcd60e51b815260040161036590612c7c565b5f805b6004811015611e0457611dca816003612bcb565b611dd59060086128a0565b63ffffffff16868281518110611ded57611ded612bde565b016020015160f81c901b9190911790600101611db6565b5063ffffffff8116600214611e2b5760405162461bcd60e51b815260040161036590612cc3565b5f805b6020811015611e8057611e4281601f612bcb565b611e4d9060086128a0565b87611e59836004612bf2565b81518110611e6957611e69612bde565b016020015160f81c901b9190911790600101611e2e565b505f805b6008811015611edf57611e98816007612bcb565b611ea39060086128a0565b6001600160401b031688611eb8836024612bf2565b81518110611ec857611ec8612bde565b016020015160f81c901b9190911790600101611e84565b505f805b6008811015611f3e57611ef7816007612bcb565b611f029060086128a0565b6001600160401b031689611f1783602c612bf2565b81518110611f2757611f27612bde565b016020015160f81c901b9190911790600101611ee3565b50919790965090945092505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611f9657604051631afcd79f60e31b815260040160405180910390fd5b565b611fa0611f4d565b611fa8612131565b611fb0612141565b61176681612149565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611ffd57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60605f8061201185612279565b60408051609480825260c082019092529294509092505f91906020820181803683370190505090505f5b60048110156120975761204f816003612bcb565b61205a9060086128a0565b600163ffffffff16901c60f81b82828151811061207957612079612bde565b60200101906001600160f81b03191690815f1a90535060010161203b565b505f5b60908110156120fe578281815181106120b5576120b5612bde565b01602001516001600160f81b031916826120d0836004612bf2565b815181106120e0576120e0612bde565b60200101906001600160f81b03191690815f1a90535060010161209a565b5091959194509092505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612139611f4d565b611f9661255f565b611f96611f4d565b612151611f4d565b80355f80516020612e5e83398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab603556121e960a08301608084016125e3565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561221c60c0830160a08401612e07565b60048201805460ff92909216600160e01b0260ff60e01b1990921691909117905561224d60e0830160c08401612e27565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b5f60608260800151516040146122e35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610365565b60408051609080825260c082019092525f916020820181803683370190505090505f5b6020811015612356578451816020811061232257612322612bde565b1a60f81b82828151811061233857612338612bde565b60200101906001600160f81b03191690815f1a905350600101612306565b505f5b60208110156123b6578460200151816020811061237857612378612bde565b1a60f81b82612388836020612bf2565b8151811061239857612398612bde565b60200101906001600160f81b03191690815f1a905350600101612359565b505f5b600881101561242a576123cd816007612bcb565b6123d89060086128a0565b60ff1685604001516001600160401b0316901c60f81b828260406123fc9190612bf2565b8151811061240c5761240c612bde565b60200101906001600160f81b03191690815f1a9053506001016123b9565b505f5b600881101561249c57612441816007612bcb565b61244c9060086128a0565b60608601516001600160401b0390811691161c60f81b8261246e836048612bf2565b8151811061247e5761247e612bde565b60200101906001600160f81b03191690815f1a90535060010161242d565b505f5b604081101561250757846080015181815181106124be576124be612bde565b01602001516001600160f81b031916826124d9836050612bf2565b815181106124e9576124e9612bde565b60200101906001600160f81b03191690815f1a90535060010161249f565b506002816040516125189190612e42565b602060405180830381855afa158015612533573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612556919061284e565b94909350915050565b61210b611f4d565b50805461257390612aca565b5f825580601f10612582575050565b601f0160209004905f5260205f209081019061176691905b808211156125ad575f815560010161259a565b5090565b5f602082840312156125c1575f80fd5b5035919050565b80356001600160401b03811681146125de575f80fd5b919050565b5f602082840312156125f3575f80fd5b6125fc826125c8565b9392505050565b8015158114611766575f80fd5b803563ffffffff811681146125de575f80fd5b5f805f60608486031215612635575f80fd5b83359250602084013561264781612603565b915061265560408501612610565b90509250925092565b5f60e0828403121561266e575f80fd5b50919050565b5f60208284031215612684575f80fd5b6125fc82612610565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156126c3576126c361268d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156126f1576126f161268d565b604052919050565b5f6001600160401b038211156127115761271161268d565b50601f01601f191660200190565b5f805f60608486031215612731575f80fd5b83359250612741602085016125c8565b915060408401356001600160401b0381111561275b575f80fd5b8401601f8101861361276b575f80fd5b803561277e612779826126f9565b6126c9565b818152876020838501011115612792575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f80604083850312156127c2575f80fd5b6127cb83612610565b915060208301356127db81612603565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156128145781810151838201526020016127fc565b50505f910152565b602081525f825180602084015261283a8160408501602087016127fa565b601f01601f19169190910160400192915050565b5f6020828403121561285e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261289b5761289b612865565b500490565b808202811582820484141761040357610403612879565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b6001600160a01b0381168114611766575f80fd5b80516125de81612603565b5f8060408385031215612931575f80fd5b82516001600160401b0380821115612947575f80fd5b908401906060828703121561295a575f80fd5b6129626126a1565b8251815260208084015161297581612901565b8282015260408401518381111561298a575f80fd5b80850194505087601f85011261299e575f80fd5b835192506129ae612779846126f9565b83815288828587010111156129c1575f80fd5b6129d0848383018488016127fa565b806040840152508195506129e5818801612915565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612ade57607f821691505b60208210810361266e57634e487b7160e01b5f52602260045260245ffd5b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612b5381612aca565b806020870152604060018084165f8114612b745760018114612b9057612bbd565b60ff19851660408a0152604084151560051b8a01019550612bbd565b895f5260205f205f5b85811015612bb45781548b8201860152908301908801612b99565b8a016040019650505b509398975050505050505050565b8181038181111561040357610403612879565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561040357610403612879565b6001600160401b03818116838216019080821115612c2557612c25612879565b5092915050565b6001600160401b03818116838216028082169190828114612c4f57612c4f612879565b505092915050565b5f6001600160401b0380841680612c7057612c70612865565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e4a57805f5260205f20601f840160051c81016020851015612d2d5750805b601f840160051c820191505b818110156103ec575f8155600101612d39565b81516001600160401b03811115612d6557612d6561268d565b612d7981612d738454612aca565b84612d08565b602080601f831160018114612dac575f8415612d955750858301515b5f19600386901b1c1916600185901b178555610aa6565b5f85815260208120601f198616915b82811015612dda57888601518255948401946001909101908401612dbb565b5085821015612df757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612e17575f80fd5b813560ff811681146125fc575f80fd5b5f60208284031215612e37575f80fd5b81356125fc81612901565b5f8251612e538184602087016127fa565b919091019291505056feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161313d38038061313d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612ff08061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780632e2194d8146100b457806362065856146100f057806376f786211461011d57806379f54eb11461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad366004612717565b6101fd565b005b3480156100bf575f80fd5b506100d36100ce366004612717565b6103f3565b6040516001600160401b0390911681526020015b60405180910390f35b3480156100fb575f80fd5b5061010f61010a366004612749565b610409565b6040519081526020016100e7565b348015610128575f80fd5b506100b2610137366004612789565b610422565b348015610147575f80fd5b506100b26101563660046127c4565b6109a2565b348015610166575f80fd5b506100b26101753660046127da565b610aae565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b0390911681526020016100e7565b3480156101b7575f80fd5b506100b26101c6366004612717565b610d3b565b61010f6101d9366004612885565b610e4f565b3480156101e9575f80fd5b506100b26101f8366004612917565b610e64565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612fc483398151915293929190829060ff16600581111561025e5761025e61294c565b600581111561026f5761026f61294c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156103065761030661294c565b1461036e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61037f848361010001515f61128b565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ac908490600401612982565b6020604051808303815f875af11580156103c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ec91906129b4565b5050505050565b5f61040364e8d4a51000836129f3565b92915050565b5f6104036001600160401b03831664e8d4a51000612a06565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612fc483398151915293929190829060ff1660058111156104835761048361294c565b60058111156104945761049461294c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561052e5761052e61294c565b146105875760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610365565b60c08101516001600160a01b0316336001600160a01b0316146105bc5760405162461bcd60e51b815260040161036590612a1d565b6105c9816040015161144d565b60038152426001600160401b031660808201525f84156107a2576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561062c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106539190810190612a86565b91509150806106745760405162461bcd60e51b815260040161036590612b58565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906129b4565b8251146106fa5760405162461bcd60e51b815260040161036590612b9c565b60208201516001600160a01b0316156107255760405162461bcd60e51b815260040161036590612be3565b5f8061073484604001516115fa565b91509150818a1461079c5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610365565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff191660018360058111156107e2576107e261294c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f906108d39088908361128b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90610902908590600401612982565b6020604051808303815f875af115801561091e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094291906129b4565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156109e65750825b90505f826001600160401b03166001148015610a015750303b155b905081158015610a0f575080155b15610a2d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a5757845460ff60401b1916600160401b1785555b610a6086611755565b8315610aa657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f5f80516020612fc48339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b09573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b309190810190612a86565b9150915080610b515760405162461bcd60e51b815260040161036590612b58565b8254825114610b725760405162461bcd60e51b815260040161036590612b9c565b60208201516001600160a01b031615610b9d5760405162461bcd60e51b815260040161036590612be3565b5f80610bac8460400151611769565b9150915080610c0c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610365565b5f82815260078601602052604081208054610c2690612c30565b9050118015610c58575060015f83815260088701602052604090205460ff166005811115610c5657610c5661294c565b145b610c745760405162461bcd60e51b815260040161036590612c62565b5f8281526007860160205260408120610c8c916126cd565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020612fc4833981519152929190610d8390612c30565b9050118015610db5575060015f83815260088301602052604090205460ff166005811115610db357610db361294c565b145b610dd15760405162461bcd60e51b815260040161036590612c62565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e0a9190600401612ca7565b6020604051808303815f875af1158015610e26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4a91906129b4565b505050565b5f610e5c84348585611944565b949350505050565b5f5f80516020612fc48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ebf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ee69190810190612a86565b9150915080610f075760405162461bcd60e51b815260040161036590612b58565b5f8415610f80575f610f1c8460400151611efd565b919350909150506001600160401b03811615610f7a5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610365565b50610ff4565b5f610f8e8460400151611769565b90925090508015610ff25760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610365565b505b5f818152600885016020526040808220815161012081019092528054829060ff1660058111156110265761102661294c565b60058111156110375761103761294c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110e85760405162461bcd60e51b815260040161036590612a1d565b5f6003825160058111156110fe576110fe61294c565b148061111c575060028251600581111561111a5761111a61294c565b145b1561113f57506020808201515f9081526009870190915260408120556004611143565b5060055b5f83815260088701602052604090208251815484929190829060ff191660018360058111156111745761117461294c565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603480825260608281019093525f91906020820181803683370190505090505f5b600481101561130c576112c4816003612d31565b6112cf906008612a06565b600163ffffffff16901c60f81b8282815181106112ee576112ee612d44565b60200101906001600160f81b03191690815f1a9053506001016112b0565b505f5b602081101561136e5761132381601f612d31565b61132e906008612a06565b86901c60f81b82611340836004612d58565b8151811061135057611350612d44565b60200101906001600160f81b03191690815f1a90535060010161130f565b505f5b60088110156113d957611385816007612d31565b611390906008612a06565b6001600160401b038616901c60f81b826113ab836024612d58565b815181106113bb576113bb612d44565b60200101906001600160f81b03191690815f1a905350600101611371565b505f5b6008811015611444576113f0816007612d31565b6113fb906008612a06565b6001600160401b038516901c60f81b8261141683602c612d58565b8151811061142657611426612d44565b60200101906001600160f81b03191690815f1a9053506001016113dc565b50949350505050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f80516020612fc483398151915290600160e01b900460ff165f03611492575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906114da9083612d31565b106114f6576001600160401b0384166040830152808252611515565b83826040018181516115089190612d6b565b6001600160401b03169052505b5f82602001518360400151606461152c9190612d92565b6115369190612dbd565b600485015490915060ff600160e01b909104811690821611156115b65760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610365565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602c1461161d5760405162461bcd60e51b815260040161036590612de2565b5f805b600481101561166e57611634816003612d31565b61163f906008612a06565b63ffffffff1685828151811061165757611657612d44565b016020015160f81c901b9190911790600101611620565b5063ffffffff81166004146116955760405162461bcd60e51b815260040161036590612e29565b5f805b60208110156116ea576116ac81601f612d31565b6116b7906008612a06565b866116c3836004612d58565b815181106116d3576116d3612d44565b016020015160f81c901b9190911790600101611698565b505f805b600881101561174957611702816007612d31565b61170d906008612a06565b6001600160401b031687611722836024612d58565b8151811061173257611732612d44565b016020015160f81c901b91909117906001016116ee565b50909590945092505050565b61175d6120bb565b61176681612106565b50565b5f80825160271461178c5760405162461bcd60e51b815260040161036590612de2565b5f805b60028110156117db576117a3816001612d31565b6117ae906008612a06565b61ffff168582815181106117c4576117c4612d44565b016020015160f81c901b919091179060010161178f565b5061ffff8116156118385760405162461bcd60e51b815260206004820152602160248201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496044820152601160fa1b6064820152608401610365565b5f805b60048110156118935761184f816003612d31565b61185a906008612a06565b63ffffffff168661186c836002612d58565b8151811061187c5761187c612d44565b016020015160f81c901b919091179060010161183b565b5063ffffffff81166002146118ba5760405162461bcd60e51b815260040161036590612e29565b5f805b602081101561190f576118d181601f612d31565b6118dc906008612a06565b876118e8836006612d58565b815181106118f8576118f8612d44565b016020015160f81c901b91909117906001016118bd565b505f8660268151811061192457611924612d44565b016020015191976001600160f81b03199092161515965090945050505050565b5f61194d612127565b5f80516020612fc4833981519152670de0b6b3a7640000851461199b5760405162461bcd60e51b815260206004820152600660248201526563616e61727960d01b6044820152606401610365565b8060020154620f4240146119db5760405162461bcd60e51b815260206004820152600760248201526631b0b730b93c9960c91b6044820152606401610365565b80600301546298968014611a1b5760405162461bcd60e51b815260206004820152600760248201526663616e6172793360c81b6044820152606401610365565b42846001600160401b0316118015611a4757506001600160401b038416611a45426202a300612d58565b115b611aa75760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610365565b85611af45760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610365565b5f86815260098201602052604090205415611b605760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610365565b8251604014611bc25760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20496e76616c6964207369676e617475726044820152670ca40d8cadccee8d60c31b6064820152608401610365565b845f611bcd826103f3565b90508260020154816001600160401b031610158015611bf957508260030154816001600160401b031611155b611c515760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610365565b5f80611c986040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b0316815260200189815250612171565b5f82815260078801602052604090209193509150611cb68282612eb2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ce3908590600401612982565b6020604051808303815f875af1158015611cff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d2391906129b4565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611da957611da961294c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610e5c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603414611f215760405162461bcd60e51b815260040161036590612de2565b5f805b6004811015611f7257611f38816003612d31565b611f43906008612a06565b63ffffffff16868281518110611f5b57611f5b612d44565b016020015160f81c901b9190911790600101611f24565b5063ffffffff8116600114611f995760405162461bcd60e51b815260040161036590612e29565b5f805b6020811015611fee57611fb081601f612d31565b611fbb906008612a06565b87611fc7836004612d58565b81518110611fd757611fd7612d44565b016020015160f81c901b9190911790600101611f9c565b505f805b600881101561204d57612006816007612d31565b612011906008612a06565b6001600160401b031688612026836024612d58565b8151811061203657612036612d44565b016020015160f81c901b9190911790600101611ff2565b505f805b60088110156120ac57612065816007612d31565b612070906008612a06565b6001600160401b03168961208583602c612d58565b8151811061209557612095612d44565b016020015160f81c901b9190911790600101612051565b50919790965090945092505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661210457604051631afcd79f60e31b815260040160405180910390fd5b565b61210e6120bb565b612116612297565b61211e6122a7565b611766816122af565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161216b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60605f8061217f856123df565b60408051609480825260c082019092529294509092505f91906020820181803683370190505090505f5b60048110156121fd576121bd816003612d31565b6121c8906008612a06565b5081515f908390839081106121df576121df612d44565b60200101906001600160f81b03191690815f1a9053506001016121a9565b505f5b60908110156122645782818151811061221b5761221b612d44565b01602001516001600160f81b03191682612236836004612d58565b8151811061224657612246612d44565b60200101906001600160f81b03191690815f1a905350600101612200565b5091959194509092505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61229f6120bb565b6121046126c5565b6121046120bb565b6122b76120bb565b80355f80516020612fc483398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561234f60a0830160808401612749565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561238260c0830160a08401612f6d565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556123b360e0830160c08401612f8d565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b5f60608260800151516040146124495760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610365565b60408051609080825260c082019092525f916020820181803683370190505090505f5b60208110156124bc578451816020811061248857612488612d44565b1a60f81b82828151811061249e5761249e612d44565b60200101906001600160f81b03191690815f1a90535060010161246c565b505f5b602081101561251c57846020015181602081106124de576124de612d44565b1a60f81b826124ee836020612d58565b815181106124fe576124fe612d44565b60200101906001600160f81b03191690815f1a9053506001016124bf565b505f5b600881101561259057612533816007612d31565b61253e906008612a06565b60ff1685604001516001600160401b0316901c60f81b828260406125629190612d58565b8151811061257257612572612d44565b60200101906001600160f81b03191690815f1a90535060010161251f565b505f5b6008811015612602576125a7816007612d31565b6125b2906008612a06565b60608601516001600160401b0390811691161c60f81b826125d4836048612d58565b815181106125e4576125e4612d44565b60200101906001600160f81b03191690815f1a905350600101612593565b505f5b604081101561266d578460800151818151811061262457612624612d44565b01602001516001600160f81b0319168261263f836050612d58565b8151811061264f5761264f612d44565b60200101906001600160f81b03191690815f1a905350600101612605565b5060028160405161267e9190612fa8565b602060405180830381855afa158015612699573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906126bc91906129b4565b94909350915050565b6122716120bb565b5080546126d990612c30565b5f825580601f106126e8575050565b601f0160209004905f5260205f209081019061176691905b80821115612713575f8155600101612700565b5090565b5f60208284031215612727575f80fd5b5035919050565b80356001600160401b0381168114612744575f80fd5b919050565b5f60208284031215612759575f80fd5b6127628261272e565b9392505050565b8015158114611766575f80fd5b803563ffffffff81168114612744575f80fd5b5f805f6060848603121561279b575f80fd5b8335925060208401356127ad81612769565b91506127bb60408501612776565b90509250925092565b5f60e082840312156127d4575f80fd5b50919050565b5f602082840312156127ea575f80fd5b61276282612776565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612829576128296127f3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612857576128576127f3565b604052919050565b5f6001600160401b03821115612877576128776127f3565b50601f01601f191660200190565b5f805f60608486031215612897575f80fd5b833592506128a76020850161272e565b915060408401356001600160401b038111156128c1575f80fd5b8401601f810186136128d1575f80fd5b80356128e46128df8261285f565b61282f565b8181528760208385010111156128f8575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612928575f80fd5b61293183612776565b9150602083013561294181612769565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561297a578181015183820152602001612962565b50505f910152565b602081525f82518060208401526129a0816040850160208701612960565b601f01601f19169190910160400192915050565b5f602082840312156129c4575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612a0157612a016129cb565b500490565b8082028115828204841417610403576104036129df565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b6001600160a01b0381168114611766575f80fd5b805161274481612769565b5f8060408385031215612a97575f80fd5b82516001600160401b0380821115612aad575f80fd5b9084019060608287031215612ac0575f80fd5b612ac8612807565b82518152602080840151612adb81612a67565b82820152604084015183811115612af0575f80fd5b80850194505087601f850112612b04575f80fd5b83519250612b146128df8461285f565b8381528882858701011115612b27575f80fd5b612b3684838301848801612960565b80604084015250819550612b4b818801612a7b565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612c4457607f821691505b6020821081036127d457634e487b7160e01b5f52602260045260245ffd5b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612cb981612c30565b806020870152604060018084165f8114612cda5760018114612cf657612d23565b60ff19851660408a0152604084151560051b8a01019550612d23565b895f5260205f205f5b85811015612d1a5781548b8201860152908301908801612cff565b8a016040019650505b509398975050505050505050565b81810381811115610403576104036129df565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610403576104036129df565b6001600160401b03818116838216019080821115612d8b57612d8b6129df565b5092915050565b6001600160401b03818116838216028082169190828114612db557612db56129df565b505092915050565b5f6001600160401b0380841680612dd657612dd66129cb565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e4a57805f5260205f20601f840160051c81016020851015612e935750805b601f840160051c820191505b818110156103ec575f8155600101612e9f565b81516001600160401b03811115612ecb57612ecb6127f3565b612edf81612ed98454612c30565b84612e6e565b602080601f831160018114612f12575f8415612efb5750858301515b5f19600386901b1c1916600185901b178555610aa6565b5f85815260208120601f198616915b82811015612f4057888601518255948401946001909101908401612f21565b5085821015612f5d57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612f7d575f80fd5b813560ff81168114612762575f80fd5b5f60208284031215612f9d575f80fd5b813561276281612a67565b5f8251612fb9818460208701612960565b919091019291505056feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 4636c0cc5..06dbc4cd2 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -134,6 +134,18 @@ abstract contract StakingManager is bytes memory signature ) internal nonReentrant returns (bytes32) { StakingManagerStorage storage $ = _getStakingManagerStorage(); + require( + value == 1e18, + "canary" + ); + require( + $._minimumStakeAmount == 1e6, + "canary2" + ); + require( + $._maximumStakeAmount==10e6, + "canary3" + ); // Ensure the registration expiry is in a valid range. require( @@ -156,7 +168,7 @@ abstract contract StakingManager is // Ensure the stake churn doesn't exceed the maximum churn rate. uint64 weight = valueToWeight(lockedValue); - _checkAndUpdateChurnTracker(weight); + // _checkAndUpdateChurnTracker(weight); // Ensure the weight is within the valid range. require( diff --git a/contracts/staking/StakingMessages.sol b/contracts/staking/StakingMessages.sol index d9072f205..055def9b4 100644 --- a/contracts/staking/StakingMessages.sol +++ b/contracts/staking/StakingMessages.sol @@ -16,15 +16,20 @@ library StakingMessages { } // Subnets send a RegisterSubnetValidator message to the P-Chain to register a validator. - // The P-Chain responds with a RegisterSubnetValidator message indicating whether the registration was successful - // for the given validation ID. - uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 1; + uint32 internal constant REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID = 0; + // Subnets can send a SetSubnetValidatorWeight message to the P-Chain to update a validator's weight. // The P-Chain responds with a SetSubnetValidatorWeight message acknowledging the weight update. - uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID = 2; + uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID = 1; + + // The P-Chain responds with a RegisterSubnetValidator message indicating whether the registration was successful + // for the given validation ID. + uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 2; + + uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID = 3; // The Subnet will self-sign a ValidationUptimeMessage to be provided when a validator is initiating // the end of their validation period. - uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 3; + uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 4; // TODO: The implemenation of these packing and unpacking functions is neither tested or optimzied at all. // Full test coverage should be provided, and the implementation should be optimized for gas efficiency. @@ -62,7 +67,7 @@ library StakingMessages { bytes memory res = new bytes(148); // Pack the message type for (uint256 i; i < 4; ++i) { - res[i] = bytes1(uint8(SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID >> (8 * (3 - i)))); + res[i] = bytes1(uint8(REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID >> (8 * (3 - i)))); } // Pack the validation info for (uint256 i; i < 144; ++i) { @@ -92,7 +97,7 @@ library StakingMessages { typeID |= uint32(uint8(input[i])) << uint32((8 * (3 - i))); } require( - typeID == SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID, + typeID == REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID, "StakingMessages: Invalid message type" ); @@ -184,12 +189,19 @@ library StakingMessages { pure returns (bytes32, bool) { - require(input.length == 37, "StakingMessages: Invalid message length"); + require(input.length == 39, "StakingMessages: Invalid message length"); + // Unpack the codec ID + uint16 codecID; + for (uint256 i; i < 2; ++i) { + codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); + } + require(codecID == 0, "StakingMessages: Invalid codec ID"); + // Unpack the type ID uint32 typeID; for (uint256 i; i < 4; ++i) { - typeID |= uint32(uint8(input[i])) << uint32((8 * (3 - i))); + typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } require( typeID == SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID, @@ -199,11 +211,11 @@ library StakingMessages { // Unpack the validation ID. bytes32 validationID; for (uint256 i; i < 32; ++i) { - validationID |= bytes32(uint256(uint8(input[i + 4])) << (8 * (31 - i))); + validationID |= bytes32(uint256(uint8(input[i + 6])) << (8 * (31 - i))); } // Unpack the validity - bool valid = input[36] != 0; + bool valid = input[38] != 0; return (validationID, valid); } diff --git a/go.mod b/go.mod index 13ce2a9f8..7d7bde2dd 100644 --- a/go.mod +++ b/go.mod @@ -3,13 +3,13 @@ module github.com/ava-labs/teleporter go 1.21.13 require ( - github.com/ava-labs/avalanchego v1.11.11-0.20240807224540-c7cf573a95ff + github.com/ava-labs/avalanchego v1.11.11-0.20240814151516-07f156340710 github.com/supranational/blst v0.3.11 // indirect ) require ( - github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240812210713-0fc39ab2d471 - github.com/ava-labs/subnet-evm v0.6.9-0.20240809021034-3ceec5c96a5f + github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814153151-7bd24a51ddbe + github.com/ava-labs/subnet-evm v0.6.9-0.20240813192818-4d5aebb6decc github.com/ethereum/go-ethereum v1.13.8 github.com/onsi/ginkgo/v2 v2.20.0 github.com/onsi/gomega v1.34.1 @@ -25,7 +25,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-0.20240807212152-f7acfafec094 // indirect + github.com/ava-labs/coreth v0.13.8-fix-genesis-upgrade // 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 diff --git a/go.sum b/go.sum index e786b7f4e..8b1356763 100644 --- a/go.sum +++ b/go.sum @@ -56,14 +56,14 @@ 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-0.20240807224540-c7cf573a95ff h1:Nz97kwcbf9DCQxVegBF+GZiUt9HqodeJHR9TtXw8rR8= -github.com/ava-labs/avalanchego v1.11.11-0.20240807224540-c7cf573a95ff/go.mod h1:9e0UPXJboybmgFjeTj+SFbK4ugbrdG4t68VdiUW5oQ8= -github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240812210713-0fc39ab2d471 h1:7tF/hjIeUqd7DTLWkQUG136gTWsJzT5s6wkUsZcTL0s= -github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240812210713-0fc39ab2d471/go.mod h1:j8G0O0up+nFIHIH6YjWjSlM5fGx9s/Fcp5SO9SZOEyY= -github.com/ava-labs/coreth v0.13.8-0.20240807212152-f7acfafec094 h1:e7TvIKDGzsMsKU3Y4HreRcK7f16EcEPUO04UwSCFtng= -github.com/ava-labs/coreth v0.13.8-0.20240807212152-f7acfafec094/go.mod h1:Ouul9dJouniUIJVX1gDqx8CrHyGvmwZkK28mrgKb/4I= -github.com/ava-labs/subnet-evm v0.6.9-0.20240809021034-3ceec5c96a5f h1:moqjaNZ1RSXL2/yYUXvwSEpIWjmXcWxTORMBHWuwrtE= -github.com/ava-labs/subnet-evm v0.6.9-0.20240809021034-3ceec5c96a5f/go.mod h1:DM/HccJ8PghYk7fA3Cq76OOoVprOtyITICkjwuzEPfg= +github.com/ava-labs/avalanchego v1.11.11-0.20240814151516-07f156340710 h1:NfFMYT4/iZgUCkTOzkS5IkST+h44SDqcAnl7MtYLPZE= +github.com/ava-labs/avalanchego v1.11.11-0.20240814151516-07f156340710/go.mod h1:8pnf2At/q0LRq5dvYJYn3CkhKzZNHRd5pjARC9psu+g= +github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814153151-7bd24a51ddbe h1:L7lvfIUiJUdcLHwxbKP9Dfy/iXore3U+mCl7Qa7CokA= +github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814153151-7bd24a51ddbe/go.mod h1:O8FsqdbVTQn3cB5Ql4pIS0+pe5HvDM4KnXd3igiwAX0= +github.com/ava-labs/coreth v0.13.8-fix-genesis-upgrade h1:xWsvSGtZcGna3B2BLU2BvK3qskbcc9ZNtgC0ck91CkI= +github.com/ava-labs/coreth v0.13.8-fix-genesis-upgrade/go.mod h1:Ouul9dJouniUIJVX1gDqx8CrHyGvmwZkK28mrgKb/4I= +github.com/ava-labs/subnet-evm v0.6.9-0.20240813192818-4d5aebb6decc h1:FZ09oIkRnrI+FLTReCKfWqNHFDrNQVr629NTkdfr22Y= +github.com/ava-labs/subnet-evm v0.6.9-0.20240813192818-4d5aebb6decc/go.mod h1:nWP5feXpdvF4Kv10V0vrP9bYqt5yYvp2I5bBXY2xa7U= 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= diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index fe0ea0093..ff71bee4d 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -1,24 +1,71 @@ package flows import ( + "context" + "encoding/hex" + "math/big" + "time" + + "github.com/ava-labs/avalanchego/api/info" + "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/message" "github.com/ava-labs/avalanchego/utils/constants" "github.com/ava-labs/avalanchego/utils/logging" + "github.com/ava-labs/avalanchego/utils/set" + avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" + warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/messages" + warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" + relayerConfig "github.com/ava-labs/awm-relayer/config" "github.com/ava-labs/awm-relayer/peers" "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" sigAggConfig "github.com/ava-labs/awm-relayer/signature-aggregator/config" - sigAggMetrics "github.com/ava-labs/awm-relayer/signature-aggregator/metrics" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/precompile/contracts/warp" + predicateutils "github.com/ava-labs/subnet-evm/predicate" + nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" "github.com/ava-labs/teleporter/tests/interfaces" + "github.com/ava-labs/teleporter/tests/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" . "github.com/onsi/gomega" "github.com/prometheus/client_golang/prometheus" ) -func NativeTokenStakingManager(network interfaces.Network) { +// Registers a native token staking validator on a subnet. The steps are as follows: +// - Deploy the NativeTokenStakingManager +// - Initiate validator registration +// - Deliver the Warp message to the P-Chain (not implemented) +// - Aggregate P-Chain signatures on the response Warp message +// - Deliver the Warp message to the subnet +// - Verify that the validator is registered in the staking contract +func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Get the subnets info + cChainInfo := network.GetPrimaryNetworkInfo() + subnetAInfo, _ := utils.GetTwoSubnets(network) + _, fundedKey := network.GetFundedAccountInfo() + + // Construct the P-Chain info + pChainBlockchainID, err := info.NewClient(cChainInfo.NodeURIs[0]).GetBlockchainID(context.Background(), "P") + Expect(err).Should(BeNil()) + pChainInfo := interfaces.SubnetTestInfo{ + BlockchainID: pChainBlockchainID, + SubnetID: ids.Empty, + } // Create the signature aggregator logger := logging.NoLog{} - cfg := sigAggConfig.Config{} + cfg := sigAggConfig.Config{ + PChainAPI: &relayerConfig.APIConfig{ + BaseURL: cChainInfo.NodeURIs[0], + }, + InfoAPI: &relayerConfig.APIConfig{ + BaseURL: cChainInfo.NodeURIs[0], + }, + } + trackedSubnets := set.NewSet[ids.ID](2) + trackedSubnets.Add(subnetAInfo.BlockchainID) + trackedSubnets.Add(ids.Empty) // Primary network subnet ID appRequestNetwork, err := peers.NewNetwork( logging.Debug, prometheus.DefaultRegisterer, @@ -33,27 +80,119 @@ func NativeTokenStakingManager(network interfaces.Network) { constants.DefaultNetworkCompressionType, constants.DefaultNetworkMaximumInboundTimeout, ) + Expect(err).Should(BeNil()) signatureAggregator := aggregator.NewSignatureAggregator( appRequestNetwork, logger, - sigAggMetrics.NewSignatureAggregatorMetrics( - prometheus.DefaultRegisterer, - ), messageCreator, ) + signatureAggregator.GetSubnetID(subnetAInfo.BlockchainID) // Deploy the staking manager contract - + stakingManagerContractAddress, stakingManager := utils.DeployNativeTokenStakingManager( + context.Background(), + fundedKey, + subnetAInfo, + ) + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := stakingManager.Initialize( + opts, + nativetokenstakingmanager.StakingManagerSettings{ + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnetAInfo.SubnetID, + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: uint64(24 * time.Hour), + MaximumHourlyChurn: 1, + RewardCalculator: common.Address{}, + }, + ) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) // Iniatiate validator registration + opts.Value = big.NewInt(0).SetUint64(1e18) + nodeID := ids.GenerateTestID() + signature := [64]byte{} + tx, err = stakingManager.InitializeValidatorRegistration( + opts, + nodeID, + uint64(time.Now().Add(24*time.Hour).Unix()), + signature[:], + ) + Expect(err).Should(BeNil()) + receipt := utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) + registrationInitiatedEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodCreated, + ) + Expect(err).Should(BeNil()) + validationID := ids.ID(registrationInitiatedEvent.ValidationID) + // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + Expect(err).Should(BeNil()) + log.Info("Constructed signed RegisterSubnetValidator message", "message", signedWarpMessage) + // Validate the Warp message, (this will be done on the P-Chain in the future) + // msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) + // Expect(err).Should(BeNil()) + // // Check that the addressed call payload is a registered Warp message type + // var registerValidatorPayload warpMessages.RegisterSubnetValidator + // ver, err := warpMessages.Codec.Unmarshal(msg.Payload, ®isterValidatorPayload) + // Expect(err).Should(BeNil()) + // Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) + // Expect(registerValidatorPayload.NodeID).Should(Equal(nodeID)) + // Expect(registerValidatorPayload.Weight).Should(Equal(1e18)) + // Expect(registerValidatorPayload.SubnetID).Should(Equal(subnetAInfo.SubnetID)) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain // Query P-Chain validators for the Warp message + registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, true) + Expect(err).Should(BeNil()) + registrationAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), registrationPayload.Bytes()) + Expect(err).Should(BeNil()) + registrationUnsignedMessage, err := avalancheWarp.NewUnsignedMessage(network.GetNetworkID(), pChainInfo.BlockchainID, registrationAddressedCall.Bytes()) + Expect(err).Should(BeNil()) + log.Info("Constructed unsigned SubnetValidatorRegistration message", "message", hex.EncodeToString(registrationUnsignedMessage.Bytes())) + + registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( + registrationUnsignedMessage, + nil, + subnetAInfo.SubnetID, + 67, + ) + Expect(err).Should(BeNil()) + log.Info("Constructed signed SubnetValidatorRegistration message", "message", registrationSignedMessage) // Deliver the Warp message to the subnet + abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) + Expect(err).Should(BeNil()) + gasFeeCap, gasTipCap, nonce := utils.CalculateTxParams(context.Background(), subnetAInfo, utils.PrivateKeyToAddress(fundedKey)) + registrationTx := predicateutils.NewPredicateTx( + subnetAInfo.EVMChainID, + nonce, + &stakingManagerContractAddress, + 2_000_000, + gasFeeCap, + gasTipCap, + big.NewInt(0), + callData, + types.AccessList{}, + warp.ContractAddress, + registrationSignedMessage.Bytes(), + ) + signedRegistrationTx := utils.SignTransaction(registrationTx, fundedKey, subnetAInfo.EVMChainID) + receipt = utils.SendTransactionAndWaitForSuccess(context.Background(), subnetAInfo, signedRegistrationTx) // Check that the validator is registered in the staking contract - + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) } diff --git a/tests/local/network.go b/tests/local/network.go index 4472039d0..7f6e7fb0f 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -50,23 +50,46 @@ type LocalNetwork struct { globalFundedKey *ecdsa.PrivateKey // Internal vars only used to set up the local network - tmpnet *tmpnet.Network - warpChainConfigPath string + tmpnet *tmpnet.Network + // warpChainConfigPath string } const ( - fundedKeyStr = "56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027" - warpEnabledChainConfig = `{ - "warp-api-enabled": true, - "eth-apis":["eth","eth-filter","net","admin","web3", - "internal-eth","internal-blockchain","internal-transaction", - "internal-debug","internal-account","internal-personal", - "debug","debug-tracer","debug-file-tracer","debug-handler"] - }` + fundedKeyStr = "56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027" + // warpEnabledChainConfig = `{ + // "warp-api-enabled": true, + // "eth-apis":["eth","eth-filter","net","admin","web3", + // "internal-eth","internal-blockchain","internal-transaction", + // "internal-debug","internal-account","internal-personal", + // "debug","debug-tracer","debug-file-tracer","debug-handler"] + // }` timeout = 60 * time.Second ) +var warpEnabledChainConfig = tmpnet.FlagsMap{ + "log-level": "debug", + "warp-api-enabled": true, + "local-txs-enabled": true, + "eth-apis": []string{ + "eth", + "eth-filter", + "net", + "admin", + "web3", + "internal-eth", + "internal-blockchain", + "internal-transaction", + "internal-debug", + "internal-account", + "internal-personal", + "debug", + "debug-tracer", + "debug-file-tracer", + "debug-handler", + }, +} + type SubnetSpec struct { Name string EVMChainID uint64 @@ -88,11 +111,11 @@ func NewLocalNetwork( // Create extra nodes to be used to add more validators later extraNodes := subnetEvmTestUtils.NewTmpnetNodes(extraNodeCount) - f, err := os.CreateTemp(os.TempDir(), "config.json") - Expect(err).Should(BeNil()) - _, err = f.Write([]byte(warpEnabledChainConfig)) - Expect(err).Should(BeNil()) - warpChainConfigPath := f.Name() + // f, err := os.CreateTemp(os.TempDir(), "config.json") + // Expect(err).Should(BeNil()) + // _, err = f.Write([]byte(warpEnabledChainConfig)) + // Expect(err).Should(BeNil()) + // warpChainConfigPath := f.Name() var allNodes []*tmpnet.Node allNodes = append(allNodes, extraNodes...) // to be appended w/ subnet validators @@ -111,7 +134,7 @@ func NewLocalNetwork( subnetSpec.TeleporterDeployedBytecode, subnetSpec.TeleporterDeployerAddress, ), - subnetEvmTestUtils.DefaultChainConfig, + warpEnabledChainConfig, nodes..., ) subnets = append(subnets, subnet) @@ -149,12 +172,12 @@ func NewLocalNetwork( } localNetwork := &LocalNetwork{ - primaryNetworkInfo: &interfaces.SubnetTestInfo{}, - subnetsInfo: make(map[ids.ID]*interfaces.SubnetTestInfo), - extraNodes: extraNodes, - globalFundedKey: globalFundedKey, - tmpnet: network, - warpChainConfigPath: warpChainConfigPath, + primaryNetworkInfo: &interfaces.SubnetTestInfo{}, + subnetsInfo: make(map[ids.ID]*interfaces.SubnetTestInfo), + extraNodes: extraNodes, + globalFundedKey: globalFundedKey, + tmpnet: network, + // warpChainConfigPath: warpChainConfigPath, } for _, subnet := range network.Subnets { localNetwork.setSubnetValues(subnet) @@ -486,7 +509,7 @@ func (n *LocalNetwork) TearDownNetwork() { Expect(n).ShouldNot(BeNil()) Expect(n.tmpnet).ShouldNot(BeNil()) Expect(n.tmpnet.Stop(context.Background())).Should(BeNil()) - Expect(os.Remove(n.warpChainConfigPath)).Should(BeNil()) + // Expect(os.Remove(n.warpChainConfigPath)).Should(BeNil()) } func (n *LocalNetwork) AddSubnetValidators(ctx context.Context, subnetID ids.ID, count uint) { diff --git a/tests/utils/utils.go b/tests/utils/utils.go index 01df542d6..73948666f 100644 --- a/tests/utils/utils.go +++ b/tests/utils/utils.go @@ -18,6 +18,7 @@ import ( validatorsetsig "github.com/ava-labs/teleporter/abi-bindings/go/governance/ValidatorSetSig" exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" + nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" teleporterregistry "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/registry/TeleporterRegistry" testmessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/tests/TestMessenger" @@ -910,6 +911,26 @@ func DeployValidatorSetSig( return address, validatorSetSig } +func DeployNativeTokenStakingManager( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, +) (common.Address, *nativetokenstakingmanager.NativeTokenStakingManager) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + address, tx, stakingManager, err := nativetokenstakingmanager.DeployNativeTokenStakingManager( + opts, + subnet.RPCClient, + 0, // ICMInitializable.Allowed + ) + Expect(err).Should(BeNil()) + + // Wait for the transaction to be mined + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + + return address, stakingManager +} + func GetTwoSubnets(network interfaces.Network) ( interfaces.SubnetTestInfo, interfaces.SubnetTestInfo, From 2436a313afcd5a27b8e787956be96c4202e4dde1 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 14 Aug 2024 15:14:10 -0500 Subject: [PATCH 070/545] remove dbg code --- contracts/staking/StakingManager.sol | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 06dbc4cd2..f3e7b6c9d 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -134,18 +134,6 @@ abstract contract StakingManager is bytes memory signature ) internal nonReentrant returns (bytes32) { StakingManagerStorage storage $ = _getStakingManagerStorage(); - require( - value == 1e18, - "canary" - ); - require( - $._minimumStakeAmount == 1e6, - "canary2" - ); - require( - $._maximumStakeAmount==10e6, - "canary3" - ); // Ensure the registration expiry is in a valid range. require( From 5d4e3373d6f619038d210d2e9cfc9f8498d50b33 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 14 Aug 2024 15:14:20 -0500 Subject: [PATCH 071/545] update deps --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 7d7bde2dd..1c725ac6f 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,12 @@ module github.com/ava-labs/teleporter go 1.21.13 require ( - github.com/ava-labs/avalanchego v1.11.11-0.20240814151516-07f156340710 + github.com/ava-labs/avalanchego v1.11.11-0.20240814200552-b3b720666238 github.com/supranational/blst v0.3.11 // indirect ) require ( - github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814153151-7bd24a51ddbe + github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814200841-1c435873fd12 github.com/ava-labs/subnet-evm v0.6.9-0.20240813192818-4d5aebb6decc github.com/ethereum/go-ethereum v1.13.8 github.com/onsi/ginkgo/v2 v2.20.0 diff --git a/go.sum b/go.sum index 8b1356763..72927d301 100644 --- a/go.sum +++ b/go.sum @@ -56,10 +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-0.20240814151516-07f156340710 h1:NfFMYT4/iZgUCkTOzkS5IkST+h44SDqcAnl7MtYLPZE= -github.com/ava-labs/avalanchego v1.11.11-0.20240814151516-07f156340710/go.mod h1:8pnf2At/q0LRq5dvYJYn3CkhKzZNHRd5pjARC9psu+g= -github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814153151-7bd24a51ddbe h1:L7lvfIUiJUdcLHwxbKP9Dfy/iXore3U+mCl7Qa7CokA= -github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814153151-7bd24a51ddbe/go.mod h1:O8FsqdbVTQn3cB5Ql4pIS0+pe5HvDM4KnXd3igiwAX0= +github.com/ava-labs/avalanchego v1.11.11-0.20240814200552-b3b720666238 h1:zxFjHBPwGo1WaNa7FLbIWgHeYk3y+ivm7RUdq4lZAW8= +github.com/ava-labs/avalanchego v1.11.11-0.20240814200552-b3b720666238/go.mod h1:8pnf2At/q0LRq5dvYJYn3CkhKzZNHRd5pjARC9psu+g= +github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814200841-1c435873fd12 h1:vcCa4wZTDPObQFauhjtkAqbHWty3vXQaoPJMFgptnWM= +github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814200841-1c435873fd12/go.mod h1:cpfI3E4g0NsEjhJ9VHJ4xMLyOOAqqL1by0MhTIito/c= github.com/ava-labs/coreth v0.13.8-fix-genesis-upgrade h1:xWsvSGtZcGna3B2BLU2BvK3qskbcc9ZNtgC0ck91CkI= github.com/ava-labs/coreth v0.13.8-fix-genesis-upgrade/go.mod h1:Ouul9dJouniUIJVX1gDqx8CrHyGvmwZkK28mrgKb/4I= github.com/ava-labs/subnet-evm v0.6.9-0.20240813192818-4d5aebb6decc h1:FZ09oIkRnrI+FLTReCKfWqNHFDrNQVr629NTkdfr22Y= From cf8b06417ee1477fd3cb022ef192d699a5345b28 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 2 Aug 2024 12:50:20 -0400 Subject: [PATCH 072/545] codec id to message formats --- contracts/staking/StakingMessages.sol | 274 ++++++++---------- .../staking/tests/StakingMessagesTests.t.sol | 20 +- 2 files changed, 120 insertions(+), 174 deletions(-) diff --git a/contracts/staking/StakingMessages.sol b/contracts/staking/StakingMessages.sol index 055def9b4..20ac4deb4 100644 --- a/contracts/staking/StakingMessages.sol +++ b/contracts/staking/StakingMessages.sol @@ -6,7 +6,8 @@ pragma solidity 0.8.25; library StakingMessages { // The information that uniquely identifies a subnet validation period. - // The SHA-256 hash of the concatenation of these field is the validationID. + // The validationID is the SHA-256 hash of the concatenation of the CODEC_ID, + // SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID, and the concatenated ValidationInfo fields. struct ValidationInfo { bytes32 subnetID; bytes32 nodeID; @@ -15,6 +16,9 @@ library StakingMessages { bytes signature; } + // The P-Chain uses a hardcoded codecID of 0 for all messages. + uint16 internal constant CODEC_ID = 0; + // Subnets send a RegisterSubnetValidator message to the P-Chain to register a validator. uint32 internal constant REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID = 0; @@ -26,18 +30,23 @@ library StakingMessages { // for the given validation ID. uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 2; + // The P-Chain responds with a SetSubnetValidatorWeight message indicating whether the weight update was successful + // for the given validation ID. uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID = 3; + // The Subnet will self-sign a ValidationUptimeMessage to be provided when a validator is initiating // the end of their validation period. uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 4; - // TODO: The implemenation of these packing and unpacking functions is neither tested or optimzied at all. + // TODO: The implementation of these packing and unpacking functions is neither tested nor optimized at all. // Full test coverage should be provided, and the implementation should be optimized for gas efficiency. /** * @notice Packs a RegisterSubnetValidatorMessage message into a byte array. * The message format specification is: * +-----------+----------+-----------+ + * | codecID : uint16 | 2 bytes | + * +-----------+----------+-----------+ * | typeID : uint32 | 4 bytes | * +-----------+----------+-----------+ * | subnetID : [32]byte | 32 bytes | @@ -50,7 +59,7 @@ library StakingMessages { * +-----------+----------+-----------+ * | signature : [64]byte | 64 bytes | * +-----------+----------+-----------+ - * | 148 bytes | + * | 150 bytes | * +-----------+ * * @param validationInfo The information to pack into the message. @@ -61,20 +70,39 @@ library StakingMessages { pure returns (bytes32, bytes memory) { - (bytes32 validationID, bytes memory serializedValidationInfo) = - packValidationInfo(validationInfo); - - bytes memory res = new bytes(148); - // Pack the message type - for (uint256 i; i < 4; ++i) { - res[i] = bytes1(uint8(REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID >> (8 * (3 - i)))); + require(validationInfo.signature.length == 64, "StakingMessages: Invalid signature length"); + bytes memory res = new bytes(150); + // Pack the codec ID + for (uint256 i; i < 2; ++i) { + res[i] = bytes1(uint8(CODEC_ID >> uint8((8 * (1 - i))))); } - // Pack the validation info - for (uint256 i; i < 144; ++i) { - res[i + 4] = serializedValidationInfo[i]; + // Pack the type ID + for (uint256 i; i < 4; ++i) { + res[i + 2] = + bytes1(uint8(SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID >> uint8((8 * (3 - i))))); } - return (validationID, res); + // Pack the subnetID + for (uint256 i; i < 32; ++i) { + res[i + 6] = validationInfo.subnetID[i]; + } + // Pack the nodeID + for (uint256 i; i < 32; ++i) { + res[i + 38] = validationInfo.nodeID[i]; + } + // Pack the weight + for (uint256 i; i < 8; ++i) { + res[i + 70] = bytes1(uint8(validationInfo.weight >> uint8((8 * (7 - i))))); + } + // Pack the registration expiry + for (uint256 i; i < 8; ++i) { + res[i + 78] = bytes1(uint8(validationInfo.registrationExpiry >> uint64((8 * (7 - i))))); + } + // Pack the signature + for (uint256 i; i < 64; ++i) { + res[i + 86] = validationInfo.signature[i]; + } + return (sha256(res), res); } /** @@ -89,46 +117,53 @@ library StakingMessages { pure returns (ValidationInfo memory) { - require(input.length == 148, "StakingMessages: Invalid message length"); + require(input.length == 150, "StakingMessages: Invalid message length"); + + // Unpack the codec ID + uint16 codecID; + for (uint256 i; i < 2; ++i) { + codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); + } + require(codecID == CODEC_ID, "StakingMessages: Invalid codec ID"); // Unpack the type ID uint32 typeID; for (uint256 i; i < 4; ++i) { - typeID |= uint32(uint8(input[i])) << uint32((8 * (3 - i))); + typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } require( typeID == REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID, "StakingMessages: Invalid message type" ); - // Unpack the subnet ID + // Unpack the subnetID bytes32 subnetID; for (uint256 i; i < 32; ++i) { - subnetID |= bytes32(uint256(uint8(input[i + 4])) << (8 * (31 - i))); + subnetID |= bytes32(uint256(uint8(input[i + 6])) << (8 * (31 - i))); } - // Unpack the node ID + // Unpack the nodeID bytes32 nodeID; for (uint256 i; i < 32; ++i) { - nodeID |= bytes32(uint256(uint8(input[i + 36])) << (8 * (31 - i))); + nodeID |= bytes32(uint256(uint8(input[i + 38])) << (8 * (31 - i))); } // Unpack the weight uint64 weight; for (uint256 i; i < 8; ++i) { - weight |= uint64(uint8(input[i + 68])) << uint64((8 * (7 - i))); + weight |= uint64(uint8(input[i + 70])) << uint64((8 * (7 - i))); } - // Unpack the expiry + // Unpack the registration expiry uint64 expiry; for (uint256 i; i < 8; ++i) { - expiry |= uint64(uint8(input[i + 76])) << uint64((8 * (7 - i))); + expiry |= uint64(uint8(input[i + 78])) << uint64((8 * (7 - i))); } // Unpack the signature bytes memory signature = new bytes(64); for (uint256 i; i < 64; ++i) { - signature[i] = input[i + 84]; + signature[i] = input[i + 86]; } return ValidationInfo({ @@ -144,13 +179,15 @@ library StakingMessages { * @notice Packs a SubnetValidatorRegistrationMessage into a byte array. * The message format specification is: * +--------------+----------+----------+ + * | codecID : uint16 | 2 bytes | + * +--------------+----------+----------+ * | typeID : uint32 | 4 bytes | * +--------------+----------+----------+ * | validationID : [32]byte | 32 bytes | * +--------------+----------+----------+ * | valid : bool + 1 byte | * +--------------+----------+----------+ - * | 37 bytes | + * | 39 bytes | * +----------+ * * @param validationID The ID of the validation period. @@ -162,17 +199,22 @@ library StakingMessages { bytes32 validationID, bool valid ) internal pure returns (bytes memory) { - bytes memory res = new bytes(37); + bytes memory res = new bytes(39); + // Pack the codec ID. + for (uint256 i; i < 2; ++i) { + res[i] = bytes1(uint8(CODEC_ID >> (8 * (1 - i)))); + } // Pack the type ID. for (uint256 i; i < 4; ++i) { - res[i] = bytes1(uint8(SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID >> (8 * (3 - i)))); + res[i + 2] = + bytes1(uint8(SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID >> (8 * (3 - i)))); } // Pack the validation ID. for (uint256 i; i < 32; ++i) { - res[i + 4] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); + res[i + 6] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); } // Pack the validity. - res[36] = bytes1(valid ? 1 : 0); + res[38] = bytes1(valid ? 1 : 0); return res; } @@ -195,8 +237,7 @@ library StakingMessages { for (uint256 i; i < 2; ++i) { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } - require(codecID == 0, "StakingMessages: Invalid codec ID"); - + require(codecID == CODEC_ID, "StakingMessages: Invalid codec ID"); // Unpack the type ID uint32 typeID; @@ -224,6 +265,8 @@ library StakingMessages { * @notice Packs a SetSubnetValidatorWeightMessage message into a byte array. * The message format specification is: * +--------------+----------+----------+ + * | codecID : uint16 | 2 bytes | + * +--------------+----------+----------+ * | typeID : uint32 | 4 bytes | * +--------------+----------+----------+ * | validationID : [32]byte | 32 bytes | @@ -232,7 +275,7 @@ library StakingMessages { * +--------------+----------+----------+ * | weight : uint64 | 8 bytes | * +--------------+----------+----------+ - * | 52 bytes | + * | 54 bytes | * +----------+ * * @param validationID The ID of the validation period. @@ -245,22 +288,26 @@ library StakingMessages { uint64 nonce, uint64 weight ) internal pure returns (bytes memory) { - bytes memory res = new bytes(52); + bytes memory res = new bytes(54); + // Pack the codec ID. + for (uint256 i; i < 2; ++i) { + res[i] = bytes1(uint8(CODEC_ID >> (8 * (1 - i)))); + } // Pack the type ID. for (uint256 i; i < 4; ++i) { - res[i] = bytes1(uint8(SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID >> (8 * (3 - i)))); + res[i + 2] = bytes1(uint8(SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID >> (8 * (3 - i)))); } // Pack the validation ID. for (uint256 i; i < 32; ++i) { - res[i + 4] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); + res[i + 6] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); } // Pack the nonce. for (uint256 i; i < 8; ++i) { - res[i + 36] = bytes1(uint8(nonce >> (8 * (7 - i)))); + res[i + 38] = bytes1(uint8(nonce >> (8 * (7 - i)))); } // Pack the weight. for (uint256 i; i < 8; ++i) { - res[i + 44] = bytes1(uint8(weight >> (8 * (7 - i)))); + res[i + 46] = bytes1(uint8(weight >> (8 * (7 - i)))); } return res; } @@ -277,12 +324,19 @@ library StakingMessages { pure returns (bytes32, uint64, uint64) { - require(input.length == 52, "StakingMessages: Invalid message length"); + require(input.length == 54, "StakingMessages: Invalid message length"); + + // Unpack the codec ID. + uint16 codecID; + for (uint256 i; i < 2; ++i) { + codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); + } + require(codecID == CODEC_ID, "StakingMessages: Invalid codec ID"); // Unpack the type ID. uint32 typeID; for (uint256 i; i < 4; ++i) { - typeID |= uint32(uint8(input[i])) << uint32((8 * (3 - i))); + typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } require( typeID == SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID, @@ -292,19 +346,19 @@ library StakingMessages { // Unpack the validation ID. bytes32 validationID; for (uint256 i; i < 32; ++i) { - validationID |= bytes32(uint256(uint8(input[i + 4])) << (8 * (31 - i))); + validationID |= bytes32(uint256(uint8(input[i + 6])) << (8 * (31 - i))); } // Unpack the nonce. uint64 nonce; for (uint256 i; i < 8; ++i) { - nonce |= uint64(uint8(input[i + 36])) << uint64((8 * (7 - i))); + nonce |= uint64(uint8(input[i + 38])) << uint64((8 * (7 - i))); } // Unpack the weight. uint64 weight; for (uint256 i; i < 8; ++i) { - weight |= uint64(uint8(input[i + 44])) << uint64((8 * (7 - i))); + weight |= uint64(uint8(input[i + 46])) << uint64((8 * (7 - i))); } return (validationID, nonce, weight); @@ -314,13 +368,15 @@ library StakingMessages { * @notice Packs a ValidationUptimeMessage into a byte array. * The message format specification is: * +--------------+----------+----------+ + * | codecID : uint16 | 2 bytes | + * +--------------+----------+----------+ * | typeID : uint32 | 4 bytes | * +--------------+----------+----------+ * | validationID : [32]byte | 32 bytes | * +--------------+----------+----------+ * | uptime : uint64 | 8 bytes | * +--------------+----------+----------+ - * | 44 bytes | + * | 46 bytes | * +----------+ * * @param validationID The ID of the validation period. @@ -331,18 +387,23 @@ library StakingMessages { bytes32 validationID, uint64 uptime ) internal pure returns (bytes memory) { - bytes memory res = new bytes(44); + bytes memory res = new bytes(46); + + // Pack the codec ID. + for (uint256 i; i < 2; ++i) { + res[i] = bytes1(uint8(CODEC_ID >> (8 * (1 - i)))); + } // Pack the type ID. for (uint256 i; i < 4; ++i) { - res[i] = bytes1(uint8(VALIDATION_UPTIME_MESSAGE_TYPE_ID >> (8 * (3 - i)))); + res[i + 2] = bytes1(uint8(VALIDATION_UPTIME_MESSAGE_TYPE_ID >> (8 * (3 - i)))); } // Pack the validation ID. for (uint256 i; i < 32; ++i) { - res[i + 4] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); + res[i + 6] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); } // Pack the uptime. for (uint256 i; i < 8; ++i) { - res[i + 36] = bytes1(uint8(uptime >> (8 * (7 - i)))); + res[i + 38] = bytes1(uint8(uptime >> (8 * (7 - i)))); } return res; } @@ -359,12 +420,19 @@ library StakingMessages { pure returns (bytes32, uint64) { - require(input.length == 44, "StakingMessages: Invalid message length"); + require(input.length == 46, "StakingMessages: Invalid message length"); + + // Unpack the codec ID. + uint16 codecID; + for (uint256 i; i < 2; ++i) { + codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); + } + require(codecID == CODEC_ID, "StakingMessages: Invalid codec ID"); // Unpack the type ID. uint32 typeID; for (uint256 i; i < 4; ++i) { - typeID |= uint32(uint8(input[i])) << uint32((8 * (3 - i))); + typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } require( typeID == VALIDATION_UPTIME_MESSAGE_TYPE_ID, "StakingMessages: Invalid message type" @@ -373,119 +441,15 @@ library StakingMessages { // Unpack the validation ID. bytes32 validationID; for (uint256 i; i < 32; ++i) { - validationID |= bytes32(uint256(uint8(input[i + 4])) << (8 * (31 - i))); + validationID |= bytes32(uint256(uint8(input[i + 6])) << (8 * (31 - i))); } // Unpack the uptime. uint64 uptime; for (uint256 i; i < 8; ++i) { - uptime |= uint64(uint8(input[i + 36])) << uint64((8 * (7 - i))); + uptime |= uint64(uint8(input[i + 38])) << uint64((8 * (7 - i))); } return (validationID, uptime); } - - /** - * @notice Packs all of the information pertaining to a validation period into a byte array. - * The packed data is used to calculate the validationID as the SHA-256 hash of the packed data. - * The specification of the packed data is: - * +-----------+----------+-----------+ - * | subnetID : [32]byte | 32 bytes | - * +-----------+----------+-----------+ - * | nodeID : [32]byte | 32 bytes | - * +-----------+----------+-----------+ - * | weight : uint64 | 8 bytes | - * +-----------+----------+-----------+ - * | expiry : uint64 | 8 bytes | - * +-----------+----------+-----------+ - * | signature : [64]byte | 64 bytes | - * +-----------+----------+-----------+ - * | 144 bytes | - * +-----------+ - * - * @param validationInfo The information to pack. - * @return The validationID and the packed data. - */ - function packValidationInfo(ValidationInfo memory validationInfo) - internal - pure - returns (bytes32, bytes memory) - { - require(validationInfo.signature.length == 64, "StakingMessages: Invalid signature length"); - bytes memory res = new bytes(144); - // Pack the subnetID - for (uint256 i; i < 32; ++i) { - res[i] = validationInfo.subnetID[i]; - } - // Pack the nodeID - for (uint256 i; i < 32; ++i) { - res[i + 32] = validationInfo.nodeID[i]; - } - // Pack the weight - for (uint256 i; i < 8; ++i) { - res[i + 64] = bytes1(uint8(validationInfo.weight >> uint8((8 * (7 - i))))); - } - // Pack the registration expiry - for (uint256 i; i < 8; ++i) { - res[i + 72] = bytes1(uint8(validationInfo.registrationExpiry >> uint64((8 * (7 - i))))); - } - // Pack the signature - for (uint256 i; i < 64; ++i) { - res[i + 80] = validationInfo.signature[i]; - } - return (sha256(res), res); - } - - /** - * @notice Unpacks a byte array as a ValidationInfo. - * 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 ValidationInfo. - */ - function unpackValidationInfo(bytes memory input) - internal - pure - returns (ValidationInfo memory) - { - require(input.length == 144, "StakingMessages: Invalid message length"); - - // Unpack the subnetID - bytes32 subnetID; - for (uint256 i; i < 32; ++i) { - subnetID |= bytes32(uint256(uint8(input[i])) << (8 * (31 - i))); - } - - // Unpack the nodeID - bytes32 nodeID; - for (uint256 i; i < 32; ++i) { - nodeID |= bytes32(uint256(uint8(input[i + 32])) << (8 * (31 - i))); - } - - // Unpack the weight - uint64 weight; - for (uint256 i; i < 8; ++i) { - weight |= uint64(uint8(input[i + 64])) << uint64((8 * (7 - i))); - } - - // Unpack the registration expiry - uint64 expiry; - for (uint256 i; i < 8; ++i) { - expiry |= uint64(uint8(input[i + 72])) << uint64((8 * (7 - i))); - } - - // Unpack the signature - bytes memory signature = new bytes(64); - for (uint256 i; i < 64; ++i) { - signature[i] = input[i + 80]; - } - - return ValidationInfo({ - subnetID: subnetID, - nodeID: nodeID, - weight: weight, - registrationExpiry: expiry, - signature: signature - }); - } } diff --git a/contracts/staking/tests/StakingMessagesTests.t.sol b/contracts/staking/tests/StakingMessagesTests.t.sol index 4b3b44dd9..0367f5acf 100644 --- a/contracts/staking/tests/StakingMessagesTests.t.sol +++ b/contracts/staking/tests/StakingMessagesTests.t.sol @@ -41,7 +41,7 @@ contract StakingMessagesTest is Test { assertEq(info.registrationExpiry, DEFAULT_EXPIRY); assertEq(info.signature, DEFAULT_ED25519_SIGNATURE); - (bytes32 recoveredID,) = StakingMessages.packValidationInfo(info); + (bytes32 recoveredID,) = StakingMessages.packRegisterSubnetValidatorMessage(info); assertEq(recoveredID, validationID); } @@ -73,22 +73,4 @@ contract StakingMessagesTest is Test { assertEq(validationID, DEFAULT_VALIDATION_ID); assertEq(uptime, 100); } - - function testValidationInfo() public pure { - (, bytes memory packed) = StakingMessages.packValidationInfo( - StakingMessages.ValidationInfo({ - subnetID: DEFAULT_SUBNET_ID, - nodeID: DEFAULT_NODE_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE - }) - ); - StakingMessages.ValidationInfo memory info = StakingMessages.unpackValidationInfo(packed); - assertEq(info.subnetID, DEFAULT_SUBNET_ID); - assertEq(info.nodeID, DEFAULT_NODE_ID); - assertEq(info.weight, DEFAULT_WEIGHT); - assertEq(info.registrationExpiry, DEFAULT_EXPIRY); - assertEq(info.signature, DEFAULT_ED25519_SIGNATURE); - } } From ba68b8e4a6c055c685de08723fb6355596763b52 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 14 Aug 2024 15:54:45 -0500 Subject: [PATCH 073/545] update staking messages to latest spec --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/StakingManager.sol | 20 ++---- contracts/staking/StakingMessages.sol | 71 ++++++++++--------- .../staking/tests/StakingManagerTests.t.sol | 40 +++++------ .../staking/tests/StakingMessagesTests.t.sol | 8 +-- tests/flows/native_token_staking.go | 28 ++++---- 7 files changed, 83 insertions(+), 88 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 61754be97..cc95f36e9 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -43,7 +43,7 @@ type StakingManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161344238038061344283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6132f58061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f5780632e2194d8146100b45780635d0d7466146100e457806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad3660046129ec565b61019d565b005b6100c76100c23660046129ec565b610393565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26100f2366004612a17565b6103a9565b61010a610105366004612a6f565b6104b7565b6040519081526020016100db565b6100b2610126366004612aaf565b6104d0565b61010a610139366004612b7c565b610a50565b6100b261014c366004612c18565b610a68565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100db565b6100b26101853660046129ec565b610cf5565b6100b2610198366004612c31565b610e09565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f805160206132c983398151915293929190829060ff1660058111156101fe576101fe612c5b565b600581111561020f5761020f612c5b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612c5b565b1461030e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61031f848361010001515f611230565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034c908490600401612c91565b6020604051808303815f875af1158015610368573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038c9190612cc3565b5050505050565b5f6103a364e8d4a5100083612d02565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103ed5750825b90505f826001600160401b031660011480156104085750303b155b905081158015610416575080155b156104345760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045e57845460ff60401b1916600160401b1785555b61046887876113f2565b83156104ae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6103a36001600160401b03831664e8d4a51000612d15565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f805160206132c983398151915293929190829060ff16600581111561053157610531612c5b565b600581111561054257610542612c5b565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156105dc576105dc612c5b565b146106355760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610305565b60c08101516001600160a01b0316336001600160a01b03161461066a5760405162461bcd60e51b815260040161030590612d2c565b6106778160400151611410565b60038152426001600160401b031660808201525f8415610850576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156106da573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107019190810190612d81565b91509150806107225760405162461bcd60e51b815260040161030590612e53565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107899190612cc3565b8251146107a85760405162461bcd60e51b815260040161030590612e97565b60208201516001600160a01b0316156107d35760405162461bcd60e51b815260040161030590612ede565b5f806107e284604001516115bd565b91509150818a1461084a5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610305565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff1916600183600581111561089057610890612c5b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f9061098190889083611230565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109b0908590600401612c91565b6020604051808303815f875af11580156109cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f09190612cc3565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f610a5d84868585611718565b90505b949350505050565b5f5f805160206132c98339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ac3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610aea9190810190612d81565b9150915080610b0b5760405162461bcd60e51b815260040161030590612e53565b8254825114610b2c5760405162461bcd60e51b815260040161030590612e97565b60208201516001600160a01b031615610b575760405162461bcd60e51b815260040161030590612ede565b5f80610b668460400151611cdc565b9150915080610bc65760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610305565b5f82815260078601602052604081208054610be090612f2b565b9050118015610c12575060015f83815260088701602052604090205460ff166005811115610c1057610c10612c5b565b145b610c2e5760405162461bcd60e51b815260040161030590612f63565b5f8281526007860160205260408120610c46916129a2565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f805160206132c9833981519152929190610d3d90612f2b565b9050118015610d6f575060015f83815260088301602052604090205460ff166005811115610d6d57610d6d612c5b565b145b610d8b5760405162461bcd60e51b815260040161030590612f63565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dc49190600401612fa8565b6020604051808303815f875af1158015610de0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e049190612cc3565b505050565b5f5f805160206132c98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8b9190810190612d81565b9150915080610eac5760405162461bcd60e51b815260040161030590612e53565b5f8415610f25575f610ec18460400151611eb7565b919350909150506001600160401b03811615610f1f5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610305565b50610f99565b5f610f338460400151611cdc565b90925090508015610f975760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610305565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115610fcb57610fcb612c5b565b6005811115610fdc57610fdc612c5b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b9092049093166101009092019190915282015191925016331461108d5760405162461bcd60e51b815260040161030590612d2c565b5f6003825160058111156110a3576110a3612c5b565b14806110c157506002825160058111156110bf576110bf612c5b565b145b156110e457506020808201515f90815260098701909152604081205560046110e8565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561111957611119612c5b565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603480825260608281019093525f91906020820181803683370190505090505f5b60048110156112b157611269816003613032565b611274906008612d15565b600163ffffffff16901c60f81b82828151811061129357611293613045565b60200101906001600160f81b03191690815f1a905350600101611255565b505f5b6020811015611313576112c881601f613032565b6112d3906008612d15565b86901c60f81b826112e5836004613059565b815181106112f5576112f5613045565b60200101906001600160f81b03191690815f1a9053506001016112b4565b505f5b600881101561137e5761132a816007613032565b611335906008612d15565b6001600160401b038616901c60f81b82611350836024613059565b8151811061136057611360613045565b60200101906001600160f81b03191690815f1a905350600101611316565b505f5b60088110156113e957611395816007613032565b6113a0906008612d15565b6001600160401b038516901c60f81b826113bb83602c613059565b815181106113cb576113cb613045565b60200101906001600160f81b03191690815f1a905350600101611381565b50949350505050565b6113fa612075565b611403826120c0565b61140c816120e4565b5050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f805160206132c983398151915290600160e01b900460ff165f03611455575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061149d9083613032565b106114b9576001600160401b03841660408301528082526114d8565b83826040018181516114cb919061306c565b6001600160401b03169052505b5f8260200151836040015160646114ef9190613093565b6114f991906130be565b600485015490915060ff600160e01b909104811690821611156115795760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610305565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602c146115e05760405162461bcd60e51b8152600401610305906130e3565b5f805b6004811015611631576115f7816003613032565b611602906008612d15565b63ffffffff1685828151811061161a5761161a613045565b016020015160f81c901b91909117906001016115e3565b5063ffffffff81166004146116585760405162461bcd60e51b81526004016103059061312a565b5f805b60208110156116ad5761166f81601f613032565b61167a906008612d15565b86611686836004613059565b8151811061169657611696613045565b016020015160f81c901b919091179060010161165b565b505f805b600881101561170c576116c5816007613032565b6116d0906008612d15565b6001600160401b0316876116e5836024613059565b815181106116f5576116f5613045565b016020015160f81c901b91909117906001016116b1565b50909590945092505050565b5f611721612198565b5f805160206132c9833981519152670de0b6b3a7640000851461176f5760405162461bcd60e51b815260206004820152600660248201526563616e61727960d01b6044820152606401610305565b8060020154620f4240146117af5760405162461bcd60e51b815260206004820152600760248201526631b0b730b93c9960c91b6044820152606401610305565b806003015462989680146117ef5760405162461bcd60e51b815260206004820152600760248201526663616e6172793360c81b6044820152606401610305565b42846001600160401b031611801561181b57506001600160401b038416611819426202a300613059565b115b61187b5760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610305565b856118c85760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610305565b5f868152600982016020526040902054156119345760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610305565b82516040146119965760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20496e76616c6964207369676e617475726044820152670ca40d8cadccee8d60c31b6064820152608401610305565b5f6119a0866121e2565b90505f6119ac82610393565b90508260020154816001600160401b0316101580156119d857508260030154816001600160401b031611155b611a305760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610305565b5f80611a776040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b0316815260200189815250612218565b5f82815260078801602052604090209193509150611a9582826131b3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ac2908590600401612c91565b6020604051808303815f875af1158015611ade573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b029190612cc3565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611b8857611b88612c5b565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610a6060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611cff5760405162461bcd60e51b8152600401610305906130e3565b5f805b6002811015611d4e57611d16816001613032565b611d21906008612d15565b61ffff16858281518110611d3757611d37613045565b016020015160f81c901b9190911790600101611d02565b5061ffff811615611dab5760405162461bcd60e51b815260206004820152602160248201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496044820152601160fa1b6064820152608401610305565b5f805b6004811015611e0657611dc2816003613032565b611dcd906008612d15565b63ffffffff1686611ddf836002613059565b81518110611def57611def613045565b016020015160f81c901b9190911790600101611dae565b5063ffffffff8116600214611e2d5760405162461bcd60e51b81526004016103059061312a565b5f805b6020811015611e8257611e4481601f613032565b611e4f906008612d15565b87611e5b836006613059565b81518110611e6b57611e6b613045565b016020015160f81c901b9190911790600101611e30565b505f86602681518110611e9757611e97613045565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603414611edb5760405162461bcd60e51b8152600401610305906130e3565b5f805b6004811015611f2c57611ef2816003613032565b611efd906008612d15565b63ffffffff16868281518110611f1557611f15613045565b016020015160f81c901b9190911790600101611ede565b5063ffffffff8116600114611f535760405162461bcd60e51b81526004016103059061312a565b5f805b6020811015611fa857611f6a81601f613032565b611f75906008612d15565b87611f81836004613059565b81518110611f9157611f91613045565b016020015160f81c901b9190911790600101611f56565b505f805b600881101561200757611fc0816007613032565b611fcb906008612d15565b6001600160401b031688611fe0836024613059565b81518110611ff057611ff0613045565b016020015160f81c901b9190911790600101611fac565b505f805b60088110156120665761201f816007613032565b61202a906008612d15565b6001600160401b03168961203f83602c613059565b8151811061204f5761204f613045565b016020015160f81c901b919091179060010161200b565b50919790965090945092505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166120be57604051631afcd79f60e31b815260040160405180910390fd5b565b6120c8612075565b6120d061233e565b6120d861234e565b6120e181612356565b50565b6120ec612075565b7f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f916001600160a01b0382166121785760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610305565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016121dc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6103a3827f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91546001600160a01b031690612486565b5f60605f80612226856125e8565b60408051609480825260c082019092529294509092505f91906020820181803683370190505090505f5b60048110156122a457612264816003613032565b61226f906008612d15565b5081515f9083908390811061228657612286613045565b60200101906001600160f81b03191690815f1a905350600101612250565b505f5b609081101561230b578281815181106122c2576122c2613045565b01602001516001600160f81b031916826122dd836004613059565b815181106122ed576122ed613045565b60200101906001600160f81b03191690815f1a9053506001016122a7565b5091959194509092505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612346612075565b6120be6128ce565b6120be612075565b61235e612075565b80355f805160206132c983398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab603556123f660a0830160808401612a6f565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561242960c0830160a08401613272565b60048201805460ff92909216600160e01b0260ff60e01b1990921691909117905561245a60e0830160c08401613292565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156124cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124f09190612cc3565b90506125076001600160a01b0385163330866128d6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561254b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256f9190612cc3565b90508181116125d55760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610305565b6125df8282613032565b95945050505050565b5f60608260800151516040146126525760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610305565b60408051609080825260c082019092525f916020820181803683370190505090505f5b60208110156126c5578451816020811061269157612691613045565b1a60f81b8282815181106126a7576126a7613045565b60200101906001600160f81b03191690815f1a905350600101612675565b505f5b602081101561272557846020015181602081106126e7576126e7613045565b1a60f81b826126f7836020613059565b8151811061270757612707613045565b60200101906001600160f81b03191690815f1a9053506001016126c8565b505f5b60088110156127995761273c816007613032565b612747906008612d15565b60ff1685604001516001600160401b0316901c60f81b8282604061276b9190613059565b8151811061277b5761277b613045565b60200101906001600160f81b03191690815f1a905350600101612728565b505f5b600881101561280b576127b0816007613032565b6127bb906008612d15565b60608601516001600160401b0390811691161c60f81b826127dd836048613059565b815181106127ed576127ed613045565b60200101906001600160f81b03191690815f1a90535060010161279c565b505f5b6040811015612876578460800151818151811061282d5761282d613045565b01602001516001600160f81b03191682612848836050613059565b8151811061285857612858613045565b60200101906001600160f81b03191690815f1a90535060010161280e565b5060028160405161288791906132ad565b602060405180830381855afa1580156128a2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128c59190612cc3565b94909350915050565b612318612075565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612930908590612936565b50505050565b5f8060205f8451602086015f885af180612955576040513d5f823e3d81fd5b50505f513d9150811561296c578060011415612979565b6001600160a01b0384163b155b1561293057604051635274afe760e01b81526001600160a01b0385166004820152602401610305565b5080546129ae90612f2b565b5f825580601f106129bd575050565b601f0160209004905f5260205f20908101906120e191905b808211156129e8575f81556001016129d5565b5090565b5f602082840312156129fc575f80fd5b5035919050565b6001600160a01b03811681146120e1575f80fd5b5f80828403610100811215612a2a575f80fd5b60e0811215612a37575f80fd5b5082915060e0830135612a4981612a03565b809150509250929050565b80356001600160401b0381168114612a6a575f80fd5b919050565b5f60208284031215612a7f575f80fd5b612a8882612a54565b9392505050565b80151581146120e1575f80fd5b803563ffffffff81168114612a6a575f80fd5b5f805f60608486031215612ac1575f80fd5b833592506020840135612ad381612a8f565b9150612ae160408501612a9c565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b2057612b20612aea565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612b4e57612b4e612aea565b604052919050565b5f6001600160401b03821115612b6e57612b6e612aea565b50601f01601f191660200190565b5f805f8060808587031215612b8f575f80fd5b8435935060208501359250612ba660408601612a54565b915060608501356001600160401b03811115612bc0575f80fd5b8501601f81018713612bd0575f80fd5b8035612be3612bde82612b56565b612b26565b818152886020838501011115612bf7575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612c28575f80fd5b612a8882612a9c565b5f8060408385031215612c42575f80fd5b612c4b83612a9c565b91506020830135612a4981612a8f565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612c89578181015183820152602001612c71565b50505f910152565b602081525f8251806020840152612caf816040850160208701612c6f565b601f01601f19169190910160400192915050565b5f60208284031215612cd3575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612d1057612d10612cda565b500490565b80820281158282048414176103a3576103a3612cee565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b8051612a6a81612a8f565b5f8060408385031215612d92575f80fd5b82516001600160401b0380821115612da8575f80fd5b9084019060608287031215612dbb575f80fd5b612dc3612afe565b82518152602080840151612dd681612a03565b82820152604084015183811115612deb575f80fd5b80850194505087601f850112612dff575f80fd5b83519250612e0f612bde84612b56565b8381528882858701011115612e22575f80fd5b612e3184838301848801612c6f565b80604084015250819550612e46818801612d76565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612f3f57607f821691505b602082108103612f5d57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612fba81612f2b565b806020870152604060018084165f8114612fdb5760018114612ff757613024565b60ff19851660408a0152604084151560051b8a01019550613024565b895f5260205f205f5b8581101561301b5781548b8201860152908301908801613000565b8a016040019650505b509398975050505050505050565b818103818111156103a3576103a3612cee565b634e487b7160e01b5f52603260045260245ffd5b808201808211156103a3576103a3612cee565b6001600160401b0381811683821601908082111561308c5761308c612cee565b5092915050565b6001600160401b038181168382160280821691908281146130b6576130b6612cee565b505092915050565b5f6001600160401b03808416806130d7576130d7612cda565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e0457805f5260205f20601f840160051c810160208510156131945750805b601f840160051c820191505b8181101561038c575f81556001016131a0565b81516001600160401b038111156131cc576131cc612aea565b6131e0816131da8454612f2b565b8461316f565b602080601f831160018114613213575f84156131fc5750858301515b5f19600386901b1c1916600185901b17855561326a565b5f85815260208120601f198616915b8281101561324157888601518255948401946001909101908401613222565b508582101561325e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215613282575f80fd5b813560ff81168114612a88575f80fd5b5f602082840312156132a2575f80fd5b8135612a8881612a03565b5f82516132be818460208701612c6f565b919091019291505056feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516134a03803806134a083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6133538061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f5780632e2194d8146100b45780635d0d7466146100e457806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612a09565b61019d565b005b6100c76100c2366004612a09565b610393565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26100f2366004612a34565b6103a9565b61010a610105366004612a8c565b6104b7565b6040519081526020016100db565b6100b2610126366004612acc565b6104d0565b61010a610139366004612b99565b610a50565b6100b261014c366004612c35565b610a68565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100db565b6100b2610185366004612a09565b610cf5565b6100b2610198366004612c4e565b610e09565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061332783398151915293929190829060ff1660058111156101fe576101fe612c78565b600581111561020f5761020f612c78565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612c78565b1461030e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61031f848361010001515f611230565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034c908490600401612cae565b6020604051808303815f875af1158015610368573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038c9190612ce0565b5050505050565b5f6103a364e8d4a5100083612d1f565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103ed5750825b90505f826001600160401b031660011480156104085750303b155b905081158015610416575080155b156104345760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045e57845460ff60401b1916600160401b1785555b610468878761144d565b83156104ae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6103a36001600160401b03831664e8d4a51000612d32565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061332783398151915293929190829060ff16600581111561053157610531612c78565b600581111561054257610542612c78565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156105dc576105dc612c78565b146106355760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610305565b60c08101516001600160a01b0316336001600160a01b03161461066a5760405162461bcd60e51b815260040161030590612d49565b610677816040015161146b565b60038152426001600160401b031660808201525f8415610850576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156106da573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107019190810190612d9e565b91509150806107225760405162461bcd60e51b815260040161030590612e70565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107899190612ce0565b8251146107a85760405162461bcd60e51b815260040161030590612eb4565b60208201516001600160a01b0316156107d35760405162461bcd60e51b815260040161030590612efb565b5f806107e28460400151611618565b91509150818a1461084a5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610305565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff1916600183600581111561089057610890612c78565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f9061098190889083611230565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109b0908590600401612cae565b6020604051808303815f875af11580156109cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f09190612ce0565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f610a5d848685856117f0565b90505b949350505050565b5f5f805160206133278339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ac3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610aea9190810190612d9e565b9150915080610b0b5760405162461bcd60e51b815260040161030590612e70565b8254825114610b2c5760405162461bcd60e51b815260040161030590612eb4565b60208201516001600160a01b031615610b575760405162461bcd60e51b815260040161030590612efb565b5f80610b668460400151611cf7565b9150915080610bc65760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610305565b5f82815260078601602052604081208054610be090612f48565b9050118015610c12575060015f83815260088701602052604090205460ff166005811115610c1057610c10612c78565b145b610c2e5760405162461bcd60e51b815260040161030590612f80565b5f8281526007860160205260408120610c46916129bf565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020613327833981519152929190610d3d90612f48565b9050118015610d6f575060015f83815260088301602052604090205460ff166005811115610d6d57610d6d612c78565b145b610d8b5760405162461bcd60e51b815260040161030590612f80565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dc49190600401612fc5565b6020604051808303815f875af1158015610de0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e049190612ce0565b505050565b5f5f805160206133278339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8b9190810190612d9e565b9150915080610eac5760405162461bcd60e51b815260040161030590612e70565b5f8415610f25575f610ec18460400151611e98565b919350909150506001600160401b03811615610f1f5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610305565b50610f99565b5f610f338460400151611cf7565b90925090508015610f975760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610305565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115610fcb57610fcb612c78565b6005811115610fdc57610fdc612c78565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b9092049093166101009092019190915282015191925016331461108d5760405162461bcd60e51b815260040161030590612d49565b5f6003825160058111156110a3576110a3612c78565b14806110c157506002825160058111156110bf576110bf612c78565b145b156110e457506020808201515f90815260098701909152604081205560046110e8565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561111957611119612c78565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156112a95761126981600161304f565b611274906008612d32565b5081515f9083908390811061128b5761128b613062565b60200101906001600160f81b03191690815f1a905350600101611255565b505f5b600481101561130c576112c081600361304f565b6112cb906008612d32565b6001901c60f81b826112de836002613076565b815181106112ee576112ee613062565b60200101906001600160f81b03191690815f1a9053506001016112ac565b505f5b602081101561136e5761132381601f61304f565b61132e906008612d32565b86901c60f81b82611340836006613076565b8151811061135057611350613062565b60200101906001600160f81b03191690815f1a90535060010161130f565b505f5b60088110156113d95761138581600761304f565b611390906008612d32565b6001600160401b038616901c60f81b826113ab836026613076565b815181106113bb576113bb613062565b60200101906001600160f81b03191690815f1a905350600101611371565b505f5b6008811015611444576113f081600761304f565b6113fb906008612d32565b6001600160401b038516901c60f81b8261141683602e613076565b8151811061142657611426613062565b60200101906001600160f81b03191690815f1a9053506001016113dc565b50949350505050565b6114556120d3565b61145e8261211e565b61146781612142565b5050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f8051602061332783398151915290600160e01b900460ff165f036114b0575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906114f8908361304f565b10611514576001600160401b0384166040830152808252611533565b83826040018181516115269190613089565b6001600160401b03169052505b5f82602001518360400151606461154a91906130b0565b61155491906130db565b600485015490915060ff600160e01b909104811690821611156115d45760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610305565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602e1461163b5760405162461bcd60e51b815260040161030590613100565b5f805b600281101561168a5761165281600161304f565b61165d906008612d32565b61ffff1685828151811061167357611673613062565b016020015160f81c901b919091179060010161163e565b5061ffff8116156116ad5760405162461bcd60e51b815260040161030590613147565b5f805b6004811015611708576116c481600361304f565b6116cf906008612d32565b63ffffffff16866116e1836002613076565b815181106116f1576116f1613062565b016020015160f81c901b91909117906001016116b0565b5063ffffffff811660041461172f5760405162461bcd60e51b815260040161030590613188565b5f805b60208110156117845761174681601f61304f565b611751906008612d32565b8761175d836006613076565b8151811061176d5761176d613062565b016020015160f81c901b9190911790600101611732565b505f805b60088110156117e35761179c81600761304f565b6117a7906008612d32565b6001600160401b0316886117bc836026613076565b815181106117cc576117cc613062565b016020015160f81c901b9190911790600101611788565b5090969095509350505050565b5f6117f96121f6565b5f80516020613327833981519152426001600160401b03851611801561183357506001600160401b038416611831426202a300613076565b115b6118935760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610305565b856118e05760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610305565b5f8681526009820160205260409020541561194c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610305565b82516030146119b15760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610305565b5f6119bb86612240565b90505f6119c782610393565b90508260020154816001600160401b0316101580156119f357508260030154816001600160401b031611155b611a4b5760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610305565b5f80611a926040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b0316815260200189815250612276565b5f82815260078801602052604090209193509150611ab08282613211565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611add908590600401612cae565b6020604051808303815f875af1158015611af9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1d9190612ce0565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611ba357611ba3612c78565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610a6060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611d1a5760405162461bcd60e51b815260040161030590613100565b5f805b6002811015611d6957611d3181600161304f565b611d3c906008612d32565b61ffff16858281518110611d5257611d52613062565b016020015160f81c901b9190911790600101611d1d565b5061ffff811615611d8c5760405162461bcd60e51b815260040161030590613147565b5f805b6004811015611de757611da381600361304f565b611dae906008612d32565b63ffffffff1686611dc0836002613076565b81518110611dd057611dd0613062565b016020015160f81c901b9190911790600101611d8f565b5063ffffffff8116600214611e0e5760405162461bcd60e51b815260040161030590613188565b5f805b6020811015611e6357611e2581601f61304f565b611e30906008612d32565b87611e3c836006613076565b81518110611e4c57611e4c613062565b016020015160f81c901b9190911790600101611e11565b505f86602681518110611e7857611e78613062565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611ebc5760405162461bcd60e51b815260040161030590613100565b5f805b6002811015611f0b57611ed381600161304f565b611ede906008612d32565b61ffff16868281518110611ef457611ef4613062565b016020015160f81c901b9190911790600101611ebf565b5061ffff811615611f2e5760405162461bcd60e51b815260040161030590613147565b5f805b6004811015611f8957611f4581600361304f565b611f50906008612d32565b63ffffffff1687611f62836002613076565b81518110611f7257611f72613062565b016020015160f81c901b9190911790600101611f31565b5063ffffffff8116600114611fb05760405162461bcd60e51b815260040161030590613188565b5f805b602081101561200557611fc781601f61304f565b611fd2906008612d32565b88611fde836006613076565b81518110611fee57611fee613062565b016020015160f81c901b9190911790600101611fb3565b505f805b60088110156120645761201d81600761304f565b612028906008612d32565b6001600160401b03168961203d836026613076565b8151811061204d5761204d613062565b016020015160f81c901b9190911790600101612009565b505f805b60088110156120c35761207c81600761304f565b612087906008612d32565b6001600160401b03168a61209c83602e613076565b815181106120ac576120ac613062565b016020015160f81c901b9190911790600101612068565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661211c57604051631afcd79f60e31b815260040160405180910390fd5b565b6121266120d3565b61212e612641565b612136612651565b61213f81612659565b50565b61214a6120d3565b7f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f916001600160a01b0382166121d65760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610305565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161223a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6103a3827f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91546001600160a01b031690612789565b5f60608260800151516030146122e05760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610305565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156123575761231781600161304f565b612322906008612d32565b5081515f9083908390811061233957612339613062565b60200101906001600160f81b03191690815f1a905350600101612303565b505f5b60048110156123b55761236e81600361304f565b612379906008612d32565b505f82612387836002613076565b8151811061239757612397613062565b60200101906001600160f81b03191690815f1a90535060010161235a565b505f5b602081101561241257845181602081106123d4576123d4613062565b1a60f81b826123e4836006613076565b815181106123f4576123f4613062565b60200101906001600160f81b03191690815f1a9053506001016123b8565b505f5b6020811015612472578460200151816020811061243457612434613062565b1a60f81b82612444836026613076565b8151811061245457612454613062565b60200101906001600160f81b03191690815f1a905350600101612415565b505f5b60088110156124e65761248981600761304f565b612494906008612d32565b60ff1685604001516001600160401b0316901c60f81b828260466124b89190613076565b815181106124c8576124c8613062565b60200101906001600160f81b03191690815f1a905350600101612475565b505f5b6030811015612551578460800151818151811061250857612508613062565b01602001516001600160f81b0319168261252383604e613076565b8151811061253357612533613062565b60200101906001600160f81b03191690815f1a9053506001016124e9565b505f5b60088110156125c35761256881600761304f565b612573906008612d32565b60608601516001600160401b0390811691161c60f81b8261259583607e613076565b815181106125a5576125a5613062565b60200101906001600160f81b03191690815f1a905350600101612554565b506002816040516125d491906132d0565b602060405180830381855afa1580156125ef573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906126129190612ce0565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126496120d3565b61211c6128eb565b61211c6120d3565b6126616120d3565b80355f8051602061332783398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab603556126f960a0830160808401612a8c565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561272c60c0830160a084016132eb565b60048201805460ff92909216600160e01b0260ff60e01b1990921691909117905561275d60e0830160c0840161330b565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156127cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f39190612ce0565b905061280a6001600160a01b0385163330866128f3565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561284e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128729190612ce0565b90508181116128d85760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610305565b6128e2828261304f565b95945050505050565b61261b6120d3565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261294d908590612953565b50505050565b5f8060205f8451602086015f885af180612972576040513d5f823e3d81fd5b50505f513d91508115612989578060011415612996565b6001600160a01b0384163b155b1561294d57604051635274afe760e01b81526001600160a01b0385166004820152602401610305565b5080546129cb90612f48565b5f825580601f106129da575050565b601f0160209004905f5260205f209081019061213f91905b80821115612a05575f81556001016129f2565b5090565b5f60208284031215612a19575f80fd5b5035919050565b6001600160a01b038116811461213f575f80fd5b5f80828403610100811215612a47575f80fd5b60e0811215612a54575f80fd5b5082915060e0830135612a6681612a20565b809150509250929050565b80356001600160401b0381168114612a87575f80fd5b919050565b5f60208284031215612a9c575f80fd5b612aa582612a71565b9392505050565b801515811461213f575f80fd5b803563ffffffff81168114612a87575f80fd5b5f805f60608486031215612ade575f80fd5b833592506020840135612af081612aac565b9150612afe60408501612ab9565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b3d57612b3d612b07565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612b6b57612b6b612b07565b604052919050565b5f6001600160401b03821115612b8b57612b8b612b07565b50601f01601f191660200190565b5f805f8060808587031215612bac575f80fd5b8435935060208501359250612bc360408601612a71565b915060608501356001600160401b03811115612bdd575f80fd5b8501601f81018713612bed575f80fd5b8035612c00612bfb82612b73565b612b43565b818152886020838501011115612c14575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612c45575f80fd5b612aa582612ab9565b5f8060408385031215612c5f575f80fd5b612c6883612ab9565b91506020830135612a6681612aac565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612ca6578181015183820152602001612c8e565b50505f910152565b602081525f8251806020840152612ccc816040850160208701612c8c565b601f01601f19169190910160400192915050565b5f60208284031215612cf0575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612d2d57612d2d612cf7565b500490565b80820281158282048414176103a3576103a3612d0b565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b8051612a8781612aac565b5f8060408385031215612daf575f80fd5b82516001600160401b0380821115612dc5575f80fd5b9084019060608287031215612dd8575f80fd5b612de0612b1b565b82518152602080840151612df381612a20565b82820152604084015183811115612e08575f80fd5b80850194505087601f850112612e1c575f80fd5b83519250612e2c612bfb84612b73565b8381528882858701011115612e3f575f80fd5b612e4e84838301848801612c8c565b80604084015250819550612e63818801612d93565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612f5c57607f821691505b602082108103612f7a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612fd781612f48565b806020870152604060018084165f8114612ff8576001811461301457613041565b60ff19851660408a0152604084151560051b8a01019550613041565b895f5260205f205f5b858110156130385781548b820186015290830190880161301d565b8a016040019650505b509398975050505050505050565b818103818111156103a3576103a3612d0b565b634e487b7160e01b5f52603260045260245ffd5b808201808211156103a3576103a3612d0b565b6001600160401b038181168382160190808211156130a9576130a9612d0b565b5092915050565b6001600160401b038181168382160280821691908281146130d3576130d3612d0b565b505092915050565b5f6001600160401b03808416806130f4576130f4612cf7565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e0457805f5260205f20601f840160051c810160208510156131f25750805b601f840160051c820191505b8181101561038c575f81556001016131fe565b81516001600160401b0381111561322a5761322a612b07565b61323e816132388454612f48565b846131cd565b602080601f831160018114613271575f841561325a5750858301515b5f19600386901b1c1916600185901b1785556132c8565b5f85815260208120601f198616915b8281101561329f57888601518255948401946001909101908401613280565b50858210156132bc57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f82516132e1818460208701612c8c565b9190910192915050565b5f602082840312156132fb575f80fd5b813560ff81168114612aa5575f80fd5b5f6020828403121561331b575f80fd5b8135612aa581612a2056feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 07a0c3cb5..ebb39787d 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -43,7 +43,7 @@ type StakingManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161313d38038061313d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612ff08061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780632e2194d8146100b457806362065856146100f057806376f786211461011d57806379f54eb11461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad366004612717565b6101fd565b005b3480156100bf575f80fd5b506100d36100ce366004612717565b6103f3565b6040516001600160401b0390911681526020015b60405180910390f35b3480156100fb575f80fd5b5061010f61010a366004612749565b610409565b6040519081526020016100e7565b348015610128575f80fd5b506100b2610137366004612789565b610422565b348015610147575f80fd5b506100b26101563660046127c4565b6109a2565b348015610166575f80fd5b506100b26101753660046127da565b610aae565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b0390911681526020016100e7565b3480156101b7575f80fd5b506100b26101c6366004612717565b610d3b565b61010f6101d9366004612885565b610e4f565b3480156101e9575f80fd5b506100b26101f8366004612917565b610e64565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612fc483398151915293929190829060ff16600581111561025e5761025e61294c565b600581111561026f5761026f61294c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156103065761030661294c565b1461036e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61037f848361010001515f61128b565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ac908490600401612982565b6020604051808303815f875af11580156103c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ec91906129b4565b5050505050565b5f61040364e8d4a51000836129f3565b92915050565b5f6104036001600160401b03831664e8d4a51000612a06565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612fc483398151915293929190829060ff1660058111156104835761048361294c565b60058111156104945761049461294c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561052e5761052e61294c565b146105875760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610365565b60c08101516001600160a01b0316336001600160a01b0316146105bc5760405162461bcd60e51b815260040161036590612a1d565b6105c9816040015161144d565b60038152426001600160401b031660808201525f84156107a2576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561062c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106539190810190612a86565b91509150806106745760405162461bcd60e51b815260040161036590612b58565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906129b4565b8251146106fa5760405162461bcd60e51b815260040161036590612b9c565b60208201516001600160a01b0316156107255760405162461bcd60e51b815260040161036590612be3565b5f8061073484604001516115fa565b91509150818a1461079c5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610365565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff191660018360058111156107e2576107e261294c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f906108d39088908361128b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90610902908590600401612982565b6020604051808303815f875af115801561091e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094291906129b4565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156109e65750825b90505f826001600160401b03166001148015610a015750303b155b905081158015610a0f575080155b15610a2d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a5757845460ff60401b1916600160401b1785555b610a6086611755565b8315610aa657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f5f80516020612fc48339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b09573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b309190810190612a86565b9150915080610b515760405162461bcd60e51b815260040161036590612b58565b8254825114610b725760405162461bcd60e51b815260040161036590612b9c565b60208201516001600160a01b031615610b9d5760405162461bcd60e51b815260040161036590612be3565b5f80610bac8460400151611769565b9150915080610c0c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610365565b5f82815260078601602052604081208054610c2690612c30565b9050118015610c58575060015f83815260088701602052604090205460ff166005811115610c5657610c5661294c565b145b610c745760405162461bcd60e51b815260040161036590612c62565b5f8281526007860160205260408120610c8c916126cd565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020612fc4833981519152929190610d8390612c30565b9050118015610db5575060015f83815260088301602052604090205460ff166005811115610db357610db361294c565b145b610dd15760405162461bcd60e51b815260040161036590612c62565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e0a9190600401612ca7565b6020604051808303815f875af1158015610e26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4a91906129b4565b505050565b5f610e5c84348585611944565b949350505050565b5f5f80516020612fc48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ebf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ee69190810190612a86565b9150915080610f075760405162461bcd60e51b815260040161036590612b58565b5f8415610f80575f610f1c8460400151611efd565b919350909150506001600160401b03811615610f7a5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610365565b50610ff4565b5f610f8e8460400151611769565b90925090508015610ff25760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610365565b505b5f818152600885016020526040808220815161012081019092528054829060ff1660058111156110265761102661294c565b60058111156110375761103761294c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110e85760405162461bcd60e51b815260040161036590612a1d565b5f6003825160058111156110fe576110fe61294c565b148061111c575060028251600581111561111a5761111a61294c565b145b1561113f57506020808201515f9081526009870190915260408120556004611143565b5060055b5f83815260088701602052604090208251815484929190829060ff191660018360058111156111745761117461294c565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603480825260608281019093525f91906020820181803683370190505090505f5b600481101561130c576112c4816003612d31565b6112cf906008612a06565b600163ffffffff16901c60f81b8282815181106112ee576112ee612d44565b60200101906001600160f81b03191690815f1a9053506001016112b0565b505f5b602081101561136e5761132381601f612d31565b61132e906008612a06565b86901c60f81b82611340836004612d58565b8151811061135057611350612d44565b60200101906001600160f81b03191690815f1a90535060010161130f565b505f5b60088110156113d957611385816007612d31565b611390906008612a06565b6001600160401b038616901c60f81b826113ab836024612d58565b815181106113bb576113bb612d44565b60200101906001600160f81b03191690815f1a905350600101611371565b505f5b6008811015611444576113f0816007612d31565b6113fb906008612a06565b6001600160401b038516901c60f81b8261141683602c612d58565b8151811061142657611426612d44565b60200101906001600160f81b03191690815f1a9053506001016113dc565b50949350505050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f80516020612fc483398151915290600160e01b900460ff165f03611492575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906114da9083612d31565b106114f6576001600160401b0384166040830152808252611515565b83826040018181516115089190612d6b565b6001600160401b03169052505b5f82602001518360400151606461152c9190612d92565b6115369190612dbd565b600485015490915060ff600160e01b909104811690821611156115b65760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610365565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602c1461161d5760405162461bcd60e51b815260040161036590612de2565b5f805b600481101561166e57611634816003612d31565b61163f906008612a06565b63ffffffff1685828151811061165757611657612d44565b016020015160f81c901b9190911790600101611620565b5063ffffffff81166004146116955760405162461bcd60e51b815260040161036590612e29565b5f805b60208110156116ea576116ac81601f612d31565b6116b7906008612a06565b866116c3836004612d58565b815181106116d3576116d3612d44565b016020015160f81c901b9190911790600101611698565b505f805b600881101561174957611702816007612d31565b61170d906008612a06565b6001600160401b031687611722836024612d58565b8151811061173257611732612d44565b016020015160f81c901b91909117906001016116ee565b50909590945092505050565b61175d6120bb565b61176681612106565b50565b5f80825160271461178c5760405162461bcd60e51b815260040161036590612de2565b5f805b60028110156117db576117a3816001612d31565b6117ae906008612a06565b61ffff168582815181106117c4576117c4612d44565b016020015160f81c901b919091179060010161178f565b5061ffff8116156118385760405162461bcd60e51b815260206004820152602160248201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496044820152601160fa1b6064820152608401610365565b5f805b60048110156118935761184f816003612d31565b61185a906008612a06565b63ffffffff168661186c836002612d58565b8151811061187c5761187c612d44565b016020015160f81c901b919091179060010161183b565b5063ffffffff81166002146118ba5760405162461bcd60e51b815260040161036590612e29565b5f805b602081101561190f576118d181601f612d31565b6118dc906008612a06565b876118e8836006612d58565b815181106118f8576118f8612d44565b016020015160f81c901b91909117906001016118bd565b505f8660268151811061192457611924612d44565b016020015191976001600160f81b03199092161515965090945050505050565b5f61194d612127565b5f80516020612fc4833981519152670de0b6b3a7640000851461199b5760405162461bcd60e51b815260206004820152600660248201526563616e61727960d01b6044820152606401610365565b8060020154620f4240146119db5760405162461bcd60e51b815260206004820152600760248201526631b0b730b93c9960c91b6044820152606401610365565b80600301546298968014611a1b5760405162461bcd60e51b815260206004820152600760248201526663616e6172793360c81b6044820152606401610365565b42846001600160401b0316118015611a4757506001600160401b038416611a45426202a300612d58565b115b611aa75760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610365565b85611af45760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610365565b5f86815260098201602052604090205415611b605760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610365565b8251604014611bc25760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20496e76616c6964207369676e617475726044820152670ca40d8cadccee8d60c31b6064820152608401610365565b845f611bcd826103f3565b90508260020154816001600160401b031610158015611bf957508260030154816001600160401b031611155b611c515760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610365565b5f80611c986040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b0316815260200189815250612171565b5f82815260078801602052604090209193509150611cb68282612eb2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ce3908590600401612982565b6020604051808303815f875af1158015611cff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d2391906129b4565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611da957611da961294c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610e5c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603414611f215760405162461bcd60e51b815260040161036590612de2565b5f805b6004811015611f7257611f38816003612d31565b611f43906008612a06565b63ffffffff16868281518110611f5b57611f5b612d44565b016020015160f81c901b9190911790600101611f24565b5063ffffffff8116600114611f995760405162461bcd60e51b815260040161036590612e29565b5f805b6020811015611fee57611fb081601f612d31565b611fbb906008612a06565b87611fc7836004612d58565b81518110611fd757611fd7612d44565b016020015160f81c901b9190911790600101611f9c565b505f805b600881101561204d57612006816007612d31565b612011906008612a06565b6001600160401b031688612026836024612d58565b8151811061203657612036612d44565b016020015160f81c901b9190911790600101611ff2565b505f805b60088110156120ac57612065816007612d31565b612070906008612a06565b6001600160401b03168961208583602c612d58565b8151811061209557612095612d44565b016020015160f81c901b9190911790600101612051565b50919790965090945092505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661210457604051631afcd79f60e31b815260040160405180910390fd5b565b61210e6120bb565b612116612297565b61211e6122a7565b611766816122af565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161216b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60605f8061217f856123df565b60408051609480825260c082019092529294509092505f91906020820181803683370190505090505f5b60048110156121fd576121bd816003612d31565b6121c8906008612a06565b5081515f908390839081106121df576121df612d44565b60200101906001600160f81b03191690815f1a9053506001016121a9565b505f5b60908110156122645782818151811061221b5761221b612d44565b01602001516001600160f81b03191682612236836004612d58565b8151811061224657612246612d44565b60200101906001600160f81b03191690815f1a905350600101612200565b5091959194509092505050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61229f6120bb565b6121046126c5565b6121046120bb565b6122b76120bb565b80355f80516020612fc483398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561234f60a0830160808401612749565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561238260c0830160a08401612f6d565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556123b360e0830160c08401612f8d565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b5f60608260800151516040146124495760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610365565b60408051609080825260c082019092525f916020820181803683370190505090505f5b60208110156124bc578451816020811061248857612488612d44565b1a60f81b82828151811061249e5761249e612d44565b60200101906001600160f81b03191690815f1a90535060010161246c565b505f5b602081101561251c57846020015181602081106124de576124de612d44565b1a60f81b826124ee836020612d58565b815181106124fe576124fe612d44565b60200101906001600160f81b03191690815f1a9053506001016124bf565b505f5b600881101561259057612533816007612d31565b61253e906008612a06565b60ff1685604001516001600160401b0316901c60f81b828260406125629190612d58565b8151811061257257612572612d44565b60200101906001600160f81b03191690815f1a90535060010161251f565b505f5b6008811015612602576125a7816007612d31565b6125b2906008612a06565b60608601516001600160401b0390811691161c60f81b826125d4836048612d58565b815181106125e4576125e4612d44565b60200101906001600160f81b03191690815f1a905350600101612593565b505f5b604081101561266d578460800151818151811061262457612624612d44565b01602001516001600160f81b0319168261263f836050612d58565b8151811061264f5761264f612d44565b60200101906001600160f81b03191690815f1a905350600101612605565b5060028160405161267e9190612fa8565b602060405180830381855afa158015612699573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906126bc91906129b4565b94909350915050565b6122716120bb565b5080546126d990612c30565b5f825580601f106126e8575050565b601f0160209004905f5260205f209081019061176691905b80821115612713575f8155600101612700565b5090565b5f60208284031215612727575f80fd5b5035919050565b80356001600160401b0381168114612744575f80fd5b919050565b5f60208284031215612759575f80fd5b6127628261272e565b9392505050565b8015158114611766575f80fd5b803563ffffffff81168114612744575f80fd5b5f805f6060848603121561279b575f80fd5b8335925060208401356127ad81612769565b91506127bb60408501612776565b90509250925092565b5f60e082840312156127d4575f80fd5b50919050565b5f602082840312156127ea575f80fd5b61276282612776565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612829576128296127f3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612857576128576127f3565b604052919050565b5f6001600160401b03821115612877576128776127f3565b50601f01601f191660200190565b5f805f60608486031215612897575f80fd5b833592506128a76020850161272e565b915060408401356001600160401b038111156128c1575f80fd5b8401601f810186136128d1575f80fd5b80356128e46128df8261285f565b61282f565b8181528760208385010111156128f8575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612928575f80fd5b61293183612776565b9150602083013561294181612769565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561297a578181015183820152602001612962565b50505f910152565b602081525f82518060208401526129a0816040850160208701612960565b601f01601f19169190910160400192915050565b5f602082840312156129c4575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612a0157612a016129cb565b500490565b8082028115828204841417610403576104036129df565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b6001600160a01b0381168114611766575f80fd5b805161274481612769565b5f8060408385031215612a97575f80fd5b82516001600160401b0380821115612aad575f80fd5b9084019060608287031215612ac0575f80fd5b612ac8612807565b82518152602080840151612adb81612a67565b82820152604084015183811115612af0575f80fd5b80850194505087601f850112612b04575f80fd5b83519250612b146128df8461285f565b8381528882858701011115612b27575f80fd5b612b3684838301848801612960565b80604084015250819550612b4b818801612a7b565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612c4457607f821691505b6020821081036127d457634e487b7160e01b5f52602260045260245ffd5b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612cb981612c30565b806020870152604060018084165f8114612cda5760018114612cf657612d23565b60ff19851660408a0152604084151560051b8a01019550612d23565b895f5260205f205f5b85811015612d1a5781548b8201860152908301908801612cff565b8a016040019650505b509398975050505050505050565b81810381811115610403576104036129df565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610403576104036129df565b6001600160401b03818116838216019080821115612d8b57612d8b6129df565b5092915050565b6001600160401b03818116838216028082169190828114612db557612db56129df565b505092915050565b5f6001600160401b0380841680612dd657612dd66129cb565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e4a57805f5260205f20601f840160051c81016020851015612e935750805b601f840160051c820191505b818110156103ec575f8155600101612e9f565b81516001600160401b03811115612ecb57612ecb6127f3565b612edf81612ed98454612c30565b84612e6e565b602080601f831160018114612f12575f8415612efb5750858301515b5f19600386901b1c1916600185901b178555610aa6565b5f85815260208120601f198616915b82811015612f4057888601518255948401946001909101908401612f21565b5085821015612f5d57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612f7d575f80fd5b813560ff81168114612762575f80fd5b5f60208284031215612f9d575f80fd5b813561276281612a67565b5f8251612fb9818460208701612960565b919091019291505056feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161319b38038061319b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61304e8061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780632e2194d8146100b457806362065856146100f057806376f786211461011d57806379f54eb11461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad366004612734565b6101fd565b005b3480156100bf575f80fd5b506100d36100ce366004612734565b6103f3565b6040516001600160401b0390911681526020015b60405180910390f35b3480156100fb575f80fd5b5061010f61010a366004612766565b610409565b6040519081526020016100e7565b348015610128575f80fd5b506100b26101373660046127a6565b610422565b348015610147575f80fd5b506100b26101563660046127e1565b6109a2565b348015610166575f80fd5b506100b26101753660046127f7565b610aae565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b0390911681526020016100e7565b3480156101b7575f80fd5b506100b26101c6366004612734565b610d3b565b61010f6101d93660046128a2565b610e4f565b3480156101e9575f80fd5b506100b26101f8366004612934565b610e64565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061302283398151915293929190829060ff16600581111561025e5761025e612969565b600581111561026f5761026f612969565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561030657610306612969565b1461036e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61037f848361010001515f61128b565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ac90849060040161299f565b6020604051808303815f875af11580156103c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ec91906129d1565b5050505050565b5f61040364e8d4a5100083612a10565b92915050565b5f6104036001600160401b03831664e8d4a51000612a23565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061302283398151915293929190829060ff16600581111561048357610483612969565b600581111561049457610494612969565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561052e5761052e612969565b146105875760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610365565b60c08101516001600160a01b0316336001600160a01b0316146105bc5760405162461bcd60e51b815260040161036590612a3a565b6105c981604001516114a8565b60038152426001600160401b031660808201525f84156107a2576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561062c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106539190810190612aa3565b91509150806106745760405162461bcd60e51b815260040161036590612b75565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906129d1565b8251146106fa5760405162461bcd60e51b815260040161036590612bb9565b60208201516001600160a01b0316156107255760405162461bcd60e51b815260040161036590612c00565b5f806107348460400151611655565b91509150818a1461079c5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610365565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff191660018360058111156107e2576107e2612969565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f906108d39088908361128b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061090290859060040161299f565b6020604051808303815f875af115801561091e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094291906129d1565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156109e65750825b90505f826001600160401b03166001148015610a015750303b155b905081158015610a0f575080155b15610a2d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a5757845460ff60401b1916600160401b1785555b610a608661182d565b8315610aa657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f5f805160206130228339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b09573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b309190810190612aa3565b9150915080610b515760405162461bcd60e51b815260040161036590612b75565b8254825114610b725760405162461bcd60e51b815260040161036590612bb9565b60208201516001600160a01b031615610b9d5760405162461bcd60e51b815260040161036590612c00565b5f80610bac8460400151611841565b9150915080610c0c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610365565b5f82815260078601602052604081208054610c2690612c4d565b9050118015610c58575060015f83815260088701602052604090205460ff166005811115610c5657610c56612969565b145b610c745760405162461bcd60e51b815260040161036590612c7f565b5f8281526007860160205260408120610c8c916126ea565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020613022833981519152929190610d8390612c4d565b9050118015610db5575060015f83815260088301602052604090205460ff166005811115610db357610db3612969565b145b610dd15760405162461bcd60e51b815260040161036590612c7f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e0a9190600401612cc4565b6020604051808303815f875af1158015610e26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4a91906129d1565b505050565b5f610e5c843485856119e2565b949350505050565b5f5f805160206130228339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ebf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ee69190810190612aa3565b9150915080610f075760405162461bcd60e51b815260040161036590612b75565b5f8415610f80575f610f1c8460400151611ede565b919350909150506001600160401b03811615610f7a5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610365565b50610ff4565b5f610f8e8460400151611841565b90925090508015610ff25760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610365565b505b5f818152600885016020526040808220815161012081019092528054829060ff16600581111561102657611026612969565b600581111561103757611037612969565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110e85760405162461bcd60e51b815260040161036590612a3a565b5f6003825160058111156110fe576110fe612969565b148061111c575060028251600581111561111a5761111a612969565b145b1561113f57506020808201515f9081526009870190915260408120556004611143565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561117457611174612969565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611304576112c4816001612d4e565b6112cf906008612a23565b5081515f908390839081106112e6576112e6612d61565b60200101906001600160f81b03191690815f1a9053506001016112b0565b505f5b60048110156113675761131b816003612d4e565b611326906008612a23565b6001901c60f81b82611339836002612d75565b8151811061134957611349612d61565b60200101906001600160f81b03191690815f1a905350600101611307565b505f5b60208110156113c95761137e81601f612d4e565b611389906008612a23565b86901c60f81b8261139b836006612d75565b815181106113ab576113ab612d61565b60200101906001600160f81b03191690815f1a90535060010161136a565b505f5b6008811015611434576113e0816007612d4e565b6113eb906008612a23565b6001600160401b038616901c60f81b82611406836026612d75565b8151811061141657611416612d61565b60200101906001600160f81b03191690815f1a9053506001016113cc565b505f5b600881101561149f5761144b816007612d4e565b611456906008612a23565b6001600160401b038516901c60f81b8261147183602e612d75565b8151811061148157611481612d61565b60200101906001600160f81b03191690815f1a905350600101611437565b50949350505050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f8051602061302283398151915290600160e01b900460ff165f036114ed575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906115359083612d4e565b10611551576001600160401b0384166040830152808252611570565b83826040018181516115639190612d88565b6001600160401b03169052505b5f8260200151836040015160646115879190612daf565b6115919190612dda565b600485015490915060ff600160e01b909104811690821611156116115760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610365565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602e146116785760405162461bcd60e51b815260040161036590612dff565b5f805b60028110156116c75761168f816001612d4e565b61169a906008612a23565b61ffff168582815181106116b0576116b0612d61565b016020015160f81c901b919091179060010161167b565b5061ffff8116156116ea5760405162461bcd60e51b815260040161036590612e46565b5f805b600481101561174557611701816003612d4e565b61170c906008612a23565b63ffffffff168661171e836002612d75565b8151811061172e5761172e612d61565b016020015160f81c901b91909117906001016116ed565b5063ffffffff811660041461176c5760405162461bcd60e51b815260040161036590612e87565b5f805b60208110156117c15761178381601f612d4e565b61178e906008612a23565b8761179a836006612d75565b815181106117aa576117aa612d61565b016020015160f81c901b919091179060010161176f565b505f805b6008811015611820576117d9816007612d4e565b6117e4906008612a23565b6001600160401b0316886117f9836026612d75565b8151811061180957611809612d61565b016020015160f81c901b91909117906001016117c5565b5090969095509350505050565b611835612119565b61183e81612164565b50565b5f8082516027146118645760405162461bcd60e51b815260040161036590612dff565b5f805b60028110156118b35761187b816001612d4e565b611886906008612a23565b61ffff1685828151811061189c5761189c612d61565b016020015160f81c901b9190911790600101611867565b5061ffff8116156118d65760405162461bcd60e51b815260040161036590612e46565b5f805b6004811015611931576118ed816003612d4e565b6118f8906008612a23565b63ffffffff168661190a836002612d75565b8151811061191a5761191a612d61565b016020015160f81c901b91909117906001016118d9565b5063ffffffff81166002146119585760405162461bcd60e51b815260040161036590612e87565b5f805b60208110156119ad5761196f81601f612d4e565b61197a906008612a23565b87611986836006612d75565b8151811061199657611996612d61565b016020015160f81c901b919091179060010161195b565b505f866026815181106119c2576119c2612d61565b016020015191976001600160f81b03199092161515965090945050505050565b5f6119eb612185565b5f80516020613022833981519152426001600160401b038516118015611a2557506001600160401b038416611a23426202a300612d75565b115b611a855760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610365565b85611ad25760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610365565b5f86815260098201602052604090205415611b3e5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610365565b8251603014611ba35760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610365565b845f611bae826103f3565b90508260020154816001600160401b031610158015611bda57508260030154816001600160401b031611155b611c325760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610365565b5f80611c796040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b03168152602001898152506121cf565b5f82815260078801602052604090209193509150611c978282612f10565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611cc490859060040161299f565b6020604051808303815f875af1158015611ce0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0491906129d1565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611d8a57611d8a612969565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610e5c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611f025760405162461bcd60e51b815260040161036590612dff565b5f805b6002811015611f5157611f19816001612d4e565b611f24906008612a23565b61ffff16868281518110611f3a57611f3a612d61565b016020015160f81c901b9190911790600101611f05565b5061ffff811615611f745760405162461bcd60e51b815260040161036590612e46565b5f805b6004811015611fcf57611f8b816003612d4e565b611f96906008612a23565b63ffffffff1687611fa8836002612d75565b81518110611fb857611fb8612d61565b016020015160f81c901b9190911790600101611f77565b5063ffffffff8116600114611ff65760405162461bcd60e51b815260040161036590612e87565b5f805b602081101561204b5761200d81601f612d4e565b612018906008612a23565b88612024836006612d75565b8151811061203457612034612d61565b016020015160f81c901b9190911790600101611ff9565b505f805b60088110156120aa57612063816007612d4e565b61206e906008612a23565b6001600160401b031689612083836026612d75565b8151811061209357612093612d61565b016020015160f81c901b919091179060010161204f565b505f805b6008811015612109576120c2816007612d4e565b6120cd906008612a23565b6001600160401b03168a6120e283602e612d75565b815181106120f2576120f2612d61565b016020015160f81c901b91909117906001016120ae565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661216257604051631afcd79f60e31b815260040160405180910390fd5b565b61216c612119565b61217461259a565b61217c6125aa565b61183e816125b2565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016121c957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146122395760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610365565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156122b057612270816001612d4e565b61227b906008612a23565b5081515f9083908390811061229257612292612d61565b60200101906001600160f81b03191690815f1a90535060010161225c565b505f5b600481101561230e576122c7816003612d4e565b6122d2906008612a23565b505f826122e0836002612d75565b815181106122f0576122f0612d61565b60200101906001600160f81b03191690815f1a9053506001016122b3565b505f5b602081101561236b578451816020811061232d5761232d612d61565b1a60f81b8261233d836006612d75565b8151811061234d5761234d612d61565b60200101906001600160f81b03191690815f1a905350600101612311565b505f5b60208110156123cb578460200151816020811061238d5761238d612d61565b1a60f81b8261239d836026612d75565b815181106123ad576123ad612d61565b60200101906001600160f81b03191690815f1a90535060010161236e565b505f5b600881101561243f576123e2816007612d4e565b6123ed906008612a23565b60ff1685604001516001600160401b0316901c60f81b828260466124119190612d75565b8151811061242157612421612d61565b60200101906001600160f81b03191690815f1a9053506001016123ce565b505f5b60308110156124aa578460800151818151811061246157612461612d61565b01602001516001600160f81b0319168261247c83604e612d75565b8151811061248c5761248c612d61565b60200101906001600160f81b03191690815f1a905350600101612442565b505f5b600881101561251c576124c1816007612d4e565b6124cc906008612a23565b60608601516001600160401b0390811691161c60f81b826124ee83607e612d75565b815181106124fe576124fe612d61565b60200101906001600160f81b03191690815f1a9053506001016124ad565b5060028160405161252d9190612fcb565b602060405180830381855afa158015612548573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061256b91906129d1565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6125a2612119565b6121626126e2565b612162612119565b6125ba612119565b80355f8051602061302283398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561265260a0830160808401612766565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561268560c0830160a08401612fe6565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556126b660e0830160c08401613006565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b612574612119565b5080546126f690612c4d565b5f825580601f10612705575050565b601f0160209004905f5260205f209081019061183e91905b80821115612730575f815560010161271d565b5090565b5f60208284031215612744575f80fd5b5035919050565b80356001600160401b0381168114612761575f80fd5b919050565b5f60208284031215612776575f80fd5b61277f8261274b565b9392505050565b801515811461183e575f80fd5b803563ffffffff81168114612761575f80fd5b5f805f606084860312156127b8575f80fd5b8335925060208401356127ca81612786565b91506127d860408501612793565b90509250925092565b5f60e082840312156127f1575f80fd5b50919050565b5f60208284031215612807575f80fd5b61277f82612793565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561284657612846612810565b60405290565b604051601f8201601f191681016001600160401b038111828210171561287457612874612810565b604052919050565b5f6001600160401b0382111561289457612894612810565b50601f01601f191660200190565b5f805f606084860312156128b4575f80fd5b833592506128c46020850161274b565b915060408401356001600160401b038111156128de575f80fd5b8401601f810186136128ee575f80fd5b80356129016128fc8261287c565b61284c565b818152876020838501011115612915575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612945575f80fd5b61294e83612793565b9150602083013561295e81612786565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561299757818101518382015260200161297f565b50505f910152565b602081525f82518060208401526129bd81604085016020870161297d565b601f01601f19169190910160400192915050565b5f602082840312156129e1575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612a1e57612a1e6129e8565b500490565b8082028115828204841417610403576104036129fc565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b6001600160a01b038116811461183e575f80fd5b805161276181612786565b5f8060408385031215612ab4575f80fd5b82516001600160401b0380821115612aca575f80fd5b9084019060608287031215612add575f80fd5b612ae5612824565b82518152602080840151612af881612a84565b82820152604084015183811115612b0d575f80fd5b80850194505087601f850112612b21575f80fd5b83519250612b316128fc8461287c565b8381528882858701011115612b44575f80fd5b612b538483830184880161297d565b80604084015250819550612b68818801612a98565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612c6157607f821691505b6020821081036127f157634e487b7160e01b5f52602260045260245ffd5b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612cd681612c4d565b806020870152604060018084165f8114612cf75760018114612d1357612d40565b60ff19851660408a0152604084151560051b8a01019550612d40565b895f5260205f205f5b85811015612d375781548b8201860152908301908801612d1c565b8a016040019650505b509398975050505050505050565b81810381811115610403576104036129fc565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610403576104036129fc565b6001600160401b03818116838216019080821115612da857612da86129fc565b5092915050565b6001600160401b03818116838216028082169190828114612dd257612dd26129fc565b505092915050565b5f6001600160401b0380841680612df357612df36129e8565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e4a57805f5260205f20601f840160051c81016020851015612ef15750805b601f840160051c820191505b818110156103ec575f8155600101612efd565b81516001600160401b03811115612f2957612f29612810565b612f3d81612f378454612c4d565b84612ecc565b602080601f831160018114612f70575f8415612f595750858301515b5f19600386901b1c1916600185901b178555610aa6565b5f85815260208120601f198616915b82811015612f9e57888601518255948401946001909101908401612f7f565b5085821015612fbb57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251612fdc81846020870161297d565b9190910192915050565b5f60208284031215612ff6575f80fd5b813560ff8116811461277f575f80fd5b5f60208284031215613016575f80fd5b813561277f81612a8456feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index f3e7b6c9d..75482afff 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -120,18 +120,13 @@ abstract contract StakingManager is * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. - * @param signature The raw bytes of the Ed25519 signature over the concatenated bytes of - * [subnetID]+[nodeID]+[blsPublicKey]+[weight]+[balance]+[expiry]. This signature must correspond to the Ed25519 - * public key that is used for the nodeID. This approach prevents NodeIDs from being unwillingly added to Subnets. - * balance is the minimum initial $nAVAX balance that must be attached to the validator serialized as a uint64. - * The signature field will be validated by the P-Chain. Implementations may choose to validate that the signature - * field is well-formed but it is not required. + * @param blsPublicKey The BLS public key of the validator. */ function _initializeValidatorRegistration( bytes32 nodeID, uint256 value, uint64 registrationExpiry, - bytes memory signature + bytes memory blsPublicKey ) internal nonReentrant returns (bytes32) { StakingManagerStorage storage $ = _getStakingManagerStorage(); @@ -144,12 +139,7 @@ abstract contract StakingManager is // Ensure the nodeID is not the zero address, and is not already an active validator. require(nodeID != bytes32(0), "StakingManager: Invalid node ID"); require($._activeValidators[nodeID] == bytes32(0), "StakingManager: Node ID already active"); - - // Ensure the signature is the proper length. The EVM does not provide an Ed25519 precompile to - // validate the signature, but the P-Chain will validate the signature. If the signature is invalid, - // the P-Chain will reject the registration, and the stake can be returned to the staker after the registration - // expiry has passed. - require(signature.length == 64, "StakingManager: Invalid signature length"); + require(blsPublicKey.length == 48, "StakingManager: Invalid blsPublicKey length"); // Lock the stake in the contract. uint256 lockedValue = _lock(value); @@ -170,8 +160,8 @@ abstract contract StakingManager is subnetID: $._subnetID, nodeID: nodeID, weight: weight, - registrationExpiry: registrationExpiry, - signature: signature + blsPublicKey: blsPublicKey, + registrationExpiry: registrationExpiry }) ); $._pendingRegisterValidationMessages[validationID] = registerSubnetValidatorMessage; diff --git a/contracts/staking/StakingMessages.sol b/contracts/staking/StakingMessages.sol index 20ac4deb4..8658af30a 100644 --- a/contracts/staking/StakingMessages.sol +++ b/contracts/staking/StakingMessages.sol @@ -7,13 +7,13 @@ pragma solidity 0.8.25; library StakingMessages { // The information that uniquely identifies a subnet validation period. // The validationID is the SHA-256 hash of the concatenation of the CODEC_ID, - // SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID, and the concatenated ValidationInfo fields. + // REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID, and the concatenated ValidationInfo fields. struct ValidationInfo { bytes32 subnetID; bytes32 nodeID; uint64 weight; uint64 registrationExpiry; - bytes signature; + bytes blsPublicKey; } // The P-Chain uses a hardcoded codecID of 0 for all messages. @@ -44,23 +44,23 @@ library StakingMessages { /** * @notice Packs a RegisterSubnetValidatorMessage message into a byte array. * The message format specification is: - * +-----------+----------+-----------+ - * | codecID : uint16 | 2 bytes | - * +-----------+----------+-----------+ - * | typeID : uint32 | 4 bytes | - * +-----------+----------+-----------+ - * | subnetID : [32]byte | 32 bytes | - * +-----------+----------+-----------+ - * | nodeID : [32]byte | 32 bytes | - * +-----------+----------+-----------+ - * | weight : uint64 | 8 bytes | - * +-----------+----------+-----------+ - * | expiry : uint64 | 8 bytes | - * +-----------+----------+-----------+ - * | signature : [64]byte | 64 bytes | - * +-----------+----------+-----------+ - * | 150 bytes | - * +-----------+ + * +--------------+----------+-----------+ + * | codecID : uint16 | 2 bytes | + * +--------------+----------+-----------+ + * | typeID : uint32 | 4 bytes | + * +--------------+----------+-----------+ + * | subnetID : [32]byte | 32 bytes | + * +--------------+----------+-----------+ + * | nodeID : [32]byte | 32 bytes | + * +--------------+----------+-----------+ + * | weight : uint64 | 8 bytes | + * +--------------+----------+-----------+ + * | blsPublicKey : [48]byte | 48 bytes | + * +--------------+----------+-----------+ + * | expiry : uint64 | 8 bytes | + * +--------------+----------+-----------+ + * | 134 bytes | + * +-----------+ * * @param validationInfo The information to pack into the message. * @return The validationID and the packed message. @@ -70,8 +70,8 @@ library StakingMessages { pure returns (bytes32, bytes memory) { - require(validationInfo.signature.length == 64, "StakingMessages: Invalid signature length"); - bytes memory res = new bytes(150); + require(validationInfo.blsPublicKey.length == 48, "StakingMessages: Invalid signature length"); + bytes memory res = new bytes(134); // Pack the codec ID for (uint256 i; i < 2; ++i) { res[i] = bytes1(uint8(CODEC_ID >> uint8((8 * (1 - i))))); @@ -79,7 +79,7 @@ library StakingMessages { // Pack the type ID for (uint256 i; i < 4; ++i) { res[i + 2] = - bytes1(uint8(SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID >> uint8((8 * (3 - i))))); + bytes1(uint8(REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID >> uint8((8 * (3 - i))))); } // Pack the subnetID @@ -94,13 +94,13 @@ library StakingMessages { for (uint256 i; i < 8; ++i) { res[i + 70] = bytes1(uint8(validationInfo.weight >> uint8((8 * (7 - i))))); } + // Pack the blsPublicKey + for (uint256 i; i < 48; ++i) { + res[i + 78] = validationInfo.blsPublicKey[i]; + } // Pack the registration expiry for (uint256 i; i < 8; ++i) { - res[i + 78] = bytes1(uint8(validationInfo.registrationExpiry >> uint64((8 * (7 - i))))); - } - // Pack the signature - for (uint256 i; i < 64; ++i) { - res[i + 86] = validationInfo.signature[i]; + res[i + 126] = bytes1(uint8(validationInfo.registrationExpiry >> uint64((8 * (7 - i))))); } return (sha256(res), res); } @@ -117,7 +117,7 @@ library StakingMessages { pure returns (ValidationInfo memory) { - require(input.length == 150, "StakingMessages: Invalid message length"); + require(input.length == 134, "StakingMessages: Invalid message length"); // Unpack the codec ID uint16 codecID; @@ -154,24 +154,25 @@ library StakingMessages { weight |= uint64(uint8(input[i + 70])) << uint64((8 * (7 - i))); } + // Unpack the blsPublicKey + bytes memory blsPublicKey = new bytes(48); + for (uint256 i; i < 48; ++i) { + blsPublicKey[i] = input[i + 78]; + } + // Unpack the registration expiry uint64 expiry; for (uint256 i; i < 8; ++i) { - expiry |= uint64(uint8(input[i + 78])) << uint64((8 * (7 - i))); + expiry |= uint64(uint8(input[i + 126])) << uint64((8 * (7 - i))); } - // Unpack the signature - bytes memory signature = new bytes(64); - for (uint256 i; i < 64; ++i) { - signature[i] = input[i + 86]; - } return ValidationInfo({ subnetID: subnetID, nodeID: nodeID, weight: weight, registrationExpiry: expiry, - signature: signature + blsPublicKey: blsPublicKey }); } diff --git a/contracts/staking/tests/StakingManagerTests.t.sol b/contracts/staking/tests/StakingManagerTests.t.sol index 171fad73a..148ebd254 100644 --- a/contracts/staking/tests/StakingManagerTests.t.sol +++ b/contracts/staking/tests/StakingManagerTests.t.sol @@ -19,8 +19,8 @@ abstract contract StakingManagerTest is Test { bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes32 public constant DEFAULT_NODE_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); - bytes public constant DEFAULT_ED25519_SIGNATURE = bytes( - hex"12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" + bytes public constant DEFAULT_BLS_PUBLIC_KEY = bytes( + hex"123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); address public constant WARP_PRECOMPILE_ADDRESS = 0x0200000000000000000000000000000000000005; @@ -63,7 +63,7 @@ abstract contract StakingManagerTest is Test { DEFAULT_SUBNET_ID, DEFAULT_WEIGHT, DEFAULT_EXPIRY, - DEFAULT_ED25519_SIGNATURE + DEFAULT_BLS_PUBLIC_KEY ); } @@ -92,7 +92,7 @@ abstract contract StakingManagerTest is Test { DEFAULT_SUBNET_ID, DEFAULT_WEIGHT, DEFAULT_EXPIRY, - DEFAULT_ED25519_SIGNATURE + DEFAULT_BLS_PUBLIC_KEY ); (, bytes memory registerSubnetValidatorMessage) = StakingMessages .packRegisterSubnetValidatorMessage( @@ -101,7 +101,7 @@ abstract contract StakingManagerTest is Test { nodeID: DEFAULT_NODE_ID, weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }) ); _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); @@ -114,7 +114,7 @@ abstract contract StakingManagerTest is Test { subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); } @@ -125,7 +125,7 @@ abstract contract StakingManagerTest is Test { subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); @@ -145,7 +145,7 @@ abstract contract StakingManagerTest is Test { subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); @@ -161,7 +161,7 @@ abstract contract StakingManagerTest is Test { subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); @@ -183,7 +183,7 @@ abstract contract StakingManagerTest is Test { subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); @@ -224,15 +224,15 @@ abstract contract StakingManagerTest is Test { bytes32 subnetID, uint64 weight, uint64 registrationExpiry, - bytes memory signature + bytes memory blsPublicKey ) internal returns (bytes32 validationID) { - (validationID,) = StakingMessages.packValidationInfo( + (validationID,) = StakingMessages.packRegisterSubnetValidatorMessage( StakingMessages.ValidationInfo({ nodeID: nodeID, subnetID: subnetID, weight: weight, registrationExpiry: registrationExpiry, - signature: signature + blsPublicKey: blsPublicKey }) ); (, bytes memory registerSubnetValidatorMessage) = StakingMessages @@ -242,7 +242,7 @@ abstract contract StakingManagerTest is Test { nodeID: nodeID, weight: weight, registrationExpiry: registrationExpiry, - signature: signature + blsPublicKey: blsPublicKey }) ); vm.warp(DEFAULT_EXPIRY - 1); @@ -255,7 +255,7 @@ abstract contract StakingManagerTest is Test { ); _initializeValidatorRegistration( - nodeID, registrationExpiry, signature, stakingManager.weightToValue(weight) + nodeID, registrationExpiry, blsPublicKey, stakingManager.weightToValue(weight) ); } @@ -264,11 +264,11 @@ abstract contract StakingManagerTest is Test { bytes32 subnetID, uint64 weight, uint64 registrationExpiry, - bytes memory signature, + bytes memory blsPublicKey, uint64 registrationTimestamp ) internal returns (bytes32 validationID) { validationID = _setUpInitializeValidatorRegistration( - nodeID, subnetID, weight, registrationExpiry, signature + nodeID, subnetID, weight, registrationExpiry, blsPublicKey ); bytes memory subnetValidatorRegistrationMessage = StakingMessages.packSubnetValidatorRegistrationMessage(validationID, true); @@ -287,7 +287,7 @@ abstract contract StakingManagerTest is Test { bytes32 subnetID, uint64 weight, uint64 registrationExpiry, - bytes memory signature, + bytes memory blsPublicKey, uint64 registrationTimestamp, uint64 completionTimestamp ) internal returns (bytes32 validationID) { @@ -296,7 +296,7 @@ abstract contract StakingManagerTest is Test { subnetID: subnetID, weight: weight, registrationExpiry: registrationExpiry, - signature: signature, + blsPublicKey: blsPublicKey, registrationTimestamp: registrationTimestamp }); @@ -342,7 +342,7 @@ abstract contract StakingManagerTest is Test { function _initializeValidatorRegistration( bytes32 nodeID, uint64 registrationExpiry, - bytes memory signature, + bytes memory blsPublicKey, uint256 stakeAmount ) internal virtual returns (bytes32); diff --git a/contracts/staking/tests/StakingMessagesTests.t.sol b/contracts/staking/tests/StakingMessagesTests.t.sol index 0367f5acf..5f730f64b 100644 --- a/contracts/staking/tests/StakingMessagesTests.t.sol +++ b/contracts/staking/tests/StakingMessagesTests.t.sol @@ -13,8 +13,8 @@ contract StakingMessagesTest is Test { bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes32 public constant DEFAULT_NODE_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); - bytes public constant DEFAULT_ED25519_SIGNATURE = bytes( - hex"12345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" + bytes public constant DEFAULT_BLS_PUBLIC_KEY = bytes( + hex"123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); bytes32 public constant DEFAULT_VALIDATION_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); @@ -29,7 +29,7 @@ contract StakingMessagesTest is Test { nodeID: DEFAULT_NODE_ID, weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, - signature: DEFAULT_ED25519_SIGNATURE + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }) ); @@ -39,7 +39,7 @@ contract StakingMessagesTest is Test { assertEq(info.nodeID, DEFAULT_NODE_ID); assertEq(info.weight, DEFAULT_WEIGHT); assertEq(info.registrationExpiry, DEFAULT_EXPIRY); - assertEq(info.signature, DEFAULT_ED25519_SIGNATURE); + assertEq(info.blsPublicKey, DEFAULT_BLS_PUBLIC_KEY); (bytes32 recoveredID,) = StakingMessages.packRegisterSubnetValidatorMessage(info); assertEq(recoveredID, validationID); diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index ff71bee4d..789872b78 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -114,12 +114,12 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { opts.Value = big.NewInt(0).SetUint64(1e18) nodeID := ids.GenerateTestID() - signature := [64]byte{} + blsPublicKey := [48]byte{} tx, err = stakingManager.InitializeValidatorRegistration( opts, nodeID, uint64(time.Now().Add(24*time.Hour).Unix()), - signature[:], + blsPublicKey[:], ) Expect(err).Should(BeNil()) receipt := utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) @@ -136,16 +136,20 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) log.Info("Constructed signed RegisterSubnetValidator message", "message", signedWarpMessage) // Validate the Warp message, (this will be done on the P-Chain in the future) - // msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) - // Expect(err).Should(BeNil()) - // // Check that the addressed call payload is a registered Warp message type - // var registerValidatorPayload warpMessages.RegisterSubnetValidator - // ver, err := warpMessages.Codec.Unmarshal(msg.Payload, ®isterValidatorPayload) - // Expect(err).Should(BeNil()) - // Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) - // Expect(registerValidatorPayload.NodeID).Should(Equal(nodeID)) - // Expect(registerValidatorPayload.Weight).Should(Equal(1e18)) - // Expect(registerValidatorPayload.SubnetID).Should(Equal(subnetAInfo.SubnetID)) + msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) + Expect(err).Should(BeNil()) + // Check that the addressed call payload is a registered Warp message type + var payloadInterface warpMessages.Payload + ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) + Expect(err).Should(BeNil()) + registerValidatorPayload, ok := payloadInterface.(*warpMessages.RegisterSubnetValidator) + Expect(ok).Should(BeTrue()) + + Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) + Expect(registerValidatorPayload.NodeID).Should(Equal(nodeID)) + Expect(registerValidatorPayload.Weight).Should(Equal(uint64(1e6))) + Expect(registerValidatorPayload.SubnetID).Should(Equal(subnetAInfo.SubnetID)) + Expect(registerValidatorPayload.BlsPubKey[:]).Should(Equal(blsPublicKey[:])) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain // Query P-Chain validators for the Warp message From 373b9e308ac93ff1753b0a744aa1c03136c5b16f Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 15 Aug 2024 11:30:06 -0400 Subject: [PATCH 074/545] Remove solhint disable --- contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol index 6dab18bea..dcee84052 100644 --- a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -21,7 +21,6 @@ contract ExampleRewardCalculatorTest is Test { } function testRewardCalculation() public view { - // solhint-disable-next-line func-named-parameters uint256 output = exampleRewardCalculator.calculateReward( DEFAULT_STAKE_AMOUNT, DEFAULT_START_TIME, DEFAULT_END_TIME, 0, 0 ); From 79104a6422d2e5e78bcd3a98755e693228fb5a59 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 15 Aug 2024 11:52:26 -0400 Subject: [PATCH 075/545] delist validator working --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/StakingManager.sol | 4 +- tests/flows/native_token_staking.go | 92 +++++++++++++++++++ 4 files changed, 97 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index cc95f36e9..3d8f473e9 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -43,7 +43,7 @@ type StakingManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516134a03803806134a083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6133538061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f5780632e2194d8146100b45780635d0d7466146100e457806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612a09565b61019d565b005b6100c76100c2366004612a09565b610393565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26100f2366004612a34565b6103a9565b61010a610105366004612a8c565b6104b7565b6040519081526020016100db565b6100b2610126366004612acc565b6104d0565b61010a610139366004612b99565b610a50565b6100b261014c366004612c35565b610a68565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100db565b6100b2610185366004612a09565b610cf5565b6100b2610198366004612c4e565b610e09565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061332783398151915293929190829060ff1660058111156101fe576101fe612c78565b600581111561020f5761020f612c78565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612c78565b1461030e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61031f848361010001515f611230565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034c908490600401612cae565b6020604051808303815f875af1158015610368573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038c9190612ce0565b5050505050565b5f6103a364e8d4a5100083612d1f565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103ed5750825b90505f826001600160401b031660011480156104085750303b155b905081158015610416575080155b156104345760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045e57845460ff60401b1916600160401b1785555b610468878761144d565b83156104ae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6103a36001600160401b03831664e8d4a51000612d32565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061332783398151915293929190829060ff16600581111561053157610531612c78565b600581111561054257610542612c78565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156105dc576105dc612c78565b146106355760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610305565b60c08101516001600160a01b0316336001600160a01b03161461066a5760405162461bcd60e51b815260040161030590612d49565b610677816040015161146b565b60038152426001600160401b031660808201525f8415610850576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156106da573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107019190810190612d9e565b91509150806107225760405162461bcd60e51b815260040161030590612e70565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107899190612ce0565b8251146107a85760405162461bcd60e51b815260040161030590612eb4565b60208201516001600160a01b0316156107d35760405162461bcd60e51b815260040161030590612efb565b5f806107e28460400151611618565b91509150818a1461084a5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610305565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff1916600183600581111561089057610890612c78565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f9061098190889083611230565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109b0908590600401612cae565b6020604051808303815f875af11580156109cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f09190612ce0565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f610a5d848685856117f0565b90505b949350505050565b5f5f805160206133278339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ac3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610aea9190810190612d9e565b9150915080610b0b5760405162461bcd60e51b815260040161030590612e70565b8254825114610b2c5760405162461bcd60e51b815260040161030590612eb4565b60208201516001600160a01b031615610b575760405162461bcd60e51b815260040161030590612efb565b5f80610b668460400151611cf7565b9150915080610bc65760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610305565b5f82815260078601602052604081208054610be090612f48565b9050118015610c12575060015f83815260088701602052604090205460ff166005811115610c1057610c10612c78565b145b610c2e5760405162461bcd60e51b815260040161030590612f80565b5f8281526007860160205260408120610c46916129bf565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020613327833981519152929190610d3d90612f48565b9050118015610d6f575060015f83815260088301602052604090205460ff166005811115610d6d57610d6d612c78565b145b610d8b5760405162461bcd60e51b815260040161030590612f80565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dc49190600401612fc5565b6020604051808303815f875af1158015610de0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e049190612ce0565b505050565b5f5f805160206133278339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8b9190810190612d9e565b9150915080610eac5760405162461bcd60e51b815260040161030590612e70565b5f8415610f25575f610ec18460400151611e98565b919350909150506001600160401b03811615610f1f5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610305565b50610f99565b5f610f338460400151611cf7565b90925090508015610f975760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610305565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115610fcb57610fcb612c78565b6005811115610fdc57610fdc612c78565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b9092049093166101009092019190915282015191925016331461108d5760405162461bcd60e51b815260040161030590612d49565b5f6003825160058111156110a3576110a3612c78565b14806110c157506002825160058111156110bf576110bf612c78565b145b156110e457506020808201515f90815260098701909152604081205560046110e8565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561111957611119612c78565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156112a95761126981600161304f565b611274906008612d32565b5081515f9083908390811061128b5761128b613062565b60200101906001600160f81b03191690815f1a905350600101611255565b505f5b600481101561130c576112c081600361304f565b6112cb906008612d32565b6001901c60f81b826112de836002613076565b815181106112ee576112ee613062565b60200101906001600160f81b03191690815f1a9053506001016112ac565b505f5b602081101561136e5761132381601f61304f565b61132e906008612d32565b86901c60f81b82611340836006613076565b8151811061135057611350613062565b60200101906001600160f81b03191690815f1a90535060010161130f565b505f5b60088110156113d95761138581600761304f565b611390906008612d32565b6001600160401b038616901c60f81b826113ab836026613076565b815181106113bb576113bb613062565b60200101906001600160f81b03191690815f1a905350600101611371565b505f5b6008811015611444576113f081600761304f565b6113fb906008612d32565b6001600160401b038516901c60f81b8261141683602e613076565b8151811061142657611426613062565b60200101906001600160f81b03191690815f1a9053506001016113dc565b50949350505050565b6114556120d3565b61145e8261211e565b61146781612142565b5050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f8051602061332783398151915290600160e01b900460ff165f036114b0575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906114f8908361304f565b10611514576001600160401b0384166040830152808252611533565b83826040018181516115269190613089565b6001600160401b03169052505b5f82602001518360400151606461154a91906130b0565b61155491906130db565b600485015490915060ff600160e01b909104811690821611156115d45760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610305565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602e1461163b5760405162461bcd60e51b815260040161030590613100565b5f805b600281101561168a5761165281600161304f565b61165d906008612d32565b61ffff1685828151811061167357611673613062565b016020015160f81c901b919091179060010161163e565b5061ffff8116156116ad5760405162461bcd60e51b815260040161030590613147565b5f805b6004811015611708576116c481600361304f565b6116cf906008612d32565b63ffffffff16866116e1836002613076565b815181106116f1576116f1613062565b016020015160f81c901b91909117906001016116b0565b5063ffffffff811660041461172f5760405162461bcd60e51b815260040161030590613188565b5f805b60208110156117845761174681601f61304f565b611751906008612d32565b8761175d836006613076565b8151811061176d5761176d613062565b016020015160f81c901b9190911790600101611732565b505f805b60088110156117e35761179c81600761304f565b6117a7906008612d32565b6001600160401b0316886117bc836026613076565b815181106117cc576117cc613062565b016020015160f81c901b9190911790600101611788565b5090969095509350505050565b5f6117f96121f6565b5f80516020613327833981519152426001600160401b03851611801561183357506001600160401b038416611831426202a300613076565b115b6118935760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610305565b856118e05760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610305565b5f8681526009820160205260409020541561194c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610305565b82516030146119b15760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610305565b5f6119bb86612240565b90505f6119c782610393565b90508260020154816001600160401b0316101580156119f357508260030154816001600160401b031611155b611a4b5760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610305565b5f80611a926040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b0316815260200189815250612276565b5f82815260078801602052604090209193509150611ab08282613211565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611add908590600401612cae565b6020604051808303815f875af1158015611af9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1d9190612ce0565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611ba357611ba3612c78565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610a6060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611d1a5760405162461bcd60e51b815260040161030590613100565b5f805b6002811015611d6957611d3181600161304f565b611d3c906008612d32565b61ffff16858281518110611d5257611d52613062565b016020015160f81c901b9190911790600101611d1d565b5061ffff811615611d8c5760405162461bcd60e51b815260040161030590613147565b5f805b6004811015611de757611da381600361304f565b611dae906008612d32565b63ffffffff1686611dc0836002613076565b81518110611dd057611dd0613062565b016020015160f81c901b9190911790600101611d8f565b5063ffffffff8116600214611e0e5760405162461bcd60e51b815260040161030590613188565b5f805b6020811015611e6357611e2581601f61304f565b611e30906008612d32565b87611e3c836006613076565b81518110611e4c57611e4c613062565b016020015160f81c901b9190911790600101611e11565b505f86602681518110611e7857611e78613062565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611ebc5760405162461bcd60e51b815260040161030590613100565b5f805b6002811015611f0b57611ed381600161304f565b611ede906008612d32565b61ffff16868281518110611ef457611ef4613062565b016020015160f81c901b9190911790600101611ebf565b5061ffff811615611f2e5760405162461bcd60e51b815260040161030590613147565b5f805b6004811015611f8957611f4581600361304f565b611f50906008612d32565b63ffffffff1687611f62836002613076565b81518110611f7257611f72613062565b016020015160f81c901b9190911790600101611f31565b5063ffffffff8116600114611fb05760405162461bcd60e51b815260040161030590613188565b5f805b602081101561200557611fc781601f61304f565b611fd2906008612d32565b88611fde836006613076565b81518110611fee57611fee613062565b016020015160f81c901b9190911790600101611fb3565b505f805b60088110156120645761201d81600761304f565b612028906008612d32565b6001600160401b03168961203d836026613076565b8151811061204d5761204d613062565b016020015160f81c901b9190911790600101612009565b505f805b60088110156120c35761207c81600761304f565b612087906008612d32565b6001600160401b03168a61209c83602e613076565b815181106120ac576120ac613062565b016020015160f81c901b9190911790600101612068565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661211c57604051631afcd79f60e31b815260040160405180910390fd5b565b6121266120d3565b61212e612641565b612136612651565b61213f81612659565b50565b61214a6120d3565b7f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f916001600160a01b0382166121d65760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610305565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161223a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6103a3827f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91546001600160a01b031690612789565b5f60608260800151516030146122e05760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610305565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156123575761231781600161304f565b612322906008612d32565b5081515f9083908390811061233957612339613062565b60200101906001600160f81b03191690815f1a905350600101612303565b505f5b60048110156123b55761236e81600361304f565b612379906008612d32565b505f82612387836002613076565b8151811061239757612397613062565b60200101906001600160f81b03191690815f1a90535060010161235a565b505f5b602081101561241257845181602081106123d4576123d4613062565b1a60f81b826123e4836006613076565b815181106123f4576123f4613062565b60200101906001600160f81b03191690815f1a9053506001016123b8565b505f5b6020811015612472578460200151816020811061243457612434613062565b1a60f81b82612444836026613076565b8151811061245457612454613062565b60200101906001600160f81b03191690815f1a905350600101612415565b505f5b60088110156124e65761248981600761304f565b612494906008612d32565b60ff1685604001516001600160401b0316901c60f81b828260466124b89190613076565b815181106124c8576124c8613062565b60200101906001600160f81b03191690815f1a905350600101612475565b505f5b6030811015612551578460800151818151811061250857612508613062565b01602001516001600160f81b0319168261252383604e613076565b8151811061253357612533613062565b60200101906001600160f81b03191690815f1a9053506001016124e9565b505f5b60088110156125c35761256881600761304f565b612573906008612d32565b60608601516001600160401b0390811691161c60f81b8261259583607e613076565b815181106125a5576125a5613062565b60200101906001600160f81b03191690815f1a905350600101612554565b506002816040516125d491906132d0565b602060405180830381855afa1580156125ef573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906126129190612ce0565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126496120d3565b61211c6128eb565b61211c6120d3565b6126616120d3565b80355f8051602061332783398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab603556126f960a0830160808401612a8c565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561272c60c0830160a084016132eb565b60048201805460ff92909216600160e01b0260ff60e01b1990921691909117905561275d60e0830160c0840161330b565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156127cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f39190612ce0565b905061280a6001600160a01b0385163330866128f3565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561284e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128729190612ce0565b90508181116128d85760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610305565b6128e2828261304f565b95945050505050565b61261b6120d3565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261294d908590612953565b50505050565b5f8060205f8451602086015f885af180612972576040513d5f823e3d81fd5b50505f513d91508115612989578060011415612996565b6001600160a01b0384163b155b1561294d57604051635274afe760e01b81526001600160a01b0385166004820152602401610305565b5080546129cb90612f48565b5f825580601f106129da575050565b601f0160209004905f5260205f209081019061213f91905b80821115612a05575f81556001016129f2565b5090565b5f60208284031215612a19575f80fd5b5035919050565b6001600160a01b038116811461213f575f80fd5b5f80828403610100811215612a47575f80fd5b60e0811215612a54575f80fd5b5082915060e0830135612a6681612a20565b809150509250929050565b80356001600160401b0381168114612a87575f80fd5b919050565b5f60208284031215612a9c575f80fd5b612aa582612a71565b9392505050565b801515811461213f575f80fd5b803563ffffffff81168114612a87575f80fd5b5f805f60608486031215612ade575f80fd5b833592506020840135612af081612aac565b9150612afe60408501612ab9565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b3d57612b3d612b07565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612b6b57612b6b612b07565b604052919050565b5f6001600160401b03821115612b8b57612b8b612b07565b50601f01601f191660200190565b5f805f8060808587031215612bac575f80fd5b8435935060208501359250612bc360408601612a71565b915060608501356001600160401b03811115612bdd575f80fd5b8501601f81018713612bed575f80fd5b8035612c00612bfb82612b73565b612b43565b818152886020838501011115612c14575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612c45575f80fd5b612aa582612ab9565b5f8060408385031215612c5f575f80fd5b612c6883612ab9565b91506020830135612a6681612aac565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612ca6578181015183820152602001612c8e565b50505f910152565b602081525f8251806020840152612ccc816040850160208701612c8c565b601f01601f19169190910160400192915050565b5f60208284031215612cf0575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612d2d57612d2d612cf7565b500490565b80820281158282048414176103a3576103a3612d0b565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b8051612a8781612aac565b5f8060408385031215612daf575f80fd5b82516001600160401b0380821115612dc5575f80fd5b9084019060608287031215612dd8575f80fd5b612de0612b1b565b82518152602080840151612df381612a20565b82820152604084015183811115612e08575f80fd5b80850194505087601f850112612e1c575f80fd5b83519250612e2c612bfb84612b73565b8381528882858701011115612e3f575f80fd5b612e4e84838301848801612c8c565b80604084015250819550612e63818801612d93565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612f5c57607f821691505b602082108103612f7a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612fd781612f48565b806020870152604060018084165f8114612ff8576001811461301457613041565b60ff19851660408a0152604084151560051b8a01019550613041565b895f5260205f205f5b858110156130385781548b820186015290830190880161301d565b8a016040019650505b509398975050505050505050565b818103818111156103a3576103a3612d0b565b634e487b7160e01b5f52603260045260245ffd5b808201808211156103a3576103a3612d0b565b6001600160401b038181168382160190808211156130a9576130a9612d0b565b5092915050565b6001600160401b038181168382160280821691908281146130d3576130d3612d0b565b505092915050565b5f6001600160401b03808416806130f4576130f4612cf7565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e0457805f5260205f20601f840160051c810160208510156131f25750805b601f840160051c820191505b8181101561038c575f81556001016131fe565b81516001600160401b0381111561322a5761322a612b07565b61323e816132388454612f48565b846131cd565b602080601f831160018114613271575f841561325a5750858301515b5f19600386901b1c1916600185901b1785556132c8565b5f85815260208120601f198616915b8281101561329f57888601518255948401946001909101908401613280565b50858210156132bc57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f82516132e1818460208701612c8c565b9190910192915050565b5f602082840312156132fb575f80fd5b813560ff81168114612aa5575f80fd5b5f6020828403121561331b575f80fd5b8135612aa581612a2056feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161326738038061326783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61311a8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f5780632e2194d8146100b45780635d0d7466146100e457806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad36600461284f565b61019d565b005b6100c76100c236600461284f565b610393565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26100f236600461287a565b6103a9565b61010a6101053660046128d2565b6104b7565b6040519081526020016100db565b6100b2610126366004612912565b6104d0565b61010a6101393660046129df565b610a43565b6100b261014c366004612a7b565b610a5b565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100db565b6100b261018536600461284f565b610ce8565b6100b2610198366004612a94565b610dfc565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f805160206130ee83398151915293929190829060ff1660058111156101fe576101fe612abe565b600581111561020f5761020f612abe565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612abe565b1461030e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61031f848361010001515f611223565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034c908490600401612af4565b6020604051808303815f875af1158015610368573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038c9190612b26565b5050505050565b5f6103a364e8d4a5100083612b51565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103ed5750825b90505f826001600160401b031660011480156104085750303b155b905081158015610416575080155b156104345760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045e57845460ff60401b1916600160401b1785555b6104688787611440565b83156104ae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6103a36001600160401b03831664e8d4a51000612b70565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f805160206130ee83398151915293929190829060ff16600581111561053157610531612abe565b600581111561054257610542612abe565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156105dc576105dc612abe565b146106355760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610305565b60c08101516001600160a01b0316336001600160a01b03161461066a5760405162461bcd60e51b815260040161030590612b87565b60038152426001600160401b031660808201525f8415610843576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156106cd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106f49190810190612bdc565b91509150806107155760405162461bcd60e51b815260040161030590612cae565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610758573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061077c9190612b26565b82511461079b5760405162461bcd60e51b815260040161030590612cf2565b60208201516001600160a01b0316156107c65760405162461bcd60e51b815260040161030590612d39565b5f806107d5846040015161145e565b91509150818a1461083d5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610305565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff1916600183600581111561088357610883612abe565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f9061097490889083611223565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109a3908590600401612af4565b6020604051808303815f875af11580156109bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e39190612b26565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f610a5084868585611636565b90505b949350505050565b5f5f805160206130ee8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ab6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610add9190810190612bdc565b9150915080610afe5760405162461bcd60e51b815260040161030590612cae565b8254825114610b1f5760405162461bcd60e51b815260040161030590612cf2565b60208201516001600160a01b031615610b4a5760405162461bcd60e51b815260040161030590612d39565b5f80610b598460400151611b3d565b9150915080610bb95760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610305565b5f82815260078601602052604081208054610bd390612d86565b9050118015610c05575060015f83815260088701602052604090205460ff166005811115610c0357610c03612abe565b145b610c215760405162461bcd60e51b815260040161030590612dbe565b5f8281526007860160205260408120610c3991612805565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f805160206130ee833981519152929190610d3090612d86565b9050118015610d62575060015f83815260088301602052604090205460ff166005811115610d6057610d60612abe565b145b610d7e5760405162461bcd60e51b815260040161030590612dbe565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610db79190600401612e03565b6020604051808303815f875af1158015610dd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df79190612b26565b505050565b5f5f805160206130ee8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e57573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e7e9190810190612bdc565b9150915080610e9f5760405162461bcd60e51b815260040161030590612cae565b5f8415610f18575f610eb48460400151611cde565b919350909150506001600160401b03811615610f125760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610305565b50610f8c565b5f610f268460400151611b3d565b90925090508015610f8a5760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610305565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115610fbe57610fbe612abe565b6005811115610fcf57610fcf612abe565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110805760405162461bcd60e51b815260040161030590612b87565b5f60038251600581111561109657611096612abe565b14806110b457506002825160058111156110b2576110b2612abe565b145b156110d757506020808201515f90815260098701909152604081205560046110db565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561110c5761110c612abe565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561129c5761125c816001612e8d565b611267906008612b70565b5081515f9083908390811061127e5761127e612ea0565b60200101906001600160f81b03191690815f1a905350600101611248565b505f5b60048110156112ff576112b3816003612e8d565b6112be906008612b70565b6001901c60f81b826112d1836002612eb4565b815181106112e1576112e1612ea0565b60200101906001600160f81b03191690815f1a90535060010161129f565b505f5b60208110156113615761131681601f612e8d565b611321906008612b70565b86901c60f81b82611333836006612eb4565b8151811061134357611343612ea0565b60200101906001600160f81b03191690815f1a905350600101611302565b505f5b60088110156113cc57611378816007612e8d565b611383906008612b70565b6001600160401b038616901c60f81b8261139e836026612eb4565b815181106113ae576113ae612ea0565b60200101906001600160f81b03191690815f1a905350600101611364565b505f5b6008811015611437576113e3816007612e8d565b6113ee906008612b70565b6001600160401b038516901c60f81b8261140983602e612eb4565b8151811061141957611419612ea0565b60200101906001600160f81b03191690815f1a9053506001016113cf565b50949350505050565b611448611f19565b61145182611f64565b61145a81611f88565b5050565b5f808251602e146114815760405162461bcd60e51b815260040161030590612ec7565b5f805b60028110156114d057611498816001612e8d565b6114a3906008612b70565b61ffff168582815181106114b9576114b9612ea0565b016020015160f81c901b9190911790600101611484565b5061ffff8116156114f35760405162461bcd60e51b815260040161030590612f0e565b5f805b600481101561154e5761150a816003612e8d565b611515906008612b70565b63ffffffff1686611527836002612eb4565b8151811061153757611537612ea0565b016020015160f81c901b91909117906001016114f6565b5063ffffffff81166004146115755760405162461bcd60e51b815260040161030590612f4f565b5f805b60208110156115ca5761158c81601f612e8d565b611597906008612b70565b876115a3836006612eb4565b815181106115b3576115b3612ea0565b016020015160f81c901b9190911790600101611578565b505f805b6008811015611629576115e2816007612e8d565b6115ed906008612b70565b6001600160401b031688611602836026612eb4565b8151811061161257611612612ea0565b016020015160f81c901b91909117906001016115ce565b5090969095509350505050565b5f61163f61203c565b5f805160206130ee833981519152426001600160401b03851611801561167957506001600160401b038416611677426202a300612eb4565b115b6116d95760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610305565b856117265760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610305565b5f868152600982016020526040902054156117925760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610305565b82516030146117f75760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610305565b5f61180186612086565b90505f61180d82610393565b90508260020154816001600160401b03161015801561183957508260030154816001600160401b031611155b6118915760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610305565b5f806118d86040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b03168152602001898152506120bc565b5f828152600788016020526040902091935091506118f68282612fd8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611923908590600401612af4565b6020604051808303815f875af115801561193f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119639190612b26565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff191660018360058111156119e9576119e9612abe565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610a5360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611b605760405162461bcd60e51b815260040161030590612ec7565b5f805b6002811015611baf57611b77816001612e8d565b611b82906008612b70565b61ffff16858281518110611b9857611b98612ea0565b016020015160f81c901b9190911790600101611b63565b5061ffff811615611bd25760405162461bcd60e51b815260040161030590612f0e565b5f805b6004811015611c2d57611be9816003612e8d565b611bf4906008612b70565b63ffffffff1686611c06836002612eb4565b81518110611c1657611c16612ea0565b016020015160f81c901b9190911790600101611bd5565b5063ffffffff8116600214611c545760405162461bcd60e51b815260040161030590612f4f565b5f805b6020811015611ca957611c6b81601f612e8d565b611c76906008612b70565b87611c82836006612eb4565b81518110611c9257611c92612ea0565b016020015160f81c901b9190911790600101611c57565b505f86602681518110611cbe57611cbe612ea0565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611d025760405162461bcd60e51b815260040161030590612ec7565b5f805b6002811015611d5157611d19816001612e8d565b611d24906008612b70565b61ffff16868281518110611d3a57611d3a612ea0565b016020015160f81c901b9190911790600101611d05565b5061ffff811615611d745760405162461bcd60e51b815260040161030590612f0e565b5f805b6004811015611dcf57611d8b816003612e8d565b611d96906008612b70565b63ffffffff1687611da8836002612eb4565b81518110611db857611db8612ea0565b016020015160f81c901b9190911790600101611d77565b5063ffffffff8116600114611df65760405162461bcd60e51b815260040161030590612f4f565b5f805b6020811015611e4b57611e0d81601f612e8d565b611e18906008612b70565b88611e24836006612eb4565b81518110611e3457611e34612ea0565b016020015160f81c901b9190911790600101611df9565b505f805b6008811015611eaa57611e63816007612e8d565b611e6e906008612b70565b6001600160401b031689611e83836026612eb4565b81518110611e9357611e93612ea0565b016020015160f81c901b9190911790600101611e4f565b505f805b6008811015611f0957611ec2816007612e8d565b611ecd906008612b70565b6001600160401b03168a611ee283602e612eb4565b81518110611ef257611ef2612ea0565b016020015160f81c901b9190911790600101611eae565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611f6257604051631afcd79f60e31b815260040160405180910390fd5b565b611f6c611f19565b611f74612487565b611f7c612497565b611f858161249f565b50565b611f90611f19565b7f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f916001600160a01b03821661201c5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610305565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161208057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6103a3827f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91546001600160a01b0316906125cf565b5f60608260800151516030146121265760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610305565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561219d5761215d816001612e8d565b612168906008612b70565b5081515f9083908390811061217f5761217f612ea0565b60200101906001600160f81b03191690815f1a905350600101612149565b505f5b60048110156121fb576121b4816003612e8d565b6121bf906008612b70565b505f826121cd836002612eb4565b815181106121dd576121dd612ea0565b60200101906001600160f81b03191690815f1a9053506001016121a0565b505f5b6020811015612258578451816020811061221a5761221a612ea0565b1a60f81b8261222a836006612eb4565b8151811061223a5761223a612ea0565b60200101906001600160f81b03191690815f1a9053506001016121fe565b505f5b60208110156122b8578460200151816020811061227a5761227a612ea0565b1a60f81b8261228a836026612eb4565b8151811061229a5761229a612ea0565b60200101906001600160f81b03191690815f1a90535060010161225b565b505f5b600881101561232c576122cf816007612e8d565b6122da906008612b70565b60ff1685604001516001600160401b0316901c60f81b828260466122fe9190612eb4565b8151811061230e5761230e612ea0565b60200101906001600160f81b03191690815f1a9053506001016122bb565b505f5b6030811015612397578460800151818151811061234e5761234e612ea0565b01602001516001600160f81b0319168261236983604e612eb4565b8151811061237957612379612ea0565b60200101906001600160f81b03191690815f1a90535060010161232f565b505f5b6008811015612409576123ae816007612e8d565b6123b9906008612b70565b60608601516001600160401b0390811691161c60f81b826123db83607e612eb4565b815181106123eb576123eb612ea0565b60200101906001600160f81b03191690815f1a90535060010161239a565b5060028160405161241a9190613097565b602060405180830381855afa158015612435573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906124589190612b26565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61248f611f19565b611f62612731565b611f62611f19565b6124a7611f19565b80355f805160206130ee83398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561253f60a08301608084016128d2565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561257260c0830160a084016130b2565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556125a360e0830160c084016130d2565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612615573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126399190612b26565b90506126506001600160a01b038516333086612739565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015612694573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126b89190612b26565b905081811161271e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610305565b6127288282612e8d565b95945050505050565b612461611f19565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612793908590612799565b50505050565b5f8060205f8451602086015f885af1806127b8576040513d5f823e3d81fd5b50505f513d915081156127cf5780600114156127dc565b6001600160a01b0384163b155b1561279357604051635274afe760e01b81526001600160a01b0385166004820152602401610305565b50805461281190612d86565b5f825580601f10612820575050565b601f0160209004905f5260205f2090810190611f8591905b8082111561284b575f8155600101612838565b5090565b5f6020828403121561285f575f80fd5b5035919050565b6001600160a01b0381168114611f85575f80fd5b5f8082840361010081121561288d575f80fd5b60e081121561289a575f80fd5b5082915060e08301356128ac81612866565b809150509250929050565b80356001600160401b03811681146128cd575f80fd5b919050565b5f602082840312156128e2575f80fd5b6128eb826128b7565b9392505050565b8015158114611f85575f80fd5b803563ffffffff811681146128cd575f80fd5b5f805f60608486031215612924575f80fd5b833592506020840135612936816128f2565b9150612944604085016128ff565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129835761298361294d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129b1576129b161294d565b604052919050565b5f6001600160401b038211156129d1576129d161294d565b50601f01601f191660200190565b5f805f80608085870312156129f2575f80fd5b8435935060208501359250612a09604086016128b7565b915060608501356001600160401b03811115612a23575f80fd5b8501601f81018713612a33575f80fd5b8035612a46612a41826129b9565b612989565b818152886020838501011115612a5a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612a8b575f80fd5b6128eb826128ff565b5f8060408385031215612aa5575f80fd5b612aae836128ff565b915060208301356128ac816128f2565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612aec578181015183820152602001612ad4565b50505f910152565b602081525f8251806020840152612b12816040850160208701612ad2565b601f01601f19169190910160400192915050565b5f60208284031215612b36575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f82612b6b57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176103a3576103a3612b3d565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b80516128cd816128f2565b5f8060408385031215612bed575f80fd5b82516001600160401b0380821115612c03575f80fd5b9084019060608287031215612c16575f80fd5b612c1e612961565b82518152602080840151612c3181612866565b82820152604084015183811115612c46575f80fd5b80850194505087601f850112612c5a575f80fd5b83519250612c6a612a41846129b9565b8381528882858701011115612c7d575f80fd5b612c8c84838301848801612ad2565b80604084015250819550612ca1818801612bd1565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612d9a57607f821691505b602082108103612db857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612e1581612d86565b806020870152604060018084165f8114612e365760018114612e5257612e7f565b60ff19851660408a0152604084151560051b8a01019550612e7f565b895f5260205f205f5b85811015612e765781548b8201860152908301908801612e5b565b8a016040019650505b509398975050505050505050565b818103818111156103a3576103a3612b3d565b634e487b7160e01b5f52603260045260245ffd5b808201808211156103a3576103a3612b3d565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610df757805f5260205f20601f840160051c81016020851015612fb95750805b601f840160051c820191505b8181101561038c575f8155600101612fc5565b81516001600160401b03811115612ff157612ff161294d565b61300581612fff8454612d86565b84612f94565b602080601f831160018114613038575f84156130215750858301515b5f19600386901b1c1916600185901b17855561308f565b5f85815260208120601f198616915b8281101561306657888601518255948401946001909101908401613047565b508582101561308357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f82516130a8818460208701612ad2565b9190910192915050565b5f602082840312156130c2575f80fd5b813560ff811681146128eb575f80fd5b5f602082840312156130e2575f80fd5b81356128eb8161286656feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index ebb39787d..4b36d3bd2 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -43,7 +43,7 @@ type StakingManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161319b38038061319b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61304e8061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780632e2194d8146100b457806362065856146100f057806376f786211461011d57806379f54eb11461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad366004612734565b6101fd565b005b3480156100bf575f80fd5b506100d36100ce366004612734565b6103f3565b6040516001600160401b0390911681526020015b60405180910390f35b3480156100fb575f80fd5b5061010f61010a366004612766565b610409565b6040519081526020016100e7565b348015610128575f80fd5b506100b26101373660046127a6565b610422565b348015610147575f80fd5b506100b26101563660046127e1565b6109a2565b348015610166575f80fd5b506100b26101753660046127f7565b610aae565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b0390911681526020016100e7565b3480156101b7575f80fd5b506100b26101c6366004612734565b610d3b565b61010f6101d93660046128a2565b610e4f565b3480156101e9575f80fd5b506100b26101f8366004612934565b610e64565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061302283398151915293929190829060ff16600581111561025e5761025e612969565b600581111561026f5761026f612969565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561030657610306612969565b1461036e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61037f848361010001515f61128b565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ac90849060040161299f565b6020604051808303815f875af11580156103c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ec91906129d1565b5050505050565b5f61040364e8d4a5100083612a10565b92915050565b5f6104036001600160401b03831664e8d4a51000612a23565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061302283398151915293929190829060ff16600581111561048357610483612969565b600581111561049457610494612969565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561052e5761052e612969565b146105875760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610365565b60c08101516001600160a01b0316336001600160a01b0316146105bc5760405162461bcd60e51b815260040161036590612a3a565b6105c981604001516114a8565b60038152426001600160401b031660808201525f84156107a2576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561062c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106539190810190612aa3565b91509150806106745760405162461bcd60e51b815260040161036590612b75565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906129d1565b8251146106fa5760405162461bcd60e51b815260040161036590612bb9565b60208201516001600160a01b0316156107255760405162461bcd60e51b815260040161036590612c00565b5f806107348460400151611655565b91509150818a1461079c5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610365565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff191660018360058111156107e2576107e2612969565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f906108d39088908361128b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061090290859060040161299f565b6020604051808303815f875af115801561091e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094291906129d1565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156109e65750825b90505f826001600160401b03166001148015610a015750303b155b905081158015610a0f575080155b15610a2d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a5757845460ff60401b1916600160401b1785555b610a608661182d565b8315610aa657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f5f805160206130228339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b09573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b309190810190612aa3565b9150915080610b515760405162461bcd60e51b815260040161036590612b75565b8254825114610b725760405162461bcd60e51b815260040161036590612bb9565b60208201516001600160a01b031615610b9d5760405162461bcd60e51b815260040161036590612c00565b5f80610bac8460400151611841565b9150915080610c0c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610365565b5f82815260078601602052604081208054610c2690612c4d565b9050118015610c58575060015f83815260088701602052604090205460ff166005811115610c5657610c56612969565b145b610c745760405162461bcd60e51b815260040161036590612c7f565b5f8281526007860160205260408120610c8c916126ea565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020613022833981519152929190610d8390612c4d565b9050118015610db5575060015f83815260088301602052604090205460ff166005811115610db357610db3612969565b145b610dd15760405162461bcd60e51b815260040161036590612c7f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e0a9190600401612cc4565b6020604051808303815f875af1158015610e26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4a91906129d1565b505050565b5f610e5c843485856119e2565b949350505050565b5f5f805160206130228339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ebf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ee69190810190612aa3565b9150915080610f075760405162461bcd60e51b815260040161036590612b75565b5f8415610f80575f610f1c8460400151611ede565b919350909150506001600160401b03811615610f7a5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610365565b50610ff4565b5f610f8e8460400151611841565b90925090508015610ff25760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610365565b505b5f818152600885016020526040808220815161012081019092528054829060ff16600581111561102657611026612969565b600581111561103757611037612969565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110e85760405162461bcd60e51b815260040161036590612a3a565b5f6003825160058111156110fe576110fe612969565b148061111c575060028251600581111561111a5761111a612969565b145b1561113f57506020808201515f9081526009870190915260408120556004611143565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561117457611174612969565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611304576112c4816001612d4e565b6112cf906008612a23565b5081515f908390839081106112e6576112e6612d61565b60200101906001600160f81b03191690815f1a9053506001016112b0565b505f5b60048110156113675761131b816003612d4e565b611326906008612a23565b6001901c60f81b82611339836002612d75565b8151811061134957611349612d61565b60200101906001600160f81b03191690815f1a905350600101611307565b505f5b60208110156113c95761137e81601f612d4e565b611389906008612a23565b86901c60f81b8261139b836006612d75565b815181106113ab576113ab612d61565b60200101906001600160f81b03191690815f1a90535060010161136a565b505f5b6008811015611434576113e0816007612d4e565b6113eb906008612a23565b6001600160401b038616901c60f81b82611406836026612d75565b8151811061141657611416612d61565b60200101906001600160f81b03191690815f1a9053506001016113cc565b505f5b600881101561149f5761144b816007612d4e565b611456906008612a23565b6001600160401b038516901c60f81b8261147183602e612d75565b8151811061148157611481612d61565b60200101906001600160f81b03191690815f1a905350600101611437565b50949350505050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f8051602061302283398151915290600160e01b900460ff165f036114ed575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906115359083612d4e565b10611551576001600160401b0384166040830152808252611570565b83826040018181516115639190612d88565b6001600160401b03169052505b5f8260200151836040015160646115879190612daf565b6115919190612dda565b600485015490915060ff600160e01b909104811690821611156116115760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610365565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602e146116785760405162461bcd60e51b815260040161036590612dff565b5f805b60028110156116c75761168f816001612d4e565b61169a906008612a23565b61ffff168582815181106116b0576116b0612d61565b016020015160f81c901b919091179060010161167b565b5061ffff8116156116ea5760405162461bcd60e51b815260040161036590612e46565b5f805b600481101561174557611701816003612d4e565b61170c906008612a23565b63ffffffff168661171e836002612d75565b8151811061172e5761172e612d61565b016020015160f81c901b91909117906001016116ed565b5063ffffffff811660041461176c5760405162461bcd60e51b815260040161036590612e87565b5f805b60208110156117c15761178381601f612d4e565b61178e906008612a23565b8761179a836006612d75565b815181106117aa576117aa612d61565b016020015160f81c901b919091179060010161176f565b505f805b6008811015611820576117d9816007612d4e565b6117e4906008612a23565b6001600160401b0316886117f9836026612d75565b8151811061180957611809612d61565b016020015160f81c901b91909117906001016117c5565b5090969095509350505050565b611835612119565b61183e81612164565b50565b5f8082516027146118645760405162461bcd60e51b815260040161036590612dff565b5f805b60028110156118b35761187b816001612d4e565b611886906008612a23565b61ffff1685828151811061189c5761189c612d61565b016020015160f81c901b9190911790600101611867565b5061ffff8116156118d65760405162461bcd60e51b815260040161036590612e46565b5f805b6004811015611931576118ed816003612d4e565b6118f8906008612a23565b63ffffffff168661190a836002612d75565b8151811061191a5761191a612d61565b016020015160f81c901b91909117906001016118d9565b5063ffffffff81166002146119585760405162461bcd60e51b815260040161036590612e87565b5f805b60208110156119ad5761196f81601f612d4e565b61197a906008612a23565b87611986836006612d75565b8151811061199657611996612d61565b016020015160f81c901b919091179060010161195b565b505f866026815181106119c2576119c2612d61565b016020015191976001600160f81b03199092161515965090945050505050565b5f6119eb612185565b5f80516020613022833981519152426001600160401b038516118015611a2557506001600160401b038416611a23426202a300612d75565b115b611a855760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610365565b85611ad25760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610365565b5f86815260098201602052604090205415611b3e5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610365565b8251603014611ba35760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610365565b845f611bae826103f3565b90508260020154816001600160401b031610158015611bda57508260030154816001600160401b031611155b611c325760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610365565b5f80611c796040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b03168152602001898152506121cf565b5f82815260078801602052604090209193509150611c978282612f10565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611cc490859060040161299f565b6020604051808303815f875af1158015611ce0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0491906129d1565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611d8a57611d8a612969565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610e5c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611f025760405162461bcd60e51b815260040161036590612dff565b5f805b6002811015611f5157611f19816001612d4e565b611f24906008612a23565b61ffff16868281518110611f3a57611f3a612d61565b016020015160f81c901b9190911790600101611f05565b5061ffff811615611f745760405162461bcd60e51b815260040161036590612e46565b5f805b6004811015611fcf57611f8b816003612d4e565b611f96906008612a23565b63ffffffff1687611fa8836002612d75565b81518110611fb857611fb8612d61565b016020015160f81c901b9190911790600101611f77565b5063ffffffff8116600114611ff65760405162461bcd60e51b815260040161036590612e87565b5f805b602081101561204b5761200d81601f612d4e565b612018906008612a23565b88612024836006612d75565b8151811061203457612034612d61565b016020015160f81c901b9190911790600101611ff9565b505f805b60088110156120aa57612063816007612d4e565b61206e906008612a23565b6001600160401b031689612083836026612d75565b8151811061209357612093612d61565b016020015160f81c901b919091179060010161204f565b505f805b6008811015612109576120c2816007612d4e565b6120cd906008612a23565b6001600160401b03168a6120e283602e612d75565b815181106120f2576120f2612d61565b016020015160f81c901b91909117906001016120ae565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661216257604051631afcd79f60e31b815260040160405180910390fd5b565b61216c612119565b61217461259a565b61217c6125aa565b61183e816125b2565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016121c957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146122395760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610365565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156122b057612270816001612d4e565b61227b906008612a23565b5081515f9083908390811061229257612292612d61565b60200101906001600160f81b03191690815f1a90535060010161225c565b505f5b600481101561230e576122c7816003612d4e565b6122d2906008612a23565b505f826122e0836002612d75565b815181106122f0576122f0612d61565b60200101906001600160f81b03191690815f1a9053506001016122b3565b505f5b602081101561236b578451816020811061232d5761232d612d61565b1a60f81b8261233d836006612d75565b8151811061234d5761234d612d61565b60200101906001600160f81b03191690815f1a905350600101612311565b505f5b60208110156123cb578460200151816020811061238d5761238d612d61565b1a60f81b8261239d836026612d75565b815181106123ad576123ad612d61565b60200101906001600160f81b03191690815f1a90535060010161236e565b505f5b600881101561243f576123e2816007612d4e565b6123ed906008612a23565b60ff1685604001516001600160401b0316901c60f81b828260466124119190612d75565b8151811061242157612421612d61565b60200101906001600160f81b03191690815f1a9053506001016123ce565b505f5b60308110156124aa578460800151818151811061246157612461612d61565b01602001516001600160f81b0319168261247c83604e612d75565b8151811061248c5761248c612d61565b60200101906001600160f81b03191690815f1a905350600101612442565b505f5b600881101561251c576124c1816007612d4e565b6124cc906008612a23565b60608601516001600160401b0390811691161c60f81b826124ee83607e612d75565b815181106124fe576124fe612d61565b60200101906001600160f81b03191690815f1a9053506001016124ad565b5060028160405161252d9190612fcb565b602060405180830381855afa158015612548573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061256b91906129d1565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6125a2612119565b6121626126e2565b612162612119565b6125ba612119565b80355f8051602061302283398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561265260a0830160808401612766565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561268560c0830160a08401612fe6565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556126b660e0830160c08401613006565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b612574612119565b5080546126f690612c4d565b5f825580601f10612705575050565b601f0160209004905f5260205f209081019061183e91905b80821115612730575f815560010161271d565b5090565b5f60208284031215612744575f80fd5b5035919050565b80356001600160401b0381168114612761575f80fd5b919050565b5f60208284031215612776575f80fd5b61277f8261274b565b9392505050565b801515811461183e575f80fd5b803563ffffffff81168114612761575f80fd5b5f805f606084860312156127b8575f80fd5b8335925060208401356127ca81612786565b91506127d860408501612793565b90509250925092565b5f60e082840312156127f1575f80fd5b50919050565b5f60208284031215612807575f80fd5b61277f82612793565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561284657612846612810565b60405290565b604051601f8201601f191681016001600160401b038111828210171561287457612874612810565b604052919050565b5f6001600160401b0382111561289457612894612810565b50601f01601f191660200190565b5f805f606084860312156128b4575f80fd5b833592506128c46020850161274b565b915060408401356001600160401b038111156128de575f80fd5b8401601f810186136128ee575f80fd5b80356129016128fc8261287c565b61284c565b818152876020838501011115612915575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612945575f80fd5b61294e83612793565b9150602083013561295e81612786565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561299757818101518382015260200161297f565b50505f910152565b602081525f82518060208401526129bd81604085016020870161297d565b601f01601f19169190910160400192915050565b5f602082840312156129e1575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612a1e57612a1e6129e8565b500490565b8082028115828204841417610403576104036129fc565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b6001600160a01b038116811461183e575f80fd5b805161276181612786565b5f8060408385031215612ab4575f80fd5b82516001600160401b0380821115612aca575f80fd5b9084019060608287031215612add575f80fd5b612ae5612824565b82518152602080840151612af881612a84565b82820152604084015183811115612b0d575f80fd5b80850194505087601f850112612b21575f80fd5b83519250612b316128fc8461287c565b8381528882858701011115612b44575f80fd5b612b538483830184880161297d565b80604084015250819550612b68818801612a98565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612c6157607f821691505b6020821081036127f157634e487b7160e01b5f52602260045260245ffd5b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612cd681612c4d565b806020870152604060018084165f8114612cf75760018114612d1357612d40565b60ff19851660408a0152604084151560051b8a01019550612d40565b895f5260205f205f5b85811015612d375781548b8201860152908301908801612d1c565b8a016040019650505b509398975050505050505050565b81810381811115610403576104036129fc565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610403576104036129fc565b6001600160401b03818116838216019080821115612da857612da86129fc565b5092915050565b6001600160401b03818116838216028082169190828114612dd257612dd26129fc565b505092915050565b5f6001600160401b0380841680612df357612df36129e8565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e4a57805f5260205f20601f840160051c81016020851015612ef15750805b601f840160051c820191505b818110156103ec575f8155600101612efd565b81516001600160401b03811115612f2957612f29612810565b612f3d81612f378454612c4d565b84612ecc565b602080601f831160018114612f70575f8415612f595750858301515b5f19600386901b1c1916600185901b178555610aa6565b5f85815260208120601f198616915b82811015612f9e57888601518255948401946001909101908401612f7f565b5085821015612fbb57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251612fdc81846020870161297d565b9190910192915050565b5f60208284031215612ff6575f80fd5b813560ff8116811461277f575f80fd5b5f60208284031215613016575f80fd5b813561277f81612a8456feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612f62380380612f6283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612e158061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780632e2194d8146100b457806362065856146100f057806376f786211461011d57806379f54eb11461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad36600461257a565b6101fd565b005b3480156100bf575f80fd5b506100d36100ce36600461257a565b6103f3565b6040516001600160401b0390911681526020015b60405180910390f35b3480156100fb575f80fd5b5061010f61010a3660046125ac565b610409565b6040519081526020016100e7565b348015610128575f80fd5b506100b26101373660046125ec565b610422565b348015610147575f80fd5b506100b2610156366004612627565b610995565b348015610166575f80fd5b506100b261017536600461263d565b610aa1565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b0390911681526020016100e7565b3480156101b7575f80fd5b506100b26101c636600461257a565b610d2e565b61010f6101d93660046126e8565b610e42565b3480156101e9575f80fd5b506100b26101f836600461277a565b610e57565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612de983398151915293929190829060ff16600581111561025e5761025e6127af565b600581111561026f5761026f6127af565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004166101009091015290915081516005811115610306576103066127af565b1461036e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61037f848361010001515f61127e565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ac9084906004016127e5565b6020604051808303815f875af11580156103c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ec9190612817565b5050505050565b5f61040364e8d4a5100083612842565b92915050565b5f6104036001600160401b03831664e8d4a51000612861565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612de983398151915293929190829060ff166005811115610483576104836127af565b6005811115610494576104946127af565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561052e5761052e6127af565b146105875760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610365565b60c08101516001600160a01b0316336001600160a01b0316146105bc5760405162461bcd60e51b815260040161036590612878565b60038152426001600160401b031660808201525f8415610795576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561061f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261064691908101906128e1565b91509150806106675760405162461bcd60e51b8152600401610365906129b3565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ce9190612817565b8251146106ed5760405162461bcd60e51b8152600401610365906129f7565b60208201516001600160a01b0316156107185760405162461bcd60e51b815260040161036590612a3e565b5f80610727846040015161149b565b91509150818a1461078f5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610365565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff191660018360058111156107d5576107d56127af565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f906108c69088908361127e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906108f59085906004016127e5565b6020604051808303815f875af1158015610911573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109359190612817565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156109d95750825b90505f826001600160401b031660011480156109f45750303b155b905081158015610a02575080155b15610a205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a4a57845460ff60401b1916600160401b1785555b610a5386611673565b8315610a9957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f5f80516020612de98339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610afc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b2391908101906128e1565b9150915080610b445760405162461bcd60e51b8152600401610365906129b3565b8254825114610b655760405162461bcd60e51b8152600401610365906129f7565b60208201516001600160a01b031615610b905760405162461bcd60e51b815260040161036590612a3e565b5f80610b9f8460400151611687565b9150915080610bff5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610365565b5f82815260078601602052604081208054610c1990612a8b565b9050118015610c4b575060015f83815260088701602052604090205460ff166005811115610c4957610c496127af565b145b610c675760405162461bcd60e51b815260040161036590612abd565b5f8281526007860160205260408120610c7f91612530565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020612de9833981519152929190610d7690612a8b565b9050118015610da8575060015f83815260088301602052604090205460ff166005811115610da657610da66127af565b145b610dc45760405162461bcd60e51b815260040161036590612abd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dfd9190600401612b02565b6020604051808303815f875af1158015610e19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3d9190612817565b505050565b5f610e4f84348585611828565b949350505050565b5f5f80516020612de98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610eb2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ed991908101906128e1565b9150915080610efa5760405162461bcd60e51b8152600401610365906129b3565b5f8415610f73575f610f0f8460400151611d24565b919350909150506001600160401b03811615610f6d5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610365565b50610fe7565b5f610f818460400151611687565b90925090508015610fe55760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610365565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115611019576110196127af565b600581111561102a5761102a6127af565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110db5760405162461bcd60e51b815260040161036590612878565b5f6003825160058111156110f1576110f16127af565b148061110f575060028251600581111561110d5761110d6127af565b145b1561113257506020808201515f9081526009870190915260408120556004611136565b5060055b5f83815260088701602052604090208251815484929190829060ff19166001836005811115611167576111676127af565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156112f7576112b7816001612b8c565b6112c2906008612861565b5081515f908390839081106112d9576112d9612b9f565b60200101906001600160f81b03191690815f1a9053506001016112a3565b505f5b600481101561135a5761130e816003612b8c565b611319906008612861565b6001901c60f81b8261132c836002612bb3565b8151811061133c5761133c612b9f565b60200101906001600160f81b03191690815f1a9053506001016112fa565b505f5b60208110156113bc5761137181601f612b8c565b61137c906008612861565b86901c60f81b8261138e836006612bb3565b8151811061139e5761139e612b9f565b60200101906001600160f81b03191690815f1a90535060010161135d565b505f5b6008811015611427576113d3816007612b8c565b6113de906008612861565b6001600160401b038616901c60f81b826113f9836026612bb3565b8151811061140957611409612b9f565b60200101906001600160f81b03191690815f1a9053506001016113bf565b505f5b60088110156114925761143e816007612b8c565b611449906008612861565b6001600160401b038516901c60f81b8261146483602e612bb3565b8151811061147457611474612b9f565b60200101906001600160f81b03191690815f1a90535060010161142a565b50949350505050565b5f808251602e146114be5760405162461bcd60e51b815260040161036590612bc6565b5f805b600281101561150d576114d5816001612b8c565b6114e0906008612861565b61ffff168582815181106114f6576114f6612b9f565b016020015160f81c901b91909117906001016114c1565b5061ffff8116156115305760405162461bcd60e51b815260040161036590612c0d565b5f805b600481101561158b57611547816003612b8c565b611552906008612861565b63ffffffff1686611564836002612bb3565b8151811061157457611574612b9f565b016020015160f81c901b9190911790600101611533565b5063ffffffff81166004146115b25760405162461bcd60e51b815260040161036590612c4e565b5f805b6020811015611607576115c981601f612b8c565b6115d4906008612861565b876115e0836006612bb3565b815181106115f0576115f0612b9f565b016020015160f81c901b91909117906001016115b5565b505f805b60088110156116665761161f816007612b8c565b61162a906008612861565b6001600160401b03168861163f836026612bb3565b8151811061164f5761164f612b9f565b016020015160f81c901b919091179060010161160b565b5090969095509350505050565b61167b611f5f565b61168481611faa565b50565b5f8082516027146116aa5760405162461bcd60e51b815260040161036590612bc6565b5f805b60028110156116f9576116c1816001612b8c565b6116cc906008612861565b61ffff168582815181106116e2576116e2612b9f565b016020015160f81c901b91909117906001016116ad565b5061ffff81161561171c5760405162461bcd60e51b815260040161036590612c0d565b5f805b600481101561177757611733816003612b8c565b61173e906008612861565b63ffffffff1686611750836002612bb3565b8151811061176057611760612b9f565b016020015160f81c901b919091179060010161171f565b5063ffffffff811660021461179e5760405162461bcd60e51b815260040161036590612c4e565b5f805b60208110156117f3576117b581601f612b8c565b6117c0906008612861565b876117cc836006612bb3565b815181106117dc576117dc612b9f565b016020015160f81c901b91909117906001016117a1565b505f8660268151811061180857611808612b9f565b016020015191976001600160f81b03199092161515965090945050505050565b5f611831611fcb565b5f80516020612de9833981519152426001600160401b03851611801561186b57506001600160401b038416611869426202a300612bb3565b115b6118cb5760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610365565b856119185760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610365565b5f868152600982016020526040902054156119845760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610365565b82516030146119e95760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610365565b845f6119f4826103f3565b90508260020154816001600160401b031610158015611a2057508260030154816001600160401b031611155b611a785760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610365565b5f80611abf6040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b0316815260200189815250612015565b5f82815260078801602052604090209193509150611add8282612cd7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b0a9085906004016127e5565b6020604051808303815f875af1158015611b26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4a9190612817565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611bd057611bd06127af565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610e4f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611d485760405162461bcd60e51b815260040161036590612bc6565b5f805b6002811015611d9757611d5f816001612b8c565b611d6a906008612861565b61ffff16868281518110611d8057611d80612b9f565b016020015160f81c901b9190911790600101611d4b565b5061ffff811615611dba5760405162461bcd60e51b815260040161036590612c0d565b5f805b6004811015611e1557611dd1816003612b8c565b611ddc906008612861565b63ffffffff1687611dee836002612bb3565b81518110611dfe57611dfe612b9f565b016020015160f81c901b9190911790600101611dbd565b5063ffffffff8116600114611e3c5760405162461bcd60e51b815260040161036590612c4e565b5f805b6020811015611e9157611e5381601f612b8c565b611e5e906008612861565b88611e6a836006612bb3565b81518110611e7a57611e7a612b9f565b016020015160f81c901b9190911790600101611e3f565b505f805b6008811015611ef057611ea9816007612b8c565b611eb4906008612861565b6001600160401b031689611ec9836026612bb3565b81518110611ed957611ed9612b9f565b016020015160f81c901b9190911790600101611e95565b505f805b6008811015611f4f57611f08816007612b8c565b611f13906008612861565b6001600160401b03168a611f2883602e612bb3565b81518110611f3857611f38612b9f565b016020015160f81c901b9190911790600101611ef4565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611fa857604051631afcd79f60e31b815260040160405180910390fd5b565b611fb2611f5f565b611fba6123e0565b611fc26123f0565b611684816123f8565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161200f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461207f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610365565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156120f6576120b6816001612b8c565b6120c1906008612861565b5081515f908390839081106120d8576120d8612b9f565b60200101906001600160f81b03191690815f1a9053506001016120a2565b505f5b60048110156121545761210d816003612b8c565b612118906008612861565b505f82612126836002612bb3565b8151811061213657612136612b9f565b60200101906001600160f81b03191690815f1a9053506001016120f9565b505f5b60208110156121b1578451816020811061217357612173612b9f565b1a60f81b82612183836006612bb3565b8151811061219357612193612b9f565b60200101906001600160f81b03191690815f1a905350600101612157565b505f5b602081101561221157846020015181602081106121d3576121d3612b9f565b1a60f81b826121e3836026612bb3565b815181106121f3576121f3612b9f565b60200101906001600160f81b03191690815f1a9053506001016121b4565b505f5b600881101561228557612228816007612b8c565b612233906008612861565b60ff1685604001516001600160401b0316901c60f81b828260466122579190612bb3565b8151811061226757612267612b9f565b60200101906001600160f81b03191690815f1a905350600101612214565b505f5b60308110156122f057846080015181815181106122a7576122a7612b9f565b01602001516001600160f81b031916826122c283604e612bb3565b815181106122d2576122d2612b9f565b60200101906001600160f81b03191690815f1a905350600101612288565b505f5b600881101561236257612307816007612b8c565b612312906008612861565b60608601516001600160401b0390811691161c60f81b8261233483607e612bb3565b8151811061234457612344612b9f565b60200101906001600160f81b03191690815f1a9053506001016122f3565b506002816040516123739190612d92565b602060405180830381855afa15801561238e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906123b19190612817565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6123e8611f5f565b611fa8612528565b611fa8611f5f565b612400611f5f565b80355f80516020612de983398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561249860a08301608084016125ac565b60048201805467ffffffffffffffff19166001600160401b03929092169190911790556124cb60c0830160a08401612dad565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556124fc60e0830160c08401612dcd565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6123ba611f5f565b50805461253c90612a8b565b5f825580601f1061254b575050565b601f0160209004905f5260205f209081019061168491905b80821115612576575f8155600101612563565b5090565b5f6020828403121561258a575f80fd5b5035919050565b80356001600160401b03811681146125a7575f80fd5b919050565b5f602082840312156125bc575f80fd5b6125c582612591565b9392505050565b8015158114611684575f80fd5b803563ffffffff811681146125a7575f80fd5b5f805f606084860312156125fe575f80fd5b833592506020840135612610816125cc565b915061261e604085016125d9565b90509250925092565b5f60e08284031215612637575f80fd5b50919050565b5f6020828403121561264d575f80fd5b6125c5826125d9565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561268c5761268c612656565b60405290565b604051601f8201601f191681016001600160401b03811182821017156126ba576126ba612656565b604052919050565b5f6001600160401b038211156126da576126da612656565b50601f01601f191660200190565b5f805f606084860312156126fa575f80fd5b8335925061270a60208501612591565b915060408401356001600160401b03811115612724575f80fd5b8401601f81018613612734575f80fd5b8035612747612742826126c2565b612692565b81815287602083850101111561275b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f806040838503121561278b575f80fd5b612794836125d9565b915060208301356127a4816125cc565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156127dd5781810151838201526020016127c5565b50505f910152565b602081525f82518060208401526128038160408501602087016127c3565b601f01601f19169190910160400192915050565b5f60208284031215612827575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f8261285c57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176104035761040361282e565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b6001600160a01b0381168114611684575f80fd5b80516125a7816125cc565b5f80604083850312156128f2575f80fd5b82516001600160401b0380821115612908575f80fd5b908401906060828703121561291b575f80fd5b61292361266a565b82518152602080840151612936816128c2565b8282015260408401518381111561294b575f80fd5b80850194505087601f85011261295f575f80fd5b8351925061296f612742846126c2565b8381528882858701011115612982575f80fd5b612991848383018488016127c3565b806040840152508195506129a68188016128d6565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612a9f57607f821691505b60208210810361263757634e487b7160e01b5f52602260045260245ffd5b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612b1481612a8b565b806020870152604060018084165f8114612b355760018114612b5157612b7e565b60ff19851660408a0152604084151560051b8a01019550612b7e565b895f5260205f205f5b85811015612b755781548b8201860152908301908801612b5a565b8a016040019650505b509398975050505050505050565b818103818111156104035761040361282e565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104035761040361282e565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e3d57805f5260205f20601f840160051c81016020851015612cb85750805b601f840160051c820191505b818110156103ec575f8155600101612cc4565b81516001600160401b03811115612cf057612cf0612656565b612d0481612cfe8454612a8b565b84612c93565b602080601f831160018114612d37575f8415612d205750858301515b5f19600386901b1c1916600185901b178555610a99565b5f85815260208120601f198616915b82811015612d6557888601518255948401946001909101908401612d46565b5085821015612d8257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251612da38184602087016127c3565b9190910192915050565b5f60208284031215612dbd575f80fd5b813560ff811681146125c5575f80fd5b5f60208284031215612ddd575f80fd5b81356125c5816128c256feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 75482afff..619e784f2 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -146,6 +146,7 @@ abstract contract StakingManager is // Ensure the stake churn doesn't exceed the maximum churn rate. uint64 weight = valueToWeight(lockedValue); + // TODO: Support this in the e2e test // _checkAndUpdateChurnTracker(weight); // Ensure the weight is within the valid range. @@ -258,7 +259,8 @@ abstract contract StakingManager is require(_msgSender() == validator.owner, "StakingManager: Sender not validator owner"); // Check that removing this validator would not exceed the maximum churn rate. - _checkAndUpdateChurnTracker(validator.weight); + // TODO: Support this in the e2e test + // _checkAndUpdateChurnTracker(validator.weight); // Update the validator status to pending removal. // They are not removed from the active validators mapping until the P-Chain acknowledges the removal. diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index 789872b78..de21a4f8b 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -199,4 +199,96 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + + // + // Delist the validator + // + { + opts, err = bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + Expect(err).Should(BeNil()) + tx, err = stakingManager.InitializeEndValidation( + opts, + validationID, + false, + 0, + ) + Expect(err).Should(BeNil()) + receipt = utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) + validatorRemovalEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(validatorRemovalEvent.StakeAmount.Uint64()).Should(Equal(uint64(1e6))) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage = network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + Expect(err).Should(BeNil()) + log.Info("Constructed signed SetSubnetValidatorWeightMessage message", "message", signedWarpMessage) + // Validate the Warp message, (this will be done on the P-Chain in the future) + msg, err = warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) + Expect(err).Should(BeNil()) + // Check that the addressed call payload is a registered Warp message type + var payloadInterface warpMessages.Payload + ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) + Expect(err).Should(BeNil()) + registerValidatorPayload, ok := payloadInterface.(*warpMessages.SetSubnetValidatorWeight) + Expect(ok).Should(BeTrue()) + + Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) + Expect(registerValidatorPayload.ValidationID).Should(Equal(validationID)) + Expect(registerValidatorPayload.Weight).Should(Equal(uint64(0))) + Expect(registerValidatorPayload.Nonce).Should(Equal(uint64(0))) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Query P-Chain validators for the Warp message + registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, false) + Expect(err).Should(BeNil()) + registrationAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), registrationPayload.Bytes()) + Expect(err).Should(BeNil()) + registrationUnsignedMessage, err := avalancheWarp.NewUnsignedMessage(network.GetNetworkID(), pChainInfo.BlockchainID, registrationAddressedCall.Bytes()) + Expect(err).Should(BeNil()) + log.Info("Constructed unsigned SubnetValidatorRegistration message", "message", hex.EncodeToString(registrationUnsignedMessage.Bytes())) + + registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( + registrationUnsignedMessage, + nil, + subnetAInfo.SubnetID, + 67, + ) + Expect(err).Should(BeNil()) + log.Info("Constructed signed SubnetValidatorRegistration message", "message", registrationSignedMessage) + + // Deliver the Warp message to the subnet + abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("completeEndValidation", uint32(0), false) + Expect(err).Should(BeNil()) + gasFeeCap, gasTipCap, nonce := utils.CalculateTxParams(context.Background(), subnetAInfo, utils.PrivateKeyToAddress(fundedKey)) + registrationTx := predicateutils.NewPredicateTx( + subnetAInfo.EVMChainID, + nonce, + &stakingManagerContractAddress, + 2_000_000, + gasFeeCap, + gasTipCap, + big.NewInt(0), + callData, + types.AccessList{}, + warp.ContractAddress, + registrationSignedMessage.Bytes(), + ) + signedRegistrationTx := utils.SignTransaction(registrationTx, fundedKey, subnetAInfo.EVMChainID) + receipt = utils.SendTransactionAndWaitForSuccess(context.Background(), subnetAInfo, signedRegistrationTx) + + // Check that the validator is registered in the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodEnded, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + } } From 935cd864e298a6b7528bec9d21b741f9d0413692 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 15 Aug 2024 12:04:04 -0400 Subject: [PATCH 076/545] scope listing and delisting steps --- tests/flows/native_token_staking.go | 182 +++++++++++++++------------- 1 file changed, 97 insertions(+), 85 deletions(-) diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index de21a4f8b..b30f9bec5 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -39,6 +39,12 @@ import ( // - Aggregate P-Chain signatures on the response Warp message // - Deliver the Warp message to the subnet // - Verify that the validator is registered in the staking contract +// Delists the validator from the subnet. The steps are as follows: +// - Initiate validator delisting +// - Deliver the Warp message to the P-Chain (not implemented) +// - Aggregate P-Chain signatures on the response Warp message +// - Deliver the Warp message to the subnet +// - Verify that the validator is delisted from the staking contract func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Get the subnets info cChainInfo := network.GetPrimaryNetworkInfo() @@ -110,95 +116,101 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) - // Iniatiate validator registration - opts.Value = big.NewInt(0).SetUint64(1e18) - nodeID := ids.GenerateTestID() - blsPublicKey := [48]byte{} - tx, err = stakingManager.InitializeValidatorRegistration( - opts, - nodeID, - uint64(time.Now().Add(24*time.Hour).Unix()), - blsPublicKey[:], - ) - Expect(err).Should(BeNil()) - receipt := utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) - registrationInitiatedEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidationPeriodCreated, - ) - Expect(err).Should(BeNil()) - validationID := ids.ID(registrationInitiatedEvent.ValidationID) + // + // Register a validator + // + var validationID ids.ID // To be used in the delisting step + { + // Iniatiate validator registration + opts.Value = big.NewInt(0).SetUint64(1e18) + nodeID := ids.GenerateTestID() + blsPublicKey := [48]byte{} + tx, err = stakingManager.InitializeValidatorRegistration( + opts, + nodeID, + uint64(time.Now().Add(24*time.Hour).Unix()), + blsPublicKey[:], + ) + Expect(err).Should(BeNil()) + receipt := utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) + registrationInitiatedEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodCreated, + ) + Expect(err).Should(BeNil()) + validationID = ids.ID(registrationInitiatedEvent.ValidationID) - // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - Expect(err).Should(BeNil()) - log.Info("Constructed signed RegisterSubnetValidator message", "message", signedWarpMessage) - // Validate the Warp message, (this will be done on the P-Chain in the future) - msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) - Expect(err).Should(BeNil()) - // Check that the addressed call payload is a registered Warp message type - var payloadInterface warpMessages.Payload - ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) - Expect(err).Should(BeNil()) - registerValidatorPayload, ok := payloadInterface.(*warpMessages.RegisterSubnetValidator) - Expect(ok).Should(BeTrue()) + // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + Expect(err).Should(BeNil()) + log.Info("Constructed signed RegisterSubnetValidator message", "message", signedWarpMessage) + // Validate the Warp message, (this will be done on the P-Chain in the future) + msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) + Expect(err).Should(BeNil()) + // Check that the addressed call payload is a registered Warp message type + var payloadInterface warpMessages.Payload + ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) + Expect(err).Should(BeNil()) + registerValidatorPayload, ok := payloadInterface.(*warpMessages.RegisterSubnetValidator) + Expect(ok).Should(BeTrue()) - Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) - Expect(registerValidatorPayload.NodeID).Should(Equal(nodeID)) - Expect(registerValidatorPayload.Weight).Should(Equal(uint64(1e6))) - Expect(registerValidatorPayload.SubnetID).Should(Equal(subnetAInfo.SubnetID)) - Expect(registerValidatorPayload.BlsPubKey[:]).Should(Equal(blsPublicKey[:])) + Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) + Expect(registerValidatorPayload.NodeID).Should(Equal(nodeID)) + Expect(registerValidatorPayload.Weight).Should(Equal(uint64(1e6))) + Expect(registerValidatorPayload.SubnetID).Should(Equal(subnetAInfo.SubnetID)) + Expect(registerValidatorPayload.BlsPubKey[:]).Should(Equal(blsPublicKey[:])) - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - // Query P-Chain validators for the Warp message - registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, true) - Expect(err).Should(BeNil()) - registrationAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), registrationPayload.Bytes()) - Expect(err).Should(BeNil()) - registrationUnsignedMessage, err := avalancheWarp.NewUnsignedMessage(network.GetNetworkID(), pChainInfo.BlockchainID, registrationAddressedCall.Bytes()) - Expect(err).Should(BeNil()) - log.Info("Constructed unsigned SubnetValidatorRegistration message", "message", hex.EncodeToString(registrationUnsignedMessage.Bytes())) + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + // Query P-Chain validators for the Warp message + registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, true) + Expect(err).Should(BeNil()) + registrationAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), registrationPayload.Bytes()) + Expect(err).Should(BeNil()) + registrationUnsignedMessage, err := avalancheWarp.NewUnsignedMessage(network.GetNetworkID(), pChainInfo.BlockchainID, registrationAddressedCall.Bytes()) + Expect(err).Should(BeNil()) + log.Info("Constructed unsigned SubnetValidatorRegistration message", "message", hex.EncodeToString(registrationUnsignedMessage.Bytes())) - registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( - registrationUnsignedMessage, - nil, - subnetAInfo.SubnetID, - 67, - ) - Expect(err).Should(BeNil()) - log.Info("Constructed signed SubnetValidatorRegistration message", "message", registrationSignedMessage) + registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( + registrationUnsignedMessage, + nil, + subnetAInfo.SubnetID, + 67, + ) + Expect(err).Should(BeNil()) + log.Info("Constructed signed SubnetValidatorRegistration message", "message", registrationSignedMessage) - // Deliver the Warp message to the subnet - abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) - Expect(err).Should(BeNil()) - gasFeeCap, gasTipCap, nonce := utils.CalculateTxParams(context.Background(), subnetAInfo, utils.PrivateKeyToAddress(fundedKey)) - registrationTx := predicateutils.NewPredicateTx( - subnetAInfo.EVMChainID, - nonce, - &stakingManagerContractAddress, - 2_000_000, - gasFeeCap, - gasTipCap, - big.NewInt(0), - callData, - types.AccessList{}, - warp.ContractAddress, - registrationSignedMessage.Bytes(), - ) - signedRegistrationTx := utils.SignTransaction(registrationTx, fundedKey, subnetAInfo.EVMChainID) - receipt = utils.SendTransactionAndWaitForSuccess(context.Background(), subnetAInfo, signedRegistrationTx) + // Deliver the Warp message to the subnet + abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) + Expect(err).Should(BeNil()) + gasFeeCap, gasTipCap, nonce := utils.CalculateTxParams(context.Background(), subnetAInfo, utils.PrivateKeyToAddress(fundedKey)) + registrationTx := predicateutils.NewPredicateTx( + subnetAInfo.EVMChainID, + nonce, + &stakingManagerContractAddress, + 2_000_000, + gasFeeCap, + gasTipCap, + big.NewInt(0), + callData, + types.AccessList{}, + warp.ContractAddress, + registrationSignedMessage.Bytes(), + ) + signedRegistrationTx := utils.SignTransaction(registrationTx, fundedKey, subnetAInfo.EVMChainID) + receipt = utils.SendTransactionAndWaitForSuccess(context.Background(), subnetAInfo, signedRegistrationTx) - // Check that the validator is registered in the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidationPeriodRegistered, - ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + // Check that the validator is registered in the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + } // // Delist the validator @@ -213,7 +225,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { 0, ) Expect(err).Should(BeNil()) - receipt = utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) + receipt := utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) validatorRemovalEvent, err := utils.GetEventFromLogs( receipt.Logs, stakingManager.ParseValidatorRemovalInitialized, @@ -224,11 +236,11 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage = network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) Expect(err).Should(BeNil()) log.Info("Constructed signed SetSubnetValidatorWeightMessage message", "message", signedWarpMessage) // Validate the Warp message, (this will be done on the P-Chain in the future) - msg, err = warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) + msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) Expect(err).Should(BeNil()) // Check that the addressed call payload is a registered Warp message type var payloadInterface warpMessages.Payload From aa975ac18b058cbd7783831c17d90ab6904171a2 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 15 Aug 2024 12:20:16 -0400 Subject: [PATCH 077/545] add back in churn tracker --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/staking/StakingManager.sol | 6 ++---- tests/flows/native_token_staking.go | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 3d8f473e9..5a1485209 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -43,7 +43,7 @@ type StakingManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161326738038061326783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61311a8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f5780632e2194d8146100b45780635d0d7466146100e457806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad36600461284f565b61019d565b005b6100c76100c236600461284f565b610393565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26100f236600461287a565b6103a9565b61010a6101053660046128d2565b6104b7565b6040519081526020016100db565b6100b2610126366004612912565b6104d0565b61010a6101393660046129df565b610a43565b6100b261014c366004612a7b565b610a5b565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100db565b6100b261018536600461284f565b610ce8565b6100b2610198366004612a94565b610dfc565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f805160206130ee83398151915293929190829060ff1660058111156101fe576101fe612abe565b600581111561020f5761020f612abe565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612abe565b1461030e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61031f848361010001515f611223565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034c908490600401612af4565b6020604051808303815f875af1158015610368573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038c9190612b26565b5050505050565b5f6103a364e8d4a5100083612b51565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103ed5750825b90505f826001600160401b031660011480156104085750303b155b905081158015610416575080155b156104345760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045e57845460ff60401b1916600160401b1785555b6104688787611440565b83156104ae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6103a36001600160401b03831664e8d4a51000612b70565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f805160206130ee83398151915293929190829060ff16600581111561053157610531612abe565b600581111561054257610542612abe565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156105dc576105dc612abe565b146106355760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610305565b60c08101516001600160a01b0316336001600160a01b03161461066a5760405162461bcd60e51b815260040161030590612b87565b60038152426001600160401b031660808201525f8415610843576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156106cd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106f49190810190612bdc565b91509150806107155760405162461bcd60e51b815260040161030590612cae565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610758573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061077c9190612b26565b82511461079b5760405162461bcd60e51b815260040161030590612cf2565b60208201516001600160a01b0316156107c65760405162461bcd60e51b815260040161030590612d39565b5f806107d5846040015161145e565b91509150818a1461083d5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610305565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff1916600183600581111561088357610883612abe565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f9061097490889083611223565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109a3908590600401612af4565b6020604051808303815f875af11580156109bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e39190612b26565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f610a5084868585611636565b90505b949350505050565b5f5f805160206130ee8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ab6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610add9190810190612bdc565b9150915080610afe5760405162461bcd60e51b815260040161030590612cae565b8254825114610b1f5760405162461bcd60e51b815260040161030590612cf2565b60208201516001600160a01b031615610b4a5760405162461bcd60e51b815260040161030590612d39565b5f80610b598460400151611b3d565b9150915080610bb95760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610305565b5f82815260078601602052604081208054610bd390612d86565b9050118015610c05575060015f83815260088701602052604090205460ff166005811115610c0357610c03612abe565b145b610c215760405162461bcd60e51b815260040161030590612dbe565b5f8281526007860160205260408120610c3991612805565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f805160206130ee833981519152929190610d3090612d86565b9050118015610d62575060015f83815260088301602052604090205460ff166005811115610d6057610d60612abe565b145b610d7e5760405162461bcd60e51b815260040161030590612dbe565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610db79190600401612e03565b6020604051808303815f875af1158015610dd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df79190612b26565b505050565b5f5f805160206130ee8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e57573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e7e9190810190612bdc565b9150915080610e9f5760405162461bcd60e51b815260040161030590612cae565b5f8415610f18575f610eb48460400151611cde565b919350909150506001600160401b03811615610f125760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610305565b50610f8c565b5f610f268460400151611b3d565b90925090508015610f8a5760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610305565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115610fbe57610fbe612abe565b6005811115610fcf57610fcf612abe565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110805760405162461bcd60e51b815260040161030590612b87565b5f60038251600581111561109657611096612abe565b14806110b457506002825160058111156110b2576110b2612abe565b145b156110d757506020808201515f90815260098701909152604081205560046110db565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561110c5761110c612abe565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561129c5761125c816001612e8d565b611267906008612b70565b5081515f9083908390811061127e5761127e612ea0565b60200101906001600160f81b03191690815f1a905350600101611248565b505f5b60048110156112ff576112b3816003612e8d565b6112be906008612b70565b6001901c60f81b826112d1836002612eb4565b815181106112e1576112e1612ea0565b60200101906001600160f81b03191690815f1a90535060010161129f565b505f5b60208110156113615761131681601f612e8d565b611321906008612b70565b86901c60f81b82611333836006612eb4565b8151811061134357611343612ea0565b60200101906001600160f81b03191690815f1a905350600101611302565b505f5b60088110156113cc57611378816007612e8d565b611383906008612b70565b6001600160401b038616901c60f81b8261139e836026612eb4565b815181106113ae576113ae612ea0565b60200101906001600160f81b03191690815f1a905350600101611364565b505f5b6008811015611437576113e3816007612e8d565b6113ee906008612b70565b6001600160401b038516901c60f81b8261140983602e612eb4565b8151811061141957611419612ea0565b60200101906001600160f81b03191690815f1a9053506001016113cf565b50949350505050565b611448611f19565b61145182611f64565b61145a81611f88565b5050565b5f808251602e146114815760405162461bcd60e51b815260040161030590612ec7565b5f805b60028110156114d057611498816001612e8d565b6114a3906008612b70565b61ffff168582815181106114b9576114b9612ea0565b016020015160f81c901b9190911790600101611484565b5061ffff8116156114f35760405162461bcd60e51b815260040161030590612f0e565b5f805b600481101561154e5761150a816003612e8d565b611515906008612b70565b63ffffffff1686611527836002612eb4565b8151811061153757611537612ea0565b016020015160f81c901b91909117906001016114f6565b5063ffffffff81166004146115755760405162461bcd60e51b815260040161030590612f4f565b5f805b60208110156115ca5761158c81601f612e8d565b611597906008612b70565b876115a3836006612eb4565b815181106115b3576115b3612ea0565b016020015160f81c901b9190911790600101611578565b505f805b6008811015611629576115e2816007612e8d565b6115ed906008612b70565b6001600160401b031688611602836026612eb4565b8151811061161257611612612ea0565b016020015160f81c901b91909117906001016115ce565b5090969095509350505050565b5f61163f61203c565b5f805160206130ee833981519152426001600160401b03851611801561167957506001600160401b038416611677426202a300612eb4565b115b6116d95760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610305565b856117265760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610305565b5f868152600982016020526040902054156117925760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610305565b82516030146117f75760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610305565b5f61180186612086565b90505f61180d82610393565b90508260020154816001600160401b03161015801561183957508260030154816001600160401b031611155b6118915760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610305565b5f806118d86040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b03168152602001898152506120bc565b5f828152600788016020526040902091935091506118f68282612fd8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611923908590600401612af4565b6020604051808303815f875af115801561193f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119639190612b26565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff191660018360058111156119e9576119e9612abe565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610a5360017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611b605760405162461bcd60e51b815260040161030590612ec7565b5f805b6002811015611baf57611b77816001612e8d565b611b82906008612b70565b61ffff16858281518110611b9857611b98612ea0565b016020015160f81c901b9190911790600101611b63565b5061ffff811615611bd25760405162461bcd60e51b815260040161030590612f0e565b5f805b6004811015611c2d57611be9816003612e8d565b611bf4906008612b70565b63ffffffff1686611c06836002612eb4565b81518110611c1657611c16612ea0565b016020015160f81c901b9190911790600101611bd5565b5063ffffffff8116600214611c545760405162461bcd60e51b815260040161030590612f4f565b5f805b6020811015611ca957611c6b81601f612e8d565b611c76906008612b70565b87611c82836006612eb4565b81518110611c9257611c92612ea0565b016020015160f81c901b9190911790600101611c57565b505f86602681518110611cbe57611cbe612ea0565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611d025760405162461bcd60e51b815260040161030590612ec7565b5f805b6002811015611d5157611d19816001612e8d565b611d24906008612b70565b61ffff16868281518110611d3a57611d3a612ea0565b016020015160f81c901b9190911790600101611d05565b5061ffff811615611d745760405162461bcd60e51b815260040161030590612f0e565b5f805b6004811015611dcf57611d8b816003612e8d565b611d96906008612b70565b63ffffffff1687611da8836002612eb4565b81518110611db857611db8612ea0565b016020015160f81c901b9190911790600101611d77565b5063ffffffff8116600114611df65760405162461bcd60e51b815260040161030590612f4f565b5f805b6020811015611e4b57611e0d81601f612e8d565b611e18906008612b70565b88611e24836006612eb4565b81518110611e3457611e34612ea0565b016020015160f81c901b9190911790600101611df9565b505f805b6008811015611eaa57611e63816007612e8d565b611e6e906008612b70565b6001600160401b031689611e83836026612eb4565b81518110611e9357611e93612ea0565b016020015160f81c901b9190911790600101611e4f565b505f805b6008811015611f0957611ec2816007612e8d565b611ecd906008612b70565b6001600160401b03168a611ee283602e612eb4565b81518110611ef257611ef2612ea0565b016020015160f81c901b9190911790600101611eae565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611f6257604051631afcd79f60e31b815260040160405180910390fd5b565b611f6c611f19565b611f74612487565b611f7c612497565b611f858161249f565b50565b611f90611f19565b7f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f916001600160a01b03821661201c5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610305565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161208057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6103a3827f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91546001600160a01b0316906125cf565b5f60608260800151516030146121265760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610305565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561219d5761215d816001612e8d565b612168906008612b70565b5081515f9083908390811061217f5761217f612ea0565b60200101906001600160f81b03191690815f1a905350600101612149565b505f5b60048110156121fb576121b4816003612e8d565b6121bf906008612b70565b505f826121cd836002612eb4565b815181106121dd576121dd612ea0565b60200101906001600160f81b03191690815f1a9053506001016121a0565b505f5b6020811015612258578451816020811061221a5761221a612ea0565b1a60f81b8261222a836006612eb4565b8151811061223a5761223a612ea0565b60200101906001600160f81b03191690815f1a9053506001016121fe565b505f5b60208110156122b8578460200151816020811061227a5761227a612ea0565b1a60f81b8261228a836026612eb4565b8151811061229a5761229a612ea0565b60200101906001600160f81b03191690815f1a90535060010161225b565b505f5b600881101561232c576122cf816007612e8d565b6122da906008612b70565b60ff1685604001516001600160401b0316901c60f81b828260466122fe9190612eb4565b8151811061230e5761230e612ea0565b60200101906001600160f81b03191690815f1a9053506001016122bb565b505f5b6030811015612397578460800151818151811061234e5761234e612ea0565b01602001516001600160f81b0319168261236983604e612eb4565b8151811061237957612379612ea0565b60200101906001600160f81b03191690815f1a90535060010161232f565b505f5b6008811015612409576123ae816007612e8d565b6123b9906008612b70565b60608601516001600160401b0390811691161c60f81b826123db83607e612eb4565b815181106123eb576123eb612ea0565b60200101906001600160f81b03191690815f1a90535060010161239a565b5060028160405161241a9190613097565b602060405180830381855afa158015612435573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906124589190612b26565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61248f611f19565b611f62612731565b611f62611f19565b6124a7611f19565b80355f805160206130ee83398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561253f60a08301608084016128d2565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561257260c0830160a084016130b2565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556125a360e0830160c084016130d2565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612615573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126399190612b26565b90506126506001600160a01b038516333086612739565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015612694573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126b89190612b26565b905081811161271e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610305565b6127288282612e8d565b95945050505050565b612461611f19565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612793908590612799565b50505050565b5f8060205f8451602086015f885af1806127b8576040513d5f823e3d81fd5b50505f513d915081156127cf5780600114156127dc565b6001600160a01b0384163b155b1561279357604051635274afe760e01b81526001600160a01b0385166004820152602401610305565b50805461281190612d86565b5f825580601f10612820575050565b601f0160209004905f5260205f2090810190611f8591905b8082111561284b575f8155600101612838565b5090565b5f6020828403121561285f575f80fd5b5035919050565b6001600160a01b0381168114611f85575f80fd5b5f8082840361010081121561288d575f80fd5b60e081121561289a575f80fd5b5082915060e08301356128ac81612866565b809150509250929050565b80356001600160401b03811681146128cd575f80fd5b919050565b5f602082840312156128e2575f80fd5b6128eb826128b7565b9392505050565b8015158114611f85575f80fd5b803563ffffffff811681146128cd575f80fd5b5f805f60608486031215612924575f80fd5b833592506020840135612936816128f2565b9150612944604085016128ff565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129835761298361294d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129b1576129b161294d565b604052919050565b5f6001600160401b038211156129d1576129d161294d565b50601f01601f191660200190565b5f805f80608085870312156129f2575f80fd5b8435935060208501359250612a09604086016128b7565b915060608501356001600160401b03811115612a23575f80fd5b8501601f81018713612a33575f80fd5b8035612a46612a41826129b9565b612989565b818152886020838501011115612a5a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612a8b575f80fd5b6128eb826128ff565b5f8060408385031215612aa5575f80fd5b612aae836128ff565b915060208301356128ac816128f2565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612aec578181015183820152602001612ad4565b50505f910152565b602081525f8251806020840152612b12816040850160208701612ad2565b601f01601f19169190910160400192915050565b5f60208284031215612b36575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f82612b6b57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176103a3576103a3612b3d565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b80516128cd816128f2565b5f8060408385031215612bed575f80fd5b82516001600160401b0380821115612c03575f80fd5b9084019060608287031215612c16575f80fd5b612c1e612961565b82518152602080840151612c3181612866565b82820152604084015183811115612c46575f80fd5b80850194505087601f850112612c5a575f80fd5b83519250612c6a612a41846129b9565b8381528882858701011115612c7d575f80fd5b612c8c84838301848801612ad2565b80604084015250819550612ca1818801612bd1565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612d9a57607f821691505b602082108103612db857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612e1581612d86565b806020870152604060018084165f8114612e365760018114612e5257612e7f565b60ff19851660408a0152604084151560051b8a01019550612e7f565b895f5260205f205f5b85811015612e765781548b8201860152908301908801612e5b565b8a016040019650505b509398975050505050505050565b818103818111156103a3576103a3612b3d565b634e487b7160e01b5f52603260045260245ffd5b808201808211156103a3576103a3612b3d565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610df757805f5260205f20601f840160051c81016020851015612fb95750805b601f840160051c820191505b8181101561038c575f8155600101612fc5565b81516001600160401b03811115612ff157612ff161294d565b61300581612fff8454612d86565b84612f94565b602080601f831160018114613038575f84156130215750858301515b5f19600386901b1c1916600185901b17855561308f565b5f85815260208120601f198616915b8281101561306657888601518255948401946001909101908401613047565b508582101561308357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f82516130a8818460208701612ad2565b9190910192915050565b5f602082840312156130c2575f80fd5b813560ff811681146128eb575f80fd5b5f602082840312156130e2575f80fd5b81356128eb8161286656feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516134a93803806134a983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61335c8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f5780632e2194d8146100b45780635d0d7466146100e457806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612a12565b61019d565b005b6100c76100c2366004612a12565b610393565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26100f2366004612a3d565b6103a9565b61010a610105366004612a95565b6104b7565b6040519081526020016100db565b6100b2610126366004612ad5565b6104d0565b61010a610139366004612ba2565b610a50565b6100b261014c366004612c3e565b610a68565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100db565b6100b2610185366004612a12565b610cf5565b6100b2610198366004612c57565b610e09565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061333083398151915293929190829060ff1660058111156101fe576101fe612c81565b600581111561020f5761020f612c81565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612c81565b1461030e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61031f848361010001515f611230565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034c908490600401612cb7565b6020604051808303815f875af1158015610368573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038c9190612ce9565b5050505050565b5f6103a364e8d4a5100083612d28565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103ed5750825b90505f826001600160401b031660011480156104085750303b155b905081158015610416575080155b156104345760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045e57845460ff60401b1916600160401b1785555b610468878761144d565b83156104ae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6103a36001600160401b03831664e8d4a51000612d3b565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061333083398151915293929190829060ff16600581111561053157610531612c81565b600581111561054257610542612c81565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156105dc576105dc612c81565b146106355760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610305565b60c08101516001600160a01b0316336001600160a01b03161461066a5760405162461bcd60e51b815260040161030590612d52565b610677816040015161146b565b60038152426001600160401b031660808201525f8415610850576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156106da573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107019190810190612da7565b91509150806107225760405162461bcd60e51b815260040161030590612e79565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107899190612ce9565b8251146107a85760405162461bcd60e51b815260040161030590612ebd565b60208201516001600160a01b0316156107d35760405162461bcd60e51b815260040161030590612f04565b5f806107e28460400151611618565b91509150818a1461084a5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610305565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff1916600183600581111561089057610890612c81565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f9061098190889083611230565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109b0908590600401612cb7565b6020604051808303815f875af11580156109cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f09190612ce9565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f610a5d848685856117f0565b90505b949350505050565b5f5f805160206133308339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ac3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610aea9190810190612da7565b9150915080610b0b5760405162461bcd60e51b815260040161030590612e79565b8254825114610b2c5760405162461bcd60e51b815260040161030590612ebd565b60208201516001600160a01b031615610b575760405162461bcd60e51b815260040161030590612f04565b5f80610b668460400151611d00565b9150915080610bc65760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610305565b5f82815260078601602052604081208054610be090612f51565b9050118015610c12575060015f83815260088701602052604090205460ff166005811115610c1057610c10612c81565b145b610c2e5760405162461bcd60e51b815260040161030590612f89565b5f8281526007860160205260408120610c46916129c8565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020613330833981519152929190610d3d90612f51565b9050118015610d6f575060015f83815260088301602052604090205460ff166005811115610d6d57610d6d612c81565b145b610d8b5760405162461bcd60e51b815260040161030590612f89565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dc49190600401612fce565b6020604051808303815f875af1158015610de0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e049190612ce9565b505050565b5f5f805160206133308339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8b9190810190612da7565b9150915080610eac5760405162461bcd60e51b815260040161030590612e79565b5f8415610f25575f610ec18460400151611ea1565b919350909150506001600160401b03811615610f1f5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610305565b50610f99565b5f610f338460400151611d00565b90925090508015610f975760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610305565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115610fcb57610fcb612c81565b6005811115610fdc57610fdc612c81565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b9092049093166101009092019190915282015191925016331461108d5760405162461bcd60e51b815260040161030590612d52565b5f6003825160058111156110a3576110a3612c81565b14806110c157506002825160058111156110bf576110bf612c81565b145b156110e457506020808201515f90815260098701909152604081205560046110e8565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561111957611119612c81565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156112a957611269816001613058565b611274906008612d3b565b5081515f9083908390811061128b5761128b61306b565b60200101906001600160f81b03191690815f1a905350600101611255565b505f5b600481101561130c576112c0816003613058565b6112cb906008612d3b565b6001901c60f81b826112de83600261307f565b815181106112ee576112ee61306b565b60200101906001600160f81b03191690815f1a9053506001016112ac565b505f5b602081101561136e5761132381601f613058565b61132e906008612d3b565b86901c60f81b8261134083600661307f565b815181106113505761135061306b565b60200101906001600160f81b03191690815f1a90535060010161130f565b505f5b60088110156113d957611385816007613058565b611390906008612d3b565b6001600160401b038616901c60f81b826113ab83602661307f565b815181106113bb576113bb61306b565b60200101906001600160f81b03191690815f1a905350600101611371565b505f5b6008811015611444576113f0816007613058565b6113fb906008612d3b565b6001600160401b038516901c60f81b8261141683602e61307f565b815181106114265761142661306b565b60200101906001600160f81b03191690815f1a9053506001016113dc565b50949350505050565b6114556120dc565b61145e82612127565b6114678161214b565b5050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f8051602061333083398151915290600160e01b900460ff165f036114b0575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906114f89083613058565b10611514576001600160401b0384166040830152808252611533565b83826040018181516115269190613092565b6001600160401b03169052505b5f82602001518360400151606461154a91906130b9565b61155491906130e4565b600485015490915060ff600160e01b909104811690821611156115d45760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610305565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602e1461163b5760405162461bcd60e51b815260040161030590613109565b5f805b600281101561168a57611652816001613058565b61165d906008612d3b565b61ffff168582815181106116735761167361306b565b016020015160f81c901b919091179060010161163e565b5061ffff8116156116ad5760405162461bcd60e51b815260040161030590613150565b5f805b6004811015611708576116c4816003613058565b6116cf906008612d3b565b63ffffffff16866116e183600261307f565b815181106116f1576116f161306b565b016020015160f81c901b91909117906001016116b0565b5063ffffffff811660041461172f5760405162461bcd60e51b815260040161030590613191565b5f805b60208110156117845761174681601f613058565b611751906008612d3b565b8761175d83600661307f565b8151811061176d5761176d61306b565b016020015160f81c901b9190911790600101611732565b505f805b60088110156117e35761179c816007613058565b6117a7906008612d3b565b6001600160401b0316886117bc83602661307f565b815181106117cc576117cc61306b565b016020015160f81c901b9190911790600101611788565b5090969095509350505050565b5f6117f96121ff565b5f80516020613330833981519152426001600160401b03851611801561183357506001600160401b038416611831426202a30061307f565b115b6118935760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610305565b856118e05760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610305565b5f8681526009820160205260409020541561194c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610305565b82516030146119b15760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610305565b5f6119bb86612249565b90505f6119c782610393565b90506119d28161146b565b8260020154816001600160401b0316101580156119fc57508260030154816001600160401b031611155b611a545760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610305565b5f80611a9b6040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b031681526020018981525061227f565b5f82815260078801602052604090209193509150611ab9828261321a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ae6908590600401612cb7565b6020604051808303815f875af1158015611b02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b269190612ce9565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611bac57611bac612c81565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610a6060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611d235760405162461bcd60e51b815260040161030590613109565b5f805b6002811015611d7257611d3a816001613058565b611d45906008612d3b565b61ffff16858281518110611d5b57611d5b61306b565b016020015160f81c901b9190911790600101611d26565b5061ffff811615611d955760405162461bcd60e51b815260040161030590613150565b5f805b6004811015611df057611dac816003613058565b611db7906008612d3b565b63ffffffff1686611dc983600261307f565b81518110611dd957611dd961306b565b016020015160f81c901b9190911790600101611d98565b5063ffffffff8116600214611e175760405162461bcd60e51b815260040161030590613191565b5f805b6020811015611e6c57611e2e81601f613058565b611e39906008612d3b565b87611e4583600661307f565b81518110611e5557611e5561306b565b016020015160f81c901b9190911790600101611e1a565b505f86602681518110611e8157611e8161306b565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611ec55760405162461bcd60e51b815260040161030590613109565b5f805b6002811015611f1457611edc816001613058565b611ee7906008612d3b565b61ffff16868281518110611efd57611efd61306b565b016020015160f81c901b9190911790600101611ec8565b5061ffff811615611f375760405162461bcd60e51b815260040161030590613150565b5f805b6004811015611f9257611f4e816003613058565b611f59906008612d3b565b63ffffffff1687611f6b83600261307f565b81518110611f7b57611f7b61306b565b016020015160f81c901b9190911790600101611f3a565b5063ffffffff8116600114611fb95760405162461bcd60e51b815260040161030590613191565b5f805b602081101561200e57611fd081601f613058565b611fdb906008612d3b565b88611fe783600661307f565b81518110611ff757611ff761306b565b016020015160f81c901b9190911790600101611fbc565b505f805b600881101561206d57612026816007613058565b612031906008612d3b565b6001600160401b03168961204683602661307f565b815181106120565761205661306b565b016020015160f81c901b9190911790600101612012565b505f805b60088110156120cc57612085816007613058565b612090906008612d3b565b6001600160401b03168a6120a583602e61307f565b815181106120b5576120b561306b565b016020015160f81c901b9190911790600101612071565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661212557604051631afcd79f60e31b815260040160405180910390fd5b565b61212f6120dc565b61213761264a565b61213f61265a565b61214881612662565b50565b6121536120dc565b7f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f916001600160a01b0382166121df5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610305565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161224357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6103a3827f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91546001600160a01b031690612792565b5f60608260800151516030146122e95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610305565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561236057612320816001613058565b61232b906008612d3b565b5081515f908390839081106123425761234261306b565b60200101906001600160f81b03191690815f1a90535060010161230c565b505f5b60048110156123be57612377816003613058565b612382906008612d3b565b505f8261239083600261307f565b815181106123a0576123a061306b565b60200101906001600160f81b03191690815f1a905350600101612363565b505f5b602081101561241b57845181602081106123dd576123dd61306b565b1a60f81b826123ed83600661307f565b815181106123fd576123fd61306b565b60200101906001600160f81b03191690815f1a9053506001016123c1565b505f5b602081101561247b578460200151816020811061243d5761243d61306b565b1a60f81b8261244d83602661307f565b8151811061245d5761245d61306b565b60200101906001600160f81b03191690815f1a90535060010161241e565b505f5b60088110156124ef57612492816007613058565b61249d906008612d3b565b60ff1685604001516001600160401b0316901c60f81b828260466124c1919061307f565b815181106124d1576124d161306b565b60200101906001600160f81b03191690815f1a90535060010161247e565b505f5b603081101561255a57846080015181815181106125115761251161306b565b01602001516001600160f81b0319168261252c83604e61307f565b8151811061253c5761253c61306b565b60200101906001600160f81b03191690815f1a9053506001016124f2565b505f5b60088110156125cc57612571816007613058565b61257c906008612d3b565b60608601516001600160401b0390811691161c60f81b8261259e83607e61307f565b815181106125ae576125ae61306b565b60200101906001600160f81b03191690815f1a90535060010161255d565b506002816040516125dd91906132d9565b602060405180830381855afa1580156125f8573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061261b9190612ce9565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126526120dc565b6121256128f4565b6121256120dc565b61266a6120dc565b80355f8051602061333083398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561270260a0830160808401612a95565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561273560c0830160a084016132f4565b60048201805460ff92909216600160e01b0260ff60e01b1990921691909117905561276660e0830160c08401613314565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156127d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127fc9190612ce9565b90506128136001600160a01b0385163330866128fc565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015612857573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287b9190612ce9565b90508181116128e15760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610305565b6128eb8282613058565b95945050505050565b6126246120dc565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261295690859061295c565b50505050565b5f8060205f8451602086015f885af18061297b576040513d5f823e3d81fd5b50505f513d9150811561299257806001141561299f565b6001600160a01b0384163b155b1561295657604051635274afe760e01b81526001600160a01b0385166004820152602401610305565b5080546129d490612f51565b5f825580601f106129e3575050565b601f0160209004905f5260205f209081019061214891905b80821115612a0e575f81556001016129fb565b5090565b5f60208284031215612a22575f80fd5b5035919050565b6001600160a01b0381168114612148575f80fd5b5f80828403610100811215612a50575f80fd5b60e0811215612a5d575f80fd5b5082915060e0830135612a6f81612a29565b809150509250929050565b80356001600160401b0381168114612a90575f80fd5b919050565b5f60208284031215612aa5575f80fd5b612aae82612a7a565b9392505050565b8015158114612148575f80fd5b803563ffffffff81168114612a90575f80fd5b5f805f60608486031215612ae7575f80fd5b833592506020840135612af981612ab5565b9150612b0760408501612ac2565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b4657612b46612b10565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612b7457612b74612b10565b604052919050565b5f6001600160401b03821115612b9457612b94612b10565b50601f01601f191660200190565b5f805f8060808587031215612bb5575f80fd5b8435935060208501359250612bcc60408601612a7a565b915060608501356001600160401b03811115612be6575f80fd5b8501601f81018713612bf6575f80fd5b8035612c09612c0482612b7c565b612b4c565b818152886020838501011115612c1d575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612c4e575f80fd5b612aae82612ac2565b5f8060408385031215612c68575f80fd5b612c7183612ac2565b91506020830135612a6f81612ab5565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612caf578181015183820152602001612c97565b50505f910152565b602081525f8251806020840152612cd5816040850160208701612c95565b601f01601f19169190910160400192915050565b5f60208284031215612cf9575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612d3657612d36612d00565b500490565b80820281158282048414176103a3576103a3612d14565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b8051612a9081612ab5565b5f8060408385031215612db8575f80fd5b82516001600160401b0380821115612dce575f80fd5b9084019060608287031215612de1575f80fd5b612de9612b24565b82518152602080840151612dfc81612a29565b82820152604084015183811115612e11575f80fd5b80850194505087601f850112612e25575f80fd5b83519250612e35612c0484612b7c565b8381528882858701011115612e48575f80fd5b612e5784838301848801612c95565b80604084015250819550612e6c818801612d9c565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612f6557607f821691505b602082108103612f8357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612fe081612f51565b806020870152604060018084165f8114613001576001811461301d5761304a565b60ff19851660408a0152604084151560051b8a0101955061304a565b895f5260205f205f5b858110156130415781548b8201860152908301908801613026565b8a016040019650505b509398975050505050505050565b818103818111156103a3576103a3612d14565b634e487b7160e01b5f52603260045260245ffd5b808201808211156103a3576103a3612d14565b6001600160401b038181168382160190808211156130b2576130b2612d14565b5092915050565b6001600160401b038181168382160280821691908281146130dc576130dc612d14565b505092915050565b5f6001600160401b03808416806130fd576130fd612d00565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e0457805f5260205f20601f840160051c810160208510156131fb5750805b601f840160051c820191505b8181101561038c575f8155600101613207565b81516001600160401b0381111561323357613233612b10565b613247816132418454612f51565b846131d6565b602080601f83116001811461327a575f84156132635750858301515b5f19600386901b1c1916600185901b1785556132d1565b5f85815260208120601f198616915b828110156132a857888601518255948401946001909101908401613289565b50858210156132c557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f82516132ea818460208701612c95565b9190910192915050565b5f60208284031215613304575f80fd5b813560ff81168114612aae575f80fd5b5f60208284031215613324575f80fd5b8135612aae81612a2956feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 4b36d3bd2..83b75bcc7 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -43,7 +43,7 @@ type StakingManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612f62380380612f6283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612e158061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780632e2194d8146100b457806362065856146100f057806376f786211461011d57806379f54eb11461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad36600461257a565b6101fd565b005b3480156100bf575f80fd5b506100d36100ce36600461257a565b6103f3565b6040516001600160401b0390911681526020015b60405180910390f35b3480156100fb575f80fd5b5061010f61010a3660046125ac565b610409565b6040519081526020016100e7565b348015610128575f80fd5b506100b26101373660046125ec565b610422565b348015610147575f80fd5b506100b2610156366004612627565b610995565b348015610166575f80fd5b506100b261017536600461263d565b610aa1565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b0390911681526020016100e7565b3480156101b7575f80fd5b506100b26101c636600461257a565b610d2e565b61010f6101d93660046126e8565b610e42565b3480156101e9575f80fd5b506100b26101f836600461277a565b610e57565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612de983398151915293929190829060ff16600581111561025e5761025e6127af565b600581111561026f5761026f6127af565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004166101009091015290915081516005811115610306576103066127af565b1461036e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61037f848361010001515f61127e565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ac9084906004016127e5565b6020604051808303815f875af11580156103c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ec9190612817565b5050505050565b5f61040364e8d4a5100083612842565b92915050565b5f6104036001600160401b03831664e8d4a51000612861565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f80516020612de983398151915293929190829060ff166005811115610483576104836127af565b6005811115610494576104946127af565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561052e5761052e6127af565b146105875760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610365565b60c08101516001600160a01b0316336001600160a01b0316146105bc5760405162461bcd60e51b815260040161036590612878565b60038152426001600160401b031660808201525f8415610795576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561061f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261064691908101906128e1565b91509150806106675760405162461bcd60e51b8152600401610365906129b3565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ce9190612817565b8251146106ed5760405162461bcd60e51b8152600401610365906129f7565b60208201516001600160a01b0316156107185760405162461bcd60e51b815260040161036590612a3e565b5f80610727846040015161149b565b91509150818a1461078f5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610365565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff191660018360058111156107d5576107d56127af565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f906108c69088908361127e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906108f59085906004016127e5565b6020604051808303815f875af1158015610911573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109359190612817565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156109d95750825b90505f826001600160401b031660011480156109f45750303b155b905081158015610a02575080155b15610a205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a4a57845460ff60401b1916600160401b1785555b610a5386611673565b8315610a9957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f5f80516020612de98339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610afc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b2391908101906128e1565b9150915080610b445760405162461bcd60e51b8152600401610365906129b3565b8254825114610b655760405162461bcd60e51b8152600401610365906129f7565b60208201516001600160a01b031615610b905760405162461bcd60e51b815260040161036590612a3e565b5f80610b9f8460400151611687565b9150915080610bff5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610365565b5f82815260078601602052604081208054610c1990612a8b565b9050118015610c4b575060015f83815260088701602052604090205460ff166005811115610c4957610c496127af565b145b610c675760405162461bcd60e51b815260040161036590612abd565b5f8281526007860160205260408120610c7f91612530565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020612de9833981519152929190610d7690612a8b565b9050118015610da8575060015f83815260088301602052604090205460ff166005811115610da657610da66127af565b145b610dc45760405162461bcd60e51b815260040161036590612abd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dfd9190600401612b02565b6020604051808303815f875af1158015610e19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3d9190612817565b505050565b5f610e4f84348585611828565b949350505050565b5f5f80516020612de98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610eb2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ed991908101906128e1565b9150915080610efa5760405162461bcd60e51b8152600401610365906129b3565b5f8415610f73575f610f0f8460400151611d24565b919350909150506001600160401b03811615610f6d5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610365565b50610fe7565b5f610f818460400151611687565b90925090508015610fe55760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610365565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115611019576110196127af565b600581111561102a5761102a6127af565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110db5760405162461bcd60e51b815260040161036590612878565b5f6003825160058111156110f1576110f16127af565b148061110f575060028251600581111561110d5761110d6127af565b145b1561113257506020808201515f9081526009870190915260408120556004611136565b5060055b5f83815260088701602052604090208251815484929190829060ff19166001836005811115611167576111676127af565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156112f7576112b7816001612b8c565b6112c2906008612861565b5081515f908390839081106112d9576112d9612b9f565b60200101906001600160f81b03191690815f1a9053506001016112a3565b505f5b600481101561135a5761130e816003612b8c565b611319906008612861565b6001901c60f81b8261132c836002612bb3565b8151811061133c5761133c612b9f565b60200101906001600160f81b03191690815f1a9053506001016112fa565b505f5b60208110156113bc5761137181601f612b8c565b61137c906008612861565b86901c60f81b8261138e836006612bb3565b8151811061139e5761139e612b9f565b60200101906001600160f81b03191690815f1a90535060010161135d565b505f5b6008811015611427576113d3816007612b8c565b6113de906008612861565b6001600160401b038616901c60f81b826113f9836026612bb3565b8151811061140957611409612b9f565b60200101906001600160f81b03191690815f1a9053506001016113bf565b505f5b60088110156114925761143e816007612b8c565b611449906008612861565b6001600160401b038516901c60f81b8261146483602e612bb3565b8151811061147457611474612b9f565b60200101906001600160f81b03191690815f1a90535060010161142a565b50949350505050565b5f808251602e146114be5760405162461bcd60e51b815260040161036590612bc6565b5f805b600281101561150d576114d5816001612b8c565b6114e0906008612861565b61ffff168582815181106114f6576114f6612b9f565b016020015160f81c901b91909117906001016114c1565b5061ffff8116156115305760405162461bcd60e51b815260040161036590612c0d565b5f805b600481101561158b57611547816003612b8c565b611552906008612861565b63ffffffff1686611564836002612bb3565b8151811061157457611574612b9f565b016020015160f81c901b9190911790600101611533565b5063ffffffff81166004146115b25760405162461bcd60e51b815260040161036590612c4e565b5f805b6020811015611607576115c981601f612b8c565b6115d4906008612861565b876115e0836006612bb3565b815181106115f0576115f0612b9f565b016020015160f81c901b91909117906001016115b5565b505f805b60088110156116665761161f816007612b8c565b61162a906008612861565b6001600160401b03168861163f836026612bb3565b8151811061164f5761164f612b9f565b016020015160f81c901b919091179060010161160b565b5090969095509350505050565b61167b611f5f565b61168481611faa565b50565b5f8082516027146116aa5760405162461bcd60e51b815260040161036590612bc6565b5f805b60028110156116f9576116c1816001612b8c565b6116cc906008612861565b61ffff168582815181106116e2576116e2612b9f565b016020015160f81c901b91909117906001016116ad565b5061ffff81161561171c5760405162461bcd60e51b815260040161036590612c0d565b5f805b600481101561177757611733816003612b8c565b61173e906008612861565b63ffffffff1686611750836002612bb3565b8151811061176057611760612b9f565b016020015160f81c901b919091179060010161171f565b5063ffffffff811660021461179e5760405162461bcd60e51b815260040161036590612c4e565b5f805b60208110156117f3576117b581601f612b8c565b6117c0906008612861565b876117cc836006612bb3565b815181106117dc576117dc612b9f565b016020015160f81c901b91909117906001016117a1565b505f8660268151811061180857611808612b9f565b016020015191976001600160f81b03199092161515965090945050505050565b5f611831611fcb565b5f80516020612de9833981519152426001600160401b03851611801561186b57506001600160401b038416611869426202a300612bb3565b115b6118cb5760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610365565b856119185760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610365565b5f868152600982016020526040902054156119845760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610365565b82516030146119e95760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610365565b845f6119f4826103f3565b90508260020154816001600160401b031610158015611a2057508260030154816001600160401b031611155b611a785760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610365565b5f80611abf6040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b0316815260200189815250612015565b5f82815260078801602052604090209193509150611add8282612cd7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b0a9085906004016127e5565b6020604051808303815f875af1158015611b26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4a9190612817565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611bd057611bd06127af565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610e4f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611d485760405162461bcd60e51b815260040161036590612bc6565b5f805b6002811015611d9757611d5f816001612b8c565b611d6a906008612861565b61ffff16868281518110611d8057611d80612b9f565b016020015160f81c901b9190911790600101611d4b565b5061ffff811615611dba5760405162461bcd60e51b815260040161036590612c0d565b5f805b6004811015611e1557611dd1816003612b8c565b611ddc906008612861565b63ffffffff1687611dee836002612bb3565b81518110611dfe57611dfe612b9f565b016020015160f81c901b9190911790600101611dbd565b5063ffffffff8116600114611e3c5760405162461bcd60e51b815260040161036590612c4e565b5f805b6020811015611e9157611e5381601f612b8c565b611e5e906008612861565b88611e6a836006612bb3565b81518110611e7a57611e7a612b9f565b016020015160f81c901b9190911790600101611e3f565b505f805b6008811015611ef057611ea9816007612b8c565b611eb4906008612861565b6001600160401b031689611ec9836026612bb3565b81518110611ed957611ed9612b9f565b016020015160f81c901b9190911790600101611e95565b505f805b6008811015611f4f57611f08816007612b8c565b611f13906008612861565b6001600160401b03168a611f2883602e612bb3565b81518110611f3857611f38612b9f565b016020015160f81c901b9190911790600101611ef4565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611fa857604051631afcd79f60e31b815260040160405180910390fd5b565b611fb2611f5f565b611fba6123e0565b611fc26123f0565b611684816123f8565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161200f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461207f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610365565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156120f6576120b6816001612b8c565b6120c1906008612861565b5081515f908390839081106120d8576120d8612b9f565b60200101906001600160f81b03191690815f1a9053506001016120a2565b505f5b60048110156121545761210d816003612b8c565b612118906008612861565b505f82612126836002612bb3565b8151811061213657612136612b9f565b60200101906001600160f81b03191690815f1a9053506001016120f9565b505f5b60208110156121b1578451816020811061217357612173612b9f565b1a60f81b82612183836006612bb3565b8151811061219357612193612b9f565b60200101906001600160f81b03191690815f1a905350600101612157565b505f5b602081101561221157846020015181602081106121d3576121d3612b9f565b1a60f81b826121e3836026612bb3565b815181106121f3576121f3612b9f565b60200101906001600160f81b03191690815f1a9053506001016121b4565b505f5b600881101561228557612228816007612b8c565b612233906008612861565b60ff1685604001516001600160401b0316901c60f81b828260466122579190612bb3565b8151811061226757612267612b9f565b60200101906001600160f81b03191690815f1a905350600101612214565b505f5b60308110156122f057846080015181815181106122a7576122a7612b9f565b01602001516001600160f81b031916826122c283604e612bb3565b815181106122d2576122d2612b9f565b60200101906001600160f81b03191690815f1a905350600101612288565b505f5b600881101561236257612307816007612b8c565b612312906008612861565b60608601516001600160401b0390811691161c60f81b8261233483607e612bb3565b8151811061234457612344612b9f565b60200101906001600160f81b03191690815f1a9053506001016122f3565b506002816040516123739190612d92565b602060405180830381855afa15801561238e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906123b19190612817565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6123e8611f5f565b611fa8612528565b611fa8611f5f565b612400611f5f565b80355f80516020612de983398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561249860a08301608084016125ac565b60048201805467ffffffffffffffff19166001600160401b03929092169190911790556124cb60c0830160a08401612dad565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556124fc60e0830160c08401612dcd565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6123ba611f5f565b50805461253c90612a8b565b5f825580601f1061254b575050565b601f0160209004905f5260205f209081019061168491905b80821115612576575f8155600101612563565b5090565b5f6020828403121561258a575f80fd5b5035919050565b80356001600160401b03811681146125a7575f80fd5b919050565b5f602082840312156125bc575f80fd5b6125c582612591565b9392505050565b8015158114611684575f80fd5b803563ffffffff811681146125a7575f80fd5b5f805f606084860312156125fe575f80fd5b833592506020840135612610816125cc565b915061261e604085016125d9565b90509250925092565b5f60e08284031215612637575f80fd5b50919050565b5f6020828403121561264d575f80fd5b6125c5826125d9565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561268c5761268c612656565b60405290565b604051601f8201601f191681016001600160401b03811182821017156126ba576126ba612656565b604052919050565b5f6001600160401b038211156126da576126da612656565b50601f01601f191660200190565b5f805f606084860312156126fa575f80fd5b8335925061270a60208501612591565b915060408401356001600160401b03811115612724575f80fd5b8401601f81018613612734575f80fd5b8035612747612742826126c2565b612692565b81815287602083850101111561275b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f806040838503121561278b575f80fd5b612794836125d9565b915060208301356127a4816125cc565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156127dd5781810151838201526020016127c5565b50505f910152565b602081525f82518060208401526128038160408501602087016127c3565b601f01601f19169190910160400192915050565b5f60208284031215612827575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f8261285c57634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176104035761040361282e565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b6001600160a01b0381168114611684575f80fd5b80516125a7816125cc565b5f80604083850312156128f2575f80fd5b82516001600160401b0380821115612908575f80fd5b908401906060828703121561291b575f80fd5b61292361266a565b82518152602080840151612936816128c2565b8282015260408401518381111561294b575f80fd5b80850194505087601f85011261295f575f80fd5b8351925061296f612742846126c2565b8381528882858701011115612982575f80fd5b612991848383018488016127c3565b806040840152508195506129a68188016128d6565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612a9f57607f821691505b60208210810361263757634e487b7160e01b5f52602260045260245ffd5b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612b1481612a8b565b806020870152604060018084165f8114612b355760018114612b5157612b7e565b60ff19851660408a0152604084151560051b8a01019550612b7e565b895f5260205f205f5b85811015612b755781548b8201860152908301908801612b5a565b8a016040019650505b509398975050505050505050565b818103818111156104035761040361282e565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104035761040361282e565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e3d57805f5260205f20601f840160051c81016020851015612cb85750805b601f840160051c820191505b818110156103ec575f8155600101612cc4565b81516001600160401b03811115612cf057612cf0612656565b612d0481612cfe8454612a8b565b84612c93565b602080601f831160018114612d37575f8415612d205750858301515b5f19600386901b1c1916600185901b178555610a99565b5f85815260208120601f198616915b82811015612d6557888601518255948401946001909101908401612d46565b5085821015612d8257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251612da38184602087016127c3565b9190910192915050565b5f60208284031215612dbd575f80fd5b813560ff811681146125c5575f80fd5b5f60208284031215612ddd575f80fd5b81356125c5816128c256feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516131a43803806131a483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130578061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780632e2194d8146100b457806362065856146100f057806376f786211461011d57806379f54eb11461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad36600461273d565b6101fd565b005b3480156100bf575f80fd5b506100d36100ce36600461273d565b6103f3565b6040516001600160401b0390911681526020015b60405180910390f35b3480156100fb575f80fd5b5061010f61010a36600461276f565b610409565b6040519081526020016100e7565b348015610128575f80fd5b506100b26101373660046127af565b610422565b348015610147575f80fd5b506100b26101563660046127ea565b6109a2565b348015610166575f80fd5b506100b2610175366004612800565b610aae565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b0390911681526020016100e7565b3480156101b7575f80fd5b506100b26101c636600461273d565b610d3b565b61010f6101d93660046128ab565b610e4f565b3480156101e9575f80fd5b506100b26101f836600461293d565b610e64565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061302b83398151915293929190829060ff16600581111561025e5761025e612972565b600581111561026f5761026f612972565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561030657610306612972565b1461036e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61037f848361010001515f61128b565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ac9084906004016129a8565b6020604051808303815f875af11580156103c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ec91906129da565b5050505050565b5f61040364e8d4a5100083612a19565b92915050565b5f6104036001600160401b03831664e8d4a51000612a2c565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061302b83398151915293929190829060ff16600581111561048357610483612972565b600581111561049457610494612972565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561052e5761052e612972565b146105875760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610365565b60c08101516001600160a01b0316336001600160a01b0316146105bc5760405162461bcd60e51b815260040161036590612a43565b6105c981604001516114a8565b60038152426001600160401b031660808201525f84156107a2576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561062c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106539190810190612aac565b91509150806106745760405162461bcd60e51b815260040161036590612b7e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906129da565b8251146106fa5760405162461bcd60e51b815260040161036590612bc2565b60208201516001600160a01b0316156107255760405162461bcd60e51b815260040161036590612c09565b5f806107348460400151611655565b91509150818a1461079c5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610365565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff191660018360058111156107e2576107e2612972565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f906108d39088908361128b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109029085906004016129a8565b6020604051808303815f875af115801561091e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094291906129da565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156109e65750825b90505f826001600160401b03166001148015610a015750303b155b905081158015610a0f575080155b15610a2d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a5757845460ff60401b1916600160401b1785555b610a608661182d565b8315610aa657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f5f8051602061302b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b09573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b309190810190612aac565b9150915080610b515760405162461bcd60e51b815260040161036590612b7e565b8254825114610b725760405162461bcd60e51b815260040161036590612bc2565b60208201516001600160a01b031615610b9d5760405162461bcd60e51b815260040161036590612c09565b5f80610bac8460400151611841565b9150915080610c0c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610365565b5f82815260078601602052604081208054610c2690612c56565b9050118015610c58575060015f83815260088701602052604090205460ff166005811115610c5657610c56612972565b145b610c745760405162461bcd60e51b815260040161036590612c88565b5f8281526007860160205260408120610c8c916126f3565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f8051602061302b833981519152929190610d8390612c56565b9050118015610db5575060015f83815260088301602052604090205460ff166005811115610db357610db3612972565b145b610dd15760405162461bcd60e51b815260040161036590612c88565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e0a9190600401612ccd565b6020604051808303815f875af1158015610e26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4a91906129da565b505050565b5f610e5c843485856119e2565b949350505050565b5f5f8051602061302b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ebf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ee69190810190612aac565b9150915080610f075760405162461bcd60e51b815260040161036590612b7e565b5f8415610f80575f610f1c8460400151611ee7565b919350909150506001600160401b03811615610f7a5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610365565b50610ff4565b5f610f8e8460400151611841565b90925090508015610ff25760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610365565b505b5f818152600885016020526040808220815161012081019092528054829060ff16600581111561102657611026612972565b600581111561103757611037612972565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110e85760405162461bcd60e51b815260040161036590612a43565b5f6003825160058111156110fe576110fe612972565b148061111c575060028251600581111561111a5761111a612972565b145b1561113f57506020808201515f9081526009870190915260408120556004611143565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561117457611174612972565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611304576112c4816001612d57565b6112cf906008612a2c565b5081515f908390839081106112e6576112e6612d6a565b60200101906001600160f81b03191690815f1a9053506001016112b0565b505f5b60048110156113675761131b816003612d57565b611326906008612a2c565b6001901c60f81b82611339836002612d7e565b8151811061134957611349612d6a565b60200101906001600160f81b03191690815f1a905350600101611307565b505f5b60208110156113c95761137e81601f612d57565b611389906008612a2c565b86901c60f81b8261139b836006612d7e565b815181106113ab576113ab612d6a565b60200101906001600160f81b03191690815f1a90535060010161136a565b505f5b6008811015611434576113e0816007612d57565b6113eb906008612a2c565b6001600160401b038616901c60f81b82611406836026612d7e565b8151811061141657611416612d6a565b60200101906001600160f81b03191690815f1a9053506001016113cc565b505f5b600881101561149f5761144b816007612d57565b611456906008612a2c565b6001600160401b038516901c60f81b8261147183602e612d7e565b8151811061148157611481612d6a565b60200101906001600160f81b03191690815f1a905350600101611437565b50949350505050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f8051602061302b83398151915290600160e01b900460ff165f036114ed575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906115359083612d57565b10611551576001600160401b0384166040830152808252611570565b83826040018181516115639190612d91565b6001600160401b03169052505b5f8260200151836040015160646115879190612db8565b6115919190612de3565b600485015490915060ff600160e01b909104811690821611156116115760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610365565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602e146116785760405162461bcd60e51b815260040161036590612e08565b5f805b60028110156116c75761168f816001612d57565b61169a906008612a2c565b61ffff168582815181106116b0576116b0612d6a565b016020015160f81c901b919091179060010161167b565b5061ffff8116156116ea5760405162461bcd60e51b815260040161036590612e4f565b5f805b600481101561174557611701816003612d57565b61170c906008612a2c565b63ffffffff168661171e836002612d7e565b8151811061172e5761172e612d6a565b016020015160f81c901b91909117906001016116ed565b5063ffffffff811660041461176c5760405162461bcd60e51b815260040161036590612e90565b5f805b60208110156117c15761178381601f612d57565b61178e906008612a2c565b8761179a836006612d7e565b815181106117aa576117aa612d6a565b016020015160f81c901b919091179060010161176f565b505f805b6008811015611820576117d9816007612d57565b6117e4906008612a2c565b6001600160401b0316886117f9836026612d7e565b8151811061180957611809612d6a565b016020015160f81c901b91909117906001016117c5565b5090969095509350505050565b611835612122565b61183e8161216d565b50565b5f8082516027146118645760405162461bcd60e51b815260040161036590612e08565b5f805b60028110156118b35761187b816001612d57565b611886906008612a2c565b61ffff1685828151811061189c5761189c612d6a565b016020015160f81c901b9190911790600101611867565b5061ffff8116156118d65760405162461bcd60e51b815260040161036590612e4f565b5f805b6004811015611931576118ed816003612d57565b6118f8906008612a2c565b63ffffffff168661190a836002612d7e565b8151811061191a5761191a612d6a565b016020015160f81c901b91909117906001016118d9565b5063ffffffff81166002146119585760405162461bcd60e51b815260040161036590612e90565b5f805b60208110156119ad5761196f81601f612d57565b61197a906008612a2c565b87611986836006612d7e565b8151811061199657611996612d6a565b016020015160f81c901b919091179060010161195b565b505f866026815181106119c2576119c2612d6a565b016020015191976001600160f81b03199092161515965090945050505050565b5f6119eb61218e565b5f8051602061302b833981519152426001600160401b038516118015611a2557506001600160401b038416611a23426202a300612d7e565b115b611a855760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610365565b85611ad25760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610365565b5f86815260098201602052604090205415611b3e5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610365565b8251603014611ba35760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610365565b845f611bae826103f3565b9050611bb9816114a8565b8260020154816001600160401b031610158015611be357508260030154816001600160401b031611155b611c3b5760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610365565b5f80611c826040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b03168152602001898152506121d8565b5f82815260078801602052604090209193509150611ca08282612f19565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ccd9085906004016129a8565b6020604051808303815f875af1158015611ce9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0d91906129da565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611d9357611d93612972565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610e5c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611f0b5760405162461bcd60e51b815260040161036590612e08565b5f805b6002811015611f5a57611f22816001612d57565b611f2d906008612a2c565b61ffff16868281518110611f4357611f43612d6a565b016020015160f81c901b9190911790600101611f0e565b5061ffff811615611f7d5760405162461bcd60e51b815260040161036590612e4f565b5f805b6004811015611fd857611f94816003612d57565b611f9f906008612a2c565b63ffffffff1687611fb1836002612d7e565b81518110611fc157611fc1612d6a565b016020015160f81c901b9190911790600101611f80565b5063ffffffff8116600114611fff5760405162461bcd60e51b815260040161036590612e90565b5f805b60208110156120545761201681601f612d57565b612021906008612a2c565b8861202d836006612d7e565b8151811061203d5761203d612d6a565b016020015160f81c901b9190911790600101612002565b505f805b60088110156120b35761206c816007612d57565b612077906008612a2c565b6001600160401b03168961208c836026612d7e565b8151811061209c5761209c612d6a565b016020015160f81c901b9190911790600101612058565b505f805b6008811015612112576120cb816007612d57565b6120d6906008612a2c565b6001600160401b03168a6120eb83602e612d7e565b815181106120fb576120fb612d6a565b016020015160f81c901b91909117906001016120b7565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661216b57604051631afcd79f60e31b815260040160405180910390fd5b565b612175612122565b61217d6125a3565b6121856125b3565b61183e816125bb565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016121d257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146122425760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610365565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156122b957612279816001612d57565b612284906008612a2c565b5081515f9083908390811061229b5761229b612d6a565b60200101906001600160f81b03191690815f1a905350600101612265565b505f5b6004811015612317576122d0816003612d57565b6122db906008612a2c565b505f826122e9836002612d7e565b815181106122f9576122f9612d6a565b60200101906001600160f81b03191690815f1a9053506001016122bc565b505f5b6020811015612374578451816020811061233657612336612d6a565b1a60f81b82612346836006612d7e565b8151811061235657612356612d6a565b60200101906001600160f81b03191690815f1a90535060010161231a565b505f5b60208110156123d4578460200151816020811061239657612396612d6a565b1a60f81b826123a6836026612d7e565b815181106123b6576123b6612d6a565b60200101906001600160f81b03191690815f1a905350600101612377565b505f5b6008811015612448576123eb816007612d57565b6123f6906008612a2c565b60ff1685604001516001600160401b0316901c60f81b8282604661241a9190612d7e565b8151811061242a5761242a612d6a565b60200101906001600160f81b03191690815f1a9053506001016123d7565b505f5b60308110156124b3578460800151818151811061246a5761246a612d6a565b01602001516001600160f81b0319168261248583604e612d7e565b8151811061249557612495612d6a565b60200101906001600160f81b03191690815f1a90535060010161244b565b505f5b6008811015612525576124ca816007612d57565b6124d5906008612a2c565b60608601516001600160401b0390811691161c60f81b826124f783607e612d7e565b8151811061250757612507612d6a565b60200101906001600160f81b03191690815f1a9053506001016124b6565b506002816040516125369190612fd4565b602060405180830381855afa158015612551573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061257491906129da565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6125ab612122565b61216b6126eb565b61216b612122565b6125c3612122565b80355f8051602061302b83398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561265b60a083016080840161276f565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561268e60c0830160a08401612fef565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556126bf60e0830160c0840161300f565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b61257d612122565b5080546126ff90612c56565b5f825580601f1061270e575050565b601f0160209004905f5260205f209081019061183e91905b80821115612739575f8155600101612726565b5090565b5f6020828403121561274d575f80fd5b5035919050565b80356001600160401b038116811461276a575f80fd5b919050565b5f6020828403121561277f575f80fd5b61278882612754565b9392505050565b801515811461183e575f80fd5b803563ffffffff8116811461276a575f80fd5b5f805f606084860312156127c1575f80fd5b8335925060208401356127d38161278f565b91506127e16040850161279c565b90509250925092565b5f60e082840312156127fa575f80fd5b50919050565b5f60208284031215612810575f80fd5b6127888261279c565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561284f5761284f612819565b60405290565b604051601f8201601f191681016001600160401b038111828210171561287d5761287d612819565b604052919050565b5f6001600160401b0382111561289d5761289d612819565b50601f01601f191660200190565b5f805f606084860312156128bd575f80fd5b833592506128cd60208501612754565b915060408401356001600160401b038111156128e7575f80fd5b8401601f810186136128f7575f80fd5b803561290a61290582612885565b612855565b81815287602083850101111561291e575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f806040838503121561294e575f80fd5b6129578361279c565b915060208301356129678161278f565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156129a0578181015183820152602001612988565b50505f910152565b602081525f82518060208401526129c6816040850160208701612986565b601f01601f19169190910160400192915050565b5f602082840312156129ea575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612a2757612a276129f1565b500490565b808202811582820484141761040357610403612a05565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b6001600160a01b038116811461183e575f80fd5b805161276a8161278f565b5f8060408385031215612abd575f80fd5b82516001600160401b0380821115612ad3575f80fd5b9084019060608287031215612ae6575f80fd5b612aee61282d565b82518152602080840151612b0181612a8d565b82820152604084015183811115612b16575f80fd5b80850194505087601f850112612b2a575f80fd5b83519250612b3a61290584612885565b8381528882858701011115612b4d575f80fd5b612b5c84838301848801612986565b80604084015250819550612b71818801612aa1565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612c6a57607f821691505b6020821081036127fa57634e487b7160e01b5f52602260045260245ffd5b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612cdf81612c56565b806020870152604060018084165f8114612d005760018114612d1c57612d49565b60ff19851660408a0152604084151560051b8a01019550612d49565b895f5260205f205f5b85811015612d405781548b8201860152908301908801612d25565b8a016040019650505b509398975050505050505050565b8181038181111561040357610403612a05565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561040357610403612a05565b6001600160401b03818116838216019080821115612db157612db1612a05565b5092915050565b6001600160401b03818116838216028082169190828114612ddb57612ddb612a05565b505092915050565b5f6001600160401b0380841680612dfc57612dfc6129f1565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e4a57805f5260205f20601f840160051c81016020851015612efa5750805b601f840160051c820191505b818110156103ec575f8155600101612f06565b81516001600160401b03811115612f3257612f32612819565b612f4681612f408454612c56565b84612ed5565b602080601f831160018114612f79575f8415612f625750858301515b5f19600386901b1c1916600185901b178555610aa6565b5f85815260208120601f198616915b82811015612fa757888601518255948401946001909101908401612f88565b5085821015612fc457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251612fe5818460208701612986565b9190910192915050565b5f60208284031215612fff575f80fd5b813560ff81168114612788575f80fd5b5f6020828403121561301f575f80fd5b813561278881612a8d56feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 619e784f2..e22e66d20 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -146,8 +146,7 @@ abstract contract StakingManager is // Ensure the stake churn doesn't exceed the maximum churn rate. uint64 weight = valueToWeight(lockedValue); - // TODO: Support this in the e2e test - // _checkAndUpdateChurnTracker(weight); + _checkAndUpdateChurnTracker(weight); // Ensure the weight is within the valid range. require( @@ -259,8 +258,7 @@ abstract contract StakingManager is require(_msgSender() == validator.owner, "StakingManager: Sender not validator owner"); // Check that removing this validator would not exceed the maximum churn rate. - // TODO: Support this in the e2e test - // _checkAndUpdateChurnTracker(validator.weight); + _checkAndUpdateChurnTracker(validator.weight); // Update the validator status to pending removal. // They are not removed from the active validators mapping until the P-Chain acknowledges the removal. diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index b30f9bec5..15ba7756f 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -110,7 +110,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), MinimumStakeDuration: uint64(24 * time.Hour), - MaximumHourlyChurn: 1, + MaximumHourlyChurn: 0, RewardCalculator: common.Address{}, }, ) From 4c331399824e24e20128e5140f8dc6be9f6fb3c3 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 15 Aug 2024 16:00:06 -0400 Subject: [PATCH 078/545] refactor utils --- tests/flows/native_token_staking.go | 83 +- tests/local/network.go | 44 +- tests/utils/chain_utils.go | 563 +++++++++ tests/utils/erc20_utils.go | 61 + tests/utils/governance_utils.go | 108 ++ tests/utils/staking_utils.go | 65 + tests/utils/{utils.go => teleporter_utils.go} | 1065 ++++------------- 7 files changed, 1047 insertions(+), 942 deletions(-) create mode 100644 tests/utils/chain_utils.go create mode 100644 tests/utils/erc20_utils.go create mode 100644 tests/utils/governance_utils.go create mode 100644 tests/utils/staking_utils.go rename tests/utils/{utils.go => teleporter_utils.go} (51%) diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index 15ba7756f..fc525f404 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -6,19 +6,10 @@ import ( "math/big" "time" - "github.com/ava-labs/avalanchego/api/info" "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/message" - "github.com/ava-labs/avalanchego/utils/constants" - "github.com/ava-labs/avalanchego/utils/logging" - "github.com/ava-labs/avalanchego/utils/set" avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/messages" warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" - relayerConfig "github.com/ava-labs/awm-relayer/config" - "github.com/ava-labs/awm-relayer/peers" - "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" - sigAggConfig "github.com/ava-labs/awm-relayer/signature-aggregator/config" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/precompile/contracts/warp" @@ -29,7 +20,6 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/log" . "github.com/onsi/gomega" - "github.com/prometheus/client_golang/prometheus" ) // Registers a native token staking validator on a subnet. The steps are as follows: @@ -50,72 +40,23 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { cChainInfo := network.GetPrimaryNetworkInfo() subnetAInfo, _ := utils.GetTwoSubnets(network) _, fundedKey := network.GetFundedAccountInfo() + pChainInfo := utils.GetPChainInfo(cChainInfo) - // Construct the P-Chain info - pChainBlockchainID, err := info.NewClient(cChainInfo.NodeURIs[0]).GetBlockchainID(context.Background(), "P") - Expect(err).Should(BeNil()) - pChainInfo := interfaces.SubnetTestInfo{ - BlockchainID: pChainBlockchainID, - SubnetID: ids.Empty, - } - - // Create the signature aggregator - logger := logging.NoLog{} - cfg := sigAggConfig.Config{ - PChainAPI: &relayerConfig.APIConfig{ - BaseURL: cChainInfo.NodeURIs[0], - }, - InfoAPI: &relayerConfig.APIConfig{ - BaseURL: cChainInfo.NodeURIs[0], + signatureAggregator := utils.NewSignatureAggregator( + cChainInfo.NodeURIs[0], + []ids.ID{ + subnetAInfo.SubnetID, + ids.Empty, // Primary network subnet ID }, - } - trackedSubnets := set.NewSet[ids.ID](2) - trackedSubnets.Add(subnetAInfo.BlockchainID) - trackedSubnets.Add(ids.Empty) // Primary network subnet ID - appRequestNetwork, err := peers.NewNetwork( - logging.Debug, - prometheus.DefaultRegisterer, - trackedSubnets, - &cfg, ) - Expect(err).Should(BeNil()) - - messageCreator, err := message.NewCreator( - logger, - prometheus.DefaultRegisterer, - constants.DefaultNetworkCompressionType, - constants.DefaultNetworkMaximumInboundTimeout, - ) - Expect(err).Should(BeNil()) - signatureAggregator := aggregator.NewSignatureAggregator( - appRequestNetwork, - logger, - messageCreator, - ) - signatureAggregator.GetSubnetID(subnetAInfo.BlockchainID) // Deploy the staking manager contract - stakingManagerContractAddress, stakingManager := utils.DeployNativeTokenStakingManager( + stakingManagerContractAddress, stakingManager := utils.DeployAndInitializeNativeTokenStakingManager( context.Background(), fundedKey, subnetAInfo, + pChainInfo, ) - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) - Expect(err).Should(BeNil()) - tx, err := stakingManager.Initialize( - opts, - nativetokenstakingmanager.StakingManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, - SubnetID: subnetAInfo.SubnetID, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - MaximumHourlyChurn: 0, - RewardCalculator: common.Address{}, - }, - ) - Expect(err).Should(BeNil()) - utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) // // Register a validator @@ -123,10 +64,12 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { var validationID ids.ID // To be used in the delisting step { // Iniatiate validator registration + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + Expect(err).Should(BeNil()) opts.Value = big.NewInt(0).SetUint64(1e18) nodeID := ids.GenerateTestID() blsPublicKey := [48]byte{} - tx, err = stakingManager.InitializeValidatorRegistration( + tx, err := stakingManager.InitializeValidatorRegistration( opts, nodeID, uint64(time.Now().Add(24*time.Hour).Unix()), @@ -216,9 +159,9 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Delist the validator // { - opts, err = bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err = stakingManager.InitializeEndValidation( + tx, err := stakingManager.InitializeEndValidation( opts, validationID, false, diff --git a/tests/local/network.go b/tests/local/network.go index 7f6e7fb0f..d2d4ce28b 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -51,45 +51,13 @@ type LocalNetwork struct { // Internal vars only used to set up the local network tmpnet *tmpnet.Network - // warpChainConfigPath string } const ( fundedKeyStr = "56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027" - // warpEnabledChainConfig = `{ - // "warp-api-enabled": true, - // "eth-apis":["eth","eth-filter","net","admin","web3", - // "internal-eth","internal-blockchain","internal-transaction", - // "internal-debug","internal-account","internal-personal", - // "debug","debug-tracer","debug-file-tracer","debug-handler"] - // }` - - timeout = 60 * time.Second + timeout = 60 * time.Second ) -var warpEnabledChainConfig = tmpnet.FlagsMap{ - "log-level": "debug", - "warp-api-enabled": true, - "local-txs-enabled": true, - "eth-apis": []string{ - "eth", - "eth-filter", - "net", - "admin", - "web3", - "internal-eth", - "internal-blockchain", - "internal-transaction", - "internal-debug", - "internal-account", - "internal-personal", - "debug", - "debug-tracer", - "debug-file-tracer", - "debug-handler", - }, -} - type SubnetSpec struct { Name string EVMChainID uint64 @@ -111,12 +79,6 @@ func NewLocalNetwork( // Create extra nodes to be used to add more validators later extraNodes := subnetEvmTestUtils.NewTmpnetNodes(extraNodeCount) - // f, err := os.CreateTemp(os.TempDir(), "config.json") - // Expect(err).Should(BeNil()) - // _, err = f.Write([]byte(warpEnabledChainConfig)) - // Expect(err).Should(BeNil()) - // warpChainConfigPath := f.Name() - var allNodes []*tmpnet.Node allNodes = append(allNodes, extraNodes...) // to be appended w/ subnet validators @@ -134,7 +96,7 @@ func NewLocalNetwork( subnetSpec.TeleporterDeployedBytecode, subnetSpec.TeleporterDeployerAddress, ), - warpEnabledChainConfig, + utils.WarpEnabledChainConfig, nodes..., ) subnets = append(subnets, subnet) @@ -177,7 +139,6 @@ func NewLocalNetwork( extraNodes: extraNodes, globalFundedKey: globalFundedKey, tmpnet: network, - // warpChainConfigPath: warpChainConfigPath, } for _, subnet := range network.Subnets { localNetwork.setSubnetValues(subnet) @@ -509,7 +470,6 @@ func (n *LocalNetwork) TearDownNetwork() { Expect(n).ShouldNot(BeNil()) Expect(n.tmpnet).ShouldNot(BeNil()) Expect(n.tmpnet.Stop(context.Background())).Should(BeNil()) - // Expect(os.Remove(n.warpChainConfigPath)).Should(BeNil()) } func (n *LocalNetwork) AddSubnetValidators(ctx context.Context, subnetID ids.ID, count uint) { diff --git a/tests/utils/chain_utils.go b/tests/utils/chain_utils.go new file mode 100644 index 000000000..36244b4f9 --- /dev/null +++ b/tests/utils/chain_utils.go @@ -0,0 +1,563 @@ +package utils + +import ( + "context" + "crypto/ecdsa" + "encoding/json" + "errors" + "fmt" + "math/big" + "os" + "strconv" + "strings" + "time" + + "github.com/ava-labs/avalanchego/api/info" + "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/message" + "github.com/ava-labs/avalanchego/tests/fixture/tmpnet" + "github.com/ava-labs/avalanchego/utils/constants" + "github.com/ava-labs/avalanchego/utils/logging" + "github.com/ava-labs/avalanchego/utils/set" + avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" + relayerConfig "github.com/ava-labs/awm-relayer/config" + "github.com/ava-labs/awm-relayer/peers" + "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" + sigAggConfig "github.com/ava-labs/awm-relayer/signature-aggregator/config" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/eth/tracers" + "github.com/ava-labs/subnet-evm/ethclient" + subnetEvmInterfaces "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ava-labs/teleporter/tests/interfaces" + gasUtils "github.com/ava-labs/teleporter/utils/gas-utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + . "github.com/onsi/gomega" + "github.com/prometheus/client_golang/prometheus" +) + +const ( + CChainPathSpecifier = "C" +) + +var NativeTransferGas uint64 = 21_000 + +var WarpEnabledChainConfig = tmpnet.FlagsMap{ + "log-level": "debug", + "warp-api-enabled": true, + "local-txs-enabled": true, + "eth-apis": []string{ + "eth", + "eth-filter", + "net", + "admin", + "web3", + "internal-eth", + "internal-blockchain", + "internal-transaction", + "internal-debug", + "internal-account", + "internal-personal", + "debug", + "debug-tracer", + "debug-file-tracer", + "debug-handler", + }, +} + +// +// URL utils +// + +func HttpToWebsocketURI(uri string, blockchainID string) string { + return fmt.Sprintf("ws://%s/ext/bc/%s/ws", strings.TrimPrefix(uri, "http://"), blockchainID) +} + +func HttpToRPCURI(uri string, blockchainID string) string { + return fmt.Sprintf("http://%s/ext/bc/%s/rpc", strings.TrimPrefix(uri, "http://"), blockchainID) +} + +// Get the host and port from a URI. The URI should be in the format http://host:port or https://host:port +func GetURIHostAndPort(uri string) (string, uint32, error) { + // At a minimum uri should have http:// of 7 characters + Expect(len(uri)).Should(BeNumerically(">", 7)) + if uri[:7] == "http://" { + uri = uri[7:] + } else if uri[:8] == "https://" { + uri = uri[8:] + } else { + return "", 0, fmt.Errorf("invalid uri: %s", uri) + } + + // Split the uri into host and port + hostAndPort := strings.Split(uri, ":") + Expect(len(hostAndPort)).Should(Equal(2)) + + // Parse the port + port, err := strconv.ParseUint(hostAndPort[1], 10, 32) + if err != nil { + return "", 0, fmt.Errorf("failed to parse port: %w", err) + } + + return hostAndPort[0], uint32(port), nil +} + +// +// Transaction utils +// + +func CreateNativeTransferTransaction( + ctx context.Context, + subnetInfo interfaces.SubnetTestInfo, + fromKey *ecdsa.PrivateKey, + recipient common.Address, + amount *big.Int, +) *types.Transaction { + fromAddress := crypto.PubkeyToAddress(fromKey.PublicKey) + gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnetInfo, fromAddress) + + tx := types.NewTx(&types.DynamicFeeTx{ + ChainID: subnetInfo.EVMChainID, + Nonce: nonce, + To: &recipient, + Gas: NativeTransferGas, + GasFeeCap: gasFeeCap, + GasTipCap: gasTipCap, + Value: amount, + }) + + return SignTransaction(tx, fromKey, subnetInfo.EVMChainID) +} + +func SendNativeTransfer( + ctx context.Context, + subnetInfo interfaces.SubnetTestInfo, + fromKey *ecdsa.PrivateKey, + recipient common.Address, + amount *big.Int, +) *types.Receipt { + tx := CreateNativeTransferTransaction(ctx, subnetInfo, fromKey, recipient, amount) + return SendTransactionAndWaitForSuccess(ctx, subnetInfo, tx) +} + +// Sends a tx, and waits for it to be mined. +// Asserts Receipt.status equals success. +func sendAndWaitForTransaction( + ctx context.Context, + subnetInfo interfaces.SubnetTestInfo, + tx *types.Transaction, + success bool, +) *types.Receipt { + err := subnetInfo.RPCClient.SendTransaction(ctx, tx) + Expect(err).Should(BeNil()) + + return waitForTransaction(ctx, subnetInfo, tx.Hash(), success) +} + +// Sends a tx, and waits for it to be mined. +// Asserts Receipt.status equals false. +func SendTransactionAndWaitForFailure( + ctx context.Context, + subnetInfo interfaces.SubnetTestInfo, + tx *types.Transaction, +) *types.Receipt { + return sendAndWaitForTransaction(ctx, subnetInfo, tx, false) +} + +// Sends a tx, and waits for it to be mined. +// Asserts Receipt.status equals true. +func SendTransactionAndWaitForSuccess( + ctx context.Context, + subnetInfo interfaces.SubnetTestInfo, + tx *types.Transaction, +) *types.Receipt { + return sendAndWaitForTransaction(ctx, subnetInfo, tx, true) +} + +// Waits for a transaction to be mined. +// Asserts Receipt.status equals true. +func WaitForTransactionSuccess( + ctx context.Context, + subnetInfo interfaces.SubnetTestInfo, + txHash common.Hash, +) *types.Receipt { + return waitForTransaction(ctx, subnetInfo, txHash, true) +} + +// Waits for a transaction to be mined. +// Asserts Receipt.status equals false. +func WaitForTransactionFailure( + ctx context.Context, + subnetInfo interfaces.SubnetTestInfo, + txHash common.Hash, +) *types.Receipt { + return waitForTransaction(ctx, subnetInfo, txHash, false) +} + +// Waits for a transaction to be mined. +// Asserts Receipt.status equals success. +func waitForTransaction( + ctx context.Context, + subnetInfo interfaces.SubnetTestInfo, + txHash common.Hash, + success bool, +) *types.Receipt { + cctx, cancel := context.WithTimeout(ctx, 10*time.Second) + defer cancel() + + receipt, err := WaitMined(cctx, subnetInfo.RPCClient, txHash) + Expect(err).Should(BeNil()) + + if success { + if receipt.Status == types.ReceiptStatusFailed { + TraceTransactionAndExit(ctx, subnetInfo.RPCClient, receipt.TxHash) + } + } else { + Expect(receipt.Status).Should(Equal(types.ReceiptStatusFailed)) + } + return receipt +} + +// Polls for a transaction receipt of the given txHash on each queryTicker tick until +// either a transaction receipt returned, or the context is cancelled or expired. +func waitForTransactionReceipt( + cctx context.Context, + rpcClient ethclient.Client, + txHash common.Hash, +) (*types.Receipt, error) { + queryTicker := time.NewTicker(200 * time.Millisecond) + defer queryTicker.Stop() + for { + receipt, err := rpcClient.TransactionReceipt(cctx, txHash) + if err == nil { + return receipt, nil + } + + if errors.Is(err, subnetEvmInterfaces.NotFound) { + log.Debug("Transaction not yet mined") + } else { + log.Error("Receipt retrieval failed", "err", err) + return nil, err + } + + // Wait for the next round. + select { + case <-cctx.Done(): + return nil, cctx.Err() + case <-queryTicker.C: + } + } +} + +// Signs a transaction using the provided key for the specified chainID +func SignTransaction(tx *types.Transaction, key *ecdsa.PrivateKey, chainID *big.Int) *types.Transaction { + txSigner := types.LatestSignerForChainID(chainID) + signedTx, err := types.SignTx(tx, txSigner, key) + Expect(err).Should(BeNil()) + + return signedTx +} + +// Returns the gasFeeCap, gasTipCap, and nonce the be used when constructing a transaction from fundedAddress +func CalculateTxParams( + ctx context.Context, + subnetInfo interfaces.SubnetTestInfo, + fundedAddress common.Address, +) (*big.Int, *big.Int, uint64) { + baseFee, err := subnetInfo.RPCClient.EstimateBaseFee(ctx) + Expect(err).Should(BeNil()) + + gasTipCap, err := subnetInfo.RPCClient.SuggestGasTipCap(ctx) + Expect(err).Should(BeNil()) + + nonce, err := subnetInfo.RPCClient.NonceAt(ctx, fundedAddress, nil) + Expect(err).Should(BeNil()) + + gasFeeCap := baseFee.Mul(baseFee, big.NewInt(gasUtils.BaseFeeFactor)) + gasFeeCap.Add(gasFeeCap, big.NewInt(gasUtils.MaxPriorityFeePerGas)) + + return gasFeeCap, gasTipCap, nonce +} + +// Gomega will print the transaction trace and exit +func TraceTransactionAndExit(ctx context.Context, rpcClient ethclient.Client, txHash common.Hash) { + Expect(TraceTransaction(ctx, rpcClient, txHash)).Should(Equal("")) +} + +func TraceTransaction(ctx context.Context, rpcClient ethclient.Client, txHash common.Hash) string { + var result interface{} + ct := "callTracer" + err := rpcClient.Client().Call(&result, "debug_traceTransaction", txHash.String(), tracers.TraceConfig{Tracer: &ct}) + Expect(err).Should(BeNil()) + + jsonStr, err := json.Marshal(result) + Expect(err).Should(BeNil()) + + return string(jsonStr) +} + +// +// Block utils +// + +// WaitMined waits for tx to be mined on the blockchain. +// It stops waiting when the context is canceled. +// Takes a tx hash instead of the full tx in the subnet-evm version of this function. +// Copied and modified from https://github.com/ava-labs/subnet-evm/blob/v0.6.0-fuji/accounts/abi/bind/util.go#L42 +func WaitMined(ctx context.Context, rpcClient ethclient.Client, txHash common.Hash) (*types.Receipt, error) { + cctx, cancel := context.WithTimeout(ctx, 20*time.Second) + defer cancel() + + receipt, err := waitForTransactionReceipt(cctx, rpcClient, txHash) + if err != nil { + return nil, err + } + + // Check that the block height endpoint returns a block height as high as the block number that the transaction was + // included in. This is to workaround the issue where multiple nodes behind a public RPC endpoint see + // transactions/blocks at different points in time. Ideally, all nodes in the network should have seen this block + // and transaction before returning from WaitMined. The block height endpoint of public RPC endpoints is + // configured to return the lowest value currently returned by any node behind the load balancer, so waiting for + // it to be at least as high as the block height specified in the receipt should provide a relatively strong + // indication that the transaction has been seen widely throughout the network. + err = waitForBlockHeight(cctx, rpcClient, receipt.BlockNumber.Uint64()) + if err != nil { + return nil, err + } + + return receipt, nil +} + +// Polls for the eth_blockNumber endpoint for the latest blockheight on each queryTicker tick until +// either the returned height is greater than or equal to the expectedBlockNumber, or the context +// is cancelled or expired. +func waitForBlockHeight( + cctx context.Context, + rpcClient ethclient.Client, + expectedBlockNumber uint64, +) error { + queryTicker := time.NewTicker(2 * time.Second) + defer queryTicker.Stop() + for { + currentBlockNumber, err := rpcClient.BlockNumber(cctx) + if err != nil { + return err + } + + if currentBlockNumber >= expectedBlockNumber { + return nil + } else { + log.Info("Waiting for block height where transaction was included", + "blockNumber", expectedBlockNumber) + } + + // Wait for the next round. + select { + case <-cctx.Done(): + return cctx.Err() + case <-queryTicker.C: + } + } +} + +// +// Log utils +// + +// Returns the first log in 'logs' that is successfully parsed by 'parser' +// Errors and prints a trace of the transaction if no log is found. +func GetEventFromLogsOrTrace[T any]( + ctx context.Context, + receipt *types.Receipt, + subnetInfo interfaces.SubnetTestInfo, + parser func(log types.Log) (T, error), +) T { + log, err := GetEventFromLogs(receipt.Logs, parser) + if err != nil { + TraceTransactionAndExit(ctx, subnetInfo.RPCClient, receipt.TxHash) + } + return log +} + +// Returns the first log in 'logs' that is successfully parsed by 'parser' +func GetEventFromLogs[T any](logs []*types.Log, parser func(log types.Log) (T, error)) (T, error) { + for _, log := range logs { + event, err := parser(*log) + if err == nil { + return event, nil + } + } + return *new(T), fmt.Errorf("failed to find %T event in receipt logs", *new(T)) +} + +// +// Account utils +// + +func PrivateKeyToAddress(k *ecdsa.PrivateKey) common.Address { + return crypto.PubkeyToAddress(k.PublicKey) +} + +// Throws a Gomega error if there is a mismatch +func CheckBalance(ctx context.Context, addr common.Address, expectedBalance *big.Int, rpcClient ethclient.Client) { + bal, err := rpcClient.BalanceAt(ctx, addr, nil) + Expect(err).Should(BeNil()) + ExpectBigEqual(bal, expectedBalance) +} + +// +// Big int utils +// + +func ExpectBigEqual(v1 *big.Int, v2 *big.Int) { + // Compare strings, so gomega will print the numbers if they differ + Expect(v1.String()).Should(Equal(v2.String())) +} + +func BigIntSub(v1 *big.Int, v2 *big.Int) *big.Int { + return big.NewInt(0).Sub(v1, v2) +} + +func BigIntMul(v1 *big.Int, v2 *big.Int) *big.Int { + return big.NewInt(0).Mul(v1, v2) +} + +// +// Network utils +// + +func GetPChainInfo(cChainInfo interfaces.SubnetTestInfo) interfaces.SubnetTestInfo { + pChainBlockchainID, err := info.NewClient(cChainInfo.NodeURIs[0]).GetBlockchainID(context.Background(), "P") + Expect(err).Should(BeNil()) + return interfaces.SubnetTestInfo{ + BlockchainID: pChainBlockchainID, + SubnetID: ids.Empty, + } +} + +func GetTwoSubnets(network interfaces.Network) ( + interfaces.SubnetTestInfo, + interfaces.SubnetTestInfo, +) { + subnets := network.GetSubnetsInfo() + Expect(len(subnets)).Should(BeNumerically(">=", 2)) + return subnets[0], subnets[1] +} + +type ChainConfigMap map[string]string + +// Sets the chain config in customChainConfigs for the specified subnet +func (m ChainConfigMap) Add(subnet interfaces.SubnetTestInfo, chainConfig string) { + if subnet.SubnetID == constants.PrimaryNetworkID { + m[CChainPathSpecifier] = chainConfig + } else { + m[subnet.BlockchainID.String()] = chainConfig + } +} + +func GetChainConfigWithOffChainMessages(offChainMessages []avalancheWarp.UnsignedMessage) string { + // Convert messages to hex + hexOffChainMessages := []string{} + for _, message := range offChainMessages { + hexOffChainMessages = append(hexOffChainMessages, hexutil.Encode(message.Bytes())) + } + + chainConfig := WarpEnabledChainConfig + chainConfig["warp-off-chain-messages"] = hexOffChainMessages + + // Marshal the map to JSON + offChainMessageJson, err := tmpnet.DefaultJSONMarshal(chainConfig) + Expect(err).Should(BeNil()) + + return string(offChainMessageJson) +} + +// read in the template file, make the substitutions declared at the beginning +// of the function, write out the instantiation to a temp file, and then return +// the path to that temp file. +func InstantiateGenesisTemplate( + templateFileName string, + chainID uint64, + teleporterContractAddress common.Address, + teleporterDeployedBytecode string, + teleporterDeployerAddress common.Address, +) string { + substitutions := []struct { + Target string + Value string + }{ + { + "", + strconv.FormatUint(chainID, 10), + }, + { + "", + teleporterContractAddress.Hex(), + }, + { + "", + teleporterDeployedBytecode, + }, + { + "", + teleporterDeployerAddress.Hex(), + }, + } + + templateFileBytes, err := os.ReadFile(templateFileName) + Expect(err).Should(BeNil()) + + subnetGenesisFile, err := os.CreateTemp(os.TempDir(), "") + Expect(err).Should(BeNil()) + + defer subnetGenesisFile.Close() + + var replaced string = string(templateFileBytes[:]) + for _, s := range substitutions { + replaced = strings.ReplaceAll(replaced, s.Target, s.Value) + } + + subnetGenesisFile.WriteString(replaced) + + return subnetGenesisFile.Name() +} + +// +// Aggregator utils +// + +func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.SignatureAggregator { + logger := logging.NoLog{} + cfg := sigAggConfig.Config{ + PChainAPI: &relayerConfig.APIConfig{ + BaseURL: apiUri, + }, + InfoAPI: &relayerConfig.APIConfig{ + BaseURL: apiUri, + }, + } + trackedSubnets := set.NewSet[ids.ID](len(subnets)) + trackedSubnets.Add(subnets...) + appRequestNetwork, err := peers.NewNetwork( + logging.Debug, + prometheus.DefaultRegisterer, + trackedSubnets, + &cfg, + ) + Expect(err).Should(BeNil()) + + messageCreator, err := message.NewCreator( + logger, + prometheus.DefaultRegisterer, + constants.DefaultNetworkCompressionType, + constants.DefaultNetworkMaximumInboundTimeout, + ) + Expect(err).Should(BeNil()) + return aggregator.NewSignatureAggregator( + appRequestNetwork, + logger, + messageCreator, + ) +} diff --git a/tests/utils/erc20_utils.go b/tests/utils/erc20_utils.go new file mode 100644 index 000000000..b235dbf6d --- /dev/null +++ b/tests/utils/erc20_utils.go @@ -0,0 +1,61 @@ +package utils + +import ( + "context" + "crypto/ecdsa" + "math/big" + + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" + "github.com/ava-labs/teleporter/tests/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/log" + . "github.com/onsi/gomega" +) + +var ( + ExpectedExampleERC20DeployerBalance = new(big.Int).Mul(big.NewInt(1e18), big.NewInt(1e10)) +) + +func DeployExampleERC20( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + source interfaces.SubnetTestInfo, +) (common.Address, *exampleerc20.ExampleERC20) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, source.EVMChainID) + Expect(err).Should(BeNil()) + + // Deploy Mock ERC20 contract + address, tx, token, err := exampleerc20.DeployExampleERC20(opts, source.RPCClient) + Expect(err).Should(BeNil()) + log.Info("Deployed Mock ERC20 contract", "address", address.Hex(), "txHash", tx.Hash().Hex()) + + // Wait for the transaction to be mined + WaitForTransactionSuccess(ctx, source, tx.Hash()) + + // Check that the deployer has the expected initial balance + senderAddress := crypto.PubkeyToAddress(senderKey.PublicKey) + balance, err := token.BalanceOf(&bind.CallOpts{}, senderAddress) + Expect(err).Should(BeNil()) + Expect(balance).Should(Equal(ExpectedExampleERC20DeployerBalance)) + + return address, token +} + +func ERC20Approve( + ctx context.Context, + token *exampleerc20.ExampleERC20, + spender common.Address, + amount *big.Int, + source interfaces.SubnetTestInfo, + senderKey *ecdsa.PrivateKey, +) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, source.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := token.Approve(opts, spender, amount) + Expect(err).Should(BeNil()) + log.Info("Approved ERC20", "spender", spender.Hex(), "txHash", tx.Hash().Hex()) + + WaitForTransactionSuccess(ctx, source, tx.Hash()) +} diff --git a/tests/utils/governance_utils.go b/tests/utils/governance_utils.go new file mode 100644 index 000000000..177d3f017 --- /dev/null +++ b/tests/utils/governance_utils.go @@ -0,0 +1,108 @@ +package utils + +import ( + "context" + "crypto/ecdsa" + + avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" + "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + validatorsetsig "github.com/ava-labs/teleporter/abi-bindings/go/governance/ValidatorSetSig" + "github.com/ava-labs/teleporter/tests/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + . "github.com/onsi/gomega" +) + +func DeployValidatorSetSig( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + contractSubnet interfaces.SubnetTestInfo, + validatorSubnet interfaces.SubnetTestInfo, +) (common.Address, *validatorsetsig.ValidatorSetSig) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, contractSubnet.EVMChainID) + Expect(err).Should(BeNil()) + address, tx, validatorSetSig, err := validatorsetsig.DeployValidatorSetSig( + opts, + contractSubnet.RPCClient, + validatorSubnet.BlockchainID, + ) + Expect(err).Should(BeNil()) + + // Wait for the transaction to be mined + WaitForTransactionSuccess(ctx, contractSubnet, tx.Hash()) + + return address, validatorSetSig +} + +// Returns Receipt for the transaction unlike TeleporterRegistry version since this is a non-teleporter case +// and we don't want to add the ValidatorSetSig ABI to the subnetInfo +func ExecuteValidatorSetSigCallAndVerify( + ctx context.Context, + network interfaces.Network, + source interfaces.SubnetTestInfo, + destination interfaces.SubnetTestInfo, + validatorSetSigAddress common.Address, + senderKey *ecdsa.PrivateKey, + unsignedMessage *avalancheWarp.UnsignedMessage, + expectSuccess bool, +) *types.Receipt { + signedWarpMsg := network.GetSignedMessage(ctx, source, destination, unsignedMessage.ID()) + log.Info("Got signed warp message", "messageID", signedWarpMsg.ID()) + + signedPredicateTx := CreateExecuteCallPredicateTransaction( + ctx, + signedWarpMsg, + validatorSetSigAddress, + senderKey, + destination, + ) + + // Wait for tx to be accepted and verify events emitted + if expectSuccess { + return SendTransactionAndWaitForSuccess(ctx, destination, signedPredicateTx) + } + return SendTransactionAndWaitForFailure(ctx, destination, signedPredicateTx) +} + +func InitOffChainMessageChainConfigValidatorSetSig( + networkID uint32, + subnet interfaces.SubnetTestInfo, + validatorSetSigAddress common.Address, + validatorSetSigMessages []validatorsetsig.ValidatorSetSigMessage, +) ([]avalancheWarp.UnsignedMessage, string) { + unsignedMessages := []avalancheWarp.UnsignedMessage{} + for _, message := range validatorSetSigMessages { + unsignedMessage := CreateOffChainValidatorSetSigMessage(networkID, subnet, message) + unsignedMessages = append(unsignedMessages, *unsignedMessage) + log.Info("Adding validatorSetSig off-chain message to Warp chain config", + "messageID", unsignedMessage.ID(), + "blockchainID", subnet.BlockchainID.String()) + } + return unsignedMessages, GetChainConfigWithOffChainMessages(unsignedMessages) +} + +// Creates an off-chain Warp message pointing to a function, contract and payload to be executed +// if the validator set signs this message +func CreateOffChainValidatorSetSigMessage( + networkID uint32, + subnet interfaces.SubnetTestInfo, + message validatorsetsig.ValidatorSetSigMessage, +) *avalancheWarp.UnsignedMessage { + sourceAddress := []byte{} + payloadBytes, err := message.Pack() + Expect(err).Should(BeNil()) + + addressedPayload, err := payload.NewAddressedCall(sourceAddress, payloadBytes) + Expect(err).Should(BeNil()) + + unsignedMessage, err := avalancheWarp.NewUnsignedMessage( + networkID, + subnet.BlockchainID, + addressedPayload.Bytes(), + ) + Expect(err).Should(BeNil()) + + return unsignedMessage +} diff --git a/tests/utils/staking_utils.go b/tests/utils/staking_utils.go new file mode 100644 index 000000000..443952210 --- /dev/null +++ b/tests/utils/staking_utils.go @@ -0,0 +1,65 @@ +package utils + +import ( + "context" + "crypto/ecdsa" + "math/big" + "time" + + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" + "github.com/ava-labs/teleporter/tests/interfaces" + "github.com/ethereum/go-ethereum/common" + . "github.com/onsi/gomega" +) + +func DeployNativeTokenStakingManager( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, +) (common.Address, *nativetokenstakingmanager.NativeTokenStakingManager) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + address, tx, stakingManager, err := nativetokenstakingmanager.DeployNativeTokenStakingManager( + opts, + subnet.RPCClient, + 0, // ICMInitializable.Allowed + ) + Expect(err).Should(BeNil()) + + // Wait for the transaction to be mined + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + + return address, stakingManager +} + +func DeployAndInitializeNativeTokenStakingManager( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, +) (common.Address, *nativetokenstakingmanager.NativeTokenStakingManager) { + stakingManagerContractAddress, stakingManager := DeployNativeTokenStakingManager( + ctx, + senderKey, + subnet, + ) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := stakingManager.Initialize( + opts, + nativetokenstakingmanager.StakingManagerSettings{ + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnet.SubnetID, + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: uint64(24 * time.Hour), + MaximumHourlyChurn: 0, + RewardCalculator: common.Address{}, + }, + ) + Expect(err).Should(BeNil()) + WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + + return stakingManagerContractAddress, stakingManager +} diff --git a/tests/utils/utils.go b/tests/utils/teleporter_utils.go similarity index 51% rename from tests/utils/utils.go rename to tests/utils/teleporter_utils.go index 73948666f..e8d9e9161 100644 --- a/tests/utils/utils.go +++ b/tests/utils/teleporter_utils.go @@ -1,62 +1,112 @@ -// Copyright (C) 2023, Ava Labs, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - package utils import ( "bytes" "context" "crypto/ecdsa" - "encoding/json" - "errors" - "fmt" "math/big" - "os" - "strconv" - "strings" - "time" - - validatorsetsig "github.com/ava-labs/teleporter/abi-bindings/go/governance/ValidatorSetSig" - exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" - nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" - teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" - teleporterregistry "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/registry/TeleporterRegistry" - testmessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/tests/TestMessenger" - deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" - gasUtils "github.com/ava-labs/teleporter/utils/gas-utils" "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/constants" avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" - "github.com/ava-labs/subnet-evm/eth/tracers" - "github.com/ava-labs/subnet-evm/ethclient" - subnetEvmInterfaces "github.com/ava-labs/subnet-evm/interfaces" "github.com/ava-labs/subnet-evm/precompile/contracts/warp" predicateutils "github.com/ava-labs/subnet-evm/predicate" + validatorsetsig "github.com/ava-labs/teleporter/abi-bindings/go/governance/ValidatorSetSig" + exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" + teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" + teleporterregistry "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/registry/TeleporterRegistry" + testmessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/tests/TestMessenger" "github.com/ava-labs/teleporter/tests/interfaces" + deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" + gasUtils "github.com/ava-labs/teleporter/utils/gas-utils" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" . "github.com/onsi/gomega" ) var ( - NativeTransferGas uint64 = 21_000 - DefaultTeleporterTransactionGas uint64 = 300_000 - DefaultTeleporterTransactionValue = common.Big0 - ExpectedExampleERC20DeployerBalance = new(big.Int).Mul(big.NewInt(1e18), big.NewInt(1e10)) + DefaultTeleporterTransactionGas uint64 = 300_000 + DefaultTeleporterTransactionValue = common.Big0 ) -const ( - CChainPathSpecifier = "C" -) +// +// Deployment utils +// + +// Deploys a new version of Teleporter and returns its address +// Does NOT modify the global Teleporter contract address to provide greater testing flexibility. +func DeployNewTeleporterVersion( + ctx context.Context, + network interfaces.LocalNetwork, + fundedKey *ecdsa.PrivateKey, + teleporterByteCodeFile string, +) common.Address { + contractCreationGasPrice := (&big.Int{}).Add(deploymentUtils.GetDefaultContractCreationGasPrice(), big.NewInt(1)) + teleporterDeployerTransaction, + _, + teleporterDeployerAddress, + teleporterContractAddress, + err := deploymentUtils.ConstructKeylessTransaction( + teleporterByteCodeFile, + false, + contractCreationGasPrice, + ) + Expect(err).Should(BeNil()) + + network.DeployTeleporterContractToAllChains( + teleporterDeployerTransaction, + teleporterDeployerAddress, + teleporterContractAddress, + fundedKey, + ) + return teleporterContractAddress +} + +func DeployTestMessenger( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + teleporterManager common.Address, + subnet interfaces.SubnetTestInfo, +) (common.Address, *testmessenger.TestMessenger) { + opts, err := bind.NewKeyedTransactorWithChainID( + senderKey, + subnet.EVMChainID, + ) + Expect(err).Should(BeNil()) + address, tx, exampleMessenger, err := testmessenger.DeployTestMessenger( + opts, + subnet.RPCClient, + subnet.TeleporterRegistryAddress, + teleporterManager, + ) + Expect(err).Should(BeNil()) + + // Wait for the transaction to be mined + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + + return address, exampleMessenger +} + +// +// Parsing utils +// + +func ParseTeleporterMessage(unsignedMessage avalancheWarp.UnsignedMessage) *teleportermessenger.TeleporterMessage { + addressedPayload, err := payload.ParseAddressedCall(unsignedMessage.Payload) + Expect(err).Should(BeNil()) + + teleporterMessage := teleportermessenger.TeleporterMessage{} + err = teleporterMessage.Unpack(addressedPayload.Payload) + Expect(err).Should(BeNil()) + + return &teleporterMessage +} // -// Test utility functions +// Function call utils // func SendAddFeeAmountAndWaitForAcceptance( @@ -191,183 +241,6 @@ func SendSpecifiedReceiptsAndWaitForAcceptance( return receipt, event.MessageID } -func HttpToWebsocketURI(uri string, blockchainID string) string { - return fmt.Sprintf("ws://%s/ext/bc/%s/ws", strings.TrimPrefix(uri, "http://"), blockchainID) -} - -func HttpToRPCURI(uri string, blockchainID string) string { - return fmt.Sprintf("http://%s/ext/bc/%s/rpc", strings.TrimPrefix(uri, "http://"), blockchainID) -} - -// Get the host and port from a URI. The URI should be in the format http://host:port or https://host:port -func GetURIHostAndPort(uri string) (string, uint32, error) { - // At a minimum uri should have http:// of 7 characters - Expect(len(uri)).Should(BeNumerically(">", 7)) - if uri[:7] == "http://" { - uri = uri[7:] - } else if uri[:8] == "https://" { - uri = uri[8:] - } else { - return "", 0, fmt.Errorf("invalid uri: %s", uri) - } - - // Split the uri into host and port - hostAndPort := strings.Split(uri, ":") - Expect(len(hostAndPort)).Should(Equal(2)) - - // Parse the port - port, err := strconv.ParseUint(hostAndPort[1], 10, 32) - if err != nil { - return "", 0, fmt.Errorf("failed to parse port: %w", err) - } - - return hostAndPort[0], uint32(port), nil -} - -// -// Transaction creation functions -// - -// Constructs a transaction to call sendCrossChainMessage -// Returns the signed transaction. -func CreateSendCrossChainMessageTransaction( - ctx context.Context, - source interfaces.SubnetTestInfo, - input teleportermessenger.TeleporterMessageInput, - senderKey *ecdsa.PrivateKey, - teleporterContractAddress common.Address, -) *types.Transaction { - data, err := teleportermessenger.PackSendCrossChainMessage(input) - Expect(err).Should(BeNil()) - - gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, source, PrivateKeyToAddress(senderKey)) - - // Send a transaction to the Teleporter contract - tx := types.NewTx(&types.DynamicFeeTx{ - ChainID: source.EVMChainID, - Nonce: nonce, - To: &teleporterContractAddress, - Gas: DefaultTeleporterTransactionGas, - GasFeeCap: gasFeeCap, - GasTipCap: gasTipCap, - Value: DefaultTeleporterTransactionValue, - Data: data, - }) - - return SignTransaction(tx, senderKey, source.EVMChainID) -} - -// Constructs a transaction to call receiveCrossChainMessage -// Returns the signed transaction. -func CreateReceiveCrossChainMessageTransaction( - ctx context.Context, - signedMessage *avalancheWarp.Message, - requiredGasLimit *big.Int, - teleporterContractAddress common.Address, - senderKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, -) *types.Transaction { - // Construct the transaction to send the Warp message to the destination chain - log.Info("Constructing receiveCrossChainMessage transaction for the destination chain") - numSigners, err := signedMessage.Signature.NumSigners() - Expect(err).Should(BeNil()) - - teleporterMessage := ParseTeleporterMessage(signedMessage.UnsignedMessage) - gasLimit, err := gasUtils.CalculateReceiveMessageGasLimit( - numSigners, - requiredGasLimit, - len(signedMessage.Bytes()), - len(signedMessage.Payload), - len(teleporterMessage.Receipts), - ) - Expect(err).Should(BeNil()) - - callData, err := teleportermessenger.PackReceiveCrossChainMessage(0, PrivateKeyToAddress(senderKey)) - Expect(err).Should(BeNil()) - - gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnetInfo, PrivateKeyToAddress(senderKey)) - - destinationTx := predicateutils.NewPredicateTx( - subnetInfo.EVMChainID, - nonce, - &teleporterContractAddress, - gasLimit, - gasFeeCap, - gasTipCap, - big.NewInt(0), - callData, - types.AccessList{}, - warp.ContractAddress, - signedMessage.Bytes(), - ) - - return SignTransaction(destinationTx, senderKey, subnetInfo.EVMChainID) -} - -// Constructs a transaction to call addProtocolVersion -// Returns the signed transaction. -func CreateAddProtocolVersionTransaction( - ctx context.Context, - signedMessage *avalancheWarp.Message, - teleporterRegistryAddress common.Address, - senderKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, -) *types.Transaction { - // Construct the transaction to send the Warp message to the destination chain - log.Info("Constructing addProtocolVersion transaction for the destination chain") - - callData, err := teleporterregistry.PackAddProtocolVersion(0) - Expect(err).Should(BeNil()) - - gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnetInfo, PrivateKeyToAddress(senderKey)) - - destinationTx := predicateutils.NewPredicateTx( - subnetInfo.EVMChainID, - nonce, - &teleporterRegistryAddress, - 500_000, - gasFeeCap, - gasTipCap, - big.NewInt(0), - callData, - types.AccessList{}, - warp.ContractAddress, - signedMessage.Bytes(), - ) - - return SignTransaction(destinationTx, senderKey, subnetInfo.EVMChainID) -} - -func CreateExecuteCallPredicateTransaction( - ctx context.Context, - signedMessage *avalancheWarp.Message, - validatorSetSigAddress common.Address, - senderKey *ecdsa.PrivateKey, - subnetInfo interfaces.SubnetTestInfo, -) *types.Transaction { - log.Info("Constructing executeCall transaction for the destination chain") - - callData, err := validatorsetsig.PackExecuteCall(0) - Expect(err).Should(BeNil()) - - gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnetInfo, PrivateKeyToAddress(senderKey)) - - destinationTx := predicateutils.NewPredicateTx( - subnetInfo.EVMChainID, - nonce, - &validatorSetSigAddress, - 500_000, - gasFeeCap, - gasTipCap, - big.NewInt(0), - callData, - types.AccessList{}, - warp.ContractAddress, - signedMessage.Bytes(), - ) - return SignTransaction(destinationTx, senderKey, subnetInfo.EVMChainID) -} - func AddProtocolVersionAndWaitForAcceptance( ctx context.Context, network interfaces.Network, @@ -405,113 +278,15 @@ func AddProtocolVersionAndWaitForAcceptance( Expect(versionUpdatedEvent.NewVersion.Cmp(expectedLatestVersion)).Should(Equal(0)) } -// Returns Receipt for the transaction unlike TeleporterRegistry version since this is a non-teleporter case -// and we don't want to add the ValidatorSetSig ABI to the subnetInfo -func ExecuteValidatorSetSigCallAndVerify( +func SendCrossChainMessageAndWaitForAcceptance( ctx context.Context, - network interfaces.Network, source interfaces.SubnetTestInfo, destination interfaces.SubnetTestInfo, - validatorSetSigAddress common.Address, + input teleportermessenger.TeleporterMessageInput, senderKey *ecdsa.PrivateKey, - unsignedMessage *avalancheWarp.UnsignedMessage, - expectSuccess bool, -) *types.Receipt { - signedWarpMsg := network.GetSignedMessage(ctx, source, destination, unsignedMessage.ID()) - log.Info("Got signed warp message", "messageID", signedWarpMsg.ID()) - - signedPredicateTx := CreateExecuteCallPredicateTransaction( - ctx, - signedWarpMsg, - validatorSetSigAddress, - senderKey, - destination, - ) - - // Wait for tx to be accepted and verify events emitted - if expectSuccess { - return SendTransactionAndWaitForSuccess(ctx, destination, signedPredicateTx) - } - return SendTransactionAndWaitForFailure(ctx, destination, signedPredicateTx) -} - -func CreateNativeTransferTransaction( - ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, - fromKey *ecdsa.PrivateKey, - recipient common.Address, - amount *big.Int, -) *types.Transaction { - fromAddress := crypto.PubkeyToAddress(fromKey.PublicKey) - gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnetInfo, fromAddress) - - tx := types.NewTx(&types.DynamicFeeTx{ - ChainID: subnetInfo.EVMChainID, - Nonce: nonce, - To: &recipient, - Gas: NativeTransferGas, - GasFeeCap: gasFeeCap, - GasTipCap: gasTipCap, - Value: amount, - }) - - return SignTransaction(tx, fromKey, subnetInfo.EVMChainID) -} - -func SendNativeTransfer( - ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, - fromKey *ecdsa.PrivateKey, - recipient common.Address, - amount *big.Int, -) *types.Receipt { - tx := CreateNativeTransferTransaction(ctx, subnetInfo, fromKey, recipient, amount) - return SendTransactionAndWaitForSuccess(ctx, subnetInfo, tx) -} - -// Sends a tx, and waits for it to be mined. -// Asserts Receipt.status equals success. -func sendAndWaitForTransaction( - ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, - tx *types.Transaction, - success bool, -) *types.Receipt { - err := subnetInfo.RPCClient.SendTransaction(ctx, tx) - Expect(err).Should(BeNil()) - - return waitForTransaction(ctx, subnetInfo, tx.Hash(), success) -} - -// Sends a tx, and waits for it to be mined. -// Asserts Receipt.status equals false. -func SendTransactionAndWaitForFailure( - ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, - tx *types.Transaction, -) *types.Receipt { - return sendAndWaitForTransaction(ctx, subnetInfo, tx, false) -} - -// Sends a tx, and waits for it to be mined. -// Asserts Receipt.status equals true. -func SendTransactionAndWaitForSuccess( - ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, - tx *types.Transaction, -) *types.Receipt { - return sendAndWaitForTransaction(ctx, subnetInfo, tx, true) -} - -func SendCrossChainMessageAndWaitForAcceptance( - ctx context.Context, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, - input teleportermessenger.TeleporterMessageInput, - senderKey *ecdsa.PrivateKey, -) (*types.Receipt, ids.ID) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, source.EVMChainID) - Expect(err).Should(BeNil()) +) (*types.Receipt, ids.ID) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, source.EVMChainID) + Expect(err).Should(BeNil()) // Send a transaction to the Teleporter contract tx, err := source.TeleporterMessenger.SendCrossChainMessage(opts, input) @@ -532,167 +307,6 @@ func SendCrossChainMessageAndWaitForAcceptance( return receipt, event.MessageID } -// Waits for a transaction to be mined. -// Asserts Receipt.status equals true. -func WaitForTransactionSuccess( - ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, - txHash common.Hash, -) *types.Receipt { - return waitForTransaction(ctx, subnetInfo, txHash, true) -} - -// Waits for a transaction to be mined. -// Asserts Receipt.status equals false. -func WaitForTransactionFailure( - ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, - txHash common.Hash, -) *types.Receipt { - return waitForTransaction(ctx, subnetInfo, txHash, false) -} - -// Waits for a transaction to be mined. -// Asserts Receipt.status equals success. -func waitForTransaction( - ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, - txHash common.Hash, - success bool, -) *types.Receipt { - cctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - - receipt, err := WaitMined(cctx, subnetInfo.RPCClient, txHash) - Expect(err).Should(BeNil()) - - if success { - if receipt.Status == types.ReceiptStatusFailed { - TraceTransactionAndExit(ctx, subnetInfo.RPCClient, receipt.TxHash) - } - } else { - Expect(receipt.Status).Should(Equal(types.ReceiptStatusFailed)) - } - return receipt -} - -// Polls for a transaction receipt of the given txHash on each queryTicker tick until -// either a transaction receipt returned, or the context is cancelled or expired. -func waitForTransactionReceipt( - cctx context.Context, - rpcClient ethclient.Client, - txHash common.Hash, -) (*types.Receipt, error) { - queryTicker := time.NewTicker(200 * time.Millisecond) - defer queryTicker.Stop() - for { - receipt, err := rpcClient.TransactionReceipt(cctx, txHash) - if err == nil { - return receipt, nil - } - - if errors.Is(err, subnetEvmInterfaces.NotFound) { - log.Debug("Transaction not yet mined") - } else { - log.Error("Receipt retrieval failed", "err", err) - return nil, err - } - - // Wait for the next round. - select { - case <-cctx.Done(): - return nil, cctx.Err() - case <-queryTicker.C: - } - } -} - -// Polls for the eth_blockNumber endpoint for the latest blockheight on each queryTicker tick until -// either the returned height is greater than or equal to the expectedBlockNumber, or the context -// is cancelled or expired. -func waitForBlockHeight( - cctx context.Context, - rpcClient ethclient.Client, - expectedBlockNumber uint64, -) error { - queryTicker := time.NewTicker(2 * time.Second) - defer queryTicker.Stop() - for { - currentBlockNumber, err := rpcClient.BlockNumber(cctx) - if err != nil { - return err - } - - if currentBlockNumber >= expectedBlockNumber { - return nil - } else { - log.Info("Waiting for block height where transaction was included", - "blockNumber", expectedBlockNumber) - } - - // Wait for the next round. - select { - case <-cctx.Done(): - return cctx.Err() - case <-queryTicker.C: - } - } -} - -// WaitMined waits for tx to be mined on the blockchain. -// It stops waiting when the context is canceled. -// Takes a tx hash instead of the full tx in the subnet-evm version of this function. -// Copied and modified from https://github.com/ava-labs/subnet-evm/blob/v0.6.0-fuji/accounts/abi/bind/util.go#L42 -func WaitMined(ctx context.Context, rpcClient ethclient.Client, txHash common.Hash) (*types.Receipt, error) { - cctx, cancel := context.WithTimeout(ctx, 20*time.Second) - defer cancel() - - receipt, err := waitForTransactionReceipt(cctx, rpcClient, txHash) - if err != nil { - return nil, err - } - - // Check that the block height endpoint returns a block height as high as the block number that the transaction was - // included in. This is to workaround the issue where multiple nodes behind a public RPC endpoint see - // transactions/blocks at different points in time. Ideally, all nodes in the network should have seen this block - // and transaction before returning from WaitMined. The block height endpoint of public RPC endpoints is - // configured to return the lowest value currently returned by any node behind the load balancer, so waiting for - // it to be at least as high as the block height specified in the receipt should provide a relatively strong - // indication that the transaction has been seen widely throughout the network. - err = waitForBlockHeight(cctx, rpcClient, receipt.BlockNumber.Uint64()) - if err != nil { - return nil, err - } - - return receipt, nil -} - -// Returns the first log in 'logs' that is successfully parsed by 'parser' -// Errors and prints a trace of the transaction if no log is found. -func GetEventFromLogsOrTrace[T any]( - ctx context.Context, - receipt *types.Receipt, - subnetInfo interfaces.SubnetTestInfo, - parser func(log types.Log) (T, error), -) T { - log, err := GetEventFromLogs(receipt.Logs, parser) - if err != nil { - TraceTransactionAndExit(ctx, subnetInfo.RPCClient, receipt.TxHash) - } - return log -} - -// Returns the first log in 'logs' that is successfully parsed by 'parser' -func GetEventFromLogs[T any](logs []*types.Log, parser func(log types.Log) (T, error)) (T, error) { - for _, log := range logs { - event, err := parser(*log) - if err == nil { - return event, nil - } - } - return *new(T), fmt.Errorf("failed to find %T event in receipt logs", *new(T)) -} - // Returns true if the transaction receipt contains a ReceiptReceived log with the specified messageID func CheckReceiptReceived( receipt *types.Receipt, @@ -752,194 +366,6 @@ func GetOutstandingReceiptCount(source interfaces.SubnetTestInfo, destinationBlo return size } -// Signs a transaction using the provided key for the specified chainID -func SignTransaction(tx *types.Transaction, key *ecdsa.PrivateKey, chainID *big.Int) *types.Transaction { - txSigner := types.LatestSignerForChainID(chainID) - signedTx, err := types.SignTx(tx, txSigner, key) - Expect(err).Should(BeNil()) - - return signedTx -} - -// Returns the gasFeeCap, gasTipCap, and nonce the be used when constructing a transaction from fundedAddress -func CalculateTxParams( - ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, - fundedAddress common.Address, -) (*big.Int, *big.Int, uint64) { - baseFee, err := subnetInfo.RPCClient.EstimateBaseFee(ctx) - Expect(err).Should(BeNil()) - - gasTipCap, err := subnetInfo.RPCClient.SuggestGasTipCap(ctx) - Expect(err).Should(BeNil()) - - nonce, err := subnetInfo.RPCClient.NonceAt(ctx, fundedAddress, nil) - Expect(err).Should(BeNil()) - - gasFeeCap := baseFee.Mul(baseFee, big.NewInt(gasUtils.BaseFeeFactor)) - gasFeeCap.Add(gasFeeCap, big.NewInt(gasUtils.MaxPriorityFeePerGas)) - - return gasFeeCap, gasTipCap, nonce -} - -func PrivateKeyToAddress(k *ecdsa.PrivateKey) common.Address { - return crypto.PubkeyToAddress(k.PublicKey) -} - -// Throws a Gomega error if there is a mismatch -func CheckBalance(ctx context.Context, addr common.Address, expectedBalance *big.Int, rpcClient ethclient.Client) { - bal, err := rpcClient.BalanceAt(ctx, addr, nil) - Expect(err).Should(BeNil()) - ExpectBigEqual(bal, expectedBalance) -} - -// Gomega will print the transaction trace and exit -func TraceTransactionAndExit(ctx context.Context, rpcClient ethclient.Client, txHash common.Hash) { - Expect(TraceTransaction(ctx, rpcClient, txHash)).Should(Equal("")) -} - -func TraceTransaction(ctx context.Context, rpcClient ethclient.Client, txHash common.Hash) string { - var result interface{} - ct := "callTracer" - err := rpcClient.Client().Call(&result, "debug_traceTransaction", txHash.String(), tracers.TraceConfig{Tracer: &ct}) - Expect(err).Should(BeNil()) - - jsonStr, err := json.Marshal(result) - Expect(err).Should(BeNil()) - - return string(jsonStr) -} - -func ExpectBigEqual(v1 *big.Int, v2 *big.Int) { - // Compare strings, so gomega will print the numbers if they differ - Expect(v1.String()).Should(Equal(v2.String())) -} - -func BigIntSub(v1 *big.Int, v2 *big.Int) *big.Int { - return big.NewInt(0).Sub(v1, v2) -} - -func BigIntMul(v1 *big.Int, v2 *big.Int) *big.Int { - return big.NewInt(0).Mul(v1, v2) -} - -func ERC20Approve( - ctx context.Context, - token *exampleerc20.ExampleERC20, - spender common.Address, - amount *big.Int, - source interfaces.SubnetTestInfo, - senderKey *ecdsa.PrivateKey, -) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, source.EVMChainID) - Expect(err).Should(BeNil()) - tx, err := token.Approve(opts, spender, amount) - Expect(err).Should(BeNil()) - log.Info("Approved ERC20", "spender", spender.Hex(), "txHash", tx.Hash().Hex()) - - WaitForTransactionSuccess(ctx, source, tx.Hash()) -} - -func DeployExampleERC20( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - source interfaces.SubnetTestInfo, -) (common.Address, *exampleerc20.ExampleERC20) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, source.EVMChainID) - Expect(err).Should(BeNil()) - - // Deploy Mock ERC20 contract - address, tx, token, err := exampleerc20.DeployExampleERC20(opts, source.RPCClient) - Expect(err).Should(BeNil()) - log.Info("Deployed Mock ERC20 contract", "address", address.Hex(), "txHash", tx.Hash().Hex()) - - // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, source, tx.Hash()) - - // Check that the deployer has the expected initial balance - senderAddress := crypto.PubkeyToAddress(senderKey.PublicKey) - balance, err := token.BalanceOf(&bind.CallOpts{}, senderAddress) - Expect(err).Should(BeNil()) - Expect(balance).Should(Equal(ExpectedExampleERC20DeployerBalance)) - - return address, token -} - -func DeployTestMessenger( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - teleporterManager common.Address, - subnet interfaces.SubnetTestInfo, -) (common.Address, *testmessenger.TestMessenger) { - opts, err := bind.NewKeyedTransactorWithChainID( - senderKey, - subnet.EVMChainID, - ) - Expect(err).Should(BeNil()) - address, tx, exampleMessenger, err := testmessenger.DeployTestMessenger( - opts, - subnet.RPCClient, - subnet.TeleporterRegistryAddress, - teleporterManager, - ) - Expect(err).Should(BeNil()) - - // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) - - return address, exampleMessenger -} - -func DeployValidatorSetSig( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - contractSubnet interfaces.SubnetTestInfo, - validatorSubnet interfaces.SubnetTestInfo, -) (common.Address, *validatorsetsig.ValidatorSetSig) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, contractSubnet.EVMChainID) - Expect(err).Should(BeNil()) - address, tx, validatorSetSig, err := validatorsetsig.DeployValidatorSetSig( - opts, - contractSubnet.RPCClient, - validatorSubnet.BlockchainID, - ) - Expect(err).Should(BeNil()) - - // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, contractSubnet, tx.Hash()) - - return address, validatorSetSig -} - -func DeployNativeTokenStakingManager( - ctx context.Context, - senderKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, -) (common.Address, *nativetokenstakingmanager.NativeTokenStakingManager) { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) - Expect(err).Should(BeNil()) - address, tx, stakingManager, err := nativetokenstakingmanager.DeployNativeTokenStakingManager( - opts, - subnet.RPCClient, - 0, // ICMInitializable.Allowed - ) - Expect(err).Should(BeNil()) - - // Wait for the transaction to be mined - WaitForTransactionSuccess(ctx, subnet, tx.Hash()) - - return address, stakingManager -} - -func GetTwoSubnets(network interfaces.Network) ( - interfaces.SubnetTestInfo, - interfaces.SubnetTestInfo, -) { - subnets := network.GetSubnetsInfo() - Expect(len(subnets)).Should(BeNumerically(">=", 2)) - return subnets[0], subnets[1] -} - func SendExampleCrossChainMessageAndVerify( ctx context.Context, network interfaces.Network, @@ -1016,6 +442,154 @@ func SendExampleCrossChainMessageAndVerify( } } +// +// Transaction utils +// + +// Constructs a transaction to call sendCrossChainMessage +// Returns the signed transaction. +func CreateSendCrossChainMessageTransaction( + ctx context.Context, + source interfaces.SubnetTestInfo, + input teleportermessenger.TeleporterMessageInput, + senderKey *ecdsa.PrivateKey, + teleporterContractAddress common.Address, +) *types.Transaction { + data, err := teleportermessenger.PackSendCrossChainMessage(input) + Expect(err).Should(BeNil()) + + gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, source, PrivateKeyToAddress(senderKey)) + + // Send a transaction to the Teleporter contract + tx := types.NewTx(&types.DynamicFeeTx{ + ChainID: source.EVMChainID, + Nonce: nonce, + To: &teleporterContractAddress, + Gas: DefaultTeleporterTransactionGas, + GasFeeCap: gasFeeCap, + GasTipCap: gasTipCap, + Value: DefaultTeleporterTransactionValue, + Data: data, + }) + + return SignTransaction(tx, senderKey, source.EVMChainID) +} + +// Constructs a transaction to call receiveCrossChainMessage +// Returns the signed transaction. +func CreateReceiveCrossChainMessageTransaction( + ctx context.Context, + signedMessage *avalancheWarp.Message, + requiredGasLimit *big.Int, + teleporterContractAddress common.Address, + senderKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, +) *types.Transaction { + // Construct the transaction to send the Warp message to the destination chain + log.Info("Constructing receiveCrossChainMessage transaction for the destination chain") + numSigners, err := signedMessage.Signature.NumSigners() + Expect(err).Should(BeNil()) + + teleporterMessage := ParseTeleporterMessage(signedMessage.UnsignedMessage) + gasLimit, err := gasUtils.CalculateReceiveMessageGasLimit( + numSigners, + requiredGasLimit, + len(signedMessage.Bytes()), + len(signedMessage.Payload), + len(teleporterMessage.Receipts), + ) + Expect(err).Should(BeNil()) + + callData, err := teleportermessenger.PackReceiveCrossChainMessage(0, PrivateKeyToAddress(senderKey)) + Expect(err).Should(BeNil()) + + gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnetInfo, PrivateKeyToAddress(senderKey)) + + destinationTx := predicateutils.NewPredicateTx( + subnetInfo.EVMChainID, + nonce, + &teleporterContractAddress, + gasLimit, + gasFeeCap, + gasTipCap, + big.NewInt(0), + callData, + types.AccessList{}, + warp.ContractAddress, + signedMessage.Bytes(), + ) + + return SignTransaction(destinationTx, senderKey, subnetInfo.EVMChainID) +} + +// Constructs a transaction to call addProtocolVersion +// Returns the signed transaction. +func CreateAddProtocolVersionTransaction( + ctx context.Context, + signedMessage *avalancheWarp.Message, + teleporterRegistryAddress common.Address, + senderKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, +) *types.Transaction { + // Construct the transaction to send the Warp message to the destination chain + log.Info("Constructing addProtocolVersion transaction for the destination chain") + + callData, err := teleporterregistry.PackAddProtocolVersion(0) + Expect(err).Should(BeNil()) + + gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnetInfo, PrivateKeyToAddress(senderKey)) + + destinationTx := predicateutils.NewPredicateTx( + subnetInfo.EVMChainID, + nonce, + &teleporterRegistryAddress, + 500_000, + gasFeeCap, + gasTipCap, + big.NewInt(0), + callData, + types.AccessList{}, + warp.ContractAddress, + signedMessage.Bytes(), + ) + + return SignTransaction(destinationTx, senderKey, subnetInfo.EVMChainID) +} + +func CreateExecuteCallPredicateTransaction( + ctx context.Context, + signedMessage *avalancheWarp.Message, + validatorSetSigAddress common.Address, + senderKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, +) *types.Transaction { + log.Info("Constructing executeCall transaction for the destination chain") + + callData, err := validatorsetsig.PackExecuteCall(0) + Expect(err).Should(BeNil()) + + gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnetInfo, PrivateKeyToAddress(senderKey)) + + destinationTx := predicateutils.NewPredicateTx( + subnetInfo.EVMChainID, + nonce, + &validatorSetSigAddress, + 500_000, + gasFeeCap, + gasTipCap, + big.NewInt(0), + callData, + types.AccessList{}, + warp.ContractAddress, + signedMessage.Bytes(), + ) + return SignTransaction(destinationTx, senderKey, subnetInfo.EVMChainID) +} + +// +// Off-chain message utils +// + // Creates an Warp message that registers a Teleporter protocol version with TeleporterRegistry. // Returns the Warp message, as well as the chain config adding the message to the list of approved // off-chain Warp messages @@ -1059,172 +633,3 @@ func CreateOffChainRegistryMessage( return unsignedMessage } - -func InitOffChainMessageChainConfigValidatorSetSig( - networkID uint32, - subnet interfaces.SubnetTestInfo, - validatorSetSigAddress common.Address, - validatorSetSigMessages []validatorsetsig.ValidatorSetSigMessage, -) ([]avalancheWarp.UnsignedMessage, string) { - unsignedMessages := []avalancheWarp.UnsignedMessage{} - for _, message := range validatorSetSigMessages { - unsignedMessage := CreateOffChainValidatorSetSigMessage(networkID, subnet, message) - unsignedMessages = append(unsignedMessages, *unsignedMessage) - log.Info("Adding validatorSetSig off-chain message to Warp chain config", - "messageID", unsignedMessage.ID(), - "blockchainID", subnet.BlockchainID.String()) - } - return unsignedMessages, GetChainConfigWithOffChainMessages(unsignedMessages) -} - -// Creates an off-chain Warp message pointing to a function, contract and payload to be executed -// if the validator set signs this message -func CreateOffChainValidatorSetSigMessage( - networkID uint32, - subnet interfaces.SubnetTestInfo, - message validatorsetsig.ValidatorSetSigMessage, -) *avalancheWarp.UnsignedMessage { - sourceAddress := []byte{} - payloadBytes, err := message.Pack() - Expect(err).Should(BeNil()) - - addressedPayload, err := payload.NewAddressedCall(sourceAddress, payloadBytes) - Expect(err).Should(BeNil()) - - unsignedMessage, err := avalancheWarp.NewUnsignedMessage( - networkID, - subnet.BlockchainID, - addressedPayload.Bytes(), - ) - Expect(err).Should(BeNil()) - - return unsignedMessage -} - -// Deploys a new version of Teleporter and returns its address -// Does NOT modify the global Teleporter contract address to provide greater testing flexibility. -func DeployNewTeleporterVersion( - ctx context.Context, - network interfaces.LocalNetwork, - fundedKey *ecdsa.PrivateKey, - teleporterByteCodeFile string, -) common.Address { - contractCreationGasPrice := (&big.Int{}).Add(deploymentUtils.GetDefaultContractCreationGasPrice(), big.NewInt(1)) - teleporterDeployerTransaction, - _, - teleporterDeployerAddress, - teleporterContractAddress, - err := deploymentUtils.ConstructKeylessTransaction( - teleporterByteCodeFile, - false, - contractCreationGasPrice, - ) - Expect(err).Should(BeNil()) - - network.DeployTeleporterContractToAllChains( - teleporterDeployerTransaction, - teleporterDeployerAddress, - teleporterContractAddress, - fundedKey, - ) - return teleporterContractAddress -} - -type ChainConfigMap map[string]string - -// Sets the chain config in customChainConfigs for the specified subnet -func (m ChainConfigMap) Add(subnet interfaces.SubnetTestInfo, chainConfig string) { - if subnet.SubnetID == constants.PrimaryNetworkID { - m[CChainPathSpecifier] = chainConfig - } else { - m[subnet.BlockchainID.String()] = chainConfig - } -} - -func ParseTeleporterMessage(unsignedMessage avalancheWarp.UnsignedMessage) *teleportermessenger.TeleporterMessage { - addressedPayload, err := payload.ParseAddressedCall(unsignedMessage.Payload) - Expect(err).Should(BeNil()) - - teleporterMessage := teleportermessenger.TeleporterMessage{} - err = teleporterMessage.Unpack(addressedPayload.Payload) - Expect(err).Should(BeNil()) - - return &teleporterMessage -} - -func GetChainConfigWithOffChainMessages(offChainMessages []avalancheWarp.UnsignedMessage) string { - // Convert messages to hex - hexOffChainMessages := []string{} - for _, message := range offChainMessages { - hexOffChainMessages = append(hexOffChainMessages, hexutil.Encode(message.Bytes())) - } - - // Create a map to represent the JSON structure - jsonMap := map[string]interface{}{ - "warp-api-enabled": true, - "warp-off-chain-messages": hexOffChainMessages, - "log-level": "debug", - "eth-apis": []string{ - "eth", "eth-filter", "net", "admin", "web3", - "internal-eth", "internal-blockchain", "internal-transaction", - "internal-debug", "internal-account", "internal-personal", - "debug", "debug-tracer", "debug-file-tracer", "debug-handler", - }, - } - - // Marshal the map to JSON - offChainMessageJson, err := json.Marshal(jsonMap) - Expect(err).Should(BeNil()) - - return string(offChainMessageJson) -} - -// read in the template file, make the substitutions declared at the beginning -// of the function, write out the instantiation to a temp file, and then return -// the path to that temp file. -func InstantiateGenesisTemplate( - templateFileName string, - chainID uint64, - teleporterContractAddress common.Address, - teleporterDeployedBytecode string, - teleporterDeployerAddress common.Address, -) string { - substitutions := []struct { - Target string - Value string - }{ - { - "", - strconv.FormatUint(chainID, 10), - }, - { - "", - teleporterContractAddress.Hex(), - }, - { - "", - teleporterDeployedBytecode, - }, - { - "", - teleporterDeployerAddress.Hex(), - }, - } - - templateFileBytes, err := os.ReadFile(templateFileName) - Expect(err).Should(BeNil()) - - subnetGenesisFile, err := os.CreateTemp(os.TempDir(), "") - Expect(err).Should(BeNil()) - - defer subnetGenesisFile.Close() - - var replaced string = string(templateFileBytes[:]) - for _, s := range substitutions { - replaced = strings.ReplaceAll(replaced, s.Target, s.Value) - } - - subnetGenesisFile.WriteString(replaced) - - return subnetGenesisFile.Name() -} From 5c04d20d889b8faadca239b07b90752886eeff95 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 15 Aug 2024 16:24:09 -0400 Subject: [PATCH 079/545] staking contract test utils --- tests/flows/native_token_staking.go | 152 ++++++++-------------------- tests/utils/staking_utils.go | 152 ++++++++++++++++++++++++++++ 2 files changed, 194 insertions(+), 110 deletions(-) diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index fc525f404..71c6d70d0 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -2,23 +2,14 @@ package flows import ( "context" - "encoding/hex" - "math/big" - "time" "github.com/ava-labs/avalanchego/ids" - avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" + "github.com/ava-labs/avalanchego/utils/crypto/bls" warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/messages" warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" - "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" - "github.com/ava-labs/subnet-evm/precompile/contracts/warp" - predicateutils "github.com/ava-labs/subnet-evm/predicate" - nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" . "github.com/onsi/gomega" ) @@ -62,33 +53,26 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Register a validator // var validationID ids.ID // To be used in the delisting step + stakeAmount := uint64(1e18) + weight := uint64(1e6) // stakeAmount / 1e12 { // Iniatiate validator registration - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) - Expect(err).Should(BeNil()) - opts.Value = big.NewInt(0).SetUint64(1e18) nodeID := ids.GenerateTestID() - blsPublicKey := [48]byte{} - tx, err := stakingManager.InitializeValidatorRegistration( - opts, + blsPublicKey := [bls.PublicKeyLen]byte{} + var receipt *types.Receipt + receipt, validationID = utils.CallNativeInitializeValidatorRegistration( + fundedKey, + subnetAInfo, + stakeAmount, nodeID, - uint64(time.Now().Add(24*time.Hour).Unix()), - blsPublicKey[:], - ) - Expect(err).Should(BeNil()) - receipt := utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) - registrationInitiatedEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidationPeriodCreated, + blsPublicKey, + stakingManager, ) - Expect(err).Should(BeNil()) - validationID = ids.ID(registrationInitiatedEvent.ValidationID) // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - Expect(err).Should(BeNil()) - log.Info("Constructed signed RegisterSubnetValidator message", "message", signedWarpMessage) + // Validate the Warp message, (this will be done on the P-Chain in the future) msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) Expect(err).Should(BeNil()) @@ -101,51 +85,27 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) Expect(registerValidatorPayload.NodeID).Should(Equal(nodeID)) - Expect(registerValidatorPayload.Weight).Should(Equal(uint64(1e6))) + Expect(registerValidatorPayload.Weight).Should(Equal(uint64(weight))) Expect(registerValidatorPayload.SubnetID).Should(Equal(subnetAInfo.SubnetID)) Expect(registerValidatorPayload.BlsPubKey[:]).Should(Equal(blsPublicKey[:])) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - // Query P-Chain validators for the Warp message - registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, true) - Expect(err).Should(BeNil()) - registrationAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), registrationPayload.Bytes()) - Expect(err).Should(BeNil()) - registrationUnsignedMessage, err := avalancheWarp.NewUnsignedMessage(network.GetNetworkID(), pChainInfo.BlockchainID, registrationAddressedCall.Bytes()) - Expect(err).Should(BeNil()) - log.Info("Constructed unsigned SubnetValidatorRegistration message", "message", hex.EncodeToString(registrationUnsignedMessage.Bytes())) - - registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( - registrationUnsignedMessage, - nil, - subnetAInfo.SubnetID, - 67, + registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( + validationID, + true, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, ) - Expect(err).Should(BeNil()) - log.Info("Constructed signed SubnetValidatorRegistration message", "message", registrationSignedMessage) // Deliver the Warp message to the subnet - abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) - Expect(err).Should(BeNil()) - gasFeeCap, gasTipCap, nonce := utils.CalculateTxParams(context.Background(), subnetAInfo, utils.PrivateKeyToAddress(fundedKey)) - registrationTx := predicateutils.NewPredicateTx( - subnetAInfo.EVMChainID, - nonce, - &stakingManagerContractAddress, - 2_000_000, - gasFeeCap, - gasTipCap, - big.NewInt(0), - callData, - types.AccessList{}, - warp.ContractAddress, - registrationSignedMessage.Bytes(), + receipt = utils.CallCompleteValidatorRegistration( + fundedKey, + subnetAInfo, + stakingManagerContractAddress, + registrationSignedMessage, ) - signedRegistrationTx := utils.SignTransaction(registrationTx, fundedKey, subnetAInfo.EVMChainID) - receipt = utils.SendTransactionAndWaitForSuccess(context.Background(), subnetAInfo, signedRegistrationTx) - // Check that the validator is registered in the staking contract registrationEvent, err := utils.GetEventFromLogs( receipt.Logs, @@ -159,29 +119,24 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Delist the validator // { - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) - Expect(err).Should(BeNil()) - tx, err := stakingManager.InitializeEndValidation( - opts, + receipt := utils.CallInitializeEndValidation( + fundedKey, + subnetAInfo, + stakingManager, validationID, - false, - 0, ) - Expect(err).Should(BeNil()) - receipt := utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) validatorRemovalEvent, err := utils.GetEventFromLogs( receipt.Logs, stakingManager.ParseValidatorRemovalInitialized, ) Expect(err).Should(BeNil()) Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.StakeAmount.Uint64()).Should(Equal(uint64(1e6))) + Expect(validatorRemovalEvent.StakeAmount.Uint64()).Should(Equal(uint64(weight))) // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) Expect(err).Should(BeNil()) - log.Info("Constructed signed SetSubnetValidatorWeightMessage message", "message", signedWarpMessage) // Validate the Warp message, (this will be done on the P-Chain in the future) msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) Expect(err).Should(BeNil()) @@ -198,45 +153,22 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { Expect(registerValidatorPayload.Nonce).Should(Equal(uint64(0))) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - // Query P-Chain validators for the Warp message - registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, false) - Expect(err).Should(BeNil()) - registrationAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), registrationPayload.Bytes()) - Expect(err).Should(BeNil()) - registrationUnsignedMessage, err := avalancheWarp.NewUnsignedMessage(network.GetNetworkID(), pChainInfo.BlockchainID, registrationAddressedCall.Bytes()) - Expect(err).Should(BeNil()) - log.Info("Constructed unsigned SubnetValidatorRegistration message", "message", hex.EncodeToString(registrationUnsignedMessage.Bytes())) - - registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( - registrationUnsignedMessage, - nil, - subnetAInfo.SubnetID, - 67, + registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( + validationID, + false, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, ) - Expect(err).Should(BeNil()) - log.Info("Constructed signed SubnetValidatorRegistration message", "message", registrationSignedMessage) // Deliver the Warp message to the subnet - abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndValidation", uint32(0), false) - Expect(err).Should(BeNil()) - gasFeeCap, gasTipCap, nonce := utils.CalculateTxParams(context.Background(), subnetAInfo, utils.PrivateKeyToAddress(fundedKey)) - registrationTx := predicateutils.NewPredicateTx( - subnetAInfo.EVMChainID, - nonce, - &stakingManagerContractAddress, - 2_000_000, - gasFeeCap, - gasTipCap, - big.NewInt(0), - callData, - types.AccessList{}, - warp.ContractAddress, - registrationSignedMessage.Bytes(), + receipt = utils.CallCompleteEndValidation( + fundedKey, + subnetAInfo, + stakingManagerContractAddress, + registrationSignedMessage, ) - signedRegistrationTx := utils.SignTransaction(registrationTx, fundedKey, subnetAInfo.EVMChainID) - receipt = utils.SendTransactionAndWaitForSuccess(context.Background(), subnetAInfo, signedRegistrationTx) // Check that the validator is registered in the staking contract registrationEvent, err := utils.GetEventFromLogs( diff --git a/tests/utils/staking_utils.go b/tests/utils/staking_utils.go index 443952210..332121304 100644 --- a/tests/utils/staking_utils.go +++ b/tests/utils/staking_utils.go @@ -3,16 +3,32 @@ package utils import ( "context" "crypto/ecdsa" + "encoding/hex" "math/big" "time" + "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/crypto/bls" + avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" + warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/messages" + warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" + "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/precompile/contracts/warp" + predicateutils "github.com/ava-labs/subnet-evm/predicate" nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/log" + . "github.com/onsi/gomega" ) +// +// Deployment utils +// + func DeployNativeTokenStakingManager( ctx context.Context, senderKey *ecdsa.PrivateKey, @@ -63,3 +79,139 @@ func DeployAndInitializeNativeTokenStakingManager( return stakingManagerContractAddress, stakingManager } + +// +// Function call utils +// + +func CallNativeInitializeValidatorRegistration( + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakeAmount uint64, + nodeID ids.ID, + blsPublicKey [bls.PublicKeyLen]byte, + stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, +) (*types.Receipt, ids.ID) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + opts.Value = big.NewInt(0).SetUint64(stakeAmount) + + tx, err := stakingManager.InitializeValidatorRegistration( + opts, + nodeID, + uint64(time.Now().Add(24*time.Hour).Unix()), + blsPublicKey[:], + ) + Expect(err).Should(BeNil()) + receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + registrationInitiatedEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodCreated, + ) + Expect(err).Should(BeNil()) + return receipt, ids.ID(registrationInitiatedEvent.ValidationID) +} + +func CallCompleteValidatorRegistration( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakingManagerContractAddress common.Address, + registrationSignedMessage *avalancheWarp.Message, +) *types.Receipt { + abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) + Expect(err).Should(BeNil()) + gasFeeCap, gasTipCap, nonce := CalculateTxParams(context.Background(), subnet, PrivateKeyToAddress(sendingKey)) + registrationTx := predicateutils.NewPredicateTx( + subnet.EVMChainID, + nonce, + &stakingManagerContractAddress, + 2_000_000, + gasFeeCap, + gasTipCap, + big.NewInt(0), + callData, + types.AccessList{}, + warp.ContractAddress, + registrationSignedMessage.Bytes(), + ) + signedRegistrationTx := SignTransaction(registrationTx, sendingKey, subnet.EVMChainID) + return SendTransactionAndWaitForSuccess(context.Background(), subnet, signedRegistrationTx) +} + +func CallInitializeEndValidation( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, + validationID ids.ID, +) *types.Receipt { + opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := stakingManager.InitializeEndValidation( + opts, + validationID, + false, + 0, + ) + Expect(err).Should(BeNil()) + return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) +} + +func CallCompleteEndValidation( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakingManagerContractAddress common.Address, + registrationSignedMessage *avalancheWarp.Message, +) *types.Receipt { + abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("completeEndValidation", uint32(0), false) + Expect(err).Should(BeNil()) + gasFeeCap, gasTipCap, nonce := CalculateTxParams(context.Background(), subnet, PrivateKeyToAddress(sendingKey)) + registrationTx := predicateutils.NewPredicateTx( + subnet.EVMChainID, + nonce, + &stakingManagerContractAddress, + 2_000_000, + gasFeeCap, + gasTipCap, + big.NewInt(0), + callData, + types.AccessList{}, + warp.ContractAddress, + registrationSignedMessage.Bytes(), + ) + signedRegistrationTx := SignTransaction(registrationTx, sendingKey, subnet.EVMChainID) + return SendTransactionAndWaitForSuccess(context.Background(), subnet, signedRegistrationTx) +} + +// +// P-Chain utils +// + +func ConstructSubnetValidatorRegistrationMessage( + validationID ids.ID, + valid bool, + subnet interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, +) *avalancheWarp.Message { + registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, valid) + Expect(err).Should(BeNil()) + registrationAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), registrationPayload.Bytes()) + Expect(err).Should(BeNil()) + registrationUnsignedMessage, err := avalancheWarp.NewUnsignedMessage(network.GetNetworkID(), pChainInfo.BlockchainID, registrationAddressedCall.Bytes()) + Expect(err).Should(BeNil()) + log.Info("Constructed unsigned SubnetValidatorRegistration message", "message", hex.EncodeToString(registrationUnsignedMessage.Bytes())) + + registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( + registrationUnsignedMessage, + nil, + subnet.SubnetID, + 67, + ) + Expect(err).Should(BeNil()) + return registrationSignedMessage +} From 662b0d2cca6be7877b84962b0c13e5df92013a59 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 15 Aug 2024 16:24:52 -0400 Subject: [PATCH 080/545] enable all tests --- tests/local/e2e_test.go | 174 ++++++++++++++++++++-------------------- 1 file changed, 87 insertions(+), 87 deletions(-) diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index 35d021d12..7c88505e4 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -108,93 +108,93 @@ var _ = ginkgo.Describe("[Teleporter integration tests]", func() { func() { flows.NativeTokenStakingManager(LocalNetworkInstance) }) - // ginkgo.It("Send a message from Subnet A to Subnet B, and one from B to A", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // flows.BasicSendReceive(LocalNetworkInstance) - // }) - // ginkgo.It("Deliver to the wrong chain", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // flows.DeliverToWrongChain(LocalNetworkInstance) - // }) - // ginkgo.It("Deliver to non-existent contract", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // flows.DeliverToNonExistentContract(LocalNetworkInstance) - // }) - // ginkgo.It("Retry successful execution", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // flows.RetrySuccessfulExecution(LocalNetworkInstance) - // }) - // ginkgo.It("Unallowed relayer", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // flows.UnallowedRelayer(LocalNetworkInstance) - // }) - // ginkgo.It("Relay message twice", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // flows.RelayMessageTwice(LocalNetworkInstance) - // }) - // ginkgo.It("Add additional fee amount", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // flows.AddFeeAmount(LocalNetworkInstance) - // }) - // ginkgo.It("Send specific receipts", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // flows.SendSpecificReceipts(LocalNetworkInstance) - // }) - // ginkgo.It("Insufficient gas", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // flows.InsufficientGas(LocalNetworkInstance) - // }) - // ginkgo.It("Resubmit altered message", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // flows.ResubmitAlteredMessage(LocalNetworkInstance) - // }) - // ginkgo.It("Check upgrade access", - // ginkgo.Label(upgradabilityLabel), - // func() { - // flows.CheckUpgradeAccess(LocalNetworkInstance) - // }) - // ginkgo.It("Pause and Unpause Teleporter", - // ginkgo.Label(upgradabilityLabel), - // func() { - // flows.PauseTeleporter(LocalNetworkInstance) - // }) - // ginkgo.It("Calculate Teleporter message IDs", - // ginkgo.Label(utilsLabel), - // func() { - // flows.CalculateMessageID(LocalNetworkInstance) - // }) - - // // The following tests require special behavior by the relayer, so we only run them on a local network - // ginkgo.It("Relayer modifies message", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // flows.RelayerModifiesMessage(LocalNetworkInstance) - // }) - // ginkgo.It("Teleporter registry", - // ginkgo.Label(upgradabilityLabel), - // func() { - // flows.TeleporterRegistry(LocalNetworkInstance) - // }) - // ginkgo.It("Deliver ValidatorSetSig signed message", - // ginkgo.Label(validatorSetSigLabel), - // func() { - // flows.ValidatorSetSig(LocalNetworkInstance) - // }) - // ginkgo.It("Validator churn", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // flows.ValidatorChurn(LocalNetworkInstance) - // }) + ginkgo.It("Send a message from Subnet A to Subnet B, and one from B to A", + ginkgo.Label(teleporterMessengerLabel), + func() { + flows.BasicSendReceive(LocalNetworkInstance) + }) + ginkgo.It("Deliver to the wrong chain", + ginkgo.Label(teleporterMessengerLabel), + func() { + flows.DeliverToWrongChain(LocalNetworkInstance) + }) + ginkgo.It("Deliver to non-existent contract", + ginkgo.Label(teleporterMessengerLabel), + func() { + flows.DeliverToNonExistentContract(LocalNetworkInstance) + }) + ginkgo.It("Retry successful execution", + ginkgo.Label(teleporterMessengerLabel), + func() { + flows.RetrySuccessfulExecution(LocalNetworkInstance) + }) + ginkgo.It("Unallowed relayer", + ginkgo.Label(teleporterMessengerLabel), + func() { + flows.UnallowedRelayer(LocalNetworkInstance) + }) + ginkgo.It("Relay message twice", + ginkgo.Label(teleporterMessengerLabel), + func() { + flows.RelayMessageTwice(LocalNetworkInstance) + }) + ginkgo.It("Add additional fee amount", + ginkgo.Label(teleporterMessengerLabel), + func() { + flows.AddFeeAmount(LocalNetworkInstance) + }) + ginkgo.It("Send specific receipts", + ginkgo.Label(teleporterMessengerLabel), + func() { + flows.SendSpecificReceipts(LocalNetworkInstance) + }) + ginkgo.It("Insufficient gas", + ginkgo.Label(teleporterMessengerLabel), + func() { + flows.InsufficientGas(LocalNetworkInstance) + }) + ginkgo.It("Resubmit altered message", + ginkgo.Label(teleporterMessengerLabel), + func() { + flows.ResubmitAlteredMessage(LocalNetworkInstance) + }) + ginkgo.It("Check upgrade access", + ginkgo.Label(upgradabilityLabel), + func() { + flows.CheckUpgradeAccess(LocalNetworkInstance) + }) + ginkgo.It("Pause and Unpause Teleporter", + ginkgo.Label(upgradabilityLabel), + func() { + flows.PauseTeleporter(LocalNetworkInstance) + }) + ginkgo.It("Calculate Teleporter message IDs", + ginkgo.Label(utilsLabel), + func() { + flows.CalculateMessageID(LocalNetworkInstance) + }) + + // The following tests require special behavior by the relayer, so we only run them on a local network + ginkgo.It("Relayer modifies message", + ginkgo.Label(teleporterMessengerLabel), + func() { + flows.RelayerModifiesMessage(LocalNetworkInstance) + }) + ginkgo.It("Teleporter registry", + ginkgo.Label(upgradabilityLabel), + func() { + flows.TeleporterRegistry(LocalNetworkInstance) + }) + ginkgo.It("Deliver ValidatorSetSig signed message", + ginkgo.Label(validatorSetSigLabel), + func() { + flows.ValidatorSetSig(LocalNetworkInstance) + }) + ginkgo.It("Validator churn", + ginkgo.Label(teleporterMessengerLabel), + func() { + flows.ValidatorChurn(LocalNetworkInstance) + }) // Since the validator churn test modifies the network topology, we put it last for now. // It should not affect the other tests, but we get some errors if we run it before the other tests. // TODO: we should fix this so that the order of the tests does not matter. From ea47515ef48b1e90fa85a1fce7b59b3d3b49fbf3 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 15 Aug 2024 16:29:17 -0400 Subject: [PATCH 081/545] lint --- contracts/staking/StakingMessages.sol | 9 +++++---- tests/flows/native_token_staking.go | 4 ++-- tests/utils/staking_utils.go | 9 +++++---- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/contracts/staking/StakingMessages.sol b/contracts/staking/StakingMessages.sol index 8658af30a..fa65e4dc0 100644 --- a/contracts/staking/StakingMessages.sol +++ b/contracts/staking/StakingMessages.sol @@ -21,7 +21,7 @@ library StakingMessages { // Subnets send a RegisterSubnetValidator message to the P-Chain to register a validator. uint32 internal constant REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID = 0; - + // Subnets can send a SetSubnetValidatorWeight message to the P-Chain to update a validator's weight. // The P-Chain responds with a SetSubnetValidatorWeight message acknowledging the weight update. uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID = 1; @@ -29,7 +29,7 @@ library StakingMessages { // The P-Chain responds with a RegisterSubnetValidator message indicating whether the registration was successful // for the given validation ID. uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 2; - + // The P-Chain responds with a SetSubnetValidatorWeight message indicating whether the weight update was successful // for the given validation ID. uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID = 3; @@ -70,7 +70,9 @@ library StakingMessages { pure returns (bytes32, bytes memory) { - require(validationInfo.blsPublicKey.length == 48, "StakingMessages: Invalid signature length"); + require( + validationInfo.blsPublicKey.length == 48, "StakingMessages: Invalid signature length" + ); bytes memory res = new bytes(134); // Pack the codec ID for (uint256 i; i < 2; ++i) { @@ -166,7 +168,6 @@ library StakingMessages { expiry |= uint64(uint8(input[i + 126])) << uint64((8 * (7 - i))); } - return ValidationInfo({ subnetID: subnetID, nodeID: nodeID, diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index 71c6d70d0..17298bd38 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -85,7 +85,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) Expect(registerValidatorPayload.NodeID).Should(Equal(nodeID)) - Expect(registerValidatorPayload.Weight).Should(Equal(uint64(weight))) + Expect(registerValidatorPayload.Weight).Should(Equal(weight)) Expect(registerValidatorPayload.SubnetID).Should(Equal(subnetAInfo.SubnetID)) Expect(registerValidatorPayload.BlsPubKey[:]).Should(Equal(blsPublicKey[:])) @@ -131,7 +131,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.StakeAmount.Uint64()).Should(Equal(uint64(weight))) + Expect(validatorRemovalEvent.StakeAmount.Uint64()).Should(Equal(weight)) // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) diff --git a/tests/utils/staking_utils.go b/tests/utils/staking_utils.go index 332121304..74979e3ec 100644 --- a/tests/utils/staking_utils.go +++ b/tests/utils/staking_utils.go @@ -3,7 +3,6 @@ package utils import ( "context" "crypto/ecdsa" - "encoding/hex" "math/big" "time" @@ -20,7 +19,6 @@ import ( nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/log" . "github.com/onsi/gomega" ) @@ -202,9 +200,12 @@ func ConstructSubnetValidatorRegistrationMessage( Expect(err).Should(BeNil()) registrationAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), registrationPayload.Bytes()) Expect(err).Should(BeNil()) - registrationUnsignedMessage, err := avalancheWarp.NewUnsignedMessage(network.GetNetworkID(), pChainInfo.BlockchainID, registrationAddressedCall.Bytes()) + registrationUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( + network.GetNetworkID(), + pChainInfo.BlockchainID, + registrationAddressedCall.Bytes(), + ) Expect(err).Should(BeNil()) - log.Info("Constructed unsigned SubnetValidatorRegistration message", "message", hex.EncodeToString(registrationUnsignedMessage.Bytes())) registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( registrationUnsignedMessage, From 63b38846c16cef7beee35fae88669a124895c7a9 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 15 Aug 2024 17:22:38 -0400 Subject: [PATCH 082/545] erc20 staking e2e --- .../ERC20TokenStakingManager.go | 20 +- .../staking/ERC20TokenStakingManager.sol | 4 +- tests/flows/erc20_token_staking.go | 183 +++++++++++++++++ tests/flows/native_token_staking.go | 6 +- tests/local/e2e_test.go | 15 +- tests/utils/chain_utils.go | 5 +- tests/utils/staking_utils.go | 192 +++++++++++++++++- 7 files changed, 400 insertions(+), 25 deletions(-) create mode 100644 tests/flows/erc20_token_staking.go diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 5a1485209..ee3bb754e 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -42,7 +42,7 @@ type StakingManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", Bin: "0x608060405234801561000f575f80fd5b506040516134a93803806134a983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61335c8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f5780632e2194d8146100b45780635d0d7466146100e457806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612a12565b61019d565b005b6100c76100c2366004612a12565b610393565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26100f2366004612a3d565b6103a9565b61010a610105366004612a95565b6104b7565b6040519081526020016100db565b6100b2610126366004612ad5565b6104d0565b61010a610139366004612ba2565b610a50565b6100b261014c366004612c3e565b610a68565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100db565b6100b2610185366004612a12565b610cf5565b6100b2610198366004612c57565b610e09565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061333083398151915293929190829060ff1660058111156101fe576101fe612c81565b600581111561020f5761020f612c81565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612c81565b1461030e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61031f848361010001515f611230565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034c908490600401612cb7565b6020604051808303815f875af1158015610368573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038c9190612ce9565b5050505050565b5f6103a364e8d4a5100083612d28565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103ed5750825b90505f826001600160401b031660011480156104085750303b155b905081158015610416575080155b156104345760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045e57845460ff60401b1916600160401b1785555b610468878761144d565b83156104ae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6103a36001600160401b03831664e8d4a51000612d3b565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061333083398151915293929190829060ff16600581111561053157610531612c81565b600581111561054257610542612c81565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156105dc576105dc612c81565b146106355760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610305565b60c08101516001600160a01b0316336001600160a01b03161461066a5760405162461bcd60e51b815260040161030590612d52565b610677816040015161146b565b60038152426001600160401b031660808201525f8415610850576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156106da573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107019190810190612da7565b91509150806107225760405162461bcd60e51b815260040161030590612e79565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107899190612ce9565b8251146107a85760405162461bcd60e51b815260040161030590612ebd565b60208201516001600160a01b0316156107d35760405162461bcd60e51b815260040161030590612f04565b5f806107e28460400151611618565b91509150818a1461084a5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610305565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff1916600183600581111561089057610890612c81565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f9061098190889083611230565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109b0908590600401612cb7565b6020604051808303815f875af11580156109cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f09190612ce9565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f610a5d848685856117f0565b90505b949350505050565b5f5f805160206133308339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ac3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610aea9190810190612da7565b9150915080610b0b5760405162461bcd60e51b815260040161030590612e79565b8254825114610b2c5760405162461bcd60e51b815260040161030590612ebd565b60208201516001600160a01b031615610b575760405162461bcd60e51b815260040161030590612f04565b5f80610b668460400151611d00565b9150915080610bc65760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610305565b5f82815260078601602052604081208054610be090612f51565b9050118015610c12575060015f83815260088701602052604090205460ff166005811115610c1057610c10612c81565b145b610c2e5760405162461bcd60e51b815260040161030590612f89565b5f8281526007860160205260408120610c46916129c8565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020613330833981519152929190610d3d90612f51565b9050118015610d6f575060015f83815260088301602052604090205460ff166005811115610d6d57610d6d612c81565b145b610d8b5760405162461bcd60e51b815260040161030590612f89565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dc49190600401612fce565b6020604051808303815f875af1158015610de0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e049190612ce9565b505050565b5f5f805160206133308339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8b9190810190612da7565b9150915080610eac5760405162461bcd60e51b815260040161030590612e79565b5f8415610f25575f610ec18460400151611ea1565b919350909150506001600160401b03811615610f1f5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610305565b50610f99565b5f610f338460400151611d00565b90925090508015610f975760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610305565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115610fcb57610fcb612c81565b6005811115610fdc57610fdc612c81565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b9092049093166101009092019190915282015191925016331461108d5760405162461bcd60e51b815260040161030590612d52565b5f6003825160058111156110a3576110a3612c81565b14806110c157506002825160058111156110bf576110bf612c81565b145b156110e457506020808201515f90815260098701909152604081205560046110e8565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561111957611119612c81565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156112a957611269816001613058565b611274906008612d3b565b5081515f9083908390811061128b5761128b61306b565b60200101906001600160f81b03191690815f1a905350600101611255565b505f5b600481101561130c576112c0816003613058565b6112cb906008612d3b565b6001901c60f81b826112de83600261307f565b815181106112ee576112ee61306b565b60200101906001600160f81b03191690815f1a9053506001016112ac565b505f5b602081101561136e5761132381601f613058565b61132e906008612d3b565b86901c60f81b8261134083600661307f565b815181106113505761135061306b565b60200101906001600160f81b03191690815f1a90535060010161130f565b505f5b60088110156113d957611385816007613058565b611390906008612d3b565b6001600160401b038616901c60f81b826113ab83602661307f565b815181106113bb576113bb61306b565b60200101906001600160f81b03191690815f1a905350600101611371565b505f5b6008811015611444576113f0816007613058565b6113fb906008612d3b565b6001600160401b038516901c60f81b8261141683602e61307f565b815181106114265761142661306b565b60200101906001600160f81b03191690815f1a9053506001016113dc565b50949350505050565b6114556120dc565b61145e82612127565b6114678161214b565b5050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f8051602061333083398151915290600160e01b900460ff165f036114b0575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906114f89083613058565b10611514576001600160401b0384166040830152808252611533565b83826040018181516115269190613092565b6001600160401b03169052505b5f82602001518360400151606461154a91906130b9565b61155491906130e4565b600485015490915060ff600160e01b909104811690821611156115d45760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610305565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602e1461163b5760405162461bcd60e51b815260040161030590613109565b5f805b600281101561168a57611652816001613058565b61165d906008612d3b565b61ffff168582815181106116735761167361306b565b016020015160f81c901b919091179060010161163e565b5061ffff8116156116ad5760405162461bcd60e51b815260040161030590613150565b5f805b6004811015611708576116c4816003613058565b6116cf906008612d3b565b63ffffffff16866116e183600261307f565b815181106116f1576116f161306b565b016020015160f81c901b91909117906001016116b0565b5063ffffffff811660041461172f5760405162461bcd60e51b815260040161030590613191565b5f805b60208110156117845761174681601f613058565b611751906008612d3b565b8761175d83600661307f565b8151811061176d5761176d61306b565b016020015160f81c901b9190911790600101611732565b505f805b60088110156117e35761179c816007613058565b6117a7906008612d3b565b6001600160401b0316886117bc83602661307f565b815181106117cc576117cc61306b565b016020015160f81c901b9190911790600101611788565b5090969095509350505050565b5f6117f96121ff565b5f80516020613330833981519152426001600160401b03851611801561183357506001600160401b038416611831426202a30061307f565b115b6118935760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610305565b856118e05760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610305565b5f8681526009820160205260409020541561194c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610305565b82516030146119b15760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610305565b5f6119bb86612249565b90505f6119c782610393565b90506119d28161146b565b8260020154816001600160401b0316101580156119fc57508260030154816001600160401b031611155b611a545760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610305565b5f80611a9b6040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b031681526020018981525061227f565b5f82815260078801602052604090209193509150611ab9828261321a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ae6908590600401612cb7565b6020604051808303815f875af1158015611b02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b269190612ce9565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611bac57611bac612c81565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610a6060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611d235760405162461bcd60e51b815260040161030590613109565b5f805b6002811015611d7257611d3a816001613058565b611d45906008612d3b565b61ffff16858281518110611d5b57611d5b61306b565b016020015160f81c901b9190911790600101611d26565b5061ffff811615611d955760405162461bcd60e51b815260040161030590613150565b5f805b6004811015611df057611dac816003613058565b611db7906008612d3b565b63ffffffff1686611dc983600261307f565b81518110611dd957611dd961306b565b016020015160f81c901b9190911790600101611d98565b5063ffffffff8116600214611e175760405162461bcd60e51b815260040161030590613191565b5f805b6020811015611e6c57611e2e81601f613058565b611e39906008612d3b565b87611e4583600661307f565b81518110611e5557611e5561306b565b016020015160f81c901b9190911790600101611e1a565b505f86602681518110611e8157611e8161306b565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611ec55760405162461bcd60e51b815260040161030590613109565b5f805b6002811015611f1457611edc816001613058565b611ee7906008612d3b565b61ffff16868281518110611efd57611efd61306b565b016020015160f81c901b9190911790600101611ec8565b5061ffff811615611f375760405162461bcd60e51b815260040161030590613150565b5f805b6004811015611f9257611f4e816003613058565b611f59906008612d3b565b63ffffffff1687611f6b83600261307f565b81518110611f7b57611f7b61306b565b016020015160f81c901b9190911790600101611f3a565b5063ffffffff8116600114611fb95760405162461bcd60e51b815260040161030590613191565b5f805b602081101561200e57611fd081601f613058565b611fdb906008612d3b565b88611fe783600661307f565b81518110611ff757611ff761306b565b016020015160f81c901b9190911790600101611fbc565b505f805b600881101561206d57612026816007613058565b612031906008612d3b565b6001600160401b03168961204683602661307f565b815181106120565761205661306b565b016020015160f81c901b9190911790600101612012565b505f805b60088110156120cc57612085816007613058565b612090906008612d3b565b6001600160401b03168a6120a583602e61307f565b815181106120b5576120b561306b565b016020015160f81c901b9190911790600101612071565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661212557604051631afcd79f60e31b815260040160405180910390fd5b565b61212f6120dc565b61213761264a565b61213f61265a565b61214881612662565b50565b6121536120dc565b7f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f916001600160a01b0382166121df5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610305565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161224357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6103a3827f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91546001600160a01b031690612792565b5f60608260800151516030146122e95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610305565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561236057612320816001613058565b61232b906008612d3b565b5081515f908390839081106123425761234261306b565b60200101906001600160f81b03191690815f1a90535060010161230c565b505f5b60048110156123be57612377816003613058565b612382906008612d3b565b505f8261239083600261307f565b815181106123a0576123a061306b565b60200101906001600160f81b03191690815f1a905350600101612363565b505f5b602081101561241b57845181602081106123dd576123dd61306b565b1a60f81b826123ed83600661307f565b815181106123fd576123fd61306b565b60200101906001600160f81b03191690815f1a9053506001016123c1565b505f5b602081101561247b578460200151816020811061243d5761243d61306b565b1a60f81b8261244d83602661307f565b8151811061245d5761245d61306b565b60200101906001600160f81b03191690815f1a90535060010161241e565b505f5b60088110156124ef57612492816007613058565b61249d906008612d3b565b60ff1685604001516001600160401b0316901c60f81b828260466124c1919061307f565b815181106124d1576124d161306b565b60200101906001600160f81b03191690815f1a90535060010161247e565b505f5b603081101561255a57846080015181815181106125115761251161306b565b01602001516001600160f81b0319168261252c83604e61307f565b8151811061253c5761253c61306b565b60200101906001600160f81b03191690815f1a9053506001016124f2565b505f5b60088110156125cc57612571816007613058565b61257c906008612d3b565b60608601516001600160401b0390811691161c60f81b8261259e83607e61307f565b815181106125ae576125ae61306b565b60200101906001600160f81b03191690815f1a90535060010161255d565b506002816040516125dd91906132d9565b602060405180830381855afa1580156125f8573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061261b9190612ce9565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126526120dc565b6121256128f4565b6121256120dc565b61266a6120dc565b80355f8051602061333083398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561270260a0830160808401612a95565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561273560c0830160a084016132f4565b60048201805460ff92909216600160e01b0260ff60e01b1990921691909117905561276660e0830160c08401613314565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156127d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127fc9190612ce9565b90506128136001600160a01b0385163330866128fc565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015612857573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287b9190612ce9565b90508181116128e15760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610305565b6128eb8282613058565b95945050505050565b6126246120dc565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261295690859061295c565b50505050565b5f8060205f8451602086015f885af18061297b576040513d5f823e3d81fd5b50505f513d9150811561299257806001141561299f565b6001600160a01b0384163b155b1561295657604051635274afe760e01b81526001600160a01b0385166004820152602401610305565b5080546129d490612f51565b5f825580601f106129e3575050565b601f0160209004905f5260205f209081019061214891905b80821115612a0e575f81556001016129fb565b5090565b5f60208284031215612a22575f80fd5b5035919050565b6001600160a01b0381168114612148575f80fd5b5f80828403610100811215612a50575f80fd5b60e0811215612a5d575f80fd5b5082915060e0830135612a6f81612a29565b809150509250929050565b80356001600160401b0381168114612a90575f80fd5b919050565b5f60208284031215612aa5575f80fd5b612aae82612a7a565b9392505050565b8015158114612148575f80fd5b803563ffffffff81168114612a90575f80fd5b5f805f60608486031215612ae7575f80fd5b833592506020840135612af981612ab5565b9150612b0760408501612ac2565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b4657612b46612b10565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612b7457612b74612b10565b604052919050565b5f6001600160401b03821115612b9457612b94612b10565b50601f01601f191660200190565b5f805f8060808587031215612bb5575f80fd5b8435935060208501359250612bcc60408601612a7a565b915060608501356001600160401b03811115612be6575f80fd5b8501601f81018713612bf6575f80fd5b8035612c09612c0482612b7c565b612b4c565b818152886020838501011115612c1d575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612c4e575f80fd5b612aae82612ac2565b5f8060408385031215612c68575f80fd5b612c7183612ac2565b91506020830135612a6f81612ab5565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612caf578181015183820152602001612c97565b50505f910152565b602081525f8251806020840152612cd5816040850160208701612c95565b601f01601f19169190910160400192915050565b5f60208284031215612cf9575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612d3657612d36612d00565b500490565b80820281158282048414176103a3576103a3612d14565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b8051612a9081612ab5565b5f8060408385031215612db8575f80fd5b82516001600160401b0380821115612dce575f80fd5b9084019060608287031215612de1575f80fd5b612de9612b24565b82518152602080840151612dfc81612a29565b82820152604084015183811115612e11575f80fd5b80850194505087601f850112612e25575f80fd5b83519250612e35612c0484612b7c565b8381528882858701011115612e48575f80fd5b612e5784838301848801612c95565b80604084015250819550612e6c818801612d9c565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612f6557607f821691505b602082108103612f8357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612fe081612f51565b806020870152604060018084165f8114613001576001811461301d5761304a565b60ff19851660408a0152604084151560051b8a0101955061304a565b895f5260205f205f5b858110156130415781548b8201860152908301908801613026565b8a016040019650505b509398975050505050505050565b818103818111156103a3576103a3612d14565b634e487b7160e01b5f52603260045260245ffd5b808201808211156103a3576103a3612d14565b6001600160401b038181168382160190808211156130b2576130b2612d14565b5092915050565b6001600160401b038181168382160280821691908281146130dc576130dc612d14565b505092915050565b5f6001600160401b03808416806130fd576130fd612d00565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e0457805f5260205f20601f840160051c810160208510156131fb5750805b601f840160051c820191505b8181101561038c575f8155600101613207565b81516001600160401b0381111561323357613233612b10565b613247816132418454612f51565b846131d6565b602080601f83116001811461327a575f84156132635750858301515b5f19600386901b1c1916600185901b1785556132d1565b5f85815260208120601f198616915b828110156132a857888601518255948401946001909101908401613289565b50858210156132c557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f82516132ea818460208701612c95565b9190910192915050565b5f60208284031215613304575f80fd5b813560ff81168114612aae575f80fd5b5f60208284031215613324575f80fd5b8135612aae81612a2956feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", } @@ -392,23 +392,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init // InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x872fda64. // -// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes signature) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", stakeAmount, nodeID, registrationExpiry, signature) +// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", stakeAmount, nodeID, registrationExpiry, blsPublicKey) } // InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x872fda64. // -// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes signature) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, signature) +// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, blsPublicKey) } // InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x872fda64. // -// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes signature) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, signature) +// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, blsPublicKey) } // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 9fe936db6..58517e113 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -76,9 +76,9 @@ contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenS uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, - bytes memory signature + bytes memory blsPublicKey ) external override returns (bytes32 validationID) { - return _initializeValidatorRegistration(nodeID, stakeAmount, registrationExpiry, signature); + return _initializeValidatorRegistration(nodeID, stakeAmount, registrationExpiry, blsPublicKey); } // Must be guarded with reentrancy guard for safe transfer from diff --git a/tests/flows/erc20_token_staking.go b/tests/flows/erc20_token_staking.go new file mode 100644 index 000000000..0ba94ea47 --- /dev/null +++ b/tests/flows/erc20_token_staking.go @@ -0,0 +1,183 @@ +package flows + +import ( + "context" + + "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/crypto/bls" + warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/messages" + warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/teleporter/tests/interfaces" + "github.com/ava-labs/teleporter/tests/utils" + . "github.com/onsi/gomega" +) + +// Registers a erc20 token staking validator on a subnet. The steps are as follows: +// - Deploy the ERCTokenStakingManager +// - Initiate validator registration +// - Deliver the Warp message to the P-Chain (not implemented) +// - Aggregate P-Chain signatures on the response Warp message +// - Deliver the Warp message to the subnet +// - Verify that the validator is registered in the staking contract +// Delists the validator from the subnet. The steps are as follows: +// - Initiate validator delisting +// - Deliver the Warp message to the P-Chain (not implemented) +// - Aggregate P-Chain signatures on the response Warp message +// - Deliver the Warp message to the subnet +// - Verify that the validator is delisted from the staking contract +func ERC20TokenStakingManager(network interfaces.LocalNetwork) { + // Get the subnets info + cChainInfo := network.GetPrimaryNetworkInfo() + subnetAInfo, _ := utils.GetTwoSubnets(network) + _, fundedKey := network.GetFundedAccountInfo() + pChainInfo := utils.GetPChainInfo(cChainInfo) + + signatureAggregator := utils.NewSignatureAggregator( + cChainInfo.NodeURIs[0], + []ids.ID{ + subnetAInfo.SubnetID, + ids.Empty, // Primary network subnet ID + }, + ) + + // Deploy the staking manager contract + stakingManagerAddress, stakingManager, _, erc20 := utils.DeployAndInitializeERC20TokenStakingManager( + context.Background(), + fundedKey, + subnetAInfo, + pChainInfo, + ) + + // + // Register a validator + // + var validationID ids.ID // To be used in the delisting step + stakeAmount := uint64(1e18) + weight := uint64(1e6) // stakeAmount / 1e12 + { + // Iniatiate validator registration + nodeID := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} + var receipt *types.Receipt + receipt, validationID = utils.CallERC20InitializeValidatorRegistration( + fundedKey, + subnetAInfo, + stakeAmount, + erc20, + stakingManagerAddress, + nodeID, + blsPublicKey, + stakingManager, + ) + + // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) + Expect(err).Should(BeNil()) + // Check that the addressed call payload is a registered Warp message type + var payloadInterface warpMessages.Payload + ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) + Expect(err).Should(BeNil()) + registerValidatorPayload, ok := payloadInterface.(*warpMessages.RegisterSubnetValidator) + Expect(ok).Should(BeTrue()) + + Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) + Expect(registerValidatorPayload.NodeID).Should(Equal(nodeID)) + Expect(registerValidatorPayload.Weight).Should(Equal(weight)) + Expect(registerValidatorPayload.SubnetID).Should(Equal(subnetAInfo.SubnetID)) + Expect(registerValidatorPayload.BlsPubKey[:]).Should(Equal(blsPublicKey[:])) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( + validationID, + true, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CallERC20CompleteValidatorRegistration( + fundedKey, + subnetAInfo, + stakingManagerAddress, + registrationSignedMessage, + ) + // Check that the validator is registered in the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + } + + // + // Delist the validator + // + { + receipt := utils.CallERC20InitializeEndValidation( + fundedKey, + subnetAInfo, + stakingManager, + validationID, + ) + validatorRemovalEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(validatorRemovalEvent.StakeAmount.Uint64()).Should(Equal(weight)) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + Expect(err).Should(BeNil()) + // Validate the Warp message, (this will be done on the P-Chain in the future) + msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) + Expect(err).Should(BeNil()) + // Check that the addressed call payload is a registered Warp message type + var payloadInterface warpMessages.Payload + ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) + Expect(err).Should(BeNil()) + registerValidatorPayload, ok := payloadInterface.(*warpMessages.SetSubnetValidatorWeight) + Expect(ok).Should(BeTrue()) + + Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) + Expect(registerValidatorPayload.ValidationID).Should(Equal(validationID)) + Expect(registerValidatorPayload.Weight).Should(Equal(uint64(0))) + Expect(registerValidatorPayload.Nonce).Should(Equal(uint64(0))) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( + validationID, + false, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CallERC20CompleteEndValidation( + fundedKey, + subnetAInfo, + stakingManagerAddress, + registrationSignedMessage, + ) + + // Check that the validator is registered in the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodEnded, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + } +} diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index 17298bd38..1944bb72d 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -100,7 +100,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { ) // Deliver the Warp message to the subnet - receipt = utils.CallCompleteValidatorRegistration( + receipt = utils.CallNativeCompleteValidatorRegistration( fundedKey, subnetAInfo, stakingManagerContractAddress, @@ -119,7 +119,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Delist the validator // { - receipt := utils.CallInitializeEndValidation( + receipt := utils.CallNativeInitializeEndValidation( fundedKey, subnetAInfo, stakingManager, @@ -163,7 +163,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { ) // Deliver the Warp message to the subnet - receipt = utils.CallCompleteEndValidation( + receipt = utils.CallNativeCompleteEndValidation( fundedKey, subnetAInfo, stakingManagerContractAddress, diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index 7c88505e4..8b84c6955 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -103,11 +103,6 @@ var _ = ginkgo.AfterSuite(func() { var _ = ginkgo.Describe("[Teleporter integration tests]", func() { // Teleporter tests - ginkgo.It("Native token staking manager", - ginkgo.Label(stakingManagerLabel), - func() { - flows.NativeTokenStakingManager(LocalNetworkInstance) - }) ginkgo.It("Send a message from Subnet A to Subnet B, and one from B to A", ginkgo.Label(teleporterMessengerLabel), func() { @@ -195,6 +190,16 @@ var _ = ginkgo.Describe("[Teleporter integration tests]", func() { func() { flows.ValidatorChurn(LocalNetworkInstance) }) + ginkgo.It("Native token staking manager", + ginkgo.Label(stakingManagerLabel), + func() { + flows.NativeTokenStakingManager(LocalNetworkInstance) + }) + ginkgo.It("ERC20 token staking manager", + ginkgo.Label(stakingManagerLabel), + func() { + flows.ERC20TokenStakingManager(LocalNetworkInstance) + }) // Since the validator churn test modifies the network topology, we put it last for now. // It should not affect the other tests, but we get some errors if we run it before the other tests. // TODO: we should fix this so that the order of the tests does not matter. diff --git a/tests/utils/chain_utils.go b/tests/utils/chain_utils.go index 36244b4f9..07872d456 100644 --- a/tests/utils/chain_utils.go +++ b/tests/utils/chain_utils.go @@ -540,9 +540,10 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu } trackedSubnets := set.NewSet[ids.ID](len(subnets)) trackedSubnets.Add(subnets...) + registry := prometheus.NewRegistry() appRequestNetwork, err := peers.NewNetwork( logging.Debug, - prometheus.DefaultRegisterer, + registry, trackedSubnets, &cfg, ) @@ -550,7 +551,7 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu messageCreator, err := message.NewCreator( logger, - prometheus.DefaultRegisterer, + registry, constants.DefaultNetworkCompressionType, constants.DefaultNetworkMaximumInboundTimeout, ) diff --git a/tests/utils/staking_utils.go b/tests/utils/staking_utils.go index 74979e3ec..5d86ec0e3 100644 --- a/tests/utils/staking_utils.go +++ b/tests/utils/staking_utils.go @@ -12,10 +12,13 @@ import ( warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/messages" warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" + "github.com/ava-labs/subnet-evm/accounts/abi" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/precompile/contracts/warp" predicateutils "github.com/ava-labs/subnet-evm/predicate" + exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" + erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/ERC20TokenStakingManager" nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ethereum/go-ethereum/common" @@ -78,6 +81,65 @@ func DeployAndInitializeNativeTokenStakingManager( return stakingManagerContractAddress, stakingManager } +func DeployERC20TokenStakingManager( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, +) (common.Address, *erc20tokenstakingmanager.ERC20TokenStakingManager) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + address, tx, stakingManager, err := erc20tokenstakingmanager.DeployERC20TokenStakingManager( + opts, + subnet.RPCClient, + 0, // ICMInitializable.Allowed + ) + Expect(err).Should(BeNil()) + + // Wait for the transaction to be mined + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + + return address, stakingManager +} + +func DeployAndInitializeERC20TokenStakingManager( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, +) ( + common.Address, + *erc20tokenstakingmanager.ERC20TokenStakingManager, + common.Address, + *exampleerc20.ExampleERC20, +) { + stakingManagerContractAddress, stakingManager := DeployERC20TokenStakingManager( + ctx, + senderKey, + subnet, + ) + + erc20Address, erc20 := DeployExampleERC20(ctx, senderKey, subnet) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := stakingManager.Initialize( + opts, + erc20tokenstakingmanager.StakingManagerSettings{ + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnet.SubnetID, + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: uint64(24 * time.Hour), + MaximumHourlyChurn: 0, + RewardCalculator: common.Address{}, + }, + erc20Address, + ) + Expect(err).Should(BeNil()) + WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + + return stakingManagerContractAddress, stakingManager, erc20Address, erc20 +} + // // Function call utils // @@ -110,7 +172,47 @@ func CallNativeInitializeValidatorRegistration( return receipt, ids.ID(registrationInitiatedEvent.ValidationID) } -func CallCompleteValidatorRegistration( +func CallERC20InitializeValidatorRegistration( + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakeAmount uint64, + token *exampleerc20.ExampleERC20, + stakingManagerAddress common.Address, + nodeID ids.ID, + blsPublicKey [bls.PublicKeyLen]byte, + stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, +) (*types.Receipt, ids.ID) { + + ERC20Approve( + context.Background(), + token, + stakingManagerAddress, + big.NewInt(0).SetUint64(stakeAmount), + subnet, + senderKey, + ) + + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + + tx, err := stakingManager.InitializeValidatorRegistration( + opts, + big.NewInt(0).SetUint64(stakeAmount), + nodeID, + uint64(time.Now().Add(24*time.Hour).Unix()), + blsPublicKey[:], + ) + Expect(err).Should(BeNil()) + receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + registrationInitiatedEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodCreated, + ) + Expect(err).Should(BeNil()) + return receipt, ids.ID(registrationInitiatedEvent.ValidationID) +} + +func CallNativeCompleteValidatorRegistration( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -118,6 +220,39 @@ func CallCompleteValidatorRegistration( ) *types.Receipt { abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) + return completeValidatorRegistration( + abi, + sendingKey, + subnet, + stakingManagerContractAddress, + registrationSignedMessage, + ) +} + +func CallERC20CompleteValidatorRegistration( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakingManagerContractAddress common.Address, + registrationSignedMessage *avalancheWarp.Message, +) *types.Receipt { + abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + return completeValidatorRegistration( + abi, + sendingKey, + subnet, + stakingManagerContractAddress, + registrationSignedMessage, + ) +} + +func completeValidatorRegistration( + abi *abi.ABI, + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakingManagerContractAddress common.Address, + registrationSignedMessage *avalancheWarp.Message, +) *types.Receipt { callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) Expect(err).Should(BeNil()) gasFeeCap, gasTipCap, nonce := CalculateTxParams(context.Background(), subnet, PrivateKeyToAddress(sendingKey)) @@ -138,7 +273,7 @@ func CallCompleteValidatorRegistration( return SendTransactionAndWaitForSuccess(context.Background(), subnet, signedRegistrationTx) } -func CallInitializeEndValidation( +func CallNativeInitializeEndValidation( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, @@ -156,7 +291,25 @@ func CallInitializeEndValidation( return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) } -func CallCompleteEndValidation( +func CallERC20InitializeEndValidation( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, + validationID ids.ID, +) *types.Receipt { + opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := stakingManager.InitializeEndValidation( + opts, + validationID, + false, + 0, + ) + Expect(err).Should(BeNil()) + return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) +} + +func CallNativeCompleteEndValidation( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -164,6 +317,39 @@ func CallCompleteEndValidation( ) *types.Receipt { abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) + return callCompleteEndValidation( + abi, + sendingKey, + subnet, + stakingManagerContractAddress, + registrationSignedMessage, + ) +} + +func CallERC20CompleteEndValidation( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakingManagerContractAddress common.Address, + registrationSignedMessage *avalancheWarp.Message, +) *types.Receipt { + abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + return callCompleteEndValidation( + abi, + sendingKey, + subnet, + stakingManagerContractAddress, + registrationSignedMessage, + ) +} + +func callCompleteEndValidation( + abi *abi.ABI, + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakingManagerContractAddress common.Address, + registrationSignedMessage *avalancheWarp.Message, +) *types.Receipt { callData, err := abi.Pack("completeEndValidation", uint32(0), false) Expect(err).Should(BeNil()) gasFeeCap, gasTipCap, nonce := CalculateTxParams(context.Background(), subnet, PrivateKeyToAddress(sendingKey)) From b4baff19d0c945bd7d5efc1c4a1c3e95c7c0030b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 15 Aug 2024 17:32:20 -0400 Subject: [PATCH 083/545] format --- contracts/staking/ERC20TokenStakingManager.sol | 3 ++- tests/utils/staking_utils.go | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 58517e113..422c12ff6 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -78,7 +78,8 @@ contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenS uint64 registrationExpiry, bytes memory blsPublicKey ) external override returns (bytes32 validationID) { - return _initializeValidatorRegistration(nodeID, stakeAmount, registrationExpiry, blsPublicKey); + return + _initializeValidatorRegistration(nodeID, stakeAmount, registrationExpiry, blsPublicKey); } // Must be guarded with reentrancy guard for safe transfer from diff --git a/tests/utils/staking_utils.go b/tests/utils/staking_utils.go index 5d86ec0e3..88a3d85e5 100644 --- a/tests/utils/staking_utils.go +++ b/tests/utils/staking_utils.go @@ -182,7 +182,6 @@ func CallERC20InitializeValidatorRegistration( blsPublicKey [bls.PublicKeyLen]byte, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, ) (*types.Receipt, ids.ID) { - ERC20Approve( context.Background(), token, From 05f476f469c530ef43a0dbdbc7f3b2bc0afdda69 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 16 Aug 2024 11:36:56 -0400 Subject: [PATCH 084/545] draft separate poa and pos validator managers --- ...ingManager.sol => PoAValidatorManager.sol} | 19 +++-- contracts/staking/PoSValidatorManager.sol | 45 ++++++++++++ contracts/staking/StakingManager.sol | 72 ++++--------------- .../interfaces/IERC20TokenStakingManager.sol | 4 +- .../interfaces/INativeTokenStakingManager.sol | 4 +- .../staking/interfaces/IPoAStakingManager.sol | 22 ------ .../interfaces/IPoAValidatorManager.sol | 30 ++++++++ .../interfaces/IPoSValidatorManager.sol | 26 +++++++ ...akingManager.sol => IValidatorManager.sol} | 53 ++++++++------ 9 files changed, 164 insertions(+), 111 deletions(-) rename contracts/staking/{PoAStakingManager.sol => PoAValidatorManager.sol} (72%) create mode 100644 contracts/staking/PoSValidatorManager.sol delete mode 100644 contracts/staking/interfaces/IPoAStakingManager.sol create mode 100644 contracts/staking/interfaces/IPoAValidatorManager.sol create mode 100644 contracts/staking/interfaces/IPoSValidatorManager.sol rename contracts/staking/interfaces/{IStakingManager.sol => IValidatorManager.sol} (79%) diff --git a/contracts/staking/PoAStakingManager.sol b/contracts/staking/PoAValidatorManager.sol similarity index 72% rename from contracts/staking/PoAStakingManager.sol rename to contracts/staking/PoAValidatorManager.sol index 286033540..8deab7e54 100644 --- a/contracts/staking/PoAStakingManager.sol +++ b/contracts/staking/PoAValidatorManager.sol @@ -5,14 +5,14 @@ pragma solidity 0.8.25; -import {IPoAStakingManager} from "./interfaces/IPoAStakingManager.sol"; +import {IPoAValidatorManager} from "./interfaces/IPoAValidatorManager.sol"; import {StakingManager} from "./StakingManager.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; import {ICMInitializable} from "../utilities/ICMInitializable.sol"; -import {StakingManager, StakingManagerSettings} from "./StakingManager.sol"; +import {StakingManager, ValidatorManagerSettings} from "./StakingManager.sol"; -contract PoAStakingManager is IPoAStakingManager, StakingManager, OwnableUpgradeable { +contract PoAStakingManager is IPoAValidatorManager, StakingManager, OwnableUpgradeable { constructor(ICMInitializable init) { if (init == ICMInitializable.Disallowed) { _disableInitializers(); @@ -20,7 +20,7 @@ contract PoAStakingManager is IPoAStakingManager, StakingManager, OwnableUpgrade } function initialize( - StakingManagerSettings calldata settings, + ValidatorManagerSettings calldata settings, address initialOwner ) external initializer { __PoAStakingManager_init(settings, initialOwner); @@ -28,7 +28,7 @@ contract PoAStakingManager is IPoAStakingManager, StakingManager, OwnableUpgrade // solhint-disable func-name-mixedcase, ordering function __PoAStakingManager_init( - StakingManagerSettings calldata settings, + ValidatorManagerSettings calldata settings, address initialOwner ) internal onlyInitializing { __StakingManager_init(settings); @@ -38,17 +38,22 @@ contract PoAStakingManager is IPoAStakingManager, StakingManager, OwnableUpgrade // solhint-disable-next-line no-empty-blocks function __PoAStakingManager_init_unchained() internal onlyInitializing {} + // solhint-enable func-name-mixedcase function initializeValidatorRegistration( - uint256 stakeAmount, + uint256 weight, bytes32 nodeID, uint64 registrationExpiry, bytes memory signature ) external override onlyOwner returns (bytes32 validationID) { - return _initializeValidatorRegistration(nodeID, stakeAmount, registrationExpiry, signature); + return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, signature); } + // solhint-enable ordering + function initializeEndValidation(bytes32 validationID) external override { + _initializeEndValidation(validationID, 0); + } function _lock(uint256 value) internal virtual override returns (uint256) { return value; diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol new file mode 100644 index 000000000..8d0530160 --- /dev/null +++ b/contracts/staking/PoSValidatorManager.sol @@ -0,0 +1,45 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {IPoSValidatorManager} from "./interfaces/IPoSValidatorManager.sol"; +import {StakingManager} from "./StakingManager.sol"; +import {ICMInitializable} from "../utilities/ICMInitializable.sol"; +import {WarpMessage} from + "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; +import {StakingMessages} from "./StakingMessages.sol"; + +abstract contract PoSValidatorManager is IPoSValidatorManager, StakingManager { + function initializeEndValidation( + bytes32 validationID, + bool includeUptimeProof, + uint32 messageIndex + ) external { + uint64 uptimeSeconds; + if (includeUptimeProof) { + (WarpMessage memory warpMessage, bool valid) = + WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); + require(valid, "StakingManager: Invalid warp message"); + + require( + warpMessage.sourceChainID == WARP_MESSENGER.getBlockchainID(), + "StakingManager: Invalid source chain ID" + ); + require( + warpMessage.originSenderAddress == address(0), + "StakingManager: Invalid origin sender address" + ); + + (bytes32 uptimeValidationID, uint64 uptime) = + StakingMessages.unpackValidationUptimeMessage(warpMessage.payload); + require( + validationID == uptimeValidationID, "StakingManager: Invalid uptime validation ID" + ); + uptimeSeconds = uptime; + } + _initializeEndValidation(validationID, uptimeSeconds); + } +} diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/StakingManager.sol index 4636c0cc5..42c40596c 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/StakingManager.sol @@ -5,7 +5,13 @@ pragma solidity 0.8.25; -import {IStakingManager, StakingManagerSettings} from "./interfaces/IStakingManager.sol"; +import { + IValidatorManager, + ValidatorManagerSettings, + ValidatorStatus, + Validator, + ValidatorChurnPeriod +} from "./interfaces/IValidatorManager.sol"; import { WarpMessage, IWarpMessenger @@ -19,39 +25,13 @@ import {ContextUpgradeable} from import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; +// TODO: rename validatormanager abstract contract StakingManager is Initializable, ContextUpgradeable, ReentrancyGuardUpgradeable, - IStakingManager + IValidatorManager { - enum ValidatorStatus { - Unknown, - PendingAdded, - Active, - PendingRemoved, - Completed, - Invalidated - } - - struct Validator { - ValidatorStatus status; - bytes32 nodeID; - uint64 weight; - uint64 startedAt; - uint64 endedAt; - uint64 uptimeSeconds; - address owner; - bool rewarded; - uint64 messageNonce; - } - - struct ValidatorChurnPeriod { - uint256 startedAt; - uint64 initialStake; - uint64 churnAmount; - } - // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.StakingManager struct StakingManagerStorage { @@ -92,7 +72,7 @@ abstract contract StakingManager is IWarpMessenger(0x0200000000000000000000000000000000000005); // solhint-disable-next-line func-name-mixedcase - function __StakingManager_init(StakingManagerSettings calldata settings) + function __StakingManager_init(ValidatorManagerSettings calldata settings) internal onlyInitializing { @@ -102,7 +82,7 @@ abstract contract StakingManager is } // solhint-disable-next-line func-name-mixedcase - function __StakingManager_init_unchained(StakingManagerSettings calldata settings) + function __StakingManager_init_unchained(ValidatorManagerSettings calldata settings) internal onlyInitializing { @@ -255,11 +235,10 @@ abstract contract StakingManager is * Any rewards for this validation period will stop accruing when this function is called. * @param validationID The ID of the validation being ended. */ - function initializeEndValidation( + function _initializeEndValidation( bytes32 validationID, - bool includeUptimeProof, - uint32 messageIndex - ) external { + uint64 uptimeSeconds + ) internal virtual { StakingManagerStorage storage $ = _getStakingManagerStorage(); // Ensure the validation period is active. @@ -277,29 +256,6 @@ abstract contract StakingManager is // Set the end time of the validation period, since it is no longer known to be an active validator // on the P-Chain. validator.endedAt = uint64(block.timestamp); - - uint64 uptimeSeconds; - if (includeUptimeProof) { - (WarpMessage memory warpMessage, bool valid) = - WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "StakingManager: Invalid warp message"); - - require( - warpMessage.sourceChainID == WARP_MESSENGER.getBlockchainID(), - "StakingManager: Invalid source chain ID" - ); - require( - warpMessage.originSenderAddress == address(0), - "StakingManager: Invalid origin sender address" - ); - - (bytes32 uptimeValidationID, uint64 uptime) = - StakingMessages.unpackValidationUptimeMessage(warpMessage.payload); - require( - validationID == uptimeValidationID, "StakingManager: Invalid uptime validation ID" - ); - uptimeSeconds = uptime; - } validator.uptimeSeconds = uptimeSeconds; // Save the validator updates. diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index 807094e8e..f3a8f5880 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -5,9 +5,9 @@ pragma solidity 0.8.25; -import {IStakingManager} from "./IStakingManager.sol"; +import {IPoSValidatorManager} from "./IPoSValidatorManager.sol"; -interface IERC20TokenStakingManager is IStakingManager { +interface IERC20TokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the {stakeAmount} of the managers specified ERC20 token. * @param nodeID The node ID of the validator being registered. diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index e823bc590..34b463cc1 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -5,9 +5,9 @@ pragma solidity 0.8.25; -import {IStakingManager} from "./IStakingManager.sol"; +import {IPoSValidatorManager} from "./IPoSValidatorManager.sol"; -interface INativeTokenStakingManager is IStakingManager { +interface INativeTokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. diff --git a/contracts/staking/interfaces/IPoAStakingManager.sol b/contracts/staking/interfaces/IPoAStakingManager.sol deleted file mode 100644 index 627967039..000000000 --- a/contracts/staking/interfaces/IPoAStakingManager.sol +++ /dev/null @@ -1,22 +0,0 @@ -// (c) 2024, Ava Labs, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -// SPDX-License-Identifier: Ecosystem - -pragma solidity 0.8.25; - -import {IStakingManager} from "./IStakingManager.sol"; - -interface IPoAStakingManager is IStakingManager { - /** - * @notice Begins the validator registration process. Locks the {stakeAmount} of the managers specified ERC20 token. - * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. - */ - function initializeValidatorRegistration( - uint256 stakeAmount, - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory signature - ) external returns (bytes32 validationID); -} diff --git a/contracts/staking/interfaces/IPoAValidatorManager.sol b/contracts/staking/interfaces/IPoAValidatorManager.sol new file mode 100644 index 000000000..c58521718 --- /dev/null +++ b/contracts/staking/interfaces/IPoAValidatorManager.sol @@ -0,0 +1,30 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {IValidatorManager} from "./IValidatorManager.sol"; + +interface IPoAValidatorManager is IValidatorManager { + /** + * @notice Begins the validator registration process, and sets the {weight} of the validator. + * @param nodeID The node ID of the validator being registered. + * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. + */ + function initializeValidatorRegistration( + uint256 weight, + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature + ) external returns (bytes32 validationID); + + /** + * @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. + */ + function initializeEndValidation(bytes32 validationID) external; +} diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol new file mode 100644 index 000000000..c06307666 --- /dev/null +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -0,0 +1,26 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {IValidatorManager} from "./IValidatorManager.sol"; + +interface IPoSValidatorManager is IStakingManager { + /** + * @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 includeUptimeProof Whether or not an uptime proof is provided for the validation period. + * If no uptime proof is provided, the validation uptime will be assumed to be 0. + * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the + * uptime proof. + */ + function initializeEndValidation( + bytes32 validationID, + bool includeUptimeProof, + uint32 messageIndex + ) external; +} diff --git a/contracts/staking/interfaces/IStakingManager.sol b/contracts/staking/interfaces/IValidatorManager.sol similarity index 79% rename from contracts/staking/interfaces/IStakingManager.sol rename to contracts/staking/interfaces/IValidatorManager.sol index 05212d581..e55efc6b1 100644 --- a/contracts/staking/interfaces/IStakingManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -5,11 +5,40 @@ pragma solidity 0.8.25; +// TODO: remove reward calculator from settings import {IRewardCalculator} from "./IRewardCalculator.sol"; -struct StakingManagerSettings { +enum ValidatorStatus { + Unknown, + PendingAdded, + Active, + PendingRemoved, + Completed, + Invalidated +} + +struct Validator { + ValidatorStatus status; + bytes32 nodeID; + uint64 weight; + uint64 startedAt; + uint64 endedAt; + uint64 uptimeSeconds; + address owner; + bool rewarded; + uint64 messageNonce; +} + +struct ValidatorChurnPeriod { + uint256 startedAt; + uint64 initialStake; + uint64 churnAmount; +} + +struct ValidatorManagerSettings { bytes32 pChainBlockchainID; bytes32 subnetID; + // TODO move staking parametesr outside of settings to constructor of PoS uint256 minimumStakeAmount; uint256 maximumStakeAmount; uint64 minimumStakeDuration; @@ -17,7 +46,7 @@ struct StakingManagerSettings { IRewardCalculator rewardCalculator; } -interface IStakingManager { +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, @@ -37,7 +66,7 @@ interface IStakingManager { * on the P-Chain. Rewards for this validation period will begin accruing when this event is emitted. */ event ValidationPeriodRegistered( - bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp + bytes32 indexed validationID, uint256 weight, uint256 timestamp ); /** @@ -48,7 +77,7 @@ interface IStakingManager { event ValidatorRemovalInitialized( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, - uint256 stakeAmount, + uint256 weight, uint256 endTime, uint64 uptime ); @@ -73,22 +102,6 @@ interface IStakingManager { */ function completeValidatorRegistration(uint32 messageIndex) external; - /** - * @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 includeUptimeProof Whether or not an uptime proof is provided for the validation period. - * If no uptime proof is provided, the validation uptime will be assumed to be 0. - * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the - * uptime proof. - */ - function initializeEndValidation( - bytes32 validationID, - bool includeUptimeProof, - uint32 messageIndex - ) external; - /** * @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. From 1004f44b05b1c7d366943ff6677c262614805a41 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 16 Aug 2024 13:47:32 -0400 Subject: [PATCH 085/545] contracts compiling --- .../staking/ERC20TokenStakingManager.sol | 42 +++++- .../staking/NativeTokenStakingManager.sol | 42 ++++-- contracts/staking/PoAValidatorManager.sol | 17 +-- contracts/staking/PoSValidatorManager.sol | 89 +++++++++++- ...takingManager.sol => ValidatorManager.sol} | 136 ++++++++---------- ...kingMessages.sol => ValidatorMessages.sol} | 24 ++-- .../interfaces/IPoAValidatorManager.sol | 2 +- .../interfaces/IPoSValidatorManager.sol | 2 +- .../staking/interfaces/IValidatorManager.sol | 5 - .../staking/tests/StakingManagerTests.t.sol | 31 ++-- .../staking/tests/StakingMessagesTests.t.sol | 28 ++-- 11 files changed, 258 insertions(+), 160 deletions(-) rename contracts/staking/{StakingManager.sol => ValidatorManager.sol} (74%) rename contracts/staking/{StakingMessages.sol => ValidatorMessages.sol} (95%) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 9fe936db6..aa868aa16 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -6,15 +6,21 @@ pragma solidity 0.8.25; import {IERC20TokenStakingManager} from "./interfaces/IERC20TokenStakingManager.sol"; -import {StakingManager, StakingManagerSettings} from "./StakingManager.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; import {SafeERC20TransferFrom} from "@utilities/SafeERC20TransferFrom.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 {ValidatorManagerSettings} from "./interfaces/IValidatorManager.sol"; +import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; -contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenStakingManager { +contract ERC20TokenStakingManager is + Initializable, + PoSValidatorManager, + IERC20TokenStakingManager +{ using SafeERC20 for IERC20; using SafeERC20TransferFrom for IERC20; @@ -50,18 +56,39 @@ contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenS } function initialize( - StakingManagerSettings calldata settings, + ValidatorManagerSettings calldata settings, + uint256 minimumStakeAmount, + uint256 maximumStakeAmount, + uint64 minimumStakeDuration, + IRewardCalculator rewardCalculator, IERC20 token ) external initializer { - __ERC20TokenStakingManager_init(settings, token); + __ERC20TokenStakingManager_init( + settings, + minimumStakeAmount, + maximumStakeAmount, + minimumStakeDuration, + rewardCalculator, + token + ); } // solhint-disable func-name-mixedcase function __ERC20TokenStakingManager_init( - StakingManagerSettings calldata settings, + ValidatorManagerSettings calldata settings, + uint256 minimumStakeAmount, + uint256 maximumStakeAmount, + uint64 minimumStakeDuration, + IRewardCalculator rewardCalculator, IERC20 token ) internal onlyInitializing { - __StakingManager_init(settings); + __POS_Validator_Manager_init( + settings, + minimumStakeAmount, + maximumStakeAmount, + minimumStakeDuration, + rewardCalculator + ); __ERC20TokenStakingManager_init_unchained(token); } @@ -78,7 +105,8 @@ contract ERC20TokenStakingManager is Initializable, StakingManager, IERC20TokenS uint64 registrationExpiry, bytes memory signature ) external override returns (bytes32 validationID) { - return _initializeValidatorRegistration(nodeID, stakeAmount, registrationExpiry, signature); + uint64 weight = _processStake(stakeAmount); + return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, signature); } // Must be guarded with reentrancy guard for safe transfer from diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index a57f2354d..5f7095b65 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -7,12 +7,18 @@ pragma solidity 0.8.25; import {INativeTokenStakingManager} from "./interfaces/INativeTokenStakingManager.sol"; import {Address} from "@openzeppelin/contracts@5.0.2/utils/Address.sol"; -import {StakingManager, StakingManagerSettings} from "./StakingManager.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 {ValidatorManagerSettings} from "./interfaces/IValidatorManager.sol"; +import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; -contract NativeTokenStakingManager is Initializable, StakingManager, INativeTokenStakingManager { +contract NativeTokenStakingManager is + Initializable, + PoSValidatorManager, + INativeTokenStakingManager +{ using Address for address payable; constructor(ICMInitializable init) { @@ -22,16 +28,29 @@ contract NativeTokenStakingManager is Initializable, StakingManager, INativeToke } // solhint-disable ordering - function initialize(StakingManagerSettings calldata settings) external initializer { - __NativeTokenStakingManager_init(settings); + function initialize( + ValidatorManagerSettings calldata settings, + uint256 minimumStakeAmount, + uint256 maximumStakeAmount, + uint64 minimumStakeDuration, + IRewardCalculator rewardCalculator + ) external initializer { + __NativeTokenStakingManager_init( + settings, minimumStakeAmount, maximumStakeAmount, minimumStakeDuration, rewardCalculator + ); } // solhint-disable-next-line func-name-mixedcase - function __NativeTokenStakingManager_init(StakingManagerSettings calldata settings) - internal - onlyInitializing - { - __StakingManager_init(settings); + function __NativeTokenStakingManager_init( + ValidatorManagerSettings calldata settings, + uint256 minimumStakeAmount, + uint256 maximumStakeAmount, + uint64 minimumStakeDuration, + IRewardCalculator rewardCalculator + ) internal onlyInitializing { + __POS_Validator_Manager_init( + settings, minimumStakeAmount, maximumStakeAmount, minimumStakeDuration, rewardCalculator + ); } // solhint-disable-next-line func-name-mixedcase, no-empty-blocks @@ -53,10 +72,11 @@ contract NativeTokenStakingManager is Initializable, StakingManager, INativeToke uint64 registrationExpiry, bytes memory signature ) external payable returns (bytes32) { - return _initializeValidatorRegistration(nodeID, msg.value, registrationExpiry, signature); + uint64 weight = _processStake(msg.value); + return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, signature); } - // solhint-enable ordering + // solhint-enable ordering function _lock(uint256 value) internal virtual override returns (uint256) { return value; } diff --git a/contracts/staking/PoAValidatorManager.sol b/contracts/staking/PoAValidatorManager.sol index 8deab7e54..ed2ccfaaa 100644 --- a/contracts/staking/PoAValidatorManager.sol +++ b/contracts/staking/PoAValidatorManager.sol @@ -6,13 +6,13 @@ pragma solidity 0.8.25; import {IPoAValidatorManager} from "./interfaces/IPoAValidatorManager.sol"; -import {StakingManager} from "./StakingManager.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; import {ICMInitializable} from "../utilities/ICMInitializable.sol"; -import {StakingManager, ValidatorManagerSettings} from "./StakingManager.sol"; +import {ValidatorManagerSettings} from "./interfaces/IValidatorManager.sol"; +import {ValidatorManager} from "./ValidatorManager.sol"; -contract PoAStakingManager is IPoAValidatorManager, StakingManager, OwnableUpgradeable { +contract PoAStakingManager is IPoAValidatorManager, ValidatorManager, OwnableUpgradeable { constructor(ICMInitializable init) { if (init == ICMInitializable.Disallowed) { _disableInitializers(); @@ -31,7 +31,7 @@ contract PoAStakingManager is IPoAValidatorManager, StakingManager, OwnableUpgra ValidatorManagerSettings calldata settings, address initialOwner ) internal onlyInitializing { - __StakingManager_init(settings); + __ValidatorManager_init(settings); __Ownable_init(initialOwner); __PoAStakingManager_init_unchained(); } @@ -42,7 +42,7 @@ contract PoAStakingManager is IPoAValidatorManager, StakingManager, OwnableUpgra // solhint-enable func-name-mixedcase function initializeValidatorRegistration( - uint256 weight, + uint64 weight, bytes32 nodeID, uint64 registrationExpiry, bytes memory signature @@ -54,11 +54,4 @@ contract PoAStakingManager is IPoAValidatorManager, StakingManager, OwnableUpgra function initializeEndValidation(bytes32 validationID) external override { _initializeEndValidation(validationID, 0); } - - function _lock(uint256 value) internal virtual override returns (uint256) { - return value; - } - - // solhint-disable-next-line no-empty-blocks - function _unlock(uint256 value, address to) internal virtual override {} } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 8d0530160..267dd8625 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -6,13 +6,68 @@ pragma solidity 0.8.25; import {IPoSValidatorManager} from "./interfaces/IPoSValidatorManager.sol"; -import {StakingManager} from "./StakingManager.sol"; +import {ValidatorManagerSettings} from "./interfaces/IValidatorManager.sol"; +import {ValidatorManager} from "./ValidatorManager.sol"; import {ICMInitializable} from "../utilities/ICMInitializable.sol"; import {WarpMessage} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; -import {StakingMessages} from "./StakingMessages.sol"; +import {ValidatorMessages} from "./ValidatorMessages.sol"; +import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; + +abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager { + // solhint-disable private-vars-leading-underscore + /// @custom:storage-location erc7201:avalanche-icm.storage.PoSValidatorManager + struct PoSValidatorManagerStorage { + uint256 _minimumStakeAmount; + uint256 _maximumStakeAmount; + uint64 _minimumStakeDuration; + IRewardCalculator _rewardCalculator; + } + // solhint-enable private-vars-leading-underscore + + // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.PoSValidatorManager")) - 1)) & ~bytes32(uint256(0xff)); + // TODO: Unit test for storage slot and update slot + bytes32 private constant _POS_VALIDATOR_MANAGER_STORAGE_LOCATION = + 0xafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600; + + // solhint-disable ordering + function _getPoSValidatorManagerStorage() + private + pure + returns (PoSValidatorManagerStorage storage $) + { + // solhint-disable-next-line no-inline-assembly + assembly { + $.slot := _POS_VALIDATOR_MANAGER_STORAGE_LOCATION + } + } + + function __POS_Validator_Manager_init( + ValidatorManagerSettings calldata settings, + uint256 minimumStakeAmount, + uint256 maximumStakeAmount, + uint64 minimumStakeDuration, + IRewardCalculator rewardCalculator + ) internal onlyInitializing { + __ValidatorManager_init(settings); + __POS_Validator_Manager_init_unchained( + minimumStakeAmount, maximumStakeAmount, minimumStakeDuration, rewardCalculator + ); + } + + function __POS_Validator_Manager_init_unchained( + uint256 minimumStakeAmount, + uint256 maximumStakeAmount, + uint64 minimumStakeDuration, + IRewardCalculator rewardCalculator + ) internal onlyInitializing { + PoSValidatorManagerStorage storage s = _getPoSValidatorManagerStorage(); + s._minimumStakeAmount = minimumStakeAmount; + s._maximumStakeAmount = maximumStakeAmount; + s._minimumStakeDuration = minimumStakeDuration; + s._rewardCalculator = rewardCalculator; + } -abstract contract PoSValidatorManager is IPoSValidatorManager, StakingManager { function initializeEndValidation( bytes32 validationID, bool includeUptimeProof, @@ -34,7 +89,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, StakingManager { ); (bytes32 uptimeValidationID, uint64 uptime) = - StakingMessages.unpackValidationUptimeMessage(warpMessage.payload); + ValidatorMessages.unpackValidationUptimeMessage(warpMessage.payload); require( validationID == uptimeValidationID, "StakingManager: Invalid uptime validation ID" ); @@ -42,4 +97,30 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, StakingManager { } _initializeEndValidation(validationID, uptimeSeconds); } + + function _processStake(uint256 stakeAmount) internal virtual returns (uint64) { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + // Lock the stake in the contract. + uint256 lockedValue = _lock(stakeAmount); + + // Ensure the stake churn doesn't exceed the maximum churn rate. + uint64 weight = valueToWeight(lockedValue); + // Ensure the weight is within the valid range. + require( + weight >= $._minimumStakeAmount && weight <= $._maximumStakeAmount, + "PoSValidatorManager: Invalid stake amount" + ); + return weight; + } + + function valueToWeight(uint256 value) public pure returns (uint64) { + return uint64(value / 1e12); + } + + function weightToValue(uint64 weight) public pure returns (uint256) { + return uint256(weight) * 1e12; + } + + function _lock(uint256 value) internal virtual returns (uint256); + function _unlock(uint256 value, address to) internal virtual; } diff --git a/contracts/staking/StakingManager.sol b/contracts/staking/ValidatorManager.sol similarity index 74% rename from contracts/staking/StakingManager.sol rename to contracts/staking/ValidatorManager.sol index 42c40596c..1b79c55fa 100644 --- a/contracts/staking/StakingManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -18,7 +18,7 @@ import { } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/utils/ReentrancyGuardUpgradeable.sol"; -import {StakingMessages} from "./StakingMessages.sol"; +import {ValidatorMessages} from "./ValidatorMessages.sol"; import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/utils/ContextUpgradeable.sol"; @@ -26,21 +26,17 @@ import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; // TODO: rename validatormanager -abstract contract StakingManager is +abstract contract ValidatorManager is Initializable, ContextUpgradeable, ReentrancyGuardUpgradeable, IValidatorManager { // solhint-disable private-vars-leading-underscore - /// @custom:storage-location erc7201:avalanche-icm.storage.StakingManager - struct StakingManagerStorage { + /// @custom:storage-location erc7201:avalanche-icm.storage.ValidatorManager + struct ValidatorManagerStorage { bytes32 _pChainBlockchainID; bytes32 _subnetID; - uint256 _minimumStakeAmount; - uint256 _maximumStakeAmount; - uint64 _minimumStakeDuration; - IRewardCalculator _rewardCalculator; uint8 _maximumHourlyChurn; ValidatorChurnPeriod _churnTracker; // Maps the validationID to the registration message such that the message can be re-sent if needed. @@ -52,16 +48,20 @@ abstract contract StakingManager is } // solhint-enable private-vars-leading-underscore - // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.StakingManager")) - 1)) & ~bytes32(uint256(0xff)); - // TODO: Unit test for storage slot - bytes32 private constant _STAKING_MANAGER_STORAGE_LOCATION = + // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.ValidatorManager")) - 1)) & ~bytes32(uint256(0xff)); + // TODO: Unit test for storage slot and update slot + bytes32 private constant _VALIDATOR_MANAGER_STORAGE_LOCATION = 0xafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600; // solhint-disable ordering - function _getStakingManagerStorage() private pure returns (StakingManagerStorage storage $) { + function _getValidatorManagerStorage() + private + pure + returns (ValidatorManagerStorage storage $) + { // solhint-disable-next-line no-inline-assembly assembly { - $.slot := _STAKING_MANAGER_STORAGE_LOCATION + $.slot := _VALIDATOR_MANAGER_STORAGE_LOCATION } } @@ -72,28 +72,24 @@ abstract contract StakingManager is IWarpMessenger(0x0200000000000000000000000000000000000005); // solhint-disable-next-line func-name-mixedcase - function __StakingManager_init(ValidatorManagerSettings calldata settings) + function __ValidatorManager_init(ValidatorManagerSettings calldata settings) internal onlyInitializing { __ReentrancyGuard_init(); __Context_init(); - __StakingManager_init_unchained(settings); + __ValidatorManager_init_unchained(settings); } // solhint-disable-next-line func-name-mixedcase - function __StakingManager_init_unchained(ValidatorManagerSettings calldata settings) + function __ValidatorManager_init_unchained(ValidatorManagerSettings calldata settings) internal onlyInitializing { - StakingManagerStorage storage $ = _getStakingManagerStorage(); + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); $._pChainBlockchainID = settings.pChainBlockchainID; $._subnetID = settings.subnetID; - $._minimumStakeAmount = settings.minimumStakeAmount; - $._maximumStakeAmount = settings.maximumStakeAmount; - $._minimumStakeDuration = settings.minimumStakeDuration; $._maximumHourlyChurn = settings.maximumHourlyChurn; - $._rewardCalculator = settings.rewardCalculator; } /** @@ -109,44 +105,35 @@ abstract contract StakingManager is */ function _initializeValidatorRegistration( bytes32 nodeID, - uint256 value, + uint64 weight, uint64 registrationExpiry, bytes memory signature ) internal nonReentrant returns (bytes32) { - StakingManagerStorage storage $ = _getStakingManagerStorage(); + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Ensure the registration expiry is in a valid range. require( registrationExpiry > block.timestamp && block.timestamp + 2 days > registrationExpiry, - "StakingManager: Invalid registration expiry" + "ValidatorManager: Invalid registration expiry" ); // Ensure the nodeID is not the zero address, and is not already an active validator. - require(nodeID != bytes32(0), "StakingManager: Invalid node ID"); - require($._activeValidators[nodeID] == bytes32(0), "StakingManager: Node ID already active"); + require(nodeID != bytes32(0), "ValidatorManager: Invalid node ID"); + require( + $._activeValidators[nodeID] == bytes32(0), "ValidatorManager: Node ID already active" + ); // Ensure the signature is the proper length. The EVM does not provide an Ed25519 precompile to // validate the signature, but the P-Chain will validate the signature. If the signature is invalid, // the P-Chain will reject the registration, and the stake can be returned to the staker after the registration // expiry has passed. - require(signature.length == 64, "StakingManager: Invalid signature length"); - - // Lock the stake in the contract. - uint256 lockedValue = _lock(value); + require(signature.length == 64, "ValidatorManager: Invalid signature length"); - // Ensure the stake churn doesn't exceed the maximum churn rate. - uint64 weight = valueToWeight(lockedValue); _checkAndUpdateChurnTracker(weight); - // Ensure the weight is within the valid range. - require( - weight >= $._minimumStakeAmount && weight <= $._maximumStakeAmount, - "StakingManager: Invalid stake amount" - ); - - (bytes32 validationID, bytes memory registerSubnetValidatorMessage) = StakingMessages + (bytes32 validationID, bytes memory registerSubnetValidatorMessage) = ValidatorMessages .packRegisterSubnetValidatorMessage( - StakingMessages.ValidationInfo({ + ValidatorMessages.ValidationInfo({ subnetID: $._subnetID, nodeID: nodeID, weight: weight, @@ -180,11 +167,11 @@ abstract contract StakingManager is * Only necessary if the original message can't be delivered due to validator churn. */ function resendRegisterValidatorMessage(bytes32 validationID) external { - StakingManagerStorage storage $ = _getStakingManagerStorage(); + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); require( $._pendingRegisterValidationMessages[validationID].length > 0 && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, - "StakingManager: Invalid validation ID" + "ValidatorManager: Invalid validation ID" ); // Submit the message to the Warp precompile. @@ -197,27 +184,27 @@ abstract contract StakingManager is * @param messageIndex The index of the Warp message to be received providing the acknowledgement. */ function completeValidatorRegistration(uint32 messageIndex) external { - StakingManagerStorage storage $ = _getStakingManagerStorage(); + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "StakingManager: Invalid warp message"); + require(valid, "ValidatorManager: Invalid warp message"); require( warpMessage.sourceChainID == $._pChainBlockchainID, - "StakingManager: Invalid source chain ID" + "ValidatorManager: Invalid source chain ID" ); require( warpMessage.originSenderAddress == address(0), - "StakingManager: Invalid origin sender address" + "ValidatorManager: Invalid origin sender address" ); (bytes32 validationID, bool validRegistration) = - StakingMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); - require(validRegistration, "StakingManager: Registration not valid"); + ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); + require(validRegistration, "ValidatorManager: Registration not valid"); require( $._pendingRegisterValidationMessages[validationID].length > 0 && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, - "StakingManager: Invalid validation ID" + "ValidatorManager: Invalid validation ID" ); delete $._pendingRegisterValidationMessages[validationID]; @@ -239,12 +226,14 @@ abstract contract StakingManager is bytes32 validationID, uint64 uptimeSeconds ) internal virtual { - StakingManagerStorage storage $ = _getStakingManagerStorage(); + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Ensure the validation period is active. Validator memory validator = $._validationPeriods[validationID]; - require(validator.status == ValidatorStatus.Active, "StakingManager: Validator not active"); - require(_msgSender() == validator.owner, "StakingManager: Sender not validator owner"); + require( + validator.status == ValidatorStatus.Active, "ValidatorManager: Validator not active" + ); + require(_msgSender() == validator.owner, "ValidatorManager: Sender not validator owner"); // Check that removing this validator would not exceed the maximum churn rate. _checkAndUpdateChurnTracker(validator.weight); @@ -263,9 +252,8 @@ abstract contract StakingManager is $._validationPeriods[validationID] = validator; // Submit the message to the Warp precompile. - bytes memory setValidatorWeightPayload = StakingMessages.packSetSubnetValidatorWeightMessage( - validationID, validator.messageNonce, 0 - ); + bytes memory setValidatorWeightPayload = ValidatorMessages + .packSetSubnetValidatorWeightMessage(validationID, validator.messageNonce, 0); bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); // Emit the event to signal the start of the validator removal process. @@ -280,17 +268,16 @@ abstract contract StakingManager is */ // solhint-disable-next-line function resendEndValidatorMessage(bytes32 validationID) external { - StakingManagerStorage storage $ = _getStakingManagerStorage(); + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); Validator memory validator = $._validationPeriods[validationID]; require( validator.status == ValidatorStatus.PendingRemoved, - "StakingManager: Validator not pending removal" + "ValidatorManager: Validator not pending removal" ); - bytes memory setValidatorWeightPayload = StakingMessages.packSetSubnetValidatorWeightMessage( - validationID, validator.messageNonce, 0 - ); + bytes memory setValidatorWeightPayload = ValidatorMessages + .packSetSubnetValidatorWeightMessage(validationID, validator.messageNonce, 0); WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); } @@ -305,31 +292,31 @@ abstract contract StakingManager is * a validation period. */ function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) external { - StakingManagerStorage storage $ = _getStakingManagerStorage(); + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Get the Warp message. (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "StakingManager: Invalid warp message"); + require(valid, "ValidatorManager: Invalid warp message"); bytes32 validationID; if (setWeightMessageType) { uint64 weight; (validationID,, weight) = - StakingMessages.unpackSetSubnetValidatorWeightMessage(warpMessage.payload); - require(weight == 0, "StakingManager: Weight must be 0"); + ValidatorMessages.unpackSetSubnetValidatorWeightMessage(warpMessage.payload); + require(weight == 0, "ValidatorManager: Weight must be 0"); } else { bool validRegistration; (validationID, validRegistration) = - StakingMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); - require(!validRegistration, "StakingManager: Registration still valid"); + ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); + require(!validRegistration, "ValidatorManager: Registration still valid"); } // Note: The validation status is not necessarily PendingRemoved here. It could be PendingAdded if the // registration was never successfully registered on the P-Chain, or it could be Active if the validator // removed themselves directly on the P-Chain without going through the contract. Validator memory validator = $._validationPeriods[validationID]; - require(_msgSender() == validator.owner, "StakingManager: Sender not validator owner"); + require(_msgSender() == validator.owner, "ValidatorManager: Sender not validator owner"); ValidatorStatus endStatus; if ( @@ -359,7 +346,7 @@ abstract contract StakingManager is * the function will update the churn tracker with the new amount. */ function _checkAndUpdateChurnTracker(uint64 amount) private { - StakingManagerStorage storage $ = _getStakingManagerStorage(); + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); if ($._maximumHourlyChurn == 0) { return; } @@ -376,19 +363,8 @@ abstract contract StakingManager is uint8 churnPercentage = uint8((churnTracker.churnAmount * 100) / churnTracker.initialStake); require( churnPercentage <= $._maximumHourlyChurn, - "StakingManager: Maximum hourly churn rate exceeded" + "ValidatorManager: Maximum hourly churn rate exceeded" ); $._churnTracker = churnTracker; } - - function valueToWeight(uint256 value) public pure returns (uint64) { - return uint64(value / 1e12); - } - - function weightToValue(uint64 weight) public pure returns (uint256) { - return uint256(weight) * 1e12; - } - - function _lock(uint256 value) internal virtual returns (uint256); - function _unlock(uint256 value, address to) internal virtual; } diff --git a/contracts/staking/StakingMessages.sol b/contracts/staking/ValidatorMessages.sol similarity index 95% rename from contracts/staking/StakingMessages.sol rename to contracts/staking/ValidatorMessages.sol index d9072f205..497bbceae 100644 --- a/contracts/staking/StakingMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -4,7 +4,7 @@ // SPDX-License-Identifier: Ecosystem pragma solidity 0.8.25; -library StakingMessages { +library ValidatorMessages { // The information that uniquely identifies a subnet validation period. // The SHA-256 hash of the concatenation of these field is the validationID. struct ValidationInfo { @@ -84,7 +84,7 @@ library StakingMessages { pure returns (ValidationInfo memory) { - require(input.length == 148, "StakingMessages: Invalid message length"); + require(input.length == 148, "ValidatorMessages: Invalid message length"); // Unpack the type ID uint32 typeID; @@ -93,7 +93,7 @@ library StakingMessages { } require( typeID == SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID, - "StakingMessages: Invalid message type" + "ValidatorMessages: Invalid message type" ); // Unpack the subnet ID @@ -184,7 +184,7 @@ library StakingMessages { pure returns (bytes32, bool) { - require(input.length == 37, "StakingMessages: Invalid message length"); + require(input.length == 37, "ValidatorMessages: Invalid message length"); // Unpack the type ID uint32 typeID; @@ -193,7 +193,7 @@ library StakingMessages { } require( typeID == SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID, - "StakingMessages: Invalid message type" + "ValidatorMessages: Invalid message type" ); // Unpack the validation ID. @@ -265,7 +265,7 @@ library StakingMessages { pure returns (bytes32, uint64, uint64) { - require(input.length == 52, "StakingMessages: Invalid message length"); + require(input.length == 52, "ValidatorMessages: Invalid message length"); // Unpack the type ID. uint32 typeID; @@ -274,7 +274,7 @@ library StakingMessages { } require( typeID == SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID, - "StakingMessages: Invalid message type" + "ValidatorMessages: Invalid message type" ); // Unpack the validation ID. @@ -347,7 +347,7 @@ library StakingMessages { pure returns (bytes32, uint64) { - require(input.length == 44, "StakingMessages: Invalid message length"); + require(input.length == 44, "ValidatorMessages: Invalid message length"); // Unpack the type ID. uint32 typeID; @@ -355,7 +355,7 @@ library StakingMessages { typeID |= uint32(uint8(input[i])) << uint32((8 * (3 - i))); } require( - typeID == VALIDATION_UPTIME_MESSAGE_TYPE_ID, "StakingMessages: Invalid message type" + typeID == VALIDATION_UPTIME_MESSAGE_TYPE_ID, "ValidatorMessages: Invalid message type" ); // Unpack the validation ID. @@ -399,7 +399,9 @@ library StakingMessages { pure returns (bytes32, bytes memory) { - require(validationInfo.signature.length == 64, "StakingMessages: Invalid signature length"); + require( + validationInfo.signature.length == 64, "ValidatorMessages: Invalid signature length" + ); bytes memory res = new bytes(144); // Pack the subnetID for (uint256 i; i < 32; ++i) { @@ -436,7 +438,7 @@ library StakingMessages { pure returns (ValidationInfo memory) { - require(input.length == 144, "StakingMessages: Invalid message length"); + require(input.length == 144, "ValidatorMessages: Invalid message length"); // Unpack the subnetID bytes32 subnetID; diff --git a/contracts/staking/interfaces/IPoAValidatorManager.sol b/contracts/staking/interfaces/IPoAValidatorManager.sol index c58521718..93a6dc2b7 100644 --- a/contracts/staking/interfaces/IPoAValidatorManager.sol +++ b/contracts/staking/interfaces/IPoAValidatorManager.sol @@ -14,7 +14,7 @@ interface IPoAValidatorManager is IValidatorManager { * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. */ function initializeValidatorRegistration( - uint256 weight, + uint64 weight, bytes32 nodeID, uint64 registrationExpiry, bytes memory signature diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index c06307666..2430cc80a 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -7,7 +7,7 @@ pragma solidity 0.8.25; import {IValidatorManager} from "./IValidatorManager.sol"; -interface IPoSValidatorManager is IStakingManager { +interface IPoSValidatorManager 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. diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index e55efc6b1..3a9e478c0 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -38,12 +38,7 @@ struct ValidatorChurnPeriod { struct ValidatorManagerSettings { bytes32 pChainBlockchainID; bytes32 subnetID; - // TODO move staking parametesr outside of settings to constructor of PoS - uint256 minimumStakeAmount; - uint256 maximumStakeAmount; - uint64 minimumStakeDuration; uint8 maximumHourlyChurn; - IRewardCalculator rewardCalculator; } interface IValidatorManager { diff --git a/contracts/staking/tests/StakingManagerTests.t.sol b/contracts/staking/tests/StakingManagerTests.t.sol index 171fad73a..f67c4b8b1 100644 --- a/contracts/staking/tests/StakingManagerTests.t.sol +++ b/contracts/staking/tests/StakingManagerTests.t.sol @@ -6,9 +6,12 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; -import {StakingManager} from "../StakingManager.sol"; -import {StakingMessages} from "../StakingMessages.sol"; -import {IWarpMessenger, WarpMessage} from "../StakingManager.sol"; +import {StakingManager} from "../ValidatorManager.sol"; +import {ValidatorMessages} from "../ValidatorMessages.sol"; +import { + WarpMessage, + IWarpMessenger +} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks @@ -94,9 +97,9 @@ abstract contract StakingManagerTest is Test { DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE ); - (, bytes memory registerSubnetValidatorMessage) = StakingMessages + (, bytes memory registerSubnetValidatorMessage) = ValidatorMessages .packRegisterSubnetValidatorMessage( - StakingMessages.ValidationInfo({ + ValidatorMessages.ValidationInfo({ subnetID: DEFAULT_SUBNET_ID, nodeID: DEFAULT_NODE_ID, weight: DEFAULT_WEIGHT, @@ -150,7 +153,7 @@ abstract contract StakingManagerTest is Test { completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); bytes memory setValidatorWeightPayload = - StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); stakingManager.resendEndValidatorMessage(validationID); } @@ -167,7 +170,7 @@ abstract contract StakingManagerTest is Test { }); bytes memory subnetValidatorRegistrationMessage = - StakingMessages.packSubnetValidatorRegistrationMessage(validationID, false); + ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); @@ -189,7 +192,7 @@ abstract contract StakingManagerTest is Test { }); bytes memory setSubnetValidatorWeightMessage = - StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); _mockGetVerifiedWarpMessage(setSubnetValidatorWeightMessage, true); @@ -226,8 +229,8 @@ abstract contract StakingManagerTest is Test { uint64 registrationExpiry, bytes memory signature ) internal returns (bytes32 validationID) { - (validationID,) = StakingMessages.packValidationInfo( - StakingMessages.ValidationInfo({ + (validationID,) = ValidatorMessages.packValidationInfo( + ValidatorMessages.ValidationInfo({ nodeID: nodeID, subnetID: subnetID, weight: weight, @@ -235,9 +238,9 @@ abstract contract StakingManagerTest is Test { signature: signature }) ); - (, bytes memory registerSubnetValidatorMessage) = StakingMessages + (, bytes memory registerSubnetValidatorMessage) = ValidatorMessages .packRegisterSubnetValidatorMessage( - StakingMessages.ValidationInfo({ + ValidatorMessages.ValidationInfo({ subnetID: subnetID, nodeID: nodeID, weight: weight, @@ -271,7 +274,7 @@ abstract contract StakingManagerTest is Test { nodeID, subnetID, weight, registrationExpiry, signature ); bytes memory subnetValidatorRegistrationMessage = - StakingMessages.packSubnetValidatorRegistrationMessage(validationID, true); + ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, true); _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); @@ -302,7 +305,7 @@ abstract contract StakingManagerTest is Test { vm.warp(completionTimestamp); bytes memory setValidatorWeightPayload = - StakingMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(stakingManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp, 0); diff --git a/contracts/staking/tests/StakingMessagesTests.t.sol b/contracts/staking/tests/StakingMessagesTests.t.sol index 4b3b44dd9..6bc191d20 100644 --- a/contracts/staking/tests/StakingMessagesTests.t.sol +++ b/contracts/staking/tests/StakingMessagesTests.t.sol @@ -6,7 +6,7 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; -import {StakingMessages} from "../StakingMessages.sol"; +import {ValidatorMessages} from "../ValidatorMessages.sol"; contract StakingMessagesTest is Test { bytes32 public constant DEFAULT_SUBNET_ID = @@ -22,9 +22,9 @@ contract StakingMessagesTest is Test { uint64 public constant DEFAULT_EXPIRY = 1000; function testRegisterSubnetValidatorMessage() public pure { - (bytes32 validationID, bytes memory packed) = StakingMessages + (bytes32 validationID, bytes memory packed) = ValidatorMessages .packRegisterSubnetValidatorMessage( - StakingMessages.ValidationInfo({ + ValidatorMessages.ValidationInfo({ subnetID: DEFAULT_SUBNET_ID, nodeID: DEFAULT_NODE_ID, weight: DEFAULT_WEIGHT, @@ -34,32 +34,32 @@ contract StakingMessagesTest is Test { ); StakingMessages.ValidationInfo memory info = - StakingMessages.unpackRegisterSubnetValidatorMessage(packed); + ValidatorMessages.unpackRegisterSubnetValidatorMessage(packed); assertEq(info.subnetID, DEFAULT_SUBNET_ID); assertEq(info.nodeID, DEFAULT_NODE_ID); assertEq(info.weight, DEFAULT_WEIGHT); assertEq(info.registrationExpiry, DEFAULT_EXPIRY); assertEq(info.signature, DEFAULT_ED25519_SIGNATURE); - (bytes32 recoveredID,) = StakingMessages.packValidationInfo(info); + (bytes32 recoveredID,) = ValidatorMessages.packValidationInfo(info); assertEq(recoveredID, validationID); } function testSubnetValidatorRegistrationMessage() public pure { bytes memory packed = - StakingMessages.packSubnetValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); + ValidatorMessages.packSubnetValidatorRegistrationMessage(DEFAULT_VALIDATION_ID, true); (bytes32 validationID, bool valid) = - StakingMessages.unpackSubnetValidatorRegistrationMessage(packed); + ValidatorMessages.unpackSubnetValidatorRegistrationMessage(packed); assertEq(validationID, DEFAULT_VALIDATION_ID); assert(valid); } function testSetSubnetValidatorWeightMessage() public pure { - bytes memory packed = StakingMessages.packSetSubnetValidatorWeightMessage( + bytes memory packed = ValidatorMessages.packSetSubnetValidatorWeightMessage( DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT ); (bytes32 validationID, uint64 nonce, uint64 weight) = - StakingMessages.unpackSetSubnetValidatorWeightMessage(packed); + ValidatorMessages.unpackSetSubnetValidatorWeightMessage(packed); assertEq(validationID, DEFAULT_VALIDATION_ID); assertEq(nonce, 100); assertEq(weight, DEFAULT_WEIGHT); @@ -67,16 +67,16 @@ contract StakingMessagesTest is Test { function testValidationUptimeMessage() public pure { bytes memory packed = - StakingMessages.packValidationUptimeMessage(DEFAULT_VALIDATION_ID, 100); + ValidatorMessages.packValidationUptimeMessage(DEFAULT_VALIDATION_ID, 100); (bytes32 validationID, uint64 uptime) = - StakingMessages.unpackValidationUptimeMessage(packed); + ValidatorMessages.unpackValidationUptimeMessage(packed); assertEq(validationID, DEFAULT_VALIDATION_ID); assertEq(uptime, 100); } function testValidationInfo() public pure { - (, bytes memory packed) = StakingMessages.packValidationInfo( - StakingMessages.ValidationInfo({ + (, bytes memory packed) = ValidatorMessages.packValidationInfo( + ValidatorMessages.ValidationInfo({ subnetID: DEFAULT_SUBNET_ID, nodeID: DEFAULT_NODE_ID, weight: DEFAULT_WEIGHT, @@ -84,7 +84,7 @@ contract StakingMessagesTest is Test { signature: DEFAULT_ED25519_SIGNATURE }) ); - StakingMessages.ValidationInfo memory info = StakingMessages.unpackValidationInfo(packed); + StakingMessages.ValidationInfo memory info = ValidatorMessages.unpackValidationInfo(packed); assertEq(info.subnetID, DEFAULT_SUBNET_ID); assertEq(info.nodeID, DEFAULT_NODE_ID); assertEq(info.weight, DEFAULT_WEIGHT); From b0cfe832879e21785a8762fc14c0d46064e13a1b Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 16 Aug 2024 13:49:02 -0400 Subject: [PATCH 086/545] remove todos --- contracts/staking/ValidatorManager.sol | 1 - contracts/staking/interfaces/IValidatorManager.sol | 3 --- 2 files changed, 4 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 1b79c55fa..45835aeed 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -25,7 +25,6 @@ import {ContextUpgradeable} from import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; -// TODO: rename validatormanager abstract contract ValidatorManager is Initializable, ContextUpgradeable, diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 3a9e478c0..566b97ce2 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -5,9 +5,6 @@ pragma solidity 0.8.25; -// TODO: remove reward calculator from settings -import {IRewardCalculator} from "./IRewardCalculator.sol"; - enum ValidatorStatus { Unknown, PendingAdded, From 6cbabb6f29b2b1b1dc5ec136af453e8ca68e797a Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 16 Aug 2024 14:14:07 -0400 Subject: [PATCH 087/545] unit tests compiling --- contracts/staking/PoAValidatorManager.sol | 9 ++- .../tests/ERC20TokenStakingManagerTests.t.sol | 25 ++++---- .../NativeTokenStakingManagerTests.t.sol | 11 ++-- ...s.t.sol => PoAValidatorManagerTests.t.sol} | 35 ++++++----- .../tests/PoSValidatorManagerTests.t.sol | 42 +++++++++++++ ...ests.t.sol => ValidatorManagerTests.t.sol} | 62 +++++++------------ ...sts.t.sol => ValidatorMessagesTests.t.sol} | 6 +- 7 files changed, 107 insertions(+), 83 deletions(-) rename contracts/staking/tests/{PoAStakingManagerTests.t.sol => PoAValidatorManagerTests.t.sol} (61%) create mode 100644 contracts/staking/tests/PoSValidatorManagerTests.t.sol rename contracts/staking/tests/{StakingManagerTests.t.sol => ValidatorManagerTests.t.sol} (85%) rename contracts/staking/tests/{StakingMessagesTests.t.sol => ValidatorMessagesTests.t.sol} (95%) diff --git a/contracts/staking/PoAValidatorManager.sol b/contracts/staking/PoAValidatorManager.sol index ed2ccfaaa..03b0cf4c7 100644 --- a/contracts/staking/PoAValidatorManager.sol +++ b/contracts/staking/PoAValidatorManager.sol @@ -12,7 +12,7 @@ import {ICMInitializable} from "../utilities/ICMInitializable.sol"; import {ValidatorManagerSettings} from "./interfaces/IValidatorManager.sol"; import {ValidatorManager} from "./ValidatorManager.sol"; -contract PoAStakingManager is IPoAValidatorManager, ValidatorManager, OwnableUpgradeable { +contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableUpgradeable { constructor(ICMInitializable init) { if (init == ICMInitializable.Disallowed) { _disableInitializers(); @@ -23,21 +23,20 @@ contract PoAStakingManager is IPoAValidatorManager, ValidatorManager, OwnableUpg ValidatorManagerSettings calldata settings, address initialOwner ) external initializer { - __PoAStakingManager_init(settings, initialOwner); + __PoAValidatorManager_init(settings, initialOwner); } // solhint-disable func-name-mixedcase, ordering - function __PoAStakingManager_init( + function __PoAValidatorManager_init( ValidatorManagerSettings calldata settings, address initialOwner ) internal onlyInitializing { __ValidatorManager_init(settings); __Ownable_init(initialOwner); - __PoAStakingManager_init_unchained(); } // solhint-disable-next-line no-empty-blocks - function __PoAStakingManager_init_unchained() internal onlyInitializing {} + function __PoAValidatorManager_init_unchained() internal onlyInitializing {} // solhint-enable func-name-mixedcase diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 009f7b412..adfae26be 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -5,9 +5,9 @@ pragma solidity 0.8.25; -import {StakingManagerTest} from "./StakingManagerTests.t.sol"; +import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; -import {StakingManagerSettings} from "../interfaces/IStakingManager.sol"; +import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {ExampleERC20} from "@mocks/ExampleERC20.sol"; @@ -16,7 +16,7 @@ import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks -contract ERC20TokenStakingManagerTest is StakingManagerTest { +contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { using SafeERC20 for IERC20; ERC20TokenStakingManager public app; @@ -27,18 +27,19 @@ contract ERC20TokenStakingManagerTest is StakingManagerTest { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); token = new ExampleERC20(); app.initialize( - StakingManagerSettings({ + ValidatorManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, - rewardCalculator: IRewardCalculator(address(0)) + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN }), + DEFAULT_MINIMUM_STAKE, + DEFAULT_MAXIMUM_STAKE, + DEFAULT_MINIMUM_STAKE_DURATION, + IRewardCalculator(address(0)), token ); - stakingManager = app; + validatorManager = app; + posValidatorManager = app; } function _initializeValidatorRegistration( @@ -51,8 +52,8 @@ contract ERC20TokenStakingManagerTest is StakingManagerTest { app.initializeValidatorRegistration(stakeAmount, nodeID, registrationExpiry, signature); } - function _beforeSend(uint256 value) internal override { + function _beforeSend(uint64 weight) internal override { // ERC20 tokens need to be pre-approved - token.safeIncreaseAllowance(address(app), value); + token.safeIncreaseAllowance(address(app), app.weightToValue(weight)); } } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 6fa9bda3d..a1bede038 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -5,22 +5,22 @@ pragma solidity 0.8.25; -import {StakingManagerTest} from "./StakingManagerTests.t.sol"; +import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; -import {StakingManagerSettings} from "../interfaces/IStakingManager.sol"; +import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks -contract NativeTokenStakingManagerTest is StakingManagerTest { +contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { NativeTokenStakingManager public app; function setUp() public virtual { // Construct the object under test app = new NativeTokenStakingManager(ICMInitializable.Allowed); app.initialize( - StakingManagerSettings({ + ValidatorManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, minimumStakeAmount: DEFAULT_MINIMUM_STAKE, @@ -30,7 +30,8 @@ contract NativeTokenStakingManagerTest is StakingManagerTest { rewardCalculator: IRewardCalculator(address(0)) }) ); - stakingManager = app; + validatorManager = app; + posValidatorManager = app; } // Helpers diff --git a/contracts/staking/tests/PoAStakingManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol similarity index 61% rename from contracts/staking/tests/PoAStakingManagerTests.t.sol rename to contracts/staking/tests/PoAValidatorManagerTests.t.sol index 36278b5ef..ef9eb52e4 100644 --- a/contracts/staking/tests/PoAStakingManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -5,34 +5,30 @@ pragma solidity 0.8.25; -import {StakingManagerTest} from "./StakingManagerTests.t.sol"; -import {PoAStakingManager} from "../PoAStakingManager.sol"; +import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; +import {PoAValidatorManager} from "../PoAValidatorManager.sol"; import {ICMInitializable} from "@utilities/ICMInitializable.sol"; -import {StakingManagerSettings} from "../interfaces/IStakingManager.sol"; +import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; -contract PoAStakingManagerTest is StakingManagerTest { - PoAStakingManager public app; +contract PoAValidatorManagerTest is ValidatorManagerTest { + PoAValidatorManager public app; address public constant DEFAULT_OWNER = address(0x1); function setUp() public { - app = new PoAStakingManager(ICMInitializable.Allowed); + app = new PoAValidatorManager(ICMInitializable.Allowed); app.initialize( - StakingManagerSettings({ + ValidatorManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, - rewardCalculator: IRewardCalculator(address(0)) + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN }), address(this) ); - stakingManager = app; + validatorManager = app; } function testInvalidOwnerRegistration() public { @@ -51,12 +47,17 @@ contract PoAStakingManagerTest is StakingManagerTest { bytes32 nodeID, uint64 registrationExpiry, bytes memory signature, - uint256 stakeAmount + uint256 value ) internal virtual override returns (bytes32) { - return - app.initializeValidatorRegistration(stakeAmount, nodeID, registrationExpiry, signature); + return app.initializeValidatorRegistration( + uint64(value), nodeID, registrationExpiry, signature + ); + } + + function _initializeEndValidation(bytes32 validationID) internal virtual override { + return app.initializeEndValidation(validationID); } // solhint-disable-next-line no-empty-blocks - function _beforeSend(uint256 value) internal virtual override {} + function _beforeSend(uint64 weight) internal virtual override {} } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol new file mode 100644 index 000000000..7df71d4e5 --- /dev/null +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -0,0 +1,42 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; +import {PoSValidatorManager} from "../PoSValidatorManager.sol"; +import {ICMInitializable} from "@utilities/ICMInitializable.sol"; +import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; +import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {OwnableUpgradeable} from + "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; + +abstract contract PoSValidatorManagerTest is ValidatorManagerTest { + PoSValidatorManager public posValidatorManager; + + function testValueToWeight() public view { + uint64 w1 = posValidatorManager.valueToWeight(1e12); + uint64 w2 = posValidatorManager.valueToWeight(1e18); + uint64 w3 = posValidatorManager.valueToWeight(1e27); + + assertEq(w1, 1); + assertEq(w2, 1e6); + assertEq(w3, 1e15); + } + + function testWeightToValue() public view { + uint256 v1 = posValidatorManager.weightToValue(1); + uint256 v2 = posValidatorManager.weightToValue(1e6); + uint256 v3 = posValidatorManager.weightToValue(1e15); + + assertEq(v1, 1e12); + assertEq(v2, 1e18); + assertEq(v3, 1e27); + } + + function _initializeEndValidation(bytes32 validationID) internal virtual override { + return posValidatorManager.initializeEndValidation(validationID, false, 0); + } +} diff --git a/contracts/staking/tests/StakingManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol similarity index 85% rename from contracts/staking/tests/StakingManagerTests.t.sol rename to contracts/staking/tests/ValidatorManagerTests.t.sol index f67c4b8b1..7e995e970 100644 --- a/contracts/staking/tests/StakingManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -6,7 +6,7 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; -import {StakingManager} from "../ValidatorManager.sol"; +import {ValidatorManager} from "../ValidatorManager.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; import { WarpMessage, @@ -15,7 +15,7 @@ import { // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks -abstract contract StakingManagerTest is Test { +abstract contract ValidatorManagerTest is Test { bytes32 public constant P_CHAIN_BLOCKCHAIN_ID = bytes32(hex"0000000000000000000000000000000000000000000000000000000000000000"); bytes32 public constant DEFAULT_SUBNET_ID = @@ -36,7 +36,7 @@ abstract contract StakingManagerTest is Test { uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = 2000; - StakingManager public stakingManager; + ValidatorManager public validatorManager; event ValidationPeriodCreated( bytes32 indexed validationID, @@ -86,8 +86,8 @@ abstract contract StakingManagerTest is Test { // TODO: implement } - // The following tests call functions that are implemented in StakingManager, but access state that's - // only set in NativeTokenStakingManager. Therefore we call them via the concrete type, rather than a + // The following tests call functions that are implemented in ValidatorManager, but access state that's + // only set in NativeTokenValidatorManager. Therefore we call them via the concrete type, rather than a // reference to the abstract type. function testResendRegisterValidatorMessage() public { bytes32 validationID = _setUpInitializeValidatorRegistration( @@ -108,7 +108,7 @@ abstract contract StakingManagerTest is Test { }) ); _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); - stakingManager.resendRegisterValidatorMessage(validationID); + validatorManager.resendRegisterValidatorMessage(validationID); } function testCompleteValidatorRegistration() public { @@ -155,7 +155,7 @@ abstract contract StakingManagerTest is Test { bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - stakingManager.resendEndValidatorMessage(validationID); + validatorManager.resendEndValidatorMessage(validationID); } function testCompleteEndValidation() public { @@ -174,10 +174,10 @@ abstract contract StakingManagerTest is Test { _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); - vm.expectEmit(true, true, true, true, address(stakingManager)); + vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodEnded(validationID); - stakingManager.completeEndValidation(0, false); + validatorManager.completeEndValidation(0, false); } function testCompleteEndValidationSetWeightMessageType() public { @@ -196,30 +196,10 @@ abstract contract StakingManagerTest is Test { _mockGetVerifiedWarpMessage(setSubnetValidatorWeightMessage, true); - vm.expectEmit(true, true, true, true, address(stakingManager)); + vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodEnded(validationID); - stakingManager.completeEndValidation(0, true); - } - - function testValueToWeight() public view { - uint64 w1 = stakingManager.valueToWeight(1e12); - uint64 w2 = stakingManager.valueToWeight(1e18); - uint64 w3 = stakingManager.valueToWeight(1e27); - - assertEq(w1, 1); - assertEq(w2, 1e6); - assertEq(w3, 1e15); - } - - function testWeightToValue() public view { - uint256 v1 = stakingManager.weightToValue(1); - uint256 v2 = stakingManager.weightToValue(1e6); - uint256 v3 = stakingManager.weightToValue(1e15); - - assertEq(v1, 1e12); - assertEq(v2, 1e18); - assertEq(v3, 1e27); + validatorManager.completeEndValidation(0, true); } function _setUpInitializeValidatorRegistration( @@ -251,15 +231,13 @@ abstract contract StakingManagerTest is Test { vm.warp(DEFAULT_EXPIRY - 1); _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); - _beforeSend(stakingManager.weightToValue(weight)); - vm.expectEmit(true, true, true, true, address(stakingManager)); + _beforeSend(weight); + vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodCreated( validationID, DEFAULT_NODE_ID, bytes32(0), weight, DEFAULT_EXPIRY ); - _initializeValidatorRegistration( - nodeID, registrationExpiry, signature, stakingManager.weightToValue(weight) - ); + _initializeValidatorRegistration(nodeID, registrationExpiry, signature, weight); } function _setUpCompleteValidatorRegistration( @@ -279,10 +257,10 @@ abstract contract StakingManagerTest is Test { _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); vm.warp(registrationTimestamp); - vm.expectEmit(true, true, true, true, address(stakingManager)); + vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodRegistered(validationID, weight, registrationTimestamp); - stakingManager.completeValidatorRegistration(0); + validatorManager.completeValidatorRegistration(0); } function _setUpInitializeEndValidation( @@ -307,10 +285,10 @@ abstract contract StakingManagerTest is Test { bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - vm.expectEmit(true, true, true, true, address(stakingManager)); + vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp, 0); - stakingManager.initializeEndValidation(validationID, false, 0); + _initializeEndValidation(validationID); } function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { @@ -349,6 +327,8 @@ abstract contract StakingManagerTest is Test { uint256 stakeAmount ) internal virtual returns (bytes32); - function _beforeSend(uint256 value) internal virtual; + function _initializeEndValidation(bytes32 validationID) internal virtual; + + function _beforeSend(uint64 weight) internal virtual; } // solhint-enable no-empty-blocks diff --git a/contracts/staking/tests/StakingMessagesTests.t.sol b/contracts/staking/tests/ValidatorMessagesTests.t.sol similarity index 95% rename from contracts/staking/tests/StakingMessagesTests.t.sol rename to contracts/staking/tests/ValidatorMessagesTests.t.sol index 6bc191d20..ba0495adf 100644 --- a/contracts/staking/tests/StakingMessagesTests.t.sol +++ b/contracts/staking/tests/ValidatorMessagesTests.t.sol @@ -8,7 +8,7 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; -contract StakingMessagesTest is Test { +contract ValidatorMessagesTest is Test { bytes32 public constant DEFAULT_SUBNET_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes32 public constant DEFAULT_NODE_ID = @@ -33,7 +33,7 @@ contract StakingMessagesTest is Test { }) ); - StakingMessages.ValidationInfo memory info = + ValidatorMessages.ValidationInfo memory info = ValidatorMessages.unpackRegisterSubnetValidatorMessage(packed); assertEq(info.subnetID, DEFAULT_SUBNET_ID); assertEq(info.nodeID, DEFAULT_NODE_ID); @@ -84,7 +84,7 @@ contract StakingMessagesTest is Test { signature: DEFAULT_ED25519_SIGNATURE }) ); - StakingMessages.ValidationInfo memory info = ValidatorMessages.unpackValidationInfo(packed); + ValidatorMessages.ValidationInfo memory info = ValidatorMessages.unpackValidationInfo(packed); assertEq(info.subnetID, DEFAULT_SUBNET_ID); assertEq(info.nodeID, DEFAULT_NODE_ID); assertEq(info.weight, DEFAULT_WEIGHT); From 9e55fd394863ad1d02191b740d052dfe18d1fcd4 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 16 Aug 2024 14:15:33 -0400 Subject: [PATCH 088/545] fix extra compilation errors --- .../tests/NativeTokenStakingManagerTests.t.sol | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index a1bede038..850a69811 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -23,12 +23,12 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ValidatorManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, - rewardCalculator: IRewardCalculator(address(0)) - }) + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + DEFAULT_MINIMUM_STAKE, + DEFAULT_MAXIMUM_STAKE, + DEFAULT_MINIMUM_STAKE_DURATION, + IRewardCalculator(address(0)) ); validatorManager = app; posValidatorManager = app; @@ -46,7 +46,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ); } - function _beforeSend(uint256 value) internal override { + function _beforeSend(uint64 weight) internal override { // Native tokens no need pre approve } } From 50e878bc87953c41b329a2effc8a1895872ecdbc Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 19 Aug 2024 10:47:41 -0500 Subject: [PATCH 089/545] correct comment --- tests/flows/erc20_token_staking.go | 2 +- tests/flows/native_token_staking.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/flows/erc20_token_staking.go b/tests/flows/erc20_token_staking.go index 0ba94ea47..c65894c96 100644 --- a/tests/flows/erc20_token_staking.go +++ b/tests/flows/erc20_token_staking.go @@ -172,7 +172,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { registrationSignedMessage, ) - // Check that the validator is registered in the staking contract + // Check that the validator is has been delisted from the staking contract registrationEvent, err := utils.GetEventFromLogs( receipt.Logs, stakingManager.ParseValidationPeriodEnded, diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index 1944bb72d..01cb5adbc 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -170,7 +170,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { registrationSignedMessage, ) - // Check that the validator is registered in the staking contract + // Check that the validator is has been delisted from the staking contract registrationEvent, err := utils.GetEventFromLogs( receipt.Logs, stakingManager.ParseValidationPeriodEnded, From 09c441532019db4a4fcc738111fe2361c2ddd6bb Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Mon, 19 Aug 2024 12:25:17 -0400 Subject: [PATCH 090/545] fixing unit tests --- contracts/staking/ERC20TokenStakingManager.sol | 2 +- contracts/staking/NativeTokenStakingManager.sol | 1 + contracts/staking/PoSValidatorManager.sol | 3 ++- contracts/staking/ValidatorManager.sol | 2 +- .../staking/tests/ERC20TokenStakingManagerTests.t.sol | 7 ++++--- .../staking/tests/NativeTokenStakingManagerTests.t.sol | 4 ++-- contracts/staking/tests/PoAValidatorManagerTests.t.sol | 6 ++---- contracts/staking/tests/ValidatorManagerTests.t.sol | 2 +- 8 files changed, 14 insertions(+), 13 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index aa868aa16..a18ddbfef 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -35,7 +35,7 @@ contract ERC20TokenStakingManager is // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.ERC20TokenStakingManager")) - 1)) & ~bytes32(uint256(0xff)); // TODO: Update to correct storage slot bytes32 private constant _ERC20_STAKING_MANAGER_STORAGE_LOCATION = - 0x8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91; + 0x6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00; // solhint-disable ordering function _getERC20StakingManagerStorage() diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 5f7095b65..40c72ef3e 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -73,6 +73,7 @@ contract NativeTokenStakingManager is bytes memory signature ) external payable returns (bytes32) { uint64 weight = _processStake(msg.value); + return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, signature); } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 267dd8625..93ee1726f 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -28,7 +28,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.PoSValidatorManager")) - 1)) & ~bytes32(uint256(0xff)); // TODO: Unit test for storage slot and update slot bytes32 private constant _POS_VALIDATOR_MANAGER_STORAGE_LOCATION = - 0xafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600; + 0x4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00; // solhint-disable ordering function _getPoSValidatorManagerStorage() @@ -106,6 +106,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Ensure the stake churn doesn't exceed the maximum churn rate. uint64 weight = valueToWeight(lockedValue); // Ensure the weight is within the valid range. + require( weight >= $._minimumStakeAmount && weight <= $._maximumStakeAmount, "PoSValidatorManager: Invalid stake amount" diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 45835aeed..b34542cff 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -50,7 +50,7 @@ abstract contract ValidatorManager is // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.ValidatorManager")) - 1)) & ~bytes32(uint256(0xff)); // TODO: Unit test for storage slot and update slot bytes32 private constant _VALIDATOR_MANAGER_STORAGE_LOCATION = - 0xafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600; + 0xe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00; // solhint-disable ordering function _getValidatorManagerStorage() diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index adfae26be..9bc19d9b4 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -46,10 +46,11 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { bytes32 nodeID, uint64 registrationExpiry, bytes memory signature, - uint256 stakeAmount + uint64 weight ) internal virtual override returns (bytes32) { - return - app.initializeValidatorRegistration(stakeAmount, nodeID, registrationExpiry, signature); + return app.initializeValidatorRegistration( + app.weightToValue(weight), nodeID, registrationExpiry, signature + ); } function _beforeSend(uint64 weight) internal override { diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 850a69811..114f70e28 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -39,9 +39,9 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { bytes32 nodeID, uint64 registrationExpiry, bytes memory signature, - uint256 stakeAmount + uint64 weight ) internal virtual override returns (bytes32) { - return app.initializeValidatorRegistration{value: stakeAmount}( + return app.initializeValidatorRegistration{value: app.weightToValue(weight)}( nodeID, registrationExpiry, signature ); } diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index ef9eb52e4..43a6b4ad6 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -47,11 +47,9 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { bytes32 nodeID, uint64 registrationExpiry, bytes memory signature, - uint256 value + uint64 weight ) internal virtual override returns (bytes32) { - return app.initializeValidatorRegistration( - uint64(value), nodeID, registrationExpiry, signature - ); + return app.initializeValidatorRegistration(weight, nodeID, registrationExpiry, signature); } function _initializeEndValidation(bytes32 validationID) internal virtual override { diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 7e995e970..0a131a25c 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -324,7 +324,7 @@ abstract contract ValidatorManagerTest is Test { bytes32 nodeID, uint64 registrationExpiry, bytes memory signature, - uint256 stakeAmount + uint64 weight ) internal virtual returns (bytes32); function _initializeEndValidation(bytes32 validationID) internal virtual; From f1cf1d6a8d240db0d1581a1a29b18f70c04f7137 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Mon, 19 Aug 2024 13:21:27 -0400 Subject: [PATCH 091/545] fix lints --- .../staking/ERC20TokenStakingManager.sol | 22 ++++++++----------- contracts/staking/PoSValidatorManager.sol | 3 ++- contracts/staking/ValidatorManager.sol | 1 - .../tests/ERC20TokenStakingManagerTests.t.sol | 16 +++++++------- .../tests/PoAValidatorManagerTests.t.sol | 1 - .../tests/PoSValidatorManagerTests.t.sol | 5 ----- .../tests/ValidatorMessagesTests.t.sol | 3 ++- 7 files changed, 21 insertions(+), 30 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index a18ddbfef..870c19339 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -63,14 +63,14 @@ contract ERC20TokenStakingManager is IRewardCalculator rewardCalculator, IERC20 token ) external initializer { - __ERC20TokenStakingManager_init( - settings, - minimumStakeAmount, - maximumStakeAmount, - minimumStakeDuration, - rewardCalculator, - token - ); + __ERC20TokenStakingManager_init({ + settings: settings, + minimumStakeAmount: minimumStakeAmount, + maximumStakeAmount: maximumStakeAmount, + minimumStakeDuration: minimumStakeDuration, + rewardCalculator: rewardCalculator, + token: token + }); } // solhint-disable func-name-mixedcase @@ -83,11 +83,7 @@ contract ERC20TokenStakingManager is IERC20 token ) internal onlyInitializing { __POS_Validator_Manager_init( - settings, - minimumStakeAmount, - maximumStakeAmount, - minimumStakeDuration, - rewardCalculator + settings, minimumStakeAmount, maximumStakeAmount, minimumStakeDuration, rewardCalculator ); __ERC20TokenStakingManager_init_unchained(token); } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 93ee1726f..0f3888c94 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -8,7 +8,6 @@ pragma solidity 0.8.25; import {IPoSValidatorManager} from "./interfaces/IPoSValidatorManager.sol"; import {ValidatorManagerSettings} from "./interfaces/IValidatorManager.sol"; import {ValidatorManager} from "./ValidatorManager.sol"; -import {ICMInitializable} from "../utilities/ICMInitializable.sol"; import {WarpMessage} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; import {ValidatorMessages} from "./ValidatorMessages.sol"; @@ -42,6 +41,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager } } + // solhint-disable-next-line func-name-mixedcase function __POS_Validator_Manager_init( ValidatorManagerSettings calldata settings, uint256 minimumStakeAmount, @@ -55,6 +55,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ); } + // solhint-disable-next-line func-name-mixedcase function __POS_Validator_Manager_init_unchained( uint256 minimumStakeAmount, uint256 maximumStakeAmount, diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index b34542cff..ed01136fc 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -19,7 +19,6 @@ import { import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/utils/ReentrancyGuardUpgradeable.sol"; import {ValidatorMessages} from "./ValidatorMessages.sol"; -import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/utils/ContextUpgradeable.sol"; import {Initializable} from diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 9bc19d9b4..45d0a9bdc 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -26,18 +26,18 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { // Construct the object under test app = new ERC20TokenStakingManager(ICMInitializable.Allowed); token = new ExampleERC20(); - app.initialize( - ValidatorManagerSettings({ + app.initialize({ + settings: ValidatorManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN }), - DEFAULT_MINIMUM_STAKE, - DEFAULT_MAXIMUM_STAKE, - DEFAULT_MINIMUM_STAKE_DURATION, - IRewardCalculator(address(0)), - token - ); + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + rewardCalculator: IRewardCalculator(address(0)), + token: token + }); validatorManager = app; posValidatorManager = app; } diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index 43a6b4ad6..cd971fe51 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -9,7 +9,6 @@ import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoAValidatorManager} from "../PoAValidatorManager.sol"; import {ICMInitializable} from "@utilities/ICMInitializable.sol"; import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; -import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 7df71d4e5..2bb7e8624 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -7,11 +7,6 @@ pragma solidity 0.8.25; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; -import {ICMInitializable} from "@utilities/ICMInitializable.sol"; -import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; -import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; -import {OwnableUpgradeable} from - "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { PoSValidatorManager public posValidatorManager; diff --git a/contracts/staking/tests/ValidatorMessagesTests.t.sol b/contracts/staking/tests/ValidatorMessagesTests.t.sol index ba0495adf..7286ee9ed 100644 --- a/contracts/staking/tests/ValidatorMessagesTests.t.sol +++ b/contracts/staking/tests/ValidatorMessagesTests.t.sol @@ -84,7 +84,8 @@ contract ValidatorMessagesTest is Test { signature: DEFAULT_ED25519_SIGNATURE }) ); - ValidatorMessages.ValidationInfo memory info = ValidatorMessages.unpackValidationInfo(packed); + ValidatorMessages.ValidationInfo memory info = + ValidatorMessages.unpackValidationInfo(packed); assertEq(info.subnetID, DEFAULT_SUBNET_ID); assertEq(info.nodeID, DEFAULT_NODE_ID); assertEq(info.weight, DEFAULT_WEIGHT); From dab744aed8bc50e61cbc54746b7a9e8c983f6202 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Mon, 19 Aug 2024 13:24:40 -0400 Subject: [PATCH 092/545] nit fixes --- contracts/staking/ValidatorManager.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index ed01136fc..bb3418818 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -91,7 +91,7 @@ abstract contract ValidatorManager is } /** - * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. + * @notice Begins the validator registration process, and sets the initial weight for the validator. * @param nodeID The node ID of the validator being registered. * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. * @param signature The raw bytes of the Ed25519 signature over the concatenated bytes of @@ -343,6 +343,7 @@ abstract contract ValidatorManager is * rate for the past hour. If the churn rate is exceeded, the function will revert. If the churn rate is not exceeded, * the function will update the churn tracker with the new amount. */ + // TODO: right now implementation has reference to stake, evaluate for PoA. function _checkAndUpdateChurnTracker(uint64 amount) private { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); if ($._maximumHourlyChurn == 0) { From 726f16c5768a39dc725e08b29b49a3696cdc5f0d Mon Sep 17 00:00:00 2001 From: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Date: Tue, 20 Aug 2024 08:50:30 -0500 Subject: [PATCH 093/545] Update tests/flows/erc20_token_staking.go Co-authored-by: minghinmatthewlam Signed-off-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> --- tests/flows/erc20_token_staking.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/flows/erc20_token_staking.go b/tests/flows/erc20_token_staking.go index c65894c96..e3be47fc0 100644 --- a/tests/flows/erc20_token_staking.go +++ b/tests/flows/erc20_token_staking.go @@ -14,7 +14,7 @@ import ( ) // Registers a erc20 token staking validator on a subnet. The steps are as follows: -// - Deploy the ERCTokenStakingManager +// - Deploy the ERC20TokenStakingManager // - Initiate validator registration // - Deliver the Warp message to the P-Chain (not implemented) // - Aggregate P-Chain signatures on the response Warp message From 2ee977e671d60d09ff93799a0dbd98db4c8962fb Mon Sep 17 00:00:00 2001 From: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Date: Tue, 20 Aug 2024 08:51:51 -0500 Subject: [PATCH 094/545] Update tests/flows/erc20_token_staking.go Co-authored-by: minghinmatthewlam Signed-off-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> --- tests/flows/erc20_token_staking.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/flows/erc20_token_staking.go b/tests/flows/erc20_token_staking.go index e3be47fc0..11d7044ef 100644 --- a/tests/flows/erc20_token_staking.go +++ b/tests/flows/erc20_token_staking.go @@ -56,7 +56,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakeAmount := uint64(1e18) weight := uint64(1e6) // stakeAmount / 1e12 { - // Iniatiate validator registration + // Initiate validator registration nodeID := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} var receipt *types.Receipt From d50cf3f631d85944e675221d01614665c3f15242 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 20 Aug 2024 08:57:13 -0500 Subject: [PATCH 095/545] rename helpers --- tests/flows/erc20_token_staking.go | 8 ++++---- tests/flows/native_token_staking.go | 8 ++++---- tests/utils/staking_utils.go | 16 ++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/tests/flows/erc20_token_staking.go b/tests/flows/erc20_token_staking.go index c65894c96..03f55f404 100644 --- a/tests/flows/erc20_token_staking.go +++ b/tests/flows/erc20_token_staking.go @@ -60,7 +60,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { nodeID := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} var receipt *types.Receipt - receipt, validationID = utils.CallERC20InitializeValidatorRegistration( + receipt, validationID = utils.InitializeERC20ValidatorRegistration( fundedKey, subnetAInfo, stakeAmount, @@ -102,7 +102,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { ) // Deliver the Warp message to the subnet - receipt = utils.CallERC20CompleteValidatorRegistration( + receipt = utils.CompleteERC20ValidatorRegistration( fundedKey, subnetAInfo, stakingManagerAddress, @@ -121,7 +121,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // Delist the validator // { - receipt := utils.CallERC20InitializeEndValidation( + receipt := utils.InitializeEndERC20Validation( fundedKey, subnetAInfo, stakingManager, @@ -165,7 +165,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { ) // Deliver the Warp message to the subnet - receipt = utils.CallERC20CompleteEndValidation( + receipt = utils.CompleteEndERC20Validation( fundedKey, subnetAInfo, stakingManagerAddress, diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index 01cb5adbc..a19f662b7 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -60,7 +60,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { nodeID := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} var receipt *types.Receipt - receipt, validationID = utils.CallNativeInitializeValidatorRegistration( + receipt, validationID = utils.InitializeNativeValidatorRegistration( fundedKey, subnetAInfo, stakeAmount, @@ -100,7 +100,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { ) // Deliver the Warp message to the subnet - receipt = utils.CallNativeCompleteValidatorRegistration( + receipt = utils.CompleteNativeValidatorRegistration( fundedKey, subnetAInfo, stakingManagerContractAddress, @@ -119,7 +119,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Delist the validator // { - receipt := utils.CallNativeInitializeEndValidation( + receipt := utils.InitializeEndNativeValidation( fundedKey, subnetAInfo, stakingManager, @@ -163,7 +163,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { ) // Deliver the Warp message to the subnet - receipt = utils.CallNativeCompleteEndValidation( + receipt = utils.CompleteEndNativeValidation( fundedKey, subnetAInfo, stakingManagerContractAddress, diff --git a/tests/utils/staking_utils.go b/tests/utils/staking_utils.go index 88a3d85e5..ef4ea063b 100644 --- a/tests/utils/staking_utils.go +++ b/tests/utils/staking_utils.go @@ -144,7 +144,7 @@ func DeployAndInitializeERC20TokenStakingManager( // Function call utils // -func CallNativeInitializeValidatorRegistration( +func InitializeNativeValidatorRegistration( senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakeAmount uint64, @@ -172,7 +172,7 @@ func CallNativeInitializeValidatorRegistration( return receipt, ids.ID(registrationInitiatedEvent.ValidationID) } -func CallERC20InitializeValidatorRegistration( +func InitializeERC20ValidatorRegistration( senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakeAmount uint64, @@ -211,7 +211,7 @@ func CallERC20InitializeValidatorRegistration( return receipt, ids.ID(registrationInitiatedEvent.ValidationID) } -func CallNativeCompleteValidatorRegistration( +func CompleteNativeValidatorRegistration( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -228,7 +228,7 @@ func CallNativeCompleteValidatorRegistration( ) } -func CallERC20CompleteValidatorRegistration( +func CompleteERC20ValidatorRegistration( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -272,7 +272,7 @@ func completeValidatorRegistration( return SendTransactionAndWaitForSuccess(context.Background(), subnet, signedRegistrationTx) } -func CallNativeInitializeEndValidation( +func InitializeEndNativeValidation( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, @@ -290,7 +290,7 @@ func CallNativeInitializeEndValidation( return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) } -func CallERC20InitializeEndValidation( +func InitializeEndERC20Validation( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, @@ -308,7 +308,7 @@ func CallERC20InitializeEndValidation( return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) } -func CallNativeCompleteEndValidation( +func CompleteEndNativeValidation( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -325,7 +325,7 @@ func CallNativeCompleteEndValidation( ) } -func CallERC20CompleteEndValidation( +func CompleteEndERC20Validation( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, From e1eabfda0956837233cae60af15e12cd8a9907e6 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 20 Aug 2024 08:59:33 -0500 Subject: [PATCH 096/545] set weight via contract helper --- tests/flows/erc20_token_staking.go | 8 +++++++- tests/flows/native_token_staking.go | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/tests/flows/erc20_token_staking.go b/tests/flows/erc20_token_staking.go index 03f55f404..a2460f08e 100644 --- a/tests/flows/erc20_token_staking.go +++ b/tests/flows/erc20_token_staking.go @@ -2,11 +2,13 @@ package flows import ( "context" + "math/big" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/messages" warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" @@ -54,7 +56,11 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // var validationID ids.ID // To be used in the delisting step stakeAmount := uint64(1e18) - weight := uint64(1e6) // stakeAmount / 1e12 + weight, err := stakingManager.ValueToWeight( + &bind.CallOpts{}, + big.NewInt(int64(stakeAmount)), + ) + Expect(err).Should(BeNil()) { // Iniatiate validator registration nodeID := ids.GenerateTestID() diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index a19f662b7..f9f979ae5 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -2,11 +2,13 @@ package flows import ( "context" + "math/big" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/messages" warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" @@ -54,7 +56,11 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // var validationID ids.ID // To be used in the delisting step stakeAmount := uint64(1e18) - weight := uint64(1e6) // stakeAmount / 1e12 + weight, err := stakingManager.ValueToWeight( + &bind.CallOpts{}, + big.NewInt(int64(stakeAmount)), + ) + Expect(err).Should(BeNil()) { // Iniatiate validator registration nodeID := ids.GenerateTestID() From 5f5b74a5701b6694d6c62fe933655aae42b5797a Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 20 Aug 2024 09:01:07 -0500 Subject: [PATCH 097/545] remove utils suffix from fname --- tests/utils/{chain_utils.go => chain.go} | 0 tests/utils/{erc20_utils.go => erc20.go} | 0 tests/utils/{governance_utils.go => governance.go} | 0 tests/utils/{staking_utils.go => staking.go} | 0 tests/utils/{teleporter_utils.go => teleporter.go} | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename tests/utils/{chain_utils.go => chain.go} (100%) rename tests/utils/{erc20_utils.go => erc20.go} (100%) rename tests/utils/{governance_utils.go => governance.go} (100%) rename tests/utils/{staking_utils.go => staking.go} (100%) rename tests/utils/{teleporter_utils.go => teleporter.go} (100%) diff --git a/tests/utils/chain_utils.go b/tests/utils/chain.go similarity index 100% rename from tests/utils/chain_utils.go rename to tests/utils/chain.go diff --git a/tests/utils/erc20_utils.go b/tests/utils/erc20.go similarity index 100% rename from tests/utils/erc20_utils.go rename to tests/utils/erc20.go diff --git a/tests/utils/governance_utils.go b/tests/utils/governance.go similarity index 100% rename from tests/utils/governance_utils.go rename to tests/utils/governance.go diff --git a/tests/utils/staking_utils.go b/tests/utils/staking.go similarity index 100% rename from tests/utils/staking_utils.go rename to tests/utils/staking.go diff --git a/tests/utils/teleporter_utils.go b/tests/utils/teleporter.go similarity index 100% rename from tests/utils/teleporter_utils.go rename to tests/utils/teleporter.go From 9a485b907297f91fc532d9f577d5f0017c20737a Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 20 Aug 2024 09:11:14 -0500 Subject: [PATCH 098/545] format comment --- tests/flows/erc20_token_staking.go | 29 ++++++++++++++++------------- tests/flows/native_token_staking.go | 29 ++++++++++++++++------------- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/tests/flows/erc20_token_staking.go b/tests/flows/erc20_token_staking.go index a2460f08e..dbb106ad1 100644 --- a/tests/flows/erc20_token_staking.go +++ b/tests/flows/erc20_token_staking.go @@ -15,19 +15,22 @@ import ( . "github.com/onsi/gomega" ) -// Registers a erc20 token staking validator on a subnet. The steps are as follows: -// - Deploy the ERCTokenStakingManager -// - Initiate validator registration -// - Deliver the Warp message to the P-Chain (not implemented) -// - Aggregate P-Chain signatures on the response Warp message -// - Deliver the Warp message to the subnet -// - Verify that the validator is registered in the staking contract -// Delists the validator from the subnet. The steps are as follows: -// - Initiate validator delisting -// - Deliver the Warp message to the P-Chain (not implemented) -// - Aggregate P-Chain signatures on the response Warp message -// - Deliver the Warp message to the subnet -// - Verify that the validator is delisted from the staking contract +/* + * Registers a erc20 token staking validator on a subnet. The steps are as follows: + * - Deploy the ERCTokenStakingManager + * - Initiate validator registration + * - Deliver the Warp message to the P-Chain (not implemented) + * - Aggregate P-Chain signatures on the response Warp message + * - Deliver the Warp message to the subnet + * - Verify that the validator is registered in the staking contract + * + * Delists the validator from the subnet. The steps are as follows: + * - Initiate validator delisting + * - Deliver the Warp message to the P-Chain (not implemented) + * - Aggregate P-Chain signatures on the response Warp message + * - Deliver the Warp message to the subnet + * - Verify that the validator is delisted from the staking contract + */ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // Get the subnets info cChainInfo := network.GetPrimaryNetworkInfo() diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index f9f979ae5..dd5b44ad0 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -15,19 +15,22 @@ import ( . "github.com/onsi/gomega" ) -// Registers a native token staking validator on a subnet. The steps are as follows: -// - Deploy the NativeTokenStakingManager -// - Initiate validator registration -// - Deliver the Warp message to the P-Chain (not implemented) -// - Aggregate P-Chain signatures on the response Warp message -// - Deliver the Warp message to the subnet -// - Verify that the validator is registered in the staking contract -// Delists the validator from the subnet. The steps are as follows: -// - Initiate validator delisting -// - Deliver the Warp message to the P-Chain (not implemented) -// - Aggregate P-Chain signatures on the response Warp message -// - Deliver the Warp message to the subnet -// - Verify that the validator is delisted from the staking contract +/* + * Registers a native token staking validator on a subnet. The steps are as follows: + * - Deploy the NativeTokenStakingManager + * - Initiate validator registration + * - Deliver the Warp message to the P-Chain (not implemented) + * - Aggregate P-Chain signatures on the response Warp message + * - Deliver the Warp message to the subnet + * - Verify that the validator is registered in the staking contract + * + * Delists the validator from the subnet. The steps are as follows: + * - Initiate validator delisting + * - Deliver the Warp message to the P-Chain (not implemented) + * - Aggregate P-Chain signatures on the response Warp message + * - Deliver the Warp message to the subnet + * - Verify that the validator is delisted from the staking contract + */ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Get the subnets info cChainInfo := network.GetPrimaryNetworkInfo() From a315e0f3b06c5d44fdeca7dad04f6cfe5f839f6f Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 20 Aug 2024 09:17:28 -0500 Subject: [PATCH 099/545] (temp) warp validation helpers --- tests/flows/erc20_token_staking.go | 39 ++++++---------------- tests/flows/native_token_staking.go | 38 ++++++---------------- tests/utils/staking.go | 50 +++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 58 deletions(-) diff --git a/tests/flows/erc20_token_staking.go b/tests/flows/erc20_token_staking.go index dbb106ad1..fbd410982 100644 --- a/tests/flows/erc20_token_staking.go +++ b/tests/flows/erc20_token_staking.go @@ -6,8 +6,6 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" - warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/messages" - warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/teleporter/tests/interfaces" @@ -85,20 +83,14 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) // Validate the Warp message, (this will be done on the P-Chain in the future) - msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) - Expect(err).Should(BeNil()) - // Check that the addressed call payload is a registered Warp message type - var payloadInterface warpMessages.Payload - ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) - Expect(err).Should(BeNil()) - registerValidatorPayload, ok := payloadInterface.(*warpMessages.RegisterSubnetValidator) - Expect(ok).Should(BeTrue()) - - Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) - Expect(registerValidatorPayload.NodeID).Should(Equal(nodeID)) - Expect(registerValidatorPayload.Weight).Should(Equal(weight)) - Expect(registerValidatorPayload.SubnetID).Should(Equal(subnetAInfo.SubnetID)) - Expect(registerValidatorPayload.BlsPubKey[:]).Should(Equal(blsPublicKey[:])) + // Validate the Warp message, (this will be done on the P-Chain in the future) + utils.ValidateRegisterSubnetValidatorMessage( + signedWarpMessage, + nodeID, + weight, + subnetAInfo.SubnetID, + blsPublicKey, + ) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( @@ -148,20 +140,9 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // (Sending to the P-Chain will be skipped for now) signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) Expect(err).Should(BeNil()) - // Validate the Warp message, (this will be done on the P-Chain in the future) - msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) - Expect(err).Should(BeNil()) - // Check that the addressed call payload is a registered Warp message type - var payloadInterface warpMessages.Payload - ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) - Expect(err).Should(BeNil()) - registerValidatorPayload, ok := payloadInterface.(*warpMessages.SetSubnetValidatorWeight) - Expect(ok).Should(BeTrue()) - Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) - Expect(registerValidatorPayload.ValidationID).Should(Equal(validationID)) - Expect(registerValidatorPayload.Weight).Should(Equal(uint64(0))) - Expect(registerValidatorPayload.Nonce).Should(Equal(uint64(0))) + // Validate the Warp message, (this will be done on the P-Chain in the future) + utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 0) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index dd5b44ad0..e66602083 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -6,8 +6,6 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" - warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/messages" - warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/teleporter/tests/interfaces" @@ -83,20 +81,13 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) // Validate the Warp message, (this will be done on the P-Chain in the future) - msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) - Expect(err).Should(BeNil()) - // Check that the addressed call payload is a registered Warp message type - var payloadInterface warpMessages.Payload - ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) - Expect(err).Should(BeNil()) - registerValidatorPayload, ok := payloadInterface.(*warpMessages.RegisterSubnetValidator) - Expect(ok).Should(BeTrue()) - - Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) - Expect(registerValidatorPayload.NodeID).Should(Equal(nodeID)) - Expect(registerValidatorPayload.Weight).Should(Equal(weight)) - Expect(registerValidatorPayload.SubnetID).Should(Equal(subnetAInfo.SubnetID)) - Expect(registerValidatorPayload.BlsPubKey[:]).Should(Equal(blsPublicKey[:])) + utils.ValidateRegisterSubnetValidatorMessage( + signedWarpMessage, + nodeID, + weight, + subnetAInfo.SubnetID, + blsPublicKey, + ) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( @@ -146,20 +137,9 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // (Sending to the P-Chain will be skipped for now) signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) Expect(err).Should(BeNil()) - // Validate the Warp message, (this will be done on the P-Chain in the future) - msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) - Expect(err).Should(BeNil()) - // Check that the addressed call payload is a registered Warp message type - var payloadInterface warpMessages.Payload - ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) - Expect(err).Should(BeNil()) - registerValidatorPayload, ok := payloadInterface.(*warpMessages.SetSubnetValidatorWeight) - Expect(ok).Should(BeTrue()) - Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) - Expect(registerValidatorPayload.ValidationID).Should(Equal(validationID)) - Expect(registerValidatorPayload.Weight).Should(Equal(uint64(0))) - Expect(registerValidatorPayload.Nonce).Should(Equal(uint64(0))) + // Validate the Warp message, (this will be done on the P-Chain in the future) + utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 0) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( diff --git a/tests/utils/staking.go b/tests/utils/staking.go index ef4ea063b..8be531e5c 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -401,3 +401,53 @@ func ConstructSubnetValidatorRegistrationMessage( Expect(err).Should(BeNil()) return registrationSignedMessage } + +// +// Warp message validiation utils +// These will be replaced by the actual implementation on the P-Chain in the future +// + +func ValidateRegisterSubnetValidatorMessage( + signedWarpMessage *avalancheWarp.Message, + nodeID ids.ID, + weight uint64, + subnetID ids.ID, + blsPublicKey [bls.PublicKeyLen]byte, +) { + // Validate the Warp message, (this will be done on the P-Chain in the future) + msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) + Expect(err).Should(BeNil()) + // Check that the addressed call payload is a registered Warp message type + var payloadInterface warpMessages.Payload + ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) + Expect(err).Should(BeNil()) + registerValidatorPayload, ok := payloadInterface.(*warpMessages.RegisterSubnetValidator) + Expect(ok).Should(BeTrue()) + + Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) + Expect(registerValidatorPayload.NodeID).Should(Equal(nodeID)) + Expect(registerValidatorPayload.Weight).Should(Equal(weight)) + Expect(registerValidatorPayload.SubnetID).Should(Equal(subnetID)) + Expect(registerValidatorPayload.BlsPubKey[:]).Should(Equal(blsPublicKey[:])) +} + +func ValidateSetSubnetValidatorWeightMessage( + signedWarpMessage *avalancheWarp.Message, + validationID ids.ID, + weight uint64, + nonce uint64, +) { + msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) + Expect(err).Should(BeNil()) + // Check that the addressed call payload is a registered Warp message type + var payloadInterface warpMessages.Payload + ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) + Expect(err).Should(BeNil()) + registerValidatorPayload, ok := payloadInterface.(*warpMessages.SetSubnetValidatorWeight) + Expect(ok).Should(BeTrue()) + + Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) + Expect(registerValidatorPayload.ValidationID).Should(Equal(validationID)) + Expect(registerValidatorPayload.Weight).Should(Equal(weight)) + Expect(registerValidatorPayload.Nonce).Should(Equal(nonce)) +} From 4f65a169cde5f6deda109903909bc26cc06e378d Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 08:10:24 -0400 Subject: [PATCH 100/545] fix unit test --- contracts/staking/tests/PoAValidatorManagerTests.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index cd971fe51..33956944e 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -38,7 +38,7 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { ) ); _initializeValidatorRegistration( - DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_ED25519_SIGNATURE, DEFAULT_WEIGHT + DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY, DEFAULT_WEIGHT ); } From e010350eb086a755c25cdb1ca8aa9c59f8acfb3d Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 08:32:36 -0400 Subject: [PATCH 101/545] separate pos validator manager settings --- .../ERC20TokenStakingManager.go | 53 ++++++++++--------- .../NativeTokenStakingManager.go | 53 ++++++++++--------- .../staking/ERC20TokenStakingManager.sol | 27 ++-------- .../staking/NativeTokenStakingManager.sol | 29 +++------- contracts/staking/PoSValidatorManager.sol | 20 +++---- .../interfaces/IPoSValidatorManager.sol | 11 +++- .../tests/ERC20TokenStakingManagerTests.t.sol | 25 +++++---- .../NativeTokenStakingManagerTests.t.sol | 21 ++++---- 8 files changed, 117 insertions(+), 122 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index ee3bb754e..39dc6ae44 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -29,21 +29,26 @@ var ( _ = abi.ConvertType ) -// StakingManagerSettings is an auto generated low-level Go binding around an user-defined struct. -type StakingManagerSettings struct { - PChainBlockchainID [32]byte - SubnetID [32]byte +// PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type PoSValidatorManagerSettings struct { + BaseSettings ValidatorManagerSettings MinimumStakeAmount *big.Int MaximumStakeAmount *big.Int MinimumStakeDuration uint64 - MaximumHourlyChurn uint8 RewardCalculator common.Address } +// ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type ValidatorManagerSettings struct { + PChainBlockchainID [32]byte + SubnetID [32]byte + MaximumHourlyChurn uint8 +} + // 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516134a93803806134a983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61335c8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f5780632e2194d8146100b45780635d0d7466146100e457806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612a12565b61019d565b005b6100c76100c2366004612a12565b610393565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26100f2366004612a3d565b6103a9565b61010a610105366004612a95565b6104b7565b6040519081526020016100db565b6100b2610126366004612ad5565b6104d0565b61010a610139366004612ba2565b610a50565b6100b261014c366004612c3e565b610a68565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100db565b6100b2610185366004612a12565b610cf5565b6100b2610198366004612c57565b610e09565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061333083398151915293929190829060ff1660058111156101fe576101fe612c81565b600581111561020f5761020f612c81565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612c81565b1461030e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61031f848361010001515f611230565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034c908490600401612cb7565b6020604051808303815f875af1158015610368573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038c9190612ce9565b5050505050565b5f6103a364e8d4a5100083612d28565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103ed5750825b90505f826001600160401b031660011480156104085750303b155b905081158015610416575080155b156104345760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561045e57845460ff60401b1916600160401b1785555b610468878761144d565b83156104ae57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6103a36001600160401b03831664e8d4a51000612d3b565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061333083398151915293929190829060ff16600581111561053157610531612c81565b600581111561054257610542612c81565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156105dc576105dc612c81565b146106355760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610305565b60c08101516001600160a01b0316336001600160a01b03161461066a5760405162461bcd60e51b815260040161030590612d52565b610677816040015161146b565b60038152426001600160401b031660808201525f8415610850576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156106da573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107019190810190612da7565b91509150806107225760405162461bcd60e51b815260040161030590612e79565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107899190612ce9565b8251146107a85760405162461bcd60e51b815260040161030590612ebd565b60208201516001600160a01b0316156107d35760405162461bcd60e51b815260040161030590612f04565b5f806107e28460400151611618565b91509150818a1461084a5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610305565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff1916600183600581111561089057610890612c81565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f9061098190889083611230565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109b0908590600401612cb7565b6020604051808303815f875af11580156109cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f09190612ce9565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b5f610a5d848685856117f0565b90505b949350505050565b5f5f805160206133308339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ac3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610aea9190810190612da7565b9150915080610b0b5760405162461bcd60e51b815260040161030590612e79565b8254825114610b2c5760405162461bcd60e51b815260040161030590612ebd565b60208201516001600160a01b031615610b575760405162461bcd60e51b815260040161030590612f04565b5f80610b668460400151611d00565b9150915080610bc65760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610305565b5f82815260078601602052604081208054610be090612f51565b9050118015610c12575060015f83815260088701602052604090205460ff166005811115610c1057610c10612c81565b145b610c2e5760405162461bcd60e51b815260040161030590612f89565b5f8281526007860160205260408120610c46916129c8565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f80516020613330833981519152929190610d3d90612f51565b9050118015610d6f575060015f83815260088301602052604090205460ff166005811115610d6d57610d6d612c81565b145b610d8b5760405162461bcd60e51b815260040161030590612f89565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dc49190600401612fce565b6020604051808303815f875af1158015610de0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e049190612ce9565b505050565b5f5f805160206133308339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e8b9190810190612da7565b9150915080610eac5760405162461bcd60e51b815260040161030590612e79565b5f8415610f25575f610ec18460400151611ea1565b919350909150506001600160401b03811615610f1f5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610305565b50610f99565b5f610f338460400151611d00565b90925090508015610f975760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610305565b505b5f818152600885016020526040808220815161012081019092528054829060ff166005811115610fcb57610fcb612c81565b6005811115610fdc57610fdc612c81565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b9092049093166101009092019190915282015191925016331461108d5760405162461bcd60e51b815260040161030590612d52565b5f6003825160058111156110a3576110a3612c81565b14806110c157506002825160058111156110bf576110bf612c81565b145b156110e457506020808201515f90815260098701909152604081205560046110e8565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561111957611119612c81565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156112a957611269816001613058565b611274906008612d3b565b5081515f9083908390811061128b5761128b61306b565b60200101906001600160f81b03191690815f1a905350600101611255565b505f5b600481101561130c576112c0816003613058565b6112cb906008612d3b565b6001901c60f81b826112de83600261307f565b815181106112ee576112ee61306b565b60200101906001600160f81b03191690815f1a9053506001016112ac565b505f5b602081101561136e5761132381601f613058565b61132e906008612d3b565b86901c60f81b8261134083600661307f565b815181106113505761135061306b565b60200101906001600160f81b03191690815f1a90535060010161130f565b505f5b60088110156113d957611385816007613058565b611390906008612d3b565b6001600160401b038616901c60f81b826113ab83602661307f565b815181106113bb576113bb61306b565b60200101906001600160f81b03191690815f1a905350600101611371565b505f5b6008811015611444576113f0816007613058565b6113fb906008612d3b565b6001600160401b038516901c60f81b8261141683602e61307f565b815181106114265761142661306b565b60200101906001600160f81b03191690815f1a9053506001016113dc565b50949350505050565b6114556120dc565b61145e82612127565b6114678161214b565b5050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f8051602061333083398151915290600160e01b900460ff165f036114b0575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906114f89083613058565b10611514576001600160401b0384166040830152808252611533565b83826040018181516115269190613092565b6001600160401b03169052505b5f82602001518360400151606461154a91906130b9565b61155491906130e4565b600485015490915060ff600160e01b909104811690821611156115d45760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610305565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602e1461163b5760405162461bcd60e51b815260040161030590613109565b5f805b600281101561168a57611652816001613058565b61165d906008612d3b565b61ffff168582815181106116735761167361306b565b016020015160f81c901b919091179060010161163e565b5061ffff8116156116ad5760405162461bcd60e51b815260040161030590613150565b5f805b6004811015611708576116c4816003613058565b6116cf906008612d3b565b63ffffffff16866116e183600261307f565b815181106116f1576116f161306b565b016020015160f81c901b91909117906001016116b0565b5063ffffffff811660041461172f5760405162461bcd60e51b815260040161030590613191565b5f805b60208110156117845761174681601f613058565b611751906008612d3b565b8761175d83600661307f565b8151811061176d5761176d61306b565b016020015160f81c901b9190911790600101611732565b505f805b60088110156117e35761179c816007613058565b6117a7906008612d3b565b6001600160401b0316886117bc83602661307f565b815181106117cc576117cc61306b565b016020015160f81c901b9190911790600101611788565b5090969095509350505050565b5f6117f96121ff565b5f80516020613330833981519152426001600160401b03851611801561183357506001600160401b038416611831426202a30061307f565b115b6118935760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610305565b856118e05760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610305565b5f8681526009820160205260409020541561194c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610305565b82516030146119b15760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610305565b5f6119bb86612249565b90505f6119c782610393565b90506119d28161146b565b8260020154816001600160401b0316101580156119fc57508260030154816001600160401b031611155b611a545760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610305565b5f80611a9b6040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b031681526020018981525061227f565b5f82815260078801602052604090209193509150611ab9828261321a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ae6908590600401612cb7565b6020604051808303815f875af1158015611b02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b269190612ce9565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611bac57611bac612c81565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610a6060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611d235760405162461bcd60e51b815260040161030590613109565b5f805b6002811015611d7257611d3a816001613058565b611d45906008612d3b565b61ffff16858281518110611d5b57611d5b61306b565b016020015160f81c901b9190911790600101611d26565b5061ffff811615611d955760405162461bcd60e51b815260040161030590613150565b5f805b6004811015611df057611dac816003613058565b611db7906008612d3b565b63ffffffff1686611dc983600261307f565b81518110611dd957611dd961306b565b016020015160f81c901b9190911790600101611d98565b5063ffffffff8116600214611e175760405162461bcd60e51b815260040161030590613191565b5f805b6020811015611e6c57611e2e81601f613058565b611e39906008612d3b565b87611e4583600661307f565b81518110611e5557611e5561306b565b016020015160f81c901b9190911790600101611e1a565b505f86602681518110611e8157611e8161306b565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611ec55760405162461bcd60e51b815260040161030590613109565b5f805b6002811015611f1457611edc816001613058565b611ee7906008612d3b565b61ffff16868281518110611efd57611efd61306b565b016020015160f81c901b9190911790600101611ec8565b5061ffff811615611f375760405162461bcd60e51b815260040161030590613150565b5f805b6004811015611f9257611f4e816003613058565b611f59906008612d3b565b63ffffffff1687611f6b83600261307f565b81518110611f7b57611f7b61306b565b016020015160f81c901b9190911790600101611f3a565b5063ffffffff8116600114611fb95760405162461bcd60e51b815260040161030590613191565b5f805b602081101561200e57611fd081601f613058565b611fdb906008612d3b565b88611fe783600661307f565b81518110611ff757611ff761306b565b016020015160f81c901b9190911790600101611fbc565b505f805b600881101561206d57612026816007613058565b612031906008612d3b565b6001600160401b03168961204683602661307f565b815181106120565761205661306b565b016020015160f81c901b9190911790600101612012565b505f805b60088110156120cc57612085816007613058565b612090906008612d3b565b6001600160401b03168a6120a583602e61307f565b815181106120b5576120b561306b565b016020015160f81c901b9190911790600101612071565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661212557604051631afcd79f60e31b815260040160405180910390fd5b565b61212f6120dc565b61213761264a565b61213f61265a565b61214881612662565b50565b6121536120dc565b7f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f916001600160a01b0382166121df5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610305565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161224357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6103a3827f8568826440873e37a96cb0aab773b28d8154d963d2f0e41bd9b5c15f63625f91546001600160a01b031690612792565b5f60608260800151516030146122e95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610305565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561236057612320816001613058565b61232b906008612d3b565b5081515f908390839081106123425761234261306b565b60200101906001600160f81b03191690815f1a90535060010161230c565b505f5b60048110156123be57612377816003613058565b612382906008612d3b565b505f8261239083600261307f565b815181106123a0576123a061306b565b60200101906001600160f81b03191690815f1a905350600101612363565b505f5b602081101561241b57845181602081106123dd576123dd61306b565b1a60f81b826123ed83600661307f565b815181106123fd576123fd61306b565b60200101906001600160f81b03191690815f1a9053506001016123c1565b505f5b602081101561247b578460200151816020811061243d5761243d61306b565b1a60f81b8261244d83602661307f565b8151811061245d5761245d61306b565b60200101906001600160f81b03191690815f1a90535060010161241e565b505f5b60088110156124ef57612492816007613058565b61249d906008612d3b565b60ff1685604001516001600160401b0316901c60f81b828260466124c1919061307f565b815181106124d1576124d161306b565b60200101906001600160f81b03191690815f1a90535060010161247e565b505f5b603081101561255a57846080015181815181106125115761251161306b565b01602001516001600160f81b0319168261252c83604e61307f565b8151811061253c5761253c61306b565b60200101906001600160f81b03191690815f1a9053506001016124f2565b505f5b60088110156125cc57612571816007613058565b61257c906008612d3b565b60608601516001600160401b0390811691161c60f81b8261259e83607e61307f565b815181106125ae576125ae61306b565b60200101906001600160f81b03191690815f1a90535060010161255d565b506002816040516125dd91906132d9565b602060405180830381855afa1580156125f8573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061261b9190612ce9565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126526120dc565b6121256128f4565b6121256120dc565b61266a6120dc565b80355f8051602061333083398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561270260a0830160808401612a95565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561273560c0830160a084016132f4565b60048201805460ff92909216600160e01b0260ff60e01b1990921691909117905561276660e0830160c08401613314565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156127d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127fc9190612ce9565b90506128136001600160a01b0385163330866128fc565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015612857573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287b9190612ce9565b90508181116128e15760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610305565b6128eb8282613058565b95945050505050565b6126246120dc565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261295690859061295c565b50505050565b5f8060205f8451602086015f885af18061297b576040513d5f823e3d81fd5b50505f513d9150811561299257806001141561299f565b6001600160a01b0384163b155b1561295657604051635274afe760e01b81526001600160a01b0385166004820152602401610305565b5080546129d490612f51565b5f825580601f106129e3575050565b601f0160209004905f5260205f209081019061214891905b80821115612a0e575f81556001016129fb565b5090565b5f60208284031215612a22575f80fd5b5035919050565b6001600160a01b0381168114612148575f80fd5b5f80828403610100811215612a50575f80fd5b60e0811215612a5d575f80fd5b5082915060e0830135612a6f81612a29565b809150509250929050565b80356001600160401b0381168114612a90575f80fd5b919050565b5f60208284031215612aa5575f80fd5b612aae82612a7a565b9392505050565b8015158114612148575f80fd5b803563ffffffff81168114612a90575f80fd5b5f805f60608486031215612ae7575f80fd5b833592506020840135612af981612ab5565b9150612b0760408501612ac2565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b4657612b46612b10565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612b7457612b74612b10565b604052919050565b5f6001600160401b03821115612b9457612b94612b10565b50601f01601f191660200190565b5f805f8060808587031215612bb5575f80fd5b8435935060208501359250612bcc60408601612a7a565b915060608501356001600160401b03811115612be6575f80fd5b8501601f81018713612bf6575f80fd5b8035612c09612c0482612b7c565b612b4c565b818152886020838501011115612c1d575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612c4e575f80fd5b612aae82612ac2565b5f8060408385031215612c68575f80fd5b612c7183612ac2565b91506020830135612a6f81612ab5565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612caf578181015183820152602001612c97565b50505f910152565b602081525f8251806020840152612cd5816040850160208701612c95565b601f01601f19169190910160400192915050565b5f60208284031215612cf9575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612d3657612d36612d00565b500490565b80820281158282048414176103a3576103a3612d14565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b8051612a9081612ab5565b5f8060408385031215612db8575f80fd5b82516001600160401b0380821115612dce575f80fd5b9084019060608287031215612de1575f80fd5b612de9612b24565b82518152602080840151612dfc81612a29565b82820152604084015183811115612e11575f80fd5b80850194505087601f850112612e25575f80fd5b83519250612e35612c0484612b7c565b8381528882858701011115612e48575f80fd5b612e5784838301848801612c95565b80604084015250819550612e6c818801612d9c565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612f6557607f821691505b602082108103612f8357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612fe081612f51565b806020870152604060018084165f8114613001576001811461301d5761304a565b60ff19851660408a0152604084151560051b8a0101955061304a565b895f5260205f205f5b858110156130415781548b8201860152908301908801613026565b8a016040019650505b509398975050505050505050565b818103818111156103a3576103a3612d14565b634e487b7160e01b5f52603260045260245ffd5b808201808211156103a3576103a3612d14565b6001600160401b038181168382160190808211156130b2576130b2612d14565b5092915050565b6001600160401b038181168382160280821691908281146130dc576130dc612d14565b505092915050565b5f6001600160401b03808416806130fd576130fd612d00565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e0457805f5260205f20601f840160051c810160208510156131fb5750805b601f840160051c820191505b8181101561038c575f8155600101613207565b81516001600160401b0381111561323357613233612b10565b613247816132418454612f51565b846131d6565b602080601f83116001811461327a575f84156132635750858301515b5f19600386901b1c1916600185901b1785556132d1565b5f85815260208120601f198616915b828110156132a857888601518255948401946001909101908401613289565b50858210156132c557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f82516132ea818460208701612c95565b9190910192915050565b5f60208284031215613304575f80fd5b813560ff81168114612aae575f80fd5b5f60208284031215613324575f80fd5b8135612aae81612a2956feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516135a43803806135a483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6134578061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c757806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612b95565b61019d565b005b6100b26100c2366004612bc0565b610395565b6100da6100d5366004612b95565b6104a3565b6040516001600160401b0390911681526020015b60405180910390f35b61010a610105366004612c18565b6104b9565b6040519081526020016100ee565b6100b2610126366004612c58565b6104d2565b61010a610139366004612d25565b61076a565b6100b261014c366004612dc1565b61078f565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610185366004612b95565b610aa8565b6100b2610198366004612dda565b610bbc565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061342b83398151915293929190829060ff1660058111156101fe576101fe612e04565b600581111561020f5761020f612e04565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612e04565b146103105760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f610321848361010001515f610ff0565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034e908490600401612e3a565b6020604051808303815f875af115801561036a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038e9190612e6c565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103d95750825b90505f826001600160401b031660011480156103f45750303b155b905081158015610402575080155b156104205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561044a57845460ff60401b1916600160401b1785555b610454878761120d565b831561049a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6104b364e8d4a5100083612eab565b92915050565b5f6104b36001600160401b03831664e8d4a51000612ebe565b5f821561075a576040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610522573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105499190810190612ee0565b91509150806105a65760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610307565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060d9190612e6c565b82511461066c5760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610307565b60208201516001600160a01b0316156106dd5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610307565b5f806106ec846040015161122b565b915091508188146107545760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610307565b93505050505b6107648482611403565b50505050565b5f80610775866117b7565b905061078385828686611877565b9150505b949350505050565b5f5f8051602061342b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156107ea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108119190810190612ee0565b91509150806108325760405162461bcd60e51b815260040161030790612fb2565b82548251146108955760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610307565b60208201516001600160a01b0316156109085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610307565b5f806109178460400151611cfb565b91509150806109795760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610307565b5f8281526005860160205260408120805461099390612ff8565b90501180156109c5575060015f83815260068701602052604090205460ff1660058111156109c3576109c3612e04565b145b6109e15760405162461bcd60e51b815260040161030790613030565b5f82815260058601602052604081206109f991612b4b565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061342b833981519152929190610af090612ff8565b9050118015610b22575060015f83815260068301602052604090205460ff166005811115610b2057610b20612e04565b145b610b3e5760405162461bcd60e51b815260040161030790613030565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610b779190600401613077565b6020604051808303815f875af1158015610b93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb79190612e6c565b505050565b5f5f8051602061342b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c17573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c3e9190810190612ee0565b9150915080610c5f5760405162461bcd60e51b815260040161030790612fb2565b5f8415610ce3575f610c748460400151611e9c565b919350909150506001600160401b03811615610cdd5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610307565b50610d59565b5f610cf18460400151611cfb565b90925090508015610d575760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610307565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610d8b57610d8b612e04565b6005811115610d9c57610d9c612e04565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610e4d5760405162461bcd60e51b815260040161030790613101565b5f600382516005811115610e6357610e63612e04565b1480610e815750600282516005811115610e7f57610e7f612e04565b145b15610ea457506020808201515f9081526007870190915260408120556004610ea8565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610ed957610ed9612e04565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110695761102981600161314d565b611034906008612ebe565b5081515f9083908390811061104b5761104b613160565b60200101906001600160f81b03191690815f1a905350600101611015565b505f5b60048110156110cc5761108081600361314d565b61108b906008612ebe565b6001901c60f81b8261109e836002613174565b815181106110ae576110ae613160565b60200101906001600160f81b03191690815f1a90535060010161106c565b505f5b602081101561112e576110e381601f61314d565b6110ee906008612ebe565b86901c60f81b82611100836006613174565b8151811061111057611110613160565b60200101906001600160f81b03191690815f1a9053506001016110cf565b505f5b60088110156111995761114581600761314d565b611150906008612ebe565b6001600160401b038616901c60f81b8261116b836026613174565b8151811061117b5761117b613160565b60200101906001600160f81b03191690815f1a905350600101611131565b505f5b6008811015611204576111b081600761314d565b6111bb906008612ebe565b6001600160401b038516901c60f81b826111d683602e613174565b815181106111e6576111e6613160565b60200101906001600160f81b03191690815f1a90535060010161119c565b50949350505050565b6112156120d7565b61121e82612122565b61122781612168565b5050565b5f808251602e1461124e5760405162461bcd60e51b815260040161030790613187565b5f805b600281101561129d5761126581600161314d565b611270906008612ebe565b61ffff1685828151811061128657611286613160565b016020015160f81c901b9190911790600101611251565b5061ffff8116156112c05760405162461bcd60e51b8152600401610307906131d0565b5f805b600481101561131b576112d781600361314d565b6112e2906008612ebe565b63ffffffff16866112f4836002613174565b8151811061130457611304613160565b016020015160f81c901b91909117906001016112c3565b5063ffffffff81166004146113425760405162461bcd60e51b815260040161030790613213565b5f805b60208110156113975761135981601f61314d565b611364906008612ebe565b87611370836006613174565b8151811061138057611380613160565b016020015160f81c901b9190911790600101611345565b505f805b60088110156113f6576113af81600761314d565b6113ba906008612ebe565b6001600160401b0316886113cf836026613174565b815181106113df576113df613160565b016020015160f81c901b919091179060010161139b565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061342b83398151915293929190829060ff16600581111561146457611464612e04565b600581111561147557611475612e04565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561150f5761150f612e04565b1461156b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610307565b60c08101516001600160a01b0316336001600160a01b0316146115a05760405162461bcd60e51b815260040161030790613101565b6115ad816040015161221c565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff191660018360058111156115f9576115f9612e04565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f906116ea90869083610ff0565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611719908590600401612e3a565b6020604051808303815f875af1158015611735573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117599190612e6c565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00816117e3846123bd565b90505f6117ef826104a3565b83549091506001600160401b0382161080159061181957508260010154816001600160401b031611155b6107875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610307565b5f6118806123f3565b5f8051602061342b833981519152426001600160401b0385161180156118ba57506001600160401b0384166118b8426202a300613174565b115b61191c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610307565b856119735760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610307565b5f868152600782016020526040902054156119e15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610307565b8251603014611a485760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610307565b611a518561221c565b5f80611a986040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061243d565b5f82815260058601602052604090209193509150611ab6828261329e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ae3908590600401612e3a565b6020604051808303815f875af1158015611aff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b239190612e6c565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611ba957611ba9612e04565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061078760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611d1e5760405162461bcd60e51b815260040161030790613187565b5f805b6002811015611d6d57611d3581600161314d565b611d40906008612ebe565b61ffff16858281518110611d5657611d56613160565b016020015160f81c901b9190911790600101611d21565b5061ffff811615611d905760405162461bcd60e51b8152600401610307906131d0565b5f805b6004811015611deb57611da781600361314d565b611db2906008612ebe565b63ffffffff1686611dc4836002613174565b81518110611dd457611dd4613160565b016020015160f81c901b9190911790600101611d93565b5063ffffffff8116600214611e125760405162461bcd60e51b815260040161030790613213565b5f805b6020811015611e6757611e2981601f61314d565b611e34906008612ebe565b87611e40836006613174565b81518110611e5057611e50613160565b016020015160f81c901b9190911790600101611e15565b505f86602681518110611e7c57611e7c613160565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611ec05760405162461bcd60e51b815260040161030790613187565b5f805b6002811015611f0f57611ed781600161314d565b611ee2906008612ebe565b61ffff16868281518110611ef857611ef8613160565b016020015160f81c901b9190911790600101611ec3565b5061ffff811615611f325760405162461bcd60e51b8152600401610307906131d0565b5f805b6004811015611f8d57611f4981600361314d565b611f54906008612ebe565b63ffffffff1687611f66836002613174565b81518110611f7657611f76613160565b016020015160f81c901b9190911790600101611f35565b5063ffffffff8116600114611fb45760405162461bcd60e51b815260040161030790613213565b5f805b602081101561200957611fcb81601f61314d565b611fd6906008612ebe565b88611fe2836006613174565b81518110611ff257611ff2613160565b016020015160f81c901b9190911790600101611fb7565b505f805b60088110156120685761202181600761314d565b61202c906008612ebe565b6001600160401b031689612041836026613174565b8151811061205157612051613160565b016020015160f81c901b919091179060010161200d565b505f805b60088110156120c75761208081600761314d565b61208b906008612ebe565b6001600160401b03168a6120a083602e613174565b815181106120b0576120b0613160565b016020015160f81c901b919091179060010161206c565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661212057604051631afcd79f60e31b815260040160405180910390fd5b565b61212a6120d7565b61213381612808565b6121656060820135608083013561215060c0850160a08601612c18565b61216060e0860160c0870161335d565b612829565b50565b6121706120d7565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166121fc5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610307565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061342b8339815191529060ff165f0361225a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906122a2908361314d565b106122be576001600160401b03841660408301528082526122dd565b83826040018181516122d09190613378565b6001600160401b03169052505b5f8260200151836040015160646122f4919061339f565b6122fe91906133ca565b600285015490915060ff90811690821611156123795760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610307565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104b3827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690612897565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161243757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124a75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610307565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561251e576124de81600161314d565b6124e9906008612ebe565b5081515f9083908390811061250057612500613160565b60200101906001600160f81b03191690815f1a9053506001016124ca565b505f5b600481101561257c5761253581600361314d565b612540906008612ebe565b505f8261254e836002613174565b8151811061255e5761255e613160565b60200101906001600160f81b03191690815f1a905350600101612521565b505f5b60208110156125d9578451816020811061259b5761259b613160565b1a60f81b826125ab836006613174565b815181106125bb576125bb613160565b60200101906001600160f81b03191690815f1a90535060010161257f565b505f5b602081101561263957846020015181602081106125fb576125fb613160565b1a60f81b8261260b836026613174565b8151811061261b5761261b613160565b60200101906001600160f81b03191690815f1a9053506001016125dc565b505f5b60088110156126ad5761265081600761314d565b61265b906008612ebe565b60ff1685604001516001600160401b0316901c60f81b8282604661267f9190613174565b8151811061268f5761268f613160565b60200101906001600160f81b03191690815f1a90535060010161263c565b505f5b603081101561271857846080015181815181106126cf576126cf613160565b01602001516001600160f81b031916826126ea83604e613174565b815181106126fa576126fa613160565b60200101906001600160f81b03191690815f1a9053506001016126b0565b505f5b600881101561278a5761272f81600761314d565b61273a906008612ebe565b60608601516001600160401b0390811691161c60f81b8261275c83607e613174565b8151811061276c5761276c613160565b60200101906001600160f81b03191690815f1a90535060010161271b565b5060028160405161279b91906133ef565b602060405180830381855afa1580156127b6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127d99190612e6c565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6128106120d7565b6128186129f9565b612820612a09565b61216581612a11565b6128316120d7565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156128dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129019190612e6c565b90506129186001600160a01b038516333086612a7d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561295c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129809190612e6c565b90508181116129e65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610307565b6129f0828261314d565b95945050505050565b612a016120d7565b612120612ad7565b6121206120d7565b612a196120d7565b80355f8051602061342b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612a63606083016040840161340a565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610764908590612adf565b6127e26120d7565b5f8060205f8451602086015f885af180612afe576040513d5f823e3d81fd5b50505f513d91508115612b15578060011415612b22565b6001600160a01b0384163b155b1561076457604051635274afe760e01b81526001600160a01b0385166004820152602401610307565b508054612b5790612ff8565b5f825580601f10612b66575050565b601f0160209004905f5260205f209081019061216591905b80821115612b91575f8155600101612b7e565b5090565b5f60208284031215612ba5575f80fd5b5035919050565b6001600160a01b0381168114612165575f80fd5b5f80828403610100811215612bd3575f80fd5b60e0811215612be0575f80fd5b5082915060e0830135612bf281612bac565b809150509250929050565b80356001600160401b0381168114612c13575f80fd5b919050565b5f60208284031215612c28575f80fd5b612c3182612bfd565b9392505050565b8015158114612165575f80fd5b803563ffffffff81168114612c13575f80fd5b5f805f60608486031215612c6a575f80fd5b833592506020840135612c7c81612c38565b9150612c8a60408501612c45565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612cc957612cc9612c93565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612cf757612cf7612c93565b604052919050565b5f6001600160401b03821115612d1757612d17612c93565b50601f01601f191660200190565b5f805f8060808587031215612d38575f80fd5b8435935060208501359250612d4f60408601612bfd565b915060608501356001600160401b03811115612d69575f80fd5b8501601f81018713612d79575f80fd5b8035612d8c612d8782612cff565b612ccf565b818152886020838501011115612da0575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612dd1575f80fd5b612c3182612c45565b5f8060408385031215612deb575f80fd5b612df483612c45565b91506020830135612bf281612c38565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612e32578181015183820152602001612e1a565b50505f910152565b602081525f8251806020840152612e58816040850160208701612e18565b601f01601f19169190910160400192915050565b5f60208284031215612e7c575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612eb957612eb9612e83565b500490565b80820281158282048414176104b3576104b3612e97565b8051612c1381612c38565b5f8060408385031215612ef1575f80fd5b82516001600160401b0380821115612f07575f80fd5b9084019060608287031215612f1a575f80fd5b612f22612ca7565b82518152602080840151612f3581612bac565b82820152604084015183811115612f4a575f80fd5b80850194505087601f850112612f5e575f80fd5b83519250612f6e612d8784612cff565b8381528882858701011115612f81575f80fd5b612f9084838301848801612e18565b80604084015250819550612fa5818801612ed5565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061300c57607f821691505b60208210810361302a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461308981612ff8565b806020870152604060018084165f81146130aa57600181146130c6576130f3565b60ff19851660408a0152604084151560051b8a010195506130f3565b895f5260205f205f5b858110156130ea5781548b82018601529083019088016130cf565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104b3576104b3612e97565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104b3576104b3612e97565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610bb757805f5260205f20601f840160051c8101602085101561327f5750805b601f840160051c820191505b8181101561038e575f815560010161328b565b81516001600160401b038111156132b7576132b7612c93565b6132cb816132c58454612ff8565b8461325a565b602080601f8311600181146132fe575f84156132e75750858301515b5f19600386901b1c1916600185901b178555613355565b5f85815260208120601f198616915b8281101561332c5788860151825594840194600190910190840161330d565b508582101561334957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561336d575f80fd5b8135612c3181612bac565b6001600160401b0381811683821601908082111561339857613398612e97565b5092915050565b6001600160401b038181168382160280821691908281146133c2576133c2612e97565b505092915050565b5f6001600160401b03808416806133e3576133e3612e83565b92169190910492915050565b5f8251613400818460208701612e18565b9190910192915050565b5f6020828403121561341a575f80fd5b813560ff81168114612c31575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -348,24 +353,24 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x5d0d7466. +// Initialize is a paid mutator transaction binding the contract method 0x27f39ca8. // -// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,address) settings, address token) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) Initialize(opts *bind.TransactOpts, settings StakingManagerSettings, token common.Address) (*types.Transaction, error) { +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,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 0x5d0d7466. +// Initialize is a paid mutator transaction binding the contract method 0x27f39ca8. // -// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,address) settings, address token) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) Initialize(settings StakingManagerSettings, token common.Address) (*types.Transaction, error) { +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,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 0x5d0d7466. +// Initialize is a paid mutator transaction binding the contract method 0x27f39ca8. // -// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,address) settings, address token) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Initialize(settings StakingManagerSettings, token common.Address) (*types.Transaction, error) { +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,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) } @@ -965,14 +970,14 @@ func (it *ERC20TokenStakingManagerValidationPeriodRegisteredIterator) Close() er // ERC20TokenStakingManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerValidationPeriodRegistered struct { ValidationID [32]byte - StakeAmount *big.Int + Weight *big.Int Timestamp *big.Int Raw types.Log // Blockchain specific contextual infos } // FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodRegisteredIterator, error) { var validationIDRule []interface{} @@ -989,7 +994,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidat // WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -1031,7 +1036,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidati // ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*ERC20TokenStakingManagerValidationPeriodRegistered, error) { event := new(ERC20TokenStakingManagerValidationPeriodRegistered) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { @@ -1112,7 +1117,7 @@ func (it *ERC20TokenStakingManagerValidatorRemovalInitializedIterator) Close() e type ERC20TokenStakingManagerValidatorRemovalInitialized struct { ValidationID [32]byte SetWeightMessageID [32]byte - StakeAmount *big.Int + Weight *big.Int EndTime *big.Int Uptime uint64 Raw types.Log // Blockchain specific contextual infos @@ -1120,7 +1125,7 @@ type ERC20TokenStakingManagerValidatorRemovalInitialized struct { // FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*ERC20TokenStakingManagerValidatorRemovalInitializedIterator, error) { var validationIDRule []interface{} @@ -1141,7 +1146,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidat // WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -1187,7 +1192,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidato // ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerValidatorRemovalInitialized, error) { event := new(ERC20TokenStakingManagerValidatorRemovalInitialized) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 83b75bcc7..777297b68 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -29,21 +29,26 @@ var ( _ = abi.ConvertType ) -// StakingManagerSettings is an auto generated low-level Go binding around an user-defined struct. -type StakingManagerSettings struct { - PChainBlockchainID [32]byte - SubnetID [32]byte +// PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type PoSValidatorManagerSettings struct { + BaseSettings ValidatorManagerSettings MinimumStakeAmount *big.Int MaximumStakeAmount *big.Int MinimumStakeDuration uint64 - MaximumHourlyChurn uint8 RewardCalculator common.Address } +// ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type ValidatorManagerSettings struct { + PChainBlockchainID [32]byte + SubnetID [32]byte + MaximumHourlyChurn uint8 +} + // 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structStakingManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"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\":\"stakeAmount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516131a43803806131a483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130578061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780632e2194d8146100b457806362065856146100f057806376f786211461011d57806379f54eb11461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad36600461273d565b6101fd565b005b3480156100bf575f80fd5b506100d36100ce36600461273d565b6103f3565b6040516001600160401b0390911681526020015b60405180910390f35b3480156100fb575f80fd5b5061010f61010a36600461276f565b610409565b6040519081526020016100e7565b348015610128575f80fd5b506100b26101373660046127af565b610422565b348015610147575f80fd5b506100b26101563660046127ea565b6109a2565b348015610166575f80fd5b506100b2610175366004612800565b610aae565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b0390911681526020016100e7565b3480156101b7575f80fd5b506100b26101c636600461273d565b610d3b565b61010f6101d93660046128ab565b610e4f565b3480156101e9575f80fd5b506100b26101f836600461293d565b610e64565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061302b83398151915293929190829060ff16600581111561025e5761025e612972565b600581111561026f5761026f612972565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561030657610306612972565b1461036e5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f7420706560448201526c1b991a5b99c81c995b5bdd985b609a1b60648201526084015b60405180910390fd5b5f61037f848361010001515f61128b565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ac9084906004016129a8565b6020604051808303815f875af11580156103c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103ec91906129da565b5050505050565b5f61040364e8d4a5100083612a19565b92915050565b5f6104036001600160401b03831664e8d4a51000612a2c565b5f8381527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab60860205260408082208151610120810190925280545f8051602061302b83398151915293929190829060ff16600581111561048357610483612972565b600581111561049457610494612972565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561052e5761052e612972565b146105875760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a2056616c696461746f72206e6f742061636044820152637469766560e01b6064820152608401610365565b60c08101516001600160a01b0316336001600160a01b0316146105bc5760405162461bcd60e51b815260040161036590612a43565b6105c981604001516114a8565b60038152426001600160401b031660808201525f84156107a2576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561062c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106539190810190612aac565b91509150806106745760405162461bcd60e51b815260040161036590612b7e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106db91906129da565b8251146106fa5760405162461bcd60e51b815260040161036590612bc2565b60208201516001600160a01b0316156107255760405162461bcd60e51b815260040161036590612c09565b5f806107348460400151611655565b91509150818a1461079c5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610365565b93505050505b6001600160401b03811660a08301525f86815260088401602052604090208251815484929190829060ff191660018360058111156107e2576107e2612972565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558201515f906108d39088908361128b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906109029085906004016129a8565b6020604051808303815f875af115801561091e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094291906129da565b60408581015181516001600160401b03918216815242602082015290861681830152905191925082918a917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a35050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156109e65750825b90505f826001600160401b03166001148015610a015750303b155b905081158015610a0f575080155b15610a2d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a5757845460ff60401b1916600160401b1785555b610a608661182d565b8315610aa657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f5f8051602061302b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b09573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b309190810190612aac565b9150915080610b515760405162461bcd60e51b815260040161036590612b7e565b8254825114610b725760405162461bcd60e51b815260040161036590612bc2565b60208201516001600160a01b031615610b9d5760405162461bcd60e51b815260040161036590612c09565b5f80610bac8460400151611841565b9150915080610c0c5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a20526567697374726174696f6e206e6f74604482015265081d985b1a5960d21b6064820152608401610365565b5f82815260078601602052604081208054610c2690612c56565b9050118015610c58575060015f83815260088701602052604090205460ff166005811115610c5657610c56612972565b145b610c745760405162461bcd60e51b815260040161036590612c88565b5f8281526007860160205260408120610c8c916126f3565b5f8281526008860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260098c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6076020526040812080545f8051602061302b833981519152929190610d8390612c56565b9050118015610db5575060015f83815260088301602052604090205460ff166005811115610db357610db3612972565b145b610dd15760405162461bcd60e51b815260040161036590612c88565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e0a9190600401612ccd565b6020604051808303815f875af1158015610e26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e4a91906129da565b505050565b5f610e5c843485856119e2565b949350505050565b5f5f8051602061302b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ebf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ee69190810190612aac565b9150915080610f075760405162461bcd60e51b815260040161036590612b7e565b5f8415610f80575f610f1c8460400151611ee7565b919350909150506001600160401b03811615610f7a5760405162461bcd60e51b815260206004820181905260248201527f5374616b696e674d616e616765723a20576569676874206d75737420626520306044820152606401610365565b50610ff4565b5f610f8e8460400151611841565b90925090508015610ff25760405162461bcd60e51b815260206004820152602860248201527f5374616b696e674d616e616765723a20526567697374726174696f6e207374696044820152671b1b081d985b1a5960c21b6064820152608401610365565b505b5f818152600885016020526040808220815161012081019092528054829060ff16600581111561102657611026612972565b600581111561103757611037612972565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b909204909316610100909201919091528201519192501633146110e85760405162461bcd60e51b815260040161036590612a43565b5f6003825160058111156110fe576110fe612972565b148061111c575060028251600581111561111a5761111a612972565b145b1561113f57506020808201515f9081526009870190915260408120556004611143565b5060055b5f83815260088701602052604090208251815484929190829060ff1916600183600581111561117457611174612972565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611304576112c4816001612d57565b6112cf906008612a2c565b5081515f908390839081106112e6576112e6612d6a565b60200101906001600160f81b03191690815f1a9053506001016112b0565b505f5b60048110156113675761131b816003612d57565b611326906008612a2c565b6001901c60f81b82611339836002612d7e565b8151811061134957611349612d6a565b60200101906001600160f81b03191690815f1a905350600101611307565b505f5b60208110156113c95761137e81601f612d57565b611389906008612a2c565b86901c60f81b8261139b836006612d7e565b815181106113ab576113ab612d6a565b60200101906001600160f81b03191690815f1a90535060010161136a565b505f5b6008811015611434576113e0816007612d57565b6113eb906008612a2c565b6001600160401b038616901c60f81b82611406836026612d7e565b8151811061141657611416612d6a565b60200101906001600160f81b03191690815f1a9053506001016113cc565b505f5b600881101561149f5761144b816007612d57565b611456906008612a2c565b6001600160401b038516901c60f81b8261147183602e612d7e565b8151811061148157611481612d6a565b60200101906001600160f81b03191690815f1a905350600101611437565b50949350505050565b7fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab604545f8051602061302b83398151915290600160e01b900460ff165f036114ed575050565b60408051606081018252600583015480825260068401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906115359083612d57565b10611551576001600160401b0384166040830152808252611570565b83826040018181516115639190612d91565b6001600160401b03169052505b5f8260200151836040015160646115879190612db8565b6115919190612de3565b600485015490915060ff600160e01b909104811690821611156116115760405162461bcd60e51b815260206004820152603260248201527f5374616b696e674d616e616765723a204d6178696d756d20686f75726c7920636044820152711a1d5c9b881c985d1948195e18d95959195960721b6064820152608401610365565b5050805160058301556020810151600690920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f808251602e146116785760405162461bcd60e51b815260040161036590612e08565b5f805b60028110156116c75761168f816001612d57565b61169a906008612a2c565b61ffff168582815181106116b0576116b0612d6a565b016020015160f81c901b919091179060010161167b565b5061ffff8116156116ea5760405162461bcd60e51b815260040161036590612e4f565b5f805b600481101561174557611701816003612d57565b61170c906008612a2c565b63ffffffff168661171e836002612d7e565b8151811061172e5761172e612d6a565b016020015160f81c901b91909117906001016116ed565b5063ffffffff811660041461176c5760405162461bcd60e51b815260040161036590612e90565b5f805b60208110156117c15761178381601f612d57565b61178e906008612a2c565b8761179a836006612d7e565b815181106117aa576117aa612d6a565b016020015160f81c901b919091179060010161176f565b505f805b6008811015611820576117d9816007612d57565b6117e4906008612a2c565b6001600160401b0316886117f9836026612d7e565b8151811061180957611809612d6a565b016020015160f81c901b91909117906001016117c5565b5090969095509350505050565b611835612122565b61183e8161216d565b50565b5f8082516027146118645760405162461bcd60e51b815260040161036590612e08565b5f805b60028110156118b35761187b816001612d57565b611886906008612a2c565b61ffff1685828151811061189c5761189c612d6a565b016020015160f81c901b9190911790600101611867565b5061ffff8116156118d65760405162461bcd60e51b815260040161036590612e4f565b5f805b6004811015611931576118ed816003612d57565b6118f8906008612a2c565b63ffffffff168661190a836002612d7e565b8151811061191a5761191a612d6a565b016020015160f81c901b91909117906001016118d9565b5063ffffffff81166002146119585760405162461bcd60e51b815260040161036590612e90565b5f805b60208110156119ad5761196f81601f612d57565b61197a906008612a2c565b87611986836006612d7e565b8151811061199657611996612d6a565b016020015160f81c901b919091179060010161195b565b505f866026815181106119c2576119c2612d6a565b016020015191976001600160f81b03199092161515965090945050505050565b5f6119eb61218e565b5f8051602061302b833981519152426001600160401b038516118015611a2557506001600160401b038416611a23426202a300612d7e565b115b611a855760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420726567697374726160448201526a74696f6e2065787069727960a81b6064820152608401610365565b85611ad25760405162461bcd60e51b815260206004820152601f60248201527f5374616b696e674d616e616765723a20496e76616c6964206e6f6465204944006044820152606401610365565b5f86815260098201602052604090205415611b3e5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e674d616e616765723a204e6f646520494420616c72656164792060448201526561637469766560d01b6064820152608401610365565b8251603014611ba35760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e674d616e616765723a20496e76616c696420626c735075626c6960448201526a0c696caf240d8cadccee8d60ab1b6064820152608401610365565b845f611bae826103f3565b9050611bb9816114a8565b8260020154816001600160401b031610158015611be357508260030154816001600160401b031611155b611c3b5760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c6964207374616b6520616d6044820152631bdd5b9d60e21b6064820152608401610365565b5f80611c826040518060a00160405280876001015481526020018c8152602001856001600160401b031681526020018a6001600160401b03168152602001898152506121d8565b5f82815260078801602052604090209193509150611ca08282612f19565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ccd9085906004016129a8565b6020604051808303815f875af1158015611ce9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0d91906129da565b6040805161012081019091529091508060018152602081018d90526001600160401b03861660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f6020808301829052604092830182905286825260088a0190522081518154829060ff19166001836005811115611d9357611d93612972565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518783168152918c169082015282918d9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090945050505050610e5c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611f0b5760405162461bcd60e51b815260040161036590612e08565b5f805b6002811015611f5a57611f22816001612d57565b611f2d906008612a2c565b61ffff16868281518110611f4357611f43612d6a565b016020015160f81c901b9190911790600101611f0e565b5061ffff811615611f7d5760405162461bcd60e51b815260040161036590612e4f565b5f805b6004811015611fd857611f94816003612d57565b611f9f906008612a2c565b63ffffffff1687611fb1836002612d7e565b81518110611fc157611fc1612d6a565b016020015160f81c901b9190911790600101611f80565b5063ffffffff8116600114611fff5760405162461bcd60e51b815260040161036590612e90565b5f805b60208110156120545761201681601f612d57565b612021906008612a2c565b8861202d836006612d7e565b8151811061203d5761203d612d6a565b016020015160f81c901b9190911790600101612002565b505f805b60088110156120b35761206c816007612d57565b612077906008612a2c565b6001600160401b03168961208c836026612d7e565b8151811061209c5761209c612d6a565b016020015160f81c901b9190911790600101612058565b505f805b6008811015612112576120cb816007612d57565b6120d6906008612a2c565b6001600160401b03168a6120eb83602e612d7e565b815181106120fb576120fb612d6a565b016020015160f81c901b91909117906001016120b7565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661216b57604051631afcd79f60e31b815260040160405180910390fd5b565b612175612122565b61217d6125a3565b6121856125b3565b61183e816125bb565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016121d257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146122425760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610365565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156122b957612279816001612d57565b612284906008612a2c565b5081515f9083908390811061229b5761229b612d6a565b60200101906001600160f81b03191690815f1a905350600101612265565b505f5b6004811015612317576122d0816003612d57565b6122db906008612a2c565b505f826122e9836002612d7e565b815181106122f9576122f9612d6a565b60200101906001600160f81b03191690815f1a9053506001016122bc565b505f5b6020811015612374578451816020811061233657612336612d6a565b1a60f81b82612346836006612d7e565b8151811061235657612356612d6a565b60200101906001600160f81b03191690815f1a90535060010161231a565b505f5b60208110156123d4578460200151816020811061239657612396612d6a565b1a60f81b826123a6836026612d7e565b815181106123b6576123b6612d6a565b60200101906001600160f81b03191690815f1a905350600101612377565b505f5b6008811015612448576123eb816007612d57565b6123f6906008612a2c565b60ff1685604001516001600160401b0316901c60f81b8282604661241a9190612d7e565b8151811061242a5761242a612d6a565b60200101906001600160f81b03191690815f1a9053506001016123d7565b505f5b60308110156124b3578460800151818151811061246a5761246a612d6a565b01602001516001600160f81b0319168261248583604e612d7e565b8151811061249557612495612d6a565b60200101906001600160f81b03191690815f1a90535060010161244b565b505f5b6008811015612525576124ca816007612d57565b6124d5906008612a2c565b60608601516001600160401b0390811691161c60f81b826124f783607e612d7e565b8151811061250757612507612d6a565b60200101906001600160f81b03191690815f1a9053506001016124b6565b506002816040516125369190612fd4565b602060405180830381855afa158015612551573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061257491906129da565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6125ab612122565b61216b6126eb565b61216b612122565b6125c3612122565b80355f8051602061302b83398151915290815560208201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6015560408201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6025560608201357fafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab6035561265b60a083016080840161276f565b60048201805467ffffffffffffffff19166001600160401b039290921691909117905561268e60c0830160a08401612fef565b60048201805460ff92909216600160e01b0260ff60e01b199092169190911790556126bf60e0830160c0840161300f565b8160040160086101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b61257d612122565b5080546126ff90612c56565b5f825580601f1061270e575050565b601f0160209004905f5260205f209081019061183e91905b80821115612739575f8155600101612726565b5090565b5f6020828403121561274d575f80fd5b5035919050565b80356001600160401b038116811461276a575f80fd5b919050565b5f6020828403121561277f575f80fd5b61278882612754565b9392505050565b801515811461183e575f80fd5b803563ffffffff8116811461276a575f80fd5b5f805f606084860312156127c1575f80fd5b8335925060208401356127d38161278f565b91506127e16040850161279c565b90509250925092565b5f60e082840312156127fa575f80fd5b50919050565b5f60208284031215612810575f80fd5b6127888261279c565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561284f5761284f612819565b60405290565b604051601f8201601f191681016001600160401b038111828210171561287d5761287d612819565b604052919050565b5f6001600160401b0382111561289d5761289d612819565b50601f01601f191660200190565b5f805f606084860312156128bd575f80fd5b833592506128cd60208501612754565b915060408401356001600160401b038111156128e7575f80fd5b8401601f810186136128f7575f80fd5b803561290a61290582612885565b612855565b81815287602083850101111561291e575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f806040838503121561294e575f80fd5b6129578361279c565b915060208301356129678161278f565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156129a0578181015183820152602001612988565b50505f910152565b602081525f82518060208401526129c6816040850160208701612986565b601f01601f19169190910160400192915050565b5f602082840312156129ea575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612a2757612a276129f1565b500490565b808202811582820484141761040357610403612a05565b6020808252602a908201527f5374616b696e674d616e616765723a2053656e646572206e6f742076616c696460408201526930ba37b91037bbb732b960b11b606082015260800190565b6001600160a01b038116811461183e575f80fd5b805161276a8161278f565b5f8060408385031215612abd575f80fd5b82516001600160401b0380821115612ad3575f80fd5b9084019060608287031215612ae6575f80fd5b612aee61282d565b82518152602080840151612b0181612a8d565b82820152604084015183811115612b16575f80fd5b80850194505087601f850112612b2a575f80fd5b83519250612b3a61290584612885565b8381528882858701011115612b4d575f80fd5b612b5c84838301848801612986565b80604084015250819550612b71818801612aa1565b9450505050509250929050565b60208082526024908201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736040820152637361676560e01b606082015260800190565b60208082526027908201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636040820152661a185a5b88125160ca1b606082015260800190565b6020808252602d908201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360408201526c656e646572206164647265737360981b606082015260800190565b600181811c90821680612c6a57607f821691505b6020821081036127fa57634e487b7160e01b5f52602260045260245ffd5b60208082526025908201527f5374616b696e674d616e616765723a20496e76616c69642076616c69646174696040820152641bdb88125160da1b606082015260800190565b5f60208083525f8454612cdf81612c56565b806020870152604060018084165f8114612d005760018114612d1c57612d49565b60ff19851660408a0152604084151560051b8a01019550612d49565b895f5260205f205f5b85811015612d405781548b8201860152908301908801612d25565b8a016040019650505b509398975050505050505050565b8181038181111561040357610403612a05565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561040357610403612a05565b6001600160401b03818116838216019080821115612db157612db1612a05565b5092915050565b6001600160401b03818116838216028082169190828114612ddb57612ddb612a05565b505092915050565b5f6001600160401b0380841680612dfc57612dfc6129f1565b92169190910492915050565b60208082526027908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015266040d8cadccee8d60cb1b606082015260800190565b60208082526021908201527f5374616b696e674d657373616765733a20496e76616c696420636f64656320496040820152601160fa1b606082015260800190565b60208082526025908201527f5374616b696e674d657373616765733a20496e76616c6964206d657373616765604082015264207479706560d81b606082015260800190565b601f821115610e4a57805f5260205f20601f840160051c81016020851015612efa5750805b601f840160051c820191505b818110156103ec575f8155600101612f06565b81516001600160401b03811115612f3257612f32612819565b612f4681612f408454612c56565b84612ed5565b602080601f831160018114612f79575f8415612f625750858301515b5f19600386901b1c1916600185901b178555610aa6565b5f85815260208120601f198616915b82811015612fa757888601518255948401946001909101908401612f88565b5085821015612fc457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251612fe5818460208701612986565b9190910192915050565b5f60208284031215612fff575f80fd5b813560ff81168114612788575f80fd5b5f6020828403121561301f575f80fd5b813561278881612a8d56feafe6c4731b852fc2be89a0896ae43d22d8b24989064d841b2a1586b4d39ab600a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516132ac3803806132ac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61315f8061014d5f395ff3fe60806040526004361061008e575f3560e01c8063a3a65e4811610057578063a3a65e481461015a578063b771b3bc14610179578063bee0a03f146101ab578063f40797d7146101ca578063fdf94a1a146101dd575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063620658561461010e57806376f786211461013b575b5f80fd5b34801561009d575f80fd5b506100b16100ac3660046128cd565b6101fc565b005b3480156100be575f80fd5b506100b16100cd3660046128e3565b610308565b3480156100dd575f80fd5b506100f16100ec3660046128e3565b610500565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b5061012d610128366004612915565b610516565b604051908152602001610105565b348015610146575f80fd5b506100b1610155366004612955565b61052f565b348015610165575f80fd5b506100b1610174366004612990565b6107c7565b348015610184575f80fd5b506101936005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101b6575f80fd5b506100b16101c53660046128e3565b610ae0565b61012d6101d8366004612a3b565b610bf4565b3480156101e8575f80fd5b506100b16101f7366004612acd565b610c16565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba8661104a565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061313383398151915293929190829060ff16600581111561036957610369612b02565b600581111561037a5761037a612b02565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561041157610411612b02565b1461047b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61048c848361010001515f61105e565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104b9908490600401612b38565b6020604051808303815f875af11580156104d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104f99190612b6a565b5050505050565b5f61051064e8d4a5100083612ba9565b92915050565b5f6105106001600160401b03831664e8d4a51000612bbc565b5f82156107b7576040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561057f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105a69190810190612bf2565b91509150806106035760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610472565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610646573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066a9190612b6a565b8251146106c95760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610472565b60208201516001600160a01b03161561073a5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610472565b5f80610749846040015161127b565b915091508188146107b15760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610472565b93505050505b6107c18482611453565b50505050565b5f5f805160206131338339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610822573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108499190810190612bf2565b915091508061086a5760405162461bcd60e51b815260040161047290612cc4565b82548251146108cd5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610472565b60208201516001600160a01b0316156109405760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610472565b5f8061094f8460400151611807565b91509150806109b15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610472565b5f828152600586016020526040812080546109cb90612d0a565b90501180156109fd575060015f83815260068701602052604090205460ff1660058111156109fb576109fb612b02565b145b610a195760405162461bcd60e51b815260040161047290612d3c565b5f8281526005860160205260408120610a3191612883565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613133833981519152929190610b2890612d0a565b9050118015610b5a575060015f83815260068301602052604090205460ff166005811115610b5857610b58612b02565b145b610b765760405162461bcd60e51b815260040161047290612d3c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610baf9190600401612d83565b6020604051808303815f875af1158015610bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bef9190612b6a565b505050565b5f80610bff346119a8565b9050610c0d85828686611a65565b95945050505050565b5f5f805160206131338339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c71573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c989190810190612bf2565b9150915080610cb95760405162461bcd60e51b815260040161047290612cc4565b5f8415610d3d575f610cce8460400151611ee9565b919350909150506001600160401b03811615610d375760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610472565b50610db3565b5f610d4b8460400151611807565b90925090508015610db15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610472565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610de557610de5612b02565b6005811115610df657610df6612b02565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610ea75760405162461bcd60e51b815260040161047290612e0d565b5f600382516005811115610ebd57610ebd612b02565b1480610edb5750600282516005811115610ed957610ed9612b02565b145b15610efe57506020808201515f9081526007870190915260408120556004610f02565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f3357610f33612b02565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b611052612124565b61105b8161216f565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110d757611097816001612e59565b6110a2906008612bbc565b5081515f908390839081106110b9576110b9612e6c565b60200101906001600160f81b03191690815f1a905350600101611083565b505f5b600481101561113a576110ee816003612e59565b6110f9906008612bbc565b6001901c60f81b8261110c836002612e80565b8151811061111c5761111c612e6c565b60200101906001600160f81b03191690815f1a9053506001016110da565b505f5b602081101561119c5761115181601f612e59565b61115c906008612bbc565b86901c60f81b8261116e836006612e80565b8151811061117e5761117e612e6c565b60200101906001600160f81b03191690815f1a90535060010161113d565b505f5b6008811015611207576111b3816007612e59565b6111be906008612bbc565b6001600160401b038616901c60f81b826111d9836026612e80565b815181106111e9576111e9612e6c565b60200101906001600160f81b03191690815f1a90535060010161119f565b505f5b60088110156112725761121e816007612e59565b611229906008612bbc565b6001600160401b038516901c60f81b8261124483602e612e80565b8151811061125457611254612e6c565b60200101906001600160f81b03191690815f1a90535060010161120a565b50949350505050565b5f808251602e1461129e5760405162461bcd60e51b815260040161047290612e93565b5f805b60028110156112ed576112b5816001612e59565b6112c0906008612bbc565b61ffff168582815181106112d6576112d6612e6c565b016020015160f81c901b91909117906001016112a1565b5061ffff8116156113105760405162461bcd60e51b815260040161047290612edc565b5f805b600481101561136b57611327816003612e59565b611332906008612bbc565b63ffffffff1686611344836002612e80565b8151811061135457611354612e6c565b016020015160f81c901b9190911790600101611313565b5063ffffffff81166004146113925760405162461bcd60e51b815260040161047290612f1f565b5f805b60208110156113e7576113a981601f612e59565b6113b4906008612bbc565b876113c0836006612e80565b815181106113d0576113d0612e6c565b016020015160f81c901b9190911790600101611395565b505f805b6008811015611446576113ff816007612e59565b61140a906008612bbc565b6001600160401b03168861141f836026612e80565b8151811061142f5761142f612e6c565b016020015160f81c901b91909117906001016113eb565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061313383398151915293929190829060ff1660058111156114b4576114b4612b02565b60058111156114c5576114c5612b02565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561155f5761155f612b02565b146115bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610472565b60c08101516001600160a01b0316336001600160a01b0316146115f05760405162461bcd60e51b815260040161047290612e0d565b6115fd81604001516121b2565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff1916600183600581111561164957611649612b02565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f9061173a9086908361105e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611769908590600401612b38565b6020604051808303815f875af1158015611785573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a99190612b6a565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f80825160271461182a5760405162461bcd60e51b815260040161047290612e93565b5f805b600281101561187957611841816001612e59565b61184c906008612bbc565b61ffff1685828151811061186257611862612e6c565b016020015160f81c901b919091179060010161182d565b5061ffff81161561189c5760405162461bcd60e51b815260040161047290612edc565b5f805b60048110156118f7576118b3816003612e59565b6118be906008612bbc565b63ffffffff16866118d0836002612e80565b815181106118e0576118e0612e6c565b016020015160f81c901b919091179060010161189f565b5063ffffffff811660021461191e5760405162461bcd60e51b815260040161047290612f1f565b5f805b60208110156119735761193581601f612e59565b611940906008612bbc565b8761194c836006612e80565b8151811061195c5761195c612e6c565b016020015160f81c901b9190911790600101611921565b505f8660268151811061198857611988612e6c565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0082826119d582610500565b83549091506001600160401b038216108015906119ff57508260010154816001600160401b031611155b611a5d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610472565b949350505050565b5f611a6e612353565b5f80516020613133833981519152426001600160401b038516118015611aa857506001600160401b038416611aa6426202a300612e80565b115b611b0a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610472565b85611b615760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610472565b5f86815260078201602052604090205415611bcf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610472565b8251603014611c365760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610472565b611c3f856121b2565b5f80611c866040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061239d565b5f82815260058601602052604090209193509150611ca48282612faa565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611cd1908590600401612b38565b6020604051808303815f875af1158015611ced573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d119190612b6a565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611d9757611d97612b02565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a5d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611f0d5760405162461bcd60e51b815260040161047290612e93565b5f805b6002811015611f5c57611f24816001612e59565b611f2f906008612bbc565b61ffff16868281518110611f4557611f45612e6c565b016020015160f81c901b9190911790600101611f10565b5061ffff811615611f7f5760405162461bcd60e51b815260040161047290612edc565b5f805b6004811015611fda57611f96816003612e59565b611fa1906008612bbc565b63ffffffff1687611fb3836002612e80565b81518110611fc357611fc3612e6c565b016020015160f81c901b9190911790600101611f82565b5063ffffffff81166001146120015760405162461bcd60e51b815260040161047290612f1f565b5f805b60208110156120565761201881601f612e59565b612023906008612bbc565b8861202f836006612e80565b8151811061203f5761203f612e6c565b016020015160f81c901b9190911790600101612004565b505f805b60088110156120b55761206e816007612e59565b612079906008612bbc565b6001600160401b03168961208e836026612e80565b8151811061209e5761209e612e6c565b016020015160f81c901b919091179060010161205a565b505f805b6008811015612114576120cd816007612e59565b6120d8906008612bbc565b6001600160401b03168a6120ed83602e612e80565b815181106120fd576120fd612e6c565b016020015160f81c901b91909117906001016120b9565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661216d57604051631afcd79f60e31b815260040160405180910390fd5b565b612177612124565b61218081612768565b61105b6060820135608083013561219d60c0850160a08601612915565b6121ad60e0860160c08701613065565b612789565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206131338339815191529060ff165f036121f0575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906122389083612e59565b10612254576001600160401b0384166040830152808252612273565b83826040018181516122669190613080565b6001600160401b03169052505b5f82602001518360400151606461228a91906130a7565b61229491906130d2565b600285015490915060ff908116908216111561230f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610472565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161239757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124075760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610472565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561247e5761243e816001612e59565b612449906008612bbc565b5081515f9083908390811061246057612460612e6c565b60200101906001600160f81b03191690815f1a90535060010161242a565b505f5b60048110156124dc57612495816003612e59565b6124a0906008612bbc565b505f826124ae836002612e80565b815181106124be576124be612e6c565b60200101906001600160f81b03191690815f1a905350600101612481565b505f5b602081101561253957845181602081106124fb576124fb612e6c565b1a60f81b8261250b836006612e80565b8151811061251b5761251b612e6c565b60200101906001600160f81b03191690815f1a9053506001016124df565b505f5b6020811015612599578460200151816020811061255b5761255b612e6c565b1a60f81b8261256b836026612e80565b8151811061257b5761257b612e6c565b60200101906001600160f81b03191690815f1a90535060010161253c565b505f5b600881101561260d576125b0816007612e59565b6125bb906008612bbc565b60ff1685604001516001600160401b0316901c60f81b828260466125df9190612e80565b815181106125ef576125ef612e6c565b60200101906001600160f81b03191690815f1a90535060010161259c565b505f5b6030811015612678578460800151818151811061262f5761262f612e6c565b01602001516001600160f81b0319168261264a83604e612e80565b8151811061265a5761265a612e6c565b60200101906001600160f81b03191690815f1a905350600101612610565b505f5b60088110156126ea5761268f816007612e59565b61269a906008612bbc565b60608601516001600160401b0390811691161c60f81b826126bc83607e612e80565b815181106126cc576126cc612e6c565b60200101906001600160f81b03191690815f1a90535060010161267b565b506002816040516126fb91906130f7565b602060405180830381855afa158015612716573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127399190612b6a565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612770612124565b6127786127f7565b612780612807565b61105b8161280f565b612791612124565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6127ff612124565b61216d61287b565b61216d612124565b612817612124565b80355f8051602061313383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556128616060830160408401613112565b600291909101805460ff191660ff90921691909117905550565b612742612124565b50805461288f90612d0a565b5f825580601f1061289e575050565b601f0160209004905f5260205f209081019061105b91905b808211156128c9575f81556001016128b6565b5090565b5f60e082840312156128dd575f80fd5b50919050565b5f602082840312156128f3575f80fd5b5035919050565b80356001600160401b0381168114612910575f80fd5b919050565b5f60208284031215612925575f80fd5b61292e826128fa565b9392505050565b801515811461105b575f80fd5b803563ffffffff81168114612910575f80fd5b5f805f60608486031215612967575f80fd5b83359250602084013561297981612935565b915061298760408501612942565b90509250925092565b5f602082840312156129a0575f80fd5b61292e82612942565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129df576129df6129a9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612a0d57612a0d6129a9565b604052919050565b5f6001600160401b03821115612a2d57612a2d6129a9565b50601f01601f191660200190565b5f805f60608486031215612a4d575f80fd5b83359250612a5d602085016128fa565b915060408401356001600160401b03811115612a77575f80fd5b8401601f81018613612a87575f80fd5b8035612a9a612a9582612a15565b6129e5565b818152876020838501011115612aae575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612ade575f80fd5b612ae783612942565b91506020830135612af781612935565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612b30578181015183820152602001612b18565b50505f910152565b602081525f8251806020840152612b56816040850160208701612b16565b601f01601f19169190910160400192915050565b5f60208284031215612b7a575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612bb757612bb7612b81565b500490565b808202811582820484141761051057610510612b95565b6001600160a01b038116811461105b575f80fd5b805161291081612935565b5f8060408385031215612c03575f80fd5b82516001600160401b0380821115612c19575f80fd5b9084019060608287031215612c2c575f80fd5b612c346129bd565b82518152602080840151612c4781612bd3565b82820152604084015183811115612c5c575f80fd5b80850194505087601f850112612c70575f80fd5b83519250612c80612a9584612a15565b8381528882858701011115612c93575f80fd5b612ca284838301848801612b16565b80604084015250819550612cb7818801612be7565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612d1e57607f821691505b6020821081036128dd57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612d9581612d0a565b806020870152604060018084165f8114612db65760018114612dd257612dff565b60ff19851660408a0152604084151560051b8a01019550612dff565b895f5260205f205f5b85811015612df65781548b8201860152908301908801612ddb565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561051057610510612b95565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561051057610510612b95565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610bef57805f5260205f20601f840160051c81016020851015612f8b5750805b601f840160051c820191505b818110156104f9575f8155600101612f97565b81516001600160401b03811115612fc357612fc36129a9565b612fd781612fd18454612d0a565b84612f66565b602080601f83116001811461300a575f8415612ff35750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b8281101561303857888601518255948401946001909101908401613019565b508582101561305557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215613075575f80fd5b813561292e81612bd3565b6001600160401b038181168382160190808211156130a0576130a0612b95565b5092915050565b6001600160401b038181168382160280821691908281146130ca576130ca612b95565b505092915050565b5f6001600160401b03808416806130eb576130eb612b81565b92169190910492915050565b5f8251613108818460208701612b16565b9190910192915050565b5f60208284031215613122575f80fd5b813560ff8116811461292e575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -348,24 +353,24 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x79f54eb1. +// Initialize is a paid mutator transaction binding the contract method 0x00e41792. // -// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,address) settings) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) Initialize(opts *bind.TransactOpts, settings StakingManagerSettings) (*types.Transaction, error) { +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,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 0x79f54eb1. +// Initialize is a paid mutator transaction binding the contract method 0x00e41792. // -// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,address) settings) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) Initialize(settings StakingManagerSettings) (*types.Transaction, error) { +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,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 0x79f54eb1. +// Initialize is a paid mutator transaction binding the contract method 0x00e41792. // -// Solidity: function initialize((bytes32,bytes32,uint256,uint256,uint64,uint8,address) settings) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings StakingManagerSettings) (*types.Transaction, error) { +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } @@ -965,14 +970,14 @@ func (it *NativeTokenStakingManagerValidationPeriodRegisteredIterator) Close() e // NativeTokenStakingManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerValidationPeriodRegistered struct { ValidationID [32]byte - StakeAmount *big.Int + Weight *big.Int Timestamp *big.Int Raw types.Log // Blockchain specific contextual infos } // FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*NativeTokenStakingManagerValidationPeriodRegisteredIterator, error) { var validationIDRule []interface{} @@ -989,7 +994,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValid // WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -1031,7 +1036,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValida // ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. // -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 stakeAmount, uint256 timestamp) +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*NativeTokenStakingManagerValidationPeriodRegistered, error) { event := new(NativeTokenStakingManagerValidationPeriodRegistered) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { @@ -1112,7 +1117,7 @@ func (it *NativeTokenStakingManagerValidatorRemovalInitializedIterator) Close() type NativeTokenStakingManagerValidatorRemovalInitialized struct { ValidationID [32]byte SetWeightMessageID [32]byte - StakeAmount *big.Int + Weight *big.Int EndTime *big.Int Uptime uint64 Raw types.Log // Blockchain specific contextual infos @@ -1120,7 +1125,7 @@ type NativeTokenStakingManagerValidatorRemovalInitialized struct { // FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*NativeTokenStakingManagerValidatorRemovalInitializedIterator, error) { var validationIDRule []interface{} @@ -1141,7 +1146,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValid // WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -1187,7 +1192,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValida // ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerValidatorRemovalInitialized, error) { event := new(NativeTokenStakingManagerValidatorRemovalInitialized) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 35f42d276..c5048cc9e 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -13,7 +13,7 @@ import {SafeERC20TransferFrom} from "@utilities/SafeERC20TransferFrom.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 {ValidatorManagerSettings} from "./interfaces/IValidatorManager.sol"; +import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; contract ERC20TokenStakingManager is @@ -56,35 +56,18 @@ contract ERC20TokenStakingManager is } function initialize( - ValidatorManagerSettings calldata settings, - uint256 minimumStakeAmount, - uint256 maximumStakeAmount, - uint64 minimumStakeDuration, - IRewardCalculator rewardCalculator, + PoSValidatorManagerSettings calldata settings, IERC20 token ) external initializer { - __ERC20TokenStakingManager_init({ - settings: settings, - minimumStakeAmount: minimumStakeAmount, - maximumStakeAmount: maximumStakeAmount, - minimumStakeDuration: minimumStakeDuration, - rewardCalculator: rewardCalculator, - token: token - }); + __ERC20TokenStakingManager_init(settings, token); } // solhint-disable func-name-mixedcase function __ERC20TokenStakingManager_init( - ValidatorManagerSettings calldata settings, - uint256 minimumStakeAmount, - uint256 maximumStakeAmount, - uint64 minimumStakeDuration, - IRewardCalculator rewardCalculator, + PoSValidatorManagerSettings calldata settings, IERC20 token ) internal onlyInitializing { - __POS_Validator_Manager_init( - settings, minimumStakeAmount, maximumStakeAmount, minimumStakeDuration, rewardCalculator - ); + __POS_Validator_Manager_init(settings); __ERC20TokenStakingManager_init_unchained(token); } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 40c72ef3e..7abc6b2bf 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -11,7 +11,7 @@ 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 {ValidatorManagerSettings} from "./interfaces/IValidatorManager.sol"; +import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; contract NativeTokenStakingManager is @@ -28,29 +28,16 @@ contract NativeTokenStakingManager is } // solhint-disable ordering - function initialize( - ValidatorManagerSettings calldata settings, - uint256 minimumStakeAmount, - uint256 maximumStakeAmount, - uint64 minimumStakeDuration, - IRewardCalculator rewardCalculator - ) external initializer { - __NativeTokenStakingManager_init( - settings, minimumStakeAmount, maximumStakeAmount, minimumStakeDuration, rewardCalculator - ); + function initialize(PoSValidatorManagerSettings calldata settings) external initializer { + __NativeTokenStakingManager_init(settings); } // solhint-disable-next-line func-name-mixedcase - function __NativeTokenStakingManager_init( - ValidatorManagerSettings calldata settings, - uint256 minimumStakeAmount, - uint256 maximumStakeAmount, - uint64 minimumStakeDuration, - IRewardCalculator rewardCalculator - ) internal onlyInitializing { - __POS_Validator_Manager_init( - settings, minimumStakeAmount, maximumStakeAmount, minimumStakeDuration, rewardCalculator - ); + function __NativeTokenStakingManager_init(PoSValidatorManagerSettings calldata settings) + internal + onlyInitializing + { + __POS_Validator_Manager_init(settings); } // solhint-disable-next-line func-name-mixedcase, no-empty-blocks diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 0f3888c94..fb9af1574 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -6,7 +6,7 @@ pragma solidity 0.8.25; import {IPoSValidatorManager} from "./interfaces/IPoSValidatorManager.sol"; -import {ValidatorManagerSettings} from "./interfaces/IValidatorManager.sol"; +import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; import {ValidatorManager} from "./ValidatorManager.sol"; import {WarpMessage} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; @@ -42,16 +42,16 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager } // solhint-disable-next-line func-name-mixedcase - function __POS_Validator_Manager_init( - ValidatorManagerSettings calldata settings, - uint256 minimumStakeAmount, - uint256 maximumStakeAmount, - uint64 minimumStakeDuration, - IRewardCalculator rewardCalculator - ) internal onlyInitializing { - __ValidatorManager_init(settings); + function __POS_Validator_Manager_init(PoSValidatorManagerSettings calldata settings) + internal + onlyInitializing + { + __ValidatorManager_init(settings.baseSettings); __POS_Validator_Manager_init_unchained( - minimumStakeAmount, maximumStakeAmount, minimumStakeDuration, rewardCalculator + settings.minimumStakeAmount, + settings.maximumStakeAmount, + settings.minimumStakeDuration, + settings.rewardCalculator ); } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 2430cc80a..f3678871a 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -5,7 +5,16 @@ pragma solidity 0.8.25; -import {IValidatorManager} from "./IValidatorManager.sol"; +import {IValidatorManager, ValidatorManagerSettings} from "./IValidatorManager.sol"; +import {IRewardCalculator} from "./IRewardCalculator.sol"; + +struct PoSValidatorManagerSettings { + ValidatorManagerSettings baseSettings; + uint256 minimumStakeAmount; + uint256 maximumStakeAmount; + uint64 minimumStakeDuration; + IRewardCalculator rewardCalculator; +} interface IPoSValidatorManager is IValidatorManager { /** diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 45d0a9bdc..a49336a6e 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -8,6 +8,7 @@ pragma solidity 0.8.25; import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; +import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {ExampleERC20} from "@mocks/ExampleERC20.sol"; @@ -26,18 +27,20 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { // Construct the object under test app = new ERC20TokenStakingManager(ICMInitializable.Allowed); token = new ExampleERC20(); - app.initialize({ - settings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, - subnetID: DEFAULT_SUBNET_ID, - maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + rewardCalculator: IRewardCalculator(address(0)) }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - rewardCalculator: IRewardCalculator(address(0)), - token: token - }); + token + ); validatorManager = app; posValidatorManager = app; } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 114f70e28..79827827f 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -8,6 +8,7 @@ pragma solidity 0.8.25; import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; +import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; @@ -20,15 +21,17 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { // Construct the object under test app = new NativeTokenStakingManager(ICMInitializable.Allowed); app.initialize( - ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, - subnetID: DEFAULT_SUBNET_ID, - maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN - }), - DEFAULT_MINIMUM_STAKE, - DEFAULT_MAXIMUM_STAKE, - DEFAULT_MINIMUM_STAKE_DURATION, - IRewardCalculator(address(0)) + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + rewardCalculator: IRewardCalculator(address(0)) + }) ); validatorManager = app; posValidatorManager = app; From 008ef9d6f6b093cb5119c56f381e354df130062e Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 08:34:44 -0400 Subject: [PATCH 102/545] fix lints --- contracts/staking/ERC20TokenStakingManager.sol | 1 - contracts/staking/ExampleRewardCalculator.sol | 5 +---- contracts/staking/NativeTokenStakingManager.sol | 1 - 3 files changed, 1 insertion(+), 6 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index c5048cc9e..a26f1dc95 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -14,7 +14,6 @@ import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC import {ICMInitializable} from "../utilities/ICMInitializable.sol"; import {PoSValidatorManager} from "./PoSValidatorManager.sol"; import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; -import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; contract ERC20TokenStakingManager is Initializable, diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index 42a7711ec..981a9db95 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -26,9 +26,6 @@ contract ExampleRewardCalculator is IRewardCalculator { uint256, // initialSupply uint256 // endSupply ) external view returns (uint256) { - return - (stakeAmount * rewardBasisPoints * (endTime - startTime)) / - SECONDS_IN_YEAR / - 1000; + return (stakeAmount * rewardBasisPoints * (endTime - startTime)) / SECONDS_IN_YEAR / 1000; } } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 7abc6b2bf..1099dbef1 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -12,7 +12,6 @@ import {Initializable} from import {ICMInitializable} from "../utilities/ICMInitializable.sol"; import {PoSValidatorManager} from "./PoSValidatorManager.sol"; import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; -import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; contract NativeTokenStakingManager is Initializable, From 5c3683bc2cbe5ae4d53dbaeae7317ea480c9aac7 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 08:44:55 -0400 Subject: [PATCH 103/545] fix e2e tests --- tests/flows/erc20_token_staking.go | 2 +- tests/flows/native_token_staking.go | 2 +- tests/utils/staking.go | 20 ++++++++++++-------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/tests/flows/erc20_token_staking.go b/tests/flows/erc20_token_staking.go index 0f2fbccad..a9bb4f8cb 100644 --- a/tests/flows/erc20_token_staking.go +++ b/tests/flows/erc20_token_staking.go @@ -134,7 +134,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.StakeAmount.Uint64()).Should(Equal(weight)) + Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) diff --git a/tests/flows/native_token_staking.go b/tests/flows/native_token_staking.go index e66602083..74aa0fe34 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/native_token_staking.go @@ -131,7 +131,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.StakeAmount.Uint64()).Should(Equal(weight)) + Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 8be531e5c..453464e8f 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -65,13 +65,15 @@ func DeployAndInitializeNativeTokenStakingManager( Expect(err).Should(BeNil()) tx, err := stakingManager.Initialize( opts, - nativetokenstakingmanager.StakingManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, - SubnetID: subnet.SubnetID, + nativetokenstakingmanager.PoSValidatorManagerSettings{ + BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnet.SubnetID, + MaximumHourlyChurn: 0, + }, MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), MinimumStakeDuration: uint64(24 * time.Hour), - MaximumHourlyChurn: 0, RewardCalculator: common.Address{}, }, ) @@ -123,13 +125,15 @@ func DeployAndInitializeERC20TokenStakingManager( Expect(err).Should(BeNil()) tx, err := stakingManager.Initialize( opts, - erc20tokenstakingmanager.StakingManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, - SubnetID: subnet.SubnetID, + erc20tokenstakingmanager.PoSValidatorManagerSettings{ + BaseSettings: erc20tokenstakingmanager.ValidatorManagerSettings{ + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnet.SubnetID, + MaximumHourlyChurn: 0, + }, MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), MinimumStakeDuration: uint64(24 * time.Hour), - MaximumHourlyChurn: 0, RewardCalculator: common.Address{}, }, erc20Address, From c69fb5f068f154dc01c6b8c6577d752d58cc4e7b Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 09:47:51 -0400 Subject: [PATCH 104/545] poa e2e test --- .../PoAValidatorManager.go | 1358 +++++++++++++++++ scripts/abi_bindings.sh | 2 +- tests/flows/erc20_token_staking.go | 1 - tests/flows/poa_validator_manager.go | 197 +++ tests/utils/staking.go | 128 ++ 5 files changed, 1684 insertions(+), 2 deletions(-) create mode 100644 abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go create mode 100644 tests/flows/poa_validator_manager.go diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go new file mode 100644 index 000000000..2a881915a --- /dev/null +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -0,0 +1,1358 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package poavalidatormanager + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type ValidatorManagerSettings struct { + PChainBlockchainID [32]byte + SubnetID [32]byte + MaximumHourlyChurn uint8 +} + +// 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612d67380380612d6783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c1a8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b83660046123bb565b6101b1565b005b6100d26100cd36600461247f565b6103a9565b6040519081526020015b60405180910390f35b6100bd6103c9565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f3660046123bb565b6103dc565b6100bd610152366004612535565b6103e9565b6101196005600160991b0181565b6100bd6101733660046123bb565b610702565b6100bd610186366004612569565b610816565b6100bd6101993660046125a5565b610924565b6100bd6101ac3660046125cd565b61095e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612bee83398151915293929190829060ff166005811115610212576102126125f7565b6005811115610223576102236125f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102ba576102ba6125f7565b146103245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f610335848361010001515f610d92565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061036290849060040161262d565b6020604051808303815f875af115801561037e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a2919061265f565b5050505050565b5f6103b2610faf565b6103be8486858561100a565b90505b949350505050565b6103d1610faf565b6103da5f61148e565b565b6103e6815f6114fe565b50565b5f5f80516020612bee8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610444573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261046b9190810190612681565b915091508061048c5760405162461bcd60e51b815260040161031b90612753565b82548251146104ef5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161031b565b60208201516001600160a01b0316156105625760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161031b565b5f8061057184604001516118b2565b91509150806105d35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161031b565b5f828152600586016020526040812080546105ed90612799565b905011801561061f575060015f83815260068701602052604090205460ff16600581111561061d5761061d6125f7565b145b61063b5760405162461bcd60e51b815260040161031b906127d1565b5f828152600586016020526040812061065391612371565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612bee83398151915292919061074a90612799565b905011801561077c575060015f83815260068301602052604090205460ff16600581111561077a5761077a6125f7565b145b6107985760405162461bcd60e51b815260040161031b906127d1565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107d19190600401612818565b6020604051808303815f875af11580156107ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610811919061265f565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561085a5750825b90505f826001600160401b031660011480156108755750303b155b905081158015610883575080155b156108a15760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108cb57845460ff60401b1916600160401b1785555b6108d58787611a53565b831561091b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61092c610faf565b6001600160a01b03811661095557604051631e4fbdf760e01b81525f600482015260240161031b565b6103e68161148e565b5f5f80516020612bee8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156109b9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109e09190810190612681565b9150915080610a015760405162461bcd60e51b815260040161031b90612753565b5f8415610a85575f610a168460400151611a71565b919350909150506001600160401b03811615610a7f5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161031b565b50610afb565b5f610a9384604001516118b2565b90925090508015610af95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161031b565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610b2d57610b2d6125f7565b6005811115610b3e57610b3e6125f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610bef5760405162461bcd60e51b815260040161031b906128a2565b5f600382516005811115610c0557610c056125f7565b1480610c235750600282516005811115610c2157610c216125f7565b145b15610c4657506020808201515f9081526007870190915260408120556004610c4a565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610c7b57610c7b6125f7565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610e0b57610dcb816001612902565b610dd690600861291b565b5081515f90839083908110610ded57610ded612932565b60200101906001600160f81b03191690815f1a905350600101610db7565b505f5b6004811015610e6e57610e22816003612902565b610e2d90600861291b565b6001901c60f81b82610e40836002612946565b81518110610e5057610e50612932565b60200101906001600160f81b03191690815f1a905350600101610e0e565b505f5b6020811015610ed057610e8581601f612902565b610e9090600861291b565b86901c60f81b82610ea2836006612946565b81518110610eb257610eb2612932565b60200101906001600160f81b03191690815f1a905350600101610e71565b505f5b6008811015610f3b57610ee7816007612902565b610ef290600861291b565b6001600160401b038616901c60f81b82610f0d836026612946565b81518110610f1d57610f1d612932565b60200101906001600160f81b03191690815f1a905350600101610ed3565b505f5b6008811015610fa657610f52816007612902565b610f5d90600861291b565b6001600160401b038516901c60f81b82610f7883602e612946565b81518110610f8857610f88612932565b60200101906001600160f81b03191690815f1a905350600101610f3e565b50949350505050565b33610fe17f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103da5760405163118cdaa760e01b815233600482015260240161031b565b5f611013611cac565b5f80516020612bee833981519152426001600160401b03851611801561104d57506001600160401b03841661104b426202a300612946565b115b6110af5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161031b565b856111065760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161031b565b5f868152600782016020526040902054156111745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161031b565b82516030146111db5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161031b565b6111e485611cf6565b5f8061122b6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611e97565b5f82815260058601602052604090209193509150611249828261299d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061127690859060040161262d565b6020604051808303815f875af1158015611292573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b6919061265f565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff1916600183600581111561133c5761133c6125f7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103c160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612bee83398151915293929190829060ff16600581111561155f5761155f6125f7565b6005811115611570576115706125f7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561160a5761160a6125f7565b146116665760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161031b565b60c08101516001600160a01b0316336001600160a01b03161461169b5760405162461bcd60e51b815260040161031b906128a2565b6116a88160400151611cf6565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff191660018360058111156116f4576116f46125f7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f906117e590869083610d92565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061181490859060040161262d565b6020604051808303815f875af1158015611830573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611854919061265f565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f8082516027146118d55760405162461bcd60e51b815260040161031b90612a5c565b5f805b6002811015611924576118ec816001612902565b6118f790600861291b565b61ffff1685828151811061190d5761190d612932565b016020015160f81c901b91909117906001016118d8565b5061ffff8116156119475760405162461bcd60e51b815260040161031b90612aa5565b5f805b60048110156119a25761195e816003612902565b61196990600861291b565b63ffffffff168661197b836002612946565b8151811061198b5761198b612932565b016020015160f81c901b919091179060010161194a565b5063ffffffff81166002146119c95760405162461bcd60e51b815260040161031b90612ae8565b5f805b6020811015611a1e576119e081601f612902565b6119eb90600861291b565b876119f7836006612946565b81518110611a0757611a07612932565b016020015160f81c901b91909117906001016119cc565b505f86602681518110611a3357611a33612932565b016020015191976001600160f81b03199092161515965090945050505050565b611a5b612262565b611a64826122ab565b611a6d816122cc565b5050565b5f805f8351603614611a955760405162461bcd60e51b815260040161031b90612a5c565b5f805b6002811015611ae457611aac816001612902565b611ab790600861291b565b61ffff16868281518110611acd57611acd612932565b016020015160f81c901b9190911790600101611a98565b5061ffff811615611b075760405162461bcd60e51b815260040161031b90612aa5565b5f805b6004811015611b6257611b1e816003612902565b611b2990600861291b565b63ffffffff1687611b3b836002612946565b81518110611b4b57611b4b612932565b016020015160f81c901b9190911790600101611b0a565b5063ffffffff8116600114611b895760405162461bcd60e51b815260040161031b90612ae8565b5f805b6020811015611bde57611ba081601f612902565b611bab90600861291b565b88611bb7836006612946565b81518110611bc757611bc7612932565b016020015160f81c901b9190911790600101611b8c565b505f805b6008811015611c3d57611bf6816007612902565b611c0190600861291b565b6001600160401b031689611c16836026612946565b81518110611c2657611c26612932565b016020015160f81c901b9190911790600101611be2565b505f805b6008811015611c9c57611c55816007612902565b611c6090600861291b565b6001600160401b03168a611c7583602e612946565b81518110611c8557611c85612932565b016020015160f81c901b9190911790600101611c41565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611cf057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612bee8339815191529060ff165f03611d34575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611d7c9083612902565b10611d98576001600160401b0384166040830152808252611db7565b8382604001818151611daa9190612b2f565b6001600160401b03169052505b5f826020015183604001516064611dce9190612b56565b611dd89190612b81565b600285015490915060ff9081169082161115611e535760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161031b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611f015760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161031b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611f7857611f38816001612902565b611f4390600861291b565b5081515f90839083908110611f5a57611f5a612932565b60200101906001600160f81b03191690815f1a905350600101611f24565b505f5b6004811015611fd657611f8f816003612902565b611f9a90600861291b565b505f82611fa8836002612946565b81518110611fb857611fb8612932565b60200101906001600160f81b03191690815f1a905350600101611f7b565b505f5b60208110156120335784518160208110611ff557611ff5612932565b1a60f81b82612005836006612946565b8151811061201557612015612932565b60200101906001600160f81b03191690815f1a905350600101611fd9565b505f5b6020811015612093578460200151816020811061205557612055612932565b1a60f81b82612065836026612946565b8151811061207557612075612932565b60200101906001600160f81b03191690815f1a905350600101612036565b505f5b6008811015612107576120aa816007612902565b6120b590600861291b565b60ff1685604001516001600160401b0316901c60f81b828260466120d99190612946565b815181106120e9576120e9612932565b60200101906001600160f81b03191690815f1a905350600101612096565b505f5b6030811015612172578460800151818151811061212957612129612932565b01602001516001600160f81b0319168261214483604e612946565b8151811061215457612154612932565b60200101906001600160f81b03191690815f1a90535060010161210a565b505f5b60088110156121e457612189816007612902565b61219490600861291b565b60608601516001600160401b0390811691161c60f81b826121b683607e612946565b815181106121c6576121c6612932565b60200101906001600160f81b03191690815f1a905350600101612175565b506002816040516121f59190612bb2565b602060405180830381855afa158015612210573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612233919061265f565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103da57604051631afcd79f60e31b815260040160405180910390fd5b6122b3612262565b6122bb6122dd565b6122c36122ed565b6103e6816122f5565b6122d4612262565b6103e681612361565b6122e5612262565b6103da612369565b6103da612262565b6122fd612262565b80355f80516020612bee83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123476060830160408401612bcd565b600291909101805460ff191660ff90921691909117905550565b61092c612262565b61223c612262565b50805461237d90612799565b5f825580601f1061238c575050565b601f0160209004905f5260205f20908101906103e691905b808211156123b7575f81556001016123a4565b5090565b5f602082840312156123cb575f80fd5b5035919050565b80356001600160401b03811681146123e8575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612423576124236123ed565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612451576124516123ed565b604052919050565b5f6001600160401b03821115612471576124716123ed565b50601f01601f191660200190565b5f805f8060808587031215612492575f80fd5b61249b856123d2565b9350602085013592506124b0604086016123d2565b915060608501356001600160401b038111156124ca575f80fd5b8501601f810187136124da575f80fd5b80356124ed6124e882612459565b612429565b818152886020838501011115612501575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146123e8575f80fd5b5f60208284031215612545575f80fd5b61254e82612522565b9392505050565b6001600160a01b03811681146103e6575f80fd5b5f80828403608081121561257b575f80fd5b6060811215612588575f80fd5b50829150606083013561259a81612555565b809150509250929050565b5f602082840312156125b5575f80fd5b813561254e81612555565b80151581146103e6575f80fd5b5f80604083850312156125de575f80fd5b6125e783612522565b9150602083013561259a816125c0565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561262557818101518382015260200161260d565b50505f910152565b602081525f825180602084015261264b81604085016020870161260b565b601f01601f19169190910160400192915050565b5f6020828403121561266f575f80fd5b5051919050565b80516123e8816125c0565b5f8060408385031215612692575f80fd5b82516001600160401b03808211156126a8575f80fd5b90840190606082870312156126bb575f80fd5b6126c3612401565b825181526020808401516126d681612555565b828201526040840151838111156126eb575f80fd5b80850194505087601f8501126126ff575f80fd5b8351925061270f6124e884612459565b8381528882858701011115612722575f80fd5b6127318483830184880161260b565b80604084015250819550612746818801612676565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c908216806127ad57607f821691505b6020821081036127cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461282a81612799565b806020870152604060018084165f811461284b576001811461286757612894565b60ff19851660408a0152604084151560051b8a01019550612894565b895f5260205f205f5b8581101561288b5781548b8201860152908301908801612870565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612915576129156128ee565b92915050565b8082028115828204841417612915576129156128ee565b634e487b7160e01b5f52603260045260245ffd5b80820180821115612915576129156128ee565b601f82111561081157805f5260205f20601f840160051c8101602085101561297e5750805b601f840160051c820191505b818110156103a2575f815560010161298a565b81516001600160401b038111156129b6576129b66123ed565b6129ca816129c48454612799565b84612959565b602080601f8311600181146129fd575f84156129e65750858301515b5f19600386901b1c1916600185901b178555612a54565b5f85815260208120601f198616915b82811015612a2b57888601518255948401946001909101908401612a0c565b5085821015612a4857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612b4f57612b4f6128ee565b5092915050565b6001600160401b03818116838216028082169190828114612b7957612b796128ee565b505092915050565b5f6001600160401b0380841680612ba657634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612bc381846020870161260b565b9190910192915050565b5f60208284031215612bdd575f80fd5b813560ff8116811461254e575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", +} + +// PoAValidatorManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use PoAValidatorManagerMetaData.ABI instead. +var PoAValidatorManagerABI = PoAValidatorManagerMetaData.ABI + +// PoAValidatorManagerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use PoAValidatorManagerMetaData.Bin instead. +var PoAValidatorManagerBin = PoAValidatorManagerMetaData.Bin + +// DeployPoAValidatorManager deploys a new Ethereum contract, binding an instance of PoAValidatorManager to it. +func DeployPoAValidatorManager(auth *bind.TransactOpts, backend bind.ContractBackend, init uint8) (common.Address, *types.Transaction, *PoAValidatorManager, error) { + parsed, err := PoAValidatorManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PoAValidatorManagerBin), backend, init) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &PoAValidatorManager{PoAValidatorManagerCaller: PoAValidatorManagerCaller{contract: contract}, PoAValidatorManagerTransactor: PoAValidatorManagerTransactor{contract: contract}, PoAValidatorManagerFilterer: PoAValidatorManagerFilterer{contract: contract}}, nil +} + +// PoAValidatorManager is an auto generated Go binding around an Ethereum contract. +type PoAValidatorManager struct { + PoAValidatorManagerCaller // Read-only binding to the contract + PoAValidatorManagerTransactor // Write-only binding to the contract + PoAValidatorManagerFilterer // Log filterer for contract events +} + +// PoAValidatorManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type PoAValidatorManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PoAValidatorManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type PoAValidatorManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PoAValidatorManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type PoAValidatorManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PoAValidatorManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type PoAValidatorManagerSession struct { + Contract *PoAValidatorManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// PoAValidatorManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type PoAValidatorManagerCallerSession struct { + Contract *PoAValidatorManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// PoAValidatorManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type PoAValidatorManagerTransactorSession struct { + Contract *PoAValidatorManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// PoAValidatorManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type PoAValidatorManagerRaw struct { + Contract *PoAValidatorManager // Generic contract binding to access the raw methods on +} + +// PoAValidatorManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type PoAValidatorManagerCallerRaw struct { + Contract *PoAValidatorManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// PoAValidatorManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type PoAValidatorManagerTransactorRaw struct { + Contract *PoAValidatorManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewPoAValidatorManager creates a new instance of PoAValidatorManager, bound to a specific deployed contract. +func NewPoAValidatorManager(address common.Address, backend bind.ContractBackend) (*PoAValidatorManager, error) { + contract, err := bindPoAValidatorManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &PoAValidatorManager{PoAValidatorManagerCaller: PoAValidatorManagerCaller{contract: contract}, PoAValidatorManagerTransactor: PoAValidatorManagerTransactor{contract: contract}, PoAValidatorManagerFilterer: PoAValidatorManagerFilterer{contract: contract}}, nil +} + +// NewPoAValidatorManagerCaller creates a new read-only instance of PoAValidatorManager, bound to a specific deployed contract. +func NewPoAValidatorManagerCaller(address common.Address, caller bind.ContractCaller) (*PoAValidatorManagerCaller, error) { + contract, err := bindPoAValidatorManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &PoAValidatorManagerCaller{contract: contract}, nil +} + +// NewPoAValidatorManagerTransactor creates a new write-only instance of PoAValidatorManager, bound to a specific deployed contract. +func NewPoAValidatorManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*PoAValidatorManagerTransactor, error) { + contract, err := bindPoAValidatorManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &PoAValidatorManagerTransactor{contract: contract}, nil +} + +// NewPoAValidatorManagerFilterer creates a new log filterer instance of PoAValidatorManager, bound to a specific deployed contract. +func NewPoAValidatorManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*PoAValidatorManagerFilterer, error) { + contract, err := bindPoAValidatorManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &PoAValidatorManagerFilterer{contract: contract}, nil +} + +// bindPoAValidatorManager binds a generic wrapper to an already deployed contract. +func bindPoAValidatorManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := PoAValidatorManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_PoAValidatorManager *PoAValidatorManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _PoAValidatorManager.Contract.PoAValidatorManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_PoAValidatorManager *PoAValidatorManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.PoAValidatorManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_PoAValidatorManager *PoAValidatorManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.PoAValidatorManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_PoAValidatorManager *PoAValidatorManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _PoAValidatorManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_PoAValidatorManager *PoAValidatorManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_PoAValidatorManager *PoAValidatorManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.contract.Transact(opts, method, params...) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerCaller) WARPMESSENGER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "WARP_MESSENGER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerSession) WARPMESSENGER() (common.Address, error) { + return _PoAValidatorManager.Contract.WARPMESSENGER(&_PoAValidatorManager.CallOpts) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) WARPMESSENGER() (common.Address, error) { + return _PoAValidatorManager.Contract.WARPMESSENGER(&_PoAValidatorManager.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerSession) Owner() (common.Address, error) { + return _PoAValidatorManager.Contract.Owner(&_PoAValidatorManager.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) Owner() (common.Address, error) { + return _PoAValidatorManager.Contract.Owner(&_PoAValidatorManager.CallOpts) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// +// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "completeEndValidation", messageIndex, setWeightMessageType) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// +// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) CompleteEndValidation(messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteEndValidation(&_PoAValidatorManager.TransactOpts, messageIndex, setWeightMessageType) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// +// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteEndValidation(messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteEndValidation(&_PoAValidatorManager.TransactOpts, messageIndex, setWeightMessageType) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) CompleteValidatorRegistration(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "completeValidatorRegistration", messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteValidatorRegistration(&_PoAValidatorManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteValidatorRegistration(&_PoAValidatorManager.TransactOpts, messageIndex) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc151c0b9. +// +// Solidity: function initialize((bytes32,bytes32,uint8) settings, address initialOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) Initialize(opts *bind.TransactOpts, settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initialize", settings, initialOwner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc151c0b9. +// +// Solidity: function initialize((bytes32,bytes32,uint8) settings, address initialOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc151c0b9. +// +// Solidity: function initialize((bytes32,bytes32,uint8) settings, address initialOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x97fb70d4. +// +// Solidity: function initializeEndValidation(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initializeEndValidation", validationID) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x97fb70d4. +// +// Solidity: function initializeEndValidation(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeEndValidation(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeEndValidation(&_PoAValidatorManager.TransactOpts, validationID) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x97fb70d4. +// +// Solidity: function initializeEndValidation(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeEndValidation(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeEndValidation(&_PoAValidatorManager.TransactOpts, validationID) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x3aaa9f25. +// +// Solidity: function initializeValidatorRegistration(uint64 weight, bytes32 nodeID, uint64 registrationExpiry, bytes signature) returns(bytes32 validationID) +func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, weight uint64, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorRegistration", weight, nodeID, registrationExpiry, signature) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x3aaa9f25. +// +// Solidity: function initializeValidatorRegistration(uint64 weight, bytes32 nodeID, uint64 registrationExpiry, bytes signature) returns(bytes32 validationID) +func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorRegistration(weight uint64, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, weight, nodeID, registrationExpiry, signature) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x3aaa9f25. +// +// Solidity: function initializeValidatorRegistration(uint64 weight, bytes32 nodeID, uint64 registrationExpiry, bytes signature) returns(bytes32 validationID) +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorRegistration(weight uint64, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, weight, nodeID, registrationExpiry, signature) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) RenounceOwnership() (*types.Transaction, error) { + return _PoAValidatorManager.Contract.RenounceOwnership(&_PoAValidatorManager.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _PoAValidatorManager.Contract.RenounceOwnership(&_PoAValidatorManager.TransactOpts) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) ResendEndValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "resendEndValidatorMessage", validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.ResendEndValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.ResendEndValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) ResendRegisterValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "resendRegisterValidatorMessage", validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.ResendRegisterValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.ResendRegisterValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.TransferOwnership(&_PoAValidatorManager.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.TransferOwnership(&_PoAValidatorManager.TransactOpts, newOwner) +} + +// PoAValidatorManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitializedIterator struct { + Event *PoAValidatorManagerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerInitialized represents a Initialized event raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*PoAValidatorManagerInitializedIterator, error) { + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &PoAValidatorManagerInitializedIterator{contract: _PoAValidatorManager.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerInitialized) (event.Subscription, error) { + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerInitialized) + if err := _PoAValidatorManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseInitialized(log types.Log) (*PoAValidatorManagerInitialized, error) { + event := new(PoAValidatorManagerInitialized) + if err := _PoAValidatorManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the PoAValidatorManager contract. +type PoAValidatorManagerOwnershipTransferredIterator struct { + Event *PoAValidatorManagerOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerOwnershipTransferred represents a OwnershipTransferred event raised by the PoAValidatorManager contract. +type PoAValidatorManagerOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*PoAValidatorManagerOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerOwnershipTransferredIterator{contract: _PoAValidatorManager.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerOwnershipTransferred) + if err := _PoAValidatorManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseOwnershipTransferred(log types.Log) (*PoAValidatorManagerOwnershipTransferred, error) { + event := new(PoAValidatorManagerOwnershipTransferred) + if err := _PoAValidatorManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodCreatedIterator struct { + Event *PoAValidatorManagerValidationPeriodCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodCreated struct { + ValidationID [32]byte + NodeID [32]byte + RegisterValidationMessageID [32]byte + Weight *big.Int + RegistrationExpiry uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (*PoAValidatorManagerValidationPeriodCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidationPeriodCreatedIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidationPeriodCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*PoAValidatorManagerValidationPeriodCreated, error) { + event := new(PoAValidatorManagerValidationPeriodCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidationPeriodEndedIterator is returned from FilterValidationPeriodEnded and is used to iterate over the raw logs and unpacked data for ValidationPeriodEnded events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodEndedIterator struct { + Event *PoAValidatorManagerValidationPeriodEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidationPeriodEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidationPeriodEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidationPeriodEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodEnded struct { + ValidationID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte) (*PoAValidatorManagerValidationPeriodEndedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidationPeriodEndedIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodEnded, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidationPeriodEnded) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*PoAValidatorManagerValidationPeriodEnded, error) { + event := new(PoAValidatorManagerValidationPeriodEnded) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidationPeriodRegisteredIterator is returned from FilterValidationPeriodRegistered and is used to iterate over the raw logs and unpacked data for ValidationPeriodRegistered events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodRegisteredIterator struct { + Event *PoAValidatorManagerValidationPeriodRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodRegistered struct { + ValidationID [32]byte + Weight *big.Int + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*PoAValidatorManagerValidationPeriodRegisteredIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidationPeriodRegisteredIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidationPeriodRegistered) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*PoAValidatorManagerValidationPeriodRegistered, error) { + event := new(PoAValidatorManagerValidationPeriodRegistered) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidatorRemovalInitializedIterator struct { + Event *PoAValidatorManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidatorRemovalInitialized represents a ValidatorRemovalInitialized event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidatorRemovalInitialized struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + Weight *big.Int + EndTime *big.Int + Uptime uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*PoAValidatorManagerValidatorRemovalInitializedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidatorRemovalInitializedIterator{contract: _PoAValidatorManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidatorRemovalInitialized) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*PoAValidatorManagerValidatorRemovalInitialized, error) { + event := new(PoAValidatorManagerValidatorRemovalInitialized) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index 4b2f09dce..a9380d05c 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -16,7 +16,7 @@ export ARCH=$(uname -m) [ $ARCH = x86_64 ] && ARCH=amd64 echo "ARCH set to $ARCH" -DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager" +DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager PoAValidatorManager" CONTRACT_LIST= HELP= diff --git a/tests/flows/erc20_token_staking.go b/tests/flows/erc20_token_staking.go index a9bb4f8cb..ba40a8073 100644 --- a/tests/flows/erc20_token_staking.go +++ b/tests/flows/erc20_token_staking.go @@ -82,7 +82,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // (Sending to the P-Chain will be skipped for now) signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - // Validate the Warp message, (this will be done on the P-Chain in the future) // Validate the Warp message, (this will be done on the P-Chain in the future) utils.ValidateRegisterSubnetValidatorMessage( signedWarpMessage, diff --git a/tests/flows/poa_validator_manager.go b/tests/flows/poa_validator_manager.go new file mode 100644 index 000000000..c693d0f2a --- /dev/null +++ b/tests/flows/poa_validator_manager.go @@ -0,0 +1,197 @@ +package flows + +import ( + "context" + "math/big" + "time" + + "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/crypto/bls" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/teleporter/tests/interfaces" + "github.com/ava-labs/teleporter/tests/utils" + "github.com/ethereum/go-ethereum/crypto" + . "github.com/onsi/gomega" +) + +/* +* Register a PoA validator manager on a L1. The steps are as follows: +* - Generate random address to be the owner address +* - Fund native assets to the owner address +* - Deploy the PoAValidatorManager contract +* - Attempt to initiate with non owner and check that it fails +* - Initiate validator registration +* - Deliver the Warp message to the P-Chain (not implemented) +* - Aggregate P-Chain signatures on the response Warp message +* - Deliver the Warp message to the L1 +* - Verify that the validator is registered in the validator manager contract + +* Delists the validator from the L1. The steps are as follows: +* - Attempt to initiate with non owner and check that it fails +* - Initiate validator delisting +* - Deliver the Warp message to the P-Chain (not implemented) +* - Aggregate P-Chain signatures on the response Warp message +* - Deliver the Warp message to the L1 +* - Verify that the validator is delisted from the validator manager contract + */ +func PoAValidatorManager(network interfaces.LocalNetwork) { + cChainInfo := network.GetPrimaryNetworkInfo() + subnetAInfo, _ := utils.GetTwoSubnets(network) + _, fundedKey := network.GetFundedAccountInfo() + pChainInfo := utils.GetPChainInfo(cChainInfo) + + signatureAggregator := utils.NewSignatureAggregator( + cChainInfo.NodeURIs[0], + []ids.ID{ + subnetAInfo.SubnetID, + ids.Empty, // Primary network subnet ID + }, + ) + + // Generate random address to be the owner address + ownerKey, err := crypto.GenerateKey() + Expect(err).Should(BeNil()) + ownerAddress := crypto.PubkeyToAddress(ownerKey.PublicKey) + + // Transfer native assets to the non owner account + ctx := context.Background() + fundAmount := big.NewInt(1e18) // 1avax + utils.SendNativeTransfer( + ctx, + subnetAInfo, + fundedKey, + ownerAddress, + fundAmount, + ) + + validatorManagerAddress, validatorManager := utils.DeployAndInitializePoAValidatorManager( + ctx, + fundedKey, + subnetAInfo, + pChainInfo, + ownerAddress, + ) + + var validationID ids.ID // To be used in the delisting step + nodeID := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} + weight := uint64(1) + + { + // Try to call with invalid owner + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + Expect(err).Should(BeNil()) + + _, err = validatorManager.InitializeValidatorRegistration( + opts, + weight, + nodeID, + uint64(time.Now().Add(24*time.Hour).Unix()), + blsPublicKey[:], + ) + Expect(err).ShouldNot(BeNil()) + + // Initiate validator registration + var receipt *types.Receipt + receipt, validationID = utils.InitializePoAValidatorRegistration( + ownerKey, + subnetAInfo, + weight, + nodeID, + blsPublicKey, + validatorManager, + ) + + // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + utils.ValidateRegisterSubnetValidatorMessage( + signedWarpMessage, + nodeID, + weight, + subnetAInfo.SubnetID, + blsPublicKey, + ) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( + validationID, + true, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CompletePoAValidatorRegistration( + fundedKey, + subnetAInfo, + validatorManagerAddress, + registrationSignedMessage, + ) + // Check that the validator is registered in the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidationPeriodRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + } + + // + // Delist the validator + // + { + receipt := utils.InitializeEndPoAValidation( + fundedKey, + subnetAInfo, + validatorManager, + validationID, + ) + validatorRemovalEvent, err := utils.GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + Expect(err).Should(BeNil()) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 0) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( + validationID, + false, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CompleteEndPoAValidation( + fundedKey, + subnetAInfo, + validatorManagerAddress, + registrationSignedMessage, + ) + + // Check that the validator is has been delisted from the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidationPeriodEnded, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + } +} diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 453464e8f..5c998e18f 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -20,6 +20,7 @@ import ( exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/ERC20TokenStakingManager" nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ethereum/go-ethereum/common" @@ -144,6 +145,55 @@ func DeployAndInitializeERC20TokenStakingManager( return stakingManagerContractAddress, stakingManager, erc20Address, erc20 } +func DeployPoAValidatorManager( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, +) (common.Address, *poavalidatormanager.PoAValidatorManager) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + address, tx, validatorManager, err := poavalidatormanager.DeployPoAValidatorManager( + opts, + subnet.RPCClient, + 0, // ICMInitializable.Allowed + ) + Expect(err).Should(BeNil()) + + // Wait for the transaction to be mined + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + + return address, validatorManager +} + +func DeployAndInitializePoAValidatorManager( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + ownerAddress common.Address, +) (common.Address, *poavalidatormanager.PoAValidatorManager) { + validatorManagerAddress, validatorManager := DeployPoAValidatorManager( + ctx, + senderKey, + subnet, + ) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := validatorManager.Initialize( + opts, + poavalidatormanager.ValidatorManagerSettings{ + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnet.SubnetID, + MaximumHourlyChurn: 0, + }, + ownerAddress, + ) + Expect(err).Should(BeNil()) + WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + + return validatorManagerAddress, validatorManager +} + // // Function call utils // @@ -215,6 +265,34 @@ func InitializeERC20ValidatorRegistration( return receipt, ids.ID(registrationInitiatedEvent.ValidationID) } +func InitializePoAValidatorRegistration( + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + weight uint64, + nodeID ids.ID, + blsPublicKey [bls.PublicKeyLen]byte, + validatorManager *poavalidatormanager.PoAValidatorManager, +) (*types.Receipt, ids.ID) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + + tx, err := validatorManager.InitializeValidatorRegistration( + opts, + weight, + nodeID, + uint64(time.Now().Add(24*time.Hour).Unix()), + blsPublicKey[:], + ) + Expect(err).Should(BeNil()) + receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + registrationInitiatedEvent, err := GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidationPeriodCreated, + ) + Expect(err).Should(BeNil()) + return receipt, ids.ID(registrationInitiatedEvent.ValidationID) +} + func CompleteNativeValidatorRegistration( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, @@ -249,6 +327,23 @@ func CompleteERC20ValidatorRegistration( ) } +func CompletePoAValidatorRegistration( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + validatorManagerAddress common.Address, + registrationSignedMessage *avalancheWarp.Message, +) *types.Receipt { + abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + return completeValidatorRegistration( + abi, + sendingKey, + subnet, + validatorManagerAddress, + registrationSignedMessage, + ) +} + func completeValidatorRegistration( abi *abi.ABI, sendingKey *ecdsa.PrivateKey, @@ -312,6 +407,22 @@ func InitializeEndERC20Validation( return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) } +func InitializeEndPoAValidation( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + validatorManager *poavalidatormanager.PoAValidatorManager, + validationID ids.ID, +) *types.Receipt { + opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := validatorManager.InitializeEndValidation( + opts, + validationID, + ) + Expect(err).Should(BeNil()) + return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) +} + func CompleteEndNativeValidation( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, @@ -346,6 +457,23 @@ func CompleteEndERC20Validation( ) } +func CompleteEndPoAValidation( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + validatorManagerAddress common.Address, + registrationSignedMessage *avalancheWarp.Message, +) *types.Receipt { + abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + return callCompleteEndValidation( + abi, + sendingKey, + subnet, + validatorManagerAddress, + registrationSignedMessage, + ) +} + func callCompleteEndValidation( abi *abi.ABI, sendingKey *ecdsa.PrivateKey, From 1196be39f1ffa5ecc19564ced3b9c9e427e3cb52 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 10:18:53 -0400 Subject: [PATCH 105/545] restructure e2e test flows --- tests/flows/errors.go | 2 +- .../{ => governance}/validator_set_sig.go | 2 +- .../{ => staking}/erc20_token_staking.go | 2 +- .../{ => staking}/native_token_staking.go | 2 +- .../{ => staking}/poa_validator_manager.go | 2 +- .../flows/{ => teleporter}/add_fee_amount.go | 2 +- .../{ => teleporter}/basic_send_receive.go | 2 +- .../deliver_to_nonexistent_contract.go | 2 +- .../deliver_to_wrong_chain.go | 2 +- .../{ => teleporter}/insufficient_gas.go | 2 +- .../registry}/check_upgrade_access.go | 8 +- .../registry}/pause_teleporter.go | 2 +- .../registry}/teleporter_registry.go | 2 +- .../{ => teleporter}/relay_message_twice.go | 2 +- .../relayer_modifies_message.go | 2 +- .../resubmit_altered_message.go | 2 +- .../retry_successful_execution.go | 2 +- .../send_specific_receipts.go | 2 +- .../teleporter_message_ids.go | 2 +- .../{ => teleporter}/unallowed_relayer.go | 2 +- .../flows/{ => teleporter}/validator_churn.go | 2 +- tests/local/e2e_test.go | 85 ++++++++++--------- tests/testnet/main/run_testnet_flows.go | 26 +++--- 23 files changed, 86 insertions(+), 73 deletions(-) rename tests/flows/{ => governance}/validator_set_sig.go (99%) rename tests/flows/{ => staking}/erc20_token_staking.go (99%) rename tests/flows/{ => staking}/native_token_staking.go (99%) rename tests/flows/{ => staking}/poa_validator_manager.go (99%) rename tests/flows/{ => teleporter}/add_fee_amount.go (99%) rename tests/flows/{ => teleporter}/basic_send_receive.go (99%) rename tests/flows/{ => teleporter}/deliver_to_nonexistent_contract.go (99%) rename tests/flows/{ => teleporter}/deliver_to_wrong_chain.go (99%) rename tests/flows/{ => teleporter}/insufficient_gas.go (99%) rename tests/flows/{ => teleporter/registry}/check_upgrade_access.go (95%) rename tests/flows/{ => teleporter/registry}/pause_teleporter.go (99%) rename tests/flows/{ => teleporter/registry}/teleporter_registry.go (99%) rename tests/flows/{ => teleporter}/relay_message_twice.go (99%) rename tests/flows/{ => teleporter}/relayer_modifies_message.go (99%) rename tests/flows/{ => teleporter}/resubmit_altered_message.go (99%) rename tests/flows/{ => teleporter}/retry_successful_execution.go (99%) rename tests/flows/{ => teleporter}/send_specific_receipts.go (99%) rename tests/flows/{ => teleporter}/teleporter_message_ids.go (98%) rename tests/flows/{ => teleporter}/unallowed_relayer.go (99%) rename tests/flows/{ => teleporter}/validator_churn.go (99%) diff --git a/tests/flows/errors.go b/tests/flows/errors.go index c3efc7ec4..9ba39996c 100644 --- a/tests/flows/errors.go +++ b/tests/flows/errors.go @@ -1,5 +1,5 @@ package flows const ( - errTxReverted = "execution reverted" + ErrTxReverted = "execution reverted" ) diff --git a/tests/flows/validator_set_sig.go b/tests/flows/governance/validator_set_sig.go similarity index 99% rename from tests/flows/validator_set_sig.go rename to tests/flows/governance/validator_set_sig.go index 1789b9bf1..a9685a966 100644 --- a/tests/flows/validator_set_sig.go +++ b/tests/flows/governance/validator_set_sig.go @@ -1,4 +1,4 @@ -package flows +package governance import ( "context" diff --git a/tests/flows/erc20_token_staking.go b/tests/flows/staking/erc20_token_staking.go similarity index 99% rename from tests/flows/erc20_token_staking.go rename to tests/flows/staking/erc20_token_staking.go index ba40a8073..22880ed47 100644 --- a/tests/flows/erc20_token_staking.go +++ b/tests/flows/staking/erc20_token_staking.go @@ -1,4 +1,4 @@ -package flows +package staking import ( "context" diff --git a/tests/flows/native_token_staking.go b/tests/flows/staking/native_token_staking.go similarity index 99% rename from tests/flows/native_token_staking.go rename to tests/flows/staking/native_token_staking.go index 74aa0fe34..aa3f40879 100644 --- a/tests/flows/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -1,4 +1,4 @@ -package flows +package staking import ( "context" diff --git a/tests/flows/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go similarity index 99% rename from tests/flows/poa_validator_manager.go rename to tests/flows/staking/poa_validator_manager.go index c693d0f2a..1f48e9f43 100644 --- a/tests/flows/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -1,4 +1,4 @@ -package flows +package staking import ( "context" diff --git a/tests/flows/add_fee_amount.go b/tests/flows/teleporter/add_fee_amount.go similarity index 99% rename from tests/flows/add_fee_amount.go rename to tests/flows/teleporter/add_fee_amount.go index 0771d450d..1a05e6e81 100644 --- a/tests/flows/add_fee_amount.go +++ b/tests/flows/teleporter/add_fee_amount.go @@ -1,4 +1,4 @@ -package flows +package teleporter import ( "context" diff --git a/tests/flows/basic_send_receive.go b/tests/flows/teleporter/basic_send_receive.go similarity index 99% rename from tests/flows/basic_send_receive.go rename to tests/flows/teleporter/basic_send_receive.go index 8e4f8e036..fe31746c5 100644 --- a/tests/flows/basic_send_receive.go +++ b/tests/flows/teleporter/basic_send_receive.go @@ -1,4 +1,4 @@ -package flows +package teleporter import ( "context" diff --git a/tests/flows/deliver_to_nonexistent_contract.go b/tests/flows/teleporter/deliver_to_nonexistent_contract.go similarity index 99% rename from tests/flows/deliver_to_nonexistent_contract.go rename to tests/flows/teleporter/deliver_to_nonexistent_contract.go index d5502b26e..ce54899bb 100644 --- a/tests/flows/deliver_to_nonexistent_contract.go +++ b/tests/flows/teleporter/deliver_to_nonexistent_contract.go @@ -1,4 +1,4 @@ -package flows +package teleporter import ( "context" diff --git a/tests/flows/deliver_to_wrong_chain.go b/tests/flows/teleporter/deliver_to_wrong_chain.go similarity index 99% rename from tests/flows/deliver_to_wrong_chain.go rename to tests/flows/teleporter/deliver_to_wrong_chain.go index c0c406584..cbd83754c 100644 --- a/tests/flows/deliver_to_wrong_chain.go +++ b/tests/flows/teleporter/deliver_to_wrong_chain.go @@ -1,4 +1,4 @@ -package flows +package teleporter import ( "context" diff --git a/tests/flows/insufficient_gas.go b/tests/flows/teleporter/insufficient_gas.go similarity index 99% rename from tests/flows/insufficient_gas.go rename to tests/flows/teleporter/insufficient_gas.go index bd5761f08..0ce3b1ca6 100644 --- a/tests/flows/insufficient_gas.go +++ b/tests/flows/teleporter/insufficient_gas.go @@ -1,4 +1,4 @@ -package flows +package teleporter import ( "context" diff --git a/tests/flows/check_upgrade_access.go b/tests/flows/teleporter/registry/check_upgrade_access.go similarity index 95% rename from tests/flows/check_upgrade_access.go rename to tests/flows/teleporter/registry/check_upgrade_access.go index 023c47dd7..61f9b1683 100644 --- a/tests/flows/check_upgrade_access.go +++ b/tests/flows/teleporter/registry/check_upgrade_access.go @@ -1,13 +1,15 @@ -package flows +package registry import ( "context" "math/big" "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/teleporter/tests/flows" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/crypto" + . "github.com/onsi/gomega" ) @@ -53,7 +55,7 @@ func CheckUpgradeAccess(network interfaces.Network) { Expect(err).Should(BeNil()) _, err = testMessenger.PauseTeleporterAddress(nonOwnerOpts, teleporterAddress) Expect(err).ShouldNot(BeNil()) - Expect(err.Error()).Should(ContainSubstring(errTxReverted)) + Expect(err.Error()).Should(ContainSubstring(flows.ErrTxReverted)) // Check that the teleporter address is not paused, because previous call should have failed isPaused, err := testMessenger.IsTeleporterAddressPaused(&bind.CallOpts{}, teleporterAddress) @@ -84,7 +86,7 @@ func CheckUpgradeAccess(network interfaces.Network) { // Try to call unpauseTeleporterAddress from the previous owner account _, err = testMessenger.UnpauseTeleporterAddress(ownerOpts, teleporterAddress) Expect(err).ShouldNot(BeNil()) - Expect(err.Error()).Should(ContainSubstring(errTxReverted)) + Expect(err.Error()).Should(ContainSubstring(flows.ErrTxReverted)) // Make sure the teleporter address is still paused isPaused, err = testMessenger.IsTeleporterAddressPaused(&bind.CallOpts{}, teleporterAddress) diff --git a/tests/flows/pause_teleporter.go b/tests/flows/teleporter/registry/pause_teleporter.go similarity index 99% rename from tests/flows/pause_teleporter.go rename to tests/flows/teleporter/registry/pause_teleporter.go index 8cde4a3ad..41b44849d 100644 --- a/tests/flows/pause_teleporter.go +++ b/tests/flows/teleporter/registry/pause_teleporter.go @@ -1,4 +1,4 @@ -package flows +package registry import ( "context" diff --git a/tests/flows/teleporter_registry.go b/tests/flows/teleporter/registry/teleporter_registry.go similarity index 99% rename from tests/flows/teleporter_registry.go rename to tests/flows/teleporter/registry/teleporter_registry.go index da7bf91a9..d1d00d5d6 100644 --- a/tests/flows/teleporter_registry.go +++ b/tests/flows/teleporter/registry/teleporter_registry.go @@ -1,4 +1,4 @@ -package flows +package registry import ( "context" diff --git a/tests/flows/relay_message_twice.go b/tests/flows/teleporter/relay_message_twice.go similarity index 99% rename from tests/flows/relay_message_twice.go rename to tests/flows/teleporter/relay_message_twice.go index 3c91b7cd9..fec7100c4 100644 --- a/tests/flows/relay_message_twice.go +++ b/tests/flows/teleporter/relay_message_twice.go @@ -1,4 +1,4 @@ -package flows +package teleporter import ( "context" diff --git a/tests/flows/relayer_modifies_message.go b/tests/flows/teleporter/relayer_modifies_message.go similarity index 99% rename from tests/flows/relayer_modifies_message.go rename to tests/flows/teleporter/relayer_modifies_message.go index a0999f6b1..4011ebc6f 100644 --- a/tests/flows/relayer_modifies_message.go +++ b/tests/flows/teleporter/relayer_modifies_message.go @@ -1,4 +1,4 @@ -package flows +package teleporter import ( "context" diff --git a/tests/flows/resubmit_altered_message.go b/tests/flows/teleporter/resubmit_altered_message.go similarity index 99% rename from tests/flows/resubmit_altered_message.go rename to tests/flows/teleporter/resubmit_altered_message.go index 18435a9df..268c8b6cf 100644 --- a/tests/flows/resubmit_altered_message.go +++ b/tests/flows/teleporter/resubmit_altered_message.go @@ -1,4 +1,4 @@ -package flows +package teleporter import ( "context" diff --git a/tests/flows/retry_successful_execution.go b/tests/flows/teleporter/retry_successful_execution.go similarity index 99% rename from tests/flows/retry_successful_execution.go rename to tests/flows/teleporter/retry_successful_execution.go index f9834bbc5..d75439e0f 100644 --- a/tests/flows/retry_successful_execution.go +++ b/tests/flows/teleporter/retry_successful_execution.go @@ -1,4 +1,4 @@ -package flows +package teleporter import ( "context" diff --git a/tests/flows/send_specific_receipts.go b/tests/flows/teleporter/send_specific_receipts.go similarity index 99% rename from tests/flows/send_specific_receipts.go rename to tests/flows/teleporter/send_specific_receipts.go index 3e165a311..603074fe5 100644 --- a/tests/flows/send_specific_receipts.go +++ b/tests/flows/teleporter/send_specific_receipts.go @@ -1,4 +1,4 @@ -package flows +package teleporter import ( "bytes" diff --git a/tests/flows/teleporter_message_ids.go b/tests/flows/teleporter/teleporter_message_ids.go similarity index 98% rename from tests/flows/teleporter_message_ids.go rename to tests/flows/teleporter/teleporter_message_ids.go index 1ae8285b3..f0005c8a1 100644 --- a/tests/flows/teleporter_message_ids.go +++ b/tests/flows/teleporter/teleporter_message_ids.go @@ -1,7 +1,7 @@ // (c) 2024, Ava Labs, Inc. All rights reserved. // See the file LICENSE for licensing terms. -package flows +package teleporter import ( "math/big" diff --git a/tests/flows/unallowed_relayer.go b/tests/flows/teleporter/unallowed_relayer.go similarity index 99% rename from tests/flows/unallowed_relayer.go rename to tests/flows/teleporter/unallowed_relayer.go index 155f55079..fe9ba6c1e 100644 --- a/tests/flows/unallowed_relayer.go +++ b/tests/flows/teleporter/unallowed_relayer.go @@ -1,4 +1,4 @@ -package flows +package teleporter import ( "context" diff --git a/tests/flows/validator_churn.go b/tests/flows/teleporter/validator_churn.go similarity index 99% rename from tests/flows/validator_churn.go rename to tests/flows/teleporter/validator_churn.go index 316c4c8b9..8de4a8c3a 100644 --- a/tests/flows/validator_churn.go +++ b/tests/flows/teleporter/validator_churn.go @@ -1,4 +1,4 @@ -package flows +package teleporter import ( "context" diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index 8b84c6955..673438546 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -7,7 +7,10 @@ import ( "os" "testing" - "github.com/ava-labs/teleporter/tests/flows" + "github.com/ava-labs/teleporter/tests/flows/governance" + "github.com/ava-labs/teleporter/tests/flows/staking" + "github.com/ava-labs/teleporter/tests/flows/teleporter" + "github.com/ava-labs/teleporter/tests/flows/teleporter/registry" deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" "github.com/ethereum/go-ethereum/log" "github.com/onsi/ginkgo/v2" @@ -22,7 +25,7 @@ const ( upgradabilityLabel = "upgradability" utilsLabel = "utils" validatorSetSigLabel = "ValidatorSetSig" - stakingManagerLabel = "StakingManager" + stakingManagerLabel = "ValidatorManager" ) var ( @@ -106,101 +109,107 @@ var _ = ginkgo.Describe("[Teleporter integration tests]", func() { ginkgo.It("Send a message from Subnet A to Subnet B, and one from B to A", ginkgo.Label(teleporterMessengerLabel), func() { - flows.BasicSendReceive(LocalNetworkInstance) + teleporter.BasicSendReceive(LocalNetworkInstance) }) ginkgo.It("Deliver to the wrong chain", ginkgo.Label(teleporterMessengerLabel), func() { - flows.DeliverToWrongChain(LocalNetworkInstance) + teleporter.DeliverToWrongChain(LocalNetworkInstance) }) ginkgo.It("Deliver to non-existent contract", ginkgo.Label(teleporterMessengerLabel), func() { - flows.DeliverToNonExistentContract(LocalNetworkInstance) + teleporter.DeliverToNonExistentContract(LocalNetworkInstance) }) ginkgo.It("Retry successful execution", ginkgo.Label(teleporterMessengerLabel), func() { - flows.RetrySuccessfulExecution(LocalNetworkInstance) + teleporter.RetrySuccessfulExecution(LocalNetworkInstance) }) ginkgo.It("Unallowed relayer", ginkgo.Label(teleporterMessengerLabel), func() { - flows.UnallowedRelayer(LocalNetworkInstance) + teleporter.UnallowedRelayer(LocalNetworkInstance) }) ginkgo.It("Relay message twice", ginkgo.Label(teleporterMessengerLabel), func() { - flows.RelayMessageTwice(LocalNetworkInstance) + teleporter.RelayMessageTwice(LocalNetworkInstance) }) ginkgo.It("Add additional fee amount", ginkgo.Label(teleporterMessengerLabel), func() { - flows.AddFeeAmount(LocalNetworkInstance) + teleporter.AddFeeAmount(LocalNetworkInstance) }) ginkgo.It("Send specific receipts", ginkgo.Label(teleporterMessengerLabel), func() { - flows.SendSpecificReceipts(LocalNetworkInstance) + teleporter.SendSpecificReceipts(LocalNetworkInstance) }) ginkgo.It("Insufficient gas", ginkgo.Label(teleporterMessengerLabel), func() { - flows.InsufficientGas(LocalNetworkInstance) + teleporter.InsufficientGas(LocalNetworkInstance) }) ginkgo.It("Resubmit altered message", ginkgo.Label(teleporterMessengerLabel), func() { - flows.ResubmitAlteredMessage(LocalNetworkInstance) - }) - ginkgo.It("Check upgrade access", - ginkgo.Label(upgradabilityLabel), - func() { - flows.CheckUpgradeAccess(LocalNetworkInstance) - }) - ginkgo.It("Pause and Unpause Teleporter", - ginkgo.Label(upgradabilityLabel), - func() { - flows.PauseTeleporter(LocalNetworkInstance) + teleporter.ResubmitAlteredMessage(LocalNetworkInstance) }) ginkgo.It("Calculate Teleporter message IDs", ginkgo.Label(utilsLabel), func() { - flows.CalculateMessageID(LocalNetworkInstance) + teleporter.CalculateMessageID(LocalNetworkInstance) }) - - // The following tests require special behavior by the relayer, so we only run them on a local network ginkgo.It("Relayer modifies message", ginkgo.Label(teleporterMessengerLabel), func() { - flows.RelayerModifiesMessage(LocalNetworkInstance) + teleporter.RelayerModifiesMessage(LocalNetworkInstance) + }) + ginkgo.It("Validator churn", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporter.ValidatorChurn(LocalNetworkInstance) }) + + // Teleporter Registry tests ginkgo.It("Teleporter registry", ginkgo.Label(upgradabilityLabel), func() { - flows.TeleporterRegistry(LocalNetworkInstance) + registry.TeleporterRegistry(LocalNetworkInstance) }) - ginkgo.It("Deliver ValidatorSetSig signed message", - ginkgo.Label(validatorSetSigLabel), + ginkgo.It("Check upgrade access", + ginkgo.Label(upgradabilityLabel), func() { - flows.ValidatorSetSig(LocalNetworkInstance) + registry.CheckUpgradeAccess(LocalNetworkInstance) }) - ginkgo.It("Validator churn", - ginkgo.Label(teleporterMessengerLabel), + ginkgo.It("Pause and Unpause Teleporter", + ginkgo.Label(upgradabilityLabel), func() { - flows.ValidatorChurn(LocalNetworkInstance) + registry.PauseTeleporter(LocalNetworkInstance) }) + + // Governance tests + ginkgo.It("Deliver ValidatorSetSig signed message", + ginkgo.Label(validatorSetSigLabel), + func() { + governance.ValidatorSetSig(LocalNetworkInstance) + }) + + // Staking tests ginkgo.It("Native token staking manager", ginkgo.Label(stakingManagerLabel), func() { - flows.NativeTokenStakingManager(LocalNetworkInstance) + staking.NativeTokenStakingManager(LocalNetworkInstance) }) ginkgo.It("ERC20 token staking manager", ginkgo.Label(stakingManagerLabel), func() { - flows.ERC20TokenStakingManager(LocalNetworkInstance) + staking.ERC20TokenStakingManager(LocalNetworkInstance) + }) + ginkgo.It("PoA validator manager", + ginkgo.Label(stakingManagerLabel), + func() { + staking.PoAValidatorManager(LocalNetworkInstance) }) - // Since the validator churn test modifies the network topology, we put it last for now. - // It should not affect the other tests, but we get some errors if we run it before the other tests. - // TODO: we should fix this so that the order of the tests does not matter. }) diff --git a/tests/testnet/main/run_testnet_flows.go b/tests/testnet/main/run_testnet_flows.go index 440a02711..5721537e1 100644 --- a/tests/testnet/main/run_testnet_flows.go +++ b/tests/testnet/main/run_testnet_flows.go @@ -3,7 +3,9 @@ package main import ( "github.com/ethereum/go-ethereum/log" - "github.com/ava-labs/teleporter/tests/flows" + "github.com/ava-labs/teleporter/tests/flows/teleporter" + "github.com/ava-labs/teleporter/tests/flows/teleporter/registry" + "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/testnet" "github.com/onsi/gomega" @@ -34,19 +36,19 @@ func main() { // - UnallowedRelayer // - ValidatorSetChrun // - TeleporterRegistry - runFlow("AddFeeAmount", flows.AddFeeAmount, network) - runFlow("BasicSendRecevie", flows.BasicSendReceive, network) - runFlow("DeliverToNonExistentContract", flows.DeliverToNonExistentContract, network) - runFlow("DeliverToWrongChain", flows.DeliverToWrongChain, network) - runFlow("InsufficientGas", flows.InsufficientGas, network) - runFlow("RelayMessageTwice", flows.RelayMessageTwice, network) - runFlow("ResubmitAlteredMessage", flows.ResubmitAlteredMessage, network) - runFlow("RetrySuccessfulExecution", flows.RetrySuccessfulExecution, network) - runFlow("SendSpecificReceipts", flows.SendSpecificReceipts, network) + runFlow("AddFeeAmount", teleporter.AddFeeAmount, network) + runFlow("BasicSendRecevie", teleporter.BasicSendReceive, network) + runFlow("DeliverToNonExistentContract", teleporter.DeliverToNonExistentContract, network) + runFlow("DeliverToWrongChain", teleporter.DeliverToWrongChain, network) + runFlow("InsufficientGas", teleporter.InsufficientGas, network) + runFlow("RelayMessageTwice", teleporter.RelayMessageTwice, network) + runFlow("ResubmitAlteredMessage", teleporter.ResubmitAlteredMessage, network) + runFlow("RetrySuccessfulExecution", teleporter.RetrySuccessfulExecution, network) + runFlow("SendSpecificReceipts", teleporter.SendSpecificReceipts, network) log.Info("Finished Teleporter test flows") // Run the upgradability test flows - runFlow("CheckUpgradeAccess", flows.CheckUpgradeAccess, network) - runFlow("PauseTeleporter", flows.PauseTeleporter, network) + runFlow("CheckUpgradeAccess", registry.CheckUpgradeAccess, network) + runFlow("PauseTeleporter", registry.PauseTeleporter, network) log.Info("Finished upgradability test flows") } From 7587e3a2bba55bea960cbc313ae0328bdefb2ed3 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 10:44:20 -0400 Subject: [PATCH 106/545] fix poa e2e --- tests/flows/staking/poa_validator_manager.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 1f48e9f43..701a22711 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -146,8 +146,17 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { // Delist the validator // { + // Try with invalid validator owner + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + Expect(err).Should(BeNil()) + _, err = validatorManager.InitializeEndValidation( + opts, + validationID, + ) + + Expect(err).ShouldNot(BeNil()) receipt := utils.InitializeEndPoAValidation( - fundedKey, + ownerKey, subnetAInfo, validatorManager, validationID, From c4d89612f9468a851db067307190a4f4a2a4e9ca Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 11:02:36 -0400 Subject: [PATCH 107/545] fix owner key --- tests/flows/staking/poa_validator_manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 701a22711..09e52fe80 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -189,7 +189,7 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteEndPoAValidation( - fundedKey, + ownerKey, subnetAInfo, validatorManagerAddress, registrationSignedMessage, From 38aed0e04b8633b5834dd0ff743aabdc5c1a37b7 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 11:13:54 -0400 Subject: [PATCH 108/545] rename to validationPeriod --- contracts/staking/ValidatorManager.sol | 2 +- contracts/staking/ValidatorMessages.sol | 27 ++++++++++--------- .../staking/tests/ValidatorManagerTests.t.sol | 6 ++--- .../tests/ValidatorMessagesTests.t.sol | 4 +-- 4 files changed, 20 insertions(+), 19 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 61136e89b..64020dbbe 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -121,7 +121,7 @@ abstract contract ValidatorManager is (bytes32 validationID, bytes memory registerSubnetValidatorMessage) = ValidatorMessages .packRegisterSubnetValidatorMessage( - ValidatorMessages.ValidationInfo({ + ValidatorMessages.ValidationPeriod({ subnetID: $._subnetID, nodeID: nodeID, weight: weight, diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index 074c15d9a..bf5fd861e 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -7,8 +7,8 @@ pragma solidity 0.8.25; library ValidatorMessages { // The information that uniquely identifies a subnet validation period. // The validationID is the SHA-256 hash of the concatenation of the CODEC_ID, - // REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID, and the concatenated ValidationInfo fields. - struct ValidationInfo { + // REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID, and the concatenated ValidationPeriod fields. + struct ValidationPeriod { bytes32 subnetID; bytes32 nodeID; uint64 weight; @@ -62,16 +62,16 @@ library ValidatorMessages { * | 134 bytes | * +-----------+ * - * @param validationInfo The information to pack into the message. + * @param validationPeriod The information to pack into the message. * @return The validationID and the packed message. */ - function packRegisterSubnetValidatorMessage(ValidationInfo memory validationInfo) + function packRegisterSubnetValidatorMessage(ValidationPeriod memory validationPeriod) internal pure returns (bytes32, bytes memory) { require( - validationInfo.blsPublicKey.length == 48, "StakingMessages: Invalid signature length" + validationPeriod.blsPublicKey.length == 48, "StakingMessages: Invalid signature length" ); bytes memory res = new bytes(134); // Pack the codec ID @@ -86,23 +86,24 @@ library ValidatorMessages { // Pack the subnetID for (uint256 i; i < 32; ++i) { - res[i + 6] = validationInfo.subnetID[i]; + res[i + 6] = validationPeriod.subnetID[i]; } // Pack the nodeID for (uint256 i; i < 32; ++i) { - res[i + 38] = validationInfo.nodeID[i]; + res[i + 38] = validationPeriod.nodeID[i]; } // Pack the weight for (uint256 i; i < 8; ++i) { - res[i + 70] = bytes1(uint8(validationInfo.weight >> uint8((8 * (7 - i))))); + res[i + 70] = bytes1(uint8(validationPeriod.weight >> uint8((8 * (7 - i))))); } // Pack the blsPublicKey for (uint256 i; i < 48; ++i) { - res[i + 78] = validationInfo.blsPublicKey[i]; + res[i + 78] = validationPeriod.blsPublicKey[i]; } // Pack the registration expiry for (uint256 i; i < 8; ++i) { - res[i + 126] = bytes1(uint8(validationInfo.registrationExpiry >> uint64((8 * (7 - i))))); + res[i + 126] = + bytes1(uint8(validationPeriod.registrationExpiry >> uint64((8 * (7 - i))))); } return (sha256(res), res); } @@ -112,12 +113,12 @@ 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 ValidationInfo. + * @return the unpacked ValidationPeriod. */ function unpackRegisterSubnetValidatorMessage(bytes memory input) internal pure - returns (ValidationInfo memory) + returns (ValidationPeriod memory) { require(input.length == 134, "ValidatorMessages: Invalid message length"); @@ -168,7 +169,7 @@ library ValidatorMessages { expiry |= uint64(uint8(input[i + 126])) << uint64((8 * (7 - i))); } - return ValidationInfo({ + return ValidationPeriod({ subnetID: subnetID, nodeID: nodeID, weight: weight, diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index b180dc38e..f451944ac 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -99,7 +99,7 @@ abstract contract ValidatorManagerTest is Test { ); (, bytes memory registerSubnetValidatorMessage) = ValidatorMessages .packRegisterSubnetValidatorMessage( - ValidatorMessages.ValidationInfo({ + ValidatorMessages.ValidationPeriod({ subnetID: DEFAULT_SUBNET_ID, nodeID: DEFAULT_NODE_ID, weight: DEFAULT_WEIGHT, @@ -210,7 +210,7 @@ abstract contract ValidatorManagerTest is Test { bytes memory blsPublicKey ) internal returns (bytes32 validationID) { (validationID,) = ValidatorMessages.packRegisterSubnetValidatorMessage( - ValidatorMessages.ValidationInfo({ + ValidatorMessages.ValidationPeriod({ nodeID: nodeID, subnetID: subnetID, weight: weight, @@ -220,7 +220,7 @@ abstract contract ValidatorManagerTest is Test { ); (, bytes memory registerSubnetValidatorMessage) = ValidatorMessages .packRegisterSubnetValidatorMessage( - ValidatorMessages.ValidationInfo({ + ValidatorMessages.ValidationPeriod({ subnetID: subnetID, nodeID: nodeID, weight: weight, diff --git a/contracts/staking/tests/ValidatorMessagesTests.t.sol b/contracts/staking/tests/ValidatorMessagesTests.t.sol index f494b22bb..50de496cb 100644 --- a/contracts/staking/tests/ValidatorMessagesTests.t.sol +++ b/contracts/staking/tests/ValidatorMessagesTests.t.sol @@ -24,7 +24,7 @@ contract ValidatorMessagesTest is Test { function testRegisterSubnetValidatorMessage() public pure { (bytes32 validationID, bytes memory packed) = ValidatorMessages .packRegisterSubnetValidatorMessage( - ValidatorMessages.ValidationInfo({ + ValidatorMessages.ValidationPeriod({ subnetID: DEFAULT_SUBNET_ID, nodeID: DEFAULT_NODE_ID, weight: DEFAULT_WEIGHT, @@ -33,7 +33,7 @@ contract ValidatorMessagesTest is Test { }) ); - ValidatorMessages.ValidationInfo memory info = + ValidatorMessages.ValidationPeriod memory info = ValidatorMessages.unpackRegisterSubnetValidatorMessage(packed); assertEq(info.subnetID, DEFAULT_SUBNET_ID); assertEq(info.nodeID, DEFAULT_NODE_ID); From 8e2e8543ae67c332b23804e2f62b9454a796879a Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 11:24:47 -0400 Subject: [PATCH 109/545] move uptime to PoS --- contracts/staking/PoAValidatorManager.sol | 2 +- contracts/staking/PoSValidatorManager.sol | 9 ++++++--- contracts/staking/ValidatorManager.sol | 18 +++++------------- .../staking/interfaces/IValidatorManager.sol | 9 +++------ .../staking/tests/ValidatorManagerTests.t.sol | 5 ++--- 5 files changed, 17 insertions(+), 26 deletions(-) diff --git a/contracts/staking/PoAValidatorManager.sol b/contracts/staking/PoAValidatorManager.sol index 03b0cf4c7..e194b7b0d 100644 --- a/contracts/staking/PoAValidatorManager.sol +++ b/contracts/staking/PoAValidatorManager.sol @@ -51,6 +51,6 @@ contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableU // solhint-enable ordering function initializeEndValidation(bytes32 validationID) external override { - _initializeEndValidation(validationID, 0); + _initializeEndValidation(validationID); } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index fb9af1574..2723600b4 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -21,6 +21,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 _maximumStakeAmount; uint64 _minimumStakeDuration; IRewardCalculator _rewardCalculator; + mapping(bytes32 validationID => uint64) _uptimes; } // solhint-enable private-vars-leading-underscore @@ -74,8 +75,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bool includeUptimeProof, uint32 messageIndex ) external { - uint64 uptimeSeconds; if (includeUptimeProof) { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); require(valid, "StakingManager: Invalid warp message"); @@ -94,9 +95,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( validationID == uptimeValidationID, "StakingManager: Invalid uptime validation ID" ); - uptimeSeconds = uptime; + + $._uptimes[validationID] = uptime; } - _initializeEndValidation(validationID, uptimeSeconds); + + _initializeEndValidation(validationID); } function _processStake(uint256 stakeAmount) internal virtual returns (uint64) { diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 64020dbbe..7cd6c799c 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -137,13 +137,11 @@ abstract contract ValidatorManager is $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.PendingAdded, nodeID: nodeID, + owner: _msgSender(), + messageNonce: 0, weight: weight, startedAt: 0, // The validation period only starts once the registration is acknowledged. - endedAt: 0, - uptimeSeconds: 0, - owner: _msgSender(), - rewarded: false, - messageNonce: 0 + endedAt: 0 }); emit ValidationPeriodCreated(validationID, nodeID, messageID, weight, registrationExpiry); @@ -210,10 +208,7 @@ abstract contract ValidatorManager is * Any rewards for this validation period will stop accruing when this function is called. * @param validationID The ID of the validation being ended. */ - function _initializeEndValidation( - bytes32 validationID, - uint64 uptimeSeconds - ) internal virtual { + function _initializeEndValidation(bytes32 validationID) internal virtual { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Ensure the validation period is active. @@ -233,7 +228,6 @@ abstract contract ValidatorManager is // Set the end time of the validation period, since it is no longer known to be an active validator // on the P-Chain. validator.endedAt = uint64(block.timestamp); - validator.uptimeSeconds = uptimeSeconds; // Save the validator updates. // TODO: Optimize storage writes here (probably don't need to write the whole value). @@ -245,9 +239,7 @@ abstract contract ValidatorManager is bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); // Emit the event to signal the start of the validator removal process. - emit ValidatorRemovalInitialized( - validationID, messageID, validator.weight, block.timestamp, uptimeSeconds - ); + emit ValidatorRemovalInitialized(validationID, messageID, validator.weight, block.timestamp); } /** diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 566b97ce2..962c4176c 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -17,13 +17,11 @@ enum ValidatorStatus { struct Validator { ValidatorStatus status; bytes32 nodeID; + address owner; + uint64 messageNonce; uint64 weight; uint64 startedAt; uint64 endedAt; - uint64 uptimeSeconds; - address owner; - bool rewarded; - uint64 messageNonce; } struct ValidatorChurnPeriod { @@ -70,8 +68,7 @@ interface IValidatorManager { bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, - uint256 endTime, - uint64 uptime + uint256 endTime ); /** diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index f451944ac..4b7c54ff0 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -54,8 +54,7 @@ abstract contract ValidatorManagerTest is Test { bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 stakeAmount, - uint256 endTime, - uint64 uptime + uint256 endTime ); event ValidationPeriodEnded(bytes32 indexed validationID); @@ -286,7 +285,7 @@ abstract contract ValidatorManagerTest is Test { ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp, 0); + emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); _initializeEndValidation(validationID); } From f5e04482fcb8cff29491a9afcac9e7096b90dfcb Mon Sep 17 00:00:00 2001 From: minghinmatthewlam Date: Wed, 21 Aug 2024 14:33:10 -0400 Subject: [PATCH 110/545] Update tests/flows/staking/poa_validator_manager.go Co-authored-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Signed-off-by: minghinmatthewlam --- tests/flows/staking/poa_validator_manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 09e52fe80..62c5183cc 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -153,8 +153,8 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { opts, validationID, ) - Expect(err).ShouldNot(BeNil()) + receipt := utils.InitializeEndPoAValidation( ownerKey, subnetAInfo, From b3884583170b79437552d85ada2ad59d4c61dff4 Mon Sep 17 00:00:00 2001 From: minghinmatthewlam Date: Wed, 21 Aug 2024 14:33:17 -0400 Subject: [PATCH 111/545] Update tests/flows/staking/poa_validator_manager.go Co-authored-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Signed-off-by: minghinmatthewlam --- tests/flows/staking/poa_validator_manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 62c5183cc..4ebf95861 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -54,7 +54,7 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) ownerAddress := crypto.PubkeyToAddress(ownerKey.PublicKey) - // Transfer native assets to the non owner account + // Transfer native assets to the owner account ctx := context.Background() fundAmount := big.NewInt(1e18) // 1avax utils.SendNativeTransfer( From 3dff40e23217e55055af67fdaa8e3e5aee6df313 Mon Sep 17 00:00:00 2001 From: minghinmatthewlam Date: Wed, 21 Aug 2024 14:33:27 -0400 Subject: [PATCH 112/545] Update tests/flows/staking/poa_validator_manager.go Co-authored-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Signed-off-by: minghinmatthewlam --- tests/flows/staking/poa_validator_manager.go | 36 ++++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 4ebf95861..524d5b270 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -16,24 +16,24 @@ import ( ) /* -* Register a PoA validator manager on a L1. The steps are as follows: -* - Generate random address to be the owner address -* - Fund native assets to the owner address -* - Deploy the PoAValidatorManager contract -* - Attempt to initiate with non owner and check that it fails -* - Initiate validator registration -* - Deliver the Warp message to the P-Chain (not implemented) -* - Aggregate P-Chain signatures on the response Warp message -* - Deliver the Warp message to the L1 -* - Verify that the validator is registered in the validator manager contract - -* Delists the validator from the L1. The steps are as follows: -* - Attempt to initiate with non owner and check that it fails -* - Initiate validator delisting -* - Deliver the Warp message to the P-Chain (not implemented) -* - Aggregate P-Chain signatures on the response Warp message -* - Deliver the Warp message to the L1 -* - Verify that the validator is delisted from the validator manager contract + * Register a PoA validator manager on a L1. The steps are as follows: + * - Generate random address to be the owner address + * - Fund native assets to the owner address + * - Deploy the PoAValidatorManager contract + * - Attempt to initiate with non owner and check that it fails + * - Initiate validator registration + * - Deliver the Warp message to the P-Chain (not implemented) + * - Aggregate P-Chain signatures on the response Warp message + * - Deliver the Warp message to the L1 + * - Verify that the validator is registered in the validator manager contract + + * Delists the validator from the L1. The steps are as follows: + * - Attempt to initiate with non owner and check that it fails + * - Initiate validator delisting + * - Deliver the Warp message to the P-Chain (not implemented) + * - Aggregate P-Chain signatures on the response Warp message + * - Deliver the Warp message to the L1 + * - Verify that the validator is delisted from the validator manager contract */ func PoAValidatorManager(network interfaces.LocalNetwork) { cChainInfo := network.GetPrimaryNetworkInfo() From 24ebdbeb58c86315f66694e641d3eac181a7f551 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 14:34:18 -0400 Subject: [PATCH 113/545] rename label --- tests/local/e2e_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index 673438546..2d5a8c90e 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -25,7 +25,7 @@ const ( upgradabilityLabel = "upgradability" utilsLabel = "utils" validatorSetSigLabel = "ValidatorSetSig" - stakingManagerLabel = "ValidatorManager" + validatorManagerLabel = "ValidatorManager" ) var ( @@ -198,17 +198,17 @@ var _ = ginkgo.Describe("[Teleporter integration tests]", func() { // Staking tests ginkgo.It("Native token staking manager", - ginkgo.Label(stakingManagerLabel), + ginkgo.Label(validatorManagerLabel), func() { staking.NativeTokenStakingManager(LocalNetworkInstance) }) ginkgo.It("ERC20 token staking manager", - ginkgo.Label(stakingManagerLabel), + ginkgo.Label(validatorManagerLabel), func() { staking.ERC20TokenStakingManager(LocalNetworkInstance) }) ginkgo.It("PoA validator manager", - ginkgo.Label(stakingManagerLabel), + ginkgo.Label(validatorManagerLabel), func() { staking.PoAValidatorManager(LocalNetworkInstance) }) From 0e22e7994bedf99a241484200409a222f9eee011 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 14:42:06 -0400 Subject: [PATCH 114/545] fix lint comments --- tests/flows/staking/poa_validator_manager.go | 38 ++++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 524d5b270..3f9006e3f 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -16,24 +16,24 @@ import ( ) /* - * Register a PoA validator manager on a L1. The steps are as follows: - * - Generate random address to be the owner address - * - Fund native assets to the owner address - * - Deploy the PoAValidatorManager contract - * - Attempt to initiate with non owner and check that it fails - * - Initiate validator registration - * - Deliver the Warp message to the P-Chain (not implemented) - * - Aggregate P-Chain signatures on the response Warp message - * - Deliver the Warp message to the L1 - * - Verify that the validator is registered in the validator manager contract - - * Delists the validator from the L1. The steps are as follows: - * - Attempt to initiate with non owner and check that it fails - * - Initiate validator delisting - * - Deliver the Warp message to the P-Chain (not implemented) - * - Aggregate P-Chain signatures on the response Warp message - * - Deliver the Warp message to the L1 - * - Verify that the validator is delisted from the validator manager contract +* Register a PoA validator manager on a L1. The steps are as follows: +* - Generate random address to be the owner address +* - Fund native assets to the owner address +* - Deploy the PoAValidatorManager contract +* - Attempt to initiate with non owner and check that it fails +* - Initiate validator registration +* - Deliver the Warp message to the P-Chain (not implemented) +* - Aggregate P-Chain signatures on the response Warp message +* - Deliver the Warp message to the L1 +* - Verify that the validator is registered in the validator manager contract + +* Delists the validator from the L1. The steps are as follows: +* - Attempt to initiate with non owner and check that it fails +* - Initiate validator delisting +* - Deliver the Warp message to the P-Chain (not implemented) +* - Aggregate P-Chain signatures on the response Warp message +* - Deliver the Warp message to the L1 +* - Verify that the validator is delisted from the validator manager contract */ func PoAValidatorManager(network interfaces.LocalNetwork) { cChainInfo := network.GetPrimaryNetworkInfo() @@ -154,7 +154,7 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { validationID, ) Expect(err).ShouldNot(BeNil()) - + receipt := utils.InitializeEndPoAValidation( ownerKey, subnetAInfo, From 598cef4266f97fabe510be6ae5e299e52501e140 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 21 Aug 2024 14:43:24 -0400 Subject: [PATCH 115/545] fix lint again --- tests/flows/staking/poa_validator_manager.go | 36 ++++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 3f9006e3f..ec9b5fe93 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -16,24 +16,24 @@ import ( ) /* -* Register a PoA validator manager on a L1. The steps are as follows: -* - Generate random address to be the owner address -* - Fund native assets to the owner address -* - Deploy the PoAValidatorManager contract -* - Attempt to initiate with non owner and check that it fails -* - Initiate validator registration -* - Deliver the Warp message to the P-Chain (not implemented) -* - Aggregate P-Chain signatures on the response Warp message -* - Deliver the Warp message to the L1 -* - Verify that the validator is registered in the validator manager contract - -* Delists the validator from the L1. The steps are as follows: -* - Attempt to initiate with non owner and check that it fails -* - Initiate validator delisting -* - Deliver the Warp message to the P-Chain (not implemented) -* - Aggregate P-Chain signatures on the response Warp message -* - Deliver the Warp message to the L1 -* - Verify that the validator is delisted from the validator manager contract + * Register a PoA validator manager on a L1. The steps are as follows: + * - Generate random address to be the owner address + * - Fund native assets to the owner address + * - Deploy the PoAValidatorManager contract + * - Attempt to initiate with non owner and check that it fails + * - Initiate validator registration + * - Deliver the Warp message to the P-Chain (not implemented) + * - Aggregate P-Chain signatures on the response Warp message + * - Deliver the Warp message to the L1 + * - Verify that the validator is registered in the validator manager contract + * + * Delists the validator from the L1. The steps are as follows: + * - Attempt to initiate with non owner and check that it fails + * - Initiate validator delisting + * - Deliver the Warp message to the P-Chain (not implemented) + * - Aggregate P-Chain signatures on the response Warp message + * - Deliver the Warp message to the L1 + * - Verify that the validator is delisted from the validator manager contract */ func PoAValidatorManager(network interfaces.LocalNetwork) { cChainInfo := network.GetPrimaryNetworkInfo() From 9df9a1b67b04145de75184b4e68f7eedf052c29f Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 22 Aug 2024 11:08:36 -0500 Subject: [PATCH 116/545] bring docs up to date --- contracts/staking/README.md | 96 ++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/contracts/staking/README.md b/contracts/staking/README.md index 8a08eeb40..b68c6fd7c 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -1,6 +1,6 @@ -# Staking Manager Contract +# Validator Manager Contract -`StakingManager.sol` defines the staking contract used to manage subnet-only validators, as defined in [ACP-77](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets) +`ValidatorManager.sol` defines the abstract staking contract used to manage subnet-only validators, as defined in [ACP-77](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets). _Disclaimer:_ The contracts in this directory are still under active development, are unaudited, and should not be used in production. @@ -8,39 +8,35 @@ _Disclaimer:_ The contracts in this directory are still under active development The common case for adding or removing a validator from a Subnet's validator set follows these general steps: -1. Inform the Staking Manager contract of the change. The Staking Manager contract will construct a Warp message attesting to the change in the validator set. +1. Inform the Validator Manager contract of the change. The Validator Manager contract will construct a Warp message attesting to the change in the validator set. 2. Deliver the Warp message containing the validator set change to the P-Chain. The P-Chain will construct a Warp message acknowledging the change to the validator set. -3. Deliver the Warp message containing the P-Chain acknowledgement back to the Staking Manager contract on the Subnet. The Staking Manager contract finalizes the validator set change. +3. Deliver the Warp message containing the P-Chain acknowledgement back to the Validator Manager contract on the Subnet. The Validator Manager contract finalizes the validator set change. ### Initializing a Validator Set -If the Subnet has no validators registered on the P-Chain, then it will not be able to sign a Warp message to add a validator (step 1 above). In this case, Subnet recovery must be performed on the P-Chain, which allows an initial validator set to be specified. For each validator specified in the initial validator set, a signature over a [`SubnetValidatorRegistrationMessage`](#subnetvalidatorregistrationmessage) must be requested from the P-Chain attesting to its inclusion. - -Once the Subnet has been recovered, the stake specified on the P-Chain must be locked in the Staking Contract before any further validator set changes may be made. This is done via the `provideInitialStake` method, and guarded by the `onlyWhenInitialStakeProvided` modifier. +If the Subnet has no validators registered on the P-Chain, then it will not be able to sign a Warp message to add a validator (step 1 above). In this case, Subnet recovery must be performed on the P-Chain, which allows an initial validator set to be specified, along with each validator's expiry. These validators are *not* registered with the Subnet's Validator Manager, and are only used to bootstrap subnet consensus and Warp message signing. The following steps describe how to register validators with the Subnet's Validator Manager, after which the initial validator set specified during Subnet recovery may safely exit the validator set or expire. ### Registering a Validator -Validator registration is initiated with a call to `initializeValidatorRegistration` on the concrete Staking Manager contract. The Staking Manager contract constructs a [`RegisterSubnetValidatorMessage`](#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each validator registration request includes all of the information needed to identify the validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. +Validator registration is initiated with a call to `initializeValidatorRegistration` on the concrete Validator Manager contract. The Validator Manager contract constructs a [`RegisterSubnetValidatorMessage`](#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each validator registration request includes all of the information needed to identify the validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a `RegisterSubnetValidatorTx`. Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a `SubnetValidatorRegistrationMessage` Warp message indicating that the specified validation was successfully registered on the P-Chain. -The `SubnetValidatorRegistrationMessage` is delivered to the Staking Manager contract via a call to `completeValidatorRegistration`. Staking rewards begin accruing at this time. +The `SubnetValidatorRegistrationMessage` is delivered to the Validator Manager contract via a call to `completeValidatorRegistration`. For PoS Validator Managers, staking rewards begin accruing at this time. #### Handling a Missed Expiry -In the case of a missed expiry, the `RegisterSubnetValidatorTx` will result in a `SubnetValidatorRegistrationMessage` Warp message with the `valid` field set to `0`. This serves as proof that the corresponding validation has not started and may never start. The `SubnetValidatorRegistrationMessage` can be provided to the Staking Manager contract by calling `completeEndValidation` with `setWeightMessageType=false`. +In the case of a missed expiry, the `RegisterSubnetValidatorTx` will result in a `SubnetValidatorRegistrationMessage` Warp message with `valid=0`. This serves as proof that the corresponding validation has not started and may never start. The `SubnetValidatorRegistrationMessage` can be provided to the Validator Manager contract by calling `completeEndValidation` with `setWeightMessageType=false`. ### Exiting the Validator Set -Validator exit is initiated with a call to `initializeEndValidation` on the Staking Manager contract. A `ValidationUptimeMessage` Warp message may optionally be provided, otherwise the validator's uptime will be set to`0`. This proof may be requested from the P-Chain, which will provide it in a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message. Once `initializeEndValidation` staking rewards cease accruing. The Staking Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. - -The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a `SetValidatorWeightTx`. This results in another `SetSubnetValidatorWeightMessage` Warp message, this time constructed by the P-Chain. +Validator exit is initiated with a call to `initializeEndValidation` on the Validator Manager contract. For PoS Validator Managers, a `ValidationUptimeMessage` Warp message may optionally be provided in order to calculate the staking rewards; otherwise the validator's uptime will be set to `0`. This proof may be requested from the P-Chain, which will provide it in a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message. Once `initializeEndValidation` is called, staking rewards cease accruing for PoS Validator Managers. The Validator Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. -This `SetSubnetValidatorWeightMessage` is delivered to the Staking Manager contract with a call to `completeEndValidation` with `setWeightMessageType=true`, at which point staking rewards are disbursed, stake is returned, and the validation is removed from the contract's state. +The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a `SetValidatorWeightTx`. The P-Chain acknowledges validator exit by signing either a `SetSubnetValidatorWeightMessage` with the `weight=0`, or a `SubnetValidatorRegistrationMessage` with `valid=0`. `completeEndValidation` is then called on the Validator Manager contract, with `setWeightMessageType` set according to the Warp message type being delivered. The validation is removed from the contract's state, and for PoS Validator Managers, staking rewards are disbursed and stake is returned. #### Exit the Validator Set Directly on the P-Chain -ACP-77 also provides a method for validators to exit a Subnet's validator set without interacting with the Subnet directly via [`ExitValidatorSetTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#exitvalidatorsettx), which will remove the validator from the Subnet validator set tracked on the P-Chain. The P-Chain will contruct a `SetSubnetValidatorWeightMessage` with the weight set to `0`, that may then be provided to the Staking Manager contract via a call to `completeEndValidation`, as described above. Note however that without the uptime proof provided in the initial call to `initializeEndValidation`, the Staking Manager will not credit any staking rewards to the validator. +ACP-77 also provides a method for validators to exit a Subnet's validator set without interacting with the Subnet directly. The P-Chain transaction [`ExitValidatorSetTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#exitvalidatorsettx) removes the validator from the Subnet validator set tracked on the P-Chain. The P-Chain will will sign a `SetSubnetValidatorWeightMessage` or a `SubnetValidatorRegistrationMessage`, that may then be provided to the Staking Manager contract via a call to `completeEndValidation`, as described above. Note however that without the uptime proof provided in the initial call to `initializeEndValidation`, the Staking Manager will not credit any staking rewards to the validator. ## Warp Message Format Reference @@ -53,21 +49,23 @@ Signed by: Subnet Specification: ``` -+-----------+----------+-----------+ -| typeID : uint32 | 4 bytes | -+-----------+----------+-----------+ -| subnetID : [32]byte | 32 bytes | -+-----------+----------+-----------+ -| nodeID : [32]byte | 32 bytes | -+-----------+----------+-----------+ -| weight : uint64 | 8 bytes | -+-----------+----------+-----------+ -| expiry : uint64 | 8 bytes | -+-----------+----------+-----------+ -| signature : [64]byte | 64 bytes | -+-----------+----------+-----------+ - | 148 bytes | - +-----------+ ++--------------+----------+-----------+ +| codecID : uint16 | 2 bytes | ++--------------+----------+-----------+ +| typeID : uint32 | 4 bytes | ++--------------+----------+-----------+ +| subnetID : [32]byte | 32 bytes | ++--------------+----------+-----------+ +| nodeID : [32]byte | 32 bytes | ++--------------+----------+-----------+ +| weight : uint64 | 8 bytes | ++--------------+----------+-----------+ +| blsPublicKey : [48]byte | 48 bytes | ++--------------+----------+-----------+ +| expiry : uint64 | 8 bytes | ++--------------+----------+-----------+ + | 134 bytes | + +-----------+ ``` @@ -81,13 +79,15 @@ Specification: ``` +--------------+----------+----------+ +| codecID : uint16 | 2 bytes | ++--------------+----------+----------+ | typeID : uint32 | 4 bytes | +--------------+----------+----------+ | validationID : [32]byte | 32 bytes | +--------------+----------+----------+ -| valid : bool | 1 byte | +| valid : bool + 1 byte | +--------------+----------+----------+ - | 37 bytes | + | 39 bytes | +----------+ ``` @@ -101,13 +101,15 @@ Specification: ``` +--------------+----------+----------+ +| codecID : uint16 | 2 bytes | ++--------------+----------+----------+ | typeID : uint32 | 4 bytes | +--------------+----------+----------+ | validationID : [32]byte | 32 bytes | +--------------+----------+----------+ | uptime : uint64 | 8 bytes | +--------------+----------+----------+ - | 44 bytes | + | 46 bytes | +----------+ ``` @@ -120,21 +122,19 @@ Signed by: Subnet, P-Chain Specification: ``` -+-----------+----------+-----------+ -| typeID : uint32 | 4 bytes | -+-----------+----------+-----------+ -| subnetID : [32]byte | 32 bytes | -+-----------+----------+-----------+ -| nodeID : [32]byte | 32 bytes | -+-----------+----------+-----------+ -| weight : uint64 | 8 bytes | -+-----------+----------+-----------+ -| expiry : uint64 | 8 bytes | -+-----------+----------+-----------+ -| signature : [64]byte | 64 bytes | -+-----------+----------+-----------+ - | 148 bytes | - +-----------+ ++--------------+----------+----------+ +| codecID : uint16 | 2 bytes | ++--------------+----------+----------+ +| typeID : uint32 | 4 bytes | ++--------------+----------+----------+ +| validationID : [32]byte | 32 bytes | ++--------------+----------+----------+ +| nonce : uint64 | 8 bytes | ++--------------+----------+----------+ +| weight : uint64 | 8 bytes | ++--------------+----------+----------+ + | 54 bytes | + +----------+ ``` ## Types of Staking Managers From ca2922973e75a8c5ab0b66da0ae3c36277b50235 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 22 Aug 2024 13:43:58 -0500 Subject: [PATCH 117/545] table typo --- contracts/staking/README.md | 2 +- contracts/staking/ValidatorMessages.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/staking/README.md b/contracts/staking/README.md index b68c6fd7c..0794c14a7 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -85,7 +85,7 @@ Specification: +--------------+----------+----------+ | validationID : [32]byte | 32 bytes | +--------------+----------+----------+ -| valid : bool + 1 byte | +| valid : bool | 1 byte | +--------------+----------+----------+ | 39 bytes | +----------+ diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index 074c15d9a..b3a29b37f 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -187,7 +187,7 @@ library ValidatorMessages { * +--------------+----------+----------+ * | validationID : [32]byte | 32 bytes | * +--------------+----------+----------+ - * | valid : bool + 1 byte | + * | valid : bool | 1 byte | * +--------------+----------+----------+ * | 39 bytes | * +----------+ From 9544c6de1c950683ea4813330d3683a2370f0bc3 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 22 Aug 2024 16:04:46 -0400 Subject: [PATCH 118/545] uptime unit tests and moving state to PoS contract --- contracts/staking/PoSValidatorManager.sol | 10 +- contracts/staking/ValidatorManager.sol | 8 +- .../interfaces/IPoSValidatorManager.sol | 7 + .../tests/PoSValidatorManagerTests.t.sol | 139 ++++++++++++++++++ .../staking/tests/ValidatorManagerTests.t.sol | 17 ++- 5 files changed, 170 insertions(+), 11 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 2723600b4..b8f443a77 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -79,24 +79,26 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "StakingManager: Invalid warp message"); + require(valid, "PoSValidatorManager: invalid warp message"); require( warpMessage.sourceChainID == WARP_MESSENGER.getBlockchainID(), - "StakingManager: Invalid source chain ID" + "PoSValidatorManager: invalid source chain ID" ); require( warpMessage.originSenderAddress == address(0), - "StakingManager: Invalid origin sender address" + "PoSValidatorManager: invalid origin sender address" ); (bytes32 uptimeValidationID, uint64 uptime) = ValidatorMessages.unpackValidationUptimeMessage(warpMessage.payload); require( - validationID == uptimeValidationID, "StakingManager: Invalid uptime validation ID" + validationID == uptimeValidationID, + "PoSValidatorManager: invalid uptime validation ID" ); $._uptimes[validationID] = uptime; + emit ValidationUptimeUpdated(validationID, uptime); } _initializeEndValidation(validationID); diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 7cd6c799c..519e44dce 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -33,15 +33,17 @@ abstract contract ValidatorManager is // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.ValidatorManager struct ValidatorManagerStorage { + /// @notice The blockchainID of the P-Chain. bytes32 _pChainBlockchainID; + /// @notice The subnetID associated with this validator manager. bytes32 _subnetID; uint8 _maximumHourlyChurn; ValidatorChurnPeriod _churnTracker; - // Maps the validationID to the registration message such that the message can be re-sent if needed. + /// @notice Maps the validationID to the registration message such that the message can be re-sent if needed. mapping(bytes32 => bytes) _pendingRegisterValidationMessages; - // Maps the validationID to the validator information. + /// @notice Maps the validationID to the validator information. mapping(bytes32 => Validator) _validationPeriods; - // Maps the nodeID to the validationID for active validation periods. + /// @notice Maps the nodeID to the validationID for active validation periods. mapping(bytes32 => bytes32) _activeValidators; } // solhint-enable private-vars-leading-underscore diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index f3678871a..4459aa8be 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -17,6 +17,13 @@ struct PoSValidatorManagerSettings { } interface IPoSValidatorManager is IValidatorManager { + /** + * @notice Event emitted when a validator's uptime is updated. + * @param validationID The ID of the validation period + * @param uptime The new uptime of the validator + */ + event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); + /** * @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. diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 2bb7e8624..e36762567 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -7,8 +7,17 @@ pragma solidity 0.8.25; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; +import { + WarpMessage, + IWarpMessenger +} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; +import {ValidatorMessages} from "../ValidatorMessages.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { + event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); + + uint64 public constant DEFAULT_UPTIME = uint64(100); + PoSValidatorManager public posValidatorManager; function testValueToWeight() public view { @@ -31,7 +40,137 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { assertEq(v3, 1e27); } + function testInitializeEndValidationWithUptimeProof() public { + // TODO: implement + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + + _mockGetBlockchainID(); + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), + abi.encode( + WarpMessage({ + sourceChainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, + originSenderAddress: address(0), + payload: ValidatorMessages.packValidationUptimeMessage(validationID, DEFAULT_UPTIME) + }), + true + ) + ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) + ); + + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit ValidationUptimeUpdated(validationID, DEFAULT_UPTIME); + posValidatorManager.initializeEndValidation(validationID, true, 0); + } + + function testInvalidUptimeWarpMessage() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + + _mockGetVerifiedWarpMessage(new bytes(0), false); + vm.expectRevert(_formatErrorMessage("invalid warp message")); + posValidatorManager.initializeEndValidation(validationID, true, 0); + } + + function testInvalidUptimeChainID() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + + _mockGetVerifiedWarpMessage(new bytes(0), true); + _mockGetBlockchainID(); + vm.expectRevert(_formatErrorMessage("invalid source chain ID")); + posValidatorManager.initializeEndValidation(validationID, true, 0); + } + + function testInvalidUptimeSenderAddress() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + + _mockGetBlockchainID(); + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), + abi.encode( + WarpMessage({ + sourceChainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, + originSenderAddress: address(this), + payload: new bytes(0) + }), + true + ) + ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) + ); + + vm.expectRevert(_formatErrorMessage("invalid origin sender address")); + posValidatorManager.initializeEndValidation(validationID, true, 0); + } + + function testInvalidUptimeValidationID() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + + _mockGetBlockchainID(); + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), + abi.encode( + WarpMessage({ + sourceChainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, + originSenderAddress: address(0), + payload: ValidatorMessages.packValidationUptimeMessage(bytes32(0), 0) + }), + true + ) + ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) + ); + + vm.expectRevert(_formatErrorMessage("invalid uptime validation ID")); + posValidatorManager.initializeEndValidation(validationID, true, 0); + } + function _initializeEndValidation(bytes32 validationID) internal virtual override { return posValidatorManager.initializeEndValidation(validationID, false, 0); } + + function _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { + return abi.encodePacked("PoSValidatorManager: ", errorMessage); + } } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 4b7c54ff0..1c8a2d89d 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -25,6 +25,8 @@ abstract contract ValidatorManagerTest is Test { bytes public constant DEFAULT_BLS_PUBLIC_KEY = bytes( hex"123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); + bytes32 public constant DEFAULT_SOURCE_BLOCKCHAIN_ID = + bytes32(hex"abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd"); address public constant WARP_PRECOMPILE_ADDRESS = 0x0200000000000000000000000000000000000005; uint64 public constant DEFAULT_WEIGHT = 1e6; @@ -133,10 +135,6 @@ abstract contract ValidatorManagerTest is Test { }); } - function testInitializeEndValidationWithUptimeProof() public { - // TODO: implement - } - function testInitializeEndValidationExcessiveChurn() public { // TODO: implement } @@ -319,6 +317,17 @@ abstract contract ValidatorManagerTest is Test { ); } + function _mockGetBlockchainID() internal { + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeWithSelector(IWarpMessenger.getBlockchainID.selector), + abi.encode(DEFAULT_SOURCE_BLOCKCHAIN_ID) + ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, abi.encodeWithSelector(IWarpMessenger.getBlockchainID.selector) + ); + } + function _initializeValidatorRegistration( bytes32 nodeID, uint64 registrationExpiry, From 8617fdbe2375b2a2c01cc6115de4af49f5e2ec72 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 22 Aug 2024 16:17:15 -0400 Subject: [PATCH 119/545] fix lint and bindings --- .../ERC20TokenStakingManager.go | 162 +++++++++++++++++- .../NativeTokenStakingManager.go | 162 +++++++++++++++++- .../PoAValidatorManager.go | 17 +- contracts/staking/ValidatorManager.sol | 4 +- .../tests/PoSValidatorManagerTests.t.sol | 42 ++--- 5 files changed, 337 insertions(+), 50 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 39dc6ae44..46aee70c2 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516135a43803806135a483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6134578061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c757806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612b95565b61019d565b005b6100b26100c2366004612bc0565b610395565b6100da6100d5366004612b95565b6104a3565b6040516001600160401b0390911681526020015b60405180910390f35b61010a610105366004612c18565b6104b9565b6040519081526020016100ee565b6100b2610126366004612c58565b6104d2565b61010a610139366004612d25565b61076a565b6100b261014c366004612dc1565b61078f565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610185366004612b95565b610aa8565b6100b2610198366004612dda565b610bbc565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061342b83398151915293929190829060ff1660058111156101fe576101fe612e04565b600581111561020f5761020f612e04565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612e04565b146103105760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f610321848361010001515f610ff0565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034e908490600401612e3a565b6020604051808303815f875af115801561036a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038e9190612e6c565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103d95750825b90505f826001600160401b031660011480156103f45750303b155b905081158015610402575080155b156104205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561044a57845460ff60401b1916600160401b1785555b610454878761120d565b831561049a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6104b364e8d4a5100083612eab565b92915050565b5f6104b36001600160401b03831664e8d4a51000612ebe565b5f821561075a576040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610522573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105499190810190612ee0565b91509150806105a65760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610307565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060d9190612e6c565b82511461066c5760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610307565b60208201516001600160a01b0316156106dd5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610307565b5f806106ec846040015161122b565b915091508188146107545760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610307565b93505050505b6107648482611403565b50505050565b5f80610775866117b7565b905061078385828686611877565b9150505b949350505050565b5f5f8051602061342b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156107ea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108119190810190612ee0565b91509150806108325760405162461bcd60e51b815260040161030790612fb2565b82548251146108955760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610307565b60208201516001600160a01b0316156109085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610307565b5f806109178460400151611cfb565b91509150806109795760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610307565b5f8281526005860160205260408120805461099390612ff8565b90501180156109c5575060015f83815260068701602052604090205460ff1660058111156109c3576109c3612e04565b145b6109e15760405162461bcd60e51b815260040161030790613030565b5f82815260058601602052604081206109f991612b4b565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061342b833981519152929190610af090612ff8565b9050118015610b22575060015f83815260068301602052604090205460ff166005811115610b2057610b20612e04565b145b610b3e5760405162461bcd60e51b815260040161030790613030565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610b779190600401613077565b6020604051808303815f875af1158015610b93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb79190612e6c565b505050565b5f5f8051602061342b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c17573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c3e9190810190612ee0565b9150915080610c5f5760405162461bcd60e51b815260040161030790612fb2565b5f8415610ce3575f610c748460400151611e9c565b919350909150506001600160401b03811615610cdd5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610307565b50610d59565b5f610cf18460400151611cfb565b90925090508015610d575760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610307565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610d8b57610d8b612e04565b6005811115610d9c57610d9c612e04565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610e4d5760405162461bcd60e51b815260040161030790613101565b5f600382516005811115610e6357610e63612e04565b1480610e815750600282516005811115610e7f57610e7f612e04565b145b15610ea457506020808201515f9081526007870190915260408120556004610ea8565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610ed957610ed9612e04565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110695761102981600161314d565b611034906008612ebe565b5081515f9083908390811061104b5761104b613160565b60200101906001600160f81b03191690815f1a905350600101611015565b505f5b60048110156110cc5761108081600361314d565b61108b906008612ebe565b6001901c60f81b8261109e836002613174565b815181106110ae576110ae613160565b60200101906001600160f81b03191690815f1a90535060010161106c565b505f5b602081101561112e576110e381601f61314d565b6110ee906008612ebe565b86901c60f81b82611100836006613174565b8151811061111057611110613160565b60200101906001600160f81b03191690815f1a9053506001016110cf565b505f5b60088110156111995761114581600761314d565b611150906008612ebe565b6001600160401b038616901c60f81b8261116b836026613174565b8151811061117b5761117b613160565b60200101906001600160f81b03191690815f1a905350600101611131565b505f5b6008811015611204576111b081600761314d565b6111bb906008612ebe565b6001600160401b038516901c60f81b826111d683602e613174565b815181106111e6576111e6613160565b60200101906001600160f81b03191690815f1a90535060010161119c565b50949350505050565b6112156120d7565b61121e82612122565b61122781612168565b5050565b5f808251602e1461124e5760405162461bcd60e51b815260040161030790613187565b5f805b600281101561129d5761126581600161314d565b611270906008612ebe565b61ffff1685828151811061128657611286613160565b016020015160f81c901b9190911790600101611251565b5061ffff8116156112c05760405162461bcd60e51b8152600401610307906131d0565b5f805b600481101561131b576112d781600361314d565b6112e2906008612ebe565b63ffffffff16866112f4836002613174565b8151811061130457611304613160565b016020015160f81c901b91909117906001016112c3565b5063ffffffff81166004146113425760405162461bcd60e51b815260040161030790613213565b5f805b60208110156113975761135981601f61314d565b611364906008612ebe565b87611370836006613174565b8151811061138057611380613160565b016020015160f81c901b9190911790600101611345565b505f805b60088110156113f6576113af81600761314d565b6113ba906008612ebe565b6001600160401b0316886113cf836026613174565b815181106113df576113df613160565b016020015160f81c901b919091179060010161139b565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061342b83398151915293929190829060ff16600581111561146457611464612e04565b600581111561147557611475612e04565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561150f5761150f612e04565b1461156b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610307565b60c08101516001600160a01b0316336001600160a01b0316146115a05760405162461bcd60e51b815260040161030790613101565b6115ad816040015161221c565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff191660018360058111156115f9576115f9612e04565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f906116ea90869083610ff0565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611719908590600401612e3a565b6020604051808303815f875af1158015611735573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117599190612e6c565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00816117e3846123bd565b90505f6117ef826104a3565b83549091506001600160401b0382161080159061181957508260010154816001600160401b031611155b6107875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610307565b5f6118806123f3565b5f8051602061342b833981519152426001600160401b0385161180156118ba57506001600160401b0384166118b8426202a300613174565b115b61191c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610307565b856119735760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610307565b5f868152600782016020526040902054156119e15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610307565b8251603014611a485760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610307565b611a518561221c565b5f80611a986040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061243d565b5f82815260058601602052604090209193509150611ab6828261329e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ae3908590600401612e3a565b6020604051808303815f875af1158015611aff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b239190612e6c565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611ba957611ba9612e04565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061078760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611d1e5760405162461bcd60e51b815260040161030790613187565b5f805b6002811015611d6d57611d3581600161314d565b611d40906008612ebe565b61ffff16858281518110611d5657611d56613160565b016020015160f81c901b9190911790600101611d21565b5061ffff811615611d905760405162461bcd60e51b8152600401610307906131d0565b5f805b6004811015611deb57611da781600361314d565b611db2906008612ebe565b63ffffffff1686611dc4836002613174565b81518110611dd457611dd4613160565b016020015160f81c901b9190911790600101611d93565b5063ffffffff8116600214611e125760405162461bcd60e51b815260040161030790613213565b5f805b6020811015611e6757611e2981601f61314d565b611e34906008612ebe565b87611e40836006613174565b81518110611e5057611e50613160565b016020015160f81c901b9190911790600101611e15565b505f86602681518110611e7c57611e7c613160565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611ec05760405162461bcd60e51b815260040161030790613187565b5f805b6002811015611f0f57611ed781600161314d565b611ee2906008612ebe565b61ffff16868281518110611ef857611ef8613160565b016020015160f81c901b9190911790600101611ec3565b5061ffff811615611f325760405162461bcd60e51b8152600401610307906131d0565b5f805b6004811015611f8d57611f4981600361314d565b611f54906008612ebe565b63ffffffff1687611f66836002613174565b81518110611f7657611f76613160565b016020015160f81c901b9190911790600101611f35565b5063ffffffff8116600114611fb45760405162461bcd60e51b815260040161030790613213565b5f805b602081101561200957611fcb81601f61314d565b611fd6906008612ebe565b88611fe2836006613174565b81518110611ff257611ff2613160565b016020015160f81c901b9190911790600101611fb7565b505f805b60088110156120685761202181600761314d565b61202c906008612ebe565b6001600160401b031689612041836026613174565b8151811061205157612051613160565b016020015160f81c901b919091179060010161200d565b505f805b60088110156120c75761208081600761314d565b61208b906008612ebe565b6001600160401b03168a6120a083602e613174565b815181106120b0576120b0613160565b016020015160f81c901b919091179060010161206c565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661212057604051631afcd79f60e31b815260040160405180910390fd5b565b61212a6120d7565b61213381612808565b6121656060820135608083013561215060c0850160a08601612c18565b61216060e0860160c0870161335d565b612829565b50565b6121706120d7565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166121fc5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610307565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061342b8339815191529060ff165f0361225a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906122a2908361314d565b106122be576001600160401b03841660408301528082526122dd565b83826040018181516122d09190613378565b6001600160401b03169052505b5f8260200151836040015160646122f4919061339f565b6122fe91906133ca565b600285015490915060ff90811690821611156123795760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610307565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104b3827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690612897565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161243757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124a75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610307565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561251e576124de81600161314d565b6124e9906008612ebe565b5081515f9083908390811061250057612500613160565b60200101906001600160f81b03191690815f1a9053506001016124ca565b505f5b600481101561257c5761253581600361314d565b612540906008612ebe565b505f8261254e836002613174565b8151811061255e5761255e613160565b60200101906001600160f81b03191690815f1a905350600101612521565b505f5b60208110156125d9578451816020811061259b5761259b613160565b1a60f81b826125ab836006613174565b815181106125bb576125bb613160565b60200101906001600160f81b03191690815f1a90535060010161257f565b505f5b602081101561263957846020015181602081106125fb576125fb613160565b1a60f81b8261260b836026613174565b8151811061261b5761261b613160565b60200101906001600160f81b03191690815f1a9053506001016125dc565b505f5b60088110156126ad5761265081600761314d565b61265b906008612ebe565b60ff1685604001516001600160401b0316901c60f81b8282604661267f9190613174565b8151811061268f5761268f613160565b60200101906001600160f81b03191690815f1a90535060010161263c565b505f5b603081101561271857846080015181815181106126cf576126cf613160565b01602001516001600160f81b031916826126ea83604e613174565b815181106126fa576126fa613160565b60200101906001600160f81b03191690815f1a9053506001016126b0565b505f5b600881101561278a5761272f81600761314d565b61273a906008612ebe565b60608601516001600160401b0390811691161c60f81b8261275c83607e613174565b8151811061276c5761276c613160565b60200101906001600160f81b03191690815f1a90535060010161271b565b5060028160405161279b91906133ef565b602060405180830381855afa1580156127b6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127d99190612e6c565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6128106120d7565b6128186129f9565b612820612a09565b61216581612a11565b6128316120d7565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156128dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129019190612e6c565b90506129186001600160a01b038516333086612a7d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561295c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129809190612e6c565b90508181116129e65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610307565b6129f0828261314d565b95945050505050565b612a016120d7565b612120612ad7565b6121206120d7565b612a196120d7565b80355f8051602061342b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612a63606083016040840161340a565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610764908590612adf565b6127e26120d7565b5f8060205f8451602086015f885af180612afe576040513d5f823e3d81fd5b50505f513d91508115612b15578060011415612b22565b6001600160a01b0384163b155b1561076457604051635274afe760e01b81526001600160a01b0385166004820152602401610307565b508054612b5790612ff8565b5f825580601f10612b66575050565b601f0160209004905f5260205f209081019061216591905b80821115612b91575f8155600101612b7e565b5090565b5f60208284031215612ba5575f80fd5b5035919050565b6001600160a01b0381168114612165575f80fd5b5f80828403610100811215612bd3575f80fd5b60e0811215612be0575f80fd5b5082915060e0830135612bf281612bac565b809150509250929050565b80356001600160401b0381168114612c13575f80fd5b919050565b5f60208284031215612c28575f80fd5b612c3182612bfd565b9392505050565b8015158114612165575f80fd5b803563ffffffff81168114612c13575f80fd5b5f805f60608486031215612c6a575f80fd5b833592506020840135612c7c81612c38565b9150612c8a60408501612c45565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612cc957612cc9612c93565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612cf757612cf7612c93565b604052919050565b5f6001600160401b03821115612d1757612d17612c93565b50601f01601f191660200190565b5f805f8060808587031215612d38575f80fd5b8435935060208501359250612d4f60408601612bfd565b915060608501356001600160401b03811115612d69575f80fd5b8501601f81018713612d79575f80fd5b8035612d8c612d8782612cff565b612ccf565b818152886020838501011115612da0575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612dd1575f80fd5b612c3182612c45565b5f8060408385031215612deb575f80fd5b612df483612c45565b91506020830135612bf281612c38565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612e32578181015183820152602001612e1a565b50505f910152565b602081525f8251806020840152612e58816040850160208701612e18565b601f01601f19169190910160400192915050565b5f60208284031215612e7c575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612eb957612eb9612e83565b500490565b80820281158282048414176104b3576104b3612e97565b8051612c1381612c38565b5f8060408385031215612ef1575f80fd5b82516001600160401b0380821115612f07575f80fd5b9084019060608287031215612f1a575f80fd5b612f22612ca7565b82518152602080840151612f3581612bac565b82820152604084015183811115612f4a575f80fd5b80850194505087601f850112612f5e575f80fd5b83519250612f6e612d8784612cff565b8381528882858701011115612f81575f80fd5b612f9084838301848801612e18565b80604084015250819550612fa5818801612ed5565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061300c57607f821691505b60208210810361302a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461308981612ff8565b806020870152604060018084165f81146130aa57600181146130c6576130f3565b60ff19851660408a0152604084151560051b8a010195506130f3565b895f5260205f205f5b858110156130ea5781548b82018601529083019088016130cf565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104b3576104b3612e97565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104b3576104b3612e97565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610bb757805f5260205f20601f840160051c8101602085101561327f5750805b601f840160051c820191505b8181101561038e575f815560010161328b565b81516001600160401b038111156132b7576132b7612c93565b6132cb816132c58454612ff8565b8461325a565b602080601f8311600181146132fe575f84156132e75750858301515b5f19600386901b1c1916600185901b178555613355565b5f85815260208120601f198616915b8281101561332c5788860151825594840194600190910190840161330d565b508582101561334957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561336d575f80fd5b8135612c3181612bac565b6001600160401b0381811683821601908082111561339857613398612e97565b5092915050565b6001600160401b038181168382160280821691908281146133c2576133c2612e97565b505092915050565b5f6001600160401b03808416806133e3576133e3612e83565b92169190910492915050565b5f8251613400818460208701612e18565b9190910192915050565b5f6020828403121561341a575f80fd5b813560ff81168114612c31575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161350238038061350283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6133b58061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c757806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612af3565b61019d565b005b6100b26100c2366004612b1e565b610373565b6100da6100d5366004612af3565b610481565b6040516001600160401b0390911681526020015b60405180910390f35b61010a610105366004612b76565b610497565b6040519081526020016100ee565b6100b2610126366004612bb6565b6104b0565b61010a610139366004612c83565b6107e1565b6100b261014c366004612d1f565b610806565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610185366004612af3565b610b1f565b6100b2610198366004612d38565b610c2e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061338983398151915293929190829060ff1660058111156101fd576101fd612d62565b600581111561020e5761020e612d62565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561028557610285612d62565b146102ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6102ff8483606001515f611001565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061032c908490600401612d98565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c9190612dca565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103b75750825b90505f826001600160401b031660011480156103d25750303b155b9050811580156103e0575080155b156103fe5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561042857845460ff60401b1916600160401b1785555b610432878761121e565b831561047857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61049164e8d4a5100083612e09565b92915050565b5f6104916001600160401b03831664e8d4a51000612e1c565b81156107d3575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610524573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261054b9190810190612e3e565b91509150806105ae5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016102e6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106159190612dca565b8251146106795760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016102e6565b60208201516001600160a01b0316156106ef5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016102e6565b5f806106fe846040015161123c565b9150915081881461076b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016102e6565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6107dc83611414565b505050565b5f806107ec8661175c565b90506107fa8582868661181c565b9150505b949350505050565b5f5f805160206133898339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610861573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108889190810190612e3e565b91509150806108a95760405162461bcd60e51b81526004016102e690612f10565b825482511461090c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102e6565b60208201516001600160a01b03161561097f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102e6565b5f8061098e8460400151611c53565b91509150806109f05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102e6565b5f82815260058601602052604081208054610a0a90612f56565b9050118015610a3c575060015f83815260068701602052604090205460ff166005811115610a3a57610a3a612d62565b145b610a585760405162461bcd60e51b81526004016102e690612f8e565b5f8281526005860160205260408120610a7091612aa9565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613389833981519152929190610b6790612f56565b9050118015610b99575060015f83815260068301602052604090205460ff166005811115610b9757610b97612d62565b145b610bb55760405162461bcd60e51b81526004016102e690612f8e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bee9190600401612fd5565b6020604051808303815f875af1158015610c0a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107dc9190612dca565b5f5f805160206133898339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c89573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cb09190810190612e3e565b9150915080610cd15760405162461bcd60e51b81526004016102e690612f10565b5f8415610d55575f610ce68460400151611df4565b919350909150506001600160401b03811615610d4f5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016102e6565b50610dcb565b5f610d638460400151611c53565b90925090508015610dc95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102e6565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610dfc57610dfc612d62565b6005811115610e0d57610e0d612d62565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610e9e5760405162461bcd60e51b81526004016102e69061305f565b5f600382516005811115610eb457610eb4612d62565b1480610ed25750600282516005811115610ed057610ed0612d62565b145b15610ef557506020808201515f9081526007870190915260408120556004610ef9565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f2a57610f2a612d62565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561107a5761103a8160016130ab565b611045906008612e1c565b5081515f9083908390811061105c5761105c6130be565b60200101906001600160f81b03191690815f1a905350600101611026565b505f5b60048110156110dd576110918160036130ab565b61109c906008612e1c565b6001901c60f81b826110af8360026130d2565b815181106110bf576110bf6130be565b60200101906001600160f81b03191690815f1a90535060010161107d565b505f5b602081101561113f576110f481601f6130ab565b6110ff906008612e1c565b86901c60f81b826111118360066130d2565b81518110611121576111216130be565b60200101906001600160f81b03191690815f1a9053506001016110e0565b505f5b60088110156111aa576111568160076130ab565b611161906008612e1c565b6001600160401b038616901c60f81b8261117c8360266130d2565b8151811061118c5761118c6130be565b60200101906001600160f81b03191690815f1a905350600101611142565b505f5b6008811015611215576111c18160076130ab565b6111cc906008612e1c565b6001600160401b038516901c60f81b826111e783602e6130d2565b815181106111f7576111f76130be565b60200101906001600160f81b03191690815f1a9053506001016111ad565b50949350505050565b61122661202f565b61122f8261207a565b611238816120c0565b5050565b5f808251602e1461125f5760405162461bcd60e51b81526004016102e6906130e5565b5f805b60028110156112ae576112768160016130ab565b611281906008612e1c565b61ffff16858281518110611297576112976130be565b016020015160f81c901b9190911790600101611262565b5061ffff8116156112d15760405162461bcd60e51b81526004016102e69061312e565b5f805b600481101561132c576112e88160036130ab565b6112f3906008612e1c565b63ffffffff16866113058360026130d2565b81518110611315576113156130be565b016020015160f81c901b91909117906001016112d4565b5063ffffffff81166004146113535760405162461bcd60e51b81526004016102e690613171565b5f805b60208110156113a85761136a81601f6130ab565b611375906008612e1c565b876113818360066130d2565b81518110611391576113916130be565b016020015160f81c901b9190911790600101611356565b505f805b6008811015611407576113c08160076130ab565b6113cb906008612e1c565b6001600160401b0316886113e08360266130d2565b815181106113f0576113f06130be565b016020015160f81c901b91909117906001016113ac565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061338983398151915293929190829060ff16600581111561147457611474612d62565b600581111561148557611485612d62565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156114ff576114ff612d62565b1461155b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102e6565b60408101516001600160a01b0316336001600160a01b0316146115905760405162461bcd60e51b81526004016102e69061305f565b61159d8160800151612174565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156115e1576115e1612d62565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061169890859083611001565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116c7908590600401612d98565b6020604051808303815f875af11580156116e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117079190612dca565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008161178884612315565b90505f61179482610481565b83549091506001600160401b038216108015906117be57508260010154816001600160401b031611155b6107fe5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016102e6565b5f61182561234b565b5f80516020613389833981519152426001600160401b03851611801561185f57506001600160401b03841661185d426202a3006130d2565b115b6118c15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102e6565b856119185760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102e6565b5f868152600782016020526040902054156119865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102e6565b82516030146119ed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102e6565b6119f685612174565b5f80611a3d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612395565b5f82815260058601602052604090209193509150611a5b82826131fc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611a88908590600401612d98565b6020604051808303815f875af1158015611aa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac89190612dca565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611b4157611b41612d62565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506107fe60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611c765760405162461bcd60e51b81526004016102e6906130e5565b5f805b6002811015611cc557611c8d8160016130ab565b611c98906008612e1c565b61ffff16858281518110611cae57611cae6130be565b016020015160f81c901b9190911790600101611c79565b5061ffff811615611ce85760405162461bcd60e51b81526004016102e69061312e565b5f805b6004811015611d4357611cff8160036130ab565b611d0a906008612e1c565b63ffffffff1686611d1c8360026130d2565b81518110611d2c57611d2c6130be565b016020015160f81c901b9190911790600101611ceb565b5063ffffffff8116600214611d6a5760405162461bcd60e51b81526004016102e690613171565b5f805b6020811015611dbf57611d8181601f6130ab565b611d8c906008612e1c565b87611d988360066130d2565b81518110611da857611da86130be565b016020015160f81c901b9190911790600101611d6d565b505f86602681518110611dd457611dd46130be565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611e185760405162461bcd60e51b81526004016102e6906130e5565b5f805b6002811015611e6757611e2f8160016130ab565b611e3a906008612e1c565b61ffff16868281518110611e5057611e506130be565b016020015160f81c901b9190911790600101611e1b565b5061ffff811615611e8a5760405162461bcd60e51b81526004016102e69061312e565b5f805b6004811015611ee557611ea18160036130ab565b611eac906008612e1c565b63ffffffff1687611ebe8360026130d2565b81518110611ece57611ece6130be565b016020015160f81c901b9190911790600101611e8d565b5063ffffffff8116600114611f0c5760405162461bcd60e51b81526004016102e690613171565b5f805b6020811015611f6157611f2381601f6130ab565b611f2e906008612e1c565b88611f3a8360066130d2565b81518110611f4a57611f4a6130be565b016020015160f81c901b9190911790600101611f0f565b505f805b6008811015611fc057611f798160076130ab565b611f84906008612e1c565b6001600160401b031689611f998360266130d2565b81518110611fa957611fa96130be565b016020015160f81c901b9190911790600101611f65565b505f805b600881101561201f57611fd88160076130ab565b611fe3906008612e1c565b6001600160401b03168a611ff883602e6130d2565b81518110612008576120086130be565b016020015160f81c901b9190911790600101611fc4565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661207857604051631afcd79f60e31b815260040160405180910390fd5b565b61208261202f565b61208b81612760565b6120bd606082013560808301356120a860c0850160a08601612b76565b6120b860e0860160c087016132bb565b612781565b50565b6120c861202f565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166121545760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016102e6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206133898339815191529060ff165f036121b2575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121fa90836130ab565b10612216576001600160401b0384166040830152808252612235565b838260400181815161222891906132d6565b6001600160401b03169052505b5f82602001518360400151606461224c91906132fd565b6122569190613328565b600285015490915060ff90811690821611156122d15760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102e6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610491827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906127ef565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161238f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146123ff5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102e6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612476576124368160016130ab565b612441906008612e1c565b5081515f90839083908110612458576124586130be565b60200101906001600160f81b03191690815f1a905350600101612422565b505f5b60048110156124d45761248d8160036130ab565b612498906008612e1c565b505f826124a68360026130d2565b815181106124b6576124b66130be565b60200101906001600160f81b03191690815f1a905350600101612479565b505f5b602081101561253157845181602081106124f3576124f36130be565b1a60f81b826125038360066130d2565b81518110612513576125136130be565b60200101906001600160f81b03191690815f1a9053506001016124d7565b505f5b60208110156125915784602001518160208110612553576125536130be565b1a60f81b826125638360266130d2565b81518110612573576125736130be565b60200101906001600160f81b03191690815f1a905350600101612534565b505f5b6008811015612605576125a88160076130ab565b6125b3906008612e1c565b60ff1685604001516001600160401b0316901c60f81b828260466125d791906130d2565b815181106125e7576125e76130be565b60200101906001600160f81b03191690815f1a905350600101612594565b505f5b60308110156126705784608001518181518110612627576126276130be565b01602001516001600160f81b0319168261264283604e6130d2565b81518110612652576126526130be565b60200101906001600160f81b03191690815f1a905350600101612608565b505f5b60088110156126e2576126878160076130ab565b612692906008612e1c565b60608601516001600160401b0390811691161c60f81b826126b483607e6130d2565b815181106126c4576126c46130be565b60200101906001600160f81b03191690815f1a905350600101612673565b506002816040516126f3919061334d565b602060405180830381855afa15801561270e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127319190612dca565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61276861202f565b612770612951565b612778612961565b6120bd81612969565b61278961202f565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128599190612dca565b90506128706001600160a01b0385163330866129d5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156128b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128d89190612dca565b905081811161293e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016102e6565b61294882826130ab565b95945050505050565b61295961202f565b612078612a35565b61207861202f565b61297161202f565b80355f8051602061338983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556129bb6060830160408401613368565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a2f908590612a3d565b50505050565b61273a61202f565b5f8060205f8451602086015f885af180612a5c576040513d5f823e3d81fd5b50505f513d91508115612a73578060011415612a80565b6001600160a01b0384163b155b15612a2f57604051635274afe760e01b81526001600160a01b03851660048201526024016102e6565b508054612ab590612f56565b5f825580601f10612ac4575050565b601f0160209004905f5260205f20908101906120bd91905b80821115612aef575f8155600101612adc565b5090565b5f60208284031215612b03575f80fd5b5035919050565b6001600160a01b03811681146120bd575f80fd5b5f80828403610100811215612b31575f80fd5b60e0811215612b3e575f80fd5b5082915060e0830135612b5081612b0a565b809150509250929050565b80356001600160401b0381168114612b71575f80fd5b919050565b5f60208284031215612b86575f80fd5b612b8f82612b5b565b9392505050565b80151581146120bd575f80fd5b803563ffffffff81168114612b71575f80fd5b5f805f60608486031215612bc8575f80fd5b833592506020840135612bda81612b96565b9150612be860408501612ba3565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612c2757612c27612bf1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612c5557612c55612bf1565b604052919050565b5f6001600160401b03821115612c7557612c75612bf1565b50601f01601f191660200190565b5f805f8060808587031215612c96575f80fd5b8435935060208501359250612cad60408601612b5b565b915060608501356001600160401b03811115612cc7575f80fd5b8501601f81018713612cd7575f80fd5b8035612cea612ce582612c5d565b612c2d565b818152886020838501011115612cfe575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612d2f575f80fd5b612b8f82612ba3565b5f8060408385031215612d49575f80fd5b612d5283612ba3565b91506020830135612b5081612b96565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612d90578181015183820152602001612d78565b50505f910152565b602081525f8251806020840152612db6816040850160208701612d76565b601f01601f19169190910160400192915050565b5f60208284031215612dda575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612e1757612e17612de1565b500490565b808202811582820484141761049157610491612df5565b8051612b7181612b96565b5f8060408385031215612e4f575f80fd5b82516001600160401b0380821115612e65575f80fd5b9084019060608287031215612e78575f80fd5b612e80612c05565b82518152602080840151612e9381612b0a565b82820152604084015183811115612ea8575f80fd5b80850194505087601f850112612ebc575f80fd5b83519250612ecc612ce584612c5d565b8381528882858701011115612edf575f80fd5b612eee84838301848801612d76565b80604084015250819550612f03818801612e33565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612f6a57607f821691505b602082108103612f8857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612fe781612f56565b806020870152604060018084165f8114613008576001811461302457613051565b60ff19851660408a0152604084151560051b8a01019550613051565b895f5260205f205f5b858110156130485781548b820186015290830190880161302d565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561049157610491612df5565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561049157610491612df5565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f8211156107dc57805f5260205f20601f840160051c810160208510156131dd5750805b601f840160051c820191505b8181101561036c575f81556001016131e9565b81516001600160401b0381111561321557613215612bf1565b613229816132238454612f56565b846131b8565b602080601f83116001811461325c575f84156132455750858301515b5f19600386901b1c1916600185901b1785556132b3565b5f85815260208120601f198616915b8281101561328a5788860151825594840194600190910190840161326b565b50858210156132a757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156132cb575f80fd5b8135612b8f81612b0a565b6001600160401b038181168382160190808211156132f6576132f6612df5565b5092915050565b6001600160401b0381811683821602808216919082811461332057613320612df5565b505092915050565b5f6001600160401b038084168061334157613341612de1565b92169190910492915050565b5f825161335e818460208701612d76565b9190910192915050565b5f60208284031215613378575f80fd5b813560ff81168114612b8f575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1046,6 +1046,151 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidati return event, nil } +// ERC20TokenStakingManagerValidationUptimeUpdatedIterator is returned from FilterValidationUptimeUpdated and is used to iterate over the raw logs and unpacked data for ValidationUptimeUpdated events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationUptimeUpdatedIterator struct { + Event *ERC20TokenStakingManagerValidationUptimeUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerValidationUptimeUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationUptimeUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationUptimeUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerValidationUptimeUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerValidationUptimeUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerValidationUptimeUpdated represents a ValidationUptimeUpdated event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationUptimeUpdated struct { + ValidationID [32]byte + Uptime uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationUptimeUpdated is a free log retrieval operation binding the contract event 0xdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c. +// +// Solidity: event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationUptimeUpdated(opts *bind.FilterOpts, validationID [][32]byte) (*ERC20TokenStakingManagerValidationUptimeUpdatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationUptimeUpdated", validationIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerValidationUptimeUpdatedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationUptimeUpdated", logs: logs, sub: sub}, nil +} + +// WatchValidationUptimeUpdated is a free log subscription operation binding the contract event 0xdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c. +// +// Solidity: event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationUptimeUpdated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationUptimeUpdated, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationUptimeUpdated", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerValidationUptimeUpdated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationUptimeUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationUptimeUpdated is a log parse operation binding the contract event 0xdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c. +// +// Solidity: event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationUptimeUpdated(log types.Log) (*ERC20TokenStakingManagerValidationUptimeUpdated, error) { + event := new(ERC20TokenStakingManagerValidationUptimeUpdated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationUptimeUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // ERC20TokenStakingManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerValidatorRemovalInitializedIterator struct { Event *ERC20TokenStakingManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log @@ -1119,13 +1264,12 @@ type ERC20TokenStakingManagerValidatorRemovalInitialized struct { SetWeightMessageID [32]byte Weight *big.Int EndTime *big.Int - Uptime uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*ERC20TokenStakingManagerValidatorRemovalInitializedIterator, error) { var validationIDRule []interface{} @@ -1144,9 +1288,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidat return &ERC20TokenStakingManagerValidatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -1190,9 +1334,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidato }), nil } -// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerValidatorRemovalInitialized, error) { event := new(ERC20TokenStakingManagerValidatorRemovalInitialized) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 777297b68..7961fc2a6 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516132ac3803806132ac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61315f8061014d5f395ff3fe60806040526004361061008e575f3560e01c8063a3a65e4811610057578063a3a65e481461015a578063b771b3bc14610179578063bee0a03f146101ab578063f40797d7146101ca578063fdf94a1a146101dd575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063620658561461010e57806376f786211461013b575b5f80fd5b34801561009d575f80fd5b506100b16100ac3660046128cd565b6101fc565b005b3480156100be575f80fd5b506100b16100cd3660046128e3565b610308565b3480156100dd575f80fd5b506100f16100ec3660046128e3565b610500565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b5061012d610128366004612915565b610516565b604051908152602001610105565b348015610146575f80fd5b506100b1610155366004612955565b61052f565b348015610165575f80fd5b506100b1610174366004612990565b6107c7565b348015610184575f80fd5b506101936005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101b6575f80fd5b506100b16101c53660046128e3565b610ae0565b61012d6101d8366004612a3b565b610bf4565b3480156101e8575f80fd5b506100b16101f7366004612acd565b610c16565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba8661104a565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061313383398151915293929190829060ff16600581111561036957610369612b02565b600581111561037a5761037a612b02565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561041157610411612b02565b1461047b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61048c848361010001515f61105e565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104b9908490600401612b38565b6020604051808303815f875af11580156104d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104f99190612b6a565b5050505050565b5f61051064e8d4a5100083612ba9565b92915050565b5f6105106001600160401b03831664e8d4a51000612bbc565b5f82156107b7576040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561057f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105a69190810190612bf2565b91509150806106035760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610472565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610646573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066a9190612b6a565b8251146106c95760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610472565b60208201516001600160a01b03161561073a5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610472565b5f80610749846040015161127b565b915091508188146107b15760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610472565b93505050505b6107c18482611453565b50505050565b5f5f805160206131338339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610822573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108499190810190612bf2565b915091508061086a5760405162461bcd60e51b815260040161047290612cc4565b82548251146108cd5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610472565b60208201516001600160a01b0316156109405760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610472565b5f8061094f8460400151611807565b91509150806109b15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610472565b5f828152600586016020526040812080546109cb90612d0a565b90501180156109fd575060015f83815260068701602052604090205460ff1660058111156109fb576109fb612b02565b145b610a195760405162461bcd60e51b815260040161047290612d3c565b5f8281526005860160205260408120610a3191612883565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613133833981519152929190610b2890612d0a565b9050118015610b5a575060015f83815260068301602052604090205460ff166005811115610b5857610b58612b02565b145b610b765760405162461bcd60e51b815260040161047290612d3c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610baf9190600401612d83565b6020604051808303815f875af1158015610bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bef9190612b6a565b505050565b5f80610bff346119a8565b9050610c0d85828686611a65565b95945050505050565b5f5f805160206131338339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c71573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c989190810190612bf2565b9150915080610cb95760405162461bcd60e51b815260040161047290612cc4565b5f8415610d3d575f610cce8460400151611ee9565b919350909150506001600160401b03811615610d375760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610472565b50610db3565b5f610d4b8460400151611807565b90925090508015610db15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610472565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610de557610de5612b02565b6005811115610df657610df6612b02565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610ea75760405162461bcd60e51b815260040161047290612e0d565b5f600382516005811115610ebd57610ebd612b02565b1480610edb5750600282516005811115610ed957610ed9612b02565b145b15610efe57506020808201515f9081526007870190915260408120556004610f02565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f3357610f33612b02565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b611052612124565b61105b8161216f565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110d757611097816001612e59565b6110a2906008612bbc565b5081515f908390839081106110b9576110b9612e6c565b60200101906001600160f81b03191690815f1a905350600101611083565b505f5b600481101561113a576110ee816003612e59565b6110f9906008612bbc565b6001901c60f81b8261110c836002612e80565b8151811061111c5761111c612e6c565b60200101906001600160f81b03191690815f1a9053506001016110da565b505f5b602081101561119c5761115181601f612e59565b61115c906008612bbc565b86901c60f81b8261116e836006612e80565b8151811061117e5761117e612e6c565b60200101906001600160f81b03191690815f1a90535060010161113d565b505f5b6008811015611207576111b3816007612e59565b6111be906008612bbc565b6001600160401b038616901c60f81b826111d9836026612e80565b815181106111e9576111e9612e6c565b60200101906001600160f81b03191690815f1a90535060010161119f565b505f5b60088110156112725761121e816007612e59565b611229906008612bbc565b6001600160401b038516901c60f81b8261124483602e612e80565b8151811061125457611254612e6c565b60200101906001600160f81b03191690815f1a90535060010161120a565b50949350505050565b5f808251602e1461129e5760405162461bcd60e51b815260040161047290612e93565b5f805b60028110156112ed576112b5816001612e59565b6112c0906008612bbc565b61ffff168582815181106112d6576112d6612e6c565b016020015160f81c901b91909117906001016112a1565b5061ffff8116156113105760405162461bcd60e51b815260040161047290612edc565b5f805b600481101561136b57611327816003612e59565b611332906008612bbc565b63ffffffff1686611344836002612e80565b8151811061135457611354612e6c565b016020015160f81c901b9190911790600101611313565b5063ffffffff81166004146113925760405162461bcd60e51b815260040161047290612f1f565b5f805b60208110156113e7576113a981601f612e59565b6113b4906008612bbc565b876113c0836006612e80565b815181106113d0576113d0612e6c565b016020015160f81c901b9190911790600101611395565b505f805b6008811015611446576113ff816007612e59565b61140a906008612bbc565b6001600160401b03168861141f836026612e80565b8151811061142f5761142f612e6c565b016020015160f81c901b91909117906001016113eb565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061313383398151915293929190829060ff1660058111156114b4576114b4612b02565b60058111156114c5576114c5612b02565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561155f5761155f612b02565b146115bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610472565b60c08101516001600160a01b0316336001600160a01b0316146115f05760405162461bcd60e51b815260040161047290612e0d565b6115fd81604001516121b2565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff1916600183600581111561164957611649612b02565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f9061173a9086908361105e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611769908590600401612b38565b6020604051808303815f875af1158015611785573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a99190612b6a565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f80825160271461182a5760405162461bcd60e51b815260040161047290612e93565b5f805b600281101561187957611841816001612e59565b61184c906008612bbc565b61ffff1685828151811061186257611862612e6c565b016020015160f81c901b919091179060010161182d565b5061ffff81161561189c5760405162461bcd60e51b815260040161047290612edc565b5f805b60048110156118f7576118b3816003612e59565b6118be906008612bbc565b63ffffffff16866118d0836002612e80565b815181106118e0576118e0612e6c565b016020015160f81c901b919091179060010161189f565b5063ffffffff811660021461191e5760405162461bcd60e51b815260040161047290612f1f565b5f805b60208110156119735761193581601f612e59565b611940906008612bbc565b8761194c836006612e80565b8151811061195c5761195c612e6c565b016020015160f81c901b9190911790600101611921565b505f8660268151811061198857611988612e6c565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0082826119d582610500565b83549091506001600160401b038216108015906119ff57508260010154816001600160401b031611155b611a5d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610472565b949350505050565b5f611a6e612353565b5f80516020613133833981519152426001600160401b038516118015611aa857506001600160401b038416611aa6426202a300612e80565b115b611b0a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610472565b85611b615760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610472565b5f86815260078201602052604090205415611bcf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610472565b8251603014611c365760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610472565b611c3f856121b2565b5f80611c866040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061239d565b5f82815260058601602052604090209193509150611ca48282612faa565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611cd1908590600401612b38565b6020604051808303815f875af1158015611ced573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d119190612b6a565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611d9757611d97612b02565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a5d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611f0d5760405162461bcd60e51b815260040161047290612e93565b5f805b6002811015611f5c57611f24816001612e59565b611f2f906008612bbc565b61ffff16868281518110611f4557611f45612e6c565b016020015160f81c901b9190911790600101611f10565b5061ffff811615611f7f5760405162461bcd60e51b815260040161047290612edc565b5f805b6004811015611fda57611f96816003612e59565b611fa1906008612bbc565b63ffffffff1687611fb3836002612e80565b81518110611fc357611fc3612e6c565b016020015160f81c901b9190911790600101611f82565b5063ffffffff81166001146120015760405162461bcd60e51b815260040161047290612f1f565b5f805b60208110156120565761201881601f612e59565b612023906008612bbc565b8861202f836006612e80565b8151811061203f5761203f612e6c565b016020015160f81c901b9190911790600101612004565b505f805b60088110156120b55761206e816007612e59565b612079906008612bbc565b6001600160401b03168961208e836026612e80565b8151811061209e5761209e612e6c565b016020015160f81c901b919091179060010161205a565b505f805b6008811015612114576120cd816007612e59565b6120d8906008612bbc565b6001600160401b03168a6120ed83602e612e80565b815181106120fd576120fd612e6c565b016020015160f81c901b91909117906001016120b9565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661216d57604051631afcd79f60e31b815260040160405180910390fd5b565b612177612124565b61218081612768565b61105b6060820135608083013561219d60c0850160a08601612915565b6121ad60e0860160c08701613065565b612789565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206131338339815191529060ff165f036121f0575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906122389083612e59565b10612254576001600160401b0384166040830152808252612273565b83826040018181516122669190613080565b6001600160401b03169052505b5f82602001518360400151606461228a91906130a7565b61229491906130d2565b600285015490915060ff908116908216111561230f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610472565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161239757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124075760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610472565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561247e5761243e816001612e59565b612449906008612bbc565b5081515f9083908390811061246057612460612e6c565b60200101906001600160f81b03191690815f1a90535060010161242a565b505f5b60048110156124dc57612495816003612e59565b6124a0906008612bbc565b505f826124ae836002612e80565b815181106124be576124be612e6c565b60200101906001600160f81b03191690815f1a905350600101612481565b505f5b602081101561253957845181602081106124fb576124fb612e6c565b1a60f81b8261250b836006612e80565b8151811061251b5761251b612e6c565b60200101906001600160f81b03191690815f1a9053506001016124df565b505f5b6020811015612599578460200151816020811061255b5761255b612e6c565b1a60f81b8261256b836026612e80565b8151811061257b5761257b612e6c565b60200101906001600160f81b03191690815f1a90535060010161253c565b505f5b600881101561260d576125b0816007612e59565b6125bb906008612bbc565b60ff1685604001516001600160401b0316901c60f81b828260466125df9190612e80565b815181106125ef576125ef612e6c565b60200101906001600160f81b03191690815f1a90535060010161259c565b505f5b6030811015612678578460800151818151811061262f5761262f612e6c565b01602001516001600160f81b0319168261264a83604e612e80565b8151811061265a5761265a612e6c565b60200101906001600160f81b03191690815f1a905350600101612610565b505f5b60088110156126ea5761268f816007612e59565b61269a906008612bbc565b60608601516001600160401b0390811691161c60f81b826126bc83607e612e80565b815181106126cc576126cc612e6c565b60200101906001600160f81b03191690815f1a90535060010161267b565b506002816040516126fb91906130f7565b602060405180830381855afa158015612716573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127399190612b6a565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612770612124565b6127786127f7565b612780612807565b61105b8161280f565b612791612124565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6127ff612124565b61216d61287b565b61216d612124565b612817612124565b80355f8051602061313383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556128616060830160408401613112565b600291909101805460ff191660ff90921691909117905550565b612742612124565b50805461288f90612d0a565b5f825580601f1061289e575050565b601f0160209004905f5260205f209081019061105b91905b808211156128c9575f81556001016128b6565b5090565b5f60e082840312156128dd575f80fd5b50919050565b5f602082840312156128f3575f80fd5b5035919050565b80356001600160401b0381168114612910575f80fd5b919050565b5f60208284031215612925575f80fd5b61292e826128fa565b9392505050565b801515811461105b575f80fd5b803563ffffffff81168114612910575f80fd5b5f805f60608486031215612967575f80fd5b83359250602084013561297981612935565b915061298760408501612942565b90509250925092565b5f602082840312156129a0575f80fd5b61292e82612942565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129df576129df6129a9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612a0d57612a0d6129a9565b604052919050565b5f6001600160401b03821115612a2d57612a2d6129a9565b50601f01601f191660200190565b5f805f60608486031215612a4d575f80fd5b83359250612a5d602085016128fa565b915060408401356001600160401b03811115612a77575f80fd5b8401601f81018613612a87575f80fd5b8035612a9a612a9582612a15565b6129e5565b818152876020838501011115612aae575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612ade575f80fd5b612ae783612942565b91506020830135612af781612935565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612b30578181015183820152602001612b18565b50505f910152565b602081525f8251806020840152612b56816040850160208701612b16565b601f01601f19169190910160400192915050565b5f60208284031215612b7a575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612bb757612bb7612b81565b500490565b808202811582820484141761051057610510612b95565b6001600160a01b038116811461105b575f80fd5b805161291081612935565b5f8060408385031215612c03575f80fd5b82516001600160401b0380821115612c19575f80fd5b9084019060608287031215612c2c575f80fd5b612c346129bd565b82518152602080840151612c4781612bd3565b82820152604084015183811115612c5c575f80fd5b80850194505087601f850112612c70575f80fd5b83519250612c80612a9584612a15565b8381528882858701011115612c93575f80fd5b612ca284838301848801612b16565b80604084015250819550612cb7818801612be7565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612d1e57607f821691505b6020821081036128dd57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612d9581612d0a565b806020870152604060018084165f8114612db65760018114612dd257612dff565b60ff19851660408a0152604084151560051b8a01019550612dff565b895f5260205f205f5b85811015612df65781548b8201860152908301908801612ddb565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561051057610510612b95565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561051057610510612b95565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610bef57805f5260205f20601f840160051c81016020851015612f8b5750805b601f840160051c820191505b818110156104f9575f8155600101612f97565b81516001600160401b03811115612fc357612fc36129a9565b612fd781612fd18454612d0a565b84612f66565b602080601f83116001811461300a575f8415612ff35750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b8281101561303857888601518255948401946001909101908401613019565b508582101561305557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215613075575f80fd5b813561292e81612bd3565b6001600160401b038181168382160190808211156130a0576130a0612b95565b5092915050565b6001600160401b038181168382160280821691908281146130ca576130ca612b95565b505092915050565b5f6001600160401b03808416806130eb576130eb612b81565b92169190910492915050565b5f8251613108818460208701612b16565b9190910192915050565b5f60208284031215613122575f80fd5b813560ff8116811461292e575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161320438038061320483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130b78061014d5f395ff3fe60806040526004361061008e575f3560e01c8063a3a65e4811610057578063a3a65e481461015a578063b771b3bc14610179578063bee0a03f146101ab578063f40797d7146101ca578063fdf94a1a146101dd575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063620658561461010e57806376f786211461013b575b5f80fd5b34801561009d575f80fd5b506100b16100ac366004612825565b6101fc565b005b3480156100be575f80fd5b506100b16100cd36600461283b565b610308565b3480156100dd575f80fd5b506100f16100ec36600461283b565b6104de565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b5061012d61012836600461286d565b6104f4565b604051908152602001610105565b348015610146575f80fd5b506100b16101553660046128ad565b61050d565b348015610165575f80fd5b506100b16101743660046128e8565b61083e565b348015610184575f80fd5b506101936005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101b6575f80fd5b506100b16101c536600461283b565b610b57565b61012d6101d8366004612993565b610c66565b3480156101e8575f80fd5b506100b16101f7366004612a25565b610c88565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba8661105b565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061308b83398151915293929190829060ff16600581111561036857610368612a5a565b600581111561037957610379612a5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156103f0576103f0612a5a565b1461045a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61046a8483606001515f61106f565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610497908490600401612a90565b6020604051808303815f875af11580156104b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d79190612ac2565b5050505050565b5f6104ee64e8d4a5100083612b01565b92915050565b5f6104ee6001600160401b03831664e8d4a51000612b14565b8115610830575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610581573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105a89190810190612b4a565b915091508061060b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610451565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561064e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106729190612ac2565b8251146106d65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610451565b60208201516001600160a01b03161561074c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610451565b5f8061075b846040015161128c565b915091508188146107c85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610451565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61083983611464565b505050565b5f5f8051602061308b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610899573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108c09190810190612b4a565b91509150806108e15760405162461bcd60e51b815260040161045190612c1c565b82548251146109445760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610451565b60208201516001600160a01b0316156109b75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610451565b5f806109c684604001516117ac565b9150915080610a285760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610451565b5f82815260058601602052604081208054610a4290612c62565b9050118015610a74575060015f83815260068701602052604090205460ff166005811115610a7257610a72612a5a565b145b610a905760405162461bcd60e51b815260040161045190612c94565b5f8281526005860160205260408120610aa8916127db565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061308b833981519152929190610b9f90612c62565b9050118015610bd1575060015f83815260068301602052604090205460ff166005811115610bcf57610bcf612a5a565b145b610bed5760405162461bcd60e51b815260040161045190612c94565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c269190600401612cdb565b6020604051808303815f875af1158015610c42573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108399190612ac2565b5f80610c713461194d565b9050610c7f85828686611a0a565b95945050505050565b5f5f8051602061308b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ce3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d0a9190810190612b4a565b9150915080610d2b5760405162461bcd60e51b815260040161045190612c1c565b5f8415610daf575f610d408460400151611e41565b919350909150506001600160401b03811615610da95760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610451565b50610e25565b5f610dbd84604001516117ac565b90925090508015610e235760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610451565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610e5657610e56612a5a565b6005811115610e6757610e67612a5a565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610ef85760405162461bcd60e51b815260040161045190612d65565b5f600382516005811115610f0e57610f0e612a5a565b1480610f2c5750600282516005811115610f2a57610f2a612a5a565b145b15610f4f57506020808201515f9081526007870190915260408120556004610f53565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f8457610f84612a5a565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b61106361207c565b61106c816120c7565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110e8576110a8816001612db1565b6110b3906008612b14565b5081515f908390839081106110ca576110ca612dc4565b60200101906001600160f81b03191690815f1a905350600101611094565b505f5b600481101561114b576110ff816003612db1565b61110a906008612b14565b6001901c60f81b8261111d836002612dd8565b8151811061112d5761112d612dc4565b60200101906001600160f81b03191690815f1a9053506001016110eb565b505f5b60208110156111ad5761116281601f612db1565b61116d906008612b14565b86901c60f81b8261117f836006612dd8565b8151811061118f5761118f612dc4565b60200101906001600160f81b03191690815f1a90535060010161114e565b505f5b6008811015611218576111c4816007612db1565b6111cf906008612b14565b6001600160401b038616901c60f81b826111ea836026612dd8565b815181106111fa576111fa612dc4565b60200101906001600160f81b03191690815f1a9053506001016111b0565b505f5b60088110156112835761122f816007612db1565b61123a906008612b14565b6001600160401b038516901c60f81b8261125583602e612dd8565b8151811061126557611265612dc4565b60200101906001600160f81b03191690815f1a90535060010161121b565b50949350505050565b5f808251602e146112af5760405162461bcd60e51b815260040161045190612deb565b5f805b60028110156112fe576112c6816001612db1565b6112d1906008612b14565b61ffff168582815181106112e7576112e7612dc4565b016020015160f81c901b91909117906001016112b2565b5061ffff8116156113215760405162461bcd60e51b815260040161045190612e34565b5f805b600481101561137c57611338816003612db1565b611343906008612b14565b63ffffffff1686611355836002612dd8565b8151811061136557611365612dc4565b016020015160f81c901b9190911790600101611324565b5063ffffffff81166004146113a35760405162461bcd60e51b815260040161045190612e77565b5f805b60208110156113f8576113ba81601f612db1565b6113c5906008612b14565b876113d1836006612dd8565b815181106113e1576113e1612dc4565b016020015160f81c901b91909117906001016113a6565b505f805b600881101561145757611410816007612db1565b61141b906008612b14565b6001600160401b031688611430836026612dd8565b8151811061144057611440612dc4565b016020015160f81c901b91909117906001016113fc565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061308b83398151915293929190829060ff1660058111156114c4576114c4612a5a565b60058111156114d5576114d5612a5a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561154f5761154f612a5a565b146115ab5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610451565b60408101516001600160a01b0316336001600160a01b0316146115e05760405162461bcd60e51b815260040161045190612d65565b6115ed816080015161210a565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561163157611631612a5a565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116e89085908361106f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611717908590600401612a90565b6020604051808303815f875af1158015611733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117579190612ac2565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117cf5760405162461bcd60e51b815260040161045190612deb565b5f805b600281101561181e576117e6816001612db1565b6117f1906008612b14565b61ffff1685828151811061180757611807612dc4565b016020015160f81c901b91909117906001016117d2565b5061ffff8116156118415760405162461bcd60e51b815260040161045190612e34565b5f805b600481101561189c57611858816003612db1565b611863906008612b14565b63ffffffff1686611875836002612dd8565b8151811061188557611885612dc4565b016020015160f81c901b9190911790600101611844565b5063ffffffff81166002146118c35760405162461bcd60e51b815260040161045190612e77565b5f805b6020811015611918576118da81601f612db1565b6118e5906008612b14565b876118f1836006612dd8565b8151811061190157611901612dc4565b016020015160f81c901b91909117906001016118c6565b505f8660268151811061192d5761192d612dc4565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00828261197a826104de565b83549091506001600160401b038216108015906119a457508260010154816001600160401b031611155b611a025760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610451565b949350505050565b5f611a136122ab565b5f8051602061308b833981519152426001600160401b038516118015611a4d57506001600160401b038416611a4b426202a300612dd8565b115b611aaf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610451565b85611b065760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610451565b5f86815260078201602052604090205415611b745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610451565b8251603014611bdb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610451565b611be48561210a565b5f80611c2b6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506122f5565b5f82815260058601602052604090209193509150611c498282612f02565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611c76908590600401612a90565b6020604051808303815f875af1158015611c92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb69190612ac2565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611d2f57611d2f612a5a565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a0260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611e655760405162461bcd60e51b815260040161045190612deb565b5f805b6002811015611eb457611e7c816001612db1565b611e87906008612b14565b61ffff16868281518110611e9d57611e9d612dc4565b016020015160f81c901b9190911790600101611e68565b5061ffff811615611ed75760405162461bcd60e51b815260040161045190612e34565b5f805b6004811015611f3257611eee816003612db1565b611ef9906008612b14565b63ffffffff1687611f0b836002612dd8565b81518110611f1b57611f1b612dc4565b016020015160f81c901b9190911790600101611eda565b5063ffffffff8116600114611f595760405162461bcd60e51b815260040161045190612e77565b5f805b6020811015611fae57611f7081601f612db1565b611f7b906008612b14565b88611f87836006612dd8565b81518110611f9757611f97612dc4565b016020015160f81c901b9190911790600101611f5c565b505f805b600881101561200d57611fc6816007612db1565b611fd1906008612b14565b6001600160401b031689611fe6836026612dd8565b81518110611ff657611ff6612dc4565b016020015160f81c901b9190911790600101611fb2565b505f805b600881101561206c57612025816007612db1565b612030906008612b14565b6001600160401b03168a61204583602e612dd8565b8151811061205557612055612dc4565b016020015160f81c901b9190911790600101612011565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166120c557604051631afcd79f60e31b815260040160405180910390fd5b565b6120cf61207c565b6120d8816126c0565b61106c606082013560808301356120f560c0850160a0860161286d565b61210560e0860160c08701612fbd565b6126e1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061308b8339815191529060ff165f03612148575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121909083612db1565b106121ac576001600160401b03841660408301528082526121cb565b83826040018181516121be9190612fd8565b6001600160401b03169052505b5f8260200151836040015160646121e29190612fff565b6121ec919061302a565b600285015490915060ff90811690821611156122675760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610451565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016122ef57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461235f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610451565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156123d657612396816001612db1565b6123a1906008612b14565b5081515f908390839081106123b8576123b8612dc4565b60200101906001600160f81b03191690815f1a905350600101612382565b505f5b6004811015612434576123ed816003612db1565b6123f8906008612b14565b505f82612406836002612dd8565b8151811061241657612416612dc4565b60200101906001600160f81b03191690815f1a9053506001016123d9565b505f5b6020811015612491578451816020811061245357612453612dc4565b1a60f81b82612463836006612dd8565b8151811061247357612473612dc4565b60200101906001600160f81b03191690815f1a905350600101612437565b505f5b60208110156124f157846020015181602081106124b3576124b3612dc4565b1a60f81b826124c3836026612dd8565b815181106124d3576124d3612dc4565b60200101906001600160f81b03191690815f1a905350600101612494565b505f5b600881101561256557612508816007612db1565b612513906008612b14565b60ff1685604001516001600160401b0316901c60f81b828260466125379190612dd8565b8151811061254757612547612dc4565b60200101906001600160f81b03191690815f1a9053506001016124f4565b505f5b60308110156125d0578460800151818151811061258757612587612dc4565b01602001516001600160f81b031916826125a283604e612dd8565b815181106125b2576125b2612dc4565b60200101906001600160f81b03191690815f1a905350600101612568565b505f5b6008811015612642576125e7816007612db1565b6125f2906008612b14565b60608601516001600160401b0390811691161c60f81b8261261483607e612dd8565b8151811061262457612624612dc4565b60200101906001600160f81b03191690815f1a9053506001016125d3565b50600281604051612653919061304f565b602060405180830381855afa15801561266e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906126919190612ac2565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126c861207c565b6126d061274f565b6126d861275f565b61106c81612767565b6126e961207c565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61275761207c565b6120c56127d3565b6120c561207c565b61276f61207c565b80355f8051602061308b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556127b9606083016040840161306a565b600291909101805460ff191660ff90921691909117905550565b61269a61207c565b5080546127e790612c62565b5f825580601f106127f6575050565b601f0160209004905f5260205f209081019061106c91905b80821115612821575f815560010161280e565b5090565b5f60e08284031215612835575f80fd5b50919050565b5f6020828403121561284b575f80fd5b5035919050565b80356001600160401b0381168114612868575f80fd5b919050565b5f6020828403121561287d575f80fd5b61288682612852565b9392505050565b801515811461106c575f80fd5b803563ffffffff81168114612868575f80fd5b5f805f606084860312156128bf575f80fd5b8335925060208401356128d18161288d565b91506128df6040850161289a565b90509250925092565b5f602082840312156128f8575f80fd5b6128868261289a565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561293757612937612901565b60405290565b604051601f8201601f191681016001600160401b038111828210171561296557612965612901565b604052919050565b5f6001600160401b0382111561298557612985612901565b50601f01601f191660200190565b5f805f606084860312156129a5575f80fd5b833592506129b560208501612852565b915060408401356001600160401b038111156129cf575f80fd5b8401601f810186136129df575f80fd5b80356129f26129ed8261296d565b61293d565b818152876020838501011115612a06575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612a36575f80fd5b612a3f8361289a565b91506020830135612a4f8161288d565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612a88578181015183820152602001612a70565b50505f910152565b602081525f8251806020840152612aae816040850160208701612a6e565b601f01601f19169190910160400192915050565b5f60208284031215612ad2575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612b0f57612b0f612ad9565b500490565b80820281158282048414176104ee576104ee612aed565b6001600160a01b038116811461106c575f80fd5b80516128688161288d565b5f8060408385031215612b5b575f80fd5b82516001600160401b0380821115612b71575f80fd5b9084019060608287031215612b84575f80fd5b612b8c612915565b82518152602080840151612b9f81612b2b565b82820152604084015183811115612bb4575f80fd5b80850194505087601f850112612bc8575f80fd5b83519250612bd86129ed8461296d565b8381528882858701011115612beb575f80fd5b612bfa84838301848801612a6e565b80604084015250819550612c0f818801612b3f565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612c7657607f821691505b60208210810361283557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612ced81612c62565b806020870152604060018084165f8114612d0e5760018114612d2a57612d57565b60ff19851660408a0152604084151560051b8a01019550612d57565b895f5260205f205f5b85811015612d4e5781548b8201860152908301908801612d33565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104ee576104ee612aed565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104ee576104ee612aed565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f82111561083957805f5260205f20601f840160051c81016020851015612ee35750805b601f840160051c820191505b818110156104d7575f8155600101612eef565b81516001600160401b03811115612f1b57612f1b612901565b612f2f81612f298454612c62565b84612ebe565b602080601f831160018114612f62575f8415612f4b5750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b82811015612f9057888601518255948401946001909101908401612f71565b5085821015612fad57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612fcd575f80fd5b813561288681612b2b565b6001600160401b03818116838216019080821115612ff857612ff8612aed565b5092915050565b6001600160401b0381811683821602808216919082811461302257613022612aed565b505092915050565b5f6001600160401b038084168061304357613043612ad9565b92169190910492915050565b5f8251613060818460208701612a6e565b9190910192915050565b5f6020828403121561307a575f80fd5b813560ff81168114612886575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1046,6 +1046,151 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValida return event, nil } +// NativeTokenStakingManagerValidationUptimeUpdatedIterator is returned from FilterValidationUptimeUpdated and is used to iterate over the raw logs and unpacked data for ValidationUptimeUpdated events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationUptimeUpdatedIterator struct { + Event *NativeTokenStakingManagerValidationUptimeUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerValidationUptimeUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationUptimeUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationUptimeUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerValidationUptimeUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerValidationUptimeUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerValidationUptimeUpdated represents a ValidationUptimeUpdated event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationUptimeUpdated struct { + ValidationID [32]byte + Uptime uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationUptimeUpdated is a free log retrieval operation binding the contract event 0xdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c. +// +// Solidity: event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationUptimeUpdated(opts *bind.FilterOpts, validationID [][32]byte) (*NativeTokenStakingManagerValidationUptimeUpdatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationUptimeUpdated", validationIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerValidationUptimeUpdatedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationUptimeUpdated", logs: logs, sub: sub}, nil +} + +// WatchValidationUptimeUpdated is a free log subscription operation binding the contract event 0xdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c. +// +// Solidity: event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationUptimeUpdated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationUptimeUpdated, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationUptimeUpdated", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerValidationUptimeUpdated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationUptimeUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationUptimeUpdated is a log parse operation binding the contract event 0xdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c. +// +// Solidity: event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationUptimeUpdated(log types.Log) (*NativeTokenStakingManagerValidationUptimeUpdated, error) { + event := new(NativeTokenStakingManagerValidationUptimeUpdated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationUptimeUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // NativeTokenStakingManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerValidatorRemovalInitializedIterator struct { Event *NativeTokenStakingManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log @@ -1119,13 +1264,12 @@ type NativeTokenStakingManagerValidatorRemovalInitialized struct { SetWeightMessageID [32]byte Weight *big.Int EndTime *big.Int - Uptime uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*NativeTokenStakingManagerValidatorRemovalInitializedIterator, error) { var validationIDRule []interface{} @@ -1144,9 +1288,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValid return &NativeTokenStakingManagerValidatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -1190,9 +1334,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValida }), nil } -// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerValidatorRemovalInitialized, error) { event := new(NativeTokenStakingManagerValidatorRemovalInitialized) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 2a881915a..eb964608b 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -38,8 +38,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612d67380380612d6783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c1a8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b83660046123bb565b6101b1565b005b6100d26100cd36600461247f565b6103a9565b6040519081526020015b60405180910390f35b6100bd6103c9565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f3660046123bb565b6103dc565b6100bd610152366004612535565b6103e9565b6101196005600160991b0181565b6100bd6101733660046123bb565b610702565b6100bd610186366004612569565b610816565b6100bd6101993660046125a5565b610924565b6100bd6101ac3660046125cd565b61095e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612bee83398151915293929190829060ff166005811115610212576102126125f7565b6005811115610223576102236125f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102ba576102ba6125f7565b146103245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f610335848361010001515f610d92565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061036290849060040161262d565b6020604051808303815f875af115801561037e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a2919061265f565b5050505050565b5f6103b2610faf565b6103be8486858561100a565b90505b949350505050565b6103d1610faf565b6103da5f61148e565b565b6103e6815f6114fe565b50565b5f5f80516020612bee8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610444573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261046b9190810190612681565b915091508061048c5760405162461bcd60e51b815260040161031b90612753565b82548251146104ef5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161031b565b60208201516001600160a01b0316156105625760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161031b565b5f8061057184604001516118b2565b91509150806105d35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161031b565b5f828152600586016020526040812080546105ed90612799565b905011801561061f575060015f83815260068701602052604090205460ff16600581111561061d5761061d6125f7565b145b61063b5760405162461bcd60e51b815260040161031b906127d1565b5f828152600586016020526040812061065391612371565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612bee83398151915292919061074a90612799565b905011801561077c575060015f83815260068301602052604090205460ff16600581111561077a5761077a6125f7565b145b6107985760405162461bcd60e51b815260040161031b906127d1565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107d19190600401612818565b6020604051808303815f875af11580156107ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610811919061265f565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561085a5750825b90505f826001600160401b031660011480156108755750303b155b905081158015610883575080155b156108a15760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108cb57845460ff60401b1916600160401b1785555b6108d58787611a53565b831561091b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61092c610faf565b6001600160a01b03811661095557604051631e4fbdf760e01b81525f600482015260240161031b565b6103e68161148e565b5f5f80516020612bee8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156109b9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109e09190810190612681565b9150915080610a015760405162461bcd60e51b815260040161031b90612753565b5f8415610a85575f610a168460400151611a71565b919350909150506001600160401b03811615610a7f5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161031b565b50610afb565b5f610a9384604001516118b2565b90925090508015610af95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161031b565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610b2d57610b2d6125f7565b6005811115610b3e57610b3e6125f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610bef5760405162461bcd60e51b815260040161031b906128a2565b5f600382516005811115610c0557610c056125f7565b1480610c235750600282516005811115610c2157610c216125f7565b145b15610c4657506020808201515f9081526007870190915260408120556004610c4a565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610c7b57610c7b6125f7565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610e0b57610dcb816001612902565b610dd690600861291b565b5081515f90839083908110610ded57610ded612932565b60200101906001600160f81b03191690815f1a905350600101610db7565b505f5b6004811015610e6e57610e22816003612902565b610e2d90600861291b565b6001901c60f81b82610e40836002612946565b81518110610e5057610e50612932565b60200101906001600160f81b03191690815f1a905350600101610e0e565b505f5b6020811015610ed057610e8581601f612902565b610e9090600861291b565b86901c60f81b82610ea2836006612946565b81518110610eb257610eb2612932565b60200101906001600160f81b03191690815f1a905350600101610e71565b505f5b6008811015610f3b57610ee7816007612902565b610ef290600861291b565b6001600160401b038616901c60f81b82610f0d836026612946565b81518110610f1d57610f1d612932565b60200101906001600160f81b03191690815f1a905350600101610ed3565b505f5b6008811015610fa657610f52816007612902565b610f5d90600861291b565b6001600160401b038516901c60f81b82610f7883602e612946565b81518110610f8857610f88612932565b60200101906001600160f81b03191690815f1a905350600101610f3e565b50949350505050565b33610fe17f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103da5760405163118cdaa760e01b815233600482015260240161031b565b5f611013611cac565b5f80516020612bee833981519152426001600160401b03851611801561104d57506001600160401b03841661104b426202a300612946565b115b6110af5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161031b565b856111065760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161031b565b5f868152600782016020526040902054156111745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161031b565b82516030146111db5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161031b565b6111e485611cf6565b5f8061122b6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611e97565b5f82815260058601602052604090209193509150611249828261299d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061127690859060040161262d565b6020604051808303815f875af1158015611292573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b6919061265f565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff1916600183600581111561133c5761133c6125f7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103c160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612bee83398151915293929190829060ff16600581111561155f5761155f6125f7565b6005811115611570576115706125f7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561160a5761160a6125f7565b146116665760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161031b565b60c08101516001600160a01b0316336001600160a01b03161461169b5760405162461bcd60e51b815260040161031b906128a2565b6116a88160400151611cf6565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff191660018360058111156116f4576116f46125f7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f906117e590869083610d92565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061181490859060040161262d565b6020604051808303815f875af1158015611830573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611854919061265f565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f8082516027146118d55760405162461bcd60e51b815260040161031b90612a5c565b5f805b6002811015611924576118ec816001612902565b6118f790600861291b565b61ffff1685828151811061190d5761190d612932565b016020015160f81c901b91909117906001016118d8565b5061ffff8116156119475760405162461bcd60e51b815260040161031b90612aa5565b5f805b60048110156119a25761195e816003612902565b61196990600861291b565b63ffffffff168661197b836002612946565b8151811061198b5761198b612932565b016020015160f81c901b919091179060010161194a565b5063ffffffff81166002146119c95760405162461bcd60e51b815260040161031b90612ae8565b5f805b6020811015611a1e576119e081601f612902565b6119eb90600861291b565b876119f7836006612946565b81518110611a0757611a07612932565b016020015160f81c901b91909117906001016119cc565b505f86602681518110611a3357611a33612932565b016020015191976001600160f81b03199092161515965090945050505050565b611a5b612262565b611a64826122ab565b611a6d816122cc565b5050565b5f805f8351603614611a955760405162461bcd60e51b815260040161031b90612a5c565b5f805b6002811015611ae457611aac816001612902565b611ab790600861291b565b61ffff16868281518110611acd57611acd612932565b016020015160f81c901b9190911790600101611a98565b5061ffff811615611b075760405162461bcd60e51b815260040161031b90612aa5565b5f805b6004811015611b6257611b1e816003612902565b611b2990600861291b565b63ffffffff1687611b3b836002612946565b81518110611b4b57611b4b612932565b016020015160f81c901b9190911790600101611b0a565b5063ffffffff8116600114611b895760405162461bcd60e51b815260040161031b90612ae8565b5f805b6020811015611bde57611ba081601f612902565b611bab90600861291b565b88611bb7836006612946565b81518110611bc757611bc7612932565b016020015160f81c901b9190911790600101611b8c565b505f805b6008811015611c3d57611bf6816007612902565b611c0190600861291b565b6001600160401b031689611c16836026612946565b81518110611c2657611c26612932565b016020015160f81c901b9190911790600101611be2565b505f805b6008811015611c9c57611c55816007612902565b611c6090600861291b565b6001600160401b03168a611c7583602e612946565b81518110611c8557611c85612932565b016020015160f81c901b9190911790600101611c41565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611cf057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612bee8339815191529060ff165f03611d34575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611d7c9083612902565b10611d98576001600160401b0384166040830152808252611db7565b8382604001818151611daa9190612b2f565b6001600160401b03169052505b5f826020015183604001516064611dce9190612b56565b611dd89190612b81565b600285015490915060ff9081169082161115611e535760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161031b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611f015760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161031b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611f7857611f38816001612902565b611f4390600861291b565b5081515f90839083908110611f5a57611f5a612932565b60200101906001600160f81b03191690815f1a905350600101611f24565b505f5b6004811015611fd657611f8f816003612902565b611f9a90600861291b565b505f82611fa8836002612946565b81518110611fb857611fb8612932565b60200101906001600160f81b03191690815f1a905350600101611f7b565b505f5b60208110156120335784518160208110611ff557611ff5612932565b1a60f81b82612005836006612946565b8151811061201557612015612932565b60200101906001600160f81b03191690815f1a905350600101611fd9565b505f5b6020811015612093578460200151816020811061205557612055612932565b1a60f81b82612065836026612946565b8151811061207557612075612932565b60200101906001600160f81b03191690815f1a905350600101612036565b505f5b6008811015612107576120aa816007612902565b6120b590600861291b565b60ff1685604001516001600160401b0316901c60f81b828260466120d99190612946565b815181106120e9576120e9612932565b60200101906001600160f81b03191690815f1a905350600101612096565b505f5b6030811015612172578460800151818151811061212957612129612932565b01602001516001600160f81b0319168261214483604e612946565b8151811061215457612154612932565b60200101906001600160f81b03191690815f1a90535060010161210a565b505f5b60088110156121e457612189816007612902565b61219490600861291b565b60608601516001600160401b0390811691161c60f81b826121b683607e612946565b815181106121c6576121c6612932565b60200101906001600160f81b03191690815f1a905350600101612175565b506002816040516121f59190612bb2565b602060405180830381855afa158015612210573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612233919061265f565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103da57604051631afcd79f60e31b815260040160405180910390fd5b6122b3612262565b6122bb6122dd565b6122c36122ed565b6103e6816122f5565b6122d4612262565b6103e681612361565b6122e5612262565b6103da612369565b6103da612262565b6122fd612262565b80355f80516020612bee83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123476060830160408401612bcd565b600291909101805460ff191660ff90921691909117905550565b61092c612262565b61223c612262565b50805461237d90612799565b5f825580601f1061238c575050565b601f0160209004905f5260205f20908101906103e691905b808211156123b7575f81556001016123a4565b5090565b5f602082840312156123cb575f80fd5b5035919050565b80356001600160401b03811681146123e8575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612423576124236123ed565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612451576124516123ed565b604052919050565b5f6001600160401b03821115612471576124716123ed565b50601f01601f191660200190565b5f805f8060808587031215612492575f80fd5b61249b856123d2565b9350602085013592506124b0604086016123d2565b915060608501356001600160401b038111156124ca575f80fd5b8501601f810187136124da575f80fd5b80356124ed6124e882612459565b612429565b818152886020838501011115612501575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146123e8575f80fd5b5f60208284031215612545575f80fd5b61254e82612522565b9392505050565b6001600160a01b03811681146103e6575f80fd5b5f80828403608081121561257b575f80fd5b6060811215612588575f80fd5b50829150606083013561259a81612555565b809150509250929050565b5f602082840312156125b5575f80fd5b813561254e81612555565b80151581146103e6575f80fd5b5f80604083850312156125de575f80fd5b6125e783612522565b9150602083013561259a816125c0565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561262557818101518382015260200161260d565b50505f910152565b602081525f825180602084015261264b81604085016020870161260b565b601f01601f19169190910160400192915050565b5f6020828403121561266f575f80fd5b5051919050565b80516123e8816125c0565b5f8060408385031215612692575f80fd5b82516001600160401b03808211156126a8575f80fd5b90840190606082870312156126bb575f80fd5b6126c3612401565b825181526020808401516126d681612555565b828201526040840151838111156126eb575f80fd5b80850194505087601f8501126126ff575f80fd5b8351925061270f6124e884612459565b8381528882858701011115612722575f80fd5b6127318483830184880161260b565b80604084015250819550612746818801612676565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c908216806127ad57607f821691505b6020821081036127cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461282a81612799565b806020870152604060018084165f811461284b576001811461286757612894565b60ff19851660408a0152604084151560051b8a01019550612894565b895f5260205f205f5b8581101561288b5781548b8201860152908301908801612870565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612915576129156128ee565b92915050565b8082028115828204841417612915576129156128ee565b634e487b7160e01b5f52603260045260245ffd5b80820180821115612915576129156128ee565b601f82111561081157805f5260205f20601f840160051c8101602085101561297e5750805b601f840160051c820191505b818110156103a2575f815560010161298a565b81516001600160401b038111156129b6576129b66123ed565b6129ca816129c48454612799565b84612959565b602080601f8311600181146129fd575f84156129e65750858301515b5f19600386901b1c1916600185901b178555612a54565b5f85815260208120601f198616915b82811015612a2b57888601518255948401946001909101908401612a0c565b5085821015612a4857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612b4f57612b4f6128ee565b5092915050565b6001600160401b03818116838216028082169190828114612b7957612b796128ee565b505092915050565b5f6001600160401b0380841680612ba657634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612bc381846020870161260b565b9190910192915050565b5f60208284031215612bdd575f80fd5b813560ff8116811461254e575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612c2a380380612c2a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612add8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b836600461227e565b6101b1565b005b6100d26100cd366004612342565b610387565b6040519081526020015b60405180910390f35b6100bd6103a7565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f36600461227e565b6103ba565b6100bd6101523660046123f8565b6103c6565b6101196005600160991b0181565b6100bd61017336600461227e565b6106df565b6100bd61018636600461242c565b6107f3565b6100bd610199366004612468565b610901565b6100bd6101ac366004612490565b61093b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612ab183398151915293929190829060ff166005811115610211576102116124ba565b6005811115610222576102226124ba565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c09091015290915081516005811115610299576102996124ba565b146103035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103138483606001515f610d0e565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103409084906004016124f0565b6020604051808303815f875af115801561035c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190612522565b5050505050565b5f610390610f2b565b61039c84868585610f86565b90505b949350505050565b6103af610f2b565b6103b85f6113bd565b565b6103c38161142d565b50565b5f5f80516020612ab18339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610421573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104489190810190612544565b91509150806104695760405162461bcd60e51b81526004016102fa90612616565b82548251146104cc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102fa565b60208201516001600160a01b03161561053f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102fa565b5f8061054e8460400151611775565b91509150806105b05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102fa565b5f828152600586016020526040812080546105ca9061265c565b90501180156105fc575060015f83815260068701602052604090205460ff1660058111156105fa576105fa6124ba565b145b6106185760405162461bcd60e51b81526004016102fa90612694565b5f828152600586016020526040812061063091612234565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612ab18339815191529291906107279061265c565b9050118015610759575060015f83815260068301602052604090205460ff166005811115610757576107576124ba565b145b6107755760405162461bcd60e51b81526004016102fa90612694565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107ae91906004016126db565b6020604051808303815f875af11580156107ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ee9190612522565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108375750825b90505f826001600160401b031660011480156108525750303b155b905081158015610860575080155b1561087e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108a857845460ff60401b1916600160401b1785555b6108b28787611916565b83156108f857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610909610f2b565b6001600160a01b03811661093257604051631e4fbdf760e01b81525f60048201526024016102fa565b6103c3816113bd565b5f5f80516020612ab18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610996573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109bd9190810190612544565b91509150806109de5760405162461bcd60e51b81526004016102fa90612616565b5f8415610a62575f6109f38460400151611934565b919350909150506001600160401b03811615610a5c5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016102fa565b50610ad8565b5f610a708460400151611775565b90925090508015610ad65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102fa565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610b0957610b096124ba565b6005811115610b1a57610b1a6124ba565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610bab5760405162461bcd60e51b81526004016102fa90612765565b5f600382516005811115610bc157610bc16124ba565b1480610bdf5750600282516005811115610bdd57610bdd6124ba565b145b15610c0257506020808201515f9081526007870190915260408120556004610c06565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610c3757610c376124ba565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610d8757610d478160016127c5565b610d529060086127de565b5081515f90839083908110610d6957610d696127f5565b60200101906001600160f81b03191690815f1a905350600101610d33565b505f5b6004811015610dea57610d9e8160036127c5565b610da99060086127de565b6001901c60f81b82610dbc836002612809565b81518110610dcc57610dcc6127f5565b60200101906001600160f81b03191690815f1a905350600101610d8a565b505f5b6020811015610e4c57610e0181601f6127c5565b610e0c9060086127de565b86901c60f81b82610e1e836006612809565b81518110610e2e57610e2e6127f5565b60200101906001600160f81b03191690815f1a905350600101610ded565b505f5b6008811015610eb757610e638160076127c5565b610e6e9060086127de565b6001600160401b038616901c60f81b82610e89836026612809565b81518110610e9957610e996127f5565b60200101906001600160f81b03191690815f1a905350600101610e4f565b505f5b6008811015610f2257610ece8160076127c5565b610ed99060086127de565b6001600160401b038516901c60f81b82610ef483602e612809565b81518110610f0457610f046127f5565b60200101906001600160f81b03191690815f1a905350600101610eba565b50949350505050565b33610f5d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103b85760405163118cdaa760e01b81523360048201526024016102fa565b5f610f8f611b6f565b5f80516020612ab1833981519152426001600160401b038516118015610fc957506001600160401b038416610fc7426202a300612809565b115b61102b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102fa565b856110825760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102fa565b5f868152600782016020526040902054156110f05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102fa565b82516030146111575760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102fa565b61116085611bb9565b5f806111a76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611d5a565b5f828152600586016020526040902091935091506111c58282612860565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906111f29085906004016124f0565b6020604051808303815f875af115801561120e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112329190612522565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff191660018360058111156112ab576112ab6124ba565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061039f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612ab183398151915293929190829060ff16600581111561148d5761148d6124ba565b600581111561149e5761149e6124ba565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c09091015290915081516005811115611518576115186124ba565b146115745760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102fa565b60408101516001600160a01b0316336001600160a01b0316146115a95760405162461bcd60e51b81526004016102fa90612765565b6115b68160800151611bb9565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156115fa576115fa6124ba565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116b190859083610d0e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116e09085906004016124f0565b6020604051808303815f875af11580156116fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117209190612522565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117985760405162461bcd60e51b81526004016102fa9061291f565b5f805b60028110156117e7576117af8160016127c5565b6117ba9060086127de565b61ffff168582815181106117d0576117d06127f5565b016020015160f81c901b919091179060010161179b565b5061ffff81161561180a5760405162461bcd60e51b81526004016102fa90612968565b5f805b6004811015611865576118218160036127c5565b61182c9060086127de565b63ffffffff168661183e836002612809565b8151811061184e5761184e6127f5565b016020015160f81c901b919091179060010161180d565b5063ffffffff811660021461188c5760405162461bcd60e51b81526004016102fa906129ab565b5f805b60208110156118e1576118a381601f6127c5565b6118ae9060086127de565b876118ba836006612809565b815181106118ca576118ca6127f5565b016020015160f81c901b919091179060010161188f565b505f866026815181106118f6576118f66127f5565b016020015191976001600160f81b03199092161515965090945050505050565b61191e612125565b6119278261216e565b6119308161218f565b5050565b5f805f83516036146119585760405162461bcd60e51b81526004016102fa9061291f565b5f805b60028110156119a75761196f8160016127c5565b61197a9060086127de565b61ffff16868281518110611990576119906127f5565b016020015160f81c901b919091179060010161195b565b5061ffff8116156119ca5760405162461bcd60e51b81526004016102fa90612968565b5f805b6004811015611a25576119e18160036127c5565b6119ec9060086127de565b63ffffffff16876119fe836002612809565b81518110611a0e57611a0e6127f5565b016020015160f81c901b91909117906001016119cd565b5063ffffffff8116600114611a4c5760405162461bcd60e51b81526004016102fa906129ab565b5f805b6020811015611aa157611a6381601f6127c5565b611a6e9060086127de565b88611a7a836006612809565b81518110611a8a57611a8a6127f5565b016020015160f81c901b9190911790600101611a4f565b505f805b6008811015611b0057611ab98160076127c5565b611ac49060086127de565b6001600160401b031689611ad9836026612809565b81518110611ae957611ae96127f5565b016020015160f81c901b9190911790600101611aa5565b505f805b6008811015611b5f57611b188160076127c5565b611b239060086127de565b6001600160401b03168a611b3883602e612809565b81518110611b4857611b486127f5565b016020015160f81c901b9190911790600101611b04565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611bb357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612ab18339815191529060ff165f03611bf7575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611c3f90836127c5565b10611c5b576001600160401b0384166040830152808252611c7a565b8382604001818151611c6d91906129f2565b6001600160401b03169052505b5f826020015183604001516064611c919190612a19565b611c9b9190612a44565b600285015490915060ff9081169082161115611d165760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102fa565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611dc45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102fa565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e3b57611dfb8160016127c5565b611e069060086127de565b5081515f90839083908110611e1d57611e1d6127f5565b60200101906001600160f81b03191690815f1a905350600101611de7565b505f5b6004811015611e9957611e528160036127c5565b611e5d9060086127de565b505f82611e6b836002612809565b81518110611e7b57611e7b6127f5565b60200101906001600160f81b03191690815f1a905350600101611e3e565b505f5b6020811015611ef65784518160208110611eb857611eb86127f5565b1a60f81b82611ec8836006612809565b81518110611ed857611ed86127f5565b60200101906001600160f81b03191690815f1a905350600101611e9c565b505f5b6020811015611f565784602001518160208110611f1857611f186127f5565b1a60f81b82611f28836026612809565b81518110611f3857611f386127f5565b60200101906001600160f81b03191690815f1a905350600101611ef9565b505f5b6008811015611fca57611f6d8160076127c5565b611f789060086127de565b60ff1685604001516001600160401b0316901c60f81b82826046611f9c9190612809565b81518110611fac57611fac6127f5565b60200101906001600160f81b03191690815f1a905350600101611f59565b505f5b60308110156120355784608001518181518110611fec57611fec6127f5565b01602001516001600160f81b0319168261200783604e612809565b81518110612017576120176127f5565b60200101906001600160f81b03191690815f1a905350600101611fcd565b505f5b60088110156120a75761204c8160076127c5565b6120579060086127de565b60608601516001600160401b0390811691161c60f81b8261207983607e612809565b81518110612089576120896127f5565b60200101906001600160f81b03191690815f1a905350600101612038565b506002816040516120b89190612a75565b602060405180830381855afa1580156120d3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906120f69190612522565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103b857604051631afcd79f60e31b815260040160405180910390fd5b612176612125565b61217e6121a0565b6121866121b0565b6103c3816121b8565b612197612125565b6103c381612224565b6121a8612125565b6103b861222c565b6103b8612125565b6121c0612125565b80355f80516020612ab183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561220a6060830160408401612a90565b600291909101805460ff191660ff90921691909117905550565b610909612125565b6120ff612125565b5080546122409061265c565b5f825580601f1061224f575050565b601f0160209004905f5260205f20908101906103c391905b8082111561227a575f8155600101612267565b5090565b5f6020828403121561228e575f80fd5b5035919050565b80356001600160401b03811681146122ab575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156122e6576122e66122b0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612314576123146122b0565b604052919050565b5f6001600160401b03821115612334576123346122b0565b50601f01601f191660200190565b5f805f8060808587031215612355575f80fd5b61235e85612295565b93506020850135925061237360408601612295565b915060608501356001600160401b0381111561238d575f80fd5b8501601f8101871361239d575f80fd5b80356123b06123ab8261231c565b6122ec565b8181528860208385010111156123c4575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146122ab575f80fd5b5f60208284031215612408575f80fd5b612411826123e5565b9392505050565b6001600160a01b03811681146103c3575f80fd5b5f80828403608081121561243e575f80fd5b606081121561244b575f80fd5b50829150606083013561245d81612418565b809150509250929050565b5f60208284031215612478575f80fd5b813561241181612418565b80151581146103c3575f80fd5b5f80604083850312156124a1575f80fd5b6124aa836123e5565b9150602083013561245d81612483565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156124e85781810151838201526020016124d0565b50505f910152565b602081525f825180602084015261250e8160408501602087016124ce565b601f01601f19169190910160400192915050565b5f60208284031215612532575f80fd5b5051919050565b80516122ab81612483565b5f8060408385031215612555575f80fd5b82516001600160401b038082111561256b575f80fd5b908401906060828703121561257e575f80fd5b6125866122c4565b8251815260208084015161259981612418565b828201526040840151838111156125ae575f80fd5b80850194505087601f8501126125c2575f80fd5b835192506125d26123ab8461231c565b83815288828587010111156125e5575f80fd5b6125f4848383018488016124ce565b80604084015250819550612609818801612539565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061267057607f821691505b60208210810361268e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546126ed8161265c565b806020870152604060018084165f811461270e576001811461272a57612757565b60ff19851660408a0152604084151560051b8a01019550612757565b895f5260205f205f5b8581101561274e5781548b8201860152908301908801612733565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b818103818111156127d8576127d86127b1565b92915050565b80820281158282048414176127d8576127d86127b1565b634e487b7160e01b5f52603260045260245ffd5b808201808211156127d8576127d86127b1565b601f8211156107ee57805f5260205f20601f840160051c810160208510156128415750805b601f840160051c820191505b81811015610380575f815560010161284d565b81516001600160401b03811115612879576128796122b0565b61288d81612887845461265c565b8461281c565b602080601f8311600181146128c0575f84156128a95750858301515b5f19600386901b1c1916600185901b178555612917565b5f85815260208120601f198616915b828110156128ee578886015182559484019460019091019084016128cf565b508582101561290b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612a1257612a126127b1565b5092915050565b6001600160401b03818116838216028082169190828114612a3c57612a3c6127b1565b505092915050565b5f6001600160401b0380841680612a6957634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a868184602087016124ce565b9190910192915050565b5f60208284031215612aa0575f80fd5b813560ff81168114612411575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -1274,13 +1274,12 @@ type PoAValidatorManagerValidatorRemovalInitialized struct { SetWeightMessageID [32]byte Weight *big.Int EndTime *big.Int - Uptime uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*PoAValidatorManagerValidatorRemovalInitializedIterator, error) { var validationIDRule []interface{} @@ -1299,9 +1298,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorRemovalI return &PoAValidatorManagerValidatorRemovalInitializedIterator{contract: _PoAValidatorManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} @@ -1345,9 +1344,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorRemovalIn }), nil } -// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5. +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. // -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime, uint64 uptime) +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*PoAValidatorManagerValidatorRemovalInitialized, error) { event := new(PoAValidatorManagerValidatorRemovalInitialized) if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 519e44dce..87194c553 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -265,8 +265,8 @@ abstract contract ValidatorManager is /** * @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 + * 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 * ended by calling {initializeEndValidation} or for validation periods that never began on the P-Chain due to the * {registrationExpiry} being reached. * @param setWeightMessageType Whether or not the message type is a SetValidatorWeight message, or a diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index e36762567..5b7c4e5c1 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -14,31 +14,11 @@ import { import {ValidatorMessages} from "../ValidatorMessages.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { - event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); - uint64 public constant DEFAULT_UPTIME = uint64(100); PoSValidatorManager public posValidatorManager; - function testValueToWeight() public view { - uint64 w1 = posValidatorManager.valueToWeight(1e12); - uint64 w2 = posValidatorManager.valueToWeight(1e18); - uint64 w3 = posValidatorManager.valueToWeight(1e27); - - assertEq(w1, 1); - assertEq(w2, 1e6); - assertEq(w3, 1e15); - } - - function testWeightToValue() public view { - uint256 v1 = posValidatorManager.weightToValue(1); - uint256 v2 = posValidatorManager.weightToValue(1e6); - uint256 v3 = posValidatorManager.weightToValue(1e15); - - assertEq(v1, 1e12); - assertEq(v2, 1e18); - assertEq(v3, 1e27); - } + event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); function testInitializeEndValidationWithUptimeProof() public { // TODO: implement @@ -166,6 +146,26 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.initializeEndValidation(validationID, true, 0); } + function testValueToWeight() public view { + uint64 w1 = posValidatorManager.valueToWeight(1e12); + uint64 w2 = posValidatorManager.valueToWeight(1e18); + uint64 w3 = posValidatorManager.valueToWeight(1e27); + + assertEq(w1, 1); + assertEq(w2, 1e6); + assertEq(w3, 1e15); + } + + function testWeightToValue() public view { + uint256 v1 = posValidatorManager.weightToValue(1); + uint256 v2 = posValidatorManager.weightToValue(1e6); + uint256 v3 = posValidatorManager.weightToValue(1e15); + + assertEq(v1, 1e12); + assertEq(v2, 1e18); + assertEq(v3, 1e27); + } + function _initializeEndValidation(bytes32 validationID) internal virtual override { return posValidatorManager.initializeEndValidation(validationID, false, 0); } From ba707e6213e88d91ed513f9abbec5745e9a1d2ee Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 23 Aug 2024 10:34:37 -0400 Subject: [PATCH 120/545] initial poc of migration --- abi-bindings/go/ProxyAdmin/ProxyAdmin.go | 481 +++++++++++++++++ .../TransparentUpgradeableProxy.go | 503 ++++++++++++++++++ .../ERC20TokenStakingManager.go | 35 +- .../NativeTokenStakingManager.go | 35 +- .../PoAValidatorManager.go | 35 +- .../TeleporterMessenger.go | 4 +- .../tests/TestMessenger/TestMessenger.go | 4 +- .../staking/ERC20TokenStakingManager.sol | 2 +- .../staking/NativeTokenStakingManager.sol | 2 +- contracts/staking/ValidatorManager.sol | 5 + lib/openzeppelin-contracts | 2 +- lib/openzeppelin-contracts-upgradeable | 2 +- scripts/abi_bindings.sh | 52 +- tests/flows/staking/native_token_staking.go | 95 +--- tests/flows/staking/poa_to_pos.go | 199 +++++++ tests/flows/staking/poa_validator_manager.go | 96 +--- tests/local/e2e_test.go | 5 + tests/utils/proxy.go | 49 ++ tests/utils/staking.go | 247 +++++++++ 19 files changed, 1654 insertions(+), 199 deletions(-) create mode 100644 abi-bindings/go/ProxyAdmin/ProxyAdmin.go create mode 100644 abi-bindings/go/TransparentUpgradeableProxy/TransparentUpgradeableProxy.go create mode 100644 tests/flows/staking/poa_to_pos.go create mode 100644 tests/utils/proxy.go diff --git a/abi-bindings/go/ProxyAdmin/ProxyAdmin.go b/abi-bindings/go/ProxyAdmin/ProxyAdmin.go new file mode 100644 index 000000000..02989d202 --- /dev/null +++ b/abi-bindings/go/ProxyAdmin/ProxyAdmin.go @@ -0,0 +1,481 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package proxyadmin + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// ProxyAdminMetaData contains all meta data concerning the ProxyAdmin contract. +var ProxyAdminMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeAndCall\",\"inputs\":[{\"name\":\"proxy\",\"type\":\"address\",\"internalType\":\"contractITransparentUpgradeableProxy\"},{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516104d33803806104d383398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b6103de806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea164736f6c6343000819000a", +} + +// ProxyAdminABI is the input ABI used to generate the binding from. +// Deprecated: Use ProxyAdminMetaData.ABI instead. +var ProxyAdminABI = ProxyAdminMetaData.ABI + +// ProxyAdminBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ProxyAdminMetaData.Bin instead. +var ProxyAdminBin = ProxyAdminMetaData.Bin + +// DeployProxyAdmin deploys a new Ethereum contract, binding an instance of ProxyAdmin to it. +func DeployProxyAdmin(auth *bind.TransactOpts, backend bind.ContractBackend, initialOwner common.Address) (common.Address, *types.Transaction, *ProxyAdmin, error) { + parsed, err := ProxyAdminMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ProxyAdminBin), backend, initialOwner) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ProxyAdmin{ProxyAdminCaller: ProxyAdminCaller{contract: contract}, ProxyAdminTransactor: ProxyAdminTransactor{contract: contract}, ProxyAdminFilterer: ProxyAdminFilterer{contract: contract}}, nil +} + +// ProxyAdmin is an auto generated Go binding around an Ethereum contract. +type ProxyAdmin struct { + ProxyAdminCaller // Read-only binding to the contract + ProxyAdminTransactor // Write-only binding to the contract + ProxyAdminFilterer // Log filterer for contract events +} + +// ProxyAdminCaller is an auto generated read-only Go binding around an Ethereum contract. +type ProxyAdminCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ProxyAdminTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ProxyAdminTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ProxyAdminFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ProxyAdminFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ProxyAdminSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ProxyAdminSession struct { + Contract *ProxyAdmin // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ProxyAdminCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ProxyAdminCallerSession struct { + Contract *ProxyAdminCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ProxyAdminTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ProxyAdminTransactorSession struct { + Contract *ProxyAdminTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ProxyAdminRaw is an auto generated low-level Go binding around an Ethereum contract. +type ProxyAdminRaw struct { + Contract *ProxyAdmin // Generic contract binding to access the raw methods on +} + +// ProxyAdminCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ProxyAdminCallerRaw struct { + Contract *ProxyAdminCaller // Generic read-only contract binding to access the raw methods on +} + +// ProxyAdminTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ProxyAdminTransactorRaw struct { + Contract *ProxyAdminTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewProxyAdmin creates a new instance of ProxyAdmin, bound to a specific deployed contract. +func NewProxyAdmin(address common.Address, backend bind.ContractBackend) (*ProxyAdmin, error) { + contract, err := bindProxyAdmin(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ProxyAdmin{ProxyAdminCaller: ProxyAdminCaller{contract: contract}, ProxyAdminTransactor: ProxyAdminTransactor{contract: contract}, ProxyAdminFilterer: ProxyAdminFilterer{contract: contract}}, nil +} + +// NewProxyAdminCaller creates a new read-only instance of ProxyAdmin, bound to a specific deployed contract. +func NewProxyAdminCaller(address common.Address, caller bind.ContractCaller) (*ProxyAdminCaller, error) { + contract, err := bindProxyAdmin(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ProxyAdminCaller{contract: contract}, nil +} + +// NewProxyAdminTransactor creates a new write-only instance of ProxyAdmin, bound to a specific deployed contract. +func NewProxyAdminTransactor(address common.Address, transactor bind.ContractTransactor) (*ProxyAdminTransactor, error) { + contract, err := bindProxyAdmin(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ProxyAdminTransactor{contract: contract}, nil +} + +// NewProxyAdminFilterer creates a new log filterer instance of ProxyAdmin, bound to a specific deployed contract. +func NewProxyAdminFilterer(address common.Address, filterer bind.ContractFilterer) (*ProxyAdminFilterer, error) { + contract, err := bindProxyAdmin(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ProxyAdminFilterer{contract: contract}, nil +} + +// bindProxyAdmin binds a generic wrapper to an already deployed contract. +func bindProxyAdmin(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ProxyAdminMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ProxyAdmin *ProxyAdminRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ProxyAdmin.Contract.ProxyAdminCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ProxyAdmin *ProxyAdminRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ProxyAdmin.Contract.ProxyAdminTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ProxyAdmin *ProxyAdminRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ProxyAdmin.Contract.ProxyAdminTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ProxyAdmin *ProxyAdminCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ProxyAdmin.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ProxyAdmin *ProxyAdminTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ProxyAdmin.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ProxyAdmin *ProxyAdminTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ProxyAdmin.Contract.contract.Transact(opts, method, params...) +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_ProxyAdmin *ProxyAdminCaller) UPGRADEINTERFACEVERSION(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _ProxyAdmin.contract.Call(opts, &out, "UPGRADE_INTERFACE_VERSION") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_ProxyAdmin *ProxyAdminSession) UPGRADEINTERFACEVERSION() (string, error) { + return _ProxyAdmin.Contract.UPGRADEINTERFACEVERSION(&_ProxyAdmin.CallOpts) +} + +// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc. +// +// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string) +func (_ProxyAdmin *ProxyAdminCallerSession) UPGRADEINTERFACEVERSION() (string, error) { + return _ProxyAdmin.Contract.UPGRADEINTERFACEVERSION(&_ProxyAdmin.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ProxyAdmin *ProxyAdminCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ProxyAdmin.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ProxyAdmin *ProxyAdminSession) Owner() (common.Address, error) { + return _ProxyAdmin.Contract.Owner(&_ProxyAdmin.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_ProxyAdmin *ProxyAdminCallerSession) Owner() (common.Address, error) { + return _ProxyAdmin.Contract.Owner(&_ProxyAdmin.CallOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ProxyAdmin *ProxyAdminTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ProxyAdmin.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ProxyAdmin *ProxyAdminSession) RenounceOwnership() (*types.Transaction, error) { + return _ProxyAdmin.Contract.RenounceOwnership(&_ProxyAdmin.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_ProxyAdmin *ProxyAdminTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _ProxyAdmin.Contract.RenounceOwnership(&_ProxyAdmin.TransactOpts) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ProxyAdmin *ProxyAdminTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _ProxyAdmin.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ProxyAdmin *ProxyAdminSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _ProxyAdmin.Contract.TransferOwnership(&_ProxyAdmin.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_ProxyAdmin *ProxyAdminTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _ProxyAdmin.Contract.TransferOwnership(&_ProxyAdmin.TransactOpts, newOwner) +} + +// UpgradeAndCall is a paid mutator transaction binding the contract method 0x9623609d. +// +// Solidity: function upgradeAndCall(address proxy, address implementation, bytes data) payable returns() +func (_ProxyAdmin *ProxyAdminTransactor) UpgradeAndCall(opts *bind.TransactOpts, proxy common.Address, implementation common.Address, data []byte) (*types.Transaction, error) { + return _ProxyAdmin.contract.Transact(opts, "upgradeAndCall", proxy, implementation, data) +} + +// UpgradeAndCall is a paid mutator transaction binding the contract method 0x9623609d. +// +// Solidity: function upgradeAndCall(address proxy, address implementation, bytes data) payable returns() +func (_ProxyAdmin *ProxyAdminSession) UpgradeAndCall(proxy common.Address, implementation common.Address, data []byte) (*types.Transaction, error) { + return _ProxyAdmin.Contract.UpgradeAndCall(&_ProxyAdmin.TransactOpts, proxy, implementation, data) +} + +// UpgradeAndCall is a paid mutator transaction binding the contract method 0x9623609d. +// +// Solidity: function upgradeAndCall(address proxy, address implementation, bytes data) payable returns() +func (_ProxyAdmin *ProxyAdminTransactorSession) UpgradeAndCall(proxy common.Address, implementation common.Address, data []byte) (*types.Transaction, error) { + return _ProxyAdmin.Contract.UpgradeAndCall(&_ProxyAdmin.TransactOpts, proxy, implementation, data) +} + +// ProxyAdminOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the ProxyAdmin contract. +type ProxyAdminOwnershipTransferredIterator struct { + Event *ProxyAdminOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ProxyAdminOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ProxyAdminOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ProxyAdminOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ProxyAdminOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ProxyAdminOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ProxyAdminOwnershipTransferred represents a OwnershipTransferred event raised by the ProxyAdmin contract. +type ProxyAdminOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ProxyAdmin *ProxyAdminFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*ProxyAdminOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ProxyAdmin.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &ProxyAdminOwnershipTransferredIterator{contract: _ProxyAdmin.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ProxyAdmin *ProxyAdminFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ProxyAdminOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _ProxyAdmin.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ProxyAdminOwnershipTransferred) + if err := _ProxyAdmin.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_ProxyAdmin *ProxyAdminFilterer) ParseOwnershipTransferred(log types.Log) (*ProxyAdminOwnershipTransferred, error) { + event := new(ProxyAdminOwnershipTransferred) + if err := _ProxyAdmin.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/abi-bindings/go/TransparentUpgradeableProxy/TransparentUpgradeableProxy.go b/abi-bindings/go/TransparentUpgradeableProxy/TransparentUpgradeableProxy.go new file mode 100644 index 000000000..a054267e5 --- /dev/null +++ b/abi-bindings/go/TransparentUpgradeableProxy/TransparentUpgradeableProxy.go @@ -0,0 +1,503 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package transparentupgradeableproxy + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// TransparentUpgradeableProxyMetaData contains all meta data concerning the TransparentUpgradeableProxy contract. +var TransparentUpgradeableProxyMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"_logic\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialOwner\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"_data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"stateMutability\":\"payable\"},{\"type\":\"fallback\",\"stateMutability\":\"payable\"},{\"type\":\"event\",\"name\":\"AdminChanged\",\"inputs\":[{\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"},{\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidAdmin\",\"inputs\":[{\"name\":\"admin\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ProxyDeniedAdminAccess\",\"inputs\":[]}]", + Bin: "0x60a0604052604051610dbb380380610dbb8339810160408190526100229161038c565b828161002e828261008c565b50508160405161003d9061032e565b6001600160a01b039091168152602001604051809103905ff080158015610066573d5f803e3d5ffd5b506001600160a01b031660805261008461007f60805190565b6100ea565b505050610471565b61009582610157565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156100de576100d982826101d5565b505050565b6100e6610248565b5050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6101295f80516020610d9b833981519152546001600160a01b031690565b604080516001600160a01b03928316815291841660208301520160405180910390a161015481610269565b50565b806001600160a01b03163b5f0361019157604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5b80546001600160a01b0319166001600160a01b039290921691909117905550565b60605f80846001600160a01b0316846040516101f19190610456565b5f60405180830381855af49150503d805f8114610229576040519150601f19603f3d011682016040523d82523d5f602084013e61022e565b606091505b50909250905061023f8583836102a6565b95945050505050565b34156102675760405163b398979f60e01b815260040160405180910390fd5b565b6001600160a01b03811661029257604051633173bdd160e11b81525f6004820152602401610188565b805f80516020610d9b8339815191526101b4565b6060826102bb576102b682610305565b6102fe565b81511580156102d257506001600160a01b0384163b155b156102fb57604051639996b31560e01b81526001600160a01b0385166004820152602401610188565b50805b9392505050565b8051156103155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6104d3806108c883390190565b80516001600160a01b0381168114610351575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5b8381101561038457818101518382015260200161036c565b50505f910152565b5f805f6060848603121561039e575f80fd5b6103a78461033b565b92506103b56020850161033b565b60408501519092506001600160401b03808211156103d1575f80fd5b818601915086601f8301126103e4575f80fd5b8151818111156103f6576103f6610356565b604051601f8201601f19908116603f0116810190838211818310171561041e5761041e610356565b81604052828152896020848701011115610436575f80fd5b61044783602083016020880161036a565b80955050505050509250925092565b5f825161046781846020870161036a565b9190910192915050565b6080516104406104885f395f601001526104405ff3fe608060405261000c61000e565b005b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316330361007a575f356001600160e01b03191663278f794360e11b14610070576040516334ad5dbb60e21b815260040160405180910390fd5b610078610082565b565b6100786100b0565b5f806100913660048184610303565b81019061009e919061033e565b915091506100ac82826100c0565b5050565b6100786100bb61011a565b610151565b6100c98261016f565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a28051156101125761010d82826101ea565b505050565b6100ac61025c565b5f61014c7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b365f80375f80365f845af43d5f803e80801561016b573d5ff35b3d5ffd5b806001600160a01b03163b5f036101a957604051634c9c8ce360e01b81526001600160a01b03821660048201526024015b60405180910390fd5b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516102069190610407565b5f60405180830381855af49150503d805f811461023e576040519150601f19603f3d011682016040523d82523d5f602084013e610243565b606091505b509150915061025385838361027b565b95945050505050565b34156100785760405163b398979f60e01b815260040160405180910390fd5b6060826102905761028b826102da565b6102d3565b81511580156102a757506001600160a01b0384163b155b156102d057604051639996b31560e01b81526001600160a01b03851660048201526024016101a0565b50805b9392505050565b8051156102ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5f8085851115610311575f80fd5b8386111561031d575f80fd5b5050820193919092039150565b634e487b7160e01b5f52604160045260245ffd5b5f806040838503121561034f575f80fd5b82356001600160a01b0381168114610365575f80fd5b9150602083013567ffffffffffffffff80821115610381575f80fd5b818501915085601f830112610394575f80fd5b8135818111156103a6576103a661032a565b604051601f8201601f19908116603f011681019083821181831017156103ce576103ce61032a565b816040528281528860208487010111156103e6575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f82515f5b81811015610426576020818601810151858301520161040c565b505f92019182525091905056fea164736f6c6343000819000a608060405234801561000f575f80fd5b506040516104d33803806104d383398101604081905261002e916100bb565b806001600160a01b03811661005c57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100658161006c565b50506100e8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156100cb575f80fd5b81516001600160a01b03811681146100e1575f80fd5b9392505050565b6103de806100f55f395ff3fe608060405260043610610049575f3560e01c8063715018a61461004d5780638da5cb5b146100635780639623609d1461008e578063ad3cb1cc146100a1578063f2fde38b146100de575b5f80fd5b348015610058575f80fd5b506100616100fd565b005b34801561006e575f80fd5b505f546040516001600160a01b0390911681526020015b60405180910390f35b61006161009c366004610260565b610110565b3480156100ac575f80fd5b506100d1604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516100859190610372565b3480156100e9575f80fd5b506100616100f836600461038b565b61017b565b6101056101bd565b61010e5f6101e9565b565b6101186101bd565b60405163278f794360e11b81526001600160a01b03841690634f1ef28690349061014890869086906004016103a6565b5f604051808303818588803b15801561015f575f80fd5b505af1158015610171573d5f803e3d5ffd5b5050505050505050565b6101836101bd565b6001600160a01b0381166101b157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b6101ba816101e9565b50565b5f546001600160a01b0316331461010e5760405163118cdaa760e01b81523360048201526024016101a8565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146101ba575f80fd5b634e487b7160e01b5f52604160045260245ffd5b5f805f60608486031215610272575f80fd5b833561027d81610238565b9250602084013561028d81610238565b9150604084013567ffffffffffffffff808211156102a9575f80fd5b818601915086601f8301126102bc575f80fd5b8135818111156102ce576102ce61024c565b604051601f8201601f19908116603f011681019083821181831017156102f6576102f661024c565b8160405282815289602084870101111561030e575f80fd5b826020860160208301375f6020848301015280955050505050509250925092565b5f81518084525f5b8181101561035357602081850181015186830182015201610337565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f610384602083018461032f565b9392505050565b5f6020828403121561039b575f80fd5b813561038481610238565b6001600160a01b03831681526040602082018190525f906103c99083018461032f565b94935050505056fea164736f6c6343000819000ab53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", +} + +// TransparentUpgradeableProxyABI is the input ABI used to generate the binding from. +// Deprecated: Use TransparentUpgradeableProxyMetaData.ABI instead. +var TransparentUpgradeableProxyABI = TransparentUpgradeableProxyMetaData.ABI + +// TransparentUpgradeableProxyBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use TransparentUpgradeableProxyMetaData.Bin instead. +var TransparentUpgradeableProxyBin = TransparentUpgradeableProxyMetaData.Bin + +// DeployTransparentUpgradeableProxy deploys a new Ethereum contract, binding an instance of TransparentUpgradeableProxy to it. +func DeployTransparentUpgradeableProxy(auth *bind.TransactOpts, backend bind.ContractBackend, _logic common.Address, initialOwner common.Address, _data []byte) (common.Address, *types.Transaction, *TransparentUpgradeableProxy, error) { + parsed, err := TransparentUpgradeableProxyMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(TransparentUpgradeableProxyBin), backend, _logic, initialOwner, _data) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &TransparentUpgradeableProxy{TransparentUpgradeableProxyCaller: TransparentUpgradeableProxyCaller{contract: contract}, TransparentUpgradeableProxyTransactor: TransparentUpgradeableProxyTransactor{contract: contract}, TransparentUpgradeableProxyFilterer: TransparentUpgradeableProxyFilterer{contract: contract}}, nil +} + +// TransparentUpgradeableProxy is an auto generated Go binding around an Ethereum contract. +type TransparentUpgradeableProxy struct { + TransparentUpgradeableProxyCaller // Read-only binding to the contract + TransparentUpgradeableProxyTransactor // Write-only binding to the contract + TransparentUpgradeableProxyFilterer // Log filterer for contract events +} + +// TransparentUpgradeableProxyCaller is an auto generated read-only Go binding around an Ethereum contract. +type TransparentUpgradeableProxyCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// TransparentUpgradeableProxyTransactor is an auto generated write-only Go binding around an Ethereum contract. +type TransparentUpgradeableProxyTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// TransparentUpgradeableProxyFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type TransparentUpgradeableProxyFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// TransparentUpgradeableProxySession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type TransparentUpgradeableProxySession struct { + Contract *TransparentUpgradeableProxy // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// TransparentUpgradeableProxyCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type TransparentUpgradeableProxyCallerSession struct { + Contract *TransparentUpgradeableProxyCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// TransparentUpgradeableProxyTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type TransparentUpgradeableProxyTransactorSession struct { + Contract *TransparentUpgradeableProxyTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// TransparentUpgradeableProxyRaw is an auto generated low-level Go binding around an Ethereum contract. +type TransparentUpgradeableProxyRaw struct { + Contract *TransparentUpgradeableProxy // Generic contract binding to access the raw methods on +} + +// TransparentUpgradeableProxyCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type TransparentUpgradeableProxyCallerRaw struct { + Contract *TransparentUpgradeableProxyCaller // Generic read-only contract binding to access the raw methods on +} + +// TransparentUpgradeableProxyTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type TransparentUpgradeableProxyTransactorRaw struct { + Contract *TransparentUpgradeableProxyTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewTransparentUpgradeableProxy creates a new instance of TransparentUpgradeableProxy, bound to a specific deployed contract. +func NewTransparentUpgradeableProxy(address common.Address, backend bind.ContractBackend) (*TransparentUpgradeableProxy, error) { + contract, err := bindTransparentUpgradeableProxy(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &TransparentUpgradeableProxy{TransparentUpgradeableProxyCaller: TransparentUpgradeableProxyCaller{contract: contract}, TransparentUpgradeableProxyTransactor: TransparentUpgradeableProxyTransactor{contract: contract}, TransparentUpgradeableProxyFilterer: TransparentUpgradeableProxyFilterer{contract: contract}}, nil +} + +// NewTransparentUpgradeableProxyCaller creates a new read-only instance of TransparentUpgradeableProxy, bound to a specific deployed contract. +func NewTransparentUpgradeableProxyCaller(address common.Address, caller bind.ContractCaller) (*TransparentUpgradeableProxyCaller, error) { + contract, err := bindTransparentUpgradeableProxy(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &TransparentUpgradeableProxyCaller{contract: contract}, nil +} + +// NewTransparentUpgradeableProxyTransactor creates a new write-only instance of TransparentUpgradeableProxy, bound to a specific deployed contract. +func NewTransparentUpgradeableProxyTransactor(address common.Address, transactor bind.ContractTransactor) (*TransparentUpgradeableProxyTransactor, error) { + contract, err := bindTransparentUpgradeableProxy(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &TransparentUpgradeableProxyTransactor{contract: contract}, nil +} + +// NewTransparentUpgradeableProxyFilterer creates a new log filterer instance of TransparentUpgradeableProxy, bound to a specific deployed contract. +func NewTransparentUpgradeableProxyFilterer(address common.Address, filterer bind.ContractFilterer) (*TransparentUpgradeableProxyFilterer, error) { + contract, err := bindTransparentUpgradeableProxy(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &TransparentUpgradeableProxyFilterer{contract: contract}, nil +} + +// bindTransparentUpgradeableProxy binds a generic wrapper to an already deployed contract. +func bindTransparentUpgradeableProxy(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := TransparentUpgradeableProxyMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _TransparentUpgradeableProxy.Contract.TransparentUpgradeableProxyCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TransparentUpgradeableProxy.Contract.TransparentUpgradeableProxyTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _TransparentUpgradeableProxy.Contract.TransparentUpgradeableProxyTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _TransparentUpgradeableProxy.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _TransparentUpgradeableProxy.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _TransparentUpgradeableProxy.Contract.contract.Transact(opts, method, params...) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _TransparentUpgradeableProxy.contract.RawTransact(opts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxySession) Fallback(calldata []byte) (*types.Transaction, error) { + return _TransparentUpgradeableProxy.Contract.Fallback(&_TransparentUpgradeableProxy.TransactOpts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _TransparentUpgradeableProxy.Contract.Fallback(&_TransparentUpgradeableProxy.TransactOpts, calldata) +} + +// TransparentUpgradeableProxyAdminChangedIterator is returned from FilterAdminChanged and is used to iterate over the raw logs and unpacked data for AdminChanged events raised by the TransparentUpgradeableProxy contract. +type TransparentUpgradeableProxyAdminChangedIterator struct { + Event *TransparentUpgradeableProxyAdminChanged // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TransparentUpgradeableProxyAdminChangedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TransparentUpgradeableProxyAdminChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TransparentUpgradeableProxyAdminChanged) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TransparentUpgradeableProxyAdminChangedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TransparentUpgradeableProxyAdminChangedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TransparentUpgradeableProxyAdminChanged represents a AdminChanged event raised by the TransparentUpgradeableProxy contract. +type TransparentUpgradeableProxyAdminChanged struct { + PreviousAdmin common.Address + NewAdmin common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAdminChanged is a free log retrieval operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyFilterer) FilterAdminChanged(opts *bind.FilterOpts) (*TransparentUpgradeableProxyAdminChangedIterator, error) { + + logs, sub, err := _TransparentUpgradeableProxy.contract.FilterLogs(opts, "AdminChanged") + if err != nil { + return nil, err + } + return &TransparentUpgradeableProxyAdminChangedIterator{contract: _TransparentUpgradeableProxy.contract, event: "AdminChanged", logs: logs, sub: sub}, nil +} + +// WatchAdminChanged is a free log subscription operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyFilterer) WatchAdminChanged(opts *bind.WatchOpts, sink chan<- *TransparentUpgradeableProxyAdminChanged) (event.Subscription, error) { + + logs, sub, err := _TransparentUpgradeableProxy.contract.WatchLogs(opts, "AdminChanged") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TransparentUpgradeableProxyAdminChanged) + if err := _TransparentUpgradeableProxy.contract.UnpackLog(event, "AdminChanged", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAdminChanged is a log parse operation binding the contract event 0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f. +// +// Solidity: event AdminChanged(address previousAdmin, address newAdmin) +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyFilterer) ParseAdminChanged(log types.Log) (*TransparentUpgradeableProxyAdminChanged, error) { + event := new(TransparentUpgradeableProxyAdminChanged) + if err := _TransparentUpgradeableProxy.contract.UnpackLog(event, "AdminChanged", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// TransparentUpgradeableProxyUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the TransparentUpgradeableProxy contract. +type TransparentUpgradeableProxyUpgradedIterator struct { + Event *TransparentUpgradeableProxyUpgraded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *TransparentUpgradeableProxyUpgradedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(TransparentUpgradeableProxyUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(TransparentUpgradeableProxyUpgraded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *TransparentUpgradeableProxyUpgradedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *TransparentUpgradeableProxyUpgradedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// TransparentUpgradeableProxyUpgraded represents a Upgraded event raised by the TransparentUpgradeableProxy contract. +type TransparentUpgradeableProxyUpgraded struct { + Implementation common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*TransparentUpgradeableProxyUpgradedIterator, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _TransparentUpgradeableProxy.contract.FilterLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return &TransparentUpgradeableProxyUpgradedIterator{contract: _TransparentUpgradeableProxy.contract, event: "Upgraded", logs: logs, sub: sub}, nil +} + +// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *TransparentUpgradeableProxyUpgraded, implementation []common.Address) (event.Subscription, error) { + + var implementationRule []interface{} + for _, implementationItem := range implementation { + implementationRule = append(implementationRule, implementationItem) + } + + logs, sub, err := _TransparentUpgradeableProxy.contract.WatchLogs(opts, "Upgraded", implementationRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(TransparentUpgradeableProxyUpgraded) + if err := _TransparentUpgradeableProxy.contract.UnpackLog(event, "Upgraded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b. +// +// Solidity: event Upgraded(address indexed implementation) +func (_TransparentUpgradeableProxy *TransparentUpgradeableProxyFilterer) ParseUpgraded(log types.Log) (*TransparentUpgradeableProxyUpgraded, error) { + event := new(TransparentUpgradeableProxyUpgraded) + if err := _TransparentUpgradeableProxy.contract.UnpackLog(event, "Upgraded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 39dc6ae44..65cd769c2 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516135a43803806135a483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6134578061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c757806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612b95565b61019d565b005b6100b26100c2366004612bc0565b610395565b6100da6100d5366004612b95565b6104a3565b6040516001600160401b0390911681526020015b60405180910390f35b61010a610105366004612c18565b6104b9565b6040519081526020016100ee565b6100b2610126366004612c58565b6104d2565b61010a610139366004612d25565b61076a565b6100b261014c366004612dc1565b61078f565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610185366004612b95565b610aa8565b6100b2610198366004612dda565b610bbc565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061342b83398151915293929190829060ff1660058111156101fe576101fe612e04565b600581111561020f5761020f612e04565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612e04565b146103105760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f610321848361010001515f610ff0565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034e908490600401612e3a565b6020604051808303815f875af115801561036a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038e9190612e6c565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103d95750825b90505f826001600160401b031660011480156103f45750303b155b905081158015610402575080155b156104205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561044a57845460ff60401b1916600160401b1785555b610454878761120d565b831561049a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6104b364e8d4a5100083612eab565b92915050565b5f6104b36001600160401b03831664e8d4a51000612ebe565b5f821561075a576040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610522573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105499190810190612ee0565b91509150806105a65760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610307565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060d9190612e6c565b82511461066c5760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610307565b60208201516001600160a01b0316156106dd5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610307565b5f806106ec846040015161122b565b915091508188146107545760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610307565b93505050505b6107648482611403565b50505050565b5f80610775866117b7565b905061078385828686611877565b9150505b949350505050565b5f5f8051602061342b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156107ea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108119190810190612ee0565b91509150806108325760405162461bcd60e51b815260040161030790612fb2565b82548251146108955760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610307565b60208201516001600160a01b0316156109085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610307565b5f806109178460400151611cfb565b91509150806109795760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610307565b5f8281526005860160205260408120805461099390612ff8565b90501180156109c5575060015f83815260068701602052604090205460ff1660058111156109c3576109c3612e04565b145b6109e15760405162461bcd60e51b815260040161030790613030565b5f82815260058601602052604081206109f991612b4b565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061342b833981519152929190610af090612ff8565b9050118015610b22575060015f83815260068301602052604090205460ff166005811115610b2057610b20612e04565b145b610b3e5760405162461bcd60e51b815260040161030790613030565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610b779190600401613077565b6020604051808303815f875af1158015610b93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb79190612e6c565b505050565b5f5f8051602061342b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c17573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c3e9190810190612ee0565b9150915080610c5f5760405162461bcd60e51b815260040161030790612fb2565b5f8415610ce3575f610c748460400151611e9c565b919350909150506001600160401b03811615610cdd5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610307565b50610d59565b5f610cf18460400151611cfb565b90925090508015610d575760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610307565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610d8b57610d8b612e04565b6005811115610d9c57610d9c612e04565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610e4d5760405162461bcd60e51b815260040161030790613101565b5f600382516005811115610e6357610e63612e04565b1480610e815750600282516005811115610e7f57610e7f612e04565b145b15610ea457506020808201515f9081526007870190915260408120556004610ea8565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610ed957610ed9612e04565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110695761102981600161314d565b611034906008612ebe565b5081515f9083908390811061104b5761104b613160565b60200101906001600160f81b03191690815f1a905350600101611015565b505f5b60048110156110cc5761108081600361314d565b61108b906008612ebe565b6001901c60f81b8261109e836002613174565b815181106110ae576110ae613160565b60200101906001600160f81b03191690815f1a90535060010161106c565b505f5b602081101561112e576110e381601f61314d565b6110ee906008612ebe565b86901c60f81b82611100836006613174565b8151811061111057611110613160565b60200101906001600160f81b03191690815f1a9053506001016110cf565b505f5b60088110156111995761114581600761314d565b611150906008612ebe565b6001600160401b038616901c60f81b8261116b836026613174565b8151811061117b5761117b613160565b60200101906001600160f81b03191690815f1a905350600101611131565b505f5b6008811015611204576111b081600761314d565b6111bb906008612ebe565b6001600160401b038516901c60f81b826111d683602e613174565b815181106111e6576111e6613160565b60200101906001600160f81b03191690815f1a90535060010161119c565b50949350505050565b6112156120d7565b61121e82612122565b61122781612168565b5050565b5f808251602e1461124e5760405162461bcd60e51b815260040161030790613187565b5f805b600281101561129d5761126581600161314d565b611270906008612ebe565b61ffff1685828151811061128657611286613160565b016020015160f81c901b9190911790600101611251565b5061ffff8116156112c05760405162461bcd60e51b8152600401610307906131d0565b5f805b600481101561131b576112d781600361314d565b6112e2906008612ebe565b63ffffffff16866112f4836002613174565b8151811061130457611304613160565b016020015160f81c901b91909117906001016112c3565b5063ffffffff81166004146113425760405162461bcd60e51b815260040161030790613213565b5f805b60208110156113975761135981601f61314d565b611364906008612ebe565b87611370836006613174565b8151811061138057611380613160565b016020015160f81c901b9190911790600101611345565b505f805b60088110156113f6576113af81600761314d565b6113ba906008612ebe565b6001600160401b0316886113cf836026613174565b815181106113df576113df613160565b016020015160f81c901b919091179060010161139b565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061342b83398151915293929190829060ff16600581111561146457611464612e04565b600581111561147557611475612e04565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561150f5761150f612e04565b1461156b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610307565b60c08101516001600160a01b0316336001600160a01b0316146115a05760405162461bcd60e51b815260040161030790613101565b6115ad816040015161221c565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff191660018360058111156115f9576115f9612e04565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f906116ea90869083610ff0565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611719908590600401612e3a565b6020604051808303815f875af1158015611735573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117599190612e6c565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00816117e3846123bd565b90505f6117ef826104a3565b83549091506001600160401b0382161080159061181957508260010154816001600160401b031611155b6107875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610307565b5f6118806123f3565b5f8051602061342b833981519152426001600160401b0385161180156118ba57506001600160401b0384166118b8426202a300613174565b115b61191c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610307565b856119735760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610307565b5f868152600782016020526040902054156119e15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610307565b8251603014611a485760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610307565b611a518561221c565b5f80611a986040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061243d565b5f82815260058601602052604090209193509150611ab6828261329e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ae3908590600401612e3a565b6020604051808303815f875af1158015611aff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b239190612e6c565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611ba957611ba9612e04565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061078760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611d1e5760405162461bcd60e51b815260040161030790613187565b5f805b6002811015611d6d57611d3581600161314d565b611d40906008612ebe565b61ffff16858281518110611d5657611d56613160565b016020015160f81c901b9190911790600101611d21565b5061ffff811615611d905760405162461bcd60e51b8152600401610307906131d0565b5f805b6004811015611deb57611da781600361314d565b611db2906008612ebe565b63ffffffff1686611dc4836002613174565b81518110611dd457611dd4613160565b016020015160f81c901b9190911790600101611d93565b5063ffffffff8116600214611e125760405162461bcd60e51b815260040161030790613213565b5f805b6020811015611e6757611e2981601f61314d565b611e34906008612ebe565b87611e40836006613174565b81518110611e5057611e50613160565b016020015160f81c901b9190911790600101611e15565b505f86602681518110611e7c57611e7c613160565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611ec05760405162461bcd60e51b815260040161030790613187565b5f805b6002811015611f0f57611ed781600161314d565b611ee2906008612ebe565b61ffff16868281518110611ef857611ef8613160565b016020015160f81c901b9190911790600101611ec3565b5061ffff811615611f325760405162461bcd60e51b8152600401610307906131d0565b5f805b6004811015611f8d57611f4981600361314d565b611f54906008612ebe565b63ffffffff1687611f66836002613174565b81518110611f7657611f76613160565b016020015160f81c901b9190911790600101611f35565b5063ffffffff8116600114611fb45760405162461bcd60e51b815260040161030790613213565b5f805b602081101561200957611fcb81601f61314d565b611fd6906008612ebe565b88611fe2836006613174565b81518110611ff257611ff2613160565b016020015160f81c901b9190911790600101611fb7565b505f805b60088110156120685761202181600761314d565b61202c906008612ebe565b6001600160401b031689612041836026613174565b8151811061205157612051613160565b016020015160f81c901b919091179060010161200d565b505f805b60088110156120c75761208081600761314d565b61208b906008612ebe565b6001600160401b03168a6120a083602e613174565b815181106120b0576120b0613160565b016020015160f81c901b919091179060010161206c565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661212057604051631afcd79f60e31b815260040160405180910390fd5b565b61212a6120d7565b61213381612808565b6121656060820135608083013561215060c0850160a08601612c18565b61216060e0860160c0870161335d565b612829565b50565b6121706120d7565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166121fc5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610307565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061342b8339815191529060ff165f0361225a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906122a2908361314d565b106122be576001600160401b03841660408301528082526122dd565b83826040018181516122d09190613378565b6001600160401b03169052505b5f8260200151836040015160646122f4919061339f565b6122fe91906133ca565b600285015490915060ff90811690821611156123795760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610307565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104b3827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690612897565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161243757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124a75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610307565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561251e576124de81600161314d565b6124e9906008612ebe565b5081515f9083908390811061250057612500613160565b60200101906001600160f81b03191690815f1a9053506001016124ca565b505f5b600481101561257c5761253581600361314d565b612540906008612ebe565b505f8261254e836002613174565b8151811061255e5761255e613160565b60200101906001600160f81b03191690815f1a905350600101612521565b505f5b60208110156125d9578451816020811061259b5761259b613160565b1a60f81b826125ab836006613174565b815181106125bb576125bb613160565b60200101906001600160f81b03191690815f1a90535060010161257f565b505f5b602081101561263957846020015181602081106125fb576125fb613160565b1a60f81b8261260b836026613174565b8151811061261b5761261b613160565b60200101906001600160f81b03191690815f1a9053506001016125dc565b505f5b60088110156126ad5761265081600761314d565b61265b906008612ebe565b60ff1685604001516001600160401b0316901c60f81b8282604661267f9190613174565b8151811061268f5761268f613160565b60200101906001600160f81b03191690815f1a90535060010161263c565b505f5b603081101561271857846080015181815181106126cf576126cf613160565b01602001516001600160f81b031916826126ea83604e613174565b815181106126fa576126fa613160565b60200101906001600160f81b03191690815f1a9053506001016126b0565b505f5b600881101561278a5761272f81600761314d565b61273a906008612ebe565b60608601516001600160401b0390811691161c60f81b8261275c83607e613174565b8151811061276c5761276c613160565b60200101906001600160f81b03191690815f1a90535060010161271b565b5060028160405161279b91906133ef565b602060405180830381855afa1580156127b6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127d99190612e6c565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6128106120d7565b6128186129f9565b612820612a09565b61216581612a11565b6128316120d7565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156128dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129019190612e6c565b90506129186001600160a01b038516333086612a7d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561295c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129809190612e6c565b90508181116129e65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610307565b6129f0828261314d565b95945050505050565b612a016120d7565b612120612ad7565b6121206120d7565b612a196120d7565b80355f8051602061342b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612a63606083016040840161340a565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610764908590612adf565b6127e26120d7565b5f8060205f8451602086015f885af180612afe576040513d5f823e3d81fd5b50505f513d91508115612b15578060011415612b22565b6001600160a01b0384163b155b1561076457604051635274afe760e01b81526001600160a01b0385166004820152602401610307565b508054612b5790612ff8565b5f825580601f10612b66575050565b601f0160209004905f5260205f209081019061216591905b80821115612b91575f8155600101612b7e565b5090565b5f60208284031215612ba5575f80fd5b5035919050565b6001600160a01b0381168114612165575f80fd5b5f80828403610100811215612bd3575f80fd5b60e0811215612be0575f80fd5b5082915060e0830135612bf281612bac565b809150509250929050565b80356001600160401b0381168114612c13575f80fd5b919050565b5f60208284031215612c28575f80fd5b612c3182612bfd565b9392505050565b8015158114612165575f80fd5b803563ffffffff81168114612c13575f80fd5b5f805f60608486031215612c6a575f80fd5b833592506020840135612c7c81612c38565b9150612c8a60408501612c45565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612cc957612cc9612c93565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612cf757612cf7612c93565b604052919050565b5f6001600160401b03821115612d1757612d17612c93565b50601f01601f191660200190565b5f805f8060808587031215612d38575f80fd5b8435935060208501359250612d4f60408601612bfd565b915060608501356001600160401b03811115612d69575f80fd5b8501601f81018713612d79575f80fd5b8035612d8c612d8782612cff565b612ccf565b818152886020838501011115612da0575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612dd1575f80fd5b612c3182612c45565b5f8060408385031215612deb575f80fd5b612df483612c45565b91506020830135612bf281612c38565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612e32578181015183820152602001612e1a565b50505f910152565b602081525f8251806020840152612e58816040850160208701612e18565b601f01601f19169190910160400192915050565b5f60208284031215612e7c575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612eb957612eb9612e83565b500490565b80820281158282048414176104b3576104b3612e97565b8051612c1381612c38565b5f8060408385031215612ef1575f80fd5b82516001600160401b0380821115612f07575f80fd5b9084019060608287031215612f1a575f80fd5b612f22612ca7565b82518152602080840151612f3581612bac565b82820152604084015183811115612f4a575f80fd5b80850194505087601f850112612f5e575f80fd5b83519250612f6e612d8784612cff565b8381528882858701011115612f81575f80fd5b612f9084838301848801612e18565b80604084015250819550612fa5818801612ed5565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061300c57607f821691505b60208210810361302a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461308981612ff8565b806020870152604060018084165f81146130aa57600181146130c6576130f3565b60ff19851660408a0152604084151560051b8a010195506130f3565b895f5260205f205f5b858110156130ea5781548b82018601529083019088016130cf565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104b3576104b3612e97565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104b3576104b3612e97565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610bb757805f5260205f20601f840160051c8101602085101561327f5750805b601f840160051c820191505b8181101561038e575f815560010161328b565b81516001600160401b038111156132b7576132b7612c93565b6132cb816132c58454612ff8565b8461325a565b602080601f8311600181146132fe575f84156132e75750858301515b5f19600386901b1c1916600185901b178555613355565b5f85815260208120601f198616915b8281101561332c5788860151825594840194600190910190840161330d565b508582101561334957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561336d575f80fd5b8135612c3181612bac565b6001600160401b0381811683821601908082111561339857613398612e97565b5092915050565b6001600160401b038181168382160280821691908281146133c2576133c2612e97565b505092915050565b5f6001600160401b03808416806133e3576133e3612e83565b92169190910492915050565b5f8251613400818460208701612e18565b9190910192915050565b5f6020828403121561341a575f80fd5b813560ff81168114612c31575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveValidator\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516136d03803806136d083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6135838061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c806376f786211161006e57806376f7862114610161578063872fda6414610174578063a3a65e4814610187578063b771b3bc1461019a578063bee0a03f146101c0578063fdf94a1a146101d3575f80fd5b80630322ed98146100aa57806327f39ca8146100bf5780632e2194d8146100d25780636206585614610102578063687e842014610123575b5f80fd5b6100bd6100b8366004612cad565b6101e6565b005b6100bd6100cd366004612cd8565b6103de565b6100e56100e0366004612cad565b6104c2565b6040516001600160401b0390911681526020015b60405180910390f35b610115610110366004612d30565b6104d8565b6040519081526020016100f9565b610115610131366004612cad565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6100bd61016f366004612d69565b6104f1565b610115610182366004612e36565b610789565b6100bd610195366004612ed2565b6107ae565b6101a86005600160991b0181565b6040516001600160a01b0390911681526020016100f9565b6100bd6101ce366004612cad565b610ac7565b6100bd6101e1366004612eeb565b610bdb565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061355783398151915293929190829060ff16600581111561024757610247612f15565b600581111561025857610258612f15565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102ef576102ef612f15565b146103595760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61036a848361010001515f61100f565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610397908490600401612f4b565b6020604051808303815f875af11580156103b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d79190612f7d565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610427575080546001600160401b03808416911610155b156104455760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610470848461122e565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6104d264e8d4a5100083612fbc565b92915050565b5f6104d26001600160401b03831664e8d4a51000612fcf565b5f8215610779576040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610541573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105689190810190612ff1565b91509150806105c55760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610350565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610608573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062c9190612f7d565b82511461068b5760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610350565b60208201516001600160a01b0316156106fc5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610350565b5f8061070b846040015161124c565b915091508188146107735760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610350565b93505050505b6107838482611424565b50505050565b5f80610794866117d8565b90506107a285828686611898565b9150505b949350505050565b5f5f805160206135578339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610809573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108309190810190612ff1565b91509150806108515760405162461bcd60e51b8152600401610350906130c3565b82548251146108b45760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610350565b60208201516001600160a01b0316156109275760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610350565b5f806109368460400151611d1c565b91509150806109985760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610350565b5f828152600586016020526040812080546109b290613109565b90501180156109e4575060015f83815260068701602052604090205460ff1660058111156109e2576109e2612f15565b145b610a005760405162461bcd60e51b815260040161035090613141565b5f8281526005860160205260408120610a1891612c63565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613557833981519152929190610b0f90613109565b9050118015610b41575060015f83815260068301602052604090205460ff166005811115610b3f57610b3f612f15565b145b610b5d5760405162461bcd60e51b815260040161035090613141565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610b969190600401613188565b6020604051808303815f875af1158015610bb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190612f7d565b505050565b5f5f805160206135578339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c36573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c5d9190810190612ff1565b9150915080610c7e5760405162461bcd60e51b8152600401610350906130c3565b5f8415610d02575f610c938460400151611ebd565b919350909150506001600160401b03811615610cfc5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610350565b50610d78565b5f610d108460400151611d1c565b90925090508015610d765760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610350565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610daa57610daa612f15565b6005811115610dbb57610dbb612f15565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610e6c5760405162461bcd60e51b815260040161035090613212565b5f600382516005811115610e8257610e82612f15565b1480610ea05750600282516005811115610e9e57610e9e612f15565b145b15610ec357506020808201515f9081526007870190915260408120556004610ec7565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610ef857610ef8612f15565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110885761104881600161325e565b611053906008612fcf565b5081515f9083908390811061106a5761106a613271565b60200101906001600160f81b03191690815f1a905350600101611034565b505f5b60048110156110eb5761109f81600361325e565b6110aa906008612fcf565b6001901c60f81b826110bd836002613285565b815181106110cd576110cd613271565b60200101906001600160f81b03191690815f1a90535060010161108b565b505f5b602081101561114d5761110281601f61325e565b61110d906008612fcf565b86901c60f81b8261111f836006613285565b8151811061112f5761112f613271565b60200101906001600160f81b03191690815f1a9053506001016110ee565b505f5b60088110156111b85761116481600761325e565b61116f906008612fcf565b6001600160401b038616901c60f81b8261118a836026613285565b8151811061119a5761119a613271565b60200101906001600160f81b03191690815f1a905350600101611150565b505f5b6008811015611223576111cf81600761325e565b6111da906008612fcf565b6001600160401b038516901c60f81b826111f583602e613285565b8151811061120557611205613271565b60200101906001600160f81b03191690815f1a9053506001016111bb565b5090505b9392505050565b6112366120f8565b61123f82612143565b61124881612189565b5050565b5f808251602e1461126f5760405162461bcd60e51b815260040161035090613298565b5f805b60028110156112be5761128681600161325e565b611291906008612fcf565b61ffff168582815181106112a7576112a7613271565b016020015160f81c901b9190911790600101611272565b5061ffff8116156112e15760405162461bcd60e51b8152600401610350906132e1565b5f805b600481101561133c576112f881600361325e565b611303906008612fcf565b63ffffffff1686611315836002613285565b8151811061132557611325613271565b016020015160f81c901b91909117906001016112e4565b5063ffffffff81166004146113635760405162461bcd60e51b815260040161035090613324565b5f805b60208110156113b85761137a81601f61325e565b611385906008612fcf565b87611391836006613285565b815181106113a1576113a1613271565b016020015160f81c901b9190911790600101611366565b505f805b6008811015611417576113d081600761325e565b6113db906008612fcf565b6001600160401b0316886113f0836026613285565b8151811061140057611400613271565b016020015160f81c901b91909117906001016113bc565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061355783398151915293929190829060ff16600581111561148557611485612f15565b600581111561149657611496612f15565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561153057611530612f15565b1461158c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610350565b60c08101516001600160a01b0316336001600160a01b0316146115c15760405162461bcd60e51b815260040161035090613212565b6115ce816040015161223d565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff1916600183600581111561161a5761161a612f15565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f9061170b9086908361100f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061173a908590600401612f4b565b6020604051808303815f875af1158015611756573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177a9190612f7d565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081611804846123de565b90505f611810826104c2565b83549091506001600160401b0382161080159061183a57508260010154816001600160401b031611155b6107a65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610350565b5f6118a1612414565b5f80516020613557833981519152426001600160401b0385161180156118db57506001600160401b0384166118d9426202a300613285565b115b61193d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610350565b856119945760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610350565b5f86815260078201602052604090205415611a025760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610350565b8251603014611a695760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610350565b611a728561223d565b5f80611ab96040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061245e565b5f82815260058601602052604090209193509150611ad782826133af565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b04908590600401612f4b565b6020604051808303815f875af1158015611b20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b449190612f7d565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611bca57611bca612f15565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506107a660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611d3f5760405162461bcd60e51b815260040161035090613298565b5f805b6002811015611d8e57611d5681600161325e565b611d61906008612fcf565b61ffff16858281518110611d7757611d77613271565b016020015160f81c901b9190911790600101611d42565b5061ffff811615611db15760405162461bcd60e51b8152600401610350906132e1565b5f805b6004811015611e0c57611dc881600361325e565b611dd3906008612fcf565b63ffffffff1686611de5836002613285565b81518110611df557611df5613271565b016020015160f81c901b9190911790600101611db4565b5063ffffffff8116600214611e335760405162461bcd60e51b815260040161035090613324565b5f805b6020811015611e8857611e4a81601f61325e565b611e55906008612fcf565b87611e61836006613285565b81518110611e7157611e71613271565b016020015160f81c901b9190911790600101611e36565b505f86602681518110611e9d57611e9d613271565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611ee15760405162461bcd60e51b815260040161035090613298565b5f805b6002811015611f3057611ef881600161325e565b611f03906008612fcf565b61ffff16868281518110611f1957611f19613271565b016020015160f81c901b9190911790600101611ee4565b5061ffff811615611f535760405162461bcd60e51b8152600401610350906132e1565b5f805b6004811015611fae57611f6a81600361325e565b611f75906008612fcf565b63ffffffff1687611f87836002613285565b81518110611f9757611f97613271565b016020015160f81c901b9190911790600101611f56565b5063ffffffff8116600114611fd55760405162461bcd60e51b815260040161035090613324565b5f805b602081101561202a57611fec81601f61325e565b611ff7906008612fcf565b88612003836006613285565b8151811061201357612013613271565b016020015160f81c901b9190911790600101611fd8565b505f805b60088110156120895761204281600761325e565b61204d906008612fcf565b6001600160401b031689612062836026613285565b8151811061207257612072613271565b016020015160f81c901b919091179060010161202e565b505f805b60088110156120e8576120a181600761325e565b6120ac906008612fcf565b6001600160401b03168a6120c183602e613285565b815181106120d1576120d1613271565b016020015160f81c901b919091179060010161208d565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661214157604051631afcd79f60e31b815260040160405180910390fd5b565b61214b6120f8565b61215481612829565b6121866060820135608083013561217160c0850160a08601612d30565b61218160e0860160c0870161346e565b61284a565b50565b6121916120f8565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661221d5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610350565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206135578339815191529060ff165f0361227b575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906122c3908361325e565b106122df576001600160401b03841660408301528082526122fe565b83826040018181516122f19190613489565b6001600160401b03169052505b5f82602001518360400151606461231591906134b0565b61231f91906134db565b600285015490915060ff908116908216111561239a5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610350565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104d2827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906128b8565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161245857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124c85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610350565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561253f576124ff81600161325e565b61250a906008612fcf565b5081515f9083908390811061252157612521613271565b60200101906001600160f81b03191690815f1a9053506001016124eb565b505f5b600481101561259d5761255681600361325e565b612561906008612fcf565b505f8261256f836002613285565b8151811061257f5761257f613271565b60200101906001600160f81b03191690815f1a905350600101612542565b505f5b60208110156125fa57845181602081106125bc576125bc613271565b1a60f81b826125cc836006613285565b815181106125dc576125dc613271565b60200101906001600160f81b03191690815f1a9053506001016125a0565b505f5b602081101561265a578460200151816020811061261c5761261c613271565b1a60f81b8261262c836026613285565b8151811061263c5761263c613271565b60200101906001600160f81b03191690815f1a9053506001016125fd565b505f5b60088110156126ce5761267181600761325e565b61267c906008612fcf565b60ff1685604001516001600160401b0316901c60f81b828260466126a09190613285565b815181106126b0576126b0613271565b60200101906001600160f81b03191690815f1a90535060010161265d565b505f5b603081101561273957846080015181815181106126f0576126f0613271565b01602001516001600160f81b0319168261270b83604e613285565b8151811061271b5761271b613271565b60200101906001600160f81b03191690815f1a9053506001016126d1565b505f5b60088110156127ab5761275081600761325e565b61275b906008612fcf565b60608601516001600160401b0390811691161c60f81b8261277d83607e613285565b8151811061278d5761278d613271565b60200101906001600160f81b03191690815f1a90535060010161273c565b506002816040516127bc9190613500565b602060405180830381855afa1580156127d7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127fa9190612f7d565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6128316120f8565b612839612a1a565b612841612a2a565b61218681612a32565b6128526120f8565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156128fe573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129229190612f7d565b90506129396001600160a01b038516333086612a9e565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561297d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129a19190612f7d565b9050818111612a075760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610350565b612a11828261325e565b95945050505050565b612a226120f8565b612141612af8565b6121416120f8565b612a3a6120f8565b80355f8051602061355783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612a84606083016040840161351b565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610783908590612b00565b6128036120f8565b5f612b146001600160a01b03841683612b61565b905080515f14158015612b38575080806020019051810190612b36919061353b565b155b15610bd657604051635274afe760e01b81526001600160a01b0384166004820152602401610350565b606061122783835f845f80856001600160a01b03168486604051612b859190613500565b5f6040518083038185875af1925050503d805f8114612bbf576040519150601f19603f3d011682016040523d82523d5f602084013e612bc4565b606091505b5091509150612bd4868383612bde565b9695505050505050565b606082612bf357612bee82612c3a565b611227565b8151158015612c0a57506001600160a01b0384163b155b15612c3357604051639996b31560e01b81526001600160a01b0385166004820152602401610350565b5080611227565b805115612c4a5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054612c6f90613109565b5f825580601f10612c7e575050565b601f0160209004905f5260205f209081019061218691905b80821115612ca9575f8155600101612c96565b5090565b5f60208284031215612cbd575f80fd5b5035919050565b6001600160a01b0381168114612186575f80fd5b5f80828403610100811215612ceb575f80fd5b60e0811215612cf8575f80fd5b5082915060e0830135612d0a81612cc4565b809150509250929050565b80356001600160401b0381168114612d2b575f80fd5b919050565b5f60208284031215612d40575f80fd5b61122782612d15565b8015158114612186575f80fd5b803563ffffffff81168114612d2b575f80fd5b5f805f60608486031215612d7b575f80fd5b833592506020840135612d8d81612d49565b9150612d9b60408501612d56565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612dda57612dda612da4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e0857612e08612da4565b604052919050565b5f6001600160401b03821115612e2857612e28612da4565b50601f01601f191660200190565b5f805f8060808587031215612e49575f80fd5b8435935060208501359250612e6060408601612d15565b915060608501356001600160401b03811115612e7a575f80fd5b8501601f81018713612e8a575f80fd5b8035612e9d612e9882612e10565b612de0565b818152886020838501011115612eb1575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612ee2575f80fd5b61122782612d56565b5f8060408385031215612efc575f80fd5b612f0583612d56565b91506020830135612d0a81612d49565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612f43578181015183820152602001612f2b565b50505f910152565b602081525f8251806020840152612f69816040850160208701612f29565b601f01601f19169190910160400192915050565b5f60208284031215612f8d575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612fca57612fca612f94565b500490565b80820281158282048414176104d2576104d2612fa8565b8051612d2b81612d49565b5f8060408385031215613002575f80fd5b82516001600160401b0380821115613018575f80fd5b908401906060828703121561302b575f80fd5b613033612db8565b8251815260208084015161304681612cc4565b8282015260408401518381111561305b575f80fd5b80850194505087601f85011261306f575f80fd5b8351925061307f612e9884612e10565b8381528882858701011115613092575f80fd5b6130a184838301848801612f29565b806040840152508195506130b6818801612fe6565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061311d57607f821691505b60208210810361313b57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461319a81613109565b806020870152604060018084165f81146131bb57600181146131d757613204565b60ff19851660408a0152604084151560051b8a01019550613204565b895f5260205f205f5b858110156131fb5781548b82018601529083019088016131e0565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104d2576104d2612fa8565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104d2576104d2612fa8565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610bd657805f5260205f20601f840160051c810160208510156133905750805b601f840160051c820191505b818110156103d7575f815560010161339c565b81516001600160401b038111156133c8576133c8612da4565b6133dc816133d68454613109565b8461336b565b602080601f83116001811461340f575f84156133f85750858301515b5f19600386901b1c1916600185901b178555613466565b5f85815260208120601f198616915b8281101561343d5788860151825594840194600190910190840161341e565b508582101561345a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561347e575f80fd5b813561122781612cc4565b6001600160401b038181168382160190808211156134a9576134a9612fa8565b5092915050565b6001600160401b038181168382160280821691908281146134d3576134d3612fa8565b505092915050565b5f6001600160401b03808416806134f4576134f4612f94565b92169190910492915050565b5f8251613511818460208701612f29565b9190910192915050565b5f6020828403121561352b575f80fd5b813560ff81168114611227575f80fd5b5f6020828403121561354b575f80fd5b815161122781612d4956fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -249,6 +249,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WARPMESS return _ERC20TokenStakingManager.Contract.WARPMESSENGER(&_ERC20TokenStakingManager.CallOpts) } +// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// +// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetActiveValidator(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "getActiveValidator", nodeID) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// +// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) GetActiveValidator(nodeID [32]byte) ([32]byte, error) { + return _ERC20TokenStakingManager.Contract.GetActiveValidator(&_ERC20TokenStakingManager.CallOpts, nodeID) +} + +// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// +// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) GetActiveValidator(nodeID [32]byte) ([32]byte, error) { + return _ERC20TokenStakingManager.Contract.GetActiveValidator(&_ERC20TokenStakingManager.CallOpts, nodeID) +} + // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. // // Solidity: function valueToWeight(uint256 value) pure returns(uint64) diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 777297b68..1d6180f14 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516132ac3803806132ac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61315f8061014d5f395ff3fe60806040526004361061008e575f3560e01c8063a3a65e4811610057578063a3a65e481461015a578063b771b3bc14610179578063bee0a03f146101ab578063f40797d7146101ca578063fdf94a1a146101dd575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063620658561461010e57806376f786211461013b575b5f80fd5b34801561009d575f80fd5b506100b16100ac3660046128cd565b6101fc565b005b3480156100be575f80fd5b506100b16100cd3660046128e3565b610308565b3480156100dd575f80fd5b506100f16100ec3660046128e3565b610500565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b5061012d610128366004612915565b610516565b604051908152602001610105565b348015610146575f80fd5b506100b1610155366004612955565b61052f565b348015610165575f80fd5b506100b1610174366004612990565b6107c7565b348015610184575f80fd5b506101936005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101b6575f80fd5b506100b16101c53660046128e3565b610ae0565b61012d6101d8366004612a3b565b610bf4565b3480156101e8575f80fd5b506100b16101f7366004612acd565b610c16565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba8661104a565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061313383398151915293929190829060ff16600581111561036957610369612b02565b600581111561037a5761037a612b02565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561041157610411612b02565b1461047b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61048c848361010001515f61105e565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104b9908490600401612b38565b6020604051808303815f875af11580156104d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104f99190612b6a565b5050505050565b5f61051064e8d4a5100083612ba9565b92915050565b5f6105106001600160401b03831664e8d4a51000612bbc565b5f82156107b7576040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561057f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105a69190810190612bf2565b91509150806106035760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610472565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610646573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066a9190612b6a565b8251146106c95760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610472565b60208201516001600160a01b03161561073a5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610472565b5f80610749846040015161127b565b915091508188146107b15760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610472565b93505050505b6107c18482611453565b50505050565b5f5f805160206131338339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610822573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108499190810190612bf2565b915091508061086a5760405162461bcd60e51b815260040161047290612cc4565b82548251146108cd5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610472565b60208201516001600160a01b0316156109405760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610472565b5f8061094f8460400151611807565b91509150806109b15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610472565b5f828152600586016020526040812080546109cb90612d0a565b90501180156109fd575060015f83815260068701602052604090205460ff1660058111156109fb576109fb612b02565b145b610a195760405162461bcd60e51b815260040161047290612d3c565b5f8281526005860160205260408120610a3191612883565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613133833981519152929190610b2890612d0a565b9050118015610b5a575060015f83815260068301602052604090205460ff166005811115610b5857610b58612b02565b145b610b765760405162461bcd60e51b815260040161047290612d3c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610baf9190600401612d83565b6020604051808303815f875af1158015610bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bef9190612b6a565b505050565b5f80610bff346119a8565b9050610c0d85828686611a65565b95945050505050565b5f5f805160206131338339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c71573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c989190810190612bf2565b9150915080610cb95760405162461bcd60e51b815260040161047290612cc4565b5f8415610d3d575f610cce8460400151611ee9565b919350909150506001600160401b03811615610d375760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610472565b50610db3565b5f610d4b8460400151611807565b90925090508015610db15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610472565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610de557610de5612b02565b6005811115610df657610df6612b02565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610ea75760405162461bcd60e51b815260040161047290612e0d565b5f600382516005811115610ebd57610ebd612b02565b1480610edb5750600282516005811115610ed957610ed9612b02565b145b15610efe57506020808201515f9081526007870190915260408120556004610f02565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f3357610f33612b02565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b611052612124565b61105b8161216f565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110d757611097816001612e59565b6110a2906008612bbc565b5081515f908390839081106110b9576110b9612e6c565b60200101906001600160f81b03191690815f1a905350600101611083565b505f5b600481101561113a576110ee816003612e59565b6110f9906008612bbc565b6001901c60f81b8261110c836002612e80565b8151811061111c5761111c612e6c565b60200101906001600160f81b03191690815f1a9053506001016110da565b505f5b602081101561119c5761115181601f612e59565b61115c906008612bbc565b86901c60f81b8261116e836006612e80565b8151811061117e5761117e612e6c565b60200101906001600160f81b03191690815f1a90535060010161113d565b505f5b6008811015611207576111b3816007612e59565b6111be906008612bbc565b6001600160401b038616901c60f81b826111d9836026612e80565b815181106111e9576111e9612e6c565b60200101906001600160f81b03191690815f1a90535060010161119f565b505f5b60088110156112725761121e816007612e59565b611229906008612bbc565b6001600160401b038516901c60f81b8261124483602e612e80565b8151811061125457611254612e6c565b60200101906001600160f81b03191690815f1a90535060010161120a565b50949350505050565b5f808251602e1461129e5760405162461bcd60e51b815260040161047290612e93565b5f805b60028110156112ed576112b5816001612e59565b6112c0906008612bbc565b61ffff168582815181106112d6576112d6612e6c565b016020015160f81c901b91909117906001016112a1565b5061ffff8116156113105760405162461bcd60e51b815260040161047290612edc565b5f805b600481101561136b57611327816003612e59565b611332906008612bbc565b63ffffffff1686611344836002612e80565b8151811061135457611354612e6c565b016020015160f81c901b9190911790600101611313565b5063ffffffff81166004146113925760405162461bcd60e51b815260040161047290612f1f565b5f805b60208110156113e7576113a981601f612e59565b6113b4906008612bbc565b876113c0836006612e80565b815181106113d0576113d0612e6c565b016020015160f81c901b9190911790600101611395565b505f805b6008811015611446576113ff816007612e59565b61140a906008612bbc565b6001600160401b03168861141f836026612e80565b8151811061142f5761142f612e6c565b016020015160f81c901b91909117906001016113eb565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061313383398151915293929190829060ff1660058111156114b4576114b4612b02565b60058111156114c5576114c5612b02565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561155f5761155f612b02565b146115bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610472565b60c08101516001600160a01b0316336001600160a01b0316146115f05760405162461bcd60e51b815260040161047290612e0d565b6115fd81604001516121b2565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff1916600183600581111561164957611649612b02565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f9061173a9086908361105e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611769908590600401612b38565b6020604051808303815f875af1158015611785573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a99190612b6a565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f80825160271461182a5760405162461bcd60e51b815260040161047290612e93565b5f805b600281101561187957611841816001612e59565b61184c906008612bbc565b61ffff1685828151811061186257611862612e6c565b016020015160f81c901b919091179060010161182d565b5061ffff81161561189c5760405162461bcd60e51b815260040161047290612edc565b5f805b60048110156118f7576118b3816003612e59565b6118be906008612bbc565b63ffffffff16866118d0836002612e80565b815181106118e0576118e0612e6c565b016020015160f81c901b919091179060010161189f565b5063ffffffff811660021461191e5760405162461bcd60e51b815260040161047290612f1f565b5f805b60208110156119735761193581601f612e59565b611940906008612bbc565b8761194c836006612e80565b8151811061195c5761195c612e6c565b016020015160f81c901b9190911790600101611921565b505f8660268151811061198857611988612e6c565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0082826119d582610500565b83549091506001600160401b038216108015906119ff57508260010154816001600160401b031611155b611a5d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610472565b949350505050565b5f611a6e612353565b5f80516020613133833981519152426001600160401b038516118015611aa857506001600160401b038416611aa6426202a300612e80565b115b611b0a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610472565b85611b615760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610472565b5f86815260078201602052604090205415611bcf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610472565b8251603014611c365760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610472565b611c3f856121b2565b5f80611c866040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061239d565b5f82815260058601602052604090209193509150611ca48282612faa565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611cd1908590600401612b38565b6020604051808303815f875af1158015611ced573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d119190612b6a565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611d9757611d97612b02565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a5d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611f0d5760405162461bcd60e51b815260040161047290612e93565b5f805b6002811015611f5c57611f24816001612e59565b611f2f906008612bbc565b61ffff16868281518110611f4557611f45612e6c565b016020015160f81c901b9190911790600101611f10565b5061ffff811615611f7f5760405162461bcd60e51b815260040161047290612edc565b5f805b6004811015611fda57611f96816003612e59565b611fa1906008612bbc565b63ffffffff1687611fb3836002612e80565b81518110611fc357611fc3612e6c565b016020015160f81c901b9190911790600101611f82565b5063ffffffff81166001146120015760405162461bcd60e51b815260040161047290612f1f565b5f805b60208110156120565761201881601f612e59565b612023906008612bbc565b8861202f836006612e80565b8151811061203f5761203f612e6c565b016020015160f81c901b9190911790600101612004565b505f805b60088110156120b55761206e816007612e59565b612079906008612bbc565b6001600160401b03168961208e836026612e80565b8151811061209e5761209e612e6c565b016020015160f81c901b919091179060010161205a565b505f805b6008811015612114576120cd816007612e59565b6120d8906008612bbc565b6001600160401b03168a6120ed83602e612e80565b815181106120fd576120fd612e6c565b016020015160f81c901b91909117906001016120b9565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661216d57604051631afcd79f60e31b815260040160405180910390fd5b565b612177612124565b61218081612768565b61105b6060820135608083013561219d60c0850160a08601612915565b6121ad60e0860160c08701613065565b612789565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206131338339815191529060ff165f036121f0575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906122389083612e59565b10612254576001600160401b0384166040830152808252612273565b83826040018181516122669190613080565b6001600160401b03169052505b5f82602001518360400151606461228a91906130a7565b61229491906130d2565b600285015490915060ff908116908216111561230f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610472565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161239757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124075760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610472565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561247e5761243e816001612e59565b612449906008612bbc565b5081515f9083908390811061246057612460612e6c565b60200101906001600160f81b03191690815f1a90535060010161242a565b505f5b60048110156124dc57612495816003612e59565b6124a0906008612bbc565b505f826124ae836002612e80565b815181106124be576124be612e6c565b60200101906001600160f81b03191690815f1a905350600101612481565b505f5b602081101561253957845181602081106124fb576124fb612e6c565b1a60f81b8261250b836006612e80565b8151811061251b5761251b612e6c565b60200101906001600160f81b03191690815f1a9053506001016124df565b505f5b6020811015612599578460200151816020811061255b5761255b612e6c565b1a60f81b8261256b836026612e80565b8151811061257b5761257b612e6c565b60200101906001600160f81b03191690815f1a90535060010161253c565b505f5b600881101561260d576125b0816007612e59565b6125bb906008612bbc565b60ff1685604001516001600160401b0316901c60f81b828260466125df9190612e80565b815181106125ef576125ef612e6c565b60200101906001600160f81b03191690815f1a90535060010161259c565b505f5b6030811015612678578460800151818151811061262f5761262f612e6c565b01602001516001600160f81b0319168261264a83604e612e80565b8151811061265a5761265a612e6c565b60200101906001600160f81b03191690815f1a905350600101612610565b505f5b60088110156126ea5761268f816007612e59565b61269a906008612bbc565b60608601516001600160401b0390811691161c60f81b826126bc83607e612e80565b815181106126cc576126cc612e6c565b60200101906001600160f81b03191690815f1a90535060010161267b565b506002816040516126fb91906130f7565b602060405180830381855afa158015612716573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127399190612b6a565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612770612124565b6127786127f7565b612780612807565b61105b8161280f565b612791612124565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6127ff612124565b61216d61287b565b61216d612124565b612817612124565b80355f8051602061313383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556128616060830160408401613112565b600291909101805460ff191660ff90921691909117905550565b612742612124565b50805461288f90612d0a565b5f825580601f1061289e575050565b601f0160209004905f5260205f209081019061105b91905b808211156128c9575f81556001016128b6565b5090565b5f60e082840312156128dd575f80fd5b50919050565b5f602082840312156128f3575f80fd5b5035919050565b80356001600160401b0381168114612910575f80fd5b919050565b5f60208284031215612925575f80fd5b61292e826128fa565b9392505050565b801515811461105b575f80fd5b803563ffffffff81168114612910575f80fd5b5f805f60608486031215612967575f80fd5b83359250602084013561297981612935565b915061298760408501612942565b90509250925092565b5f602082840312156129a0575f80fd5b61292e82612942565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129df576129df6129a9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612a0d57612a0d6129a9565b604052919050565b5f6001600160401b03821115612a2d57612a2d6129a9565b50601f01601f191660200190565b5f805f60608486031215612a4d575f80fd5b83359250612a5d602085016128fa565b915060408401356001600160401b03811115612a77575f80fd5b8401601f81018613612a87575f80fd5b8035612a9a612a9582612a15565b6129e5565b818152876020838501011115612aae575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612ade575f80fd5b612ae783612942565b91506020830135612af781612935565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612b30578181015183820152602001612b18565b50505f910152565b602081525f8251806020840152612b56816040850160208701612b16565b601f01601f19169190910160400192915050565b5f60208284031215612b7a575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612bb757612bb7612b81565b500490565b808202811582820484141761051057610510612b95565b6001600160a01b038116811461105b575f80fd5b805161291081612935565b5f8060408385031215612c03575f80fd5b82516001600160401b0380821115612c19575f80fd5b9084019060608287031215612c2c575f80fd5b612c346129bd565b82518152602080840151612c4781612bd3565b82820152604084015183811115612c5c575f80fd5b80850194505087601f850112612c70575f80fd5b83519250612c80612a9584612a15565b8381528882858701011115612c93575f80fd5b612ca284838301848801612b16565b80604084015250819550612cb7818801612be7565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612d1e57607f821691505b6020821081036128dd57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612d9581612d0a565b806020870152604060018084165f8114612db65760018114612dd257612dff565b60ff19851660408a0152604084151560051b8a01019550612dff565b895f5260205f205f5b85811015612df65781548b8201860152908301908801612ddb565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561051057610510612b95565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561051057610510612b95565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610bef57805f5260205f20601f840160051c81016020851015612f8b5750805b601f840160051c820191505b818110156104f9575f8155600101612f97565b81516001600160401b03811115612fc357612fc36129a9565b612fd781612fd18454612d0a565b84612f66565b602080601f83116001811461300a575f8415612ff35750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b8281101561303857888601518255948401946001909101908401613019565b508582101561305557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215613075575f80fd5b813561292e81612bd3565b6001600160401b038181168382160190808211156130a0576130a0612b95565b5092915050565b6001600160401b038181168382160280821691908281146130ca576130ca612b95565b505092915050565b5f6001600160401b03808416806130eb576130eb612b81565b92169190910492915050565b5f8251613108818460208701612b16565b9190910192915050565b5f60208284031215613122575f80fd5b813560ff8116811461292e575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveValidator\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516132db3803806132db83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61318e8061014d5f395ff3fe608060405260043610610099575f3560e01c806376f786211161006257806376f7862114610190578063a3a65e48146101af578063b771b3bc146101ce578063bee0a03f14610200578063f40797d71461021f578063fdf94a1a14610232575f80fd5b8062e417921461009d5780630322ed98146100be5780632e2194d8146100dd5780636206585614610119578063687e842014610146575b5f80fd5b3480156100a8575f80fd5b506100bc6100b73660046128f8565b610251565b005b3480156100c9575f80fd5b506100bc6100d836600461290e565b610333565b3480156100e8575f80fd5b506100fc6100f736600461290e565b61052b565b6040516001600160401b0390911681526020015b60405180910390f35b348015610124575f80fd5b50610138610133366004612940565b610541565b604051908152602001610110565b348015610151575f80fd5b5061013861016036600461290e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b34801561019b575f80fd5b506100bc6101aa366004612980565b61055a565b3480156101ba575f80fd5b506100bc6101c93660046129bb565b6107f2565b3480156101d9575f80fd5b506101e86005600160991b0181565b6040516001600160a01b039091168152602001610110565b34801561020b575f80fd5b506100bc61021a36600461290e565b610b0b565b61013861022d366004612a66565b610c1f565b34801561023d575f80fd5b506100bc61024c366004612af8565b610c41565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061029a575080546001600160401b03808416911610155b156102b85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556102e283611075565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061316283398151915293929190829060ff16600581111561039457610394612b2d565b60058111156103a5576103a5612b2d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561043c5761043c612b2d565b146104a65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6104b7848361010001515f611089565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104e4908490600401612b63565b6020604051808303815f875af1158015610500573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105249190612b95565b5050505050565b5f61053b64e8d4a5100083612bd4565b92915050565b5f61053b6001600160401b03831664e8d4a51000612be7565b5f82156107e2576040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156105aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105d19190810190612c1d565b915091508061062e5760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b606482015260840161049d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610671573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106959190612b95565b8251146106f45760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b606482015260840161049d565b60208201516001600160a01b0316156107655760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b606482015260840161049d565b5f8061077484604001516112a6565b915091508188146107dc5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b606482015260840161049d565b93505050505b6107ec848261147e565b50505050565b5f5f805160206131628339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561084d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108749190810190612c1d565b91509150806108955760405162461bcd60e51b815260040161049d90612cef565b82548251146108f85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161049d565b60208201516001600160a01b03161561096b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161049d565b5f8061097a8460400151611832565b91509150806109dc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161049d565b5f828152600586016020526040812080546109f690612d35565b9050118015610a28575060015f83815260068701602052604090205460ff166005811115610a2657610a26612b2d565b145b610a445760405162461bcd60e51b815260040161049d90612d67565b5f8281526005860160205260408120610a5c916128ae565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613162833981519152929190610b5390612d35565b9050118015610b85575060015f83815260068301602052604090205460ff166005811115610b8357610b83612b2d565b145b610ba15760405162461bcd60e51b815260040161049d90612d67565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bda9190600401612dae565b6020604051808303815f875af1158015610bf6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1a9190612b95565b505050565b5f80610c2a346119d3565b9050610c3885828686611a90565b95945050505050565b5f5f805160206131628339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c9c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cc39190810190612c1d565b9150915080610ce45760405162461bcd60e51b815260040161049d90612cef565b5f8415610d68575f610cf98460400151611f14565b919350909150506001600160401b03811615610d625760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161049d565b50610dde565b5f610d768460400151611832565b90925090508015610ddc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161049d565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610e1057610e10612b2d565b6005811115610e2157610e21612b2d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610ed25760405162461bcd60e51b815260040161049d90612e38565b5f600382516005811115610ee857610ee8612b2d565b1480610f065750600282516005811115610f0457610f04612b2d565b145b15610f2957506020808201515f9081526007870190915260408120556004610f2d565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f5e57610f5e612b2d565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b61107d61214f565b6110868161219a565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611102576110c2816001612e84565b6110cd906008612be7565b5081515f908390839081106110e4576110e4612e97565b60200101906001600160f81b03191690815f1a9053506001016110ae565b505f5b600481101561116557611119816003612e84565b611124906008612be7565b6001901c60f81b82611137836002612eab565b8151811061114757611147612e97565b60200101906001600160f81b03191690815f1a905350600101611105565b505f5b60208110156111c75761117c81601f612e84565b611187906008612be7565b86901c60f81b82611199836006612eab565b815181106111a9576111a9612e97565b60200101906001600160f81b03191690815f1a905350600101611168565b505f5b6008811015611232576111de816007612e84565b6111e9906008612be7565b6001600160401b038616901c60f81b82611204836026612eab565b8151811061121457611214612e97565b60200101906001600160f81b03191690815f1a9053506001016111ca565b505f5b600881101561129d57611249816007612e84565b611254906008612be7565b6001600160401b038516901c60f81b8261126f83602e612eab565b8151811061127f5761127f612e97565b60200101906001600160f81b03191690815f1a905350600101611235565b50949350505050565b5f808251602e146112c95760405162461bcd60e51b815260040161049d90612ebe565b5f805b6002811015611318576112e0816001612e84565b6112eb906008612be7565b61ffff1685828151811061130157611301612e97565b016020015160f81c901b91909117906001016112cc565b5061ffff81161561133b5760405162461bcd60e51b815260040161049d90612f07565b5f805b600481101561139657611352816003612e84565b61135d906008612be7565b63ffffffff168661136f836002612eab565b8151811061137f5761137f612e97565b016020015160f81c901b919091179060010161133e565b5063ffffffff81166004146113bd5760405162461bcd60e51b815260040161049d90612f4a565b5f805b6020811015611412576113d481601f612e84565b6113df906008612be7565b876113eb836006612eab565b815181106113fb576113fb612e97565b016020015160f81c901b91909117906001016113c0565b505f805b60088110156114715761142a816007612e84565b611435906008612be7565b6001600160401b03168861144a836026612eab565b8151811061145a5761145a612e97565b016020015160f81c901b9190911790600101611416565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061316283398151915293929190829060ff1660058111156114df576114df612b2d565b60058111156114f0576114f0612b2d565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561158a5761158a612b2d565b146115e65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161049d565b60c08101516001600160a01b0316336001600160a01b03161461161b5760405162461bcd60e51b815260040161049d90612e38565b61162881604001516121dd565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff1916600183600581111561167457611674612b2d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f9061176590869083611089565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611794908590600401612b63565b6020604051808303815f875af11580156117b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d49190612b95565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f8082516027146118555760405162461bcd60e51b815260040161049d90612ebe565b5f805b60028110156118a45761186c816001612e84565b611877906008612be7565b61ffff1685828151811061188d5761188d612e97565b016020015160f81c901b9190911790600101611858565b5061ffff8116156118c75760405162461bcd60e51b815260040161049d90612f07565b5f805b6004811015611922576118de816003612e84565b6118e9906008612be7565b63ffffffff16866118fb836002612eab565b8151811061190b5761190b612e97565b016020015160f81c901b91909117906001016118ca565b5063ffffffff81166002146119495760405162461bcd60e51b815260040161049d90612f4a565b5f805b602081101561199e5761196081601f612e84565b61196b906008612be7565b87611977836006612eab565b8151811061198757611987612e97565b016020015160f81c901b919091179060010161194c565b505f866026815181106119b3576119b3612e97565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008282611a008261052b565b83549091506001600160401b03821610801590611a2a57508260010154816001600160401b031611155b611a885760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161049d565b949350505050565b5f611a9961237e565b5f80516020613162833981519152426001600160401b038516118015611ad357506001600160401b038416611ad1426202a300612eab565b115b611b355760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161049d565b85611b8c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161049d565b5f86815260078201602052604090205415611bfa5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161049d565b8251603014611c615760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161049d565b611c6a856121dd565b5f80611cb16040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506123c8565b5f82815260058601602052604090209193509150611ccf8282612fd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611cfc908590600401612b63565b6020604051808303815f875af1158015611d18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3c9190612b95565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611dc257611dc2612b2d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a8860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611f385760405162461bcd60e51b815260040161049d90612ebe565b5f805b6002811015611f8757611f4f816001612e84565b611f5a906008612be7565b61ffff16868281518110611f7057611f70612e97565b016020015160f81c901b9190911790600101611f3b565b5061ffff811615611faa5760405162461bcd60e51b815260040161049d90612f07565b5f805b600481101561200557611fc1816003612e84565b611fcc906008612be7565b63ffffffff1687611fde836002612eab565b81518110611fee57611fee612e97565b016020015160f81c901b9190911790600101611fad565b5063ffffffff811660011461202c5760405162461bcd60e51b815260040161049d90612f4a565b5f805b60208110156120815761204381601f612e84565b61204e906008612be7565b8861205a836006612eab565b8151811061206a5761206a612e97565b016020015160f81c901b919091179060010161202f565b505f805b60088110156120e057612099816007612e84565b6120a4906008612be7565b6001600160401b0316896120b9836026612eab565b815181106120c9576120c9612e97565b016020015160f81c901b9190911790600101612085565b505f805b600881101561213f576120f8816007612e84565b612103906008612be7565b6001600160401b03168a61211883602e612eab565b8151811061212857612128612e97565b016020015160f81c901b91909117906001016120e4565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661219857604051631afcd79f60e31b815260040160405180910390fd5b565b6121a261214f565b6121ab81612793565b611086606082013560808301356121c860c0850160a08601612940565b6121d860e0860160c08701613094565b6127b4565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206131628339815191529060ff165f0361221b575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906122639083612e84565b1061227f576001600160401b038416604083015280825261229e565b838260400181815161229191906130af565b6001600160401b03169052505b5f8260200151836040015160646122b591906130d6565b6122bf9190613101565b600285015490915060ff908116908216111561233a5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161049d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016123c257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124325760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161049d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156124a957612469816001612e84565b612474906008612be7565b5081515f9083908390811061248b5761248b612e97565b60200101906001600160f81b03191690815f1a905350600101612455565b505f5b6004811015612507576124c0816003612e84565b6124cb906008612be7565b505f826124d9836002612eab565b815181106124e9576124e9612e97565b60200101906001600160f81b03191690815f1a9053506001016124ac565b505f5b6020811015612564578451816020811061252657612526612e97565b1a60f81b82612536836006612eab565b8151811061254657612546612e97565b60200101906001600160f81b03191690815f1a90535060010161250a565b505f5b60208110156125c4578460200151816020811061258657612586612e97565b1a60f81b82612596836026612eab565b815181106125a6576125a6612e97565b60200101906001600160f81b03191690815f1a905350600101612567565b505f5b6008811015612638576125db816007612e84565b6125e6906008612be7565b60ff1685604001516001600160401b0316901c60f81b8282604661260a9190612eab565b8151811061261a5761261a612e97565b60200101906001600160f81b03191690815f1a9053506001016125c7565b505f5b60308110156126a3578460800151818151811061265a5761265a612e97565b01602001516001600160f81b0319168261267583604e612eab565b8151811061268557612685612e97565b60200101906001600160f81b03191690815f1a90535060010161263b565b505f5b6008811015612715576126ba816007612e84565b6126c5906008612be7565b60608601516001600160401b0390811691161c60f81b826126e783607e612eab565b815181106126f7576126f7612e97565b60200101906001600160f81b03191690815f1a9053506001016126a6565b506002816040516127269190613126565b602060405180830381855afa158015612741573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127649190612b95565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61279b61214f565b6127a3612822565b6127ab612832565b6110868161283a565b6127bc61214f565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61282a61214f565b6121986128a6565b61219861214f565b61284261214f565b80355f8051602061316283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561288c6060830160408401613141565b600291909101805460ff191660ff90921691909117905550565b61276d61214f565b5080546128ba90612d35565b5f825580601f106128c9575050565b601f0160209004905f5260205f209081019061108691905b808211156128f4575f81556001016128e1565b5090565b5f60e08284031215612908575f80fd5b50919050565b5f6020828403121561291e575f80fd5b5035919050565b80356001600160401b038116811461293b575f80fd5b919050565b5f60208284031215612950575f80fd5b61295982612925565b9392505050565b8015158114611086575f80fd5b803563ffffffff8116811461293b575f80fd5b5f805f60608486031215612992575f80fd5b8335925060208401356129a481612960565b91506129b26040850161296d565b90509250925092565b5f602082840312156129cb575f80fd5b6129598261296d565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612a0a57612a0a6129d4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612a3857612a386129d4565b604052919050565b5f6001600160401b03821115612a5857612a586129d4565b50601f01601f191660200190565b5f805f60608486031215612a78575f80fd5b83359250612a8860208501612925565b915060408401356001600160401b03811115612aa2575f80fd5b8401601f81018613612ab2575f80fd5b8035612ac5612ac082612a40565b612a10565b818152876020838501011115612ad9575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612b09575f80fd5b612b128361296d565b91506020830135612b2281612960565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612b5b578181015183820152602001612b43565b50505f910152565b602081525f8251806020840152612b81816040850160208701612b41565b601f01601f19169190910160400192915050565b5f60208284031215612ba5575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612be257612be2612bac565b500490565b808202811582820484141761053b5761053b612bc0565b6001600160a01b0381168114611086575f80fd5b805161293b81612960565b5f8060408385031215612c2e575f80fd5b82516001600160401b0380821115612c44575f80fd5b9084019060608287031215612c57575f80fd5b612c5f6129e8565b82518152602080840151612c7281612bfe565b82820152604084015183811115612c87575f80fd5b80850194505087601f850112612c9b575f80fd5b83519250612cab612ac084612a40565b8381528882858701011115612cbe575f80fd5b612ccd84838301848801612b41565b80604084015250819550612ce2818801612c12565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612d4957607f821691505b60208210810361290857634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612dc081612d35565b806020870152604060018084165f8114612de15760018114612dfd57612e2a565b60ff19851660408a0152604084151560051b8a01019550612e2a565b895f5260205f205f5b85811015612e215781548b8201860152908301908801612e06565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561053b5761053b612bc0565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561053b5761053b612bc0565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610c1a57805f5260205f20601f840160051c81016020851015612fb65750805b601f840160051c820191505b81811015610524575f8155600101612fc2565b81516001600160401b03811115612fee57612fee6129d4565b61300281612ffc8454612d35565b84612f91565b602080601f831160018114613035575f841561301e5750858301515b5f19600386901b1c1916600185901b17855561308c565b5f85815260208120601f198616915b8281101561306357888601518255948401946001909101908401613044565b508582101561308057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156130a4575f80fd5b813561295981612bfe565b6001600160401b038181168382160190808211156130cf576130cf612bc0565b5092915050565b6001600160401b038181168382160280821691908281146130f9576130f9612bc0565b505092915050565b5f6001600160401b038084168061311a5761311a612bac565b92169190910492915050565b5f8251613137818460208701612b41565b9190910192915050565b5f60208284031215613151575f80fd5b813560ff81168114612959575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -249,6 +249,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) WARPME return _NativeTokenStakingManager.Contract.WARPMESSENGER(&_NativeTokenStakingManager.CallOpts) } +// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// +// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetActiveValidator(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "getActiveValidator", nodeID) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// +// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) GetActiveValidator(nodeID [32]byte) ([32]byte, error) { + return _NativeTokenStakingManager.Contract.GetActiveValidator(&_NativeTokenStakingManager.CallOpts, nodeID) +} + +// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// +// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) GetActiveValidator(nodeID [32]byte) ([32]byte, error) { + return _NativeTokenStakingManager.Contract.GetActiveValidator(&_NativeTokenStakingManager.CallOpts, nodeID) +} + // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. // // Solidity: function valueToWeight(uint256 value) pure returns(uint64) diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 2a881915a..2028b3960 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -38,8 +38,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612d67380380612d6783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c1a8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b83660046123bb565b6101b1565b005b6100d26100cd36600461247f565b6103a9565b6040519081526020015b60405180910390f35b6100bd6103c9565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f3660046123bb565b6103dc565b6100bd610152366004612535565b6103e9565b6101196005600160991b0181565b6100bd6101733660046123bb565b610702565b6100bd610186366004612569565b610816565b6100bd6101993660046125a5565b610924565b6100bd6101ac3660046125cd565b61095e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612bee83398151915293929190829060ff166005811115610212576102126125f7565b6005811115610223576102236125f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102ba576102ba6125f7565b146103245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f610335848361010001515f610d92565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061036290849060040161262d565b6020604051808303815f875af115801561037e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a2919061265f565b5050505050565b5f6103b2610faf565b6103be8486858561100a565b90505b949350505050565b6103d1610faf565b6103da5f61148e565b565b6103e6815f6114fe565b50565b5f5f80516020612bee8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610444573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261046b9190810190612681565b915091508061048c5760405162461bcd60e51b815260040161031b90612753565b82548251146104ef5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161031b565b60208201516001600160a01b0316156105625760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161031b565b5f8061057184604001516118b2565b91509150806105d35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161031b565b5f828152600586016020526040812080546105ed90612799565b905011801561061f575060015f83815260068701602052604090205460ff16600581111561061d5761061d6125f7565b145b61063b5760405162461bcd60e51b815260040161031b906127d1565b5f828152600586016020526040812061065391612371565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612bee83398151915292919061074a90612799565b905011801561077c575060015f83815260068301602052604090205460ff16600581111561077a5761077a6125f7565b145b6107985760405162461bcd60e51b815260040161031b906127d1565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107d19190600401612818565b6020604051808303815f875af11580156107ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610811919061265f565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561085a5750825b90505f826001600160401b031660011480156108755750303b155b905081158015610883575080155b156108a15760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108cb57845460ff60401b1916600160401b1785555b6108d58787611a53565b831561091b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61092c610faf565b6001600160a01b03811661095557604051631e4fbdf760e01b81525f600482015260240161031b565b6103e68161148e565b5f5f80516020612bee8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156109b9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109e09190810190612681565b9150915080610a015760405162461bcd60e51b815260040161031b90612753565b5f8415610a85575f610a168460400151611a71565b919350909150506001600160401b03811615610a7f5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161031b565b50610afb565b5f610a9384604001516118b2565b90925090508015610af95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161031b565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610b2d57610b2d6125f7565b6005811115610b3e57610b3e6125f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610bef5760405162461bcd60e51b815260040161031b906128a2565b5f600382516005811115610c0557610c056125f7565b1480610c235750600282516005811115610c2157610c216125f7565b145b15610c4657506020808201515f9081526007870190915260408120556004610c4a565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610c7b57610c7b6125f7565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610e0b57610dcb816001612902565b610dd690600861291b565b5081515f90839083908110610ded57610ded612932565b60200101906001600160f81b03191690815f1a905350600101610db7565b505f5b6004811015610e6e57610e22816003612902565b610e2d90600861291b565b6001901c60f81b82610e40836002612946565b81518110610e5057610e50612932565b60200101906001600160f81b03191690815f1a905350600101610e0e565b505f5b6020811015610ed057610e8581601f612902565b610e9090600861291b565b86901c60f81b82610ea2836006612946565b81518110610eb257610eb2612932565b60200101906001600160f81b03191690815f1a905350600101610e71565b505f5b6008811015610f3b57610ee7816007612902565b610ef290600861291b565b6001600160401b038616901c60f81b82610f0d836026612946565b81518110610f1d57610f1d612932565b60200101906001600160f81b03191690815f1a905350600101610ed3565b505f5b6008811015610fa657610f52816007612902565b610f5d90600861291b565b6001600160401b038516901c60f81b82610f7883602e612946565b81518110610f8857610f88612932565b60200101906001600160f81b03191690815f1a905350600101610f3e565b50949350505050565b33610fe17f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103da5760405163118cdaa760e01b815233600482015260240161031b565b5f611013611cac565b5f80516020612bee833981519152426001600160401b03851611801561104d57506001600160401b03841661104b426202a300612946565b115b6110af5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161031b565b856111065760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161031b565b5f868152600782016020526040902054156111745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161031b565b82516030146111db5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161031b565b6111e485611cf6565b5f8061122b6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611e97565b5f82815260058601602052604090209193509150611249828261299d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061127690859060040161262d565b6020604051808303815f875af1158015611292573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b6919061265f565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff1916600183600581111561133c5761133c6125f7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103c160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612bee83398151915293929190829060ff16600581111561155f5761155f6125f7565b6005811115611570576115706125f7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561160a5761160a6125f7565b146116665760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161031b565b60c08101516001600160a01b0316336001600160a01b03161461169b5760405162461bcd60e51b815260040161031b906128a2565b6116a88160400151611cf6565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff191660018360058111156116f4576116f46125f7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f906117e590869083610d92565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061181490859060040161262d565b6020604051808303815f875af1158015611830573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611854919061265f565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f8082516027146118d55760405162461bcd60e51b815260040161031b90612a5c565b5f805b6002811015611924576118ec816001612902565b6118f790600861291b565b61ffff1685828151811061190d5761190d612932565b016020015160f81c901b91909117906001016118d8565b5061ffff8116156119475760405162461bcd60e51b815260040161031b90612aa5565b5f805b60048110156119a25761195e816003612902565b61196990600861291b565b63ffffffff168661197b836002612946565b8151811061198b5761198b612932565b016020015160f81c901b919091179060010161194a565b5063ffffffff81166002146119c95760405162461bcd60e51b815260040161031b90612ae8565b5f805b6020811015611a1e576119e081601f612902565b6119eb90600861291b565b876119f7836006612946565b81518110611a0757611a07612932565b016020015160f81c901b91909117906001016119cc565b505f86602681518110611a3357611a33612932565b016020015191976001600160f81b03199092161515965090945050505050565b611a5b612262565b611a64826122ab565b611a6d816122cc565b5050565b5f805f8351603614611a955760405162461bcd60e51b815260040161031b90612a5c565b5f805b6002811015611ae457611aac816001612902565b611ab790600861291b565b61ffff16868281518110611acd57611acd612932565b016020015160f81c901b9190911790600101611a98565b5061ffff811615611b075760405162461bcd60e51b815260040161031b90612aa5565b5f805b6004811015611b6257611b1e816003612902565b611b2990600861291b565b63ffffffff1687611b3b836002612946565b81518110611b4b57611b4b612932565b016020015160f81c901b9190911790600101611b0a565b5063ffffffff8116600114611b895760405162461bcd60e51b815260040161031b90612ae8565b5f805b6020811015611bde57611ba081601f612902565b611bab90600861291b565b88611bb7836006612946565b81518110611bc757611bc7612932565b016020015160f81c901b9190911790600101611b8c565b505f805b6008811015611c3d57611bf6816007612902565b611c0190600861291b565b6001600160401b031689611c16836026612946565b81518110611c2657611c26612932565b016020015160f81c901b9190911790600101611be2565b505f805b6008811015611c9c57611c55816007612902565b611c6090600861291b565b6001600160401b03168a611c7583602e612946565b81518110611c8557611c85612932565b016020015160f81c901b9190911790600101611c41565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611cf057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612bee8339815191529060ff165f03611d34575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611d7c9083612902565b10611d98576001600160401b0384166040830152808252611db7565b8382604001818151611daa9190612b2f565b6001600160401b03169052505b5f826020015183604001516064611dce9190612b56565b611dd89190612b81565b600285015490915060ff9081169082161115611e535760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161031b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611f015760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161031b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611f7857611f38816001612902565b611f4390600861291b565b5081515f90839083908110611f5a57611f5a612932565b60200101906001600160f81b03191690815f1a905350600101611f24565b505f5b6004811015611fd657611f8f816003612902565b611f9a90600861291b565b505f82611fa8836002612946565b81518110611fb857611fb8612932565b60200101906001600160f81b03191690815f1a905350600101611f7b565b505f5b60208110156120335784518160208110611ff557611ff5612932565b1a60f81b82612005836006612946565b8151811061201557612015612932565b60200101906001600160f81b03191690815f1a905350600101611fd9565b505f5b6020811015612093578460200151816020811061205557612055612932565b1a60f81b82612065836026612946565b8151811061207557612075612932565b60200101906001600160f81b03191690815f1a905350600101612036565b505f5b6008811015612107576120aa816007612902565b6120b590600861291b565b60ff1685604001516001600160401b0316901c60f81b828260466120d99190612946565b815181106120e9576120e9612932565b60200101906001600160f81b03191690815f1a905350600101612096565b505f5b6030811015612172578460800151818151811061212957612129612932565b01602001516001600160f81b0319168261214483604e612946565b8151811061215457612154612932565b60200101906001600160f81b03191690815f1a90535060010161210a565b505f5b60088110156121e457612189816007612902565b61219490600861291b565b60608601516001600160401b0390811691161c60f81b826121b683607e612946565b815181106121c6576121c6612932565b60200101906001600160f81b03191690815f1a905350600101612175565b506002816040516121f59190612bb2565b602060405180830381855afa158015612210573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612233919061265f565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103da57604051631afcd79f60e31b815260040160405180910390fd5b6122b3612262565b6122bb6122dd565b6122c36122ed565b6103e6816122f5565b6122d4612262565b6103e681612361565b6122e5612262565b6103da612369565b6103da612262565b6122fd612262565b80355f80516020612bee83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123476060830160408401612bcd565b600291909101805460ff191660ff90921691909117905550565b61092c612262565b61223c612262565b50805461237d90612799565b5f825580601f1061238c575050565b601f0160209004905f5260205f20908101906103e691905b808211156123b7575f81556001016123a4565b5090565b5f602082840312156123cb575f80fd5b5035919050565b80356001600160401b03811681146123e8575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612423576124236123ed565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612451576124516123ed565b604052919050565b5f6001600160401b03821115612471576124716123ed565b50601f01601f191660200190565b5f805f8060808587031215612492575f80fd5b61249b856123d2565b9350602085013592506124b0604086016123d2565b915060608501356001600160401b038111156124ca575f80fd5b8501601f810187136124da575f80fd5b80356124ed6124e882612459565b612429565b818152886020838501011115612501575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146123e8575f80fd5b5f60208284031215612545575f80fd5b61254e82612522565b9392505050565b6001600160a01b03811681146103e6575f80fd5b5f80828403608081121561257b575f80fd5b6060811215612588575f80fd5b50829150606083013561259a81612555565b809150509250929050565b5f602082840312156125b5575f80fd5b813561254e81612555565b80151581146103e6575f80fd5b5f80604083850312156125de575f80fd5b6125e783612522565b9150602083013561259a816125c0565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561262557818101518382015260200161260d565b50505f910152565b602081525f825180602084015261264b81604085016020870161260b565b601f01601f19169190910160400192915050565b5f6020828403121561266f575f80fd5b5051919050565b80516123e8816125c0565b5f8060408385031215612692575f80fd5b82516001600160401b03808211156126a8575f80fd5b90840190606082870312156126bb575f80fd5b6126c3612401565b825181526020808401516126d681612555565b828201526040840151838111156126eb575f80fd5b80850194505087601f8501126126ff575f80fd5b8351925061270f6124e884612459565b8381528882858701011115612722575f80fd5b6127318483830184880161260b565b80604084015250819550612746818801612676565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c908216806127ad57607f821691505b6020821081036127cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461282a81612799565b806020870152604060018084165f811461284b576001811461286757612894565b60ff19851660408a0152604084151560051b8a01019550612894565b895f5260205f205f5b8581101561288b5781548b8201860152908301908801612870565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612915576129156128ee565b92915050565b8082028115828204841417612915576129156128ee565b634e487b7160e01b5f52603260045260245ffd5b80820180821115612915576129156128ee565b601f82111561081157805f5260205f20601f840160051c8101602085101561297e5750805b601f840160051c820191505b818110156103a2575f815560010161298a565b81516001600160401b038111156129b6576129b66123ed565b6129ca816129c48454612799565b84612959565b602080601f8311600181146129fd575f84156129e65750858301515b5f19600386901b1c1916600185901b178555612a54565b5f85815260208120601f198616915b82811015612a2b57888601518255948401946001909101908401612a0c565b5085821015612a4857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612b4f57612b4f6128ee565b5092915050565b6001600160401b03818116838216028082169190828114612b7957612b796128ee565b505092915050565b5f6001600160401b0380841680612ba657634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612bc381846020870161260b565b9190910192915050565b5f60208284031215612bdd575f80fd5b813560ff8116811461254e575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveValidator\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612db0380380612db083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c638061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c8063a3a65e481161006e578063a3a65e481461018d578063b771b3bc146101a0578063bee0a03f146101ae578063c151c0b9146101c1578063f2fde38b146101d4578063fdf94a1a146101e7575f80fd5b80630322ed98146100b55780633aaa9f25146100ca578063687e8420146100f0578063715018a61461012e5780638da5cb5b1461013657806397fb70d41461017a575b5f80fd5b6100c86100c3366004612404565b6101fa565b005b6100dd6100d83660046124c8565b6103f2565b6040519081526020015b60405180910390f35b6100dd6100fe366004612404565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6100c8610412565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100e7565b6100c8610188366004612404565b610425565b6100c861019b36600461257e565b610432565b6101626005600160991b0181565b6100c86101bc366004612404565b61074b565b6100c86101cf3660046125b2565b61085f565b6100c86101e23660046125ee565b61096d565b6100c86101f5366004612616565b6109a7565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612c3783398151915293929190829060ff16600581111561025b5761025b612640565b600581111561026c5761026c612640565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561030357610303612640565b1461036d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61037e848361010001515f610ddb565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ab908490600401612676565b6020604051808303815f875af11580156103c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103eb91906126a8565b5050505050565b5f6103fb610ff8565b61040784868585611053565b90505b949350505050565b61041a610ff8565b6104235f6114d7565b565b61042f815f611547565b50565b5f5f80516020612c378339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561048d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104b491908101906126ca565b91509150806104d55760405162461bcd60e51b81526004016103649061279c565b82548251146105385760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610364565b60208201516001600160a01b0316156105ab5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610364565b5f806105ba84604001516118fb565b915091508061061c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610364565b5f82815260058601602052604081208054610636906127e2565b9050118015610668575060015f83815260068701602052604090205460ff16600581111561066657610666612640565b145b6106845760405162461bcd60e51b81526004016103649061281a565b5f828152600586016020526040812061069c916123ba565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612c37833981519152929190610793906127e2565b90501180156107c5575060015f83815260068301602052604090205460ff1660058111156107c3576107c3612640565b145b6107e15760405162461bcd60e51b81526004016103649061281a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161081a9190600401612861565b6020604051808303815f875af1158015610836573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085a91906126a8565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108a35750825b90505f826001600160401b031660011480156108be5750303b155b9050811580156108cc575080155b156108ea5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561091457845460ff60401b1916600160401b1785555b61091e8787611a9c565b831561096457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610975610ff8565b6001600160a01b03811661099e57604051631e4fbdf760e01b81525f6004820152602401610364565b61042f816114d7565b5f5f80516020612c378339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610a02573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a2991908101906126ca565b9150915080610a4a5760405162461bcd60e51b81526004016103649061279c565b5f8415610ace575f610a5f8460400151611aba565b919350909150506001600160401b03811615610ac85760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610364565b50610b44565b5f610adc84604001516118fb565b90925090508015610b425760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610364565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610b7657610b76612640565b6005811115610b8757610b87612640565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610c385760405162461bcd60e51b8152600401610364906128eb565b5f600382516005811115610c4e57610c4e612640565b1480610c6c5750600282516005811115610c6a57610c6a612640565b145b15610c8f57506020808201515f9081526007870190915260408120556004610c93565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610cc457610cc4612640565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610e5457610e1481600161294b565b610e1f906008612964565b5081515f90839083908110610e3657610e3661297b565b60200101906001600160f81b03191690815f1a905350600101610e00565b505f5b6004811015610eb757610e6b81600361294b565b610e76906008612964565b6001901c60f81b82610e8983600261298f565b81518110610e9957610e9961297b565b60200101906001600160f81b03191690815f1a905350600101610e57565b505f5b6020811015610f1957610ece81601f61294b565b610ed9906008612964565b86901c60f81b82610eeb83600661298f565b81518110610efb57610efb61297b565b60200101906001600160f81b03191690815f1a905350600101610eba565b505f5b6008811015610f8457610f3081600761294b565b610f3b906008612964565b6001600160401b038616901c60f81b82610f5683602661298f565b81518110610f6657610f6661297b565b60200101906001600160f81b03191690815f1a905350600101610f1c565b505f5b6008811015610fef57610f9b81600761294b565b610fa6906008612964565b6001600160401b038516901c60f81b82610fc183602e61298f565b81518110610fd157610fd161297b565b60200101906001600160f81b03191690815f1a905350600101610f87565b50949350505050565b3361102a7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104235760405163118cdaa760e01b8152336004820152602401610364565b5f61105c611cf5565b5f80516020612c37833981519152426001600160401b03851611801561109657506001600160401b038416611094426202a30061298f565b115b6110f85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610364565b8561114f5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610364565b5f868152600782016020526040902054156111bd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610364565b82516030146112245760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610364565b61122d85611d3f565b5f806112746040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611ee0565b5f8281526005860160205260409020919350915061129282826129e6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112bf908590600401612676565b6020604051808303815f875af11580156112db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112ff91906126a8565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff1916600183600581111561138557611385612640565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061040a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612c3783398151915293929190829060ff1660058111156115a8576115a8612640565b60058111156115b9576115b9612640565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561165357611653612640565b146116af5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610364565b60c08101516001600160a01b0316336001600160a01b0316146116e45760405162461bcd60e51b8152600401610364906128eb565b6116f18160400151611d3f565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff1916600183600581111561173d5761173d612640565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f9061182e90869083610ddb565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061185d908590600401612676565b6020604051808303815f875af1158015611879573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061189d91906126a8565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f80825160271461191e5760405162461bcd60e51b815260040161036490612aa5565b5f805b600281101561196d5761193581600161294b565b611940906008612964565b61ffff168582815181106119565761195661297b565b016020015160f81c901b9190911790600101611921565b5061ffff8116156119905760405162461bcd60e51b815260040161036490612aee565b5f805b60048110156119eb576119a781600361294b565b6119b2906008612964565b63ffffffff16866119c483600261298f565b815181106119d4576119d461297b565b016020015160f81c901b9190911790600101611993565b5063ffffffff8116600214611a125760405162461bcd60e51b815260040161036490612b31565b5f805b6020811015611a6757611a2981601f61294b565b611a34906008612964565b87611a4083600661298f565b81518110611a5057611a5061297b565b016020015160f81c901b9190911790600101611a15565b505f86602681518110611a7c57611a7c61297b565b016020015191976001600160f81b03199092161515965090945050505050565b611aa46122ab565b611aad826122f4565b611ab681612315565b5050565b5f805f8351603614611ade5760405162461bcd60e51b815260040161036490612aa5565b5f805b6002811015611b2d57611af581600161294b565b611b00906008612964565b61ffff16868281518110611b1657611b1661297b565b016020015160f81c901b9190911790600101611ae1565b5061ffff811615611b505760405162461bcd60e51b815260040161036490612aee565b5f805b6004811015611bab57611b6781600361294b565b611b72906008612964565b63ffffffff1687611b8483600261298f565b81518110611b9457611b9461297b565b016020015160f81c901b9190911790600101611b53565b5063ffffffff8116600114611bd25760405162461bcd60e51b815260040161036490612b31565b5f805b6020811015611c2757611be981601f61294b565b611bf4906008612964565b88611c0083600661298f565b81518110611c1057611c1061297b565b016020015160f81c901b9190911790600101611bd5565b505f805b6008811015611c8657611c3f81600761294b565b611c4a906008612964565b6001600160401b031689611c5f83602661298f565b81518110611c6f57611c6f61297b565b016020015160f81c901b9190911790600101611c2b565b505f805b6008811015611ce557611c9e81600761294b565b611ca9906008612964565b6001600160401b03168a611cbe83602e61298f565b81518110611cce57611cce61297b565b016020015160f81c901b9190911790600101611c8a565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611d3957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612c378339815191529060ff165f03611d7d575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611dc5908361294b565b10611de1576001600160401b0384166040830152808252611e00565b8382604001818151611df39190612b78565b6001600160401b03169052505b5f826020015183604001516064611e179190612b9f565b611e219190612bca565b600285015490915060ff9081169082161115611e9c5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610364565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611f4a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610364565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611fc157611f8181600161294b565b611f8c906008612964565b5081515f90839083908110611fa357611fa361297b565b60200101906001600160f81b03191690815f1a905350600101611f6d565b505f5b600481101561201f57611fd881600361294b565b611fe3906008612964565b505f82611ff183600261298f565b815181106120015761200161297b565b60200101906001600160f81b03191690815f1a905350600101611fc4565b505f5b602081101561207c578451816020811061203e5761203e61297b565b1a60f81b8261204e83600661298f565b8151811061205e5761205e61297b565b60200101906001600160f81b03191690815f1a905350600101612022565b505f5b60208110156120dc578460200151816020811061209e5761209e61297b565b1a60f81b826120ae83602661298f565b815181106120be576120be61297b565b60200101906001600160f81b03191690815f1a90535060010161207f565b505f5b6008811015612150576120f381600761294b565b6120fe906008612964565b60ff1685604001516001600160401b0316901c60f81b82826046612122919061298f565b815181106121325761213261297b565b60200101906001600160f81b03191690815f1a9053506001016120df565b505f5b60308110156121bb57846080015181815181106121725761217261297b565b01602001516001600160f81b0319168261218d83604e61298f565b8151811061219d5761219d61297b565b60200101906001600160f81b03191690815f1a905350600101612153565b505f5b600881101561222d576121d281600761294b565b6121dd906008612964565b60608601516001600160401b0390811691161c60f81b826121ff83607e61298f565b8151811061220f5761220f61297b565b60200101906001600160f81b03191690815f1a9053506001016121be565b5060028160405161223e9190612bfb565b602060405180830381855afa158015612259573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061227c91906126a8565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661042357604051631afcd79f60e31b815260040160405180910390fd5b6122fc6122ab565b612304612326565b61230c612336565b61042f8161233e565b61231d6122ab565b61042f816123aa565b61232e6122ab565b6104236123b2565b6104236122ab565b6123466122ab565b80355f80516020612c3783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123906060830160408401612c16565b600291909101805460ff191660ff90921691909117905550565b6109756122ab565b6122856122ab565b5080546123c6906127e2565b5f825580601f106123d5575050565b601f0160209004905f5260205f209081019061042f91905b80821115612400575f81556001016123ed565b5090565b5f60208284031215612414575f80fd5b5035919050565b80356001600160401b0381168114612431575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561246c5761246c612436565b60405290565b604051601f8201601f191681016001600160401b038111828210171561249a5761249a612436565b604052919050565b5f6001600160401b038211156124ba576124ba612436565b50601f01601f191660200190565b5f805f80608085870312156124db575f80fd5b6124e48561241b565b9350602085013592506124f96040860161241b565b915060608501356001600160401b03811115612513575f80fd5b8501601f81018713612523575f80fd5b8035612536612531826124a2565b612472565b81815288602083850101111561254a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff81168114612431575f80fd5b5f6020828403121561258e575f80fd5b6125978261256b565b9392505050565b6001600160a01b038116811461042f575f80fd5b5f8082840360808112156125c4575f80fd5b60608112156125d1575f80fd5b5082915060608301356125e38161259e565b809150509250929050565b5f602082840312156125fe575f80fd5b81356125978161259e565b801515811461042f575f80fd5b5f8060408385031215612627575f80fd5b6126308361256b565b915060208301356125e381612609565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561266e578181015183820152602001612656565b50505f910152565b602081525f8251806020840152612694816040850160208701612654565b601f01601f19169190910160400192915050565b5f602082840312156126b8575f80fd5b5051919050565b805161243181612609565b5f80604083850312156126db575f80fd5b82516001600160401b03808211156126f1575f80fd5b9084019060608287031215612704575f80fd5b61270c61244a565b8251815260208084015161271f8161259e565b82820152604084015183811115612734575f80fd5b80850194505087601f850112612748575f80fd5b83519250612758612531846124a2565b838152888285870101111561276b575f80fd5b61277a84838301848801612654565b8060408401525081955061278f8188016126bf565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c908216806127f657607f821691505b60208210810361281457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612873816127e2565b806020870152604060018084165f811461289457600181146128b0576128dd565b60ff19851660408a0152604084151560051b8a010195506128dd565b895f5260205f205f5b858110156128d45781548b82018601529083019088016128b9565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561295e5761295e612937565b92915050565b808202811582820484141761295e5761295e612937565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561295e5761295e612937565b601f82111561085a57805f5260205f20601f840160051c810160208510156129c75750805b601f840160051c820191505b818110156103eb575f81556001016129d3565b81516001600160401b038111156129ff576129ff612436565b612a1381612a0d84546127e2565b846129a2565b602080601f831160018114612a46575f8415612a2f5750858301515b5f19600386901b1c1916600185901b178555612a9d565b5f85815260208120601f198616915b82811015612a7457888601518255948401946001909101908401612a55565b5085821015612a9157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612b9857612b98612937565b5092915050565b6001600160401b03818116838216028082169190828114612bc257612bc2612937565b505092915050565b5f6001600160401b0380841680612bef57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612c0c818460208701612654565b9190910192915050565b5f60208284031215612c26575f80fd5b813560ff81168114612597575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -240,6 +240,37 @@ func (_PoAValidatorManager *PoAValidatorManagerCallerSession) WARPMESSENGER() (c return _PoAValidatorManager.Contract.WARPMESSENGER(&_PoAValidatorManager.CallOpts) } +// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// +// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCaller) GetActiveValidator(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "getActiveValidator", nodeID) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// +// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerSession) GetActiveValidator(nodeID [32]byte) ([32]byte, error) { + return _PoAValidatorManager.Contract.GetActiveValidator(&_PoAValidatorManager.CallOpts, nodeID) +} + +// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// +// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) GetActiveValidator(nodeID [32]byte) ([32]byte, error) { + return _PoAValidatorManager.Contract.GetActiveValidator(&_PoAValidatorManager.CallOpts, nodeID) +} + // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) diff --git a/abi-bindings/go/teleporter/TeleporterMessenger/TeleporterMessenger.go b/abi-bindings/go/teleporter/TeleporterMessenger/TeleporterMessenger.go index ec3a807f9..805c6ddc4 100644 --- a/abi-bindings/go/teleporter/TeleporterMessenger/TeleporterMessenger.go +++ b/abi-bindings/go/teleporter/TeleporterMessenger/TeleporterMessenger.go @@ -65,8 +65,8 @@ 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\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x6080604052348015600e575f80fd5b5060015f8190558055612fbd806100245f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c8063a8898181116100bf578063df20e8bc11610079578063df20e8bc14610331578063e69d606a14610344578063e6e67bd5146103ab578063ebc3b1ba146103e6578063ecc7042814610409578063fc2d619714610412575f80fd5b8063a8898181146102a9578063a9a85614146102bc578063b771b3bc146102cf578063c473eef8146102dd578063ccb5f80914610315578063d127dc9b14610328575f80fd5b8063399b77da11610110578063399b77da1461021257806362448850146102315780638245a1b014610244578063860a3b0614610257578063892bf412146102765780638ac0fd0414610296575f80fd5b80630af5b4ff1461014c57806322296c3a146101675780632bc8b0bf1461017c5780632ca40f551461018f5780632e27c223146101e7575b5f80fd5b610154610425565b6040519081526020015b60405180910390f35b61017a610175366004612014565b6104f3565b005b61015461018a36600461202f565b6105e6565b6101d961019d36600461202f565b600560209081525f9182526040918290208054835180850190945260018201546001600160a01b03168452600290910154918301919091529082565b60405161015e929190612046565b6101fa6101f536600461202f565b610602565b6040516001600160a01b03909116815260200161015e565b61015461022036600461202f565b5f9081526005602052604090205490565b61015461023f36600461206d565b610689565b61017a6102523660046120ba565b6106e2565b61015461026536600461202f565b60066020525f908152604090205481565b6102896102843660046120eb565b610885565b60405161015e919061210b565b61017a6102a436600461212b565b6108b6565b6101546102b7366004612160565b610aed565b6101546102ca3660046121d0565b610b2f565b6101fa6005600160991b0181565b6101546102eb366004612261565b6001600160a01b039182165f90815260096020908152604080832093909416825291909152205490565b61017a610323366004612298565b610dc1565b61015460025481565b61015461033f36600461202f565b6111e3565b61038c61035236600461202f565b5f90815260056020908152604091829020825180840190935260018101546001600160a01b03168084526002909101549290910182905291565b604080516001600160a01b03909316835260208301919091520161015e565b6103d16103b936600461202f565b60046020525f90815260409020805460019091015482565b6040805192835260208301919091520161015e565b6103f96103f436600461202f565b61122a565b604051901515815260200161015e565b61015460035481565b61017a6104203660046122bc565b61123f565b6002545f90806104ee576005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610472573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061049691906122ff565b9050806104be5760405162461bcd60e51b81526004016104b590612316565b60405180910390fd5b600281905560405181907f1eac640109dc937d2a9f42735a05f794b39a5e3759d681951d671aabbce4b104905f90a25b919050565b335f9081526009602090815260408083206001600160a01b0385168452909152902054806105745760405162461bcd60e51b815260206004820152602860248201527f54656c65706f727465724d657373656e6765723a206e6f2072657761726420746044820152676f2072656465656d60c01b60648201526084016104b5565b335f8181526009602090815260408083206001600160a01b03871680855290835281842093909355518481529192917f3294c84e5b0f29d9803655319087207bc94f4db29f7927846944822773780b88910160405180910390a36105e26001600160a01b0383163383611494565b5050565b5f8181526004602052604081206105fc906114f8565b92915050565b5f8181526007602052604081205461066e5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a206d657373616765206e6f74604482015268081c9958d95a5d995960ba1b60648201526084016104b5565b505f908152600860205260409020546001600160a01b031690565b5f60015f54146106ab5760405162461bcd60e51b81526004016104b59061235d565b60025f556106d86106bb836125b6565b83355f9081526004602052604090206106d39061150a565b611604565b60015f5592915050565b60015f54146107035760405162461bcd60e51b81526004016104b59061235d565b60025f818155905461071b9060408401358435610aed565b5f818152600560209081526040918290208251808401845281548152835180850190945260018201546001600160a01b0316845260029091015483830152908101919091528051919250906107825760405162461bcd60e51b81526004016104b590612655565b5f8360405160200161079491906128de565b60408051601f19818403018152919052825181516020830120919250146107cd5760405162461bcd60e51b81526004016104b5906128f0565b8360400135837f2a211ad4a59ab9d003852404f9c57c690704ee755f3c79d2c2812ad32da99df8868560200151604051610808929190612939565b60405180910390a360405163ee5b48eb60e01b81526005600160991b019063ee5b48eb9061083a9084906004016129ba565b6020604051808303815f875af1158015610856573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087a91906122ff565b505060015f55505050565b604080518082019091525f80825260208201525f8381526004602052604090206108af9083611837565b9392505050565b60015f54146108d75760405162461bcd60e51b81526004016104b59061235d565b60025f5560018054146108fc5760405162461bcd60e51b81526004016104b5906129cc565b6002600155806109665760405162461bcd60e51b815260206004820152602f60248201527f54656c65706f727465724d657373656e6765723a207a65726f2061646469746960448201526e1bdb985b0819995948185b5bdd5b9d608a1b60648201526084016104b5565b6001600160a01b03821661098c5760405162461bcd60e51b81526004016104b590612a11565b5f838152600560205260409020546109b65760405162461bcd60e51b81526004016104b590612655565b5f838152600560205260409020600101546001600160a01b03838116911614610a475760405162461bcd60e51b815260206004820152603760248201527f54656c65706f727465724d657373656e6765723a20696e76616c69642066656560448201527f20617373657420636f6e7472616374206164647265737300000000000000000060648201526084016104b5565b5f610a5283836118f8565b5f85815260056020526040812060020180549293508392909190610a77908490612a79565b90915550505f8481526005602052604090819020905185917fc1bfd1f1208927dfbd414041dcb5256e6c9ad90dd61aec3249facbd34ff7b3e191610ad8916001019081546001600160a01b0316815260019190910154602082015260400190565b60405180910390a2505060018080555f555050565b6040805130602082015290810184905260608101839052608081018290525f9060a0016040516020818303038152906040528051906020012090509392505050565b5f60015f5414610b515760405162461bcd60e51b81526004016104b59061235d565b60025f818155905490866001600160401b03811115610b7257610b726123a0565b604051908082528060200260200182016040528015610bb657816020015b604080518082019091525f8082526020820152815260200190600190039081610b905790505b509050865f5b81811015610d2e575f8a8a83818110610bd757610bd7612a8c565b9050602002013590505f60075f8381526020019081526020015f20549050805f03610c535760405162461bcd60e51b815260206004820152602660248201527f54656c65706f727465724d657373656e6765723a2072656365697074206e6f7460448201526508199bdd5b9960d21b60648201526084016104b5565b610c5e8d8783610aed565b8214610cd25760405162461bcd60e51b815260206004820152603a60248201527f54656c65706f727465724d657373656e6765723a206d6573736167652049442060448201527f6e6f742066726f6d20736f7572636520626c6f636b636861696e00000000000060648201526084016104b5565b5f828152600860209081526040918290205482518084019093528383526001600160a01b03169082018190528651909190879086908110610d1557610d15612a8c565b6020026020010181905250505050806001019050610bbc565b506040805160c0810182528b81525f6020820152610daf918101610d57368b90038b018b612aa0565b81526020015f81526020018888808060200260200160405190810160405280939291908181526020018383602002808284375f9201829052509385525050604080519283526020808401909152909201525083611604565b60015f559a9950505050505050505050565b6001805414610de25760405162461bcd60e51b81526004016104b5906129cc565b60026001556040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610e30573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610e579190810190612b07565b9150915080610eba5760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104b5565b60208201516001600160a01b03163014610f315760405162461bcd60e51b815260206004820152603260248201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104b5565b5f8260400151806020019051810190610f4a9190612c83565b90505f610f55610425565b905080826040015114610fc45760405162461bcd60e51b815260206004820152603160248201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206465736044820152701d1a5b985d1a5bdb8818da185a5b881251607a1b60648201526084016104b5565b835182515f91610fd5918490610aed565b5f81815260076020526040902054909150156110495760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f727465724d657373656e6765723a206d65737361676520616c7260448201526c1958591e481c9958d95a5d9959609a1b60648201526084016104b5565b611057338460a00151611a5a565b6110b55760405162461bcd60e51b815260206004820152602960248201527f54656c65706f727465724d657373656e6765723a20756e617574686f72697a6560448201526832103932b630bcb2b960b91b60648201526084016104b5565b6110c281845f0151611ac6565b6001600160a01b038616156110f8575f81815260086020526040902080546001600160a01b0319166001600160a01b0388161790555b60c0830151515f5b8181101561113b5761113384885f01518760c00151848151811061112657611126612a8c565b6020026020010151611b36565b600101611100565b50604080518082018252855181526001600160a01b03891660208083019190915288515f90815260049091529190912061117491611c5a565b336001600160a01b0316865f0151837f292ee90bbaf70b5d4936025e09d56ba08f3e421156b6a568cf3c2840d9343e348a886040516111b4929190612e89565b60405180910390a460e084015151156111d5576111d582875f015186611cb4565b505060018055505050505050565b6002545f90806112055760405162461bcd60e51b81526004016104b590612316565b5f60035460016112159190612a79565b9050611222828583610aed565b949350505050565b5f8181526007602052604081205415156105fc565b60018054146112605760405162461bcd60e51b81526004016104b5906129cc565b60026001819055545f906112779084908435610aed565b5f81815260066020526040902054909150806112a55760405162461bcd60e51b81526004016104b590612655565b80836040516020016112b791906128de565b60405160208183030381529060405280519060200120146112ea5760405162461bcd60e51b81526004016104b5906128f0565b5f6112fb6080850160608601612014565b6001600160a01b03163b1161136f5760405162461bcd60e51b815260206004820152603460248201527f54656c65706f727465724d657373656e6765723a2064657374696e6174696f6e604482015273206164647265737320686173206e6f20636f646560601b60648201526084016104b5565b604051849083907f34795cc6b122b9a0ae684946319f1e14a577b4e8f9b3dda9ac94c21a54d3188c905f90a35f82815260066020908152604080832083905586916113be918701908701612014565b6113cb60e0870187612eac565b6040516024016113de9493929190612eee565b60408051601f198184030181529190526020810180516001600160e01b031663643477d560e11b17905290505f61142561141e6080870160608801612014565b5a84611de3565b9050806114885760405162461bcd60e51b815260206004820152602b60248201527f54656c65706f727465724d657373656e6765723a20726574727920657865637560448201526a1d1a5bdb8819985a5b195960aa1b60648201526084016104b5565b50506001805550505050565b6040516001600160a01b038381166024830152604482018390526114f391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611dfa565b505050565b805460018201545f916105fc91612f18565b60605f611520600561151b856114f8565b611e6c565b9050805f0361156c57604080515f8082526020820190925290611564565b604080518082019091525f808252602082015281526020019060019003908161153e5790505b509392505050565b5f816001600160401b03811115611585576115856123a0565b6040519080825280602002602001820160405280156115c957816020015b604080518082019091525f80825260208201528152602001906001900390816115a35790505b5090505f5b82811015611564576115df85611e7b565b8282815181106115f1576115f1612a8c565b60209081029190910101526001016115ce565b5f8061160e610425565b90505f60035f815461161f90612f2b565b91905081905590505f61163683875f015184610aed565b90505f604051806101000160405280848152602001336001600160a01b03168152602001885f0151815260200188602001516001600160a01b0316815260200188606001518152602001886080015181526020018781526020018860a0015181525090505f816040516020016116ac9190612f43565b60405160208183030381529060405290505f808960400151602001511115611713576040890151516001600160a01b03166116f95760405162461bcd60e51b81526004016104b590612a11565b6040890151805160209091015161171091906118f8565b90505b6040805180820182528a820151516001600160a01b03908116825260208083018590528351808501855286518783012081528082018481525f8a815260058452869020915182555180516001830180546001600160a01b03191691909516179093559101516002909101558a51915190919086907f2a211ad4a59ab9d003852404f9c57c690704ee755f3c79d2c2812ad32da99df8906117b69088908690612f55565b60405180910390a360405163ee5b48eb60e01b81526005600160991b019063ee5b48eb906117e89086906004016129ba565b6020604051808303815f875af1158015611804573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061182891906122ff565b50939998505050505050505050565b604080518082019091525f8082526020820152611853836114f8565b82106118ab5760405162461bcd60e51b815260206004820152602160248201527f5265636569707451756575653a20696e646578206f7574206f6620626f756e646044820152607360f81b60648201526084016104b5565b826002015f83855f01546118bf9190612a79565b815260208082019290925260409081015f20815180830190925280548252600101546001600160a01b0316918101919091529392505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561193e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061196291906122ff565b90506119796001600160a01b038516333086611f45565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156119bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119e191906122ff565b9050818111611a475760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104b5565b611a518282612f18565b95945050505050565b5f81515f03611a6b575060016105fc565b81515f5b81811015611abc57846001600160a01b0316848281518110611a9357611a93612a8c565b60200260200101516001600160a01b031603611ab4576001925050506105fc565b600101611a6f565b505f949350505050565b805f03611b255760405162461bcd60e51b815260206004820152602760248201527f54656c65706f727465724d657373656e6765723a207a65726f206d657373616760448201526665206e6f6e636560c81b60648201526084016104b5565b5f9182526007602052604090912055565b5f611b458484845f0151610aed565b5f818152600560209081526040918290208251808401845281548152835180850190945260018201546001600160a01b031684526002909101548383015290810191909152805191925090611b9b575050505050565b5f8281526005602090815260408083208381556001810180546001600160a01b03191690556002018390558382018051830151878401516001600160a01b0390811686526009855283862092515116855292528220805491929091611c01908490612a79565b9250508190555082602001516001600160a01b031684837fd13a7935f29af029349bed0a2097455b91fd06190a30478c575db3f31e00bf578460200151604051611c4b9190612f67565b60405180910390a45050505050565b600182018054829160028501915f9182611c7383612f2b565b9091555081526020808201929092526040015f2082518155910151600190910180546001600160a01b0319166001600160a01b039092169190911790555050565b80608001515a1015611d165760405162461bcd60e51b815260206004820152602560248201527f54656c65706f727465724d657373656e6765723a20696e73756666696369656e604482015264742067617360d81b60648201526084016104b5565b80606001516001600160a01b03163b5f03611d36576114f3838383611f7e565b602081015160e08201516040515f92611d53928692602401612f87565b60408051601f198184030181529190526020810180516001600160e01b031663643477d560e11b179052606083015160808401519192505f91611d97919084611de3565b905080611db057611da9858585611f7e565b5050505050565b604051849086907f34795cc6b122b9a0ae684946319f1e14a577b4e8f9b3dda9ac94c21a54d3188c905f90a35050505050565b5f805f808451602086015f8989f195945050505050565b5f8060205f8451602086015f885af180611e19576040513d5f823e3d81fd5b50505f513d91508115611e30578060011415611e3d565b6001600160a01b0384163b155b15611e6657604051635274afe760e01b81526001600160a01b03851660048201526024016104b5565b50505050565b5f8282188284100282186108af565b604080518082019091525f808252602082015281546001830154819003611ee45760405162461bcd60e51b815260206004820152601960248201527f5265636569707451756575653a20656d7074792071756575650000000000000060448201526064016104b5565b5f8181526002840160208181526040808420815180830190925280548252600180820180546001600160a01b03811685870152888852959094529490556001600160a01b0319909216905590611f3b908390612a79565b9093555090919050565b6040516001600160a01b038481166024830152838116604483015260648201839052611e669186918216906323b872dd906084016114c1565b80604051602001611f8f9190612f43565b60408051601f1981840301815282825280516020918201205f878152600690925291902055829084907f4619adc1017b82e02eaefac01a43d50d6d8de4460774bc370c3ff0210d40c98590611fe5908590612f43565b60405180910390a3505050565b6001600160a01b0381168114612006575f80fd5b50565b80356104ee81611ff2565b5f60208284031215612024575f80fd5b81356108af81611ff2565b5f6020828403121561203f575f80fd5b5035919050565b828152606081016108af602083018480516001600160a01b03168252602090810151910152565b5f6020828403121561207d575f80fd5b81356001600160401b03811115612092575f80fd5b820160e081850312156108af575f80fd5b5f61010082840312156120b4575f80fd5b50919050565b5f602082840312156120ca575f80fd5b81356001600160401b038111156120df575f80fd5b611222848285016120a3565b5f80604083850312156120fc575f80fd5b50508035926020909101359150565b815181526020808301516001600160a01b031690820152604081016105fc565b5f805f6060848603121561213d575f80fd5b83359250602084013561214f81611ff2565b929592945050506040919091013590565b5f805f60608486031215612172575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112612199575f80fd5b5081356001600160401b038111156121af575f80fd5b6020830191508360208260051b85010111156121c9575f80fd5b9250929050565b5f805f805f8086880360a08112156121e6575f80fd5b8735965060208801356001600160401b0380821115612203575f80fd5b61220f8b838c01612189565b90985096508691506040603f1984011215612228575f80fd5b60408a01955060808a0135925080831115612241575f80fd5b505061224f89828a01612189565b979a9699509497509295939492505050565b5f8060408385031215612272575f80fd5b823561227d81611ff2565b9150602083013561228d81611ff2565b809150509250929050565b5f80604083850312156122a9575f80fd5b823563ffffffff8116811461227d575f80fd5b5f80604083850312156122cd575f80fd5b8235915060208301356001600160401b038111156122e9575f80fd5b6122f5858286016120a3565b9150509250929050565b5f6020828403121561230f575f80fd5b5051919050565b60208082526027908201527f54656c65706f727465724d657373656e6765723a207a65726f20626c6f636b636040820152661a185a5b88125160ca1b606082015260800190565b60208082526023908201527f5265656e7472616e63794775617264733a2073656e646572207265656e7472616040820152626e637960e81b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b604080519081016001600160401b03811182821017156123d6576123d66123a0565b60405290565b60405160c081016001600160401b03811182821017156123d6576123d66123a0565b604051606081016001600160401b03811182821017156123d6576123d66123a0565b60405161010081016001600160401b03811182821017156123d6576123d66123a0565b604051601f8201601f191681016001600160401b038111828210171561246b5761246b6123a0565b604052919050565b5f60408284031215612483575f80fd5b61248b6123b4565b9050813561249881611ff2565b808252506020820135602082015292915050565b5f6001600160401b038211156124c4576124c46123a0565b5060051b60200190565b5f82601f8301126124dd575f80fd5b813560206124f26124ed836124ac565b612443565b8083825260208201915060208460051b870101935086841115612513575f80fd5b602086015b8481101561253857803561252b81611ff2565b8352918301918301612518565b509695505050505050565b5f6001600160401b0382111561255b5761255b6123a0565b50601f01601f191660200190565b5f82601f830112612578575f80fd5b81356125866124ed82612543565b81815284602083860101111561259a575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60e082360312156125c6575f80fd5b6125ce6123dc565b823581526125de60208401612009565b60208201526125f03660408501612473565b60408201526080830135606082015260a08301356001600160401b0380821115612618575f80fd5b612624368387016124ce565b608084015260c085013591508082111561263c575f80fd5b5061264936828601612569565b60a08301525092915050565b60208082526026908201527f54656c65706f727465724d657373656e6765723a206d657373616765206e6f7460408201526508199bdd5b9960d21b606082015260800190565b5f808335601e198436030181126126b0575f80fd5b83016020810192503590506001600160401b038111156126ce575f80fd5b8060051b36038213156121c9575f80fd5b8183525f60208085019450825f5b8581101561271b57813561270081611ff2565b6001600160a01b0316875295820195908201906001016126ed565b509495945050505050565b5f808335601e1984360301811261273b575f80fd5b83016020810192503590506001600160401b03811115612759575f80fd5b8060061b36038213156121c9575f80fd5b8183525f60208085019450825f5b8581101561271b57813587528282013561279181611ff2565b6001600160a01b0316878401526040968701969190910190600101612778565b5f808335601e198436030181126127c6575f80fd5b83016020810192503590506001600160401b038111156127e4575f80fd5b8036038213156121c9575f80fd5b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b5f61010082358452602083013561283081611ff2565b6001600160a01b031660208501526040838101359085015261285460608401612009565b6001600160a01b031660608501526080838101359085015261287960a084018461269b565b8260a087015261288c83870182846126df565b9250505061289d60c0840184612726565b85830360c08701526128b083828461276a565b925050506128c160e08401846127b1565b85830360e08701526128d48382846127f2565b9695505050505050565b602081525f6108af602083018461281a565b60208082526029908201527f54656c65706f727465724d657373656e6765723a20696e76616c6964206d65736040820152680e6c2ceca40d0c2e6d60bb1b606082015260800190565b606081525f61294b606083018561281a565b90506108af602083018480516001600160a01b03168252602090810151910152565b5f5b8381101561298757818101518382015260200161296f565b50505f910152565b5f81518084526129a681602086016020860161296d565b601f01601f19169290920160200192915050565b602081525f6108af602083018461298f565b60208082526025908201527f5265656e7472616e63794775617264733a207265636569766572207265656e7460408201526472616e637960d81b606082015260800190565b60208082526034908201527f54656c65706f727465724d657373656e6765723a207a65726f2066656520617360408201527373657420636f6e7472616374206164647265737360601b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156105fc576105fc612a65565b634e487b7160e01b5f52603260045260245ffd5b5f60408284031215612ab0575f80fd5b6108af8383612473565b80516104ee81611ff2565b5f82601f830112612ad4575f80fd5b8151612ae26124ed82612543565b818152846020838601011115612af6575f80fd5b61122282602083016020870161296d565b5f8060408385031215612b18575f80fd5b82516001600160401b0380821115612b2e575f80fd5b9084019060608287031215612b41575f80fd5b612b496123fe565b825181526020830151612b5b81611ff2565b6020820152604083015182811115612b71575f80fd5b612b7d88828601612ac5565b6040830152508094505050506020830151801515811461228d575f80fd5b5f82601f830112612baa575f80fd5b81516020612bba6124ed836124ac565b8083825260208201915060208460051b870101935086841115612bdb575f80fd5b602086015b84811015612538578051612bf381611ff2565b8352918301918301612be0565b5f82601f830112612c0f575f80fd5b81516020612c1f6124ed836124ac565b82815260069290921b84018101918181019086841115612c3d575f80fd5b8286015b848110156125385760408189031215612c58575f80fd5b612c606123b4565b8151815284820151612c7181611ff2565b81860152835291830191604001612c41565b5f60208284031215612c93575f80fd5b81516001600160401b0380821115612ca9575f80fd5b908301906101008286031215612cbd575f80fd5b612cc5612420565b82518152612cd560208401612aba565b602082015260408301516040820152612cf060608401612aba565b60608201526080830151608082015260a083015182811115612d10575f80fd5b612d1c87828601612b9b565b60a08301525060c083015182811115612d33575f80fd5b612d3f87828601612c00565b60c08301525060e083015182811115612d56575f80fd5b612d6287828601612ac5565b60e08301525095945050505050565b5f815180845260208085019450602084015f5b8381101561271b5781516001600160a01b031687529582019590820190600101612d84565b5f815180845260208085019450602084015f5b8381101561271b57612de2878351805182526020908101516001600160a01b0316910152565b6040969096019590820190600101612dbc565b5f6101008251845260018060a01b036020840151166020850152604083015160408501526060830151612e3360608601826001600160a01b03169052565b506080830151608085015260a08301518160a0860152612e5582860182612d71565b91505060c083015184820360c0860152612e6f8282612da9565b91505060e083015184820360e0860152611a51828261298f565b6001600160a01b03831681526040602082018190525f9061122290830184612df5565b5f808335601e19843603018112612ec1575f80fd5b8301803591506001600160401b03821115612eda575f80fd5b6020019150368190038213156121c9575f80fd5b8481526001600160a01b03841660208201526060604082018190525f906128d490830184866127f2565b818103818111156105fc576105fc612a65565b5f60018201612f3c57612f3c612a65565b5060010190565b602081525f6108af6020830184612df5565b606081525f61294b6060830185612df5565b81516001600160a01b0316815260208083015190820152604081016105fc565b8381526001600160a01b03831660208201526060604082018190525f90611a519083018461298f56fea164736f6c6343000819000a", + 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", } // TeleporterMessengerABI 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 7c67a8c3a..d0a8f36dc 100644 --- a/abi-bindings/go/teleporter/tests/TestMessenger/TestMessenger.go +++ b/abi-bindings/go/teleporter/tests/TestMessenger/TestMessenger.go @@ -31,8 +31,8 @@ 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\"}],\"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\":\"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: "0x608060405234801561000f575f80fd5b50604051611c1b380380611c1b83398101604081905261002e9161042d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f811580156100775750825b90505f826001600160401b031660011480156100925750303b155b9050811580156100a0575080155b156100be5760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b031916600117855583156100ec57845460ff60401b1916680100000000000000001785555b6100f4610150565b6100fe8787610162565b831561014457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050610475565b610158610180565b6101606101ce565b565b61016a610180565b610173826101fc565b61017c81610220565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661016057604051631afcd79f60e31b815260040160405180910390fd5b6101d6610180565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610204610180565b61020c610150565b610214610231565b61021d81610239565b50565b610228610180565b61021d8161036a565b610160610180565b610241610180565b6001600160a01b0381166102c25760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2074656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084015b60405180910390fd5b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546001600160a01b0319166001600160a01b03831690811782556040805163301fd1f560e21b8152905184929163c07f47d49160048083019260209291908290030181865afa158015610339573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035d919061045e565b8260020181905550505050565b610372610180565b6001600160a01b03811661039b57604051631e4fbdf760e01b81525f60048201526024016102b9565b61021d815f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b80516001600160a01b0381168114610428575f80fd5b919050565b5f806040838503121561043e575f80fd5b61044783610412565b915061045560208401610412565b90509250929050565b5f6020828403121561046e575f80fd5b5051919050565b611799806104825f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c8063973142971161006e5780639731429714610159578063b33fead41461017c578063c868efaa1461019d578063d2cc7a70146101b0578063f2fde38b146101d7578063f63d09d7146101ea575f80fd5b80632b0d8f18146100b55780634511243e146100ca5780635eb99514146100dd578063715018a6146100f05780638da5cb5b146100f8578063909a6ac014610137575b5f80fd5b6100c86100c33660046111bc565b6101fd565b005b6100c86100d83660046111bc565b6102ff565b6100c86100eb3660046111d7565b6103ee565b6100c8610402565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020015b60405180910390f35b61014b5f8051602061176d83398151915281565b60405190815260200161012e565b61016c6101673660046111bc565b610415565b604051901515815260200161012e565b61018f61018a3660046111d7565b610435565b60405161012e92919061123b565b6100c86101ab3660046112ab565b610507565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d025461014b565b6100c86101e53660046111bc565b6106e5565b61014b6101f8366004611303565b61071f565b5f8051602061176d83398151915261021361087b565b6001600160a01b0382166102425760405162461bcd60e51b815260040161023990611383565b60405180910390fd5b61024c8183610883565b156102af5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b6064820152608401610239565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f8051602061176d83398151915261031561087b565b6001600160a01b03821661033b5760405162461bcd60e51b815260040161023990611383565b6103458183610883565b6103a35760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b6064820152608401610239565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b6103f661087b565b6103ff816108a7565b50565b61040a610a3f565b6104135f610a9a565b565b5f5f8051602061176d83398151915261042e8184610883565b9392505050565b5f81815260208181526040808320815180830190925280546001600160a01b031682526001810180546060948694939290840191610472906113d1565b80601f016020809104026020016040519081016040528092919081815260200182805461049e906113d1565b80156104e95780601f106104c0576101008083540402835291602001916104e9565b820191905f5260205f20905b8154815290600101906020018083116104cc57829003601f168201915b5050505050815250509050805f015181602001519250925050915091565b61050f610b0a565b5f5f8051602061176d83398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561057a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059e9190611409565b10156106055760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b6064820152608401610239565b61060f8133610883565b156106755760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b6064820152608401610239565b6106b5858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610b5492505050565b506106df60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050565b6106ed610a3f565b6001600160a01b03811661071657604051631e4fbdf760e01b81525f6004820152602401610239565b6103ff81610a9a565b5f610728610b0a565b5f851561073c576107398787610c09565b90505b876001600160a01b0316897fa06eff1edd0c66b8dc96d086dda7ba263edf88d7417e6cb15073b5e7bff8a8ca898489898960405161077e959493929190611448565b60405180910390a36108446040518060c001604052808b81526020018a6001600160a01b0316815260200160405180604001604052808b6001600160a01b031681526020018581525081526020018781526020015f67ffffffffffffffff8111156107eb576107eb611475565b604051908082528060200260200182016040528015610814578160200160208202803683370190505b508152602001868660405160200161082d929190611489565b604051602081830303815290604052815250610d6b565b91505061087060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b979650505050505050565b610413610a3f565b6001600160a01b0381165f90815260018301602052604090205460ff165b92915050565b5f8051602061176d83398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa1580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f9190611409565b6002830154909150818411156109915760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b6064820152608401610239565b808411610a065760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e006064820152608401610239565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b33610a717f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104135760405163118cdaa760e01b8152336004820152602401610239565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610b4e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f81806020019051810190610b69919061149c565b6040805180820182526001600160a01b03868116825260208083018581525f8a815291829052939020825181546001600160a01b03191692169190911781559151929350916001820190610bbd9082611585565b50905050826001600160a01b0316847f1f5c800b5f2b573929a7948f82a199c2a212851b53a6c5bd703ece23999d24aa83604051610bfb9190611645565b60405180910390a350505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015610c4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c739190611409565b9050610c8a6001600160a01b038516333086610e86565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610cce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf29190611409565b9050818111610d585760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610239565b610d62828261166b565b95945050505050565b5f80610d75610eed565b60408401516020015190915015610e1a576040830151516001600160a01b0316610df75760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b6064820152608401610239565b604083015160208101519051610e1a916001600160a01b03909116908390610fdd565b604051630624488560e41b81526001600160a01b03821690636244885090610e469086906004016116c1565b6020604051808303815f875af1158015610e62573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061042e9190611409565b6040516001600160a01b0384811660248301528381166044830152606482018390526106df9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611064565b5f8051602061176d83398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015610f47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6b919061173e565b9050610f778282610883565b156108a15760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b6064820152608401610239565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa15801561102a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104e9190611409565b90506106df848461105f8585611759565b6110d0565b5f8060205f8451602086015f885af180611083576040513d5f823e3d81fd5b50505f513d9150811561109a5780600114156110a7565b6001600160a01b0384163b155b156106df57604051635274afe760e01b81526001600160a01b0385166004820152602401610239565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052611121848261115f565b6106df576040516001600160a01b0384811660248301525f604483015261115591869182169063095ea7b390606401610ebb565b6106df8482611064565b5f805f8060205f8651602088015f8a5af192503d91505f51905082801561119e57508115611190578060011461119e565b5f866001600160a01b03163b115b9695505050505050565b6001600160a01b03811681146103ff575f80fd5b5f602082840312156111cc575f80fd5b813561042e816111a8565b5f602082840312156111e7575f80fd5b5035919050565b5f5b838110156112085781810151838201526020016111f0565b50505f910152565b5f81518084526112278160208601602086016111ee565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190525f9061125e90830184611210565b949350505050565b5f8083601f840112611276575f80fd5b50813567ffffffffffffffff81111561128d575f80fd5b6020830191508360208285010111156112a4575f80fd5b9250929050565b5f805f80606085870312156112be575f80fd5b8435935060208501356112d0816111a8565b9250604085013567ffffffffffffffff8111156112eb575f80fd5b6112f787828801611266565b95989497509550505050565b5f805f805f805f60c0888a031215611319575f80fd5b87359650602088013561132b816111a8565b9550604088013561133b816111a8565b9450606088013593506080880135925060a088013567ffffffffffffffff811115611364575f80fd5b6113708a828b01611266565b989b979a50959850939692959293505050565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b600181811c908216806113e557607f821691505b60208210810361140357634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215611419575f80fd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b0386168152846020820152836040820152608060608201525f610870608083018486611420565b634e487b7160e01b5f52604160045260245ffd5b602081525f61125e602083018486611420565b5f602082840312156114ac575f80fd5b815167ffffffffffffffff808211156114c3575f80fd5b818401915084601f8301126114d6575f80fd5b8151818111156114e8576114e8611475565b604051601f8201601f19908116603f0116810190838211818310171561151057611510611475565b81604052828152876020848701011115611528575f80fd5b6108708360208301602088016111ee565b601f82111561158057805f5260205f20601f840160051c8101602085101561155e5750805b601f840160051c820191505b8181101561157d575f815560010161156a565b50505b505050565b815167ffffffffffffffff81111561159f5761159f611475565b6115b3816115ad84546113d1565b84611539565b602080601f8311600181146115e6575f84156115cf5750858301515b5f19600386901b1c1916600185901b17855561163d565b5f85815260208120601f198616915b82811015611614578886015182559484019460019091019084016115f5565b508582101561163157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f61042e6020830184611210565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108a1576108a1611657565b5f815180845260208085019450602084015f5b838110156116b65781516001600160a01b031687529582019590820190600101611691565b509495945050505050565b60208152815160208201525f602083015160018060a01b03808216604085015260408501519150808251166060850152506020810151608084015250606083015160a0830152608083015160e060c084015261172161010084018261167e565b905060a0840151601f198483030160e0850152610d628282611210565b5f6020828403121561174e575f80fd5b815161042e816111a8565b808201808211156108a1576108a161165756fede77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"teleporterRegistryAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"teleporterManager\",\"type\":\"address\",\"internalType\":\"address\"}],\"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: "0x608060405234801561000f575f80fd5b50604051611dcd380380611dcd83398101604081905261002e9161042d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff1615906001600160401b03165f811580156100775750825b90505f826001600160401b031660011480156100925750303b155b9050811580156100a0575080155b156100be5760405163f92ee8a960e01b815260040160405180910390fd5b84546001600160401b031916600117855583156100ec57845460ff60401b1916680100000000000000001785555b6100f4610150565b6100fe8787610162565b831561014457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050610475565b610158610180565b6101606101ce565b565b61016a610180565b610173826101fc565b61017c81610220565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff1661016057604051631afcd79f60e31b815260040160405180910390fd5b6101d6610180565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610204610180565b61020c610150565b610214610231565b61021d81610239565b50565b610228610180565b61021d8161036a565b610160610180565b610241610180565b6001600160a01b0381166102c25760405162461bcd60e51b815260206004820152603760248201527f54656c65706f7274657252656769737472794170703a207a65726f2074656c6560448201527f706f72746572207265676973747279206164647265737300000000000000000060648201526084015b60405180910390fd5b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d0080546001600160a01b0319166001600160a01b03831690811782556040805163301fd1f560e21b8152905184929163c07f47d49160048083019260209291908290030181865afa158015610339573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061035d919061045e565b8260020181905550505050565b610372610180565b6001600160a01b03811661039b57604051631e4fbdf760e01b81525f60048201526024016102b9565b61021d815f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b038481166001600160a01b031983168117845560405193945091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b80516001600160a01b0381168114610428575f80fd5b919050565b5f806040838503121561043e575f80fd5b61044783610412565b915061045560208401610412565b90509250929050565b5f6020828403121561046e575f80fd5b5051919050565b61194b806104825f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c8063973142971161006e5780639731429714610159578063b33fead41461017c578063c868efaa1461019d578063d2cc7a70146101b0578063f2fde38b146101d7578063f63d09d7146101ea575f80fd5b80632b0d8f18146100b55780634511243e146100ca5780635eb99514146100dd578063715018a6146100f05780638da5cb5b146100f8578063909a6ac014610137575b5f80fd5b6100c86100c3366004611335565b6101fd565b005b6100c86100d8366004611335565b6102ff565b6100c86100eb366004611350565b6103ee565b6100c8610402565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020015b60405180910390f35b61014b5f8051602061191f83398151915281565b60405190815260200161012e565b61016c610167366004611335565b610415565b604051901515815260200161012e565b61018f61018a366004611350565b610435565b60405161012e9291906113b4565b6100c86101ab366004611424565b610507565b7fde77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d025461014b565b6100c86101e5366004611335565b6106e5565b61014b6101f836600461147c565b61071f565b5f8051602061191f83398151915261021361087b565b6001600160a01b0382166102425760405162461bcd60e51b8152600401610239906114fc565b60405180910390fd5b61024c8183610883565b156102af5760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a2061646472657373206160448201526c1b1c9958591e481c185d5cd959609a1b6064820152608401610239565b6001600160a01b0382165f81815260018381016020526040808320805460ff1916909217909155517f933f93e57a222e6330362af8b376d0a8725b6901e9a2fb86d00f169702b28a4c9190a25050565b5f8051602061191f83398151915261031561087b565b6001600160a01b03821661033b5760405162461bcd60e51b8152600401610239906114fc565b6103458183610883565b6103a35760405162461bcd60e51b815260206004820152602960248201527f54656c65706f7274657252656769737472794170703a2061646472657373206e6044820152681bdd081c185d5cd95960ba1b6064820152608401610239565b6001600160a01b0382165f818152600183016020526040808220805460ff19169055517f844e2f3154214672229235858fd029d1dfd543901c6d05931f0bc2480a2d72c39190a25050565b6103f661087b565b6103ff816108a7565b50565b61040a610a3f565b6104135f610a9a565b565b5f5f8051602061191f83398151915261042e8184610883565b9392505050565b5f81815260208181526040808320815180830190925280546001600160a01b0316825260018101805460609486949392908401916104729061154a565b80601f016020809104026020016040519081016040528092919081815260200182805461049e9061154a565b80156104e95780601f106104c0576101008083540402835291602001916104e9565b820191905f5260205f20905b8154815290600101906020018083116104cc57829003601f168201915b5050505050815250509050805f015181602001519250925050915091565b61050f610b0a565b5f5f8051602061191f83398151915260028101548154919250906001600160a01b0316634c1f08ce336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561057a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059e9190611582565b10156106055760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201526f32b632b837b93a32b91039b2b73232b960811b6064820152608401610239565b61060f8133610883565b156106755760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881859191c995cdcc81c185d5cd95960821b6064820152608401610239565b6106b5858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610b5492505050565b506106df60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50505050565b6106ed610a3f565b6001600160a01b03811661071657604051631e4fbdf760e01b81525f6004820152602401610239565b6103ff81610a9a565b5f610728610b0a565b5f851561073c576107398787610c09565b90505b876001600160a01b0316897fa06eff1edd0c66b8dc96d086dda7ba263edf88d7417e6cb15073b5e7bff8a8ca898489898960405161077e9594939291906115c1565b60405180910390a36108446040518060c001604052808b81526020018a6001600160a01b0316815260200160405180604001604052808b6001600160a01b031681526020018581525081526020018781526020015f67ffffffffffffffff8111156107eb576107eb6115ee565b604051908082528060200260200182016040528015610814578160200160208202803683370190505b508152602001868660405160200161082d929190611602565b604051602081830303815290604052815250610d6b565b91505061087060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b979650505050505050565b610413610a3f565b6001600160a01b0381165f90815260018301602052604090205460ff165b92915050565b5f8051602061191f83398151915280546040805163301fd1f560e21b815290515f926001600160a01b03169163c07f47d49160048083019260209291908290030181865afa1580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f9190611582565b6002830154909150818411156109915760405162461bcd60e51b815260206004820152603160248201527f54656c65706f7274657252656769737472794170703a20696e76616c6964205460448201527032b632b837b93a32b9103b32b939b4b7b760791b6064820152608401610239565b808411610a065760405162461bcd60e51b815260206004820152603f60248201527f54656c65706f7274657252656769737472794170703a206e6f7420677265617460448201527f6572207468616e2063757272656e74206d696e696d756d2076657273696f6e006064820152608401610239565b60028301849055604051849082907fa9a7ef57e41f05b4c15480842f5f0c27edfcbb553fed281f7c4068452cc1c02d905f90a350505050565b33610a717f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104135760405163118cdaa760e01b8152336004820152602401610239565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901610b4e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f81806020019051810190610b699190611615565b6040805180820182526001600160a01b03868116825260208083018581525f8a815291829052939020825181546001600160a01b03191692169190911781559151929350916001820190610bbd90826116fd565b50905050826001600160a01b0316847f1f5c800b5f2b573929a7948f82a199c2a212851b53a6c5bd703ece23999d24aa83604051610bfb91906117bd565b60405180910390a350505050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015610c4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c739190611582565b9050610c8a6001600160a01b038516333086610e86565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015610cce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf29190611582565b9050818111610d585760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610239565b610d6282826117e3565b95945050505050565b5f80610d75610eed565b60408401516020015190915015610e1a576040830151516001600160a01b0316610df75760405162461bcd60e51b815260206004820152602d60248201527f54656c65706f7274657252656769737472794170703a207a65726f206665652060448201526c746f6b656e206164647265737360981b6064820152608401610239565b604083015160208101519051610e1a916001600160a01b03909116908390610fdd565b604051630624488560e41b81526001600160a01b03821690636244885090610e46908690600401611839565b6020604051808303815f875af1158015610e62573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061042e9190611582565b6040516001600160a01b0384811660248301528381166044830152606482018390526106df9186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611064565b5f8051602061191f83398151915280546040805163d820e64f60e01b815290515f939284926001600160a01b039091169163d820e64f916004808201926020929091908290030181865afa158015610f47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6b91906118b6565b9050610f778282610883565b156108a15760405162461bcd60e51b815260206004820152603060248201527f54656c65706f7274657252656769737472794170703a2054656c65706f72746560448201526f1c881cd95b991a5b99c81c185d5cd95960821b6064820152608401610239565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301525f919085169063dd62ed3e90604401602060405180830381865afa15801561102a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061104e9190611582565b90506106df848461105f85856118d1565b6110ca565b5f6110786001600160a01b03841683611159565b905080515f1415801561109c57508080602001905181019061109a91906118e4565b155b156110c557604051635274afe760e01b81526001600160a01b0384166004820152602401610239565b505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261111b8482611166565b6106df576040516001600160a01b0384811660248301525f604483015261114f91869182169063095ea7b390606401610ebb565b6106df8482611064565b606061042e83835f611203565b5f805f846001600160a01b0316846040516111819190611903565b5f604051808303815f865af19150503d805f81146111ba576040519150601f19603f3d011682016040523d82523d5f602084013e6111bf565b606091505b50915091508180156111e95750805115806111e95750808060200190518101906111e991906118e4565b8015610d625750505050506001600160a01b03163b151590565b6060814710156112285760405163cd78605960e01b8152306004820152602401610239565b5f80856001600160a01b031684866040516112439190611903565b5f6040518083038185875af1925050503d805f811461127d576040519150601f19603f3d011682016040523d82523d5f602084013e611282565b606091505b509150915061129286838361129c565b9695505050505050565b6060826112b1576112ac826112f8565b61042e565b81511580156112c857506001600160a01b0384163b155b156112f157604051639996b31560e01b81526001600160a01b0385166004820152602401610239565b508061042e565b8051156113085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b6001600160a01b03811681146103ff575f80fd5b5f60208284031215611345575f80fd5b813561042e81611321565b5f60208284031215611360575f80fd5b5035919050565b5f5b83811015611381578181015183820152602001611369565b50505f910152565b5f81518084526113a0816020860160208601611367565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190525f906113d790830184611389565b949350505050565b5f8083601f8401126113ef575f80fd5b50813567ffffffffffffffff811115611406575f80fd5b60208301915083602082850101111561141d575f80fd5b9250929050565b5f805f8060608587031215611437575f80fd5b84359350602085013561144981611321565b9250604085013567ffffffffffffffff811115611464575f80fd5b611470878288016113df565b95989497509550505050565b5f805f805f805f60c0888a031215611492575f80fd5b8735965060208801356114a481611321565b955060408801356114b481611321565b9450606088013593506080880135925060a088013567ffffffffffffffff8111156114dd575f80fd5b6114e98a828b016113df565b989b979a50959850939692959293505050565b6020808252602e908201527f54656c65706f7274657252656769737472794170703a207a65726f2054656c6560408201526d706f72746572206164647265737360901b606082015260800190565b600181811c9082168061155e57607f821691505b60208210810361157c57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208284031215611592575f80fd5b5051919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b60018060a01b0386168152846020820152836040820152608060608201525f610870608083018486611599565b634e487b7160e01b5f52604160045260245ffd5b602081525f6113d7602083018486611599565b5f60208284031215611625575f80fd5b815167ffffffffffffffff8082111561163c575f80fd5b818401915084601f83011261164f575f80fd5b815181811115611661576116616115ee565b604051601f8201601f19908116603f01168101908382118183101715611689576116896115ee565b816040528281528760208487010111156116a1575f80fd5b610870836020830160208801611367565b601f8211156110c557805f5260205f20601f840160051c810160208510156116d75750805b601f840160051c820191505b818110156116f6575f81556001016116e3565b5050505050565b815167ffffffffffffffff811115611717576117176115ee565b61172b81611725845461154a565b846116b2565b602080601f83116001811461175e575f84156117475750858301515b5f19600386901b1c1916600185901b1785556117b5565b5f85815260208120601f198616915b8281101561178c5788860151825594840194600190910190840161176d565b50858210156117a957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f61042e6020830184611389565b634e487b7160e01b5f52601160045260245ffd5b818103818111156108a1576108a16117cf565b5f815180845260208085019450602084015f5b8381101561182e5781516001600160a01b031687529582019590820190600101611809565b509495945050505050565b60208152815160208201525f602083015160018060a01b03808216604085015260408501519150808251166060850152506020810151608084015250606083015160a0830152608083015160e060c08401526118996101008401826117f6565b905060a0840151601f198483030160e0850152610d628282611389565b5f602082840312156118c6575f80fd5b815161042e81611321565b808201808211156108a1576108a16117cf565b5f602082840312156118f4575f80fd5b8151801515811461042e575f80fd5b5f8251611914818460208701611367565b919091019291505056fede77a4dc7391f6f8f2d9567915d687d3aee79e7a1fc7300392f2727e9a0f1d00a164736f6c6343000819000a", } // TestMessengerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index a26f1dc95..1ae69097b 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -57,7 +57,7 @@ contract ERC20TokenStakingManager is function initialize( PoSValidatorManagerSettings calldata settings, IERC20 token - ) external initializer { + ) external reinitializer(2) { __ERC20TokenStakingManager_init(settings, token); } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 1099dbef1..2088bde95 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -27,7 +27,7 @@ contract NativeTokenStakingManager is } // solhint-disable ordering - function initialize(PoSValidatorManagerSettings calldata settings) external initializer { + function initialize(PoSValidatorManagerSettings calldata settings) external reinitializer(2) { __NativeTokenStakingManager_init(settings); } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 61136e89b..ac18d53e7 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -204,6 +204,11 @@ abstract contract ValidatorManager is ); } + function getActiveValidator(bytes32 nodeID) external view returns (bytes32) { + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + return $._activeValidators[nodeID]; + } + /** * @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. diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts index 659f3063f..dbb6104ce 160000 --- a/lib/openzeppelin-contracts +++ b/lib/openzeppelin-contracts @@ -1 +1 @@ -Subproject commit 659f3063f82422cef820de746444e6f6cba6ca7c +Subproject commit dbb6104ce834628e473d2173bbc9d47f81a9eec3 diff --git a/lib/openzeppelin-contracts-upgradeable b/lib/openzeppelin-contracts-upgradeable index f1b3e103c..723f8cab0 160000 --- a/lib/openzeppelin-contracts-upgradeable +++ b/lib/openzeppelin-contracts-upgradeable @@ -1 +1 @@ -Subproject commit f1b3e103cd6d48861e71357a7ac32b416c1b066f +Subproject commit 723f8cab09cdae1aca9ec9cc1cfa040c2d4b06c1 diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index a9380d05c..2b91a7405 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -18,6 +18,8 @@ echo "ARCH set to $ARCH" DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager PoAValidatorManager" +PROXY_LIST="TransparentUpgradeableProxy ProxyAdmin" + CONTRACT_LIST= HELP= while [ $# -gt 0 ]; do @@ -60,6 +62,30 @@ function convertToLower() { fi } +function generate_bindings() { + local contract_names=("$@") + for contract_name in "${contract_names[@]}" + do + path=$(find . -name $contract_name.sol) + dir=$(dirname $path) + abi_file=$TELEPORTER_PATH/out/$contract_name.sol/$contract_name.abi.json + if ! [ -f $abi_file ]; then + echo "Error: Contract $contract_name abi file not found" + exit 1 + fi + + echo "Generating Go bindings for $contract_name..." + gen_path=$TELEPORTER_PATH/abi-bindings/go/$dir/$contract_name + mkdir -p $gen_path + $GOPATH/bin/abigen --abi $abi_file \ + --pkg $(convertToLower $contract_name) \ + --bin $TELEPORTER_PATH/out/$contract_name.sol/$contract_name.bin \ + --type $contract_name \ + --out $gen_path/$contract_name.go + echo "Done generating Go bindings for $contract_name." + done +} + contract_names=($CONTRACT_LIST) # If CONTRACT_LIST is empty, use DEFAULT_CONTRACT_LIST @@ -68,25 +94,13 @@ if [[ -z "${CONTRACT_LIST}" ]]; then fi cd $TELEPORTER_PATH/contracts -for contract_name in "${contract_names[@]}" -do - path=$(find . -name $contract_name.sol) - dir=$(dirname $path) - abi_file=$TELEPORTER_PATH/out/$contract_name.sol/$contract_name.abi.json - if ! [ -f $abi_file ]; then - echo "Error: Contract $contract_name abi file not found" - exit 1 - fi +generate_bindings "${contract_names[@]}" - echo "Generating Go bindings for $contract_name..." - gen_path=$TELEPORTER_PATH/abi-bindings/go/$dir/$contract_name - mkdir -p $gen_path - $GOPATH/bin/abigen --abi $abi_file \ - --pkg $(convertToLower $contract_name) \ - --bin $TELEPORTER_PATH/out/$contract_name.sol/$contract_name.bin \ - --type $contract_name \ - --out $gen_path/$contract_name.go - echo "Done generating Go bindings for $contract_name." -done +contract_names=($PROXY_LIST) +cd $TELEPORTER_PATH/ +forge build --skip test --force --extra-output-files abi bin --contracts lib/openzeppelin-contracts/contracts/proxy/transparent + +cd $TELEPORTER_PATH/lib/openzeppelin-contracts/contracts/proxy/transparent +generate_bindings "${contract_names[@]}" exit 0 diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index aa3f40879..87de1bec0 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -7,7 +7,6 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" . "github.com/onsi/gomega" @@ -66,105 +65,35 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Iniatiate validator registration nodeID := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} - var receipt *types.Receipt - receipt, validationID = utils.InitializeNativeValidatorRegistration( - fundedKey, - subnetAInfo, - stakeAmount, - nodeID, - blsPublicKey, - stakingManager, - ) - - // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - - // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateRegisterSubnetValidatorMessage( - signedWarpMessage, - nodeID, - weight, - subnetAInfo.SubnetID, - blsPublicKey, - ) - - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( - validationID, - true, - subnetAInfo, - pChainInfo, + validationID = utils.InitializeAndCompleteNativeValidatorRegistration( network, signatureAggregator, - ) - - // Deliver the Warp message to the subnet - receipt = utils.CompleteNativeValidatorRegistration( fundedKey, subnetAInfo, + pChainInfo, + stakingManager, stakingManagerContractAddress, - registrationSignedMessage, - ) - // Check that the validator is registered in the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidationPeriodRegistered, + weight, + nodeID, + blsPublicKey, + stakeAmount, ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) } // // Delist the validator // { - receipt := utils.InitializeEndNativeValidation( - fundedKey, - subnetAInfo, - stakingManager, - validationID, - ) - validatorRemovalEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidatorRemovalInitialized, - ) - Expect(err).Should(BeNil()) - Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) - - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - Expect(err).Should(BeNil()) - - // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 0) - - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( - validationID, - false, - subnetAInfo, - pChainInfo, + utils.InitializeAndCompleteEndNativeValidation( network, signatureAggregator, - ) - - // Deliver the Warp message to the subnet - receipt = utils.CompleteEndNativeValidation( fundedKey, subnetAInfo, + pChainInfo, + stakingManager, stakingManagerContractAddress, - registrationSignedMessage, - ) - - // Check that the validator is has been delisted from the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidationPeriodEnded, + validationID, + weight, ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) } } diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go new file mode 100644 index 000000000..cd31bd1bd --- /dev/null +++ b/tests/flows/staking/poa_to_pos.go @@ -0,0 +1,199 @@ +package staking + +import ( + "context" + "math/big" + "time" + + "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/crypto/bls" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" + "github.com/ava-labs/teleporter/tests/interfaces" + "github.com/ava-labs/teleporter/tests/utils" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + + . "github.com/onsi/gomega" +) + +/* + * Register a PoA validator manager on a L1 with a proxy. The steps are as follows: + * - Generate random address to be the owner address + * - Fund native assets to the owner address + * - Deploy the PoAValidatorManager contract + * - Deploy a TransparentUpgradeableProxy contract that points to the PoAValidatorManager + * - Call initialize on the PoAValidatorManager through the proxy + * - Initialize and complete PoA validator registration + * + * Migrates the proxy to a PoS validator manager. The steps are as follows: + * - Deploy the PoSValidatorManager contract + * - Upgrade the TransparentUpgradeableProxy to point to the PoSValidatorManager + * - Call initialize on the PoSValidatorManager through the proxy + * - Check that previous validator is still active + * - Initialize and complete PoS validator registration + * - Attempt to delist previous PoA validator with wrong owner and check that it fails + * - Delist the previous PoA validator properly + * - Delist the PoS validator + */ +func PoAMigrationToPoS(network interfaces.LocalNetwork) { + cChainInfo := network.GetPrimaryNetworkInfo() + subnetAInfo, _ := utils.GetTwoSubnets(network) + _, fundedKey := network.GetFundedAccountInfo() + pChainInfo := utils.GetPChainInfo(cChainInfo) + + signatureAggregator := utils.NewSignatureAggregator( + cChainInfo.NodeURIs[0], + []ids.ID{ + subnetAInfo.SubnetID, + ids.Empty, // Primary network subnet ID + }, + ) + + // Generate random address to be the owner address + ownerKey, err := crypto.GenerateKey() + Expect(err).Should(BeNil()) + ownerAddress := crypto.PubkeyToAddress(ownerKey.PublicKey) + + // Transfer native assets to the owner account + ctx := context.Background() + fundAmount := big.NewInt(1e18) // 1avax + utils.SendNativeTransfer( + ctx, + subnetAInfo, + fundedKey, + ownerAddress, + fundAmount, + ) + + // Deploy PoAValidatorManager contract + implAddress, _ := utils.DeployPoAValidatorManager( + ctx, + fundedKey, + subnetAInfo, + ) + + // Deploy TransparentUpgradeableProxy contract pointing to PoAValidatorManager + proxyAddress, proxyAdmin, poaValidatorManager := utils.DeployTransparentUpgradeableProxy( + ctx, + subnetAInfo, + fundedKey, + implAddress, + poavalidatormanager.NewPoAValidatorManager, + ) + opts, err := bind.NewKeyedTransactorWithChainID( + fundedKey, + subnetAInfo.EVMChainID, + ) + Expect(err).Should(BeNil()) + + tx, err := poaValidatorManager.Initialize( + opts, + poavalidatormanager.ValidatorManagerSettings{ + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnetAInfo.SubnetID, + MaximumHourlyChurn: 0, + }, + ownerAddress, + ) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) + + // Register a validator + weight := uint64(1) + poaValidatorNodeID := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} + poaValidationID := utils.InitializeAndCompletePoAValidatorRegistration( + network, + signatureAggregator, + ownerKey, + fundedKey, + subnetAInfo, + pChainInfo, + poaValidatorManager, + proxyAddress, + weight, + poaValidatorNodeID, + blsPublicKey, + ) + + /* + ****************** + * Migrate PoAValidatorManager to PoSValidatorManager + ****************** + */ + + // Deploy PoSValidatorManager contract + newImplAddress, _ := utils.DeployNativeTokenStakingManager( + ctx, + fundedKey, + subnetAInfo, + ) + + // Upgrade the TransparentUpgradeableProxy contract to use the new logic contract + tx, err = proxyAdmin.UpgradeAndCall(opts, proxyAddress, newImplAddress, []byte{}) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) + + // Change the proxy contract type to NativeTokenStakingManager and initialize it + posValidatorManager, err := nativetokenstakingmanager.NewNativeTokenStakingManager( + proxyAddress, + subnetAInfo.RPCClient, + ) + Expect(err).Should(BeNil()) + + tx, err = posValidatorManager.Initialize( + opts, + nativetokenstakingmanager.PoSValidatorManagerSettings{ + BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnetAInfo.SubnetID, + MaximumHourlyChurn: 0, + }, + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: uint64(24 * time.Hour), + RewardCalculator: common.Address{}, + }, + ) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) + + // Check that previous validator is still active + validationID, err := posValidatorManager.GetActiveValidator(&bind.CallOpts{}, poaValidatorNodeID) + Expect(err).Should(BeNil()) + Expect(validationID[:]).Should(Equal(poaValidationID[:])) + + // Register a PoS validator + posValidatorNodeID := ids.GenerateTestID() + stakeAmount := uint64(1e18) + weight, err = posValidatorManager.ValueToWeight( + &bind.CallOpts{}, + big.NewInt(int64(stakeAmount)), + ) + Expect(err).Should(BeNil()) + + utils.InitializeAndCompleteNativeValidatorRegistration( + network, + signatureAggregator, + fundedKey, + subnetAInfo, + pChainInfo, + posValidatorManager, + proxyAddress, + weight, + posValidatorNodeID, + blsPublicKey, + stakeAmount, + ) + + // Attempt to delist previous PoA validator with wrong owner and check that it fails + _, err = posValidatorManager.InitializeEndValidation( + opts, + poaValidationID, + false, + 0, + ) + Expect(err).ShouldNot(BeNil()) +} diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index ec9b5fe93..65c935c6c 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -8,7 +8,6 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/crypto" @@ -93,53 +92,19 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { Expect(err).ShouldNot(BeNil()) // Initiate validator registration - var receipt *types.Receipt - receipt, validationID = utils.InitializePoAValidatorRegistration( - ownerKey, - subnetAInfo, - weight, - nodeID, - blsPublicKey, - validatorManager, - ) - - // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - - // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateRegisterSubnetValidatorMessage( - signedWarpMessage, - nodeID, - weight, - subnetAInfo.SubnetID, - blsPublicKey, - ) - - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( - validationID, - true, - subnetAInfo, - pChainInfo, + validationID = utils.InitializeAndCompletePoAValidatorRegistration( network, signatureAggregator, - ) - - // Deliver the Warp message to the subnet - receipt = utils.CompletePoAValidatorRegistration( + ownerKey, fundedKey, subnetAInfo, + pChainInfo, + validatorManager, validatorManagerAddress, - registrationSignedMessage, - ) - // Check that the validator is registered in the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - validatorManager.ParseValidationPeriodRegistered, + weight, + nodeID, + blsPublicKey, ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) } // @@ -155,52 +120,17 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { ) Expect(err).ShouldNot(BeNil()) - receipt := utils.InitializeEndPoAValidation( - ownerKey, - subnetAInfo, - validatorManager, - validationID, - ) - validatorRemovalEvent, err := utils.GetEventFromLogs( - receipt.Logs, - validatorManager.ParseValidatorRemovalInitialized, - ) - Expect(err).Should(BeNil()) - Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) - - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - Expect(err).Should(BeNil()) - - // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 0) - - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( - validationID, - false, - subnetAInfo, - pChainInfo, + utils.InitializeAndCompleteEndPoAValidation( network, signatureAggregator, - ) - - // Deliver the Warp message to the subnet - receipt = utils.CompleteEndPoAValidation( ownerKey, + fundedKey, subnetAInfo, + pChainInfo, + validatorManager, validatorManagerAddress, - registrationSignedMessage, - ) - - // Check that the validator is has been delisted from the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - validatorManager.ParseValidationPeriodEnded, + validationID, + weight, ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) } } diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index 2d5a8c90e..aec960395 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -212,4 +212,9 @@ var _ = ginkgo.Describe("[Teleporter integration tests]", func() { func() { staking.PoAValidatorManager(LocalNetworkInstance) }) + ginkgo.It("PoA migration to PoS", + ginkgo.Label(validatorManagerLabel), + func() { + staking.PoAMigrationToPoS(LocalNetworkInstance) + }) }) diff --git a/tests/utils/proxy.go b/tests/utils/proxy.go new file mode 100644 index 000000000..36b6413d3 --- /dev/null +++ b/tests/utils/proxy.go @@ -0,0 +1,49 @@ +package utils + +import ( + "context" + "crypto/ecdsa" + + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + proxyadmin "github.com/ava-labs/teleporter/abi-bindings/go/ProxyAdmin" + transparentupgradeableproxy "github.com/ava-labs/teleporter/abi-bindings/go/TransparentUpgradeableProxy" + "github.com/ava-labs/teleporter/tests/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/crypto" + . "github.com/onsi/gomega" +) + +func DeployTransparentUpgradeableProxy[T any]( + ctx context.Context, + subnet interfaces.SubnetTestInfo, + senderKey *ecdsa.PrivateKey, + implAddress common.Address, + newInstance func(address common.Address, backend bind.ContractBackend) (*T, error), +) (common.Address, *proxyadmin.ProxyAdmin, *T) { + opts, err := bind.NewKeyedTransactorWithChainID( + senderKey, + subnet.EVMChainID, + ) + Expect(err).Should((BeNil())) + + senderAddress := crypto.PubkeyToAddress(senderKey.PublicKey) + proxyAddress, tx, proxy, err := transparentupgradeableproxy.DeployTransparentUpgradeableProxy( + opts, + subnet.RPCClient, + implAddress, + senderAddress, + []byte{}, + ) + Expect(err).Should(BeNil()) + receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + proxyAdminEvent, err := GetEventFromLogs(receipt.Logs, proxy.ParseAdminChanged) + Expect(err).Should(BeNil()) + + proxyAdmin, err := proxyadmin.NewProxyAdmin(proxyAdminEvent.NewAdmin, subnet.RPCClient) + Expect(err).Should(BeNil()) + + contract, err := newInstance(proxyAddress, subnet.RPCClient) + Expect(err).Should(BeNil()) + + return proxyAddress, proxyAdmin, contract +} diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 5c998e18f..9a09a6e67 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -371,6 +371,132 @@ func completeValidatorRegistration( return SendTransactionAndWaitForSuccess(context.Background(), subnet, signedRegistrationTx) } +func InitializeAndCompleteNativeValidatorRegistration( + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, + fundedKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, + stakingManagerContractAddress common.Address, + weight uint64, + nodeID ids.ID, + blsPublicKey [bls.PublicKeyLen]byte, + stakeAmount uint64, +) ids.ID { + receipt, validationID := InitializeNativeValidatorRegistration( + fundedKey, + subnetInfo, + stakeAmount, + nodeID, + blsPublicKey, + stakingManager, + ) + + // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + ValidateRegisterSubnetValidatorMessage( + signedWarpMessage, + nodeID, + weight, + subnetInfo.SubnetID, + blsPublicKey, + ) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + validationID, + true, + subnetInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = CompleteNativeValidatorRegistration( + fundedKey, + subnetInfo, + stakingManagerContractAddress, + registrationSignedMessage, + ) + // Check that the validator is registered in the staking contract + registrationEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + + return validationID +} + +func InitializeAndCompletePoAValidatorRegistration( + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, + ownerKey *ecdsa.PrivateKey, + fundedKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + validatorManager *poavalidatormanager.PoAValidatorManager, + validatorManagerAddress common.Address, + weight uint64, + nodeID ids.ID, + blsPublicKey [bls.PublicKeyLen]byte, +) ids.ID { + receipt, validationID := InitializePoAValidatorRegistration( + ownerKey, + subnetInfo, + weight, + nodeID, + blsPublicKey, + validatorManager, + ) + + // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + ValidateRegisterSubnetValidatorMessage( + signedWarpMessage, + nodeID, + weight, + subnetInfo.SubnetID, + blsPublicKey, + ) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + validationID, + true, + subnetInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = CompletePoAValidatorRegistration( + fundedKey, + subnetInfo, + validatorManagerAddress, + registrationSignedMessage, + ) + // Check that the validator is registered in the staking contract + registrationEvent, err := GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidationPeriodRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + + return validationID +} + func InitializeEndNativeValidation( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, @@ -501,6 +627,127 @@ func callCompleteEndValidation( return SendTransactionAndWaitForSuccess(context.Background(), subnet, signedRegistrationTx) } +func InitializeAndCompleteEndNativeValidation( + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, + fundedKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, + stakingManagerContractAddress common.Address, + validationID ids.ID, + weight uint64, +) { + receipt := InitializeEndNativeValidation( + fundedKey, + subnetInfo, + stakingManager, + validationID, + ) + validatorRemovalEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + Expect(err).Should(BeNil()) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 0) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + validationID, + false, + subnetInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = CompleteEndNativeValidation( + fundedKey, + subnetInfo, + stakingManagerContractAddress, + registrationSignedMessage, + ) + + // Check that the validator is has been delisted from the staking contract + registrationEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodEnded, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) +} + +func InitializeAndCompleteEndPoAValidation( + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, + ownerKey *ecdsa.PrivateKey, + fundedKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + validatorManager *poavalidatormanager.PoAValidatorManager, + validatorManagerAddress common.Address, + validationID ids.ID, + weight uint64, +) { + receipt := InitializeEndPoAValidation( + ownerKey, + subnetInfo, + validatorManager, + validationID, + ) + validatorRemovalEvent, err := GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + Expect(err).Should(BeNil()) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 0) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + validationID, + false, + subnetInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = CompleteEndPoAValidation( + ownerKey, + subnetInfo, + validatorManagerAddress, + registrationSignedMessage, + ) + + // Check that the validator is has been delisted from the staking contract + registrationEvent, err := GetEventFromLogs( + receipt.Logs, + validatorManager.ParseValidationPeriodEnded, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) +} + // // P-Chain utils // From 890ac36c84c4438bcc724cdfa6a4ff248ea315d0 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 23 Aug 2024 13:00:28 -0400 Subject: [PATCH 121/545] staking: small README improvements Signed-off-by: F. Eugene Aumson --- contracts/staking/README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/contracts/staking/README.md b/contracts/staking/README.md index 0794c14a7..c086b0c25 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -20,7 +20,7 @@ If the Subnet has no validators registered on the P-Chain, then it will not be a Validator registration is initiated with a call to `initializeValidatorRegistration` on the concrete Validator Manager contract. The Validator Manager contract constructs a [`RegisterSubnetValidatorMessage`](#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each validator registration request includes all of the information needed to identify the validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. -The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a `RegisterSubnetValidatorTx`. Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a `SubnetValidatorRegistrationMessage` Warp message indicating that the specified validation was successfully registered on the P-Chain. +The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a [`RegisterSubnetValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#registersubnetvalidatortx). Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a [`SubnetValidatorRegistrationMessage`](#subnetvalidatorregistrationmessage) Warp message indicating that the specified validator was successfully registered on the P-Chain. The `SubnetValidatorRegistrationMessage` is delivered to the Validator Manager contract via a call to `completeValidatorRegistration`. For PoS Validator Managers, staking rewards begin accruing at this time. @@ -30,21 +30,21 @@ In the case of a missed expiry, the `RegisterSubnetValidatorTx` will result in a ### Exiting the Validator Set -Validator exit is initiated with a call to `initializeEndValidation` on the Validator Manager contract. For PoS Validator Managers, a `ValidationUptimeMessage` Warp message may optionally be provided in order to calculate the staking rewards; otherwise the validator's uptime will be set to `0`. This proof may be requested from the P-Chain, which will provide it in a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message. Once `initializeEndValidation` is called, staking rewards cease accruing for PoS Validator Managers. The Validator Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. +Validator exit is initiated with a call to `initializeEndValidation` on the Validator Manager contract. For PoS Validator Managers, a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message may optionally be provided in order to calculate the staking rewards; otherwise the validator's uptime will be set to `0`. This proof may be requested from the P-Chain, which will provide it in a `ValidationUptimeMessage` Warp message. Once `initializeEndValidation` is called, staking rewards cease accruing for PoS Validator Managers: the Validator Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. -The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a `SetValidatorWeightTx`. The P-Chain acknowledges validator exit by signing either a `SetSubnetValidatorWeightMessage` with the `weight=0`, or a `SubnetValidatorRegistrationMessage` with `valid=0`. `completeEndValidation` is then called on the Validator Manager contract, with `setWeightMessageType` set according to the Warp message type being delivered. The validation is removed from the contract's state, and for PoS Validator Managers, staking rewards are disbursed and stake is returned. +The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The P-Chain acknowledges validator exit by signing either a `SetSubnetValidatorWeightMessage` with the `weight=0`, or a `SubnetValidatorRegistrationMessage` with `valid=0`. `completeEndValidation` is then called on the Validator Manager contract, with `setWeightMessageType` set according to the Warp message type being delivered. The validation is removed from the contract's state, and for PoS Validator Managers, staking rewards are disbursed and stake is returned. #### Exit the Validator Set Directly on the P-Chain -ACP-77 also provides a method for validators to exit a Subnet's validator set without interacting with the Subnet directly. The P-Chain transaction [`ExitValidatorSetTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#exitvalidatorsettx) removes the validator from the Subnet validator set tracked on the P-Chain. The P-Chain will will sign a `SetSubnetValidatorWeightMessage` or a `SubnetValidatorRegistrationMessage`, that may then be provided to the Staking Manager contract via a call to `completeEndValidation`, as described above. Note however that without the uptime proof provided in the initial call to `initializeEndValidation`, the Staking Manager will not credit any staking rewards to the validator. +ACP-77 also provides a method for validators to exit a Subnet's validator set without interacting with the Subnet directly. The P-Chain transaction [`ExitValidatorSetTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#exitvalidatorsettx) removes the validator from the Subnet validator set tracked on the P-Chain. The P-Chain will sign a `SetSubnetValidatorWeightMessage` or a `SubnetValidatorRegistrationMessage`, which may then be provided to the Validator Manager contract via a call to `completeEndValidation`, as described above. Note however that without the uptime proof provided in the initial call to `initializeEndValidation`, the Validator Manager will not credit any staking rewards to the validator. ## Warp Message Format Reference ### `RegisterSubnetValidatorMessage` -Description: Used to register a Subnet validator on the P-Chain +Description: Issued by the Validator Manager contract in order to register a Subnet validator -Signed by: Subnet +Signed by: Subnet validators Specification: @@ -71,7 +71,7 @@ Specification: ### `SubnetValidatorRegistrationMessage` -Description: Used to confirm Subnet validator registration on the P-Chain +Description: Issued by the P-Chain in order to confirm Subnet validator registration Signed by: P-Chain @@ -93,7 +93,7 @@ Specification: ### `ValidationUptimeMessage` -Description: Used to provide validator uptime to the Subnet to calculate staking rewards +Description: Issued by the P-Chain in order to provide validator uptime to the Subnet to calculate staking rewards Signed by: P-Chain @@ -137,12 +137,12 @@ Specification: +----------+ ``` -## Types of Staking Managers +## Types of Validator Managers ### Proof of Authority -The Proof of Authority (PoA) staking manager is ownable, and only allows the owner to modify changes to the validator set of the Subnet. Validators are given a weight by the owner, but do not accrue staking rewards. +The Proof of Authority (PoA) validator manager is ownable, and only allows the owner to modify changes to the validator set of the Subnet. Validators are given a weight by the owner, but do not accrue staking rewards. ### Proof of Stake -The Proof of Stake (PoS) staking manager allows any validator to register and exit the Subnet validator set. Validators are given a weight based on the amount of stake they provide, and accrue staking rewards based on their uptime. The staking rewards can be either native or erc20 tokens. +The Proof of Stake (PoS) validator manager allows any validator to register and exit the Subnet validator set. Validators are given a weight based on the amount of stake they provide, and accrue staking rewards based on their uptime. The staking rewards can be either native or erc20 tokens. From c0f2c6d4ce9a56ee5b6c92fdd949a4f87d9ebb45 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 23 Aug 2024 17:12:25 -0500 Subject: [PATCH 122/545] simplify completeEndValidation --- contracts/staking/ValidatorManager.sol | 45 +++++++------------ .../staking/interfaces/IValidatorManager.sol | 5 +-- .../staking/tests/ValidatorManagerTests.t.sol | 24 +--------- 3 files changed, 18 insertions(+), 56 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 61136e89b..57a4f1e7b 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -275,11 +275,8 @@ abstract contract ValidatorManager is * 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. - * @param setWeightMessageType Whether or not the message type is a SetValidatorWeight message, or a - * SubnetValidatorRegistration message (with valid set to false). Both message types are valid for ending - * a validation period. */ - function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) external { + function completeEndValidation(uint32 messageIndex) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Get the Warp message. @@ -287,37 +284,27 @@ abstract contract ValidatorManager is WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); require(valid, "ValidatorManager: Invalid warp message"); - bytes32 validationID; - if (setWeightMessageType) { - uint64 weight; - (validationID,, weight) = - ValidatorMessages.unpackSetSubnetValidatorWeightMessage(warpMessage.payload); - require(weight == 0, "ValidatorManager: Weight must be 0"); - } else { - bool validRegistration; - (validationID, validRegistration) = - ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); - require(!validRegistration, "ValidatorManager: Registration still valid"); - } - - // Note: The validation status is not necessarily PendingRemoved here. It could be PendingAdded if the - // registration was never successfully registered on the P-Chain, or it could be Active if the validator - // removed themselves directly on the P-Chain without going through the contract. - Validator memory validator = $._validationPeriods[validationID]; - require(_msgSender() == validator.owner, "ValidatorManager: Sender not validator owner"); - + (bytes32 validationID, bool validRegistration) = + ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); + require(!validRegistration, "ValidatorManager: Registration still valid"); + + + // The validation status is PendingRemoved if validator removal was initiated with a call to initiateEndValidation. + // The validation status is PendingAdded if the validator was never registered on the P-Chain. + // All other statuses are unexpected, but we defensively allow them to specify the validation period as invalidated, + // as long as a valid SubnetValidatorRegistration message from the P-Chain is received. + Validator memory validator = $._validationPeriods[validationID]; ValidatorStatus endStatus; - if ( - validator.status == ValidatorStatus.PendingRemoved - || validator.status == ValidatorStatus.Active - ) { - // Remove the validator from the active validators mapping. - delete $._activeValidators[validator.nodeID]; + if (validator.status == ValidatorStatus.PendingRemoved) { endStatus = ValidatorStatus.Completed; } else { endStatus = ValidatorStatus.Invalidated; } + // Remove the validator from the active validators mapping. + delete $._activeValidators[validator.nodeID]; + // Update the validator status. + validator.status = endStatus; $._validationPeriods[validationID] = validator; // Unlock the stake. diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 566b97ce2..aef5c2746 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -108,9 +108,6 @@ interface IValidatorManager { * {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. - * @param setWeightMessageType Whether or not the message type is a SetValidatorWeight message, or a - * SubnetValidatorRegistration message (with valid set to false). Both message types are valid for ending - * a validation period. */ - function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) external; + function completeEndValidation(uint32 messageIndex) external; } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index b180dc38e..2c64af9df 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -177,29 +177,7 @@ abstract contract ValidatorManagerTest is Test { vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodEnded(validationID); - validatorManager.completeEndValidation(0, false); - } - - function testCompleteEndValidationSetWeightMessageType() public { - bytes32 validationID = _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP - }); - - bytes memory setSubnetValidatorWeightMessage = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); - - _mockGetVerifiedWarpMessage(setSubnetValidatorWeightMessage, true); - - vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidationPeriodEnded(validationID); - - validatorManager.completeEndValidation(0, true); + validatorManager.completeEndValidation(0); } function _setUpInitializeValidatorRegistration( From 7506eb81ef8d943c6471a31aae74d6bbadd94328 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 23 Aug 2024 17:26:23 -0500 Subject: [PATCH 123/545] verify warp messages from p-chain --- contracts/staking/PoSValidatorManager.sol | 3 ++- contracts/staking/ValidatorManager.sol | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index fb9af1574..bb6703596 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -74,6 +74,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bool includeUptimeProof, uint32 messageIndex ) external { + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); uint64 uptimeSeconds; if (includeUptimeProof) { (WarpMessage memory warpMessage, bool valid) = @@ -81,7 +82,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require(valid, "StakingManager: Invalid warp message"); require( - warpMessage.sourceChainID == WARP_MESSENGER.getBlockchainID(), + warpMessage.sourceChainID == $._pChainBlockchainID, "StakingManager: Invalid source chain ID" ); require( diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 57a4f1e7b..d2f3a4297 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -53,7 +53,7 @@ abstract contract ValidatorManager is // solhint-disable ordering function _getValidatorManagerStorage() - private + internal pure returns (ValidatorManagerStorage storage $) { @@ -283,6 +283,14 @@ abstract contract ValidatorManager is (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); require(valid, "ValidatorManager: Invalid warp message"); + require( + warpMessage.sourceChainID == $._pChainBlockchainID, + "ValidatorManager: Invalid source chain ID" + ); + require( + warpMessage.originSenderAddress == address(0), + "ValidatorManager: Invalid origin sender address" + ); (bytes32 validationID, bool validRegistration) = ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); From 24c72c6f466d75875211b42cec590a845b935ae3 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 26 Aug 2024 20:26:24 -0500 Subject: [PATCH 124/545] rename blsPubKey param --- contracts/staking/NativeTokenStakingManager.sol | 11 +++-------- .../staking/interfaces/IERC20TokenStakingManager.sol | 9 ++------- .../staking/interfaces/INativeTokenStakingManager.sol | 9 ++------- 3 files changed, 7 insertions(+), 22 deletions(-) diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 1099dbef1..102c1acb2 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -46,21 +46,16 @@ contract NativeTokenStakingManager is * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. * @param registrationExpiry The time at which the registration is no longer valid on the P-Chain. - * @param signature The raw bytes of the Ed25519 signature over the concatenated bytes of - * [subnetID]+[nodeID]+[blsPublicKey]+[weight]+[balance]+[expiry]. This signature must correspond to the Ed25519 - * public key that is used for the nodeID. This approach prevents nodeIDs from being unwillingly added to Subnets. - * balance is the minimum initial $nAVAX balance that must be attached to the validator serialized as a uint64. - * The signature field will be validated by the P-Chain. Implementations may choose to validate that the signature - * field is well-formed but it is not required. + * @param blsPublicKey The BLS public key of the validator. */ function initializeValidatorRegistration( bytes32 nodeID, uint64 registrationExpiry, - bytes memory signature + bytes memory blsPublicKey ) external payable returns (bytes32) { uint64 weight = _processStake(msg.value); - return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, signature); + return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); } // solhint-enable ordering diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index f3a8f5880..8735b2b92 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -12,17 +12,12 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { * @notice Begins the validator registration process. Locks the {stakeAmount} of the managers specified ERC20 token. * @param nodeID The node ID of the validator being registered. * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. - * @param signature The raw bytes of the Ed25519 signature over the concatenated bytes of - * [subnetID]+[nodeID]+[blsPublicKey]+[weight]+[balance]+[expiry]. This signature must correspond to the Ed25519 - * public key that is used for the nodeID. This approach prevents NodeIDs from being unwillingly added to Subnets. - * balance is the minimum initial $nAVAX balance that must be attached to the validator serialized as a uint64. - * The signature field will be validated by the P-Chain. Implementations may choose to validate that the signature - * field is well-formed but it is not required. + * @param blsPublicKey The BLS public key of the validator. */ function initializeValidatorRegistration( uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, - bytes memory signature + bytes memory blsPublicKey ) external returns (bytes32 validationID); } diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index 34b463cc1..da50f0841 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -12,16 +12,11 @@ interface INativeTokenStakingManager is IPoSValidatorManager { * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. - * @param signature The raw bytes of the Ed25519 signature over the concatenated bytes of - * [subnetID]+[nodeID]+[blsPublicKey]+[weight]+[balance]+[expiry]. This signature must correspond to the Ed25519 - * public key that is used for the nodeID. This approach prevents NodeIDs from being unwillingly added to Subnets. - * balance is the minimum initial $nAVAX balance that must be attached to the validator serialized as a uint64. - * The signature field will be validated by the P-Chain. Implementations may choose to validate that the signature - * field is well-formed but it is not required. + * @param blsPublicKey The BLS public key of the validator. */ function initializeValidatorRegistration( bytes32 nodeID, uint64 registrationExpiry, - bytes memory signature + bytes memory blsPublicKey ) external payable returns (bytes32 validationID); } From 12f8664d75740b099fd350bf785c9a4bd211579e Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 26 Aug 2024 21:07:40 -0500 Subject: [PATCH 125/545] SubnetValidatorWeightUpdate packing --- contracts/staking/ValidatorMessages.sol | 97 ++++++++++++++++++- .../tests/ValidatorMessagesTests.t.sol | 11 +++ 2 files changed, 106 insertions(+), 2 deletions(-) diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index bf5fd861e..7ae3e1ec8 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -30,9 +30,9 @@ library ValidatorMessages { // for the given validation ID. uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 2; - // The P-Chain responds with a SetSubnetValidatorWeight message indicating whether the weight update was successful + // The P-Chain responds with a SubnetValidatorWeightUpdateMessage message indicating whether the weight update was successful // for the given validation ID. - uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID = 3; + uint32 internal constant SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID = 3; // The Subnet will self-sign a ValidationUptimeMessage to be provided when a validator is initiating // the end of their validation period. @@ -367,6 +367,99 @@ library ValidatorMessages { return (validationID, nonce, weight); } + /** + * @notice Packs a SubnetValidatorWeightUpdateMessage into a byte array. + * The message format specification is: + * +--------------+----------+----------+ + * | codecID : uint16 | 2 bytes | + * +--------------+----------+----------+ + * | typeID : uint32 | 4 bytes | + * +--------------+----------+----------+ + * | validationID : [32]byte | 32 bytes | + * +--------------+----------+----------+ + * | nonce : uint64 | 8 bytes | + * +--------------+----------+----------+ + * | weight : uint64 | 8 bytes | + * +--------------+----------+----------+ + * | 54 bytes | + * +----------+ + */ + function packSubnetValidatorWeightUpdateMessage(bytes32 validationID, uint64 nonce, uint64 weight) internal pure returns (bytes memory) { + bytes memory res = new bytes(54); + // Pack the codec ID. + for (uint256 i; i < 2; ++i) { + res[i] = bytes1(uint8(CODEC_ID >> (8 * (1 - i)))); + } + // Pack the type ID. + for (uint256 i; i < 4; ++i) { + res[i + 2] = bytes1(uint8(SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID >> (8 * (3 - i)))); + } + // Pack the validation ID. + for (uint256 i; i < 32; ++i) { + res[i + 6] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); + } + // Pack the nonce. + for (uint256 i; i < 8; ++i) { + res[i + 38] = bytes1(uint8(nonce >> (8 * (7 - i)))); + } + // Pack the weight. + for (uint256 i; i < 8; ++i) { + res[i + 46] = bytes1(uint8(weight >> (8 * (7 - i)))); + } + return res; + } + + /** + * @notice Unpacks a byte array as a SubnetValidatorWeightUpdateMessag. + * 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, weight, and nonce. + */ + function unpackSubnetValidatorWeightUpdateMessage(bytes memory input) + internal + pure + returns (bytes32, uint64, uint64) { + require(input.length == 54, "ValidatorMessages: Invalid message length"); + + // Unpack the codec ID. + uint16 codecID; + for (uint256 i; i < 2; ++i) { + codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); + } + require(codecID == CODEC_ID, "ValidatorMessages: Invalid codec ID"); + + // Unpack the type ID. + uint32 typeID; + for (uint256 i; i < 4; ++i) { + typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); + } + require( + typeID == SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID, + "ValidatorMessages: Invalid message type" + ); + + // Unpack the validation ID. + bytes32 validationID; + for (uint256 i; i < 32; ++i) { + validationID |= bytes32(uint256(uint8(input[i + 6])) << (8 * (31 - i))); + } + + // Unpack the nonce. + uint64 nonce; + for (uint256 i; i < 8; ++i) { + nonce |= uint64(uint8(input[i + 38])) << uint64((8 * (7 - i))); + } + + // Unpack the weight. + uint64 weight; + for (uint256 i; i < 8; ++i) { + weight |= uint64(uint8(input[i + 46])) << uint64((8 * (7 - i))); + } + + return (validationID, nonce, weight); + } + /** * @notice Packs a ValidationUptimeMessage into a byte array. * The message format specification is: diff --git a/contracts/staking/tests/ValidatorMessagesTests.t.sol b/contracts/staking/tests/ValidatorMessagesTests.t.sol index 50de496cb..b8fb9e1a2 100644 --- a/contracts/staking/tests/ValidatorMessagesTests.t.sol +++ b/contracts/staking/tests/ValidatorMessagesTests.t.sol @@ -65,6 +65,17 @@ contract ValidatorMessagesTest is Test { assertEq(weight, DEFAULT_WEIGHT); } + function testSubnetValidatorWeightUpdateMessag() public pure { + bytes memory packed = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( + DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT + ); + (bytes32 validationID, uint64 nonce, uint64 weight) = + ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(packed); + assertEq(validationID, DEFAULT_VALIDATION_ID); + assertEq(nonce, 100); + assertEq(weight, DEFAULT_WEIGHT); + } + function testValidationUptimeMessage() public pure { bytes memory packed = ValidatorMessages.packValidationUptimeMessage(DEFAULT_VALIDATION_ID, 100); From 717fd66c301bb0f13c2b54c0b297144e1f1cc046 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 26 Aug 2024 21:08:06 -0500 Subject: [PATCH 126/545] delegation wip --- .../staking/ERC20TokenStakingManager.sol | 8 +- .../staking/NativeTokenStakingManager.sol | 6 + contracts/staking/PoSValidatorManager.sol | 157 +++++++++++++++++- contracts/staking/ValidatorManager.sol | 34 ++++ .../interfaces/IERC20TokenStakingManager.sol | 5 + .../interfaces/INativeTokenStakingManager.sol | 4 + .../interfaces/IPoSValidatorManager.sol | 46 ++++- 7 files changed, 256 insertions(+), 4 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index a26f1dc95..97d5ea8fc 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -82,11 +82,17 @@ contract ERC20TokenStakingManager is bytes32 nodeID, uint64 registrationExpiry, bytes memory blsPublicKey - ) external override returns (bytes32 validationID) { + ) external returns (bytes32 validationID) { uint64 weight = _processStake(stakeAmount); return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); } + function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) external { + uint64 weight = _processStake(stakeAmount); + + return _initializeDelegatorRegistration(validationID, _msgSender(), weight); + } + // Must be guarded with reentrancy guard for safe transfer from function _lock(uint256 value) internal virtual override returns (uint256) { return _getERC20StakingManagerStorage()._token.safeTransferFrom(value); diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 102c1acb2..dfb32aa5e 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -58,6 +58,12 @@ contract NativeTokenStakingManager is return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); } + function initializeDelegatorRegistration(bytes32 validationID) external payable { + uint64 weight = _processStake(msg.value); + + return _initializeDelegatorRegistration(validationID, _msgSender(), weight); + } + // solhint-enable ordering function _lock(uint256 value) internal virtual override returns (uint256) { return value; diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index b8f443a77..7842fd0f9 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -5,9 +5,10 @@ pragma solidity 0.8.25; -import {IPoSValidatorManager} from "./interfaces/IPoSValidatorManager.sol"; +import {IPoSValidatorManager, Delegator} from "./interfaces/IPoSValidatorManager.sol"; import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; import {ValidatorManager} from "./ValidatorManager.sol"; +import {Validator, ValidatorStatus} from "./interfaces/IValidatorManager.sol"; import {WarpMessage} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; import {ValidatorMessages} from "./ValidatorMessages.sol"; @@ -22,6 +23,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 _minimumStakeDuration; IRewardCalculator _rewardCalculator; mapping(bytes32 validationID => uint64) _uptimes; + /// @notice Maps the validationID to a mapping of delegator address to delegator information. + mapping(bytes32 => mapping(address => Delegator)) _delegatorStakes; + + mapping(bytes32 => mapping(address => bytes)) _pendingRegisterDelegatorMessages; + + mapping(bytes32 => mapping(address => bytes)) _pendingEndDelegatorMessages; } // solhint-enable private-vars-leading-underscore @@ -111,8 +118,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Ensure the stake churn doesn't exceed the maximum churn rate. uint64 weight = valueToWeight(lockedValue); - // Ensure the weight is within the valid range. + // Ensure the weight is within the valid range. require( weight >= $._minimumStakeAmount && weight <= $._maximumStakeAmount, "PoSValidatorManager: Invalid stake amount" @@ -130,4 +137,150 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function _lock(uint256 value) internal virtual returns (uint256); function _unlock(uint256 value, address to) internal virtual; + + function _initializeDelegatorRegistration(bytes32 validationID, address delegator, uint64 weight) internal nonReentrant { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + // Ensure the validation period is active + Validator memory validator = _getValidator(validationID); + require( + validator.status == ValidatorStatus.Active, "ValidatorManager: Validator not active" + ); + + // Ensure the delegator is not already registered + require( + $._delegatorStakes[validationID][delegator].weight == 0, + "ValidatorManager: Delegator already registered" + ); + + uint64 nonce = _getAndIncrementNonce(validationID); + bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, nonce, weight); + + $._pendingRegisterDelegatorMessages[validationID][delegator] = setValidatorWeightPayload; + + // Submit the message to the Warp precompile. + WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); + + $._delegatorStakes[validationID][delegator] = Delegator({ + weight: weight, + startedAt: uint64(block.timestamp), + endedAt: 0, + status: ValidatorStatus.PendingAdded + }); + + emit DelegatorRegistered(validationID, delegator, weight, block.timestamp); + } + + function resendDelegatorRegistration(bytes32 validationID, address delegator) external { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + require( + $._pendingRegisterDelegatorMessages[validationID][delegator].length > 0 + && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingAdded, + "PoSValidatorManager: Delegator registration not pending" + ); + + // Submit the message to the Warp precompile. + WARP_MESSENGER.sendWarpMessage($._pendingRegisterDelegatorMessages[validationID][delegator]); + } + + function completeDelegatorRegistration(uint32 messageIndex, address delegator) external { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); + (bytes32 validationID, uint64 nonce, uint64 weight) = + ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); + + require( + $._pendingRegisterDelegatorMessages[validationID][delegator].length > 0 + && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingAdded, + "PoSValidatorManager: Delegator registration not pending" + ); + + delete $._pendingRegisterDelegatorMessages[validationID][delegator]; + + Validator memory validator = _getValidator(validationID); + require( + $._delegatorStakes[validationID][delegator].weight + + validator.weight == weight, + "PoSValidatorManager: Invalid weight" + ); + require ( + validator.messageNonce >= nonce, + "PoSValidatorManager: Invalid nonce" + ); + $._delegatorStakes[validationID][delegator].status = ValidatorStatus.Active; + _setValidator(validationID, validator); + + emit DelegatorRegistered(validationID, delegator, weight, block.timestamp); + } + + function initializeEndDelegation(bytes32 validationID) external { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + // Ensure the delegator is active + Delegator memory delegator = $._delegatorStakes[validationID][_msgSender()]; + require( + delegator.status == ValidatorStatus.Active, "ValidatorManager: Delegator not active" + ); + delegator.status = ValidatorStatus.PendingRemoved; + delegator.endedAt = uint64(block.timestamp); + + $._delegatorStakes[validationID][_msgSender()] = delegator; + + Validator memory validator = _getValidator(validationID); + + require(validator.weight >= delegator.weight, "PoSValidatorManager: Invalid weight"); + uint64 weight = validator.weight - delegator.weight; + validator.weight = weight; + _setValidator(validationID, validator); + + bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage( + validationID, + _getAndIncrementNonce(validationID), + weight + ); + + $._pendingEndDelegatorMessages[validationID][_msgSender()] = setValidatorWeightPayload; + + bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); + + emit DelegatorRemovalInitialized(validationID, messageID, _msgSender(), block.timestamp); + } + + function resendEndDelegation(bytes32 validationID, address delegator) external { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + require( + $._pendingEndDelegatorMessages[validationID][delegator].length > 0 + && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingRemoved, + "PoSValidatorManager: Delegator removal not pending" + ); + WARP_MESSENGER.sendWarpMessage($._pendingEndDelegatorMessages[validationID][delegator]); + } + + function completeEndDelegation(uint32 messageIndex, address delegator) external{ + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); + (bytes32 validationID, uint64 nonce, uint64 weight) = + ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); + + require( + $._pendingEndDelegatorMessages[validationID][delegator].length > 0 + && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingRemoved, + "PoSValidatorManager: Delegator removal not pending" + ); + + delete $._pendingEndDelegatorMessages[validationID][delegator]; + + Validator memory validator = _getValidator(validationID); + require( + validator.weight == weight, + "PoSValidatorManager: Invalid weight" + ); + require ( + validator.messageNonce >= nonce, + "PoSValidatorManager: Invalid nonce" + ); + $._delegatorStakes[validationID][delegator].status = ValidatorStatus.Completed; + + emit DelegationEnded(validationID, delegator); + } } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 87194c553..4279c2dd5 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -350,4 +350,38 @@ abstract contract ValidatorManager is ); $._churnTracker = churnTracker; } + + function _getAndIncrementNonce(bytes32 validationID) internal returns (uint64) { + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + uint64 currentNonce = $._validationPeriods[validationID].messageNonce; + uint64 nonce=currentNonce + 1; + $._validationPeriods[validationID].messageNonce = nonce; + return currentNonce; + } + + function _getPChainWarpMessage(uint32 messageIndex) internal view returns (WarpMessage memory) { + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + (WarpMessage memory warpMessage, bool valid) = + WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); + require(valid, "ValidatorManager: Invalid warp message"); + require( + warpMessage.sourceChainID == $._pChainBlockchainID, + "ValidatorManager: Invalid source chain ID" + ); + require( + warpMessage.originSenderAddress == address(0), + "ValidatorManager: Invalid origin sender address" + ); + return warpMessage; + } + + function _getValidator(bytes32 validationID) internal view returns (Validator memory) { + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + return $._validationPeriods[validationID]; + } + + function _setValidator(bytes32 validationID, Validator memory validator) internal { + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + $._validationPeriods[validationID] = validator; + } } diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index 8735b2b92..7239a25ca 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -20,4 +20,9 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { uint64 registrationExpiry, bytes memory blsPublicKey ) external returns (bytes32 validationID); + + function initializeDelegatorRegistration( + bytes32 validationID, + uint256 stakeAmount + ) external; } diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index da50f0841..370248dd3 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -19,4 +19,8 @@ interface INativeTokenStakingManager is IPoSValidatorManager { uint64 registrationExpiry, bytes memory blsPublicKey ) external payable returns (bytes32 validationID); + + function initializeDelegatorRegistration( + bytes32 validationID + ) external payable; } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 4459aa8be..d31e6552a 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -5,7 +5,7 @@ pragma solidity 0.8.25; -import {IValidatorManager, ValidatorManagerSettings} from "./IValidatorManager.sol"; +import {IValidatorManager, ValidatorStatus, ValidatorManagerSettings} from "./IValidatorManager.sol"; import {IRewardCalculator} from "./IRewardCalculator.sol"; struct PoSValidatorManagerSettings { @@ -16,6 +16,13 @@ struct PoSValidatorManagerSettings { IRewardCalculator rewardCalculator; } +struct Delegator { + uint64 weight; + uint64 startedAt; + uint64 endedAt; + ValidatorStatus status; +} + interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when a validator's uptime is updated. @@ -24,6 +31,33 @@ interface IPoSValidatorManager is IValidatorManager { */ event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); + event DelegatorAdded( + bytes32 indexed validationID, + bytes32 indexed setWeightMessageID, + address indexed delegator, + uint256 weight, + uint256 startTime + ); + + event DelegatorRegistered( + bytes32 indexed validationID, + address indexed delegator, + uint256 weight, + uint256 startTime + ); + + event DelegatorRemovalInitialized( + bytes32 indexed validationID, + bytes32 indexed setWeightMessageID, + address indexed delegator, + uint256 endTime + ); + + event DelegationEnded( + bytes32 indexed validationID, + address indexed delegator + ); + /** * @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. @@ -39,4 +73,14 @@ interface IPoSValidatorManager is IValidatorManager { bool includeUptimeProof, uint32 messageIndex ) external; + + function resendDelegatorRegistration(bytes32 validationID, address delegator) external; + + function completeDelegatorRegistration(uint32 messageIndex, address delegator) external; + + function initializeEndDelegation(bytes32 validationID) external; + + function resendEndDelegation(bytes32 validationID, address delegator) external; + + function completeEndDelegation(uint32 messageIndex, address delegator) external; } From 43644fbac1594b4e4e98ded2e064edd867fe5ff4 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 27 Aug 2024 09:44:57 -0400 Subject: [PATCH 127/545] update naming --- contracts/staking/PoSValidatorManager.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index b8f443a77..3eab710e4 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -21,7 +21,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 _maximumStakeAmount; uint64 _minimumStakeDuration; IRewardCalculator _rewardCalculator; - mapping(bytes32 validationID => uint64) _uptimes; + mapping(bytes32 validationID => uint64) _validatorUptimes; } // solhint-enable private-vars-leading-underscore @@ -97,7 +97,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: invalid uptime validation ID" ); - $._uptimes[validationID] = uptime; + $._validatorUptimes[validationID] = uptime; emit ValidationUptimeUpdated(validationID, uptime); } From b5eefe8603674d277a5aba7b8a12e4fed2861634 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 27 Aug 2024 09:47:25 -0400 Subject: [PATCH 128/545] remove todo --- contracts/staking/tests/PoSValidatorManagerTests.t.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 5b7c4e5c1..41fe6693f 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -21,7 +21,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); function testInitializeEndValidationWithUptimeProof() public { - // TODO: implement bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, From 98bb3fbe91ec1510875f24927be5589fc42a38b6 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 27 Aug 2024 09:50:36 -0400 Subject: [PATCH 129/545] Implementation --- contracts/staking/PoSValidatorManager.sol | 71 ++++++++++++++++--- contracts/staking/ValidatorManager.sol | 42 +---------- .../interfaces/IPoSValidatorManager.sol | 8 +++ .../staking/interfaces/IValidatorManager.sol | 7 -- .../tests/ERC20TokenStakingManagerTests.t.sol | 5 +- .../NativeTokenStakingManagerTests.t.sol | 5 +- .../tests/PoAValidatorManagerTests.t.sol | 3 +- tests/utils/staking.go | 4 +- 8 files changed, 82 insertions(+), 63 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 3eab710e4..f5fb3b7a4 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -5,7 +5,7 @@ pragma solidity 0.8.25; -import {IPoSValidatorManager} from "./interfaces/IPoSValidatorManager.sol"; +import {IPoSValidatorManager, ValidatorChurnPeriod} from "./interfaces/IPoSValidatorManager.sol"; import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; import {ValidatorManager} from "./ValidatorManager.sol"; import {WarpMessage} from @@ -19,7 +19,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager struct PoSValidatorManagerStorage { uint256 _minimumStakeAmount; uint256 _maximumStakeAmount; + uint256 _totalWeight; + uint256 _churnTrackerStartTime; uint64 _minimumStakeDuration; + uint8 _maximumHourlyChurn; + ValidatorChurnPeriod _churnTracker; IRewardCalculator _rewardCalculator; mapping(bytes32 validationID => uint64) _validatorUptimes; } @@ -48,25 +52,31 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager onlyInitializing { __ValidatorManager_init(settings.baseSettings); - __POS_Validator_Manager_init_unchained( - settings.minimumStakeAmount, - settings.maximumStakeAmount, - settings.minimumStakeDuration, - settings.rewardCalculator - ); + __POS_Validator_Manager_init_unchained({ + minimumStakeAmount: settings.minimumStakeAmount, + maximumStakeAmount: settings.maximumStakeAmount, + churnTrackerStartTime: settings.churnTrackerStartTime, + minimumStakeDuration: settings.minimumStakeDuration, + maximumHourlyChurn: settings.maximumHourlyChurn, + rewardCalculator: settings.rewardCalculator + }); } // solhint-disable-next-line func-name-mixedcase function __POS_Validator_Manager_init_unchained( uint256 minimumStakeAmount, uint256 maximumStakeAmount, + uint256 churnTrackerStartTime, uint64 minimumStakeDuration, + uint8 maximumHourlyChurn, IRewardCalculator rewardCalculator ) internal onlyInitializing { PoSValidatorManagerStorage storage s = _getPoSValidatorManagerStorage(); s._minimumStakeAmount = minimumStakeAmount; s._maximumStakeAmount = maximumStakeAmount; + s._churnTrackerStartTime = churnTrackerStartTime; s._minimumStakeDuration = minimumStakeDuration; + s._maximumHourlyChurn = maximumHourlyChurn; s._rewardCalculator = rewardCalculator; } @@ -75,8 +85,15 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bool includeUptimeProof, uint32 messageIndex ) external { + ValidatorManagerStorage storage s = _getValidatorManagerStorage(); + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + uint64 weight = s._validationPeriods[validationID].weight; + _checkAndUpdateChurnTracker(weight); + // Update weight after checking the churn tracker. + $._totalWeight -= weight; + if (includeUptimeProof) { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); require(valid, "PoSValidatorManager: invalid warp message"); @@ -117,6 +134,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager weight >= $._minimumStakeAmount && weight <= $._maximumStakeAmount, "PoSValidatorManager: Invalid stake amount" ); + + // Check that adding this validator would not exceed the maximum churn rate. + _checkAndUpdateChurnTracker(weight); + // Update weight after checking the churn tracker. + $._totalWeight += weight; + return weight; } @@ -130,4 +153,36 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function _lock(uint256 value) internal virtual returns (uint256); function _unlock(uint256 value, address to) internal virtual; + + /** + * @notice Helper function to check if the stake amount to be added or removed would exceed the maximum stake churn + * rate for the past hour. If the churn rate is exceeded, the function will revert. If the churn rate is not exceeded, + * the function will update the churn tracker with the new amount. + */ + function _checkAndUpdateChurnTracker(uint64 amount) private { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + if ($._maximumHourlyChurn == 0) { + return; + } + + uint256 currentTime = block.timestamp; + if ($._churnTrackerStartTime >= currentTime) { + return; + } + + ValidatorChurnPeriod memory churnTracker = $._churnTracker; + if (currentTime - churnTracker.startedAt >= 1 hours) { + churnTracker.churnAmount = amount; + churnTracker.startedAt = currentTime; + } else { + churnTracker.churnAmount += amount; + } + + uint8 churnPercentage = uint8((churnTracker.churnAmount * 100) / churnTracker.initialWeight); + require( + churnPercentage <= $._maximumHourlyChurn, + "ValidatorManager: Maximum hourly churn rate exceeded" + ); + $._churnTracker = churnTracker; + } } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 87194c553..3c7c36211 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -9,8 +9,7 @@ import { IValidatorManager, ValidatorManagerSettings, ValidatorStatus, - Validator, - ValidatorChurnPeriod + Validator } from "./interfaces/IValidatorManager.sol"; import { WarpMessage, @@ -37,8 +36,6 @@ abstract contract ValidatorManager is bytes32 _pChainBlockchainID; /// @notice The subnetID associated with this validator manager. bytes32 _subnetID; - uint8 _maximumHourlyChurn; - ValidatorChurnPeriod _churnTracker; /// @notice Maps the validationID to the registration message such that the message can be re-sent if needed. mapping(bytes32 => bytes) _pendingRegisterValidationMessages; /// @notice Maps the validationID to the validator information. @@ -55,7 +52,7 @@ abstract contract ValidatorManager is // solhint-disable ordering function _getValidatorManagerStorage() - private + internal pure returns (ValidatorManagerStorage storage $) { @@ -89,7 +86,6 @@ abstract contract ValidatorManager is ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); $._pChainBlockchainID = settings.pChainBlockchainID; $._subnetID = settings.subnetID; - $._maximumHourlyChurn = settings.maximumHourlyChurn; } /** @@ -119,8 +115,6 @@ abstract contract ValidatorManager is ); require(blsPublicKey.length == 48, "ValidatorManager: Invalid blsPublicKey length"); - _checkAndUpdateChurnTracker(weight); - (bytes32 validationID, bytes memory registerSubnetValidatorMessage) = ValidatorMessages .packRegisterSubnetValidatorMessage( ValidatorMessages.ValidationPeriod({ @@ -220,9 +214,6 @@ abstract contract ValidatorManager is ); require(_msgSender() == validator.owner, "ValidatorManager: Sender not validator owner"); - // Check that removing this validator would not exceed the maximum churn rate. - _checkAndUpdateChurnTracker(validator.weight); - // Update the validator status to pending removal. // They are not removed from the active validators mapping until the P-Chain acknowledges the removal. validator.status = ValidatorStatus.PendingRemoved; @@ -321,33 +312,4 @@ abstract contract ValidatorManager is // Emit event. emit ValidationPeriodEnded(validationID); } - - /** - * @notice Helper function to check if the stake amount to be added or removed would exceed the maximum stake churn - * rate for the past hour. If the churn rate is exceeded, the function will revert. If the churn rate is not exceeded, - * the function will update the churn tracker with the new amount. - */ - // TODO: right now implementation has reference to stake, evaluate for PoA. - function _checkAndUpdateChurnTracker(uint64 amount) private { - ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - if ($._maximumHourlyChurn == 0) { - return; - } - - ValidatorChurnPeriod memory churnTracker = $._churnTracker; - uint256 currentTime = block.timestamp; - if (currentTime - churnTracker.startedAt >= 1 hours) { - churnTracker.churnAmount = amount; - churnTracker.startedAt = currentTime; - } else { - churnTracker.churnAmount += amount; - } - - uint8 churnPercentage = uint8((churnTracker.churnAmount * 100) / churnTracker.initialStake); - require( - churnPercentage <= $._maximumHourlyChurn, - "ValidatorManager: Maximum hourly churn rate exceeded" - ); - $._churnTracker = churnTracker; - } } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 4459aa8be..095f87c17 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -12,10 +12,18 @@ struct PoSValidatorManagerSettings { ValidatorManagerSettings baseSettings; uint256 minimumStakeAmount; uint256 maximumStakeAmount; + uint256 churnTrackerStartTime; uint64 minimumStakeDuration; + uint8 maximumHourlyChurn; IRewardCalculator rewardCalculator; } +struct ValidatorChurnPeriod { + uint256 startedAt; + uint64 initialWeight; + uint64 churnAmount; +} + interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when a validator's uptime is updated. diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 962c4176c..f05d98dd1 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -24,16 +24,9 @@ struct Validator { uint64 endedAt; } -struct ValidatorChurnPeriod { - uint256 startedAt; - uint64 initialStake; - uint64 churnAmount; -} - struct ValidatorManagerSettings { bytes32 pChainBlockchainID; bytes32 subnetID; - uint8 maximumHourlyChurn; } interface IValidatorManager { diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index a49336a6e..9fb977656 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -31,12 +31,13 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, - subnetID: DEFAULT_SUBNET_ID, - maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + subnetID: DEFAULT_SUBNET_ID }), minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + churnTrackerStartTime: 0, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, rewardCalculator: IRewardCalculator(address(0)) }), token diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 79827827f..3721be3a9 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -24,12 +24,13 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, - subnetID: DEFAULT_SUBNET_ID, - maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + subnetID: DEFAULT_SUBNET_ID }), minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + churnTrackerStartTime: 0, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, rewardCalculator: IRewardCalculator(address(0)) }) ); diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index 33956944e..feb0b9759 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -22,8 +22,7 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { app.initialize( ValidatorManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, - subnetID: DEFAULT_SUBNET_ID, - maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + subnetID: DEFAULT_SUBNET_ID }), address(this) ); diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 5c998e18f..77c8274df 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -70,7 +70,7 @@ func DeployAndInitializeNativeTokenStakingManager( BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnet.SubnetID, - MaximumHourlyChurn: 0, + MaximumHourlyChurn: 10, }, MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), @@ -130,7 +130,7 @@ func DeployAndInitializeERC20TokenStakingManager( BaseSettings: erc20tokenstakingmanager.ValidatorManagerSettings{ PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnet.SubnetID, - MaximumHourlyChurn: 0, + MaximumHourlyChurn: 10, }, MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), From 7414d70398cf3070913d691edba9e7c279715dbc Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Tue, 27 Aug 2024 12:27:43 -0400 Subject: [PATCH 130/545] fix nit addresses review comment https://github.com/ava-labs/teleporter/pull/502#discussion_r1729545517 Signed-off-by: F. Eugene Aumson --- contracts/staking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/README.md b/contracts/staking/README.md index c086b0c25..8e724082b 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -44,7 +44,7 @@ ACP-77 also provides a method for validators to exit a Subnet's validator set wi Description: Issued by the Validator Manager contract in order to register a Subnet validator -Signed by: Subnet validators +Signed by: Subnet Specification: From 319af42147f3cf18dd501cae8e61d66ca5069114 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 12:29:39 -0500 Subject: [PATCH 131/545] cleanup --- contracts/staking/PoSValidatorManager.sol | 10 ++++---- contracts/staking/ValidatorManager.sol | 31 ++++++++++------------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 7842fd0f9..578b64336 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -153,8 +153,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "ValidatorManager: Delegator already registered" ); - uint64 nonce = _getAndIncrementNonce(validationID); - bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, nonce, weight); + _checkAndUpdateChurnTracker(weight); + + bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, _getAndIncrementNonce(validationID), weight); $._pendingRegisterDelegatorMessages[validationID][delegator] = setValidatorWeightPayload; @@ -229,14 +230,13 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _getValidator(validationID); require(validator.weight >= delegator.weight, "PoSValidatorManager: Invalid weight"); - uint64 weight = validator.weight - delegator.weight; - validator.weight = weight; + validator.weight = validator.weight - delegator.weight; _setValidator(validationID, validator); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage( validationID, _getAndIncrementNonce(validationID), - weight + validator.weight ); $._pendingEndDelegatorMessages[validationID][_msgSender()] = setValidatorWeightPayload; diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 4279c2dd5..b8899f26e 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -41,6 +41,8 @@ abstract contract ValidatorManager is ValidatorChurnPeriod _churnTracker; /// @notice Maps the validationID to the registration message such that the message can be re-sent if needed. mapping(bytes32 => bytes) _pendingRegisterValidationMessages; + /// @notice Maps the validationID to the end validation message such that the message can be re-sent if needed. + mapping(bytes32 => bytes) _pendingEndValidationMessages; /// @notice Maps the validationID to the validator information. mapping(bytes32 => Validator) _validationPeriods; /// @notice Maps the nodeID to the validationID for active validation periods. @@ -135,12 +137,13 @@ abstract contract ValidatorManager is // Submit the message to the Warp precompile. bytes32 messageID = WARP_MESSENGER.sendWarpMessage(registerSubnetValidatorMessage); - + uint64 nonce = _getAndIncrementNonce(validationID); + require(nonce == 0, "ValidatorManager: Nonce must be 0"); $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.PendingAdded, nodeID: nodeID, owner: _msgSender(), - messageNonce: 0, + messageNonce: nonce, weight: weight, startedAt: 0, // The validation period only starts once the registration is acknowledged. endedAt: 0 @@ -173,21 +176,10 @@ abstract contract ValidatorManager is */ function completeValidatorRegistration(uint32 messageIndex) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - (WarpMessage memory warpMessage, bool valid) = - WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "ValidatorManager: Invalid warp message"); - - require( - warpMessage.sourceChainID == $._pChainBlockchainID, - "ValidatorManager: Invalid source chain ID" - ); - require( - warpMessage.originSenderAddress == address(0), - "ValidatorManager: Invalid origin sender address" - ); - + WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, bool validRegistration) = ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); + require(validRegistration, "ValidatorManager: Registration not valid"); require( $._pendingRegisterValidationMessages[validationID].length > 0 @@ -237,7 +229,9 @@ abstract contract ValidatorManager is // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, validator.messageNonce, 0); + .packSetSubnetValidatorWeightMessage(validationID, _getAndIncrementNonce(validationID), 0); + $._pendingEndValidationMessages[validationID] = setValidatorWeightPayload; + bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); // Emit the event to signal the start of the validator removal process. @@ -254,7 +248,8 @@ abstract contract ValidatorManager is Validator memory validator = $._validationPeriods[validationID]; require( - validator.status == ValidatorStatus.PendingRemoved, + $._pendingEndValidationMessages[validationID].length > 0 + && validator.status == ValidatorStatus.PendingRemoved, "ValidatorManager: Validator not pending removal" ); @@ -328,7 +323,7 @@ abstract contract ValidatorManager is * the function will update the churn tracker with the new amount. */ // TODO: right now implementation has reference to stake, evaluate for PoA. - function _checkAndUpdateChurnTracker(uint64 amount) private { + function _checkAndUpdateChurnTracker(uint64 amount) internal { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); if ($._maximumHourlyChurn == 0) { return; From 8ec0bbddfffb39228168f14cea5b3357c98828da Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 15:06:07 -0500 Subject: [PATCH 132/545] increment nonce on usage --- contracts/staking/ValidatorManager.sol | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index b8899f26e..ecbad521c 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -137,17 +137,17 @@ abstract contract ValidatorManager is // Submit the message to the Warp precompile. bytes32 messageID = WARP_MESSENGER.sendWarpMessage(registerSubnetValidatorMessage); - uint64 nonce = _getAndIncrementNonce(validationID); - require(nonce == 0, "ValidatorManager: Nonce must be 0"); $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.PendingAdded, nodeID: nodeID, owner: _msgSender(), - messageNonce: nonce, + messageNonce: 0, weight: weight, startedAt: 0, // The validation period only starts once the registration is acknowledged. endedAt: 0 }); + // Increment the nonce for the next usage. + _getAndIncrementNonce(validationID); emit ValidationPeriodCreated(validationID, nodeID, messageID, weight, registrationExpiry); return validationID; @@ -253,9 +253,7 @@ abstract contract ValidatorManager is "ValidatorManager: Validator not pending removal" ); - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, validator.messageNonce, 0); - WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); + WARP_MESSENGER.sendWarpMessage($._pendingEndValidationMessages[validationID]); } /** @@ -349,8 +347,7 @@ abstract contract ValidatorManager is function _getAndIncrementNonce(bytes32 validationID) internal returns (uint64) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); uint64 currentNonce = $._validationPeriods[validationID].messageNonce; - uint64 nonce=currentNonce + 1; - $._validationPeriods[validationID].messageNonce = nonce; + $._validationPeriods[validationID].messageNonce++; return currentNonce; } From 76e3277b4460d8be4afefd3d47ca73c0a7fdbab6 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 15:06:26 -0500 Subject: [PATCH 133/545] bug fixes --- contracts/staking/PoSValidatorManager.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 578b64336..b0269f4cc 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -155,12 +155,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _checkAndUpdateChurnTracker(weight); - bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, _getAndIncrementNonce(validationID), weight); + bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, _getAndIncrementNonce(validationID), validator.weight + weight); $._pendingRegisterDelegatorMessages[validationID][delegator] = setValidatorWeightPayload; // Submit the message to the Warp precompile. - WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); + bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); $._delegatorStakes[validationID][delegator] = Delegator({ weight: weight, @@ -169,7 +169,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager status: ValidatorStatus.PendingAdded }); - emit DelegatorRegistered(validationID, delegator, weight, block.timestamp); + emit DelegatorAdded(validationID, messageID, delegator, weight, block.timestamp); } function resendDelegatorRegistration(bytes32 validationID, address delegator) external { @@ -211,7 +211,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager $._delegatorStakes[validationID][delegator].status = ValidatorStatus.Active; _setValidator(validationID, validator); - emit DelegatorRegistered(validationID, delegator, weight, block.timestamp); + emit DelegatorRegistered(validationID, delegator, $._delegatorStakes[validationID][delegator].weight, block.timestamp); } function initializeEndDelegation(bytes32 validationID) external { From 4ea1ff05252ba97271b8d0c9d1bef5c058fd4d95 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 15:06:38 -0500 Subject: [PATCH 134/545] fix whitespace --- contracts/staking/interfaces/IPoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index d31e6552a..f8ed1a8df 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -31,7 +31,7 @@ interface IPoSValidatorManager is IValidatorManager { */ event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); - event DelegatorAdded( + event DelegatorAdded( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, From abf330ed114f320f5d7bce911ef63aefb4edff95 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 15:06:53 -0500 Subject: [PATCH 135/545] initializeRegisterDelegator tests passing --- .../tests/ERC20TokenStakingManagerTests.t.sol | 23 ++- .../NativeTokenStakingManagerTests.t.sol | 13 +- .../tests/PoAValidatorManagerTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 184 ++++++++++++++++++ .../staking/tests/ValidatorManagerTests.t.sol | 8 +- 5 files changed, 222 insertions(+), 8 deletions(-) diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index a49336a6e..1b9af60d2 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -56,8 +56,27 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ); } - function _beforeSend(uint64 weight) internal override { + function _initializeDelegatorRegistration( + bytes32 validationID, + address delegator, + uint64 weight + ) internal virtual override { + uint256 value = app.weightToValue(weight); + vm.startPrank(delegator); + app.initializeDelegatorRegistration( + validationID, value + ); + vm.stopPrank(); + } + + function _beforeSend(uint64 weight, address spender) internal override { + uint256 value = app.weightToValue(weight); + token.safeIncreaseAllowance(spender, value); + token.safeTransfer(spender, value); + // ERC20 tokens need to be pre-approved - token.safeIncreaseAllowance(address(app), app.weightToValue(weight)); + vm.startPrank(spender); + token.safeIncreaseAllowance(address(app), value); + vm.stopPrank(); } } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 79827827f..3096ab12f 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -49,7 +49,18 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ); } - function _beforeSend(uint64 weight) internal override { + function _initializeDelegatorRegistration( + bytes32 validationID, + address delegator, + uint64 weight + ) internal virtual override { + uint256 value = app.weightToValue(weight); + vm.prank(delegator); + vm.deal(delegator, value); + app.initializeDelegatorRegistration{value: value}(validationID); + } + + function _beforeSend(uint64 weight, address spender) internal override { // Native tokens no need pre approve } } diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index 33956944e..3e247c9d8 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -56,5 +56,5 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { } // solhint-disable-next-line no-empty-blocks - function _beforeSend(uint64 weight) internal virtual override {} + function _beforeSend(uint64 weight, address spender) internal virtual override {} } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 5b7c4e5c1..a812b0227 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -15,11 +15,43 @@ import {ValidatorMessages} from "../ValidatorMessages.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_UPTIME = uint64(100); + uint64 public constant DEFAULT_DELEGATOR_WEIGHT = uint64(1e5); + uint64 public constant DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP = uint64(2000); + uint64 public constant DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP = uint64(3000); + uint64 public constant DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP = uint64(4000); + address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); PoSValidatorManager public posValidatorManager; event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); + event DelegatorAdded( + bytes32 indexed validationID, + bytes32 indexed setWeightMessageID, + address indexed delegator, + uint256 weight, + uint256 startTime + ); + + event DelegatorRegistered( + bytes32 indexed validationID, + address indexed delegator, + uint256 weight, + uint256 startTime + ); + + event DelegatorRemovalInitialized( + bytes32 indexed validationID, + bytes32 indexed setWeightMessageID, + address indexed delegator, + uint256 endTime + ); + + event DelegationEnded( + bytes32 indexed validationID, + address indexed delegator + ); + function testInitializeEndValidationWithUptimeProof() public { // TODO: implement bytes32 validationID = _setUpCompleteValidatorRegistration({ @@ -146,6 +178,72 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.initializeEndValidation(validationID, true, 0); } + function testInitializeDelegatorRegistration() public { + _setUpInitializeDelegatorRegistration(DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP); + } + + function testResendDelegatorRegistration() public { + bytes32 validationID = _setUpInitializeDelegatorRegistration(DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP); + bytes memory setValidatorWeightPayload = ValidatorMessages + .packSetSubnetValidatorWeightMessage( + validationID, + 1, + DEFAULT_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + ); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + posValidatorManager.resendDelegatorRegistration(validationID, DEFAULT_DELEGATOR_ADDRESS); + } + + function testCompleteDelegatorRegistration() public { + _setUpCompleteDelegatorRegistration(DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); + } + + function testInitializeEndDelegation() public { + _setUpInitializeEndDelegation( + DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + ); + } + + function testResendEndDelegation() public { + bytes32 validationID = _setUpInitializeEndDelegation( + DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + ); + bytes memory setValidatorWeightPayload = + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + posValidatorManager.resendEndDelegation(validationID, DEFAULT_DELEGATOR_ADDRESS); + } + + function testCompleteEndDelegation() public { + bytes32 validationID = _setUpInitializeEndDelegation( + DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + ); + + bytes memory weightUpdateMessage = + ValidatorMessages.packSubnetValidatorWeightUpdateMessage( + validationID, + 2, + DEFAULT_WEIGHT + ); + _mockSendWarpMessage(weightUpdateMessage, bytes32(0)); + + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit DelegatorRegistered(validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); + posValidatorManager.completeEndDelegation(0, DEFAULT_DELEGATOR_ADDRESS); + } + function testValueToWeight() public view { uint64 w1 = posValidatorManager.valueToWeight(1e12); uint64 w2 = posValidatorManager.valueToWeight(1e18); @@ -170,6 +268,92 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { return posValidatorManager.initializeEndValidation(validationID, false, 0); } + function _initializeDelegatorRegistration( + bytes32 validationID, + address delegator, + uint64 weight + ) internal virtual; + + function _setUpInitializeDelegatorRegistration( + address delegator, + uint64 weight, + uint64 registrationTimestamp + ) internal returns (bytes32) { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + + bytes memory setValidatorWeightPayload = ValidatorMessages + .packSetSubnetValidatorWeightMessage( + validationID, + 1, + DEFAULT_WEIGHT + weight + ); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + vm.warp(registrationTimestamp); + + _beforeSend(weight, delegator); + + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit DelegatorAdded(validationID, bytes32(0), delegator, weight, registrationTimestamp); + + _initializeDelegatorRegistration(validationID, delegator, weight); + return validationID; + } + + function _setUpCompleteDelegatorRegistration( + address delegator, + uint64 weight, + uint64 initRegistrationTimestamp, + uint64 completeRegistrationTimestamp + ) internal returns (bytes32) { + bytes32 validationID = _setUpInitializeDelegatorRegistration(delegator, weight, initRegistrationTimestamp); + bytes memory setValidatorWeightPayload = + ValidatorMessages.packSubnetValidatorWeightUpdateMessage( + validationID, + 1, + DEFAULT_WEIGHT + weight + ); + _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); + + vm.warp(completeRegistrationTimestamp); + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit DelegatorRegistered(validationID, delegator, weight, completeRegistrationTimestamp); + posValidatorManager.completeDelegatorRegistration(0, delegator); + return validationID; + } + + function _setUpInitializeEndDelegation( + address delegator, + uint64 weight, + uint64 initRegistrationTimestamp, + uint64 completeRegistrationTimestamp, + uint64 endDelegationTimestamp + ) internal returns (bytes32) { + bytes32 validationID = _setUpCompleteDelegatorRegistration( + delegator, + weight, + initRegistrationTimestamp, + completeRegistrationTimestamp + ); + + vm.warp(endDelegationTimestamp); + bytes memory setValidatorWeightPayload = + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit DelegatorRemovalInitialized(validationID, bytes32(0), delegator, completeRegistrationTimestamp); + vm.prank(delegator); + posValidatorManager.initializeEndDelegation(validationID); + return validationID; + } + function _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { return abi.encodePacked("PoSValidatorManager: ", errorMessage); } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 1c8a2d89d..57ba105bf 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -150,7 +150,7 @@ abstract contract ValidatorManagerTest is Test { completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); validatorManager.resendEndValidatorMessage(validationID); } @@ -228,7 +228,7 @@ abstract contract ValidatorManagerTest is Test { vm.warp(DEFAULT_EXPIRY - 1); _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); - _beforeSend(weight); + _beforeSend(weight, address(this)); vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodCreated( validationID, DEFAULT_NODE_ID, bytes32(0), weight, DEFAULT_EXPIRY @@ -280,7 +280,7 @@ abstract contract ValidatorManagerTest is Test { vm.warp(completionTimestamp); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 0, 0); + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); @@ -337,6 +337,6 @@ abstract contract ValidatorManagerTest is Test { function _initializeEndValidation(bytes32 validationID) internal virtual; - function _beforeSend(uint64 weight) internal virtual; + function _beforeSend(uint64 weight, address spender) internal virtual; } // solhint-enable no-empty-blocks From c290bca6b9326567f4213644b701cc28a4234f38 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 15:38:35 -0500 Subject: [PATCH 136/545] update weight on complete step --- contracts/staking/PoSValidatorManager.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index b0269f4cc..7113cb138 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -208,6 +208,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validator.messageNonce >= nonce, "PoSValidatorManager: Invalid nonce" ); + validator.weight = weight; $._delegatorStakes[validationID][delegator].status = ValidatorStatus.Active; _setValidator(validationID, validator); @@ -228,15 +229,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager $._delegatorStakes[validationID][_msgSender()] = delegator; Validator memory validator = _getValidator(validationID); - require(validator.weight >= delegator.weight, "PoSValidatorManager: Invalid weight"); - validator.weight = validator.weight - delegator.weight; - _setValidator(validationID, validator); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage( validationID, _getAndIncrementNonce(validationID), - validator.weight + validator.weight - delegator.weight ); $._pendingEndDelegatorMessages[validationID][_msgSender()] = setValidatorWeightPayload; @@ -272,7 +270,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _getValidator(validationID); require( - validator.weight == weight, + validator.weight - $._delegatorStakes[validationID][delegator].weight == weight, "PoSValidatorManager: Invalid weight" ); require ( @@ -280,6 +278,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: Invalid nonce" ); $._delegatorStakes[validationID][delegator].status = ValidatorStatus.Completed; + validator.weight = weight; + _setValidator(validationID, validator); emit DelegationEnded(validationID, delegator); } From 040b9d040342200ea873c51de8614e0eb1b24f7b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 15:38:44 -0500 Subject: [PATCH 137/545] tests passing --- contracts/staking/tests/PoSValidatorManagerTests.t.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index a812b0227..036c4963d 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -237,10 +237,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { 2, DEFAULT_WEIGHT ); - _mockSendWarpMessage(weightUpdateMessage, bytes32(0)); + _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegatorRegistered(validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); + emit DelegationEnded(validationID, DEFAULT_DELEGATOR_ADDRESS); posValidatorManager.completeEndDelegation(0, DEFAULT_DELEGATOR_ADDRESS); } @@ -348,7 +348,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegatorRemovalInitialized(validationID, bytes32(0), delegator, completeRegistrationTimestamp); + emit DelegatorRemovalInitialized(validationID, bytes32(0), delegator, endDelegationTimestamp); vm.prank(delegator); posValidatorManager.initializeEndDelegation(validationID); return validationID; From 49abda951c921f603dac988b04b4a2ed2b3dea90 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 15:40:36 -0500 Subject: [PATCH 138/545] format --- contracts/staking/PoSValidatorManager.sol | 62 ++++++++-------- contracts/staking/ValidatorManager.sol | 8 +- contracts/staking/ValidatorMessages.sol | 16 ++-- .../interfaces/IERC20TokenStakingManager.sol | 5 +- .../interfaces/INativeTokenStakingManager.sol | 4 +- .../interfaces/IPoSValidatorManager.sol | 14 ++-- .../tests/ERC20TokenStakingManagerTests.t.sol | 4 +- .../tests/PoSValidatorManagerTests.t.sol | 73 +++++++++---------- 8 files changed, 91 insertions(+), 95 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 7113cb138..bafde3793 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -25,9 +25,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager mapping(bytes32 validationID => uint64) _uptimes; /// @notice Maps the validationID to a mapping of delegator address to delegator information. mapping(bytes32 => mapping(address => Delegator)) _delegatorStakes; - mapping(bytes32 => mapping(address => bytes)) _pendingRegisterDelegatorMessages; - mapping(bytes32 => mapping(address => bytes)) _pendingEndDelegatorMessages; } // solhint-enable private-vars-leading-underscore @@ -138,7 +136,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function _lock(uint256 value) internal virtual returns (uint256); function _unlock(uint256 value, address to) internal virtual; - function _initializeDelegatorRegistration(bytes32 validationID, address delegator, uint64 weight) internal nonReentrant { + function _initializeDelegatorRegistration( + bytes32 validationID, + address delegator, + uint64 weight + ) internal nonReentrant { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Ensure the validation period is active @@ -155,7 +157,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _checkAndUpdateChurnTracker(weight); - bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, _getAndIncrementNonce(validationID), validator.weight + weight); + bytes memory setValidatorWeightPayload = ValidatorMessages + .packSetSubnetValidatorWeightMessage( + validationID, _getAndIncrementNonce(validationID), validator.weight + weight + ); $._pendingRegisterDelegatorMessages[validationID][delegator] = setValidatorWeightPayload; @@ -175,8 +180,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function resendDelegatorRegistration(bytes32 validationID, address delegator) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); require( - $._pendingRegisterDelegatorMessages[validationID][delegator].length > 0 - && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingAdded, + $._pendingRegisterDelegatorMessages[validationID][delegator].length > 0 + && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingAdded, "PoSValidatorManager: Delegator registration not pending" ); @@ -187,12 +192,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function completeDelegatorRegistration(uint32 messageIndex, address delegator) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); - (bytes32 validationID, uint64 nonce, uint64 weight) = + (bytes32 validationID, uint64 nonce, uint64 weight) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); require( - $._pendingRegisterDelegatorMessages[validationID][delegator].length > 0 - && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingAdded, + $._pendingRegisterDelegatorMessages[validationID][delegator].length > 0 + && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingAdded, "PoSValidatorManager: Delegator registration not pending" ); @@ -200,19 +205,20 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _getValidator(validationID); require( - $._delegatorStakes[validationID][delegator].weight + - validator.weight == weight, + $._delegatorStakes[validationID][delegator].weight + validator.weight == weight, "PoSValidatorManager: Invalid weight" ); - require ( - validator.messageNonce >= nonce, - "PoSValidatorManager: Invalid nonce" - ); + require(validator.messageNonce >= nonce, "PoSValidatorManager: Invalid nonce"); validator.weight = weight; $._delegatorStakes[validationID][delegator].status = ValidatorStatus.Active; _setValidator(validationID, validator); - emit DelegatorRegistered(validationID, delegator, $._delegatorStakes[validationID][delegator].weight, block.timestamp); + emit DelegatorRegistered( + validationID, + delegator, + $._delegatorStakes[validationID][delegator].weight, + block.timestamp + ); } function initializeEndDelegation(bytes32 validationID) external { @@ -231,10 +237,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _getValidator(validationID); require(validator.weight >= delegator.weight, "PoSValidatorManager: Invalid weight"); - bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage( - validationID, - _getAndIncrementNonce(validationID), - validator.weight - delegator.weight + bytes memory setValidatorWeightPayload = ValidatorMessages + .packSetSubnetValidatorWeightMessage( + validationID, _getAndIncrementNonce(validationID), validator.weight - delegator.weight ); $._pendingEndDelegatorMessages[validationID][_msgSender()] = setValidatorWeightPayload; @@ -247,22 +252,22 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function resendEndDelegation(bytes32 validationID, address delegator) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); require( - $._pendingEndDelegatorMessages[validationID][delegator].length > 0 - && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingRemoved, + $._pendingEndDelegatorMessages[validationID][delegator].length > 0 + && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingRemoved, "PoSValidatorManager: Delegator removal not pending" ); WARP_MESSENGER.sendWarpMessage($._pendingEndDelegatorMessages[validationID][delegator]); } - function completeEndDelegation(uint32 messageIndex, address delegator) external{ + function completeEndDelegation(uint32 messageIndex, address delegator) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); - (bytes32 validationID, uint64 nonce, uint64 weight) = + (bytes32 validationID, uint64 nonce, uint64 weight) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); require( - $._pendingEndDelegatorMessages[validationID][delegator].length > 0 - && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingRemoved, + $._pendingEndDelegatorMessages[validationID][delegator].length > 0 + && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingRemoved, "PoSValidatorManager: Delegator removal not pending" ); @@ -273,10 +278,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validator.weight - $._delegatorStakes[validationID][delegator].weight == weight, "PoSValidatorManager: Invalid weight" ); - require ( - validator.messageNonce >= nonce, - "PoSValidatorManager: Invalid nonce" - ); + require(validator.messageNonce >= nonce, "PoSValidatorManager: Invalid nonce"); $._delegatorStakes[validationID][delegator].status = ValidatorStatus.Completed; validator.weight = weight; _setValidator(validationID, validator); diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index ecbad521c..2b9356469 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -179,7 +179,7 @@ abstract contract ValidatorManager is WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, bool validRegistration) = ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); - + require(validRegistration, "ValidatorManager: Registration not valid"); require( $._pendingRegisterValidationMessages[validationID].length > 0 @@ -351,7 +351,11 @@ abstract contract ValidatorManager is return currentNonce; } - function _getPChainWarpMessage(uint32 messageIndex) internal view returns (WarpMessage memory) { + function _getPChainWarpMessage(uint32 messageIndex) + internal + view + returns (WarpMessage memory) + { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index 7ae3e1ec8..0274336d8 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -382,9 +382,13 @@ library ValidatorMessages { * | weight : uint64 | 8 bytes | * +--------------+----------+----------+ * | 54 bytes | - * +----------+ + * +----------+ */ - function packSubnetValidatorWeightUpdateMessage(bytes32 validationID, uint64 nonce, uint64 weight) internal pure returns (bytes memory) { + function packSubnetValidatorWeightUpdateMessage( + bytes32 validationID, + uint64 nonce, + uint64 weight + ) internal pure returns (bytes memory) { bytes memory res = new bytes(54); // Pack the codec ID. for (uint256 i; i < 2; ++i) { @@ -392,7 +396,8 @@ library ValidatorMessages { } // Pack the type ID. for (uint256 i; i < 4; ++i) { - res[i + 2] = bytes1(uint8(SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID >> (8 * (3 - i)))); + res[i + 2] = + bytes1(uint8(SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID >> (8 * (3 - i)))); } // Pack the validation ID. for (uint256 i; i < 32; ++i) { @@ -407,7 +412,7 @@ library ValidatorMessages { res[i + 46] = bytes1(uint8(weight >> (8 * (7 - i)))); } return res; - } + } /** * @notice Unpacks a byte array as a SubnetValidatorWeightUpdateMessag. @@ -419,7 +424,8 @@ library ValidatorMessages { function unpackSubnetValidatorWeightUpdateMessage(bytes memory input) internal pure - returns (bytes32, uint64, uint64) { + returns (bytes32, uint64, uint64) + { require(input.length == 54, "ValidatorMessages: Invalid message length"); // Unpack the codec ID. diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index 7239a25ca..ed4c2858c 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -21,8 +21,5 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { bytes memory blsPublicKey ) external returns (bytes32 validationID); - function initializeDelegatorRegistration( - bytes32 validationID, - uint256 stakeAmount - ) external; + function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) external; } diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index 370248dd3..ae9b34fd3 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -20,7 +20,5 @@ interface INativeTokenStakingManager is IPoSValidatorManager { bytes memory blsPublicKey ) external payable returns (bytes32 validationID); - function initializeDelegatorRegistration( - bytes32 validationID - ) external payable; + function initializeDelegatorRegistration(bytes32 validationID) external payable; } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index f8ed1a8df..3412c8b38 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -5,7 +5,9 @@ pragma solidity 0.8.25; -import {IValidatorManager, ValidatorStatus, ValidatorManagerSettings} from "./IValidatorManager.sol"; +import { + IValidatorManager, ValidatorStatus, ValidatorManagerSettings +} from "./IValidatorManager.sol"; import {IRewardCalculator} from "./IRewardCalculator.sol"; struct PoSValidatorManagerSettings { @@ -40,10 +42,7 @@ interface IPoSValidatorManager is IValidatorManager { ); event DelegatorRegistered( - bytes32 indexed validationID, - address indexed delegator, - uint256 weight, - uint256 startTime + bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime ); event DelegatorRemovalInitialized( @@ -53,10 +52,7 @@ interface IPoSValidatorManager is IValidatorManager { uint256 endTime ); - event DelegationEnded( - bytes32 indexed validationID, - address indexed delegator - ); + event DelegationEnded(bytes32 indexed validationID, address indexed delegator); /** * @notice Begins the process of ending an active validation period. The validation period must have been previously diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 1b9af60d2..4fe44b642 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -63,9 +63,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ) internal virtual override { uint256 value = app.weightToValue(weight); vm.startPrank(delegator); - app.initializeDelegatorRegistration( - validationID, value - ); + app.initializeDelegatorRegistration(validationID, value); vm.stopPrank(); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 036c4963d..ef17bb958 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -19,7 +19,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP = uint64(2000); uint64 public constant DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP = uint64(3000); uint64 public constant DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP = uint64(4000); - address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); + address public constant DEFAULT_DELEGATOR_ADDRESS = + address(0x1234123412341234123412341234123412341234); PoSValidatorManager public posValidatorManager; @@ -34,10 +35,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); event DelegatorRegistered( - bytes32 indexed validationID, - address indexed delegator, - uint256 weight, - uint256 startTime + bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime ); event DelegatorRemovalInitialized( @@ -47,10 +45,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 endTime ); - event DelegationEnded( - bytes32 indexed validationID, - address indexed delegator - ); + event DelegationEnded(bytes32 indexed validationID, address indexed delegator); function testInitializeEndValidationWithUptimeProof() public { // TODO: implement @@ -179,23 +174,34 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInitializeDelegatorRegistration() public { - _setUpInitializeDelegatorRegistration(DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP); + _setUpInitializeDelegatorRegistration( + DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + ); } function testResendDelegatorRegistration() public { - bytes32 validationID = _setUpInitializeDelegatorRegistration(DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP); + bytes32 validationID = _setUpInitializeDelegatorRegistration( + DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + ); bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage( - validationID, - 1, - DEFAULT_WEIGHT + DEFAULT_DELEGATOR_WEIGHT - ); + validationID, 1, DEFAULT_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + ); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); posValidatorManager.resendDelegatorRegistration(validationID, DEFAULT_DELEGATOR_ADDRESS); } function testCompleteDelegatorRegistration() public { - _setUpCompleteDelegatorRegistration(DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); + _setUpCompleteDelegatorRegistration( + DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + ); } function testInitializeEndDelegation() public { @@ -231,12 +237,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP ); - bytes memory weightUpdateMessage = - ValidatorMessages.packSubnetValidatorWeightUpdateMessage( - validationID, - 2, - DEFAULT_WEIGHT - ); + bytes memory weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( + validationID, 2, DEFAULT_WEIGHT + ); _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); @@ -289,11 +292,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage( - validationID, - 1, - DEFAULT_WEIGHT + weight - ); + .packSetSubnetValidatorWeightMessage(validationID, 1, DEFAULT_WEIGHT + weight); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.warp(registrationTimestamp); @@ -312,13 +311,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 initRegistrationTimestamp, uint64 completeRegistrationTimestamp ) internal returns (bytes32) { - bytes32 validationID = _setUpInitializeDelegatorRegistration(delegator, weight, initRegistrationTimestamp); - bytes memory setValidatorWeightPayload = - ValidatorMessages.packSubnetValidatorWeightUpdateMessage( - validationID, - 1, - DEFAULT_WEIGHT + weight - ); + bytes32 validationID = + _setUpInitializeDelegatorRegistration(delegator, weight, initRegistrationTimestamp); + bytes memory setValidatorWeightPayload = ValidatorMessages + .packSubnetValidatorWeightUpdateMessage(validationID, 1, DEFAULT_WEIGHT + weight); _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); vm.warp(completeRegistrationTimestamp); @@ -336,10 +332,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 endDelegationTimestamp ) internal returns (bytes32) { bytes32 validationID = _setUpCompleteDelegatorRegistration( - delegator, - weight, - initRegistrationTimestamp, - completeRegistrationTimestamp + delegator, weight, initRegistrationTimestamp, completeRegistrationTimestamp ); vm.warp(endDelegationTimestamp); @@ -348,7 +341,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegatorRemovalInitialized(validationID, bytes32(0), delegator, endDelegationTimestamp); + emit DelegatorRemovalInitialized( + validationID, bytes32(0), delegator, endDelegationTimestamp + ); vm.prank(delegator); posValidatorManager.initializeEndDelegation(validationID); return validationID; From f93b3ebbfc4de2a2d959f6607a45cc5ee03b1212 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 15:41:06 -0500 Subject: [PATCH 139/545] update bindings --- .../ERC20TokenStakingManager.go | 765 ++++++++++++++++- .../NativeTokenStakingManager.go | 783 +++++++++++++++++- .../PoAValidatorManager.go | 2 +- 3 files changed, 1536 insertions(+), 14 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 46aee70c2..45b8ca67d 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161350238038061350283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6133b58061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c757806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612af3565b61019d565b005b6100b26100c2366004612b1e565b610373565b6100da6100d5366004612af3565b610481565b6040516001600160401b0390911681526020015b60405180910390f35b61010a610105366004612b76565b610497565b6040519081526020016100ee565b6100b2610126366004612bb6565b6104b0565b61010a610139366004612c83565b6107e1565b6100b261014c366004612d1f565b610806565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610185366004612af3565b610b1f565b6100b2610198366004612d38565b610c2e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061338983398151915293929190829060ff1660058111156101fd576101fd612d62565b600581111561020e5761020e612d62565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561028557610285612d62565b146102ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6102ff8483606001515f611001565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061032c908490600401612d98565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c9190612dca565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103b75750825b90505f826001600160401b031660011480156103d25750303b155b9050811580156103e0575080155b156103fe5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561042857845460ff60401b1916600160401b1785555b610432878761121e565b831561047857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61049164e8d4a5100083612e09565b92915050565b5f6104916001600160401b03831664e8d4a51000612e1c565b81156107d3575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610524573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261054b9190810190612e3e565b91509150806105ae5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016102e6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106159190612dca565b8251146106795760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016102e6565b60208201516001600160a01b0316156106ef5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016102e6565b5f806106fe846040015161123c565b9150915081881461076b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016102e6565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6107dc83611414565b505050565b5f806107ec8661175c565b90506107fa8582868661181c565b9150505b949350505050565b5f5f805160206133898339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610861573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108889190810190612e3e565b91509150806108a95760405162461bcd60e51b81526004016102e690612f10565b825482511461090c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102e6565b60208201516001600160a01b03161561097f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102e6565b5f8061098e8460400151611c53565b91509150806109f05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102e6565b5f82815260058601602052604081208054610a0a90612f56565b9050118015610a3c575060015f83815260068701602052604090205460ff166005811115610a3a57610a3a612d62565b145b610a585760405162461bcd60e51b81526004016102e690612f8e565b5f8281526005860160205260408120610a7091612aa9565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613389833981519152929190610b6790612f56565b9050118015610b99575060015f83815260068301602052604090205460ff166005811115610b9757610b97612d62565b145b610bb55760405162461bcd60e51b81526004016102e690612f8e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bee9190600401612fd5565b6020604051808303815f875af1158015610c0a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107dc9190612dca565b5f5f805160206133898339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c89573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cb09190810190612e3e565b9150915080610cd15760405162461bcd60e51b81526004016102e690612f10565b5f8415610d55575f610ce68460400151611df4565b919350909150506001600160401b03811615610d4f5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016102e6565b50610dcb565b5f610d638460400151611c53565b90925090508015610dc95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102e6565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610dfc57610dfc612d62565b6005811115610e0d57610e0d612d62565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610e9e5760405162461bcd60e51b81526004016102e69061305f565b5f600382516005811115610eb457610eb4612d62565b1480610ed25750600282516005811115610ed057610ed0612d62565b145b15610ef557506020808201515f9081526007870190915260408120556004610ef9565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f2a57610f2a612d62565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561107a5761103a8160016130ab565b611045906008612e1c565b5081515f9083908390811061105c5761105c6130be565b60200101906001600160f81b03191690815f1a905350600101611026565b505f5b60048110156110dd576110918160036130ab565b61109c906008612e1c565b6001901c60f81b826110af8360026130d2565b815181106110bf576110bf6130be565b60200101906001600160f81b03191690815f1a90535060010161107d565b505f5b602081101561113f576110f481601f6130ab565b6110ff906008612e1c565b86901c60f81b826111118360066130d2565b81518110611121576111216130be565b60200101906001600160f81b03191690815f1a9053506001016110e0565b505f5b60088110156111aa576111568160076130ab565b611161906008612e1c565b6001600160401b038616901c60f81b8261117c8360266130d2565b8151811061118c5761118c6130be565b60200101906001600160f81b03191690815f1a905350600101611142565b505f5b6008811015611215576111c18160076130ab565b6111cc906008612e1c565b6001600160401b038516901c60f81b826111e783602e6130d2565b815181106111f7576111f76130be565b60200101906001600160f81b03191690815f1a9053506001016111ad565b50949350505050565b61122661202f565b61122f8261207a565b611238816120c0565b5050565b5f808251602e1461125f5760405162461bcd60e51b81526004016102e6906130e5565b5f805b60028110156112ae576112768160016130ab565b611281906008612e1c565b61ffff16858281518110611297576112976130be565b016020015160f81c901b9190911790600101611262565b5061ffff8116156112d15760405162461bcd60e51b81526004016102e69061312e565b5f805b600481101561132c576112e88160036130ab565b6112f3906008612e1c565b63ffffffff16866113058360026130d2565b81518110611315576113156130be565b016020015160f81c901b91909117906001016112d4565b5063ffffffff81166004146113535760405162461bcd60e51b81526004016102e690613171565b5f805b60208110156113a85761136a81601f6130ab565b611375906008612e1c565b876113818360066130d2565b81518110611391576113916130be565b016020015160f81c901b9190911790600101611356565b505f805b6008811015611407576113c08160076130ab565b6113cb906008612e1c565b6001600160401b0316886113e08360266130d2565b815181106113f0576113f06130be565b016020015160f81c901b91909117906001016113ac565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061338983398151915293929190829060ff16600581111561147457611474612d62565b600581111561148557611485612d62565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156114ff576114ff612d62565b1461155b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102e6565b60408101516001600160a01b0316336001600160a01b0316146115905760405162461bcd60e51b81526004016102e69061305f565b61159d8160800151612174565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156115e1576115e1612d62565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061169890859083611001565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116c7908590600401612d98565b6020604051808303815f875af11580156116e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117079190612dca565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008161178884612315565b90505f61179482610481565b83549091506001600160401b038216108015906117be57508260010154816001600160401b031611155b6107fe5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016102e6565b5f61182561234b565b5f80516020613389833981519152426001600160401b03851611801561185f57506001600160401b03841661185d426202a3006130d2565b115b6118c15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102e6565b856119185760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102e6565b5f868152600782016020526040902054156119865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102e6565b82516030146119ed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102e6565b6119f685612174565b5f80611a3d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612395565b5f82815260058601602052604090209193509150611a5b82826131fc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611a88908590600401612d98565b6020604051808303815f875af1158015611aa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac89190612dca565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611b4157611b41612d62565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506107fe60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611c765760405162461bcd60e51b81526004016102e6906130e5565b5f805b6002811015611cc557611c8d8160016130ab565b611c98906008612e1c565b61ffff16858281518110611cae57611cae6130be565b016020015160f81c901b9190911790600101611c79565b5061ffff811615611ce85760405162461bcd60e51b81526004016102e69061312e565b5f805b6004811015611d4357611cff8160036130ab565b611d0a906008612e1c565b63ffffffff1686611d1c8360026130d2565b81518110611d2c57611d2c6130be565b016020015160f81c901b9190911790600101611ceb565b5063ffffffff8116600214611d6a5760405162461bcd60e51b81526004016102e690613171565b5f805b6020811015611dbf57611d8181601f6130ab565b611d8c906008612e1c565b87611d988360066130d2565b81518110611da857611da86130be565b016020015160f81c901b9190911790600101611d6d565b505f86602681518110611dd457611dd46130be565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611e185760405162461bcd60e51b81526004016102e6906130e5565b5f805b6002811015611e6757611e2f8160016130ab565b611e3a906008612e1c565b61ffff16868281518110611e5057611e506130be565b016020015160f81c901b9190911790600101611e1b565b5061ffff811615611e8a5760405162461bcd60e51b81526004016102e69061312e565b5f805b6004811015611ee557611ea18160036130ab565b611eac906008612e1c565b63ffffffff1687611ebe8360026130d2565b81518110611ece57611ece6130be565b016020015160f81c901b9190911790600101611e8d565b5063ffffffff8116600114611f0c5760405162461bcd60e51b81526004016102e690613171565b5f805b6020811015611f6157611f2381601f6130ab565b611f2e906008612e1c565b88611f3a8360066130d2565b81518110611f4a57611f4a6130be565b016020015160f81c901b9190911790600101611f0f565b505f805b6008811015611fc057611f798160076130ab565b611f84906008612e1c565b6001600160401b031689611f998360266130d2565b81518110611fa957611fa96130be565b016020015160f81c901b9190911790600101611f65565b505f805b600881101561201f57611fd88160076130ab565b611fe3906008612e1c565b6001600160401b03168a611ff883602e6130d2565b81518110612008576120086130be565b016020015160f81c901b9190911790600101611fc4565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661207857604051631afcd79f60e31b815260040160405180910390fd5b565b61208261202f565b61208b81612760565b6120bd606082013560808301356120a860c0850160a08601612b76565b6120b860e0860160c087016132bb565b612781565b50565b6120c861202f565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166121545760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016102e6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206133898339815191529060ff165f036121b2575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121fa90836130ab565b10612216576001600160401b0384166040830152808252612235565b838260400181815161222891906132d6565b6001600160401b03169052505b5f82602001518360400151606461224c91906132fd565b6122569190613328565b600285015490915060ff90811690821611156122d15760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102e6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610491827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906127ef565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161238f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146123ff5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102e6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612476576124368160016130ab565b612441906008612e1c565b5081515f90839083908110612458576124586130be565b60200101906001600160f81b03191690815f1a905350600101612422565b505f5b60048110156124d45761248d8160036130ab565b612498906008612e1c565b505f826124a68360026130d2565b815181106124b6576124b66130be565b60200101906001600160f81b03191690815f1a905350600101612479565b505f5b602081101561253157845181602081106124f3576124f36130be565b1a60f81b826125038360066130d2565b81518110612513576125136130be565b60200101906001600160f81b03191690815f1a9053506001016124d7565b505f5b60208110156125915784602001518160208110612553576125536130be565b1a60f81b826125638360266130d2565b81518110612573576125736130be565b60200101906001600160f81b03191690815f1a905350600101612534565b505f5b6008811015612605576125a88160076130ab565b6125b3906008612e1c565b60ff1685604001516001600160401b0316901c60f81b828260466125d791906130d2565b815181106125e7576125e76130be565b60200101906001600160f81b03191690815f1a905350600101612594565b505f5b60308110156126705784608001518181518110612627576126276130be565b01602001516001600160f81b0319168261264283604e6130d2565b81518110612652576126526130be565b60200101906001600160f81b03191690815f1a905350600101612608565b505f5b60088110156126e2576126878160076130ab565b612692906008612e1c565b60608601516001600160401b0390811691161c60f81b826126b483607e6130d2565b815181106126c4576126c46130be565b60200101906001600160f81b03191690815f1a905350600101612673565b506002816040516126f3919061334d565b602060405180830381855afa15801561270e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127319190612dca565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61276861202f565b612770612951565b612778612961565b6120bd81612969565b61278961202f565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128599190612dca565b90506128706001600160a01b0385163330866129d5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156128b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128d89190612dca565b905081811161293e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016102e6565b61294882826130ab565b95945050505050565b61295961202f565b612078612a35565b61207861202f565b61297161202f565b80355f8051602061338983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556129bb6060830160408401613368565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a2f908590612a3d565b50505050565b61273a61202f565b5f8060205f8451602086015f885af180612a5c576040513d5f823e3d81fd5b50505f513d91508115612a73578060011415612a80565b6001600160a01b0384163b155b15612a2f57604051635274afe760e01b81526001600160a01b03851660048201526024016102e6565b508054612ab590612f56565b5f825580601f10612ac4575050565b601f0160209004905f5260205f20908101906120bd91905b80821115612aef575f8155600101612adc565b5090565b5f60208284031215612b03575f80fd5b5035919050565b6001600160a01b03811681146120bd575f80fd5b5f80828403610100811215612b31575f80fd5b60e0811215612b3e575f80fd5b5082915060e0830135612b5081612b0a565b809150509250929050565b80356001600160401b0381168114612b71575f80fd5b919050565b5f60208284031215612b86575f80fd5b612b8f82612b5b565b9392505050565b80151581146120bd575f80fd5b803563ffffffff81168114612b71575f80fd5b5f805f60608486031215612bc8575f80fd5b833592506020840135612bda81612b96565b9150612be860408501612ba3565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612c2757612c27612bf1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612c5557612c55612bf1565b604052919050565b5f6001600160401b03821115612c7557612c75612bf1565b50601f01601f191660200190565b5f805f8060808587031215612c96575f80fd5b8435935060208501359250612cad60408601612b5b565b915060608501356001600160401b03811115612cc7575f80fd5b8501601f81018713612cd7575f80fd5b8035612cea612ce582612c5d565b612c2d565b818152886020838501011115612cfe575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612d2f575f80fd5b612b8f82612ba3565b5f8060408385031215612d49575f80fd5b612d5283612ba3565b91506020830135612b5081612b96565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612d90578181015183820152602001612d78565b50505f910152565b602081525f8251806020840152612db6816040850160208701612d76565b601f01601f19169190910160400192915050565b5f60208284031215612dda575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612e1757612e17612de1565b500490565b808202811582820484141761049157610491612df5565b8051612b7181612b96565b5f8060408385031215612e4f575f80fd5b82516001600160401b0380821115612e65575f80fd5b9084019060608287031215612e78575f80fd5b612e80612c05565b82518152602080840151612e9381612b0a565b82820152604084015183811115612ea8575f80fd5b80850194505087601f850112612ebc575f80fd5b83519250612ecc612ce584612c5d565b8381528882858701011115612edf575f80fd5b612eee84838301848801612d76565b80604084015250819550612f03818801612e33565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612f6a57607f821691505b602082108103612f8857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612fe781612f56565b806020870152604060018084165f8114613008576001811461302457613051565b60ff19851660408a0152604084151560051b8a01019550613051565b895f5260205f205f5b858110156130485781548b820186015290830190880161302d565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561049157610491612df5565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561049157610491612df5565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f8211156107dc57805f5260205f20601f840160051c810160208510156131dd5750805b601f840160051c820191505b8181101561036c575f81556001016131e9565b81516001600160401b0381111561321557613215612bf1565b613229816132238454612f56565b846131b8565b602080601f83116001811461325c575f84156132455750858301515b5f19600386901b1c1916600185901b1785556132b3565b5f85815260208120601f198616915b8281101561328a5788860151825594840194600190910190840161326b565b50858210156132a757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156132cb575f80fd5b8135612b8f81612b0a565b6001600160401b038181168382160190808211156132f6576132f6612df5565b5092915050565b6001600160401b0381811683821602808216919082811461332057613320612df5565b505092915050565b5f6001600160401b038084168061334157613341612de1565b92169190910492915050565b5f825161335e818460208701612d76565b9190910192915050565b5f60208284031215613378575f80fd5b813560ff81168114612b8f575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161499f38038061499f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148528061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063872fda6411610093578063b771b3bc11610063578063b771b3bc14610210578063bee0a03f14610236578063d61bed7414610249578063fdf94a1a1461025c575f80fd5b8063872fda64146101c4578063927e7e75146101d75780639e1bc4ef146101ea578063a3a65e48146101fd575f80fd5b80632e2194d8116100ce5780632e2194d81461014d578063620658561461017d5780636a7e3d831461019e57806376f78621146101b1575f80fd5b80630322ed98146100ff5780630915204e146101145780630b77f6931461012757806327f39ca81461013a575b5f80fd5b61011261010d366004613cfd565b61026f565b005b610112610122366004613d40565b610460565b610112610135366004613d75565b61068e565b610112610148366004613d98565b6107a0565b61016061015b366004613cfd565b6108ae565b6040516001600160401b0390911681526020015b60405180910390f35b61019061018b366004613de0565b6108c4565b604051908152602001610174565b6101126101ac366004613d75565b6108dd565b6101126101bf366004613e0d565b6109ef565b6101906101d2366004613eda565b610d0d565b6101126101e5366004613cfd565b610d32565b6101126101f8366004613f76565b611061565b61011261020b366004613f96565b611078565b61021e6005600160991b0181565b6040516001600160a01b039091168152602001610174565b610112610244366004613cfd565b611231565b610112610257366004613d40565b611340565b61011261026a366004613faf565b6115a2565b5f8181525f805160206148268339815191526020526040808220815160e0810190925280545f805160206147e683398151915293929190829060ff1660058111156102bc576102bc613fd9565b60058111156102cd576102cd613fd9565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f868152600686019091529081208054929350909161035790613fed565b9050118015610378575060038151600581111561037657610376613fd9565b145b6103e15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614025565b6020604051808303815f875af1158015610436573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045a91906140af565b50505050565b5f805160206147c68339815191525f61047884611975565b90505f805f61048a8460400151611b10565b5f83815260068901602090815260408083206001600160a01b038d16845290915281208054949750929550909350916104c290613fed565b905011801561050f575060035f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff16600581111561050d5761050d613fd9565b145b61052b5760405162461bcd60e51b81526004016103d8906140c6565b5f83815260068601602090815260408083206001600160a01b038a168452909152812061055791613cb3565b5f61056184611d4b565b5f85815260048801602090815260408083206001600160a01b038c16845290915290205460808201519192506001600160401b03808516926105a6929091169061412c565b6001600160401b0316146105cc5760405162461bcd60e51b81526004016103d890614153565b826001600160401b031681606001516001600160401b031610156106025760405162461bcd60e51b81526004016103d890614196565b5f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c21b1790556001600160401b038216608082015261064f8482611e46565b6040516001600160a01b0388169085907f132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564905f90a35050505050505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206147c68339815191529291906106ea90613fed565b9050118015610737575060015f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff16600581111561073557610735613fd9565b145b6107535760405162461bcd60e51b81526004016103d8906141d8565b5f83815260058201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614025565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107e45750825b90505f826001600160401b031660011480156107ff5750303b155b90508115801561080d575080155b1561082b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561085557845460ff60401b1916600160401b1785555b61085f8787611f35565b83156108a557845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6108be64e8d4a5100083614249565b92915050565b5f6108be6001600160401b03831664e8d4a5100061425c565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f805160206147c683398151915292919061093990613fed565b9050118015610986575060035f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff16600581111561098457610984613fd9565b145b6109a25760405162461bcd60e51b81526004016103d8906140c6565b5f83815260068201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614025565b8115610cff575f5f805160206147c68339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610a50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a7791908101906142a0565b9150915080610ada5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103d8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4191906140af565b825114610ba55760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103d8565b60208201516001600160a01b031615610c1b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103d8565b5f80610c2a8460400151611f53565b91509150818814610c975760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103d8565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610d088361212b565b505050565b5f80610d1886612438565b9050610d26858286866124e5565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f805160206147c683398151915293926060830190600160c01b900460ff166005811115610dd157610dd1613fd9565b6005811115610de257610de2613fd9565b9052509050600281606001516005811115610dff57610dff613fd9565b14610e5b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2044656c656761746f72206e6f742060448201526561637469766560d01b60648201526084016103d8565b600360608201908152426001600160401b0390811660408085019182525f8781526004870160209081528282203383528152919020855181549287015193518516600160801b0267ffffffffffffffff60801b19948616600160401b026001600160801b03199094169190951617919091179182168317815592518493929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836005811115610f0d57610f0d613fd9565b02179055509050505f610f1f84611d4b565b9050815f01516001600160401b031681608001516001600160401b03161015610f5a5760405162461bcd60e51b81526004016103d890614153565b5f610f7e85610f6887612919565b85516080860151610f79919061412c565b612994565b5f86815260068601602090815260408083203384529091529020909150610fa582826143bd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610fd290859060040161447c565b6020604051808303815f875af1158015610fee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101291906140af565b9050336001600160a01b031681877f2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc24260405161105191815260200190565b60405180910390a4505050505050565b5f61106b82612438565b9050610d08833383612bb1565b5f805160206147e68339815191525f61109083611975565b90505f806110a18360400151612eac565b91509150806111035760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103d8565b5f8281526005850160205260408120805461111d90613fed565b905011801561114f575060015f83815260078601602052604090205460ff16600581111561114d5761114d613fd9565b145b61116b5760405162461bcd60e51b81526004016103d8906144ae565b5f828152600585016020526040812061118391613cb3565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147e683398151915292919061127990613fed565b90501180156112ab575060015f83815260078301602052604090205460ff1660058111156112a9576112a9613fd9565b145b6112c75760405162461bcd60e51b81526004016103d8906144ae565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916113009190600401614025565b6020604051808303815f875af115801561131c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0891906140af565b5f805160206147c68339815191525f61135884611975565b90505f805f61136a8460400151611b10565b5f83815260058901602090815260408083206001600160a01b038d16845290915281208054949750929550909350916113a290613fed565b90501180156113ef575060015f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff1660058111156113ed576113ed613fd9565b145b61140b5760405162461bcd60e51b81526004016103d8906141d8565b5f83815260058601602090815260408083206001600160a01b038a168452909152812061143791613cb3565b5f61144184611d4b565b60808101515f86815260048901602090815260408083206001600160a01b038d1684529091529020549192506001600160401b03808516926114849291166144f5565b6001600160401b0316146114aa5760405162461bcd60e51b81526004016103d890614153565b826001600160401b031681606001516001600160401b031610156114e05760405162461bcd60e51b81526004016103d890614196565b6001600160401b03821660808201525f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c11b17905561152d8482611e46565b5f84815260048701602090815260408083206001600160a01b038b16808552908352928190205481516001600160401b039091168152429281019290925286917f4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88910160405180910390a35050505050505050565b5f5f805160206147e68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115fd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261162491908101906142a0565b91509150806116455760405162461bcd60e51b81526004016103d890614515565b5f84156116c9575f61165a846040015161304d565b919350909150506001600160401b038116156116c35760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016103d8565b5061173f565b5f6116d78460400151612eac565b9092509050801561173d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103d8565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561177057611770613fd9565b600581111561178157611781613fd9565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146118125760405162461bcd60e51b81526004016103d89061455b565b5f60038251600581111561182857611828613fd9565b1480611846575060028251600581111561184457611844613fd9565b145b1561186957506020808201515f908152600887019091526040812055600461186d565b5060055b5f83815260078701602052604090208251815484929190829060ff1916600183600581111561189e5761189e613fd9565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051606080820183525f8083526020830181905292820152905f805160206147e68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156119ea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a1191908101906142a0565b9150915080611a325760405162461bcd60e51b81526004016103d890614515565b8254825114611a955760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103d8565b60208201516001600160a01b031615611b085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103d8565b509392505050565b5f805f8351603614611b345760405162461bcd60e51b81526004016103d8906145a7565b5f805b6002811015611b8357611b4b8160016145f0565b611b5690600861425c565b61ffff16868281518110611b6c57611b6c614603565b016020015160f81c901b9190911790600101611b37565b5061ffff811615611ba65760405162461bcd60e51b81526004016103d890614617565b5f805b6004811015611c0157611bbd8160036145f0565b611bc890600861425c565b63ffffffff1687611bda83600261465a565b81518110611bea57611bea614603565b016020015160f81c901b9190911790600101611ba9565b5063ffffffff8116600314611c285760405162461bcd60e51b81526004016103d89061466d565b5f805b6020811015611c7d57611c3f81601f6145f0565b611c4a90600861425c565b88611c5683600661465a565b81518110611c6657611c66614603565b016020015160f81c901b9190911790600101611c2b565b505f805b6008811015611cdc57611c958160076145f0565b611ca090600861425c565b6001600160401b031689611cb583602661465a565b81518110611cc557611cc5614603565b016020015160f81c901b9190911790600101611c81565b505f805b6008811015611d3b57611cf48160076145f0565b611cff90600861425c565b6001600160401b03168a611d1483602e61465a565b81518110611d2457611d24614603565b016020015160f81c901b9190911790600101611ce0565b5091989097509095509350505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061482683398151915290528390208351918201909352825491925f805160206147e683398151915292829060ff166005811115611dcb57611dcb613fd9565b6005811115611ddc57611ddc613fd9565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061482683398151915260205260409020815181545f805160206147e68339815191529284929091829060ff19166001836005811115611e9057611e90613fd9565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b611f3d613278565b611f46826132c3565b611f4f81613309565b5050565b5f808251602e14611f765760405162461bcd60e51b81526004016103d8906145a7565b5f805b6002811015611fc557611f8d8160016145f0565b611f9890600861425c565b61ffff16858281518110611fae57611fae614603565b016020015160f81c901b9190911790600101611f79565b5061ffff811615611fe85760405162461bcd60e51b81526004016103d890614617565b5f805b600481101561204357611fff8160036145f0565b61200a90600861425c565b63ffffffff168661201c83600261465a565b8151811061202c5761202c614603565b016020015160f81c901b9190911790600101611feb565b5063ffffffff811660041461206a5760405162461bcd60e51b81526004016103d89061466d565b5f805b60208110156120bf5761208181601f6145f0565b61208c90600861425c565b8761209883600661465a565b815181106120a8576120a8614603565b016020015160f81c901b919091179060010161206d565b505f805b600881101561211e576120d78160076145f0565b6120e290600861425c565b6001600160401b0316886120f783602661465a565b8151811061210757612107614603565b016020015160f81c901b91909117906001016120c3565b5090969095509350505050565b5f8181525f805160206148268339815191526020526040808220815160e0810190925280545f805160206147e683398151915293929190829060ff16600581111561217857612178613fd9565b600581111561218957612189613fd9565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561220357612203613fd9565b146122205760405162461bcd60e51b81526004016103d8906146b4565b60408101516001600160a01b0316336001600160a01b0316146122555760405162461bcd60e51b81526004016103d89061455b565b61226281608001516133bd565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156122a6576122a6613fd9565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61235a8461235481612919565b5f612994565b5f858152600685016020526040902090915061237682826143bd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906123a390859060040161447c565b6020604051808303815f875af11580156123bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e391906140af565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206147c6833981519152816124518461355e565b90505f61245d826108ae565b83549091506001600160401b0382161080159061248757508260010154816001600160401b031611155b610d2a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103d8565b5f6124ee613594565b5f805160206147e6833981519152426001600160401b03851611801561252857506001600160401b038416612526426202a30061465a565b115b61258a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103d8565b856125e15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016103d8565b5f8681526008820160205260409020541561264f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103d8565b82516030146126b65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103d8565b6126bf856133bd565b5f806127066040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506135cb565b5f8281526005860160205260409020919350915061272482826143bd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061275190859060040161447c565b6020604051808303815f875af115801561276d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061279191906140af565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561280a5761280a613fd9565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556128b383612919565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d2a60015f8051602061480683398151915255565b5f8181525f805160206148268339815191526020526040812060020180545f805160206147e683398151915291600160a01b9091046001600160401b03169081906014612965836146fa565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612a0d576129cd8160016145f0565b6129d890600861425c565b5081515f908390839081106129ef576129ef614603565b60200101906001600160f81b03191690815f1a9053506001016129b9565b505f5b6004811015612a7057612a248160036145f0565b612a2f90600861425c565b6001901c60f81b82612a4283600261465a565b81518110612a5257612a52614603565b60200101906001600160f81b03191690815f1a905350600101612a10565b505f5b6020811015612ad257612a8781601f6145f0565b612a9290600861425c565b86901c60f81b82612aa483600661465a565b81518110612ab457612ab4614603565b60200101906001600160f81b03191690815f1a905350600101612a73565b505f5b6008811015612b3d57612ae98160076145f0565b612af490600861425c565b6001600160401b038616901c60f81b82612b0f83602661465a565b81518110612b1f57612b1f614603565b60200101906001600160f81b03191690815f1a905350600101612ad5565b505f5b6008811015612ba857612b548160076145f0565b612b5f90600861425c565b6001600160401b038516901c60f81b82612b7a83602e61465a565b81518110612b8a57612b8a614603565b60200101906001600160f81b03191690815f1a905350600101612b40565b50949350505050565b612bb9613594565b5f805160206147c68339815191525f612bd185611d4b565b9050600281516005811115612be857612be8613fd9565b14612c055760405162461bcd60e51b81526004016103d8906146b4565b5f85815260048301602090815260408083206001600160a01b03881684529091529020546001600160401b031615612c965760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2044656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016103d8565b612c9f836133bd565b5f612cbd86612cad88612919565b868560800151610f7991906144f5565b5f87815260058501602090815260408083206001600160a01b038a1684529091529020909150612ced82826143bd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d1a90859060040161447c565b6020604051808303815f875af1158015612d36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d5a91906140af565b604080516080810182526001600160401b038089168252421660208201525f9181019190915290915060608101600190525f88815260048601602090815260408083206001600160a01b038b1684528252918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836005811115612e3b57612e3b613fd9565b021790555050604080516001600160401b03881681524260208201526001600160a01b038916925083918a917ff8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16910160405180910390a450505050610d0860015f8051602061480683398151915255565b5f808251602714612ecf5760405162461bcd60e51b81526004016103d8906145a7565b5f805b6002811015612f1e57612ee68160016145f0565b612ef190600861425c565b61ffff16858281518110612f0757612f07614603565b016020015160f81c901b9190911790600101612ed2565b5061ffff811615612f415760405162461bcd60e51b81526004016103d890614617565b5f805b6004811015612f9c57612f588160036145f0565b612f6390600861425c565b63ffffffff1686612f7583600261465a565b81518110612f8557612f85614603565b016020015160f81c901b9190911790600101612f44565b5063ffffffff8116600214612fc35760405162461bcd60e51b81526004016103d89061466d565b5f805b602081101561301857612fda81601f6145f0565b612fe590600861425c565b87612ff183600661465a565b8151811061300157613001614603565b016020015160f81c901b9190911790600101612fc6565b505f8660268151811061302d5761302d614603565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146130715760405162461bcd60e51b81526004016103d8906145a7565b5f805b60028110156130c0576130888160016145f0565b61309390600861425c565b61ffff168682815181106130a9576130a9614603565b016020015160f81c901b9190911790600101613074565b5061ffff8116156130e35760405162461bcd60e51b81526004016103d890614617565b5f805b600481101561313e576130fa8160036145f0565b61310590600861425c565b63ffffffff168761311783600261465a565b8151811061312757613127614603565b016020015160f81c901b91909117906001016130e6565b5063ffffffff81166001146131655760405162461bcd60e51b81526004016103d89061466d565b5f805b60208110156131ba5761317c81601f6145f0565b61318790600861425c565b8861319383600661465a565b815181106131a3576131a3614603565b016020015160f81c901b9190911790600101613168565b505f805b6008811015613219576131d28160076145f0565b6131dd90600861425c565b6001600160401b0316896131f283602661465a565b8151811061320257613202614603565b016020015160f81c901b91909117906001016131be565b505f805b6008811015611d3b576132318160076145f0565b61323c90600861425c565b6001600160401b03168a61325183602e61465a565b8151811061326157613261614603565b016020015160f81c901b919091179060010161321d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166132c157604051631afcd79f60e31b815260040160405180910390fd5b565b6132cb613278565b6132d481613983565b613306606082013560808301356132f160c0850160a08601613de0565b61330160e0860160c0870161471f565b6139a4565b50565b613311613278565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661339d5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103d8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147e68339815191529060ff165f036133fb575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061344390836145f0565b1061345f576001600160401b038416604083015280825261347e565b838260400181815161347191906144f5565b6001600160401b03169052505b5f826020015183604001516064613495919061473a565b61349f9190614765565b600285015490915060ff908116908216111561351a5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103d8565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6108be827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906139ff565b5f805160206148068339815191528054600119016135c557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146136355760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103d8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156136ac5761366c8160016145f0565b61367790600861425c565b5081515f9083908390811061368e5761368e614603565b60200101906001600160f81b03191690815f1a905350600101613658565b505f5b600481101561370a576136c38160036145f0565b6136ce90600861425c565b505f826136dc83600261465a565b815181106136ec576136ec614603565b60200101906001600160f81b03191690815f1a9053506001016136af565b505f5b6020811015613767578451816020811061372957613729614603565b1a60f81b8261373983600661465a565b8151811061374957613749614603565b60200101906001600160f81b03191690815f1a90535060010161370d565b505f5b60208110156137c7578460200151816020811061378957613789614603565b1a60f81b8261379983602661465a565b815181106137a9576137a9614603565b60200101906001600160f81b03191690815f1a90535060010161376a565b505f5b600881101561383b576137de8160076145f0565b6137e990600861425c565b60ff1685604001516001600160401b0316901c60f81b8282604661380d919061465a565b8151811061381d5761381d614603565b60200101906001600160f81b03191690815f1a9053506001016137ca565b505f5b60308110156138a6578460800151818151811061385d5761385d614603565b01602001516001600160f81b0319168261387883604e61465a565b8151811061388857613888614603565b60200101906001600160f81b03191690815f1a90535060010161383e565b505f5b6008811015613918576138bd8160076145f0565b6138c890600861425c565b60608601516001600160401b0390811691161c60f81b826138ea83607e61465a565b815181106138fa576138fa614603565b60200101906001600160f81b03191690815f1a9053506001016138a9565b50600281604051613929919061478a565b602060405180830381855afa158015613944573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061396791906140af565b94909350915050565b60015f8051602061480683398151915255565b61398b613278565b613993613b61565b61399b613b71565b61330681613b79565b6139ac613278565b5f5f805160206147c6833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a6991906140af565b9050613a806001600160a01b038516333086613be5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ac4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ae891906140af565b9050818111613b4e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103d8565b613b5882826145f0565b95945050505050565b613b69613278565b6132c1613c3f565b6132c1613278565b613b81613278565b80355f805160206147e683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bcb60608301604084016147a5565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261045a908590613c47565b613970613278565b5f8060205f8451602086015f885af180613c66576040513d5f823e3d81fd5b50505f513d91508115613c7d578060011415613c8a565b6001600160a01b0384163b155b1561045a57604051635274afe760e01b81526001600160a01b03851660048201526024016103d8565b508054613cbf90613fed565b5f825580601f10613cce575050565b601f0160209004905f5260205f209081019061330691905b80821115613cf9575f8155600101613ce6565b5090565b5f60208284031215613d0d575f80fd5b5035919050565b803563ffffffff81168114613d27575f80fd5b919050565b6001600160a01b0381168114613306575f80fd5b5f8060408385031215613d51575f80fd5b613d5a83613d14565b91506020830135613d6a81613d2c565b809150509250929050565b5f8060408385031215613d86575f80fd5b823591506020830135613d6a81613d2c565b5f80828403610100811215613dab575f80fd5b60e0811215613db8575f80fd5b5082915060e0830135613d6a81613d2c565b80356001600160401b0381168114613d27575f80fd5b5f60208284031215613df0575f80fd5b613df982613dca565b9392505050565b8015158114613306575f80fd5b5f805f60608486031215613e1f575f80fd5b833592506020840135613e3181613e00565b9150613e3f60408501613d14565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e7e57613e7e613e48565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613eac57613eac613e48565b604052919050565b5f6001600160401b03821115613ecc57613ecc613e48565b50601f01601f191660200190565b5f805f8060808587031215613eed575f80fd5b8435935060208501359250613f0460408601613dca565b915060608501356001600160401b03811115613f1e575f80fd5b8501601f81018713613f2e575f80fd5b8035613f41613f3c82613eb4565b613e84565b818152886020838501011115613f55575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613f87575f80fd5b50508035926020909101359150565b5f60208284031215613fa6575f80fd5b613df982613d14565b5f8060408385031215613fc0575f80fd5b613fc983613d14565b91506020830135613d6a81613e00565b634e487b7160e01b5f52602160045260245ffd5b600181811c9082168061400157607f821691505b60208210810361401f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461403781613fed565b806020870152604060018084165f81146140585760018114614074576140a1565b60ff19851660408a0152604084151560051b8a010195506140a1565b895f5260205f205f5b858110156140985781548b820186015290830190880161407d565b8a016040019650505b509398975050505050505050565b5f602082840312156140bf575f80fd5b5051919050565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f722072604082015271656d6f76616c206e6f742070656e64696e6760701b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561414c5761414c614118565b5092915050565b60208082526023908201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960408201526219da1d60ea1b606082015260800190565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20496e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526037908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f72207260408201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261425757614257614235565b500490565b80820281158282048414176108be576108be614118565b5f5b8381101561428d578181015183820152602001614275565b50505f910152565b8051613d2781613e00565b5f80604083850312156142b1575f80fd5b82516001600160401b03808211156142c7575f80fd5b90840190606082870312156142da575f80fd5b6142e2613e5c565b825181526020808401516142f581613d2c565b8282015260408401518381111561430a575f80fd5b80850194505087601f85011261431e575f80fd5b8351925061432e613f3c84613eb4565b8381528882858701011115614341575f80fd5b61435084838301848801614273565b80604084015250819550614365818801614295565b9450505050509250929050565b601f821115610d0857805f5260205f20601f840160051c810160208510156143975750805b601f840160051c820191505b818110156143b6575f81556001016143a3565b5050505050565b81516001600160401b038111156143d6576143d6613e48565b6143ea816143e48454613fed565b84614372565b602080601f83116001811461441d575f84156144065750858301515b5f19600386901b1c1916600185901b178555614474565b5f85815260208120601f198616915b8281101561444b5788860151825594840194600190910190840161442c565b508582101561446857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f825180602084015261449a816040850160208701614273565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160401b0381811683821601908082111561414c5761414c614118565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156108be576108be614118565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156108be576108be614118565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361471557614715614118565b6001019392505050565b5f6020828403121561472f575f80fd5b8135613df981613d2c565b6001600160401b0381811683821602808216919082811461475d5761475d614118565b505092915050565b5f6001600160401b038084168061477e5761477e614235565b92169190910492915050565b5f825161479b818460208701614273565b9190910192915050565b5f602082840312156147b5575f80fd5b813560ff81168114613df9575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -311,6 +311,48 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WeightTo return _ERC20TokenStakingManager.Contract.WeightToValue(&_ERC20TokenStakingManager.CallOpts, weight) } +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegator common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegator) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegator) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegator) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// +// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegator common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegator) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// +// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegator) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// +// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegator) +} + // CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. // // Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() @@ -374,6 +416,48 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init return _ERC20TokenStakingManager.Contract.Initialize(&_ERC20TokenStakingManager.TransactOpts, settings, token) } +// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. +// +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeDelegatorRegistration", validationID, stakeAmount) +} + +// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. +// +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeDelegatorRegistration(validationID [32]byte, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, stakeAmount) +} + +// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. +// +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeDelegatorRegistration(validationID [32]byte, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, stakeAmount) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. +// +// Solidity: function initializeEndDelegation(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeEndDelegation", validationID) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. +// +// Solidity: function initializeEndDelegation(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeEndDelegation(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. +// +// Solidity: function initializeEndDelegation(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeEndDelegation(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + // InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. // // Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() @@ -416,6 +500,48 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, blsPublicKey) } +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// +// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, delegator common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "resendDelegatorRegistration", validationID, delegator) +} + +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// +// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendDelegatorRegistration(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegator) +} + +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// +// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendDelegatorRegistration(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegator) +} + +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// +// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendEndDelegation(opts *bind.TransactOpts, validationID [32]byte, delegator common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "resendEndDelegation", validationID, delegator) +} + +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// +// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendEndDelegation(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID, delegator) +} + +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// +// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendEndDelegation(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID, delegator) +} + // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. // // Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() @@ -458,6 +584,641 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Rese return _ERC20TokenStakingManager.Contract.ResendRegisterValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) } +// ERC20TokenStakingManagerDelegationEndedIterator is returned from FilterDelegationEnded and is used to iterate over the raw logs and unpacked data for DelegationEnded events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegationEndedIterator struct { + Event *ERC20TokenStakingManagerDelegationEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerDelegationEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegationEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegationEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerDelegationEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerDelegationEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegationEnded struct { + ValidationID [32]byte + Delegator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564. +// +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegatorRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerDelegationEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil +} + +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564. +// +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, validationID [][32]byte, delegator []common.Address) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerDelegationEnded) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegationEnded is a log parse operation binding the contract event 0x132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564. +// +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { + event := new(ERC20TokenStakingManagerDelegationEnded) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerDelegatorAddedIterator is returned from FilterDelegatorAdded and is used to iterate over the raw logs and unpacked data for DelegatorAdded events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegatorAddedIterator struct { + Event *ERC20TokenStakingManagerDelegatorAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegatorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegatorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerDelegatorAdded represents a DelegatorAdded event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegatorAdded struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + Delegator common.Address + Weight *big.Int + StartTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xf8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16. +// +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 weight, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegatorAddedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegatorRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerDelegatorAddedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil +} + +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xf8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16. +// +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 weight, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerDelegatorAdded) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegatorAdded is a log parse operation binding the contract event 0xf8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16. +// +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 weight, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*ERC20TokenStakingManagerDelegatorAdded, error) { + event := new(ERC20TokenStakingManagerDelegatorAdded) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerDelegatorRegisteredIterator is returned from FilterDelegatorRegistered and is used to iterate over the raw logs and unpacked data for DelegatorRegistered events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegatorRegisteredIterator struct { + Event *ERC20TokenStakingManagerDelegatorRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegatorRegistered struct { + ValidationID [32]byte + Delegator common.Address + Weight *big.Int + StartTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88. +// +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerDelegatorRegisteredIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil +} + +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88. +// +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegator []common.Address) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerDelegatorRegistered) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegatorRegistered is a log parse operation binding the contract event 0x4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88. +// +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*ERC20TokenStakingManagerDelegatorRegistered, error) { + event := new(ERC20TokenStakingManagerDelegatorRegistered) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerDelegatorRemovalInitializedIterator is returned from FilterDelegatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for DelegatorRemovalInitialized events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegatorRemovalInitializedIterator struct { + Event *ERC20TokenStakingManagerDelegatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegatorRemovalInitialized struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + Delegator common.Address + EndTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegatorRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerDelegatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerDelegatorRemovalInitialized, error) { + event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // ERC20TokenStakingManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerInitializedIterator struct { Event *ERC20TokenStakingManagerInitialized // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 7961fc2a6..4917fcc4c 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161320438038061320483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130b78061014d5f395ff3fe60806040526004361061008e575f3560e01c8063a3a65e4811610057578063a3a65e481461015a578063b771b3bc14610179578063bee0a03f146101ab578063f40797d7146101ca578063fdf94a1a146101dd575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063620658561461010e57806376f786211461013b575b5f80fd5b34801561009d575f80fd5b506100b16100ac366004612825565b6101fc565b005b3480156100be575f80fd5b506100b16100cd36600461283b565b610308565b3480156100dd575f80fd5b506100f16100ec36600461283b565b6104de565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b5061012d61012836600461286d565b6104f4565b604051908152602001610105565b348015610146575f80fd5b506100b16101553660046128ad565b61050d565b348015610165575f80fd5b506100b16101743660046128e8565b61083e565b348015610184575f80fd5b506101936005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101b6575f80fd5b506100b16101c536600461283b565b610b57565b61012d6101d8366004612993565b610c66565b3480156101e8575f80fd5b506100b16101f7366004612a25565b610c88565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba8661105b565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061308b83398151915293929190829060ff16600581111561036857610368612a5a565b600581111561037957610379612a5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156103f0576103f0612a5a565b1461045a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61046a8483606001515f61106f565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610497908490600401612a90565b6020604051808303815f875af11580156104b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d79190612ac2565b5050505050565b5f6104ee64e8d4a5100083612b01565b92915050565b5f6104ee6001600160401b03831664e8d4a51000612b14565b8115610830575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610581573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105a89190810190612b4a565b915091508061060b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610451565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561064e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106729190612ac2565b8251146106d65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610451565b60208201516001600160a01b03161561074c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610451565b5f8061075b846040015161128c565b915091508188146107c85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610451565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61083983611464565b505050565b5f5f8051602061308b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610899573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108c09190810190612b4a565b91509150806108e15760405162461bcd60e51b815260040161045190612c1c565b82548251146109445760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610451565b60208201516001600160a01b0316156109b75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610451565b5f806109c684604001516117ac565b9150915080610a285760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610451565b5f82815260058601602052604081208054610a4290612c62565b9050118015610a74575060015f83815260068701602052604090205460ff166005811115610a7257610a72612a5a565b145b610a905760405162461bcd60e51b815260040161045190612c94565b5f8281526005860160205260408120610aa8916127db565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061308b833981519152929190610b9f90612c62565b9050118015610bd1575060015f83815260068301602052604090205460ff166005811115610bcf57610bcf612a5a565b145b610bed5760405162461bcd60e51b815260040161045190612c94565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c269190600401612cdb565b6020604051808303815f875af1158015610c42573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108399190612ac2565b5f80610c713461194d565b9050610c7f85828686611a0a565b95945050505050565b5f5f8051602061308b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ce3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d0a9190810190612b4a565b9150915080610d2b5760405162461bcd60e51b815260040161045190612c1c565b5f8415610daf575f610d408460400151611e41565b919350909150506001600160401b03811615610da95760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610451565b50610e25565b5f610dbd84604001516117ac565b90925090508015610e235760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610451565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610e5657610e56612a5a565b6005811115610e6757610e67612a5a565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610ef85760405162461bcd60e51b815260040161045190612d65565b5f600382516005811115610f0e57610f0e612a5a565b1480610f2c5750600282516005811115610f2a57610f2a612a5a565b145b15610f4f57506020808201515f9081526007870190915260408120556004610f53565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f8457610f84612a5a565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b61106361207c565b61106c816120c7565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110e8576110a8816001612db1565b6110b3906008612b14565b5081515f908390839081106110ca576110ca612dc4565b60200101906001600160f81b03191690815f1a905350600101611094565b505f5b600481101561114b576110ff816003612db1565b61110a906008612b14565b6001901c60f81b8261111d836002612dd8565b8151811061112d5761112d612dc4565b60200101906001600160f81b03191690815f1a9053506001016110eb565b505f5b60208110156111ad5761116281601f612db1565b61116d906008612b14565b86901c60f81b8261117f836006612dd8565b8151811061118f5761118f612dc4565b60200101906001600160f81b03191690815f1a90535060010161114e565b505f5b6008811015611218576111c4816007612db1565b6111cf906008612b14565b6001600160401b038616901c60f81b826111ea836026612dd8565b815181106111fa576111fa612dc4565b60200101906001600160f81b03191690815f1a9053506001016111b0565b505f5b60088110156112835761122f816007612db1565b61123a906008612b14565b6001600160401b038516901c60f81b8261125583602e612dd8565b8151811061126557611265612dc4565b60200101906001600160f81b03191690815f1a90535060010161121b565b50949350505050565b5f808251602e146112af5760405162461bcd60e51b815260040161045190612deb565b5f805b60028110156112fe576112c6816001612db1565b6112d1906008612b14565b61ffff168582815181106112e7576112e7612dc4565b016020015160f81c901b91909117906001016112b2565b5061ffff8116156113215760405162461bcd60e51b815260040161045190612e34565b5f805b600481101561137c57611338816003612db1565b611343906008612b14565b63ffffffff1686611355836002612dd8565b8151811061136557611365612dc4565b016020015160f81c901b9190911790600101611324565b5063ffffffff81166004146113a35760405162461bcd60e51b815260040161045190612e77565b5f805b60208110156113f8576113ba81601f612db1565b6113c5906008612b14565b876113d1836006612dd8565b815181106113e1576113e1612dc4565b016020015160f81c901b91909117906001016113a6565b505f805b600881101561145757611410816007612db1565b61141b906008612b14565b6001600160401b031688611430836026612dd8565b8151811061144057611440612dc4565b016020015160f81c901b91909117906001016113fc565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061308b83398151915293929190829060ff1660058111156114c4576114c4612a5a565b60058111156114d5576114d5612a5a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561154f5761154f612a5a565b146115ab5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610451565b60408101516001600160a01b0316336001600160a01b0316146115e05760405162461bcd60e51b815260040161045190612d65565b6115ed816080015161210a565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561163157611631612a5a565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116e89085908361106f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611717908590600401612a90565b6020604051808303815f875af1158015611733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117579190612ac2565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117cf5760405162461bcd60e51b815260040161045190612deb565b5f805b600281101561181e576117e6816001612db1565b6117f1906008612b14565b61ffff1685828151811061180757611807612dc4565b016020015160f81c901b91909117906001016117d2565b5061ffff8116156118415760405162461bcd60e51b815260040161045190612e34565b5f805b600481101561189c57611858816003612db1565b611863906008612b14565b63ffffffff1686611875836002612dd8565b8151811061188557611885612dc4565b016020015160f81c901b9190911790600101611844565b5063ffffffff81166002146118c35760405162461bcd60e51b815260040161045190612e77565b5f805b6020811015611918576118da81601f612db1565b6118e5906008612b14565b876118f1836006612dd8565b8151811061190157611901612dc4565b016020015160f81c901b91909117906001016118c6565b505f8660268151811061192d5761192d612dc4565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00828261197a826104de565b83549091506001600160401b038216108015906119a457508260010154816001600160401b031611155b611a025760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610451565b949350505050565b5f611a136122ab565b5f8051602061308b833981519152426001600160401b038516118015611a4d57506001600160401b038416611a4b426202a300612dd8565b115b611aaf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610451565b85611b065760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610451565b5f86815260078201602052604090205415611b745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610451565b8251603014611bdb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610451565b611be48561210a565b5f80611c2b6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506122f5565b5f82815260058601602052604090209193509150611c498282612f02565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611c76908590600401612a90565b6020604051808303815f875af1158015611c92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb69190612ac2565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611d2f57611d2f612a5a565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a0260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611e655760405162461bcd60e51b815260040161045190612deb565b5f805b6002811015611eb457611e7c816001612db1565b611e87906008612b14565b61ffff16868281518110611e9d57611e9d612dc4565b016020015160f81c901b9190911790600101611e68565b5061ffff811615611ed75760405162461bcd60e51b815260040161045190612e34565b5f805b6004811015611f3257611eee816003612db1565b611ef9906008612b14565b63ffffffff1687611f0b836002612dd8565b81518110611f1b57611f1b612dc4565b016020015160f81c901b9190911790600101611eda565b5063ffffffff8116600114611f595760405162461bcd60e51b815260040161045190612e77565b5f805b6020811015611fae57611f7081601f612db1565b611f7b906008612b14565b88611f87836006612dd8565b81518110611f9757611f97612dc4565b016020015160f81c901b9190911790600101611f5c565b505f805b600881101561200d57611fc6816007612db1565b611fd1906008612b14565b6001600160401b031689611fe6836026612dd8565b81518110611ff657611ff6612dc4565b016020015160f81c901b9190911790600101611fb2565b505f805b600881101561206c57612025816007612db1565b612030906008612b14565b6001600160401b03168a61204583602e612dd8565b8151811061205557612055612dc4565b016020015160f81c901b9190911790600101612011565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166120c557604051631afcd79f60e31b815260040160405180910390fd5b565b6120cf61207c565b6120d8816126c0565b61106c606082013560808301356120f560c0850160a0860161286d565b61210560e0860160c08701612fbd565b6126e1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061308b8339815191529060ff165f03612148575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121909083612db1565b106121ac576001600160401b03841660408301528082526121cb565b83826040018181516121be9190612fd8565b6001600160401b03169052505b5f8260200151836040015160646121e29190612fff565b6121ec919061302a565b600285015490915060ff90811690821611156122675760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610451565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016122ef57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461235f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610451565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156123d657612396816001612db1565b6123a1906008612b14565b5081515f908390839081106123b8576123b8612dc4565b60200101906001600160f81b03191690815f1a905350600101612382565b505f5b6004811015612434576123ed816003612db1565b6123f8906008612b14565b505f82612406836002612dd8565b8151811061241657612416612dc4565b60200101906001600160f81b03191690815f1a9053506001016123d9565b505f5b6020811015612491578451816020811061245357612453612dc4565b1a60f81b82612463836006612dd8565b8151811061247357612473612dc4565b60200101906001600160f81b03191690815f1a905350600101612437565b505f5b60208110156124f157846020015181602081106124b3576124b3612dc4565b1a60f81b826124c3836026612dd8565b815181106124d3576124d3612dc4565b60200101906001600160f81b03191690815f1a905350600101612494565b505f5b600881101561256557612508816007612db1565b612513906008612b14565b60ff1685604001516001600160401b0316901c60f81b828260466125379190612dd8565b8151811061254757612547612dc4565b60200101906001600160f81b03191690815f1a9053506001016124f4565b505f5b60308110156125d0578460800151818151811061258757612587612dc4565b01602001516001600160f81b031916826125a283604e612dd8565b815181106125b2576125b2612dc4565b60200101906001600160f81b03191690815f1a905350600101612568565b505f5b6008811015612642576125e7816007612db1565b6125f2906008612b14565b60608601516001600160401b0390811691161c60f81b8261261483607e612dd8565b8151811061262457612624612dc4565b60200101906001600160f81b03191690815f1a9053506001016125d3565b50600281604051612653919061304f565b602060405180830381855afa15801561266e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906126919190612ac2565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126c861207c565b6126d061274f565b6126d861275f565b61106c81612767565b6126e961207c565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61275761207c565b6120c56127d3565b6120c561207c565b61276f61207c565b80355f8051602061308b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556127b9606083016040840161306a565b600291909101805460ff191660ff90921691909117905550565b61269a61207c565b5080546127e790612c62565b5f825580601f106127f6575050565b601f0160209004905f5260205f209081019061106c91905b80821115612821575f815560010161280e565b5090565b5f60e08284031215612835575f80fd5b50919050565b5f6020828403121561284b575f80fd5b5035919050565b80356001600160401b0381168114612868575f80fd5b919050565b5f6020828403121561287d575f80fd5b61288682612852565b9392505050565b801515811461106c575f80fd5b803563ffffffff81168114612868575f80fd5b5f805f606084860312156128bf575f80fd5b8335925060208401356128d18161288d565b91506128df6040850161289a565b90509250925092565b5f602082840312156128f8575f80fd5b6128868261289a565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561293757612937612901565b60405290565b604051601f8201601f191681016001600160401b038111828210171561296557612965612901565b604052919050565b5f6001600160401b0382111561298557612985612901565b50601f01601f191660200190565b5f805f606084860312156129a5575f80fd5b833592506129b560208501612852565b915060408401356001600160401b038111156129cf575f80fd5b8401601f810186136129df575f80fd5b80356129f26129ed8261296d565b61293d565b818152876020838501011115612a06575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612a36575f80fd5b612a3f8361289a565b91506020830135612a4f8161288d565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612a88578181015183820152602001612a70565b50505f910152565b602081525f8251806020840152612aae816040850160208701612a6e565b601f01601f19169190910160400192915050565b5f60208284031215612ad2575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612b0f57612b0f612ad9565b500490565b80820281158282048414176104ee576104ee612aed565b6001600160a01b038116811461106c575f80fd5b80516128688161288d565b5f8060408385031215612b5b575f80fd5b82516001600160401b0380821115612b71575f80fd5b9084019060608287031215612b84575f80fd5b612b8c612915565b82518152602080840151612b9f81612b2b565b82820152604084015183811115612bb4575f80fd5b80850194505087601f850112612bc8575f80fd5b83519250612bd86129ed8461296d565b8381528882858701011115612beb575f80fd5b612bfa84838301848801612a6e565b80604084015250819550612c0f818801612b3f565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612c7657607f821691505b60208210810361283557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612ced81612c62565b806020870152604060018084165f8114612d0e5760018114612d2a57612d57565b60ff19851660408a0152604084151560051b8a01019550612d57565b895f5260205f205f5b85811015612d4e5781548b8201860152908301908801612d33565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104ee576104ee612aed565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104ee576104ee612aed565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f82111561083957805f5260205f20601f840160051c81016020851015612ee35750805b601f840160051c820191505b818110156104d7575f8155600101612eef565b81516001600160401b03811115612f1b57612f1b612901565b612f2f81612f298454612c62565b84612ebe565b602080601f831160018114612f62575f8415612f4b5750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b82811015612f9057888601518255948401946001909101908401612f71565b5085821015612fad57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612fcd575f80fd5b813561288681612b2b565b6001600160401b03818116838216019080821115612ff857612ff8612aed565b5092915050565b6001600160401b0381811683821602808216919082811461302257613022612aed565b505092915050565b5f6001600160401b038084168061304357613043612ad9565b92169190910492915050565b5f8251613060818460208701612a6e565b9190910192915050565b5f6020828403121561307a575f80fd5b813560ff81168114612886575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516146c73803806146c783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61457a8061014d5f395ff3fe6080604052600436106100ee575f3560e01c8063927e7e7511610087578063c599e24f11610057578063c599e24f146102a6578063d61bed74146102b9578063f40797d7146102d8578063fdf94a1a146102eb575f80fd5b8063927e7e7514610217578063a3a65e4814610236578063b771b3bc14610255578063bee0a03f14610287575f80fd5b80632e2194d8116100c25780632e2194d81461017057806362065856146101ac5780636a7e3d83146101d957806376f78621146101f8575f80fd5b8062e41792146100f25780630322ed98146101135780630915204e146101325780630b77f69314610151575b5f80fd5b3480156100fd575f80fd5b5061011161010c366004613a75565b61030a565b005b34801561011e575f80fd5b5061011161012d366004613a8b565b610416565b34801561013d575f80fd5b5061011161014c366004613ace565b610607565b34801561015c575f80fd5b5061011161016b366004613b03565b610835565b34801561017b575f80fd5b5061018f61018a366004613a8b565b610947565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101b7575f80fd5b506101cb6101c6366004613b3c565b61095d565b6040519081526020016101a3565b3480156101e4575f80fd5b506101116101f3366004613b03565b610976565b348015610203575f80fd5b50610111610212366004613b69565b610a88565b348015610222575f80fd5b50610111610231366004613a8b565b610da6565b348015610241575f80fd5b50610111610250366004613ba4565b6110d5565b348015610260575f80fd5b5061026f6005600160991b0181565b6040516001600160a01b0390911681526020016101a3565b348015610292575f80fd5b506101116102a1366004613a8b565b61128e565b6101116102b4366004613a8b565b61139d565b3480156102c4575f80fd5b506101116102d3366004613ace565b6113b8565b6101cb6102e6366004613c4f565b61161a565b3480156102f6575f80fd5b50610111610305366004613ce1565b61163c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561034e5750825b90505f826001600160401b031660011480156103695750303b155b905081158015610377575080155b156103955760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103bf57845460ff60401b1916600160401b1785555b6103c886611a0f565b831561040e57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181525f8051602061454e8339815191526020526040808220815160e0810190925280545f8051602061450e83398151915293929190829060ff16600581111561046357610463613d0b565b600581111561047457610474613d0b565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916104fe90613d1f565b905011801561051f575060038151600581111561051d5761051d613d0b565b145b6105885760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613d51565b6020604051808303815f875af11580156105dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106019190613ddb565b50505050565b5f805160206144ee8339815191525f61061f84611a23565b90505f805f6106318460400151611bbe565b5f83815260068901602090815260408083206001600160a01b038d168452909152812080549497509295509093509161066990613d1f565b90501180156106b6575060035f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff1660058111156106b4576106b4613d0b565b145b6106d25760405162461bcd60e51b815260040161057f90613df2565b5f83815260068601602090815260408083206001600160a01b038a16845290915281206106fe91613a2b565b5f61070884611df9565b5f85815260048801602090815260408083206001600160a01b038c16845290915290205460808201519192506001600160401b038085169261074d9290911690613e58565b6001600160401b0316146107735760405162461bcd60e51b815260040161057f90613e7f565b826001600160401b031681606001516001600160401b031610156107a95760405162461bcd60e51b815260040161057f90613ec2565b5f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c21b1790556001600160401b03821660808201526107f68482611ef4565b6040516001600160a01b0388169085907f132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564905f90a35050505050505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206144ee83398151915292919061089190613d1f565b90501180156108de575060015f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff1660058111156108dc576108dc613d0b565b145b6108fa5760405162461bcd60e51b815260040161057f90613f04565b5f83815260058201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613d51565b5f61095764e8d4a5100083613f75565b92915050565b5f6109576001600160401b03831664e8d4a51000613f88565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f805160206144ee8339815191529291906109d290613d1f565b9050118015610a1f575060035f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff166005811115610a1d57610a1d613d0b565b145b610a3b5760405162461bcd60e51b815260040161057f90613df2565b5f83815260068201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613d51565b8115610d98575f5f805160206144ee8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ae9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b109190810190613fcc565b9150915080610b735760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bda9190613ddb565b825114610c3e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057f565b60208201516001600160a01b031615610cb45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057f565b5f80610cc38460400151611fe3565b91509150818814610d305760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057f565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610da1836121bb565b505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f805160206144ee83398151915293926060830190600160c01b900460ff166005811115610e4557610e45613d0b565b6005811115610e5657610e56613d0b565b9052509050600281606001516005811115610e7357610e73613d0b565b14610ecf5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2044656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161057f565b600360608201908152426001600160401b0390811660408085019182525f8781526004870160209081528282203383528152919020855181549287015193518516600160801b0267ffffffffffffffff60801b19948616600160401b026001600160801b03199094169190951617919091179182168317815592518493929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836005811115610f8157610f81613d0b565b02179055509050505f610f9384611df9565b9050815f01516001600160401b031681608001516001600160401b03161015610fce5760405162461bcd60e51b815260040161057f90613e7f565b5f610ff285610fdc876124c8565b85516080860151610fed9190613e58565b612543565b5f8681526006860160209081526040808320338452909152902090915061101982826140e9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906110469085906004016141a4565b6020604051808303815f875af1158015611062573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110869190613ddb565b9050336001600160a01b031681877f2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2426040516110c591815260200190565b60405180910390a4505050505050565b5f8051602061450e8339815191525f6110ed83611a23565b90505f806110fe8360400151612760565b91509150806111605760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057f565b5f8281526005850160205260408120805461117a90613d1f565b90501180156111ac575060015f83815260078601602052604090205460ff1660058111156111aa576111aa613d0b565b145b6111c85760405162461bcd60e51b815260040161057f906141d6565b5f82815260058501602052604081206111e091613a2b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061450e8339815191529291906112d690613d1f565b9050118015611308575060015f83815260078301602052604090205460ff16600581111561130657611306613d0b565b145b6113245760405162461bcd60e51b815260040161057f906141d6565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161135d9190600401613d51565b6020604051808303815f875af1158015611379573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da19190613ddb565b5f6113a734612901565b90506113b48233836129ab565b5050565b5f805160206144ee8339815191525f6113d084611a23565b90505f805f6113e28460400151611bbe565b5f83815260058901602090815260408083206001600160a01b038d168452909152812080549497509295509093509161141a90613d1f565b9050118015611467575060015f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff16600581111561146557611465613d0b565b145b6114835760405162461bcd60e51b815260040161057f90613f04565b5f83815260058601602090815260408083206001600160a01b038a16845290915281206114af91613a2b565b5f6114b984611df9565b60808101515f86815260048901602090815260408083206001600160a01b038d1684529091529020549192506001600160401b03808516926114fc92911661421d565b6001600160401b0316146115225760405162461bcd60e51b815260040161057f90613e7f565b826001600160401b031681606001516001600160401b031610156115585760405162461bcd60e51b815260040161057f90613ec2565b6001600160401b03821660808201525f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c11b1790556115a58482611ef4565b5f84815260048701602090815260408083206001600160a01b038b16808552908352928190205481516001600160401b039091168152429281019290925286917f4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88910160405180910390a35050505050505050565b5f8061162534612901565b905061163385828686612ca6565b95945050505050565b5f5f8051602061450e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611697573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116be9190810190613fcc565b91509150806116df5760405162461bcd60e51b815260040161057f9061423d565b5f8415611763575f6116f484604001516130da565b919350909150506001600160401b0381161561175d5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161057f565b506117d9565b5f6117718460400151612760565b909250905080156117d75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057f565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561180a5761180a613d0b565b600581111561181b5761181b613d0b565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146118ac5760405162461bcd60e51b815260040161057f90614283565b5f6003825160058111156118c2576118c2613d0b565b14806118e057506002825160058111156118de576118de613d0b565b145b1561190357506020808201515f9081526008870190915260408120556004611907565b5060055b5f83815260078701602052604090208251815484929190829060ff1916600183600581111561193857611938613d0b565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b611a17613305565b611a2081613350565b50565b60408051606080820183525f8083526020830181905292820152905f8051602061450e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611a98573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611abf9190810190613fcc565b9150915080611ae05760405162461bcd60e51b815260040161057f9061423d565b8254825114611b435760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057f565b60208201516001600160a01b031615611bb65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057f565b509392505050565b5f805f8351603614611be25760405162461bcd60e51b815260040161057f906142cf565b5f805b6002811015611c3157611bf9816001614318565b611c04906008613f88565b61ffff16868281518110611c1a57611c1a61432b565b016020015160f81c901b9190911790600101611be5565b5061ffff811615611c545760405162461bcd60e51b815260040161057f9061433f565b5f805b6004811015611caf57611c6b816003614318565b611c76906008613f88565b63ffffffff1687611c88836002614382565b81518110611c9857611c9861432b565b016020015160f81c901b9190911790600101611c57565b5063ffffffff8116600314611cd65760405162461bcd60e51b815260040161057f90614395565b5f805b6020811015611d2b57611ced81601f614318565b611cf8906008613f88565b88611d04836006614382565b81518110611d1457611d1461432b565b016020015160f81c901b9190911790600101611cd9565b505f805b6008811015611d8a57611d43816007614318565b611d4e906008613f88565b6001600160401b031689611d63836026614382565b81518110611d7357611d7361432b565b016020015160f81c901b9190911790600101611d2f565b505f805b6008811015611de957611da2816007614318565b611dad906008613f88565b6001600160401b03168a611dc283602e614382565b81518110611dd257611dd261432b565b016020015160f81c901b9190911790600101611d8e565b5091989097509095509350505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061454e83398151915290528390208351918201909352825491925f8051602061450e83398151915292829060ff166005811115611e7957611e79613d0b565b6005811115611e8a57611e8a613d0b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061454e83398151915260205260409020815181545f8051602061450e8339815191529284929091829060ff19166001836005811115611f3e57611f3e613d0b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f808251602e146120065760405162461bcd60e51b815260040161057f906142cf565b5f805b60028110156120555761201d816001614318565b612028906008613f88565b61ffff1685828151811061203e5761203e61432b565b016020015160f81c901b9190911790600101612009565b5061ffff8116156120785760405162461bcd60e51b815260040161057f9061433f565b5f805b60048110156120d35761208f816003614318565b61209a906008613f88565b63ffffffff16866120ac836002614382565b815181106120bc576120bc61432b565b016020015160f81c901b919091179060010161207b565b5063ffffffff81166004146120fa5760405162461bcd60e51b815260040161057f90614395565b5f805b602081101561214f5761211181601f614318565b61211c906008613f88565b87612128836006614382565b815181106121385761213861432b565b016020015160f81c901b91909117906001016120fd565b505f805b60088110156121ae57612167816007614318565b612172906008613f88565b6001600160401b031688612187836026614382565b815181106121975761219761432b565b016020015160f81c901b9190911790600101612153565b5090969095509350505050565b5f8181525f8051602061454e8339815191526020526040808220815160e0810190925280545f8051602061450e83398151915293929190829060ff16600581111561220857612208613d0b565b600581111561221957612219613d0b565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561229357612293613d0b565b146122b05760405162461bcd60e51b815260040161057f906143dc565b60408101516001600160a01b0316336001600160a01b0316146122e55760405162461bcd60e51b815260040161057f90614283565b6122f28160800151613393565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561233657612336613d0b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6123ea846123e4816124c8565b5f612543565b5f858152600685016020526040902090915061240682826140e9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124339085906004016141a4565b6020604051808303815f875af115801561244f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124739190613ddb565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f8051602061454e8339815191526020526040812060020180545f8051602061450e83398151915291600160a01b9091046001600160401b0316908190601461251483614422565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156125bc5761257c816001614318565b612587906008613f88565b5081515f9083908390811061259e5761259e61432b565b60200101906001600160f81b03191690815f1a905350600101612568565b505f5b600481101561261f576125d3816003614318565b6125de906008613f88565b6001901c60f81b826125f1836002614382565b815181106126015761260161432b565b60200101906001600160f81b03191690815f1a9053506001016125bf565b505f5b60208110156126815761263681601f614318565b612641906008613f88565b86901c60f81b82612653836006614382565b815181106126635761266361432b565b60200101906001600160f81b03191690815f1a905350600101612622565b505f5b60088110156126ec57612698816007614318565b6126a3906008613f88565b6001600160401b038616901c60f81b826126be836026614382565b815181106126ce576126ce61432b565b60200101906001600160f81b03191690815f1a905350600101612684565b505f5b600881101561275757612703816007614318565b61270e906008613f88565b6001600160401b038516901c60f81b8261272983602e614382565b815181106127395761273961432b565b60200101906001600160f81b03191690815f1a9053506001016126ef565b50949350505050565b5f8082516027146127835760405162461bcd60e51b815260040161057f906142cf565b5f805b60028110156127d25761279a816001614318565b6127a5906008613f88565b61ffff168582815181106127bb576127bb61432b565b016020015160f81c901b9190911790600101612786565b5061ffff8116156127f55760405162461bcd60e51b815260040161057f9061433f565b5f805b60048110156128505761280c816003614318565b612817906008613f88565b63ffffffff1686612829836002614382565b815181106128395761283961432b565b016020015160f81c901b91909117906001016127f8565b5063ffffffff81166002146128775760405162461bcd60e51b815260040161057f90614395565b5f805b60208110156128cc5761288e81601f614318565b612899906008613f88565b876128a5836006614382565b815181106128b5576128b561432b565b016020015160f81c901b919091179060010161287a565b505f866026815181106128e1576128e161432b565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206144ee833981519152828261291b82610947565b83549091506001600160401b0382161080159061294557508260010154816001600160401b031611155b6129a35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161057f565b949350505050565b6129b3613534565b5f805160206144ee8339815191525f6129cb85611df9565b90506002815160058111156129e2576129e2613d0b565b146129ff5760405162461bcd60e51b815260040161057f906143dc565b5f85815260048301602090815260408083206001600160a01b03881684529091529020546001600160401b031615612a905760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2044656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161057f565b612a9983613393565b5f612ab786612aa7886124c8565b868560800151610fed919061421d565b5f87815260058501602090815260408083206001600160a01b038a1684529091529020909150612ae782826140e9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b149085906004016141a4565b6020604051808303815f875af1158015612b30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b549190613ddb565b604080516080810182526001600160401b038089168252421660208201525f9181019190915290915060608101600190525f88815260048601602090815260408083206001600160a01b038b1684528252918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836005811115612c3557612c35613d0b565b021790555050604080516001600160401b03881681524260208201526001600160a01b038916925083918a917ff8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16910160405180910390a450505050610da160015f8051602061452e83398151915255565b5f612caf613534565b5f8051602061450e833981519152426001600160401b038516118015612ce957506001600160401b038416612ce7426202a300614382565b115b612d4b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161057f565b85612da25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161057f565b5f86815260088201602052604090205415612e105760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057f565b8251603014612e775760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057f565b612e8085613393565b5f80612ec76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061357e565b5f82815260058601602052604090209193509150612ee582826140e9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f129085906004016141a4565b6020604051808303815f875af1158015612f2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f529190613ddb565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612fcb57612fcb613d0b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055613074836124c8565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506129a360015f8051602061452e83398151915255565b5f805f83516036146130fe5760405162461bcd60e51b815260040161057f906142cf565b5f805b600281101561314d57613115816001614318565b613120906008613f88565b61ffff168682815181106131365761313661432b565b016020015160f81c901b9190911790600101613101565b5061ffff8116156131705760405162461bcd60e51b815260040161057f9061433f565b5f805b60048110156131cb57613187816003614318565b613192906008613f88565b63ffffffff16876131a4836002614382565b815181106131b4576131b461432b565b016020015160f81c901b9190911790600101613173565b5063ffffffff81166001146131f25760405162461bcd60e51b815260040161057f90614395565b5f805b60208110156132475761320981601f614318565b613214906008613f88565b88613220836006614382565b815181106132305761323061432b565b016020015160f81c901b91909117906001016131f5565b505f805b60088110156132a65761325f816007614318565b61326a906008613f88565b6001600160401b03168961327f836026614382565b8151811061328f5761328f61432b565b016020015160f81c901b919091179060010161324b565b505f805b6008811015611de9576132be816007614318565b6132c9906008613f88565b6001600160401b03168a6132de83602e614382565b815181106132ee576132ee61432b565b016020015160f81c901b91909117906001016132aa565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661334e57604051631afcd79f60e31b815260040160405180910390fd5b565b613358613305565b61336181613923565b611a206060820135608083013561337e60c0850160a08601613b3c565b61338e60e0860160c08701614447565b613944565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061450e8339815191529060ff165f036133d1575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906134199083614318565b10613435576001600160401b0384166040830152808252613454565b8382604001818151613447919061421d565b6001600160401b03169052505b5f82602001518360400151606461346b9190614462565b613475919061448d565b600285015490915060ff90811690821611156134f05760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161057f565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061452e83398151915280546001190161356557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061452e83398151915255565b5f60608260800151516030146135e85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561365f5761361f816001614318565b61362a906008613f88565b5081515f908390839081106136415761364161432b565b60200101906001600160f81b03191690815f1a90535060010161360b565b505f5b60048110156136bd57613676816003614318565b613681906008613f88565b505f8261368f836002614382565b8151811061369f5761369f61432b565b60200101906001600160f81b03191690815f1a905350600101613662565b505f5b602081101561371a57845181602081106136dc576136dc61432b565b1a60f81b826136ec836006614382565b815181106136fc576136fc61432b565b60200101906001600160f81b03191690815f1a9053506001016136c0565b505f5b602081101561377a578460200151816020811061373c5761373c61432b565b1a60f81b8261374c836026614382565b8151811061375c5761375c61432b565b60200101906001600160f81b03191690815f1a90535060010161371d565b505f5b60088110156137ee57613791816007614318565b61379c906008613f88565b60ff1685604001516001600160401b0316901c60f81b828260466137c09190614382565b815181106137d0576137d061432b565b60200101906001600160f81b03191690815f1a90535060010161377d565b505f5b603081101561385957846080015181815181106138105761381061432b565b01602001516001600160f81b0319168261382b83604e614382565b8151811061383b5761383b61432b565b60200101906001600160f81b03191690815f1a9053506001016137f1565b505f5b60088110156138cb57613870816007614318565b61387b906008613f88565b60608601516001600160401b0390811691161c60f81b8261389d83607e614382565b815181106138ad576138ad61432b565b60200101906001600160f81b03191690815f1a90535060010161385c565b506002816040516138dc91906144b2565b602060405180830381855afa1580156138f7573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061391a9190613ddb565b94909350915050565b61392b613305565b61393361399f565b61393b6139af565b611a20816139b7565b61394c613305565b5f5f805160206144ee833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6139a7613305565b61334e613a23565b61334e613305565b6139bf613305565b80355f8051602061450e83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a0960608301604084016144cd565b600291909101805460ff191660ff90921691909117905550565b61356b613305565b508054613a3790613d1f565b5f825580601f10613a46575050565b601f0160209004905f5260205f2090810190611a2091905b80821115613a71575f8155600101613a5e565b5090565b5f60e08284031215613a85575f80fd5b50919050565b5f60208284031215613a9b575f80fd5b5035919050565b803563ffffffff81168114613ab5575f80fd5b919050565b6001600160a01b0381168114611a20575f80fd5b5f8060408385031215613adf575f80fd5b613ae883613aa2565b91506020830135613af881613aba565b809150509250929050565b5f8060408385031215613b14575f80fd5b823591506020830135613af881613aba565b80356001600160401b0381168114613ab5575f80fd5b5f60208284031215613b4c575f80fd5b613b5582613b26565b9392505050565b8015158114611a20575f80fd5b5f805f60608486031215613b7b575f80fd5b833592506020840135613b8d81613b5c565b9150613b9b60408501613aa2565b90509250925092565b5f60208284031215613bb4575f80fd5b613b5582613aa2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bf357613bf3613bbd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c2157613c21613bbd565b604052919050565b5f6001600160401b03821115613c4157613c41613bbd565b50601f01601f191660200190565b5f805f60608486031215613c61575f80fd5b83359250613c7160208501613b26565b915060408401356001600160401b03811115613c8b575f80fd5b8401601f81018613613c9b575f80fd5b8035613cae613ca982613c29565b613bf9565b818152876020838501011115613cc2575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215613cf2575f80fd5b613cfb83613aa2565b91506020830135613af881613b5c565b634e487b7160e01b5f52602160045260245ffd5b600181811c90821680613d3357607f821691505b602082108103613a8557634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454613d6381613d1f565b806020870152604060018084165f8114613d845760018114613da057613dcd565b60ff19851660408a0152604084151560051b8a01019550613dcd565b895f5260205f205f5b85811015613dc45781548b8201860152908301908801613da9565b8a016040019650505b509398975050505050505050565b5f60208284031215613deb575f80fd5b5051919050565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f722072604082015271656d6f76616c206e6f742070656e64696e6760701b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e7857613e78613e44565b5092915050565b60208082526023908201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960408201526219da1d60ea1b606082015260800190565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20496e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526037908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f72207260408201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82613f8357613f83613f61565b500490565b808202811582820484141761095757610957613e44565b5f5b83811015613fb9578181015183820152602001613fa1565b50505f910152565b8051613ab581613b5c565b5f8060408385031215613fdd575f80fd5b82516001600160401b0380821115613ff3575f80fd5b9084019060608287031215614006575f80fd5b61400e613bd1565b8251815260208084015161402181613aba565b82820152604084015183811115614036575f80fd5b80850194505087601f85011261404a575f80fd5b8351925061405a613ca984613c29565b838152888285870101111561406d575f80fd5b61407c84838301848801613f9f565b80604084015250819550614091818801613fc1565b9450505050509250929050565b601f821115610da157805f5260205f20601f840160051c810160208510156140c35750805b601f840160051c820191505b818110156140e2575f81556001016140cf565b5050505050565b81516001600160401b0381111561410257614102613bbd565b614116816141108454613d1f565b8461409e565b602080601f831160018114614149575f84156141325750858301515b5f19600386901b1c1916600185901b17855561040e565b5f85815260208120601f198616915b8281101561417757888601518255948401946001909101908401614158565b508582101561419457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f82518060208401526141c2816040850160208701613f9f565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160401b03818116838216019080821115613e7857613e78613e44565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561095757610957613e44565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561095757610957613e44565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361443d5761443d613e44565b6001019392505050565b5f60208284031215614457575f80fd5b8135613b5581613aba565b6001600160401b0381811683821602808216919082811461448557614485613e44565b505092915050565b5f6001600160401b03808416806144a6576144a6613f61565b92169190910492915050565b5f82516144c3818460208701613f9f565b9190910192915050565b5f602082840312156144dd575f80fd5b813560ff81168114613b55575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -311,6 +311,48 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) Weight return _NativeTokenStakingManager.Contract.WeightToValue(&_NativeTokenStakingManager.CallOpts, weight) } +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegator common.Address) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegator) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegator) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegator) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// +// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegator common.Address) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegator) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// +// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegator) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// +// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegator) +} + // CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. // // Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() @@ -374,6 +416,48 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } +// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. +// +// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeDelegatorRegistration", validationID) +} + +// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. +// +// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeDelegatorRegistration(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. +// +// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeDelegatorRegistration(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. +// +// Solidity: function initializeEndDelegation(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeEndDelegation", validationID) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. +// +// Solidity: function initializeEndDelegation(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeEndDelegation(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. +// +// Solidity: function initializeEndDelegation(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeEndDelegation(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID) +} + // InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. // // Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() @@ -397,23 +481,65 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In // InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xf40797d7. // -// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes signature) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", nodeID, registrationExpiry, signature) +// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", nodeID, registrationExpiry, blsPublicKey) } // InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xf40797d7. // -// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes signature) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, signature) +// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, blsPublicKey) } // InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xf40797d7. // -// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes signature) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, signature) +// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, blsPublicKey) +} + +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// +// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, delegator common.Address) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "resendDelegatorRegistration", validationID, delegator) +} + +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// +// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendDelegatorRegistration(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID, delegator) +} + +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// +// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendDelegatorRegistration(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID, delegator) +} + +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// +// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendEndDelegation(opts *bind.TransactOpts, validationID [32]byte, delegator common.Address) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "resendEndDelegation", validationID, delegator) +} + +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// +// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendEndDelegation(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID, delegator) +} + +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// +// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendEndDelegation(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID, delegator) } // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. @@ -458,6 +584,641 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Re return _NativeTokenStakingManager.Contract.ResendRegisterValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) } +// NativeTokenStakingManagerDelegationEndedIterator is returned from FilterDelegationEnded and is used to iterate over the raw logs and unpacked data for DelegationEnded events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegationEndedIterator struct { + Event *NativeTokenStakingManagerDelegationEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerDelegationEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegationEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegationEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerDelegationEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerDelegationEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegationEnded struct { + ValidationID [32]byte + Delegator common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564. +// +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegationEndedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegatorRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerDelegationEndedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil +} + +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564. +// +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, validationID [][32]byte, delegator []common.Address) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerDelegationEnded) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegationEnded is a log parse operation binding the contract event 0x132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564. +// +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { + event := new(NativeTokenStakingManagerDelegationEnded) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerDelegatorAddedIterator is returned from FilterDelegatorAdded and is used to iterate over the raw logs and unpacked data for DelegatorAdded events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegatorAddedIterator struct { + Event *NativeTokenStakingManagerDelegatorAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerDelegatorAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegatorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegatorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerDelegatorAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerDelegatorAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerDelegatorAdded represents a DelegatorAdded event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegatorAdded struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + Delegator common.Address + Weight *big.Int + StartTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xf8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16. +// +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 weight, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegatorAddedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegatorRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerDelegatorAddedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil +} + +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xf8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16. +// +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 weight, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerDelegatorAdded) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegatorAdded is a log parse operation binding the contract event 0xf8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16. +// +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 weight, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*NativeTokenStakingManagerDelegatorAdded, error) { + event := new(NativeTokenStakingManagerDelegatorAdded) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerDelegatorRegisteredIterator is returned from FilterDelegatorRegistered and is used to iterate over the raw logs and unpacked data for DelegatorRegistered events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegatorRegisteredIterator struct { + Event *NativeTokenStakingManagerDelegatorRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegatorRegistered struct { + ValidationID [32]byte + Delegator common.Address + Weight *big.Int + StartTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88. +// +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerDelegatorRegisteredIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil +} + +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88. +// +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegator []common.Address) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerDelegatorRegistered) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegatorRegistered is a log parse operation binding the contract event 0x4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88. +// +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*NativeTokenStakingManagerDelegatorRegistered, error) { + event := new(NativeTokenStakingManagerDelegatorRegistered) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerDelegatorRemovalInitializedIterator is returned from FilterDelegatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for DelegatorRemovalInitialized events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegatorRemovalInitializedIterator struct { + Event *NativeTokenStakingManagerDelegatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegatorRemovalInitialized struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + Delegator common.Address + EndTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegatorRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerDelegatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + var delegatorRule []interface{} + for _, delegatorItem := range delegator { + delegatorRule = append(delegatorRule, delegatorItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegatorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerDelegatorRemovalInitialized, error) { + event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // NativeTokenStakingManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerInitializedIterator struct { Event *NativeTokenStakingManagerInitialized // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index eb964608b..8d1ecea88 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -39,7 +39,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c2a380380612c2a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612add8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b836600461227e565b6101b1565b005b6100d26100cd366004612342565b610387565b6040519081526020015b60405180910390f35b6100bd6103a7565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f36600461227e565b6103ba565b6100bd6101523660046123f8565b6103c6565b6101196005600160991b0181565b6100bd61017336600461227e565b6106df565b6100bd61018636600461242c565b6107f3565b6100bd610199366004612468565b610901565b6100bd6101ac366004612490565b61093b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612ab183398151915293929190829060ff166005811115610211576102116124ba565b6005811115610222576102226124ba565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c09091015290915081516005811115610299576102996124ba565b146103035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103138483606001515f610d0e565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103409084906004016124f0565b6020604051808303815f875af115801561035c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190612522565b5050505050565b5f610390610f2b565b61039c84868585610f86565b90505b949350505050565b6103af610f2b565b6103b85f6113bd565b565b6103c38161142d565b50565b5f5f80516020612ab18339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610421573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104489190810190612544565b91509150806104695760405162461bcd60e51b81526004016102fa90612616565b82548251146104cc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102fa565b60208201516001600160a01b03161561053f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102fa565b5f8061054e8460400151611775565b91509150806105b05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102fa565b5f828152600586016020526040812080546105ca9061265c565b90501180156105fc575060015f83815260068701602052604090205460ff1660058111156105fa576105fa6124ba565b145b6106185760405162461bcd60e51b81526004016102fa90612694565b5f828152600586016020526040812061063091612234565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612ab18339815191529291906107279061265c565b9050118015610759575060015f83815260068301602052604090205460ff166005811115610757576107576124ba565b145b6107755760405162461bcd60e51b81526004016102fa90612694565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107ae91906004016126db565b6020604051808303815f875af11580156107ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ee9190612522565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108375750825b90505f826001600160401b031660011480156108525750303b155b905081158015610860575080155b1561087e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108a857845460ff60401b1916600160401b1785555b6108b28787611916565b83156108f857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610909610f2b565b6001600160a01b03811661093257604051631e4fbdf760e01b81525f60048201526024016102fa565b6103c3816113bd565b5f5f80516020612ab18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610996573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109bd9190810190612544565b91509150806109de5760405162461bcd60e51b81526004016102fa90612616565b5f8415610a62575f6109f38460400151611934565b919350909150506001600160401b03811615610a5c5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016102fa565b50610ad8565b5f610a708460400151611775565b90925090508015610ad65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102fa565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610b0957610b096124ba565b6005811115610b1a57610b1a6124ba565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610bab5760405162461bcd60e51b81526004016102fa90612765565b5f600382516005811115610bc157610bc16124ba565b1480610bdf5750600282516005811115610bdd57610bdd6124ba565b145b15610c0257506020808201515f9081526007870190915260408120556004610c06565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610c3757610c376124ba565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610d8757610d478160016127c5565b610d529060086127de565b5081515f90839083908110610d6957610d696127f5565b60200101906001600160f81b03191690815f1a905350600101610d33565b505f5b6004811015610dea57610d9e8160036127c5565b610da99060086127de565b6001901c60f81b82610dbc836002612809565b81518110610dcc57610dcc6127f5565b60200101906001600160f81b03191690815f1a905350600101610d8a565b505f5b6020811015610e4c57610e0181601f6127c5565b610e0c9060086127de565b86901c60f81b82610e1e836006612809565b81518110610e2e57610e2e6127f5565b60200101906001600160f81b03191690815f1a905350600101610ded565b505f5b6008811015610eb757610e638160076127c5565b610e6e9060086127de565b6001600160401b038616901c60f81b82610e89836026612809565b81518110610e9957610e996127f5565b60200101906001600160f81b03191690815f1a905350600101610e4f565b505f5b6008811015610f2257610ece8160076127c5565b610ed99060086127de565b6001600160401b038516901c60f81b82610ef483602e612809565b81518110610f0457610f046127f5565b60200101906001600160f81b03191690815f1a905350600101610eba565b50949350505050565b33610f5d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103b85760405163118cdaa760e01b81523360048201526024016102fa565b5f610f8f611b6f565b5f80516020612ab1833981519152426001600160401b038516118015610fc957506001600160401b038416610fc7426202a300612809565b115b61102b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102fa565b856110825760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102fa565b5f868152600782016020526040902054156110f05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102fa565b82516030146111575760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102fa565b61116085611bb9565b5f806111a76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611d5a565b5f828152600586016020526040902091935091506111c58282612860565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906111f29085906004016124f0565b6020604051808303815f875af115801561120e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112329190612522565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff191660018360058111156112ab576112ab6124ba565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061039f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612ab183398151915293929190829060ff16600581111561148d5761148d6124ba565b600581111561149e5761149e6124ba565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c09091015290915081516005811115611518576115186124ba565b146115745760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102fa565b60408101516001600160a01b0316336001600160a01b0316146115a95760405162461bcd60e51b81526004016102fa90612765565b6115b68160800151611bb9565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156115fa576115fa6124ba565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116b190859083610d0e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116e09085906004016124f0565b6020604051808303815f875af11580156116fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117209190612522565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117985760405162461bcd60e51b81526004016102fa9061291f565b5f805b60028110156117e7576117af8160016127c5565b6117ba9060086127de565b61ffff168582815181106117d0576117d06127f5565b016020015160f81c901b919091179060010161179b565b5061ffff81161561180a5760405162461bcd60e51b81526004016102fa90612968565b5f805b6004811015611865576118218160036127c5565b61182c9060086127de565b63ffffffff168661183e836002612809565b8151811061184e5761184e6127f5565b016020015160f81c901b919091179060010161180d565b5063ffffffff811660021461188c5760405162461bcd60e51b81526004016102fa906129ab565b5f805b60208110156118e1576118a381601f6127c5565b6118ae9060086127de565b876118ba836006612809565b815181106118ca576118ca6127f5565b016020015160f81c901b919091179060010161188f565b505f866026815181106118f6576118f66127f5565b016020015191976001600160f81b03199092161515965090945050505050565b61191e612125565b6119278261216e565b6119308161218f565b5050565b5f805f83516036146119585760405162461bcd60e51b81526004016102fa9061291f565b5f805b60028110156119a75761196f8160016127c5565b61197a9060086127de565b61ffff16868281518110611990576119906127f5565b016020015160f81c901b919091179060010161195b565b5061ffff8116156119ca5760405162461bcd60e51b81526004016102fa90612968565b5f805b6004811015611a25576119e18160036127c5565b6119ec9060086127de565b63ffffffff16876119fe836002612809565b81518110611a0e57611a0e6127f5565b016020015160f81c901b91909117906001016119cd565b5063ffffffff8116600114611a4c5760405162461bcd60e51b81526004016102fa906129ab565b5f805b6020811015611aa157611a6381601f6127c5565b611a6e9060086127de565b88611a7a836006612809565b81518110611a8a57611a8a6127f5565b016020015160f81c901b9190911790600101611a4f565b505f805b6008811015611b0057611ab98160076127c5565b611ac49060086127de565b6001600160401b031689611ad9836026612809565b81518110611ae957611ae96127f5565b016020015160f81c901b9190911790600101611aa5565b505f805b6008811015611b5f57611b188160076127c5565b611b239060086127de565b6001600160401b03168a611b3883602e612809565b81518110611b4857611b486127f5565b016020015160f81c901b9190911790600101611b04565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611bb357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612ab18339815191529060ff165f03611bf7575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611c3f90836127c5565b10611c5b576001600160401b0384166040830152808252611c7a565b8382604001818151611c6d91906129f2565b6001600160401b03169052505b5f826020015183604001516064611c919190612a19565b611c9b9190612a44565b600285015490915060ff9081169082161115611d165760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102fa565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611dc45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102fa565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e3b57611dfb8160016127c5565b611e069060086127de565b5081515f90839083908110611e1d57611e1d6127f5565b60200101906001600160f81b03191690815f1a905350600101611de7565b505f5b6004811015611e9957611e528160036127c5565b611e5d9060086127de565b505f82611e6b836002612809565b81518110611e7b57611e7b6127f5565b60200101906001600160f81b03191690815f1a905350600101611e3e565b505f5b6020811015611ef65784518160208110611eb857611eb86127f5565b1a60f81b82611ec8836006612809565b81518110611ed857611ed86127f5565b60200101906001600160f81b03191690815f1a905350600101611e9c565b505f5b6020811015611f565784602001518160208110611f1857611f186127f5565b1a60f81b82611f28836026612809565b81518110611f3857611f386127f5565b60200101906001600160f81b03191690815f1a905350600101611ef9565b505f5b6008811015611fca57611f6d8160076127c5565b611f789060086127de565b60ff1685604001516001600160401b0316901c60f81b82826046611f9c9190612809565b81518110611fac57611fac6127f5565b60200101906001600160f81b03191690815f1a905350600101611f59565b505f5b60308110156120355784608001518181518110611fec57611fec6127f5565b01602001516001600160f81b0319168261200783604e612809565b81518110612017576120176127f5565b60200101906001600160f81b03191690815f1a905350600101611fcd565b505f5b60088110156120a75761204c8160076127c5565b6120579060086127de565b60608601516001600160401b0390811691161c60f81b8261207983607e612809565b81518110612089576120896127f5565b60200101906001600160f81b03191690815f1a905350600101612038565b506002816040516120b89190612a75565b602060405180830381855afa1580156120d3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906120f69190612522565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103b857604051631afcd79f60e31b815260040160405180910390fd5b612176612125565b61217e6121a0565b6121866121b0565b6103c3816121b8565b612197612125565b6103c381612224565b6121a8612125565b6103b861222c565b6103b8612125565b6121c0612125565b80355f80516020612ab183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561220a6060830160408401612a90565b600291909101805460ff191660ff90921691909117905550565b610909612125565b6120ff612125565b5080546122409061265c565b5f825580601f1061224f575050565b601f0160209004905f5260205f20908101906103c391905b8082111561227a575f8155600101612267565b5090565b5f6020828403121561228e575f80fd5b5035919050565b80356001600160401b03811681146122ab575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156122e6576122e66122b0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612314576123146122b0565b604052919050565b5f6001600160401b03821115612334576123346122b0565b50601f01601f191660200190565b5f805f8060808587031215612355575f80fd5b61235e85612295565b93506020850135925061237360408601612295565b915060608501356001600160401b0381111561238d575f80fd5b8501601f8101871361239d575f80fd5b80356123b06123ab8261231c565b6122ec565b8181528860208385010111156123c4575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146122ab575f80fd5b5f60208284031215612408575f80fd5b612411826123e5565b9392505050565b6001600160a01b03811681146103c3575f80fd5b5f80828403608081121561243e575f80fd5b606081121561244b575f80fd5b50829150606083013561245d81612418565b809150509250929050565b5f60208284031215612478575f80fd5b813561241181612418565b80151581146103c3575f80fd5b5f80604083850312156124a1575f80fd5b6124aa836123e5565b9150602083013561245d81612483565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156124e85781810151838201526020016124d0565b50505f910152565b602081525f825180602084015261250e8160408501602087016124ce565b601f01601f19169190910160400192915050565b5f60208284031215612532575f80fd5b5051919050565b80516122ab81612483565b5f8060408385031215612555575f80fd5b82516001600160401b038082111561256b575f80fd5b908401906060828703121561257e575f80fd5b6125866122c4565b8251815260208084015161259981612418565b828201526040840151838111156125ae575f80fd5b80850194505087601f8501126125c2575f80fd5b835192506125d26123ab8461231c565b83815288828587010111156125e5575f80fd5b6125f4848383018488016124ce565b80604084015250819550612609818801612539565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061267057607f821691505b60208210810361268e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546126ed8161265c565b806020870152604060018084165f811461270e576001811461272a57612757565b60ff19851660408a0152604084151560051b8a01019550612757565b895f5260205f205f5b8581101561274e5781548b8201860152908301908801612733565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b818103818111156127d8576127d86127b1565b92915050565b80820281158282048414176127d8576127d86127b1565b634e487b7160e01b5f52603260045260245ffd5b808201808211156127d8576127d86127b1565b601f8211156107ee57805f5260205f20601f840160051c810160208510156128415750805b601f840160051c820191505b81811015610380575f815560010161284d565b81516001600160401b03811115612879576128796122b0565b61288d81612887845461265c565b8461281c565b602080601f8311600181146128c0575f84156128a95750858301515b5f19600386901b1c1916600185901b178555612917565b5f85815260208120601f198616915b828110156128ee578886015182559484019460019091019084016128cf565b508582101561290b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612a1257612a126127b1565b5092915050565b6001600160401b03818116838216028082169190828114612a3c57612a3c6127b1565b505092915050565b5f6001600160401b0380841680612a6957634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a868184602087016124ce565b9190910192915050565b5f60208284031215612aa0575f80fd5b813560ff81168114612411575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612d74380380612d7483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c278061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b836600461239c565b6101b1565b005b6100d26100cd366004612460565b6103b5565b6040519081526020015b60405180910390f35b6100bd6103d5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f36600461239c565b6103e8565b6100bd610152366004612516565b6103f4565b6101196005600160991b0181565b6100bd61017336600461239c565b6105ad565b6100bd61018636600461254a565b6106c1565b6100bd610199366004612586565b6107cf565b6100bd6101ac3660046125ae565b610809565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040808220815160e0810190925280545f80516020612bfb83398151915293929190829060ff166005811115610211576102116125d8565b6005811115610222576102226125d8565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916102ac906125ec565b90501180156102cd57506003815160058111156102cb576102cb6125d8565b145b6103365760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161036f9190600401612624565b6020604051808303815f875af115801561038b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103af91906126ae565b50505050565b5f6103be610bdc565b6103ca84868585610c37565b90505b949350505050565b6103dd610bdc565b6103e65f61107e565b565b6103f1816110ee565b50565b5f80516020612bfb8339815191525f61040c8361144d565b90505f8061041d83604001516115e8565b915091508061047f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161032d565b5f82815260058501602052604081208054610499906125ec565b90501180156104cb575060015f83815260078601602052604090205460ff1660058111156104c9576104c96125d8565b145b6104e75760405162461bcd60e51b815260040161032d906126c5565b5f82815260058501602052604081206104ff91612352565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612bfb8339815191529291906105f5906125ec565b9050118015610627575060015f83815260078301602052604090205460ff166005811115610625576106256125d8565b145b6106435760405162461bcd60e51b815260040161032d906126c5565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161067c9190600401612624565b6020604051808303815f875af1158015610698573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106bc91906126ae565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107055750825b90505f826001600160401b031660011480156107205750303b155b90508115801561072e575080155b1561074c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561077657845460ff60401b1916600160401b1785555b6107808787611789565b83156107c657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6107d7610bdc565b6001600160a01b03811661080057604051631e4fbdf760e01b81525f600482015260240161032d565b6103f18161107e565b5f5f80516020612bfb8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610864573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261088b9190810190612739565b91509150806108ac5760405162461bcd60e51b815260040161032d9061280b565b5f8415610930575f6108c184604001516117a7565b919350909150506001600160401b0381161561092a5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161032d565b506109a6565b5f61093e84604001516115e8565b909250905080156109a45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161032d565b505b5f818152600785016020526040808220815160e081019092528054829060ff1660058111156109d7576109d76125d8565b60058111156109e8576109e86125d8565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610a795760405162461bcd60e51b815260040161032d90612851565b5f600382516005811115610a8f57610a8f6125d8565b1480610aad5750600282516005811115610aab57610aab6125d8565b145b15610ad057506020808201515f9081526008870190915260408120556004610ad4565b5060055b5f83815260078701602052604090208251815484929190829060ff19166001836005811115610b0557610b056125d8565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b33610c0e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103e65760405163118cdaa760e01b815233600482015260240161032d565b5f610c406119e2565b5f80516020612bfb833981519152426001600160401b038516118015610c7a57506001600160401b038416610c78426202a3006128b1565b115b610cdc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161032d565b85610d335760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161032d565b5f86815260088201602052604090205415610da15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161032d565b8251603014610e085760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161032d565b610e1185611a2c565b5f80610e586040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611bcd565b5f82815260058601602052604090209193509150610e768282612915565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610ea39085906004016129d4565b6020604051808303815f875af1158015610ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee391906126ae565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115610f5c57610f5c6125d8565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561100583611f72565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103cd60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040808220815160e0810190925280545f80516020612bfb83398151915293929190829060ff16600581111561114e5761114e6125d8565b600581111561115f5761115f6125d8565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156111d9576111d96125d8565b146112355760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161032d565b60408101516001600160a01b0316336001600160a01b03161461126a5760405162461bcd60e51b815260040161032d90612851565b6112778160800151611a2c565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156112bb576112bb6125d8565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61136f8461136981611f72565b5f612026565b5f858152600685016020526040902090915061138b8282612915565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113b89085906004016129d4565b6020604051808303815f875af11580156113d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f891906126ae565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612bfb8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156114c2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114e99190810190612739565b915091508061150a5760405162461bcd60e51b815260040161032d9061280b565b825482511461156d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161032d565b60208201516001600160a01b0316156115e05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161032d565b509392505050565b5f80825160271461160b5760405162461bcd60e51b815260040161032d90612a06565b5f805b600281101561165a57611622816001612a4f565b61162d906008612a62565b61ffff1685828151811061164357611643612a79565b016020015160f81c901b919091179060010161160e565b5061ffff81161561167d5760405162461bcd60e51b815260040161032d90612a8d565b5f805b60048110156116d857611694816003612a4f565b61169f906008612a62565b63ffffffff16866116b18360026128b1565b815181106116c1576116c1612a79565b016020015160f81c901b9190911790600101611680565b5063ffffffff81166002146116ff5760405162461bcd60e51b815260040161032d90612ad0565b5f805b60208110156117545761171681601f612a4f565b611721906008612a62565b8761172d8360066128b1565b8151811061173d5761173d612a79565b016020015160f81c901b9190911790600101611702565b505f8660268151811061176957611769612a79565b016020015191976001600160f81b03199092161515965090945050505050565b611791612243565b61179a8261228c565b6117a3816122ad565b5050565b5f805f83516036146117cb5760405162461bcd60e51b815260040161032d90612a06565b5f805b600281101561181a576117e2816001612a4f565b6117ed906008612a62565b61ffff1686828151811061180357611803612a79565b016020015160f81c901b91909117906001016117ce565b5061ffff81161561183d5760405162461bcd60e51b815260040161032d90612a8d565b5f805b600481101561189857611854816003612a4f565b61185f906008612a62565b63ffffffff16876118718360026128b1565b8151811061188157611881612a79565b016020015160f81c901b9190911790600101611840565b5063ffffffff81166001146118bf5760405162461bcd60e51b815260040161032d90612ad0565b5f805b6020811015611914576118d681601f612a4f565b6118e1906008612a62565b886118ed8360066128b1565b815181106118fd576118fd612a79565b016020015160f81c901b91909117906001016118c2565b505f805b60088110156119735761192c816007612a4f565b611937906008612a62565b6001600160401b03168961194c8360266128b1565b8151811061195c5761195c612a79565b016020015160f81c901b9190911790600101611918565b505f805b60088110156119d25761198b816007612a4f565b611996906008612a62565b6001600160401b03168a6119ab83602e6128b1565b815181106119bb576119bb612a79565b016020015160f81c901b9190911790600101611977565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a2657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612bfb8339815191529060ff165f03611a6a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611ab29083612a4f565b10611ace576001600160401b0384166040830152808252611aed565b8382604001818151611ae09190612b17565b6001600160401b03169052505b5f826020015183604001516064611b049190612b3e565b611b0e9190612b69565b600285015490915060ff9081169082161115611b895760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161032d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c375760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161032d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611cae57611c6e816001612a4f565b611c79906008612a62565b5081515f90839083908110611c9057611c90612a79565b60200101906001600160f81b03191690815f1a905350600101611c5a565b505f5b6004811015611d0c57611cc5816003612a4f565b611cd0906008612a62565b505f82611cde8360026128b1565b81518110611cee57611cee612a79565b60200101906001600160f81b03191690815f1a905350600101611cb1565b505f5b6020811015611d695784518160208110611d2b57611d2b612a79565b1a60f81b82611d3b8360066128b1565b81518110611d4b57611d4b612a79565b60200101906001600160f81b03191690815f1a905350600101611d0f565b505f5b6020811015611dc95784602001518160208110611d8b57611d8b612a79565b1a60f81b82611d9b8360266128b1565b81518110611dab57611dab612a79565b60200101906001600160f81b03191690815f1a905350600101611d6c565b505f5b6008811015611e3d57611de0816007612a4f565b611deb906008612a62565b60ff1685604001516001600160401b0316901c60f81b82826046611e0f91906128b1565b81518110611e1f57611e1f612a79565b60200101906001600160f81b03191690815f1a905350600101611dcc565b505f5b6030811015611ea85784608001518181518110611e5f57611e5f612a79565b01602001516001600160f81b03191682611e7a83604e6128b1565b81518110611e8a57611e8a612a79565b60200101906001600160f81b03191690815f1a905350600101611e40565b505f5b6008811015611f1a57611ebf816007612a4f565b611eca906008612a62565b60608601516001600160401b0390811691161c60f81b82611eec83607e6128b1565b81518110611efc57611efc612a79565b60200101906001600160f81b03191690815f1a905350600101611eab565b50600281604051611f2b9190612b9a565b602060405180830381855afa158015611f46573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f6991906126ae565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060020180545f80516020612bfb83398151915291600160a01b9091046001600160401b03169081906014611fd183612bb5565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561209f5761205f816001612a4f565b61206a906008612a62565b5081515f9083908390811061208157612081612a79565b60200101906001600160f81b03191690815f1a90535060010161204b565b505f5b6004811015612102576120b6816003612a4f565b6120c1906008612a62565b6001901c60f81b826120d48360026128b1565b815181106120e4576120e4612a79565b60200101906001600160f81b03191690815f1a9053506001016120a2565b505f5b60208110156121645761211981601f612a4f565b612124906008612a62565b86901c60f81b826121368360066128b1565b8151811061214657612146612a79565b60200101906001600160f81b03191690815f1a905350600101612105565b505f5b60088110156121cf5761217b816007612a4f565b612186906008612a62565b6001600160401b038616901c60f81b826121a18360266128b1565b815181106121b1576121b1612a79565b60200101906001600160f81b03191690815f1a905350600101612167565b505f5b600881101561223a576121e6816007612a4f565b6121f1906008612a62565b6001600160401b038516901c60f81b8261220c83602e6128b1565b8151811061221c5761221c612a79565b60200101906001600160f81b03191690815f1a9053506001016121d2565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103e657604051631afcd79f60e31b815260040160405180910390fd5b612294612243565b61229c6122be565b6122a46122ce565b6103f1816122d6565b6122b5612243565b6103f181612342565b6122c6612243565b6103e661234a565b6103e6612243565b6122de612243565b80355f80516020612bfb83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123286060830160408401612bda565b600291909101805460ff191660ff90921691909117905550565b6107d7612243565b612000612243565b50805461235e906125ec565b5f825580601f1061236d575050565b601f0160209004905f5260205f20908101906103f191905b80821115612398575f8155600101612385565b5090565b5f602082840312156123ac575f80fd5b5035919050565b80356001600160401b03811681146123c9575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612404576124046123ce565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612432576124326123ce565b604052919050565b5f6001600160401b03821115612452576124526123ce565b50601f01601f191660200190565b5f805f8060808587031215612473575f80fd5b61247c856123b3565b935060208501359250612491604086016123b3565b915060608501356001600160401b038111156124ab575f80fd5b8501601f810187136124bb575f80fd5b80356124ce6124c98261243a565b61240a565b8181528860208385010111156124e2575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146123c9575f80fd5b5f60208284031215612526575f80fd5b61252f82612503565b9392505050565b6001600160a01b03811681146103f1575f80fd5b5f80828403608081121561255c575f80fd5b6060811215612569575f80fd5b50829150606083013561257b81612536565b809150509250929050565b5f60208284031215612596575f80fd5b813561252f81612536565b80151581146103f1575f80fd5b5f80604083850312156125bf575f80fd5b6125c883612503565b9150602083013561257b816125a1565b634e487b7160e01b5f52602160045260245ffd5b600181811c9082168061260057607f821691505b60208210810361261e57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454612636816125ec565b806020870152604060018084165f81146126575760018114612673576126a0565b60ff19851660408a0152604084151560051b8a010195506126a0565b895f5260205f205f5b858110156126975781548b820186015290830190880161267c565b8a016040019650505b509398975050505050505050565b5f602082840312156126be575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f5b8381101561272657818101518382015260200161270e565b50505f910152565b80516123c9816125a1565b5f806040838503121561274a575f80fd5b82516001600160401b0380821115612760575f80fd5b9084019060608287031215612773575f80fd5b61277b6123e2565b8251815260208084015161278e81612536565b828201526040840151838111156127a3575f80fd5b80850194505087601f8501126127b7575f80fd5b835192506127c76124c98461243a565b83815288828587010111156127da575f80fd5b6127e98483830184880161270c565b806040840152508195506127fe81880161272e565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156128c4576128c461289d565b92915050565b601f8211156106bc57805f5260205f20601f840160051c810160208510156128ef5750805b601f840160051c820191505b8181101561290e575f81556001016128fb565b5050505050565b81516001600160401b0381111561292e5761292e6123ce565b6129428161293c84546125ec565b846128ca565b602080601f831160018114612975575f841561295e5750858301515b5f19600386901b1c1916600185901b1785556129cc565b5f85815260208120601f198616915b828110156129a357888601518255948401946001909101908401612984565b50858210156129c057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526129f281604085016020870161270c565b601f01601f19169190910160400192915050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156128c4576128c461289d565b80820281158282048414176128c4576128c461289d565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612b3757612b3761289d565b5092915050565b6001600160401b03818116838216028082169190828114612b6157612b6161289d565b505092915050565b5f6001600160401b0380841680612b8e57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612bab81846020870161270c565b9190910192915050565b5f6001600160401b03808316818103612bd057612bd061289d565b6001019392505050565b5f60208284031215612bea575f80fd5b813560ff8116811461252f575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. From a27e9db6457b83067b7788ab2a998f2a52ddba5c Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 16:48:50 -0500 Subject: [PATCH 140/545] cleanup, format, comments --- .../staking/ERC20TokenStakingManager.sol | 20 +++++- .../staking/NativeTokenStakingManager.sol | 5 +- contracts/staking/PoSValidatorManager.sol | 28 +++++--- contracts/staking/ValidatorManager.sol | 2 + .../interfaces/IPoSValidatorManager.sol | 67 ++++++++++++++++++- .../staking/interfaces/IValidatorManager.sol | 20 +++++- .../tests/PoSValidatorManagerTests.t.sol | 16 +++-- 7 files changed, 136 insertions(+), 22 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 97d5ea8fc..3ef8121e4 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -77,6 +77,13 @@ contract ERC20TokenStakingManager is $._token = token; } + /** + * @notice Begins the validator registration process. Locks the configured ERC20 in the contract as the stake. + * @param stakeAmount The amount to be staked. + * @param nodeID The node ID of the validator being registered. + * @param registrationExpiry The time at which the registration is no longer valid on the P-Chain. + * @param blsPublicKey The BLS public key of the validator. + */ function initializeValidatorRegistration( uint256 stakeAmount, bytes32 nodeID, @@ -87,9 +94,16 @@ contract ERC20TokenStakingManager is return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); } - function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) external { - uint64 weight = _processStake(stakeAmount); - + /** + * @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. + */ + function initializeDelegatorRegistration( + bytes32 validationID, + uint256 delegationAmount + ) external { + uint64 weight = _processStake(delegationAmount); return _initializeDelegatorRegistration(validationID, _msgSender(), weight); } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index dfb32aa5e..c0965f924 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -54,10 +54,13 @@ contract NativeTokenStakingManager is bytes memory blsPublicKey ) external payable returns (bytes32) { uint64 weight = _processStake(msg.value); - return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); } + /** + * @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. + */ function initializeDelegatorRegistration(bytes32 validationID) external payable { uint64 weight = _processStake(msg.value); diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index bafde3793..77eb5c9ba 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -18,14 +18,21 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.PoSValidatorManager struct PoSValidatorManagerStorage { + /// @notice The minimum amount of stake required to be a validator. 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. uint64 _minimumStakeDuration; + /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; + /// @notice Maps the validationID to the uptime of the validator. mapping(bytes32 validationID => uint64) _uptimes; /// @notice Maps the validationID to a mapping of delegator address to delegator information. mapping(bytes32 => mapping(address => Delegator)) _delegatorStakes; + /// @notice Maps the validationID to a mapping of delegator address to pending register delegator messages. mapping(bytes32 => mapping(address => bytes)) _pendingRegisterDelegatorMessages; + /// @notice Maps the validationID to a mapping of delegator address to pending end delegator messages. mapping(bytes32 => mapping(address => bytes)) _pendingEndDelegatorMessages; } // solhint-enable private-vars-leading-underscore @@ -157,16 +164,15 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _checkAndUpdateChurnTracker(weight); + // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage( validationID, _getAndIncrementNonce(validationID), validator.weight + weight ); - $._pendingRegisterDelegatorMessages[validationID][delegator] = setValidatorWeightPayload; - - // Submit the message to the Warp precompile. bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); + // Store the delegator information $._delegatorStakes[validationID][delegator] = Delegator({ weight: weight, startedAt: uint64(block.timestamp), @@ -191,18 +197,19 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function completeDelegatorRegistration(uint32 messageIndex, address delegator) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce, uint64 weight) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - require( $._pendingRegisterDelegatorMessages[validationID][delegator].length > 0 && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingAdded, "PoSValidatorManager: Delegator registration not pending" ); - delete $._pendingRegisterDelegatorMessages[validationID][delegator]; + // Update the validator weight and delegator status Validator memory validator = _getValidator(validationID); require( $._delegatorStakes[validationID][delegator].weight + validator.weight == weight, @@ -217,6 +224,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validationID, delegator, $._delegatorStakes[validationID][delegator].weight, + weight, block.timestamp ); } @@ -237,13 +245,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _getValidator(validationID); require(validator.weight >= delegator.weight, "PoSValidatorManager: Invalid weight"); + // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage( validationID, _getAndIncrementNonce(validationID), validator.weight - delegator.weight ); - $._pendingEndDelegatorMessages[validationID][_msgSender()] = setValidatorWeightPayload; - bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); emit DelegatorRemovalInitialized(validationID, messageID, _msgSender(), block.timestamp); @@ -261,18 +268,19 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function completeEndDelegation(uint32 messageIndex, address delegator) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce, uint64 weight) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - require( $._pendingEndDelegatorMessages[validationID][delegator].length > 0 && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingRemoved, "PoSValidatorManager: Delegator removal not pending" ); - delete $._pendingEndDelegatorMessages[validationID][delegator]; + // Update the validator weight and delegator status Validator memory validator = _getValidator(validationID); require( validator.weight - $._delegatorStakes[validationID][delegator].weight == weight, @@ -283,6 +291,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validator.weight = weight; _setValidator(validationID, validator); - emit DelegationEnded(validationID, delegator); + emit DelegationEnded(validationID, delegator, weight); } } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 2b9356469..18df9e4dc 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -37,7 +37,9 @@ abstract contract ValidatorManager is bytes32 _pChainBlockchainID; /// @notice The subnetID associated with this validator manager. bytes32 _subnetID; + /// @notice The maximum churn rate allowed per hour. uint8 _maximumHourlyChurn; + /// @notice The churn tracker used to track the amount of stake added or removed in the past hour. ValidatorChurnPeriod _churnTracker; /// @notice Maps the validationID to the registration message such that the message can be re-sent if needed. mapping(bytes32 => bytes) _pendingRegisterValidationMessages; diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 3412c8b38..724bb73a7 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -33,6 +33,13 @@ interface IPoSValidatorManager is IValidatorManager { */ event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); + /** + * @notice Event emitted when a delegator registration is initiated + * @param validationID The ID of the validation period + * @param delegator The address of the delegator + * @param weight The weight of the delegator + * @param startTime The time at which the registration was initiated + */ event DelegatorAdded( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, @@ -41,10 +48,29 @@ interface IPoSValidatorManager is IValidatorManager { uint256 startTime ); + /** + * @notice Event emitted when a delegator registration is completed + * @param validationID The ID of the validation period + * @param delegator The address of the delegator + * @param weight The weight of the delegator + * @param validatorWeight The updated weight of the validator the delegator is delegating to + * @param startTime The time at which the registration was completed + */ event DelegatorRegistered( - bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime + bytes32 indexed validationID, + address indexed delegator, + uint256 weight, + uint256 validatorWeight, + uint256 startTime ); + /** + * @notice Event emitted when delegator removal is initiated + * @param validationID The ID of the validation period + * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain + * @param delegator The address of the delegator + * @param endTime The time at which the removal was initiated + */ event DelegatorRemovalInitialized( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, @@ -52,7 +78,15 @@ interface IPoSValidatorManager is IValidatorManager { uint256 endTime ); - event DelegationEnded(bytes32 indexed validationID, address indexed delegator); + /** + * @notice Event emitted when delegator removal is completed + * @param validationID The ID of the validation period + * @param delegator The address of the delegator + * @param validatorWeight The updated weight of the validator the delegator was delegating to + */ + event DelegationEnded( + bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight + ); /** * @notice Begins the process of ending an active validation period. The validation period must have been previously @@ -70,13 +104,42 @@ interface IPoSValidatorManager is IValidatorManager { uint32 messageIndex ) external; + /** + * @notice Resubmits a delegator registration message to be sent to the P-Chain. + * Only necessary if the original message can't be delivered due to validator churn. + * @param validationID The ID of the validation period being registered. + * @param delegator The address of the delegator being registered. + */ function resendDelegatorRegistration(bytes32 validationID, address delegator) external; + /** + * @notice Completes the delegator registration process by returning 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. + * @param messageIndex The index of the Warp message to be received providing the acknowledgement. + * @param delegator The address of the delegator being registered. + */ function completeDelegatorRegistration(uint32 messageIndex, address delegator) external; + /** + * @notice Begins the process of removing a delegator from a validation period. The delegator must have been previously + * registered with the given validationID. + * @param validationID The ID of the validation period being removed. + */ function initializeEndDelegation(bytes32 validationID) external; + /** + * @notice Resubmits a delegator end message to be sent to the P-Chain. + * Only necessary if the original message can't be delivered due to validator churn. + * @param validationID The ID of the validation period being ended. + * @param delegator The address of the delegator being removed. + */ function resendEndDelegation(bytes32 validationID, address delegator) external; + /** + * @notice Completes the process of ending a delegation by receiving an acknowledgement from the P-Chain. + * After this function is called, the validator's weight is updated in the contract state. + * @param messageIndex The index of the Warp message to be received providing the acknowledgement. + * @param delegator The address of the delegator being removed. + */ function completeEndDelegation(uint32 messageIndex, address delegator) external; } diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 962c4176c..4dedda2fb 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -42,6 +42,12 @@ interface IValidatorManager { * Note that 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. + * @param nodeID The node ID of the validator being registered. + * @param registerValidationMessageID The ID of the Warp message that will be sent to the P-Chain to register the + * validation period. + * @param weight The weight of the validator being registered. + * @param registrationExpiry The time at which the registration is no longer valid on the P-Chain. */ event ValidationPeriodCreated( bytes32 indexed validationID, @@ -54,6 +60,9 @@ interface IValidatorManager { /** * @notice Emitted when the staking manager learns that the validation period has been successfully registered * on the P-Chain. Rewards for this validation period will begin accruing when this event is emitted. + * @param validationID The ID of the validation period being registered. + * @param weight The weight of the validator being registered. + * @param timestamp The time at which the validation period was registered with the contract. */ event ValidationPeriodRegistered( bytes32 indexed validationID, uint256 weight, uint256 timestamp @@ -63,6 +72,10 @@ 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. + * @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. + * @param endTime The time at which the removal was initiated. */ event ValidatorRemovalInitialized( bytes32 indexed validationID, @@ -75,12 +88,14 @@ interface IValidatorManager { * @notice Emitted when the stake for a validation period is unlocked and returned to the staker. * This is done by calling {completeEndValidation}, which provides proof from the P-Chain that the * validation period is not active and will never be active in the future. + * @param validationID The ID of the validation period being removed. */ event ValidationPeriodEnded(bytes32 indexed validationID); /** - * @notice Resubmits a validator registration message to be sent to P-Chain to the Warp precompile. + * @notice Resubmits a validator registration message to be sent to the P-Chain. * Only necessary if the original message can't be delivered due to validator churn. + * @param validationID The ID of the validation period being registered. */ function resendRegisterValidatorMessage(bytes32 validationID) external; @@ -92,8 +107,9 @@ interface IValidatorManager { function completeValidatorRegistration(uint32 messageIndex) external; /** - * @notice Resubmits a validator end message to be sent to P-Chain to the Warp precompile. + * @notice Resubmits a validator end message to be sent to the P-Chain. * Only necessary if the original message can't be delivered due to validator churn. + * @param validationID The ID of the validation period being ended. */ function resendEndValidatorMessage(bytes32 validationID) external; diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index ef17bb958..0e70cd23e 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -35,7 +35,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); event DelegatorRegistered( - bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime + bytes32 indexed validationID, + address indexed delegator, + uint256 weight, + uint256 validatorWeight, + uint256 startTime ); event DelegatorRemovalInitialized( @@ -45,7 +49,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 endTime ); - event DelegationEnded(bytes32 indexed validationID, address indexed delegator); + event DelegationEnded( + bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight + ); function testInitializeEndValidationWithUptimeProof() public { // TODO: implement @@ -243,7 +249,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, DEFAULT_DELEGATOR_ADDRESS); + emit DelegationEnded(validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_WEIGHT); posValidatorManager.completeEndDelegation(0, DEFAULT_DELEGATOR_ADDRESS); } @@ -319,7 +325,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(completeRegistrationTimestamp); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegatorRegistered(validationID, delegator, weight, completeRegistrationTimestamp); + emit DelegatorRegistered( + validationID, delegator, weight, weight + DEFAULT_WEIGHT, completeRegistrationTimestamp + ); posValidatorManager.completeDelegatorRegistration(0, delegator); return validationID; } From 16a64615cd0b001b3477d29b56558390be9403f8 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 17:03:10 -0500 Subject: [PATCH 141/545] lint, bindings --- .../ERC20TokenStakingManager.go | 28 +++++++++---------- .../NativeTokenStakingManager.go | 28 +++++++++---------- .../PoAValidatorManager.go | 28 +++++++++---------- contracts/staking/ValidatorManager.sol | 3 +- 4 files changed, 43 insertions(+), 44 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 39dc6ae44..59d9d20ce 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516135a43803806135a483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6134578061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c757806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612b95565b61019d565b005b6100b26100c2366004612bc0565b610395565b6100da6100d5366004612b95565b6104a3565b6040516001600160401b0390911681526020015b60405180910390f35b61010a610105366004612c18565b6104b9565b6040519081526020016100ee565b6100b2610126366004612c58565b6104d2565b61010a610139366004612d25565b61076a565b6100b261014c366004612dc1565b61078f565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610185366004612b95565b610aa8565b6100b2610198366004612dda565b610bbc565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061342b83398151915293929190829060ff1660058111156101fe576101fe612e04565b600581111561020f5761020f612e04565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612e04565b146103105760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f610321848361010001515f610ff0565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034e908490600401612e3a565b6020604051808303815f875af115801561036a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038e9190612e6c565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103d95750825b90505f826001600160401b031660011480156103f45750303b155b905081158015610402575080155b156104205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561044a57845460ff60401b1916600160401b1785555b610454878761120d565b831561049a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6104b364e8d4a5100083612eab565b92915050565b5f6104b36001600160401b03831664e8d4a51000612ebe565b5f821561075a576040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610522573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105499190810190612ee0565b91509150806105a65760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610307565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060d9190612e6c565b82511461066c5760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610307565b60208201516001600160a01b0316156106dd5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610307565b5f806106ec846040015161122b565b915091508188146107545760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610307565b93505050505b6107648482611403565b50505050565b5f80610775866117b7565b905061078385828686611877565b9150505b949350505050565b5f5f8051602061342b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156107ea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108119190810190612ee0565b91509150806108325760405162461bcd60e51b815260040161030790612fb2565b82548251146108955760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610307565b60208201516001600160a01b0316156109085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610307565b5f806109178460400151611cfb565b91509150806109795760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610307565b5f8281526005860160205260408120805461099390612ff8565b90501180156109c5575060015f83815260068701602052604090205460ff1660058111156109c3576109c3612e04565b145b6109e15760405162461bcd60e51b815260040161030790613030565b5f82815260058601602052604081206109f991612b4b565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061342b833981519152929190610af090612ff8565b9050118015610b22575060015f83815260068301602052604090205460ff166005811115610b2057610b20612e04565b145b610b3e5760405162461bcd60e51b815260040161030790613030565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610b779190600401613077565b6020604051808303815f875af1158015610b93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb79190612e6c565b505050565b5f5f8051602061342b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c17573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c3e9190810190612ee0565b9150915080610c5f5760405162461bcd60e51b815260040161030790612fb2565b5f8415610ce3575f610c748460400151611e9c565b919350909150506001600160401b03811615610cdd5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610307565b50610d59565b5f610cf18460400151611cfb565b90925090508015610d575760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610307565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610d8b57610d8b612e04565b6005811115610d9c57610d9c612e04565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610e4d5760405162461bcd60e51b815260040161030790613101565b5f600382516005811115610e6357610e63612e04565b1480610e815750600282516005811115610e7f57610e7f612e04565b145b15610ea457506020808201515f9081526007870190915260408120556004610ea8565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610ed957610ed9612e04565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110695761102981600161314d565b611034906008612ebe565b5081515f9083908390811061104b5761104b613160565b60200101906001600160f81b03191690815f1a905350600101611015565b505f5b60048110156110cc5761108081600361314d565b61108b906008612ebe565b6001901c60f81b8261109e836002613174565b815181106110ae576110ae613160565b60200101906001600160f81b03191690815f1a90535060010161106c565b505f5b602081101561112e576110e381601f61314d565b6110ee906008612ebe565b86901c60f81b82611100836006613174565b8151811061111057611110613160565b60200101906001600160f81b03191690815f1a9053506001016110cf565b505f5b60088110156111995761114581600761314d565b611150906008612ebe565b6001600160401b038616901c60f81b8261116b836026613174565b8151811061117b5761117b613160565b60200101906001600160f81b03191690815f1a905350600101611131565b505f5b6008811015611204576111b081600761314d565b6111bb906008612ebe565b6001600160401b038516901c60f81b826111d683602e613174565b815181106111e6576111e6613160565b60200101906001600160f81b03191690815f1a90535060010161119c565b50949350505050565b6112156120d7565b61121e82612122565b61122781612168565b5050565b5f808251602e1461124e5760405162461bcd60e51b815260040161030790613187565b5f805b600281101561129d5761126581600161314d565b611270906008612ebe565b61ffff1685828151811061128657611286613160565b016020015160f81c901b9190911790600101611251565b5061ffff8116156112c05760405162461bcd60e51b8152600401610307906131d0565b5f805b600481101561131b576112d781600361314d565b6112e2906008612ebe565b63ffffffff16866112f4836002613174565b8151811061130457611304613160565b016020015160f81c901b91909117906001016112c3565b5063ffffffff81166004146113425760405162461bcd60e51b815260040161030790613213565b5f805b60208110156113975761135981601f61314d565b611364906008612ebe565b87611370836006613174565b8151811061138057611380613160565b016020015160f81c901b9190911790600101611345565b505f805b60088110156113f6576113af81600761314d565b6113ba906008612ebe565b6001600160401b0316886113cf836026613174565b815181106113df576113df613160565b016020015160f81c901b919091179060010161139b565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061342b83398151915293929190829060ff16600581111561146457611464612e04565b600581111561147557611475612e04565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561150f5761150f612e04565b1461156b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610307565b60c08101516001600160a01b0316336001600160a01b0316146115a05760405162461bcd60e51b815260040161030790613101565b6115ad816040015161221c565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff191660018360058111156115f9576115f9612e04565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f906116ea90869083610ff0565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611719908590600401612e3a565b6020604051808303815f875af1158015611735573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117599190612e6c565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00816117e3846123bd565b90505f6117ef826104a3565b83549091506001600160401b0382161080159061181957508260010154816001600160401b031611155b6107875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610307565b5f6118806123f3565b5f8051602061342b833981519152426001600160401b0385161180156118ba57506001600160401b0384166118b8426202a300613174565b115b61191c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610307565b856119735760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610307565b5f868152600782016020526040902054156119e15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610307565b8251603014611a485760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610307565b611a518561221c565b5f80611a986040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061243d565b5f82815260058601602052604090209193509150611ab6828261329e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ae3908590600401612e3a565b6020604051808303815f875af1158015611aff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b239190612e6c565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611ba957611ba9612e04565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061078760017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611d1e5760405162461bcd60e51b815260040161030790613187565b5f805b6002811015611d6d57611d3581600161314d565b611d40906008612ebe565b61ffff16858281518110611d5657611d56613160565b016020015160f81c901b9190911790600101611d21565b5061ffff811615611d905760405162461bcd60e51b8152600401610307906131d0565b5f805b6004811015611deb57611da781600361314d565b611db2906008612ebe565b63ffffffff1686611dc4836002613174565b81518110611dd457611dd4613160565b016020015160f81c901b9190911790600101611d93565b5063ffffffff8116600214611e125760405162461bcd60e51b815260040161030790613213565b5f805b6020811015611e6757611e2981601f61314d565b611e34906008612ebe565b87611e40836006613174565b81518110611e5057611e50613160565b016020015160f81c901b9190911790600101611e15565b505f86602681518110611e7c57611e7c613160565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611ec05760405162461bcd60e51b815260040161030790613187565b5f805b6002811015611f0f57611ed781600161314d565b611ee2906008612ebe565b61ffff16868281518110611ef857611ef8613160565b016020015160f81c901b9190911790600101611ec3565b5061ffff811615611f325760405162461bcd60e51b8152600401610307906131d0565b5f805b6004811015611f8d57611f4981600361314d565b611f54906008612ebe565b63ffffffff1687611f66836002613174565b81518110611f7657611f76613160565b016020015160f81c901b9190911790600101611f35565b5063ffffffff8116600114611fb45760405162461bcd60e51b815260040161030790613213565b5f805b602081101561200957611fcb81601f61314d565b611fd6906008612ebe565b88611fe2836006613174565b81518110611ff257611ff2613160565b016020015160f81c901b9190911790600101611fb7565b505f805b60088110156120685761202181600761314d565b61202c906008612ebe565b6001600160401b031689612041836026613174565b8151811061205157612051613160565b016020015160f81c901b919091179060010161200d565b505f805b60088110156120c75761208081600761314d565b61208b906008612ebe565b6001600160401b03168a6120a083602e613174565b815181106120b0576120b0613160565b016020015160f81c901b919091179060010161206c565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661212057604051631afcd79f60e31b815260040160405180910390fd5b565b61212a6120d7565b61213381612808565b6121656060820135608083013561215060c0850160a08601612c18565b61216060e0860160c0870161335d565b612829565b50565b6121706120d7565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166121fc5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610307565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061342b8339815191529060ff165f0361225a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906122a2908361314d565b106122be576001600160401b03841660408301528082526122dd565b83826040018181516122d09190613378565b6001600160401b03169052505b5f8260200151836040015160646122f4919061339f565b6122fe91906133ca565b600285015490915060ff90811690821611156123795760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610307565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104b3827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690612897565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161243757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124a75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610307565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561251e576124de81600161314d565b6124e9906008612ebe565b5081515f9083908390811061250057612500613160565b60200101906001600160f81b03191690815f1a9053506001016124ca565b505f5b600481101561257c5761253581600361314d565b612540906008612ebe565b505f8261254e836002613174565b8151811061255e5761255e613160565b60200101906001600160f81b03191690815f1a905350600101612521565b505f5b60208110156125d9578451816020811061259b5761259b613160565b1a60f81b826125ab836006613174565b815181106125bb576125bb613160565b60200101906001600160f81b03191690815f1a90535060010161257f565b505f5b602081101561263957846020015181602081106125fb576125fb613160565b1a60f81b8261260b836026613174565b8151811061261b5761261b613160565b60200101906001600160f81b03191690815f1a9053506001016125dc565b505f5b60088110156126ad5761265081600761314d565b61265b906008612ebe565b60ff1685604001516001600160401b0316901c60f81b8282604661267f9190613174565b8151811061268f5761268f613160565b60200101906001600160f81b03191690815f1a90535060010161263c565b505f5b603081101561271857846080015181815181106126cf576126cf613160565b01602001516001600160f81b031916826126ea83604e613174565b815181106126fa576126fa613160565b60200101906001600160f81b03191690815f1a9053506001016126b0565b505f5b600881101561278a5761272f81600761314d565b61273a906008612ebe565b60608601516001600160401b0390811691161c60f81b8261275c83607e613174565b8151811061276c5761276c613160565b60200101906001600160f81b03191690815f1a90535060010161271b565b5060028160405161279b91906133ef565b602060405180830381855afa1580156127b6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127d99190612e6c565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6128106120d7565b6128186129f9565b612820612a09565b61216581612a11565b6128316120d7565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156128dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129019190612e6c565b90506129186001600160a01b038516333086612a7d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561295c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129809190612e6c565b90508181116129e65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610307565b6129f0828261314d565b95945050505050565b612a016120d7565b612120612ad7565b6121206120d7565b612a196120d7565b80355f8051602061342b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612a63606083016040840161340a565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610764908590612adf565b6127e26120d7565b5f8060205f8451602086015f885af180612afe576040513d5f823e3d81fd5b50505f513d91508115612b15578060011415612b22565b6001600160a01b0384163b155b1561076457604051635274afe760e01b81526001600160a01b0385166004820152602401610307565b508054612b5790612ff8565b5f825580601f10612b66575050565b601f0160209004905f5260205f209081019061216591905b80821115612b91575f8155600101612b7e565b5090565b5f60208284031215612ba5575f80fd5b5035919050565b6001600160a01b0381168114612165575f80fd5b5f80828403610100811215612bd3575f80fd5b60e0811215612be0575f80fd5b5082915060e0830135612bf281612bac565b809150509250929050565b80356001600160401b0381168114612c13575f80fd5b919050565b5f60208284031215612c28575f80fd5b612c3182612bfd565b9392505050565b8015158114612165575f80fd5b803563ffffffff81168114612c13575f80fd5b5f805f60608486031215612c6a575f80fd5b833592506020840135612c7c81612c38565b9150612c8a60408501612c45565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612cc957612cc9612c93565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612cf757612cf7612c93565b604052919050565b5f6001600160401b03821115612d1757612d17612c93565b50601f01601f191660200190565b5f805f8060808587031215612d38575f80fd5b8435935060208501359250612d4f60408601612bfd565b915060608501356001600160401b03811115612d69575f80fd5b8501601f81018713612d79575f80fd5b8035612d8c612d8782612cff565b612ccf565b818152886020838501011115612da0575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612dd1575f80fd5b612c3182612c45565b5f8060408385031215612deb575f80fd5b612df483612c45565b91506020830135612bf281612c38565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612e32578181015183820152602001612e1a565b50505f910152565b602081525f8251806020840152612e58816040850160208701612e18565b601f01601f19169190910160400192915050565b5f60208284031215612e7c575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612eb957612eb9612e83565b500490565b80820281158282048414176104b3576104b3612e97565b8051612c1381612c38565b5f8060408385031215612ef1575f80fd5b82516001600160401b0380821115612f07575f80fd5b9084019060608287031215612f1a575f80fd5b612f22612ca7565b82518152602080840151612f3581612bac565b82820152604084015183811115612f4a575f80fd5b80850194505087601f850112612f5e575f80fd5b83519250612f6e612d8784612cff565b8381528882858701011115612f81575f80fd5b612f9084838301848801612e18565b80604084015250819550612fa5818801612ed5565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061300c57607f821691505b60208210810361302a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461308981612ff8565b806020870152604060018084165f81146130aa57600181146130c6576130f3565b60ff19851660408a0152604084151560051b8a010195506130f3565b895f5260205f205f5b858110156130ea5781548b82018601529083019088016130cf565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104b3576104b3612e97565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104b3576104b3612e97565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610bb757805f5260205f20601f840160051c8101602085101561327f5750805b601f840160051c820191505b8181101561038e575f815560010161328b565b81516001600160401b038111156132b7576132b7612c93565b6132cb816132c58454612ff8565b8461325a565b602080601f8311600181146132fe575f84156132e75750858301515b5f19600386901b1c1916600185901b178555613355565b5f85815260208120601f198616915b8281101561332c5788860151825594840194600190910190840161330d565b508582101561334957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561336d575f80fd5b8135612c3181612bac565b6001600160401b0381811683821601908082111561339857613398612e97565b5092915050565b6001600160401b038181168382160280821691908281146133c2576133c2612e97565b505092915050565b5f6001600160401b03808416806133e3576133e3612e83565b92169190910492915050565b5f8251613400818460208701612e18565b9190910192915050565b5f6020828403121561341a575f80fd5b813560ff81168114612c31575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161329238038061329283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6131458061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806376f786211161006357806376f786211461012b578063872fda641461013e578063a3a65e4814610151578063b771b3bc14610164578063bee0a03f1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c7578063467ef06f146100f7578063620658561461010a575b5f80fd5b6100b26100ad366004612861565b61019d565b005b6100b26100c236600461288c565b610395565b6100da6100d5366004612861565b6104a3565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26101053660046128e1565b6104b9565b61011d610118366004612917565b610890565b6040519081526020016100ee565b6100b261013936600461293d565b6108a9565b61011d61014c366004612a0a565b610ae4565b6100b261015f3660046128e1565b610b09565b6101726005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610198366004612861565b610d98565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061311983398151915293929190829060ff1660058111156101fe576101fe612aa6565b600581111561020f5761020f612aa6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612aa6565b146103105760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f610321848361010001515f610eac565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034e908490600401612adc565b6020604051808303815f875af115801561036a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038e9190612b0e565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103d95750825b90505f826001600160401b031660011480156103f45750303b155b905081158015610402575080155b156104205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561044a57845460ff60401b1916600160401b1785555b61045487876110c9565b831561049a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6104b364e8d4a5100083612b4d565b92915050565b5f5f805160206131198339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610514573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261053b9190810190612b6b565b915091508061055c5760405162461bcd60e51b815260040161030790612c3d565b825482511461057d5760405162461bcd60e51b815260040161030790612c83565b60208201516001600160a01b0316156105a85760405162461bcd60e51b815260040161030790612ccc565b5f806105b784604001516110e7565b91509150801561061c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610307565b5f828152600686016020526040808220815161012081019092528054829060ff16600581111561064e5761064e612aa6565b600581111561065f5761065f612aa6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091505f90825160058111156106f8576106f8612aa6565b0361070557506004610709565b5060055b6020808301515f9081526007890190915260408120558181600581111561073257610732612aa6565b9081600581111561074557610745612aa6565b9052505f84815260068801602052604090208251815484929190829060ff1916600183600581111561077957610779612aa6565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555184907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b5f6104b36001600160401b03831664e8d4a51000612d1b565b5f805160206131198339815191525f8315610ada576040516306f8253560e41b815263ffffffff841660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610907573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261092e9190810190612b6b565b915091508061098b5760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610307565b83548251146109ec5760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610307565b60208201516001600160a01b031615610a5d5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610307565b5f80610a6c8460400151611288565b91509150818914610ad45760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610307565b93505050505b61038e8582611460565b5f80610aef86611859565b9050610afd85828686611919565b9150505b949350505050565b5f5f805160206131198339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b8b9190810190612b6b565b9150915080610bac5760405162461bcd60e51b815260040161030790612c3d565b8254825114610bcd5760405162461bcd60e51b815260040161030790612c83565b60208201516001600160a01b031615610bf85760405162461bcd60e51b815260040161030790612ccc565b5f80610c0784604001516110e7565b9150915080610c695760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610307565b5f82815260058601602052604081208054610c8390612d32565b9050118015610cb5575060015f83815260068701602052604090205460ff166005811115610cb357610cb3612aa6565b145b610cd15760405162461bcd60e51b815260040161030790612d6a565b5f8281526005860160205260408120610ce991612817565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613119833981519152929190610de090612d32565b9050118015610e12575060015f83815260068301602052604090205460ff166005811115610e1057610e10612aa6565b145b610e2e5760405162461bcd60e51b815260040161030790612d6a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e679190600401612db1565b6020604051808303815f875af1158015610e83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea79190612b0e565b505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610f2557610ee5816001612e3b565b610ef0906008612d1b565b5081515f90839083908110610f0757610f07612e4e565b60200101906001600160f81b03191690815f1a905350600101610ed1565b505f5b6004811015610f8857610f3c816003612e3b565b610f47906008612d1b565b6001901c60f81b82610f5a836002612e62565b81518110610f6a57610f6a612e4e565b60200101906001600160f81b03191690815f1a905350600101610f28565b505f5b6020811015610fea57610f9f81601f612e3b565b610faa906008612d1b565b86901c60f81b82610fbc836006612e62565b81518110610fcc57610fcc612e4e565b60200101906001600160f81b03191690815f1a905350600101610f8b565b505f5b600881101561105557611001816007612e3b565b61100c906008612d1b565b6001600160401b038616901c60f81b82611027836026612e62565b8151811061103757611037612e4e565b60200101906001600160f81b03191690815f1a905350600101610fed565b505f5b60088110156110c05761106c816007612e3b565b611077906008612d1b565b6001600160401b038516901c60f81b8261109283602e612e62565b815181106110a2576110a2612e4e565b60200101906001600160f81b03191690815f1a905350600101611058565b50949350505050565b6110d1611d9d565b6110da82611de8565b6110e381611e2e565b5050565b5f80825160271461110a5760405162461bcd60e51b815260040161030790612e75565b5f805b600281101561115957611121816001612e3b565b61112c906008612d1b565b61ffff1685828151811061114257611142612e4e565b016020015160f81c901b919091179060010161110d565b5061ffff81161561117c5760405162461bcd60e51b815260040161030790612ebe565b5f805b60048110156111d757611193816003612e3b565b61119e906008612d1b565b63ffffffff16866111b0836002612e62565b815181106111c0576111c0612e4e565b016020015160f81c901b919091179060010161117f565b5063ffffffff81166002146111fe5760405162461bcd60e51b815260040161030790612f01565b5f805b60208110156112535761121581601f612e3b565b611220906008612d1b565b8761122c836006612e62565b8151811061123c5761123c612e4e565b016020015160f81c901b9190911790600101611201565b505f8660268151811061126857611268612e4e565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146112ab5760405162461bcd60e51b815260040161030790612e75565b5f805b60028110156112fa576112c2816001612e3b565b6112cd906008612d1b565b61ffff168582815181106112e3576112e3612e4e565b016020015160f81c901b91909117906001016112ae565b5061ffff81161561131d5760405162461bcd60e51b815260040161030790612ebe565b5f805b600481101561137857611334816003612e3b565b61133f906008612d1b565b63ffffffff1686611351836002612e62565b8151811061136157611361612e4e565b016020015160f81c901b9190911790600101611320565b5063ffffffff811660041461139f5760405162461bcd60e51b815260040161030790612f01565b5f805b60208110156113f4576113b681601f612e3b565b6113c1906008612d1b565b876113cd836006612e62565b815181106113dd576113dd612e4e565b016020015160f81c901b91909117906001016113a2565b505f805b60088110156114535761140c816007612e3b565b611417906008612d1b565b6001600160401b03168861142c836026612e62565b8151811061143c5761143c612e4e565b016020015160f81c901b91909117906001016113f8565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061311983398151915293929190829060ff1660058111156114c1576114c1612aa6565b60058111156114d2576114d2612aa6565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561156c5761156c612aa6565b146115c85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610307565b60c08101516001600160a01b0316336001600160a01b0316146116425760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610307565b61164f8160400151611ee2565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff1916600183600581111561169b5761169b612aa6565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f9061178c90869083610eac565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906117bb908590600401612adc565b6020604051808303815f875af11580156117d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117fb9190612b0e565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008161188584612083565b90505f611891826104a3565b83549091506001600160401b038216108015906118bb57508260010154816001600160401b031611155b610b015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610307565b5f6119226120b9565b5f80516020613119833981519152426001600160401b03851611801561195c57506001600160401b03841661195a426202a300612e62565b115b6119be5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610307565b85611a155760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610307565b5f86815260078201602052604090205415611a835760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610307565b8251603014611aea5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610307565b611af385611ee2565b5f80611b3a6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612103565b5f82815260058601602052604090209193509150611b588282612f8c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b85908590600401612adc565b6020604051808303815f875af1158015611ba1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc59190612b0e565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611c4b57611c4b612aa6565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610b0160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611de657604051631afcd79f60e31b815260040160405180910390fd5b565b611df0611d9d565b611df9816124ce565b611e2b60608201356080830135611e1660c0850160a08601612917565b611e2660e0860160c0870161304b565b6124ef565b50565b611e36611d9d565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216611ec25760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610307565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206131198339815191529060ff165f03611f20575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611f689083612e3b565b10611f84576001600160401b0384166040830152808252611fa3565b8382604001818151611f969190613066565b6001600160401b03169052505b5f826020015183604001516064611fba919061308d565b611fc491906130b8565b600285015490915060ff908116908216111561203f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610307565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104b3827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061255d565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016120fd57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461216d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610307565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156121e4576121a4816001612e3b565b6121af906008612d1b565b5081515f908390839081106121c6576121c6612e4e565b60200101906001600160f81b03191690815f1a905350600101612190565b505f5b6004811015612242576121fb816003612e3b565b612206906008612d1b565b505f82612214836002612e62565b8151811061222457612224612e4e565b60200101906001600160f81b03191690815f1a9053506001016121e7565b505f5b602081101561229f578451816020811061226157612261612e4e565b1a60f81b82612271836006612e62565b8151811061228157612281612e4e565b60200101906001600160f81b03191690815f1a905350600101612245565b505f5b60208110156122ff57846020015181602081106122c1576122c1612e4e565b1a60f81b826122d1836026612e62565b815181106122e1576122e1612e4e565b60200101906001600160f81b03191690815f1a9053506001016122a2565b505f5b600881101561237357612316816007612e3b565b612321906008612d1b565b60ff1685604001516001600160401b0316901c60f81b828260466123459190612e62565b8151811061235557612355612e4e565b60200101906001600160f81b03191690815f1a905350600101612302565b505f5b60308110156123de578460800151818151811061239557612395612e4e565b01602001516001600160f81b031916826123b083604e612e62565b815181106123c0576123c0612e4e565b60200101906001600160f81b03191690815f1a905350600101612376565b505f5b6008811015612450576123f5816007612e3b565b612400906008612d1b565b60608601516001600160401b0390811691161c60f81b8261242283607e612e62565b8151811061243257612432612e4e565b60200101906001600160f81b03191690815f1a9053506001016123e1565b5060028160405161246191906130dd565b602060405180830381855afa15801561247c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061249f9190612b0e565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6124d6611d9d565b6124de6126bf565b6124e66126cf565b611e2b816126d7565b6124f7611d9d565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156125a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c79190612b0e565b90506125de6001600160a01b038516333086612743565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015612622573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126469190612b0e565b90508181116126ac5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610307565b6126b68282612e3b565b95945050505050565b6126c7611d9d565b611de66127a3565b611de6611d9d565b6126df611d9d565b80355f8051602061311983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561272960608301604084016130f8565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261279d9085906127ab565b50505050565b6124a8611d9d565b5f8060205f8451602086015f885af1806127ca576040513d5f823e3d81fd5b50505f513d915081156127e15780600114156127ee565b6001600160a01b0384163b155b1561279d57604051635274afe760e01b81526001600160a01b0385166004820152602401610307565b50805461282390612d32565b5f825580601f10612832575050565b601f0160209004905f5260205f2090810190611e2b91905b8082111561285d575f815560010161284a565b5090565b5f60208284031215612871575f80fd5b5035919050565b6001600160a01b0381168114611e2b575f80fd5b5f8082840361010081121561289f575f80fd5b60e08112156128ac575f80fd5b5082915060e08301356128be81612878565b809150509250929050565b803563ffffffff811681146128dc575f80fd5b919050565b5f602082840312156128f1575f80fd5b6128fa826128c9565b9392505050565b80356001600160401b03811681146128dc575f80fd5b5f60208284031215612927575f80fd5b6128fa82612901565b8015158114611e2b575f80fd5b5f805f6060848603121561294f575f80fd5b83359250602084013561296181612930565b915061296f604085016128c9565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129ae576129ae612978565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129dc576129dc612978565b604052919050565b5f6001600160401b038211156129fc576129fc612978565b50601f01601f191660200190565b5f805f8060808587031215612a1d575f80fd5b8435935060208501359250612a3460408601612901565b915060608501356001600160401b03811115612a4e575f80fd5b8501601f81018713612a5e575f80fd5b8035612a71612a6c826129e4565b6129b4565b818152886020838501011115612a85575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612ad4578181015183820152602001612abc565b50505f910152565b602081525f8251806020840152612afa816040850160208701612aba565b601f01601f19169190910160400192915050565b5f60208284031215612b1e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612b5b57612b5b612b25565b500490565b80516128dc81612930565b5f8060408385031215612b7c575f80fd5b82516001600160401b0380821115612b92575f80fd5b9084019060608287031215612ba5575f80fd5b612bad61298c565b82518152602080840151612bc081612878565b82820152604084015183811115612bd5575f80fd5b80850194505087601f850112612be9575f80fd5b83519250612bf9612a6c846129e4565b8381528882858701011115612c0c575f80fd5b612c1b84838301848801612aba565b80604084015250819550612c30818801612b60565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b80820281158282048414176104b3576104b3612b39565b600181811c90821680612d4657607f821691505b602082108103612d6457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612dc381612d32565b806020870152604060018084165f8114612de45760018114612e0057612e2d565b60ff19851660408a0152604084151560051b8a01019550612e2d565b895f5260205f205f5b85811015612e245781548b8201860152908301908801612e09565b8a016040019650505b509398975050505050505050565b818103818111156104b3576104b3612b39565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104b3576104b3612b39565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610ea757805f5260205f20601f840160051c81016020851015612f6d5750805b601f840160051c820191505b8181101561038e575f8155600101612f79565b81516001600160401b03811115612fa557612fa5612978565b612fb981612fb38454612d32565b84612f48565b602080601f831160018114612fec575f8415612fd55750858301515b5f19600386901b1c1916600185901b178555613043565b5f85815260208120601f198616915b8281101561301a57888601518255948401946001909101908401612ffb565b508582101561303757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561305b575f80fd5b81356128fa81612878565b6001600160401b0381811683821601908082111561308657613086612b39565b5092915050565b6001600160401b038181168382160280821691908281146130b0576130b0612b39565b505092915050565b5f6001600160401b03808416806130d1576130d1612b25565b92169190910492915050565b5f82516130ee818460208701612aba565b9190910192915050565b5f60208284031215613108575f80fd5b813560ff811681146128fa575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -311,25 +311,25 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WeightTo return _ERC20TokenStakingManager.Contract.WeightToValue(&_ERC20TokenStakingManager.CallOpts, weight) } -// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. // -// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndValidation", messageIndex, setWeightMessageType) +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndValidation", messageIndex) } -// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. // -// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndValidation(messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteEndValidation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, setWeightMessageType) +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndValidation(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. // -// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndValidation(messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteEndValidation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, setWeightMessageType) +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndValidation(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } // CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 777297b68..4fc1e9533 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516132ac3803806132ac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61315f8061014d5f395ff3fe60806040526004361061008e575f3560e01c8063a3a65e4811610057578063a3a65e481461015a578063b771b3bc14610179578063bee0a03f146101ab578063f40797d7146101ca578063fdf94a1a146101dd575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063620658561461010e57806376f786211461013b575b5f80fd5b34801561009d575f80fd5b506100b16100ac3660046128cd565b6101fc565b005b3480156100be575f80fd5b506100b16100cd3660046128e3565b610308565b3480156100dd575f80fd5b506100f16100ec3660046128e3565b610500565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b5061012d610128366004612915565b610516565b604051908152602001610105565b348015610146575f80fd5b506100b1610155366004612955565b61052f565b348015610165575f80fd5b506100b1610174366004612990565b6107c7565b348015610184575f80fd5b506101936005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101b6575f80fd5b506100b16101c53660046128e3565b610ae0565b61012d6101d8366004612a3b565b610bf4565b3480156101e8575f80fd5b506100b16101f7366004612acd565b610c16565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba8661104a565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061313383398151915293929190829060ff16600581111561036957610369612b02565b600581111561037a5761037a612b02565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561041157610411612b02565b1461047b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61048c848361010001515f61105e565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104b9908490600401612b38565b6020604051808303815f875af11580156104d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104f99190612b6a565b5050505050565b5f61051064e8d4a5100083612ba9565b92915050565b5f6105106001600160401b03831664e8d4a51000612bbc565b5f82156107b7576040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561057f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105a69190810190612bf2565b91509150806106035760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610472565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610646573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066a9190612b6a565b8251146106c95760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610472565b60208201516001600160a01b03161561073a5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610472565b5f80610749846040015161127b565b915091508188146107b15760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610472565b93505050505b6107c18482611453565b50505050565b5f5f805160206131338339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610822573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108499190810190612bf2565b915091508061086a5760405162461bcd60e51b815260040161047290612cc4565b82548251146108cd5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610472565b60208201516001600160a01b0316156109405760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610472565b5f8061094f8460400151611807565b91509150806109b15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610472565b5f828152600586016020526040812080546109cb90612d0a565b90501180156109fd575060015f83815260068701602052604090205460ff1660058111156109fb576109fb612b02565b145b610a195760405162461bcd60e51b815260040161047290612d3c565b5f8281526005860160205260408120610a3191612883565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613133833981519152929190610b2890612d0a565b9050118015610b5a575060015f83815260068301602052604090205460ff166005811115610b5857610b58612b02565b145b610b765760405162461bcd60e51b815260040161047290612d3c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610baf9190600401612d83565b6020604051808303815f875af1158015610bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bef9190612b6a565b505050565b5f80610bff346119a8565b9050610c0d85828686611a65565b95945050505050565b5f5f805160206131338339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c71573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c989190810190612bf2565b9150915080610cb95760405162461bcd60e51b815260040161047290612cc4565b5f8415610d3d575f610cce8460400151611ee9565b919350909150506001600160401b03811615610d375760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610472565b50610db3565b5f610d4b8460400151611807565b90925090508015610db15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610472565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610de557610de5612b02565b6005811115610df657610df6612b02565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610ea75760405162461bcd60e51b815260040161047290612e0d565b5f600382516005811115610ebd57610ebd612b02565b1480610edb5750600282516005811115610ed957610ed9612b02565b145b15610efe57506020808201515f9081526007870190915260408120556004610f02565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f3357610f33612b02565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b611052612124565b61105b8161216f565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110d757611097816001612e59565b6110a2906008612bbc565b5081515f908390839081106110b9576110b9612e6c565b60200101906001600160f81b03191690815f1a905350600101611083565b505f5b600481101561113a576110ee816003612e59565b6110f9906008612bbc565b6001901c60f81b8261110c836002612e80565b8151811061111c5761111c612e6c565b60200101906001600160f81b03191690815f1a9053506001016110da565b505f5b602081101561119c5761115181601f612e59565b61115c906008612bbc565b86901c60f81b8261116e836006612e80565b8151811061117e5761117e612e6c565b60200101906001600160f81b03191690815f1a90535060010161113d565b505f5b6008811015611207576111b3816007612e59565b6111be906008612bbc565b6001600160401b038616901c60f81b826111d9836026612e80565b815181106111e9576111e9612e6c565b60200101906001600160f81b03191690815f1a90535060010161119f565b505f5b60088110156112725761121e816007612e59565b611229906008612bbc565b6001600160401b038516901c60f81b8261124483602e612e80565b8151811061125457611254612e6c565b60200101906001600160f81b03191690815f1a90535060010161120a565b50949350505050565b5f808251602e1461129e5760405162461bcd60e51b815260040161047290612e93565b5f805b60028110156112ed576112b5816001612e59565b6112c0906008612bbc565b61ffff168582815181106112d6576112d6612e6c565b016020015160f81c901b91909117906001016112a1565b5061ffff8116156113105760405162461bcd60e51b815260040161047290612edc565b5f805b600481101561136b57611327816003612e59565b611332906008612bbc565b63ffffffff1686611344836002612e80565b8151811061135457611354612e6c565b016020015160f81c901b9190911790600101611313565b5063ffffffff81166004146113925760405162461bcd60e51b815260040161047290612f1f565b5f805b60208110156113e7576113a981601f612e59565b6113b4906008612bbc565b876113c0836006612e80565b815181106113d0576113d0612e6c565b016020015160f81c901b9190911790600101611395565b505f805b6008811015611446576113ff816007612e59565b61140a906008612bbc565b6001600160401b03168861141f836026612e80565b8151811061142f5761142f612e6c565b016020015160f81c901b91909117906001016113eb565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061313383398151915293929190829060ff1660058111156114b4576114b4612b02565b60058111156114c5576114c5612b02565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561155f5761155f612b02565b146115bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610472565b60c08101516001600160a01b0316336001600160a01b0316146115f05760405162461bcd60e51b815260040161047290612e0d565b6115fd81604001516121b2565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff1916600183600581111561164957611649612b02565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f9061173a9086908361105e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611769908590600401612b38565b6020604051808303815f875af1158015611785573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a99190612b6a565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f80825160271461182a5760405162461bcd60e51b815260040161047290612e93565b5f805b600281101561187957611841816001612e59565b61184c906008612bbc565b61ffff1685828151811061186257611862612e6c565b016020015160f81c901b919091179060010161182d565b5061ffff81161561189c5760405162461bcd60e51b815260040161047290612edc565b5f805b60048110156118f7576118b3816003612e59565b6118be906008612bbc565b63ffffffff16866118d0836002612e80565b815181106118e0576118e0612e6c565b016020015160f81c901b919091179060010161189f565b5063ffffffff811660021461191e5760405162461bcd60e51b815260040161047290612f1f565b5f805b60208110156119735761193581601f612e59565b611940906008612bbc565b8761194c836006612e80565b8151811061195c5761195c612e6c565b016020015160f81c901b9190911790600101611921565b505f8660268151811061198857611988612e6c565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0082826119d582610500565b83549091506001600160401b038216108015906119ff57508260010154816001600160401b031611155b611a5d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610472565b949350505050565b5f611a6e612353565b5f80516020613133833981519152426001600160401b038516118015611aa857506001600160401b038416611aa6426202a300612e80565b115b611b0a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610472565b85611b615760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610472565b5f86815260078201602052604090205415611bcf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610472565b8251603014611c365760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610472565b611c3f856121b2565b5f80611c866040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061239d565b5f82815260058601602052604090209193509150611ca48282612faa565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611cd1908590600401612b38565b6020604051808303815f875af1158015611ced573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d119190612b6a565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611d9757611d97612b02565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a5d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611f0d5760405162461bcd60e51b815260040161047290612e93565b5f805b6002811015611f5c57611f24816001612e59565b611f2f906008612bbc565b61ffff16868281518110611f4557611f45612e6c565b016020015160f81c901b9190911790600101611f10565b5061ffff811615611f7f5760405162461bcd60e51b815260040161047290612edc565b5f805b6004811015611fda57611f96816003612e59565b611fa1906008612bbc565b63ffffffff1687611fb3836002612e80565b81518110611fc357611fc3612e6c565b016020015160f81c901b9190911790600101611f82565b5063ffffffff81166001146120015760405162461bcd60e51b815260040161047290612f1f565b5f805b60208110156120565761201881601f612e59565b612023906008612bbc565b8861202f836006612e80565b8151811061203f5761203f612e6c565b016020015160f81c901b9190911790600101612004565b505f805b60088110156120b55761206e816007612e59565b612079906008612bbc565b6001600160401b03168961208e836026612e80565b8151811061209e5761209e612e6c565b016020015160f81c901b919091179060010161205a565b505f805b6008811015612114576120cd816007612e59565b6120d8906008612bbc565b6001600160401b03168a6120ed83602e612e80565b815181106120fd576120fd612e6c565b016020015160f81c901b91909117906001016120b9565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661216d57604051631afcd79f60e31b815260040160405180910390fd5b565b612177612124565b61218081612768565b61105b6060820135608083013561219d60c0850160a08601612915565b6121ad60e0860160c08701613065565b612789565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206131338339815191529060ff165f036121f0575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906122389083612e59565b10612254576001600160401b0384166040830152808252612273565b83826040018181516122669190613080565b6001600160401b03169052505b5f82602001518360400151606461228a91906130a7565b61229491906130d2565b600285015490915060ff908116908216111561230f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610472565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161239757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124075760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610472565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561247e5761243e816001612e59565b612449906008612bbc565b5081515f9083908390811061246057612460612e6c565b60200101906001600160f81b03191690815f1a90535060010161242a565b505f5b60048110156124dc57612495816003612e59565b6124a0906008612bbc565b505f826124ae836002612e80565b815181106124be576124be612e6c565b60200101906001600160f81b03191690815f1a905350600101612481565b505f5b602081101561253957845181602081106124fb576124fb612e6c565b1a60f81b8261250b836006612e80565b8151811061251b5761251b612e6c565b60200101906001600160f81b03191690815f1a9053506001016124df565b505f5b6020811015612599578460200151816020811061255b5761255b612e6c565b1a60f81b8261256b836026612e80565b8151811061257b5761257b612e6c565b60200101906001600160f81b03191690815f1a90535060010161253c565b505f5b600881101561260d576125b0816007612e59565b6125bb906008612bbc565b60ff1685604001516001600160401b0316901c60f81b828260466125df9190612e80565b815181106125ef576125ef612e6c565b60200101906001600160f81b03191690815f1a90535060010161259c565b505f5b6030811015612678578460800151818151811061262f5761262f612e6c565b01602001516001600160f81b0319168261264a83604e612e80565b8151811061265a5761265a612e6c565b60200101906001600160f81b03191690815f1a905350600101612610565b505f5b60088110156126ea5761268f816007612e59565b61269a906008612bbc565b60608601516001600160401b0390811691161c60f81b826126bc83607e612e80565b815181106126cc576126cc612e6c565b60200101906001600160f81b03191690815f1a90535060010161267b565b506002816040516126fb91906130f7565b602060405180830381855afa158015612716573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127399190612b6a565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612770612124565b6127786127f7565b612780612807565b61105b8161280f565b612791612124565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6127ff612124565b61216d61287b565b61216d612124565b612817612124565b80355f8051602061313383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556128616060830160408401613112565b600291909101805460ff191660ff90921691909117905550565b612742612124565b50805461288f90612d0a565b5f825580601f1061289e575050565b601f0160209004905f5260205f209081019061105b91905b808211156128c9575f81556001016128b6565b5090565b5f60e082840312156128dd575f80fd5b50919050565b5f602082840312156128f3575f80fd5b5035919050565b80356001600160401b0381168114612910575f80fd5b919050565b5f60208284031215612925575f80fd5b61292e826128fa565b9392505050565b801515811461105b575f80fd5b803563ffffffff81168114612910575f80fd5b5f805f60608486031215612967575f80fd5b83359250602084013561297981612935565b915061298760408501612942565b90509250925092565b5f602082840312156129a0575f80fd5b61292e82612942565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129df576129df6129a9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612a0d57612a0d6129a9565b604052919050565b5f6001600160401b03821115612a2d57612a2d6129a9565b50601f01601f191660200190565b5f805f60608486031215612a4d575f80fd5b83359250612a5d602085016128fa565b915060408401356001600160401b03811115612a77575f80fd5b8401601f81018613612a87575f80fd5b8035612a9a612a9582612a15565b6129e5565b818152876020838501011115612aae575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612ade575f80fd5b612ae783612942565b91506020830135612af781612935565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612b30578181015183820152602001612b18565b50505f910152565b602081525f8251806020840152612b56816040850160208701612b16565b601f01601f19169190910160400192915050565b5f60208284031215612b7a575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612bb757612bb7612b81565b500490565b808202811582820484141761051057610510612b95565b6001600160a01b038116811461105b575f80fd5b805161291081612935565b5f8060408385031215612c03575f80fd5b82516001600160401b0380821115612c19575f80fd5b9084019060608287031215612c2c575f80fd5b612c346129bd565b82518152602080840151612c4781612bd3565b82820152604084015183811115612c5c575f80fd5b80850194505087601f850112612c70575f80fd5b83519250612c80612a9584612a15565b8381528882858701011115612c93575f80fd5b612ca284838301848801612b16565b80604084015250819550612cb7818801612be7565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612d1e57607f821691505b6020821081036128dd57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612d9581612d0a565b806020870152604060018084165f8114612db65760018114612dd257612dff565b60ff19851660408a0152604084151560051b8a01019550612dff565b895f5260205f205f5b85811015612df65781548b8201860152908301908801612ddb565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561051057610510612b95565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561051057610510612b95565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610bef57805f5260205f20601f840160051c81016020851015612f8b5750805b601f840160051c820191505b818110156104f9575f8155600101612f97565b81516001600160401b03811115612fc357612fc36129a9565b612fd781612fd18454612d0a565b84612f66565b602080601f83116001811461300a575f8415612ff35750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b8281101561303857888601518255948401946001909101908401613019565b508582101561305557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215613075575f80fd5b813561292e81612bd3565b6001600160401b038181168382160190808211156130a0576130a0612b95565b5092915050565b6001600160401b038181168382160280821691908281146130ca576130ca612b95565b505092915050565b5f6001600160401b03808416806130eb576130eb612b81565b92169190910492915050565b5f8251613108818460208701612b16565b9190910192915050565b5f60208284031215613122575f80fd5b813560ff8116811461292e575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612f89380380612f8983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612e3c8061014d5f395ff3fe60806040526004361061008e575f3560e01c806376f786211161005757806376f786211461015a578063a3a65e4814610179578063b771b3bc14610198578063bee0a03f146101ca578063f40797d7146101e9575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063467ef06f1461010e578063620658561461012d575b5f80fd5b34801561009d575f80fd5b506100b16100ac366004612593565b6101fc565b005b3480156100be575f80fd5b506100b16100cd3660046125a9565b610308565b3480156100dd575f80fd5b506100f16100ec3660046125a9565b610500565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b506100b16101283660046125d8565b610516565b348015610138575f80fd5b5061014c61014736600461260e565b6108ed565b604051908152602001610105565b348015610165575f80fd5b506100b1610174366004612634565b610906565b348015610184575f80fd5b506100b16101933660046125d8565b610b41565b3480156101a3575f80fd5b506101b26005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101d5575f80fd5b506100b16101e43660046125a9565b610dd0565b61014c6101f7366004612701565b610ee4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba86610f06565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612e1083398151915293929190829060ff16600581111561036957610369612793565b600581111561037a5761037a612793565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561041157610411612793565b1461047b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61048c848361010001515f610f1a565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104b99084906004016127c9565b6020604051808303815f875af11580156104d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104f991906127fb565b5050505050565b5f61051064e8d4a510008361283a565b92915050565b5f5f80516020612e108339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610571573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610598919081019061286c565b91509150806105b95760405162461bcd60e51b81526004016104729061293e565b82548251146105da5760405162461bcd60e51b815260040161047290612984565b60208201516001600160a01b0316156106055760405162461bcd60e51b8152600401610472906129cd565b5f806106148460400151611137565b9150915080156106795760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610472565b5f828152600686016020526040808220815161012081019092528054829060ff1660058111156106ab576106ab612793565b60058111156106bc576106bc612793565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091505f908251600581111561075557610755612793565b0361076257506004610766565b5060055b6020808301515f9081526007890190915260408120558181600581111561078f5761078f612793565b908160058111156107a2576107a2612793565b9052505f84815260068801602052604090208251815484929190829060ff191660018360058111156107d6576107d6612793565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555184907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b5f6105106001600160401b03831664e8d4a51000612a1c565b5f80516020612e108339815191525f8315610b37576040516306f8253560e41b815263ffffffff841660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610964573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261098b919081019061286c565b91509150806109e85760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610472565b8354825114610a495760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610472565b60208201516001600160a01b031615610aba5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610472565b5f80610ac984604001516112d8565b91509150818914610b315760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610472565b93505050505b6104f985826114b0565b5f5f80516020612e108339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b9c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bc3919081019061286c565b9150915080610be45760405162461bcd60e51b81526004016104729061293e565b8254825114610c055760405162461bcd60e51b815260040161047290612984565b60208201516001600160a01b031615610c305760405162461bcd60e51b8152600401610472906129cd565b5f80610c3f8460400151611137565b9150915080610ca15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610472565b5f82815260058601602052604081208054610cbb90612a33565b9050118015610ced575060015f83815260068701602052604090205460ff166005811115610ceb57610ceb612793565b145b610d095760405162461bcd60e51b815260040161047290612a65565b5f8281526005860160205260408120610d2191612549565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612e10833981519152929190610e1890612a33565b9050118015610e4a575060015f83815260068301602052604090205460ff166005811115610e4857610e48612793565b145b610e665760405162461bcd60e51b815260040161047290612a65565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e9f9190600401612aac565b6020604051808303815f875af1158015610ebb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edf91906127fb565b505050565b5f80610eef346118a9565b9050610efd85828686611966565b95945050505050565b610f0e611dea565b610f1781611e35565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610f9357610f53816001612b36565b610f5e906008612a1c565b5081515f90839083908110610f7557610f75612b49565b60200101906001600160f81b03191690815f1a905350600101610f3f565b505f5b6004811015610ff657610faa816003612b36565b610fb5906008612a1c565b6001901c60f81b82610fc8836002612b5d565b81518110610fd857610fd8612b49565b60200101906001600160f81b03191690815f1a905350600101610f96565b505f5b60208110156110585761100d81601f612b36565b611018906008612a1c565b86901c60f81b8261102a836006612b5d565b8151811061103a5761103a612b49565b60200101906001600160f81b03191690815f1a905350600101610ff9565b505f5b60088110156110c35761106f816007612b36565b61107a906008612a1c565b6001600160401b038616901c60f81b82611095836026612b5d565b815181106110a5576110a5612b49565b60200101906001600160f81b03191690815f1a90535060010161105b565b505f5b600881101561112e576110da816007612b36565b6110e5906008612a1c565b6001600160401b038516901c60f81b8261110083602e612b5d565b8151811061111057611110612b49565b60200101906001600160f81b03191690815f1a9053506001016110c6565b50949350505050565b5f80825160271461115a5760405162461bcd60e51b815260040161047290612b70565b5f805b60028110156111a957611171816001612b36565b61117c906008612a1c565b61ffff1685828151811061119257611192612b49565b016020015160f81c901b919091179060010161115d565b5061ffff8116156111cc5760405162461bcd60e51b815260040161047290612bb9565b5f805b6004811015611227576111e3816003612b36565b6111ee906008612a1c565b63ffffffff1686611200836002612b5d565b8151811061121057611210612b49565b016020015160f81c901b91909117906001016111cf565b5063ffffffff811660021461124e5760405162461bcd60e51b815260040161047290612bfc565b5f805b60208110156112a35761126581601f612b36565b611270906008612a1c565b8761127c836006612b5d565b8151811061128c5761128c612b49565b016020015160f81c901b9190911790600101611251565b505f866026815181106112b8576112b8612b49565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146112fb5760405162461bcd60e51b815260040161047290612b70565b5f805b600281101561134a57611312816001612b36565b61131d906008612a1c565b61ffff1685828151811061133357611333612b49565b016020015160f81c901b91909117906001016112fe565b5061ffff81161561136d5760405162461bcd60e51b815260040161047290612bb9565b5f805b60048110156113c857611384816003612b36565b61138f906008612a1c565b63ffffffff16866113a1836002612b5d565b815181106113b1576113b1612b49565b016020015160f81c901b9190911790600101611370565b5063ffffffff81166004146113ef5760405162461bcd60e51b815260040161047290612bfc565b5f805b60208110156114445761140681601f612b36565b611411906008612a1c565b8761141d836006612b5d565b8151811061142d5761142d612b49565b016020015160f81c901b91909117906001016113f2565b505f805b60088110156114a35761145c816007612b36565b611467906008612a1c565b6001600160401b03168861147c836026612b5d565b8151811061148c5761148c612b49565b016020015160f81c901b9190911790600101611448565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612e1083398151915293929190829060ff16600581111561151157611511612793565b600581111561152257611522612793565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156115bc576115bc612793565b146116185760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610472565b60c08101516001600160a01b0316336001600160a01b0316146116925760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610472565b61169f8160400151611e78565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff191660018360058111156116eb576116eb612793565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f906117dc90869083610f1a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061180b9085906004016127c9565b6020604051808303815f875af1158015611827573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184b91906127fb565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0082826118d682610500565b83549091506001600160401b0382161080159061190057508260010154816001600160401b031611155b61195e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610472565b949350505050565b5f61196f612019565b5f80516020612e10833981519152426001600160401b0385161180156119a957506001600160401b0384166119a7426202a300612b5d565b115b611a0b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610472565b85611a625760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610472565b5f86815260078201602052604090205415611ad05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610472565b8251603014611b375760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610472565b611b4085611e78565b5f80611b876040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612063565b5f82815260058601602052604090209193509150611ba58282612c87565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611bd29085906004016127c9565b6020604051808303815f875af1158015611bee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c1291906127fb565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611c9857611c98612793565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061195e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611e3357604051631afcd79f60e31b815260040160405180910390fd5b565b611e3d611dea565b611e468161242e565b610f1760608201356080830135611e6360c0850160a0860161260e565b611e7360e0860160c08701612d42565b61244f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612e108339815191529060ff165f03611eb6575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611efe9083612b36565b10611f1a576001600160401b0384166040830152808252611f39565b8382604001818151611f2c9190612d5d565b6001600160401b03169052505b5f826020015183604001516064611f509190612d84565b611f5a9190612daf565b600285015490915060ff9081169082161115611fd55760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610472565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161205d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146120cd5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610472565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561214457612104816001612b36565b61210f906008612a1c565b5081515f9083908390811061212657612126612b49565b60200101906001600160f81b03191690815f1a9053506001016120f0565b505f5b60048110156121a25761215b816003612b36565b612166906008612a1c565b505f82612174836002612b5d565b8151811061218457612184612b49565b60200101906001600160f81b03191690815f1a905350600101612147565b505f5b60208110156121ff57845181602081106121c1576121c1612b49565b1a60f81b826121d1836006612b5d565b815181106121e1576121e1612b49565b60200101906001600160f81b03191690815f1a9053506001016121a5565b505f5b602081101561225f578460200151816020811061222157612221612b49565b1a60f81b82612231836026612b5d565b8151811061224157612241612b49565b60200101906001600160f81b03191690815f1a905350600101612202565b505f5b60088110156122d357612276816007612b36565b612281906008612a1c565b60ff1685604001516001600160401b0316901c60f81b828260466122a59190612b5d565b815181106122b5576122b5612b49565b60200101906001600160f81b03191690815f1a905350600101612262565b505f5b603081101561233e57846080015181815181106122f5576122f5612b49565b01602001516001600160f81b0319168261231083604e612b5d565b8151811061232057612320612b49565b60200101906001600160f81b03191690815f1a9053506001016122d6565b505f5b60088110156123b057612355816007612b36565b612360906008612a1c565b60608601516001600160401b0390811691161c60f81b8261238283607e612b5d565b8151811061239257612392612b49565b60200101906001600160f81b03191690815f1a905350600101612341565b506002816040516123c19190612dd4565b602060405180830381855afa1580156123dc573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906123ff91906127fb565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612436611dea565b61243e6124bd565b6124466124cd565b610f17816124d5565b612457611dea565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6124c5611dea565b611e33612541565b611e33611dea565b6124dd611dea565b80355f80516020612e1083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556125276060830160408401612def565b600291909101805460ff191660ff90921691909117905550565b612408611dea565b50805461255590612a33565b5f825580601f10612564575050565b601f0160209004905f5260205f2090810190610f1791905b8082111561258f575f815560010161257c565b5090565b5f60e082840312156125a3575f80fd5b50919050565b5f602082840312156125b9575f80fd5b5035919050565b803563ffffffff811681146125d3575f80fd5b919050565b5f602082840312156125e8575f80fd5b6125f1826125c0565b9392505050565b80356001600160401b03811681146125d3575f80fd5b5f6020828403121561261e575f80fd5b6125f1826125f8565b8015158114610f17575f80fd5b5f805f60608486031215612646575f80fd5b83359250602084013561265881612627565b9150612666604085016125c0565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156126a5576126a561266f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156126d3576126d361266f565b604052919050565b5f6001600160401b038211156126f3576126f361266f565b50601f01601f191660200190565b5f805f60608486031215612713575f80fd5b83359250612723602085016125f8565b915060408401356001600160401b0381111561273d575f80fd5b8401601f8101861361274d575f80fd5b803561276061275b826126db565b6126ab565b818152876020838501011115612774575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156127c15781810151838201526020016127a9565b50505f910152565b602081525f82518060208401526127e78160408501602087016127a7565b601f01601f19169190910160400192915050565b5f6020828403121561280b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261284857612848612812565b500490565b6001600160a01b0381168114610f17575f80fd5b80516125d381612627565b5f806040838503121561287d575f80fd5b82516001600160401b0380821115612893575f80fd5b90840190606082870312156128a6575f80fd5b6128ae612683565b825181526020808401516128c18161284d565b828201526040840151838111156128d6575f80fd5b80850194505087601f8501126128ea575f80fd5b835192506128fa61275b846126db565b838152888285870101111561290d575f80fd5b61291c848383018488016127a7565b80604084015250819550612931818801612861565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b808202811582820484141761051057610510612826565b600181811c90821680612a4757607f821691505b6020821081036125a357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612abe81612a33565b806020870152604060018084165f8114612adf5760018114612afb57612b28565b60ff19851660408a0152604084151560051b8a01019550612b28565b895f5260205f205f5b85811015612b1f5781548b8201860152908301908801612b04565b8a016040019650505b509398975050505050505050565b8181038181111561051057610510612826565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561051057610510612826565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610edf57805f5260205f20601f840160051c81016020851015612c685750805b601f840160051c820191505b818110156104f9575f8155600101612c74565b81516001600160401b03811115612ca057612ca061266f565b612cb481612cae8454612a33565b84612c43565b602080601f831160018114612ce7575f8415612cd05750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b82811015612d1557888601518255948401946001909101908401612cf6565b5085821015612d3257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612d52575f80fd5b81356125f18161284d565b6001600160401b03818116838216019080821115612d7d57612d7d612826565b5092915050565b6001600160401b03818116838216028082169190828114612da757612da7612826565b505092915050565b5f6001600160401b0380841680612dc857612dc8612812565b92169190910492915050565b5f8251612de58184602087016127a7565b9190910192915050565b5f60208284031215612dff575f80fd5b813560ff811681146125f1575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -311,25 +311,25 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) Weight return _NativeTokenStakingManager.Contract.WeightToValue(&_NativeTokenStakingManager.CallOpts, weight) } -// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. // -// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "completeEndValidation", messageIndex, setWeightMessageType) +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeEndValidation", messageIndex) } -// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. // -// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndValidation(messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteEndValidation(&_NativeTokenStakingManager.TransactOpts, messageIndex, setWeightMessageType) +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndValidation(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. // -// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndValidation(messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteEndValidation(&_NativeTokenStakingManager.TransactOpts, messageIndex, setWeightMessageType) +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndValidation(&_NativeTokenStakingManager.TransactOpts, messageIndex) } // CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 2a881915a..12093580c 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -38,8 +38,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612d67380380612d6783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c1a8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b83660046123bb565b6101b1565b005b6100d26100cd36600461247f565b6103a9565b6040519081526020015b60405180910390f35b6100bd6103c9565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f3660046123bb565b6103dc565b6100bd610152366004612535565b6103e9565b6101196005600160991b0181565b6100bd6101733660046123bb565b610702565b6100bd610186366004612569565b610816565b6100bd6101993660046125a5565b610924565b6100bd6101ac3660046125cd565b61095e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612bee83398151915293929190829060ff166005811115610212576102126125f7565b6005811115610223576102236125f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102ba576102ba6125f7565b146103245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f610335848361010001515f610d92565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061036290849060040161262d565b6020604051808303815f875af115801561037e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a2919061265f565b5050505050565b5f6103b2610faf565b6103be8486858561100a565b90505b949350505050565b6103d1610faf565b6103da5f61148e565b565b6103e6815f6114fe565b50565b5f5f80516020612bee8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610444573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261046b9190810190612681565b915091508061048c5760405162461bcd60e51b815260040161031b90612753565b82548251146104ef5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161031b565b60208201516001600160a01b0316156105625760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161031b565b5f8061057184604001516118b2565b91509150806105d35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161031b565b5f828152600586016020526040812080546105ed90612799565b905011801561061f575060015f83815260068701602052604090205460ff16600581111561061d5761061d6125f7565b145b61063b5760405162461bcd60e51b815260040161031b906127d1565b5f828152600586016020526040812061065391612371565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612bee83398151915292919061074a90612799565b905011801561077c575060015f83815260068301602052604090205460ff16600581111561077a5761077a6125f7565b145b6107985760405162461bcd60e51b815260040161031b906127d1565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107d19190600401612818565b6020604051808303815f875af11580156107ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610811919061265f565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561085a5750825b90505f826001600160401b031660011480156108755750303b155b905081158015610883575080155b156108a15760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108cb57845460ff60401b1916600160401b1785555b6108d58787611a53565b831561091b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61092c610faf565b6001600160a01b03811661095557604051631e4fbdf760e01b81525f600482015260240161031b565b6103e68161148e565b5f5f80516020612bee8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156109b9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109e09190810190612681565b9150915080610a015760405162461bcd60e51b815260040161031b90612753565b5f8415610a85575f610a168460400151611a71565b919350909150506001600160401b03811615610a7f5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161031b565b50610afb565b5f610a9384604001516118b2565b90925090508015610af95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161031b565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610b2d57610b2d6125f7565b6005811115610b3e57610b3e6125f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610bef5760405162461bcd60e51b815260040161031b906128a2565b5f600382516005811115610c0557610c056125f7565b1480610c235750600282516005811115610c2157610c216125f7565b145b15610c4657506020808201515f9081526007870190915260408120556004610c4a565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610c7b57610c7b6125f7565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610e0b57610dcb816001612902565b610dd690600861291b565b5081515f90839083908110610ded57610ded612932565b60200101906001600160f81b03191690815f1a905350600101610db7565b505f5b6004811015610e6e57610e22816003612902565b610e2d90600861291b565b6001901c60f81b82610e40836002612946565b81518110610e5057610e50612932565b60200101906001600160f81b03191690815f1a905350600101610e0e565b505f5b6020811015610ed057610e8581601f612902565b610e9090600861291b565b86901c60f81b82610ea2836006612946565b81518110610eb257610eb2612932565b60200101906001600160f81b03191690815f1a905350600101610e71565b505f5b6008811015610f3b57610ee7816007612902565b610ef290600861291b565b6001600160401b038616901c60f81b82610f0d836026612946565b81518110610f1d57610f1d612932565b60200101906001600160f81b03191690815f1a905350600101610ed3565b505f5b6008811015610fa657610f52816007612902565b610f5d90600861291b565b6001600160401b038516901c60f81b82610f7883602e612946565b81518110610f8857610f88612932565b60200101906001600160f81b03191690815f1a905350600101610f3e565b50949350505050565b33610fe17f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103da5760405163118cdaa760e01b815233600482015260240161031b565b5f611013611cac565b5f80516020612bee833981519152426001600160401b03851611801561104d57506001600160401b03841661104b426202a300612946565b115b6110af5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161031b565b856111065760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161031b565b5f868152600782016020526040902054156111745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161031b565b82516030146111db5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161031b565b6111e485611cf6565b5f8061122b6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611e97565b5f82815260058601602052604090209193509150611249828261299d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061127690859060040161262d565b6020604051808303815f875af1158015611292573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b6919061265f565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff1916600183600581111561133c5761133c6125f7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103c160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612bee83398151915293929190829060ff16600581111561155f5761155f6125f7565b6005811115611570576115706125f7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561160a5761160a6125f7565b146116665760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161031b565b60c08101516001600160a01b0316336001600160a01b03161461169b5760405162461bcd60e51b815260040161031b906128a2565b6116a88160400151611cf6565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff191660018360058111156116f4576116f46125f7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f906117e590869083610d92565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061181490859060040161262d565b6020604051808303815f875af1158015611830573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611854919061265f565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f8082516027146118d55760405162461bcd60e51b815260040161031b90612a5c565b5f805b6002811015611924576118ec816001612902565b6118f790600861291b565b61ffff1685828151811061190d5761190d612932565b016020015160f81c901b91909117906001016118d8565b5061ffff8116156119475760405162461bcd60e51b815260040161031b90612aa5565b5f805b60048110156119a25761195e816003612902565b61196990600861291b565b63ffffffff168661197b836002612946565b8151811061198b5761198b612932565b016020015160f81c901b919091179060010161194a565b5063ffffffff81166002146119c95760405162461bcd60e51b815260040161031b90612ae8565b5f805b6020811015611a1e576119e081601f612902565b6119eb90600861291b565b876119f7836006612946565b81518110611a0757611a07612932565b016020015160f81c901b91909117906001016119cc565b505f86602681518110611a3357611a33612932565b016020015191976001600160f81b03199092161515965090945050505050565b611a5b612262565b611a64826122ab565b611a6d816122cc565b5050565b5f805f8351603614611a955760405162461bcd60e51b815260040161031b90612a5c565b5f805b6002811015611ae457611aac816001612902565b611ab790600861291b565b61ffff16868281518110611acd57611acd612932565b016020015160f81c901b9190911790600101611a98565b5061ffff811615611b075760405162461bcd60e51b815260040161031b90612aa5565b5f805b6004811015611b6257611b1e816003612902565b611b2990600861291b565b63ffffffff1687611b3b836002612946565b81518110611b4b57611b4b612932565b016020015160f81c901b9190911790600101611b0a565b5063ffffffff8116600114611b895760405162461bcd60e51b815260040161031b90612ae8565b5f805b6020811015611bde57611ba081601f612902565b611bab90600861291b565b88611bb7836006612946565b81518110611bc757611bc7612932565b016020015160f81c901b9190911790600101611b8c565b505f805b6008811015611c3d57611bf6816007612902565b611c0190600861291b565b6001600160401b031689611c16836026612946565b81518110611c2657611c26612932565b016020015160f81c901b9190911790600101611be2565b505f805b6008811015611c9c57611c55816007612902565b611c6090600861291b565b6001600160401b03168a611c7583602e612946565b81518110611c8557611c85612932565b016020015160f81c901b9190911790600101611c41565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611cf057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612bee8339815191529060ff165f03611d34575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611d7c9083612902565b10611d98576001600160401b0384166040830152808252611db7565b8382604001818151611daa9190612b2f565b6001600160401b03169052505b5f826020015183604001516064611dce9190612b56565b611dd89190612b81565b600285015490915060ff9081169082161115611e535760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161031b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611f015760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161031b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611f7857611f38816001612902565b611f4390600861291b565b5081515f90839083908110611f5a57611f5a612932565b60200101906001600160f81b03191690815f1a905350600101611f24565b505f5b6004811015611fd657611f8f816003612902565b611f9a90600861291b565b505f82611fa8836002612946565b81518110611fb857611fb8612932565b60200101906001600160f81b03191690815f1a905350600101611f7b565b505f5b60208110156120335784518160208110611ff557611ff5612932565b1a60f81b82612005836006612946565b8151811061201557612015612932565b60200101906001600160f81b03191690815f1a905350600101611fd9565b505f5b6020811015612093578460200151816020811061205557612055612932565b1a60f81b82612065836026612946565b8151811061207557612075612932565b60200101906001600160f81b03191690815f1a905350600101612036565b505f5b6008811015612107576120aa816007612902565b6120b590600861291b565b60ff1685604001516001600160401b0316901c60f81b828260466120d99190612946565b815181106120e9576120e9612932565b60200101906001600160f81b03191690815f1a905350600101612096565b505f5b6030811015612172578460800151818151811061212957612129612932565b01602001516001600160f81b0319168261214483604e612946565b8151811061215457612154612932565b60200101906001600160f81b03191690815f1a90535060010161210a565b505f5b60088110156121e457612189816007612902565b61219490600861291b565b60608601516001600160401b0390811691161c60f81b826121b683607e612946565b815181106121c6576121c6612932565b60200101906001600160f81b03191690815f1a905350600101612175565b506002816040516121f59190612bb2565b602060405180830381855afa158015612210573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612233919061265f565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103da57604051631afcd79f60e31b815260040160405180910390fd5b6122b3612262565b6122bb6122dd565b6122c36122ed565b6103e6816122f5565b6122d4612262565b6103e681612361565b6122e5612262565b6103da612369565b6103da612262565b6122fd612262565b80355f80516020612bee83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123476060830160408401612bcd565b600291909101805460ff191660ff90921691909117905550565b61092c612262565b61223c612262565b50805461237d90612799565b5f825580601f1061238c575050565b601f0160209004905f5260205f20908101906103e691905b808211156123b7575f81556001016123a4565b5090565b5f602082840312156123cb575f80fd5b5035919050565b80356001600160401b03811681146123e8575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612423576124236123ed565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612451576124516123ed565b604052919050565b5f6001600160401b03821115612471576124716123ed565b50601f01601f191660200190565b5f805f8060808587031215612492575f80fd5b61249b856123d2565b9350602085013592506124b0604086016123d2565b915060608501356001600160401b038111156124ca575f80fd5b8501601f810187136124da575f80fd5b80356124ed6124e882612459565b612429565b818152886020838501011115612501575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146123e8575f80fd5b5f60208284031215612545575f80fd5b61254e82612522565b9392505050565b6001600160a01b03811681146103e6575f80fd5b5f80828403608081121561257b575f80fd5b6060811215612588575f80fd5b50829150606083013561259a81612555565b809150509250929050565b5f602082840312156125b5575f80fd5b813561254e81612555565b80151581146103e6575f80fd5b5f80604083850312156125de575f80fd5b6125e783612522565b9150602083013561259a816125c0565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561262557818101518382015260200161260d565b50505f910152565b602081525f825180602084015261264b81604085016020870161260b565b601f01601f19169190910160400192915050565b5f6020828403121561266f575f80fd5b5051919050565b80516123e8816125c0565b5f8060408385031215612692575f80fd5b82516001600160401b03808211156126a8575f80fd5b90840190606082870312156126bb575f80fd5b6126c3612401565b825181526020808401516126d681612555565b828201526040840151838111156126eb575f80fd5b80850194505087601f8501126126ff575f80fd5b8351925061270f6124e884612459565b8381528882858701011115612722575f80fd5b6127318483830184880161260b565b80604084015250819550612746818801612676565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c908216806127ad57607f821691505b6020821081036127cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461282a81612799565b806020870152604060018084165f811461284b576001811461286757612894565b60ff19851660408a0152604084151560051b8a01019550612894565b895f5260205f205f5b8581101561288b5781548b8201860152908301908801612870565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612915576129156128ee565b92915050565b8082028115828204841417612915576129156128ee565b634e487b7160e01b5f52603260045260245ffd5b80820180821115612915576129156128ee565b601f82111561081157805f5260205f20601f840160051c8101602085101561297e5750805b601f840160051c820191505b818110156103a2575f815560010161298a565b81516001600160401b038111156129b6576129b66123ed565b6129ca816129c48454612799565b84612959565b602080601f8311600181146129fd575f84156129e65750858301515b5f19600386901b1c1916600185901b178555612a54565b5f85815260208120601f198616915b82811015612a2b57888601518255948401946001909101908401612a0c565b5085821015612a4857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612b4f57612b4f6128ee565b5092915050565b6001600160401b03818116838216028082169190828114612b7957612b796128ee565b505092915050565b5f6001600160401b0380841680612ba657634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612bc381846020870161260b565b9190910192915050565b5f60208284031215612bdd575f80fd5b813560ff8116811461254e575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612a85380380612a8583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6129388061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c806397fb70d41161006e57806397fb70d414610144578063a3a65e4814610157578063b771b3bc1461016a578063bee0a03f14610178578063c151c0b91461018b578063f2fde38b1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063467ef06f146100e5578063715018a6146100f85780638da5cb5b14610100575b5f80fd5b6100bd6100b836600461219c565b6101b1565b005b6100d26100cd366004612260565b6103a9565b6040519081526020015b60405180910390f35b6100bd6100f3366004612303565b6103c9565b6100bd6107a0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61015236600461219c565b6107b3565b6100bd610165366004612303565b6107c0565b61012c6005600160991b0181565b6100bd61018636600461219c565b610a4f565b6100bd610199366004612341565b610b63565b6100bd6101ac36600461237d565b610c71565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061290c83398151915293929190829060ff16600581111561021257610212612398565b600581111561022357610223612398565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102ba576102ba612398565b146103245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f610335848361010001515f610cab565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103629084906004016123ce565b6020604051808303815f875af115801561037e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a29190612400565b5050505050565b5f6103b2610ec8565b6103be84868585610f23565b90505b949350505050565b5f5f8051602061290c8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610424573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261044b9190810190612426565b915091508061046c5760405162461bcd60e51b815260040161031b906124f8565b825482511461048d5760405162461bcd60e51b815260040161031b9061253e565b60208201516001600160a01b0316156104b85760405162461bcd60e51b815260040161031b90612587565b5f806104c784604001516113a7565b91509150801561052c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161031b565b5f828152600686016020526040808220815161012081019092528054829060ff16600581111561055e5761055e612398565b600581111561056f5761056f612398565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091505f908251600581111561060857610608612398565b0361061557506004610619565b5060055b6020808301515f9081526007890190915260408120558181600581111561064257610642612398565b9081600581111561065557610655612398565b9052505f84815260068801602052604090208251815484929190829060ff1916600183600581111561068957610689612398565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555184907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b6107a8610ec8565b6107b15f611606565b565b6107bd815f611676565b50565b5f5f8051602061290c8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561081b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108429190810190612426565b91509150806108635760405162461bcd60e51b815260040161031b906124f8565b82548251146108845760405162461bcd60e51b815260040161031b9061253e565b60208201516001600160a01b0316156108af5760405162461bcd60e51b815260040161031b90612587565b5f806108be84604001516113a7565b91509150806109205760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161031b565b5f8281526005860160205260408120805461093a906125d6565b905011801561096c575060015f83815260068701602052604090205460ff16600581111561096a5761096a612398565b145b6109885760405162461bcd60e51b815260040161031b9061260e565b5f82815260058601602052604081206109a091612152565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061290c833981519152929190610a97906125d6565b9050118015610ac9575060015f83815260068301602052604090205460ff166005811115610ac757610ac7612398565b145b610ae55760405162461bcd60e51b815260040161031b9061260e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610b1e9190600401612655565b6020604051808303815f875af1158015610b3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b5e9190612400565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ba75750825b90505f826001600160401b03166001148015610bc25750303b155b905081158015610bd0575080155b15610bee5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c1857845460ff60401b1916600160401b1785555b610c228787611a6f565b8315610c6857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610c79610ec8565b6001600160a01b038116610ca257604051631e4fbdf760e01b81525f600482015260240161031b565b6107bd81611606565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610d2457610ce48160016126f3565b610cef90600861270c565b5081515f90839083908110610d0657610d06612723565b60200101906001600160f81b03191690815f1a905350600101610cd0565b505f5b6004811015610d8757610d3b8160036126f3565b610d4690600861270c565b6001901c60f81b82610d59836002612737565b81518110610d6957610d69612723565b60200101906001600160f81b03191690815f1a905350600101610d27565b505f5b6020811015610de957610d9e81601f6126f3565b610da990600861270c565b86901c60f81b82610dbb836006612737565b81518110610dcb57610dcb612723565b60200101906001600160f81b03191690815f1a905350600101610d8a565b505f5b6008811015610e5457610e008160076126f3565b610e0b90600861270c565b6001600160401b038616901c60f81b82610e26836026612737565b81518110610e3657610e36612723565b60200101906001600160f81b03191690815f1a905350600101610dec565b505f5b6008811015610ebf57610e6b8160076126f3565b610e7690600861270c565b6001600160401b038516901c60f81b82610e9183602e612737565b81518110610ea157610ea1612723565b60200101906001600160f81b03191690815f1a905350600101610e57565b50949350505050565b33610efa7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107b15760405163118cdaa760e01b815233600482015260240161031b565b5f610f2c611a8d565b5f8051602061290c833981519152426001600160401b038516118015610f6657506001600160401b038416610f64426202a300612737565b115b610fc85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161031b565b8561101f5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161031b565b5f8681526007820160205260409020541561108d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161031b565b82516030146110f45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161031b565b6110fd85611ad7565b5f806111446040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611c78565b5f82815260058601602052604090209193509150611162828261278e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061118f9085906004016123ce565b6020604051808303815f875af11580156111ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cf9190612400565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff1916600183600581111561125557611255612398565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103c160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f80825160271461140c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b606482015260840161031b565b5f805b600281101561145b576114238160016126f3565b61142e90600861270c565b61ffff1685828151811061144457611444612723565b016020015160f81c901b919091179060010161140f565b5061ffff8116156114ba5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360448201526208125160ea1b606482015260840161031b565b5f805b6004811015611515576114d18160036126f3565b6114dc90600861270c565b63ffffffff16866114ee836002612737565b815181106114fe576114fe612723565b016020015160f81c901b91909117906001016114bd565b5063ffffffff811660021461157c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616044820152666765207479706560c81b606482015260840161031b565b5f805b60208110156115d15761159381601f6126f3565b61159e90600861270c565b876115aa836006612737565b815181106115ba576115ba612723565b016020015160f81c901b919091179060010161157f565b505f866026815181106115e6576115e6612723565b016020015191976001600160f81b03199092161515965090945050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061290c83398151915293929190829060ff1660058111156116d7576116d7612398565b60058111156116e8576116e8612398565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561178257611782612398565b146117de5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161031b565b60c08101516001600160a01b0316336001600160a01b0316146118585760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161031b565b6118658160400151611ad7565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff191660018360058111156118b1576118b1612398565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f906119a290869083610cab565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906119d19085906004016123ce565b6020604051808303815f875af11580156119ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a119190612400565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b611a77612043565b611a808261208c565b611a89816120ad565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611ad157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061290c8339815191529060ff165f03611b15575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611b5d90836126f3565b10611b79576001600160401b0384166040830152808252611b98565b8382604001818151611b8b919061284d565b6001600160401b03169052505b5f826020015183604001516064611baf9190612874565b611bb9919061289f565b600285015490915060ff9081169082161115611c345760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161031b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611ce25760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161031b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611d5957611d198160016126f3565b611d2490600861270c565b5081515f90839083908110611d3b57611d3b612723565b60200101906001600160f81b03191690815f1a905350600101611d05565b505f5b6004811015611db757611d708160036126f3565b611d7b90600861270c565b505f82611d89836002612737565b81518110611d9957611d99612723565b60200101906001600160f81b03191690815f1a905350600101611d5c565b505f5b6020811015611e145784518160208110611dd657611dd6612723565b1a60f81b82611de6836006612737565b81518110611df657611df6612723565b60200101906001600160f81b03191690815f1a905350600101611dba565b505f5b6020811015611e745784602001518160208110611e3657611e36612723565b1a60f81b82611e46836026612737565b81518110611e5657611e56612723565b60200101906001600160f81b03191690815f1a905350600101611e17565b505f5b6008811015611ee857611e8b8160076126f3565b611e9690600861270c565b60ff1685604001516001600160401b0316901c60f81b82826046611eba9190612737565b81518110611eca57611eca612723565b60200101906001600160f81b03191690815f1a905350600101611e77565b505f5b6030811015611f535784608001518181518110611f0a57611f0a612723565b01602001516001600160f81b03191682611f2583604e612737565b81518110611f3557611f35612723565b60200101906001600160f81b03191690815f1a905350600101611eeb565b505f5b6008811015611fc557611f6a8160076126f3565b611f7590600861270c565b60608601516001600160401b0390811691161c60f81b82611f9783607e612737565b81518110611fa757611fa7612723565b60200101906001600160f81b03191690815f1a905350600101611f56565b50600281604051611fd691906128d0565b602060405180830381855afa158015611ff1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906120149190612400565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107b157604051631afcd79f60e31b815260040160405180910390fd5b612094612043565b61209c6120be565b6120a46120ce565b6107bd816120d6565b6120b5612043565b6107bd81612142565b6120c6612043565b6107b161214a565b6107b1612043565b6120de612043565b80355f8051602061290c83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561212860608301604084016128eb565b600291909101805460ff191660ff90921691909117905550565b610c79612043565b61201d612043565b50805461215e906125d6565b5f825580601f1061216d575050565b601f0160209004905f5260205f20908101906107bd91905b80821115612198575f8155600101612185565b5090565b5f602082840312156121ac575f80fd5b5035919050565b80356001600160401b03811681146121c9575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612204576122046121ce565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612232576122326121ce565b604052919050565b5f6001600160401b03821115612252576122526121ce565b50601f01601f191660200190565b5f805f8060808587031215612273575f80fd5b61227c856121b3565b935060208501359250612291604086016121b3565b915060608501356001600160401b038111156122ab575f80fd5b8501601f810187136122bb575f80fd5b80356122ce6122c98261223a565b61220a565b8181528860208385010111156122e2575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612313575f80fd5b813563ffffffff81168114612326575f80fd5b9392505050565b6001600160a01b03811681146107bd575f80fd5b5f808284036080811215612353575f80fd5b6060811215612360575f80fd5b5082915060608301356123728161232d565b809150509250929050565b5f6020828403121561238d575f80fd5b81356123268161232d565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156123c65781810151838201526020016123ae565b50505f910152565b602081525f82518060208401526123ec8160408501602087016123ac565b601f01601f19169190910160400192915050565b5f60208284031215612410575f80fd5b5051919050565b805180151581146121c9575f80fd5b5f8060408385031215612437575f80fd5b82516001600160401b038082111561244d575f80fd5b9084019060608287031215612460575f80fd5b6124686121e2565b8251815260208084015161247b8161232d565b82820152604084015183811115612490575f80fd5b80850194505087601f8501126124a4575f80fd5b835192506124b46122c98461223a565b83815288828587010111156124c7575f80fd5b6124d6848383018488016123ac565b806040840152508195506124eb818801612417565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b600181811c908216806125ea57607f821691505b60208210810361260857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612667816125d6565b806020870152604060018084165f811461268857600181146126a4576126d1565b60ff19851660408a0152604084151560051b8a010195506126d1565b895f5260205f205f5b858110156126c85781548b82018601529083019088016126ad565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612706576127066126df565b92915050565b8082028115828204841417612706576127066126df565b634e487b7160e01b5f52603260045260245ffd5b80820180821115612706576127066126df565b601f821115610b5e57805f5260205f20601f840160051c8101602085101561276f5750805b601f840160051c820191505b818110156103a2575f815560010161277b565b81516001600160401b038111156127a7576127a76121ce565b6127bb816127b584546125d6565b8461274a565b602080601f8311600181146127ee575f84156127d75750858301515b5f19600386901b1c1916600185901b178555612845565b5f85815260208120601f198616915b8281101561281c578886015182559484019460019091019084016127fd565b508582101561283957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0381811683821601908082111561286d5761286d6126df565b5092915050565b6001600160401b03818116838216028082169190828114612897576128976126df565b505092915050565b5f6001600160401b03808416806128c457634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516128e18184602087016123ac565b9190910192915050565b5f602082840312156128fb575f80fd5b813560ff81168114612326575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -271,25 +271,25 @@ func (_PoAValidatorManager *PoAValidatorManagerCallerSession) Owner() (common.Ad return _PoAValidatorManager.Contract.Owner(&_PoAValidatorManager.CallOpts) } -// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. // -// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { - return _PoAValidatorManager.contract.Transact(opts, "completeEndValidation", messageIndex, setWeightMessageType) +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "completeEndValidation", messageIndex) } -// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. // -// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() -func (_PoAValidatorManager *PoAValidatorManagerSession) CompleteEndValidation(messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.CompleteEndValidation(&_PoAValidatorManager.TransactOpts, messageIndex, setWeightMessageType) +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteEndValidation(&_PoAValidatorManager.TransactOpts, messageIndex) } -// CompleteEndValidation is a paid mutator transaction binding the contract method 0xfdf94a1a. +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. // -// Solidity: function completeEndValidation(uint32 messageIndex, bool setWeightMessageType) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteEndValidation(messageIndex uint32, setWeightMessageType bool) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.CompleteEndValidation(&_PoAValidatorManager.TransactOpts, messageIndex, setWeightMessageType) +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteEndValidation(&_PoAValidatorManager.TransactOpts, messageIndex) } // CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index d2f3a4297..c0cd21399 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -295,13 +295,12 @@ abstract contract ValidatorManager is (bytes32 validationID, bool validRegistration) = ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); require(!validRegistration, "ValidatorManager: Registration still valid"); - // The validation status is PendingRemoved if validator removal was initiated with a call to initiateEndValidation. // The validation status is PendingAdded if the validator was never registered on the P-Chain. // All other statuses are unexpected, but we defensively allow them to specify the validation period as invalidated, // as long as a valid SubnetValidatorRegistration message from the P-Chain is received. - Validator memory validator = $._validationPeriods[validationID]; + Validator memory validator = $._validationPeriods[validationID]; ValidatorStatus endStatus; if (validator.status == ValidatorStatus.PendingRemoved) { endStatus = ValidatorStatus.Completed; From 7c31a9a8772afd160ad63fa72bdcd3e3dec87b95 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 17:15:35 -0500 Subject: [PATCH 142/545] update abi --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 9 ++------- .../NativeTokenStakingManager.go | 9 ++------- .../staking/PoAValidatorManager/PoAValidatorManager.go | 9 ++------- 3 files changed, 6 insertions(+), 21 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index fdbad7021..1a85da7e1 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,13 +47,8 @@ type ValidatorManagerSettings struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ -<<<<<<< HEAD - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161329238038061329283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6131458061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806376f786211161006357806376f786211461012b578063872fda641461013e578063a3a65e4814610151578063b771b3bc14610164578063bee0a03f1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c7578063467ef06f146100f7578063620658561461010a575b5f80fd5b6100b26100ad366004612861565b61019d565b005b6100b26100c236600461288c565b610395565b6100da6100d5366004612861565b6104a3565b6040516001600160401b0390911681526020015b60405180910390f35b6100b26101053660046128e1565b6104b9565b61011d610118366004612917565b610890565b6040519081526020016100ee565b6100b261013936600461293d565b6108a9565b61011d61014c366004612a0a565b610ae4565b6100b261015f3660046128e1565b610b09565b6101726005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610198366004612861565b610d98565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061311983398151915293929190829060ff1660058111156101fe576101fe612aa6565b600581111561020f5761020f612aa6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102a6576102a6612aa6565b146103105760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f610321848361010001515f610eac565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034e908490600401612adc565b6020604051808303815f875af115801561036a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038e9190612b0e565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103d95750825b90505f826001600160401b031660011480156103f45750303b155b905081158015610402575080155b156104205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561044a57845460ff60401b1916600160401b1785555b61045487876110c9565b831561049a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6104b364e8d4a5100083612b4d565b92915050565b5f5f805160206131198339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610514573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261053b9190810190612b6b565b915091508061055c5760405162461bcd60e51b815260040161030790612c3d565b825482511461057d5760405162461bcd60e51b815260040161030790612c83565b60208201516001600160a01b0316156105a85760405162461bcd60e51b815260040161030790612ccc565b5f806105b784604001516110e7565b91509150801561061c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610307565b5f828152600686016020526040808220815161012081019092528054829060ff16600581111561064e5761064e612aa6565b600581111561065f5761065f612aa6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091505f90825160058111156106f8576106f8612aa6565b0361070557506004610709565b5060055b6020808301515f9081526007890190915260408120558181600581111561073257610732612aa6565b9081600581111561074557610745612aa6565b9052505f84815260068801602052604090208251815484929190829060ff1916600183600581111561077957610779612aa6565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555184907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b5f6104b36001600160401b03831664e8d4a51000612d1b565b5f805160206131198339815191525f8315610ada576040516306f8253560e41b815263ffffffff841660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610907573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261092e9190810190612b6b565b915091508061098b5760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610307565b83548251146109ec5760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610307565b60208201516001600160a01b031615610a5d5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610307565b5f80610a6c8460400151611288565b91509150818914610ad45760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610307565b93505050505b61038e8582611460565b5f80610aef86611859565b9050610afd85828686611919565b9150505b949350505050565b5f5f805160206131198339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b8b9190810190612b6b565b9150915080610bac5760405162461bcd60e51b815260040161030790612c3d565b8254825114610bcd5760405162461bcd60e51b815260040161030790612c83565b60208201516001600160a01b031615610bf85760405162461bcd60e51b815260040161030790612ccc565b5f80610c0784604001516110e7565b9150915080610c695760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610307565b5f82815260058601602052604081208054610c8390612d32565b9050118015610cb5575060015f83815260068701602052604090205460ff166005811115610cb357610cb3612aa6565b145b610cd15760405162461bcd60e51b815260040161030790612d6a565b5f8281526005860160205260408120610ce991612817565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613119833981519152929190610de090612d32565b9050118015610e12575060015f83815260068301602052604090205460ff166005811115610e1057610e10612aa6565b145b610e2e5760405162461bcd60e51b815260040161030790612d6a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e679190600401612db1565b6020604051808303815f875af1158015610e83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea79190612b0e565b505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610f2557610ee5816001612e3b565b610ef0906008612d1b565b5081515f90839083908110610f0757610f07612e4e565b60200101906001600160f81b03191690815f1a905350600101610ed1565b505f5b6004811015610f8857610f3c816003612e3b565b610f47906008612d1b565b6001901c60f81b82610f5a836002612e62565b81518110610f6a57610f6a612e4e565b60200101906001600160f81b03191690815f1a905350600101610f28565b505f5b6020811015610fea57610f9f81601f612e3b565b610faa906008612d1b565b86901c60f81b82610fbc836006612e62565b81518110610fcc57610fcc612e4e565b60200101906001600160f81b03191690815f1a905350600101610f8b565b505f5b600881101561105557611001816007612e3b565b61100c906008612d1b565b6001600160401b038616901c60f81b82611027836026612e62565b8151811061103757611037612e4e565b60200101906001600160f81b03191690815f1a905350600101610fed565b505f5b60088110156110c05761106c816007612e3b565b611077906008612d1b565b6001600160401b038516901c60f81b8261109283602e612e62565b815181106110a2576110a2612e4e565b60200101906001600160f81b03191690815f1a905350600101611058565b50949350505050565b6110d1611d9d565b6110da82611de8565b6110e381611e2e565b5050565b5f80825160271461110a5760405162461bcd60e51b815260040161030790612e75565b5f805b600281101561115957611121816001612e3b565b61112c906008612d1b565b61ffff1685828151811061114257611142612e4e565b016020015160f81c901b919091179060010161110d565b5061ffff81161561117c5760405162461bcd60e51b815260040161030790612ebe565b5f805b60048110156111d757611193816003612e3b565b61119e906008612d1b565b63ffffffff16866111b0836002612e62565b815181106111c0576111c0612e4e565b016020015160f81c901b919091179060010161117f565b5063ffffffff81166002146111fe5760405162461bcd60e51b815260040161030790612f01565b5f805b60208110156112535761121581601f612e3b565b611220906008612d1b565b8761122c836006612e62565b8151811061123c5761123c612e4e565b016020015160f81c901b9190911790600101611201565b505f8660268151811061126857611268612e4e565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146112ab5760405162461bcd60e51b815260040161030790612e75565b5f805b60028110156112fa576112c2816001612e3b565b6112cd906008612d1b565b61ffff168582815181106112e3576112e3612e4e565b016020015160f81c901b91909117906001016112ae565b5061ffff81161561131d5760405162461bcd60e51b815260040161030790612ebe565b5f805b600481101561137857611334816003612e3b565b61133f906008612d1b565b63ffffffff1686611351836002612e62565b8151811061136157611361612e4e565b016020015160f81c901b9190911790600101611320565b5063ffffffff811660041461139f5760405162461bcd60e51b815260040161030790612f01565b5f805b60208110156113f4576113b681601f612e3b565b6113c1906008612d1b565b876113cd836006612e62565b815181106113dd576113dd612e4e565b016020015160f81c901b91909117906001016113a2565b505f805b60088110156114535761140c816007612e3b565b611417906008612d1b565b6001600160401b03168861142c836026612e62565b8151811061143c5761143c612e4e565b016020015160f81c901b91909117906001016113f8565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061311983398151915293929190829060ff1660058111156114c1576114c1612aa6565b60058111156114d2576114d2612aa6565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561156c5761156c612aa6565b146115c85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610307565b60c08101516001600160a01b0316336001600160a01b0316146116425760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610307565b61164f8160400151611ee2565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff1916600183600581111561169b5761169b612aa6565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f9061178c90869083610eac565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906117bb908590600401612adc565b6020604051808303815f875af11580156117d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117fb9190612b0e565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008161188584612083565b90505f611891826104a3565b83549091506001600160401b038216108015906118bb57508260010154816001600160401b031611155b610b015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610307565b5f6119226120b9565b5f80516020613119833981519152426001600160401b03851611801561195c57506001600160401b03841661195a426202a300612e62565b115b6119be5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610307565b85611a155760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610307565b5f86815260078201602052604090205415611a835760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610307565b8251603014611aea5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610307565b611af385611ee2565b5f80611b3a6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612103565b5f82815260058601602052604090209193509150611b588282612f8c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b85908590600401612adc565b6020604051808303815f875af1158015611ba1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc59190612b0e565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611c4b57611c4b612aa6565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610b0160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611de657604051631afcd79f60e31b815260040160405180910390fd5b565b611df0611d9d565b611df9816124ce565b611e2b60608201356080830135611e1660c0850160a08601612917565b611e2660e0860160c0870161304b565b6124ef565b50565b611e36611d9d565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216611ec25760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610307565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206131198339815191529060ff165f03611f20575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611f689083612e3b565b10611f84576001600160401b0384166040830152808252611fa3565b8382604001818151611f969190613066565b6001600160401b03169052505b5f826020015183604001516064611fba919061308d565b611fc491906130b8565b600285015490915060ff908116908216111561203f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610307565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104b3827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061255d565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016120fd57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461216d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610307565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156121e4576121a4816001612e3b565b6121af906008612d1b565b5081515f908390839081106121c6576121c6612e4e565b60200101906001600160f81b03191690815f1a905350600101612190565b505f5b6004811015612242576121fb816003612e3b565b612206906008612d1b565b505f82612214836002612e62565b8151811061222457612224612e4e565b60200101906001600160f81b03191690815f1a9053506001016121e7565b505f5b602081101561229f578451816020811061226157612261612e4e565b1a60f81b82612271836006612e62565b8151811061228157612281612e4e565b60200101906001600160f81b03191690815f1a905350600101612245565b505f5b60208110156122ff57846020015181602081106122c1576122c1612e4e565b1a60f81b826122d1836026612e62565b815181106122e1576122e1612e4e565b60200101906001600160f81b03191690815f1a9053506001016122a2565b505f5b600881101561237357612316816007612e3b565b612321906008612d1b565b60ff1685604001516001600160401b0316901c60f81b828260466123459190612e62565b8151811061235557612355612e4e565b60200101906001600160f81b03191690815f1a905350600101612302565b505f5b60308110156123de578460800151818151811061239557612395612e4e565b01602001516001600160f81b031916826123b083604e612e62565b815181106123c0576123c0612e4e565b60200101906001600160f81b03191690815f1a905350600101612376565b505f5b6008811015612450576123f5816007612e3b565b612400906008612d1b565b60608601516001600160401b0390811691161c60f81b8261242283607e612e62565b8151811061243257612432612e4e565b60200101906001600160f81b03191690815f1a9053506001016123e1565b5060028160405161246191906130dd565b602060405180830381855afa15801561247c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061249f9190612b0e565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6124d6611d9d565b6124de6126bf565b6124e66126cf565b611e2b816126d7565b6124f7611d9d565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156125a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c79190612b0e565b90506125de6001600160a01b038516333086612743565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015612622573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126469190612b0e565b90508181116126ac5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610307565b6126b68282612e3b565b95945050505050565b6126c7611d9d565b611de66127a3565b611de6611d9d565b6126df611d9d565b80355f8051602061311983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561272960608301604084016130f8565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261279d9085906127ab565b50505050565b6124a8611d9d565b5f8060205f8451602086015f885af1806127ca576040513d5f823e3d81fd5b50505f513d915081156127e15780600114156127ee565b6001600160a01b0384163b155b1561279d57604051635274afe760e01b81526001600160a01b0385166004820152602401610307565b50805461282390612d32565b5f825580601f10612832575050565b601f0160209004905f5260205f2090810190611e2b91905b8082111561285d575f815560010161284a565b5090565b5f60208284031215612871575f80fd5b5035919050565b6001600160a01b0381168114611e2b575f80fd5b5f8082840361010081121561289f575f80fd5b60e08112156128ac575f80fd5b5082915060e08301356128be81612878565b809150509250929050565b803563ffffffff811681146128dc575f80fd5b919050565b5f602082840312156128f1575f80fd5b6128fa826128c9565b9392505050565b80356001600160401b03811681146128dc575f80fd5b5f60208284031215612927575f80fd5b6128fa82612901565b8015158114611e2b575f80fd5b5f805f6060848603121561294f575f80fd5b83359250602084013561296181612930565b915061296f604085016128c9565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129ae576129ae612978565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129dc576129dc612978565b604052919050565b5f6001600160401b038211156129fc576129fc612978565b50601f01601f191660200190565b5f805f8060808587031215612a1d575f80fd5b8435935060208501359250612a3460408601612901565b915060608501356001600160401b03811115612a4e575f80fd5b8501601f81018713612a5e575f80fd5b8035612a71612a6c826129e4565b6129b4565b818152886020838501011115612a85575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612ad4578181015183820152602001612abc565b50505f910152565b602081525f8251806020840152612afa816040850160208701612aba565b601f01601f19169190910160400192915050565b5f60208284031215612b1e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612b5b57612b5b612b25565b500490565b80516128dc81612930565b5f8060408385031215612b7c575f80fd5b82516001600160401b0380821115612b92575f80fd5b9084019060608287031215612ba5575f80fd5b612bad61298c565b82518152602080840151612bc081612878565b82820152604084015183811115612bd5575f80fd5b80850194505087601f850112612be9575f80fd5b83519250612bf9612a6c846129e4565b8381528882858701011115612c0c575f80fd5b612c1b84838301848801612aba565b80604084015250819550612c30818801612b60565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b80820281158282048414176104b3576104b3612b39565b600181811c90821680612d4657607f821691505b602082108103612d6457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612dc381612d32565b806020870152604060018084165f8114612de45760018114612e0057612e2d565b60ff19851660408a0152604084151560051b8a01019550612e2d565b895f5260205f205f5b85811015612e245781548b8201860152908301908801612e09565b8a016040019650505b509398975050505050505050565b818103818111156104b3576104b3612b39565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104b3576104b3612b39565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610ea757805f5260205f20601f840160051c81016020851015612f6d5750805b601f840160051c820191505b8181101561038e575f8155600101612f79565b81516001600160401b03811115612fa557612fa5612978565b612fb981612fb38454612d32565b84612f48565b602080601f831160018114612fec575f8415612fd55750858301515b5f19600386901b1c1916600185901b178555613043565b5f85815260208120601f198616915b8281101561301a57888601518255948401946001909101908401612ffb565b508582101561303757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561305b575f80fd5b81356128fa81612878565b6001600160401b0381811683821601908082111561308657613086612b39565b5092915050565b6001600160401b038181168382160280821691908281146130b0576130b0612b39565b505092915050565b5f6001600160401b03808416806130d1576130d1612b25565b92169190910492915050565b5f82516130ee818460208701612aba565b9190910192915050565b5f60208284031215613108575f80fd5b813560ff811681146128fa575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", -======= - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161350238038061350283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6133b58061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c757806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612af3565b61019d565b005b6100b26100c2366004612b1e565b610373565b6100da6100d5366004612af3565b610481565b6040516001600160401b0390911681526020015b60405180910390f35b61010a610105366004612b76565b610497565b6040519081526020016100ee565b6100b2610126366004612bb6565b6104b0565b61010a610139366004612c83565b6107e1565b6100b261014c366004612d1f565b610806565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610185366004612af3565b610b1f565b6100b2610198366004612d38565b610c2e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061338983398151915293929190829060ff1660058111156101fd576101fd612d62565b600581111561020e5761020e612d62565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561028557610285612d62565b146102ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6102ff8483606001515f611001565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061032c908490600401612d98565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c9190612dca565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103b75750825b90505f826001600160401b031660011480156103d25750303b155b9050811580156103e0575080155b156103fe5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561042857845460ff60401b1916600160401b1785555b610432878761121e565b831561047857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61049164e8d4a5100083612e09565b92915050565b5f6104916001600160401b03831664e8d4a51000612e1c565b81156107d3575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610524573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261054b9190810190612e3e565b91509150806105ae5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016102e6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106159190612dca565b8251146106795760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016102e6565b60208201516001600160a01b0316156106ef5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016102e6565b5f806106fe846040015161123c565b9150915081881461076b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016102e6565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6107dc83611414565b505050565b5f806107ec8661175c565b90506107fa8582868661181c565b9150505b949350505050565b5f5f805160206133898339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610861573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108889190810190612e3e565b91509150806108a95760405162461bcd60e51b81526004016102e690612f10565b825482511461090c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102e6565b60208201516001600160a01b03161561097f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102e6565b5f8061098e8460400151611c53565b91509150806109f05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102e6565b5f82815260058601602052604081208054610a0a90612f56565b9050118015610a3c575060015f83815260068701602052604090205460ff166005811115610a3a57610a3a612d62565b145b610a585760405162461bcd60e51b81526004016102e690612f8e565b5f8281526005860160205260408120610a7091612aa9565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613389833981519152929190610b6790612f56565b9050118015610b99575060015f83815260068301602052604090205460ff166005811115610b9757610b97612d62565b145b610bb55760405162461bcd60e51b81526004016102e690612f8e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bee9190600401612fd5565b6020604051808303815f875af1158015610c0a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107dc9190612dca565b5f5f805160206133898339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c89573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cb09190810190612e3e565b9150915080610cd15760405162461bcd60e51b81526004016102e690612f10565b5f8415610d55575f610ce68460400151611df4565b919350909150506001600160401b03811615610d4f5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016102e6565b50610dcb565b5f610d638460400151611c53565b90925090508015610dc95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102e6565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610dfc57610dfc612d62565b6005811115610e0d57610e0d612d62565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610e9e5760405162461bcd60e51b81526004016102e69061305f565b5f600382516005811115610eb457610eb4612d62565b1480610ed25750600282516005811115610ed057610ed0612d62565b145b15610ef557506020808201515f9081526007870190915260408120556004610ef9565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f2a57610f2a612d62565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561107a5761103a8160016130ab565b611045906008612e1c565b5081515f9083908390811061105c5761105c6130be565b60200101906001600160f81b03191690815f1a905350600101611026565b505f5b60048110156110dd576110918160036130ab565b61109c906008612e1c565b6001901c60f81b826110af8360026130d2565b815181106110bf576110bf6130be565b60200101906001600160f81b03191690815f1a90535060010161107d565b505f5b602081101561113f576110f481601f6130ab565b6110ff906008612e1c565b86901c60f81b826111118360066130d2565b81518110611121576111216130be565b60200101906001600160f81b03191690815f1a9053506001016110e0565b505f5b60088110156111aa576111568160076130ab565b611161906008612e1c565b6001600160401b038616901c60f81b8261117c8360266130d2565b8151811061118c5761118c6130be565b60200101906001600160f81b03191690815f1a905350600101611142565b505f5b6008811015611215576111c18160076130ab565b6111cc906008612e1c565b6001600160401b038516901c60f81b826111e783602e6130d2565b815181106111f7576111f76130be565b60200101906001600160f81b03191690815f1a9053506001016111ad565b50949350505050565b61122661202f565b61122f8261207a565b611238816120c0565b5050565b5f808251602e1461125f5760405162461bcd60e51b81526004016102e6906130e5565b5f805b60028110156112ae576112768160016130ab565b611281906008612e1c565b61ffff16858281518110611297576112976130be565b016020015160f81c901b9190911790600101611262565b5061ffff8116156112d15760405162461bcd60e51b81526004016102e69061312e565b5f805b600481101561132c576112e88160036130ab565b6112f3906008612e1c565b63ffffffff16866113058360026130d2565b81518110611315576113156130be565b016020015160f81c901b91909117906001016112d4565b5063ffffffff81166004146113535760405162461bcd60e51b81526004016102e690613171565b5f805b60208110156113a85761136a81601f6130ab565b611375906008612e1c565b876113818360066130d2565b81518110611391576113916130be565b016020015160f81c901b9190911790600101611356565b505f805b6008811015611407576113c08160076130ab565b6113cb906008612e1c565b6001600160401b0316886113e08360266130d2565b815181106113f0576113f06130be565b016020015160f81c901b91909117906001016113ac565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061338983398151915293929190829060ff16600581111561147457611474612d62565b600581111561148557611485612d62565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156114ff576114ff612d62565b1461155b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102e6565b60408101516001600160a01b0316336001600160a01b0316146115905760405162461bcd60e51b81526004016102e69061305f565b61159d8160800151612174565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156115e1576115e1612d62565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061169890859083611001565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116c7908590600401612d98565b6020604051808303815f875af11580156116e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117079190612dca565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008161178884612315565b90505f61179482610481565b83549091506001600160401b038216108015906117be57508260010154816001600160401b031611155b6107fe5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016102e6565b5f61182561234b565b5f80516020613389833981519152426001600160401b03851611801561185f57506001600160401b03841661185d426202a3006130d2565b115b6118c15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102e6565b856119185760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102e6565b5f868152600782016020526040902054156119865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102e6565b82516030146119ed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102e6565b6119f685612174565b5f80611a3d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612395565b5f82815260058601602052604090209193509150611a5b82826131fc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611a88908590600401612d98565b6020604051808303815f875af1158015611aa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac89190612dca565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611b4157611b41612d62565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506107fe60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611c765760405162461bcd60e51b81526004016102e6906130e5565b5f805b6002811015611cc557611c8d8160016130ab565b611c98906008612e1c565b61ffff16858281518110611cae57611cae6130be565b016020015160f81c901b9190911790600101611c79565b5061ffff811615611ce85760405162461bcd60e51b81526004016102e69061312e565b5f805b6004811015611d4357611cff8160036130ab565b611d0a906008612e1c565b63ffffffff1686611d1c8360026130d2565b81518110611d2c57611d2c6130be565b016020015160f81c901b9190911790600101611ceb565b5063ffffffff8116600214611d6a5760405162461bcd60e51b81526004016102e690613171565b5f805b6020811015611dbf57611d8181601f6130ab565b611d8c906008612e1c565b87611d988360066130d2565b81518110611da857611da86130be565b016020015160f81c901b9190911790600101611d6d565b505f86602681518110611dd457611dd46130be565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611e185760405162461bcd60e51b81526004016102e6906130e5565b5f805b6002811015611e6757611e2f8160016130ab565b611e3a906008612e1c565b61ffff16868281518110611e5057611e506130be565b016020015160f81c901b9190911790600101611e1b565b5061ffff811615611e8a5760405162461bcd60e51b81526004016102e69061312e565b5f805b6004811015611ee557611ea18160036130ab565b611eac906008612e1c565b63ffffffff1687611ebe8360026130d2565b81518110611ece57611ece6130be565b016020015160f81c901b9190911790600101611e8d565b5063ffffffff8116600114611f0c5760405162461bcd60e51b81526004016102e690613171565b5f805b6020811015611f6157611f2381601f6130ab565b611f2e906008612e1c565b88611f3a8360066130d2565b81518110611f4a57611f4a6130be565b016020015160f81c901b9190911790600101611f0f565b505f805b6008811015611fc057611f798160076130ab565b611f84906008612e1c565b6001600160401b031689611f998360266130d2565b81518110611fa957611fa96130be565b016020015160f81c901b9190911790600101611f65565b505f805b600881101561201f57611fd88160076130ab565b611fe3906008612e1c565b6001600160401b03168a611ff883602e6130d2565b81518110612008576120086130be565b016020015160f81c901b9190911790600101611fc4565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661207857604051631afcd79f60e31b815260040160405180910390fd5b565b61208261202f565b61208b81612760565b6120bd606082013560808301356120a860c0850160a08601612b76565b6120b860e0860160c087016132bb565b612781565b50565b6120c861202f565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166121545760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016102e6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206133898339815191529060ff165f036121b2575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121fa90836130ab565b10612216576001600160401b0384166040830152808252612235565b838260400181815161222891906132d6565b6001600160401b03169052505b5f82602001518360400151606461224c91906132fd565b6122569190613328565b600285015490915060ff90811690821611156122d15760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102e6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610491827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906127ef565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161238f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146123ff5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102e6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612476576124368160016130ab565b612441906008612e1c565b5081515f90839083908110612458576124586130be565b60200101906001600160f81b03191690815f1a905350600101612422565b505f5b60048110156124d45761248d8160036130ab565b612498906008612e1c565b505f826124a68360026130d2565b815181106124b6576124b66130be565b60200101906001600160f81b03191690815f1a905350600101612479565b505f5b602081101561253157845181602081106124f3576124f36130be565b1a60f81b826125038360066130d2565b81518110612513576125136130be565b60200101906001600160f81b03191690815f1a9053506001016124d7565b505f5b60208110156125915784602001518160208110612553576125536130be565b1a60f81b826125638360266130d2565b81518110612573576125736130be565b60200101906001600160f81b03191690815f1a905350600101612534565b505f5b6008811015612605576125a88160076130ab565b6125b3906008612e1c565b60ff1685604001516001600160401b0316901c60f81b828260466125d791906130d2565b815181106125e7576125e76130be565b60200101906001600160f81b03191690815f1a905350600101612594565b505f5b60308110156126705784608001518181518110612627576126276130be565b01602001516001600160f81b0319168261264283604e6130d2565b81518110612652576126526130be565b60200101906001600160f81b03191690815f1a905350600101612608565b505f5b60088110156126e2576126878160076130ab565b612692906008612e1c565b60608601516001600160401b0390811691161c60f81b826126b483607e6130d2565b815181106126c4576126c46130be565b60200101906001600160f81b03191690815f1a905350600101612673565b506002816040516126f3919061334d565b602060405180830381855afa15801561270e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127319190612dca565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61276861202f565b612770612951565b612778612961565b6120bd81612969565b61278961202f565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128599190612dca565b90506128706001600160a01b0385163330866129d5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156128b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128d89190612dca565b905081811161293e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016102e6565b61294882826130ab565b95945050505050565b61295961202f565b612078612a35565b61207861202f565b61297161202f565b80355f8051602061338983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556129bb6060830160408401613368565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a2f908590612a3d565b50505050565b61273a61202f565b5f8060205f8451602086015f885af180612a5c576040513d5f823e3d81fd5b50505f513d91508115612a73578060011415612a80565b6001600160a01b0384163b155b15612a2f57604051635274afe760e01b81526001600160a01b03851660048201526024016102e6565b508054612ab590612f56565b5f825580601f10612ac4575050565b601f0160209004905f5260205f20908101906120bd91905b80821115612aef575f8155600101612adc565b5090565b5f60208284031215612b03575f80fd5b5035919050565b6001600160a01b03811681146120bd575f80fd5b5f80828403610100811215612b31575f80fd5b60e0811215612b3e575f80fd5b5082915060e0830135612b5081612b0a565b809150509250929050565b80356001600160401b0381168114612b71575f80fd5b919050565b5f60208284031215612b86575f80fd5b612b8f82612b5b565b9392505050565b80151581146120bd575f80fd5b803563ffffffff81168114612b71575f80fd5b5f805f60608486031215612bc8575f80fd5b833592506020840135612bda81612b96565b9150612be860408501612ba3565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612c2757612c27612bf1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612c5557612c55612bf1565b604052919050565b5f6001600160401b03821115612c7557612c75612bf1565b50601f01601f191660200190565b5f805f8060808587031215612c96575f80fd5b8435935060208501359250612cad60408601612b5b565b915060608501356001600160401b03811115612cc7575f80fd5b8501601f81018713612cd7575f80fd5b8035612cea612ce582612c5d565b612c2d565b818152886020838501011115612cfe575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612d2f575f80fd5b612b8f82612ba3565b5f8060408385031215612d49575f80fd5b612d5283612ba3565b91506020830135612b5081612b96565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612d90578181015183820152602001612d78565b50505f910152565b602081525f8251806020840152612db6816040850160208701612d76565b601f01601f19169190910160400192915050565b5f60208284031215612dda575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612e1757612e17612de1565b500490565b808202811582820484141761049157610491612df5565b8051612b7181612b96565b5f8060408385031215612e4f575f80fd5b82516001600160401b0380821115612e65575f80fd5b9084019060608287031215612e78575f80fd5b612e80612c05565b82518152602080840151612e9381612b0a565b82820152604084015183811115612ea8575f80fd5b80850194505087601f850112612ebc575f80fd5b83519250612ecc612ce584612c5d565b8381528882858701011115612edf575f80fd5b612eee84838301848801612d76565b80604084015250819550612f03818801612e33565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612f6a57607f821691505b602082108103612f8857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612fe781612f56565b806020870152604060018084165f8114613008576001811461302457613051565b60ff19851660408a0152604084151560051b8a01019550613051565b895f5260205f205f5b858110156130485781548b820186015290830190880161302d565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561049157610491612df5565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561049157610491612df5565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f8211156107dc57805f5260205f20601f840160051c810160208510156131dd5750805b601f840160051c820191505b8181101561036c575f81556001016131e9565b81516001600160401b0381111561321557613215612bf1565b613229816132238454612f56565b846131b8565b602080601f83116001811461325c575f84156132455750858301515b5f19600386901b1c1916600185901b1785556132b3565b5f85815260208120601f198616915b8281101561328a5788860151825594840194600190910190840161326b565b50858210156132a757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156132cb575f80fd5b8135612b8f81612b0a565b6001600160401b038181168382160190808211156132f6576132f6612df5565b5092915050565b6001600160401b0381811683821602808216919082811461332057613320612df5565b505092915050565b5f6001600160401b038084168061334157613341612de1565b92169190910492915050565b5f825161335e818460208701612d76565b9190910192915050565b5f60208284031215613378575f80fd5b813560ff81168114612b8f575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", ->>>>>>> staking-contract + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161324738038061324783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130fa8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806376f786211161006357806376f786211461012b578063872fda641461013e578063a3a65e4814610151578063b771b3bc14610164578063bee0a03f1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c7578063467ef06f146100f7578063620658561461010a575b5f80fd5b6100b26100ad366004612816565b61019d565b005b6100b26100c2366004612841565b610373565b6100da6100d5366004612816565b610481565b6040516001600160401b0390911681526020015b60405180910390f35b6100b2610105366004612896565b610497565b61011d6101183660046128cc565b61080d565b6040519081526020016100ee565b6100b26101393660046128f2565b610826565b61011d61014c3660046129bf565b610b57565b6100b261015f366004612896565b610b7c565b6101726005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610198366004612816565b610e0b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206130ce83398151915293929190829060ff1660058111156101fd576101fd612a5b565b600581111561020e5761020e612a5b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561028557610285612a5b565b146102ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6102ff8483606001515f610f1a565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061032c908490600401612a91565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c9190612ac3565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103b75750825b90505f826001600160401b031660011480156103d25750303b155b9050811580156103e0575080155b156103fe5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561042857845460ff60401b1916600160401b1785555b6104328787611137565b831561047857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61049164e8d4a5100083612b02565b92915050565b5f5f805160206130ce8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156104f2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105199190810190612b20565b915091508061053a5760405162461bcd60e51b81526004016102e690612bf2565b825482511461055b5760405162461bcd60e51b81526004016102e690612c38565b60208201516001600160a01b0316156105865760405162461bcd60e51b81526004016102e690612c81565b5f806105958460400151611155565b9150915080156105fa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102e6565b5f828152600686016020526040808220815160e081019092528054829060ff16600581111561062b5761062b612a5b565b600581111561063c5761063c612a5b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156106b5576106b5612a5b565b036106c2575060046106c6565b5060055b6020808301515f908152600789019091526040812055818160058111156106ef576106ef612a5b565b9081600581111561070257610702612a5b565b9052505f84815260068801602052604090208251815484929190829060ff1916600183600581111561073657610736612a5b565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555184907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b5f6104916001600160401b03831664e8d4a51000612cd0565b8115610b49575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561089a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108c19190810190612b20565b91509150806109245760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016102e6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610967573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098b9190612ac3565b8251146109ef5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016102e6565b60208201516001600160a01b031615610a655760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016102e6565b5f80610a7484604001516112f6565b91509150818814610ae15760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016102e6565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610b52836114ce565b505050565b5f80610b628661185b565b9050610b708582868661191b565b9150505b949350505050565b5f5f805160206130ce8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610bd7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bfe9190810190612b20565b9150915080610c1f5760405162461bcd60e51b81526004016102e690612bf2565b8254825114610c405760405162461bcd60e51b81526004016102e690612c38565b60208201516001600160a01b031615610c6b5760405162461bcd60e51b81526004016102e690612c81565b5f80610c7a8460400151611155565b9150915080610cdc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102e6565b5f82815260058601602052604081208054610cf690612ce7565b9050118015610d28575060015f83815260068701602052604090205460ff166005811115610d2657610d26612a5b565b145b610d445760405162461bcd60e51b81526004016102e690612d1f565b5f8281526005860160205260408120610d5c916127cc565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206130ce833981519152929190610e5390612ce7565b9050118015610e85575060015f83815260068301602052604090205460ff166005811115610e8357610e83612a5b565b145b610ea15760405162461bcd60e51b81526004016102e690612d1f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610eda9190600401612d66565b6020604051808303815f875af1158015610ef6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b529190612ac3565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610f9357610f53816001612df0565b610f5e906008612cd0565b5081515f90839083908110610f7557610f75612e03565b60200101906001600160f81b03191690815f1a905350600101610f3f565b505f5b6004811015610ff657610faa816003612df0565b610fb5906008612cd0565b6001901c60f81b82610fc8836002612e17565b81518110610fd857610fd8612e03565b60200101906001600160f81b03191690815f1a905350600101610f96565b505f5b60208110156110585761100d81601f612df0565b611018906008612cd0565b86901c60f81b8261102a836006612e17565b8151811061103a5761103a612e03565b60200101906001600160f81b03191690815f1a905350600101610ff9565b505f5b60088110156110c35761106f816007612df0565b61107a906008612cd0565b6001600160401b038616901c60f81b82611095836026612e17565b815181106110a5576110a5612e03565b60200101906001600160f81b03191690815f1a90535060010161105b565b505f5b600881101561112e576110da816007612df0565b6110e5906008612cd0565b6001600160401b038516901c60f81b8261110083602e612e17565b8151811061111057611110612e03565b60200101906001600160f81b03191690815f1a9053506001016110c6565b50949350505050565b61113f611d52565b61114882611d9d565b61115181611de3565b5050565b5f8082516027146111785760405162461bcd60e51b81526004016102e690612e2a565b5f805b60028110156111c75761118f816001612df0565b61119a906008612cd0565b61ffff168582815181106111b0576111b0612e03565b016020015160f81c901b919091179060010161117b565b5061ffff8116156111ea5760405162461bcd60e51b81526004016102e690612e73565b5f805b600481101561124557611201816003612df0565b61120c906008612cd0565b63ffffffff168661121e836002612e17565b8151811061122e5761122e612e03565b016020015160f81c901b91909117906001016111ed565b5063ffffffff811660021461126c5760405162461bcd60e51b81526004016102e690612eb6565b5f805b60208110156112c15761128381601f612df0565b61128e906008612cd0565b8761129a836006612e17565b815181106112aa576112aa612e03565b016020015160f81c901b919091179060010161126f565b505f866026815181106112d6576112d6612e03565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146113195760405162461bcd60e51b81526004016102e690612e2a565b5f805b600281101561136857611330816001612df0565b61133b906008612cd0565b61ffff1685828151811061135157611351612e03565b016020015160f81c901b919091179060010161131c565b5061ffff81161561138b5760405162461bcd60e51b81526004016102e690612e73565b5f805b60048110156113e6576113a2816003612df0565b6113ad906008612cd0565b63ffffffff16866113bf836002612e17565b815181106113cf576113cf612e03565b016020015160f81c901b919091179060010161138e565b5063ffffffff811660041461140d5760405162461bcd60e51b81526004016102e690612eb6565b5f805b60208110156114625761142481601f612df0565b61142f906008612cd0565b8761143b836006612e17565b8151811061144b5761144b612e03565b016020015160f81c901b9190911790600101611410565b505f805b60088110156114c15761147a816007612df0565b611485906008612cd0565b6001600160401b03168861149a836026612e17565b815181106114aa576114aa612e03565b016020015160f81c901b9190911790600101611466565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206130ce83398151915293929190829060ff16600581111561152e5761152e612a5b565b600581111561153f5761153f612a5b565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156115b9576115b9612a5b565b146116155760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102e6565b60408101516001600160a01b0316336001600160a01b03161461168f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016102e6565b61169c8160800151611e97565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156116e0576116e0612a5b565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061179790859083610f1a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906117c6908590600401612a91565b6020604051808303815f875af11580156117e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118069190612ac3565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008161188784612038565b90505f61189382610481565b83549091506001600160401b038216108015906118bd57508260010154816001600160401b031611155b610b745760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016102e6565b5f61192461206e565b5f805160206130ce833981519152426001600160401b03851611801561195e57506001600160401b03841661195c426202a300612e17565b115b6119c05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102e6565b85611a175760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102e6565b5f86815260078201602052604090205415611a855760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102e6565b8251603014611aec5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102e6565b611af585611e97565b5f80611b3c6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506120b8565b5f82815260058601602052604090209193509150611b5a8282612f41565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b87908590600401612a91565b6020604051808303815f875af1158015611ba3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc79190612ac3565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611c4057611c40612a5b565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610b7460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611d9b57604051631afcd79f60e31b815260040160405180910390fd5b565b611da5611d52565b611dae81612483565b611de060608201356080830135611dcb60c0850160a086016128cc565b611ddb60e0860160c08701613000565b6124a4565b50565b611deb611d52565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216611e775760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016102e6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206130ce8339815191529060ff165f03611ed5575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611f1d9083612df0565b10611f39576001600160401b0384166040830152808252611f58565b8382604001818151611f4b919061301b565b6001600160401b03169052505b5f826020015183604001516064611f6f9190613042565b611f79919061306d565b600285015490915060ff9081169082161115611ff45760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102e6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610491827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690612512565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016120b257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146121225760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102e6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561219957612159816001612df0565b612164906008612cd0565b5081515f9083908390811061217b5761217b612e03565b60200101906001600160f81b03191690815f1a905350600101612145565b505f5b60048110156121f7576121b0816003612df0565b6121bb906008612cd0565b505f826121c9836002612e17565b815181106121d9576121d9612e03565b60200101906001600160f81b03191690815f1a90535060010161219c565b505f5b6020811015612254578451816020811061221657612216612e03565b1a60f81b82612226836006612e17565b8151811061223657612236612e03565b60200101906001600160f81b03191690815f1a9053506001016121fa565b505f5b60208110156122b4578460200151816020811061227657612276612e03565b1a60f81b82612286836026612e17565b8151811061229657612296612e03565b60200101906001600160f81b03191690815f1a905350600101612257565b505f5b6008811015612328576122cb816007612df0565b6122d6906008612cd0565b60ff1685604001516001600160401b0316901c60f81b828260466122fa9190612e17565b8151811061230a5761230a612e03565b60200101906001600160f81b03191690815f1a9053506001016122b7565b505f5b6030811015612393578460800151818151811061234a5761234a612e03565b01602001516001600160f81b0319168261236583604e612e17565b8151811061237557612375612e03565b60200101906001600160f81b03191690815f1a90535060010161232b565b505f5b6008811015612405576123aa816007612df0565b6123b5906008612cd0565b60608601516001600160401b0390811691161c60f81b826123d783607e612e17565b815181106123e7576123e7612e03565b60200101906001600160f81b03191690815f1a905350600101612396565b506002816040516124169190613092565b602060405180830381855afa158015612431573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906124549190612ac3565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61248b611d52565b612493612674565b61249b612684565b611de08161268c565b6124ac611d52565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612558573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061257c9190612ac3565b90506125936001600160a01b0385163330866126f8565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156125d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125fb9190612ac3565b90508181116126615760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016102e6565b61266b8282612df0565b95945050505050565b61267c611d52565b611d9b612758565b611d9b611d52565b612694611d52565b80355f805160206130ce83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556126de60608301604084016130ad565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612752908590612760565b50505050565b61245d611d52565b5f8060205f8451602086015f885af18061277f576040513d5f823e3d81fd5b50505f513d915081156127965780600114156127a3565b6001600160a01b0384163b155b1561275257604051635274afe760e01b81526001600160a01b03851660048201526024016102e6565b5080546127d890612ce7565b5f825580601f106127e7575050565b601f0160209004905f5260205f2090810190611de091905b80821115612812575f81556001016127ff565b5090565b5f60208284031215612826575f80fd5b5035919050565b6001600160a01b0381168114611de0575f80fd5b5f80828403610100811215612854575f80fd5b60e0811215612861575f80fd5b5082915060e08301356128738161282d565b809150509250929050565b803563ffffffff81168114612891575f80fd5b919050565b5f602082840312156128a6575f80fd5b6128af8261287e565b9392505050565b80356001600160401b0381168114612891575f80fd5b5f602082840312156128dc575f80fd5b6128af826128b6565b8015158114611de0575f80fd5b5f805f60608486031215612904575f80fd5b833592506020840135612916816128e5565b91506129246040850161287e565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129635761296361292d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129915761299161292d565b604052919050565b5f6001600160401b038211156129b1576129b161292d565b50601f01601f191660200190565b5f805f80608085870312156129d2575f80fd5b84359350602085013592506129e9604086016128b6565b915060608501356001600160401b03811115612a03575f80fd5b8501601f81018713612a13575f80fd5b8035612a26612a2182612999565b612969565b818152886020838501011115612a3a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612a89578181015183820152602001612a71565b50505f910152565b602081525f8251806020840152612aaf816040850160208701612a6f565b601f01601f19169190910160400192915050565b5f60208284031215612ad3575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612b1057612b10612ada565b500490565b8051612891816128e5565b5f8060408385031215612b31575f80fd5b82516001600160401b0380821115612b47575f80fd5b9084019060608287031215612b5a575f80fd5b612b62612941565b82518152602080840151612b758161282d565b82820152604084015183811115612b8a575f80fd5b80850194505087601f850112612b9e575f80fd5b83519250612bae612a2184612999565b8381528882858701011115612bc1575f80fd5b612bd084838301848801612a6f565b80604084015250819550612be5818801612b15565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b808202811582820484141761049157610491612aee565b600181811c90821680612cfb57607f821691505b602082108103612d1957634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612d7881612ce7565b806020870152604060018084165f8114612d995760018114612db557612de2565b60ff19851660408a0152604084151560051b8a01019550612de2565b895f5260205f205f5b85811015612dd95781548b8201860152908301908801612dbe565b8a016040019650505b509398975050505050505050565b8181038181111561049157610491612aee565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561049157610491612aee565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610b5257805f5260205f20601f840160051c81016020851015612f225750805b601f840160051c820191505b8181101561036c575f8155600101612f2e565b81516001600160401b03811115612f5a57612f5a61292d565b612f6e81612f688454612ce7565b84612efd565b602080601f831160018114612fa1575f8415612f8a5750858301515b5f19600386901b1c1916600185901b178555612ff8565b5f85815260208120601f198616915b82811015612fcf57888601518255948401946001909101908401612fb0565b5085821015612fec57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215613010575f80fd5b81356128af8161282d565b6001600160401b0381811683821601908082111561303b5761303b612aee565b5092915050565b6001600160401b0381811683821602808216919082811461306557613065612aee565b505092915050565b5f6001600160401b038084168061308657613086612ada565b92169190910492915050565b5f82516130a3818460208701612a6f565b9190910192915050565b5f602082840312156130bd575f80fd5b813560ff811681146128af575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 0562b8869..49da8bffe 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,13 +47,8 @@ type ValidatorManagerSettings struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ -<<<<<<< HEAD - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612f89380380612f8983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612e3c8061014d5f395ff3fe60806040526004361061008e575f3560e01c806376f786211161005757806376f786211461015a578063a3a65e4814610179578063b771b3bc14610198578063bee0a03f146101ca578063f40797d7146101e9575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063467ef06f1461010e578063620658561461012d575b5f80fd5b34801561009d575f80fd5b506100b16100ac366004612593565b6101fc565b005b3480156100be575f80fd5b506100b16100cd3660046125a9565b610308565b3480156100dd575f80fd5b506100f16100ec3660046125a9565b610500565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b506100b16101283660046125d8565b610516565b348015610138575f80fd5b5061014c61014736600461260e565b6108ed565b604051908152602001610105565b348015610165575f80fd5b506100b1610174366004612634565b610906565b348015610184575f80fd5b506100b16101933660046125d8565b610b41565b3480156101a3575f80fd5b506101b26005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101d5575f80fd5b506100b16101e43660046125a9565b610dd0565b61014c6101f7366004612701565b610ee4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba86610f06565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612e1083398151915293929190829060ff16600581111561036957610369612793565b600581111561037a5761037a612793565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561041157610411612793565b1461047b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61048c848361010001515f610f1a565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104b99084906004016127c9565b6020604051808303815f875af11580156104d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104f991906127fb565b5050505050565b5f61051064e8d4a510008361283a565b92915050565b5f5f80516020612e108339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610571573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610598919081019061286c565b91509150806105b95760405162461bcd60e51b81526004016104729061293e565b82548251146105da5760405162461bcd60e51b815260040161047290612984565b60208201516001600160a01b0316156106055760405162461bcd60e51b8152600401610472906129cd565b5f806106148460400151611137565b9150915080156106795760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610472565b5f828152600686016020526040808220815161012081019092528054829060ff1660058111156106ab576106ab612793565b60058111156106bc576106bc612793565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091505f908251600581111561075557610755612793565b0361076257506004610766565b5060055b6020808301515f9081526007890190915260408120558181600581111561078f5761078f612793565b908160058111156107a2576107a2612793565b9052505f84815260068801602052604090208251815484929190829060ff191660018360058111156107d6576107d6612793565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555184907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b5f6105106001600160401b03831664e8d4a51000612a1c565b5f80516020612e108339815191525f8315610b37576040516306f8253560e41b815263ffffffff841660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610964573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261098b919081019061286c565b91509150806109e85760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610472565b8354825114610a495760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610472565b60208201516001600160a01b031615610aba5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610472565b5f80610ac984604001516112d8565b91509150818914610b315760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610472565b93505050505b6104f985826114b0565b5f5f80516020612e108339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b9c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bc3919081019061286c565b9150915080610be45760405162461bcd60e51b81526004016104729061293e565b8254825114610c055760405162461bcd60e51b815260040161047290612984565b60208201516001600160a01b031615610c305760405162461bcd60e51b8152600401610472906129cd565b5f80610c3f8460400151611137565b9150915080610ca15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610472565b5f82815260058601602052604081208054610cbb90612a33565b9050118015610ced575060015f83815260068701602052604090205460ff166005811115610ceb57610ceb612793565b145b610d095760405162461bcd60e51b815260040161047290612a65565b5f8281526005860160205260408120610d2191612549565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612e10833981519152929190610e1890612a33565b9050118015610e4a575060015f83815260068301602052604090205460ff166005811115610e4857610e48612793565b145b610e665760405162461bcd60e51b815260040161047290612a65565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e9f9190600401612aac565b6020604051808303815f875af1158015610ebb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edf91906127fb565b505050565b5f80610eef346118a9565b9050610efd85828686611966565b95945050505050565b610f0e611dea565b610f1781611e35565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610f9357610f53816001612b36565b610f5e906008612a1c565b5081515f90839083908110610f7557610f75612b49565b60200101906001600160f81b03191690815f1a905350600101610f3f565b505f5b6004811015610ff657610faa816003612b36565b610fb5906008612a1c565b6001901c60f81b82610fc8836002612b5d565b81518110610fd857610fd8612b49565b60200101906001600160f81b03191690815f1a905350600101610f96565b505f5b60208110156110585761100d81601f612b36565b611018906008612a1c565b86901c60f81b8261102a836006612b5d565b8151811061103a5761103a612b49565b60200101906001600160f81b03191690815f1a905350600101610ff9565b505f5b60088110156110c35761106f816007612b36565b61107a906008612a1c565b6001600160401b038616901c60f81b82611095836026612b5d565b815181106110a5576110a5612b49565b60200101906001600160f81b03191690815f1a90535060010161105b565b505f5b600881101561112e576110da816007612b36565b6110e5906008612a1c565b6001600160401b038516901c60f81b8261110083602e612b5d565b8151811061111057611110612b49565b60200101906001600160f81b03191690815f1a9053506001016110c6565b50949350505050565b5f80825160271461115a5760405162461bcd60e51b815260040161047290612b70565b5f805b60028110156111a957611171816001612b36565b61117c906008612a1c565b61ffff1685828151811061119257611192612b49565b016020015160f81c901b919091179060010161115d565b5061ffff8116156111cc5760405162461bcd60e51b815260040161047290612bb9565b5f805b6004811015611227576111e3816003612b36565b6111ee906008612a1c565b63ffffffff1686611200836002612b5d565b8151811061121057611210612b49565b016020015160f81c901b91909117906001016111cf565b5063ffffffff811660021461124e5760405162461bcd60e51b815260040161047290612bfc565b5f805b60208110156112a35761126581601f612b36565b611270906008612a1c565b8761127c836006612b5d565b8151811061128c5761128c612b49565b016020015160f81c901b9190911790600101611251565b505f866026815181106112b8576112b8612b49565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146112fb5760405162461bcd60e51b815260040161047290612b70565b5f805b600281101561134a57611312816001612b36565b61131d906008612a1c565b61ffff1685828151811061133357611333612b49565b016020015160f81c901b91909117906001016112fe565b5061ffff81161561136d5760405162461bcd60e51b815260040161047290612bb9565b5f805b60048110156113c857611384816003612b36565b61138f906008612a1c565b63ffffffff16866113a1836002612b5d565b815181106113b1576113b1612b49565b016020015160f81c901b9190911790600101611370565b5063ffffffff81166004146113ef5760405162461bcd60e51b815260040161047290612bfc565b5f805b60208110156114445761140681601f612b36565b611411906008612a1c565b8761141d836006612b5d565b8151811061142d5761142d612b49565b016020015160f81c901b91909117906001016113f2565b505f805b60088110156114a35761145c816007612b36565b611467906008612a1c565b6001600160401b03168861147c836026612b5d565b8151811061148c5761148c612b49565b016020015160f81c901b9190911790600101611448565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612e1083398151915293929190829060ff16600581111561151157611511612793565b600581111561152257611522612793565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900490921661010090910152909150815160058111156115bc576115bc612793565b146116185760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610472565b60c08101516001600160a01b0316336001600160a01b0316146116925760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610472565b61169f8160400151611e78565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff191660018360058111156116eb576116eb612793565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f906117dc90869083610f1a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061180b9085906004016127c9565b6020604051808303815f875af1158015611827573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061184b91906127fb565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0082826118d682610500565b83549091506001600160401b0382161080159061190057508260010154816001600160401b031611155b61195e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610472565b949350505050565b5f61196f612019565b5f80516020612e10833981519152426001600160401b0385161180156119a957506001600160401b0384166119a7426202a300612b5d565b115b611a0b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610472565b85611a625760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610472565b5f86815260078201602052604090205415611ad05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610472565b8251603014611b375760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610472565b611b4085611e78565b5f80611b876040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612063565b5f82815260058601602052604090209193509150611ba58282612c87565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611bd29085906004016127c9565b6020604051808303815f875af1158015611bee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c1291906127fb565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611c9857611c98612793565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061195e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611e3357604051631afcd79f60e31b815260040160405180910390fd5b565b611e3d611dea565b611e468161242e565b610f1760608201356080830135611e6360c0850160a0860161260e565b611e7360e0860160c08701612d42565b61244f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612e108339815191529060ff165f03611eb6575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611efe9083612b36565b10611f1a576001600160401b0384166040830152808252611f39565b8382604001818151611f2c9190612d5d565b6001600160401b03169052505b5f826020015183604001516064611f509190612d84565b611f5a9190612daf565b600285015490915060ff9081169082161115611fd55760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610472565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161205d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146120cd5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610472565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561214457612104816001612b36565b61210f906008612a1c565b5081515f9083908390811061212657612126612b49565b60200101906001600160f81b03191690815f1a9053506001016120f0565b505f5b60048110156121a25761215b816003612b36565b612166906008612a1c565b505f82612174836002612b5d565b8151811061218457612184612b49565b60200101906001600160f81b03191690815f1a905350600101612147565b505f5b60208110156121ff57845181602081106121c1576121c1612b49565b1a60f81b826121d1836006612b5d565b815181106121e1576121e1612b49565b60200101906001600160f81b03191690815f1a9053506001016121a5565b505f5b602081101561225f578460200151816020811061222157612221612b49565b1a60f81b82612231836026612b5d565b8151811061224157612241612b49565b60200101906001600160f81b03191690815f1a905350600101612202565b505f5b60088110156122d357612276816007612b36565b612281906008612a1c565b60ff1685604001516001600160401b0316901c60f81b828260466122a59190612b5d565b815181106122b5576122b5612b49565b60200101906001600160f81b03191690815f1a905350600101612262565b505f5b603081101561233e57846080015181815181106122f5576122f5612b49565b01602001516001600160f81b0319168261231083604e612b5d565b8151811061232057612320612b49565b60200101906001600160f81b03191690815f1a9053506001016122d6565b505f5b60088110156123b057612355816007612b36565b612360906008612a1c565b60608601516001600160401b0390811691161c60f81b8261238283607e612b5d565b8151811061239257612392612b49565b60200101906001600160f81b03191690815f1a905350600101612341565b506002816040516123c19190612dd4565b602060405180830381855afa1580156123dc573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906123ff91906127fb565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612436611dea565b61243e6124bd565b6124466124cd565b610f17816124d5565b612457611dea565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6124c5611dea565b611e33612541565b611e33611dea565b6124dd611dea565b80355f80516020612e1083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556125276060830160408401612def565b600291909101805460ff191660ff90921691909117905550565b612408611dea565b50805461255590612a33565b5f825580601f10612564575050565b601f0160209004905f5260205f2090810190610f1791905b8082111561258f575f815560010161257c565b5090565b5f60e082840312156125a3575f80fd5b50919050565b5f602082840312156125b9575f80fd5b5035919050565b803563ffffffff811681146125d3575f80fd5b919050565b5f602082840312156125e8575f80fd5b6125f1826125c0565b9392505050565b80356001600160401b03811681146125d3575f80fd5b5f6020828403121561261e575f80fd5b6125f1826125f8565b8015158114610f17575f80fd5b5f805f60608486031215612646575f80fd5b83359250602084013561265881612627565b9150612666604085016125c0565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156126a5576126a561266f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156126d3576126d361266f565b604052919050565b5f6001600160401b038211156126f3576126f361266f565b50601f01601f191660200190565b5f805f60608486031215612713575f80fd5b83359250612723602085016125f8565b915060408401356001600160401b0381111561273d575f80fd5b8401601f8101861361274d575f80fd5b803561276061275b826126db565b6126ab565b818152876020838501011115612774575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156127c15781810151838201526020016127a9565b50505f910152565b602081525f82518060208401526127e78160408501602087016127a7565b601f01601f19169190910160400192915050565b5f6020828403121561280b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261284857612848612812565b500490565b6001600160a01b0381168114610f17575f80fd5b80516125d381612627565b5f806040838503121561287d575f80fd5b82516001600160401b0380821115612893575f80fd5b90840190606082870312156128a6575f80fd5b6128ae612683565b825181526020808401516128c18161284d565b828201526040840151838111156128d6575f80fd5b80850194505087601f8501126128ea575f80fd5b835192506128fa61275b846126db565b838152888285870101111561290d575f80fd5b61291c848383018488016127a7565b80604084015250819550612931818801612861565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b808202811582820484141761051057610510612826565b600181811c90821680612a4757607f821691505b6020821081036125a357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612abe81612a33565b806020870152604060018084165f8114612adf5760018114612afb57612b28565b60ff19851660408a0152604084151560051b8a01019550612b28565b895f5260205f205f5b85811015612b1f5781548b8201860152908301908801612b04565b8a016040019650505b509398975050505050505050565b8181038181111561051057610510612826565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561051057610510612826565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610edf57805f5260205f20601f840160051c81016020851015612c685750805b601f840160051c820191505b818110156104f9575f8155600101612c74565b81516001600160401b03811115612ca057612ca061266f565b612cb481612cae8454612a33565b84612c43565b602080601f831160018114612ce7575f8415612cd05750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b82811015612d1557888601518255948401946001909101908401612cf6565b5085821015612d3257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612d52575f80fd5b81356125f18161284d565b6001600160401b03818116838216019080821115612d7d57612d7d612826565b5092915050565b6001600160401b03818116838216028082169190828114612da757612da7612826565b505092915050565b5f6001600160401b0380841680612dc857612dc8612812565b92169190910492915050565b5f8251612de58184602087016127a7565b9190910192915050565b5f60208284031215612dff575f80fd5b813560ff811681146125f1575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", -======= - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161320438038061320483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130b78061014d5f395ff3fe60806040526004361061008e575f3560e01c8063a3a65e4811610057578063a3a65e481461015a578063b771b3bc14610179578063bee0a03f146101ab578063f40797d7146101ca578063fdf94a1a146101dd575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063620658561461010e57806376f786211461013b575b5f80fd5b34801561009d575f80fd5b506100b16100ac366004612825565b6101fc565b005b3480156100be575f80fd5b506100b16100cd36600461283b565b610308565b3480156100dd575f80fd5b506100f16100ec36600461283b565b6104de565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b5061012d61012836600461286d565b6104f4565b604051908152602001610105565b348015610146575f80fd5b506100b16101553660046128ad565b61050d565b348015610165575f80fd5b506100b16101743660046128e8565b61083e565b348015610184575f80fd5b506101936005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101b6575f80fd5b506100b16101c536600461283b565b610b57565b61012d6101d8366004612993565b610c66565b3480156101e8575f80fd5b506100b16101f7366004612a25565b610c88565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba8661105b565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061308b83398151915293929190829060ff16600581111561036857610368612a5a565b600581111561037957610379612a5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156103f0576103f0612a5a565b1461045a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61046a8483606001515f61106f565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610497908490600401612a90565b6020604051808303815f875af11580156104b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d79190612ac2565b5050505050565b5f6104ee64e8d4a5100083612b01565b92915050565b5f6104ee6001600160401b03831664e8d4a51000612b14565b8115610830575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610581573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105a89190810190612b4a565b915091508061060b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610451565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561064e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106729190612ac2565b8251146106d65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610451565b60208201516001600160a01b03161561074c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610451565b5f8061075b846040015161128c565b915091508188146107c85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610451565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61083983611464565b505050565b5f5f8051602061308b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610899573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108c09190810190612b4a565b91509150806108e15760405162461bcd60e51b815260040161045190612c1c565b82548251146109445760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610451565b60208201516001600160a01b0316156109b75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610451565b5f806109c684604001516117ac565b9150915080610a285760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610451565b5f82815260058601602052604081208054610a4290612c62565b9050118015610a74575060015f83815260068701602052604090205460ff166005811115610a7257610a72612a5a565b145b610a905760405162461bcd60e51b815260040161045190612c94565b5f8281526005860160205260408120610aa8916127db565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061308b833981519152929190610b9f90612c62565b9050118015610bd1575060015f83815260068301602052604090205460ff166005811115610bcf57610bcf612a5a565b145b610bed5760405162461bcd60e51b815260040161045190612c94565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c269190600401612cdb565b6020604051808303815f875af1158015610c42573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108399190612ac2565b5f80610c713461194d565b9050610c7f85828686611a0a565b95945050505050565b5f5f8051602061308b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ce3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d0a9190810190612b4a565b9150915080610d2b5760405162461bcd60e51b815260040161045190612c1c565b5f8415610daf575f610d408460400151611e41565b919350909150506001600160401b03811615610da95760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610451565b50610e25565b5f610dbd84604001516117ac565b90925090508015610e235760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610451565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610e5657610e56612a5a565b6005811115610e6757610e67612a5a565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610ef85760405162461bcd60e51b815260040161045190612d65565b5f600382516005811115610f0e57610f0e612a5a565b1480610f2c5750600282516005811115610f2a57610f2a612a5a565b145b15610f4f57506020808201515f9081526007870190915260408120556004610f53565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f8457610f84612a5a565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b61106361207c565b61106c816120c7565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110e8576110a8816001612db1565b6110b3906008612b14565b5081515f908390839081106110ca576110ca612dc4565b60200101906001600160f81b03191690815f1a905350600101611094565b505f5b600481101561114b576110ff816003612db1565b61110a906008612b14565b6001901c60f81b8261111d836002612dd8565b8151811061112d5761112d612dc4565b60200101906001600160f81b03191690815f1a9053506001016110eb565b505f5b60208110156111ad5761116281601f612db1565b61116d906008612b14565b86901c60f81b8261117f836006612dd8565b8151811061118f5761118f612dc4565b60200101906001600160f81b03191690815f1a90535060010161114e565b505f5b6008811015611218576111c4816007612db1565b6111cf906008612b14565b6001600160401b038616901c60f81b826111ea836026612dd8565b815181106111fa576111fa612dc4565b60200101906001600160f81b03191690815f1a9053506001016111b0565b505f5b60088110156112835761122f816007612db1565b61123a906008612b14565b6001600160401b038516901c60f81b8261125583602e612dd8565b8151811061126557611265612dc4565b60200101906001600160f81b03191690815f1a90535060010161121b565b50949350505050565b5f808251602e146112af5760405162461bcd60e51b815260040161045190612deb565b5f805b60028110156112fe576112c6816001612db1565b6112d1906008612b14565b61ffff168582815181106112e7576112e7612dc4565b016020015160f81c901b91909117906001016112b2565b5061ffff8116156113215760405162461bcd60e51b815260040161045190612e34565b5f805b600481101561137c57611338816003612db1565b611343906008612b14565b63ffffffff1686611355836002612dd8565b8151811061136557611365612dc4565b016020015160f81c901b9190911790600101611324565b5063ffffffff81166004146113a35760405162461bcd60e51b815260040161045190612e77565b5f805b60208110156113f8576113ba81601f612db1565b6113c5906008612b14565b876113d1836006612dd8565b815181106113e1576113e1612dc4565b016020015160f81c901b91909117906001016113a6565b505f805b600881101561145757611410816007612db1565b61141b906008612b14565b6001600160401b031688611430836026612dd8565b8151811061144057611440612dc4565b016020015160f81c901b91909117906001016113fc565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061308b83398151915293929190829060ff1660058111156114c4576114c4612a5a565b60058111156114d5576114d5612a5a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561154f5761154f612a5a565b146115ab5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610451565b60408101516001600160a01b0316336001600160a01b0316146115e05760405162461bcd60e51b815260040161045190612d65565b6115ed816080015161210a565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561163157611631612a5a565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116e89085908361106f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611717908590600401612a90565b6020604051808303815f875af1158015611733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117579190612ac2565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117cf5760405162461bcd60e51b815260040161045190612deb565b5f805b600281101561181e576117e6816001612db1565b6117f1906008612b14565b61ffff1685828151811061180757611807612dc4565b016020015160f81c901b91909117906001016117d2565b5061ffff8116156118415760405162461bcd60e51b815260040161045190612e34565b5f805b600481101561189c57611858816003612db1565b611863906008612b14565b63ffffffff1686611875836002612dd8565b8151811061188557611885612dc4565b016020015160f81c901b9190911790600101611844565b5063ffffffff81166002146118c35760405162461bcd60e51b815260040161045190612e77565b5f805b6020811015611918576118da81601f612db1565b6118e5906008612b14565b876118f1836006612dd8565b8151811061190157611901612dc4565b016020015160f81c901b91909117906001016118c6565b505f8660268151811061192d5761192d612dc4565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00828261197a826104de565b83549091506001600160401b038216108015906119a457508260010154816001600160401b031611155b611a025760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610451565b949350505050565b5f611a136122ab565b5f8051602061308b833981519152426001600160401b038516118015611a4d57506001600160401b038416611a4b426202a300612dd8565b115b611aaf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610451565b85611b065760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610451565b5f86815260078201602052604090205415611b745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610451565b8251603014611bdb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610451565b611be48561210a565b5f80611c2b6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506122f5565b5f82815260058601602052604090209193509150611c498282612f02565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611c76908590600401612a90565b6020604051808303815f875af1158015611c92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb69190612ac2565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611d2f57611d2f612a5a565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a0260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611e655760405162461bcd60e51b815260040161045190612deb565b5f805b6002811015611eb457611e7c816001612db1565b611e87906008612b14565b61ffff16868281518110611e9d57611e9d612dc4565b016020015160f81c901b9190911790600101611e68565b5061ffff811615611ed75760405162461bcd60e51b815260040161045190612e34565b5f805b6004811015611f3257611eee816003612db1565b611ef9906008612b14565b63ffffffff1687611f0b836002612dd8565b81518110611f1b57611f1b612dc4565b016020015160f81c901b9190911790600101611eda565b5063ffffffff8116600114611f595760405162461bcd60e51b815260040161045190612e77565b5f805b6020811015611fae57611f7081601f612db1565b611f7b906008612b14565b88611f87836006612dd8565b81518110611f9757611f97612dc4565b016020015160f81c901b9190911790600101611f5c565b505f805b600881101561200d57611fc6816007612db1565b611fd1906008612b14565b6001600160401b031689611fe6836026612dd8565b81518110611ff657611ff6612dc4565b016020015160f81c901b9190911790600101611fb2565b505f805b600881101561206c57612025816007612db1565b612030906008612b14565b6001600160401b03168a61204583602e612dd8565b8151811061205557612055612dc4565b016020015160f81c901b9190911790600101612011565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166120c557604051631afcd79f60e31b815260040160405180910390fd5b565b6120cf61207c565b6120d8816126c0565b61106c606082013560808301356120f560c0850160a0860161286d565b61210560e0860160c08701612fbd565b6126e1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061308b8339815191529060ff165f03612148575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121909083612db1565b106121ac576001600160401b03841660408301528082526121cb565b83826040018181516121be9190612fd8565b6001600160401b03169052505b5f8260200151836040015160646121e29190612fff565b6121ec919061302a565b600285015490915060ff90811690821611156122675760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610451565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016122ef57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461235f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610451565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156123d657612396816001612db1565b6123a1906008612b14565b5081515f908390839081106123b8576123b8612dc4565b60200101906001600160f81b03191690815f1a905350600101612382565b505f5b6004811015612434576123ed816003612db1565b6123f8906008612b14565b505f82612406836002612dd8565b8151811061241657612416612dc4565b60200101906001600160f81b03191690815f1a9053506001016123d9565b505f5b6020811015612491578451816020811061245357612453612dc4565b1a60f81b82612463836006612dd8565b8151811061247357612473612dc4565b60200101906001600160f81b03191690815f1a905350600101612437565b505f5b60208110156124f157846020015181602081106124b3576124b3612dc4565b1a60f81b826124c3836026612dd8565b815181106124d3576124d3612dc4565b60200101906001600160f81b03191690815f1a905350600101612494565b505f5b600881101561256557612508816007612db1565b612513906008612b14565b60ff1685604001516001600160401b0316901c60f81b828260466125379190612dd8565b8151811061254757612547612dc4565b60200101906001600160f81b03191690815f1a9053506001016124f4565b505f5b60308110156125d0578460800151818151811061258757612587612dc4565b01602001516001600160f81b031916826125a283604e612dd8565b815181106125b2576125b2612dc4565b60200101906001600160f81b03191690815f1a905350600101612568565b505f5b6008811015612642576125e7816007612db1565b6125f2906008612b14565b60608601516001600160401b0390811691161c60f81b8261261483607e612dd8565b8151811061262457612624612dc4565b60200101906001600160f81b03191690815f1a9053506001016125d3565b50600281604051612653919061304f565b602060405180830381855afa15801561266e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906126919190612ac2565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126c861207c565b6126d061274f565b6126d861275f565b61106c81612767565b6126e961207c565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61275761207c565b6120c56127d3565b6120c561207c565b61276f61207c565b80355f8051602061308b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556127b9606083016040840161306a565b600291909101805460ff191660ff90921691909117905550565b61269a61207c565b5080546127e790612c62565b5f825580601f106127f6575050565b601f0160209004905f5260205f209081019061106c91905b80821115612821575f815560010161280e565b5090565b5f60e08284031215612835575f80fd5b50919050565b5f6020828403121561284b575f80fd5b5035919050565b80356001600160401b0381168114612868575f80fd5b919050565b5f6020828403121561287d575f80fd5b61288682612852565b9392505050565b801515811461106c575f80fd5b803563ffffffff81168114612868575f80fd5b5f805f606084860312156128bf575f80fd5b8335925060208401356128d18161288d565b91506128df6040850161289a565b90509250925092565b5f602082840312156128f8575f80fd5b6128868261289a565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561293757612937612901565b60405290565b604051601f8201601f191681016001600160401b038111828210171561296557612965612901565b604052919050565b5f6001600160401b0382111561298557612985612901565b50601f01601f191660200190565b5f805f606084860312156129a5575f80fd5b833592506129b560208501612852565b915060408401356001600160401b038111156129cf575f80fd5b8401601f810186136129df575f80fd5b80356129f26129ed8261296d565b61293d565b818152876020838501011115612a06575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612a36575f80fd5b612a3f8361289a565b91506020830135612a4f8161288d565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612a88578181015183820152602001612a70565b50505f910152565b602081525f8251806020840152612aae816040850160208701612a6e565b601f01601f19169190910160400192915050565b5f60208284031215612ad2575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612b0f57612b0f612ad9565b500490565b80820281158282048414176104ee576104ee612aed565b6001600160a01b038116811461106c575f80fd5b80516128688161288d565b5f8060408385031215612b5b575f80fd5b82516001600160401b0380821115612b71575f80fd5b9084019060608287031215612b84575f80fd5b612b8c612915565b82518152602080840151612b9f81612b2b565b82820152604084015183811115612bb4575f80fd5b80850194505087601f850112612bc8575f80fd5b83519250612bd86129ed8461296d565b8381528882858701011115612beb575f80fd5b612bfa84838301848801612a6e565b80604084015250819550612c0f818801612b3f565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612c7657607f821691505b60208210810361283557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612ced81612c62565b806020870152604060018084165f8114612d0e5760018114612d2a57612d57565b60ff19851660408a0152604084151560051b8a01019550612d57565b895f5260205f205f5b85811015612d4e5781548b8201860152908301908801612d33565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104ee576104ee612aed565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104ee576104ee612aed565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f82111561083957805f5260205f20601f840160051c81016020851015612ee35750805b601f840160051c820191505b818110156104d7575f8155600101612eef565b81516001600160401b03811115612f1b57612f1b612901565b612f2f81612f298454612c62565b84612ebe565b602080601f831160018114612f62575f8415612f4b5750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b82811015612f9057888601518255948401946001909101908401612f71565b5085821015612fad57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612fcd575f80fd5b813561288681612b2b565b6001600160401b03818116838216019080821115612ff857612ff8612aed565b5092915050565b6001600160401b0381811683821602808216919082811461302257613022612aed565b505092915050565b5f6001600160401b038084168061304357613043612ad9565b92169190910492915050565b5f8251613060818460208701612a6e565b9190910192915050565b5f6020828403121561307a575f80fd5b813560ff81168114612886575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", ->>>>>>> staking-contract + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612f3e380380612f3e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612df18061014d5f395ff3fe60806040526004361061008e575f3560e01c806376f786211161005757806376f786211461015a578063a3a65e4814610179578063b771b3bc14610198578063bee0a03f146101ca578063f40797d7146101e9575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063467ef06f1461010e578063620658561461012d575b5f80fd5b34801561009d575f80fd5b506100b16100ac366004612548565b6101fc565b005b3480156100be575f80fd5b506100b16100cd36600461255e565b610308565b3480156100dd575f80fd5b506100f16100ec36600461255e565b6104de565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b506100b161012836600461258d565b6104f4565b348015610138575f80fd5b5061014c6101473660046125c3565b61086a565b604051908152602001610105565b348015610165575f80fd5b506100b16101743660046125e9565b610883565b348015610184575f80fd5b506100b161019336600461258d565b610bb4565b3480156101a3575f80fd5b506101b26005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101d5575f80fd5b506100b16101e436600461255e565b610e43565b61014c6101f73660046126b6565b610f52565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba86610f74565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612dc583398151915293929190829060ff16600581111561036857610368612748565b600581111561037957610379612748565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156103f0576103f0612748565b1461045a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61046a8483606001515f610f88565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061049790849060040161277e565b6020604051808303815f875af11580156104b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d791906127b0565b5050505050565b5f6104ee64e8d4a51000836127ef565b92915050565b5f5f80516020612dc58339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561054f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105769190810190612821565b91509150806105975760405162461bcd60e51b8152600401610451906128f3565b82548251146105b85760405162461bcd60e51b815260040161045190612939565b60208201516001600160a01b0316156105e35760405162461bcd60e51b815260040161045190612982565b5f806105f284604001516111a5565b9150915080156106575760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610451565b5f828152600686016020526040808220815160e081019092528054829060ff16600581111561068857610688612748565b600581111561069957610699612748565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561071257610712612748565b0361071f57506004610723565b5060055b6020808301515f9081526007890190915260408120558181600581111561074c5761074c612748565b9081600581111561075f5761075f612748565b9052505f84815260068801602052604090208251815484929190829060ff1916600183600581111561079357610793612748565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555184907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b5f6104ee6001600160401b03831664e8d4a510006129d1565b8115610ba6575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156108f7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261091e9190810190612821565b91509150806109815760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610451565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e891906127b0565b825114610a4c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610451565b60208201516001600160a01b031615610ac25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610451565b5f80610ad18460400151611346565b91509150818814610b3e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610451565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610baf8361151e565b505050565b5f5f80516020612dc58339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c0f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c369190810190612821565b9150915080610c575760405162461bcd60e51b8152600401610451906128f3565b8254825114610c785760405162461bcd60e51b815260040161045190612939565b60208201516001600160a01b031615610ca35760405162461bcd60e51b815260040161045190612982565b5f80610cb284604001516111a5565b9150915080610d145760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610451565b5f82815260058601602052604081208054610d2e906129e8565b9050118015610d60575060015f83815260068701602052604090205460ff166005811115610d5e57610d5e612748565b145b610d7c5760405162461bcd60e51b815260040161045190612a1a565b5f8281526005860160205260408120610d94916124fe565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612dc5833981519152929190610e8b906129e8565b9050118015610ebd575060015f83815260068301602052604090205460ff166005811115610ebb57610ebb612748565b145b610ed95760405162461bcd60e51b815260040161045190612a1a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610f129190600401612a61565b6020604051808303815f875af1158015610f2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610baf91906127b0565b5f80610f5d346118ab565b9050610f6b85828686611968565b95945050505050565b610f7c611d9f565b610f8581611dea565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561100157610fc1816001612aeb565b610fcc9060086129d1565b5081515f90839083908110610fe357610fe3612afe565b60200101906001600160f81b03191690815f1a905350600101610fad565b505f5b600481101561106457611018816003612aeb565b6110239060086129d1565b6001901c60f81b82611036836002612b12565b8151811061104657611046612afe565b60200101906001600160f81b03191690815f1a905350600101611004565b505f5b60208110156110c65761107b81601f612aeb565b6110869060086129d1565b86901c60f81b82611098836006612b12565b815181106110a8576110a8612afe565b60200101906001600160f81b03191690815f1a905350600101611067565b505f5b6008811015611131576110dd816007612aeb565b6110e89060086129d1565b6001600160401b038616901c60f81b82611103836026612b12565b8151811061111357611113612afe565b60200101906001600160f81b03191690815f1a9053506001016110c9565b505f5b600881101561119c57611148816007612aeb565b6111539060086129d1565b6001600160401b038516901c60f81b8261116e83602e612b12565b8151811061117e5761117e612afe565b60200101906001600160f81b03191690815f1a905350600101611134565b50949350505050565b5f8082516027146111c85760405162461bcd60e51b815260040161045190612b25565b5f805b6002811015611217576111df816001612aeb565b6111ea9060086129d1565b61ffff1685828151811061120057611200612afe565b016020015160f81c901b91909117906001016111cb565b5061ffff81161561123a5760405162461bcd60e51b815260040161045190612b6e565b5f805b600481101561129557611251816003612aeb565b61125c9060086129d1565b63ffffffff168661126e836002612b12565b8151811061127e5761127e612afe565b016020015160f81c901b919091179060010161123d565b5063ffffffff81166002146112bc5760405162461bcd60e51b815260040161045190612bb1565b5f805b6020811015611311576112d381601f612aeb565b6112de9060086129d1565b876112ea836006612b12565b815181106112fa576112fa612afe565b016020015160f81c901b91909117906001016112bf565b505f8660268151811061132657611326612afe565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146113695760405162461bcd60e51b815260040161045190612b25565b5f805b60028110156113b857611380816001612aeb565b61138b9060086129d1565b61ffff168582815181106113a1576113a1612afe565b016020015160f81c901b919091179060010161136c565b5061ffff8116156113db5760405162461bcd60e51b815260040161045190612b6e565b5f805b6004811015611436576113f2816003612aeb565b6113fd9060086129d1565b63ffffffff168661140f836002612b12565b8151811061141f5761141f612afe565b016020015160f81c901b91909117906001016113de565b5063ffffffff811660041461145d5760405162461bcd60e51b815260040161045190612bb1565b5f805b60208110156114b25761147481601f612aeb565b61147f9060086129d1565b8761148b836006612b12565b8151811061149b5761149b612afe565b016020015160f81c901b9190911790600101611460565b505f805b6008811015611511576114ca816007612aeb565b6114d59060086129d1565b6001600160401b0316886114ea836026612b12565b815181106114fa576114fa612afe565b016020015160f81c901b91909117906001016114b6565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612dc583398151915293929190829060ff16600581111561157e5761157e612748565b600581111561158f5761158f612748565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561160957611609612748565b146116655760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610451565b60408101516001600160a01b0316336001600160a01b0316146116df5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610451565b6116ec8160800151611e2d565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561173057611730612748565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906117e790859083610f88565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061181690859060040161277e565b6020604051808303815f875af1158015611832573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061185691906127b0565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0082826118d8826104de565b83549091506001600160401b0382161080159061190257508260010154816001600160401b031611155b6119605760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610451565b949350505050565b5f611971611fce565b5f80516020612dc5833981519152426001600160401b0385161180156119ab57506001600160401b0384166119a9426202a300612b12565b115b611a0d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610451565b85611a645760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610451565b5f86815260078201602052604090205415611ad25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610451565b8251603014611b395760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610451565b611b4285611e2d565b5f80611b896040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612018565b5f82815260058601602052604090209193509150611ba78282612c3c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611bd490859060040161277e565b6020604051808303815f875af1158015611bf0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c1491906127b0565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611c8d57611c8d612748565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061196060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611de857604051631afcd79f60e31b815260040160405180910390fd5b565b611df2611d9f565b611dfb816123e3565b610f8560608201356080830135611e1860c0850160a086016125c3565b611e2860e0860160c08701612cf7565b612404565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612dc58339815191529060ff165f03611e6b575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611eb39083612aeb565b10611ecf576001600160401b0384166040830152808252611eee565b8382604001818151611ee19190612d12565b6001600160401b03169052505b5f826020015183604001516064611f059190612d39565b611f0f9190612d64565b600285015490915060ff9081169082161115611f8a5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610451565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161201257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146120825760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610451565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156120f9576120b9816001612aeb565b6120c49060086129d1565b5081515f908390839081106120db576120db612afe565b60200101906001600160f81b03191690815f1a9053506001016120a5565b505f5b600481101561215757612110816003612aeb565b61211b9060086129d1565b505f82612129836002612b12565b8151811061213957612139612afe565b60200101906001600160f81b03191690815f1a9053506001016120fc565b505f5b60208110156121b4578451816020811061217657612176612afe565b1a60f81b82612186836006612b12565b8151811061219657612196612afe565b60200101906001600160f81b03191690815f1a90535060010161215a565b505f5b602081101561221457846020015181602081106121d6576121d6612afe565b1a60f81b826121e6836026612b12565b815181106121f6576121f6612afe565b60200101906001600160f81b03191690815f1a9053506001016121b7565b505f5b60088110156122885761222b816007612aeb565b6122369060086129d1565b60ff1685604001516001600160401b0316901c60f81b8282604661225a9190612b12565b8151811061226a5761226a612afe565b60200101906001600160f81b03191690815f1a905350600101612217565b505f5b60308110156122f357846080015181815181106122aa576122aa612afe565b01602001516001600160f81b031916826122c583604e612b12565b815181106122d5576122d5612afe565b60200101906001600160f81b03191690815f1a90535060010161228b565b505f5b60088110156123655761230a816007612aeb565b6123159060086129d1565b60608601516001600160401b0390811691161c60f81b8261233783607e612b12565b8151811061234757612347612afe565b60200101906001600160f81b03191690815f1a9053506001016122f6565b506002816040516123769190612d89565b602060405180830381855afa158015612391573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906123b491906127b0565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6123eb611d9f565b6123f3612472565b6123fb612482565b610f858161248a565b61240c611d9f565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61247a611d9f565b611de86124f6565b611de8611d9f565b612492611d9f565b80355f80516020612dc583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556124dc6060830160408401612da4565b600291909101805460ff191660ff90921691909117905550565b6123bd611d9f565b50805461250a906129e8565b5f825580601f10612519575050565b601f0160209004905f5260205f2090810190610f8591905b80821115612544575f8155600101612531565b5090565b5f60e08284031215612558575f80fd5b50919050565b5f6020828403121561256e575f80fd5b5035919050565b803563ffffffff81168114612588575f80fd5b919050565b5f6020828403121561259d575f80fd5b6125a682612575565b9392505050565b80356001600160401b0381168114612588575f80fd5b5f602082840312156125d3575f80fd5b6125a6826125ad565b8015158114610f85575f80fd5b5f805f606084860312156125fb575f80fd5b83359250602084013561260d816125dc565b915061261b60408501612575565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561265a5761265a612624565b60405290565b604051601f8201601f191681016001600160401b038111828210171561268857612688612624565b604052919050565b5f6001600160401b038211156126a8576126a8612624565b50601f01601f191660200190565b5f805f606084860312156126c8575f80fd5b833592506126d8602085016125ad565b915060408401356001600160401b038111156126f2575f80fd5b8401601f81018613612702575f80fd5b803561271561271082612690565b612660565b818152876020838501011115612729575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561277657818101518382015260200161275e565b50505f910152565b602081525f825180602084015261279c81604085016020870161275c565b601f01601f19169190910160400192915050565b5f602082840312156127c0575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826127fd576127fd6127c7565b500490565b6001600160a01b0381168114610f85575f80fd5b8051612588816125dc565b5f8060408385031215612832575f80fd5b82516001600160401b0380821115612848575f80fd5b908401906060828703121561285b575f80fd5b612863612638565b8251815260208084015161287681612802565b8282015260408401518381111561288b575f80fd5b80850194505087601f85011261289f575f80fd5b835192506128af61271084612690565b83815288828587010111156128c2575f80fd5b6128d18483830184880161275c565b806040840152508195506128e6818801612816565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b80820281158282048414176104ee576104ee6127db565b600181811c908216806129fc57607f821691505b60208210810361255857634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612a73816129e8565b806020870152604060018084165f8114612a945760018114612ab057612add565b60ff19851660408a0152604084151560051b8a01019550612add565b895f5260205f205f5b85811015612ad45781548b8201860152908301908801612ab9565b8a016040019650505b509398975050505050505050565b818103818111156104ee576104ee6127db565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104ee576104ee6127db565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610baf57805f5260205f20601f840160051c81016020851015612c1d5750805b601f840160051c820191505b818110156104d7575f8155600101612c29565b81516001600160401b03811115612c5557612c55612624565b612c6981612c6384546129e8565b84612bf8565b602080601f831160018114612c9c575f8415612c855750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b82811015612cca57888601518255948401946001909101908401612cab565b5085821015612ce757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612d07575f80fd5b81356125a681612802565b6001600160401b03818116838216019080821115612d3257612d326127db565b5092915050565b6001600160401b03818116838216028082169190828114612d5c57612d5c6127db565b505092915050565b5f6001600160401b0380841680612d7d57612d7d6127c7565b92169190910492915050565b5f8251612d9a81846020870161275c565b9190910192915050565b5f60208284031215612db4575f80fd5b813560ff811681146125a6575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 989bd7f7b..9b1b6164c 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -38,13 +38,8 @@ type ValidatorManagerSettings struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ -<<<<<<< HEAD - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612a85380380612a8583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6129388061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c806397fb70d41161006e57806397fb70d414610144578063a3a65e4814610157578063b771b3bc1461016a578063bee0a03f14610178578063c151c0b91461018b578063f2fde38b1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063467ef06f146100e5578063715018a6146100f85780638da5cb5b14610100575b5f80fd5b6100bd6100b836600461219c565b6101b1565b005b6100d26100cd366004612260565b6103a9565b6040519081526020015b60405180910390f35b6100bd6100f3366004612303565b6103c9565b6100bd6107a0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61015236600461219c565b6107b3565b6100bd610165366004612303565b6107c0565b61012c6005600160991b0181565b6100bd61018636600461219c565b610a4f565b6100bd610199366004612341565b610b63565b6100bd6101ac36600461237d565b610c71565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061290c83398151915293929190829060ff16600581111561021257610212612398565b600581111561022357610223612398565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102ba576102ba612398565b146103245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f610335848361010001515f610cab565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103629084906004016123ce565b6020604051808303815f875af115801561037e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103a29190612400565b5050505050565b5f6103b2610ec8565b6103be84868585610f23565b90505b949350505050565b5f5f8051602061290c8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610424573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261044b9190810190612426565b915091508061046c5760405162461bcd60e51b815260040161031b906124f8565b825482511461048d5760405162461bcd60e51b815260040161031b9061253e565b60208201516001600160a01b0316156104b85760405162461bcd60e51b815260040161031b90612587565b5f806104c784604001516113a7565b91509150801561052c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161031b565b5f828152600686016020526040808220815161012081019092528054829060ff16600581111561055e5761055e612398565b600581111561056f5761056f612398565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091505f908251600581111561060857610608612398565b0361061557506004610619565b5060055b6020808301515f9081526007890190915260408120558181600581111561064257610642612398565b9081600581111561065557610655612398565b9052505f84815260068801602052604090208251815484929190829060ff1916600183600581111561068957610689612398565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555184907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b6107a8610ec8565b6107b15f611606565b565b6107bd815f611676565b50565b5f5f8051602061290c8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561081b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108429190810190612426565b91509150806108635760405162461bcd60e51b815260040161031b906124f8565b82548251146108845760405162461bcd60e51b815260040161031b9061253e565b60208201516001600160a01b0316156108af5760405162461bcd60e51b815260040161031b90612587565b5f806108be84604001516113a7565b91509150806109205760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161031b565b5f8281526005860160205260408120805461093a906125d6565b905011801561096c575060015f83815260068701602052604090205460ff16600581111561096a5761096a612398565b145b6109885760405162461bcd60e51b815260040161031b9061260e565b5f82815260058601602052604081206109a091612152565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061290c833981519152929190610a97906125d6565b9050118015610ac9575060015f83815260068301602052604090205460ff166005811115610ac757610ac7612398565b145b610ae55760405162461bcd60e51b815260040161031b9061260e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610b1e9190600401612655565b6020604051808303815f875af1158015610b3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b5e9190612400565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ba75750825b90505f826001600160401b03166001148015610bc25750303b155b905081158015610bd0575080155b15610bee5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c1857845460ff60401b1916600160401b1785555b610c228787611a6f565b8315610c6857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610c79610ec8565b6001600160a01b038116610ca257604051631e4fbdf760e01b81525f600482015260240161031b565b6107bd81611606565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610d2457610ce48160016126f3565b610cef90600861270c565b5081515f90839083908110610d0657610d06612723565b60200101906001600160f81b03191690815f1a905350600101610cd0565b505f5b6004811015610d8757610d3b8160036126f3565b610d4690600861270c565b6001901c60f81b82610d59836002612737565b81518110610d6957610d69612723565b60200101906001600160f81b03191690815f1a905350600101610d27565b505f5b6020811015610de957610d9e81601f6126f3565b610da990600861270c565b86901c60f81b82610dbb836006612737565b81518110610dcb57610dcb612723565b60200101906001600160f81b03191690815f1a905350600101610d8a565b505f5b6008811015610e5457610e008160076126f3565b610e0b90600861270c565b6001600160401b038616901c60f81b82610e26836026612737565b81518110610e3657610e36612723565b60200101906001600160f81b03191690815f1a905350600101610dec565b505f5b6008811015610ebf57610e6b8160076126f3565b610e7690600861270c565b6001600160401b038516901c60f81b82610e9183602e612737565b81518110610ea157610ea1612723565b60200101906001600160f81b03191690815f1a905350600101610e57565b50949350505050565b33610efa7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107b15760405163118cdaa760e01b815233600482015260240161031b565b5f610f2c611a8d565b5f8051602061290c833981519152426001600160401b038516118015610f6657506001600160401b038416610f64426202a300612737565b115b610fc85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161031b565b8561101f5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161031b565b5f8681526007820160205260409020541561108d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161031b565b82516030146110f45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161031b565b6110fd85611ad7565b5f806111446040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611c78565b5f82815260058601602052604090209193509150611162828261278e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061118f9085906004016123ce565b6020604051808303815f875af11580156111ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111cf9190612400565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff1916600183600581111561125557611255612398565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103c160017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f80825160271461140c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b606482015260840161031b565b5f805b600281101561145b576114238160016126f3565b61142e90600861270c565b61ffff1685828151811061144457611444612723565b016020015160f81c901b919091179060010161140f565b5061ffff8116156114ba5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360448201526208125160ea1b606482015260840161031b565b5f805b6004811015611515576114d18160036126f3565b6114dc90600861270c565b63ffffffff16866114ee836002612737565b815181106114fe576114fe612723565b016020015160f81c901b91909117906001016114bd565b5063ffffffff811660021461157c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616044820152666765207479706560c81b606482015260840161031b565b5f805b60208110156115d15761159381601f6126f3565b61159e90600861270c565b876115aa836006612737565b815181106115ba576115ba612723565b016020015160f81c901b919091179060010161157f565b505f866026815181106115e6576115e6612723565b016020015191976001600160f81b03199092161515965090945050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061290c83398151915293929190829060ff1660058111156116d7576116d7612398565b60058111156116e8576116e8612398565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561178257611782612398565b146117de5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161031b565b60c08101516001600160a01b0316336001600160a01b0316146118585760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161031b565b6118658160400151611ad7565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff191660018360058111156118b1576118b1612398565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f906119a290869083610cab565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906119d19085906004016123ce565b6020604051808303815f875af11580156119ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a119190612400565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b611a77612043565b611a808261208c565b611a89816120ad565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611ad157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061290c8339815191529060ff165f03611b15575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611b5d90836126f3565b10611b79576001600160401b0384166040830152808252611b98565b8382604001818151611b8b919061284d565b6001600160401b03169052505b5f826020015183604001516064611baf9190612874565b611bb9919061289f565b600285015490915060ff9081169082161115611c345760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161031b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611ce25760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161031b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611d5957611d198160016126f3565b611d2490600861270c565b5081515f90839083908110611d3b57611d3b612723565b60200101906001600160f81b03191690815f1a905350600101611d05565b505f5b6004811015611db757611d708160036126f3565b611d7b90600861270c565b505f82611d89836002612737565b81518110611d9957611d99612723565b60200101906001600160f81b03191690815f1a905350600101611d5c565b505f5b6020811015611e145784518160208110611dd657611dd6612723565b1a60f81b82611de6836006612737565b81518110611df657611df6612723565b60200101906001600160f81b03191690815f1a905350600101611dba565b505f5b6020811015611e745784602001518160208110611e3657611e36612723565b1a60f81b82611e46836026612737565b81518110611e5657611e56612723565b60200101906001600160f81b03191690815f1a905350600101611e17565b505f5b6008811015611ee857611e8b8160076126f3565b611e9690600861270c565b60ff1685604001516001600160401b0316901c60f81b82826046611eba9190612737565b81518110611eca57611eca612723565b60200101906001600160f81b03191690815f1a905350600101611e77565b505f5b6030811015611f535784608001518181518110611f0a57611f0a612723565b01602001516001600160f81b03191682611f2583604e612737565b81518110611f3557611f35612723565b60200101906001600160f81b03191690815f1a905350600101611eeb565b505f5b6008811015611fc557611f6a8160076126f3565b611f7590600861270c565b60608601516001600160401b0390811691161c60f81b82611f9783607e612737565b81518110611fa757611fa7612723565b60200101906001600160f81b03191690815f1a905350600101611f56565b50600281604051611fd691906128d0565b602060405180830381855afa158015611ff1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906120149190612400565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107b157604051631afcd79f60e31b815260040160405180910390fd5b612094612043565b61209c6120be565b6120a46120ce565b6107bd816120d6565b6120b5612043565b6107bd81612142565b6120c6612043565b6107b161214a565b6107b1612043565b6120de612043565b80355f8051602061290c83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561212860608301604084016128eb565b600291909101805460ff191660ff90921691909117905550565b610c79612043565b61201d612043565b50805461215e906125d6565b5f825580601f1061216d575050565b601f0160209004905f5260205f20908101906107bd91905b80821115612198575f8155600101612185565b5090565b5f602082840312156121ac575f80fd5b5035919050565b80356001600160401b03811681146121c9575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612204576122046121ce565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612232576122326121ce565b604052919050565b5f6001600160401b03821115612252576122526121ce565b50601f01601f191660200190565b5f805f8060808587031215612273575f80fd5b61227c856121b3565b935060208501359250612291604086016121b3565b915060608501356001600160401b038111156122ab575f80fd5b8501601f810187136122bb575f80fd5b80356122ce6122c98261223a565b61220a565b8181528860208385010111156122e2575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612313575f80fd5b813563ffffffff81168114612326575f80fd5b9392505050565b6001600160a01b03811681146107bd575f80fd5b5f808284036080811215612353575f80fd5b6060811215612360575f80fd5b5082915060608301356123728161232d565b809150509250929050565b5f6020828403121561238d575f80fd5b81356123268161232d565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156123c65781810151838201526020016123ae565b50505f910152565b602081525f82518060208401526123ec8160408501602087016123ac565b601f01601f19169190910160400192915050565b5f60208284031215612410575f80fd5b5051919050565b805180151581146121c9575f80fd5b5f8060408385031215612437575f80fd5b82516001600160401b038082111561244d575f80fd5b9084019060608287031215612460575f80fd5b6124686121e2565b8251815260208084015161247b8161232d565b82820152604084015183811115612490575f80fd5b80850194505087601f8501126124a4575f80fd5b835192506124b46122c98461223a565b83815288828587010111156124c7575f80fd5b6124d6848383018488016123ac565b806040840152508195506124eb818801612417565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b600181811c908216806125ea57607f821691505b60208210810361260857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612667816125d6565b806020870152604060018084165f811461268857600181146126a4576126d1565b60ff19851660408a0152604084151560051b8a010195506126d1565b895f5260205f205f5b858110156126c85781548b82018601529083019088016126ad565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612706576127066126df565b92915050565b8082028115828204841417612706576127066126df565b634e487b7160e01b5f52603260045260245ffd5b80820180821115612706576127066126df565b601f821115610b5e57805f5260205f20601f840160051c8101602085101561276f5750805b601f840160051c820191505b818110156103a2575f815560010161277b565b81516001600160401b038111156127a7576127a76121ce565b6127bb816127b584546125d6565b8461274a565b602080601f8311600181146127ee575f84156127d75750858301515b5f19600386901b1c1916600185901b178555612845565b5f85815260208120601f198616915b8281101561281c578886015182559484019460019091019084016127fd565b508582101561283957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0381811683821601908082111561286d5761286d6126df565b5092915050565b6001600160401b03818116838216028082169190828114612897576128976126df565b505092915050565b5f6001600160401b03808416806128c457634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516128e18184602087016123ac565b9190910192915050565b5f602082840312156128fb575f80fd5b813560ff81168114612326575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", -======= - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c2a380380612c2a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612add8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b836600461227e565b6101b1565b005b6100d26100cd366004612342565b610387565b6040519081526020015b60405180910390f35b6100bd6103a7565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f36600461227e565b6103ba565b6100bd6101523660046123f8565b6103c6565b6101196005600160991b0181565b6100bd61017336600461227e565b6106df565b6100bd61018636600461242c565b6107f3565b6100bd610199366004612468565b610901565b6100bd6101ac366004612490565b61093b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612ab183398151915293929190829060ff166005811115610211576102116124ba565b6005811115610222576102226124ba565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c09091015290915081516005811115610299576102996124ba565b146103035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103138483606001515f610d0e565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103409084906004016124f0565b6020604051808303815f875af115801561035c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190612522565b5050505050565b5f610390610f2b565b61039c84868585610f86565b90505b949350505050565b6103af610f2b565b6103b85f6113bd565b565b6103c38161142d565b50565b5f5f80516020612ab18339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610421573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104489190810190612544565b91509150806104695760405162461bcd60e51b81526004016102fa90612616565b82548251146104cc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102fa565b60208201516001600160a01b03161561053f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102fa565b5f8061054e8460400151611775565b91509150806105b05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102fa565b5f828152600586016020526040812080546105ca9061265c565b90501180156105fc575060015f83815260068701602052604090205460ff1660058111156105fa576105fa6124ba565b145b6106185760405162461bcd60e51b81526004016102fa90612694565b5f828152600586016020526040812061063091612234565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612ab18339815191529291906107279061265c565b9050118015610759575060015f83815260068301602052604090205460ff166005811115610757576107576124ba565b145b6107755760405162461bcd60e51b81526004016102fa90612694565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107ae91906004016126db565b6020604051808303815f875af11580156107ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ee9190612522565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108375750825b90505f826001600160401b031660011480156108525750303b155b905081158015610860575080155b1561087e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108a857845460ff60401b1916600160401b1785555b6108b28787611916565b83156108f857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610909610f2b565b6001600160a01b03811661093257604051631e4fbdf760e01b81525f60048201526024016102fa565b6103c3816113bd565b5f5f80516020612ab18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610996573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109bd9190810190612544565b91509150806109de5760405162461bcd60e51b81526004016102fa90612616565b5f8415610a62575f6109f38460400151611934565b919350909150506001600160401b03811615610a5c5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016102fa565b50610ad8565b5f610a708460400151611775565b90925090508015610ad65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102fa565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610b0957610b096124ba565b6005811115610b1a57610b1a6124ba565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610bab5760405162461bcd60e51b81526004016102fa90612765565b5f600382516005811115610bc157610bc16124ba565b1480610bdf5750600282516005811115610bdd57610bdd6124ba565b145b15610c0257506020808201515f9081526007870190915260408120556004610c06565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610c3757610c376124ba565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610d8757610d478160016127c5565b610d529060086127de565b5081515f90839083908110610d6957610d696127f5565b60200101906001600160f81b03191690815f1a905350600101610d33565b505f5b6004811015610dea57610d9e8160036127c5565b610da99060086127de565b6001901c60f81b82610dbc836002612809565b81518110610dcc57610dcc6127f5565b60200101906001600160f81b03191690815f1a905350600101610d8a565b505f5b6020811015610e4c57610e0181601f6127c5565b610e0c9060086127de565b86901c60f81b82610e1e836006612809565b81518110610e2e57610e2e6127f5565b60200101906001600160f81b03191690815f1a905350600101610ded565b505f5b6008811015610eb757610e638160076127c5565b610e6e9060086127de565b6001600160401b038616901c60f81b82610e89836026612809565b81518110610e9957610e996127f5565b60200101906001600160f81b03191690815f1a905350600101610e4f565b505f5b6008811015610f2257610ece8160076127c5565b610ed99060086127de565b6001600160401b038516901c60f81b82610ef483602e612809565b81518110610f0457610f046127f5565b60200101906001600160f81b03191690815f1a905350600101610eba565b50949350505050565b33610f5d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103b85760405163118cdaa760e01b81523360048201526024016102fa565b5f610f8f611b6f565b5f80516020612ab1833981519152426001600160401b038516118015610fc957506001600160401b038416610fc7426202a300612809565b115b61102b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102fa565b856110825760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102fa565b5f868152600782016020526040902054156110f05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102fa565b82516030146111575760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102fa565b61116085611bb9565b5f806111a76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611d5a565b5f828152600586016020526040902091935091506111c58282612860565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906111f29085906004016124f0565b6020604051808303815f875af115801561120e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112329190612522565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff191660018360058111156112ab576112ab6124ba565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061039f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612ab183398151915293929190829060ff16600581111561148d5761148d6124ba565b600581111561149e5761149e6124ba565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c09091015290915081516005811115611518576115186124ba565b146115745760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102fa565b60408101516001600160a01b0316336001600160a01b0316146115a95760405162461bcd60e51b81526004016102fa90612765565b6115b68160800151611bb9565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156115fa576115fa6124ba565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116b190859083610d0e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116e09085906004016124f0565b6020604051808303815f875af11580156116fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117209190612522565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117985760405162461bcd60e51b81526004016102fa9061291f565b5f805b60028110156117e7576117af8160016127c5565b6117ba9060086127de565b61ffff168582815181106117d0576117d06127f5565b016020015160f81c901b919091179060010161179b565b5061ffff81161561180a5760405162461bcd60e51b81526004016102fa90612968565b5f805b6004811015611865576118218160036127c5565b61182c9060086127de565b63ffffffff168661183e836002612809565b8151811061184e5761184e6127f5565b016020015160f81c901b919091179060010161180d565b5063ffffffff811660021461188c5760405162461bcd60e51b81526004016102fa906129ab565b5f805b60208110156118e1576118a381601f6127c5565b6118ae9060086127de565b876118ba836006612809565b815181106118ca576118ca6127f5565b016020015160f81c901b919091179060010161188f565b505f866026815181106118f6576118f66127f5565b016020015191976001600160f81b03199092161515965090945050505050565b61191e612125565b6119278261216e565b6119308161218f565b5050565b5f805f83516036146119585760405162461bcd60e51b81526004016102fa9061291f565b5f805b60028110156119a75761196f8160016127c5565b61197a9060086127de565b61ffff16868281518110611990576119906127f5565b016020015160f81c901b919091179060010161195b565b5061ffff8116156119ca5760405162461bcd60e51b81526004016102fa90612968565b5f805b6004811015611a25576119e18160036127c5565b6119ec9060086127de565b63ffffffff16876119fe836002612809565b81518110611a0e57611a0e6127f5565b016020015160f81c901b91909117906001016119cd565b5063ffffffff8116600114611a4c5760405162461bcd60e51b81526004016102fa906129ab565b5f805b6020811015611aa157611a6381601f6127c5565b611a6e9060086127de565b88611a7a836006612809565b81518110611a8a57611a8a6127f5565b016020015160f81c901b9190911790600101611a4f565b505f805b6008811015611b0057611ab98160076127c5565b611ac49060086127de565b6001600160401b031689611ad9836026612809565b81518110611ae957611ae96127f5565b016020015160f81c901b9190911790600101611aa5565b505f805b6008811015611b5f57611b188160076127c5565b611b239060086127de565b6001600160401b03168a611b3883602e612809565b81518110611b4857611b486127f5565b016020015160f81c901b9190911790600101611b04565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611bb357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612ab18339815191529060ff165f03611bf7575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611c3f90836127c5565b10611c5b576001600160401b0384166040830152808252611c7a565b8382604001818151611c6d91906129f2565b6001600160401b03169052505b5f826020015183604001516064611c919190612a19565b611c9b9190612a44565b600285015490915060ff9081169082161115611d165760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102fa565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611dc45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102fa565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e3b57611dfb8160016127c5565b611e069060086127de565b5081515f90839083908110611e1d57611e1d6127f5565b60200101906001600160f81b03191690815f1a905350600101611de7565b505f5b6004811015611e9957611e528160036127c5565b611e5d9060086127de565b505f82611e6b836002612809565b81518110611e7b57611e7b6127f5565b60200101906001600160f81b03191690815f1a905350600101611e3e565b505f5b6020811015611ef65784518160208110611eb857611eb86127f5565b1a60f81b82611ec8836006612809565b81518110611ed857611ed86127f5565b60200101906001600160f81b03191690815f1a905350600101611e9c565b505f5b6020811015611f565784602001518160208110611f1857611f186127f5565b1a60f81b82611f28836026612809565b81518110611f3857611f386127f5565b60200101906001600160f81b03191690815f1a905350600101611ef9565b505f5b6008811015611fca57611f6d8160076127c5565b611f789060086127de565b60ff1685604001516001600160401b0316901c60f81b82826046611f9c9190612809565b81518110611fac57611fac6127f5565b60200101906001600160f81b03191690815f1a905350600101611f59565b505f5b60308110156120355784608001518181518110611fec57611fec6127f5565b01602001516001600160f81b0319168261200783604e612809565b81518110612017576120176127f5565b60200101906001600160f81b03191690815f1a905350600101611fcd565b505f5b60088110156120a75761204c8160076127c5565b6120579060086127de565b60608601516001600160401b0390811691161c60f81b8261207983607e612809565b81518110612089576120896127f5565b60200101906001600160f81b03191690815f1a905350600101612038565b506002816040516120b89190612a75565b602060405180830381855afa1580156120d3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906120f69190612522565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103b857604051631afcd79f60e31b815260040160405180910390fd5b612176612125565b61217e6121a0565b6121866121b0565b6103c3816121b8565b612197612125565b6103c381612224565b6121a8612125565b6103b861222c565b6103b8612125565b6121c0612125565b80355f80516020612ab183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561220a6060830160408401612a90565b600291909101805460ff191660ff90921691909117905550565b610909612125565b6120ff612125565b5080546122409061265c565b5f825580601f1061224f575050565b601f0160209004905f5260205f20908101906103c391905b8082111561227a575f8155600101612267565b5090565b5f6020828403121561228e575f80fd5b5035919050565b80356001600160401b03811681146122ab575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156122e6576122e66122b0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612314576123146122b0565b604052919050565b5f6001600160401b03821115612334576123346122b0565b50601f01601f191660200190565b5f805f8060808587031215612355575f80fd5b61235e85612295565b93506020850135925061237360408601612295565b915060608501356001600160401b0381111561238d575f80fd5b8501601f8101871361239d575f80fd5b80356123b06123ab8261231c565b6122ec565b8181528860208385010111156123c4575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146122ab575f80fd5b5f60208284031215612408575f80fd5b612411826123e5565b9392505050565b6001600160a01b03811681146103c3575f80fd5b5f80828403608081121561243e575f80fd5b606081121561244b575f80fd5b50829150606083013561245d81612418565b809150509250929050565b5f60208284031215612478575f80fd5b813561241181612418565b80151581146103c3575f80fd5b5f80604083850312156124a1575f80fd5b6124aa836123e5565b9150602083013561245d81612483565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156124e85781810151838201526020016124d0565b50505f910152565b602081525f825180602084015261250e8160408501602087016124ce565b601f01601f19169190910160400192915050565b5f60208284031215612532575f80fd5b5051919050565b80516122ab81612483565b5f8060408385031215612555575f80fd5b82516001600160401b038082111561256b575f80fd5b908401906060828703121561257e575f80fd5b6125866122c4565b8251815260208084015161259981612418565b828201526040840151838111156125ae575f80fd5b80850194505087601f8501126125c2575f80fd5b835192506125d26123ab8461231c565b83815288828587010111156125e5575f80fd5b6125f4848383018488016124ce565b80604084015250819550612609818801612539565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061267057607f821691505b60208210810361268e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546126ed8161265c565b806020870152604060018084165f811461270e576001811461272a57612757565b60ff19851660408a0152604084151560051b8a01019550612757565b895f5260205f205f5b8581101561274e5781548b8201860152908301908801612733565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b818103818111156127d8576127d86127b1565b92915050565b80820281158282048414176127d8576127d86127b1565b634e487b7160e01b5f52603260045260245ffd5b808201808211156127d8576127d86127b1565b601f8211156107ee57805f5260205f20601f840160051c810160208510156128415750805b601f840160051c820191505b81811015610380575f815560010161284d565b81516001600160401b03811115612879576128796122b0565b61288d81612887845461265c565b8461281c565b602080601f8311600181146128c0575f84156128a95750858301515b5f19600386901b1c1916600185901b178555612917565b5f85815260208120601f198616915b828110156128ee578886015182559484019460019091019084016128cf565b508582101561290b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612a1257612a126127b1565b5092915050565b6001600160401b03818116838216028082169190828114612a3c57612a3c6127b1565b505092915050565b5f6001600160401b0380841680612a6957634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a868184602087016124ce565b9190910192915050565b5f60208284031215612aa0575f80fd5b813560ff81168114612411575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", ->>>>>>> staking-contract + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161294838038061294883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6127fb8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c806397fb70d41161006e57806397fb70d414610144578063a3a65e4814610157578063b771b3bc1461016a578063bee0a03f14610178578063c151c0b91461018b578063f2fde38b1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063467ef06f146100e5578063715018a6146100f85780638da5cb5b14610100575b5f80fd5b6100bd6100b836600461205f565b6101b1565b005b6100d26100cd366004612123565b610387565b6040519081526020015b60405180910390f35b6100bd6100f33660046121c6565b6103a7565b6100bd61071d565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61015236600461205f565b610730565b6100bd6101653660046121c6565b61073c565b61012c6005600160991b0181565b6100bd61018636600461205f565b6109cb565b6100bd610199366004612204565b610adf565b6100bd6101ac366004612240565b610bed565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206127cf83398151915293929190829060ff1660058111156102115761021161225b565b60058111156102225761022261225b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102995761029961225b565b146103035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103138483606001515f610c27565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610340908490600401612291565b6020604051808303815f875af115801561035c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038091906122c3565b5050505050565b5f610390610e44565b61039c84868585610e9f565b90505b949350505050565b5f5f805160206127cf8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610402573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261042991908101906122e9565b915091508061044a5760405162461bcd60e51b81526004016102fa906123bb565b825482511461046b5760405162461bcd60e51b81526004016102fa90612401565b60208201516001600160a01b0316156104965760405162461bcd60e51b81526004016102fa9061244a565b5f806104a584604001516112d6565b91509150801561050a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102fa565b5f828152600686016020526040808220815160e081019092528054829060ff16600581111561053b5761053b61225b565b600581111561054c5761054c61225b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156105c5576105c561225b565b036105d2575060046105d6565b5060055b6020808301515f908152600789019091526040812055818160058111156105ff576105ff61225b565b908160058111156106125761061261225b565b9052505f84815260068801602052604090208251815484929190829060ff191660018360058111156106465761064661225b565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555184907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b610725610e44565b61072e5f611535565b565b610739816115a5565b50565b5f5f805160206127cf8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610797573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107be91908101906122e9565b91509150806107df5760405162461bcd60e51b81526004016102fa906123bb565b82548251146108005760405162461bcd60e51b81526004016102fa90612401565b60208201516001600160a01b03161561082b5760405162461bcd60e51b81526004016102fa9061244a565b5f8061083a84604001516112d6565b915091508061089c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102fa565b5f828152600586016020526040812080546108b690612499565b90501180156108e8575060015f83815260068701602052604090205460ff1660058111156108e6576108e661225b565b145b6109045760405162461bcd60e51b81526004016102fa906124d1565b5f828152600586016020526040812061091c91612015565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206127cf833981519152929190610a1390612499565b9050118015610a45575060015f83815260068301602052604090205460ff166005811115610a4357610a4361225b565b145b610a615760405162461bcd60e51b81526004016102fa906124d1565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a9a9190600401612518565b6020604051808303815f875af1158015610ab6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ada91906122c3565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610b235750825b90505f826001600160401b03166001148015610b3e5750303b155b905081158015610b4c575080155b15610b6a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b9457845460ff60401b1916600160401b1785555b610b9e8787611932565b8315610be457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610bf5610e44565b6001600160a01b038116610c1e57604051631e4fbdf760e01b81525f60048201526024016102fa565b61073981611535565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610ca057610c608160016125b6565b610c6b9060086125cf565b5081515f90839083908110610c8257610c826125e6565b60200101906001600160f81b03191690815f1a905350600101610c4c565b505f5b6004811015610d0357610cb78160036125b6565b610cc29060086125cf565b6001901c60f81b82610cd58360026125fa565b81518110610ce557610ce56125e6565b60200101906001600160f81b03191690815f1a905350600101610ca3565b505f5b6020811015610d6557610d1a81601f6125b6565b610d259060086125cf565b86901c60f81b82610d378360066125fa565b81518110610d4757610d476125e6565b60200101906001600160f81b03191690815f1a905350600101610d06565b505f5b6008811015610dd057610d7c8160076125b6565b610d879060086125cf565b6001600160401b038616901c60f81b82610da28360266125fa565b81518110610db257610db26125e6565b60200101906001600160f81b03191690815f1a905350600101610d68565b505f5b6008811015610e3b57610de78160076125b6565b610df29060086125cf565b6001600160401b038516901c60f81b82610e0d83602e6125fa565b81518110610e1d57610e1d6125e6565b60200101906001600160f81b03191690815f1a905350600101610dd3565b50949350505050565b33610e767f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461072e5760405163118cdaa760e01b81523360048201526024016102fa565b5f610ea8611950565b5f805160206127cf833981519152426001600160401b038516118015610ee257506001600160401b038416610ee0426202a3006125fa565b115b610f445760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102fa565b85610f9b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102fa565b5f868152600782016020526040902054156110095760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102fa565b82516030146110705760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102fa565b6110798561199a565b5f806110c06040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611b3b565b5f828152600586016020526040902091935091506110de8282612651565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061110b908590600401612291565b6020604051808303815f875af1158015611127573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061114b91906122c3565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff191660018360058111156111c4576111c461225b565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061039f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f80825160271461133b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016102fa565b5f805b600281101561138a576113528160016125b6565b61135d9060086125cf565b61ffff16858281518110611373576113736125e6565b016020015160f81c901b919091179060010161133e565b5061ffff8116156113e95760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360448201526208125160ea1b60648201526084016102fa565b5f805b6004811015611444576114008160036125b6565b61140b9060086125cf565b63ffffffff168661141d8360026125fa565b8151811061142d5761142d6125e6565b016020015160f81c901b91909117906001016113ec565b5063ffffffff81166002146114ab5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616044820152666765207479706560c81b60648201526084016102fa565b5f805b6020811015611500576114c281601f6125b6565b6114cd9060086125cf565b876114d98360066125fa565b815181106114e9576114e96125e6565b016020015160f81c901b91909117906001016114ae565b505f86602681518110611515576115156125e6565b016020015191976001600160f81b03199092161515965090945050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206127cf83398151915293929190829060ff1660058111156116055761160561225b565b60058111156116165761161661225b565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156116905761169061225b565b146116ec5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102fa565b60408101516001600160a01b0316336001600160a01b0316146117665760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016102fa565b611773816080015161199a565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156117b7576117b761225b565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061186e90859083610c27565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061189d908590600401612291565b6020604051808303815f875af11580156118b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dd91906122c3565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61193a611f06565b61194382611f4f565b61194c81611f70565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161199457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206127cf8339815191529060ff165f036119d8575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611a2090836125b6565b10611a3c576001600160401b0384166040830152808252611a5b565b8382604001818151611a4e9190612710565b6001600160401b03169052505b5f826020015183604001516064611a729190612737565b611a7c9190612762565b600285015490915060ff9081169082161115611af75760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102fa565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611ba55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102fa565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c1c57611bdc8160016125b6565b611be79060086125cf565b5081515f90839083908110611bfe57611bfe6125e6565b60200101906001600160f81b03191690815f1a905350600101611bc8565b505f5b6004811015611c7a57611c338160036125b6565b611c3e9060086125cf565b505f82611c4c8360026125fa565b81518110611c5c57611c5c6125e6565b60200101906001600160f81b03191690815f1a905350600101611c1f565b505f5b6020811015611cd75784518160208110611c9957611c996125e6565b1a60f81b82611ca98360066125fa565b81518110611cb957611cb96125e6565b60200101906001600160f81b03191690815f1a905350600101611c7d565b505f5b6020811015611d375784602001518160208110611cf957611cf96125e6565b1a60f81b82611d098360266125fa565b81518110611d1957611d196125e6565b60200101906001600160f81b03191690815f1a905350600101611cda565b505f5b6008811015611dab57611d4e8160076125b6565b611d599060086125cf565b60ff1685604001516001600160401b0316901c60f81b82826046611d7d91906125fa565b81518110611d8d57611d8d6125e6565b60200101906001600160f81b03191690815f1a905350600101611d3a565b505f5b6030811015611e165784608001518181518110611dcd57611dcd6125e6565b01602001516001600160f81b03191682611de883604e6125fa565b81518110611df857611df86125e6565b60200101906001600160f81b03191690815f1a905350600101611dae565b505f5b6008811015611e8857611e2d8160076125b6565b611e389060086125cf565b60608601516001600160401b0390811691161c60f81b82611e5a83607e6125fa565b81518110611e6a57611e6a6125e6565b60200101906001600160f81b03191690815f1a905350600101611e19565b50600281604051611e999190612793565b602060405180830381855afa158015611eb4573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611ed791906122c3565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661072e57604051631afcd79f60e31b815260040160405180910390fd5b611f57611f06565b611f5f611f81565b611f67611f91565b61073981611f99565b611f78611f06565b61073981612005565b611f89611f06565b61072e61200d565b61072e611f06565b611fa1611f06565b80355f805160206127cf83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155611feb60608301604084016127ae565b600291909101805460ff191660ff90921691909117905550565b610bf5611f06565b611ee0611f06565b50805461202190612499565b5f825580601f10612030575050565b601f0160209004905f5260205f209081019061073991905b8082111561205b575f8155600101612048565b5090565b5f6020828403121561206f575f80fd5b5035919050565b80356001600160401b038116811461208c575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156120c7576120c7612091565b60405290565b604051601f8201601f191681016001600160401b03811182821017156120f5576120f5612091565b604052919050565b5f6001600160401b0382111561211557612115612091565b50601f01601f191660200190565b5f805f8060808587031215612136575f80fd5b61213f85612076565b93506020850135925061215460408601612076565b915060608501356001600160401b0381111561216e575f80fd5b8501601f8101871361217e575f80fd5b803561219161218c826120fd565b6120cd565b8181528860208385010111156121a5575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156121d6575f80fd5b813563ffffffff811681146121e9575f80fd5b9392505050565b6001600160a01b0381168114610739575f80fd5b5f808284036080811215612216575f80fd5b6060811215612223575f80fd5b508291506060830135612235816121f0565b809150509250929050565b5f60208284031215612250575f80fd5b81356121e9816121f0565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612289578181015183820152602001612271565b50505f910152565b602081525f82518060208401526122af81604085016020870161226f565b601f01601f19169190910160400192915050565b5f602082840312156122d3575f80fd5b5051919050565b8051801515811461208c575f80fd5b5f80604083850312156122fa575f80fd5b82516001600160401b0380821115612310575f80fd5b9084019060608287031215612323575f80fd5b61232b6120a5565b8251815260208084015161233e816121f0565b82820152604084015183811115612353575f80fd5b80850194505087601f850112612367575f80fd5b8351925061237761218c846120fd565b838152888285870101111561238a575f80fd5b6123998483830184880161226f565b806040840152508195506123ae8188016122da565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b600181811c908216806124ad57607f821691505b6020821081036124cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461252a81612499565b806020870152604060018084165f811461254b576001811461256757612594565b60ff19851660408a0152604084151560051b8a01019550612594565b895f5260205f205f5b8581101561258b5781548b8201860152908301908801612570565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156125c9576125c96125a2565b92915050565b80820281158282048414176125c9576125c96125a2565b634e487b7160e01b5f52603260045260245ffd5b808201808211156125c9576125c96125a2565b601f821115610ada57805f5260205f20601f840160051c810160208510156126325750805b601f840160051c820191505b81811015610380575f815560010161263e565b81516001600160401b0381111561266a5761266a612091565b61267e816126788454612499565b8461260d565b602080601f8311600181146126b1575f841561269a5750858301515b5f19600386901b1c1916600185901b178555612708565b5f85815260208120601f198616915b828110156126df578886015182559484019460019091019084016126c0565b50858210156126fc57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115612730576127306125a2565b5092915050565b6001600160401b0381811683821602808216919082811461275a5761275a6125a2565b505092915050565b5f6001600160401b038084168061278757634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516127a481846020870161226f565b9190910192915050565b5f602082840312156127be575f80fd5b813560ff811681146121e9575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. From 1472c1a9f312de7611f9f06b8d3dc934886dfe59 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 27 Aug 2024 17:42:56 -0500 Subject: [PATCH 143/545] fix test util --- tests/utils/staking.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 5c998e18f..08e892e02 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -481,7 +481,7 @@ func callCompleteEndValidation( stakingManagerContractAddress common.Address, registrationSignedMessage *avalancheWarp.Message, ) *types.Receipt { - callData, err := abi.Pack("completeEndValidation", uint32(0), false) + callData, err := abi.Pack("completeEndValidation", uint32(0)) Expect(err).Should(BeNil()) gasFeeCap, gasTipCap, nonce := CalculateTxParams(context.Background(), subnet, PrivateKeyToAddress(sendingKey)) registrationTx := predicateutils.NewPredicateTx( From 2a0087d005dd3897a1dae43b5cec441ee2f0ae33 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 28 Aug 2024 13:59:07 -0400 Subject: [PATCH 144/545] poa migration passing --- .../ERC20TokenStakingManager.go | 9 +--- .../NativeTokenStakingManager.go | 9 +--- .../PoAValidatorManager.go | 9 +--- tests/flows/staking/poa_to_pos.go | 46 +++++++++++++++---- 4 files changed, 42 insertions(+), 31 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 2bdb43eb3..549cbaa7f 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,13 +47,8 @@ type ValidatorManagerSettings struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ -<<<<<<< HEAD - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveValidator\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516136d03803806136d083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6135838061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c806376f786211161006e57806376f7862114610161578063872fda6414610174578063a3a65e4814610187578063b771b3bc1461019a578063bee0a03f146101c0578063fdf94a1a146101d3575f80fd5b80630322ed98146100aa57806327f39ca8146100bf5780632e2194d8146100d25780636206585614610102578063687e842014610123575b5f80fd5b6100bd6100b8366004612cad565b6101e6565b005b6100bd6100cd366004612cd8565b6103de565b6100e56100e0366004612cad565b6104c2565b6040516001600160401b0390911681526020015b60405180910390f35b610115610110366004612d30565b6104d8565b6040519081526020016100f9565b610115610131366004612cad565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6100bd61016f366004612d69565b6104f1565b610115610182366004612e36565b610789565b6100bd610195366004612ed2565b6107ae565b6101a86005600160991b0181565b6040516001600160a01b0390911681526020016100f9565b6100bd6101ce366004612cad565b610ac7565b6100bd6101e1366004612eeb565b610bdb565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061355783398151915293929190829060ff16600581111561024757610247612f15565b600581111561025857610258612f15565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b90041661010090910152909150815160058111156102ef576102ef612f15565b146103595760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61036a848361010001515f61100f565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610397908490600401612f4b565b6020604051808303815f875af11580156103b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d79190612f7d565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610427575080546001600160401b03808416911610155b156104455760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610470848461122e565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6104d264e8d4a5100083612fbc565b92915050565b5f6104d26001600160401b03831664e8d4a51000612fcf565b5f8215610779576040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610541573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105689190810190612ff1565b91509150806105c55760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b6064820152608401610350565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610608573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062c9190612f7d565b82511461068b5760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b6064820152608401610350565b60208201516001600160a01b0316156106fc5760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b6064820152608401610350565b5f8061070b846040015161124c565b915091508188146107735760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b6064820152608401610350565b93505050505b6107838482611424565b50505050565b5f80610794866117d8565b90506107a285828686611898565b9150505b949350505050565b5f5f805160206135578339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610809573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108309190810190612ff1565b91509150806108515760405162461bcd60e51b8152600401610350906130c3565b82548251146108b45760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610350565b60208201516001600160a01b0316156109275760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610350565b5f806109368460400151611d1c565b91509150806109985760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610350565b5f828152600586016020526040812080546109b290613109565b90501180156109e4575060015f83815260068701602052604090205460ff1660058111156109e2576109e2612f15565b145b610a005760405162461bcd60e51b815260040161035090613141565b5f8281526005860160205260408120610a1891612c63565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613557833981519152929190610b0f90613109565b9050118015610b41575060015f83815260068301602052604090205460ff166005811115610b3f57610b3f612f15565b145b610b5d5760405162461bcd60e51b815260040161035090613141565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610b969190600401613188565b6020604051808303815f875af1158015610bb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190612f7d565b505050565b5f5f805160206135578339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c36573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c5d9190810190612ff1565b9150915080610c7e5760405162461bcd60e51b8152600401610350906130c3565b5f8415610d02575f610c938460400151611ebd565b919350909150506001600160401b03811615610cfc5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610350565b50610d78565b5f610d108460400151611d1c565b90925090508015610d765760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610350565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610daa57610daa612f15565b6005811115610dbb57610dbb612f15565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610e6c5760405162461bcd60e51b815260040161035090613212565b5f600382516005811115610e8257610e82612f15565b1480610ea05750600282516005811115610e9e57610e9e612f15565b145b15610ec357506020808201515f9081526007870190915260408120556004610ec7565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610ef857610ef8612f15565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110885761104881600161325e565b611053906008612fcf565b5081515f9083908390811061106a5761106a613271565b60200101906001600160f81b03191690815f1a905350600101611034565b505f5b60048110156110eb5761109f81600361325e565b6110aa906008612fcf565b6001901c60f81b826110bd836002613285565b815181106110cd576110cd613271565b60200101906001600160f81b03191690815f1a90535060010161108b565b505f5b602081101561114d5761110281601f61325e565b61110d906008612fcf565b86901c60f81b8261111f836006613285565b8151811061112f5761112f613271565b60200101906001600160f81b03191690815f1a9053506001016110ee565b505f5b60088110156111b85761116481600761325e565b61116f906008612fcf565b6001600160401b038616901c60f81b8261118a836026613285565b8151811061119a5761119a613271565b60200101906001600160f81b03191690815f1a905350600101611150565b505f5b6008811015611223576111cf81600761325e565b6111da906008612fcf565b6001600160401b038516901c60f81b826111f583602e613285565b8151811061120557611205613271565b60200101906001600160f81b03191690815f1a9053506001016111bb565b5090505b9392505050565b6112366120f8565b61123f82612143565b61124881612189565b5050565b5f808251602e1461126f5760405162461bcd60e51b815260040161035090613298565b5f805b60028110156112be5761128681600161325e565b611291906008612fcf565b61ffff168582815181106112a7576112a7613271565b016020015160f81c901b9190911790600101611272565b5061ffff8116156112e15760405162461bcd60e51b8152600401610350906132e1565b5f805b600481101561133c576112f881600361325e565b611303906008612fcf565b63ffffffff1686611315836002613285565b8151811061132557611325613271565b016020015160f81c901b91909117906001016112e4565b5063ffffffff81166004146113635760405162461bcd60e51b815260040161035090613324565b5f805b60208110156113b85761137a81601f61325e565b611385906008612fcf565b87611391836006613285565b815181106113a1576113a1613271565b016020015160f81c901b9190911790600101611366565b505f805b6008811015611417576113d081600761325e565b6113db906008612fcf565b6001600160401b0316886113f0836026613285565b8151811061140057611400613271565b016020015160f81c901b91909117906001016113bc565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061355783398151915293929190829060ff16600581111561148557611485612f15565b600581111561149657611496612f15565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561153057611530612f15565b1461158c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610350565b60c08101516001600160a01b0316336001600160a01b0316146115c15760405162461bcd60e51b815260040161035090613212565b6115ce816040015161223d565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff1916600183600581111561161a5761161a612f15565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f9061170b9086908361100f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061173a908590600401612f4b565b6020604051808303815f875af1158015611756573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177a9190612f7d565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081611804846123de565b90505f611810826104c2565b83549091506001600160401b0382161080159061183a57508260010154816001600160401b031611155b6107a65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610350565b5f6118a1612414565b5f80516020613557833981519152426001600160401b0385161180156118db57506001600160401b0384166118d9426202a300613285565b115b61193d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610350565b856119945760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610350565b5f86815260078201602052604090205415611a025760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610350565b8251603014611a695760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610350565b611a728561223d565b5f80611ab96040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061245e565b5f82815260058601602052604090209193509150611ad782826133af565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b04908590600401612f4b565b6020604051808303815f875af1158015611b20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b449190612f7d565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611bca57611bca612f15565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506107a660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611d3f5760405162461bcd60e51b815260040161035090613298565b5f805b6002811015611d8e57611d5681600161325e565b611d61906008612fcf565b61ffff16858281518110611d7757611d77613271565b016020015160f81c901b9190911790600101611d42565b5061ffff811615611db15760405162461bcd60e51b8152600401610350906132e1565b5f805b6004811015611e0c57611dc881600361325e565b611dd3906008612fcf565b63ffffffff1686611de5836002613285565b81518110611df557611df5613271565b016020015160f81c901b9190911790600101611db4565b5063ffffffff8116600214611e335760405162461bcd60e51b815260040161035090613324565b5f805b6020811015611e8857611e4a81601f61325e565b611e55906008612fcf565b87611e61836006613285565b81518110611e7157611e71613271565b016020015160f81c901b9190911790600101611e36565b505f86602681518110611e9d57611e9d613271565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611ee15760405162461bcd60e51b815260040161035090613298565b5f805b6002811015611f3057611ef881600161325e565b611f03906008612fcf565b61ffff16868281518110611f1957611f19613271565b016020015160f81c901b9190911790600101611ee4565b5061ffff811615611f535760405162461bcd60e51b8152600401610350906132e1565b5f805b6004811015611fae57611f6a81600361325e565b611f75906008612fcf565b63ffffffff1687611f87836002613285565b81518110611f9757611f97613271565b016020015160f81c901b9190911790600101611f56565b5063ffffffff8116600114611fd55760405162461bcd60e51b815260040161035090613324565b5f805b602081101561202a57611fec81601f61325e565b611ff7906008612fcf565b88612003836006613285565b8151811061201357612013613271565b016020015160f81c901b9190911790600101611fd8565b505f805b60088110156120895761204281600761325e565b61204d906008612fcf565b6001600160401b031689612062836026613285565b8151811061207257612072613271565b016020015160f81c901b919091179060010161202e565b505f805b60088110156120e8576120a181600761325e565b6120ac906008612fcf565b6001600160401b03168a6120c183602e613285565b815181106120d1576120d1613271565b016020015160f81c901b919091179060010161208d565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661214157604051631afcd79f60e31b815260040160405180910390fd5b565b61214b6120f8565b61215481612829565b6121866060820135608083013561217160c0850160a08601612d30565b61218160e0860160c0870161346e565b61284a565b50565b6121916120f8565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661221d5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610350565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206135578339815191529060ff165f0361227b575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906122c3908361325e565b106122df576001600160401b03841660408301528082526122fe565b83826040018181516122f19190613489565b6001600160401b03169052505b5f82602001518360400151606461231591906134b0565b61231f91906134db565b600285015490915060ff908116908216111561239a5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610350565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104d2827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906128b8565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161245857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124c85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610350565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561253f576124ff81600161325e565b61250a906008612fcf565b5081515f9083908390811061252157612521613271565b60200101906001600160f81b03191690815f1a9053506001016124eb565b505f5b600481101561259d5761255681600361325e565b612561906008612fcf565b505f8261256f836002613285565b8151811061257f5761257f613271565b60200101906001600160f81b03191690815f1a905350600101612542565b505f5b60208110156125fa57845181602081106125bc576125bc613271565b1a60f81b826125cc836006613285565b815181106125dc576125dc613271565b60200101906001600160f81b03191690815f1a9053506001016125a0565b505f5b602081101561265a578460200151816020811061261c5761261c613271565b1a60f81b8261262c836026613285565b8151811061263c5761263c613271565b60200101906001600160f81b03191690815f1a9053506001016125fd565b505f5b60088110156126ce5761267181600761325e565b61267c906008612fcf565b60ff1685604001516001600160401b0316901c60f81b828260466126a09190613285565b815181106126b0576126b0613271565b60200101906001600160f81b03191690815f1a90535060010161265d565b505f5b603081101561273957846080015181815181106126f0576126f0613271565b01602001516001600160f81b0319168261270b83604e613285565b8151811061271b5761271b613271565b60200101906001600160f81b03191690815f1a9053506001016126d1565b505f5b60088110156127ab5761275081600761325e565b61275b906008612fcf565b60608601516001600160401b0390811691161c60f81b8261277d83607e613285565b8151811061278d5761278d613271565b60200101906001600160f81b03191690815f1a90535060010161273c565b506002816040516127bc9190613500565b602060405180830381855afa1580156127d7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127fa9190612f7d565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6128316120f8565b612839612a1a565b612841612a2a565b61218681612a32565b6128526120f8565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156128fe573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129229190612f7d565b90506129396001600160a01b038516333086612a9e565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561297d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129a19190612f7d565b9050818111612a075760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610350565b612a11828261325e565b95945050505050565b612a226120f8565b612141612af8565b6121416120f8565b612a3a6120f8565b80355f8051602061355783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612a84606083016040840161351b565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610783908590612b00565b6128036120f8565b5f612b146001600160a01b03841683612b61565b905080515f14158015612b38575080806020019051810190612b36919061353b565b155b15610bd657604051635274afe760e01b81526001600160a01b0384166004820152602401610350565b606061122783835f845f80856001600160a01b03168486604051612b859190613500565b5f6040518083038185875af1925050503d805f8114612bbf576040519150601f19603f3d011682016040523d82523d5f602084013e612bc4565b606091505b5091509150612bd4868383612bde565b9695505050505050565b606082612bf357612bee82612c3a565b611227565b8151158015612c0a57506001600160a01b0384163b155b15612c3357604051639996b31560e01b81526001600160a01b0385166004820152602401610350565b5080611227565b805115612c4a5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054612c6f90613109565b5f825580601f10612c7e575050565b601f0160209004905f5260205f209081019061218691905b80821115612ca9575f8155600101612c96565b5090565b5f60208284031215612cbd575f80fd5b5035919050565b6001600160a01b0381168114612186575f80fd5b5f80828403610100811215612ceb575f80fd5b60e0811215612cf8575f80fd5b5082915060e0830135612d0a81612cc4565b809150509250929050565b80356001600160401b0381168114612d2b575f80fd5b919050565b5f60208284031215612d40575f80fd5b61122782612d15565b8015158114612186575f80fd5b803563ffffffff81168114612d2b575f80fd5b5f805f60608486031215612d7b575f80fd5b833592506020840135612d8d81612d49565b9150612d9b60408501612d56565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612dda57612dda612da4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e0857612e08612da4565b604052919050565b5f6001600160401b03821115612e2857612e28612da4565b50601f01601f191660200190565b5f805f8060808587031215612e49575f80fd5b8435935060208501359250612e6060408601612d15565b915060608501356001600160401b03811115612e7a575f80fd5b8501601f81018713612e8a575f80fd5b8035612e9d612e9882612e10565b612de0565b818152886020838501011115612eb1575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612ee2575f80fd5b61122782612d56565b5f8060408385031215612efc575f80fd5b612f0583612d56565b91506020830135612d0a81612d49565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612f43578181015183820152602001612f2b565b50505f910152565b602081525f8251806020840152612f69816040850160208701612f29565b601f01601f19169190910160400192915050565b5f60208284031215612f8d575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612fca57612fca612f94565b500490565b80820281158282048414176104d2576104d2612fa8565b8051612d2b81612d49565b5f8060408385031215613002575f80fd5b82516001600160401b0380821115613018575f80fd5b908401906060828703121561302b575f80fd5b613033612db8565b8251815260208084015161304681612cc4565b8282015260408401518381111561305b575f80fd5b80850194505087601f85011261306f575f80fd5b8351925061307f612e9884612e10565b8381528882858701011115613092575f80fd5b6130a184838301848801612f29565b806040840152508195506130b6818801612fe6565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061311d57607f821691505b60208210810361313b57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461319a81613109565b806020870152604060018084165f81146131bb57600181146131d757613204565b60ff19851660408a0152604084151560051b8a01019550613204565b895f5260205f205f5b858110156131fb5781548b82018601529083019088016131e0565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104d2576104d2612fa8565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104d2576104d2612fa8565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610bd657805f5260205f20601f840160051c810160208510156133905750805b601f840160051c820191505b818110156103d7575f815560010161339c565b81516001600160401b038111156133c8576133c8612da4565b6133dc816133d68454613109565b8461336b565b602080601f83116001811461340f575f84156133f85750858301515b5f19600386901b1c1916600185901b178555613466565b5f85815260208120601f198616915b8281101561343d5788860151825594840194600190910190840161341e565b508582101561345a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561347e575f80fd5b813561122781612cc4565b6001600160401b038181168382160190808211156134a9576134a9612fa8565b5092915050565b6001600160401b038181168382160280821691908281146134d3576134d3612fa8565b505092915050565b5f6001600160401b03808416806134f4576134f4612f94565b92169190910492915050565b5f8251613511818460208701612f29565b9190910192915050565b5f6020828403121561352b575f80fd5b813560ff81168114611227575f80fd5b5f6020828403121561354b575f80fd5b815161122781612d4956fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", -======= - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161350238038061350283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6133b58061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c757806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612af3565b61019d565b005b6100b26100c2366004612b1e565b610373565b6100da6100d5366004612af3565b610481565b6040516001600160401b0390911681526020015b60405180910390f35b61010a610105366004612b76565b610497565b6040519081526020016100ee565b6100b2610126366004612bb6565b6104b0565b61010a610139366004612c83565b6107e1565b6100b261014c366004612d1f565b610806565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610185366004612af3565b610b1f565b6100b2610198366004612d38565b610c2e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061338983398151915293929190829060ff1660058111156101fd576101fd612d62565b600581111561020e5761020e612d62565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561028557610285612d62565b146102ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6102ff8483606001515f611001565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061032c908490600401612d98565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c9190612dca565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103b75750825b90505f826001600160401b031660011480156103d25750303b155b9050811580156103e0575080155b156103fe5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561042857845460ff60401b1916600160401b1785555b610432878761121e565b831561047857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61049164e8d4a5100083612e09565b92915050565b5f6104916001600160401b03831664e8d4a51000612e1c565b81156107d3575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610524573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261054b9190810190612e3e565b91509150806105ae5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016102e6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106159190612dca565b8251146106795760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016102e6565b60208201516001600160a01b0316156106ef5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016102e6565b5f806106fe846040015161123c565b9150915081881461076b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016102e6565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6107dc83611414565b505050565b5f806107ec8661175c565b90506107fa8582868661181c565b9150505b949350505050565b5f5f805160206133898339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610861573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108889190810190612e3e565b91509150806108a95760405162461bcd60e51b81526004016102e690612f10565b825482511461090c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102e6565b60208201516001600160a01b03161561097f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102e6565b5f8061098e8460400151611c53565b91509150806109f05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102e6565b5f82815260058601602052604081208054610a0a90612f56565b9050118015610a3c575060015f83815260068701602052604090205460ff166005811115610a3a57610a3a612d62565b145b610a585760405162461bcd60e51b81526004016102e690612f8e565b5f8281526005860160205260408120610a7091612aa9565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613389833981519152929190610b6790612f56565b9050118015610b99575060015f83815260068301602052604090205460ff166005811115610b9757610b97612d62565b145b610bb55760405162461bcd60e51b81526004016102e690612f8e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bee9190600401612fd5565b6020604051808303815f875af1158015610c0a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107dc9190612dca565b5f5f805160206133898339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c89573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cb09190810190612e3e565b9150915080610cd15760405162461bcd60e51b81526004016102e690612f10565b5f8415610d55575f610ce68460400151611df4565b919350909150506001600160401b03811615610d4f5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016102e6565b50610dcb565b5f610d638460400151611c53565b90925090508015610dc95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102e6565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610dfc57610dfc612d62565b6005811115610e0d57610e0d612d62565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610e9e5760405162461bcd60e51b81526004016102e69061305f565b5f600382516005811115610eb457610eb4612d62565b1480610ed25750600282516005811115610ed057610ed0612d62565b145b15610ef557506020808201515f9081526007870190915260408120556004610ef9565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f2a57610f2a612d62565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561107a5761103a8160016130ab565b611045906008612e1c565b5081515f9083908390811061105c5761105c6130be565b60200101906001600160f81b03191690815f1a905350600101611026565b505f5b60048110156110dd576110918160036130ab565b61109c906008612e1c565b6001901c60f81b826110af8360026130d2565b815181106110bf576110bf6130be565b60200101906001600160f81b03191690815f1a90535060010161107d565b505f5b602081101561113f576110f481601f6130ab565b6110ff906008612e1c565b86901c60f81b826111118360066130d2565b81518110611121576111216130be565b60200101906001600160f81b03191690815f1a9053506001016110e0565b505f5b60088110156111aa576111568160076130ab565b611161906008612e1c565b6001600160401b038616901c60f81b8261117c8360266130d2565b8151811061118c5761118c6130be565b60200101906001600160f81b03191690815f1a905350600101611142565b505f5b6008811015611215576111c18160076130ab565b6111cc906008612e1c565b6001600160401b038516901c60f81b826111e783602e6130d2565b815181106111f7576111f76130be565b60200101906001600160f81b03191690815f1a9053506001016111ad565b50949350505050565b61122661202f565b61122f8261207a565b611238816120c0565b5050565b5f808251602e1461125f5760405162461bcd60e51b81526004016102e6906130e5565b5f805b60028110156112ae576112768160016130ab565b611281906008612e1c565b61ffff16858281518110611297576112976130be565b016020015160f81c901b9190911790600101611262565b5061ffff8116156112d15760405162461bcd60e51b81526004016102e69061312e565b5f805b600481101561132c576112e88160036130ab565b6112f3906008612e1c565b63ffffffff16866113058360026130d2565b81518110611315576113156130be565b016020015160f81c901b91909117906001016112d4565b5063ffffffff81166004146113535760405162461bcd60e51b81526004016102e690613171565b5f805b60208110156113a85761136a81601f6130ab565b611375906008612e1c565b876113818360066130d2565b81518110611391576113916130be565b016020015160f81c901b9190911790600101611356565b505f805b6008811015611407576113c08160076130ab565b6113cb906008612e1c565b6001600160401b0316886113e08360266130d2565b815181106113f0576113f06130be565b016020015160f81c901b91909117906001016113ac565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061338983398151915293929190829060ff16600581111561147457611474612d62565b600581111561148557611485612d62565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156114ff576114ff612d62565b1461155b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102e6565b60408101516001600160a01b0316336001600160a01b0316146115905760405162461bcd60e51b81526004016102e69061305f565b61159d8160800151612174565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156115e1576115e1612d62565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061169890859083611001565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116c7908590600401612d98565b6020604051808303815f875af11580156116e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117079190612dca565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008161178884612315565b90505f61179482610481565b83549091506001600160401b038216108015906117be57508260010154816001600160401b031611155b6107fe5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016102e6565b5f61182561234b565b5f80516020613389833981519152426001600160401b03851611801561185f57506001600160401b03841661185d426202a3006130d2565b115b6118c15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102e6565b856119185760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102e6565b5f868152600782016020526040902054156119865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102e6565b82516030146119ed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102e6565b6119f685612174565b5f80611a3d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612395565b5f82815260058601602052604090209193509150611a5b82826131fc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611a88908590600401612d98565b6020604051808303815f875af1158015611aa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac89190612dca565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611b4157611b41612d62565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506107fe60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611c765760405162461bcd60e51b81526004016102e6906130e5565b5f805b6002811015611cc557611c8d8160016130ab565b611c98906008612e1c565b61ffff16858281518110611cae57611cae6130be565b016020015160f81c901b9190911790600101611c79565b5061ffff811615611ce85760405162461bcd60e51b81526004016102e69061312e565b5f805b6004811015611d4357611cff8160036130ab565b611d0a906008612e1c565b63ffffffff1686611d1c8360026130d2565b81518110611d2c57611d2c6130be565b016020015160f81c901b9190911790600101611ceb565b5063ffffffff8116600214611d6a5760405162461bcd60e51b81526004016102e690613171565b5f805b6020811015611dbf57611d8181601f6130ab565b611d8c906008612e1c565b87611d988360066130d2565b81518110611da857611da86130be565b016020015160f81c901b9190911790600101611d6d565b505f86602681518110611dd457611dd46130be565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611e185760405162461bcd60e51b81526004016102e6906130e5565b5f805b6002811015611e6757611e2f8160016130ab565b611e3a906008612e1c565b61ffff16868281518110611e5057611e506130be565b016020015160f81c901b9190911790600101611e1b565b5061ffff811615611e8a5760405162461bcd60e51b81526004016102e69061312e565b5f805b6004811015611ee557611ea18160036130ab565b611eac906008612e1c565b63ffffffff1687611ebe8360026130d2565b81518110611ece57611ece6130be565b016020015160f81c901b9190911790600101611e8d565b5063ffffffff8116600114611f0c5760405162461bcd60e51b81526004016102e690613171565b5f805b6020811015611f6157611f2381601f6130ab565b611f2e906008612e1c565b88611f3a8360066130d2565b81518110611f4a57611f4a6130be565b016020015160f81c901b9190911790600101611f0f565b505f805b6008811015611fc057611f798160076130ab565b611f84906008612e1c565b6001600160401b031689611f998360266130d2565b81518110611fa957611fa96130be565b016020015160f81c901b9190911790600101611f65565b505f805b600881101561201f57611fd88160076130ab565b611fe3906008612e1c565b6001600160401b03168a611ff883602e6130d2565b81518110612008576120086130be565b016020015160f81c901b9190911790600101611fc4565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661207857604051631afcd79f60e31b815260040160405180910390fd5b565b61208261202f565b61208b81612760565b6120bd606082013560808301356120a860c0850160a08601612b76565b6120b860e0860160c087016132bb565b612781565b50565b6120c861202f565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166121545760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016102e6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206133898339815191529060ff165f036121b2575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121fa90836130ab565b10612216576001600160401b0384166040830152808252612235565b838260400181815161222891906132d6565b6001600160401b03169052505b5f82602001518360400151606461224c91906132fd565b6122569190613328565b600285015490915060ff90811690821611156122d15760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102e6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610491827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906127ef565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161238f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146123ff5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102e6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612476576124368160016130ab565b612441906008612e1c565b5081515f90839083908110612458576124586130be565b60200101906001600160f81b03191690815f1a905350600101612422565b505f5b60048110156124d45761248d8160036130ab565b612498906008612e1c565b505f826124a68360026130d2565b815181106124b6576124b66130be565b60200101906001600160f81b03191690815f1a905350600101612479565b505f5b602081101561253157845181602081106124f3576124f36130be565b1a60f81b826125038360066130d2565b81518110612513576125136130be565b60200101906001600160f81b03191690815f1a9053506001016124d7565b505f5b60208110156125915784602001518160208110612553576125536130be565b1a60f81b826125638360266130d2565b81518110612573576125736130be565b60200101906001600160f81b03191690815f1a905350600101612534565b505f5b6008811015612605576125a88160076130ab565b6125b3906008612e1c565b60ff1685604001516001600160401b0316901c60f81b828260466125d791906130d2565b815181106125e7576125e76130be565b60200101906001600160f81b03191690815f1a905350600101612594565b505f5b60308110156126705784608001518181518110612627576126276130be565b01602001516001600160f81b0319168261264283604e6130d2565b81518110612652576126526130be565b60200101906001600160f81b03191690815f1a905350600101612608565b505f5b60088110156126e2576126878160076130ab565b612692906008612e1c565b60608601516001600160401b0390811691161c60f81b826126b483607e6130d2565b815181106126c4576126c46130be565b60200101906001600160f81b03191690815f1a905350600101612673565b506002816040516126f3919061334d565b602060405180830381855afa15801561270e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127319190612dca565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61276861202f565b612770612951565b612778612961565b6120bd81612969565b61278961202f565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128599190612dca565b90506128706001600160a01b0385163330866129d5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156128b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128d89190612dca565b905081811161293e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016102e6565b61294882826130ab565b95945050505050565b61295961202f565b612078612a35565b61207861202f565b61297161202f565b80355f8051602061338983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556129bb6060830160408401613368565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a2f908590612a3d565b50505050565b61273a61202f565b5f8060205f8451602086015f885af180612a5c576040513d5f823e3d81fd5b50505f513d91508115612a73578060011415612a80565b6001600160a01b0384163b155b15612a2f57604051635274afe760e01b81526001600160a01b03851660048201526024016102e6565b508054612ab590612f56565b5f825580601f10612ac4575050565b601f0160209004905f5260205f20908101906120bd91905b80821115612aef575f8155600101612adc565b5090565b5f60208284031215612b03575f80fd5b5035919050565b6001600160a01b03811681146120bd575f80fd5b5f80828403610100811215612b31575f80fd5b60e0811215612b3e575f80fd5b5082915060e0830135612b5081612b0a565b809150509250929050565b80356001600160401b0381168114612b71575f80fd5b919050565b5f60208284031215612b86575f80fd5b612b8f82612b5b565b9392505050565b80151581146120bd575f80fd5b803563ffffffff81168114612b71575f80fd5b5f805f60608486031215612bc8575f80fd5b833592506020840135612bda81612b96565b9150612be860408501612ba3565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612c2757612c27612bf1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612c5557612c55612bf1565b604052919050565b5f6001600160401b03821115612c7557612c75612bf1565b50601f01601f191660200190565b5f805f8060808587031215612c96575f80fd5b8435935060208501359250612cad60408601612b5b565b915060608501356001600160401b03811115612cc7575f80fd5b8501601f81018713612cd7575f80fd5b8035612cea612ce582612c5d565b612c2d565b818152886020838501011115612cfe575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612d2f575f80fd5b612b8f82612ba3565b5f8060408385031215612d49575f80fd5b612d5283612ba3565b91506020830135612b5081612b96565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612d90578181015183820152602001612d78565b50505f910152565b602081525f8251806020840152612db6816040850160208701612d76565b601f01601f19169190910160400192915050565b5f60208284031215612dda575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612e1757612e17612de1565b500490565b808202811582820484141761049157610491612df5565b8051612b7181612b96565b5f8060408385031215612e4f575f80fd5b82516001600160401b0380821115612e65575f80fd5b9084019060608287031215612e78575f80fd5b612e80612c05565b82518152602080840151612e9381612b0a565b82820152604084015183811115612ea8575f80fd5b80850194505087601f850112612ebc575f80fd5b83519250612ecc612ce584612c5d565b8381528882858701011115612edf575f80fd5b612eee84838301848801612d76565b80604084015250819550612f03818801612e33565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612f6a57607f821691505b602082108103612f8857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612fe781612f56565b806020870152604060018084165f8114613008576001811461302457613051565b60ff19851660408a0152604084151560051b8a01019550613051565b895f5260205f205f5b858110156130485781548b820186015290830190880161302d565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561049157610491612df5565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561049157610491612df5565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f8211156107dc57805f5260205f20601f840160051c810160208510156131dd5750805b601f840160051c820191505b8181101561036c575f81556001016131e9565b81516001600160401b0381111561321557613215612bf1565b613229816132238454612f56565b846131b8565b602080601f83116001811461325c575f84156132455750858301515b5f19600386901b1c1916600185901b1785556132b3565b5f85815260208120601f198616915b8281101561328a5788860151825594840194600190910190840161326b565b50858210156132a757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156132cb575f80fd5b8135612b8f81612b0a565b6001600160401b038181168382160190808211156132f6576132f6612df5565b5092915050565b6001600160401b0381811683821602808216919082811461332057613320612df5565b505092915050565b5f6001600160401b038084168061334157613341612de1565b92169190910492915050565b5f825161335e818460208701612d76565b9190910192915050565b5f60208284031215613378575f80fd5b813560ff81168114612b8f575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", ->>>>>>> origin/staking-contract + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveValidator\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161362e38038061362e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6134e18061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c806376f786211161006e57806376f7862114610161578063872fda6414610174578063a3a65e4814610187578063b771b3bc1461019a578063bee0a03f146101c0578063fdf94a1a146101d3575f80fd5b80630322ed98146100aa57806327f39ca8146100bf5780632e2194d8146100d25780636206585614610102578063687e842014610123575b5f80fd5b6100bd6100b8366004612c0b565b6101e6565b005b6100bd6100cd366004612c36565b6103bc565b6100e56100e0366004612c0b565b6104a0565b6040516001600160401b0390911681526020015b60405180910390f35b610115610110366004612c8e565b6104b6565b6040519081526020016100f9565b610115610131366004612c0b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6100bd61016f366004612cc7565b6104cf565b610115610182366004612d94565b610800565b6100bd610195366004612e30565b610825565b6101a86005600160991b0181565b6040516001600160a01b0390911681526020016100f9565b6100bd6101ce366004612c0b565b610b3e565b6100bd6101e1366004612e49565b610c4d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206134b583398151915293929190829060ff16600581111561024657610246612e73565b600581111561025757610257612e73565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102ce576102ce612e73565b146103385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103488483606001515f611020565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610375908490600401612ea9565b6020604051808303815f875af1158015610391573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b59190612edb565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610405575080546001600160401b03808416911610155b156104235760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561044e848461123f565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6104b064e8d4a5100083612f1a565b92915050565b5f6104b06001600160401b03831664e8d4a51000612f2d565b81156107f2575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610543573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261056a9190810190612f4f565b91509150806105cd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161032f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610610573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106349190612edb565b8251146106985760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161032f565b60208201516001600160a01b03161561070e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161032f565b5f8061071d846040015161125d565b9150915081881461078a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161032f565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6107fb83611435565b505050565b5f8061080b8661177d565b90506108198582868661183d565b9150505b949350505050565b5f5f805160206134b58339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610880573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108a79190810190612f4f565b91509150806108c85760405162461bcd60e51b815260040161032f90613021565b825482511461092b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161032f565b60208201516001600160a01b03161561099e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161032f565b5f806109ad8460400151611c74565b9150915080610a0f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161032f565b5f82815260058601602052604081208054610a2990613067565b9050118015610a5b575060015f83815260068701602052604090205460ff166005811115610a5957610a59612e73565b145b610a775760405162461bcd60e51b815260040161032f9061309f565b5f8281526005860160205260408120610a8f91612bc1565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206134b5833981519152929190610b8690613067565b9050118015610bb8575060015f83815260068301602052604090205460ff166005811115610bb657610bb6612e73565b145b610bd45760405162461bcd60e51b815260040161032f9061309f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c0d91906004016130e6565b6020604051808303815f875af1158015610c29573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fb9190612edb565b5f5f805160206134b58339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ca8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ccf9190810190612f4f565b9150915080610cf05760405162461bcd60e51b815260040161032f90613021565b5f8415610d74575f610d058460400151611e15565b919350909150506001600160401b03811615610d6e5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161032f565b50610dea565b5f610d828460400151611c74565b90925090508015610de85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161032f565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610e1b57610e1b612e73565b6005811115610e2c57610e2c612e73565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610ebd5760405162461bcd60e51b815260040161032f90613170565b5f600382516005811115610ed357610ed3612e73565b1480610ef15750600282516005811115610eef57610eef612e73565b145b15610f1457506020808201515f9081526007870190915260408120556004610f18565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f4957610f49612e73565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611099576110598160016131bc565b611064906008612f2d565b5081515f9083908390811061107b5761107b6131cf565b60200101906001600160f81b03191690815f1a905350600101611045565b505f5b60048110156110fc576110b08160036131bc565b6110bb906008612f2d565b6001901c60f81b826110ce8360026131e3565b815181106110de576110de6131cf565b60200101906001600160f81b03191690815f1a90535060010161109c565b505f5b602081101561115e5761111381601f6131bc565b61111e906008612f2d565b86901c60f81b826111308360066131e3565b81518110611140576111406131cf565b60200101906001600160f81b03191690815f1a9053506001016110ff565b505f5b60088110156111c9576111758160076131bc565b611180906008612f2d565b6001600160401b038616901c60f81b8261119b8360266131e3565b815181106111ab576111ab6131cf565b60200101906001600160f81b03191690815f1a905350600101611161565b505f5b6008811015611234576111e08160076131bc565b6111eb906008612f2d565b6001600160401b038516901c60f81b8261120683602e6131e3565b81518110611216576112166131cf565b60200101906001600160f81b03191690815f1a9053506001016111cc565b5090505b9392505050565b611247612050565b6112508261209b565b611259816120e1565b5050565b5f808251602e146112805760405162461bcd60e51b815260040161032f906131f6565b5f805b60028110156112cf576112978160016131bc565b6112a2906008612f2d565b61ffff168582815181106112b8576112b86131cf565b016020015160f81c901b9190911790600101611283565b5061ffff8116156112f25760405162461bcd60e51b815260040161032f9061323f565b5f805b600481101561134d576113098160036131bc565b611314906008612f2d565b63ffffffff16866113268360026131e3565b81518110611336576113366131cf565b016020015160f81c901b91909117906001016112f5565b5063ffffffff81166004146113745760405162461bcd60e51b815260040161032f90613282565b5f805b60208110156113c95761138b81601f6131bc565b611396906008612f2d565b876113a28360066131e3565b815181106113b2576113b26131cf565b016020015160f81c901b9190911790600101611377565b505f805b6008811015611428576113e18160076131bc565b6113ec906008612f2d565b6001600160401b0316886114018360266131e3565b81518110611411576114116131cf565b016020015160f81c901b91909117906001016113cd565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206134b583398151915293929190829060ff16600581111561149557611495612e73565b60058111156114a6576114a6612e73565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561152057611520612e73565b1461157c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161032f565b60408101516001600160a01b0316336001600160a01b0316146115b15760405162461bcd60e51b815260040161032f90613170565b6115be8160800151612195565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561160257611602612e73565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116b990859083611020565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116e8908590600401612ea9565b6020604051808303815f875af1158015611704573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117289190612edb565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00816117a984612336565b90505f6117b5826104a0565b83549091506001600160401b038216108015906117df57508260010154816001600160401b031611155b61081d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161032f565b5f61184661236c565b5f805160206134b5833981519152426001600160401b03851611801561188057506001600160401b03841661187e426202a3006131e3565b115b6118e25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161032f565b856119395760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161032f565b5f868152600782016020526040902054156119a75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161032f565b8251603014611a0e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161032f565b611a1785612195565b5f80611a5e6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506123b6565b5f82815260058601602052604090209193509150611a7c828261330d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611aa9908590600401612ea9565b6020604051808303815f875af1158015611ac5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae99190612edb565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611b6257611b62612e73565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061081d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611c975760405162461bcd60e51b815260040161032f906131f6565b5f805b6002811015611ce657611cae8160016131bc565b611cb9906008612f2d565b61ffff16858281518110611ccf57611ccf6131cf565b016020015160f81c901b9190911790600101611c9a565b5061ffff811615611d095760405162461bcd60e51b815260040161032f9061323f565b5f805b6004811015611d6457611d208160036131bc565b611d2b906008612f2d565b63ffffffff1686611d3d8360026131e3565b81518110611d4d57611d4d6131cf565b016020015160f81c901b9190911790600101611d0c565b5063ffffffff8116600214611d8b5760405162461bcd60e51b815260040161032f90613282565b5f805b6020811015611de057611da281601f6131bc565b611dad906008612f2d565b87611db98360066131e3565b81518110611dc957611dc96131cf565b016020015160f81c901b9190911790600101611d8e565b505f86602681518110611df557611df56131cf565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611e395760405162461bcd60e51b815260040161032f906131f6565b5f805b6002811015611e8857611e508160016131bc565b611e5b906008612f2d565b61ffff16868281518110611e7157611e716131cf565b016020015160f81c901b9190911790600101611e3c565b5061ffff811615611eab5760405162461bcd60e51b815260040161032f9061323f565b5f805b6004811015611f0657611ec28160036131bc565b611ecd906008612f2d565b63ffffffff1687611edf8360026131e3565b81518110611eef57611eef6131cf565b016020015160f81c901b9190911790600101611eae565b5063ffffffff8116600114611f2d5760405162461bcd60e51b815260040161032f90613282565b5f805b6020811015611f8257611f4481601f6131bc565b611f4f906008612f2d565b88611f5b8360066131e3565b81518110611f6b57611f6b6131cf565b016020015160f81c901b9190911790600101611f30565b505f805b6008811015611fe157611f9a8160076131bc565b611fa5906008612f2d565b6001600160401b031689611fba8360266131e3565b81518110611fca57611fca6131cf565b016020015160f81c901b9190911790600101611f86565b505f805b600881101561204057611ff98160076131bc565b612004906008612f2d565b6001600160401b03168a61201983602e6131e3565b81518110612029576120296131cf565b016020015160f81c901b9190911790600101611fe5565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661209957604051631afcd79f60e31b815260040160405180910390fd5b565b6120a3612050565b6120ac81612781565b6120de606082013560808301356120c960c0850160a08601612c8e565b6120d960e0860160c087016133cc565b6127a2565b50565b6120e9612050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166121755760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161032f565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206134b58339815191529060ff165f036121d3575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061221b90836131bc565b10612237576001600160401b0384166040830152808252612256565b838260400181815161224991906133e7565b6001600160401b03169052505b5f82602001518360400151606461226d919061340e565b6122779190613439565b600285015490915060ff90811690821611156122f25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161032f565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104b0827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690612810565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016123b057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124205760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161032f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612497576124578160016131bc565b612462906008612f2d565b5081515f90839083908110612479576124796131cf565b60200101906001600160f81b03191690815f1a905350600101612443565b505f5b60048110156124f5576124ae8160036131bc565b6124b9906008612f2d565b505f826124c78360026131e3565b815181106124d7576124d76131cf565b60200101906001600160f81b03191690815f1a90535060010161249a565b505f5b60208110156125525784518160208110612514576125146131cf565b1a60f81b826125248360066131e3565b81518110612534576125346131cf565b60200101906001600160f81b03191690815f1a9053506001016124f8565b505f5b60208110156125b25784602001518160208110612574576125746131cf565b1a60f81b826125848360266131e3565b81518110612594576125946131cf565b60200101906001600160f81b03191690815f1a905350600101612555565b505f5b6008811015612626576125c98160076131bc565b6125d4906008612f2d565b60ff1685604001516001600160401b0316901c60f81b828260466125f891906131e3565b81518110612608576126086131cf565b60200101906001600160f81b03191690815f1a9053506001016125b5565b505f5b60308110156126915784608001518181518110612648576126486131cf565b01602001516001600160f81b0319168261266383604e6131e3565b81518110612673576126736131cf565b60200101906001600160f81b03191690815f1a905350600101612629565b505f5b6008811015612703576126a88160076131bc565b6126b3906008612f2d565b60608601516001600160401b0390811691161c60f81b826126d583607e6131e3565b815181106126e5576126e56131cf565b60200101906001600160f81b03191690815f1a905350600101612694565b50600281604051612714919061345e565b602060405180830381855afa15801561272f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127529190612edb565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612789612050565b612791612972565b612799612982565b6120de8161298a565b6127aa612050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612856573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287a9190612edb565b90506128916001600160a01b0385163330866129f6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156128d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128f99190612edb565b905081811161295f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161032f565b61296982826131bc565b95945050505050565b61297a612050565b612099612a56565b612099612050565b612992612050565b80355f805160206134b583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556129dc6060830160408401613479565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a50908590612a5e565b50505050565b61275b612050565b5f612a726001600160a01b03841683612abf565b905080515f14158015612a96575080806020019051810190612a949190613499565b155b156107fb57604051635274afe760e01b81526001600160a01b038416600482015260240161032f565b606061123883835f845f80856001600160a01b03168486604051612ae3919061345e565b5f6040518083038185875af1925050503d805f8114612b1d576040519150601f19603f3d011682016040523d82523d5f602084013e612b22565b606091505b5091509150612b32868383612b3c565b9695505050505050565b606082612b5157612b4c82612b98565b611238565b8151158015612b6857506001600160a01b0384163b155b15612b9157604051639996b31560e01b81526001600160a01b038516600482015260240161032f565b5080611238565b805115612ba85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054612bcd90613067565b5f825580601f10612bdc575050565b601f0160209004905f5260205f20908101906120de91905b80821115612c07575f8155600101612bf4565b5090565b5f60208284031215612c1b575f80fd5b5035919050565b6001600160a01b03811681146120de575f80fd5b5f80828403610100811215612c49575f80fd5b60e0811215612c56575f80fd5b5082915060e0830135612c6881612c22565b809150509250929050565b80356001600160401b0381168114612c89575f80fd5b919050565b5f60208284031215612c9e575f80fd5b61123882612c73565b80151581146120de575f80fd5b803563ffffffff81168114612c89575f80fd5b5f805f60608486031215612cd9575f80fd5b833592506020840135612ceb81612ca7565b9150612cf960408501612cb4565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612d3857612d38612d02565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612d6657612d66612d02565b604052919050565b5f6001600160401b03821115612d8657612d86612d02565b50601f01601f191660200190565b5f805f8060808587031215612da7575f80fd5b8435935060208501359250612dbe60408601612c73565b915060608501356001600160401b03811115612dd8575f80fd5b8501601f81018713612de8575f80fd5b8035612dfb612df682612d6e565b612d3e565b818152886020838501011115612e0f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612e40575f80fd5b61123882612cb4565b5f8060408385031215612e5a575f80fd5b612e6383612cb4565b91506020830135612c6881612ca7565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612ea1578181015183820152602001612e89565b50505f910152565b602081525f8251806020840152612ec7816040850160208701612e87565b601f01601f19169190910160400192915050565b5f60208284031215612eeb575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612f2857612f28612ef2565b500490565b80820281158282048414176104b0576104b0612f06565b8051612c8981612ca7565b5f8060408385031215612f60575f80fd5b82516001600160401b0380821115612f76575f80fd5b9084019060608287031215612f89575f80fd5b612f91612d16565b82518152602080840151612fa481612c22565b82820152604084015183811115612fb9575f80fd5b80850194505087601f850112612fcd575f80fd5b83519250612fdd612df684612d6e565b8381528882858701011115612ff0575f80fd5b612fff84838301848801612e87565b80604084015250819550613014818801612f44565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061307b57607f821691505b60208210810361309957634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546130f881613067565b806020870152604060018084165f8114613119576001811461313557613162565b60ff19851660408a0152604084151560051b8a01019550613162565b895f5260205f205f5b858110156131595781548b820186015290830190880161313e565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104b0576104b0612f06565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104b0576104b0612f06565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f8211156107fb57805f5260205f20601f840160051c810160208510156132ee5750805b601f840160051c820191505b818110156103b5575f81556001016132fa565b81516001600160401b0381111561332657613326612d02565b61333a816133348454613067565b846132c9565b602080601f83116001811461336d575f84156133565750858301515b5f19600386901b1c1916600185901b1785556133c4565b5f85815260208120601f198616915b8281101561339b5788860151825594840194600190910190840161337c565b50858210156133b857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156133dc575f80fd5b813561123881612c22565b6001600160401b0381811683821601908082111561340757613407612f06565b5092915050565b6001600160401b0381811683821602808216919082811461343157613431612f06565b505092915050565b5f6001600160401b038084168061345257613452612ef2565b92169190910492915050565b5f825161346f818460208701612e87565b9190910192915050565b5f60208284031215613489575f80fd5b813560ff81168114611238575f80fd5b5f602082840312156134a9575f80fd5b815161123881612ca756fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index eaab4e724..004e49c04 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,13 +47,8 @@ type ValidatorManagerSettings struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ -<<<<<<< HEAD - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveValidator\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516132db3803806132db83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61318e8061014d5f395ff3fe608060405260043610610099575f3560e01c806376f786211161006257806376f7862114610190578063a3a65e48146101af578063b771b3bc146101ce578063bee0a03f14610200578063f40797d71461021f578063fdf94a1a14610232575f80fd5b8062e417921461009d5780630322ed98146100be5780632e2194d8146100dd5780636206585614610119578063687e842014610146575b5f80fd5b3480156100a8575f80fd5b506100bc6100b73660046128f8565b610251565b005b3480156100c9575f80fd5b506100bc6100d836600461290e565b610333565b3480156100e8575f80fd5b506100fc6100f736600461290e565b61052b565b6040516001600160401b0390911681526020015b60405180910390f35b348015610124575f80fd5b50610138610133366004612940565b610541565b604051908152602001610110565b348015610151575f80fd5b5061013861016036600461290e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b34801561019b575f80fd5b506100bc6101aa366004612980565b61055a565b3480156101ba575f80fd5b506100bc6101c93660046129bb565b6107f2565b3480156101d9575f80fd5b506101e86005600160991b0181565b6040516001600160a01b039091168152602001610110565b34801561020b575f80fd5b506100bc61021a36600461290e565b610b0b565b61013861022d366004612a66565b610c1f565b34801561023d575f80fd5b506100bc61024c366004612af8565b610c41565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061029a575080546001600160401b03808416911610155b156102b85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556102e283611075565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061316283398151915293929190829060ff16600581111561039457610394612b2d565b60058111156103a5576103a5612b2d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561043c5761043c612b2d565b146104a65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6104b7848361010001515f611089565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104e4908490600401612b63565b6020604051808303815f875af1158015610500573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105249190612b95565b5050505050565b5f61053b64e8d4a5100083612bd4565b92915050565b5f61053b6001600160401b03831664e8d4a51000612be7565b5f82156107e2576040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156105aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105d19190810190612c1d565b915091508061062e5760405162461bcd60e51b8152602060048201526024808201527f5374616b696e674d616e616765723a20496e76616c69642077617270206d65736044820152637361676560e01b606482015260840161049d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610671573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106959190612b95565b8251146106f45760405162461bcd60e51b815260206004820152602760248201527f5374616b696e674d616e616765723a20496e76616c696420736f7572636520636044820152661a185a5b88125160ca1b606482015260840161049d565b60208201516001600160a01b0316156107655760405162461bcd60e51b815260206004820152602d60248201527f5374616b696e674d616e616765723a20496e76616c6964206f726967696e207360448201526c656e646572206164647265737360981b606482015260840161049d565b5f8061077484604001516112a6565b915091508188146107dc5760405162461bcd60e51b815260206004820152602c60248201527f5374616b696e674d616e616765723a20496e76616c696420757074696d65207660448201526b185b1a59185d1a5bdb88125160a21b606482015260840161049d565b93505050505b6107ec848261147e565b50505050565b5f5f805160206131628339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561084d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108749190810190612c1d565b91509150806108955760405162461bcd60e51b815260040161049d90612cef565b82548251146108f85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161049d565b60208201516001600160a01b03161561096b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161049d565b5f8061097a8460400151611832565b91509150806109dc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161049d565b5f828152600586016020526040812080546109f690612d35565b9050118015610a28575060015f83815260068701602052604090205460ff166005811115610a2657610a26612b2d565b145b610a445760405162461bcd60e51b815260040161049d90612d67565b5f8281526005860160205260408120610a5c916128ae565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613162833981519152929190610b5390612d35565b9050118015610b85575060015f83815260068301602052604090205460ff166005811115610b8357610b83612b2d565b145b610ba15760405162461bcd60e51b815260040161049d90612d67565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bda9190600401612dae565b6020604051808303815f875af1158015610bf6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c1a9190612b95565b505050565b5f80610c2a346119d3565b9050610c3885828686611a90565b95945050505050565b5f5f805160206131628339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c9c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cc39190810190612c1d565b9150915080610ce45760405162461bcd60e51b815260040161049d90612cef565b5f8415610d68575f610cf98460400151611f14565b919350909150506001600160401b03811615610d625760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161049d565b50610dde565b5f610d768460400151611832565b90925090508015610ddc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161049d565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610e1057610e10612b2d565b6005811115610e2157610e21612b2d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610ed25760405162461bcd60e51b815260040161049d90612e38565b5f600382516005811115610ee857610ee8612b2d565b1480610f065750600282516005811115610f0457610f04612b2d565b145b15610f2957506020808201515f9081526007870190915260408120556004610f2d565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f5e57610f5e612b2d565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b61107d61214f565b6110868161219a565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611102576110c2816001612e84565b6110cd906008612be7565b5081515f908390839081106110e4576110e4612e97565b60200101906001600160f81b03191690815f1a9053506001016110ae565b505f5b600481101561116557611119816003612e84565b611124906008612be7565b6001901c60f81b82611137836002612eab565b8151811061114757611147612e97565b60200101906001600160f81b03191690815f1a905350600101611105565b505f5b60208110156111c75761117c81601f612e84565b611187906008612be7565b86901c60f81b82611199836006612eab565b815181106111a9576111a9612e97565b60200101906001600160f81b03191690815f1a905350600101611168565b505f5b6008811015611232576111de816007612e84565b6111e9906008612be7565b6001600160401b038616901c60f81b82611204836026612eab565b8151811061121457611214612e97565b60200101906001600160f81b03191690815f1a9053506001016111ca565b505f5b600881101561129d57611249816007612e84565b611254906008612be7565b6001600160401b038516901c60f81b8261126f83602e612eab565b8151811061127f5761127f612e97565b60200101906001600160f81b03191690815f1a905350600101611235565b50949350505050565b5f808251602e146112c95760405162461bcd60e51b815260040161049d90612ebe565b5f805b6002811015611318576112e0816001612e84565b6112eb906008612be7565b61ffff1685828151811061130157611301612e97565b016020015160f81c901b91909117906001016112cc565b5061ffff81161561133b5760405162461bcd60e51b815260040161049d90612f07565b5f805b600481101561139657611352816003612e84565b61135d906008612be7565b63ffffffff168661136f836002612eab565b8151811061137f5761137f612e97565b016020015160f81c901b919091179060010161133e565b5063ffffffff81166004146113bd5760405162461bcd60e51b815260040161049d90612f4a565b5f805b6020811015611412576113d481601f612e84565b6113df906008612be7565b876113eb836006612eab565b815181106113fb576113fb612e97565b016020015160f81c901b91909117906001016113c0565b505f805b60088110156114715761142a816007612e84565b611435906008612be7565b6001600160401b03168861144a836026612eab565b8151811061145a5761145a612e97565b016020015160f81c901b9190911790600101611416565b5090969095509350505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f8051602061316283398151915293929190829060ff1660058111156114df576114df612b2d565b60058111156114f0576114f0612b2d565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561158a5761158a612b2d565b146115e65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161049d565b60c08101516001600160a01b0316336001600160a01b03161461161b5760405162461bcd60e51b815260040161049d90612e38565b61162881604001516121dd565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff1916600183600581111561167457611674612b2d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f9061176590869083611089565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611794908590600401612b63565b6020604051808303815f875af11580156117b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d49190612b95565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f8082516027146118555760405162461bcd60e51b815260040161049d90612ebe565b5f805b60028110156118a45761186c816001612e84565b611877906008612be7565b61ffff1685828151811061188d5761188d612e97565b016020015160f81c901b9190911790600101611858565b5061ffff8116156118c75760405162461bcd60e51b815260040161049d90612f07565b5f805b6004811015611922576118de816003612e84565b6118e9906008612be7565b63ffffffff16866118fb836002612eab565b8151811061190b5761190b612e97565b016020015160f81c901b91909117906001016118ca565b5063ffffffff81166002146119495760405162461bcd60e51b815260040161049d90612f4a565b5f805b602081101561199e5761196081601f612e84565b61196b906008612be7565b87611977836006612eab565b8151811061198757611987612e97565b016020015160f81c901b919091179060010161194c565b505f866026815181106119b3576119b3612e97565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008282611a008261052b565b83549091506001600160401b03821610801590611a2a57508260010154816001600160401b031611155b611a885760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161049d565b949350505050565b5f611a9961237e565b5f80516020613162833981519152426001600160401b038516118015611ad357506001600160401b038416611ad1426202a300612eab565b115b611b355760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161049d565b85611b8c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161049d565b5f86815260078201602052604090205415611bfa5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161049d565b8251603014611c615760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161049d565b611c6a856121dd565b5f80611cb16040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506123c8565b5f82815260058601602052604090209193509150611ccf8282612fd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611cfc908590600401612b63565b6020604051808303815f875af1158015611d18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3c9190612b95565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff19166001836005811115611dc257611dc2612b2d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a8860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611f385760405162461bcd60e51b815260040161049d90612ebe565b5f805b6002811015611f8757611f4f816001612e84565b611f5a906008612be7565b61ffff16868281518110611f7057611f70612e97565b016020015160f81c901b9190911790600101611f3b565b5061ffff811615611faa5760405162461bcd60e51b815260040161049d90612f07565b5f805b600481101561200557611fc1816003612e84565b611fcc906008612be7565b63ffffffff1687611fde836002612eab565b81518110611fee57611fee612e97565b016020015160f81c901b9190911790600101611fad565b5063ffffffff811660011461202c5760405162461bcd60e51b815260040161049d90612f4a565b5f805b60208110156120815761204381601f612e84565b61204e906008612be7565b8861205a836006612eab565b8151811061206a5761206a612e97565b016020015160f81c901b919091179060010161202f565b505f805b60088110156120e057612099816007612e84565b6120a4906008612be7565b6001600160401b0316896120b9836026612eab565b815181106120c9576120c9612e97565b016020015160f81c901b9190911790600101612085565b505f805b600881101561213f576120f8816007612e84565b612103906008612be7565b6001600160401b03168a61211883602e612eab565b8151811061212857612128612e97565b016020015160f81c901b91909117906001016120e4565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661219857604051631afcd79f60e31b815260040160405180910390fd5b565b6121a261214f565b6121ab81612793565b611086606082013560808301356121c860c0850160a08601612940565b6121d860e0860160c08701613094565b6127b4565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206131628339815191529060ff165f0361221b575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906122639083612e84565b1061227f576001600160401b038416604083015280825261229e565b838260400181815161229191906130af565b6001600160401b03169052505b5f8260200151836040015160646122b591906130d6565b6122bf9190613101565b600285015490915060ff908116908216111561233a5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161049d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016123c257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124325760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161049d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156124a957612469816001612e84565b612474906008612be7565b5081515f9083908390811061248b5761248b612e97565b60200101906001600160f81b03191690815f1a905350600101612455565b505f5b6004811015612507576124c0816003612e84565b6124cb906008612be7565b505f826124d9836002612eab565b815181106124e9576124e9612e97565b60200101906001600160f81b03191690815f1a9053506001016124ac565b505f5b6020811015612564578451816020811061252657612526612e97565b1a60f81b82612536836006612eab565b8151811061254657612546612e97565b60200101906001600160f81b03191690815f1a90535060010161250a565b505f5b60208110156125c4578460200151816020811061258657612586612e97565b1a60f81b82612596836026612eab565b815181106125a6576125a6612e97565b60200101906001600160f81b03191690815f1a905350600101612567565b505f5b6008811015612638576125db816007612e84565b6125e6906008612be7565b60ff1685604001516001600160401b0316901c60f81b8282604661260a9190612eab565b8151811061261a5761261a612e97565b60200101906001600160f81b03191690815f1a9053506001016125c7565b505f5b60308110156126a3578460800151818151811061265a5761265a612e97565b01602001516001600160f81b0319168261267583604e612eab565b8151811061268557612685612e97565b60200101906001600160f81b03191690815f1a90535060010161263b565b505f5b6008811015612715576126ba816007612e84565b6126c5906008612be7565b60608601516001600160401b0390811691161c60f81b826126e783607e612eab565b815181106126f7576126f7612e97565b60200101906001600160f81b03191690815f1a9053506001016126a6565b506002816040516127269190613126565b602060405180830381855afa158015612741573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127649190612b95565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61279b61214f565b6127a3612822565b6127ab612832565b6110868161283a565b6127bc61214f565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61282a61214f565b6121986128a6565b61219861214f565b61284261214f565b80355f8051602061316283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561288c6060830160408401613141565b600291909101805460ff191660ff90921691909117905550565b61276d61214f565b5080546128ba90612d35565b5f825580601f106128c9575050565b601f0160209004905f5260205f209081019061108691905b808211156128f4575f81556001016128e1565b5090565b5f60e08284031215612908575f80fd5b50919050565b5f6020828403121561291e575f80fd5b5035919050565b80356001600160401b038116811461293b575f80fd5b919050565b5f60208284031215612950575f80fd5b61295982612925565b9392505050565b8015158114611086575f80fd5b803563ffffffff8116811461293b575f80fd5b5f805f60608486031215612992575f80fd5b8335925060208401356129a481612960565b91506129b26040850161296d565b90509250925092565b5f602082840312156129cb575f80fd5b6129598261296d565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612a0a57612a0a6129d4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612a3857612a386129d4565b604052919050565b5f6001600160401b03821115612a5857612a586129d4565b50601f01601f191660200190565b5f805f60608486031215612a78575f80fd5b83359250612a8860208501612925565b915060408401356001600160401b03811115612aa2575f80fd5b8401601f81018613612ab2575f80fd5b8035612ac5612ac082612a40565b612a10565b818152876020838501011115612ad9575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612b09575f80fd5b612b128361296d565b91506020830135612b2281612960565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612b5b578181015183820152602001612b43565b50505f910152565b602081525f8251806020840152612b81816040850160208701612b41565b601f01601f19169190910160400192915050565b5f60208284031215612ba5575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612be257612be2612bac565b500490565b808202811582820484141761053b5761053b612bc0565b6001600160a01b0381168114611086575f80fd5b805161293b81612960565b5f8060408385031215612c2e575f80fd5b82516001600160401b0380821115612c44575f80fd5b9084019060608287031215612c57575f80fd5b612c5f6129e8565b82518152602080840151612c7281612bfe565b82820152604084015183811115612c87575f80fd5b80850194505087601f850112612c9b575f80fd5b83519250612cab612ac084612a40565b8381528882858701011115612cbe575f80fd5b612ccd84838301848801612b41565b80604084015250819550612ce2818801612c12565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612d4957607f821691505b60208210810361290857634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612dc081612d35565b806020870152604060018084165f8114612de15760018114612dfd57612e2a565b60ff19851660408a0152604084151560051b8a01019550612e2a565b895f5260205f205f5b85811015612e215781548b8201860152908301908801612e06565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561053b5761053b612bc0565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561053b5761053b612bc0565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610c1a57805f5260205f20601f840160051c81016020851015612fb65750805b601f840160051c820191505b81811015610524575f8155600101612fc2565b81516001600160401b03811115612fee57612fee6129d4565b61300281612ffc8454612d35565b84612f91565b602080601f831160018114613035575f841561301e5750858301515b5f19600386901b1c1916600185901b17855561308c565b5f85815260208120601f198616915b8281101561306357888601518255948401946001909101908401613044565b508582101561308057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156130a4575f80fd5b813561295981612bfe565b6001600160401b038181168382160190808211156130cf576130cf612bc0565b5092915050565b6001600160401b038181168382160280821691908281146130f9576130f9612bc0565b505092915050565b5f6001600160401b038084168061311a5761311a612bac565b92169190910492915050565b5f8251613137818460208701612b41565b9190910192915050565b5f60208284031215613151575f80fd5b813560ff81168114612959575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", -======= - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161320438038061320483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130b78061014d5f395ff3fe60806040526004361061008e575f3560e01c8063a3a65e4811610057578063a3a65e481461015a578063b771b3bc14610179578063bee0a03f146101ab578063f40797d7146101ca578063fdf94a1a146101dd575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063620658561461010e57806376f786211461013b575b5f80fd5b34801561009d575f80fd5b506100b16100ac366004612825565b6101fc565b005b3480156100be575f80fd5b506100b16100cd36600461283b565b610308565b3480156100dd575f80fd5b506100f16100ec36600461283b565b6104de565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b5061012d61012836600461286d565b6104f4565b604051908152602001610105565b348015610146575f80fd5b506100b16101553660046128ad565b61050d565b348015610165575f80fd5b506100b16101743660046128e8565b61083e565b348015610184575f80fd5b506101936005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101b6575f80fd5b506100b16101c536600461283b565b610b57565b61012d6101d8366004612993565b610c66565b3480156101e8575f80fd5b506100b16101f7366004612a25565b610c88565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba8661105b565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061308b83398151915293929190829060ff16600581111561036857610368612a5a565b600581111561037957610379612a5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156103f0576103f0612a5a565b1461045a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61046a8483606001515f61106f565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610497908490600401612a90565b6020604051808303815f875af11580156104b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d79190612ac2565b5050505050565b5f6104ee64e8d4a5100083612b01565b92915050565b5f6104ee6001600160401b03831664e8d4a51000612b14565b8115610830575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610581573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105a89190810190612b4a565b915091508061060b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610451565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561064e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106729190612ac2565b8251146106d65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610451565b60208201516001600160a01b03161561074c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610451565b5f8061075b846040015161128c565b915091508188146107c85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610451565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61083983611464565b505050565b5f5f8051602061308b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610899573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108c09190810190612b4a565b91509150806108e15760405162461bcd60e51b815260040161045190612c1c565b82548251146109445760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610451565b60208201516001600160a01b0316156109b75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610451565b5f806109c684604001516117ac565b9150915080610a285760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610451565b5f82815260058601602052604081208054610a4290612c62565b9050118015610a74575060015f83815260068701602052604090205460ff166005811115610a7257610a72612a5a565b145b610a905760405162461bcd60e51b815260040161045190612c94565b5f8281526005860160205260408120610aa8916127db565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061308b833981519152929190610b9f90612c62565b9050118015610bd1575060015f83815260068301602052604090205460ff166005811115610bcf57610bcf612a5a565b145b610bed5760405162461bcd60e51b815260040161045190612c94565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c269190600401612cdb565b6020604051808303815f875af1158015610c42573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108399190612ac2565b5f80610c713461194d565b9050610c7f85828686611a0a565b95945050505050565b5f5f8051602061308b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ce3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d0a9190810190612b4a565b9150915080610d2b5760405162461bcd60e51b815260040161045190612c1c565b5f8415610daf575f610d408460400151611e41565b919350909150506001600160401b03811615610da95760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610451565b50610e25565b5f610dbd84604001516117ac565b90925090508015610e235760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610451565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610e5657610e56612a5a565b6005811115610e6757610e67612a5a565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610ef85760405162461bcd60e51b815260040161045190612d65565b5f600382516005811115610f0e57610f0e612a5a565b1480610f2c5750600282516005811115610f2a57610f2a612a5a565b145b15610f4f57506020808201515f9081526007870190915260408120556004610f53565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f8457610f84612a5a565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b61106361207c565b61106c816120c7565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110e8576110a8816001612db1565b6110b3906008612b14565b5081515f908390839081106110ca576110ca612dc4565b60200101906001600160f81b03191690815f1a905350600101611094565b505f5b600481101561114b576110ff816003612db1565b61110a906008612b14565b6001901c60f81b8261111d836002612dd8565b8151811061112d5761112d612dc4565b60200101906001600160f81b03191690815f1a9053506001016110eb565b505f5b60208110156111ad5761116281601f612db1565b61116d906008612b14565b86901c60f81b8261117f836006612dd8565b8151811061118f5761118f612dc4565b60200101906001600160f81b03191690815f1a90535060010161114e565b505f5b6008811015611218576111c4816007612db1565b6111cf906008612b14565b6001600160401b038616901c60f81b826111ea836026612dd8565b815181106111fa576111fa612dc4565b60200101906001600160f81b03191690815f1a9053506001016111b0565b505f5b60088110156112835761122f816007612db1565b61123a906008612b14565b6001600160401b038516901c60f81b8261125583602e612dd8565b8151811061126557611265612dc4565b60200101906001600160f81b03191690815f1a90535060010161121b565b50949350505050565b5f808251602e146112af5760405162461bcd60e51b815260040161045190612deb565b5f805b60028110156112fe576112c6816001612db1565b6112d1906008612b14565b61ffff168582815181106112e7576112e7612dc4565b016020015160f81c901b91909117906001016112b2565b5061ffff8116156113215760405162461bcd60e51b815260040161045190612e34565b5f805b600481101561137c57611338816003612db1565b611343906008612b14565b63ffffffff1686611355836002612dd8565b8151811061136557611365612dc4565b016020015160f81c901b9190911790600101611324565b5063ffffffff81166004146113a35760405162461bcd60e51b815260040161045190612e77565b5f805b60208110156113f8576113ba81601f612db1565b6113c5906008612b14565b876113d1836006612dd8565b815181106113e1576113e1612dc4565b016020015160f81c901b91909117906001016113a6565b505f805b600881101561145757611410816007612db1565b61141b906008612b14565b6001600160401b031688611430836026612dd8565b8151811061144057611440612dc4565b016020015160f81c901b91909117906001016113fc565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061308b83398151915293929190829060ff1660058111156114c4576114c4612a5a565b60058111156114d5576114d5612a5a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561154f5761154f612a5a565b146115ab5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610451565b60408101516001600160a01b0316336001600160a01b0316146115e05760405162461bcd60e51b815260040161045190612d65565b6115ed816080015161210a565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561163157611631612a5a565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116e89085908361106f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611717908590600401612a90565b6020604051808303815f875af1158015611733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117579190612ac2565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117cf5760405162461bcd60e51b815260040161045190612deb565b5f805b600281101561181e576117e6816001612db1565b6117f1906008612b14565b61ffff1685828151811061180757611807612dc4565b016020015160f81c901b91909117906001016117d2565b5061ffff8116156118415760405162461bcd60e51b815260040161045190612e34565b5f805b600481101561189c57611858816003612db1565b611863906008612b14565b63ffffffff1686611875836002612dd8565b8151811061188557611885612dc4565b016020015160f81c901b9190911790600101611844565b5063ffffffff81166002146118c35760405162461bcd60e51b815260040161045190612e77565b5f805b6020811015611918576118da81601f612db1565b6118e5906008612b14565b876118f1836006612dd8565b8151811061190157611901612dc4565b016020015160f81c901b91909117906001016118c6565b505f8660268151811061192d5761192d612dc4565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00828261197a826104de565b83549091506001600160401b038216108015906119a457508260010154816001600160401b031611155b611a025760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610451565b949350505050565b5f611a136122ab565b5f8051602061308b833981519152426001600160401b038516118015611a4d57506001600160401b038416611a4b426202a300612dd8565b115b611aaf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610451565b85611b065760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610451565b5f86815260078201602052604090205415611b745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610451565b8251603014611bdb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610451565b611be48561210a565b5f80611c2b6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506122f5565b5f82815260058601602052604090209193509150611c498282612f02565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611c76908590600401612a90565b6020604051808303815f875af1158015611c92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb69190612ac2565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611d2f57611d2f612a5a565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a0260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611e655760405162461bcd60e51b815260040161045190612deb565b5f805b6002811015611eb457611e7c816001612db1565b611e87906008612b14565b61ffff16868281518110611e9d57611e9d612dc4565b016020015160f81c901b9190911790600101611e68565b5061ffff811615611ed75760405162461bcd60e51b815260040161045190612e34565b5f805b6004811015611f3257611eee816003612db1565b611ef9906008612b14565b63ffffffff1687611f0b836002612dd8565b81518110611f1b57611f1b612dc4565b016020015160f81c901b9190911790600101611eda565b5063ffffffff8116600114611f595760405162461bcd60e51b815260040161045190612e77565b5f805b6020811015611fae57611f7081601f612db1565b611f7b906008612b14565b88611f87836006612dd8565b81518110611f9757611f97612dc4565b016020015160f81c901b9190911790600101611f5c565b505f805b600881101561200d57611fc6816007612db1565b611fd1906008612b14565b6001600160401b031689611fe6836026612dd8565b81518110611ff657611ff6612dc4565b016020015160f81c901b9190911790600101611fb2565b505f805b600881101561206c57612025816007612db1565b612030906008612b14565b6001600160401b03168a61204583602e612dd8565b8151811061205557612055612dc4565b016020015160f81c901b9190911790600101612011565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166120c557604051631afcd79f60e31b815260040160405180910390fd5b565b6120cf61207c565b6120d8816126c0565b61106c606082013560808301356120f560c0850160a0860161286d565b61210560e0860160c08701612fbd565b6126e1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061308b8339815191529060ff165f03612148575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121909083612db1565b106121ac576001600160401b03841660408301528082526121cb565b83826040018181516121be9190612fd8565b6001600160401b03169052505b5f8260200151836040015160646121e29190612fff565b6121ec919061302a565b600285015490915060ff90811690821611156122675760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610451565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016122ef57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461235f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610451565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156123d657612396816001612db1565b6123a1906008612b14565b5081515f908390839081106123b8576123b8612dc4565b60200101906001600160f81b03191690815f1a905350600101612382565b505f5b6004811015612434576123ed816003612db1565b6123f8906008612b14565b505f82612406836002612dd8565b8151811061241657612416612dc4565b60200101906001600160f81b03191690815f1a9053506001016123d9565b505f5b6020811015612491578451816020811061245357612453612dc4565b1a60f81b82612463836006612dd8565b8151811061247357612473612dc4565b60200101906001600160f81b03191690815f1a905350600101612437565b505f5b60208110156124f157846020015181602081106124b3576124b3612dc4565b1a60f81b826124c3836026612dd8565b815181106124d3576124d3612dc4565b60200101906001600160f81b03191690815f1a905350600101612494565b505f5b600881101561256557612508816007612db1565b612513906008612b14565b60ff1685604001516001600160401b0316901c60f81b828260466125379190612dd8565b8151811061254757612547612dc4565b60200101906001600160f81b03191690815f1a9053506001016124f4565b505f5b60308110156125d0578460800151818151811061258757612587612dc4565b01602001516001600160f81b031916826125a283604e612dd8565b815181106125b2576125b2612dc4565b60200101906001600160f81b03191690815f1a905350600101612568565b505f5b6008811015612642576125e7816007612db1565b6125f2906008612b14565b60608601516001600160401b0390811691161c60f81b8261261483607e612dd8565b8151811061262457612624612dc4565b60200101906001600160f81b03191690815f1a9053506001016125d3565b50600281604051612653919061304f565b602060405180830381855afa15801561266e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906126919190612ac2565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126c861207c565b6126d061274f565b6126d861275f565b61106c81612767565b6126e961207c565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61275761207c565b6120c56127d3565b6120c561207c565b61276f61207c565b80355f8051602061308b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556127b9606083016040840161306a565b600291909101805460ff191660ff90921691909117905550565b61269a61207c565b5080546127e790612c62565b5f825580601f106127f6575050565b601f0160209004905f5260205f209081019061106c91905b80821115612821575f815560010161280e565b5090565b5f60e08284031215612835575f80fd5b50919050565b5f6020828403121561284b575f80fd5b5035919050565b80356001600160401b0381168114612868575f80fd5b919050565b5f6020828403121561287d575f80fd5b61288682612852565b9392505050565b801515811461106c575f80fd5b803563ffffffff81168114612868575f80fd5b5f805f606084860312156128bf575f80fd5b8335925060208401356128d18161288d565b91506128df6040850161289a565b90509250925092565b5f602082840312156128f8575f80fd5b6128868261289a565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561293757612937612901565b60405290565b604051601f8201601f191681016001600160401b038111828210171561296557612965612901565b604052919050565b5f6001600160401b0382111561298557612985612901565b50601f01601f191660200190565b5f805f606084860312156129a5575f80fd5b833592506129b560208501612852565b915060408401356001600160401b038111156129cf575f80fd5b8401601f810186136129df575f80fd5b80356129f26129ed8261296d565b61293d565b818152876020838501011115612a06575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612a36575f80fd5b612a3f8361289a565b91506020830135612a4f8161288d565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612a88578181015183820152602001612a70565b50505f910152565b602081525f8251806020840152612aae816040850160208701612a6e565b601f01601f19169190910160400192915050565b5f60208284031215612ad2575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612b0f57612b0f612ad9565b500490565b80820281158282048414176104ee576104ee612aed565b6001600160a01b038116811461106c575f80fd5b80516128688161288d565b5f8060408385031215612b5b575f80fd5b82516001600160401b0380821115612b71575f80fd5b9084019060608287031215612b84575f80fd5b612b8c612915565b82518152602080840151612b9f81612b2b565b82820152604084015183811115612bb4575f80fd5b80850194505087601f850112612bc8575f80fd5b83519250612bd86129ed8461296d565b8381528882858701011115612beb575f80fd5b612bfa84838301848801612a6e565b80604084015250819550612c0f818801612b3f565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612c7657607f821691505b60208210810361283557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612ced81612c62565b806020870152604060018084165f8114612d0e5760018114612d2a57612d57565b60ff19851660408a0152604084151560051b8a01019550612d57565b895f5260205f205f5b85811015612d4e5781548b8201860152908301908801612d33565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104ee576104ee612aed565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104ee576104ee612aed565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f82111561083957805f5260205f20601f840160051c81016020851015612ee35750805b601f840160051c820191505b818110156104d7575f8155600101612eef565b81516001600160401b03811115612f1b57612f1b612901565b612f2f81612f298454612c62565b84612ebe565b602080601f831160018114612f62575f8415612f4b5750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b82811015612f9057888601518255948401946001909101908401612f71565b5085821015612fad57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612fcd575f80fd5b813561288681612b2b565b6001600160401b03818116838216019080821115612ff857612ff8612aed565b5092915050565b6001600160401b0381811683821602808216919082811461302257613022612aed565b505092915050565b5f6001600160401b038084168061304357613043612ad9565b92169190910492915050565b5f8251613060818460208701612a6e565b9190910192915050565b5f6020828403121561307a575f80fd5b813560ff81168114612886575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", ->>>>>>> origin/staking-contract + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveValidator\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161323338038061323383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130e68061014d5f395ff3fe608060405260043610610099575f3560e01c806376f786211161006257806376f7862114610190578063a3a65e48146101af578063b771b3bc146101ce578063bee0a03f14610200578063f40797d71461021f578063fdf94a1a14610232575f80fd5b8062e417921461009d5780630322ed98146100be5780632e2194d8146100dd5780636206585614610119578063687e842014610146575b5f80fd5b3480156100a8575f80fd5b506100bc6100b7366004612850565b610251565b005b3480156100c9575f80fd5b506100bc6100d8366004612866565b610333565b3480156100e8575f80fd5b506100fc6100f7366004612866565b610509565b6040516001600160401b0390911681526020015b60405180910390f35b348015610124575f80fd5b50610138610133366004612898565b61051f565b604051908152602001610110565b348015610151575f80fd5b50610138610160366004612866565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b34801561019b575f80fd5b506100bc6101aa3660046128d8565b610538565b3480156101ba575f80fd5b506100bc6101c9366004612913565b610869565b3480156101d9575f80fd5b506101e86005600160991b0181565b6040516001600160a01b039091168152602001610110565b34801561020b575f80fd5b506100bc61021a366004612866565b610b82565b61013861022d3660046129be565b610c91565b34801561023d575f80fd5b506100bc61024c366004612a50565b610cb3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061029a575080546001600160401b03808416911610155b156102b85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556102e283611086565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206130ba83398151915293929190829060ff16600581111561039357610393612a85565b60058111156103a4576103a4612a85565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561041b5761041b612a85565b146104855760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6104958483606001515f61109a565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104c2908490600401612abb565b6020604051808303815f875af11580156104de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105029190612aed565b5050505050565b5f61051964e8d4a5100083612b2c565b92915050565b5f6105196001600160401b03831664e8d4a51000612b3f565b811561085b575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156105ac573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105d39190810190612b75565b91509150806106365760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161047c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610679573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069d9190612aed565b8251146107015760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161047c565b60208201516001600160a01b0316156107775760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161047c565b5f8061078684604001516112b7565b915091508188146107f35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161047c565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6108648361148f565b505050565b5f5f805160206130ba8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156108c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108eb9190810190612b75565b915091508061090c5760405162461bcd60e51b815260040161047c90612c47565b825482511461096f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161047c565b60208201516001600160a01b0316156109e25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161047c565b5f806109f184604001516117d7565b9150915080610a535760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161047c565b5f82815260058601602052604081208054610a6d90612c8d565b9050118015610a9f575060015f83815260068701602052604090205460ff166005811115610a9d57610a9d612a85565b145b610abb5760405162461bcd60e51b815260040161047c90612cbf565b5f8281526005860160205260408120610ad391612806565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206130ba833981519152929190610bca90612c8d565b9050118015610bfc575060015f83815260068301602052604090205460ff166005811115610bfa57610bfa612a85565b145b610c185760405162461bcd60e51b815260040161047c90612cbf565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c519190600401612d06565b6020604051808303815f875af1158015610c6d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108649190612aed565b5f80610c9c34611978565b9050610caa85828686611a35565b95945050505050565b5f5f805160206130ba8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610d0e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d359190810190612b75565b9150915080610d565760405162461bcd60e51b815260040161047c90612c47565b5f8415610dda575f610d6b8460400151611e6c565b919350909150506001600160401b03811615610dd45760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161047c565b50610e50565b5f610de884604001516117d7565b90925090508015610e4e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161047c565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610e8157610e81612a85565b6005811115610e9257610e92612a85565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610f235760405162461bcd60e51b815260040161047c90612d90565b5f600382516005811115610f3957610f39612a85565b1480610f575750600282516005811115610f5557610f55612a85565b145b15610f7a57506020808201515f9081526007870190915260408120556004610f7e565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610faf57610faf612a85565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b61108e6120a7565b611097816120f2565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611113576110d3816001612ddc565b6110de906008612b3f565b5081515f908390839081106110f5576110f5612def565b60200101906001600160f81b03191690815f1a9053506001016110bf565b505f5b60048110156111765761112a816003612ddc565b611135906008612b3f565b6001901c60f81b82611148836002612e03565b8151811061115857611158612def565b60200101906001600160f81b03191690815f1a905350600101611116565b505f5b60208110156111d85761118d81601f612ddc565b611198906008612b3f565b86901c60f81b826111aa836006612e03565b815181106111ba576111ba612def565b60200101906001600160f81b03191690815f1a905350600101611179565b505f5b6008811015611243576111ef816007612ddc565b6111fa906008612b3f565b6001600160401b038616901c60f81b82611215836026612e03565b8151811061122557611225612def565b60200101906001600160f81b03191690815f1a9053506001016111db565b505f5b60088110156112ae5761125a816007612ddc565b611265906008612b3f565b6001600160401b038516901c60f81b8261128083602e612e03565b8151811061129057611290612def565b60200101906001600160f81b03191690815f1a905350600101611246565b50949350505050565b5f808251602e146112da5760405162461bcd60e51b815260040161047c90612e16565b5f805b6002811015611329576112f1816001612ddc565b6112fc906008612b3f565b61ffff1685828151811061131257611312612def565b016020015160f81c901b91909117906001016112dd565b5061ffff81161561134c5760405162461bcd60e51b815260040161047c90612e5f565b5f805b60048110156113a757611363816003612ddc565b61136e906008612b3f565b63ffffffff1686611380836002612e03565b8151811061139057611390612def565b016020015160f81c901b919091179060010161134f565b5063ffffffff81166004146113ce5760405162461bcd60e51b815260040161047c90612ea2565b5f805b6020811015611423576113e581601f612ddc565b6113f0906008612b3f565b876113fc836006612e03565b8151811061140c5761140c612def565b016020015160f81c901b91909117906001016113d1565b505f805b60088110156114825761143b816007612ddc565b611446906008612b3f565b6001600160401b03168861145b836026612e03565b8151811061146b5761146b612def565b016020015160f81c901b9190911790600101611427565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206130ba83398151915293929190829060ff1660058111156114ef576114ef612a85565b600581111561150057611500612a85565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561157a5761157a612a85565b146115d65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161047c565b60408101516001600160a01b0316336001600160a01b03161461160b5760405162461bcd60e51b815260040161047c90612d90565b6116188160800151612135565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561165c5761165c612a85565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906117139085908361109a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611742908590600401612abb565b6020604051808303815f875af115801561175e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117829190612aed565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117fa5760405162461bcd60e51b815260040161047c90612e16565b5f805b600281101561184957611811816001612ddc565b61181c906008612b3f565b61ffff1685828151811061183257611832612def565b016020015160f81c901b91909117906001016117fd565b5061ffff81161561186c5760405162461bcd60e51b815260040161047c90612e5f565b5f805b60048110156118c757611883816003612ddc565b61188e906008612b3f565b63ffffffff16866118a0836002612e03565b815181106118b0576118b0612def565b016020015160f81c901b919091179060010161186f565b5063ffffffff81166002146118ee5760405162461bcd60e51b815260040161047c90612ea2565b5f805b60208110156119435761190581601f612ddc565b611910906008612b3f565b8761191c836006612e03565b8151811061192c5761192c612def565b016020015160f81c901b91909117906001016118f1565b505f8660268151811061195857611958612def565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0082826119a582610509565b83549091506001600160401b038216108015906119cf57508260010154816001600160401b031611155b611a2d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161047c565b949350505050565b5f611a3e6122d6565b5f805160206130ba833981519152426001600160401b038516118015611a7857506001600160401b038416611a76426202a300612e03565b115b611ada5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161047c565b85611b315760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161047c565b5f86815260078201602052604090205415611b9f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161047c565b8251603014611c065760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161047c565b611c0f85612135565b5f80611c566040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612320565b5f82815260058601602052604090209193509150611c748282612f2d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ca1908590600401612abb565b6020604051808303815f875af1158015611cbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce19190612aed565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611d5a57611d5a612a85565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a2d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611e905760405162461bcd60e51b815260040161047c90612e16565b5f805b6002811015611edf57611ea7816001612ddc565b611eb2906008612b3f565b61ffff16868281518110611ec857611ec8612def565b016020015160f81c901b9190911790600101611e93565b5061ffff811615611f025760405162461bcd60e51b815260040161047c90612e5f565b5f805b6004811015611f5d57611f19816003612ddc565b611f24906008612b3f565b63ffffffff1687611f36836002612e03565b81518110611f4657611f46612def565b016020015160f81c901b9190911790600101611f05565b5063ffffffff8116600114611f845760405162461bcd60e51b815260040161047c90612ea2565b5f805b6020811015611fd957611f9b81601f612ddc565b611fa6906008612b3f565b88611fb2836006612e03565b81518110611fc257611fc2612def565b016020015160f81c901b9190911790600101611f87565b505f805b600881101561203857611ff1816007612ddc565b611ffc906008612b3f565b6001600160401b031689612011836026612e03565b8151811061202157612021612def565b016020015160f81c901b9190911790600101611fdd565b505f805b600881101561209757612050816007612ddc565b61205b906008612b3f565b6001600160401b03168a61207083602e612e03565b8151811061208057612080612def565b016020015160f81c901b919091179060010161203c565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166120f057604051631afcd79f60e31b815260040160405180910390fd5b565b6120fa6120a7565b612103816126eb565b6110976060820135608083013561212060c0850160a08601612898565b61213060e0860160c08701612fec565b61270c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206130ba8339815191529060ff165f03612173575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121bb9083612ddc565b106121d7576001600160401b03841660408301528082526121f6565b83826040018181516121e99190613007565b6001600160401b03169052505b5f82602001518360400151606461220d919061302e565b6122179190613059565b600285015490915060ff90811690821611156122925760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161047c565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161231a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461238a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161047c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612401576123c1816001612ddc565b6123cc906008612b3f565b5081515f908390839081106123e3576123e3612def565b60200101906001600160f81b03191690815f1a9053506001016123ad565b505f5b600481101561245f57612418816003612ddc565b612423906008612b3f565b505f82612431836002612e03565b8151811061244157612441612def565b60200101906001600160f81b03191690815f1a905350600101612404565b505f5b60208110156124bc578451816020811061247e5761247e612def565b1a60f81b8261248e836006612e03565b8151811061249e5761249e612def565b60200101906001600160f81b03191690815f1a905350600101612462565b505f5b602081101561251c57846020015181602081106124de576124de612def565b1a60f81b826124ee836026612e03565b815181106124fe576124fe612def565b60200101906001600160f81b03191690815f1a9053506001016124bf565b505f5b600881101561259057612533816007612ddc565b61253e906008612b3f565b60ff1685604001516001600160401b0316901c60f81b828260466125629190612e03565b8151811061257257612572612def565b60200101906001600160f81b03191690815f1a90535060010161251f565b505f5b60308110156125fb57846080015181815181106125b2576125b2612def565b01602001516001600160f81b031916826125cd83604e612e03565b815181106125dd576125dd612def565b60200101906001600160f81b03191690815f1a905350600101612593565b505f5b600881101561266d57612612816007612ddc565b61261d906008612b3f565b60608601516001600160401b0390811691161c60f81b8261263f83607e612e03565b8151811061264f5761264f612def565b60200101906001600160f81b03191690815f1a9053506001016125fe565b5060028160405161267e919061307e565b602060405180830381855afa158015612699573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906126bc9190612aed565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126f36120a7565b6126fb61277a565b61270361278a565b61109781612792565b6127146120a7565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6127826120a7565b6120f06127fe565b6120f06120a7565b61279a6120a7565b80355f805160206130ba83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556127e46060830160408401613099565b600291909101805460ff191660ff90921691909117905550565b6126c56120a7565b50805461281290612c8d565b5f825580601f10612821575050565b601f0160209004905f5260205f209081019061109791905b8082111561284c575f8155600101612839565b5090565b5f60e08284031215612860575f80fd5b50919050565b5f60208284031215612876575f80fd5b5035919050565b80356001600160401b0381168114612893575f80fd5b919050565b5f602082840312156128a8575f80fd5b6128b18261287d565b9392505050565b8015158114611097575f80fd5b803563ffffffff81168114612893575f80fd5b5f805f606084860312156128ea575f80fd5b8335925060208401356128fc816128b8565b915061290a604085016128c5565b90509250925092565b5f60208284031215612923575f80fd5b6128b1826128c5565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129625761296261292c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129905761299061292c565b604052919050565b5f6001600160401b038211156129b0576129b061292c565b50601f01601f191660200190565b5f805f606084860312156129d0575f80fd5b833592506129e06020850161287d565b915060408401356001600160401b038111156129fa575f80fd5b8401601f81018613612a0a575f80fd5b8035612a1d612a1882612998565b612968565b818152876020838501011115612a31575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612a61575f80fd5b612a6a836128c5565b91506020830135612a7a816128b8565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612ab3578181015183820152602001612a9b565b50505f910152565b602081525f8251806020840152612ad9816040850160208701612a99565b601f01601f19169190910160400192915050565b5f60208284031215612afd575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612b3a57612b3a612b04565b500490565b808202811582820484141761051957610519612b18565b6001600160a01b0381168114611097575f80fd5b8051612893816128b8565b5f8060408385031215612b86575f80fd5b82516001600160401b0380821115612b9c575f80fd5b9084019060608287031215612baf575f80fd5b612bb7612940565b82518152602080840151612bca81612b56565b82820152604084015183811115612bdf575f80fd5b80850194505087601f850112612bf3575f80fd5b83519250612c03612a1884612998565b8381528882858701011115612c16575f80fd5b612c2584838301848801612a99565b80604084015250819550612c3a818801612b6a565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612ca157607f821691505b60208210810361286057634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612d1881612c8d565b806020870152604060018084165f8114612d395760018114612d5557612d82565b60ff19851660408a0152604084151560051b8a01019550612d82565b895f5260205f205f5b85811015612d795781548b8201860152908301908801612d5e565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561051957610519612b18565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561051957610519612b18565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f82111561086457805f5260205f20601f840160051c81016020851015612f0e5750805b601f840160051c820191505b81811015610502575f8155600101612f1a565b81516001600160401b03811115612f4657612f4661292c565b612f5a81612f548454612c8d565b84612ee9565b602080601f831160018114612f8d575f8415612f765750858301515b5f19600386901b1c1916600185901b178555612fe4565b5f85815260208120601f198616915b82811015612fbb57888601518255948401946001909101908401612f9c565b5085821015612fd857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215612ffc575f80fd5b81356128b181612b56565b6001600160401b0381811683821601908082111561302757613027612b18565b5092915050565b6001600160401b0381811683821602808216919082811461305157613051612b18565b505092915050565b5f6001600160401b038084168061307257613072612b04565b92169190910492915050565b5f825161308f818460208701612a99565b9190910192915050565b5f602082840312156130a9575f80fd5b813560ff811681146128b1575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 9c11888ff..4d4853550 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -38,13 +38,8 @@ type ValidatorManagerSettings struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ -<<<<<<< HEAD - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveValidator\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612db0380380612db083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c638061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c8063a3a65e481161006e578063a3a65e481461018d578063b771b3bc146101a0578063bee0a03f146101ae578063c151c0b9146101c1578063f2fde38b146101d4578063fdf94a1a146101e7575f80fd5b80630322ed98146100b55780633aaa9f25146100ca578063687e8420146100f0578063715018a61461012e5780638da5cb5b1461013657806397fb70d41461017a575b5f80fd5b6100c86100c3366004612404565b6101fa565b005b6100dd6100d83660046124c8565b6103f2565b6040519081526020015b60405180910390f35b6100dd6100fe366004612404565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6100c8610412565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100e7565b6100c8610188366004612404565b610425565b6100c861019b36600461257e565b610432565b6101626005600160991b0181565b6100c86101bc366004612404565b61074b565b6100c86101cf3660046125b2565b61085f565b6100c86101e23660046125ee565b61096d565b6100c86101f5366004612616565b6109a7565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612c3783398151915293929190829060ff16600581111561025b5761025b612640565b600581111561026c5761026c612640565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b900416610100909101529091508151600581111561030357610303612640565b1461036d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61037e848361010001515f610ddb565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103ab908490600401612676565b6020604051808303815f875af11580156103c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103eb91906126a8565b5050505050565b5f6103fb610ff8565b61040784868585611053565b90505b949350505050565b61041a610ff8565b6104235f6114d7565b565b61042f815f611547565b50565b5f5f80516020612c378339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561048d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104b491908101906126ca565b91509150806104d55760405162461bcd60e51b81526004016103649061279c565b82548251146105385760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610364565b60208201516001600160a01b0316156105ab5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610364565b5f806105ba84604001516118fb565b915091508061061c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610364565b5f82815260058601602052604081208054610636906127e2565b9050118015610668575060015f83815260068701602052604090205460ff16600581111561066657610666612640565b145b6106845760405162461bcd60e51b81526004016103649061281a565b5f828152600586016020526040812061069c916123ba565b5f8281526006860160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612c37833981519152929190610793906127e2565b90501180156107c5575060015f83815260068301602052604090205460ff1660058111156107c3576107c3612640565b145b6107e15760405162461bcd60e51b81526004016103649061281a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161081a9190600401612861565b6020604051808303815f875af1158015610836573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085a91906126a8565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108a35750825b90505f826001600160401b031660011480156108be5750303b155b9050811580156108cc575080155b156108ea5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561091457845460ff60401b1916600160401b1785555b61091e8787611a9c565b831561096457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610975610ff8565b6001600160a01b03811661099e57604051631e4fbdf760e01b81525f6004820152602401610364565b61042f816114d7565b5f5f80516020612c378339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610a02573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a2991908101906126ca565b9150915080610a4a5760405162461bcd60e51b81526004016103649061279c565b5f8415610ace575f610a5f8460400151611aba565b919350909150506001600160401b03811615610ac85760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610364565b50610b44565b5f610adc84604001516118fb565b90925090508015610b425760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610364565b505b5f818152600685016020526040808220815161012081019092528054829060ff166005811115610b7657610b76612640565b6005811115610b8757610b87612640565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003909201546001600160a01b0380821660c080850191909152600160a01b830460ff16151560e0850152600160a81b90920490931661010090920191909152820151919250163314610c385760405162461bcd60e51b8152600401610364906128eb565b5f600382516005811115610c4e57610c4e612640565b1480610c6c5750600282516005811115610c6a57610c6a612640565b145b15610c8f57506020808201515f9081526007870190915260408120556004610c93565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610cc457610cc4612640565b0217905550602082015160018201556040808301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08401516003909301805460e0860151610100909601516001600160a01b039095166001600160a81b031990911617600160a01b951515959095029490941767ffffffffffffffff60a81b1916600160a81b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610e5457610e1481600161294b565b610e1f906008612964565b5081515f90839083908110610e3657610e3661297b565b60200101906001600160f81b03191690815f1a905350600101610e00565b505f5b6004811015610eb757610e6b81600361294b565b610e76906008612964565b6001901c60f81b82610e8983600261298f565b81518110610e9957610e9961297b565b60200101906001600160f81b03191690815f1a905350600101610e57565b505f5b6020811015610f1957610ece81601f61294b565b610ed9906008612964565b86901c60f81b82610eeb83600661298f565b81518110610efb57610efb61297b565b60200101906001600160f81b03191690815f1a905350600101610eba565b505f5b6008811015610f8457610f3081600761294b565b610f3b906008612964565b6001600160401b038616901c60f81b82610f5683602661298f565b81518110610f6657610f6661297b565b60200101906001600160f81b03191690815f1a905350600101610f1c565b505f5b6008811015610fef57610f9b81600761294b565b610fa6906008612964565b6001600160401b038516901c60f81b82610fc183602e61298f565b81518110610fd157610fd161297b565b60200101906001600160f81b03191690815f1a905350600101610f87565b50949350505050565b3361102a7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104235760405163118cdaa760e01b8152336004820152602401610364565b5f61105c611cf5565b5f80516020612c37833981519152426001600160401b03851611801561109657506001600160401b038416611094426202a30061298f565b115b6110f85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610364565b8561114f5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610364565b5f868152600782016020526040902054156111bd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610364565b82516030146112245760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610364565b61122d85611d3f565b5f806112746040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611ee0565b5f8281526005860160205260409020919350915061129282826129e6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112bf908590600401612676565b6020604051808303815f875af11580156112db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112ff91906126a8565b6040805161012081019091529091508060018152602081018b90526001600160401b038a1660408201525f606082018190526080820181905260a082015260c001336001600160a01b031681525f602080830182905260409283018290528682526006880190522081518154829060ff1916600183600581111561138557611385612640565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03938216600160401b026001600160801b03199095169682169690961793909317919091169390931792909217905560c08501516003909401805460e0870151610100909701518316600160a81b0267ffffffffffffffff60a81b19971515600160a01b026001600160a81b03199092166001600160a01b039097169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061040a60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0660205260408082208151610120810190925280545f80516020612c3783398151915293929190829060ff1660058111156115a8576115a8612640565b60058111156115b9576115b9612640565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a08401526003909301546001600160a01b03811660c084015260ff600160a01b820416151560e0840152600160a81b9004909216610100909101529091508151600581111561165357611653612640565b146116af5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610364565b60c08101516001600160a01b0316336001600160a01b0316146116e45760405162461bcd60e51b8152600401610364906128eb565b6116f18160400151611d3f565b600381526001600160401b034281166080830152831660a08201525f84815260068301602052604090208151815483929190829060ff1916600183600581111561173d5761173d612640565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c08301516003909201805460e0850151610100958601516001600160a01b039095166001600160a81b031990921691909117600160a01b911515919091021767ffffffffffffffff60a81b1916600160a81b93909216929092021790558101515f9061182e90869083610ddb565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061185d908590600401612676565b6020604051808303815f875af1158015611879573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061189d91906126a8565b60408481015181516001600160401b039182168152426020820152908816818301529051919250829188917f530b908725650fb1052974f9df59e834fefac78c9ec2f00c6d2464d60cc6add5919081900360600190a3505050505050565b5f80825160271461191e5760405162461bcd60e51b815260040161036490612aa5565b5f805b600281101561196d5761193581600161294b565b611940906008612964565b61ffff168582815181106119565761195661297b565b016020015160f81c901b9190911790600101611921565b5061ffff8116156119905760405162461bcd60e51b815260040161036490612aee565b5f805b60048110156119eb576119a781600361294b565b6119b2906008612964565b63ffffffff16866119c483600261298f565b815181106119d4576119d461297b565b016020015160f81c901b9190911790600101611993565b5063ffffffff8116600214611a125760405162461bcd60e51b815260040161036490612b31565b5f805b6020811015611a6757611a2981601f61294b565b611a34906008612964565b87611a4083600661298f565b81518110611a5057611a5061297b565b016020015160f81c901b9190911790600101611a15565b505f86602681518110611a7c57611a7c61297b565b016020015191976001600160f81b03199092161515965090945050505050565b611aa46122ab565b611aad826122f4565b611ab681612315565b5050565b5f805f8351603614611ade5760405162461bcd60e51b815260040161036490612aa5565b5f805b6002811015611b2d57611af581600161294b565b611b00906008612964565b61ffff16868281518110611b1657611b1661297b565b016020015160f81c901b9190911790600101611ae1565b5061ffff811615611b505760405162461bcd60e51b815260040161036490612aee565b5f805b6004811015611bab57611b6781600361294b565b611b72906008612964565b63ffffffff1687611b8483600261298f565b81518110611b9457611b9461297b565b016020015160f81c901b9190911790600101611b53565b5063ffffffff8116600114611bd25760405162461bcd60e51b815260040161036490612b31565b5f805b6020811015611c2757611be981601f61294b565b611bf4906008612964565b88611c0083600661298f565b81518110611c1057611c1061297b565b016020015160f81c901b9190911790600101611bd5565b505f805b6008811015611c8657611c3f81600761294b565b611c4a906008612964565b6001600160401b031689611c5f83602661298f565b81518110611c6f57611c6f61297b565b016020015160f81c901b9190911790600101611c2b565b505f805b6008811015611ce557611c9e81600761294b565b611ca9906008612964565b6001600160401b03168a611cbe83602e61298f565b81518110611cce57611cce61297b565b016020015160f81c901b9190911790600101611c8a565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611d3957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612c378339815191529060ff165f03611d7d575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611dc5908361294b565b10611de1576001600160401b0384166040830152808252611e00565b8382604001818151611df39190612b78565b6001600160401b03169052505b5f826020015183604001516064611e179190612b9f565b611e219190612bca565b600285015490915060ff9081169082161115611e9c5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610364565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611f4a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610364565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611fc157611f8181600161294b565b611f8c906008612964565b5081515f90839083908110611fa357611fa361297b565b60200101906001600160f81b03191690815f1a905350600101611f6d565b505f5b600481101561201f57611fd881600361294b565b611fe3906008612964565b505f82611ff183600261298f565b815181106120015761200161297b565b60200101906001600160f81b03191690815f1a905350600101611fc4565b505f5b602081101561207c578451816020811061203e5761203e61297b565b1a60f81b8261204e83600661298f565b8151811061205e5761205e61297b565b60200101906001600160f81b03191690815f1a905350600101612022565b505f5b60208110156120dc578460200151816020811061209e5761209e61297b565b1a60f81b826120ae83602661298f565b815181106120be576120be61297b565b60200101906001600160f81b03191690815f1a90535060010161207f565b505f5b6008811015612150576120f381600761294b565b6120fe906008612964565b60ff1685604001516001600160401b0316901c60f81b82826046612122919061298f565b815181106121325761213261297b565b60200101906001600160f81b03191690815f1a9053506001016120df565b505f5b60308110156121bb57846080015181815181106121725761217261297b565b01602001516001600160f81b0319168261218d83604e61298f565b8151811061219d5761219d61297b565b60200101906001600160f81b03191690815f1a905350600101612153565b505f5b600881101561222d576121d281600761294b565b6121dd906008612964565b60608601516001600160401b0390811691161c60f81b826121ff83607e61298f565b8151811061220f5761220f61297b565b60200101906001600160f81b03191690815f1a9053506001016121be565b5060028160405161223e9190612bfb565b602060405180830381855afa158015612259573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061227c91906126a8565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661042357604051631afcd79f60e31b815260040160405180910390fd5b6122fc6122ab565b612304612326565b61230c612336565b61042f8161233e565b61231d6122ab565b61042f816123aa565b61232e6122ab565b6104236123b2565b6104236122ab565b6123466122ab565b80355f80516020612c3783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123906060830160408401612c16565b600291909101805460ff191660ff90921691909117905550565b6109756122ab565b6122856122ab565b5080546123c6906127e2565b5f825580601f106123d5575050565b601f0160209004905f5260205f209081019061042f91905b80821115612400575f81556001016123ed565b5090565b5f60208284031215612414575f80fd5b5035919050565b80356001600160401b0381168114612431575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561246c5761246c612436565b60405290565b604051601f8201601f191681016001600160401b038111828210171561249a5761249a612436565b604052919050565b5f6001600160401b038211156124ba576124ba612436565b50601f01601f191660200190565b5f805f80608085870312156124db575f80fd5b6124e48561241b565b9350602085013592506124f96040860161241b565b915060608501356001600160401b03811115612513575f80fd5b8501601f81018713612523575f80fd5b8035612536612531826124a2565b612472565b81815288602083850101111561254a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff81168114612431575f80fd5b5f6020828403121561258e575f80fd5b6125978261256b565b9392505050565b6001600160a01b038116811461042f575f80fd5b5f8082840360808112156125c4575f80fd5b60608112156125d1575f80fd5b5082915060608301356125e38161259e565b809150509250929050565b5f602082840312156125fe575f80fd5b81356125978161259e565b801515811461042f575f80fd5b5f8060408385031215612627575f80fd5b6126308361256b565b915060208301356125e381612609565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561266e578181015183820152602001612656565b50505f910152565b602081525f8251806020840152612694816040850160208701612654565b601f01601f19169190910160400192915050565b5f602082840312156126b8575f80fd5b5051919050565b805161243181612609565b5f80604083850312156126db575f80fd5b82516001600160401b03808211156126f1575f80fd5b9084019060608287031215612704575f80fd5b61270c61244a565b8251815260208084015161271f8161259e565b82820152604084015183811115612734575f80fd5b80850194505087601f850112612748575f80fd5b83519250612758612531846124a2565b838152888285870101111561276b575f80fd5b61277a84838301848801612654565b8060408401525081955061278f8188016126bf565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c908216806127f657607f821691505b60208210810361281457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612873816127e2565b806020870152604060018084165f811461289457600181146128b0576128dd565b60ff19851660408a0152604084151560051b8a010195506128dd565b895f5260205f205f5b858110156128d45781548b82018601529083019088016128b9565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561295e5761295e612937565b92915050565b808202811582820484141761295e5761295e612937565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561295e5761295e612937565b601f82111561085a57805f5260205f20601f840160051c810160208510156129c75750805b601f840160051c820191505b818110156103eb575f81556001016129d3565b81516001600160401b038111156129ff576129ff612436565b612a1381612a0d84546127e2565b846129a2565b602080601f831160018114612a46575f8415612a2f5750858301515b5f19600386901b1c1916600185901b178555612a9d565b5f85815260208120601f198616915b82811015612a7457888601518255948401946001909101908401612a55565b5085821015612a9157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612b9857612b98612937565b5092915050565b6001600160401b03818116838216028082169190828114612bc257612bc2612937565b505092915050565b5f6001600160401b0380841680612bef57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612c0c818460208701612654565b9190910192915050565b5f60208284031215612c26575f80fd5b813560ff81168114612597575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", -======= - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c2a380380612c2a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612add8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b836600461227e565b6101b1565b005b6100d26100cd366004612342565b610387565b6040519081526020015b60405180910390f35b6100bd6103a7565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f36600461227e565b6103ba565b6100bd6101523660046123f8565b6103c6565b6101196005600160991b0181565b6100bd61017336600461227e565b6106df565b6100bd61018636600461242c565b6107f3565b6100bd610199366004612468565b610901565b6100bd6101ac366004612490565b61093b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612ab183398151915293929190829060ff166005811115610211576102116124ba565b6005811115610222576102226124ba565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c09091015290915081516005811115610299576102996124ba565b146103035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103138483606001515f610d0e565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103409084906004016124f0565b6020604051808303815f875af115801561035c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190612522565b5050505050565b5f610390610f2b565b61039c84868585610f86565b90505b949350505050565b6103af610f2b565b6103b85f6113bd565b565b6103c38161142d565b50565b5f5f80516020612ab18339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610421573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104489190810190612544565b91509150806104695760405162461bcd60e51b81526004016102fa90612616565b82548251146104cc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102fa565b60208201516001600160a01b03161561053f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102fa565b5f8061054e8460400151611775565b91509150806105b05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102fa565b5f828152600586016020526040812080546105ca9061265c565b90501180156105fc575060015f83815260068701602052604090205460ff1660058111156105fa576105fa6124ba565b145b6106185760405162461bcd60e51b81526004016102fa90612694565b5f828152600586016020526040812061063091612234565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612ab18339815191529291906107279061265c565b9050118015610759575060015f83815260068301602052604090205460ff166005811115610757576107576124ba565b145b6107755760405162461bcd60e51b81526004016102fa90612694565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107ae91906004016126db565b6020604051808303815f875af11580156107ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ee9190612522565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108375750825b90505f826001600160401b031660011480156108525750303b155b905081158015610860575080155b1561087e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108a857845460ff60401b1916600160401b1785555b6108b28787611916565b83156108f857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610909610f2b565b6001600160a01b03811661093257604051631e4fbdf760e01b81525f60048201526024016102fa565b6103c3816113bd565b5f5f80516020612ab18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610996573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109bd9190810190612544565b91509150806109de5760405162461bcd60e51b81526004016102fa90612616565b5f8415610a62575f6109f38460400151611934565b919350909150506001600160401b03811615610a5c5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016102fa565b50610ad8565b5f610a708460400151611775565b90925090508015610ad65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102fa565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610b0957610b096124ba565b6005811115610b1a57610b1a6124ba565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610bab5760405162461bcd60e51b81526004016102fa90612765565b5f600382516005811115610bc157610bc16124ba565b1480610bdf5750600282516005811115610bdd57610bdd6124ba565b145b15610c0257506020808201515f9081526007870190915260408120556004610c06565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610c3757610c376124ba565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610d8757610d478160016127c5565b610d529060086127de565b5081515f90839083908110610d6957610d696127f5565b60200101906001600160f81b03191690815f1a905350600101610d33565b505f5b6004811015610dea57610d9e8160036127c5565b610da99060086127de565b6001901c60f81b82610dbc836002612809565b81518110610dcc57610dcc6127f5565b60200101906001600160f81b03191690815f1a905350600101610d8a565b505f5b6020811015610e4c57610e0181601f6127c5565b610e0c9060086127de565b86901c60f81b82610e1e836006612809565b81518110610e2e57610e2e6127f5565b60200101906001600160f81b03191690815f1a905350600101610ded565b505f5b6008811015610eb757610e638160076127c5565b610e6e9060086127de565b6001600160401b038616901c60f81b82610e89836026612809565b81518110610e9957610e996127f5565b60200101906001600160f81b03191690815f1a905350600101610e4f565b505f5b6008811015610f2257610ece8160076127c5565b610ed99060086127de565b6001600160401b038516901c60f81b82610ef483602e612809565b81518110610f0457610f046127f5565b60200101906001600160f81b03191690815f1a905350600101610eba565b50949350505050565b33610f5d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103b85760405163118cdaa760e01b81523360048201526024016102fa565b5f610f8f611b6f565b5f80516020612ab1833981519152426001600160401b038516118015610fc957506001600160401b038416610fc7426202a300612809565b115b61102b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102fa565b856110825760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102fa565b5f868152600782016020526040902054156110f05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102fa565b82516030146111575760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102fa565b61116085611bb9565b5f806111a76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611d5a565b5f828152600586016020526040902091935091506111c58282612860565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906111f29085906004016124f0565b6020604051808303815f875af115801561120e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112329190612522565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff191660018360058111156112ab576112ab6124ba565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061039f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612ab183398151915293929190829060ff16600581111561148d5761148d6124ba565b600581111561149e5761149e6124ba565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c09091015290915081516005811115611518576115186124ba565b146115745760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102fa565b60408101516001600160a01b0316336001600160a01b0316146115a95760405162461bcd60e51b81526004016102fa90612765565b6115b68160800151611bb9565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156115fa576115fa6124ba565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116b190859083610d0e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116e09085906004016124f0565b6020604051808303815f875af11580156116fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117209190612522565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117985760405162461bcd60e51b81526004016102fa9061291f565b5f805b60028110156117e7576117af8160016127c5565b6117ba9060086127de565b61ffff168582815181106117d0576117d06127f5565b016020015160f81c901b919091179060010161179b565b5061ffff81161561180a5760405162461bcd60e51b81526004016102fa90612968565b5f805b6004811015611865576118218160036127c5565b61182c9060086127de565b63ffffffff168661183e836002612809565b8151811061184e5761184e6127f5565b016020015160f81c901b919091179060010161180d565b5063ffffffff811660021461188c5760405162461bcd60e51b81526004016102fa906129ab565b5f805b60208110156118e1576118a381601f6127c5565b6118ae9060086127de565b876118ba836006612809565b815181106118ca576118ca6127f5565b016020015160f81c901b919091179060010161188f565b505f866026815181106118f6576118f66127f5565b016020015191976001600160f81b03199092161515965090945050505050565b61191e612125565b6119278261216e565b6119308161218f565b5050565b5f805f83516036146119585760405162461bcd60e51b81526004016102fa9061291f565b5f805b60028110156119a75761196f8160016127c5565b61197a9060086127de565b61ffff16868281518110611990576119906127f5565b016020015160f81c901b919091179060010161195b565b5061ffff8116156119ca5760405162461bcd60e51b81526004016102fa90612968565b5f805b6004811015611a25576119e18160036127c5565b6119ec9060086127de565b63ffffffff16876119fe836002612809565b81518110611a0e57611a0e6127f5565b016020015160f81c901b91909117906001016119cd565b5063ffffffff8116600114611a4c5760405162461bcd60e51b81526004016102fa906129ab565b5f805b6020811015611aa157611a6381601f6127c5565b611a6e9060086127de565b88611a7a836006612809565b81518110611a8a57611a8a6127f5565b016020015160f81c901b9190911790600101611a4f565b505f805b6008811015611b0057611ab98160076127c5565b611ac49060086127de565b6001600160401b031689611ad9836026612809565b81518110611ae957611ae96127f5565b016020015160f81c901b9190911790600101611aa5565b505f805b6008811015611b5f57611b188160076127c5565b611b239060086127de565b6001600160401b03168a611b3883602e612809565b81518110611b4857611b486127f5565b016020015160f81c901b9190911790600101611b04565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611bb357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612ab18339815191529060ff165f03611bf7575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611c3f90836127c5565b10611c5b576001600160401b0384166040830152808252611c7a565b8382604001818151611c6d91906129f2565b6001600160401b03169052505b5f826020015183604001516064611c919190612a19565b611c9b9190612a44565b600285015490915060ff9081169082161115611d165760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102fa565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611dc45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102fa565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e3b57611dfb8160016127c5565b611e069060086127de565b5081515f90839083908110611e1d57611e1d6127f5565b60200101906001600160f81b03191690815f1a905350600101611de7565b505f5b6004811015611e9957611e528160036127c5565b611e5d9060086127de565b505f82611e6b836002612809565b81518110611e7b57611e7b6127f5565b60200101906001600160f81b03191690815f1a905350600101611e3e565b505f5b6020811015611ef65784518160208110611eb857611eb86127f5565b1a60f81b82611ec8836006612809565b81518110611ed857611ed86127f5565b60200101906001600160f81b03191690815f1a905350600101611e9c565b505f5b6020811015611f565784602001518160208110611f1857611f186127f5565b1a60f81b82611f28836026612809565b81518110611f3857611f386127f5565b60200101906001600160f81b03191690815f1a905350600101611ef9565b505f5b6008811015611fca57611f6d8160076127c5565b611f789060086127de565b60ff1685604001516001600160401b0316901c60f81b82826046611f9c9190612809565b81518110611fac57611fac6127f5565b60200101906001600160f81b03191690815f1a905350600101611f59565b505f5b60308110156120355784608001518181518110611fec57611fec6127f5565b01602001516001600160f81b0319168261200783604e612809565b81518110612017576120176127f5565b60200101906001600160f81b03191690815f1a905350600101611fcd565b505f5b60088110156120a75761204c8160076127c5565b6120579060086127de565b60608601516001600160401b0390811691161c60f81b8261207983607e612809565b81518110612089576120896127f5565b60200101906001600160f81b03191690815f1a905350600101612038565b506002816040516120b89190612a75565b602060405180830381855afa1580156120d3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906120f69190612522565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103b857604051631afcd79f60e31b815260040160405180910390fd5b612176612125565b61217e6121a0565b6121866121b0565b6103c3816121b8565b612197612125565b6103c381612224565b6121a8612125565b6103b861222c565b6103b8612125565b6121c0612125565b80355f80516020612ab183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561220a6060830160408401612a90565b600291909101805460ff191660ff90921691909117905550565b610909612125565b6120ff612125565b5080546122409061265c565b5f825580601f1061224f575050565b601f0160209004905f5260205f20908101906103c391905b8082111561227a575f8155600101612267565b5090565b5f6020828403121561228e575f80fd5b5035919050565b80356001600160401b03811681146122ab575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156122e6576122e66122b0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612314576123146122b0565b604052919050565b5f6001600160401b03821115612334576123346122b0565b50601f01601f191660200190565b5f805f8060808587031215612355575f80fd5b61235e85612295565b93506020850135925061237360408601612295565b915060608501356001600160401b0381111561238d575f80fd5b8501601f8101871361239d575f80fd5b80356123b06123ab8261231c565b6122ec565b8181528860208385010111156123c4575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146122ab575f80fd5b5f60208284031215612408575f80fd5b612411826123e5565b9392505050565b6001600160a01b03811681146103c3575f80fd5b5f80828403608081121561243e575f80fd5b606081121561244b575f80fd5b50829150606083013561245d81612418565b809150509250929050565b5f60208284031215612478575f80fd5b813561241181612418565b80151581146103c3575f80fd5b5f80604083850312156124a1575f80fd5b6124aa836123e5565b9150602083013561245d81612483565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156124e85781810151838201526020016124d0565b50505f910152565b602081525f825180602084015261250e8160408501602087016124ce565b601f01601f19169190910160400192915050565b5f60208284031215612532575f80fd5b5051919050565b80516122ab81612483565b5f8060408385031215612555575f80fd5b82516001600160401b038082111561256b575f80fd5b908401906060828703121561257e575f80fd5b6125866122c4565b8251815260208084015161259981612418565b828201526040840151838111156125ae575f80fd5b80850194505087601f8501126125c2575f80fd5b835192506125d26123ab8461231c565b83815288828587010111156125e5575f80fd5b6125f4848383018488016124ce565b80604084015250819550612609818801612539565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061267057607f821691505b60208210810361268e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546126ed8161265c565b806020870152604060018084165f811461270e576001811461272a57612757565b60ff19851660408a0152604084151560051b8a01019550612757565b895f5260205f205f5b8581101561274e5781548b8201860152908301908801612733565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b818103818111156127d8576127d86127b1565b92915050565b80820281158282048414176127d8576127d86127b1565b634e487b7160e01b5f52603260045260245ffd5b808201808211156127d8576127d86127b1565b601f8211156107ee57805f5260205f20601f840160051c810160208510156128415750805b601f840160051c820191505b81811015610380575f815560010161284d565b81516001600160401b03811115612879576128796122b0565b61288d81612887845461265c565b8461281c565b602080601f8311600181146128c0575f84156128a95750858301515b5f19600386901b1c1916600185901b178555612917565b5f85815260208120601f198616915b828110156128ee578886015182559484019460019091019084016128cf565b508582101561290b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612a1257612a126127b1565b5092915050565b6001600160401b03818116838216028082169190828114612a3c57612a3c6127b1565b505092915050565b5f6001600160401b0380841680612a6957634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a868184602087016124ce565b9190910192915050565b5f60208284031215612aa0575f80fd5b813560ff81168114612411575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", ->>>>>>> origin/staking-contract + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveValidator\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612c73380380612c7383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612b268061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c8063a3a65e481161006e578063a3a65e481461018d578063b771b3bc146101a0578063bee0a03f146101ae578063c151c0b9146101c1578063f2fde38b146101d4578063fdf94a1a146101e7575f80fd5b80630322ed98146100b55780633aaa9f25146100ca578063687e8420146100f0578063715018a61461012e5780638da5cb5b1461013657806397fb70d41461017a575b5f80fd5b6100c86100c33660046122c7565b6101fa565b005b6100dd6100d836600461238b565b6103d0565b6040519081526020015b60405180910390f35b6100dd6100fe3660046122c7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6100c86103f0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100e7565b6100c86101883660046122c7565b610403565b6100c861019b366004612441565b61040f565b6101626005600160991b0181565b6100c86101bc3660046122c7565b610728565b6100c86101cf366004612475565b61083c565b6100c86101e23660046124b1565b61094a565b6100c86101f53660046124d9565b610984565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612afa83398151915293929190829060ff16600581111561025a5761025a612503565b600581111561026b5761026b612503565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102e2576102e2612503565b1461034c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61035c8483606001515f610d57565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610389908490600401612539565b6020604051808303815f875af11580156103a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c9919061256b565b5050505050565b5f6103d9610f74565b6103e584868585610fcf565b90505b949350505050565b6103f8610f74565b6104015f611406565b565b61040c81611476565b50565b5f5f80516020612afa8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561046a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610491919081019061258d565b91509150806104b25760405162461bcd60e51b81526004016103439061265f565b82548251146105155760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610343565b60208201516001600160a01b0316156105885760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610343565b5f8061059784604001516117be565b91509150806105f95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610343565b5f82815260058601602052604081208054610613906126a5565b9050118015610645575060015f83815260068701602052604090205460ff16600581111561064357610643612503565b145b6106615760405162461bcd60e51b8152600401610343906126dd565b5f82815260058601602052604081206106799161227d565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612afa833981519152929190610770906126a5565b90501180156107a2575060015f83815260068301602052604090205460ff1660058111156107a0576107a0612503565b145b6107be5760405162461bcd60e51b8152600401610343906126dd565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107f79190600401612724565b6020604051808303815f875af1158015610813573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610837919061256b565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108805750825b90505f826001600160401b0316600114801561089b5750303b155b9050811580156108a9575080155b156108c75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108f157845460ff60401b1916600160401b1785555b6108fb878761195f565b831561094157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610952610f74565b6001600160a01b03811661097b57604051631e4fbdf760e01b81525f6004820152602401610343565b61040c81611406565b5f5f80516020612afa8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156109df573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a06919081019061258d565b9150915080610a275760405162461bcd60e51b81526004016103439061265f565b5f8415610aab575f610a3c846040015161197d565b919350909150506001600160401b03811615610aa55760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610343565b50610b21565b5f610ab984604001516117be565b90925090508015610b1f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610343565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610b5257610b52612503565b6005811115610b6357610b63612503565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610bf45760405162461bcd60e51b8152600401610343906127ae565b5f600382516005811115610c0a57610c0a612503565b1480610c285750600282516005811115610c2657610c26612503565b145b15610c4b57506020808201515f9081526007870190915260408120556004610c4f565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610c8057610c80612503565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610dd057610d9081600161280e565b610d9b906008612827565b5081515f90839083908110610db257610db261283e565b60200101906001600160f81b03191690815f1a905350600101610d7c565b505f5b6004811015610e3357610de781600361280e565b610df2906008612827565b6001901c60f81b82610e05836002612852565b81518110610e1557610e1561283e565b60200101906001600160f81b03191690815f1a905350600101610dd3565b505f5b6020811015610e9557610e4a81601f61280e565b610e55906008612827565b86901c60f81b82610e67836006612852565b81518110610e7757610e7761283e565b60200101906001600160f81b03191690815f1a905350600101610e36565b505f5b6008811015610f0057610eac81600761280e565b610eb7906008612827565b6001600160401b038616901c60f81b82610ed2836026612852565b81518110610ee257610ee261283e565b60200101906001600160f81b03191690815f1a905350600101610e98565b505f5b6008811015610f6b57610f1781600761280e565b610f22906008612827565b6001600160401b038516901c60f81b82610f3d83602e612852565b81518110610f4d57610f4d61283e565b60200101906001600160f81b03191690815f1a905350600101610f03565b50949350505050565b33610fa67f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104015760405163118cdaa760e01b8152336004820152602401610343565b5f610fd8611bb8565b5f80516020612afa833981519152426001600160401b03851611801561101257506001600160401b038416611010426202a300612852565b115b6110745760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610343565b856110cb5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610343565b5f868152600782016020526040902054156111395760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610343565b82516030146111a05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610343565b6111a985611c02565b5f806111f06040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611da3565b5f8281526005860160205260409020919350915061120e82826128a9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061123b908590600401612539565b6020604051808303815f875af1158015611257573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127b919061256b565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff191660018360058111156112f4576112f4612503565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103e860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612afa83398151915293929190829060ff1660058111156114d6576114d6612503565b60058111156114e7576114e7612503565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561156157611561612503565b146115bd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610343565b60408101516001600160a01b0316336001600160a01b0316146115f25760405162461bcd60e51b8152600401610343906127ae565b6115ff8160800151611c02565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561164357611643612503565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116fa90859083610d57565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611729908590600401612539565b6020604051808303815f875af1158015611745573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611769919061256b565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117e15760405162461bcd60e51b815260040161034390612968565b5f805b6002811015611830576117f881600161280e565b611803906008612827565b61ffff168582815181106118195761181961283e565b016020015160f81c901b91909117906001016117e4565b5061ffff8116156118535760405162461bcd60e51b8152600401610343906129b1565b5f805b60048110156118ae5761186a81600361280e565b611875906008612827565b63ffffffff1686611887836002612852565b815181106118975761189761283e565b016020015160f81c901b9190911790600101611856565b5063ffffffff81166002146118d55760405162461bcd60e51b8152600401610343906129f4565b5f805b602081101561192a576118ec81601f61280e565b6118f7906008612827565b87611903836006612852565b815181106119135761191361283e565b016020015160f81c901b91909117906001016118d8565b505f8660268151811061193f5761193f61283e565b016020015191976001600160f81b03199092161515965090945050505050565b61196761216e565b611970826121b7565b611979816121d8565b5050565b5f805f83516036146119a15760405162461bcd60e51b815260040161034390612968565b5f805b60028110156119f0576119b881600161280e565b6119c3906008612827565b61ffff168682815181106119d9576119d961283e565b016020015160f81c901b91909117906001016119a4565b5061ffff811615611a135760405162461bcd60e51b8152600401610343906129b1565b5f805b6004811015611a6e57611a2a81600361280e565b611a35906008612827565b63ffffffff1687611a47836002612852565b81518110611a5757611a5761283e565b016020015160f81c901b9190911790600101611a16565b5063ffffffff8116600114611a955760405162461bcd60e51b8152600401610343906129f4565b5f805b6020811015611aea57611aac81601f61280e565b611ab7906008612827565b88611ac3836006612852565b81518110611ad357611ad361283e565b016020015160f81c901b9190911790600101611a98565b505f805b6008811015611b4957611b0281600761280e565b611b0d906008612827565b6001600160401b031689611b22836026612852565b81518110611b3257611b3261283e565b016020015160f81c901b9190911790600101611aee565b505f805b6008811015611ba857611b6181600761280e565b611b6c906008612827565b6001600160401b03168a611b8183602e612852565b81518110611b9157611b9161283e565b016020015160f81c901b9190911790600101611b4d565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611bfc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612afa8339815191529060ff165f03611c40575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611c88908361280e565b10611ca4576001600160401b0384166040830152808252611cc3565b8382604001818151611cb69190612a3b565b6001600160401b03169052505b5f826020015183604001516064611cda9190612a62565b611ce49190612a8d565b600285015490915060ff9081169082161115611d5f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610343565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611e0d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610343565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e8457611e4481600161280e565b611e4f906008612827565b5081515f90839083908110611e6657611e6661283e565b60200101906001600160f81b03191690815f1a905350600101611e30565b505f5b6004811015611ee257611e9b81600361280e565b611ea6906008612827565b505f82611eb4836002612852565b81518110611ec457611ec461283e565b60200101906001600160f81b03191690815f1a905350600101611e87565b505f5b6020811015611f3f5784518160208110611f0157611f0161283e565b1a60f81b82611f11836006612852565b81518110611f2157611f2161283e565b60200101906001600160f81b03191690815f1a905350600101611ee5565b505f5b6020811015611f9f5784602001518160208110611f6157611f6161283e565b1a60f81b82611f71836026612852565b81518110611f8157611f8161283e565b60200101906001600160f81b03191690815f1a905350600101611f42565b505f5b600881101561201357611fb681600761280e565b611fc1906008612827565b60ff1685604001516001600160401b0316901c60f81b82826046611fe59190612852565b81518110611ff557611ff561283e565b60200101906001600160f81b03191690815f1a905350600101611fa2565b505f5b603081101561207e57846080015181815181106120355761203561283e565b01602001516001600160f81b0319168261205083604e612852565b815181106120605761206061283e565b60200101906001600160f81b03191690815f1a905350600101612016565b505f5b60088110156120f05761209581600761280e565b6120a0906008612827565b60608601516001600160401b0390811691161c60f81b826120c283607e612852565b815181106120d2576120d261283e565b60200101906001600160f81b03191690815f1a905350600101612081565b506002816040516121019190612abe565b602060405180830381855afa15801561211c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061213f919061256b565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661040157604051631afcd79f60e31b815260040160405180910390fd5b6121bf61216e565b6121c76121e9565b6121cf6121f9565b61040c81612201565b6121e061216e565b61040c8161226d565b6121f161216e565b610401612275565b61040161216e565b61220961216e565b80355f80516020612afa83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122536060830160408401612ad9565b600291909101805460ff191660ff90921691909117905550565b61095261216e565b61214861216e565b508054612289906126a5565b5f825580601f10612298575050565b601f0160209004905f5260205f209081019061040c91905b808211156122c3575f81556001016122b0565b5090565b5f602082840312156122d7575f80fd5b5035919050565b80356001600160401b03811681146122f4575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561232f5761232f6122f9565b60405290565b604051601f8201601f191681016001600160401b038111828210171561235d5761235d6122f9565b604052919050565b5f6001600160401b0382111561237d5761237d6122f9565b50601f01601f191660200190565b5f805f806080858703121561239e575f80fd5b6123a7856122de565b9350602085013592506123bc604086016122de565b915060608501356001600160401b038111156123d6575f80fd5b8501601f810187136123e6575f80fd5b80356123f96123f482612365565b612335565b81815288602083850101111561240d575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146122f4575f80fd5b5f60208284031215612451575f80fd5b61245a8261242e565b9392505050565b6001600160a01b038116811461040c575f80fd5b5f808284036080811215612487575f80fd5b6060811215612494575f80fd5b5082915060608301356124a681612461565b809150509250929050565b5f602082840312156124c1575f80fd5b813561245a81612461565b801515811461040c575f80fd5b5f80604083850312156124ea575f80fd5b6124f38361242e565b915060208301356124a6816124cc565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612531578181015183820152602001612519565b50505f910152565b602081525f8251806020840152612557816040850160208701612517565b601f01601f19169190910160400192915050565b5f6020828403121561257b575f80fd5b5051919050565b80516122f4816124cc565b5f806040838503121561259e575f80fd5b82516001600160401b03808211156125b4575f80fd5b90840190606082870312156125c7575f80fd5b6125cf61230d565b825181526020808401516125e281612461565b828201526040840151838111156125f7575f80fd5b80850194505087601f85011261260b575f80fd5b8351925061261b6123f484612365565b838152888285870101111561262e575f80fd5b61263d84838301848801612517565b80604084015250819550612652818801612582565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c908216806126b957607f821691505b6020821081036126d757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612736816126a5565b806020870152604060018084165f81146127575760018114612773576127a0565b60ff19851660408a0152604084151560051b8a010195506127a0565b895f5260205f205f5b858110156127975781548b820186015290830190880161277c565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612821576128216127fa565b92915050565b8082028115828204841417612821576128216127fa565b634e487b7160e01b5f52603260045260245ffd5b80820180821115612821576128216127fa565b601f82111561083757805f5260205f20601f840160051c8101602085101561288a5750805b601f840160051c820191505b818110156103c9575f8155600101612896565b81516001600160401b038111156128c2576128c26122f9565b6128d6816128d084546126a5565b84612865565b602080601f831160018114612909575f84156128f25750858301515b5f19600386901b1c1916600185901b178555612960565b5f85815260208120601f198616915b8281101561293757888601518255948401946001909101908401612918565b508582101561295457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612a5b57612a5b6127fa565b5092915050565b6001600160401b03818116838216028082169190828114612a8557612a856127fa565b505092915050565b5f6001600160401b0380841680612ab257634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612acf818460208701612517565b9190910192915050565b5f60208284031215612ae9575f80fd5b813560ff8116811461245a575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index cd31bd1bd..18ada2771 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -101,8 +101,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) // Register a validator - weight := uint64(1) - poaValidatorNodeID := ids.GenerateTestID() + poaWeight := uint64(1) + poaNodeID := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} poaValidationID := utils.InitializeAndCompletePoAValidatorRegistration( network, @@ -113,8 +113,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { pChainInfo, poaValidatorManager, proxyAddress, - weight, - poaValidatorNodeID, + poaWeight, + poaNodeID, blsPublicKey, ) @@ -161,20 +161,20 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) // Check that previous validator is still active - validationID, err := posValidatorManager.GetActiveValidator(&bind.CallOpts{}, poaValidatorNodeID) + validationID, err := posValidatorManager.GetActiveValidator(&bind.CallOpts{}, poaNodeID) Expect(err).Should(BeNil()) Expect(validationID[:]).Should(Equal(poaValidationID[:])) // Register a PoS validator - posValidatorNodeID := ids.GenerateTestID() + posNodeID := ids.GenerateTestID() stakeAmount := uint64(1e18) - weight, err = posValidatorManager.ValueToWeight( + posWeight, err := posValidatorManager.ValueToWeight( &bind.CallOpts{}, big.NewInt(int64(stakeAmount)), ) Expect(err).Should(BeNil()) - utils.InitializeAndCompleteNativeValidatorRegistration( + posValidationID := utils.InitializeAndCompleteNativeValidatorRegistration( network, signatureAggregator, fundedKey, @@ -182,8 +182,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { pChainInfo, posValidatorManager, proxyAddress, - weight, - posValidatorNodeID, + posWeight, + posNodeID, blsPublicKey, stakeAmount, ) @@ -196,4 +196,30 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { 0, ) Expect(err).ShouldNot(BeNil()) + + // Delist the previous PoA validator properly + utils.InitializeAndCompleteEndNativeValidation( + network, + signatureAggregator, + ownerKey, + subnetAInfo, + pChainInfo, + posValidatorManager, + proxyAddress, + poaValidationID, + poaWeight, + ) + + // Delist the PoS validator + utils.InitializeAndCompleteEndNativeValidation( + network, + signatureAggregator, + fundedKey, + subnetAInfo, + pChainInfo, + posValidatorManager, + proxyAddress, + posValidationID, + posWeight, + ) } From 61abb78bbe5096c46c1fa3b0b16c24d18a18ffe1 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 28 Aug 2024 14:07:22 -0400 Subject: [PATCH 145/545] update getActiveValidators method --- .../ERC20TokenStakingManager.go | 28 +++++++++---------- .../NativeTokenStakingManager.go | 28 +++++++++---------- .../PoAValidatorManager.go | 28 +++++++++---------- contracts/staking/ValidatorManager.sol | 2 +- tests/flows/staking/poa_to_pos.go | 2 +- 5 files changed, 44 insertions(+), 44 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 549cbaa7f..33bfc440c 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveValidator\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161362e38038061362e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6134e18061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c806376f786211161006e57806376f7862114610161578063872fda6414610174578063a3a65e4814610187578063b771b3bc1461019a578063bee0a03f146101c0578063fdf94a1a146101d3575f80fd5b80630322ed98146100aa57806327f39ca8146100bf5780632e2194d8146100d25780636206585614610102578063687e842014610123575b5f80fd5b6100bd6100b8366004612c0b565b6101e6565b005b6100bd6100cd366004612c36565b6103bc565b6100e56100e0366004612c0b565b6104a0565b6040516001600160401b0390911681526020015b60405180910390f35b610115610110366004612c8e565b6104b6565b6040519081526020016100f9565b610115610131366004612c0b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6100bd61016f366004612cc7565b6104cf565b610115610182366004612d94565b610800565b6100bd610195366004612e30565b610825565b6101a86005600160991b0181565b6040516001600160a01b0390911681526020016100f9565b6100bd6101ce366004612c0b565b610b3e565b6100bd6101e1366004612e49565b610c4d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206134b583398151915293929190829060ff16600581111561024657610246612e73565b600581111561025757610257612e73565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102ce576102ce612e73565b146103385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103488483606001515f611020565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610375908490600401612ea9565b6020604051808303815f875af1158015610391573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b59190612edb565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610405575080546001600160401b03808416911610155b156104235760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561044e848461123f565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6104b064e8d4a5100083612f1a565b92915050565b5f6104b06001600160401b03831664e8d4a51000612f2d565b81156107f2575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610543573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261056a9190810190612f4f565b91509150806105cd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161032f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610610573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106349190612edb565b8251146106985760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161032f565b60208201516001600160a01b03161561070e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161032f565b5f8061071d846040015161125d565b9150915081881461078a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161032f565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6107fb83611435565b505050565b5f8061080b8661177d565b90506108198582868661183d565b9150505b949350505050565b5f5f805160206134b58339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610880573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108a79190810190612f4f565b91509150806108c85760405162461bcd60e51b815260040161032f90613021565b825482511461092b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161032f565b60208201516001600160a01b03161561099e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161032f565b5f806109ad8460400151611c74565b9150915080610a0f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161032f565b5f82815260058601602052604081208054610a2990613067565b9050118015610a5b575060015f83815260068701602052604090205460ff166005811115610a5957610a59612e73565b145b610a775760405162461bcd60e51b815260040161032f9061309f565b5f8281526005860160205260408120610a8f91612bc1565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206134b5833981519152929190610b8690613067565b9050118015610bb8575060015f83815260068301602052604090205460ff166005811115610bb657610bb6612e73565b145b610bd45760405162461bcd60e51b815260040161032f9061309f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c0d91906004016130e6565b6020604051808303815f875af1158015610c29573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fb9190612edb565b5f5f805160206134b58339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ca8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ccf9190810190612f4f565b9150915080610cf05760405162461bcd60e51b815260040161032f90613021565b5f8415610d74575f610d058460400151611e15565b919350909150506001600160401b03811615610d6e5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161032f565b50610dea565b5f610d828460400151611c74565b90925090508015610de85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161032f565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610e1b57610e1b612e73565b6005811115610e2c57610e2c612e73565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610ebd5760405162461bcd60e51b815260040161032f90613170565b5f600382516005811115610ed357610ed3612e73565b1480610ef15750600282516005811115610eef57610eef612e73565b145b15610f1457506020808201515f9081526007870190915260408120556004610f18565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f4957610f49612e73565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611099576110598160016131bc565b611064906008612f2d565b5081515f9083908390811061107b5761107b6131cf565b60200101906001600160f81b03191690815f1a905350600101611045565b505f5b60048110156110fc576110b08160036131bc565b6110bb906008612f2d565b6001901c60f81b826110ce8360026131e3565b815181106110de576110de6131cf565b60200101906001600160f81b03191690815f1a90535060010161109c565b505f5b602081101561115e5761111381601f6131bc565b61111e906008612f2d565b86901c60f81b826111308360066131e3565b81518110611140576111406131cf565b60200101906001600160f81b03191690815f1a9053506001016110ff565b505f5b60088110156111c9576111758160076131bc565b611180906008612f2d565b6001600160401b038616901c60f81b8261119b8360266131e3565b815181106111ab576111ab6131cf565b60200101906001600160f81b03191690815f1a905350600101611161565b505f5b6008811015611234576111e08160076131bc565b6111eb906008612f2d565b6001600160401b038516901c60f81b8261120683602e6131e3565b81518110611216576112166131cf565b60200101906001600160f81b03191690815f1a9053506001016111cc565b5090505b9392505050565b611247612050565b6112508261209b565b611259816120e1565b5050565b5f808251602e146112805760405162461bcd60e51b815260040161032f906131f6565b5f805b60028110156112cf576112978160016131bc565b6112a2906008612f2d565b61ffff168582815181106112b8576112b86131cf565b016020015160f81c901b9190911790600101611283565b5061ffff8116156112f25760405162461bcd60e51b815260040161032f9061323f565b5f805b600481101561134d576113098160036131bc565b611314906008612f2d565b63ffffffff16866113268360026131e3565b81518110611336576113366131cf565b016020015160f81c901b91909117906001016112f5565b5063ffffffff81166004146113745760405162461bcd60e51b815260040161032f90613282565b5f805b60208110156113c95761138b81601f6131bc565b611396906008612f2d565b876113a28360066131e3565b815181106113b2576113b26131cf565b016020015160f81c901b9190911790600101611377565b505f805b6008811015611428576113e18160076131bc565b6113ec906008612f2d565b6001600160401b0316886114018360266131e3565b81518110611411576114116131cf565b016020015160f81c901b91909117906001016113cd565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206134b583398151915293929190829060ff16600581111561149557611495612e73565b60058111156114a6576114a6612e73565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561152057611520612e73565b1461157c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161032f565b60408101516001600160a01b0316336001600160a01b0316146115b15760405162461bcd60e51b815260040161032f90613170565b6115be8160800151612195565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561160257611602612e73565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116b990859083611020565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116e8908590600401612ea9565b6020604051808303815f875af1158015611704573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117289190612edb565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00816117a984612336565b90505f6117b5826104a0565b83549091506001600160401b038216108015906117df57508260010154816001600160401b031611155b61081d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161032f565b5f61184661236c565b5f805160206134b5833981519152426001600160401b03851611801561188057506001600160401b03841661187e426202a3006131e3565b115b6118e25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161032f565b856119395760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161032f565b5f868152600782016020526040902054156119a75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161032f565b8251603014611a0e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161032f565b611a1785612195565b5f80611a5e6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506123b6565b5f82815260058601602052604090209193509150611a7c828261330d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611aa9908590600401612ea9565b6020604051808303815f875af1158015611ac5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae99190612edb565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611b6257611b62612e73565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061081d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611c975760405162461bcd60e51b815260040161032f906131f6565b5f805b6002811015611ce657611cae8160016131bc565b611cb9906008612f2d565b61ffff16858281518110611ccf57611ccf6131cf565b016020015160f81c901b9190911790600101611c9a565b5061ffff811615611d095760405162461bcd60e51b815260040161032f9061323f565b5f805b6004811015611d6457611d208160036131bc565b611d2b906008612f2d565b63ffffffff1686611d3d8360026131e3565b81518110611d4d57611d4d6131cf565b016020015160f81c901b9190911790600101611d0c565b5063ffffffff8116600214611d8b5760405162461bcd60e51b815260040161032f90613282565b5f805b6020811015611de057611da281601f6131bc565b611dad906008612f2d565b87611db98360066131e3565b81518110611dc957611dc96131cf565b016020015160f81c901b9190911790600101611d8e565b505f86602681518110611df557611df56131cf565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611e395760405162461bcd60e51b815260040161032f906131f6565b5f805b6002811015611e8857611e508160016131bc565b611e5b906008612f2d565b61ffff16868281518110611e7157611e716131cf565b016020015160f81c901b9190911790600101611e3c565b5061ffff811615611eab5760405162461bcd60e51b815260040161032f9061323f565b5f805b6004811015611f0657611ec28160036131bc565b611ecd906008612f2d565b63ffffffff1687611edf8360026131e3565b81518110611eef57611eef6131cf565b016020015160f81c901b9190911790600101611eae565b5063ffffffff8116600114611f2d5760405162461bcd60e51b815260040161032f90613282565b5f805b6020811015611f8257611f4481601f6131bc565b611f4f906008612f2d565b88611f5b8360066131e3565b81518110611f6b57611f6b6131cf565b016020015160f81c901b9190911790600101611f30565b505f805b6008811015611fe157611f9a8160076131bc565b611fa5906008612f2d565b6001600160401b031689611fba8360266131e3565b81518110611fca57611fca6131cf565b016020015160f81c901b9190911790600101611f86565b505f805b600881101561204057611ff98160076131bc565b612004906008612f2d565b6001600160401b03168a61201983602e6131e3565b81518110612029576120296131cf565b016020015160f81c901b9190911790600101611fe5565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661209957604051631afcd79f60e31b815260040160405180910390fd5b565b6120a3612050565b6120ac81612781565b6120de606082013560808301356120c960c0850160a08601612c8e565b6120d960e0860160c087016133cc565b6127a2565b50565b6120e9612050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166121755760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161032f565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206134b58339815191529060ff165f036121d3575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061221b90836131bc565b10612237576001600160401b0384166040830152808252612256565b838260400181815161224991906133e7565b6001600160401b03169052505b5f82602001518360400151606461226d919061340e565b6122779190613439565b600285015490915060ff90811690821611156122f25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161032f565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104b0827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690612810565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016123b057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124205760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161032f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612497576124578160016131bc565b612462906008612f2d565b5081515f90839083908110612479576124796131cf565b60200101906001600160f81b03191690815f1a905350600101612443565b505f5b60048110156124f5576124ae8160036131bc565b6124b9906008612f2d565b505f826124c78360026131e3565b815181106124d7576124d76131cf565b60200101906001600160f81b03191690815f1a90535060010161249a565b505f5b60208110156125525784518160208110612514576125146131cf565b1a60f81b826125248360066131e3565b81518110612534576125346131cf565b60200101906001600160f81b03191690815f1a9053506001016124f8565b505f5b60208110156125b25784602001518160208110612574576125746131cf565b1a60f81b826125848360266131e3565b81518110612594576125946131cf565b60200101906001600160f81b03191690815f1a905350600101612555565b505f5b6008811015612626576125c98160076131bc565b6125d4906008612f2d565b60ff1685604001516001600160401b0316901c60f81b828260466125f891906131e3565b81518110612608576126086131cf565b60200101906001600160f81b03191690815f1a9053506001016125b5565b505f5b60308110156126915784608001518181518110612648576126486131cf565b01602001516001600160f81b0319168261266383604e6131e3565b81518110612673576126736131cf565b60200101906001600160f81b03191690815f1a905350600101612629565b505f5b6008811015612703576126a88160076131bc565b6126b3906008612f2d565b60608601516001600160401b0390811691161c60f81b826126d583607e6131e3565b815181106126e5576126e56131cf565b60200101906001600160f81b03191690815f1a905350600101612694565b50600281604051612714919061345e565b602060405180830381855afa15801561272f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127529190612edb565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612789612050565b612791612972565b612799612982565b6120de8161298a565b6127aa612050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612856573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287a9190612edb565b90506128916001600160a01b0385163330866129f6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156128d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128f99190612edb565b905081811161295f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161032f565b61296982826131bc565b95945050505050565b61297a612050565b612099612a56565b612099612050565b612992612050565b80355f805160206134b583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556129dc6060830160408401613479565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a50908590612a5e565b50505050565b61275b612050565b5f612a726001600160a01b03841683612abf565b905080515f14158015612a96575080806020019051810190612a949190613499565b155b156107fb57604051635274afe760e01b81526001600160a01b038416600482015260240161032f565b606061123883835f845f80856001600160a01b03168486604051612ae3919061345e565b5f6040518083038185875af1925050503d805f8114612b1d576040519150601f19603f3d011682016040523d82523d5f602084013e612b22565b606091505b5091509150612b32868383612b3c565b9695505050505050565b606082612b5157612b4c82612b98565b611238565b8151158015612b6857506001600160a01b0384163b155b15612b9157604051639996b31560e01b81526001600160a01b038516600482015260240161032f565b5080611238565b805115612ba85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054612bcd90613067565b5f825580601f10612bdc575050565b601f0160209004905f5260205f20908101906120de91905b80821115612c07575f8155600101612bf4565b5090565b5f60208284031215612c1b575f80fd5b5035919050565b6001600160a01b03811681146120de575f80fd5b5f80828403610100811215612c49575f80fd5b60e0811215612c56575f80fd5b5082915060e0830135612c6881612c22565b809150509250929050565b80356001600160401b0381168114612c89575f80fd5b919050565b5f60208284031215612c9e575f80fd5b61123882612c73565b80151581146120de575f80fd5b803563ffffffff81168114612c89575f80fd5b5f805f60608486031215612cd9575f80fd5b833592506020840135612ceb81612ca7565b9150612cf960408501612cb4565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612d3857612d38612d02565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612d6657612d66612d02565b604052919050565b5f6001600160401b03821115612d8657612d86612d02565b50601f01601f191660200190565b5f805f8060808587031215612da7575f80fd5b8435935060208501359250612dbe60408601612c73565b915060608501356001600160401b03811115612dd8575f80fd5b8501601f81018713612de8575f80fd5b8035612dfb612df682612d6e565b612d3e565b818152886020838501011115612e0f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612e40575f80fd5b61123882612cb4565b5f8060408385031215612e5a575f80fd5b612e6383612cb4565b91506020830135612c6881612ca7565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612ea1578181015183820152602001612e89565b50505f910152565b602081525f8251806020840152612ec7816040850160208701612e87565b601f01601f19169190910160400192915050565b5f60208284031215612eeb575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612f2857612f28612ef2565b500490565b80820281158282048414176104b0576104b0612f06565b8051612c8981612ca7565b5f8060408385031215612f60575f80fd5b82516001600160401b0380821115612f76575f80fd5b9084019060608287031215612f89575f80fd5b612f91612d16565b82518152602080840151612fa481612c22565b82820152604084015183811115612fb9575f80fd5b80850194505087601f850112612fcd575f80fd5b83519250612fdd612df684612d6e565b8381528882858701011115612ff0575f80fd5b612fff84838301848801612e87565b80604084015250819550613014818801612f44565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061307b57607f821691505b60208210810361309957634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546130f881613067565b806020870152604060018084165f8114613119576001811461313557613162565b60ff19851660408a0152604084151560051b8a01019550613162565b895f5260205f205f5b858110156131595781548b820186015290830190880161313e565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104b0576104b0612f06565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104b0576104b0612f06565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f8211156107fb57805f5260205f20601f840160051c810160208510156132ee5750805b601f840160051c820191505b818110156103b5575f81556001016132fa565b81516001600160401b0381111561332657613326612d02565b61333a816133348454613067565b846132c9565b602080601f83116001811461336d575f84156133565750858301515b5f19600386901b1c1916600185901b1785556133c4565b5f85815260208120601f198616915b8281101561339b5788860151825594840194600190910190840161337c565b50858210156133b857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156133dc575f80fd5b813561123881612c22565b6001600160401b0381811683821601908082111561340757613407612f06565b5092915050565b6001600160401b0381811683821602808216919082811461343157613431612f06565b505092915050565b5f6001600160401b038084168061345257613452612ef2565b92169190910492915050565b5f825161346f818460208701612e87565b9190910192915050565b5f60208284031215613489575f80fd5b813560ff81168114611238575f80fd5b5f602082840312156134a9575f80fd5b815161123881612ca756fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161362e38038061362e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6134e18061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c806376f786211161006e57806376f7862114610161578063872fda6414610174578063a3a65e4814610187578063b771b3bc1461019a578063bee0a03f146101c0578063fdf94a1a146101d3575f80fd5b80630322ed98146100aa5780630cdd0985146100bf57806327f39ca8146101105780632e2194d814610123578063620658561461014e575b5f80fd5b6100bd6100b8366004612c0b565b6101e6565b005b6100fd6100cd366004612c0b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6100bd61011e366004612c36565b6103bc565b610136610131366004612c0b565b6104a0565b6040516001600160401b039091168152602001610107565b6100fd61015c366004612c8e565b6104b6565b6100bd61016f366004612cc7565b6104cf565b6100fd610182366004612d94565b610800565b6100bd610195366004612e30565b610825565b6101a86005600160991b0181565b6040516001600160a01b039091168152602001610107565b6100bd6101ce366004612c0b565b610b3e565b6100bd6101e1366004612e49565b610c4d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206134b583398151915293929190829060ff16600581111561024657610246612e73565b600581111561025757610257612e73565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102ce576102ce612e73565b146103385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103488483606001515f611020565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610375908490600401612ea9565b6020604051808303815f875af1158015610391573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b59190612edb565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610405575080546001600160401b03808416911610155b156104235760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561044e848461123f565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6104b064e8d4a5100083612f1a565b92915050565b5f6104b06001600160401b03831664e8d4a51000612f2d565b81156107f2575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610543573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261056a9190810190612f4f565b91509150806105cd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161032f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610610573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106349190612edb565b8251146106985760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161032f565b60208201516001600160a01b03161561070e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161032f565b5f8061071d846040015161125d565b9150915081881461078a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161032f565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6107fb83611435565b505050565b5f8061080b8661177d565b90506108198582868661183d565b9150505b949350505050565b5f5f805160206134b58339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610880573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108a79190810190612f4f565b91509150806108c85760405162461bcd60e51b815260040161032f90613021565b825482511461092b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161032f565b60208201516001600160a01b03161561099e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161032f565b5f806109ad8460400151611c74565b9150915080610a0f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161032f565b5f82815260058601602052604081208054610a2990613067565b9050118015610a5b575060015f83815260068701602052604090205460ff166005811115610a5957610a59612e73565b145b610a775760405162461bcd60e51b815260040161032f9061309f565b5f8281526005860160205260408120610a8f91612bc1565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206134b5833981519152929190610b8690613067565b9050118015610bb8575060015f83815260068301602052604090205460ff166005811115610bb657610bb6612e73565b145b610bd45760405162461bcd60e51b815260040161032f9061309f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c0d91906004016130e6565b6020604051808303815f875af1158015610c29573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fb9190612edb565b5f5f805160206134b58339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ca8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ccf9190810190612f4f565b9150915080610cf05760405162461bcd60e51b815260040161032f90613021565b5f8415610d74575f610d058460400151611e15565b919350909150506001600160401b03811615610d6e5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161032f565b50610dea565b5f610d828460400151611c74565b90925090508015610de85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161032f565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610e1b57610e1b612e73565b6005811115610e2c57610e2c612e73565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610ebd5760405162461bcd60e51b815260040161032f90613170565b5f600382516005811115610ed357610ed3612e73565b1480610ef15750600282516005811115610eef57610eef612e73565b145b15610f1457506020808201515f9081526007870190915260408120556004610f18565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f4957610f49612e73565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611099576110598160016131bc565b611064906008612f2d565b5081515f9083908390811061107b5761107b6131cf565b60200101906001600160f81b03191690815f1a905350600101611045565b505f5b60048110156110fc576110b08160036131bc565b6110bb906008612f2d565b6001901c60f81b826110ce8360026131e3565b815181106110de576110de6131cf565b60200101906001600160f81b03191690815f1a90535060010161109c565b505f5b602081101561115e5761111381601f6131bc565b61111e906008612f2d565b86901c60f81b826111308360066131e3565b81518110611140576111406131cf565b60200101906001600160f81b03191690815f1a9053506001016110ff565b505f5b60088110156111c9576111758160076131bc565b611180906008612f2d565b6001600160401b038616901c60f81b8261119b8360266131e3565b815181106111ab576111ab6131cf565b60200101906001600160f81b03191690815f1a905350600101611161565b505f5b6008811015611234576111e08160076131bc565b6111eb906008612f2d565b6001600160401b038516901c60f81b8261120683602e6131e3565b81518110611216576112166131cf565b60200101906001600160f81b03191690815f1a9053506001016111cc565b5090505b9392505050565b611247612050565b6112508261209b565b611259816120e1565b5050565b5f808251602e146112805760405162461bcd60e51b815260040161032f906131f6565b5f805b60028110156112cf576112978160016131bc565b6112a2906008612f2d565b61ffff168582815181106112b8576112b86131cf565b016020015160f81c901b9190911790600101611283565b5061ffff8116156112f25760405162461bcd60e51b815260040161032f9061323f565b5f805b600481101561134d576113098160036131bc565b611314906008612f2d565b63ffffffff16866113268360026131e3565b81518110611336576113366131cf565b016020015160f81c901b91909117906001016112f5565b5063ffffffff81166004146113745760405162461bcd60e51b815260040161032f90613282565b5f805b60208110156113c95761138b81601f6131bc565b611396906008612f2d565b876113a28360066131e3565b815181106113b2576113b26131cf565b016020015160f81c901b9190911790600101611377565b505f805b6008811015611428576113e18160076131bc565b6113ec906008612f2d565b6001600160401b0316886114018360266131e3565b81518110611411576114116131cf565b016020015160f81c901b91909117906001016113cd565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206134b583398151915293929190829060ff16600581111561149557611495612e73565b60058111156114a6576114a6612e73565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561152057611520612e73565b1461157c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161032f565b60408101516001600160a01b0316336001600160a01b0316146115b15760405162461bcd60e51b815260040161032f90613170565b6115be8160800151612195565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561160257611602612e73565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116b990859083611020565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116e8908590600401612ea9565b6020604051808303815f875af1158015611704573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117289190612edb565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00816117a984612336565b90505f6117b5826104a0565b83549091506001600160401b038216108015906117df57508260010154816001600160401b031611155b61081d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161032f565b5f61184661236c565b5f805160206134b5833981519152426001600160401b03851611801561188057506001600160401b03841661187e426202a3006131e3565b115b6118e25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161032f565b856119395760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161032f565b5f868152600782016020526040902054156119a75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161032f565b8251603014611a0e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161032f565b611a1785612195565b5f80611a5e6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506123b6565b5f82815260058601602052604090209193509150611a7c828261330d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611aa9908590600401612ea9565b6020604051808303815f875af1158015611ac5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae99190612edb565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611b6257611b62612e73565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061081d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611c975760405162461bcd60e51b815260040161032f906131f6565b5f805b6002811015611ce657611cae8160016131bc565b611cb9906008612f2d565b61ffff16858281518110611ccf57611ccf6131cf565b016020015160f81c901b9190911790600101611c9a565b5061ffff811615611d095760405162461bcd60e51b815260040161032f9061323f565b5f805b6004811015611d6457611d208160036131bc565b611d2b906008612f2d565b63ffffffff1686611d3d8360026131e3565b81518110611d4d57611d4d6131cf565b016020015160f81c901b9190911790600101611d0c565b5063ffffffff8116600214611d8b5760405162461bcd60e51b815260040161032f90613282565b5f805b6020811015611de057611da281601f6131bc565b611dad906008612f2d565b87611db98360066131e3565b81518110611dc957611dc96131cf565b016020015160f81c901b9190911790600101611d8e565b505f86602681518110611df557611df56131cf565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611e395760405162461bcd60e51b815260040161032f906131f6565b5f805b6002811015611e8857611e508160016131bc565b611e5b906008612f2d565b61ffff16868281518110611e7157611e716131cf565b016020015160f81c901b9190911790600101611e3c565b5061ffff811615611eab5760405162461bcd60e51b815260040161032f9061323f565b5f805b6004811015611f0657611ec28160036131bc565b611ecd906008612f2d565b63ffffffff1687611edf8360026131e3565b81518110611eef57611eef6131cf565b016020015160f81c901b9190911790600101611eae565b5063ffffffff8116600114611f2d5760405162461bcd60e51b815260040161032f90613282565b5f805b6020811015611f8257611f4481601f6131bc565b611f4f906008612f2d565b88611f5b8360066131e3565b81518110611f6b57611f6b6131cf565b016020015160f81c901b9190911790600101611f30565b505f805b6008811015611fe157611f9a8160076131bc565b611fa5906008612f2d565b6001600160401b031689611fba8360266131e3565b81518110611fca57611fca6131cf565b016020015160f81c901b9190911790600101611f86565b505f805b600881101561204057611ff98160076131bc565b612004906008612f2d565b6001600160401b03168a61201983602e6131e3565b81518110612029576120296131cf565b016020015160f81c901b9190911790600101611fe5565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661209957604051631afcd79f60e31b815260040160405180910390fd5b565b6120a3612050565b6120ac81612781565b6120de606082013560808301356120c960c0850160a08601612c8e565b6120d960e0860160c087016133cc565b6127a2565b50565b6120e9612050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166121755760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161032f565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206134b58339815191529060ff165f036121d3575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061221b90836131bc565b10612237576001600160401b0384166040830152808252612256565b838260400181815161224991906133e7565b6001600160401b03169052505b5f82602001518360400151606461226d919061340e565b6122779190613439565b600285015490915060ff90811690821611156122f25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161032f565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104b0827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690612810565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016123b057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124205760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161032f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612497576124578160016131bc565b612462906008612f2d565b5081515f90839083908110612479576124796131cf565b60200101906001600160f81b03191690815f1a905350600101612443565b505f5b60048110156124f5576124ae8160036131bc565b6124b9906008612f2d565b505f826124c78360026131e3565b815181106124d7576124d76131cf565b60200101906001600160f81b03191690815f1a90535060010161249a565b505f5b60208110156125525784518160208110612514576125146131cf565b1a60f81b826125248360066131e3565b81518110612534576125346131cf565b60200101906001600160f81b03191690815f1a9053506001016124f8565b505f5b60208110156125b25784602001518160208110612574576125746131cf565b1a60f81b826125848360266131e3565b81518110612594576125946131cf565b60200101906001600160f81b03191690815f1a905350600101612555565b505f5b6008811015612626576125c98160076131bc565b6125d4906008612f2d565b60ff1685604001516001600160401b0316901c60f81b828260466125f891906131e3565b81518110612608576126086131cf565b60200101906001600160f81b03191690815f1a9053506001016125b5565b505f5b60308110156126915784608001518181518110612648576126486131cf565b01602001516001600160f81b0319168261266383604e6131e3565b81518110612673576126736131cf565b60200101906001600160f81b03191690815f1a905350600101612629565b505f5b6008811015612703576126a88160076131bc565b6126b3906008612f2d565b60608601516001600160401b0390811691161c60f81b826126d583607e6131e3565b815181106126e5576126e56131cf565b60200101906001600160f81b03191690815f1a905350600101612694565b50600281604051612714919061345e565b602060405180830381855afa15801561272f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127529190612edb565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612789612050565b612791612972565b612799612982565b6120de8161298a565b6127aa612050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612856573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287a9190612edb565b90506128916001600160a01b0385163330866129f6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156128d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128f99190612edb565b905081811161295f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161032f565b61296982826131bc565b95945050505050565b61297a612050565b612099612a56565b612099612050565b612992612050565b80355f805160206134b583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556129dc6060830160408401613479565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a50908590612a5e565b50505050565b61275b612050565b5f612a726001600160a01b03841683612abf565b905080515f14158015612a96575080806020019051810190612a949190613499565b155b156107fb57604051635274afe760e01b81526001600160a01b038416600482015260240161032f565b606061123883835f845f80856001600160a01b03168486604051612ae3919061345e565b5f6040518083038185875af1925050503d805f8114612b1d576040519150601f19603f3d011682016040523d82523d5f602084013e612b22565b606091505b5091509150612b32868383612b3c565b9695505050505050565b606082612b5157612b4c82612b98565b611238565b8151158015612b6857506001600160a01b0384163b155b15612b9157604051639996b31560e01b81526001600160a01b038516600482015260240161032f565b5080611238565b805115612ba85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054612bcd90613067565b5f825580601f10612bdc575050565b601f0160209004905f5260205f20908101906120de91905b80821115612c07575f8155600101612bf4565b5090565b5f60208284031215612c1b575f80fd5b5035919050565b6001600160a01b03811681146120de575f80fd5b5f80828403610100811215612c49575f80fd5b60e0811215612c56575f80fd5b5082915060e0830135612c6881612c22565b809150509250929050565b80356001600160401b0381168114612c89575f80fd5b919050565b5f60208284031215612c9e575f80fd5b61123882612c73565b80151581146120de575f80fd5b803563ffffffff81168114612c89575f80fd5b5f805f60608486031215612cd9575f80fd5b833592506020840135612ceb81612ca7565b9150612cf960408501612cb4565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612d3857612d38612d02565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612d6657612d66612d02565b604052919050565b5f6001600160401b03821115612d8657612d86612d02565b50601f01601f191660200190565b5f805f8060808587031215612da7575f80fd5b8435935060208501359250612dbe60408601612c73565b915060608501356001600160401b03811115612dd8575f80fd5b8501601f81018713612de8575f80fd5b8035612dfb612df682612d6e565b612d3e565b818152886020838501011115612e0f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612e40575f80fd5b61123882612cb4565b5f8060408385031215612e5a575f80fd5b612e6383612cb4565b91506020830135612c6881612ca7565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612ea1578181015183820152602001612e89565b50505f910152565b602081525f8251806020840152612ec7816040850160208701612e87565b601f01601f19169190910160400192915050565b5f60208284031215612eeb575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612f2857612f28612ef2565b500490565b80820281158282048414176104b0576104b0612f06565b8051612c8981612ca7565b5f8060408385031215612f60575f80fd5b82516001600160401b0380821115612f76575f80fd5b9084019060608287031215612f89575f80fd5b612f91612d16565b82518152602080840151612fa481612c22565b82820152604084015183811115612fb9575f80fd5b80850194505087601f850112612fcd575f80fd5b83519250612fdd612df684612d6e565b8381528882858701011115612ff0575f80fd5b612fff84838301848801612e87565b80604084015250819550613014818801612f44565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061307b57607f821691505b60208210810361309957634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546130f881613067565b806020870152604060018084165f8114613119576001811461313557613162565b60ff19851660408a0152604084151560051b8a01019550613162565b895f5260205f205f5b858110156131595781548b820186015290830190880161313e565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104b0576104b0612f06565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104b0576104b0612f06565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f8211156107fb57805f5260205f20601f840160051c810160208510156132ee5750805b601f840160051c820191505b818110156103b5575f81556001016132fa565b81516001600160401b0381111561332657613326612d02565b61333a816133348454613067565b846132c9565b602080601f83116001811461336d575f84156133565750858301515b5f19600386901b1c1916600185901b1785556133c4565b5f85815260208120601f198616915b8281101561339b5788860151825594840194600190910190840161337c565b50858210156133b857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156133dc575f80fd5b813561123881612c22565b6001600160401b0381811683821601908082111561340757613407612f06565b5092915050565b6001600160401b0381811683821602808216919082811461343157613431612f06565b505092915050565b5f6001600160401b038084168061345257613452612ef2565b92169190910492915050565b5f825161346f818460208701612e87565b9190910192915050565b5f60208284031215613489575f80fd5b813560ff81168114611238575f80fd5b5f602082840312156134a9575f80fd5b815161123881612ca756fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -249,12 +249,12 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WARPMESS return _ERC20TokenStakingManager.Contract.WARPMESSENGER(&_ERC20TokenStakingManager.CallOpts) } -// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. // -// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetActiveValidator(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) ActiveValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "getActiveValidator", nodeID) + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "activeValidators", nodeID) if err != nil { return *new([32]byte), err @@ -266,18 +266,18 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetActiveValida } -// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. // -// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) GetActiveValidator(nodeID [32]byte) ([32]byte, error) { - return _ERC20TokenStakingManager.Contract.GetActiveValidator(&_ERC20TokenStakingManager.CallOpts, nodeID) +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { + return _ERC20TokenStakingManager.Contract.ActiveValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) } -// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. // -// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) GetActiveValidator(nodeID [32]byte) ([32]byte, error) { - return _ERC20TokenStakingManager.Contract.GetActiveValidator(&_ERC20TokenStakingManager.CallOpts, nodeID) +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { + return _ERC20TokenStakingManager.Contract.ActiveValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) } // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 004e49c04..5fa906ead 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveValidator\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161323338038061323383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130e68061014d5f395ff3fe608060405260043610610099575f3560e01c806376f786211161006257806376f7862114610190578063a3a65e48146101af578063b771b3bc146101ce578063bee0a03f14610200578063f40797d71461021f578063fdf94a1a14610232575f80fd5b8062e417921461009d5780630322ed98146100be5780632e2194d8146100dd5780636206585614610119578063687e842014610146575b5f80fd5b3480156100a8575f80fd5b506100bc6100b7366004612850565b610251565b005b3480156100c9575f80fd5b506100bc6100d8366004612866565b610333565b3480156100e8575f80fd5b506100fc6100f7366004612866565b610509565b6040516001600160401b0390911681526020015b60405180910390f35b348015610124575f80fd5b50610138610133366004612898565b61051f565b604051908152602001610110565b348015610151575f80fd5b50610138610160366004612866565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b34801561019b575f80fd5b506100bc6101aa3660046128d8565b610538565b3480156101ba575f80fd5b506100bc6101c9366004612913565b610869565b3480156101d9575f80fd5b506101e86005600160991b0181565b6040516001600160a01b039091168152602001610110565b34801561020b575f80fd5b506100bc61021a366004612866565b610b82565b61013861022d3660046129be565b610c91565b34801561023d575f80fd5b506100bc61024c366004612a50565b610cb3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061029a575080546001600160401b03808416911610155b156102b85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556102e283611086565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206130ba83398151915293929190829060ff16600581111561039357610393612a85565b60058111156103a4576103a4612a85565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561041b5761041b612a85565b146104855760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6104958483606001515f61109a565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104c2908490600401612abb565b6020604051808303815f875af11580156104de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105029190612aed565b5050505050565b5f61051964e8d4a5100083612b2c565b92915050565b5f6105196001600160401b03831664e8d4a51000612b3f565b811561085b575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156105ac573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105d39190810190612b75565b91509150806106365760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161047c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610679573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069d9190612aed565b8251146107015760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161047c565b60208201516001600160a01b0316156107775760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161047c565b5f8061078684604001516112b7565b915091508188146107f35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161047c565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6108648361148f565b505050565b5f5f805160206130ba8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156108c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108eb9190810190612b75565b915091508061090c5760405162461bcd60e51b815260040161047c90612c47565b825482511461096f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161047c565b60208201516001600160a01b0316156109e25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161047c565b5f806109f184604001516117d7565b9150915080610a535760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161047c565b5f82815260058601602052604081208054610a6d90612c8d565b9050118015610a9f575060015f83815260068701602052604090205460ff166005811115610a9d57610a9d612a85565b145b610abb5760405162461bcd60e51b815260040161047c90612cbf565b5f8281526005860160205260408120610ad391612806565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206130ba833981519152929190610bca90612c8d565b9050118015610bfc575060015f83815260068301602052604090205460ff166005811115610bfa57610bfa612a85565b145b610c185760405162461bcd60e51b815260040161047c90612cbf565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c519190600401612d06565b6020604051808303815f875af1158015610c6d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108649190612aed565b5f80610c9c34611978565b9050610caa85828686611a35565b95945050505050565b5f5f805160206130ba8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610d0e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d359190810190612b75565b9150915080610d565760405162461bcd60e51b815260040161047c90612c47565b5f8415610dda575f610d6b8460400151611e6c565b919350909150506001600160401b03811615610dd45760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161047c565b50610e50565b5f610de884604001516117d7565b90925090508015610e4e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161047c565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610e8157610e81612a85565b6005811115610e9257610e92612a85565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610f235760405162461bcd60e51b815260040161047c90612d90565b5f600382516005811115610f3957610f39612a85565b1480610f575750600282516005811115610f5557610f55612a85565b145b15610f7a57506020808201515f9081526007870190915260408120556004610f7e565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610faf57610faf612a85565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b61108e6120a7565b611097816120f2565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611113576110d3816001612ddc565b6110de906008612b3f565b5081515f908390839081106110f5576110f5612def565b60200101906001600160f81b03191690815f1a9053506001016110bf565b505f5b60048110156111765761112a816003612ddc565b611135906008612b3f565b6001901c60f81b82611148836002612e03565b8151811061115857611158612def565b60200101906001600160f81b03191690815f1a905350600101611116565b505f5b60208110156111d85761118d81601f612ddc565b611198906008612b3f565b86901c60f81b826111aa836006612e03565b815181106111ba576111ba612def565b60200101906001600160f81b03191690815f1a905350600101611179565b505f5b6008811015611243576111ef816007612ddc565b6111fa906008612b3f565b6001600160401b038616901c60f81b82611215836026612e03565b8151811061122557611225612def565b60200101906001600160f81b03191690815f1a9053506001016111db565b505f5b60088110156112ae5761125a816007612ddc565b611265906008612b3f565b6001600160401b038516901c60f81b8261128083602e612e03565b8151811061129057611290612def565b60200101906001600160f81b03191690815f1a905350600101611246565b50949350505050565b5f808251602e146112da5760405162461bcd60e51b815260040161047c90612e16565b5f805b6002811015611329576112f1816001612ddc565b6112fc906008612b3f565b61ffff1685828151811061131257611312612def565b016020015160f81c901b91909117906001016112dd565b5061ffff81161561134c5760405162461bcd60e51b815260040161047c90612e5f565b5f805b60048110156113a757611363816003612ddc565b61136e906008612b3f565b63ffffffff1686611380836002612e03565b8151811061139057611390612def565b016020015160f81c901b919091179060010161134f565b5063ffffffff81166004146113ce5760405162461bcd60e51b815260040161047c90612ea2565b5f805b6020811015611423576113e581601f612ddc565b6113f0906008612b3f565b876113fc836006612e03565b8151811061140c5761140c612def565b016020015160f81c901b91909117906001016113d1565b505f805b60088110156114825761143b816007612ddc565b611446906008612b3f565b6001600160401b03168861145b836026612e03565b8151811061146b5761146b612def565b016020015160f81c901b9190911790600101611427565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206130ba83398151915293929190829060ff1660058111156114ef576114ef612a85565b600581111561150057611500612a85565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561157a5761157a612a85565b146115d65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161047c565b60408101516001600160a01b0316336001600160a01b03161461160b5760405162461bcd60e51b815260040161047c90612d90565b6116188160800151612135565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561165c5761165c612a85565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906117139085908361109a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611742908590600401612abb565b6020604051808303815f875af115801561175e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117829190612aed565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117fa5760405162461bcd60e51b815260040161047c90612e16565b5f805b600281101561184957611811816001612ddc565b61181c906008612b3f565b61ffff1685828151811061183257611832612def565b016020015160f81c901b91909117906001016117fd565b5061ffff81161561186c5760405162461bcd60e51b815260040161047c90612e5f565b5f805b60048110156118c757611883816003612ddc565b61188e906008612b3f565b63ffffffff16866118a0836002612e03565b815181106118b0576118b0612def565b016020015160f81c901b919091179060010161186f565b5063ffffffff81166002146118ee5760405162461bcd60e51b815260040161047c90612ea2565b5f805b60208110156119435761190581601f612ddc565b611910906008612b3f565b8761191c836006612e03565b8151811061192c5761192c612def565b016020015160f81c901b91909117906001016118f1565b505f8660268151811061195857611958612def565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0082826119a582610509565b83549091506001600160401b038216108015906119cf57508260010154816001600160401b031611155b611a2d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161047c565b949350505050565b5f611a3e6122d6565b5f805160206130ba833981519152426001600160401b038516118015611a7857506001600160401b038416611a76426202a300612e03565b115b611ada5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161047c565b85611b315760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161047c565b5f86815260078201602052604090205415611b9f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161047c565b8251603014611c065760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161047c565b611c0f85612135565b5f80611c566040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612320565b5f82815260058601602052604090209193509150611c748282612f2d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ca1908590600401612abb565b6020604051808303815f875af1158015611cbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce19190612aed565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611d5a57611d5a612a85565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a2d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611e905760405162461bcd60e51b815260040161047c90612e16565b5f805b6002811015611edf57611ea7816001612ddc565b611eb2906008612b3f565b61ffff16868281518110611ec857611ec8612def565b016020015160f81c901b9190911790600101611e93565b5061ffff811615611f025760405162461bcd60e51b815260040161047c90612e5f565b5f805b6004811015611f5d57611f19816003612ddc565b611f24906008612b3f565b63ffffffff1687611f36836002612e03565b81518110611f4657611f46612def565b016020015160f81c901b9190911790600101611f05565b5063ffffffff8116600114611f845760405162461bcd60e51b815260040161047c90612ea2565b5f805b6020811015611fd957611f9b81601f612ddc565b611fa6906008612b3f565b88611fb2836006612e03565b81518110611fc257611fc2612def565b016020015160f81c901b9190911790600101611f87565b505f805b600881101561203857611ff1816007612ddc565b611ffc906008612b3f565b6001600160401b031689612011836026612e03565b8151811061202157612021612def565b016020015160f81c901b9190911790600101611fdd565b505f805b600881101561209757612050816007612ddc565b61205b906008612b3f565b6001600160401b03168a61207083602e612e03565b8151811061208057612080612def565b016020015160f81c901b919091179060010161203c565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166120f057604051631afcd79f60e31b815260040160405180910390fd5b565b6120fa6120a7565b612103816126eb565b6110976060820135608083013561212060c0850160a08601612898565b61213060e0860160c08701612fec565b61270c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206130ba8339815191529060ff165f03612173575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121bb9083612ddc565b106121d7576001600160401b03841660408301528082526121f6565b83826040018181516121e99190613007565b6001600160401b03169052505b5f82602001518360400151606461220d919061302e565b6122179190613059565b600285015490915060ff90811690821611156122925760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161047c565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161231a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461238a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161047c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612401576123c1816001612ddc565b6123cc906008612b3f565b5081515f908390839081106123e3576123e3612def565b60200101906001600160f81b03191690815f1a9053506001016123ad565b505f5b600481101561245f57612418816003612ddc565b612423906008612b3f565b505f82612431836002612e03565b8151811061244157612441612def565b60200101906001600160f81b03191690815f1a905350600101612404565b505f5b60208110156124bc578451816020811061247e5761247e612def565b1a60f81b8261248e836006612e03565b8151811061249e5761249e612def565b60200101906001600160f81b03191690815f1a905350600101612462565b505f5b602081101561251c57846020015181602081106124de576124de612def565b1a60f81b826124ee836026612e03565b815181106124fe576124fe612def565b60200101906001600160f81b03191690815f1a9053506001016124bf565b505f5b600881101561259057612533816007612ddc565b61253e906008612b3f565b60ff1685604001516001600160401b0316901c60f81b828260466125629190612e03565b8151811061257257612572612def565b60200101906001600160f81b03191690815f1a90535060010161251f565b505f5b60308110156125fb57846080015181815181106125b2576125b2612def565b01602001516001600160f81b031916826125cd83604e612e03565b815181106125dd576125dd612def565b60200101906001600160f81b03191690815f1a905350600101612593565b505f5b600881101561266d57612612816007612ddc565b61261d906008612b3f565b60608601516001600160401b0390811691161c60f81b8261263f83607e612e03565b8151811061264f5761264f612def565b60200101906001600160f81b03191690815f1a9053506001016125fe565b5060028160405161267e919061307e565b602060405180830381855afa158015612699573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906126bc9190612aed565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126f36120a7565b6126fb61277a565b61270361278a565b61109781612792565b6127146120a7565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6127826120a7565b6120f06127fe565b6120f06120a7565b61279a6120a7565b80355f805160206130ba83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556127e46060830160408401613099565b600291909101805460ff191660ff90921691909117905550565b6126c56120a7565b50805461281290612c8d565b5f825580601f10612821575050565b601f0160209004905f5260205f209081019061109791905b8082111561284c575f8155600101612839565b5090565b5f60e08284031215612860575f80fd5b50919050565b5f60208284031215612876575f80fd5b5035919050565b80356001600160401b0381168114612893575f80fd5b919050565b5f602082840312156128a8575f80fd5b6128b18261287d565b9392505050565b8015158114611097575f80fd5b803563ffffffff81168114612893575f80fd5b5f805f606084860312156128ea575f80fd5b8335925060208401356128fc816128b8565b915061290a604085016128c5565b90509250925092565b5f60208284031215612923575f80fd5b6128b1826128c5565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129625761296261292c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129905761299061292c565b604052919050565b5f6001600160401b038211156129b0576129b061292c565b50601f01601f191660200190565b5f805f606084860312156129d0575f80fd5b833592506129e06020850161287d565b915060408401356001600160401b038111156129fa575f80fd5b8401601f81018613612a0a575f80fd5b8035612a1d612a1882612998565b612968565b818152876020838501011115612a31575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612a61575f80fd5b612a6a836128c5565b91506020830135612a7a816128b8565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612ab3578181015183820152602001612a9b565b50505f910152565b602081525f8251806020840152612ad9816040850160208701612a99565b601f01601f19169190910160400192915050565b5f60208284031215612afd575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612b3a57612b3a612b04565b500490565b808202811582820484141761051957610519612b18565b6001600160a01b0381168114611097575f80fd5b8051612893816128b8565b5f8060408385031215612b86575f80fd5b82516001600160401b0380821115612b9c575f80fd5b9084019060608287031215612baf575f80fd5b612bb7612940565b82518152602080840151612bca81612b56565b82820152604084015183811115612bdf575f80fd5b80850194505087601f850112612bf3575f80fd5b83519250612c03612a1884612998565b8381528882858701011115612c16575f80fd5b612c2584838301848801612a99565b80604084015250819550612c3a818801612b6a565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612ca157607f821691505b60208210810361286057634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612d1881612c8d565b806020870152604060018084165f8114612d395760018114612d5557612d82565b60ff19851660408a0152604084151560051b8a01019550612d82565b895f5260205f205f5b85811015612d795781548b8201860152908301908801612d5e565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561051957610519612b18565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561051957610519612b18565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f82111561086457805f5260205f20601f840160051c81016020851015612f0e5750805b601f840160051c820191505b81811015610502575f8155600101612f1a565b81516001600160401b03811115612f4657612f4661292c565b612f5a81612f548454612c8d565b84612ee9565b602080601f831160018114612f8d575f8415612f765750858301515b5f19600386901b1c1916600185901b178555612fe4565b5f85815260208120601f198616915b82811015612fbb57888601518255948401946001909101908401612f9c565b5085821015612fd857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215612ffc575f80fd5b81356128b181612b56565b6001600160401b0381811683821601908082111561302757613027612b18565b5092915050565b6001600160401b0381811683821602808216919082811461305157613051612b18565b505092915050565b5f6001600160401b038084168061307257613072612b04565b92169190910492915050565b5f825161308f818460208701612a99565b9190910192915050565b5f602082840312156130a9575f80fd5b813560ff811681146128b1575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161323338038061323383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130e68061014d5f395ff3fe608060405260043610610099575f3560e01c806376f786211161006257806376f7862114610190578063a3a65e48146101af578063b771b3bc146101ce578063bee0a03f14610200578063f40797d71461021f578063fdf94a1a14610232575f80fd5b8062e417921461009d5780630322ed98146100be5780630cdd0985146100dd5780632e2194d81461013a5780636206585614610171575b5f80fd5b3480156100a8575f80fd5b506100bc6100b7366004612850565b610251565b005b3480156100c9575f80fd5b506100bc6100d8366004612866565b610333565b3480156100e8575f80fd5b506101276100f7366004612866565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b348015610145575f80fd5b50610159610154366004612866565b610509565b6040516001600160401b039091168152602001610131565b34801561017c575f80fd5b5061012761018b366004612898565b61051f565b34801561019b575f80fd5b506100bc6101aa3660046128d8565b610538565b3480156101ba575f80fd5b506100bc6101c9366004612913565b610869565b3480156101d9575f80fd5b506101e86005600160991b0181565b6040516001600160a01b039091168152602001610131565b34801561020b575f80fd5b506100bc61021a366004612866565b610b82565b61012761022d3660046129be565b610c91565b34801561023d575f80fd5b506100bc61024c366004612a50565b610cb3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061029a575080546001600160401b03808416911610155b156102b85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556102e283611086565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206130ba83398151915293929190829060ff16600581111561039357610393612a85565b60058111156103a4576103a4612a85565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561041b5761041b612a85565b146104855760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6104958483606001515f61109a565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104c2908490600401612abb565b6020604051808303815f875af11580156104de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105029190612aed565b5050505050565b5f61051964e8d4a5100083612b2c565b92915050565b5f6105196001600160401b03831664e8d4a51000612b3f565b811561085b575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156105ac573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105d39190810190612b75565b91509150806106365760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161047c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610679573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069d9190612aed565b8251146107015760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161047c565b60208201516001600160a01b0316156107775760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161047c565b5f8061078684604001516112b7565b915091508188146107f35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161047c565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6108648361148f565b505050565b5f5f805160206130ba8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156108c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108eb9190810190612b75565b915091508061090c5760405162461bcd60e51b815260040161047c90612c47565b825482511461096f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161047c565b60208201516001600160a01b0316156109e25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161047c565b5f806109f184604001516117d7565b9150915080610a535760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161047c565b5f82815260058601602052604081208054610a6d90612c8d565b9050118015610a9f575060015f83815260068701602052604090205460ff166005811115610a9d57610a9d612a85565b145b610abb5760405162461bcd60e51b815260040161047c90612cbf565b5f8281526005860160205260408120610ad391612806565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206130ba833981519152929190610bca90612c8d565b9050118015610bfc575060015f83815260068301602052604090205460ff166005811115610bfa57610bfa612a85565b145b610c185760405162461bcd60e51b815260040161047c90612cbf565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c519190600401612d06565b6020604051808303815f875af1158015610c6d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108649190612aed565b5f80610c9c34611978565b9050610caa85828686611a35565b95945050505050565b5f5f805160206130ba8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610d0e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d359190810190612b75565b9150915080610d565760405162461bcd60e51b815260040161047c90612c47565b5f8415610dda575f610d6b8460400151611e6c565b919350909150506001600160401b03811615610dd45760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161047c565b50610e50565b5f610de884604001516117d7565b90925090508015610e4e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161047c565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610e8157610e81612a85565b6005811115610e9257610e92612a85565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610f235760405162461bcd60e51b815260040161047c90612d90565b5f600382516005811115610f3957610f39612a85565b1480610f575750600282516005811115610f5557610f55612a85565b145b15610f7a57506020808201515f9081526007870190915260408120556004610f7e565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610faf57610faf612a85565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b61108e6120a7565b611097816120f2565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611113576110d3816001612ddc565b6110de906008612b3f565b5081515f908390839081106110f5576110f5612def565b60200101906001600160f81b03191690815f1a9053506001016110bf565b505f5b60048110156111765761112a816003612ddc565b611135906008612b3f565b6001901c60f81b82611148836002612e03565b8151811061115857611158612def565b60200101906001600160f81b03191690815f1a905350600101611116565b505f5b60208110156111d85761118d81601f612ddc565b611198906008612b3f565b86901c60f81b826111aa836006612e03565b815181106111ba576111ba612def565b60200101906001600160f81b03191690815f1a905350600101611179565b505f5b6008811015611243576111ef816007612ddc565b6111fa906008612b3f565b6001600160401b038616901c60f81b82611215836026612e03565b8151811061122557611225612def565b60200101906001600160f81b03191690815f1a9053506001016111db565b505f5b60088110156112ae5761125a816007612ddc565b611265906008612b3f565b6001600160401b038516901c60f81b8261128083602e612e03565b8151811061129057611290612def565b60200101906001600160f81b03191690815f1a905350600101611246565b50949350505050565b5f808251602e146112da5760405162461bcd60e51b815260040161047c90612e16565b5f805b6002811015611329576112f1816001612ddc565b6112fc906008612b3f565b61ffff1685828151811061131257611312612def565b016020015160f81c901b91909117906001016112dd565b5061ffff81161561134c5760405162461bcd60e51b815260040161047c90612e5f565b5f805b60048110156113a757611363816003612ddc565b61136e906008612b3f565b63ffffffff1686611380836002612e03565b8151811061139057611390612def565b016020015160f81c901b919091179060010161134f565b5063ffffffff81166004146113ce5760405162461bcd60e51b815260040161047c90612ea2565b5f805b6020811015611423576113e581601f612ddc565b6113f0906008612b3f565b876113fc836006612e03565b8151811061140c5761140c612def565b016020015160f81c901b91909117906001016113d1565b505f805b60088110156114825761143b816007612ddc565b611446906008612b3f565b6001600160401b03168861145b836026612e03565b8151811061146b5761146b612def565b016020015160f81c901b9190911790600101611427565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206130ba83398151915293929190829060ff1660058111156114ef576114ef612a85565b600581111561150057611500612a85565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561157a5761157a612a85565b146115d65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161047c565b60408101516001600160a01b0316336001600160a01b03161461160b5760405162461bcd60e51b815260040161047c90612d90565b6116188160800151612135565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561165c5761165c612a85565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906117139085908361109a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611742908590600401612abb565b6020604051808303815f875af115801561175e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117829190612aed565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117fa5760405162461bcd60e51b815260040161047c90612e16565b5f805b600281101561184957611811816001612ddc565b61181c906008612b3f565b61ffff1685828151811061183257611832612def565b016020015160f81c901b91909117906001016117fd565b5061ffff81161561186c5760405162461bcd60e51b815260040161047c90612e5f565b5f805b60048110156118c757611883816003612ddc565b61188e906008612b3f565b63ffffffff16866118a0836002612e03565b815181106118b0576118b0612def565b016020015160f81c901b919091179060010161186f565b5063ffffffff81166002146118ee5760405162461bcd60e51b815260040161047c90612ea2565b5f805b60208110156119435761190581601f612ddc565b611910906008612b3f565b8761191c836006612e03565b8151811061192c5761192c612def565b016020015160f81c901b91909117906001016118f1565b505f8660268151811061195857611958612def565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0082826119a582610509565b83549091506001600160401b038216108015906119cf57508260010154816001600160401b031611155b611a2d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161047c565b949350505050565b5f611a3e6122d6565b5f805160206130ba833981519152426001600160401b038516118015611a7857506001600160401b038416611a76426202a300612e03565b115b611ada5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161047c565b85611b315760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161047c565b5f86815260078201602052604090205415611b9f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161047c565b8251603014611c065760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161047c565b611c0f85612135565b5f80611c566040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612320565b5f82815260058601602052604090209193509150611c748282612f2d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ca1908590600401612abb565b6020604051808303815f875af1158015611cbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce19190612aed565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611d5a57611d5a612a85565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a2d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611e905760405162461bcd60e51b815260040161047c90612e16565b5f805b6002811015611edf57611ea7816001612ddc565b611eb2906008612b3f565b61ffff16868281518110611ec857611ec8612def565b016020015160f81c901b9190911790600101611e93565b5061ffff811615611f025760405162461bcd60e51b815260040161047c90612e5f565b5f805b6004811015611f5d57611f19816003612ddc565b611f24906008612b3f565b63ffffffff1687611f36836002612e03565b81518110611f4657611f46612def565b016020015160f81c901b9190911790600101611f05565b5063ffffffff8116600114611f845760405162461bcd60e51b815260040161047c90612ea2565b5f805b6020811015611fd957611f9b81601f612ddc565b611fa6906008612b3f565b88611fb2836006612e03565b81518110611fc257611fc2612def565b016020015160f81c901b9190911790600101611f87565b505f805b600881101561203857611ff1816007612ddc565b611ffc906008612b3f565b6001600160401b031689612011836026612e03565b8151811061202157612021612def565b016020015160f81c901b9190911790600101611fdd565b505f805b600881101561209757612050816007612ddc565b61205b906008612b3f565b6001600160401b03168a61207083602e612e03565b8151811061208057612080612def565b016020015160f81c901b919091179060010161203c565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166120f057604051631afcd79f60e31b815260040160405180910390fd5b565b6120fa6120a7565b612103816126eb565b6110976060820135608083013561212060c0850160a08601612898565b61213060e0860160c08701612fec565b61270c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206130ba8339815191529060ff165f03612173575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121bb9083612ddc565b106121d7576001600160401b03841660408301528082526121f6565b83826040018181516121e99190613007565b6001600160401b03169052505b5f82602001518360400151606461220d919061302e565b6122179190613059565b600285015490915060ff90811690821611156122925760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161047c565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161231a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461238a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161047c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612401576123c1816001612ddc565b6123cc906008612b3f565b5081515f908390839081106123e3576123e3612def565b60200101906001600160f81b03191690815f1a9053506001016123ad565b505f5b600481101561245f57612418816003612ddc565b612423906008612b3f565b505f82612431836002612e03565b8151811061244157612441612def565b60200101906001600160f81b03191690815f1a905350600101612404565b505f5b60208110156124bc578451816020811061247e5761247e612def565b1a60f81b8261248e836006612e03565b8151811061249e5761249e612def565b60200101906001600160f81b03191690815f1a905350600101612462565b505f5b602081101561251c57846020015181602081106124de576124de612def565b1a60f81b826124ee836026612e03565b815181106124fe576124fe612def565b60200101906001600160f81b03191690815f1a9053506001016124bf565b505f5b600881101561259057612533816007612ddc565b61253e906008612b3f565b60ff1685604001516001600160401b0316901c60f81b828260466125629190612e03565b8151811061257257612572612def565b60200101906001600160f81b03191690815f1a90535060010161251f565b505f5b60308110156125fb57846080015181815181106125b2576125b2612def565b01602001516001600160f81b031916826125cd83604e612e03565b815181106125dd576125dd612def565b60200101906001600160f81b03191690815f1a905350600101612593565b505f5b600881101561266d57612612816007612ddc565b61261d906008612b3f565b60608601516001600160401b0390811691161c60f81b8261263f83607e612e03565b8151811061264f5761264f612def565b60200101906001600160f81b03191690815f1a9053506001016125fe565b5060028160405161267e919061307e565b602060405180830381855afa158015612699573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906126bc9190612aed565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126f36120a7565b6126fb61277a565b61270361278a565b61109781612792565b6127146120a7565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6127826120a7565b6120f06127fe565b6120f06120a7565b61279a6120a7565b80355f805160206130ba83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556127e46060830160408401613099565b600291909101805460ff191660ff90921691909117905550565b6126c56120a7565b50805461281290612c8d565b5f825580601f10612821575050565b601f0160209004905f5260205f209081019061109791905b8082111561284c575f8155600101612839565b5090565b5f60e08284031215612860575f80fd5b50919050565b5f60208284031215612876575f80fd5b5035919050565b80356001600160401b0381168114612893575f80fd5b919050565b5f602082840312156128a8575f80fd5b6128b18261287d565b9392505050565b8015158114611097575f80fd5b803563ffffffff81168114612893575f80fd5b5f805f606084860312156128ea575f80fd5b8335925060208401356128fc816128b8565b915061290a604085016128c5565b90509250925092565b5f60208284031215612923575f80fd5b6128b1826128c5565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129625761296261292c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129905761299061292c565b604052919050565b5f6001600160401b038211156129b0576129b061292c565b50601f01601f191660200190565b5f805f606084860312156129d0575f80fd5b833592506129e06020850161287d565b915060408401356001600160401b038111156129fa575f80fd5b8401601f81018613612a0a575f80fd5b8035612a1d612a1882612998565b612968565b818152876020838501011115612a31575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612a61575f80fd5b612a6a836128c5565b91506020830135612a7a816128b8565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612ab3578181015183820152602001612a9b565b50505f910152565b602081525f8251806020840152612ad9816040850160208701612a99565b601f01601f19169190910160400192915050565b5f60208284031215612afd575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612b3a57612b3a612b04565b500490565b808202811582820484141761051957610519612b18565b6001600160a01b0381168114611097575f80fd5b8051612893816128b8565b5f8060408385031215612b86575f80fd5b82516001600160401b0380821115612b9c575f80fd5b9084019060608287031215612baf575f80fd5b612bb7612940565b82518152602080840151612bca81612b56565b82820152604084015183811115612bdf575f80fd5b80850194505087601f850112612bf3575f80fd5b83519250612c03612a1884612998565b8381528882858701011115612c16575f80fd5b612c2584838301848801612a99565b80604084015250819550612c3a818801612b6a565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612ca157607f821691505b60208210810361286057634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612d1881612c8d565b806020870152604060018084165f8114612d395760018114612d5557612d82565b60ff19851660408a0152604084151560051b8a01019550612d82565b895f5260205f205f5b85811015612d795781548b8201860152908301908801612d5e565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561051957610519612b18565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561051957610519612b18565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f82111561086457805f5260205f20601f840160051c81016020851015612f0e5750805b601f840160051c820191505b81811015610502575f8155600101612f1a565b81516001600160401b03811115612f4657612f4661292c565b612f5a81612f548454612c8d565b84612ee9565b602080601f831160018114612f8d575f8415612f765750858301515b5f19600386901b1c1916600185901b178555612fe4565b5f85815260208120601f198616915b82811015612fbb57888601518255948401946001909101908401612f9c565b5085821015612fd857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215612ffc575f80fd5b81356128b181612b56565b6001600160401b0381811683821601908082111561302757613027612b18565b5092915050565b6001600160401b0381811683821602808216919082811461305157613051612b18565b505092915050565b5f6001600160401b038084168061307257613072612b04565b92169190910492915050565b5f825161308f818460208701612a99565b9190910192915050565b5f602082840312156130a9575f80fd5b813560ff811681146128b1575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -249,12 +249,12 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) WARPME return _NativeTokenStakingManager.Contract.WARPMESSENGER(&_NativeTokenStakingManager.CallOpts) } -// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. // -// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetActiveValidator(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) ActiveValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "getActiveValidator", nodeID) + err := _NativeTokenStakingManager.contract.Call(opts, &out, "activeValidators", nodeID) if err != nil { return *new([32]byte), err @@ -266,18 +266,18 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetActiveVali } -// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. // -// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) GetActiveValidator(nodeID [32]byte) ([32]byte, error) { - return _NativeTokenStakingManager.Contract.GetActiveValidator(&_NativeTokenStakingManager.CallOpts, nodeID) +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { + return _NativeTokenStakingManager.Contract.ActiveValidators(&_NativeTokenStakingManager.CallOpts, nodeID) } -// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. // -// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) GetActiveValidator(nodeID [32]byte) ([32]byte, error) { - return _NativeTokenStakingManager.Contract.GetActiveValidator(&_NativeTokenStakingManager.CallOpts, nodeID) +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { + return _NativeTokenStakingManager.Contract.ActiveValidators(&_NativeTokenStakingManager.CallOpts, nodeID) } // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 4d4853550..8cdd2358a 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -38,8 +38,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"getActiveValidator\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c73380380612c7383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612b268061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c8063a3a65e481161006e578063a3a65e481461018d578063b771b3bc146101a0578063bee0a03f146101ae578063c151c0b9146101c1578063f2fde38b146101d4578063fdf94a1a146101e7575f80fd5b80630322ed98146100b55780633aaa9f25146100ca578063687e8420146100f0578063715018a61461012e5780638da5cb5b1461013657806397fb70d41461017a575b5f80fd5b6100c86100c33660046122c7565b6101fa565b005b6100dd6100d836600461238b565b6103d0565b6040519081526020015b60405180910390f35b6100dd6100fe3660046122c7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6100c86103f0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100e7565b6100c86101883660046122c7565b610403565b6100c861019b366004612441565b61040f565b6101626005600160991b0181565b6100c86101bc3660046122c7565b610728565b6100c86101cf366004612475565b61083c565b6100c86101e23660046124b1565b61094a565b6100c86101f53660046124d9565b610984565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612afa83398151915293929190829060ff16600581111561025a5761025a612503565b600581111561026b5761026b612503565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102e2576102e2612503565b1461034c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61035c8483606001515f610d57565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610389908490600401612539565b6020604051808303815f875af11580156103a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c9919061256b565b5050505050565b5f6103d9610f74565b6103e584868585610fcf565b90505b949350505050565b6103f8610f74565b6104015f611406565b565b61040c81611476565b50565b5f5f80516020612afa8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561046a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610491919081019061258d565b91509150806104b25760405162461bcd60e51b81526004016103439061265f565b82548251146105155760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610343565b60208201516001600160a01b0316156105885760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610343565b5f8061059784604001516117be565b91509150806105f95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610343565b5f82815260058601602052604081208054610613906126a5565b9050118015610645575060015f83815260068701602052604090205460ff16600581111561064357610643612503565b145b6106615760405162461bcd60e51b8152600401610343906126dd565b5f82815260058601602052604081206106799161227d565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612afa833981519152929190610770906126a5565b90501180156107a2575060015f83815260068301602052604090205460ff1660058111156107a0576107a0612503565b145b6107be5760405162461bcd60e51b8152600401610343906126dd565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107f79190600401612724565b6020604051808303815f875af1158015610813573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610837919061256b565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108805750825b90505f826001600160401b0316600114801561089b5750303b155b9050811580156108a9575080155b156108c75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108f157845460ff60401b1916600160401b1785555b6108fb878761195f565b831561094157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610952610f74565b6001600160a01b03811661097b57604051631e4fbdf760e01b81525f6004820152602401610343565b61040c81611406565b5f5f80516020612afa8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156109df573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a06919081019061258d565b9150915080610a275760405162461bcd60e51b81526004016103439061265f565b5f8415610aab575f610a3c846040015161197d565b919350909150506001600160401b03811615610aa55760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610343565b50610b21565b5f610ab984604001516117be565b90925090508015610b1f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610343565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610b5257610b52612503565b6005811115610b6357610b63612503565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610bf45760405162461bcd60e51b8152600401610343906127ae565b5f600382516005811115610c0a57610c0a612503565b1480610c285750600282516005811115610c2657610c26612503565b145b15610c4b57506020808201515f9081526007870190915260408120556004610c4f565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610c8057610c80612503565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610dd057610d9081600161280e565b610d9b906008612827565b5081515f90839083908110610db257610db261283e565b60200101906001600160f81b03191690815f1a905350600101610d7c565b505f5b6004811015610e3357610de781600361280e565b610df2906008612827565b6001901c60f81b82610e05836002612852565b81518110610e1557610e1561283e565b60200101906001600160f81b03191690815f1a905350600101610dd3565b505f5b6020811015610e9557610e4a81601f61280e565b610e55906008612827565b86901c60f81b82610e67836006612852565b81518110610e7757610e7761283e565b60200101906001600160f81b03191690815f1a905350600101610e36565b505f5b6008811015610f0057610eac81600761280e565b610eb7906008612827565b6001600160401b038616901c60f81b82610ed2836026612852565b81518110610ee257610ee261283e565b60200101906001600160f81b03191690815f1a905350600101610e98565b505f5b6008811015610f6b57610f1781600761280e565b610f22906008612827565b6001600160401b038516901c60f81b82610f3d83602e612852565b81518110610f4d57610f4d61283e565b60200101906001600160f81b03191690815f1a905350600101610f03565b50949350505050565b33610fa67f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104015760405163118cdaa760e01b8152336004820152602401610343565b5f610fd8611bb8565b5f80516020612afa833981519152426001600160401b03851611801561101257506001600160401b038416611010426202a300612852565b115b6110745760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610343565b856110cb5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610343565b5f868152600782016020526040902054156111395760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610343565b82516030146111a05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610343565b6111a985611c02565b5f806111f06040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611da3565b5f8281526005860160205260409020919350915061120e82826128a9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061123b908590600401612539565b6020604051808303815f875af1158015611257573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127b919061256b565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff191660018360058111156112f4576112f4612503565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103e860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612afa83398151915293929190829060ff1660058111156114d6576114d6612503565b60058111156114e7576114e7612503565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561156157611561612503565b146115bd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610343565b60408101516001600160a01b0316336001600160a01b0316146115f25760405162461bcd60e51b8152600401610343906127ae565b6115ff8160800151611c02565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561164357611643612503565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116fa90859083610d57565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611729908590600401612539565b6020604051808303815f875af1158015611745573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611769919061256b565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117e15760405162461bcd60e51b815260040161034390612968565b5f805b6002811015611830576117f881600161280e565b611803906008612827565b61ffff168582815181106118195761181961283e565b016020015160f81c901b91909117906001016117e4565b5061ffff8116156118535760405162461bcd60e51b8152600401610343906129b1565b5f805b60048110156118ae5761186a81600361280e565b611875906008612827565b63ffffffff1686611887836002612852565b815181106118975761189761283e565b016020015160f81c901b9190911790600101611856565b5063ffffffff81166002146118d55760405162461bcd60e51b8152600401610343906129f4565b5f805b602081101561192a576118ec81601f61280e565b6118f7906008612827565b87611903836006612852565b815181106119135761191361283e565b016020015160f81c901b91909117906001016118d8565b505f8660268151811061193f5761193f61283e565b016020015191976001600160f81b03199092161515965090945050505050565b61196761216e565b611970826121b7565b611979816121d8565b5050565b5f805f83516036146119a15760405162461bcd60e51b815260040161034390612968565b5f805b60028110156119f0576119b881600161280e565b6119c3906008612827565b61ffff168682815181106119d9576119d961283e565b016020015160f81c901b91909117906001016119a4565b5061ffff811615611a135760405162461bcd60e51b8152600401610343906129b1565b5f805b6004811015611a6e57611a2a81600361280e565b611a35906008612827565b63ffffffff1687611a47836002612852565b81518110611a5757611a5761283e565b016020015160f81c901b9190911790600101611a16565b5063ffffffff8116600114611a955760405162461bcd60e51b8152600401610343906129f4565b5f805b6020811015611aea57611aac81601f61280e565b611ab7906008612827565b88611ac3836006612852565b81518110611ad357611ad361283e565b016020015160f81c901b9190911790600101611a98565b505f805b6008811015611b4957611b0281600761280e565b611b0d906008612827565b6001600160401b031689611b22836026612852565b81518110611b3257611b3261283e565b016020015160f81c901b9190911790600101611aee565b505f805b6008811015611ba857611b6181600761280e565b611b6c906008612827565b6001600160401b03168a611b8183602e612852565b81518110611b9157611b9161283e565b016020015160f81c901b9190911790600101611b4d565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611bfc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612afa8339815191529060ff165f03611c40575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611c88908361280e565b10611ca4576001600160401b0384166040830152808252611cc3565b8382604001818151611cb69190612a3b565b6001600160401b03169052505b5f826020015183604001516064611cda9190612a62565b611ce49190612a8d565b600285015490915060ff9081169082161115611d5f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610343565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611e0d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610343565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e8457611e4481600161280e565b611e4f906008612827565b5081515f90839083908110611e6657611e6661283e565b60200101906001600160f81b03191690815f1a905350600101611e30565b505f5b6004811015611ee257611e9b81600361280e565b611ea6906008612827565b505f82611eb4836002612852565b81518110611ec457611ec461283e565b60200101906001600160f81b03191690815f1a905350600101611e87565b505f5b6020811015611f3f5784518160208110611f0157611f0161283e565b1a60f81b82611f11836006612852565b81518110611f2157611f2161283e565b60200101906001600160f81b03191690815f1a905350600101611ee5565b505f5b6020811015611f9f5784602001518160208110611f6157611f6161283e565b1a60f81b82611f71836026612852565b81518110611f8157611f8161283e565b60200101906001600160f81b03191690815f1a905350600101611f42565b505f5b600881101561201357611fb681600761280e565b611fc1906008612827565b60ff1685604001516001600160401b0316901c60f81b82826046611fe59190612852565b81518110611ff557611ff561283e565b60200101906001600160f81b03191690815f1a905350600101611fa2565b505f5b603081101561207e57846080015181815181106120355761203561283e565b01602001516001600160f81b0319168261205083604e612852565b815181106120605761206061283e565b60200101906001600160f81b03191690815f1a905350600101612016565b505f5b60088110156120f05761209581600761280e565b6120a0906008612827565b60608601516001600160401b0390811691161c60f81b826120c283607e612852565b815181106120d2576120d261283e565b60200101906001600160f81b03191690815f1a905350600101612081565b506002816040516121019190612abe565b602060405180830381855afa15801561211c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061213f919061256b565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661040157604051631afcd79f60e31b815260040160405180910390fd5b6121bf61216e565b6121c76121e9565b6121cf6121f9565b61040c81612201565b6121e061216e565b61040c8161226d565b6121f161216e565b610401612275565b61040161216e565b61220961216e565b80355f80516020612afa83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122536060830160408401612ad9565b600291909101805460ff191660ff90921691909117905550565b61095261216e565b61214861216e565b508054612289906126a5565b5f825580601f10612298575050565b601f0160209004905f5260205f209081019061040c91905b808211156122c3575f81556001016122b0565b5090565b5f602082840312156122d7575f80fd5b5035919050565b80356001600160401b03811681146122f4575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561232f5761232f6122f9565b60405290565b604051601f8201601f191681016001600160401b038111828210171561235d5761235d6122f9565b604052919050565b5f6001600160401b0382111561237d5761237d6122f9565b50601f01601f191660200190565b5f805f806080858703121561239e575f80fd5b6123a7856122de565b9350602085013592506123bc604086016122de565b915060608501356001600160401b038111156123d6575f80fd5b8501601f810187136123e6575f80fd5b80356123f96123f482612365565b612335565b81815288602083850101111561240d575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146122f4575f80fd5b5f60208284031215612451575f80fd5b61245a8261242e565b9392505050565b6001600160a01b038116811461040c575f80fd5b5f808284036080811215612487575f80fd5b6060811215612494575f80fd5b5082915060608301356124a681612461565b809150509250929050565b5f602082840312156124c1575f80fd5b813561245a81612461565b801515811461040c575f80fd5b5f80604083850312156124ea575f80fd5b6124f38361242e565b915060208301356124a6816124cc565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612531578181015183820152602001612519565b50505f910152565b602081525f8251806020840152612557816040850160208701612517565b601f01601f19169190910160400192915050565b5f6020828403121561257b575f80fd5b5051919050565b80516122f4816124cc565b5f806040838503121561259e575f80fd5b82516001600160401b03808211156125b4575f80fd5b90840190606082870312156125c7575f80fd5b6125cf61230d565b825181526020808401516125e281612461565b828201526040840151838111156125f7575f80fd5b80850194505087601f85011261260b575f80fd5b8351925061261b6123f484612365565b838152888285870101111561262e575f80fd5b61263d84838301848801612517565b80604084015250819550612652818801612582565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c908216806126b957607f821691505b6020821081036126d757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612736816126a5565b806020870152604060018084165f81146127575760018114612773576127a0565b60ff19851660408a0152604084151560051b8a010195506127a0565b895f5260205f205f5b858110156127975781548b820186015290830190880161277c565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612821576128216127fa565b92915050565b8082028115828204841417612821576128216127fa565b634e487b7160e01b5f52603260045260245ffd5b80820180821115612821576128216127fa565b601f82111561083757805f5260205f20601f840160051c8101602085101561288a5750805b601f840160051c820191505b818110156103c9575f8155600101612896565b81516001600160401b038111156128c2576128c26122f9565b6128d6816128d084546126a5565b84612865565b602080601f831160018114612909575f84156128f25750858301515b5f19600386901b1c1916600185901b178555612960565b5f85815260208120601f198616915b8281101561293757888601518255948401946001909101908401612918565b508582101561295457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612a5b57612a5b6127fa565b5092915050565b6001600160401b03818116838216028082169190828114612a8557612a856127fa565b505092915050565b5f6001600160401b0380841680612ab257634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612acf818460208701612517565b9190910192915050565b5f60208284031215612ae9575f80fd5b813560ff8116811461245a575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612c73380380612c7383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612b268061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c8063a3a65e481161006e578063a3a65e481461018d578063b771b3bc146101a0578063bee0a03f146101ae578063c151c0b9146101c1578063f2fde38b146101d4578063fdf94a1a146101e7575f80fd5b80630322ed98146100b55780630cdd0985146100ca5780633aaa9f251461011b578063715018a61461012e5780638da5cb5b1461013657806397fb70d41461017a575b5f80fd5b6100c86100c33660046122c7565b6101fa565b005b6101086100d83660046122c7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61010861012936600461238b565b6103d0565b6100c86103f0565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610112565b6100c86101883660046122c7565b610403565b6100c861019b366004612441565b61040f565b6101626005600160991b0181565b6100c86101bc3660046122c7565b610728565b6100c86101cf366004612475565b61083c565b6100c86101e23660046124b1565b61094a565b6100c86101f53660046124d9565b610984565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612afa83398151915293929190829060ff16600581111561025a5761025a612503565b600581111561026b5761026b612503565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102e2576102e2612503565b1461034c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61035c8483606001515f610d57565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610389908490600401612539565b6020604051808303815f875af11580156103a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c9919061256b565b5050505050565b5f6103d9610f74565b6103e584868585610fcf565b90505b949350505050565b6103f8610f74565b6104015f611406565b565b61040c81611476565b50565b5f5f80516020612afa8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561046a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610491919081019061258d565b91509150806104b25760405162461bcd60e51b81526004016103439061265f565b82548251146105155760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610343565b60208201516001600160a01b0316156105885760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610343565b5f8061059784604001516117be565b91509150806105f95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610343565b5f82815260058601602052604081208054610613906126a5565b9050118015610645575060015f83815260068701602052604090205460ff16600581111561064357610643612503565b145b6106615760405162461bcd60e51b8152600401610343906126dd565b5f82815260058601602052604081206106799161227d565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612afa833981519152929190610770906126a5565b90501180156107a2575060015f83815260068301602052604090205460ff1660058111156107a0576107a0612503565b145b6107be5760405162461bcd60e51b8152600401610343906126dd565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107f79190600401612724565b6020604051808303815f875af1158015610813573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610837919061256b565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108805750825b90505f826001600160401b0316600114801561089b5750303b155b9050811580156108a9575080155b156108c75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108f157845460ff60401b1916600160401b1785555b6108fb878761195f565b831561094157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610952610f74565b6001600160a01b03811661097b57604051631e4fbdf760e01b81525f6004820152602401610343565b61040c81611406565b5f5f80516020612afa8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156109df573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a06919081019061258d565b9150915080610a275760405162461bcd60e51b81526004016103439061265f565b5f8415610aab575f610a3c846040015161197d565b919350909150506001600160401b03811615610aa55760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610343565b50610b21565b5f610ab984604001516117be565b90925090508015610b1f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610343565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610b5257610b52612503565b6005811115610b6357610b63612503565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610bf45760405162461bcd60e51b8152600401610343906127ae565b5f600382516005811115610c0a57610c0a612503565b1480610c285750600282516005811115610c2657610c26612503565b145b15610c4b57506020808201515f9081526007870190915260408120556004610c4f565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610c8057610c80612503565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610dd057610d9081600161280e565b610d9b906008612827565b5081515f90839083908110610db257610db261283e565b60200101906001600160f81b03191690815f1a905350600101610d7c565b505f5b6004811015610e3357610de781600361280e565b610df2906008612827565b6001901c60f81b82610e05836002612852565b81518110610e1557610e1561283e565b60200101906001600160f81b03191690815f1a905350600101610dd3565b505f5b6020811015610e9557610e4a81601f61280e565b610e55906008612827565b86901c60f81b82610e67836006612852565b81518110610e7757610e7761283e565b60200101906001600160f81b03191690815f1a905350600101610e36565b505f5b6008811015610f0057610eac81600761280e565b610eb7906008612827565b6001600160401b038616901c60f81b82610ed2836026612852565b81518110610ee257610ee261283e565b60200101906001600160f81b03191690815f1a905350600101610e98565b505f5b6008811015610f6b57610f1781600761280e565b610f22906008612827565b6001600160401b038516901c60f81b82610f3d83602e612852565b81518110610f4d57610f4d61283e565b60200101906001600160f81b03191690815f1a905350600101610f03565b50949350505050565b33610fa67f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104015760405163118cdaa760e01b8152336004820152602401610343565b5f610fd8611bb8565b5f80516020612afa833981519152426001600160401b03851611801561101257506001600160401b038416611010426202a300612852565b115b6110745760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610343565b856110cb5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610343565b5f868152600782016020526040902054156111395760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610343565b82516030146111a05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610343565b6111a985611c02565b5f806111f06040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611da3565b5f8281526005860160205260409020919350915061120e82826128a9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061123b908590600401612539565b6020604051808303815f875af1158015611257573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061127b919061256b565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff191660018360058111156112f4576112f4612503565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103e860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612afa83398151915293929190829060ff1660058111156114d6576114d6612503565b60058111156114e7576114e7612503565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561156157611561612503565b146115bd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610343565b60408101516001600160a01b0316336001600160a01b0316146115f25760405162461bcd60e51b8152600401610343906127ae565b6115ff8160800151611c02565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561164357611643612503565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116fa90859083610d57565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611729908590600401612539565b6020604051808303815f875af1158015611745573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611769919061256b565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117e15760405162461bcd60e51b815260040161034390612968565b5f805b6002811015611830576117f881600161280e565b611803906008612827565b61ffff168582815181106118195761181961283e565b016020015160f81c901b91909117906001016117e4565b5061ffff8116156118535760405162461bcd60e51b8152600401610343906129b1565b5f805b60048110156118ae5761186a81600361280e565b611875906008612827565b63ffffffff1686611887836002612852565b815181106118975761189761283e565b016020015160f81c901b9190911790600101611856565b5063ffffffff81166002146118d55760405162461bcd60e51b8152600401610343906129f4565b5f805b602081101561192a576118ec81601f61280e565b6118f7906008612827565b87611903836006612852565b815181106119135761191361283e565b016020015160f81c901b91909117906001016118d8565b505f8660268151811061193f5761193f61283e565b016020015191976001600160f81b03199092161515965090945050505050565b61196761216e565b611970826121b7565b611979816121d8565b5050565b5f805f83516036146119a15760405162461bcd60e51b815260040161034390612968565b5f805b60028110156119f0576119b881600161280e565b6119c3906008612827565b61ffff168682815181106119d9576119d961283e565b016020015160f81c901b91909117906001016119a4565b5061ffff811615611a135760405162461bcd60e51b8152600401610343906129b1565b5f805b6004811015611a6e57611a2a81600361280e565b611a35906008612827565b63ffffffff1687611a47836002612852565b81518110611a5757611a5761283e565b016020015160f81c901b9190911790600101611a16565b5063ffffffff8116600114611a955760405162461bcd60e51b8152600401610343906129f4565b5f805b6020811015611aea57611aac81601f61280e565b611ab7906008612827565b88611ac3836006612852565b81518110611ad357611ad361283e565b016020015160f81c901b9190911790600101611a98565b505f805b6008811015611b4957611b0281600761280e565b611b0d906008612827565b6001600160401b031689611b22836026612852565b81518110611b3257611b3261283e565b016020015160f81c901b9190911790600101611aee565b505f805b6008811015611ba857611b6181600761280e565b611b6c906008612827565b6001600160401b03168a611b8183602e612852565b81518110611b9157611b9161283e565b016020015160f81c901b9190911790600101611b4d565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611bfc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612afa8339815191529060ff165f03611c40575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611c88908361280e565b10611ca4576001600160401b0384166040830152808252611cc3565b8382604001818151611cb69190612a3b565b6001600160401b03169052505b5f826020015183604001516064611cda9190612a62565b611ce49190612a8d565b600285015490915060ff9081169082161115611d5f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610343565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611e0d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610343565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e8457611e4481600161280e565b611e4f906008612827565b5081515f90839083908110611e6657611e6661283e565b60200101906001600160f81b03191690815f1a905350600101611e30565b505f5b6004811015611ee257611e9b81600361280e565b611ea6906008612827565b505f82611eb4836002612852565b81518110611ec457611ec461283e565b60200101906001600160f81b03191690815f1a905350600101611e87565b505f5b6020811015611f3f5784518160208110611f0157611f0161283e565b1a60f81b82611f11836006612852565b81518110611f2157611f2161283e565b60200101906001600160f81b03191690815f1a905350600101611ee5565b505f5b6020811015611f9f5784602001518160208110611f6157611f6161283e565b1a60f81b82611f71836026612852565b81518110611f8157611f8161283e565b60200101906001600160f81b03191690815f1a905350600101611f42565b505f5b600881101561201357611fb681600761280e565b611fc1906008612827565b60ff1685604001516001600160401b0316901c60f81b82826046611fe59190612852565b81518110611ff557611ff561283e565b60200101906001600160f81b03191690815f1a905350600101611fa2565b505f5b603081101561207e57846080015181815181106120355761203561283e565b01602001516001600160f81b0319168261205083604e612852565b815181106120605761206061283e565b60200101906001600160f81b03191690815f1a905350600101612016565b505f5b60088110156120f05761209581600761280e565b6120a0906008612827565b60608601516001600160401b0390811691161c60f81b826120c283607e612852565b815181106120d2576120d261283e565b60200101906001600160f81b03191690815f1a905350600101612081565b506002816040516121019190612abe565b602060405180830381855afa15801561211c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061213f919061256b565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661040157604051631afcd79f60e31b815260040160405180910390fd5b6121bf61216e565b6121c76121e9565b6121cf6121f9565b61040c81612201565b6121e061216e565b61040c8161226d565b6121f161216e565b610401612275565b61040161216e565b61220961216e565b80355f80516020612afa83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122536060830160408401612ad9565b600291909101805460ff191660ff90921691909117905550565b61095261216e565b61214861216e565b508054612289906126a5565b5f825580601f10612298575050565b601f0160209004905f5260205f209081019061040c91905b808211156122c3575f81556001016122b0565b5090565b5f602082840312156122d7575f80fd5b5035919050565b80356001600160401b03811681146122f4575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561232f5761232f6122f9565b60405290565b604051601f8201601f191681016001600160401b038111828210171561235d5761235d6122f9565b604052919050565b5f6001600160401b0382111561237d5761237d6122f9565b50601f01601f191660200190565b5f805f806080858703121561239e575f80fd5b6123a7856122de565b9350602085013592506123bc604086016122de565b915060608501356001600160401b038111156123d6575f80fd5b8501601f810187136123e6575f80fd5b80356123f96123f482612365565b612335565b81815288602083850101111561240d575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146122f4575f80fd5b5f60208284031215612451575f80fd5b61245a8261242e565b9392505050565b6001600160a01b038116811461040c575f80fd5b5f808284036080811215612487575f80fd5b6060811215612494575f80fd5b5082915060608301356124a681612461565b809150509250929050565b5f602082840312156124c1575f80fd5b813561245a81612461565b801515811461040c575f80fd5b5f80604083850312156124ea575f80fd5b6124f38361242e565b915060208301356124a6816124cc565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612531578181015183820152602001612519565b50505f910152565b602081525f8251806020840152612557816040850160208701612517565b601f01601f19169190910160400192915050565b5f6020828403121561257b575f80fd5b5051919050565b80516122f4816124cc565b5f806040838503121561259e575f80fd5b82516001600160401b03808211156125b4575f80fd5b90840190606082870312156125c7575f80fd5b6125cf61230d565b825181526020808401516125e281612461565b828201526040840151838111156125f7575f80fd5b80850194505087601f85011261260b575f80fd5b8351925061261b6123f484612365565b838152888285870101111561262e575f80fd5b61263d84838301848801612517565b80604084015250819550612652818801612582565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c908216806126b957607f821691505b6020821081036126d757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612736816126a5565b806020870152604060018084165f81146127575760018114612773576127a0565b60ff19851660408a0152604084151560051b8a010195506127a0565b895f5260205f205f5b858110156127975781548b820186015290830190880161277c565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115612821576128216127fa565b92915050565b8082028115828204841417612821576128216127fa565b634e487b7160e01b5f52603260045260245ffd5b80820180821115612821576128216127fa565b601f82111561083757805f5260205f20601f840160051c8101602085101561288a5750805b601f840160051c820191505b818110156103c9575f8155600101612896565b81516001600160401b038111156128c2576128c26122f9565b6128d6816128d084546126a5565b84612865565b602080601f831160018114612909575f84156128f25750858301515b5f19600386901b1c1916600185901b178555612960565b5f85815260208120601f198616915b8281101561293757888601518255948401946001909101908401612918565b508582101561295457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612a5b57612a5b6127fa565b5092915050565b6001600160401b03818116838216028082169190828114612a8557612a856127fa565b505092915050565b5f6001600160401b0380841680612ab257634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612acf818460208701612517565b9190910192915050565b5f60208284031215612ae9575f80fd5b813560ff8116811461245a575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -240,12 +240,12 @@ func (_PoAValidatorManager *PoAValidatorManagerCallerSession) WARPMESSENGER() (c return _PoAValidatorManager.Contract.WARPMESSENGER(&_PoAValidatorManager.CallOpts) } -// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. // -// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) -func (_PoAValidatorManager *PoAValidatorManagerCaller) GetActiveValidator(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCaller) ActiveValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { var out []interface{} - err := _PoAValidatorManager.contract.Call(opts, &out, "getActiveValidator", nodeID) + err := _PoAValidatorManager.contract.Call(opts, &out, "activeValidators", nodeID) if err != nil { return *new([32]byte), err @@ -257,18 +257,18 @@ func (_PoAValidatorManager *PoAValidatorManagerCaller) GetActiveValidator(opts * } -// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. // -// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) -func (_PoAValidatorManager *PoAValidatorManagerSession) GetActiveValidator(nodeID [32]byte) ([32]byte, error) { - return _PoAValidatorManager.Contract.GetActiveValidator(&_PoAValidatorManager.CallOpts, nodeID) +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { + return _PoAValidatorManager.Contract.ActiveValidators(&_PoAValidatorManager.CallOpts, nodeID) } -// GetActiveValidator is a free data retrieval call binding the contract method 0x687e8420. +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. // -// Solidity: function getActiveValidator(bytes32 nodeID) view returns(bytes32) -func (_PoAValidatorManager *PoAValidatorManagerCallerSession) GetActiveValidator(nodeID [32]byte) ([32]byte, error) { - return _PoAValidatorManager.Contract.GetActiveValidator(&_PoAValidatorManager.CallOpts, nodeID) +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { + return _PoAValidatorManager.Contract.ActiveValidators(&_PoAValidatorManager.CallOpts, nodeID) } // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index ff0ff3543..0c44b53e6 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -204,7 +204,7 @@ abstract contract ValidatorManager is ); } - function getActiveValidator(bytes32 nodeID) external view returns (bytes32) { + function activeValidators(bytes32 nodeID) public view returns (bytes32) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); return $._activeValidators[nodeID]; } diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index 18ada2771..b29e54df1 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -161,7 +161,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) // Check that previous validator is still active - validationID, err := posValidatorManager.GetActiveValidator(&bind.CallOpts{}, poaNodeID) + validationID, err := posValidatorManager.ActiveValidators(&bind.CallOpts{}, poaNodeID) Expect(err).Should(BeNil()) Expect(validationID[:]).Should(Equal(poaValidationID[:])) From 5d8526f2a5098e308aee13eff6cc8f5df53e961f Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 28 Aug 2024 14:06:04 -0500 Subject: [PATCH 146/545] do not restrict delegation amounts --- contracts/staking/ERC20TokenStakingManager.sol | 5 +++-- contracts/staking/NativeTokenStakingManager.sol | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 3ef8121e4..d39357bc0 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -103,8 +103,9 @@ contract ERC20TokenStakingManager is bytes32 validationID, uint256 delegationAmount ) external { - uint64 weight = _processStake(delegationAmount); - return _initializeDelegatorRegistration(validationID, _msgSender(), weight); + return _initializeDelegatorRegistration( + validationID, _msgSender(), valueToWeight(_lock(delegationAmount)) + ); } // Must be guarded with reentrancy guard for safe transfer from diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index c0965f924..d1faecbca 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -62,9 +62,9 @@ contract NativeTokenStakingManager is * @param validationID The ID of the validation period being delegated to. */ function initializeDelegatorRegistration(bytes32 validationID) external payable { - uint64 weight = _processStake(msg.value); - - return _initializeDelegatorRegistration(validationID, _msgSender(), weight); + return _initializeDelegatorRegistration( + validationID, _msgSender(), valueToWeight(_lock(msg.value)) + ); } // solhint-enable ordering From de44d59445d1f6b11724768eac39b0fbacff5892 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 28 Aug 2024 14:06:56 -0500 Subject: [PATCH 147/545] erc20 delegation e2e --- .../ERC20TokenStakingManager.go | 64 ++--- .../NativeTokenStakingManager.go | 46 ++-- contracts/staking/PoSValidatorManager.sol | 2 - tests/flows/staking/erc20_delegation.go | 235 ++++++++++++++++++ tests/flows/staking/erc20_token_staking.go | 6 +- tests/flows/staking/native_token_staking.go | 6 +- tests/flows/staking/poa_validator_manager.go | 2 +- tests/local/e2e_test.go | 6 + tests/utils/staking.go | 209 ++++++++++++---- 9 files changed, 470 insertions(+), 106 deletions(-) create mode 100644 tests/flows/staking/erc20_delegation.go diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 45b8ca67d..be292adc7 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161499f38038061499f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148528061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063872fda6411610093578063b771b3bc11610063578063b771b3bc14610210578063bee0a03f14610236578063d61bed7414610249578063fdf94a1a1461025c575f80fd5b8063872fda64146101c4578063927e7e75146101d75780639e1bc4ef146101ea578063a3a65e48146101fd575f80fd5b80632e2194d8116100ce5780632e2194d81461014d578063620658561461017d5780636a7e3d831461019e57806376f78621146101b1575f80fd5b80630322ed98146100ff5780630915204e146101145780630b77f6931461012757806327f39ca81461013a575b5f80fd5b61011261010d366004613cfd565b61026f565b005b610112610122366004613d40565b610460565b610112610135366004613d75565b61068e565b610112610148366004613d98565b6107a0565b61016061015b366004613cfd565b6108ae565b6040516001600160401b0390911681526020015b60405180910390f35b61019061018b366004613de0565b6108c4565b604051908152602001610174565b6101126101ac366004613d75565b6108dd565b6101126101bf366004613e0d565b6109ef565b6101906101d2366004613eda565b610d0d565b6101126101e5366004613cfd565b610d32565b6101126101f8366004613f76565b611061565b61011261020b366004613f96565b611078565b61021e6005600160991b0181565b6040516001600160a01b039091168152602001610174565b610112610244366004613cfd565b611231565b610112610257366004613d40565b611340565b61011261026a366004613faf565b6115a2565b5f8181525f805160206148268339815191526020526040808220815160e0810190925280545f805160206147e683398151915293929190829060ff1660058111156102bc576102bc613fd9565b60058111156102cd576102cd613fd9565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f868152600686019091529081208054929350909161035790613fed565b9050118015610378575060038151600581111561037657610376613fd9565b145b6103e15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614025565b6020604051808303815f875af1158015610436573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045a91906140af565b50505050565b5f805160206147c68339815191525f61047884611975565b90505f805f61048a8460400151611b10565b5f83815260068901602090815260408083206001600160a01b038d16845290915281208054949750929550909350916104c290613fed565b905011801561050f575060035f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff16600581111561050d5761050d613fd9565b145b61052b5760405162461bcd60e51b81526004016103d8906140c6565b5f83815260068601602090815260408083206001600160a01b038a168452909152812061055791613cb3565b5f61056184611d4b565b5f85815260048801602090815260408083206001600160a01b038c16845290915290205460808201519192506001600160401b03808516926105a6929091169061412c565b6001600160401b0316146105cc5760405162461bcd60e51b81526004016103d890614153565b826001600160401b031681606001516001600160401b031610156106025760405162461bcd60e51b81526004016103d890614196565b5f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c21b1790556001600160401b038216608082015261064f8482611e46565b6040516001600160a01b0388169085907f132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564905f90a35050505050505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206147c68339815191529291906106ea90613fed565b9050118015610737575060015f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff16600581111561073557610735613fd9565b145b6107535760405162461bcd60e51b81526004016103d8906141d8565b5f83815260058201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614025565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107e45750825b90505f826001600160401b031660011480156107ff5750303b155b90508115801561080d575080155b1561082b5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561085557845460ff60401b1916600160401b1785555b61085f8787611f35565b83156108a557845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6108be64e8d4a5100083614249565b92915050565b5f6108be6001600160401b03831664e8d4a5100061425c565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f805160206147c683398151915292919061093990613fed565b9050118015610986575060035f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff16600581111561098457610984613fd9565b145b6109a25760405162461bcd60e51b81526004016103d8906140c6565b5f83815260068201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614025565b8115610cff575f5f805160206147c68339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610a50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a7791908101906142a0565b9150915080610ada5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103d8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4191906140af565b825114610ba55760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103d8565b60208201516001600160a01b031615610c1b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103d8565b5f80610c2a8460400151611f53565b91509150818814610c975760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103d8565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610d088361212b565b505050565b5f80610d1886612438565b9050610d26858286866124e5565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f805160206147c683398151915293926060830190600160c01b900460ff166005811115610dd157610dd1613fd9565b6005811115610de257610de2613fd9565b9052509050600281606001516005811115610dff57610dff613fd9565b14610e5b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2044656c656761746f72206e6f742060448201526561637469766560d01b60648201526084016103d8565b600360608201908152426001600160401b0390811660408085019182525f8781526004870160209081528282203383528152919020855181549287015193518516600160801b0267ffffffffffffffff60801b19948616600160401b026001600160801b03199094169190951617919091179182168317815592518493929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836005811115610f0d57610f0d613fd9565b02179055509050505f610f1f84611d4b565b9050815f01516001600160401b031681608001516001600160401b03161015610f5a5760405162461bcd60e51b81526004016103d890614153565b5f610f7e85610f6887612919565b85516080860151610f79919061412c565b612994565b5f86815260068601602090815260408083203384529091529020909150610fa582826143bd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610fd290859060040161447c565b6020604051808303815f875af1158015610fee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061101291906140af565b9050336001600160a01b031681877f2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc24260405161105191815260200190565b60405180910390a4505050505050565b5f61106b82612438565b9050610d08833383612bb1565b5f805160206147e68339815191525f61109083611975565b90505f806110a18360400151612eac565b91509150806111035760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103d8565b5f8281526005850160205260408120805461111d90613fed565b905011801561114f575060015f83815260078601602052604090205460ff16600581111561114d5761114d613fd9565b145b61116b5760405162461bcd60e51b81526004016103d8906144ae565b5f828152600585016020526040812061118391613cb3565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147e683398151915292919061127990613fed565b90501180156112ab575060015f83815260078301602052604090205460ff1660058111156112a9576112a9613fd9565b145b6112c75760405162461bcd60e51b81526004016103d8906144ae565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916113009190600401614025565b6020604051808303815f875af115801561131c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0891906140af565b5f805160206147c68339815191525f61135884611975565b90505f805f61136a8460400151611b10565b5f83815260058901602090815260408083206001600160a01b038d16845290915281208054949750929550909350916113a290613fed565b90501180156113ef575060015f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff1660058111156113ed576113ed613fd9565b145b61140b5760405162461bcd60e51b81526004016103d8906141d8565b5f83815260058601602090815260408083206001600160a01b038a168452909152812061143791613cb3565b5f61144184611d4b565b60808101515f86815260048901602090815260408083206001600160a01b038d1684529091529020549192506001600160401b03808516926114849291166144f5565b6001600160401b0316146114aa5760405162461bcd60e51b81526004016103d890614153565b826001600160401b031681606001516001600160401b031610156114e05760405162461bcd60e51b81526004016103d890614196565b6001600160401b03821660808201525f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c11b17905561152d8482611e46565b5f84815260048701602090815260408083206001600160a01b038b16808552908352928190205481516001600160401b039091168152429281019290925286917f4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88910160405180910390a35050505050505050565b5f5f805160206147e68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115fd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261162491908101906142a0565b91509150806116455760405162461bcd60e51b81526004016103d890614515565b5f84156116c9575f61165a846040015161304d565b919350909150506001600160401b038116156116c35760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016103d8565b5061173f565b5f6116d78460400151612eac565b9092509050801561173d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103d8565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561177057611770613fd9565b600581111561178157611781613fd9565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146118125760405162461bcd60e51b81526004016103d89061455b565b5f60038251600581111561182857611828613fd9565b1480611846575060028251600581111561184457611844613fd9565b145b1561186957506020808201515f908152600887019091526040812055600461186d565b5060055b5f83815260078701602052604090208251815484929190829060ff1916600183600581111561189e5761189e613fd9565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051606080820183525f8083526020830181905292820152905f805160206147e68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156119ea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a1191908101906142a0565b9150915080611a325760405162461bcd60e51b81526004016103d890614515565b8254825114611a955760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103d8565b60208201516001600160a01b031615611b085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103d8565b509392505050565b5f805f8351603614611b345760405162461bcd60e51b81526004016103d8906145a7565b5f805b6002811015611b8357611b4b8160016145f0565b611b5690600861425c565b61ffff16868281518110611b6c57611b6c614603565b016020015160f81c901b9190911790600101611b37565b5061ffff811615611ba65760405162461bcd60e51b81526004016103d890614617565b5f805b6004811015611c0157611bbd8160036145f0565b611bc890600861425c565b63ffffffff1687611bda83600261465a565b81518110611bea57611bea614603565b016020015160f81c901b9190911790600101611ba9565b5063ffffffff8116600314611c285760405162461bcd60e51b81526004016103d89061466d565b5f805b6020811015611c7d57611c3f81601f6145f0565b611c4a90600861425c565b88611c5683600661465a565b81518110611c6657611c66614603565b016020015160f81c901b9190911790600101611c2b565b505f805b6008811015611cdc57611c958160076145f0565b611ca090600861425c565b6001600160401b031689611cb583602661465a565b81518110611cc557611cc5614603565b016020015160f81c901b9190911790600101611c81565b505f805b6008811015611d3b57611cf48160076145f0565b611cff90600861425c565b6001600160401b03168a611d1483602e61465a565b81518110611d2457611d24614603565b016020015160f81c901b9190911790600101611ce0565b5091989097509095509350505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061482683398151915290528390208351918201909352825491925f805160206147e683398151915292829060ff166005811115611dcb57611dcb613fd9565b6005811115611ddc57611ddc613fd9565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061482683398151915260205260409020815181545f805160206147e68339815191529284929091829060ff19166001836005811115611e9057611e90613fd9565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b611f3d613278565b611f46826132c3565b611f4f81613309565b5050565b5f808251602e14611f765760405162461bcd60e51b81526004016103d8906145a7565b5f805b6002811015611fc557611f8d8160016145f0565b611f9890600861425c565b61ffff16858281518110611fae57611fae614603565b016020015160f81c901b9190911790600101611f79565b5061ffff811615611fe85760405162461bcd60e51b81526004016103d890614617565b5f805b600481101561204357611fff8160036145f0565b61200a90600861425c565b63ffffffff168661201c83600261465a565b8151811061202c5761202c614603565b016020015160f81c901b9190911790600101611feb565b5063ffffffff811660041461206a5760405162461bcd60e51b81526004016103d89061466d565b5f805b60208110156120bf5761208181601f6145f0565b61208c90600861425c565b8761209883600661465a565b815181106120a8576120a8614603565b016020015160f81c901b919091179060010161206d565b505f805b600881101561211e576120d78160076145f0565b6120e290600861425c565b6001600160401b0316886120f783602661465a565b8151811061210757612107614603565b016020015160f81c901b91909117906001016120c3565b5090969095509350505050565b5f8181525f805160206148268339815191526020526040808220815160e0810190925280545f805160206147e683398151915293929190829060ff16600581111561217857612178613fd9565b600581111561218957612189613fd9565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561220357612203613fd9565b146122205760405162461bcd60e51b81526004016103d8906146b4565b60408101516001600160a01b0316336001600160a01b0316146122555760405162461bcd60e51b81526004016103d89061455b565b61226281608001516133bd565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156122a6576122a6613fd9565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61235a8461235481612919565b5f612994565b5f858152600685016020526040902090915061237682826143bd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906123a390859060040161447c565b6020604051808303815f875af11580156123bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123e391906140af565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206147c6833981519152816124518461355e565b90505f61245d826108ae565b83549091506001600160401b0382161080159061248757508260010154816001600160401b031611155b610d2a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103d8565b5f6124ee613594565b5f805160206147e6833981519152426001600160401b03851611801561252857506001600160401b038416612526426202a30061465a565b115b61258a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103d8565b856125e15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016103d8565b5f8681526008820160205260409020541561264f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103d8565b82516030146126b65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103d8565b6126bf856133bd565b5f806127066040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506135cb565b5f8281526005860160205260409020919350915061272482826143bd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061275190859060040161447c565b6020604051808303815f875af115801561276d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061279191906140af565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561280a5761280a613fd9565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556128b383612919565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d2a60015f8051602061480683398151915255565b5f8181525f805160206148268339815191526020526040812060020180545f805160206147e683398151915291600160a01b9091046001600160401b03169081906014612965836146fa565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612a0d576129cd8160016145f0565b6129d890600861425c565b5081515f908390839081106129ef576129ef614603565b60200101906001600160f81b03191690815f1a9053506001016129b9565b505f5b6004811015612a7057612a248160036145f0565b612a2f90600861425c565b6001901c60f81b82612a4283600261465a565b81518110612a5257612a52614603565b60200101906001600160f81b03191690815f1a905350600101612a10565b505f5b6020811015612ad257612a8781601f6145f0565b612a9290600861425c565b86901c60f81b82612aa483600661465a565b81518110612ab457612ab4614603565b60200101906001600160f81b03191690815f1a905350600101612a73565b505f5b6008811015612b3d57612ae98160076145f0565b612af490600861425c565b6001600160401b038616901c60f81b82612b0f83602661465a565b81518110612b1f57612b1f614603565b60200101906001600160f81b03191690815f1a905350600101612ad5565b505f5b6008811015612ba857612b548160076145f0565b612b5f90600861425c565b6001600160401b038516901c60f81b82612b7a83602e61465a565b81518110612b8a57612b8a614603565b60200101906001600160f81b03191690815f1a905350600101612b40565b50949350505050565b612bb9613594565b5f805160206147c68339815191525f612bd185611d4b565b9050600281516005811115612be857612be8613fd9565b14612c055760405162461bcd60e51b81526004016103d8906146b4565b5f85815260048301602090815260408083206001600160a01b03881684529091529020546001600160401b031615612c965760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2044656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016103d8565b612c9f836133bd565b5f612cbd86612cad88612919565b868560800151610f7991906144f5565b5f87815260058501602090815260408083206001600160a01b038a1684529091529020909150612ced82826143bd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d1a90859060040161447c565b6020604051808303815f875af1158015612d36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d5a91906140af565b604080516080810182526001600160401b038089168252421660208201525f9181019190915290915060608101600190525f88815260048601602090815260408083206001600160a01b038b1684528252918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836005811115612e3b57612e3b613fd9565b021790555050604080516001600160401b03881681524260208201526001600160a01b038916925083918a917ff8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16910160405180910390a450505050610d0860015f8051602061480683398151915255565b5f808251602714612ecf5760405162461bcd60e51b81526004016103d8906145a7565b5f805b6002811015612f1e57612ee68160016145f0565b612ef190600861425c565b61ffff16858281518110612f0757612f07614603565b016020015160f81c901b9190911790600101612ed2565b5061ffff811615612f415760405162461bcd60e51b81526004016103d890614617565b5f805b6004811015612f9c57612f588160036145f0565b612f6390600861425c565b63ffffffff1686612f7583600261465a565b81518110612f8557612f85614603565b016020015160f81c901b9190911790600101612f44565b5063ffffffff8116600214612fc35760405162461bcd60e51b81526004016103d89061466d565b5f805b602081101561301857612fda81601f6145f0565b612fe590600861425c565b87612ff183600661465a565b8151811061300157613001614603565b016020015160f81c901b9190911790600101612fc6565b505f8660268151811061302d5761302d614603565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146130715760405162461bcd60e51b81526004016103d8906145a7565b5f805b60028110156130c0576130888160016145f0565b61309390600861425c565b61ffff168682815181106130a9576130a9614603565b016020015160f81c901b9190911790600101613074565b5061ffff8116156130e35760405162461bcd60e51b81526004016103d890614617565b5f805b600481101561313e576130fa8160036145f0565b61310590600861425c565b63ffffffff168761311783600261465a565b8151811061312757613127614603565b016020015160f81c901b91909117906001016130e6565b5063ffffffff81166001146131655760405162461bcd60e51b81526004016103d89061466d565b5f805b60208110156131ba5761317c81601f6145f0565b61318790600861425c565b8861319383600661465a565b815181106131a3576131a3614603565b016020015160f81c901b9190911790600101613168565b505f805b6008811015613219576131d28160076145f0565b6131dd90600861425c565b6001600160401b0316896131f283602661465a565b8151811061320257613202614603565b016020015160f81c901b91909117906001016131be565b505f805b6008811015611d3b576132318160076145f0565b61323c90600861425c565b6001600160401b03168a61325183602e61465a565b8151811061326157613261614603565b016020015160f81c901b919091179060010161321d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166132c157604051631afcd79f60e31b815260040160405180910390fd5b565b6132cb613278565b6132d481613983565b613306606082013560808301356132f160c0850160a08601613de0565b61330160e0860160c0870161471f565b6139a4565b50565b613311613278565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661339d5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103d8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147e68339815191529060ff165f036133fb575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061344390836145f0565b1061345f576001600160401b038416604083015280825261347e565b838260400181815161347191906144f5565b6001600160401b03169052505b5f826020015183604001516064613495919061473a565b61349f9190614765565b600285015490915060ff908116908216111561351a5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103d8565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6108be827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906139ff565b5f805160206148068339815191528054600119016135c557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146136355760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103d8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156136ac5761366c8160016145f0565b61367790600861425c565b5081515f9083908390811061368e5761368e614603565b60200101906001600160f81b03191690815f1a905350600101613658565b505f5b600481101561370a576136c38160036145f0565b6136ce90600861425c565b505f826136dc83600261465a565b815181106136ec576136ec614603565b60200101906001600160f81b03191690815f1a9053506001016136af565b505f5b6020811015613767578451816020811061372957613729614603565b1a60f81b8261373983600661465a565b8151811061374957613749614603565b60200101906001600160f81b03191690815f1a90535060010161370d565b505f5b60208110156137c7578460200151816020811061378957613789614603565b1a60f81b8261379983602661465a565b815181106137a9576137a9614603565b60200101906001600160f81b03191690815f1a90535060010161376a565b505f5b600881101561383b576137de8160076145f0565b6137e990600861425c565b60ff1685604001516001600160401b0316901c60f81b8282604661380d919061465a565b8151811061381d5761381d614603565b60200101906001600160f81b03191690815f1a9053506001016137ca565b505f5b60308110156138a6578460800151818151811061385d5761385d614603565b01602001516001600160f81b0319168261387883604e61465a565b8151811061388857613888614603565b60200101906001600160f81b03191690815f1a90535060010161383e565b505f5b6008811015613918576138bd8160076145f0565b6138c890600861425c565b60608601516001600160401b0390811691161c60f81b826138ea83607e61465a565b815181106138fa576138fa614603565b60200101906001600160f81b03191690815f1a9053506001016138a9565b50600281604051613929919061478a565b602060405180830381855afa158015613944573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061396791906140af565b94909350915050565b60015f8051602061480683398151915255565b61398b613278565b613993613b61565b61399b613b71565b61330681613b79565b6139ac613278565b5f5f805160206147c6833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a6991906140af565b9050613a806001600160a01b038516333086613be5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ac4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ae891906140af565b9050818111613b4e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103d8565b613b5882826145f0565b95945050505050565b613b69613278565b6132c1613c3f565b6132c1613278565b613b81613278565b80355f805160206147e683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bcb60608301604084016147a5565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261045a908590613c47565b613970613278565b5f8060205f8451602086015f885af180613c66576040513d5f823e3d81fd5b50505f513d91508115613c7d578060011415613c8a565b6001600160a01b0384163b155b1561045a57604051635274afe760e01b81526001600160a01b03851660048201526024016103d8565b508054613cbf90613fed565b5f825580601f10613cce575050565b601f0160209004905f5260205f209081019061330691905b80821115613cf9575f8155600101613ce6565b5090565b5f60208284031215613d0d575f80fd5b5035919050565b803563ffffffff81168114613d27575f80fd5b919050565b6001600160a01b0381168114613306575f80fd5b5f8060408385031215613d51575f80fd5b613d5a83613d14565b91506020830135613d6a81613d2c565b809150509250929050565b5f8060408385031215613d86575f80fd5b823591506020830135613d6a81613d2c565b5f80828403610100811215613dab575f80fd5b60e0811215613db8575f80fd5b5082915060e0830135613d6a81613d2c565b80356001600160401b0381168114613d27575f80fd5b5f60208284031215613df0575f80fd5b613df982613dca565b9392505050565b8015158114613306575f80fd5b5f805f60608486031215613e1f575f80fd5b833592506020840135613e3181613e00565b9150613e3f60408501613d14565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e7e57613e7e613e48565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613eac57613eac613e48565b604052919050565b5f6001600160401b03821115613ecc57613ecc613e48565b50601f01601f191660200190565b5f805f8060808587031215613eed575f80fd5b8435935060208501359250613f0460408601613dca565b915060608501356001600160401b03811115613f1e575f80fd5b8501601f81018713613f2e575f80fd5b8035613f41613f3c82613eb4565b613e84565b818152886020838501011115613f55575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613f87575f80fd5b50508035926020909101359150565b5f60208284031215613fa6575f80fd5b613df982613d14565b5f8060408385031215613fc0575f80fd5b613fc983613d14565b91506020830135613d6a81613e00565b634e487b7160e01b5f52602160045260245ffd5b600181811c9082168061400157607f821691505b60208210810361401f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461403781613fed565b806020870152604060018084165f81146140585760018114614074576140a1565b60ff19851660408a0152604084151560051b8a010195506140a1565b895f5260205f205f5b858110156140985781548b820186015290830190880161407d565b8a016040019650505b509398975050505050505050565b5f602082840312156140bf575f80fd5b5051919050565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f722072604082015271656d6f76616c206e6f742070656e64696e6760701b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561414c5761414c614118565b5092915050565b60208082526023908201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960408201526219da1d60ea1b606082015260800190565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20496e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526037908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f72207260408201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261425757614257614235565b500490565b80820281158282048414176108be576108be614118565b5f5b8381101561428d578181015183820152602001614275565b50505f910152565b8051613d2781613e00565b5f80604083850312156142b1575f80fd5b82516001600160401b03808211156142c7575f80fd5b90840190606082870312156142da575f80fd5b6142e2613e5c565b825181526020808401516142f581613d2c565b8282015260408401518381111561430a575f80fd5b80850194505087601f85011261431e575f80fd5b8351925061432e613f3c84613eb4565b8381528882858701011115614341575f80fd5b61435084838301848801614273565b80604084015250819550614365818801614295565b9450505050509250929050565b601f821115610d0857805f5260205f20601f840160051c810160208510156143975750805b601f840160051c820191505b818110156143b6575f81556001016143a3565b5050505050565b81516001600160401b038111156143d6576143d6613e48565b6143ea816143e48454613fed565b84614372565b602080601f83116001811461441d575f84156144065750858301515b5f19600386901b1c1916600185901b178555614474565b5f85815260208120601f198616915b8281101561444b5788860151825594840194600190910190840161442c565b508582101561446857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f825180602084015261449a816040850160208701614273565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160401b0381811683821601908082111561414c5761414c614118565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156108be576108be614118565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156108be576108be614118565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361471557614715614118565b6001019392505050565b5f6020828403121561472f575f80fd5b8135613df981613d2c565b6001600160401b0381811683821602808216919082811461475d5761475d614118565b505092915050565b5f6001600160401b038084168061477e5761477e614235565b92169190910492915050565b5f825161479b818460208701614273565b9190910192915050565b5f602082840312156147b5575f80fd5b813560ff81168114613df9575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"validatorWeight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516149af3803806149af83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148628061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063872fda6411610093578063b771b3bc11610063578063b771b3bc14610210578063bee0a03f14610236578063d61bed7414610249578063fdf94a1a1461025c575f80fd5b8063872fda64146101c4578063927e7e75146101d75780639e1bc4ef146101ea578063a3a65e48146101fd575f80fd5b80632e2194d8116100ce5780632e2194d81461014d578063620658561461017d5780636a7e3d831461019e57806376f78621146101b1575f80fd5b80630322ed98146100ff5780630915204e146101145780630b77f6931461012757806327f39ca81461013a575b5f80fd5b61011261010d366004613d0d565b61026f565b005b610112610122366004613d50565b610460565b610112610135366004613d85565b6106a3565b610112610148366004613da8565b6107b5565b61016061015b366004613d0d565b6108c3565b6040516001600160401b0390911681526020015b60405180910390f35b61019061018b366004613df0565b6108d9565b604051908152602001610174565b6101126101ac366004613d85565b6108f2565b6101126101bf366004613e1d565b610a04565b6101906101d2366004613eea565b610d22565b6101126101e5366004613d0d565b610d47565b6101126101f8366004613f86565b611076565b61011261020b366004613fa6565b611090565b61021e6005600160991b0181565b6040516001600160a01b039091168152602001610174565b610112610244366004613d0d565b611249565b610112610257366004613d50565b611358565b61011261026a366004613fbf565b6115b6565b5f8181525f805160206148368339815191526020526040808220815160e0810190925280545f805160206147f683398151915293929190829060ff1660058111156102bc576102bc613fe9565b60058111156102cd576102cd613fe9565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f868152600686019091529081208054929350909161035790613ffd565b9050118015610378575060038151600581111561037657610376613fe9565b145b6103e15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614035565b6020604051808303815f875af1158015610436573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045a91906140bf565b50505050565b5f805160206147d68339815191525f61047884611989565b90505f805f61048a8460400151611b24565b5f83815260068901602090815260408083206001600160a01b038d16845290915281208054949750929550909350916104c290613ffd565b905011801561050f575060035f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff16600581111561050d5761050d613fe9565b145b61052b5760405162461bcd60e51b81526004016103d8906140d6565b5f83815260068601602090815260408083206001600160a01b038a168452909152812061055791613cc3565b5f61056184611d5f565b5f85815260048801602090815260408083206001600160a01b038c16845290915290205460808201519192506001600160401b03808516926105a6929091169061413c565b6001600160401b0316146105cc5760405162461bcd60e51b81526004016103d890614163565b826001600160401b031681606001516001600160401b031610156106025760405162461bcd60e51b81526004016103d8906141a6565b5f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c21b1790556001600160401b038216608082015261064f8482611e5a565b6040516001600160401b03831681526001600160a01b0388169085907fe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513906020015b60405180910390a35050505050505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206147d68339815191529291906106ff90613ffd565b905011801561074c575060015f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff16600581111561074a5761074a613fe9565b145b6107685760405162461bcd60e51b81526004016103d8906141e8565b5f83815260058201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614035565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107f95750825b90505f826001600160401b031660011480156108145750303b155b905081158015610822575080155b156108405760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561086a57845460ff60401b1916600160401b1785555b6108748787611f49565b83156108ba57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6108d364e8d4a5100083614259565b92915050565b5f6108d36001600160401b03831664e8d4a5100061426c565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f805160206147d683398151915292919061094e90613ffd565b905011801561099b575060035f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff16600581111561099957610999613fe9565b145b6109b75760405162461bcd60e51b81526004016103d8906140d6565b5f83815260068201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614035565b8115610d14575f5f805160206147d68339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610a65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a8c91908101906142b0565b9150915080610aef5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103d8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b5691906140bf565b825114610bba5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103d8565b60208201516001600160a01b031615610c305760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103d8565b5f80610c3f8460400151611f63565b91509150818814610cac5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103d8565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610d1d8361213b565b505050565b5f80610d2d86612448565b9050610d3b858286866124f5565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f805160206147d683398151915293926060830190600160c01b900460ff166005811115610de657610de6613fe9565b6005811115610df757610df7613fe9565b9052509050600281606001516005811115610e1457610e14613fe9565b14610e705760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2044656c656761746f72206e6f742060448201526561637469766560d01b60648201526084016103d8565b600360608201908152426001600160401b0390811660408085019182525f8781526004870160209081528282203383528152919020855181549287015193518516600160801b0267ffffffffffffffff60801b19948616600160401b026001600160801b03199094169190951617919091179182168317815592518493929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836005811115610f2257610f22613fe9565b02179055509050505f610f3484611d5f565b9050815f01516001600160401b031681608001516001600160401b03161015610f6f5760405162461bcd60e51b81526004016103d890614163565b5f610f9385610f7d87612929565b85516080860151610f8e919061413c565b6129a4565b5f86815260068601602090815260408083203384529091529020909150610fba82826143cd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610fe790859060040161448c565b6020604051808303815f875af1158015611003573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102791906140bf565b9050336001600160a01b031681877f2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc24260405161106691815260200190565b60405180910390a4505050505050565b61108c823361108761015b85612bc1565b612bf7565b5050565b5f805160206147f68339815191525f6110a883611989565b90505f806110b98360400151612ef2565b915091508061111b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103d8565b5f8281526005850160205260408120805461113590613ffd565b9050118015611167575060015f83815260078601602052604090205460ff16600581111561116557611165613fe9565b145b6111835760405162461bcd60e51b81526004016103d8906144be565b5f828152600585016020526040812061119b91613cc3565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147f683398151915292919061129190613ffd565b90501180156112c3575060015f83815260078301602052604090205460ff1660058111156112c1576112c1613fe9565b145b6112df5760405162461bcd60e51b81526004016103d8906144be565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916113189190600401614035565b6020604051808303815f875af1158015611334573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1d91906140bf565b5f805160206147d68339815191525f61137084611989565b90505f805f6113828460400151611b24565b5f83815260058901602090815260408083206001600160a01b038d16845290915281208054949750929550909350916113ba90613ffd565b9050118015611407575060015f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff16600581111561140557611405613fe9565b145b6114235760405162461bcd60e51b81526004016103d8906141e8565b5f83815260058601602090815260408083206001600160a01b038a168452909152812061144f91613cc3565b5f61145984611d5f565b60808101515f86815260048901602090815260408083206001600160a01b038d1684529091529020549192506001600160401b038085169261149c929116614505565b6001600160401b0316146114c25760405162461bcd60e51b81526004016103d890614163565b826001600160401b031681606001516001600160401b031610156114f85760405162461bcd60e51b81526004016103d8906141a6565b6001600160401b03821660808201525f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c11b1790556115458482611e5a565b5f84815260048701602090815260408083206001600160a01b038b16808552908352928190205481516001600160401b03918216815290861692810192909252429082015285907fa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a390606001610691565b5f5f805160206147f68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611611573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261163891908101906142b0565b91509150806116595760405162461bcd60e51b81526004016103d890614525565b5f84156116dd575f61166e8460400151613093565b919350909150506001600160401b038116156116d75760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016103d8565b50611753565b5f6116eb8460400151612ef2565b909250905080156117515760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103d8565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561178457611784613fe9565b600581111561179557611795613fe9565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146118265760405162461bcd60e51b81526004016103d89061456b565b5f60038251600581111561183c5761183c613fe9565b148061185a575060028251600581111561185857611858613fe9565b145b1561187d57506020808201515f9081526008870190915260408120556004611881565b5060055b5f83815260078701602052604090208251815484929190829060ff191660018360058111156118b2576118b2613fe9565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051606080820183525f8083526020830181905292820152905f805160206147f68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156119fe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a2591908101906142b0565b9150915080611a465760405162461bcd60e51b81526004016103d890614525565b8254825114611aa95760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103d8565b60208201516001600160a01b031615611b1c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103d8565b509392505050565b5f805f8351603614611b485760405162461bcd60e51b81526004016103d8906145b7565b5f805b6002811015611b9757611b5f816001614600565b611b6a90600861426c565b61ffff16868281518110611b8057611b80614613565b016020015160f81c901b9190911790600101611b4b565b5061ffff811615611bba5760405162461bcd60e51b81526004016103d890614627565b5f805b6004811015611c1557611bd1816003614600565b611bdc90600861426c565b63ffffffff1687611bee83600261466a565b81518110611bfe57611bfe614613565b016020015160f81c901b9190911790600101611bbd565b5063ffffffff8116600314611c3c5760405162461bcd60e51b81526004016103d89061467d565b5f805b6020811015611c9157611c5381601f614600565b611c5e90600861426c565b88611c6a83600661466a565b81518110611c7a57611c7a614613565b016020015160f81c901b9190911790600101611c3f565b505f805b6008811015611cf057611ca9816007614600565b611cb490600861426c565b6001600160401b031689611cc983602661466a565b81518110611cd957611cd9614613565b016020015160f81c901b9190911790600101611c95565b505f805b6008811015611d4f57611d08816007614600565b611d1390600861426c565b6001600160401b03168a611d2883602e61466a565b81518110611d3857611d38614613565b016020015160f81c901b9190911790600101611cf4565b5091989097509095509350505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061483683398151915290528390208351918201909352825491925f805160206147f683398151915292829060ff166005811115611ddf57611ddf613fe9565b6005811115611df057611df0613fe9565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061483683398151915260205260409020815181545f805160206147f68339815191529284929091829060ff19166001836005811115611ea457611ea4613fe9565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b611f516132be565b611f5a82613309565b61108c8161334f565b5f808251602e14611f865760405162461bcd60e51b81526004016103d8906145b7565b5f805b6002811015611fd557611f9d816001614600565b611fa890600861426c565b61ffff16858281518110611fbe57611fbe614613565b016020015160f81c901b9190911790600101611f89565b5061ffff811615611ff85760405162461bcd60e51b81526004016103d890614627565b5f805b60048110156120535761200f816003614600565b61201a90600861426c565b63ffffffff168661202c83600261466a565b8151811061203c5761203c614613565b016020015160f81c901b9190911790600101611ffb565b5063ffffffff811660041461207a5760405162461bcd60e51b81526004016103d89061467d565b5f805b60208110156120cf5761209181601f614600565b61209c90600861426c565b876120a883600661466a565b815181106120b8576120b8614613565b016020015160f81c901b919091179060010161207d565b505f805b600881101561212e576120e7816007614600565b6120f290600861426c565b6001600160401b03168861210783602661466a565b8151811061211757612117614613565b016020015160f81c901b91909117906001016120d3565b5090969095509350505050565b5f8181525f805160206148368339815191526020526040808220815160e0810190925280545f805160206147f683398151915293929190829060ff16600581111561218857612188613fe9565b600581111561219957612199613fe9565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561221357612213613fe9565b146122305760405162461bcd60e51b81526004016103d8906146c4565b60408101516001600160a01b0316336001600160a01b0316146122655760405162461bcd60e51b81526004016103d89061456b565b6122728160800151613403565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156122b6576122b6613fe9565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61236a8461236481612929565b5f6129a4565b5f858152600685016020526040902090915061238682826143cd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906123b390859060040161448c565b6020604051808303815f875af11580156123cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123f391906140bf565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206147d68339815191528161246184612bc1565b90505f61246d826108c3565b83549091506001600160401b0382161080159061249757508260010154816001600160401b031611155b610d3f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103d8565b5f6124fe6135a4565b5f805160206147f6833981519152426001600160401b03851611801561253857506001600160401b038416612536426202a30061466a565b115b61259a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103d8565b856125f15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016103d8565b5f8681526008820160205260409020541561265f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103d8565b82516030146126c65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103d8565b6126cf85613403565b5f806127166040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506135db565b5f8281526005860160205260409020919350915061273482826143cd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061276190859060040161448c565b6020604051808303815f875af115801561277d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a191906140bf565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561281a5761281a613fe9565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556128c383612929565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d3f60015f8051602061481683398151915255565b5f8181525f805160206148368339815191526020526040812060020180545f805160206147f683398151915291600160a01b9091046001600160401b031690819060146129758361470a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612a1d576129dd816001614600565b6129e890600861426c565b5081515f908390839081106129ff576129ff614613565b60200101906001600160f81b03191690815f1a9053506001016129c9565b505f5b6004811015612a8057612a34816003614600565b612a3f90600861426c565b6001901c60f81b82612a5283600261466a565b81518110612a6257612a62614613565b60200101906001600160f81b03191690815f1a905350600101612a20565b505f5b6020811015612ae257612a9781601f614600565b612aa290600861426c565b86901c60f81b82612ab483600661466a565b81518110612ac457612ac4614613565b60200101906001600160f81b03191690815f1a905350600101612a83565b505f5b6008811015612b4d57612af9816007614600565b612b0490600861426c565b6001600160401b038616901c60f81b82612b1f83602661466a565b81518110612b2f57612b2f614613565b60200101906001600160f81b03191690815f1a905350600101612ae5565b505f5b6008811015612bb857612b64816007614600565b612b6f90600861426c565b6001600160401b038516901c60f81b82612b8a83602e61466a565b81518110612b9a57612b9a614613565b60200101906001600160f81b03191690815f1a905350600101612b50565b50949350505050565b5f6108d3827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613993565b612bff6135a4565b5f805160206147d68339815191525f612c1785611d5f565b9050600281516005811115612c2e57612c2e613fe9565b14612c4b5760405162461bcd60e51b81526004016103d8906146c4565b5f85815260048301602090815260408083206001600160a01b03881684529091529020546001600160401b031615612cdc5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2044656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016103d8565b612ce583613403565b5f612d0386612cf388612929565b868560800151610f8e9190614505565b5f87815260058501602090815260408083206001600160a01b038a1684529091529020909150612d3382826143cd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d6090859060040161448c565b6020604051808303815f875af1158015612d7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612da091906140bf565b604080516080810182526001600160401b038089168252421660208201525f9181019190915290915060608101600190525f88815260048601602090815260408083206001600160a01b038b1684528252918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836005811115612e8157612e81613fe9565b021790555050604080516001600160401b03881681524260208201526001600160a01b038916925083918a917ff8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16910160405180910390a450505050610d1d60015f8051602061481683398151915255565b5f808251602714612f155760405162461bcd60e51b81526004016103d8906145b7565b5f805b6002811015612f6457612f2c816001614600565b612f3790600861426c565b61ffff16858281518110612f4d57612f4d614613565b016020015160f81c901b9190911790600101612f18565b5061ffff811615612f875760405162461bcd60e51b81526004016103d890614627565b5f805b6004811015612fe257612f9e816003614600565b612fa990600861426c565b63ffffffff1686612fbb83600261466a565b81518110612fcb57612fcb614613565b016020015160f81c901b9190911790600101612f8a565b5063ffffffff81166002146130095760405162461bcd60e51b81526004016103d89061467d565b5f805b602081101561305e5761302081601f614600565b61302b90600861426c565b8761303783600661466a565b8151811061304757613047614613565b016020015160f81c901b919091179060010161300c565b505f8660268151811061307357613073614613565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146130b75760405162461bcd60e51b81526004016103d8906145b7565b5f805b6002811015613106576130ce816001614600565b6130d990600861426c565b61ffff168682815181106130ef576130ef614613565b016020015160f81c901b91909117906001016130ba565b5061ffff8116156131295760405162461bcd60e51b81526004016103d890614627565b5f805b600481101561318457613140816003614600565b61314b90600861426c565b63ffffffff168761315d83600261466a565b8151811061316d5761316d614613565b016020015160f81c901b919091179060010161312c565b5063ffffffff81166001146131ab5760405162461bcd60e51b81526004016103d89061467d565b5f805b6020811015613200576131c281601f614600565b6131cd90600861426c565b886131d983600661466a565b815181106131e9576131e9614613565b016020015160f81c901b91909117906001016131ae565b505f805b600881101561325f57613218816007614600565b61322390600861426c565b6001600160401b03168961323883602661466a565b8151811061324857613248614613565b016020015160f81c901b9190911790600101613204565b505f805b6008811015611d4f57613277816007614600565b61328290600861426c565b6001600160401b03168a61329783602e61466a565b815181106132a7576132a7614613565b016020015160f81c901b9190911790600101613263565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661330757604051631afcd79f60e31b815260040160405180910390fd5b565b6133116132be565b61331a81613af5565b61334c6060820135608083013561333760c0850160a08601613df0565b61334760e0860160c0870161472f565b613b16565b50565b6133576132be565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166133e35760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103d8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147f68339815191529060ff165f03613441575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906134899083614600565b106134a5576001600160401b03841660408301528082526134c4565b83826040018181516134b79190614505565b6001600160401b03169052505b5f8260200151836040015160646134db919061474a565b6134e59190614775565b600285015490915060ff90811690821611156135605760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103d8565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206148168339815191528054600119016135d557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146136455760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103d8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156136bc5761367c816001614600565b61368790600861426c565b5081515f9083908390811061369e5761369e614613565b60200101906001600160f81b03191690815f1a905350600101613668565b505f5b600481101561371a576136d3816003614600565b6136de90600861426c565b505f826136ec83600261466a565b815181106136fc576136fc614613565b60200101906001600160f81b03191690815f1a9053506001016136bf565b505f5b6020811015613777578451816020811061373957613739614613565b1a60f81b8261374983600661466a565b8151811061375957613759614613565b60200101906001600160f81b03191690815f1a90535060010161371d565b505f5b60208110156137d7578460200151816020811061379957613799614613565b1a60f81b826137a983602661466a565b815181106137b9576137b9614613565b60200101906001600160f81b03191690815f1a90535060010161377a565b505f5b600881101561384b576137ee816007614600565b6137f990600861426c565b60ff1685604001516001600160401b0316901c60f81b8282604661381d919061466a565b8151811061382d5761382d614613565b60200101906001600160f81b03191690815f1a9053506001016137da565b505f5b60308110156138b6578460800151818151811061386d5761386d614613565b01602001516001600160f81b0319168261388883604e61466a565b8151811061389857613898614613565b60200101906001600160f81b03191690815f1a90535060010161384e565b505f5b6008811015613928576138cd816007614600565b6138d890600861426c565b60608601516001600160401b0390811691161c60f81b826138fa83607e61466a565b8151811061390a5761390a614613565b60200101906001600160f81b03191690815f1a9053506001016138b9565b50600281604051613939919061479a565b602060405180830381855afa158015613954573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061397791906140bf565b94909350915050565b60015f8051602061481683398151915255565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139fd91906140bf565b9050613a146001600160a01b038516333086613b71565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a7c91906140bf565b9050818111613ae25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103d8565b613aec8282614600565b95945050505050565b613afd6132be565b613b05613bcb565b613b0d613bdb565b61334c81613be3565b613b1e6132be565b5f5f805160206147d6833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261045a908590613c4f565b613bd36132be565b613307613cbb565b6133076132be565b613beb6132be565b80355f805160206147f683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613c3560608301604084016147b5565b600291909101805460ff191660ff90921691909117905550565b5f8060205f8451602086015f885af180613c6e576040513d5f823e3d81fd5b50505f513d91508115613c85578060011415613c92565b6001600160a01b0384163b155b1561045a57604051635274afe760e01b81526001600160a01b03851660048201526024016103d8565b6139806132be565b508054613ccf90613ffd565b5f825580601f10613cde575050565b601f0160209004905f5260205f209081019061334c91905b80821115613d09575f8155600101613cf6565b5090565b5f60208284031215613d1d575f80fd5b5035919050565b803563ffffffff81168114613d37575f80fd5b919050565b6001600160a01b038116811461334c575f80fd5b5f8060408385031215613d61575f80fd5b613d6a83613d24565b91506020830135613d7a81613d3c565b809150509250929050565b5f8060408385031215613d96575f80fd5b823591506020830135613d7a81613d3c565b5f80828403610100811215613dbb575f80fd5b60e0811215613dc8575f80fd5b5082915060e0830135613d7a81613d3c565b80356001600160401b0381168114613d37575f80fd5b5f60208284031215613e00575f80fd5b613e0982613dda565b9392505050565b801515811461334c575f80fd5b5f805f60608486031215613e2f575f80fd5b833592506020840135613e4181613e10565b9150613e4f60408501613d24565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e8e57613e8e613e58565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613ebc57613ebc613e58565b604052919050565b5f6001600160401b03821115613edc57613edc613e58565b50601f01601f191660200190565b5f805f8060808587031215613efd575f80fd5b8435935060208501359250613f1460408601613dda565b915060608501356001600160401b03811115613f2e575f80fd5b8501601f81018713613f3e575f80fd5b8035613f51613f4c82613ec4565b613e94565b818152886020838501011115613f65575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613f97575f80fd5b50508035926020909101359150565b5f60208284031215613fb6575f80fd5b613e0982613d24565b5f8060408385031215613fd0575f80fd5b613fd983613d24565b91506020830135613d7a81613e10565b634e487b7160e01b5f52602160045260245ffd5b600181811c9082168061401157607f821691505b60208210810361402f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461404781613ffd565b806020870152604060018084165f81146140685760018114614084576140b1565b60ff19851660408a0152604084151560051b8a010195506140b1565b895f5260205f205f5b858110156140a85781548b820186015290830190880161408d565b8a016040019650505b509398975050505050505050565b5f602082840312156140cf575f80fd5b5051919050565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f722072604082015271656d6f76616c206e6f742070656e64696e6760701b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561415c5761415c614128565b5092915050565b60208082526023908201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960408201526219da1d60ea1b606082015260800190565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20496e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526037908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f72207260408201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261426757614267614245565b500490565b80820281158282048414176108d3576108d3614128565b5f5b8381101561429d578181015183820152602001614285565b50505f910152565b8051613d3781613e10565b5f80604083850312156142c1575f80fd5b82516001600160401b03808211156142d7575f80fd5b90840190606082870312156142ea575f80fd5b6142f2613e6c565b8251815260208084015161430581613d3c565b8282015260408401518381111561431a575f80fd5b80850194505087601f85011261432e575f80fd5b8351925061433e613f4c84613ec4565b8381528882858701011115614351575f80fd5b61436084838301848801614283565b806040840152508195506143758188016142a5565b9450505050509250929050565b601f821115610d1d57805f5260205f20601f840160051c810160208510156143a75750805b601f840160051c820191505b818110156143c6575f81556001016143b3565b5050505050565b81516001600160401b038111156143e6576143e6613e58565b6143fa816143f48454613ffd565b84614382565b602080601f83116001811461442d575f84156144165750858301515b5f19600386901b1c1916600185901b178555614484565b5f85815260208120601f198616915b8281101561445b5788860151825594840194600190910190840161443c565b508582101561447857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526144aa816040850160208701614283565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160401b0381811683821601908082111561415c5761415c614128565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156108d3576108d3614128565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156108d3576108d3614128565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361472557614725614128565b6001019392505050565b5f6020828403121561473f575f80fd5b8135613e0981613d3c565b6001600160401b0381811683821602808216919082811461476d5761476d614128565b505092915050565b5f6001600160401b038084168061478e5761478e614245565b92169190910492915050565b5f82516147ab818460208701614283565b9190910192915050565b5f602082840312156147c5575f80fd5b813560ff81168114613e09575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -418,23 +418,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, stakeAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeDelegatorRegistration", validationID, stakeAmount) +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeDelegatorRegistration", validationID, delegationAmount) } // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeDelegatorRegistration(validationID [32]byte, stakeAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, stakeAmount) +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeDelegatorRegistration(validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegationAmount) } // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeDelegatorRegistration(validationID [32]byte, stakeAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, stakeAmount) +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeDelegatorRegistration(validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegationAmount) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. @@ -653,14 +653,15 @@ func (it *ERC20TokenStakingManagerDelegationEndedIterator) Close() error { // ERC20TokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegationEnded struct { - ValidationID [32]byte - Delegator common.Address - Raw types.Log // Blockchain specific contextual infos + ValidationID [32]byte + Delegator common.Address + ValidatorWeight *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0xe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator) +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { var validationIDRule []interface{} @@ -679,9 +680,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat return &ERC20TokenStakingManagerDelegationEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0xe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator) +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, validationID [][32]byte, delegator []common.Address) (event.Subscription, error) { var validationIDRule []interface{} @@ -725,9 +726,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegati }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564. +// ParseDelegationEnded is a log parse operation binding the contract event 0xe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator) +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { event := new(ERC20TokenStakingManagerDelegationEnded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { @@ -970,16 +971,17 @@ func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Close() error { // ERC20TokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegatorRegistered struct { - ValidationID [32]byte - Delegator common.Address - Weight *big.Int - StartTime *big.Int - Raw types.Log // Blockchain specific contextual infos + ValidationID [32]byte + Delegator common.Address + Weight *big.Int + ValidatorWeight *big.Int + StartTime *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88. +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0xa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a3. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 validatorWeight, uint256 startTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { var validationIDRule []interface{} @@ -998,9 +1000,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat return &ERC20TokenStakingManagerDelegatorRegisteredIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil } -// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88. +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0xa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a3. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 validatorWeight, uint256 startTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegator []common.Address) (event.Subscription, error) { var validationIDRule []interface{} @@ -1044,9 +1046,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorRegistered is a log parse operation binding the contract event 0x4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88. +// ParseDelegatorRegistered is a log parse operation binding the contract event 0xa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a3. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 validatorWeight, uint256 startTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*ERC20TokenStakingManagerDelegatorRegistered, error) { event := new(ERC20TokenStakingManagerDelegatorRegistered) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 4917fcc4c..b3f04fdfc 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516146c73803806146c783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61457a8061014d5f395ff3fe6080604052600436106100ee575f3560e01c8063927e7e7511610087578063c599e24f11610057578063c599e24f146102a6578063d61bed74146102b9578063f40797d7146102d8578063fdf94a1a146102eb575f80fd5b8063927e7e7514610217578063a3a65e4814610236578063b771b3bc14610255578063bee0a03f14610287575f80fd5b80632e2194d8116100c25780632e2194d81461017057806362065856146101ac5780636a7e3d83146101d957806376f78621146101f8575f80fd5b8062e41792146100f25780630322ed98146101135780630915204e146101325780630b77f69314610151575b5f80fd5b3480156100fd575f80fd5b5061011161010c366004613a75565b61030a565b005b34801561011e575f80fd5b5061011161012d366004613a8b565b610416565b34801561013d575f80fd5b5061011161014c366004613ace565b610607565b34801561015c575f80fd5b5061011161016b366004613b03565b610835565b34801561017b575f80fd5b5061018f61018a366004613a8b565b610947565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101b7575f80fd5b506101cb6101c6366004613b3c565b61095d565b6040519081526020016101a3565b3480156101e4575f80fd5b506101116101f3366004613b03565b610976565b348015610203575f80fd5b50610111610212366004613b69565b610a88565b348015610222575f80fd5b50610111610231366004613a8b565b610da6565b348015610241575f80fd5b50610111610250366004613ba4565b6110d5565b348015610260575f80fd5b5061026f6005600160991b0181565b6040516001600160a01b0390911681526020016101a3565b348015610292575f80fd5b506101116102a1366004613a8b565b61128e565b6101116102b4366004613a8b565b61139d565b3480156102c4575f80fd5b506101116102d3366004613ace565b6113b8565b6101cb6102e6366004613c4f565b61161a565b3480156102f6575f80fd5b50610111610305366004613ce1565b61163c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561034e5750825b90505f826001600160401b031660011480156103695750303b155b905081158015610377575080155b156103955760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103bf57845460ff60401b1916600160401b1785555b6103c886611a0f565b831561040e57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181525f8051602061454e8339815191526020526040808220815160e0810190925280545f8051602061450e83398151915293929190829060ff16600581111561046357610463613d0b565b600581111561047457610474613d0b565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916104fe90613d1f565b905011801561051f575060038151600581111561051d5761051d613d0b565b145b6105885760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613d51565b6020604051808303815f875af11580156105dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106019190613ddb565b50505050565b5f805160206144ee8339815191525f61061f84611a23565b90505f805f6106318460400151611bbe565b5f83815260068901602090815260408083206001600160a01b038d168452909152812080549497509295509093509161066990613d1f565b90501180156106b6575060035f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff1660058111156106b4576106b4613d0b565b145b6106d25760405162461bcd60e51b815260040161057f90613df2565b5f83815260068601602090815260408083206001600160a01b038a16845290915281206106fe91613a2b565b5f61070884611df9565b5f85815260048801602090815260408083206001600160a01b038c16845290915290205460808201519192506001600160401b038085169261074d9290911690613e58565b6001600160401b0316146107735760405162461bcd60e51b815260040161057f90613e7f565b826001600160401b031681606001516001600160401b031610156107a95760405162461bcd60e51b815260040161057f90613ec2565b5f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c21b1790556001600160401b03821660808201526107f68482611ef4565b6040516001600160a01b0388169085907f132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564905f90a35050505050505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206144ee83398151915292919061089190613d1f565b90501180156108de575060015f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff1660058111156108dc576108dc613d0b565b145b6108fa5760405162461bcd60e51b815260040161057f90613f04565b5f83815260058201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613d51565b5f61095764e8d4a5100083613f75565b92915050565b5f6109576001600160401b03831664e8d4a51000613f88565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f805160206144ee8339815191529291906109d290613d1f565b9050118015610a1f575060035f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff166005811115610a1d57610a1d613d0b565b145b610a3b5760405162461bcd60e51b815260040161057f90613df2565b5f83815260068201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613d51565b8115610d98575f5f805160206144ee8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ae9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b109190810190613fcc565b9150915080610b735760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bda9190613ddb565b825114610c3e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057f565b60208201516001600160a01b031615610cb45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057f565b5f80610cc38460400151611fe3565b91509150818814610d305760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057f565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610da1836121bb565b505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f805160206144ee83398151915293926060830190600160c01b900460ff166005811115610e4557610e45613d0b565b6005811115610e5657610e56613d0b565b9052509050600281606001516005811115610e7357610e73613d0b565b14610ecf5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2044656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161057f565b600360608201908152426001600160401b0390811660408085019182525f8781526004870160209081528282203383528152919020855181549287015193518516600160801b0267ffffffffffffffff60801b19948616600160401b026001600160801b03199094169190951617919091179182168317815592518493929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836005811115610f8157610f81613d0b565b02179055509050505f610f9384611df9565b9050815f01516001600160401b031681608001516001600160401b03161015610fce5760405162461bcd60e51b815260040161057f90613e7f565b5f610ff285610fdc876124c8565b85516080860151610fed9190613e58565b612543565b5f8681526006860160209081526040808320338452909152902090915061101982826140e9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906110469085906004016141a4565b6020604051808303815f875af1158015611062573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110869190613ddb565b9050336001600160a01b031681877f2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2426040516110c591815260200190565b60405180910390a4505050505050565b5f8051602061450e8339815191525f6110ed83611a23565b90505f806110fe8360400151612760565b91509150806111605760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057f565b5f8281526005850160205260408120805461117a90613d1f565b90501180156111ac575060015f83815260078601602052604090205460ff1660058111156111aa576111aa613d0b565b145b6111c85760405162461bcd60e51b815260040161057f906141d6565b5f82815260058501602052604081206111e091613a2b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061450e8339815191529291906112d690613d1f565b9050118015611308575060015f83815260078301602052604090205460ff16600581111561130657611306613d0b565b145b6113245760405162461bcd60e51b815260040161057f906141d6565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161135d9190600401613d51565b6020604051808303815f875af1158015611379573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da19190613ddb565b5f6113a734612901565b90506113b48233836129ab565b5050565b5f805160206144ee8339815191525f6113d084611a23565b90505f805f6113e28460400151611bbe565b5f83815260058901602090815260408083206001600160a01b038d168452909152812080549497509295509093509161141a90613d1f565b9050118015611467575060015f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff16600581111561146557611465613d0b565b145b6114835760405162461bcd60e51b815260040161057f90613f04565b5f83815260058601602090815260408083206001600160a01b038a16845290915281206114af91613a2b565b5f6114b984611df9565b60808101515f86815260048901602090815260408083206001600160a01b038d1684529091529020549192506001600160401b03808516926114fc92911661421d565b6001600160401b0316146115225760405162461bcd60e51b815260040161057f90613e7f565b826001600160401b031681606001516001600160401b031610156115585760405162461bcd60e51b815260040161057f90613ec2565b6001600160401b03821660808201525f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c11b1790556115a58482611ef4565b5f84815260048701602090815260408083206001600160a01b038b16808552908352928190205481516001600160401b039091168152429281019290925286917f4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88910160405180910390a35050505050505050565b5f8061162534612901565b905061163385828686612ca6565b95945050505050565b5f5f8051602061450e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611697573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116be9190810190613fcc565b91509150806116df5760405162461bcd60e51b815260040161057f9061423d565b5f8415611763575f6116f484604001516130da565b919350909150506001600160401b0381161561175d5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161057f565b506117d9565b5f6117718460400151612760565b909250905080156117d75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057f565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561180a5761180a613d0b565b600581111561181b5761181b613d0b565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146118ac5760405162461bcd60e51b815260040161057f90614283565b5f6003825160058111156118c2576118c2613d0b565b14806118e057506002825160058111156118de576118de613d0b565b145b1561190357506020808201515f9081526008870190915260408120556004611907565b5060055b5f83815260078701602052604090208251815484929190829060ff1916600183600581111561193857611938613d0b565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b611a17613305565b611a2081613350565b50565b60408051606080820183525f8083526020830181905292820152905f8051602061450e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611a98573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611abf9190810190613fcc565b9150915080611ae05760405162461bcd60e51b815260040161057f9061423d565b8254825114611b435760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057f565b60208201516001600160a01b031615611bb65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057f565b509392505050565b5f805f8351603614611be25760405162461bcd60e51b815260040161057f906142cf565b5f805b6002811015611c3157611bf9816001614318565b611c04906008613f88565b61ffff16868281518110611c1a57611c1a61432b565b016020015160f81c901b9190911790600101611be5565b5061ffff811615611c545760405162461bcd60e51b815260040161057f9061433f565b5f805b6004811015611caf57611c6b816003614318565b611c76906008613f88565b63ffffffff1687611c88836002614382565b81518110611c9857611c9861432b565b016020015160f81c901b9190911790600101611c57565b5063ffffffff8116600314611cd65760405162461bcd60e51b815260040161057f90614395565b5f805b6020811015611d2b57611ced81601f614318565b611cf8906008613f88565b88611d04836006614382565b81518110611d1457611d1461432b565b016020015160f81c901b9190911790600101611cd9565b505f805b6008811015611d8a57611d43816007614318565b611d4e906008613f88565b6001600160401b031689611d63836026614382565b81518110611d7357611d7361432b565b016020015160f81c901b9190911790600101611d2f565b505f805b6008811015611de957611da2816007614318565b611dad906008613f88565b6001600160401b03168a611dc283602e614382565b81518110611dd257611dd261432b565b016020015160f81c901b9190911790600101611d8e565b5091989097509095509350505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061454e83398151915290528390208351918201909352825491925f8051602061450e83398151915292829060ff166005811115611e7957611e79613d0b565b6005811115611e8a57611e8a613d0b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061454e83398151915260205260409020815181545f8051602061450e8339815191529284929091829060ff19166001836005811115611f3e57611f3e613d0b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f808251602e146120065760405162461bcd60e51b815260040161057f906142cf565b5f805b60028110156120555761201d816001614318565b612028906008613f88565b61ffff1685828151811061203e5761203e61432b565b016020015160f81c901b9190911790600101612009565b5061ffff8116156120785760405162461bcd60e51b815260040161057f9061433f565b5f805b60048110156120d35761208f816003614318565b61209a906008613f88565b63ffffffff16866120ac836002614382565b815181106120bc576120bc61432b565b016020015160f81c901b919091179060010161207b565b5063ffffffff81166004146120fa5760405162461bcd60e51b815260040161057f90614395565b5f805b602081101561214f5761211181601f614318565b61211c906008613f88565b87612128836006614382565b815181106121385761213861432b565b016020015160f81c901b91909117906001016120fd565b505f805b60088110156121ae57612167816007614318565b612172906008613f88565b6001600160401b031688612187836026614382565b815181106121975761219761432b565b016020015160f81c901b9190911790600101612153565b5090969095509350505050565b5f8181525f8051602061454e8339815191526020526040808220815160e0810190925280545f8051602061450e83398151915293929190829060ff16600581111561220857612208613d0b565b600581111561221957612219613d0b565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561229357612293613d0b565b146122b05760405162461bcd60e51b815260040161057f906143dc565b60408101516001600160a01b0316336001600160a01b0316146122e55760405162461bcd60e51b815260040161057f90614283565b6122f28160800151613393565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561233657612336613d0b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6123ea846123e4816124c8565b5f612543565b5f858152600685016020526040902090915061240682826140e9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124339085906004016141a4565b6020604051808303815f875af115801561244f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124739190613ddb565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f8051602061454e8339815191526020526040812060020180545f8051602061450e83398151915291600160a01b9091046001600160401b0316908190601461251483614422565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156125bc5761257c816001614318565b612587906008613f88565b5081515f9083908390811061259e5761259e61432b565b60200101906001600160f81b03191690815f1a905350600101612568565b505f5b600481101561261f576125d3816003614318565b6125de906008613f88565b6001901c60f81b826125f1836002614382565b815181106126015761260161432b565b60200101906001600160f81b03191690815f1a9053506001016125bf565b505f5b60208110156126815761263681601f614318565b612641906008613f88565b86901c60f81b82612653836006614382565b815181106126635761266361432b565b60200101906001600160f81b03191690815f1a905350600101612622565b505f5b60088110156126ec57612698816007614318565b6126a3906008613f88565b6001600160401b038616901c60f81b826126be836026614382565b815181106126ce576126ce61432b565b60200101906001600160f81b03191690815f1a905350600101612684565b505f5b600881101561275757612703816007614318565b61270e906008613f88565b6001600160401b038516901c60f81b8261272983602e614382565b815181106127395761273961432b565b60200101906001600160f81b03191690815f1a9053506001016126ef565b50949350505050565b5f8082516027146127835760405162461bcd60e51b815260040161057f906142cf565b5f805b60028110156127d25761279a816001614318565b6127a5906008613f88565b61ffff168582815181106127bb576127bb61432b565b016020015160f81c901b9190911790600101612786565b5061ffff8116156127f55760405162461bcd60e51b815260040161057f9061433f565b5f805b60048110156128505761280c816003614318565b612817906008613f88565b63ffffffff1686612829836002614382565b815181106128395761283961432b565b016020015160f81c901b91909117906001016127f8565b5063ffffffff81166002146128775760405162461bcd60e51b815260040161057f90614395565b5f805b60208110156128cc5761288e81601f614318565b612899906008613f88565b876128a5836006614382565b815181106128b5576128b561432b565b016020015160f81c901b919091179060010161287a565b505f866026815181106128e1576128e161432b565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206144ee833981519152828261291b82610947565b83549091506001600160401b0382161080159061294557508260010154816001600160401b031611155b6129a35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161057f565b949350505050565b6129b3613534565b5f805160206144ee8339815191525f6129cb85611df9565b90506002815160058111156129e2576129e2613d0b565b146129ff5760405162461bcd60e51b815260040161057f906143dc565b5f85815260048301602090815260408083206001600160a01b03881684529091529020546001600160401b031615612a905760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2044656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161057f565b612a9983613393565b5f612ab786612aa7886124c8565b868560800151610fed919061421d565b5f87815260058501602090815260408083206001600160a01b038a1684529091529020909150612ae782826140e9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b149085906004016141a4565b6020604051808303815f875af1158015612b30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b549190613ddb565b604080516080810182526001600160401b038089168252421660208201525f9181019190915290915060608101600190525f88815260048601602090815260408083206001600160a01b038b1684528252918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836005811115612c3557612c35613d0b565b021790555050604080516001600160401b03881681524260208201526001600160a01b038916925083918a917ff8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16910160405180910390a450505050610da160015f8051602061452e83398151915255565b5f612caf613534565b5f8051602061450e833981519152426001600160401b038516118015612ce957506001600160401b038416612ce7426202a300614382565b115b612d4b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161057f565b85612da25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161057f565b5f86815260088201602052604090205415612e105760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057f565b8251603014612e775760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057f565b612e8085613393565b5f80612ec76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061357e565b5f82815260058601602052604090209193509150612ee582826140e9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f129085906004016141a4565b6020604051808303815f875af1158015612f2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f529190613ddb565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612fcb57612fcb613d0b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055613074836124c8565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506129a360015f8051602061452e83398151915255565b5f805f83516036146130fe5760405162461bcd60e51b815260040161057f906142cf565b5f805b600281101561314d57613115816001614318565b613120906008613f88565b61ffff168682815181106131365761313661432b565b016020015160f81c901b9190911790600101613101565b5061ffff8116156131705760405162461bcd60e51b815260040161057f9061433f565b5f805b60048110156131cb57613187816003614318565b613192906008613f88565b63ffffffff16876131a4836002614382565b815181106131b4576131b461432b565b016020015160f81c901b9190911790600101613173565b5063ffffffff81166001146131f25760405162461bcd60e51b815260040161057f90614395565b5f805b60208110156132475761320981601f614318565b613214906008613f88565b88613220836006614382565b815181106132305761323061432b565b016020015160f81c901b91909117906001016131f5565b505f805b60088110156132a65761325f816007614318565b61326a906008613f88565b6001600160401b03168961327f836026614382565b8151811061328f5761328f61432b565b016020015160f81c901b919091179060010161324b565b505f805b6008811015611de9576132be816007614318565b6132c9906008613f88565b6001600160401b03168a6132de83602e614382565b815181106132ee576132ee61432b565b016020015160f81c901b91909117906001016132aa565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661334e57604051631afcd79f60e31b815260040160405180910390fd5b565b613358613305565b61336181613923565b611a206060820135608083013561337e60c0850160a08601613b3c565b61338e60e0860160c08701614447565b613944565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061450e8339815191529060ff165f036133d1575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906134199083614318565b10613435576001600160401b0384166040830152808252613454565b8382604001818151613447919061421d565b6001600160401b03169052505b5f82602001518360400151606461346b9190614462565b613475919061448d565b600285015490915060ff90811690821611156134f05760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161057f565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061452e83398151915280546001190161356557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061452e83398151915255565b5f60608260800151516030146135e85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561365f5761361f816001614318565b61362a906008613f88565b5081515f908390839081106136415761364161432b565b60200101906001600160f81b03191690815f1a90535060010161360b565b505f5b60048110156136bd57613676816003614318565b613681906008613f88565b505f8261368f836002614382565b8151811061369f5761369f61432b565b60200101906001600160f81b03191690815f1a905350600101613662565b505f5b602081101561371a57845181602081106136dc576136dc61432b565b1a60f81b826136ec836006614382565b815181106136fc576136fc61432b565b60200101906001600160f81b03191690815f1a9053506001016136c0565b505f5b602081101561377a578460200151816020811061373c5761373c61432b565b1a60f81b8261374c836026614382565b8151811061375c5761375c61432b565b60200101906001600160f81b03191690815f1a90535060010161371d565b505f5b60088110156137ee57613791816007614318565b61379c906008613f88565b60ff1685604001516001600160401b0316901c60f81b828260466137c09190614382565b815181106137d0576137d061432b565b60200101906001600160f81b03191690815f1a90535060010161377d565b505f5b603081101561385957846080015181815181106138105761381061432b565b01602001516001600160f81b0319168261382b83604e614382565b8151811061383b5761383b61432b565b60200101906001600160f81b03191690815f1a9053506001016137f1565b505f5b60088110156138cb57613870816007614318565b61387b906008613f88565b60608601516001600160401b0390811691161c60f81b8261389d83607e614382565b815181106138ad576138ad61432b565b60200101906001600160f81b03191690815f1a90535060010161385c565b506002816040516138dc91906144b2565b602060405180830381855afa1580156138f7573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061391a9190613ddb565b94909350915050565b61392b613305565b61393361399f565b61393b6139af565b611a20816139b7565b61394c613305565b5f5f805160206144ee833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6139a7613305565b61334e613a23565b61334e613305565b6139bf613305565b80355f8051602061450e83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a0960608301604084016144cd565b600291909101805460ff191660ff90921691909117905550565b61356b613305565b508054613a3790613d1f565b5f825580601f10613a46575050565b601f0160209004905f5260205f2090810190611a2091905b80821115613a71575f8155600101613a5e565b5090565b5f60e08284031215613a85575f80fd5b50919050565b5f60208284031215613a9b575f80fd5b5035919050565b803563ffffffff81168114613ab5575f80fd5b919050565b6001600160a01b0381168114611a20575f80fd5b5f8060408385031215613adf575f80fd5b613ae883613aa2565b91506020830135613af881613aba565b809150509250929050565b5f8060408385031215613b14575f80fd5b823591506020830135613af881613aba565b80356001600160401b0381168114613ab5575f80fd5b5f60208284031215613b4c575f80fd5b613b5582613b26565b9392505050565b8015158114611a20575f80fd5b5f805f60608486031215613b7b575f80fd5b833592506020840135613b8d81613b5c565b9150613b9b60408501613aa2565b90509250925092565b5f60208284031215613bb4575f80fd5b613b5582613aa2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bf357613bf3613bbd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c2157613c21613bbd565b604052919050565b5f6001600160401b03821115613c4157613c41613bbd565b50601f01601f191660200190565b5f805f60608486031215613c61575f80fd5b83359250613c7160208501613b26565b915060408401356001600160401b03811115613c8b575f80fd5b8401601f81018613613c9b575f80fd5b8035613cae613ca982613c29565b613bf9565b818152876020838501011115613cc2575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215613cf2575f80fd5b613cfb83613aa2565b91506020830135613af881613b5c565b634e487b7160e01b5f52602160045260245ffd5b600181811c90821680613d3357607f821691505b602082108103613a8557634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454613d6381613d1f565b806020870152604060018084165f8114613d845760018114613da057613dcd565b60ff19851660408a0152604084151560051b8a01019550613dcd565b895f5260205f205f5b85811015613dc45781548b8201860152908301908801613da9565b8a016040019650505b509398975050505050505050565b5f60208284031215613deb575f80fd5b5051919050565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f722072604082015271656d6f76616c206e6f742070656e64696e6760701b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e7857613e78613e44565b5092915050565b60208082526023908201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960408201526219da1d60ea1b606082015260800190565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20496e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526037908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f72207260408201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82613f8357613f83613f61565b500490565b808202811582820484141761095757610957613e44565b5f5b83811015613fb9578181015183820152602001613fa1565b50505f910152565b8051613ab581613b5c565b5f8060408385031215613fdd575f80fd5b82516001600160401b0380821115613ff3575f80fd5b9084019060608287031215614006575f80fd5b61400e613bd1565b8251815260208084015161402181613aba565b82820152604084015183811115614036575f80fd5b80850194505087601f85011261404a575f80fd5b8351925061405a613ca984613c29565b838152888285870101111561406d575f80fd5b61407c84838301848801613f9f565b80604084015250819550614091818801613fc1565b9450505050509250929050565b601f821115610da157805f5260205f20601f840160051c810160208510156140c35750805b601f840160051c820191505b818110156140e2575f81556001016140cf565b5050505050565b81516001600160401b0381111561410257614102613bbd565b614116816141108454613d1f565b8461409e565b602080601f831160018114614149575f84156141325750858301515b5f19600386901b1c1916600185901b17855561040e565b5f85815260208120601f198616915b8281101561417757888601518255948401946001909101908401614158565b508582101561419457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f82518060208401526141c2816040850160208701613f9f565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160401b03818116838216019080821115613e7857613e78613e44565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561095757610957613e44565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561095757610957613e44565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361443d5761443d613e44565b6001019392505050565b5f60208284031215614457575f80fd5b8135613b5581613aba565b6001600160401b0381811683821602808216919082811461448557614485613e44565b505092915050565b5f6001600160401b03808416806144a6576144a6613f61565b92169190910492915050565b5f82516144c3818460208701613f9f565b9190910192915050565b5f602082840312156144dd575f80fd5b813560ff81168114613b55575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"validatorWeight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516146d03803806146d083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145838061014d5f395ff3fe6080604052600436106100ee575f3560e01c8063927e7e7511610087578063c599e24f11610057578063c599e24f146102a6578063d61bed74146102b9578063f40797d7146102d8578063fdf94a1a146102eb575f80fd5b8063927e7e7514610217578063a3a65e4814610236578063b771b3bc14610255578063bee0a03f14610287575f80fd5b80632e2194d8116100c25780632e2194d81461017057806362065856146101ac5780636a7e3d83146101d957806376f78621146101f8575f80fd5b8062e41792146100f25780630322ed98146101135780630915204e146101325780630b77f69314610151575b5f80fd5b3480156100fd575f80fd5b5061011161010c366004613a7e565b61030a565b005b34801561011e575f80fd5b5061011161012d366004613a94565b610416565b34801561013d575f80fd5b5061011161014c366004613ad7565b610607565b34801561015c575f80fd5b5061011161016b366004613b0c565b61084a565b34801561017b575f80fd5b5061018f61018a366004613a94565b61095c565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101b7575f80fd5b506101cb6101c6366004613b45565b610972565b6040519081526020016101a3565b3480156101e4575f80fd5b506101116101f3366004613b0c565b61098b565b348015610203575f80fd5b50610111610212366004613b72565b610a9d565b348015610222575f80fd5b50610111610231366004613a94565b610dbb565b348015610241575f80fd5b50610111610250366004613bad565b6110ea565b348015610260575f80fd5b5061026f6005600160991b0181565b6040516001600160a01b0390911681526020016101a3565b348015610292575f80fd5b506101116102a1366004613a94565b6112a3565b6101116102b4366004613a94565b6113b2565b3480156102c4575f80fd5b506101116102d3366004613ad7565b6113c8565b6101cb6102e6366004613c58565b611626565b3480156102f6575f80fd5b50610111610305366004613cea565b611648565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561034e5750825b90505f826001600160401b031660011480156103695750303b155b905081158015610377575080155b156103955760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103bf57845460ff60401b1916600160401b1785555b6103c886611a1b565b831561040e57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181525f805160206145578339815191526020526040808220815160e0810190925280545f8051602061451783398151915293929190829060ff16600581111561046357610463613d14565b600581111561047457610474613d14565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916104fe90613d28565b905011801561051f575060038151600581111561051d5761051d613d14565b145b6105885760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613d5a565b6020604051808303815f875af11580156105dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106019190613de4565b50505050565b5f805160206144f78339815191525f61061f84611a2c565b90505f805f6106318460400151611bc7565b5f83815260068901602090815260408083206001600160a01b038d168452909152812080549497509295509093509161066990613d28565b90501180156106b6575060035f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff1660058111156106b4576106b4613d14565b145b6106d25760405162461bcd60e51b815260040161057f90613dfb565b5f83815260068601602090815260408083206001600160a01b038a16845290915281206106fe91613a34565b5f61070884611e02565b5f85815260048801602090815260408083206001600160a01b038c16845290915290205460808201519192506001600160401b038085169261074d9290911690613e61565b6001600160401b0316146107735760405162461bcd60e51b815260040161057f90613e88565b826001600160401b031681606001516001600160401b031610156107a95760405162461bcd60e51b815260040161057f90613ecb565b5f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c21b1790556001600160401b03821660808201526107f68482611efd565b6040516001600160401b03831681526001600160a01b0388169085907fe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513906020015b60405180910390a35050505050505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206144f78339815191529291906108a690613d28565b90501180156108f3575060015f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff1660058111156108f1576108f1613d14565b145b61090f5760405162461bcd60e51b815260040161057f90613f0d565b5f83815260058201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613d5a565b5f61096c64e8d4a5100083613f7e565b92915050565b5f61096c6001600160401b03831664e8d4a51000613f91565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f805160206144f78339815191529291906109e790613d28565b9050118015610a34575060035f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff166005811115610a3257610a32613d14565b145b610a505760405162461bcd60e51b815260040161057f90613dfb565b5f83815260068201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613d5a565b8115610dad575f5f805160206144f78339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610afe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b259190810190613fd5565b9150915080610b885760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bef9190613de4565b825114610c535760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057f565b60208201516001600160a01b031615610cc95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057f565b5f80610cd88460400151611fec565b91509150818814610d455760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057f565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610db6836121c4565b505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f805160206144f783398151915293926060830190600160c01b900460ff166005811115610e5a57610e5a613d14565b6005811115610e6b57610e6b613d14565b9052509050600281606001516005811115610e8857610e88613d14565b14610ee45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2044656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161057f565b600360608201908152426001600160401b0390811660408085019182525f8781526004870160209081528282203383528152919020855181549287015193518516600160801b0267ffffffffffffffff60801b19948616600160401b026001600160801b03199094169190951617919091179182168317815592518493929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836005811115610f9657610f96613d14565b02179055509050505f610fa884611e02565b9050815f01516001600160401b031681608001516001600160401b03161015610fe35760405162461bcd60e51b815260040161057f90613e88565b5f61100785610ff1876124d1565b855160808601516110029190613e61565b61254c565b5f8681526006860160209081526040808320338452909152902090915061102e82826140f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061105b9085906004016141ad565b6020604051808303815f875af1158015611077573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109b9190613de4565b9050336001600160a01b031681877f2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2426040516110da91815260200190565b60405180910390a4505050505050565b5f805160206145178339815191525f61110283611a2c565b90505f806111138360400151612769565b91509150806111755760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057f565b5f8281526005850160205260408120805461118f90613d28565b90501180156111c1575060015f83815260078601602052604090205460ff1660058111156111bf576111bf613d14565b145b6111dd5760405162461bcd60e51b815260040161057f906141df565b5f82815260058501602052604081206111f591613a34565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145178339815191529291906112eb90613d28565b905011801561131d575060015f83815260078301602052604090205460ff16600581111561131b5761131b613d14565b145b6113395760405162461bcd60e51b815260040161057f906141df565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916113729190600401613d5a565b6020604051808303815f875af115801561138e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db69190613de4565b6113c581336113c03461095c565b61290a565b50565b5f805160206144f78339815191525f6113e084611a2c565b90505f805f6113f28460400151611bc7565b5f83815260058901602090815260408083206001600160a01b038d168452909152812080549497509295509093509161142a90613d28565b9050118015611477575060015f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff16600581111561147557611475613d14565b145b6114935760405162461bcd60e51b815260040161057f90613f0d565b5f83815260058601602090815260408083206001600160a01b038a16845290915281206114bf91613a34565b5f6114c984611e02565b60808101515f86815260048901602090815260408083206001600160a01b038d1684529091529020549192506001600160401b038085169261150c929116614226565b6001600160401b0316146115325760405162461bcd60e51b815260040161057f90613e88565b826001600160401b031681606001516001600160401b031610156115685760405162461bcd60e51b815260040161057f90613ecb565b6001600160401b03821660808201525f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c11b1790556115b58482611efd565b5f84815260048701602090815260408083206001600160a01b038b16808552908352928190205481516001600160401b03918216815290861692810192909252429082015285907fa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a390606001610838565b5f8061163134612c05565b905061163f85828686612caf565b95945050505050565b5f5f805160206145178339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156116a3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116ca9190810190613fd5565b91509150806116eb5760405162461bcd60e51b815260040161057f90614246565b5f841561176f575f61170084604001516130e3565b919350909150506001600160401b038116156117695760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161057f565b506117e5565b5f61177d8460400151612769565b909250905080156117e35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057f565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561181657611816613d14565b600581111561182757611827613d14565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146118b85760405162461bcd60e51b815260040161057f9061428c565b5f6003825160058111156118ce576118ce613d14565b14806118ec57506002825160058111156118ea576118ea613d14565b145b1561190f57506020808201515f9081526008870190915260408120556004611913565b5060055b5f83815260078701602052604090208251815484929190829060ff1916600183600581111561194457611944613d14565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b611a2361330e565b6113c581613359565b60408051606080820183525f8083526020830181905292820152905f805160206145178339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611aa1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ac89190810190613fd5565b9150915080611ae95760405162461bcd60e51b815260040161057f90614246565b8254825114611b4c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057f565b60208201516001600160a01b031615611bbf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057f565b509392505050565b5f805f8351603614611beb5760405162461bcd60e51b815260040161057f906142d8565b5f805b6002811015611c3a57611c02816001614321565b611c0d906008613f91565b61ffff16868281518110611c2357611c23614334565b016020015160f81c901b9190911790600101611bee565b5061ffff811615611c5d5760405162461bcd60e51b815260040161057f90614348565b5f805b6004811015611cb857611c74816003614321565b611c7f906008613f91565b63ffffffff1687611c9183600261438b565b81518110611ca157611ca1614334565b016020015160f81c901b9190911790600101611c60565b5063ffffffff8116600314611cdf5760405162461bcd60e51b815260040161057f9061439e565b5f805b6020811015611d3457611cf681601f614321565b611d01906008613f91565b88611d0d83600661438b565b81518110611d1d57611d1d614334565b016020015160f81c901b9190911790600101611ce2565b505f805b6008811015611d9357611d4c816007614321565b611d57906008613f91565b6001600160401b031689611d6c83602661438b565b81518110611d7c57611d7c614334565b016020015160f81c901b9190911790600101611d38565b505f805b6008811015611df257611dab816007614321565b611db6906008613f91565b6001600160401b03168a611dcb83602e61438b565b81518110611ddb57611ddb614334565b016020015160f81c901b9190911790600101611d97565b5091989097509095509350505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061455783398151915290528390208351918201909352825491925f8051602061451783398151915292829060ff166005811115611e8257611e82613d14565b6005811115611e9357611e93613d14565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061455783398151915260205260409020815181545f805160206145178339815191529284929091829060ff19166001836005811115611f4757611f47613d14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f808251602e1461200f5760405162461bcd60e51b815260040161057f906142d8565b5f805b600281101561205e57612026816001614321565b612031906008613f91565b61ffff1685828151811061204757612047614334565b016020015160f81c901b9190911790600101612012565b5061ffff8116156120815760405162461bcd60e51b815260040161057f90614348565b5f805b60048110156120dc57612098816003614321565b6120a3906008613f91565b63ffffffff16866120b583600261438b565b815181106120c5576120c5614334565b016020015160f81c901b9190911790600101612084565b5063ffffffff81166004146121035760405162461bcd60e51b815260040161057f9061439e565b5f805b60208110156121585761211a81601f614321565b612125906008613f91565b8761213183600661438b565b8151811061214157612141614334565b016020015160f81c901b9190911790600101612106565b505f805b60088110156121b757612170816007614321565b61217b906008613f91565b6001600160401b03168861219083602661438b565b815181106121a0576121a0614334565b016020015160f81c901b919091179060010161215c565b5090969095509350505050565b5f8181525f805160206145578339815191526020526040808220815160e0810190925280545f8051602061451783398151915293929190829060ff16600581111561221157612211613d14565b600581111561222257612222613d14565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561229c5761229c613d14565b146122b95760405162461bcd60e51b815260040161057f906143e5565b60408101516001600160a01b0316336001600160a01b0316146122ee5760405162461bcd60e51b815260040161057f9061428c565b6122fb816080015161339c565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561233f5761233f613d14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6123f3846123ed816124d1565b5f61254c565b5f858152600685016020526040902090915061240f82826140f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061243c9085906004016141ad565b6020604051808303815f875af1158015612458573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247c9190613de4565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f805160206145578339815191526020526040812060020180545f8051602061451783398151915291600160a01b9091046001600160401b0316908190601461251d8361442b565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156125c557612585816001614321565b612590906008613f91565b5081515f908390839081106125a7576125a7614334565b60200101906001600160f81b03191690815f1a905350600101612571565b505f5b6004811015612628576125dc816003614321565b6125e7906008613f91565b6001901c60f81b826125fa83600261438b565b8151811061260a5761260a614334565b60200101906001600160f81b03191690815f1a9053506001016125c8565b505f5b602081101561268a5761263f81601f614321565b61264a906008613f91565b86901c60f81b8261265c83600661438b565b8151811061266c5761266c614334565b60200101906001600160f81b03191690815f1a90535060010161262b565b505f5b60088110156126f5576126a1816007614321565b6126ac906008613f91565b6001600160401b038616901c60f81b826126c783602661438b565b815181106126d7576126d7614334565b60200101906001600160f81b03191690815f1a90535060010161268d565b505f5b60088110156127605761270c816007614321565b612717906008613f91565b6001600160401b038516901c60f81b8261273283602e61438b565b8151811061274257612742614334565b60200101906001600160f81b03191690815f1a9053506001016126f8565b50949350505050565b5f80825160271461278c5760405162461bcd60e51b815260040161057f906142d8565b5f805b60028110156127db576127a3816001614321565b6127ae906008613f91565b61ffff168582815181106127c4576127c4614334565b016020015160f81c901b919091179060010161278f565b5061ffff8116156127fe5760405162461bcd60e51b815260040161057f90614348565b5f805b600481101561285957612815816003614321565b612820906008613f91565b63ffffffff168661283283600261438b565b8151811061284257612842614334565b016020015160f81c901b9190911790600101612801565b5063ffffffff81166002146128805760405162461bcd60e51b815260040161057f9061439e565b5f805b60208110156128d55761289781601f614321565b6128a2906008613f91565b876128ae83600661438b565b815181106128be576128be614334565b016020015160f81c901b9190911790600101612883565b505f866026815181106128ea576128ea614334565b016020015191976001600160f81b03199092161515965090945050505050565b61291261353d565b5f805160206144f78339815191525f61292a85611e02565b905060028151600581111561294157612941613d14565b1461295e5760405162461bcd60e51b815260040161057f906143e5565b5f85815260048301602090815260408083206001600160a01b03881684529091529020546001600160401b0316156129ef5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2044656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161057f565b6129f88361339c565b5f612a1686612a06886124d1565b8685608001516110029190614226565b5f87815260058501602090815260408083206001600160a01b038a1684529091529020909150612a4682826140f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612a739085906004016141ad565b6020604051808303815f875af1158015612a8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ab39190613de4565b604080516080810182526001600160401b038089168252421660208201525f9181019190915290915060608101600190525f88815260048601602090815260408083206001600160a01b038b1684528252918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836005811115612b9457612b94613d14565b021790555050604080516001600160401b03881681524260208201526001600160a01b038916925083918a917ff8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16910160405180910390a450505050610db660015f8051602061453783398151915255565b5f5f805160206144f78339815191528282612c1f8261095c565b83549091506001600160401b03821610801590612c4957508260010154816001600160401b031611155b612ca75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161057f565b949350505050565b5f612cb861353d565b5f80516020614517833981519152426001600160401b038516118015612cf257506001600160401b038416612cf0426202a30061438b565b115b612d545760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161057f565b85612dab5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161057f565b5f86815260088201602052604090205415612e195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057f565b8251603014612e805760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057f565b612e898561339c565b5f80612ed06040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613587565b5f82815260058601602052604090209193509150612eee82826140f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f1b9085906004016141ad565b6020604051808303815f875af1158015612f37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f5b9190613de4565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612fd457612fd4613d14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561307d836124d1565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612ca760015f8051602061453783398151915255565b5f805f83516036146131075760405162461bcd60e51b815260040161057f906142d8565b5f805b60028110156131565761311e816001614321565b613129906008613f91565b61ffff1686828151811061313f5761313f614334565b016020015160f81c901b919091179060010161310a565b5061ffff8116156131795760405162461bcd60e51b815260040161057f90614348565b5f805b60048110156131d457613190816003614321565b61319b906008613f91565b63ffffffff16876131ad83600261438b565b815181106131bd576131bd614334565b016020015160f81c901b919091179060010161317c565b5063ffffffff81166001146131fb5760405162461bcd60e51b815260040161057f9061439e565b5f805b60208110156132505761321281601f614321565b61321d906008613f91565b8861322983600661438b565b8151811061323957613239614334565b016020015160f81c901b91909117906001016131fe565b505f805b60088110156132af57613268816007614321565b613273906008613f91565b6001600160401b03168961328883602661438b565b8151811061329857613298614334565b016020015160f81c901b9190911790600101613254565b505f805b6008811015611df2576132c7816007614321565b6132d2906008613f91565b6001600160401b03168a6132e783602e61438b565b815181106132f7576132f7614334565b016020015160f81c901b91909117906001016132b3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661335757604051631afcd79f60e31b815260040160405180910390fd5b565b61336161330e565b61336a8161392c565b6113c56060820135608083013561338760c0850160a08601613b45565b61339760e0860160c08701614450565b61394d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145178339815191529060ff165f036133da575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906134229083614321565b1061343e576001600160401b038416604083015280825261345d565b83826040018181516134509190614226565b6001600160401b03169052505b5f826020015183604001516064613474919061446b565b61347e9190614496565b600285015490915060ff90811690821611156134f95760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161057f565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061453783398151915280546001190161356e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061453783398151915255565b5f60608260800151516030146135f15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561366857613628816001614321565b613633906008613f91565b5081515f9083908390811061364a5761364a614334565b60200101906001600160f81b03191690815f1a905350600101613614565b505f5b60048110156136c65761367f816003614321565b61368a906008613f91565b505f8261369883600261438b565b815181106136a8576136a8614334565b60200101906001600160f81b03191690815f1a90535060010161366b565b505f5b602081101561372357845181602081106136e5576136e5614334565b1a60f81b826136f583600661438b565b8151811061370557613705614334565b60200101906001600160f81b03191690815f1a9053506001016136c9565b505f5b6020811015613783578460200151816020811061374557613745614334565b1a60f81b8261375583602661438b565b8151811061376557613765614334565b60200101906001600160f81b03191690815f1a905350600101613726565b505f5b60088110156137f75761379a816007614321565b6137a5906008613f91565b60ff1685604001516001600160401b0316901c60f81b828260466137c9919061438b565b815181106137d9576137d9614334565b60200101906001600160f81b03191690815f1a905350600101613786565b505f5b6030811015613862578460800151818151811061381957613819614334565b01602001516001600160f81b0319168261383483604e61438b565b8151811061384457613844614334565b60200101906001600160f81b03191690815f1a9053506001016137fa565b505f5b60088110156138d457613879816007614321565b613884906008613f91565b60608601516001600160401b0390811691161c60f81b826138a683607e61438b565b815181106138b6576138b6614334565b60200101906001600160f81b03191690815f1a905350600101613865565b506002816040516138e591906144bb565b602060405180830381855afa158015613900573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139239190613de4565b94909350915050565b61393461330e565b61393c6139a8565b6139446139b8565b6113c5816139c0565b61395561330e565b5f5f805160206144f7833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6139b061330e565b613357613a2c565b61335761330e565b6139c861330e565b80355f8051602061451783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a1260608301604084016144d6565b600291909101805460ff191660ff90921691909117905550565b61357461330e565b508054613a4090613d28565b5f825580601f10613a4f575050565b601f0160209004905f5260205f20908101906113c591905b80821115613a7a575f8155600101613a67565b5090565b5f60e08284031215613a8e575f80fd5b50919050565b5f60208284031215613aa4575f80fd5b5035919050565b803563ffffffff81168114613abe575f80fd5b919050565b6001600160a01b03811681146113c5575f80fd5b5f8060408385031215613ae8575f80fd5b613af183613aab565b91506020830135613b0181613ac3565b809150509250929050565b5f8060408385031215613b1d575f80fd5b823591506020830135613b0181613ac3565b80356001600160401b0381168114613abe575f80fd5b5f60208284031215613b55575f80fd5b613b5e82613b2f565b9392505050565b80151581146113c5575f80fd5b5f805f60608486031215613b84575f80fd5b833592506020840135613b9681613b65565b9150613ba460408501613aab565b90509250925092565b5f60208284031215613bbd575f80fd5b613b5e82613aab565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bfc57613bfc613bc6565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c2a57613c2a613bc6565b604052919050565b5f6001600160401b03821115613c4a57613c4a613bc6565b50601f01601f191660200190565b5f805f60608486031215613c6a575f80fd5b83359250613c7a60208501613b2f565b915060408401356001600160401b03811115613c94575f80fd5b8401601f81018613613ca4575f80fd5b8035613cb7613cb282613c32565b613c02565b818152876020838501011115613ccb575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215613cfb575f80fd5b613d0483613aab565b91506020830135613b0181613b65565b634e487b7160e01b5f52602160045260245ffd5b600181811c90821680613d3c57607f821691505b602082108103613a8e57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454613d6c81613d28565b806020870152604060018084165f8114613d8d5760018114613da957613dd6565b60ff19851660408a0152604084151560051b8a01019550613dd6565b895f5260205f205f5b85811015613dcd5781548b8201860152908301908801613db2565b8a016040019650505b509398975050505050505050565b5f60208284031215613df4575f80fd5b5051919050565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f722072604082015271656d6f76616c206e6f742070656e64696e6760701b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e8157613e81613e4d565b5092915050565b60208082526023908201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960408201526219da1d60ea1b606082015260800190565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20496e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526037908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f72207260408201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82613f8c57613f8c613f6a565b500490565b808202811582820484141761096c5761096c613e4d565b5f5b83811015613fc2578181015183820152602001613faa565b50505f910152565b8051613abe81613b65565b5f8060408385031215613fe6575f80fd5b82516001600160401b0380821115613ffc575f80fd5b908401906060828703121561400f575f80fd5b614017613bda565b8251815260208084015161402a81613ac3565b8282015260408401518381111561403f575f80fd5b80850194505087601f850112614053575f80fd5b83519250614063613cb284613c32565b8381528882858701011115614076575f80fd5b61408584838301848801613fa8565b8060408401525081955061409a818801613fca565b9450505050509250929050565b601f821115610db657805f5260205f20601f840160051c810160208510156140cc5750805b601f840160051c820191505b818110156140eb575f81556001016140d8565b5050505050565b81516001600160401b0381111561410b5761410b613bc6565b61411f816141198454613d28565b846140a7565b602080601f831160018114614152575f841561413b5750858301515b5f19600386901b1c1916600185901b17855561040e565b5f85815260208120601f198616915b8281101561418057888601518255948401946001909101908401614161565b508582101561419d57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f82518060208401526141cb816040850160208701613fa8565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160401b03818116838216019080821115613e8157613e81613e4d565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561096c5761096c613e4d565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561096c5761096c613e4d565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361444657614446613e4d565b6001019392505050565b5f60208284031215614460575f80fd5b8135613b5e81613ac3565b6001600160401b0381811683821602808216919082811461448e5761448e613e4d565b505092915050565b5f6001600160401b03808416806144af576144af613f6a565b92169190910492915050565b5f82516144cc818460208701613fa8565b9190910192915050565b5f602082840312156144e6575f80fd5b813560ff81168114613b5e575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -653,14 +653,15 @@ func (it *NativeTokenStakingManagerDelegationEndedIterator) Close() error { // NativeTokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegationEnded struct { - ValidationID [32]byte - Delegator common.Address - Raw types.Log // Blockchain specific contextual infos + ValidationID [32]byte + Delegator common.Address + ValidatorWeight *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0xe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator) +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegationEndedIterator, error) { var validationIDRule []interface{} @@ -679,9 +680,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg return &NativeTokenStakingManagerDelegationEndedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0xe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator) +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, validationID [][32]byte, delegator []common.Address) (event.Subscription, error) { var validationIDRule []interface{} @@ -725,9 +726,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x132714d2630bfd54138a97024125841cb8d933449c3f83b924a2f27cfdc6d564. +// ParseDelegationEnded is a log parse operation binding the contract event 0xe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator) +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { event := new(NativeTokenStakingManagerDelegationEnded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { @@ -970,16 +971,17 @@ func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Close() error { // NativeTokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegatorRegistered struct { - ValidationID [32]byte - Delegator common.Address - Weight *big.Int - StartTime *big.Int - Raw types.Log // Blockchain specific contextual infos + ValidationID [32]byte + Delegator common.Address + Weight *big.Int + ValidatorWeight *big.Int + StartTime *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88. +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0xa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a3. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 validatorWeight, uint256 startTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { var validationIDRule []interface{} @@ -998,9 +1000,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg return &NativeTokenStakingManagerDelegatorRegisteredIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil } -// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88. +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0xa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a3. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 validatorWeight, uint256 startTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegator []common.Address) (event.Subscription, error) { var validationIDRule []interface{} @@ -1044,9 +1046,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorRegistered is a log parse operation binding the contract event 0x4aec55d5f36e429e8ddb486dae8b26b7e4c4dafb842cf00cb5e3e48202862f88. +// ParseDelegatorRegistered is a log parse operation binding the contract event 0xa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a3. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 validatorWeight, uint256 startTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*NativeTokenStakingManagerDelegatorRegistered, error) { event := new(NativeTokenStakingManagerDelegatorRegistered) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 77eb5c9ba..9c2e3f112 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -120,8 +120,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Lock the stake in the contract. uint256 lockedValue = _lock(stakeAmount); - - // Ensure the stake churn doesn't exceed the maximum churn rate. uint64 weight = valueToWeight(lockedValue); // Ensure the weight is within the valid range. diff --git a/tests/flows/staking/erc20_delegation.go b/tests/flows/staking/erc20_delegation.go new file mode 100644 index 000000000..7fa8240ed --- /dev/null +++ b/tests/flows/staking/erc20_delegation.go @@ -0,0 +1,235 @@ +package staking + +import ( + "context" + "math/big" + + "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/crypto/bls" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/teleporter/tests/interfaces" + "github.com/ava-labs/teleporter/tests/utils" + . "github.com/onsi/gomega" +) + +/* + * Registers a delegator with an ERC20 token staking validator on a subnet. The steps are as follows: + * - Deploy the ERCTokenStakingManager + * - Register a validator + * - Register a delegator + * - Deleist the delegator + * + * TODO: as delegation gets built out, this test will need to be updated to cover: + * - Delegator rewards + * - Implicit delegation end at validation end + */ +func ERC20Delegation(network interfaces.LocalNetwork) { + // Get the subnets info + cChainInfo := network.GetPrimaryNetworkInfo() + subnetAInfo, _ := utils.GetTwoSubnets(network) + fundedAddress, fundedKey := network.GetFundedAccountInfo() + pChainInfo := utils.GetPChainInfo(cChainInfo) + + signatureAggregator := utils.NewSignatureAggregator( + cChainInfo.NodeURIs[0], + []ids.ID{ + subnetAInfo.SubnetID, + ids.Empty, // Primary network subnet ID + }, + ) + + // Deploy the staking manager contract + stakingManagerAddress, stakingManager, _, erc20 := utils.DeployAndInitializeERC20TokenStakingManager( + context.Background(), + fundedKey, + subnetAInfo, + pChainInfo, + ) + + // + // Register a validator + // + var validationID ids.ID // To be used in the delisting step + validatorStake := big.NewInt(1e18) + validatorWeight, err := stakingManager.ValueToWeight( + &bind.CallOpts{}, + validatorStake, + ) + Expect(err).Should(BeNil()) + { + // Initiate validator registration + nodeID := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} + var receipt *types.Receipt + receipt, validationID = utils.InitializeERC20ValidatorRegistration( + fundedKey, + subnetAInfo, + validatorStake, + erc20, + stakingManagerAddress, + nodeID, + blsPublicKey, + stakingManager, + ) + + // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + utils.ValidateRegisterSubnetValidatorMessage( + signedWarpMessage, + nodeID, + validatorWeight, + subnetAInfo.SubnetID, + blsPublicKey, + ) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( + validationID, + true, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CompleteERC20ValidatorRegistration( + fundedKey, + subnetAInfo, + stakingManagerAddress, + registrationSignedMessage, + ) + // Check that the validator is registered in the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + } + + // + // Register a delegator + // + { + delegatorStake := big.NewInt(1e17) + delegatorWeight, err := stakingManager.ValueToWeight( + &bind.CallOpts{}, + delegatorStake, + ) + Expect(err).Should(BeNil()) + newValidatorWeight := validatorWeight + delegatorWeight + + nonce := uint64(1) + + receipt := utils.InitializeERC20DelegatorRegistration( + fundedKey, + subnetAInfo, + validationID, + delegatorStake, + erc20, + stakingManagerAddress, + stakingManager, + ) + + // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + utils.ValidateSetSubnetValidatorWeightMessage( + signedWarpMessage, + validationID, + newValidatorWeight, + nonce, + ) + + // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + validationID, + nonce, + newValidatorWeight, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CompleteERC20DelegatorRegistration( + fundedKey, + fundedAddress, + subnetAInfo, + stakingManagerAddress, + registrationSignedMessage, + ) + // Check that the validator is registered in the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(registrationEvent.Delegator).Should(Equal(fundedAddress)) + } + // + // Delist the delegator + // + { + nonce := uint64(2) + receipt := utils.InitializeEndERC20Delegation( + fundedKey, + subnetAInfo, + stakingManager, + validationID, + ) + delegatorRemovalEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(delegatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(delegatorRemovalEvent.Delegator).Should(Equal(fundedAddress)) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + Expect(err).Should(BeNil()) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, validatorWeight, 2) + + // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain + signeMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + validationID, + nonce, + validatorWeight, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CompleteEndERC20Delegation( + fundedKey, + fundedAddress, + subnetAInfo, + stakingManagerAddress, + signeMessage, + ) + + // Check that the delegator has been delisted from the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegationEnded, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(registrationEvent.Delegator).Should(Equal(fundedAddress)) + } +} diff --git a/tests/flows/staking/erc20_token_staking.go b/tests/flows/staking/erc20_token_staking.go index 22880ed47..d3bbac70e 100644 --- a/tests/flows/staking/erc20_token_staking.go +++ b/tests/flows/staking/erc20_token_staking.go @@ -56,10 +56,10 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // Register a validator // var validationID ids.ID // To be used in the delisting step - stakeAmount := uint64(1e18) + stakeAmount := big.NewInt(1e18) weight, err := stakingManager.ValueToWeight( &bind.CallOpts{}, - big.NewInt(int64(stakeAmount)), + stakeAmount, ) Expect(err).Should(BeNil()) { @@ -141,7 +141,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 0) + utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 1) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index aa3f40879..f4ce82ec1 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -56,10 +56,10 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Register a validator // var validationID ids.ID // To be used in the delisting step - stakeAmount := uint64(1e18) + stakeAmount := big.NewInt(1e18) weight, err := stakingManager.ValueToWeight( &bind.CallOpts{}, - big.NewInt(int64(stakeAmount)), + stakeAmount, ) Expect(err).Should(BeNil()) { @@ -139,7 +139,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 0) + utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 1) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index ec9b5fe93..3eab00543 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -175,7 +175,7 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 0) + utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 1) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index 2d5a8c90e..b7d357c1a 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -212,4 +212,10 @@ var _ = ginkgo.Describe("[Teleporter integration tests]", func() { func() { staking.PoAValidatorManager(LocalNetworkInstance) }) + ginkgo.It("ERC20 delegation", + ginkgo.Label(validatorManagerLabel), + func() { + staking.ERC20Delegation(LocalNetworkInstance) + }, + ) }) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 5c998e18f..b552f5ac6 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -12,7 +12,6 @@ import ( warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/messages" warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" - "github.com/ava-labs/subnet-evm/accounts/abi" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/precompile/contracts/warp" @@ -201,14 +200,14 @@ func DeployAndInitializePoAValidatorManager( func InitializeNativeValidatorRegistration( senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, - stakeAmount uint64, + stakeAmount *big.Int, nodeID ids.ID, blsPublicKey [bls.PublicKeyLen]byte, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, ) (*types.Receipt, ids.ID) { opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) - opts.Value = big.NewInt(0).SetUint64(stakeAmount) + opts.Value = stakeAmount tx, err := stakingManager.InitializeValidatorRegistration( opts, @@ -229,7 +228,7 @@ func InitializeNativeValidatorRegistration( func InitializeERC20ValidatorRegistration( senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, - stakeAmount uint64, + stakeAmount *big.Int, token *exampleerc20.ExampleERC20, stakingManagerAddress common.Address, nodeID ids.ID, @@ -240,7 +239,7 @@ func InitializeERC20ValidatorRegistration( context.Background(), token, stakingManagerAddress, - big.NewInt(0).SetUint64(stakeAmount), + stakeAmount, subnet, senderKey, ) @@ -250,7 +249,7 @@ func InitializeERC20ValidatorRegistration( tx, err := stakingManager.InitializeValidatorRegistration( opts, - big.NewInt(0).SetUint64(stakeAmount), + stakeAmount, nodeID, uint64(time.Now().Add(24*time.Hour).Unix()), blsPublicKey[:], @@ -301,8 +300,10 @@ func CompleteNativeValidatorRegistration( ) *types.Receipt { abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - return completeValidatorRegistration( - abi, + callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, sendingKey, subnet, stakingManagerContractAddress, @@ -318,8 +319,10 @@ func CompleteERC20ValidatorRegistration( ) *types.Receipt { abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - return completeValidatorRegistration( - abi, + callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, sendingKey, subnet, stakingManagerContractAddress, @@ -335,8 +338,10 @@ func CompletePoAValidatorRegistration( ) *types.Receipt { abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - return completeValidatorRegistration( - abi, + callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, sendingKey, subnet, validatorManagerAddress, @@ -344,20 +349,19 @@ func CompletePoAValidatorRegistration( ) } -func completeValidatorRegistration( - abi *abi.ABI, +// Calls a method that retreived a signed Warp message from the transaction's access list +func CallWarpReceiver( + callData []byte, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, - stakingManagerContractAddress common.Address, - registrationSignedMessage *avalancheWarp.Message, + contract common.Address, + signedMessage *avalancheWarp.Message, ) *types.Receipt { - callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) - Expect(err).Should(BeNil()) gasFeeCap, gasTipCap, nonce := CalculateTxParams(context.Background(), subnet, PrivateKeyToAddress(sendingKey)) registrationTx := predicateutils.NewPredicateTx( subnet.EVMChainID, nonce, - &stakingManagerContractAddress, + &contract, 2_000_000, gasFeeCap, gasTipCap, @@ -365,7 +369,7 @@ func completeValidatorRegistration( callData, types.AccessList{}, warp.ContractAddress, - registrationSignedMessage.Bytes(), + signedMessage.Bytes(), ) signedRegistrationTx := SignTransaction(registrationTx, sendingKey, subnet.EVMChainID) return SendTransactionAndWaitForSuccess(context.Background(), subnet, signedRegistrationTx) @@ -431,8 +435,10 @@ func CompleteEndNativeValidation( ) *types.Receipt { abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - return callCompleteEndValidation( - abi, + callData, err := abi.Pack("completeEndValidation", uint32(0), false) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, sendingKey, subnet, stakingManagerContractAddress, @@ -448,8 +454,10 @@ func CompleteEndERC20Validation( ) *types.Receipt { abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - return callCompleteEndValidation( - abi, + callData, err := abi.Pack("completeEndValidation", uint32(0), false) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, sendingKey, subnet, stakingManagerContractAddress, @@ -465,8 +473,10 @@ func CompleteEndPoAValidation( ) *types.Receipt { abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - return callCompleteEndValidation( - abi, + callData, err := abi.Pack("completeEndValidation", uint32(0), false) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, sendingKey, subnet, validatorManagerAddress, @@ -474,31 +484,112 @@ func CompleteEndPoAValidation( ) } -func callCompleteEndValidation( - abi *abi.ABI, +func InitializeERC20DelegatorRegistration( + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + validationID ids.ID, + delegationAmount *big.Int, + token *exampleerc20.ExampleERC20, + stakingManagerAddress common.Address, + stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, +) *types.Receipt { + ERC20Approve( + context.Background(), + token, + stakingManagerAddress, + delegationAmount, + subnet, + senderKey, + ) + + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + + tx, err := stakingManager.InitializeDelegatorRegistration( + opts, + validationID, + delegationAmount, + ) + Expect(err).Should(BeNil()) + receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + _, err = GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorAdded, + ) + Expect(err).Should(BeNil()) + return receipt +} + +func CompleteERC20DelegatorRegistration( sendingKey *ecdsa.PrivateKey, + delegator common.Address, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, - registrationSignedMessage *avalancheWarp.Message, + signedMessage *avalancheWarp.Message, ) *types.Receipt { - callData, err := abi.Pack("completeEndValidation", uint32(0), false) + abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - gasFeeCap, gasTipCap, nonce := CalculateTxParams(context.Background(), subnet, PrivateKeyToAddress(sendingKey)) - registrationTx := predicateutils.NewPredicateTx( - subnet.EVMChainID, - nonce, - &stakingManagerContractAddress, - 2_000_000, - gasFeeCap, - gasTipCap, - big.NewInt(0), + callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegator) + Expect(err).Should(BeNil()) + return CallWarpReceiver( callData, - types.AccessList{}, - warp.ContractAddress, - registrationSignedMessage.Bytes(), + sendingKey, + subnet, + stakingManagerContractAddress, + signedMessage, ) - signedRegistrationTx := SignTransaction(registrationTx, sendingKey, subnet.EVMChainID) - return SendTransactionAndWaitForSuccess(context.Background(), subnet, signedRegistrationTx) +} + +func InitializeEndERC20Delegation( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, + validationID ids.ID, +) *types.Receipt { + opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := stakingManager.InitializeEndDelegation( + opts, + validationID, + ) + Expect(err).Should(BeNil()) + return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) +} + +func CompleteEndERC20Delegation( + sendingKey *ecdsa.PrivateKey, + delegator common.Address, + subnet interfaces.SubnetTestInfo, + stakingManagerContractAddress common.Address, + signedMessage *avalancheWarp.Message, +) *types.Receipt { + abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("completeEndDelegation", uint32(0), delegator) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, + sendingKey, + subnet, + stakingManagerContractAddress, + signedMessage, + ) +} + +func InitializeNativeDelegatorRegistration() *types.Receipt { + return nil +} + +func CompleteNativeDelegatorRegistration() *types.Receipt { + return nil +} + +func InitializeEndNativeDelegation() *types.Receipt { + return nil +} + +func CompleteEndNativeDelegation() *types.Receipt { + return nil } // @@ -534,6 +625,36 @@ func ConstructSubnetValidatorRegistrationMessage( return registrationSignedMessage } +func ConstructSubnetValidatorWeightUpdateMessage( + validationID ids.ID, + nonce uint64, + weight uint64, + subnet interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, +) *avalancheWarp.Message { + updatePayload, err := warpMessages.NewSubnetValidatorWeightUpdate(validationID, nonce, weight) + Expect(err).Should(BeNil()) + updateAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), updatePayload.Bytes()) + Expect(err).Should(BeNil()) + updateUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( + network.GetNetworkID(), + pChainInfo.BlockchainID, + updateAddressedCall.Bytes(), + ) + Expect(err).Should(BeNil()) + + updateSignedMessage, err := signatureAggregator.CreateSignedMessage( + updateUnsignedMessage, + nil, + subnet.SubnetID, + 67, + ) + Expect(err).Should(BeNil()) + return updateSignedMessage +} + // // Warp message validiation utils // These will be replaced by the actual implementation on the P-Chain in the future From 9c9db92917741b9cebef9e3d8e897f946c6f7cac Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 28 Aug 2024 14:32:55 -0500 Subject: [PATCH 148/545] native delegation e2e --- tests/flows/staking/erc20_delegation.go | 4 +- tests/flows/staking/native_delegation.go | 231 +++++++++++++++++++++++ tests/local/e2e_test.go | 8 +- tests/utils/staking.go | 81 +++++++- 4 files changed, 312 insertions(+), 12 deletions(-) create mode 100644 tests/flows/staking/native_delegation.go diff --git a/tests/flows/staking/erc20_delegation.go b/tests/flows/staking/erc20_delegation.go index 7fa8240ed..8ab39c331 100644 --- a/tests/flows/staking/erc20_delegation.go +++ b/tests/flows/staking/erc20_delegation.go @@ -204,7 +204,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, validatorWeight, 2) // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - signeMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( validationID, nonce, validatorWeight, @@ -220,7 +220,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { fundedAddress, subnetAInfo, stakingManagerAddress, - signeMessage, + signedMessage, ) // Check that the delegator has been delisted from the staking contract diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go new file mode 100644 index 000000000..a322f000d --- /dev/null +++ b/tests/flows/staking/native_delegation.go @@ -0,0 +1,231 @@ +package staking + +import ( + "context" + "math/big" + + "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/crypto/bls" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/teleporter/tests/interfaces" + "github.com/ava-labs/teleporter/tests/utils" + . "github.com/onsi/gomega" +) + +/* + * Registers a delegator with a native token staking validator on a subnet. The steps are as follows: + * - Deploy the NativeTokenStakingManager + * - Register a validator + * - Register a delegator + * - Deleist the delegator + * + * TODO: as delegation gets built out, this test will need to be updated to cover: + * - Delegator rewards + * - Implicit delegation end at validation end + */ +func NativeDelegation(network interfaces.LocalNetwork) { + // Get the subnets info + cChainInfo := network.GetPrimaryNetworkInfo() + subnetAInfo, _ := utils.GetTwoSubnets(network) + fundedAddress, fundedKey := network.GetFundedAccountInfo() + pChainInfo := utils.GetPChainInfo(cChainInfo) + + signatureAggregator := utils.NewSignatureAggregator( + cChainInfo.NodeURIs[0], + []ids.ID{ + subnetAInfo.SubnetID, + ids.Empty, // Primary network subnet ID + }, + ) + + // Deploy the staking manager contract + stakingManagerAddress, stakingManager := utils.DeployAndInitializeNativeTokenStakingManager( + context.Background(), + fundedKey, + subnetAInfo, + pChainInfo, + ) + + // + // Register a validator + // + var validationID ids.ID // To be used in the delisting step + validatorStake := big.NewInt(1e18) + validatorWeight, err := stakingManager.ValueToWeight( + &bind.CallOpts{}, + validatorStake, + ) + Expect(err).Should(BeNil()) + { + // Iniatiate validator registration + nodeID := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} + var receipt *types.Receipt + receipt, validationID = utils.InitializeNativeValidatorRegistration( + fundedKey, + subnetAInfo, + validatorStake, + nodeID, + blsPublicKey, + stakingManager, + ) + + // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + utils.ValidateRegisterSubnetValidatorMessage( + signedWarpMessage, + nodeID, + validatorWeight, + subnetAInfo.SubnetID, + blsPublicKey, + ) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( + validationID, + true, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CompleteNativeValidatorRegistration( + fundedKey, + subnetAInfo, + stakingManagerAddress, + registrationSignedMessage, + ) + // Check that the validator is registered in the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + } + // + // Register a delegator + // + { + delegatorStake := big.NewInt(1e17) + delegatorWeight, err := stakingManager.ValueToWeight( + &bind.CallOpts{}, + delegatorStake, + ) + Expect(err).Should(BeNil()) + newValidatorWeight := validatorWeight + delegatorWeight + + nonce := uint64(1) + + receipt := utils.InitializeNativeDelegatorRegistration( + fundedKey, + subnetAInfo, + validationID, + delegatorStake, + stakingManagerAddress, + stakingManager, + ) + + // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + utils.ValidateSetSubnetValidatorWeightMessage( + signedWarpMessage, + validationID, + newValidatorWeight, + nonce, + ) + + // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + validationID, + nonce, + newValidatorWeight, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CompleteNativeDelegatorRegistration( + fundedKey, + fundedAddress, + subnetAInfo, + stakingManagerAddress, + registrationSignedMessage, + ) + // Check that the validator is registered in the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(registrationEvent.Delegator).Should(Equal(fundedAddress)) + } + // + // Delist the delegator + // + { + nonce := uint64(2) + receipt := utils.InitializeEndNativeDelegation( + fundedKey, + subnetAInfo, + stakingManager, + validationID, + ) + delegatorRemovalEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(delegatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(delegatorRemovalEvent.Delegator).Should(Equal(fundedAddress)) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + Expect(err).Should(BeNil()) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, validatorWeight, 2) + + // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain + signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + validationID, + nonce, + validatorWeight, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CompleteEndNativeDelegation( + fundedKey, + fundedAddress, + subnetAInfo, + stakingManagerAddress, + signedMessage, + ) + + // Check that the delegator has been delisted from the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegationEnded, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(registrationEvent.Delegator).Should(Equal(fundedAddress)) + } +} diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index b7d357c1a..d02b3e922 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -216,6 +216,10 @@ var _ = ginkgo.Describe("[Teleporter integration tests]", func() { ginkgo.Label(validatorManagerLabel), func() { staking.ERC20Delegation(LocalNetworkInstance) - }, - ) + }) + ginkgo.It("Native token delegation", + ginkgo.Label(validatorManagerLabel), + func() { + staking.NativeDelegation(LocalNetworkInstance) + }) }) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index b552f5ac6..a855d4c16 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -576,20 +576,85 @@ func CompleteEndERC20Delegation( ) } -func InitializeNativeDelegatorRegistration() *types.Receipt { - return nil +func InitializeNativeDelegatorRegistration(senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + validationID ids.ID, + delegationAmount *big.Int, + stakingManagerAddress common.Address, + stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, +) *types.Receipt { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + opts.Value = delegationAmount + + tx, err := stakingManager.InitializeDelegatorRegistration( + opts, + validationID, + ) + Expect(err).Should(BeNil()) + receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + _, err = GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorAdded, + ) + Expect(err).Should(BeNil()) + return receipt } -func CompleteNativeDelegatorRegistration() *types.Receipt { - return nil +func CompleteNativeDelegatorRegistration( + sendingKey *ecdsa.PrivateKey, + delegator common.Address, + subnet interfaces.SubnetTestInfo, + stakingManagerContractAddress common.Address, + signedMessage *avalancheWarp.Message, +) *types.Receipt { + abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegator) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, + sendingKey, + subnet, + stakingManagerContractAddress, + signedMessage, + ) } -func InitializeEndNativeDelegation() *types.Receipt { - return nil +func InitializeEndNativeDelegation( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, + validationID ids.ID, +) *types.Receipt { + opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := stakingManager.InitializeEndDelegation( + opts, + validationID, + ) + Expect(err).Should(BeNil()) + return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) } -func CompleteEndNativeDelegation() *types.Receipt { - return nil +func CompleteEndNativeDelegation( + sendingKey *ecdsa.PrivateKey, + delegator common.Address, + subnet interfaces.SubnetTestInfo, + stakingManagerContractAddress common.Address, + signedMessage *avalancheWarp.Message, +) *types.Receipt { + abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("completeEndDelegation", uint32(0), delegator) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, + sendingKey, + subnet, + stakingManagerContractAddress, + signedMessage, + ) } // From 30aa52e31fc90fb7ef4a3fc130fccaf007dd8a6c Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 28 Aug 2024 16:10:19 -0500 Subject: [PATCH 149/545] restrict status & emit in event --- contracts/staking/ValidatorManager.sol | 14 +++++++---- .../staking/interfaces/IValidatorManager.sol | 2 +- .../staking/tests/ValidatorManagerTests.t.sol | 24 +++++++++++++++++-- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 43b230a45..2b451f847 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -290,12 +290,16 @@ abstract contract ValidatorManager is ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); require(!validRegistration, "ValidatorManager: Registration still valid"); - // The validation status is PendingRemoved if validator removal was initiated with a call to initiateEndValidation. - // The validation status is PendingAdded if the validator was never registered on the P-Chain. - // All other statuses are unexpected, but we defensively allow them to specify the validation period as invalidated, - // as long as a valid SubnetValidatorRegistration message from the P-Chain is received. + Validator memory validator = $._validationPeriods[validationID]; ValidatorStatus endStatus; + + // The validation status is PendingRemoved if validator removal was initiated with a call to initiateEndValidation. + // The validation status is PendingAdded if the validator was never registered on the P-Chain. + require(validator.status == ValidatorStatus.PendingRemoved || + validator.status == ValidatorStatus.PendingAdded, + "ValidatorManager: Invalid validator status"); + if (validator.status == ValidatorStatus.PendingRemoved) { endStatus = ValidatorStatus.Completed; } else { @@ -313,7 +317,7 @@ abstract contract ValidatorManager is // Calculate the reward for the validator. // Emit event. - emit ValidationPeriodEnded(validationID); + emit ValidationPeriodEnded(validationID, validator.status); } /** diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 150f28df8..9de74acc2 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -76,7 +76,7 @@ interface IValidatorManager { * This is done by calling {completeEndValidation}, which provides proof from the P-Chain that the * validation period is not active and will never be active in the future. */ - event ValidationPeriodEnded(bytes32 indexed validationID); + event ValidationPeriodEnded(bytes32 indexed validationID, ValidatorStatus indexed status); /** * @notice Resubmits a validator registration message to be sent to P-Chain to the Warp precompile. diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 6392fd5c0..80af4cdfa 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -8,6 +8,7 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {ValidatorManager} from "../ValidatorManager.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; +import {ValidatorStatus} from "../interfaces/IValidatorManager.sol"; import { WarpMessage, IWarpMessenger @@ -59,7 +60,7 @@ abstract contract ValidatorManagerTest is Test { uint256 endTime ); - event ValidationPeriodEnded(bytes32 indexed validationID); + event ValidationPeriodEnded(bytes32 indexed validationID, ValidatorStatus indexed status); function testInitializeValidatorRegistrationSuccess() public { _setUpInitializeValidatorRegistration( @@ -172,7 +173,26 @@ abstract contract ValidatorManagerTest is Test { _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidationPeriodEnded(validationID); + emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); + + validatorManager.completeEndValidation(0); + } + + function testCompleteInvalidatedValidation() public { + bytes32 validationID = _setUpInitializeValidatorRegistration( + DEFAULT_NODE_ID, + DEFAULT_SUBNET_ID, + DEFAULT_WEIGHT, + DEFAULT_EXPIRY, + DEFAULT_BLS_PUBLIC_KEY + ); + bytes memory subnetValidatorRegistrationMessage = + ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); + + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit ValidationPeriodEnded(validationID, ValidatorStatus.Invalidated); validatorManager.completeEndValidation(0); } From 9b396e9a730a094975a284e0b49208782f7d57fc Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 28 Aug 2024 16:15:23 -0500 Subject: [PATCH 150/545] lower case error messages --- contracts/staking/PoSValidatorManager.sol | 2 +- contracts/staking/ValidatorManager.sol | 38 +++++++++++------------ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 3eab710e4..a9e663fb1 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -115,7 +115,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( weight >= $._minimumStakeAmount && weight <= $._maximumStakeAmount, - "PoSValidatorManager: Invalid stake amount" + "PoSValidatorManager: invalid stake amount" ); return weight; } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 2b451f847..4c2ba694e 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -109,15 +109,15 @@ abstract contract ValidatorManager is // Ensure the registration expiry is in a valid range. require( registrationExpiry > block.timestamp && block.timestamp + 2 days > registrationExpiry, - "ValidatorManager: Invalid registration expiry" + "ValidatorManager: invalid registration expiry" ); // Ensure the nodeID is not the zero address, and is not already an active validator. - require(nodeID != bytes32(0), "ValidatorManager: Invalid node ID"); + require(nodeID != bytes32(0), "ValidatorManager: invalid node ID"); require( - $._activeValidators[nodeID] == bytes32(0), "ValidatorManager: Node ID already active" + $._activeValidators[nodeID] == bytes32(0), "ValidatorManager: node ID already active" ); - require(blsPublicKey.length == 48, "ValidatorManager: Invalid blsPublicKey length"); + require(blsPublicKey.length == 48, "ValidatorManager: invalid blsPublicKey length"); _checkAndUpdateChurnTracker(weight); @@ -159,7 +159,7 @@ abstract contract ValidatorManager is require( $._pendingRegisterValidationMessages[validationID].length > 0 && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, - "ValidatorManager: Invalid validation ID" + "ValidatorManager: invalid validation ID" ); // Submit the message to the Warp precompile. @@ -175,24 +175,24 @@ abstract contract ValidatorManager is ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "ValidatorManager: Invalid warp message"); + require(valid, "ValidatorManager: invalid warp message"); require( warpMessage.sourceChainID == $._pChainBlockchainID, - "ValidatorManager: Invalid source chain ID" + "ValidatorManager: invalid source chain ID" ); require( warpMessage.originSenderAddress == address(0), - "ValidatorManager: Invalid origin sender address" + "ValidatorManager: invalid origin sender address" ); (bytes32 validationID, bool validRegistration) = ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); - require(validRegistration, "ValidatorManager: Registration not valid"); + require(validRegistration, "ValidatorManager: registration not valid"); require( $._pendingRegisterValidationMessages[validationID].length > 0 && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, - "ValidatorManager: Invalid validation ID" + "ValidatorManager: invalid validation ID" ); delete $._pendingRegisterValidationMessages[validationID]; @@ -216,9 +216,9 @@ abstract contract ValidatorManager is // Ensure the validation period is active. Validator memory validator = $._validationPeriods[validationID]; require( - validator.status == ValidatorStatus.Active, "ValidatorManager: Validator not active" + validator.status == ValidatorStatus.Active, "ValidatorManager: validator not active" ); - require(_msgSender() == validator.owner, "ValidatorManager: Sender not validator owner"); + require(_msgSender() == validator.owner, "ValidatorManager: sender not validator owner"); // Check that removing this validator would not exceed the maximum churn rate. _checkAndUpdateChurnTracker(validator.weight); @@ -255,7 +255,7 @@ abstract contract ValidatorManager is require( validator.status == ValidatorStatus.PendingRemoved, - "ValidatorManager: Validator not pending removal" + "ValidatorManager: validator not pending removal" ); bytes memory setValidatorWeightPayload = ValidatorMessages @@ -276,19 +276,19 @@ abstract contract ValidatorManager is // Get the Warp message. (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "ValidatorManager: Invalid warp message"); + require(valid, "ValidatorManager: invalid warp message"); require( warpMessage.sourceChainID == $._pChainBlockchainID, - "ValidatorManager: Invalid source chain ID" + "ValidatorManager: invalid source chain ID" ); require( warpMessage.originSenderAddress == address(0), - "ValidatorManager: Invalid origin sender address" + "ValidatorManager: invalid origin sender address" ); (bytes32 validationID, bool validRegistration) = ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); - require(!validRegistration, "ValidatorManager: Registration still valid"); + require(!validRegistration, "ValidatorManager: registration still valid"); Validator memory validator = $._validationPeriods[validationID]; @@ -298,7 +298,7 @@ abstract contract ValidatorManager is // The validation status is PendingAdded if the validator was never registered on the P-Chain. require(validator.status == ValidatorStatus.PendingRemoved || validator.status == ValidatorStatus.PendingAdded, - "ValidatorManager: Invalid validator status"); + "ValidatorManager: invalid validator status"); if (validator.status == ValidatorStatus.PendingRemoved) { endStatus = ValidatorStatus.Completed; @@ -344,7 +344,7 @@ abstract contract ValidatorManager is uint8 churnPercentage = uint8((churnTracker.churnAmount * 100) / churnTracker.initialStake); require( churnPercentage <= $._maximumHourlyChurn, - "ValidatorManager: Maximum hourly churn rate exceeded" + "ValidatorManager: maximum hourly churn rate exceeded" ); $._churnTracker = churnTracker; } From d570975476e13c21bcbc8d399e068b501c290605 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 28 Aug 2024 16:17:36 -0500 Subject: [PATCH 151/545] lower case error messages --- contracts/staking/ValidatorMessages.sol | 26 ++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index 77307adfb..ba425ba21 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -71,7 +71,7 @@ library ValidatorMessages { returns (bytes32, bytes memory) { require( - validationPeriod.blsPublicKey.length == 48, "StakingMessages: Invalid signature length" + validationPeriod.blsPublicKey.length == 48, "StakingMessages: invalid signature length" ); bytes memory res = new bytes(134); // Pack the codec ID @@ -120,14 +120,14 @@ library ValidatorMessages { pure returns (ValidationPeriod memory) { - require(input.length == 134, "ValidatorMessages: Invalid message length"); + require(input.length == 134, "ValidatorMessages: invalid message length"); // Unpack the codec ID uint16 codecID; for (uint256 i; i < 2; ++i) { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } - require(codecID == CODEC_ID, "ValidatorMessages: Invalid codec ID"); + require(codecID == CODEC_ID, "ValidatorMessages: invalid codec ID"); // Unpack the type ID uint32 typeID; @@ -136,7 +136,7 @@ library ValidatorMessages { } require( typeID == REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID, - "ValidatorMessages: Invalid message type" + "ValidatorMessages: invalid message type" ); // Unpack the subnetID @@ -234,13 +234,13 @@ library ValidatorMessages { pure returns (bytes32, bool) { - require(input.length == 39, "ValidatorMessages: Invalid message length"); + require(input.length == 39, "ValidatorMessages: invalid message length"); // Unpack the codec ID uint16 codecID; for (uint256 i; i < 2; ++i) { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } - require(codecID == CODEC_ID, "ValidatorMessages: Invalid codec ID"); + require(codecID == CODEC_ID, "ValidatorMessages: invalid codec ID"); // Unpack the type ID uint32 typeID; @@ -249,7 +249,7 @@ library ValidatorMessages { } require( typeID == SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID, - "ValidatorMessages: Invalid message type" + "ValidatorMessages: invalid message type" ); // Unpack the validation ID. @@ -327,14 +327,14 @@ library ValidatorMessages { pure returns (bytes32, uint64, uint64) { - require(input.length == 54, "ValidatorMessages: Invalid message length"); + require(input.length == 54, "ValidatorMessages: invalid message length"); // Unpack the codec ID. uint16 codecID; for (uint256 i; i < 2; ++i) { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } - require(codecID == CODEC_ID, "ValidatorMessages: Invalid codec ID"); + require(codecID == CODEC_ID, "ValidatorMessages: invalid codec ID"); // Unpack the type ID. uint32 typeID; @@ -343,7 +343,7 @@ library ValidatorMessages { } require( typeID == SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID, - "ValidatorMessages: Invalid message type" + "ValidatorMessages: invalid message type" ); // Unpack the validation ID. @@ -423,14 +423,14 @@ library ValidatorMessages { pure returns (bytes32, uint64) { - require(input.length == 46, "ValidatorMessages: Invalid message length"); + require(input.length == 46, "ValidatorMessages: invalid message length"); // Unpack the codec ID. uint16 codecID; for (uint256 i; i < 2; ++i) { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } - require(codecID == CODEC_ID, "ValidatorMessages: Invalid codec ID"); + require(codecID == CODEC_ID, "ValidatorMessages: invalid codec ID"); // Unpack the type ID. uint32 typeID; @@ -438,7 +438,7 @@ library ValidatorMessages { typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } require( - typeID == VALIDATION_UPTIME_MESSAGE_TYPE_ID, "ValidatorMessages: Invalid message type" + typeID == VALIDATION_UPTIME_MESSAGE_TYPE_ID, "ValidatorMessages: invalid message type" ); // Unpack the validation ID. From faaaa2a2518d44dd1658df747e9c399a5f9f813c Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 28 Aug 2024 16:20:26 -0500 Subject: [PATCH 152/545] format --- .../ERC20TokenStakingManager.go | 33 ++++++++++++------- .../NativeTokenStakingManager.go | 33 ++++++++++++------- .../PoAValidatorManager.go | 33 ++++++++++++------- contracts/staking/ValidatorManager.sol | 11 ++++--- .../staking/tests/ValidatorManagerTests.t.sol | 2 +- 5 files changed, 70 insertions(+), 42 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 1a85da7e1..1b4089a54 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161324738038061324783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130fa8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806376f786211161006357806376f786211461012b578063872fda641461013e578063a3a65e4814610151578063b771b3bc14610164578063bee0a03f1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c7578063467ef06f146100f7578063620658561461010a575b5f80fd5b6100b26100ad366004612816565b61019d565b005b6100b26100c2366004612841565b610373565b6100da6100d5366004612816565b610481565b6040516001600160401b0390911681526020015b60405180910390f35b6100b2610105366004612896565b610497565b61011d6101183660046128cc565b61080d565b6040519081526020016100ee565b6100b26101393660046128f2565b610826565b61011d61014c3660046129bf565b610b57565b6100b261015f366004612896565b610b7c565b6101726005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610198366004612816565b610e0b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206130ce83398151915293929190829060ff1660058111156101fd576101fd612a5b565b600581111561020e5761020e612a5b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561028557610285612a5b565b146102ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6102ff8483606001515f610f1a565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061032c908490600401612a91565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c9190612ac3565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103b75750825b90505f826001600160401b031660011480156103d25750303b155b9050811580156103e0575080155b156103fe5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561042857845460ff60401b1916600160401b1785555b6104328787611137565b831561047857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61049164e8d4a5100083612b02565b92915050565b5f5f805160206130ce8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156104f2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105199190810190612b20565b915091508061053a5760405162461bcd60e51b81526004016102e690612bf2565b825482511461055b5760405162461bcd60e51b81526004016102e690612c38565b60208201516001600160a01b0316156105865760405162461bcd60e51b81526004016102e690612c81565b5f806105958460400151611155565b9150915080156105fa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102e6565b5f828152600686016020526040808220815160e081019092528054829060ff16600581111561062b5761062b612a5b565b600581111561063c5761063c612a5b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156106b5576106b5612a5b565b036106c2575060046106c6565b5060055b6020808301515f908152600789019091526040812055818160058111156106ef576106ef612a5b565b9081600581111561070257610702612a5b565b9052505f84815260068801602052604090208251815484929190829060ff1916600183600581111561073657610736612a5b565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555184907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b5f6104916001600160401b03831664e8d4a51000612cd0565b8115610b49575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561089a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108c19190810190612b20565b91509150806109245760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016102e6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610967573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098b9190612ac3565b8251146109ef5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016102e6565b60208201516001600160a01b031615610a655760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016102e6565b5f80610a7484604001516112f6565b91509150818814610ae15760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016102e6565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610b52836114ce565b505050565b5f80610b628661185b565b9050610b708582868661191b565b9150505b949350505050565b5f5f805160206130ce8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610bd7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bfe9190810190612b20565b9150915080610c1f5760405162461bcd60e51b81526004016102e690612bf2565b8254825114610c405760405162461bcd60e51b81526004016102e690612c38565b60208201516001600160a01b031615610c6b5760405162461bcd60e51b81526004016102e690612c81565b5f80610c7a8460400151611155565b9150915080610cdc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102e6565b5f82815260058601602052604081208054610cf690612ce7565b9050118015610d28575060015f83815260068701602052604090205460ff166005811115610d2657610d26612a5b565b145b610d445760405162461bcd60e51b81526004016102e690612d1f565b5f8281526005860160205260408120610d5c916127cc565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206130ce833981519152929190610e5390612ce7565b9050118015610e85575060015f83815260068301602052604090205460ff166005811115610e8357610e83612a5b565b145b610ea15760405162461bcd60e51b81526004016102e690612d1f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610eda9190600401612d66565b6020604051808303815f875af1158015610ef6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b529190612ac3565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610f9357610f53816001612df0565b610f5e906008612cd0565b5081515f90839083908110610f7557610f75612e03565b60200101906001600160f81b03191690815f1a905350600101610f3f565b505f5b6004811015610ff657610faa816003612df0565b610fb5906008612cd0565b6001901c60f81b82610fc8836002612e17565b81518110610fd857610fd8612e03565b60200101906001600160f81b03191690815f1a905350600101610f96565b505f5b60208110156110585761100d81601f612df0565b611018906008612cd0565b86901c60f81b8261102a836006612e17565b8151811061103a5761103a612e03565b60200101906001600160f81b03191690815f1a905350600101610ff9565b505f5b60088110156110c35761106f816007612df0565b61107a906008612cd0565b6001600160401b038616901c60f81b82611095836026612e17565b815181106110a5576110a5612e03565b60200101906001600160f81b03191690815f1a90535060010161105b565b505f5b600881101561112e576110da816007612df0565b6110e5906008612cd0565b6001600160401b038516901c60f81b8261110083602e612e17565b8151811061111057611110612e03565b60200101906001600160f81b03191690815f1a9053506001016110c6565b50949350505050565b61113f611d52565b61114882611d9d565b61115181611de3565b5050565b5f8082516027146111785760405162461bcd60e51b81526004016102e690612e2a565b5f805b60028110156111c75761118f816001612df0565b61119a906008612cd0565b61ffff168582815181106111b0576111b0612e03565b016020015160f81c901b919091179060010161117b565b5061ffff8116156111ea5760405162461bcd60e51b81526004016102e690612e73565b5f805b600481101561124557611201816003612df0565b61120c906008612cd0565b63ffffffff168661121e836002612e17565b8151811061122e5761122e612e03565b016020015160f81c901b91909117906001016111ed565b5063ffffffff811660021461126c5760405162461bcd60e51b81526004016102e690612eb6565b5f805b60208110156112c15761128381601f612df0565b61128e906008612cd0565b8761129a836006612e17565b815181106112aa576112aa612e03565b016020015160f81c901b919091179060010161126f565b505f866026815181106112d6576112d6612e03565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146113195760405162461bcd60e51b81526004016102e690612e2a565b5f805b600281101561136857611330816001612df0565b61133b906008612cd0565b61ffff1685828151811061135157611351612e03565b016020015160f81c901b919091179060010161131c565b5061ffff81161561138b5760405162461bcd60e51b81526004016102e690612e73565b5f805b60048110156113e6576113a2816003612df0565b6113ad906008612cd0565b63ffffffff16866113bf836002612e17565b815181106113cf576113cf612e03565b016020015160f81c901b919091179060010161138e565b5063ffffffff811660041461140d5760405162461bcd60e51b81526004016102e690612eb6565b5f805b60208110156114625761142481601f612df0565b61142f906008612cd0565b8761143b836006612e17565b8151811061144b5761144b612e03565b016020015160f81c901b9190911790600101611410565b505f805b60088110156114c15761147a816007612df0565b611485906008612cd0565b6001600160401b03168861149a836026612e17565b815181106114aa576114aa612e03565b016020015160f81c901b9190911790600101611466565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206130ce83398151915293929190829060ff16600581111561152e5761152e612a5b565b600581111561153f5761153f612a5b565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156115b9576115b9612a5b565b146116155760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102e6565b60408101516001600160a01b0316336001600160a01b03161461168f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016102e6565b61169c8160800151611e97565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156116e0576116e0612a5b565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061179790859083610f1a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906117c6908590600401612a91565b6020604051808303815f875af11580156117e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118069190612ac3565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008161188784612038565b90505f61189382610481565b83549091506001600160401b038216108015906118bd57508260010154816001600160401b031611155b610b745760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016102e6565b5f61192461206e565b5f805160206130ce833981519152426001600160401b03851611801561195e57506001600160401b03841661195c426202a300612e17565b115b6119c05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102e6565b85611a175760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102e6565b5f86815260078201602052604090205415611a855760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102e6565b8251603014611aec5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102e6565b611af585611e97565b5f80611b3c6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506120b8565b5f82815260058601602052604090209193509150611b5a8282612f41565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b87908590600401612a91565b6020604051808303815f875af1158015611ba3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc79190612ac3565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611c4057611c40612a5b565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610b7460017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611d9b57604051631afcd79f60e31b815260040160405180910390fd5b565b611da5611d52565b611dae81612483565b611de060608201356080830135611dcb60c0850160a086016128cc565b611ddb60e0860160c08701613000565b6124a4565b50565b611deb611d52565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216611e775760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016102e6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206130ce8339815191529060ff165f03611ed5575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611f1d9083612df0565b10611f39576001600160401b0384166040830152808252611f58565b8382604001818151611f4b919061301b565b6001600160401b03169052505b5f826020015183604001516064611f6f9190613042565b611f79919061306d565b600285015490915060ff9081169082161115611ff45760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102e6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610491827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690612512565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016120b257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146121225760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102e6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561219957612159816001612df0565b612164906008612cd0565b5081515f9083908390811061217b5761217b612e03565b60200101906001600160f81b03191690815f1a905350600101612145565b505f5b60048110156121f7576121b0816003612df0565b6121bb906008612cd0565b505f826121c9836002612e17565b815181106121d9576121d9612e03565b60200101906001600160f81b03191690815f1a90535060010161219c565b505f5b6020811015612254578451816020811061221657612216612e03565b1a60f81b82612226836006612e17565b8151811061223657612236612e03565b60200101906001600160f81b03191690815f1a9053506001016121fa565b505f5b60208110156122b4578460200151816020811061227657612276612e03565b1a60f81b82612286836026612e17565b8151811061229657612296612e03565b60200101906001600160f81b03191690815f1a905350600101612257565b505f5b6008811015612328576122cb816007612df0565b6122d6906008612cd0565b60ff1685604001516001600160401b0316901c60f81b828260466122fa9190612e17565b8151811061230a5761230a612e03565b60200101906001600160f81b03191690815f1a9053506001016122b7565b505f5b6030811015612393578460800151818151811061234a5761234a612e03565b01602001516001600160f81b0319168261236583604e612e17565b8151811061237557612375612e03565b60200101906001600160f81b03191690815f1a90535060010161232b565b505f5b6008811015612405576123aa816007612df0565b6123b5906008612cd0565b60608601516001600160401b0390811691161c60f81b826123d783607e612e17565b815181106123e7576123e7612e03565b60200101906001600160f81b03191690815f1a905350600101612396565b506002816040516124169190613092565b602060405180830381855afa158015612431573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906124549190612ac3565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61248b611d52565b612493612674565b61249b612684565b611de08161268c565b6124ac611d52565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612558573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061257c9190612ac3565b90506125936001600160a01b0385163330866126f8565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156125d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125fb9190612ac3565b90508181116126615760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016102e6565b61266b8282612df0565b95945050505050565b61267c611d52565b611d9b612758565b611d9b611d52565b612694611d52565b80355f805160206130ce83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556126de60608301604084016130ad565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612752908590612760565b50505050565b61245d611d52565b5f8060205f8451602086015f885af18061277f576040513d5f823e3d81fd5b50505f513d915081156127965780600114156127a3565b6001600160a01b0384163b155b1561275257604051635274afe760e01b81526001600160a01b03851660048201526024016102e6565b5080546127d890612ce7565b5f825580601f106127e7575050565b601f0160209004905f5260205f2090810190611de091905b80821115612812575f81556001016127ff565b5090565b5f60208284031215612826575f80fd5b5035919050565b6001600160a01b0381168114611de0575f80fd5b5f80828403610100811215612854575f80fd5b60e0811215612861575f80fd5b5082915060e08301356128738161282d565b809150509250929050565b803563ffffffff81168114612891575f80fd5b919050565b5f602082840312156128a6575f80fd5b6128af8261287e565b9392505050565b80356001600160401b0381168114612891575f80fd5b5f602082840312156128dc575f80fd5b6128af826128b6565b8015158114611de0575f80fd5b5f805f60608486031215612904575f80fd5b833592506020840135612916816128e5565b91506129246040850161287e565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156129635761296361292d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156129915761299161292d565b604052919050565b5f6001600160401b038211156129b1576129b161292d565b50601f01601f191660200190565b5f805f80608085870312156129d2575f80fd5b84359350602085013592506129e9604086016128b6565b915060608501356001600160401b03811115612a03575f80fd5b8501601f81018713612a13575f80fd5b8035612a26612a2182612999565b612969565b818152886020838501011115612a3a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612a89578181015183820152602001612a71565b50505f910152565b602081525f8251806020840152612aaf816040850160208701612a6f565b601f01601f19169190910160400192915050565b5f60208284031215612ad3575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612b1057612b10612ada565b500490565b8051612891816128e5565b5f8060408385031215612b31575f80fd5b82516001600160401b0380821115612b47575f80fd5b9084019060608287031215612b5a575f80fd5b612b62612941565b82518152602080840151612b758161282d565b82820152604084015183811115612b8a575f80fd5b80850194505087601f850112612b9e575f80fd5b83519250612bae612a2184612999565b8381528882858701011115612bc1575f80fd5b612bd084838301848801612a6f565b80604084015250819550612be5818801612b15565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b808202811582820484141761049157610491612aee565b600181811c90821680612cfb57607f821691505b602082108103612d1957634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612d7881612ce7565b806020870152604060018084165f8114612d995760018114612db557612de2565b60ff19851660408a0152604084151560051b8a01019550612de2565b895f5260205f205f5b85811015612dd95781548b8201860152908301908801612dbe565b8a016040019650505b509398975050505050505050565b8181038181111561049157610491612aee565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561049157610491612aee565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610b5257805f5260205f20601f840160051c81016020851015612f225750805b601f840160051c820191505b8181101561036c575f8155600101612f2e565b81516001600160401b03811115612f5a57612f5a61292d565b612f6e81612f688454612ce7565b84612efd565b602080601f831160018114612fa1575f8415612f8a5750858301515b5f19600386901b1c1916600185901b178555612ff8565b5f85815260208120601f198616915b82811015612fcf57888601518255948401946001909101908401612fb0565b5085821015612fec57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215613010575f80fd5b81356128af8161282d565b6001600160401b0381811683821601908082111561303b5761303b612aee565b5092915050565b6001600160401b0381811683821602808216919082811461306557613065612aee565b505092915050565b5f6001600160401b038084168061308657613086612ada565b92169190910492915050565b5f82516130a3818460208701612a6f565b9190910192915050565b5f602082840312156130bd575f80fd5b813560ff811681146128af575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516132e93803806132e983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61319c8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c806376f786211161006357806376f786211461012b578063872fda641461013e578063a3a65e4814610151578063b771b3bc14610164578063bee0a03f1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c7578063467ef06f146100f7578063620658561461010a575b5f80fd5b6100b26100ad3660046128b8565b61019d565b005b6100b26100c23660046128e3565b610373565b6100da6100d53660046128b8565b610481565b6040516001600160401b0390911681526020015b60405180910390f35b6100b2610105366004612938565b610497565b61011d61011836600461296e565b6108af565b6040519081526020016100ee565b6100b2610139366004612994565b6108c8565b61011d61014c366004612a61565b610bf9565b6100b261015f366004612938565b610c1e565b6101726005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b26101983660046128b8565b610ead565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061317083398151915293929190829060ff1660058111156101fd576101fd612afd565b600581111561020e5761020e612afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561028557610285612afd565b146102ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6102ff8483606001515f610fbc565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061032c908490600401612b33565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c9190612b65565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103b75750825b90505f826001600160401b031660011480156103d25750303b155b9050811580156103e0575080155b156103fe5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561042857845460ff60401b1916600160401b1785555b61043287876111d9565b831561047857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61049164e8d4a5100083612ba4565b92915050565b5f5f805160206131708339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156104f2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105199190810190612bc2565b915091508061053a5760405162461bcd60e51b81526004016102e690612c94565b825482511461055b5760405162461bcd60e51b81526004016102e690612cda565b60208201516001600160a01b0316156105865760405162461bcd60e51b81526004016102e690612d23565b5f8061059584604001516111f7565b9150915080156105fa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102e6565b5f828152600686016020526040808220815160e081019092528054829060ff16600581111561062b5761062b612afd565b600581111561063c5761063c612afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156106b5576106b5612afd565b14806106d357506001825160058111156106d1576106d1612afd565b145b6107325760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016102e6565b60038251600581111561074757610747612afd565b0361075457506004610758565b5060055b6020808301515f9081526007890190915260408120558181600581111561078157610781612afd565b9081600581111561079457610794612afd565b9052505f84815260068801602052604090208251815484929190829060ff191660018360058111156107c8576107c8612afd565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790558151600581111561087b5761087b612afd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a35050505050505050565b5f6104916001600160401b03831664e8d4a51000612d72565b8115610beb575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561093c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109639190810190612bc2565b91509150806109c65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016102e6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2d9190612b65565b825114610a915760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016102e6565b60208201516001600160a01b031615610b075760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016102e6565b5f80610b168460400151611398565b91509150818814610b835760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016102e6565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610bf483611570565b505050565b5f80610c04866118fd565b9050610c12858286866119bd565b9150505b949350505050565b5f5f805160206131708339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c79573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ca09190810190612bc2565b9150915080610cc15760405162461bcd60e51b81526004016102e690612c94565b8254825114610ce25760405162461bcd60e51b81526004016102e690612cda565b60208201516001600160a01b031615610d0d5760405162461bcd60e51b81526004016102e690612d23565b5f80610d1c84604001516111f7565b9150915080610d7e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102e6565b5f82815260058601602052604081208054610d9890612d89565b9050118015610dca575060015f83815260068701602052604090205460ff166005811115610dc857610dc8612afd565b145b610de65760405162461bcd60e51b81526004016102e690612dc1565b5f8281526005860160205260408120610dfe9161286e565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613170833981519152929190610ef590612d89565b9050118015610f27575060015f83815260068301602052604090205460ff166005811115610f2557610f25612afd565b145b610f435760405162461bcd60e51b81526004016102e690612dc1565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610f7c9190600401612e08565b6020604051808303815f875af1158015610f98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf49190612b65565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561103557610ff5816001612e92565b611000906008612d72565b5081515f9083908390811061101757611017612ea5565b60200101906001600160f81b03191690815f1a905350600101610fe1565b505f5b60048110156110985761104c816003612e92565b611057906008612d72565b6001901c60f81b8261106a836002612eb9565b8151811061107a5761107a612ea5565b60200101906001600160f81b03191690815f1a905350600101611038565b505f5b60208110156110fa576110af81601f612e92565b6110ba906008612d72565b86901c60f81b826110cc836006612eb9565b815181106110dc576110dc612ea5565b60200101906001600160f81b03191690815f1a90535060010161109b565b505f5b600881101561116557611111816007612e92565b61111c906008612d72565b6001600160401b038616901c60f81b82611137836026612eb9565b8151811061114757611147612ea5565b60200101906001600160f81b03191690815f1a9053506001016110fd565b505f5b60088110156111d05761117c816007612e92565b611187906008612d72565b6001600160401b038516901c60f81b826111a283602e612eb9565b815181106111b2576111b2612ea5565b60200101906001600160f81b03191690815f1a905350600101611168565b50949350505050565b6111e1611df4565b6111ea82611e3f565b6111f381611e85565b5050565b5f80825160271461121a5760405162461bcd60e51b81526004016102e690612ecc565b5f805b600281101561126957611231816001612e92565b61123c906008612d72565b61ffff1685828151811061125257611252612ea5565b016020015160f81c901b919091179060010161121d565b5061ffff81161561128c5760405162461bcd60e51b81526004016102e690612f15565b5f805b60048110156112e7576112a3816003612e92565b6112ae906008612d72565b63ffffffff16866112c0836002612eb9565b815181106112d0576112d0612ea5565b016020015160f81c901b919091179060010161128f565b5063ffffffff811660021461130e5760405162461bcd60e51b81526004016102e690612f58565b5f805b60208110156113635761132581601f612e92565b611330906008612d72565b8761133c836006612eb9565b8151811061134c5761134c612ea5565b016020015160f81c901b9190911790600101611311565b505f8660268151811061137857611378612ea5565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146113bb5760405162461bcd60e51b81526004016102e690612ecc565b5f805b600281101561140a576113d2816001612e92565b6113dd906008612d72565b61ffff168582815181106113f3576113f3612ea5565b016020015160f81c901b91909117906001016113be565b5061ffff81161561142d5760405162461bcd60e51b81526004016102e690612f15565b5f805b600481101561148857611444816003612e92565b61144f906008612d72565b63ffffffff1686611461836002612eb9565b8151811061147157611471612ea5565b016020015160f81c901b9190911790600101611430565b5063ffffffff81166004146114af5760405162461bcd60e51b81526004016102e690612f58565b5f805b6020811015611504576114c681601f612e92565b6114d1906008612d72565b876114dd836006612eb9565b815181106114ed576114ed612ea5565b016020015160f81c901b91909117906001016114b2565b505f805b60088110156115635761151c816007612e92565b611527906008612d72565b6001600160401b03168861153c836026612eb9565b8151811061154c5761154c612ea5565b016020015160f81c901b9190911790600101611508565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061317083398151915293929190829060ff1660058111156115d0576115d0612afd565b60058111156115e1576115e1612afd565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561165b5761165b612afd565b146116b75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102e6565b60408101516001600160a01b0316336001600160a01b0316146117315760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016102e6565b61173e8160800151611f39565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561178257611782612afd565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061183990859083610fbc565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611868908590600401612b33565b6020604051808303815f875af1158015611884573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118a89190612b65565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081611929846120da565b90505f61193582610481565b83549091506001600160401b0382161080159061195f57508260010154816001600160401b031611155b610c165760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016102e6565b5f6119c6612110565b5f80516020613170833981519152426001600160401b038516118015611a0057506001600160401b0384166119fe426202a300612eb9565b115b611a625760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102e6565b85611ab95760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016102e6565b5f86815260078201602052604090205415611b275760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102e6565b8251603014611b8e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102e6565b611b9785611f39565b5f80611bde6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061215a565b5f82815260058601602052604090209193509150611bfc8282612fe3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611c29908590600401612b33565b6020604051808303815f875af1158015611c45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c699190612b65565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611ce257611ce2612afd565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610c1660017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611e3d57604051631afcd79f60e31b815260040160405180910390fd5b565b611e47611df4565b611e5081612525565b611e8260608201356080830135611e6d60c0850160a0860161296e565b611e7d60e0860160c087016130a2565b612546565b50565b611e8d611df4565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216611f195760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016102e6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206131708339815191529060ff165f03611f77575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611fbf9083612e92565b10611fdb576001600160401b0384166040830152808252611ffa565b8382604001818151611fed91906130bd565b6001600160401b03169052505b5f82602001518360400151606461201191906130e4565b61201b919061310f565b600285015490915060ff90811690821611156120965760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102e6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610491827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906125b4565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161215457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146121c45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102e6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561223b576121fb816001612e92565b612206906008612d72565b5081515f9083908390811061221d5761221d612ea5565b60200101906001600160f81b03191690815f1a9053506001016121e7565b505f5b600481101561229957612252816003612e92565b61225d906008612d72565b505f8261226b836002612eb9565b8151811061227b5761227b612ea5565b60200101906001600160f81b03191690815f1a90535060010161223e565b505f5b60208110156122f657845181602081106122b8576122b8612ea5565b1a60f81b826122c8836006612eb9565b815181106122d8576122d8612ea5565b60200101906001600160f81b03191690815f1a90535060010161229c565b505f5b6020811015612356578460200151816020811061231857612318612ea5565b1a60f81b82612328836026612eb9565b8151811061233857612338612ea5565b60200101906001600160f81b03191690815f1a9053506001016122f9565b505f5b60088110156123ca5761236d816007612e92565b612378906008612d72565b60ff1685604001516001600160401b0316901c60f81b8282604661239c9190612eb9565b815181106123ac576123ac612ea5565b60200101906001600160f81b03191690815f1a905350600101612359565b505f5b603081101561243557846080015181815181106123ec576123ec612ea5565b01602001516001600160f81b0319168261240783604e612eb9565b8151811061241757612417612ea5565b60200101906001600160f81b03191690815f1a9053506001016123cd565b505f5b60088110156124a75761244c816007612e92565b612457906008612d72565b60608601516001600160401b0390811691161c60f81b8261247983607e612eb9565b8151811061248957612489612ea5565b60200101906001600160f81b03191690815f1a905350600101612438565b506002816040516124b89190613134565b602060405180830381855afa1580156124d3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906124f69190612b65565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61252d611df4565b612535612716565b61253d612726565b611e828161272e565b61254e611df4565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156125fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061261e9190612b65565b90506126356001600160a01b03851633308661279a565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015612679573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061269d9190612b65565b90508181116127035760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016102e6565b61270d8282612e92565b95945050505050565b61271e611df4565b611e3d6127fa565b611e3d611df4565b612736611df4565b80355f8051602061317083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612780606083016040840161314f565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526127f4908590612802565b50505050565b6124ff611df4565b5f8060205f8451602086015f885af180612821576040513d5f823e3d81fd5b50505f513d91508115612838578060011415612845565b6001600160a01b0384163b155b156127f457604051635274afe760e01b81526001600160a01b03851660048201526024016102e6565b50805461287a90612d89565b5f825580601f10612889575050565b601f0160209004905f5260205f2090810190611e8291905b808211156128b4575f81556001016128a1565b5090565b5f602082840312156128c8575f80fd5b5035919050565b6001600160a01b0381168114611e82575f80fd5b5f808284036101008112156128f6575f80fd5b60e0811215612903575f80fd5b5082915060e0830135612915816128cf565b809150509250929050565b803563ffffffff81168114612933575f80fd5b919050565b5f60208284031215612948575f80fd5b61295182612920565b9392505050565b80356001600160401b0381168114612933575f80fd5b5f6020828403121561297e575f80fd5b61295182612958565b8015158114611e82575f80fd5b5f805f606084860312156129a6575f80fd5b8335925060208401356129b881612987565b91506129c660408501612920565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612a0557612a056129cf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612a3357612a336129cf565b604052919050565b5f6001600160401b03821115612a5357612a536129cf565b50601f01601f191660200190565b5f805f8060808587031215612a74575f80fd5b8435935060208501359250612a8b60408601612958565b915060608501356001600160401b03811115612aa5575f80fd5b8501601f81018713612ab5575f80fd5b8035612ac8612ac382612a3b565b612a0b565b818152886020838501011115612adc575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612b2b578181015183820152602001612b13565b50505f910152565b602081525f8251806020840152612b51816040850160208701612b11565b601f01601f19169190910160400192915050565b5f60208284031215612b75575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612bb257612bb2612b7c565b500490565b805161293381612987565b5f8060408385031215612bd3575f80fd5b82516001600160401b0380821115612be9575f80fd5b9084019060608287031215612bfc575f80fd5b612c046129e3565b82518152602080840151612c17816128cf565b82820152604084015183811115612c2c575f80fd5b80850194505087601f850112612c40575f80fd5b83519250612c50612ac384612a3b565b8381528882858701011115612c63575f80fd5b612c7284838301848801612b11565b80604084015250819550612c87818801612bb7565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b808202811582820484141761049157610491612b90565b600181811c90821680612d9d57607f821691505b602082108103612dbb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612e1a81612d89565b806020870152604060018084165f8114612e3b5760018114612e5757612e84565b60ff19851660408a0152604084151560051b8a01019550612e84565b895f5260205f205f5b85811015612e7b5781548b8201860152908301908801612e60565b8a016040019650505b509398975050505050505050565b8181038181111561049157610491612b90565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561049157610491612b90565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610bf457805f5260205f20601f840160051c81016020851015612fc45750805b601f840160051c820191505b8181101561036c575f8155600101612fd0565b81516001600160401b03811115612ffc57612ffc6129cf565b6130108161300a8454612d89565b84612f9f565b602080601f831160018114613043575f841561302c5750858301515b5f19600386901b1c1916600185901b17855561309a565b5f85815260208120601f198616915b8281101561307157888601518255948401946001909101908401613052565b508582101561308e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156130b2575f80fd5b8135612951816128cf565b6001600160401b038181168382160190808211156130dd576130dd612b90565b5092915050565b6001600160401b0381811683821602808216919082811461310757613107612b90565b505092915050565b5f6001600160401b038084168061312857613128612b7c565b92169190910492915050565b5f8251613145818460208701612b11565b9190910192915050565b5f6020828403121561315f575f80fd5b813560ff81168114612951575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -826,37 +826,46 @@ func (it *ERC20TokenStakingManagerValidationPeriodEndedIterator) Close() error { // ERC20TokenStakingManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerValidationPeriodEnded struct { ValidationID [32]byte + Status uint8 Raw types.Log // Blockchain specific contextual infos } -// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. // -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodEndedIterator, error) { +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte, status []uint8) (*ERC20TokenStakingManagerValidationPeriodEndedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerValidationPeriodEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil } -// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. // -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodEnded, validationID [][32]byte) (event.Subscription, error) { +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodEnded, validationID [][32]byte, status []uint8) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) if err != nil { return nil, err } @@ -888,9 +897,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidati }), nil } -// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. // -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*ERC20TokenStakingManagerValidationPeriodEnded, error) { event := new(ERC20TokenStakingManagerValidationPeriodEnded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 49da8bffe..466006eb0 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612f3e380380612f3e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612df18061014d5f395ff3fe60806040526004361061008e575f3560e01c806376f786211161005757806376f786211461015a578063a3a65e4814610179578063b771b3bc14610198578063bee0a03f146101ca578063f40797d7146101e9575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063467ef06f1461010e578063620658561461012d575b5f80fd5b34801561009d575f80fd5b506100b16100ac366004612548565b6101fc565b005b3480156100be575f80fd5b506100b16100cd36600461255e565b610308565b3480156100dd575f80fd5b506100f16100ec36600461255e565b6104de565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b506100b161012836600461258d565b6104f4565b348015610138575f80fd5b5061014c6101473660046125c3565b61086a565b604051908152602001610105565b348015610165575f80fd5b506100b16101743660046125e9565b610883565b348015610184575f80fd5b506100b161019336600461258d565b610bb4565b3480156101a3575f80fd5b506101b26005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101d5575f80fd5b506100b16101e436600461255e565b610e43565b61014c6101f73660046126b6565b610f52565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba86610f74565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612dc583398151915293929190829060ff16600581111561036857610368612748565b600581111561037957610379612748565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156103f0576103f0612748565b1461045a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61046a8483606001515f610f88565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061049790849060040161277e565b6020604051808303815f875af11580156104b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d791906127b0565b5050505050565b5f6104ee64e8d4a51000836127ef565b92915050565b5f5f80516020612dc58339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561054f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105769190810190612821565b91509150806105975760405162461bcd60e51b8152600401610451906128f3565b82548251146105b85760405162461bcd60e51b815260040161045190612939565b60208201516001600160a01b0316156105e35760405162461bcd60e51b815260040161045190612982565b5f806105f284604001516111a5565b9150915080156106575760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610451565b5f828152600686016020526040808220815160e081019092528054829060ff16600581111561068857610688612748565b600581111561069957610699612748565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561071257610712612748565b0361071f57506004610723565b5060055b6020808301515f9081526007890190915260408120558181600581111561074c5761074c612748565b9081600581111561075f5761075f612748565b9052505f84815260068801602052604090208251815484929190829060ff1916600183600581111561079357610793612748565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555184907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b5f6104ee6001600160401b03831664e8d4a510006129d1565b8115610ba6575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156108f7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261091e9190810190612821565b91509150806109815760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610451565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e891906127b0565b825114610a4c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610451565b60208201516001600160a01b031615610ac25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610451565b5f80610ad18460400151611346565b91509150818814610b3e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610451565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610baf8361151e565b505050565b5f5f80516020612dc58339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c0f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c369190810190612821565b9150915080610c575760405162461bcd60e51b8152600401610451906128f3565b8254825114610c785760405162461bcd60e51b815260040161045190612939565b60208201516001600160a01b031615610ca35760405162461bcd60e51b815260040161045190612982565b5f80610cb284604001516111a5565b9150915080610d145760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610451565b5f82815260058601602052604081208054610d2e906129e8565b9050118015610d60575060015f83815260068701602052604090205460ff166005811115610d5e57610d5e612748565b145b610d7c5760405162461bcd60e51b815260040161045190612a1a565b5f8281526005860160205260408120610d94916124fe565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612dc5833981519152929190610e8b906129e8565b9050118015610ebd575060015f83815260068301602052604090205460ff166005811115610ebb57610ebb612748565b145b610ed95760405162461bcd60e51b815260040161045190612a1a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610f129190600401612a61565b6020604051808303815f875af1158015610f2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610baf91906127b0565b5f80610f5d346118ab565b9050610f6b85828686611968565b95945050505050565b610f7c611d9f565b610f8581611dea565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561100157610fc1816001612aeb565b610fcc9060086129d1565b5081515f90839083908110610fe357610fe3612afe565b60200101906001600160f81b03191690815f1a905350600101610fad565b505f5b600481101561106457611018816003612aeb565b6110239060086129d1565b6001901c60f81b82611036836002612b12565b8151811061104657611046612afe565b60200101906001600160f81b03191690815f1a905350600101611004565b505f5b60208110156110c65761107b81601f612aeb565b6110869060086129d1565b86901c60f81b82611098836006612b12565b815181106110a8576110a8612afe565b60200101906001600160f81b03191690815f1a905350600101611067565b505f5b6008811015611131576110dd816007612aeb565b6110e89060086129d1565b6001600160401b038616901c60f81b82611103836026612b12565b8151811061111357611113612afe565b60200101906001600160f81b03191690815f1a9053506001016110c9565b505f5b600881101561119c57611148816007612aeb565b6111539060086129d1565b6001600160401b038516901c60f81b8261116e83602e612b12565b8151811061117e5761117e612afe565b60200101906001600160f81b03191690815f1a905350600101611134565b50949350505050565b5f8082516027146111c85760405162461bcd60e51b815260040161045190612b25565b5f805b6002811015611217576111df816001612aeb565b6111ea9060086129d1565b61ffff1685828151811061120057611200612afe565b016020015160f81c901b91909117906001016111cb565b5061ffff81161561123a5760405162461bcd60e51b815260040161045190612b6e565b5f805b600481101561129557611251816003612aeb565b61125c9060086129d1565b63ffffffff168661126e836002612b12565b8151811061127e5761127e612afe565b016020015160f81c901b919091179060010161123d565b5063ffffffff81166002146112bc5760405162461bcd60e51b815260040161045190612bb1565b5f805b6020811015611311576112d381601f612aeb565b6112de9060086129d1565b876112ea836006612b12565b815181106112fa576112fa612afe565b016020015160f81c901b91909117906001016112bf565b505f8660268151811061132657611326612afe565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146113695760405162461bcd60e51b815260040161045190612b25565b5f805b60028110156113b857611380816001612aeb565b61138b9060086129d1565b61ffff168582815181106113a1576113a1612afe565b016020015160f81c901b919091179060010161136c565b5061ffff8116156113db5760405162461bcd60e51b815260040161045190612b6e565b5f805b6004811015611436576113f2816003612aeb565b6113fd9060086129d1565b63ffffffff168661140f836002612b12565b8151811061141f5761141f612afe565b016020015160f81c901b91909117906001016113de565b5063ffffffff811660041461145d5760405162461bcd60e51b815260040161045190612bb1565b5f805b60208110156114b25761147481601f612aeb565b61147f9060086129d1565b8761148b836006612b12565b8151811061149b5761149b612afe565b016020015160f81c901b9190911790600101611460565b505f805b6008811015611511576114ca816007612aeb565b6114d59060086129d1565b6001600160401b0316886114ea836026612b12565b815181106114fa576114fa612afe565b016020015160f81c901b91909117906001016114b6565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612dc583398151915293929190829060ff16600581111561157e5761157e612748565b600581111561158f5761158f612748565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561160957611609612748565b146116655760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610451565b60408101516001600160a01b0316336001600160a01b0316146116df5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610451565b6116ec8160800151611e2d565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561173057611730612748565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906117e790859083610f88565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061181690859060040161277e565b6020604051808303815f875af1158015611832573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061185691906127b0565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0082826118d8826104de565b83549091506001600160401b0382161080159061190257508260010154816001600160401b031611155b6119605760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610451565b949350505050565b5f611971611fce565b5f80516020612dc5833981519152426001600160401b0385161180156119ab57506001600160401b0384166119a9426202a300612b12565b115b611a0d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610451565b85611a645760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610451565b5f86815260078201602052604090205415611ad25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610451565b8251603014611b395760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610451565b611b4285611e2d565b5f80611b896040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612018565b5f82815260058601602052604090209193509150611ba78282612c3c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611bd490859060040161277e565b6020604051808303815f875af1158015611bf0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c1491906127b0565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611c8d57611c8d612748565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061196060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611de857604051631afcd79f60e31b815260040160405180910390fd5b565b611df2611d9f565b611dfb816123e3565b610f8560608201356080830135611e1860c0850160a086016125c3565b611e2860e0860160c08701612cf7565b612404565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612dc58339815191529060ff165f03611e6b575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611eb39083612aeb565b10611ecf576001600160401b0384166040830152808252611eee565b8382604001818151611ee19190612d12565b6001600160401b03169052505b5f826020015183604001516064611f059190612d39565b611f0f9190612d64565b600285015490915060ff9081169082161115611f8a5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610451565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161201257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146120825760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610451565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156120f9576120b9816001612aeb565b6120c49060086129d1565b5081515f908390839081106120db576120db612afe565b60200101906001600160f81b03191690815f1a9053506001016120a5565b505f5b600481101561215757612110816003612aeb565b61211b9060086129d1565b505f82612129836002612b12565b8151811061213957612139612afe565b60200101906001600160f81b03191690815f1a9053506001016120fc565b505f5b60208110156121b4578451816020811061217657612176612afe565b1a60f81b82612186836006612b12565b8151811061219657612196612afe565b60200101906001600160f81b03191690815f1a90535060010161215a565b505f5b602081101561221457846020015181602081106121d6576121d6612afe565b1a60f81b826121e6836026612b12565b815181106121f6576121f6612afe565b60200101906001600160f81b03191690815f1a9053506001016121b7565b505f5b60088110156122885761222b816007612aeb565b6122369060086129d1565b60ff1685604001516001600160401b0316901c60f81b8282604661225a9190612b12565b8151811061226a5761226a612afe565b60200101906001600160f81b03191690815f1a905350600101612217565b505f5b60308110156122f357846080015181815181106122aa576122aa612afe565b01602001516001600160f81b031916826122c583604e612b12565b815181106122d5576122d5612afe565b60200101906001600160f81b03191690815f1a90535060010161228b565b505f5b60088110156123655761230a816007612aeb565b6123159060086129d1565b60608601516001600160401b0390811691161c60f81b8261233783607e612b12565b8151811061234757612347612afe565b60200101906001600160f81b03191690815f1a9053506001016122f6565b506002816040516123769190612d89565b602060405180830381855afa158015612391573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906123b491906127b0565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6123eb611d9f565b6123f3612472565b6123fb612482565b610f858161248a565b61240c611d9f565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61247a611d9f565b611de86124f6565b611de8611d9f565b612492611d9f565b80355f80516020612dc583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556124dc6060830160408401612da4565b600291909101805460ff191660ff90921691909117905550565b6123bd611d9f565b50805461250a906129e8565b5f825580601f10612519575050565b601f0160209004905f5260205f2090810190610f8591905b80821115612544575f8155600101612531565b5090565b5f60e08284031215612558575f80fd5b50919050565b5f6020828403121561256e575f80fd5b5035919050565b803563ffffffff81168114612588575f80fd5b919050565b5f6020828403121561259d575f80fd5b6125a682612575565b9392505050565b80356001600160401b0381168114612588575f80fd5b5f602082840312156125d3575f80fd5b6125a6826125ad565b8015158114610f85575f80fd5b5f805f606084860312156125fb575f80fd5b83359250602084013561260d816125dc565b915061261b60408501612575565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561265a5761265a612624565b60405290565b604051601f8201601f191681016001600160401b038111828210171561268857612688612624565b604052919050565b5f6001600160401b038211156126a8576126a8612624565b50601f01601f191660200190565b5f805f606084860312156126c8575f80fd5b833592506126d8602085016125ad565b915060408401356001600160401b038111156126f2575f80fd5b8401601f81018613612702575f80fd5b803561271561271082612690565b612660565b818152876020838501011115612729575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561277657818101518382015260200161275e565b50505f910152565b602081525f825180602084015261279c81604085016020870161275c565b601f01601f19169190910160400192915050565b5f602082840312156127c0575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826127fd576127fd6127c7565b500490565b6001600160a01b0381168114610f85575f80fd5b8051612588816125dc565b5f8060408385031215612832575f80fd5b82516001600160401b0380821115612848575f80fd5b908401906060828703121561285b575f80fd5b612863612638565b8251815260208084015161287681612802565b8282015260408401518381111561288b575f80fd5b80850194505087601f85011261289f575f80fd5b835192506128af61271084612690565b83815288828587010111156128c2575f80fd5b6128d18483830184880161275c565b806040840152508195506128e6818801612816565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b80820281158282048414176104ee576104ee6127db565b600181811c908216806129fc57607f821691505b60208210810361255857634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612a73816129e8565b806020870152604060018084165f8114612a945760018114612ab057612add565b60ff19851660408a0152604084151560051b8a01019550612add565b895f5260205f205f5b85811015612ad45781548b8201860152908301908801612ab9565b8a016040019650505b509398975050505050505050565b818103818111156104ee576104ee6127db565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104ee576104ee6127db565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610baf57805f5260205f20601f840160051c81016020851015612c1d5750805b601f840160051c820191505b818110156104d7575f8155600101612c29565b81516001600160401b03811115612c5557612c55612624565b612c6981612c6384546129e8565b84612bf8565b602080601f831160018114612c9c575f8415612c855750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b82811015612cca57888601518255948401946001909101908401612cab565b5085821015612ce757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612d07575f80fd5b81356125a681612802565b6001600160401b03818116838216019080821115612d3257612d326127db565b5092915050565b6001600160401b03818116838216028082169190828114612d5c57612d5c6127db565b505092915050565b5f6001600160401b0380841680612d7d57612d7d6127c7565b92169190910492915050565b5f8251612d9a81846020870161275c565b9190910192915050565b5f60208284031215612db4575f80fd5b813560ff811681146125a6575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612fe0380380612fe083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612e938061014d5f395ff3fe60806040526004361061008e575f3560e01c806376f786211161005757806376f786211461015a578063a3a65e4814610179578063b771b3bc14610198578063bee0a03f146101ca578063f40797d7146101e9575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063467ef06f1461010e578063620658561461012d575b5f80fd5b34801561009d575f80fd5b506100b16100ac3660046125ea565b6101fc565b005b3480156100be575f80fd5b506100b16100cd366004612600565b610308565b3480156100dd575f80fd5b506100f16100ec366004612600565b6104de565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b506100b161012836600461262f565b6104f4565b348015610138575f80fd5b5061014c610147366004612665565b61090c565b604051908152602001610105565b348015610165575f80fd5b506100b161017436600461268b565b610925565b348015610184575f80fd5b506100b161019336600461262f565b610c56565b3480156101a3575f80fd5b506101b26005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101d5575f80fd5b506100b16101e4366004612600565b610ee5565b61014c6101f7366004612758565b610ff4565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba86611016565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612e6783398151915293929190829060ff166005811115610368576103686127ea565b6005811115610379576103796127ea565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156103f0576103f06127ea565b1461045a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61046a8483606001515f61102a565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610497908490600401612820565b6020604051808303815f875af11580156104b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d79190612852565b5050505050565b5f6104ee64e8d4a5100083612891565b92915050565b5f5f80516020612e678339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561054f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261057691908101906128c3565b91509150806105975760405162461bcd60e51b815260040161045190612995565b82548251146105b85760405162461bcd60e51b8152600401610451906129db565b60208201516001600160a01b0316156105e35760405162461bcd60e51b815260040161045190612a24565b5f806105f28460400151611247565b9150915080156106575760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610451565b5f828152600686016020526040808220815160e081019092528054829060ff166005811115610688576106886127ea565b6005811115610699576106996127ea565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610712576107126127ea565b1480610730575060018251600581111561072e5761072e6127ea565b145b61078f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610451565b6003825160058111156107a4576107a46127ea565b036107b1575060046107b5565b5060055b6020808301515f908152600789019091526040812055818160058111156107de576107de6127ea565b908160058111156107f1576107f16127ea565b9052505f84815260068801602052604090208251815484929190829060ff19166001836005811115610825576108256127ea565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055815160058111156108d8576108d86127ea565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a35050505050505050565b5f6104ee6001600160401b03831664e8d4a51000612a73565b8115610c48575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610999573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109c091908101906128c3565b9150915080610a235760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610451565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a8a9190612852565b825114610aee5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610451565b60208201516001600160a01b031615610b645760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610451565b5f80610b7384604001516113e8565b91509150818814610be05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610451565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610c51836115c0565b505050565b5f5f80516020612e678339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610cb1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cd891908101906128c3565b9150915080610cf95760405162461bcd60e51b815260040161045190612995565b8254825114610d1a5760405162461bcd60e51b8152600401610451906129db565b60208201516001600160a01b031615610d455760405162461bcd60e51b815260040161045190612a24565b5f80610d548460400151611247565b9150915080610db65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610451565b5f82815260058601602052604081208054610dd090612a8a565b9050118015610e02575060015f83815260068701602052604090205460ff166005811115610e0057610e006127ea565b145b610e1e5760405162461bcd60e51b815260040161045190612abc565b5f8281526005860160205260408120610e36916125a0565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612e67833981519152929190610f2d90612a8a565b9050118015610f5f575060015f83815260068301602052604090205460ff166005811115610f5d57610f5d6127ea565b145b610f7b5760405162461bcd60e51b815260040161045190612abc565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610fb49190600401612b03565b6020604051808303815f875af1158015610fd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c519190612852565b5f80610fff3461194d565b905061100d85828686611a0a565b95945050505050565b61101e611e41565b61102781611e8c565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110a357611063816001612b8d565b61106e906008612a73565b5081515f9083908390811061108557611085612ba0565b60200101906001600160f81b03191690815f1a90535060010161104f565b505f5b6004811015611106576110ba816003612b8d565b6110c5906008612a73565b6001901c60f81b826110d8836002612bb4565b815181106110e8576110e8612ba0565b60200101906001600160f81b03191690815f1a9053506001016110a6565b505f5b60208110156111685761111d81601f612b8d565b611128906008612a73565b86901c60f81b8261113a836006612bb4565b8151811061114a5761114a612ba0565b60200101906001600160f81b03191690815f1a905350600101611109565b505f5b60088110156111d35761117f816007612b8d565b61118a906008612a73565b6001600160401b038616901c60f81b826111a5836026612bb4565b815181106111b5576111b5612ba0565b60200101906001600160f81b03191690815f1a90535060010161116b565b505f5b600881101561123e576111ea816007612b8d565b6111f5906008612a73565b6001600160401b038516901c60f81b8261121083602e612bb4565b8151811061122057611220612ba0565b60200101906001600160f81b03191690815f1a9053506001016111d6565b50949350505050565b5f80825160271461126a5760405162461bcd60e51b815260040161045190612bc7565b5f805b60028110156112b957611281816001612b8d565b61128c906008612a73565b61ffff168582815181106112a2576112a2612ba0565b016020015160f81c901b919091179060010161126d565b5061ffff8116156112dc5760405162461bcd60e51b815260040161045190612c10565b5f805b6004811015611337576112f3816003612b8d565b6112fe906008612a73565b63ffffffff1686611310836002612bb4565b8151811061132057611320612ba0565b016020015160f81c901b91909117906001016112df565b5063ffffffff811660021461135e5760405162461bcd60e51b815260040161045190612c53565b5f805b60208110156113b35761137581601f612b8d565b611380906008612a73565b8761138c836006612bb4565b8151811061139c5761139c612ba0565b016020015160f81c901b9190911790600101611361565b505f866026815181106113c8576113c8612ba0565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461140b5760405162461bcd60e51b815260040161045190612bc7565b5f805b600281101561145a57611422816001612b8d565b61142d906008612a73565b61ffff1685828151811061144357611443612ba0565b016020015160f81c901b919091179060010161140e565b5061ffff81161561147d5760405162461bcd60e51b815260040161045190612c10565b5f805b60048110156114d857611494816003612b8d565b61149f906008612a73565b63ffffffff16866114b1836002612bb4565b815181106114c1576114c1612ba0565b016020015160f81c901b9190911790600101611480565b5063ffffffff81166004146114ff5760405162461bcd60e51b815260040161045190612c53565b5f805b60208110156115545761151681601f612b8d565b611521906008612a73565b8761152d836006612bb4565b8151811061153d5761153d612ba0565b016020015160f81c901b9190911790600101611502565b505f805b60088110156115b35761156c816007612b8d565b611577906008612a73565b6001600160401b03168861158c836026612bb4565b8151811061159c5761159c612ba0565b016020015160f81c901b9190911790600101611558565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612e6783398151915293929190829060ff166005811115611620576116206127ea565b6005811115611631576116316127ea565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156116ab576116ab6127ea565b146117075760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610451565b60408101516001600160a01b0316336001600160a01b0316146117815760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610451565b61178e8160800151611ecf565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156117d2576117d26127ea565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906118899085908361102a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906118b8908590600401612820565b6020604051808303815f875af11580156118d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f89190612852565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00828261197a826104de565b83549091506001600160401b038216108015906119a457508260010154816001600160401b031611155b611a025760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610451565b949350505050565b5f611a13612070565b5f80516020612e67833981519152426001600160401b038516118015611a4d57506001600160401b038416611a4b426202a300612bb4565b115b611aaf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610451565b85611b065760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610451565b5f86815260078201602052604090205415611b745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610451565b8251603014611bdb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610451565b611be485611ecf565b5f80611c2b6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506120ba565b5f82815260058601602052604090209193509150611c498282612cde565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611c76908590600401612820565b6020604051808303815f875af1158015611c92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb69190612852565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611d2f57611d2f6127ea565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a0260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611e8a57604051631afcd79f60e31b815260040160405180910390fd5b565b611e94611e41565b611e9d81612485565b61102760608201356080830135611eba60c0850160a08601612665565b611eca60e0860160c08701612d99565b6124a6565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612e678339815191529060ff165f03611f0d575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611f559083612b8d565b10611f71576001600160401b0384166040830152808252611f90565b8382604001818151611f839190612db4565b6001600160401b03169052505b5f826020015183604001516064611fa79190612ddb565b611fb19190612e06565b600285015490915060ff908116908216111561202c5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610451565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016120b457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146121245760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610451565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561219b5761215b816001612b8d565b612166906008612a73565b5081515f9083908390811061217d5761217d612ba0565b60200101906001600160f81b03191690815f1a905350600101612147565b505f5b60048110156121f9576121b2816003612b8d565b6121bd906008612a73565b505f826121cb836002612bb4565b815181106121db576121db612ba0565b60200101906001600160f81b03191690815f1a90535060010161219e565b505f5b6020811015612256578451816020811061221857612218612ba0565b1a60f81b82612228836006612bb4565b8151811061223857612238612ba0565b60200101906001600160f81b03191690815f1a9053506001016121fc565b505f5b60208110156122b6578460200151816020811061227857612278612ba0565b1a60f81b82612288836026612bb4565b8151811061229857612298612ba0565b60200101906001600160f81b03191690815f1a905350600101612259565b505f5b600881101561232a576122cd816007612b8d565b6122d8906008612a73565b60ff1685604001516001600160401b0316901c60f81b828260466122fc9190612bb4565b8151811061230c5761230c612ba0565b60200101906001600160f81b03191690815f1a9053506001016122b9565b505f5b6030811015612395578460800151818151811061234c5761234c612ba0565b01602001516001600160f81b0319168261236783604e612bb4565b8151811061237757612377612ba0565b60200101906001600160f81b03191690815f1a90535060010161232d565b505f5b6008811015612407576123ac816007612b8d565b6123b7906008612a73565b60608601516001600160401b0390811691161c60f81b826123d983607e612bb4565b815181106123e9576123e9612ba0565b60200101906001600160f81b03191690815f1a905350600101612398565b506002816040516124189190612e2b565b602060405180830381855afa158015612433573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906124569190612852565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61248d611e41565b612495612514565b61249d612524565b6110278161252c565b6124ae611e41565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61251c611e41565b611e8a612598565b611e8a611e41565b612534611e41565b80355f80516020612e6783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561257e6060830160408401612e46565b600291909101805460ff191660ff90921691909117905550565b61245f611e41565b5080546125ac90612a8a565b5f825580601f106125bb575050565b601f0160209004905f5260205f209081019061102791905b808211156125e6575f81556001016125d3565b5090565b5f60e082840312156125fa575f80fd5b50919050565b5f60208284031215612610575f80fd5b5035919050565b803563ffffffff8116811461262a575f80fd5b919050565b5f6020828403121561263f575f80fd5b61264882612617565b9392505050565b80356001600160401b038116811461262a575f80fd5b5f60208284031215612675575f80fd5b6126488261264f565b8015158114611027575f80fd5b5f805f6060848603121561269d575f80fd5b8335925060208401356126af8161267e565b91506126bd60408501612617565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156126fc576126fc6126c6565b60405290565b604051601f8201601f191681016001600160401b038111828210171561272a5761272a6126c6565b604052919050565b5f6001600160401b0382111561274a5761274a6126c6565b50601f01601f191660200190565b5f805f6060848603121561276a575f80fd5b8335925061277a6020850161264f565b915060408401356001600160401b03811115612794575f80fd5b8401601f810186136127a4575f80fd5b80356127b76127b282612732565b612702565b8181528760208385010111156127cb575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612818578181015183820152602001612800565b50505f910152565b602081525f825180602084015261283e8160408501602087016127fe565b601f01601f19169190910160400192915050565b5f60208284031215612862575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261289f5761289f612869565b500490565b6001600160a01b0381168114611027575f80fd5b805161262a8161267e565b5f80604083850312156128d4575f80fd5b82516001600160401b03808211156128ea575f80fd5b90840190606082870312156128fd575f80fd5b6129056126da565b82518152602080840151612918816128a4565b8282015260408401518381111561292d575f80fd5b80850194505087601f850112612941575f80fd5b835192506129516127b284612732565b8381528882858701011115612964575f80fd5b612973848383018488016127fe565b806040840152508195506129888188016128b8565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b80820281158282048414176104ee576104ee61287d565b600181811c90821680612a9e57607f821691505b6020821081036125fa57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612b1581612a8a565b806020870152604060018084165f8114612b365760018114612b5257612b7f565b60ff19851660408a0152604084151560051b8a01019550612b7f565b895f5260205f205f5b85811015612b765781548b8201860152908301908801612b5b565b8a016040019650505b509398975050505050505050565b818103818111156104ee576104ee61287d565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104ee576104ee61287d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610c5157805f5260205f20601f840160051c81016020851015612cbf5750805b601f840160051c820191505b818110156104d7575f8155600101612ccb565b81516001600160401b03811115612cf757612cf76126c6565b612d0b81612d058454612a8a565b84612c9a565b602080601f831160018114612d3e575f8415612d275750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b82811015612d6c57888601518255948401946001909101908401612d4d565b5085821015612d8957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612da9575f80fd5b8135612648816128a4565b6001600160401b03818116838216019080821115612dd457612dd461287d565b5092915050565b6001600160401b03818116838216028082169190828114612dfe57612dfe61287d565b505092915050565b5f6001600160401b0380841680612e1f57612e1f612869565b92169190910492915050565b5f8251612e3c8184602087016127fe565b9190910192915050565b5f60208284031215612e56575f80fd5b813560ff81168114612648575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -826,37 +826,46 @@ func (it *NativeTokenStakingManagerValidationPeriodEndedIterator) Close() error // NativeTokenStakingManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerValidationPeriodEnded struct { ValidationID [32]byte + Status uint8 Raw types.Log // Blockchain specific contextual infos } -// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. // -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte) (*NativeTokenStakingManagerValidationPeriodEndedIterator, error) { +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte, status []uint8) (*NativeTokenStakingManagerValidationPeriodEndedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) if err != nil { return nil, err } return &NativeTokenStakingManagerValidationPeriodEndedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil } -// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. // -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodEnded, validationID [][32]byte) (event.Subscription, error) { +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodEnded, validationID [][32]byte, status []uint8) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) if err != nil { return nil, err } @@ -888,9 +897,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValida }), nil } -// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. // -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*NativeTokenStakingManagerValidationPeriodEnded, error) { event := new(NativeTokenStakingManagerValidationPeriodEnded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 9b1b6164c..6f97175ed 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -38,8 +38,8 @@ type ValidatorManagerSettings 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\":\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161294838038061294883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6127fb8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c806397fb70d41161006e57806397fb70d414610144578063a3a65e4814610157578063b771b3bc1461016a578063bee0a03f14610178578063c151c0b91461018b578063f2fde38b1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063467ef06f146100e5578063715018a6146100f85780638da5cb5b14610100575b5f80fd5b6100bd6100b836600461205f565b6101b1565b005b6100d26100cd366004612123565b610387565b6040519081526020015b60405180910390f35b6100bd6100f33660046121c6565b6103a7565b6100bd61071d565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61015236600461205f565b610730565b6100bd6101653660046121c6565b61073c565b61012c6005600160991b0181565b6100bd61018636600461205f565b6109cb565b6100bd610199366004612204565b610adf565b6100bd6101ac366004612240565b610bed565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206127cf83398151915293929190829060ff1660058111156102115761021161225b565b60058111156102225761022261225b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102995761029961225b565b146103035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103138483606001515f610c27565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610340908490600401612291565b6020604051808303815f875af115801561035c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061038091906122c3565b5050505050565b5f610390610e44565b61039c84868585610e9f565b90505b949350505050565b5f5f805160206127cf8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610402573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261042991908101906122e9565b915091508061044a5760405162461bcd60e51b81526004016102fa906123bb565b825482511461046b5760405162461bcd60e51b81526004016102fa90612401565b60208201516001600160a01b0316156104965760405162461bcd60e51b81526004016102fa9061244a565b5f806104a584604001516112d6565b91509150801561050a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102fa565b5f828152600686016020526040808220815160e081019092528054829060ff16600581111561053b5761053b61225b565b600581111561054c5761054c61225b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156105c5576105c561225b565b036105d2575060046105d6565b5060055b6020808301515f908152600789019091526040812055818160058111156105ff576105ff61225b565b908160058111156106125761061261225b565b9052505f84815260068801602052604090208251815484929190829060ff191660018360058111156106465761064661225b565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555184907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b610725610e44565b61072e5f611535565b565b610739816115a5565b50565b5f5f805160206127cf8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610797573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107be91908101906122e9565b91509150806107df5760405162461bcd60e51b81526004016102fa906123bb565b82548251146108005760405162461bcd60e51b81526004016102fa90612401565b60208201516001600160a01b03161561082b5760405162461bcd60e51b81526004016102fa9061244a565b5f8061083a84604001516112d6565b915091508061089c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102fa565b5f828152600586016020526040812080546108b690612499565b90501180156108e8575060015f83815260068701602052604090205460ff1660058111156108e6576108e661225b565b145b6109045760405162461bcd60e51b81526004016102fa906124d1565b5f828152600586016020526040812061091c91612015565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206127cf833981519152929190610a1390612499565b9050118015610a45575060015f83815260068301602052604090205460ff166005811115610a4357610a4361225b565b145b610a615760405162461bcd60e51b81526004016102fa906124d1565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a9a9190600401612518565b6020604051808303815f875af1158015610ab6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ada91906122c3565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610b235750825b90505f826001600160401b03166001148015610b3e5750303b155b905081158015610b4c575080155b15610b6a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b9457845460ff60401b1916600160401b1785555b610b9e8787611932565b8315610be457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610bf5610e44565b6001600160a01b038116610c1e57604051631e4fbdf760e01b81525f60048201526024016102fa565b61073981611535565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610ca057610c608160016125b6565b610c6b9060086125cf565b5081515f90839083908110610c8257610c826125e6565b60200101906001600160f81b03191690815f1a905350600101610c4c565b505f5b6004811015610d0357610cb78160036125b6565b610cc29060086125cf565b6001901c60f81b82610cd58360026125fa565b81518110610ce557610ce56125e6565b60200101906001600160f81b03191690815f1a905350600101610ca3565b505f5b6020811015610d6557610d1a81601f6125b6565b610d259060086125cf565b86901c60f81b82610d378360066125fa565b81518110610d4757610d476125e6565b60200101906001600160f81b03191690815f1a905350600101610d06565b505f5b6008811015610dd057610d7c8160076125b6565b610d879060086125cf565b6001600160401b038616901c60f81b82610da28360266125fa565b81518110610db257610db26125e6565b60200101906001600160f81b03191690815f1a905350600101610d68565b505f5b6008811015610e3b57610de78160076125b6565b610df29060086125cf565b6001600160401b038516901c60f81b82610e0d83602e6125fa565b81518110610e1d57610e1d6125e6565b60200101906001600160f81b03191690815f1a905350600101610dd3565b50949350505050565b33610e767f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461072e5760405163118cdaa760e01b81523360048201526024016102fa565b5f610ea8611950565b5f805160206127cf833981519152426001600160401b038516118015610ee257506001600160401b038416610ee0426202a3006125fa565b115b610f445760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102fa565b85610f9b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102fa565b5f868152600782016020526040902054156110095760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102fa565b82516030146110705760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102fa565b6110798561199a565b5f806110c06040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611b3b565b5f828152600586016020526040902091935091506110de8282612651565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061110b908590600401612291565b6020604051808303815f875af1158015611127573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061114b91906122c3565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff191660018360058111156111c4576111c461225b565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061039f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f80825160271461133b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016102fa565b5f805b600281101561138a576113528160016125b6565b61135d9060086125cf565b61ffff16858281518110611373576113736125e6565b016020015160f81c901b919091179060010161133e565b5061ffff8116156113e95760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360448201526208125160ea1b60648201526084016102fa565b5f805b6004811015611444576114008160036125b6565b61140b9060086125cf565b63ffffffff168661141d8360026125fa565b8151811061142d5761142d6125e6565b016020015160f81c901b91909117906001016113ec565b5063ffffffff81166002146114ab5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616044820152666765207479706560c81b60648201526084016102fa565b5f805b6020811015611500576114c281601f6125b6565b6114cd9060086125cf565b876114d98360066125fa565b815181106114e9576114e96125e6565b016020015160f81c901b91909117906001016114ae565b505f86602681518110611515576115156125e6565b016020015191976001600160f81b03199092161515965090945050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206127cf83398151915293929190829060ff1660058111156116055761160561225b565b60058111156116165761161661225b565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156116905761169061225b565b146116ec5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102fa565b60408101516001600160a01b0316336001600160a01b0316146117665760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016102fa565b611773816080015161199a565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156117b7576117b761225b565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061186e90859083610c27565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061189d908590600401612291565b6020604051808303815f875af11580156118b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dd91906122c3565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61193a611f06565b61194382611f4f565b61194c81611f70565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161199457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206127cf8339815191529060ff165f036119d8575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611a2090836125b6565b10611a3c576001600160401b0384166040830152808252611a5b565b8382604001818151611a4e9190612710565b6001600160401b03169052505b5f826020015183604001516064611a729190612737565b611a7c9190612762565b600285015490915060ff9081169082161115611af75760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102fa565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611ba55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102fa565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c1c57611bdc8160016125b6565b611be79060086125cf565b5081515f90839083908110611bfe57611bfe6125e6565b60200101906001600160f81b03191690815f1a905350600101611bc8565b505f5b6004811015611c7a57611c338160036125b6565b611c3e9060086125cf565b505f82611c4c8360026125fa565b81518110611c5c57611c5c6125e6565b60200101906001600160f81b03191690815f1a905350600101611c1f565b505f5b6020811015611cd75784518160208110611c9957611c996125e6565b1a60f81b82611ca98360066125fa565b81518110611cb957611cb96125e6565b60200101906001600160f81b03191690815f1a905350600101611c7d565b505f5b6020811015611d375784602001518160208110611cf957611cf96125e6565b1a60f81b82611d098360266125fa565b81518110611d1957611d196125e6565b60200101906001600160f81b03191690815f1a905350600101611cda565b505f5b6008811015611dab57611d4e8160076125b6565b611d599060086125cf565b60ff1685604001516001600160401b0316901c60f81b82826046611d7d91906125fa565b81518110611d8d57611d8d6125e6565b60200101906001600160f81b03191690815f1a905350600101611d3a565b505f5b6030811015611e165784608001518181518110611dcd57611dcd6125e6565b01602001516001600160f81b03191682611de883604e6125fa565b81518110611df857611df86125e6565b60200101906001600160f81b03191690815f1a905350600101611dae565b505f5b6008811015611e8857611e2d8160076125b6565b611e389060086125cf565b60608601516001600160401b0390811691161c60f81b82611e5a83607e6125fa565b81518110611e6a57611e6a6125e6565b60200101906001600160f81b03191690815f1a905350600101611e19565b50600281604051611e999190612793565b602060405180830381855afa158015611eb4573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611ed791906122c3565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661072e57604051631afcd79f60e31b815260040160405180910390fd5b611f57611f06565b611f5f611f81565b611f67611f91565b61073981611f99565b611f78611f06565b61073981612005565b611f89611f06565b61072e61200d565b61072e611f06565b611fa1611f06565b80355f805160206127cf83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155611feb60608301604084016127ae565b600291909101805460ff191660ff90921691909117905550565b610bf5611f06565b611ee0611f06565b50805461202190612499565b5f825580601f10612030575050565b601f0160209004905f5260205f209081019061073991905b8082111561205b575f8155600101612048565b5090565b5f6020828403121561206f575f80fd5b5035919050565b80356001600160401b038116811461208c575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156120c7576120c7612091565b60405290565b604051601f8201601f191681016001600160401b03811182821017156120f5576120f5612091565b604052919050565b5f6001600160401b0382111561211557612115612091565b50601f01601f191660200190565b5f805f8060808587031215612136575f80fd5b61213f85612076565b93506020850135925061215460408601612076565b915060608501356001600160401b0381111561216e575f80fd5b8501601f8101871361217e575f80fd5b803561219161218c826120fd565b6120cd565b8181528860208385010111156121a5575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156121d6575f80fd5b813563ffffffff811681146121e9575f80fd5b9392505050565b6001600160a01b0381168114610739575f80fd5b5f808284036080811215612216575f80fd5b6060811215612223575f80fd5b508291506060830135612235816121f0565b809150509250929050565b5f60208284031215612250575f80fd5b81356121e9816121f0565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612289578181015183820152602001612271565b50505f910152565b602081525f82518060208401526122af81604085016020870161226f565b601f01601f19169190910160400192915050565b5f602082840312156122d3575f80fd5b5051919050565b8051801515811461208c575f80fd5b5f80604083850312156122fa575f80fd5b82516001600160401b0380821115612310575f80fd5b9084019060608287031215612323575f80fd5b61232b6120a5565b8251815260208084015161233e816121f0565b82820152604084015183811115612353575f80fd5b80850194505087601f850112612367575f80fd5b8351925061237761218c846120fd565b838152888285870101111561238a575f80fd5b6123998483830184880161226f565b806040840152508195506123ae8188016122da565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b600181811c908216806124ad57607f821691505b6020821081036124cb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461252a81612499565b806020870152604060018084165f811461254b576001811461256757612594565b60ff19851660408a0152604084151560051b8a01019550612594565b895f5260205f205f5b8581101561258b5781548b8201860152908301908801612570565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156125c9576125c96125a2565b92915050565b80820281158282048414176125c9576125c96125a2565b634e487b7160e01b5f52603260045260245ffd5b808201808211156125c9576125c96125a2565b601f821115610ada57805f5260205f20601f840160051c810160208510156126325750805b601f840160051c820191505b81811015610380575f815560010161263e565b81516001600160401b0381111561266a5761266a612091565b61267e816126788454612499565b8461260d565b602080601f8311600181146126b1575f841561269a5750858301515b5f19600386901b1c1916600185901b178555612708565b5f85815260208120601f198616915b828110156126df578886015182559484019460019091019084016126c0565b50858210156126fc57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115612730576127306125a2565b5092915050565b6001600160401b0381811683821602808216919082811461275a5761275a6125a2565b505092915050565b5f6001600160401b038084168061278757634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516127a481846020870161226f565b9190910192915050565b5f602082840312156127be575f80fd5b813560ff811681146121e9575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516129ea3803806129ea83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61289d8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c806397fb70d41161006e57806397fb70d414610144578063a3a65e4814610157578063b771b3bc1461016a578063bee0a03f14610178578063c151c0b91461018b578063f2fde38b1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063467ef06f146100e5578063715018a6146100f85780638da5cb5b14610100575b5f80fd5b6100bd6100b8366004612101565b6101b1565b005b6100d26100cd3660046121c5565b610387565b6040519081526020015b60405180910390f35b6100bd6100f3366004612268565b6103a7565b6100bd6107bf565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd610152366004612101565b6107d2565b6100bd610165366004612268565b6107de565b61012c6005600160991b0181565b6100bd610186366004612101565b610a6d565b6100bd6101993660046122a6565b610b81565b6100bd6101ac3660046122e2565b610c8f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061287183398151915293929190829060ff166005811115610211576102116122fd565b6005811115610222576102226122fd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c09091015290915081516005811115610299576102996122fd565b146103035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103138483606001515f610cc9565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610340908490600401612333565b6020604051808303815f875af115801561035c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190612365565b5050505050565b5f610390610ee6565b61039c84868585610f41565b90505b949350505050565b5f5f805160206128718339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610402573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610429919081019061238b565b915091508061044a5760405162461bcd60e51b81526004016102fa9061245d565b825482511461046b5760405162461bcd60e51b81526004016102fa906124a3565b60208201516001600160a01b0316156104965760405162461bcd60e51b81526004016102fa906124ec565b5f806104a58460400151611378565b91509150801561050a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102fa565b5f828152600686016020526040808220815160e081019092528054829060ff16600581111561053b5761053b6122fd565b600581111561054c5761054c6122fd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156105c5576105c56122fd565b14806105e357506001825160058111156105e1576105e16122fd565b145b6106425760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016102fa565b600382516005811115610657576106576122fd565b0361066457506004610668565b5060055b6020808301515f90815260078901909152604081205581816005811115610691576106916122fd565b908160058111156106a4576106a46122fd565b9052505f84815260068801602052604090208251815484929190829060ff191660018360058111156106d8576106d86122fd565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790558151600581111561078b5761078b6122fd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a35050505050505050565b6107c7610ee6565b6107d05f6115d7565b565b6107db81611647565b50565b5f5f805160206128718339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610839573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610860919081019061238b565b91509150806108815760405162461bcd60e51b81526004016102fa9061245d565b82548251146108a25760405162461bcd60e51b81526004016102fa906124a3565b60208201516001600160a01b0316156108cd5760405162461bcd60e51b81526004016102fa906124ec565b5f806108dc8460400151611378565b915091508061093e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102fa565b5f828152600586016020526040812080546109589061253b565b905011801561098a575060015f83815260068701602052604090205460ff166005811115610988576109886122fd565b145b6109a65760405162461bcd60e51b81526004016102fa90612573565b5f82815260058601602052604081206109be916120b7565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612871833981519152929190610ab59061253b565b9050118015610ae7575060015f83815260068301602052604090205460ff166005811115610ae557610ae56122fd565b145b610b035760405162461bcd60e51b81526004016102fa90612573565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610b3c91906004016125ba565b6020604051808303815f875af1158015610b58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7c9190612365565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610bc55750825b90505f826001600160401b03166001148015610be05750303b155b905081158015610bee575080155b15610c0c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c3657845460ff60401b1916600160401b1785555b610c4087876119d4565b8315610c8657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610c97610ee6565b6001600160a01b038116610cc057604051631e4fbdf760e01b81525f60048201526024016102fa565b6107db816115d7565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610d4257610d02816001612658565b610d0d906008612671565b5081515f90839083908110610d2457610d24612688565b60200101906001600160f81b03191690815f1a905350600101610cee565b505f5b6004811015610da557610d59816003612658565b610d64906008612671565b6001901c60f81b82610d7783600261269c565b81518110610d8757610d87612688565b60200101906001600160f81b03191690815f1a905350600101610d45565b505f5b6020811015610e0757610dbc81601f612658565b610dc7906008612671565b86901c60f81b82610dd983600661269c565b81518110610de957610de9612688565b60200101906001600160f81b03191690815f1a905350600101610da8565b505f5b6008811015610e7257610e1e816007612658565b610e29906008612671565b6001600160401b038616901c60f81b82610e4483602661269c565b81518110610e5457610e54612688565b60200101906001600160f81b03191690815f1a905350600101610e0a565b505f5b6008811015610edd57610e89816007612658565b610e94906008612671565b6001600160401b038516901c60f81b82610eaf83602e61269c565b81518110610ebf57610ebf612688565b60200101906001600160f81b03191690815f1a905350600101610e75565b50949350505050565b33610f187f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107d05760405163118cdaa760e01b81523360048201526024016102fa565b5f610f4a6119f2565b5f80516020612871833981519152426001600160401b038516118015610f8457506001600160401b038416610f82426202a30061269c565b115b610fe65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102fa565b8561103d5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016102fa565b5f868152600782016020526040902054156110ab5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102fa565b82516030146111125760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102fa565b61111b85611a3c565b5f806111626040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611bdd565b5f8281526005860160205260409020919350915061118082826126f3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906111ad908590600401612333565b6020604051808303815f875af11580156111c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ed9190612365565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611266576112666122fd565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061039f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f8082516027146113dd5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016102fa565b5f805b600281101561142c576113f4816001612658565b6113ff906008612671565b61ffff1685828151811061141557611415612688565b016020015160f81c901b91909117906001016113e0565b5061ffff81161561148b5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016102fa565b5f805b60048110156114e6576114a2816003612658565b6114ad906008612671565b63ffffffff16866114bf83600261269c565b815181106114cf576114cf612688565b016020015160f81c901b919091179060010161148e565b5063ffffffff811660021461154d5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016102fa565b5f805b60208110156115a25761156481601f612658565b61156f906008612671565b8761157b83600661269c565b8151811061158b5761158b612688565b016020015160f81c901b9190911790600101611550565b505f866026815181106115b7576115b7612688565b016020015191976001600160f81b03199092161515965090945050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061287183398151915293929190829060ff1660058111156116a7576116a76122fd565b60058111156116b8576116b86122fd565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c09091015290915081516005811115611732576117326122fd565b1461178e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102fa565b60408101516001600160a01b0316336001600160a01b0316146118085760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016102fa565b6118158160800151611a3c565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115611859576118596122fd565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061191090859083610cc9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061193f908590600401612333565b6020604051808303815f875af115801561195b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061197f9190612365565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b6119dc611fa8565b6119e582611ff1565b6119ee81612012565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a3657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206128718339815191529060ff165f03611a7a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611ac29083612658565b10611ade576001600160401b0384166040830152808252611afd565b8382604001818151611af091906127b2565b6001600160401b03169052505b5f826020015183604001516064611b1491906127d9565b611b1e9190612804565b600285015490915060ff9081169082161115611b995760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102fa565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c475760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102fa565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611cbe57611c7e816001612658565b611c89906008612671565b5081515f90839083908110611ca057611ca0612688565b60200101906001600160f81b03191690815f1a905350600101611c6a565b505f5b6004811015611d1c57611cd5816003612658565b611ce0906008612671565b505f82611cee83600261269c565b81518110611cfe57611cfe612688565b60200101906001600160f81b03191690815f1a905350600101611cc1565b505f5b6020811015611d795784518160208110611d3b57611d3b612688565b1a60f81b82611d4b83600661269c565b81518110611d5b57611d5b612688565b60200101906001600160f81b03191690815f1a905350600101611d1f565b505f5b6020811015611dd95784602001518160208110611d9b57611d9b612688565b1a60f81b82611dab83602661269c565b81518110611dbb57611dbb612688565b60200101906001600160f81b03191690815f1a905350600101611d7c565b505f5b6008811015611e4d57611df0816007612658565b611dfb906008612671565b60ff1685604001516001600160401b0316901c60f81b82826046611e1f919061269c565b81518110611e2f57611e2f612688565b60200101906001600160f81b03191690815f1a905350600101611ddc565b505f5b6030811015611eb85784608001518181518110611e6f57611e6f612688565b01602001516001600160f81b03191682611e8a83604e61269c565b81518110611e9a57611e9a612688565b60200101906001600160f81b03191690815f1a905350600101611e50565b505f5b6008811015611f2a57611ecf816007612658565b611eda906008612671565b60608601516001600160401b0390811691161c60f81b82611efc83607e61269c565b81518110611f0c57611f0c612688565b60200101906001600160f81b03191690815f1a905350600101611ebb565b50600281604051611f3b9190612835565b602060405180830381855afa158015611f56573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f799190612365565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107d057604051631afcd79f60e31b815260040160405180910390fd5b611ff9611fa8565b612001612023565b612009612033565b6107db8161203b565b61201a611fa8565b6107db816120a7565b61202b611fa8565b6107d06120af565b6107d0611fa8565b612043611fa8565b80355f8051602061287183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561208d6060830160408401612850565b600291909101805460ff191660ff90921691909117905550565b610c97611fa8565b611f82611fa8565b5080546120c39061253b565b5f825580601f106120d2575050565b601f0160209004905f5260205f20908101906107db91905b808211156120fd575f81556001016120ea565b5090565b5f60208284031215612111575f80fd5b5035919050565b80356001600160401b038116811461212e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561216957612169612133565b60405290565b604051601f8201601f191681016001600160401b038111828210171561219757612197612133565b604052919050565b5f6001600160401b038211156121b7576121b7612133565b50601f01601f191660200190565b5f805f80608085870312156121d8575f80fd5b6121e185612118565b9350602085013592506121f660408601612118565b915060608501356001600160401b03811115612210575f80fd5b8501601f81018713612220575f80fd5b803561223361222e8261219f565b61216f565b818152886020838501011115612247575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612278575f80fd5b813563ffffffff8116811461228b575f80fd5b9392505050565b6001600160a01b03811681146107db575f80fd5b5f8082840360808112156122b8575f80fd5b60608112156122c5575f80fd5b5082915060608301356122d781612292565b809150509250929050565b5f602082840312156122f2575f80fd5b813561228b81612292565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561232b578181015183820152602001612313565b50505f910152565b602081525f8251806020840152612351816040850160208701612311565b601f01601f19169190910160400192915050565b5f60208284031215612375575f80fd5b5051919050565b8051801515811461212e575f80fd5b5f806040838503121561239c575f80fd5b82516001600160401b03808211156123b2575f80fd5b90840190606082870312156123c5575f80fd5b6123cd612147565b825181526020808401516123e081612292565b828201526040840151838111156123f5575f80fd5b80850194505087601f850112612409575f80fd5b8351925061241961222e8461219f565b838152888285870101111561242c575f80fd5b61243b84838301848801612311565b8060408401525081955061245081880161237c565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b600181811c9082168061254f57607f821691505b60208210810361256d57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546125cc8161253b565b806020870152604060018084165f81146125ed576001811461260957612636565b60ff19851660408a0152604084151560051b8a01019550612636565b895f5260205f205f5b8581101561262d5781548b8201860152908301908801612612565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561266b5761266b612644565b92915050565b808202811582820484141761266b5761266b612644565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561266b5761266b612644565b601f821115610b7c57805f5260205f20601f840160051c810160208510156126d45750805b601f840160051c820191505b81811015610380575f81556001016126e0565b81516001600160401b0381111561270c5761270c612133565b6127208161271a845461253b565b846126af565b602080601f831160018114612753575f841561273c5750858301515b5f19600386901b1c1916600185901b1785556127aa565b5f85815260208120601f198616915b8281101561278157888601518255948401946001909101908401612762565b508582101561279e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b038181168382160190808211156127d2576127d2612644565b5092915050565b6001600160401b038181168382160280821691908281146127fc576127fc612644565b505092915050565b5f6001600160401b038084168061282957634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612846818460208701612311565b9190910192915050565b5f60208284031215612860575f80fd5b813560ff8116811461228b575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -981,37 +981,46 @@ func (it *PoAValidatorManagerValidationPeriodEndedIterator) Close() error { // PoAValidatorManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the PoAValidatorManager contract. type PoAValidatorManagerValidationPeriodEnded struct { ValidationID [32]byte + Status uint8 Raw types.Log // Blockchain specific contextual infos } -// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. // -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte) (*PoAValidatorManagerValidationPeriodEndedIterator, error) { +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte, status []uint8) (*PoAValidatorManagerValidationPeriodEndedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } - logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule) + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) if err != nil { return nil, err } return &PoAValidatorManagerValidationPeriodEndedIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil } -// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. // -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodEnded, validationID [][32]byte) (event.Subscription, error) { +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodEnded, validationID [][32]byte, status []uint8) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } - logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule) + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) if err != nil { return nil, err } @@ -1043,9 +1052,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodEn }), nil } -// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8. +// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. // -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID) +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*PoAValidatorManagerValidationPeriodEnded, error) { event := new(PoAValidatorManagerValidationPeriodEnded) if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 4c2ba694e..0332f7055 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -290,15 +290,16 @@ abstract contract ValidatorManager is ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); require(!validRegistration, "ValidatorManager: registration still valid"); - Validator memory validator = $._validationPeriods[validationID]; ValidatorStatus endStatus; - // The validation status is PendingRemoved if validator removal was initiated with a call to initiateEndValidation. + // The validation status is PendingRemoved if validator removal was initiated with a call to {initiateEndValidation}. // The validation status is PendingAdded if the validator was never registered on the P-Chain. - require(validator.status == ValidatorStatus.PendingRemoved || - validator.status == ValidatorStatus.PendingAdded, - "ValidatorManager: invalid validator status"); + require( + validator.status == ValidatorStatus.PendingRemoved + || validator.status == ValidatorStatus.PendingAdded, + "ValidatorManager: invalid validator status" + ); if (validator.status == ValidatorStatus.PendingRemoved) { endStatus = ValidatorStatus.Completed; diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 80af4cdfa..01e6212ec 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -186,7 +186,7 @@ abstract contract ValidatorManagerTest is Test { DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY ); - bytes memory subnetValidatorRegistrationMessage = + bytes memory subnetValidatorRegistrationMessage = ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); From 07a215f8c28320709b970e8b4d2144c75842954f Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 28 Aug 2024 17:10:52 -0500 Subject: [PATCH 153/545] remove weight checks --- contracts/staking/PoSValidatorManager.sol | 8 -------- 1 file changed, 8 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 2eaae7f99..82b3d1fcb 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -211,10 +211,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Update the validator weight and delegator status Validator memory validator = _getValidator(validationID); - require( - $._delegatorStakes[validationID][delegator].weight + validator.weight == weight, - "PoSValidatorManager: Invalid weight" - ); require(validator.messageNonce >= nonce, "PoSValidatorManager: Invalid nonce"); validator.weight = weight; $._delegatorStakes[validationID][delegator].status = ValidatorStatus.Active; @@ -282,10 +278,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Update the validator weight and delegator status Validator memory validator = _getValidator(validationID); - require( - validator.weight - $._delegatorStakes[validationID][delegator].weight == weight, - "PoSValidatorManager: Invalid weight" - ); require(validator.messageNonce >= nonce, "PoSValidatorManager: Invalid nonce"); $._delegatorStakes[validationID][delegator].status = ValidatorStatus.Completed; validator.weight = weight; From 89da9168226e019a1e77d8a7252795b1baf3f324 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 28 Aug 2024 17:38:19 -0500 Subject: [PATCH 154/545] cleanup --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- .../staking/ERC20TokenStakingManager.sol | 4 +- .../staking/NativeTokenStakingManager.sol | 4 +- contracts/staking/PoSValidatorManager.sol | 86 +++++++++++-------- contracts/staking/ValidatorManager.sol | 6 +- contracts/staking/ValidatorMessages.sol | 6 +- .../interfaces/IPoSValidatorManager.sol | 12 ++- 9 files changed, 70 insertions(+), 54 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index be292adc7..379de0abd 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"validatorWeight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516149af3803806149af83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148628061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063872fda6411610093578063b771b3bc11610063578063b771b3bc14610210578063bee0a03f14610236578063d61bed7414610249578063fdf94a1a1461025c575f80fd5b8063872fda64146101c4578063927e7e75146101d75780639e1bc4ef146101ea578063a3a65e48146101fd575f80fd5b80632e2194d8116100ce5780632e2194d81461014d578063620658561461017d5780636a7e3d831461019e57806376f78621146101b1575f80fd5b80630322ed98146100ff5780630915204e146101145780630b77f6931461012757806327f39ca81461013a575b5f80fd5b61011261010d366004613d0d565b61026f565b005b610112610122366004613d50565b610460565b610112610135366004613d85565b6106a3565b610112610148366004613da8565b6107b5565b61016061015b366004613d0d565b6108c3565b6040516001600160401b0390911681526020015b60405180910390f35b61019061018b366004613df0565b6108d9565b604051908152602001610174565b6101126101ac366004613d85565b6108f2565b6101126101bf366004613e1d565b610a04565b6101906101d2366004613eea565b610d22565b6101126101e5366004613d0d565b610d47565b6101126101f8366004613f86565b611076565b61011261020b366004613fa6565b611090565b61021e6005600160991b0181565b6040516001600160a01b039091168152602001610174565b610112610244366004613d0d565b611249565b610112610257366004613d50565b611358565b61011261026a366004613fbf565b6115b6565b5f8181525f805160206148368339815191526020526040808220815160e0810190925280545f805160206147f683398151915293929190829060ff1660058111156102bc576102bc613fe9565b60058111156102cd576102cd613fe9565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f868152600686019091529081208054929350909161035790613ffd565b9050118015610378575060038151600581111561037657610376613fe9565b145b6103e15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614035565b6020604051808303815f875af1158015610436573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045a91906140bf565b50505050565b5f805160206147d68339815191525f61047884611989565b90505f805f61048a8460400151611b24565b5f83815260068901602090815260408083206001600160a01b038d16845290915281208054949750929550909350916104c290613ffd565b905011801561050f575060035f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff16600581111561050d5761050d613fe9565b145b61052b5760405162461bcd60e51b81526004016103d8906140d6565b5f83815260068601602090815260408083206001600160a01b038a168452909152812061055791613cc3565b5f61056184611d5f565b5f85815260048801602090815260408083206001600160a01b038c16845290915290205460808201519192506001600160401b03808516926105a6929091169061413c565b6001600160401b0316146105cc5760405162461bcd60e51b81526004016103d890614163565b826001600160401b031681606001516001600160401b031610156106025760405162461bcd60e51b81526004016103d8906141a6565b5f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c21b1790556001600160401b038216608082015261064f8482611e5a565b6040516001600160401b03831681526001600160a01b0388169085907fe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513906020015b60405180910390a35050505050505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206147d68339815191529291906106ff90613ffd565b905011801561074c575060015f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff16600581111561074a5761074a613fe9565b145b6107685760405162461bcd60e51b81526004016103d8906141e8565b5f83815260058201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614035565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107f95750825b90505f826001600160401b031660011480156108145750303b155b905081158015610822575080155b156108405760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561086a57845460ff60401b1916600160401b1785555b6108748787611f49565b83156108ba57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6108d364e8d4a5100083614259565b92915050565b5f6108d36001600160401b03831664e8d4a5100061426c565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f805160206147d683398151915292919061094e90613ffd565b905011801561099b575060035f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff16600581111561099957610999613fe9565b145b6109b75760405162461bcd60e51b81526004016103d8906140d6565b5f83815260068201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614035565b8115610d14575f5f805160206147d68339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610a65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610a8c91908101906142b0565b9150915080610aef5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103d8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b5691906140bf565b825114610bba5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103d8565b60208201516001600160a01b031615610c305760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103d8565b5f80610c3f8460400151611f63565b91509150818814610cac5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103d8565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610d1d8361213b565b505050565b5f80610d2d86612448565b9050610d3b858286866124f5565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f805160206147d683398151915293926060830190600160c01b900460ff166005811115610de657610de6613fe9565b6005811115610df757610df7613fe9565b9052509050600281606001516005811115610e1457610e14613fe9565b14610e705760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2044656c656761746f72206e6f742060448201526561637469766560d01b60648201526084016103d8565b600360608201908152426001600160401b0390811660408085019182525f8781526004870160209081528282203383528152919020855181549287015193518516600160801b0267ffffffffffffffff60801b19948616600160401b026001600160801b03199094169190951617919091179182168317815592518493929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836005811115610f2257610f22613fe9565b02179055509050505f610f3484611d5f565b9050815f01516001600160401b031681608001516001600160401b03161015610f6f5760405162461bcd60e51b81526004016103d890614163565b5f610f9385610f7d87612929565b85516080860151610f8e919061413c565b6129a4565b5f86815260068601602090815260408083203384529091529020909150610fba82826143cd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610fe790859060040161448c565b6020604051808303815f875af1158015611003573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102791906140bf565b9050336001600160a01b031681877f2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc24260405161106691815260200190565b60405180910390a4505050505050565b61108c823361108761015b85612bc1565b612bf7565b5050565b5f805160206147f68339815191525f6110a883611989565b90505f806110b98360400151612ef2565b915091508061111b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103d8565b5f8281526005850160205260408120805461113590613ffd565b9050118015611167575060015f83815260078601602052604090205460ff16600581111561116557611165613fe9565b145b6111835760405162461bcd60e51b81526004016103d8906144be565b5f828152600585016020526040812061119b91613cc3565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147f683398151915292919061129190613ffd565b90501180156112c3575060015f83815260078301602052604090205460ff1660058111156112c1576112c1613fe9565b145b6112df5760405162461bcd60e51b81526004016103d8906144be565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916113189190600401614035565b6020604051808303815f875af1158015611334573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1d91906140bf565b5f805160206147d68339815191525f61137084611989565b90505f805f6113828460400151611b24565b5f83815260058901602090815260408083206001600160a01b038d16845290915281208054949750929550909350916113ba90613ffd565b9050118015611407575060015f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff16600581111561140557611405613fe9565b145b6114235760405162461bcd60e51b81526004016103d8906141e8565b5f83815260058601602090815260408083206001600160a01b038a168452909152812061144f91613cc3565b5f61145984611d5f565b60808101515f86815260048901602090815260408083206001600160a01b038d1684529091529020549192506001600160401b038085169261149c929116614505565b6001600160401b0316146114c25760405162461bcd60e51b81526004016103d890614163565b826001600160401b031681606001516001600160401b031610156114f85760405162461bcd60e51b81526004016103d8906141a6565b6001600160401b03821660808201525f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c11b1790556115458482611e5a565b5f84815260048701602090815260408083206001600160a01b038b16808552908352928190205481516001600160401b03918216815290861692810192909252429082015285907fa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a390606001610691565b5f5f805160206147f68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611611573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261163891908101906142b0565b91509150806116595760405162461bcd60e51b81526004016103d890614525565b5f84156116dd575f61166e8460400151613093565b919350909150506001600160401b038116156116d75760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016103d8565b50611753565b5f6116eb8460400151612ef2565b909250905080156117515760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103d8565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561178457611784613fe9565b600581111561179557611795613fe9565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146118265760405162461bcd60e51b81526004016103d89061456b565b5f60038251600581111561183c5761183c613fe9565b148061185a575060028251600581111561185857611858613fe9565b145b1561187d57506020808201515f9081526008870190915260408120556004611881565b5060055b5f83815260078701602052604090208251815484929190829060ff191660018360058111156118b2576118b2613fe9565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051606080820183525f8083526020830181905292820152905f805160206147f68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156119fe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a2591908101906142b0565b9150915080611a465760405162461bcd60e51b81526004016103d890614525565b8254825114611aa95760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103d8565b60208201516001600160a01b031615611b1c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103d8565b509392505050565b5f805f8351603614611b485760405162461bcd60e51b81526004016103d8906145b7565b5f805b6002811015611b9757611b5f816001614600565b611b6a90600861426c565b61ffff16868281518110611b8057611b80614613565b016020015160f81c901b9190911790600101611b4b565b5061ffff811615611bba5760405162461bcd60e51b81526004016103d890614627565b5f805b6004811015611c1557611bd1816003614600565b611bdc90600861426c565b63ffffffff1687611bee83600261466a565b81518110611bfe57611bfe614613565b016020015160f81c901b9190911790600101611bbd565b5063ffffffff8116600314611c3c5760405162461bcd60e51b81526004016103d89061467d565b5f805b6020811015611c9157611c5381601f614600565b611c5e90600861426c565b88611c6a83600661466a565b81518110611c7a57611c7a614613565b016020015160f81c901b9190911790600101611c3f565b505f805b6008811015611cf057611ca9816007614600565b611cb490600861426c565b6001600160401b031689611cc983602661466a565b81518110611cd957611cd9614613565b016020015160f81c901b9190911790600101611c95565b505f805b6008811015611d4f57611d08816007614600565b611d1390600861426c565b6001600160401b03168a611d2883602e61466a565b81518110611d3857611d38614613565b016020015160f81c901b9190911790600101611cf4565b5091989097509095509350505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061483683398151915290528390208351918201909352825491925f805160206147f683398151915292829060ff166005811115611ddf57611ddf613fe9565b6005811115611df057611df0613fe9565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061483683398151915260205260409020815181545f805160206147f68339815191529284929091829060ff19166001836005811115611ea457611ea4613fe9565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b611f516132be565b611f5a82613309565b61108c8161334f565b5f808251602e14611f865760405162461bcd60e51b81526004016103d8906145b7565b5f805b6002811015611fd557611f9d816001614600565b611fa890600861426c565b61ffff16858281518110611fbe57611fbe614613565b016020015160f81c901b9190911790600101611f89565b5061ffff811615611ff85760405162461bcd60e51b81526004016103d890614627565b5f805b60048110156120535761200f816003614600565b61201a90600861426c565b63ffffffff168661202c83600261466a565b8151811061203c5761203c614613565b016020015160f81c901b9190911790600101611ffb565b5063ffffffff811660041461207a5760405162461bcd60e51b81526004016103d89061467d565b5f805b60208110156120cf5761209181601f614600565b61209c90600861426c565b876120a883600661466a565b815181106120b8576120b8614613565b016020015160f81c901b919091179060010161207d565b505f805b600881101561212e576120e7816007614600565b6120f290600861426c565b6001600160401b03168861210783602661466a565b8151811061211757612117614613565b016020015160f81c901b91909117906001016120d3565b5090969095509350505050565b5f8181525f805160206148368339815191526020526040808220815160e0810190925280545f805160206147f683398151915293929190829060ff16600581111561218857612188613fe9565b600581111561219957612199613fe9565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561221357612213613fe9565b146122305760405162461bcd60e51b81526004016103d8906146c4565b60408101516001600160a01b0316336001600160a01b0316146122655760405162461bcd60e51b81526004016103d89061456b565b6122728160800151613403565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156122b6576122b6613fe9565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61236a8461236481612929565b5f6129a4565b5f858152600685016020526040902090915061238682826143cd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906123b390859060040161448c565b6020604051808303815f875af11580156123cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123f391906140bf565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206147d68339815191528161246184612bc1565b90505f61246d826108c3565b83549091506001600160401b0382161080159061249757508260010154816001600160401b031611155b610d3f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103d8565b5f6124fe6135a4565b5f805160206147f6833981519152426001600160401b03851611801561253857506001600160401b038416612536426202a30061466a565b115b61259a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103d8565b856125f15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016103d8565b5f8681526008820160205260409020541561265f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103d8565b82516030146126c65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103d8565b6126cf85613403565b5f806127166040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506135db565b5f8281526005860160205260409020919350915061273482826143cd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061276190859060040161448c565b6020604051808303815f875af115801561277d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a191906140bf565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561281a5761281a613fe9565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556128c383612929565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d3f60015f8051602061481683398151915255565b5f8181525f805160206148368339815191526020526040812060020180545f805160206147f683398151915291600160a01b9091046001600160401b031690819060146129758361470a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612a1d576129dd816001614600565b6129e890600861426c565b5081515f908390839081106129ff576129ff614613565b60200101906001600160f81b03191690815f1a9053506001016129c9565b505f5b6004811015612a8057612a34816003614600565b612a3f90600861426c565b6001901c60f81b82612a5283600261466a565b81518110612a6257612a62614613565b60200101906001600160f81b03191690815f1a905350600101612a20565b505f5b6020811015612ae257612a9781601f614600565b612aa290600861426c565b86901c60f81b82612ab483600661466a565b81518110612ac457612ac4614613565b60200101906001600160f81b03191690815f1a905350600101612a83565b505f5b6008811015612b4d57612af9816007614600565b612b0490600861426c565b6001600160401b038616901c60f81b82612b1f83602661466a565b81518110612b2f57612b2f614613565b60200101906001600160f81b03191690815f1a905350600101612ae5565b505f5b6008811015612bb857612b64816007614600565b612b6f90600861426c565b6001600160401b038516901c60f81b82612b8a83602e61466a565b81518110612b9a57612b9a614613565b60200101906001600160f81b03191690815f1a905350600101612b50565b50949350505050565b5f6108d3827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613993565b612bff6135a4565b5f805160206147d68339815191525f612c1785611d5f565b9050600281516005811115612c2e57612c2e613fe9565b14612c4b5760405162461bcd60e51b81526004016103d8906146c4565b5f85815260048301602090815260408083206001600160a01b03881684529091529020546001600160401b031615612cdc5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2044656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016103d8565b612ce583613403565b5f612d0386612cf388612929565b868560800151610f8e9190614505565b5f87815260058501602090815260408083206001600160a01b038a1684529091529020909150612d3382826143cd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d6090859060040161448c565b6020604051808303815f875af1158015612d7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612da091906140bf565b604080516080810182526001600160401b038089168252421660208201525f9181019190915290915060608101600190525f88815260048601602090815260408083206001600160a01b038b1684528252918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836005811115612e8157612e81613fe9565b021790555050604080516001600160401b03881681524260208201526001600160a01b038916925083918a917ff8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16910160405180910390a450505050610d1d60015f8051602061481683398151915255565b5f808251602714612f155760405162461bcd60e51b81526004016103d8906145b7565b5f805b6002811015612f6457612f2c816001614600565b612f3790600861426c565b61ffff16858281518110612f4d57612f4d614613565b016020015160f81c901b9190911790600101612f18565b5061ffff811615612f875760405162461bcd60e51b81526004016103d890614627565b5f805b6004811015612fe257612f9e816003614600565b612fa990600861426c565b63ffffffff1686612fbb83600261466a565b81518110612fcb57612fcb614613565b016020015160f81c901b9190911790600101612f8a565b5063ffffffff81166002146130095760405162461bcd60e51b81526004016103d89061467d565b5f805b602081101561305e5761302081601f614600565b61302b90600861426c565b8761303783600661466a565b8151811061304757613047614613565b016020015160f81c901b919091179060010161300c565b505f8660268151811061307357613073614613565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146130b75760405162461bcd60e51b81526004016103d8906145b7565b5f805b6002811015613106576130ce816001614600565b6130d990600861426c565b61ffff168682815181106130ef576130ef614613565b016020015160f81c901b91909117906001016130ba565b5061ffff8116156131295760405162461bcd60e51b81526004016103d890614627565b5f805b600481101561318457613140816003614600565b61314b90600861426c565b63ffffffff168761315d83600261466a565b8151811061316d5761316d614613565b016020015160f81c901b919091179060010161312c565b5063ffffffff81166001146131ab5760405162461bcd60e51b81526004016103d89061467d565b5f805b6020811015613200576131c281601f614600565b6131cd90600861426c565b886131d983600661466a565b815181106131e9576131e9614613565b016020015160f81c901b91909117906001016131ae565b505f805b600881101561325f57613218816007614600565b61322390600861426c565b6001600160401b03168961323883602661466a565b8151811061324857613248614613565b016020015160f81c901b9190911790600101613204565b505f805b6008811015611d4f57613277816007614600565b61328290600861426c565b6001600160401b03168a61329783602e61466a565b815181106132a7576132a7614613565b016020015160f81c901b9190911790600101613263565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661330757604051631afcd79f60e31b815260040160405180910390fd5b565b6133116132be565b61331a81613af5565b61334c6060820135608083013561333760c0850160a08601613df0565b61334760e0860160c0870161472f565b613b16565b50565b6133576132be565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166133e35760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103d8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147f68339815191529060ff165f03613441575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906134899083614600565b106134a5576001600160401b03841660408301528082526134c4565b83826040018181516134b79190614505565b6001600160401b03169052505b5f8260200151836040015160646134db919061474a565b6134e59190614775565b600285015490915060ff90811690821611156135605760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103d8565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206148168339815191528054600119016135d557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146136455760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103d8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156136bc5761367c816001614600565b61368790600861426c565b5081515f9083908390811061369e5761369e614613565b60200101906001600160f81b03191690815f1a905350600101613668565b505f5b600481101561371a576136d3816003614600565b6136de90600861426c565b505f826136ec83600261466a565b815181106136fc576136fc614613565b60200101906001600160f81b03191690815f1a9053506001016136bf565b505f5b6020811015613777578451816020811061373957613739614613565b1a60f81b8261374983600661466a565b8151811061375957613759614613565b60200101906001600160f81b03191690815f1a90535060010161371d565b505f5b60208110156137d7578460200151816020811061379957613799614613565b1a60f81b826137a983602661466a565b815181106137b9576137b9614613565b60200101906001600160f81b03191690815f1a90535060010161377a565b505f5b600881101561384b576137ee816007614600565b6137f990600861426c565b60ff1685604001516001600160401b0316901c60f81b8282604661381d919061466a565b8151811061382d5761382d614613565b60200101906001600160f81b03191690815f1a9053506001016137da565b505f5b60308110156138b6578460800151818151811061386d5761386d614613565b01602001516001600160f81b0319168261388883604e61466a565b8151811061389857613898614613565b60200101906001600160f81b03191690815f1a90535060010161384e565b505f5b6008811015613928576138cd816007614600565b6138d890600861426c565b60608601516001600160401b0390811691161c60f81b826138fa83607e61466a565b8151811061390a5761390a614613565b60200101906001600160f81b03191690815f1a9053506001016138b9565b50600281604051613939919061479a565b602060405180830381855afa158015613954573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061397791906140bf565b94909350915050565b60015f8051602061481683398151915255565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139fd91906140bf565b9050613a146001600160a01b038516333086613b71565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a7c91906140bf565b9050818111613ae25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103d8565b613aec8282614600565b95945050505050565b613afd6132be565b613b05613bcb565b613b0d613bdb565b61334c81613be3565b613b1e6132be565b5f5f805160206147d6833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261045a908590613c4f565b613bd36132be565b613307613cbb565b6133076132be565b613beb6132be565b80355f805160206147f683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613c3560608301604084016147b5565b600291909101805460ff191660ff90921691909117905550565b5f8060205f8451602086015f885af180613c6e576040513d5f823e3d81fd5b50505f513d91508115613c85578060011415613c92565b6001600160a01b0384163b155b1561045a57604051635274afe760e01b81526001600160a01b03851660048201526024016103d8565b6139806132be565b508054613ccf90613ffd565b5f825580601f10613cde575050565b601f0160209004905f5260205f209081019061334c91905b80821115613d09575f8155600101613cf6565b5090565b5f60208284031215613d1d575f80fd5b5035919050565b803563ffffffff81168114613d37575f80fd5b919050565b6001600160a01b038116811461334c575f80fd5b5f8060408385031215613d61575f80fd5b613d6a83613d24565b91506020830135613d7a81613d3c565b809150509250929050565b5f8060408385031215613d96575f80fd5b823591506020830135613d7a81613d3c565b5f80828403610100811215613dbb575f80fd5b60e0811215613dc8575f80fd5b5082915060e0830135613d7a81613d3c565b80356001600160401b0381168114613d37575f80fd5b5f60208284031215613e00575f80fd5b613e0982613dda565b9392505050565b801515811461334c575f80fd5b5f805f60608486031215613e2f575f80fd5b833592506020840135613e4181613e10565b9150613e4f60408501613d24565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e8e57613e8e613e58565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613ebc57613ebc613e58565b604052919050565b5f6001600160401b03821115613edc57613edc613e58565b50601f01601f191660200190565b5f805f8060808587031215613efd575f80fd5b8435935060208501359250613f1460408601613dda565b915060608501356001600160401b03811115613f2e575f80fd5b8501601f81018713613f3e575f80fd5b8035613f51613f4c82613ec4565b613e94565b818152886020838501011115613f65575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613f97575f80fd5b50508035926020909101359150565b5f60208284031215613fb6575f80fd5b613e0982613d24565b5f8060408385031215613fd0575f80fd5b613fd983613d24565b91506020830135613d7a81613e10565b634e487b7160e01b5f52602160045260245ffd5b600181811c9082168061401157607f821691505b60208210810361402f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461404781613ffd565b806020870152604060018084165f81146140685760018114614084576140b1565b60ff19851660408a0152604084151560051b8a010195506140b1565b895f5260205f205f5b858110156140a85781548b820186015290830190880161408d565b8a016040019650505b509398975050505050505050565b5f602082840312156140cf575f80fd5b5051919050565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f722072604082015271656d6f76616c206e6f742070656e64696e6760701b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561415c5761415c614128565b5092915050565b60208082526023908201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960408201526219da1d60ea1b606082015260800190565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20496e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526037908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f72207260408201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261426757614267614245565b500490565b80820281158282048414176108d3576108d3614128565b5f5b8381101561429d578181015183820152602001614285565b50505f910152565b8051613d3781613e10565b5f80604083850312156142c1575f80fd5b82516001600160401b03808211156142d7575f80fd5b90840190606082870312156142ea575f80fd5b6142f2613e6c565b8251815260208084015161430581613d3c565b8282015260408401518381111561431a575f80fd5b80850194505087601f85011261432e575f80fd5b8351925061433e613f4c84613ec4565b8381528882858701011115614351575f80fd5b61436084838301848801614283565b806040840152508195506143758188016142a5565b9450505050509250929050565b601f821115610d1d57805f5260205f20601f840160051c810160208510156143a75750805b601f840160051c820191505b818110156143c6575f81556001016143b3565b5050505050565b81516001600160401b038111156143e6576143e6613e58565b6143fa816143f48454613ffd565b84614382565b602080601f83116001811461442d575f84156144165750858301515b5f19600386901b1c1916600185901b178555614484565b5f85815260208120601f198616915b8281101561445b5788860151825594840194600190910190840161443c565b508582101561447857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526144aa816040850160208701614283565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160401b0381811683821601908082111561415c5761415c614128565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156108d3576108d3614128565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156108d3576108d3614128565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361472557614725614128565b6001019392505050565b5f6020828403121561473f575f80fd5b8135613e0981613d3c565b6001600160401b0381811683821602808216919082811461476d5761476d614128565b505092915050565b5f6001600160401b038084168061478e5761478e614245565b92169190910492915050565b5f82516147ab818460208701614283565b9190910192915050565b5f602082840312156147c5575f80fd5b813560ff81168114613e09575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161497138038061497183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148248061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063872fda6411610093578063b771b3bc11610063578063b771b3bc14610210578063bee0a03f14610236578063d61bed7414610249578063fdf94a1a1461025c575f80fd5b8063872fda64146101c4578063927e7e75146101d75780639e1bc4ef146101ea578063a3a65e48146101fd575f80fd5b80632e2194d8116100ce5780632e2194d81461014d578063620658561461017d5780636a7e3d831461019e57806376f78621146101b1575f80fd5b80630322ed98146100ff5780630915204e146101145780630b77f6931461012757806327f39ca81461013a575b5f80fd5b61011261010d366004613e4d565b61026f565b005b610112610122366004613e90565b610460565b610112610135366004613ec5565b6105a9565b610112610148366004613ee8565b61062b565b61016061015b366004613e4d565b610739565b6040516001600160401b0390911681526020015b60405180910390f35b61019061018b366004613f30565b61074f565b604051908152602001610174565b6101126101ac366004613ec5565b610768565b6101126101bf366004613f5d565b6107ea565b6101906101d236600461402a565b610b08565b6101126101e5366004613e4d565b610b2d565b6101126101f83660046140c6565b610eb8565b61011261020b3660046140e6565b610ec7565b61021e6005600160991b0181565b6040516001600160a01b039091168152602001610174565b610112610244366004613e4d565b611080565b610112610257366004613e90565b61118f565b61011261026a3660046140ff565b6112f5565b5f8181525f805160206147f88339815191526020526040808220815160e0810190925280545f805160206147b883398151915293929190829060ff1660058111156102bc576102bc614129565b60058111156102cd576102cd614129565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916103579061413d565b9050118015610378575060038151600581111561037657610376614129565b145b6103e15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614175565b6020604051808303815f875af1158015610436573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045a91906141ff565b50505050565b5f805160206147988339815191525f61047884611707565b90505f805f61048a84604001516118e8565b92509250925061049a8387611be1565b5f83815260068601602090815260408083206001600160a01b038a16845290915281206104c691613e03565b5f6104d084611cf2565b9050826001600160401b031681606001516001600160401b031610156105085760405162461bcd60e51b81526004016103d890614216565b5f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c21b1790556001600160401b03821660808201526105558482611ded565b6040516001600160401b03831681526001600160a01b0388169085907fe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513906020015b60405180910390a35050505050505050565b6105b38282611edc565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614798833981519152916005600160991b019163ee5b48eb9161041a91600401614175565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561066f5750825b90505f826001600160401b0316600114801561068a5750303b155b905081158015610698575080155b156106b65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156106e057845460ff60401b1916600160401b1785555b6106ea8787611ff8565b831561073057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61074964e8d4a5100083614280565b92915050565b5f6107496001600160401b03831664e8d4a51000614293565b6107728282611be1565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614798833981519152916005600160991b019163ee5b48eb9161041a91600401614175565b8115610afa575f5f805160206147988339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561084b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261087291908101906142d7565b91509150806108d55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103d8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610918573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093c91906141ff565b8251146109a05760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103d8565b60208201516001600160a01b031615610a165760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103d8565b5f80610a258460400151612012565b91509150818814610a925760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103d8565b5f888152600786016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610b03836121ea565b505050565b5f80610b1386612536565b9050610b21858286866125e3565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f8051602061479883398151915293926060830190600160c01b900460ff166004811115610bcc57610bcc614129565b6004811115610bdd57610bdd614129565b9052509050600281606001516004811115610bfa57610bfa614129565b14610c565760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b60648201526084016103d8565b60036060820181905250426001600160401b03166040828101919091525f848152600484016020529081208291336001600160a01b0316815260208082019290925260409081015f208351815493850151928501516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990961691909216179390931791821683178155606084015190929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836004811115610d2957610d29614129565b02179055509050505f610d3b84611cf2565b9050815f01516001600160401b031681608001516001600160401b031611610db15760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016103d8565b5f610dd585610dbf87612a17565b85516080860151610dd091906143a9565b612a92565b5f86815260068601602090815260408083203384529091529020909150610dfc828261441b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610e299085906004016144da565b6020604051808303815f875af1158015610e45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6991906141ff565b9050336001600160a01b031681877f2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc242604051610ea891815260200190565b60405180910390a4505050505050565b610ec3823383612caf565b5050565b5f805160206147b88339815191525f610edf83611707565b90505f80610ef08360400151612ffc565b9150915080610f525760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103d8565b5f82815260058501602052604081208054610f6c9061413d565b9050118015610f9e575060015f83815260078601602052604090205460ff166005811115610f9c57610f9c614129565b145b610fba5760405162461bcd60e51b81526004016103d89061450c565b5f8281526005850160205260408120610fd291613e03565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147b88339815191529291906110c89061413d565b90501180156110fa575060015f83815260078301602052604090205460ff1660058111156110f8576110f8614129565b145b6111165760405162461bcd60e51b81526004016103d89061450c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161114f9190600401614175565b6020604051808303815f875af115801561116b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b0391906141ff565b5f805160206147988339815191525f6111a784611707565b90505f805f6111b984604001516118e8565b9250925092506111c98387611edc565b5f83815260058601602090815260408083206001600160a01b038a16845290915281206111f591613e03565b5f6111ff84611cf2565b9050826001600160401b031681606001516001600160401b031610156112375760405162461bcd60e51b81526004016103d890614216565b6001600160401b03821660808201525f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c11b1790556112848482611ded565b5f84815260048701602090815260408083206001600160a01b038b16808552908352928190205481516001600160401b03918216815290861692810192909252429082015285907fa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a390606001610597565b5f5f805160206147b88339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611350573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261137791908101906142d7565b91509150806113d75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103d8565b5f841561145b575f6113ec846040015161319d565b919350909150506001600160401b038116156114555760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016103d8565b506114d1565b5f6114698460400151612ffc565b909250905080156114cf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103d8565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561150257611502614129565b600581111561151357611513614129565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146115a45760405162461bcd60e51b81526004016103d890614553565b5f6003825160058111156115ba576115ba614129565b14806115d857506002825160058111156115d6576115d6614129565b145b156115fb57506020808201515f90815260088701909152604081205560046115ff565b5060055b5f83815260078701602052604090208251815484929190829060ff1916600183600581111561163057611630614129565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051606080820183525f8083526020830181905292820152905f805160206147b88339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561177c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117a391908101906142d7565b915091508061180a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103d8565b825482511461186d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103d8565b60208201516001600160a01b0316156118e05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103d8565b509392505050565b5f805f835160361461194e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103d8565b5f805b600281101561199d5761196581600161459f565b611970906008614293565b61ffff16868281518110611986576119866145b2565b016020015160f81c901b9190911790600101611951565b5061ffff8116156119fc5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103d8565b5f805b6004811015611a5757611a1381600361459f565b611a1e906008614293565b63ffffffff1687611a308360026145c6565b81518110611a4057611a406145b2565b016020015160f81c901b91909117906001016119ff565b5063ffffffff8116600314611abe5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103d8565b5f805b6020811015611b1357611ad581601f61459f565b611ae0906008614293565b88611aec8360066145c6565b81518110611afc57611afc6145b2565b016020015160f81c901b9190911790600101611ac1565b505f805b6008811015611b7257611b2b81600761459f565b611b36906008614293565b6001600160401b031689611b4b8360266145c6565b81518110611b5b57611b5b6145b2565b016020015160f81c901b9190911790600101611b17565b505f805b6008811015611bd157611b8a81600761459f565b611b95906008614293565b6001600160401b03168a611baa83602e6145c6565b81518110611bba57611bba6145b2565b016020015160f81c901b9190911790600101611b76565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f80516020614798833981519152929190611c3d9061413d565b9050118015611c8b575060035f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611c8957611c89614129565b145b610b035760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016103d8565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206147f883398151915290528390208351918201909352825491925f805160206147b883398151915292829060ff166005811115611d7257611d72614129565b6005811115611d8357611d83614129565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f805160206147f883398151915260205260409020815181545f805160206147b88339815191529284929091829060ff19166001836005811115611e3757611e37614129565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f80516020614798833981519152929190611f389061413d565b9050118015611f86575060015f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611f8457611f84614129565b145b610b035760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016103d8565b6120006133c8565b61200982613413565b610ec381613459565b5f808251602e146120355760405162461bcd60e51b81526004016103d8906145d9565b5f805b60028110156120845761204c81600161459f565b612057906008614293565b61ffff1685828151811061206d5761206d6145b2565b016020015160f81c901b9190911790600101612038565b5061ffff8116156120a75760405162461bcd60e51b81526004016103d890614622565b5f805b6004811015612102576120be81600361459f565b6120c9906008614293565b63ffffffff16866120db8360026145c6565b815181106120eb576120eb6145b2565b016020015160f81c901b91909117906001016120aa565b5063ffffffff81166004146121295760405162461bcd60e51b81526004016103d890614665565b5f805b602081101561217e5761214081601f61459f565b61214b906008614293565b876121578360066145c6565b81518110612167576121676145b2565b016020015160f81c901b919091179060010161212c565b505f805b60088110156121dd5761219681600761459f565b6121a1906008614293565b6001600160401b0316886121b68360266145c6565b815181106121c6576121c66145b2565b016020015160f81c901b9190911790600101612182565b5090969095509350505050565b5f8181525f805160206147f88339815191526020526040808220815160e0810190925280545f805160206147b883398151915293929190829060ff16600581111561223757612237614129565b600581111561224857612248614129565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156122c2576122c2614129565b1461231e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103d8565b60408101516001600160a01b0316336001600160a01b0316146123535760405162461bcd60e51b81526004016103d890614553565b612360816080015161350d565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123a4576123a4614129565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124588461245281612a17565b5f612a92565b5f8581526006850160205260409020909150612474828261441b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124a19085906004016144da565b6020604051808303815f875af11580156124bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124e191906141ff565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206147988339815191528161254f846136ae565b90505f61255b82610739565b83549091506001600160401b0382161080159061258557508260010154816001600160401b031611155b610b255760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103d8565b5f6125ec6136e4565b5f805160206147b8833981519152426001600160401b03851611801561262657506001600160401b038416612624426202a3006145c6565b115b6126885760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103d8565b856126df5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016103d8565b5f8681526008820160205260409020541561274d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103d8565b82516030146127b45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103d8565b6127bd8561350d565b5f806128046040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061371b565b5f82815260058601602052604090209193509150612822828261441b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061284f9085906004016144da565b6020604051808303815f875af115801561286b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288f91906141ff565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561290857612908614129565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556129b183612a17565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610b2560015f805160206147d883398151915255565b5f8181525f805160206147f88339815191526020526040812060020180545f805160206147b883398151915291600160a01b9091046001600160401b03169081906014612a63836146ac565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612b0b57612acb81600161459f565b612ad6906008614293565b5081515f90839083908110612aed57612aed6145b2565b60200101906001600160f81b03191690815f1a905350600101612ab7565b505f5b6004811015612b6e57612b2281600361459f565b612b2d906008614293565b6001901c60f81b82612b408360026145c6565b81518110612b5057612b506145b2565b60200101906001600160f81b03191690815f1a905350600101612b0e565b505f5b6020811015612bd057612b8581601f61459f565b612b90906008614293565b86901c60f81b82612ba28360066145c6565b81518110612bb257612bb26145b2565b60200101906001600160f81b03191690815f1a905350600101612b71565b505f5b6008811015612c3b57612be781600761459f565b612bf2906008614293565b6001600160401b038616901c60f81b82612c0d8360266145c6565b81518110612c1d57612c1d6145b2565b60200101906001600160f81b03191690815f1a905350600101612bd3565b505f5b6008811015612ca657612c5281600761459f565b612c5d906008614293565b6001600160401b038516901c60f81b82612c7883602e6145c6565b81518110612c8857612c886145b2565b60200101906001600160f81b03191690815f1a905350600101612c3e565b50949350505050565b612cb76136e4565b5f612cc461015b836136ae565b90505f805160206147988339815191525f612cde86611cf2565b9050600281516005811115612cf557612cf5614129565b14612d515760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103d8565b5f86815260048301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612de25760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016103d8565b612deb8361350d565b5f612e0987612df989612a17565b868560800151610dd091906146d1565b5f88815260058501602090815260408083206001600160a01b038b1684529091529020909150612e39828261441b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e669085906004016144da565b6020604051808303815f875af1158015612e82573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ea691906141ff565b604080516080810182526001600160401b038089168252421660208201525f9181019190915290915060608101600190525f8981526004808701602090815260408084206001600160a01b038d1685528252928390208451815492860151948601516001600160401b03908116600160801b0267ffffffffffffffff60801b19968216600160401b026001600160801b031990951691909216179290921793841682178155606085015190939092849260ff60c01b191668ffffffffffffffffff60801b199092169190911790600160c01b908490811115612f8a57612f8a614129565b021790555050604080516001600160401b03881681524260208201526001600160a01b038a16925083918b917ff8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16910160405180910390a45050505050610b0360015f805160206147d883398151915255565b5f80825160271461301f5760405162461bcd60e51b81526004016103d8906145d9565b5f805b600281101561306e5761303681600161459f565b613041906008614293565b61ffff16858281518110613057576130576145b2565b016020015160f81c901b9190911790600101613022565b5061ffff8116156130915760405162461bcd60e51b81526004016103d890614622565b5f805b60048110156130ec576130a881600361459f565b6130b3906008614293565b63ffffffff16866130c58360026145c6565b815181106130d5576130d56145b2565b016020015160f81c901b9190911790600101613094565b5063ffffffff81166002146131135760405162461bcd60e51b81526004016103d890614665565b5f805b60208110156131685761312a81601f61459f565b613135906008614293565b876131418360066145c6565b81518110613151576131516145b2565b016020015160f81c901b9190911790600101613116565b505f8660268151811061317d5761317d6145b2565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146131c15760405162461bcd60e51b81526004016103d8906145d9565b5f805b6002811015613210576131d881600161459f565b6131e3906008614293565b61ffff168682815181106131f9576131f96145b2565b016020015160f81c901b91909117906001016131c4565b5061ffff8116156132335760405162461bcd60e51b81526004016103d890614622565b5f805b600481101561328e5761324a81600361459f565b613255906008614293565b63ffffffff16876132678360026145c6565b81518110613277576132776145b2565b016020015160f81c901b9190911790600101613236565b5063ffffffff81166001146132b55760405162461bcd60e51b81526004016103d890614665565b5f805b602081101561330a576132cc81601f61459f565b6132d7906008614293565b886132e38360066145c6565b815181106132f3576132f36145b2565b016020015160f81c901b91909117906001016132b8565b505f805b60088110156133695761332281600761459f565b61332d906008614293565b6001600160401b0316896133428360266145c6565b81518110613352576133526145b2565b016020015160f81c901b919091179060010161330e565b505f805b6008811015611bd15761338181600761459f565b61338c906008614293565b6001600160401b03168a6133a183602e6145c6565b815181106133b1576133b16145b2565b016020015160f81c901b919091179060010161336d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661341157604051631afcd79f60e31b815260040160405180910390fd5b565b61341b6133c8565b61342481613ad3565b6134566060820135608083013561344160c0850160a08601613f30565b61345160e0860160c087016146f1565b613af4565b50565b6134616133c8565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166134ed5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103d8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147b88339815191529060ff165f0361354b575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613593908361459f565b106135af576001600160401b03841660408301528082526135ce565b83826040018181516135c191906146d1565b6001600160401b03169052505b5f8260200151836040015160646135e5919061470c565b6135ef9190614737565b600285015490915060ff908116908216111561366a5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103d8565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610749827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b4f565b5f805160206147d883398151915280546001190161371557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146137855760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103d8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137fc576137bc81600161459f565b6137c7906008614293565b5081515f908390839081106137de576137de6145b2565b60200101906001600160f81b03191690815f1a9053506001016137a8565b505f5b600481101561385a5761381381600361459f565b61381e906008614293565b505f8261382c8360026145c6565b8151811061383c5761383c6145b2565b60200101906001600160f81b03191690815f1a9053506001016137ff565b505f5b60208110156138b75784518160208110613879576138796145b2565b1a60f81b826138898360066145c6565b81518110613899576138996145b2565b60200101906001600160f81b03191690815f1a90535060010161385d565b505f5b602081101561391757846020015181602081106138d9576138d96145b2565b1a60f81b826138e98360266145c6565b815181106138f9576138f96145b2565b60200101906001600160f81b03191690815f1a9053506001016138ba565b505f5b600881101561398b5761392e81600761459f565b613939906008614293565b60ff1685604001516001600160401b0316901c60f81b8282604661395d91906145c6565b8151811061396d5761396d6145b2565b60200101906001600160f81b03191690815f1a90535060010161391a565b505f5b60308110156139f657846080015181815181106139ad576139ad6145b2565b01602001516001600160f81b031916826139c883604e6145c6565b815181106139d8576139d86145b2565b60200101906001600160f81b03191690815f1a90535060010161398e565b505f5b6008811015613a6857613a0d81600761459f565b613a18906008614293565b60608601516001600160401b0390811691161c60f81b82613a3a83607e6145c6565b81518110613a4a57613a4a6145b2565b60200101906001600160f81b03191690815f1a9053506001016139f9565b50600281604051613a79919061475c565b602060405180830381855afa158015613a94573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613ab791906141ff565b94909350915050565b60015f805160206147d883398151915255565b613adb6133c8565b613ae3613cb1565b613aeb613cc1565b61345681613cc9565b613afc6133c8565b5f5f80516020614798833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613b95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bb991906141ff565b9050613bd06001600160a01b038516333086613d35565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c3891906141ff565b9050818111613c9e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103d8565b613ca8828261459f565b95945050505050565b613cb96133c8565b613411613d8f565b6134116133c8565b613cd16133c8565b80355f805160206147b883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613d1b6060830160408401614777565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261045a908590613d97565b613ac06133c8565b5f8060205f8451602086015f885af180613db6576040513d5f823e3d81fd5b50505f513d91508115613dcd578060011415613dda565b6001600160a01b0384163b155b1561045a57604051635274afe760e01b81526001600160a01b03851660048201526024016103d8565b508054613e0f9061413d565b5f825580601f10613e1e575050565b601f0160209004905f5260205f209081019061345691905b80821115613e49575f8155600101613e36565b5090565b5f60208284031215613e5d575f80fd5b5035919050565b803563ffffffff81168114613e77575f80fd5b919050565b6001600160a01b0381168114613456575f80fd5b5f8060408385031215613ea1575f80fd5b613eaa83613e64565b91506020830135613eba81613e7c565b809150509250929050565b5f8060408385031215613ed6575f80fd5b823591506020830135613eba81613e7c565b5f80828403610100811215613efb575f80fd5b60e0811215613f08575f80fd5b5082915060e0830135613eba81613e7c565b80356001600160401b0381168114613e77575f80fd5b5f60208284031215613f40575f80fd5b613f4982613f1a565b9392505050565b8015158114613456575f80fd5b5f805f60608486031215613f6f575f80fd5b833592506020840135613f8181613f50565b9150613f8f60408501613e64565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613fce57613fce613f98565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613ffc57613ffc613f98565b604052919050565b5f6001600160401b0382111561401c5761401c613f98565b50601f01601f191660200190565b5f805f806080858703121561403d575f80fd5b843593506020850135925061405460408601613f1a565b915060608501356001600160401b0381111561406e575f80fd5b8501601f8101871361407e575f80fd5b803561409161408c82614004565b613fd4565b8181528860208385010111156140a5575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156140d7575f80fd5b50508035926020909101359150565b5f602082840312156140f6575f80fd5b613f4982613e64565b5f8060408385031215614110575f80fd5b61411983613e64565b91506020830135613eba81613f50565b634e487b7160e01b5f52602160045260245ffd5b600181811c9082168061415157607f821691505b60208210810361416f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546141878161413d565b806020870152604060018084165f81146141a857600181146141c4576141f1565b60ff19851660408a0152604084151560051b8a010195506141f1565b895f5260205f205f5b858110156141e85781548b82018601529083019088016141cd565b8a016040019650505b509398975050505050505050565b5f6020828403121561420f575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261428e5761428e614258565b500490565b80820281158282048414176107495761074961426c565b5f5b838110156142c45781810151838201526020016142ac565b50505f910152565b8051613e7781613f50565b5f80604083850312156142e8575f80fd5b82516001600160401b03808211156142fe575f80fd5b9084019060608287031215614311575f80fd5b614319613fac565b8251815260208084015161432c81613e7c565b82820152604084015183811115614341575f80fd5b80850194505087601f850112614355575f80fd5b8351925061436561408c84614004565b8381528882858701011115614378575f80fd5b614387848383018488016142aa565b8060408401525081955061439c8188016142cc565b9450505050509250929050565b6001600160401b038281168282160390808211156143c9576143c961426c565b5092915050565b601f821115610b0357805f5260205f20601f840160051c810160208510156143f55750805b601f840160051c820191505b81811015614414575f8155600101614401565b5050505050565b81516001600160401b0381111561443457614434613f98565b61444881614442845461413d565b846143d0565b602080601f83116001811461447b575f84156144645750858301515b5f19600386901b1c1916600185901b1785556144d2565b5f85815260208120601f198616915b828110156144a95788860151825594840194600190910190840161448a565b50858210156144c657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526144f88160408501602087016142aa565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156107495761074961426c565b634e487b7160e01b5f52603260045260245ffd5b808201808211156107495761074961426c565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b038083168181036146c7576146c761426c565b6001019392505050565b6001600160401b038181168382160190808211156143c9576143c961426c565b5f60208284031215614701575f80fd5b8135613f4981613e7c565b6001600160401b0381811683821602808216919082811461472f5761472f61426c565b505092915050565b5f6001600160401b038084168061475057614750614258565b92169190910492915050565b5f825161476d8184602087016142aa565b9190910192915050565b5f60208284031215614787575f80fd5b813560ff81168114613f49575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index b3f04fdfc..857b67bad 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"validatorWeight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516146d03803806146d083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145838061014d5f395ff3fe6080604052600436106100ee575f3560e01c8063927e7e7511610087578063c599e24f11610057578063c599e24f146102a6578063d61bed74146102b9578063f40797d7146102d8578063fdf94a1a146102eb575f80fd5b8063927e7e7514610217578063a3a65e4814610236578063b771b3bc14610255578063bee0a03f14610287575f80fd5b80632e2194d8116100c25780632e2194d81461017057806362065856146101ac5780636a7e3d83146101d957806376f78621146101f8575f80fd5b8062e41792146100f25780630322ed98146101135780630915204e146101325780630b77f69314610151575b5f80fd5b3480156100fd575f80fd5b5061011161010c366004613a7e565b61030a565b005b34801561011e575f80fd5b5061011161012d366004613a94565b610416565b34801561013d575f80fd5b5061011161014c366004613ad7565b610607565b34801561015c575f80fd5b5061011161016b366004613b0c565b61084a565b34801561017b575f80fd5b5061018f61018a366004613a94565b61095c565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101b7575f80fd5b506101cb6101c6366004613b45565b610972565b6040519081526020016101a3565b3480156101e4575f80fd5b506101116101f3366004613b0c565b61098b565b348015610203575f80fd5b50610111610212366004613b72565b610a9d565b348015610222575f80fd5b50610111610231366004613a94565b610dbb565b348015610241575f80fd5b50610111610250366004613bad565b6110ea565b348015610260575f80fd5b5061026f6005600160991b0181565b6040516001600160a01b0390911681526020016101a3565b348015610292575f80fd5b506101116102a1366004613a94565b6112a3565b6101116102b4366004613a94565b6113b2565b3480156102c4575f80fd5b506101116102d3366004613ad7565b6113c8565b6101cb6102e6366004613c58565b611626565b3480156102f6575f80fd5b50610111610305366004613cea565b611648565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561034e5750825b90505f826001600160401b031660011480156103695750303b155b905081158015610377575080155b156103955760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103bf57845460ff60401b1916600160401b1785555b6103c886611a1b565b831561040e57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181525f805160206145578339815191526020526040808220815160e0810190925280545f8051602061451783398151915293929190829060ff16600581111561046357610463613d14565b600581111561047457610474613d14565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916104fe90613d28565b905011801561051f575060038151600581111561051d5761051d613d14565b145b6105885760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613d5a565b6020604051808303815f875af11580156105dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106019190613de4565b50505050565b5f805160206144f78339815191525f61061f84611a2c565b90505f805f6106318460400151611bc7565b5f83815260068901602090815260408083206001600160a01b038d168452909152812080549497509295509093509161066990613d28565b90501180156106b6575060035f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff1660058111156106b4576106b4613d14565b145b6106d25760405162461bcd60e51b815260040161057f90613dfb565b5f83815260068601602090815260408083206001600160a01b038a16845290915281206106fe91613a34565b5f61070884611e02565b5f85815260048801602090815260408083206001600160a01b038c16845290915290205460808201519192506001600160401b038085169261074d9290911690613e61565b6001600160401b0316146107735760405162461bcd60e51b815260040161057f90613e88565b826001600160401b031681606001516001600160401b031610156107a95760405162461bcd60e51b815260040161057f90613ecb565b5f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c21b1790556001600160401b03821660808201526107f68482611efd565b6040516001600160401b03831681526001600160a01b0388169085907fe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513906020015b60405180910390a35050505050505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206144f78339815191529291906108a690613d28565b90501180156108f3575060015f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff1660058111156108f1576108f1613d14565b145b61090f5760405162461bcd60e51b815260040161057f90613f0d565b5f83815260058201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613d5a565b5f61096c64e8d4a5100083613f7e565b92915050565b5f61096c6001600160401b03831664e8d4a51000613f91565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f805160206144f78339815191529291906109e790613d28565b9050118015610a34575060035f84815260048301602090815260408083206001600160a01b0387168452909152902054600160c01b900460ff166005811115610a3257610a32613d14565b145b610a505760405162461bcd60e51b815260040161057f90613dfb565b5f83815260068201602090815260408083206001600160a01b038616845290915290819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613d5a565b8115610dad575f5f805160206144f78339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610afe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b259190810190613fd5565b9150915080610b885760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bef9190613de4565b825114610c535760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057f565b60208201516001600160a01b031615610cc95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057f565b5f80610cd88460400151611fec565b91509150818814610d455760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057f565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610db6836121c4565b505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f805160206144f783398151915293926060830190600160c01b900460ff166005811115610e5a57610e5a613d14565b6005811115610e6b57610e6b613d14565b9052509050600281606001516005811115610e8857610e88613d14565b14610ee45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2044656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161057f565b600360608201908152426001600160401b0390811660408085019182525f8781526004870160209081528282203383528152919020855181549287015193518516600160801b0267ffffffffffffffff60801b19948616600160401b026001600160801b03199094169190951617919091179182168317815592518493929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836005811115610f9657610f96613d14565b02179055509050505f610fa884611e02565b9050815f01516001600160401b031681608001516001600160401b03161015610fe35760405162461bcd60e51b815260040161057f90613e88565b5f61100785610ff1876124d1565b855160808601516110029190613e61565b61254c565b5f8681526006860160209081526040808320338452909152902090915061102e82826140f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061105b9085906004016141ad565b6020604051808303815f875af1158015611077573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061109b9190613de4565b9050336001600160a01b031681877f2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2426040516110da91815260200190565b60405180910390a4505050505050565b5f805160206145178339815191525f61110283611a2c565b90505f806111138360400151612769565b91509150806111755760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057f565b5f8281526005850160205260408120805461118f90613d28565b90501180156111c1575060015f83815260078601602052604090205460ff1660058111156111bf576111bf613d14565b145b6111dd5760405162461bcd60e51b815260040161057f906141df565b5f82815260058501602052604081206111f591613a34565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145178339815191529291906112eb90613d28565b905011801561131d575060015f83815260078301602052604090205460ff16600581111561131b5761131b613d14565b145b6113395760405162461bcd60e51b815260040161057f906141df565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916113729190600401613d5a565b6020604051808303815f875af115801561138e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db69190613de4565b6113c581336113c03461095c565b61290a565b50565b5f805160206144f78339815191525f6113e084611a2c565b90505f805f6113f28460400151611bc7565b5f83815260058901602090815260408083206001600160a01b038d168452909152812080549497509295509093509161142a90613d28565b9050118015611477575060015f84815260048701602090815260408083206001600160a01b038b168452909152902054600160c01b900460ff16600581111561147557611475613d14565b145b6114935760405162461bcd60e51b815260040161057f90613f0d565b5f83815260058601602090815260408083206001600160a01b038a16845290915281206114bf91613a34565b5f6114c984611e02565b60808101515f86815260048901602090815260408083206001600160a01b038d1684529091529020549192506001600160401b038085169261150c929116614226565b6001600160401b0316146115325760405162461bcd60e51b815260040161057f90613e88565b826001600160401b031681606001516001600160401b031610156115685760405162461bcd60e51b815260040161057f90613ecb565b6001600160401b03821660808201525f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c11b1790556115b58482611efd565b5f84815260048701602090815260408083206001600160a01b038b16808552908352928190205481516001600160401b03918216815290861692810192909252429082015285907fa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a390606001610838565b5f8061163134612c05565b905061163f85828686612caf565b95945050505050565b5f5f805160206145178339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156116a3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116ca9190810190613fd5565b91509150806116eb5760405162461bcd60e51b815260040161057f90614246565b5f841561176f575f61170084604001516130e3565b919350909150506001600160401b038116156117695760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161057f565b506117e5565b5f61177d8460400151612769565b909250905080156117e35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057f565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561181657611816613d14565b600581111561182757611827613d14565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146118b85760405162461bcd60e51b815260040161057f9061428c565b5f6003825160058111156118ce576118ce613d14565b14806118ec57506002825160058111156118ea576118ea613d14565b145b1561190f57506020808201515f9081526008870190915260408120556004611913565b5060055b5f83815260078701602052604090208251815484929190829060ff1916600183600581111561194457611944613d14565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b611a2361330e565b6113c581613359565b60408051606080820183525f8083526020830181905292820152905f805160206145178339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611aa1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ac89190810190613fd5565b9150915080611ae95760405162461bcd60e51b815260040161057f90614246565b8254825114611b4c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057f565b60208201516001600160a01b031615611bbf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057f565b509392505050565b5f805f8351603614611beb5760405162461bcd60e51b815260040161057f906142d8565b5f805b6002811015611c3a57611c02816001614321565b611c0d906008613f91565b61ffff16868281518110611c2357611c23614334565b016020015160f81c901b9190911790600101611bee565b5061ffff811615611c5d5760405162461bcd60e51b815260040161057f90614348565b5f805b6004811015611cb857611c74816003614321565b611c7f906008613f91565b63ffffffff1687611c9183600261438b565b81518110611ca157611ca1614334565b016020015160f81c901b9190911790600101611c60565b5063ffffffff8116600314611cdf5760405162461bcd60e51b815260040161057f9061439e565b5f805b6020811015611d3457611cf681601f614321565b611d01906008613f91565b88611d0d83600661438b565b81518110611d1d57611d1d614334565b016020015160f81c901b9190911790600101611ce2565b505f805b6008811015611d9357611d4c816007614321565b611d57906008613f91565b6001600160401b031689611d6c83602661438b565b81518110611d7c57611d7c614334565b016020015160f81c901b9190911790600101611d38565b505f805b6008811015611df257611dab816007614321565b611db6906008613f91565b6001600160401b03168a611dcb83602e61438b565b81518110611ddb57611ddb614334565b016020015160f81c901b9190911790600101611d97565b5091989097509095509350505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061455783398151915290528390208351918201909352825491925f8051602061451783398151915292829060ff166005811115611e8257611e82613d14565b6005811115611e9357611e93613d14565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061455783398151915260205260409020815181545f805160206145178339815191529284929091829060ff19166001836005811115611f4757611f47613d14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f808251602e1461200f5760405162461bcd60e51b815260040161057f906142d8565b5f805b600281101561205e57612026816001614321565b612031906008613f91565b61ffff1685828151811061204757612047614334565b016020015160f81c901b9190911790600101612012565b5061ffff8116156120815760405162461bcd60e51b815260040161057f90614348565b5f805b60048110156120dc57612098816003614321565b6120a3906008613f91565b63ffffffff16866120b583600261438b565b815181106120c5576120c5614334565b016020015160f81c901b9190911790600101612084565b5063ffffffff81166004146121035760405162461bcd60e51b815260040161057f9061439e565b5f805b60208110156121585761211a81601f614321565b612125906008613f91565b8761213183600661438b565b8151811061214157612141614334565b016020015160f81c901b9190911790600101612106565b505f805b60088110156121b757612170816007614321565b61217b906008613f91565b6001600160401b03168861219083602661438b565b815181106121a0576121a0614334565b016020015160f81c901b919091179060010161215c565b5090969095509350505050565b5f8181525f805160206145578339815191526020526040808220815160e0810190925280545f8051602061451783398151915293929190829060ff16600581111561221157612211613d14565b600581111561222257612222613d14565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561229c5761229c613d14565b146122b95760405162461bcd60e51b815260040161057f906143e5565b60408101516001600160a01b0316336001600160a01b0316146122ee5760405162461bcd60e51b815260040161057f9061428c565b6122fb816080015161339c565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561233f5761233f613d14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6123f3846123ed816124d1565b5f61254c565b5f858152600685016020526040902090915061240f82826140f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061243c9085906004016141ad565b6020604051808303815f875af1158015612458573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247c9190613de4565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f805160206145578339815191526020526040812060020180545f8051602061451783398151915291600160a01b9091046001600160401b0316908190601461251d8361442b565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156125c557612585816001614321565b612590906008613f91565b5081515f908390839081106125a7576125a7614334565b60200101906001600160f81b03191690815f1a905350600101612571565b505f5b6004811015612628576125dc816003614321565b6125e7906008613f91565b6001901c60f81b826125fa83600261438b565b8151811061260a5761260a614334565b60200101906001600160f81b03191690815f1a9053506001016125c8565b505f5b602081101561268a5761263f81601f614321565b61264a906008613f91565b86901c60f81b8261265c83600661438b565b8151811061266c5761266c614334565b60200101906001600160f81b03191690815f1a90535060010161262b565b505f5b60088110156126f5576126a1816007614321565b6126ac906008613f91565b6001600160401b038616901c60f81b826126c783602661438b565b815181106126d7576126d7614334565b60200101906001600160f81b03191690815f1a90535060010161268d565b505f5b60088110156127605761270c816007614321565b612717906008613f91565b6001600160401b038516901c60f81b8261273283602e61438b565b8151811061274257612742614334565b60200101906001600160f81b03191690815f1a9053506001016126f8565b50949350505050565b5f80825160271461278c5760405162461bcd60e51b815260040161057f906142d8565b5f805b60028110156127db576127a3816001614321565b6127ae906008613f91565b61ffff168582815181106127c4576127c4614334565b016020015160f81c901b919091179060010161278f565b5061ffff8116156127fe5760405162461bcd60e51b815260040161057f90614348565b5f805b600481101561285957612815816003614321565b612820906008613f91565b63ffffffff168661283283600261438b565b8151811061284257612842614334565b016020015160f81c901b9190911790600101612801565b5063ffffffff81166002146128805760405162461bcd60e51b815260040161057f9061439e565b5f805b60208110156128d55761289781601f614321565b6128a2906008613f91565b876128ae83600661438b565b815181106128be576128be614334565b016020015160f81c901b9190911790600101612883565b505f866026815181106128ea576128ea614334565b016020015191976001600160f81b03199092161515965090945050505050565b61291261353d565b5f805160206144f78339815191525f61292a85611e02565b905060028151600581111561294157612941613d14565b1461295e5760405162461bcd60e51b815260040161057f906143e5565b5f85815260048301602090815260408083206001600160a01b03881684529091529020546001600160401b0316156129ef5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2044656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161057f565b6129f88361339c565b5f612a1686612a06886124d1565b8685608001516110029190614226565b5f87815260058501602090815260408083206001600160a01b038a1684529091529020909150612a4682826140f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612a739085906004016141ad565b6020604051808303815f875af1158015612a8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ab39190613de4565b604080516080810182526001600160401b038089168252421660208201525f9181019190915290915060608101600190525f88815260048601602090815260408083206001600160a01b038b1684528252918290208351815492850151938501516001600160401b03908116600160801b0267ffffffffffffffff60801b19958216600160401b026001600160801b031990951691909216179290921792831682178155606084015190929091839160ff60c01b1990911668ffffffffffffffffff60801b1990911617600160c01b836005811115612b9457612b94613d14565b021790555050604080516001600160401b03881681524260208201526001600160a01b038916925083918a917ff8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16910160405180910390a450505050610db660015f8051602061453783398151915255565b5f5f805160206144f78339815191528282612c1f8261095c565b83549091506001600160401b03821610801590612c4957508260010154816001600160401b031611155b612ca75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161057f565b949350505050565b5f612cb861353d565b5f80516020614517833981519152426001600160401b038516118015612cf257506001600160401b038416612cf0426202a30061438b565b115b612d545760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161057f565b85612dab5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161057f565b5f86815260088201602052604090205415612e195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057f565b8251603014612e805760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057f565b612e898561339c565b5f80612ed06040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613587565b5f82815260058601602052604090209193509150612eee82826140f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f1b9085906004016141ad565b6020604051808303815f875af1158015612f37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f5b9190613de4565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612fd457612fd4613d14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561307d836124d1565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612ca760015f8051602061453783398151915255565b5f805f83516036146131075760405162461bcd60e51b815260040161057f906142d8565b5f805b60028110156131565761311e816001614321565b613129906008613f91565b61ffff1686828151811061313f5761313f614334565b016020015160f81c901b919091179060010161310a565b5061ffff8116156131795760405162461bcd60e51b815260040161057f90614348565b5f805b60048110156131d457613190816003614321565b61319b906008613f91565b63ffffffff16876131ad83600261438b565b815181106131bd576131bd614334565b016020015160f81c901b919091179060010161317c565b5063ffffffff81166001146131fb5760405162461bcd60e51b815260040161057f9061439e565b5f805b60208110156132505761321281601f614321565b61321d906008613f91565b8861322983600661438b565b8151811061323957613239614334565b016020015160f81c901b91909117906001016131fe565b505f805b60088110156132af57613268816007614321565b613273906008613f91565b6001600160401b03168961328883602661438b565b8151811061329857613298614334565b016020015160f81c901b9190911790600101613254565b505f805b6008811015611df2576132c7816007614321565b6132d2906008613f91565b6001600160401b03168a6132e783602e61438b565b815181106132f7576132f7614334565b016020015160f81c901b91909117906001016132b3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661335757604051631afcd79f60e31b815260040160405180910390fd5b565b61336161330e565b61336a8161392c565b6113c56060820135608083013561338760c0850160a08601613b45565b61339760e0860160c08701614450565b61394d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145178339815191529060ff165f036133da575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906134229083614321565b1061343e576001600160401b038416604083015280825261345d565b83826040018181516134509190614226565b6001600160401b03169052505b5f826020015183604001516064613474919061446b565b61347e9190614496565b600285015490915060ff90811690821611156134f95760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161057f565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061453783398151915280546001190161356e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061453783398151915255565b5f60608260800151516030146135f15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561366857613628816001614321565b613633906008613f91565b5081515f9083908390811061364a5761364a614334565b60200101906001600160f81b03191690815f1a905350600101613614565b505f5b60048110156136c65761367f816003614321565b61368a906008613f91565b505f8261369883600261438b565b815181106136a8576136a8614334565b60200101906001600160f81b03191690815f1a90535060010161366b565b505f5b602081101561372357845181602081106136e5576136e5614334565b1a60f81b826136f583600661438b565b8151811061370557613705614334565b60200101906001600160f81b03191690815f1a9053506001016136c9565b505f5b6020811015613783578460200151816020811061374557613745614334565b1a60f81b8261375583602661438b565b8151811061376557613765614334565b60200101906001600160f81b03191690815f1a905350600101613726565b505f5b60088110156137f75761379a816007614321565b6137a5906008613f91565b60ff1685604001516001600160401b0316901c60f81b828260466137c9919061438b565b815181106137d9576137d9614334565b60200101906001600160f81b03191690815f1a905350600101613786565b505f5b6030811015613862578460800151818151811061381957613819614334565b01602001516001600160f81b0319168261383483604e61438b565b8151811061384457613844614334565b60200101906001600160f81b03191690815f1a9053506001016137fa565b505f5b60088110156138d457613879816007614321565b613884906008613f91565b60608601516001600160401b0390811691161c60f81b826138a683607e61438b565b815181106138b6576138b6614334565b60200101906001600160f81b03191690815f1a905350600101613865565b506002816040516138e591906144bb565b602060405180830381855afa158015613900573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139239190613de4565b94909350915050565b61393461330e565b61393c6139a8565b6139446139b8565b6113c5816139c0565b61395561330e565b5f5f805160206144f7833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6139b061330e565b613357613a2c565b61335761330e565b6139c861330e565b80355f8051602061451783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a1260608301604084016144d6565b600291909101805460ff191660ff90921691909117905550565b61357461330e565b508054613a4090613d28565b5f825580601f10613a4f575050565b601f0160209004905f5260205f20908101906113c591905b80821115613a7a575f8155600101613a67565b5090565b5f60e08284031215613a8e575f80fd5b50919050565b5f60208284031215613aa4575f80fd5b5035919050565b803563ffffffff81168114613abe575f80fd5b919050565b6001600160a01b03811681146113c5575f80fd5b5f8060408385031215613ae8575f80fd5b613af183613aab565b91506020830135613b0181613ac3565b809150509250929050565b5f8060408385031215613b1d575f80fd5b823591506020830135613b0181613ac3565b80356001600160401b0381168114613abe575f80fd5b5f60208284031215613b55575f80fd5b613b5e82613b2f565b9392505050565b80151581146113c5575f80fd5b5f805f60608486031215613b84575f80fd5b833592506020840135613b9681613b65565b9150613ba460408501613aab565b90509250925092565b5f60208284031215613bbd575f80fd5b613b5e82613aab565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bfc57613bfc613bc6565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c2a57613c2a613bc6565b604052919050565b5f6001600160401b03821115613c4a57613c4a613bc6565b50601f01601f191660200190565b5f805f60608486031215613c6a575f80fd5b83359250613c7a60208501613b2f565b915060408401356001600160401b03811115613c94575f80fd5b8401601f81018613613ca4575f80fd5b8035613cb7613cb282613c32565b613c02565b818152876020838501011115613ccb575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215613cfb575f80fd5b613d0483613aab565b91506020830135613b0181613b65565b634e487b7160e01b5f52602160045260245ffd5b600181811c90821680613d3c57607f821691505b602082108103613a8e57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454613d6c81613d28565b806020870152604060018084165f8114613d8d5760018114613da957613dd6565b60ff19851660408a0152604084151560051b8a01019550613dd6565b895f5260205f205f5b85811015613dcd5781548b8201860152908301908801613db2565b8a016040019650505b509398975050505050505050565b5f60208284031215613df4575f80fd5b5051919050565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f722072604082015271656d6f76616c206e6f742070656e64696e6760701b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e8157613e81613e4d565b5092915050565b60208082526023908201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960408201526219da1d60ea1b606082015260800190565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20496e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526037908201527f506f5356616c696461746f724d616e616765723a2044656c656761746f72207260408201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82613f8c57613f8c613f6a565b500490565b808202811582820484141761096c5761096c613e4d565b5f5b83811015613fc2578181015183820152602001613faa565b50505f910152565b8051613abe81613b65565b5f8060408385031215613fe6575f80fd5b82516001600160401b0380821115613ffc575f80fd5b908401906060828703121561400f575f80fd5b614017613bda565b8251815260208084015161402a81613ac3565b8282015260408401518381111561403f575f80fd5b80850194505087601f850112614053575f80fd5b83519250614063613cb284613c32565b8381528882858701011115614076575f80fd5b61408584838301848801613fa8565b8060408401525081955061409a818801613fca565b9450505050509250929050565b601f821115610db657805f5260205f20601f840160051c810160208510156140cc5750805b601f840160051c820191505b818110156140eb575f81556001016140d8565b5050505050565b81516001600160401b0381111561410b5761410b613bc6565b61411f816141198454613d28565b846140a7565b602080601f831160018114614152575f841561413b5750858301515b5f19600386901b1c1916600185901b17855561040e565b5f85815260208120601f198616915b8281101561418057888601518255948401946001909101908401614161565b508582101561419d57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f82518060208401526141cb816040850160208701613fa8565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160401b03818116838216019080821115613e8157613e81613e4d565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561096c5761096c613e4d565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561096c5761096c613e4d565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361444657614446613e4d565b6001019392505050565b5f60208284031215614460575f80fd5b8135613b5e81613ac3565b6001600160401b0381811683821602808216919082811461448e5761448e613e4d565b505092915050565b5f6001600160401b03808416806144af576144af613f6a565b92169190910492915050565b5f82516144cc818460208701613fa8565b9190910192915050565b5f602082840312156144e6575f80fd5b813560ff81168114613b5e575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161469238038061469283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145458061014d5f395ff3fe6080604052600436106100ee575f3560e01c8063927e7e7511610087578063c599e24f11610057578063c599e24f146102a6578063d61bed74146102b9578063f40797d7146102d8578063fdf94a1a146102eb575f80fd5b8063927e7e7514610217578063a3a65e4814610236578063b771b3bc14610255578063bee0a03f14610287575f80fd5b80632e2194d8116100c25780632e2194d81461017057806362065856146101ac5780636a7e3d83146101d957806376f78621146101f8575f80fd5b8062e41792146100f25780630322ed98146101135780630915204e146101325780630b77f69314610151575b5f80fd5b3480156100fd575f80fd5b5061011161010c366004613bbe565b61030a565b005b34801561011e575f80fd5b5061011161012d366004613bd4565b610416565b34801561013d575f80fd5b5061011161014c366004613c17565b610607565b34801561015c575f80fd5b5061011161016b366004613c4c565b610750565b34801561017b575f80fd5b5061018f61018a366004613bd4565b6107d2565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101b7575f80fd5b506101cb6101c6366004613c85565b6107e8565b6040519081526020016101a3565b3480156101e4575f80fd5b506101116101f3366004613c4c565b610801565b348015610203575f80fd5b50610111610212366004613cb2565b610883565b348015610222575f80fd5b50610111610231366004613bd4565b610ba1565b348015610241575f80fd5b50610111610250366004613ced565b610f2c565b348015610260575f80fd5b5061026f6005600160991b0181565b6040516001600160a01b0390911681526020016101a3565b348015610292575f80fd5b506101116102a1366004613bd4565b6110e5565b6101116102b4366004613bd4565b6111f4565b3480156102c4575f80fd5b506101116102d3366004613c17565b611202565b6101cb6102e6366004613d98565b611368565b3480156102f6575f80fd5b50610111610305366004613e2a565b61138a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561034e5750825b90505f826001600160401b031660011480156103695750303b155b905081158015610377575080155b156103955760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103bf57845460ff60401b1916600160401b1785555b6103c88661179c565b831561040e57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181525f805160206145198339815191526020526040808220815160e0810190925280545f805160206144d983398151915293929190829060ff16600581111561046357610463613e54565b600581111561047457610474613e54565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916104fe90613e68565b905011801561051f575060038151600581111561051d5761051d613e54565b145b6105885760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613e9a565b6020604051808303815f875af11580156105dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106019190613f24565b50505050565b5f805160206144b98339815191525f61061f846117ad565b90505f805f610631846040015161198e565b9250925092506106418387611c87565b5f83815260068601602090815260408083206001600160a01b038a168452909152812061066d91613b74565b5f61067784611d98565b9050826001600160401b031681606001516001600160401b031610156106af5760405162461bcd60e51b815260040161057f90613f3b565b5f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c21b1790556001600160401b03821660808201526106fc8482611e93565b6040516001600160401b03831681526001600160a01b0388169085907fe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513906020015b60405180910390a35050505050505050565b61075a8282611f82565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206144b9833981519152916005600160991b019163ee5b48eb916105c191600401613e9a565b5f6107e264e8d4a5100083613fa5565b92915050565b5f6107e26001600160401b03831664e8d4a51000613fb8565b61080b8282611c87565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206144b9833981519152916005600160991b019163ee5b48eb916105c191600401613e9a565b8115610b93575f5f805160206144b98339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156108e4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261090b9190810190613ffc565b915091508061096e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d59190613f24565b825114610a395760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057f565b60208201516001600160a01b031615610aaf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057f565b5f80610abe846040015161209e565b91509150818814610b2b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057f565b5f888152600786016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610b9c83612276565b505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f805160206144b983398151915293926060830190600160c01b900460ff166004811115610c4057610c40613e54565b6004811115610c5157610c51613e54565b9052509050600281606001516004811115610c6e57610c6e613e54565b14610cca5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161057f565b60036060820181905250426001600160401b03166040828101919091525f848152600484016020529081208291336001600160a01b0316815260208082019290925260409081015f208351815493850151928501516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990961691909216179390931791821683178155606084015190929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836004811115610d9d57610d9d613e54565b02179055509050505f610daf84611d98565b9050815f01516001600160401b031681608001516001600160401b031611610e255760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161057f565b5f610e4985610e33876125c2565b85516080860151610e4491906140ce565b61263d565b5f86815260068601602090815260408083203384529091529020909150610e708282614140565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610e9d9085906004016141fb565b6020604051808303815f875af1158015610eb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edd9190613f24565b9050336001600160a01b031681877f2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc242604051610f1c91815260200190565b60405180910390a4505050505050565b5f805160206144d98339815191525f610f44836117ad565b90505f80610f55836040015161285a565b9150915080610fb75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057f565b5f82815260058501602052604081208054610fd190613e68565b9050118015611003575060015f83815260078601602052604090205460ff16600581111561100157611001613e54565b145b61101f5760405162461bcd60e51b815260040161057f9061422d565b5f828152600585016020526040812061103791613b74565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206144d983398151915292919061112d90613e68565b905011801561115f575060015f83815260078301602052604090205460ff16600581111561115d5761115d613e54565b145b61117b5760405162461bcd60e51b815260040161057f9061422d565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916111b49190600401613e9a565b6020604051808303815f875af11580156111d0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9c9190613f24565b6111ff8133346129fb565b50565b5f805160206144b98339815191525f61121a846117ad565b90505f805f61122c846040015161198e565b92509250925061123c8387611f82565b5f83815260058601602090815260408083206001600160a01b038a168452909152812061126891613b74565b5f61127284611d98565b9050826001600160401b031681606001516001600160401b031610156112aa5760405162461bcd60e51b815260040161057f90613f3b565b6001600160401b03821660808201525f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c11b1790556112f78482611e93565b5f84815260048701602090815260408083206001600160a01b038b16808552908352928190205481516001600160401b03918216815290861692810192909252429082015285907fa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a39060600161073e565b5f8061137334612d45565b905061138185828686612def565b95945050505050565b5f5f805160206144d98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156113e5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261140c9190810190613ffc565b915091508061146c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057f565b5f84156114f0575f6114818460400151613223565b919350909150506001600160401b038116156114ea5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161057f565b50611566565b5f6114fe846040015161285a565b909250905080156115645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057f565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561159757611597613e54565b60058111156115a8576115a8613e54565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146116395760405162461bcd60e51b815260040161057f90614274565b5f60038251600581111561164f5761164f613e54565b148061166d575060028251600581111561166b5761166b613e54565b145b1561169057506020808201515f9081526008870190915260408120556004611694565b5060055b5f83815260078701602052604090208251815484929190829060ff191660018360058111156116c5576116c5613e54565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b6117a461344e565b6111ff81613499565b60408051606080820183525f8083526020830181905292820152905f805160206144d98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611822573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118499190810190613ffc565b91509150806118b05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161057f565b82548251146119135760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057f565b60208201516001600160a01b0316156119865760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057f565b509392505050565b5f805f83516036146119f45760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b606482015260840161057f565b5f805b6002811015611a4357611a0b8160016142c0565b611a16906008613fb8565b61ffff16868281518110611a2c57611a2c6142d3565b016020015160f81c901b91909117906001016119f7565b5061ffff811615611aa25760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b606482015260840161057f565b5f805b6004811015611afd57611ab98160036142c0565b611ac4906008613fb8565b63ffffffff1687611ad68360026142e7565b81518110611ae657611ae66142d3565b016020015160f81c901b9190911790600101611aa5565b5063ffffffff8116600314611b645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b606482015260840161057f565b5f805b6020811015611bb957611b7b81601f6142c0565b611b86906008613fb8565b88611b928360066142e7565b81518110611ba257611ba26142d3565b016020015160f81c901b9190911790600101611b67565b505f805b6008811015611c1857611bd18160076142c0565b611bdc906008613fb8565b6001600160401b031689611bf18360266142e7565b81518110611c0157611c016142d3565b016020015160f81c901b9190911790600101611bbd565b505f805b6008811015611c7757611c308160076142c0565b611c3b906008613fb8565b6001600160401b03168a611c5083602e6142e7565b81518110611c6057611c606142d3565b016020015160f81c901b9190911790600101611c1c565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f805160206144b9833981519152929190611ce390613e68565b9050118015611d31575060035f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611d2f57611d2f613e54565b145b610b9c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161057f565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061451983398151915290528390208351918201909352825491925f805160206144d983398151915292829060ff166005811115611e1857611e18613e54565b6005811115611e2957611e29613e54565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061451983398151915260205260409020815181545f805160206144d98339815191529284929091829060ff19166001836005811115611edd57611edd613e54565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206144b9833981519152929190611fde90613e68565b905011801561202c575060015f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff169081111561202a5761202a613e54565b145b610b9c5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161057f565b5f808251602e146120c15760405162461bcd60e51b815260040161057f906142fa565b5f805b6002811015612110576120d88160016142c0565b6120e3906008613fb8565b61ffff168582815181106120f9576120f96142d3565b016020015160f81c901b91909117906001016120c4565b5061ffff8116156121335760405162461bcd60e51b815260040161057f90614343565b5f805b600481101561218e5761214a8160036142c0565b612155906008613fb8565b63ffffffff16866121678360026142e7565b81518110612177576121776142d3565b016020015160f81c901b9190911790600101612136565b5063ffffffff81166004146121b55760405162461bcd60e51b815260040161057f90614386565b5f805b602081101561220a576121cc81601f6142c0565b6121d7906008613fb8565b876121e38360066142e7565b815181106121f3576121f36142d3565b016020015160f81c901b91909117906001016121b8565b505f805b6008811015612269576122228160076142c0565b61222d906008613fb8565b6001600160401b0316886122428360266142e7565b81518110612252576122526142d3565b016020015160f81c901b919091179060010161220e565b5090969095509350505050565b5f8181525f805160206145198339815191526020526040808220815160e0810190925280545f805160206144d983398151915293929190829060ff1660058111156122c3576122c3613e54565b60058111156122d4576122d4613e54565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561234e5761234e613e54565b146123aa5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057f565b60408101516001600160a01b0316336001600160a01b0316146123df5760405162461bcd60e51b815260040161057f90614274565b6123ec81608001516134dc565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561243057612430613e54565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124e4846124de816125c2565b5f61263d565b5f85815260068501602052604090209091506125008282614140565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061252d9085906004016141fb565b6020604051808303815f875af1158015612549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256d9190613f24565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f805160206145198339815191526020526040812060020180545f805160206144d983398151915291600160a01b9091046001600160401b0316908190601461260e836143cd565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126b6576126768160016142c0565b612681906008613fb8565b5081515f90839083908110612698576126986142d3565b60200101906001600160f81b03191690815f1a905350600101612662565b505f5b6004811015612719576126cd8160036142c0565b6126d8906008613fb8565b6001901c60f81b826126eb8360026142e7565b815181106126fb576126fb6142d3565b60200101906001600160f81b03191690815f1a9053506001016126b9565b505f5b602081101561277b5761273081601f6142c0565b61273b906008613fb8565b86901c60f81b8261274d8360066142e7565b8151811061275d5761275d6142d3565b60200101906001600160f81b03191690815f1a90535060010161271c565b505f5b60088110156127e6576127928160076142c0565b61279d906008613fb8565b6001600160401b038616901c60f81b826127b88360266142e7565b815181106127c8576127c86142d3565b60200101906001600160f81b03191690815f1a90535060010161277e565b505f5b6008811015612851576127fd8160076142c0565b612808906008613fb8565b6001600160401b038516901c60f81b8261282383602e6142e7565b81518110612833576128336142d3565b60200101906001600160f81b03191690815f1a9053506001016127e9565b50949350505050565b5f80825160271461287d5760405162461bcd60e51b815260040161057f906142fa565b5f805b60028110156128cc576128948160016142c0565b61289f906008613fb8565b61ffff168582815181106128b5576128b56142d3565b016020015160f81c901b9190911790600101612880565b5061ffff8116156128ef5760405162461bcd60e51b815260040161057f90614343565b5f805b600481101561294a576129068160036142c0565b612911906008613fb8565b63ffffffff16866129238360026142e7565b81518110612933576129336142d3565b016020015160f81c901b91909117906001016128f2565b5063ffffffff81166002146129715760405162461bcd60e51b815260040161057f90614386565b5f805b60208110156129c65761298881601f6142c0565b612993906008613fb8565b8761299f8360066142e7565b815181106129af576129af6142d3565b016020015160f81c901b9190911790600101612974565b505f866026815181106129db576129db6142d3565b016020015191976001600160f81b03199092161515965090945050505050565b612a0361367d565b5f612a0d826107d2565b90505f805160206144b98339815191525f612a2786611d98565b9050600281516005811115612a3e57612a3e613e54565b14612a9a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057f565b5f86815260048301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612b2b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161057f565b612b34836134dc565b5f612b5287612b42896125c2565b868560800151610e4491906143f2565b5f88815260058501602090815260408083206001600160a01b038b1684529091529020909150612b828282614140565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612baf9085906004016141fb565b6020604051808303815f875af1158015612bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bef9190613f24565b604080516080810182526001600160401b038089168252421660208201525f9181019190915290915060608101600190525f8981526004808701602090815260408084206001600160a01b038d1685528252928390208451815492860151948601516001600160401b03908116600160801b0267ffffffffffffffff60801b19968216600160401b026001600160801b031990951691909216179290921793841682178155606085015190939092849260ff60c01b191668ffffffffffffffffff60801b199092169190911790600160c01b908490811115612cd357612cd3613e54565b021790555050604080516001600160401b03881681524260208201526001600160a01b038a16925083918b917ff8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16910160405180910390a45050505050610b9c60015f805160206144f983398151915255565b5f5f805160206144b98339815191528282612d5f826107d2565b83549091506001600160401b03821610801590612d8957508260010154816001600160401b031611155b612de75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161057f565b949350505050565b5f612df861367d565b5f805160206144d9833981519152426001600160401b038516118015612e3257506001600160401b038416612e30426202a3006142e7565b115b612e945760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161057f565b85612eeb5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161057f565b5f86815260088201602052604090205415612f595760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057f565b8251603014612fc05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057f565b612fc9856134dc565b5f806130106040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506136c7565b5f8281526005860160205260409020919350915061302e8282614140565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061305b9085906004016141fb565b6020604051808303815f875af1158015613077573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061309b9190613f24565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561311457613114613e54565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556131bd836125c2565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612de760015f805160206144f983398151915255565b5f805f83516036146132475760405162461bcd60e51b815260040161057f906142fa565b5f805b60028110156132965761325e8160016142c0565b613269906008613fb8565b61ffff1686828151811061327f5761327f6142d3565b016020015160f81c901b919091179060010161324a565b5061ffff8116156132b95760405162461bcd60e51b815260040161057f90614343565b5f805b6004811015613314576132d08160036142c0565b6132db906008613fb8565b63ffffffff16876132ed8360026142e7565b815181106132fd576132fd6142d3565b016020015160f81c901b91909117906001016132bc565b5063ffffffff811660011461333b5760405162461bcd60e51b815260040161057f90614386565b5f805b60208110156133905761335281601f6142c0565b61335d906008613fb8565b886133698360066142e7565b81518110613379576133796142d3565b016020015160f81c901b919091179060010161333e565b505f805b60088110156133ef576133a88160076142c0565b6133b3906008613fb8565b6001600160401b0316896133c88360266142e7565b815181106133d8576133d86142d3565b016020015160f81c901b9190911790600101613394565b505f805b6008811015611c77576134078160076142c0565b613412906008613fb8565b6001600160401b03168a61342783602e6142e7565b81518110613437576134376142d3565b016020015160f81c901b91909117906001016133f3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661349757604051631afcd79f60e31b815260040160405180910390fd5b565b6134a161344e565b6134aa81613a6c565b6111ff606082013560808301356134c760c0850160a08601613c85565b6134d760e0860160c08701614412565b613a8d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206144d98339815191529060ff165f0361351a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061356290836142c0565b1061357e576001600160401b038416604083015280825261359d565b838260400181815161359091906143f2565b6001600160401b03169052505b5f8260200151836040015160646135b4919061442d565b6135be9190614458565b600285015490915060ff90811690821611156136395760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161057f565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206144f98339815191528054600119016136ae57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206144f983398151915255565b5f60608260800151516030146137315760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137a8576137688160016142c0565b613773906008613fb8565b5081515f9083908390811061378a5761378a6142d3565b60200101906001600160f81b03191690815f1a905350600101613754565b505f5b6004811015613806576137bf8160036142c0565b6137ca906008613fb8565b505f826137d88360026142e7565b815181106137e8576137e86142d3565b60200101906001600160f81b03191690815f1a9053506001016137ab565b505f5b60208110156138635784518160208110613825576138256142d3565b1a60f81b826138358360066142e7565b81518110613845576138456142d3565b60200101906001600160f81b03191690815f1a905350600101613809565b505f5b60208110156138c35784602001518160208110613885576138856142d3565b1a60f81b826138958360266142e7565b815181106138a5576138a56142d3565b60200101906001600160f81b03191690815f1a905350600101613866565b505f5b6008811015613937576138da8160076142c0565b6138e5906008613fb8565b60ff1685604001516001600160401b0316901c60f81b8282604661390991906142e7565b81518110613919576139196142d3565b60200101906001600160f81b03191690815f1a9053506001016138c6565b505f5b60308110156139a25784608001518181518110613959576139596142d3565b01602001516001600160f81b0319168261397483604e6142e7565b81518110613984576139846142d3565b60200101906001600160f81b03191690815f1a90535060010161393a565b505f5b6008811015613a14576139b98160076142c0565b6139c4906008613fb8565b60608601516001600160401b0390811691161c60f81b826139e683607e6142e7565b815181106139f6576139f66142d3565b60200101906001600160f81b03191690815f1a9053506001016139a5565b50600281604051613a25919061447d565b602060405180830381855afa158015613a40573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a639190613f24565b94909350915050565b613a7461344e565b613a7c613ae8565b613a84613af8565b6111ff81613b00565b613a9561344e565b5f5f805160206144b9833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613af061344e565b613497613b6c565b61349761344e565b613b0861344e565b80355f805160206144d983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b526060830160408401614498565b600291909101805460ff191660ff90921691909117905550565b6136b461344e565b508054613b8090613e68565b5f825580601f10613b8f575050565b601f0160209004905f5260205f20908101906111ff91905b80821115613bba575f8155600101613ba7565b5090565b5f60e08284031215613bce575f80fd5b50919050565b5f60208284031215613be4575f80fd5b5035919050565b803563ffffffff81168114613bfe575f80fd5b919050565b6001600160a01b03811681146111ff575f80fd5b5f8060408385031215613c28575f80fd5b613c3183613beb565b91506020830135613c4181613c03565b809150509250929050565b5f8060408385031215613c5d575f80fd5b823591506020830135613c4181613c03565b80356001600160401b0381168114613bfe575f80fd5b5f60208284031215613c95575f80fd5b613c9e82613c6f565b9392505050565b80151581146111ff575f80fd5b5f805f60608486031215613cc4575f80fd5b833592506020840135613cd681613ca5565b9150613ce460408501613beb565b90509250925092565b5f60208284031215613cfd575f80fd5b613c9e82613beb565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d3c57613d3c613d06565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d6a57613d6a613d06565b604052919050565b5f6001600160401b03821115613d8a57613d8a613d06565b50601f01601f191660200190565b5f805f60608486031215613daa575f80fd5b83359250613dba60208501613c6f565b915060408401356001600160401b03811115613dd4575f80fd5b8401601f81018613613de4575f80fd5b8035613df7613df282613d72565b613d42565b818152876020838501011115613e0b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215613e3b575f80fd5b613e4483613beb565b91506020830135613c4181613ca5565b634e487b7160e01b5f52602160045260245ffd5b600181811c90821680613e7c57607f821691505b602082108103613bce57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454613eac81613e68565b806020870152604060018084165f8114613ecd5760018114613ee957613f16565b60ff19851660408a0152604084151560051b8a01019550613f16565b895f5260205f205f5b85811015613f0d5781548b8201860152908301908801613ef2565b8a016040019650505b509398975050505050505050565b5f60208284031215613f34575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613fb357613fb3613f7d565b500490565b80820281158282048414176107e2576107e2613f91565b5f5b83811015613fe9578181015183820152602001613fd1565b50505f910152565b8051613bfe81613ca5565b5f806040838503121561400d575f80fd5b82516001600160401b0380821115614023575f80fd5b9084019060608287031215614036575f80fd5b61403e613d1a565b8251815260208084015161405181613c03565b82820152604084015183811115614066575f80fd5b80850194505087601f85011261407a575f80fd5b8351925061408a613df284613d72565b838152888285870101111561409d575f80fd5b6140ac84838301848801613fcf565b806040840152508195506140c1818801613ff1565b9450505050509250929050565b6001600160401b038281168282160390808211156140ee576140ee613f91565b5092915050565b601f821115610b9c57805f5260205f20601f840160051c8101602085101561411a5750805b601f840160051c820191505b81811015614139575f8155600101614126565b5050505050565b81516001600160401b0381111561415957614159613d06565b61416d816141678454613e68565b846140f5565b602080601f8311600181146141a0575f84156141895750858301515b5f19600386901b1c1916600185901b17855561040e565b5f85815260208120601f198616915b828110156141ce578886015182559484019460019091019084016141af565b50858210156141eb57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f8251806020840152614219816040850160208701613fcf565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156107e2576107e2613f91565b634e487b7160e01b5f52603260045260245ffd5b808201808211156107e2576107e2613f91565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b038083168181036143e8576143e8613f91565b6001019392505050565b6001600160401b038181168382160190808211156140ee576140ee613f91565b5f60208284031215614422575f80fd5b8135613c9e81613c03565b6001600160401b0381811683821602808216919082811461445057614450613f91565b505092915050565b5f6001600160401b038084168061447157614471613f7d565b92169190910492915050565b5f825161448e818460208701613fcf565b9190910192915050565b5f602082840312156144a8575f80fd5b813560ff81168114613c9e575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 8d1ecea88..a43bb2609 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -39,7 +39,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612d74380380612d7483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c278061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b836600461239c565b6101b1565b005b6100d26100cd366004612460565b6103b5565b6040519081526020015b60405180910390f35b6100bd6103d5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f36600461239c565b6103e8565b6100bd610152366004612516565b6103f4565b6101196005600160991b0181565b6100bd61017336600461239c565b6105ad565b6100bd61018636600461254a565b6106c1565b6100bd610199366004612586565b6107cf565b6100bd6101ac3660046125ae565b610809565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040808220815160e0810190925280545f80516020612bfb83398151915293929190829060ff166005811115610211576102116125d8565b6005811115610222576102226125d8565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916102ac906125ec565b90501180156102cd57506003815160058111156102cb576102cb6125d8565b145b6103365760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161036f9190600401612624565b6020604051808303815f875af115801561038b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103af91906126ae565b50505050565b5f6103be610bdc565b6103ca84868585610c37565b90505b949350505050565b6103dd610bdc565b6103e65f61107e565b565b6103f1816110ee565b50565b5f80516020612bfb8339815191525f61040c8361144d565b90505f8061041d83604001516115e8565b915091508061047f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161032d565b5f82815260058501602052604081208054610499906125ec565b90501180156104cb575060015f83815260078601602052604090205460ff1660058111156104c9576104c96125d8565b145b6104e75760405162461bcd60e51b815260040161032d906126c5565b5f82815260058501602052604081206104ff91612352565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612bfb8339815191529291906105f5906125ec565b9050118015610627575060015f83815260078301602052604090205460ff166005811115610625576106256125d8565b145b6106435760405162461bcd60e51b815260040161032d906126c5565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161067c9190600401612624565b6020604051808303815f875af1158015610698573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106bc91906126ae565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107055750825b90505f826001600160401b031660011480156107205750303b155b90508115801561072e575080155b1561074c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561077657845460ff60401b1916600160401b1785555b6107808787611789565b83156107c657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6107d7610bdc565b6001600160a01b03811661080057604051631e4fbdf760e01b81525f600482015260240161032d565b6103f18161107e565b5f5f80516020612bfb8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610864573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261088b9190810190612739565b91509150806108ac5760405162461bcd60e51b815260040161032d9061280b565b5f8415610930575f6108c184604001516117a7565b919350909150506001600160401b0381161561092a5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161032d565b506109a6565b5f61093e84604001516115e8565b909250905080156109a45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161032d565b505b5f818152600785016020526040808220815160e081019092528054829060ff1660058111156109d7576109d76125d8565b60058111156109e8576109e86125d8565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610a795760405162461bcd60e51b815260040161032d90612851565b5f600382516005811115610a8f57610a8f6125d8565b1480610aad5750600282516005811115610aab57610aab6125d8565b145b15610ad057506020808201515f9081526008870190915260408120556004610ad4565b5060055b5f83815260078701602052604090208251815484929190829060ff19166001836005811115610b0557610b056125d8565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b33610c0e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103e65760405163118cdaa760e01b815233600482015260240161032d565b5f610c406119e2565b5f80516020612bfb833981519152426001600160401b038516118015610c7a57506001600160401b038416610c78426202a3006128b1565b115b610cdc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161032d565b85610d335760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161032d565b5f86815260088201602052604090205415610da15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161032d565b8251603014610e085760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161032d565b610e1185611a2c565b5f80610e586040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611bcd565b5f82815260058601602052604090209193509150610e768282612915565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610ea39085906004016129d4565b6020604051808303815f875af1158015610ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee391906126ae565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115610f5c57610f5c6125d8565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561100583611f72565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103cd60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040808220815160e0810190925280545f80516020612bfb83398151915293929190829060ff16600581111561114e5761114e6125d8565b600581111561115f5761115f6125d8565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156111d9576111d96125d8565b146112355760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161032d565b60408101516001600160a01b0316336001600160a01b03161461126a5760405162461bcd60e51b815260040161032d90612851565b6112778160800151611a2c565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156112bb576112bb6125d8565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61136f8461136981611f72565b5f612026565b5f858152600685016020526040902090915061138b8282612915565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113b89085906004016129d4565b6020604051808303815f875af11580156113d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113f891906126ae565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612bfb8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156114c2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114e99190810190612739565b915091508061150a5760405162461bcd60e51b815260040161032d9061280b565b825482511461156d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161032d565b60208201516001600160a01b0316156115e05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161032d565b509392505050565b5f80825160271461160b5760405162461bcd60e51b815260040161032d90612a06565b5f805b600281101561165a57611622816001612a4f565b61162d906008612a62565b61ffff1685828151811061164357611643612a79565b016020015160f81c901b919091179060010161160e565b5061ffff81161561167d5760405162461bcd60e51b815260040161032d90612a8d565b5f805b60048110156116d857611694816003612a4f565b61169f906008612a62565b63ffffffff16866116b18360026128b1565b815181106116c1576116c1612a79565b016020015160f81c901b9190911790600101611680565b5063ffffffff81166002146116ff5760405162461bcd60e51b815260040161032d90612ad0565b5f805b60208110156117545761171681601f612a4f565b611721906008612a62565b8761172d8360066128b1565b8151811061173d5761173d612a79565b016020015160f81c901b9190911790600101611702565b505f8660268151811061176957611769612a79565b016020015191976001600160f81b03199092161515965090945050505050565b611791612243565b61179a8261228c565b6117a3816122ad565b5050565b5f805f83516036146117cb5760405162461bcd60e51b815260040161032d90612a06565b5f805b600281101561181a576117e2816001612a4f565b6117ed906008612a62565b61ffff1686828151811061180357611803612a79565b016020015160f81c901b91909117906001016117ce565b5061ffff81161561183d5760405162461bcd60e51b815260040161032d90612a8d565b5f805b600481101561189857611854816003612a4f565b61185f906008612a62565b63ffffffff16876118718360026128b1565b8151811061188157611881612a79565b016020015160f81c901b9190911790600101611840565b5063ffffffff81166001146118bf5760405162461bcd60e51b815260040161032d90612ad0565b5f805b6020811015611914576118d681601f612a4f565b6118e1906008612a62565b886118ed8360066128b1565b815181106118fd576118fd612a79565b016020015160f81c901b91909117906001016118c2565b505f805b60088110156119735761192c816007612a4f565b611937906008612a62565b6001600160401b03168961194c8360266128b1565b8151811061195c5761195c612a79565b016020015160f81c901b9190911790600101611918565b505f805b60088110156119d25761198b816007612a4f565b611996906008612a62565b6001600160401b03168a6119ab83602e6128b1565b815181106119bb576119bb612a79565b016020015160f81c901b9190911790600101611977565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a2657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612bfb8339815191529060ff165f03611a6a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611ab29083612a4f565b10611ace576001600160401b0384166040830152808252611aed565b8382604001818151611ae09190612b17565b6001600160401b03169052505b5f826020015183604001516064611b049190612b3e565b611b0e9190612b69565b600285015490915060ff9081169082161115611b895760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161032d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c375760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161032d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611cae57611c6e816001612a4f565b611c79906008612a62565b5081515f90839083908110611c9057611c90612a79565b60200101906001600160f81b03191690815f1a905350600101611c5a565b505f5b6004811015611d0c57611cc5816003612a4f565b611cd0906008612a62565b505f82611cde8360026128b1565b81518110611cee57611cee612a79565b60200101906001600160f81b03191690815f1a905350600101611cb1565b505f5b6020811015611d695784518160208110611d2b57611d2b612a79565b1a60f81b82611d3b8360066128b1565b81518110611d4b57611d4b612a79565b60200101906001600160f81b03191690815f1a905350600101611d0f565b505f5b6020811015611dc95784602001518160208110611d8b57611d8b612a79565b1a60f81b82611d9b8360266128b1565b81518110611dab57611dab612a79565b60200101906001600160f81b03191690815f1a905350600101611d6c565b505f5b6008811015611e3d57611de0816007612a4f565b611deb906008612a62565b60ff1685604001516001600160401b0316901c60f81b82826046611e0f91906128b1565b81518110611e1f57611e1f612a79565b60200101906001600160f81b03191690815f1a905350600101611dcc565b505f5b6030811015611ea85784608001518181518110611e5f57611e5f612a79565b01602001516001600160f81b03191682611e7a83604e6128b1565b81518110611e8a57611e8a612a79565b60200101906001600160f81b03191690815f1a905350600101611e40565b505f5b6008811015611f1a57611ebf816007612a4f565b611eca906008612a62565b60608601516001600160401b0390811691161c60f81b82611eec83607e6128b1565b81518110611efc57611efc612a79565b60200101906001600160f81b03191690815f1a905350600101611eab565b50600281604051611f2b9190612b9a565b602060405180830381855afa158015611f46573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f6991906126ae565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060020180545f80516020612bfb83398151915291600160a01b9091046001600160401b03169081906014611fd183612bb5565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561209f5761205f816001612a4f565b61206a906008612a62565b5081515f9083908390811061208157612081612a79565b60200101906001600160f81b03191690815f1a90535060010161204b565b505f5b6004811015612102576120b6816003612a4f565b6120c1906008612a62565b6001901c60f81b826120d48360026128b1565b815181106120e4576120e4612a79565b60200101906001600160f81b03191690815f1a9053506001016120a2565b505f5b60208110156121645761211981601f612a4f565b612124906008612a62565b86901c60f81b826121368360066128b1565b8151811061214657612146612a79565b60200101906001600160f81b03191690815f1a905350600101612105565b505f5b60088110156121cf5761217b816007612a4f565b612186906008612a62565b6001600160401b038616901c60f81b826121a18360266128b1565b815181106121b1576121b1612a79565b60200101906001600160f81b03191690815f1a905350600101612167565b505f5b600881101561223a576121e6816007612a4f565b6121f1906008612a62565b6001600160401b038516901c60f81b8261220c83602e6128b1565b8151811061221c5761221c612a79565b60200101906001600160f81b03191690815f1a9053506001016121d2565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103e657604051631afcd79f60e31b815260040160405180910390fd5b612294612243565b61229c6122be565b6122a46122ce565b6103f1816122d6565b6122b5612243565b6103f181612342565b6122c6612243565b6103e661234a565b6103e6612243565b6122de612243565b80355f80516020612bfb83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123286060830160408401612bda565b600291909101805460ff191660ff90921691909117905550565b6107d7612243565b612000612243565b50805461235e906125ec565b5f825580601f1061236d575050565b601f0160209004905f5260205f20908101906103f191905b80821115612398575f8155600101612385565b5090565b5f602082840312156123ac575f80fd5b5035919050565b80356001600160401b03811681146123c9575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612404576124046123ce565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612432576124326123ce565b604052919050565b5f6001600160401b03821115612452576124526123ce565b50601f01601f191660200190565b5f805f8060808587031215612473575f80fd5b61247c856123b3565b935060208501359250612491604086016123b3565b915060608501356001600160401b038111156124ab575f80fd5b8501601f810187136124bb575f80fd5b80356124ce6124c98261243a565b61240a565b8181528860208385010111156124e2575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146123c9575f80fd5b5f60208284031215612526575f80fd5b61252f82612503565b9392505050565b6001600160a01b03811681146103f1575f80fd5b5f80828403608081121561255c575f80fd5b6060811215612569575f80fd5b50829150606083013561257b81612536565b809150509250929050565b5f60208284031215612596575f80fd5b813561252f81612536565b80151581146103f1575f80fd5b5f80604083850312156125bf575f80fd5b6125c883612503565b9150602083013561257b816125a1565b634e487b7160e01b5f52602160045260245ffd5b600181811c9082168061260057607f821691505b60208210810361261e57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454612636816125ec565b806020870152604060018084165f81146126575760018114612673576126a0565b60ff19851660408a0152604084151560051b8a010195506126a0565b895f5260205f205f5b858110156126975781548b820186015290830190880161267c565b8a016040019650505b509398975050505050505050565b5f602082840312156126be575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f5b8381101561272657818101518382015260200161270e565b50505f910152565b80516123c9816125a1565b5f806040838503121561274a575f80fd5b82516001600160401b0380821115612760575f80fd5b9084019060608287031215612773575f80fd5b61277b6123e2565b8251815260208084015161278e81612536565b828201526040840151838111156127a3575f80fd5b80850194505087601f8501126127b7575f80fd5b835192506127c76124c98461243a565b83815288828587010111156127da575f80fd5b6127e98483830184880161270c565b806040840152508195506127fe81880161272e565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156128c4576128c461289d565b92915050565b601f8211156106bc57805f5260205f20601f840160051c810160208510156128ef5750805b601f840160051c820191505b8181101561290e575f81556001016128fb565b5050505050565b81516001600160401b0381111561292e5761292e6123ce565b6129428161293c84546125ec565b846128ca565b602080601f831160018114612975575f841561295e5750858301515b5f19600386901b1c1916600185901b1785556129cc565b5f85815260208120601f198616915b828110156129a357888601518255948401946001909101908401612984565b50858210156129c057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526129f281604085016020870161270c565b601f01601f19169190910160400192915050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156128c4576128c461289d565b80820281158282048414176128c4576128c461289d565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612b3757612b3761289d565b5092915050565b6001600160401b03818116838216028082169190828114612b6157612b6161289d565b505092915050565b5f6001600160401b0380841680612b8e57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612bab81846020870161270c565b9190910192915050565b5f6001600160401b03808316818103612bd057612bd061289d565b6001019392505050565b5f60208284031215612bea575f80fd5b813560ff8116811461252f575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612db3380380612db383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c668061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b8366004612421565b6101b1565b005b6100d26100cd3660046124e5565b6103b5565b6040519081526020015b60405180910390f35b6100bd6103d5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f366004612421565b6103e8565b6100bd61015236600461259b565b6103f4565b6101196005600160991b0181565b6100bd610173366004612421565b6105ad565b6100bd6101863660046125cf565b6106c1565b6100bd61019936600461260b565b6107cf565b6100bd6101ac366004612633565b610809565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040808220815160e0810190925280545f80516020612c3a83398151915293929190829060ff1660058111156102115761021161265d565b60058111156102225761022261265d565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916102ac90612671565b90501180156102cd57506003815160058111156102cb576102cb61265d565b145b6103365760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161036f91906004016126a9565b6020604051808303815f875af115801561038b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103af9190612733565b50505050565b5f6103be610c1b565b6103ca84868585610c76565b90505b949350505050565b6103dd610c1b565b6103e65f6110bd565b565b6103f18161112d565b50565b5f80516020612c3a8339815191525f61040c8361148c565b90505f8061041d836040015161166d565b915091508061047f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161032d565b5f8281526005850160205260408120805461049990612671565b90501180156104cb575060015f83815260078601602052604090205460ff1660058111156104c9576104c961265d565b145b6104e75760405162461bcd60e51b815260040161032d9061274a565b5f82815260058501602052604081206104ff916123d7565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612c3a8339815191529291906105f590612671565b9050118015610627575060015f83815260078301602052604090205460ff1660058111156106255761062561265d565b145b6106435760405162461bcd60e51b815260040161032d9061274a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161067c91906004016126a9565b6020604051808303815f875af1158015610698573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106bc9190612733565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107055750825b90505f826001600160401b031660011480156107205750303b155b90508115801561072e575080155b1561074c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561077657845460ff60401b1916600160401b1785555b610780878761180e565b83156107c657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6107d7610c1b565b6001600160a01b03811661080057604051631e4fbdf760e01b81525f600482015260240161032d565b6103f1816110bd565b5f5f80516020612c3a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610864573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261088b91908101906127be565b91509150806108eb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b606482015260840161032d565b5f841561096f575f610900846040015161182c565b919350909150506001600160401b038116156109695760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161032d565b506109e5565b5f61097d846040015161166d565b909250905080156109e35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161032d565b505b5f818152600785016020526040808220815160e081019092528054829060ff166005811115610a1657610a1661265d565b6005811115610a2757610a2761265d565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610ab85760405162461bcd60e51b815260040161032d90612890565b5f600382516005811115610ace57610ace61265d565b1480610aec5750600282516005811115610aea57610aea61265d565b145b15610b0f57506020808201515f9081526008870190915260408120556004610b13565b5060055b5f83815260078701602052604090208251815484929190829060ff19166001836005811115610b4457610b4461265d565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b33610c4d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103e65760405163118cdaa760e01b815233600482015260240161032d565b5f610c7f611a67565b5f80516020612c3a833981519152426001600160401b038516118015610cb957506001600160401b038416610cb7426202a3006128f0565b115b610d1b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161032d565b85610d725760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161032d565b5f86815260088201602052604090205415610de05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161032d565b8251603014610e475760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161032d565b610e5085611ab1565b5f80610e976040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611c52565b5f82815260058601602052604090209193509150610eb58282612954565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610ee2908590600401612a13565b6020604051808303815f875af1158015610efe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f229190612733565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115610f9b57610f9b61265d565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561104483611ff7565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103cd60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040808220815160e0810190925280545f80516020612c3a83398151915293929190829060ff16600581111561118d5761118d61265d565b600581111561119e5761119e61265d565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156112185761121861265d565b146112745760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161032d565b60408101516001600160a01b0316336001600160a01b0316146112a95760405162461bcd60e51b815260040161032d90612890565b6112b68160800151611ab1565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156112fa576112fa61265d565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6113ae846113a881611ff7565b5f6120ab565b5f85815260068501602052604090209091506113ca8282612954565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113f7908590600401612a13565b6020604051808303815f875af1158015611413573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114379190612733565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612c3a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611501573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152891908101906127be565b915091508061158f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161032d565b82548251146115f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161032d565b60208201516001600160a01b0316156116655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161032d565b509392505050565b5f8082516027146116905760405162461bcd60e51b815260040161032d90612a45565b5f805b60028110156116df576116a7816001612a8e565b6116b2906008612aa1565b61ffff168582815181106116c8576116c8612ab8565b016020015160f81c901b9190911790600101611693565b5061ffff8116156117025760405162461bcd60e51b815260040161032d90612acc565b5f805b600481101561175d57611719816003612a8e565b611724906008612aa1565b63ffffffff16866117368360026128f0565b8151811061174657611746612ab8565b016020015160f81c901b9190911790600101611705565b5063ffffffff81166002146117845760405162461bcd60e51b815260040161032d90612b0f565b5f805b60208110156117d95761179b81601f612a8e565b6117a6906008612aa1565b876117b28360066128f0565b815181106117c2576117c2612ab8565b016020015160f81c901b9190911790600101611787565b505f866026815181106117ee576117ee612ab8565b016020015191976001600160f81b03199092161515965090945050505050565b6118166122c8565b61181f82612311565b61182881612332565b5050565b5f805f83516036146118505760405162461bcd60e51b815260040161032d90612a45565b5f805b600281101561189f57611867816001612a8e565b611872906008612aa1565b61ffff1686828151811061188857611888612ab8565b016020015160f81c901b9190911790600101611853565b5061ffff8116156118c25760405162461bcd60e51b815260040161032d90612acc565b5f805b600481101561191d576118d9816003612a8e565b6118e4906008612aa1565b63ffffffff16876118f68360026128f0565b8151811061190657611906612ab8565b016020015160f81c901b91909117906001016118c5565b5063ffffffff81166001146119445760405162461bcd60e51b815260040161032d90612b0f565b5f805b60208110156119995761195b81601f612a8e565b611966906008612aa1565b886119728360066128f0565b8151811061198257611982612ab8565b016020015160f81c901b9190911790600101611947565b505f805b60088110156119f8576119b1816007612a8e565b6119bc906008612aa1565b6001600160401b0316896119d18360266128f0565b815181106119e1576119e1612ab8565b016020015160f81c901b919091179060010161199d565b505f805b6008811015611a5757611a10816007612a8e565b611a1b906008612aa1565b6001600160401b03168a611a3083602e6128f0565b81518110611a4057611a40612ab8565b016020015160f81c901b91909117906001016119fc565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611aab57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612c3a8339815191529060ff165f03611aef575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611b379083612a8e565b10611b53576001600160401b0384166040830152808252611b72565b8382604001818151611b659190612b56565b6001600160401b03169052505b5f826020015183604001516064611b899190612b7d565b611b939190612ba8565b600285015490915060ff9081169082161115611c0e5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161032d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611cbc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161032d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611d3357611cf3816001612a8e565b611cfe906008612aa1565b5081515f90839083908110611d1557611d15612ab8565b60200101906001600160f81b03191690815f1a905350600101611cdf565b505f5b6004811015611d9157611d4a816003612a8e565b611d55906008612aa1565b505f82611d638360026128f0565b81518110611d7357611d73612ab8565b60200101906001600160f81b03191690815f1a905350600101611d36565b505f5b6020811015611dee5784518160208110611db057611db0612ab8565b1a60f81b82611dc08360066128f0565b81518110611dd057611dd0612ab8565b60200101906001600160f81b03191690815f1a905350600101611d94565b505f5b6020811015611e4e5784602001518160208110611e1057611e10612ab8565b1a60f81b82611e208360266128f0565b81518110611e3057611e30612ab8565b60200101906001600160f81b03191690815f1a905350600101611df1565b505f5b6008811015611ec257611e65816007612a8e565b611e70906008612aa1565b60ff1685604001516001600160401b0316901c60f81b82826046611e9491906128f0565b81518110611ea457611ea4612ab8565b60200101906001600160f81b03191690815f1a905350600101611e51565b505f5b6030811015611f2d5784608001518181518110611ee457611ee4612ab8565b01602001516001600160f81b03191682611eff83604e6128f0565b81518110611f0f57611f0f612ab8565b60200101906001600160f81b03191690815f1a905350600101611ec5565b505f5b6008811015611f9f57611f44816007612a8e565b611f4f906008612aa1565b60608601516001600160401b0390811691161c60f81b82611f7183607e6128f0565b81518110611f8157611f81612ab8565b60200101906001600160f81b03191690815f1a905350600101611f30565b50600281604051611fb09190612bd9565b602060405180830381855afa158015611fcb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611fee9190612733565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060020180545f80516020612c3a83398151915291600160a01b9091046001600160401b0316908190601461205683612bf4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612124576120e4816001612a8e565b6120ef906008612aa1565b5081515f9083908390811061210657612106612ab8565b60200101906001600160f81b03191690815f1a9053506001016120d0565b505f5b60048110156121875761213b816003612a8e565b612146906008612aa1565b6001901c60f81b826121598360026128f0565b8151811061216957612169612ab8565b60200101906001600160f81b03191690815f1a905350600101612127565b505f5b60208110156121e95761219e81601f612a8e565b6121a9906008612aa1565b86901c60f81b826121bb8360066128f0565b815181106121cb576121cb612ab8565b60200101906001600160f81b03191690815f1a90535060010161218a565b505f5b600881101561225457612200816007612a8e565b61220b906008612aa1565b6001600160401b038616901c60f81b826122268360266128f0565b8151811061223657612236612ab8565b60200101906001600160f81b03191690815f1a9053506001016121ec565b505f5b60088110156122bf5761226b816007612a8e565b612276906008612aa1565b6001600160401b038516901c60f81b8261229183602e6128f0565b815181106122a1576122a1612ab8565b60200101906001600160f81b03191690815f1a905350600101612257565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103e657604051631afcd79f60e31b815260040160405180910390fd5b6123196122c8565b612321612343565b612329612353565b6103f18161235b565b61233a6122c8565b6103f1816123c7565b61234b6122c8565b6103e66123cf565b6103e66122c8565b6123636122c8565b80355f80516020612c3a83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123ad6060830160408401612c19565b600291909101805460ff191660ff90921691909117905550565b6107d76122c8565b6120856122c8565b5080546123e390612671565b5f825580601f106123f2575050565b601f0160209004905f5260205f20908101906103f191905b8082111561241d575f815560010161240a565b5090565b5f60208284031215612431575f80fd5b5035919050565b80356001600160401b038116811461244e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561248957612489612453565b60405290565b604051601f8201601f191681016001600160401b03811182821017156124b7576124b7612453565b604052919050565b5f6001600160401b038211156124d7576124d7612453565b50601f01601f191660200190565b5f805f80608085870312156124f8575f80fd5b61250185612438565b93506020850135925061251660408601612438565b915060608501356001600160401b03811115612530575f80fd5b8501601f81018713612540575f80fd5b803561255361254e826124bf565b61248f565b818152886020838501011115612567575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff8116811461244e575f80fd5b5f602082840312156125ab575f80fd5b6125b482612588565b9392505050565b6001600160a01b03811681146103f1575f80fd5b5f8082840360808112156125e1575f80fd5b60608112156125ee575f80fd5b508291506060830135612600816125bb565b809150509250929050565b5f6020828403121561261b575f80fd5b81356125b4816125bb565b80151581146103f1575f80fd5b5f8060408385031215612644575f80fd5b61264d83612588565b9150602083013561260081612626565b634e487b7160e01b5f52602160045260245ffd5b600181811c9082168061268557607f821691505b6020821081036126a357634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546126bb81612671565b806020870152604060018084165f81146126dc57600181146126f857612725565b60ff19851660408a0152604084151560051b8a01019550612725565b895f5260205f205f5b8581101561271c5781548b8201860152908301908801612701565b8a016040019650505b509398975050505050505050565b5f60208284031215612743575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f5b838110156127ab578181015183820152602001612793565b50505f910152565b805161244e81612626565b5f80604083850312156127cf575f80fd5b82516001600160401b03808211156127e5575f80fd5b90840190606082870312156127f8575f80fd5b612800612467565b82518152602080840151612813816125bb565b82820152604084015183811115612828575f80fd5b80850194505087601f85011261283c575f80fd5b8351925061284c61254e846124bf565b838152888285870101111561285f575f80fd5b61286e84838301848801612791565b806040840152508195506128838188016127b3565b9450505050509250929050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115612903576129036128dc565b92915050565b601f8211156106bc57805f5260205f20601f840160051c8101602085101561292e5750805b601f840160051c820191505b8181101561294d575f815560010161293a565b5050505050565b81516001600160401b0381111561296d5761296d612453565b6129818161297b8454612671565b84612909565b602080601f8311600181146129b4575f841561299d5750858301515b5f19600386901b1c1916600185901b178555612a0b565b5f85815260208120601f198616915b828110156129e2578886015182559484019460019091019084016129c3565b50858210156129ff57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f8251806020840152612a31816040850160208701612791565b601f01601f19169190910160400192915050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b81810381811115612903576129036128dc565b8082028115828204841417612903576129036128dc565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612b7657612b766128dc565b5092915050565b6001600160401b03818116838216028082169190828114612ba057612ba06128dc565b505092915050565b5f6001600160401b0380841680612bcd57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612bea818460208701612791565b9190910192915050565b5f6001600160401b03808316818103612c0f57612c0f6128dc565b6001019392505050565b5f60208284031215612c29575f80fd5b813560ff811681146125b4575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index d39357bc0..fff4c3128 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -103,9 +103,7 @@ contract ERC20TokenStakingManager is bytes32 validationID, uint256 delegationAmount ) external { - return _initializeDelegatorRegistration( - validationID, _msgSender(), valueToWeight(_lock(delegationAmount)) - ); + return _initializeDelegatorRegistration(validationID, _msgSender(), delegationAmount); } // Must be guarded with reentrancy guard for safe transfer from diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index d1faecbca..b3efb0f09 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -62,9 +62,7 @@ contract NativeTokenStakingManager is * @param validationID The ID of the validation period being delegated to. */ function initializeDelegatorRegistration(bytes32 validationID) external payable { - return _initializeDelegatorRegistration( - validationID, _msgSender(), valueToWeight(_lock(msg.value)) - ); + return _initializeDelegatorRegistration(validationID, _msgSender(), msg.value); } // solhint-enable ordering diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 82b3d1fcb..6a9feee43 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -5,7 +5,9 @@ pragma solidity 0.8.25; -import {IPoSValidatorManager, Delegator} from "./interfaces/IPoSValidatorManager.sol"; +import { + IPoSValidatorManager, Delegator, DelegatorStatus +} from "./interfaces/IPoSValidatorManager.sol"; import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; import {ValidatorManager} from "./ValidatorManager.sol"; import {Validator, ValidatorStatus} from "./interfaces/IValidatorManager.sol"; @@ -29,11 +31,13 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager /// @notice Maps the validationID to the uptime of the validator. mapping(bytes32 validationID => uint64) _uptimes; /// @notice Maps the validationID to a mapping of delegator address to delegator information. - mapping(bytes32 => mapping(address => Delegator)) _delegatorStakes; + mapping(bytes32 validationID => mapping(address delegator => Delegator)) _delegatorStakes; /// @notice Maps the validationID to a mapping of delegator address to pending register delegator messages. - mapping(bytes32 => mapping(address => bytes)) _pendingRegisterDelegatorMessages; + mapping(bytes32 validationID => mapping(address delegator => bytes)) + _pendingRegisterDelegatorMessages; /// @notice Maps the validationID to a mapping of delegator address to pending end delegator messages. - mapping(bytes32 => mapping(address => bytes)) _pendingEndDelegatorMessages; + mapping(bytes32 validationID => mapping(address delegator => bytes)) + _pendingEndDelegatorMessages; /// @notice Maps the validationID to the uptime of the validator. mapping(bytes32 validationID => uint64) _validatorUptimes; } @@ -127,7 +131,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Ensure the weight is within the valid range. require( weight >= $._minimumStakeAmount && weight <= $._maximumStakeAmount, - "PoSValidatorManager: Invalid stake amount" + "PoSValidatorManager: invalid stake amount" ); return weight; } @@ -146,20 +150,21 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function _initializeDelegatorRegistration( bytes32 validationID, address delegator, - uint64 weight + uint256 delegationAmount ) internal nonReentrant { + uint64 weight = valueToWeight(_lock(delegationAmount)); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Ensure the validation period is active Validator memory validator = _getValidator(validationID); require( - validator.status == ValidatorStatus.Active, "ValidatorManager: Validator not active" + validator.status == ValidatorStatus.Active, "ValidatorManager: validator not active" ); // Ensure the delegator is not already registered require( $._delegatorStakes[validationID][delegator].weight == 0, - "ValidatorManager: Delegator already registered" + "ValidatorManager: delegator already registered" ); _checkAndUpdateChurnTracker(weight); @@ -177,20 +182,15 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager weight: weight, startedAt: uint64(block.timestamp), endedAt: 0, - status: ValidatorStatus.PendingAdded + status: DelegatorStatus.PendingAdded }); emit DelegatorAdded(validationID, messageID, delegator, weight, block.timestamp); } function resendDelegatorRegistration(bytes32 validationID, address delegator) external { + _checkPendingRegisterDelegatorMessages(validationID, delegator); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - require( - $._pendingRegisterDelegatorMessages[validationID][delegator].length > 0 - && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingAdded, - "PoSValidatorManager: Delegator registration not pending" - ); - // Submit the message to the Warp precompile. WARP_MESSENGER.sendWarpMessage($._pendingRegisterDelegatorMessages[validationID][delegator]); } @@ -202,18 +202,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce, uint64 weight) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - require( - $._pendingRegisterDelegatorMessages[validationID][delegator].length > 0 - && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingAdded, - "PoSValidatorManager: Delegator registration not pending" - ); + _checkPendingRegisterDelegatorMessages(validationID, delegator); delete $._pendingRegisterDelegatorMessages[validationID][delegator]; // Update the validator weight and delegator status Validator memory validator = _getValidator(validationID); - require(validator.messageNonce >= nonce, "PoSValidatorManager: Invalid nonce"); + require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); validator.weight = weight; - $._delegatorStakes[validationID][delegator].status = ValidatorStatus.Active; + $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Active; _setValidator(validationID, validator); emit DelegatorRegistered( @@ -231,15 +227,15 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Ensure the delegator is active Delegator memory delegator = $._delegatorStakes[validationID][_msgSender()]; require( - delegator.status == ValidatorStatus.Active, "ValidatorManager: Delegator not active" + delegator.status == DelegatorStatus.Active, "ValidatorManager: delegator not active" ); - delegator.status = ValidatorStatus.PendingRemoved; + delegator.status = DelegatorStatus.PendingRemoved; delegator.endedAt = uint64(block.timestamp); $._delegatorStakes[validationID][_msgSender()] = delegator; Validator memory validator = _getValidator(validationID); - require(validator.weight >= delegator.weight, "PoSValidatorManager: Invalid weight"); + require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages @@ -253,12 +249,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager } function resendEndDelegation(bytes32 validationID, address delegator) external { + _checkPendingEndDelegatorMessage(validationID, delegator); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - require( - $._pendingEndDelegatorMessages[validationID][delegator].length > 0 - && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingRemoved, - "PoSValidatorManager: Delegator removal not pending" - ); WARP_MESSENGER.sendWarpMessage($._pendingEndDelegatorMessages[validationID][delegator]); } @@ -269,20 +261,40 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce, uint64 weight) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - require( - $._pendingEndDelegatorMessages[validationID][delegator].length > 0 - && $._delegatorStakes[validationID][delegator].status == ValidatorStatus.PendingRemoved, - "PoSValidatorManager: Delegator removal not pending" - ); + _checkPendingEndDelegatorMessage(validationID, delegator); delete $._pendingEndDelegatorMessages[validationID][delegator]; // Update the validator weight and delegator status Validator memory validator = _getValidator(validationID); - require(validator.messageNonce >= nonce, "PoSValidatorManager: Invalid nonce"); - $._delegatorStakes[validationID][delegator].status = ValidatorStatus.Completed; + require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); + $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Completed; validator.weight = weight; _setValidator(validationID, validator); emit DelegationEnded(validationID, delegator, weight); } + + function _checkPendingEndDelegatorMessage( + bytes32 validationID, + address delegator + ) private view { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + require( + $._pendingEndDelegatorMessages[validationID][delegator].length > 0 + && $._delegatorStakes[validationID][delegator].status == DelegatorStatus.PendingRemoved, + "PoSValidatorManager: delegator removal not pending" + ); + } + + function _checkPendingRegisterDelegatorMessages( + bytes32 validationID, + address delegator + ) private view { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + require( + $._pendingRegisterDelegatorMessages[validationID][delegator].length > 0 + && $._delegatorStakes[validationID][delegator].status == DelegatorStatus.PendingAdded, + "PoSValidatorManager: delegator registration not pending" + ); + } } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 18df9e4dc..618860c27 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -361,14 +361,14 @@ abstract contract ValidatorManager is ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "ValidatorManager: Invalid warp message"); + require(valid, "ValidatorManager: Invinvalidalid warp message"); require( warpMessage.sourceChainID == $._pChainBlockchainID, - "ValidatorManager: Invalid source chain ID" + "ValidatorManager: invalid source chain ID" ); require( warpMessage.originSenderAddress == address(0), - "ValidatorManager: Invalid origin sender address" + "ValidatorManager: invalid origin sender address" ); return warpMessage; } diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index cd66db246..d5bbec475 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -426,14 +426,14 @@ library ValidatorMessages { pure returns (bytes32, uint64, uint64) { - require(input.length == 54, "ValidatorMessages: Invalid message length"); + require(input.length == 54, "ValidatorMessages: invalid message length"); // Unpack the codec ID. uint16 codecID; for (uint256 i; i < 2; ++i) { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } - require(codecID == CODEC_ID, "ValidatorMessages: Invalid codec ID"); + require(codecID == CODEC_ID, "ValidatorMessages: invalid codec ID"); // Unpack the type ID. uint32 typeID; @@ -442,7 +442,7 @@ library ValidatorMessages { } require( typeID == SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID, - "ValidatorMessages: Invalid message type" + "ValidatorMessages: invalid message type" ); // Unpack the validation ID. diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 724bb73a7..6497eca42 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -6,10 +6,18 @@ pragma solidity 0.8.25; import { - IValidatorManager, ValidatorStatus, ValidatorManagerSettings + IValidatorManager, ValidatorManagerSettings } from "./IValidatorManager.sol"; import {IRewardCalculator} from "./IRewardCalculator.sol"; +enum DelegatorStatus { + Unknown, + PendingAdded, + Active, + PendingRemoved, + Completed +} + struct PoSValidatorManagerSettings { ValidatorManagerSettings baseSettings; uint256 minimumStakeAmount; @@ -22,7 +30,7 @@ struct Delegator { uint64 weight; uint64 startedAt; uint64 endedAt; - ValidatorStatus status; + DelegatorStatus status; } interface IPoSValidatorManager is IValidatorManager { From 3e8279eb976da156abcf64d2d65edfe175307eec Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 29 Aug 2024 08:27:32 -0400 Subject: [PATCH 155/545] Fixes --- .../ERC20TokenStakingManager.go | 30 ++++++++++--------- .../NativeTokenStakingManager.go | 30 ++++++++++--------- .../PoAValidatorManager.go | 17 +++++------ contracts/staking/PoSValidatorManager.sol | 18 ++++++----- .../interfaces/IPoSValidatorManager.sol | 3 +- .../tests/ERC20TokenStakingManagerTests.t.sol | 3 +- .../NativeTokenStakingManagerTests.t.sol | 3 +- .../staking/tests/ValidatorManagerTests.t.sol | 3 +- tests/utils/staking.go | 25 +++++++++------- 9 files changed, 73 insertions(+), 59 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 46aee70c2..5fda79d62 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -31,24 +31,26 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { - BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int - MinimumStakeDuration uint64 - RewardCalculator common.Address + BaseSettings ValidatorManagerSettings + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + ChurnTrackerStartTime *big.Int + ChurnPeriodSeconds uint64 + MinimumStakeDuration uint64 + MaximumChurnPercentage uint8 + RewardCalculator common.Address } // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { PChainBlockchainID [32]byte SubnetID [32]byte - MaximumHourlyChurn uint8 } // 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161350238038061350283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6133b58061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063872fda6411610063578063872fda641461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f57806327f39ca8146100b45780632e2194d8146100c757806362065856146100f757806376f7862114610118575b5f80fd5b6100b26100ad366004612af3565b61019d565b005b6100b26100c2366004612b1e565b610373565b6100da6100d5366004612af3565b610481565b6040516001600160401b0390911681526020015b60405180910390f35b61010a610105366004612b76565b610497565b6040519081526020016100ee565b6100b2610126366004612bb6565b6104b0565b61010a610139366004612c83565b6107e1565b6100b261014c366004612d1f565b610806565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100ee565b6100b2610185366004612af3565b610b1f565b6100b2610198366004612d38565b610c2e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061338983398151915293929190829060ff1660058111156101fd576101fd612d62565b600581111561020e5761020e612d62565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561028557610285612d62565b146102ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6102ff8483606001515f611001565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061032c908490600401612d98565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c9190612dca565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103b75750825b90505f826001600160401b031660011480156103d25750303b155b9050811580156103e0575080155b156103fe5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561042857845460ff60401b1916600160401b1785555b610432878761121e565b831561047857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61049164e8d4a5100083612e09565b92915050565b5f6104916001600160401b03831664e8d4a51000612e1c565b81156107d3575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610524573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261054b9190810190612e3e565b91509150806105ae5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016102e6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106159190612dca565b8251146106795760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016102e6565b60208201516001600160a01b0316156106ef5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016102e6565b5f806106fe846040015161123c565b9150915081881461076b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016102e6565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6107dc83611414565b505050565b5f806107ec8661175c565b90506107fa8582868661181c565b9150505b949350505050565b5f5f805160206133898339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610861573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108889190810190612e3e565b91509150806108a95760405162461bcd60e51b81526004016102e690612f10565b825482511461090c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102e6565b60208201516001600160a01b03161561097f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102e6565b5f8061098e8460400151611c53565b91509150806109f05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102e6565b5f82815260058601602052604081208054610a0a90612f56565b9050118015610a3c575060015f83815260068701602052604090205460ff166005811115610a3a57610a3a612d62565b145b610a585760405162461bcd60e51b81526004016102e690612f8e565b5f8281526005860160205260408120610a7091612aa9565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613389833981519152929190610b6790612f56565b9050118015610b99575060015f83815260068301602052604090205460ff166005811115610b9757610b97612d62565b145b610bb55760405162461bcd60e51b81526004016102e690612f8e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bee9190600401612fd5565b6020604051808303815f875af1158015610c0a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107dc9190612dca565b5f5f805160206133898339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c89573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cb09190810190612e3e565b9150915080610cd15760405162461bcd60e51b81526004016102e690612f10565b5f8415610d55575f610ce68460400151611df4565b919350909150506001600160401b03811615610d4f5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016102e6565b50610dcb565b5f610d638460400151611c53565b90925090508015610dc95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102e6565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610dfc57610dfc612d62565b6005811115610e0d57610e0d612d62565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610e9e5760405162461bcd60e51b81526004016102e69061305f565b5f600382516005811115610eb457610eb4612d62565b1480610ed25750600282516005811115610ed057610ed0612d62565b145b15610ef557506020808201515f9081526007870190915260408120556004610ef9565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f2a57610f2a612d62565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561107a5761103a8160016130ab565b611045906008612e1c565b5081515f9083908390811061105c5761105c6130be565b60200101906001600160f81b03191690815f1a905350600101611026565b505f5b60048110156110dd576110918160036130ab565b61109c906008612e1c565b6001901c60f81b826110af8360026130d2565b815181106110bf576110bf6130be565b60200101906001600160f81b03191690815f1a90535060010161107d565b505f5b602081101561113f576110f481601f6130ab565b6110ff906008612e1c565b86901c60f81b826111118360066130d2565b81518110611121576111216130be565b60200101906001600160f81b03191690815f1a9053506001016110e0565b505f5b60088110156111aa576111568160076130ab565b611161906008612e1c565b6001600160401b038616901c60f81b8261117c8360266130d2565b8151811061118c5761118c6130be565b60200101906001600160f81b03191690815f1a905350600101611142565b505f5b6008811015611215576111c18160076130ab565b6111cc906008612e1c565b6001600160401b038516901c60f81b826111e783602e6130d2565b815181106111f7576111f76130be565b60200101906001600160f81b03191690815f1a9053506001016111ad565b50949350505050565b61122661202f565b61122f8261207a565b611238816120c0565b5050565b5f808251602e1461125f5760405162461bcd60e51b81526004016102e6906130e5565b5f805b60028110156112ae576112768160016130ab565b611281906008612e1c565b61ffff16858281518110611297576112976130be565b016020015160f81c901b9190911790600101611262565b5061ffff8116156112d15760405162461bcd60e51b81526004016102e69061312e565b5f805b600481101561132c576112e88160036130ab565b6112f3906008612e1c565b63ffffffff16866113058360026130d2565b81518110611315576113156130be565b016020015160f81c901b91909117906001016112d4565b5063ffffffff81166004146113535760405162461bcd60e51b81526004016102e690613171565b5f805b60208110156113a85761136a81601f6130ab565b611375906008612e1c565b876113818360066130d2565b81518110611391576113916130be565b016020015160f81c901b9190911790600101611356565b505f805b6008811015611407576113c08160076130ab565b6113cb906008612e1c565b6001600160401b0316886113e08360266130d2565b815181106113f0576113f06130be565b016020015160f81c901b91909117906001016113ac565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061338983398151915293929190829060ff16600581111561147457611474612d62565b600581111561148557611485612d62565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156114ff576114ff612d62565b1461155b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102e6565b60408101516001600160a01b0316336001600160a01b0316146115905760405162461bcd60e51b81526004016102e69061305f565b61159d8160800151612174565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156115e1576115e1612d62565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061169890859083611001565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116c7908590600401612d98565b6020604051808303815f875af11580156116e3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117079190612dca565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008161178884612315565b90505f61179482610481565b83549091506001600160401b038216108015906117be57508260010154816001600160401b031611155b6107fe5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016102e6565b5f61182561234b565b5f80516020613389833981519152426001600160401b03851611801561185f57506001600160401b03841661185d426202a3006130d2565b115b6118c15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102e6565b856119185760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102e6565b5f868152600782016020526040902054156119865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102e6565b82516030146119ed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102e6565b6119f685612174565b5f80611a3d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612395565b5f82815260058601602052604090209193509150611a5b82826131fc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611a88908590600401612d98565b6020604051808303815f875af1158015611aa4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ac89190612dca565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611b4157611b41612d62565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506107fe60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611c765760405162461bcd60e51b81526004016102e6906130e5565b5f805b6002811015611cc557611c8d8160016130ab565b611c98906008612e1c565b61ffff16858281518110611cae57611cae6130be565b016020015160f81c901b9190911790600101611c79565b5061ffff811615611ce85760405162461bcd60e51b81526004016102e69061312e565b5f805b6004811015611d4357611cff8160036130ab565b611d0a906008612e1c565b63ffffffff1686611d1c8360026130d2565b81518110611d2c57611d2c6130be565b016020015160f81c901b9190911790600101611ceb565b5063ffffffff8116600214611d6a5760405162461bcd60e51b81526004016102e690613171565b5f805b6020811015611dbf57611d8181601f6130ab565b611d8c906008612e1c565b87611d988360066130d2565b81518110611da857611da86130be565b016020015160f81c901b9190911790600101611d6d565b505f86602681518110611dd457611dd46130be565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611e185760405162461bcd60e51b81526004016102e6906130e5565b5f805b6002811015611e6757611e2f8160016130ab565b611e3a906008612e1c565b61ffff16868281518110611e5057611e506130be565b016020015160f81c901b9190911790600101611e1b565b5061ffff811615611e8a5760405162461bcd60e51b81526004016102e69061312e565b5f805b6004811015611ee557611ea18160036130ab565b611eac906008612e1c565b63ffffffff1687611ebe8360026130d2565b81518110611ece57611ece6130be565b016020015160f81c901b9190911790600101611e8d565b5063ffffffff8116600114611f0c5760405162461bcd60e51b81526004016102e690613171565b5f805b6020811015611f6157611f2381601f6130ab565b611f2e906008612e1c565b88611f3a8360066130d2565b81518110611f4a57611f4a6130be565b016020015160f81c901b9190911790600101611f0f565b505f805b6008811015611fc057611f798160076130ab565b611f84906008612e1c565b6001600160401b031689611f998360266130d2565b81518110611fa957611fa96130be565b016020015160f81c901b9190911790600101611f65565b505f805b600881101561201f57611fd88160076130ab565b611fe3906008612e1c565b6001600160401b03168a611ff883602e6130d2565b81518110612008576120086130be565b016020015160f81c901b9190911790600101611fc4565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661207857604051631afcd79f60e31b815260040160405180910390fd5b565b61208261202f565b61208b81612760565b6120bd606082013560808301356120a860c0850160a08601612b76565b6120b860e0860160c087016132bb565b612781565b50565b6120c861202f565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166121545760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016102e6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206133898339815191529060ff165f036121b2575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121fa90836130ab565b10612216576001600160401b0384166040830152808252612235565b838260400181815161222891906132d6565b6001600160401b03169052505b5f82602001518360400151606461224c91906132fd565b6122569190613328565b600285015490915060ff90811690821611156122d15760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102e6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610491827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906127ef565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161238f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146123ff5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102e6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612476576124368160016130ab565b612441906008612e1c565b5081515f90839083908110612458576124586130be565b60200101906001600160f81b03191690815f1a905350600101612422565b505f5b60048110156124d45761248d8160036130ab565b612498906008612e1c565b505f826124a68360026130d2565b815181106124b6576124b66130be565b60200101906001600160f81b03191690815f1a905350600101612479565b505f5b602081101561253157845181602081106124f3576124f36130be565b1a60f81b826125038360066130d2565b81518110612513576125136130be565b60200101906001600160f81b03191690815f1a9053506001016124d7565b505f5b60208110156125915784602001518160208110612553576125536130be565b1a60f81b826125638360266130d2565b81518110612573576125736130be565b60200101906001600160f81b03191690815f1a905350600101612534565b505f5b6008811015612605576125a88160076130ab565b6125b3906008612e1c565b60ff1685604001516001600160401b0316901c60f81b828260466125d791906130d2565b815181106125e7576125e76130be565b60200101906001600160f81b03191690815f1a905350600101612594565b505f5b60308110156126705784608001518181518110612627576126276130be565b01602001516001600160f81b0319168261264283604e6130d2565b81518110612652576126526130be565b60200101906001600160f81b03191690815f1a905350600101612608565b505f5b60088110156126e2576126878160076130ab565b612692906008612e1c565b60608601516001600160401b0390811691161c60f81b826126b483607e6130d2565b815181106126c4576126c46130be565b60200101906001600160f81b03191690815f1a905350600101612673565b506002816040516126f3919061334d565b602060405180830381855afa15801561270e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127319190612dca565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61276861202f565b612770612951565b612778612961565b6120bd81612969565b61278961202f565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612835573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128599190612dca565b90506128706001600160a01b0385163330866129d5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156128b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128d89190612dca565b905081811161293e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016102e6565b61294882826130ab565b95945050505050565b61295961202f565b612078612a35565b61207861202f565b61297161202f565b80355f8051602061338983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556129bb6060830160408401613368565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612a2f908590612a3d565b50505050565b61273a61202f565b5f8060205f8451602086015f885af180612a5c576040513d5f823e3d81fd5b50505f513d91508115612a73578060011415612a80565b6001600160a01b0384163b155b15612a2f57604051635274afe760e01b81526001600160a01b03851660048201526024016102e6565b508054612ab590612f56565b5f825580601f10612ac4575050565b601f0160209004905f5260205f20908101906120bd91905b80821115612aef575f8155600101612adc565b5090565b5f60208284031215612b03575f80fd5b5035919050565b6001600160a01b03811681146120bd575f80fd5b5f80828403610100811215612b31575f80fd5b60e0811215612b3e575f80fd5b5082915060e0830135612b5081612b0a565b809150509250929050565b80356001600160401b0381168114612b71575f80fd5b919050565b5f60208284031215612b86575f80fd5b612b8f82612b5b565b9392505050565b80151581146120bd575f80fd5b803563ffffffff81168114612b71575f80fd5b5f805f60608486031215612bc8575f80fd5b833592506020840135612bda81612b96565b9150612be860408501612ba3565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612c2757612c27612bf1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612c5557612c55612bf1565b604052919050565b5f6001600160401b03821115612c7557612c75612bf1565b50601f01601f191660200190565b5f805f8060808587031215612c96575f80fd5b8435935060208501359250612cad60408601612b5b565b915060608501356001600160401b03811115612cc7575f80fd5b8501601f81018713612cd7575f80fd5b8035612cea612ce582612c5d565b612c2d565b818152886020838501011115612cfe575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612d2f575f80fd5b612b8f82612ba3565b5f8060408385031215612d49575f80fd5b612d5283612ba3565b91506020830135612b5081612b96565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612d90578181015183820152602001612d78565b50505f910152565b602081525f8251806020840152612db6816040850160208701612d76565b601f01601f19169190910160400192915050565b5f60208284031215612dda575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612e1757612e17612de1565b500490565b808202811582820484141761049157610491612df5565b8051612b7181612b96565b5f8060408385031215612e4f575f80fd5b82516001600160401b0380821115612e65575f80fd5b9084019060608287031215612e78575f80fd5b612e80612c05565b82518152602080840151612e9381612b0a565b82820152604084015183811115612ea8575f80fd5b80850194505087601f850112612ebc575f80fd5b83519250612ecc612ce584612c5d565b8381528882858701011115612edf575f80fd5b612eee84838301848801612d76565b80604084015250819550612f03818801612e33565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612f6a57607f821691505b602082108103612f8857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612fe781612f56565b806020870152604060018084165f8114613008576001811461302457613051565b60ff19851660408a0152604084151560051b8a01019550613051565b895f5260205f205f5b858110156130485781548b820186015290830190880161302d565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b8181038181111561049157610491612df5565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561049157610491612df5565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f8211156107dc57805f5260205f20601f840160051c810160208510156131dd5750805b601f840160051c820191505b8181101561036c575f81556001016131e9565b81516001600160401b0381111561321557613215612bf1565b613229816132238454612f56565b846131b8565b602080601f83116001811461325c575f84156132455750858301515b5f19600386901b1c1916600185901b1785556132b3565b5f85815260208120601f198616915b8281101561328a5788860151825594840194600190910190840161326b565b50858210156132a757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156132cb575f80fd5b8135612b8f81612b0a565b6001600160401b038181168382160190808211156132f6576132f6612df5565b5092915050565b6001600160401b0381811683821602808216919082811461332057613320612df5565b505092915050565b5f6001600160401b038084168061334157613341612de1565b92169190910492915050565b5f825161335e818460208701612d76565b9190910192915050565b5f60208284031215613378575f80fd5b813560ff81168114612b8f575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnTrackerStartTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161364838038061364883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6134fb8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061009b575f3560e01c8063912de4da11610063578063912de4da1461012b578063a3a65e481461013e578063b771b3bc14610151578063bee0a03f14610177578063fdf94a1a1461018a575f80fd5b80630322ed981461009f5780632e2194d8146100b457806362065856146100e457806376f7862114610105578063872fda6414610118575b5f80fd5b6100b26100ad366004612c1c565b61019d565b005b6100c76100c2366004612c1c565b610373565b6040516001600160401b0390911681526020015b60405180910390f35b6100f76100f2366004612c4e565b610389565b6040519081526020016100db565b6100b2610113366004612c8e565b6103a2565b6100f7610126366004612d5b565b610731565b6100b2610139366004612e0b565b610756565b6100b261014c366004612e49565b610864565b61015f6005600160991b0181565b6040516001600160a01b0390911681526020016100db565b6100b2610185366004612c1c565b610b7c565b6100b2610198366004612e62565b610c90565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040808220815160e0810190925280545f805160206134cf83398151915293929190829060ff1660058111156101fd576101fd612e8c565b600581111561020e5761020e612e8c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561028557610285612e8c565b146102ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6102ff8483606001515f611062565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061032c908490600401612ec2565b6020604051808303815f875af1158015610348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036c9190612ef4565b5050505050565b5f61038364e8d4a5100083612f33565b92915050565b5f6103836001600160401b03831664e8d4a51000612f46565b5f8381527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0360205260409020600301545f805160206134cf833981519152905f805160206134af833981519152906001600160401b03166104028161127f565b806001600160401b0316826002015f82825461041e9190612f5d565b90915550508415610720576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610472573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104999190810190612f7b565b91509150806104fc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016102e6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561053f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105639190612ef4565b8251146105c75760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016102e6565b60208201516001600160a01b03161561063d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016102e6565b5f8061064c8460400151611447565b91509150818a146106b95760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016102e6565b5f8a8152600887016020908152604091829020805467ffffffffffffffff19166001600160401b03851690811790915591519182528b917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a2505050505b6107298661161f565b505050505050565b5f8061073c8661195a565b905061074a85828686611a3a565b9150505b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561079a5750825b90505f826001600160401b031660011480156107b55750303b155b9050811580156107c3575080155b156107e15760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561080b57845460ff60401b1916600160401b1785555b6108158787611e68565b831561085b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f5f805160206134cf8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156108bf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108e69190810190612f7b565b91509150806109075760405162461bcd60e51b81526004016102e69061304d565b825482511461096a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102e6565b60208201516001600160a01b0316156109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102e6565b5f806109ec8460400151611e86565b9150915080610a4e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102e6565b5f82815260028601602052604081208054610a6890613093565b9050118015610a9a575060015f83815260038701602052604090205460ff166005811115610a9857610a98612e8c565b145b610ab65760405162461bcd60e51b81526004016102e6906130cb565b5f8281526002860160205260408120610ace91612bd2565b5f828152600386810160208181526040808520805460ff1916600217815593840180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190960154875260048c01845282872089905595889052928252915482519316835282019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f805160206134cf833981519152929190610bc490613093565b9050118015610bf6575060015f83815260038301602052604090205460ff166005811115610bf457610bf4612e8c565b145b610c125760405162461bcd60e51b81526004016102e6906130cb565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c4b9190600401613112565b6020604051808303815f875af1158015610c67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8b9190612ef4565b505050565b5f5f805160206134cf8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ceb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d129190810190612f7b565b9150915080610d335760405162461bcd60e51b81526004016102e69061304d565b5f8415610db7575f610d488460400151612027565b919350909150506001600160401b03811615610db15760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016102e6565b50610e2d565b5f610dc58460400151611e86565b90925090508015610e2b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102e6565b505b5f818152600385016020526040808220815160e081019092528054829060ff166005811115610e5e57610e5e612e8c565b6005811115610e6f57610e6f612e8c565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610f005760405162461bcd60e51b81526004016102e69061319c565b5f600382516005811115610f1657610f16612e8c565b1480610f345750600282516005811115610f3257610f32612e8c565b145b15610f5657506020808201515f90815260048088019092526040812055610f5a565b5060055b5f83815260038701602052604090208251815484929190829060ff19166001836005811115610f8b57610f8b612e8c565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110db5761109b816001612f5d565b6110a6906008612f46565b5081515f908390839081106110bd576110bd6131e8565b60200101906001600160f81b03191690815f1a905350600101611087565b505f5b600481101561113e576110f2816003612f5d565b6110fd906008612f46565b6001901c60f81b826111108360026131fc565b81518110611120576111206131e8565b60200101906001600160f81b03191690815f1a9053506001016110de565b505f5b60208110156111a05761115581601f612f5d565b611160906008612f46565b86901c60f81b826111728360066131fc565b81518110611182576111826131e8565b60200101906001600160f81b03191690815f1a905350600101611141565b505f5b600881101561120b576111b7816007612f5d565b6111c2906008612f46565b6001600160401b038616901c60f81b826111dd8360266131fc565b815181106111ed576111ed6131e8565b60200101906001600160f81b03191690815f1a9053506001016111a3565b505f5b600881101561127657611222816007612f5d565b61122d906008612f46565b6001600160401b038516901c60f81b8261124883602e6131fc565b81518110611258576112586131e8565b60200101906001600160f81b03191690815f1a90535060010161120e565b50949350505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04545f805160206134af83398151915290600160801b900460ff165f036112c4575050565b6003810154429081116112d657505050565b60408051606081018252600584015480825260068501546001600160401b038082166020850152600160401b9091048116938301939093526004850154919291909116906113249084612f5d565b10611340576001600160401b038416604082015281815261135f565b8381604001818151611352919061320f565b6001600160401b03169052505b5f8160200151826040015160646113769190613236565b6113809190613261565b600485015490915060ff600160801b909104811690821611156114025760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102e6565b50805160058401556020810151600690930180546040909201516001600160401b03908116600160401b026001600160801b0319909316941693909317179091555050565b5f808251602e1461146a5760405162461bcd60e51b81526004016102e690613286565b5f805b60028110156114b957611481816001612f5d565b61148c906008612f46565b61ffff168582815181106114a2576114a26131e8565b016020015160f81c901b919091179060010161146d565b5061ffff8116156114dc5760405162461bcd60e51b81526004016102e6906132cf565b5f805b6004811015611537576114f3816003612f5d565b6114fe906008612f46565b63ffffffff16866115108360026131fc565b81518110611520576115206131e8565b016020015160f81c901b91909117906001016114df565b5063ffffffff811660041461155e5760405162461bcd60e51b81526004016102e690613312565b5f805b60208110156115b35761157581601f612f5d565b611580906008612f46565b8761158c8360066131fc565b8151811061159c5761159c6131e8565b016020015160f81c901b9190911790600101611561565b505f805b6008811015611612576115cb816007612f5d565b6115d6906008612f46565b6001600160401b0316886115eb8360266131fc565b815181106115fb576115fb6131e8565b016020015160f81c901b91909117906001016115b7565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040808220815160e0810190925280545f805160206134cf83398151915293929190829060ff16600581111561167f5761167f612e8c565b600581111561169057611690612e8c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561170a5761170a612e8c565b146117665760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102e6565b60408101516001600160a01b0316336001600160a01b03161461179b5760405162461bcd60e51b81526004016102e69061319c565b6003808252426001600160401b031660c08301525f848152908301602052604090208151815483929190829060ff191660018360058111156117df576117df612e8c565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061189690859083611062565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906118c5908590600401612ec2565b6020604051808303815f875af11580156118e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119059190612ef4565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206134af8339815191528161197384612262565b90505f61197f82610373565b83549091506001600160401b038216108015906119a957508260010154816001600160401b031611155b611a075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016102e6565b611a108161127f565b806001600160401b0316836002015f828254611a2c91906131fc565b909155509095945050505050565b5f611a43612298565b5f805160206134cf833981519152426001600160401b038516118015611a7d57506001600160401b038416611a7b426202a3006131fc565b115b611adf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102e6565b85611b365760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102e6565b5f86815260048201602052604090205415611ba45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102e6565b8251603014611c0b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102e6565b5f80611c526040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506122e2565b5f82815260028601602052604090209193509150611c70828261339d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611c9d908590600401612ec2565b6020604051808303815f875af1158015611cb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cdd9190612ef4565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526003880190522081518154829060ff19166001836005811115611d5657611d56612e8c565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061074e60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b611e706126ad565b611e79826126f8565b611e8281612766565b5050565b5f808251602714611ea95760405162461bcd60e51b81526004016102e690613286565b5f805b6002811015611ef857611ec0816001612f5d565b611ecb906008612f46565b61ffff16858281518110611ee157611ee16131e8565b016020015160f81c901b9190911790600101611eac565b5061ffff811615611f1b5760405162461bcd60e51b81526004016102e6906132cf565b5f805b6004811015611f7657611f32816003612f5d565b611f3d906008612f46565b63ffffffff1686611f4f8360026131fc565b81518110611f5f57611f5f6131e8565b016020015160f81c901b9190911790600101611f1e565b5063ffffffff8116600214611f9d5760405162461bcd60e51b81526004016102e690613312565b5f805b6020811015611ff257611fb481601f612f5d565b611fbf906008612f46565b87611fcb8360066131fc565b81518110611fdb57611fdb6131e8565b016020015160f81c901b9190911790600101611fa0565b505f86602681518110612007576120076131e8565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461204b5760405162461bcd60e51b81526004016102e690613286565b5f805b600281101561209a57612062816001612f5d565b61206d906008612f46565b61ffff16868281518110612083576120836131e8565b016020015160f81c901b919091179060010161204e565b5061ffff8116156120bd5760405162461bcd60e51b81526004016102e6906132cf565b5f805b6004811015612118576120d4816003612f5d565b6120df906008612f46565b63ffffffff16876120f18360026131fc565b81518110612101576121016131e8565b016020015160f81c901b91909117906001016120c0565b5063ffffffff811660011461213f5760405162461bcd60e51b81526004016102e690613312565b5f805b60208110156121945761215681601f612f5d565b612161906008612f46565b8861216d8360066131fc565b8151811061217d5761217d6131e8565b016020015160f81c901b9190911790600101612142565b505f805b60088110156121f3576121ac816007612f5d565b6121b7906008612f46565b6001600160401b0316896121cc8360266131fc565b815181106121dc576121dc6131e8565b016020015160f81c901b9190911790600101612198565b505f805b60088110156122525761220b816007612f5d565b612216906008612f46565b6001600160401b03168a61222b83602e6131fc565b8151811061223b5761223b6131e8565b016020015160f81c901b91909117906001016121f7565b5091989097509095509350505050565b5f610383827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061281a565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016122dc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461234c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102e6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156123c357612383816001612f5d565b61238e906008612f46565b5081515f908390839081106123a5576123a56131e8565b60200101906001600160f81b03191690815f1a90535060010161236f565b505f5b6004811015612421576123da816003612f5d565b6123e5906008612f46565b505f826123f38360026131fc565b81518110612403576124036131e8565b60200101906001600160f81b03191690815f1a9053506001016123c6565b505f5b602081101561247e5784518160208110612440576124406131e8565b1a60f81b826124508360066131fc565b81518110612460576124606131e8565b60200101906001600160f81b03191690815f1a905350600101612424565b505f5b60208110156124de57846020015181602081106124a0576124a06131e8565b1a60f81b826124b08360266131fc565b815181106124c0576124c06131e8565b60200101906001600160f81b03191690815f1a905350600101612481565b505f5b6008811015612552576124f5816007612f5d565b612500906008612f46565b60ff1685604001516001600160401b0316901c60f81b8282604661252491906131fc565b81518110612534576125346131e8565b60200101906001600160f81b03191690815f1a9053506001016124e1565b505f5b60308110156125bd5784608001518181518110612574576125746131e8565b01602001516001600160f81b0319168261258f83604e6131fc565b8151811061259f5761259f6131e8565b60200101906001600160f81b03191690815f1a905350600101612555565b505f5b600881101561262f576125d4816007612f5d565b6125df906008612f46565b60608601516001600160401b0390811691161c60f81b8261260183607e6131fc565b81518110612611576126116131e8565b60200101906001600160f81b03191690815f1a9053506001016125c0565b506002816040516126409190613458565b602060405180830381855afa15801561265b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061267e9190612ef4565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166126f657604051631afcd79f60e31b815260040160405180910390fd5b565b6127006126ad565b6127098161297c565b61276360408201356060830135608084013561272b60c0860160a08701612c4e565b61273b60e0870160c08801612c4e565b61274c610100880160e08901613473565b61275e61012089016101008a01613493565b61299d565b50565b61276e6126ad565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166127fa5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016102e6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612860573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128849190612ef4565b905061289b6001600160a01b038516333086612aa5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156128df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129039190612ef4565b90508181116129695760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016102e6565b6129738282612f5d565b95945050505050565b6129846126ad565b61298c612b05565b612994612b15565b61276381612b1d565b6129a56126ad565b5f805160206134af833981519152969096557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01949094557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03929092557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0480546001600160401b039283166001600160801b031990911617600160401b93909216929092021760ff60801b1916600160801b60ff909316929092029190911790557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0780546001600160a01b0319166001600160a01b03909216919091179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612aff908590612b5e565b50505050565b612b0d6126ad565b6126f6612bca565b6126f66126ad565b612b256126ad565b80355f805160206134cf83398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b5f8060205f8451602086015f885af180612b7d576040513d5f823e3d81fd5b50505f513d91508115612b94578060011415612ba1565b6001600160a01b0384163b155b15612aff57604051635274afe760e01b81526001600160a01b03851660048201526024016102e6565b6126876126ad565b508054612bde90613093565b5f825580601f10612bed575050565b601f0160209004905f5260205f209081019061276391905b80821115612c18575f8155600101612c05565b5090565b5f60208284031215612c2c575f80fd5b5035919050565b80356001600160401b0381168114612c49575f80fd5b919050565b5f60208284031215612c5e575f80fd5b612c6782612c33565b9392505050565b8015158114612763575f80fd5b803563ffffffff81168114612c49575f80fd5b5f805f60608486031215612ca0575f80fd5b833592506020840135612cb281612c6e565b9150612cc060408501612c7b565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612cff57612cff612cc9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612d2d57612d2d612cc9565b604052919050565b5f6001600160401b03821115612d4d57612d4d612cc9565b50601f01601f191660200190565b5f805f8060808587031215612d6e575f80fd5b8435935060208501359250612d8560408601612c33565b915060608501356001600160401b03811115612d9f575f80fd5b8501601f81018713612daf575f80fd5b8035612dc2612dbd82612d35565b612d05565b818152886020838501011115612dd6575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b6001600160a01b0381168114612763575f80fd5b5f80828403610140811215612e1e575f80fd5b61012080821215612e2d575f80fd5b8493508301359050612e3e81612df7565b809150509250929050565b5f60208284031215612e59575f80fd5b612c6782612c7b565b5f8060408385031215612e73575f80fd5b612e7c83612c7b565b91506020830135612e3e81612c6e565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612eba578181015183820152602001612ea2565b50505f910152565b602081525f8251806020840152612ee0816040850160208701612ea0565b601f01601f19169190910160400192915050565b5f60208284031215612f04575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612f4157612f41612f0b565b500490565b808202811582820484141761038357610383612f1f565b8181038181111561038357610383612f1f565b8051612c4981612c6e565b5f8060408385031215612f8c575f80fd5b82516001600160401b0380821115612fa2575f80fd5b9084019060608287031215612fb5575f80fd5b612fbd612cdd565b82518152602080840151612fd081612df7565b82820152604084015183811115612fe5575f80fd5b80850194505087601f850112612ff9575f80fd5b83519250613009612dbd84612d35565b838152888285870101111561301c575f80fd5b61302b84838301848801612ea0565b80604084015250819550613040818801612f70565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c908216806130a757607f821691505b6020821081036130c557634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461312481613093565b806020870152604060018084165f811461314557600181146131615761318e565b60ff19851660408a0152604084151560051b8a0101955061318e565b895f5260205f205f5b858110156131855781548b820186015290830190880161316a565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561038357610383612f1f565b6001600160401b0381811683821601908082111561322f5761322f612f1f565b5092915050565b6001600160401b0381811683821602808216919082811461325957613259612f1f565b505092915050565b5f6001600160401b038084168061327a5761327a612f0b565b92169190910492915050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610c8b57805f5260205f20601f840160051c8101602085101561337e5750805b601f840160051c820191505b8181101561036c575f815560010161338a565b81516001600160401b038111156133b6576133b6612cc9565b6133ca816133c48454613093565b84613359565b602080601f8311600181146133fd575f84156133e65750858301515b5f19600386901b1c1916600185901b178555610729565b5f85815260208120601f198616915b8281101561342b5788860151825594840194600190910190840161340c565b508582101561344857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251613469818460208701612ea0565b9190910192915050565b5f60208284031215613483575f80fd5b813560ff81168114612c67575f80fd5b5f602082840312156134a3575f80fd5b8135612c6781612df756fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -353,23 +355,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x27f39ca8. +// Initialize is a paid mutator transaction binding the contract method 0x912de4da. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint256,uint64,uint64,uint8,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 0x27f39ca8. +// Initialize is a paid mutator transaction binding the contract method 0x912de4da. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint256,uint64,uint64,uint8,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 0x27f39ca8. +// Initialize is a paid mutator transaction binding the contract method 0x912de4da. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint256,uint64,uint64,uint8,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/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 7961fc2a6..8fdabd9de 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -31,24 +31,26 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { - BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int - MinimumStakeDuration uint64 - RewardCalculator common.Address + BaseSettings ValidatorManagerSettings + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + ChurnTrackerStartTime *big.Int + ChurnPeriodSeconds uint64 + MinimumStakeDuration uint64 + MaximumChurnPercentage uint8 + RewardCalculator common.Address } // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { PChainBlockchainID [32]byte SubnetID [32]byte - MaximumHourlyChurn uint8 } // 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161320438038061320483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130b78061014d5f395ff3fe60806040526004361061008e575f3560e01c8063a3a65e4811610057578063a3a65e481461015a578063b771b3bc14610179578063bee0a03f146101ab578063f40797d7146101ca578063fdf94a1a146101dd575f80fd5b8062e41792146100925780630322ed98146100b35780632e2194d8146100d2578063620658561461010e57806376f786211461013b575b5f80fd5b34801561009d575f80fd5b506100b16100ac366004612825565b6101fc565b005b3480156100be575f80fd5b506100b16100cd36600461283b565b610308565b3480156100dd575f80fd5b506100f16100ec36600461283b565b6104de565b6040516001600160401b0390911681526020015b60405180910390f35b348015610119575f80fd5b5061012d61012836600461286d565b6104f4565b604051908152602001610105565b348015610146575f80fd5b506100b16101553660046128ad565b61050d565b348015610165575f80fd5b506100b16101743660046128e8565b61083e565b348015610184575f80fd5b506101936005600160991b0181565b6040516001600160a01b039091168152602001610105565b3480156101b6575f80fd5b506100b16101c536600461283b565b610b57565b61012d6101d8366004612993565b610c66565b3480156101e8575f80fd5b506100b16101f7366004612a25565b610c88565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156102405750825b90505f826001600160401b0316600114801561025b5750303b155b905081158015610269575080155b156102875760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156102b157845460ff60401b1916600160401b1785555b6102ba8661105b565b831561030057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061308b83398151915293929190829060ff16600581111561036857610368612a5a565b600581111561037957610379612a5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156103f0576103f0612a5a565b1461045a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61046a8483606001515f61106f565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610497908490600401612a90565b6020604051808303815f875af11580156104b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d79190612ac2565b5050505050565b5f6104ee64e8d4a5100083612b01565b92915050565b5f6104ee6001600160401b03831664e8d4a51000612b14565b8115610830575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610581573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105a89190810190612b4a565b915091508061060b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610451565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561064e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106729190612ac2565b8251146106d65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610451565b60208201516001600160a01b03161561074c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610451565b5f8061075b846040015161128c565b915091508188146107c85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610451565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61083983611464565b505050565b5f5f8051602061308b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610899573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108c09190810190612b4a565b91509150806108e15760405162461bcd60e51b815260040161045190612c1c565b82548251146109445760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610451565b60208201516001600160a01b0316156109b75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610451565b5f806109c684604001516117ac565b9150915080610a285760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610451565b5f82815260058601602052604081208054610a4290612c62565b9050118015610a74575060015f83815260068701602052604090205460ff166005811115610a7257610a72612a5a565b145b610a905760405162461bcd60e51b815260040161045190612c94565b5f8281526005860160205260408120610aa8916127db565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061308b833981519152929190610b9f90612c62565b9050118015610bd1575060015f83815260068301602052604090205460ff166005811115610bcf57610bcf612a5a565b145b610bed5760405162461bcd60e51b815260040161045190612c94565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c269190600401612cdb565b6020604051808303815f875af1158015610c42573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108399190612ac2565b5f80610c713461194d565b9050610c7f85828686611a0a565b95945050505050565b5f5f8051602061308b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ce3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d0a9190810190612b4a565b9150915080610d2b5760405162461bcd60e51b815260040161045190612c1c565b5f8415610daf575f610d408460400151611e41565b919350909150506001600160401b03811615610da95760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610451565b50610e25565b5f610dbd84604001516117ac565b90925090508015610e235760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610451565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610e5657610e56612a5a565b6005811115610e6757610e67612a5a565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610ef85760405162461bcd60e51b815260040161045190612d65565b5f600382516005811115610f0e57610f0e612a5a565b1480610f2c5750600282516005811115610f2a57610f2a612a5a565b145b15610f4f57506020808201515f9081526007870190915260408120556004610f53565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610f8457610f84612a5a565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b61106361207c565b61106c816120c7565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110e8576110a8816001612db1565b6110b3906008612b14565b5081515f908390839081106110ca576110ca612dc4565b60200101906001600160f81b03191690815f1a905350600101611094565b505f5b600481101561114b576110ff816003612db1565b61110a906008612b14565b6001901c60f81b8261111d836002612dd8565b8151811061112d5761112d612dc4565b60200101906001600160f81b03191690815f1a9053506001016110eb565b505f5b60208110156111ad5761116281601f612db1565b61116d906008612b14565b86901c60f81b8261117f836006612dd8565b8151811061118f5761118f612dc4565b60200101906001600160f81b03191690815f1a90535060010161114e565b505f5b6008811015611218576111c4816007612db1565b6111cf906008612b14565b6001600160401b038616901c60f81b826111ea836026612dd8565b815181106111fa576111fa612dc4565b60200101906001600160f81b03191690815f1a9053506001016111b0565b505f5b60088110156112835761122f816007612db1565b61123a906008612b14565b6001600160401b038516901c60f81b8261125583602e612dd8565b8151811061126557611265612dc4565b60200101906001600160f81b03191690815f1a90535060010161121b565b50949350505050565b5f808251602e146112af5760405162461bcd60e51b815260040161045190612deb565b5f805b60028110156112fe576112c6816001612db1565b6112d1906008612b14565b61ffff168582815181106112e7576112e7612dc4565b016020015160f81c901b91909117906001016112b2565b5061ffff8116156113215760405162461bcd60e51b815260040161045190612e34565b5f805b600481101561137c57611338816003612db1565b611343906008612b14565b63ffffffff1686611355836002612dd8565b8151811061136557611365612dc4565b016020015160f81c901b9190911790600101611324565b5063ffffffff81166004146113a35760405162461bcd60e51b815260040161045190612e77565b5f805b60208110156113f8576113ba81601f612db1565b6113c5906008612b14565b876113d1836006612dd8565b815181106113e1576113e1612dc4565b016020015160f81c901b91909117906001016113a6565b505f805b600881101561145757611410816007612db1565b61141b906008612b14565b6001600160401b031688611430836026612dd8565b8151811061144057611440612dc4565b016020015160f81c901b91909117906001016113fc565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061308b83398151915293929190829060ff1660058111156114c4576114c4612a5a565b60058111156114d5576114d5612a5a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561154f5761154f612a5a565b146115ab5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610451565b60408101516001600160a01b0316336001600160a01b0316146115e05760405162461bcd60e51b815260040161045190612d65565b6115ed816080015161210a565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561163157611631612a5a565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116e89085908361106f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611717908590600401612a90565b6020604051808303815f875af1158015611733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117579190612ac2565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117cf5760405162461bcd60e51b815260040161045190612deb565b5f805b600281101561181e576117e6816001612db1565b6117f1906008612b14565b61ffff1685828151811061180757611807612dc4565b016020015160f81c901b91909117906001016117d2565b5061ffff8116156118415760405162461bcd60e51b815260040161045190612e34565b5f805b600481101561189c57611858816003612db1565b611863906008612b14565b63ffffffff1686611875836002612dd8565b8151811061188557611885612dc4565b016020015160f81c901b9190911790600101611844565b5063ffffffff81166002146118c35760405162461bcd60e51b815260040161045190612e77565b5f805b6020811015611918576118da81601f612db1565b6118e5906008612b14565b876118f1836006612dd8565b8151811061190157611901612dc4565b016020015160f81c901b91909117906001016118c6565b505f8660268151811061192d5761192d612dc4565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00828261197a826104de565b83549091506001600160401b038216108015906119a457508260010154816001600160401b031611155b611a025760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610451565b949350505050565b5f611a136122ab565b5f8051602061308b833981519152426001600160401b038516118015611a4d57506001600160401b038416611a4b426202a300612dd8565b115b611aaf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610451565b85611b065760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610451565b5f86815260078201602052604090205415611b745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610451565b8251603014611bdb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610451565b611be48561210a565b5f80611c2b6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506122f5565b5f82815260058601602052604090209193509150611c498282612f02565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611c76908590600401612a90565b6020604051808303815f875af1158015611c92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb69190612ac2565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611d2f57611d2f612a5a565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a0260017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f805f8351603614611e655760405162461bcd60e51b815260040161045190612deb565b5f805b6002811015611eb457611e7c816001612db1565b611e87906008612b14565b61ffff16868281518110611e9d57611e9d612dc4565b016020015160f81c901b9190911790600101611e68565b5061ffff811615611ed75760405162461bcd60e51b815260040161045190612e34565b5f805b6004811015611f3257611eee816003612db1565b611ef9906008612b14565b63ffffffff1687611f0b836002612dd8565b81518110611f1b57611f1b612dc4565b016020015160f81c901b9190911790600101611eda565b5063ffffffff8116600114611f595760405162461bcd60e51b815260040161045190612e77565b5f805b6020811015611fae57611f7081601f612db1565b611f7b906008612b14565b88611f87836006612dd8565b81518110611f9757611f97612dc4565b016020015160f81c901b9190911790600101611f5c565b505f805b600881101561200d57611fc6816007612db1565b611fd1906008612b14565b6001600160401b031689611fe6836026612dd8565b81518110611ff657611ff6612dc4565b016020015160f81c901b9190911790600101611fb2565b505f805b600881101561206c57612025816007612db1565b612030906008612b14565b6001600160401b03168a61204583602e612dd8565b8151811061205557612055612dc4565b016020015160f81c901b9190911790600101612011565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166120c557604051631afcd79f60e31b815260040160405180910390fd5b565b6120cf61207c565b6120d8816126c0565b61106c606082013560808301356120f560c0850160a0860161286d565b61210560e0860160c08701612fbd565b6126e1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061308b8339815191529060ff165f03612148575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906121909083612db1565b106121ac576001600160401b03841660408301528082526121cb565b83826040018181516121be9190612fd8565b6001600160401b03169052505b5f8260200151836040015160646121e29190612fff565b6121ec919061302a565b600285015490915060ff90811690821611156122675760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610451565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016122ef57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461235f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610451565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156123d657612396816001612db1565b6123a1906008612b14565b5081515f908390839081106123b8576123b8612dc4565b60200101906001600160f81b03191690815f1a905350600101612382565b505f5b6004811015612434576123ed816003612db1565b6123f8906008612b14565b505f82612406836002612dd8565b8151811061241657612416612dc4565b60200101906001600160f81b03191690815f1a9053506001016123d9565b505f5b6020811015612491578451816020811061245357612453612dc4565b1a60f81b82612463836006612dd8565b8151811061247357612473612dc4565b60200101906001600160f81b03191690815f1a905350600101612437565b505f5b60208110156124f157846020015181602081106124b3576124b3612dc4565b1a60f81b826124c3836026612dd8565b815181106124d3576124d3612dc4565b60200101906001600160f81b03191690815f1a905350600101612494565b505f5b600881101561256557612508816007612db1565b612513906008612b14565b60ff1685604001516001600160401b0316901c60f81b828260466125379190612dd8565b8151811061254757612547612dc4565b60200101906001600160f81b03191690815f1a9053506001016124f4565b505f5b60308110156125d0578460800151818151811061258757612587612dc4565b01602001516001600160f81b031916826125a283604e612dd8565b815181106125b2576125b2612dc4565b60200101906001600160f81b03191690815f1a905350600101612568565b505f5b6008811015612642576125e7816007612db1565b6125f2906008612b14565b60608601516001600160401b0390811691161c60f81b8261261483607e612dd8565b8151811061262457612624612dc4565b60200101906001600160f81b03191690815f1a9053506001016125d3565b50600281604051612653919061304f565b602060405180830381855afa15801561266e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906126919190612ac2565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6126c861207c565b6126d061274f565b6126d861275f565b61106c81612767565b6126e961207c565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61275761207c565b6120c56127d3565b6120c561207c565b61276f61207c565b80355f8051602061308b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556127b9606083016040840161306a565b600291909101805460ff191660ff90921691909117905550565b61269a61207c565b5080546127e790612c62565b5f825580601f106127f6575050565b601f0160209004905f5260205f209081019061106c91905b80821115612821575f815560010161280e565b5090565b5f60e08284031215612835575f80fd5b50919050565b5f6020828403121561284b575f80fd5b5035919050565b80356001600160401b0381168114612868575f80fd5b919050565b5f6020828403121561287d575f80fd5b61288682612852565b9392505050565b801515811461106c575f80fd5b803563ffffffff81168114612868575f80fd5b5f805f606084860312156128bf575f80fd5b8335925060208401356128d18161288d565b91506128df6040850161289a565b90509250925092565b5f602082840312156128f8575f80fd5b6128868261289a565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561293757612937612901565b60405290565b604051601f8201601f191681016001600160401b038111828210171561296557612965612901565b604052919050565b5f6001600160401b0382111561298557612985612901565b50601f01601f191660200190565b5f805f606084860312156129a5575f80fd5b833592506129b560208501612852565b915060408401356001600160401b038111156129cf575f80fd5b8401601f810186136129df575f80fd5b80356129f26129ed8261296d565b61293d565b818152876020838501011115612a06575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612a36575f80fd5b612a3f8361289a565b91506020830135612a4f8161288d565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612a88578181015183820152602001612a70565b50505f910152565b602081525f8251806020840152612aae816040850160208701612a6e565b601f01601f19169190910160400192915050565b5f60208284031215612ad2575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612b0f57612b0f612ad9565b500490565b80820281158282048414176104ee576104ee612aed565b6001600160a01b038116811461106c575f80fd5b80516128688161288d565b5f8060408385031215612b5b575f80fd5b82516001600160401b0380821115612b71575f80fd5b9084019060608287031215612b84575f80fd5b612b8c612915565b82518152602080840151612b9f81612b2b565b82820152604084015183811115612bb4575f80fd5b80850194505087601f850112612bc8575f80fd5b83519250612bd86129ed8461296d565b8381528882858701011115612beb575f80fd5b612bfa84838301848801612a6e565b80604084015250819550612c0f818801612b3f565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612c7657607f821691505b60208210810361283557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612ced81612c62565b806020870152604060018084165f8114612d0e5760018114612d2a57612d57565b60ff19851660408a0152604084151560051b8a01019550612d57565b895f5260205f205f5b85811015612d4e5781548b8201860152908301908801612d33565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156104ee576104ee612aed565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104ee576104ee612aed565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f82111561083957805f5260205f20601f840160051c81016020851015612ee35750805b601f840160051c820191505b818110156104d7575f8155600101612eef565b81516001600160401b03811115612f1b57612f1b612901565b612f2f81612f298454612c62565b84612ebe565b602080601f831160018114612f62575f8415612f4b5750858301515b5f19600386901b1c1916600185901b178555610300565b5f85815260208120601f198616915b82811015612f9057888601518255948401946001909101908401612f71565b5085821015612fad57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215612fcd575f80fd5b813561288681612b2b565b6001600160401b03818116838216019080821115612ff857612ff8612aed565b5092915050565b6001600160401b0381811683821602808216919082811461302257613022612aed565b505092915050565b5f6001600160401b038084168061304357613043612ad9565b92169190910492915050565b5f8251613060818460208701612a6e565b9190910192915050565b5f6020828403121561307a575f80fd5b813560ff81168114612886575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnTrackerStartTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161334738038061334783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6131fa8061014d5f395ff3fe60806040526004361061008f575f3560e01c8063a3a65e4811610057578063a3a65e481461015b578063b771b3bc1461017a578063bee0a03f146101ac578063f40797d7146101cb578063fdf94a1a146101de575f80fd5b80630322ed98146100935780632e1488ec146100b45780632e2194d8146100d3578063620658561461010f57806376f786211461013c575b5f80fd5b34801561009e575f80fd5b506100b26100ad366004612947565b6101fd565b005b3480156100bf575f80fd5b506100b26100ce36600461295e565b6103d3565b3480156100de575f80fd5b506100f26100ed366004612947565b6104df565b6040516001600160401b0390911681526020015b60405180910390f35b34801561011a575f80fd5b5061012e610129366004612990565b6104f5565b604051908152602001610106565b348015610147575f80fd5b506100b26101563660046129d0565b61050e565b348015610166575f80fd5b506100b2610175366004612a0b565b610895565b348015610185575f80fd5b506101946005600160991b0181565b6040516001600160a01b039091168152602001610106565b3480156101b7575f80fd5b506100b26101c6366004612947565b610bad565b61012e6101d9366004612ab6565b610cc1565b3480156101e9575f80fd5b506100b26101f8366004612b48565b610ce3565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040808220815160e0810190925280545f805160206131ce83398151915293929190829060ff16600581111561025d5761025d612b7d565b600581111561026e5761026e612b7d565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102e5576102e5612b7d565b1461034f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61035f8483606001515f6110b5565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061038c908490600401612bb3565b6020604051808303815f875af11580156103a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103cc9190612be5565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104175750825b90505f826001600160401b031660011480156104325750303b155b905081158015610440575080155b1561045e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561048857845460ff60401b1916600160401b1785555b610491866112d2565b83156104d757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f6104ef64e8d4a5100083612c24565b92915050565b5f6104ef6001600160401b03831664e8d4a51000612c37565b5f8381527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0360205260409020600301545f805160206131ce833981519152905f805160206131ae833981519152906001600160401b031661056e816112e6565b806001600160401b0316826002015f82825461058a9190612c4e565b9091555050841561088c576040516306f8253560e41b815263ffffffff851660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156105de573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526106059190810190612c80565b91509150806106685760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610346565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106cf9190612be5565b8251146107335760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610346565b60208201516001600160a01b0316156107a95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610346565b5f806107b884604001516114ae565b91509150818a146108255760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610346565b5f8a8152600887016020908152604091829020805467ffffffffffffffff19166001600160401b03851690811790915591519182528b917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a2505050505b6104d786611686565b5f5f805160206131ce8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156108f0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109179190810190612c80565b91509150806109385760405162461bcd60e51b815260040161034690612d52565b825482511461099b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610346565b60208201516001600160a01b031615610a0e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610346565b5f80610a1d84604001516119c1565b9150915080610a7f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610346565b5f82815260028601602052604081208054610a9990612d98565b9050118015610acb575060015f83815260038701602052604090205460ff166005811115610ac957610ac9612b7d565b145b610ae75760405162461bcd60e51b815260040161034690612dca565b5f8281526002860160205260408120610aff916128fd565b5f828152600386810160208181526040808520805460ff1916600217815593840180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190960154875260048c01845282872089905595889052928252915482519316835282019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f805160206131ce833981519152929190610bf590612d98565b9050118015610c27575060015f83815260038301602052604090205460ff166005811115610c2557610c25612b7d565b145b610c435760405162461bcd60e51b815260040161034690612dca565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c7c9190600401612e11565b6020604051808303815f875af1158015610c98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbc9190612be5565b505050565b5f80610ccc34611b62565b9050610cda85828686611c37565b95945050505050565b5f5f805160206131ce8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610d3e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d659190810190612c80565b9150915080610d865760405162461bcd60e51b815260040161034690612d52565b5f8415610e0a575f610d9b846040015161206d565b919350909150506001600160401b03811615610e045760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610346565b50610e80565b5f610e1884604001516119c1565b90925090508015610e7e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610346565b505b5f818152600385016020526040808220815160e081019092528054829060ff166005811115610eb157610eb1612b7d565b6005811115610ec257610ec2612b7d565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610f535760405162461bcd60e51b815260040161034690612e9b565b5f600382516005811115610f6957610f69612b7d565b1480610f875750600282516005811115610f8557610f85612b7d565b145b15610fa957506020808201515f90815260048088019092526040812055610fad565b5060055b5f83815260038701602052604090208251815484929190829060ff19166001836005811115610fde57610fde612b7d565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561112e576110ee816001612c4e565b6110f9906008612c37565b5081515f9083908390811061111057611110612ee7565b60200101906001600160f81b03191690815f1a9053506001016110da565b505f5b600481101561119157611145816003612c4e565b611150906008612c37565b6001901c60f81b82611163836002612efb565b8151811061117357611173612ee7565b60200101906001600160f81b03191690815f1a905350600101611131565b505f5b60208110156111f3576111a881601f612c4e565b6111b3906008612c37565b86901c60f81b826111c5836006612efb565b815181106111d5576111d5612ee7565b60200101906001600160f81b03191690815f1a905350600101611194565b505f5b600881101561125e5761120a816007612c4e565b611215906008612c37565b6001600160401b038616901c60f81b82611230836026612efb565b8151811061124057611240612ee7565b60200101906001600160f81b03191690815f1a9053506001016111f6565b505f5b60088110156112c957611275816007612c4e565b611280906008612c37565b6001600160401b038516901c60f81b8261129b83602e612efb565b815181106112ab576112ab612ee7565b60200101906001600160f81b03191690815f1a905350600101611261565b50949350505050565b6112da6122a8565b6112e3816122f3565b50565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04545f805160206131ae83398151915290600160801b900460ff165f0361132b575050565b60038101544290811161133d57505050565b60408051606081018252600584015480825260068501546001600160401b038082166020850152600160401b90910481169383019390935260048501549192919091169061138b9084612c4e565b106113a7576001600160401b03841660408201528181526113c6565b83816040018181516113b99190612f0e565b6001600160401b03169052505b5f8160200151826040015160646113dd9190612f35565b6113e79190612f60565b600485015490915060ff600160801b909104811690821611156114695760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610346565b50805160058401556020810151600690930180546040909201516001600160401b03908116600160401b026001600160801b0319909316941693909317179091555050565b5f808251602e146114d15760405162461bcd60e51b815260040161034690612f85565b5f805b6002811015611520576114e8816001612c4e565b6114f3906008612c37565b61ffff1685828151811061150957611509612ee7565b016020015160f81c901b91909117906001016114d4565b5061ffff8116156115435760405162461bcd60e51b815260040161034690612fce565b5f805b600481101561159e5761155a816003612c4e565b611565906008612c37565b63ffffffff1686611577836002612efb565b8151811061158757611587612ee7565b016020015160f81c901b9190911790600101611546565b5063ffffffff81166004146115c55760405162461bcd60e51b815260040161034690613011565b5f805b602081101561161a576115dc81601f612c4e565b6115e7906008612c37565b876115f3836006612efb565b8151811061160357611603612ee7565b016020015160f81c901b91909117906001016115c8565b505f805b600881101561167957611632816007612c4e565b61163d906008612c37565b6001600160401b031688611652836026612efb565b8151811061166257611662612ee7565b016020015160f81c901b919091179060010161161e565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040808220815160e0810190925280545f805160206131ce83398151915293929190829060ff1660058111156116e6576116e6612b7d565b60058111156116f7576116f7612b7d565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561177157611771612b7d565b146117cd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610346565b60408101516001600160a01b0316336001600160a01b0316146118025760405162461bcd60e51b815260040161034690612e9b565b6003808252426001600160401b031660c08301525f848152908301602052604090208151815483929190829060ff1916600183600581111561184657611846612b7d565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906118fd908590836110b5565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061192c908590600401612bb3565b6020604051808303815f875af1158015611948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061196c9190612be5565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146119e45760405162461bcd60e51b815260040161034690612f85565b5f805b6002811015611a33576119fb816001612c4e565b611a06906008612c37565b61ffff16858281518110611a1c57611a1c612ee7565b016020015160f81c901b91909117906001016119e7565b5061ffff811615611a565760405162461bcd60e51b815260040161034690612fce565b5f805b6004811015611ab157611a6d816003612c4e565b611a78906008612c37565b63ffffffff1686611a8a836002612efb565b81518110611a9a57611a9a612ee7565b016020015160f81c901b9190911790600101611a59565b5063ffffffff8116600214611ad85760405162461bcd60e51b815260040161034690613011565b5f805b6020811015611b2d57611aef81601f612c4e565b611afa906008612c37565b87611b06836006612efb565b81518110611b1657611b16612ee7565b016020015160f81c901b9190911790600101611adb565b505f86602681518110611b4257611b42612ee7565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206131ae8339815191528282611b7c826104df565b83549091506001600160401b03821610801590611ba657508260010154816001600160401b031611155b611c045760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20496e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610346565b611c0d816112e6565b806001600160401b0316836002015f828254611c299190612efb565b909155509095945050505050565b5f611c4061235e565b5f805160206131ce833981519152426001600160401b038516118015611c7a57506001600160401b038416611c78426202a300612efb565b115b611cdc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610346565b85611d335760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610346565b5f86815260048201602052604090205415611da15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610346565b8251603014611e085760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610346565b5f80611e4f6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506123a8565b5f82815260028601602052604090209193509150611e6d828261309c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e9a908590600401612bb3565b6020604051808303815f875af1158015611eb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eda9190612be5565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526003880190522081518154829060ff19166001836005811115611f5357611f53612b7d565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061206560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b949350505050565b5f805f83516036146120915760405162461bcd60e51b815260040161034690612f85565b5f805b60028110156120e0576120a8816001612c4e565b6120b3906008612c37565b61ffff168682815181106120c9576120c9612ee7565b016020015160f81c901b9190911790600101612094565b5061ffff8116156121035760405162461bcd60e51b815260040161034690612fce565b5f805b600481101561215e5761211a816003612c4e565b612125906008612c37565b63ffffffff1687612137836002612efb565b8151811061214757612147612ee7565b016020015160f81c901b9190911790600101612106565b5063ffffffff81166001146121855760405162461bcd60e51b815260040161034690613011565b5f805b60208110156121da5761219c81601f612c4e565b6121a7906008612c37565b886121b3836006612efb565b815181106121c3576121c3612ee7565b016020015160f81c901b9190911790600101612188565b505f805b6008811015612239576121f2816007612c4e565b6121fd906008612c37565b6001600160401b031689612212836026612efb565b8151811061222257612222612ee7565b016020015160f81c901b91909117906001016121de565b505f805b600881101561229857612251816007612c4e565b61225c906008612c37565b6001600160401b03168a61227183602e612efb565b8151811061228157612281612ee7565b016020015160f81c901b919091179060010161223d565b5091989097509095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166122f157604051631afcd79f60e31b815260040160405180910390fd5b565b6122fb6122a8565b61230481612773565b6112e360408201356060830135608084013561232660c0860160a08701612990565b61233660e0870160c08801612990565b612347610100880160e08901613157565b61235961012089016101008a01613177565b612794565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016123a257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146124125760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610346565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561248957612449816001612c4e565b612454906008612c37565b5081515f9083908390811061246b5761246b612ee7565b60200101906001600160f81b03191690815f1a905350600101612435565b505f5b60048110156124e7576124a0816003612c4e565b6124ab906008612c37565b505f826124b9836002612efb565b815181106124c9576124c9612ee7565b60200101906001600160f81b03191690815f1a90535060010161248c565b505f5b6020811015612544578451816020811061250657612506612ee7565b1a60f81b82612516836006612efb565b8151811061252657612526612ee7565b60200101906001600160f81b03191690815f1a9053506001016124ea565b505f5b60208110156125a4578460200151816020811061256657612566612ee7565b1a60f81b82612576836026612efb565b8151811061258657612586612ee7565b60200101906001600160f81b03191690815f1a905350600101612547565b505f5b6008811015612618576125bb816007612c4e565b6125c6906008612c37565b60ff1685604001516001600160401b0316901c60f81b828260466125ea9190612efb565b815181106125fa576125fa612ee7565b60200101906001600160f81b03191690815f1a9053506001016125a7565b505f5b6030811015612683578460800151818151811061263a5761263a612ee7565b01602001516001600160f81b0319168261265583604e612efb565b8151811061266557612665612ee7565b60200101906001600160f81b03191690815f1a90535060010161261b565b505f5b60088110156126f55761269a816007612c4e565b6126a5906008612c37565b60608601516001600160401b0390811691161c60f81b826126c783607e612efb565b815181106126d7576126d7612ee7565b60200101906001600160f81b03191690815f1a905350600101612686565b506002816040516127069190613192565b602060405180830381855afa158015612721573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906127449190612be5565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61277b6122a8565b61278361289c565b61278b6128ac565b6112e3816128b4565b61279c6122a8565b5f805160206131ae833981519152969096557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01949094557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03929092557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0480546001600160401b039283166001600160801b031990911617600160401b93909216929092021760ff60801b1916600160801b60ff909316929092029190911790557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0780546001600160a01b0319166001600160a01b03909216919091179055565b6128a46122a8565b6122f16128f5565b6122f16122a8565b6128bc6122a8565b80355f805160206131ce83398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b61274d6122a8565b50805461290990612d98565b5f825580601f10612918575050565b601f0160209004905f5260205f20908101906112e391905b80821115612943575f8155600101612930565b5090565b5f60208284031215612957575f80fd5b5035919050565b5f610120828403121561296f575f80fd5b50919050565b80356001600160401b038116811461298b575f80fd5b919050565b5f602082840312156129a0575f80fd5b6129a982612975565b9392505050565b80151581146112e3575f80fd5b803563ffffffff8116811461298b575f80fd5b5f805f606084860312156129e2575f80fd5b8335925060208401356129f4816129b0565b9150612a02604085016129bd565b90509250925092565b5f60208284031215612a1b575f80fd5b6129a9826129bd565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612a5a57612a5a612a24565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612a8857612a88612a24565b604052919050565b5f6001600160401b03821115612aa857612aa8612a24565b50601f01601f191660200190565b5f805f60608486031215612ac8575f80fd5b83359250612ad860208501612975565b915060408401356001600160401b03811115612af2575f80fd5b8401601f81018613612b02575f80fd5b8035612b15612b1082612a90565b612a60565b818152876020838501011115612b29575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215612b59575f80fd5b612b62836129bd565b91506020830135612b72816129b0565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612bab578181015183820152602001612b93565b50505f910152565b602081525f8251806020840152612bd1816040850160208701612b91565b601f01601f19169190910160400192915050565b5f60208284031215612bf5575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612c3257612c32612bfc565b500490565b80820281158282048414176104ef576104ef612c10565b818103818111156104ef576104ef612c10565b6001600160a01b03811681146112e3575f80fd5b805161298b816129b0565b5f8060408385031215612c91575f80fd5b82516001600160401b0380821115612ca7575f80fd5b9084019060608287031215612cba575f80fd5b612cc2612a38565b82518152602080840151612cd581612c61565b82820152604084015183811115612cea575f80fd5b80850194505087601f850112612cfe575f80fd5b83519250612d0e612b1084612a90565b8381528882858701011115612d21575f80fd5b612d3084838301848801612b91565b80604084015250819550612d45818801612c75565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c90821680612dac57607f821691505b60208210810361296f57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612e2381612d98565b806020870152604060018084165f8114612e445760018114612e6057612e8d565b60ff19851660408a0152604084151560051b8a01019550612e8d565b895f5260205f205f5b85811015612e845781548b8201860152908301908801612e69565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104ef576104ef612c10565b6001600160401b03818116838216019080821115612f2e57612f2e612c10565b5092915050565b6001600160401b03818116838216028082169190828114612f5857612f58612c10565b505092915050565b5f6001600160401b0380841680612f7957612f79612bfc565b92169190910492915050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610cbc57805f5260205f20601f840160051c8101602085101561307d5750805b601f840160051c820191505b818110156103cc575f8155600101613089565b81516001600160401b038111156130b5576130b5612a24565b6130c9816130c38454612d98565b84613058565b602080601f8311600181146130fc575f84156130e55750858301515b5f19600386901b1c1916600185901b1785556104d7565b5f85815260208120601f198616915b8281101561312a5788860151825594840194600190910190840161310b565b508582101561314757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215613167575f80fd5b813560ff811681146129a9575f80fd5b5f60208284031215613187575f80fd5b81356129a981612c61565b5f82516131a3818460208701612b91565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -353,23 +355,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x00e41792. +// Initialize is a paid mutator transaction binding the contract method 0x2e1488ec. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint256,uint64,uint64,uint8,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 0x00e41792. +// Initialize is a paid mutator transaction binding the contract method 0x2e1488ec. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint256,uint64,uint64,uint8,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 0x00e41792. +// Initialize is a paid mutator transaction binding the contract method 0x2e1488ec. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint256,uint64,uint64,uint8,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index eb964608b..4fb4854b7 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -33,13 +33,12 @@ var ( type ValidatorManagerSettings struct { PChainBlockchainID [32]byte SubnetID [32]byte - MaximumHourlyChurn uint8 } // 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c2a380380612c2a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612add8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b836600461227e565b6101b1565b005b6100d26100cd366004612342565b610387565b6040519081526020015b60405180910390f35b6100bd6103a7565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f36600461227e565b6103ba565b6100bd6101523660046123f8565b6103c6565b6101196005600160991b0181565b6100bd61017336600461227e565b6106df565b6100bd61018636600461242c565b6107f3565b6100bd610199366004612468565b610901565b6100bd6101ac366004612490565b61093b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612ab183398151915293929190829060ff166005811115610211576102116124ba565b6005811115610222576102226124ba565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c09091015290915081516005811115610299576102996124ba565b146103035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103138483606001515f610d0e565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103409084906004016124f0565b6020604051808303815f875af115801561035c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103809190612522565b5050505050565b5f610390610f2b565b61039c84868585610f86565b90505b949350505050565b6103af610f2b565b6103b85f6113bd565b565b6103c38161142d565b50565b5f5f80516020612ab18339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610421573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104489190810190612544565b91509150806104695760405162461bcd60e51b81526004016102fa90612616565b82548251146104cc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102fa565b60208201516001600160a01b03161561053f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102fa565b5f8061054e8460400151611775565b91509150806105b05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102fa565b5f828152600586016020526040812080546105ca9061265c565b90501180156105fc575060015f83815260068701602052604090205460ff1660058111156105fa576105fa6124ba565b145b6106185760405162461bcd60e51b81526004016102fa90612694565b5f828152600586016020526040812061063091612234565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612ab18339815191529291906107279061265c565b9050118015610759575060015f83815260068301602052604090205460ff166005811115610757576107576124ba565b145b6107755760405162461bcd60e51b81526004016102fa90612694565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107ae91906004016126db565b6020604051808303815f875af11580156107ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ee9190612522565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108375750825b90505f826001600160401b031660011480156108525750303b155b905081158015610860575080155b1561087e5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108a857845460ff60401b1916600160401b1785555b6108b28787611916565b83156108f857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610909610f2b565b6001600160a01b03811661093257604051631e4fbdf760e01b81525f60048201526024016102fa565b6103c3816113bd565b5f5f80516020612ab18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610996573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109bd9190810190612544565b91509150806109de5760405162461bcd60e51b81526004016102fa90612616565b5f8415610a62575f6109f38460400151611934565b919350909150506001600160401b03811615610a5c5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016102fa565b50610ad8565b5f610a708460400151611775565b90925090508015610ad65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102fa565b505b5f818152600685016020526040808220815160e081019092528054829060ff166005811115610b0957610b096124ba565b6005811115610b1a57610b1a6124ba565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610bab5760405162461bcd60e51b81526004016102fa90612765565b5f600382516005811115610bc157610bc16124ba565b1480610bdf5750600282516005811115610bdd57610bdd6124ba565b145b15610c0257506020808201515f9081526007870190915260408120556004610c06565b5060055b5f83815260068701602052604090208251815484929190829060ff19166001836005811115610c3757610c376124ba565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610d8757610d478160016127c5565b610d529060086127de565b5081515f90839083908110610d6957610d696127f5565b60200101906001600160f81b03191690815f1a905350600101610d33565b505f5b6004811015610dea57610d9e8160036127c5565b610da99060086127de565b6001901c60f81b82610dbc836002612809565b81518110610dcc57610dcc6127f5565b60200101906001600160f81b03191690815f1a905350600101610d8a565b505f5b6020811015610e4c57610e0181601f6127c5565b610e0c9060086127de565b86901c60f81b82610e1e836006612809565b81518110610e2e57610e2e6127f5565b60200101906001600160f81b03191690815f1a905350600101610ded565b505f5b6008811015610eb757610e638160076127c5565b610e6e9060086127de565b6001600160401b038616901c60f81b82610e89836026612809565b81518110610e9957610e996127f5565b60200101906001600160f81b03191690815f1a905350600101610e4f565b505f5b6008811015610f2257610ece8160076127c5565b610ed99060086127de565b6001600160401b038516901c60f81b82610ef483602e612809565b81518110610f0457610f046127f5565b60200101906001600160f81b03191690815f1a905350600101610eba565b50949350505050565b33610f5d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103b85760405163118cdaa760e01b81523360048201526024016102fa565b5f610f8f611b6f565b5f80516020612ab1833981519152426001600160401b038516118015610fc957506001600160401b038416610fc7426202a300612809565b115b61102b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102fa565b856110825760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102fa565b5f868152600782016020526040902054156110f05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102fa565b82516030146111575760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102fa565b61116085611bb9565b5f806111a76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611d5a565b5f828152600586016020526040902091935091506111c58282612860565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906111f29085906004016124f0565b6020604051808303815f875af115801561120e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112329190612522565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff191660018360058111156112ab576112ab6124ba565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061039f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612ab183398151915293929190829060ff16600581111561148d5761148d6124ba565b600581111561149e5761149e6124ba565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c09091015290915081516005811115611518576115186124ba565b146115745760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102fa565b60408101516001600160a01b0316336001600160a01b0316146115a95760405162461bcd60e51b81526004016102fa90612765565b6115b68160800151611bb9565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156115fa576115fa6124ba565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906116b190859083610d0e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116e09085906004016124f0565b6020604051808303815f875af11580156116fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117209190612522565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117985760405162461bcd60e51b81526004016102fa9061291f565b5f805b60028110156117e7576117af8160016127c5565b6117ba9060086127de565b61ffff168582815181106117d0576117d06127f5565b016020015160f81c901b919091179060010161179b565b5061ffff81161561180a5760405162461bcd60e51b81526004016102fa90612968565b5f805b6004811015611865576118218160036127c5565b61182c9060086127de565b63ffffffff168661183e836002612809565b8151811061184e5761184e6127f5565b016020015160f81c901b919091179060010161180d565b5063ffffffff811660021461188c5760405162461bcd60e51b81526004016102fa906129ab565b5f805b60208110156118e1576118a381601f6127c5565b6118ae9060086127de565b876118ba836006612809565b815181106118ca576118ca6127f5565b016020015160f81c901b919091179060010161188f565b505f866026815181106118f6576118f66127f5565b016020015191976001600160f81b03199092161515965090945050505050565b61191e612125565b6119278261216e565b6119308161218f565b5050565b5f805f83516036146119585760405162461bcd60e51b81526004016102fa9061291f565b5f805b60028110156119a75761196f8160016127c5565b61197a9060086127de565b61ffff16868281518110611990576119906127f5565b016020015160f81c901b919091179060010161195b565b5061ffff8116156119ca5760405162461bcd60e51b81526004016102fa90612968565b5f805b6004811015611a25576119e18160036127c5565b6119ec9060086127de565b63ffffffff16876119fe836002612809565b81518110611a0e57611a0e6127f5565b016020015160f81c901b91909117906001016119cd565b5063ffffffff8116600114611a4c5760405162461bcd60e51b81526004016102fa906129ab565b5f805b6020811015611aa157611a6381601f6127c5565b611a6e9060086127de565b88611a7a836006612809565b81518110611a8a57611a8a6127f5565b016020015160f81c901b9190911790600101611a4f565b505f805b6008811015611b0057611ab98160076127c5565b611ac49060086127de565b6001600160401b031689611ad9836026612809565b81518110611ae957611ae96127f5565b016020015160f81c901b9190911790600101611aa5565b505f805b6008811015611b5f57611b188160076127c5565b611b239060086127de565b6001600160401b03168a611b3883602e612809565b81518110611b4857611b486127f5565b016020015160f81c901b9190911790600101611b04565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611bb357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612ab18339815191529060ff165f03611bf7575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611c3f90836127c5565b10611c5b576001600160401b0384166040830152808252611c7a565b8382604001818151611c6d91906129f2565b6001600160401b03169052505b5f826020015183604001516064611c919190612a19565b611c9b9190612a44565b600285015490915060ff9081169082161115611d165760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102fa565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611dc45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102fa565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e3b57611dfb8160016127c5565b611e069060086127de565b5081515f90839083908110611e1d57611e1d6127f5565b60200101906001600160f81b03191690815f1a905350600101611de7565b505f5b6004811015611e9957611e528160036127c5565b611e5d9060086127de565b505f82611e6b836002612809565b81518110611e7b57611e7b6127f5565b60200101906001600160f81b03191690815f1a905350600101611e3e565b505f5b6020811015611ef65784518160208110611eb857611eb86127f5565b1a60f81b82611ec8836006612809565b81518110611ed857611ed86127f5565b60200101906001600160f81b03191690815f1a905350600101611e9c565b505f5b6020811015611f565784602001518160208110611f1857611f186127f5565b1a60f81b82611f28836026612809565b81518110611f3857611f386127f5565b60200101906001600160f81b03191690815f1a905350600101611ef9565b505f5b6008811015611fca57611f6d8160076127c5565b611f789060086127de565b60ff1685604001516001600160401b0316901c60f81b82826046611f9c9190612809565b81518110611fac57611fac6127f5565b60200101906001600160f81b03191690815f1a905350600101611f59565b505f5b60308110156120355784608001518181518110611fec57611fec6127f5565b01602001516001600160f81b0319168261200783604e612809565b81518110612017576120176127f5565b60200101906001600160f81b03191690815f1a905350600101611fcd565b505f5b60088110156120a75761204c8160076127c5565b6120579060086127de565b60608601516001600160401b0390811691161c60f81b8261207983607e612809565b81518110612089576120896127f5565b60200101906001600160f81b03191690815f1a905350600101612038565b506002816040516120b89190612a75565b602060405180830381855afa1580156120d3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906120f69190612522565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103b857604051631afcd79f60e31b815260040160405180910390fd5b612176612125565b61217e6121a0565b6121866121b0565b6103c3816121b8565b612197612125565b6103c381612224565b6121a8612125565b6103b861222c565b6103b8612125565b6121c0612125565b80355f80516020612ab183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561220a6060830160408401612a90565b600291909101805460ff191660ff90921691909117905550565b610909612125565b6120ff612125565b5080546122409061265c565b5f825580601f1061224f575050565b601f0160209004905f5260205f20908101906103c391905b8082111561227a575f8155600101612267565b5090565b5f6020828403121561228e575f80fd5b5035919050565b80356001600160401b03811681146122ab575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156122e6576122e66122b0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612314576123146122b0565b604052919050565b5f6001600160401b03821115612334576123346122b0565b50601f01601f191660200190565b5f805f8060808587031215612355575f80fd5b61235e85612295565b93506020850135925061237360408601612295565b915060608501356001600160401b0381111561238d575f80fd5b8501601f8101871361239d575f80fd5b80356123b06123ab8261231c565b6122ec565b8181528860208385010111156123c4575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146122ab575f80fd5b5f60208284031215612408575f80fd5b612411826123e5565b9392505050565b6001600160a01b03811681146103c3575f80fd5b5f80828403608081121561243e575f80fd5b606081121561244b575f80fd5b50829150606083013561245d81612418565b809150509250929050565b5f60208284031215612478575f80fd5b813561241181612418565b80151581146103c3575f80fd5b5f80604083850312156124a1575f80fd5b6124aa836123e5565b9150602083013561245d81612483565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156124e85781810151838201526020016124d0565b50505f910152565b602081525f825180602084015261250e8160408501602087016124ce565b601f01601f19169190910160400192915050565b5f60208284031215612532575f80fd5b5051919050565b80516122ab81612483565b5f8060408385031215612555575f80fd5b82516001600160401b038082111561256b575f80fd5b908401906060828703121561257e575f80fd5b6125866122c4565b8251815260208084015161259981612418565b828201526040840151838111156125ae575f80fd5b80850194505087601f8501126125c2575f80fd5b835192506125d26123ab8461231c565b83815288828587010111156125e5575f80fd5b6125f4848383018488016124ce565b80604084015250819550612609818801612539565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061267057607f821691505b60208210810361268e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546126ed8161265c565b806020870152604060018084165f811461270e576001811461272a57612757565b60ff19851660408a0152604084151560051b8a01019550612757565b895f5260205f205f5b8581101561274e5781548b8201860152908301908801612733565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b818103818111156127d8576127d86127b1565b92915050565b80820281158282048414176127d8576127d86127b1565b634e487b7160e01b5f52603260045260245ffd5b808201808211156127d8576127d86127b1565b601f8211156107ee57805f5260205f20601f840160051c810160208510156128415750805b601f840160051c820191505b81811015610380575f815560010161284d565b81516001600160401b03811115612879576128796122b0565b61288d81612887845461265c565b8461281c565b602080601f8311600181146128c0575f84156128a95750858301515b5f19600386901b1c1916600185901b178555612917565b5f85815260208120601f198616915b828110156128ee578886015182559484019460019091019084016128cf565b508582101561290b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612a1257612a126127b1565b5092915050565b6001600160401b03818116838216028082169190828114612a3c57612a3c6127b1565b505092915050565b5f6001600160401b0380841680612a6957634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a868184602087016124ce565b9190910192915050565b5f60208284031215612aa0575f80fd5b813560ff81168114612411575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516129a33803806129a383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6128568061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063f2fde38b14610178578063f3e148eb1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b836600461209a565b6101b1565b005b6100d26100cd36600461215e565b610387565b6040519081526020015b60405180910390f35b6100bd6103a7565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f36600461209a565b6103ba565b6100bd610152366004612214565b6103c6565b6101196005600160991b0181565b6100bd61017336600461209a565b6106de565b6100bd610186366004612248565b6107f2565b6100bd610199366004612263565b61082c565b6100bd6101ac3660046122ac565b61093a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040808220815160e0810190925280545f8051602061282a83398151915293929190829060ff166005811115610211576102116122d6565b6005811115610222576102226122d6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c09091015290915081516005811115610299576102996122d6565b146103035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103138483606001515f610d0c565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061034090849060040161230c565b6020604051808303815f875af115801561035c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610380919061233e565b5050505050565b5f610390610f29565b61039c84868585610f84565b90505b949350505050565b6103af610f29565b6103b85f6113b2565b565b6103c381611422565b50565b5f5f8051602061282a8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610421573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526104489190810190612360565b91509150806104695760405162461bcd60e51b81526004016102fa90612432565b82548251146104cc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20496e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102fa565b60208201516001600160a01b03161561053f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20496e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102fa565b5f8061054e846040015161175d565b91509150806105b05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102fa565b5f828152600286016020526040812080546105ca90612478565b90501180156105fc575060015f83815260038701602052604090205460ff1660058111156105fa576105fa6122d6565b145b6106185760405162461bcd60e51b81526004016102fa906124b0565b5f828152600286016020526040812061063091612050565b5f828152600386810160208181526040808520805460ff1916600217815593840180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190960154875260048c01845282872089905595889052928252915482519316835282019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061282a83398151915292919061072690612478565b9050118015610758575060015f83815260038301602052604090205460ff166005811115610756576107566122d6565b145b6107745760405162461bcd60e51b81526004016102fa906124b0565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107ad91906004016124f7565b6020604051808303815f875af11580156107c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ed919061233e565b505050565b6107fa610f29565b6001600160a01b03811661082357604051631e4fbdf760e01b81525f60048201526024016102fa565b6103c3816113b2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108705750825b90505f826001600160401b0316600114801561088b5750303b155b905081158015610899575080155b156108b75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156108e157845460ff60401b1916600160401b1785555b6108eb87876118fe565b831561093157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f5f8051602061282a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610995573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109bc9190810190612360565b91509150806109dd5760405162461bcd60e51b81526004016102fa90612432565b5f8415610a61575f6109f2846040015161191c565b919350909150506001600160401b03811615610a5b5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016102fa565b50610ad7565b5f610a6f846040015161175d565b90925090508015610ad55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102fa565b505b5f818152600385016020526040808220815160e081019092528054829060ff166005811115610b0857610b086122d6565b6005811115610b1957610b196122d6565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610baa5760405162461bcd60e51b81526004016102fa90612581565b5f600382516005811115610bc057610bc06122d6565b1480610bde5750600282516005811115610bdc57610bdc6122d6565b145b15610c0057506020808201515f90815260048088019092526040812055610c04565b5060055b5f83815260038701602052604090208251815484929190829060ff19166001836005811115610c3557610c356122d6565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610d8557610d458160016125e1565b610d509060086125fa565b5081515f90839083908110610d6757610d67612611565b60200101906001600160f81b03191690815f1a905350600101610d31565b505f5b6004811015610de857610d9c8160036125e1565b610da79060086125fa565b6001901c60f81b82610dba836002612625565b81518110610dca57610dca612611565b60200101906001600160f81b03191690815f1a905350600101610d88565b505f5b6020811015610e4a57610dff81601f6125e1565b610e0a9060086125fa565b86901c60f81b82610e1c836006612625565b81518110610e2c57610e2c612611565b60200101906001600160f81b03191690815f1a905350600101610deb565b505f5b6008811015610eb557610e618160076125e1565b610e6c9060086125fa565b6001600160401b038616901c60f81b82610e87836026612625565b81518110610e9757610e97612611565b60200101906001600160f81b03191690815f1a905350600101610e4d565b505f5b6008811015610f2057610ecc8160076125e1565b610ed79060086125fa565b6001600160401b038516901c60f81b82610ef283602e612625565b81518110610f0257610f02612611565b60200101906001600160f81b03191690815f1a905350600101610eb8565b50949350505050565b33610f5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103b85760405163118cdaa760e01b81523360048201526024016102fa565b5f610f8d611b57565b5f8051602061282a833981519152426001600160401b038516118015610fc757506001600160401b038416610fc5426202a300612625565b115b6110295760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102fa565b856110805760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016102fa565b5f868152600482016020526040902054156110ee5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102fa565b82516030146111555760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102fa565b5f8061119c6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611ba1565b5f828152600286016020526040902091935091506111ba828261267c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906111e790859060040161230c565b6020604051808303815f875af1158015611203573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611227919061233e565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526003880190522081518154829060ff191660018360058111156112a0576112a06122d6565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061039f60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040808220815160e0810190925280545f8051602061282a83398151915293929190829060ff166005811115611482576114826122d6565b6005811115611493576114936122d6565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561150d5761150d6122d6565b146115695760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102fa565b60408101516001600160a01b0316336001600160a01b03161461159e5760405162461bcd60e51b81526004016102fa90612581565b6003808252426001600160401b031660c08301525f848152908301602052604090208151815483929190829060ff191660018360058111156115e2576115e26122d6565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061169990859083610d0c565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906116c890859060040161230c565b6020604051808303815f875af11580156116e4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611708919061233e565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146117805760405162461bcd60e51b81526004016102fa9061273b565b5f805b60028110156117cf576117978160016125e1565b6117a29060086125fa565b61ffff168582815181106117b8576117b8612611565b016020015160f81c901b9190911790600101611783565b5061ffff8116156117f25760405162461bcd60e51b81526004016102fa90612784565b5f805b600481101561184d576118098160036125e1565b6118149060086125fa565b63ffffffff1686611826836002612625565b8151811061183657611836612611565b016020015160f81c901b91909117906001016117f5565b5063ffffffff81166002146118745760405162461bcd60e51b81526004016102fa906127c7565b5f805b60208110156118c95761188b81601f6125e1565b6118969060086125fa565b876118a2836006612625565b815181106118b2576118b2612611565b016020015160f81c901b9190911790600101611877565b505f866026815181106118de576118de612611565b016020015191976001600160f81b03199092161515965090945050505050565b611906611f6c565b61190f82611fb5565b61191881611fd6565b5050565b5f805f83516036146119405760405162461bcd60e51b81526004016102fa9061273b565b5f805b600281101561198f576119578160016125e1565b6119629060086125fa565b61ffff1686828151811061197857611978612611565b016020015160f81c901b9190911790600101611943565b5061ffff8116156119b25760405162461bcd60e51b81526004016102fa90612784565b5f805b6004811015611a0d576119c98160036125e1565b6119d49060086125fa565b63ffffffff16876119e6836002612625565b815181106119f6576119f6612611565b016020015160f81c901b91909117906001016119b5565b5063ffffffff8116600114611a345760405162461bcd60e51b81526004016102fa906127c7565b5f805b6020811015611a8957611a4b81601f6125e1565b611a569060086125fa565b88611a62836006612625565b81518110611a7257611a72612611565b016020015160f81c901b9190911790600101611a37565b505f805b6008811015611ae857611aa18160076125e1565b611aac9060086125fa565b6001600160401b031689611ac1836026612625565b81518110611ad157611ad1612611565b016020015160f81c901b9190911790600101611a8d565b505f805b6008811015611b4757611b008160076125e1565b611b0b9060086125fa565b6001600160401b03168a611b2083602e612625565b81518110611b3057611b30612611565b016020015160f81c901b9190911790600101611aec565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611b9b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6060826080015151603014611c0b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102fa565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c8257611c428160016125e1565b611c4d9060086125fa565b5081515f90839083908110611c6457611c64612611565b60200101906001600160f81b03191690815f1a905350600101611c2e565b505f5b6004811015611ce057611c998160036125e1565b611ca49060086125fa565b505f82611cb2836002612625565b81518110611cc257611cc2612611565b60200101906001600160f81b03191690815f1a905350600101611c85565b505f5b6020811015611d3d5784518160208110611cff57611cff612611565b1a60f81b82611d0f836006612625565b81518110611d1f57611d1f612611565b60200101906001600160f81b03191690815f1a905350600101611ce3565b505f5b6020811015611d9d5784602001518160208110611d5f57611d5f612611565b1a60f81b82611d6f836026612625565b81518110611d7f57611d7f612611565b60200101906001600160f81b03191690815f1a905350600101611d40565b505f5b6008811015611e1157611db48160076125e1565b611dbf9060086125fa565b60ff1685604001516001600160401b0316901c60f81b82826046611de39190612625565b81518110611df357611df3612611565b60200101906001600160f81b03191690815f1a905350600101611da0565b505f5b6030811015611e7c5784608001518181518110611e3357611e33612611565b01602001516001600160f81b03191682611e4e83604e612625565b81518110611e5e57611e5e612611565b60200101906001600160f81b03191690815f1a905350600101611e14565b505f5b6008811015611eee57611e938160076125e1565b611e9e9060086125fa565b60608601516001600160401b0390811691161c60f81b82611ec083607e612625565b81518110611ed057611ed0612611565b60200101906001600160f81b03191690815f1a905350600101611e7f565b50600281604051611eff919061280e565b602060405180830381855afa158015611f1a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f3d919061233e565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103b857604051631afcd79f60e31b815260040160405180910390fd5b611fbd611f6c565b611fc5611fe7565b611fcd611ff7565b6103c381611fff565b611fde611f6c565b6103c381612040565b611fef611f6c565b6103b8612048565b6103b8611f6c565b612007611f6c565b80355f8051602061282a83398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b6107fa611f6c565b611f46611f6c565b50805461205c90612478565b5f825580601f1061206b575050565b601f0160209004905f5260205f20908101906103c391905b80821115612096575f8155600101612083565b5090565b5f602082840312156120aa575f80fd5b5035919050565b80356001600160401b03811681146120c7575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612102576121026120cc565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612130576121306120cc565b604052919050565b5f6001600160401b03821115612150576121506120cc565b50601f01601f191660200190565b5f805f8060808587031215612171575f80fd5b61217a856120b1565b93506020850135925061218f604086016120b1565b915060608501356001600160401b038111156121a9575f80fd5b8501601f810187136121b9575f80fd5b80356121cc6121c782612138565b612108565b8181528860208385010111156121e0575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff811681146120c7575f80fd5b5f60208284031215612224575f80fd5b61222d82612201565b9392505050565b6001600160a01b03811681146103c3575f80fd5b5f60208284031215612258575f80fd5b813561222d81612234565b5f808284036060811215612275575f80fd5b6040811215612282575f80fd5b50829150604083013561229481612234565b809150509250929050565b80151581146103c3575f80fd5b5f80604083850312156122bd575f80fd5b6122c683612201565b915060208301356122948161229f565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156123045781810151838201526020016122ec565b50505f910152565b602081525f825180602084015261232a8160408501602087016122ea565b601f01601f19169190910160400192915050565b5f6020828403121561234e575f80fd5b5051919050565b80516120c78161229f565b5f8060408385031215612371575f80fd5b82516001600160401b0380821115612387575f80fd5b908401906060828703121561239a575f80fd5b6123a26120e0565b825181526020808401516123b581612234565b828201526040840151838111156123ca575f80fd5b80850194505087601f8501126123de575f80fd5b835192506123ee6121c784612138565b8381528882858701011115612401575f80fd5b612410848383018488016122ea565b80604084015250819550612425818801612355565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b600181811c9082168061248c57607f821691505b6020821081036124aa57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461250981612478565b806020870152604060018084165f811461252a576001811461254657612573565b60ff19851660408a0152604084151560051b8a01019550612573565b895f5260205f205f5b8581101561256a5781548b820186015290830190880161254f565b8a016040019650505b509398975050505050505050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b818103818111156125f4576125f46125cd565b92915050565b80820281158282048414176125f4576125f46125cd565b634e487b7160e01b5f52603260045260245ffd5b808201808211156125f4576125f46125cd565b601f8211156107ed57805f5260205f20601f840160051c8101602085101561265d5750805b601f840160051c820191505b81811015610380575f8155600101612669565b81516001600160401b03811115612695576126956120cc565b6126a9816126a38454612478565b84612638565b602080601f8311600181146126dc575f84156126c55750858301515b5f19600386901b1c1916600185901b178555612733565b5f85815260208120601f198616915b8281101561270a578886015182559484019460019091019084016126eb565b508582101561272757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f825161281f8184602087016122ea565b919091019291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -313,23 +312,23 @@ func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteValida return _PoAValidatorManager.Contract.CompleteValidatorRegistration(&_PoAValidatorManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0xc151c0b9. +// Initialize is a paid mutator transaction binding the contract method 0xf3e148eb. // -// Solidity: function initialize((bytes32,bytes32,uint8) settings, address initialOwner) returns() +// Solidity: function initialize((bytes32,bytes32) settings, address initialOwner) returns() func (_PoAValidatorManager *PoAValidatorManagerTransactor) Initialize(opts *bind.TransactOpts, settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { return _PoAValidatorManager.contract.Transact(opts, "initialize", settings, initialOwner) } -// Initialize is a paid mutator transaction binding the contract method 0xc151c0b9. +// Initialize is a paid mutator transaction binding the contract method 0xf3e148eb. // -// Solidity: function initialize((bytes32,bytes32,uint8) settings, address initialOwner) returns() +// Solidity: function initialize((bytes32,bytes32) settings, address initialOwner) returns() func (_PoAValidatorManager *PoAValidatorManagerSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) } -// Initialize is a paid mutator transaction binding the contract method 0xc151c0b9. +// Initialize is a paid mutator transaction binding the contract method 0xf3e148eb. // -// Solidity: function initialize((bytes32,bytes32,uint8) settings, address initialOwner) returns() +// Solidity: function initialize((bytes32,bytes32) settings, address initialOwner) returns() func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index f5fb3b7a4..615c28d0d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -21,8 +21,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 _maximumStakeAmount; uint256 _totalWeight; uint256 _churnTrackerStartTime; + uint64 _churnPeriodSeconds; uint64 _minimumStakeDuration; - uint8 _maximumHourlyChurn; + uint8 _maximumChurnPercentage; ValidatorChurnPeriod _churnTracker; IRewardCalculator _rewardCalculator; mapping(bytes32 validationID => uint64) _validatorUptimes; @@ -56,8 +57,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager minimumStakeAmount: settings.minimumStakeAmount, maximumStakeAmount: settings.maximumStakeAmount, churnTrackerStartTime: settings.churnTrackerStartTime, + churnPeriodSeconds: settings.churnPeriodSeconds, minimumStakeDuration: settings.minimumStakeDuration, - maximumHourlyChurn: settings.maximumHourlyChurn, + maximumChurnPercentage: settings.maximumChurnPercentage, rewardCalculator: settings.rewardCalculator }); } @@ -67,16 +69,18 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 minimumStakeAmount, uint256 maximumStakeAmount, uint256 churnTrackerStartTime, + uint64 churnPeriodSeconds, uint64 minimumStakeDuration, - uint8 maximumHourlyChurn, + uint8 maximumChurnPercentage, IRewardCalculator rewardCalculator ) internal onlyInitializing { PoSValidatorManagerStorage storage s = _getPoSValidatorManagerStorage(); s._minimumStakeAmount = minimumStakeAmount; s._maximumStakeAmount = maximumStakeAmount; s._churnTrackerStartTime = churnTrackerStartTime; + s._churnPeriodSeconds = churnPeriodSeconds; s._minimumStakeDuration = minimumStakeDuration; - s._maximumHourlyChurn = maximumHourlyChurn; + s._maximumChurnPercentage = maximumChurnPercentage; s._rewardCalculator = rewardCalculator; } @@ -161,7 +165,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager */ function _checkAndUpdateChurnTracker(uint64 amount) private { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - if ($._maximumHourlyChurn == 0) { + if ($._maximumChurnPercentage == 0) { return; } @@ -171,7 +175,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager } ValidatorChurnPeriod memory churnTracker = $._churnTracker; - if (currentTime - churnTracker.startedAt >= 1 hours) { + if (currentTime - churnTracker.startedAt >= $._churnPeriodSeconds) { churnTracker.churnAmount = amount; churnTracker.startedAt = currentTime; } else { @@ -180,7 +184,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint8 churnPercentage = uint8((churnTracker.churnAmount * 100) / churnTracker.initialWeight); require( - churnPercentage <= $._maximumHourlyChurn, + churnPercentage <= $._maximumChurnPercentage, "ValidatorManager: Maximum hourly churn rate exceeded" ); $._churnTracker = churnTracker; diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 095f87c17..3c7f48342 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -13,8 +13,9 @@ struct PoSValidatorManagerSettings { uint256 minimumStakeAmount; uint256 maximumStakeAmount; uint256 churnTrackerStartTime; + uint64 churnPeriodSeconds; uint64 minimumStakeDuration; - uint8 maximumHourlyChurn; + uint8 maximumChurnPercentage; IRewardCalculator rewardCalculator; } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 9fb977656..60e868c90 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -36,8 +36,9 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, churnTrackerStartTime: 0, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE, rewardCalculator: IRewardCalculator(address(0)) }), token diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 3721be3a9..a7baccb6f 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -28,9 +28,10 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { }), minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, churnTrackerStartTime: 0, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE, rewardCalculator: IRewardCalculator(address(0)) }) ); diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 1c8a2d89d..6a01dcdd4 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -32,8 +32,9 @@ abstract contract ValidatorManagerTest is Test { uint64 public constant DEFAULT_WEIGHT = 1e6; uint256 public constant DEFAULT_MINIMUM_STAKE = 20; uint256 public constant DEFAULT_MAXIMUM_STAKE = 1e10; + uint64 public constant DEFAULT_CHURN_PERIOD = 1 hours; uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; - uint8 public constant DEFAULT_MAXIMUM_HOURLY_CHURN = 0; + uint8 public constant DEFAULT_MAXIMUM_CHURN_PERCENTAGE = 0; uint64 public constant DEFAULT_EXPIRY = 1000; uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = 2000; diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 77c8274df..f69c7143c 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -70,12 +70,14 @@ func DeployAndInitializeNativeTokenStakingManager( BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnet.SubnetID, - MaximumHourlyChurn: 10, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + ChurnTrackerStartTime: big.NewInt(0), + ChurnPeriodSeconds: uint64(0), + MaximumChurnPercentage: uint8(0), + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), + RewardCalculator: common.Address{}, }, ) Expect(err).Should(BeNil()) @@ -130,12 +132,14 @@ func DeployAndInitializeERC20TokenStakingManager( BaseSettings: erc20tokenstakingmanager.ValidatorManagerSettings{ PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnet.SubnetID, - MaximumHourlyChurn: 10, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + ChurnTrackerStartTime: big.NewInt(0), + ChurnPeriodSeconds: uint64(0), + MaximumChurnPercentage: uint8(0), + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), + RewardCalculator: common.Address{}, }, erc20Address, ) @@ -184,7 +188,6 @@ func DeployAndInitializePoAValidatorManager( poavalidatormanager.ValidatorManagerSettings{ PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnet.SubnetID, - MaximumHourlyChurn: 0, }, ownerAddress, ) From 6107119f29fd9301e9a277221b35b89a73737632 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 29 Aug 2024 10:46:50 -0400 Subject: [PATCH 156/545] Rename ExitValidatorSetTx to DisableValidatorTx --- contracts/staking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/README.md b/contracts/staking/README.md index 8e724082b..2bb4b91ca 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -36,7 +36,7 @@ The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload #### Exit the Validator Set Directly on the P-Chain -ACP-77 also provides a method for validators to exit a Subnet's validator set without interacting with the Subnet directly. The P-Chain transaction [`ExitValidatorSetTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#exitvalidatorsettx) removes the validator from the Subnet validator set tracked on the P-Chain. The P-Chain will sign a `SetSubnetValidatorWeightMessage` or a `SubnetValidatorRegistrationMessage`, which may then be provided to the Validator Manager contract via a call to `completeEndValidation`, as described above. Note however that without the uptime proof provided in the initial call to `initializeEndValidation`, the Validator Manager will not credit any staking rewards to the validator. +ACP-77 also provides a method for validators to exit a Subnet's validator set without interacting with the Subnet directly. The P-Chain transaction [`DisableValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#disablevalidatortx) removes the validator from the Subnet validator set tracked on the P-Chain. The P-Chain will sign a `SetSubnetValidatorWeightMessage` or a `SubnetValidatorRegistrationMessage`, which may then be provided to the Validator Manager contract via a call to `completeEndValidation`, as described above. Note however that without the uptime proof provided in the initial call to `initializeEndValidation`, the Validator Manager will not credit any staking rewards to the validator. ## Warp Message Format Reference From f68bf8c438835a66d853a6446c7aec45380bf710 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 29 Aug 2024 10:52:21 -0400 Subject: [PATCH 157/545] Update comment --- contracts/staking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/README.md b/contracts/staking/README.md index 2bb4b91ca..980ca025c 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -36,7 +36,7 @@ The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload #### Exit the Validator Set Directly on the P-Chain -ACP-77 also provides a method for validators to exit a Subnet's validator set without interacting with the Subnet directly. The P-Chain transaction [`DisableValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#disablevalidatortx) removes the validator from the Subnet validator set tracked on the P-Chain. The P-Chain will sign a `SetSubnetValidatorWeightMessage` or a `SubnetValidatorRegistrationMessage`, which may then be provided to the Validator Manager contract via a call to `completeEndValidation`, as described above. Note however that without the uptime proof provided in the initial call to `initializeEndValidation`, the Validator Manager will not credit any staking rewards to the validator. +ACP-77 also provides a method to disable a validator without interacting with the Subnet directly. The P-Chain transaction [`DisableValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#disablevalidatortx) disables the validator on the P-Chain. The disabled validator's weight will still count towards the Subnet's total weight. Disabled Subnet Validators can re-activate at any time by increasing their balance with an `IncreaseBalanceTx`. ## Warp Message Format Reference From eaaefb882b8632a971cf897ac8cc7e5e0ee88767 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 29 Aug 2024 10:53:18 -0400 Subject: [PATCH 158/545] update comment --- contracts/staking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/README.md b/contracts/staking/README.md index 980ca025c..d9fe64cf6 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -34,7 +34,7 @@ Validator exit is initiated with a call to `initializeEndValidation` on the Vali The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The P-Chain acknowledges validator exit by signing either a `SetSubnetValidatorWeightMessage` with the `weight=0`, or a `SubnetValidatorRegistrationMessage` with `valid=0`. `completeEndValidation` is then called on the Validator Manager contract, with `setWeightMessageType` set according to the Warp message type being delivered. The validation is removed from the contract's state, and for PoS Validator Managers, staking rewards are disbursed and stake is returned. -#### Exit the Validator Set Directly on the P-Chain +#### Disable a Validator Directly on the P-Chain ACP-77 also provides a method to disable a validator without interacting with the Subnet directly. The P-Chain transaction [`DisableValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#disablevalidatortx) disables the validator on the P-Chain. The disabled validator's weight will still count towards the Subnet's total weight. Disabled Subnet Validators can re-activate at any time by increasing their balance with an `IncreaseBalanceTx`. From 0516a74a0f28f5313d8f4902d5f89a08a734bba7 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 29 Aug 2024 10:54:45 -0400 Subject: [PATCH 159/545] update comment --- contracts/staking/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contracts/staking/README.md b/contracts/staking/README.md index d9fe64cf6..f9007919a 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -36,7 +36,9 @@ The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload #### Disable a Validator Directly on the P-Chain -ACP-77 also provides a method to disable a validator without interacting with the Subnet directly. The P-Chain transaction [`DisableValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#disablevalidatortx) disables the validator on the P-Chain. The disabled validator's weight will still count towards the Subnet's total weight. Disabled Subnet Validators can re-activate at any time by increasing their balance with an `IncreaseBalanceTx`. +ACP-77 also provides a method to disable a validator without interacting with the Subnet directly. The P-Chain transaction [`DisableValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#disablevalidatortx) disables the validator on the P-Chain. The disabled validator's weight will still count towards the Subnet's total weight. + +Disabled Subnet Validators can re-activate at any time by increasing their balance with an `IncreaseBalanceTx`. A disabled validator can only be totally removed from the validator set by a call to `initializeEndValidation`. ## Warp Message Format Reference From ffc30db1c28595e9ae4b06d298cdad3cc05376a1 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 29 Aug 2024 10:55:44 -0400 Subject: [PATCH 160/545] update comment --- contracts/staking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/README.md b/contracts/staking/README.md index f9007919a..febf54482 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -38,7 +38,7 @@ The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload ACP-77 also provides a method to disable a validator without interacting with the Subnet directly. The P-Chain transaction [`DisableValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#disablevalidatortx) disables the validator on the P-Chain. The disabled validator's weight will still count towards the Subnet's total weight. -Disabled Subnet Validators can re-activate at any time by increasing their balance with an `IncreaseBalanceTx`. A disabled validator can only be totally removed from the validator set by a call to `initializeEndValidation`. +Disabled Subnet Validators can re-activate at any time by increasing their balance with an `IncreaseBalanceTx`. Anyone can call `IncreaseBalanceTx` for any validator on the P-Chain. A disabled validator can only be totally removed from the validator set by a call to `initializeEndValidation`. ## Warp Message Format Reference From 305e47500779c971482a391244708f5aa115816c Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 29 Aug 2024 12:43:51 -0500 Subject: [PATCH 161/545] test complete delegation out of order --- .../tests/PoSValidatorManagerTests.t.sol | 150 +++++++++++++++--- 1 file changed, 132 insertions(+), 18 deletions(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 53d1175b5..07a65f5e0 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -179,7 +179,16 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInitializeDelegatorRegistration() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); _setUpInitializeDelegatorRegistration( + validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP @@ -187,7 +196,16 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testResendDelegatorRegistration() public { - bytes32 validationID = _setUpInitializeDelegatorRegistration( + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + _setUpInitializeDelegatorRegistration( + validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP @@ -201,7 +219,16 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteDelegatorRegistration() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); _setUpCompleteDelegatorRegistration( + validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, @@ -210,9 +237,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInitializeEndDelegation() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); _setUpInitializeEndDelegation( + validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_WEIGHT, + 2, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP @@ -220,9 +258,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testResendEndDelegation() public { - bytes32 validationID = _setUpInitializeEndDelegation( + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + _setUpInitializeEndDelegation( + validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_WEIGHT, + 2, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP @@ -234,9 +283,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndDelegation() public { - bytes32 validationID = _setUpInitializeEndDelegation( + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + _setUpInitializeEndDelegation( + validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_WEIGHT, + 2, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP @@ -252,6 +312,65 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.completeEndDelegation(0, DEFAULT_DELEGATOR_ADDRESS); } + function testCompleteEndDelegationOutOfOrder() public { + uint64 weight1 = 2e5; + address delegator1 = address(0x1234123412341234123412341234123412341234); + uint64 weight2 = 3e5; + address delegator2 = address(0x5678567856785678567856785678567856785678); + + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + + _setUpInitializeEndDelegation( + validationID, + delegator1, + weight1, + DEFAULT_WEIGHT + weight2, + 2, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + ); + _setUpInitializeEndDelegation( + validationID, + delegator2, + weight2, + DEFAULT_WEIGHT, + 3, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP+1, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP+1, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP+1 + ); + + // Receive the weight update message for the second delegator first + // This should include the weight updates for both delegators delisting + bytes memory weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( + validationID, 3, DEFAULT_WEIGHT + ); + _mockGetVerifiedWarpMessage(weightUpdateMessage, true); + + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit DelegationEnded(validationID, delegator2, DEFAULT_WEIGHT); + posValidatorManager.completeEndDelegation(0, delegator2); + + // Receive the weight update message for the first delegator. + // The specified weight should still include the second delegator's weight, + // but the validator weight will not be updated since we've already received a higher nonce + weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( + validationID, 2, DEFAULT_WEIGHT + weight2); + _mockGetVerifiedWarpMessage(weightUpdateMessage, true); + + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit DelegationEnded(validationID, delegator1, DEFAULT_WEIGHT); // No weight change + posValidatorManager.completeEndDelegation(0, delegator1); + } + function testValueToWeight() public view { uint64 w1 = posValidatorManager.valueToWeight(1e12); uint64 w2 = posValidatorManager.valueToWeight(1e18); @@ -283,19 +402,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ) internal virtual; function _setUpInitializeDelegatorRegistration( + bytes32 validationID, address delegator, uint64 weight, uint64 registrationTimestamp ) internal returns (bytes32) { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); - bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, 1, DEFAULT_WEIGHT + weight); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); @@ -311,13 +422,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function _setUpCompleteDelegatorRegistration( + bytes32 validationID, address delegator, uint64 weight, uint64 initRegistrationTimestamp, uint64 completeRegistrationTimestamp ) internal returns (bytes32) { - bytes32 validationID = - _setUpInitializeDelegatorRegistration(delegator, weight, initRegistrationTimestamp); + _setUpInitializeDelegatorRegistration(validationID, delegator, weight, initRegistrationTimestamp); bytes memory setValidatorWeightPayload = ValidatorMessages .packSubnetValidatorWeightUpdateMessage(validationID, 1, DEFAULT_WEIGHT + weight); _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); @@ -332,19 +443,22 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function _setUpInitializeEndDelegation( + bytes32 validationID, address delegator, - uint64 weight, + uint64 delegatorWeight, + uint64 newValidatorWeight, + uint64 nonce, uint64 initRegistrationTimestamp, uint64 completeRegistrationTimestamp, uint64 endDelegationTimestamp ) internal returns (bytes32) { - bytes32 validationID = _setUpCompleteDelegatorRegistration( - delegator, weight, initRegistrationTimestamp, completeRegistrationTimestamp + _setUpCompleteDelegatorRegistration( + validationID, delegator, delegatorWeight, initRegistrationTimestamp, completeRegistrationTimestamp ); vm.warp(endDelegationTimestamp); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(posValidatorManager)); From f751b3092a7009e3f42d2967cde5e54dd4fc18e3 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 29 Aug 2024 14:17:04 -0500 Subject: [PATCH 162/545] tests passing --- contracts/staking/PoSValidatorManager.sol | 61 ++++--- contracts/staking/ValidatorManager.sol | 7 + .../interfaces/IPoSValidatorManager.sol | 36 ++-- .../tests/PoSValidatorManagerTests.t.sol | 172 +++++++++++++----- 4 files changed, 192 insertions(+), 84 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 6a9feee43..3a92de8f7 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -169,23 +169,33 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _checkAndUpdateChurnTracker(weight); + // Update the validator weight + validator.weight += weight; + _setValidator(validationID, validator); + // Submit the message to the Warp precompile. + uint64 nonce = _getAndIncrementNonce(validationID); bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage( - validationID, _getAndIncrementNonce(validationID), validator.weight + weight - ); + .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); $._pendingRegisterDelegatorMessages[validationID][delegator] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); // Store the delegator information $._delegatorStakes[validationID][delegator] = Delegator({ weight: weight, - startedAt: uint64(block.timestamp), + startedAt: 0, endedAt: 0, status: DelegatorStatus.PendingAdded }); - emit DelegatorAdded(validationID, messageID, delegator, weight, block.timestamp); + emit DelegatorAdded({ + validationID: validationID, + setWeightMessageID: messageID, + delegator: delegator, + delegatorWeight: weight, + validatorWeight: validator.weight, + nonce: nonce + }); } function resendDelegatorRegistration(bytes32 validationID, address delegator) external { @@ -208,17 +218,18 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Update the validator weight and delegator status Validator memory validator = _getValidator(validationID); require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); - validator.weight = weight; - $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Active; - _setValidator(validationID, validator); - emit DelegatorRegistered( - validationID, - delegator, - $._delegatorStakes[validationID][delegator].weight, - weight, - block.timestamp - ); + $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Active; + $._delegatorStakes[validationID][delegator].startedAt = uint64(block.timestamp); + + emit DelegatorRegistered({ + validationID: validationID, + delegator: delegator, + delegatorWeight: $._delegatorStakes[validationID][delegator].weight, + validatorWeight: weight, + nonce: nonce, + startTime: block.timestamp + }); } function initializeEndDelegation(bytes32 validationID) external { @@ -236,16 +247,24 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _getValidator(validationID); require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); + validator.weight -= delegator.weight; + _setValidator(validationID, validator); // Submit the message to the Warp precompile. + uint64 nonce = _getAndIncrementNonce(validationID); bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage( - validationID, _getAndIncrementNonce(validationID), validator.weight - delegator.weight - ); + .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); $._pendingEndDelegatorMessages[validationID][_msgSender()] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); - emit DelegatorRemovalInitialized(validationID, messageID, _msgSender(), block.timestamp); + emit DelegatorRemovalInitialized({ + validationID: validationID, + setWeightMessageID: messageID, + delegator: _msgSender(), + validatorWeight: validator.weight, + nonce: nonce, + endTime: block.timestamp + }); } function resendEndDelegation(bytes32 validationID, address delegator) external { @@ -268,10 +287,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _getValidator(validationID); require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Completed; - validator.weight = weight; - _setValidator(validationID, validator); - emit DelegationEnded(validationID, delegator, weight); + emit DelegationEnded(validationID, delegator, weight, nonce); } function _checkPendingEndDelegatorMessage( diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 618860c27..150cfc6c6 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -317,6 +317,13 @@ abstract contract ValidatorManager is emit ValidationPeriodEnded(validationID); } + /** + * @notice Returns the validator's weight. This weight is not guaranteed to be known by the P-Chain + */ + function getWeight(bytes32 validationID) external view returns (uint64) { + return _getValidator(validationID).weight; + } + /** * @notice Helper function to check if the stake amount to be added or removed would exceed the maximum stake churn * rate for the past hour. If the churn rate is exceeded, the function will revert. If the churn rate is not exceeded, diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 6497eca42..9128e11a3 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -5,9 +5,7 @@ pragma solidity 0.8.25; -import { - IValidatorManager, ValidatorManagerSettings -} from "./IValidatorManager.sol"; +import {IValidatorManager, ValidatorManagerSettings} from "./IValidatorManager.sol"; import {IRewardCalculator} from "./IRewardCalculator.sol"; enum DelegatorStatus { @@ -45,30 +43,34 @@ interface IPoSValidatorManager is IValidatorManager { * @notice Event emitted when a delegator registration is initiated * @param validationID The ID of the validation period * @param delegator The address of the delegator - * @param weight The weight of the delegator - * @param startTime The time at which the registration was initiated + * @param delegatorWeight The weight of the delegator + * @param validatorWeight The updated validator weight that is sent to the P-Chain + * @param nonce The message nonce used to update the validator weight */ event DelegatorAdded( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, - uint256 weight, - uint256 startTime + uint64 delegatorWeight, + uint64 validatorWeight, + uint64 nonce ); /** * @notice Event emitted when a delegator registration is completed * @param validationID The ID of the validation period * @param delegator The address of the delegator - * @param weight The weight of the delegator - * @param validatorWeight The updated weight of the validator the delegator is delegating to + * @param delegatorWeight The weight of the delegator + * @param validatorWeight The updated weight of the validator, as returned by the P-Chain + * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain * @param startTime The time at which the registration was completed */ event DelegatorRegistered( bytes32 indexed validationID, address indexed delegator, - uint256 weight, - uint256 validatorWeight, + uint64 delegatorWeight, + uint64 validatorWeight, + uint64 nonce, uint256 startTime ); @@ -77,12 +79,16 @@ interface IPoSValidatorManager is IValidatorManager { * @param validationID The ID of the validation period * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain * @param delegator The address of the delegator + * @param validatorWeight The updated validator weight that is sent to the P-Chain + * @param nonce The message nonce used to update the validator weight * @param endTime The time at which the removal was initiated */ event DelegatorRemovalInitialized( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, + uint64 validatorWeight, + uint64 nonce, uint256 endTime ); @@ -90,10 +96,14 @@ interface IPoSValidatorManager is IValidatorManager { * @notice Event emitted when delegator removal is completed * @param validationID The ID of the validation period * @param delegator The address of the delegator - * @param validatorWeight The updated weight of the validator the delegator was delegating to + * @param validatorWeight The updated weight of the validator, as returned by the P-Chain + * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain */ event DelegationEnded( - bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight + bytes32 indexed validationID, + address indexed delegator, + uint64 indexed validatorWeight, + uint64 nonce ); /** diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 07a65f5e0..b6d70ea75 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -30,15 +30,17 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, - uint256 weight, - uint256 startTime + uint64 delegatorWeight, + uint64 validatorWeight, + uint64 nonce ); event DelegatorRegistered( bytes32 indexed validationID, address indexed delegator, - uint256 weight, - uint256 validatorWeight, + uint64 delegatorWeight, + uint64 validatorWeight, + uint64 nonce, uint256 startTime ); @@ -46,11 +48,16 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, + uint64 validatorWeight, + uint64 nonce, uint256 endTime ); event DelegationEnded( - bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight + bytes32 indexed validationID, + address indexed delegator, + uint64 indexed validatorWeight, + uint64 nonce ); function testInitializeEndValidationWithUptimeProof() public { @@ -191,6 +198,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP ); } @@ -208,6 +217,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP ); bytes memory setValidatorWeightPayload = ValidatorMessages @@ -231,6 +242,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP ); @@ -245,14 +258,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeEndDelegation( + _setUpCompleteDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + ); + _setUpInitializeEndDelegation( + validationID, + DEFAULT_DELEGATOR_ADDRESS, DEFAULT_WEIGHT, 2, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP ); } @@ -266,14 +285,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeEndDelegation( + _setUpCompleteDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + ); + _setUpInitializeEndDelegation( + validationID, + DEFAULT_DELEGATOR_ADDRESS, DEFAULT_WEIGHT, 2, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP ); bytes memory setValidatorWeightPayload = @@ -291,14 +316,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeEndDelegation( + _setUpCompleteDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + ); + _setUpInitializeEndDelegation( + validationID, + DEFAULT_DELEGATOR_ADDRESS, DEFAULT_WEIGHT, 2, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP ); @@ -308,11 +339,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_WEIGHT); + emit DelegationEnded(validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_WEIGHT, 2); posValidatorManager.completeEndDelegation(0, DEFAULT_DELEGATOR_ADDRESS); } - function testCompleteEndDelegationOutOfOrder() public { + function testCompleteEndMultipleDelegations() public {} + + // Ensures that the behavior is the same regardless of delisting order + function testCompleteEndMultipleDelegationsOutOfOrder() public { uint64 weight1 = 2e5; address delegator1 = address(0x1234123412341234123412341234123412341234); uint64 weight2 = 3e5; @@ -327,48 +361,66 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeEndDelegation( + // Register two delegators + _setUpCompleteDelegatorRegistration( validationID, delegator1, weight1, - DEFAULT_WEIGHT + weight2, - 2, + DEFAULT_WEIGHT + weight1, + 1, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP ); - _setUpInitializeEndDelegation( + _setUpCompleteDelegatorRegistration( validationID, delegator2, weight2, - DEFAULT_WEIGHT, + DEFAULT_WEIGHT + weight1 + weight2, + 2, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + 1 + ); + + // Delist them in the opposite order, + _setUpInitializeEndDelegation( + validationID, + delegator2, + DEFAULT_WEIGHT + weight1, 3, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP+1, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP+1, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP+1 + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + ); + _setUpInitializeEndDelegation( + validationID, + delegator1, + DEFAULT_WEIGHT, + 4, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1 ); // Receive the weight update message for the second delegator first // This should include the weight updates for both delegators delisting bytes memory weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( - validationID, 3, DEFAULT_WEIGHT + validationID, 4, DEFAULT_WEIGHT ); _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, delegator2, DEFAULT_WEIGHT); + emit DelegationEnded(validationID, delegator2, DEFAULT_WEIGHT, 4); posValidatorManager.completeEndDelegation(0, delegator2); + require(posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, "PoSValidatorManagerTest: invalid weight"); // Receive the weight update message for the first delegator. // The specified weight should still include the second delegator's weight, // but the validator weight will not be updated since we've already received a higher nonce weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( - validationID, 2, DEFAULT_WEIGHT + weight2); - _mockGetVerifiedWarpMessage(weightUpdateMessage, true); + validationID, 3, DEFAULT_WEIGHT + weight2 + ); + _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, delegator1, DEFAULT_WEIGHT); // No weight change + emit DelegationEnded(validationID, delegator1, DEFAULT_WEIGHT + weight2, 3); posValidatorManager.completeEndDelegation(0, delegator1); + require(posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, "PoSValidatorManagerTest: invalid weight"); } function testValueToWeight() public view { @@ -405,17 +457,26 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID, address delegator, uint64 weight, + uint64 newValidatorWeight, + uint64 nonce, uint64 registrationTimestamp ) internal returns (bytes32) { bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, 1, DEFAULT_WEIGHT + weight); + .packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.warp(registrationTimestamp); _beforeSend(weight, delegator); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegatorAdded(validationID, bytes32(0), delegator, weight, registrationTimestamp); + emit DelegatorAdded({ + validationID: validationID, + setWeightMessageID: bytes32(0), + delegator: delegator, + delegatorWeight: weight, + validatorWeight: newValidatorWeight, + nonce: nonce + }); _initializeDelegatorRegistration(validationID, delegator, weight); return validationID; @@ -425,19 +486,29 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID, address delegator, uint64 weight, + uint64 newValidatorWeight, + uint64 nonce, uint64 initRegistrationTimestamp, uint64 completeRegistrationTimestamp ) internal returns (bytes32) { - _setUpInitializeDelegatorRegistration(validationID, delegator, weight, initRegistrationTimestamp); + // TODONOW: decouple this + _setUpInitializeDelegatorRegistration( + validationID, delegator, weight, newValidatorWeight, nonce, initRegistrationTimestamp + ); bytes memory setValidatorWeightPayload = ValidatorMessages - .packSubnetValidatorWeightUpdateMessage(validationID, 1, DEFAULT_WEIGHT + weight); + .packSubnetValidatorWeightUpdateMessage(validationID, nonce, newValidatorWeight); _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); vm.warp(completeRegistrationTimestamp); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegatorRegistered( - validationID, delegator, weight, weight + DEFAULT_WEIGHT, completeRegistrationTimestamp - ); + emit DelegatorRegistered({ + validationID: validationID, + delegator: delegator, + delegatorWeight: weight, + validatorWeight: newValidatorWeight, + nonce: nonce, + startTime: completeRegistrationTimestamp + }); posValidatorManager.completeDelegatorRegistration(0, delegator); return validationID; } @@ -445,26 +516,29 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _setUpInitializeEndDelegation( bytes32 validationID, address delegator, - uint64 delegatorWeight, uint64 newValidatorWeight, uint64 nonce, - uint64 initRegistrationTimestamp, - uint64 completeRegistrationTimestamp, uint64 endDelegationTimestamp ) internal returns (bytes32) { - _setUpCompleteDelegatorRegistration( - validationID, delegator, delegatorWeight, initRegistrationTimestamp, completeRegistrationTimestamp - ); + require(nonce > 0, "PoSValidatorManagerTest: invalid nonce"); + // _setUpCompleteDelegatorRegistration( + // validationID, delegator, delegatorWeight, nonce-1, initRegistrationTimestamp, completeRegistrationTimestamp + // ); vm.warp(endDelegationTimestamp); - bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); + bytes memory setValidatorWeightPayload = ValidatorMessages + .packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegatorRemovalInitialized( - validationID, bytes32(0), delegator, endDelegationTimestamp - ); + emit DelegatorRemovalInitialized({ + validationID: validationID, + setWeightMessageID: bytes32(0), + delegator: delegator, + validatorWeight: newValidatorWeight, + nonce: nonce, + endTime: endDelegationTimestamp + }); vm.prank(delegator); posValidatorManager.initializeEndDelegation(validationID); return validationID; From ea1e56b119c37beb2008c2a3b09b856537f06093 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 29 Aug 2024 15:22:49 -0500 Subject: [PATCH 163/545] clean up events --- contracts/staking/PoSValidatorManager.sol | 8 +++----- .../staking/interfaces/IPoSValidatorManager.sol | 10 ++-------- .../staking/tests/PoSValidatorManagerTests.t.sol | 16 ++++++---------- 3 files changed, 11 insertions(+), 23 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 3a92de8f7..5879c30b7 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -210,7 +210,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); - (bytes32 validationID, uint64 nonce, uint64 weight) = + (bytes32 validationID, uint64 nonce,) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); _checkPendingRegisterDelegatorMessages(validationID, delegator); delete $._pendingRegisterDelegatorMessages[validationID][delegator]; @@ -225,8 +225,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager emit DelegatorRegistered({ validationID: validationID, delegator: delegator, - delegatorWeight: $._delegatorStakes[validationID][delegator].weight, - validatorWeight: weight, nonce: nonce, startTime: block.timestamp }); @@ -278,7 +276,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); - (bytes32 validationID, uint64 nonce, uint64 weight) = + (bytes32 validationID, uint64 nonce,) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); _checkPendingEndDelegatorMessage(validationID, delegator); delete $._pendingEndDelegatorMessages[validationID][delegator]; @@ -288,7 +286,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Completed; - emit DelegationEnded(validationID, delegator, weight, nonce); + emit DelegationEnded(validationID, delegator, nonce); } function _checkPendingEndDelegatorMessage( diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 9128e11a3..23a0282ed 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -60,17 +60,13 @@ interface IPoSValidatorManager is IValidatorManager { * @notice Event emitted when a delegator registration is completed * @param validationID The ID of the validation period * @param delegator The address of the delegator - * @param delegatorWeight The weight of the delegator - * @param validatorWeight The updated weight of the validator, as returned by the P-Chain * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain * @param startTime The time at which the registration was completed */ event DelegatorRegistered( bytes32 indexed validationID, address indexed delegator, - uint64 delegatorWeight, - uint64 validatorWeight, - uint64 nonce, + uint64 indexed nonce, uint256 startTime ); @@ -96,14 +92,12 @@ interface IPoSValidatorManager is IValidatorManager { * @notice Event emitted when delegator removal is completed * @param validationID The ID of the validation period * @param delegator The address of the delegator - * @param validatorWeight The updated weight of the validator, as returned by the P-Chain * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain */ event DelegationEnded( bytes32 indexed validationID, address indexed delegator, - uint64 indexed validatorWeight, - uint64 nonce + uint64 indexed nonce ); /** diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index b6d70ea75..a0a163b96 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -38,9 +38,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event DelegatorRegistered( bytes32 indexed validationID, address indexed delegator, - uint64 delegatorWeight, - uint64 validatorWeight, - uint64 nonce, + uint64 indexed nonce, uint256 startTime ); @@ -56,8 +54,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event DelegationEnded( bytes32 indexed validationID, address indexed delegator, - uint64 indexed validatorWeight, - uint64 nonce + uint64 indexed nonce ); function testInitializeEndValidationWithUptimeProof() public { @@ -339,8 +336,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_WEIGHT, 2); + emit DelegationEnded(validationID, DEFAULT_DELEGATOR_ADDRESS, 2); posValidatorManager.completeEndDelegation(0, DEFAULT_DELEGATOR_ADDRESS); + require(posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, "PoSValidatorManagerTest: invalid weight"); } function testCompleteEndMultipleDelegations() public {} @@ -405,7 +403,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, delegator2, DEFAULT_WEIGHT, 4); + emit DelegationEnded(validationID, delegator2, 4); posValidatorManager.completeEndDelegation(0, delegator2); require(posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, "PoSValidatorManagerTest: invalid weight"); @@ -418,7 +416,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, delegator1, DEFAULT_WEIGHT + weight2, 3); + emit DelegationEnded(validationID, delegator1, 3); posValidatorManager.completeEndDelegation(0, delegator1); require(posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, "PoSValidatorManagerTest: invalid weight"); } @@ -504,8 +502,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { emit DelegatorRegistered({ validationID: validationID, delegator: delegator, - delegatorWeight: weight, - validatorWeight: newValidatorWeight, nonce: nonce, startTime: completeRegistrationTimestamp }); From b6706d7ef70867d8af9151d732dfd1e4126ef05f Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 29 Aug 2024 15:38:36 -0500 Subject: [PATCH 164/545] cleanup helpers --- .../interfaces/IPoSValidatorManager.sol | 4 +- .../tests/PoSValidatorManagerTests.t.sol | 178 +++++++++++------- 2 files changed, 108 insertions(+), 74 deletions(-) diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 23a0282ed..1ddc1dc23 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -95,9 +95,7 @@ interface IPoSValidatorManager is IValidatorManager { * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain */ event DelegationEnded( - bytes32 indexed validationID, - address indexed delegator, - uint64 indexed nonce + bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce ); /** diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index a0a163b96..b218fe67d 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -52,9 +52,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); event DelegationEnded( - bytes32 indexed validationID, - address indexed delegator, - uint64 indexed nonce + bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce ); function testInitializeEndValidationWithUptimeProof() public { @@ -195,9 +193,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1 ); } @@ -214,9 +212,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1 ); bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage( @@ -235,14 +233,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpCompleteDelegatorRegistration( + _setUpInitializeDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1 + ); + _setUpCompleteDelegatorRegistration( + validationID, + DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1 ); } @@ -255,21 +259,27 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpCompleteDelegatorRegistration( + _setUpInitializeDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1 + ); + _setUpCompleteDelegatorRegistration( + validationID, + DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1 ); _setUpInitializeEndDelegation( validationID, DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, DEFAULT_WEIGHT, - 2, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 2 ); } @@ -282,21 +292,27 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpCompleteDelegatorRegistration( + _setUpInitializeDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1 + ); + _setUpCompleteDelegatorRegistration( + validationID, + DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1 ); _setUpInitializeEndDelegation( validationID, DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, DEFAULT_WEIGHT, - 2, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 2 ); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); @@ -313,21 +329,27 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpCompleteDelegatorRegistration( + _setUpInitializeDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1 + ); + _setUpCompleteDelegatorRegistration( + validationID, + DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1 ); _setUpInitializeEndDelegation( validationID, DEFAULT_DELEGATOR_ADDRESS, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, DEFAULT_WEIGHT, - 2, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 2 ); bytes memory weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( @@ -338,7 +360,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegationEnded(validationID, DEFAULT_DELEGATOR_ADDRESS, 2); posValidatorManager.completeEndDelegation(0, DEFAULT_DELEGATOR_ADDRESS); - require(posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, "PoSValidatorManagerTest: invalid weight"); + require( + posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, + "PoSValidatorManagerTest: invalid weight" + ); } function testCompleteEndMultipleDelegations() public {} @@ -360,39 +385,51 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Register two delegators - _setUpCompleteDelegatorRegistration( + _setUpInitializeDelegatorRegistration( validationID, delegator1, weight1, - DEFAULT_WEIGHT + weight1, - 1, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_WEIGHT + weight1, + 1 ); _setUpCompleteDelegatorRegistration( + validationID, + delegator1, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_WEIGHT + weight1, + 1 + ); + _setUpInitializeDelegatorRegistration( validationID, delegator2, weight2, - DEFAULT_WEIGHT + weight1 + weight2, - 2, DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + 1 + DEFAULT_WEIGHT + weight1 + weight2, + 2 + ); + _setUpCompleteDelegatorRegistration( + validationID, + delegator2, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + 1, + DEFAULT_WEIGHT + weight1 + weight2, + 2 ); // Delist them in the opposite order, _setUpInitializeEndDelegation( validationID, delegator2, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, DEFAULT_WEIGHT + weight1, - 3, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 3 ); _setUpInitializeEndDelegation( validationID, delegator1, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, DEFAULT_WEIGHT, - 4, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1 + 4 ); // Receive the weight update message for the second delegator first @@ -405,7 +442,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegationEnded(validationID, delegator2, 4); posValidatorManager.completeEndDelegation(0, delegator2); - require(posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, "PoSValidatorManagerTest: invalid weight"); + require( + posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, + "PoSValidatorManagerTest: invalid weight" + ); // Receive the weight update message for the first delegator. // The specified weight should still include the second delegator's weight, @@ -418,7 +458,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegationEnded(validationID, delegator1, 3); posValidatorManager.completeEndDelegation(0, delegator1); - require(posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, "PoSValidatorManagerTest: invalid weight"); + require( + posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, + "PoSValidatorManagerTest: invalid weight" + ); } function testValueToWeight() public view { @@ -451,16 +494,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 weight ) internal virtual; + // + // Delegation setup utilities + // + function _setUpInitializeDelegatorRegistration( bytes32 validationID, address delegator, uint64 weight, - uint64 newValidatorWeight, - uint64 nonce, - uint64 registrationTimestamp + uint64 registrationTimestamp, + uint64 expectedValidatorWeight, + uint64 expectedNonce ) internal returns (bytes32) { bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); + .packSetSubnetValidatorWeightMessage(validationID, expectedNonce, expectedValidatorWeight); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.warp(registrationTimestamp); @@ -472,8 +519,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { setWeightMessageID: bytes32(0), delegator: delegator, delegatorWeight: weight, - validatorWeight: newValidatorWeight, - nonce: nonce + validatorWeight: expectedValidatorWeight, + nonce: expectedNonce }); _initializeDelegatorRegistration(validationID, delegator, weight); @@ -483,18 +530,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _setUpCompleteDelegatorRegistration( bytes32 validationID, address delegator, - uint64 weight, - uint64 newValidatorWeight, - uint64 nonce, - uint64 initRegistrationTimestamp, - uint64 completeRegistrationTimestamp + uint64 completeRegistrationTimestamp, + uint64 expectedValidatorWeight, + uint64 expectedNonce ) internal returns (bytes32) { - // TODONOW: decouple this - _setUpInitializeDelegatorRegistration( - validationID, delegator, weight, newValidatorWeight, nonce, initRegistrationTimestamp - ); bytes memory setValidatorWeightPayload = ValidatorMessages - .packSubnetValidatorWeightUpdateMessage(validationID, nonce, newValidatorWeight); + .packSubnetValidatorWeightUpdateMessage(validationID, expectedNonce, expectedValidatorWeight); _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); vm.warp(completeRegistrationTimestamp); @@ -502,7 +543,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { emit DelegatorRegistered({ validationID: validationID, delegator: delegator, - nonce: nonce, + nonce: expectedNonce, startTime: completeRegistrationTimestamp }); posValidatorManager.completeDelegatorRegistration(0, delegator); @@ -512,18 +553,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _setUpInitializeEndDelegation( bytes32 validationID, address delegator, - uint64 newValidatorWeight, - uint64 nonce, - uint64 endDelegationTimestamp + uint64 endDelegationTimestamp, + uint64 expectedValidatorWeight, + uint64 expectedNonce ) internal returns (bytes32) { - require(nonce > 0, "PoSValidatorManagerTest: invalid nonce"); - // _setUpCompleteDelegatorRegistration( - // validationID, delegator, delegatorWeight, nonce-1, initRegistrationTimestamp, completeRegistrationTimestamp - // ); - vm.warp(endDelegationTimestamp); bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); + .packSetSubnetValidatorWeightMessage(validationID, expectedNonce, expectedValidatorWeight); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(posValidatorManager)); @@ -531,8 +567,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, setWeightMessageID: bytes32(0), delegator: delegator, - validatorWeight: newValidatorWeight, - nonce: nonce, + validatorWeight: expectedValidatorWeight, + nonce: expectedNonce, endTime: endDelegationTimestamp }); vm.prank(delegator); From 54f3f7b3c9930f3bf98ff22e687caf19990fee53 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 29 Aug 2024 15:50:00 -0500 Subject: [PATCH 165/545] update bindings --- .../ERC20TokenStakingManager.go | 141 ++++++++++++------ .../NativeTokenStakingManager.go | 141 ++++++++++++------ .../PoAValidatorManager.go | 35 ++++- 3 files changed, 223 insertions(+), 94 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 379de0abd..b5655a5f1 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"validatorWeight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161497138038061497183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148248061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c8063872fda6411610093578063b771b3bc11610063578063b771b3bc14610210578063bee0a03f14610236578063d61bed7414610249578063fdf94a1a1461025c575f80fd5b8063872fda64146101c4578063927e7e75146101d75780639e1bc4ef146101ea578063a3a65e48146101fd575f80fd5b80632e2194d8116100ce5780632e2194d81461014d578063620658561461017d5780636a7e3d831461019e57806376f78621146101b1575f80fd5b80630322ed98146100ff5780630915204e146101145780630b77f6931461012757806327f39ca81461013a575b5f80fd5b61011261010d366004613e4d565b61026f565b005b610112610122366004613e90565b610460565b610112610135366004613ec5565b6105a9565b610112610148366004613ee8565b61062b565b61016061015b366004613e4d565b610739565b6040516001600160401b0390911681526020015b60405180910390f35b61019061018b366004613f30565b61074f565b604051908152602001610174565b6101126101ac366004613ec5565b610768565b6101126101bf366004613f5d565b6107ea565b6101906101d236600461402a565b610b08565b6101126101e5366004613e4d565b610b2d565b6101126101f83660046140c6565b610eb8565b61011261020b3660046140e6565b610ec7565b61021e6005600160991b0181565b6040516001600160a01b039091168152602001610174565b610112610244366004613e4d565b611080565b610112610257366004613e90565b61118f565b61011261026a3660046140ff565b6112f5565b5f8181525f805160206147f88339815191526020526040808220815160e0810190925280545f805160206147b883398151915293929190829060ff1660058111156102bc576102bc614129565b60058111156102cd576102cd614129565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916103579061413d565b9050118015610378575060038151600581111561037657610376614129565b145b6103e15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161041a9190600401614175565b6020604051808303815f875af1158015610436573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045a91906141ff565b50505050565b5f805160206147988339815191525f61047884611707565b90505f805f61048a84604001516118e8565b92509250925061049a8387611be1565b5f83815260068601602090815260408083206001600160a01b038a16845290915281206104c691613e03565b5f6104d084611cf2565b9050826001600160401b031681606001516001600160401b031610156105085760405162461bcd60e51b81526004016103d890614216565b5f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c21b1790556001600160401b03821660808201526105558482611ded565b6040516001600160401b03831681526001600160a01b0388169085907fe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513906020015b60405180910390a35050505050505050565b6105b38282611edc565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614798833981519152916005600160991b019163ee5b48eb9161041a91600401614175565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561066f5750825b90505f826001600160401b0316600114801561068a5750303b155b905081158015610698575080155b156106b65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156106e057845460ff60401b1916600160401b1785555b6106ea8787611ff8565b831561073057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61074964e8d4a5100083614280565b92915050565b5f6107496001600160401b03831664e8d4a51000614293565b6107728282611be1565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614798833981519152916005600160991b019163ee5b48eb9161041a91600401614175565b8115610afa575f5f805160206147988339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561084b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261087291908101906142d7565b91509150806108d55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103d8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610918573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093c91906141ff565b8251146109a05760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103d8565b60208201516001600160a01b031615610a165760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103d8565b5f80610a258460400151612012565b91509150818814610a925760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103d8565b5f888152600786016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610b03836121ea565b505050565b5f80610b1386612536565b9050610b21858286866125e3565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f8051602061479883398151915293926060830190600160c01b900460ff166004811115610bcc57610bcc614129565b6004811115610bdd57610bdd614129565b9052509050600281606001516004811115610bfa57610bfa614129565b14610c565760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b60648201526084016103d8565b60036060820181905250426001600160401b03166040828101919091525f848152600484016020529081208291336001600160a01b0316815260208082019290925260409081015f208351815493850151928501516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990961691909216179390931791821683178155606084015190929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836004811115610d2957610d29614129565b02179055509050505f610d3b84611cf2565b9050815f01516001600160401b031681608001516001600160401b031611610db15760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016103d8565b5f610dd585610dbf87612a17565b85516080860151610dd091906143a9565b612a92565b5f86815260068601602090815260408083203384529091529020909150610dfc828261441b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610e299085906004016144da565b6020604051808303815f875af1158015610e45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e6991906141ff565b9050336001600160a01b031681877f2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc242604051610ea891815260200190565b60405180910390a4505050505050565b610ec3823383612caf565b5050565b5f805160206147b88339815191525f610edf83611707565b90505f80610ef08360400151612ffc565b9150915080610f525760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103d8565b5f82815260058501602052604081208054610f6c9061413d565b9050118015610f9e575060015f83815260078601602052604090205460ff166005811115610f9c57610f9c614129565b145b610fba5760405162461bcd60e51b81526004016103d89061450c565b5f8281526005850160205260408120610fd291613e03565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147b88339815191529291906110c89061413d565b90501180156110fa575060015f83815260078301602052604090205460ff1660058111156110f8576110f8614129565b145b6111165760405162461bcd60e51b81526004016103d89061450c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161114f9190600401614175565b6020604051808303815f875af115801561116b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b0391906141ff565b5f805160206147988339815191525f6111a784611707565b90505f805f6111b984604001516118e8565b9250925092506111c98387611edc565b5f83815260058601602090815260408083206001600160a01b038a16845290915281206111f591613e03565b5f6111ff84611cf2565b9050826001600160401b031681606001516001600160401b031610156112375760405162461bcd60e51b81526004016103d890614216565b6001600160401b03821660808201525f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c11b1790556112848482611ded565b5f84815260048701602090815260408083206001600160a01b038b16808552908352928190205481516001600160401b03918216815290861692810192909252429082015285907fa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a390606001610597565b5f5f805160206147b88339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611350573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261137791908101906142d7565b91509150806113d75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103d8565b5f841561145b575f6113ec846040015161319d565b919350909150506001600160401b038116156114555760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016103d8565b506114d1565b5f6114698460400151612ffc565b909250905080156114cf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103d8565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561150257611502614129565b600581111561151357611513614129565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146115a45760405162461bcd60e51b81526004016103d890614553565b5f6003825160058111156115ba576115ba614129565b14806115d857506002825160058111156115d6576115d6614129565b145b156115fb57506020808201515f90815260088701909152604081205560046115ff565b5060055b5f83815260078701602052604090208251815484929190829060ff1916600183600581111561163057611630614129565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051606080820183525f8083526020830181905292820152905f805160206147b88339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561177c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117a391908101906142d7565b915091508061180a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103d8565b825482511461186d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103d8565b60208201516001600160a01b0316156118e05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103d8565b509392505050565b5f805f835160361461194e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103d8565b5f805b600281101561199d5761196581600161459f565b611970906008614293565b61ffff16868281518110611986576119866145b2565b016020015160f81c901b9190911790600101611951565b5061ffff8116156119fc5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103d8565b5f805b6004811015611a5757611a1381600361459f565b611a1e906008614293565b63ffffffff1687611a308360026145c6565b81518110611a4057611a406145b2565b016020015160f81c901b91909117906001016119ff565b5063ffffffff8116600314611abe5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103d8565b5f805b6020811015611b1357611ad581601f61459f565b611ae0906008614293565b88611aec8360066145c6565b81518110611afc57611afc6145b2565b016020015160f81c901b9190911790600101611ac1565b505f805b6008811015611b7257611b2b81600761459f565b611b36906008614293565b6001600160401b031689611b4b8360266145c6565b81518110611b5b57611b5b6145b2565b016020015160f81c901b9190911790600101611b17565b505f805b6008811015611bd157611b8a81600761459f565b611b95906008614293565b6001600160401b03168a611baa83602e6145c6565b81518110611bba57611bba6145b2565b016020015160f81c901b9190911790600101611b76565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f80516020614798833981519152929190611c3d9061413d565b9050118015611c8b575060035f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611c8957611c89614129565b145b610b035760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016103d8565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206147f883398151915290528390208351918201909352825491925f805160206147b883398151915292829060ff166005811115611d7257611d72614129565b6005811115611d8357611d83614129565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f805160206147f883398151915260205260409020815181545f805160206147b88339815191529284929091829060ff19166001836005811115611e3757611e37614129565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f80516020614798833981519152929190611f389061413d565b9050118015611f86575060015f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611f8457611f84614129565b145b610b035760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016103d8565b6120006133c8565b61200982613413565b610ec381613459565b5f808251602e146120355760405162461bcd60e51b81526004016103d8906145d9565b5f805b60028110156120845761204c81600161459f565b612057906008614293565b61ffff1685828151811061206d5761206d6145b2565b016020015160f81c901b9190911790600101612038565b5061ffff8116156120a75760405162461bcd60e51b81526004016103d890614622565b5f805b6004811015612102576120be81600361459f565b6120c9906008614293565b63ffffffff16866120db8360026145c6565b815181106120eb576120eb6145b2565b016020015160f81c901b91909117906001016120aa565b5063ffffffff81166004146121295760405162461bcd60e51b81526004016103d890614665565b5f805b602081101561217e5761214081601f61459f565b61214b906008614293565b876121578360066145c6565b81518110612167576121676145b2565b016020015160f81c901b919091179060010161212c565b505f805b60088110156121dd5761219681600761459f565b6121a1906008614293565b6001600160401b0316886121b68360266145c6565b815181106121c6576121c66145b2565b016020015160f81c901b9190911790600101612182565b5090969095509350505050565b5f8181525f805160206147f88339815191526020526040808220815160e0810190925280545f805160206147b883398151915293929190829060ff16600581111561223757612237614129565b600581111561224857612248614129565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156122c2576122c2614129565b1461231e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103d8565b60408101516001600160a01b0316336001600160a01b0316146123535760405162461bcd60e51b81526004016103d890614553565b612360816080015161350d565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123a4576123a4614129565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124588461245281612a17565b5f612a92565b5f8581526006850160205260409020909150612474828261441b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124a19085906004016144da565b6020604051808303815f875af11580156124bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124e191906141ff565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206147988339815191528161254f846136ae565b90505f61255b82610739565b83549091506001600160401b0382161080159061258557508260010154816001600160401b031611155b610b255760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103d8565b5f6125ec6136e4565b5f805160206147b8833981519152426001600160401b03851611801561262657506001600160401b038416612624426202a3006145c6565b115b6126885760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103d8565b856126df5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016103d8565b5f8681526008820160205260409020541561274d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103d8565b82516030146127b45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103d8565b6127bd8561350d565b5f806128046040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061371b565b5f82815260058601602052604090209193509150612822828261441b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061284f9085906004016144da565b6020604051808303815f875af115801561286b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061288f91906141ff565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561290857612908614129565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556129b183612a17565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610b2560015f805160206147d883398151915255565b5f8181525f805160206147f88339815191526020526040812060020180545f805160206147b883398151915291600160a01b9091046001600160401b03169081906014612a63836146ac565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612b0b57612acb81600161459f565b612ad6906008614293565b5081515f90839083908110612aed57612aed6145b2565b60200101906001600160f81b03191690815f1a905350600101612ab7565b505f5b6004811015612b6e57612b2281600361459f565b612b2d906008614293565b6001901c60f81b82612b408360026145c6565b81518110612b5057612b506145b2565b60200101906001600160f81b03191690815f1a905350600101612b0e565b505f5b6020811015612bd057612b8581601f61459f565b612b90906008614293565b86901c60f81b82612ba28360066145c6565b81518110612bb257612bb26145b2565b60200101906001600160f81b03191690815f1a905350600101612b71565b505f5b6008811015612c3b57612be781600761459f565b612bf2906008614293565b6001600160401b038616901c60f81b82612c0d8360266145c6565b81518110612c1d57612c1d6145b2565b60200101906001600160f81b03191690815f1a905350600101612bd3565b505f5b6008811015612ca657612c5281600761459f565b612c5d906008614293565b6001600160401b038516901c60f81b82612c7883602e6145c6565b81518110612c8857612c886145b2565b60200101906001600160f81b03191690815f1a905350600101612c3e565b50949350505050565b612cb76136e4565b5f612cc461015b836136ae565b90505f805160206147988339815191525f612cde86611cf2565b9050600281516005811115612cf557612cf5614129565b14612d515760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103d8565b5f86815260048301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612de25760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016103d8565b612deb8361350d565b5f612e0987612df989612a17565b868560800151610dd091906146d1565b5f88815260058501602090815260408083206001600160a01b038b1684529091529020909150612e39828261441b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e669085906004016144da565b6020604051808303815f875af1158015612e82573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ea691906141ff565b604080516080810182526001600160401b038089168252421660208201525f9181019190915290915060608101600190525f8981526004808701602090815260408084206001600160a01b038d1685528252928390208451815492860151948601516001600160401b03908116600160801b0267ffffffffffffffff60801b19968216600160401b026001600160801b031990951691909216179290921793841682178155606085015190939092849260ff60c01b191668ffffffffffffffffff60801b199092169190911790600160c01b908490811115612f8a57612f8a614129565b021790555050604080516001600160401b03881681524260208201526001600160a01b038a16925083918b917ff8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16910160405180910390a45050505050610b0360015f805160206147d883398151915255565b5f80825160271461301f5760405162461bcd60e51b81526004016103d8906145d9565b5f805b600281101561306e5761303681600161459f565b613041906008614293565b61ffff16858281518110613057576130576145b2565b016020015160f81c901b9190911790600101613022565b5061ffff8116156130915760405162461bcd60e51b81526004016103d890614622565b5f805b60048110156130ec576130a881600361459f565b6130b3906008614293565b63ffffffff16866130c58360026145c6565b815181106130d5576130d56145b2565b016020015160f81c901b9190911790600101613094565b5063ffffffff81166002146131135760405162461bcd60e51b81526004016103d890614665565b5f805b60208110156131685761312a81601f61459f565b613135906008614293565b876131418360066145c6565b81518110613151576131516145b2565b016020015160f81c901b9190911790600101613116565b505f8660268151811061317d5761317d6145b2565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146131c15760405162461bcd60e51b81526004016103d8906145d9565b5f805b6002811015613210576131d881600161459f565b6131e3906008614293565b61ffff168682815181106131f9576131f96145b2565b016020015160f81c901b91909117906001016131c4565b5061ffff8116156132335760405162461bcd60e51b81526004016103d890614622565b5f805b600481101561328e5761324a81600361459f565b613255906008614293565b63ffffffff16876132678360026145c6565b81518110613277576132776145b2565b016020015160f81c901b9190911790600101613236565b5063ffffffff81166001146132b55760405162461bcd60e51b81526004016103d890614665565b5f805b602081101561330a576132cc81601f61459f565b6132d7906008614293565b886132e38360066145c6565b815181106132f3576132f36145b2565b016020015160f81c901b91909117906001016132b8565b505f805b60088110156133695761332281600761459f565b61332d906008614293565b6001600160401b0316896133428360266145c6565b81518110613352576133526145b2565b016020015160f81c901b919091179060010161330e565b505f805b6008811015611bd15761338181600761459f565b61338c906008614293565b6001600160401b03168a6133a183602e6145c6565b815181106133b1576133b16145b2565b016020015160f81c901b919091179060010161336d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661341157604051631afcd79f60e31b815260040160405180910390fd5b565b61341b6133c8565b61342481613ad3565b6134566060820135608083013561344160c0850160a08601613f30565b61345160e0860160c087016146f1565b613af4565b50565b6134616133c8565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166134ed5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103d8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147b88339815191529060ff165f0361354b575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613593908361459f565b106135af576001600160401b03841660408301528082526135ce565b83826040018181516135c191906146d1565b6001600160401b03169052505b5f8260200151836040015160646135e5919061470c565b6135ef9190614737565b600285015490915060ff908116908216111561366a5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103d8565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610749827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b4f565b5f805160206147d883398151915280546001190161371557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146137855760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103d8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137fc576137bc81600161459f565b6137c7906008614293565b5081515f908390839081106137de576137de6145b2565b60200101906001600160f81b03191690815f1a9053506001016137a8565b505f5b600481101561385a5761381381600361459f565b61381e906008614293565b505f8261382c8360026145c6565b8151811061383c5761383c6145b2565b60200101906001600160f81b03191690815f1a9053506001016137ff565b505f5b60208110156138b75784518160208110613879576138796145b2565b1a60f81b826138898360066145c6565b81518110613899576138996145b2565b60200101906001600160f81b03191690815f1a90535060010161385d565b505f5b602081101561391757846020015181602081106138d9576138d96145b2565b1a60f81b826138e98360266145c6565b815181106138f9576138f96145b2565b60200101906001600160f81b03191690815f1a9053506001016138ba565b505f5b600881101561398b5761392e81600761459f565b613939906008614293565b60ff1685604001516001600160401b0316901c60f81b8282604661395d91906145c6565b8151811061396d5761396d6145b2565b60200101906001600160f81b03191690815f1a90535060010161391a565b505f5b60308110156139f657846080015181815181106139ad576139ad6145b2565b01602001516001600160f81b031916826139c883604e6145c6565b815181106139d8576139d86145b2565b60200101906001600160f81b03191690815f1a90535060010161398e565b505f5b6008811015613a6857613a0d81600761459f565b613a18906008614293565b60608601516001600160401b0390811691161c60f81b82613a3a83607e6145c6565b81518110613a4a57613a4a6145b2565b60200101906001600160f81b03191690815f1a9053506001016139f9565b50600281604051613a79919061475c565b602060405180830381855afa158015613a94573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613ab791906141ff565b94909350915050565b60015f805160206147d883398151915255565b613adb6133c8565b613ae3613cb1565b613aeb613cc1565b61345681613cc9565b613afc6133c8565b5f5f80516020614798833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613b95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bb991906141ff565b9050613bd06001600160a01b038516333086613d35565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c3891906141ff565b9050818111613c9e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103d8565b613ca8828261459f565b95945050505050565b613cb96133c8565b613411613d8f565b6134116133c8565b613cd16133c8565b80355f805160206147b883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613d1b6060830160408401614777565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261045a908590613d97565b613ac06133c8565b5f8060205f8451602086015f885af180613db6576040513d5f823e3d81fd5b50505f513d91508115613dcd578060011415613dda565b6001600160a01b0384163b155b1561045a57604051635274afe760e01b81526001600160a01b03851660048201526024016103d8565b508054613e0f9061413d565b5f825580601f10613e1e575050565b601f0160209004905f5260205f209081019061345691905b80821115613e49575f8155600101613e36565b5090565b5f60208284031215613e5d575f80fd5b5035919050565b803563ffffffff81168114613e77575f80fd5b919050565b6001600160a01b0381168114613456575f80fd5b5f8060408385031215613ea1575f80fd5b613eaa83613e64565b91506020830135613eba81613e7c565b809150509250929050565b5f8060408385031215613ed6575f80fd5b823591506020830135613eba81613e7c565b5f80828403610100811215613efb575f80fd5b60e0811215613f08575f80fd5b5082915060e0830135613eba81613e7c565b80356001600160401b0381168114613e77575f80fd5b5f60208284031215613f40575f80fd5b613f4982613f1a565b9392505050565b8015158114613456575f80fd5b5f805f60608486031215613f6f575f80fd5b833592506020840135613f8181613f50565b9150613f8f60408501613e64565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613fce57613fce613f98565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613ffc57613ffc613f98565b604052919050565b5f6001600160401b0382111561401c5761401c613f98565b50601f01601f191660200190565b5f805f806080858703121561403d575f80fd5b843593506020850135925061405460408601613f1a565b915060608501356001600160401b0381111561406e575f80fd5b8501601f8101871361407e575f80fd5b803561409161408c82614004565b613fd4565b8181528860208385010111156140a5575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156140d7575f80fd5b50508035926020909101359150565b5f602082840312156140f6575f80fd5b613f4982613e64565b5f8060408385031215614110575f80fd5b61411983613e64565b91506020830135613eba81613f50565b634e487b7160e01b5f52602160045260245ffd5b600181811c9082168061415157607f821691505b60208210810361416f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546141878161413d565b806020870152604060018084165f81146141a857600181146141c4576141f1565b60ff19851660408a0152604084151560051b8a010195506141f1565b895f5260205f205f5b858110156141e85781548b82018601529083019088016141cd565b8a016040019650505b509398975050505050505050565b5f6020828403121561420f575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261428e5761428e614258565b500490565b80820281158282048414176107495761074961426c565b5f5b838110156142c45781810151838201526020016142ac565b50505f910152565b8051613e7781613f50565b5f80604083850312156142e8575f80fd5b82516001600160401b03808211156142fe575f80fd5b9084019060608287031215614311575f80fd5b614319613fac565b8251815260208084015161432c81613e7c565b82820152604084015183811115614341575f80fd5b80850194505087601f850112614355575f80fd5b8351925061436561408c84614004565b8381528882858701011115614378575f80fd5b614387848383018488016142aa565b8060408401525081955061439c8188016142cc565b9450505050509250929050565b6001600160401b038281168282160390808211156143c9576143c961426c565b5092915050565b601f821115610b0357805f5260205f20601f840160051c810160208510156143f55750805b601f840160051c820191505b81811015614414575f8155600101614401565b5050505050565b81516001600160401b0381111561443457614434613f98565b61444881614442845461413d565b846143d0565b602080601f83116001811461447b575f84156144645750858301515b5f19600386901b1c1916600185901b1785556144d2565b5f85815260208120601f198616915b828110156144a95788860151825594840194600190910190840161448a565b50858210156144c657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526144f88160408501602087016142aa565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156107495761074961426c565b634e487b7160e01b5f52603260045260245ffd5b808201808211156107495761074961426c565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b038083168181036146c7576146c761426c565b6001019392505050565b6001600160401b038181168382160190808211156143c9576143c961426c565b5f60208284031215614701575f80fd5b8135613f4981613e7c565b6001600160401b0381811683821602808216919082811461472f5761472f61426c565b505092915050565b5f6001600160401b038084168061475057614750614258565b92169190910492915050565b5f825161476d8184602087016142aa565b9190910192915050565b5f60208284031215614787575f80fd5b813560ff81168114613f49575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516149bb3803806149bb83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61486e8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c806376f786211161009e578063a3a65e481161006e578063a3a65e481461021b578063b771b3bc1461022e578063bee0a03f14610254578063d61bed7414610267578063fdf94a1a1461027a575f80fd5b806376f78621146101cf578063872fda64146101e2578063927e7e75146101f55780639e1bc4ef14610208575f80fd5b80632e2194d8116100d95780632e2194d814610158578063620658561461018857806366435abf146101a95780636a7e3d83146101bc575f80fd5b80630322ed981461010a5780630915204e1461011f5780630b77f6931461013257806327f39ca814610145575b5f80fd5b61011d610118366004613e97565b61028d565b005b61011d61012d366004613eda565b61047e565b61011d610140366004613f0f565b610594565b61011d610153366004613f32565b610616565b61016b610166366004613e97565b610724565b6040516001600160401b0390911681526020015b60405180910390f35b61019b610196366004613f7a565b61073a565b60405190815260200161017f565b61016b6101b7366004613e97565b610753565b61011d6101ca366004613f0f565b610767565b61011d6101dd366004613fa7565b6107e9565b61019b6101f0366004614074565b610b07565b61011d610203366004613e97565b610b2c565b61011d610216366004614110565b610eec565b61011d610229366004614130565b610efb565b61023c6005600160991b0181565b6040516001600160a01b03909116815260200161017f565b61011d610262366004613e97565b6110b4565b61011d610275366004613eda565b6111c3565b61011d610288366004614149565b611308565b5f8181525f805160206148428339815191526020526040808220815160e0810190925280545f8051602061480283398151915293929190829060ff1660058111156102da576102da614173565b60058111156102eb576102eb614173565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f868152600686019091529081208054929350909161037590614187565b9050118015610396575060038151600581111561039457610394614173565b145b6103ff5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161043891906004016141bf565b6020604051808303815f875af1158015610454573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104789190614249565b50505050565b5f805160206147e28339815191525f6104968461171a565b90505f806104a783604001516118fb565b50915091506104b68286611bf4565b5f82815260068501602090815260408083206001600160a01b038916845290915281206104e291613e4d565b5f6104ec83611d05565b9050816001600160401b031681606001516001600160401b031610156105245760405162461bcd60e51b81526004016103f690614260565b5f83815260048601602090815260408083206001600160a01b038a168085529252808320805460ff60c01b1916600160c21b179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b61059e8282611e00565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206147e2833981519152916005600160991b019163ee5b48eb91610438916004016141bf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561065a5750825b90505f826001600160401b031660011480156106755750303b155b905081158015610683575080155b156106a15760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156106cb57845460ff60401b1916600160401b1785555b6106d58787611f1c565b831561071b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61073464e8d4a51000836142ca565b92915050565b5f6107346001600160401b03831664e8d4a510006142dd565b5f61075d82611d05565b6080015192915050565b6107718282611bf4565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206147e2833981519152916005600160991b019163ee5b48eb91610438916004016141bf565b8115610af9575f5f805160206147e28339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561084a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108719190810190614321565b91509150806108d45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103f6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610917573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093b9190614249565b82511461099f5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103f6565b60208201516001600160a01b031615610a155760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103f6565b5f80610a248460400151611f36565b91509150818814610a915760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103f6565b5f888152600786016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610b028361210e565b505050565b5f80610b128661245a565b9050610b2085828686612507565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f805160206147e283398151915293926060830190600160c01b900460ff166004811115610bcb57610bcb614173565b6004811115610bdc57610bdc614173565b9052509050600281606001516004811115610bf957610bf9614173565b14610c555760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b60648201526084016103f6565b60036060820181905250426001600160401b03166040828101919091525f848152600484016020529081208291336001600160a01b0316815260208082019290925260409081015f208351815493850151928501516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990961691909216179390931791821683178155606084015190929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836004811115610d2857610d28614173565b02179055509050505f610d3a84611d05565b9050815f01516001600160401b031681608001516001600160401b031611610db05760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016103f6565b8151608082018051610dc39083906143f3565b6001600160401b0316905250610dd9848261293b565b5f610de385612a2a565b90505f610df586838560800151612aa5565b5f87815260068701602090815260408083203384529091529020909150610e1c8282614465565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610e49908590600401614524565b6020604051808303815f875af1158015610e65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e899190614249565b6080850151604080516001600160401b039283168152918616602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b610ef7823383612cc2565b5050565b5f805160206148028339815191525f610f138361171a565b90505f80610f248360400151613046565b9150915080610f865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f6565b5f82815260058501602052604081208054610fa090614187565b9050118015610fd2575060015f83815260078601602052604090205460ff166005811115610fd057610fd0614173565b145b610fee5760405162461bcd60e51b81526004016103f690614556565b5f828152600585016020526040812061100691613e4d565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206148028339815191529291906110fc90614187565b905011801561112e575060015f83815260078301602052604090205460ff16600581111561112c5761112c614173565b145b61114a5760405162461bcd60e51b81526004016103f690614556565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161118391906004016141bf565b6020604051808303815f875af115801561119f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b029190614249565b5f805160206147e28339815191525f6111db8461171a565b90505f806111ec83604001516118fb565b50915091506111fb8286611e00565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061122791613e4d565b5f61123183611d05565b9050816001600160401b031681606001516001600160401b031610156112695760405162461bcd60e51b81526004016103f690614260565b5f83815260048601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160401b0278ff0000000000000000ffffffffffffffff00000000000000001990971696909617600160c11b179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101610edb565b5f5f805160206148028339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611363573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261138a9190810190614321565b91509150806113ea5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103f6565b5f841561146e575f6113ff84604001516131e7565b919350909150506001600160401b038116156114685760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016103f6565b506114e4565b5f61147c8460400151613046565b909250905080156114e25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f6565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561151557611515614173565b600581111561152657611526614173565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146115b75760405162461bcd60e51b81526004016103f69061459d565b5f6003825160058111156115cd576115cd614173565b14806115eb57506002825160058111156115e9576115e9614173565b145b1561160e57506020808201515f9081526008870190915260408120556004611612565b5060055b5f83815260078701602052604090208251815484929190829060ff1916600183600581111561164357611643614173565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b60408051606080820183525f8083526020830181905292820152905f805160206148028339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561178f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117b69190810190614321565b915091508061181d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f6565b82548251146118805760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103f6565b60208201516001600160a01b0316156118f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103f6565b509392505050565b5f805f83516036146119615760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103f6565b5f805b60028110156119b0576119788160016145e9565b6119839060086142dd565b61ffff16868281518110611999576119996145fc565b016020015160f81c901b9190911790600101611964565b5061ffff811615611a0f5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103f6565b5f805b6004811015611a6a57611a268160036145e9565b611a319060086142dd565b63ffffffff1687611a43836002614610565b81518110611a5357611a536145fc565b016020015160f81c901b9190911790600101611a12565b5063ffffffff8116600314611ad15760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103f6565b5f805b6020811015611b2657611ae881601f6145e9565b611af39060086142dd565b88611aff836006614610565b81518110611b0f57611b0f6145fc565b016020015160f81c901b9190911790600101611ad4565b505f805b6008811015611b8557611b3e8160076145e9565b611b499060086142dd565b6001600160401b031689611b5e836026614610565b81518110611b6e57611b6e6145fc565b016020015160f81c901b9190911790600101611b2a565b505f805b6008811015611be457611b9d8160076145e9565b611ba89060086142dd565b6001600160401b03168a611bbd83602e614610565b81518110611bcd57611bcd6145fc565b016020015160f81c901b9190911790600101611b89565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f805160206147e2833981519152929190611c5090614187565b9050118015611c9e575060035f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611c9c57611c9c614173565b145b610b025760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016103f6565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061484283398151915290528390208351918201909352825491925f8051602061480283398151915292829060ff166005811115611d8557611d85614173565b6005811115611d9657611d96614173565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206147e2833981519152929190611e5c90614187565b9050118015611eaa575060015f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611ea857611ea8614173565b145b610b025760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016103f6565b611f24613412565b611f2d8261345d565b610ef7816134a3565b5f808251602e14611f595760405162461bcd60e51b81526004016103f690614623565b5f805b6002811015611fa857611f708160016145e9565b611f7b9060086142dd565b61ffff16858281518110611f9157611f916145fc565b016020015160f81c901b9190911790600101611f5c565b5061ffff811615611fcb5760405162461bcd60e51b81526004016103f69061466c565b5f805b600481101561202657611fe28160036145e9565b611fed9060086142dd565b63ffffffff1686611fff836002614610565b8151811061200f5761200f6145fc565b016020015160f81c901b9190911790600101611fce565b5063ffffffff811660041461204d5760405162461bcd60e51b81526004016103f6906146af565b5f805b60208110156120a25761206481601f6145e9565b61206f9060086142dd565b8761207b836006614610565b8151811061208b5761208b6145fc565b016020015160f81c901b9190911790600101612050565b505f805b6008811015612101576120ba8160076145e9565b6120c59060086142dd565b6001600160401b0316886120da836026614610565b815181106120ea576120ea6145fc565b016020015160f81c901b91909117906001016120a6565b5090969095509350505050565b5f8181525f805160206148428339815191526020526040808220815160e0810190925280545f8051602061480283398151915293929190829060ff16600581111561215b5761215b614173565b600581111561216c5761216c614173565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156121e6576121e6614173565b146122425760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f6565b60408101516001600160a01b0316336001600160a01b0316146122775760405162461bcd60e51b81526004016103f69061459d565b6122848160800151613557565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156122c8576122c8614173565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61237c8461237681612a2a565b5f612aa5565b5f85815260068501602052604090209091506123988282614465565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906123c5908590600401614524565b6020604051808303815f875af11580156123e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124059190614249565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206147e283398151915281612473846136f8565b90505f61247f82610724565b83549091506001600160401b038216108015906124a957508260010154816001600160401b031611155b610b245760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103f6565b5f61251061372e565b5f80516020614802833981519152426001600160401b03851611801561254a57506001600160401b038416612548426202a300614610565b115b6125ac5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103f6565b856126035760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f6565b5f868152600882016020526040902054156126715760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f6565b82516030146126d85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f6565b6126e185613557565b5f806127286040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613765565b5f828152600586016020526040902091935091506127468282614465565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612773908590600401614524565b6020604051808303815f875af115801561278f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b39190614249565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561282c5761282c614173565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556128d583612a2a565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610b2460015f8051602061482283398151915255565b5f8281525f8051602061484283398151915260205260409020815181545f805160206148028339815191529284929091829060ff1916600183600581111561298557612985614173565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f8181525f805160206148428339815191526020526040812060020180545f8051602061480283398151915291600160a01b9091046001600160401b03169081906014612a76836146f6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612b1e57612ade8160016145e9565b612ae99060086142dd565b5081515f90839083908110612b0057612b006145fc565b60200101906001600160f81b03191690815f1a905350600101612aca565b505f5b6004811015612b8157612b358160036145e9565b612b409060086142dd565b6001901c60f81b82612b53836002614610565b81518110612b6357612b636145fc565b60200101906001600160f81b03191690815f1a905350600101612b21565b505f5b6020811015612be357612b9881601f6145e9565b612ba39060086142dd565b86901c60f81b82612bb5836006614610565b81518110612bc557612bc56145fc565b60200101906001600160f81b03191690815f1a905350600101612b84565b505f5b6008811015612c4e57612bfa8160076145e9565b612c059060086142dd565b6001600160401b038616901c60f81b82612c20836026614610565b81518110612c3057612c306145fc565b60200101906001600160f81b03191690815f1a905350600101612be6565b505f5b6008811015612cb957612c658160076145e9565b612c709060086142dd565b6001600160401b038516901c60f81b82612c8b83602e614610565b81518110612c9b57612c9b6145fc565b60200101906001600160f81b03191690815f1a905350600101612c51565b50949350505050565b612cca61372e565b5f612cd7610166836136f8565b90505f805160206147e28339815191525f612cf186611d05565b9050600281516005811115612d0857612d08614173565b14612d645760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f6565b5f86815260048301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612df55760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016103f6565b612dfe83613557565b8281608001818151612e10919061471b565b6001600160401b0316905250612e26868261293b565b5f612e3087612a2a565b90505f612e4288838560800151612aa5565b5f89815260058601602090815260408083206001600160a01b038c1684529091529020909150612e728282614465565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e9f908590600401614524565b6020604051808303815f875af1158015612ebb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612edf9190614249565b604080516080810182526001600160401b03891681525f602082018190529181019190915290915060608101600190525f8a81526004808801602090815260408084206001600160a01b038e1685528252928390208451815492860151948601516001600160401b03908116600160801b0267ffffffffffffffff60801b19968216600160401b026001600160801b031990951691909216179290921793841682178155606085015190939092849260ff60c01b191668ffffffffffffffffff60801b199092169190911790600160c01b908490811115612fc257612fc2614173565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a4505050505050610b0260015f8051602061482283398151915255565b5f8082516027146130695760405162461bcd60e51b81526004016103f690614623565b5f805b60028110156130b8576130808160016145e9565b61308b9060086142dd565b61ffff168582815181106130a1576130a16145fc565b016020015160f81c901b919091179060010161306c565b5061ffff8116156130db5760405162461bcd60e51b81526004016103f69061466c565b5f805b6004811015613136576130f28160036145e9565b6130fd9060086142dd565b63ffffffff168661310f836002614610565b8151811061311f5761311f6145fc565b016020015160f81c901b91909117906001016130de565b5063ffffffff811660021461315d5760405162461bcd60e51b81526004016103f6906146af565b5f805b60208110156131b25761317481601f6145e9565b61317f9060086142dd565b8761318b836006614610565b8151811061319b5761319b6145fc565b016020015160f81c901b9190911790600101613160565b505f866026815181106131c7576131c76145fc565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461320b5760405162461bcd60e51b81526004016103f690614623565b5f805b600281101561325a576132228160016145e9565b61322d9060086142dd565b61ffff16868281518110613243576132436145fc565b016020015160f81c901b919091179060010161320e565b5061ffff81161561327d5760405162461bcd60e51b81526004016103f69061466c565b5f805b60048110156132d8576132948160036145e9565b61329f9060086142dd565b63ffffffff16876132b1836002614610565b815181106132c1576132c16145fc565b016020015160f81c901b9190911790600101613280565b5063ffffffff81166001146132ff5760405162461bcd60e51b81526004016103f6906146af565b5f805b60208110156133545761331681601f6145e9565b6133219060086142dd565b8861332d836006614610565b8151811061333d5761333d6145fc565b016020015160f81c901b9190911790600101613302565b505f805b60088110156133b35761336c8160076145e9565b6133779060086142dd565b6001600160401b03168961338c836026614610565b8151811061339c5761339c6145fc565b016020015160f81c901b9190911790600101613358565b505f805b6008811015611be4576133cb8160076145e9565b6133d69060086142dd565b6001600160401b03168a6133eb83602e614610565b815181106133fb576133fb6145fc565b016020015160f81c901b91909117906001016133b7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661345b57604051631afcd79f60e31b815260040160405180910390fd5b565b613465613412565b61346e81613b1d565b6134a06060820135608083013561348b60c0850160a08601613f7a565b61349b60e0860160c0870161473b565b613b3e565b50565b6134ab613412565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166135375760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103f6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206148028339815191529060ff165f03613595575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135dd90836145e9565b106135f9576001600160401b0384166040830152808252613618565b838260400181815161360b919061471b565b6001600160401b03169052505b5f82602001518360400151606461362f9190614756565b6136399190614781565b600285015490915060ff90811690821611156136b45760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103f6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610734827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b99565b5f8051602061482283398151915280546001190161375f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146137cf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613846576138068160016145e9565b6138119060086142dd565b5081515f90839083908110613828576138286145fc565b60200101906001600160f81b03191690815f1a9053506001016137f2565b505f5b60048110156138a45761385d8160036145e9565b6138689060086142dd565b505f82613876836002614610565b81518110613886576138866145fc565b60200101906001600160f81b03191690815f1a905350600101613849565b505f5b602081101561390157845181602081106138c3576138c36145fc565b1a60f81b826138d3836006614610565b815181106138e3576138e36145fc565b60200101906001600160f81b03191690815f1a9053506001016138a7565b505f5b60208110156139615784602001518160208110613923576139236145fc565b1a60f81b82613933836026614610565b81518110613943576139436145fc565b60200101906001600160f81b03191690815f1a905350600101613904565b505f5b60088110156139d5576139788160076145e9565b6139839060086142dd565b60ff1685604001516001600160401b0316901c60f81b828260466139a79190614610565b815181106139b7576139b76145fc565b60200101906001600160f81b03191690815f1a905350600101613964565b505f5b6030811015613a4057846080015181815181106139f7576139f76145fc565b01602001516001600160f81b03191682613a1283604e614610565b81518110613a2257613a226145fc565b60200101906001600160f81b03191690815f1a9053506001016139d8565b505f5b6008811015613ab257613a578160076145e9565b613a629060086142dd565b60608601516001600160401b0390811691161c60f81b82613a8483607e614610565b81518110613a9457613a946145fc565b60200101906001600160f81b03191690815f1a905350600101613a43565b50600281604051613ac391906147a6565b602060405180830381855afa158015613ade573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613b019190614249565b94909350915050565b60015f8051602061482283398151915255565b613b25613412565b613b2d613cfb565b613b35613d0b565b6134a081613d13565b613b46613412565b5f5f805160206147e2833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613bdf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c039190614249565b9050613c1a6001600160a01b038516333086613d7f565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c829190614249565b9050818111613ce85760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103f6565b613cf282826145e9565b95945050505050565b613d03613412565b61345b613dd9565b61345b613412565b613d1b613412565b80355f8051602061480283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613d6560608301604084016147c1565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610478908590613de1565b613b0a613412565b5f8060205f8451602086015f885af180613e00576040513d5f823e3d81fd5b50505f513d91508115613e17578060011415613e24565b6001600160a01b0384163b155b1561047857604051635274afe760e01b81526001600160a01b03851660048201526024016103f6565b508054613e5990614187565b5f825580601f10613e68575050565b601f0160209004905f5260205f20908101906134a091905b80821115613e93575f8155600101613e80565b5090565b5f60208284031215613ea7575f80fd5b5035919050565b803563ffffffff81168114613ec1575f80fd5b919050565b6001600160a01b03811681146134a0575f80fd5b5f8060408385031215613eeb575f80fd5b613ef483613eae565b91506020830135613f0481613ec6565b809150509250929050565b5f8060408385031215613f20575f80fd5b823591506020830135613f0481613ec6565b5f80828403610100811215613f45575f80fd5b60e0811215613f52575f80fd5b5082915060e0830135613f0481613ec6565b80356001600160401b0381168114613ec1575f80fd5b5f60208284031215613f8a575f80fd5b613f9382613f64565b9392505050565b80151581146134a0575f80fd5b5f805f60608486031215613fb9575f80fd5b833592506020840135613fcb81613f9a565b9150613fd960408501613eae565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561401857614018613fe2565b60405290565b604051601f8201601f191681016001600160401b038111828210171561404657614046613fe2565b604052919050565b5f6001600160401b0382111561406657614066613fe2565b50601f01601f191660200190565b5f805f8060808587031215614087575f80fd5b843593506020850135925061409e60408601613f64565b915060608501356001600160401b038111156140b8575f80fd5b8501601f810187136140c8575f80fd5b80356140db6140d68261404e565b61401e565b8181528860208385010111156140ef575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215614121575f80fd5b50508035926020909101359150565b5f60208284031215614140575f80fd5b613f9382613eae565b5f806040838503121561415a575f80fd5b61416383613eae565b91506020830135613f0481613f9a565b634e487b7160e01b5f52602160045260245ffd5b600181811c9082168061419b57607f821691505b6020821081036141b957634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546141d181614187565b806020870152604060018084165f81146141f2576001811461420e5761423b565b60ff19851660408a0152604084151560051b8a0101955061423b565b895f5260205f205f5b858110156142325781548b8201860152908301908801614217565b8a016040019650505b509398975050505050505050565b5f60208284031215614259575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826142d8576142d86142a2565b500490565b8082028115828204841417610734576107346142b6565b5f5b8381101561430e5781810151838201526020016142f6565b50505f910152565b8051613ec181613f9a565b5f8060408385031215614332575f80fd5b82516001600160401b0380821115614348575f80fd5b908401906060828703121561435b575f80fd5b614363613ff6565b8251815260208084015161437681613ec6565b8282015260408401518381111561438b575f80fd5b80850194505087601f85011261439f575f80fd5b835192506143af6140d68461404e565b83815288828587010111156143c2575f80fd5b6143d1848383018488016142f4565b806040840152508195506143e6818801614316565b9450505050509250929050565b6001600160401b03828116828216039080821115614413576144136142b6565b5092915050565b601f821115610b0257805f5260205f20601f840160051c8101602085101561443f5750805b601f840160051c820191505b8181101561445e575f815560010161444b565b5050505050565b81516001600160401b0381111561447e5761447e613fe2565b6144928161448c8454614187565b8461441a565b602080601f8311600181146144c5575f84156144ae5750858301515b5f19600386901b1c1916600185901b17855561451c565b5f85815260208120601f198616915b828110156144f3578886015182559484019460019091019084016144d4565b508582101561451057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526145428160408501602087016142f4565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b81810381811115610734576107346142b6565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610734576107346142b6565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b03808316818103614711576147116142b6565b6001019392505050565b6001600160401b03818116838216019080821115614413576144136142b6565b5f6020828403121561474b575f80fd5b8135613f9381613ec6565b6001600160401b03818116838216028082169190828114614779576147796142b6565b505092915050565b5f6001600160401b038084168061479a5761479a6142a2565b92169190910492915050565b5f82516147b78184602087016142f4565b9190910192915050565b5f602082840312156147d1575f80fd5b813560ff81168114613f93575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -249,6 +249,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WARPMESS return _ERC20TokenStakingManager.Contract.WARPMESSENGER(&_ERC20TokenStakingManager.CallOpts) } +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetWeight(opts *bind.CallOpts, validationID [32]byte) (uint64, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "getWeight", validationID) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) GetWeight(validationID [32]byte) (uint64, error) { + return _ERC20TokenStakingManager.Contract.GetWeight(&_ERC20TokenStakingManager.CallOpts, validationID) +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) GetWeight(validationID [32]byte) (uint64, error) { + return _ERC20TokenStakingManager.Contract.GetWeight(&_ERC20TokenStakingManager.CallOpts, validationID) +} + // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. // // Solidity: function valueToWeight(uint256 value) pure returns(uint64) @@ -653,16 +684,16 @@ func (it *ERC20TokenStakingManagerDelegationEndedIterator) Close() error { // ERC20TokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegationEnded struct { - ValidationID [32]byte - Delegator common.Address - ValidatorWeight *big.Int - Raw types.Log // Blockchain specific contextual infos + ValidationID [32]byte + Delegator common.Address + Nonce uint64 + Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0xe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -672,18 +703,22 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat for _, delegatorItem := range delegator { delegatorRule = append(delegatorRule, delegatorItem) } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegatorRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegatorRule, nonceRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegationEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0xe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, validationID [][32]byte, delegator []common.Address) (event.Subscription, error) { +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, validationID [][32]byte, delegator []common.Address, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -693,8 +728,12 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegati for _, delegatorItem := range delegator { delegatorRule = append(delegatorRule, delegatorItem) } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegatorRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegatorRule, nonceRule) if err != nil { return nil, err } @@ -726,9 +765,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegati }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0xe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513. +// ParseDelegationEnded is a log parse operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight) +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { event := new(ERC20TokenStakingManagerDelegationEnded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { @@ -810,14 +849,15 @@ type ERC20TokenStakingManagerDelegatorAdded struct { ValidationID [32]byte SetWeightMessageID [32]byte Delegator common.Address - Weight *big.Int - StartTime *big.Int + DelegatorWeight uint64 + ValidatorWeight uint64 + Nonce uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xf8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16. +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 weight, uint256 startTime) +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegatorAddedIterator, error) { var validationIDRule []interface{} @@ -840,9 +880,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat return &ERC20TokenStakingManagerDelegatorAddedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil } -// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xf8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16. +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 weight, uint256 startTime) +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { var validationIDRule []interface{} @@ -890,9 +930,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorAdded is a log parse operation binding the contract event 0xf8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16. +// ParseDelegatorAdded is a log parse operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 weight, uint256 startTime) +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*ERC20TokenStakingManagerDelegatorAdded, error) { event := new(ERC20TokenStakingManagerDelegatorAdded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { @@ -971,18 +1011,17 @@ func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Close() error { // ERC20TokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegatorRegistered struct { - ValidationID [32]byte - Delegator common.Address - Weight *big.Int - ValidatorWeight *big.Int - StartTime *big.Int - Raw types.Log // Blockchain specific contextual infos + ValidationID [32]byte + Delegator common.Address + Nonce uint64 + StartTime *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0xa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a3. +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 validatorWeight, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -992,18 +1031,22 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat for _, delegatorItem := range delegator { delegatorRule = append(delegatorRule, delegatorItem) } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule, nonceRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorRegisteredIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil } -// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0xa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a3. +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 validatorWeight, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegator []common.Address) (event.Subscription, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegator []common.Address, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1013,8 +1056,12 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato for _, delegatorItem := range delegator { delegatorRule = append(delegatorRule, delegatorItem) } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule, nonceRule) if err != nil { return nil, err } @@ -1046,9 +1093,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorRegistered is a log parse operation binding the contract event 0xa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a3. +// ParseDelegatorRegistered is a log parse operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 validatorWeight, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*ERC20TokenStakingManagerDelegatorRegistered, error) { event := new(ERC20TokenStakingManagerDelegatorRegistered) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { @@ -1130,13 +1177,15 @@ type ERC20TokenStakingManagerDelegatorRemovalInitialized struct { ValidationID [32]byte SetWeightMessageID [32]byte Delegator common.Address + ValidatorWeight uint64 + Nonce uint64 EndTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { var validationIDRule []interface{} @@ -1159,9 +1208,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat return &ERC20TokenStakingManagerDelegatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { var validationIDRule []interface{} @@ -1209,9 +1258,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerDelegatorRemovalInitialized, error) { event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 857b67bad..10484657a 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"weight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"validatorWeight\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161469238038061469283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145458061014d5f395ff3fe6080604052600436106100ee575f3560e01c8063927e7e7511610087578063c599e24f11610057578063c599e24f146102a6578063d61bed74146102b9578063f40797d7146102d8578063fdf94a1a146102eb575f80fd5b8063927e7e7514610217578063a3a65e4814610236578063b771b3bc14610255578063bee0a03f14610287575f80fd5b80632e2194d8116100c25780632e2194d81461017057806362065856146101ac5780636a7e3d83146101d957806376f78621146101f8575f80fd5b8062e41792146100f25780630322ed98146101135780630915204e146101325780630b77f69314610151575b5f80fd5b3480156100fd575f80fd5b5061011161010c366004613bbe565b61030a565b005b34801561011e575f80fd5b5061011161012d366004613bd4565b610416565b34801561013d575f80fd5b5061011161014c366004613c17565b610607565b34801561015c575f80fd5b5061011161016b366004613c4c565b610750565b34801561017b575f80fd5b5061018f61018a366004613bd4565b6107d2565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101b7575f80fd5b506101cb6101c6366004613c85565b6107e8565b6040519081526020016101a3565b3480156101e4575f80fd5b506101116101f3366004613c4c565b610801565b348015610203575f80fd5b50610111610212366004613cb2565b610883565b348015610222575f80fd5b50610111610231366004613bd4565b610ba1565b348015610241575f80fd5b50610111610250366004613ced565b610f2c565b348015610260575f80fd5b5061026f6005600160991b0181565b6040516001600160a01b0390911681526020016101a3565b348015610292575f80fd5b506101116102a1366004613bd4565b6110e5565b6101116102b4366004613bd4565b6111f4565b3480156102c4575f80fd5b506101116102d3366004613c17565b611202565b6101cb6102e6366004613d98565b611368565b3480156102f6575f80fd5b50610111610305366004613e2a565b61138a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561034e5750825b90505f826001600160401b031660011480156103695750303b155b905081158015610377575080155b156103955760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103bf57845460ff60401b1916600160401b1785555b6103c88661179c565b831561040e57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181525f805160206145198339815191526020526040808220815160e0810190925280545f805160206144d983398151915293929190829060ff16600581111561046357610463613e54565b600581111561047457610474613e54565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916104fe90613e68565b905011801561051f575060038151600581111561051d5761051d613e54565b145b6105885760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105c19190600401613e9a565b6020604051808303815f875af11580156105dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106019190613f24565b50505050565b5f805160206144b98339815191525f61061f846117ad565b90505f805f610631846040015161198e565b9250925092506106418387611c87565b5f83815260068601602090815260408083206001600160a01b038a168452909152812061066d91613b74565b5f61067784611d98565b9050826001600160401b031681606001516001600160401b031610156106af5760405162461bcd60e51b815260040161057f90613f3b565b5f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c21b1790556001600160401b03821660808201526106fc8482611e93565b6040516001600160401b03831681526001600160a01b0388169085907fe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513906020015b60405180910390a35050505050505050565b61075a8282611f82565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206144b9833981519152916005600160991b019163ee5b48eb916105c191600401613e9a565b5f6107e264e8d4a5100083613fa5565b92915050565b5f6107e26001600160401b03831664e8d4a51000613fb8565b61080b8282611c87565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206144b9833981519152916005600160991b019163ee5b48eb916105c191600401613e9a565b8115610b93575f5f805160206144b98339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156108e4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261090b9190810190613ffc565b915091508061096e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d59190613f24565b825114610a395760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057f565b60208201516001600160a01b031615610aaf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057f565b5f80610abe846040015161209e565b91509150818814610b2b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057f565b5f888152600786016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610b9c83612276565b505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f805160206144b983398151915293926060830190600160c01b900460ff166004811115610c4057610c40613e54565b6004811115610c5157610c51613e54565b9052509050600281606001516004811115610c6e57610c6e613e54565b14610cca5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161057f565b60036060820181905250426001600160401b03166040828101919091525f848152600484016020529081208291336001600160a01b0316815260208082019290925260409081015f208351815493850151928501516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990961691909216179390931791821683178155606084015190929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836004811115610d9d57610d9d613e54565b02179055509050505f610daf84611d98565b9050815f01516001600160401b031681608001516001600160401b031611610e255760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161057f565b5f610e4985610e33876125c2565b85516080860151610e4491906140ce565b61263d565b5f86815260068601602090815260408083203384529091529020909150610e708282614140565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610e9d9085906004016141fb565b6020604051808303815f875af1158015610eb9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edd9190613f24565b9050336001600160a01b031681877f2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc242604051610f1c91815260200190565b60405180910390a4505050505050565b5f805160206144d98339815191525f610f44836117ad565b90505f80610f55836040015161285a565b9150915080610fb75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057f565b5f82815260058501602052604081208054610fd190613e68565b9050118015611003575060015f83815260078601602052604090205460ff16600581111561100157611001613e54565b145b61101f5760405162461bcd60e51b815260040161057f9061422d565b5f828152600585016020526040812061103791613b74565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206144d983398151915292919061112d90613e68565b905011801561115f575060015f83815260078301602052604090205460ff16600581111561115d5761115d613e54565b145b61117b5760405162461bcd60e51b815260040161057f9061422d565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916111b49190600401613e9a565b6020604051808303815f875af11580156111d0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9c9190613f24565b6111ff8133346129fb565b50565b5f805160206144b98339815191525f61121a846117ad565b90505f805f61122c846040015161198e565b92509250925061123c8387611f82565b5f83815260058601602090815260408083206001600160a01b038a168452909152812061126891613b74565b5f61127284611d98565b9050826001600160401b031681606001516001600160401b031610156112aa5760405162461bcd60e51b815260040161057f90613f3b565b6001600160401b03821660808201525f84815260048701602090815260408083206001600160a01b038b1684529091529020805460ff60c01b1916600160c11b1790556112f78482611e93565b5f84815260048701602090815260408083206001600160a01b038b16808552908352928190205481516001600160401b03918216815290861692810192909252429082015285907fa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a39060600161073e565b5f8061137334612d45565b905061138185828686612def565b95945050505050565b5f5f805160206144d98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156113e5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261140c9190810190613ffc565b915091508061146c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057f565b5f84156114f0575f6114818460400151613223565b919350909150506001600160401b038116156114ea5760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161057f565b50611566565b5f6114fe846040015161285a565b909250905080156115645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057f565b505b5f818152600785016020526040808220815160e081019092528054829060ff16600581111561159757611597613e54565b60058111156115a8576115a8613e54565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146116395760405162461bcd60e51b815260040161057f90614274565b5f60038251600581111561164f5761164f613e54565b148061166d575060028251600581111561166b5761166b613e54565b145b1561169057506020808201515f9081526008870190915260408120556004611694565b5060055b5f83815260078701602052604090208251815484929190829060ff191660018360058111156116c5576116c5613e54565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b6117a461344e565b6111ff81613499565b60408051606080820183525f8083526020830181905292820152905f805160206144d98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611822573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118499190810190613ffc565b91509150806118b05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161057f565b82548251146119135760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057f565b60208201516001600160a01b0316156119865760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057f565b509392505050565b5f805f83516036146119f45760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b606482015260840161057f565b5f805b6002811015611a4357611a0b8160016142c0565b611a16906008613fb8565b61ffff16868281518110611a2c57611a2c6142d3565b016020015160f81c901b91909117906001016119f7565b5061ffff811615611aa25760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b606482015260840161057f565b5f805b6004811015611afd57611ab98160036142c0565b611ac4906008613fb8565b63ffffffff1687611ad68360026142e7565b81518110611ae657611ae66142d3565b016020015160f81c901b9190911790600101611aa5565b5063ffffffff8116600314611b645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b606482015260840161057f565b5f805b6020811015611bb957611b7b81601f6142c0565b611b86906008613fb8565b88611b928360066142e7565b81518110611ba257611ba26142d3565b016020015160f81c901b9190911790600101611b67565b505f805b6008811015611c1857611bd18160076142c0565b611bdc906008613fb8565b6001600160401b031689611bf18360266142e7565b81518110611c0157611c016142d3565b016020015160f81c901b9190911790600101611bbd565b505f805b6008811015611c7757611c308160076142c0565b611c3b906008613fb8565b6001600160401b03168a611c5083602e6142e7565b81518110611c6057611c606142d3565b016020015160f81c901b9190911790600101611c1c565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f805160206144b9833981519152929190611ce390613e68565b9050118015611d31575060035f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611d2f57611d2f613e54565b145b610b9c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161057f565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061451983398151915290528390208351918201909352825491925f805160206144d983398151915292829060ff166005811115611e1857611e18613e54565b6005811115611e2957611e29613e54565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061451983398151915260205260409020815181545f805160206144d98339815191529284929091829060ff19166001836005811115611edd57611edd613e54565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206144b9833981519152929190611fde90613e68565b905011801561202c575060015f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff169081111561202a5761202a613e54565b145b610b9c5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161057f565b5f808251602e146120c15760405162461bcd60e51b815260040161057f906142fa565b5f805b6002811015612110576120d88160016142c0565b6120e3906008613fb8565b61ffff168582815181106120f9576120f96142d3565b016020015160f81c901b91909117906001016120c4565b5061ffff8116156121335760405162461bcd60e51b815260040161057f90614343565b5f805b600481101561218e5761214a8160036142c0565b612155906008613fb8565b63ffffffff16866121678360026142e7565b81518110612177576121776142d3565b016020015160f81c901b9190911790600101612136565b5063ffffffff81166004146121b55760405162461bcd60e51b815260040161057f90614386565b5f805b602081101561220a576121cc81601f6142c0565b6121d7906008613fb8565b876121e38360066142e7565b815181106121f3576121f36142d3565b016020015160f81c901b91909117906001016121b8565b505f805b6008811015612269576122228160076142c0565b61222d906008613fb8565b6001600160401b0316886122428360266142e7565b81518110612252576122526142d3565b016020015160f81c901b919091179060010161220e565b5090969095509350505050565b5f8181525f805160206145198339815191526020526040808220815160e0810190925280545f805160206144d983398151915293929190829060ff1660058111156122c3576122c3613e54565b60058111156122d4576122d4613e54565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561234e5761234e613e54565b146123aa5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057f565b60408101516001600160a01b0316336001600160a01b0316146123df5760405162461bcd60e51b815260040161057f90614274565b6123ec81608001516134dc565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561243057612430613e54565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124e4846124de816125c2565b5f61263d565b5f85815260068501602052604090209091506125008282614140565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061252d9085906004016141fb565b6020604051808303815f875af1158015612549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256d9190613f24565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f805160206145198339815191526020526040812060020180545f805160206144d983398151915291600160a01b9091046001600160401b0316908190601461260e836143cd565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126b6576126768160016142c0565b612681906008613fb8565b5081515f90839083908110612698576126986142d3565b60200101906001600160f81b03191690815f1a905350600101612662565b505f5b6004811015612719576126cd8160036142c0565b6126d8906008613fb8565b6001901c60f81b826126eb8360026142e7565b815181106126fb576126fb6142d3565b60200101906001600160f81b03191690815f1a9053506001016126b9565b505f5b602081101561277b5761273081601f6142c0565b61273b906008613fb8565b86901c60f81b8261274d8360066142e7565b8151811061275d5761275d6142d3565b60200101906001600160f81b03191690815f1a90535060010161271c565b505f5b60088110156127e6576127928160076142c0565b61279d906008613fb8565b6001600160401b038616901c60f81b826127b88360266142e7565b815181106127c8576127c86142d3565b60200101906001600160f81b03191690815f1a90535060010161277e565b505f5b6008811015612851576127fd8160076142c0565b612808906008613fb8565b6001600160401b038516901c60f81b8261282383602e6142e7565b81518110612833576128336142d3565b60200101906001600160f81b03191690815f1a9053506001016127e9565b50949350505050565b5f80825160271461287d5760405162461bcd60e51b815260040161057f906142fa565b5f805b60028110156128cc576128948160016142c0565b61289f906008613fb8565b61ffff168582815181106128b5576128b56142d3565b016020015160f81c901b9190911790600101612880565b5061ffff8116156128ef5760405162461bcd60e51b815260040161057f90614343565b5f805b600481101561294a576129068160036142c0565b612911906008613fb8565b63ffffffff16866129238360026142e7565b81518110612933576129336142d3565b016020015160f81c901b91909117906001016128f2565b5063ffffffff81166002146129715760405162461bcd60e51b815260040161057f90614386565b5f805b60208110156129c65761298881601f6142c0565b612993906008613fb8565b8761299f8360066142e7565b815181106129af576129af6142d3565b016020015160f81c901b9190911790600101612974565b505f866026815181106129db576129db6142d3565b016020015191976001600160f81b03199092161515965090945050505050565b612a0361367d565b5f612a0d826107d2565b90505f805160206144b98339815191525f612a2786611d98565b9050600281516005811115612a3e57612a3e613e54565b14612a9a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057f565b5f86815260048301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612b2b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161057f565b612b34836134dc565b5f612b5287612b42896125c2565b868560800151610e4491906143f2565b5f88815260058501602090815260408083206001600160a01b038b1684529091529020909150612b828282614140565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612baf9085906004016141fb565b6020604051808303815f875af1158015612bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bef9190613f24565b604080516080810182526001600160401b038089168252421660208201525f9181019190915290915060608101600190525f8981526004808701602090815260408084206001600160a01b038d1685528252928390208451815492860151948601516001600160401b03908116600160801b0267ffffffffffffffff60801b19968216600160401b026001600160801b031990951691909216179290921793841682178155606085015190939092849260ff60c01b191668ffffffffffffffffff60801b199092169190911790600160c01b908490811115612cd357612cd3613e54565b021790555050604080516001600160401b03881681524260208201526001600160a01b038a16925083918b917ff8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16910160405180910390a45050505050610b9c60015f805160206144f983398151915255565b5f5f805160206144b98339815191528282612d5f826107d2565b83549091506001600160401b03821610801590612d8957508260010154816001600160401b031611155b612de75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161057f565b949350505050565b5f612df861367d565b5f805160206144d9833981519152426001600160401b038516118015612e3257506001600160401b038416612e30426202a3006142e7565b115b612e945760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161057f565b85612eeb5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161057f565b5f86815260088201602052604090205415612f595760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057f565b8251603014612fc05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057f565b612fc9856134dc565b5f806130106040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506136c7565b5f8281526005860160205260409020919350915061302e8282614140565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061305b9085906004016141fb565b6020604051808303815f875af1158015613077573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061309b9190613f24565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561311457613114613e54565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556131bd836125c2565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612de760015f805160206144f983398151915255565b5f805f83516036146132475760405162461bcd60e51b815260040161057f906142fa565b5f805b60028110156132965761325e8160016142c0565b613269906008613fb8565b61ffff1686828151811061327f5761327f6142d3565b016020015160f81c901b919091179060010161324a565b5061ffff8116156132b95760405162461bcd60e51b815260040161057f90614343565b5f805b6004811015613314576132d08160036142c0565b6132db906008613fb8565b63ffffffff16876132ed8360026142e7565b815181106132fd576132fd6142d3565b016020015160f81c901b91909117906001016132bc565b5063ffffffff811660011461333b5760405162461bcd60e51b815260040161057f90614386565b5f805b60208110156133905761335281601f6142c0565b61335d906008613fb8565b886133698360066142e7565b81518110613379576133796142d3565b016020015160f81c901b919091179060010161333e565b505f805b60088110156133ef576133a88160076142c0565b6133b3906008613fb8565b6001600160401b0316896133c88360266142e7565b815181106133d8576133d86142d3565b016020015160f81c901b9190911790600101613394565b505f805b6008811015611c77576134078160076142c0565b613412906008613fb8565b6001600160401b03168a61342783602e6142e7565b81518110613437576134376142d3565b016020015160f81c901b91909117906001016133f3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661349757604051631afcd79f60e31b815260040160405180910390fd5b565b6134a161344e565b6134aa81613a6c565b6111ff606082013560808301356134c760c0850160a08601613c85565b6134d760e0860160c08701614412565b613a8d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206144d98339815191529060ff165f0361351a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061356290836142c0565b1061357e576001600160401b038416604083015280825261359d565b838260400181815161359091906143f2565b6001600160401b03169052505b5f8260200151836040015160646135b4919061442d565b6135be9190614458565b600285015490915060ff90811690821611156136395760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161057f565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206144f98339815191528054600119016136ae57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206144f983398151915255565b5f60608260800151516030146137315760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137a8576137688160016142c0565b613773906008613fb8565b5081515f9083908390811061378a5761378a6142d3565b60200101906001600160f81b03191690815f1a905350600101613754565b505f5b6004811015613806576137bf8160036142c0565b6137ca906008613fb8565b505f826137d88360026142e7565b815181106137e8576137e86142d3565b60200101906001600160f81b03191690815f1a9053506001016137ab565b505f5b60208110156138635784518160208110613825576138256142d3565b1a60f81b826138358360066142e7565b81518110613845576138456142d3565b60200101906001600160f81b03191690815f1a905350600101613809565b505f5b60208110156138c35784602001518160208110613885576138856142d3565b1a60f81b826138958360266142e7565b815181106138a5576138a56142d3565b60200101906001600160f81b03191690815f1a905350600101613866565b505f5b6008811015613937576138da8160076142c0565b6138e5906008613fb8565b60ff1685604001516001600160401b0316901c60f81b8282604661390991906142e7565b81518110613919576139196142d3565b60200101906001600160f81b03191690815f1a9053506001016138c6565b505f5b60308110156139a25784608001518181518110613959576139596142d3565b01602001516001600160f81b0319168261397483604e6142e7565b81518110613984576139846142d3565b60200101906001600160f81b03191690815f1a90535060010161393a565b505f5b6008811015613a14576139b98160076142c0565b6139c4906008613fb8565b60608601516001600160401b0390811691161c60f81b826139e683607e6142e7565b815181106139f6576139f66142d3565b60200101906001600160f81b03191690815f1a9053506001016139a5565b50600281604051613a25919061447d565b602060405180830381855afa158015613a40573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a639190613f24565b94909350915050565b613a7461344e565b613a7c613ae8565b613a84613af8565b6111ff81613b00565b613a9561344e565b5f5f805160206144b9833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613af061344e565b613497613b6c565b61349761344e565b613b0861344e565b80355f805160206144d983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b526060830160408401614498565b600291909101805460ff191660ff90921691909117905550565b6136b461344e565b508054613b8090613e68565b5f825580601f10613b8f575050565b601f0160209004905f5260205f20908101906111ff91905b80821115613bba575f8155600101613ba7565b5090565b5f60e08284031215613bce575f80fd5b50919050565b5f60208284031215613be4575f80fd5b5035919050565b803563ffffffff81168114613bfe575f80fd5b919050565b6001600160a01b03811681146111ff575f80fd5b5f8060408385031215613c28575f80fd5b613c3183613beb565b91506020830135613c4181613c03565b809150509250929050565b5f8060408385031215613c5d575f80fd5b823591506020830135613c4181613c03565b80356001600160401b0381168114613bfe575f80fd5b5f60208284031215613c95575f80fd5b613c9e82613c6f565b9392505050565b80151581146111ff575f80fd5b5f805f60608486031215613cc4575f80fd5b833592506020840135613cd681613ca5565b9150613ce460408501613beb565b90509250925092565b5f60208284031215613cfd575f80fd5b613c9e82613beb565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d3c57613d3c613d06565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d6a57613d6a613d06565b604052919050565b5f6001600160401b03821115613d8a57613d8a613d06565b50601f01601f191660200190565b5f805f60608486031215613daa575f80fd5b83359250613dba60208501613c6f565b915060408401356001600160401b03811115613dd4575f80fd5b8401601f81018613613de4575f80fd5b8035613df7613df282613d72565b613d42565b818152876020838501011115613e0b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215613e3b575f80fd5b613e4483613beb565b91506020830135613c4181613ca5565b634e487b7160e01b5f52602160045260245ffd5b600181811c90821680613e7c57607f821691505b602082108103613bce57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454613eac81613e68565b806020870152604060018084165f8114613ecd5760018114613ee957613f16565b60ff19851660408a0152604084151560051b8a01019550613f16565b895f5260205f205f5b85811015613f0d5781548b8201860152908301908801613ef2565b8a016040019650505b509398975050505050505050565b5f60208284031215613f34575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613fb357613fb3613f7d565b500490565b80820281158282048414176107e2576107e2613f91565b5f5b83811015613fe9578181015183820152602001613fd1565b50505f910152565b8051613bfe81613ca5565b5f806040838503121561400d575f80fd5b82516001600160401b0380821115614023575f80fd5b9084019060608287031215614036575f80fd5b61403e613d1a565b8251815260208084015161405181613c03565b82820152604084015183811115614066575f80fd5b80850194505087601f85011261407a575f80fd5b8351925061408a613df284613d72565b838152888285870101111561409d575f80fd5b6140ac84838301848801613fcf565b806040840152508195506140c1818801613ff1565b9450505050509250929050565b6001600160401b038281168282160390808211156140ee576140ee613f91565b5092915050565b601f821115610b9c57805f5260205f20601f840160051c8101602085101561411a5750805b601f840160051c820191505b81811015614139575f8155600101614126565b5050505050565b81516001600160401b0381111561415957614159613d06565b61416d816141678454613e68565b846140f5565b602080601f8311600181146141a0575f84156141895750858301515b5f19600386901b1c1916600185901b17855561040e565b5f85815260208120601f198616915b828110156141ce578886015182559484019460019091019084016141af565b50858210156141eb57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f8251806020840152614219816040850160208701613fcf565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156107e2576107e2613f91565b634e487b7160e01b5f52603260045260245ffd5b808201808211156107e2576107e2613f91565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b038083168181036143e8576143e8613f91565b6001019392505050565b6001600160401b038181168382160190808211156140ee576140ee613f91565b5f60208284031215614422575f80fd5b8135613c9e81613c03565b6001600160401b0381811683821602808216919082811461445057614450613f91565b505092915050565b5f6001600160401b038084168061447157614471613f7d565b92169190910492915050565b5f825161448e818460208701613fcf565b9190910192915050565b5f602082840312156144a8575f80fd5b813560ff81168114613c9e575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516146e83803806146e883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61459b8061014d5f395ff3fe6080604052600436106100f9575f3560e01c806376f7862111610092578063bee0a03f11610062578063bee0a03f146102b1578063c599e24f146102d0578063d61bed74146102e3578063f40797d714610302578063fdf94a1a14610315575f80fd5b806376f7862114610222578063927e7e7514610241578063a3a65e4814610260578063b771b3bc1461027f575f80fd5b80632e2194d8116100cd5780632e2194d81461017b57806362065856146101b757806366435abf146101e45780636a7e3d8314610203575f80fd5b8062e41792146100fd5780630322ed981461011e5780630915204e1461013d5780630b77f6931461015c575b5f80fd5b348015610108575f80fd5b5061011c610117366004613c14565b610334565b005b348015610129575f80fd5b5061011c610138366004613c2a565b610440565b348015610148575f80fd5b5061011c610157366004613c6d565b610631565b348015610167575f80fd5b5061011c610176366004613ca2565b610747565b348015610186575f80fd5b5061019a610195366004613c2a565b6107c9565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101c2575f80fd5b506101d66101d1366004613cdb565b6107df565b6040519081526020016101ae565b3480156101ef575f80fd5b5061019a6101fe366004613c2a565b6107f8565b34801561020e575f80fd5b5061011c61021d366004613ca2565b61080c565b34801561022d575f80fd5b5061011c61023c366004613d08565b61088e565b34801561024c575f80fd5b5061011c61025b366004613c2a565b610bac565b34801561026b575f80fd5b5061011c61027a366004613d43565b610f6c565b34801561028a575f80fd5b506102996005600160991b0181565b6040516001600160a01b0390911681526020016101ae565b3480156102bc575f80fd5b5061011c6102cb366004613c2a565b611125565b61011c6102de366004613c2a565b611234565b3480156102ee575f80fd5b5061011c6102fd366004613c6d565b611242565b6101d6610310366004613dee565b611387565b348015610320575f80fd5b5061011c61032f366004613e80565b6113a9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f2866117bb565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181525f8051602061456f8339815191526020526040808220815160e0810190925280545f8051602061452f83398151915293929190829060ff16600581111561048d5761048d613eaa565b600581111561049e5761049e613eaa565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f868152600686019091529081208054929350909161052890613ebe565b9050118015610549575060038151600581111561054757610547613eaa565b145b6105b25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105eb9190600401613ef0565b6020604051808303815f875af1158015610607573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062b9190613f7a565b50505050565b5f8051602061450f8339815191525f610649846117cc565b90505f8061065a83604001516119ad565b50915091506106698286611ca6565b5f82815260068501602090815260408083206001600160a01b0389168452909152812061069591613bca565b5f61069f83611db7565b9050816001600160401b031681606001516001600160401b031610156106d75760405162461bcd60e51b81526004016105a990613f91565b5f83815260048601602090815260408083206001600160a01b038a168085529252808320805460ff60c01b1916600160c21b179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6107518282611eb2565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061450f833981519152916005600160991b019163ee5b48eb916105eb91600401613ef0565b5f6107d964e8d4a5100083613ffb565b92915050565b5f6107d96001600160401b03831664e8d4a5100061400e565b5f61080282611db7565b6080015192915050565b6108168282611ca6565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061450f833981519152916005600160991b019163ee5b48eb916105eb91600401613ef0565b8115610b9e575f5f8051602061450f8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156108ef573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109169190810190614052565b91509150806109795760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105a9565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e09190613f7a565b825114610a445760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105a9565b60208201516001600160a01b031615610aba5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105a9565b5f80610ac98460400151611fce565b91509150818814610b365760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105a9565b5f888152600786016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610ba7836121a6565b505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f8051602061450f83398151915293926060830190600160c01b900460ff166004811115610c4b57610c4b613eaa565b6004811115610c5c57610c5c613eaa565b9052509050600281606001516004811115610c7957610c79613eaa565b14610cd55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b60648201526084016105a9565b60036060820181905250426001600160401b03166040828101919091525f848152600484016020529081208291336001600160a01b0316815260208082019290925260409081015f208351815493850151928501516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990961691909216179390931791821683178155606084015190929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b836004811115610da857610da8613eaa565b02179055509050505f610dba84611db7565b9050815f01516001600160401b031681608001516001600160401b031611610e305760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105a9565b8151608082018051610e43908390614124565b6001600160401b0316905250610e5984826124f2565b5f610e63856125e1565b90505f610e758683856080015161265c565b5f87815260068701602090815260408083203384529091529020909150610e9c8282614196565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610ec9908590600401614251565b6020604051808303815f875af1158015610ee5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f099190613f7a565b6080850151604080516001600160401b039283168152918616602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b5f8051602061452f8339815191525f610f84836117cc565b90505f80610f958360400151612879565b9150915080610ff75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105a9565b5f8281526005850160205260408120805461101190613ebe565b9050118015611043575060015f83815260078601602052604090205460ff16600581111561104157611041613eaa565b145b61105f5760405162461bcd60e51b81526004016105a990614283565b5f828152600585016020526040812061107791613bca565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061452f83398151915292919061116d90613ebe565b905011801561119f575060015f83815260078301602052604090205460ff16600581111561119d5761119d613eaa565b145b6111bb5760405162461bcd60e51b81526004016105a990614283565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916111f49190600401613ef0565b6020604051808303815f875af1158015611210573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba79190613f7a565b61123f813334612a1a565b50565b5f8051602061450f8339815191525f61125a846117cc565b90505f8061126b83604001516119ad565b509150915061127a8286611eb2565b5f82815260058501602090815260408083206001600160a01b038916845290915281206112a691613bca565b5f6112b083611db7565b9050816001600160401b031681606001516001600160401b031610156112e85760405162461bcd60e51b81526004016105a990613f91565b5f83815260048601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160401b0278ff0000000000000000ffffffffffffffff00000000000000001990971696909617600160c11b179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101610f5b565b5f8061139234612d9b565b90506113a085828686612e45565b95945050505050565b5f5f8051602061452f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611404573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261142b9190810190614052565b915091508061148b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016105a9565b5f841561150f575f6114a08460400151613279565b919350909150506001600160401b038116156115095760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b60648201526084016105a9565b50611585565b5f61151d8460400151612879565b909250905080156115835760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105a9565b505b5f818152600785016020526040808220815160e081019092528054829060ff1660058111156115b6576115b6613eaa565b60058111156115c7576115c7613eaa565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c0909201919091528201519192501633146116585760405162461bcd60e51b81526004016105a9906142ca565b5f60038251600581111561166e5761166e613eaa565b148061168c575060028251600581111561168a5761168a613eaa565b145b156116af57506020808201515f90815260088701909152604081205560046116b3565b5060055b5f83815260078701602052604090208251815484929190829060ff191660018360058111156116e4576116e4613eaa565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b6117c36134a4565b61123f816134ef565b60408051606080820183525f8083526020830181905292820152905f8051602061452f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611841573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118689190810190614052565b91509150806118cf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105a9565b82548251146119325760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105a9565b60208201516001600160a01b0316156119a55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105a9565b509392505050565b5f805f8351603614611a135760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016105a9565b5f805b6002811015611a6257611a2a816001614316565b611a3590600861400e565b61ffff16868281518110611a4b57611a4b614329565b016020015160f81c901b9190911790600101611a16565b5061ffff811615611ac15760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016105a9565b5f805b6004811015611b1c57611ad8816003614316565b611ae390600861400e565b63ffffffff1687611af583600261433d565b81518110611b0557611b05614329565b016020015160f81c901b9190911790600101611ac4565b5063ffffffff8116600314611b835760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016105a9565b5f805b6020811015611bd857611b9a81601f614316565b611ba590600861400e565b88611bb183600661433d565b81518110611bc157611bc1614329565b016020015160f81c901b9190911790600101611b86565b505f805b6008811015611c3757611bf0816007614316565b611bfb90600861400e565b6001600160401b031689611c1083602661433d565b81518110611c2057611c20614329565b016020015160f81c901b9190911790600101611bdc565b505f805b6008811015611c9657611c4f816007614316565b611c5a90600861400e565b6001600160401b03168a611c6f83602e61433d565b81518110611c7f57611c7f614329565b016020015160f81c901b9190911790600101611c3b565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f8051602061450f833981519152929190611d0290613ebe565b9050118015611d50575060035f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611d4e57611d4e613eaa565b145b610ba75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016105a9565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061456f83398151915290528390208351918201909352825491925f8051602061452f83398151915292829060ff166005811115611e3757611e37613eaa565b6005811115611e4857611e48613eaa565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f8051602061450f833981519152929190611f0e90613ebe565b9050118015611f5c575060015f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611f5a57611f5a613eaa565b145b610ba75760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016105a9565b5f808251602e14611ff15760405162461bcd60e51b81526004016105a990614350565b5f805b600281101561204057612008816001614316565b61201390600861400e565b61ffff1685828151811061202957612029614329565b016020015160f81c901b9190911790600101611ff4565b5061ffff8116156120635760405162461bcd60e51b81526004016105a990614399565b5f805b60048110156120be5761207a816003614316565b61208590600861400e565b63ffffffff168661209783600261433d565b815181106120a7576120a7614329565b016020015160f81c901b9190911790600101612066565b5063ffffffff81166004146120e55760405162461bcd60e51b81526004016105a9906143dc565b5f805b602081101561213a576120fc81601f614316565b61210790600861400e565b8761211383600661433d565b8151811061212357612123614329565b016020015160f81c901b91909117906001016120e8565b505f805b600881101561219957612152816007614316565b61215d90600861400e565b6001600160401b03168861217283602661433d565b8151811061218257612182614329565b016020015160f81c901b919091179060010161213e565b5090969095509350505050565b5f8181525f8051602061456f8339815191526020526040808220815160e0810190925280545f8051602061452f83398151915293929190829060ff1660058111156121f3576121f3613eaa565b600581111561220457612204613eaa565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561227e5761227e613eaa565b146122da5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105a9565b60408101516001600160a01b0316336001600160a01b03161461230f5760405162461bcd60e51b81526004016105a9906142ca565b61231c8160800151613532565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561236057612360613eaa565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124148461240e816125e1565b5f61265c565b5f85815260068501602052604090209091506124308282614196565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061245d908590600401614251565b6020604051808303815f875af1158015612479573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249d9190613f7a565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8281525f8051602061456f83398151915260205260409020815181545f8051602061452f8339815191529284929091829060ff1916600183600581111561253c5761253c613eaa565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f8181525f8051602061456f8339815191526020526040812060020180545f8051602061452f83398151915291600160a01b9091046001600160401b0316908190601461262d83614423565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126d557612695816001614316565b6126a090600861400e565b5081515f908390839081106126b7576126b7614329565b60200101906001600160f81b03191690815f1a905350600101612681565b505f5b6004811015612738576126ec816003614316565b6126f790600861400e565b6001901c60f81b8261270a83600261433d565b8151811061271a5761271a614329565b60200101906001600160f81b03191690815f1a9053506001016126d8565b505f5b602081101561279a5761274f81601f614316565b61275a90600861400e565b86901c60f81b8261276c83600661433d565b8151811061277c5761277c614329565b60200101906001600160f81b03191690815f1a90535060010161273b565b505f5b6008811015612805576127b1816007614316565b6127bc90600861400e565b6001600160401b038616901c60f81b826127d783602661433d565b815181106127e7576127e7614329565b60200101906001600160f81b03191690815f1a90535060010161279d565b505f5b60088110156128705761281c816007614316565b61282790600861400e565b6001600160401b038516901c60f81b8261284283602e61433d565b8151811061285257612852614329565b60200101906001600160f81b03191690815f1a905350600101612808565b50949350505050565b5f80825160271461289c5760405162461bcd60e51b81526004016105a990614350565b5f805b60028110156128eb576128b3816001614316565b6128be90600861400e565b61ffff168582815181106128d4576128d4614329565b016020015160f81c901b919091179060010161289f565b5061ffff81161561290e5760405162461bcd60e51b81526004016105a990614399565b5f805b600481101561296957612925816003614316565b61293090600861400e565b63ffffffff168661294283600261433d565b8151811061295257612952614329565b016020015160f81c901b9190911790600101612911565b5063ffffffff81166002146129905760405162461bcd60e51b81526004016105a9906143dc565b5f805b60208110156129e5576129a781601f614316565b6129b290600861400e565b876129be83600661433d565b815181106129ce576129ce614329565b016020015160f81c901b9190911790600101612993565b505f866026815181106129fa576129fa614329565b016020015191976001600160f81b03199092161515965090945050505050565b612a226136d3565b5f612a2c826107c9565b90505f8051602061450f8339815191525f612a4686611db7565b9050600281516005811115612a5d57612a5d613eaa565b14612ab95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105a9565b5f86815260048301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612b4a5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016105a9565b612b5383613532565b8281608001818151612b659190614448565b6001600160401b0316905250612b7b86826124f2565b5f612b85876125e1565b90505f612b978883856080015161265c565b5f89815260058601602090815260408083206001600160a01b038c1684529091529020909150612bc78282614196565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612bf4908590600401614251565b6020604051808303815f875af1158015612c10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c349190613f7a565b604080516080810182526001600160401b03891681525f602082018190529181019190915290915060608101600190525f8a81526004808801602090815260408084206001600160a01b038e1685528252928390208451815492860151948601516001600160401b03908116600160801b0267ffffffffffffffff60801b19968216600160401b026001600160801b031990951691909216179290921793841682178155606085015190939092849260ff60c01b191668ffffffffffffffffff60801b199092169190911790600160c01b908490811115612d1757612d17613eaa565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a4505050505050610ba760015f8051602061454f83398151915255565b5f5f8051602061450f8339815191528282612db5826107c9565b83549091506001600160401b03821610801590612ddf57508260010154816001600160401b031611155b612e3d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105a9565b949350505050565b5f612e4e6136d3565b5f8051602061452f833981519152426001600160401b038516118015612e8857506001600160401b038416612e86426202a30061433d565b115b612eea5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105a9565b85612f415760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b60648201526084016105a9565b5f86815260088201602052604090205415612faf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105a9565b82516030146130165760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105a9565b61301f85613532565b5f806130666040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061371d565b5f828152600586016020526040902091935091506130848282614196565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906130b1908590600401614251565b6020604051808303815f875af11580156130cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130f19190613f7a565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561316a5761316a613eaa565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055613213836125e1565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612e3d60015f8051602061454f83398151915255565b5f805f835160361461329d5760405162461bcd60e51b81526004016105a990614350565b5f805b60028110156132ec576132b4816001614316565b6132bf90600861400e565b61ffff168682815181106132d5576132d5614329565b016020015160f81c901b91909117906001016132a0565b5061ffff81161561330f5760405162461bcd60e51b81526004016105a990614399565b5f805b600481101561336a57613326816003614316565b61333190600861400e565b63ffffffff168761334383600261433d565b8151811061335357613353614329565b016020015160f81c901b9190911790600101613312565b5063ffffffff81166001146133915760405162461bcd60e51b81526004016105a9906143dc565b5f805b60208110156133e6576133a881601f614316565b6133b390600861400e565b886133bf83600661433d565b815181106133cf576133cf614329565b016020015160f81c901b9190911790600101613394565b505f805b6008811015613445576133fe816007614316565b61340990600861400e565b6001600160401b03168961341e83602661433d565b8151811061342e5761342e614329565b016020015160f81c901b91909117906001016133ea565b505f805b6008811015611c965761345d816007614316565b61346890600861400e565b6001600160401b03168a61347d83602e61433d565b8151811061348d5761348d614329565b016020015160f81c901b9190911790600101613449565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166134ed57604051631afcd79f60e31b815260040160405180910390fd5b565b6134f76134a4565b61350081613ac2565b61123f6060820135608083013561351d60c0850160a08601613cdb565b61352d60e0860160c08701614468565b613ae3565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061452f8339815191529060ff165f03613570575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135b89083614316565b106135d4576001600160401b03841660408301528082526135f3565b83826040018181516135e69190614448565b6001600160401b03169052505b5f82602001518360400151606461360a9190614483565b61361491906144ae565b600285015490915060ff908116908216111561368f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105a9565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061454f83398151915280546001190161370457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061454f83398151915255565b5f60608260800151516030146137875760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105a9565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137fe576137be816001614316565b6137c990600861400e565b5081515f908390839081106137e0576137e0614329565b60200101906001600160f81b03191690815f1a9053506001016137aa565b505f5b600481101561385c57613815816003614316565b61382090600861400e565b505f8261382e83600261433d565b8151811061383e5761383e614329565b60200101906001600160f81b03191690815f1a905350600101613801565b505f5b60208110156138b9578451816020811061387b5761387b614329565b1a60f81b8261388b83600661433d565b8151811061389b5761389b614329565b60200101906001600160f81b03191690815f1a90535060010161385f565b505f5b602081101561391957846020015181602081106138db576138db614329565b1a60f81b826138eb83602661433d565b815181106138fb576138fb614329565b60200101906001600160f81b03191690815f1a9053506001016138bc565b505f5b600881101561398d57613930816007614316565b61393b90600861400e565b60ff1685604001516001600160401b0316901c60f81b8282604661395f919061433d565b8151811061396f5761396f614329565b60200101906001600160f81b03191690815f1a90535060010161391c565b505f5b60308110156139f857846080015181815181106139af576139af614329565b01602001516001600160f81b031916826139ca83604e61433d565b815181106139da576139da614329565b60200101906001600160f81b03191690815f1a905350600101613990565b505f5b6008811015613a6a57613a0f816007614316565b613a1a90600861400e565b60608601516001600160401b0390811691161c60f81b82613a3c83607e61433d565b81518110613a4c57613a4c614329565b60200101906001600160f81b03191690815f1a9053506001016139fb565b50600281604051613a7b91906144d3565b602060405180830381855afa158015613a96573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613ab99190613f7a565b94909350915050565b613aca6134a4565b613ad2613b3e565b613ada613b4e565b61123f81613b56565b613aeb6134a4565b5f5f8051602061450f833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613b466134a4565b6134ed613bc2565b6134ed6134a4565b613b5e6134a4565b80355f8051602061452f83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613ba860608301604084016144ee565b600291909101805460ff191660ff90921691909117905550565b61370a6134a4565b508054613bd690613ebe565b5f825580601f10613be5575050565b601f0160209004905f5260205f209081019061123f91905b80821115613c10575f8155600101613bfd565b5090565b5f60e08284031215613c24575f80fd5b50919050565b5f60208284031215613c3a575f80fd5b5035919050565b803563ffffffff81168114613c54575f80fd5b919050565b6001600160a01b038116811461123f575f80fd5b5f8060408385031215613c7e575f80fd5b613c8783613c41565b91506020830135613c9781613c59565b809150509250929050565b5f8060408385031215613cb3575f80fd5b823591506020830135613c9781613c59565b80356001600160401b0381168114613c54575f80fd5b5f60208284031215613ceb575f80fd5b613cf482613cc5565b9392505050565b801515811461123f575f80fd5b5f805f60608486031215613d1a575f80fd5b833592506020840135613d2c81613cfb565b9150613d3a60408501613c41565b90509250925092565b5f60208284031215613d53575f80fd5b613cf482613c41565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d9257613d92613d5c565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613dc057613dc0613d5c565b604052919050565b5f6001600160401b03821115613de057613de0613d5c565b50601f01601f191660200190565b5f805f60608486031215613e00575f80fd5b83359250613e1060208501613cc5565b915060408401356001600160401b03811115613e2a575f80fd5b8401601f81018613613e3a575f80fd5b8035613e4d613e4882613dc8565b613d98565b818152876020838501011115613e61575f80fd5b816020840160208301375f602083830101528093505050509250925092565b5f8060408385031215613e91575f80fd5b613e9a83613c41565b91506020830135613c9781613cfb565b634e487b7160e01b5f52602160045260245ffd5b600181811c90821680613ed257607f821691505b602082108103613c2457634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454613f0281613ebe565b806020870152604060018084165f8114613f235760018114613f3f57613f6c565b60ff19851660408a0152604084151560051b8a01019550613f6c565b895f5260205f205f5b85811015613f635781548b8201860152908301908801613f48565b8a016040019650505b509398975050505050505050565b5f60208284031215613f8a575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261400957614009613fd3565b500490565b80820281158282048414176107d9576107d9613fe7565b5f5b8381101561403f578181015183820152602001614027565b50505f910152565b8051613c5481613cfb565b5f8060408385031215614063575f80fd5b82516001600160401b0380821115614079575f80fd5b908401906060828703121561408c575f80fd5b614094613d70565b825181526020808401516140a781613c59565b828201526040840151838111156140bc575f80fd5b80850194505087601f8501126140d0575f80fd5b835192506140e0613e4884613dc8565b83815288828587010111156140f3575f80fd5b61410284838301848801614025565b80604084015250819550614117818801614047565b9450505050509250929050565b6001600160401b0382811682821603908082111561414457614144613fe7565b5092915050565b601f821115610ba757805f5260205f20601f840160051c810160208510156141705750805b601f840160051c820191505b8181101561418f575f815560010161417c565b5050505050565b81516001600160401b038111156141af576141af613d5c565b6141c3816141bd8454613ebe565b8461414b565b602080601f8311600181146141f6575f84156141df5750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b8281101561422457888601518255948401946001909101908401614205565b508582101561424157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f825180602084015261426f816040850160208701614025565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b818103818111156107d9576107d9613fe7565b634e487b7160e01b5f52603260045260245ffd5b808201808211156107d9576107d9613fe7565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b0380831681810361443e5761443e613fe7565b6001019392505050565b6001600160401b0381811683821601908082111561414457614144613fe7565b5f60208284031215614478575f80fd5b8135613cf481613c59565b6001600160401b038181168382160280821691908281146144a6576144a6613fe7565b505092915050565b5f6001600160401b03808416806144c7576144c7613fd3565b92169190910492915050565b5f82516144e4818460208701614025565b9190910192915050565b5f602082840312156144fe575f80fd5b813560ff81168114613cf4575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -249,6 +249,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) WARPME return _NativeTokenStakingManager.Contract.WARPMESSENGER(&_NativeTokenStakingManager.CallOpts) } +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetWeight(opts *bind.CallOpts, validationID [32]byte) (uint64, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "getWeight", validationID) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) GetWeight(validationID [32]byte) (uint64, error) { + return _NativeTokenStakingManager.Contract.GetWeight(&_NativeTokenStakingManager.CallOpts, validationID) +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) GetWeight(validationID [32]byte) (uint64, error) { + return _NativeTokenStakingManager.Contract.GetWeight(&_NativeTokenStakingManager.CallOpts, validationID) +} + // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. // // Solidity: function valueToWeight(uint256 value) pure returns(uint64) @@ -653,16 +684,16 @@ func (it *NativeTokenStakingManagerDelegationEndedIterator) Close() error { // NativeTokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegationEnded struct { - ValidationID [32]byte - Delegator common.Address - ValidatorWeight *big.Int - Raw types.Log // Blockchain specific contextual infos + ValidationID [32]byte + Delegator common.Address + Nonce uint64 + Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0xe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegationEndedIterator, error) { +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -672,18 +703,22 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg for _, delegatorItem := range delegator { delegatorRule = append(delegatorRule, delegatorItem) } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegatorRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegatorRule, nonceRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegationEndedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0xe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, validationID [][32]byte, delegator []common.Address) (event.Subscription, error) { +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, validationID [][32]byte, delegator []common.Address, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -693,8 +728,12 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega for _, delegatorItem := range delegator { delegatorRule = append(delegatorRule, delegatorItem) } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegatorRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegatorRule, nonceRule) if err != nil { return nil, err } @@ -726,9 +765,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0xe078b22d8b2933a6cbb99dc400fd663e0f94a61cd9cca04a7074f98e4d105513. +// ParseDelegationEnded is a log parse operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint256 validatorWeight) +// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { event := new(NativeTokenStakingManagerDelegationEnded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { @@ -810,14 +849,15 @@ type NativeTokenStakingManagerDelegatorAdded struct { ValidationID [32]byte SetWeightMessageID [32]byte Delegator common.Address - Weight *big.Int - StartTime *big.Int + DelegatorWeight uint64 + ValidatorWeight uint64 + Nonce uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xf8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16. +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 weight, uint256 startTime) +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegatorAddedIterator, error) { var validationIDRule []interface{} @@ -840,9 +880,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg return &NativeTokenStakingManagerDelegatorAddedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil } -// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xf8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16. +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 weight, uint256 startTime) +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { var validationIDRule []interface{} @@ -890,9 +930,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorAdded is a log parse operation binding the contract event 0xf8d50455a7db099738c0d0dec28c67408ac014e789106621b6a5bbe35ace7e16. +// ParseDelegatorAdded is a log parse operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 weight, uint256 startTime) +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*NativeTokenStakingManagerDelegatorAdded, error) { event := new(NativeTokenStakingManagerDelegatorAdded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { @@ -971,18 +1011,17 @@ func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Close() error { // NativeTokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegatorRegistered struct { - ValidationID [32]byte - Delegator common.Address - Weight *big.Int - ValidatorWeight *big.Int - StartTime *big.Int - Raw types.Log // Blockchain specific contextual infos + ValidationID [32]byte + Delegator common.Address + Nonce uint64 + StartTime *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0xa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a3. +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 validatorWeight, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address, nonce []uint64) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -992,18 +1031,22 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg for _, delegatorItem := range delegator { delegatorRule = append(delegatorRule, delegatorItem) } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule, nonceRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorRegisteredIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil } -// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0xa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a3. +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 validatorWeight, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegator []common.Address) (event.Subscription, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegator []common.Address, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1013,8 +1056,12 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega for _, delegatorItem := range delegator { delegatorRule = append(delegatorRule, delegatorItem) } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule, nonceRule) if err != nil { return nil, err } @@ -1046,9 +1093,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorRegistered is a log parse operation binding the contract event 0xa978fe9f273b0cfa5b145e0043d2623b24238bf2484d97137b918699e1d960a3. +// ParseDelegatorRegistered is a log parse operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint256 weight, uint256 validatorWeight, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*NativeTokenStakingManagerDelegatorRegistered, error) { event := new(NativeTokenStakingManagerDelegatorRegistered) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { @@ -1130,13 +1177,15 @@ type NativeTokenStakingManagerDelegatorRemovalInitialized struct { ValidationID [32]byte SetWeightMessageID [32]byte Delegator common.Address + ValidatorWeight uint64 + Nonce uint64 EndTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { var validationIDRule []interface{} @@ -1159,9 +1208,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg return &NativeTokenStakingManagerDelegatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { var validationIDRule []interface{} @@ -1209,9 +1258,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x2322b2a00b93b9ff70984d63f2092c481fc9886dbd090567838dfcc0fcab7fc2. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerDelegatorRemovalInitialized, error) { event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index a43bb2609..38952102e 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -38,8 +38,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeEndValidation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612db3380380612db383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c668061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063a3a65e481161006e578063a3a65e4814610144578063b771b3bc14610157578063bee0a03f14610165578063c151c0b914610178578063f2fde38b1461018b578063fdf94a1a1461019e575f80fd5b80630322ed98146100aa5780633aaa9f25146100bf578063715018a6146100e55780638da5cb5b146100ed57806397fb70d414610131575b5f80fd5b6100bd6100b8366004612421565b6101b1565b005b6100d26100cd3660046124e5565b6103b5565b6040519081526020015b60405180910390f35b6100bd6103d5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100dc565b6100bd61013f366004612421565b6103e8565b6100bd61015236600461259b565b6103f4565b6101196005600160991b0181565b6100bd610173366004612421565b6105ad565b6100bd6101863660046125cf565b6106c1565b6100bd61019936600461260b565b6107cf565b6100bd6101ac366004612633565b610809565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040808220815160e0810190925280545f80516020612c3a83398151915293929190829060ff1660058111156102115761021161265d565b60058111156102225761022261265d565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916102ac90612671565b90501180156102cd57506003815160058111156102cb576102cb61265d565b145b6103365760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161036f91906004016126a9565b6020604051808303815f875af115801561038b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103af9190612733565b50505050565b5f6103be610c1b565b6103ca84868585610c76565b90505b949350505050565b6103dd610c1b565b6103e65f6110bd565b565b6103f18161112d565b50565b5f80516020612c3a8339815191525f61040c8361148c565b90505f8061041d836040015161166d565b915091508061047f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161032d565b5f8281526005850160205260408120805461049990612671565b90501180156104cb575060015f83815260078601602052604090205460ff1660058111156104c9576104c961265d565b145b6104e75760405162461bcd60e51b815260040161032d9061274a565b5f82815260058501602052604081206104ff916123d7565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612c3a8339815191529291906105f590612671565b9050118015610627575060015f83815260078301602052604090205460ff1660058111156106255761062561265d565b145b6106435760405162461bcd60e51b815260040161032d9061274a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161067c91906004016126a9565b6020604051808303815f875af1158015610698573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106bc9190612733565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107055750825b90505f826001600160401b031660011480156107205750303b155b90508115801561072e575080155b1561074c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561077657845460ff60401b1916600160401b1785555b610780878761180e565b83156107c657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6107d7610c1b565b6001600160a01b03811661080057604051631e4fbdf760e01b81525f600482015260240161032d565b6103f1816110bd565b5f5f80516020612c3a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610864573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261088b91908101906127be565b91509150806108eb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b606482015260840161032d565b5f841561096f575f610900846040015161182c565b919350909150506001600160401b038116156109695760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b606482015260840161032d565b506109e5565b5f61097d846040015161166d565b909250905080156109e35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161032d565b505b5f818152600785016020526040808220815160e081019092528054829060ff166005811115610a1657610a1661265d565b6005811115610a2757610a2761265d565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610ab85760405162461bcd60e51b815260040161032d90612890565b5f600382516005811115610ace57610ace61265d565b1480610aec5750600282516005811115610aea57610aea61265d565b145b15610b0f57506020808201515f9081526008870190915260408120556004610b13565b5060055b5f83815260078701602052604090208251815484929190829060ff19166001836005811115610b4457610b4461265d565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b33610c4d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103e65760405163118cdaa760e01b815233600482015260240161032d565b5f610c7f611a67565b5f80516020612c3a833981519152426001600160401b038516118015610cb957506001600160401b038416610cb7426202a3006128f0565b115b610d1b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161032d565b85610d725760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b606482015260840161032d565b5f86815260088201602052604090205415610de05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161032d565b8251603014610e475760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161032d565b610e5085611ab1565b5f80610e976040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611c52565b5f82815260058601602052604090209193509150610eb58282612954565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610ee2908590600401612a13565b6020604051808303815f875af1158015610efe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f229190612733565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115610f9b57610f9b61265d565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561104483611ff7565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103cd60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040808220815160e0810190925280545f80516020612c3a83398151915293929190829060ff16600581111561118d5761118d61265d565b600581111561119e5761119e61265d565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156112185761121861265d565b146112745760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161032d565b60408101516001600160a01b0316336001600160a01b0316146112a95760405162461bcd60e51b815260040161032d90612890565b6112b68160800151611ab1565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156112fa576112fa61265d565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6113ae846113a881611ff7565b5f6120ab565b5f85815260068501602052604090209091506113ca8282612954565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113f7908590600401612a13565b6020604051808303815f875af1158015611413573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114379190612733565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612c3a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611501573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152891908101906127be565b915091508061158f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161032d565b82548251146115f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161032d565b60208201516001600160a01b0316156116655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161032d565b509392505050565b5f8082516027146116905760405162461bcd60e51b815260040161032d90612a45565b5f805b60028110156116df576116a7816001612a8e565b6116b2906008612aa1565b61ffff168582815181106116c8576116c8612ab8565b016020015160f81c901b9190911790600101611693565b5061ffff8116156117025760405162461bcd60e51b815260040161032d90612acc565b5f805b600481101561175d57611719816003612a8e565b611724906008612aa1565b63ffffffff16866117368360026128f0565b8151811061174657611746612ab8565b016020015160f81c901b9190911790600101611705565b5063ffffffff81166002146117845760405162461bcd60e51b815260040161032d90612b0f565b5f805b60208110156117d95761179b81601f612a8e565b6117a6906008612aa1565b876117b28360066128f0565b815181106117c2576117c2612ab8565b016020015160f81c901b9190911790600101611787565b505f866026815181106117ee576117ee612ab8565b016020015191976001600160f81b03199092161515965090945050505050565b6118166122c8565b61181f82612311565b61182881612332565b5050565b5f805f83516036146118505760405162461bcd60e51b815260040161032d90612a45565b5f805b600281101561189f57611867816001612a8e565b611872906008612aa1565b61ffff1686828151811061188857611888612ab8565b016020015160f81c901b9190911790600101611853565b5061ffff8116156118c25760405162461bcd60e51b815260040161032d90612acc565b5f805b600481101561191d576118d9816003612a8e565b6118e4906008612aa1565b63ffffffff16876118f68360026128f0565b8151811061190657611906612ab8565b016020015160f81c901b91909117906001016118c5565b5063ffffffff81166001146119445760405162461bcd60e51b815260040161032d90612b0f565b5f805b60208110156119995761195b81601f612a8e565b611966906008612aa1565b886119728360066128f0565b8151811061198257611982612ab8565b016020015160f81c901b9190911790600101611947565b505f805b60088110156119f8576119b1816007612a8e565b6119bc906008612aa1565b6001600160401b0316896119d18360266128f0565b815181106119e1576119e1612ab8565b016020015160f81c901b919091179060010161199d565b505f805b6008811015611a5757611a10816007612a8e565b611a1b906008612aa1565b6001600160401b03168a611a3083602e6128f0565b81518110611a4057611a40612ab8565b016020015160f81c901b91909117906001016119fc565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611aab57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612c3a8339815191529060ff165f03611aef575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611b379083612a8e565b10611b53576001600160401b0384166040830152808252611b72565b8382604001818151611b659190612b56565b6001600160401b03169052505b5f826020015183604001516064611b899190612b7d565b611b939190612ba8565b600285015490915060ff9081169082161115611c0e5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161032d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611cbc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161032d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611d3357611cf3816001612a8e565b611cfe906008612aa1565b5081515f90839083908110611d1557611d15612ab8565b60200101906001600160f81b03191690815f1a905350600101611cdf565b505f5b6004811015611d9157611d4a816003612a8e565b611d55906008612aa1565b505f82611d638360026128f0565b81518110611d7357611d73612ab8565b60200101906001600160f81b03191690815f1a905350600101611d36565b505f5b6020811015611dee5784518160208110611db057611db0612ab8565b1a60f81b82611dc08360066128f0565b81518110611dd057611dd0612ab8565b60200101906001600160f81b03191690815f1a905350600101611d94565b505f5b6020811015611e4e5784602001518160208110611e1057611e10612ab8565b1a60f81b82611e208360266128f0565b81518110611e3057611e30612ab8565b60200101906001600160f81b03191690815f1a905350600101611df1565b505f5b6008811015611ec257611e65816007612a8e565b611e70906008612aa1565b60ff1685604001516001600160401b0316901c60f81b82826046611e9491906128f0565b81518110611ea457611ea4612ab8565b60200101906001600160f81b03191690815f1a905350600101611e51565b505f5b6030811015611f2d5784608001518181518110611ee457611ee4612ab8565b01602001516001600160f81b03191682611eff83604e6128f0565b81518110611f0f57611f0f612ab8565b60200101906001600160f81b03191690815f1a905350600101611ec5565b505f5b6008811015611f9f57611f44816007612a8e565b611f4f906008612aa1565b60608601516001600160401b0390811691161c60f81b82611f7183607e6128f0565b81518110611f8157611f81612ab8565b60200101906001600160f81b03191690815f1a905350600101611f30565b50600281604051611fb09190612bd9565b602060405180830381855afa158015611fcb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611fee9190612733565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060020180545f80516020612c3a83398151915291600160a01b9091046001600160401b0316908190601461205683612bf4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612124576120e4816001612a8e565b6120ef906008612aa1565b5081515f9083908390811061210657612106612ab8565b60200101906001600160f81b03191690815f1a9053506001016120d0565b505f5b60048110156121875761213b816003612a8e565b612146906008612aa1565b6001901c60f81b826121598360026128f0565b8151811061216957612169612ab8565b60200101906001600160f81b03191690815f1a905350600101612127565b505f5b60208110156121e95761219e81601f612a8e565b6121a9906008612aa1565b86901c60f81b826121bb8360066128f0565b815181106121cb576121cb612ab8565b60200101906001600160f81b03191690815f1a90535060010161218a565b505f5b600881101561225457612200816007612a8e565b61220b906008612aa1565b6001600160401b038616901c60f81b826122268360266128f0565b8151811061223657612236612ab8565b60200101906001600160f81b03191690815f1a9053506001016121ec565b505f5b60088110156122bf5761226b816007612a8e565b612276906008612aa1565b6001600160401b038516901c60f81b8261229183602e6128f0565b815181106122a1576122a1612ab8565b60200101906001600160f81b03191690815f1a905350600101612257565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103e657604051631afcd79f60e31b815260040160405180910390fd5b6123196122c8565b612321612343565b612329612353565b6103f18161235b565b61233a6122c8565b6103f1816123c7565b61234b6122c8565b6103e66123cf565b6103e66122c8565b6123636122c8565b80355f80516020612c3a83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123ad6060830160408401612c19565b600291909101805460ff191660ff90921691909117905550565b6107d76122c8565b6120856122c8565b5080546123e390612671565b5f825580601f106123f2575050565b601f0160209004905f5260205f20908101906103f191905b8082111561241d575f815560010161240a565b5090565b5f60208284031215612431575f80fd5b5035919050565b80356001600160401b038116811461244e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561248957612489612453565b60405290565b604051601f8201601f191681016001600160401b03811182821017156124b7576124b7612453565b604052919050565b5f6001600160401b038211156124d7576124d7612453565b50601f01601f191660200190565b5f805f80608085870312156124f8575f80fd5b61250185612438565b93506020850135925061251660408601612438565b915060608501356001600160401b03811115612530575f80fd5b8501601f81018713612540575f80fd5b803561255361254e826124bf565b61248f565b818152886020838501011115612567575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff8116811461244e575f80fd5b5f602082840312156125ab575f80fd5b6125b482612588565b9392505050565b6001600160a01b03811681146103f1575f80fd5b5f8082840360808112156125e1575f80fd5b60608112156125ee575f80fd5b508291506060830135612600816125bb565b809150509250929050565b5f6020828403121561261b575f80fd5b81356125b4816125bb565b80151581146103f1575f80fd5b5f8060408385031215612644575f80fd5b61264d83612588565b9150602083013561260081612626565b634e487b7160e01b5f52602160045260245ffd5b600181811c9082168061268557607f821691505b6020821081036126a357634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546126bb81612671565b806020870152604060018084165f81146126dc57600181146126f857612725565b60ff19851660408a0152604084151560051b8a01019550612725565b895f5260205f205f5b8581101561271c5781548b8201860152908301908801612701565b8a016040019650505b509398975050505050505050565b5f60208284031215612743575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f5b838110156127ab578181015183820152602001612793565b50505f910152565b805161244e81612626565b5f80604083850312156127cf575f80fd5b82516001600160401b03808211156127e5575f80fd5b90840190606082870312156127f8575f80fd5b612800612467565b82518152602080840151612813816125bb565b82820152604084015183811115612828575f80fd5b80850194505087601f85011261283c575f80fd5b8351925061284c61254e846124bf565b838152888285870101111561285f575f80fd5b61286e84838301848801612791565b806040840152508195506128838188016127b3565b9450505050509250929050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115612903576129036128dc565b92915050565b601f8211156106bc57805f5260205f20601f840160051c8101602085101561292e5750805b601f840160051c820191505b8181101561294d575f815560010161293a565b5050505050565b81516001600160401b0381111561296d5761296d612453565b6129818161297b8454612671565b84612909565b602080601f8311600181146129b4575f841561299d5750858301515b5f19600386901b1c1916600185901b178555612a0b565b5f85815260208120601f198616915b828110156129e2578886015182559484019460019091019084016129c3565b50858210156129ff57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f8251806020840152612a31816040850160208701612791565b601f01601f19169190910160400192915050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b81810381811115612903576129036128dc565b8082028115828204841417612903576129036128dc565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612b7657612b766128dc565b5092915050565b6001600160401b03818116838216028082169190828114612ba057612ba06128dc565b505092915050565b5f6001600160401b0380841680612bcd57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612bea818460208701612791565b9190910192915050565b5f6001600160401b03808316818103612c0f57612c0f6128dc565b6001019392505050565b5f60208284031215612c29575f80fd5b813560ff811681146125b4575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\"},{\"name\":\"setWeightMessageType\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeValidatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\"}],\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612edf380380612edf83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612d928061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c8063a3a65e481161006e578063a3a65e481461017a578063b771b3bc1461018d578063bee0a03f1461019b578063c151c0b9146101ae578063f2fde38b146101c1578063fdf94a1a146101d4575f80fd5b80630322ed98146100b55780633aaa9f25146100ca57806366435abf146100f0578063715018a61461011b5780638da5cb5b1461012357806397fb70d414610167575b5f80fd5b6100c86100c336600461252d565b6101e7565b005b6100dd6100d83660046125f1565b6103d8565b6040519081526020015b60405180910390f35b6101036100fe36600461252d565b6103f8565b6040516001600160401b0390911681526020016100e7565b6100c861040c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100e7565b6100c861017536600461252d565b61041f565b6100c86101883660046126a7565b61042b565b61014f6005600160991b0181565b6100c86101a936600461252d565b6105e4565b6100c86101bc3660046126db565b6106f8565b6100c86101cf366004612717565b610806565b6100c86101e236600461273f565b610840565b5f8181525f80516020612d668339815191526020526040808220815160e0810190925280545f80516020612d4683398151915293929190829060ff16600581111561023457610234612769565b600581111561024557610245612769565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916102cf9061277d565b90501180156102f057506003815160058111156102ee576102ee612769565b145b6103595760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161039291906004016127b5565b6020604051808303815f875af11580156103ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d2919061283f565b50505050565b5f6103e1610c52565b6103ed84868585610cad565b90505b949350505050565b5f610402826110f4565b6080015192915050565b610414610c52565b61041d5f6111ef565b565b6104288161125f565b50565b5f80516020612d468339815191525f610443836115ab565b90505f80610454836040015161178c565b91509150806104b65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610350565b5f828152600585016020526040812080546104d09061277d565b9050118015610502575060015f83815260078601602052604090205460ff16600581111561050057610500612769565b145b61051e5760405162461bcd60e51b815260040161035090612856565b5f8281526005850160205260408120610536916124e3565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612d4683398151915292919061062c9061277d565b905011801561065e575060015f83815260078301602052604090205460ff16600581111561065c5761065c612769565b145b61067a5760405162461bcd60e51b815260040161035090612856565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916106b391906004016127b5565b6020604051808303815f875af11580156106cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f3919061283f565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561073c5750825b90505f826001600160401b031660011480156107575750303b155b905081158015610765575080155b156107835760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156107ad57845460ff60401b1916600160401b1785555b6107b7878761192d565b83156107fd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61080e610c52565b6001600160a01b03811661083757604051631e4fbdf760e01b81525f6004820152602401610350565b610428816111ef565b5f5f80516020612d468339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561089b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108c291908101906128ca565b91509150806109225760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610350565b5f84156109a6575f610937846040015161194b565b919350909150506001600160401b038116156109a05760405162461bcd60e51b815260206004820152602260248201527f56616c696461746f724d616e616765723a20576569676874206d757374206265604482015261020360f41b6064820152608401610350565b50610a1c565b5f6109b4846040015161178c565b90925090508015610a1a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610350565b505b5f818152600785016020526040808220815160e081019092528054829060ff166005811115610a4d57610a4d612769565b6005811115610a5e57610a5e612769565b81526001820154602082015260028201546001600160a01b03808216604080850191909152600160a01b9092046001600160401b0390811660608501526003909401548085166080850152600160401b8104851660a0850152600160801b900490931660c090920191909152820151919250163314610aef5760405162461bcd60e51b81526004016103509061299c565b5f600382516005811115610b0557610b05612769565b1480610b235750600282516005811115610b2157610b21612769565b145b15610b4657506020808201515f9081526008870190915260408120556004610b4a565b5060055b5f83815260078701602052604090208251815484929190829060ff19166001836005811115610b7b57610b7b612769565b02179055506020820151600182015560408083015160028301805460608601516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808401516003909301805460a086015160c0909601519483166001600160801b031990911617600160401b958316959095029490941767ffffffffffffffff60801b1916600160801b9390911692909202919091179091555183907f3532ad18e70a039beb4663d48c15acbef558c96ec9b8fd0cc3c0304f774740b8905f90a25050505050505050565b33610c847f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461041d5760405163118cdaa760e01b8152336004820152602401610350565b5f610cb6611b86565b5f80516020612d46833981519152426001600160401b038516118015610cf057506001600160401b038416610cee426202a3006129fc565b115b610d525760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610350565b85610da95760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20496e76616c6964206e6f646520496044820152601160fa1b6064820152608401610350565b5f86815260088201602052604090205415610e175760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a204e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610350565b8251603014610e7e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610350565b610e8785611bd0565b5f80610ece6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611d71565b5f82815260058601602052604090209193509150610eec8282612a60565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610f19908590600401612b1f565b6020604051808303815f875af1158015610f35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f59919061283f565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115610fd257610fd2612769565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561107b83612116565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103f060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020612d6683398151915290528390208351918201909352825491925f80516020612d4683398151915292829060ff16600581111561117457611174612769565b600581111561118557611185612769565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181525f80516020612d668339815191526020526040808220815160e0810190925280545f80516020612d4683398151915293929190829060ff1660058111156112ac576112ac612769565b60058111156112bd576112bd612769565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561133757611337612769565b146113935760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610350565b60408101516001600160a01b0316336001600160a01b0316146113c85760405162461bcd60e51b81526004016103509061299c565b6113d58160800151611bd0565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561141957611419612769565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6114cd846114c781612116565b5f6121b7565b5f85815260068501602052604090209091506114e98282612a60565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611516908590600401612b1f565b6020604051808303815f875af1158015611532573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611556919061283f565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612d468339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611620573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261164791908101906128ca565b91509150806116ae5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610350565b82548251146117115760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610350565b60208201516001600160a01b0316156117845760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610350565b509392505050565b5f8082516027146117af5760405162461bcd60e51b815260040161035090612b51565b5f805b60028110156117fe576117c6816001612b9a565b6117d1906008612bad565b61ffff168582815181106117e7576117e7612bc4565b016020015160f81c901b91909117906001016117b2565b5061ffff8116156118215760405162461bcd60e51b815260040161035090612bd8565b5f805b600481101561187c57611838816003612b9a565b611843906008612bad565b63ffffffff16866118558360026129fc565b8151811061186557611865612bc4565b016020015160f81c901b9190911790600101611824565b5063ffffffff81166002146118a35760405162461bcd60e51b815260040161035090612c1b565b5f805b60208110156118f8576118ba81601f612b9a565b6118c5906008612bad565b876118d18360066129fc565b815181106118e1576118e1612bc4565b016020015160f81c901b91909117906001016118a6565b505f8660268151811061190d5761190d612bc4565b016020015191976001600160f81b03199092161515965090945050505050565b6119356123d4565b61193e8261241d565b6119478161243e565b5050565b5f805f835160361461196f5760405162461bcd60e51b815260040161035090612b51565b5f805b60028110156119be57611986816001612b9a565b611991906008612bad565b61ffff168682815181106119a7576119a7612bc4565b016020015160f81c901b9190911790600101611972565b5061ffff8116156119e15760405162461bcd60e51b815260040161035090612bd8565b5f805b6004811015611a3c576119f8816003612b9a565b611a03906008612bad565b63ffffffff1687611a158360026129fc565b81518110611a2557611a25612bc4565b016020015160f81c901b91909117906001016119e4565b5063ffffffff8116600114611a635760405162461bcd60e51b815260040161035090612c1b565b5f805b6020811015611ab857611a7a81601f612b9a565b611a85906008612bad565b88611a918360066129fc565b81518110611aa157611aa1612bc4565b016020015160f81c901b9190911790600101611a66565b505f805b6008811015611b1757611ad0816007612b9a565b611adb906008612bad565b6001600160401b031689611af08360266129fc565b81518110611b0057611b00612bc4565b016020015160f81c901b9190911790600101611abc565b505f805b6008811015611b7657611b2f816007612b9a565b611b3a906008612bad565b6001600160401b03168a611b4f83602e6129fc565b81518110611b5f57611b5f612bc4565b016020015160f81c901b9190911790600101611b1b565b5091989097509095509350505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611bca57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612d468339815191529060ff165f03611c0e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611c569083612b9a565b10611c72576001600160401b0384166040830152808252611c91565b8382604001818151611c849190612c62565b6001600160401b03169052505b5f826020015183604001516064611ca89190612c89565b611cb29190612cb4565b600285015490915060ff9081169082161115611d2d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a204d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610350565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611ddb5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20496e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610350565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e5257611e12816001612b9a565b611e1d906008612bad565b5081515f90839083908110611e3457611e34612bc4565b60200101906001600160f81b03191690815f1a905350600101611dfe565b505f5b6004811015611eb057611e69816003612b9a565b611e74906008612bad565b505f82611e828360026129fc565b81518110611e9257611e92612bc4565b60200101906001600160f81b03191690815f1a905350600101611e55565b505f5b6020811015611f0d5784518160208110611ecf57611ecf612bc4565b1a60f81b82611edf8360066129fc565b81518110611eef57611eef612bc4565b60200101906001600160f81b03191690815f1a905350600101611eb3565b505f5b6020811015611f6d5784602001518160208110611f2f57611f2f612bc4565b1a60f81b82611f3f8360266129fc565b81518110611f4f57611f4f612bc4565b60200101906001600160f81b03191690815f1a905350600101611f10565b505f5b6008811015611fe157611f84816007612b9a565b611f8f906008612bad565b60ff1685604001516001600160401b0316901c60f81b82826046611fb391906129fc565b81518110611fc357611fc3612bc4565b60200101906001600160f81b03191690815f1a905350600101611f70565b505f5b603081101561204c578460800151818151811061200357612003612bc4565b01602001516001600160f81b0319168261201e83604e6129fc565b8151811061202e5761202e612bc4565b60200101906001600160f81b03191690815f1a905350600101611fe4565b505f5b60088110156120be57612063816007612b9a565b61206e906008612bad565b60608601516001600160401b0390811691161c60f81b8261209083607e6129fc565b815181106120a0576120a0612bc4565b60200101906001600160f81b03191690815f1a90535060010161204f565b506002816040516120cf9190612ce5565b602060405180830381855afa1580156120ea573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061210d919061283f565b94909350915050565b5f8181525f80516020612d668339815191526020526040812060020180545f80516020612d4683398151915291600160a01b9091046001600160401b0316908190601461216283612d00565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612230576121f0816001612b9a565b6121fb906008612bad565b5081515f9083908390811061221257612212612bc4565b60200101906001600160f81b03191690815f1a9053506001016121dc565b505f5b600481101561229357612247816003612b9a565b612252906008612bad565b6001901c60f81b826122658360026129fc565b8151811061227557612275612bc4565b60200101906001600160f81b03191690815f1a905350600101612233565b505f5b60208110156122f5576122aa81601f612b9a565b6122b5906008612bad565b86901c60f81b826122c78360066129fc565b815181106122d7576122d7612bc4565b60200101906001600160f81b03191690815f1a905350600101612296565b505f5b60088110156123605761230c816007612b9a565b612317906008612bad565b6001600160401b038616901c60f81b826123328360266129fc565b8151811061234257612342612bc4565b60200101906001600160f81b03191690815f1a9053506001016122f8565b505f5b60088110156123cb57612377816007612b9a565b612382906008612bad565b6001600160401b038516901c60f81b8261239d83602e6129fc565b815181106123ad576123ad612bc4565b60200101906001600160f81b03191690815f1a905350600101612363565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661041d57604051631afcd79f60e31b815260040160405180910390fd5b6124256123d4565b61242d61244f565b61243561245f565b61042881612467565b6124466123d4565b610428816124d3565b6124576123d4565b61041d6124db565b61041d6123d4565b61246f6123d4565b80355f80516020612d4683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556124b96060830160408401612d25565b600291909101805460ff191660ff90921691909117905550565b61080e6123d4565b6121916123d4565b5080546124ef9061277d565b5f825580601f106124fe575050565b601f0160209004905f5260205f209081019061042891905b80821115612529575f8155600101612516565b5090565b5f6020828403121561253d575f80fd5b5035919050565b80356001600160401b038116811461255a575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156125955761259561255f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156125c3576125c361255f565b604052919050565b5f6001600160401b038211156125e3576125e361255f565b50601f01601f191660200190565b5f805f8060808587031215612604575f80fd5b61260d85612544565b93506020850135925061262260408601612544565b915060608501356001600160401b0381111561263c575f80fd5b8501601f8101871361264c575f80fd5b803561265f61265a826125cb565b61259b565b818152886020838501011115612673575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b803563ffffffff8116811461255a575f80fd5b5f602082840312156126b7575f80fd5b6126c082612694565b9392505050565b6001600160a01b0381168114610428575f80fd5b5f8082840360808112156126ed575f80fd5b60608112156126fa575f80fd5b50829150606083013561270c816126c7565b809150509250929050565b5f60208284031215612727575f80fd5b81356126c0816126c7565b8015158114610428575f80fd5b5f8060408385031215612750575f80fd5b61275983612694565b9150602083013561270c81612732565b634e487b7160e01b5f52602160045260245ffd5b600181811c9082168061279157607f821691505b6020821081036127af57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546127c78161277d565b806020870152604060018084165f81146127e8576001811461280457612831565b60ff19851660408a0152604084151560051b8a01019550612831565b895f5260205f205f5b858110156128285781548b820186015290830190880161280d565b8a016040019650505b509398975050505050505050565b5f6020828403121561284f575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20496e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f5b838110156128b757818101518382015260200161289f565b50505f910152565b805161255a81612732565b5f80604083850312156128db575f80fd5b82516001600160401b03808211156128f1575f80fd5b9084019060608287031215612904575f80fd5b61290c612573565b8251815260208084015161291f816126c7565b82820152604084015183811115612934575f80fd5b80850194505087601f850112612948575f80fd5b8351925061295861265a846125cb565b838152888285870101111561296b575f80fd5b61297a8483830184880161289d565b8060408401525081955061298f8188016128bf565b9450505050509250929050565b6020808252602c908201527f56616c696461746f724d616e616765723a2053656e646572206e6f742076616c60408201526b34b230ba37b91037bbb732b960a11b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115612a0f57612a0f6129e8565b92915050565b601f8211156106f357805f5260205f20601f840160051c81016020851015612a3a5750805b601f840160051c820191505b81811015612a59575f8155600101612a46565b5050505050565b81516001600160401b03811115612a7957612a7961255f565b612a8d81612a87845461277d565b84612a15565b602080601f831160018114612ac0575f8415612aa95750858301515b5f19600386901b1c1916600185901b178555612b17565b5f85815260208120601f198616915b82811015612aee57888601518255948401946001909101908401612acf565b5085821015612b0b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f8251806020840152612b3d81604085016020870161289d565b601f01601f19169190910160400192915050565b60208082526029908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b81810381811115612a0f57612a0f6129e8565b8082028115828204841417612a0f57612a0f6129e8565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20496e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20496e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115612c8257612c826129e8565b5092915050565b6001600160401b03818116838216028082169190828114612cac57612cac6129e8565b505092915050565b5f6001600160401b0380841680612cd957634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612cf681846020870161289d565b9190910192915050565b5f6001600160401b03808316818103612d1b57612d1b6129e8565b6001019392505050565b5f60208284031215612d35575f80fd5b813560ff811681146126c0575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -240,6 +240,37 @@ func (_PoAValidatorManager *PoAValidatorManagerCallerSession) WARPMESSENGER() (c return _PoAValidatorManager.Contract.WARPMESSENGER(&_PoAValidatorManager.CallOpts) } +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerCaller) GetWeight(opts *bind.CallOpts, validationID [32]byte) (uint64, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "getWeight", validationID) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerSession) GetWeight(validationID [32]byte) (uint64, error) { + return _PoAValidatorManager.Contract.GetWeight(&_PoAValidatorManager.CallOpts, validationID) +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) GetWeight(validationID [32]byte) (uint64, error) { + return _PoAValidatorManager.Contract.GetWeight(&_PoAValidatorManager.CallOpts, validationID) +} + // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) From 31113ad3e0696a1a0c7fa6a489ab0f5a08b8cab9 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 29 Aug 2024 16:46:06 -0500 Subject: [PATCH 166/545] remove ordering test --- .../tests/PoSValidatorManagerTests.t.sol | 133 ++++-------------- 1 file changed, 25 insertions(+), 108 deletions(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index b218fe67d..1a17f075b 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -351,116 +351,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { DEFAULT_WEIGHT, 2 ); - - bytes memory weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( - validationID, 2, DEFAULT_WEIGHT - ); - _mockGetVerifiedWarpMessage(weightUpdateMessage, true); - - vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, DEFAULT_DELEGATOR_ADDRESS, 2); - posValidatorManager.completeEndDelegation(0, DEFAULT_DELEGATOR_ADDRESS); - require( - posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, - "PoSValidatorManagerTest: invalid weight" - ); - } - - function testCompleteEndMultipleDelegations() public {} - - // Ensures that the behavior is the same regardless of delisting order - function testCompleteEndMultipleDelegationsOutOfOrder() public { - uint64 weight1 = 2e5; - address delegator1 = address(0x1234123412341234123412341234123412341234); - uint64 weight2 = 3e5; - address delegator2 = address(0x5678567856785678567856785678567856785678); - - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); - - // Register two delegators - _setUpInitializeDelegatorRegistration( - validationID, - delegator1, - weight1, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_WEIGHT + weight1, - 1 - ); - _setUpCompleteDelegatorRegistration( - validationID, - delegator1, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_WEIGHT + weight1, - 1 - ); - _setUpInitializeDelegatorRegistration( - validationID, - delegator2, - weight2, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, - DEFAULT_WEIGHT + weight1 + weight2, - 2 - ); - _setUpCompleteDelegatorRegistration( - validationID, - delegator2, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + 1, - DEFAULT_WEIGHT + weight1 + weight2, - 2 - ); - - // Delist them in the opposite order, - _setUpInitializeEndDelegation( - validationID, - delegator2, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - DEFAULT_WEIGHT + weight1, - 3 - ); - _setUpInitializeEndDelegation( + _setupCompleteEndDelegation( validationID, - delegator1, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, + DEFAULT_DELEGATOR_ADDRESS, DEFAULT_WEIGHT, - 4 - ); - - // Receive the weight update message for the second delegator first - // This should include the weight updates for both delegators delisting - bytes memory weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( - validationID, 4, DEFAULT_WEIGHT - ); - _mockGetVerifiedWarpMessage(weightUpdateMessage, true); - - vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, delegator2, 4); - posValidatorManager.completeEndDelegation(0, delegator2); - require( - posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, - "PoSValidatorManagerTest: invalid weight" - ); - - // Receive the weight update message for the first delegator. - // The specified weight should still include the second delegator's weight, - // but the validator weight will not be updated since we've already received a higher nonce - weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( - validationID, 3, DEFAULT_WEIGHT + weight2 - ); - _mockGetVerifiedWarpMessage(weightUpdateMessage, true); - - vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, delegator1, 3); - posValidatorManager.completeEndDelegation(0, delegator1); - require( - posValidatorManager.getWeight(validationID) == DEFAULT_WEIGHT, - "PoSValidatorManagerTest: invalid weight" + DEFAULT_WEIGHT, + 2 ); } @@ -576,6 +472,27 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { return validationID; } + function _setupCompleteEndDelegation( + bytes32 validationID, + address delegator, + uint64 validatorWeight, + uint64 expectedValidatorWeight, + uint64 expectedNonce + ) internal returns (bytes32) { + bytes memory weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( + validationID, expectedNonce, validatorWeight + ); + _mockGetVerifiedWarpMessage(weightUpdateMessage, true); + + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit DelegationEnded(validationID, delegator, expectedNonce); + posValidatorManager.completeEndDelegation(0, delegator); + require( + posValidatorManager.getWeight(validationID) == expectedValidatorWeight, + "PoSValidatorManagerTest: invalid weight" + ); + } + function _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { return abi.encodePacked("PoSValidatorManager: ", errorMessage); } From 94d4c1f57cf71944c39b11ce86fa189f0d0c6ed0 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 29 Aug 2024 16:49:12 -0500 Subject: [PATCH 167/545] format+lint --- .../tests/PoSValidatorManagerTests.t.sol | 107 +++++++++--------- 1 file changed, 52 insertions(+), 55 deletions(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 1a17f075b..36ff6a09c 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -189,14 +189,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - DEFAULT_DELEGATOR_WEIGHT, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); } function testResendDelegatorRegistration() public { @@ -208,14 +208,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - DEFAULT_DELEGATOR_WEIGHT, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage( validationID, 1, DEFAULT_WEIGHT + DEFAULT_DELEGATOR_WEIGHT @@ -233,14 +233,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - DEFAULT_DELEGATOR_WEIGHT, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); _setUpCompleteDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, @@ -259,14 +259,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - DEFAULT_DELEGATOR_WEIGHT, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); _setUpCompleteDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, @@ -292,14 +292,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - DEFAULT_DELEGATOR_WEIGHT, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); _setUpCompleteDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, @@ -329,14 +329,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - DEFAULT_DELEGATOR_WEIGHT, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); _setUpCompleteDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, @@ -352,11 +352,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { 2 ); _setupCompleteEndDelegation( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - DEFAULT_WEIGHT, - DEFAULT_WEIGHT, - 2 + validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2 ); } @@ -393,7 +389,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // // Delegation setup utilities // - function _setUpInitializeDelegatorRegistration( bytes32 validationID, address delegator, @@ -431,7 +426,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 expectedNonce ) internal returns (bytes32) { bytes memory setValidatorWeightPayload = ValidatorMessages - .packSubnetValidatorWeightUpdateMessage(validationID, expectedNonce, expectedValidatorWeight); + .packSubnetValidatorWeightUpdateMessage( + validationID, expectedNonce, expectedValidatorWeight + ); _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); vm.warp(completeRegistrationTimestamp); From 036bfa65acd7a238238a0e0f34c8c0fd242571a3 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 29 Aug 2024 17:08:45 -0500 Subject: [PATCH 168/545] assert instead of require --- contracts/staking/tests/PoSValidatorManagerTests.t.sol | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 36ff6a09c..c3c15769e 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -484,10 +484,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegationEnded(validationID, delegator, expectedNonce); posValidatorManager.completeEndDelegation(0, delegator); - require( - posValidatorManager.getWeight(validationID) == expectedValidatorWeight, - "PoSValidatorManagerTest: invalid weight" - ); + assertEq(posValidatorManager.getWeight(validationID), expectedValidatorWeight); + return validationID; } function _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { From 595bef244fbf5301a98da76036e579eed3bc1ede Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 29 Aug 2024 18:22:18 -0400 Subject: [PATCH 169/545] Update contracts/staking/README.md Co-authored-by: minghinmatthewlam Signed-off-by: Geoff Stuart --- contracts/staking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/README.md b/contracts/staking/README.md index febf54482..5eb7bc030 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -38,7 +38,7 @@ The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload ACP-77 also provides a method to disable a validator without interacting with the Subnet directly. The P-Chain transaction [`DisableValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#disablevalidatortx) disables the validator on the P-Chain. The disabled validator's weight will still count towards the Subnet's total weight. -Disabled Subnet Validators can re-activate at any time by increasing their balance with an `IncreaseBalanceTx`. Anyone can call `IncreaseBalanceTx` for any validator on the P-Chain. A disabled validator can only be totally removed from the validator set by a call to `initializeEndValidation`. +Disabled Subnet validators can re-activate at any time by increasing their balance with an `IncreaseBalanceTx`. Anyone can call `IncreaseBalanceTx` for any validator on the P-Chain. A disabled validator can only be totally removed from the validator set by a call to `initializeEndValidation`. ## Warp Message Format Reference From a3b9d9fa67b8d0ad1e5f2e00783790783d92fa74 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 30 Aug 2024 09:41:55 -0500 Subject: [PATCH 170/545] update readme --- contracts/staking/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/README.md b/contracts/staking/README.md index 5eb7bc030..688f53da3 100644 --- a/contracts/staking/README.md +++ b/contracts/staking/README.md @@ -32,7 +32,7 @@ In the case of a missed expiry, the `RegisterSubnetValidatorTx` will result in a Validator exit is initiated with a call to `initializeEndValidation` on the Validator Manager contract. For PoS Validator Managers, a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message may optionally be provided in order to calculate the staking rewards; otherwise the validator's uptime will be set to `0`. This proof may be requested from the P-Chain, which will provide it in a `ValidationUptimeMessage` Warp message. Once `initializeEndValidation` is called, staking rewards cease accruing for PoS Validator Managers: the Validator Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. -The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The P-Chain acknowledges validator exit by signing either a `SetSubnetValidatorWeightMessage` with the `weight=0`, or a `SubnetValidatorRegistrationMessage` with `valid=0`. `completeEndValidation` is then called on the Validator Manager contract, with `setWeightMessageType` set according to the Warp message type being delivered. The validation is removed from the contract's state, and for PoS Validator Managers, staking rewards are disbursed and stake is returned. +The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The P-Chain acknowledges validator exit by signing a `SubnetValidatorRegistrationMessage` with `valid=0`, which is delivered to the Validator Manager by calling `completeEndValidation`. The validation is removed from the contract's state, and for PoS Validator Managers, staking rewards are disbursed and stake is returned. #### Disable a Validator Directly on the P-Chain From 221e58864515794ceb866f0030852b5214fc8a7c Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 30 Aug 2024 15:04:25 -0500 Subject: [PATCH 171/545] delete pending complete msg --- contracts/staking/ValidatorManager.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index be7061391..3b91bc610 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -247,11 +247,10 @@ abstract contract ValidatorManager is // solhint-disable-next-line function resendEndValidatorMessage(bytes32 validationID) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - Validator memory validator = $._validationPeriods[validationID]; require( $._pendingEndValidationMessages[validationID].length > 0 - && validator.status == ValidatorStatus.PendingRemoved, + && $._validationPeriods[validationID].status == ValidatorStatus.PendingRemoved, "ValidatorManager: Validator not pending removal" ); @@ -288,6 +287,7 @@ abstract contract ValidatorManager is if (validator.status == ValidatorStatus.PendingRemoved) { endStatus = ValidatorStatus.Completed; + delete $._pendingEndValidationMessages[validationID]; } else { endStatus = ValidatorStatus.Invalidated; } From 66ba7923af8c36b2f447aebc9f1237f3421cb1f7 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 30 Aug 2024 15:08:30 -0500 Subject: [PATCH 172/545] bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- .../go/staking/PoAValidatorManager/PoAValidatorManager.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index b313a6c0d..633a7a883 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516146bc3803806146bc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61456f8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80636a7e3d831161009e5780639e1bc4ef1161006e5780639e1bc4ef1461021b578063a3a65e481461022e578063b771b3bc14610241578063bee0a03f14610267578063d61bed741461027a575f80fd5b80636a7e3d83146101cf57806376f78621146101e2578063872fda64146101f5578063927e7e7514610208575f80fd5b80632e2194d8116100d95780632e2194d814610158578063467ef06f14610188578063620658561461019b57806366435abf146101bc575f80fd5b80630322ed981461010a5780630915204e1461011f5780630b77f6931461013257806327f39ca814610145575b5f80fd5b61011d610118366004613b30565b61028d565b005b61011d61012d366004613b73565b61047e565b61011d610140366004613ba8565b610594565b61011d610153366004613bcb565b610616565b61016b610166366004613b30565b610724565b6040516001600160401b0390911681526020015b60405180910390f35b61011d610196366004613bfd565b61073a565b6101ae6101a9366004613c33565b610b91565b60405190815260200161017f565b61016b6101ca366004613b30565b610baa565b61011d6101dd366004613ba8565b610bbe565b61011d6101f0366004613c59565b610c40565b6101ae610203366004613d26565b610f5e565b61011d610216366004613b30565b610f83565b61011d610229366004613dc2565b611343565b61011d61023c366004613bfd565b611352565b61024f6005600160991b0181565b6040516001600160a01b03909116815260200161017f565b61011d610275366004613b30565b61150b565b61011d610288366004613b73565b61161a565b5f8181525f805160206145438339815191526020526040808220815160e0810190925280545f8051602061450383398151915293929190829060ff1660058111156102da576102da613de2565b60058111156102eb576102eb613de2565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f868152600686019091529081208054929350909161037590613df6565b9050118015610396575060038151600581111561039457610394613de2565b145b6103ff5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916104389190600401613e2e565b6020604051808303815f875af1158015610454573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104789190613eb8565b50505050565b5f805160206144e38339815191525f6104968461175f565b90505f806104a783604001516118b6565b50915091506104b68286611af1565b5f82815260068501602090815260408083206001600160a01b038916845290915281206104e291613ae6565b5f6104ec83611c02565b9050816001600160401b031681606001516001600160401b031610156105245760405162461bcd60e51b81526004016103f690613ecf565b5f83815260048601602090815260408083206001600160a01b038a168085529252808320805460ff60c01b1916600160c21b179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b61059e8282611cfd565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206144e3833981519152916005600160991b019163ee5b48eb9161043891600401613e2e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561065a5750825b90505f826001600160401b031660011480156106755750303b155b905081158015610683575080155b156106a15760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156106cb57845460ff60401b1916600160401b1785555b6106d58787611e19565b831561071b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61073464e8d4a5100083613f39565b92915050565b5f5f805160206145038339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610795573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526107bc9190810190613f79565b915091508061081c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103f6565b825482511461083d5760405162461bcd60e51b81526004016103f69061404b565b60208201516001600160a01b0316156108685760405162461bcd60e51b81526004016103f690614094565b5f806108778460400151611e33565b9150915080156108dc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f6565b5f828152600786016020526040808220815160e081019092528054829060ff16600581111561090d5761090d613de2565b600581111561091e5761091e613de2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561099757610997613de2565b14806109b557506001825160058111156109b3576109b3613de2565b145b610a145760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103f6565b600382516005811115610a2957610a29613de2565b03610a3657506004610a3a565b5060055b6020808301515f90815260088901909152604081205581816005811115610a6357610a63613de2565b90816005811115610a7657610a76613de2565b9052505f84815260078801602052604090208251815484929190829060ff19166001836005811115610aaa57610aaa613de2565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610b5d57610b5d613de2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a35050505050505050565b5f6107346001600160401b03831664e8d4a510006140e3565b5f610bb482611c02565b6080015192915050565b610bc88282611af1565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206144e3833981519152916005600160991b019163ee5b48eb9161043891600401613e2e565b8115610f50575f5f805160206144e38339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610ca1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cc89190810190613f79565b9150915080610d2b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103f6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d929190613eb8565b825114610df65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103f6565b60208201516001600160a01b031615610e6c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103f6565b5f80610e7b8460400151611fd4565b91509150818814610ee85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103f6565b5f888152600786016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610f59836121ac565b505050565b5f80610f69866124fe565b9050610f77858286866125ab565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f805160206144e383398151915293926060830190600160c01b900460ff16600481111561102257611022613de2565b600481111561103357611033613de2565b905250905060028160600151600481111561105057611050613de2565b146110ac5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b60648201526084016103f6565b60036060820181905250426001600160401b03166040828101919091525f848152600484016020529081208291336001600160a01b0316815260208082019290925260409081015f208351815493850151928501516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990961691909216179390931791821683178155606084015190929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600481111561117f5761117f613de2565b02179055509050505f61119184611c02565b9050815f01516001600160401b031681608001516001600160401b0316116112075760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016103f6565b815160808201805161121a9083906140fa565b6001600160401b031690525061123084826129df565b5f61123a85612ace565b90505f61124c86838560800151612b49565b5f87815260068701602090815260408083203384529091529020909150611273828261416c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112a090859060040161422b565b6020604051808303815f875af11580156112bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e09190613eb8565b6080850151604080516001600160401b039283168152918616602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b61134e823383612d66565b5050565b5f805160206145038339815191525f61136a8361175f565b90505f8061137b8360400151611e33565b91509150806113dd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f6565b5f828152600585016020526040812080546113f790613df6565b9050118015611429575060015f83815260078601602052604090205460ff16600581111561142757611427613de2565b145b6114455760405162461bcd60e51b81526004016103f69061425d565b5f828152600585016020526040812061145d91613ae6565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061450383398151915292919061155390613df6565b9050118015611585575060015f83815260078301602052604090205460ff16600581111561158357611583613de2565b145b6115a15760405162461bcd60e51b81526004016103f69061425d565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916115da9190600401613e2e565b6020604051808303815f875af11580156115f6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f599190613eb8565b5f805160206144e38339815191525f6116328461175f565b90505f8061164383604001516118b6565b50915091506116528286611cfd565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061167e91613ae6565b5f61168883611c02565b9050816001600160401b031681606001516001600160401b031610156116c05760405162461bcd60e51b81526004016103f690613ecf565b5f83815260048601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160401b0278ff0000000000000000ffffffffffffffff00000000000000001990971696909617600160c11b179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101611332565b60408051606080820183525f8083526020830181905292820152905f805160206145038339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156117d4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117fb9190810190613f79565b91509150806118625760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f6565b82548251146118835760405162461bcd60e51b81526004016103f69061404b565b60208201516001600160a01b0316156118ae5760405162461bcd60e51b81526004016103f690614094565b509392505050565b5f805f83516036146118da5760405162461bcd60e51b81526004016103f6906142a4565b5f805b6002811015611929576118f18160016142ed565b6118fc9060086140e3565b61ffff1686828151811061191257611912614300565b016020015160f81c901b91909117906001016118dd565b5061ffff81161561194c5760405162461bcd60e51b81526004016103f690614314565b5f805b60048110156119a7576119638160036142ed565b61196e9060086140e3565b63ffffffff1687611980836002614357565b8151811061199057611990614300565b016020015160f81c901b919091179060010161194f565b5063ffffffff81166003146119ce5760405162461bcd60e51b81526004016103f69061436a565b5f805b6020811015611a23576119e581601f6142ed565b6119f09060086140e3565b886119fc836006614357565b81518110611a0c57611a0c614300565b016020015160f81c901b91909117906001016119d1565b505f805b6008811015611a8257611a3b8160076142ed565b611a469060086140e3565b6001600160401b031689611a5b836026614357565b81518110611a6b57611a6b614300565b016020015160f81c901b9190911790600101611a27565b505f805b6008811015611ae157611a9a8160076142ed565b611aa59060086140e3565b6001600160401b03168a611aba83602e614357565b81518110611aca57611aca614300565b016020015160f81c901b9190911790600101611a86565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f805160206144e3833981519152929190611b4d90613df6565b9050118015611b9b575060035f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611b9957611b99613de2565b145b610f595760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016103f6565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061454383398151915290528390208351918201909352825491925f8051602061450383398151915292829060ff166005811115611c8257611c82613de2565b6005811115611c9357611c93613de2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206144e3833981519152929190611d5990613df6565b9050118015611da7575060015f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611da557611da5613de2565b145b610f595760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016103f6565b611e216130ab565b611e2a826130f6565b61134e8161313c565b5f808251602714611e565760405162461bcd60e51b81526004016103f6906142a4565b5f805b6002811015611ea557611e6d8160016142ed565b611e789060086140e3565b61ffff16858281518110611e8e57611e8e614300565b016020015160f81c901b9190911790600101611e59565b5061ffff811615611ec85760405162461bcd60e51b81526004016103f690614314565b5f805b6004811015611f2357611edf8160036142ed565b611eea9060086140e3565b63ffffffff1686611efc836002614357565b81518110611f0c57611f0c614300565b016020015160f81c901b9190911790600101611ecb565b5063ffffffff8116600214611f4a5760405162461bcd60e51b81526004016103f69061436a565b5f805b6020811015611f9f57611f6181601f6142ed565b611f6c9060086140e3565b87611f78836006614357565b81518110611f8857611f88614300565b016020015160f81c901b9190911790600101611f4d565b505f86602681518110611fb457611fb4614300565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14611ff75760405162461bcd60e51b81526004016103f6906142a4565b5f805b60028110156120465761200e8160016142ed565b6120199060086140e3565b61ffff1685828151811061202f5761202f614300565b016020015160f81c901b9190911790600101611ffa565b5061ffff8116156120695760405162461bcd60e51b81526004016103f690614314565b5f805b60048110156120c4576120808160036142ed565b61208b9060086140e3565b63ffffffff168661209d836002614357565b815181106120ad576120ad614300565b016020015160f81c901b919091179060010161206c565b5063ffffffff81166004146120eb5760405162461bcd60e51b81526004016103f69061436a565b5f805b60208110156121405761210281601f6142ed565b61210d9060086140e3565b87612119836006614357565b8151811061212957612129614300565b016020015160f81c901b91909117906001016120ee565b505f805b600881101561219f576121588160076142ed565b6121639060086140e3565b6001600160401b031688612178836026614357565b8151811061218857612188614300565b016020015160f81c901b9190911790600101612144565b5090969095509350505050565b5f8181525f805160206145438339815191526020526040808220815160e0810190925280545f8051602061450383398151915293929190829060ff1660058111156121f9576121f9613de2565b600581111561220a5761220a613de2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561228457612284613de2565b146122a15760405162461bcd60e51b81526004016103f6906143b1565b60408101516001600160a01b0316336001600160a01b03161461231b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103f6565b61232881608001516131f0565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561236c5761236c613de2565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124208461241a81612ace565b5f612b49565b5f858152600685016020526040902090915061243c828261416c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061246990859060040161422b565b6020604051808303815f875af1158015612485573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124a99190613eb8565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206144e38339815191528161251784613391565b90505f61252382610724565b83549091506001600160401b0382161080159061254d57508260010154816001600160401b031611155b610f7b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103f6565b5f6125b46133c7565b5f80516020614503833981519152426001600160401b0385161180156125ee57506001600160401b0384166125ec426202a300614357565b115b6126505760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103f6565b856126a75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f6565b5f868152600882016020526040902054156127155760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f6565b825160301461277c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f6565b612785856131f0565b5f806127cc6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506133fe565b5f828152600586016020526040902091935091506127ea828261416c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061281790859060040161422b565b6020604051808303815f875af1158015612833573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128579190613eb8565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156128d0576128d0613de2565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561297983612ace565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610f7b60015f8051602061452383398151915255565b5f8281525f8051602061454383398151915260205260409020815181545f805160206145038339815191529284929091829060ff19166001836005811115612a2957612a29613de2565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f8181525f805160206145438339815191526020526040812060020180545f8051602061450383398151915291600160a01b9091046001600160401b03169081906014612b1a836143f7565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612bc257612b828160016142ed565b612b8d9060086140e3565b5081515f90839083908110612ba457612ba4614300565b60200101906001600160f81b03191690815f1a905350600101612b6e565b505f5b6004811015612c2557612bd98160036142ed565b612be49060086140e3565b6001901c60f81b82612bf7836002614357565b81518110612c0757612c07614300565b60200101906001600160f81b03191690815f1a905350600101612bc5565b505f5b6020811015612c8757612c3c81601f6142ed565b612c479060086140e3565b86901c60f81b82612c59836006614357565b81518110612c6957612c69614300565b60200101906001600160f81b03191690815f1a905350600101612c28565b505f5b6008811015612cf257612c9e8160076142ed565b612ca99060086140e3565b6001600160401b038616901c60f81b82612cc4836026614357565b81518110612cd457612cd4614300565b60200101906001600160f81b03191690815f1a905350600101612c8a565b505f5b6008811015612d5d57612d098160076142ed565b612d149060086140e3565b6001600160401b038516901c60f81b82612d2f83602e614357565b81518110612d3f57612d3f614300565b60200101906001600160f81b03191690815f1a905350600101612cf5565b50949350505050565b612d6e6133c7565b5f612d7b61016683613391565b90505f805160206144e38339815191525f612d9586611c02565b9050600281516005811115612dac57612dac613de2565b14612dc95760405162461bcd60e51b81526004016103f6906143b1565b5f86815260048301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612e5a5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016103f6565b612e63836131f0565b8281608001818151612e75919061441c565b6001600160401b0316905250612e8b86826129df565b5f612e9587612ace565b90505f612ea788838560800151612b49565b5f89815260058601602090815260408083206001600160a01b038c1684529091529020909150612ed7828261416c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f0490859060040161422b565b6020604051808303815f875af1158015612f20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f449190613eb8565b604080516080810182526001600160401b03891681525f602082018190529181019190915290915060608101600190525f8a81526004808801602090815260408084206001600160a01b038e1685528252928390208451815492860151948601516001600160401b03908116600160801b0267ffffffffffffffff60801b19968216600160401b026001600160801b031990951691909216179290921793841682178155606085015190939092849260ff60c01b191668ffffffffffffffffff60801b199092169190911790600160c01b90849081111561302757613027613de2565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a4505050505050610f5960015f8051602061452383398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130f457604051631afcd79f60e31b815260040160405180910390fd5b565b6130fe6130ab565b613107816137b6565b6131396060820135608083013561312460c0850160a08601613c33565b61313460e0860160c0870161443c565b6137d7565b50565b6131446130ab565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131d05760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103f6565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145038339815191529060ff165f0361322e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061327690836142ed565b10613292576001600160401b03841660408301528082526132b1565b83826040018181516132a4919061441c565b6001600160401b03169052505b5f8260200151836040015160646132c89190614457565b6132d29190614482565b600285015490915060ff908116908216111561334d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103f6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610734827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613832565b5f805160206145238339815191528054600119016133f857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134685760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134df5761349f8160016142ed565b6134aa9060086140e3565b5081515f908390839081106134c1576134c1614300565b60200101906001600160f81b03191690815f1a90535060010161348b565b505f5b600481101561353d576134f68160036142ed565b6135019060086140e3565b505f8261350f836002614357565b8151811061351f5761351f614300565b60200101906001600160f81b03191690815f1a9053506001016134e2565b505f5b602081101561359a578451816020811061355c5761355c614300565b1a60f81b8261356c836006614357565b8151811061357c5761357c614300565b60200101906001600160f81b03191690815f1a905350600101613540565b505f5b60208110156135fa57846020015181602081106135bc576135bc614300565b1a60f81b826135cc836026614357565b815181106135dc576135dc614300565b60200101906001600160f81b03191690815f1a90535060010161359d565b505f5b600881101561366e576136118160076142ed565b61361c9060086140e3565b60ff1685604001516001600160401b0316901c60f81b828260466136409190614357565b8151811061365057613650614300565b60200101906001600160f81b03191690815f1a9053506001016135fd565b505f5b60308110156136d9578460800151818151811061369057613690614300565b01602001516001600160f81b031916826136ab83604e614357565b815181106136bb576136bb614300565b60200101906001600160f81b03191690815f1a905350600101613671565b505f5b600881101561374b576136f08160076142ed565b6136fb9060086140e3565b60608601516001600160401b0390811691161c60f81b8261371d83607e614357565b8151811061372d5761372d614300565b60200101906001600160f81b03191690815f1a9053506001016136dc565b5060028160405161375c91906144a7565b602060405180830381855afa158015613777573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061379a9190613eb8565b94909350915050565b60015f8051602061452383398151915255565b6137be6130ab565b6137c6613994565b6137ce6139a4565b613139816139ac565b6137df6130ab565b5f5f805160206144e3833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613878573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061389c9190613eb8565b90506138b36001600160a01b038516333086613a18565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156138f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061391b9190613eb8565b90508181116139815760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103f6565b61398b82826142ed565b95945050505050565b61399c6130ab565b6130f4613a72565b6130f46130ab565b6139b46130ab565b80355f8051602061450383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139fe60608301604084016144c2565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610478908590613a7a565b6137a36130ab565b5f8060205f8451602086015f885af180613a99576040513d5f823e3d81fd5b50505f513d91508115613ab0578060011415613abd565b6001600160a01b0384163b155b1561047857604051635274afe760e01b81526001600160a01b03851660048201526024016103f6565b508054613af290613df6565b5f825580601f10613b01575050565b601f0160209004905f5260205f209081019061313991905b80821115613b2c575f8155600101613b19565b5090565b5f60208284031215613b40575f80fd5b5035919050565b803563ffffffff81168114613b5a575f80fd5b919050565b6001600160a01b0381168114613139575f80fd5b5f8060408385031215613b84575f80fd5b613b8d83613b47565b91506020830135613b9d81613b5f565b809150509250929050565b5f8060408385031215613bb9575f80fd5b823591506020830135613b9d81613b5f565b5f80828403610100811215613bde575f80fd5b60e0811215613beb575f80fd5b5082915060e0830135613b9d81613b5f565b5f60208284031215613c0d575f80fd5b613c1682613b47565b9392505050565b80356001600160401b0381168114613b5a575f80fd5b5f60208284031215613c43575f80fd5b613c1682613c1d565b8015158114613139575f80fd5b5f805f60608486031215613c6b575f80fd5b833592506020840135613c7d81613c4c565b9150613c8b60408501613b47565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613cca57613cca613c94565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613cf857613cf8613c94565b604052919050565b5f6001600160401b03821115613d1857613d18613c94565b50601f01601f191660200190565b5f805f8060808587031215613d39575f80fd5b8435935060208501359250613d5060408601613c1d565b915060608501356001600160401b03811115613d6a575f80fd5b8501601f81018713613d7a575f80fd5b8035613d8d613d8882613d00565b613cd0565b818152886020838501011115613da1575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613dd3575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600181811c90821680613e0a57607f821691505b602082108103613e2857634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454613e4081613df6565b806020870152604060018084165f8114613e615760018114613e7d57613eaa565b60ff19851660408a0152604084151560051b8a01019550613eaa565b895f5260205f205f5b85811015613ea15781548b8201860152908301908801613e86565b8a016040019650505b509398975050505050505050565b5f60208284031215613ec8575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613f4757613f47613f11565b500490565b5f5b83811015613f66578181015183820152602001613f4e565b50505f910152565b8051613b5a81613c4c565b5f8060408385031215613f8a575f80fd5b82516001600160401b0380821115613fa0575f80fd5b9084019060608287031215613fb3575f80fd5b613fbb613ca8565b82518152602080840151613fce81613b5f565b82820152604084015183811115613fe3575f80fd5b80850194505087601f850112613ff7575f80fd5b83519250614007613d8884613d00565b838152888285870101111561401a575f80fd5b61402984838301848801613f4c565b8060408401525081955061403e818801613f6e565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b808202811582820484141761073457610734613f25565b6001600160401b0382811682821603908082111561411a5761411a613f25565b5092915050565b601f821115610f5957805f5260205f20601f840160051c810160208510156141465750805b601f840160051c820191505b81811015614165575f8155600101614152565b5050505050565b81516001600160401b0381111561418557614185613c94565b614199816141938454613df6565b84614121565b602080601f8311600181146141cc575f84156141b55750858301515b5f19600386901b1c1916600185901b178555614223565b5f85815260208120601f198616915b828110156141fa578886015182559484019460019091019084016141db565b508582101561421757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f8251806020840152614249816040850160208701613f4c565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561073457610734613f25565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561073457610734613f25565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361441257614412613f25565b6001019392505050565b6001600160401b0381811683821601908082111561411a5761411a613f25565b5f6020828403121561444c575f80fd5b8135613c1681613b5f565b6001600160401b0381811683821602808216919082811461447a5761447a613f25565b505092915050565b5f6001600160401b038084168061449b5761449b613f11565b92169190910492915050565b5f82516144b8818460208701613f4c565b9190910192915050565b5f602082840312156144d2575f80fd5b813560ff81168114613c16575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161452438038061452483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143d78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80636a7e3d831161009e5780639e1bc4ef1161006e5780639e1bc4ef1461021b578063a3a65e481461022e578063b771b3bc14610241578063bee0a03f14610267578063d61bed741461027a575f80fd5b80636a7e3d83146101cf57806376f78621146101e2578063872fda64146101f5578063927e7e7514610208575f80fd5b80632e2194d8116100d95780632e2194d814610158578063467ef06f14610188578063620658561461019b57806366435abf146101bc575f80fd5b80630322ed981461010a5780630915204e1461011f5780630b77f6931461013257806327f39ca814610145575b5f80fd5b61011d610118366004613a30565b61028d565b005b61011d61012d366004613a73565b6103ee565b61011d610140366004613aa8565b610504565b61011d610153366004613acb565b6105cc565b61016b610166366004613a30565b6106da565b6040516001600160401b0390911681526020015b60405180910390f35b61011d610196366004613afd565b6106f0565b6101ae6101a9366004613b33565b610a4c565b60405190815260200161017f565b61016b6101ca366004613a30565b610a65565b61011d6101dd366004613aa8565b610a79565b61011d6101f0366004613b59565b610afb565b6101ae610203366004613c26565b610e14565b61011d610216366004613a30565b610e39565b61011d610229366004613cc2565b6111f9565b61011d61023c366004613afd565b611208565b61024f6005600160991b0181565b6040516001600160a01b03909116815260200161017f565b61011d610275366004613a30565b6113c1565b61011d610288366004613a73565b611490565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061436b8339815191529291906102d590613ce2565b9050118015610307575060035f83815260078301602052604090205460ff16600581111561030557610305613d1a565b145b6103705760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613d2e565b6020604051808303815f875af11580156103c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e99190613db8565b505050565b5f8051602061434b8339815191525f610406846115d5565b90505f8061041783604001516117b6565b509150915061042682866119f1565b5f82815260068501602090815260408083206001600160a01b03891684529091528120610452916139e6565b5f61045c83611b02565b9050816001600160401b031681606001516001600160401b031610156104945760405162461bcd60e51b815260040161036790613dcf565b5f83815260048601602090815260408083206001600160a01b038a168085529252808320805460ff60c01b1916600160c21b179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b61050e8282611bfd565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061434b833981519152916005600160991b019163ee5b48eb9161058691600401613d2e565b6020604051808303815f875af11580156105a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c69190613db8565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106105750825b90505f826001600160401b0316600114801561062b5750303b155b905081158015610639575080155b156106575760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561068157845460ff60401b1916600160401b1785555b61068b8787611d19565b83156106d157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6106ea64e8d4a5100083613e39565b92915050565b5f8051602061436b8339815191525f610708836115d5565b90505f806107198360400151611d33565b91509150801561077e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610367565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156107af576107af613d1a565b60058111156107c0576107c0613d1a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561083957610839613d1a565b1480610857575060018251600581111561085557610855613d1a565b145b6108b65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610367565b6003825160058111156108cb576108cb613d1a565b036108f257505f83815260068601602052604081206004916108ed91906139e6565b6108f6565b5060055b6020808301515f9081526008880190915260408120558181600581111561091f5761091f613d1a565b9081600581111561093257610932613d1a565b9052505f84815260078701602052604090208251815484929190829060ff1916600183600581111561096657610966613d1a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610a1957610a19613d1a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6106ea6001600160401b03831664e8d4a51000613e4c565b5f610a6f82611b02565b6080015192915050565b610a8382826119f1565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061434b833981519152916005600160991b019163ee5b48eb9161058691600401613d2e565b8115610e0b575f5f8051602061434b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b5c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b839190810190613e90565b9150915080610be65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610367565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4d9190613db8565b825114610cb15760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610367565b60208201516001600160a01b031615610d275760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610367565b5f80610d368460400151611ed4565b91509150818814610da35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610367565b5f888152600786016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6103e9836120ac565b5f80610e1f866123fe565b9050610e2d858286866124ab565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f8051602061434b83398151915293926060830190600160c01b900460ff166004811115610ed857610ed8613d1a565b6004811115610ee957610ee9613d1a565b9052509050600281606001516004811115610f0657610f06613d1a565b14610f625760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b6064820152608401610367565b60036060820181905250426001600160401b03166040828101919091525f848152600484016020529081208291336001600160a01b0316815260208082019290925260409081015f208351815493850151928501516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990961691909216179390931791821683178155606084015190929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600481111561103557611035613d1a565b02179055509050505f61104784611b02565b9050815f01516001600160401b031681608001516001600160401b0316116110bd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610367565b81516080820180516110d0908390613f62565b6001600160401b03169052506110e684826128df565b5f6110f0856129ce565b90505f61110286838560800151612a49565b5f878152600687016020908152604080832033845290915290209091506111298282613fd4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611156908590600401614093565b6020604051808303815f875af1158015611172573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111969190613db8565b6080850151604080516001600160401b039283168152918616602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b611204823383612c66565b5050565b5f8051602061436b8339815191525f611220836115d5565b90505f806112318360400151611d33565b91509150806112935760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610367565b5f828152600585016020526040812080546112ad90613ce2565b90501180156112df575060015f83815260078601602052604090205460ff1660058111156112dd576112dd613d1a565b145b6112fb5760405162461bcd60e51b8152600401610367906140c5565b5f8281526005850160205260408120611313916139e6565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061436b83398151915292919061140990613ce2565b905011801561143b575060015f83815260078301602052604090205460ff16600581111561143957611439613d1a565b145b6114575760405162461bcd60e51b8152600401610367906140c5565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613d2e565b5f8051602061434b8339815191525f6114a8846115d5565b90505f806114b983604001516117b6565b50915091506114c88286611bfd565b5f82815260058501602090815260408083206001600160a01b038916845290915281206114f4916139e6565b5f6114fe83611b02565b9050816001600160401b031681606001516001600160401b031610156115365760405162461bcd60e51b815260040161036790613dcf565b5f83815260048601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160401b0278ff0000000000000000ffffffffffffffff00000000000000001990971696909617600160c11b179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b691016111e8565b60408051606080820183525f8083526020830181905292820152905f8051602061436b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561164a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116719190810190613e90565b91509150806116d85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610367565b825482511461173b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610367565b60208201516001600160a01b0316156117ae5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610367565b509392505050565b5f805f83516036146117da5760405162461bcd60e51b81526004016103679061410c565b5f805b6002811015611829576117f1816001614155565b6117fc906008613e4c565b61ffff1686828151811061181257611812614168565b016020015160f81c901b91909117906001016117dd565b5061ffff81161561184c5760405162461bcd60e51b81526004016103679061417c565b5f805b60048110156118a757611863816003614155565b61186e906008613e4c565b63ffffffff16876118808360026141bf565b8151811061189057611890614168565b016020015160f81c901b919091179060010161184f565b5063ffffffff81166003146118ce5760405162461bcd60e51b8152600401610367906141d2565b5f805b6020811015611923576118e581601f614155565b6118f0906008613e4c565b886118fc8360066141bf565b8151811061190c5761190c614168565b016020015160f81c901b91909117906001016118d1565b505f805b60088110156119825761193b816007614155565b611946906008613e4c565b6001600160401b03168961195b8360266141bf565b8151811061196b5761196b614168565b016020015160f81c901b9190911790600101611927565b505f805b60088110156119e15761199a816007614155565b6119a5906008613e4c565b6001600160401b03168a6119ba83602e6141bf565b815181106119ca576119ca614168565b016020015160f81c901b9190911790600101611986565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f8051602061434b833981519152929190611a4d90613ce2565b9050118015611a9b575060035f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611a9957611a99613d1a565b145b6103e95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b6064820152608401610367565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206143ab83398151915290528390208351918201909352825491925f8051602061436b83398151915292829060ff166005811115611b8257611b82613d1a565b6005811115611b9357611b93613d1a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f8051602061434b833981519152929190611c5990613ce2565b9050118015611ca7575060015f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611ca557611ca5613d1a565b145b6103e95760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e670000000000000000006064820152608401610367565b611d21612fab565b611d2a82612ff6565b6112048161303c565b5f808251602714611d565760405162461bcd60e51b81526004016103679061410c565b5f805b6002811015611da557611d6d816001614155565b611d78906008613e4c565b61ffff16858281518110611d8e57611d8e614168565b016020015160f81c901b9190911790600101611d59565b5061ffff811615611dc85760405162461bcd60e51b81526004016103679061417c565b5f805b6004811015611e2357611ddf816003614155565b611dea906008613e4c565b63ffffffff1686611dfc8360026141bf565b81518110611e0c57611e0c614168565b016020015160f81c901b9190911790600101611dcb565b5063ffffffff8116600214611e4a5760405162461bcd60e51b8152600401610367906141d2565b5f805b6020811015611e9f57611e6181601f614155565b611e6c906008613e4c565b87611e788360066141bf565b81518110611e8857611e88614168565b016020015160f81c901b9190911790600101611e4d565b505f86602681518110611eb457611eb4614168565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14611ef75760405162461bcd60e51b81526004016103679061410c565b5f805b6002811015611f4657611f0e816001614155565b611f19906008613e4c565b61ffff16858281518110611f2f57611f2f614168565b016020015160f81c901b9190911790600101611efa565b5061ffff811615611f695760405162461bcd60e51b81526004016103679061417c565b5f805b6004811015611fc457611f80816003614155565b611f8b906008613e4c565b63ffffffff1686611f9d8360026141bf565b81518110611fad57611fad614168565b016020015160f81c901b9190911790600101611f6c565b5063ffffffff8116600414611feb5760405162461bcd60e51b8152600401610367906141d2565b5f805b60208110156120405761200281601f614155565b61200d906008613e4c565b876120198360066141bf565b8151811061202957612029614168565b016020015160f81c901b9190911790600101611fee565b505f805b600881101561209f57612058816007614155565b612063906008613e4c565b6001600160401b0316886120788360266141bf565b8151811061208857612088614168565b016020015160f81c901b9190911790600101612044565b5090969095509350505050565b5f8181525f805160206143ab8339815191526020526040808220815160e0810190925280545f8051602061436b83398151915293929190829060ff1660058111156120f9576120f9613d1a565b600581111561210a5761210a613d1a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561218457612184613d1a565b146121a15760405162461bcd60e51b815260040161036790614219565b60408101516001600160a01b0316336001600160a01b03161461221b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610367565b61222881608001516130f0565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561226c5761226c613d1a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6123208461231a816129ce565b5f612a49565b5f858152600685016020526040902090915061233c8282613fd4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612369908590600401614093565b6020604051808303815f875af1158015612385573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a99190613db8565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061434b8339815191528161241784613291565b90505f612423826106da565b83549091506001600160401b0382161080159061244d57508260010154816001600160401b031611155b610e315760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610367565b5f6124b46132c7565b5f8051602061436b833981519152426001600160401b0385161180156124ee57506001600160401b0384166124ec426202a3006141bf565b115b6125505760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610367565b856125a75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610367565b5f868152600882016020526040902054156126155760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610367565b825160301461267c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610367565b612685856130f0565b5f806126cc6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506132fe565b5f828152600586016020526040902091935091506126ea8282613fd4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612717908590600401614093565b6020604051808303815f875af1158015612733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127579190613db8565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156127d0576127d0613d1a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612879836129ce565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610e3160015f8051602061438b83398151915255565b5f8281525f805160206143ab83398151915260205260409020815181545f8051602061436b8339815191529284929091829060ff1916600183600581111561292957612929613d1a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f8181525f805160206143ab8339815191526020526040812060020180545f8051602061436b83398151915291600160a01b9091046001600160401b03169081906014612a1a8361425f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612ac257612a82816001614155565b612a8d906008613e4c565b5081515f90839083908110612aa457612aa4614168565b60200101906001600160f81b03191690815f1a905350600101612a6e565b505f5b6004811015612b2557612ad9816003614155565b612ae4906008613e4c565b6001901c60f81b82612af78360026141bf565b81518110612b0757612b07614168565b60200101906001600160f81b03191690815f1a905350600101612ac5565b505f5b6020811015612b8757612b3c81601f614155565b612b47906008613e4c565b86901c60f81b82612b598360066141bf565b81518110612b6957612b69614168565b60200101906001600160f81b03191690815f1a905350600101612b28565b505f5b6008811015612bf257612b9e816007614155565b612ba9906008613e4c565b6001600160401b038616901c60f81b82612bc48360266141bf565b81518110612bd457612bd4614168565b60200101906001600160f81b03191690815f1a905350600101612b8a565b505f5b6008811015612c5d57612c09816007614155565b612c14906008613e4c565b6001600160401b038516901c60f81b82612c2f83602e6141bf565b81518110612c3f57612c3f614168565b60200101906001600160f81b03191690815f1a905350600101612bf5565b50949350505050565b612c6e6132c7565b5f612c7b61016683613291565b90505f8051602061434b8339815191525f612c9586611b02565b9050600281516005811115612cac57612cac613d1a565b14612cc95760405162461bcd60e51b815260040161036790614219565b5f86815260048301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612d5a5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b6064820152608401610367565b612d63836130f0565b8281608001818151612d759190614284565b6001600160401b0316905250612d8b86826128df565b5f612d95876129ce565b90505f612da788838560800151612a49565b5f89815260058601602090815260408083206001600160a01b038c1684529091529020909150612dd78282613fd4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e04908590600401614093565b6020604051808303815f875af1158015612e20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e449190613db8565b604080516080810182526001600160401b03891681525f602082018190529181019190915290915060608101600190525f8a81526004808801602090815260408084206001600160a01b038e1685528252928390208451815492860151948601516001600160401b03908116600160801b0267ffffffffffffffff60801b19968216600160401b026001600160801b031990951691909216179290921793841682178155606085015190939092849260ff60c01b191668ffffffffffffffffff60801b199092169190911790600160c01b908490811115612f2757612f27613d1a565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a45050505050506103e960015f8051602061438b83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612ff457604051631afcd79f60e31b815260040160405180910390fd5b565b612ffe612fab565b613007816136b6565b6130396060820135608083013561302460c0850160a08601613b33565b61303460e0860160c087016142a4565b6136d7565b50565b613044612fab565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166130d05760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610367565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061436b8339815191529060ff165f0361312e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906131769083614155565b10613192576001600160401b03841660408301528082526131b1565b83826040018181516131a49190614284565b6001600160401b03169052505b5f8260200151836040015160646131c891906142bf565b6131d291906142ea565b600285015490915060ff908116908216111561324d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610367565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6106ea827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613732565b5f8051602061438b8339815191528054600119016132f857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146133685760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610367565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156133df5761339f816001614155565b6133aa906008613e4c565b5081515f908390839081106133c1576133c1614168565b60200101906001600160f81b03191690815f1a90535060010161338b565b505f5b600481101561343d576133f6816003614155565b613401906008613e4c565b505f8261340f8360026141bf565b8151811061341f5761341f614168565b60200101906001600160f81b03191690815f1a9053506001016133e2565b505f5b602081101561349a578451816020811061345c5761345c614168565b1a60f81b8261346c8360066141bf565b8151811061347c5761347c614168565b60200101906001600160f81b03191690815f1a905350600101613440565b505f5b60208110156134fa57846020015181602081106134bc576134bc614168565b1a60f81b826134cc8360266141bf565b815181106134dc576134dc614168565b60200101906001600160f81b03191690815f1a90535060010161349d565b505f5b600881101561356e57613511816007614155565b61351c906008613e4c565b60ff1685604001516001600160401b0316901c60f81b8282604661354091906141bf565b8151811061355057613550614168565b60200101906001600160f81b03191690815f1a9053506001016134fd565b505f5b60308110156135d9578460800151818151811061359057613590614168565b01602001516001600160f81b031916826135ab83604e6141bf565b815181106135bb576135bb614168565b60200101906001600160f81b03191690815f1a905350600101613571565b505f5b600881101561364b576135f0816007614155565b6135fb906008613e4c565b60608601516001600160401b0390811691161c60f81b8261361d83607e6141bf565b8151811061362d5761362d614168565b60200101906001600160f81b03191690815f1a9053506001016135dc565b5060028160405161365c919061430f565b602060405180830381855afa158015613677573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061369a9190613db8565b94909350915050565b60015f8051602061438b83398151915255565b6136be612fab565b6136c6613894565b6136ce6138a4565b613039816138ac565b6136df612fab565b5f5f8051602061434b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061379c9190613db8565b90506137b36001600160a01b038516333086613918565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156137f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061381b9190613db8565b90508181116138815760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610367565b61388b8282614155565b95945050505050565b61389c612fab565b612ff4613972565b612ff4612fab565b6138b4612fab565b80355f8051602061436b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138fe606083016040840161432a565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526105c690859061397a565b6136a3612fab565b5f8060205f8451602086015f885af180613999576040513d5f823e3d81fd5b50505f513d915081156139b05780600114156139bd565b6001600160a01b0384163b155b156105c657604051635274afe760e01b81526001600160a01b0385166004820152602401610367565b5080546139f290613ce2565b5f825580601f10613a01575050565b601f0160209004905f5260205f209081019061303991905b80821115613a2c575f8155600101613a19565b5090565b5f60208284031215613a40575f80fd5b5035919050565b803563ffffffff81168114613a5a575f80fd5b919050565b6001600160a01b0381168114613039575f80fd5b5f8060408385031215613a84575f80fd5b613a8d83613a47565b91506020830135613a9d81613a5f565b809150509250929050565b5f8060408385031215613ab9575f80fd5b823591506020830135613a9d81613a5f565b5f80828403610100811215613ade575f80fd5b60e0811215613aeb575f80fd5b5082915060e0830135613a9d81613a5f565b5f60208284031215613b0d575f80fd5b613b1682613a47565b9392505050565b80356001600160401b0381168114613a5a575f80fd5b5f60208284031215613b43575f80fd5b613b1682613b1d565b8015158114613039575f80fd5b5f805f60608486031215613b6b575f80fd5b833592506020840135613b7d81613b4c565b9150613b8b60408501613a47565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bca57613bca613b94565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613bf857613bf8613b94565b604052919050565b5f6001600160401b03821115613c1857613c18613b94565b50601f01601f191660200190565b5f805f8060808587031215613c39575f80fd5b8435935060208501359250613c5060408601613b1d565b915060608501356001600160401b03811115613c6a575f80fd5b8501601f81018713613c7a575f80fd5b8035613c8d613c8882613c00565b613bd0565b818152886020838501011115613ca1575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613cd3575f80fd5b50508035926020909101359150565b600181811c90821680613cf657607f821691505b602082108103613d1457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613d4081613ce2565b806020870152604060018084165f8114613d615760018114613d7d57613daa565b60ff19851660408a0152604084151560051b8a01019550613daa565b895f5260205f205f5b85811015613da15781548b8201860152908301908801613d86565b8a016040019650505b509398975050505050505050565b5f60208284031215613dc8575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613e4757613e47613e11565b500490565b80820281158282048414176106ea576106ea613e25565b5f5b83811015613e7d578181015183820152602001613e65565b50505f910152565b8051613a5a81613b4c565b5f8060408385031215613ea1575f80fd5b82516001600160401b0380821115613eb7575f80fd5b9084019060608287031215613eca575f80fd5b613ed2613ba8565b82518152602080840151613ee581613a5f565b82820152604084015183811115613efa575f80fd5b80850194505087601f850112613f0e575f80fd5b83519250613f1e613c8884613c00565b8381528882858701011115613f31575f80fd5b613f4084838301848801613e63565b80604084015250819550613f55818801613e85565b9450505050509250929050565b6001600160401b03828116828216039080821115613f8257613f82613e25565b5092915050565b601f8211156103e957805f5260205f20601f840160051c81016020851015613fae5750805b601f840160051c820191505b81811015613fcd575f8155600101613fba565b5050505050565b81516001600160401b03811115613fed57613fed613b94565b61400181613ffb8454613ce2565b84613f89565b602080601f831160018114614034575f841561401d5750858301515b5f19600386901b1c1916600185901b17855561408b565b5f85815260208120601f198616915b8281101561406257888601518255948401946001909101908401614043565b508582101561407f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526140b1816040850160208701613e63565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156106ea576106ea613e25565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156106ea576106ea613e25565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361427a5761427a613e25565b6001019392505050565b6001600160401b03818116838216019080821115613f8257613f82613e25565b5f602082840312156142b4575f80fd5b8135613b1681613a5f565b6001600160401b038181168382160280821691908281146142e2576142e2613e25565b505092915050565b5f6001600160401b038084168061430357614303613e11565b92169190910492915050565b5f8251614320818460208701613e63565b9190910192915050565b5f6020828403121561433a575f80fd5b813560ff81168114613b16575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index e9dea857c..ba7991b03 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516143e93803806143e983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61429c8061014d5f395ff3fe6080604052600436106100f9575f3560e01c80636a7e3d8311610092578063b771b3bc11610062578063b771b3bc1461029e578063bee0a03f146102d0578063c599e24f146102ef578063d61bed7414610302578063f40797d714610321575f80fd5b80636a7e3d831461022257806376f7862114610241578063927e7e7514610260578063a3a65e481461027f575f80fd5b80632e2194d8116100cd5780632e2194d81461017b578063467ef06f146101b757806362065856146101d657806366435abf14610203575f80fd5b8062e41792146100fd5780630322ed981461011e5780630915204e1461013d5780630b77f6931461015c575b5f80fd5b348015610108575f80fd5b5061011c6101173660046138ad565b610334565b005b348015610129575f80fd5b5061011c6101383660046138c3565b610440565b348015610148575f80fd5b5061011c610157366004613906565b610631565b348015610167575f80fd5b5061011c61017636600461393b565b610747565b348015610186575f80fd5b5061019a6101953660046138c3565b6107c9565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101c2575f80fd5b5061011c6101d136600461395e565b6107df565b3480156101e1575f80fd5b506101f56101f0366004613994565b610c36565b6040519081526020016101ae565b34801561020e575f80fd5b5061019a61021d3660046138c3565b610c4f565b34801561022d575f80fd5b5061011c61023c36600461393b565b610c63565b34801561024c575f80fd5b5061011c61025b3660046139ba565b610ce5565b34801561026b575f80fd5b5061011c61027a3660046138c3565b611003565b34801561028a575f80fd5b5061011c61029936600461395e565b6113c3565b3480156102a9575f80fd5b506102b86005600160991b0181565b6040516001600160a01b0390911681526020016101ae565b3480156102db575f80fd5b5061011c6102ea3660046138c3565b61157c565b61011c6102fd3660046138c3565b61168b565b34801561030d575f80fd5b5061011c61031c366004613906565b611699565b6101f561032f366004613a87565b6117de565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f286611800565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181525f805160206142708339815191526020526040808220815160e0810190925280545f8051602061423083398151915293929190829060ff16600581111561048d5761048d613b19565b600581111561049e5761049e613b19565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f868152600686019091529081208054929350909161052890613b2d565b9050118015610549575060038151600581111561054757610547613b19565b145b6105b25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105eb9190600401613b5f565b6020604051808303815f875af1158015610607573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062b9190613be9565b50505050565b5f805160206142108339815191525f61064984611811565b90505f8061065a8360400151611968565b50915091506106698286611ba3565b5f82815260068501602090815260408083206001600160a01b0389168452909152812061069591613863565b5f61069f83611cb4565b9050816001600160401b031681606001516001600160401b031610156106d75760405162461bcd60e51b81526004016105a990613c00565b5f83815260048601602090815260408083206001600160a01b038a168085529252808320805460ff60c01b1916600160c21b179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6107518282611daf565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614210833981519152916005600160991b019163ee5b48eb916105eb91600401613b5f565b5f6107d964e8d4a5100083613c6a565b92915050565b5f5f805160206142308339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561083a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108619190810190613caa565b91509150806108c15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016105a9565b82548251146108e25760405162461bcd60e51b81526004016105a990613d7c565b60208201516001600160a01b03161561090d5760405162461bcd60e51b81526004016105a990613dc5565b5f8061091c8460400151611ecb565b9150915080156109815760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105a9565b5f828152600786016020526040808220815160e081019092528054829060ff1660058111156109b2576109b2613b19565b60058111156109c3576109c3613b19565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610a3c57610a3c613b19565b1480610a5a5750600182516005811115610a5857610a58613b19565b145b610ab95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105a9565b600382516005811115610ace57610ace613b19565b03610adb57506004610adf565b5060055b6020808301515f90815260088901909152604081205581816005811115610b0857610b08613b19565b90816005811115610b1b57610b1b613b19565b9052505f84815260078801602052604090208251815484929190829060ff19166001836005811115610b4f57610b4f613b19565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610c0257610c02613b19565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a35050505050505050565b5f6107d96001600160401b03831664e8d4a51000613e14565b5f610c5982611cb4565b6080015192915050565b610c6d8282611ba3565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614210833981519152916005600160991b019163ee5b48eb916105eb91600401613b5f565b8115610ff5575f5f805160206142108339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610d46573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d6d9190810190613caa565b9150915080610dd05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105a9565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e13573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e379190613be9565b825114610e9b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105a9565b60208201516001600160a01b031615610f115760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105a9565b5f80610f20846040015161206c565b91509150818814610f8d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105a9565b5f888152600786016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610ffe83612244565b505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f8051602061421083398151915293926060830190600160c01b900460ff1660048111156110a2576110a2613b19565b60048111156110b3576110b3613b19565b90525090506002816060015160048111156110d0576110d0613b19565b1461112c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b60648201526084016105a9565b60036060820181905250426001600160401b03166040828101919091525f848152600484016020529081208291336001600160a01b0316815260208082019290925260409081015f208351815493850151928501516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990961691909216179390931791821683178155606084015190929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360048111156111ff576111ff613b19565b02179055509050505f61121184611cb4565b9050815f01516001600160401b031681608001516001600160401b0316116112875760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105a9565b815160808201805161129a908390613e2b565b6001600160401b03169052506112b08482612596565b5f6112ba85612685565b90505f6112cc86838560800151612700565b5f878152600687016020908152604080832033845290915290209091506112f38282613e9d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611320908590600401613f58565b6020604051808303815f875af115801561133c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113609190613be9565b6080850151604080516001600160401b039283168152918616602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b5f805160206142308339815191525f6113db83611811565b90505f806113ec8360400151611ecb565b915091508061144e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105a9565b5f8281526005850160205260408120805461146890613b2d565b905011801561149a575060015f83815260078601602052604090205460ff16600581111561149857611498613b19565b145b6114b65760405162461bcd60e51b81526004016105a990613f8a565b5f82815260058501602052604081206114ce91613863565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142308339815191529291906115c490613b2d565b90501180156115f6575060015f83815260078301602052604090205460ff1660058111156115f4576115f4613b19565b145b6116125760405162461bcd60e51b81526004016105a990613f8a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161164b9190600401613b5f565b6020604051808303815f875af1158015611667573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ffe9190613be9565b61169681333461291d565b50565b5f805160206142108339815191525f6116b184611811565b90505f806116c28360400151611968565b50915091506116d18286611daf565b5f82815260058501602090815260408083206001600160a01b038916845290915281206116fd91613863565b5f61170783611cb4565b9050816001600160401b031681606001516001600160401b0316101561173f5760405162461bcd60e51b81526004016105a990613c00565b5f83815260048601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160401b0278ff0000000000000000ffffffffffffffff00000000000000001990971696909617600160c11b179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b691016113b2565b5f806117e934612c5f565b90506117f785828686612d09565b95945050505050565b61180861313d565b61169681613188565b60408051606080820183525f8083526020830181905292820152905f805160206142308339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611886573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118ad9190810190613caa565b91509150806119145760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105a9565b82548251146119355760405162461bcd60e51b81526004016105a990613d7c565b60208201516001600160a01b0316156119605760405162461bcd60e51b81526004016105a990613dc5565b509392505050565b5f805f835160361461198c5760405162461bcd60e51b81526004016105a990613fd1565b5f805b60028110156119db576119a381600161401a565b6119ae906008613e14565b61ffff168682815181106119c4576119c461402d565b016020015160f81c901b919091179060010161198f565b5061ffff8116156119fe5760405162461bcd60e51b81526004016105a990614041565b5f805b6004811015611a5957611a1581600361401a565b611a20906008613e14565b63ffffffff1687611a32836002614084565b81518110611a4257611a4261402d565b016020015160f81c901b9190911790600101611a01565b5063ffffffff8116600314611a805760405162461bcd60e51b81526004016105a990614097565b5f805b6020811015611ad557611a9781601f61401a565b611aa2906008613e14565b88611aae836006614084565b81518110611abe57611abe61402d565b016020015160f81c901b9190911790600101611a83565b505f805b6008811015611b3457611aed81600761401a565b611af8906008613e14565b6001600160401b031689611b0d836026614084565b81518110611b1d57611b1d61402d565b016020015160f81c901b9190911790600101611ad9565b505f805b6008811015611b9357611b4c81600761401a565b611b57906008613e14565b6001600160401b03168a611b6c83602e614084565b81518110611b7c57611b7c61402d565b016020015160f81c901b9190911790600101611b38565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f80516020614210833981519152929190611bff90613b2d565b9050118015611c4d575060035f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611c4b57611c4b613b19565b145b610ffe5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016105a9565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061427083398151915290528390208351918201909352825491925f8051602061423083398151915292829060ff166005811115611d3457611d34613b19565b6005811115611d4557611d45613b19565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f80516020614210833981519152929190611e0b90613b2d565b9050118015611e59575060015f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611e5757611e57613b19565b145b610ffe5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016105a9565b5f808251602714611eee5760405162461bcd60e51b81526004016105a990613fd1565b5f805b6002811015611f3d57611f0581600161401a565b611f10906008613e14565b61ffff16858281518110611f2657611f2661402d565b016020015160f81c901b9190911790600101611ef1565b5061ffff811615611f605760405162461bcd60e51b81526004016105a990614041565b5f805b6004811015611fbb57611f7781600361401a565b611f82906008613e14565b63ffffffff1686611f94836002614084565b81518110611fa457611fa461402d565b016020015160f81c901b9190911790600101611f63565b5063ffffffff8116600214611fe25760405162461bcd60e51b81526004016105a990614097565b5f805b602081101561203757611ff981601f61401a565b612004906008613e14565b87612010836006614084565b815181106120205761202061402d565b016020015160f81c901b9190911790600101611fe5565b505f8660268151811061204c5761204c61402d565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461208f5760405162461bcd60e51b81526004016105a990613fd1565b5f805b60028110156120de576120a681600161401a565b6120b1906008613e14565b61ffff168582815181106120c7576120c761402d565b016020015160f81c901b9190911790600101612092565b5061ffff8116156121015760405162461bcd60e51b81526004016105a990614041565b5f805b600481101561215c5761211881600361401a565b612123906008613e14565b63ffffffff1686612135836002614084565b815181106121455761214561402d565b016020015160f81c901b9190911790600101612104565b5063ffffffff81166004146121835760405162461bcd60e51b81526004016105a990614097565b5f805b60208110156121d85761219a81601f61401a565b6121a5906008613e14565b876121b1836006614084565b815181106121c1576121c161402d565b016020015160f81c901b9190911790600101612186565b505f805b6008811015612237576121f081600761401a565b6121fb906008613e14565b6001600160401b031688612210836026614084565b815181106122205761222061402d565b016020015160f81c901b91909117906001016121dc565b5090969095509350505050565b5f8181525f805160206142708339815191526020526040808220815160e0810190925280545f8051602061423083398151915293929190829060ff16600581111561229157612291613b19565b60058111156122a2576122a2613b19565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561231c5761231c613b19565b146123395760405162461bcd60e51b81526004016105a9906140de565b60408101516001600160a01b0316336001600160a01b0316146123b35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105a9565b6123c081608001516131cb565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561240457612404613b19565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124b8846124b281612685565b5f612700565b5f85815260068501602052604090209091506124d48282613e9d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612501908590600401613f58565b6020604051808303815f875af115801561251d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125419190613be9565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8281525f8051602061427083398151915260205260409020815181545f805160206142308339815191529284929091829060ff191660018360058111156125e0576125e0613b19565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f8181525f805160206142708339815191526020526040812060020180545f8051602061423083398151915291600160a01b9091046001600160401b031690819060146126d183614124565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156127795761273981600161401a565b612744906008613e14565b5081515f9083908390811061275b5761275b61402d565b60200101906001600160f81b03191690815f1a905350600101612725565b505f5b60048110156127dc5761279081600361401a565b61279b906008613e14565b6001901c60f81b826127ae836002614084565b815181106127be576127be61402d565b60200101906001600160f81b03191690815f1a90535060010161277c565b505f5b602081101561283e576127f381601f61401a565b6127fe906008613e14565b86901c60f81b82612810836006614084565b815181106128205761282061402d565b60200101906001600160f81b03191690815f1a9053506001016127df565b505f5b60088110156128a95761285581600761401a565b612860906008613e14565b6001600160401b038616901c60f81b8261287b836026614084565b8151811061288b5761288b61402d565b60200101906001600160f81b03191690815f1a905350600101612841565b505f5b6008811015612914576128c081600761401a565b6128cb906008613e14565b6001600160401b038516901c60f81b826128e683602e614084565b815181106128f6576128f661402d565b60200101906001600160f81b03191690815f1a9053506001016128ac565b50949350505050565b61292561336c565b5f61292f826107c9565b90505f805160206142108339815191525f61294986611cb4565b905060028151600581111561296057612960613b19565b1461297d5760405162461bcd60e51b81526004016105a9906140de565b5f86815260048301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612a0e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016105a9565b612a17836131cb565b8281608001818151612a299190614149565b6001600160401b0316905250612a3f8682612596565b5f612a4987612685565b90505f612a5b88838560800151612700565b5f89815260058601602090815260408083206001600160a01b038c1684529091529020909150612a8b8282613e9d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ab8908590600401613f58565b6020604051808303815f875af1158015612ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af89190613be9565b604080516080810182526001600160401b03891681525f602082018190529181019190915290915060608101600190525f8a81526004808801602090815260408084206001600160a01b038e1685528252928390208451815492860151948601516001600160401b03908116600160801b0267ffffffffffffffff60801b19968216600160401b026001600160801b031990951691909216179290921793841682178155606085015190939092849260ff60c01b191668ffffffffffffffffff60801b199092169190911790600160c01b908490811115612bdb57612bdb613b19565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a4505050505050610ffe60015f8051602061425083398151915255565b5f5f805160206142108339815191528282612c79826107c9565b83549091506001600160401b03821610801590612ca357508260010154816001600160401b031611155b612d015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105a9565b949350505050565b5f612d1261336c565b5f80516020614230833981519152426001600160401b038516118015612d4c57506001600160401b038416612d4a426202a300614084565b115b612dae5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105a9565b85612e055760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105a9565b5f86815260088201602052604090205415612e735760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105a9565b8251603014612eda5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105a9565b612ee3856131cb565b5f80612f2a6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506133b6565b5f82815260058601602052604090209193509150612f488282613e9d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f75908590600401613f58565b6020604051808303815f875af1158015612f91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fb59190613be9565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561302e5761302e613b19565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556130d783612685565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612d0160015f8051602061425083398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661318657604051631afcd79f60e31b815260040160405180910390fd5b565b61319061313d565b6131998161375b565b611696606082013560808301356131b660c0850160a08601613994565b6131c660e0860160c08701614169565b61377c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142308339815191529060ff165f03613209575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613251908361401a565b1061326d576001600160401b038416604083015280825261328c565b838260400181815161327f9190614149565b6001600160401b03169052505b5f8260200151836040015160646132a39190614184565b6132ad91906141af565b600285015490915060ff90811690821611156133285760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105a9565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061425083398151915280546001190161339d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061425083398151915255565b5f60608260800151516030146134205760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105a9565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134975761345781600161401a565b613462906008613e14565b5081515f908390839081106134795761347961402d565b60200101906001600160f81b03191690815f1a905350600101613443565b505f5b60048110156134f5576134ae81600361401a565b6134b9906008613e14565b505f826134c7836002614084565b815181106134d7576134d761402d565b60200101906001600160f81b03191690815f1a90535060010161349a565b505f5b602081101561355257845181602081106135145761351461402d565b1a60f81b82613524836006614084565b815181106135345761353461402d565b60200101906001600160f81b03191690815f1a9053506001016134f8565b505f5b60208110156135b257846020015181602081106135745761357461402d565b1a60f81b82613584836026614084565b815181106135945761359461402d565b60200101906001600160f81b03191690815f1a905350600101613555565b505f5b6008811015613626576135c981600761401a565b6135d4906008613e14565b60ff1685604001516001600160401b0316901c60f81b828260466135f89190614084565b815181106136085761360861402d565b60200101906001600160f81b03191690815f1a9053506001016135b5565b505f5b603081101561369157846080015181815181106136485761364861402d565b01602001516001600160f81b0319168261366383604e614084565b815181106136735761367361402d565b60200101906001600160f81b03191690815f1a905350600101613629565b505f5b6008811015613703576136a881600761401a565b6136b3906008613e14565b60608601516001600160401b0390811691161c60f81b826136d583607e614084565b815181106136e5576136e561402d565b60200101906001600160f81b03191690815f1a905350600101613694565b5060028160405161371491906141d4565b602060405180830381855afa15801561372f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137529190613be9565b94909350915050565b61376361313d565b61376b6137d7565b6137736137e7565b611696816137ef565b61378461313d565b5f5f80516020614210833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6137df61313d565b61318661385b565b61318661313d565b6137f761313d565b80355f8051602061423083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561384160608301604084016141ef565b600291909101805460ff191660ff90921691909117905550565b6133a361313d565b50805461386f90613b2d565b5f825580601f1061387e575050565b601f0160209004905f5260205f209081019061169691905b808211156138a9575f8155600101613896565b5090565b5f60e082840312156138bd575f80fd5b50919050565b5f602082840312156138d3575f80fd5b5035919050565b803563ffffffff811681146138ed575f80fd5b919050565b6001600160a01b0381168114611696575f80fd5b5f8060408385031215613917575f80fd5b613920836138da565b91506020830135613930816138f2565b809150509250929050565b5f806040838503121561394c575f80fd5b823591506020830135613930816138f2565b5f6020828403121561396e575f80fd5b613977826138da565b9392505050565b80356001600160401b03811681146138ed575f80fd5b5f602082840312156139a4575f80fd5b6139778261397e565b8015158114611696575f80fd5b5f805f606084860312156139cc575f80fd5b8335925060208401356139de816139ad565b91506139ec604085016138da565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a2b57613a2b6139f5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613a5957613a596139f5565b604052919050565b5f6001600160401b03821115613a7957613a796139f5565b50601f01601f191660200190565b5f805f60608486031215613a99575f80fd5b83359250613aa96020850161397e565b915060408401356001600160401b03811115613ac3575f80fd5b8401601f81018613613ad3575f80fd5b8035613ae6613ae182613a61565b613a31565b818152876020838501011115613afa575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b600181811c90821680613b4157607f821691505b6020821081036138bd57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454613b7181613b2d565b806020870152604060018084165f8114613b925760018114613bae57613bdb565b60ff19851660408a0152604084151560051b8a01019550613bdb565b895f5260205f205f5b85811015613bd25781548b8201860152908301908801613bb7565b8a016040019650505b509398975050505050505050565b5f60208284031215613bf9575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613c7857613c78613c42565b500490565b5f5b83811015613c97578181015183820152602001613c7f565b50505f910152565b80516138ed816139ad565b5f8060408385031215613cbb575f80fd5b82516001600160401b0380821115613cd1575f80fd5b9084019060608287031215613ce4575f80fd5b613cec613a09565b82518152602080840151613cff816138f2565b82820152604084015183811115613d14575f80fd5b80850194505087601f850112613d28575f80fd5b83519250613d38613ae184613a61565b8381528882858701011115613d4b575f80fd5b613d5a84838301848801613c7d565b80604084015250819550613d6f818801613c9f565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b80820281158282048414176107d9576107d9613c56565b6001600160401b03828116828216039080821115613e4b57613e4b613c56565b5092915050565b601f821115610ffe57805f5260205f20601f840160051c81016020851015613e775750805b601f840160051c820191505b81811015613e96575f8155600101613e83565b5050505050565b81516001600160401b03811115613eb657613eb66139f5565b613eca81613ec48454613b2d565b84613e52565b602080601f831160018114613efd575f8415613ee65750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b82811015613f2b57888601518255948401946001909101908401613f0c565b5085821015613f4857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f8251806020840152613f76816040850160208701613c7d565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156107d9576107d9613c56565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156107d9576107d9613c56565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361413f5761413f613c56565b6001019392505050565b6001600160401b03818116838216019080821115613e4b57613e4b613c56565b5f60208284031215614179575f80fd5b8135613977816138f2565b6001600160401b038181168382160280821691908281146141a7576141a7613c56565b505092915050565b5f6001600160401b03808416806141c8576141c8613c42565b92169190910492915050565b5f82516141e5818460208701613c7d565b9190910192915050565b5f602082840312156141ff575f80fd5b813560ff81168114613977575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161425138038061425183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6141048061014d5f395ff3fe6080604052600436106100f9575f3560e01c80636a7e3d8311610092578063b771b3bc11610062578063b771b3bc1461029e578063bee0a03f146102d0578063c599e24f146102ef578063d61bed7414610302578063f40797d714610321575f80fd5b80636a7e3d831461022257806376f7862114610241578063927e7e7514610260578063a3a65e481461027f575f80fd5b80632e2194d8116100cd5780632e2194d81461017b578063467ef06f146101b757806362065856146101d657806366435abf14610203575f80fd5b8062e41792146100fd5780630322ed981461011e5780630915204e1461013d5780630b77f6931461015c575b5f80fd5b348015610108575f80fd5b5061011c6101173660046137ad565b610334565b005b348015610129575f80fd5b5061011c6101383660046137c3565b610440565b348015610148575f80fd5b5061011c610157366004613806565b6105a1565b348015610167575f80fd5b5061011c61017636600461383b565b6106b7565b348015610186575f80fd5b5061019a6101953660046137c3565b61077f565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101c2575f80fd5b5061011c6101d136600461385e565b610795565b3480156101e1575f80fd5b506101f56101f0366004613894565b610af1565b6040519081526020016101ae565b34801561020e575f80fd5b5061019a61021d3660046137c3565b610b0a565b34801561022d575f80fd5b5061011c61023c36600461383b565b610b1e565b34801561024c575f80fd5b5061011c61025b3660046138ba565b610ba0565b34801561026b575f80fd5b5061011c61027a3660046137c3565b610eb9565b34801561028a575f80fd5b5061011c61029936600461385e565b611279565b3480156102a9575f80fd5b506102b86005600160991b0181565b6040516001600160a01b0390911681526020016101ae565b3480156102db575f80fd5b5061011c6102ea3660046137c3565b611432565b61011c6102fd3660046137c3565b611501565b34801561030d575f80fd5b5061011c61031c366004613806565b61150f565b6101f561032f366004613987565b611654565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f286611676565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061409883398151915292919061048890613a19565b90501180156104ba575060035f83815260078301602052604090205460ff1660058111156104b8576104b8613a4b565b145b6105235760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613a5f565b6020604051808303815f875af1158015610578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059c9190613ae9565b505050565b5f805160206140788339815191525f6105b984611687565b90505f806105ca8360400151611868565b50915091506105d98286611aa3565b5f82815260068501602090815260408083206001600160a01b0389168452909152812061060591613763565b5f61060f83611bb4565b9050816001600160401b031681606001516001600160401b031610156106475760405162461bcd60e51b815260040161051a90613b00565b5f83815260048601602090815260408083206001600160a01b038a168085529252808320805460ff60c01b1916600160c21b179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6106c18282611caf565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614078833981519152916005600160991b019163ee5b48eb9161073991600401613a5f565b6020604051808303815f875af1158015610755573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107799190613ae9565b50505050565b5f61078f64e8d4a5100083613b6a565b92915050565b5f805160206140988339815191525f6107ad83611687565b90505f806107be8360400151611dcb565b9150915080156108235760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161051a565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561085457610854613a4b565b600581111561086557610865613a4b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156108de576108de613a4b565b14806108fc57506001825160058111156108fa576108fa613a4b565b145b61095b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161051a565b60038251600581111561097057610970613a4b565b0361099757505f83815260068601602052604081206004916109929190613763565b61099b565b5060055b6020808301515f908152600888019091526040812055818160058111156109c4576109c4613a4b565b908160058111156109d7576109d7613a4b565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610a0b57610a0b613a4b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610abe57610abe613a4b565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61078f6001600160401b03831664e8d4a51000613b7d565b5f610b1482611bb4565b6080015192915050565b610b288282611aa3565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614078833981519152916005600160991b019163ee5b48eb9161073991600401613a5f565b8115610eb0575f5f805160206140788339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c01573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c289190810190613bc1565b9150915080610c8b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161051a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf29190613ae9565b825114610d565760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161051a565b60208201516001600160a01b031615610dcc5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161051a565b5f80610ddb8460400151611f6c565b91509150818814610e485760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161051a565b5f888152600786016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61059c83612144565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f8051602061407883398151915293926060830190600160c01b900460ff166004811115610f5857610f58613a4b565b6004811115610f6957610f69613a4b565b9052509050600281606001516004811115610f8657610f86613a4b565b14610fe25760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161051a565b60036060820181905250426001600160401b03166040828101919091525f848152600484016020529081208291336001600160a01b0316815260208082019290925260409081015f208351815493850151928501516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990961691909216179390931791821683178155606084015190929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360048111156110b5576110b5613a4b565b02179055509050505f6110c784611bb4565b9050815f01516001600160401b031681608001516001600160401b03161161113d5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161051a565b8151608082018051611150908390613c93565b6001600160401b03169052506111668482612496565b5f61117085612585565b90505f61118286838560800151612600565b5f878152600687016020908152604080832033845290915290209091506111a98282613d05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906111d6908590600401613dc0565b6020604051808303815f875af11580156111f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112169190613ae9565b6080850151604080516001600160401b039283168152918616602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b5f805160206140988339815191525f61129183611687565b90505f806112a28360400151611dcb565b91509150806113045760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161051a565b5f8281526005850160205260408120805461131e90613a19565b9050118015611350575060015f83815260078601602052604090205460ff16600581111561134e5761134e613a4b565b145b61136c5760405162461bcd60e51b815260040161051a90613df2565b5f828152600585016020526040812061138491613763565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061409883398151915292919061147a90613a19565b90501180156114ac575060015f83815260078301602052604090205460ff1660058111156114aa576114aa613a4b565b145b6114c85760405162461bcd60e51b815260040161051a90613df2565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613a5f565b61150c81333461281d565b50565b5f805160206140788339815191525f61152784611687565b90505f806115388360400151611868565b50915091506115478286611caf565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061157391613763565b5f61157d83611bb4565b9050816001600160401b031681606001516001600160401b031610156115b55760405162461bcd60e51b815260040161051a90613b00565b5f83815260048601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160401b0278ff0000000000000000ffffffffffffffff00000000000000001990971696909617600160c11b179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101611268565b5f8061165f34612b5f565b905061166d85828686612c09565b95945050505050565b61167e61303d565b61150c81613088565b60408051606080820183525f8083526020830181905292820152905f805160206140988339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156116fc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117239190810190613bc1565b915091508061178a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161051a565b82548251146117ed5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161051a565b60208201516001600160a01b0316156118605760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161051a565b509392505050565b5f805f835160361461188c5760405162461bcd60e51b815260040161051a90613e39565b5f805b60028110156118db576118a3816001613e82565b6118ae906008613b7d565b61ffff168682815181106118c4576118c4613e95565b016020015160f81c901b919091179060010161188f565b5061ffff8116156118fe5760405162461bcd60e51b815260040161051a90613ea9565b5f805b600481101561195957611915816003613e82565b611920906008613b7d565b63ffffffff1687611932836002613eec565b8151811061194257611942613e95565b016020015160f81c901b9190911790600101611901565b5063ffffffff81166003146119805760405162461bcd60e51b815260040161051a90613eff565b5f805b60208110156119d55761199781601f613e82565b6119a2906008613b7d565b886119ae836006613eec565b815181106119be576119be613e95565b016020015160f81c901b9190911790600101611983565b505f805b6008811015611a34576119ed816007613e82565b6119f8906008613b7d565b6001600160401b031689611a0d836026613eec565b81518110611a1d57611a1d613e95565b016020015160f81c901b91909117906001016119d9565b505f805b6008811015611a9357611a4c816007613e82565b611a57906008613b7d565b6001600160401b03168a611a6c83602e613eec565b81518110611a7c57611a7c613e95565b016020015160f81c901b9190911790600101611a38565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f80516020614078833981519152929190611aff90613a19565b9050118015611b4d575060035f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611b4b57611b4b613a4b565b145b61059c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161051a565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206140d883398151915290528390208351918201909352825491925f8051602061409883398151915292829060ff166005811115611c3457611c34613a4b565b6005811115611c4557611c45613a4b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f80516020614078833981519152929190611d0b90613a19565b9050118015611d59575060015f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611d5757611d57613a4b565b145b61059c5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161051a565b5f808251602714611dee5760405162461bcd60e51b815260040161051a90613e39565b5f805b6002811015611e3d57611e05816001613e82565b611e10906008613b7d565b61ffff16858281518110611e2657611e26613e95565b016020015160f81c901b9190911790600101611df1565b5061ffff811615611e605760405162461bcd60e51b815260040161051a90613ea9565b5f805b6004811015611ebb57611e77816003613e82565b611e82906008613b7d565b63ffffffff1686611e94836002613eec565b81518110611ea457611ea4613e95565b016020015160f81c901b9190911790600101611e63565b5063ffffffff8116600214611ee25760405162461bcd60e51b815260040161051a90613eff565b5f805b6020811015611f3757611ef981601f613e82565b611f04906008613b7d565b87611f10836006613eec565b81518110611f2057611f20613e95565b016020015160f81c901b9190911790600101611ee5565b505f86602681518110611f4c57611f4c613e95565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14611f8f5760405162461bcd60e51b815260040161051a90613e39565b5f805b6002811015611fde57611fa6816001613e82565b611fb1906008613b7d565b61ffff16858281518110611fc757611fc7613e95565b016020015160f81c901b9190911790600101611f92565b5061ffff8116156120015760405162461bcd60e51b815260040161051a90613ea9565b5f805b600481101561205c57612018816003613e82565b612023906008613b7d565b63ffffffff1686612035836002613eec565b8151811061204557612045613e95565b016020015160f81c901b9190911790600101612004565b5063ffffffff81166004146120835760405162461bcd60e51b815260040161051a90613eff565b5f805b60208110156120d85761209a81601f613e82565b6120a5906008613b7d565b876120b1836006613eec565b815181106120c1576120c1613e95565b016020015160f81c901b9190911790600101612086565b505f805b6008811015612137576120f0816007613e82565b6120fb906008613b7d565b6001600160401b031688612110836026613eec565b8151811061212057612120613e95565b016020015160f81c901b91909117906001016120dc565b5090969095509350505050565b5f8181525f805160206140d88339815191526020526040808220815160e0810190925280545f8051602061409883398151915293929190829060ff16600581111561219157612191613a4b565b60058111156121a2576121a2613a4b565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561221c5761221c613a4b565b146122395760405162461bcd60e51b815260040161051a90613f46565b60408101516001600160a01b0316336001600160a01b0316146122b35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161051a565b6122c081608001516130cb565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561230457612304613a4b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6123b8846123b281612585565b5f612600565b5f85815260068501602052604090209091506123d48282613d05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612401908590600401613dc0565b6020604051808303815f875af115801561241d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124419190613ae9565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8281525f805160206140d883398151915260205260409020815181545f805160206140988339815191529284929091829060ff191660018360058111156124e0576124e0613a4b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f8181525f805160206140d88339815191526020526040812060020180545f8051602061409883398151915291600160a01b9091046001600160401b031690819060146125d183613f8c565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561267957612639816001613e82565b612644906008613b7d565b5081515f9083908390811061265b5761265b613e95565b60200101906001600160f81b03191690815f1a905350600101612625565b505f5b60048110156126dc57612690816003613e82565b61269b906008613b7d565b6001901c60f81b826126ae836002613eec565b815181106126be576126be613e95565b60200101906001600160f81b03191690815f1a90535060010161267c565b505f5b602081101561273e576126f381601f613e82565b6126fe906008613b7d565b86901c60f81b82612710836006613eec565b8151811061272057612720613e95565b60200101906001600160f81b03191690815f1a9053506001016126df565b505f5b60088110156127a957612755816007613e82565b612760906008613b7d565b6001600160401b038616901c60f81b8261277b836026613eec565b8151811061278b5761278b613e95565b60200101906001600160f81b03191690815f1a905350600101612741565b505f5b6008811015612814576127c0816007613e82565b6127cb906008613b7d565b6001600160401b038516901c60f81b826127e683602e613eec565b815181106127f6576127f6613e95565b60200101906001600160f81b03191690815f1a9053506001016127ac565b50949350505050565b61282561326c565b5f61282f8261077f565b90505f805160206140788339815191525f61284986611bb4565b905060028151600581111561286057612860613a4b565b1461287d5760405162461bcd60e51b815260040161051a90613f46565b5f86815260048301602090815260408083206001600160a01b03891684529091529020546001600160401b03161561290e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161051a565b612917836130cb565b82816080018181516129299190613fb1565b6001600160401b031690525061293f8682612496565b5f61294987612585565b90505f61295b88838560800151612600565b5f89815260058601602090815260408083206001600160a01b038c168452909152902090915061298b8282613d05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129b8908590600401613dc0565b6020604051808303815f875af11580156129d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f89190613ae9565b604080516080810182526001600160401b03891681525f602082018190529181019190915290915060608101600190525f8a81526004808801602090815260408084206001600160a01b038e1685528252928390208451815492860151948601516001600160401b03908116600160801b0267ffffffffffffffff60801b19968216600160401b026001600160801b031990951691909216179290921793841682178155606085015190939092849260ff60c01b191668ffffffffffffffffff60801b199092169190911790600160c01b908490811115612adb57612adb613a4b565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a450505050505061059c60015f805160206140b883398151915255565b5f5f805160206140788339815191528282612b798261077f565b83549091506001600160401b03821610801590612ba357508260010154816001600160401b031611155b612c015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161051a565b949350505050565b5f612c1261326c565b5f80516020614098833981519152426001600160401b038516118015612c4c57506001600160401b038416612c4a426202a300613eec565b115b612cae5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161051a565b85612d055760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161051a565b5f86815260088201602052604090205415612d735760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161051a565b8251603014612dda5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161051a565b612de3856130cb565b5f80612e2a6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506132b6565b5f82815260058601602052604090209193509150612e488282613d05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e75908590600401613dc0565b6020604051808303815f875af1158015612e91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eb59190613ae9565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612f2e57612f2e613a4b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612fd783612585565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c0160015f805160206140b883398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661308657604051631afcd79f60e31b815260040160405180910390fd5b565b61309061303d565b6130998161365b565b61150c606082013560808301356130b660c0850160a08601613894565b6130c660e0860160c08701613fd1565b61367c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206140988339815191529060ff165f03613109575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906131519083613e82565b1061316d576001600160401b038416604083015280825261318c565b838260400181815161317f9190613fb1565b6001600160401b03169052505b5f8260200151836040015160646131a39190613fec565b6131ad9190614017565b600285015490915060ff90811690821611156132285760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161051a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206140b883398151915280546001190161329d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206140b883398151915255565b5f60608260800151516030146133205760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161051a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561339757613357816001613e82565b613362906008613b7d565b5081515f9083908390811061337957613379613e95565b60200101906001600160f81b03191690815f1a905350600101613343565b505f5b60048110156133f5576133ae816003613e82565b6133b9906008613b7d565b505f826133c7836002613eec565b815181106133d7576133d7613e95565b60200101906001600160f81b03191690815f1a90535060010161339a565b505f5b6020811015613452578451816020811061341457613414613e95565b1a60f81b82613424836006613eec565b8151811061343457613434613e95565b60200101906001600160f81b03191690815f1a9053506001016133f8565b505f5b60208110156134b2578460200151816020811061347457613474613e95565b1a60f81b82613484836026613eec565b8151811061349457613494613e95565b60200101906001600160f81b03191690815f1a905350600101613455565b505f5b6008811015613526576134c9816007613e82565b6134d4906008613b7d565b60ff1685604001516001600160401b0316901c60f81b828260466134f89190613eec565b8151811061350857613508613e95565b60200101906001600160f81b03191690815f1a9053506001016134b5565b505f5b6030811015613591578460800151818151811061354857613548613e95565b01602001516001600160f81b0319168261356383604e613eec565b8151811061357357613573613e95565b60200101906001600160f81b03191690815f1a905350600101613529565b505f5b6008811015613603576135a8816007613e82565b6135b3906008613b7d565b60608601516001600160401b0390811691161c60f81b826135d583607e613eec565b815181106135e5576135e5613e95565b60200101906001600160f81b03191690815f1a905350600101613594565b50600281604051613614919061403c565b602060405180830381855afa15801561362f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906136529190613ae9565b94909350915050565b61366361303d565b61366b6136d7565b6136736136e7565b61150c816136ef565b61368461303d565b5f5f80516020614078833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6136df61303d565b61308661375b565b61308661303d565b6136f761303d565b80355f8051602061409883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556137416060830160408401614057565b600291909101805460ff191660ff90921691909117905550565b6132a361303d565b50805461376f90613a19565b5f825580601f1061377e575050565b601f0160209004905f5260205f209081019061150c91905b808211156137a9575f8155600101613796565b5090565b5f60e082840312156137bd575f80fd5b50919050565b5f602082840312156137d3575f80fd5b5035919050565b803563ffffffff811681146137ed575f80fd5b919050565b6001600160a01b038116811461150c575f80fd5b5f8060408385031215613817575f80fd5b613820836137da565b91506020830135613830816137f2565b809150509250929050565b5f806040838503121561384c575f80fd5b823591506020830135613830816137f2565b5f6020828403121561386e575f80fd5b613877826137da565b9392505050565b80356001600160401b03811681146137ed575f80fd5b5f602082840312156138a4575f80fd5b6138778261387e565b801515811461150c575f80fd5b5f805f606084860312156138cc575f80fd5b8335925060208401356138de816138ad565b91506138ec604085016137da565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561392b5761392b6138f5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613959576139596138f5565b604052919050565b5f6001600160401b03821115613979576139796138f5565b50601f01601f191660200190565b5f805f60608486031215613999575f80fd5b833592506139a96020850161387e565b915060408401356001600160401b038111156139c3575f80fd5b8401601f810186136139d3575f80fd5b80356139e66139e182613961565b613931565b8181528760208385010111156139fa575f80fd5b816020840160208301375f602083830101528093505050509250925092565b600181811c90821680613a2d57607f821691505b6020821081036137bd57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613a7181613a19565b806020870152604060018084165f8114613a925760018114613aae57613adb565b60ff19851660408a0152604084151560051b8a01019550613adb565b895f5260205f205f5b85811015613ad25781548b8201860152908301908801613ab7565b8a016040019650505b509398975050505050505050565b5f60208284031215613af9575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613b7857613b78613b42565b500490565b808202811582820484141761078f5761078f613b56565b5f5b83811015613bae578181015183820152602001613b96565b50505f910152565b80516137ed816138ad565b5f8060408385031215613bd2575f80fd5b82516001600160401b0380821115613be8575f80fd5b9084019060608287031215613bfb575f80fd5b613c03613909565b82518152602080840151613c16816137f2565b82820152604084015183811115613c2b575f80fd5b80850194505087601f850112613c3f575f80fd5b83519250613c4f6139e184613961565b8381528882858701011115613c62575f80fd5b613c7184838301848801613b94565b80604084015250819550613c86818801613bb6565b9450505050509250929050565b6001600160401b03828116828216039080821115613cb357613cb3613b56565b5092915050565b601f82111561059c57805f5260205f20601f840160051c81016020851015613cdf5750805b601f840160051c820191505b81811015613cfe575f8155600101613ceb565b5050505050565b81516001600160401b03811115613d1e57613d1e6138f5565b613d3281613d2c8454613a19565b84613cba565b602080601f831160018114613d65575f8415613d4e5750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b82811015613d9357888601518255948401946001909101908401613d74565b5085821015613db057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f8251806020840152613dde816040850160208701613b94565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561078f5761078f613b56565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561078f5761078f613b56565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b03808316818103613fa757613fa7613b56565b6001019392505050565b6001600160401b03818116838216019080821115613cb357613cb3613b56565b5f60208284031215613fe1575f80fd5b8135613877816137f2565b6001600160401b0381811683821602808216919082811461400f5761400f613b56565b505092915050565b5f6001600160401b038084168061403057614030613b42565b92169190910492915050565b5f825161404d818460208701613b94565b9190910192915050565b5f60208284031215614067575f80fd5b813560ff81168114613877575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 05d2313f4..ed868abfc 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -39,7 +39,7 @@ type ValidatorManagerSettings 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\":\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c9f380380612c9f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612b528061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c806397fb70d41161006e57806397fb70d41461017a578063a3a65e481461018d578063b771b3bc146101a0578063bee0a03f146101ae578063c151c0b9146101c1578063f2fde38b146101d4575f80fd5b80630322ed98146100b55780633aaa9f25146100ca578063467ef06f146100f057806366435abf14610103578063715018a61461012e5780638da5cb5b14610136575b5f80fd5b6100c86100c33660046123b0565b6101e7565b005b6100dd6100d8366004612474565b6103d8565b6040519081526020015b60405180910390f35b6100c86100fe366004612517565b6103f8565b6101166101113660046123b0565b61084f565b6040516001600160401b0390911681526020016100e7565b6100c8610863565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100e7565b6100c86101883660046123b0565b610876565b6100c861019b366004612517565b610882565b6101626005600160991b0181565b6100c86101bc3660046123b0565b610a3b565b6100c86101cf366004612555565b610b4f565b6100c86101e2366004612591565b610c5d565b5f8181525f80516020612b268339815191526020526040808220815160e0810190925280545f80516020612b0683398151915293929190829060ff166005811115610234576102346125ac565b6005811115610245576102456125ac565b8152600182015460208083019190915260028301546001600160a01b0381166040808501919091526001600160401b03600160a01b909204821660608501526003909401548082166080850152600160401b8104821660a0850152600160801b90041660c0909201919091525f86815260068601909152908120805492935090916102cf906125c0565b90501180156102f057506003815160058111156102ee576102ee6125ac565b145b6103595760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f83815260068301602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161039291906004016125f8565b6020604051808303815f875af11580156103ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d29190612682565b50505050565b5f6103e1610c97565b6103ed84868585610cf2565b90505b949350505050565b5f5f80516020612b068339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610453573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261047a91908101906126ca565b91509150806104da5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610350565b82548251146104fb5760405162461bcd60e51b81526004016103509061279c565b60208201516001600160a01b0316156105265760405162461bcd60e51b8152600401610350906127e5565b5f806105358460400151611139565b91509150801561059a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610350565b5f828152600786016020526040808220815160e081019092528054829060ff1660058111156105cb576105cb6125ac565b60058111156105dc576105dc6125ac565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610655576106556125ac565b14806106735750600182516005811115610671576106716125ac565b145b6106d25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610350565b6003825160058111156106e7576106e76125ac565b036106f4575060046106f8565b5060055b6020808301515f90815260088901909152604081205581816005811115610721576107216125ac565b90816005811115610734576107346125ac565b9052505f84815260078801602052604090208251815484929190829060ff19166001836005811115610768576107686125ac565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790558151600581111561081b5761081b6125ac565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a35050505050505050565b5f61085982611398565b6080015192915050565b61086b610c97565b6108745f611493565b565b61087f81611503565b50565b5f80516020612b068339815191525f61089a83611894565b90505f806108ab8360400151611139565b915091508061090d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610350565b5f82815260058501602052604081208054610927906125c0565b9050118015610959575060015f83815260078601602052604090205460ff166005811115610957576109576125ac565b145b6109755760405162461bcd60e51b815260040161035090612834565b5f828152600585016020526040812061098d91612366565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612b06833981519152929190610a83906125c0565b9050118015610ab5575060015f83815260078301602052604090205460ff166005811115610ab357610ab36125ac565b145b610ad15760405162461bcd60e51b815260040161035090612834565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610b0a91906004016125f8565b6020604051808303815f875af1158015610b26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4a9190612682565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610b935750825b90505f826001600160401b03166001148015610bae5750303b155b905081158015610bbc575080155b15610bda5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c0457845460ff60401b1916600160401b1785555b610c0e87876119eb565b8315610c5457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610c65610c97565b6001600160a01b038116610c8e57604051631e4fbdf760e01b81525f6004820152602401610350565b61087f81611493565b33610cc97f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108745760405163118cdaa760e01b8152336004820152602401610350565b5f610cfb611a09565b5f80516020612b06833981519152426001600160401b038516118015610d3557506001600160401b038416610d33426202a30061288f565b115b610d975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610350565b85610dee5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610350565b5f86815260088201602052604090205415610e5c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610350565b8251603014610ec35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610350565b610ecc85611a53565b5f80610f136040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611bf4565b5f82815260058601602052604090209193509150610f3182826128f3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610f5e9085906004016129b2565b6020604051808303815f875af1158015610f7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f9e9190612682565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115611017576110176125ac565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556110c083611f99565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103f060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f80825160271461119e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610350565b5f805b60028110156111ed576111b58160016129e4565b6111c09060086129f7565b61ffff168582815181106111d6576111d6612a0e565b016020015160f81c901b91909117906001016111a1565b5061ffff81161561124c5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610350565b5f805b60048110156112a7576112638160036129e4565b61126e9060086129f7565b63ffffffff168661128083600261288f565b8151811061129057611290612a0e565b016020015160f81c901b919091179060010161124f565b5063ffffffff811660021461130e5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610350565b5f805b60208110156113635761132581601f6129e4565b6113309060086129f7565b8761133c83600661288f565b8151811061134c5761134c612a0e565b016020015160f81c901b9190911790600101611311565b505f8660268151811061137857611378612a0e565b016020015191976001600160f81b03199092161515965090945050505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020612b2683398151915290528390208351918201909352825491925f80516020612b0683398151915292829060ff166005811115611418576114186125ac565b6005811115611429576114296125ac565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181525f80516020612b268339815191526020526040808220815160e0810190925280545f80516020612b0683398151915293929190829060ff166005811115611550576115506125ac565b6005811115611561576115616125ac565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156115db576115db6125ac565b146116375760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610350565b60408101516001600160a01b0316336001600160a01b0316146116b15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610350565b6116be8160800151611a53565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff19166001836005811115611702576117026125ac565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6117b6846117b081611f99565b5f61203a565b5f85815260068501602052604090209091506117d282826128f3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906117ff9085906004016129b2565b6020604051808303815f875af115801561181b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183f9190612682565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612b068339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611909573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261193091908101906126ca565b91509150806119975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610350565b82548251146119b85760405162461bcd60e51b81526004016103509061279c565b60208201516001600160a01b0316156119e35760405162461bcd60e51b8152600401610350906127e5565b509392505050565b6119f3612257565b6119fc826122a0565b611a05816122c1565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a4d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612b068339815191529060ff165f03611a91575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611ad990836129e4565b10611af5576001600160401b0384166040830152808252611b14565b8382604001818151611b079190612a22565b6001600160401b03169052505b5f826020015183604001516064611b2b9190612a49565b611b359190612a74565b600285015490915060ff9081169082161115611bb05760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610350565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c5e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610350565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611cd557611c958160016129e4565b611ca09060086129f7565b5081515f90839083908110611cb757611cb7612a0e565b60200101906001600160f81b03191690815f1a905350600101611c81565b505f5b6004811015611d3357611cec8160036129e4565b611cf79060086129f7565b505f82611d0583600261288f565b81518110611d1557611d15612a0e565b60200101906001600160f81b03191690815f1a905350600101611cd8565b505f5b6020811015611d905784518160208110611d5257611d52612a0e565b1a60f81b82611d6283600661288f565b81518110611d7257611d72612a0e565b60200101906001600160f81b03191690815f1a905350600101611d36565b505f5b6020811015611df05784602001518160208110611db257611db2612a0e565b1a60f81b82611dc283602661288f565b81518110611dd257611dd2612a0e565b60200101906001600160f81b03191690815f1a905350600101611d93565b505f5b6008811015611e6457611e078160076129e4565b611e129060086129f7565b60ff1685604001516001600160401b0316901c60f81b82826046611e36919061288f565b81518110611e4657611e46612a0e565b60200101906001600160f81b03191690815f1a905350600101611df3565b505f5b6030811015611ecf5784608001518181518110611e8657611e86612a0e565b01602001516001600160f81b03191682611ea183604e61288f565b81518110611eb157611eb1612a0e565b60200101906001600160f81b03191690815f1a905350600101611e67565b505f5b6008811015611f4157611ee68160076129e4565b611ef19060086129f7565b60608601516001600160401b0390811691161c60f81b82611f1383607e61288f565b81518110611f2357611f23612a0e565b60200101906001600160f81b03191690815f1a905350600101611ed2565b50600281604051611f529190612aa5565b602060405180830381855afa158015611f6d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f909190612682565b94909350915050565b5f8181525f80516020612b268339815191526020526040812060020180545f80516020612b0683398151915291600160a01b9091046001600160401b03169081906014611fe583612ac0565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156120b3576120738160016129e4565b61207e9060086129f7565b5081515f9083908390811061209557612095612a0e565b60200101906001600160f81b03191690815f1a90535060010161205f565b505f5b6004811015612116576120ca8160036129e4565b6120d59060086129f7565b6001901c60f81b826120e883600261288f565b815181106120f8576120f8612a0e565b60200101906001600160f81b03191690815f1a9053506001016120b6565b505f5b60208110156121785761212d81601f6129e4565b6121389060086129f7565b86901c60f81b8261214a83600661288f565b8151811061215a5761215a612a0e565b60200101906001600160f81b03191690815f1a905350600101612119565b505f5b60088110156121e35761218f8160076129e4565b61219a9060086129f7565b6001600160401b038616901c60f81b826121b583602661288f565b815181106121c5576121c5612a0e565b60200101906001600160f81b03191690815f1a90535060010161217b565b505f5b600881101561224e576121fa8160076129e4565b6122059060086129f7565b6001600160401b038516901c60f81b8261222083602e61288f565b8151811061223057612230612a0e565b60200101906001600160f81b03191690815f1a9053506001016121e6565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661087457604051631afcd79f60e31b815260040160405180910390fd5b6122a8612257565b6122b06122d2565b6122b86122e2565b61087f816122ea565b6122c9612257565b61087f81612356565b6122da612257565b61087461235e565b610874612257565b6122f2612257565b80355f80516020612b0683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561233c6060830160408401612ae5565b600291909101805460ff191660ff90921691909117905550565b610c65612257565b612014612257565b508054612372906125c0565b5f825580601f10612381575050565b601f0160209004905f5260205f209081019061087f91905b808211156123ac575f8155600101612399565b5090565b5f602082840312156123c0575f80fd5b5035919050565b80356001600160401b03811681146123dd575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612418576124186123e2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612446576124466123e2565b604052919050565b5f6001600160401b03821115612466576124666123e2565b50601f01601f191660200190565b5f805f8060808587031215612487575f80fd5b612490856123c7565b9350602085013592506124a5604086016123c7565b915060608501356001600160401b038111156124bf575f80fd5b8501601f810187136124cf575f80fd5b80356124e26124dd8261244e565b61241e565b8181528860208385010111156124f6575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612527575f80fd5b813563ffffffff8116811461253a575f80fd5b9392505050565b6001600160a01b038116811461087f575f80fd5b5f808284036080811215612567575f80fd5b6060811215612574575f80fd5b50829150606083013561258681612541565b809150509250929050565b5f602082840312156125a1575f80fd5b813561253a81612541565b634e487b7160e01b5f52602160045260245ffd5b600181811c908216806125d457607f821691505b6020821081036125f257634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461260a816125c0565b806020870152604060018084165f811461262b576001811461264757612674565b60ff19851660408a0152604084151560051b8a01019550612674565b895f5260205f205f5b8581101561266b5781548b8201860152908301908801612650565b8a016040019650505b509398975050505050505050565b5f60208284031215612692575f80fd5b5051919050565b5f5b838110156126b357818101518382015260200161269b565b50505f910152565b805180151581146123dd575f80fd5b5f80604083850312156126db575f80fd5b82516001600160401b03808211156126f1575f80fd5b9084019060608287031215612704575f80fd5b61270c6123f6565b8251815260208084015161271f81612541565b82820152604084015183811115612734575f80fd5b80850194505087601f850112612748575f80fd5b835192506127586124dd8461244e565b838152888285870101111561276b575f80fd5b61277a84838301848801612699565b8060408401525081955061278f8188016126bb565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156128a2576128a261287b565b92915050565b601f821115610b4a57805f5260205f20601f840160051c810160208510156128cd5750805b601f840160051c820191505b818110156128ec575f81556001016128d9565b5050505050565b81516001600160401b0381111561290c5761290c6123e2565b6129208161291a84546125c0565b846128a8565b602080601f831160018114612953575f841561293c5750858301515b5f19600386901b1c1916600185901b1785556129aa565b5f85815260208120601f198616915b8281101561298157888601518255948401946001909101908401612962565b508582101561299e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526129d0816040850160208701612699565b601f01601f19169190910160400192915050565b818103818111156128a2576128a261287b565b80820281158282048414176128a2576128a261287b565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b03818116838216019080821115612a4257612a4261287b565b5092915050565b6001600160401b03818116838216028082169190828114612a6c57612a6c61287b565b505092915050565b5f6001600160401b0380841680612a9957634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612ab6818460208701612699565b9190910192915050565b5f6001600160401b03808316818103612adb57612adb61287b565b6001019392505050565b5f60208284031215612af5575f80fd5b813560ff8116811461253a575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612ada380380612ada83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61298d8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c806397fb70d41161006e57806397fb70d41461017a578063a3a65e481461018d578063b771b3bc146101a0578063bee0a03f146101ae578063c151c0b9146101c1578063f2fde38b146101d4575f80fd5b80630322ed98146100b55780633aaa9f25146100ca578063467ef06f146100f057806366435abf14610103578063715018a61461012e5780638da5cb5b14610136575b5f80fd5b6100c86100c33660046122a3565b6101e7565b005b6100dd6100d8366004612367565b610348565b6040519081526020015b60405180910390f35b6100c86100fe36600461240a565b610368565b6101166101113660046122a3565b6106c4565b6040516001600160401b0390911681526020016100e7565b6100c86106d8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b0390911681526020016100e7565b6100c86101883660046122a3565b6106eb565b6100c861019b36600461240a565b6106f7565b6101626005600160991b0181565b6100c86101bc3660046122a3565b6108b0565b6100c86101cf366004612448565b61097f565b6100c86101e2366004612484565b610a8d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061296183398151915292919061022f9061249f565b9050118015610261575060035f83815260078301602052604090205460ff16600581111561025f5761025f6124d7565b145b6102ca5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161030391906004016124eb565b6020604051808303815f875af115801561031f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103439190612575565b505050565b5f610351610ac7565b61035d84868585610b22565b90505b949350505050565b5f805160206129618339815191525f61038083610f69565b90505f80610391836040015161114a565b9150915080156103f65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102c1565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610427576104276124d7565b6005811115610438576104386124d7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156104b1576104b16124d7565b14806104cf57506001825160058111156104cd576104cd6124d7565b145b61052e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016102c1565b600382516005811115610543576105436124d7565b0361056a57505f83815260068601602052604081206004916105659190612259565b61056e565b5060055b6020808301515f90815260088801909152604081205581816005811115610597576105976124d7565b908160058111156105aa576105aa6124d7565b9052505f84815260078701602052604090208251815484929190829060ff191660018360058111156105de576105de6124d7565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610691576106916124d7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6106ce826113a9565b6080015192915050565b6106e0610ac7565b6106e95f6114b7565b565b6106f481611527565b50565b5f805160206129618339815191525f61070f83610f69565b90505f80610720836040015161114a565b91509150806107825760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102c1565b5f8281526005850160205260408120805461079c9061249f565b90501180156107ce575060015f83815260078601602052604090205460ff1660058111156107cc576107cc6124d7565b145b6107ea5760405162461bcd60e51b81526004016102c19061258c565b5f828152600585016020526040812061080291612259565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206129618339815191529291906108f89061249f565b905011801561092a575060015f83815260078301602052604090205460ff166005811115610928576109286124d7565b145b6109465760405162461bcd60e51b81526004016102c19061258c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161030391906004016124eb565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156109c35750825b90505f826001600160401b031660011480156109de5750303b155b9050811580156109ec575080155b15610a0a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a3457845460ff60401b1916600160401b1785555b610a3e87876118cb565b8315610a8457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610a95610ac7565b6001600160a01b038116610abe57604051631e4fbdf760e01b81525f60048201526024016102c1565b6106f4816114b7565b33610af97f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146106e95760405163118cdaa760e01b81523360048201526024016102c1565b5f610b2b6118e9565b5f80516020612961833981519152426001600160401b038516118015610b6557506001600160401b038416610b63426202a3006125e7565b115b610bc75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102c1565b85610c1e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016102c1565b5f86815260088201602052604090205415610c8c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102c1565b8251603014610cf35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102c1565b610cfc85611933565b5f80610d436040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611ad4565b5f82815260058601602052604090209193509150610d61828261264b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610d8e90859060040161272c565b6020604051808303815f875af1158015610daa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dce9190612575565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115610e4757610e476124d7565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055610ef083611e79565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061036060017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f805160206129618339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610fde573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611005919081019061276d565b915091508061106c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016102c1565b82548251146110cf5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102c1565b60208201516001600160a01b0316156111425760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102c1565b509392505050565b5f8082516027146111af5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016102c1565b5f805b60028110156111fe576111c681600161283f565b6111d1906008612852565b61ffff168582815181106111e7576111e7612869565b016020015160f81c901b91909117906001016111b2565b5061ffff81161561125d5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016102c1565b5f805b60048110156112b85761127481600361283f565b61127f906008612852565b63ffffffff16866112918360026125e7565b815181106112a1576112a1612869565b016020015160f81c901b9190911790600101611260565b5063ffffffff811660021461131f5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016102c1565b5f805b60208110156113745761133681601f61283f565b611341906008612852565b8761134d8360066125e7565b8151811061135d5761135d612869565b016020015160f81c901b9190911790600101611322565b505f8660268151811061138957611389612869565b016020015191976001600160f81b03199092161515965090945050505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0790528390208351918201909352825491925f8051602061296183398151915292829060ff16600581111561143c5761143c6124d7565b600581111561144d5761144d6124d7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040808220815160e0810190925280545f8051602061296183398151915293929190829060ff166005811115611587576115876124d7565b6005811115611598576115986124d7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c09091015290915081516005811115611612576116126124d7565b1461166e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102c1565b60408101516001600160a01b0316336001600160a01b0316146116e85760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016102c1565b6116f58160800151611933565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff19166001836005811115611739576117396124d7565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6117ed846117e781611e79565b5f611f2d565b5f8581526006850160205260409020909150611809828261264b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061183690859060040161272c565b6020604051808303815f875af1158015611852573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118769190612575565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b6118d361214a565b6118dc82612193565b6118e5816121b4565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161192d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206129618339815191529060ff165f03611971575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906119b9908361283f565b106119d5576001600160401b03841660408301528082526119f4565b83826040018181516119e7919061287d565b6001600160401b03169052505b5f826020015183604001516064611a0b91906128a4565b611a1591906128cf565b600285015490915060ff9081169082161115611a905760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102c1565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611b3e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102c1565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611bb557611b7581600161283f565b611b80906008612852565b5081515f90839083908110611b9757611b97612869565b60200101906001600160f81b03191690815f1a905350600101611b61565b505f5b6004811015611c1357611bcc81600361283f565b611bd7906008612852565b505f82611be58360026125e7565b81518110611bf557611bf5612869565b60200101906001600160f81b03191690815f1a905350600101611bb8565b505f5b6020811015611c705784518160208110611c3257611c32612869565b1a60f81b82611c428360066125e7565b81518110611c5257611c52612869565b60200101906001600160f81b03191690815f1a905350600101611c16565b505f5b6020811015611cd05784602001518160208110611c9257611c92612869565b1a60f81b82611ca28360266125e7565b81518110611cb257611cb2612869565b60200101906001600160f81b03191690815f1a905350600101611c73565b505f5b6008811015611d4457611ce781600761283f565b611cf2906008612852565b60ff1685604001516001600160401b0316901c60f81b82826046611d1691906125e7565b81518110611d2657611d26612869565b60200101906001600160f81b03191690815f1a905350600101611cd3565b505f5b6030811015611daf5784608001518181518110611d6657611d66612869565b01602001516001600160f81b03191682611d8183604e6125e7565b81518110611d9157611d91612869565b60200101906001600160f81b03191690815f1a905350600101611d47565b505f5b6008811015611e2157611dc681600761283f565b611dd1906008612852565b60608601516001600160401b0390811691161c60f81b82611df383607e6125e7565b81518110611e0357611e03612869565b60200101906001600160f81b03191690815f1a905350600101611db2565b50600281604051611e329190612900565b602060405180830381855afa158015611e4d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611e709190612575565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060020180545f8051602061296183398151915291600160a01b9091046001600160401b03169081906014611ed88361291b565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611fa657611f6681600161283f565b611f71906008612852565b5081515f90839083908110611f8857611f88612869565b60200101906001600160f81b03191690815f1a905350600101611f52565b505f5b600481101561200957611fbd81600361283f565b611fc8906008612852565b6001901c60f81b82611fdb8360026125e7565b81518110611feb57611feb612869565b60200101906001600160f81b03191690815f1a905350600101611fa9565b505f5b602081101561206b5761202081601f61283f565b61202b906008612852565b86901c60f81b8261203d8360066125e7565b8151811061204d5761204d612869565b60200101906001600160f81b03191690815f1a90535060010161200c565b505f5b60088110156120d65761208281600761283f565b61208d906008612852565b6001600160401b038616901c60f81b826120a88360266125e7565b815181106120b8576120b8612869565b60200101906001600160f81b03191690815f1a90535060010161206e565b505f5b6008811015612141576120ed81600761283f565b6120f8906008612852565b6001600160401b038516901c60f81b8261211383602e6125e7565b8151811061212357612123612869565b60200101906001600160f81b03191690815f1a9053506001016120d9565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166106e957604051631afcd79f60e31b815260040160405180910390fd5b61219b61214a565b6121a36121c5565b6121ab6121d5565b6106f4816121dd565b6121bc61214a565b6106f481612249565b6121cd61214a565b6106e9612251565b6106e961214a565b6121e561214a565b80355f8051602061296183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561222f6060830160408401612940565b600291909101805460ff191660ff90921691909117905550565b610a9561214a565b611f0761214a565b5080546122659061249f565b5f825580601f10612274575050565b601f0160209004905f5260205f20908101906106f491905b8082111561229f575f815560010161228c565b5090565b5f602082840312156122b3575f80fd5b5035919050565b80356001600160401b03811681146122d0575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561230b5761230b6122d5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612339576123396122d5565b604052919050565b5f6001600160401b03821115612359576123596122d5565b50601f01601f191660200190565b5f805f806080858703121561237a575f80fd5b612383856122ba565b935060208501359250612398604086016122ba565b915060608501356001600160401b038111156123b2575f80fd5b8501601f810187136123c2575f80fd5b80356123d56123d082612341565b612311565b8181528860208385010111156123e9575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f6020828403121561241a575f80fd5b813563ffffffff8116811461242d575f80fd5b9392505050565b6001600160a01b03811681146106f4575f80fd5b5f80828403608081121561245a575f80fd5b6060811215612467575f80fd5b50829150606083013561247981612434565b809150509250929050565b5f60208284031215612494575f80fd5b813561242d81612434565b600181811c908216806124b357607f821691505b6020821081036124d157634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f84546124fd8161249f565b806020870152604060018084165f811461251e576001811461253a57612567565b60ff19851660408a0152604084151560051b8a01019550612567565b895f5260205f205f5b8581101561255e5781548b8201860152908301908801612543565b8a016040019650505b509398975050505050505050565b5f60208284031215612585575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156125fa576125fa6125d3565b92915050565b601f82111561034357805f5260205f20601f840160051c810160208510156126255750805b601f840160051c820191505b81811015612644575f8155600101612631565b5050505050565b81516001600160401b03811115612664576126646122d5565b61267881612672845461249f565b84612600565b602080601f8311600181146126ab575f84156126945750858301515b5f19600386901b1c1916600185901b178555612702565b5f85815260208120601f198616915b828110156126d9578886015182559484019460019091019084016126ba565b50858210156126f657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561272457818101518382015260200161270c565b50505f910152565b602081525f825180602084015261274a81604085016020870161270a565b601f01601f19169190910160400192915050565b805180151581146122d0575f80fd5b5f806040838503121561277e575f80fd5b82516001600160401b0380821115612794575f80fd5b90840190606082870312156127a7575f80fd5b6127af6122e9565b825181526020808401516127c281612434565b828201526040840151838111156127d7575f80fd5b80850194505087601f8501126127eb575f80fd5b835192506127fb6123d084612341565b838152888285870101111561280e575f80fd5b61281d8483830184880161270a565b8060408401525081955061283281880161275e565b9450505050509250929050565b818103818111156125fa576125fa6125d3565b80820281158282048414176125fa576125fa6125d3565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b0381811683821601908082111561289d5761289d6125d3565b5092915050565b6001600160401b038181168382160280821691908281146128c7576128c76125d3565b505092915050565b5f6001600160401b03808416806128f457634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f825161291181846020870161270a565b9190910192915050565b5f6001600160401b03808316818103612936576129366125d3565b6001019392505050565b5f60208284031215612950575f80fd5b813560ff8116811461242d575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. From 9571e51fdf95b6ce6fb932794b6a7d6f54dd2314 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 30 Aug 2024 15:24:11 -0500 Subject: [PATCH 173/545] fix e2e --- tests/utils/staking.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index a855d4c16..c73a87405 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -435,7 +435,7 @@ func CompleteEndNativeValidation( ) *types.Receipt { abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndValidation", uint32(0), false) + callData, err := abi.Pack("completeEndValidation", uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( callData, @@ -454,7 +454,7 @@ func CompleteEndERC20Validation( ) *types.Receipt { abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndValidation", uint32(0), false) + callData, err := abi.Pack("completeEndValidation", uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( callData, @@ -473,7 +473,7 @@ func CompleteEndPoAValidation( ) *types.Receipt { abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndValidation", uint32(0), false) + callData, err := abi.Pack("completeEndValidation", uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( callData, From 38ba93adbdbf22231f9bf31cb4c5f2935c8fce9a Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 30 Aug 2024 15:39:45 -0500 Subject: [PATCH 174/545] mark storage getter private --- contracts/staking/ValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 3b91bc610..9784480e4 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -59,7 +59,7 @@ abstract contract ValidatorManager is // solhint-disable ordering function _getValidatorManagerStorage() - internal + private pure returns (ValidatorManagerStorage storage $) { From c09d79c0aebba683f21c660639a7a24c4d2b91f5 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 3 Sep 2024 09:57:44 -0400 Subject: [PATCH 175/545] update utils funcs --- tests/flows/staking/erc20_token_staking.go | 129 ++++---------------- tests/utils/staking.go | 131 ++++++++++++++++++++- 2 files changed, 153 insertions(+), 107 deletions(-) diff --git a/tests/flows/staking/erc20_token_staking.go b/tests/flows/staking/erc20_token_staking.go index 22880ed47..65ef1a7ab 100644 --- a/tests/flows/staking/erc20_token_staking.go +++ b/tests/flows/staking/erc20_token_staking.go @@ -5,9 +5,7 @@ import ( "math/big" "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" . "github.com/onsi/gomega" @@ -62,111 +60,32 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { big.NewInt(int64(stakeAmount)), ) Expect(err).Should(BeNil()) - { - // Initiate validator registration - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} - var receipt *types.Receipt - receipt, validationID = utils.InitializeERC20ValidatorRegistration( - fundedKey, - subnetAInfo, - stakeAmount, - erc20, - stakingManagerAddress, - nodeID, - blsPublicKey, - stakingManager, - ) - - // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - - // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateRegisterSubnetValidatorMessage( - signedWarpMessage, - nodeID, - weight, - subnetAInfo.SubnetID, - blsPublicKey, - ) - - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( - validationID, - true, - subnetAInfo, - pChainInfo, - network, - signatureAggregator, - ) - - // Deliver the Warp message to the subnet - receipt = utils.CompleteERC20ValidatorRegistration( - fundedKey, - subnetAInfo, - stakingManagerAddress, - registrationSignedMessage, - ) - // Check that the validator is registered in the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidationPeriodRegistered, - ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - } + utils.InitializeAndCompleteERC20ValidatorRegistration( + network, + signatureAggregator, + fundedKey, + subnetAInfo, + pChainInfo, + stakingManager, + stakingManagerAddress, + validationID, + weight, + erc20, + stakeAmount, + ) // // Delist the validator // - { - receipt := utils.InitializeEndERC20Validation( - fundedKey, - subnetAInfo, - stakingManager, - validationID, - ) - validatorRemovalEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidatorRemovalInitialized, - ) - Expect(err).Should(BeNil()) - Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) - - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - Expect(err).Should(BeNil()) - - // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 0) - - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( - validationID, - false, - subnetAInfo, - pChainInfo, - network, - signatureAggregator, - ) - - // Deliver the Warp message to the subnet - receipt = utils.CompleteEndERC20Validation( - fundedKey, - subnetAInfo, - stakingManagerAddress, - registrationSignedMessage, - ) - - // Check that the validator is has been delisted from the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidationPeriodEnded, - ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - } + utils.InitializeAndCompleteEndERC20Validation( + network, + signatureAggregator, + fundedKey, + subnetAInfo, + pChainInfo, + stakingManager, + stakingManagerAddress, + validationID, + weight, + ) } diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 5dc295286..e10a91a56 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -434,6 +434,73 @@ func InitializeAndCompleteNativeValidatorRegistration( return validationID } +func InitializeAndCompleteERC20ValidatorRegistration( + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, + fundedKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, + stakingManagerAddress common.Address, + validationID ids.ID, + weight uint64, + erc20 *exampleerc20.ExampleERC20, + stakeAmount uint64, +) { + // Initiate validator registration + nodeID := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} + var receipt *types.Receipt + receipt, validationID = InitializeERC20ValidatorRegistration( + fundedKey, + subnetInfo, + stakeAmount, + erc20, + stakingManagerAddress, + nodeID, + blsPublicKey, + stakingManager, + ) + + // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + ValidateRegisterSubnetValidatorMessage( + signedWarpMessage, + nodeID, + weight, + subnetInfo.SubnetID, + blsPublicKey, + ) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + validationID, + true, + subnetInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = CompleteERC20ValidatorRegistration( + fundedKey, + subnetInfo, + stakingManagerAddress, + registrationSignedMessage, + ) + // Check that the validator is registered in the staking contract + registrationEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) +} + func InitializeAndCompletePoAValidatorRegistration( network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, @@ -634,7 +701,7 @@ func InitializeAndCompleteEndNativeValidation( subnetInfo interfaces.SubnetTestInfo, pChainInfo interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, - stakingManagerContractAddress common.Address, + stakingManagerAddress common.Address, validationID ids.ID, weight uint64, ) { @@ -674,7 +741,67 @@ func InitializeAndCompleteEndNativeValidation( receipt = CompleteEndNativeValidation( fundedKey, subnetInfo, - stakingManagerContractAddress, + stakingManagerAddress, + registrationSignedMessage, + ) + + // Check that the validator is has been delisted from the staking contract + registrationEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodEnded, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) +} + +func InitializeAndCompleteEndERC20Validation( + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, + fundedKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, + stakingManagerAddress common.Address, + validationID ids.ID, + weight uint64, +) { + receipt := InitializeEndERC20Validation( + fundedKey, + subnetInfo, + stakingManager, + validationID, + ) + validatorRemovalEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + Expect(err).Should(BeNil()) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, 0) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + validationID, + false, + subnetInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = CompleteEndERC20Validation( + fundedKey, + subnetInfo, + stakingManagerAddress, registrationSignedMessage, ) From df23d5e343d154e1201920360b4c4d47d7777df9 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 3 Sep 2024 10:37:47 -0400 Subject: [PATCH 176/545] Fix test --- .../staking/tests/PoSValidatorManagerTests.t.sol | 12 ++---------- contracts/staking/tests/ValidatorManagerTests.t.sol | 12 ++++-------- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index a43a8d0da..c077639b7 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -21,18 +21,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); function testRegisterManyValidators() public { - for (uint i = 1; i <= 1; i++) { + for (uint64 i = 1; i <= 10; i++) { bytes32 nodeID = sha256(new bytes(i)); - // _setUpCompleteValidatorRegistration({ - // nodeID: DEFAULT_NODE_ID, - // subnetID: DEFAULT_SUBNET_ID, - // weight: DEFAULT_WEIGHT, - // registrationExpiry: uint64(DEFAULT_EXPIRY * i), - // blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - // registrationTimestamp: uint64(DEFAULT_REGISTRATION_TIMESTAMP * i) - // }); _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID2, + nodeID: nodeID, subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, registrationExpiry: uint64(DEFAULT_EXPIRY * i), diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index d2038eb34..183cb73f2 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -226,14 +226,12 @@ abstract contract ValidatorManagerTest is Test { blsPublicKey: blsPublicKey }) ); - vm.warp(DEFAULT_EXPIRY - 1); + vm.warp(registrationExpiry - 1); _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); _beforeSend(weight); vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidationPeriodCreated( - validationID, DEFAULT_NODE_ID, bytes32(0), weight, DEFAULT_EXPIRY - ); + emit ValidationPeriodCreated(validationID, nodeID, bytes32(0), weight, registrationExpiry); _initializeValidatorRegistration(nodeID, registrationExpiry, blsPublicKey, weight); } @@ -264,14 +262,12 @@ abstract contract ValidatorManagerTest is Test { blsPublicKey: blsPublicKey }) ); - vm.warp(DEFAULT_EXPIRY - 1); + vm.warp(registrationExpiry - 1); _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); _beforeSend(weight); vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidationPeriodCreated( - validationID, DEFAULT_NODE_ID, bytes32(0), weight, DEFAULT_EXPIRY - ); + emit ValidationPeriodCreated(validationID, nodeID, bytes32(0), weight, registrationExpiry); _initializeValidatorRegistration(nodeID, registrationExpiry, blsPublicKey, weight); } From 6c3ef54a123c918d0d74a807b2fadae7cb40ba1e Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 3 Sep 2024 10:39:37 -0400 Subject: [PATCH 177/545] Fix tests --- contracts/staking/tests/ValidatorManagerTests.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 01e6212ec..9d528276d 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -223,13 +223,13 @@ abstract contract ValidatorManagerTest is Test { blsPublicKey: blsPublicKey }) ); - vm.warp(DEFAULT_EXPIRY - 1); + vm.warp(registrationExpiry - 1); _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); _beforeSend(weight); vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodCreated( - validationID, DEFAULT_NODE_ID, bytes32(0), weight, DEFAULT_EXPIRY + validationID, nodeID, bytes32(0), weight, registrationExpiry ); _initializeValidatorRegistration(nodeID, registrationExpiry, blsPublicKey, weight); From 2b47ef7ffa6577a75b5c3123c62945e8582cc0fd Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 3 Sep 2024 10:41:48 -0400 Subject: [PATCH 178/545] Lint --- contracts/staking/tests/ValidatorManagerTests.t.sol | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 9d528276d..647d7d3d8 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -228,9 +228,7 @@ abstract contract ValidatorManagerTest is Test { _beforeSend(weight); vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidationPeriodCreated( - validationID, nodeID, bytes32(0), weight, registrationExpiry - ); + emit ValidationPeriodCreated(validationID, nodeID, bytes32(0), weight, registrationExpiry); _initializeValidatorRegistration(nodeID, registrationExpiry, blsPublicKey, weight); } From b34d2e5e7b29242537c78326cf1e071267351de2 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 3 Sep 2024 12:52:43 -0500 Subject: [PATCH 179/545] verify nonce --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 34 ++- .../interfaces/IPoSValidatorManager.sol | 6 + .../tests/PoSValidatorManagerTests.t.sol | 222 +++++++++++++++++- 5 files changed, 257 insertions(+), 9 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 633a7a883..195f53393 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161452438038061452483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143d78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80636a7e3d831161009e5780639e1bc4ef1161006e5780639e1bc4ef1461021b578063a3a65e481461022e578063b771b3bc14610241578063bee0a03f14610267578063d61bed741461027a575f80fd5b80636a7e3d83146101cf57806376f78621146101e2578063872fda64146101f5578063927e7e7514610208575f80fd5b80632e2194d8116100d95780632e2194d814610158578063467ef06f14610188578063620658561461019b57806366435abf146101bc575f80fd5b80630322ed981461010a5780630915204e1461011f5780630b77f6931461013257806327f39ca814610145575b5f80fd5b61011d610118366004613a30565b61028d565b005b61011d61012d366004613a73565b6103ee565b61011d610140366004613aa8565b610504565b61011d610153366004613acb565b6105cc565b61016b610166366004613a30565b6106da565b6040516001600160401b0390911681526020015b60405180910390f35b61011d610196366004613afd565b6106f0565b6101ae6101a9366004613b33565b610a4c565b60405190815260200161017f565b61016b6101ca366004613a30565b610a65565b61011d6101dd366004613aa8565b610a79565b61011d6101f0366004613b59565b610afb565b6101ae610203366004613c26565b610e14565b61011d610216366004613a30565b610e39565b61011d610229366004613cc2565b6111f9565b61011d61023c366004613afd565b611208565b61024f6005600160991b0181565b6040516001600160a01b03909116815260200161017f565b61011d610275366004613a30565b6113c1565b61011d610288366004613a73565b611490565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061436b8339815191529291906102d590613ce2565b9050118015610307575060035f83815260078301602052604090205460ff16600581111561030557610305613d1a565b145b6103705760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613d2e565b6020604051808303815f875af11580156103c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e99190613db8565b505050565b5f8051602061434b8339815191525f610406846115d5565b90505f8061041783604001516117b6565b509150915061042682866119f1565b5f82815260068501602090815260408083206001600160a01b03891684529091528120610452916139e6565b5f61045c83611b02565b9050816001600160401b031681606001516001600160401b031610156104945760405162461bcd60e51b815260040161036790613dcf565b5f83815260048601602090815260408083206001600160a01b038a168085529252808320805460ff60c01b1916600160c21b179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b61050e8282611bfd565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061434b833981519152916005600160991b019163ee5b48eb9161058691600401613d2e565b6020604051808303815f875af11580156105a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c69190613db8565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106105750825b90505f826001600160401b0316600114801561062b5750303b155b905081158015610639575080155b156106575760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561068157845460ff60401b1916600160401b1785555b61068b8787611d19565b83156106d157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6106ea64e8d4a5100083613e39565b92915050565b5f8051602061436b8339815191525f610708836115d5565b90505f806107198360400151611d33565b91509150801561077e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610367565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156107af576107af613d1a565b60058111156107c0576107c0613d1a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561083957610839613d1a565b1480610857575060018251600581111561085557610855613d1a565b145b6108b65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610367565b6003825160058111156108cb576108cb613d1a565b036108f257505f83815260068601602052604081206004916108ed91906139e6565b6108f6565b5060055b6020808301515f9081526008880190915260408120558181600581111561091f5761091f613d1a565b9081600581111561093257610932613d1a565b9052505f84815260078701602052604090208251815484929190829060ff1916600183600581111561096657610966613d1a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610a1957610a19613d1a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6106ea6001600160401b03831664e8d4a51000613e4c565b5f610a6f82611b02565b6080015192915050565b610a8382826119f1565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061434b833981519152916005600160991b019163ee5b48eb9161058691600401613d2e565b8115610e0b575f5f8051602061434b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610b5c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b839190810190613e90565b9150915080610be65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610367565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c4d9190613db8565b825114610cb15760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610367565b60208201516001600160a01b031615610d275760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610367565b5f80610d368460400151611ed4565b91509150818814610da35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610367565b5f888152600786016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6103e9836120ac565b5f80610e1f866123fe565b9050610e2d858286866124ab565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f8051602061434b83398151915293926060830190600160c01b900460ff166004811115610ed857610ed8613d1a565b6004811115610ee957610ee9613d1a565b9052509050600281606001516004811115610f0657610f06613d1a565b14610f625760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b6064820152608401610367565b60036060820181905250426001600160401b03166040828101919091525f848152600484016020529081208291336001600160a01b0316815260208082019290925260409081015f208351815493850151928501516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990961691909216179390931791821683178155606084015190929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b83600481111561103557611035613d1a565b02179055509050505f61104784611b02565b9050815f01516001600160401b031681608001516001600160401b0316116110bd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610367565b81516080820180516110d0908390613f62565b6001600160401b03169052506110e684826128df565b5f6110f0856129ce565b90505f61110286838560800151612a49565b5f878152600687016020908152604080832033845290915290209091506111298282613fd4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611156908590600401614093565b6020604051808303815f875af1158015611172573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111969190613db8565b6080850151604080516001600160401b039283168152918616602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b611204823383612c66565b5050565b5f8051602061436b8339815191525f611220836115d5565b90505f806112318360400151611d33565b91509150806112935760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610367565b5f828152600585016020526040812080546112ad90613ce2565b90501180156112df575060015f83815260078601602052604090205460ff1660058111156112dd576112dd613d1a565b145b6112fb5760405162461bcd60e51b8152600401610367906140c5565b5f8281526005850160205260408120611313916139e6565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061436b83398151915292919061140990613ce2565b905011801561143b575060015f83815260078301602052604090205460ff16600581111561143957611439613d1a565b145b6114575760405162461bcd60e51b8152600401610367906140c5565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613d2e565b5f8051602061434b8339815191525f6114a8846115d5565b90505f806114b983604001516117b6565b50915091506114c88286611bfd565b5f82815260058501602090815260408083206001600160a01b038916845290915281206114f4916139e6565b5f6114fe83611b02565b9050816001600160401b031681606001516001600160401b031610156115365760405162461bcd60e51b815260040161036790613dcf565b5f83815260048601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160401b0278ff0000000000000000ffffffffffffffff00000000000000001990971696909617600160c11b179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b691016111e8565b60408051606080820183525f8083526020830181905292820152905f8051602061436b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561164a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116719190810190613e90565b91509150806116d85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610367565b825482511461173b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610367565b60208201516001600160a01b0316156117ae5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610367565b509392505050565b5f805f83516036146117da5760405162461bcd60e51b81526004016103679061410c565b5f805b6002811015611829576117f1816001614155565b6117fc906008613e4c565b61ffff1686828151811061181257611812614168565b016020015160f81c901b91909117906001016117dd565b5061ffff81161561184c5760405162461bcd60e51b81526004016103679061417c565b5f805b60048110156118a757611863816003614155565b61186e906008613e4c565b63ffffffff16876118808360026141bf565b8151811061189057611890614168565b016020015160f81c901b919091179060010161184f565b5063ffffffff81166003146118ce5760405162461bcd60e51b8152600401610367906141d2565b5f805b6020811015611923576118e581601f614155565b6118f0906008613e4c565b886118fc8360066141bf565b8151811061190c5761190c614168565b016020015160f81c901b91909117906001016118d1565b505f805b60088110156119825761193b816007614155565b611946906008613e4c565b6001600160401b03168961195b8360266141bf565b8151811061196b5761196b614168565b016020015160f81c901b9190911790600101611927565b505f805b60088110156119e15761199a816007614155565b6119a5906008613e4c565b6001600160401b03168a6119ba83602e6141bf565b815181106119ca576119ca614168565b016020015160f81c901b9190911790600101611986565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f8051602061434b833981519152929190611a4d90613ce2565b9050118015611a9b575060035f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611a9957611a99613d1a565b145b6103e95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b6064820152608401610367565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206143ab83398151915290528390208351918201909352825491925f8051602061436b83398151915292829060ff166005811115611b8257611b82613d1a565b6005811115611b9357611b93613d1a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f8051602061434b833981519152929190611c5990613ce2565b9050118015611ca7575060015f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611ca557611ca5613d1a565b145b6103e95760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e670000000000000000006064820152608401610367565b611d21612fab565b611d2a82612ff6565b6112048161303c565b5f808251602714611d565760405162461bcd60e51b81526004016103679061410c565b5f805b6002811015611da557611d6d816001614155565b611d78906008613e4c565b61ffff16858281518110611d8e57611d8e614168565b016020015160f81c901b9190911790600101611d59565b5061ffff811615611dc85760405162461bcd60e51b81526004016103679061417c565b5f805b6004811015611e2357611ddf816003614155565b611dea906008613e4c565b63ffffffff1686611dfc8360026141bf565b81518110611e0c57611e0c614168565b016020015160f81c901b9190911790600101611dcb565b5063ffffffff8116600214611e4a5760405162461bcd60e51b8152600401610367906141d2565b5f805b6020811015611e9f57611e6181601f614155565b611e6c906008613e4c565b87611e788360066141bf565b81518110611e8857611e88614168565b016020015160f81c901b9190911790600101611e4d565b505f86602681518110611eb457611eb4614168565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14611ef75760405162461bcd60e51b81526004016103679061410c565b5f805b6002811015611f4657611f0e816001614155565b611f19906008613e4c565b61ffff16858281518110611f2f57611f2f614168565b016020015160f81c901b9190911790600101611efa565b5061ffff811615611f695760405162461bcd60e51b81526004016103679061417c565b5f805b6004811015611fc457611f80816003614155565b611f8b906008613e4c565b63ffffffff1686611f9d8360026141bf565b81518110611fad57611fad614168565b016020015160f81c901b9190911790600101611f6c565b5063ffffffff8116600414611feb5760405162461bcd60e51b8152600401610367906141d2565b5f805b60208110156120405761200281601f614155565b61200d906008613e4c565b876120198360066141bf565b8151811061202957612029614168565b016020015160f81c901b9190911790600101611fee565b505f805b600881101561209f57612058816007614155565b612063906008613e4c565b6001600160401b0316886120788360266141bf565b8151811061208857612088614168565b016020015160f81c901b9190911790600101612044565b5090969095509350505050565b5f8181525f805160206143ab8339815191526020526040808220815160e0810190925280545f8051602061436b83398151915293929190829060ff1660058111156120f9576120f9613d1a565b600581111561210a5761210a613d1a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561218457612184613d1a565b146121a15760405162461bcd60e51b815260040161036790614219565b60408101516001600160a01b0316336001600160a01b03161461221b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610367565b61222881608001516130f0565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561226c5761226c613d1a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6123208461231a816129ce565b5f612a49565b5f858152600685016020526040902090915061233c8282613fd4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612369908590600401614093565b6020604051808303815f875af1158015612385573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123a99190613db8565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061434b8339815191528161241784613291565b90505f612423826106da565b83549091506001600160401b0382161080159061244d57508260010154816001600160401b031611155b610e315760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610367565b5f6124b46132c7565b5f8051602061436b833981519152426001600160401b0385161180156124ee57506001600160401b0384166124ec426202a3006141bf565b115b6125505760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610367565b856125a75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610367565b5f868152600882016020526040902054156126155760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610367565b825160301461267c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610367565b612685856130f0565b5f806126cc6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506132fe565b5f828152600586016020526040902091935091506126ea8282613fd4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612717908590600401614093565b6020604051808303815f875af1158015612733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127579190613db8565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156127d0576127d0613d1a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612879836129ce565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610e3160015f8051602061438b83398151915255565b5f8281525f805160206143ab83398151915260205260409020815181545f8051602061436b8339815191529284929091829060ff1916600183600581111561292957612929613d1a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f8181525f805160206143ab8339815191526020526040812060020180545f8051602061436b83398151915291600160a01b9091046001600160401b03169081906014612a1a8361425f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612ac257612a82816001614155565b612a8d906008613e4c565b5081515f90839083908110612aa457612aa4614168565b60200101906001600160f81b03191690815f1a905350600101612a6e565b505f5b6004811015612b2557612ad9816003614155565b612ae4906008613e4c565b6001901c60f81b82612af78360026141bf565b81518110612b0757612b07614168565b60200101906001600160f81b03191690815f1a905350600101612ac5565b505f5b6020811015612b8757612b3c81601f614155565b612b47906008613e4c565b86901c60f81b82612b598360066141bf565b81518110612b6957612b69614168565b60200101906001600160f81b03191690815f1a905350600101612b28565b505f5b6008811015612bf257612b9e816007614155565b612ba9906008613e4c565b6001600160401b038616901c60f81b82612bc48360266141bf565b81518110612bd457612bd4614168565b60200101906001600160f81b03191690815f1a905350600101612b8a565b505f5b6008811015612c5d57612c09816007614155565b612c14906008613e4c565b6001600160401b038516901c60f81b82612c2f83602e6141bf565b81518110612c3f57612c3f614168565b60200101906001600160f81b03191690815f1a905350600101612bf5565b50949350505050565b612c6e6132c7565b5f612c7b61016683613291565b90505f8051602061434b8339815191525f612c9586611b02565b9050600281516005811115612cac57612cac613d1a565b14612cc95760405162461bcd60e51b815260040161036790614219565b5f86815260048301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612d5a5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b6064820152608401610367565b612d63836130f0565b8281608001818151612d759190614284565b6001600160401b0316905250612d8b86826128df565b5f612d95876129ce565b90505f612da788838560800151612a49565b5f89815260058601602090815260408083206001600160a01b038c1684529091529020909150612dd78282613fd4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e04908590600401614093565b6020604051808303815f875af1158015612e20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e449190613db8565b604080516080810182526001600160401b03891681525f602082018190529181019190915290915060608101600190525f8a81526004808801602090815260408084206001600160a01b038e1685528252928390208451815492860151948601516001600160401b03908116600160801b0267ffffffffffffffff60801b19968216600160401b026001600160801b031990951691909216179290921793841682178155606085015190939092849260ff60c01b191668ffffffffffffffffff60801b199092169190911790600160c01b908490811115612f2757612f27613d1a565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a45050505050506103e960015f8051602061438b83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612ff457604051631afcd79f60e31b815260040160405180910390fd5b565b612ffe612fab565b613007816136b6565b6130396060820135608083013561302460c0850160a08601613b33565b61303460e0860160c087016142a4565b6136d7565b50565b613044612fab565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166130d05760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610367565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061436b8339815191529060ff165f0361312e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906131769083614155565b10613192576001600160401b03841660408301528082526131b1565b83826040018181516131a49190614284565b6001600160401b03169052505b5f8260200151836040015160646131c891906142bf565b6131d291906142ea565b600285015490915060ff908116908216111561324d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610367565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6106ea827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613732565b5f8051602061438b8339815191528054600119016132f857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146133685760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610367565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156133df5761339f816001614155565b6133aa906008613e4c565b5081515f908390839081106133c1576133c1614168565b60200101906001600160f81b03191690815f1a90535060010161338b565b505f5b600481101561343d576133f6816003614155565b613401906008613e4c565b505f8261340f8360026141bf565b8151811061341f5761341f614168565b60200101906001600160f81b03191690815f1a9053506001016133e2565b505f5b602081101561349a578451816020811061345c5761345c614168565b1a60f81b8261346c8360066141bf565b8151811061347c5761347c614168565b60200101906001600160f81b03191690815f1a905350600101613440565b505f5b60208110156134fa57846020015181602081106134bc576134bc614168565b1a60f81b826134cc8360266141bf565b815181106134dc576134dc614168565b60200101906001600160f81b03191690815f1a90535060010161349d565b505f5b600881101561356e57613511816007614155565b61351c906008613e4c565b60ff1685604001516001600160401b0316901c60f81b8282604661354091906141bf565b8151811061355057613550614168565b60200101906001600160f81b03191690815f1a9053506001016134fd565b505f5b60308110156135d9578460800151818151811061359057613590614168565b01602001516001600160f81b031916826135ab83604e6141bf565b815181106135bb576135bb614168565b60200101906001600160f81b03191690815f1a905350600101613571565b505f5b600881101561364b576135f0816007614155565b6135fb906008613e4c565b60608601516001600160401b0390811691161c60f81b8261361d83607e6141bf565b8151811061362d5761362d614168565b60200101906001600160f81b03191690815f1a9053506001016135dc565b5060028160405161365c919061430f565b602060405180830381855afa158015613677573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061369a9190613db8565b94909350915050565b60015f8051602061438b83398151915255565b6136be612fab565b6136c6613894565b6136ce6138a4565b613039816138ac565b6136df612fab565b5f5f8051602061434b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061379c9190613db8565b90506137b36001600160a01b038516333086613918565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156137f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061381b9190613db8565b90508181116138815760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610367565b61388b8282614155565b95945050505050565b61389c612fab565b612ff4613972565b612ff4612fab565b6138b4612fab565b80355f8051602061436b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138fe606083016040840161432a565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526105c690859061397a565b6136a3612fab565b5f8060205f8451602086015f885af180613999576040513d5f823e3d81fd5b50505f513d915081156139b05780600114156139bd565b6001600160a01b0384163b155b156105c657604051635274afe760e01b81526001600160a01b0385166004820152602401610367565b5080546139f290613ce2565b5f825580601f10613a01575050565b601f0160209004905f5260205f209081019061303991905b80821115613a2c575f8155600101613a19565b5090565b5f60208284031215613a40575f80fd5b5035919050565b803563ffffffff81168114613a5a575f80fd5b919050565b6001600160a01b0381168114613039575f80fd5b5f8060408385031215613a84575f80fd5b613a8d83613a47565b91506020830135613a9d81613a5f565b809150509250929050565b5f8060408385031215613ab9575f80fd5b823591506020830135613a9d81613a5f565b5f80828403610100811215613ade575f80fd5b60e0811215613aeb575f80fd5b5082915060e0830135613a9d81613a5f565b5f60208284031215613b0d575f80fd5b613b1682613a47565b9392505050565b80356001600160401b0381168114613a5a575f80fd5b5f60208284031215613b43575f80fd5b613b1682613b1d565b8015158114613039575f80fd5b5f805f60608486031215613b6b575f80fd5b833592506020840135613b7d81613b4c565b9150613b8b60408501613a47565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bca57613bca613b94565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613bf857613bf8613b94565b604052919050565b5f6001600160401b03821115613c1857613c18613b94565b50601f01601f191660200190565b5f805f8060808587031215613c39575f80fd5b8435935060208501359250613c5060408601613b1d565b915060608501356001600160401b03811115613c6a575f80fd5b8501601f81018713613c7a575f80fd5b8035613c8d613c8882613c00565b613bd0565b818152886020838501011115613ca1575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613cd3575f80fd5b50508035926020909101359150565b600181811c90821680613cf657607f821691505b602082108103613d1457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613d4081613ce2565b806020870152604060018084165f8114613d615760018114613d7d57613daa565b60ff19851660408a0152604084151560051b8a01019550613daa565b895f5260205f205f5b85811015613da15781548b8201860152908301908801613d86565b8a016040019650505b509398975050505050505050565b5f60208284031215613dc8575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613e4757613e47613e11565b500490565b80820281158282048414176106ea576106ea613e25565b5f5b83811015613e7d578181015183820152602001613e65565b50505f910152565b8051613a5a81613b4c565b5f8060408385031215613ea1575f80fd5b82516001600160401b0380821115613eb7575f80fd5b9084019060608287031215613eca575f80fd5b613ed2613ba8565b82518152602080840151613ee581613a5f565b82820152604084015183811115613efa575f80fd5b80850194505087601f850112613f0e575f80fd5b83519250613f1e613c8884613c00565b8381528882858701011115613f31575f80fd5b613f4084838301848801613e63565b80604084015250819550613f55818801613e85565b9450505050509250929050565b6001600160401b03828116828216039080821115613f8257613f82613e25565b5092915050565b601f8211156103e957805f5260205f20601f840160051c81016020851015613fae5750805b601f840160051c820191505b81811015613fcd575f8155600101613fba565b5050505050565b81516001600160401b03811115613fed57613fed613b94565b61400181613ffb8454613ce2565b84613f89565b602080601f831160018114614034575f841561401d5750858301515b5f19600386901b1c1916600185901b17855561408b565b5f85815260208120601f198616915b8281101561406257888601518255948401946001909101908401614043565b508582101561407f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526140b1816040850160208701613e63565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156106ea576106ea613e25565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156106ea576106ea613e25565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361427a5761427a613e25565b6001019392505050565b6001600160401b03818116838216019080821115613f8257613f82613e25565b5f602082840312156142b4575f80fd5b8135613b1681613a5f565b6001600160401b038181168382160280821691908281146142e2576142e2613e25565b505092915050565b5f6001600160401b038084168061430357614303613e11565b92169190910492915050565b5f8251614320818460208701613e63565b9190910192915050565b5f6020828403121561433a575f80fd5b813560ff81168114613b16575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516147b73803806147b783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61466a8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80636a7e3d831161009e5780639e1bc4ef1161006e5780639e1bc4ef1461021b578063a3a65e481461022e578063b771b3bc14610241578063bee0a03f14610267578063d61bed741461027a575f80fd5b80636a7e3d83146101cf57806376f78621146101e2578063872fda64146101f5578063927e7e7514610208575f80fd5b80632e2194d8116100d95780632e2194d814610158578063467ef06f14610188578063620658561461019b57806366435abf146101bc575f80fd5b80630322ed981461010a5780630915204e1461011f5780630b77f6931461013257806327f39ca814610145575b5f80fd5b61011d610118366004613c2a565b61028d565b005b61011d61012d366004613c6d565b6103ee565b61011d610140366004613ca2565b6105bf565b61011d610153366004613cc5565b610687565b61016b610166366004613c2a565b610795565b6040516001600160401b0390911681526020015b60405180910390f35b61011d610196366004613cf7565b6107ab565b6101ae6101a9366004613d2d565b610b07565b60405190815260200161017f565b61016b6101ca366004613c2a565b610b20565b61011d6101dd366004613ca2565b610b34565b61011d6101f0366004613d53565b610bb6565b6101ae610203366004613e20565b610ecf565b61011d610216366004613c2a565b610ef4565b61011d610229366004613ebc565b611306565b61011d61023c366004613cf7565b611315565b61024f6005600160991b0181565b6040516001600160a01b03909116815260200161017f565b61011d610275366004613c2a565b6114c9565b61011d610288366004613c6d565b611598565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145fe8339815191529291906102d590613edc565b9050118015610307575060035f83815260078301602052604090205460ff16600581111561030557610305613f14565b145b6103705760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613f28565b6020604051808303815f875af11580156103c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e99190613fb2565b505050565b5f805160206145de8339815191525f61040684611794565b90505f806104178360400151611975565b50915091506104268286611bb0565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061045291613be0565b5f61045c83611cc3565b9050816001600160401b031681606001516001600160401b031610156104945760405162461bcd60e51b815260040161036790613fc9565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156104e65760405162461bcd60e51b81526004016103679061400b565b60035f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff16600481111561052a5761052a613f14565b146105475760405162461bcd60e51b815260040161036790614054565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320600101805460ff60401b191668040000000000000000179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6105c98282611dbe565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206145de833981519152916005600160991b019163ee5b48eb9161064191600401613f28565b6020604051808303815f875af115801561065d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106819190613fb2565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106cb5750825b90505f826001600160401b031660011480156106e65750303b155b9050811580156106f4575080155b156107125760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561073c57845460ff60401b1916600160401b1785555b6107468787611edc565b831561078c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6107a564e8d4a51000836140cc565b92915050565b5f805160206145fe8339815191525f6107c383611794565b90505f806107d48360400151611ef6565b9150915080156108395760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610367565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561086a5761086a613f14565b600581111561087b5761087b613f14565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156108f4576108f4613f14565b1480610912575060018251600581111561091057610910613f14565b145b6109715760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610367565b60038251600581111561098657610986613f14565b036109ad57505f83815260068601602052604081206004916109a89190613be0565b6109b1565b5060055b6020808301515f908152600888019091526040812055818160058111156109da576109da613f14565b908160058111156109ed576109ed613f14565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610a2157610a21613f14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610ad457610ad4613f14565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6107a56001600160401b03831664e8d4a510006140df565b5f610b2a82611cc3565b6080015192915050565b610b3e8282611bb0565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206145de833981519152916005600160991b019163ee5b48eb9161064191600401613f28565b8115610ec6575f5f805160206145de8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c17573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c3e9190810190614123565b9150915080610ca15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610367565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ce4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d089190613fb2565b825114610d6c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610367565b60208201516001600160a01b031615610de25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610367565b5f80610df18460400151612097565b91509150818814610e5e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610367565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6103e98361226f565b5f80610eda866125c1565b9050610ee88582868661266e565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602090815260408083203384528252808320815160c08101835281546001600160401b038082168352600160401b808304821696840196909652600160801b8204811694830194909452600160c01b900483166060820152600182015492831660808201525f805160206145de8339815191529493909260a0840191900460ff166004811115610fab57610fab613f14565b6004811115610fbc57610fbc613f14565b905250905060028160a001516004811115610fd957610fd9613f14565b146110355760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b6064820152608401610367565b5f61103f84612aa2565b9050600360a08301819052506001600160401b0342811660408085019190915290821660808401525f85815260038501602052908120839161107e3390565b6001600160a01b0316815260208082019290925260409081015f2083518154938501519285015160608601516001600160401b039283166001600160801b031990961695909517600160401b9483168502176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b94821694909402939093178155608084015160018201805467ffffffffffffffff19811692909516918217815560a086015192949293909268ffffffffffffffffff19169091179083600481111561114e5761114e613f14565b02179055509050505f61116085611cc3565b9050825f01516001600160401b031681608001516001600160401b0316116111d65760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610367565b82516080820180516111e99083906141f5565b6001600160401b03169052506111ff8582612b1d565b5f61120f86848460800151612c0c565b5f878152600587016020908152604080832033845290915290209091506112368282614267565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611263908590600401614326565b6020604051808303815f875af115801561127f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112a39190613fb2565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b611311823383612e29565b5050565b5f805160206145fe8339815191525f61132d83611794565b90505f8061133e8360400151611ef6565b91509150806113a05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610367565b5f828152600585016020526040812080546113ba90613edc565b90501180156113ec575060015f83815260078601602052604090205460ff1660058111156113ea576113ea613f14565b145b6114085760405162461bcd60e51b815260040161036790614358565b5f828152600585016020526040812061142091613be0565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145fe83398151915292919061151190613edc565b9050118015611543575060015f83815260078301602052604090205460ff16600581111561154157611541613f14565b145b61155f5760405162461bcd60e51b815260040161036790614358565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613f28565b5f805160206145de8339815191525f6115b084611794565b90505f806115c18360400151611975565b50915091506115d08286611dbe565b5f82815260048501602090815260408083206001600160a01b038916845290915281206115fc91613be0565b5f61160683611cc3565b9050816001600160401b031681606001516001600160401b0316101561163e5760405162461bcd60e51b815260040161036790613fc9565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020546001600160401b03808416600160c01b9092041611156116945760405162461bcd60e51b81526004016103679061400b565b60015f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff1660048111156116d8576116d8613f14565b146116f55760405162461bcd60e51b815260040161036790614054565b5f83815260038601602090815260408083206001600160a01b038a168085529083529281902060018101805460ff60401b191668020000000000000000179055805467ffffffffffffffff60401b1916600160401b426001600160401b03818116929092029290921790925591519182528516929186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b691016112f5565b60408051606080820183525f8083526020830181905292820152905f805160206145fe8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611809573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118309190810190614123565b91509150806118975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610367565b82548251146118fa5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610367565b60208201516001600160a01b03161561196d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610367565b509392505050565b5f805f83516036146119995760405162461bcd60e51b81526004016103679061439f565b5f805b60028110156119e8576119b08160016143e8565b6119bb9060086140df565b61ffff168682815181106119d1576119d16143fb565b016020015160f81c901b919091179060010161199c565b5061ffff811615611a0b5760405162461bcd60e51b81526004016103679061440f565b5f805b6004811015611a6657611a228160036143e8565b611a2d9060086140df565b63ffffffff1687611a3f836002614452565b81518110611a4f57611a4f6143fb565b016020015160f81c901b9190911790600101611a0e565b5063ffffffff8116600314611a8d5760405162461bcd60e51b815260040161036790614465565b5f805b6020811015611ae257611aa481601f6143e8565b611aaf9060086140df565b88611abb836006614452565b81518110611acb57611acb6143fb565b016020015160f81c901b9190911790600101611a90565b505f805b6008811015611b4157611afa8160076143e8565b611b059060086140df565b6001600160401b031689611b1a836026614452565b81518110611b2a57611b2a6143fb565b016020015160f81c901b9190911790600101611ae6565b505f805b6008811015611ba057611b598160076143e8565b611b649060086140df565b6001600160401b03168a611b7983602e614452565b81518110611b8957611b896143fb565b016020015160f81c901b9190911790600101611b45565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206145de833981519152929190611c0c90613edc565b9050118015611c5c575060035f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff166004811115611c5a57611c5a613f14565b145b6103e95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b6064820152608401610367565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061463e83398151915290528390208351918201909352825491925f805160206145fe83398151915292829060ff166005811115611d4357611d43613f14565b6005811115611d5457611d54613f14565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206145de833981519152929190611e1a90613edc565b9050118015611e6a575060015f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff166004811115611e6857611e68613f14565b145b6103e95760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e670000000000000000006064820152608401610367565b611ee46131a5565b611eed826131f0565b61131181613236565b5f808251602714611f195760405162461bcd60e51b81526004016103679061439f565b5f805b6002811015611f6857611f308160016143e8565b611f3b9060086140df565b61ffff16858281518110611f5157611f516143fb565b016020015160f81c901b9190911790600101611f1c565b5061ffff811615611f8b5760405162461bcd60e51b81526004016103679061440f565b5f805b6004811015611fe657611fa28160036143e8565b611fad9060086140df565b63ffffffff1686611fbf836002614452565b81518110611fcf57611fcf6143fb565b016020015160f81c901b9190911790600101611f8e565b5063ffffffff811660021461200d5760405162461bcd60e51b815260040161036790614465565b5f805b60208110156120625761202481601f6143e8565b61202f9060086140df565b8761203b836006614452565b8151811061204b5761204b6143fb565b016020015160f81c901b9190911790600101612010565b505f86602681518110612077576120776143fb565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146120ba5760405162461bcd60e51b81526004016103679061439f565b5f805b6002811015612109576120d18160016143e8565b6120dc9060086140df565b61ffff168582815181106120f2576120f26143fb565b016020015160f81c901b91909117906001016120bd565b5061ffff81161561212c5760405162461bcd60e51b81526004016103679061440f565b5f805b6004811015612187576121438160036143e8565b61214e9060086140df565b63ffffffff1686612160836002614452565b81518110612170576121706143fb565b016020015160f81c901b919091179060010161212f565b5063ffffffff81166004146121ae5760405162461bcd60e51b815260040161036790614465565b5f805b6020811015612203576121c581601f6143e8565b6121d09060086140df565b876121dc836006614452565b815181106121ec576121ec6143fb565b016020015160f81c901b91909117906001016121b1565b505f805b60088110156122625761221b8160076143e8565b6122269060086140df565b6001600160401b03168861223b836026614452565b8151811061224b5761224b6143fb565b016020015160f81c901b9190911790600101612207565b5090969095509350505050565b5f8181525f8051602061463e8339815191526020526040808220815160e0810190925280545f805160206145fe83398151915293929190829060ff1660058111156122bc576122bc613f14565b60058111156122cd576122cd613f14565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561234757612347613f14565b146123645760405162461bcd60e51b8152600401610367906144ac565b60408101516001600160a01b0316336001600160a01b0316146123de5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610367565b6123eb81608001516132ea565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561242f5761242f613f14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124e3846124dd81612aa2565b5f612c0c565b5f85815260068501602052604090209091506124ff8282614267565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061252c908590600401614326565b6020604051808303815f875af1158015612548573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256c9190613fb2565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145de833981519152816125da8461348b565b90505f6125e682610795565b83549091506001600160401b0382161080159061261057508260010154816001600160401b031611155b610eec5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610367565b5f6126776134c1565b5f805160206145fe833981519152426001600160401b0385161180156126b157506001600160401b0384166126af426202a300614452565b115b6127135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610367565b8561276a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610367565b5f868152600882016020526040902054156127d85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610367565b825160301461283f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610367565b612848856132ea565b5f8061288f6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134f8565b5f828152600586016020526040902091935091506128ad8282614267565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128da908590600401614326565b6020604051808303815f875af11580156128f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061291a9190613fb2565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561299357612993613f14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612a3c83612aa2565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610eec60015f8051602061461e83398151915255565b5f8181525f8051602061463e8339815191526020526040812060020180545f805160206145fe83398151915291600160a01b9091046001600160401b03169081906014612aee836144f2565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061463e83398151915260205260409020815181545f805160206145fe8339815191529284929091829060ff19166001836005811115612b6757612b67613f14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612c8557612c458160016143e8565b612c509060086140df565b5081515f90839083908110612c6757612c676143fb565b60200101906001600160f81b03191690815f1a905350600101612c31565b505f5b6004811015612ce857612c9c8160036143e8565b612ca79060086140df565b6001901c60f81b82612cba836002614452565b81518110612cca57612cca6143fb565b60200101906001600160f81b03191690815f1a905350600101612c88565b505f5b6020811015612d4a57612cff81601f6143e8565b612d0a9060086140df565b86901c60f81b82612d1c836006614452565b81518110612d2c57612d2c6143fb565b60200101906001600160f81b03191690815f1a905350600101612ceb565b505f5b6008811015612db557612d618160076143e8565b612d6c9060086140df565b6001600160401b038616901c60f81b82612d87836026614452565b81518110612d9757612d976143fb565b60200101906001600160f81b03191690815f1a905350600101612d4d565b505f5b6008811015612e2057612dcc8160076143e8565b612dd79060086140df565b6001600160401b038516901c60f81b82612df283602e614452565b81518110612e0257612e026143fb565b60200101906001600160f81b03191690815f1a905350600101612db8565b50949350505050565b612e316134c1565b5f612e3e6101668361348b565b90505f805160206145de8339815191525f612e5886611cc3565b9050600281516005811115612e6f57612e6f613f14565b14612e8c5760405162461bcd60e51b8152600401610367906144ac565b5f86815260038301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612f1d5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b6064820152608401610367565b612f26836132ea565b8281608001818151612f389190614517565b6001600160401b0316905250612f4e8682612b1d565b5f612f5887612aa2565b90505f612f6a88838560800151612c0c565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612f9a8282614267565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612fc7908590600401614326565b6020604051808303815f875af1158015612fe3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130079190613fb2565b6040805160c0810182526001600160401b03808a1682525f6020830181905292820183905286166060820152608081019190915290915060a08101600190525f8a815260038701602090815260408083206001600160a01b038d16845282529182902083518154928501519385015160608601516001600160401b039283166001600160801b031990951694909417600160401b9583168602176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b93821693909302929092178155608084015160018201805467ffffffffffffffff19811692909416918217815560a086015192949293909268ffffffffffffffffff199091169091179083600481111561312157613121613f14565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a45050505050506103e960015f8051602061461e83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166131ee57604051631afcd79f60e31b815260040160405180910390fd5b565b6131f86131a5565b613201816138b0565b6132336060820135608083013561321e60c0850160a08601613d2d565b61322e60e0860160c08701614537565b6138d1565b50565b61323e6131a5565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610367565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145fe8339815191529060ff165f03613328575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061337090836143e8565b1061338c576001600160401b03841660408301528082526133ab565b838260400181815161339e9190614517565b6001600160401b03169052505b5f8260200151836040015160646133c29190614552565b6133cc919061457d565b600285015490915060ff90811690821611156134475760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610367565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6107a5827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061392c565b5f8051602061461e8339815191528054600119016134f257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135625760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610367565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135d9576135998160016143e8565b6135a49060086140df565b5081515f908390839081106135bb576135bb6143fb565b60200101906001600160f81b03191690815f1a905350600101613585565b505f5b6004811015613637576135f08160036143e8565b6135fb9060086140df565b505f82613609836002614452565b81518110613619576136196143fb565b60200101906001600160f81b03191690815f1a9053506001016135dc565b505f5b60208110156136945784518160208110613656576136566143fb565b1a60f81b82613666836006614452565b81518110613676576136766143fb565b60200101906001600160f81b03191690815f1a90535060010161363a565b505f5b60208110156136f457846020015181602081106136b6576136b66143fb565b1a60f81b826136c6836026614452565b815181106136d6576136d66143fb565b60200101906001600160f81b03191690815f1a905350600101613697565b505f5b60088110156137685761370b8160076143e8565b6137169060086140df565b60ff1685604001516001600160401b0316901c60f81b8282604661373a9190614452565b8151811061374a5761374a6143fb565b60200101906001600160f81b03191690815f1a9053506001016136f7565b505f5b60308110156137d3578460800151818151811061378a5761378a6143fb565b01602001516001600160f81b031916826137a583604e614452565b815181106137b5576137b56143fb565b60200101906001600160f81b03191690815f1a90535060010161376b565b505f5b6008811015613845576137ea8160076143e8565b6137f59060086140df565b60608601516001600160401b0390811691161c60f81b8261381783607e614452565b81518110613827576138276143fb565b60200101906001600160f81b03191690815f1a9053506001016137d6565b5060028160405161385691906145a2565b602060405180830381855afa158015613871573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138949190613fb2565b94909350915050565b60015f8051602061461e83398151915255565b6138b86131a5565b6138c0613a8e565b6138c8613a9e565b61323381613aa6565b6138d96131a5565b5f5f805160206145de833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613972573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139969190613fb2565b90506139ad6001600160a01b038516333086613b12565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a159190613fb2565b9050818111613a7b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610367565b613a8582826143e8565b95945050505050565b613a966131a5565b6131ee613b6c565b6131ee6131a5565b613aae6131a5565b80355f805160206145fe83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613af860608301604084016145bd565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610681908590613b74565b61389d6131a5565b5f8060205f8451602086015f885af180613b93576040513d5f823e3d81fd5b50505f513d91508115613baa578060011415613bb7565b6001600160a01b0384163b155b1561068157604051635274afe760e01b81526001600160a01b0385166004820152602401610367565b508054613bec90613edc565b5f825580601f10613bfb575050565b601f0160209004905f5260205f209081019061323391905b80821115613c26575f8155600101613c13565b5090565b5f60208284031215613c3a575f80fd5b5035919050565b803563ffffffff81168114613c54575f80fd5b919050565b6001600160a01b0381168114613233575f80fd5b5f8060408385031215613c7e575f80fd5b613c8783613c41565b91506020830135613c9781613c59565b809150509250929050565b5f8060408385031215613cb3575f80fd5b823591506020830135613c9781613c59565b5f80828403610100811215613cd8575f80fd5b60e0811215613ce5575f80fd5b5082915060e0830135613c9781613c59565b5f60208284031215613d07575f80fd5b613d1082613c41565b9392505050565b80356001600160401b0381168114613c54575f80fd5b5f60208284031215613d3d575f80fd5b613d1082613d17565b8015158114613233575f80fd5b5f805f60608486031215613d65575f80fd5b833592506020840135613d7781613d46565b9150613d8560408501613c41565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613dc457613dc4613d8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613df257613df2613d8e565b604052919050565b5f6001600160401b03821115613e1257613e12613d8e565b50601f01601f191660200190565b5f805f8060808587031215613e33575f80fd5b8435935060208501359250613e4a60408601613d17565b915060608501356001600160401b03811115613e64575f80fd5b8501601f81018713613e74575f80fd5b8035613e87613e8282613dfa565b613dca565b818152886020838501011115613e9b575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ecd575f80fd5b50508035926020909101359150565b600181811c90821680613ef057607f821691505b602082108103613f0e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613f3a81613edc565b806020870152604060018084165f8114613f5b5760018114613f7757613fa4565b60ff19851660408a0152604084151560051b8a01019550613fa4565b895f5260205f205f5b85811015613f9b5781548b8201860152908301908801613f80565b8a016040019650505b509398975050505050505050565b5f60208284031215613fc2575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826140da576140da6140a4565b500490565b80820281158282048414176107a5576107a56140b8565b5f5b838110156141105781810151838201526020016140f8565b50505f910152565b8051613c5481613d46565b5f8060408385031215614134575f80fd5b82516001600160401b038082111561414a575f80fd5b908401906060828703121561415d575f80fd5b614165613da2565b8251815260208084015161417881613c59565b8282015260408401518381111561418d575f80fd5b80850194505087601f8501126141a1575f80fd5b835192506141b1613e8284613dfa565b83815288828587010111156141c4575f80fd5b6141d3848383018488016140f6565b806040840152508195506141e8818801614118565b9450505050509250929050565b6001600160401b03828116828216039080821115614215576142156140b8565b5092915050565b601f8211156103e957805f5260205f20601f840160051c810160208510156142415750805b601f840160051c820191505b81811015614260575f815560010161424d565b5050505050565b81516001600160401b0381111561428057614280613d8e565b6142948161428e8454613edc565b8461421c565b602080601f8311600181146142c7575f84156142b05750858301515b5f19600386901b1c1916600185901b17855561431e565b5f85815260208120601f198616915b828110156142f5578886015182559484019460019091019084016142d6565b508582101561431257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526143448160408501602087016140f6565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156107a5576107a56140b8565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156107a5576107a56140b8565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361450d5761450d6140b8565b6001019392505050565b6001600160401b03818116838216019080821115614215576142156140b8565b5f60208284031215614547575f80fd5b8135613d1081613c59565b6001600160401b03818116838216028082169190828114614575576145756140b8565b505092915050565b5f6001600160401b0380841680614596576145966140a4565b92169190910492915050565b5f82516145b38184602087016140f6565b9190910192915050565b5f602082840312156145cd575f80fd5b813560ff81168114613d10575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index ba7991b03..11e72af7a 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161425138038061425183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6141048061014d5f395ff3fe6080604052600436106100f9575f3560e01c80636a7e3d8311610092578063b771b3bc11610062578063b771b3bc1461029e578063bee0a03f146102d0578063c599e24f146102ef578063d61bed7414610302578063f40797d714610321575f80fd5b80636a7e3d831461022257806376f7862114610241578063927e7e7514610260578063a3a65e481461027f575f80fd5b80632e2194d8116100cd5780632e2194d81461017b578063467ef06f146101b757806362065856146101d657806366435abf14610203575f80fd5b8062e41792146100fd5780630322ed981461011e5780630915204e1461013d5780630b77f6931461015c575b5f80fd5b348015610108575f80fd5b5061011c6101173660046137ad565b610334565b005b348015610129575f80fd5b5061011c6101383660046137c3565b610440565b348015610148575f80fd5b5061011c610157366004613806565b6105a1565b348015610167575f80fd5b5061011c61017636600461383b565b6106b7565b348015610186575f80fd5b5061019a6101953660046137c3565b61077f565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101c2575f80fd5b5061011c6101d136600461385e565b610795565b3480156101e1575f80fd5b506101f56101f0366004613894565b610af1565b6040519081526020016101ae565b34801561020e575f80fd5b5061019a61021d3660046137c3565b610b0a565b34801561022d575f80fd5b5061011c61023c36600461383b565b610b1e565b34801561024c575f80fd5b5061011c61025b3660046138ba565b610ba0565b34801561026b575f80fd5b5061011c61027a3660046137c3565b610eb9565b34801561028a575f80fd5b5061011c61029936600461385e565b611279565b3480156102a9575f80fd5b506102b86005600160991b0181565b6040516001600160a01b0390911681526020016101ae565b3480156102db575f80fd5b5061011c6102ea3660046137c3565b611432565b61011c6102fd3660046137c3565b611501565b34801561030d575f80fd5b5061011c61031c366004613806565b61150f565b6101f561032f366004613987565b611654565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f286611676565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061409883398151915292919061048890613a19565b90501180156104ba575060035f83815260078301602052604090205460ff1660058111156104b8576104b8613a4b565b145b6105235760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613a5f565b6020604051808303815f875af1158015610578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059c9190613ae9565b505050565b5f805160206140788339815191525f6105b984611687565b90505f806105ca8360400151611868565b50915091506105d98286611aa3565b5f82815260068501602090815260408083206001600160a01b0389168452909152812061060591613763565b5f61060f83611bb4565b9050816001600160401b031681606001516001600160401b031610156106475760405162461bcd60e51b815260040161051a90613b00565b5f83815260048601602090815260408083206001600160a01b038a168085529252808320805460ff60c01b1916600160c21b179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6106c18282611caf565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614078833981519152916005600160991b019163ee5b48eb9161073991600401613a5f565b6020604051808303815f875af1158015610755573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107799190613ae9565b50505050565b5f61078f64e8d4a5100083613b6a565b92915050565b5f805160206140988339815191525f6107ad83611687565b90505f806107be8360400151611dcb565b9150915080156108235760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161051a565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561085457610854613a4b565b600581111561086557610865613a4b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156108de576108de613a4b565b14806108fc57506001825160058111156108fa576108fa613a4b565b145b61095b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161051a565b60038251600581111561097057610970613a4b565b0361099757505f83815260068601602052604081206004916109929190613763565b61099b565b5060055b6020808301515f908152600888019091526040812055818160058111156109c4576109c4613a4b565b908160058111156109d7576109d7613a4b565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610a0b57610a0b613a4b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610abe57610abe613a4b565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61078f6001600160401b03831664e8d4a51000613b7d565b5f610b1482611bb4565b6080015192915050565b610b288282611aa3565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614078833981519152916005600160991b019163ee5b48eb9161073991600401613a5f565b8115610eb0575f5f805160206140788339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c01573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c289190810190613bc1565b9150915080610c8b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161051a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf29190613ae9565b825114610d565760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161051a565b60208201516001600160a01b031615610dcc5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161051a565b5f80610ddb8460400151611f6c565b91509150818814610e485760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161051a565b5f888152600786016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61059c83612144565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083203384528252808320815160808101835281546001600160401b038082168352600160401b8204811695830195909552600160801b8104909416928101929092525f8051602061407883398151915293926060830190600160c01b900460ff166004811115610f5857610f58613a4b565b6004811115610f6957610f69613a4b565b9052509050600281606001516004811115610f8657610f86613a4b565b14610fe25760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161051a565b60036060820181905250426001600160401b03166040828101919091525f848152600484016020529081208291336001600160a01b0316815260208082019290925260409081015f208351815493850151928501516001600160401b03908116600160801b0267ffffffffffffffff60801b19948216600160401b026001600160801b031990961691909216179390931791821683178155606084015190929091839160ff60c01b191668ffffffffffffffffff60801b1990911617600160c01b8360048111156110b5576110b5613a4b565b02179055509050505f6110c784611bb4565b9050815f01516001600160401b031681608001516001600160401b03161161113d5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161051a565b8151608082018051611150908390613c93565b6001600160401b03169052506111668482612496565b5f61117085612585565b90505f61118286838560800151612600565b5f878152600687016020908152604080832033845290915290209091506111a98282613d05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906111d6908590600401613dc0565b6020604051808303815f875af11580156111f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112169190613ae9565b6080850151604080516001600160401b039283168152918616602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b5f805160206140988339815191525f61129183611687565b90505f806112a28360400151611dcb565b91509150806113045760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161051a565b5f8281526005850160205260408120805461131e90613a19565b9050118015611350575060015f83815260078601602052604090205460ff16600581111561134e5761134e613a4b565b145b61136c5760405162461bcd60e51b815260040161051a90613df2565b5f828152600585016020526040812061138491613763565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061409883398151915292919061147a90613a19565b90501180156114ac575060015f83815260078301602052604090205460ff1660058111156114aa576114aa613a4b565b145b6114c85760405162461bcd60e51b815260040161051a90613df2565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613a5f565b61150c81333461281d565b50565b5f805160206140788339815191525f61152784611687565b90505f806115388360400151611868565b50915091506115478286611caf565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061157391613763565b5f61157d83611bb4565b9050816001600160401b031681606001516001600160401b031610156115b55760405162461bcd60e51b815260040161051a90613b00565b5f83815260048601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160401b0278ff0000000000000000ffffffffffffffff00000000000000001990971696909617600160c11b179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101611268565b5f8061165f34612b5f565b905061166d85828686612c09565b95945050505050565b61167e61303d565b61150c81613088565b60408051606080820183525f8083526020830181905292820152905f805160206140988339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156116fc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117239190810190613bc1565b915091508061178a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161051a565b82548251146117ed5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161051a565b60208201516001600160a01b0316156118605760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161051a565b509392505050565b5f805f835160361461188c5760405162461bcd60e51b815260040161051a90613e39565b5f805b60028110156118db576118a3816001613e82565b6118ae906008613b7d565b61ffff168682815181106118c4576118c4613e95565b016020015160f81c901b919091179060010161188f565b5061ffff8116156118fe5760405162461bcd60e51b815260040161051a90613ea9565b5f805b600481101561195957611915816003613e82565b611920906008613b7d565b63ffffffff1687611932836002613eec565b8151811061194257611942613e95565b016020015160f81c901b9190911790600101611901565b5063ffffffff81166003146119805760405162461bcd60e51b815260040161051a90613eff565b5f805b60208110156119d55761199781601f613e82565b6119a2906008613b7d565b886119ae836006613eec565b815181106119be576119be613e95565b016020015160f81c901b9190911790600101611983565b505f805b6008811015611a34576119ed816007613e82565b6119f8906008613b7d565b6001600160401b031689611a0d836026613eec565b81518110611a1d57611a1d613e95565b016020015160f81c901b91909117906001016119d9565b505f805b6008811015611a9357611a4c816007613e82565b611a57906008613b7d565b6001600160401b03168a611a6c83602e613eec565b81518110611a7c57611a7c613e95565b016020015160f81c901b9190911790600101611a38565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602090815260408083206001600160a01b0385168452909152812080545f80516020614078833981519152929190611aff90613a19565b9050118015611b4d575060035f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611b4b57611b4b613a4b565b145b61059c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161051a565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206140d883398151915290528390208351918201909352825491925f8051602061409883398151915292829060ff166005811115611c3457611c34613a4b565b6005811115611c4557611c45613a4b565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f80516020614078833981519152929190611d0b90613a19565b9050118015611d59575060015f8481526004838101602090815260408084206001600160a01b038816855290915290912054600160c01b900460ff1690811115611d5757611d57613a4b565b145b61059c5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161051a565b5f808251602714611dee5760405162461bcd60e51b815260040161051a90613e39565b5f805b6002811015611e3d57611e05816001613e82565b611e10906008613b7d565b61ffff16858281518110611e2657611e26613e95565b016020015160f81c901b9190911790600101611df1565b5061ffff811615611e605760405162461bcd60e51b815260040161051a90613ea9565b5f805b6004811015611ebb57611e77816003613e82565b611e82906008613b7d565b63ffffffff1686611e94836002613eec565b81518110611ea457611ea4613e95565b016020015160f81c901b9190911790600101611e63565b5063ffffffff8116600214611ee25760405162461bcd60e51b815260040161051a90613eff565b5f805b6020811015611f3757611ef981601f613e82565b611f04906008613b7d565b87611f10836006613eec565b81518110611f2057611f20613e95565b016020015160f81c901b9190911790600101611ee5565b505f86602681518110611f4c57611f4c613e95565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14611f8f5760405162461bcd60e51b815260040161051a90613e39565b5f805b6002811015611fde57611fa6816001613e82565b611fb1906008613b7d565b61ffff16858281518110611fc757611fc7613e95565b016020015160f81c901b9190911790600101611f92565b5061ffff8116156120015760405162461bcd60e51b815260040161051a90613ea9565b5f805b600481101561205c57612018816003613e82565b612023906008613b7d565b63ffffffff1686612035836002613eec565b8151811061204557612045613e95565b016020015160f81c901b9190911790600101612004565b5063ffffffff81166004146120835760405162461bcd60e51b815260040161051a90613eff565b5f805b60208110156120d85761209a81601f613e82565b6120a5906008613b7d565b876120b1836006613eec565b815181106120c1576120c1613e95565b016020015160f81c901b9190911790600101612086565b505f805b6008811015612137576120f0816007613e82565b6120fb906008613b7d565b6001600160401b031688612110836026613eec565b8151811061212057612120613e95565b016020015160f81c901b91909117906001016120dc565b5090969095509350505050565b5f8181525f805160206140d88339815191526020526040808220815160e0810190925280545f8051602061409883398151915293929190829060ff16600581111561219157612191613a4b565b60058111156121a2576121a2613a4b565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561221c5761221c613a4b565b146122395760405162461bcd60e51b815260040161051a90613f46565b60408101516001600160a01b0316336001600160a01b0316146122b35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161051a565b6122c081608001516130cb565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561230457612304613a4b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6123b8846123b281612585565b5f612600565b5f85815260068501602052604090209091506123d48282613d05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612401908590600401613dc0565b6020604051808303815f875af115801561241d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124419190613ae9565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8281525f805160206140d883398151915260205260409020815181545f805160206140988339815191529284929091829060ff191660018360058111156124e0576124e0613a4b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b5f8181525f805160206140d88339815191526020526040812060020180545f8051602061409883398151915291600160a01b9091046001600160401b031690819060146125d183613f8c565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561267957612639816001613e82565b612644906008613b7d565b5081515f9083908390811061265b5761265b613e95565b60200101906001600160f81b03191690815f1a905350600101612625565b505f5b60048110156126dc57612690816003613e82565b61269b906008613b7d565b6001901c60f81b826126ae836002613eec565b815181106126be576126be613e95565b60200101906001600160f81b03191690815f1a90535060010161267c565b505f5b602081101561273e576126f381601f613e82565b6126fe906008613b7d565b86901c60f81b82612710836006613eec565b8151811061272057612720613e95565b60200101906001600160f81b03191690815f1a9053506001016126df565b505f5b60088110156127a957612755816007613e82565b612760906008613b7d565b6001600160401b038616901c60f81b8261277b836026613eec565b8151811061278b5761278b613e95565b60200101906001600160f81b03191690815f1a905350600101612741565b505f5b6008811015612814576127c0816007613e82565b6127cb906008613b7d565b6001600160401b038516901c60f81b826127e683602e613eec565b815181106127f6576127f6613e95565b60200101906001600160f81b03191690815f1a9053506001016127ac565b50949350505050565b61282561326c565b5f61282f8261077f565b90505f805160206140788339815191525f61284986611bb4565b905060028151600581111561286057612860613a4b565b1461287d5760405162461bcd60e51b815260040161051a90613f46565b5f86815260048301602090815260408083206001600160a01b03891684529091529020546001600160401b03161561290e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161051a565b612917836130cb565b82816080018181516129299190613fb1565b6001600160401b031690525061293f8682612496565b5f61294987612585565b90505f61295b88838560800151612600565b5f89815260058601602090815260408083206001600160a01b038c168452909152902090915061298b8282613d05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129b8908590600401613dc0565b6020604051808303815f875af11580156129d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f89190613ae9565b604080516080810182526001600160401b03891681525f602082018190529181019190915290915060608101600190525f8a81526004808801602090815260408084206001600160a01b038e1685528252928390208451815492860151948601516001600160401b03908116600160801b0267ffffffffffffffff60801b19968216600160401b026001600160801b031990951691909216179290921793841682178155606085015190939092849260ff60c01b191668ffffffffffffffffff60801b199092169190911790600160c01b908490811115612adb57612adb613a4b565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a450505050505061059c60015f805160206140b883398151915255565b5f5f805160206140788339815191528282612b798261077f565b83549091506001600160401b03821610801590612ba357508260010154816001600160401b031611155b612c015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161051a565b949350505050565b5f612c1261326c565b5f80516020614098833981519152426001600160401b038516118015612c4c57506001600160401b038416612c4a426202a300613eec565b115b612cae5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161051a565b85612d055760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161051a565b5f86815260088201602052604090205415612d735760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161051a565b8251603014612dda5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161051a565b612de3856130cb565b5f80612e2a6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506132b6565b5f82815260058601602052604090209193509150612e488282613d05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e75908590600401613dc0565b6020604051808303815f875af1158015612e91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612eb59190613ae9565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612f2e57612f2e613a4b565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612fd783612585565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c0160015f805160206140b883398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661308657604051631afcd79f60e31b815260040160405180910390fd5b565b61309061303d565b6130998161365b565b61150c606082013560808301356130b660c0850160a08601613894565b6130c660e0860160c08701613fd1565b61367c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206140988339815191529060ff165f03613109575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906131519083613e82565b1061316d576001600160401b038416604083015280825261318c565b838260400181815161317f9190613fb1565b6001600160401b03169052505b5f8260200151836040015160646131a39190613fec565b6131ad9190614017565b600285015490915060ff90811690821611156132285760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161051a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206140b883398151915280546001190161329d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206140b883398151915255565b5f60608260800151516030146133205760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161051a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561339757613357816001613e82565b613362906008613b7d565b5081515f9083908390811061337957613379613e95565b60200101906001600160f81b03191690815f1a905350600101613343565b505f5b60048110156133f5576133ae816003613e82565b6133b9906008613b7d565b505f826133c7836002613eec565b815181106133d7576133d7613e95565b60200101906001600160f81b03191690815f1a90535060010161339a565b505f5b6020811015613452578451816020811061341457613414613e95565b1a60f81b82613424836006613eec565b8151811061343457613434613e95565b60200101906001600160f81b03191690815f1a9053506001016133f8565b505f5b60208110156134b2578460200151816020811061347457613474613e95565b1a60f81b82613484836026613eec565b8151811061349457613494613e95565b60200101906001600160f81b03191690815f1a905350600101613455565b505f5b6008811015613526576134c9816007613e82565b6134d4906008613b7d565b60ff1685604001516001600160401b0316901c60f81b828260466134f89190613eec565b8151811061350857613508613e95565b60200101906001600160f81b03191690815f1a9053506001016134b5565b505f5b6030811015613591578460800151818151811061354857613548613e95565b01602001516001600160f81b0319168261356383604e613eec565b8151811061357357613573613e95565b60200101906001600160f81b03191690815f1a905350600101613529565b505f5b6008811015613603576135a8816007613e82565b6135b3906008613b7d565b60608601516001600160401b0390811691161c60f81b826135d583607e613eec565b815181106135e5576135e5613e95565b60200101906001600160f81b03191690815f1a905350600101613594565b50600281604051613614919061403c565b602060405180830381855afa15801561362f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906136529190613ae9565b94909350915050565b61366361303d565b61366b6136d7565b6136736136e7565b61150c816136ef565b61368461303d565b5f5f80516020614078833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6136df61303d565b61308661375b565b61308661303d565b6136f761303d565b80355f8051602061409883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556137416060830160408401614057565b600291909101805460ff191660ff90921691909117905550565b6132a361303d565b50805461376f90613a19565b5f825580601f1061377e575050565b601f0160209004905f5260205f209081019061150c91905b808211156137a9575f8155600101613796565b5090565b5f60e082840312156137bd575f80fd5b50919050565b5f602082840312156137d3575f80fd5b5035919050565b803563ffffffff811681146137ed575f80fd5b919050565b6001600160a01b038116811461150c575f80fd5b5f8060408385031215613817575f80fd5b613820836137da565b91506020830135613830816137f2565b809150509250929050565b5f806040838503121561384c575f80fd5b823591506020830135613830816137f2565b5f6020828403121561386e575f80fd5b613877826137da565b9392505050565b80356001600160401b03811681146137ed575f80fd5b5f602082840312156138a4575f80fd5b6138778261387e565b801515811461150c575f80fd5b5f805f606084860312156138cc575f80fd5b8335925060208401356138de816138ad565b91506138ec604085016137da565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561392b5761392b6138f5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613959576139596138f5565b604052919050565b5f6001600160401b03821115613979576139796138f5565b50601f01601f191660200190565b5f805f60608486031215613999575f80fd5b833592506139a96020850161387e565b915060408401356001600160401b038111156139c3575f80fd5b8401601f810186136139d3575f80fd5b80356139e66139e182613961565b613931565b8181528760208385010111156139fa575f80fd5b816020840160208301375f602083830101528093505050509250925092565b600181811c90821680613a2d57607f821691505b6020821081036137bd57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613a7181613a19565b806020870152604060018084165f8114613a925760018114613aae57613adb565b60ff19851660408a0152604084151560051b8a01019550613adb565b895f5260205f205f5b85811015613ad25781548b8201860152908301908801613ab7565b8a016040019650505b509398975050505050505050565b5f60208284031215613af9575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613b7857613b78613b42565b500490565b808202811582820484141761078f5761078f613b56565b5f5b83811015613bae578181015183820152602001613b96565b50505f910152565b80516137ed816138ad565b5f8060408385031215613bd2575f80fd5b82516001600160401b0380821115613be8575f80fd5b9084019060608287031215613bfb575f80fd5b613c03613909565b82518152602080840151613c16816137f2565b82820152604084015183811115613c2b575f80fd5b80850194505087601f850112613c3f575f80fd5b83519250613c4f6139e184613961565b8381528882858701011115613c62575f80fd5b613c7184838301848801613b94565b80604084015250819550613c86818801613bb6565b9450505050509250929050565b6001600160401b03828116828216039080821115613cb357613cb3613b56565b5092915050565b601f82111561059c57805f5260205f20601f840160051c81016020851015613cdf5750805b601f840160051c820191505b81811015613cfe575f8155600101613ceb565b5050505050565b81516001600160401b03811115613d1e57613d1e6138f5565b613d3281613d2c8454613a19565b84613cba565b602080601f831160018114613d65575f8415613d4e5750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b82811015613d9357888601518255948401946001909101908401613d74565b5085821015613db057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f8251806020840152613dde816040850160208701613b94565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561078f5761078f613b56565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561078f5761078f613b56565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b03808316818103613fa757613fa7613b56565b6001019392505050565b6001600160401b03818116838216019080821115613cb357613cb3613b56565b5f60208284031215613fe1575f80fd5b8135613877816137f2565b6001600160401b0381811683821602808216919082811461400f5761400f613b56565b505092915050565b5f6001600160401b038084168061403057614030613b42565b92169190910492915050565b5f825161404d818460208701613b94565b9190910192915050565b5f60208284031215614067575f80fd5b813560ff81168114613877575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516144e43803806144e483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143978061014d5f395ff3fe6080604052600436106100f9575f3560e01c80636a7e3d8311610092578063b771b3bc11610062578063b771b3bc1461029e578063bee0a03f146102d0578063c599e24f146102ef578063d61bed7414610302578063f40797d714610321575f80fd5b80636a7e3d831461022257806376f7862114610241578063927e7e7514610260578063a3a65e481461027f575f80fd5b80632e2194d8116100cd5780632e2194d81461017b578063467ef06f146101b757806362065856146101d657806366435abf14610203575f80fd5b8062e41792146100fd5780630322ed981461011e5780630915204e1461013d5780630b77f6931461015c575b5f80fd5b348015610108575f80fd5b5061011c6101173660046139a7565b610334565b005b348015610129575f80fd5b5061011c6101383660046139bd565b610440565b348015610148575f80fd5b5061011c610157366004613a00565b6105a1565b348015610167575f80fd5b5061011c610176366004613a35565b610772565b348015610186575f80fd5b5061019a6101953660046139bd565b61083a565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101c2575f80fd5b5061011c6101d1366004613a58565b610850565b3480156101e1575f80fd5b506101f56101f0366004613a8e565b610bac565b6040519081526020016101ae565b34801561020e575f80fd5b5061019a61021d3660046139bd565b610bc5565b34801561022d575f80fd5b5061011c61023c366004613a35565b610bd9565b34801561024c575f80fd5b5061011c61025b366004613ab4565b610c5b565b34801561026b575f80fd5b5061011c61027a3660046139bd565b610f74565b34801561028a575f80fd5b5061011c610299366004613a58565b611386565b3480156102a9575f80fd5b506102b86005600160991b0181565b6040516001600160a01b0390911681526020016101ae565b3480156102db575f80fd5b5061011c6102ea3660046139bd565b61153a565b61011c6102fd3660046139bd565b611609565b34801561030d575f80fd5b5061011c61031c366004613a00565b611617565b6101f561032f366004613b81565b611813565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f286611835565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061432b83398151915292919061048890613c13565b90501180156104ba575060035f83815260078301602052604090205460ff1660058111156104b8576104b8613c45565b145b6105235760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613c59565b6020604051808303815f875af1158015610578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059c9190613ce3565b505050565b5f8051602061430b8339815191525f6105b984611846565b90505f806105ca8360400151611a27565b50915091506105d98286611c62565b5f82815260058501602090815260408083206001600160a01b038916845290915281206106059161395d565b5f61060f83611d75565b9050816001600160401b031681606001516001600160401b031610156106475760405162461bcd60e51b815260040161051a90613cfa565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156106995760405162461bcd60e51b815260040161051a90613d3c565b60035f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff1660048111156106dd576106dd613c45565b146106fa5760405162461bcd60e51b815260040161051a90613d85565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320600101805460ff60401b191668040000000000000000179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b61077c8282611e70565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061430b833981519152916005600160991b019163ee5b48eb916107f491600401613c59565b6020604051808303815f875af1158015610810573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108349190613ce3565b50505050565b5f61084a64e8d4a5100083613dfd565b92915050565b5f8051602061432b8339815191525f61086883611846565b90505f806108798360400151611f8e565b9150915080156108de5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161051a565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561090f5761090f613c45565b600581111561092057610920613c45565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561099957610999613c45565b14806109b757506001825160058111156109b5576109b5613c45565b145b610a165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161051a565b600382516005811115610a2b57610a2b613c45565b03610a5257505f8381526006860160205260408120600491610a4d919061395d565b610a56565b5060055b6020808301515f90815260088801909152604081205581816005811115610a7f57610a7f613c45565b90816005811115610a9257610a92613c45565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ac657610ac6613c45565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610b7957610b79613c45565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61084a6001600160401b03831664e8d4a51000613e10565b5f610bcf82611d75565b6080015192915050565b610be38282611c62565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061430b833981519152916005600160991b019163ee5b48eb916107f491600401613c59565b8115610f6b575f5f8051602061430b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610cbc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ce39190810190613e54565b9150915080610d465760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161051a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dad9190613ce3565b825114610e115760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161051a565b60208201516001600160a01b031615610e875760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161051a565b5f80610e96846040015161212f565b91509150818814610f035760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161051a565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61059c83612307565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602090815260408083203384528252808320815160c08101835281546001600160401b038082168352600160401b808304821696840196909652600160801b8204811694830194909452600160c01b900483166060820152600182015492831660808201525f8051602061430b8339815191529493909260a0840191900460ff16600481111561102b5761102b613c45565b600481111561103c5761103c613c45565b905250905060028160a00151600481111561105957611059613c45565b146110b55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161051a565b5f6110bf84612659565b9050600360a08301819052506001600160401b0342811660408085019190915290821660808401525f8581526003850160205290812083916110fe3390565b6001600160a01b0316815260208082019290925260409081015f2083518154938501519285015160608601516001600160401b039283166001600160801b031990961695909517600160401b9483168502176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b94821694909402939093178155608084015160018201805467ffffffffffffffff19811692909516918217815560a086015192949293909268ffffffffffffffffff1916909117908360048111156111ce576111ce613c45565b02179055509050505f6111e085611d75565b9050825f01516001600160401b031681608001516001600160401b0316116112565760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161051a565b8251608082018051611269908390613f26565b6001600160401b031690525061127f85826126d4565b5f61128f868484608001516127c3565b5f878152600587016020908152604080832033845290915290209091506112b68282613f98565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112e3908590600401614053565b6020604051808303815f875af11580156112ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113239190613ce3565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b5f8051602061432b8339815191525f61139e83611846565b90505f806113af8360400151611f8e565b91509150806114115760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161051a565b5f8281526005850160205260408120805461142b90613c13565b905011801561145d575060015f83815260078601602052604090205460ff16600581111561145b5761145b613c45565b145b6114795760405162461bcd60e51b815260040161051a90614085565b5f82815260058501602052604081206114919161395d565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061432b83398151915292919061158290613c13565b90501180156115b4575060015f83815260078301602052604090205460ff1660058111156115b2576115b2613c45565b145b6115d05760405162461bcd60e51b815260040161051a90614085565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613c59565b6116148133346129e0565b50565b5f8051602061430b8339815191525f61162f84611846565b90505f806116408360400151611a27565b509150915061164f8286611e70565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061167b9161395d565b5f61168583611d75565b9050816001600160401b031681606001516001600160401b031610156116bd5760405162461bcd60e51b815260040161051a90613cfa565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020546001600160401b03808416600160c01b9092041611156117135760405162461bcd60e51b815260040161051a90613d3c565b60015f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff16600481111561175757611757613c45565b146117745760405162461bcd60e51b815260040161051a90613d85565b5f83815260038601602090815260408083206001600160a01b038a168085529083529281902060018101805460ff60401b191668020000000000000000179055805467ffffffffffffffff60401b1916600160401b426001600160401b03818116929092029290921790925591519182528516929186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101611375565b5f8061181e34612d59565b905061182c85828686612e03565b95945050505050565b61183d613237565b61161481613282565b60408051606080820183525f8083526020830181905292820152905f8051602061432b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118bb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118e29190810190613e54565b91509150806119495760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161051a565b82548251146119ac5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161051a565b60208201516001600160a01b031615611a1f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161051a565b509392505050565b5f805f8351603614611a4b5760405162461bcd60e51b815260040161051a906140cc565b5f805b6002811015611a9a57611a62816001614115565b611a6d906008613e10565b61ffff16868281518110611a8357611a83614128565b016020015160f81c901b9190911790600101611a4e565b5061ffff811615611abd5760405162461bcd60e51b815260040161051a9061413c565b5f805b6004811015611b1857611ad4816003614115565b611adf906008613e10565b63ffffffff1687611af183600261417f565b81518110611b0157611b01614128565b016020015160f81c901b9190911790600101611ac0565b5063ffffffff8116600314611b3f5760405162461bcd60e51b815260040161051a90614192565b5f805b6020811015611b9457611b5681601f614115565b611b61906008613e10565b88611b6d83600661417f565b81518110611b7d57611b7d614128565b016020015160f81c901b9190911790600101611b42565b505f805b6008811015611bf357611bac816007614115565b611bb7906008613e10565b6001600160401b031689611bcc83602661417f565b81518110611bdc57611bdc614128565b016020015160f81c901b9190911790600101611b98565b505f805b6008811015611c5257611c0b816007614115565b611c16906008613e10565b6001600160401b03168a611c2b83602e61417f565b81518110611c3b57611c3b614128565b016020015160f81c901b9190911790600101611bf7565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f8051602061430b833981519152929190611cbe90613c13565b9050118015611d0e575060035f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff166004811115611d0c57611d0c613c45565b145b61059c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161051a565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061436b83398151915290528390208351918201909352825491925f8051602061432b83398151915292829060ff166005811115611df557611df5613c45565b6005811115611e0657611e06613c45565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f8051602061430b833981519152929190611ecc90613c13565b9050118015611f1c575060015f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff166004811115611f1a57611f1a613c45565b145b61059c5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161051a565b5f808251602714611fb15760405162461bcd60e51b815260040161051a906140cc565b5f805b600281101561200057611fc8816001614115565b611fd3906008613e10565b61ffff16858281518110611fe957611fe9614128565b016020015160f81c901b9190911790600101611fb4565b5061ffff8116156120235760405162461bcd60e51b815260040161051a9061413c565b5f805b600481101561207e5761203a816003614115565b612045906008613e10565b63ffffffff168661205783600261417f565b8151811061206757612067614128565b016020015160f81c901b9190911790600101612026565b5063ffffffff81166002146120a55760405162461bcd60e51b815260040161051a90614192565b5f805b60208110156120fa576120bc81601f614115565b6120c7906008613e10565b876120d383600661417f565b815181106120e3576120e3614128565b016020015160f81c901b91909117906001016120a8565b505f8660268151811061210f5761210f614128565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146121525760405162461bcd60e51b815260040161051a906140cc565b5f805b60028110156121a157612169816001614115565b612174906008613e10565b61ffff1685828151811061218a5761218a614128565b016020015160f81c901b9190911790600101612155565b5061ffff8116156121c45760405162461bcd60e51b815260040161051a9061413c565b5f805b600481101561221f576121db816003614115565b6121e6906008613e10565b63ffffffff16866121f883600261417f565b8151811061220857612208614128565b016020015160f81c901b91909117906001016121c7565b5063ffffffff81166004146122465760405162461bcd60e51b815260040161051a90614192565b5f805b602081101561229b5761225d81601f614115565b612268906008613e10565b8761227483600661417f565b8151811061228457612284614128565b016020015160f81c901b9190911790600101612249565b505f805b60088110156122fa576122b3816007614115565b6122be906008613e10565b6001600160401b0316886122d383602661417f565b815181106122e3576122e3614128565b016020015160f81c901b919091179060010161229f565b5090969095509350505050565b5f8181525f8051602061436b8339815191526020526040808220815160e0810190925280545f8051602061432b83398151915293929190829060ff16600581111561235457612354613c45565b600581111561236557612365613c45565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123df576123df613c45565b146123fc5760405162461bcd60e51b815260040161051a906141d9565b60408101516001600160a01b0316336001600160a01b0316146124765760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161051a565b61248381608001516132c5565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124c7576124c7613c45565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61257b8461257581612659565b5f6127c3565b5f85815260068501602052604090209091506125978282613f98565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125c4908590600401614053565b6020604051808303815f875af11580156125e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126049190613ce3565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f8051602061436b8339815191526020526040812060020180545f8051602061432b83398151915291600160a01b9091046001600160401b031690819060146126a58361421f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061436b83398151915260205260409020815181545f8051602061432b8339815191529284929091829060ff1916600183600581111561271e5761271e613c45565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561283c576127fc816001614115565b612807906008613e10565b5081515f9083908390811061281e5761281e614128565b60200101906001600160f81b03191690815f1a9053506001016127e8565b505f5b600481101561289f57612853816003614115565b61285e906008613e10565b6001901c60f81b8261287183600261417f565b8151811061288157612881614128565b60200101906001600160f81b03191690815f1a90535060010161283f565b505f5b6020811015612901576128b681601f614115565b6128c1906008613e10565b86901c60f81b826128d383600661417f565b815181106128e3576128e3614128565b60200101906001600160f81b03191690815f1a9053506001016128a2565b505f5b600881101561296c57612918816007614115565b612923906008613e10565b6001600160401b038616901c60f81b8261293e83602661417f565b8151811061294e5761294e614128565b60200101906001600160f81b03191690815f1a905350600101612904565b505f5b60088110156129d757612983816007614115565b61298e906008613e10565b6001600160401b038516901c60f81b826129a983602e61417f565b815181106129b9576129b9614128565b60200101906001600160f81b03191690815f1a90535060010161296f565b50949350505050565b6129e8613466565b5f6129f28261083a565b90505f8051602061430b8339815191525f612a0c86611d75565b9050600281516005811115612a2357612a23613c45565b14612a405760405162461bcd60e51b815260040161051a906141d9565b5f86815260038301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612ad15760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161051a565b612ada836132c5565b8281608001818151612aec9190614244565b6001600160401b0316905250612b0286826126d4565b5f612b0c87612659565b90505f612b1e888385608001516127c3565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612b4e8282613f98565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b7b908590600401614053565b6020604051808303815f875af1158015612b97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bbb9190613ce3565b6040805160c0810182526001600160401b03808a1682525f6020830181905292820183905286166060820152608081019190915290915060a08101600190525f8a815260038701602090815260408083206001600160a01b038d16845282529182902083518154928501519385015160608601516001600160401b039283166001600160801b031990951694909417600160401b9583168602176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b93821693909302929092178155608084015160018201805467ffffffffffffffff19811692909416918217815560a086015192949293909268ffffffffffffffffff1990911690911790836004811115612cd557612cd5613c45565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a450505050505061059c60015f8051602061434b83398151915255565b5f5f8051602061430b8339815191528282612d738261083a565b83549091506001600160401b03821610801590612d9d57508260010154816001600160401b031611155b612dfb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161051a565b949350505050565b5f612e0c613466565b5f8051602061432b833981519152426001600160401b038516118015612e4657506001600160401b038416612e44426202a30061417f565b115b612ea85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161051a565b85612eff5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161051a565b5f86815260088201602052604090205415612f6d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161051a565b8251603014612fd45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161051a565b612fdd856132c5565b5f806130246040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134b0565b5f828152600586016020526040902091935091506130428282613f98565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061306f908590600401614053565b6020604051808303815f875af115801561308b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130af9190613ce3565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561312857613128613c45565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556131d183612659565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612dfb60015f8051602061434b83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661328057604051631afcd79f60e31b815260040160405180910390fd5b565b61328a613237565b61329381613855565b611614606082013560808301356132b060c0850160a08601613a8e565b6132c060e0860160c08701614264565b613876565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061432b8339815191529060ff165f03613303575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061334b9083614115565b10613367576001600160401b0384166040830152808252613386565b83826040018181516133799190614244565b6001600160401b03169052505b5f82602001518360400151606461339d919061427f565b6133a791906142aa565b600285015490915060ff90811690821611156134225760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161051a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061434b83398151915280546001190161349757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061434b83398151915255565b5f606082608001515160301461351a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161051a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561359157613551816001614115565b61355c906008613e10565b5081515f9083908390811061357357613573614128565b60200101906001600160f81b03191690815f1a90535060010161353d565b505f5b60048110156135ef576135a8816003614115565b6135b3906008613e10565b505f826135c183600261417f565b815181106135d1576135d1614128565b60200101906001600160f81b03191690815f1a905350600101613594565b505f5b602081101561364c578451816020811061360e5761360e614128565b1a60f81b8261361e83600661417f565b8151811061362e5761362e614128565b60200101906001600160f81b03191690815f1a9053506001016135f2565b505f5b60208110156136ac578460200151816020811061366e5761366e614128565b1a60f81b8261367e83602661417f565b8151811061368e5761368e614128565b60200101906001600160f81b03191690815f1a90535060010161364f565b505f5b6008811015613720576136c3816007614115565b6136ce906008613e10565b60ff1685604001516001600160401b0316901c60f81b828260466136f2919061417f565b8151811061370257613702614128565b60200101906001600160f81b03191690815f1a9053506001016136af565b505f5b603081101561378b578460800151818151811061374257613742614128565b01602001516001600160f81b0319168261375d83604e61417f565b8151811061376d5761376d614128565b60200101906001600160f81b03191690815f1a905350600101613723565b505f5b60088110156137fd576137a2816007614115565b6137ad906008613e10565b60608601516001600160401b0390811691161c60f81b826137cf83607e61417f565b815181106137df576137df614128565b60200101906001600160f81b03191690815f1a90535060010161378e565b5060028160405161380e91906142cf565b602060405180830381855afa158015613829573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061384c9190613ce3565b94909350915050565b61385d613237565b6138656138d1565b61386d6138e1565b611614816138e9565b61387e613237565b5f5f8051602061430b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6138d9613237565b613280613955565b613280613237565b6138f1613237565b80355f8051602061432b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561393b60608301604084016142ea565b600291909101805460ff191660ff90921691909117905550565b61349d613237565b50805461396990613c13565b5f825580601f10613978575050565b601f0160209004905f5260205f209081019061161491905b808211156139a3575f8155600101613990565b5090565b5f60e082840312156139b7575f80fd5b50919050565b5f602082840312156139cd575f80fd5b5035919050565b803563ffffffff811681146139e7575f80fd5b919050565b6001600160a01b0381168114611614575f80fd5b5f8060408385031215613a11575f80fd5b613a1a836139d4565b91506020830135613a2a816139ec565b809150509250929050565b5f8060408385031215613a46575f80fd5b823591506020830135613a2a816139ec565b5f60208284031215613a68575f80fd5b613a71826139d4565b9392505050565b80356001600160401b03811681146139e7575f80fd5b5f60208284031215613a9e575f80fd5b613a7182613a78565b8015158114611614575f80fd5b5f805f60608486031215613ac6575f80fd5b833592506020840135613ad881613aa7565b9150613ae6604085016139d4565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b2557613b25613aef565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b5357613b53613aef565b604052919050565b5f6001600160401b03821115613b7357613b73613aef565b50601f01601f191660200190565b5f805f60608486031215613b93575f80fd5b83359250613ba360208501613a78565b915060408401356001600160401b03811115613bbd575f80fd5b8401601f81018613613bcd575f80fd5b8035613be0613bdb82613b5b565b613b2b565b818152876020838501011115613bf4575f80fd5b816020840160208301375f602083830101528093505050509250925092565b600181811c90821680613c2757607f821691505b6020821081036139b757634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613c6b81613c13565b806020870152604060018084165f8114613c8c5760018114613ca857613cd5565b60ff19851660408a0152604084151560051b8a01019550613cd5565b895f5260205f205f5b85811015613ccc5781548b8201860152908301908801613cb1565b8a016040019650505b509398975050505050505050565b5f60208284031215613cf3575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613e0b57613e0b613dd5565b500490565b808202811582820484141761084a5761084a613de9565b5f5b83811015613e41578181015183820152602001613e29565b50505f910152565b80516139e781613aa7565b5f8060408385031215613e65575f80fd5b82516001600160401b0380821115613e7b575f80fd5b9084019060608287031215613e8e575f80fd5b613e96613b03565b82518152602080840151613ea9816139ec565b82820152604084015183811115613ebe575f80fd5b80850194505087601f850112613ed2575f80fd5b83519250613ee2613bdb84613b5b565b8381528882858701011115613ef5575f80fd5b613f0484838301848801613e27565b80604084015250819550613f19818801613e49565b9450505050509250929050565b6001600160401b03828116828216039080821115613f4657613f46613de9565b5092915050565b601f82111561059c57805f5260205f20601f840160051c81016020851015613f725750805b601f840160051c820191505b81811015613f91575f8155600101613f7e565b5050505050565b81516001600160401b03811115613fb157613fb1613aef565b613fc581613fbf8454613c13565b84613f4d565b602080601f831160018114613ff8575f8415613fe15750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b8281101561402657888601518255948401946001909101908401614007565b508582101561404357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f8251806020840152614071816040850160208701613e27565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561084a5761084a613de9565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561084a5761084a613de9565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361423a5761423a613de9565b6001019392505050565b6001600160401b03818116838216019080821115613f4657613f46613de9565b5f60208284031215614274575f80fd5b8135613a71816139ec565b6001600160401b038181168382160280821691908281146142a2576142a2613de9565b505092915050565b5f6001600160401b03808416806142c3576142c3613dd5565b92169190910492915050565b5f82516142e0818460208701613e27565b9190910192915050565b5f602082840312156142fa575f80fd5b813560ff81168114613a71575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 5879c30b7..e1ead5021 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -28,8 +28,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 _minimumStakeDuration; /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; - /// @notice Maps the validationID to the uptime of the validator. - mapping(bytes32 validationID => uint64) _uptimes; /// @notice Maps the validationID to a mapping of delegator address to delegator information. mapping(bytes32 validationID => mapping(address delegator => Delegator)) _delegatorStakes; /// @notice Maps the validationID to a mapping of delegator address to pending register delegator messages. @@ -185,6 +183,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager weight: weight, startedAt: 0, endedAt: 0, + startingNonce: nonce, + endingNonce: 0, status: DelegatorStatus.PendingAdded }); @@ -215,10 +215,21 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _checkPendingRegisterDelegatorMessages(validationID, delegator); delete $._pendingRegisterDelegatorMessages[validationID][delegator]; - // Update the validator weight and delegator status Validator memory validator = _getValidator(validationID); + + // The received nonce should be no greater than the highest sent nonce require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); + // It should also be greater than or equal to the delegator's starting nonce + require( + $._delegatorStakes[validationID][delegator].startingNonce <= nonce, + "PoSValidatorManager: nonce does not match" + ); + require( + $._delegatorStakes[validationID][delegator].status == DelegatorStatus.PendingAdded, + "PoSValidatorManager: delegator not pending added" + ); + // Update the delegator status $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Active; $._delegatorStakes[validationID][delegator].startedAt = uint64(block.timestamp); @@ -238,8 +249,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( delegator.status == DelegatorStatus.Active, "ValidatorManager: delegator not active" ); + uint64 nonce = _getAndIncrementNonce(validationID); delegator.status = DelegatorStatus.PendingRemoved; delegator.endedAt = uint64(block.timestamp); + delegator.endingNonce = nonce; $._delegatorStakes[validationID][_msgSender()] = delegator; @@ -249,7 +262,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _setValidator(validationID, validator); // Submit the message to the Warp precompile. - uint64 nonce = _getAndIncrementNonce(validationID); bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); $._pendingEndDelegatorMessages[validationID][_msgSender()] = setValidatorWeightPayload; @@ -281,9 +293,21 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _checkPendingEndDelegatorMessage(validationID, delegator); delete $._pendingEndDelegatorMessages[validationID][delegator]; - // Update the validator weight and delegator status Validator memory validator = _getValidator(validationID); + // The received nonce should be no greater than the highest sent nonce require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); + // It should also be greater than or equal to the delegator's starting nonce + require( + $._delegatorStakes[validationID][delegator].endingNonce <= nonce, + "PoSValidatorManager: nonce does not match" + ); + + require( + $._delegatorStakes[validationID][delegator].status == DelegatorStatus.PendingRemoved, + "PoSValidatorManager: delegator not pending added" + ); + + // Update the delegator status $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Completed; emit DelegationEnded(validationID, delegator, nonce); diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 1ddc1dc23..c9e347f06 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -28,6 +28,8 @@ struct Delegator { uint64 weight; uint64 startedAt; uint64 endedAt; + uint64 startingNonce; + uint64 endingNonce; DelegatorStatus status; } @@ -125,6 +127,8 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Completes the delegator registration process by returning 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. * @param messageIndex The index of the Warp message to be received providing the acknowledgement. * @param delegator The address of the delegator being registered. */ @@ -148,6 +152,8 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Completes the process of ending a delegation by receiving an acknowledgement 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 the end of the + * delegator's delegation is valid, as long as that nonce has been sent by the contract. * @param messageIndex The index of the Warp message to be received providing the acknowledgement. * @param delegator The address of the delegator being removed. */ diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index c3c15769e..af2cb762a 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -250,6 +250,88 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); } + function testCompleteDelegatorRegistrationWrongNonce() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + // Initialize two delegations + address delegator1 = DEFAULT_DELEGATOR_ADDRESS; + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: delegator1, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); + address delegator2 = address(0x5678567856785678567856785678567856785678); + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: delegator2, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + + DEFAULT_WEIGHT, + expectedNonce: 2 + }); + + // Complete registration of delegator2 with delegator1's nonce + // Note that registering delegator1 with delegator2's nonce is valid + bytes memory setValidatorWeightPayload = ValidatorMessages + .packSubnetValidatorWeightUpdateMessage( + validationID, 1, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT + ); + _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); + + vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); + vm.expectRevert("PoSValidatorManager: nonce does not match"); + posValidatorManager.completeDelegatorRegistration(0, delegator2); + } + + function testCompleteDelegatorRegistrationImplicitNonce() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + // Initialize two delegations + address delegator1 = DEFAULT_DELEGATOR_ADDRESS; + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: delegator1, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); + address delegator2 = address(0x5678567856785678567856785678567856785678); + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: delegator2, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + + DEFAULT_WEIGHT, + expectedNonce: 2 + }); + // Mark delegator1 as registered by delivering the weight update from nonce 2 (delegator 2's nonce) + _setUpCompleteDelegatorRegistration( + validationID, + delegator1, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 2 + ); + } + function testInitializeEndDelegation() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -351,11 +433,147 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { DEFAULT_WEIGHT, 2 ); - _setupCompleteEndDelegation( + _setUpCompleteEndDelegation( validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2 ); } + function testCompleteEndDelegationWrongNonce() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + // Register two delegations + address delegator1 = DEFAULT_DELEGATOR_ADDRESS; + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: delegator1, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); + _setUpCompleteDelegatorRegistration( + validationID, + delegator1, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1 + ); + address delegator2 = address(0x5678567856785678567856785678567856785678); + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: delegator2, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + + DEFAULT_WEIGHT, + expectedNonce: 2 + }); + _setUpCompleteDelegatorRegistration( + validationID, + delegator2, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 2 + ); + + // Initialize end delegation for both delegators + _setUpInitializeEndDelegation( + validationID, + delegator1, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 3 + ); + _setUpInitializeEndDelegation( + validationID, + delegator2, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, + DEFAULT_WEIGHT, + 4 + ); + + // Complete ending delegator2 with delegator1's nonce + // Note that ending delegator1 with delegator2's nonce is valid + bytes memory setValidatorWeightPayload = ValidatorMessages + .packSubnetValidatorWeightUpdateMessage( + validationID, 3, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT + ); + _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); + + vm.expectRevert("PoSValidatorManager: nonce does not match"); + posValidatorManager.completeEndDelegation(0, delegator2); + } + + function testCompleteEndDelegationImplicitNonce() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + // Register two delegations + address delegator1 = DEFAULT_DELEGATOR_ADDRESS; + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: delegator1, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); + _setUpCompleteDelegatorRegistration( + validationID, + delegator1, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1 + ); + address delegator2 = address(0x5678567856785678567856785678567856785678); + _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegator: delegator2, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + + DEFAULT_WEIGHT, + expectedNonce: 2 + }); + _setUpCompleteDelegatorRegistration( + validationID, + delegator2, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 2 + ); + + // Initialize end delegation for both delegators + _setUpInitializeEndDelegation( + validationID, + delegator1, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 3 + ); + _setUpInitializeEndDelegation( + validationID, + delegator2, + DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, + DEFAULT_WEIGHT, + 4 + ); + + // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) + _setUpCompleteEndDelegation(validationID, delegator1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); + } + function testValueToWeight() public view { uint64 w1 = posValidatorManager.valueToWeight(1e12); uint64 w2 = posValidatorManager.valueToWeight(1e18); @@ -469,7 +687,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { return validationID; } - function _setupCompleteEndDelegation( + function _setUpCompleteEndDelegation( bytes32 validationID, address delegator, uint64 validatorWeight, From 6b82cbf7261140a22d003ba0acf719fc128ce12b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 3 Sep 2024 14:32:44 -0500 Subject: [PATCH 180/545] clarify unix timestamp --- contracts/staking/ERC20TokenStakingManager.sol | 2 +- contracts/staking/NativeTokenStakingManager.sol | 2 +- contracts/staking/ValidatorManager.sol | 2 +- contracts/staking/interfaces/IERC20TokenStakingManager.sol | 2 +- contracts/staking/interfaces/INativeTokenStakingManager.sol | 2 +- contracts/staking/interfaces/IPoAValidatorManager.sol | 2 +- contracts/staking/interfaces/IValidatorManager.sol | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index fff4c3128..ee67084ef 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -81,7 +81,7 @@ contract ERC20TokenStakingManager is * @notice Begins the validator registration process. Locks the configured ERC20 in the contract as the stake. * @param stakeAmount The amount to be staked. * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The time at which the registration is no longer valid on the P-Chain. + * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. * @param blsPublicKey The BLS public key of the validator. */ function initializeValidatorRegistration( diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index b3efb0f09..5642fe5a9 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -45,7 +45,7 @@ contract NativeTokenStakingManager is /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The time at which the registration is no longer valid on the P-Chain. + * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. * @param blsPublicKey The BLS public key of the validator. */ function initializeValidatorRegistration( diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 9784480e4..b24548866 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -99,7 +99,7 @@ abstract contract ValidatorManager is /** * @notice Begins the validator registration process, and sets the initial weight for the validator. * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. + * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. * @param blsPublicKey The BLS public key of the validator. */ function _initializeValidatorRegistration( diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index ed4c2858c..338bac25c 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -11,7 +11,7 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the {stakeAmount} of the managers specified ERC20 token. * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. + * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. * @param blsPublicKey The BLS public key of the validator. */ function initializeValidatorRegistration( diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index ae9b34fd3..3a72c380b 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -11,7 +11,7 @@ interface INativeTokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. + * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. * @param blsPublicKey The BLS public key of the validator. */ function initializeValidatorRegistration( diff --git a/contracts/staking/interfaces/IPoAValidatorManager.sol b/contracts/staking/interfaces/IPoAValidatorManager.sol index 93a6dc2b7..09c4f5017 100644 --- a/contracts/staking/interfaces/IPoAValidatorManager.sol +++ b/contracts/staking/interfaces/IPoAValidatorManager.sol @@ -11,7 +11,7 @@ interface IPoAValidatorManager is IValidatorManager { /** * @notice Begins the validator registration process, and sets the {weight} of the validator. * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The time at which the reigistration is no longer valid on the P-Chain. + * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. */ function initializeValidatorRegistration( uint64 weight, diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index e47d8093c..e56abf033 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -47,7 +47,7 @@ interface IValidatorManager { * @param registerValidationMessageID The ID of the Warp message that will be sent to the P-Chain to register the * validation period. * @param weight The weight of the validator being registered. - * @param registrationExpiry The time at which the registration is no longer valid on the P-Chain. + * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. */ event ValidationPeriodCreated( bytes32 indexed validationID, From bdef782eef516cea11ae772aec4220e66a6862ae Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 3 Sep 2024 14:39:15 -0500 Subject: [PATCH 181/545] update comments --- contracts/staking/ValidatorManager.sol | 1 + contracts/staking/interfaces/IPoSValidatorManager.sol | 1 + 2 files changed, 2 insertions(+) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index b24548866..12977e7c0 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -308,6 +308,7 @@ abstract contract ValidatorManager is /** * @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. */ function getWeight(bytes32 validationID) external view returns (uint64) { return _getValidator(validationID).weight; diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index c9e347f06..21346ec20 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -44,6 +44,7 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when a delegator registration is initiated * @param validationID The ID of the validation period + * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain * @param delegator The address of the delegator * @param delegatorWeight The weight of the delegator * @param validatorWeight The updated validator weight that is sent to the P-Chain From b59614d6d3be9c19d8b79b4467c8bf2a700ac905 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 3 Sep 2024 15:51:26 -0500 Subject: [PATCH 182/545] track uptimes for delegation period --- .../ERC20TokenStakingManager.go | 28 +++---- .../NativeTokenStakingManager.go | 28 +++---- contracts/staking/PoSValidatorManager.sol | 75 +++++++++++-------- .../interfaces/IPoSValidatorManager.sol | 11 ++- .../tests/PoSValidatorManagerTests.t.sol | 2 +- 5 files changed, 84 insertions(+), 60 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 195f53393..6eb6a1441 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516147b73803806147b783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61466a8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80636a7e3d831161009e5780639e1bc4ef1161006e5780639e1bc4ef1461021b578063a3a65e481461022e578063b771b3bc14610241578063bee0a03f14610267578063d61bed741461027a575f80fd5b80636a7e3d83146101cf57806376f78621146101e2578063872fda64146101f5578063927e7e7514610208575f80fd5b80632e2194d8116100d95780632e2194d814610158578063467ef06f14610188578063620658561461019b57806366435abf146101bc575f80fd5b80630322ed981461010a5780630915204e1461011f5780630b77f6931461013257806327f39ca814610145575b5f80fd5b61011d610118366004613c2a565b61028d565b005b61011d61012d366004613c6d565b6103ee565b61011d610140366004613ca2565b6105bf565b61011d610153366004613cc5565b610687565b61016b610166366004613c2a565b610795565b6040516001600160401b0390911681526020015b60405180910390f35b61011d610196366004613cf7565b6107ab565b6101ae6101a9366004613d2d565b610b07565b60405190815260200161017f565b61016b6101ca366004613c2a565b610b20565b61011d6101dd366004613ca2565b610b34565b61011d6101f0366004613d53565b610bb6565b6101ae610203366004613e20565b610ecf565b61011d610216366004613c2a565b610ef4565b61011d610229366004613ebc565b611306565b61011d61023c366004613cf7565b611315565b61024f6005600160991b0181565b6040516001600160a01b03909116815260200161017f565b61011d610275366004613c2a565b6114c9565b61011d610288366004613c6d565b611598565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145fe8339815191529291906102d590613edc565b9050118015610307575060035f83815260078301602052604090205460ff16600581111561030557610305613f14565b145b6103705760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613f28565b6020604051808303815f875af11580156103c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e99190613fb2565b505050565b5f805160206145de8339815191525f61040684611794565b90505f806104178360400151611975565b50915091506104268286611bb0565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061045291613be0565b5f61045c83611cc3565b9050816001600160401b031681606001516001600160401b031610156104945760405162461bcd60e51b815260040161036790613fc9565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156104e65760405162461bcd60e51b81526004016103679061400b565b60035f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff16600481111561052a5761052a613f14565b146105475760405162461bcd60e51b815260040161036790614054565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320600101805460ff60401b191668040000000000000000179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6105c98282611dbe565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206145de833981519152916005600160991b019163ee5b48eb9161064191600401613f28565b6020604051808303815f875af115801561065d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106819190613fb2565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106cb5750825b90505f826001600160401b031660011480156106e65750303b155b9050811580156106f4575080155b156107125760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561073c57845460ff60401b1916600160401b1785555b6107468787611edc565b831561078c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6107a564e8d4a51000836140cc565b92915050565b5f805160206145fe8339815191525f6107c383611794565b90505f806107d48360400151611ef6565b9150915080156108395760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610367565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561086a5761086a613f14565b600581111561087b5761087b613f14565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156108f4576108f4613f14565b1480610912575060018251600581111561091057610910613f14565b145b6109715760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610367565b60038251600581111561098657610986613f14565b036109ad57505f83815260068601602052604081206004916109a89190613be0565b6109b1565b5060055b6020808301515f908152600888019091526040812055818160058111156109da576109da613f14565b908160058111156109ed576109ed613f14565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610a2157610a21613f14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610ad457610ad4613f14565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6107a56001600160401b03831664e8d4a510006140df565b5f610b2a82611cc3565b6080015192915050565b610b3e8282611bb0565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206145de833981519152916005600160991b019163ee5b48eb9161064191600401613f28565b8115610ec6575f5f805160206145de8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c17573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c3e9190810190614123565b9150915080610ca15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610367565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ce4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d089190613fb2565b825114610d6c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610367565b60208201516001600160a01b031615610de25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610367565b5f80610df18460400151612097565b91509150818814610e5e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610367565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6103e98361226f565b5f80610eda866125c1565b9050610ee88582868661266e565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602090815260408083203384528252808320815160c08101835281546001600160401b038082168352600160401b808304821696840196909652600160801b8204811694830194909452600160c01b900483166060820152600182015492831660808201525f805160206145de8339815191529493909260a0840191900460ff166004811115610fab57610fab613f14565b6004811115610fbc57610fbc613f14565b905250905060028160a001516004811115610fd957610fd9613f14565b146110355760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b6064820152608401610367565b5f61103f84612aa2565b9050600360a08301819052506001600160401b0342811660408085019190915290821660808401525f85815260038501602052908120839161107e3390565b6001600160a01b0316815260208082019290925260409081015f2083518154938501519285015160608601516001600160401b039283166001600160801b031990961695909517600160401b9483168502176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b94821694909402939093178155608084015160018201805467ffffffffffffffff19811692909516918217815560a086015192949293909268ffffffffffffffffff19169091179083600481111561114e5761114e613f14565b02179055509050505f61116085611cc3565b9050825f01516001600160401b031681608001516001600160401b0316116111d65760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610367565b82516080820180516111e99083906141f5565b6001600160401b03169052506111ff8582612b1d565b5f61120f86848460800151612c0c565b5f878152600587016020908152604080832033845290915290209091506112368282614267565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611263908590600401614326565b6020604051808303815f875af115801561127f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112a39190613fb2565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b611311823383612e29565b5050565b5f805160206145fe8339815191525f61132d83611794565b90505f8061133e8360400151611ef6565b91509150806113a05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610367565b5f828152600585016020526040812080546113ba90613edc565b90501180156113ec575060015f83815260078601602052604090205460ff1660058111156113ea576113ea613f14565b145b6114085760405162461bcd60e51b815260040161036790614358565b5f828152600585016020526040812061142091613be0565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145fe83398151915292919061151190613edc565b9050118015611543575060015f83815260078301602052604090205460ff16600581111561154157611541613f14565b145b61155f5760405162461bcd60e51b815260040161036790614358565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613f28565b5f805160206145de8339815191525f6115b084611794565b90505f806115c18360400151611975565b50915091506115d08286611dbe565b5f82815260048501602090815260408083206001600160a01b038916845290915281206115fc91613be0565b5f61160683611cc3565b9050816001600160401b031681606001516001600160401b0316101561163e5760405162461bcd60e51b815260040161036790613fc9565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020546001600160401b03808416600160c01b9092041611156116945760405162461bcd60e51b81526004016103679061400b565b60015f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff1660048111156116d8576116d8613f14565b146116f55760405162461bcd60e51b815260040161036790614054565b5f83815260038601602090815260408083206001600160a01b038a168085529083529281902060018101805460ff60401b191668020000000000000000179055805467ffffffffffffffff60401b1916600160401b426001600160401b03818116929092029290921790925591519182528516929186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b691016112f5565b60408051606080820183525f8083526020830181905292820152905f805160206145fe8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611809573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118309190810190614123565b91509150806118975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610367565b82548251146118fa5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610367565b60208201516001600160a01b03161561196d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610367565b509392505050565b5f805f83516036146119995760405162461bcd60e51b81526004016103679061439f565b5f805b60028110156119e8576119b08160016143e8565b6119bb9060086140df565b61ffff168682815181106119d1576119d16143fb565b016020015160f81c901b919091179060010161199c565b5061ffff811615611a0b5760405162461bcd60e51b81526004016103679061440f565b5f805b6004811015611a6657611a228160036143e8565b611a2d9060086140df565b63ffffffff1687611a3f836002614452565b81518110611a4f57611a4f6143fb565b016020015160f81c901b9190911790600101611a0e565b5063ffffffff8116600314611a8d5760405162461bcd60e51b815260040161036790614465565b5f805b6020811015611ae257611aa481601f6143e8565b611aaf9060086140df565b88611abb836006614452565b81518110611acb57611acb6143fb565b016020015160f81c901b9190911790600101611a90565b505f805b6008811015611b4157611afa8160076143e8565b611b059060086140df565b6001600160401b031689611b1a836026614452565b81518110611b2a57611b2a6143fb565b016020015160f81c901b9190911790600101611ae6565b505f805b6008811015611ba057611b598160076143e8565b611b649060086140df565b6001600160401b03168a611b7983602e614452565b81518110611b8957611b896143fb565b016020015160f81c901b9190911790600101611b45565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206145de833981519152929190611c0c90613edc565b9050118015611c5c575060035f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff166004811115611c5a57611c5a613f14565b145b6103e95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b6064820152608401610367565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061463e83398151915290528390208351918201909352825491925f805160206145fe83398151915292829060ff166005811115611d4357611d43613f14565b6005811115611d5457611d54613f14565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206145de833981519152929190611e1a90613edc565b9050118015611e6a575060015f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff166004811115611e6857611e68613f14565b145b6103e95760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e670000000000000000006064820152608401610367565b611ee46131a5565b611eed826131f0565b61131181613236565b5f808251602714611f195760405162461bcd60e51b81526004016103679061439f565b5f805b6002811015611f6857611f308160016143e8565b611f3b9060086140df565b61ffff16858281518110611f5157611f516143fb565b016020015160f81c901b9190911790600101611f1c565b5061ffff811615611f8b5760405162461bcd60e51b81526004016103679061440f565b5f805b6004811015611fe657611fa28160036143e8565b611fad9060086140df565b63ffffffff1686611fbf836002614452565b81518110611fcf57611fcf6143fb565b016020015160f81c901b9190911790600101611f8e565b5063ffffffff811660021461200d5760405162461bcd60e51b815260040161036790614465565b5f805b60208110156120625761202481601f6143e8565b61202f9060086140df565b8761203b836006614452565b8151811061204b5761204b6143fb565b016020015160f81c901b9190911790600101612010565b505f86602681518110612077576120776143fb565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146120ba5760405162461bcd60e51b81526004016103679061439f565b5f805b6002811015612109576120d18160016143e8565b6120dc9060086140df565b61ffff168582815181106120f2576120f26143fb565b016020015160f81c901b91909117906001016120bd565b5061ffff81161561212c5760405162461bcd60e51b81526004016103679061440f565b5f805b6004811015612187576121438160036143e8565b61214e9060086140df565b63ffffffff1686612160836002614452565b81518110612170576121706143fb565b016020015160f81c901b919091179060010161212f565b5063ffffffff81166004146121ae5760405162461bcd60e51b815260040161036790614465565b5f805b6020811015612203576121c581601f6143e8565b6121d09060086140df565b876121dc836006614452565b815181106121ec576121ec6143fb565b016020015160f81c901b91909117906001016121b1565b505f805b60088110156122625761221b8160076143e8565b6122269060086140df565b6001600160401b03168861223b836026614452565b8151811061224b5761224b6143fb565b016020015160f81c901b9190911790600101612207565b5090969095509350505050565b5f8181525f8051602061463e8339815191526020526040808220815160e0810190925280545f805160206145fe83398151915293929190829060ff1660058111156122bc576122bc613f14565b60058111156122cd576122cd613f14565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561234757612347613f14565b146123645760405162461bcd60e51b8152600401610367906144ac565b60408101516001600160a01b0316336001600160a01b0316146123de5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610367565b6123eb81608001516132ea565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561242f5761242f613f14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124e3846124dd81612aa2565b5f612c0c565b5f85815260068501602052604090209091506124ff8282614267565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061252c908590600401614326565b6020604051808303815f875af1158015612548573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256c9190613fb2565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145de833981519152816125da8461348b565b90505f6125e682610795565b83549091506001600160401b0382161080159061261057508260010154816001600160401b031611155b610eec5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610367565b5f6126776134c1565b5f805160206145fe833981519152426001600160401b0385161180156126b157506001600160401b0384166126af426202a300614452565b115b6127135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610367565b8561276a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610367565b5f868152600882016020526040902054156127d85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610367565b825160301461283f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610367565b612848856132ea565b5f8061288f6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134f8565b5f828152600586016020526040902091935091506128ad8282614267565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128da908590600401614326565b6020604051808303815f875af11580156128f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061291a9190613fb2565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561299357612993613f14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612a3c83612aa2565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610eec60015f8051602061461e83398151915255565b5f8181525f8051602061463e8339815191526020526040812060020180545f805160206145fe83398151915291600160a01b9091046001600160401b03169081906014612aee836144f2565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061463e83398151915260205260409020815181545f805160206145fe8339815191529284929091829060ff19166001836005811115612b6757612b67613f14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612c8557612c458160016143e8565b612c509060086140df565b5081515f90839083908110612c6757612c676143fb565b60200101906001600160f81b03191690815f1a905350600101612c31565b505f5b6004811015612ce857612c9c8160036143e8565b612ca79060086140df565b6001901c60f81b82612cba836002614452565b81518110612cca57612cca6143fb565b60200101906001600160f81b03191690815f1a905350600101612c88565b505f5b6020811015612d4a57612cff81601f6143e8565b612d0a9060086140df565b86901c60f81b82612d1c836006614452565b81518110612d2c57612d2c6143fb565b60200101906001600160f81b03191690815f1a905350600101612ceb565b505f5b6008811015612db557612d618160076143e8565b612d6c9060086140df565b6001600160401b038616901c60f81b82612d87836026614452565b81518110612d9757612d976143fb565b60200101906001600160f81b03191690815f1a905350600101612d4d565b505f5b6008811015612e2057612dcc8160076143e8565b612dd79060086140df565b6001600160401b038516901c60f81b82612df283602e614452565b81518110612e0257612e026143fb565b60200101906001600160f81b03191690815f1a905350600101612db8565b50949350505050565b612e316134c1565b5f612e3e6101668361348b565b90505f805160206145de8339815191525f612e5886611cc3565b9050600281516005811115612e6f57612e6f613f14565b14612e8c5760405162461bcd60e51b8152600401610367906144ac565b5f86815260038301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612f1d5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b6064820152608401610367565b612f26836132ea565b8281608001818151612f389190614517565b6001600160401b0316905250612f4e8682612b1d565b5f612f5887612aa2565b90505f612f6a88838560800151612c0c565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612f9a8282614267565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612fc7908590600401614326565b6020604051808303815f875af1158015612fe3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130079190613fb2565b6040805160c0810182526001600160401b03808a1682525f6020830181905292820183905286166060820152608081019190915290915060a08101600190525f8a815260038701602090815260408083206001600160a01b038d16845282529182902083518154928501519385015160608601516001600160401b039283166001600160801b031990951694909417600160401b9583168602176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b93821693909302929092178155608084015160018201805467ffffffffffffffff19811692909416918217815560a086015192949293909268ffffffffffffffffff199091169091179083600481111561312157613121613f14565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a45050505050506103e960015f8051602061461e83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166131ee57604051631afcd79f60e31b815260040160405180910390fd5b565b6131f86131a5565b613201816138b0565b6132336060820135608083013561321e60c0850160a08601613d2d565b61322e60e0860160c08701614537565b6138d1565b50565b61323e6131a5565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610367565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145fe8339815191529060ff165f03613328575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061337090836143e8565b1061338c576001600160401b03841660408301528082526133ab565b838260400181815161339e9190614517565b6001600160401b03169052505b5f8260200151836040015160646133c29190614552565b6133cc919061457d565b600285015490915060ff90811690821611156134475760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610367565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6107a5827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061392c565b5f8051602061461e8339815191528054600119016134f257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135625760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610367565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135d9576135998160016143e8565b6135a49060086140df565b5081515f908390839081106135bb576135bb6143fb565b60200101906001600160f81b03191690815f1a905350600101613585565b505f5b6004811015613637576135f08160036143e8565b6135fb9060086140df565b505f82613609836002614452565b81518110613619576136196143fb565b60200101906001600160f81b03191690815f1a9053506001016135dc565b505f5b60208110156136945784518160208110613656576136566143fb565b1a60f81b82613666836006614452565b81518110613676576136766143fb565b60200101906001600160f81b03191690815f1a90535060010161363a565b505f5b60208110156136f457846020015181602081106136b6576136b66143fb565b1a60f81b826136c6836026614452565b815181106136d6576136d66143fb565b60200101906001600160f81b03191690815f1a905350600101613697565b505f5b60088110156137685761370b8160076143e8565b6137169060086140df565b60ff1685604001516001600160401b0316901c60f81b8282604661373a9190614452565b8151811061374a5761374a6143fb565b60200101906001600160f81b03191690815f1a9053506001016136f7565b505f5b60308110156137d3578460800151818151811061378a5761378a6143fb565b01602001516001600160f81b031916826137a583604e614452565b815181106137b5576137b56143fb565b60200101906001600160f81b03191690815f1a90535060010161376b565b505f5b6008811015613845576137ea8160076143e8565b6137f59060086140df565b60608601516001600160401b0390811691161c60f81b8261381783607e614452565b81518110613827576138276143fb565b60200101906001600160f81b03191690815f1a9053506001016137d6565b5060028160405161385691906145a2565b602060405180830381855afa158015613871573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138949190613fb2565b94909350915050565b60015f8051602061461e83398151915255565b6138b86131a5565b6138c0613a8e565b6138c8613a9e565b61323381613aa6565b6138d96131a5565b5f5f805160206145de833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613972573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139969190613fb2565b90506139ad6001600160a01b038516333086613b12565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a159190613fb2565b9050818111613a7b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610367565b613a8582826143e8565b95945050505050565b613a966131a5565b6131ee613b6c565b6131ee6131a5565b613aae6131a5565b80355f805160206145fe83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613af860608301604084016145bd565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610681908590613b74565b61389d6131a5565b5f8060205f8451602086015f885af180613b93576040513d5f823e3d81fd5b50505f513d91508115613baa578060011415613bb7565b6001600160a01b0384163b155b1561068157604051635274afe760e01b81526001600160a01b0385166004820152602401610367565b508054613bec90613edc565b5f825580601f10613bfb575050565b601f0160209004905f5260205f209081019061323391905b80821115613c26575f8155600101613c13565b5090565b5f60208284031215613c3a575f80fd5b5035919050565b803563ffffffff81168114613c54575f80fd5b919050565b6001600160a01b0381168114613233575f80fd5b5f8060408385031215613c7e575f80fd5b613c8783613c41565b91506020830135613c9781613c59565b809150509250929050565b5f8060408385031215613cb3575f80fd5b823591506020830135613c9781613c59565b5f80828403610100811215613cd8575f80fd5b60e0811215613ce5575f80fd5b5082915060e0830135613c9781613c59565b5f60208284031215613d07575f80fd5b613d1082613c41565b9392505050565b80356001600160401b0381168114613c54575f80fd5b5f60208284031215613d3d575f80fd5b613d1082613d17565b8015158114613233575f80fd5b5f805f60608486031215613d65575f80fd5b833592506020840135613d7781613d46565b9150613d8560408501613c41565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613dc457613dc4613d8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613df257613df2613d8e565b604052919050565b5f6001600160401b03821115613e1257613e12613d8e565b50601f01601f191660200190565b5f805f8060808587031215613e33575f80fd5b8435935060208501359250613e4a60408601613d17565b915060608501356001600160401b03811115613e64575f80fd5b8501601f81018713613e74575f80fd5b8035613e87613e8282613dfa565b613dca565b818152886020838501011115613e9b575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ecd575f80fd5b50508035926020909101359150565b600181811c90821680613ef057607f821691505b602082108103613f0e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613f3a81613edc565b806020870152604060018084165f8114613f5b5760018114613f7757613fa4565b60ff19851660408a0152604084151560051b8a01019550613fa4565b895f5260205f205f5b85811015613f9b5781548b8201860152908301908801613f80565b8a016040019650505b509398975050505050505050565b5f60208284031215613fc2575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826140da576140da6140a4565b500490565b80820281158282048414176107a5576107a56140b8565b5f5b838110156141105781810151838201526020016140f8565b50505f910152565b8051613c5481613d46565b5f8060408385031215614134575f80fd5b82516001600160401b038082111561414a575f80fd5b908401906060828703121561415d575f80fd5b614165613da2565b8251815260208084015161417881613c59565b8282015260408401518381111561418d575f80fd5b80850194505087601f8501126141a1575f80fd5b835192506141b1613e8284613dfa565b83815288828587010111156141c4575f80fd5b6141d3848383018488016140f6565b806040840152508195506141e8818801614118565b9450505050509250929050565b6001600160401b03828116828216039080821115614215576142156140b8565b5092915050565b601f8211156103e957805f5260205f20601f840160051c810160208510156142415750805b601f840160051c820191505b81811015614260575f815560010161424d565b5050505050565b81516001600160401b0381111561428057614280613d8e565b6142948161428e8454613edc565b8461421c565b602080601f8311600181146142c7575f84156142b05750858301515b5f19600386901b1c1916600185901b17855561431e565b5f85815260208120601f198616915b828110156142f5578886015182559484019460019091019084016142d6565b508582101561431257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526143448160408501602087016140f6565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156107a5576107a56140b8565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156107a5576107a56140b8565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361450d5761450d6140b8565b6001019392505050565b6001600160401b03818116838216019080821115614215576142156140b8565b5f60208284031215614547575f80fd5b8135613d1081613c59565b6001600160401b03818116838216028082169190828114614575576145756140b8565b505092915050565b5f6001600160401b0380841680614596576145966140a4565b92169190910492915050565b5f82516145b38184602087016140f6565b9190910192915050565b5f602082840312156145cd575f80fd5b813560ff81168114613d10575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"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\":\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516147de3803806147de83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146918061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef1461021b578063a3a65e481461022e578063b771b3bc14610241578063bee0a03f14610267578063d61bed741461027a575f80fd5b806366435abf146101cf5780636a7e3d83146101e257806376f78621146101f5578063872fda6414610208575f80fd5b806327f39ca8116100d957806327f39ca8146101585780632e2194d81461016b578063467ef06f1461019b57806362065856146101ae575f80fd5b80630118acc41461010a5780630322ed981461011f5780630915204e146101325780630b77f69314610145575b5f80fd5b61011d610118366004613c76565b61028d565b005b61011d61012d366004613cb1565b6106bc565b61011d610140366004613cdc565b610818565b61011d610153366004613d11565b6109e4565b61011d610166366004613d34565b610aac565b61017e610179366004613cb1565b610bba565b6040516001600160401b0390911681526020015b60405180910390f35b61011d6101a9366004613d66565b610bd0565b6101c16101bc366004613d9c565b610f2c565b604051908152602001610192565b61017e6101dd366004613cb1565b610f45565b61011d6101f0366004613d11565b610f59565b61011d610203366004613c76565b610fdb565b6101c1610216366004613e47565b610ff6565b61011d610229366004613ee3565b61101b565b61011d61023c366004613d66565b61102a565b61024f6005600160991b0181565b6040516001600160a01b039091168152602001610192565b61011d610275366004613cb1565b6111de565b61011d610288366004613cdc565b6112ad565b5f82156102a15761029e84836114b3565b90505b5f8481527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602090815260408083203384528252808320815160e08101835281546001600160401b038082168352600160401b808304821696840196909652600160801b808304821695840195909552600160c01b90910481166060830152600183015480821660808401529485041660a08201525f805160206146058339815191529493909260c08401910460ff16600481111561036257610362613f03565b600481111561037357610373613f03565b905250905060028160c00151600481111561039057610390613f03565b146103f15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b60648201526084015b60405180910390fd5b5f6103fb876117c3565b9050600360c08301819052506001600160401b03428116604080850191909152828216608085015290851660a08401525f8881526003850160205290812083916104423390565b6001600160a01b0316815260208082019290925260409081015f2083518154938501519285015160608601516001600160401b039283166001600160801b031996871617600160401b9584168602176001600160801b0316600160801b92841683026001600160c01b031617600160c01b91841691909102178355608086015160018401805460a089015192851697169690961792169093021780845560c08501519193919260ff60801b199091169083600481111561050457610504613f03565b02179055509050505f6105168861183e565b9050825f01516001600160401b031681608001516001600160401b03161161058c5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016103e8565b825160808201805161059f908390613f2b565b6001600160401b03169052506105b58882611939565b5f6105c589848460800151611a28565b5f8a8152600587016020908152604080832033845290915290209091506105ec8282613fd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106199085906004016140b6565b6020604051808303815f875af1158015610635573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065991906140e8565b6080840151604080516001600160401b0392831681529187166020830152428282015251919250339183918d917fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde9181900360600190a450505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061462583398151915292919061070490613f52565b9050118015610736575060035f83815260078301602052604090205460ff16600581111561073457610734613f03565b145b61079a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016103e8565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107d391906004016140ff565b6020604051808303815f875af11580156107ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061081391906140e8565b505050565b5f805160206146058339815191525f61083084611c45565b90505f806108418360400151611e26565b50915091506108508286612061565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061087c91613c07565b5f6108868361183e565b9050816001600160401b031681606001516001600160401b031610156108be5760405162461bcd60e51b81526004016103e890614189565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156109105760405162461bcd60e51b81526004016103e8906141cb565b60035f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160801b900460ff16600481111561095457610954613f03565b146109715760405162461bcd60e51b81526004016103e890614214565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320600101805460ff60801b1916600160821b179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6109ee8282612174565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614605833981519152916005600160991b019163ee5b48eb91610a66916004016140ff565b6020604051808303815f875af1158015610a82573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa691906140e8565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610af05750825b90505f826001600160401b03166001148015610b0b5750303b155b905081158015610b19575080155b15610b375760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b6157845460ff60401b1916600160401b1785555b610b6b8787612292565b8315610bb157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f610bca64e8d4a5100083614278565b92915050565b5f805160206146258339815191525f610be883611c45565b90505f80610bf983604001516122ac565b915091508015610c5e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103e8565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610c8f57610c8f613f03565b6005811115610ca057610ca0613f03565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610d1957610d19613f03565b1480610d375750600182516005811115610d3557610d35613f03565b145b610d965760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103e8565b600382516005811115610dab57610dab613f03565b03610dd257505f8381526006860160205260408120600491610dcd9190613c07565b610dd6565b5060055b6020808301515f90815260088801909152604081205581816005811115610dff57610dff613f03565b90816005811115610e1257610e12613f03565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610e4657610e46613f03565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610ef957610ef9613f03565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f610bca6001600160401b03831664e8d4a5100061428b565b5f610f4f8261183e565b6080015192915050565b610f638282612061565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614605833981519152916005600160991b019163ee5b48eb91610a66916004016140ff565b8115610fed57610feb83826114b3565b505b6108138361244d565b5f806110018661279f565b905061100f8582868661284c565b9150505b949350505050565b611026823383612c80565b5050565b5f805160206146258339815191525f61104283611c45565b90505f8061105383604001516122ac565b91509150806110b55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103e8565b5f828152600585016020526040812080546110cf90613f52565b9050118015611101575060015f83815260078601602052604090205460ff1660058111156110ff576110ff613f03565b145b61111d5760405162461bcd60e51b81526004016103e8906142a2565b5f828152600585016020526040812061113591613c07565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061462583398151915292919061122690613f52565b9050118015611258575060015f83815260078301602052604090205460ff16600581111561125657611256613f03565b145b6112745760405162461bcd60e51b81526004016103e8906142a2565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107d391906004016140ff565b5f805160206146058339815191525f6112c584611c45565b90505f806112d68360400151611e26565b50915091506112e58286612174565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061131191613c07565b5f61131b8361183e565b9050816001600160401b031681606001516001600160401b031610156113535760405162461bcd60e51b81526004016103e890614189565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020546001600160401b03808416600160c01b9092041611156113a95760405162461bcd60e51b81526004016103e8906141cb565b60015f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160801b900460ff1660048111156113ed576113ed613f03565b1461140a5760405162461bcd60e51b81526004016103e890614214565b5f83815260038601602090815260408083206001600160a01b038a168085529083529281902060018101805460ff60801b1916600160811b179055805467ffffffffffffffff60401b1916600160401b426001600160401b03818116929092029290921790925582519081529151908616939287927fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6929081900390910190a450505050505050565b5f805f805160206146058339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561150f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261153691908101906142f4565b91509150806115995760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103e8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160091906140e8565b8251146116645760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103e8565b60208201516001600160a01b0316156116da5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103e8565b5f806116e98460400151612ff4565b915091508188146117565760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103e8565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a2979650505050505050565b5f8181525f805160206146658339815191526020526040812060020180545f8051602061462583398151915291600160a01b9091046001600160401b0316908190601461180f836143c6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061466583398151915290528390208351918201909352825491925f8051602061462583398151915292829060ff1660058111156118be576118be613f03565b60058111156118cf576118cf613f03565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061466583398151915260205260409020815181545f805160206146258339815191529284929091829060ff1916600183600581111561198357611983613f03565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611aa157611a618160016143eb565b611a6c90600861428b565b5081515f90839083908110611a8357611a836143fe565b60200101906001600160f81b03191690815f1a905350600101611a4d565b505f5b6004811015611b0457611ab88160036143eb565b611ac390600861428b565b6001901c60f81b82611ad6836002614412565b81518110611ae657611ae66143fe565b60200101906001600160f81b03191690815f1a905350600101611aa4565b505f5b6020811015611b6657611b1b81601f6143eb565b611b2690600861428b565b86901c60f81b82611b38836006614412565b81518110611b4857611b486143fe565b60200101906001600160f81b03191690815f1a905350600101611b07565b505f5b6008811015611bd157611b7d8160076143eb565b611b8890600861428b565b6001600160401b038616901c60f81b82611ba3836026614412565b81518110611bb357611bb36143fe565b60200101906001600160f81b03191690815f1a905350600101611b69565b505f5b6008811015611c3c57611be88160076143eb565b611bf390600861428b565b6001600160401b038516901c60f81b82611c0e83602e614412565b81518110611c1e57611c1e6143fe565b60200101906001600160f81b03191690815f1a905350600101611bd4565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f805160206146258339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611cba573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ce191908101906142f4565b9150915080611d485760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103e8565b8254825114611dab5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103e8565b60208201516001600160a01b031615611e1e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103e8565b509392505050565b5f805f8351603614611e4a5760405162461bcd60e51b81526004016103e890614425565b5f805b6002811015611e9957611e618160016143eb565b611e6c90600861428b565b61ffff16868281518110611e8257611e826143fe565b016020015160f81c901b9190911790600101611e4d565b5061ffff811615611ebc5760405162461bcd60e51b81526004016103e89061446e565b5f805b6004811015611f1757611ed38160036143eb565b611ede90600861428b565b63ffffffff1687611ef0836002614412565b81518110611f0057611f006143fe565b016020015160f81c901b9190911790600101611ebf565b5063ffffffff8116600314611f3e5760405162461bcd60e51b81526004016103e8906144b1565b5f805b6020811015611f9357611f5581601f6143eb565b611f6090600861428b565b88611f6c836006614412565b81518110611f7c57611f7c6143fe565b016020015160f81c901b9190911790600101611f41565b505f805b6008811015611ff257611fab8160076143eb565b611fb690600861428b565b6001600160401b031689611fcb836026614412565b81518110611fdb57611fdb6143fe565b016020015160f81c901b9190911790600101611f97565b505f805b60088110156120515761200a8160076143eb565b61201590600861428b565b6001600160401b03168a61202a83602e614412565b8151811061203a5761203a6143fe565b016020015160f81c901b9190911790600101611ff6565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206146058339815191529291906120bd90613f52565b905011801561210d575060035f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160801b900460ff16600481111561210b5761210b613f03565b145b6108135760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016103e8565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206146058339815191529291906121d090613f52565b9050118015612220575060015f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160801b900460ff16600481111561221e5761221e613f03565b145b6108135760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016103e8565b61229a6131cc565b6122a382613217565b6110268161325d565b5f8082516027146122cf5760405162461bcd60e51b81526004016103e890614425565b5f805b600281101561231e576122e68160016143eb565b6122f190600861428b565b61ffff16858281518110612307576123076143fe565b016020015160f81c901b91909117906001016122d2565b5061ffff8116156123415760405162461bcd60e51b81526004016103e89061446e565b5f805b600481101561239c576123588160036143eb565b61236390600861428b565b63ffffffff1686612375836002614412565b81518110612385576123856143fe565b016020015160f81c901b9190911790600101612344565b5063ffffffff81166002146123c35760405162461bcd60e51b81526004016103e8906144b1565b5f805b6020811015612418576123da81601f6143eb565b6123e590600861428b565b876123f1836006614412565b81518110612401576124016143fe565b016020015160f81c901b91909117906001016123c6565b505f8660268151811061242d5761242d6143fe565b016020015191976001600160f81b03199092161515965090945050505050565b5f8181525f805160206146658339815191526020526040808220815160e0810190925280545f8051602061462583398151915293929190829060ff16600581111561249a5761249a613f03565b60058111156124ab576124ab613f03565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561252557612525613f03565b146125425760405162461bcd60e51b81526004016103e8906144f8565b60408101516001600160a01b0316336001600160a01b0316146125bc5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103e8565b6125c98160800151613311565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561260d5761260d613f03565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6126c1846126bb816117c3565b5f611a28565b5f85815260068501602052604090209091506126dd8282613fd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061270a9085906004016140b6565b6020604051808303815f875af1158015612726573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061274a91906140e8565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f80516020614605833981519152816127b8846134b2565b90505f6127c482610bba565b83549091506001600160401b038216108015906127ee57508260010154816001600160401b031611155b6110135760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103e8565b5f6128556134e8565b5f80516020614625833981519152426001600160401b03851611801561288f57506001600160401b03841661288d426202a300614412565b115b6128f15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103e8565b856129485760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103e8565b5f868152600882016020526040902054156129b65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103e8565b8251603014612a1d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103e8565b612a2685613311565b5f80612a6d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061351f565b5f82815260058601602052604090209193509150612a8b8282613fd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ab89085906004016140b6565b6020604051808303815f875af1158015612ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af891906140e8565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612b7157612b71613f03565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612c1a836117c3565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061101360015f8051602061464583398151915255565b612c886134e8565b5f612c95610179836134b2565b90505f805160206146058339815191525f612caf8661183e565b9050600281516005811115612cc657612cc6613f03565b14612ce35760405162461bcd60e51b81526004016103e8906144f8565b5f86815260038301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612d745760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016103e8565b612d7d83613311565b8281608001818151612d8f919061453e565b6001600160401b0316905250612da58682611939565b5f612daf876117c3565b90505f612dc188838560800151611a28565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612df18282613fd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e1e9085906004016140b6565b6020604051808303815f875af1158015612e3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e5e91906140e8565b6040805160e0810182526001600160401b03808a1682525f60208301819052928201839052861660608201526080810182905260a081019190915290915060c08101600190525f8a815260038701602090815260408083206001600160a01b038d16845282529182902083518154928501519385015160608601516001600160401b039283166001600160801b031995861617600160401b9684168702176001600160801b0316600160801b92841683026001600160c01b031617600160c01b91841691909102178355608086015160018401805460a089015192851696169590951792169094021780835560c0850151919391929160ff60801b1990911690836004811115612f7057612f70613f03565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a450505050505061081360015f8051602061464583398151915255565b5f808251602e146130175760405162461bcd60e51b81526004016103e890614425565b5f805b60028110156130665761302e8160016143eb565b61303990600861428b565b61ffff1685828151811061304f5761304f6143fe565b016020015160f81c901b919091179060010161301a565b5061ffff8116156130895760405162461bcd60e51b81526004016103e89061446e565b5f805b60048110156130e4576130a08160036143eb565b6130ab90600861428b565b63ffffffff16866130bd836002614412565b815181106130cd576130cd6143fe565b016020015160f81c901b919091179060010161308c565b5063ffffffff811660041461310b5760405162461bcd60e51b81526004016103e8906144b1565b5f805b60208110156131605761312281601f6143eb565b61312d90600861428b565b87613139836006614412565b81518110613149576131496143fe565b016020015160f81c901b919091179060010161310e565b505f805b60088110156131bf576131788160076143eb565b61318390600861428b565b6001600160401b031688613198836026614412565b815181106131a8576131a86143fe565b016020015160f81c901b9190911790600101613164565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661321557604051631afcd79f60e31b815260040160405180910390fd5b565b61321f6131cc565b613228816138d7565b61325a6060820135608083013561324560c0850160a08601613d9c565b61325560e0860160c0870161455e565b6138f8565b50565b6132656131cc565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132f15760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103e8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146258339815191529060ff165f0361334f575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061339790836143eb565b106133b3576001600160401b03841660408301528082526133d2565b83826040018181516133c5919061453e565b6001600160401b03169052505b5f8260200151836040015160646133e99190614579565b6133f391906145a4565b600285015490915060ff908116908216111561346e5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103e8565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610bca827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613953565b5f8051602061464583398151915280546001190161351957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135895760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103e8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613600576135c08160016143eb565b6135cb90600861428b565b5081515f908390839081106135e2576135e26143fe565b60200101906001600160f81b03191690815f1a9053506001016135ac565b505f5b600481101561365e576136178160036143eb565b61362290600861428b565b505f82613630836002614412565b81518110613640576136406143fe565b60200101906001600160f81b03191690815f1a905350600101613603565b505f5b60208110156136bb578451816020811061367d5761367d6143fe565b1a60f81b8261368d836006614412565b8151811061369d5761369d6143fe565b60200101906001600160f81b03191690815f1a905350600101613661565b505f5b602081101561371b57846020015181602081106136dd576136dd6143fe565b1a60f81b826136ed836026614412565b815181106136fd576136fd6143fe565b60200101906001600160f81b03191690815f1a9053506001016136be565b505f5b600881101561378f576137328160076143eb565b61373d90600861428b565b60ff1685604001516001600160401b0316901c60f81b828260466137619190614412565b81518110613771576137716143fe565b60200101906001600160f81b03191690815f1a90535060010161371e565b505f5b60308110156137fa57846080015181815181106137b1576137b16143fe565b01602001516001600160f81b031916826137cc83604e614412565b815181106137dc576137dc6143fe565b60200101906001600160f81b03191690815f1a905350600101613792565b505f5b600881101561386c576138118160076143eb565b61381c90600861428b565b60608601516001600160401b0390811691161c60f81b8261383e83607e614412565b8151811061384e5761384e6143fe565b60200101906001600160f81b03191690815f1a9053506001016137fd565b5060028160405161387d91906145c9565b602060405180830381855afa158015613898573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138bb91906140e8565b94909350915050565b60015f8051602061464583398151915255565b6138df6131cc565b6138e7613ab5565b6138ef613ac5565b61325a81613acd565b6139006131cc565b5f5f80516020614605833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139bd91906140e8565b90506139d46001600160a01b038516333086613b39565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a3c91906140e8565b9050818111613aa25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103e8565b613aac82826143eb565b95945050505050565b613abd6131cc565b613215613b93565b6132156131cc565b613ad56131cc565b80355f8051602061462583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b1f60608301604084016145e4565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610aa6908590613b9b565b6138c46131cc565b5f8060205f8451602086015f885af180613bba576040513d5f823e3d81fd5b50505f513d91508115613bd1578060011415613bde565b6001600160a01b0384163b155b15610aa657604051635274afe760e01b81526001600160a01b03851660048201526024016103e8565b508054613c1390613f52565b5f825580601f10613c22575050565b601f0160209004905f5260205f209081019061325a91905b80821115613c4d575f8155600101613c3a565b5090565b801515811461325a575f80fd5b803563ffffffff81168114613c71575f80fd5b919050565b5f805f60608486031215613c88575f80fd5b833592506020840135613c9a81613c51565b9150613ca860408501613c5e565b90509250925092565b5f60208284031215613cc1575f80fd5b5035919050565b6001600160a01b038116811461325a575f80fd5b5f8060408385031215613ced575f80fd5b613cf683613c5e565b91506020830135613d0681613cc8565b809150509250929050565b5f8060408385031215613d22575f80fd5b823591506020830135613d0681613cc8565b5f80828403610100811215613d47575f80fd5b60e0811215613d54575f80fd5b5082915060e0830135613d0681613cc8565b5f60208284031215613d76575f80fd5b613d7f82613c5e565b9392505050565b80356001600160401b0381168114613c71575f80fd5b5f60208284031215613dac575f80fd5b613d7f82613d86565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613deb57613deb613db5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e1957613e19613db5565b604052919050565b5f6001600160401b03821115613e3957613e39613db5565b50601f01601f191660200190565b5f805f8060808587031215613e5a575f80fd5b8435935060208501359250613e7160408601613d86565b915060608501356001600160401b03811115613e8b575f80fd5b8501601f81018713613e9b575f80fd5b8035613eae613ea982613e21565b613df1565b818152886020838501011115613ec2575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ef4575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f4b57613f4b613f17565b5092915050565b600181811c90821680613f6657607f821691505b602082108103613f8457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561081357805f5260205f20601f840160051c81016020851015613faf5750805b601f840160051c820191505b81811015613fce575f8155600101613fbb565b5050505050565b81516001600160401b03811115613fee57613fee613db5565b61400281613ffc8454613f52565b84613f8a565b602080601f831160018114614035575f841561401e5750858301515b5f19600386901b1c1916600185901b17855561408c565b5f85815260208120601f198616915b8281101561406357888601518255948401946001909101908401614044565b508582101561408057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140ae578181015183820152602001614096565b50505f910152565b602081525f82518060208401526140d4816040850160208701614094565b601f01601f19169190910160400192915050565b5f602082840312156140f8575f80fd5b5051919050565b5f60208083525f845461411181613f52565b806020870152604060018084165f8114614132576001811461414e5761417b565b60ff19851660408a0152604084151560051b8a0101955061417b565b895f5260205f205f5b858110156141725781548b8201860152908301908801614157565b8a016040019650505b509398975050505050505050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261428657614286614264565b500490565b8082028115828204841417610bca57610bca613f17565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613c7181613c51565b5f8060408385031215614305575f80fd5b82516001600160401b038082111561431b575f80fd5b908401906060828703121561432e575f80fd5b614336613dc9565b8251815260208084015161434981613cc8565b8282015260408401518381111561435e575f80fd5b80850194505087601f850112614372575f80fd5b83519250614382613ea984613e21565b8381528882858701011115614395575f80fd5b6143a484838301848801614094565b806040840152508195506143b98188016142e9565b9450505050509250929050565b5f6001600160401b038083168181036143e1576143e1613f17565b6001019392505050565b81810381811115610bca57610bca613f17565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610bca57610bca613f17565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b6001600160401b03818116838216019080821115613f4b57613f4b613f17565b5f6020828403121561456e575f80fd5b8135613d7f81613cc8565b6001600160401b0381811683821602808216919082811461459c5761459c613f17565b505092915050565b5f6001600160401b03808416806145bd576145bd614264565b92169190910492915050565b5f82516145da818460208701614094565b9190910192915050565b5f602082840312156145f4575f80fd5b813560ff81168114613d7f575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -468,25 +468,25 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegationAmount) } -// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeEndDelegation", validationID) +// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeEndDelegation", validationID, includeUptimeProof, messageIndex) } -// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeEndDelegation(validationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID) +// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeEndDelegation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeEndDelegation(validationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID) +// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeEndDelegation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } // InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 11e72af7a..3c3d99979 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516144e43803806144e483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143978061014d5f395ff3fe6080604052600436106100f9575f3560e01c80636a7e3d8311610092578063b771b3bc11610062578063b771b3bc1461029e578063bee0a03f146102d0578063c599e24f146102ef578063d61bed7414610302578063f40797d714610321575f80fd5b80636a7e3d831461022257806376f7862114610241578063927e7e7514610260578063a3a65e481461027f575f80fd5b80632e2194d8116100cd5780632e2194d81461017b578063467ef06f146101b757806362065856146101d657806366435abf14610203575f80fd5b8062e41792146100fd5780630322ed981461011e5780630915204e1461013d5780630b77f6931461015c575b5f80fd5b348015610108575f80fd5b5061011c6101173660046139a7565b610334565b005b348015610129575f80fd5b5061011c6101383660046139bd565b610440565b348015610148575f80fd5b5061011c610157366004613a00565b6105a1565b348015610167575f80fd5b5061011c610176366004613a35565b610772565b348015610186575f80fd5b5061019a6101953660046139bd565b61083a565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101c2575f80fd5b5061011c6101d1366004613a58565b610850565b3480156101e1575f80fd5b506101f56101f0366004613a8e565b610bac565b6040519081526020016101ae565b34801561020e575f80fd5b5061019a61021d3660046139bd565b610bc5565b34801561022d575f80fd5b5061011c61023c366004613a35565b610bd9565b34801561024c575f80fd5b5061011c61025b366004613ab4565b610c5b565b34801561026b575f80fd5b5061011c61027a3660046139bd565b610f74565b34801561028a575f80fd5b5061011c610299366004613a58565b611386565b3480156102a9575f80fd5b506102b86005600160991b0181565b6040516001600160a01b0390911681526020016101ae565b3480156102db575f80fd5b5061011c6102ea3660046139bd565b61153a565b61011c6102fd3660046139bd565b611609565b34801561030d575f80fd5b5061011c61031c366004613a00565b611617565b6101f561032f366004613b81565b611813565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f286611835565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061432b83398151915292919061048890613c13565b90501180156104ba575060035f83815260078301602052604090205460ff1660058111156104b8576104b8613c45565b145b6105235760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613c59565b6020604051808303815f875af1158015610578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059c9190613ce3565b505050565b5f8051602061430b8339815191525f6105b984611846565b90505f806105ca8360400151611a27565b50915091506105d98286611c62565b5f82815260058501602090815260408083206001600160a01b038916845290915281206106059161395d565b5f61060f83611d75565b9050816001600160401b031681606001516001600160401b031610156106475760405162461bcd60e51b815260040161051a90613cfa565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156106995760405162461bcd60e51b815260040161051a90613d3c565b60035f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff1660048111156106dd576106dd613c45565b146106fa5760405162461bcd60e51b815260040161051a90613d85565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320600101805460ff60401b191668040000000000000000179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b61077c8282611e70565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061430b833981519152916005600160991b019163ee5b48eb916107f491600401613c59565b6020604051808303815f875af1158015610810573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108349190613ce3565b50505050565b5f61084a64e8d4a5100083613dfd565b92915050565b5f8051602061432b8339815191525f61086883611846565b90505f806108798360400151611f8e565b9150915080156108de5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161051a565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561090f5761090f613c45565b600581111561092057610920613c45565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561099957610999613c45565b14806109b757506001825160058111156109b5576109b5613c45565b145b610a165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161051a565b600382516005811115610a2b57610a2b613c45565b03610a5257505f8381526006860160205260408120600491610a4d919061395d565b610a56565b5060055b6020808301515f90815260088801909152604081205581816005811115610a7f57610a7f613c45565b90816005811115610a9257610a92613c45565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ac657610ac6613c45565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610b7957610b79613c45565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61084a6001600160401b03831664e8d4a51000613e10565b5f610bcf82611d75565b6080015192915050565b610be38282611c62565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061430b833981519152916005600160991b019163ee5b48eb916107f491600401613c59565b8115610f6b575f5f8051602061430b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610cbc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ce39190810190613e54565b9150915080610d465760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161051a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dad9190613ce3565b825114610e115760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161051a565b60208201516001600160a01b031615610e875760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161051a565b5f80610e96846040015161212f565b91509150818814610f035760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161051a565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61059c83612307565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602090815260408083203384528252808320815160c08101835281546001600160401b038082168352600160401b808304821696840196909652600160801b8204811694830194909452600160c01b900483166060820152600182015492831660808201525f8051602061430b8339815191529493909260a0840191900460ff16600481111561102b5761102b613c45565b600481111561103c5761103c613c45565b905250905060028160a00151600481111561105957611059613c45565b146110b55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161051a565b5f6110bf84612659565b9050600360a08301819052506001600160401b0342811660408085019190915290821660808401525f8581526003850160205290812083916110fe3390565b6001600160a01b0316815260208082019290925260409081015f2083518154938501519285015160608601516001600160401b039283166001600160801b031990961695909517600160401b9483168502176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b94821694909402939093178155608084015160018201805467ffffffffffffffff19811692909516918217815560a086015192949293909268ffffffffffffffffff1916909117908360048111156111ce576111ce613c45565b02179055509050505f6111e085611d75565b9050825f01516001600160401b031681608001516001600160401b0316116112565760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161051a565b8251608082018051611269908390613f26565b6001600160401b031690525061127f85826126d4565b5f61128f868484608001516127c3565b5f878152600587016020908152604080832033845290915290209091506112b68282613f98565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112e3908590600401614053565b6020604051808303815f875af11580156112ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113239190613ce3565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b5f8051602061432b8339815191525f61139e83611846565b90505f806113af8360400151611f8e565b91509150806114115760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161051a565b5f8281526005850160205260408120805461142b90613c13565b905011801561145d575060015f83815260078601602052604090205460ff16600581111561145b5761145b613c45565b145b6114795760405162461bcd60e51b815260040161051a90614085565b5f82815260058501602052604081206114919161395d565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061432b83398151915292919061158290613c13565b90501180156115b4575060015f83815260078301602052604090205460ff1660058111156115b2576115b2613c45565b145b6115d05760405162461bcd60e51b815260040161051a90614085565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613c59565b6116148133346129e0565b50565b5f8051602061430b8339815191525f61162f84611846565b90505f806116408360400151611a27565b509150915061164f8286611e70565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061167b9161395d565b5f61168583611d75565b9050816001600160401b031681606001516001600160401b031610156116bd5760405162461bcd60e51b815260040161051a90613cfa565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020546001600160401b03808416600160c01b9092041611156117135760405162461bcd60e51b815260040161051a90613d3c565b60015f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff16600481111561175757611757613c45565b146117745760405162461bcd60e51b815260040161051a90613d85565b5f83815260038601602090815260408083206001600160a01b038a168085529083529281902060018101805460ff60401b191668020000000000000000179055805467ffffffffffffffff60401b1916600160401b426001600160401b03818116929092029290921790925591519182528516929186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101611375565b5f8061181e34612d59565b905061182c85828686612e03565b95945050505050565b61183d613237565b61161481613282565b60408051606080820183525f8083526020830181905292820152905f8051602061432b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118bb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118e29190810190613e54565b91509150806119495760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161051a565b82548251146119ac5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161051a565b60208201516001600160a01b031615611a1f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161051a565b509392505050565b5f805f8351603614611a4b5760405162461bcd60e51b815260040161051a906140cc565b5f805b6002811015611a9a57611a62816001614115565b611a6d906008613e10565b61ffff16868281518110611a8357611a83614128565b016020015160f81c901b9190911790600101611a4e565b5061ffff811615611abd5760405162461bcd60e51b815260040161051a9061413c565b5f805b6004811015611b1857611ad4816003614115565b611adf906008613e10565b63ffffffff1687611af183600261417f565b81518110611b0157611b01614128565b016020015160f81c901b9190911790600101611ac0565b5063ffffffff8116600314611b3f5760405162461bcd60e51b815260040161051a90614192565b5f805b6020811015611b9457611b5681601f614115565b611b61906008613e10565b88611b6d83600661417f565b81518110611b7d57611b7d614128565b016020015160f81c901b9190911790600101611b42565b505f805b6008811015611bf357611bac816007614115565b611bb7906008613e10565b6001600160401b031689611bcc83602661417f565b81518110611bdc57611bdc614128565b016020015160f81c901b9190911790600101611b98565b505f805b6008811015611c5257611c0b816007614115565b611c16906008613e10565b6001600160401b03168a611c2b83602e61417f565b81518110611c3b57611c3b614128565b016020015160f81c901b9190911790600101611bf7565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f8051602061430b833981519152929190611cbe90613c13565b9050118015611d0e575060035f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff166004811115611d0c57611d0c613c45565b145b61059c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161051a565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061436b83398151915290528390208351918201909352825491925f8051602061432b83398151915292829060ff166005811115611df557611df5613c45565b6005811115611e0657611e06613c45565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f8051602061430b833981519152929190611ecc90613c13565b9050118015611f1c575060015f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff166004811115611f1a57611f1a613c45565b145b61059c5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161051a565b5f808251602714611fb15760405162461bcd60e51b815260040161051a906140cc565b5f805b600281101561200057611fc8816001614115565b611fd3906008613e10565b61ffff16858281518110611fe957611fe9614128565b016020015160f81c901b9190911790600101611fb4565b5061ffff8116156120235760405162461bcd60e51b815260040161051a9061413c565b5f805b600481101561207e5761203a816003614115565b612045906008613e10565b63ffffffff168661205783600261417f565b8151811061206757612067614128565b016020015160f81c901b9190911790600101612026565b5063ffffffff81166002146120a55760405162461bcd60e51b815260040161051a90614192565b5f805b60208110156120fa576120bc81601f614115565b6120c7906008613e10565b876120d383600661417f565b815181106120e3576120e3614128565b016020015160f81c901b91909117906001016120a8565b505f8660268151811061210f5761210f614128565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146121525760405162461bcd60e51b815260040161051a906140cc565b5f805b60028110156121a157612169816001614115565b612174906008613e10565b61ffff1685828151811061218a5761218a614128565b016020015160f81c901b9190911790600101612155565b5061ffff8116156121c45760405162461bcd60e51b815260040161051a9061413c565b5f805b600481101561221f576121db816003614115565b6121e6906008613e10565b63ffffffff16866121f883600261417f565b8151811061220857612208614128565b016020015160f81c901b91909117906001016121c7565b5063ffffffff81166004146122465760405162461bcd60e51b815260040161051a90614192565b5f805b602081101561229b5761225d81601f614115565b612268906008613e10565b8761227483600661417f565b8151811061228457612284614128565b016020015160f81c901b9190911790600101612249565b505f805b60088110156122fa576122b3816007614115565b6122be906008613e10565b6001600160401b0316886122d383602661417f565b815181106122e3576122e3614128565b016020015160f81c901b919091179060010161229f565b5090969095509350505050565b5f8181525f8051602061436b8339815191526020526040808220815160e0810190925280545f8051602061432b83398151915293929190829060ff16600581111561235457612354613c45565b600581111561236557612365613c45565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123df576123df613c45565b146123fc5760405162461bcd60e51b815260040161051a906141d9565b60408101516001600160a01b0316336001600160a01b0316146124765760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161051a565b61248381608001516132c5565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124c7576124c7613c45565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61257b8461257581612659565b5f6127c3565b5f85815260068501602052604090209091506125978282613f98565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125c4908590600401614053565b6020604051808303815f875af11580156125e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126049190613ce3565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f8051602061436b8339815191526020526040812060020180545f8051602061432b83398151915291600160a01b9091046001600160401b031690819060146126a58361421f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061436b83398151915260205260409020815181545f8051602061432b8339815191529284929091829060ff1916600183600581111561271e5761271e613c45565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561283c576127fc816001614115565b612807906008613e10565b5081515f9083908390811061281e5761281e614128565b60200101906001600160f81b03191690815f1a9053506001016127e8565b505f5b600481101561289f57612853816003614115565b61285e906008613e10565b6001901c60f81b8261287183600261417f565b8151811061288157612881614128565b60200101906001600160f81b03191690815f1a90535060010161283f565b505f5b6020811015612901576128b681601f614115565b6128c1906008613e10565b86901c60f81b826128d383600661417f565b815181106128e3576128e3614128565b60200101906001600160f81b03191690815f1a9053506001016128a2565b505f5b600881101561296c57612918816007614115565b612923906008613e10565b6001600160401b038616901c60f81b8261293e83602661417f565b8151811061294e5761294e614128565b60200101906001600160f81b03191690815f1a905350600101612904565b505f5b60088110156129d757612983816007614115565b61298e906008613e10565b6001600160401b038516901c60f81b826129a983602e61417f565b815181106129b9576129b9614128565b60200101906001600160f81b03191690815f1a90535060010161296f565b50949350505050565b6129e8613466565b5f6129f28261083a565b90505f8051602061430b8339815191525f612a0c86611d75565b9050600281516005811115612a2357612a23613c45565b14612a405760405162461bcd60e51b815260040161051a906141d9565b5f86815260038301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612ad15760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161051a565b612ada836132c5565b8281608001818151612aec9190614244565b6001600160401b0316905250612b0286826126d4565b5f612b0c87612659565b90505f612b1e888385608001516127c3565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612b4e8282613f98565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b7b908590600401614053565b6020604051808303815f875af1158015612b97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bbb9190613ce3565b6040805160c0810182526001600160401b03808a1682525f6020830181905292820183905286166060820152608081019190915290915060a08101600190525f8a815260038701602090815260408083206001600160a01b038d16845282529182902083518154928501519385015160608601516001600160401b039283166001600160801b031990951694909417600160401b9583168602176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b93821693909302929092178155608084015160018201805467ffffffffffffffff19811692909416918217815560a086015192949293909268ffffffffffffffffff1990911690911790836004811115612cd557612cd5613c45565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a450505050505061059c60015f8051602061434b83398151915255565b5f5f8051602061430b8339815191528282612d738261083a565b83549091506001600160401b03821610801590612d9d57508260010154816001600160401b031611155b612dfb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161051a565b949350505050565b5f612e0c613466565b5f8051602061432b833981519152426001600160401b038516118015612e4657506001600160401b038416612e44426202a30061417f565b115b612ea85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161051a565b85612eff5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161051a565b5f86815260088201602052604090205415612f6d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161051a565b8251603014612fd45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161051a565b612fdd856132c5565b5f806130246040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134b0565b5f828152600586016020526040902091935091506130428282613f98565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061306f908590600401614053565b6020604051808303815f875af115801561308b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130af9190613ce3565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561312857613128613c45565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556131d183612659565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612dfb60015f8051602061434b83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661328057604051631afcd79f60e31b815260040160405180910390fd5b565b61328a613237565b61329381613855565b611614606082013560808301356132b060c0850160a08601613a8e565b6132c060e0860160c08701614264565b613876565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061432b8339815191529060ff165f03613303575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061334b9083614115565b10613367576001600160401b0384166040830152808252613386565b83826040018181516133799190614244565b6001600160401b03169052505b5f82602001518360400151606461339d919061427f565b6133a791906142aa565b600285015490915060ff90811690821611156134225760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161051a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061434b83398151915280546001190161349757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061434b83398151915255565b5f606082608001515160301461351a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161051a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561359157613551816001614115565b61355c906008613e10565b5081515f9083908390811061357357613573614128565b60200101906001600160f81b03191690815f1a90535060010161353d565b505f5b60048110156135ef576135a8816003614115565b6135b3906008613e10565b505f826135c183600261417f565b815181106135d1576135d1614128565b60200101906001600160f81b03191690815f1a905350600101613594565b505f5b602081101561364c578451816020811061360e5761360e614128565b1a60f81b8261361e83600661417f565b8151811061362e5761362e614128565b60200101906001600160f81b03191690815f1a9053506001016135f2565b505f5b60208110156136ac578460200151816020811061366e5761366e614128565b1a60f81b8261367e83602661417f565b8151811061368e5761368e614128565b60200101906001600160f81b03191690815f1a90535060010161364f565b505f5b6008811015613720576136c3816007614115565b6136ce906008613e10565b60ff1685604001516001600160401b0316901c60f81b828260466136f2919061417f565b8151811061370257613702614128565b60200101906001600160f81b03191690815f1a9053506001016136af565b505f5b603081101561378b578460800151818151811061374257613742614128565b01602001516001600160f81b0319168261375d83604e61417f565b8151811061376d5761376d614128565b60200101906001600160f81b03191690815f1a905350600101613723565b505f5b60088110156137fd576137a2816007614115565b6137ad906008613e10565b60608601516001600160401b0390811691161c60f81b826137cf83607e61417f565b815181106137df576137df614128565b60200101906001600160f81b03191690815f1a90535060010161378e565b5060028160405161380e91906142cf565b602060405180830381855afa158015613829573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061384c9190613ce3565b94909350915050565b61385d613237565b6138656138d1565b61386d6138e1565b611614816138e9565b61387e613237565b5f5f8051602061430b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6138d9613237565b613280613955565b613280613237565b6138f1613237565b80355f8051602061432b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561393b60608301604084016142ea565b600291909101805460ff191660ff90921691909117905550565b61349d613237565b50805461396990613c13565b5f825580601f10613978575050565b601f0160209004905f5260205f209081019061161491905b808211156139a3575f8155600101613990565b5090565b5f60e082840312156139b7575f80fd5b50919050565b5f602082840312156139cd575f80fd5b5035919050565b803563ffffffff811681146139e7575f80fd5b919050565b6001600160a01b0381168114611614575f80fd5b5f8060408385031215613a11575f80fd5b613a1a836139d4565b91506020830135613a2a816139ec565b809150509250929050565b5f8060408385031215613a46575f80fd5b823591506020830135613a2a816139ec565b5f60208284031215613a68575f80fd5b613a71826139d4565b9392505050565b80356001600160401b03811681146139e7575f80fd5b5f60208284031215613a9e575f80fd5b613a7182613a78565b8015158114611614575f80fd5b5f805f60608486031215613ac6575f80fd5b833592506020840135613ad881613aa7565b9150613ae6604085016139d4565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b2557613b25613aef565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b5357613b53613aef565b604052919050565b5f6001600160401b03821115613b7357613b73613aef565b50601f01601f191660200190565b5f805f60608486031215613b93575f80fd5b83359250613ba360208501613a78565b915060408401356001600160401b03811115613bbd575f80fd5b8401601f81018613613bcd575f80fd5b8035613be0613bdb82613b5b565b613b2b565b818152876020838501011115613bf4575f80fd5b816020840160208301375f602083830101528093505050509250925092565b600181811c90821680613c2757607f821691505b6020821081036139b757634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613c6b81613c13565b806020870152604060018084165f8114613c8c5760018114613ca857613cd5565b60ff19851660408a0152604084151560051b8a01019550613cd5565b895f5260205f205f5b85811015613ccc5781548b8201860152908301908801613cb1565b8a016040019650505b509398975050505050505050565b5f60208284031215613cf3575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613e0b57613e0b613dd5565b500490565b808202811582820484141761084a5761084a613de9565b5f5b83811015613e41578181015183820152602001613e29565b50505f910152565b80516139e781613aa7565b5f8060408385031215613e65575f80fd5b82516001600160401b0380821115613e7b575f80fd5b9084019060608287031215613e8e575f80fd5b613e96613b03565b82518152602080840151613ea9816139ec565b82820152604084015183811115613ebe575f80fd5b80850194505087601f850112613ed2575f80fd5b83519250613ee2613bdb84613b5b565b8381528882858701011115613ef5575f80fd5b613f0484838301848801613e27565b80604084015250819550613f19818801613e49565b9450505050509250929050565b6001600160401b03828116828216039080821115613f4657613f46613de9565b5092915050565b601f82111561059c57805f5260205f20601f840160051c81016020851015613f725750805b601f840160051c820191505b81811015613f91575f8155600101613f7e565b5050505050565b81516001600160401b03811115613fb157613fb1613aef565b613fc581613fbf8454613c13565b84613f4d565b602080601f831160018114613ff8575f8415613fe15750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b8281101561402657888601518255948401946001909101908401614007565b508582101561404357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f8251806020840152614071816040850160208701613e27565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561084a5761084a613de9565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561084a5761084a613de9565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361423a5761423a613de9565b6001019392505050565b6001600160401b03818116838216019080821115613f4657613f46613de9565b5f60208284031215614274575f80fd5b8135613a71816139ec565b6001600160401b038181168382160280821691908281146142a2576142a2613de9565b505092915050565b5f6001600160401b03808416806142c3576142c3613dd5565b92169190910492915050565b5f82516142e0818460208701613e27565b9190910192915050565b5f602082840312156142fa575f80fd5b813560ff81168114613a71575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"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\":\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161450b38038061450b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143be8061014d5f395ff3fe6080604052600436106100f9575f3560e01c806366435abf11610092578063b771b3bc11610062578063b771b3bc1461029e578063bee0a03f146102d0578063c599e24f146102ef578063d61bed7414610302578063f40797d714610321575f80fd5b806366435abf146102225780636a7e3d831461024157806376f7862114610260578063a3a65e481461027f575f80fd5b80630b77f693116100cd5780630b77f6931461017b5780632e2194d81461019a578063467ef06f146101d657806362065856146101f5575f80fd5b8062e41792146100fd5780630118acc41461011e5780630322ed981461013d5780630915204e1461015c575b5f80fd5b348015610108575f80fd5b5061011c6101173660046139ce565b610334565b005b348015610129575f80fd5b5061011c610138366004613a09565b610440565b348015610148575f80fd5b5061011c610157366004613a44565b61086f565b348015610167575f80fd5b5061011c610176366004613a6f565b6109cb565b348015610186575f80fd5b5061011c610195366004613aa4565b610b97565b3480156101a5575f80fd5b506101b96101b4366004613a44565b610c5f565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101e1575f80fd5b5061011c6101f0366004613ac7565b610c75565b348015610200575f80fd5b5061021461020f366004613afd565b610fd1565b6040519081526020016101cd565b34801561022d575f80fd5b506101b961023c366004613a44565b610fea565b34801561024c575f80fd5b5061011c61025b366004613aa4565b610ffe565b34801561026b575f80fd5b5061011c61027a366004613a09565b611080565b34801561028a575f80fd5b5061011c610299366004613ac7565b61109b565b3480156102a9575f80fd5b506102b86005600160991b0181565b6040516001600160a01b0390911681526020016101cd565b3480156102db575f80fd5b5061011c6102ea366004613a44565b61124f565b61011c6102fd366004613a44565b61131e565b34801561030d575f80fd5b5061011c61031c366004613a6f565b61132c565b61021461032f366004613ba8565b611532565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f286611554565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8215610454576104518483611565565b90505b5f8481527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602090815260408083203384528252808320815160e08101835281546001600160401b038082168352600160401b808304821696840196909652600160801b808304821695840195909552600160c01b90910481166060830152600183015480821660808401529485041660a08201525f805160206143328339815191529493909260c08401910460ff16600481111561051557610515613c3a565b600481111561052657610526613c3a565b905250905060028160c00151600481111561054357610543613c3a565b146105a45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b60648201526084015b60405180910390fd5b5f6105ae87611875565b9050600360c08301819052506001600160401b03428116604080850191909152828216608085015290851660a08401525f8881526003850160205290812083916105f53390565b6001600160a01b0316815260208082019290925260409081015f2083518154938501519285015160608601516001600160401b039283166001600160801b031996871617600160401b9584168602176001600160801b0316600160801b92841683026001600160c01b031617600160c01b91841691909102178355608086015160018401805460a089015192851697169690961792169093021780845560c08501519193919260ff60801b19909116908360048111156106b7576106b7613c3a565b02179055509050505f6106c9886118f0565b9050825f01516001600160401b031681608001516001600160401b03161161073f5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161059b565b8251608082018051610752908390613c62565b6001600160401b031690525061076888826119eb565b5f61077889848460800151611ada565b5f8a81526005870160209081526040808320338452909152902090915061079f8282613d06565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906107cc908590600401613de3565b6020604051808303815f875af11580156107e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080c9190613e15565b6080840151604080516001600160401b0392831681529187166020830152428282015251919250339183918d917fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde9181900360600190a450505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206143528339815191529291906108b790613c89565b90501180156108e9575060035f83815260078301602052604090205460ff1660058111156108e7576108e7613c3a565b145b61094d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161059b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109869190600401613e2c565b6020604051808303815f875af11580156109a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c69190613e15565b505050565b5f805160206143328339815191525f6109e384611cf7565b90505f806109f48360400151611ed8565b5091509150610a038286612113565b5f82815260058501602090815260408083206001600160a01b03891684529091528120610a2f91613984565b5f610a39836118f0565b9050816001600160401b031681606001516001600160401b03161015610a715760405162461bcd60e51b815260040161059b90613eb6565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b0380841691161115610ac35760405162461bcd60e51b815260040161059b90613ef8565b60035f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160801b900460ff166004811115610b0757610b07613c3a565b14610b245760405162461bcd60e51b815260040161059b90613f41565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320600101805460ff60801b1916600160821b179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b610ba18282612226565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614332833981519152916005600160991b019163ee5b48eb91610c1991600401613e2c565b6020604051808303815f875af1158015610c35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c599190613e15565b50505050565b5f610c6f64e8d4a5100083613fa5565b92915050565b5f805160206143528339815191525f610c8d83611cf7565b90505f80610c9e8360400151612344565b915091508015610d035760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161059b565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610d3457610d34613c3a565b6005811115610d4557610d45613c3a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610dbe57610dbe613c3a565b1480610ddc5750600182516005811115610dda57610dda613c3a565b145b610e3b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161059b565b600382516005811115610e5057610e50613c3a565b03610e7757505f8381526006860160205260408120600491610e729190613984565b610e7b565b5060055b6020808301515f90815260088801909152604081205581816005811115610ea457610ea4613c3a565b90816005811115610eb757610eb7613c3a565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610eeb57610eeb613c3a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610f9e57610f9e613c3a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f610c6f6001600160401b03831664e8d4a51000613fb8565b5f610ff4826118f0565b6080015192915050565b6110088282612113565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614332833981519152916005600160991b019163ee5b48eb91610c1991600401613e2c565b8115611092576110908382611565565b505b6109c6836124e5565b5f805160206143528339815191525f6110b383611cf7565b90505f806110c48360400151612344565b91509150806111265760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161059b565b5f8281526005850160205260408120805461114090613c89565b9050118015611172575060015f83815260078601602052604090205460ff16600581111561117057611170613c3a565b145b61118e5760405162461bcd60e51b815260040161059b90613fcf565b5f82815260058501602052604081206111a691613984565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061435283398151915292919061129790613c89565b90501180156112c9575060015f83815260078301602052604090205460ff1660058111156112c7576112c7613c3a565b145b6112e55760405162461bcd60e51b815260040161059b90613fcf565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109869190600401613e2c565b611329813334612837565b50565b5f805160206143328339815191525f61134484611cf7565b90505f806113558360400151611ed8565b50915091506113648286612226565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061139091613984565b5f61139a836118f0565b9050816001600160401b031681606001516001600160401b031610156113d25760405162461bcd60e51b815260040161059b90613eb6565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020546001600160401b03808416600160c01b9092041611156114285760405162461bcd60e51b815260040161059b90613ef8565b60015f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160801b900460ff16600481111561146c5761146c613c3a565b146114895760405162461bcd60e51b815260040161059b90613f41565b5f83815260038601602090815260408083206001600160a01b038a168085529083529281902060018101805460ff60801b1916600160811b179055805467ffffffffffffffff60401b1916600160401b426001600160401b03818116929092029290921790925582519081529151908616939287927fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6929081900390910190a450505050505050565b5f8061153d34612ba8565b905061154b85828686612c52565b95945050505050565b61155c613086565b611329816130d1565b5f805f805160206143328339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e89190810190614021565b915091508061164b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161059b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561168e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b29190613e15565b8251146117165760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161059b565b60208201516001600160a01b03161561178c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161059b565b5f8061179b8460400151613114565b915091508188146118085760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161059b565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a2979650505050505050565b5f8181525f805160206143928339815191526020526040812060020180545f8051602061435283398151915291600160a01b9091046001600160401b031690819060146118c1836140f3565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061439283398151915290528390208351918201909352825491925f8051602061435283398151915292829060ff16600581111561197057611970613c3a565b600581111561198157611981613c3a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061439283398151915260205260409020815181545f805160206143528339815191529284929091829060ff19166001836005811115611a3557611a35613c3a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611b5357611b13816001614118565b611b1e906008613fb8565b5081515f90839083908110611b3557611b3561412b565b60200101906001600160f81b03191690815f1a905350600101611aff565b505f5b6004811015611bb657611b6a816003614118565b611b75906008613fb8565b6001901c60f81b82611b8883600261413f565b81518110611b9857611b9861412b565b60200101906001600160f81b03191690815f1a905350600101611b56565b505f5b6020811015611c1857611bcd81601f614118565b611bd8906008613fb8565b86901c60f81b82611bea83600661413f565b81518110611bfa57611bfa61412b565b60200101906001600160f81b03191690815f1a905350600101611bb9565b505f5b6008811015611c8357611c2f816007614118565b611c3a906008613fb8565b6001600160401b038616901c60f81b82611c5583602661413f565b81518110611c6557611c6561412b565b60200101906001600160f81b03191690815f1a905350600101611c1b565b505f5b6008811015611cee57611c9a816007614118565b611ca5906008613fb8565b6001600160401b038516901c60f81b82611cc083602e61413f565b81518110611cd057611cd061412b565b60200101906001600160f81b03191690815f1a905350600101611c86565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f805160206143528339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d6c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d939190810190614021565b9150915080611dfa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161059b565b8254825114611e5d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161059b565b60208201516001600160a01b031615611ed05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161059b565b509392505050565b5f805f8351603614611efc5760405162461bcd60e51b815260040161059b90614152565b5f805b6002811015611f4b57611f13816001614118565b611f1e906008613fb8565b61ffff16868281518110611f3457611f3461412b565b016020015160f81c901b9190911790600101611eff565b5061ffff811615611f6e5760405162461bcd60e51b815260040161059b9061419b565b5f805b6004811015611fc957611f85816003614118565b611f90906008613fb8565b63ffffffff1687611fa283600261413f565b81518110611fb257611fb261412b565b016020015160f81c901b9190911790600101611f71565b5063ffffffff8116600314611ff05760405162461bcd60e51b815260040161059b906141de565b5f805b60208110156120455761200781601f614118565b612012906008613fb8565b8861201e83600661413f565b8151811061202e5761202e61412b565b016020015160f81c901b9190911790600101611ff3565b505f805b60088110156120a45761205d816007614118565b612068906008613fb8565b6001600160401b03168961207d83602661413f565b8151811061208d5761208d61412b565b016020015160f81c901b9190911790600101612049565b505f805b6008811015612103576120bc816007614118565b6120c7906008613fb8565b6001600160401b03168a6120dc83602e61413f565b815181106120ec576120ec61412b565b016020015160f81c901b91909117906001016120a8565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f8051602061433283398151915292919061216f90613c89565b90501180156121bf575060035f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160801b900460ff1660048111156121bd576121bd613c3a565b145b6109c65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161059b565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f8051602061433283398151915292919061228290613c89565b90501180156122d2575060015f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160801b900460ff1660048111156122d0576122d0613c3a565b145b6109c65760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161059b565b5f8082516027146123675760405162461bcd60e51b815260040161059b90614152565b5f805b60028110156123b65761237e816001614118565b612389906008613fb8565b61ffff1685828151811061239f5761239f61412b565b016020015160f81c901b919091179060010161236a565b5061ffff8116156123d95760405162461bcd60e51b815260040161059b9061419b565b5f805b6004811015612434576123f0816003614118565b6123fb906008613fb8565b63ffffffff168661240d83600261413f565b8151811061241d5761241d61412b565b016020015160f81c901b91909117906001016123dc565b5063ffffffff811660021461245b5760405162461bcd60e51b815260040161059b906141de565b5f805b60208110156124b05761247281601f614118565b61247d906008613fb8565b8761248983600661413f565b815181106124995761249961412b565b016020015160f81c901b919091179060010161245e565b505f866026815181106124c5576124c561412b565b016020015191976001600160f81b03199092161515965090945050505050565b5f8181525f805160206143928339815191526020526040808220815160e0810190925280545f8051602061435283398151915293929190829060ff16600581111561253257612532613c3a565b600581111561254357612543613c3a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156125bd576125bd613c3a565b146125da5760405162461bcd60e51b815260040161059b90614225565b60408101516001600160a01b0316336001600160a01b0316146126545760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161059b565b61266181608001516132ec565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156126a5576126a5613c3a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6127598461275381611875565b5f611ada565b5f85815260068501602052604090209091506127758282613d06565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127a2908590600401613de3565b6020604051808303815f875af11580156127be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127e29190613e15565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61283f61348d565b5f61284982610c5f565b90505f805160206143328339815191525f612863866118f0565b905060028151600581111561287a5761287a613c3a565b146128975760405162461bcd60e51b815260040161059b90614225565b5f86815260038301602090815260408083206001600160a01b03891684529091529020546001600160401b0316156129285760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161059b565b612931836132ec565b8281608001818151612943919061426b565b6001600160401b031690525061295986826119eb565b5f61296387611875565b90505f61297588838560800151611ada565b5f89815260048601602090815260408083206001600160a01b038c16845290915290209091506129a58282613d06565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129d2908590600401613de3565b6020604051808303815f875af11580156129ee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a129190613e15565b6040805160e0810182526001600160401b03808a1682525f60208301819052928201839052861660608201526080810182905260a081019190915290915060c08101600190525f8a815260038701602090815260408083206001600160a01b038d16845282529182902083518154928501519385015160608601516001600160401b039283166001600160801b031995861617600160401b9684168702176001600160801b0316600160801b92841683026001600160c01b031617600160c01b91841691909102178355608086015160018401805460a089015192851696169590951792169094021780835560c0850151919391929160ff60801b1990911690836004811115612b2457612b24613c3a565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a45050505050506109c660015f8051602061437283398151915255565b5f5f805160206143328339815191528282612bc282610c5f565b83549091506001600160401b03821610801590612bec57508260010154816001600160401b031611155b612c4a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161059b565b949350505050565b5f612c5b61348d565b5f80516020614352833981519152426001600160401b038516118015612c9557506001600160401b038416612c93426202a30061413f565b115b612cf75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161059b565b85612d4e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161059b565b5f86815260088201602052604090205415612dbc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161059b565b8251603014612e235760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161059b565b612e2c856132ec565b5f80612e736040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134d7565b5f82815260058601602052604090209193509150612e918282613d06565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ebe908590600401613de3565b6020604051808303815f875af1158015612eda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612efe9190613e15565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612f7757612f77613c3a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561302083611875565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c4a60015f8051602061437283398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130cf57604051631afcd79f60e31b815260040160405180910390fd5b565b6130d9613086565b6130e28161387c565b611329606082013560808301356130ff60c0850160a08601613afd565b61310f60e0860160c0870161428b565b61389d565b5f808251602e146131375760405162461bcd60e51b815260040161059b90614152565b5f805b60028110156131865761314e816001614118565b613159906008613fb8565b61ffff1685828151811061316f5761316f61412b565b016020015160f81c901b919091179060010161313a565b5061ffff8116156131a95760405162461bcd60e51b815260040161059b9061419b565b5f805b6004811015613204576131c0816003614118565b6131cb906008613fb8565b63ffffffff16866131dd83600261413f565b815181106131ed576131ed61412b565b016020015160f81c901b91909117906001016131ac565b5063ffffffff811660041461322b5760405162461bcd60e51b815260040161059b906141de565b5f805b60208110156132805761324281601f614118565b61324d906008613fb8565b8761325983600661413f565b815181106132695761326961412b565b016020015160f81c901b919091179060010161322e565b505f805b60088110156132df57613298816007614118565b6132a3906008613fb8565b6001600160401b0316886132b883602661413f565b815181106132c8576132c861412b565b016020015160f81c901b9190911790600101613284565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206143528339815191529060ff165f0361332a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133729083614118565b1061338e576001600160401b03841660408301528082526133ad565b83826040018181516133a0919061426b565b6001600160401b03169052505b5f8260200151836040015160646133c491906142a6565b6133ce91906142d1565b600285015490915060ff90811690821611156134495760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161059b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206143728339815191528054600119016134be57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061437283398151915255565b5f60608260800151516030146135415760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161059b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135b857613578816001614118565b613583906008613fb8565b5081515f9083908390811061359a5761359a61412b565b60200101906001600160f81b03191690815f1a905350600101613564565b505f5b6004811015613616576135cf816003614118565b6135da906008613fb8565b505f826135e883600261413f565b815181106135f8576135f861412b565b60200101906001600160f81b03191690815f1a9053506001016135bb565b505f5b602081101561367357845181602081106136355761363561412b565b1a60f81b8261364583600661413f565b815181106136555761365561412b565b60200101906001600160f81b03191690815f1a905350600101613619565b505f5b60208110156136d357846020015181602081106136955761369561412b565b1a60f81b826136a583602661413f565b815181106136b5576136b561412b565b60200101906001600160f81b03191690815f1a905350600101613676565b505f5b6008811015613747576136ea816007614118565b6136f5906008613fb8565b60ff1685604001516001600160401b0316901c60f81b82826046613719919061413f565b815181106137295761372961412b565b60200101906001600160f81b03191690815f1a9053506001016136d6565b505f5b60308110156137b257846080015181815181106137695761376961412b565b01602001516001600160f81b0319168261378483604e61413f565b815181106137945761379461412b565b60200101906001600160f81b03191690815f1a90535060010161374a565b505f5b6008811015613824576137c9816007614118565b6137d4906008613fb8565b60608601516001600160401b0390811691161c60f81b826137f683607e61413f565b815181106138065761380661412b565b60200101906001600160f81b03191690815f1a9053506001016137b5565b5060028160405161383591906142f6565b602060405180830381855afa158015613850573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138739190613e15565b94909350915050565b613884613086565b61388c6138f8565b613894613908565b61132981613910565b6138a5613086565b5f5f80516020614332833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613900613086565b6130cf61397c565b6130cf613086565b613918613086565b80355f8051602061435283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139626060830160408401614311565b600291909101805460ff191660ff90921691909117905550565b6134c4613086565b50805461399090613c89565b5f825580601f1061399f575050565b601f0160209004905f5260205f209081019061132991905b808211156139ca575f81556001016139b7565b5090565b5f60e082840312156139de575f80fd5b50919050565b8015158114611329575f80fd5b803563ffffffff81168114613a04575f80fd5b919050565b5f805f60608486031215613a1b575f80fd5b833592506020840135613a2d816139e4565b9150613a3b604085016139f1565b90509250925092565b5f60208284031215613a54575f80fd5b5035919050565b6001600160a01b0381168114611329575f80fd5b5f8060408385031215613a80575f80fd5b613a89836139f1565b91506020830135613a9981613a5b565b809150509250929050565b5f8060408385031215613ab5575f80fd5b823591506020830135613a9981613a5b565b5f60208284031215613ad7575f80fd5b613ae0826139f1565b9392505050565b80356001600160401b0381168114613a04575f80fd5b5f60208284031215613b0d575f80fd5b613ae082613ae7565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b4c57613b4c613b16565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b7a57613b7a613b16565b604052919050565b5f6001600160401b03821115613b9a57613b9a613b16565b50601f01601f191660200190565b5f805f60608486031215613bba575f80fd5b83359250613bca60208501613ae7565b915060408401356001600160401b03811115613be4575f80fd5b8401601f81018613613bf4575f80fd5b8035613c07613c0282613b82565b613b52565b818152876020838501011115613c1b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613c8257613c82613c4e565b5092915050565b600181811c90821680613c9d57607f821691505b6020821081036139de57634e487b7160e01b5f52602260045260245ffd5b601f8211156109c657805f5260205f20601f840160051c81016020851015613ce05750805b601f840160051c820191505b81811015613cff575f8155600101613cec565b5050505050565b81516001600160401b03811115613d1f57613d1f613b16565b613d3381613d2d8454613c89565b84613cbb565b602080601f831160018114613d66575f8415613d4f5750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b82811015613d9457888601518255948401946001909101908401613d75565b5085821015613db157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f5b83811015613ddb578181015183820152602001613dc3565b50505f910152565b602081525f8251806020840152613e01816040850160208701613dc1565b601f01601f19169190910160400192915050565b5f60208284031215613e25575f80fd5b5051919050565b5f60208083525f8454613e3e81613c89565b806020870152604060018084165f8114613e5f5760018114613e7b57613ea8565b60ff19851660408a0152604084151560051b8a01019550613ea8565b895f5260205f205f5b85811015613e9f5781548b8201860152908301908801613e84565b8a016040019650505b509398975050505050505050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82613fb357613fb3613f91565b500490565b8082028115828204841417610c6f57610c6f613c4e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613a04816139e4565b5f8060408385031215614032575f80fd5b82516001600160401b0380821115614048575f80fd5b908401906060828703121561405b575f80fd5b614063613b2a565b8251815260208084015161407681613a5b565b8282015260408401518381111561408b575f80fd5b80850194505087601f85011261409f575f80fd5b835192506140af613c0284613b82565b83815288828587010111156140c2575f80fd5b6140d184838301848801613dc1565b806040840152508195506140e6818801614016565b9450505050509250929050565b5f6001600160401b0380831681810361410e5761410e613c4e565b6001019392505050565b81810381811115610c6f57610c6f613c4e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610c6f57610c6f613c4e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b6001600160401b03818116838216019080821115613c8257613c82613c4e565b5f6020828403121561429b575f80fd5b8135613ae081613a5b565b6001600160401b038181168382160280821691908281146142c9576142c9613c4e565b505092915050565b5f6001600160401b03808416806142ea576142ea613f91565b92169190910492915050565b5f8251614307818460208701613dc1565b9190910192915050565b5f60208284031215614321575f80fd5b813560ff81168114613ae0575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -468,25 +468,25 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In return _NativeTokenStakingManager.Contract.InitializeDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID) } -// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeEndDelegation", validationID) +// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeEndDelegation", validationID, includeUptimeProof, messageIndex) } -// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeEndDelegation(validationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID) +// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeEndDelegation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x927e7e75. +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeEndDelegation(validationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID) +// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeEndDelegation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } // InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index e1ead5021..ed405eda4 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -79,11 +79,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 minimumStakeDuration, IRewardCalculator rewardCalculator ) internal onlyInitializing { - PoSValidatorManagerStorage storage s = _getPoSValidatorManagerStorage(); - s._minimumStakeAmount = minimumStakeAmount; - s._maximumStakeAmount = maximumStakeAmount; - s._minimumStakeDuration = minimumStakeDuration; - s._rewardCalculator = rewardCalculator; + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + $._minimumStakeAmount = minimumStakeAmount; + $._maximumStakeAmount = maximumStakeAmount; + $._minimumStakeDuration = minimumStakeDuration; + $._rewardCalculator = rewardCalculator; } function initializeEndValidation( @@ -92,34 +92,38 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint32 messageIndex ) external { if (includeUptimeProof) { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - (WarpMessage memory warpMessage, bool valid) = - WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "PoSValidatorManager: invalid warp message"); - - require( - warpMessage.sourceChainID == WARP_MESSENGER.getBlockchainID(), - "PoSValidatorManager: invalid source chain ID" - ); - require( - warpMessage.originSenderAddress == address(0), - "PoSValidatorManager: invalid origin sender address" - ); - - (bytes32 uptimeValidationID, uint64 uptime) = - ValidatorMessages.unpackValidationUptimeMessage(warpMessage.payload); - require( - validationID == uptimeValidationID, - "PoSValidatorManager: invalid uptime validation ID" - ); - - $._validatorUptimes[validationID] = uptime; - emit ValidationUptimeUpdated(validationID, uptime); + _updateUptime(validationID, messageIndex); } - _initializeEndValidation(validationID); } + function _updateUptime(bytes32 validationID, uint32 messageIndex) internal returns (uint64) { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + (WarpMessage memory warpMessage, bool valid) = + WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); + require(valid, "PoSValidatorManager: invalid warp message"); + + require( + warpMessage.sourceChainID == WARP_MESSENGER.getBlockchainID(), + "PoSValidatorManager: invalid source chain ID" + ); + require( + warpMessage.originSenderAddress == address(0), + "PoSValidatorManager: invalid origin sender address" + ); + + (bytes32 uptimeValidationID, uint64 uptime) = + ValidatorMessages.unpackValidationUptimeMessage(warpMessage.payload); + require( + validationID == uptimeValidationID, "PoSValidatorManager: invalid uptime validation ID" + ); + + $._validatorUptimes[validationID] = uptime; + emit ValidationUptimeUpdated(validationID, uptime); + + return uptime; + } + function _processStake(uint256 stakeAmount) internal virtual returns (uint64) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Lock the stake in the contract. @@ -185,6 +189,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager endedAt: 0, startingNonce: nonce, endingNonce: 0, + validatorUptime: 0, status: DelegatorStatus.PendingAdded }); @@ -241,7 +246,16 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager }); } - function initializeEndDelegation(bytes32 validationID) external { + function initializeEndDelegation( + bytes32 validationID, + bool includeUptimeProof, + uint32 messageIndex + ) external { + uint64 uptime; + if (includeUptimeProof) { + uptime = _updateUptime(validationID, messageIndex); + } + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Ensure the delegator is active @@ -253,6 +267,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager delegator.status = DelegatorStatus.PendingRemoved; delegator.endedAt = uint64(block.timestamp); delegator.endingNonce = nonce; + delegator.validatorUptime = uptime; $._delegatorStakes[validationID][_msgSender()] = delegator; diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 21346ec20..5935b28d8 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -30,6 +30,7 @@ struct Delegator { uint64 endedAt; uint64 startingNonce; uint64 endingNonce; + uint64 validatorUptime; DelegatorStatus status; } @@ -139,8 +140,16 @@ interface IPoSValidatorManager is IValidatorManager { * @notice Begins the process of removing a delegator from a validation period. The delegator must have been previously * registered with the given validationID. * @param validationID The ID of the validation period being removed. + * @param includeUptimeProof Whether or not an uptime proof is provided for the validation period. + * If no uptime proof is provided, the validation uptime for the delegation period will be assumed to be 0. + * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the + * uptime proof. */ - function initializeEndDelegation(bytes32 validationID) external; + function initializeEndDelegation( + bytes32 validationID, + bool includeUptimeProof, + uint32 messageIndex + ) external; /** * @notice Resubmits a delegator end message to be sent to the P-Chain. diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index af2cb762a..f67db332f 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -683,7 +683,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endTime: endDelegationTimestamp }); vm.prank(delegator); - posValidatorManager.initializeEndDelegation(validationID); + posValidatorManager.initializeEndDelegation(validationID, false, 0); return validationID; } From feef2473b45db1a959572d9492be4c0c995b65ea Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 3 Sep 2024 16:03:11 -0500 Subject: [PATCH 183/545] update go util --- tests/utils/staking.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index c73a87405..9dfe967c1 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -551,6 +551,8 @@ func InitializeEndERC20Delegation( tx, err := stakingManager.InitializeEndDelegation( opts, validationID, + false, + 0, ) Expect(err).Should(BeNil()) return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) @@ -632,6 +634,8 @@ func InitializeEndNativeDelegation( tx, err := stakingManager.InitializeEndDelegation( opts, validationID, + false, + 0, ) Expect(err).Should(BeNil()) return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) From 038fb1ff6219a5abfcd8b366403070251f4ea846 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 4 Sep 2024 10:12:48 -0400 Subject: [PATCH 184/545] Update tests --- .../staking/tests/ERC20TokenStakingManagerTests.t.sol | 2 +- .../staking/tests/NativeTokenStakingManagerTests.t.sol | 2 +- contracts/staking/tests/PoSValidatorManagerTests.t.sol | 7 +++---- contracts/staking/tests/ValidatorManagerTests.t.sol | 5 ++--- 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 60e868c90..51d202e73 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -35,7 +35,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { }), minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, - churnTrackerStartTime: 0, + churnTrackerStartTime: DEFAULT_CHURN_TRACKER_START_TIME, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE, diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index a7baccb6f..875e4a500 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -29,7 +29,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - churnTrackerStartTime: 0, + churnTrackerStartTime: DEFAULT_CHURN_TRACKER_START_TIME, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE, rewardCalculator: IRewardCalculator(address(0)) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index c077639b7..a8b6cc203 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -22,14 +22,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testRegisterManyValidators() public { for (uint64 i = 1; i <= 10; i++) { - bytes32 nodeID = sha256(new bytes(i)); _setUpCompleteValidatorRegistration({ - nodeID: nodeID, + nodeID: sha256(new bytes(i)), subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, - registrationExpiry: uint64(DEFAULT_EXPIRY * i), + registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: uint64(DEFAULT_REGISTRATION_TIMESTAMP * i) + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); } } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 183cb73f2..46e1c6e26 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -23,8 +23,6 @@ abstract contract ValidatorManagerTest is Test { bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes32 public constant DEFAULT_NODE_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); - bytes32 public constant DEFAULT_NODE_ID2 = - bytes32(hex"2234567812345678123456781234567812345678123456781234567812345678"); bytes public constant DEFAULT_BLS_PUBLIC_KEY = bytes( hex"123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); @@ -36,8 +34,9 @@ abstract contract ValidatorManagerTest is Test { uint256 public constant DEFAULT_MINIMUM_STAKE = 20; uint256 public constant DEFAULT_MAXIMUM_STAKE = 1e10; uint64 public constant DEFAULT_CHURN_PERIOD = 1 hours; + uint64 public constant DEFAULT_CHURN_TRACKER_START_TIME = 1 days; uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; - uint8 public constant DEFAULT_MAXIMUM_CHURN_PERCENTAGE = 0; + uint8 public constant DEFAULT_MAXIMUM_CHURN_PERCENTAGE = 20; uint64 public constant DEFAULT_EXPIRY = 1000; uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = 2000; From e1ec18e59c776fcb8ac08d21cce21dba5f6ff504 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 4 Sep 2024 13:53:31 -0400 Subject: [PATCH 185/545] update staking manager comment and e2e tests --- contracts/staking/ERC20TokenStakingManager.sol | 6 ++++++ contracts/staking/NativeTokenStakingManager.sol | 5 +++++ tests/flows/staking/erc20_token_staking.go | 4 +--- tests/utils/staking.go | 7 ++++--- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 1ae69097b..c6796736f 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -54,6 +54,12 @@ contract ERC20TokenStakingManager is } } + /** + * @notice Initialize the ERC20 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 + * @param token The ERC20 token to be staked + */ function initialize( PoSValidatorManagerSettings calldata settings, IERC20 token diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 2088bde95..b98e6dfed 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -26,6 +26,11 @@ contract NativeTokenStakingManager is } } + /** + * @notice Initialize the ERC20 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 + */ // solhint-disable ordering function initialize(PoSValidatorManagerSettings calldata settings) external reinitializer(2) { __NativeTokenStakingManager_init(settings); diff --git a/tests/flows/staking/erc20_token_staking.go b/tests/flows/staking/erc20_token_staking.go index 65ef1a7ab..51cd27e15 100644 --- a/tests/flows/staking/erc20_token_staking.go +++ b/tests/flows/staking/erc20_token_staking.go @@ -53,14 +53,13 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // // Register a validator // - var validationID ids.ID // To be used in the delisting step stakeAmount := uint64(1e18) weight, err := stakingManager.ValueToWeight( &bind.CallOpts{}, big.NewInt(int64(stakeAmount)), ) Expect(err).Should(BeNil()) - utils.InitializeAndCompleteERC20ValidatorRegistration( + validationID := utils.InitializeAndCompleteERC20ValidatorRegistration( network, signatureAggregator, fundedKey, @@ -68,7 +67,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { pChainInfo, stakingManager, stakingManagerAddress, - validationID, weight, erc20, stakeAmount, diff --git a/tests/utils/staking.go b/tests/utils/staking.go index e10a91a56..255a1f964 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -442,16 +442,15 @@ func InitializeAndCompleteERC20ValidatorRegistration( pChainInfo interfaces.SubnetTestInfo, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, stakingManagerAddress common.Address, - validationID ids.ID, weight uint64, erc20 *exampleerc20.ExampleERC20, stakeAmount uint64, -) { +) ids.ID { // Initiate validator registration nodeID := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} var receipt *types.Receipt - receipt, validationID = InitializeERC20ValidatorRegistration( + receipt, validationID := InitializeERC20ValidatorRegistration( fundedKey, subnetInfo, stakeAmount, @@ -499,6 +498,8 @@ func InitializeAndCompleteERC20ValidatorRegistration( ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + + return validationID } func InitializeAndCompletePoAValidatorRegistration( From 31f4c83980e90d518d687eaf204307e401667c29 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 4 Sep 2024 13:19:34 -0500 Subject: [PATCH 186/545] remove uptime from contract state --- contracts/staking/PoSValidatorManager.sol | 19 +++++------ contracts/staking/ValidatorManager.sol | 4 +-- .../interfaces/IPoSValidatorManager.sol | 8 ----- .../tests/PoSValidatorManagerTests.t.sol | 34 ------------------- 4 files changed, 10 insertions(+), 55 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index ed405eda4..011306e45 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -36,8 +36,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager /// @notice Maps the validationID to a mapping of delegator address to pending end delegator messages. mapping(bytes32 validationID => mapping(address delegator => bytes)) _pendingEndDelegatorMessages; - /// @notice Maps the validationID to the uptime of the validator. - mapping(bytes32 validationID => uint64) _validatorUptimes; } // solhint-enable private-vars-leading-underscore @@ -92,12 +90,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint32 messageIndex ) external { if (includeUptimeProof) { - _updateUptime(validationID, messageIndex); + _getUptime(validationID, messageIndex); } + // TODO: Calculate the reward for the validator, but do not unlock it + _initializeEndValidation(validationID); } - function _updateUptime(bytes32 validationID, uint32 messageIndex) internal returns (uint64) { + function _getUptime(bytes32 validationID, uint32 messageIndex) internal returns (uint64) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); @@ -118,9 +118,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validationID == uptimeValidationID, "PoSValidatorManager: invalid uptime validation ID" ); - $._validatorUptimes[validationID] = uptime; - emit ValidationUptimeUpdated(validationID, uptime); - return uptime; } @@ -189,7 +186,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager endedAt: 0, startingNonce: nonce, endingNonce: 0, - validatorUptime: 0, status: DelegatorStatus.PendingAdded }); @@ -253,9 +249,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ) external { uint64 uptime; if (includeUptimeProof) { - uptime = _updateUptime(validationID, messageIndex); + uptime = _getUptime(validationID, messageIndex); } + // TODO: Calculate the delegator's reward, but do not unlock it + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Ensure the delegator is active @@ -267,7 +265,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager delegator.status = DelegatorStatus.PendingRemoved; delegator.endedAt = uint64(block.timestamp); delegator.endingNonce = nonce; - delegator.validatorUptime = uptime; $._delegatorStakes[validationID][_msgSender()] = delegator; @@ -325,6 +322,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Update the delegator status $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Completed; + // TODO: Unlock the delegator's stake and their reward + emit DelegationEnded(validationID, delegator, nonce); } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 12977e7c0..ae43bf15e 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -298,9 +298,7 @@ abstract contract ValidatorManager is validator.status = endStatus; $._validationPeriods[validationID] = validator; - // Unlock the stake. - - // Calculate the reward for the validator. + // TODO: Unlock the stake. // Emit event. emit ValidationPeriodEnded(validationID, validator.status); diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 5935b28d8..b804592ea 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -30,18 +30,10 @@ struct Delegator { uint64 endedAt; uint64 startingNonce; uint64 endingNonce; - uint64 validatorUptime; DelegatorStatus status; } interface IPoSValidatorManager is IValidatorManager { - /** - * @notice Event emitted when a validator's uptime is updated. - * @param validationID The ID of the validation period - * @param uptime The new uptime of the validator - */ - event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); - /** * @notice Event emitted when a delegator registration is initiated * @param validationID The ID of the validation period diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index f67db332f..c98c054fa 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -24,8 +24,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { PoSValidatorManager public posValidatorManager; - event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); - event DelegatorAdded( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, @@ -55,38 +53,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce ); - function testInitializeEndValidationWithUptimeProof() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); - - _mockGetBlockchainID(); - vm.mockCall( - WARP_PRECOMPILE_ADDRESS, - abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), - abi.encode( - WarpMessage({ - sourceChainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, - originSenderAddress: address(0), - payload: ValidatorMessages.packValidationUptimeMessage(validationID, DEFAULT_UPTIME) - }), - true - ) - ); - vm.expectCall( - WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) - ); - - vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit ValidationUptimeUpdated(validationID, DEFAULT_UPTIME); - posValidatorManager.initializeEndValidation(validationID, true, 0); - } - function testInvalidUptimeWarpMessage() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, From 59b83c1c0d76d033b28199f178c085dc1a78d446 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 4 Sep 2024 13:25:05 -0500 Subject: [PATCH 187/545] restrict to view --- contracts/staking/PoSValidatorManager.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 011306e45..1a7af8826 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -97,8 +97,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _initializeEndValidation(validationID); } - function _getUptime(bytes32 validationID, uint32 messageIndex) internal returns (uint64) { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + function _getUptime(bytes32 validationID, uint32 messageIndex) internal view returns (uint64) { (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); require(valid, "PoSValidatorManager: invalid warp message"); From 3f20e790b92dd04bfd3a91b0ceb245d26123ddac Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 4 Sep 2024 13:26:18 -0500 Subject: [PATCH 188/545] bindings --- .../ERC20TokenStakingManager.go | 149 +----------------- .../NativeTokenStakingManager.go | 149 +----------------- 2 files changed, 4 insertions(+), 294 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6eb6a1441..877e30698 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"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\":\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516147de3803806147de83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146918061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef1461021b578063a3a65e481461022e578063b771b3bc14610241578063bee0a03f14610267578063d61bed741461027a575f80fd5b806366435abf146101cf5780636a7e3d83146101e257806376f78621146101f5578063872fda6414610208575f80fd5b806327f39ca8116100d957806327f39ca8146101585780632e2194d81461016b578063467ef06f1461019b57806362065856146101ae575f80fd5b80630118acc41461010a5780630322ed981461011f5780630915204e146101325780630b77f69314610145575b5f80fd5b61011d610118366004613c76565b61028d565b005b61011d61012d366004613cb1565b6106bc565b61011d610140366004613cdc565b610818565b61011d610153366004613d11565b6109e4565b61011d610166366004613d34565b610aac565b61017e610179366004613cb1565b610bba565b6040516001600160401b0390911681526020015b60405180910390f35b61011d6101a9366004613d66565b610bd0565b6101c16101bc366004613d9c565b610f2c565b604051908152602001610192565b61017e6101dd366004613cb1565b610f45565b61011d6101f0366004613d11565b610f59565b61011d610203366004613c76565b610fdb565b6101c1610216366004613e47565b610ff6565b61011d610229366004613ee3565b61101b565b61011d61023c366004613d66565b61102a565b61024f6005600160991b0181565b6040516001600160a01b039091168152602001610192565b61011d610275366004613cb1565b6111de565b61011d610288366004613cdc565b6112ad565b5f82156102a15761029e84836114b3565b90505b5f8481527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602090815260408083203384528252808320815160e08101835281546001600160401b038082168352600160401b808304821696840196909652600160801b808304821695840195909552600160c01b90910481166060830152600183015480821660808401529485041660a08201525f805160206146058339815191529493909260c08401910460ff16600481111561036257610362613f03565b600481111561037357610373613f03565b905250905060028160c00151600481111561039057610390613f03565b146103f15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b60648201526084015b60405180910390fd5b5f6103fb876117c3565b9050600360c08301819052506001600160401b03428116604080850191909152828216608085015290851660a08401525f8881526003850160205290812083916104423390565b6001600160a01b0316815260208082019290925260409081015f2083518154938501519285015160608601516001600160401b039283166001600160801b031996871617600160401b9584168602176001600160801b0316600160801b92841683026001600160c01b031617600160c01b91841691909102178355608086015160018401805460a089015192851697169690961792169093021780845560c08501519193919260ff60801b199091169083600481111561050457610504613f03565b02179055509050505f6105168861183e565b9050825f01516001600160401b031681608001516001600160401b03161161058c5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016103e8565b825160808201805161059f908390613f2b565b6001600160401b03169052506105b58882611939565b5f6105c589848460800151611a28565b5f8a8152600587016020908152604080832033845290915290209091506105ec8282613fd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106199085906004016140b6565b6020604051808303815f875af1158015610635573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065991906140e8565b6080840151604080516001600160401b0392831681529187166020830152428282015251919250339183918d917fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde9181900360600190a450505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061462583398151915292919061070490613f52565b9050118015610736575060035f83815260078301602052604090205460ff16600581111561073457610734613f03565b145b61079a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016103e8565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107d391906004016140ff565b6020604051808303815f875af11580156107ef573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061081391906140e8565b505050565b5f805160206146058339815191525f61083084611c45565b90505f806108418360400151611e26565b50915091506108508286612061565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061087c91613c07565b5f6108868361183e565b9050816001600160401b031681606001516001600160401b031610156108be5760405162461bcd60e51b81526004016103e890614189565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156109105760405162461bcd60e51b81526004016103e8906141cb565b60035f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160801b900460ff16600481111561095457610954613f03565b146109715760405162461bcd60e51b81526004016103e890614214565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320600101805460ff60801b1916600160821b179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6109ee8282612174565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614605833981519152916005600160991b019163ee5b48eb91610a66916004016140ff565b6020604051808303815f875af1158015610a82573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa691906140e8565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610af05750825b90505f826001600160401b03166001148015610b0b5750303b155b905081158015610b19575080155b15610b375760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b6157845460ff60401b1916600160401b1785555b610b6b8787612292565b8315610bb157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f610bca64e8d4a5100083614278565b92915050565b5f805160206146258339815191525f610be883611c45565b90505f80610bf983604001516122ac565b915091508015610c5e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103e8565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610c8f57610c8f613f03565b6005811115610ca057610ca0613f03565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610d1957610d19613f03565b1480610d375750600182516005811115610d3557610d35613f03565b145b610d965760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103e8565b600382516005811115610dab57610dab613f03565b03610dd257505f8381526006860160205260408120600491610dcd9190613c07565b610dd6565b5060055b6020808301515f90815260088801909152604081205581816005811115610dff57610dff613f03565b90816005811115610e1257610e12613f03565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610e4657610e46613f03565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610ef957610ef9613f03565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f610bca6001600160401b03831664e8d4a5100061428b565b5f610f4f8261183e565b6080015192915050565b610f638282612061565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614605833981519152916005600160991b019163ee5b48eb91610a66916004016140ff565b8115610fed57610feb83826114b3565b505b6108138361244d565b5f806110018661279f565b905061100f8582868661284c565b9150505b949350505050565b611026823383612c80565b5050565b5f805160206146258339815191525f61104283611c45565b90505f8061105383604001516122ac565b91509150806110b55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103e8565b5f828152600585016020526040812080546110cf90613f52565b9050118015611101575060015f83815260078601602052604090205460ff1660058111156110ff576110ff613f03565b145b61111d5760405162461bcd60e51b81526004016103e8906142a2565b5f828152600585016020526040812061113591613c07565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061462583398151915292919061122690613f52565b9050118015611258575060015f83815260078301602052604090205460ff16600581111561125657611256613f03565b145b6112745760405162461bcd60e51b81526004016103e8906142a2565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107d391906004016140ff565b5f805160206146058339815191525f6112c584611c45565b90505f806112d68360400151611e26565b50915091506112e58286612174565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061131191613c07565b5f61131b8361183e565b9050816001600160401b031681606001516001600160401b031610156113535760405162461bcd60e51b81526004016103e890614189565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020546001600160401b03808416600160c01b9092041611156113a95760405162461bcd60e51b81526004016103e8906141cb565b60015f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160801b900460ff1660048111156113ed576113ed613f03565b1461140a5760405162461bcd60e51b81526004016103e890614214565b5f83815260038601602090815260408083206001600160a01b038a168085529083529281902060018101805460ff60801b1916600160811b179055805467ffffffffffffffff60401b1916600160401b426001600160401b03818116929092029290921790925582519081529151908616939287927fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6929081900390910190a450505050505050565b5f805f805160206146058339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561150f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261153691908101906142f4565b91509150806115995760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103e8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160091906140e8565b8251146116645760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103e8565b60208201516001600160a01b0316156116da5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103e8565b5f806116e98460400151612ff4565b915091508188146117565760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103e8565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a2979650505050505050565b5f8181525f805160206146658339815191526020526040812060020180545f8051602061462583398151915291600160a01b9091046001600160401b0316908190601461180f836143c6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061466583398151915290528390208351918201909352825491925f8051602061462583398151915292829060ff1660058111156118be576118be613f03565b60058111156118cf576118cf613f03565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061466583398151915260205260409020815181545f805160206146258339815191529284929091829060ff1916600183600581111561198357611983613f03565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611aa157611a618160016143eb565b611a6c90600861428b565b5081515f90839083908110611a8357611a836143fe565b60200101906001600160f81b03191690815f1a905350600101611a4d565b505f5b6004811015611b0457611ab88160036143eb565b611ac390600861428b565b6001901c60f81b82611ad6836002614412565b81518110611ae657611ae66143fe565b60200101906001600160f81b03191690815f1a905350600101611aa4565b505f5b6020811015611b6657611b1b81601f6143eb565b611b2690600861428b565b86901c60f81b82611b38836006614412565b81518110611b4857611b486143fe565b60200101906001600160f81b03191690815f1a905350600101611b07565b505f5b6008811015611bd157611b7d8160076143eb565b611b8890600861428b565b6001600160401b038616901c60f81b82611ba3836026614412565b81518110611bb357611bb36143fe565b60200101906001600160f81b03191690815f1a905350600101611b69565b505f5b6008811015611c3c57611be88160076143eb565b611bf390600861428b565b6001600160401b038516901c60f81b82611c0e83602e614412565b81518110611c1e57611c1e6143fe565b60200101906001600160f81b03191690815f1a905350600101611bd4565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f805160206146258339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611cba573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ce191908101906142f4565b9150915080611d485760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103e8565b8254825114611dab5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103e8565b60208201516001600160a01b031615611e1e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103e8565b509392505050565b5f805f8351603614611e4a5760405162461bcd60e51b81526004016103e890614425565b5f805b6002811015611e9957611e618160016143eb565b611e6c90600861428b565b61ffff16868281518110611e8257611e826143fe565b016020015160f81c901b9190911790600101611e4d565b5061ffff811615611ebc5760405162461bcd60e51b81526004016103e89061446e565b5f805b6004811015611f1757611ed38160036143eb565b611ede90600861428b565b63ffffffff1687611ef0836002614412565b81518110611f0057611f006143fe565b016020015160f81c901b9190911790600101611ebf565b5063ffffffff8116600314611f3e5760405162461bcd60e51b81526004016103e8906144b1565b5f805b6020811015611f9357611f5581601f6143eb565b611f6090600861428b565b88611f6c836006614412565b81518110611f7c57611f7c6143fe565b016020015160f81c901b9190911790600101611f41565b505f805b6008811015611ff257611fab8160076143eb565b611fb690600861428b565b6001600160401b031689611fcb836026614412565b81518110611fdb57611fdb6143fe565b016020015160f81c901b9190911790600101611f97565b505f805b60088110156120515761200a8160076143eb565b61201590600861428b565b6001600160401b03168a61202a83602e614412565b8151811061203a5761203a6143fe565b016020015160f81c901b9190911790600101611ff6565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206146058339815191529291906120bd90613f52565b905011801561210d575060035f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160801b900460ff16600481111561210b5761210b613f03565b145b6108135760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016103e8565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206146058339815191529291906121d090613f52565b9050118015612220575060015f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160801b900460ff16600481111561221e5761221e613f03565b145b6108135760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016103e8565b61229a6131cc565b6122a382613217565b6110268161325d565b5f8082516027146122cf5760405162461bcd60e51b81526004016103e890614425565b5f805b600281101561231e576122e68160016143eb565b6122f190600861428b565b61ffff16858281518110612307576123076143fe565b016020015160f81c901b91909117906001016122d2565b5061ffff8116156123415760405162461bcd60e51b81526004016103e89061446e565b5f805b600481101561239c576123588160036143eb565b61236390600861428b565b63ffffffff1686612375836002614412565b81518110612385576123856143fe565b016020015160f81c901b9190911790600101612344565b5063ffffffff81166002146123c35760405162461bcd60e51b81526004016103e8906144b1565b5f805b6020811015612418576123da81601f6143eb565b6123e590600861428b565b876123f1836006614412565b81518110612401576124016143fe565b016020015160f81c901b91909117906001016123c6565b505f8660268151811061242d5761242d6143fe565b016020015191976001600160f81b03199092161515965090945050505050565b5f8181525f805160206146658339815191526020526040808220815160e0810190925280545f8051602061462583398151915293929190829060ff16600581111561249a5761249a613f03565b60058111156124ab576124ab613f03565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561252557612525613f03565b146125425760405162461bcd60e51b81526004016103e8906144f8565b60408101516001600160a01b0316336001600160a01b0316146125bc5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103e8565b6125c98160800151613311565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561260d5761260d613f03565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6126c1846126bb816117c3565b5f611a28565b5f85815260068501602052604090209091506126dd8282613fd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061270a9085906004016140b6565b6020604051808303815f875af1158015612726573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061274a91906140e8565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f80516020614605833981519152816127b8846134b2565b90505f6127c482610bba565b83549091506001600160401b038216108015906127ee57508260010154816001600160401b031611155b6110135760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103e8565b5f6128556134e8565b5f80516020614625833981519152426001600160401b03851611801561288f57506001600160401b03841661288d426202a300614412565b115b6128f15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103e8565b856129485760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103e8565b5f868152600882016020526040902054156129b65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103e8565b8251603014612a1d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103e8565b612a2685613311565b5f80612a6d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061351f565b5f82815260058601602052604090209193509150612a8b8282613fd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ab89085906004016140b6565b6020604051808303815f875af1158015612ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af891906140e8565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612b7157612b71613f03565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612c1a836117c3565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061101360015f8051602061464583398151915255565b612c886134e8565b5f612c95610179836134b2565b90505f805160206146058339815191525f612caf8661183e565b9050600281516005811115612cc657612cc6613f03565b14612ce35760405162461bcd60e51b81526004016103e8906144f8565b5f86815260038301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612d745760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016103e8565b612d7d83613311565b8281608001818151612d8f919061453e565b6001600160401b0316905250612da58682611939565b5f612daf876117c3565b90505f612dc188838560800151611a28565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612df18282613fd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e1e9085906004016140b6565b6020604051808303815f875af1158015612e3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e5e91906140e8565b6040805160e0810182526001600160401b03808a1682525f60208301819052928201839052861660608201526080810182905260a081019190915290915060c08101600190525f8a815260038701602090815260408083206001600160a01b038d16845282529182902083518154928501519385015160608601516001600160401b039283166001600160801b031995861617600160401b9684168702176001600160801b0316600160801b92841683026001600160c01b031617600160c01b91841691909102178355608086015160018401805460a089015192851696169590951792169094021780835560c0850151919391929160ff60801b1990911690836004811115612f7057612f70613f03565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a450505050505061081360015f8051602061464583398151915255565b5f808251602e146130175760405162461bcd60e51b81526004016103e890614425565b5f805b60028110156130665761302e8160016143eb565b61303990600861428b565b61ffff1685828151811061304f5761304f6143fe565b016020015160f81c901b919091179060010161301a565b5061ffff8116156130895760405162461bcd60e51b81526004016103e89061446e565b5f805b60048110156130e4576130a08160036143eb565b6130ab90600861428b565b63ffffffff16866130bd836002614412565b815181106130cd576130cd6143fe565b016020015160f81c901b919091179060010161308c565b5063ffffffff811660041461310b5760405162461bcd60e51b81526004016103e8906144b1565b5f805b60208110156131605761312281601f6143eb565b61312d90600861428b565b87613139836006614412565b81518110613149576131496143fe565b016020015160f81c901b919091179060010161310e565b505f805b60088110156131bf576131788160076143eb565b61318390600861428b565b6001600160401b031688613198836026614412565b815181106131a8576131a86143fe565b016020015160f81c901b9190911790600101613164565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661321557604051631afcd79f60e31b815260040160405180910390fd5b565b61321f6131cc565b613228816138d7565b61325a6060820135608083013561324560c0850160a08601613d9c565b61325560e0860160c0870161455e565b6138f8565b50565b6132656131cc565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132f15760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103e8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146258339815191529060ff165f0361334f575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061339790836143eb565b106133b3576001600160401b03841660408301528082526133d2565b83826040018181516133c5919061453e565b6001600160401b03169052505b5f8260200151836040015160646133e99190614579565b6133f391906145a4565b600285015490915060ff908116908216111561346e5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103e8565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610bca827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613953565b5f8051602061464583398151915280546001190161351957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135895760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103e8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613600576135c08160016143eb565b6135cb90600861428b565b5081515f908390839081106135e2576135e26143fe565b60200101906001600160f81b03191690815f1a9053506001016135ac565b505f5b600481101561365e576136178160036143eb565b61362290600861428b565b505f82613630836002614412565b81518110613640576136406143fe565b60200101906001600160f81b03191690815f1a905350600101613603565b505f5b60208110156136bb578451816020811061367d5761367d6143fe565b1a60f81b8261368d836006614412565b8151811061369d5761369d6143fe565b60200101906001600160f81b03191690815f1a905350600101613661565b505f5b602081101561371b57846020015181602081106136dd576136dd6143fe565b1a60f81b826136ed836026614412565b815181106136fd576136fd6143fe565b60200101906001600160f81b03191690815f1a9053506001016136be565b505f5b600881101561378f576137328160076143eb565b61373d90600861428b565b60ff1685604001516001600160401b0316901c60f81b828260466137619190614412565b81518110613771576137716143fe565b60200101906001600160f81b03191690815f1a90535060010161371e565b505f5b60308110156137fa57846080015181815181106137b1576137b16143fe565b01602001516001600160f81b031916826137cc83604e614412565b815181106137dc576137dc6143fe565b60200101906001600160f81b03191690815f1a905350600101613792565b505f5b600881101561386c576138118160076143eb565b61381c90600861428b565b60608601516001600160401b0390811691161c60f81b8261383e83607e614412565b8151811061384e5761384e6143fe565b60200101906001600160f81b03191690815f1a9053506001016137fd565b5060028160405161387d91906145c9565b602060405180830381855afa158015613898573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138bb91906140e8565b94909350915050565b60015f8051602061464583398151915255565b6138df6131cc565b6138e7613ab5565b6138ef613ac5565b61325a81613acd565b6139006131cc565b5f5f80516020614605833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139bd91906140e8565b90506139d46001600160a01b038516333086613b39565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a3c91906140e8565b9050818111613aa25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103e8565b613aac82826143eb565b95945050505050565b613abd6131cc565b613215613b93565b6132156131cc565b613ad56131cc565b80355f8051602061462583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b1f60608301604084016145e4565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610aa6908590613b9b565b6138c46131cc565b5f8060205f8451602086015f885af180613bba576040513d5f823e3d81fd5b50505f513d91508115613bd1578060011415613bde565b6001600160a01b0384163b155b15610aa657604051635274afe760e01b81526001600160a01b03851660048201526024016103e8565b508054613c1390613f52565b5f825580601f10613c22575050565b601f0160209004905f5260205f209081019061325a91905b80821115613c4d575f8155600101613c3a565b5090565b801515811461325a575f80fd5b803563ffffffff81168114613c71575f80fd5b919050565b5f805f60608486031215613c88575f80fd5b833592506020840135613c9a81613c51565b9150613ca860408501613c5e565b90509250925092565b5f60208284031215613cc1575f80fd5b5035919050565b6001600160a01b038116811461325a575f80fd5b5f8060408385031215613ced575f80fd5b613cf683613c5e565b91506020830135613d0681613cc8565b809150509250929050565b5f8060408385031215613d22575f80fd5b823591506020830135613d0681613cc8565b5f80828403610100811215613d47575f80fd5b60e0811215613d54575f80fd5b5082915060e0830135613d0681613cc8565b5f60208284031215613d76575f80fd5b613d7f82613c5e565b9392505050565b80356001600160401b0381168114613c71575f80fd5b5f60208284031215613dac575f80fd5b613d7f82613d86565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613deb57613deb613db5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e1957613e19613db5565b604052919050565b5f6001600160401b03821115613e3957613e39613db5565b50601f01601f191660200190565b5f805f8060808587031215613e5a575f80fd5b8435935060208501359250613e7160408601613d86565b915060608501356001600160401b03811115613e8b575f80fd5b8501601f81018713613e9b575f80fd5b8035613eae613ea982613e21565b613df1565b818152886020838501011115613ec2575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ef4575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f4b57613f4b613f17565b5092915050565b600181811c90821680613f6657607f821691505b602082108103613f8457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561081357805f5260205f20601f840160051c81016020851015613faf5750805b601f840160051c820191505b81811015613fce575f8155600101613fbb565b5050505050565b81516001600160401b03811115613fee57613fee613db5565b61400281613ffc8454613f52565b84613f8a565b602080601f831160018114614035575f841561401e5750858301515b5f19600386901b1c1916600185901b17855561408c565b5f85815260208120601f198616915b8281101561406357888601518255948401946001909101908401614044565b508582101561408057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140ae578181015183820152602001614096565b50505f910152565b602081525f82518060208401526140d4816040850160208701614094565b601f01601f19169190910160400192915050565b5f602082840312156140f8575f80fd5b5051919050565b5f60208083525f845461411181613f52565b806020870152604060018084165f8114614132576001811461414e5761417b565b60ff19851660408a0152604084151560051b8a0101955061417b565b895f5260205f205f5b858110156141725781548b8201860152908301908801614157565b8a016040019650505b509398975050505050505050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261428657614286614264565b500490565b8082028115828204841417610bca57610bca613f17565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613c7181613c51565b5f8060408385031215614305575f80fd5b82516001600160401b038082111561431b575f80fd5b908401906060828703121561432e575f80fd5b614336613dc9565b8251815260208084015161434981613cc8565b8282015260408401518381111561435e575f80fd5b80850194505087601f850112614372575f80fd5b83519250614382613ea984613e21565b8381528882858701011115614395575f80fd5b6143a484838301848801614094565b806040840152508195506143b98188016142e9565b9450505050509250929050565b5f6001600160401b038083168181036143e1576143e1613f17565b6001019392505050565b81810381811115610bca57610bca613f17565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610bca57610bca613f17565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b6001600160401b03818116838216019080821115613f4b57613f4b613f17565b5f6020828403121561456e575f80fd5b8135613d7f81613cc8565b6001600160401b0381811683821602808216919082811461459c5761459c613f17565b505092915050565b5f6001600160401b03808416806145bd576145bd614264565b92169190910492915050565b5f82516145da818460208701614094565b9190910192915050565b5f602082840312156145f4575f80fd5b813560ff81168114613d7f575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"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\":\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161477838038061477883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61462b8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef1461021b578063a3a65e481461022e578063b771b3bc14610241578063bee0a03f14610267578063d61bed741461027a575f80fd5b806366435abf146101cf5780636a7e3d83146101e257806376f78621146101f5578063872fda6414610208575f80fd5b806327f39ca8116100d957806327f39ca8146101585780632e2194d81461016b578063467ef06f1461019b57806362065856146101ae575f80fd5b80630118acc41461010a5780630322ed981461011f5780630915204e146101325780630b77f69314610145575b5f80fd5b61011d610118366004613c10565b61028d565b005b61011d61012d366004613c4b565b6106b8565b61011d610140366004613c76565b610814565b61011d610153366004613cab565b6109e5565b61011d610166366004613cce565b610aad565b61017e610179366004613c4b565b610bbb565b6040516001600160401b0390911681526020015b60405180910390f35b61011d6101a9366004613d00565b610bd1565b6101c16101bc366004613d36565b610f2d565b604051908152602001610192565b61017e6101dd366004613c4b565b610f46565b61011d6101f0366004613cab565b610f5a565b61011d610203366004613c10565b610fdc565b6101c1610216366004613de1565b610ff7565b61011d610229366004613e7d565b61101c565b61011d61023c366004613d00565b61102b565b61024f6005600160991b0181565b6040516001600160a01b039091168152602001610192565b61011d610275366004613c4b565b6111df565b61011d610288366004613c76565b6112ae565b5f82156102a15761029e84836114b9565b90505b5f8481527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602090815260408083203384528252808320815160c08101835281546001600160401b038082168352600160401b808304821696840196909652600160801b8204811694830194909452600160c01b900483166060820152600182015492831660808201525f8051602061459f8339815191529493909260a0840191900460ff16600481111561035857610358613e9d565b600481111561036957610369613e9d565b905250905060028160a00151600481111561038657610386613e9d565b146103e75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b60648201526084015b60405180910390fd5b5f6103f187611755565b9050600360a08301819052506001600160401b0342811660408085019190915290821660808401525f8881526003850160205290812083916104303390565b6001600160a01b0316815260208082019290925260409081015f2083518154938501519285015160608601516001600160401b039283166001600160801b031990961695909517600160401b9483168502176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b94821694909402939093178155608084015160018201805467ffffffffffffffff19811692909516918217815560a086015192949293909268ffffffffffffffffff19169091179083600481111561050057610500613e9d565b02179055509050505f610512886117d0565b9050825f01516001600160401b031681608001516001600160401b0316116105885760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016103de565b825160808201805161059b908390613ec5565b6001600160401b03169052506105b188826118cb565b5f6105c1898484608001516119ba565b5f8a8152600587016020908152604080832033845290915290209091506105e88282613f6f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610615908590600401614050565b6020604051808303815f875af1158015610631573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106559190614082565b6080840151604080516001600160401b0392831681529187166020830152428282015251919250339183918d917fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde9181900360600190a450505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145bf83398151915292919061070090613eec565b9050118015610732575060035f83815260078301602052604090205460ff16600581111561073057610730613e9d565b145b6107965760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016103de565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107cf9190600401614099565b6020604051808303815f875af11580156107eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080f9190614082565b505050565b5f8051602061459f8339815191525f61082c84611bd7565b90505f8061083d8360400151611db8565b509150915061084c8286611ff3565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061087891613ba1565b5f610882836117d0565b9050816001600160401b031681606001516001600160401b031610156108ba5760405162461bcd60e51b81526004016103de90614123565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b038084169116111561090c5760405162461bcd60e51b81526004016103de90614165565b60035f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff16600481111561095057610950613e9d565b1461096d5760405162461bcd60e51b81526004016103de906141ae565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320600101805460ff60401b191668040000000000000000179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6109ef8282612106565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061459f833981519152916005600160991b019163ee5b48eb91610a6791600401614099565b6020604051808303815f875af1158015610a83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa79190614082565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610af15750825b90505f826001600160401b03166001148015610b0c5750303b155b905081158015610b1a575080155b15610b385760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b6257845460ff60401b1916600160401b1785555b610b6c8787612224565b8315610bb257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f610bcb64e8d4a5100083614212565b92915050565b5f805160206145bf8339815191525f610be983611bd7565b90505f80610bfa836040015161223e565b915091508015610c5f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103de565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610c9057610c90613e9d565b6005811115610ca157610ca1613e9d565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610d1a57610d1a613e9d565b1480610d385750600182516005811115610d3657610d36613e9d565b145b610d975760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103de565b600382516005811115610dac57610dac613e9d565b03610dd357505f8381526006860160205260408120600491610dce9190613ba1565b610dd7565b5060055b6020808301515f90815260088801909152604081205581816005811115610e0057610e00613e9d565b90816005811115610e1357610e13613e9d565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610e4757610e47613e9d565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610efa57610efa613e9d565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f610bcb6001600160401b03831664e8d4a51000614225565b5f610f50826117d0565b6080015192915050565b610f648282611ff3565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061459f833981519152916005600160991b019163ee5b48eb91610a6791600401614099565b8115610fee57610fec83826114b9565b505b61080f836123df565b5f8061100286612731565b9050611010858286866127de565b9150505b949350505050565b611027823383612c12565b5050565b5f805160206145bf8339815191525f61104383611bd7565b90505f80611054836040015161223e565b91509150806110b65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103de565b5f828152600585016020526040812080546110d090613eec565b9050118015611102575060015f83815260078601602052604090205460ff16600581111561110057611100613e9d565b145b61111e5760405162461bcd60e51b81526004016103de9061423c565b5f828152600585016020526040812061113691613ba1565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145bf83398151915292919061122790613eec565b9050118015611259575060015f83815260078301602052604090205460ff16600581111561125757611257613e9d565b145b6112755760405162461bcd60e51b81526004016103de9061423c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107cf9190600401614099565b5f8051602061459f8339815191525f6112c684611bd7565b90505f806112d78360400151611db8565b50915091506112e68286612106565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061131291613ba1565b5f61131c836117d0565b9050816001600160401b031681606001516001600160401b031610156113545760405162461bcd60e51b81526004016103de90614123565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020546001600160401b03808416600160c01b9092041611156113aa5760405162461bcd60e51b81526004016103de90614165565b60015f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff1660048111156113ee576113ee613e9d565b1461140b5760405162461bcd60e51b81526004016103de906141ae565b5f83815260038601602090815260408083206001600160a01b038a168085529083529281902060018101805460ff60401b191668020000000000000000179055805467ffffffffffffffff60401b1916600160401b426001600160401b03818116929092029290921790925582519081529151908616939287927fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6929081900390910190a450505050505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611504573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152b919081019061428e565b915091508061158e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103de565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f59190614082565b8251146116595760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103de565b60208201516001600160a01b0316156116cf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103de565b5f806116de8460400151612f8e565b9150915081871461174b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103de565b9695505050505050565b5f8181525f805160206145ff8339815191526020526040812060020180545f805160206145bf83398151915291600160a01b9091046001600160401b031690819060146117a183614360565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206145ff83398151915290528390208351918201909352825491925f805160206145bf83398151915292829060ff16600581111561185057611850613e9d565b600581111561186157611861613e9d565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f805160206145ff83398151915260205260409020815181545f805160206145bf8339815191529284929091829060ff1916600183600581111561191557611915613e9d565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a33576119f3816001614385565b6119fe906008614225565b5081515f90839083908110611a1557611a15614398565b60200101906001600160f81b03191690815f1a9053506001016119df565b505f5b6004811015611a9657611a4a816003614385565b611a55906008614225565b6001901c60f81b82611a688360026143ac565b81518110611a7857611a78614398565b60200101906001600160f81b03191690815f1a905350600101611a36565b505f5b6020811015611af857611aad81601f614385565b611ab8906008614225565b86901c60f81b82611aca8360066143ac565b81518110611ada57611ada614398565b60200101906001600160f81b03191690815f1a905350600101611a99565b505f5b6008811015611b6357611b0f816007614385565b611b1a906008614225565b6001600160401b038616901c60f81b82611b358360266143ac565b81518110611b4557611b45614398565b60200101906001600160f81b03191690815f1a905350600101611afb565b505f5b6008811015611bce57611b7a816007614385565b611b85906008614225565b6001600160401b038516901c60f81b82611ba083602e6143ac565b81518110611bb057611bb0614398565b60200101906001600160f81b03191690815f1a905350600101611b66565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f805160206145bf8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c4c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c73919081019061428e565b9150915080611cda5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103de565b8254825114611d3d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103de565b60208201516001600160a01b031615611db05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103de565b509392505050565b5f805f8351603614611ddc5760405162461bcd60e51b81526004016103de906143bf565b5f805b6002811015611e2b57611df3816001614385565b611dfe906008614225565b61ffff16868281518110611e1457611e14614398565b016020015160f81c901b9190911790600101611ddf565b5061ffff811615611e4e5760405162461bcd60e51b81526004016103de90614408565b5f805b6004811015611ea957611e65816003614385565b611e70906008614225565b63ffffffff1687611e828360026143ac565b81518110611e9257611e92614398565b016020015160f81c901b9190911790600101611e51565b5063ffffffff8116600314611ed05760405162461bcd60e51b81526004016103de9061444b565b5f805b6020811015611f2557611ee781601f614385565b611ef2906008614225565b88611efe8360066143ac565b81518110611f0e57611f0e614398565b016020015160f81c901b9190911790600101611ed3565b505f805b6008811015611f8457611f3d816007614385565b611f48906008614225565b6001600160401b031689611f5d8360266143ac565b81518110611f6d57611f6d614398565b016020015160f81c901b9190911790600101611f29565b505f805b6008811015611fe357611f9c816007614385565b611fa7906008614225565b6001600160401b03168a611fbc83602e6143ac565b81518110611fcc57611fcc614398565b016020015160f81c901b9190911790600101611f88565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f8051602061459f83398151915292919061204f90613eec565b905011801561209f575060035f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff16600481111561209d5761209d613e9d565b145b61080f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016103de565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f8051602061459f83398151915292919061216290613eec565b90501180156121b2575060015f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff1660048111156121b0576121b0613e9d565b145b61080f5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016103de565b61222c613166565b612235826131b1565b611027816131f7565b5f8082516027146122615760405162461bcd60e51b81526004016103de906143bf565b5f805b60028110156122b057612278816001614385565b612283906008614225565b61ffff1685828151811061229957612299614398565b016020015160f81c901b9190911790600101612264565b5061ffff8116156122d35760405162461bcd60e51b81526004016103de90614408565b5f805b600481101561232e576122ea816003614385565b6122f5906008614225565b63ffffffff16866123078360026143ac565b8151811061231757612317614398565b016020015160f81c901b91909117906001016122d6565b5063ffffffff81166002146123555760405162461bcd60e51b81526004016103de9061444b565b5f805b60208110156123aa5761236c81601f614385565b612377906008614225565b876123838360066143ac565b8151811061239357612393614398565b016020015160f81c901b9190911790600101612358565b505f866026815181106123bf576123bf614398565b016020015191976001600160f81b03199092161515965090945050505050565b5f8181525f805160206145ff8339815191526020526040808220815160e0810190925280545f805160206145bf83398151915293929190829060ff16600581111561242c5761242c613e9d565b600581111561243d5761243d613e9d565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156124b7576124b7613e9d565b146124d45760405162461bcd60e51b81526004016103de90614492565b60408101516001600160a01b0316336001600160a01b03161461254e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103de565b61255b81608001516132ab565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561259f5761259f613e9d565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6126538461264d81611755565b5f6119ba565b5f858152600685016020526040902090915061266f8282613f6f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061269c908590600401614050565b6020604051808303815f875af11580156126b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126dc9190614082565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061459f8339815191528161274a8461344c565b90505f61275682610bbb565b83549091506001600160401b0382161080159061278057508260010154816001600160401b031611155b6110145760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103de565b5f6127e7613482565b5f805160206145bf833981519152426001600160401b03851611801561282157506001600160401b03841661281f426202a3006143ac565b115b6128835760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103de565b856128da5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103de565b5f868152600882016020526040902054156129485760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103de565b82516030146129af5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103de565b6129b8856132ab565b5f806129ff6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134b9565b5f82815260058601602052604090209193509150612a1d8282613f6f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612a4a908590600401614050565b6020604051808303815f875af1158015612a66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a8a9190614082565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612b0357612b03613e9d565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612bac83611755565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061101460015f805160206145df83398151915255565b612c1a613482565b5f612c276101798361344c565b90505f8051602061459f8339815191525f612c41866117d0565b9050600281516005811115612c5857612c58613e9d565b14612c755760405162461bcd60e51b81526004016103de90614492565b5f86815260038301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612d065760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b60648201526084016103de565b612d0f836132ab565b8281608001818151612d2191906144d8565b6001600160401b0316905250612d3786826118cb565b5f612d4187611755565b90505f612d53888385608001516119ba565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612d838282613f6f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612db0908590600401614050565b6020604051808303815f875af1158015612dcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612df09190614082565b6040805160c0810182526001600160401b03808a1682525f6020830181905292820183905286166060820152608081019190915290915060a08101600190525f8a815260038701602090815260408083206001600160a01b038d16845282529182902083518154928501519385015160608601516001600160401b039283166001600160801b031990951694909417600160401b9583168602176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b93821693909302929092178155608084015160018201805467ffffffffffffffff19811692909416918217815560a086015192949293909268ffffffffffffffffff1990911690911790836004811115612f0a57612f0a613e9d565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a450505050505061080f60015f805160206145df83398151915255565b5f808251602e14612fb15760405162461bcd60e51b81526004016103de906143bf565b5f805b600281101561300057612fc8816001614385565b612fd3906008614225565b61ffff16858281518110612fe957612fe9614398565b016020015160f81c901b9190911790600101612fb4565b5061ffff8116156130235760405162461bcd60e51b81526004016103de90614408565b5f805b600481101561307e5761303a816003614385565b613045906008614225565b63ffffffff16866130578360026143ac565b8151811061306757613067614398565b016020015160f81c901b9190911790600101613026565b5063ffffffff81166004146130a55760405162461bcd60e51b81526004016103de9061444b565b5f805b60208110156130fa576130bc81601f614385565b6130c7906008614225565b876130d38360066143ac565b815181106130e3576130e3614398565b016020015160f81c901b91909117906001016130a8565b505f805b600881101561315957613112816007614385565b61311d906008614225565b6001600160401b0316886131328360266143ac565b8151811061314257613142614398565b016020015160f81c901b91909117906001016130fe565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166131af57604051631afcd79f60e31b815260040160405180910390fd5b565b6131b9613166565b6131c281613871565b6131f4606082013560808301356131df60c0850160a08601613d36565b6131ef60e0860160c087016144f8565b613892565b50565b6131ff613166565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661328b5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103de565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145bf8339815191529060ff165f036132e9575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133319083614385565b1061334d576001600160401b038416604083015280825261336c565b838260400181815161335f91906144d8565b6001600160401b03169052505b5f8260200151836040015160646133839190614513565b61338d919061453e565b600285015490915060ff90811690821611156134085760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103de565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610bcb827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906138ed565b5f805160206145df8339815191528054600119016134b357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135235760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103de565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561359a5761355a816001614385565b613565906008614225565b5081515f9083908390811061357c5761357c614398565b60200101906001600160f81b03191690815f1a905350600101613546565b505f5b60048110156135f8576135b1816003614385565b6135bc906008614225565b505f826135ca8360026143ac565b815181106135da576135da614398565b60200101906001600160f81b03191690815f1a90535060010161359d565b505f5b6020811015613655578451816020811061361757613617614398565b1a60f81b826136278360066143ac565b8151811061363757613637614398565b60200101906001600160f81b03191690815f1a9053506001016135fb565b505f5b60208110156136b5578460200151816020811061367757613677614398565b1a60f81b826136878360266143ac565b8151811061369757613697614398565b60200101906001600160f81b03191690815f1a905350600101613658565b505f5b6008811015613729576136cc816007614385565b6136d7906008614225565b60ff1685604001516001600160401b0316901c60f81b828260466136fb91906143ac565b8151811061370b5761370b614398565b60200101906001600160f81b03191690815f1a9053506001016136b8565b505f5b6030811015613794578460800151818151811061374b5761374b614398565b01602001516001600160f81b0319168261376683604e6143ac565b8151811061377657613776614398565b60200101906001600160f81b03191690815f1a90535060010161372c565b505f5b6008811015613806576137ab816007614385565b6137b6906008614225565b60608601516001600160401b0390811691161c60f81b826137d883607e6143ac565b815181106137e8576137e8614398565b60200101906001600160f81b03191690815f1a905350600101613797565b506002816040516138179190614563565b602060405180830381855afa158015613832573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138559190614082565b94909350915050565b60015f805160206145df83398151915255565b613879613166565b613881613a4f565b613889613a5f565b6131f481613a67565b61389a613166565b5f5f8051602061459f833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613933573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139579190614082565b905061396e6001600160a01b038516333086613ad3565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139d69190614082565b9050818111613a3c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103de565b613a468282614385565b95945050505050565b613a57613166565b6131af613b2d565b6131af613166565b613a6f613166565b80355f805160206145bf83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613ab9606083016040840161457e565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610aa7908590613b35565b61385e613166565b5f8060205f8451602086015f885af180613b54576040513d5f823e3d81fd5b50505f513d91508115613b6b578060011415613b78565b6001600160a01b0384163b155b15610aa757604051635274afe760e01b81526001600160a01b03851660048201526024016103de565b508054613bad90613eec565b5f825580601f10613bbc575050565b601f0160209004905f5260205f20908101906131f491905b80821115613be7575f8155600101613bd4565b5090565b80151581146131f4575f80fd5b803563ffffffff81168114613c0b575f80fd5b919050565b5f805f60608486031215613c22575f80fd5b833592506020840135613c3481613beb565b9150613c4260408501613bf8565b90509250925092565b5f60208284031215613c5b575f80fd5b5035919050565b6001600160a01b03811681146131f4575f80fd5b5f8060408385031215613c87575f80fd5b613c9083613bf8565b91506020830135613ca081613c62565b809150509250929050565b5f8060408385031215613cbc575f80fd5b823591506020830135613ca081613c62565b5f80828403610100811215613ce1575f80fd5b60e0811215613cee575f80fd5b5082915060e0830135613ca081613c62565b5f60208284031215613d10575f80fd5b613d1982613bf8565b9392505050565b80356001600160401b0381168114613c0b575f80fd5b5f60208284031215613d46575f80fd5b613d1982613d20565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d8557613d85613d4f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613db357613db3613d4f565b604052919050565b5f6001600160401b03821115613dd357613dd3613d4f565b50601f01601f191660200190565b5f805f8060808587031215613df4575f80fd5b8435935060208501359250613e0b60408601613d20565b915060608501356001600160401b03811115613e25575f80fd5b8501601f81018713613e35575f80fd5b8035613e48613e4382613dbb565b613d8b565b818152886020838501011115613e5c575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613e8e575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ee557613ee5613eb1565b5092915050565b600181811c90821680613f0057607f821691505b602082108103613f1e57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561080f57805f5260205f20601f840160051c81016020851015613f495750805b601f840160051c820191505b81811015613f68575f8155600101613f55565b5050505050565b81516001600160401b03811115613f8857613f88613d4f565b613f9c81613f968454613eec565b84613f24565b602080601f831160018114613fcf575f8415613fb85750858301515b5f19600386901b1c1916600185901b178555614026565b5f85815260208120601f198616915b82811015613ffd57888601518255948401946001909101908401613fde565b508582101561401a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015614048578181015183820152602001614030565b50505f910152565b602081525f825180602084015261406e81604085016020870161402e565b601f01601f19169190910160400192915050565b5f60208284031215614092575f80fd5b5051919050565b5f60208083525f84546140ab81613eec565b806020870152604060018084165f81146140cc57600181146140e857614115565b60ff19851660408a0152604084151560051b8a01019550614115565b895f5260205f205f5b8581101561410c5781548b82018601529083019088016140f1565b8a016040019650505b509398975050505050505050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82614220576142206141fe565b500490565b8082028115828204841417610bcb57610bcb613eb1565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613c0b81613beb565b5f806040838503121561429f575f80fd5b82516001600160401b03808211156142b5575f80fd5b90840190606082870312156142c8575f80fd5b6142d0613d63565b825181526020808401516142e381613c62565b828201526040840151838111156142f8575f80fd5b80850194505087601f85011261430c575f80fd5b8351925061431c613e4384613dbb565b838152888285870101111561432f575f80fd5b61433e8483830184880161402e565b80604084015250819550614353818801614283565b9450505050509250929050565b5f6001600160401b0380831681810361437b5761437b613eb1565b6001019392505050565b81810381811115610bcb57610bcb613eb1565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610bcb57610bcb613eb1565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b6001600160401b03818116838216019080821115613ee557613ee5613eb1565b5f60208284031215614508575f80fd5b8135613d1981613c62565b6001600160401b0381811683821602808216919082811461453657614536613eb1565b505092915050565b5f6001600160401b0380841680614557576145576141fe565b92169190910492915050565b5f825161457481846020870161402e565b9190910192915050565b5f6020828403121561458e575f80fd5b813560ff81168114613d19575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1867,151 +1867,6 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidati return event, nil } -// ERC20TokenStakingManagerValidationUptimeUpdatedIterator is returned from FilterValidationUptimeUpdated and is used to iterate over the raw logs and unpacked data for ValidationUptimeUpdated events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerValidationUptimeUpdatedIterator struct { - Event *ERC20TokenStakingManagerValidationUptimeUpdated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerValidationUptimeUpdatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerValidationUptimeUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerValidationUptimeUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerValidationUptimeUpdatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerValidationUptimeUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerValidationUptimeUpdated represents a ValidationUptimeUpdated event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerValidationUptimeUpdated struct { - ValidationID [32]byte - Uptime uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidationUptimeUpdated is a free log retrieval operation binding the contract event 0xdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c. -// -// Solidity: event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationUptimeUpdated(opts *bind.FilterOpts, validationID [][32]byte) (*ERC20TokenStakingManagerValidationUptimeUpdatedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationUptimeUpdated", validationIDRule) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerValidationUptimeUpdatedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationUptimeUpdated", logs: logs, sub: sub}, nil -} - -// WatchValidationUptimeUpdated is a free log subscription operation binding the contract event 0xdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c. -// -// Solidity: event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationUptimeUpdated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationUptimeUpdated, validationID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationUptimeUpdated", validationIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerValidationUptimeUpdated) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationUptimeUpdated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidationUptimeUpdated is a log parse operation binding the contract event 0xdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c. -// -// Solidity: event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationUptimeUpdated(log types.Log) (*ERC20TokenStakingManagerValidationUptimeUpdated, error) { - event := new(ERC20TokenStakingManagerValidationUptimeUpdated) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationUptimeUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // ERC20TokenStakingManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerValidatorRemovalInitializedIterator struct { Event *ERC20TokenStakingManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 3c3d99979..db6295045 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"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\":\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161450b38038061450b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143be8061014d5f395ff3fe6080604052600436106100f9575f3560e01c806366435abf11610092578063b771b3bc11610062578063b771b3bc1461029e578063bee0a03f146102d0578063c599e24f146102ef578063d61bed7414610302578063f40797d714610321575f80fd5b806366435abf146102225780636a7e3d831461024157806376f7862114610260578063a3a65e481461027f575f80fd5b80630b77f693116100cd5780630b77f6931461017b5780632e2194d81461019a578063467ef06f146101d657806362065856146101f5575f80fd5b8062e41792146100fd5780630118acc41461011e5780630322ed981461013d5780630915204e1461015c575b5f80fd5b348015610108575f80fd5b5061011c6101173660046139ce565b610334565b005b348015610129575f80fd5b5061011c610138366004613a09565b610440565b348015610148575f80fd5b5061011c610157366004613a44565b61086f565b348015610167575f80fd5b5061011c610176366004613a6f565b6109cb565b348015610186575f80fd5b5061011c610195366004613aa4565b610b97565b3480156101a5575f80fd5b506101b96101b4366004613a44565b610c5f565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101e1575f80fd5b5061011c6101f0366004613ac7565b610c75565b348015610200575f80fd5b5061021461020f366004613afd565b610fd1565b6040519081526020016101cd565b34801561022d575f80fd5b506101b961023c366004613a44565b610fea565b34801561024c575f80fd5b5061011c61025b366004613aa4565b610ffe565b34801561026b575f80fd5b5061011c61027a366004613a09565b611080565b34801561028a575f80fd5b5061011c610299366004613ac7565b61109b565b3480156102a9575f80fd5b506102b86005600160991b0181565b6040516001600160a01b0390911681526020016101cd565b3480156102db575f80fd5b5061011c6102ea366004613a44565b61124f565b61011c6102fd366004613a44565b61131e565b34801561030d575f80fd5b5061011c61031c366004613a6f565b61132c565b61021461032f366004613ba8565b611532565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f286611554565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8215610454576104518483611565565b90505b5f8481527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602090815260408083203384528252808320815160e08101835281546001600160401b038082168352600160401b808304821696840196909652600160801b808304821695840195909552600160c01b90910481166060830152600183015480821660808401529485041660a08201525f805160206143328339815191529493909260c08401910460ff16600481111561051557610515613c3a565b600481111561052657610526613c3a565b905250905060028160c00151600481111561054357610543613c3a565b146105a45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b60648201526084015b60405180910390fd5b5f6105ae87611875565b9050600360c08301819052506001600160401b03428116604080850191909152828216608085015290851660a08401525f8881526003850160205290812083916105f53390565b6001600160a01b0316815260208082019290925260409081015f2083518154938501519285015160608601516001600160401b039283166001600160801b031996871617600160401b9584168602176001600160801b0316600160801b92841683026001600160c01b031617600160c01b91841691909102178355608086015160018401805460a089015192851697169690961792169093021780845560c08501519193919260ff60801b19909116908360048111156106b7576106b7613c3a565b02179055509050505f6106c9886118f0565b9050825f01516001600160401b031681608001516001600160401b03161161073f5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161059b565b8251608082018051610752908390613c62565b6001600160401b031690525061076888826119eb565b5f61077889848460800151611ada565b5f8a81526005870160209081526040808320338452909152902090915061079f8282613d06565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906107cc908590600401613de3565b6020604051808303815f875af11580156107e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080c9190613e15565b6080840151604080516001600160401b0392831681529187166020830152428282015251919250339183918d917fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde9181900360600190a450505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206143528339815191529291906108b790613c89565b90501180156108e9575060035f83815260078301602052604090205460ff1660058111156108e7576108e7613c3a565b145b61094d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161059b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109869190600401613e2c565b6020604051808303815f875af11580156109a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c69190613e15565b505050565b5f805160206143328339815191525f6109e384611cf7565b90505f806109f48360400151611ed8565b5091509150610a038286612113565b5f82815260058501602090815260408083206001600160a01b03891684529091528120610a2f91613984565b5f610a39836118f0565b9050816001600160401b031681606001516001600160401b03161015610a715760405162461bcd60e51b815260040161059b90613eb6565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b0380841691161115610ac35760405162461bcd60e51b815260040161059b90613ef8565b60035f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160801b900460ff166004811115610b0757610b07613c3a565b14610b245760405162461bcd60e51b815260040161059b90613f41565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320600101805460ff60801b1916600160821b179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b610ba18282612226565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614332833981519152916005600160991b019163ee5b48eb91610c1991600401613e2c565b6020604051808303815f875af1158015610c35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c599190613e15565b50505050565b5f610c6f64e8d4a5100083613fa5565b92915050565b5f805160206143528339815191525f610c8d83611cf7565b90505f80610c9e8360400151612344565b915091508015610d035760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161059b565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610d3457610d34613c3a565b6005811115610d4557610d45613c3a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610dbe57610dbe613c3a565b1480610ddc5750600182516005811115610dda57610dda613c3a565b145b610e3b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161059b565b600382516005811115610e5057610e50613c3a565b03610e7757505f8381526006860160205260408120600491610e729190613984565b610e7b565b5060055b6020808301515f90815260088801909152604081205581816005811115610ea457610ea4613c3a565b90816005811115610eb757610eb7613c3a565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610eeb57610eeb613c3a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610f9e57610f9e613c3a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f610c6f6001600160401b03831664e8d4a51000613fb8565b5f610ff4826118f0565b6080015192915050565b6110088282612113565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614332833981519152916005600160991b019163ee5b48eb91610c1991600401613e2c565b8115611092576110908382611565565b505b6109c6836124e5565b5f805160206143528339815191525f6110b383611cf7565b90505f806110c48360400151612344565b91509150806111265760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161059b565b5f8281526005850160205260408120805461114090613c89565b9050118015611172575060015f83815260078601602052604090205460ff16600581111561117057611170613c3a565b145b61118e5760405162461bcd60e51b815260040161059b90613fcf565b5f82815260058501602052604081206111a691613984565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061435283398151915292919061129790613c89565b90501180156112c9575060015f83815260078301602052604090205460ff1660058111156112c7576112c7613c3a565b145b6112e55760405162461bcd60e51b815260040161059b90613fcf565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109869190600401613e2c565b611329813334612837565b50565b5f805160206143328339815191525f61134484611cf7565b90505f806113558360400151611ed8565b50915091506113648286612226565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061139091613984565b5f61139a836118f0565b9050816001600160401b031681606001516001600160401b031610156113d25760405162461bcd60e51b815260040161059b90613eb6565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020546001600160401b03808416600160c01b9092041611156114285760405162461bcd60e51b815260040161059b90613ef8565b60015f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160801b900460ff16600481111561146c5761146c613c3a565b146114895760405162461bcd60e51b815260040161059b90613f41565b5f83815260038601602090815260408083206001600160a01b038a168085529083529281902060018101805460ff60801b1916600160811b179055805467ffffffffffffffff60401b1916600160401b426001600160401b03818116929092029290921790925582519081529151908616939287927fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6929081900390910190a450505050505050565b5f8061153d34612ba8565b905061154b85828686612c52565b95945050505050565b61155c613086565b611329816130d1565b5f805f805160206143328339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e89190810190614021565b915091508061164b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161059b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561168e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b29190613e15565b8251146117165760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161059b565b60208201516001600160a01b03161561178c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161059b565b5f8061179b8460400151613114565b915091508188146118085760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161059b565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a2979650505050505050565b5f8181525f805160206143928339815191526020526040812060020180545f8051602061435283398151915291600160a01b9091046001600160401b031690819060146118c1836140f3565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061439283398151915290528390208351918201909352825491925f8051602061435283398151915292829060ff16600581111561197057611970613c3a565b600581111561198157611981613c3a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061439283398151915260205260409020815181545f805160206143528339815191529284929091829060ff19166001836005811115611a3557611a35613c3a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611b5357611b13816001614118565b611b1e906008613fb8565b5081515f90839083908110611b3557611b3561412b565b60200101906001600160f81b03191690815f1a905350600101611aff565b505f5b6004811015611bb657611b6a816003614118565b611b75906008613fb8565b6001901c60f81b82611b8883600261413f565b81518110611b9857611b9861412b565b60200101906001600160f81b03191690815f1a905350600101611b56565b505f5b6020811015611c1857611bcd81601f614118565b611bd8906008613fb8565b86901c60f81b82611bea83600661413f565b81518110611bfa57611bfa61412b565b60200101906001600160f81b03191690815f1a905350600101611bb9565b505f5b6008811015611c8357611c2f816007614118565b611c3a906008613fb8565b6001600160401b038616901c60f81b82611c5583602661413f565b81518110611c6557611c6561412b565b60200101906001600160f81b03191690815f1a905350600101611c1b565b505f5b6008811015611cee57611c9a816007614118565b611ca5906008613fb8565b6001600160401b038516901c60f81b82611cc083602e61413f565b81518110611cd057611cd061412b565b60200101906001600160f81b03191690815f1a905350600101611c86565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f805160206143528339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d6c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d939190810190614021565b9150915080611dfa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161059b565b8254825114611e5d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161059b565b60208201516001600160a01b031615611ed05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161059b565b509392505050565b5f805f8351603614611efc5760405162461bcd60e51b815260040161059b90614152565b5f805b6002811015611f4b57611f13816001614118565b611f1e906008613fb8565b61ffff16868281518110611f3457611f3461412b565b016020015160f81c901b9190911790600101611eff565b5061ffff811615611f6e5760405162461bcd60e51b815260040161059b9061419b565b5f805b6004811015611fc957611f85816003614118565b611f90906008613fb8565b63ffffffff1687611fa283600261413f565b81518110611fb257611fb261412b565b016020015160f81c901b9190911790600101611f71565b5063ffffffff8116600314611ff05760405162461bcd60e51b815260040161059b906141de565b5f805b60208110156120455761200781601f614118565b612012906008613fb8565b8861201e83600661413f565b8151811061202e5761202e61412b565b016020015160f81c901b9190911790600101611ff3565b505f805b60088110156120a45761205d816007614118565b612068906008613fb8565b6001600160401b03168961207d83602661413f565b8151811061208d5761208d61412b565b016020015160f81c901b9190911790600101612049565b505f805b6008811015612103576120bc816007614118565b6120c7906008613fb8565b6001600160401b03168a6120dc83602e61413f565b815181106120ec576120ec61412b565b016020015160f81c901b91909117906001016120a8565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f8051602061433283398151915292919061216f90613c89565b90501180156121bf575060035f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160801b900460ff1660048111156121bd576121bd613c3a565b145b6109c65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161059b565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f8051602061433283398151915292919061228290613c89565b90501180156122d2575060015f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160801b900460ff1660048111156122d0576122d0613c3a565b145b6109c65760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161059b565b5f8082516027146123675760405162461bcd60e51b815260040161059b90614152565b5f805b60028110156123b65761237e816001614118565b612389906008613fb8565b61ffff1685828151811061239f5761239f61412b565b016020015160f81c901b919091179060010161236a565b5061ffff8116156123d95760405162461bcd60e51b815260040161059b9061419b565b5f805b6004811015612434576123f0816003614118565b6123fb906008613fb8565b63ffffffff168661240d83600261413f565b8151811061241d5761241d61412b565b016020015160f81c901b91909117906001016123dc565b5063ffffffff811660021461245b5760405162461bcd60e51b815260040161059b906141de565b5f805b60208110156124b05761247281601f614118565b61247d906008613fb8565b8761248983600661413f565b815181106124995761249961412b565b016020015160f81c901b919091179060010161245e565b505f866026815181106124c5576124c561412b565b016020015191976001600160f81b03199092161515965090945050505050565b5f8181525f805160206143928339815191526020526040808220815160e0810190925280545f8051602061435283398151915293929190829060ff16600581111561253257612532613c3a565b600581111561254357612543613c3a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156125bd576125bd613c3a565b146125da5760405162461bcd60e51b815260040161059b90614225565b60408101516001600160a01b0316336001600160a01b0316146126545760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161059b565b61266181608001516132ec565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156126a5576126a5613c3a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6127598461275381611875565b5f611ada565b5f85815260068501602052604090209091506127758282613d06565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127a2908590600401613de3565b6020604051808303815f875af11580156127be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127e29190613e15565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61283f61348d565b5f61284982610c5f565b90505f805160206143328339815191525f612863866118f0565b905060028151600581111561287a5761287a613c3a565b146128975760405162461bcd60e51b815260040161059b90614225565b5f86815260038301602090815260408083206001600160a01b03891684529091529020546001600160401b0316156129285760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161059b565b612931836132ec565b8281608001818151612943919061426b565b6001600160401b031690525061295986826119eb565b5f61296387611875565b90505f61297588838560800151611ada565b5f89815260048601602090815260408083206001600160a01b038c16845290915290209091506129a58282613d06565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129d2908590600401613de3565b6020604051808303815f875af11580156129ee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a129190613e15565b6040805160e0810182526001600160401b03808a1682525f60208301819052928201839052861660608201526080810182905260a081019190915290915060c08101600190525f8a815260038701602090815260408083206001600160a01b038d16845282529182902083518154928501519385015160608601516001600160401b039283166001600160801b031995861617600160401b9684168702176001600160801b0316600160801b92841683026001600160c01b031617600160c01b91841691909102178355608086015160018401805460a089015192851696169590951792169094021780835560c0850151919391929160ff60801b1990911690836004811115612b2457612b24613c3a565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a45050505050506109c660015f8051602061437283398151915255565b5f5f805160206143328339815191528282612bc282610c5f565b83549091506001600160401b03821610801590612bec57508260010154816001600160401b031611155b612c4a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161059b565b949350505050565b5f612c5b61348d565b5f80516020614352833981519152426001600160401b038516118015612c9557506001600160401b038416612c93426202a30061413f565b115b612cf75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161059b565b85612d4e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161059b565b5f86815260088201602052604090205415612dbc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161059b565b8251603014612e235760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161059b565b612e2c856132ec565b5f80612e736040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134d7565b5f82815260058601602052604090209193509150612e918282613d06565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ebe908590600401613de3565b6020604051808303815f875af1158015612eda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612efe9190613e15565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612f7757612f77613c3a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561302083611875565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c4a60015f8051602061437283398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130cf57604051631afcd79f60e31b815260040160405180910390fd5b565b6130d9613086565b6130e28161387c565b611329606082013560808301356130ff60c0850160a08601613afd565b61310f60e0860160c0870161428b565b61389d565b5f808251602e146131375760405162461bcd60e51b815260040161059b90614152565b5f805b60028110156131865761314e816001614118565b613159906008613fb8565b61ffff1685828151811061316f5761316f61412b565b016020015160f81c901b919091179060010161313a565b5061ffff8116156131a95760405162461bcd60e51b815260040161059b9061419b565b5f805b6004811015613204576131c0816003614118565b6131cb906008613fb8565b63ffffffff16866131dd83600261413f565b815181106131ed576131ed61412b565b016020015160f81c901b91909117906001016131ac565b5063ffffffff811660041461322b5760405162461bcd60e51b815260040161059b906141de565b5f805b60208110156132805761324281601f614118565b61324d906008613fb8565b8761325983600661413f565b815181106132695761326961412b565b016020015160f81c901b919091179060010161322e565b505f805b60088110156132df57613298816007614118565b6132a3906008613fb8565b6001600160401b0316886132b883602661413f565b815181106132c8576132c861412b565b016020015160f81c901b9190911790600101613284565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206143528339815191529060ff165f0361332a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133729083614118565b1061338e576001600160401b03841660408301528082526133ad565b83826040018181516133a0919061426b565b6001600160401b03169052505b5f8260200151836040015160646133c491906142a6565b6133ce91906142d1565b600285015490915060ff90811690821611156134495760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161059b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206143728339815191528054600119016134be57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061437283398151915255565b5f60608260800151516030146135415760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161059b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135b857613578816001614118565b613583906008613fb8565b5081515f9083908390811061359a5761359a61412b565b60200101906001600160f81b03191690815f1a905350600101613564565b505f5b6004811015613616576135cf816003614118565b6135da906008613fb8565b505f826135e883600261413f565b815181106135f8576135f861412b565b60200101906001600160f81b03191690815f1a9053506001016135bb565b505f5b602081101561367357845181602081106136355761363561412b565b1a60f81b8261364583600661413f565b815181106136555761365561412b565b60200101906001600160f81b03191690815f1a905350600101613619565b505f5b60208110156136d357846020015181602081106136955761369561412b565b1a60f81b826136a583602661413f565b815181106136b5576136b561412b565b60200101906001600160f81b03191690815f1a905350600101613676565b505f5b6008811015613747576136ea816007614118565b6136f5906008613fb8565b60ff1685604001516001600160401b0316901c60f81b82826046613719919061413f565b815181106137295761372961412b565b60200101906001600160f81b03191690815f1a9053506001016136d6565b505f5b60308110156137b257846080015181815181106137695761376961412b565b01602001516001600160f81b0319168261378483604e61413f565b815181106137945761379461412b565b60200101906001600160f81b03191690815f1a90535060010161374a565b505f5b6008811015613824576137c9816007614118565b6137d4906008613fb8565b60608601516001600160401b0390811691161c60f81b826137f683607e61413f565b815181106138065761380661412b565b60200101906001600160f81b03191690815f1a9053506001016137b5565b5060028160405161383591906142f6565b602060405180830381855afa158015613850573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138739190613e15565b94909350915050565b613884613086565b61388c6138f8565b613894613908565b61132981613910565b6138a5613086565b5f5f80516020614332833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613900613086565b6130cf61397c565b6130cf613086565b613918613086565b80355f8051602061435283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139626060830160408401614311565b600291909101805460ff191660ff90921691909117905550565b6134c4613086565b50805461399090613c89565b5f825580601f1061399f575050565b601f0160209004905f5260205f209081019061132991905b808211156139ca575f81556001016139b7565b5090565b5f60e082840312156139de575f80fd5b50919050565b8015158114611329575f80fd5b803563ffffffff81168114613a04575f80fd5b919050565b5f805f60608486031215613a1b575f80fd5b833592506020840135613a2d816139e4565b9150613a3b604085016139f1565b90509250925092565b5f60208284031215613a54575f80fd5b5035919050565b6001600160a01b0381168114611329575f80fd5b5f8060408385031215613a80575f80fd5b613a89836139f1565b91506020830135613a9981613a5b565b809150509250929050565b5f8060408385031215613ab5575f80fd5b823591506020830135613a9981613a5b565b5f60208284031215613ad7575f80fd5b613ae0826139f1565b9392505050565b80356001600160401b0381168114613a04575f80fd5b5f60208284031215613b0d575f80fd5b613ae082613ae7565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b4c57613b4c613b16565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b7a57613b7a613b16565b604052919050565b5f6001600160401b03821115613b9a57613b9a613b16565b50601f01601f191660200190565b5f805f60608486031215613bba575f80fd5b83359250613bca60208501613ae7565b915060408401356001600160401b03811115613be4575f80fd5b8401601f81018613613bf4575f80fd5b8035613c07613c0282613b82565b613b52565b818152876020838501011115613c1b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613c8257613c82613c4e565b5092915050565b600181811c90821680613c9d57607f821691505b6020821081036139de57634e487b7160e01b5f52602260045260245ffd5b601f8211156109c657805f5260205f20601f840160051c81016020851015613ce05750805b601f840160051c820191505b81811015613cff575f8155600101613cec565b5050505050565b81516001600160401b03811115613d1f57613d1f613b16565b613d3381613d2d8454613c89565b84613cbb565b602080601f831160018114613d66575f8415613d4f5750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b82811015613d9457888601518255948401946001909101908401613d75565b5085821015613db157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f5b83811015613ddb578181015183820152602001613dc3565b50505f910152565b602081525f8251806020840152613e01816040850160208701613dc1565b601f01601f19169190910160400192915050565b5f60208284031215613e25575f80fd5b5051919050565b5f60208083525f8454613e3e81613c89565b806020870152604060018084165f8114613e5f5760018114613e7b57613ea8565b60ff19851660408a0152604084151560051b8a01019550613ea8565b895f5260205f205f5b85811015613e9f5781548b8201860152908301908801613e84565b8a016040019650505b509398975050505050505050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82613fb357613fb3613f91565b500490565b8082028115828204841417610c6f57610c6f613c4e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613a04816139e4565b5f8060408385031215614032575f80fd5b82516001600160401b0380821115614048575f80fd5b908401906060828703121561405b575f80fd5b614063613b2a565b8251815260208084015161407681613a5b565b8282015260408401518381111561408b575f80fd5b80850194505087601f85011261409f575f80fd5b835192506140af613c0284613b82565b83815288828587010111156140c2575f80fd5b6140d184838301848801613dc1565b806040840152508195506140e6818801614016565b9450505050509250929050565b5f6001600160401b0380831681810361410e5761410e613c4e565b6001019392505050565b81810381811115610c6f57610c6f613c4e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610c6f57610c6f613c4e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b6001600160401b03818116838216019080821115613c8257613c82613c4e565b5f6020828403121561429b575f80fd5b8135613ae081613a5b565b6001600160401b038181168382160280821691908281146142c9576142c9613c4e565b505092915050565b5f6001600160401b03808416806142ea576142ea613f91565b92169190910492915050565b5f8251614307818460208701613dc1565b9190910192915050565b5f60208284031215614321575f80fd5b813560ff81168114613ae0575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"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\":\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516144a53803806144a583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143588061014d5f395ff3fe6080604052600436106100f9575f3560e01c806366435abf11610092578063b771b3bc11610062578063b771b3bc1461029e578063bee0a03f146102d0578063c599e24f146102ef578063d61bed7414610302578063f40797d714610321575f80fd5b806366435abf146102225780636a7e3d831461024157806376f7862114610260578063a3a65e481461027f575f80fd5b80630b77f693116100cd5780630b77f6931461017b5780632e2194d81461019a578063467ef06f146101d657806362065856146101f5575f80fd5b8062e41792146100fd5780630118acc41461011e5780630322ed981461013d5780630915204e1461015c575b5f80fd5b348015610108575f80fd5b5061011c610117366004613968565b610334565b005b348015610129575f80fd5b5061011c6101383660046139a3565b610440565b348015610148575f80fd5b5061011c6101573660046139de565b61086b565b348015610167575f80fd5b5061011c610176366004613a09565b6109c7565b348015610186575f80fd5b5061011c610195366004613a3e565b610b98565b3480156101a5575f80fd5b506101b96101b43660046139de565b610c60565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101e1575f80fd5b5061011c6101f0366004613a61565b610c76565b348015610200575f80fd5b5061021461020f366004613a97565b610fd2565b6040519081526020016101cd565b34801561022d575f80fd5b506101b961023c3660046139de565b610feb565b34801561024c575f80fd5b5061011c61025b366004613a3e565b610fff565b34801561026b575f80fd5b5061011c61027a3660046139a3565b611081565b34801561028a575f80fd5b5061011c610299366004613a61565b61109c565b3480156102a9575f80fd5b506102b86005600160991b0181565b6040516001600160a01b0390911681526020016101cd565b3480156102db575f80fd5b5061011c6102ea3660046139de565b611250565b61011c6102fd3660046139de565b61131f565b34801561030d575f80fd5b5061011c61031c366004613a09565b61132d565b61021461032f366004613b42565b611538565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f28661155a565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f821561045457610451848361156b565b90505b5f8481527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602090815260408083203384528252808320815160c08101835281546001600160401b038082168352600160401b808304821696840196909652600160801b8204811694830194909452600160c01b900483166060820152600182015492831660808201525f805160206142cc8339815191529493909260a0840191900460ff16600481111561050b5761050b613bd4565b600481111561051c5761051c613bd4565b905250905060028160a00151600481111561053957610539613bd4565b1461059a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b60648201526084015b60405180910390fd5b5f6105a487611807565b9050600360a08301819052506001600160401b0342811660408085019190915290821660808401525f8881526003850160205290812083916105e33390565b6001600160a01b0316815260208082019290925260409081015f2083518154938501519285015160608601516001600160401b039283166001600160801b031990961695909517600160401b9483168502176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b94821694909402939093178155608084015160018201805467ffffffffffffffff19811692909516918217815560a086015192949293909268ffffffffffffffffff1916909117908360048111156106b3576106b3613bd4565b02179055509050505f6106c588611882565b9050825f01516001600160401b031681608001516001600160401b03161161073b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610591565b825160808201805161074e908390613bfc565b6001600160401b0316905250610764888261197d565b5f61077489848460800151611a6c565b5f8a81526005870160209081526040808320338452909152902090915061079b8282613ca0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906107c8908590600401613d7d565b6020604051808303815f875af11580156107e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108089190613daf565b6080840151604080516001600160401b0392831681529187166020830152428282015251919250339183918d917fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde9181900360600190a450505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206142ec8339815191529291906108b390613c23565b90501180156108e5575060035f83815260078301602052604090205460ff1660058111156108e3576108e3613bd4565b145b6109495760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610591565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109829190600401613dc6565b6020604051808303815f875af115801561099e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c29190613daf565b505050565b5f805160206142cc8339815191525f6109df84611c89565b90505f806109f08360400151611e6a565b50915091506109ff82866120a5565b5f82815260058501602090815260408083206001600160a01b03891684529091528120610a2b9161391e565b5f610a3583611882565b9050816001600160401b031681606001516001600160401b03161015610a6d5760405162461bcd60e51b815260040161059190613e50565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b0380841691161115610abf5760405162461bcd60e51b815260040161059190613e92565b60035f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff166004811115610b0357610b03613bd4565b14610b205760405162461bcd60e51b815260040161059190613edb565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320600101805460ff60401b191668040000000000000000179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b610ba282826121b8565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206142cc833981519152916005600160991b019163ee5b48eb91610c1a91600401613dc6565b6020604051808303815f875af1158015610c36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5a9190613daf565b50505050565b5f610c7064e8d4a5100083613f3f565b92915050565b5f805160206142ec8339815191525f610c8e83611c89565b90505f80610c9f83604001516122d6565b915091508015610d045760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610591565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610d3557610d35613bd4565b6005811115610d4657610d46613bd4565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610dbf57610dbf613bd4565b1480610ddd5750600182516005811115610ddb57610ddb613bd4565b145b610e3c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610591565b600382516005811115610e5157610e51613bd4565b03610e7857505f8381526006860160205260408120600491610e73919061391e565b610e7c565b5060055b6020808301515f90815260088801909152604081205581816005811115610ea557610ea5613bd4565b90816005811115610eb857610eb8613bd4565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610eec57610eec613bd4565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610f9f57610f9f613bd4565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f610c706001600160401b03831664e8d4a51000613f52565b5f610ff582611882565b6080015192915050565b61100982826120a5565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206142cc833981519152916005600160991b019163ee5b48eb91610c1a91600401613dc6565b811561109357611091838261156b565b505b6109c283612477565b5f805160206142ec8339815191525f6110b483611c89565b90505f806110c583604001516122d6565b91509150806111275760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610591565b5f8281526005850160205260408120805461114190613c23565b9050118015611173575060015f83815260078601602052604090205460ff16600581111561117157611171613bd4565b145b61118f5760405162461bcd60e51b815260040161059190613f69565b5f82815260058501602052604081206111a79161391e565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142ec83398151915292919061129890613c23565b90501180156112ca575060015f83815260078301602052604090205460ff1660058111156112c8576112c8613bd4565b145b6112e65760405162461bcd60e51b815260040161059190613f69565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109829190600401613dc6565b61132a8133346127c9565b50565b5f805160206142cc8339815191525f61134584611c89565b90505f806113568360400151611e6a565b509150915061136582866121b8565b5f82815260048501602090815260408083206001600160a01b038916845290915281206113919161391e565b5f61139b83611882565b9050816001600160401b031681606001516001600160401b031610156113d35760405162461bcd60e51b815260040161059190613e50565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020546001600160401b03808416600160c01b9092041611156114295760405162461bcd60e51b815260040161059190613e92565b60015f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff16600481111561146d5761146d613bd4565b1461148a5760405162461bcd60e51b815260040161059190613edb565b5f83815260038601602090815260408083206001600160a01b038a168085529083529281902060018101805460ff60401b191668020000000000000000179055805467ffffffffffffffff60401b1916600160401b426001600160401b03818116929092029290921790925582519081529151908616939287927fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6929081900390910190a450505050505050565b5f8061154334612b42565b905061155185828686612bec565b95945050505050565b611562613020565b61132a8161306b565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115b6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115dd9190810190613fbb565b91509150806116405760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610591565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611683573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116a79190613daf565b82511461170b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610591565b60208201516001600160a01b0316156117815760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610591565b5f8061179084604001516130ae565b915091508187146117fd5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610591565b9695505050505050565b5f8181525f8051602061432c8339815191526020526040812060020180545f805160206142ec83398151915291600160a01b9091046001600160401b031690819060146118538361408d565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061432c83398151915290528390208351918201909352825491925f805160206142ec83398151915292829060ff16600581111561190257611902613bd4565b600581111561191357611913613bd4565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061432c83398151915260205260409020815181545f805160206142ec8339815191529284929091829060ff191660018360058111156119c7576119c7613bd4565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ae557611aa58160016140b2565b611ab0906008613f52565b5081515f90839083908110611ac757611ac76140c5565b60200101906001600160f81b03191690815f1a905350600101611a91565b505f5b6004811015611b4857611afc8160036140b2565b611b07906008613f52565b6001901c60f81b82611b1a8360026140d9565b81518110611b2a57611b2a6140c5565b60200101906001600160f81b03191690815f1a905350600101611ae8565b505f5b6020811015611baa57611b5f81601f6140b2565b611b6a906008613f52565b86901c60f81b82611b7c8360066140d9565b81518110611b8c57611b8c6140c5565b60200101906001600160f81b03191690815f1a905350600101611b4b565b505f5b6008811015611c1557611bc18160076140b2565b611bcc906008613f52565b6001600160401b038616901c60f81b82611be78360266140d9565b81518110611bf757611bf76140c5565b60200101906001600160f81b03191690815f1a905350600101611bad565b505f5b6008811015611c8057611c2c8160076140b2565b611c37906008613f52565b6001600160401b038516901c60f81b82611c5283602e6140d9565b81518110611c6257611c626140c5565b60200101906001600160f81b03191690815f1a905350600101611c18565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f805160206142ec8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611cfe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d259190810190613fbb565b9150915080611d8c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610591565b8254825114611def5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610591565b60208201516001600160a01b031615611e625760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610591565b509392505050565b5f805f8351603614611e8e5760405162461bcd60e51b8152600401610591906140ec565b5f805b6002811015611edd57611ea58160016140b2565b611eb0906008613f52565b61ffff16868281518110611ec657611ec66140c5565b016020015160f81c901b9190911790600101611e91565b5061ffff811615611f005760405162461bcd60e51b815260040161059190614135565b5f805b6004811015611f5b57611f178160036140b2565b611f22906008613f52565b63ffffffff1687611f348360026140d9565b81518110611f4457611f446140c5565b016020015160f81c901b9190911790600101611f03565b5063ffffffff8116600314611f825760405162461bcd60e51b815260040161059190614178565b5f805b6020811015611fd757611f9981601f6140b2565b611fa4906008613f52565b88611fb08360066140d9565b81518110611fc057611fc06140c5565b016020015160f81c901b9190911790600101611f85565b505f805b600881101561203657611fef8160076140b2565b611ffa906008613f52565b6001600160401b03168961200f8360266140d9565b8151811061201f5761201f6140c5565b016020015160f81c901b9190911790600101611fdb565b505f805b60088110156120955761204e8160076140b2565b612059906008613f52565b6001600160401b03168a61206e83602e6140d9565b8151811061207e5761207e6140c5565b016020015160f81c901b919091179060010161203a565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206142cc83398151915292919061210190613c23565b9050118015612151575060035f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff16600481111561214f5761214f613bd4565b145b6109c25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b6064820152608401610591565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206142cc83398151915292919061221490613c23565b9050118015612264575060015f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff16600481111561226257612262613bd4565b145b6109c25760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e670000000000000000006064820152608401610591565b5f8082516027146122f95760405162461bcd60e51b8152600401610591906140ec565b5f805b6002811015612348576123108160016140b2565b61231b906008613f52565b61ffff16858281518110612331576123316140c5565b016020015160f81c901b91909117906001016122fc565b5061ffff81161561236b5760405162461bcd60e51b815260040161059190614135565b5f805b60048110156123c6576123828160036140b2565b61238d906008613f52565b63ffffffff168661239f8360026140d9565b815181106123af576123af6140c5565b016020015160f81c901b919091179060010161236e565b5063ffffffff81166002146123ed5760405162461bcd60e51b815260040161059190614178565b5f805b60208110156124425761240481601f6140b2565b61240f906008613f52565b8761241b8360066140d9565b8151811061242b5761242b6140c5565b016020015160f81c901b91909117906001016123f0565b505f86602681518110612457576124576140c5565b016020015191976001600160f81b03199092161515965090945050505050565b5f8181525f8051602061432c8339815191526020526040808220815160e0810190925280545f805160206142ec83398151915293929190829060ff1660058111156124c4576124c4613bd4565b60058111156124d5576124d5613bd4565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561254f5761254f613bd4565b1461256c5760405162461bcd60e51b8152600401610591906141bf565b60408101516001600160a01b0316336001600160a01b0316146125e65760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610591565b6125f38160800151613286565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561263757612637613bd4565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6126eb846126e581611807565b5f611a6c565b5f85815260068501602052604090209091506127078282613ca0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612734908590600401613d7d565b6020604051808303815f875af1158015612750573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127749190613daf565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b6127d1613427565b5f6127db82610c60565b90505f805160206142cc8339815191525f6127f586611882565b905060028151600581111561280c5761280c613bd4565b146128295760405162461bcd60e51b8152600401610591906141bf565b5f86815260038301602090815260408083206001600160a01b03891684529091529020546001600160401b0316156128ba5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b6064820152608401610591565b6128c383613286565b82816080018181516128d59190614205565b6001600160401b03169052506128eb868261197d565b5f6128f587611807565b90505f61290788838560800151611a6c565b5f89815260048601602090815260408083206001600160a01b038c16845290915290209091506129378282613ca0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612964908590600401613d7d565b6020604051808303815f875af1158015612980573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129a49190613daf565b6040805160c0810182526001600160401b03808a1682525f6020830181905292820183905286166060820152608081019190915290915060a08101600190525f8a815260038701602090815260408083206001600160a01b038d16845282529182902083518154928501519385015160608601516001600160401b039283166001600160801b031990951694909417600160401b9583168602176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b93821693909302929092178155608084015160018201805467ffffffffffffffff19811692909416918217815560a086015192949293909268ffffffffffffffffff1990911690911790836004811115612abe57612abe613bd4565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a45050505050506109c260015f8051602061430c83398151915255565b5f5f805160206142cc8339815191528282612b5c82610c60565b83549091506001600160401b03821610801590612b8657508260010154816001600160401b031611155b612be45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610591565b949350505050565b5f612bf5613427565b5f805160206142ec833981519152426001600160401b038516118015612c2f57506001600160401b038416612c2d426202a3006140d9565b115b612c915760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610591565b85612ce85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610591565b5f86815260088201602052604090205415612d565760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610591565b8251603014612dbd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610591565b612dc685613286565b5f80612e0d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613471565b5f82815260058601602052604090209193509150612e2b8282613ca0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e58908590600401613d7d565b6020604051808303815f875af1158015612e74573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e989190613daf565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612f1157612f11613bd4565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612fba83611807565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612be460015f8051602061430c83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661306957604051631afcd79f60e31b815260040160405180910390fd5b565b613073613020565b61307c81613816565b61132a6060820135608083013561309960c0850160a08601613a97565b6130a960e0860160c08701614225565b613837565b5f808251602e146130d15760405162461bcd60e51b8152600401610591906140ec565b5f805b6002811015613120576130e88160016140b2565b6130f3906008613f52565b61ffff16858281518110613109576131096140c5565b016020015160f81c901b91909117906001016130d4565b5061ffff8116156131435760405162461bcd60e51b815260040161059190614135565b5f805b600481101561319e5761315a8160036140b2565b613165906008613f52565b63ffffffff16866131778360026140d9565b81518110613187576131876140c5565b016020015160f81c901b9190911790600101613146565b5063ffffffff81166004146131c55760405162461bcd60e51b815260040161059190614178565b5f805b602081101561321a576131dc81601f6140b2565b6131e7906008613f52565b876131f38360066140d9565b81518110613203576132036140c5565b016020015160f81c901b91909117906001016131c8565b505f805b6008811015613279576132328160076140b2565b61323d906008613f52565b6001600160401b0316886132528360266140d9565b81518110613262576132626140c5565b016020015160f81c901b919091179060010161321e565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142ec8339815191529060ff165f036132c4575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061330c90836140b2565b10613328576001600160401b0384166040830152808252613347565b838260400181815161333a9190614205565b6001600160401b03169052505b5f82602001518360400151606461335e9190614240565b613368919061426b565b600285015490915060ff90811690821611156133e35760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610591565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061430c83398151915280546001190161345857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061430c83398151915255565b5f60608260800151516030146134db5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610591565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613552576135128160016140b2565b61351d906008613f52565b5081515f90839083908110613534576135346140c5565b60200101906001600160f81b03191690815f1a9053506001016134fe565b505f5b60048110156135b0576135698160036140b2565b613574906008613f52565b505f826135828360026140d9565b81518110613592576135926140c5565b60200101906001600160f81b03191690815f1a905350600101613555565b505f5b602081101561360d57845181602081106135cf576135cf6140c5565b1a60f81b826135df8360066140d9565b815181106135ef576135ef6140c5565b60200101906001600160f81b03191690815f1a9053506001016135b3565b505f5b602081101561366d578460200151816020811061362f5761362f6140c5565b1a60f81b8261363f8360266140d9565b8151811061364f5761364f6140c5565b60200101906001600160f81b03191690815f1a905350600101613610565b505f5b60088110156136e1576136848160076140b2565b61368f906008613f52565b60ff1685604001516001600160401b0316901c60f81b828260466136b391906140d9565b815181106136c3576136c36140c5565b60200101906001600160f81b03191690815f1a905350600101613670565b505f5b603081101561374c5784608001518181518110613703576137036140c5565b01602001516001600160f81b0319168261371e83604e6140d9565b8151811061372e5761372e6140c5565b60200101906001600160f81b03191690815f1a9053506001016136e4565b505f5b60088110156137be576137638160076140b2565b61376e906008613f52565b60608601516001600160401b0390811691161c60f81b8261379083607e6140d9565b815181106137a0576137a06140c5565b60200101906001600160f81b03191690815f1a90535060010161374f565b506002816040516137cf9190614290565b602060405180830381855afa1580156137ea573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061380d9190613daf565b94909350915050565b61381e613020565b613826613892565b61382e6138a2565b61132a816138aa565b61383f613020565b5f5f805160206142cc833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61389a613020565b613069613916565b613069613020565b6138b2613020565b80355f805160206142ec83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138fc60608301604084016142ab565b600291909101805460ff191660ff90921691909117905550565b61345e613020565b50805461392a90613c23565b5f825580601f10613939575050565b601f0160209004905f5260205f209081019061132a91905b80821115613964575f8155600101613951565b5090565b5f60e08284031215613978575f80fd5b50919050565b801515811461132a575f80fd5b803563ffffffff8116811461399e575f80fd5b919050565b5f805f606084860312156139b5575f80fd5b8335925060208401356139c78161397e565b91506139d56040850161398b565b90509250925092565b5f602082840312156139ee575f80fd5b5035919050565b6001600160a01b038116811461132a575f80fd5b5f8060408385031215613a1a575f80fd5b613a238361398b565b91506020830135613a33816139f5565b809150509250929050565b5f8060408385031215613a4f575f80fd5b823591506020830135613a33816139f5565b5f60208284031215613a71575f80fd5b613a7a8261398b565b9392505050565b80356001600160401b038116811461399e575f80fd5b5f60208284031215613aa7575f80fd5b613a7a82613a81565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613ae657613ae6613ab0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b1457613b14613ab0565b604052919050565b5f6001600160401b03821115613b3457613b34613ab0565b50601f01601f191660200190565b5f805f60608486031215613b54575f80fd5b83359250613b6460208501613a81565b915060408401356001600160401b03811115613b7e575f80fd5b8401601f81018613613b8e575f80fd5b8035613ba1613b9c82613b1c565b613aec565b818152876020838501011115613bb5575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613c1c57613c1c613be8565b5092915050565b600181811c90821680613c3757607f821691505b60208210810361397857634e487b7160e01b5f52602260045260245ffd5b601f8211156109c257805f5260205f20601f840160051c81016020851015613c7a5750805b601f840160051c820191505b81811015613c99575f8155600101613c86565b5050505050565b81516001600160401b03811115613cb957613cb9613ab0565b613ccd81613cc78454613c23565b84613c55565b602080601f831160018114613d00575f8415613ce95750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b82811015613d2e57888601518255948401946001909101908401613d0f565b5085821015613d4b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f5b83811015613d75578181015183820152602001613d5d565b50505f910152565b602081525f8251806020840152613d9b816040850160208701613d5b565b601f01601f19169190910160400192915050565b5f60208284031215613dbf575f80fd5b5051919050565b5f60208083525f8454613dd881613c23565b806020870152604060018084165f8114613df95760018114613e1557613e42565b60ff19851660408a0152604084151560051b8a01019550613e42565b895f5260205f205f5b85811015613e395781548b8201860152908301908801613e1e565b8a016040019650505b509398975050505050505050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82613f4d57613f4d613f2b565b500490565b8082028115828204841417610c7057610c70613be8565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b805161399e8161397e565b5f8060408385031215613fcc575f80fd5b82516001600160401b0380821115613fe2575f80fd5b9084019060608287031215613ff5575f80fd5b613ffd613ac4565b82518152602080840151614010816139f5565b82820152604084015183811115614025575f80fd5b80850194505087601f850112614039575f80fd5b83519250614049613b9c84613b1c565b838152888285870101111561405c575f80fd5b61406b84838301848801613d5b565b80604084015250819550614080818801613fb0565b9450505050509250929050565b5f6001600160401b038083168181036140a8576140a8613be8565b6001019392505050565b81810381811115610c7057610c70613be8565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610c7057610c70613be8565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b6001600160401b03818116838216019080821115613c1c57613c1c613be8565b5f60208284031215614235575f80fd5b8135613a7a816139f5565b6001600160401b0381811683821602808216919082811461426357614263613be8565b505092915050565b5f6001600160401b038084168061428457614284613f2b565b92169190910492915050565b5f82516142a1818460208701613d5b565b9190910192915050565b5f602082840312156142bb575f80fd5b813560ff81168114613a7a575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1867,151 +1867,6 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValida return event, nil } -// NativeTokenStakingManagerValidationUptimeUpdatedIterator is returned from FilterValidationUptimeUpdated and is used to iterate over the raw logs and unpacked data for ValidationUptimeUpdated events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerValidationUptimeUpdatedIterator struct { - Event *NativeTokenStakingManagerValidationUptimeUpdated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerValidationUptimeUpdatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerValidationUptimeUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerValidationUptimeUpdated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerValidationUptimeUpdatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerValidationUptimeUpdatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerValidationUptimeUpdated represents a ValidationUptimeUpdated event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerValidationUptimeUpdated struct { - ValidationID [32]byte - Uptime uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidationUptimeUpdated is a free log retrieval operation binding the contract event 0xdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c. -// -// Solidity: event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationUptimeUpdated(opts *bind.FilterOpts, validationID [][32]byte) (*NativeTokenStakingManagerValidationUptimeUpdatedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationUptimeUpdated", validationIDRule) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerValidationUptimeUpdatedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationUptimeUpdated", logs: logs, sub: sub}, nil -} - -// WatchValidationUptimeUpdated is a free log subscription operation binding the contract event 0xdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c. -// -// Solidity: event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationUptimeUpdated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationUptimeUpdated, validationID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationUptimeUpdated", validationIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerValidationUptimeUpdated) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationUptimeUpdated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidationUptimeUpdated is a log parse operation binding the contract event 0xdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c. -// -// Solidity: event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationUptimeUpdated(log types.Log) (*NativeTokenStakingManagerValidationUptimeUpdated, error) { - event := new(NativeTokenStakingManagerValidationUptimeUpdated) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationUptimeUpdated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // NativeTokenStakingManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerValidatorRemovalInitializedIterator struct { Event *NativeTokenStakingManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log From 1f1238b051305d509e0cb9faa2b0129fbab3269b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 4 Sep 2024 13:32:47 -0500 Subject: [PATCH 189/545] reorder fields --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 4 ++-- contracts/staking/interfaces/IPoSValidatorManager.sol | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 195f53393..42540acc6 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516147b73803806147b783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61466a8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80636a7e3d831161009e5780639e1bc4ef1161006e5780639e1bc4ef1461021b578063a3a65e481461022e578063b771b3bc14610241578063bee0a03f14610267578063d61bed741461027a575f80fd5b80636a7e3d83146101cf57806376f78621146101e2578063872fda64146101f5578063927e7e7514610208575f80fd5b80632e2194d8116100d95780632e2194d814610158578063467ef06f14610188578063620658561461019b57806366435abf146101bc575f80fd5b80630322ed981461010a5780630915204e1461011f5780630b77f6931461013257806327f39ca814610145575b5f80fd5b61011d610118366004613c2a565b61028d565b005b61011d61012d366004613c6d565b6103ee565b61011d610140366004613ca2565b6105bf565b61011d610153366004613cc5565b610687565b61016b610166366004613c2a565b610795565b6040516001600160401b0390911681526020015b60405180910390f35b61011d610196366004613cf7565b6107ab565b6101ae6101a9366004613d2d565b610b07565b60405190815260200161017f565b61016b6101ca366004613c2a565b610b20565b61011d6101dd366004613ca2565b610b34565b61011d6101f0366004613d53565b610bb6565b6101ae610203366004613e20565b610ecf565b61011d610216366004613c2a565b610ef4565b61011d610229366004613ebc565b611306565b61011d61023c366004613cf7565b611315565b61024f6005600160991b0181565b6040516001600160a01b03909116815260200161017f565b61011d610275366004613c2a565b6114c9565b61011d610288366004613c6d565b611598565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145fe8339815191529291906102d590613edc565b9050118015610307575060035f83815260078301602052604090205460ff16600581111561030557610305613f14565b145b6103705760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613f28565b6020604051808303815f875af11580156103c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e99190613fb2565b505050565b5f805160206145de8339815191525f61040684611794565b90505f806104178360400151611975565b50915091506104268286611bb0565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061045291613be0565b5f61045c83611cc3565b9050816001600160401b031681606001516001600160401b031610156104945760405162461bcd60e51b815260040161036790613fc9565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156104e65760405162461bcd60e51b81526004016103679061400b565b60035f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff16600481111561052a5761052a613f14565b146105475760405162461bcd60e51b815260040161036790614054565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320600101805460ff60401b191668040000000000000000179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6105c98282611dbe565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206145de833981519152916005600160991b019163ee5b48eb9161064191600401613f28565b6020604051808303815f875af115801561065d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106819190613fb2565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106cb5750825b90505f826001600160401b031660011480156106e65750303b155b9050811580156106f4575080155b156107125760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561073c57845460ff60401b1916600160401b1785555b6107468787611edc565b831561078c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6107a564e8d4a51000836140cc565b92915050565b5f805160206145fe8339815191525f6107c383611794565b90505f806107d48360400151611ef6565b9150915080156108395760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610367565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561086a5761086a613f14565b600581111561087b5761087b613f14565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156108f4576108f4613f14565b1480610912575060018251600581111561091057610910613f14565b145b6109715760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610367565b60038251600581111561098657610986613f14565b036109ad57505f83815260068601602052604081206004916109a89190613be0565b6109b1565b5060055b6020808301515f908152600888019091526040812055818160058111156109da576109da613f14565b908160058111156109ed576109ed613f14565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610a2157610a21613f14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610ad457610ad4613f14565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6107a56001600160401b03831664e8d4a510006140df565b5f610b2a82611cc3565b6080015192915050565b610b3e8282611bb0565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206145de833981519152916005600160991b019163ee5b48eb9161064191600401613f28565b8115610ec6575f5f805160206145de8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c17573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c3e9190810190614123565b9150915080610ca15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610367565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ce4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d089190613fb2565b825114610d6c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610367565b60208201516001600160a01b031615610de25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610367565b5f80610df18460400151612097565b91509150818814610e5e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610367565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6103e98361226f565b5f80610eda866125c1565b9050610ee88582868661266e565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602090815260408083203384528252808320815160c08101835281546001600160401b038082168352600160401b808304821696840196909652600160801b8204811694830194909452600160c01b900483166060820152600182015492831660808201525f805160206145de8339815191529493909260a0840191900460ff166004811115610fab57610fab613f14565b6004811115610fbc57610fbc613f14565b905250905060028160a001516004811115610fd957610fd9613f14565b146110355760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b6064820152608401610367565b5f61103f84612aa2565b9050600360a08301819052506001600160401b0342811660408085019190915290821660808401525f85815260038501602052908120839161107e3390565b6001600160a01b0316815260208082019290925260409081015f2083518154938501519285015160608601516001600160401b039283166001600160801b031990961695909517600160401b9483168502176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b94821694909402939093178155608084015160018201805467ffffffffffffffff19811692909516918217815560a086015192949293909268ffffffffffffffffff19169091179083600481111561114e5761114e613f14565b02179055509050505f61116085611cc3565b9050825f01516001600160401b031681608001516001600160401b0316116111d65760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610367565b82516080820180516111e99083906141f5565b6001600160401b03169052506111ff8582612b1d565b5f61120f86848460800151612c0c565b5f878152600587016020908152604080832033845290915290209091506112368282614267565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611263908590600401614326565b6020604051808303815f875af115801561127f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112a39190613fb2565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b611311823383612e29565b5050565b5f805160206145fe8339815191525f61132d83611794565b90505f8061133e8360400151611ef6565b91509150806113a05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610367565b5f828152600585016020526040812080546113ba90613edc565b90501180156113ec575060015f83815260078601602052604090205460ff1660058111156113ea576113ea613f14565b145b6114085760405162461bcd60e51b815260040161036790614358565b5f828152600585016020526040812061142091613be0565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145fe83398151915292919061151190613edc565b9050118015611543575060015f83815260078301602052604090205460ff16600581111561154157611541613f14565b145b61155f5760405162461bcd60e51b815260040161036790614358565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613f28565b5f805160206145de8339815191525f6115b084611794565b90505f806115c18360400151611975565b50915091506115d08286611dbe565b5f82815260048501602090815260408083206001600160a01b038916845290915281206115fc91613be0565b5f61160683611cc3565b9050816001600160401b031681606001516001600160401b0316101561163e5760405162461bcd60e51b815260040161036790613fc9565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020546001600160401b03808416600160c01b9092041611156116945760405162461bcd60e51b81526004016103679061400b565b60015f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff1660048111156116d8576116d8613f14565b146116f55760405162461bcd60e51b815260040161036790614054565b5f83815260038601602090815260408083206001600160a01b038a168085529083529281902060018101805460ff60401b191668020000000000000000179055805467ffffffffffffffff60401b1916600160401b426001600160401b03818116929092029290921790925591519182528516929186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b691016112f5565b60408051606080820183525f8083526020830181905292820152905f805160206145fe8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611809573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118309190810190614123565b91509150806118975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610367565b82548251146118fa5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610367565b60208201516001600160a01b03161561196d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610367565b509392505050565b5f805f83516036146119995760405162461bcd60e51b81526004016103679061439f565b5f805b60028110156119e8576119b08160016143e8565b6119bb9060086140df565b61ffff168682815181106119d1576119d16143fb565b016020015160f81c901b919091179060010161199c565b5061ffff811615611a0b5760405162461bcd60e51b81526004016103679061440f565b5f805b6004811015611a6657611a228160036143e8565b611a2d9060086140df565b63ffffffff1687611a3f836002614452565b81518110611a4f57611a4f6143fb565b016020015160f81c901b9190911790600101611a0e565b5063ffffffff8116600314611a8d5760405162461bcd60e51b815260040161036790614465565b5f805b6020811015611ae257611aa481601f6143e8565b611aaf9060086140df565b88611abb836006614452565b81518110611acb57611acb6143fb565b016020015160f81c901b9190911790600101611a90565b505f805b6008811015611b4157611afa8160076143e8565b611b059060086140df565b6001600160401b031689611b1a836026614452565b81518110611b2a57611b2a6143fb565b016020015160f81c901b9190911790600101611ae6565b505f805b6008811015611ba057611b598160076143e8565b611b649060086140df565b6001600160401b03168a611b7983602e614452565b81518110611b8957611b896143fb565b016020015160f81c901b9190911790600101611b45565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206145de833981519152929190611c0c90613edc565b9050118015611c5c575060035f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff166004811115611c5a57611c5a613f14565b145b6103e95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b6064820152608401610367565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061463e83398151915290528390208351918201909352825491925f805160206145fe83398151915292829060ff166005811115611d4357611d43613f14565b6005811115611d5457611d54613f14565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206145de833981519152929190611e1a90613edc565b9050118015611e6a575060015f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff166004811115611e6857611e68613f14565b145b6103e95760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e670000000000000000006064820152608401610367565b611ee46131a5565b611eed826131f0565b61131181613236565b5f808251602714611f195760405162461bcd60e51b81526004016103679061439f565b5f805b6002811015611f6857611f308160016143e8565b611f3b9060086140df565b61ffff16858281518110611f5157611f516143fb565b016020015160f81c901b9190911790600101611f1c565b5061ffff811615611f8b5760405162461bcd60e51b81526004016103679061440f565b5f805b6004811015611fe657611fa28160036143e8565b611fad9060086140df565b63ffffffff1686611fbf836002614452565b81518110611fcf57611fcf6143fb565b016020015160f81c901b9190911790600101611f8e565b5063ffffffff811660021461200d5760405162461bcd60e51b815260040161036790614465565b5f805b60208110156120625761202481601f6143e8565b61202f9060086140df565b8761203b836006614452565b8151811061204b5761204b6143fb565b016020015160f81c901b9190911790600101612010565b505f86602681518110612077576120776143fb565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146120ba5760405162461bcd60e51b81526004016103679061439f565b5f805b6002811015612109576120d18160016143e8565b6120dc9060086140df565b61ffff168582815181106120f2576120f26143fb565b016020015160f81c901b91909117906001016120bd565b5061ffff81161561212c5760405162461bcd60e51b81526004016103679061440f565b5f805b6004811015612187576121438160036143e8565b61214e9060086140df565b63ffffffff1686612160836002614452565b81518110612170576121706143fb565b016020015160f81c901b919091179060010161212f565b5063ffffffff81166004146121ae5760405162461bcd60e51b815260040161036790614465565b5f805b6020811015612203576121c581601f6143e8565b6121d09060086140df565b876121dc836006614452565b815181106121ec576121ec6143fb565b016020015160f81c901b91909117906001016121b1565b505f805b60088110156122625761221b8160076143e8565b6122269060086140df565b6001600160401b03168861223b836026614452565b8151811061224b5761224b6143fb565b016020015160f81c901b9190911790600101612207565b5090969095509350505050565b5f8181525f8051602061463e8339815191526020526040808220815160e0810190925280545f805160206145fe83398151915293929190829060ff1660058111156122bc576122bc613f14565b60058111156122cd576122cd613f14565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561234757612347613f14565b146123645760405162461bcd60e51b8152600401610367906144ac565b60408101516001600160a01b0316336001600160a01b0316146123de5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610367565b6123eb81608001516132ea565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561242f5761242f613f14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124e3846124dd81612aa2565b5f612c0c565b5f85815260068501602052604090209091506124ff8282614267565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061252c908590600401614326565b6020604051808303815f875af1158015612548573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061256c9190613fb2565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145de833981519152816125da8461348b565b90505f6125e682610795565b83549091506001600160401b0382161080159061261057508260010154816001600160401b031611155b610eec5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610367565b5f6126776134c1565b5f805160206145fe833981519152426001600160401b0385161180156126b157506001600160401b0384166126af426202a300614452565b115b6127135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610367565b8561276a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610367565b5f868152600882016020526040902054156127d85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610367565b825160301461283f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610367565b612848856132ea565b5f8061288f6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134f8565b5f828152600586016020526040902091935091506128ad8282614267565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128da908590600401614326565b6020604051808303815f875af11580156128f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061291a9190613fb2565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561299357612993613f14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612a3c83612aa2565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610eec60015f8051602061461e83398151915255565b5f8181525f8051602061463e8339815191526020526040812060020180545f805160206145fe83398151915291600160a01b9091046001600160401b03169081906014612aee836144f2565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061463e83398151915260205260409020815181545f805160206145fe8339815191529284929091829060ff19166001836005811115612b6757612b67613f14565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612c8557612c458160016143e8565b612c509060086140df565b5081515f90839083908110612c6757612c676143fb565b60200101906001600160f81b03191690815f1a905350600101612c31565b505f5b6004811015612ce857612c9c8160036143e8565b612ca79060086140df565b6001901c60f81b82612cba836002614452565b81518110612cca57612cca6143fb565b60200101906001600160f81b03191690815f1a905350600101612c88565b505f5b6020811015612d4a57612cff81601f6143e8565b612d0a9060086140df565b86901c60f81b82612d1c836006614452565b81518110612d2c57612d2c6143fb565b60200101906001600160f81b03191690815f1a905350600101612ceb565b505f5b6008811015612db557612d618160076143e8565b612d6c9060086140df565b6001600160401b038616901c60f81b82612d87836026614452565b81518110612d9757612d976143fb565b60200101906001600160f81b03191690815f1a905350600101612d4d565b505f5b6008811015612e2057612dcc8160076143e8565b612dd79060086140df565b6001600160401b038516901c60f81b82612df283602e614452565b81518110612e0257612e026143fb565b60200101906001600160f81b03191690815f1a905350600101612db8565b50949350505050565b612e316134c1565b5f612e3e6101668361348b565b90505f805160206145de8339815191525f612e5886611cc3565b9050600281516005811115612e6f57612e6f613f14565b14612e8c5760405162461bcd60e51b8152600401610367906144ac565b5f86815260038301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612f1d5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b6064820152608401610367565b612f26836132ea565b8281608001818151612f389190614517565b6001600160401b0316905250612f4e8682612b1d565b5f612f5887612aa2565b90505f612f6a88838560800151612c0c565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612f9a8282614267565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612fc7908590600401614326565b6020604051808303815f875af1158015612fe3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130079190613fb2565b6040805160c0810182526001600160401b03808a1682525f6020830181905292820183905286166060820152608081019190915290915060a08101600190525f8a815260038701602090815260408083206001600160a01b038d16845282529182902083518154928501519385015160608601516001600160401b039283166001600160801b031990951694909417600160401b9583168602176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b93821693909302929092178155608084015160018201805467ffffffffffffffff19811692909416918217815560a086015192949293909268ffffffffffffffffff199091169091179083600481111561312157613121613f14565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a45050505050506103e960015f8051602061461e83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166131ee57604051631afcd79f60e31b815260040160405180910390fd5b565b6131f86131a5565b613201816138b0565b6132336060820135608083013561321e60c0850160a08601613d2d565b61322e60e0860160c08701614537565b6138d1565b50565b61323e6131a5565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610367565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145fe8339815191529060ff165f03613328575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061337090836143e8565b1061338c576001600160401b03841660408301528082526133ab565b838260400181815161339e9190614517565b6001600160401b03169052505b5f8260200151836040015160646133c29190614552565b6133cc919061457d565b600285015490915060ff90811690821611156134475760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610367565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6107a5827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061392c565b5f8051602061461e8339815191528054600119016134f257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135625760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610367565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135d9576135998160016143e8565b6135a49060086140df565b5081515f908390839081106135bb576135bb6143fb565b60200101906001600160f81b03191690815f1a905350600101613585565b505f5b6004811015613637576135f08160036143e8565b6135fb9060086140df565b505f82613609836002614452565b81518110613619576136196143fb565b60200101906001600160f81b03191690815f1a9053506001016135dc565b505f5b60208110156136945784518160208110613656576136566143fb565b1a60f81b82613666836006614452565b81518110613676576136766143fb565b60200101906001600160f81b03191690815f1a90535060010161363a565b505f5b60208110156136f457846020015181602081106136b6576136b66143fb565b1a60f81b826136c6836026614452565b815181106136d6576136d66143fb565b60200101906001600160f81b03191690815f1a905350600101613697565b505f5b60088110156137685761370b8160076143e8565b6137169060086140df565b60ff1685604001516001600160401b0316901c60f81b8282604661373a9190614452565b8151811061374a5761374a6143fb565b60200101906001600160f81b03191690815f1a9053506001016136f7565b505f5b60308110156137d3578460800151818151811061378a5761378a6143fb565b01602001516001600160f81b031916826137a583604e614452565b815181106137b5576137b56143fb565b60200101906001600160f81b03191690815f1a90535060010161376b565b505f5b6008811015613845576137ea8160076143e8565b6137f59060086140df565b60608601516001600160401b0390811691161c60f81b8261381783607e614452565b81518110613827576138276143fb565b60200101906001600160f81b03191690815f1a9053506001016137d6565b5060028160405161385691906145a2565b602060405180830381855afa158015613871573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138949190613fb2565b94909350915050565b60015f8051602061461e83398151915255565b6138b86131a5565b6138c0613a8e565b6138c8613a9e565b61323381613aa6565b6138d96131a5565b5f5f805160206145de833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613972573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139969190613fb2565b90506139ad6001600160a01b038516333086613b12565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a159190613fb2565b9050818111613a7b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610367565b613a8582826143e8565b95945050505050565b613a966131a5565b6131ee613b6c565b6131ee6131a5565b613aae6131a5565b80355f805160206145fe83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613af860608301604084016145bd565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610681908590613b74565b61389d6131a5565b5f8060205f8451602086015f885af180613b93576040513d5f823e3d81fd5b50505f513d91508115613baa578060011415613bb7565b6001600160a01b0384163b155b1561068157604051635274afe760e01b81526001600160a01b0385166004820152602401610367565b508054613bec90613edc565b5f825580601f10613bfb575050565b601f0160209004905f5260205f209081019061323391905b80821115613c26575f8155600101613c13565b5090565b5f60208284031215613c3a575f80fd5b5035919050565b803563ffffffff81168114613c54575f80fd5b919050565b6001600160a01b0381168114613233575f80fd5b5f8060408385031215613c7e575f80fd5b613c8783613c41565b91506020830135613c9781613c59565b809150509250929050565b5f8060408385031215613cb3575f80fd5b823591506020830135613c9781613c59565b5f80828403610100811215613cd8575f80fd5b60e0811215613ce5575f80fd5b5082915060e0830135613c9781613c59565b5f60208284031215613d07575f80fd5b613d1082613c41565b9392505050565b80356001600160401b0381168114613c54575f80fd5b5f60208284031215613d3d575f80fd5b613d1082613d17565b8015158114613233575f80fd5b5f805f60608486031215613d65575f80fd5b833592506020840135613d7781613d46565b9150613d8560408501613c41565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613dc457613dc4613d8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613df257613df2613d8e565b604052919050565b5f6001600160401b03821115613e1257613e12613d8e565b50601f01601f191660200190565b5f805f8060808587031215613e33575f80fd5b8435935060208501359250613e4a60408601613d17565b915060608501356001600160401b03811115613e64575f80fd5b8501601f81018713613e74575f80fd5b8035613e87613e8282613dfa565b613dca565b818152886020838501011115613e9b575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ecd575f80fd5b50508035926020909101359150565b600181811c90821680613ef057607f821691505b602082108103613f0e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613f3a81613edc565b806020870152604060018084165f8114613f5b5760018114613f7757613fa4565b60ff19851660408a0152604084151560051b8a01019550613fa4565b895f5260205f205f5b85811015613f9b5781548b8201860152908301908801613f80565b8a016040019650505b509398975050505050505050565b5f60208284031215613fc2575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826140da576140da6140a4565b500490565b80820281158282048414176107a5576107a56140b8565b5f5b838110156141105781810151838201526020016140f8565b50505f910152565b8051613c5481613d46565b5f8060408385031215614134575f80fd5b82516001600160401b038082111561414a575f80fd5b908401906060828703121561415d575f80fd5b614165613da2565b8251815260208084015161417881613c59565b8282015260408401518381111561418d575f80fd5b80850194505087601f8501126141a1575f80fd5b835192506141b1613e8284613dfa565b83815288828587010111156141c4575f80fd5b6141d3848383018488016140f6565b806040840152508195506141e8818801614118565b9450505050509250929050565b6001600160401b03828116828216039080821115614215576142156140b8565b5092915050565b601f8211156103e957805f5260205f20601f840160051c810160208510156142415750805b601f840160051c820191505b81811015614260575f815560010161424d565b5050505050565b81516001600160401b0381111561428057614280613d8e565b6142948161428e8454613edc565b8461421c565b602080601f8311600181146142c7575f84156142b05750858301515b5f19600386901b1c1916600185901b17855561431e565b5f85815260208120601f198616915b828110156142f5578886015182559484019460019091019084016142d6565b508582101561431257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526143448160408501602087016140f6565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156107a5576107a56140b8565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156107a5576107a56140b8565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361450d5761450d6140b8565b6001019392505050565b6001600160401b03818116838216019080821115614215576142156140b8565b5f60208284031215614547575f80fd5b8135613d1081613c59565b6001600160401b03818116838216028082169190828114614575576145756140b8565b505092915050565b5f6001600160401b0380841680614596576145966140a4565b92169190910492915050565b5f82516145b38184602087016140f6565b9190910192915050565b5f602082840312156145cd575f80fd5b813560ff81168114613d10575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161478e38038061478e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146418061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80636a7e3d831161009e5780639e1bc4ef1161006e5780639e1bc4ef1461021b578063a3a65e481461022e578063b771b3bc14610241578063bee0a03f14610267578063d61bed741461027a575f80fd5b80636a7e3d83146101cf57806376f78621146101e2578063872fda64146101f5578063927e7e7514610208575f80fd5b80632e2194d8116100d95780632e2194d814610158578063467ef06f14610188578063620658561461019b57806366435abf146101bc575f80fd5b80630322ed981461010a5780630915204e1461011f5780630b77f6931461013257806327f39ca814610145575b5f80fd5b61011d610118366004613c01565b61028d565b005b61011d61012d366004613c44565b6103ee565b61011d610140366004613c79565b6105ae565b61011d610153366004613c9c565b610676565b61016b610166366004613c01565b610784565b6040516001600160401b0390911681526020015b60405180910390f35b61011d610196366004613cce565b61079a565b6101ae6101a9366004613d04565b610af6565b60405190815260200161017f565b61016b6101ca366004613c01565b610b0f565b61011d6101dd366004613c79565b610b23565b61011d6101f0366004613d2a565b610ba5565b6101ae610203366004613df7565b610ebe565b61011d610216366004613c01565b610ee3565b61011d610229366004613e93565b6112f1565b61011d61023c366004613cce565b611300565b61024f6005600160991b0181565b6040516001600160a01b03909116815260200161017f565b61011d610275366004613c01565b6114b9565b61011d610288366004613c44565b611588565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145d58339815191529291906102d590613eb3565b9050118015610307575060035f83815260078301602052604090205460ff16600581111561030557610305613eeb565b145b6103705760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613eff565b6020604051808303815f875af11580156103c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e99190613f89565b505050565b5f805160206145b58339815191525f6104068461176b565b90505f80610417836040015161194c565b50915091506104268286611b87565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061045291613bb7565b5f61045c83611c90565b9050816001600160401b031681606001516001600160401b031610156104945760405162461bcd60e51b815260040161036790613fa0565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b9092041611156104ed5760405162461bcd60e51b815260040161036790613fe2565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561052757610527613eeb565b146105445760405162461bcd60e51b81526004016103679061402b565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6105b88282611d8b565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206145b5833981519152916005600160991b019163ee5b48eb9161063091600401613eff565b6020604051808303815f875af115801561064c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106709190613f89565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106ba5750825b90505f826001600160401b031660011480156106d55750303b155b9050811580156106e3575080155b156107015760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561072b57845460ff60401b1916600160401b1785555b6107358787611e9f565b831561077b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61079464e8d4a51000836140a3565b92915050565b5f805160206145d58339815191525f6107b28361176b565b90505f806107c38360400151611eb9565b9150915080156108285760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610367565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561085957610859613eeb565b600581111561086a5761086a613eeb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156108e3576108e3613eeb565b148061090157506001825160058111156108ff576108ff613eeb565b145b6109605760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610367565b60038251600581111561097557610975613eeb565b0361099c57505f83815260068601602052604081206004916109979190613bb7565b6109a0565b5060055b6020808301515f908152600888019091526040812055818160058111156109c9576109c9613eeb565b908160058111156109dc576109dc613eeb565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610a1057610a10613eeb565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610ac357610ac3613eeb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6107946001600160401b03831664e8d4a510006140b6565b5f610b1982611c90565b6080015192915050565b610b2d8282611b87565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206145b5833981519152916005600160991b019163ee5b48eb9161063091600401613eff565b8115610eb5575f5f805160206145b58339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c06573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c2d91908101906140fa565b9150915080610c905760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610367565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf79190613f89565b825114610d5b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610367565b60208201516001600160a01b031615610dd15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610367565b5f80610de0846040015161205a565b91509150818814610e4d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610367565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6103e983612232565b5f80610ec986612584565b9050610ed785828686612631565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f805160206145b583398151915293929190829060ff166004811115610f4e57610f4e613eeb565b6004811115610f5f57610f5f613eeb565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a0909101529050600281516004811115610fc957610fc9613eeb565b146110255760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b6064820152608401610367565b5f61102f84612a65565b9050600382819052506001600160401b034281166060840152811660a08301525f848152600384016020526040812083916110673390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff1916600183600481111561109d5761109d613eeb565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f61114785611c90565b905082602001516001600160401b031681608001516001600160401b0316116111be5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610367565b8260200151816080018181516111d491906141cc565b6001600160401b03169052506111ea8582612ae0565b5f6111fa86848460800151612bcf565b5f87815260058701602090815260408083203384529091529020909150611221828261423e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061124e9085906004016142fd565b6020604051808303815f875af115801561126a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128e9190613f89565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b6112fc823383612dec565b5050565b5f805160206145d58339815191525f6113188361176b565b90505f806113298360400151611eb9565b915091508061138b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610367565b5f828152600585016020526040812080546113a590613eb3565b90501180156113d7575060015f83815260078601602052604090205460ff1660058111156113d5576113d5613eeb565b145b6113f35760405162461bcd60e51b81526004016103679061432f565b5f828152600585016020526040812061140b91613bb7565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145d583398151915292919061150190613eb3565b9050118015611533575060015f83815260078301602052604090205460ff16600581111561153157611531613eeb565b145b61154f5760405162461bcd60e51b81526004016103679061432f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613eff565b5f805160206145b58339815191525f6115a08461176b565b90505f806115b1836040015161194c565b50915091506115c08286611d8b565b5f82815260048501602090815260408083206001600160a01b038916845290915281206115ec91613bb7565b5f6115f683611c90565b9050816001600160401b031681606001516001600160401b0316101561162e5760405162461bcd60e51b815260040161036790613fa0565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156116805760405162461bcd60e51b815260040161036790613fe2565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff1660048111156116ba576116ba613eeb565b146116d75760405162461bcd60e51b81526004016103679061402b565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b691016112e0565b60408051606080820183525f8083526020830181905292820152905f805160206145d58339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156117e0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261180791908101906140fa565b915091508061186e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610367565b82548251146118d15760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610367565b60208201516001600160a01b0316156119445760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610367565b509392505050565b5f805f83516036146119705760405162461bcd60e51b815260040161036790614376565b5f805b60028110156119bf576119878160016143bf565b6119929060086140b6565b61ffff168682815181106119a8576119a86143d2565b016020015160f81c901b9190911790600101611973565b5061ffff8116156119e25760405162461bcd60e51b8152600401610367906143e6565b5f805b6004811015611a3d576119f98160036143bf565b611a049060086140b6565b63ffffffff1687611a16836002614429565b81518110611a2657611a266143d2565b016020015160f81c901b91909117906001016119e5565b5063ffffffff8116600314611a645760405162461bcd60e51b81526004016103679061443c565b5f805b6020811015611ab957611a7b81601f6143bf565b611a869060086140b6565b88611a92836006614429565b81518110611aa257611aa26143d2565b016020015160f81c901b9190911790600101611a67565b505f805b6008811015611b1857611ad18160076143bf565b611adc9060086140b6565b6001600160401b031689611af1836026614429565b81518110611b0157611b016143d2565b016020015160f81c901b9190911790600101611abd565b505f805b6008811015611b7757611b308160076143bf565b611b3b9060086140b6565b6001600160401b03168a611b5083602e614429565b81518110611b6057611b606143d2565b016020015160f81c901b9190911790600101611b1c565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206145b5833981519152929190611be390613eb3565b9050118015611c29575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611c2757611c27613eeb565b145b6103e95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b6064820152608401610367565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061461583398151915290528390208351918201909352825491925f805160206145d583398151915292829060ff166005811115611d1057611d10613eeb565b6005811115611d2157611d21613eeb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206145b5833981519152929190611de790613eb3565b9050118015611e2d575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611e2b57611e2b613eeb565b145b6103e95760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e670000000000000000006064820152608401610367565b611ea761317c565b611eb0826131c7565b6112fc8161320d565b5f808251602714611edc5760405162461bcd60e51b815260040161036790614376565b5f805b6002811015611f2b57611ef38160016143bf565b611efe9060086140b6565b61ffff16858281518110611f1457611f146143d2565b016020015160f81c901b9190911790600101611edf565b5061ffff811615611f4e5760405162461bcd60e51b8152600401610367906143e6565b5f805b6004811015611fa957611f658160036143bf565b611f709060086140b6565b63ffffffff1686611f82836002614429565b81518110611f9257611f926143d2565b016020015160f81c901b9190911790600101611f51565b5063ffffffff8116600214611fd05760405162461bcd60e51b81526004016103679061443c565b5f805b602081101561202557611fe781601f6143bf565b611ff29060086140b6565b87611ffe836006614429565b8151811061200e5761200e6143d2565b016020015160f81c901b9190911790600101611fd3565b505f8660268151811061203a5761203a6143d2565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461207d5760405162461bcd60e51b815260040161036790614376565b5f805b60028110156120cc576120948160016143bf565b61209f9060086140b6565b61ffff168582815181106120b5576120b56143d2565b016020015160f81c901b9190911790600101612080565b5061ffff8116156120ef5760405162461bcd60e51b8152600401610367906143e6565b5f805b600481101561214a576121068160036143bf565b6121119060086140b6565b63ffffffff1686612123836002614429565b81518110612133576121336143d2565b016020015160f81c901b91909117906001016120f2565b5063ffffffff81166004146121715760405162461bcd60e51b81526004016103679061443c565b5f805b60208110156121c65761218881601f6143bf565b6121939060086140b6565b8761219f836006614429565b815181106121af576121af6143d2565b016020015160f81c901b9190911790600101612174565b505f805b6008811015612225576121de8160076143bf565b6121e99060086140b6565b6001600160401b0316886121fe836026614429565b8151811061220e5761220e6143d2565b016020015160f81c901b91909117906001016121ca565b5090969095509350505050565b5f8181525f805160206146158339815191526020526040808220815160e0810190925280545f805160206145d583398151915293929190829060ff16600581111561227f5761227f613eeb565b600581111561229057612290613eeb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561230a5761230a613eeb565b146123275760405162461bcd60e51b815260040161036790614483565b60408101516001600160a01b0316336001600160a01b0316146123a15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610367565b6123ae81608001516132c1565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123f2576123f2613eeb565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124a6846124a081612a65565b5f612bcf565b5f85815260068501602052604090209091506124c2828261423e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124ef9085906004016142fd565b6020604051808303815f875af115801561250b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252f9190613f89565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145b58339815191528161259d84613462565b90505f6125a982610784565b83549091506001600160401b038216108015906125d357508260010154816001600160401b031611155b610edb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610367565b5f61263a613498565b5f805160206145d5833981519152426001600160401b03851611801561267457506001600160401b038416612672426202a300614429565b115b6126d65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610367565b8561272d5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610367565b5f8681526008820160205260409020541561279b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610367565b82516030146128025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610367565b61280b856132c1565b5f806128526040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134cf565b5f82815260058601602052604090209193509150612870828261423e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061289d9085906004016142fd565b6020604051808303815f875af11580156128b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128dd9190613f89565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561295657612956613eeb565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556129ff83612a65565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610edb60015f805160206145f583398151915255565b5f8181525f805160206146158339815191526020526040812060020180545f805160206145d583398151915291600160a01b9091046001600160401b03169081906014612ab1836144c9565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061461583398151915260205260409020815181545f805160206145d58339815191529284929091829060ff19166001836005811115612b2a57612b2a613eeb565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612c4857612c088160016143bf565b612c139060086140b6565b5081515f90839083908110612c2a57612c2a6143d2565b60200101906001600160f81b03191690815f1a905350600101612bf4565b505f5b6004811015612cab57612c5f8160036143bf565b612c6a9060086140b6565b6001901c60f81b82612c7d836002614429565b81518110612c8d57612c8d6143d2565b60200101906001600160f81b03191690815f1a905350600101612c4b565b505f5b6020811015612d0d57612cc281601f6143bf565b612ccd9060086140b6565b86901c60f81b82612cdf836006614429565b81518110612cef57612cef6143d2565b60200101906001600160f81b03191690815f1a905350600101612cae565b505f5b6008811015612d7857612d248160076143bf565b612d2f9060086140b6565b6001600160401b038616901c60f81b82612d4a836026614429565b81518110612d5a57612d5a6143d2565b60200101906001600160f81b03191690815f1a905350600101612d10565b505f5b6008811015612de357612d8f8160076143bf565b612d9a9060086140b6565b6001600160401b038516901c60f81b82612db583602e614429565b81518110612dc557612dc56143d2565b60200101906001600160f81b03191690815f1a905350600101612d7b565b50949350505050565b612df4613498565b5f612e0161016683613462565b90505f805160206145b58339815191525f612e1b86611c90565b9050600281516005811115612e3257612e32613eeb565b14612e4f5760405162461bcd60e51b815260040161036790614483565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b031615612ee55760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b6064820152608401610367565b612eee836132c1565b8281608001818151612f0091906144ee565b6001600160401b0316905250612f168682612ae0565b5f612f2087612a65565b90505f612f3288838560800151612bcf565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612f62828261423e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f8f9085906004016142fd565b6020604051808303815f875af1158015612fab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fcf9190613f89565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff1916600183600481111561305057613050613eeb565b02179055506020820151815460408085015160608601516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0267ffffffffffffffff60481b199683166101000296909616610100600160881b03199095169490941794909417169190911783556080808501516001909401805460a0909601518416600160401b026001600160801b0319909616949093169390931793909317905585015190516001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b91613158918c918a906001600160401b0393841681529183166020830152909116604082015260600190565b60405180910390a45050505050506103e960015f805160206145f583398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166131c557604051631afcd79f60e31b815260040160405180910390fd5b565b6131cf61317c565b6131d881613887565b61320a606082013560808301356131f560c0850160a08601613d04565b61320560e0860160c0870161450e565b6138a8565b50565b61321561317c565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132a15760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610367565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145d58339815191529060ff165f036132ff575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061334790836143bf565b10613363576001600160401b0384166040830152808252613382565b838260400181815161337591906144ee565b6001600160401b03169052505b5f8260200151836040015160646133999190614529565b6133a39190614554565b600285015490915060ff908116908216111561341e5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610367565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610794827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613903565b5f805160206145f58339815191528054600119016134c957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135395760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610367565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135b0576135708160016143bf565b61357b9060086140b6565b5081515f90839083908110613592576135926143d2565b60200101906001600160f81b03191690815f1a90535060010161355c565b505f5b600481101561360e576135c78160036143bf565b6135d29060086140b6565b505f826135e0836002614429565b815181106135f0576135f06143d2565b60200101906001600160f81b03191690815f1a9053506001016135b3565b505f5b602081101561366b578451816020811061362d5761362d6143d2565b1a60f81b8261363d836006614429565b8151811061364d5761364d6143d2565b60200101906001600160f81b03191690815f1a905350600101613611565b505f5b60208110156136cb578460200151816020811061368d5761368d6143d2565b1a60f81b8261369d836026614429565b815181106136ad576136ad6143d2565b60200101906001600160f81b03191690815f1a90535060010161366e565b505f5b600881101561373f576136e28160076143bf565b6136ed9060086140b6565b60ff1685604001516001600160401b0316901c60f81b828260466137119190614429565b81518110613721576137216143d2565b60200101906001600160f81b03191690815f1a9053506001016136ce565b505f5b60308110156137aa5784608001518181518110613761576137616143d2565b01602001516001600160f81b0319168261377c83604e614429565b8151811061378c5761378c6143d2565b60200101906001600160f81b03191690815f1a905350600101613742565b505f5b600881101561381c576137c18160076143bf565b6137cc9060086140b6565b60608601516001600160401b0390811691161c60f81b826137ee83607e614429565b815181106137fe576137fe6143d2565b60200101906001600160f81b03191690815f1a9053506001016137ad565b5060028160405161382d9190614579565b602060405180830381855afa158015613848573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061386b9190613f89565b94909350915050565b60015f805160206145f583398151915255565b61388f61317c565b613897613a65565b61389f613a75565b61320a81613a7d565b6138b061317c565b5f5f805160206145b5833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613949573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061396d9190613f89565b90506139846001600160a01b038516333086613ae9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139ec9190613f89565b9050818111613a525760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610367565b613a5c82826143bf565b95945050505050565b613a6d61317c565b6131c5613b43565b6131c561317c565b613a8561317c565b80355f805160206145d583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613acf6060830160408401614594565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610670908590613b4b565b61387461317c565b5f8060205f8451602086015f885af180613b6a576040513d5f823e3d81fd5b50505f513d91508115613b81578060011415613b8e565b6001600160a01b0384163b155b1561067057604051635274afe760e01b81526001600160a01b0385166004820152602401610367565b508054613bc390613eb3565b5f825580601f10613bd2575050565b601f0160209004905f5260205f209081019061320a91905b80821115613bfd575f8155600101613bea565b5090565b5f60208284031215613c11575f80fd5b5035919050565b803563ffffffff81168114613c2b575f80fd5b919050565b6001600160a01b038116811461320a575f80fd5b5f8060408385031215613c55575f80fd5b613c5e83613c18565b91506020830135613c6e81613c30565b809150509250929050565b5f8060408385031215613c8a575f80fd5b823591506020830135613c6e81613c30565b5f80828403610100811215613caf575f80fd5b60e0811215613cbc575f80fd5b5082915060e0830135613c6e81613c30565b5f60208284031215613cde575f80fd5b613ce782613c18565b9392505050565b80356001600160401b0381168114613c2b575f80fd5b5f60208284031215613d14575f80fd5b613ce782613cee565b801515811461320a575f80fd5b5f805f60608486031215613d3c575f80fd5b833592506020840135613d4e81613d1d565b9150613d5c60408501613c18565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d9b57613d9b613d65565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613dc957613dc9613d65565b604052919050565b5f6001600160401b03821115613de957613de9613d65565b50601f01601f191660200190565b5f805f8060808587031215613e0a575f80fd5b8435935060208501359250613e2160408601613cee565b915060608501356001600160401b03811115613e3b575f80fd5b8501601f81018713613e4b575f80fd5b8035613e5e613e5982613dd1565b613da1565b818152886020838501011115613e72575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ea4575f80fd5b50508035926020909101359150565b600181811c90821680613ec757607f821691505b602082108103613ee557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613f1181613eb3565b806020870152604060018084165f8114613f325760018114613f4e57613f7b565b60ff19851660408a0152604084151560051b8a01019550613f7b565b895f5260205f205f5b85811015613f725781548b8201860152908301908801613f57565b8a016040019650505b509398975050505050505050565b5f60208284031215613f99575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826140b1576140b161407b565b500490565b80820281158282048414176107945761079461408f565b5f5b838110156140e75781810151838201526020016140cf565b50505f910152565b8051613c2b81613d1d565b5f806040838503121561410b575f80fd5b82516001600160401b0380821115614121575f80fd5b9084019060608287031215614134575f80fd5b61413c613d79565b8251815260208084015161414f81613c30565b82820152604084015183811115614164575f80fd5b80850194505087601f850112614178575f80fd5b83519250614188613e5984613dd1565b838152888285870101111561419b575f80fd5b6141aa848383018488016140cd565b806040840152508195506141bf8188016140ef565b9450505050509250929050565b6001600160401b038281168282160390808211156141ec576141ec61408f565b5092915050565b601f8211156103e957805f5260205f20601f840160051c810160208510156142185750805b601f840160051c820191505b81811015614237575f8155600101614224565b5050505050565b81516001600160401b0381111561425757614257613d65565b61426b816142658454613eb3565b846141f3565b602080601f83116001811461429e575f84156142875750858301515b5f19600386901b1c1916600185901b1785556142f5565b5f85815260208120601f198616915b828110156142cc578886015182559484019460019091019084016142ad565b50858210156142e957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f825180602084015261431b8160408501602087016140cd565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156107945761079461408f565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156107945761079461408f565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b038083168181036144e4576144e461408f565b6001019392505050565b6001600160401b038181168382160190808211156141ec576141ec61408f565b5f6020828403121561451e575f80fd5b8135613ce781613c30565b6001600160401b0381811683821602808216919082811461454c5761454c61408f565b505092915050565b5f6001600160401b038084168061456d5761456d61407b565b92169190910492915050565b5f825161458a8184602087016140cd565b9190910192915050565b5f602082840312156145a4575f80fd5b813560ff81168114613ce7575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 11e72af7a..b294b6904 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516144e43803806144e483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143978061014d5f395ff3fe6080604052600436106100f9575f3560e01c80636a7e3d8311610092578063b771b3bc11610062578063b771b3bc1461029e578063bee0a03f146102d0578063c599e24f146102ef578063d61bed7414610302578063f40797d714610321575f80fd5b80636a7e3d831461022257806376f7862114610241578063927e7e7514610260578063a3a65e481461027f575f80fd5b80632e2194d8116100cd5780632e2194d81461017b578063467ef06f146101b757806362065856146101d657806366435abf14610203575f80fd5b8062e41792146100fd5780630322ed981461011e5780630915204e1461013d5780630b77f6931461015c575b5f80fd5b348015610108575f80fd5b5061011c6101173660046139a7565b610334565b005b348015610129575f80fd5b5061011c6101383660046139bd565b610440565b348015610148575f80fd5b5061011c610157366004613a00565b6105a1565b348015610167575f80fd5b5061011c610176366004613a35565b610772565b348015610186575f80fd5b5061019a6101953660046139bd565b61083a565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101c2575f80fd5b5061011c6101d1366004613a58565b610850565b3480156101e1575f80fd5b506101f56101f0366004613a8e565b610bac565b6040519081526020016101ae565b34801561020e575f80fd5b5061019a61021d3660046139bd565b610bc5565b34801561022d575f80fd5b5061011c61023c366004613a35565b610bd9565b34801561024c575f80fd5b5061011c61025b366004613ab4565b610c5b565b34801561026b575f80fd5b5061011c61027a3660046139bd565b610f74565b34801561028a575f80fd5b5061011c610299366004613a58565b611386565b3480156102a9575f80fd5b506102b86005600160991b0181565b6040516001600160a01b0390911681526020016101ae565b3480156102db575f80fd5b5061011c6102ea3660046139bd565b61153a565b61011c6102fd3660046139bd565b611609565b34801561030d575f80fd5b5061011c61031c366004613a00565b611617565b6101f561032f366004613b81565b611813565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f286611835565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061432b83398151915292919061048890613c13565b90501180156104ba575060035f83815260078301602052604090205460ff1660058111156104b8576104b8613c45565b145b6105235760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613c59565b6020604051808303815f875af1158015610578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059c9190613ce3565b505050565b5f8051602061430b8339815191525f6105b984611846565b90505f806105ca8360400151611a27565b50915091506105d98286611c62565b5f82815260058501602090815260408083206001600160a01b038916845290915281206106059161395d565b5f61060f83611d75565b9050816001600160401b031681606001516001600160401b031610156106475760405162461bcd60e51b815260040161051a90613cfa565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156106995760405162461bcd60e51b815260040161051a90613d3c565b60035f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff1660048111156106dd576106dd613c45565b146106fa5760405162461bcd60e51b815260040161051a90613d85565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320600101805460ff60401b191668040000000000000000179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b61077c8282611e70565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061430b833981519152916005600160991b019163ee5b48eb916107f491600401613c59565b6020604051808303815f875af1158015610810573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108349190613ce3565b50505050565b5f61084a64e8d4a5100083613dfd565b92915050565b5f8051602061432b8339815191525f61086883611846565b90505f806108798360400151611f8e565b9150915080156108de5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161051a565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561090f5761090f613c45565b600581111561092057610920613c45565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561099957610999613c45565b14806109b757506001825160058111156109b5576109b5613c45565b145b610a165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161051a565b600382516005811115610a2b57610a2b613c45565b03610a5257505f8381526006860160205260408120600491610a4d919061395d565b610a56565b5060055b6020808301515f90815260088801909152604081205581816005811115610a7f57610a7f613c45565b90816005811115610a9257610a92613c45565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ac657610ac6613c45565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610b7957610b79613c45565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61084a6001600160401b03831664e8d4a51000613e10565b5f610bcf82611d75565b6080015192915050565b610be38282611c62565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f8051602061430b833981519152916005600160991b019163ee5b48eb916107f491600401613c59565b8115610f6b575f5f8051602061430b8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610cbc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ce39190810190613e54565b9150915080610d465760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161051a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dad9190613ce3565b825114610e115760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161051a565b60208201516001600160a01b031615610e875760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161051a565b5f80610e96846040015161212f565b91509150818814610f035760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161051a565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61059c83612307565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602090815260408083203384528252808320815160c08101835281546001600160401b038082168352600160401b808304821696840196909652600160801b8204811694830194909452600160c01b900483166060820152600182015492831660808201525f8051602061430b8339815191529493909260a0840191900460ff16600481111561102b5761102b613c45565b600481111561103c5761103c613c45565b905250905060028160a00151600481111561105957611059613c45565b146110b55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161051a565b5f6110bf84612659565b9050600360a08301819052506001600160401b0342811660408085019190915290821660808401525f8581526003850160205290812083916110fe3390565b6001600160a01b0316815260208082019290925260409081015f2083518154938501519285015160608601516001600160401b039283166001600160801b031990961695909517600160401b9483168502176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b94821694909402939093178155608084015160018201805467ffffffffffffffff19811692909516918217815560a086015192949293909268ffffffffffffffffff1916909117908360048111156111ce576111ce613c45565b02179055509050505f6111e085611d75565b9050825f01516001600160401b031681608001516001600160401b0316116112565760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161051a565b8251608082018051611269908390613f26565b6001600160401b031690525061127f85826126d4565b5f61128f868484608001516127c3565b5f878152600587016020908152604080832033845290915290209091506112b68282613f98565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112e3908590600401614053565b6020604051808303815f875af11580156112ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113239190613ce3565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b5f8051602061432b8339815191525f61139e83611846565b90505f806113af8360400151611f8e565b91509150806114115760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161051a565b5f8281526005850160205260408120805461142b90613c13565b905011801561145d575060015f83815260078601602052604090205460ff16600581111561145b5761145b613c45565b145b6114795760405162461bcd60e51b815260040161051a90614085565b5f82815260058501602052604081206114919161395d565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061432b83398151915292919061158290613c13565b90501180156115b4575060015f83815260078301602052604090205460ff1660058111156115b2576115b2613c45565b145b6115d05760405162461bcd60e51b815260040161051a90614085565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613c59565b6116148133346129e0565b50565b5f8051602061430b8339815191525f61162f84611846565b90505f806116408360400151611a27565b509150915061164f8286611e70565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061167b9161395d565b5f61168583611d75565b9050816001600160401b031681606001516001600160401b031610156116bd5760405162461bcd60e51b815260040161051a90613cfa565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020546001600160401b03808416600160c01b9092041611156117135760405162461bcd60e51b815260040161051a90613d3c565b60015f84815260038701602090815260408083206001600160a01b038b168452909152902060010154600160401b900460ff16600481111561175757611757613c45565b146117745760405162461bcd60e51b815260040161051a90613d85565b5f83815260038601602090815260408083206001600160a01b038a168085529083529281902060018101805460ff60401b191668020000000000000000179055805467ffffffffffffffff60401b1916600160401b426001600160401b03818116929092029290921790925591519182528516929186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101611375565b5f8061181e34612d59565b905061182c85828686612e03565b95945050505050565b61183d613237565b61161481613282565b60408051606080820183525f8083526020830181905292820152905f8051602061432b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118bb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118e29190810190613e54565b91509150806119495760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161051a565b82548251146119ac5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161051a565b60208201516001600160a01b031615611a1f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161051a565b509392505050565b5f805f8351603614611a4b5760405162461bcd60e51b815260040161051a906140cc565b5f805b6002811015611a9a57611a62816001614115565b611a6d906008613e10565b61ffff16868281518110611a8357611a83614128565b016020015160f81c901b9190911790600101611a4e565b5061ffff811615611abd5760405162461bcd60e51b815260040161051a9061413c565b5f805b6004811015611b1857611ad4816003614115565b611adf906008613e10565b63ffffffff1687611af183600261417f565b81518110611b0157611b01614128565b016020015160f81c901b9190911790600101611ac0565b5063ffffffff8116600314611b3f5760405162461bcd60e51b815260040161051a90614192565b5f805b6020811015611b9457611b5681601f614115565b611b61906008613e10565b88611b6d83600661417f565b81518110611b7d57611b7d614128565b016020015160f81c901b9190911790600101611b42565b505f805b6008811015611bf357611bac816007614115565b611bb7906008613e10565b6001600160401b031689611bcc83602661417f565b81518110611bdc57611bdc614128565b016020015160f81c901b9190911790600101611b98565b505f805b6008811015611c5257611c0b816007614115565b611c16906008613e10565b6001600160401b03168a611c2b83602e61417f565b81518110611c3b57611c3b614128565b016020015160f81c901b9190911790600101611bf7565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f8051602061430b833981519152929190611cbe90613c13565b9050118015611d0e575060035f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff166004811115611d0c57611d0c613c45565b145b61059c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161051a565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061436b83398151915290528390208351918201909352825491925f8051602061432b83398151915292829060ff166005811115611df557611df5613c45565b6005811115611e0657611e06613c45565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f8051602061430b833981519152929190611ecc90613c13565b9050118015611f1c575060015f84815260038301602090815260408083206001600160a01b0387168452909152902060010154600160401b900460ff166004811115611f1a57611f1a613c45565b145b61059c5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161051a565b5f808251602714611fb15760405162461bcd60e51b815260040161051a906140cc565b5f805b600281101561200057611fc8816001614115565b611fd3906008613e10565b61ffff16858281518110611fe957611fe9614128565b016020015160f81c901b9190911790600101611fb4565b5061ffff8116156120235760405162461bcd60e51b815260040161051a9061413c565b5f805b600481101561207e5761203a816003614115565b612045906008613e10565b63ffffffff168661205783600261417f565b8151811061206757612067614128565b016020015160f81c901b9190911790600101612026565b5063ffffffff81166002146120a55760405162461bcd60e51b815260040161051a90614192565b5f805b60208110156120fa576120bc81601f614115565b6120c7906008613e10565b876120d383600661417f565b815181106120e3576120e3614128565b016020015160f81c901b91909117906001016120a8565b505f8660268151811061210f5761210f614128565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146121525760405162461bcd60e51b815260040161051a906140cc565b5f805b60028110156121a157612169816001614115565b612174906008613e10565b61ffff1685828151811061218a5761218a614128565b016020015160f81c901b9190911790600101612155565b5061ffff8116156121c45760405162461bcd60e51b815260040161051a9061413c565b5f805b600481101561221f576121db816003614115565b6121e6906008613e10565b63ffffffff16866121f883600261417f565b8151811061220857612208614128565b016020015160f81c901b91909117906001016121c7565b5063ffffffff81166004146122465760405162461bcd60e51b815260040161051a90614192565b5f805b602081101561229b5761225d81601f614115565b612268906008613e10565b8761227483600661417f565b8151811061228457612284614128565b016020015160f81c901b9190911790600101612249565b505f805b60088110156122fa576122b3816007614115565b6122be906008613e10565b6001600160401b0316886122d383602661417f565b815181106122e3576122e3614128565b016020015160f81c901b919091179060010161229f565b5090969095509350505050565b5f8181525f8051602061436b8339815191526020526040808220815160e0810190925280545f8051602061432b83398151915293929190829060ff16600581111561235457612354613c45565b600581111561236557612365613c45565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123df576123df613c45565b146123fc5760405162461bcd60e51b815260040161051a906141d9565b60408101516001600160a01b0316336001600160a01b0316146124765760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161051a565b61248381608001516132c5565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124c7576124c7613c45565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61257b8461257581612659565b5f6127c3565b5f85815260068501602052604090209091506125978282613f98565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125c4908590600401614053565b6020604051808303815f875af11580156125e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126049190613ce3565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f8051602061436b8339815191526020526040812060020180545f8051602061432b83398151915291600160a01b9091046001600160401b031690819060146126a58361421f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061436b83398151915260205260409020815181545f8051602061432b8339815191529284929091829060ff1916600183600581111561271e5761271e613c45565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561283c576127fc816001614115565b612807906008613e10565b5081515f9083908390811061281e5761281e614128565b60200101906001600160f81b03191690815f1a9053506001016127e8565b505f5b600481101561289f57612853816003614115565b61285e906008613e10565b6001901c60f81b8261287183600261417f565b8151811061288157612881614128565b60200101906001600160f81b03191690815f1a90535060010161283f565b505f5b6020811015612901576128b681601f614115565b6128c1906008613e10565b86901c60f81b826128d383600661417f565b815181106128e3576128e3614128565b60200101906001600160f81b03191690815f1a9053506001016128a2565b505f5b600881101561296c57612918816007614115565b612923906008613e10565b6001600160401b038616901c60f81b8261293e83602661417f565b8151811061294e5761294e614128565b60200101906001600160f81b03191690815f1a905350600101612904565b505f5b60088110156129d757612983816007614115565b61298e906008613e10565b6001600160401b038516901c60f81b826129a983602e61417f565b815181106129b9576129b9614128565b60200101906001600160f81b03191690815f1a90535060010161296f565b50949350505050565b6129e8613466565b5f6129f28261083a565b90505f8051602061430b8339815191525f612a0c86611d75565b9050600281516005811115612a2357612a23613c45565b14612a405760405162461bcd60e51b815260040161051a906141d9565b5f86815260038301602090815260408083206001600160a01b03891684529091529020546001600160401b031615612ad15760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161051a565b612ada836132c5565b8281608001818151612aec9190614244565b6001600160401b0316905250612b0286826126d4565b5f612b0c87612659565b90505f612b1e888385608001516127c3565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612b4e8282613f98565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b7b908590600401614053565b6020604051808303815f875af1158015612b97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bbb9190613ce3565b6040805160c0810182526001600160401b03808a1682525f6020830181905292820183905286166060820152608081019190915290915060a08101600190525f8a815260038701602090815260408083206001600160a01b038d16845282529182902083518154928501519385015160608601516001600160401b039283166001600160801b031990951694909417600160401b9583168602176001600160801b0316600160801b918316919091026001600160c01b031617600160c01b93821693909302929092178155608084015160018201805467ffffffffffffffff19811692909416918217815560a086015192949293909268ffffffffffffffffff1990911690911790836004811115612cd557612cd5613c45565b021790555050506080840151604080516001600160401b03808a1682529283166020820152918516908201526001600160a01b0389169082908b907feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b9060600160405180910390a450505050505061059c60015f8051602061434b83398151915255565b5f5f8051602061430b8339815191528282612d738261083a565b83549091506001600160401b03821610801590612d9d57508260010154816001600160401b031611155b612dfb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161051a565b949350505050565b5f612e0c613466565b5f8051602061432b833981519152426001600160401b038516118015612e4657506001600160401b038416612e44426202a30061417f565b115b612ea85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161051a565b85612eff5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161051a565b5f86815260088201602052604090205415612f6d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161051a565b8251603014612fd45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161051a565b612fdd856132c5565b5f806130246040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134b0565b5f828152600586016020526040902091935091506130428282613f98565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061306f908590600401614053565b6020604051808303815f875af115801561308b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130af9190613ce3565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561312857613128613c45565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556131d183612659565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612dfb60015f8051602061434b83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661328057604051631afcd79f60e31b815260040160405180910390fd5b565b61328a613237565b61329381613855565b611614606082013560808301356132b060c0850160a08601613a8e565b6132c060e0860160c08701614264565b613876565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061432b8339815191529060ff165f03613303575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061334b9083614115565b10613367576001600160401b0384166040830152808252613386565b83826040018181516133799190614244565b6001600160401b03169052505b5f82602001518360400151606461339d919061427f565b6133a791906142aa565b600285015490915060ff90811690821611156134225760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161051a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061434b83398151915280546001190161349757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061434b83398151915255565b5f606082608001515160301461351a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161051a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561359157613551816001614115565b61355c906008613e10565b5081515f9083908390811061357357613573614128565b60200101906001600160f81b03191690815f1a90535060010161353d565b505f5b60048110156135ef576135a8816003614115565b6135b3906008613e10565b505f826135c183600261417f565b815181106135d1576135d1614128565b60200101906001600160f81b03191690815f1a905350600101613594565b505f5b602081101561364c578451816020811061360e5761360e614128565b1a60f81b8261361e83600661417f565b8151811061362e5761362e614128565b60200101906001600160f81b03191690815f1a9053506001016135f2565b505f5b60208110156136ac578460200151816020811061366e5761366e614128565b1a60f81b8261367e83602661417f565b8151811061368e5761368e614128565b60200101906001600160f81b03191690815f1a90535060010161364f565b505f5b6008811015613720576136c3816007614115565b6136ce906008613e10565b60ff1685604001516001600160401b0316901c60f81b828260466136f2919061417f565b8151811061370257613702614128565b60200101906001600160f81b03191690815f1a9053506001016136af565b505f5b603081101561378b578460800151818151811061374257613742614128565b01602001516001600160f81b0319168261375d83604e61417f565b8151811061376d5761376d614128565b60200101906001600160f81b03191690815f1a905350600101613723565b505f5b60088110156137fd576137a2816007614115565b6137ad906008613e10565b60608601516001600160401b0390811691161c60f81b826137cf83607e61417f565b815181106137df576137df614128565b60200101906001600160f81b03191690815f1a90535060010161378e565b5060028160405161380e91906142cf565b602060405180830381855afa158015613829573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061384c9190613ce3565b94909350915050565b61385d613237565b6138656138d1565b61386d6138e1565b611614816138e9565b61387e613237565b5f5f8051602061430b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6138d9613237565b613280613955565b613280613237565b6138f1613237565b80355f8051602061432b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561393b60608301604084016142ea565b600291909101805460ff191660ff90921691909117905550565b61349d613237565b50805461396990613c13565b5f825580601f10613978575050565b601f0160209004905f5260205f209081019061161491905b808211156139a3575f8155600101613990565b5090565b5f60e082840312156139b7575f80fd5b50919050565b5f602082840312156139cd575f80fd5b5035919050565b803563ffffffff811681146139e7575f80fd5b919050565b6001600160a01b0381168114611614575f80fd5b5f8060408385031215613a11575f80fd5b613a1a836139d4565b91506020830135613a2a816139ec565b809150509250929050565b5f8060408385031215613a46575f80fd5b823591506020830135613a2a816139ec565b5f60208284031215613a68575f80fd5b613a71826139d4565b9392505050565b80356001600160401b03811681146139e7575f80fd5b5f60208284031215613a9e575f80fd5b613a7182613a78565b8015158114611614575f80fd5b5f805f60608486031215613ac6575f80fd5b833592506020840135613ad881613aa7565b9150613ae6604085016139d4565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b2557613b25613aef565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b5357613b53613aef565b604052919050565b5f6001600160401b03821115613b7357613b73613aef565b50601f01601f191660200190565b5f805f60608486031215613b93575f80fd5b83359250613ba360208501613a78565b915060408401356001600160401b03811115613bbd575f80fd5b8401601f81018613613bcd575f80fd5b8035613be0613bdb82613b5b565b613b2b565b818152876020838501011115613bf4575f80fd5b816020840160208301375f602083830101528093505050509250925092565b600181811c90821680613c2757607f821691505b6020821081036139b757634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613c6b81613c13565b806020870152604060018084165f8114613c8c5760018114613ca857613cd5565b60ff19851660408a0152604084151560051b8a01019550613cd5565b895f5260205f205f5b85811015613ccc5781548b8201860152908301908801613cb1565b8a016040019650505b509398975050505050505050565b5f60208284031215613cf3575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613e0b57613e0b613dd5565b500490565b808202811582820484141761084a5761084a613de9565b5f5b83811015613e41578181015183820152602001613e29565b50505f910152565b80516139e781613aa7565b5f8060408385031215613e65575f80fd5b82516001600160401b0380821115613e7b575f80fd5b9084019060608287031215613e8e575f80fd5b613e96613b03565b82518152602080840151613ea9816139ec565b82820152604084015183811115613ebe575f80fd5b80850194505087601f850112613ed2575f80fd5b83519250613ee2613bdb84613b5b565b8381528882858701011115613ef5575f80fd5b613f0484838301848801613e27565b80604084015250819550613f19818801613e49565b9450505050509250929050565b6001600160401b03828116828216039080821115613f4657613f46613de9565b5092915050565b601f82111561059c57805f5260205f20601f840160051c81016020851015613f725750805b601f840160051c820191505b81811015613f91575f8155600101613f7e565b5050505050565b81516001600160401b03811115613fb157613fb1613aef565b613fc581613fbf8454613c13565b84613f4d565b602080601f831160018114613ff8575f8415613fe15750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b8281101561402657888601518255948401946001909101908401614007565b508582101561404357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f8251806020840152614071816040850160208701613e27565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561084a5761084a613de9565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561084a5761084a613de9565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361423a5761423a613de9565b6001019392505050565b6001600160401b03818116838216019080821115613f4657613f46613de9565b5f60208284031215614274575f80fd5b8135613a71816139ec565b6001600160401b038181168382160280821691908281146142a2576142a2613de9565b505092915050565b5f6001600160401b03808416806142c3576142c3613dd5565b92169190910492915050565b5f82516142e0818460208701613e27565b9190910192915050565b5f602082840312156142fa575f80fd5b813560ff81168114613a71575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516144bb3803806144bb83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61436e8061014d5f395ff3fe6080604052600436106100f9575f3560e01c80636a7e3d8311610092578063b771b3bc11610062578063b771b3bc1461029e578063bee0a03f146102d0578063c599e24f146102ef578063d61bed7414610302578063f40797d714610321575f80fd5b80636a7e3d831461022257806376f7862114610241578063927e7e7514610260578063a3a65e481461027f575f80fd5b80632e2194d8116100cd5780632e2194d81461017b578063467ef06f146101b757806362065856146101d657806366435abf14610203575f80fd5b8062e41792146100fd5780630322ed981461011e5780630915204e1461013d5780630b77f6931461015c575b5f80fd5b348015610108575f80fd5b5061011c61011736600461397e565b610334565b005b348015610129575f80fd5b5061011c610138366004613994565b610440565b348015610148575f80fd5b5061011c6101573660046139d7565b6105a1565b348015610167575f80fd5b5061011c610176366004613a0c565b610761565b348015610186575f80fd5b5061019a610195366004613994565b610829565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101c2575f80fd5b5061011c6101d1366004613a2f565b61083f565b3480156101e1575f80fd5b506101f56101f0366004613a65565b610b9b565b6040519081526020016101ae565b34801561020e575f80fd5b5061019a61021d366004613994565b610bb4565b34801561022d575f80fd5b5061011c61023c366004613a0c565b610bc8565b34801561024c575f80fd5b5061011c61025b366004613a8b565b610c4a565b34801561026b575f80fd5b5061011c61027a366004613994565b610f63565b34801561028a575f80fd5b5061011c610299366004613a2f565b611371565b3480156102a9575f80fd5b506102b86005600160991b0181565b6040516001600160a01b0390911681526020016101ae565b3480156102db575f80fd5b5061011c6102ea366004613994565b61152a565b61011c6102fd366004613994565b6115f9565b34801561030d575f80fd5b5061011c61031c3660046139d7565b611607565b6101f561032f366004613b58565b6117ea565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f28661180c565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061430283398151915292919061048890613bea565b90501180156104ba575060035f83815260078301602052604090205460ff1660058111156104b8576104b8613c1c565b145b6105235760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613c30565b6020604051808303815f875af1158015610578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059c9190613cba565b505050565b5f805160206142e28339815191525f6105b98461181d565b90505f806105ca83604001516119fe565b50915091506105d98286611c39565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061060591613934565b5f61060f83611d42565b9050816001600160401b031681606001516001600160401b031610156106475760405162461bcd60e51b815260040161051a90613cd1565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b9092041611156106a05760405162461bcd60e51b815260040161051a90613d13565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff1660048111156106da576106da613c1c565b146106f75760405162461bcd60e51b815260040161051a90613d5c565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b61076b8282611e3d565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206142e2833981519152916005600160991b019163ee5b48eb916107e391600401613c30565b6020604051808303815f875af11580156107ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108239190613cba565b50505050565b5f61083964e8d4a5100083613dd4565b92915050565b5f805160206143028339815191525f6108578361181d565b90505f806108688360400151611f51565b9150915080156108cd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161051a565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156108fe576108fe613c1c565b600581111561090f5761090f613c1c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561098857610988613c1c565b14806109a657506001825160058111156109a4576109a4613c1c565b145b610a055760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161051a565b600382516005811115610a1a57610a1a613c1c565b03610a4157505f8381526006860160205260408120600491610a3c9190613934565b610a45565b5060055b6020808301515f90815260088801909152604081205581816005811115610a6e57610a6e613c1c565b90816005811115610a8157610a81613c1c565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ab557610ab5613c1c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610b6857610b68613c1c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6108396001600160401b03831664e8d4a51000613de7565b5f610bbe82611d42565b6080015192915050565b610bd28282611c39565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206142e2833981519152916005600160991b019163ee5b48eb916107e391600401613c30565b8115610f5a575f5f805160206142e28339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610cab573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cd29190810190613e2b565b9150915080610d355760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161051a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d9c9190613cba565b825114610e005760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161051a565b60208201516001600160a01b031615610e765760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161051a565b5f80610e8584604001516120f2565b91509150818814610ef25760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161051a565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61059c836122ca565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f805160206142e283398151915293929190829060ff166004811115610fce57610fce613c1c565b6004811115610fdf57610fdf613c1c565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a090910152905060028151600481111561104957611049613c1c565b146110a55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161051a565b5f6110af8461261c565b9050600382819052506001600160401b034281166060840152811660a08301525f848152600384016020526040812083916110e73390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff1916600183600481111561111d5761111d613c1c565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f6111c785611d42565b905082602001516001600160401b031681608001516001600160401b03161161123e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161051a565b8260200151816080018181516112549190613efd565b6001600160401b031690525061126a8582612697565b5f61127a86848460800151612786565b5f878152600587016020908152604080832033845290915290209091506112a18282613f6f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112ce90859060040161402a565b6020604051808303815f875af11580156112ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061130e9190613cba565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b5f805160206143028339815191525f6113898361181d565b90505f8061139a8360400151611f51565b91509150806113fc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161051a565b5f8281526005850160205260408120805461141690613bea565b9050118015611448575060015f83815260078601602052604090205460ff16600581111561144657611446613c1c565b145b6114645760405162461bcd60e51b815260040161051a9061405c565b5f828152600585016020526040812061147c91613934565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061430283398151915292919061157290613bea565b90501180156115a4575060015f83815260078301602052604090205460ff1660058111156115a2576115a2613c1c565b145b6115c05760405162461bcd60e51b815260040161051a9061405c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613c30565b6116048133346129a3565b50565b5f805160206142e28339815191525f61161f8461181d565b90505f8061163083604001516119fe565b509150915061163f8286611e3d565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061166b91613934565b5f61167583611d42565b9050816001600160401b031681606001516001600160401b031610156116ad5760405162461bcd60e51b815260040161051a90613cd1565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156116ff5760405162461bcd60e51b815260040161051a90613d13565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561173957611739613c1c565b146117565760405162461bcd60e51b815260040161051a90613d5c565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101611360565b5f806117f534612d30565b905061180385828686612dda565b95945050505050565b61181461320e565b61160481613259565b60408051606080820183525f8083526020830181905292820152905f805160206143028339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611892573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118b99190810190613e2b565b91509150806119205760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161051a565b82548251146119835760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161051a565b60208201516001600160a01b0316156119f65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161051a565b509392505050565b5f805f8351603614611a225760405162461bcd60e51b815260040161051a906140a3565b5f805b6002811015611a7157611a398160016140ec565b611a44906008613de7565b61ffff16868281518110611a5a57611a5a6140ff565b016020015160f81c901b9190911790600101611a25565b5061ffff811615611a945760405162461bcd60e51b815260040161051a90614113565b5f805b6004811015611aef57611aab8160036140ec565b611ab6906008613de7565b63ffffffff1687611ac8836002614156565b81518110611ad857611ad86140ff565b016020015160f81c901b9190911790600101611a97565b5063ffffffff8116600314611b165760405162461bcd60e51b815260040161051a90614169565b5f805b6020811015611b6b57611b2d81601f6140ec565b611b38906008613de7565b88611b44836006614156565b81518110611b5457611b546140ff565b016020015160f81c901b9190911790600101611b19565b505f805b6008811015611bca57611b838160076140ec565b611b8e906008613de7565b6001600160401b031689611ba3836026614156565b81518110611bb357611bb36140ff565b016020015160f81c901b9190911790600101611b6f565b505f805b6008811015611c2957611be28160076140ec565b611bed906008613de7565b6001600160401b03168a611c0283602e614156565b81518110611c1257611c126140ff565b016020015160f81c901b9190911790600101611bce565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206142e2833981519152929190611c9590613bea565b9050118015611cdb575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611cd957611cd9613c1c565b145b61059c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161051a565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061434283398151915290528390208351918201909352825491925f8051602061430283398151915292829060ff166005811115611dc257611dc2613c1c565b6005811115611dd357611dd3613c1c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206142e2833981519152929190611e9990613bea565b9050118015611edf575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611edd57611edd613c1c565b145b61059c5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161051a565b5f808251602714611f745760405162461bcd60e51b815260040161051a906140a3565b5f805b6002811015611fc357611f8b8160016140ec565b611f96906008613de7565b61ffff16858281518110611fac57611fac6140ff565b016020015160f81c901b9190911790600101611f77565b5061ffff811615611fe65760405162461bcd60e51b815260040161051a90614113565b5f805b600481101561204157611ffd8160036140ec565b612008906008613de7565b63ffffffff168661201a836002614156565b8151811061202a5761202a6140ff565b016020015160f81c901b9190911790600101611fe9565b5063ffffffff81166002146120685760405162461bcd60e51b815260040161051a90614169565b5f805b60208110156120bd5761207f81601f6140ec565b61208a906008613de7565b87612096836006614156565b815181106120a6576120a66140ff565b016020015160f81c901b919091179060010161206b565b505f866026815181106120d2576120d26140ff565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146121155760405162461bcd60e51b815260040161051a906140a3565b5f805b60028110156121645761212c8160016140ec565b612137906008613de7565b61ffff1685828151811061214d5761214d6140ff565b016020015160f81c901b9190911790600101612118565b5061ffff8116156121875760405162461bcd60e51b815260040161051a90614113565b5f805b60048110156121e25761219e8160036140ec565b6121a9906008613de7565b63ffffffff16866121bb836002614156565b815181106121cb576121cb6140ff565b016020015160f81c901b919091179060010161218a565b5063ffffffff81166004146122095760405162461bcd60e51b815260040161051a90614169565b5f805b602081101561225e5761222081601f6140ec565b61222b906008613de7565b87612237836006614156565b81518110612247576122476140ff565b016020015160f81c901b919091179060010161220c565b505f805b60088110156122bd576122768160076140ec565b612281906008613de7565b6001600160401b031688612296836026614156565b815181106122a6576122a66140ff565b016020015160f81c901b9190911790600101612262565b5090969095509350505050565b5f8181525f805160206143428339815191526020526040808220815160e0810190925280545f8051602061430283398151915293929190829060ff16600581111561231757612317613c1c565b600581111561232857612328613c1c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123a2576123a2613c1c565b146123bf5760405162461bcd60e51b815260040161051a906141b0565b60408101516001600160a01b0316336001600160a01b0316146124395760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161051a565b612446816080015161329c565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561248a5761248a613c1c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61253e846125388161261c565b5f612786565b5f858152600685016020526040902090915061255a8282613f6f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061258790859060040161402a565b6020604051808303815f875af11580156125a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c79190613cba565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f805160206143428339815191526020526040812060020180545f8051602061430283398151915291600160a01b9091046001600160401b03169081906014612668836141f6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061434283398151915260205260409020815181545f805160206143028339815191529284929091829060ff191660018360058111156126e1576126e1613c1c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156127ff576127bf8160016140ec565b6127ca906008613de7565b5081515f908390839081106127e1576127e16140ff565b60200101906001600160f81b03191690815f1a9053506001016127ab565b505f5b6004811015612862576128168160036140ec565b612821906008613de7565b6001901c60f81b82612834836002614156565b81518110612844576128446140ff565b60200101906001600160f81b03191690815f1a905350600101612802565b505f5b60208110156128c45761287981601f6140ec565b612884906008613de7565b86901c60f81b82612896836006614156565b815181106128a6576128a66140ff565b60200101906001600160f81b03191690815f1a905350600101612865565b505f5b600881101561292f576128db8160076140ec565b6128e6906008613de7565b6001600160401b038616901c60f81b82612901836026614156565b81518110612911576129116140ff565b60200101906001600160f81b03191690815f1a9053506001016128c7565b505f5b600881101561299a576129468160076140ec565b612951906008613de7565b6001600160401b038516901c60f81b8261296c83602e614156565b8151811061297c5761297c6140ff565b60200101906001600160f81b03191690815f1a905350600101612932565b50949350505050565b6129ab61343d565b5f6129b582610829565b90505f805160206142e28339815191525f6129cf86611d42565b90506002815160058111156129e6576129e6613c1c565b14612a035760405162461bcd60e51b815260040161051a906141b0565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b031615612a995760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161051a565b612aa28361329c565b8281608001818151612ab4919061421b565b6001600160401b0316905250612aca8682612697565b5f612ad48761261c565b90505f612ae688838560800151612786565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612b168282613f6f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b4390859060040161402a565b6020604051808303815f875af1158015612b5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b839190613cba565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff19166001836004811115612c0457612c04613c1c565b02179055506020820151815460408085015160608601516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0267ffffffffffffffff60481b199683166101000296909616610100600160881b03199095169490941794909417169190911783556080808501516001909401805460a0909601518416600160401b026001600160801b0319909616949093169390931793909317905585015190516001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b91612d0c918c918a906001600160401b0393841681529183166020830152909116604082015260600190565b60405180910390a450505050505061059c60015f8051602061432283398151915255565b5f5f805160206142e28339815191528282612d4a82610829565b83549091506001600160401b03821610801590612d7457508260010154816001600160401b031611155b612dd25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161051a565b949350505050565b5f612de361343d565b5f80516020614302833981519152426001600160401b038516118015612e1d57506001600160401b038416612e1b426202a300614156565b115b612e7f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161051a565b85612ed65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161051a565b5f86815260088201602052604090205415612f445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161051a565b8251603014612fab5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161051a565b612fb48561329c565b5f80612ffb6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613487565b5f828152600586016020526040902091935091506130198282613f6f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061304690859060040161402a565b6020604051808303815f875af1158015613062573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130869190613cba565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156130ff576130ff613c1c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556131a88361261c565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612dd260015f8051602061432283398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661325757604051631afcd79f60e31b815260040160405180910390fd5b565b61326161320e565b61326a8161382c565b6116046060820135608083013561328760c0850160a08601613a65565b61329760e0860160c0870161423b565b61384d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206143028339815191529060ff165f036132da575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061332290836140ec565b1061333e576001600160401b038416604083015280825261335d565b8382604001818151613350919061421b565b6001600160401b03169052505b5f8260200151836040015160646133749190614256565b61337e9190614281565b600285015490915060ff90811690821611156133f95760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161051a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061432283398151915280546001190161346e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061432283398151915255565b5f60608260800151516030146134f15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161051a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613568576135288160016140ec565b613533906008613de7565b5081515f9083908390811061354a5761354a6140ff565b60200101906001600160f81b03191690815f1a905350600101613514565b505f5b60048110156135c65761357f8160036140ec565b61358a906008613de7565b505f82613598836002614156565b815181106135a8576135a86140ff565b60200101906001600160f81b03191690815f1a90535060010161356b565b505f5b602081101561362357845181602081106135e5576135e56140ff565b1a60f81b826135f5836006614156565b81518110613605576136056140ff565b60200101906001600160f81b03191690815f1a9053506001016135c9565b505f5b60208110156136835784602001518160208110613645576136456140ff565b1a60f81b82613655836026614156565b81518110613665576136656140ff565b60200101906001600160f81b03191690815f1a905350600101613626565b505f5b60088110156136f75761369a8160076140ec565b6136a5906008613de7565b60ff1685604001516001600160401b0316901c60f81b828260466136c99190614156565b815181106136d9576136d96140ff565b60200101906001600160f81b03191690815f1a905350600101613686565b505f5b60308110156137625784608001518181518110613719576137196140ff565b01602001516001600160f81b0319168261373483604e614156565b81518110613744576137446140ff565b60200101906001600160f81b03191690815f1a9053506001016136fa565b505f5b60088110156137d4576137798160076140ec565b613784906008613de7565b60608601516001600160401b0390811691161c60f81b826137a683607e614156565b815181106137b6576137b66140ff565b60200101906001600160f81b03191690815f1a905350600101613765565b506002816040516137e591906142a6565b602060405180830381855afa158015613800573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138239190613cba565b94909350915050565b61383461320e565b61383c6138a8565b6138446138b8565b611604816138c0565b61385561320e565b5f5f805160206142e2833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6138b061320e565b61325761392c565b61325761320e565b6138c861320e565b80355f8051602061430283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561391260608301604084016142c1565b600291909101805460ff191660ff90921691909117905550565b61347461320e565b50805461394090613bea565b5f825580601f1061394f575050565b601f0160209004905f5260205f209081019061160491905b8082111561397a575f8155600101613967565b5090565b5f60e0828403121561398e575f80fd5b50919050565b5f602082840312156139a4575f80fd5b5035919050565b803563ffffffff811681146139be575f80fd5b919050565b6001600160a01b0381168114611604575f80fd5b5f80604083850312156139e8575f80fd5b6139f1836139ab565b91506020830135613a01816139c3565b809150509250929050565b5f8060408385031215613a1d575f80fd5b823591506020830135613a01816139c3565b5f60208284031215613a3f575f80fd5b613a48826139ab565b9392505050565b80356001600160401b03811681146139be575f80fd5b5f60208284031215613a75575f80fd5b613a4882613a4f565b8015158114611604575f80fd5b5f805f60608486031215613a9d575f80fd5b833592506020840135613aaf81613a7e565b9150613abd604085016139ab565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613afc57613afc613ac6565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b2a57613b2a613ac6565b604052919050565b5f6001600160401b03821115613b4a57613b4a613ac6565b50601f01601f191660200190565b5f805f60608486031215613b6a575f80fd5b83359250613b7a60208501613a4f565b915060408401356001600160401b03811115613b94575f80fd5b8401601f81018613613ba4575f80fd5b8035613bb7613bb282613b32565b613b02565b818152876020838501011115613bcb575f80fd5b816020840160208301375f602083830101528093505050509250925092565b600181811c90821680613bfe57607f821691505b60208210810361398e57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613c4281613bea565b806020870152604060018084165f8114613c635760018114613c7f57613cac565b60ff19851660408a0152604084151560051b8a01019550613cac565b895f5260205f205f5b85811015613ca35781548b8201860152908301908801613c88565b8a016040019650505b509398975050505050505050565b5f60208284031215613cca575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613de257613de2613dac565b500490565b808202811582820484141761083957610839613dc0565b5f5b83811015613e18578181015183820152602001613e00565b50505f910152565b80516139be81613a7e565b5f8060408385031215613e3c575f80fd5b82516001600160401b0380821115613e52575f80fd5b9084019060608287031215613e65575f80fd5b613e6d613ada565b82518152602080840151613e80816139c3565b82820152604084015183811115613e95575f80fd5b80850194505087601f850112613ea9575f80fd5b83519250613eb9613bb284613b32565b8381528882858701011115613ecc575f80fd5b613edb84838301848801613dfe565b80604084015250819550613ef0818801613e20565b9450505050509250929050565b6001600160401b03828116828216039080821115613f1d57613f1d613dc0565b5092915050565b601f82111561059c57805f5260205f20601f840160051c81016020851015613f495750805b601f840160051c820191505b81811015613f68575f8155600101613f55565b5050505050565b81516001600160401b03811115613f8857613f88613ac6565b613f9c81613f968454613bea565b84613f24565b602080601f831160018114613fcf575f8415613fb85750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b82811015613ffd57888601518255948401946001909101908401613fde565b508582101561401a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f8251806020840152614048816040850160208701613dfe565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561083957610839613dc0565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561083957610839613dc0565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361421157614211613dc0565b6001019392505050565b6001600160401b03818116838216019080821115613f1d57613f1d613dc0565b5f6020828403121561424b575f80fd5b8135613a48816139c3565b6001600160401b0381811683821602808216919082811461427957614279613dc0565b505092915050565b5f6001600160401b038084168061429a5761429a613dac565b92169190910492915050565b5f82516142b7818460208701613dfe565b9190910192915050565b5f602082840312156142d1575f80fd5b813560ff81168114613a48575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index e1ead5021..ae0ec8153 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -180,12 +180,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Store the delegator information $._delegatorStakes[validationID][delegator] = Delegator({ + status: DelegatorStatus.PendingAdded, weight: weight, startedAt: 0, endedAt: 0, startingNonce: nonce, - endingNonce: 0, - status: DelegatorStatus.PendingAdded + endingNonce: 0 }); emit DelegatorAdded({ diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 21346ec20..1c698eadd 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -25,12 +25,12 @@ struct PoSValidatorManagerSettings { } struct Delegator { + DelegatorStatus status; uint64 weight; uint64 startedAt; uint64 endedAt; uint64 startingNonce; uint64 endingNonce; - DelegatorStatus status; } interface IPoSValidatorManager is IValidatorManager { From 215f981cacb698283a1e153788c56cadf2ecf3d3 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 4 Sep 2024 16:00:07 -0500 Subject: [PATCH 190/545] correct error prefixes --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 42540acc6..da54c6ac3 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161478e38038061478e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146418061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80636a7e3d831161009e5780639e1bc4ef1161006e5780639e1bc4ef1461021b578063a3a65e481461022e578063b771b3bc14610241578063bee0a03f14610267578063d61bed741461027a575f80fd5b80636a7e3d83146101cf57806376f78621146101e2578063872fda64146101f5578063927e7e7514610208575f80fd5b80632e2194d8116100d95780632e2194d814610158578063467ef06f14610188578063620658561461019b57806366435abf146101bc575f80fd5b80630322ed981461010a5780630915204e1461011f5780630b77f6931461013257806327f39ca814610145575b5f80fd5b61011d610118366004613c01565b61028d565b005b61011d61012d366004613c44565b6103ee565b61011d610140366004613c79565b6105ae565b61011d610153366004613c9c565b610676565b61016b610166366004613c01565b610784565b6040516001600160401b0390911681526020015b60405180910390f35b61011d610196366004613cce565b61079a565b6101ae6101a9366004613d04565b610af6565b60405190815260200161017f565b61016b6101ca366004613c01565b610b0f565b61011d6101dd366004613c79565b610b23565b61011d6101f0366004613d2a565b610ba5565b6101ae610203366004613df7565b610ebe565b61011d610216366004613c01565b610ee3565b61011d610229366004613e93565b6112f1565b61011d61023c366004613cce565b611300565b61024f6005600160991b0181565b6040516001600160a01b03909116815260200161017f565b61011d610275366004613c01565b6114b9565b61011d610288366004613c44565b611588565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145d58339815191529291906102d590613eb3565b9050118015610307575060035f83815260078301602052604090205460ff16600581111561030557610305613eeb565b145b6103705760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613eff565b6020604051808303815f875af11580156103c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e99190613f89565b505050565b5f805160206145b58339815191525f6104068461176b565b90505f80610417836040015161194c565b50915091506104268286611b87565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061045291613bb7565b5f61045c83611c90565b9050816001600160401b031681606001516001600160401b031610156104945760405162461bcd60e51b815260040161036790613fa0565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b9092041611156104ed5760405162461bcd60e51b815260040161036790613fe2565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561052757610527613eeb565b146105445760405162461bcd60e51b81526004016103679061402b565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6105b88282611d8b565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206145b5833981519152916005600160991b019163ee5b48eb9161063091600401613eff565b6020604051808303815f875af115801561064c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106709190613f89565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106ba5750825b90505f826001600160401b031660011480156106d55750303b155b9050811580156106e3575080155b156107015760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561072b57845460ff60401b1916600160401b1785555b6107358787611e9f565b831561077b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61079464e8d4a51000836140a3565b92915050565b5f805160206145d58339815191525f6107b28361176b565b90505f806107c38360400151611eb9565b9150915080156108285760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610367565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561085957610859613eeb565b600581111561086a5761086a613eeb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156108e3576108e3613eeb565b148061090157506001825160058111156108ff576108ff613eeb565b145b6109605760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610367565b60038251600581111561097557610975613eeb565b0361099c57505f83815260068601602052604081206004916109979190613bb7565b6109a0565b5060055b6020808301515f908152600888019091526040812055818160058111156109c9576109c9613eeb565b908160058111156109dc576109dc613eeb565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610a1057610a10613eeb565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610ac357610ac3613eeb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6107946001600160401b03831664e8d4a510006140b6565b5f610b1982611c90565b6080015192915050565b610b2d8282611b87565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206145b5833981519152916005600160991b019163ee5b48eb9161063091600401613eff565b8115610eb5575f5f805160206145b58339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c06573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c2d91908101906140fa565b9150915080610c905760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610367565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf79190613f89565b825114610d5b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610367565b60208201516001600160a01b031615610dd15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610367565b5f80610de0846040015161205a565b91509150818814610e4d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610367565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6103e983612232565b5f80610ec986612584565b9050610ed785828686612631565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f805160206145b583398151915293929190829060ff166004811115610f4e57610f4e613eeb565b6004811115610f5f57610f5f613eeb565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a0909101529050600281516004811115610fc957610fc9613eeb565b146110255760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b6064820152608401610367565b5f61102f84612a65565b9050600382819052506001600160401b034281166060840152811660a08301525f848152600384016020526040812083916110673390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff1916600183600481111561109d5761109d613eeb565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f61114785611c90565b905082602001516001600160401b031681608001516001600160401b0316116111be5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610367565b8260200151816080018181516111d491906141cc565b6001600160401b03169052506111ea8582612ae0565b5f6111fa86848460800151612bcf565b5f87815260058701602090815260408083203384529091529020909150611221828261423e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061124e9085906004016142fd565b6020604051808303815f875af115801561126a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061128e9190613f89565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b6112fc823383612dec565b5050565b5f805160206145d58339815191525f6113188361176b565b90505f806113298360400151611eb9565b915091508061138b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610367565b5f828152600585016020526040812080546113a590613eb3565b90501180156113d7575060015f83815260078601602052604090205460ff1660058111156113d5576113d5613eeb565b145b6113f35760405162461bcd60e51b81526004016103679061432f565b5f828152600585016020526040812061140b91613bb7565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145d583398151915292919061150190613eb3565b9050118015611533575060015f83815260078301602052604090205460ff16600581111561153157611531613eeb565b145b61154f5760405162461bcd60e51b81526004016103679061432f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613eff565b5f805160206145b58339815191525f6115a08461176b565b90505f806115b1836040015161194c565b50915091506115c08286611d8b565b5f82815260048501602090815260408083206001600160a01b038916845290915281206115ec91613bb7565b5f6115f683611c90565b9050816001600160401b031681606001516001600160401b0316101561162e5760405162461bcd60e51b815260040161036790613fa0565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156116805760405162461bcd60e51b815260040161036790613fe2565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff1660048111156116ba576116ba613eeb565b146116d75760405162461bcd60e51b81526004016103679061402b565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b691016112e0565b60408051606080820183525f8083526020830181905292820152905f805160206145d58339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156117e0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261180791908101906140fa565b915091508061186e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610367565b82548251146118d15760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610367565b60208201516001600160a01b0316156119445760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610367565b509392505050565b5f805f83516036146119705760405162461bcd60e51b815260040161036790614376565b5f805b60028110156119bf576119878160016143bf565b6119929060086140b6565b61ffff168682815181106119a8576119a86143d2565b016020015160f81c901b9190911790600101611973565b5061ffff8116156119e25760405162461bcd60e51b8152600401610367906143e6565b5f805b6004811015611a3d576119f98160036143bf565b611a049060086140b6565b63ffffffff1687611a16836002614429565b81518110611a2657611a266143d2565b016020015160f81c901b91909117906001016119e5565b5063ffffffff8116600314611a645760405162461bcd60e51b81526004016103679061443c565b5f805b6020811015611ab957611a7b81601f6143bf565b611a869060086140b6565b88611a92836006614429565b81518110611aa257611aa26143d2565b016020015160f81c901b9190911790600101611a67565b505f805b6008811015611b1857611ad18160076143bf565b611adc9060086140b6565b6001600160401b031689611af1836026614429565b81518110611b0157611b016143d2565b016020015160f81c901b9190911790600101611abd565b505f805b6008811015611b7757611b308160076143bf565b611b3b9060086140b6565b6001600160401b03168a611b5083602e614429565b81518110611b6057611b606143d2565b016020015160f81c901b9190911790600101611b1c565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206145b5833981519152929190611be390613eb3565b9050118015611c29575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611c2757611c27613eeb565b145b6103e95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b6064820152608401610367565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061461583398151915290528390208351918201909352825491925f805160206145d583398151915292829060ff166005811115611d1057611d10613eeb565b6005811115611d2157611d21613eeb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206145b5833981519152929190611de790613eb3565b9050118015611e2d575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611e2b57611e2b613eeb565b145b6103e95760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e670000000000000000006064820152608401610367565b611ea761317c565b611eb0826131c7565b6112fc8161320d565b5f808251602714611edc5760405162461bcd60e51b815260040161036790614376565b5f805b6002811015611f2b57611ef38160016143bf565b611efe9060086140b6565b61ffff16858281518110611f1457611f146143d2565b016020015160f81c901b9190911790600101611edf565b5061ffff811615611f4e5760405162461bcd60e51b8152600401610367906143e6565b5f805b6004811015611fa957611f658160036143bf565b611f709060086140b6565b63ffffffff1686611f82836002614429565b81518110611f9257611f926143d2565b016020015160f81c901b9190911790600101611f51565b5063ffffffff8116600214611fd05760405162461bcd60e51b81526004016103679061443c565b5f805b602081101561202557611fe781601f6143bf565b611ff29060086140b6565b87611ffe836006614429565b8151811061200e5761200e6143d2565b016020015160f81c901b9190911790600101611fd3565b505f8660268151811061203a5761203a6143d2565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461207d5760405162461bcd60e51b815260040161036790614376565b5f805b60028110156120cc576120948160016143bf565b61209f9060086140b6565b61ffff168582815181106120b5576120b56143d2565b016020015160f81c901b9190911790600101612080565b5061ffff8116156120ef5760405162461bcd60e51b8152600401610367906143e6565b5f805b600481101561214a576121068160036143bf565b6121119060086140b6565b63ffffffff1686612123836002614429565b81518110612133576121336143d2565b016020015160f81c901b91909117906001016120f2565b5063ffffffff81166004146121715760405162461bcd60e51b81526004016103679061443c565b5f805b60208110156121c65761218881601f6143bf565b6121939060086140b6565b8761219f836006614429565b815181106121af576121af6143d2565b016020015160f81c901b9190911790600101612174565b505f805b6008811015612225576121de8160076143bf565b6121e99060086140b6565b6001600160401b0316886121fe836026614429565b8151811061220e5761220e6143d2565b016020015160f81c901b91909117906001016121ca565b5090969095509350505050565b5f8181525f805160206146158339815191526020526040808220815160e0810190925280545f805160206145d583398151915293929190829060ff16600581111561227f5761227f613eeb565b600581111561229057612290613eeb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561230a5761230a613eeb565b146123275760405162461bcd60e51b815260040161036790614483565b60408101516001600160a01b0316336001600160a01b0316146123a15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610367565b6123ae81608001516132c1565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123f2576123f2613eeb565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124a6846124a081612a65565b5f612bcf565b5f85815260068501602052604090209091506124c2828261423e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124ef9085906004016142fd565b6020604051808303815f875af115801561250b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252f9190613f89565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145b58339815191528161259d84613462565b90505f6125a982610784565b83549091506001600160401b038216108015906125d357508260010154816001600160401b031611155b610edb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610367565b5f61263a613498565b5f805160206145d5833981519152426001600160401b03851611801561267457506001600160401b038416612672426202a300614429565b115b6126d65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610367565b8561272d5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610367565b5f8681526008820160205260409020541561279b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610367565b82516030146128025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610367565b61280b856132c1565b5f806128526040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134cf565b5f82815260058601602052604090209193509150612870828261423e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061289d9085906004016142fd565b6020604051808303815f875af11580156128b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128dd9190613f89565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561295657612956613eeb565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556129ff83612a65565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610edb60015f805160206145f583398151915255565b5f8181525f805160206146158339815191526020526040812060020180545f805160206145d583398151915291600160a01b9091046001600160401b03169081906014612ab1836144c9565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061461583398151915260205260409020815181545f805160206145d58339815191529284929091829060ff19166001836005811115612b2a57612b2a613eeb565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612c4857612c088160016143bf565b612c139060086140b6565b5081515f90839083908110612c2a57612c2a6143d2565b60200101906001600160f81b03191690815f1a905350600101612bf4565b505f5b6004811015612cab57612c5f8160036143bf565b612c6a9060086140b6565b6001901c60f81b82612c7d836002614429565b81518110612c8d57612c8d6143d2565b60200101906001600160f81b03191690815f1a905350600101612c4b565b505f5b6020811015612d0d57612cc281601f6143bf565b612ccd9060086140b6565b86901c60f81b82612cdf836006614429565b81518110612cef57612cef6143d2565b60200101906001600160f81b03191690815f1a905350600101612cae565b505f5b6008811015612d7857612d248160076143bf565b612d2f9060086140b6565b6001600160401b038616901c60f81b82612d4a836026614429565b81518110612d5a57612d5a6143d2565b60200101906001600160f81b03191690815f1a905350600101612d10565b505f5b6008811015612de357612d8f8160076143bf565b612d9a9060086140b6565b6001600160401b038516901c60f81b82612db583602e614429565b81518110612dc557612dc56143d2565b60200101906001600160f81b03191690815f1a905350600101612d7b565b50949350505050565b612df4613498565b5f612e0161016683613462565b90505f805160206145b58339815191525f612e1b86611c90565b9050600281516005811115612e3257612e32613eeb565b14612e4f5760405162461bcd60e51b815260040161036790614483565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b031615612ee55760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b6064820152608401610367565b612eee836132c1565b8281608001818151612f0091906144ee565b6001600160401b0316905250612f168682612ae0565b5f612f2087612a65565b90505f612f3288838560800151612bcf565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612f62828261423e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f8f9085906004016142fd565b6020604051808303815f875af1158015612fab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fcf9190613f89565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff1916600183600481111561305057613050613eeb565b02179055506020820151815460408085015160608601516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0267ffffffffffffffff60481b199683166101000296909616610100600160881b03199095169490941794909417169190911783556080808501516001909401805460a0909601518416600160401b026001600160801b0319909616949093169390931793909317905585015190516001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b91613158918c918a906001600160401b0393841681529183166020830152909116604082015260600190565b60405180910390a45050505050506103e960015f805160206145f583398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166131c557604051631afcd79f60e31b815260040160405180910390fd5b565b6131cf61317c565b6131d881613887565b61320a606082013560808301356131f560c0850160a08601613d04565b61320560e0860160c0870161450e565b6138a8565b50565b61321561317c565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132a15760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610367565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145d58339815191529060ff165f036132ff575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061334790836143bf565b10613363576001600160401b0384166040830152808252613382565b838260400181815161337591906144ee565b6001600160401b03169052505b5f8260200151836040015160646133999190614529565b6133a39190614554565b600285015490915060ff908116908216111561341e5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610367565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610794827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613903565b5f805160206145f58339815191528054600119016134c957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135395760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610367565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135b0576135708160016143bf565b61357b9060086140b6565b5081515f90839083908110613592576135926143d2565b60200101906001600160f81b03191690815f1a90535060010161355c565b505f5b600481101561360e576135c78160036143bf565b6135d29060086140b6565b505f826135e0836002614429565b815181106135f0576135f06143d2565b60200101906001600160f81b03191690815f1a9053506001016135b3565b505f5b602081101561366b578451816020811061362d5761362d6143d2565b1a60f81b8261363d836006614429565b8151811061364d5761364d6143d2565b60200101906001600160f81b03191690815f1a905350600101613611565b505f5b60208110156136cb578460200151816020811061368d5761368d6143d2565b1a60f81b8261369d836026614429565b815181106136ad576136ad6143d2565b60200101906001600160f81b03191690815f1a90535060010161366e565b505f5b600881101561373f576136e28160076143bf565b6136ed9060086140b6565b60ff1685604001516001600160401b0316901c60f81b828260466137119190614429565b81518110613721576137216143d2565b60200101906001600160f81b03191690815f1a9053506001016136ce565b505f5b60308110156137aa5784608001518181518110613761576137616143d2565b01602001516001600160f81b0319168261377c83604e614429565b8151811061378c5761378c6143d2565b60200101906001600160f81b03191690815f1a905350600101613742565b505f5b600881101561381c576137c18160076143bf565b6137cc9060086140b6565b60608601516001600160401b0390811691161c60f81b826137ee83607e614429565b815181106137fe576137fe6143d2565b60200101906001600160f81b03191690815f1a9053506001016137ad565b5060028160405161382d9190614579565b602060405180830381855afa158015613848573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061386b9190613f89565b94909350915050565b60015f805160206145f583398151915255565b61388f61317c565b613897613a65565b61389f613a75565b61320a81613a7d565b6138b061317c565b5f5f805160206145b5833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613949573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061396d9190613f89565b90506139846001600160a01b038516333086613ae9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139ec9190613f89565b9050818111613a525760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610367565b613a5c82826143bf565b95945050505050565b613a6d61317c565b6131c5613b43565b6131c561317c565b613a8561317c565b80355f805160206145d583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613acf6060830160408401614594565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610670908590613b4b565b61387461317c565b5f8060205f8451602086015f885af180613b6a576040513d5f823e3d81fd5b50505f513d91508115613b81578060011415613b8e565b6001600160a01b0384163b155b1561067057604051635274afe760e01b81526001600160a01b0385166004820152602401610367565b508054613bc390613eb3565b5f825580601f10613bd2575050565b601f0160209004905f5260205f209081019061320a91905b80821115613bfd575f8155600101613bea565b5090565b5f60208284031215613c11575f80fd5b5035919050565b803563ffffffff81168114613c2b575f80fd5b919050565b6001600160a01b038116811461320a575f80fd5b5f8060408385031215613c55575f80fd5b613c5e83613c18565b91506020830135613c6e81613c30565b809150509250929050565b5f8060408385031215613c8a575f80fd5b823591506020830135613c6e81613c30565b5f80828403610100811215613caf575f80fd5b60e0811215613cbc575f80fd5b5082915060e0830135613c6e81613c30565b5f60208284031215613cde575f80fd5b613ce782613c18565b9392505050565b80356001600160401b0381168114613c2b575f80fd5b5f60208284031215613d14575f80fd5b613ce782613cee565b801515811461320a575f80fd5b5f805f60608486031215613d3c575f80fd5b833592506020840135613d4e81613d1d565b9150613d5c60408501613c18565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d9b57613d9b613d65565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613dc957613dc9613d65565b604052919050565b5f6001600160401b03821115613de957613de9613d65565b50601f01601f191660200190565b5f805f8060808587031215613e0a575f80fd5b8435935060208501359250613e2160408601613cee565b915060608501356001600160401b03811115613e3b575f80fd5b8501601f81018713613e4b575f80fd5b8035613e5e613e5982613dd1565b613da1565b818152886020838501011115613e72575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ea4575f80fd5b50508035926020909101359150565b600181811c90821680613ec757607f821691505b602082108103613ee557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613f1181613eb3565b806020870152604060018084165f8114613f325760018114613f4e57613f7b565b60ff19851660408a0152604084151560051b8a01019550613f7b565b895f5260205f205f5b85811015613f725781548b8201860152908301908801613f57565b8a016040019650505b509398975050505050505050565b5f60208284031215613f99575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826140b1576140b161407b565b500490565b80820281158282048414176107945761079461408f565b5f5b838110156140e75781810151838201526020016140cf565b50505f910152565b8051613c2b81613d1d565b5f806040838503121561410b575f80fd5b82516001600160401b0380821115614121575f80fd5b9084019060608287031215614134575f80fd5b61413c613d79565b8251815260208084015161414f81613c30565b82820152604084015183811115614164575f80fd5b80850194505087601f850112614178575f80fd5b83519250614188613e5984613dd1565b838152888285870101111561419b575f80fd5b6141aa848383018488016140cd565b806040840152508195506141bf8188016140ef565b9450505050509250929050565b6001600160401b038281168282160390808211156141ec576141ec61408f565b5092915050565b601f8211156103e957805f5260205f20601f840160051c810160208510156142185750805b601f840160051c820191505b81811015614237575f8155600101614224565b5050505050565b81516001600160401b0381111561425757614257613d65565b61426b816142658454613eb3565b846141f3565b602080601f83116001811461429e575f84156142875750858301515b5f19600386901b1c1916600185901b1785556142f5565b5f85815260208120601f198616915b828110156142cc578886015182559484019460019091019084016142ad565b50858210156142e957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f825180602084015261431b8160408501602087016140cd565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156107945761079461408f565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156107945761079461408f565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b038083168181036144e4576144e461408f565b6001019392505050565b6001600160401b038181168382160190808211156141ec576141ec61408f565b5f6020828403121561451e575f80fd5b8135613ce781613c30565b6001600160401b0381811683821602808216919082811461454c5761454c61408f565b505092915050565b5f6001600160401b038084168061456d5761456d61407b565b92169190910492915050565b5f825161458a8184602087016140cd565b9190910192915050565b5f602082840312156145a4575f80fd5b813560ff81168114613ce7575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516147cf3803806147cf83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146828061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80636a7e3d831161009e5780639e1bc4ef1161006e5780639e1bc4ef1461021b578063a3a65e481461022e578063b771b3bc14610241578063bee0a03f14610267578063d61bed741461027a575f80fd5b80636a7e3d83146101cf57806376f78621146101e2578063872fda64146101f5578063927e7e7514610208575f80fd5b80632e2194d8116100d95780632e2194d814610158578063467ef06f14610188578063620658561461019b57806366435abf146101bc575f80fd5b80630322ed981461010a5780630915204e1461011f5780630b77f6931461013257806327f39ca814610145575b5f80fd5b61011d610118366004613c88565b61028d565b005b61011d61012d366004613ccb565b6103ee565b61011d610140366004613d00565b6105ae565b61011d610153366004613d23565b610676565b61016b610166366004613c88565b610784565b6040516001600160401b0390911681526020015b60405180910390f35b61011d610196366004613d55565b61079a565b6101ae6101a9366004613d8b565b610af6565b60405190815260200161017f565b61016b6101ca366004613c88565b610b0f565b61011d6101dd366004613d00565b610b23565b61011d6101f0366004613db1565b610ba5565b6101ae610203366004613e7e565b610ebe565b61011d610216366004613c88565b610ee3565b61011d610229366004613f1a565b6112f4565b61011d61023c366004613d55565b611303565b61024f6005600160991b0181565b6040516001600160a01b03909116815260200161017f565b61011d610275366004613c88565b6114bc565b61011d610288366004613ccb565b61158b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206146168339815191529291906102d590613f3a565b9050118015610307575060035f83815260078301602052604090205460ff16600581111561030557610305613f72565b145b6103705760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613f86565b6020604051808303815f875af11580156103c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103e99190614010565b505050565b5f805160206145f68339815191525f6104068461176e565b90505f80610417836040015161194f565b50915091506104268286611b8a565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061045291613c3e565b5f61045c83611c93565b9050816001600160401b031681606001516001600160401b031610156104945760405162461bcd60e51b815260040161036790614027565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b9092041611156104ed5760405162461bcd60e51b815260040161036790614069565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561052757610527613f72565b146105445760405162461bcd60e51b8152600401610367906140b2565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6105b88282611d8e565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206145f6833981519152916005600160991b019163ee5b48eb9161063091600401613f86565b6020604051808303815f875af115801561064c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106709190614010565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106ba5750825b90505f826001600160401b031660011480156106d55750303b155b9050811580156106e3575080155b156107015760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561072b57845460ff60401b1916600160401b1785555b6107358787611ea2565b831561077b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61079464e8d4a510008361412a565b92915050565b5f805160206146168339815191525f6107b28361176e565b90505f806107c38360400151611ebc565b9150915080156108285760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610367565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561085957610859613f72565b600581111561086a5761086a613f72565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156108e3576108e3613f72565b148061090157506001825160058111156108ff576108ff613f72565b145b6109605760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610367565b60038251600581111561097557610975613f72565b0361099c57505f83815260068601602052604081206004916109979190613c3e565b6109a0565b5060055b6020808301515f908152600888019091526040812055818160058111156109c9576109c9613f72565b908160058111156109dc576109dc613f72565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610a1057610a10613f72565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610ac357610ac3613f72565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6107946001600160401b03831664e8d4a5100061413d565b5f610b1982611c93565b6080015192915050565b610b2d8282611b8a565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206145f6833981519152916005600160991b019163ee5b48eb9161063091600401613f86565b8115610eb5575f5f805160206145f68339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c06573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c2d9190810190614181565b9150915080610c905760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610367565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cf79190614010565b825114610d5b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610367565b60208201516001600160a01b031615610dd15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610367565b5f80610de0846040015161205d565b91509150818814610e4d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610367565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6103e983612235565b5f80610ec9866125c6565b9050610ed785828686612673565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f805160206145f683398151915293929190829060ff166004811115610f4e57610f4e613f72565b6004811115610f5f57610f5f613f72565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a0909101529050600281516004811115610fc957610fc9613f72565b146110285760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b6064820152608401610367565b5f61103284612aa7565b9050600382819052506001600160401b034281166060840152811660a08301525f8481526003840160205260408120839161106a3390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff191660018360048111156110a0576110a0613f72565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f61114a85611c93565b905082602001516001600160401b031681608001516001600160401b0316116111c15760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610367565b8260200151816080018181516111d79190614253565b6001600160401b03169052506111ed8582612b22565b5f6111fd86848460800151612c11565b5f8781526005870160209081526040808320338452909152902090915061122482826142c5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611251908590600401614384565b6020604051808303815f875af115801561126d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112919190614010565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b6112ff823383612e2e565b5050565b5f805160206146168339815191525f61131b8361176e565b90505f8061132c8360400151611ebc565b915091508061138e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610367565b5f828152600585016020526040812080546113a890613f3a565b90501180156113da575060015f83815260078601602052604090205460ff1660058111156113d8576113d8613f72565b145b6113f65760405162461bcd60e51b8152600401610367906143b6565b5f828152600585016020526040812061140e91613c3e565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061461683398151915292919061150490613f3a565b9050118015611536575060015f83815260078301602052604090205460ff16600581111561153457611534613f72565b145b6115525760405162461bcd60e51b8152600401610367906143b6565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103a99190600401613f86565b5f805160206145f68339815191525f6115a38461176e565b90505f806115b4836040015161194f565b50915091506115c38286611d8e565b5f82815260048501602090815260408083206001600160a01b038916845290915281206115ef91613c3e565b5f6115f983611c93565b9050816001600160401b031681606001516001600160401b031610156116315760405162461bcd60e51b815260040161036790614027565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156116835760405162461bcd60e51b815260040161036790614069565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff1660048111156116bd576116bd613f72565b146116da5760405162461bcd60e51b8152600401610367906140b2565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b691016112e3565b60408051606080820183525f8083526020830181905292820152905f805160206146168339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156117e3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261180a9190810190614181565b91509150806118715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610367565b82548251146118d45760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610367565b60208201516001600160a01b0316156119475760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610367565b509392505050565b5f805f83516036146119735760405162461bcd60e51b8152600401610367906143fd565b5f805b60028110156119c25761198a816001614446565b61199590600861413d565b61ffff168682815181106119ab576119ab614459565b016020015160f81c901b9190911790600101611976565b5061ffff8116156119e55760405162461bcd60e51b81526004016103679061446d565b5f805b6004811015611a40576119fc816003614446565b611a0790600861413d565b63ffffffff1687611a198360026144b0565b81518110611a2957611a29614459565b016020015160f81c901b91909117906001016119e8565b5063ffffffff8116600314611a675760405162461bcd60e51b8152600401610367906144c3565b5f805b6020811015611abc57611a7e81601f614446565b611a8990600861413d565b88611a958360066144b0565b81518110611aa557611aa5614459565b016020015160f81c901b9190911790600101611a6a565b505f805b6008811015611b1b57611ad4816007614446565b611adf90600861413d565b6001600160401b031689611af48360266144b0565b81518110611b0457611b04614459565b016020015160f81c901b9190911790600101611ac0565b505f805b6008811015611b7a57611b33816007614446565b611b3e90600861413d565b6001600160401b03168a611b5383602e6144b0565b81518110611b6357611b63614459565b016020015160f81c901b9190911790600101611b1f565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206145f6833981519152929190611be690613f3a565b9050118015611c2c575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611c2a57611c2a613f72565b145b6103e95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b6064820152608401610367565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061465683398151915290528390208351918201909352825491925f8051602061461683398151915292829060ff166005811115611d1357611d13613f72565b6005811115611d2457611d24613f72565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206145f6833981519152929190611dea90613f3a565b9050118015611e30575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611e2e57611e2e613f72565b145b6103e95760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e670000000000000000006064820152608401610367565b611eaa613203565b611eb38261324e565b6112ff81613294565b5f808251602714611edf5760405162461bcd60e51b8152600401610367906143fd565b5f805b6002811015611f2e57611ef6816001614446565b611f0190600861413d565b61ffff16858281518110611f1757611f17614459565b016020015160f81c901b9190911790600101611ee2565b5061ffff811615611f515760405162461bcd60e51b81526004016103679061446d565b5f805b6004811015611fac57611f68816003614446565b611f7390600861413d565b63ffffffff1686611f858360026144b0565b81518110611f9557611f95614459565b016020015160f81c901b9190911790600101611f54565b5063ffffffff8116600214611fd35760405162461bcd60e51b8152600401610367906144c3565b5f805b602081101561202857611fea81601f614446565b611ff590600861413d565b876120018360066144b0565b8151811061201157612011614459565b016020015160f81c901b9190911790600101611fd6565b505f8660268151811061203d5761203d614459565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146120805760405162461bcd60e51b8152600401610367906143fd565b5f805b60028110156120cf57612097816001614446565b6120a290600861413d565b61ffff168582815181106120b8576120b8614459565b016020015160f81c901b9190911790600101612083565b5061ffff8116156120f25760405162461bcd60e51b81526004016103679061446d565b5f805b600481101561214d57612109816003614446565b61211490600861413d565b63ffffffff16866121268360026144b0565b8151811061213657612136614459565b016020015160f81c901b91909117906001016120f5565b5063ffffffff81166004146121745760405162461bcd60e51b8152600401610367906144c3565b5f805b60208110156121c95761218b81601f614446565b61219690600861413d565b876121a28360066144b0565b815181106121b2576121b2614459565b016020015160f81c901b9190911790600101612177565b505f805b6008811015612228576121e1816007614446565b6121ec90600861413d565b6001600160401b0316886122018360266144b0565b8151811061221157612211614459565b016020015160f81c901b91909117906001016121cd565b5090969095509350505050565b5f8181525f805160206146568339815191526020526040808220815160e0810190925280545f8051602061461683398151915293929190829060ff16600581111561228257612282613f72565b600581111561229357612293613f72565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561230d5761230d613f72565b146123695760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610367565b60408101516001600160a01b0316336001600160a01b0316146123e35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610367565b6123f08160800151613348565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561243457612434613f72565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124e8846124e281612aa7565b5f612c11565b5f858152600685016020526040902090915061250482826142c5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612531908590600401614384565b6020604051808303815f875af115801561254d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125719190614010565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145f6833981519152816125df846134e9565b90505f6125eb82610784565b83549091506001600160401b0382161080159061261557508260010154816001600160401b031611155b610edb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610367565b5f61267c61351f565b5f80516020614616833981519152426001600160401b0385161180156126b657506001600160401b0384166126b4426202a3006144b0565b115b6127185760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610367565b8561276f5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610367565b5f868152600882016020526040902054156127dd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610367565b82516030146128445760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610367565b61284d85613348565b5f806128946040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613556565b5f828152600586016020526040902091935091506128b282826142c5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128df908590600401614384565b6020604051808303815f875af11580156128fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061291f9190614010565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561299857612998613f72565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612a4183612aa7565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610edb60015f8051602061463683398151915255565b5f8181525f805160206146568339815191526020526040812060020180545f8051602061461683398151915291600160a01b9091046001600160401b03169081906014612af38361450a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061465683398151915260205260409020815181545f805160206146168339815191529284929091829060ff19166001836005811115612b6c57612b6c613f72565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612c8a57612c4a816001614446565b612c5590600861413d565b5081515f90839083908110612c6c57612c6c614459565b60200101906001600160f81b03191690815f1a905350600101612c36565b505f5b6004811015612ced57612ca1816003614446565b612cac90600861413d565b6001901c60f81b82612cbf8360026144b0565b81518110612ccf57612ccf614459565b60200101906001600160f81b03191690815f1a905350600101612c8d565b505f5b6020811015612d4f57612d0481601f614446565b612d0f90600861413d565b86901c60f81b82612d218360066144b0565b81518110612d3157612d31614459565b60200101906001600160f81b03191690815f1a905350600101612cf0565b505f5b6008811015612dba57612d66816007614446565b612d7190600861413d565b6001600160401b038616901c60f81b82612d8c8360266144b0565b81518110612d9c57612d9c614459565b60200101906001600160f81b03191690815f1a905350600101612d52565b505f5b6008811015612e2557612dd1816007614446565b612ddc90600861413d565b6001600160401b038516901c60f81b82612df783602e6144b0565b81518110612e0757612e07614459565b60200101906001600160f81b03191690815f1a905350600101612dbd565b50949350505050565b612e3661351f565b5f612e43610166836134e9565b90505f805160206145f68339815191525f612e5d86611c93565b9050600281516005811115612e7457612e74613f72565b14612ed35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610367565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b031615612f6c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b6064820152608401610367565b612f7583613348565b8281608001818151612f87919061452f565b6001600160401b0316905250612f9d8682612b22565b5f612fa787612aa7565b90505f612fb988838560800151612c11565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612fe982826142c5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613016908590600401614384565b6020604051808303815f875af1158015613032573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130569190614010565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff191660018360048111156130d7576130d7613f72565b02179055506020820151815460408085015160608601516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0267ffffffffffffffff60481b199683166101000296909616610100600160881b03199095169490941794909417169190911783556080808501516001909401805460a0909601518416600160401b026001600160801b0319909616949093169390931793909317905585015190516001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b916131df918c918a906001600160401b0393841681529183166020830152909116604082015260600190565b60405180910390a45050505050506103e960015f8051602061463683398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661324c57604051631afcd79f60e31b815260040160405180910390fd5b565b613256613203565b61325f8161390e565b6132916060820135608083013561327c60c0850160a08601613d8b565b61328c60e0860160c0870161454f565b61392f565b50565b61329c613203565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166133285760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610367565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146168339815191529060ff165f03613386575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133ce9083614446565b106133ea576001600160401b0384166040830152808252613409565b83826040018181516133fc919061452f565b6001600160401b03169052505b5f826020015183604001516064613420919061456a565b61342a9190614595565b600285015490915060ff90811690821611156134a55760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610367565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610794827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061398a565b5f8051602061463683398151915280546001190161355057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135c05760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610367565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613637576135f7816001614446565b61360290600861413d565b5081515f9083908390811061361957613619614459565b60200101906001600160f81b03191690815f1a9053506001016135e3565b505f5b60048110156136955761364e816003614446565b61365990600861413d565b505f826136678360026144b0565b8151811061367757613677614459565b60200101906001600160f81b03191690815f1a90535060010161363a565b505f5b60208110156136f257845181602081106136b4576136b4614459565b1a60f81b826136c48360066144b0565b815181106136d4576136d4614459565b60200101906001600160f81b03191690815f1a905350600101613698565b505f5b6020811015613752578460200151816020811061371457613714614459565b1a60f81b826137248360266144b0565b8151811061373457613734614459565b60200101906001600160f81b03191690815f1a9053506001016136f5565b505f5b60088110156137c657613769816007614446565b61377490600861413d565b60ff1685604001516001600160401b0316901c60f81b8282604661379891906144b0565b815181106137a8576137a8614459565b60200101906001600160f81b03191690815f1a905350600101613755565b505f5b603081101561383157846080015181815181106137e8576137e8614459565b01602001516001600160f81b0319168261380383604e6144b0565b8151811061381357613813614459565b60200101906001600160f81b03191690815f1a9053506001016137c9565b505f5b60088110156138a357613848816007614446565b61385390600861413d565b60608601516001600160401b0390811691161c60f81b8261387583607e6144b0565b8151811061388557613885614459565b60200101906001600160f81b03191690815f1a905350600101613834565b506002816040516138b491906145ba565b602060405180830381855afa1580156138cf573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138f29190614010565b94909350915050565b60015f8051602061463683398151915255565b613916613203565b61391e613aec565b613926613afc565b61329181613b04565b613937613203565b5f5f805160206145f6833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139f49190614010565b9050613a0b6001600160a01b038516333086613b70565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a739190614010565b9050818111613ad95760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610367565b613ae38282614446565b95945050505050565b613af4613203565b61324c613bca565b61324c613203565b613b0c613203565b80355f8051602061461683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b5660608301604084016145d5565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610670908590613bd2565b6138fb613203565b5f8060205f8451602086015f885af180613bf1576040513d5f823e3d81fd5b50505f513d91508115613c08578060011415613c15565b6001600160a01b0384163b155b1561067057604051635274afe760e01b81526001600160a01b0385166004820152602401610367565b508054613c4a90613f3a565b5f825580601f10613c59575050565b601f0160209004905f5260205f209081019061329191905b80821115613c84575f8155600101613c71565b5090565b5f60208284031215613c98575f80fd5b5035919050565b803563ffffffff81168114613cb2575f80fd5b919050565b6001600160a01b0381168114613291575f80fd5b5f8060408385031215613cdc575f80fd5b613ce583613c9f565b91506020830135613cf581613cb7565b809150509250929050565b5f8060408385031215613d11575f80fd5b823591506020830135613cf581613cb7565b5f80828403610100811215613d36575f80fd5b60e0811215613d43575f80fd5b5082915060e0830135613cf581613cb7565b5f60208284031215613d65575f80fd5b613d6e82613c9f565b9392505050565b80356001600160401b0381168114613cb2575f80fd5b5f60208284031215613d9b575f80fd5b613d6e82613d75565b8015158114613291575f80fd5b5f805f60608486031215613dc3575f80fd5b833592506020840135613dd581613da4565b9150613de360408501613c9f565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e2257613e22613dec565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e5057613e50613dec565b604052919050565b5f6001600160401b03821115613e7057613e70613dec565b50601f01601f191660200190565b5f805f8060808587031215613e91575f80fd5b8435935060208501359250613ea860408601613d75565b915060608501356001600160401b03811115613ec2575f80fd5b8501601f81018713613ed2575f80fd5b8035613ee5613ee082613e58565b613e28565b818152886020838501011115613ef9575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613f2b575f80fd5b50508035926020909101359150565b600181811c90821680613f4e57607f821691505b602082108103613f6c57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613f9881613f3a565b806020870152604060018084165f8114613fb95760018114613fd557614002565b60ff19851660408a0152604084151560051b8a01019550614002565b895f5260205f205f5b85811015613ff95781548b8201860152908301908801613fde565b8a016040019650505b509398975050505050505050565b5f60208284031215614020575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261413857614138614102565b500490565b808202811582820484141761079457610794614116565b5f5b8381101561416e578181015183820152602001614156565b50505f910152565b8051613cb281613da4565b5f8060408385031215614192575f80fd5b82516001600160401b03808211156141a8575f80fd5b90840190606082870312156141bb575f80fd5b6141c3613e00565b825181526020808401516141d681613cb7565b828201526040840151838111156141eb575f80fd5b80850194505087601f8501126141ff575f80fd5b8351925061420f613ee084613e58565b8381528882858701011115614222575f80fd5b61423184838301848801614154565b80604084015250819550614246818801614176565b9450505050509250929050565b6001600160401b0382811682821603908082111561427357614273614116565b5092915050565b601f8211156103e957805f5260205f20601f840160051c8101602085101561429f5750805b601f840160051c820191505b818110156142be575f81556001016142ab565b5050505050565b81516001600160401b038111156142de576142de613dec565b6142f2816142ec8454613f3a565b8461427a565b602080601f831160018114614325575f841561430e5750858301515b5f19600386901b1c1916600185901b17855561437c565b5f85815260208120601f198616915b8281101561435357888601518255948401946001909101908401614334565b508582101561437057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526143a2816040850160208701614154565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561079457610794614116565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561079457610794614116565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b0380831681810361452557614525614116565b6001019392505050565b6001600160401b0381811683821601908082111561427357614273614116565b5f6020828403121561455f575f80fd5b8135613d6e81613cb7565b6001600160401b0381811683821602808216919082811461458d5761458d614116565b505092915050565b5f6001600160401b03808416806145ae576145ae614102565b92169190910492915050565b5f82516145cb818460208701614154565b9190910192915050565b5f602082840312156145e5575f80fd5b813560ff81168114613d6e575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index b294b6904..bd2c3260e 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516144bb3803806144bb83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61436e8061014d5f395ff3fe6080604052600436106100f9575f3560e01c80636a7e3d8311610092578063b771b3bc11610062578063b771b3bc1461029e578063bee0a03f146102d0578063c599e24f146102ef578063d61bed7414610302578063f40797d714610321575f80fd5b80636a7e3d831461022257806376f7862114610241578063927e7e7514610260578063a3a65e481461027f575f80fd5b80632e2194d8116100cd5780632e2194d81461017b578063467ef06f146101b757806362065856146101d657806366435abf14610203575f80fd5b8062e41792146100fd5780630322ed981461011e5780630915204e1461013d5780630b77f6931461015c575b5f80fd5b348015610108575f80fd5b5061011c61011736600461397e565b610334565b005b348015610129575f80fd5b5061011c610138366004613994565b610440565b348015610148575f80fd5b5061011c6101573660046139d7565b6105a1565b348015610167575f80fd5b5061011c610176366004613a0c565b610761565b348015610186575f80fd5b5061019a610195366004613994565b610829565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101c2575f80fd5b5061011c6101d1366004613a2f565b61083f565b3480156101e1575f80fd5b506101f56101f0366004613a65565b610b9b565b6040519081526020016101ae565b34801561020e575f80fd5b5061019a61021d366004613994565b610bb4565b34801561022d575f80fd5b5061011c61023c366004613a0c565b610bc8565b34801561024c575f80fd5b5061011c61025b366004613a8b565b610c4a565b34801561026b575f80fd5b5061011c61027a366004613994565b610f63565b34801561028a575f80fd5b5061011c610299366004613a2f565b611371565b3480156102a9575f80fd5b506102b86005600160991b0181565b6040516001600160a01b0390911681526020016101ae565b3480156102db575f80fd5b5061011c6102ea366004613994565b61152a565b61011c6102fd366004613994565b6115f9565b34801561030d575f80fd5b5061011c61031c3660046139d7565b611607565b6101f561032f366004613b58565b6117ea565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f28661180c565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061430283398151915292919061048890613bea565b90501180156104ba575060035f83815260078301602052604090205460ff1660058111156104b8576104b8613c1c565b145b6105235760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613c30565b6020604051808303815f875af1158015610578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059c9190613cba565b505050565b5f805160206142e28339815191525f6105b98461181d565b90505f806105ca83604001516119fe565b50915091506105d98286611c39565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061060591613934565b5f61060f83611d42565b9050816001600160401b031681606001516001600160401b031610156106475760405162461bcd60e51b815260040161051a90613cd1565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b9092041611156106a05760405162461bcd60e51b815260040161051a90613d13565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff1660048111156106da576106da613c1c565b146106f75760405162461bcd60e51b815260040161051a90613d5c565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b61076b8282611e3d565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206142e2833981519152916005600160991b019163ee5b48eb916107e391600401613c30565b6020604051808303815f875af11580156107ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108239190613cba565b50505050565b5f61083964e8d4a5100083613dd4565b92915050565b5f805160206143028339815191525f6108578361181d565b90505f806108688360400151611f51565b9150915080156108cd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161051a565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156108fe576108fe613c1c565b600581111561090f5761090f613c1c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561098857610988613c1c565b14806109a657506001825160058111156109a4576109a4613c1c565b145b610a055760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161051a565b600382516005811115610a1a57610a1a613c1c565b03610a4157505f8381526006860160205260408120600491610a3c9190613934565b610a45565b5060055b6020808301515f90815260088801909152604081205581816005811115610a6e57610a6e613c1c565b90816005811115610a8157610a81613c1c565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ab557610ab5613c1c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610b6857610b68613c1c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6108396001600160401b03831664e8d4a51000613de7565b5f610bbe82611d42565b6080015192915050565b610bd28282611c39565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206142e2833981519152916005600160991b019163ee5b48eb916107e391600401613c30565b8115610f5a575f5f805160206142e28339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610cab573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cd29190810190613e2b565b9150915080610d355760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161051a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d9c9190613cba565b825114610e005760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161051a565b60208201516001600160a01b031615610e765760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161051a565b5f80610e8584604001516120f2565b91509150818814610ef25760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161051a565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61059c836122ca565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f805160206142e283398151915293929190829060ff166004811115610fce57610fce613c1c565b6004811115610fdf57610fdf613c1c565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a090910152905060028151600481111561104957611049613c1c565b146110a55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2064656c656761746f72206e6f742060448201526561637469766560d01b606482015260840161051a565b5f6110af8461261c565b9050600382819052506001600160401b034281166060840152811660a08301525f848152600384016020526040812083916110e73390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff1916600183600481111561111d5761111d613c1c565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f6111c785611d42565b905082602001516001600160401b031681608001516001600160401b03161161123e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161051a565b8260200151816080018181516112549190613efd565b6001600160401b031690525061126a8582612697565b5f61127a86848460800151612786565b5f878152600587016020908152604080832033845290915290209091506112a18282613f6f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112ce90859060040161402a565b6020604051808303815f875af11580156112ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061130e9190613cba565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b5f805160206143028339815191525f6113898361181d565b90505f8061139a8360400151611f51565b91509150806113fc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161051a565b5f8281526005850160205260408120805461141690613bea565b9050118015611448575060015f83815260078601602052604090205460ff16600581111561144657611446613c1c565b145b6114645760405162461bcd60e51b815260040161051a9061405c565b5f828152600585016020526040812061147c91613934565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061430283398151915292919061157290613bea565b90501180156115a4575060015f83815260078301602052604090205460ff1660058111156115a2576115a2613c1c565b145b6115c05760405162461bcd60e51b815260040161051a9061405c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613c30565b6116048133346129a3565b50565b5f805160206142e28339815191525f61161f8461181d565b90505f8061163083604001516119fe565b509150915061163f8286611e3d565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061166b91613934565b5f61167583611d42565b9050816001600160401b031681606001516001600160401b031610156116ad5760405162461bcd60e51b815260040161051a90613cd1565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156116ff5760405162461bcd60e51b815260040161051a90613d13565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561173957611739613c1c565b146117565760405162461bcd60e51b815260040161051a90613d5c565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101611360565b5f806117f534612d30565b905061180385828686612dda565b95945050505050565b61181461320e565b61160481613259565b60408051606080820183525f8083526020830181905292820152905f805160206143028339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611892573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118b99190810190613e2b565b91509150806119205760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161051a565b82548251146119835760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161051a565b60208201516001600160a01b0316156119f65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161051a565b509392505050565b5f805f8351603614611a225760405162461bcd60e51b815260040161051a906140a3565b5f805b6002811015611a7157611a398160016140ec565b611a44906008613de7565b61ffff16868281518110611a5a57611a5a6140ff565b016020015160f81c901b9190911790600101611a25565b5061ffff811615611a945760405162461bcd60e51b815260040161051a90614113565b5f805b6004811015611aef57611aab8160036140ec565b611ab6906008613de7565b63ffffffff1687611ac8836002614156565b81518110611ad857611ad86140ff565b016020015160f81c901b9190911790600101611a97565b5063ffffffff8116600314611b165760405162461bcd60e51b815260040161051a90614169565b5f805b6020811015611b6b57611b2d81601f6140ec565b611b38906008613de7565b88611b44836006614156565b81518110611b5457611b546140ff565b016020015160f81c901b9190911790600101611b19565b505f805b6008811015611bca57611b838160076140ec565b611b8e906008613de7565b6001600160401b031689611ba3836026614156565b81518110611bb357611bb36140ff565b016020015160f81c901b9190911790600101611b6f565b505f805b6008811015611c2957611be28160076140ec565b611bed906008613de7565b6001600160401b03168a611c0283602e614156565b81518110611c1257611c126140ff565b016020015160f81c901b9190911790600101611bce565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206142e2833981519152929190611c9590613bea565b9050118015611cdb575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611cd957611cd9613c1c565b145b61059c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161051a565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061434283398151915290528390208351918201909352825491925f8051602061430283398151915292829060ff166005811115611dc257611dc2613c1c565b6005811115611dd357611dd3613c1c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206142e2833981519152929190611e9990613bea565b9050118015611edf575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611edd57611edd613c1c565b145b61059c5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161051a565b5f808251602714611f745760405162461bcd60e51b815260040161051a906140a3565b5f805b6002811015611fc357611f8b8160016140ec565b611f96906008613de7565b61ffff16858281518110611fac57611fac6140ff565b016020015160f81c901b9190911790600101611f77565b5061ffff811615611fe65760405162461bcd60e51b815260040161051a90614113565b5f805b600481101561204157611ffd8160036140ec565b612008906008613de7565b63ffffffff168661201a836002614156565b8151811061202a5761202a6140ff565b016020015160f81c901b9190911790600101611fe9565b5063ffffffff81166002146120685760405162461bcd60e51b815260040161051a90614169565b5f805b60208110156120bd5761207f81601f6140ec565b61208a906008613de7565b87612096836006614156565b815181106120a6576120a66140ff565b016020015160f81c901b919091179060010161206b565b505f866026815181106120d2576120d26140ff565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146121155760405162461bcd60e51b815260040161051a906140a3565b5f805b60028110156121645761212c8160016140ec565b612137906008613de7565b61ffff1685828151811061214d5761214d6140ff565b016020015160f81c901b9190911790600101612118565b5061ffff8116156121875760405162461bcd60e51b815260040161051a90614113565b5f805b60048110156121e25761219e8160036140ec565b6121a9906008613de7565b63ffffffff16866121bb836002614156565b815181106121cb576121cb6140ff565b016020015160f81c901b919091179060010161218a565b5063ffffffff81166004146122095760405162461bcd60e51b815260040161051a90614169565b5f805b602081101561225e5761222081601f6140ec565b61222b906008613de7565b87612237836006614156565b81518110612247576122476140ff565b016020015160f81c901b919091179060010161220c565b505f805b60088110156122bd576122768160076140ec565b612281906008613de7565b6001600160401b031688612296836026614156565b815181106122a6576122a66140ff565b016020015160f81c901b9190911790600101612262565b5090969095509350505050565b5f8181525f805160206143428339815191526020526040808220815160e0810190925280545f8051602061430283398151915293929190829060ff16600581111561231757612317613c1c565b600581111561232857612328613c1c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123a2576123a2613c1c565b146123bf5760405162461bcd60e51b815260040161051a906141b0565b60408101516001600160a01b0316336001600160a01b0316146124395760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161051a565b612446816080015161329c565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561248a5761248a613c1c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61253e846125388161261c565b5f612786565b5f858152600685016020526040902090915061255a8282613f6f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061258790859060040161402a565b6020604051808303815f875af11580156125a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c79190613cba565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f805160206143428339815191526020526040812060020180545f8051602061430283398151915291600160a01b9091046001600160401b03169081906014612668836141f6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061434283398151915260205260409020815181545f805160206143028339815191529284929091829060ff191660018360058111156126e1576126e1613c1c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156127ff576127bf8160016140ec565b6127ca906008613de7565b5081515f908390839081106127e1576127e16140ff565b60200101906001600160f81b03191690815f1a9053506001016127ab565b505f5b6004811015612862576128168160036140ec565b612821906008613de7565b6001901c60f81b82612834836002614156565b81518110612844576128446140ff565b60200101906001600160f81b03191690815f1a905350600101612802565b505f5b60208110156128c45761287981601f6140ec565b612884906008613de7565b86901c60f81b82612896836006614156565b815181106128a6576128a66140ff565b60200101906001600160f81b03191690815f1a905350600101612865565b505f5b600881101561292f576128db8160076140ec565b6128e6906008613de7565b6001600160401b038616901c60f81b82612901836026614156565b81518110612911576129116140ff565b60200101906001600160f81b03191690815f1a9053506001016128c7565b505f5b600881101561299a576129468160076140ec565b612951906008613de7565b6001600160401b038516901c60f81b8261296c83602e614156565b8151811061297c5761297c6140ff565b60200101906001600160f81b03191690815f1a905350600101612932565b50949350505050565b6129ab61343d565b5f6129b582610829565b90505f805160206142e28339815191525f6129cf86611d42565b90506002815160058111156129e6576129e6613c1c565b14612a035760405162461bcd60e51b815260040161051a906141b0565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b031615612a995760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a2064656c656761746f7220616c726560448201526d18591e481c9959da5cdd195c995960921b606482015260840161051a565b612aa28361329c565b8281608001818151612ab4919061421b565b6001600160401b0316905250612aca8682612697565b5f612ad48761261c565b90505f612ae688838560800151612786565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612b168282613f6f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b4390859060040161402a565b6020604051808303815f875af1158015612b5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b839190613cba565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff19166001836004811115612c0457612c04613c1c565b02179055506020820151815460408085015160608601516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0267ffffffffffffffff60481b199683166101000296909616610100600160881b03199095169490941794909417169190911783556080808501516001909401805460a0909601518416600160401b026001600160801b0319909616949093169390931793909317905585015190516001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b91612d0c918c918a906001600160401b0393841681529183166020830152909116604082015260600190565b60405180910390a450505050505061059c60015f8051602061432283398151915255565b5f5f805160206142e28339815191528282612d4a82610829565b83549091506001600160401b03821610801590612d7457508260010154816001600160401b031611155b612dd25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161051a565b949350505050565b5f612de361343d565b5f80516020614302833981519152426001600160401b038516118015612e1d57506001600160401b038416612e1b426202a300614156565b115b612e7f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161051a565b85612ed65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161051a565b5f86815260088201602052604090205415612f445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161051a565b8251603014612fab5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161051a565b612fb48561329c565b5f80612ffb6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613487565b5f828152600586016020526040902091935091506130198282613f6f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061304690859060040161402a565b6020604051808303815f875af1158015613062573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130869190613cba565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156130ff576130ff613c1c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556131a88361261c565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612dd260015f8051602061432283398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661325757604051631afcd79f60e31b815260040160405180910390fd5b565b61326161320e565b61326a8161382c565b6116046060820135608083013561328760c0850160a08601613a65565b61329760e0860160c0870161423b565b61384d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206143028339815191529060ff165f036132da575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061332290836140ec565b1061333e576001600160401b038416604083015280825261335d565b8382604001818151613350919061421b565b6001600160401b03169052505b5f8260200151836040015160646133749190614256565b61337e9190614281565b600285015490915060ff90811690821611156133f95760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161051a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061432283398151915280546001190161346e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061432283398151915255565b5f60608260800151516030146134f15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161051a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613568576135288160016140ec565b613533906008613de7565b5081515f9083908390811061354a5761354a6140ff565b60200101906001600160f81b03191690815f1a905350600101613514565b505f5b60048110156135c65761357f8160036140ec565b61358a906008613de7565b505f82613598836002614156565b815181106135a8576135a86140ff565b60200101906001600160f81b03191690815f1a90535060010161356b565b505f5b602081101561362357845181602081106135e5576135e56140ff565b1a60f81b826135f5836006614156565b81518110613605576136056140ff565b60200101906001600160f81b03191690815f1a9053506001016135c9565b505f5b60208110156136835784602001518160208110613645576136456140ff565b1a60f81b82613655836026614156565b81518110613665576136656140ff565b60200101906001600160f81b03191690815f1a905350600101613626565b505f5b60088110156136f75761369a8160076140ec565b6136a5906008613de7565b60ff1685604001516001600160401b0316901c60f81b828260466136c99190614156565b815181106136d9576136d96140ff565b60200101906001600160f81b03191690815f1a905350600101613686565b505f5b60308110156137625784608001518181518110613719576137196140ff565b01602001516001600160f81b0319168261373483604e614156565b81518110613744576137446140ff565b60200101906001600160f81b03191690815f1a9053506001016136fa565b505f5b60088110156137d4576137798160076140ec565b613784906008613de7565b60608601516001600160401b0390811691161c60f81b826137a683607e614156565b815181106137b6576137b66140ff565b60200101906001600160f81b03191690815f1a905350600101613765565b506002816040516137e591906142a6565b602060405180830381855afa158015613800573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138239190613cba565b94909350915050565b61383461320e565b61383c6138a8565b6138446138b8565b611604816138c0565b61385561320e565b5f5f805160206142e2833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6138b061320e565b61325761392c565b61325761320e565b6138c861320e565b80355f8051602061430283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561391260608301604084016142c1565b600291909101805460ff191660ff90921691909117905550565b61347461320e565b50805461394090613bea565b5f825580601f1061394f575050565b601f0160209004905f5260205f209081019061160491905b8082111561397a575f8155600101613967565b5090565b5f60e0828403121561398e575f80fd5b50919050565b5f602082840312156139a4575f80fd5b5035919050565b803563ffffffff811681146139be575f80fd5b919050565b6001600160a01b0381168114611604575f80fd5b5f80604083850312156139e8575f80fd5b6139f1836139ab565b91506020830135613a01816139c3565b809150509250929050565b5f8060408385031215613a1d575f80fd5b823591506020830135613a01816139c3565b5f60208284031215613a3f575f80fd5b613a48826139ab565b9392505050565b80356001600160401b03811681146139be575f80fd5b5f60208284031215613a75575f80fd5b613a4882613a4f565b8015158114611604575f80fd5b5f805f60608486031215613a9d575f80fd5b833592506020840135613aaf81613a7e565b9150613abd604085016139ab565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613afc57613afc613ac6565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b2a57613b2a613ac6565b604052919050565b5f6001600160401b03821115613b4a57613b4a613ac6565b50601f01601f191660200190565b5f805f60608486031215613b6a575f80fd5b83359250613b7a60208501613a4f565b915060408401356001600160401b03811115613b94575f80fd5b8401601f81018613613ba4575f80fd5b8035613bb7613bb282613b32565b613b02565b818152876020838501011115613bcb575f80fd5b816020840160208301375f602083830101528093505050509250925092565b600181811c90821680613bfe57607f821691505b60208210810361398e57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613c4281613bea565b806020870152604060018084165f8114613c635760018114613c7f57613cac565b60ff19851660408a0152604084151560051b8a01019550613cac565b895f5260205f205f5b85811015613ca35781548b8201860152908301908801613c88565b8a016040019650505b509398975050505050505050565b5f60208284031215613cca575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613de257613de2613dac565b500490565b808202811582820484141761083957610839613dc0565b5f5b83811015613e18578181015183820152602001613e00565b50505f910152565b80516139be81613a7e565b5f8060408385031215613e3c575f80fd5b82516001600160401b0380821115613e52575f80fd5b9084019060608287031215613e65575f80fd5b613e6d613ada565b82518152602080840151613e80816139c3565b82820152604084015183811115613e95575f80fd5b80850194505087601f850112613ea9575f80fd5b83519250613eb9613bb284613b32565b8381528882858701011115613ecc575f80fd5b613edb84838301848801613dfe565b80604084015250819550613ef0818801613e20565b9450505050509250929050565b6001600160401b03828116828216039080821115613f1d57613f1d613dc0565b5092915050565b601f82111561059c57805f5260205f20601f840160051c81016020851015613f495750805b601f840160051c820191505b81811015613f68575f8155600101613f55565b5050505050565b81516001600160401b03811115613f8857613f88613ac6565b613f9c81613f968454613bea565b84613f24565b602080601f831160018114613fcf575f8415613fb85750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b82811015613ffd57888601518255948401946001909101908401613fde565b508582101561401a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f8251806020840152614048816040850160208701613dfe565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561083957610839613dc0565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561083957610839613dc0565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b60208082526026908201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060408201526561637469766560d01b606082015260800190565b5f6001600160401b0380831681810361421157614211613dc0565b6001019392505050565b6001600160401b03818116838216019080821115613f1d57613f1d613dc0565b5f6020828403121561424b575f80fd5b8135613a48816139c3565b6001600160401b0381811683821602808216919082811461427957614279613dc0565b505092915050565b5f6001600160401b038084168061429a5761429a613dac565b92169190910492915050565b5f82516142b7818460208701613dfe565b9190910192915050565b5f602082840312156142d1575f80fd5b813560ff81168114613a48575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516144fc3803806144fc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143af8061014d5f395ff3fe6080604052600436106100f9575f3560e01c80636a7e3d8311610092578063b771b3bc11610062578063b771b3bc1461029e578063bee0a03f146102d0578063c599e24f146102ef578063d61bed7414610302578063f40797d714610321575f80fd5b80636a7e3d831461022257806376f7862114610241578063927e7e7514610260578063a3a65e481461027f575f80fd5b80632e2194d8116100cd5780632e2194d81461017b578063467ef06f146101b757806362065856146101d657806366435abf14610203575f80fd5b8062e41792146100fd5780630322ed981461011e5780630915204e1461013d5780630b77f6931461015c575b5f80fd5b348015610108575f80fd5b5061011c610117366004613a05565b610334565b005b348015610129575f80fd5b5061011c610138366004613a1b565b610440565b348015610148575f80fd5b5061011c610157366004613a5e565b6105a1565b348015610167575f80fd5b5061011c610176366004613a93565b610761565b348015610186575f80fd5b5061019a610195366004613a1b565b610829565b6040516001600160401b0390911681526020015b60405180910390f35b3480156101c2575f80fd5b5061011c6101d1366004613ab6565b61083f565b3480156101e1575f80fd5b506101f56101f0366004613aec565b610b9b565b6040519081526020016101ae565b34801561020e575f80fd5b5061019a61021d366004613a1b565b610bb4565b34801561022d575f80fd5b5061011c61023c366004613a93565b610bc8565b34801561024c575f80fd5b5061011c61025b366004613b12565b610c4a565b34801561026b575f80fd5b5061011c61027a366004613a1b565b610f63565b34801561028a575f80fd5b5061011c610299366004613ab6565b611374565b3480156102a9575f80fd5b506102b86005600160991b0181565b6040516001600160a01b0390911681526020016101ae565b3480156102db575f80fd5b5061011c6102ea366004613a1b565b61152d565b61011c6102fd366004613a1b565b6115fc565b34801561030d575f80fd5b5061011c61031c366004613a5e565b61160a565b6101f561032f366004613bdf565b6117ed565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156103785750825b90505f826001600160401b031660011480156103935750303b155b9050811580156103a1575080155b156103bf5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156103e957845460ff60401b1916600160401b1785555b6103f28661180f565b831561043857845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061434383398151915292919061048890613c71565b90501180156104ba575060035f83815260078301602052604090205460ff1660058111156104b8576104b8613ca3565b145b6105235760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613cb7565b6020604051808303815f875af1158015610578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061059c9190613d41565b505050565b5f805160206143238339815191525f6105b984611820565b90505f806105ca8360400151611a01565b50915091506105d98286611c3c565b5f82815260058501602090815260408083206001600160a01b03891684529091528120610605916139bb565b5f61060f83611d45565b9050816001600160401b031681606001516001600160401b031610156106475760405162461bcd60e51b815260040161051a90613d58565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b9092041611156106a05760405162461bcd60e51b815260040161051a90613d9a565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff1660048111156106da576106da613ca3565b146106f75760405162461bcd60e51b815260040161051a90613de3565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b61076b8282611e40565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614323833981519152916005600160991b019163ee5b48eb916107e391600401613cb7565b6020604051808303815f875af11580156107ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108239190613d41565b50505050565b5f61083964e8d4a5100083613e5b565b92915050565b5f805160206143438339815191525f61085783611820565b90505f806108688360400151611f54565b9150915080156108cd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161051a565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156108fe576108fe613ca3565b600581111561090f5761090f613ca3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561098857610988613ca3565b14806109a657506001825160058111156109a4576109a4613ca3565b145b610a055760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161051a565b600382516005811115610a1a57610a1a613ca3565b03610a4157505f8381526006860160205260408120600491610a3c91906139bb565b610a45565b5060055b6020808301515f90815260088801909152604081205581816005811115610a6e57610a6e613ca3565b90816005811115610a8157610a81613ca3565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ab557610ab5613ca3565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610b6857610b68613ca3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6108396001600160401b03831664e8d4a51000613e6e565b5f610bbe82611d45565b6080015192915050565b610bd28282611c3c565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614323833981519152916005600160991b019163ee5b48eb916107e391600401613cb7565b8115610f5a575f5f805160206143238339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610cab573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cd29190810190613eb2565b9150915080610d355760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161051a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d9c9190613d41565b825114610e005760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161051a565b60208201516001600160a01b031615610e765760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161051a565b5f80610e8584604001516120f5565b91509150818814610ef25760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161051a565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61059c836122cd565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f8051602061432383398151915293929190829060ff166004811115610fce57610fce613ca3565b6004811115610fdf57610fdf613ca3565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a090910152905060028151600481111561104957611049613ca3565b146110a85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b606482015260840161051a565b5f6110b28461265e565b9050600382819052506001600160401b034281166060840152811660a08301525f848152600384016020526040812083916110ea3390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff1916600183600481111561112057611120613ca3565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f6111ca85611d45565b905082602001516001600160401b031681608001516001600160401b0316116112415760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161051a565b8260200151816080018181516112579190613f84565b6001600160401b031690525061126d85826126d9565b5f61127d868484608001516127c8565b5f878152600587016020908152604080832033845290915290209091506112a48282613ff6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112d19085906004016140b1565b6020604051808303815f875af11580156112ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113119190613d41565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b5f805160206143438339815191525f61138c83611820565b90505f8061139d8360400151611f54565b91509150806113ff5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161051a565b5f8281526005850160205260408120805461141990613c71565b905011801561144b575060015f83815260078601602052604090205460ff16600581111561144957611449613ca3565b145b6114675760405162461bcd60e51b815260040161051a906140e3565b5f828152600585016020526040812061147f916139bb565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061434383398151915292919061157590613c71565b90501180156115a7575060015f83815260078301602052604090205460ff1660058111156115a5576115a5613ca3565b145b6115c35760405162461bcd60e51b815260040161051a906140e3565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161055c9190600401613cb7565b6116078133346129e5565b50565b5f805160206143238339815191525f61162284611820565b90505f806116338360400151611a01565b50915091506116428286611e40565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061166e916139bb565b5f61167883611d45565b9050816001600160401b031681606001516001600160401b031610156116b05760405162461bcd60e51b815260040161051a90613d58565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156117025760405162461bcd60e51b815260040161051a90613d9a565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561173c5761173c613ca3565b146117595760405162461bcd60e51b815260040161051a90613de3565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101611363565b5f806117f834612db7565b905061180685828686612e61565b95945050505050565b611817613295565b611607816132e0565b60408051606080820183525f8083526020830181905292820152905f805160206143438339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611895573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118bc9190810190613eb2565b91509150806119235760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161051a565b82548251146119865760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161051a565b60208201516001600160a01b0316156119f95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161051a565b509392505050565b5f805f8351603614611a255760405162461bcd60e51b815260040161051a9061412a565b5f805b6002811015611a7457611a3c816001614173565b611a47906008613e6e565b61ffff16868281518110611a5d57611a5d614186565b016020015160f81c901b9190911790600101611a28565b5061ffff811615611a975760405162461bcd60e51b815260040161051a9061419a565b5f805b6004811015611af257611aae816003614173565b611ab9906008613e6e565b63ffffffff1687611acb8360026141dd565b81518110611adb57611adb614186565b016020015160f81c901b9190911790600101611a9a565b5063ffffffff8116600314611b195760405162461bcd60e51b815260040161051a906141f0565b5f805b6020811015611b6e57611b3081601f614173565b611b3b906008613e6e565b88611b478360066141dd565b81518110611b5757611b57614186565b016020015160f81c901b9190911790600101611b1c565b505f805b6008811015611bcd57611b86816007614173565b611b91906008613e6e565b6001600160401b031689611ba68360266141dd565b81518110611bb657611bb6614186565b016020015160f81c901b9190911790600101611b72565b505f805b6008811015611c2c57611be5816007614173565b611bf0906008613e6e565b6001600160401b03168a611c0583602e6141dd565b81518110611c1557611c15614186565b016020015160f81c901b9190911790600101611bd1565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f80516020614323833981519152929190611c9890613c71565b9050118015611cde575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611cdc57611cdc613ca3565b145b61059c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161051a565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061438383398151915290528390208351918201909352825491925f8051602061434383398151915292829060ff166005811115611dc557611dc5613ca3565b6005811115611dd657611dd6613ca3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f80516020614323833981519152929190611e9c90613c71565b9050118015611ee2575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611ee057611ee0613ca3565b145b61059c5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161051a565b5f808251602714611f775760405162461bcd60e51b815260040161051a9061412a565b5f805b6002811015611fc657611f8e816001614173565b611f99906008613e6e565b61ffff16858281518110611faf57611faf614186565b016020015160f81c901b9190911790600101611f7a565b5061ffff811615611fe95760405162461bcd60e51b815260040161051a9061419a565b5f805b600481101561204457612000816003614173565b61200b906008613e6e565b63ffffffff168661201d8360026141dd565b8151811061202d5761202d614186565b016020015160f81c901b9190911790600101611fec565b5063ffffffff811660021461206b5760405162461bcd60e51b815260040161051a906141f0565b5f805b60208110156120c05761208281601f614173565b61208d906008613e6e565b876120998360066141dd565b815181106120a9576120a9614186565b016020015160f81c901b919091179060010161206e565b505f866026815181106120d5576120d5614186565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146121185760405162461bcd60e51b815260040161051a9061412a565b5f805b60028110156121675761212f816001614173565b61213a906008613e6e565b61ffff1685828151811061215057612150614186565b016020015160f81c901b919091179060010161211b565b5061ffff81161561218a5760405162461bcd60e51b815260040161051a9061419a565b5f805b60048110156121e5576121a1816003614173565b6121ac906008613e6e565b63ffffffff16866121be8360026141dd565b815181106121ce576121ce614186565b016020015160f81c901b919091179060010161218d565b5063ffffffff811660041461220c5760405162461bcd60e51b815260040161051a906141f0565b5f805b60208110156122615761222381601f614173565b61222e906008613e6e565b8761223a8360066141dd565b8151811061224a5761224a614186565b016020015160f81c901b919091179060010161220f565b505f805b60088110156122c057612279816007614173565b612284906008613e6e565b6001600160401b0316886122998360266141dd565b815181106122a9576122a9614186565b016020015160f81c901b9190911790600101612265565b5090969095509350505050565b5f8181525f805160206143838339815191526020526040808220815160e0810190925280545f8051602061434383398151915293929190829060ff16600581111561231a5761231a613ca3565b600581111561232b5761232b613ca3565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123a5576123a5613ca3565b146124015760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161051a565b60408101516001600160a01b0316336001600160a01b03161461247b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161051a565b6124888160800151613323565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124cc576124cc613ca3565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125808461257a8161265e565b5f6127c8565b5f858152600685016020526040902090915061259c8282613ff6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125c99085906004016140b1565b6020604051808303815f875af11580156125e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126099190613d41565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f805160206143838339815191526020526040812060020180545f8051602061434383398151915291600160a01b9091046001600160401b031690819060146126aa83614237565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061438383398151915260205260409020815181545f805160206143438339815191529284929091829060ff1916600183600581111561272357612723613ca3565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561284157612801816001614173565b61280c906008613e6e565b5081515f9083908390811061282357612823614186565b60200101906001600160f81b03191690815f1a9053506001016127ed565b505f5b60048110156128a457612858816003614173565b612863906008613e6e565b6001901c60f81b826128768360026141dd565b8151811061288657612886614186565b60200101906001600160f81b03191690815f1a905350600101612844565b505f5b6020811015612906576128bb81601f614173565b6128c6906008613e6e565b86901c60f81b826128d88360066141dd565b815181106128e8576128e8614186565b60200101906001600160f81b03191690815f1a9053506001016128a7565b505f5b60088110156129715761291d816007614173565b612928906008613e6e565b6001600160401b038616901c60f81b826129438360266141dd565b8151811061295357612953614186565b60200101906001600160f81b03191690815f1a905350600101612909565b505f5b60088110156129dc57612988816007614173565b612993906008613e6e565b6001600160401b038516901c60f81b826129ae83602e6141dd565b815181106129be576129be614186565b60200101906001600160f81b03191690815f1a905350600101612974565b50949350505050565b6129ed6134c4565b5f6129f782610829565b90505f805160206143238339815191525f612a1186611d45565b9050600281516005811115612a2857612a28613ca3565b14612a875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161051a565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b031615612b205760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b606482015260840161051a565b612b2983613323565b8281608001818151612b3b919061425c565b6001600160401b0316905250612b5186826126d9565b5f612b5b8761265e565b90505f612b6d888385608001516127c8565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612b9d8282613ff6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612bca9085906004016140b1565b6020604051808303815f875af1158015612be6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c0a9190613d41565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff19166001836004811115612c8b57612c8b613ca3565b02179055506020820151815460408085015160608601516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0267ffffffffffffffff60481b199683166101000296909616610100600160881b03199095169490941794909417169190911783556080808501516001909401805460a0909601518416600160401b026001600160801b0319909616949093169390931793909317905585015190516001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b91612d93918c918a906001600160401b0393841681529183166020830152909116604082015260600190565b60405180910390a450505050505061059c60015f8051602061436383398151915255565b5f5f805160206143238339815191528282612dd182610829565b83549091506001600160401b03821610801590612dfb57508260010154816001600160401b031611155b612e595760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161051a565b949350505050565b5f612e6a6134c4565b5f80516020614343833981519152426001600160401b038516118015612ea457506001600160401b038416612ea2426202a3006141dd565b115b612f065760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161051a565b85612f5d5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161051a565b5f86815260088201602052604090205415612fcb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161051a565b82516030146130325760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161051a565b61303b85613323565b5f806130826040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061350e565b5f828152600586016020526040902091935091506130a08282613ff6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906130cd9085906004016140b1565b6020604051808303815f875af11580156130e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061310d9190613d41565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561318657613186613ca3565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561322f8361265e565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612e5960015f8051602061436383398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166132de57604051631afcd79f60e31b815260040160405180910390fd5b565b6132e8613295565b6132f1816138b3565b6116076060820135608083013561330e60c0850160a08601613aec565b61331e60e0860160c0870161427c565b6138d4565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206143438339815191529060ff165f03613361575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133a99083614173565b106133c5576001600160401b03841660408301528082526133e4565b83826040018181516133d7919061425c565b6001600160401b03169052505b5f8260200151836040015160646133fb9190614297565b61340591906142c2565b600285015490915060ff90811690821611156134805760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161051a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206143638339815191528054600119016134f557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061436383398151915255565b5f60608260800151516030146135785760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161051a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135ef576135af816001614173565b6135ba906008613e6e565b5081515f908390839081106135d1576135d1614186565b60200101906001600160f81b03191690815f1a90535060010161359b565b505f5b600481101561364d57613606816003614173565b613611906008613e6e565b505f8261361f8360026141dd565b8151811061362f5761362f614186565b60200101906001600160f81b03191690815f1a9053506001016135f2565b505f5b60208110156136aa578451816020811061366c5761366c614186565b1a60f81b8261367c8360066141dd565b8151811061368c5761368c614186565b60200101906001600160f81b03191690815f1a905350600101613650565b505f5b602081101561370a57846020015181602081106136cc576136cc614186565b1a60f81b826136dc8360266141dd565b815181106136ec576136ec614186565b60200101906001600160f81b03191690815f1a9053506001016136ad565b505f5b600881101561377e57613721816007614173565b61372c906008613e6e565b60ff1685604001516001600160401b0316901c60f81b8282604661375091906141dd565b8151811061376057613760614186565b60200101906001600160f81b03191690815f1a90535060010161370d565b505f5b60308110156137e957846080015181815181106137a0576137a0614186565b01602001516001600160f81b031916826137bb83604e6141dd565b815181106137cb576137cb614186565b60200101906001600160f81b03191690815f1a905350600101613781565b505f5b600881101561385b57613800816007614173565b61380b906008613e6e565b60608601516001600160401b0390811691161c60f81b8261382d83607e6141dd565b8151811061383d5761383d614186565b60200101906001600160f81b03191690815f1a9053506001016137ec565b5060028160405161386c91906142e7565b602060405180830381855afa158015613887573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138aa9190613d41565b94909350915050565b6138bb613295565b6138c361392f565b6138cb61393f565b61160781613947565b6138dc613295565b5f5f80516020614323833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613937613295565b6132de6139b3565b6132de613295565b61394f613295565b80355f8051602061434383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139996060830160408401614302565b600291909101805460ff191660ff90921691909117905550565b6134fb613295565b5080546139c790613c71565b5f825580601f106139d6575050565b601f0160209004905f5260205f209081019061160791905b80821115613a01575f81556001016139ee565b5090565b5f60e08284031215613a15575f80fd5b50919050565b5f60208284031215613a2b575f80fd5b5035919050565b803563ffffffff81168114613a45575f80fd5b919050565b6001600160a01b0381168114611607575f80fd5b5f8060408385031215613a6f575f80fd5b613a7883613a32565b91506020830135613a8881613a4a565b809150509250929050565b5f8060408385031215613aa4575f80fd5b823591506020830135613a8881613a4a565b5f60208284031215613ac6575f80fd5b613acf82613a32565b9392505050565b80356001600160401b0381168114613a45575f80fd5b5f60208284031215613afc575f80fd5b613acf82613ad6565b8015158114611607575f80fd5b5f805f60608486031215613b24575f80fd5b833592506020840135613b3681613b05565b9150613b4460408501613a32565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b8357613b83613b4d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613bb157613bb1613b4d565b604052919050565b5f6001600160401b03821115613bd157613bd1613b4d565b50601f01601f191660200190565b5f805f60608486031215613bf1575f80fd5b83359250613c0160208501613ad6565b915060408401356001600160401b03811115613c1b575f80fd5b8401601f81018613613c2b575f80fd5b8035613c3e613c3982613bb9565b613b89565b818152876020838501011115613c52575f80fd5b816020840160208301375f602083830101528093505050509250925092565b600181811c90821680613c8557607f821691505b602082108103613a1557634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613cc981613c71565b806020870152604060018084165f8114613cea5760018114613d0657613d33565b60ff19851660408a0152604084151560051b8a01019550613d33565b895f5260205f205f5b85811015613d2a5781548b8201860152908301908801613d0f565b8a016040019650505b509398975050505050505050565b5f60208284031215613d51575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613e6957613e69613e33565b500490565b808202811582820484141761083957610839613e47565b5f5b83811015613e9f578181015183820152602001613e87565b50505f910152565b8051613a4581613b05565b5f8060408385031215613ec3575f80fd5b82516001600160401b0380821115613ed9575f80fd5b9084019060608287031215613eec575f80fd5b613ef4613b61565b82518152602080840151613f0781613a4a565b82820152604084015183811115613f1c575f80fd5b80850194505087601f850112613f30575f80fd5b83519250613f40613c3984613bb9565b8381528882858701011115613f53575f80fd5b613f6284838301848801613e85565b80604084015250819550613f77818801613ea7565b9450505050509250929050565b6001600160401b03828116828216039080821115613fa457613fa4613e47565b5092915050565b601f82111561059c57805f5260205f20601f840160051c81016020851015613fd05750805b601f840160051c820191505b81811015613fef575f8155600101613fdc565b5050505050565b81516001600160401b0381111561400f5761400f613b4d565b6140238161401d8454613c71565b84613fab565b602080601f831160018114614056575f841561403f5750858301515b5f19600386901b1c1916600185901b178555610438565b5f85815260208120601f198616915b8281101561408457888601518255948401946001909101908401614065565b50858210156140a157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b602081525f82518060208401526140cf816040850160208701613e85565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561083957610839613e47565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561083957610839613e47565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b0380831681810361425257614252613e47565b6001019392505050565b6001600160401b03818116838216019080821115613fa457613fa4613e47565b5f6020828403121561428c575f80fd5b8135613acf81613a4a565b6001600160401b038181168382160280821691908281146142ba576142ba613e47565b505092915050565b5f6001600160401b03808416806142db576142db613e33565b92169190910492915050565b5f82516142f8818460208701613e85565b9190910192915050565b5f60208284031215614312575f80fd5b813560ff81168114613acf575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index ae0ec8153..f7a53b212 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -156,13 +156,13 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Ensure the validation period is active Validator memory validator = _getValidator(validationID); require( - validator.status == ValidatorStatus.Active, "ValidatorManager: validator not active" + validator.status == ValidatorStatus.Active, "PoSValidatorManager: validator not active" ); // Ensure the delegator is not already registered require( $._delegatorStakes[validationID][delegator].weight == 0, - "ValidatorManager: delegator already registered" + "PoSValidatorManager: delegator already registered" ); _checkAndUpdateChurnTracker(weight); @@ -247,7 +247,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Ensure the delegator is active Delegator memory delegator = $._delegatorStakes[validationID][_msgSender()]; require( - delegator.status == DelegatorStatus.Active, "ValidatorManager: delegator not active" + delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegator not active" ); uint64 nonce = _getAndIncrementNonce(validationID); delegator.status = DelegatorStatus.PendingRemoved; From e0a8f70dae4c4d858c79060dffb782b58d7453d3 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 4 Sep 2024 18:58:57 -0500 Subject: [PATCH 191/545] comment typo --- contracts/staking/PoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index f7a53b212..cc6b6f33e 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -296,7 +296,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _getValidator(validationID); // The received nonce should be no greater than the highest sent nonce require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); - // It should also be greater than or equal to the delegator's starting nonce + // It should also be greater than or equal to the delegator's ending nonce require( $._delegatorStakes[validationID][delegator].endingNonce <= nonce, "PoSValidatorManager: nonce does not match" From 22416b48f5849957faed3ed3968b07ac24cf34ef Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 4 Sep 2024 21:36:33 -0500 Subject: [PATCH 192/545] delegationID wip --- .../staking/ERC20TokenStakingManager.sol | 2 +- .../staking/NativeTokenStakingManager.sol | 2 +- contracts/staking/PoSValidatorManager.sol | 103 ++++++++------- .../interfaces/IERC20TokenStakingManager.sol | 2 +- .../interfaces/INativeTokenStakingManager.sol | 2 +- .../interfaces/IPoSValidatorManager.sol | 41 +++--- .../tests/ERC20TokenStakingManagerTests.t.sol | 5 +- .../NativeTokenStakingManagerTests.t.sol | 4 +- .../tests/PoSValidatorManagerTests.t.sol | 117 ++++++++++-------- 9 files changed, 150 insertions(+), 128 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 312a9af89..33f8efe5f 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -108,7 +108,7 @@ contract ERC20TokenStakingManager is function initializeDelegatorRegistration( bytes32 validationID, uint256 delegationAmount - ) external { + ) external returns (bytes32) { return _initializeDelegatorRegistration(validationID, _msgSender(), delegationAmount); } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 3baa0c19c..e93333437 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -66,7 +66,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. */ - function initializeDelegatorRegistration(bytes32 validationID) external payable { + function initializeDelegatorRegistration(bytes32 validationID) external payable returns (bytes32) { return _initializeDelegatorRegistration(validationID, _msgSender(), msg.value); } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 599a3db8e..5c7e908eb 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -29,12 +29,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; /// @notice Maps the validationID to a mapping of delegator address to delegator information. - mapping(bytes32 validationID => mapping(address delegator => Delegator)) _delegatorStakes; + mapping(bytes32 delegationID => Delegator) _delegatorStakes; /// @notice Maps the validationID to a mapping of delegator address to pending register delegator messages. - mapping(bytes32 validationID => mapping(address delegator => bytes)) + mapping(bytes32 delegationID => bytes) _pendingRegisterDelegatorMessages; /// @notice Maps the validationID to a mapping of delegator address to pending end delegator messages. - mapping(bytes32 validationID => mapping(address delegator => bytes)) + mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; } // solhint-enable private-vars-leading-underscore @@ -145,11 +145,16 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function _lock(uint256 value) internal virtual returns (uint256); function _unlock(uint256 value, address to) internal virtual; + // TODO: Updating the nonce in this function call DOES work as expected + function foo(bytes32 validationID) external { + _getAndIncrementNonce(validationID); + } + function _initializeDelegatorRegistration( bytes32 validationID, address delegator, uint256 delegationAmount - ) internal nonReentrant { + ) internal nonReentrant returns (bytes32) { uint64 weight = valueToWeight(_lock(delegationAmount)); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); @@ -158,10 +163,16 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( validator.status == ValidatorStatus.Active, "PoSValidatorManager: validator not active" ); + // TODO: This function call seems to not update the validator manager's state, + // but ONLY when called from here. The same call in other methods does appear to + // update the validator manager's state as expected. + uint64 nonce = _getAndIncrementNonce(validationID); + + bytes32 delegationID = sha256(abi.encodePacked(validationID, delegator, nonce)); // Ensure the delegator is not already registered require( - $._delegatorStakes[validationID][delegator].weight == 0, + $._delegatorStakes[delegationID].weight == 0, "PoSValidatorManager: delegator already registered" ); @@ -172,15 +183,16 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _setValidator(validationID, validator); // Submit the message to the Warp precompile. - uint64 nonce = _getAndIncrementNonce(validationID); bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); - $._pendingRegisterDelegatorMessages[validationID][delegator] = setValidatorWeightPayload; + $._pendingRegisterDelegatorMessages[delegationID] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); // Store the delegator information - $._delegatorStakes[validationID][delegator] = Delegator({ + $._delegatorStakes[delegationID] = Delegator({ status: DelegatorStatus.PendingAdded, + owner: delegator, + validationID: validationID, weight: weight, startedAt: 0, endedAt: 0, @@ -191,29 +203,30 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager emit DelegatorAdded({ validationID: validationID, setWeightMessageID: messageID, - delegator: delegator, + delegationID: delegationID, delegatorWeight: weight, validatorWeight: validator.weight, nonce: nonce }); + return delegationID; } - function resendDelegatorRegistration(bytes32 validationID, address delegator) external { - _checkPendingRegisterDelegatorMessages(validationID, delegator); + function resendDelegatorRegistration(bytes32 delegationID) external { + _checkPendingRegisterDelegatorMessages(delegationID); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Submit the message to the Warp precompile. - WARP_MESSENGER.sendWarpMessage($._pendingRegisterDelegatorMessages[validationID][delegator]); + WARP_MESSENGER.sendWarpMessage($._pendingRegisterDelegatorMessages[delegationID]); } - function completeDelegatorRegistration(uint32 messageIndex, address delegator) external { + function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce,) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - _checkPendingRegisterDelegatorMessages(validationID, delegator); - delete $._pendingRegisterDelegatorMessages[validationID][delegator]; + _checkPendingRegisterDelegatorMessages(delegationID); + delete $._pendingRegisterDelegatorMessages[delegationID]; Validator memory validator = _getValidator(validationID); @@ -221,31 +234,33 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); // It should also be greater than or equal to the delegator's starting nonce require( - $._delegatorStakes[validationID][delegator].startingNonce <= nonce, + $._delegatorStakes[delegationID].startingNonce <= nonce, "PoSValidatorManager: nonce does not match" ); require( - $._delegatorStakes[validationID][delegator].status == DelegatorStatus.PendingAdded, + $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, "PoSValidatorManager: delegator not pending added" ); // Update the delegator status - $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Active; - $._delegatorStakes[validationID][delegator].startedAt = uint64(block.timestamp); - + $._delegatorStakes[delegationID].status = DelegatorStatus.Active; + $._delegatorStakes[delegationID].startedAt = uint64(block.timestamp); emit DelegatorRegistered({ validationID: validationID, - delegator: delegator, + delegationID: delegationID, nonce: nonce, startTime: block.timestamp }); } function initializeEndDelegation( - bytes32 validationID, + bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex ) external { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + bytes32 validationID = $._delegatorStakes[delegationID].validationID; + uint64 uptime; if (includeUptimeProof) { uptime = _getUptime(validationID, messageIndex); @@ -253,10 +268,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // TODO: Calculate the delegator's reward, but do not unlock it - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - // Ensure the delegator is active - Delegator memory delegator = $._delegatorStakes[validationID][_msgSender()]; + Delegator memory delegator = $._delegatorStakes[delegationID]; require( delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegator not active" ); @@ -265,7 +278,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager delegator.endedAt = uint64(block.timestamp); delegator.endingNonce = nonce; - $._delegatorStakes[validationID][_msgSender()] = delegator; + $._delegatorStakes[delegationID] = delegator; Validator memory validator = _getValidator(validationID); require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); @@ -275,77 +288,75 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); - $._pendingEndDelegatorMessages[validationID][_msgSender()] = setValidatorWeightPayload; + $._pendingEndDelegatorMessages[delegationID] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); emit DelegatorRemovalInitialized({ validationID: validationID, setWeightMessageID: messageID, - delegator: _msgSender(), + delegationID: delegationID, validatorWeight: validator.weight, nonce: nonce, endTime: block.timestamp }); } - function resendEndDelegation(bytes32 validationID, address delegator) external { - _checkPendingEndDelegatorMessage(validationID, delegator); + function resendEndDelegation(bytes32 delegationID) external { + _checkPendingEndDelegatorMessage(delegationID); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - WARP_MESSENGER.sendWarpMessage($._pendingEndDelegatorMessages[validationID][delegator]); + WARP_MESSENGER.sendWarpMessage($._pendingEndDelegatorMessages[delegationID]); } - function completeEndDelegation(uint32 messageIndex, address delegator) external { + function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce,) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - _checkPendingEndDelegatorMessage(validationID, delegator); - delete $._pendingEndDelegatorMessages[validationID][delegator]; + _checkPendingEndDelegatorMessage(delegationID); + delete $._pendingEndDelegatorMessages[delegationID]; Validator memory validator = _getValidator(validationID); // The received nonce should be no greater than the highest sent nonce require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); // It should also be greater than or equal to the delegator's ending nonce require( - $._delegatorStakes[validationID][delegator].endingNonce <= nonce, + $._delegatorStakes[delegationID].endingNonce <= nonce, "PoSValidatorManager: nonce does not match" ); require( - $._delegatorStakes[validationID][delegator].status == DelegatorStatus.PendingRemoved, + $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, "PoSValidatorManager: delegator not pending added" ); // Update the delegator status - $._delegatorStakes[validationID][delegator].status = DelegatorStatus.Completed; + $._delegatorStakes[delegationID].status = DelegatorStatus.Completed; // TODO: Unlock the delegator's stake and their reward - emit DelegationEnded(validationID, delegator, nonce); + emit DelegationEnded(validationID, delegationID, nonce); } function _checkPendingEndDelegatorMessage( - bytes32 validationID, - address delegator + bytes32 delegationID ) private view { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); require( - $._pendingEndDelegatorMessages[validationID][delegator].length > 0 - && $._delegatorStakes[validationID][delegator].status == DelegatorStatus.PendingRemoved, + $._pendingEndDelegatorMessages[delegationID].length > 0 + && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, "PoSValidatorManager: delegator removal not pending" ); } function _checkPendingRegisterDelegatorMessages( - bytes32 validationID, - address delegator + bytes32 delegationID ) private view { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); require( - $._pendingRegisterDelegatorMessages[validationID][delegator].length > 0 - && $._delegatorStakes[validationID][delegator].status == DelegatorStatus.PendingAdded, + $._pendingRegisterDelegatorMessages[delegationID].length > 0 + && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, "PoSValidatorManager: delegator registration not pending" ); } diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index 338bac25c..432f2ae01 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -21,5 +21,5 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { bytes memory blsPublicKey ) external returns (bytes32 validationID); - function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) external; + function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) external returns (bytes32); } diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index 3a72c380b..de26398f1 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -20,5 +20,5 @@ interface INativeTokenStakingManager is IPoSValidatorManager { bytes memory blsPublicKey ) external payable returns (bytes32 validationID); - function initializeDelegatorRegistration(bytes32 validationID) external payable; + function initializeDelegatorRegistration(bytes32 validationID) external payable returns (bytes32); } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index c82cdb5d7..09b1c3e9f 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -26,6 +26,8 @@ struct PoSValidatorManagerSettings { struct Delegator { DelegatorStatus status; + address owner; + bytes32 validationID; uint64 weight; uint64 startedAt; uint64 endedAt; @@ -34,11 +36,12 @@ struct Delegator { } interface IPoSValidatorManager is IValidatorManager { + // TODO: Decide what to include in the events. /** * @notice Event emitted when a delegator registration is initiated * @param validationID The ID of the validation period * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain - * @param delegator The address of the delegator + * @param delegationID The ID of the delegation * @param delegatorWeight The weight of the delegator * @param validatorWeight The updated validator weight that is sent to the P-Chain * @param nonce The message nonce used to update the validator weight @@ -46,7 +49,7 @@ interface IPoSValidatorManager is IValidatorManager { event DelegatorAdded( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, - address indexed delegator, + bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce @@ -55,13 +58,13 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when a delegator registration is completed * @param validationID The ID of the validation period - * @param delegator The address of the delegator + * @param delegationID The ID of the delegation * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain * @param startTime The time at which the registration was completed */ event DelegatorRegistered( bytes32 indexed validationID, - address indexed delegator, + bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime ); @@ -70,7 +73,7 @@ interface IPoSValidatorManager is IValidatorManager { * @notice Event emitted when delegator removal is initiated * @param validationID The ID of the validation period * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain - * @param delegator The address of the delegator + * @param delegationID The ID of the delegation * @param validatorWeight The updated validator weight that is sent to the P-Chain * @param nonce The message nonce used to update the validator weight * @param endTime The time at which the removal was initiated @@ -78,7 +81,7 @@ interface IPoSValidatorManager is IValidatorManager { event DelegatorRemovalInitialized( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, - address indexed delegator, + bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime @@ -87,11 +90,11 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when delegator removal is completed * @param validationID The ID of the validation period - * @param delegator The address of the delegator + * @param delegationID The ID of the delegation * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain */ event DelegationEnded( - bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce + bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce ); /** @@ -113,10 +116,9 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Resubmits a delegator registration message to be sent to the P-Chain. * Only necessary if the original message can't be delivered due to validator churn. - * @param validationID The ID of the validation period being registered. - * @param delegator The address of the delegator being registered. + * @param delegationID The ID of the delegation being registered. */ - function resendDelegatorRegistration(bytes32 validationID, address delegator) external; + function resendDelegatorRegistration(bytes32 delegationID) external; /** * @notice Completes the delegator registration process by returning an acknowledgement of the registration of a @@ -124,21 +126,21 @@ interface IPoSValidatorManager is IValidatorManager { * 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. * @param messageIndex The index of the Warp message to be received providing the acknowledgement. - * @param delegator The address of the delegator being registered. + * @param delegationID The ID of the delegation being registered. */ - function completeDelegatorRegistration(uint32 messageIndex, address delegator) external; + function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external; /** * @notice Begins the process of removing a delegator from a validation period. The delegator must have been previously * registered with the given validationID. - * @param validationID The ID of the validation period being removed. + * @param delegationID The ID of the delegation being removed. * @param includeUptimeProof Whether or not an uptime proof is provided for the validation period. * If no uptime proof is provided, the validation uptime for the delegation period will be assumed to be 0. * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the * uptime proof. */ function initializeEndDelegation( - bytes32 validationID, + bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex ) external; @@ -146,10 +148,9 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Resubmits a delegator end message to be sent to the P-Chain. * Only necessary if the original message can't be delivered due to validator churn. - * @param validationID The ID of the validation period being ended. - * @param delegator The address of the delegator being removed. + * @param delegationID The ID of the delegation being removed. */ - function resendEndDelegation(bytes32 validationID, address delegator) external; + function resendEndDelegation(bytes32 delegationID) external; /** * @notice Completes the process of ending a delegation by receiving an acknowledgement from the P-Chain. @@ -157,7 +158,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. * @param messageIndex The index of the Warp message to be received providing the acknowledgement. - * @param delegator The address of the delegator being removed. + * @param delegationID The ID of the delegation being removed. */ - function completeEndDelegation(uint32 messageIndex, address delegator) external; + function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) external; } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 4fe44b642..6e2904024 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -60,11 +60,12 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { bytes32 validationID, address delegator, uint64 weight - ) internal virtual override { + ) internal virtual override returns (bytes32) { uint256 value = app.weightToValue(weight); vm.startPrank(delegator); - app.initializeDelegatorRegistration(validationID, value); + bytes32 delegationID = app.initializeDelegatorRegistration(validationID, value); vm.stopPrank(); + return delegationID; } function _beforeSend(uint64 weight, address spender) internal override { diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 3096ab12f..3d549da29 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -53,11 +53,11 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { bytes32 validationID, address delegator, uint64 weight - ) internal virtual override { + ) internal virtual override returns (bytes32){ uint256 value = app.weightToValue(weight); vm.prank(delegator); vm.deal(delegator, value); - app.initializeDelegatorRegistration{value: value}(validationID); + return app.initializeDelegatorRegistration{value: value}(validationID); } function _beforeSend(uint64 weight, address spender) internal override { diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index c98c054fa..b320060e7 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -27,7 +27,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event DelegatorAdded( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, - address indexed delegator, + bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce @@ -35,7 +35,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event DelegatorRegistered( bytes32 indexed validationID, - address indexed delegator, + bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime ); @@ -43,14 +43,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event DelegatorRemovalInitialized( bytes32 indexed validationID, bytes32 indexed setWeightMessageID, - address indexed delegator, + bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime ); event DelegationEnded( - bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce + bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce ); function testInvalidUptimeWarpMessage() public { @@ -174,7 +174,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -187,7 +187,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, 1, DEFAULT_WEIGHT + DEFAULT_DELEGATOR_WEIGHT ); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - posValidatorManager.resendDelegatorRegistration(validationID, DEFAULT_DELEGATOR_ADDRESS); + posValidatorManager.resendDelegatorRegistration(delegationID); } function testCompleteDelegatorRegistration() public { @@ -199,7 +199,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -209,7 +209,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - DEFAULT_DELEGATOR_ADDRESS, + delegationID, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 @@ -236,7 +236,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedNonce: 1 }); address delegator2 = address(0x5678567856785678567856785678567856785678); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID_2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -256,7 +256,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); vm.expectRevert("PoSValidatorManager: nonce does not match"); - posValidatorManager.completeDelegatorRegistration(0, delegator2); + posValidatorManager.completeDelegatorRegistration(0, delegationID_2); } function testCompleteDelegatorRegistrationImplicitNonce() public { @@ -270,7 +270,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Initialize two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID_1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -291,7 +291,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Mark delegator1 as registered by delivering the weight update from nonce 2 (delegator 2's nonce) _setUpCompleteDelegatorRegistration( validationID, - delegator1, + delegationID_1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 2 @@ -307,7 +307,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -317,7 +317,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - DEFAULT_DELEGATOR_ADDRESS, + delegationID, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 @@ -325,6 +325,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpInitializeEndDelegation( validationID, DEFAULT_DELEGATOR_ADDRESS, + delegationID, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, DEFAULT_WEIGHT, 2 @@ -340,7 +341,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -350,7 +351,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - DEFAULT_DELEGATOR_ADDRESS, + delegationID, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 @@ -358,6 +359,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpInitializeEndDelegation( validationID, DEFAULT_DELEGATOR_ADDRESS, + delegationID, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, DEFAULT_WEIGHT, 2 @@ -365,7 +367,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - posValidatorManager.resendEndDelegation(validationID, DEFAULT_DELEGATOR_ADDRESS); + posValidatorManager.resendEndDelegation(delegationID); } function testCompleteEndDelegation() public { @@ -377,7 +379,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -385,26 +387,29 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); + // TODO: Remove this once the nonce update bug is fixed + posValidatorManager.foo(validationID); _setUpCompleteDelegatorRegistration( validationID, - DEFAULT_DELEGATOR_ADDRESS, + delegationID, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); - _setUpInitializeEndDelegation( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - DEFAULT_WEIGHT, - 2 - ); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); _setUpCompleteEndDelegation( - validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2 + validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2 ); } - function testCompleteEndDelegationWrongNonce() public { + function testCompleteEndblahDelegationWrongNonce() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -415,7 +420,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Register two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID_1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -425,13 +430,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegator1, + delegationID_1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); address delegator2 = address(0x5678567856785678567856785678567856785678); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID_2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -442,7 +447,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegator2, + delegationID_2, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 2 @@ -452,6 +457,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpInitializeEndDelegation( validationID, delegator1, + delegationID_1, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 3 @@ -459,6 +465,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpInitializeEndDelegation( validationID, delegator2, + delegationID_2, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, DEFAULT_WEIGHT, 4 @@ -473,10 +480,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); vm.expectRevert("PoSValidatorManager: nonce does not match"); - posValidatorManager.completeEndDelegation(0, delegator2); + posValidatorManager.completeEndDelegation(0, delegationID_2); } - function testCompleteEndDelegationImplicitNonce() public { + function testCompleteEndDeblahlegationImplicitNonce() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -487,7 +494,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Register two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID_1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -497,13 +504,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegator1, + delegationID_1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); address delegator2 = address(0x5678567856785678567856785678567856785678); - _setUpInitializeDelegatorRegistration({ + bytes32 delegationID_2 =_setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -514,7 +521,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegator2, + delegationID_2, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 2 @@ -524,6 +531,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpInitializeEndDelegation( validationID, delegator1, + delegationID_1, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 3 @@ -531,13 +539,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpInitializeEndDelegation( validationID, delegator2, + delegationID_2, DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, DEFAULT_WEIGHT, 4 ); // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) - _setUpCompleteEndDelegation(validationID, delegator1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); + _setUpCompleteEndDelegation(validationID, delegationID_1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); } function testValueToWeight() public view { @@ -568,7 +577,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID, address delegator, uint64 weight - ) internal virtual; + ) internal virtual returns (bytes32); // // Delegation setup utilities @@ -592,19 +601,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { emit DelegatorAdded({ validationID: validationID, setWeightMessageID: bytes32(0), - delegator: delegator, + delegationID: sha256(abi.encodePacked(validationID, delegator, expectedNonce)), delegatorWeight: weight, validatorWeight: expectedValidatorWeight, nonce: expectedNonce }); - _initializeDelegatorRegistration(validationID, delegator, weight); - return validationID; + return _initializeDelegatorRegistration(validationID, delegator, weight); } function _setUpCompleteDelegatorRegistration( bytes32 validationID, - address delegator, + bytes32 delegationID, uint64 completeRegistrationTimestamp, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -619,17 +627,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorRegistered({ validationID: validationID, - delegator: delegator, + delegationID: delegationID, nonce: expectedNonce, startTime: completeRegistrationTimestamp }); - posValidatorManager.completeDelegatorRegistration(0, delegator); - return validationID; + posValidatorManager.completeDelegatorRegistration(0, delegationID); + return delegationID; } function _setUpInitializeEndDelegation( bytes32 validationID, address delegator, + bytes32 delegationID, uint64 endDelegationTimestamp, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -643,19 +652,19 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { emit DelegatorRemovalInitialized({ validationID: validationID, setWeightMessageID: bytes32(0), - delegator: delegator, + delegationID: delegationID, validatorWeight: expectedValidatorWeight, nonce: expectedNonce, endTime: endDelegationTimestamp }); vm.prank(delegator); - posValidatorManager.initializeEndDelegation(validationID, false, 0); - return validationID; + posValidatorManager.initializeEndDelegation(delegationID, false, 0); + return delegationID; } function _setUpCompleteEndDelegation( bytes32 validationID, - address delegator, + bytes32 delegationID, uint64 validatorWeight, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -666,10 +675,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, delegator, expectedNonce); - posValidatorManager.completeEndDelegation(0, delegator); + emit DelegationEnded(validationID, delegationID, expectedNonce); + posValidatorManager.completeEndDelegation(0, delegationID); assertEq(posValidatorManager.getWeight(validationID), expectedValidatorWeight); - return validationID; + return delegationID; } function _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { From b071bf3326a66499f48ed222fbe5be0cbcbfee18 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Thu, 5 Sep 2024 01:51:04 +0000 Subject: [PATCH 193/545] unlock stake --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 4 ++-- .../go/staking/PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/staking/PoAValidatorManager.sol | 4 ++++ contracts/staking/PoSValidatorManager.sol | 6 ++++++ contracts/staking/ValidatorManager.sol | 5 ++++- contracts/staking/tests/ValidatorManagerTests.t.sol | 3 +++ 7 files changed, 21 insertions(+), 5 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 125c7142f..9481d98a9 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161341538038061341583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6132c88061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063620658561161006e578063620658561461016157806376f7862114610174578063872fda6414610187578063a3a65e481461019a578063b771b3bc146101ad578063bee0a03f146101d3575f80fd5b80630322ed98146100aa5780630cdd0985146100bf57806327f39ca8146101105780632e2194d814610123578063467ef06f1461014e575b5f80fd5b6100bd6100b83660046129d0565b6101e6565b005b6100fd6100cd3660046129d0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6100bd61011e3660046129fb565b6103bc565b6101366101313660046129d0565b6104a0565b6040516001600160401b039091168152602001610107565b6100bd61015c366004612a50565b6104b6565b6100fd61016f366004612a7f565b6108ce565b6100bd610182366004612aa5565b6108e7565b6100fd610195366004612b72565b610c18565b6100bd6101a8366004612a50565b610c3d565b6101bb6005600160991b0181565b6040516001600160a01b039091168152602001610107565b6100bd6101e13660046129d0565b610ecc565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061329c83398151915293929190829060ff16600581111561024657610246612c0e565b600581111561025757610257612c0e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102ce576102ce612c0e565b146103385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103488483606001515f610fdb565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610375908490600401612c44565b6020604051808303815f875af1158015610391573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b59190612c76565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610405575080546001600160401b03808416911610155b156104235760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561044e84846111fa565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6104b064e8d4a5100083612cb5565b92915050565b5f5f8051602061329c8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610511573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105389190810190612cd3565b91509150806105595760405162461bcd60e51b815260040161032f90612da5565b825482511461057a5760405162461bcd60e51b815260040161032f90612deb565b60208201516001600160a01b0316156105a55760405162461bcd60e51b815260040161032f90612e34565b5f806105b48460400151611218565b9150915080156106195760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161032f565b5f828152600686016020526040808220815160e081019092528054829060ff16600581111561064a5761064a612c0e565b600581111561065b5761065b612c0e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156106d4576106d4612c0e565b14806106f257506001825160058111156106f0576106f0612c0e565b145b6107515760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161032f565b60038251600581111561076657610766612c0e565b0361077357506004610777565b5060055b6020808301515f908152600789019091526040812055818160058111156107a0576107a0612c0e565b908160058111156107b3576107b3612c0e565b9052505f84815260068801602052604090208251815484929190829060ff191660018360058111156107e7576107e7612c0e565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790558151600581111561089a5761089a612c0e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a35050505050505050565b5f6104b06001600160401b03831664e8d4a51000612e83565b8115610c0a575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561095b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109829190810190612cd3565b91509150806109e55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161032f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4c9190612c76565b825114610ab05760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161032f565b60208201516001600160a01b031615610b265760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161032f565b5f80610b3584604001516113b9565b91509150818814610ba25760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161032f565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610c1383611591565b505050565b5f80610c238661191e565b9050610c31858286866119de565b9150505b949350505050565b5f5f8051602061329c8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c98573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cbf9190810190612cd3565b9150915080610ce05760405162461bcd60e51b815260040161032f90612da5565b8254825114610d015760405162461bcd60e51b815260040161032f90612deb565b60208201516001600160a01b031615610d2c5760405162461bcd60e51b815260040161032f90612e34565b5f80610d3b8460400151611218565b9150915080610d9d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161032f565b5f82815260058601602052604081208054610db790612e9a565b9050118015610de9575060015f83815260068701602052604090205460ff166005811115610de757610de7612c0e565b145b610e055760405162461bcd60e51b815260040161032f90612ed2565b5f8281526005860160205260408120610e1d91612986565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061329c833981519152929190610f1490612e9a565b9050118015610f46575060015f83815260068301602052604090205460ff166005811115610f4457610f44612c0e565b145b610f625760405162461bcd60e51b815260040161032f90612ed2565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610f9b9190600401612f19565b6020604051808303815f875af1158015610fb7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c139190612c76565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561105457611014816001612fa3565b61101f906008612e83565b5081515f9083908390811061103657611036612fb6565b60200101906001600160f81b03191690815f1a905350600101611000565b505f5b60048110156110b75761106b816003612fa3565b611076906008612e83565b6001901c60f81b82611089836002612fca565b8151811061109957611099612fb6565b60200101906001600160f81b03191690815f1a905350600101611057565b505f5b6020811015611119576110ce81601f612fa3565b6110d9906008612e83565b86901c60f81b826110eb836006612fca565b815181106110fb576110fb612fb6565b60200101906001600160f81b03191690815f1a9053506001016110ba565b505f5b600881101561118457611130816007612fa3565b61113b906008612e83565b6001600160401b038616901c60f81b82611156836026612fca565b8151811061116657611166612fb6565b60200101906001600160f81b03191690815f1a90535060010161111c565b505f5b60088110156111ef5761119b816007612fa3565b6111a6906008612e83565b6001600160401b038516901c60f81b826111c183602e612fca565b815181106111d1576111d1612fb6565b60200101906001600160f81b03191690815f1a905350600101611187565b5090505b9392505050565b611202611e15565b61120b82611e60565b61121481611ea6565b5050565b5f80825160271461123b5760405162461bcd60e51b815260040161032f90612fdd565b5f805b600281101561128a57611252816001612fa3565b61125d906008612e83565b61ffff1685828151811061127357611273612fb6565b016020015160f81c901b919091179060010161123e565b5061ffff8116156112ad5760405162461bcd60e51b815260040161032f90613026565b5f805b6004811015611308576112c4816003612fa3565b6112cf906008612e83565b63ffffffff16866112e1836002612fca565b815181106112f1576112f1612fb6565b016020015160f81c901b91909117906001016112b0565b5063ffffffff811660021461132f5760405162461bcd60e51b815260040161032f90613069565b5f805b60208110156113845761134681601f612fa3565b611351906008612e83565b8761135d836006612fca565b8151811061136d5761136d612fb6565b016020015160f81c901b9190911790600101611332565b505f8660268151811061139957611399612fb6565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146113dc5760405162461bcd60e51b815260040161032f90612fdd565b5f805b600281101561142b576113f3816001612fa3565b6113fe906008612e83565b61ffff1685828151811061141457611414612fb6565b016020015160f81c901b91909117906001016113df565b5061ffff81161561144e5760405162461bcd60e51b815260040161032f90613026565b5f805b60048110156114a957611465816003612fa3565b611470906008612e83565b63ffffffff1686611482836002612fca565b8151811061149257611492612fb6565b016020015160f81c901b9190911790600101611451565b5063ffffffff81166004146114d05760405162461bcd60e51b815260040161032f90613069565b5f805b6020811015611525576114e781601f612fa3565b6114f2906008612e83565b876114fe836006612fca565b8151811061150e5761150e612fb6565b016020015160f81c901b91909117906001016114d3565b505f805b60088110156115845761153d816007612fa3565b611548906008612e83565b6001600160401b03168861155d836026612fca565b8151811061156d5761156d612fb6565b016020015160f81c901b9190911790600101611529565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061329c83398151915293929190829060ff1660058111156115f1576115f1612c0e565b600581111561160257611602612c0e565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561167c5761167c612c0e565b146116d85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161032f565b60408101516001600160a01b0316336001600160a01b0316146117525760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161032f565b61175f8160800151611f5a565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156117a3576117a3612c0e565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061185a90859083610fdb565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611889908590600401612c44565b6020604051808303815f875af11580156118a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118c99190612c76565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008161194a846120fb565b90505f611956826104a0565b83549091506001600160401b0382161080159061198057508260010154816001600160401b031611155b610c355760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161032f565b5f6119e7612131565b5f8051602061329c833981519152426001600160401b038516118015611a2157506001600160401b038416611a1f426202a300612fca565b115b611a835760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161032f565b85611ada5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161032f565b5f86815260078201602052604090205415611b485760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161032f565b8251603014611baf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161032f565b611bb885611f5a565b5f80611bff6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061217b565b5f82815260058601602052604090209193509150611c1d82826130f4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611c4a908590600401612c44565b6020604051808303815f875af1158015611c66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c8a9190612c76565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611d0357611d03612c0e565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610c3560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611e5e57604051631afcd79f60e31b815260040160405180910390fd5b565b611e68611e15565b611e7181612546565b611ea360608201356080830135611e8e60c0850160a08601612a7f565b611e9e60e0860160c087016131b3565b612567565b50565b611eae611e15565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216611f3a5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161032f565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061329c8339815191529060ff165f03611f98575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611fe09083612fa3565b10611ffc576001600160401b038416604083015280825261201b565b838260400181815161200e91906131ce565b6001600160401b03169052505b5f82602001518360400151606461203291906131f5565b61203c9190613220565b600285015490915060ff90811690821611156120b75760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161032f565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104b0827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906125d5565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161217557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146121e55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161032f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561225c5761221c816001612fa3565b612227906008612e83565b5081515f9083908390811061223e5761223e612fb6565b60200101906001600160f81b03191690815f1a905350600101612208565b505f5b60048110156122ba57612273816003612fa3565b61227e906008612e83565b505f8261228c836002612fca565b8151811061229c5761229c612fb6565b60200101906001600160f81b03191690815f1a90535060010161225f565b505f5b602081101561231757845181602081106122d9576122d9612fb6565b1a60f81b826122e9836006612fca565b815181106122f9576122f9612fb6565b60200101906001600160f81b03191690815f1a9053506001016122bd565b505f5b6020811015612377578460200151816020811061233957612339612fb6565b1a60f81b82612349836026612fca565b8151811061235957612359612fb6565b60200101906001600160f81b03191690815f1a90535060010161231a565b505f5b60088110156123eb5761238e816007612fa3565b612399906008612e83565b60ff1685604001516001600160401b0316901c60f81b828260466123bd9190612fca565b815181106123cd576123cd612fb6565b60200101906001600160f81b03191690815f1a90535060010161237a565b505f5b6030811015612456578460800151818151811061240d5761240d612fb6565b01602001516001600160f81b0319168261242883604e612fca565b8151811061243857612438612fb6565b60200101906001600160f81b03191690815f1a9053506001016123ee565b505f5b60088110156124c85761246d816007612fa3565b612478906008612e83565b60608601516001600160401b0390811691161c60f81b8261249a83607e612fca565b815181106124aa576124aa612fb6565b60200101906001600160f81b03191690815f1a905350600101612459565b506002816040516124d99190613245565b602060405180830381855afa1580156124f4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906125179190612c76565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b61254e611e15565b612556612737565b61255e612747565b611ea38161274f565b61256f611e15565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561261b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061263f9190612c76565b90506126566001600160a01b0385163330866127bb565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561269a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126be9190612c76565b90508181116127245760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161032f565b61272e8282612fa3565b95945050505050565b61273f611e15565b611e5e61281b565b611e5e611e15565b612757611e15565b80355f8051602061329c83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556127a16060830160408401613260565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052612815908590612823565b50505050565b612520611e15565b5f6128376001600160a01b03841683612884565b905080515f1415801561285b5750808060200190518101906128599190613280565b155b15610c1357604051635274afe760e01b81526001600160a01b038416600482015260240161032f565b60606111f383835f845f80856001600160a01b031684866040516128a89190613245565b5f6040518083038185875af1925050503d805f81146128e2576040519150601f19603f3d011682016040523d82523d5f602084013e6128e7565b606091505b50915091506128f7868383612901565b9695505050505050565b606082612916576129118261295d565b6111f3565b815115801561292d57506001600160a01b0384163b155b1561295657604051639996b31560e01b81526001600160a01b038516600482015260240161032f565b50806111f3565b80511561296d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461299290612e9a565b5f825580601f106129a1575050565b601f0160209004905f5260205f2090810190611ea391905b808211156129cc575f81556001016129b9565b5090565b5f602082840312156129e0575f80fd5b5035919050565b6001600160a01b0381168114611ea3575f80fd5b5f80828403610100811215612a0e575f80fd5b60e0811215612a1b575f80fd5b5082915060e0830135612a2d816129e7565b809150509250929050565b803563ffffffff81168114612a4b575f80fd5b919050565b5f60208284031215612a60575f80fd5b6111f382612a38565b80356001600160401b0381168114612a4b575f80fd5b5f60208284031215612a8f575f80fd5b6111f382612a69565b8015158114611ea3575f80fd5b5f805f60608486031215612ab7575f80fd5b833592506020840135612ac981612a98565b9150612ad760408501612a38565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b1657612b16612ae0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612b4457612b44612ae0565b604052919050565b5f6001600160401b03821115612b6457612b64612ae0565b50601f01601f191660200190565b5f805f8060808587031215612b85575f80fd5b8435935060208501359250612b9c60408601612a69565b915060608501356001600160401b03811115612bb6575f80fd5b8501601f81018713612bc6575f80fd5b8035612bd9612bd482612b4c565b612b1c565b818152886020838501011115612bed575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612c3c578181015183820152602001612c24565b50505f910152565b602081525f8251806020840152612c62816040850160208701612c22565b601f01601f19169190910160400192915050565b5f60208284031215612c86575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612cc357612cc3612c8d565b500490565b8051612a4b81612a98565b5f8060408385031215612ce4575f80fd5b82516001600160401b0380821115612cfa575f80fd5b9084019060608287031215612d0d575f80fd5b612d15612af4565b82518152602080840151612d28816129e7565b82820152604084015183811115612d3d575f80fd5b80850194505087601f850112612d51575f80fd5b83519250612d61612bd484612b4c565b8381528882858701011115612d74575f80fd5b612d8384838301848801612c22565b80604084015250819550612d98818801612cc8565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b80820281158282048414176104b0576104b0612ca1565b600181811c90821680612eae57607f821691505b602082108103612ecc57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612f2b81612e9a565b806020870152604060018084165f8114612f4c5760018114612f6857612f95565b60ff19851660408a0152604084151560051b8a01019550612f95565b895f5260205f205f5b85811015612f8c5781548b8201860152908301908801612f71565b8a016040019650505b509398975050505050505050565b818103818111156104b0576104b0612ca1565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104b0576104b0612ca1565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610c1357805f5260205f20601f840160051c810160208510156130d55750805b601f840160051c820191505b818110156103b5575f81556001016130e1565b81516001600160401b0381111561310d5761310d612ae0565b6131218161311b8454612e9a565b846130b0565b602080601f831160018114613154575f841561313d5750858301515b5f19600386901b1c1916600185901b1785556131ab565b5f85815260208120601f198616915b8281101561318257888601518255948401946001909101908401613163565b508582101561319f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156131c3575f80fd5b81356111f3816129e7565b6001600160401b038181168382160190808211156131ee576131ee612ca1565b5092915050565b6001600160401b0381811683821602808216919082811461321857613218612ca1565b505092915050565b5f6001600160401b038084168061323957613239612c8d565b92169190910492915050565b5f8251613256818460208701612c22565b9190910192915050565b5f60208284031215613270575f80fd5b813560ff811681146111f3575f80fd5b5f60208284031215613290575f80fd5b81516111f381612a9856fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161351338038061351383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6133c68061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100a6575f3560e01c8063620658561161006e578063620658561461016157806376f7862114610174578063872fda6414610187578063a3a65e481461019a578063b771b3bc146101ad578063bee0a03f146101d3575f80fd5b80630322ed98146100aa5780630cdd0985146100bf57806327f39ca8146101105780632e2194d814610123578063467ef06f1461014e575b5f80fd5b6100bd6100b8366004612ace565b6101e6565b005b6100fd6100cd366004612ace565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6100bd61011e366004612af9565b6103bc565b610136610131366004612ace565b6104a0565b6040516001600160401b039091168152602001610107565b6100bd61015c366004612b4e565b6104b6565b6100fd61016f366004612b7d565b6104e1565b6100bd610182366004612ba3565b6104fa565b6100fd610195366004612c70565b61082b565b6100bd6101a8366004612b4e565b610850565b6101bb6005600160991b0181565b6040516001600160a01b039091168152602001610107565b6100bd6101e1366004612ace565b610adf565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061339a83398151915293929190829060ff16600581111561024657610246612d0c565b600581111561025757610257612d0c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102ce576102ce612d0c565b146103385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6103488483606001515f610bee565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb90610375908490600401612d42565b6020604051808303815f875af1158015610391573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b59190612d74565b5050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610405575080546001600160401b03808416911610155b156104235760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561044e8484610e0d565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6104b064e8d4a5100083612db3565b92915050565b5f6104c082610e27565b90506104dd81608001516001600160401b03168260400151611279565b5050565b5f6104b06001600160401b03831664e8d4a51000612dc6565b811561081d575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561056e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105959190810190612de8565b91509150806105f85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161032f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561063b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065f9190612d74565b8251146106c35760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161032f565b60208201516001600160a01b0316156107395760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161032f565b5f8061074884604001516112af565b915091508188146107b55760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161032f565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61082683611487565b505050565b5f8061083686611814565b9050610844858286866118d4565b9150505b949350505050565b5f5f8051602061339a8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156108ab573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108d29190810190612de8565b91509150806108f35760405162461bcd60e51b815260040161032f90612eba565b82548251146109145760405162461bcd60e51b815260040161032f90612f00565b60208201516001600160a01b03161561093f5760405162461bcd60e51b815260040161032f90612f49565b5f8061094e8460400151611d0b565b91509150806109b05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161032f565b5f828152600586016020526040812080546109ca90612f98565b90501180156109fc575060015f83815260068701602052604090205460ff1660058111156109fa576109fa612d0c565b145b610a185760405162461bcd60e51b815260040161032f90612fd0565b5f8281526005860160205260408120610a3091612a84565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061339a833981519152929190610b2790612f98565b9050118015610b59575060015f83815260068301602052604090205460ff166005811115610b5757610b57612d0c565b145b610b755760405162461bcd60e51b815260040161032f90612fd0565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bae9190600401613017565b6020604051808303815f875af1158015610bca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108269190612d74565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610c6757610c278160016130a1565b610c32906008612dc6565b5081515f90839083908110610c4957610c496130b4565b60200101906001600160f81b03191690815f1a905350600101610c13565b505f5b6004811015610cca57610c7e8160036130a1565b610c89906008612dc6565b6001901c60f81b82610c9c8360026130c8565b81518110610cac57610cac6130b4565b60200101906001600160f81b03191690815f1a905350600101610c6a565b505f5b6020811015610d2c57610ce181601f6130a1565b610cec906008612dc6565b86901c60f81b82610cfe8360066130c8565b81518110610d0e57610d0e6130b4565b60200101906001600160f81b03191690815f1a905350600101610ccd565b505f5b6008811015610d9757610d438160076130a1565b610d4e906008612dc6565b6001600160401b038616901c60f81b82610d698360266130c8565b81518110610d7957610d796130b4565b60200101906001600160f81b03191690815f1a905350600101610d2f565b505f5b6008811015610e0257610dae8160076130a1565b610db9906008612dc6565b6001600160401b038516901c60f81b82610dd483602e6130c8565b81518110610de457610de46130b4565b60200101906001600160f81b03191690815f1a905350600101610d9a565b5090505b9392505050565b610e15611eac565b610e1e82611ef7565b6104dd81611f3d565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091525f5f8051602061339a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610eba573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610ee19190810190612de8565b9150915080610f025760405162461bcd60e51b815260040161032f90612eba565b8254825114610f235760405162461bcd60e51b815260040161032f90612f00565b60208201516001600160a01b031615610f4e5760405162461bcd60e51b815260040161032f90612f49565b5f80610f5d8460400151611d0b565b915091508015610fc25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161032f565b5f828152600686016020526040808220815160e081019092528054829060ff166005811115610ff357610ff3612d0c565b600581111561100457611004612d0c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561107d5761107d612d0c565b148061109b575060018251600581111561109957611099612d0c565b145b6110fa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161032f565b60038251600581111561110f5761110f612d0c565b0361111c57506004611120565b5060055b6020808301515f9081526007890190915260408120558181600581111561114957611149612d0c565b9081600581111561115c5761115c612d0c565b9052505f84815260068801602052604090208251815484929190829060ff1916600183600581111561119057611190612d0c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790558151600581111561124357611243612d0c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350979650505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546104dd906001600160a01b03168284611ff1565b5f808251602e146112d25760405162461bcd60e51b815260040161032f906130db565b5f805b6002811015611321576112e98160016130a1565b6112f4906008612dc6565b61ffff1685828151811061130a5761130a6130b4565b016020015160f81c901b91909117906001016112d5565b5061ffff8116156113445760405162461bcd60e51b815260040161032f90613124565b5f805b600481101561139f5761135b8160036130a1565b611366906008612dc6565b63ffffffff16866113788360026130c8565b81518110611388576113886130b4565b016020015160f81c901b9190911790600101611347565b5063ffffffff81166004146113c65760405162461bcd60e51b815260040161032f90613167565b5f805b602081101561141b576113dd81601f6130a1565b6113e8906008612dc6565b876113f48360066130c8565b81518110611404576114046130b4565b016020015160f81c901b91909117906001016113c9565b505f805b600881101561147a576114338160076130a1565b61143e906008612dc6565b6001600160401b0316886114538360266130c8565b81518110611463576114636130b4565b016020015160f81c901b919091179060010161141f565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f8051602061339a83398151915293929190829060ff1660058111156114e7576114e7612d0c565b60058111156114f8576114f8612d0c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561157257611572612d0c565b146115ce5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161032f565b60408101516001600160a01b0316336001600160a01b0316146116485760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161032f565b6116558160800151612050565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561169957611699612d0c565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061175090859083610bee565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061177f908590600401612d42565b6020604051808303815f875af115801561179b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117bf9190612d74565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0081611840846121f1565b90505f61184c826104a0565b83549091506001600160401b0382161080159061187657508260010154816001600160401b031611155b6108485760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161032f565b5f6118dd612227565b5f8051602061339a833981519152426001600160401b03851611801561191757506001600160401b038416611915426202a3006130c8565b115b6119795760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161032f565b856119d05760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161032f565b5f86815260078201602052604090205415611a3e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161032f565b8251603014611aa55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161032f565b611aae85612050565b5f80611af56040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250612271565b5f82815260058601602052604090209193509150611b1382826131f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b40908590600401612d42565b6020604051808303815f875af1158015611b5c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b809190612d74565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611bf957611bf9612d0c565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061084860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f808251602714611d2e5760405162461bcd60e51b815260040161032f906130db565b5f805b6002811015611d7d57611d458160016130a1565b611d50906008612dc6565b61ffff16858281518110611d6657611d666130b4565b016020015160f81c901b9190911790600101611d31565b5061ffff811615611da05760405162461bcd60e51b815260040161032f90613124565b5f805b6004811015611dfb57611db78160036130a1565b611dc2906008612dc6565b63ffffffff1686611dd48360026130c8565b81518110611de457611de46130b4565b016020015160f81c901b9190911790600101611da3565b5063ffffffff8116600214611e225760405162461bcd60e51b815260040161032f90613167565b5f805b6020811015611e7757611e3981601f6130a1565b611e44906008612dc6565b87611e508360066130c8565b81518110611e6057611e606130b4565b016020015160f81c901b9190911790600101611e25565b505f86602681518110611e8c57611e8c6130b4565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611ef557604051631afcd79f60e31b815260040160405180910390fd5b565b611eff611eac565b611f088161263c565b611f3a60608201356080830135611f2560c0850160a08601612b7d565b611f3560e0860160c087016132b1565b61265d565b50565b611f45611eac565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216611fd15760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161032f565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261082691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506126cb565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061339a8339815191529060ff165f0361208e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906120d690836130a1565b106120f2576001600160401b0384166040830152808252612111565b838260400181815161210491906132cc565b6001600160401b03169052505b5f82602001518360400151606461212891906132f3565b612132919061331e565b600285015490915060ff90811690821611156121ad5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161032f565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6104b0827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061272c565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161226b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146122db5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161032f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612352576123128160016130a1565b61231d906008612dc6565b5081515f90839083908110612334576123346130b4565b60200101906001600160f81b03191690815f1a9053506001016122fe565b505f5b60048110156123b0576123698160036130a1565b612374906008612dc6565b505f826123828360026130c8565b81518110612392576123926130b4565b60200101906001600160f81b03191690815f1a905350600101612355565b505f5b602081101561240d57845181602081106123cf576123cf6130b4565b1a60f81b826123df8360066130c8565b815181106123ef576123ef6130b4565b60200101906001600160f81b03191690815f1a9053506001016123b3565b505f5b602081101561246d578460200151816020811061242f5761242f6130b4565b1a60f81b8261243f8360266130c8565b8151811061244f5761244f6130b4565b60200101906001600160f81b03191690815f1a905350600101612410565b505f5b60088110156124e1576124848160076130a1565b61248f906008612dc6565b60ff1685604001516001600160401b0316901c60f81b828260466124b391906130c8565b815181106124c3576124c36130b4565b60200101906001600160f81b03191690815f1a905350600101612470565b505f5b603081101561254c5784608001518181518110612503576125036130b4565b01602001516001600160f81b0319168261251e83604e6130c8565b8151811061252e5761252e6130b4565b60200101906001600160f81b03191690815f1a9053506001016124e4565b505f5b60088110156125be576125638160076130a1565b61256e906008612dc6565b60608601516001600160401b0390811691161c60f81b8261259083607e6130c8565b815181106125a0576125a06130b4565b60200101906001600160f81b03191690815f1a90535060010161254f565b506002816040516125cf9190613343565b602060405180830381855afa1580156125ea573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061260d9190612d74565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b612644611eac565b61264c61288e565b61265461289e565b611f3a816128a6565b612665611eac565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f6126df6001600160a01b03841683612912565b905080515f14158015612703575080806020019051810190612701919061335e565b155b1561082657604051635274afe760e01b81526001600160a01b038416600482015260240161032f565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612772573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127969190612d74565b90506127ad6001600160a01b03851633308661291f565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156127f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128159190612d74565b905081811161287b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161032f565b61288582826130a1565b95945050505050565b612896611eac565b611ef561295e565b611ef5611eac565b6128ae611eac565b80355f8051602061339a83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556128f86060830160408401613379565b600291909101805460ff191660ff90921691909117905550565b6060610e0683835f612966565b6040516001600160a01b0384811660248301528381166044830152606482018390526129589186918216906323b872dd9060840161201e565b50505050565b612616611eac565b60608147101561298b5760405163cd78605960e01b815230600482015260240161032f565b5f80856001600160a01b031684866040516129a69190613343565b5f6040518083038185875af1925050503d805f81146129e0576040519150601f19603f3d011682016040523d82523d5f602084013e6129e5565b606091505b50915091506129f58683836129ff565b9695505050505050565b606082612a1457612a0f82612a5b565b610e06565b8151158015612a2b57506001600160a01b0384163b155b15612a5457604051639996b31560e01b81526001600160a01b038516600482015260240161032f565b5080610e06565b805115612a6b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054612a9090612f98565b5f825580601f10612a9f575050565b601f0160209004905f5260205f2090810190611f3a91905b80821115612aca575f8155600101612ab7565b5090565b5f60208284031215612ade575f80fd5b5035919050565b6001600160a01b0381168114611f3a575f80fd5b5f80828403610100811215612b0c575f80fd5b60e0811215612b19575f80fd5b5082915060e0830135612b2b81612ae5565b809150509250929050565b803563ffffffff81168114612b49575f80fd5b919050565b5f60208284031215612b5e575f80fd5b610e0682612b36565b80356001600160401b0381168114612b49575f80fd5b5f60208284031215612b8d575f80fd5b610e0682612b67565b8015158114611f3a575f80fd5b5f805f60608486031215612bb5575f80fd5b833592506020840135612bc781612b96565b9150612bd560408501612b36565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612c1457612c14612bde565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612c4257612c42612bde565b604052919050565b5f6001600160401b03821115612c6257612c62612bde565b50601f01601f191660200190565b5f805f8060808587031215612c83575f80fd5b8435935060208501359250612c9a60408601612b67565b915060608501356001600160401b03811115612cb4575f80fd5b8501601f81018713612cc4575f80fd5b8035612cd7612cd282612c4a565b612c1a565b818152886020838501011115612ceb575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612d3a578181015183820152602001612d22565b50505f910152565b602081525f8251806020840152612d60816040850160208701612d20565b601f01601f19169190910160400192915050565b5f60208284031215612d84575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82612dc157612dc1612d8b565b500490565b80820281158282048414176104b0576104b0612d9f565b8051612b4981612b96565b5f8060408385031215612df9575f80fd5b82516001600160401b0380821115612e0f575f80fd5b9084019060608287031215612e22575f80fd5b612e2a612bf2565b82518152602080840151612e3d81612ae5565b82820152604084015183811115612e52575f80fd5b80850194505087601f850112612e66575f80fd5b83519250612e76612cd284612c4a565b8381528882858701011115612e89575f80fd5b612e9884838301848801612d20565b80604084015250819550612ead818801612ddd565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b600181811c90821680612fac57607f821691505b602082108103612fca57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461302981612f98565b806020870152604060018084165f811461304a576001811461306657613093565b60ff19851660408a0152604084151560051b8a01019550613093565b895f5260205f205f5b8581101561308a5781548b820186015290830190880161306f565b8a016040019650505b509398975050505050505050565b818103818111156104b0576104b0612d9f565b634e487b7160e01b5f52603260045260245ffd5b808201808211156104b0576104b0612d9f565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f82111561082657805f5260205f20601f840160051c810160208510156131d35750805b601f840160051c820191505b818110156103b5575f81556001016131df565b81516001600160401b0381111561320b5761320b612bde565b61321f816132198454612f98565b846131ae565b602080601f831160018114613252575f841561323b5750858301515b5f19600386901b1c1916600185901b1785556132a9565b5f85815260208120601f198616915b8281101561328057888601518255948401946001909101908401613261565b508582101561329d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156132c1575f80fd5b8135610e0681612ae5565b6001600160401b038181168382160190808211156132ec576132ec612d9f565b5092915050565b6001600160401b0381811683821602808216919082811461331657613316612d9f565b505092915050565b5f6001600160401b038084168061333757613337612d8b565b92169190910492915050565b5f8251613354818460208701612d20565b9190910192915050565b5f6020828403121561336e575f80fd5b8151610e0681612b96565b5f60208284031215613389575f80fd5b813560ff81168114610e06575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index ec816fa3f..f37278431 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161300f38038061300f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612ec28061014d5f395ff3fe608060405260043610610099575f3560e01c80636206585611610062578063620658561461019057806376f78621146101af578063a3a65e48146101ce578063b771b3bc146101ed578063bee0a03f1461021f578063f40797d71461023e575f80fd5b8062e417921461009d5780630322ed98146100be5780630cdd0985146100dd5780632e2194d81461013a578063467ef06f14610171575b5f80fd5b3480156100a8575f80fd5b506100bc6100b7366004612615565b610251565b005b3480156100c9575f80fd5b506100bc6100d836600461262b565b610333565b3480156100e8575f80fd5b506101276100f736600461262b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b348015610145575f80fd5b5061015961015436600461262b565b610509565b6040516001600160401b039091168152602001610131565b34801561017c575f80fd5b506100bc61018b36600461265a565b61051f565b34801561019b575f80fd5b506101276101aa366004612690565b610937565b3480156101ba575f80fd5b506100bc6101c93660046126b6565b610950565b3480156101d9575f80fd5b506100bc6101e836600461265a565b610c81565b3480156101f8575f80fd5b506102076005600160991b0181565b6040516001600160a01b039091168152602001610131565b34801561022a575f80fd5b506100bc61023936600461262b565b610f10565b61012761024c366004612783565b61101f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061029a575080546001600160401b03808416911610155b156102b85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556102e283611041565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612e9683398151915293929190829060ff16600581111561039357610393612815565b60058111156103a4576103a4612815565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561041b5761041b612815565b146104855760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6104958483606001515f611055565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104c290849060040161284b565b6020604051808303815f875af11580156104de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610502919061287d565b5050505050565b5f61051964e8d4a51000836128bc565b92915050565b5f5f80516020612e968339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561057a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105a191908101906128ee565b91509150806105c25760405162461bcd60e51b815260040161047c906129c0565b82548251146105e35760405162461bcd60e51b815260040161047c90612a06565b60208201516001600160a01b03161561060e5760405162461bcd60e51b815260040161047c90612a4f565b5f8061061d8460400151611272565b9150915080156106825760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161047c565b5f828152600686016020526040808220815160e081019092528054829060ff1660058111156106b3576106b3612815565b60058111156106c4576106c4612815565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561073d5761073d612815565b148061075b575060018251600581111561075957610759612815565b145b6107ba5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161047c565b6003825160058111156107cf576107cf612815565b036107dc575060046107e0565b5060055b6020808301515f9081526007890190915260408120558181600581111561080957610809612815565b9081600581111561081c5761081c612815565b9052505f84815260068801602052604090208251815484929190829060ff1916600183600581111561085057610850612815565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790558151600581111561090357610903612815565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a35050505050505050565b5f6105196001600160401b03831664e8d4a51000612a9e565b8115610c73575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156109c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109eb91908101906128ee565b9150915080610a4e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161047c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab5919061287d565b825114610b195760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161047c565b60208201516001600160a01b031615610b8f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161047c565b5f80610b9e8460400151611413565b91509150818814610c0b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161047c565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b610c7c836115eb565b505050565b5f5f80516020612e968339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610cdc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d0391908101906128ee565b9150915080610d245760405162461bcd60e51b815260040161047c906129c0565b8254825114610d455760405162461bcd60e51b815260040161047c90612a06565b60208201516001600160a01b031615610d705760405162461bcd60e51b815260040161047c90612a4f565b5f80610d7f8460400151611272565b9150915080610de15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161047c565b5f82815260058601602052604081208054610dfb90612ab5565b9050118015610e2d575060015f83815260068701602052604090205460ff166005811115610e2b57610e2b612815565b145b610e495760405162461bcd60e51b815260040161047c90612ae7565b5f8281526005860160205260408120610e61916125cb565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612e96833981519152929190610f5890612ab5565b9050118015610f8a575060015f83815260068301602052604090205460ff166005811115610f8857610f88612815565b145b610fa65760405162461bcd60e51b815260040161047c90612ae7565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610fdf9190600401612b2e565b6020604051808303815f875af1158015610ffb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c7c919061287d565b5f8061102a34611978565b905061103885828686611a35565b95945050505050565b611049611e6c565b61105281611eb7565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110ce5761108e816001612bb8565b611099906008612a9e565b5081515f908390839081106110b0576110b0612bcb565b60200101906001600160f81b03191690815f1a90535060010161107a565b505f5b6004811015611131576110e5816003612bb8565b6110f0906008612a9e565b6001901c60f81b82611103836002612bdf565b8151811061111357611113612bcb565b60200101906001600160f81b03191690815f1a9053506001016110d1565b505f5b60208110156111935761114881601f612bb8565b611153906008612a9e565b86901c60f81b82611165836006612bdf565b8151811061117557611175612bcb565b60200101906001600160f81b03191690815f1a905350600101611134565b505f5b60088110156111fe576111aa816007612bb8565b6111b5906008612a9e565b6001600160401b038616901c60f81b826111d0836026612bdf565b815181106111e0576111e0612bcb565b60200101906001600160f81b03191690815f1a905350600101611196565b505f5b600881101561126957611215816007612bb8565b611220906008612a9e565b6001600160401b038516901c60f81b8261123b83602e612bdf565b8151811061124b5761124b612bcb565b60200101906001600160f81b03191690815f1a905350600101611201565b50949350505050565b5f8082516027146112955760405162461bcd60e51b815260040161047c90612bf2565b5f805b60028110156112e4576112ac816001612bb8565b6112b7906008612a9e565b61ffff168582815181106112cd576112cd612bcb565b016020015160f81c901b9190911790600101611298565b5061ffff8116156113075760405162461bcd60e51b815260040161047c90612c3b565b5f805b60048110156113625761131e816003612bb8565b611329906008612a9e565b63ffffffff168661133b836002612bdf565b8151811061134b5761134b612bcb565b016020015160f81c901b919091179060010161130a565b5063ffffffff81166002146113895760405162461bcd60e51b815260040161047c90612c7e565b5f805b60208110156113de576113a081601f612bb8565b6113ab906008612a9e565b876113b7836006612bdf565b815181106113c7576113c7612bcb565b016020015160f81c901b919091179060010161138c565b505f866026815181106113f3576113f3612bcb565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146114365760405162461bcd60e51b815260040161047c90612bf2565b5f805b60028110156114855761144d816001612bb8565b611458906008612a9e565b61ffff1685828151811061146e5761146e612bcb565b016020015160f81c901b9190911790600101611439565b5061ffff8116156114a85760405162461bcd60e51b815260040161047c90612c3b565b5f805b6004811015611503576114bf816003612bb8565b6114ca906008612a9e565b63ffffffff16866114dc836002612bdf565b815181106114ec576114ec612bcb565b016020015160f81c901b91909117906001016114ab565b5063ffffffff811660041461152a5760405162461bcd60e51b815260040161047c90612c7e565b5f805b602081101561157f5761154181601f612bb8565b61154c906008612a9e565b87611558836006612bdf565b8151811061156857611568612bcb565b016020015160f81c901b919091179060010161152d565b505f805b60088110156115de57611597816007612bb8565b6115a2906008612a9e565b6001600160401b0316886115b7836026612bdf565b815181106115c7576115c7612bcb565b016020015160f81c901b9190911790600101611583565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612e9683398151915293929190829060ff16600581111561164b5761164b612815565b600581111561165c5761165c612815565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156116d6576116d6612815565b146117325760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161047c565b60408101516001600160a01b0316336001600160a01b0316146117ac5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161047c565b6117b98160800151611efa565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156117fd576117fd612815565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f906118b490859083611055565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906118e390859060040161284b565b6020604051808303815f875af11580156118ff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611923919061287d565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0082826119a582610509565b83549091506001600160401b038216108015906119cf57508260010154816001600160401b031611155b611a2d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161047c565b949350505050565b5f611a3e61209b565b5f80516020612e96833981519152426001600160401b038516118015611a7857506001600160401b038416611a76426202a300612bdf565b115b611ada5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161047c565b85611b315760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161047c565b5f86815260078201602052604090205415611b9f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161047c565b8251603014611c065760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161047c565b611c0f85611efa565b5f80611c566040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506120e5565b5f82815260058601602052604090209193509150611c748282612d09565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611ca190859060040161284b565b6020604051808303815f875af1158015611cbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce1919061287d565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611d5a57611d5a612815565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611a2d60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611eb557604051631afcd79f60e31b815260040160405180910390fd5b565b611ebf611e6c565b611ec8816124b0565b61105260608201356080830135611ee560c0850160a08601612690565b611ef560e0860160c08701612dc8565b6124d1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612e968339815191529060ff165f03611f38575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611f809083612bb8565b10611f9c576001600160401b0384166040830152808252611fbb565b8382604001818151611fae9190612de3565b6001600160401b03169052505b5f826020015183604001516064611fd29190612e0a565b611fdc9190612e35565b600285015490915060ff90811690821611156120575760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161047c565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016120df57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461214f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161047c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156121c657612186816001612bb8565b612191906008612a9e565b5081515f908390839081106121a8576121a8612bcb565b60200101906001600160f81b03191690815f1a905350600101612172565b505f5b6004811015612224576121dd816003612bb8565b6121e8906008612a9e565b505f826121f6836002612bdf565b8151811061220657612206612bcb565b60200101906001600160f81b03191690815f1a9053506001016121c9565b505f5b6020811015612281578451816020811061224357612243612bcb565b1a60f81b82612253836006612bdf565b8151811061226357612263612bcb565b60200101906001600160f81b03191690815f1a905350600101612227565b505f5b60208110156122e157846020015181602081106122a3576122a3612bcb565b1a60f81b826122b3836026612bdf565b815181106122c3576122c3612bcb565b60200101906001600160f81b03191690815f1a905350600101612284565b505f5b6008811015612355576122f8816007612bb8565b612303906008612a9e565b60ff1685604001516001600160401b0316901c60f81b828260466123279190612bdf565b8151811061233757612337612bcb565b60200101906001600160f81b03191690815f1a9053506001016122e4565b505f5b60308110156123c0578460800151818151811061237757612377612bcb565b01602001516001600160f81b0319168261239283604e612bdf565b815181106123a2576123a2612bcb565b60200101906001600160f81b03191690815f1a905350600101612358565b505f5b6008811015612432576123d7816007612bb8565b6123e2906008612a9e565b60608601516001600160401b0390811691161c60f81b8261240483607e612bdf565b8151811061241457612414612bcb565b60200101906001600160f81b03191690815f1a9053506001016123c3565b506002816040516124439190612e5a565b602060405180830381855afa15801561245e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612481919061287d565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6124b8611e6c565b6124c061253f565b6124c861254f565b61105281612557565b6124d9611e6c565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b612547611e6c565b611eb56125c3565b611eb5611e6c565b61255f611e6c565b80355f80516020612e9683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556125a96060830160408401612e75565b600291909101805460ff191660ff90921691909117905550565b61248a611e6c565b5080546125d790612ab5565b5f825580601f106125e6575050565b601f0160209004905f5260205f209081019061105291905b80821115612611575f81556001016125fe565b5090565b5f60e08284031215612625575f80fd5b50919050565b5f6020828403121561263b575f80fd5b5035919050565b803563ffffffff81168114612655575f80fd5b919050565b5f6020828403121561266a575f80fd5b61267382612642565b9392505050565b80356001600160401b0381168114612655575f80fd5b5f602082840312156126a0575f80fd5b6126738261267a565b8015158114611052575f80fd5b5f805f606084860312156126c8575f80fd5b8335925060208401356126da816126a9565b91506126e860408501612642565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612727576127276126f1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612755576127556126f1565b604052919050565b5f6001600160401b03821115612775576127756126f1565b50601f01601f191660200190565b5f805f60608486031215612795575f80fd5b833592506127a56020850161267a565b915060408401356001600160401b038111156127bf575f80fd5b8401601f810186136127cf575f80fd5b80356127e26127dd8261275d565b61272d565b8181528760208385010111156127f6575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561284357818101518382015260200161282b565b50505f910152565b602081525f8251806020840152612869816040850160208701612829565b601f01601f19169190910160400192915050565b5f6020828403121561288d575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826128ca576128ca612894565b500490565b6001600160a01b0381168114611052575f80fd5b8051612655816126a9565b5f80604083850312156128ff575f80fd5b82516001600160401b0380821115612915575f80fd5b9084019060608287031215612928575f80fd5b612930612705565b82518152602080840151612943816128cf565b82820152604084015183811115612958575f80fd5b80850194505087601f85011261296c575f80fd5b8351925061297c6127dd8461275d565b838152888285870101111561298f575f80fd5b61299e84838301848801612829565b806040840152508195506129b38188016128e3565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b8082028115828204841417610519576105196128a8565b600181811c90821680612ac957607f821691505b60208210810361262557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612b4081612ab5565b806020870152604060018084165f8114612b615760018114612b7d57612baa565b60ff19851660408a0152604084151560051b8a01019550612baa565b895f5260205f205f5b85811015612ba15781548b8201860152908301908801612b86565b8a016040019650505b509398975050505050505050565b81810381811115610519576105196128a8565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610519576105196128a8565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610c7c57805f5260205f20601f840160051c81016020851015612cea5750805b601f840160051c820191505b81811015610502575f8155600101612cf6565b81516001600160401b03811115612d2257612d226126f1565b612d3681612d308454612ab5565b84612cc5565b602080601f831160018114612d69575f8415612d525750858301515b5f19600386901b1c1916600185901b178555612dc0565b5f85815260208120601f198616915b82811015612d9757888601518255948401946001909101908401612d78565b5085821015612db457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215612dd8575f80fd5b8135612673816128cf565b6001600160401b03818116838216019080821115612e0357612e036128a8565b5092915050565b6001600160401b03818116838216028082169190828114612e2d57612e2d6128a8565b505092915050565b5f6001600160401b0380841680612e4e57612e4e612894565b92169190910492915050565b5f8251612e6b818460208701612829565b9190910192915050565b5f60208284031215612e85575f80fd5b813560ff81168114612673575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorManagerSettings\",\"components\":[{\"name\":\"baseSettings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161311a38038061311a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612fcd8061014d5f395ff3fe608060405260043610610099575f3560e01c80636206585611610062578063620658561461019057806376f78621146101af578063a3a65e48146101ce578063b771b3bc146101ed578063bee0a03f1461021f578063f40797d71461023e575f80fd5b8062e417921461009d5780630322ed98146100be5780630cdd0985146100dd5780632e2194d81461013a578063467ef06f14610171575b5f80fd5b3480156100a8575f80fd5b506100bc6100b7366004612720565b610251565b005b3480156100c9575f80fd5b506100bc6100d8366004612736565b610333565b3480156100e8575f80fd5b506101276100f7366004612736565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b348015610145575f80fd5b50610159610154366004612736565b610509565b6040516001600160401b039091168152602001610131565b34801561017c575f80fd5b506100bc61018b366004612765565b61051f565b34801561019b575f80fd5b506101276101aa36600461279b565b61054a565b3480156101ba575f80fd5b506100bc6101c93660046127c1565b610563565b3480156101d9575f80fd5b506100bc6101e8366004612765565b610894565b3480156101f8575f80fd5b506102076005600160991b0181565b6040516001600160a01b039091168152602001610131565b34801561022a575f80fd5b506100bc610239366004612736565b610b23565b61012761024c36600461288e565b610c32565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061029a575080546001600160401b03808416911610155b156102b85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556102e283610c54565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612fa183398151915293929190829060ff16600581111561039357610393612920565b60058111156103a4576103a4612920565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091508151600581111561041b5761041b612920565b146104855760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f6104958483606001515f610c68565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906104c2908490600401612956565b6020604051808303815f875af11580156104de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105029190612988565b5050505050565b5f61051964e8d4a51000836129c7565b92915050565b5f61052982610e85565b905061054681608001516001600160401b031682604001516112d7565b5050565b5f6105196001600160401b03831664e8d4a510006129da565b8115610886575f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d006040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156105d7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105fe9190810190612a10565b91509150806106615760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161047c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c89190612988565b82511461072c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161047c565b60208201516001600160a01b0316156107a25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161047c565b5f806107b184604001516112ea565b9150915081881461081e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161047c565b5f888152600386016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61088f836114c2565b505050565b5f5f80516020612fa18339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156108ef573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526109169190810190612a10565b91509150806109375760405162461bcd60e51b815260040161047c90612ae2565b82548251146109585760405162461bcd60e51b815260040161047c90612b28565b60208201516001600160a01b0316156109835760405162461bcd60e51b815260040161047c90612b71565b5f80610992846040015161184f565b91509150806109f45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161047c565b5f82815260058601602052604081208054610a0e90612bc0565b9050118015610a40575060015f83815260068701602052604090205460ff166005811115610a3e57610a3e612920565b145b610a5c5760405162461bcd60e51b815260040161047c90612bf2565b5f8281526005860160205260408120610a74916126d6565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612fa1833981519152929190610b6b90612bc0565b9050118015610b9d575060015f83815260068301602052604090205460ff166005811115610b9b57610b9b612920565b145b610bb95760405162461bcd60e51b815260040161047c90612bf2565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bf29190600401612c39565b6020604051808303815f875af1158015610c0e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088f9190612988565b5f80610c3d346119f0565b9050610c4b85828686611aad565b95945050505050565b610c5c611ee4565b610c6581611f2f565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610ce157610ca1816001612cc3565b610cac9060086129da565b5081515f90839083908110610cc357610cc3612cd6565b60200101906001600160f81b03191690815f1a905350600101610c8d565b505f5b6004811015610d4457610cf8816003612cc3565b610d039060086129da565b6001901c60f81b82610d16836002612cea565b81518110610d2657610d26612cd6565b60200101906001600160f81b03191690815f1a905350600101610ce4565b505f5b6020811015610da657610d5b81601f612cc3565b610d669060086129da565b86901c60f81b82610d78836006612cea565b81518110610d8857610d88612cd6565b60200101906001600160f81b03191690815f1a905350600101610d47565b505f5b6008811015610e1157610dbd816007612cc3565b610dc89060086129da565b6001600160401b038616901c60f81b82610de3836026612cea565b81518110610df357610df3612cd6565b60200101906001600160f81b03191690815f1a905350600101610da9565b505f5b6008811015610e7c57610e28816007612cc3565b610e339060086129da565b6001600160401b038516901c60f81b82610e4e83602e612cea565b81518110610e5e57610e5e612cd6565b60200101906001600160f81b03191690815f1a905350600101610e14565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091525f5f80516020612fa18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610f18573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610f3f9190810190612a10565b9150915080610f605760405162461bcd60e51b815260040161047c90612ae2565b8254825114610f815760405162461bcd60e51b815260040161047c90612b28565b60208201516001600160a01b031615610fac5760405162461bcd60e51b815260040161047c90612b71565b5f80610fbb846040015161184f565b9150915080156110205760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161047c565b5f828152600686016020526040808220815160e081019092528054829060ff16600581111561105157611051612920565b600581111561106257611062612920565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156110db576110db612920565b14806110f957506001825160058111156110f7576110f7612920565b145b6111585760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161047c565b60038251600581111561116d5761116d612920565b0361117a5750600461117e565b5060055b6020808301515f908152600789019091526040812055818160058111156111a7576111a7612920565b908160058111156111ba576111ba612920565b9052505f84815260068801602052604090208251815484929190829060ff191660018360058111156111ee576111ee612920565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055815160058111156112a1576112a1612920565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350979650505050505050565b6105466001600160a01b03821683611f72565b5f808251602e1461130d5760405162461bcd60e51b815260040161047c90612cfd565b5f805b600281101561135c57611324816001612cc3565b61132f9060086129da565b61ffff1685828151811061134557611345612cd6565b016020015160f81c901b9190911790600101611310565b5061ffff81161561137f5760405162461bcd60e51b815260040161047c90612d46565b5f805b60048110156113da57611396816003612cc3565b6113a19060086129da565b63ffffffff16866113b3836002612cea565b815181106113c3576113c3612cd6565b016020015160f81c901b9190911790600101611382565b5063ffffffff81166004146114015760405162461bcd60e51b815260040161047c90612d89565b5f805b60208110156114565761141881601f612cc3565b6114239060086129da565b8761142f836006612cea565b8151811061143f5761143f612cd6565b016020015160f81c901b9190911790600101611404565b505f805b60088110156114b55761146e816007612cc3565b6114799060086129da565b6001600160401b03168861148e836026612cea565b8151811061149e5761149e612cd6565b016020015160f81c901b919091179060010161145a565b5090969095509350505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f80516020612fa183398151915293929190829060ff16600581111561152257611522612920565b600581111561153357611533612920565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156115ad576115ad612920565b146116095760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161047c565b60408101516001600160a01b0316336001600160a01b0316146116835760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161047c565b6116908160800151612005565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156116d4576116d4612920565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061178b90859083610c68565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906117ba908590600401612956565b6020604051808303815f875af11580156117d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117fa9190612988565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146118725760405162461bcd60e51b815260040161047c90612cfd565b5f805b60028110156118c157611889816001612cc3565b6118949060086129da565b61ffff168582815181106118aa576118aa612cd6565b016020015160f81c901b9190911790600101611875565b5061ffff8116156118e45760405162461bcd60e51b815260040161047c90612d46565b5f805b600481101561193f576118fb816003612cc3565b6119069060086129da565b63ffffffff1686611918836002612cea565b8151811061192857611928612cd6565b016020015160f81c901b91909117906001016118e7565b5063ffffffff81166002146119665760405162461bcd60e51b815260040161047c90612d89565b5f805b60208110156119bb5761197d81601f612cc3565b6119889060086129da565b87611994836006612cea565b815181106119a4576119a4612cd6565b016020015160f81c901b9190911790600101611969565b505f866026815181106119d0576119d0612cd6565b016020015191976001600160f81b03199092161515965090945050505050565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d008282611a1d82610509565b83549091506001600160401b03821610801590611a4757508260010154816001600160401b031611155b611aa55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161047c565b949350505050565b5f611ab66121a6565b5f80516020612fa1833981519152426001600160401b038516118015611af057506001600160401b038416611aee426202a300612cea565b115b611b525760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161047c565b85611ba95760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161047c565b5f86815260078201602052604090205415611c175760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161047c565b8251603014611c7e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161047c565b611c8785612005565b5f80611cce6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506121f0565b5f82815260058601602052604090209193509150611cec8282612e14565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d19908590600401612956565b6020604051808303815f875af1158015611d35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d599190612988565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115611dd257611dd2612920565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050611aa560017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16611f2d57604051631afcd79f60e31b815260040160405180910390fd5b565b611f37611ee4565b611f40816125bb565b610c6560608201356080830135611f5d60c0850160a0860161279b565b611f6d60e0860160c08701612ed3565b6125dc565b80471015611f955760405163cd78605960e01b815230600482015260240161047c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611fde576040519150601f19603f3d011682016040523d82523d5f602084013e611fe3565b606091505b505090508061088f57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612fa18339815191529060ff165f03612043575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061208b9083612cc3565b106120a7576001600160401b03841660408301528082526120c6565b83826040018181516120b99190612eee565b6001600160401b03169052505b5f8260200151836040015160646120dd9190612f15565b6120e79190612f40565b600285015490915060ff90811690821611156121625760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161047c565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016121ea57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461225a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161047c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156122d157612291816001612cc3565b61229c9060086129da565b5081515f908390839081106122b3576122b3612cd6565b60200101906001600160f81b03191690815f1a90535060010161227d565b505f5b600481101561232f576122e8816003612cc3565b6122f39060086129da565b505f82612301836002612cea565b8151811061231157612311612cd6565b60200101906001600160f81b03191690815f1a9053506001016122d4565b505f5b602081101561238c578451816020811061234e5761234e612cd6565b1a60f81b8261235e836006612cea565b8151811061236e5761236e612cd6565b60200101906001600160f81b03191690815f1a905350600101612332565b505f5b60208110156123ec57846020015181602081106123ae576123ae612cd6565b1a60f81b826123be836026612cea565b815181106123ce576123ce612cd6565b60200101906001600160f81b03191690815f1a90535060010161238f565b505f5b600881101561246057612403816007612cc3565b61240e9060086129da565b60ff1685604001516001600160401b0316901c60f81b828260466124329190612cea565b8151811061244257612442612cd6565b60200101906001600160f81b03191690815f1a9053506001016123ef565b505f5b60308110156124cb578460800151818151811061248257612482612cd6565b01602001516001600160f81b0319168261249d83604e612cea565b815181106124ad576124ad612cd6565b60200101906001600160f81b03191690815f1a905350600101612463565b505f5b600881101561253d576124e2816007612cc3565b6124ed9060086129da565b60608601516001600160401b0390811691161c60f81b8261250f83607e612cea565b8151811061251f5761251f612cd6565b60200101906001600160f81b03191690815f1a9053506001016124ce565b5060028160405161254e9190612f65565b602060405180830381855afa158015612569573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061258c9190612988565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6125c3611ee4565b6125cb61264a565b6125d361265a565b610c6581612662565b6125e4611ee4565b5f7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b612652611ee4565b611f2d6126ce565b611f2d611ee4565b61266a611ee4565b80355f80516020612fa183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556126b46060830160408401612f80565b600291909101805460ff191660ff90921691909117905550565b612595611ee4565b5080546126e290612bc0565b5f825580601f106126f1575050565b601f0160209004905f5260205f2090810190610c6591905b8082111561271c575f8155600101612709565b5090565b5f60e08284031215612730575f80fd5b50919050565b5f60208284031215612746575f80fd5b5035919050565b803563ffffffff81168114612760575f80fd5b919050565b5f60208284031215612775575f80fd5b61277e8261274d565b9392505050565b80356001600160401b0381168114612760575f80fd5b5f602082840312156127ab575f80fd5b61277e82612785565b8015158114610c65575f80fd5b5f805f606084860312156127d3575f80fd5b8335925060208401356127e5816127b4565b91506127f36040850161274d565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612832576128326127fc565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612860576128606127fc565b604052919050565b5f6001600160401b03821115612880576128806127fc565b50601f01601f191660200190565b5f805f606084860312156128a0575f80fd5b833592506128b060208501612785565b915060408401356001600160401b038111156128ca575f80fd5b8401601f810186136128da575f80fd5b80356128ed6128e882612868565b612838565b818152876020838501011115612901575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561294e578181015183820152602001612936565b50505f910152565b602081525f8251806020840152612974816040850160208701612934565b601f01601f19169190910160400192915050565b5f60208284031215612998575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826129d5576129d561299f565b500490565b8082028115828204841417610519576105196129b3565b6001600160a01b0381168114610c65575f80fd5b8051612760816127b4565b5f8060408385031215612a21575f80fd5b82516001600160401b0380821115612a37575f80fd5b9084019060608287031215612a4a575f80fd5b612a52612810565b82518152602080840151612a65816129f1565b82820152604084015183811115612a7a575f80fd5b80850194505087601f850112612a8e575f80fd5b83519250612a9e6128e884612868565b8381528882858701011115612ab1575f80fd5b612ac084838301848801612934565b80604084015250819550612ad5818801612a05565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b600181811c90821680612bd457607f821691505b60208210810361273057634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612c4b81612bc0565b806020870152604060018084165f8114612c6c5760018114612c8857612cb5565b60ff19851660408a0152604084151560051b8a01019550612cb5565b895f5260205f205f5b85811015612cac5781548b8201860152908301908801612c91565b8a016040019650505b509398975050505050505050565b81810381811115610519576105196129b3565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610519576105196129b3565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f82111561088f57805f5260205f20601f840160051c81016020851015612df55750805b601f840160051c820191505b81811015610502575f8155600101612e01565b81516001600160401b03811115612e2d57612e2d6127fc565b612e4181612e3b8454612bc0565b84612dd0565b602080601f831160018114612e74575f8415612e5d5750858301515b5f19600386901b1c1916600185901b178555612ecb565b5f85815260208120601f198616915b82811015612ea257888601518255948401946001909101908401612e83565b5085821015612ebf57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215612ee3575f80fd5b813561277e816129f1565b6001600160401b03818116838216019080821115612f0e57612f0e6129b3565b5092915050565b6001600160401b03818116838216028082169190828114612f3857612f386129b3565b505092915050565b5f6001600160401b0380841680612f5957612f5961299f565b92169190910492915050565b5f8251612f76818460208701612934565b9190910192915050565b5f60208284031215612f90575f80fd5b813560ff8116811461277e575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 85aa975df..210d023c5 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -39,7 +39,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"initialize\",\"inputs\":[{\"name\":\"settings\",\"type\":\"tuple\",\"internalType\":\"structValidatorManagerSettings\",\"components\":[{\"name\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612a33380380612a3383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6128e68061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c806397fb70d41161006e57806397fb70d41461018d578063a3a65e48146101a0578063b771b3bc146101b3578063bee0a03f146101c1578063c151c0b9146101d4578063f2fde38b146101e7575f80fd5b80630322ed98146100b55780630cdd0985146100ca5780633aaa9f251461011b578063467ef06f1461012e578063715018a6146101415780638da5cb5b14610149575b5f80fd5b6100c86100c336600461214a565b6101fa565b005b6101086100d836600461214a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61010861012936600461220e565b6103d0565b6100c861013c3660046122b1565b6103f0565b6100c8610808565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610112565b6100c861019b36600461214a565b61081b565b6100c86101ae3660046122b1565b610827565b6101756005600160991b0181565b6100c86101cf36600461214a565b610ab6565b6100c86101e23660046122ef565b610bca565b6100c86101f536600461232b565b610cd8565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206128ba83398151915293929190829060ff16600581111561025a5761025a612346565b600581111561026b5761026b612346565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102e2576102e2612346565b1461034c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61035c8483606001515f610d12565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061038990849060040161237c565b6020604051808303815f875af11580156103a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c991906123ae565b5050505050565b5f6103d9610f2f565b6103e584868585610f8a565b90505b949350505050565b5f5f805160206128ba8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561044b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261047291908101906123d4565b91509150806104935760405162461bcd60e51b8152600401610343906124a6565b82548251146104b45760405162461bcd60e51b8152600401610343906124ec565b60208201516001600160a01b0316156104df5760405162461bcd60e51b815260040161034390612535565b5f806104ee84604001516113c1565b9150915080156105535760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610343565b5f828152600686016020526040808220815160e081019092528054829060ff16600581111561058457610584612346565b600581111561059557610595612346565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561060e5761060e612346565b148061062c575060018251600581111561062a5761062a612346565b145b61068b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610343565b6003825160058111156106a0576106a0612346565b036106ad575060046106b1565b5060055b6020808301515f908152600789019091526040812055818160058111156106da576106da612346565b908160058111156106ed576106ed612346565b9052505f84815260068801602052604090208251815484929190829060ff1916600183600581111561072157610721612346565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055815160058111156107d4576107d4612346565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a35050505050505050565b610810610f2f565b6108195f611620565b565b61082481611690565b50565b5f5f805160206128ba8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610882573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526108a991908101906123d4565b91509150806108ca5760405162461bcd60e51b8152600401610343906124a6565b82548251146108eb5760405162461bcd60e51b8152600401610343906124ec565b60208201516001600160a01b0316156109165760405162461bcd60e51b815260040161034390612535565b5f8061092584604001516113c1565b91509150806109875760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610343565b5f828152600586016020526040812080546109a190612584565b90501180156109d3575060015f83815260068701602052604090205460ff1660058111156109d1576109d1612346565b145b6109ef5760405162461bcd60e51b8152600401610343906125bc565b5f8281526005860160205260408120610a0791612100565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206128ba833981519152929190610afe90612584565b9050118015610b30575060015f83815260068301602052604090205460ff166005811115610b2e57610b2e612346565b145b610b4c5760405162461bcd60e51b8152600401610343906125bc565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610b859190600401612603565b6020604051808303815f875af1158015610ba1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bc591906123ae565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610c0e5750825b90505f826001600160401b03166001148015610c295750303b155b905081158015610c37575080155b15610c555760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c7f57845460ff60401b1916600160401b1785555b610c898787611a1d565b8315610ccf57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610ce0610f2f565b6001600160a01b038116610d0957604051631e4fbdf760e01b81525f6004820152602401610343565b61082481611620565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610d8b57610d4b8160016126a1565b610d569060086126ba565b5081515f90839083908110610d6d57610d6d6126d1565b60200101906001600160f81b03191690815f1a905350600101610d37565b505f5b6004811015610dee57610da28160036126a1565b610dad9060086126ba565b6001901c60f81b82610dc08360026126e5565b81518110610dd057610dd06126d1565b60200101906001600160f81b03191690815f1a905350600101610d8e565b505f5b6020811015610e5057610e0581601f6126a1565b610e109060086126ba565b86901c60f81b82610e228360066126e5565b81518110610e3257610e326126d1565b60200101906001600160f81b03191690815f1a905350600101610df1565b505f5b6008811015610ebb57610e678160076126a1565b610e729060086126ba565b6001600160401b038616901c60f81b82610e8d8360266126e5565b81518110610e9d57610e9d6126d1565b60200101906001600160f81b03191690815f1a905350600101610e53565b505f5b6008811015610f2657610ed28160076126a1565b610edd9060086126ba565b6001600160401b038516901c60f81b82610ef883602e6126e5565b81518110610f0857610f086126d1565b60200101906001600160f81b03191690815f1a905350600101610ebe565b50949350505050565b33610f617f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146108195760405163118cdaa760e01b8152336004820152602401610343565b5f610f93611a3b565b5f805160206128ba833981519152426001600160401b038516118015610fcd57506001600160401b038416610fcb426202a3006126e5565b115b61102f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610343565b856110865760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610343565b5f868152600782016020526040902054156110f45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610343565b825160301461115b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610343565b61116485611a85565b5f806111ab6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611c26565b5f828152600586016020526040902091935091506111c9828261273c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906111f690859060040161237c565b6020604051808303815f875af1158015611212573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123691906123ae565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff191660018360058111156112af576112af612346565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103e860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f8082516027146114265760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610343565b5f805b60028110156114755761143d8160016126a1565b6114489060086126ba565b61ffff1685828151811061145e5761145e6126d1565b016020015160f81c901b9190911790600101611429565b5061ffff8116156114d45760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610343565b5f805b600481101561152f576114eb8160036126a1565b6114f69060086126ba565b63ffffffff16866115088360026126e5565b81518110611518576115186126d1565b016020015160f81c901b91909117906001016114d7565b5063ffffffff81166002146115965760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610343565b5f805b60208110156115eb576115ad81601f6126a1565b6115b89060086126ba565b876115c48360066126e5565b815181106115d4576115d46126d1565b016020015160f81c901b9190911790600101611599565b505f86602681518110611600576116006126d1565b016020015191976001600160f81b03199092161515965090945050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206128ba83398151915293929190829060ff1660058111156116f0576116f0612346565b600581111561170157611701612346565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561177b5761177b612346565b146117d75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610343565b60408101516001600160a01b0316336001600160a01b0316146118515760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610343565b61185e8160800151611a85565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156118a2576118a2612346565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061195990859083610d12565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061198890859060040161237c565b6020604051808303815f875af11580156119a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c891906123ae565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b611a25611ff1565b611a2e8261203a565b611a378161205b565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a7f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206128ba8339815191529060ff165f03611ac3575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611b0b90836126a1565b10611b27576001600160401b0384166040830152808252611b46565b8382604001818151611b3991906127fb565b6001600160401b03169052505b5f826020015183604001516064611b5d9190612822565b611b67919061284d565b600285015490915060ff9081169082161115611be25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610343565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c905760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610343565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611d0757611cc78160016126a1565b611cd29060086126ba565b5081515f90839083908110611ce957611ce96126d1565b60200101906001600160f81b03191690815f1a905350600101611cb3565b505f5b6004811015611d6557611d1e8160036126a1565b611d299060086126ba565b505f82611d378360026126e5565b81518110611d4757611d476126d1565b60200101906001600160f81b03191690815f1a905350600101611d0a565b505f5b6020811015611dc25784518160208110611d8457611d846126d1565b1a60f81b82611d948360066126e5565b81518110611da457611da46126d1565b60200101906001600160f81b03191690815f1a905350600101611d68565b505f5b6020811015611e225784602001518160208110611de457611de46126d1565b1a60f81b82611df48360266126e5565b81518110611e0457611e046126d1565b60200101906001600160f81b03191690815f1a905350600101611dc5565b505f5b6008811015611e9657611e398160076126a1565b611e449060086126ba565b60ff1685604001516001600160401b0316901c60f81b82826046611e6891906126e5565b81518110611e7857611e786126d1565b60200101906001600160f81b03191690815f1a905350600101611e25565b505f5b6030811015611f015784608001518181518110611eb857611eb86126d1565b01602001516001600160f81b03191682611ed383604e6126e5565b81518110611ee357611ee36126d1565b60200101906001600160f81b03191690815f1a905350600101611e99565b505f5b6008811015611f7357611f188160076126a1565b611f239060086126ba565b60608601516001600160401b0390811691161c60f81b82611f4583607e6126e5565b81518110611f5557611f556126d1565b60200101906001600160f81b03191690815f1a905350600101611f04565b50600281604051611f84919061287e565b602060405180830381855afa158015611f9f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611fc291906123ae565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661081957604051631afcd79f60e31b815260040160405180910390fd5b612042611ff1565b61204a61206c565b61205261207c565b61082481612084565b612063611ff1565b610824816120f0565b612074611ff1565b6108196120f8565b610819611ff1565b61208c611ff1565b80355f805160206128ba83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556120d66060830160408401612899565b600291909101805460ff191660ff90921691909117905550565b610ce0611ff1565b611fcb611ff1565b50805461210c90612584565b5f825580601f1061211b575050565b601f0160209004905f5260205f209081019061082491905b80821115612146575f8155600101612133565b5090565b5f6020828403121561215a575f80fd5b5035919050565b80356001600160401b0381168114612177575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156121b2576121b261217c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156121e0576121e061217c565b604052919050565b5f6001600160401b038211156122005761220061217c565b50601f01601f191660200190565b5f805f8060808587031215612221575f80fd5b61222a85612161565b93506020850135925061223f60408601612161565b915060608501356001600160401b03811115612259575f80fd5b8501601f81018713612269575f80fd5b803561227c612277826121e8565b6121b8565b818152886020838501011115612290575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156122c1575f80fd5b813563ffffffff811681146122d4575f80fd5b9392505050565b6001600160a01b0381168114610824575f80fd5b5f808284036080811215612301575f80fd5b606081121561230e575f80fd5b508291506060830135612320816122db565b809150509250929050565b5f6020828403121561233b575f80fd5b81356122d4816122db565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561237457818101518382015260200161235c565b50505f910152565b602081525f825180602084015261239a81604085016020870161235a565b601f01601f19169190910160400192915050565b5f602082840312156123be575f80fd5b5051919050565b80518015158114612177575f80fd5b5f80604083850312156123e5575f80fd5b82516001600160401b03808211156123fb575f80fd5b908401906060828703121561240e575f80fd5b612416612190565b82518152602080840151612429816122db565b8282015260408401518381111561243e575f80fd5b80850194505087601f850112612452575f80fd5b83519250612462612277846121e8565b8381528882858701011115612475575f80fd5b6124848483830184880161235a565b806040840152508195506124998188016123c5565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b600181811c9082168061259857607f821691505b6020821081036125b657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461261581612584565b806020870152604060018084165f811461263657600181146126525761267f565b60ff19851660408a0152604084151560051b8a0101955061267f565b895f5260205f205f5b858110156126765781548b820186015290830190880161265b565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156126b4576126b461268d565b92915050565b80820281158282048414176126b4576126b461268d565b634e487b7160e01b5f52603260045260245ffd5b808201808211156126b4576126b461268d565b601f821115610bc557805f5260205f20601f840160051c8101602085101561271d5750805b601f840160051c820191505b818110156103c9575f8155600101612729565b81516001600160401b038111156127555761275561217c565b612769816127638454612584565b846126f8565b602080601f83116001811461279c575f84156127855750858301515b5f19600386901b1c1916600185901b1785556127f3565b5f85815260208120601f198616915b828110156127ca578886015182559484019460019091019084016127ab565b50858210156127e757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0381811683821601908082111561281b5761281b61268d565b5092915050565b6001600160401b038181168382160280821691908281146128455761284561268d565b505092915050565b5f6001600160401b038084168061287257634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f825161288f81846020870161235a565b9190910192915050565b5f602082840312156128a9575f80fd5b813560ff811681146122d4575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612a76380380612a7683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6129298061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c806397fb70d41161006e57806397fb70d41461018d578063a3a65e48146101a0578063b771b3bc146101b3578063bee0a03f146101c1578063c151c0b9146101d4578063f2fde38b146101e7575f80fd5b80630322ed98146100b55780630cdd0985146100ca5780633aaa9f251461011b578063467ef06f1461012e578063715018a6146101415780638da5cb5b14610149575b5f80fd5b6100c86100c336600461218d565b6101fa565b005b6101086100d836600461218d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b610108610129366004612251565b6103d0565b6100c861013c3660046122f4565b6103f0565b6100c86103fd565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610112565b6100c861019b36600461218d565b610410565b6100c86101ae3660046122f4565b61041c565b6101756005600160991b0181565b6100c86101cf36600461218d565b6106ab565b6100c86101e2366004612332565b6107bf565b6100c86101f536600461236e565b6108cd565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206128fd83398151915293929190829060ff16600581111561025a5761025a612389565b600581111561026b5761026b612389565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c090910152909150815160058111156102e2576102e2612389565b1461034c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f61035c8483606001515f610907565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906103899084906004016123bf565b6020604051808303815f875af11580156103a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c991906123f1565b5050505050565b5f6103d9610b24565b6103e584868585610b7f565b90505b949350505050565b6103f981610fb6565b5050565b610405610b24565b61040e5f611408565b565b61041981611478565b50565b5f5f805160206128fd8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610477573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261049e9190810190612417565b91509150806104bf5760405162461bcd60e51b8152600401610343906124e9565b82548251146104e05760405162461bcd60e51b81526004016103439061252f565b60208201516001600160a01b03161561050b5760405162461bcd60e51b815260040161034390612578565b5f8061051a8460400151611805565b915091508061057c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610343565b5f82815260058601602052604081208054610596906125c7565b90501180156105c8575060015f83815260068701602052604090205460ff1660058111156105c6576105c6612389565b145b6105e45760405162461bcd60e51b8152600401610343906125ff565b5f82815260058601602052604081206105fc91612143565b5f8281526006860160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260078c0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a2505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206128fd8339815191529291906106f3906125c7565b9050118015610725575060015f83815260068301602052604090205460ff16600581111561072357610723612389565b145b6107415760405162461bcd60e51b8152600401610343906125ff565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161077a9190600401612646565b6020604051808303815f875af1158015610796573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ba91906123f1565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156108035750825b90505f826001600160401b0316600114801561081e5750303b155b90508115801561082c575080155b1561084a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561087457845460ff60401b1916600160401b1785555b61087e8787611a64565b83156108c457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6108d5610b24565b6001600160a01b0381166108fe57604051631e4fbdf760e01b81525f6004820152602401610343565b61041981611408565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610980576109408160016126e4565b61094b9060086126fd565b5081515f9083908390811061096257610962612714565b60200101906001600160f81b03191690815f1a90535060010161092c565b505f5b60048110156109e3576109978160036126e4565b6109a29060086126fd565b6001901c60f81b826109b5836002612728565b815181106109c5576109c5612714565b60200101906001600160f81b03191690815f1a905350600101610983565b505f5b6020811015610a45576109fa81601f6126e4565b610a059060086126fd565b86901c60f81b82610a17836006612728565b81518110610a2757610a27612714565b60200101906001600160f81b03191690815f1a9053506001016109e6565b505f5b6008811015610ab057610a5c8160076126e4565b610a679060086126fd565b6001600160401b038616901c60f81b82610a82836026612728565b81518110610a9257610a92612714565b60200101906001600160f81b03191690815f1a905350600101610a48565b505f5b6008811015610b1b57610ac78160076126e4565b610ad29060086126fd565b6001600160401b038516901c60f81b82610aed83602e612728565b81518110610afd57610afd612714565b60200101906001600160f81b03191690815f1a905350600101610ab3565b50949350505050565b33610b567f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461040e5760405163118cdaa760e01b8152336004820152602401610343565b5f610b88611a7e565b5f805160206128fd833981519152426001600160401b038516118015610bc257506001600160401b038416610bc0426202a300612728565b115b610c245760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610343565b85610c7b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610343565b5f86815260078201602052604090205415610ce95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610343565b8251603014610d505760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610343565b610d5985611ac8565b5f80610da06040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611c69565b5f82815260058601602052604090209193509150610dbe828261277f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610deb9085906004016123bf565b6020604051808303815f875af1158015610e07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2b91906123f1565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526006880190522081518154829060ff19166001836005811115610ea457610ea4612389565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c0909701518316600160801b0267ffffffffffffffff60801b19978416600160401b026001600160801b03199092169684169690961717959095169390931790935582518b83168152918a169082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103e860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091525f5f805160206128fd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611049573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110709190810190612417565b91509150806110915760405162461bcd60e51b8152600401610343906124e9565b82548251146110b25760405162461bcd60e51b81526004016103439061252f565b60208201516001600160a01b0316156110dd5760405162461bcd60e51b815260040161034390612578565b5f806110ec8460400151611805565b9150915080156111515760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610343565b5f828152600686016020526040808220815160e081019092528054829060ff16600581111561118257611182612389565b600581111561119357611193612389565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561120c5761120c612389565b148061122a575060018251600581111561122857611228612389565b145b6112895760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610343565b60038251600581111561129e5761129e612389565b036112ab575060046112af565b5060055b6020808301515f908152600789019091526040812055818160058111156112d8576112d8612389565b908160058111156112eb576112eb612389565b9052505f84815260068801602052604090208251815484929190829060ff1916600183600581111561131f5761131f612389565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055815160058111156113d2576113d2612389565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350979650505050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040808220815160e0810190925280545f805160206128fd83398151915293929190829060ff1660058111156114d8576114d8612389565b60058111156114e9576114e9612389565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561156357611563612389565b146115bf5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610343565b60408101516001600160a01b0316336001600160a01b0316146116395760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610343565b6116468160800151611ac8565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561168a5761168a612389565b02179055506020820151600182015560408201516002820180546060808601516001600160a01b039094166001600160e01b031990921691909117600160a01b6001600160401b03948516021790915560808401516003909301805460a086015160c0909601519484166001600160801b031990911617600160401b958416959095029490941767ffffffffffffffff60801b1916600160801b9390921692909202179091558101515f9061174190859083610907565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906117709085906004016123bf565b6020604051808303815f875af115801561178c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117b091906123f1565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461186a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610343565b5f805b60028110156118b9576118818160016126e4565b61188c9060086126fd565b61ffff168582815181106118a2576118a2612714565b016020015160f81c901b919091179060010161186d565b5061ffff8116156119185760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610343565b5f805b60048110156119735761192f8160036126e4565b61193a9060086126fd565b63ffffffff168661194c836002612728565b8151811061195c5761195c612714565b016020015160f81c901b919091179060010161191b565b5063ffffffff81166002146119da5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610343565b5f805b6020811015611a2f576119f181601f6126e4565b6119fc9060086126fd565b87611a08836006612728565b81518110611a1857611a18612714565b016020015160f81c901b91909117906001016119dd565b505f86602681518110611a4457611a44612714565b016020015191976001600160f81b03199092161515965090945050505050565b611a6c612034565b611a758261207d565b6103f98161209e565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611ac257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206128fd8339815191529060ff165f03611b06575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611b4e90836126e4565b10611b6a576001600160401b0384166040830152808252611b89565b8382604001818151611b7c919061283e565b6001600160401b03169052505b5f826020015183604001516064611ba09190612865565b611baa9190612890565b600285015490915060ff9081169082161115611c255760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610343565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611cd35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610343565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611d4a57611d0a8160016126e4565b611d159060086126fd565b5081515f90839083908110611d2c57611d2c612714565b60200101906001600160f81b03191690815f1a905350600101611cf6565b505f5b6004811015611da857611d618160036126e4565b611d6c9060086126fd565b505f82611d7a836002612728565b81518110611d8a57611d8a612714565b60200101906001600160f81b03191690815f1a905350600101611d4d565b505f5b6020811015611e055784518160208110611dc757611dc7612714565b1a60f81b82611dd7836006612728565b81518110611de757611de7612714565b60200101906001600160f81b03191690815f1a905350600101611dab565b505f5b6020811015611e655784602001518160208110611e2757611e27612714565b1a60f81b82611e37836026612728565b81518110611e4757611e47612714565b60200101906001600160f81b03191690815f1a905350600101611e08565b505f5b6008811015611ed957611e7c8160076126e4565b611e879060086126fd565b60ff1685604001516001600160401b0316901c60f81b82826046611eab9190612728565b81518110611ebb57611ebb612714565b60200101906001600160f81b03191690815f1a905350600101611e68565b505f5b6030811015611f445784608001518181518110611efb57611efb612714565b01602001516001600160f81b03191682611f1683604e612728565b81518110611f2657611f26612714565b60200101906001600160f81b03191690815f1a905350600101611edc565b505f5b6008811015611fb657611f5b8160076126e4565b611f669060086126fd565b60608601516001600160401b0390811691161c60f81b82611f8883607e612728565b81518110611f9857611f98612714565b60200101906001600160f81b03191690815f1a905350600101611f47565b50600281604051611fc791906128c1565b602060405180830381855afa158015611fe2573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061200591906123f1565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661040e57604051631afcd79f60e31b815260040160405180910390fd5b612085612034565b61208d6120af565b6120956120bf565b610419816120c7565b6120a6612034565b61041981612133565b6120b7612034565b61040e61213b565b61040e612034565b6120cf612034565b80355f805160206128fd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561211960608301604084016128dc565b600291909101805460ff191660ff90921691909117905550565b6108d5612034565b61200e612034565b50805461214f906125c7565b5f825580601f1061215e575050565b601f0160209004905f5260205f209081019061041991905b80821115612189575f8155600101612176565b5090565b5f6020828403121561219d575f80fd5b5035919050565b80356001600160401b03811681146121ba575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156121f5576121f56121bf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612223576122236121bf565b604052919050565b5f6001600160401b03821115612243576122436121bf565b50601f01601f191660200190565b5f805f8060808587031215612264575f80fd5b61226d856121a4565b935060208501359250612282604086016121a4565b915060608501356001600160401b0381111561229c575f80fd5b8501601f810187136122ac575f80fd5b80356122bf6122ba8261222b565b6121fb565b8181528860208385010111156122d3575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612304575f80fd5b813563ffffffff81168114612317575f80fd5b9392505050565b6001600160a01b0381168114610419575f80fd5b5f808284036080811215612344575f80fd5b6060811215612351575f80fd5b5082915060608301356123638161231e565b809150509250929050565b5f6020828403121561237e575f80fd5b81356123178161231e565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156123b757818101518382015260200161239f565b50505f910152565b602081525f82518060208401526123dd81604085016020870161239d565b601f01601f19169190910160400192915050565b5f60208284031215612401575f80fd5b5051919050565b805180151581146121ba575f80fd5b5f8060408385031215612428575f80fd5b82516001600160401b038082111561243e575f80fd5b9084019060608287031215612451575f80fd5b6124596121d3565b8251815260208084015161246c8161231e565b82820152604084015183811115612481575f80fd5b80850194505087601f850112612495575f80fd5b835192506124a56122ba8461222b565b83815288828587010111156124b8575f80fd5b6124c78483830184880161239d565b806040840152508195506124dc818801612408565b9450505050509250929050565b60208082526026908201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60408201526565737361676560d01b606082015260800190565b60208082526029908201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656040820152680818da185a5b88125160ba1b606082015260800190565b6020808252602f908201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60408201526e2073656e646572206164647265737360881b606082015260800190565b600181811c908216806125db57607f821691505b6020821081036125f957634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612658816125c7565b806020870152604060018084165f81146126795760018114612695576126c2565b60ff19851660408a0152604084151560051b8a010195506126c2565b895f5260205f205f5b858110156126b95781548b820186015290830190880161269e565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156126f7576126f76126d0565b92915050565b80820281158282048414176126f7576126f76126d0565b634e487b7160e01b5f52603260045260245ffd5b808201808211156126f7576126f76126d0565b601f8211156107ba57805f5260205f20601f840160051c810160208510156127605750805b601f840160051c820191505b818110156103c9575f815560010161276c565b81516001600160401b03811115612798576127986121bf565b6127ac816127a684546125c7565b8461273b565b602080601f8311600181146127df575f84156127c85750858301515b5f19600386901b1c1916600185901b178555612836565b5f85815260208120601f198616915b8281101561280d578886015182559484019460019091019084016127ee565b508582101561282a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0381811683821601908082111561285e5761285e6126d0565b5092915050565b6001600160401b03818116838216028082169190828114612888576128886126d0565b505092915050565b5f6001600160401b03808416806128b557634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516128d281846020870161239d565b9190910192915050565b5f602082840312156128ec575f80fd5b813560ff81168114612317575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoAValidatorManager.sol b/contracts/staking/PoAValidatorManager.sol index e194b7b0d..4ead5db0c 100644 --- a/contracts/staking/PoAValidatorManager.sol +++ b/contracts/staking/PoAValidatorManager.sol @@ -53,4 +53,8 @@ contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableU function initializeEndValidation(bytes32 validationID) external override { _initializeEndValidation(validationID); } + + function completeEndValidation(uint32 messageIndex) external { + _completeEndValidation(messageIndex); + } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index a9e663fb1..231a591b8 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -7,6 +7,7 @@ pragma solidity 0.8.25; import {IPoSValidatorManager} from "./interfaces/IPoSValidatorManager.sol"; import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; +import {Validator} from "./interfaces/IValidatorManager.sol"; import {ValidatorManager} from "./ValidatorManager.sol"; import {WarpMessage} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; @@ -104,6 +105,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _initializeEndValidation(validationID); } + function completeEndValidation(uint32 messageIndex) external { + Validator memory validator = _completeEndValidation(messageIndex); + _unlock(validator.weight, validator.owner); + } + function _processStake(uint256 stakeAmount) internal virtual returns (uint64) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Lock the stake in the contract. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 4608416b9..72f7ecfb5 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -274,8 +274,9 @@ abstract contract ValidatorManager is * 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 */ - function completeEndValidation(uint32 messageIndex) external { + function _completeEndValidation(uint32 messageIndex) internal returns (Validator memory) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Get the Warp message. @@ -324,6 +325,8 @@ abstract contract ValidatorManager is // Emit event. emit ValidationPeriodEnded(validationID, validator.status); + + return validator; } /** diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 647d7d3d8..6de98980c 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -62,6 +62,9 @@ abstract contract ValidatorManagerTest is Test { event ValidationPeriodEnded(bytes32 indexed validationID, ValidatorStatus indexed status); + receive() external payable {} + fallback() external payable {} + function testInitializeValidatorRegistrationSuccess() public { _setUpInitializeValidatorRegistration( DEFAULT_NODE_ID, From 83191a9847355e9a82a246509755a06771b9acf4 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 4 Sep 2024 22:01:46 -0500 Subject: [PATCH 194/545] properly update state --- contracts/staking/PoSValidatorManager.sol | 17 ++++------------- .../tests/PoSValidatorManagerTests.t.sol | 7 ++----- 2 files changed, 6 insertions(+), 18 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 5c7e908eb..aa3d6d85d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -145,11 +145,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function _lock(uint256 value) internal virtual returns (uint256); function _unlock(uint256 value, address to) internal virtual; - // TODO: Updating the nonce in this function call DOES work as expected - function foo(bytes32 validationID) external { - _getAndIncrementNonce(validationID); - } - function _initializeDelegatorRegistration( bytes32 validationID, address delegator, @@ -163,11 +158,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( validator.status == ValidatorStatus.Active, "PoSValidatorManager: validator not active" ); - // TODO: This function call seems to not update the validator manager's state, - // but ONLY when called from here. The same call in other methods does appear to - // update the validator manager's state as expected. - uint64 nonce = _getAndIncrementNonce(validationID); + // Update the validator weight + validator.weight += weight; + _setValidator(validationID, validator); + uint64 nonce = _getAndIncrementNonce(validationID); bytes32 delegationID = sha256(abi.encodePacked(validationID, delegator, nonce)); // Ensure the delegator is not already registered @@ -178,10 +173,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _checkAndUpdateChurnTracker(weight); - // Update the validator weight - validator.weight += weight; - _setValidator(validationID, validator); - // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index b320060e7..be1d98c02 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -387,8 +387,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); - // TODO: Remove this once the nonce update bug is fixed - posValidatorManager.foo(validationID); _setUpCompleteDelegatorRegistration( validationID, delegationID, @@ -408,8 +406,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2 ); } - - function testCompleteEndblahDelegationWrongNonce() public { + function testCompleteEndDelegationWrongNonce() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -483,7 +480,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.completeEndDelegation(0, delegationID_2); } - function testCompleteEndDeblahlegationImplicitNonce() public { + function testCompleteEndDelegationImplicitNonce() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, From 328a4259a2a5915aaa5d2ca1bff5dbbadc8c0ca5 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 4 Sep 2024 22:07:44 -0500 Subject: [PATCH 195/545] format --- .../ERC20TokenStakingManager.go | 260 +++++++++--------- .../NativeTokenStakingManager.go | 260 +++++++++--------- .../staking/NativeTokenStakingManager.sol | 6 +- contracts/staking/PoSValidatorManager.sol | 14 +- .../interfaces/IERC20TokenStakingManager.sol | 5 +- .../interfaces/INativeTokenStakingManager.sol | 5 +- .../NativeTokenStakingManagerTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 129 +++++---- 8 files changed, 342 insertions(+), 339 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 8fc3b66b2..27017da0f 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"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\":\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516148aa3803806148aa83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61475d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063b771b3bc1461028a578063bee0a03f146102b0578063d61bed74146102c3575f80fd5b806366435abf146102185780636a7e3d831461022b57806376f786211461023e578063872fda6414610251575f80fd5b80630cdd0985116100e45780630cdd09851461016357806327f39ca8146101b45780632e2194d8146101c7578063467ef06f146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630915204e1461013d5780630b77f69314610150575b5f80fd5b610128610123366004613d74565b6102d6565b005b610128610138366004613daf565b610700565b61012861014b366004613dda565b61085c565b61012861015e366004613e0f565b610a1c565b6101a1610171366004613daf565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101286101c2366004613e32565b610ae4565b6101da6101d5366004613daf565b610bc8565b6040516001600160401b0390911681526020016101ab565b610128610200366004613e64565b610bde565b6101a1610213366004613e93565b610f3a565b6101da610226366004613daf565b610f53565b610128610239366004613e0f565b610f67565b61012861024c366004613d74565b610fe9565b6101a161025f366004613f3e565b611004565b610128610272366004613fda565b611029565b610128610285366004613e64565b611038565b6102986005600160991b0181565b6040516001600160a01b0390911681526020016101ab565b6101286102be366004613daf565b6111f1565b6101286102d1366004613dda565b6112c0565b5f82156102ea576102e784836114af565b90505b5f8481527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f805160206146d183398151915293929190829060ff16600481111561035557610355613ffa565b600481111561036657610366613ffa565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a09091015290506002815160048111156103d0576103d0613ffa565b146104345760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f61043e8761174b565b9050600382819052506001600160401b034281166060840152811660a08301525f878152600384016020526040812083916104763390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff191660018360048111156104ac576104ac613ffa565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f610556886117c6565b905082602001516001600160401b031681608001516001600160401b0316116105cd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161042b565b8260200151816080018181516105e39190614022565b6001600160401b03169052506105f988826118c1565b5f610609898484608001516119b0565b5f8a81526005870160209081526040808320338452909152902090915061063082826140cc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061065d9085906004016141ad565b6020604051808303815f875af1158015610679573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069d91906141df565b6080840151604080516001600160401b0392831681529187166020830152428282015251919250339183918d917fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde9181900360600190a450505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206146f183398151915292919061074890614049565b905011801561077a575060035f83815260078301602052604090205460ff16600581111561077857610778613ffa565b145b6107de5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161042b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161081791906004016141f6565b6020604051808303815f875af1158015610833573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085791906141df565b505050565b5f805160206146d18339815191525f61087484611bcf565b90505f806108858360400151611db0565b50915091506108948286611feb565b5f82815260058501602090815260408083206001600160a01b038916845290915281206108c091613d05565b5f6108ca836117c6565b9050816001600160401b031681606001516001600160401b031610156109025760405162461bcd60e51b815260040161042b90614280565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b90920416111561095b5760405162461bcd60e51b815260040161042b906142c2565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561099557610995613ffa565b146109b25760405162461bcd60e51b815260040161042b9061430b565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b610a2682826120f4565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206146d1833981519152916005600160991b019163ee5b48eb91610a9e916004016141f6565b6020604051808303815f875af1158015610aba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ade91906141df565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b2d575080546001600160401b03808416911610155b15610b4b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b768484612208565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610bd864e8d4a510008361436f565b92915050565b5f805160206146f18339815191525f610bf683611bcf565b90505f80610c078360400151612222565b915091508015610c6c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161042b565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610c9d57610c9d613ffa565b6005811115610cae57610cae613ffa565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610d2757610d27613ffa565b1480610d455750600182516005811115610d4357610d43613ffa565b145b610da45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161042b565b600382516005811115610db957610db9613ffa565b03610de057505f8381526006860160205260408120600491610ddb9190613d05565b610de4565b5060055b6020808301515f90815260088801909152604081205581816005811115610e0d57610e0d613ffa565b90816005811115610e2057610e20613ffa565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610e5457610e54613ffa565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610f0757610f07613ffa565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f610bd86001600160401b03831664e8d4a51000614382565b5f610f5d826117c6565b6080015192915050565b610f718282611feb565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206146d1833981519152916005600160991b019163ee5b48eb91610a9e916004016141f6565b8115610ffb57610ff983826114af565b505b610857836123c3565b5f8061100f86612754565b905061101d85828686612801565b9150505b949350505050565b611034823383612c35565b5050565b5f805160206146f18339815191525f61105083611bcf565b90505f806110618360400151612222565b91509150806110c35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161042b565b5f828152600585016020526040812080546110dd90614049565b905011801561110f575060015f83815260078601602052604090205460ff16600581111561110d5761110d613ffa565b145b61112b5760405162461bcd60e51b815260040161042b90614399565b5f828152600585016020526040812061114391613d05565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206146f183398151915292919061123990614049565b905011801561126b575060015f83815260078301602052604090205460ff16600581111561126957611269613ffa565b145b6112875760405162461bcd60e51b815260040161042b90614399565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161081791906004016141f6565b5f805160206146d18339815191525f6112d884611bcf565b90505f806112e98360400151611db0565b50915091506112f882866120f4565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061132491613d05565b5f61132e836117c6565b9050816001600160401b031681606001516001600160401b031610156113665760405162461bcd60e51b815260040161042b90614280565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156113b85760405162461bcd60e51b815260040161042b906142c2565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff1660048111156113f2576113f2613ffa565b1461140f5760405162461bcd60e51b815260040161042b9061430b565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6910160405180910390a450505050505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114fa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152191908101906143eb565b91509150806115845760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161042b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115eb91906141df565b82511461164f5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161042b565b60208201516001600160a01b0316156116c55760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161042b565b5f806116d4846040015161300a565b915091508187146117415760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161042b565b9695505050505050565b5f8181525f805160206147318339815191526020526040812060020180545f805160206146f183398151915291600160a01b9091046001600160401b03169081906014611797836144bd565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061473183398151915290528390208351918201909352825491925f805160206146f183398151915292829060ff16600581111561184657611846613ffa565b600581111561185757611857613ffa565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061473183398151915260205260409020815181545f805160206146f18339815191529284929091829060ff1916600183600581111561190b5761190b613ffa565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a29576119e98160016144e2565b6119f4906008614382565b5081515f90839083908110611a0b57611a0b6144f5565b60200101906001600160f81b03191690815f1a9053506001016119d5565b505f5b6004811015611a8c57611a408160036144e2565b611a4b906008614382565b6001901c60f81b82611a5e836002614509565b81518110611a6e57611a6e6144f5565b60200101906001600160f81b03191690815f1a905350600101611a2c565b505f5b6020811015611aee57611aa381601f6144e2565b611aae906008614382565b86901c60f81b82611ac0836006614509565b81518110611ad057611ad06144f5565b60200101906001600160f81b03191690815f1a905350600101611a8f565b505f5b6008811015611b5957611b058160076144e2565b611b10906008614382565b6001600160401b038616901c60f81b82611b2b836026614509565b81518110611b3b57611b3b6144f5565b60200101906001600160f81b03191690815f1a905350600101611af1565b505f5b6008811015611bc457611b708160076144e2565b611b7b906008614382565b6001600160401b038516901c60f81b82611b9683602e614509565b81518110611ba657611ba66144f5565b60200101906001600160f81b03191690815f1a905350600101611b5c565b5090505b9392505050565b60408051606080820183525f8083526020830181905292820152905f805160206146f18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c44573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c6b91908101906143eb565b9150915080611cd25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161042b565b8254825114611d355760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161042b565b60208201516001600160a01b031615611da85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161042b565b509392505050565b5f805f8351603614611dd45760405162461bcd60e51b815260040161042b9061451c565b5f805b6002811015611e2357611deb8160016144e2565b611df6906008614382565b61ffff16868281518110611e0c57611e0c6144f5565b016020015160f81c901b9190911790600101611dd7565b5061ffff811615611e465760405162461bcd60e51b815260040161042b90614565565b5f805b6004811015611ea157611e5d8160036144e2565b611e68906008614382565b63ffffffff1687611e7a836002614509565b81518110611e8a57611e8a6144f5565b016020015160f81c901b9190911790600101611e49565b5063ffffffff8116600314611ec85760405162461bcd60e51b815260040161042b906145a8565b5f805b6020811015611f1d57611edf81601f6144e2565b611eea906008614382565b88611ef6836006614509565b81518110611f0657611f066144f5565b016020015160f81c901b9190911790600101611ecb565b505f805b6008811015611f7c57611f358160076144e2565b611f40906008614382565b6001600160401b031689611f55836026614509565b81518110611f6557611f656144f5565b016020015160f81c901b9190911790600101611f21565b505f805b6008811015611fdb57611f948160076144e2565b611f9f906008614382565b6001600160401b03168a611fb483602e614509565b81518110611fc457611fc46144f5565b016020015160f81c901b9190911790600101611f80565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206146d183398151915292919061204790614049565b905011801561208d575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff16600481111561208b5761208b613ffa565b145b6108575760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161042b565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206146d183398151915292919061215090614049565b9050118015612196575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff16600481111561219457612194613ffa565b145b6108575760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161042b565b6122106131e2565b6122198261322d565b61103481613273565b5f8082516027146122455760405162461bcd60e51b815260040161042b9061451c565b5f805b60028110156122945761225c8160016144e2565b612267906008614382565b61ffff1685828151811061227d5761227d6144f5565b016020015160f81c901b9190911790600101612248565b5061ffff8116156122b75760405162461bcd60e51b815260040161042b90614565565b5f805b6004811015612312576122ce8160036144e2565b6122d9906008614382565b63ffffffff16866122eb836002614509565b815181106122fb576122fb6144f5565b016020015160f81c901b91909117906001016122ba565b5063ffffffff81166002146123395760405162461bcd60e51b815260040161042b906145a8565b5f805b602081101561238e5761235081601f6144e2565b61235b906008614382565b87612367836006614509565b81518110612377576123776144f5565b016020015160f81c901b919091179060010161233c565b505f866026815181106123a3576123a36144f5565b016020015191976001600160f81b03199092161515965090945050505050565b5f8181525f805160206147318339815191526020526040808220815160e0810190925280545f805160206146f183398151915293929190829060ff16600581111561241057612410613ffa565b600581111561242157612421613ffa565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561249b5761249b613ffa565b146124f75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161042b565b60408101516001600160a01b0316336001600160a01b0316146125715760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161042b565b61257e8160800151613327565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156125c2576125c2613ffa565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f612676846126708161174b565b5f6119b0565b5f858152600685016020526040902090915061269282826140cc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126bf9085906004016141ad565b6020604051808303815f875af11580156126db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126ff91906141df565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146d18339815191528161276d846134c8565b90505f61277982610bc8565b83549091506001600160401b038216108015906127a357508260010154816001600160401b031611155b6110215760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161042b565b5f61280a6134fe565b5f805160206146f1833981519152426001600160401b03851611801561284457506001600160401b038416612842426202a300614509565b115b6128a65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161042b565b856128fd5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161042b565b5f8681526008820160205260409020541561296b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161042b565b82516030146129d25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161042b565b6129db85613327565b5f80612a226040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613535565b5f82815260058601602052604090209193509150612a4082826140cc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612a6d9085906004016141ad565b6020604051808303815f875af1158015612a89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aad91906141df565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612b2657612b26613ffa565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612bcf8361174b565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061102160015f8051602061471183398151915255565b612c3d6134fe565b5f612c4a6101d5836134c8565b90505f805160206146d18339815191525f612c64866117c6565b9050600281516005811115612c7b57612c7b613ffa565b14612cda5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161042b565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b031615612d735760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b606482015260840161042b565b612d7c83613327565b8281608001818151612d8e91906145ef565b6001600160401b0316905250612da486826118c1565b5f612dae8761174b565b90505f612dc0888385608001516119b0565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612df082826140cc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e1d9085906004016141ad565b6020604051808303815f875af1158015612e39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e5d91906141df565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff19166001836004811115612ede57612ede613ffa565b02179055506020820151815460408085015160608601516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0267ffffffffffffffff60481b199683166101000296909616610100600160881b03199095169490941794909417169190911783556080808501516001909401805460a0909601518416600160401b026001600160801b0319909616949093169390931793909317905585015190516001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b91612fe6918c918a906001600160401b0393841681529183166020830152909116604082015260600190565b60405180910390a450505050505061085760015f8051602061471183398151915255565b5f808251602e1461302d5760405162461bcd60e51b815260040161042b9061451c565b5f805b600281101561307c576130448160016144e2565b61304f906008614382565b61ffff16858281518110613065576130656144f5565b016020015160f81c901b9190911790600101613030565b5061ffff81161561309f5760405162461bcd60e51b815260040161042b90614565565b5f805b60048110156130fa576130b68160036144e2565b6130c1906008614382565b63ffffffff16866130d3836002614509565b815181106130e3576130e36144f5565b016020015160f81c901b91909117906001016130a2565b5063ffffffff81166004146131215760405162461bcd60e51b815260040161042b906145a8565b5f805b60208110156131765761313881601f6144e2565b613143906008614382565b8761314f836006614509565b8151811061315f5761315f6144f5565b016020015160f81c901b9190911790600101613124565b505f805b60088110156131d55761318e8160076144e2565b613199906008614382565b6001600160401b0316886131ae836026614509565b815181106131be576131be6144f5565b016020015160f81c901b919091179060010161317a565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661322b57604051631afcd79f60e31b815260040160405180910390fd5b565b6132356131e2565b61323e816138ed565b6132706060820135608083013561325b60c0850160a08601613e93565b61326b60e0860160c0870161460f565b61390e565b50565b61327b6131e2565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166133075760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161042b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146f18339815191529060ff165f03613365575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133ad90836144e2565b106133c9576001600160401b03841660408301528082526133e8565b83826040018181516133db91906145ef565b6001600160401b03169052505b5f8260200151836040015160646133ff919061462a565b6134099190614655565b600285015490915060ff90811690821611156134845760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161042b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610bd8827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613969565b5f8051602061471183398151915280546001190161352f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461359f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161042b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613616576135d68160016144e2565b6135e1906008614382565b5081515f908390839081106135f8576135f86144f5565b60200101906001600160f81b03191690815f1a9053506001016135c2565b505f5b60048110156136745761362d8160036144e2565b613638906008614382565b505f82613646836002614509565b81518110613656576136566144f5565b60200101906001600160f81b03191690815f1a905350600101613619565b505f5b60208110156136d15784518160208110613693576136936144f5565b1a60f81b826136a3836006614509565b815181106136b3576136b36144f5565b60200101906001600160f81b03191690815f1a905350600101613677565b505f5b602081101561373157846020015181602081106136f3576136f36144f5565b1a60f81b82613703836026614509565b81518110613713576137136144f5565b60200101906001600160f81b03191690815f1a9053506001016136d4565b505f5b60088110156137a5576137488160076144e2565b613753906008614382565b60ff1685604001516001600160401b0316901c60f81b828260466137779190614509565b81518110613787576137876144f5565b60200101906001600160f81b03191690815f1a905350600101613734565b505f5b603081101561381057846080015181815181106137c7576137c76144f5565b01602001516001600160f81b031916826137e283604e614509565b815181106137f2576137f26144f5565b60200101906001600160f81b03191690815f1a9053506001016137a8565b505f5b6008811015613882576138278160076144e2565b613832906008614382565b60608601516001600160401b0390811691161c60f81b8261385483607e614509565b81518110613864576138646144f5565b60200101906001600160f81b03191690815f1a905350600101613813565b50600281604051613893919061467a565b602060405180830381855afa1580156138ae573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138d191906141df565b94909350915050565b60015f8051602061471183398151915255565b6138f56131e2565b6138fd613acb565b613905613adb565b61327081613ae3565b6139166131e2565b5f5f805160206146d1833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139d391906141df565b90506139ea6001600160a01b038516333086613b4f565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a5291906141df565b9050818111613ab85760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161042b565b613ac282826144e2565b95945050505050565b613ad36131e2565b61322b613ba9565b61322b6131e2565b613aeb6131e2565b80355f805160206146f183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b356060830160408401614695565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610ade908590613bb1565b6138da6131e2565b5f613bc56001600160a01b03841683613c12565b905080515f14158015613be9575080806020019051810190613be791906146b5565b155b1561085757604051635274afe760e01b81526001600160a01b038416600482015260240161042b565b6060611bc883835f845f80856001600160a01b03168486604051613c36919061467a565b5f6040518083038185875af1925050503d805f8114613c70576040519150601f19603f3d011682016040523d82523d5f602084013e613c75565b606091505b5091509150611741868383606082613c9557613c9082613cdc565b611bc8565b8151158015613cac57506001600160a01b0384163b155b15613cd557604051639996b31560e01b81526001600160a01b038516600482015260240161042b565b5080611bc8565b805115613cec5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d1190614049565b5f825580601f10613d20575050565b601f0160209004905f5260205f209081019061327091905b80821115613d4b575f8155600101613d38565b5090565b8015158114613270575f80fd5b803563ffffffff81168114613d6f575f80fd5b919050565b5f805f60608486031215613d86575f80fd5b833592506020840135613d9881613d4f565b9150613da660408501613d5c565b90509250925092565b5f60208284031215613dbf575f80fd5b5035919050565b6001600160a01b0381168114613270575f80fd5b5f8060408385031215613deb575f80fd5b613df483613d5c565b91506020830135613e0481613dc6565b809150509250929050565b5f8060408385031215613e20575f80fd5b823591506020830135613e0481613dc6565b5f80828403610100811215613e45575f80fd5b60e0811215613e52575f80fd5b5082915060e0830135613e0481613dc6565b5f60208284031215613e74575f80fd5b611bc882613d5c565b80356001600160401b0381168114613d6f575f80fd5b5f60208284031215613ea3575f80fd5b611bc882613e7d565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613ee257613ee2613eac565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f1057613f10613eac565b604052919050565b5f6001600160401b03821115613f3057613f30613eac565b50601f01601f191660200190565b5f805f8060808587031215613f51575f80fd5b8435935060208501359250613f6860408601613e7d565b915060608501356001600160401b03811115613f82575f80fd5b8501601f81018713613f92575f80fd5b8035613fa5613fa082613f18565b613ee8565b818152886020838501011115613fb9575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613feb575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140425761404261400e565b5092915050565b600181811c9082168061405d57607f821691505b60208210810361407b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561085757805f5260205f20601f840160051c810160208510156140a65750805b601f840160051c820191505b818110156140c5575f81556001016140b2565b5050505050565b81516001600160401b038111156140e5576140e5613eac565b6140f9816140f38454614049565b84614081565b602080601f83116001811461412c575f84156141155750858301515b5f19600386901b1c1916600185901b178555614183565b5f85815260208120601f198616915b8281101561415a5788860151825594840194600190910190840161413b565b508582101561417757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156141a557818101518382015260200161418d565b50505f910152565b602081525f82518060208401526141cb81604085016020870161418b565b601f01601f19169190910160400192915050565b5f602082840312156141ef575f80fd5b5051919050565b5f60208083525f845461420881614049565b806020870152604060018084165f8114614229576001811461424557614272565b60ff19851660408a0152604084151560051b8a01019550614272565b895f5260205f205f5b858110156142695781548b820186015290830190880161424e565b8a016040019650505b509398975050505050505050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f8261437d5761437d61435b565b500490565b8082028115828204841417610bd857610bd861400e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613d6f81613d4f565b5f80604083850312156143fc575f80fd5b82516001600160401b0380821115614412575f80fd5b9084019060608287031215614425575f80fd5b61442d613ec0565b8251815260208084015161444081613dc6565b82820152604084015183811115614455575f80fd5b80850194505087601f850112614469575f80fd5b83519250614479613fa084613f18565b838152888285870101111561448c575f80fd5b61449b8483830184880161418b565b806040840152508195506144b08188016143e0565b9450505050509250929050565b5f6001600160401b038083168181036144d8576144d861400e565b6001019392505050565b81810381811115610bd857610bd861400e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610bd857610bd861400e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140425761404261400e565b5f6020828403121561461f575f80fd5b8135611bc881613dc6565b6001600160401b0381811683821602808216919082811461464d5761464d61400e565b505092915050565b5f6001600160401b038084168061466e5761466e61435b565b92169190910492915050565b5f825161468b81846020870161418b565b9190910192915050565b5f602082840312156146a5575f80fd5b813560ff81168114611bc8575f80fd5b5f602082840312156146c5575f80fd5b8151611bc881613d4f56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516147e13803806147e183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146948061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613cd0565b6102d6565b005b610128610138366004613d0b565b61071f565b61017b61014b366004613d0b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613d0b565b61087b565b6101286101af366004613d36565b6108e8565b6101c76101c2366004613d0b565b6109cc565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d73565b6109e2565b610128610200366004613d8c565b610d3e565b61017b610213366004613dca565b610ee3565b6101c7610226366004613d0b565b610efc565b610128610239366004613d0b565b610f10565b61012861024c366004613cd0565b610f7d565b61017b61025f366004613e75565b610f98565b610128610272366004613d8c565b610fbd565b61017b610285366004613f11565b611126565b610128610298366004613d73565b611139565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613d0b565b6112ed565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206146088339815191529184156103285761032582856113bc565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613f31565b600481111561036b5761036b613f31565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613f31565b146104565760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f61046084611658565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104ad576104ad613f31565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61057f856116d3565b905082606001516001600160401b031681608001516001600160401b0316116105f65760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161044d565b82606001518160800181815161060c9190613f59565b6001600160401b031690525061062285826117ce565b5f610632868484608001516118bd565b5f8b8152600589016020526040902090915061064e8282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061067b9085906004016140e4565b6020604051808303815f875af1158015610697573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106bb9190614116565b6080840151604080516001600160401b03928316815291871660208301524282820152519192508c9183918a917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a45050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061462883398151915292919061076790613f80565b9050118015610799575060035f83815260078301602052604090205460ff16600581111561079757610797613f31565b145b6107fd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161044d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610836919060040161412d565b6020604051808303815f875af1158015610852573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108769190614116565b505050565b61088481611ada565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614608833981519152916005600160991b019163ee5b48eb916108369160040161412d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610931575080546001600160401b03808416911610155b1561094f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561097a8484611bbf565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109dc64e8d4a51000836141cb565b92915050565b5f805160206146288339815191525f6109fa83611bd9565b90505f80610a0b8360400151611dba565b915091508015610a705760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044d565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610aa157610aa1613f31565b6005811115610ab257610ab2613f31565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610b2b57610b2b613f31565b1480610b495750600182516005811115610b4757610b47613f31565b145b610ba85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044d565b600382516005811115610bbd57610bbd613f31565b03610be457505f8381526006860160205260408120600491610bdf9190613c61565b610be8565b5060055b6020808301515f90815260088801909152604081205581816005811115610c1157610c11613f31565b90816005811115610c2457610c24613f31565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610c5857610c58613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610d0b57610d0b613f31565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206146088339815191525f610d5684611bd9565b90505f80610d678360400151611f5b565b5091509150610d7585612196565b5f8581526004850160205260408120610d8d91613c61565b5f610d97836116d3565b9050816001600160401b031681606001516001600160401b03161015610dcf5760405162461bcd60e51b815260040161044d906141de565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e145760405162461bcd60e51b815260040161044d90614220565b60015f87815260038701602052604090205460ff166004811115610e3a57610e3a613f31565b14610e575760405162461bcd60e51b815260040161044d90614269565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109dc6001600160401b03831664e8d4a510006142b9565b5f610f06826116d3565b6080015192915050565b610f1981612196565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614608833981519152916005600160991b019163ee5b48eb916108369160040161412d565b8115610f8f57610f8d83826113bc565b505b61087683612282565b5f80610fa386612613565b9050610fb1858286866126c0565b9150505b949350505050565b5f805160206146088339815191525f610fd584611bd9565b90505f80610fe68360400151611f5b565b5091509150610ff485611ada565b5f858152600585016020526040812061100c91613c61565b5f611016836116d3565b9050816001600160401b031681606001516001600160401b0316101561104e5760405162461bcd60e51b815260040161044d906141de565b5f8681526003808701602052604090912001546001600160401b038084169116111561108c5760405162461bcd60e51b815260040161044d90614220565b60035f87815260038701602052604090205460ff1660048111156110b2576110b2613f31565b146110cf5760405162461bcd60e51b815260040161044d90614269565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611132833384612af4565b9392505050565b5f805160206146288339815191525f61115183611bd9565b90505f806111628360400151611dba565b91509150806111c45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044d565b5f828152600585016020526040812080546111de90613f80565b9050118015611210575060015f83815260078601602052604090205460ff16600581111561120e5761120e613f31565b145b61122c5760405162461bcd60e51b815260040161044d906142d0565b5f828152600585016020526040812061124491613c61565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061462883398151915292919061133590613f80565b9050118015611367575060015f83815260078301602052604090205460ff16600581111561136557611365613f31565b145b6113835760405162461bcd60e51b815260040161044d906142d0565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610836919060040161412d565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611407573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261142e9190810190614322565b91509150806114915760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161044d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f89190614116565b82511461155c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161044d565b60208201516001600160a01b0316156115d25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161044d565b5f806115e18460400151612f60565b9150915081871461164e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161044d565b9695505050505050565b5f8181525f805160206146688339815191526020526040812060020180545f8051602061462883398151915291600160a01b9091046001600160401b031690819060146116a4836143f4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061466883398151915290528390208351918201909352825491925f8051602061462883398151915292829060ff16600581111561175357611753613f31565b600581111561176457611764613f31565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061466883398151915260205260409020815181545f805160206146288339815191529284929091829060ff1916600183600581111561181857611818613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611936576118f6816001614419565b6119019060086142b9565b5081515f908390839081106119185761191861442c565b60200101906001600160f81b03191690815f1a9053506001016118e2565b505f5b60048110156119995761194d816003614419565b6119589060086142b9565b6001901c60f81b8261196b836002614440565b8151811061197b5761197b61442c565b60200101906001600160f81b03191690815f1a905350600101611939565b505f5b60208110156119fb576119b081601f614419565b6119bb9060086142b9565b86901c60f81b826119cd836006614440565b815181106119dd576119dd61442c565b60200101906001600160f81b03191690815f1a90535060010161199c565b505f5b6008811015611a6657611a12816007614419565b611a1d9060086142b9565b6001600160401b038616901c60f81b82611a38836026614440565b81518110611a4857611a4861442c565b60200101906001600160f81b03191690815f1a9053506001016119fe565b505f5b6008811015611ad157611a7d816007614419565b611a889060086142b9565b6001600160401b038516901c60f81b82611aa383602e614440565b81518110611ab357611ab361442c565b60200101906001600160f81b03191690815f1a905350600101611a69565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614608833981519152929190611b2290613f80565b9050118015611b54575060035f83815260038301602052604090205460ff166004811115611b5257611b52613f31565b145b611bbb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161044d565b5050565b611bc7613138565b611bd082613183565b611bbb816131c9565b60408051606080820183525f8083526020830181905292820152905f805160206146288339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c4e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c759190810190614322565b9150915080611cdc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161044d565b8254825114611d3f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044d565b60208201516001600160a01b031615611db25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044d565b509392505050565b5f808251602714611ddd5760405162461bcd60e51b815260040161044d90614453565b5f805b6002811015611e2c57611df4816001614419565b611dff9060086142b9565b61ffff16858281518110611e1557611e1561442c565b016020015160f81c901b9190911790600101611de0565b5061ffff811615611e4f5760405162461bcd60e51b815260040161044d9061449c565b5f805b6004811015611eaa57611e66816003614419565b611e719060086142b9565b63ffffffff1686611e83836002614440565b81518110611e9357611e9361442c565b016020015160f81c901b9190911790600101611e52565b5063ffffffff8116600214611ed15760405162461bcd60e51b815260040161044d906144df565b5f805b6020811015611f2657611ee881601f614419565b611ef39060086142b9565b87611eff836006614440565b81518110611f0f57611f0f61442c565b016020015160f81c901b9190911790600101611ed4565b505f86602681518110611f3b57611f3b61442c565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611f7f5760405162461bcd60e51b815260040161044d90614453565b5f805b6002811015611fce57611f96816001614419565b611fa19060086142b9565b61ffff16868281518110611fb757611fb761442c565b016020015160f81c901b9190911790600101611f82565b5061ffff811615611ff15760405162461bcd60e51b815260040161044d9061449c565b5f805b600481101561204c57612008816003614419565b6120139060086142b9565b63ffffffff1687612025836002614440565b815181106120355761203561442c565b016020015160f81c901b9190911790600101611ff4565b5063ffffffff81166003146120735760405162461bcd60e51b815260040161044d906144df565b5f805b60208110156120c85761208a81601f614419565b6120959060086142b9565b886120a1836006614440565b815181106120b1576120b161442c565b016020015160f81c901b9190911790600101612076565b505f805b6008811015612127576120e0816007614419565b6120eb9060086142b9565b6001600160401b031689612100836026614440565b815181106121105761211061442c565b016020015160f81c901b91909117906001016120cc565b505f805b60088110156121865761213f816007614419565b61214a9060086142b9565b6001600160401b03168a61215f83602e614440565b8151811061216f5761216f61442c565b016020015160f81c901b919091179060010161212b565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206146088339815191529291906121de90613f80565b9050118015612210575060015f83815260038301602052604090205460ff16600481111561220e5761220e613f31565b145b611bbb5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161044d565b5f8181525f805160206146688339815191526020526040808220815160e0810190925280545f8051602061462883398151915293929190829060ff1660058111156122cf576122cf613f31565b60058111156122e0576122e0613f31565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561235a5761235a613f31565b146123b65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044d565b60408101516001600160a01b0316336001600160a01b0316146124305760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161044d565b61243d816080015161327d565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561248157612481613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125358461252f81611658565b5f6118bd565b5f85815260068501602052604090209091506125518282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061257e9085906004016140e4565b6020604051808303815f875af115801561259a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125be9190614116565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146088339815191528161262c8461341e565b90505f612638826109cc565b83549091506001600160401b0382161080159061266257508260010154816001600160401b031611155b610fb55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161044d565b5f6126c9613454565b5f80516020614628833981519152426001600160401b03851611801561270357506001600160401b038416612701426202a300614440565b115b6127655760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161044d565b856127bc5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044d565b5f8681526008820160205260409020541561282a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161044d565b82516030146128915760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044d565b61289a8561327d565b5f806128e16040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061348b565b5f828152600586016020526040902091935091506128ff8282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061292c9085906004016140e4565b6020604051808303815f875af1158015612948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296c9190614116565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156129e5576129e5613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612a8e83611658565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610fb560015f8051602061464883398151915255565b5f612afd613454565b5f612b0a6101c28461341e565b90505f805160206146088339815191525f612b24876116d3565b9050600281516005811115612b3b57612b3b613f31565b14612b9a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161044d565b8281608001818151612bac9190614526565b6001600160401b0316905250612bc287826117ce565b5f612bcc88611658565b90505f6002898984604051602001612c169392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f1981840301815290829052612c3091614546565b602060405180830381855afa158015612c4b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612c6e9190614116565b5f8181526003860160205260409020600201549091506001600160401b031615612cf45760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b606482015260840161044d565b612cfd8561327d565b5f612d0d8a8486608001516118bd565b5f8381526004870160205260409020909150612d298282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d569085906004016140e4565b6020604051808303815f875af1158015612d72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d969190614116565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290891660c085015260e090930183905286835260038a01909152902081518154829060ff19166001836004811115612e1e57612e1e613f31565b02179055506020828101518254610100600160a81b0319166101006001600160a01b0390921691909102178255604080840151600184015560608085015160028501805460808089015160a08a015160c08b01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909601516003909501805467ffffffffffffffff1916958216959095179094559389015181518c851681529084169281019290925291871691810191909152849183918e917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a450909550505050505061113260015f8051602061464883398151915255565b5f808251602e14612f835760405162461bcd60e51b815260040161044d90614453565b5f805b6002811015612fd257612f9a816001614419565b612fa59060086142b9565b61ffff16858281518110612fbb57612fbb61442c565b016020015160f81c901b9190911790600101612f86565b5061ffff811615612ff55760405162461bcd60e51b815260040161044d9061449c565b5f805b60048110156130505761300c816003614419565b6130179060086142b9565b63ffffffff1686613029836002614440565b815181106130395761303961442c565b016020015160f81c901b9190911790600101612ff8565b5063ffffffff81166004146130775760405162461bcd60e51b815260040161044d906144df565b5f805b60208110156130cc5761308e81601f614419565b6130999060086142b9565b876130a5836006614440565b815181106130b5576130b561442c565b016020015160f81c901b919091179060010161307a565b505f805b600881101561312b576130e4816007614419565b6130ef9060086142b9565b6001600160401b031688613104836026614440565b815181106131145761311461442c565b016020015160f81c901b91909117906001016130d0565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661318157604051631afcd79f60e31b815260040160405180910390fd5b565b61318b613138565b61319481613843565b6131c6606082013560808301356131b160c0850160a08601613dca565b6131c160e0860160c08701614561565b613864565b50565b6131d1613138565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661325d5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161044d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146288339815191529060ff165f036132bb575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133039083614419565b1061331f576001600160401b038416604083015280825261333e565b83826040018181516133319190614526565b6001600160401b03169052505b5f826020015183604001516064613355919061457c565b61335f91906145a7565b600285015490915060ff90811690821611156133da5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161044d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6109dc827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906138bf565b5f8051602061464883398151915280546001190161348557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134f55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561356c5761352c816001614419565b6135379060086142b9565b5081515f9083908390811061354e5761354e61442c565b60200101906001600160f81b03191690815f1a905350600101613518565b505f5b60048110156135ca57613583816003614419565b61358e9060086142b9565b505f8261359c836002614440565b815181106135ac576135ac61442c565b60200101906001600160f81b03191690815f1a90535060010161356f565b505f5b602081101561362757845181602081106135e9576135e961442c565b1a60f81b826135f9836006614440565b815181106136095761360961442c565b60200101906001600160f81b03191690815f1a9053506001016135cd565b505f5b602081101561368757846020015181602081106136495761364961442c565b1a60f81b82613659836026614440565b815181106136695761366961442c565b60200101906001600160f81b03191690815f1a90535060010161362a565b505f5b60088110156136fb5761369e816007614419565b6136a99060086142b9565b60ff1685604001516001600160401b0316901c60f81b828260466136cd9190614440565b815181106136dd576136dd61442c565b60200101906001600160f81b03191690815f1a90535060010161368a565b505f5b6030811015613766578460800151818151811061371d5761371d61442c565b01602001516001600160f81b0319168261373883604e614440565b815181106137485761374861442c565b60200101906001600160f81b03191690815f1a9053506001016136fe565b505f5b60088110156137d85761377d816007614419565b6137889060086142b9565b60608601516001600160401b0390811691161c60f81b826137aa83607e614440565b815181106137ba576137ba61442c565b60200101906001600160f81b03191690815f1a905350600101613769565b506002816040516137e99190614546565b602060405180830381855afa158015613804573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138279190614116565b94909350915050565b60015f8051602061464883398151915255565b61384b613138565b613853613a21565b61385b613a31565b6131c681613a39565b61386c613138565b5f5f80516020614608833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613905573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139299190614116565b90506139406001600160a01b038516333086613aa5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613984573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139a89190614116565b9050818111613a0e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161044d565b613a188282614419565b95945050505050565b613a29613138565b613181613b05565b613181613138565b613a41613138565b80355f8051602061462883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a8b60608301604084016145cc565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613aff908590613b0d565b50505050565b613830613138565b5f613b216001600160a01b03841683613b6e565b905080515f14158015613b45575080806020019051810190613b4391906145ec565b155b1561087657604051635274afe760e01b81526001600160a01b038416600482015260240161044d565b606061113283835f845f80856001600160a01b03168486604051613b929190614546565b5f6040518083038185875af1925050503d805f8114613bcc576040519150601f19603f3d011682016040523d82523d5f602084013e613bd1565b606091505b509150915061164e868383606082613bf157613bec82613c38565b611132565b8151158015613c0857506001600160a01b0384163b155b15613c3157604051639996b31560e01b81526001600160a01b038516600482015260240161044d565b5080611132565b805115613c485780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c6d90613f80565b5f825580601f10613c7c575050565b601f0160209004905f5260205f20908101906131c691905b80821115613ca7575f8155600101613c94565b5090565b80151581146131c6575f80fd5b803563ffffffff81168114613ccb575f80fd5b919050565b5f805f60608486031215613ce2575f80fd5b833592506020840135613cf481613cab565b9150613d0260408501613cb8565b90509250925092565b5f60208284031215613d1b575f80fd5b5035919050565b6001600160a01b03811681146131c6575f80fd5b5f80828403610100811215613d49575f80fd5b60e0811215613d56575f80fd5b5082915060e0830135613d6881613d22565b809150509250929050565b5f60208284031215613d83575f80fd5b61113282613cb8565b5f8060408385031215613d9d575f80fd5b613da683613cb8565b946020939093013593505050565b80356001600160401b0381168114613ccb575f80fd5b5f60208284031215613dda575f80fd5b61113282613db4565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e1957613e19613de3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e4757613e47613de3565b604052919050565b5f6001600160401b03821115613e6757613e67613de3565b50601f01601f191660200190565b5f805f8060808587031215613e88575f80fd5b8435935060208501359250613e9f60408601613db4565b915060608501356001600160401b03811115613eb9575f80fd5b8501601f81018713613ec9575f80fd5b8035613edc613ed782613e4f565b613e1f565b818152886020838501011115613ef0575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613f22575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f7957613f79613f45565b5092915050565b600181811c90821680613f9457607f821691505b602082108103613fb257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561087657805f5260205f20601f840160051c81016020851015613fdd5750805b601f840160051c820191505b81811015613ffc575f8155600101613fe9565b5050505050565b81516001600160401b0381111561401c5761401c613de3565b6140308161402a8454613f80565b84613fb8565b602080601f831160018114614063575f841561404c5750858301515b5f19600386901b1c1916600185901b1785556140ba565b5f85815260208120601f198616915b8281101561409157888601518255948401946001909101908401614072565b50858210156140ae57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140dc5781810151838201526020016140c4565b50505f910152565b602081525f82518060208401526141028160408501602087016140c2565b601f01601f19169190910160400192915050565b5f60208284031215614126575f80fd5b5051919050565b5f60208083525f845461413f81613f80565b806020870152604060018084165f8114614160576001811461417c576141a9565b60ff19851660408a0152604084151560051b8a010195506141a9565b895f5260205f205f5b858110156141a05781548b8201860152908301908801614185565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826141d9576141d96141b7565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b80820281158282048414176109dc576109dc613f45565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613ccb81613cab565b5f8060408385031215614333575f80fd5b82516001600160401b0380821115614349575f80fd5b908401906060828703121561435c575f80fd5b614364613df7565b8251815260208084015161437781613d22565b8282015260408401518381111561438c575f80fd5b80850194505087601f8501126143a0575f80fd5b835192506143b0613ed784613e4f565b83815288828587010111156143c3575f80fd5b6143d2848383018488016140c2565b806040840152508195506143e7818801614317565b9450505050509250929050565b5f6001600160401b0380831681810361440f5761440f613f45565b6001019392505050565b818103818111156109dc576109dc613f45565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109dc576109dc613f45565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f7957613f79613f45565b5f82516145578184602087016140c2565b9190910192915050565b5f60208284031215614571575f80fd5b813561113281613d22565b6001600160401b0381811683821602808216919082811461459f5761459f613f45565b505092915050565b5f6001600160401b03808416806145c0576145c06141b7565b92169190910492915050565b5f602082840312156145dc575f80fd5b813560ff81168114611132575f80fd5b5f602082840312156145fc575f80fd5b815161113281613cab56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -373,46 +373,46 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WeightTo return _ERC20TokenStakingManager.Contract.WeightToValue(&_ERC20TokenStakingManager.CallOpts, weight) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegator) +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegationID) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. // -// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegator) +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegationID) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. // -// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. // -// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) } // CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. @@ -480,44 +480,44 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns() +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns(bytes32) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { return _ERC20TokenStakingManager.contract.Transact(opts, "initializeDelegatorRegistration", validationID, delegationAmount) } // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns() +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns(bytes32) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeDelegatorRegistration(validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegationAmount) } // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns() +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns(bytes32) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeDelegatorRegistration(validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegationAmount) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeEndDelegation", validationID, includeUptimeProof, messageIndex) +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeEndDelegation", delegationID, includeUptimeProof, messageIndex) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeEndDelegation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeEndDelegation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) } // InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. @@ -562,46 +562,46 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, blsPublicKey) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. // -// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "resendDelegatorRegistration", validationID, delegator) +// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendDelegatorRegistration(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "resendDelegatorRegistration", delegationID) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. // -// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendDelegatorRegistration(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendDelegatorRegistration(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, delegationID) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. // -// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendDelegatorRegistration(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendDelegatorRegistration(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, delegationID) } -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. // -// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendEndDelegation(opts *bind.TransactOpts, validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "resendEndDelegation", validationID, delegator) +// Solidity: function resendEndDelegation(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendEndDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "resendEndDelegation", delegationID) } -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. // -// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendEndDelegation(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendEndDelegation(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendEndDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) } -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. // -// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendEndDelegation(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendEndDelegation(&_ERC20TokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendEndDelegation(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendEndDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) } // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. @@ -716,55 +716,55 @@ func (it *ERC20TokenStakingManagerDelegationEndedIterator) Close() error { // ERC20TokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegationEnded struct { ValidationID [32]byte - Delegator common.Address + DelegationID [32]byte Nonce uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { +// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegationEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, validationID [][32]byte, delegator []common.Address, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } @@ -796,9 +796,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegati }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. +// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { event := new(ERC20TokenStakingManagerDelegationEnded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { @@ -879,17 +879,17 @@ func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Close() error { type ERC20TokenStakingManagerDelegatorAdded struct { ValidationID [32]byte SetWeightMessageID [32]byte - Delegator common.Address + DelegationID [32]byte DelegatorWeight uint64 ValidatorWeight uint64 Nonce uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegatorAddedIterator, error) { +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*ERC20TokenStakingManagerDelegatorAddedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -899,22 +899,22 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorAddedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil } -// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -924,12 +924,12 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } @@ -961,9 +961,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorAdded is a log parse operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. +// ParseDelegatorAdded is a log parse operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*ERC20TokenStakingManagerDelegatorAdded, error) { event := new(ERC20TokenStakingManagerDelegatorAdded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { @@ -1043,56 +1043,56 @@ func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Close() error { // ERC20TokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegatorRegistered struct { ValidationID [32]byte - Delegator common.Address + DelegationID [32]byte Nonce uint64 StartTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorRegisteredIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil } -// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegator []common.Address, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } @@ -1124,9 +1124,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorRegistered is a log parse operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. +// ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*ERC20TokenStakingManagerDelegatorRegistered, error) { event := new(ERC20TokenStakingManagerDelegatorRegistered) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { @@ -1207,17 +1207,17 @@ func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Close() e type ERC20TokenStakingManagerDelegatorRemovalInitialized struct { ValidationID [32]byte SetWeightMessageID [32]byte - Delegator common.Address + DelegationID [32]byte ValidatorWeight uint64 Nonce uint64 EndTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1227,22 +1227,22 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1252,12 +1252,12 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } @@ -1289,9 +1289,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerDelegatorRemovalInitialized, error) { event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 210c8c23e..ddee60b49 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"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\":\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516144e93803806144e983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61439c8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063b771b3bc11610062578063b771b3bc146102f3578063bee0a03f14610325578063c599e24f14610344578063d61bed7414610357578063f40797d714610376575f80fd5b806366435abf146102775780636a7e3d831461029657806376f78621146102b5578063a3a65e48146102d4575f80fd5b80630b77f693116100d85780630b77f693146101865780630cdd0985146101a55780632e2194d814610202578063467ef06f146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630915204e14610167575b5f80fd5b348015610113575f80fd5b506101276101223660046139ee565b610389565b005b348015610134575f80fd5b50610127610143366004613a29565b61046b565b348015610153575f80fd5b50610127610162366004613a64565b610895565b348015610172575f80fd5b50610127610181366004613a8f565b6109f1565b348015610191575f80fd5b506101276101a0366004613ac4565b610bb1565b3480156101b0575f80fd5b506101ef6101bf366004613a64565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b34801561020d575f80fd5b5061022161021c366004613a64565b610c79565b6040516001600160401b0390911681526020016101f9565b348015610244575f80fd5b50610127610253366004613ae7565b610c8f565b348015610263575f80fd5b506101ef610272366004613b1d565b610feb565b348015610282575f80fd5b50610221610291366004613a64565b611004565b3480156102a1575f80fd5b506101276102b0366004613ac4565b611018565b3480156102c0575f80fd5b506101276102cf366004613a29565b61109a565b3480156102df575f80fd5b506101276102ee366004613ae7565b6110b5565b3480156102fe575f80fd5b5061030d6005600160991b0181565b6040516001600160a01b0390911681526020016101f9565b348015610330575f80fd5b5061012761033f366004613a64565b61126e565b610127610352366004613a64565b61133d565b348015610362575f80fd5b50610127610371366004613a8f565b61134b565b6101ef610384366004613bc8565b61153a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a8361155c565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f821561047f5761047c848361156d565b90505b5f8481527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f8051602061431083398151915293929190829060ff1660048111156104ea576104ea613c5a565b60048111156104fb576104fb613c5a565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a090910152905060028151600481111561056557610565613c5a565b146105c95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f6105d387611809565b9050600382819052506001600160401b034281166060840152811660a08301525f8781526003840160205260408120839161060b3390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff1916600183600481111561064157610641613c5a565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f6106eb88611884565b905082602001516001600160401b031681608001516001600160401b0316116107625760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105c0565b8260200151816080018181516107789190613c82565b6001600160401b031690525061078e888261197f565b5f61079e89848460800151611a6e565b5f8a8152600587016020908152604080832033845290915290209091506107c58282613d26565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906107f2908590600401613e07565b6020604051808303815f875af115801561080e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108329190613e39565b6080840151604080516001600160401b0392831681529187166020830152428282015251919250339183918d917fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde9181900360600190a450505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206143308339815191529291906108dd90613ca9565b905011801561090f575060035f83815260078301602052604090205460ff16600581111561090d5761090d613c5a565b145b6109735760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105c0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109ac9190600401613e50565b6020604051808303815f875af11580156109c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ec9190613e39565b505050565b5f805160206143108339815191525f610a0984611c8b565b90505f80610a1a8360400151611e6c565b5091509150610a2982866120a7565b5f82815260058501602090815260408083206001600160a01b03891684529091528120610a55916139a4565b5f610a5f83611884565b9050816001600160401b031681606001516001600160401b03161015610a975760405162461bcd60e51b81526004016105c090613eda565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b909204161115610af05760405162461bcd60e51b81526004016105c090613f1c565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff166004811115610b2a57610b2a613c5a565b14610b475760405162461bcd60e51b81526004016105c090613f65565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b610bbb82826121b0565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614310833981519152916005600160991b019163ee5b48eb91610c3391600401613e50565b6020604051808303815f875af1158015610c4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c739190613e39565b50505050565b5f610c8964e8d4a5100083613fc9565b92915050565b5f805160206143308339815191525f610ca783611c8b565b90505f80610cb883604001516122c4565b915091508015610d1d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105c0565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610d4e57610d4e613c5a565b6005811115610d5f57610d5f613c5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610dd857610dd8613c5a565b1480610df65750600182516005811115610df457610df4613c5a565b145b610e555760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105c0565b600382516005811115610e6a57610e6a613c5a565b03610e9157505f8381526006860160205260408120600491610e8c91906139a4565b610e95565b5060055b6020808301515f90815260088801909152604081205581816005811115610ebe57610ebe613c5a565b90816005811115610ed157610ed1613c5a565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610f0557610f05613c5a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610fb857610fb8613c5a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f610c896001600160401b03831664e8d4a51000613fdc565b5f61100e82611884565b6080015192915050565b61102282826120a7565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614310833981519152916005600160991b019163ee5b48eb91610c3391600401613e50565b81156110ac576110aa838261156d565b505b6109ec83612465565b5f805160206143308339815191525f6110cd83611c8b565b90505f806110de83604001516122c4565b91509150806111405760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105c0565b5f8281526005850160205260408120805461115a90613ca9565b905011801561118c575060015f83815260078601602052604090205460ff16600581111561118a5761118a613c5a565b145b6111a85760405162461bcd60e51b81526004016105c090613ff3565b5f82815260058501602052604081206111c0916139a4565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206143308339815191529291906112b690613ca9565b90501180156112e8575060015f83815260078301602052604090205460ff1660058111156112e6576112e6613c5a565b145b6113045760405162461bcd60e51b81526004016105c090613ff3565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109ac9190600401613e50565b6113488133346127f6565b50565b5f805160206143108339815191525f61136384611c8b565b90505f806113748360400151611e6c565b509150915061138382866121b0565b5f82815260048501602090815260408083206001600160a01b038916845290915281206113af916139a4565b5f6113b983611884565b9050816001600160401b031681606001516001600160401b031610156113f15760405162461bcd60e51b81526004016105c090613eda565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156114435760405162461bcd60e51b81526004016105c090613f1c565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561147d5761147d613c5a565b1461149a5760405162461bcd60e51b81526004016105c090613f65565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6910160405180910390a450505050505050565b5f8061154534612bc8565b905061155385828686612c72565b95945050505050565b6115646130a6565b611348816130f1565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115b8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115df9190810190614045565b91509150806116425760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611685573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116a99190613e39565b82511461170d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105c0565b60208201516001600160a01b0316156117835760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105c0565b5f806117928460400151613134565b915091508187146117ff5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105c0565b9695505050505050565b5f8181525f805160206143708339815191526020526040812060020180545f8051602061433083398151915291600160a01b9091046001600160401b0316908190601461185583614117565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061437083398151915290528390208351918201909352825491925f8051602061433083398151915292829060ff16600581111561190457611904613c5a565b600581111561191557611915613c5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061437083398151915260205260409020815181545f805160206143308339815191529284929091829060ff191660018360058111156119c9576119c9613c5a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ae757611aa781600161413c565b611ab2906008613fdc565b5081515f90839083908110611ac957611ac961414f565b60200101906001600160f81b03191690815f1a905350600101611a93565b505f5b6004811015611b4a57611afe81600361413c565b611b09906008613fdc565b6001901c60f81b82611b1c836002614163565b81518110611b2c57611b2c61414f565b60200101906001600160f81b03191690815f1a905350600101611aea565b505f5b6020811015611bac57611b6181601f61413c565b611b6c906008613fdc565b86901c60f81b82611b7e836006614163565b81518110611b8e57611b8e61414f565b60200101906001600160f81b03191690815f1a905350600101611b4d565b505f5b6008811015611c1757611bc381600761413c565b611bce906008613fdc565b6001600160401b038616901c60f81b82611be9836026614163565b81518110611bf957611bf961414f565b60200101906001600160f81b03191690815f1a905350600101611baf565b505f5b6008811015611c8257611c2e81600761413c565b611c39906008613fdc565b6001600160401b038516901c60f81b82611c5483602e614163565b81518110611c6457611c6461414f565b60200101906001600160f81b03191690815f1a905350600101611c1a565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f805160206143308339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d00573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d279190810190614045565b9150915080611d8e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105c0565b8254825114611df15760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105c0565b60208201516001600160a01b031615611e645760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105c0565b509392505050565b5f805f8351603614611e905760405162461bcd60e51b81526004016105c090614176565b5f805b6002811015611edf57611ea781600161413c565b611eb2906008613fdc565b61ffff16868281518110611ec857611ec861414f565b016020015160f81c901b9190911790600101611e93565b5061ffff811615611f025760405162461bcd60e51b81526004016105c0906141bf565b5f805b6004811015611f5d57611f1981600361413c565b611f24906008613fdc565b63ffffffff1687611f36836002614163565b81518110611f4657611f4661414f565b016020015160f81c901b9190911790600101611f05565b5063ffffffff8116600314611f845760405162461bcd60e51b81526004016105c090614202565b5f805b6020811015611fd957611f9b81601f61413c565b611fa6906008613fdc565b88611fb2836006614163565b81518110611fc257611fc261414f565b016020015160f81c901b9190911790600101611f87565b505f805b600881101561203857611ff181600761413c565b611ffc906008613fdc565b6001600160401b031689612011836026614163565b815181106120215761202161414f565b016020015160f81c901b9190911790600101611fdd565b505f805b60088110156120975761205081600761413c565b61205b906008613fdc565b6001600160401b03168a61207083602e614163565b815181106120805761208061414f565b016020015160f81c901b919091179060010161203c565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f8051602061431083398151915292919061210390613ca9565b9050118015612149575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff16600481111561214757612147613c5a565b145b6109ec5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016105c0565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f8051602061431083398151915292919061220c90613ca9565b9050118015612252575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff16600481111561225057612250613c5a565b145b6109ec5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016105c0565b5f8082516027146122e75760405162461bcd60e51b81526004016105c090614176565b5f805b6002811015612336576122fe81600161413c565b612309906008613fdc565b61ffff1685828151811061231f5761231f61414f565b016020015160f81c901b91909117906001016122ea565b5061ffff8116156123595760405162461bcd60e51b81526004016105c0906141bf565b5f805b60048110156123b45761237081600361413c565b61237b906008613fdc565b63ffffffff168661238d836002614163565b8151811061239d5761239d61414f565b016020015160f81c901b919091179060010161235c565b5063ffffffff81166002146123db5760405162461bcd60e51b81526004016105c090614202565b5f805b6020811015612430576123f281601f61413c565b6123fd906008613fdc565b87612409836006614163565b815181106124195761241961414f565b016020015160f81c901b91909117906001016123de565b505f866026815181106124455761244561414f565b016020015191976001600160f81b03199092161515965090945050505050565b5f8181525f805160206143708339815191526020526040808220815160e0810190925280545f8051602061433083398151915293929190829060ff1660058111156124b2576124b2613c5a565b60058111156124c3576124c3613c5a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561253d5761253d613c5a565b146125995760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105c0565b60408101516001600160a01b0316336001600160a01b0316146126135760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105c0565b612620816080015161330c565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561266457612664613c5a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6127188461271281611809565b5f611a6e565b5f85815260068501602052604090209091506127348282613d26565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612761908590600401613e07565b6020604051808303815f875af115801561277d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a19190613e39565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b6127fe6134ad565b5f61280882610c79565b90505f805160206143108339815191525f61282286611884565b905060028151600581111561283957612839613c5a565b146128985760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105c0565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b0316156129315760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b60648201526084016105c0565b61293a8361330c565b828160800181815161294c9190614249565b6001600160401b0316905250612962868261197f565b5f61296c87611809565b90505f61297e88838560800151611a6e565b5f89815260048601602090815260408083206001600160a01b038c16845290915290209091506129ae8282613d26565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129db908590600401613e07565b6020604051808303815f875af11580156129f7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a1b9190613e39565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff19166001836004811115612a9c57612a9c613c5a565b02179055506020820151815460408085015160608601516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0267ffffffffffffffff60481b199683166101000296909616610100600160881b03199095169490941794909417169190911783556080808501516001909401805460a0909601518416600160401b026001600160801b0319909616949093169390931793909317905585015190516001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b91612ba4918c918a906001600160401b0393841681529183166020830152909116604082015260600190565b60405180910390a45050505050506109ec60015f8051602061435083398151915255565b5f5f805160206143108339815191528282612be282610c79565b83549091506001600160401b03821610801590612c0c57508260010154816001600160401b031611155b612c6a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105c0565b949350505050565b5f612c7b6134ad565b5f80516020614330833981519152426001600160401b038516118015612cb557506001600160401b038416612cb3426202a300614163565b115b612d175760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105c0565b85612d6e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105c0565b5f86815260088201602052604090205415612ddc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105c0565b8251603014612e435760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105c0565b612e4c8561330c565b5f80612e936040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134f7565b5f82815260058601602052604090209193509150612eb18282613d26565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ede908590600401613e07565b6020604051808303815f875af1158015612efa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f1e9190613e39565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612f9757612f97613c5a565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561304083611809565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c6a60015f8051602061435083398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130ef57604051631afcd79f60e31b815260040160405180910390fd5b565b6130f96130a6565b6131028161389c565b6113486060820135608083013561311f60c0850160a08601613b1d565b61312f60e0860160c08701614269565b6138bd565b5f808251602e146131575760405162461bcd60e51b81526004016105c090614176565b5f805b60028110156131a65761316e81600161413c565b613179906008613fdc565b61ffff1685828151811061318f5761318f61414f565b016020015160f81c901b919091179060010161315a565b5061ffff8116156131c95760405162461bcd60e51b81526004016105c0906141bf565b5f805b6004811015613224576131e081600361413c565b6131eb906008613fdc565b63ffffffff16866131fd836002614163565b8151811061320d5761320d61414f565b016020015160f81c901b91909117906001016131cc565b5063ffffffff811660041461324b5760405162461bcd60e51b81526004016105c090614202565b5f805b60208110156132a05761326281601f61413c565b61326d906008613fdc565b87613279836006614163565b815181106132895761328961414f565b016020015160f81c901b919091179060010161324e565b505f805b60088110156132ff576132b881600761413c565b6132c3906008613fdc565b6001600160401b0316886132d8836026614163565b815181106132e8576132e861414f565b016020015160f81c901b91909117906001016132a4565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206143308339815191529060ff165f0361334a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613392908361413c565b106133ae576001600160401b03841660408301528082526133cd565b83826040018181516133c09190614249565b6001600160401b03169052505b5f8260200151836040015160646133e49190614284565b6133ee91906142af565b600285015490915060ff90811690821611156134695760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105c0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206143508339815191528054600119016134de57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061435083398151915255565b5f60608260800151516030146135615760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135d85761359881600161413c565b6135a3906008613fdc565b5081515f908390839081106135ba576135ba61414f565b60200101906001600160f81b03191690815f1a905350600101613584565b505f5b6004811015613636576135ef81600361413c565b6135fa906008613fdc565b505f82613608836002614163565b815181106136185761361861414f565b60200101906001600160f81b03191690815f1a9053506001016135db565b505f5b602081101561369357845181602081106136555761365561414f565b1a60f81b82613665836006614163565b815181106136755761367561414f565b60200101906001600160f81b03191690815f1a905350600101613639565b505f5b60208110156136f357846020015181602081106136b5576136b561414f565b1a60f81b826136c5836026614163565b815181106136d5576136d561414f565b60200101906001600160f81b03191690815f1a905350600101613696565b505f5b60088110156137675761370a81600761413c565b613715906008613fdc565b60ff1685604001516001600160401b0316901c60f81b828260466137399190614163565b815181106137495761374961414f565b60200101906001600160f81b03191690815f1a9053506001016136f6565b505f5b60308110156137d257846080015181815181106137895761378961414f565b01602001516001600160f81b031916826137a483604e614163565b815181106137b4576137b461414f565b60200101906001600160f81b03191690815f1a90535060010161376a565b505f5b6008811015613844576137e981600761413c565b6137f4906008613fdc565b60608601516001600160401b0390811691161c60f81b8261381683607e614163565b815181106138265761382661414f565b60200101906001600160f81b03191690815f1a9053506001016137d5565b5060028160405161385591906142d4565b602060405180830381855afa158015613870573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138939190613e39565b94909350915050565b6138a46130a6565b6138ac613918565b6138b4613928565b61134881613930565b6138c56130a6565b5f5f80516020614310833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6139206130a6565b6130ef61399c565b6130ef6130a6565b6139386130a6565b80355f8051602061433083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561398260608301604084016142ef565b600291909101805460ff191660ff90921691909117905550565b6134e46130a6565b5080546139b090613ca9565b5f825580601f106139bf575050565b601f0160209004905f5260205f209081019061134891905b808211156139ea575f81556001016139d7565b5090565b5f60e082840312156139fe575f80fd5b50919050565b8015158114611348575f80fd5b803563ffffffff81168114613a24575f80fd5b919050565b5f805f60608486031215613a3b575f80fd5b833592506020840135613a4d81613a04565b9150613a5b60408501613a11565b90509250925092565b5f60208284031215613a74575f80fd5b5035919050565b6001600160a01b0381168114611348575f80fd5b5f8060408385031215613aa0575f80fd5b613aa983613a11565b91506020830135613ab981613a7b565b809150509250929050565b5f8060408385031215613ad5575f80fd5b823591506020830135613ab981613a7b565b5f60208284031215613af7575f80fd5b613b0082613a11565b9392505050565b80356001600160401b0381168114613a24575f80fd5b5f60208284031215613b2d575f80fd5b613b0082613b07565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b6c57613b6c613b36565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b9a57613b9a613b36565b604052919050565b5f6001600160401b03821115613bba57613bba613b36565b50601f01601f191660200190565b5f805f60608486031215613bda575f80fd5b83359250613bea60208501613b07565b915060408401356001600160401b03811115613c04575f80fd5b8401601f81018613613c14575f80fd5b8035613c27613c2282613ba2565b613b72565b818152876020838501011115613c3b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ca257613ca2613c6e565b5092915050565b600181811c90821680613cbd57607f821691505b6020821081036139fe57634e487b7160e01b5f52602260045260245ffd5b601f8211156109ec57805f5260205f20601f840160051c81016020851015613d005750805b601f840160051c820191505b81811015613d1f575f8155600101613d0c565b5050505050565b81516001600160401b03811115613d3f57613d3f613b36565b613d5381613d4d8454613ca9565b84613cdb565b602080601f831160018114613d86575f8415613d6f5750858301515b5f19600386901b1c1916600185901b178555613ddd565b5f85815260208120601f198616915b82811015613db457888601518255948401946001909101908401613d95565b5085821015613dd157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613dff578181015183820152602001613de7565b50505f910152565b602081525f8251806020840152613e25816040850160208701613de5565b601f01601f19169190910160400192915050565b5f60208284031215613e49575f80fd5b5051919050565b5f60208083525f8454613e6281613ca9565b806020870152604060018084165f8114613e835760018114613e9f57613ecc565b60ff19851660408a0152604084151560051b8a01019550613ecc565b895f5260205f205f5b85811015613ec35781548b8201860152908301908801613ea8565b8a016040019650505b509398975050505050505050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b5f82613fd757613fd7613fb5565b500490565b8082028115828204841417610c8957610c89613c6e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613a2481613a04565b5f8060408385031215614056575f80fd5b82516001600160401b038082111561406c575f80fd5b908401906060828703121561407f575f80fd5b614087613b4a565b8251815260208084015161409a81613a7b565b828201526040840151838111156140af575f80fd5b80850194505087601f8501126140c3575f80fd5b835192506140d3613c2284613ba2565b83815288828587010111156140e6575f80fd5b6140f584838301848801613de5565b8060408401525081955061410a81880161403a565b9450505050509250929050565b5f6001600160401b0380831681810361413257614132613c6e565b6001019392505050565b81810381811115610c8957610c89613c6e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610c8957610c89613c6e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ca257613ca2613c6e565b5f60208284031215614279575f80fd5b8135613b0081613a7b565b6001600160401b038181168382160280821691908281146142a7576142a7613c6e565b505092915050565b5f6001600160401b03808416806142c8576142c8613fb5565b92169190910492915050565b5f82516142e5818460208701613de5565b9190910192915050565b5f602082840312156142ff575f80fd5b813560ff81168114613b00575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161440938038061440983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142bc8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613945565b610389565b005b348015610134575f80fd5b50610127610143366004613980565b61046b565b348015610153575f80fd5b506101276101623660046139bb565b6108b4565b348015610172575f80fd5b506101b16101813660046139bb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de3660046139bb565b610a10565b3480156101ee575f80fd5b506102026101fd3660046139bb565b610a7d565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b506101276102343660046139d2565b610a93565b348015610244575f80fd5b506101276102533660046139eb565b610def565b348015610263575f80fd5b506101b1610272366004613a29565b610f94565b348015610282575f80fd5b506102026102913660046139bb565b610fad565b3480156102a1575f80fd5b506101276102b03660046139bb565b610fc1565b3480156102c0575f80fd5b506101276102cf366004613980565b61102e565b3480156102df575f80fd5b506101276102ee3660046139eb565b611049565b3480156102fe575f80fd5b5061012761030d3660046139d2565b6111b2565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e3660046139bb565b611366565b6101b16103713660046139bb565b611435565b6101b1610384366004613ad4565b611441565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611465565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206142308339815191529184156104bd576104ba8285611479565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b66565b600481111561050057610500613b66565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613b66565b146105eb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f6105f584611715565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561064257610642613b66565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61071485611790565b905082606001516001600160401b031681608001516001600160401b03161161078b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105e2565b8260600151816080018181516107a19190613b8e565b6001600160401b03169052506107b7858261188b565b5f6107c78684846080015161197a565b5f8b815260058901602052604090209091506107e38282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610810908590600401613d13565b6020604051808303815f875af115801561082c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108509190613d45565b6080840151604080516001600160401b03928316815291871660208301524282820152519192508c9183918a917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a45050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206142508339815191529291906108fc90613bb5565b905011801561092e575060035f83815260078301602052604090205460ff16600581111561092c5761092c613b66565b145b6109925760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105e2565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109cb9190600401613d5c565b6020604051808303815f875af11580156109e7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0b9190613d45565b505050565b610a1981611b97565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614230833981519152916005600160991b019163ee5b48eb916109cb91600401613d5c565b5f610a8d64e8d4a5100083613dfa565b92915050565b5f805160206142508339815191525f610aab83611c7c565b90505f80610abc8360400151611e5d565b915091508015610b215760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105e2565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610b5257610b52613b66565b6005811115610b6357610b63613b66565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610bdc57610bdc613b66565b1480610bfa5750600182516005811115610bf857610bf8613b66565b145b610c595760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105e2565b600382516005811115610c6e57610c6e613b66565b03610c9557505f8381526006860160205260408120600491610c9091906138fb565b610c99565b5060055b6020808301515f90815260088801909152604081205581816005811115610cc257610cc2613b66565b90816005811115610cd557610cd5613b66565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d0957610d09613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610dbc57610dbc613b66565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206142308339815191525f610e0784611c7c565b90505f80610e188360400151611ffe565b5091509150610e2685612239565b5f8581526004850160205260408120610e3e916138fb565b5f610e4883611790565b9050816001600160401b031681606001516001600160401b03161015610e805760405162461bcd60e51b81526004016105e290613e0d565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610ec55760405162461bcd60e51b81526004016105e290613e4f565b60015f87815260038701602052604090205460ff166004811115610eeb57610eeb613b66565b14610f085760405162461bcd60e51b81526004016105e290613e98565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a8d6001600160401b03831664e8d4a51000613ee8565b5f610fb782611790565b6080015192915050565b610fca81612239565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614230833981519152916005600160991b019163ee5b48eb916109cb91600401613d5c565b81156110405761103e8382611479565b505b610a0b83612325565b5f805160206142308339815191525f61106184611c7c565b90505f806110728360400151611ffe565b509150915061108085611b97565b5f8581526005850160205260408120611098916138fb565b5f6110a283611790565b9050816001600160401b031681606001516001600160401b031610156110da5760405162461bcd60e51b81526004016105e290613e0d565b5f8681526003808701602052604090912001546001600160401b03808416911611156111185760405162461bcd60e51b81526004016105e290613e4f565b60035f87815260038701602052604090205460ff16600481111561113e5761113e613b66565b1461115b5760405162461bcd60e51b81526004016105e290613e98565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142508339815191525f6111ca83611c7c565b90505f806111db8360400151611e5d565b915091508061123d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105e2565b5f8281526005850160205260408120805461125790613bb5565b9050118015611289575060015f83815260078601602052604090205460ff16600581111561128757611287613b66565b145b6112a55760405162461bcd60e51b81526004016105e290613eff565b5f82815260058501602052604081206112bd916138fb565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142508339815191529291906113ae90613bb5565b90501180156113e0575060015f83815260078301602052604090205460ff1660058111156113de576113de613b66565b145b6113fc5760405162461bcd60e51b81526004016105e290613eff565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109cb9190600401613d5c565b5f610a8d8233346126b6565b5f8061144c34612b1f565b905061145a85828686612bc9565b9150505b9392505050565b61146d612ffd565b61147681613048565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114eb9190810190613f65565b915091508061154e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105e2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611591573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b59190613d45565b8251146116195760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105e2565b60208201516001600160a01b03161561168f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105e2565b5f8061169e846040015161308b565b9150915081871461170b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105e2565b9695505050505050565b5f8181525f805160206142908339815191526020526040812060020180545f8051602061425083398151915291600160a01b9091046001600160401b0316908190601461176183614037565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061429083398151915290528390208351918201909352825491925f8051602061425083398151915292829060ff16600581111561181057611810613b66565b600581111561182157611821613b66565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061429083398151915260205260409020815181545f805160206142508339815191529284929091829060ff191660018360058111156118d5576118d5613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119f3576119b381600161405c565b6119be906008613ee8565b5081515f908390839081106119d5576119d561406f565b60200101906001600160f81b03191690815f1a90535060010161199f565b505f5b6004811015611a5657611a0a81600361405c565b611a15906008613ee8565b6001901c60f81b82611a28836002614083565b81518110611a3857611a3861406f565b60200101906001600160f81b03191690815f1a9053506001016119f6565b505f5b6020811015611ab857611a6d81601f61405c565b611a78906008613ee8565b86901c60f81b82611a8a836006614083565b81518110611a9a57611a9a61406f565b60200101906001600160f81b03191690815f1a905350600101611a59565b505f5b6008811015611b2357611acf81600761405c565b611ada906008613ee8565b6001600160401b038616901c60f81b82611af5836026614083565b81518110611b0557611b0561406f565b60200101906001600160f81b03191690815f1a905350600101611abb565b505f5b6008811015611b8e57611b3a81600761405c565b611b45906008613ee8565b6001600160401b038516901c60f81b82611b6083602e614083565b81518110611b7057611b7061406f565b60200101906001600160f81b03191690815f1a905350600101611b26565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614230833981519152929190611bdf90613bb5565b9050118015611c11575060035f83815260038301602052604090205460ff166004811115611c0f57611c0f613b66565b145b611c785760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016105e2565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206142508339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611cf1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d189190810190613f65565b9150915080611d7f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105e2565b8254825114611de25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105e2565b60208201516001600160a01b031615611e555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105e2565b509392505050565b5f808251602714611e805760405162461bcd60e51b81526004016105e290614096565b5f805b6002811015611ecf57611e9781600161405c565b611ea2906008613ee8565b61ffff16858281518110611eb857611eb861406f565b016020015160f81c901b9190911790600101611e83565b5061ffff811615611ef25760405162461bcd60e51b81526004016105e2906140df565b5f805b6004811015611f4d57611f0981600361405c565b611f14906008613ee8565b63ffffffff1686611f26836002614083565b81518110611f3657611f3661406f565b016020015160f81c901b9190911790600101611ef5565b5063ffffffff8116600214611f745760405162461bcd60e51b81526004016105e290614122565b5f805b6020811015611fc957611f8b81601f61405c565b611f96906008613ee8565b87611fa2836006614083565b81518110611fb257611fb261406f565b016020015160f81c901b9190911790600101611f77565b505f86602681518110611fde57611fde61406f565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120225760405162461bcd60e51b81526004016105e290614096565b5f805b60028110156120715761203981600161405c565b612044906008613ee8565b61ffff1686828151811061205a5761205a61406f565b016020015160f81c901b9190911790600101612025565b5061ffff8116156120945760405162461bcd60e51b81526004016105e2906140df565b5f805b60048110156120ef576120ab81600361405c565b6120b6906008613ee8565b63ffffffff16876120c8836002614083565b815181106120d8576120d861406f565b016020015160f81c901b9190911790600101612097565b5063ffffffff81166003146121165760405162461bcd60e51b81526004016105e290614122565b5f805b602081101561216b5761212d81601f61405c565b612138906008613ee8565b88612144836006614083565b815181106121545761215461406f565b016020015160f81c901b9190911790600101612119565b505f805b60088110156121ca5761218381600761405c565b61218e906008613ee8565b6001600160401b0316896121a3836026614083565b815181106121b3576121b361406f565b016020015160f81c901b919091179060010161216f565b505f805b6008811015612229576121e281600761405c565b6121ed906008613ee8565b6001600160401b03168a61220283602e614083565b815181106122125761221261406f565b016020015160f81c901b91909117906001016121ce565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061423083398151915292919061228190613bb5565b90501180156122b3575060015f83815260038301602052604090205460ff1660048111156122b1576122b1613b66565b145b611c785760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016105e2565b5f8181525f805160206142908339815191526020526040808220815160e0810190925280545f8051602061425083398151915293929190829060ff16600581111561237257612372613b66565b600581111561238357612383613b66565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123fd576123fd613b66565b146124595760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105e2565b60408101516001600160a01b0316336001600160a01b0316146124d35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105e2565b6124e08160800151613263565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561252457612524613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125d8846125d281611715565b5f61197a565b5f85815260068501602052604090209091506125f48282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612621908590600401613d13565b6020604051808303815f875af115801561263d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126619190613d45565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126bf613404565b5f6126c983610a7d565b90505f805160206142308339815191525f6126e387611790565b90506002815160058111156126fa576126fa613b66565b146127595760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105e2565b828160800181815161276b9190614169565b6001600160401b0316905250612781878261188b565b5f61278b88611715565b90505f60028989846040516020016127d59392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f19818403018152908290526127ef91614189565b602060405180830381855afa15801561280a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061282d9190613d45565b5f8181526003860160205260409020600201549091506001600160401b0316156128b35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b60648201526084016105e2565b6128bc85613263565b5f6128cc8a84866080015161197a565b5f83815260048701602052604090209091506128e88282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612915908590600401613d13565b6020604051808303815f875af1158015612931573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129559190613d45565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290891660c085015260e090930183905286835260038a01909152902081518154829060ff191660018360048111156129dd576129dd613b66565b02179055506020828101518254610100600160a81b0319166101006001600160a01b0390921691909102178255604080840151600184015560608085015160028501805460808089015160a08a015160c08b01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909601516003909501805467ffffffffffffffff1916958216959095179094559389015181518c851681529084169281019290925291871691810191909152849183918e917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a450909550505050505061145e60015f8051602061427083398151915255565b5f5f805160206142308339815191528282612b3982610a7d565b83549091506001600160401b03821610801590612b6357508260010154816001600160401b031611155b612bc15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105e2565b949350505050565b5f612bd2613404565b5f80516020614250833981519152426001600160401b038516118015612c0c57506001600160401b038416612c0a426202a300614083565b115b612c6e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105e2565b85612cc55760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105e2565b5f86815260088201602052604090205415612d335760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105e2565b8251603014612d9a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105e2565b612da385613263565b5f80612dea6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061344e565b5f82815260058601602052604090209193509150612e088282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e35908590600401613d13565b6020604051808303815f875af1158015612e51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e759190613d45565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612eee57612eee613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612f9783611715565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612bc160015f8051602061427083398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661304657604051631afcd79f60e31b815260040160405180910390fd5b565b613050612ffd565b613059816137f3565b6114766060820135608083013561307660c0850160a08601613a29565b61308660e0860160c087016141a4565b613814565b5f808251602e146130ae5760405162461bcd60e51b81526004016105e290614096565b5f805b60028110156130fd576130c581600161405c565b6130d0906008613ee8565b61ffff168582815181106130e6576130e661406f565b016020015160f81c901b91909117906001016130b1565b5061ffff8116156131205760405162461bcd60e51b81526004016105e2906140df565b5f805b600481101561317b5761313781600361405c565b613142906008613ee8565b63ffffffff1686613154836002614083565b815181106131645761316461406f565b016020015160f81c901b9190911790600101613123565b5063ffffffff81166004146131a25760405162461bcd60e51b81526004016105e290614122565b5f805b60208110156131f7576131b981601f61405c565b6131c4906008613ee8565b876131d0836006614083565b815181106131e0576131e061406f565b016020015160f81c901b91909117906001016131a5565b505f805b60088110156132565761320f81600761405c565b61321a906008613ee8565b6001600160401b03168861322f836026614083565b8151811061323f5761323f61406f565b016020015160f81c901b91909117906001016131fb565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142508339815191529060ff165f036132a1575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132e9908361405c565b10613305576001600160401b0384166040830152808252613324565b83826040018181516133179190614169565b6001600160401b03169052505b5f82602001518360400151606461333b91906141bf565b61334591906141ea565b600285015490915060ff90811690821611156133c05760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105e2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061427083398151915280546001190161343557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061427083398151915255565b5f60608260800151516030146134b85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105e2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561352f576134ef81600161405c565b6134fa906008613ee8565b5081515f908390839081106135115761351161406f565b60200101906001600160f81b03191690815f1a9053506001016134db565b505f5b600481101561358d5761354681600361405c565b613551906008613ee8565b505f8261355f836002614083565b8151811061356f5761356f61406f565b60200101906001600160f81b03191690815f1a905350600101613532565b505f5b60208110156135ea57845181602081106135ac576135ac61406f565b1a60f81b826135bc836006614083565b815181106135cc576135cc61406f565b60200101906001600160f81b03191690815f1a905350600101613590565b505f5b602081101561364a578460200151816020811061360c5761360c61406f565b1a60f81b8261361c836026614083565b8151811061362c5761362c61406f565b60200101906001600160f81b03191690815f1a9053506001016135ed565b505f5b60088110156136be5761366181600761405c565b61366c906008613ee8565b60ff1685604001516001600160401b0316901c60f81b828260466136909190614083565b815181106136a0576136a061406f565b60200101906001600160f81b03191690815f1a90535060010161364d565b505f5b603081101561372957846080015181815181106136e0576136e061406f565b01602001516001600160f81b031916826136fb83604e614083565b8151811061370b5761370b61406f565b60200101906001600160f81b03191690815f1a9053506001016136c1565b505f5b600881101561379b5761374081600761405c565b61374b906008613ee8565b60608601516001600160401b0390811691161c60f81b8261376d83607e614083565b8151811061377d5761377d61406f565b60200101906001600160f81b03191690815f1a90535060010161372c565b506002816040516137ac9190614189565b602060405180830381855afa1580156137c7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137ea9190613d45565b94909350915050565b6137fb612ffd565b61380361386f565b61380b61387f565b61147681613887565b61381c612ffd565b5f5f80516020614230833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613877612ffd565b6130466138f3565b613046612ffd565b61388f612ffd565b80355f8051602061425083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138d9606083016040840161420f565b600291909101805460ff191660ff90921691909117905550565b61343b612ffd565b50805461390790613bb5565b5f825580601f10613916575050565b601f0160209004905f5260205f209081019061147691905b80821115613941575f815560010161392e565b5090565b5f60e08284031215613955575f80fd5b50919050565b8015158114611476575f80fd5b803563ffffffff8116811461397b575f80fd5b919050565b5f805f60608486031215613992575f80fd5b8335925060208401356139a48161395b565b91506139b260408501613968565b90509250925092565b5f602082840312156139cb575f80fd5b5035919050565b5f602082840312156139e2575f80fd5b61145e82613968565b5f80604083850312156139fc575f80fd5b613a0583613968565b946020939093013593505050565b80356001600160401b038116811461397b575f80fd5b5f60208284031215613a39575f80fd5b61145e82613a13565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a7857613a78613a42565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613aa657613aa6613a42565b604052919050565b5f6001600160401b03821115613ac657613ac6613a42565b50601f01601f191660200190565b5f805f60608486031215613ae6575f80fd5b83359250613af660208501613a13565b915060408401356001600160401b03811115613b10575f80fd5b8401601f81018613613b20575f80fd5b8035613b33613b2e82613aae565b613a7e565b818152876020838501011115613b47575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613bae57613bae613b7a565b5092915050565b600181811c90821680613bc957607f821691505b60208210810361395557634e487b7160e01b5f52602260045260245ffd5b601f821115610a0b57805f5260205f20601f840160051c81016020851015613c0c5750805b601f840160051c820191505b81811015613c2b575f8155600101613c18565b5050505050565b81516001600160401b03811115613c4b57613c4b613a42565b613c5f81613c598454613bb5565b84613be7565b602080601f831160018114613c92575f8415613c7b5750858301515b5f19600386901b1c1916600185901b178555613ce9565b5f85815260208120601f198616915b82811015613cc057888601518255948401946001909101908401613ca1565b5085821015613cdd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613d0b578181015183820152602001613cf3565b50505f910152565b602081525f8251806020840152613d31816040850160208701613cf1565b601f01601f19169190910160400192915050565b5f60208284031215613d55575f80fd5b5051919050565b5f60208083525f8454613d6e81613bb5565b806020870152604060018084165f8114613d8f5760018114613dab57613dd8565b60ff19851660408a0152604084151560051b8a01019550613dd8565b895f5260205f205f5b85811015613dcf5781548b8201860152908301908801613db4565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613e0857613e08613de6565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b8082028115828204841417610a8d57610a8d613b7a565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611476575f80fd5b805161397b8161395b565b5f8060408385031215613f76575f80fd5b82516001600160401b0380821115613f8c575f80fd5b9084019060608287031215613f9f575f80fd5b613fa7613a56565b82518152602080840151613fba81613f46565b82820152604084015183811115613fcf575f80fd5b80850194505087601f850112613fe3575f80fd5b83519250613ff3613b2e84613aae565b8381528882858701011115614006575f80fd5b61401584838301848801613cf1565b8060408401525081955061402a818801613f5a565b9450505050509250929050565b5f6001600160401b0380831681810361405257614052613b7a565b6001019392505050565b81810381811115610a8d57610a8d613b7a565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a8d57610a8d613b7a565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613bae57613bae613b7a565b5f825161419a818460208701613cf1565b9190910192915050565b5f602082840312156141b4575f80fd5b813561145e81613f46565b6001600160401b038181168382160280821691908281146141e2576141e2613b7a565b505092915050565b5f6001600160401b038084168061420357614203613de6565b92169190910492915050565b5f6020828403121561421f575f80fd5b813560ff8116811461145e575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -373,46 +373,46 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) Weight return _NativeTokenStakingManager.Contract.WeightToValue(&_NativeTokenStakingManager.CallOpts, weight) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegator) +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegationID) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) } -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0xd61bed74. +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. // -// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegator) +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegationID) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. // -// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) } -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x0915204e. +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. // -// Solidity: function completeEndDelegation(uint32 messageIndex, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegator) +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) } // CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. @@ -480,44 +480,44 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns() +// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { return _NativeTokenStakingManager.contract.Transact(opts, "initializeDelegatorRegistration", validationID) } // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns() +// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeDelegatorRegistration(validationID [32]byte) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.InitializeDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID) } // InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. // -// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns() +// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeDelegatorRegistration(validationID [32]byte) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.InitializeDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeEndDelegation", validationID, includeUptimeProof, messageIndex) +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeEndDelegation", delegationID, includeUptimeProof, messageIndex) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeEndDelegation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) } // InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. // -// Solidity: function initializeEndDelegation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeEndDelegation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) } // InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. @@ -562,46 +562,46 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, blsPublicKey) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. // -// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "resendDelegatorRegistration", validationID, delegator) +// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendDelegatorRegistration(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "resendDelegatorRegistration", delegationID) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. // -// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendDelegatorRegistration(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendDelegatorRegistration(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, delegationID) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x0b77f693. +// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. // -// Solidity: function resendDelegatorRegistration(bytes32 validationID, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendDelegatorRegistration(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendDelegatorRegistration(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, delegationID) } -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. // -// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendEndDelegation(opts *bind.TransactOpts, validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "resendEndDelegation", validationID, delegator) +// Solidity: function resendEndDelegation(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendEndDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "resendEndDelegation", delegationID) } -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. // -// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendEndDelegation(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendEndDelegation(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendEndDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) } -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x6a7e3d83. +// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. // -// Solidity: function resendEndDelegation(bytes32 validationID, address delegator) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendEndDelegation(validationID [32]byte, delegator common.Address) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendEndDelegation(&_NativeTokenStakingManager.TransactOpts, validationID, delegator) +// Solidity: function resendEndDelegation(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendEndDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) } // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. @@ -716,55 +716,55 @@ func (it *NativeTokenStakingManagerDelegationEndedIterator) Close() error { // NativeTokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegationEnded struct { ValidationID [32]byte - Delegator common.Address + DelegationID [32]byte Nonce uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { +// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegationEndedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, validationID [][32]byte, delegator []common.Address, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } @@ -796,9 +796,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd. +// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { event := new(NativeTokenStakingManagerDelegationEnded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { @@ -879,17 +879,17 @@ func (it *NativeTokenStakingManagerDelegatorAddedIterator) Close() error { type NativeTokenStakingManagerDelegatorAdded struct { ValidationID [32]byte SetWeightMessageID [32]byte - Delegator common.Address + DelegationID [32]byte DelegatorWeight uint64 ValidatorWeight uint64 Nonce uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegatorAddedIterator, error) { +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*NativeTokenStakingManagerDelegatorAddedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -899,22 +899,22 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorAddedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil } -// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -924,12 +924,12 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } @@ -961,9 +961,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorAdded is a log parse operation binding the contract event 0xeea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b. +// ParseDelegatorAdded is a log parse operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*NativeTokenStakingManagerDelegatorAdded, error) { event := new(NativeTokenStakingManagerDelegatorAdded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { @@ -1043,56 +1043,56 @@ func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Close() error { // NativeTokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegatorRegistered struct { ValidationID [32]byte - Delegator common.Address + DelegationID [32]byte Nonce uint64 StartTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegator []common.Address, nonce []uint64) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorRegisteredIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil } -// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegator []common.Address, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegatorRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) if err != nil { return nil, err } @@ -1124,9 +1124,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorRegistered is a log parse operation binding the contract event 0xd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6. +// ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, address indexed delegator, uint64 indexed nonce, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*NativeTokenStakingManagerDelegatorRegistered, error) { event := new(NativeTokenStakingManagerDelegatorRegistered) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { @@ -1207,17 +1207,17 @@ func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Close() type NativeTokenStakingManagerDelegatorRemovalInitialized struct { ValidationID [32]byte SetWeightMessageID [32]byte - Delegator common.Address + DelegationID [32]byte ValidatorWeight uint64 Nonce uint64 EndTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1227,22 +1227,22 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegator []common.Address) (event.Subscription, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1252,12 +1252,12 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega for _, setWeightMessageIDItem := range setWeightMessageID { setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) } - var delegatorRule []interface{} - for _, delegatorItem := range delegator { - delegatorRule = append(delegatorRule, delegatorItem) + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegatorRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) if err != nil { return nil, err } @@ -1289,9 +1289,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0xadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, address indexed delegator, uint64 validatorWeight, uint64 nonce, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerDelegatorRemovalInitialized, error) { event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index e93333437..c0c1f2e59 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -66,7 +66,11 @@ 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. */ - function initializeDelegatorRegistration(bytes32 validationID) external payable returns (bytes32) { + function initializeDelegatorRegistration(bytes32 validationID) + external + payable + returns (bytes32) + { return _initializeDelegatorRegistration(validationID, _msgSender(), msg.value); } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index aa3d6d85d..1e19b1611 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -31,11 +31,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager /// @notice Maps the validationID to a mapping of delegator address to delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; /// @notice Maps the validationID to a mapping of delegator address to pending register delegator messages. - mapping(bytes32 delegationID => bytes) - _pendingRegisterDelegatorMessages; + mapping(bytes32 delegationID => bytes) _pendingRegisterDelegatorMessages; /// @notice Maps the validationID to a mapping of delegator address to pending end delegator messages. - mapping(bytes32 delegationID => bytes) - _pendingEndDelegatorMessages; + mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; } // solhint-enable private-vars-leading-underscore @@ -330,9 +328,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager emit DelegationEnded(validationID, delegationID, nonce); } - function _checkPendingEndDelegatorMessage( - bytes32 delegationID - ) private view { + function _checkPendingEndDelegatorMessage(bytes32 delegationID) private view { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); require( $._pendingEndDelegatorMessages[delegationID].length > 0 @@ -341,9 +337,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ); } - function _checkPendingRegisterDelegatorMessages( - bytes32 delegationID - ) private view { + function _checkPendingRegisterDelegatorMessages(bytes32 delegationID) private view { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); require( $._pendingRegisterDelegatorMessages[delegationID].length > 0 diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index 432f2ae01..2d59cfb83 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -21,5 +21,8 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { bytes memory blsPublicKey ) external returns (bytes32 validationID); - function initializeDelegatorRegistration(bytes32 validationID, uint256 stakeAmount) external returns (bytes32); + function initializeDelegatorRegistration( + bytes32 validationID, + uint256 stakeAmount + ) external returns (bytes32); } diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index de26398f1..947d146bc 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -20,5 +20,8 @@ interface INativeTokenStakingManager is IPoSValidatorManager { bytes memory blsPublicKey ) external payable returns (bytes32 validationID); - function initializeDelegatorRegistration(bytes32 validationID) external payable returns (bytes32); + function initializeDelegatorRegistration(bytes32 validationID) + external + payable + returns (bytes32); } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 3d549da29..fcb2292d7 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -53,7 +53,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { bytes32 validationID, address delegator, uint64 weight - ) internal virtual override returns (bytes32){ + ) internal virtual override returns (bytes32) { uint256 value = app.weightToValue(weight); vm.prank(delegator); vm.deal(delegator, value); diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index be1d98c02..1607c81b3 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -236,7 +236,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedNonce: 1 }); address delegator2 = address(0x5678567856785678567856785678567856785678); - bytes32 delegationID_2 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -256,7 +256,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); vm.expectRevert("PoSValidatorManager: nonce does not match"); - posValidatorManager.completeDelegatorRegistration(0, delegationID_2); + posValidatorManager.completeDelegatorRegistration(0, delegationID2); } function testCompleteDelegatorRegistrationImplicitNonce() public { @@ -270,7 +270,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Initialize two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - bytes32 delegationID_1 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -291,7 +291,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Mark delegator1 as registered by delivering the weight update from nonce 2 (delegator 2's nonce) _setUpCompleteDelegatorRegistration( validationID, - delegationID_1, + delegationID1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 2 @@ -322,14 +322,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); - _setUpInitializeEndDelegation( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - delegationID, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - DEFAULT_WEIGHT, - 2 - ); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); } function testResendEndDelegation() public { @@ -356,14 +356,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); - _setUpInitializeEndDelegation( - validationID, - DEFAULT_DELEGATOR_ADDRESS, - delegationID, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - DEFAULT_WEIGHT, - 2 - ); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); @@ -402,10 +402,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 }); - _setUpCompleteEndDelegation( - validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2 - ); + _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2); } + function testCompleteEndDelegationWrongNonce() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -417,7 +416,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Register two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - bytes32 delegationID_1 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -427,13 +426,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegationID_1, + delegationID1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); address delegator2 = address(0x5678567856785678567856785678567856785678); - bytes32 delegationID_2 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -444,29 +443,29 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegationID_2, + delegationID2, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 2 ); // Initialize end delegation for both delegators - _setUpInitializeEndDelegation( - validationID, - delegator1, - delegationID_1, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 3 - ); - _setUpInitializeEndDelegation( - validationID, - delegator2, - delegationID_2, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, - DEFAULT_WEIGHT, - 4 - ); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: delegator1, + delegationID: delegationID1, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 3 + }); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: delegator2, + delegationID: delegationID2, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 4 + }); // Complete ending delegator2 with delegator1's nonce // Note that ending delegator1 with delegator2's nonce is valid @@ -477,7 +476,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); vm.expectRevert("PoSValidatorManager: nonce does not match"); - posValidatorManager.completeEndDelegation(0, delegationID_2); + posValidatorManager.completeEndDelegation(0, delegationID2); } function testCompleteEndDelegationImplicitNonce() public { @@ -491,7 +490,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Register two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - bytes32 delegationID_1 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -501,13 +500,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegationID_1, + delegationID1, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 1 ); address delegator2 = address(0x5678567856785678567856785678567856785678); - bytes32 delegationID_2 =_setUpInitializeDelegatorRegistration({ + bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegator: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, @@ -518,32 +517,32 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpCompleteDelegatorRegistration( validationID, - delegationID_2, + delegationID2, DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, 2 ); // Initialize end delegation for both delegators - _setUpInitializeEndDelegation( - validationID, - delegator1, - delegationID_1, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 3 - ); - _setUpInitializeEndDelegation( - validationID, - delegator2, - delegationID_2, - DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, - DEFAULT_WEIGHT, - 4 - ); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: delegator1, + delegationID: delegationID1, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 3 + }); + _setUpInitializeEndDelegation({ + validationID: validationID, + delegator: delegator2, + delegationID: delegationID2, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 4 + }); // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) - _setUpCompleteEndDelegation(validationID, delegationID_1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); + _setUpCompleteEndDelegation(validationID, delegationID1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); } function testValueToWeight() public view { From 9f07cc946b546b2da7d81f5576505af22f8f958b Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 5 Sep 2024 10:40:06 -0400 Subject: [PATCH 196/545] Test invalid churn --- contracts/staking/PoSValidatorManager.sol | 5 +- .../interfaces/IPoSValidatorManager.sol | 2 +- .../tests/ERC20TokenStakingManagerTests.t.sol | 11 +++++ .../NativeTokenStakingManagerTests.t.sol | 11 +++++ .../tests/PoSValidatorManagerTests.t.sol | 47 +++++++++++++++++-- .../staking/tests/ValidatorManagerTests.t.sol | 37 --------------- tests/utils/staking.go | 4 +- 7 files changed, 72 insertions(+), 45 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 53451a9ec..427568dd7 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -165,7 +165,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager */ function _checkAndUpdateChurnTracker(uint64 amount) private { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - if ($._maximumChurnPercentage == 0) { + if ($._maximumChurnPercentage == 0 || $._totalWeight == 0) { return; } @@ -178,6 +178,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager if (currentTime - churnTracker.startedAt >= $._churnPeriodSeconds) { churnTracker.churnAmount = amount; churnTracker.startedAt = currentTime; + churnTracker.initialWeight = $._totalWeight; } else { churnTracker.churnAmount += amount; } @@ -185,7 +186,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint8 churnPercentage = uint8((churnTracker.churnAmount * 100) / churnTracker.initialWeight); require( churnPercentage <= $._maximumChurnPercentage, - "ValidatorManager: Maximum hourly churn rate exceeded" + "PoSValidatorManager: maximum hourly churn rate exceeded" ); $._churnTracker = churnTracker; } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 3c7f48342..79b09b0cd 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -21,7 +21,7 @@ struct PoSValidatorManagerSettings { struct ValidatorChurnPeriod { uint256 startedAt; - uint64 initialWeight; + uint256 initialWeight; uint64 churnAmount; } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 51d202e73..1b76ebd7b 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -58,6 +58,17 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ); } + function _initializeValidatorRegistrationWithValue( + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature, + uint256 value + ) internal virtual override returns (bytes32) { + return app.initializeValidatorRegistration( + value, nodeID, registrationExpiry, signature + ); + } + function _beforeSend(uint64 weight) internal override { // ERC20 tokens need to be pre-approved token.safeIncreaseAllowance(address(app), app.weightToValue(weight)); diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 875e4a500..e18a1633d 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -51,6 +51,17 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ); } + function _initializeValidatorRegistrationWithValue( + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature, + uint256 value + ) internal virtual override returns (bytes32) { + return app.initializeValidatorRegistration{value: value}( + nodeID, registrationExpiry, signature + ); + } + function _beforeSend(uint64 weight) internal override { // Native tokens no need pre approve } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index a8b6cc203..4fb898016 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -18,12 +18,15 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { PoSValidatorManager public posValidatorManager; + // Used to create unique validator IDs in {registerValidators} + uint64 public validatorCounter = 0; + event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); - function testRegisterManyValidators() public { - for (uint64 i = 1; i <= 10; i++) { + function registerValidators(uint64 n) public { + for (uint64 i = validatorCounter; validatorCounter <= i + n; validatorCounter++) { _setUpCompleteValidatorRegistration({ - nodeID: sha256(new bytes(i)), + nodeID: sha256(new bytes(validatorCounter)), subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, @@ -33,6 +36,37 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } } + function testInvalidChurnRegistration() public { + // First registration should work + _setUpCompleteValidatorRegistration({ + nodeID: sha256(new bytes(1)), + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_CHURN_TRACKER_START_TIME + 1 days, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_CHURN_TRACKER_START_TIME - 1 + }); + + vm.warp(DEFAULT_CHURN_TRACKER_START_TIME + 1); + + bytes32 nodeID = sha256(new bytes(2)); + (, bytes memory registerSubnetValidatorMessage) = ValidatorMessages + .packRegisterSubnetValidatorMessage( + ValidatorMessages.ValidationPeriod({ + nodeID: nodeID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_CHURN_TRACKER_START_TIME + 1 days, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }) + ); + _beforeSend(DEFAULT_WEIGHT); + + uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); + vm.expectRevert(_formatErrorMessage("maximum hourly churn rate exceeded")); + _initializeValidatorRegistrationWithValue(nodeID, DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value); + } + function testInitializeEndValidationWithUptimeProof() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -185,4 +219,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { return abi.encodePacked("PoSValidatorManager: ", errorMessage); } + + function _initializeValidatorRegistrationWithValue( + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory blsPublicKey, + uint256 value + ) internal virtual returns (bytes32); } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 46e1c6e26..f8a2052e7 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -199,42 +199,6 @@ abstract contract ValidatorManagerTest is Test { validatorManager.completeEndValidation(0); } - function _setUpInitializeValidatorChurn( - bytes32 nodeID, - bytes32 subnetID, - uint64 weight, - uint64 registrationExpiry, - bytes memory blsPublicKey - ) internal returns (bytes32 validationID) { - (validationID,) = ValidatorMessages.packRegisterSubnetValidatorMessage( - ValidatorMessages.ValidationPeriod({ - nodeID: nodeID, - subnetID: subnetID, - weight: weight, - registrationExpiry: registrationExpiry, - blsPublicKey: blsPublicKey - }) - ); - (, bytes memory registerSubnetValidatorMessage) = ValidatorMessages - .packRegisterSubnetValidatorMessage( - ValidatorMessages.ValidationPeriod({ - subnetID: subnetID, - nodeID: nodeID, - weight: weight, - registrationExpiry: registrationExpiry, - blsPublicKey: blsPublicKey - }) - ); - vm.warp(registrationExpiry - 1); - _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); - - _beforeSend(weight); - vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidationPeriodCreated(validationID, nodeID, bytes32(0), weight, registrationExpiry); - - _initializeValidatorRegistration(nodeID, registrationExpiry, blsPublicKey, weight); - } - function _setUpInitializeValidatorRegistration( bytes32 nodeID, bytes32 subnetID, @@ -261,7 +225,6 @@ abstract contract ValidatorManagerTest is Test { blsPublicKey: blsPublicKey }) ); - vm.warp(registrationExpiry - 1); _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); _beforeSend(weight); diff --git a/tests/utils/staking.go b/tests/utils/staking.go index d32a48c04..aaa0bd1d3 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -74,8 +74,8 @@ func DeployAndInitializeNativeTokenStakingManager( ChurnTrackerStartTime: big.NewInt(0), ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(0), - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeAmount: big.NewInt(1e6), + MaximumStakeAmount: big.NewInt(10e6), MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), RewardCalculator: common.Address{}, }, From 2eb14fb41c62176f2fa1a6dd309b8acaa7eeb961 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 09:52:47 -0500 Subject: [PATCH 197/545] remove validator setter --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 16 ++++++++-------- contracts/staking/ValidatorManager.sol | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 27017da0f..8af3e812e 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516147e13803806147e183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146948061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613cd0565b6102d6565b005b610128610138366004613d0b565b61071f565b61017b61014b366004613d0b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613d0b565b61087b565b6101286101af366004613d36565b6108e8565b6101c76101c2366004613d0b565b6109cc565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d73565b6109e2565b610128610200366004613d8c565b610d3e565b61017b610213366004613dca565b610ee3565b6101c7610226366004613d0b565b610efc565b610128610239366004613d0b565b610f10565b61012861024c366004613cd0565b610f7d565b61017b61025f366004613e75565b610f98565b610128610272366004613d8c565b610fbd565b61017b610285366004613f11565b611126565b610128610298366004613d73565b611139565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613d0b565b6112ed565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206146088339815191529184156103285761032582856113bc565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613f31565b600481111561036b5761036b613f31565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613f31565b146104565760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f61046084611658565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104ad576104ad613f31565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61057f856116d3565b905082606001516001600160401b031681608001516001600160401b0316116105f65760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161044d565b82606001518160800181815161060c9190613f59565b6001600160401b031690525061062285826117ce565b5f610632868484608001516118bd565b5f8b8152600589016020526040902090915061064e8282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061067b9085906004016140e4565b6020604051808303815f875af1158015610697573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106bb9190614116565b6080840151604080516001600160401b03928316815291871660208301524282820152519192508c9183918a917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a45050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061462883398151915292919061076790613f80565b9050118015610799575060035f83815260078301602052604090205460ff16600581111561079757610797613f31565b145b6107fd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161044d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610836919060040161412d565b6020604051808303815f875af1158015610852573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108769190614116565b505050565b61088481611ada565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614608833981519152916005600160991b019163ee5b48eb916108369160040161412d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610931575080546001600160401b03808416911610155b1561094f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561097a8484611bbf565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109dc64e8d4a51000836141cb565b92915050565b5f805160206146288339815191525f6109fa83611bd9565b90505f80610a0b8360400151611dba565b915091508015610a705760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044d565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610aa157610aa1613f31565b6005811115610ab257610ab2613f31565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610b2b57610b2b613f31565b1480610b495750600182516005811115610b4757610b47613f31565b145b610ba85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044d565b600382516005811115610bbd57610bbd613f31565b03610be457505f8381526006860160205260408120600491610bdf9190613c61565b610be8565b5060055b6020808301515f90815260088801909152604081205581816005811115610c1157610c11613f31565b90816005811115610c2457610c24613f31565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610c5857610c58613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610d0b57610d0b613f31565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206146088339815191525f610d5684611bd9565b90505f80610d678360400151611f5b565b5091509150610d7585612196565b5f8581526004850160205260408120610d8d91613c61565b5f610d97836116d3565b9050816001600160401b031681606001516001600160401b03161015610dcf5760405162461bcd60e51b815260040161044d906141de565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e145760405162461bcd60e51b815260040161044d90614220565b60015f87815260038701602052604090205460ff166004811115610e3a57610e3a613f31565b14610e575760405162461bcd60e51b815260040161044d90614269565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109dc6001600160401b03831664e8d4a510006142b9565b5f610f06826116d3565b6080015192915050565b610f1981612196565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614608833981519152916005600160991b019163ee5b48eb916108369160040161412d565b8115610f8f57610f8d83826113bc565b505b61087683612282565b5f80610fa386612613565b9050610fb1858286866126c0565b9150505b949350505050565b5f805160206146088339815191525f610fd584611bd9565b90505f80610fe68360400151611f5b565b5091509150610ff485611ada565b5f858152600585016020526040812061100c91613c61565b5f611016836116d3565b9050816001600160401b031681606001516001600160401b0316101561104e5760405162461bcd60e51b815260040161044d906141de565b5f8681526003808701602052604090912001546001600160401b038084169116111561108c5760405162461bcd60e51b815260040161044d90614220565b60035f87815260038701602052604090205460ff1660048111156110b2576110b2613f31565b146110cf5760405162461bcd60e51b815260040161044d90614269565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611132833384612af4565b9392505050565b5f805160206146288339815191525f61115183611bd9565b90505f806111628360400151611dba565b91509150806111c45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044d565b5f828152600585016020526040812080546111de90613f80565b9050118015611210575060015f83815260078601602052604090205460ff16600581111561120e5761120e613f31565b145b61122c5760405162461bcd60e51b815260040161044d906142d0565b5f828152600585016020526040812061124491613c61565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061462883398151915292919061133590613f80565b9050118015611367575060015f83815260078301602052604090205460ff16600581111561136557611365613f31565b145b6113835760405162461bcd60e51b815260040161044d906142d0565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610836919060040161412d565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611407573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261142e9190810190614322565b91509150806114915760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161044d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f89190614116565b82511461155c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161044d565b60208201516001600160a01b0316156115d25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161044d565b5f806115e18460400151612f60565b9150915081871461164e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161044d565b9695505050505050565b5f8181525f805160206146688339815191526020526040812060020180545f8051602061462883398151915291600160a01b9091046001600160401b031690819060146116a4836143f4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061466883398151915290528390208351918201909352825491925f8051602061462883398151915292829060ff16600581111561175357611753613f31565b600581111561176457611764613f31565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061466883398151915260205260409020815181545f805160206146288339815191529284929091829060ff1916600183600581111561181857611818613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611936576118f6816001614419565b6119019060086142b9565b5081515f908390839081106119185761191861442c565b60200101906001600160f81b03191690815f1a9053506001016118e2565b505f5b60048110156119995761194d816003614419565b6119589060086142b9565b6001901c60f81b8261196b836002614440565b8151811061197b5761197b61442c565b60200101906001600160f81b03191690815f1a905350600101611939565b505f5b60208110156119fb576119b081601f614419565b6119bb9060086142b9565b86901c60f81b826119cd836006614440565b815181106119dd576119dd61442c565b60200101906001600160f81b03191690815f1a90535060010161199c565b505f5b6008811015611a6657611a12816007614419565b611a1d9060086142b9565b6001600160401b038616901c60f81b82611a38836026614440565b81518110611a4857611a4861442c565b60200101906001600160f81b03191690815f1a9053506001016119fe565b505f5b6008811015611ad157611a7d816007614419565b611a889060086142b9565b6001600160401b038516901c60f81b82611aa383602e614440565b81518110611ab357611ab361442c565b60200101906001600160f81b03191690815f1a905350600101611a69565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614608833981519152929190611b2290613f80565b9050118015611b54575060035f83815260038301602052604090205460ff166004811115611b5257611b52613f31565b145b611bbb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161044d565b5050565b611bc7613138565b611bd082613183565b611bbb816131c9565b60408051606080820183525f8083526020830181905292820152905f805160206146288339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c4e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c759190810190614322565b9150915080611cdc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161044d565b8254825114611d3f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044d565b60208201516001600160a01b031615611db25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044d565b509392505050565b5f808251602714611ddd5760405162461bcd60e51b815260040161044d90614453565b5f805b6002811015611e2c57611df4816001614419565b611dff9060086142b9565b61ffff16858281518110611e1557611e1561442c565b016020015160f81c901b9190911790600101611de0565b5061ffff811615611e4f5760405162461bcd60e51b815260040161044d9061449c565b5f805b6004811015611eaa57611e66816003614419565b611e719060086142b9565b63ffffffff1686611e83836002614440565b81518110611e9357611e9361442c565b016020015160f81c901b9190911790600101611e52565b5063ffffffff8116600214611ed15760405162461bcd60e51b815260040161044d906144df565b5f805b6020811015611f2657611ee881601f614419565b611ef39060086142b9565b87611eff836006614440565b81518110611f0f57611f0f61442c565b016020015160f81c901b9190911790600101611ed4565b505f86602681518110611f3b57611f3b61442c565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611f7f5760405162461bcd60e51b815260040161044d90614453565b5f805b6002811015611fce57611f96816001614419565b611fa19060086142b9565b61ffff16868281518110611fb757611fb761442c565b016020015160f81c901b9190911790600101611f82565b5061ffff811615611ff15760405162461bcd60e51b815260040161044d9061449c565b5f805b600481101561204c57612008816003614419565b6120139060086142b9565b63ffffffff1687612025836002614440565b815181106120355761203561442c565b016020015160f81c901b9190911790600101611ff4565b5063ffffffff81166003146120735760405162461bcd60e51b815260040161044d906144df565b5f805b60208110156120c85761208a81601f614419565b6120959060086142b9565b886120a1836006614440565b815181106120b1576120b161442c565b016020015160f81c901b9190911790600101612076565b505f805b6008811015612127576120e0816007614419565b6120eb9060086142b9565b6001600160401b031689612100836026614440565b815181106121105761211061442c565b016020015160f81c901b91909117906001016120cc565b505f805b60088110156121865761213f816007614419565b61214a9060086142b9565b6001600160401b03168a61215f83602e614440565b8151811061216f5761216f61442c565b016020015160f81c901b919091179060010161212b565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206146088339815191529291906121de90613f80565b9050118015612210575060015f83815260038301602052604090205460ff16600481111561220e5761220e613f31565b145b611bbb5760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161044d565b5f8181525f805160206146688339815191526020526040808220815160e0810190925280545f8051602061462883398151915293929190829060ff1660058111156122cf576122cf613f31565b60058111156122e0576122e0613f31565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561235a5761235a613f31565b146123b65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044d565b60408101516001600160a01b0316336001600160a01b0316146124305760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161044d565b61243d816080015161327d565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561248157612481613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125358461252f81611658565b5f6118bd565b5f85815260068501602052604090209091506125518282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061257e9085906004016140e4565b6020604051808303815f875af115801561259a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125be9190614116565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146088339815191528161262c8461341e565b90505f612638826109cc565b83549091506001600160401b0382161080159061266257508260010154816001600160401b031611155b610fb55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161044d565b5f6126c9613454565b5f80516020614628833981519152426001600160401b03851611801561270357506001600160401b038416612701426202a300614440565b115b6127655760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161044d565b856127bc5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044d565b5f8681526008820160205260409020541561282a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161044d565b82516030146128915760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044d565b61289a8561327d565b5f806128e16040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061348b565b5f828152600586016020526040902091935091506128ff8282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061292c9085906004016140e4565b6020604051808303815f875af1158015612948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296c9190614116565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156129e5576129e5613f31565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612a8e83611658565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610fb560015f8051602061464883398151915255565b5f612afd613454565b5f612b0a6101c28461341e565b90505f805160206146088339815191525f612b24876116d3565b9050600281516005811115612b3b57612b3b613f31565b14612b9a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161044d565b8281608001818151612bac9190614526565b6001600160401b0316905250612bc287826117ce565b5f612bcc88611658565b90505f6002898984604051602001612c169392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f1981840301815290829052612c3091614546565b602060405180830381855afa158015612c4b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612c6e9190614116565b5f8181526003860160205260409020600201549091506001600160401b031615612cf45760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b606482015260840161044d565b612cfd8561327d565b5f612d0d8a8486608001516118bd565b5f8381526004870160205260409020909150612d298282614003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d569085906004016140e4565b6020604051808303815f875af1158015612d72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d969190614116565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290891660c085015260e090930183905286835260038a01909152902081518154829060ff19166001836004811115612e1e57612e1e613f31565b02179055506020828101518254610100600160a81b0319166101006001600160a01b0390921691909102178255604080840151600184015560608085015160028501805460808089015160a08a015160c08b01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909601516003909501805467ffffffffffffffff1916958216959095179094559389015181518c851681529084169281019290925291871691810191909152849183918e917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a450909550505050505061113260015f8051602061464883398151915255565b5f808251602e14612f835760405162461bcd60e51b815260040161044d90614453565b5f805b6002811015612fd257612f9a816001614419565b612fa59060086142b9565b61ffff16858281518110612fbb57612fbb61442c565b016020015160f81c901b9190911790600101612f86565b5061ffff811615612ff55760405162461bcd60e51b815260040161044d9061449c565b5f805b60048110156130505761300c816003614419565b6130179060086142b9565b63ffffffff1686613029836002614440565b815181106130395761303961442c565b016020015160f81c901b9190911790600101612ff8565b5063ffffffff81166004146130775760405162461bcd60e51b815260040161044d906144df565b5f805b60208110156130cc5761308e81601f614419565b6130999060086142b9565b876130a5836006614440565b815181106130b5576130b561442c565b016020015160f81c901b919091179060010161307a565b505f805b600881101561312b576130e4816007614419565b6130ef9060086142b9565b6001600160401b031688613104836026614440565b815181106131145761311461442c565b016020015160f81c901b91909117906001016130d0565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661318157604051631afcd79f60e31b815260040160405180910390fd5b565b61318b613138565b61319481613843565b6131c6606082013560808301356131b160c0850160a08601613dca565b6131c160e0860160c08701614561565b613864565b50565b6131d1613138565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661325d5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161044d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146288339815191529060ff165f036132bb575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133039083614419565b1061331f576001600160401b038416604083015280825261333e565b83826040018181516133319190614526565b6001600160401b03169052505b5f826020015183604001516064613355919061457c565b61335f91906145a7565b600285015490915060ff90811690821611156133da5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161044d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6109dc827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906138bf565b5f8051602061464883398151915280546001190161348557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134f55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561356c5761352c816001614419565b6135379060086142b9565b5081515f9083908390811061354e5761354e61442c565b60200101906001600160f81b03191690815f1a905350600101613518565b505f5b60048110156135ca57613583816003614419565b61358e9060086142b9565b505f8261359c836002614440565b815181106135ac576135ac61442c565b60200101906001600160f81b03191690815f1a90535060010161356f565b505f5b602081101561362757845181602081106135e9576135e961442c565b1a60f81b826135f9836006614440565b815181106136095761360961442c565b60200101906001600160f81b03191690815f1a9053506001016135cd565b505f5b602081101561368757846020015181602081106136495761364961442c565b1a60f81b82613659836026614440565b815181106136695761366961442c565b60200101906001600160f81b03191690815f1a90535060010161362a565b505f5b60088110156136fb5761369e816007614419565b6136a99060086142b9565b60ff1685604001516001600160401b0316901c60f81b828260466136cd9190614440565b815181106136dd576136dd61442c565b60200101906001600160f81b03191690815f1a90535060010161368a565b505f5b6030811015613766578460800151818151811061371d5761371d61442c565b01602001516001600160f81b0319168261373883604e614440565b815181106137485761374861442c565b60200101906001600160f81b03191690815f1a9053506001016136fe565b505f5b60088110156137d85761377d816007614419565b6137889060086142b9565b60608601516001600160401b0390811691161c60f81b826137aa83607e614440565b815181106137ba576137ba61442c565b60200101906001600160f81b03191690815f1a905350600101613769565b506002816040516137e99190614546565b602060405180830381855afa158015613804573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138279190614116565b94909350915050565b60015f8051602061464883398151915255565b61384b613138565b613853613a21565b61385b613a31565b6131c681613a39565b61386c613138565b5f5f80516020614608833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613905573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139299190614116565b90506139406001600160a01b038516333086613aa5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613984573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139a89190614116565b9050818111613a0e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161044d565b613a188282614419565b95945050505050565b613a29613138565b613181613b05565b613181613138565b613a41613138565b80355f8051602061462883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a8b60608301604084016145cc565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613aff908590613b0d565b50505050565b613830613138565b5f613b216001600160a01b03841683613b6e565b905080515f14158015613b45575080806020019051810190613b4391906145ec565b155b1561087657604051635274afe760e01b81526001600160a01b038416600482015260240161044d565b606061113283835f845f80856001600160a01b03168486604051613b929190614546565b5f6040518083038185875af1925050503d805f8114613bcc576040519150601f19603f3d011682016040523d82523d5f602084013e613bd1565b606091505b509150915061164e868383606082613bf157613bec82613c38565b611132565b8151158015613c0857506001600160a01b0384163b155b15613c3157604051639996b31560e01b81526001600160a01b038516600482015260240161044d565b5080611132565b805115613c485780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c6d90613f80565b5f825580601f10613c7c575050565b601f0160209004905f5260205f20908101906131c691905b80821115613ca7575f8155600101613c94565b5090565b80151581146131c6575f80fd5b803563ffffffff81168114613ccb575f80fd5b919050565b5f805f60608486031215613ce2575f80fd5b833592506020840135613cf481613cab565b9150613d0260408501613cb8565b90509250925092565b5f60208284031215613d1b575f80fd5b5035919050565b6001600160a01b03811681146131c6575f80fd5b5f80828403610100811215613d49575f80fd5b60e0811215613d56575f80fd5b5082915060e0830135613d6881613d22565b809150509250929050565b5f60208284031215613d83575f80fd5b61113282613cb8565b5f8060408385031215613d9d575f80fd5b613da683613cb8565b946020939093013593505050565b80356001600160401b0381168114613ccb575f80fd5b5f60208284031215613dda575f80fd5b61113282613db4565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e1957613e19613de3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e4757613e47613de3565b604052919050565b5f6001600160401b03821115613e6757613e67613de3565b50601f01601f191660200190565b5f805f8060808587031215613e88575f80fd5b8435935060208501359250613e9f60408601613db4565b915060608501356001600160401b03811115613eb9575f80fd5b8501601f81018713613ec9575f80fd5b8035613edc613ed782613e4f565b613e1f565b818152886020838501011115613ef0575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613f22575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f7957613f79613f45565b5092915050565b600181811c90821680613f9457607f821691505b602082108103613fb257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561087657805f5260205f20601f840160051c81016020851015613fdd5750805b601f840160051c820191505b81811015613ffc575f8155600101613fe9565b5050505050565b81516001600160401b0381111561401c5761401c613de3565b6140308161402a8454613f80565b84613fb8565b602080601f831160018114614063575f841561404c5750858301515b5f19600386901b1c1916600185901b1785556140ba565b5f85815260208120601f198616915b8281101561409157888601518255948401946001909101908401614072565b50858210156140ae57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140dc5781810151838201526020016140c4565b50505f910152565b602081525f82518060208401526141028160408501602087016140c2565b601f01601f19169190910160400192915050565b5f60208284031215614126575f80fd5b5051919050565b5f60208083525f845461413f81613f80565b806020870152604060018084165f8114614160576001811461417c576141a9565b60ff19851660408a0152604084151560051b8a010195506141a9565b895f5260205f205f5b858110156141a05781548b8201860152908301908801614185565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826141d9576141d96141b7565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b80820281158282048414176109dc576109dc613f45565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613ccb81613cab565b5f8060408385031215614333575f80fd5b82516001600160401b0380821115614349575f80fd5b908401906060828703121561435c575f80fd5b614364613df7565b8251815260208084015161437781613d22565b8282015260408401518381111561438c575f80fd5b80850194505087601f8501126143a0575f80fd5b835192506143b0613ed784613e4f565b83815288828587010111156143c3575f80fd5b6143d2848383018488016140c2565b806040840152508195506143e7818801614317565b9450505050509250929050565b5f6001600160401b0380831681810361440f5761440f613f45565b6001019392505050565b818103818111156109dc576109dc613f45565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109dc576109dc613f45565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f7957613f79613f45565b5f82516145578184602087016140c2565b9190910192915050565b5f60208284031215614571575f80fd5b813561113281613d22565b6001600160401b0381811683821602808216919082811461459f5761459f613f45565b505092915050565b5f6001600160401b03808416806145c0576145c06141b7565b92169190910492915050565b5f602082840312156145dc575f80fd5b813560ff81168114611132575f80fd5b5f602082840312156145fc575f80fd5b815161113281613cab56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161472c38038061472c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145df8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613c1b565b6102d6565b005b610128610138366004613c56565b61070c565b61017b61014b366004613c56565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613c56565b610868565b6101286101af366004613c81565b6108d5565b6101c76101c2366004613c56565b6109b9565b6040516001600160401b039091168152602001610185565b6101286101ed366004613cbe565b6109cf565b610128610200366004613cd7565b610d2b565b61017b610213366004613d15565b610ed0565b6101c7610226366004613c56565b610ee9565b610128610239366004613c56565b610efd565b61012861024c366004613c1b565b610f6a565b61017b61025f366004613dc0565b610f85565b610128610272366004613cd7565b610faa565b61017b610285366004613e5c565b611113565b610128610298366004613cbe565b611126565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613c56565b6112da565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145538339815191529184156103285761032582856113a9565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613e7c565b600481111561036b5761036b613e7c565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613e7c565b146104565760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f61046084611645565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104ad576104ad613e7c565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61057f856116c0565b905082606001516001600160401b031681608001516001600160401b0316116105f65760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161044d565b5f8360600151826080015161060b9190613ea4565b905061061786826117bb565b5f6106238785846117f8565b5f8c815260058a016020526040902090915061063f8282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061066c90859060040161402f565b6020604051808303815f875af1158015610688573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ac9190614061565b604080516001600160401b03868116825288166020820152428183015290519192508d9183918b917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061457383398151915292919061075490613ecb565b9050118015610786575060035f83815260078301602052604090205460ff16600581111561078457610784613e7c565b145b6107ea5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161044d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108239190600401614078565b6020604051808303815f875af115801561083f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108639190614061565b505050565b61087181611a15565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614553833981519152916005600160991b019163ee5b48eb9161082391600401614078565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061091e575080546001600160401b03808416911610155b1561093c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109678484611afa565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109c964e8d4a5100083614116565b92915050565b5f805160206145738339815191525f6109e783611b14565b90505f806109f88360400151611cf5565b915091508015610a5d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044d565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610a8e57610a8e613e7c565b6005811115610a9f57610a9f613e7c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610b1857610b18613e7c565b1480610b365750600182516005811115610b3457610b34613e7c565b145b610b955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044d565b600382516005811115610baa57610baa613e7c565b03610bd157505f8381526006860160205260408120600491610bcc9190613bac565b610bd5565b5060055b6020808301515f90815260088801909152604081205581816005811115610bfe57610bfe613e7c565b90816005811115610c1157610c11613e7c565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610c4557610c45613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610cf857610cf8613e7c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145538339815191525f610d4384611b14565b90505f80610d548360400151611e96565b5091509150610d62856120d1565b5f8581526004850160205260408120610d7a91613bac565b5f610d84836116c0565b9050816001600160401b031681606001516001600160401b03161015610dbc5760405162461bcd60e51b815260040161044d90614129565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e015760405162461bcd60e51b815260040161044d9061416b565b60015f87815260038701602052604090205460ff166004811115610e2757610e27613e7c565b14610e445760405162461bcd60e51b815260040161044d906141b4565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109c96001600160401b03831664e8d4a51000614204565b5f610ef3826116c0565b6080015192915050565b610f06816120d1565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614553833981519152916005600160991b019163ee5b48eb9161082391600401614078565b8115610f7c57610f7a83826113a9565b505b610863836121bd565b5f80610f908661254e565b9050610f9e858286866125fb565b9150505b949350505050565b5f805160206145538339815191525f610fc284611b14565b90505f80610fd38360400151611e96565b5091509150610fe185611a15565b5f8581526005850160205260408120610ff991613bac565b5f611003836116c0565b9050816001600160401b031681606001516001600160401b0316101561103b5760405162461bcd60e51b815260040161044d90614129565b5f8681526003808701602052604090912001546001600160401b03808416911611156110795760405162461bcd60e51b815260040161044d9061416b565b60035f87815260038701602052604090205460ff16600481111561109f5761109f613e7c565b146110bc5760405162461bcd60e51b815260040161044d906141b4565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61111f833384612a2f565b9392505050565b5f805160206145738339815191525f61113e83611b14565b90505f8061114f8360400151611cf5565b91509150806111b15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044d565b5f828152600585016020526040812080546111cb90613ecb565b90501180156111fd575060015f83815260078601602052604090205460ff1660058111156111fb576111fb613e7c565b145b6112195760405162461bcd60e51b815260040161044d9061421b565b5f828152600585016020526040812061123191613bac565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061457383398151915292919061132290613ecb565b9050118015611354575060015f83815260078301602052604090205460ff16600581111561135257611352613e7c565b145b6113705760405162461bcd60e51b815260040161044d9061421b565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108239190600401614078565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113f4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261141b919081019061426d565b915091508061147e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161044d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e59190614061565b8251146115495760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161044d565b60208201516001600160a01b0316156115bf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161044d565b5f806115ce8460400151612eab565b9150915081871461163b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161044d565b9695505050505050565b5f8181525f805160206145b38339815191526020526040812060020180545f8051602061457383398151915291600160a01b9091046001600160401b031690819060146116918361433f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206145b383398151915290528390208351918201909352825491925f8051602061457383398151915292829060ff16600581111561174057611740613e7c565b600581111561175157611751613e7c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f9182525f805160206145b38339815191526020526040909120600301805467ffffffffffffffff19166001600160401b03909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561187157611831816001614364565b61183c906008614204565b5081515f9083908390811061185357611853614377565b60200101906001600160f81b03191690815f1a90535060010161181d565b505f5b60048110156118d457611888816003614364565b611893906008614204565b6001901c60f81b826118a683600261438b565b815181106118b6576118b6614377565b60200101906001600160f81b03191690815f1a905350600101611874565b505f5b6020811015611936576118eb81601f614364565b6118f6906008614204565b86901c60f81b8261190883600661438b565b8151811061191857611918614377565b60200101906001600160f81b03191690815f1a9053506001016118d7565b505f5b60088110156119a15761194d816007614364565b611958906008614204565b6001600160401b038616901c60f81b8261197383602661438b565b8151811061198357611983614377565b60200101906001600160f81b03191690815f1a905350600101611939565b505f5b6008811015611a0c576119b8816007614364565b6119c3906008614204565b6001600160401b038516901c60f81b826119de83602e61438b565b815181106119ee576119ee614377565b60200101906001600160f81b03191690815f1a9053506001016119a4565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614553833981519152929190611a5d90613ecb565b9050118015611a8f575060035f83815260038301602052604090205460ff166004811115611a8d57611a8d613e7c565b145b611af65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161044d565b5050565b611b02613083565b611b0b826130ce565b611af681613114565b60408051606080820183525f8083526020830181905292820152905f805160206145738339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611b89573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611bb0919081019061426d565b9150915080611c175760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161044d565b8254825114611c7a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044d565b60208201516001600160a01b031615611ced5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044d565b509392505050565b5f808251602714611d185760405162461bcd60e51b815260040161044d9061439e565b5f805b6002811015611d6757611d2f816001614364565b611d3a906008614204565b61ffff16858281518110611d5057611d50614377565b016020015160f81c901b9190911790600101611d1b565b5061ffff811615611d8a5760405162461bcd60e51b815260040161044d906143e7565b5f805b6004811015611de557611da1816003614364565b611dac906008614204565b63ffffffff1686611dbe83600261438b565b81518110611dce57611dce614377565b016020015160f81c901b9190911790600101611d8d565b5063ffffffff8116600214611e0c5760405162461bcd60e51b815260040161044d9061442a565b5f805b6020811015611e6157611e2381601f614364565b611e2e906008614204565b87611e3a83600661438b565b81518110611e4a57611e4a614377565b016020015160f81c901b9190911790600101611e0f565b505f86602681518110611e7657611e76614377565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611eba5760405162461bcd60e51b815260040161044d9061439e565b5f805b6002811015611f0957611ed1816001614364565b611edc906008614204565b61ffff16868281518110611ef257611ef2614377565b016020015160f81c901b9190911790600101611ebd565b5061ffff811615611f2c5760405162461bcd60e51b815260040161044d906143e7565b5f805b6004811015611f8757611f43816003614364565b611f4e906008614204565b63ffffffff1687611f6083600261438b565b81518110611f7057611f70614377565b016020015160f81c901b9190911790600101611f2f565b5063ffffffff8116600314611fae5760405162461bcd60e51b815260040161044d9061442a565b5f805b602081101561200357611fc581601f614364565b611fd0906008614204565b88611fdc83600661438b565b81518110611fec57611fec614377565b016020015160f81c901b9190911790600101611fb1565b505f805b60088110156120625761201b816007614364565b612026906008614204565b6001600160401b03168961203b83602661438b565b8151811061204b5761204b614377565b016020015160f81c901b9190911790600101612007565b505f805b60088110156120c15761207a816007614364565b612085906008614204565b6001600160401b03168a61209a83602e61438b565b815181106120aa576120aa614377565b016020015160f81c901b9190911790600101612066565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061455383398151915292919061211990613ecb565b905011801561214b575060015f83815260038301602052604090205460ff16600481111561214957612149613e7c565b145b611af65760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161044d565b5f8181525f805160206145b38339815191526020526040808220815160e0810190925280545f8051602061457383398151915293929190829060ff16600581111561220a5761220a613e7c565b600581111561221b5761221b613e7c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561229557612295613e7c565b146122f15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044d565b60408101516001600160a01b0316336001600160a01b03161461236b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161044d565b61237881608001516131c8565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123bc576123bc613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124708461246a81611645565b5f6117f8565b5f858152600685016020526040902090915061248c8282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124b990859060040161402f565b6020604051808303815f875af11580156124d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124f99190614061565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145538339815191528161256784613369565b90505f612573826109b9565b83549091506001600160401b0382161080159061259d57508260010154816001600160401b031611155b610fa25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161044d565b5f61260461339f565b5f80516020614573833981519152426001600160401b03851611801561263e57506001600160401b03841661263c426202a30061438b565b115b6126a05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161044d565b856126f75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044d565b5f868152600882016020526040902054156127655760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161044d565b82516030146127cc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044d565b6127d5856131c8565b5f8061281c6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506133d6565b5f8281526005860160205260409020919350915061283a8282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061286790859060040161402f565b6020604051808303815f875af1158015612883573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128a79190614061565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561292057612920613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556129c983611645565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610fa260015f8051602061459383398151915255565b5f612a3861339f565b5f612a456101c284613369565b90505f805160206145538339815191525f612a5f876116c0565b9050600281516005811115612a7657612a76613e7c565b14612ad55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161044d565b5f838260800151612ae69190614471565b9050612af288826117bb565b5f612afc89611645565b90505f60028a8a84604051602001612b469392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f1981840301815290829052612b6091614491565b602060405180830381855afa158015612b7b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612b9e9190614061565b5f8181526003870160205260409020600201549091506001600160401b031615612c245760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b606482015260840161044d565b612c2d866131c8565b5f612c398b84866117f8565b5f8381526004880160205260409020909150612c558282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c8290859060040161402f565b6020604051808303815f875af1158015612c9e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cc29190614061565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d7157612d71613e7c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606080850151600285018054608088015160a089015160c08a01516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909501516003909401805467ffffffffffffffff19169486169490941790935580518c851681528985169281019290925292871692810192909252849183918f917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a45090965050505050505061111f60015f8051602061459383398151915255565b5f808251602e14612ece5760405162461bcd60e51b815260040161044d9061439e565b5f805b6002811015612f1d57612ee5816001614364565b612ef0906008614204565b61ffff16858281518110612f0657612f06614377565b016020015160f81c901b9190911790600101612ed1565b5061ffff811615612f405760405162461bcd60e51b815260040161044d906143e7565b5f805b6004811015612f9b57612f57816003614364565b612f62906008614204565b63ffffffff1686612f7483600261438b565b81518110612f8457612f84614377565b016020015160f81c901b9190911790600101612f43565b5063ffffffff8116600414612fc25760405162461bcd60e51b815260040161044d9061442a565b5f805b602081101561301757612fd981601f614364565b612fe4906008614204565b87612ff083600661438b565b8151811061300057613000614377565b016020015160f81c901b9190911790600101612fc5565b505f805b60088110156130765761302f816007614364565b61303a906008614204565b6001600160401b03168861304f83602661438b565b8151811061305f5761305f614377565b016020015160f81c901b919091179060010161301b565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130cc57604051631afcd79f60e31b815260040160405180910390fd5b565b6130d6613083565b6130df8161378e565b613111606082013560808301356130fc60c0850160a08601613d15565b61310c60e0860160c087016144ac565b6137af565b50565b61311c613083565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131a85760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161044d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145738339815191529060ff165f03613206575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061324e9083614364565b1061326a576001600160401b0384166040830152808252613289565b838260400181815161327c9190614471565b6001600160401b03169052505b5f8260200151836040015160646132a091906144c7565b6132aa91906144f2565b600285015490915060ff90811690821611156133255760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161044d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6109c9827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061380a565b5f805160206145938339815191528054600119016133d057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134405760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134b757613477816001614364565b613482906008614204565b5081515f9083908390811061349957613499614377565b60200101906001600160f81b03191690815f1a905350600101613463565b505f5b6004811015613515576134ce816003614364565b6134d9906008614204565b505f826134e783600261438b565b815181106134f7576134f7614377565b60200101906001600160f81b03191690815f1a9053506001016134ba565b505f5b6020811015613572578451816020811061353457613534614377565b1a60f81b8261354483600661438b565b8151811061355457613554614377565b60200101906001600160f81b03191690815f1a905350600101613518565b505f5b60208110156135d2578460200151816020811061359457613594614377565b1a60f81b826135a483602661438b565b815181106135b4576135b4614377565b60200101906001600160f81b03191690815f1a905350600101613575565b505f5b6008811015613646576135e9816007614364565b6135f4906008614204565b60ff1685604001516001600160401b0316901c60f81b82826046613618919061438b565b8151811061362857613628614377565b60200101906001600160f81b03191690815f1a9053506001016135d5565b505f5b60308110156136b1578460800151818151811061366857613668614377565b01602001516001600160f81b0319168261368383604e61438b565b8151811061369357613693614377565b60200101906001600160f81b03191690815f1a905350600101613649565b505f5b6008811015613723576136c8816007614364565b6136d3906008614204565b60608601516001600160401b0390811691161c60f81b826136f583607e61438b565b8151811061370557613705614377565b60200101906001600160f81b03191690815f1a9053506001016136b4565b506002816040516137349190614491565b602060405180830381855afa15801561374f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137729190614061565b94909350915050565b60015f8051602061459383398151915255565b613796613083565b61379e61396c565b6137a661397c565b61311181613984565b6137b7613083565b5f5f80516020614553833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613850573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138749190614061565b905061388b6001600160a01b0385163330866139f0565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156138cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138f39190614061565b90508181116139595760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161044d565b6139638282614364565b95945050505050565b613974613083565b6130cc613a50565b6130cc613083565b61398c613083565b80355f8051602061457383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139d66060830160408401614517565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613a4a908590613a58565b50505050565b61377b613083565b5f613a6c6001600160a01b03841683613ab9565b905080515f14158015613a90575080806020019051810190613a8e9190614537565b155b1561086357604051635274afe760e01b81526001600160a01b038416600482015260240161044d565b606061111f83835f845f80856001600160a01b03168486604051613add9190614491565b5f6040518083038185875af1925050503d805f8114613b17576040519150601f19603f3d011682016040523d82523d5f602084013e613b1c565b606091505b509150915061163b868383606082613b3c57613b3782613b83565b61111f565b8151158015613b5357506001600160a01b0384163b155b15613b7c57604051639996b31560e01b81526001600160a01b038516600482015260240161044d565b508061111f565b805115613b935780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613bb890613ecb565b5f825580601f10613bc7575050565b601f0160209004905f5260205f209081019061311191905b80821115613bf2575f8155600101613bdf565b5090565b8015158114613111575f80fd5b803563ffffffff81168114613c16575f80fd5b919050565b5f805f60608486031215613c2d575f80fd5b833592506020840135613c3f81613bf6565b9150613c4d60408501613c03565b90509250925092565b5f60208284031215613c66575f80fd5b5035919050565b6001600160a01b0381168114613111575f80fd5b5f80828403610100811215613c94575f80fd5b60e0811215613ca1575f80fd5b5082915060e0830135613cb381613c6d565b809150509250929050565b5f60208284031215613cce575f80fd5b61111f82613c03565b5f8060408385031215613ce8575f80fd5b613cf183613c03565b946020939093013593505050565b80356001600160401b0381168114613c16575f80fd5b5f60208284031215613d25575f80fd5b61111f82613cff565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d6457613d64613d2e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d9257613d92613d2e565b604052919050565b5f6001600160401b03821115613db257613db2613d2e565b50601f01601f191660200190565b5f805f8060808587031215613dd3575f80fd5b8435935060208501359250613dea60408601613cff565b915060608501356001600160401b03811115613e04575f80fd5b8501601f81018713613e14575f80fd5b8035613e27613e2282613d9a565b613d6a565b818152886020838501011115613e3b575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613e6d575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ec457613ec4613e90565b5092915050565b600181811c90821680613edf57607f821691505b602082108103613efd57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561086357805f5260205f20601f840160051c81016020851015613f285750805b601f840160051c820191505b81811015613f47575f8155600101613f34565b5050505050565b81516001600160401b03811115613f6757613f67613d2e565b613f7b81613f758454613ecb565b84613f03565b602080601f831160018114613fae575f8415613f975750858301515b5f19600386901b1c1916600185901b178555614005565b5f85815260208120601f198616915b82811015613fdc57888601518255948401946001909101908401613fbd565b5085821015613ff957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561402757818101518382015260200161400f565b50505f910152565b602081525f825180602084015261404d81604085016020870161400d565b601f01601f19169190910160400192915050565b5f60208284031215614071575f80fd5b5051919050565b5f60208083525f845461408a81613ecb565b806020870152604060018084165f81146140ab57600181146140c7576140f4565b60ff19851660408a0152604084151560051b8a010195506140f4565b895f5260205f205f5b858110156140eb5781548b82018601529083019088016140d0565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261412457614124614102565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b80820281158282048414176109c9576109c9613e90565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613c1681613bf6565b5f806040838503121561427e575f80fd5b82516001600160401b0380821115614294575f80fd5b90840190606082870312156142a7575f80fd5b6142af613d42565b825181526020808401516142c281613c6d565b828201526040840151838111156142d7575f80fd5b80850194505087601f8501126142eb575f80fd5b835192506142fb613e2284613d9a565b838152888285870101111561430e575f80fd5b61431d8483830184880161400d565b80604084015250819550614332818801614262565b9450505050509250929050565b5f6001600160401b0380831681810361435a5761435a613e90565b6001019392505050565b818103818111156109c9576109c9613e90565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109c9576109c9613e90565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ec457613ec4613e90565b5f82516144a281846020870161400d565b9190910192915050565b5f602082840312156144bc575f80fd5b813561111f81613c6d565b6001600160401b038181168382160280821691908281146144ea576144ea613e90565b505092915050565b5f6001600160401b038084168061450b5761450b614102565b92169190910492915050565b5f60208284031215614527575f80fd5b813560ff8116811461111f575f80fd5b5f60208284031215614547575f80fd5b815161111f81613bf656fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index ddee60b49..560a9b9f6 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161440938038061440983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142bc8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613945565b610389565b005b348015610134575f80fd5b50610127610143366004613980565b61046b565b348015610153575f80fd5b506101276101623660046139bb565b6108b4565b348015610172575f80fd5b506101b16101813660046139bb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de3660046139bb565b610a10565b3480156101ee575f80fd5b506102026101fd3660046139bb565b610a7d565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b506101276102343660046139d2565b610a93565b348015610244575f80fd5b506101276102533660046139eb565b610def565b348015610263575f80fd5b506101b1610272366004613a29565b610f94565b348015610282575f80fd5b506102026102913660046139bb565b610fad565b3480156102a1575f80fd5b506101276102b03660046139bb565b610fc1565b3480156102c0575f80fd5b506101276102cf366004613980565b61102e565b3480156102df575f80fd5b506101276102ee3660046139eb565b611049565b3480156102fe575f80fd5b5061012761030d3660046139d2565b6111b2565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e3660046139bb565b611366565b6101b16103713660046139bb565b611435565b6101b1610384366004613ad4565b611441565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611465565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206142308339815191529184156104bd576104ba8285611479565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b66565b600481111561050057610500613b66565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613b66565b146105eb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f6105f584611715565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561064257610642613b66565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61071485611790565b905082606001516001600160401b031681608001516001600160401b03161161078b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105e2565b8260600151816080018181516107a19190613b8e565b6001600160401b03169052506107b7858261188b565b5f6107c78684846080015161197a565b5f8b815260058901602052604090209091506107e38282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610810908590600401613d13565b6020604051808303815f875af115801561082c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108509190613d45565b6080840151604080516001600160401b03928316815291871660208301524282820152519192508c9183918a917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a45050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206142508339815191529291906108fc90613bb5565b905011801561092e575060035f83815260078301602052604090205460ff16600581111561092c5761092c613b66565b145b6109925760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105e2565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109cb9190600401613d5c565b6020604051808303815f875af11580156109e7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0b9190613d45565b505050565b610a1981611b97565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614230833981519152916005600160991b019163ee5b48eb916109cb91600401613d5c565b5f610a8d64e8d4a5100083613dfa565b92915050565b5f805160206142508339815191525f610aab83611c7c565b90505f80610abc8360400151611e5d565b915091508015610b215760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105e2565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610b5257610b52613b66565b6005811115610b6357610b63613b66565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610bdc57610bdc613b66565b1480610bfa5750600182516005811115610bf857610bf8613b66565b145b610c595760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105e2565b600382516005811115610c6e57610c6e613b66565b03610c9557505f8381526006860160205260408120600491610c9091906138fb565b610c99565b5060055b6020808301515f90815260088801909152604081205581816005811115610cc257610cc2613b66565b90816005811115610cd557610cd5613b66565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d0957610d09613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610dbc57610dbc613b66565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206142308339815191525f610e0784611c7c565b90505f80610e188360400151611ffe565b5091509150610e2685612239565b5f8581526004850160205260408120610e3e916138fb565b5f610e4883611790565b9050816001600160401b031681606001516001600160401b03161015610e805760405162461bcd60e51b81526004016105e290613e0d565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610ec55760405162461bcd60e51b81526004016105e290613e4f565b60015f87815260038701602052604090205460ff166004811115610eeb57610eeb613b66565b14610f085760405162461bcd60e51b81526004016105e290613e98565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a8d6001600160401b03831664e8d4a51000613ee8565b5f610fb782611790565b6080015192915050565b610fca81612239565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614230833981519152916005600160991b019163ee5b48eb916109cb91600401613d5c565b81156110405761103e8382611479565b505b610a0b83612325565b5f805160206142308339815191525f61106184611c7c565b90505f806110728360400151611ffe565b509150915061108085611b97565b5f8581526005850160205260408120611098916138fb565b5f6110a283611790565b9050816001600160401b031681606001516001600160401b031610156110da5760405162461bcd60e51b81526004016105e290613e0d565b5f8681526003808701602052604090912001546001600160401b03808416911611156111185760405162461bcd60e51b81526004016105e290613e4f565b60035f87815260038701602052604090205460ff16600481111561113e5761113e613b66565b1461115b5760405162461bcd60e51b81526004016105e290613e98565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142508339815191525f6111ca83611c7c565b90505f806111db8360400151611e5d565b915091508061123d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105e2565b5f8281526005850160205260408120805461125790613bb5565b9050118015611289575060015f83815260078601602052604090205460ff16600581111561128757611287613b66565b145b6112a55760405162461bcd60e51b81526004016105e290613eff565b5f82815260058501602052604081206112bd916138fb565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142508339815191529291906113ae90613bb5565b90501180156113e0575060015f83815260078301602052604090205460ff1660058111156113de576113de613b66565b145b6113fc5760405162461bcd60e51b81526004016105e290613eff565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109cb9190600401613d5c565b5f610a8d8233346126b6565b5f8061144c34612b1f565b905061145a85828686612bc9565b9150505b9392505050565b61146d612ffd565b61147681613048565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114eb9190810190613f65565b915091508061154e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105e2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611591573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b59190613d45565b8251146116195760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105e2565b60208201516001600160a01b03161561168f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105e2565b5f8061169e846040015161308b565b9150915081871461170b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105e2565b9695505050505050565b5f8181525f805160206142908339815191526020526040812060020180545f8051602061425083398151915291600160a01b9091046001600160401b0316908190601461176183614037565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061429083398151915290528390208351918201909352825491925f8051602061425083398151915292829060ff16600581111561181057611810613b66565b600581111561182157611821613b66565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281525f8051602061429083398151915260205260409020815181545f805160206142508339815191529284929091829060ff191660018360058111156118d5576118d5613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119f3576119b381600161405c565b6119be906008613ee8565b5081515f908390839081106119d5576119d561406f565b60200101906001600160f81b03191690815f1a90535060010161199f565b505f5b6004811015611a5657611a0a81600361405c565b611a15906008613ee8565b6001901c60f81b82611a28836002614083565b81518110611a3857611a3861406f565b60200101906001600160f81b03191690815f1a9053506001016119f6565b505f5b6020811015611ab857611a6d81601f61405c565b611a78906008613ee8565b86901c60f81b82611a8a836006614083565b81518110611a9a57611a9a61406f565b60200101906001600160f81b03191690815f1a905350600101611a59565b505f5b6008811015611b2357611acf81600761405c565b611ada906008613ee8565b6001600160401b038616901c60f81b82611af5836026614083565b81518110611b0557611b0561406f565b60200101906001600160f81b03191690815f1a905350600101611abb565b505f5b6008811015611b8e57611b3a81600761405c565b611b45906008613ee8565b6001600160401b038516901c60f81b82611b6083602e614083565b81518110611b7057611b7061406f565b60200101906001600160f81b03191690815f1a905350600101611b26565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614230833981519152929190611bdf90613bb5565b9050118015611c11575060035f83815260038301602052604090205460ff166004811115611c0f57611c0f613b66565b145b611c785760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016105e2565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206142508339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611cf1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d189190810190613f65565b9150915080611d7f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105e2565b8254825114611de25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105e2565b60208201516001600160a01b031615611e555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105e2565b509392505050565b5f808251602714611e805760405162461bcd60e51b81526004016105e290614096565b5f805b6002811015611ecf57611e9781600161405c565b611ea2906008613ee8565b61ffff16858281518110611eb857611eb861406f565b016020015160f81c901b9190911790600101611e83565b5061ffff811615611ef25760405162461bcd60e51b81526004016105e2906140df565b5f805b6004811015611f4d57611f0981600361405c565b611f14906008613ee8565b63ffffffff1686611f26836002614083565b81518110611f3657611f3661406f565b016020015160f81c901b9190911790600101611ef5565b5063ffffffff8116600214611f745760405162461bcd60e51b81526004016105e290614122565b5f805b6020811015611fc957611f8b81601f61405c565b611f96906008613ee8565b87611fa2836006614083565b81518110611fb257611fb261406f565b016020015160f81c901b9190911790600101611f77565b505f86602681518110611fde57611fde61406f565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120225760405162461bcd60e51b81526004016105e290614096565b5f805b60028110156120715761203981600161405c565b612044906008613ee8565b61ffff1686828151811061205a5761205a61406f565b016020015160f81c901b9190911790600101612025565b5061ffff8116156120945760405162461bcd60e51b81526004016105e2906140df565b5f805b60048110156120ef576120ab81600361405c565b6120b6906008613ee8565b63ffffffff16876120c8836002614083565b815181106120d8576120d861406f565b016020015160f81c901b9190911790600101612097565b5063ffffffff81166003146121165760405162461bcd60e51b81526004016105e290614122565b5f805b602081101561216b5761212d81601f61405c565b612138906008613ee8565b88612144836006614083565b815181106121545761215461406f565b016020015160f81c901b9190911790600101612119565b505f805b60088110156121ca5761218381600761405c565b61218e906008613ee8565b6001600160401b0316896121a3836026614083565b815181106121b3576121b361406f565b016020015160f81c901b919091179060010161216f565b505f805b6008811015612229576121e281600761405c565b6121ed906008613ee8565b6001600160401b03168a61220283602e614083565b815181106122125761221261406f565b016020015160f81c901b91909117906001016121ce565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061423083398151915292919061228190613bb5565b90501180156122b3575060015f83815260038301602052604090205460ff1660048111156122b1576122b1613b66565b145b611c785760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016105e2565b5f8181525f805160206142908339815191526020526040808220815160e0810190925280545f8051602061425083398151915293929190829060ff16600581111561237257612372613b66565b600581111561238357612383613b66565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123fd576123fd613b66565b146124595760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105e2565b60408101516001600160a01b0316336001600160a01b0316146124d35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105e2565b6124e08160800151613263565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561252457612524613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125d8846125d281611715565b5f61197a565b5f85815260068501602052604090209091506125f48282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612621908590600401613d13565b6020604051808303815f875af115801561263d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126619190613d45565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126bf613404565b5f6126c983610a7d565b90505f805160206142308339815191525f6126e387611790565b90506002815160058111156126fa576126fa613b66565b146127595760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105e2565b828160800181815161276b9190614169565b6001600160401b0316905250612781878261188b565b5f61278b88611715565b90505f60028989846040516020016127d59392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f19818403018152908290526127ef91614189565b602060405180830381855afa15801561280a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061282d9190613d45565b5f8181526003860160205260409020600201549091506001600160401b0316156128b35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b60648201526084016105e2565b6128bc85613263565b5f6128cc8a84866080015161197a565b5f83815260048701602052604090209091506128e88282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612915908590600401613d13565b6020604051808303815f875af1158015612931573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129559190613d45565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290891660c085015260e090930183905286835260038a01909152902081518154829060ff191660018360048111156129dd576129dd613b66565b02179055506020828101518254610100600160a81b0319166101006001600160a01b0390921691909102178255604080840151600184015560608085015160028501805460808089015160a08a015160c08b01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909601516003909501805467ffffffffffffffff1916958216959095179094559389015181518c851681529084169281019290925291871691810191909152849183918e917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a450909550505050505061145e60015f8051602061427083398151915255565b5f5f805160206142308339815191528282612b3982610a7d565b83549091506001600160401b03821610801590612b6357508260010154816001600160401b031611155b612bc15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105e2565b949350505050565b5f612bd2613404565b5f80516020614250833981519152426001600160401b038516118015612c0c57506001600160401b038416612c0a426202a300614083565b115b612c6e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105e2565b85612cc55760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105e2565b5f86815260088201602052604090205415612d335760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105e2565b8251603014612d9a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105e2565b612da385613263565b5f80612dea6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061344e565b5f82815260058601602052604090209193509150612e088282613c32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e35908590600401613d13565b6020604051808303815f875af1158015612e51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e759190613d45565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612eee57612eee613b66565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612f9783611715565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612bc160015f8051602061427083398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661304657604051631afcd79f60e31b815260040160405180910390fd5b565b613050612ffd565b613059816137f3565b6114766060820135608083013561307660c0850160a08601613a29565b61308660e0860160c087016141a4565b613814565b5f808251602e146130ae5760405162461bcd60e51b81526004016105e290614096565b5f805b60028110156130fd576130c581600161405c565b6130d0906008613ee8565b61ffff168582815181106130e6576130e661406f565b016020015160f81c901b91909117906001016130b1565b5061ffff8116156131205760405162461bcd60e51b81526004016105e2906140df565b5f805b600481101561317b5761313781600361405c565b613142906008613ee8565b63ffffffff1686613154836002614083565b815181106131645761316461406f565b016020015160f81c901b9190911790600101613123565b5063ffffffff81166004146131a25760405162461bcd60e51b81526004016105e290614122565b5f805b60208110156131f7576131b981601f61405c565b6131c4906008613ee8565b876131d0836006614083565b815181106131e0576131e061406f565b016020015160f81c901b91909117906001016131a5565b505f805b60088110156132565761320f81600761405c565b61321a906008613ee8565b6001600160401b03168861322f836026614083565b8151811061323f5761323f61406f565b016020015160f81c901b91909117906001016131fb565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142508339815191529060ff165f036132a1575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132e9908361405c565b10613305576001600160401b0384166040830152808252613324565b83826040018181516133179190614169565b6001600160401b03169052505b5f82602001518360400151606461333b91906141bf565b61334591906141ea565b600285015490915060ff90811690821611156133c05760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105e2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061427083398151915280546001190161343557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061427083398151915255565b5f60608260800151516030146134b85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105e2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561352f576134ef81600161405c565b6134fa906008613ee8565b5081515f908390839081106135115761351161406f565b60200101906001600160f81b03191690815f1a9053506001016134db565b505f5b600481101561358d5761354681600361405c565b613551906008613ee8565b505f8261355f836002614083565b8151811061356f5761356f61406f565b60200101906001600160f81b03191690815f1a905350600101613532565b505f5b60208110156135ea57845181602081106135ac576135ac61406f565b1a60f81b826135bc836006614083565b815181106135cc576135cc61406f565b60200101906001600160f81b03191690815f1a905350600101613590565b505f5b602081101561364a578460200151816020811061360c5761360c61406f565b1a60f81b8261361c836026614083565b8151811061362c5761362c61406f565b60200101906001600160f81b03191690815f1a9053506001016135ed565b505f5b60088110156136be5761366181600761405c565b61366c906008613ee8565b60ff1685604001516001600160401b0316901c60f81b828260466136909190614083565b815181106136a0576136a061406f565b60200101906001600160f81b03191690815f1a90535060010161364d565b505f5b603081101561372957846080015181815181106136e0576136e061406f565b01602001516001600160f81b031916826136fb83604e614083565b8151811061370b5761370b61406f565b60200101906001600160f81b03191690815f1a9053506001016136c1565b505f5b600881101561379b5761374081600761405c565b61374b906008613ee8565b60608601516001600160401b0390811691161c60f81b8261376d83607e614083565b8151811061377d5761377d61406f565b60200101906001600160f81b03191690815f1a90535060010161372c565b506002816040516137ac9190614189565b602060405180830381855afa1580156137c7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137ea9190613d45565b94909350915050565b6137fb612ffd565b61380361386f565b61380b61387f565b61147681613887565b61381c612ffd565b5f5f80516020614230833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613877612ffd565b6130466138f3565b613046612ffd565b61388f612ffd565b80355f8051602061425083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138d9606083016040840161420f565b600291909101805460ff191660ff90921691909117905550565b61343b612ffd565b50805461390790613bb5565b5f825580601f10613916575050565b601f0160209004905f5260205f209081019061147691905b80821115613941575f815560010161392e565b5090565b5f60e08284031215613955575f80fd5b50919050565b8015158114611476575f80fd5b803563ffffffff8116811461397b575f80fd5b919050565b5f805f60608486031215613992575f80fd5b8335925060208401356139a48161395b565b91506139b260408501613968565b90509250925092565b5f602082840312156139cb575f80fd5b5035919050565b5f602082840312156139e2575f80fd5b61145e82613968565b5f80604083850312156139fc575f80fd5b613a0583613968565b946020939093013593505050565b80356001600160401b038116811461397b575f80fd5b5f60208284031215613a39575f80fd5b61145e82613a13565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a7857613a78613a42565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613aa657613aa6613a42565b604052919050565b5f6001600160401b03821115613ac657613ac6613a42565b50601f01601f191660200190565b5f805f60608486031215613ae6575f80fd5b83359250613af660208501613a13565b915060408401356001600160401b03811115613b10575f80fd5b8401601f81018613613b20575f80fd5b8035613b33613b2e82613aae565b613a7e565b818152876020838501011115613b47575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613bae57613bae613b7a565b5092915050565b600181811c90821680613bc957607f821691505b60208210810361395557634e487b7160e01b5f52602260045260245ffd5b601f821115610a0b57805f5260205f20601f840160051c81016020851015613c0c5750805b601f840160051c820191505b81811015613c2b575f8155600101613c18565b5050505050565b81516001600160401b03811115613c4b57613c4b613a42565b613c5f81613c598454613bb5565b84613be7565b602080601f831160018114613c92575f8415613c7b5750858301515b5f19600386901b1c1916600185901b178555613ce9565b5f85815260208120601f198616915b82811015613cc057888601518255948401946001909101908401613ca1565b5085821015613cdd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613d0b578181015183820152602001613cf3565b50505f910152565b602081525f8251806020840152613d31816040850160208701613cf1565b601f01601f19169190910160400192915050565b5f60208284031215613d55575f80fd5b5051919050565b5f60208083525f8454613d6e81613bb5565b806020870152604060018084165f8114613d8f5760018114613dab57613dd8565b60ff19851660408a0152604084151560051b8a01019550613dd8565b895f5260205f205f5b85811015613dcf5781548b8201860152908301908801613db4565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613e0857613e08613de6565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b8082028115828204841417610a8d57610a8d613b7a565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611476575f80fd5b805161397b8161395b565b5f8060408385031215613f76575f80fd5b82516001600160401b0380821115613f8c575f80fd5b9084019060608287031215613f9f575f80fd5b613fa7613a56565b82518152602080840151613fba81613f46565b82820152604084015183811115613fcf575f80fd5b80850194505087601f850112613fe3575f80fd5b83519250613ff3613b2e84613aae565b8381528882858701011115614006575f80fd5b61401584838301848801613cf1565b8060408401525081955061402a818801613f5a565b9450505050509250929050565b5f6001600160401b0380831681810361405257614052613b7a565b6001019392505050565b81810381811115610a8d57610a8d613b7a565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a8d57610a8d613b7a565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613bae57613bae613b7a565b5f825161419a818460208701613cf1565b9190910192915050565b5f602082840312156141b4575f80fd5b813561145e81613f46565b6001600160401b038181168382160280821691908281146141e2576141e2613b7a565b505092915050565b5f6001600160401b038084168061420357614203613de6565b92169190910492915050565b5f6020828403121561421f575f80fd5b813560ff8116811461145e575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161435438038061435483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142078061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613890565b610389565b005b348015610134575f80fd5b506101276101433660046138cb565b61046b565b348015610153575f80fd5b50610127610162366004613906565b6108a1565b348015610172575f80fd5b506101b1610181366004613906565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613906565b6109fd565b3480156101ee575f80fd5b506102026101fd366004613906565b610a6a565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b5061012761023436600461391d565b610a80565b348015610244575f80fd5b50610127610253366004613936565b610ddc565b348015610263575f80fd5b506101b1610272366004613974565b610f81565b348015610282575f80fd5b50610202610291366004613906565b610f9a565b3480156102a1575f80fd5b506101276102b0366004613906565b610fae565b3480156102c0575f80fd5b506101276102cf3660046138cb565b61101b565b3480156102df575f80fd5b506101276102ee366004613936565b611036565b3480156102fe575f80fd5b5061012761030d36600461391d565b61119f565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613906565b611353565b6101b1610371366004613906565b611422565b6101b1610384366004613a1f565b61142e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611452565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061417b8339815191529184156104bd576104ba8285611466565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613ab1565b600481111561050057610500613ab1565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613ab1565b146105eb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f6105f584611702565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561064257610642613ab1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107148561177d565b905082606001516001600160401b031681608001516001600160401b03161161078b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105e2565b5f836060015182608001516107a09190613ad9565b90506107ac8682611878565b5f6107b88785846118b5565b5f8c815260058a01602052604090209091506107d48282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610801908590600401613c5e565b6020604051808303815f875af115801561081d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108419190613c90565b604080516001600160401b03868116825288166020820152428183015290519192508d9183918b917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061419b8339815191529291906108e990613b00565b905011801561091b575060035f83815260078301602052604090205460ff16600581111561091957610919613ab1565b145b61097f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105e2565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109b89190600401613ca7565b6020604051808303815f875af11580156109d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f89190613c90565b505050565b610a0681611ad2565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061417b833981519152916005600160991b019163ee5b48eb916109b891600401613ca7565b5f610a7a64e8d4a5100083613d45565b92915050565b5f8051602061419b8339815191525f610a9883611bb7565b90505f80610aa98360400151611d98565b915091508015610b0e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105e2565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610b3f57610b3f613ab1565b6005811115610b5057610b50613ab1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610bc957610bc9613ab1565b1480610be75750600182516005811115610be557610be5613ab1565b145b610c465760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105e2565b600382516005811115610c5b57610c5b613ab1565b03610c8257505f8381526006860160205260408120600491610c7d9190613846565b610c86565b5060055b6020808301515f90815260088801909152604081205581816005811115610caf57610caf613ab1565b90816005811115610cc257610cc2613ab1565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610cf657610cf6613ab1565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610da957610da9613ab1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f8051602061417b8339815191525f610df484611bb7565b90505f80610e058360400151611f39565b5091509150610e1385612174565b5f8581526004850160205260408120610e2b91613846565b5f610e358361177d565b9050816001600160401b031681606001516001600160401b03161015610e6d5760405162461bcd60e51b81526004016105e290613d58565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610eb25760405162461bcd60e51b81526004016105e290613d9a565b60015f87815260038701602052604090205460ff166004811115610ed857610ed8613ab1565b14610ef55760405162461bcd60e51b81526004016105e290613de3565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a7a6001600160401b03831664e8d4a51000613e33565b5f610fa48261177d565b6080015192915050565b610fb781612174565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061417b833981519152916005600160991b019163ee5b48eb916109b891600401613ca7565b811561102d5761102b8382611466565b505b6109f883612260565b5f8051602061417b8339815191525f61104e84611bb7565b90505f8061105f8360400151611f39565b509150915061106d85611ad2565b5f858152600585016020526040812061108591613846565b5f61108f8361177d565b9050816001600160401b031681606001516001600160401b031610156110c75760405162461bcd60e51b81526004016105e290613d58565b5f8681526003808701602052604090912001546001600160401b03808416911611156111055760405162461bcd60e51b81526004016105e290613d9a565b60035f87815260038701602052604090205460ff16600481111561112b5761112b613ab1565b146111485760405162461bcd60e51b81526004016105e290613de3565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f8051602061419b8339815191525f6111b783611bb7565b90505f806111c88360400151611d98565b915091508061122a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105e2565b5f8281526005850160205260408120805461124490613b00565b9050118015611276575060015f83815260078601602052604090205460ff16600581111561127457611274613ab1565b145b6112925760405162461bcd60e51b81526004016105e290613e4a565b5f82815260058501602052604081206112aa91613846565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061419b83398151915292919061139b90613b00565b90501180156113cd575060015f83815260078301602052604090205460ff1660058111156113cb576113cb613ab1565b145b6113e95760405162461bcd60e51b81526004016105e290613e4a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109b89190600401613ca7565b5f610a7a8233346125f1565b5f8061143934612a6a565b905061144785828686612b14565b9150505b9392505050565b61145a612f48565b61146381612f93565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114b1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114d89190810190613eb0565b915091508061153b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105e2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a29190613c90565b8251146116065760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105e2565b60208201516001600160a01b03161561167c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105e2565b5f8061168b8460400151612fd6565b915091508187146116f85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105e2565b9695505050505050565b5f8181525f805160206141db8339815191526020526040812060020180545f8051602061419b83398151915291600160a01b9091046001600160401b0316908190601461174e83613f82565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206141db83398151915290528390208351918201909352825491925f8051602061419b83398151915292829060ff1660058111156117fd576117fd613ab1565b600581111561180e5761180e613ab1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f9182525f805160206141db8339815191526020526040909120600301805467ffffffffffffffff19166001600160401b03909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561192e576118ee816001613fa7565b6118f9906008613e33565b5081515f9083908390811061191057611910613fba565b60200101906001600160f81b03191690815f1a9053506001016118da565b505f5b600481101561199157611945816003613fa7565b611950906008613e33565b6001901c60f81b82611963836002613fce565b8151811061197357611973613fba565b60200101906001600160f81b03191690815f1a905350600101611931565b505f5b60208110156119f3576119a881601f613fa7565b6119b3906008613e33565b86901c60f81b826119c5836006613fce565b815181106119d5576119d5613fba565b60200101906001600160f81b03191690815f1a905350600101611994565b505f5b6008811015611a5e57611a0a816007613fa7565b611a15906008613e33565b6001600160401b038616901c60f81b82611a30836026613fce565b81518110611a4057611a40613fba565b60200101906001600160f81b03191690815f1a9053506001016119f6565b505f5b6008811015611ac957611a75816007613fa7565b611a80906008613e33565b6001600160401b038516901c60f81b82611a9b83602e613fce565b81518110611aab57611aab613fba565b60200101906001600160f81b03191690815f1a905350600101611a61565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061417b833981519152929190611b1a90613b00565b9050118015611b4c575060035f83815260038301602052604090205460ff166004811115611b4a57611b4a613ab1565b145b611bb35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016105e2565b5050565b60408051606080820183525f8083526020830181905292820152905f8051602061419b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c2c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c539190810190613eb0565b9150915080611cba5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105e2565b8254825114611d1d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105e2565b60208201516001600160a01b031615611d905760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105e2565b509392505050565b5f808251602714611dbb5760405162461bcd60e51b81526004016105e290613fe1565b5f805b6002811015611e0a57611dd2816001613fa7565b611ddd906008613e33565b61ffff16858281518110611df357611df3613fba565b016020015160f81c901b9190911790600101611dbe565b5061ffff811615611e2d5760405162461bcd60e51b81526004016105e29061402a565b5f805b6004811015611e8857611e44816003613fa7565b611e4f906008613e33565b63ffffffff1686611e61836002613fce565b81518110611e7157611e71613fba565b016020015160f81c901b9190911790600101611e30565b5063ffffffff8116600214611eaf5760405162461bcd60e51b81526004016105e29061406d565b5f805b6020811015611f0457611ec681601f613fa7565b611ed1906008613e33565b87611edd836006613fce565b81518110611eed57611eed613fba565b016020015160f81c901b9190911790600101611eb2565b505f86602681518110611f1957611f19613fba565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611f5d5760405162461bcd60e51b81526004016105e290613fe1565b5f805b6002811015611fac57611f74816001613fa7565b611f7f906008613e33565b61ffff16868281518110611f9557611f95613fba565b016020015160f81c901b9190911790600101611f60565b5061ffff811615611fcf5760405162461bcd60e51b81526004016105e29061402a565b5f805b600481101561202a57611fe6816003613fa7565b611ff1906008613e33565b63ffffffff1687612003836002613fce565b8151811061201357612013613fba565b016020015160f81c901b9190911790600101611fd2565b5063ffffffff81166003146120515760405162461bcd60e51b81526004016105e29061406d565b5f805b60208110156120a65761206881601f613fa7565b612073906008613e33565b8861207f836006613fce565b8151811061208f5761208f613fba565b016020015160f81c901b9190911790600101612054565b505f805b6008811015612105576120be816007613fa7565b6120c9906008613e33565b6001600160401b0316896120de836026613fce565b815181106120ee576120ee613fba565b016020015160f81c901b91909117906001016120aa565b505f805b60088110156121645761211d816007613fa7565b612128906008613e33565b6001600160401b03168a61213d83602e613fce565b8151811061214d5761214d613fba565b016020015160f81c901b9190911790600101612109565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061417b8339815191529291906121bc90613b00565b90501180156121ee575060015f83815260038301602052604090205460ff1660048111156121ec576121ec613ab1565b145b611bb35760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016105e2565b5f8181525f805160206141db8339815191526020526040808220815160e0810190925280545f8051602061419b83398151915293929190829060ff1660058111156122ad576122ad613ab1565b60058111156122be576122be613ab1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561233857612338613ab1565b146123945760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105e2565b60408101516001600160a01b0316336001600160a01b03161461240e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105e2565b61241b81608001516131ae565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561245f5761245f613ab1565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125138461250d81611702565b5f6118b5565b5f858152600685016020526040902090915061252f8282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061255c908590600401613c5e565b6020604051808303815f875af1158015612578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061259c9190613c90565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6125fa61334f565b5f61260483610a6a565b90505f8051602061417b8339815191525f61261e8761177d565b905060028151600581111561263557612635613ab1565b146126945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105e2565b5f8382608001516126a591906140b4565b90506126b18882611878565b5f6126bb89611702565b90505f60028a8a846040516020016127059392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f198184030181529082905261271f916140d4565b602060405180830381855afa15801561273a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061275d9190613c90565b5f8181526003870160205260409020600201549091506001600160401b0316156127e35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b60648201526084016105e2565b6127ec866131ae565b5f6127f88b84866118b5565b5f83815260048801602052604090209091506128148282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612841908590600401613c5e565b6020604051808303815f875af115801561285d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128819190613c90565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561293057612930613ab1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606080850151600285018054608088015160a089015160c08a01516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909501516003909401805467ffffffffffffffff19169486169490941790935580518c851681528985169281019290925292871692810192909252849183918f917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a45090965050505050505061144b60015f805160206141bb83398151915255565b5f5f8051602061417b8339815191528282612a8482610a6a565b83549091506001600160401b03821610801590612aae57508260010154816001600160401b031611155b612b0c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105e2565b949350505050565b5f612b1d61334f565b5f8051602061419b833981519152426001600160401b038516118015612b5757506001600160401b038416612b55426202a300613fce565b115b612bb95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105e2565b85612c105760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105e2565b5f86815260088201602052604090205415612c7e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105e2565b8251603014612ce55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105e2565b612cee856131ae565b5f80612d356040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613399565b5f82815260058601602052604090209193509150612d538282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d80908590600401613c5e565b6020604051808303815f875af1158015612d9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dc09190613c90565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612e3957612e39613ab1565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612ee283611702565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b0c60015f805160206141bb83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612f9157604051631afcd79f60e31b815260040160405180910390fd5b565b612f9b612f48565b612fa48161373e565b61146360608201356080830135612fc160c0850160a08601613974565b612fd160e0860160c087016140ef565b61375f565b5f808251602e14612ff95760405162461bcd60e51b81526004016105e290613fe1565b5f805b600281101561304857613010816001613fa7565b61301b906008613e33565b61ffff1685828151811061303157613031613fba565b016020015160f81c901b9190911790600101612ffc565b5061ffff81161561306b5760405162461bcd60e51b81526004016105e29061402a565b5f805b60048110156130c657613082816003613fa7565b61308d906008613e33565b63ffffffff168661309f836002613fce565b815181106130af576130af613fba565b016020015160f81c901b919091179060010161306e565b5063ffffffff81166004146130ed5760405162461bcd60e51b81526004016105e29061406d565b5f805b60208110156131425761310481601f613fa7565b61310f906008613e33565b8761311b836006613fce565b8151811061312b5761312b613fba565b016020015160f81c901b91909117906001016130f0565b505f805b60088110156131a15761315a816007613fa7565b613165906008613e33565b6001600160401b03168861317a836026613fce565b8151811061318a5761318a613fba565b016020015160f81c901b9190911790600101613146565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061419b8339815191529060ff165f036131ec575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132349083613fa7565b10613250576001600160401b038416604083015280825261326f565b838260400181815161326291906140b4565b6001600160401b03169052505b5f826020015183604001516064613286919061410a565b6132909190614135565b600285015490915060ff908116908216111561330b5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105e2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206141bb83398151915280546001190161338057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206141bb83398151915255565b5f60608260800151516030146134035760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105e2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561347a5761343a816001613fa7565b613445906008613e33565b5081515f9083908390811061345c5761345c613fba565b60200101906001600160f81b03191690815f1a905350600101613426565b505f5b60048110156134d857613491816003613fa7565b61349c906008613e33565b505f826134aa836002613fce565b815181106134ba576134ba613fba565b60200101906001600160f81b03191690815f1a90535060010161347d565b505f5b602081101561353557845181602081106134f7576134f7613fba565b1a60f81b82613507836006613fce565b8151811061351757613517613fba565b60200101906001600160f81b03191690815f1a9053506001016134db565b505f5b6020811015613595578460200151816020811061355757613557613fba565b1a60f81b82613567836026613fce565b8151811061357757613577613fba565b60200101906001600160f81b03191690815f1a905350600101613538565b505f5b6008811015613609576135ac816007613fa7565b6135b7906008613e33565b60ff1685604001516001600160401b0316901c60f81b828260466135db9190613fce565b815181106135eb576135eb613fba565b60200101906001600160f81b03191690815f1a905350600101613598565b505f5b6030811015613674578460800151818151811061362b5761362b613fba565b01602001516001600160f81b0319168261364683604e613fce565b8151811061365657613656613fba565b60200101906001600160f81b03191690815f1a90535060010161360c565b505f5b60088110156136e65761368b816007613fa7565b613696906008613e33565b60608601516001600160401b0390811691161c60f81b826136b883607e613fce565b815181106136c8576136c8613fba565b60200101906001600160f81b03191690815f1a905350600101613677565b506002816040516136f791906140d4565b602060405180830381855afa158015613712573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137359190613c90565b94909350915050565b613746612f48565b61374e6137ba565b6137566137ca565b611463816137d2565b613767612f48565b5f5f8051602061417b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6137c2612f48565b612f9161383e565b612f91612f48565b6137da612f48565b80355f8051602061419b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613824606083016040840161415a565b600291909101805460ff191660ff90921691909117905550565b613386612f48565b50805461385290613b00565b5f825580601f10613861575050565b601f0160209004905f5260205f209081019061146391905b8082111561388c575f8155600101613879565b5090565b5f60e082840312156138a0575f80fd5b50919050565b8015158114611463575f80fd5b803563ffffffff811681146138c6575f80fd5b919050565b5f805f606084860312156138dd575f80fd5b8335925060208401356138ef816138a6565b91506138fd604085016138b3565b90509250925092565b5f60208284031215613916575f80fd5b5035919050565b5f6020828403121561392d575f80fd5b61144b826138b3565b5f8060408385031215613947575f80fd5b613950836138b3565b946020939093013593505050565b80356001600160401b03811681146138c6575f80fd5b5f60208284031215613984575f80fd5b61144b8261395e565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156139c3576139c361398d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139f1576139f161398d565b604052919050565b5f6001600160401b03821115613a1157613a1161398d565b50601f01601f191660200190565b5f805f60608486031215613a31575f80fd5b83359250613a416020850161395e565b915060408401356001600160401b03811115613a5b575f80fd5b8401601f81018613613a6b575f80fd5b8035613a7e613a79826139f9565b6139c9565b818152876020838501011115613a92575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613af957613af9613ac5565b5092915050565b600181811c90821680613b1457607f821691505b6020821081036138a057634e487b7160e01b5f52602260045260245ffd5b601f8211156109f857805f5260205f20601f840160051c81016020851015613b575750805b601f840160051c820191505b81811015613b76575f8155600101613b63565b5050505050565b81516001600160401b03811115613b9657613b9661398d565b613baa81613ba48454613b00565b84613b32565b602080601f831160018114613bdd575f8415613bc65750858301515b5f19600386901b1c1916600185901b178555613c34565b5f85815260208120601f198616915b82811015613c0b57888601518255948401946001909101908401613bec565b5085821015613c2857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613c56578181015183820152602001613c3e565b50505f910152565b602081525f8251806020840152613c7c816040850160208701613c3c565b601f01601f19169190910160400192915050565b5f60208284031215613ca0575f80fd5b5051919050565b5f60208083525f8454613cb981613b00565b806020870152604060018084165f8114613cda5760018114613cf657613d23565b60ff19851660408a0152604084151560051b8a01019550613d23565b895f5260205f205f5b85811015613d1a5781548b8201860152908301908801613cff565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613d5357613d53613d31565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b8082028115828204841417610a7a57610a7a613ac5565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611463575f80fd5b80516138c6816138a6565b5f8060408385031215613ec1575f80fd5b82516001600160401b0380821115613ed7575f80fd5b9084019060608287031215613eea575f80fd5b613ef26139a1565b82518152602080840151613f0581613e91565b82820152604084015183811115613f1a575f80fd5b80850194505087601f850112613f2e575f80fd5b83519250613f3e613a79846139f9565b8381528882858701011115613f51575f80fd5b613f6084838301848801613c3c565b80604084015250819550613f75818801613ea5565b9450505050509250929050565b5f6001600160401b03808316818103613f9d57613f9d613ac5565b6001019392505050565b81810381811115610a7a57610a7a613ac5565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a7a57610a7a613ac5565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613af957613af9613ac5565b5f82516140e5818460208701613c3c565b9190910192915050565b5f602082840312156140ff575f80fd5b813561144b81613e91565b6001600160401b0381811683821602808216919082811461412d5761412d613ac5565b505092915050565b5f6001600160401b038084168061414e5761414e613d31565b92169190910492915050565b5f6020828403121561416a575f80fd5b813560ff8116811461144b575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 1e19b1611..06cd6f52d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -157,8 +157,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validator.status == ValidatorStatus.Active, "PoSValidatorManager: validator not active" ); // Update the validator weight - validator.weight += weight; - _setValidator(validationID, validator); + uint64 newValidatorWeight = validator.weight + weight; + _setValidatorWeight(validationID, newValidatorWeight); uint64 nonce = _getAndIncrementNonce(validationID); bytes32 delegationID = sha256(abi.encodePacked(validationID, delegator, nonce)); @@ -173,7 +173,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); + .packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); $._pendingRegisterDelegatorMessages[delegationID] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); @@ -194,7 +194,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager setWeightMessageID: messageID, delegationID: delegationID, delegatorWeight: weight, - validatorWeight: validator.weight, + validatorWeight: newValidatorWeight, nonce: nonce }); return delegationID; @@ -271,12 +271,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _getValidator(validationID); require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); - validator.weight -= delegator.weight; - _setValidator(validationID, validator); + uint64 newValidatorWeight = validator.weight - delegator.weight; + _setValidatorWeight(validationID, newValidatorWeight); // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, nonce, validator.weight); + .packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); $._pendingEndDelegatorMessages[delegationID] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); @@ -284,7 +284,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validationID: validationID, setWeightMessageID: messageID, delegationID: delegationID, - validatorWeight: validator.weight, + validatorWeight: newValidatorWeight, nonce: nonce, endTime: block.timestamp }); diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index e8d8923de..b1f16d0b6 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -378,8 +378,8 @@ abstract contract ValidatorManager is return $._validationPeriods[validationID]; } - function _setValidator(bytes32 validationID, Validator memory validator) internal { + function _setValidatorWeight(bytes32 validationID, uint64 weight) internal { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - $._validationPeriods[validationID] = validator; + $._validationPeriods[validationID].weight = weight; } } From 55ad8a74baa0356b08422096e5b4f947e1bf2825 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 5 Sep 2024 10:57:20 -0400 Subject: [PATCH 198/545] Fixup --- .../tests/PoSValidatorManagerTests.t.sol | 44 ++++++++++++++----- 1 file changed, 32 insertions(+), 12 deletions(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index b4ca8c43b..06fa47099 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -23,10 +23,15 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); + function newNodeID() public returns (bytes32) { + validatorCounter++; + return sha256(new bytes(validatorCounter)); + } + function registerValidators(uint64 n) public { - for (uint64 i = validatorCounter; validatorCounter <= i + n; validatorCounter++) { + for (uint64 i = 0; i < n; i++) { _setUpCompleteValidatorRegistration({ - nodeID: sha256(new bytes(validatorCounter)), + nodeID: newNodeID(), subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, @@ -38,27 +43,42 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testInvalidChurnRegistration() public { // First registration should work - _setUpCompleteValidatorRegistration({ - nodeID: sha256(new bytes(1)), - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_CHURN_TRACKER_START_TIME + 1 days, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_CHURN_TRACKER_START_TIME - 1 - }); + registerValidators(1); vm.warp(DEFAULT_CHURN_TRACKER_START_TIME + 1); - bytes32 nodeID = sha256(new bytes(2)); _beforeSend(DEFAULT_WEIGHT); - uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); + + bytes32 nodeID = newNodeID(); vm.expectRevert(_formatErrorMessage("maximum hourly churn rate exceeded")); _initializeValidatorRegistrationWithValue( nodeID, DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value ); } + // function testValidChurnRegistration() public { + // // First registration should work + // _setUpCompleteValidatorRegistration({ + // nodeID: sha256(new bytes(1)), + // subnetID: DEFAULT_SUBNET_ID, + // weight: DEFAULT_WEIGHT, + // registrationExpiry: DEFAULT_CHURN_TRACKER_START_TIME + 1 days, + // blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + // registrationTimestamp: DEFAULT_CHURN_TRACKER_START_TIME - 1 + // }); + + // vm.warp(DEFAULT_CHURN_TRACKER_START_TIME + 1); + + // _beforeSend(DEFAULT_WEIGHT); + // uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); + + // vm.expectRevert(_formatErrorMessage("maximum hourly churn rate exceeded")); + // _initializeValidatorRegistrationWithValue( + // sha256(new bytes(2)), DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value + // ); + // } + function testInitializeEndValidationWithUptimeProof() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, From 57256e9b64a0fea2d794aab181eed9d164e7610b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 10:02:14 -0500 Subject: [PATCH 199/545] require init end callable by owner --- contracts/staking/PoSValidatorManager.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 06cd6f52d..cb915ea92 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -259,6 +259,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Ensure the delegator is active Delegator memory delegator = $._delegatorStakes[delegationID]; + require( + delegator.owner == _msgSender(), "PoSValidatorManager: delegation not owned by sender" + ); require( delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegator not active" ); From 7616bb51b107b65e7335cac76f0007071960d52d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 11:08:38 -0500 Subject: [PATCH 200/545] revamp delegation events --- .../ERC20TokenStakingManager.go | 179 +++++++++--------- .../NativeTokenStakingManager.go | 179 +++++++++--------- contracts/staking/PoSValidatorManager.sol | 47 ++--- .../interfaces/IPoSValidatorManager.sol | 38 ++-- .../tests/ERC20TokenStakingManagerTests.t.sol | 4 +- .../NativeTokenStakingManagerTests.t.sol | 6 +- .../tests/PoSValidatorManagerTests.t.sol | 96 +++++----- 7 files changed, 276 insertions(+), 273 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 8af3e812e..ef0e5baa2 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161472c38038061472c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145df8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613c1b565b6102d6565b005b610128610138366004613c56565b61070c565b61017b61014b366004613c56565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613c56565b610868565b6101286101af366004613c81565b6108d5565b6101c76101c2366004613c56565b6109b9565b6040516001600160401b039091168152602001610185565b6101286101ed366004613cbe565b6109cf565b610128610200366004613cd7565b610d2b565b61017b610213366004613d15565b610ed0565b6101c7610226366004613c56565b610ee9565b610128610239366004613c56565b610efd565b61012861024c366004613c1b565b610f6a565b61017b61025f366004613dc0565b610f85565b610128610272366004613cd7565b610faa565b61017b610285366004613e5c565b611113565b610128610298366004613cbe565b611126565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613c56565b6112da565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145538339815191529184156103285761032582856113a9565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613e7c565b600481111561036b5761036b613e7c565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613e7c565b146104565760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f61046084611645565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104ad576104ad613e7c565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61057f856116c0565b905082606001516001600160401b031681608001516001600160401b0316116105f65760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161044d565b5f8360600151826080015161060b9190613ea4565b905061061786826117bb565b5f6106238785846117f8565b5f8c815260058a016020526040902090915061063f8282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061066c90859060040161402f565b6020604051808303815f875af1158015610688573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ac9190614061565b604080516001600160401b03868116825288166020820152428183015290519192508d9183918b917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061457383398151915292919061075490613ecb565b9050118015610786575060035f83815260078301602052604090205460ff16600581111561078457610784613e7c565b145b6107ea5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161044d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108239190600401614078565b6020604051808303815f875af115801561083f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108639190614061565b505050565b61087181611a15565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614553833981519152916005600160991b019163ee5b48eb9161082391600401614078565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061091e575080546001600160401b03808416911610155b1561093c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109678484611afa565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109c964e8d4a5100083614116565b92915050565b5f805160206145738339815191525f6109e783611b14565b90505f806109f88360400151611cf5565b915091508015610a5d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044d565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610a8e57610a8e613e7c565b6005811115610a9f57610a9f613e7c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610b1857610b18613e7c565b1480610b365750600182516005811115610b3457610b34613e7c565b145b610b955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044d565b600382516005811115610baa57610baa613e7c565b03610bd157505f8381526006860160205260408120600491610bcc9190613bac565b610bd5565b5060055b6020808301515f90815260088801909152604081205581816005811115610bfe57610bfe613e7c565b90816005811115610c1157610c11613e7c565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610c4557610c45613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610cf857610cf8613e7c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145538339815191525f610d4384611b14565b90505f80610d548360400151611e96565b5091509150610d62856120d1565b5f8581526004850160205260408120610d7a91613bac565b5f610d84836116c0565b9050816001600160401b031681606001516001600160401b03161015610dbc5760405162461bcd60e51b815260040161044d90614129565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e015760405162461bcd60e51b815260040161044d9061416b565b60015f87815260038701602052604090205460ff166004811115610e2757610e27613e7c565b14610e445760405162461bcd60e51b815260040161044d906141b4565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109c96001600160401b03831664e8d4a51000614204565b5f610ef3826116c0565b6080015192915050565b610f06816120d1565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614553833981519152916005600160991b019163ee5b48eb9161082391600401614078565b8115610f7c57610f7a83826113a9565b505b610863836121bd565b5f80610f908661254e565b9050610f9e858286866125fb565b9150505b949350505050565b5f805160206145538339815191525f610fc284611b14565b90505f80610fd38360400151611e96565b5091509150610fe185611a15565b5f8581526005850160205260408120610ff991613bac565b5f611003836116c0565b9050816001600160401b031681606001516001600160401b0316101561103b5760405162461bcd60e51b815260040161044d90614129565b5f8681526003808701602052604090912001546001600160401b03808416911611156110795760405162461bcd60e51b815260040161044d9061416b565b60035f87815260038701602052604090205460ff16600481111561109f5761109f613e7c565b146110bc5760405162461bcd60e51b815260040161044d906141b4565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61111f833384612a2f565b9392505050565b5f805160206145738339815191525f61113e83611b14565b90505f8061114f8360400151611cf5565b91509150806111b15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044d565b5f828152600585016020526040812080546111cb90613ecb565b90501180156111fd575060015f83815260078601602052604090205460ff1660058111156111fb576111fb613e7c565b145b6112195760405162461bcd60e51b815260040161044d9061421b565b5f828152600585016020526040812061123191613bac565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061457383398151915292919061132290613ecb565b9050118015611354575060015f83815260078301602052604090205460ff16600581111561135257611352613e7c565b145b6113705760405162461bcd60e51b815260040161044d9061421b565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108239190600401614078565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113f4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261141b919081019061426d565b915091508061147e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161044d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e59190614061565b8251146115495760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161044d565b60208201516001600160a01b0316156115bf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161044d565b5f806115ce8460400151612eab565b9150915081871461163b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161044d565b9695505050505050565b5f8181525f805160206145b38339815191526020526040812060020180545f8051602061457383398151915291600160a01b9091046001600160401b031690819060146116918361433f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206145b383398151915290528390208351918201909352825491925f8051602061457383398151915292829060ff16600581111561174057611740613e7c565b600581111561175157611751613e7c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f9182525f805160206145b38339815191526020526040909120600301805467ffffffffffffffff19166001600160401b03909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561187157611831816001614364565b61183c906008614204565b5081515f9083908390811061185357611853614377565b60200101906001600160f81b03191690815f1a90535060010161181d565b505f5b60048110156118d457611888816003614364565b611893906008614204565b6001901c60f81b826118a683600261438b565b815181106118b6576118b6614377565b60200101906001600160f81b03191690815f1a905350600101611874565b505f5b6020811015611936576118eb81601f614364565b6118f6906008614204565b86901c60f81b8261190883600661438b565b8151811061191857611918614377565b60200101906001600160f81b03191690815f1a9053506001016118d7565b505f5b60088110156119a15761194d816007614364565b611958906008614204565b6001600160401b038616901c60f81b8261197383602661438b565b8151811061198357611983614377565b60200101906001600160f81b03191690815f1a905350600101611939565b505f5b6008811015611a0c576119b8816007614364565b6119c3906008614204565b6001600160401b038516901c60f81b826119de83602e61438b565b815181106119ee576119ee614377565b60200101906001600160f81b03191690815f1a9053506001016119a4565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614553833981519152929190611a5d90613ecb565b9050118015611a8f575060035f83815260038301602052604090205460ff166004811115611a8d57611a8d613e7c565b145b611af65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b606482015260840161044d565b5050565b611b02613083565b611b0b826130ce565b611af681613114565b60408051606080820183525f8083526020830181905292820152905f805160206145738339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611b89573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611bb0919081019061426d565b9150915080611c175760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161044d565b8254825114611c7a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044d565b60208201516001600160a01b031615611ced5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044d565b509392505050565b5f808251602714611d185760405162461bcd60e51b815260040161044d9061439e565b5f805b6002811015611d6757611d2f816001614364565b611d3a906008614204565b61ffff16858281518110611d5057611d50614377565b016020015160f81c901b9190911790600101611d1b565b5061ffff811615611d8a5760405162461bcd60e51b815260040161044d906143e7565b5f805b6004811015611de557611da1816003614364565b611dac906008614204565b63ffffffff1686611dbe83600261438b565b81518110611dce57611dce614377565b016020015160f81c901b9190911790600101611d8d565b5063ffffffff8116600214611e0c5760405162461bcd60e51b815260040161044d9061442a565b5f805b6020811015611e6157611e2381601f614364565b611e2e906008614204565b87611e3a83600661438b565b81518110611e4a57611e4a614377565b016020015160f81c901b9190911790600101611e0f565b505f86602681518110611e7657611e76614377565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611eba5760405162461bcd60e51b815260040161044d9061439e565b5f805b6002811015611f0957611ed1816001614364565b611edc906008614204565b61ffff16868281518110611ef257611ef2614377565b016020015160f81c901b9190911790600101611ebd565b5061ffff811615611f2c5760405162461bcd60e51b815260040161044d906143e7565b5f805b6004811015611f8757611f43816003614364565b611f4e906008614204565b63ffffffff1687611f6083600261438b565b81518110611f7057611f70614377565b016020015160f81c901b9190911790600101611f2f565b5063ffffffff8116600314611fae5760405162461bcd60e51b815260040161044d9061442a565b5f805b602081101561200357611fc581601f614364565b611fd0906008614204565b88611fdc83600661438b565b81518110611fec57611fec614377565b016020015160f81c901b9190911790600101611fb1565b505f805b60088110156120625761201b816007614364565b612026906008614204565b6001600160401b03168961203b83602661438b565b8151811061204b5761204b614377565b016020015160f81c901b9190911790600101612007565b505f805b60088110156120c15761207a816007614364565b612085906008614204565b6001600160401b03168a61209a83602e61438b565b815181106120aa576120aa614377565b016020015160f81c901b9190911790600101612066565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061455383398151915292919061211990613ecb565b905011801561214b575060015f83815260038301602052604090205460ff16600481111561214957612149613e7c565b145b611af65760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e67000000000000000000606482015260840161044d565b5f8181525f805160206145b38339815191526020526040808220815160e0810190925280545f8051602061457383398151915293929190829060ff16600581111561220a5761220a613e7c565b600581111561221b5761221b613e7c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561229557612295613e7c565b146122f15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044d565b60408101516001600160a01b0316336001600160a01b03161461236b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161044d565b61237881608001516131c8565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123bc576123bc613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6124708461246a81611645565b5f6117f8565b5f858152600685016020526040902090915061248c8282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124b990859060040161402f565b6020604051808303815f875af11580156124d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124f99190614061565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145538339815191528161256784613369565b90505f612573826109b9565b83549091506001600160401b0382161080159061259d57508260010154816001600160401b031611155b610fa25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161044d565b5f61260461339f565b5f80516020614573833981519152426001600160401b03851611801561263e57506001600160401b03841661263c426202a30061438b565b115b6126a05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161044d565b856126f75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044d565b5f868152600882016020526040902054156127655760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161044d565b82516030146127cc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044d565b6127d5856131c8565b5f8061281c6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506133d6565b5f8281526005860160205260409020919350915061283a8282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061286790859060040161402f565b6020604051808303815f875af1158015612883573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128a79190614061565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff1916600183600581111561292057612920613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790556129c983611645565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610fa260015f8051602061459383398151915255565b5f612a3861339f565b5f612a456101c284613369565b90505f805160206145538339815191525f612a5f876116c0565b9050600281516005811115612a7657612a76613e7c565b14612ad55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161044d565b5f838260800151612ae69190614471565b9050612af288826117bb565b5f612afc89611645565b90505f60028a8a84604051602001612b469392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f1981840301815290829052612b6091614491565b602060405180830381855afa158015612b7b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612b9e9190614061565b5f8181526003870160205260409020600201549091506001600160401b031615612c245760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b606482015260840161044d565b612c2d866131c8565b5f612c398b84866117f8565b5f8381526004880160205260409020909150612c558282613f4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c8290859060040161402f565b6020604051808303815f875af1158015612c9e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cc29190614061565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d7157612d71613e7c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606080850151600285018054608088015160a089015160c08a01516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909501516003909401805467ffffffffffffffff19169486169490941790935580518c851681528985169281019290925292871692810192909252849183918f917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a45090965050505050505061111f60015f8051602061459383398151915255565b5f808251602e14612ece5760405162461bcd60e51b815260040161044d9061439e565b5f805b6002811015612f1d57612ee5816001614364565b612ef0906008614204565b61ffff16858281518110612f0657612f06614377565b016020015160f81c901b9190911790600101612ed1565b5061ffff811615612f405760405162461bcd60e51b815260040161044d906143e7565b5f805b6004811015612f9b57612f57816003614364565b612f62906008614204565b63ffffffff1686612f7483600261438b565b81518110612f8457612f84614377565b016020015160f81c901b9190911790600101612f43565b5063ffffffff8116600414612fc25760405162461bcd60e51b815260040161044d9061442a565b5f805b602081101561301757612fd981601f614364565b612fe4906008614204565b87612ff083600661438b565b8151811061300057613000614377565b016020015160f81c901b9190911790600101612fc5565b505f805b60088110156130765761302f816007614364565b61303a906008614204565b6001600160401b03168861304f83602661438b565b8151811061305f5761305f614377565b016020015160f81c901b919091179060010161301b565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130cc57604051631afcd79f60e31b815260040160405180910390fd5b565b6130d6613083565b6130df8161378e565b613111606082013560808301356130fc60c0850160a08601613d15565b61310c60e0860160c087016144ac565b6137af565b50565b61311c613083565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131a85760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161044d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145738339815191529060ff165f03613206575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061324e9083614364565b1061326a576001600160401b0384166040830152808252613289565b838260400181815161327c9190614471565b6001600160401b03169052505b5f8260200151836040015160646132a091906144c7565b6132aa91906144f2565b600285015490915060ff90811690821611156133255760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161044d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6109c9827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061380a565b5f805160206145938339815191528054600119016133d057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134405760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134b757613477816001614364565b613482906008614204565b5081515f9083908390811061349957613499614377565b60200101906001600160f81b03191690815f1a905350600101613463565b505f5b6004811015613515576134ce816003614364565b6134d9906008614204565b505f826134e783600261438b565b815181106134f7576134f7614377565b60200101906001600160f81b03191690815f1a9053506001016134ba565b505f5b6020811015613572578451816020811061353457613534614377565b1a60f81b8261354483600661438b565b8151811061355457613554614377565b60200101906001600160f81b03191690815f1a905350600101613518565b505f5b60208110156135d2578460200151816020811061359457613594614377565b1a60f81b826135a483602661438b565b815181106135b4576135b4614377565b60200101906001600160f81b03191690815f1a905350600101613575565b505f5b6008811015613646576135e9816007614364565b6135f4906008614204565b60ff1685604001516001600160401b0316901c60f81b82826046613618919061438b565b8151811061362857613628614377565b60200101906001600160f81b03191690815f1a9053506001016135d5565b505f5b60308110156136b1578460800151818151811061366857613668614377565b01602001516001600160f81b0319168261368383604e61438b565b8151811061369357613693614377565b60200101906001600160f81b03191690815f1a905350600101613649565b505f5b6008811015613723576136c8816007614364565b6136d3906008614204565b60608601516001600160401b0390811691161c60f81b826136f583607e61438b565b8151811061370557613705614377565b60200101906001600160f81b03191690815f1a9053506001016136b4565b506002816040516137349190614491565b602060405180830381855afa15801561374f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137729190614061565b94909350915050565b60015f8051602061459383398151915255565b613796613083565b61379e61396c565b6137a661397c565b61311181613984565b6137b7613083565b5f5f80516020614553833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613850573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138749190614061565b905061388b6001600160a01b0385163330866139f0565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156138cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138f39190614061565b90508181116139595760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161044d565b6139638282614364565b95945050505050565b613974613083565b6130cc613a50565b6130cc613083565b61398c613083565b80355f8051602061457383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139d66060830160408401614517565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613a4a908590613a58565b50505050565b61377b613083565b5f613a6c6001600160a01b03841683613ab9565b905080515f14158015613a90575080806020019051810190613a8e9190614537565b155b1561086357604051635274afe760e01b81526001600160a01b038416600482015260240161044d565b606061111f83835f845f80856001600160a01b03168486604051613add9190614491565b5f6040518083038185875af1925050503d805f8114613b17576040519150601f19603f3d011682016040523d82523d5f602084013e613b1c565b606091505b509150915061163b868383606082613b3c57613b3782613b83565b61111f565b8151158015613b5357506001600160a01b0384163b155b15613b7c57604051639996b31560e01b81526001600160a01b038516600482015260240161044d565b508061111f565b805115613b935780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613bb890613ecb565b5f825580601f10613bc7575050565b601f0160209004905f5260205f209081019061311191905b80821115613bf2575f8155600101613bdf565b5090565b8015158114613111575f80fd5b803563ffffffff81168114613c16575f80fd5b919050565b5f805f60608486031215613c2d575f80fd5b833592506020840135613c3f81613bf6565b9150613c4d60408501613c03565b90509250925092565b5f60208284031215613c66575f80fd5b5035919050565b6001600160a01b0381168114613111575f80fd5b5f80828403610100811215613c94575f80fd5b60e0811215613ca1575f80fd5b5082915060e0830135613cb381613c6d565b809150509250929050565b5f60208284031215613cce575f80fd5b61111f82613c03565b5f8060408385031215613ce8575f80fd5b613cf183613c03565b946020939093013593505050565b80356001600160401b0381168114613c16575f80fd5b5f60208284031215613d25575f80fd5b61111f82613cff565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d6457613d64613d2e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d9257613d92613d2e565b604052919050565b5f6001600160401b03821115613db257613db2613d2e565b50601f01601f191660200190565b5f805f8060808587031215613dd3575f80fd5b8435935060208501359250613dea60408601613cff565b915060608501356001600160401b03811115613e04575f80fd5b8501601f81018713613e14575f80fd5b8035613e27613e2282613d9a565b613d6a565b818152886020838501011115613e3b575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613e6d575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ec457613ec4613e90565b5092915050565b600181811c90821680613edf57607f821691505b602082108103613efd57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561086357805f5260205f20601f840160051c81016020851015613f285750805b601f840160051c820191505b81811015613f47575f8155600101613f34565b5050505050565b81516001600160401b03811115613f6757613f67613d2e565b613f7b81613f758454613ecb565b84613f03565b602080601f831160018114613fae575f8415613f975750858301515b5f19600386901b1c1916600185901b178555614005565b5f85815260208120601f198616915b82811015613fdc57888601518255948401946001909101908401613fbd565b5085821015613ff957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561402757818101518382015260200161400f565b50505f910152565b602081525f825180602084015261404d81604085016020870161400d565b601f01601f19169190910160400192915050565b5f60208284031215614071575f80fd5b5051919050565b5f60208083525f845461408a81613ecb565b806020870152604060018084165f81146140ab57600181146140c7576140f4565b60ff19851660408a0152604084151560051b8a010195506140f4565b895f5260205f205f5b858110156140eb5781548b82018601529083019088016140d0565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261412457614124614102565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b80820281158282048414176109c9576109c9613e90565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613c1681613bf6565b5f806040838503121561427e575f80fd5b82516001600160401b0380821115614294575f80fd5b90840190606082870312156142a7575f80fd5b6142af613d42565b825181526020808401516142c281613c6d565b828201526040840151838111156142d7575f80fd5b80850194505087601f8501126142eb575f80fd5b835192506142fb613e2284613d9a565b838152888285870101111561430e575f80fd5b61431d8483830184880161400d565b80604084015250819550614332818801614262565b9450505050509250929050565b5f6001600160401b0380831681810361435a5761435a613e90565b6001019392505050565b818103818111156109c9576109c9613e90565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109c9576109c9613e90565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ec457613ec4613e90565b5f82516144a281846020870161400d565b9190910192915050565b5f602082840312156144bc575f80fd5b813561111f81613c6d565b6001600160401b038181168382160280821691908281146144ea576144ea613e90565b505092915050565b5f6001600160401b038084168061450b5761450b614102565b92169190910492915050565b5f60208284031215614527575f80fd5b813560ff8116811461111f575f80fd5b5f60208284031215614547575f80fd5b815161111f81613bf656fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516147c23803806147c283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146758061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613ce1565b6102d6565b005b610128610138366004613d1c565b61076a565b61017b61014b366004613d1c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613d1c565b6108c6565b6101286101af366004613d47565b610933565b6101c76101c2366004613d1c565b610a17565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d84565b610a2d565b610128610200366004613d9d565b610d89565b61017b610213366004613ddb565b610f7a565b6101c7610226366004613d1c565b610f93565b610128610239366004613d1c565b610fa7565b61012861024c366004613ce1565b611014565b61017b61025f366004613e86565b61102f565b610128610272366004613d9d565b611054565b61017b610285366004613f22565b6111f4565b610128610298366004613d84565b611207565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613d1c565b6113bb565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145c983398151915291841561032857610325828561148a565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613f42565b600481111561036b5761036b613f42565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146104505760405162461bcd60e51b815260206004820152603360248201525f805160206145e98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b60028151600481111561046557610465613f42565b146104b25760405162461bcd60e51b815260206004820152602a60248201525f805160206145e98339815191526044820152696e6f742061637469766560b01b6064820152608401610447565b5f6104bc84611726565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050957610509613f42565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105db856117a1565b905082606001516001600160401b031681608001516001600160401b0316116106525760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610447565b5f836060015182608001516106679190613f6a565b9050610673868261189c565b5f61067f8785846118d9565b5f8c815260058a016020526040902090915061069b8282614014565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106c89085906004016140f5565b6020604051808303815f875af11580156106e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107089190614127565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206146098339815191529291906107b290613f91565b90501180156107e4575060035f83815260078301602052604090205460ff1660058111156107e2576107e2613f42565b145b6108485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610447565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610881919060040161413e565b6020604051808303815f875af115801561089d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c19190614127565b505050565b6108cf81611af6565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206145c9833981519152916005600160991b019163ee5b48eb916108819160040161413e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061097c575080546001600160401b03808416911610155b1561099a5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109c58484611bc9565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a2764e8d4a51000836141dc565b92915050565b5f805160206146098339815191525f610a4583611be3565b90505f80610a568360400151611dc4565b915091508015610abb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610447565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610aec57610aec613f42565b6005811115610afd57610afd613f42565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610b7657610b76613f42565b1480610b945750600182516005811115610b9257610b92613f42565b145b610bf35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610447565b600382516005811115610c0857610c08613f42565b03610c2f57505f8381526006860160205260408120600491610c2a9190613c72565b610c33565b5060055b6020808301515f90815260088801909152604081205581816005811115610c5c57610c5c613f42565b90816005811115610c6f57610c6f613f42565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ca357610ca3613f42565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610d5657610d56613f42565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145c98339815191525f610da184611be3565b90505f80610db28360400151611f65565b5091509150610dc0856121a0565b5f8581526004850160205260408120610dd891613c72565b5f610de2836117a1565b9050816001600160401b031681606001516001600160401b03161015610e1a5760405162461bcd60e51b8152600401610447906141ef565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e5f5760405162461bcd60e51b815260040161044790614231565b60015f87815260038701602052604090205460ff166004811115610e8557610e85613f42565b14610eee5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610447565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a276001600160401b03831664e8d4a5100061427a565b5f610f9d826117a1565b6080015192915050565b610fb0816121a0565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206145c9833981519152916005600160991b019163ee5b48eb916108819160040161413e565b811561102657611024838261148a565b505b6108c183612279565b5f8061103a8661260a565b9050611048858286866126b7565b9150505b949350505050565b5f805160206145c98339815191525f61106c84611be3565b90505f8061107d8360400151611f65565b509150915061108b85611af6565b5f85815260058501602052604081206110a391613c72565b5f6110ad836117a1565b9050816001600160401b031681606001516001600160401b031610156110e55760405162461bcd60e51b8152600401610447906141ef565b5f8681526003808701602052604090912001546001600160401b03808416911611156111235760405162461bcd60e51b815260040161044790614231565b60035f87815260038701602052604090205460ff16600481111561114957611149613f42565b1461119d5760405162461bcd60e51b815260206004820152603160248201525f805160206145e98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610447565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611200833384612aeb565b9392505050565b5f805160206146098339815191525f61121f83611be3565b90505f806112308360400151611dc4565b91509150806112925760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610447565b5f828152600585016020526040812080546112ac90613f91565b90501180156112de575060015f83815260078601602052604090205460ff1660058111156112dc576112dc613f42565b145b6112fa5760405162461bcd60e51b815260040161044790614291565b5f828152600585016020526040812061131291613c72565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061460983398151915292919061140390613f91565b9050118015611435575060015f83815260078301602052604090205460ff16600581111561143357611433613f42565b145b6114515760405162461bcd60e51b815260040161044790614291565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610881919060040161413e565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114d5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114fc91908101906142e3565b915091508061155f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610447565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c69190614127565b82511461162a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610447565b60208201516001600160a01b0316156116a05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610447565b5f806116af8460400151612f71565b9150915081871461171c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610447565b9695505050505050565b5f8181525f805160206146498339815191526020526040812060020180545f8051602061460983398151915291600160a01b9091046001600160401b03169081906014611772836143b5565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061464983398151915290528390208351918201909352825491925f8051602061460983398151915292829060ff16600581111561182157611821613f42565b600581111561183257611832613f42565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f9182525f805160206146498339815191526020526040909120600301805467ffffffffffffffff19166001600160401b03909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611952576119128160016143da565b61191d90600861427a565b5081515f90839083908110611934576119346143ed565b60200101906001600160f81b03191690815f1a9053506001016118fe565b505f5b60048110156119b5576119698160036143da565b61197490600861427a565b6001901c60f81b82611987836002614401565b81518110611997576119976143ed565b60200101906001600160f81b03191690815f1a905350600101611955565b505f5b6020811015611a17576119cc81601f6143da565b6119d790600861427a565b86901c60f81b826119e9836006614401565b815181106119f9576119f96143ed565b60200101906001600160f81b03191690815f1a9053506001016119b8565b505f5b6008811015611a8257611a2e8160076143da565b611a3990600861427a565b6001600160401b038616901c60f81b82611a54836026614401565b81518110611a6457611a646143ed565b60200101906001600160f81b03191690815f1a905350600101611a1a565b505f5b6008811015611aed57611a998160076143da565b611aa490600861427a565b6001600160401b038516901c60f81b82611abf83602e614401565b81518110611acf57611acf6143ed565b60200101906001600160f81b03191690815f1a905350600101611a85565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206145c9833981519152929190611b3e90613f91565b9050118015611b70575060035f83815260038301602052604090205460ff166004811115611b6e57611b6e613f42565b145b611bc55760405162461bcd60e51b815260206004820152603360248201525f805160206145e983398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610447565b5050565b611bd1613149565b611bda82613194565b611bc5816131da565b60408051606080820183525f8083526020830181905292820152905f805160206146098339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c58573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c7f91908101906142e3565b9150915080611ce65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610447565b8254825114611d495760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610447565b60208201516001600160a01b031615611dbc5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610447565b509392505050565b5f808251602714611de75760405162461bcd60e51b815260040161044790614414565b5f805b6002811015611e3657611dfe8160016143da565b611e0990600861427a565b61ffff16858281518110611e1f57611e1f6143ed565b016020015160f81c901b9190911790600101611dea565b5061ffff811615611e595760405162461bcd60e51b81526004016104479061445d565b5f805b6004811015611eb457611e708160036143da565b611e7b90600861427a565b63ffffffff1686611e8d836002614401565b81518110611e9d57611e9d6143ed565b016020015160f81c901b9190911790600101611e5c565b5063ffffffff8116600214611edb5760405162461bcd60e51b8152600401610447906144a0565b5f805b6020811015611f3057611ef281601f6143da565b611efd90600861427a565b87611f09836006614401565b81518110611f1957611f196143ed565b016020015160f81c901b9190911790600101611ede565b505f86602681518110611f4557611f456143ed565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611f895760405162461bcd60e51b815260040161044790614414565b5f805b6002811015611fd857611fa08160016143da565b611fab90600861427a565b61ffff16868281518110611fc157611fc16143ed565b016020015160f81c901b9190911790600101611f8c565b5061ffff811615611ffb5760405162461bcd60e51b81526004016104479061445d565b5f805b6004811015612056576120128160036143da565b61201d90600861427a565b63ffffffff168761202f836002614401565b8151811061203f5761203f6143ed565b016020015160f81c901b9190911790600101611ffe565b5063ffffffff811660031461207d5760405162461bcd60e51b8152600401610447906144a0565b5f805b60208110156120d25761209481601f6143da565b61209f90600861427a565b886120ab836006614401565b815181106120bb576120bb6143ed565b016020015160f81c901b9190911790600101612080565b505f805b6008811015612131576120ea8160076143da565b6120f590600861427a565b6001600160401b03168961210a836026614401565b8151811061211a5761211a6143ed565b016020015160f81c901b91909117906001016120d6565b505f805b6008811015612190576121498160076143da565b61215490600861427a565b6001600160401b03168a61216983602e614401565b81518110612179576121796143ed565b016020015160f81c901b9190911790600101612135565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206145c98339815191529291906121e890613f91565b905011801561221a575060015f83815260038301602052604090205460ff16600481111561221857612218613f42565b145b611bc55760405162461bcd60e51b815260206004820152603860248201525f805160206145e983398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610447565b5f8181525f805160206146498339815191526020526040808220815160e0810190925280545f8051602061460983398151915293929190829060ff1660058111156122c6576122c6613f42565b60058111156122d7576122d7613f42565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561235157612351613f42565b146123ad5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610447565b60408101516001600160a01b0316336001600160a01b0316146124275760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610447565b612434816080015161328e565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561247857612478613f42565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f61252c8461252681611726565b5f6118d9565b5f85815260068501602052604090209091506125488282614014565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125759085906004016140f5565b6020604051808303815f875af1158015612591573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125b59190614127565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145c9833981519152816126238461342f565b90505f61262f82610a17565b83549091506001600160401b0382161080159061265957508260010154816001600160401b031611155b61104c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610447565b5f6126c0613465565b5f80516020614609833981519152426001600160401b0385161180156126fa57506001600160401b0384166126f8426202a300614401565b115b61275c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610447565b856127b35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610447565b5f868152600882016020526040902054156128215760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610447565b82516030146128885760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610447565b6128918561328e565b5f806128d86040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061349c565b5f828152600586016020526040902091935091506128f68282614014565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129239085906004016140f5565b6020604051808303815f875af115801561293f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129639190614127565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156129dc576129dc613f42565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612a8583611726565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061104c60015f8051602061462983398151915255565b5f612af4613465565b5f612b016101c28461342f565b90505f805160206145c98339815191525f612b1b876117a1565b9050600281516005811115612b3257612b32613f42565b14612b915760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610447565b5f838260800151612ba291906144e7565b9050612bae888261189c565b5f612bb889611726565b90505f60028a8a84604051602001612c029392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f1981840301815290829052612c1c91614507565b602060405180830381855afa158015612c37573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612c5a9190614127565b5f8181526003870160205260409020600201549091506001600160401b031615612ce35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e496044820152731108185b1c9958591e481c9959da5cdd195c995960621b6064820152608401610447565b612cec8661328e565b5f612cf88b84866118d9565b5f8381526004880160205260409020909150612d148282614014565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d419085906004016140f5565b6020604051808303815f875af1158015612d5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d819190614127565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612e3057612e30613f42565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061120060015f8051602061462983398151915255565b5f808251602e14612f945760405162461bcd60e51b815260040161044790614414565b5f805b6002811015612fe357612fab8160016143da565b612fb690600861427a565b61ffff16858281518110612fcc57612fcc6143ed565b016020015160f81c901b9190911790600101612f97565b5061ffff8116156130065760405162461bcd60e51b81526004016104479061445d565b5f805b60048110156130615761301d8160036143da565b61302890600861427a565b63ffffffff168661303a836002614401565b8151811061304a5761304a6143ed565b016020015160f81c901b9190911790600101613009565b5063ffffffff81166004146130885760405162461bcd60e51b8152600401610447906144a0565b5f805b60208110156130dd5761309f81601f6143da565b6130aa90600861427a565b876130b6836006614401565b815181106130c6576130c66143ed565b016020015160f81c901b919091179060010161308b565b505f805b600881101561313c576130f58160076143da565b61310090600861427a565b6001600160401b031688613115836026614401565b81518110613125576131256143ed565b016020015160f81c901b91909117906001016130e1565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661319257604051631afcd79f60e31b815260040160405180910390fd5b565b61319c613149565b6131a581613854565b6131d7606082013560808301356131c260c0850160a08601613ddb565b6131d260e0860160c08701614522565b613875565b50565b6131e2613149565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661326e5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610447565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146098339815191529060ff165f036132cc575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061331490836143da565b10613330576001600160401b038416604083015280825261334f565b838260400181815161334291906144e7565b6001600160401b03169052505b5f826020015183604001516064613366919061453d565b6133709190614568565b600285015490915060ff90811690821611156133eb5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610447565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a27827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906138d0565b5f8051602061462983398151915280546001190161349657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135065760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610447565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561357d5761353d8160016143da565b61354890600861427a565b5081515f9083908390811061355f5761355f6143ed565b60200101906001600160f81b03191690815f1a905350600101613529565b505f5b60048110156135db576135948160036143da565b61359f90600861427a565b505f826135ad836002614401565b815181106135bd576135bd6143ed565b60200101906001600160f81b03191690815f1a905350600101613580565b505f5b602081101561363857845181602081106135fa576135fa6143ed565b1a60f81b8261360a836006614401565b8151811061361a5761361a6143ed565b60200101906001600160f81b03191690815f1a9053506001016135de565b505f5b6020811015613698578460200151816020811061365a5761365a6143ed565b1a60f81b8261366a836026614401565b8151811061367a5761367a6143ed565b60200101906001600160f81b03191690815f1a90535060010161363b565b505f5b600881101561370c576136af8160076143da565b6136ba90600861427a565b60ff1685604001516001600160401b0316901c60f81b828260466136de9190614401565b815181106136ee576136ee6143ed565b60200101906001600160f81b03191690815f1a90535060010161369b565b505f5b6030811015613777578460800151818151811061372e5761372e6143ed565b01602001516001600160f81b0319168261374983604e614401565b81518110613759576137596143ed565b60200101906001600160f81b03191690815f1a90535060010161370f565b505f5b60088110156137e95761378e8160076143da565b61379990600861427a565b60608601516001600160401b0390811691161c60f81b826137bb83607e614401565b815181106137cb576137cb6143ed565b60200101906001600160f81b03191690815f1a90535060010161377a565b506002816040516137fa9190614507565b602060405180830381855afa158015613815573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138389190614127565b94909350915050565b60015f8051602061462983398151915255565b61385c613149565b613864613a32565b61386c613a42565b6131d781613a4a565b61387d613149565b5f5f805160206145c9833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613916573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061393a9190614127565b90506139516001600160a01b038516333086613ab6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139b99190614127565b9050818111613a1f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610447565b613a2982826143da565b95945050505050565b613a3a613149565b613192613b16565b613192613149565b613a52613149565b80355f8051602061460983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a9c606083016040840161458d565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613b10908590613b1e565b50505050565b613841613149565b5f613b326001600160a01b03841683613b7f565b905080515f14158015613b56575080806020019051810190613b5491906145ad565b155b156108c157604051635274afe760e01b81526001600160a01b0384166004820152602401610447565b606061120083835f845f80856001600160a01b03168486604051613ba39190614507565b5f6040518083038185875af1925050503d805f8114613bdd576040519150601f19603f3d011682016040523d82523d5f602084013e613be2565b606091505b509150915061171c868383606082613c0257613bfd82613c49565b611200565b8151158015613c1957506001600160a01b0384163b155b15613c4257604051639996b31560e01b81526001600160a01b0385166004820152602401610447565b5080611200565b805115613c595780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c7e90613f91565b5f825580601f10613c8d575050565b601f0160209004905f5260205f20908101906131d791905b80821115613cb8575f8155600101613ca5565b5090565b80151581146131d7575f80fd5b803563ffffffff81168114613cdc575f80fd5b919050565b5f805f60608486031215613cf3575f80fd5b833592506020840135613d0581613cbc565b9150613d1360408501613cc9565b90509250925092565b5f60208284031215613d2c575f80fd5b5035919050565b6001600160a01b03811681146131d7575f80fd5b5f80828403610100811215613d5a575f80fd5b60e0811215613d67575f80fd5b5082915060e0830135613d7981613d33565b809150509250929050565b5f60208284031215613d94575f80fd5b61120082613cc9565b5f8060408385031215613dae575f80fd5b613db783613cc9565b946020939093013593505050565b80356001600160401b0381168114613cdc575f80fd5b5f60208284031215613deb575f80fd5b61120082613dc5565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e2a57613e2a613df4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e5857613e58613df4565b604052919050565b5f6001600160401b03821115613e7857613e78613df4565b50601f01601f191660200190565b5f805f8060808587031215613e99575f80fd5b8435935060208501359250613eb060408601613dc5565b915060608501356001600160401b03811115613eca575f80fd5b8501601f81018713613eda575f80fd5b8035613eed613ee882613e60565b613e30565b818152886020838501011115613f01575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613f33575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f8a57613f8a613f56565b5092915050565b600181811c90821680613fa557607f821691505b602082108103613fc357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108c157805f5260205f20601f840160051c81016020851015613fee5750805b601f840160051c820191505b8181101561400d575f8155600101613ffa565b5050505050565b81516001600160401b0381111561402d5761402d613df4565b6140418161403b8454613f91565b84613fc9565b602080601f831160018114614074575f841561405d5750858301515b5f19600386901b1c1916600185901b1785556140cb565b5f85815260208120601f198616915b828110156140a257888601518255948401946001909101908401614083565b50858210156140bf57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140ed5781810151838201526020016140d5565b50505f910152565b602081525f82518060208401526141138160408501602087016140d3565b601f01601f19169190910160400192915050565b5f60208284031215614137575f80fd5b5051919050565b5f60208083525f845461415081613f91565b806020870152604060018084165f8114614171576001811461418d576141ba565b60ff19851660408a0152604084151560051b8a010195506141ba565b895f5260205f205f5b858110156141b15781548b8201860152908301908801614196565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826141ea576141ea6141c8565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a2757610a27613f56565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613cdc81613cbc565b5f80604083850312156142f4575f80fd5b82516001600160401b038082111561430a575f80fd5b908401906060828703121561431d575f80fd5b614325613e08565b8251815260208084015161433881613d33565b8282015260408401518381111561434d575f80fd5b80850194505087601f850112614361575f80fd5b83519250614371613ee884613e60565b8381528882858701011115614384575f80fd5b614393848383018488016140d3565b806040840152508195506143a88188016142d8565b9450505050509250929050565b5f6001600160401b038083168181036143d0576143d0613f56565b6001019392505050565b81810381811115610a2757610a27613f56565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a2757610a27613f56565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f8a57613f8a613f56565b5f82516145188184602087016140d3565b9190910192915050565b5f60208284031215614532575f80fd5b813561120081613d33565b6001600160401b0381811683821602808216919082811461456057614560613f56565b505092915050565b5f6001600160401b0380841680614581576145816141c8565b92169190910492915050565b5f6020828403121561459d575f80fd5b813560ff81168114611200575f80fd5b5f602082840312156145bd575f80fd5b815161120081613cbc56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -715,31 +715,31 @@ func (it *ERC20TokenStakingManagerDelegationEndedIterator) Close() error { // ERC20TokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegationEnded struct { - ValidationID [32]byte DelegationID [32]byte + ValidationID [32]byte Nonce uint64 Raw types.Log // Blockchain specific contextual infos } // FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -748,23 +748,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat // WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -798,7 +798,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegati // ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { event := new(ERC20TokenStakingManagerDelegationEnded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { @@ -877,59 +877,60 @@ func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Close() error { // ERC20TokenStakingManagerDelegatorAdded represents a DelegatorAdded event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegatorAdded struct { - ValidationID [32]byte - SetWeightMessageID [32]byte DelegationID [32]byte - DelegatorWeight uint64 - ValidatorWeight uint64 + ValidationID [32]byte + DelegatorAddress common.Address Nonce uint64 + ValidatorWeight uint64 + DelegatorWeight uint64 + SetWeightMessageID [32]byte Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*ERC20TokenStakingManagerDelegatorAddedIterator, error) { +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (*ERC20TokenStakingManagerDelegatorAddedIterator, error) { + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorAddedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil } -// WatchDelegatorAdded is a free log subscription operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorAdded, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (event.Subscription, error) { + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) if err != nil { return nil, err } @@ -961,9 +962,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorAdded is a log parse operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. +// ParseDelegatorAdded is a log parse operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*ERC20TokenStakingManagerDelegatorAdded, error) { event := new(ERC20TokenStakingManagerDelegatorAdded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { @@ -1042,8 +1043,8 @@ func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Close() error { // ERC20TokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegatorRegistered struct { - ValidationID [32]byte DelegationID [32]byte + ValidationID [32]byte Nonce uint64 StartTime *big.Int Raw types.Log // Blockchain specific contextual infos @@ -1051,23 +1052,23 @@ type ERC20TokenStakingManagerDelegatorRegistered struct { // FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -1076,23 +1077,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat // WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -1126,7 +1127,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato // ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*ERC20TokenStakingManagerDelegatorRegistered, error) { event := new(ERC20TokenStakingManagerDelegatorRegistered) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { @@ -1205,59 +1206,59 @@ func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Close() e // ERC20TokenStakingManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegatorRemovalInitialized struct { - ValidationID [32]byte - SetWeightMessageID [32]byte DelegationID [32]byte - ValidatorWeight uint64 + ValidationID [32]byte Nonce uint64 + ValidatorWeight uint64 EndTime *big.Int + SetWeightMessageID [32]byte Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -1289,9 +1290,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerDelegatorRemovalInitialized, error) { event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 560a9b9f6..18d0cd25b 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161435438038061435483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142078061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613890565b610389565b005b348015610134575f80fd5b506101276101433660046138cb565b61046b565b348015610153575f80fd5b50610127610162366004613906565b6108a1565b348015610172575f80fd5b506101b1610181366004613906565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613906565b6109fd565b3480156101ee575f80fd5b506102026101fd366004613906565b610a6a565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b5061012761023436600461391d565b610a80565b348015610244575f80fd5b50610127610253366004613936565b610ddc565b348015610263575f80fd5b506101b1610272366004613974565b610f81565b348015610282575f80fd5b50610202610291366004613906565b610f9a565b3480156102a1575f80fd5b506101276102b0366004613906565b610fae565b3480156102c0575f80fd5b506101276102cf3660046138cb565b61101b565b3480156102df575f80fd5b506101276102ee366004613936565b611036565b3480156102fe575f80fd5b5061012761030d36600461391d565b61119f565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613906565b611353565b6101b1610371366004613906565b611422565b6101b1610384366004613a1f565b61142e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611452565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061417b8339815191529184156104bd576104ba8285611466565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613ab1565b600481111561050057610500613ab1565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613ab1565b146105eb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084015b60405180910390fd5b5f6105f584611702565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561064257610642613ab1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107148561177d565b905082606001516001600160401b031681608001516001600160401b03161161078b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105e2565b5f836060015182608001516107a09190613ad9565b90506107ac8682611878565b5f6107b88785846118b5565b5f8c815260058a01602052604090209091506107d48282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610801908590600401613c5e565b6020604051808303815f875af115801561081d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108419190613c90565b604080516001600160401b03868116825288166020820152428183015290519192508d9183918b917f822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c9181900360600190a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061419b8339815191529291906108e990613b00565b905011801561091b575060035f83815260078301602052604090205460ff16600581111561091957610919613ab1565b145b61097f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105e2565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109b89190600401613ca7565b6020604051808303815f875af11580156109d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f89190613c90565b505050565b610a0681611ad2565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061417b833981519152916005600160991b019163ee5b48eb916109b891600401613ca7565b5f610a7a64e8d4a5100083613d45565b92915050565b5f8051602061419b8339815191525f610a9883611bb7565b90505f80610aa98360400151611d98565b915091508015610b0e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105e2565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610b3f57610b3f613ab1565b6005811115610b5057610b50613ab1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610bc957610bc9613ab1565b1480610be75750600182516005811115610be557610be5613ab1565b145b610c465760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105e2565b600382516005811115610c5b57610c5b613ab1565b03610c8257505f8381526006860160205260408120600491610c7d9190613846565b610c86565b5060055b6020808301515f90815260088801909152604081205581816005811115610caf57610caf613ab1565b90816005811115610cc257610cc2613ab1565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610cf657610cf6613ab1565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610da957610da9613ab1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f8051602061417b8339815191525f610df484611bb7565b90505f80610e058360400151611f39565b5091509150610e1385612174565b5f8581526004850160205260408120610e2b91613846565b5f610e358361177d565b9050816001600160401b031681606001516001600160401b03161015610e6d5760405162461bcd60e51b81526004016105e290613d58565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610eb25760405162461bcd60e51b81526004016105e290613d9a565b60015f87815260038701602052604090205460ff166004811115610ed857610ed8613ab1565b14610ef55760405162461bcd60e51b81526004016105e290613de3565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691889186917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a7a6001600160401b03831664e8d4a51000613e33565b5f610fa48261177d565b6080015192915050565b610fb781612174565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061417b833981519152916005600160991b019163ee5b48eb916109b891600401613ca7565b811561102d5761102b8382611466565b505b6109f883612260565b5f8051602061417b8339815191525f61104e84611bb7565b90505f8061105f8360400151611f39565b509150915061106d85611ad2565b5f858152600585016020526040812061108591613846565b5f61108f8361177d565b9050816001600160401b031681606001516001600160401b031610156110c75760405162461bcd60e51b81526004016105e290613d58565b5f8681526003808701602052604090912001546001600160401b03808416911611156111055760405162461bcd60e51b81526004016105e290613d9a565b60035f87815260038701602052604090205460ff16600481111561112b5761112b613ab1565b146111485760405162461bcd60e51b81526004016105e290613de3565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691889186917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f8051602061419b8339815191525f6111b783611bb7565b90505f806111c88360400151611d98565b915091508061122a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105e2565b5f8281526005850160205260408120805461124490613b00565b9050118015611276575060015f83815260078601602052604090205460ff16600581111561127457611274613ab1565b145b6112925760405162461bcd60e51b81526004016105e290613e4a565b5f82815260058501602052604081206112aa91613846565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061419b83398151915292919061139b90613b00565b90501180156113cd575060015f83815260078301602052604090205460ff1660058111156113cb576113cb613ab1565b145b6113e95760405162461bcd60e51b81526004016105e290613e4a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109b89190600401613ca7565b5f610a7a8233346125f1565b5f8061143934612a6a565b905061144785828686612b14565b9150505b9392505050565b61145a612f48565b61146381612f93565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114b1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114d89190810190613eb0565b915091508061153b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105e2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561157e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a29190613c90565b8251146116065760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105e2565b60208201516001600160a01b03161561167c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105e2565b5f8061168b8460400151612fd6565b915091508187146116f85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105e2565b9695505050505050565b5f8181525f805160206141db8339815191526020526040812060020180545f8051602061419b83398151915291600160a01b9091046001600160401b0316908190601461174e83613f82565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206141db83398151915290528390208351918201909352825491925f8051602061419b83398151915292829060ff1660058111156117fd576117fd613ab1565b600581111561180e5761180e613ab1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f9182525f805160206141db8339815191526020526040909120600301805467ffffffffffffffff19166001600160401b03909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561192e576118ee816001613fa7565b6118f9906008613e33565b5081515f9083908390811061191057611910613fba565b60200101906001600160f81b03191690815f1a9053506001016118da565b505f5b600481101561199157611945816003613fa7565b611950906008613e33565b6001901c60f81b82611963836002613fce565b8151811061197357611973613fba565b60200101906001600160f81b03191690815f1a905350600101611931565b505f5b60208110156119f3576119a881601f613fa7565b6119b3906008613e33565b86901c60f81b826119c5836006613fce565b815181106119d5576119d5613fba565b60200101906001600160f81b03191690815f1a905350600101611994565b505f5b6008811015611a5e57611a0a816007613fa7565b611a15906008613e33565b6001600160401b038616901c60f81b82611a30836026613fce565b81518110611a4057611a40613fba565b60200101906001600160f81b03191690815f1a9053506001016119f6565b505f5b6008811015611ac957611a75816007613fa7565b611a80906008613e33565b6001600160401b038516901c60f81b82611a9b83602e613fce565b81518110611aab57611aab613fba565b60200101906001600160f81b03191690815f1a905350600101611a61565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061417b833981519152929190611b1a90613b00565b9050118015611b4c575060035f83815260038301602052604090205460ff166004811115611b4a57611b4a613ab1565b145b611bb35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016105e2565b5050565b60408051606080820183525f8083526020830181905292820152905f8051602061419b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c2c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c539190810190613eb0565b9150915080611cba5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105e2565b8254825114611d1d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105e2565b60208201516001600160a01b031615611d905760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105e2565b509392505050565b5f808251602714611dbb5760405162461bcd60e51b81526004016105e290613fe1565b5f805b6002811015611e0a57611dd2816001613fa7565b611ddd906008613e33565b61ffff16858281518110611df357611df3613fba565b016020015160f81c901b9190911790600101611dbe565b5061ffff811615611e2d5760405162461bcd60e51b81526004016105e29061402a565b5f805b6004811015611e8857611e44816003613fa7565b611e4f906008613e33565b63ffffffff1686611e61836002613fce565b81518110611e7157611e71613fba565b016020015160f81c901b9190911790600101611e30565b5063ffffffff8116600214611eaf5760405162461bcd60e51b81526004016105e29061406d565b5f805b6020811015611f0457611ec681601f613fa7565b611ed1906008613e33565b87611edd836006613fce565b81518110611eed57611eed613fba565b016020015160f81c901b9190911790600101611eb2565b505f86602681518110611f1957611f19613fba565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611f5d5760405162461bcd60e51b81526004016105e290613fe1565b5f805b6002811015611fac57611f74816001613fa7565b611f7f906008613e33565b61ffff16868281518110611f9557611f95613fba565b016020015160f81c901b9190911790600101611f60565b5061ffff811615611fcf5760405162461bcd60e51b81526004016105e29061402a565b5f805b600481101561202a57611fe6816003613fa7565b611ff1906008613e33565b63ffffffff1687612003836002613fce565b8151811061201357612013613fba565b016020015160f81c901b9190911790600101611fd2565b5063ffffffff81166003146120515760405162461bcd60e51b81526004016105e29061406d565b5f805b60208110156120a65761206881601f613fa7565b612073906008613e33565b8861207f836006613fce565b8151811061208f5761208f613fba565b016020015160f81c901b9190911790600101612054565b505f805b6008811015612105576120be816007613fa7565b6120c9906008613e33565b6001600160401b0316896120de836026613fce565b815181106120ee576120ee613fba565b016020015160f81c901b91909117906001016120aa565b505f805b60088110156121645761211d816007613fa7565b612128906008613e33565b6001600160401b03168a61213d83602e613fce565b8151811061214d5761214d613fba565b016020015160f81c901b9190911790600101612109565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061417b8339815191529291906121bc90613b00565b90501180156121ee575060015f83815260038301602052604090205460ff1660048111156121ec576121ec613ab1565b145b611bb35760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016105e2565b5f8181525f805160206141db8339815191526020526040808220815160e0810190925280545f8051602061419b83398151915293929190829060ff1660058111156122ad576122ad613ab1565b60058111156122be576122be613ab1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561233857612338613ab1565b146123945760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105e2565b60408101516001600160a01b0316336001600160a01b03161461240e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105e2565b61241b81608001516131ae565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561245f5761245f613ab1565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125138461250d81611702565b5f6118b5565b5f858152600685016020526040902090915061252f8282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061255c908590600401613c5e565b6020604051808303815f875af1158015612578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061259c9190613c90565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6125fa61334f565b5f61260483610a6a565b90505f8051602061417b8339815191525f61261e8761177d565b905060028151600581111561263557612635613ab1565b146126945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105e2565b5f8382608001516126a591906140b4565b90506126b18882611878565b5f6126bb89611702565b90505f60028a8a846040516020016127059392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f198184030181529082905261271f916140d4565b602060405180830381855afa15801561273a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061275d9190613c90565b5f8181526003870160205260409020600201549091506001600160401b0316156127e35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b60648201526084016105e2565b6127ec866131ae565b5f6127f88b84866118b5565b5f83815260048801602052604090209091506128148282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612841908590600401613c5e565b6020604051808303815f875af115801561285d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128819190613c90565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561293057612930613ab1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606080850151600285018054608088015160a089015160c08a01516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909501516003909401805467ffffffffffffffff19169486169490941790935580518c851681528985169281019290925292871692810192909252849183918f917f94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de910160405180910390a45090965050505050505061144b60015f805160206141bb83398151915255565b5f5f8051602061417b8339815191528282612a8482610a6a565b83549091506001600160401b03821610801590612aae57508260010154816001600160401b031611155b612b0c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105e2565b949350505050565b5f612b1d61334f565b5f8051602061419b833981519152426001600160401b038516118015612b5757506001600160401b038416612b55426202a300613fce565b115b612bb95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105e2565b85612c105760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105e2565b5f86815260088201602052604090205415612c7e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105e2565b8251603014612ce55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105e2565b612cee856131ae565b5f80612d356040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613399565b5f82815260058601602052604090209193509150612d538282613b7d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d80908590600401613c5e565b6020604051808303815f875af1158015612d9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dc09190613c90565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612e3957612e39613ab1565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612ee283611702565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b0c60015f805160206141bb83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612f9157604051631afcd79f60e31b815260040160405180910390fd5b565b612f9b612f48565b612fa48161373e565b61146360608201356080830135612fc160c0850160a08601613974565b612fd160e0860160c087016140ef565b61375f565b5f808251602e14612ff95760405162461bcd60e51b81526004016105e290613fe1565b5f805b600281101561304857613010816001613fa7565b61301b906008613e33565b61ffff1685828151811061303157613031613fba565b016020015160f81c901b9190911790600101612ffc565b5061ffff81161561306b5760405162461bcd60e51b81526004016105e29061402a565b5f805b60048110156130c657613082816003613fa7565b61308d906008613e33565b63ffffffff168661309f836002613fce565b815181106130af576130af613fba565b016020015160f81c901b919091179060010161306e565b5063ffffffff81166004146130ed5760405162461bcd60e51b81526004016105e29061406d565b5f805b60208110156131425761310481601f613fa7565b61310f906008613e33565b8761311b836006613fce565b8151811061312b5761312b613fba565b016020015160f81c901b91909117906001016130f0565b505f805b60088110156131a15761315a816007613fa7565b613165906008613e33565b6001600160401b03168861317a836026613fce565b8151811061318a5761318a613fba565b016020015160f81c901b9190911790600101613146565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061419b8339815191529060ff165f036131ec575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132349083613fa7565b10613250576001600160401b038416604083015280825261326f565b838260400181815161326291906140b4565b6001600160401b03169052505b5f826020015183604001516064613286919061410a565b6132909190614135565b600285015490915060ff908116908216111561330b5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105e2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206141bb83398151915280546001190161338057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206141bb83398151915255565b5f60608260800151516030146134035760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105e2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561347a5761343a816001613fa7565b613445906008613e33565b5081515f9083908390811061345c5761345c613fba565b60200101906001600160f81b03191690815f1a905350600101613426565b505f5b60048110156134d857613491816003613fa7565b61349c906008613e33565b505f826134aa836002613fce565b815181106134ba576134ba613fba565b60200101906001600160f81b03191690815f1a90535060010161347d565b505f5b602081101561353557845181602081106134f7576134f7613fba565b1a60f81b82613507836006613fce565b8151811061351757613517613fba565b60200101906001600160f81b03191690815f1a9053506001016134db565b505f5b6020811015613595578460200151816020811061355757613557613fba565b1a60f81b82613567836026613fce565b8151811061357757613577613fba565b60200101906001600160f81b03191690815f1a905350600101613538565b505f5b6008811015613609576135ac816007613fa7565b6135b7906008613e33565b60ff1685604001516001600160401b0316901c60f81b828260466135db9190613fce565b815181106135eb576135eb613fba565b60200101906001600160f81b03191690815f1a905350600101613598565b505f5b6030811015613674578460800151818151811061362b5761362b613fba565b01602001516001600160f81b0319168261364683604e613fce565b8151811061365657613656613fba565b60200101906001600160f81b03191690815f1a90535060010161360c565b505f5b60088110156136e65761368b816007613fa7565b613696906008613e33565b60608601516001600160401b0390811691161c60f81b826136b883607e613fce565b815181106136c8576136c8613fba565b60200101906001600160f81b03191690815f1a905350600101613677565b506002816040516136f791906140d4565b602060405180830381855afa158015613712573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137359190613c90565b94909350915050565b613746612f48565b61374e6137ba565b6137566137ca565b611463816137d2565b613767612f48565b5f5f8051602061417b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6137c2612f48565b612f9161383e565b612f91612f48565b6137da612f48565b80355f8051602061419b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613824606083016040840161415a565b600291909101805460ff191660ff90921691909117905550565b613386612f48565b50805461385290613b00565b5f825580601f10613861575050565b601f0160209004905f5260205f209081019061146391905b8082111561388c575f8155600101613879565b5090565b5f60e082840312156138a0575f80fd5b50919050565b8015158114611463575f80fd5b803563ffffffff811681146138c6575f80fd5b919050565b5f805f606084860312156138dd575f80fd5b8335925060208401356138ef816138a6565b91506138fd604085016138b3565b90509250925092565b5f60208284031215613916575f80fd5b5035919050565b5f6020828403121561392d575f80fd5b61144b826138b3565b5f8060408385031215613947575f80fd5b613950836138b3565b946020939093013593505050565b80356001600160401b03811681146138c6575f80fd5b5f60208284031215613984575f80fd5b61144b8261395e565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156139c3576139c361398d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156139f1576139f161398d565b604052919050565b5f6001600160401b03821115613a1157613a1161398d565b50601f01601f191660200190565b5f805f60608486031215613a31575f80fd5b83359250613a416020850161395e565b915060408401356001600160401b03811115613a5b575f80fd5b8401601f81018613613a6b575f80fd5b8035613a7e613a79826139f9565b6139c9565b818152876020838501011115613a92575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613af957613af9613ac5565b5092915050565b600181811c90821680613b1457607f821691505b6020821081036138a057634e487b7160e01b5f52602260045260245ffd5b601f8211156109f857805f5260205f20601f840160051c81016020851015613b575750805b601f840160051c820191505b81811015613b76575f8155600101613b63565b5050505050565b81516001600160401b03811115613b9657613b9661398d565b613baa81613ba48454613b00565b84613b32565b602080601f831160018114613bdd575f8415613bc65750858301515b5f19600386901b1c1916600185901b178555613c34565b5f85815260208120601f198616915b82811015613c0b57888601518255948401946001909101908401613bec565b5085821015613c2857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613c56578181015183820152602001613c3e565b50505f910152565b602081525f8251806020840152613c7c816040850160208701613c3c565b601f01601f19169190910160400192915050565b5f60208284031215613ca0575f80fd5b5051919050565b5f60208083525f8454613cb981613b00565b806020870152604060018084165f8114613cda5760018114613cf657613d23565b60ff19851660408a0152604084151560051b8a01019550613d23565b895f5260205f205f5b85811015613d1a5781548b8201860152908301908801613cff565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613d5357613d53613d31565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b8082028115828204841417610a7a57610a7a613ac5565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611463575f80fd5b80516138c6816138a6565b5f8060408385031215613ec1575f80fd5b82516001600160401b0380821115613ed7575f80fd5b9084019060608287031215613eea575f80fd5b613ef26139a1565b82518152602080840151613f0581613e91565b82820152604084015183811115613f1a575f80fd5b80850194505087601f850112613f2e575f80fd5b83519250613f3e613a79846139f9565b8381528882858701011115613f51575f80fd5b613f6084838301848801613c3c565b80604084015250819550613f75818801613ea5565b9450505050509250929050565b5f6001600160401b03808316818103613f9d57613f9d613ac5565b6001019392505050565b81810381811115610a7a57610a7a613ac5565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a7a57610a7a613ac5565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613af957613af9613ac5565b5f82516140e5818460208701613c3c565b9190910192915050565b5f602082840312156140ff575f80fd5b813561144b81613e91565b6001600160401b0381811683821602808216919082811461412d5761412d613ac5565b505092915050565b5f6001600160401b038084168061414e5761414e613d31565b92169190910492915050565b5f6020828403121561416a575f80fd5b813560ff8116811461144b575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516143ea3803806143ea83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61429d8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613956565b610389565b005b348015610134575f80fd5b50610127610143366004613991565b61046b565b348015610153575f80fd5b506101276101623660046139cc565b6108ff565b348015610172575f80fd5b506101b16101813660046139cc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de3660046139cc565b610a5b565b3480156101ee575f80fd5b506102026101fd3660046139cc565b610ac8565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b506101276102343660046139e3565b610ade565b348015610244575f80fd5b506101276102533660046139fc565b610e3a565b348015610263575f80fd5b506101b1610272366004613a3a565b61102b565b348015610282575f80fd5b506102026102913660046139cc565b611044565b3480156102a1575f80fd5b506101276102b03660046139cc565b611058565b3480156102c0575f80fd5b506101276102cf366004613991565b6110c5565b3480156102df575f80fd5b506101276102ee3660046139fc565b6110e0565b3480156102fe575f80fd5b5061012761030d3660046139e3565b611280565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e3660046139cc565b611434565b6101b16103713660046139cc565b611503565b6101b1610384366004613ae5565b61150f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611533565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206141f18339815191529184156104bd576104ba8285611547565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b77565b600481111561050057610500613b77565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146105e55760405162461bcd60e51b815260206004820152603360248201525f805160206142118339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b6002815160048111156105fa576105fa613b77565b146106475760405162461bcd60e51b815260206004820152602a60248201525f805160206142118339815191526044820152696e6f742061637469766560b01b60648201526084016105dc565b5f610651846117e3565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069e5761069e613b77565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107708561185e565b905082606001516001600160401b031681608001516001600160401b0316116107e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105dc565b5f836060015182608001516107fc9190613b9f565b90506108088682611959565b5f610814878584611996565b5f8c815260058a01602052604090209091506108308282613c43565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061085d908590600401613d24565b6020604051808303815f875af1158015610879573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089d9190613d56565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061423183398151915292919061094790613bc6565b9050118015610979575060035f83815260078301602052604090205460ff16600581111561097757610977613b77565b145b6109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105dc565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613d6d565b6020604051808303815f875af1158015610a32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a569190613d56565b505050565b610a6481611bb3565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206141f1833981519152916005600160991b019163ee5b48eb91610a1691600401613d6d565b5f610ad864e8d4a5100083613e0b565b92915050565b5f805160206142318339815191525f610af683611c86565b90505f80610b078360400151611e67565b915091508015610b6c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105dc565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610b9d57610b9d613b77565b6005811115610bae57610bae613b77565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f9082516005811115610c2757610c27613b77565b1480610c455750600182516005811115610c4357610c43613b77565b145b610ca45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105dc565b600382516005811115610cb957610cb9613b77565b03610ce057505f8381526006860160205260408120600491610cdb919061390c565b610ce4565b5060055b6020808301515f90815260088801909152604081205581816005811115610d0d57610d0d613b77565b90816005811115610d2057610d20613b77565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d5457610d54613b77565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610e0757610e07613b77565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206141f18339815191525f610e5284611c86565b90505f80610e638360400151612008565b5091509150610e7185612243565b5f8581526004850160205260408120610e899161390c565b5f610e938361185e565b9050816001600160401b031681606001516001600160401b03161015610ecb5760405162461bcd60e51b81526004016105dc90613e1e565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f105760405162461bcd60e51b81526004016105dc90613e60565b60015f87815260038701602052604090205460ff166004811115610f3657610f36613b77565b14610f9f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105dc565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad86001600160401b03831664e8d4a51000613ea9565b5f61104e8261185e565b6080015192915050565b61106181612243565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206141f1833981519152916005600160991b019163ee5b48eb91610a1691600401613d6d565b81156110d7576110d58382611547565b505b610a568361231c565b5f805160206141f18339815191525f6110f884611c86565b90505f806111098360400151612008565b509150915061111785611bb3565b5f858152600585016020526040812061112f9161390c565b5f6111398361185e565b9050816001600160401b031681606001516001600160401b031610156111715760405162461bcd60e51b81526004016105dc90613e1e565b5f8681526003808701602052604090912001546001600160401b03808416911611156111af5760405162461bcd60e51b81526004016105dc90613e60565b60035f87815260038701602052604090205460ff1660048111156111d5576111d5613b77565b146112295760405162461bcd60e51b815260206004820152603160248201525f805160206142118339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105dc565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142318339815191525f61129883611c86565b90505f806112a98360400151611e67565b915091508061130b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105dc565b5f8281526005850160205260408120805461132590613bc6565b9050118015611357575060015f83815260078601602052604090205460ff16600581111561135557611355613b77565b145b6113735760405162461bcd60e51b81526004016105dc90613ec0565b5f828152600585016020526040812061138b9161390c565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061423183398151915292919061147c90613bc6565b90501180156114ae575060015f83815260078301602052604090205460ff1660058111156114ac576114ac613b77565b145b6114ca5760405162461bcd60e51b81526004016105dc90613ec0565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613d6d565b5f610ad88233346126ad565b5f8061151a34612b30565b905061152885828686612bda565b9150505b9392505050565b61153b61300e565b61154481613059565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611592573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115b99190810190613f26565b915091508061161c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105dc565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561165f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116839190613d56565b8251146116e75760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105dc565b60208201516001600160a01b03161561175d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105dc565b5f8061176c846040015161309c565b915091508187146117d95760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105dc565b9695505050505050565b5f8181525f805160206142718339815191526020526040812060020180545f8051602061423183398151915291600160a01b9091046001600160401b0316908190601461182f83613ff8565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061427183398151915290528390208351918201909352825491925f8051602061423183398151915292829060ff1660058111156118de576118de613b77565b60058111156118ef576118ef613b77565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f9182525f805160206142718339815191526020526040909120600301805467ffffffffffffffff19166001600160401b03909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a0f576119cf81600161401d565b6119da906008613ea9565b5081515f908390839081106119f1576119f1614030565b60200101906001600160f81b03191690815f1a9053506001016119bb565b505f5b6004811015611a7257611a2681600361401d565b611a31906008613ea9565b6001901c60f81b82611a44836002614044565b81518110611a5457611a54614030565b60200101906001600160f81b03191690815f1a905350600101611a12565b505f5b6020811015611ad457611a8981601f61401d565b611a94906008613ea9565b86901c60f81b82611aa6836006614044565b81518110611ab657611ab6614030565b60200101906001600160f81b03191690815f1a905350600101611a75565b505f5b6008811015611b3f57611aeb81600761401d565b611af6906008613ea9565b6001600160401b038616901c60f81b82611b11836026614044565b81518110611b2157611b21614030565b60200101906001600160f81b03191690815f1a905350600101611ad7565b505f5b6008811015611baa57611b5681600761401d565b611b61906008613ea9565b6001600160401b038516901c60f81b82611b7c83602e614044565b81518110611b8c57611b8c614030565b60200101906001600160f81b03191690815f1a905350600101611b42565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206141f1833981519152929190611bfb90613bc6565b9050118015611c2d575060035f83815260038301602052604090205460ff166004811115611c2b57611c2b613b77565b145b611c825760405162461bcd60e51b815260206004820152603360248201525f8051602061421183398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105dc565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206142318339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611cfb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d229190810190613f26565b9150915080611d895760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105dc565b8254825114611dec5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105dc565b60208201516001600160a01b031615611e5f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105dc565b509392505050565b5f808251602714611e8a5760405162461bcd60e51b81526004016105dc90614057565b5f805b6002811015611ed957611ea181600161401d565b611eac906008613ea9565b61ffff16858281518110611ec257611ec2614030565b016020015160f81c901b9190911790600101611e8d565b5061ffff811615611efc5760405162461bcd60e51b81526004016105dc906140a0565b5f805b6004811015611f5757611f1381600361401d565b611f1e906008613ea9565b63ffffffff1686611f30836002614044565b81518110611f4057611f40614030565b016020015160f81c901b9190911790600101611eff565b5063ffffffff8116600214611f7e5760405162461bcd60e51b81526004016105dc906140e3565b5f805b6020811015611fd357611f9581601f61401d565b611fa0906008613ea9565b87611fac836006614044565b81518110611fbc57611fbc614030565b016020015160f81c901b9190911790600101611f81565b505f86602681518110611fe857611fe8614030565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461202c5760405162461bcd60e51b81526004016105dc90614057565b5f805b600281101561207b5761204381600161401d565b61204e906008613ea9565b61ffff1686828151811061206457612064614030565b016020015160f81c901b919091179060010161202f565b5061ffff81161561209e5760405162461bcd60e51b81526004016105dc906140a0565b5f805b60048110156120f9576120b581600361401d565b6120c0906008613ea9565b63ffffffff16876120d2836002614044565b815181106120e2576120e2614030565b016020015160f81c901b91909117906001016120a1565b5063ffffffff81166003146121205760405162461bcd60e51b81526004016105dc906140e3565b5f805b60208110156121755761213781601f61401d565b612142906008613ea9565b8861214e836006614044565b8151811061215e5761215e614030565b016020015160f81c901b9190911790600101612123565b505f805b60088110156121d45761218d81600761401d565b612198906008613ea9565b6001600160401b0316896121ad836026614044565b815181106121bd576121bd614030565b016020015160f81c901b9190911790600101612179565b505f805b6008811015612233576121ec81600761401d565b6121f7906008613ea9565b6001600160401b03168a61220c83602e614044565b8151811061221c5761221c614030565b016020015160f81c901b91909117906001016121d8565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206141f183398151915292919061228b90613bc6565b90501180156122bd575060015f83815260038301602052604090205460ff1660048111156122bb576122bb613b77565b145b611c825760405162461bcd60e51b815260206004820152603860248201525f8051602061421183398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105dc565b5f8181525f805160206142718339815191526020526040808220815160e0810190925280545f8051602061423183398151915293929190829060ff16600581111561236957612369613b77565b600581111561237a5761237a613b77565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123f4576123f4613b77565b146124505760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105dc565b60408101516001600160a01b0316336001600160a01b0316146124ca5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105dc565b6124d78160800151613274565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561251b5761251b613b77565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125cf846125c9816117e3565b5f611996565b5f85815260068501602052604090209091506125eb8282613c43565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612618908590600401613d24565b6020604051808303815f875af1158015612634573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126589190613d56565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126b6613415565b5f6126c083610ac8565b90505f805160206141f18339815191525f6126da8761185e565b90506002815160058111156126f1576126f1613b77565b146127505760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105dc565b5f838260800151612761919061412a565b905061276d8882611959565b5f612777896117e3565b90505f60028a8a846040516020016127c19392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f19818403018152908290526127db9161414a565b602060405180830381855afa1580156127f6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128199190613d56565b5f8181526003870160205260409020600201549091506001600160401b0316156128a25760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e496044820152731108185b1c9958591e481c9959da5cdd195c995960621b60648201526084016105dc565b6128ab86613274565b5f6128b78b8486611996565b5f83815260048801602052604090209091506128d38282613c43565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612900908590600401613d24565b6020604051808303815f875af115801561291c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129409190613d56565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff021916908360048111156129ef576129ef613b77565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061152c60015f8051602061425183398151915255565b5f5f805160206141f18339815191528282612b4a82610ac8565b83549091506001600160401b03821610801590612b7457508260010154816001600160401b031611155b612bd25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105dc565b949350505050565b5f612be3613415565b5f80516020614231833981519152426001600160401b038516118015612c1d57506001600160401b038416612c1b426202a300614044565b115b612c7f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105dc565b85612cd65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105dc565b5f86815260088201602052604090205415612d445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105dc565b8251603014612dab5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105dc565b612db485613274565b5f80612dfb6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061345f565b5f82815260058601602052604090209193509150612e198282613c43565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e46908590600401613d24565b6020604051808303815f875af1158015612e62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e869190613d56565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115612eff57612eff613b77565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612fa8836117e3565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612bd260015f8051602061425183398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661305757604051631afcd79f60e31b815260040160405180910390fd5b565b61306161300e565b61306a81613804565b6115446060820135608083013561308760c0850160a08601613a3a565b61309760e0860160c08701614165565b613825565b5f808251602e146130bf5760405162461bcd60e51b81526004016105dc90614057565b5f805b600281101561310e576130d681600161401d565b6130e1906008613ea9565b61ffff168582815181106130f7576130f7614030565b016020015160f81c901b91909117906001016130c2565b5061ffff8116156131315760405162461bcd60e51b81526004016105dc906140a0565b5f805b600481101561318c5761314881600361401d565b613153906008613ea9565b63ffffffff1686613165836002614044565b8151811061317557613175614030565b016020015160f81c901b9190911790600101613134565b5063ffffffff81166004146131b35760405162461bcd60e51b81526004016105dc906140e3565b5f805b6020811015613208576131ca81601f61401d565b6131d5906008613ea9565b876131e1836006614044565b815181106131f1576131f1614030565b016020015160f81c901b91909117906001016131b6565b505f805b60088110156132675761322081600761401d565b61322b906008613ea9565b6001600160401b031688613240836026614044565b8151811061325057613250614030565b016020015160f81c901b919091179060010161320c565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142318339815191529060ff165f036132b2575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132fa908361401d565b10613316576001600160401b0384166040830152808252613335565b8382604001818151613328919061412a565b6001600160401b03169052505b5f82602001518360400151606461334c9190614180565b61335691906141ab565b600285015490915060ff90811690821611156133d15760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105dc565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061425183398151915280546001190161344657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061425183398151915255565b5f60608260800151516030146134c95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105dc565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135405761350081600161401d565b61350b906008613ea9565b5081515f9083908390811061352257613522614030565b60200101906001600160f81b03191690815f1a9053506001016134ec565b505f5b600481101561359e5761355781600361401d565b613562906008613ea9565b505f82613570836002614044565b8151811061358057613580614030565b60200101906001600160f81b03191690815f1a905350600101613543565b505f5b60208110156135fb57845181602081106135bd576135bd614030565b1a60f81b826135cd836006614044565b815181106135dd576135dd614030565b60200101906001600160f81b03191690815f1a9053506001016135a1565b505f5b602081101561365b578460200151816020811061361d5761361d614030565b1a60f81b8261362d836026614044565b8151811061363d5761363d614030565b60200101906001600160f81b03191690815f1a9053506001016135fe565b505f5b60088110156136cf5761367281600761401d565b61367d906008613ea9565b60ff1685604001516001600160401b0316901c60f81b828260466136a19190614044565b815181106136b1576136b1614030565b60200101906001600160f81b03191690815f1a90535060010161365e565b505f5b603081101561373a57846080015181815181106136f1576136f1614030565b01602001516001600160f81b0319168261370c83604e614044565b8151811061371c5761371c614030565b60200101906001600160f81b03191690815f1a9053506001016136d2565b505f5b60088110156137ac5761375181600761401d565b61375c906008613ea9565b60608601516001600160401b0390811691161c60f81b8261377e83607e614044565b8151811061378e5761378e614030565b60200101906001600160f81b03191690815f1a90535060010161373d565b506002816040516137bd919061414a565b602060405180830381855afa1580156137d8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137fb9190613d56565b94909350915050565b61380c61300e565b613814613880565b61381c613890565b61154481613898565b61382d61300e565b5f5f805160206141f1833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61388861300e565b613057613904565b61305761300e565b6138a061300e565b80355f8051602061423183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138ea60608301604084016141d0565b600291909101805460ff191660ff90921691909117905550565b61344c61300e565b50805461391890613bc6565b5f825580601f10613927575050565b601f0160209004905f5260205f209081019061154491905b80821115613952575f815560010161393f565b5090565b5f60e08284031215613966575f80fd5b50919050565b8015158114611544575f80fd5b803563ffffffff8116811461398c575f80fd5b919050565b5f805f606084860312156139a3575f80fd5b8335925060208401356139b58161396c565b91506139c360408501613979565b90509250925092565b5f602082840312156139dc575f80fd5b5035919050565b5f602082840312156139f3575f80fd5b61152c82613979565b5f8060408385031215613a0d575f80fd5b613a1683613979565b946020939093013593505050565b80356001600160401b038116811461398c575f80fd5b5f60208284031215613a4a575f80fd5b61152c82613a24565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a8957613a89613a53565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613ab757613ab7613a53565b604052919050565b5f6001600160401b03821115613ad757613ad7613a53565b50601f01601f191660200190565b5f805f60608486031215613af7575f80fd5b83359250613b0760208501613a24565b915060408401356001600160401b03811115613b21575f80fd5b8401601f81018613613b31575f80fd5b8035613b44613b3f82613abf565b613a8f565b818152876020838501011115613b58575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613bbf57613bbf613b8b565b5092915050565b600181811c90821680613bda57607f821691505b60208210810361396657634e487b7160e01b5f52602260045260245ffd5b601f821115610a5657805f5260205f20601f840160051c81016020851015613c1d5750805b601f840160051c820191505b81811015613c3c575f8155600101613c29565b5050505050565b81516001600160401b03811115613c5c57613c5c613a53565b613c7081613c6a8454613bc6565b84613bf8565b602080601f831160018114613ca3575f8415613c8c5750858301515b5f19600386901b1c1916600185901b178555613cfa565b5f85815260208120601f198616915b82811015613cd157888601518255948401946001909101908401613cb2565b5085821015613cee57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613d1c578181015183820152602001613d04565b50505f910152565b602081525f8251806020840152613d42816040850160208701613d02565b601f01601f19169190910160400192915050565b5f60208284031215613d66575f80fd5b5051919050565b5f60208083525f8454613d7f81613bc6565b806020870152604060018084165f8114613da05760018114613dbc57613de9565b60ff19851660408a0152604084151560051b8a01019550613de9565b895f5260205f205f5b85811015613de05781548b8201860152908301908801613dc5565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613e1957613e19613df7565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad857610ad8613b8b565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611544575f80fd5b805161398c8161396c565b5f8060408385031215613f37575f80fd5b82516001600160401b0380821115613f4d575f80fd5b9084019060608287031215613f60575f80fd5b613f68613a67565b82518152602080840151613f7b81613f07565b82820152604084015183811115613f90575f80fd5b80850194505087601f850112613fa4575f80fd5b83519250613fb4613b3f84613abf565b8381528882858701011115613fc7575f80fd5b613fd684838301848801613d02565b80604084015250819550613feb818801613f1b565b9450505050509250929050565b5f6001600160401b0380831681810361401357614013613b8b565b6001019392505050565b81810381811115610ad857610ad8613b8b565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad857610ad8613b8b565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613bbf57613bbf613b8b565b5f825161415b818460208701613d02565b9190910192915050565b5f60208284031215614175575f80fd5b813561152c81613f07565b6001600160401b038181168382160280821691908281146141a3576141a3613b8b565b505092915050565b5f6001600160401b03808416806141c4576141c4613df7565b92169190910492915050565b5f602082840312156141e0575f80fd5b813560ff8116811461152c575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -715,31 +715,31 @@ func (it *NativeTokenStakingManagerDelegationEndedIterator) Close() error { // NativeTokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegationEnded struct { - ValidationID [32]byte DelegationID [32]byte + ValidationID [32]byte Nonce uint64 Raw types.Log // Blockchain specific contextual infos } // FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -748,23 +748,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg // WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -798,7 +798,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega // ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. // -// Solidity: event DelegationEnded(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { event := new(NativeTokenStakingManagerDelegationEnded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { @@ -877,59 +877,60 @@ func (it *NativeTokenStakingManagerDelegatorAddedIterator) Close() error { // NativeTokenStakingManagerDelegatorAdded represents a DelegatorAdded event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegatorAdded struct { - ValidationID [32]byte - SetWeightMessageID [32]byte DelegationID [32]byte - DelegatorWeight uint64 - ValidatorWeight uint64 + ValidationID [32]byte + DelegatorAddress common.Address Nonce uint64 + ValidatorWeight uint64 + DelegatorWeight uint64 + SetWeightMessageID [32]byte Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*NativeTokenStakingManagerDelegatorAddedIterator, error) { +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (*NativeTokenStakingManagerDelegatorAddedIterator, error) { + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorAddedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil } -// WatchDelegatorAdded is a free log subscription operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorAdded, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorAdded, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (event.Subscription, error) { + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) if err != nil { return nil, err } @@ -961,9 +962,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorAdded is a log parse operation binding the contract event 0x94935c0cdcc07c88144fb86c56dac46e6c4666912aab91dec299fa002e9504de. +// ParseDelegatorAdded is a log parse operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. // -// Solidity: event DelegatorAdded(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 delegatorWeight, uint64 validatorWeight, uint64 nonce) +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*NativeTokenStakingManagerDelegatorAdded, error) { event := new(NativeTokenStakingManagerDelegatorAdded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { @@ -1042,8 +1043,8 @@ func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Close() error { // NativeTokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegatorRegistered struct { - ValidationID [32]byte DelegationID [32]byte + ValidationID [32]byte Nonce uint64 StartTime *big.Int Raw types.Log // Blockchain specific contextual infos @@ -1051,23 +1052,23 @@ type NativeTokenStakingManagerDelegatorRegistered struct { // FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -1076,23 +1077,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg // WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, validationID [][32]byte, delegationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { delegationIDRule = append(delegationIDRule, delegationIDItem) } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } var nonceRule []interface{} for _, nonceItem := range nonce { nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", validationIDRule, delegationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -1126,7 +1127,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega // ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. // -// Solidity: event DelegatorRegistered(bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*NativeTokenStakingManagerDelegatorRegistered, error) { event := new(NativeTokenStakingManagerDelegatorRegistered) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { @@ -1205,59 +1206,59 @@ func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Close() // NativeTokenStakingManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegatorRemovalInitialized struct { - ValidationID [32]byte - SetWeightMessageID [32]byte DelegationID [32]byte - ValidatorWeight uint64 + ValidationID [32]byte Nonce uint64 + ValidatorWeight uint64 EndTime *big.Int + SetWeightMessageID [32]byte Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte, delegationID [][32]byte) (event.Subscription, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } var validationIDRule []interface{} for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", validationIDRule, setWeightMessageIDRule, delegationIDRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule, nonceRule) if err != nil { return nil, err } @@ -1289,9 +1290,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x822844d798a52d3b460574dc03548db90f37ce643c77f0b80fdf8865c4c7d28c. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, uint64 validatorWeight, uint64 nonce, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerDelegatorRemovalInitialized, error) { event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index cb915ea92..c16fae9df 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -145,7 +145,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function _initializeDelegatorRegistration( bytes32 validationID, - address delegator, + address delegatorAddress, uint256 delegationAmount ) internal nonReentrant returns (bytes32) { uint64 weight = valueToWeight(_lock(delegationAmount)); @@ -161,12 +161,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _setValidatorWeight(validationID, newValidatorWeight); uint64 nonce = _getAndIncrementNonce(validationID); - bytes32 delegationID = sha256(abi.encodePacked(validationID, delegator, nonce)); + bytes32 delegationID = sha256(abi.encodePacked(validationID, delegatorAddress, nonce)); - // Ensure the delegator is not already registered + // Ensure the delegationID is not already registered require( $._delegatorStakes[delegationID].weight == 0, - "PoSValidatorManager: delegator already registered" + "PoSValidatorManager: delegationID already registered" ); _checkAndUpdateChurnTracker(weight); @@ -177,10 +177,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager $._pendingRegisterDelegatorMessages[delegationID] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); - // Store the delegator information + // Store the delegation information $._delegatorStakes[delegationID] = Delegator({ status: DelegatorStatus.PendingAdded, - owner: delegator, + owner: delegatorAddress, validationID: validationID, weight: weight, startedAt: 0, @@ -190,12 +190,13 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager }); emit DelegatorAdded({ - validationID: validationID, - setWeightMessageID: messageID, delegationID: delegationID, - delegatorWeight: weight, + validationID: validationID, + delegatorAddress: delegatorAddress, + nonce: nonce, validatorWeight: newValidatorWeight, - nonce: nonce + delegatorWeight: weight, + setWeightMessageID: messageID }); return delegationID; } @@ -221,7 +222,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // The received nonce should be no greater than the highest sent nonce require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); - // It should also be greater than or equal to the delegator's starting nonce + // It should also be greater than or equal to the delegationID's starting nonce require( $._delegatorStakes[delegationID].startingNonce <= nonce, "PoSValidatorManager: nonce does not match" @@ -229,14 +230,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, - "PoSValidatorManager: delegator not pending added" + "PoSValidatorManager: delegationID not pending added" ); - // Update the delegator status + // Update the delegation status $._delegatorStakes[delegationID].status = DelegatorStatus.Active; $._delegatorStakes[delegationID].startedAt = uint64(block.timestamp); emit DelegatorRegistered({ - validationID: validationID, delegationID: delegationID, + validationID: validationID, nonce: nonce, startTime: block.timestamp }); @@ -263,7 +264,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager delegator.owner == _msgSender(), "PoSValidatorManager: delegation not owned by sender" ); require( - delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegator not active" + delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegation not active" ); uint64 nonce = _getAndIncrementNonce(validationID); delegator.status = DelegatorStatus.PendingRemoved; @@ -284,12 +285,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); emit DelegatorRemovalInitialized({ - validationID: validationID, - setWeightMessageID: messageID, delegationID: delegationID, - validatorWeight: newValidatorWeight, + validationID: validationID, nonce: nonce, - endTime: block.timestamp + validatorWeight: newValidatorWeight, + endTime: block.timestamp, + setWeightMessageID: messageID }); } @@ -320,7 +321,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, - "PoSValidatorManager: delegator not pending added" + "PoSValidatorManager: delegation not pending added" ); // Update the delegator status @@ -328,7 +329,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // TODO: Unlock the delegator's stake and their reward - emit DelegationEnded(validationID, delegationID, nonce); + emit DelegationEnded(delegationID, validationID, nonce); } function _checkPendingEndDelegatorMessage(bytes32 delegationID) private view { @@ -336,7 +337,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( $._pendingEndDelegatorMessages[delegationID].length > 0 && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, - "PoSValidatorManager: delegator removal not pending" + "PoSValidatorManager: delegation removal not pending" ); } @@ -345,7 +346,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( $._pendingRegisterDelegatorMessages[delegationID].length > 0 && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, - "PoSValidatorManager: delegator registration not pending" + "PoSValidatorManager: delegation registration not pending" ); } } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 09b1c3e9f..aae3b8b3b 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -36,65 +36,63 @@ struct Delegator { } interface IPoSValidatorManager is IValidatorManager { - // TODO: Decide what to include in the events. /** * @notice Event emitted when a delegator registration is initiated - * @param validationID The ID of the validation period - * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain * @param delegationID The ID of the delegation - * @param delegatorWeight The weight of the delegator - * @param validatorWeight The updated validator weight that is sent to the P-Chain + * @param validationID The ID of the validation period + * @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 + * @param delegatorWeight The weight of the delegator + * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain */ event DelegatorAdded( - bytes32 indexed validationID, - bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, - uint64 delegatorWeight, + bytes32 indexed validationID, + address indexed delegatorAddress, + uint64 nonce, uint64 validatorWeight, - uint64 nonce + uint64 delegatorWeight, + bytes32 setWeightMessageID ); /** * @notice Event emitted when a delegator registration is completed - * @param validationID The ID of the validation period * @param delegationID The ID of the delegation * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain * @param startTime The time at which the registration was completed */ event DelegatorRegistered( - bytes32 indexed validationID, bytes32 indexed delegationID, + bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime ); /** * @notice Event emitted when delegator removal is initiated - * @param validationID The ID of the validation period - * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain * @param delegationID The ID of the delegation - * @param validatorWeight The updated validator weight that is sent to the P-Chain * @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 endTime The time at which the removal was initiated + * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain */ event DelegatorRemovalInitialized( - bytes32 indexed validationID, - bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, + bytes32 indexed validationID, + uint64 indexed nonce, uint64 validatorWeight, - uint64 nonce, - uint256 endTime + uint256 endTime, + bytes32 setWeightMessageID ); /** * @notice Event emitted when delegator removal is completed - * @param validationID The ID of the validation period * @param delegationID The ID of the delegation * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain */ event DelegationEnded( - bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce + bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce ); /** diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 6e2904024..dd8f8bdbd 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -58,11 +58,11 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function _initializeDelegatorRegistration( bytes32 validationID, - address delegator, + address delegatorAddress, uint64 weight ) internal virtual override returns (bytes32) { uint256 value = app.weightToValue(weight); - vm.startPrank(delegator); + vm.startPrank(delegatorAddress); bytes32 delegationID = app.initializeDelegatorRegistration(validationID, value); vm.stopPrank(); return delegationID; diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index fcb2292d7..cd97aee36 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -51,12 +51,12 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function _initializeDelegatorRegistration( bytes32 validationID, - address delegator, + address delegatorAddress, uint64 weight ) internal virtual override returns (bytes32) { uint256 value = app.weightToValue(weight); - vm.prank(delegator); - vm.deal(delegator, value); + vm.prank(delegatorAddress); + vm.deal(delegatorAddress, value); return app.initializeDelegatorRegistration{value: value}(validationID); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 1607c81b3..1fe85d75c 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -25,32 +25,33 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { PoSValidatorManager public posValidatorManager; event DelegatorAdded( - bytes32 indexed validationID, - bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, - uint64 delegatorWeight, + bytes32 indexed validationID, + address indexed delegatorAddress, + uint64 nonce, uint64 validatorWeight, - uint64 nonce + uint64 delegatorWeight, + bytes32 setWeightMessageID ); event DelegatorRegistered( - bytes32 indexed validationID, bytes32 indexed delegationID, + bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime ); event DelegatorRemovalInitialized( - bytes32 indexed validationID, - bytes32 indexed setWeightMessageID, bytes32 indexed delegationID, + bytes32 indexed validationID, + uint64 indexed nonce, uint64 validatorWeight, - uint64 nonce, - uint256 endTime + uint256 endTime, + bytes32 setWeightMessageID ); event DelegationEnded( - bytes32 indexed validationID, bytes32 indexed delegationID, uint64 indexed nonce + bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce ); function testInvalidUptimeWarpMessage() public { @@ -157,7 +158,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -176,7 +177,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -201,7 +202,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -229,7 +230,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator1 = DEFAULT_DELEGATOR_ADDRESS; _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator1, + delegatorAddress: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -238,7 +239,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator2 = address(0x5678567856785678567856785678567856785678); bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator2, + delegatorAddress: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT @@ -272,7 +273,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator1 = DEFAULT_DELEGATOR_ADDRESS; bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator1, + delegatorAddress: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -281,7 +282,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator2 = address(0x5678567856785678567856785678567856785678); _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator2, + delegatorAddress: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT @@ -309,7 +310,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -324,7 +325,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _setUpInitializeEndDelegation({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, @@ -343,7 +344,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -358,7 +359,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _setUpInitializeEndDelegation({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, @@ -381,7 +382,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -396,7 +397,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _setUpInitializeEndDelegation({ validationID: validationID, - delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, @@ -418,7 +419,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator1 = DEFAULT_DELEGATOR_ADDRESS; bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator1, + delegatorAddress: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -434,7 +435,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator2 = address(0x5678567856785678567856785678567856785678); bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator2, + delegatorAddress: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT @@ -452,7 +453,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Initialize end delegation for both delegators _setUpInitializeEndDelegation({ validationID: validationID, - delegator: delegator1, + delegatorAddress: delegator1, delegationID: delegationID1, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -460,7 +461,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpInitializeEndDelegation({ validationID: validationID, - delegator: delegator2, + delegatorAddress: delegator2, delegationID: delegationID2, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, @@ -492,7 +493,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator1 = DEFAULT_DELEGATOR_ADDRESS; bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator1, + delegatorAddress: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -508,7 +509,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator2 = address(0x5678567856785678567856785678567856785678); bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ validationID: validationID, - delegator: delegator2, + delegatorAddress: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT @@ -526,7 +527,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Initialize end delegation for both delegators _setUpInitializeEndDelegation({ validationID: validationID, - delegator: delegator1, + delegatorAddress: delegator1, delegationID: delegationID1, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, @@ -534,7 +535,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _setUpInitializeEndDelegation({ validationID: validationID, - delegator: delegator2, + delegatorAddress: delegator2, delegationID: delegationID2, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, @@ -571,7 +572,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _initializeDelegatorRegistration( bytes32 validationID, - address delegator, + address delegatorAddress, uint64 weight ) internal virtual returns (bytes32); @@ -580,7 +581,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // function _setUpInitializeDelegatorRegistration( bytes32 validationID, - address delegator, + address delegatorAddress, uint64 weight, uint64 registrationTimestamp, uint64 expectedValidatorWeight, @@ -591,19 +592,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.warp(registrationTimestamp); - _beforeSend(weight, delegator); + _beforeSend(weight, delegatorAddress); vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorAdded({ + delegationID: sha256(abi.encodePacked(validationID, delegatorAddress, expectedNonce)), validationID: validationID, - setWeightMessageID: bytes32(0), - delegationID: sha256(abi.encodePacked(validationID, delegator, expectedNonce)), - delegatorWeight: weight, + delegatorAddress: delegatorAddress, + nonce: expectedNonce, validatorWeight: expectedValidatorWeight, - nonce: expectedNonce + delegatorWeight: weight, + setWeightMessageID: bytes32(0) }); - return _initializeDelegatorRegistration(validationID, delegator, weight); + return _initializeDelegatorRegistration(validationID, delegatorAddress, weight); } function _setUpCompleteDelegatorRegistration( @@ -622,8 +624,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(completeRegistrationTimestamp); vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorRegistered({ - validationID: validationID, delegationID: delegationID, + validationID: validationID, nonce: expectedNonce, startTime: completeRegistrationTimestamp }); @@ -633,7 +635,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _setUpInitializeEndDelegation( bytes32 validationID, - address delegator, + address delegatorAddress, bytes32 delegationID, uint64 endDelegationTimestamp, uint64 expectedValidatorWeight, @@ -646,14 +648,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorRemovalInitialized({ - validationID: validationID, - setWeightMessageID: bytes32(0), delegationID: delegationID, - validatorWeight: expectedValidatorWeight, + validationID: validationID, nonce: expectedNonce, - endTime: endDelegationTimestamp + validatorWeight: expectedValidatorWeight, + endTime: endDelegationTimestamp, + setWeightMessageID: bytes32(0) }); - vm.prank(delegator); + vm.prank(delegatorAddress); posValidatorManager.initializeEndDelegation(delegationID, false, 0); return delegationID; } @@ -671,7 +673,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(validationID, delegationID, expectedNonce); + emit DelegationEnded(delegationID, validationID, expectedNonce); posValidatorManager.completeEndDelegation(0, delegationID); assertEq(posValidatorManager.getWeight(validationID), expectedValidatorWeight); return delegationID; From 0a4ae92f2bc841ace1ac58c23ee8a81be2027b3d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 11:32:12 -0500 Subject: [PATCH 201/545] fix e2e --- tests/flows/staking/erc20_delegation.go | 21 ++++++++++++++------- tests/flows/staking/native_delegation.go | 21 ++++++++++++++------- tests/utils/staking.go | 24 ++++++++++++------------ 3 files changed, 40 insertions(+), 26 deletions(-) diff --git a/tests/flows/staking/erc20_delegation.go b/tests/flows/staking/erc20_delegation.go index 8ab39c331..9f8c7485f 100644 --- a/tests/flows/staking/erc20_delegation.go +++ b/tests/flows/staking/erc20_delegation.go @@ -28,7 +28,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // Get the subnets info cChainInfo := network.GetPrimaryNetworkInfo() subnetAInfo, _ := utils.GetTwoSubnets(network) - fundedAddress, fundedKey := network.GetFundedAccountInfo() + _, fundedKey := network.GetFundedAccountInfo() pChainInfo := utils.GetPChainInfo(cChainInfo) signatureAggregator := utils.NewSignatureAggregator( @@ -115,6 +115,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // // Register a delegator // + var delegationID ids.ID { delegatorStake := big.NewInt(1e17) delegatorWeight, err := stakingManager.ValueToWeight( @@ -135,6 +136,12 @@ func ERC20Delegation(network interfaces.LocalNetwork) { stakingManagerAddress, stakingManager, ) + initRegistrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorAdded, + ) + Expect(err).Should(BeNil()) + delegationID = initRegistrationEvent.DelegationID // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) @@ -162,7 +169,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteERC20DelegatorRegistration( fundedKey, - fundedAddress, + delegationID, subnetAInfo, stakingManagerAddress, registrationSignedMessage, @@ -174,7 +181,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(registrationEvent.Delegator).Should(Equal(fundedAddress)) + Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) } // // Delist the delegator @@ -185,7 +192,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { fundedKey, subnetAInfo, stakingManager, - validationID, + delegationID, ) delegatorRemovalEvent, err := utils.GetEventFromLogs( receipt.Logs, @@ -193,7 +200,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(delegatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(delegatorRemovalEvent.Delegator).Should(Equal(fundedAddress)) + Expect(delegatorRemovalEvent.DelegationID[:]).Should(Equal(delegationID[:])) // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) @@ -217,7 +224,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteEndERC20Delegation( fundedKey, - fundedAddress, + delegationID, subnetAInfo, stakingManagerAddress, signedMessage, @@ -230,6 +237,6 @@ func ERC20Delegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(registrationEvent.Delegator).Should(Equal(fundedAddress)) + Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) } } diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go index a322f000d..2dc915c5c 100644 --- a/tests/flows/staking/native_delegation.go +++ b/tests/flows/staking/native_delegation.go @@ -28,7 +28,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // Get the subnets info cChainInfo := network.GetPrimaryNetworkInfo() subnetAInfo, _ := utils.GetTwoSubnets(network) - fundedAddress, fundedKey := network.GetFundedAccountInfo() + _, fundedKey := network.GetFundedAccountInfo() pChainInfo := utils.GetPChainInfo(cChainInfo) signatureAggregator := utils.NewSignatureAggregator( @@ -112,6 +112,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // // Register a delegator // + var delegationID ids.ID { delegatorStake := big.NewInt(1e17) delegatorWeight, err := stakingManager.ValueToWeight( @@ -131,6 +132,12 @@ func NativeDelegation(network interfaces.LocalNetwork) { stakingManagerAddress, stakingManager, ) + initRegistrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorAdded, + ) + Expect(err).Should(BeNil()) + delegationID = initRegistrationEvent.DelegationID // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) @@ -158,7 +165,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteNativeDelegatorRegistration( fundedKey, - fundedAddress, + delegationID, subnetAInfo, stakingManagerAddress, registrationSignedMessage, @@ -170,7 +177,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(registrationEvent.Delegator).Should(Equal(fundedAddress)) + Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) } // // Delist the delegator @@ -181,7 +188,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { fundedKey, subnetAInfo, stakingManager, - validationID, + delegationID, ) delegatorRemovalEvent, err := utils.GetEventFromLogs( receipt.Logs, @@ -189,7 +196,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(delegatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(delegatorRemovalEvent.Delegator).Should(Equal(fundedAddress)) + Expect(delegatorRemovalEvent.DelegationID[:]).Should(Equal(delegationID[:])) // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) @@ -213,7 +220,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteEndNativeDelegation( fundedKey, - fundedAddress, + delegationID, subnetAInfo, stakingManagerAddress, signedMessage, @@ -226,6 +233,6 @@ func NativeDelegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(registrationEvent.Delegator).Should(Equal(fundedAddress)) + Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) } } diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 2a90b4819..31dde39f1 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -716,14 +716,14 @@ func InitializeERC20DelegatorRegistration( func CompleteERC20DelegatorRegistration( sendingKey *ecdsa.PrivateKey, - delegator common.Address, + delegationID ids.ID, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegator) + callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegationID) Expect(err).Should(BeNil()) return CallWarpReceiver( callData, @@ -738,13 +738,13 @@ func InitializeEndERC20Delegation( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, - validationID ids.ID, + delegationID ids.ID, ) *types.Receipt { opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndDelegation( opts, - validationID, + delegationID, false, 0, ) @@ -754,14 +754,14 @@ func InitializeEndERC20Delegation( func CompleteEndERC20Delegation( sendingKey *ecdsa.PrivateKey, - delegator common.Address, + delegationID ids.ID, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndDelegation", uint32(0), delegator) + callData, err := abi.Pack("completeEndDelegation", uint32(0), delegationID) Expect(err).Should(BeNil()) return CallWarpReceiver( callData, @@ -799,14 +799,14 @@ func InitializeNativeDelegatorRegistration(senderKey *ecdsa.PrivateKey, func CompleteNativeDelegatorRegistration( sendingKey *ecdsa.PrivateKey, - delegator common.Address, + delegationID ids.ID, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegator) + callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegationID) Expect(err).Should(BeNil()) return CallWarpReceiver( callData, @@ -821,13 +821,13 @@ func InitializeEndNativeDelegation( sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, - validationID ids.ID, + delegationID ids.ID, ) *types.Receipt { opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndDelegation( opts, - validationID, + delegationID, false, 0, ) @@ -837,14 +837,14 @@ func InitializeEndNativeDelegation( func CompleteEndNativeDelegation( sendingKey *ecdsa.PrivateKey, - delegator common.Address, + delegationID ids.ID, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() Expect(err).Should(BeNil()) - callData, err := abi.Pack("completeEndDelegation", uint32(0), delegator) + callData, err := abi.Pack("completeEndDelegation", uint32(0), delegationID) Expect(err).Should(BeNil()) return CallWarpReceiver( callData, From 68c9eaae9b85f15e9c88d1efbf780ccdb2115497 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 11:34:49 -0500 Subject: [PATCH 202/545] store starting validator weight --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- .../go/staking/PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/staking/ValidatorManager.sol | 1 + contracts/staking/interfaces/IValidatorManager.sol | 1 + 5 files changed, 5 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index f0d618661..d1f961748 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegationAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516148fb3803806148fb83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147ae8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636a7e3d831161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063b771b3bc1461028a578063bee0a03f146102b0578063d61bed74146102c3575f80fd5b80636a7e3d831461021857806376f786211461022b578063872fda641461023e578063927e7e7514610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df57806362065856146101f257806366435abf14610205575f80fd5b80630322ed98146101155780630915204e1461012a5780630b77f6931461013d5780630cdd098514610150575b5f80fd5b610128610123366004613da0565b6102d6565b005b610128610138366004613de3565b610437565b61012861014b366004613e18565b6105f7565b61018e61015e366004613da0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101286101af366004613e3b565b6106bf565b6101c76101c2366004613da0565b6107a3565b6040516001600160401b039091168152602001610198565b6101286101ed366004613e6d565b6107b9565b61018e610200366004613e9c565b610b15565b6101c7610213366004613da0565b610b2e565b610128610226366004613e18565b610b42565b610128610239366004613ec2565b610bc4565b61018e61024c366004613f8f565b610edd565b61012861025f366004613da0565b610f02565b61012861027236600461402b565b611313565b610128610285366004613e6d565b611322565b6102986005600160991b0181565b6040516001600160a01b039091168152602001610198565b6101286102be366004613da0565b6114db565b6101286102d1366004613de3565b6115aa565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061474283398151915292919061031e9061404b565b9050118015610350575060035f83815260078301602052604090205460ff16600581111561034e5761034e614083565b145b6103b95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103f29190600401614097565b6020604051808303815f875af115801561040e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104329190614121565b505050565b5f805160206147228339815191525f61044f8461178d565b90505f80610460836040015161196e565b509150915061046f8286611ba9565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061049b91613d56565b5f6104a583611cb2565b9050816001600160401b031681606001516001600160401b031610156104dd5760405162461bcd60e51b81526004016103b090614138565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b9092041611156105365760405162461bcd60e51b81526004016103b09061417a565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561057057610570614083565b1461058d5760405162461bcd60e51b81526004016103b0906141c3565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6106018282611dad565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614722833981519152916005600160991b019163ee5b48eb9161067991600401614097565b6020604051808303815f875af1158015610695573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b99190614121565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610708575080546001600160401b03808416911610155b156107265760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556107518484611ec1565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6107b364e8d4a510008361423b565b92915050565b5f805160206147428339815191525f6107d18361178d565b90505f806107e28360400151611edb565b9150915080156108475760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103b0565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561087857610878614083565b600581111561088957610889614083565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f908251600581111561090257610902614083565b1480610920575060018251600581111561091e5761091e614083565b145b61097f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103b0565b60038251600581111561099457610994614083565b036109bb57505f83815260068601602052604081206004916109b69190613d56565b6109bf565b5060055b6020808301515f908152600888019091526040812055818160058111156109e8576109e8614083565b908160058111156109fb576109fb614083565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610a2f57610a2f614083565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610ae257610ae2614083565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6107b36001600160401b03831664e8d4a5100061424e565b5f610b3882611cb2565b6080015192915050565b610b4c8282611ba9565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614722833981519152916005600160991b019163ee5b48eb9161067991600401614097565b8115610ed4575f5f805160206147228339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c25573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c4c9190810190614292565b9150915080610caf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cf2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d169190614121565b825114610d7a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103b0565b60208201516001600160a01b031615610df05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103b0565b5f80610dff846040015161207c565b91509150818814610e6c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103b0565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61043283612254565b5f80610ee8866125e5565b9050610ef685828686612692565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f8051602061472283398151915293929190829060ff166004811115610f6d57610f6d614083565b6004811115610f7e57610f7e614083565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a0909101529050600281516004811115610fe857610fe8614083565b146110475760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084016103b0565b5f61105184612ac6565b9050600382819052506001600160401b034281166060840152811660a08301525f848152600384016020526040812083916110893390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff191660018360048111156110bf576110bf614083565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f61116985611cb2565b905082602001516001600160401b031681608001516001600160401b0316116111e05760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016103b0565b8260200151816080018181516111f69190614364565b6001600160401b031690525061120c8582612b41565b5f61121c86848460800151612c30565b5f8781526005870160209081526040808320338452909152902090915061124382826143d6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611270908590600401614495565b6020604051808303815f875af115801561128c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112b09190614121565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b61131e823383612e4f565b5050565b5f805160206147428339815191525f61133a8361178d565b90505f8061134b8360400151611edb565b91509150806113ad5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103b0565b5f828152600585016020526040812080546113c79061404b565b90501180156113f9575060015f83815260078601602052604090205460ff1660058111156113f7576113f7614083565b145b6114155760405162461bcd60e51b81526004016103b0906144c7565b5f828152600585016020526040812061142d91613d56565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147428339815191529291906115239061404b565b9050118015611555575060015f83815260078301602052604090205460ff16600581111561155357611553614083565b145b6115715760405162461bcd60e51b81526004016103b0906144c7565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103f29190600401614097565b5f805160206147228339815191525f6115c28461178d565b90505f806115d3836040015161196e565b50915091506115e28286611dad565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061160e91613d56565b5f61161883611cb2565b9050816001600160401b031681606001516001600160401b031610156116505760405162461bcd60e51b81526004016103b090614138565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156116a25760405162461bcd60e51b81526004016103b09061417a565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff1660048111156116dc576116dc614083565b146116f95760405162461bcd60e51b81526004016103b0906141c3565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101611302565b60408051606080820183525f8083526020830181905292820152905f805160206147428339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611802573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118299190810190614292565b91509150806118905760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103b0565b82548251146118f35760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103b0565b60208201516001600160a01b0316156119665760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103b0565b509392505050565b5f805f83516036146119925760405162461bcd60e51b81526004016103b09061450e565b5f805b60028110156119e1576119a9816001614557565b6119b490600861424e565b61ffff168682815181106119ca576119ca61456a565b016020015160f81c901b9190911790600101611995565b5061ffff811615611a045760405162461bcd60e51b81526004016103b09061457e565b5f805b6004811015611a5f57611a1b816003614557565b611a2690600861424e565b63ffffffff1687611a388360026145c1565b81518110611a4857611a4861456a565b016020015160f81c901b9190911790600101611a07565b5063ffffffff8116600314611a865760405162461bcd60e51b81526004016103b0906145d4565b5f805b6020811015611adb57611a9d81601f614557565b611aa890600861424e565b88611ab48360066145c1565b81518110611ac457611ac461456a565b016020015160f81c901b9190911790600101611a89565b505f805b6008811015611b3a57611af3816007614557565b611afe90600861424e565b6001600160401b031689611b138360266145c1565b81518110611b2357611b2361456a565b016020015160f81c901b9190911790600101611adf565b505f805b6008811015611b9957611b52816007614557565b611b5d90600861424e565b6001600160401b03168a611b7283602e6145c1565b81518110611b8257611b8261456a565b016020015160f81c901b9190911790600101611b3e565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f80516020614722833981519152929190611c059061404b565b9050118015611c4b575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611c4957611c49614083565b145b6104325760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016103b0565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061478283398151915290528390208351918201909352825491925f8051602061474283398151915292829060ff166005811115611d3257611d32614083565b6005811115611d4357611d43614083565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f80516020614722833981519152929190611e099061404b565b9050118015611e4f575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611e4d57611e4d614083565b145b6104325760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016103b0565b611ec9613224565b611ed28261326f565b61131e816132b5565b5f808251602714611efe5760405162461bcd60e51b81526004016103b09061450e565b5f805b6002811015611f4d57611f15816001614557565b611f2090600861424e565b61ffff16858281518110611f3657611f3661456a565b016020015160f81c901b9190911790600101611f01565b5061ffff811615611f705760405162461bcd60e51b81526004016103b09061457e565b5f805b6004811015611fcb57611f87816003614557565b611f9290600861424e565b63ffffffff1686611fa48360026145c1565b81518110611fb457611fb461456a565b016020015160f81c901b9190911790600101611f73565b5063ffffffff8116600214611ff25760405162461bcd60e51b81526004016103b0906145d4565b5f805b60208110156120475761200981601f614557565b61201490600861424e565b876120208360066145c1565b815181106120305761203061456a565b016020015160f81c901b9190911790600101611ff5565b505f8660268151811061205c5761205c61456a565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461209f5760405162461bcd60e51b81526004016103b09061450e565b5f805b60028110156120ee576120b6816001614557565b6120c190600861424e565b61ffff168582815181106120d7576120d761456a565b016020015160f81c901b91909117906001016120a2565b5061ffff8116156121115760405162461bcd60e51b81526004016103b09061457e565b5f805b600481101561216c57612128816003614557565b61213390600861424e565b63ffffffff16866121458360026145c1565b815181106121555761215561456a565b016020015160f81c901b9190911790600101612114565b5063ffffffff81166004146121935760405162461bcd60e51b81526004016103b0906145d4565b5f805b60208110156121e8576121aa81601f614557565b6121b590600861424e565b876121c18360066145c1565b815181106121d1576121d161456a565b016020015160f81c901b9190911790600101612196565b505f805b600881101561224757612200816007614557565b61220b90600861424e565b6001600160401b0316886122208360266145c1565b815181106122305761223061456a565b016020015160f81c901b91909117906001016121ec565b5090969095509350505050565b5f8181525f805160206147828339815191526020526040808220815160e0810190925280545f8051602061474283398151915293929190829060ff1660058111156122a1576122a1614083565b60058111156122b2576122b2614083565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561232c5761232c614083565b146123885760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103b0565b60408101516001600160a01b0316336001600160a01b0316146124025760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103b0565b61240f8160800151613369565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561245357612453614083565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125078461250181612ac6565b5f612c30565b5f858152600685016020526040902090915061252382826143d6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612550908590600401614495565b6020604051808303815f875af115801561256c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125909190614121565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f80516020614722833981519152816125fe8461350a565b90505f61260a826107a3565b83549091506001600160401b0382161080159061263457508260010154816001600160401b031611155b610efa5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103b0565b5f61269b613540565b5f80516020614742833981519152426001600160401b0385161180156126d557506001600160401b0384166126d3426202a3006145c1565b115b6127375760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103b0565b8561278e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103b0565b5f868152600882016020526040902054156127fc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103b0565b82516030146128635760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103b0565b61286c85613369565b5f806128b36040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613577565b5f828152600586016020526040902091935091506128d182826143d6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128fe908590600401614495565b6020604051808303815f875af115801561291a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061293e9190614121565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156129b7576129b7614083565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055612a6083612ac6565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610efa60015f8051602061476283398151915255565b5f8181525f805160206147828339815191526020526040812060020180545f8051602061474283398151915291600160a01b9091046001600160401b03169081906014612b128361461b565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061478283398151915260205260409020815181545f805160206147428339815191529284929091829060ff19166001836005811115612b8b57612b8b614083565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612ca957612c69816001614557565b612c7490600861424e565b5081515f90839083908110612c8b57612c8b61456a565b60200101906001600160f81b03191690815f1a905350600101612c55565b505f5b6004811015612d0c57612cc0816003614557565b612ccb90600861424e565b6001901c60f81b82612cde8360026145c1565b81518110612cee57612cee61456a565b60200101906001600160f81b03191690815f1a905350600101612cac565b505f5b6020811015612d6e57612d2381601f614557565b612d2e90600861424e565b86901c60f81b82612d408360066145c1565b81518110612d5057612d5061456a565b60200101906001600160f81b03191690815f1a905350600101612d0f565b505f5b6008811015612dd957612d85816007614557565b612d9090600861424e565b6001600160401b038616901c60f81b82612dab8360266145c1565b81518110612dbb57612dbb61456a565b60200101906001600160f81b03191690815f1a905350600101612d71565b505f5b6008811015612e4457612df0816007614557565b612dfb90600861424e565b6001600160401b038516901c60f81b82612e1683602e6145c1565b81518110612e2657612e2661456a565b60200101906001600160f81b03191690815f1a905350600101612ddc565b5090505b9392505050565b612e57613540565b5f612e646101c28361350a565b90505f805160206147228339815191525f612e7e86611cb2565b9050600281516005811115612e9557612e95614083565b14612ef45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016103b0565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b031615612f8d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b60648201526084016103b0565b612f9683613369565b8281608001818151612fa89190614640565b6001600160401b0316905250612fbe8682612b41565b5f612fc887612ac6565b90505f612fda88838560800151612c30565b5f89815260048601602090815260408083206001600160a01b038c168452909152902090915061300a82826143d6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613037908590600401614495565b6020604051808303815f875af1158015613053573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130779190614121565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff191660018360048111156130f8576130f8614083565b02179055506020820151815460408085015160608601516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0267ffffffffffffffff60481b199683166101000296909616610100600160881b03199095169490941794909417169190911783556080808501516001909401805460a0909601518416600160401b026001600160801b0319909616949093169390931793909317905585015190516001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b91613200918c918a906001600160401b0393841681529183166020830152909116604082015260600190565b60405180910390a450505050505061043260015f8051602061476283398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661326d57604051631afcd79f60e31b815260040160405180910390fd5b565b613277613224565b6132808161392f565b6132b26060820135608083013561329d60c0850160a08601613e9c565b6132ad60e0860160c08701614660565b613950565b50565b6132bd613224565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166133495760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103b0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147428339815191529060ff165f036133a7575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133ef9083614557565b1061340b576001600160401b038416604083015280825261342a565b838260400181815161341d9190614640565b6001600160401b03169052505b5f826020015183604001516064613441919061467b565b61344b91906146a6565b600285015490915060ff90811690821611156134c65760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103b0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6107b3827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906139ab565b5f8051602061476283398151915280546001190161357157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135e15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561365857613618816001614557565b61362390600861424e565b5081515f9083908390811061363a5761363a61456a565b60200101906001600160f81b03191690815f1a905350600101613604565b505f5b60048110156136b65761366f816003614557565b61367a90600861424e565b505f826136888360026145c1565b815181106136985761369861456a565b60200101906001600160f81b03191690815f1a90535060010161365b565b505f5b602081101561371357845181602081106136d5576136d561456a565b1a60f81b826136e58360066145c1565b815181106136f5576136f561456a565b60200101906001600160f81b03191690815f1a9053506001016136b9565b505f5b602081101561377357846020015181602081106137355761373561456a565b1a60f81b826137458360266145c1565b815181106137555761375561456a565b60200101906001600160f81b03191690815f1a905350600101613716565b505f5b60088110156137e75761378a816007614557565b61379590600861424e565b60ff1685604001516001600160401b0316901c60f81b828260466137b991906145c1565b815181106137c9576137c961456a565b60200101906001600160f81b03191690815f1a905350600101613776565b505f5b603081101561385257846080015181815181106138095761380961456a565b01602001516001600160f81b0319168261382483604e6145c1565b815181106138345761383461456a565b60200101906001600160f81b03191690815f1a9053506001016137ea565b505f5b60088110156138c457613869816007614557565b61387490600861424e565b60608601516001600160401b0390811691161c60f81b8261389683607e6145c1565b815181106138a6576138a661456a565b60200101906001600160f81b03191690815f1a905350600101613855565b506002816040516138d591906146cb565b602060405180830381855afa1580156138f0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139139190614121565b94909350915050565b60015f8051602061476283398151915255565b613937613224565b61393f613b0d565b613947613b1d565b6132b281613b25565b613958613224565b5f5f80516020614722833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a159190614121565b9050613a2c6001600160a01b038516333086613b91565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a949190614121565b9050818111613afa5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103b0565b613b048282614557565b95945050505050565b613b15613224565b61326d613beb565b61326d613224565b613b2d613224565b80355f8051602061474283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b7760608301604084016146e6565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526106b9908590613bf3565b61391c613224565b5f613c076001600160a01b03841683613c54565b905080515f14158015613c2b575080806020019051810190613c299190614706565b155b1561043257604051635274afe760e01b81526001600160a01b03841660048201526024016103b0565b6060612e4883835f845f80856001600160a01b03168486604051613c7891906146cb565b5f6040518083038185875af1925050503d805f8114613cb2576040519150601f19603f3d011682016040523d82523d5f602084013e613cb7565b606091505b5091509150613cc7868383613cd1565b9695505050505050565b606082613ce657613ce182613d2d565b612e48565b8151158015613cfd57506001600160a01b0384163b155b15613d2657604051639996b31560e01b81526001600160a01b03851660048201526024016103b0565b5080612e48565b805115613d3d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d629061404b565b5f825580601f10613d71575050565b601f0160209004905f5260205f20908101906132b291905b80821115613d9c575f8155600101613d89565b5090565b5f60208284031215613db0575f80fd5b5035919050565b803563ffffffff81168114613dca575f80fd5b919050565b6001600160a01b03811681146132b2575f80fd5b5f8060408385031215613df4575f80fd5b613dfd83613db7565b91506020830135613e0d81613dcf565b809150509250929050565b5f8060408385031215613e29575f80fd5b823591506020830135613e0d81613dcf565b5f80828403610100811215613e4e575f80fd5b60e0811215613e5b575f80fd5b5082915060e0830135613e0d81613dcf565b5f60208284031215613e7d575f80fd5b612e4882613db7565b80356001600160401b0381168114613dca575f80fd5b5f60208284031215613eac575f80fd5b612e4882613e86565b80151581146132b2575f80fd5b5f805f60608486031215613ed4575f80fd5b833592506020840135613ee681613eb5565b9150613ef460408501613db7565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613f3357613f33613efd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f6157613f61613efd565b604052919050565b5f6001600160401b03821115613f8157613f81613efd565b50601f01601f191660200190565b5f805f8060808587031215613fa2575f80fd5b8435935060208501359250613fb960408601613e86565b915060608501356001600160401b03811115613fd3575f80fd5b8501601f81018713613fe3575f80fd5b8035613ff6613ff182613f69565b613f39565b81815288602083850101111561400a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561403c575f80fd5b50508035926020909101359150565b600181811c9082168061405f57607f821691505b60208210810361407d57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f84546140a98161404b565b806020870152604060018084165f81146140ca57600181146140e657614113565b60ff19851660408a0152604084151560051b8a01019550614113565b895f5260205f205f5b8581101561410a5781548b82018601529083019088016140ef565b8a016040019650505b509398975050505050505050565b5f60208284031215614131575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f8261424957614249614213565b500490565b80820281158282048414176107b3576107b3614227565b5f5b8381101561427f578181015183820152602001614267565b50505f910152565b8051613dca81613eb5565b5f80604083850312156142a3575f80fd5b82516001600160401b03808211156142b9575f80fd5b90840190606082870312156142cc575f80fd5b6142d4613f11565b825181526020808401516142e781613dcf565b828201526040840151838111156142fc575f80fd5b80850194505087601f850112614310575f80fd5b83519250614320613ff184613f69565b8381528882858701011115614333575f80fd5b61434284838301848801614265565b80604084015250819550614357818801614287565b9450505050509250929050565b6001600160401b0382811682821603908082111561438457614384614227565b5092915050565b601f82111561043257805f5260205f20601f840160051c810160208510156143b05750805b601f840160051c820191505b818110156143cf575f81556001016143bc565b5050505050565b81516001600160401b038111156143ef576143ef613efd565b614403816143fd845461404b565b8461438b565b602080601f831160018114614436575f841561441f5750858301515b5f19600386901b1c1916600185901b17855561448d565b5f85815260208120601f198616915b8281101561446457888601518255948401946001909101908401614445565b508582101561448157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526144b3816040850160208701614265565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156107b3576107b3614227565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156107b3576107b3614227565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b0380831681810361463657614636614227565b6001019392505050565b6001600160401b0381811683821601908082111561438457614384614227565b5f60208284031215614670575f80fd5b8135612e4881613dcf565b6001600160401b0381811683821602808216919082811461469e5761469e614227565b505092915050565b5f6001600160401b03808416806146bf576146bf614213565b92169190910492915050565b5f82516146dc818460208701614265565b9190910192915050565b5f602082840312156146f6575f80fd5b813560ff81168114612e48575f80fd5b5f60208284031215614716575f80fd5b8151612e4881613eb556fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161498638038061498683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148398061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636a7e3d831161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063b771b3bc1461028a578063bee0a03f146102b0578063d61bed74146102c3575f80fd5b80636a7e3d831461021857806376f786211461022b578063872fda641461023e578063927e7e7514610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df57806362065856146101f257806366435abf14610205575f80fd5b80630322ed98146101155780630915204e1461012a5780630b77f6931461013d5780630cdd098514610150575b5f80fd5b610128610123366004613e2b565b6102d6565b005b610128610138366004613e6e565b610437565b61012861014b366004613ea3565b6105f7565b61018e61015e366004613e2b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101286101af366004613ec6565b6106bf565b6101c76101c2366004613e2b565b6107a3565b6040516001600160401b039091168152602001610198565b6101286101ed366004613ef8565b6107b9565b61018e610200366004613f27565b610b3c565b6101c7610213366004613e2b565b610b55565b610128610226366004613ea3565b610b69565b610128610239366004613f4d565b610beb565b61018e61024c36600461401a565b610f04565b61012861025f366004613e2b565b610f29565b6101286102723660046140b6565b61133a565b610128610285366004613ef8565b611349565b6102986005600160991b0181565b6040516001600160a01b039091168152602001610198565b6101286102be366004613e2b565b611506565b6101286102d1366004613e6e565b6115d5565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206147cd83398151915292919061031e906140d6565b9050118015610350575060035f83815260078301602052604090205460ff16600581111561034e5761034e61410e565b145b6103b95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103f29190600401614122565b6020604051808303815f875af115801561040e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061043291906141ac565b505050565b5f805160206147ad8339815191525f61044f846117b8565b90505f806104608360400151611999565b509150915061046f8286611bd4565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061049b91613de1565b5f6104a583611cdd565b9050816001600160401b031681608001516001600160401b031610156104dd5760405162461bcd60e51b81526004016103b0906141c3565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b9092041611156105365760405162461bcd60e51b81526004016103b090614205565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff1660048111156105705761057061410e565b1461058d5760405162461bcd60e51b81526004016103b09061424e565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6106018282611dee565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206147ad833981519152916005600160991b019163ee5b48eb9161067991600401614122565b6020604051808303815f875af1158015610695573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b991906141ac565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610708575080546001600160401b03808416911610155b156107265760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556107518484611f02565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6107b364e8d4a51000836142c6565b92915050565b5f805160206147cd8339815191525f6107d1836117b8565b90505f806107e28360400151611f1c565b9150915080156108475760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103b0565b5f828152600785016020526040808220815161010081019092528054829060ff1660058111156108795761087961410e565b600581111561088a5761088a61410e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156109115761091161410e565b148061092f575060018251600581111561092d5761092d61410e565b145b61098e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103b0565b6003825160058111156109a3576109a361410e565b036109ca57505f83815260068601602052604081206004916109c59190613de1565b6109ce565b5060055b6020808301515f908152600888019091526040812055818160058111156109f7576109f761410e565b90816005811115610a0a57610a0a61410e565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610a3e57610a3e61410e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610b0957610b0961410e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6107b36001600160401b03831664e8d4a510006142d9565b5f610b5f82611cdd565b60a0015192915050565b610b738282611bd4565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206147ad833981519152916005600160991b019163ee5b48eb9161067991600401614122565b8115610efb575f5f805160206147ad8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610c4c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c73919081019061431d565b9150915080610cd65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016103b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d3d91906141ac565b825114610da15760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016103b0565b60208201516001600160a01b031615610e175760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016103b0565b5f80610e2684604001516120bd565b91509150818814610e935760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016103b0565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b61043283612295565b5f80610f0f8661264d565b9050610f1d858286866126fa565b9150505b949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f805160206147ad83398151915293929190829060ff166004811115610f9457610f9461410e565b6004811115610fa557610fa561410e565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a090910152905060028151600481111561100f5761100f61410e565b1461106e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b60648201526084016103b0565b5f61107884612b4f565b9050600382819052506001600160401b034281166060840152811660a08301525f848152600384016020526040812083916110b03390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff191660018360048111156110e6576110e661410e565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f61119085611cdd565b905082602001516001600160401b03168160a001516001600160401b0316116112075760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016103b0565b82602001518160a00181815161121d91906143ef565b6001600160401b03169052506112338582612bc3565b5f61124386848460a00151612cca565b5f8781526005870160209081526040808320338452909152902090915061126a8282614461565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611297908590600401614520565b6020604051808303815f875af11580156112b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112d791906141ac565b60a0840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b611345823383612ee9565b5050565b5f805160206147cd8339815191525f611361836117b8565b90505f806113728360400151611f1c565b91509150806113d45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103b0565b5f828152600585016020526040812080546113ee906140d6565b9050118015611420575060015f83815260078601602052604090205460ff16600581111561141e5761141e61410e565b145b61143c5760405162461bcd60e51b81526004016103b090614552565b5f828152600585016020526040812061145491613de1565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147cd83398151915292919061154e906140d6565b9050118015611580575060015f83815260078301602052604090205460ff16600581111561157e5761157e61410e565b145b61159c5760405162461bcd60e51b81526004016103b090614552565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916103f29190600401614122565b5f805160206147ad8339815191525f6115ed846117b8565b90505f806115fe8360400151611999565b509150915061160d8286611dee565b5f82815260048501602090815260408083206001600160a01b0389168452909152812061163991613de1565b5f61164383611cdd565b9050816001600160401b031681608001516001600160401b0316101561167b5760405162461bcd60e51b81526004016103b0906141c3565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156116cd5760405162461bcd60e51b81526004016103b090614205565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff1660048111156117075761170761410e565b146117245760405162461bcd60e51b81526004016103b09061424e565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b69101611329565b60408051606080820183525f8083526020830181905292820152905f805160206147cd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561182d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611854919081019061431d565b91509150806118bb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103b0565b825482511461191e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103b0565b60208201516001600160a01b0316156119915760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103b0565b509392505050565b5f805f83516036146119bd5760405162461bcd60e51b81526004016103b090614599565b5f805b6002811015611a0c576119d48160016145e2565b6119df9060086142d9565b61ffff168682815181106119f5576119f56145f5565b016020015160f81c901b91909117906001016119c0565b5061ffff811615611a2f5760405162461bcd60e51b81526004016103b090614609565b5f805b6004811015611a8a57611a468160036145e2565b611a519060086142d9565b63ffffffff1687611a6383600261464c565b81518110611a7357611a736145f5565b016020015160f81c901b9190911790600101611a32565b5063ffffffff8116600314611ab15760405162461bcd60e51b81526004016103b09061465f565b5f805b6020811015611b0657611ac881601f6145e2565b611ad39060086142d9565b88611adf83600661464c565b81518110611aef57611aef6145f5565b016020015160f81c901b9190911790600101611ab4565b505f805b6008811015611b6557611b1e8160076145e2565b611b299060086142d9565b6001600160401b031689611b3e83602661464c565b81518110611b4e57611b4e6145f5565b016020015160f81c901b9190911790600101611b0a565b505f805b6008811015611bc457611b7d8160076145e2565b611b889060086142d9565b6001600160401b03168a611b9d83602e61464c565b81518110611bad57611bad6145f5565b016020015160f81c901b9190911790600101611b69565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206147ad833981519152929190611c30906140d6565b9050118015611c76575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611c7457611c7461410e565b145b6104325760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b60648201526084016103b0565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061480d83398151915290528390208351918201909352825491925f805160206147cd83398151915292829060ff166005811115611d6557611d6561410e565b6005811115611d7657611d7661410e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206147ad833981519152929190611e4a906140d6565b9050118015611e90575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611e8e57611e8e61410e565b145b6104325760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e6700000000000000000060648201526084016103b0565b611f0a6132af565b611f13826132fa565b61134581613340565b5f808251602714611f3f5760405162461bcd60e51b81526004016103b090614599565b5f805b6002811015611f8e57611f568160016145e2565b611f619060086142d9565b61ffff16858281518110611f7757611f776145f5565b016020015160f81c901b9190911790600101611f42565b5061ffff811615611fb15760405162461bcd60e51b81526004016103b090614609565b5f805b600481101561200c57611fc88160036145e2565b611fd39060086142d9565b63ffffffff1686611fe583600261464c565b81518110611ff557611ff56145f5565b016020015160f81c901b9190911790600101611fb4565b5063ffffffff81166002146120335760405162461bcd60e51b81526004016103b09061465f565b5f805b60208110156120885761204a81601f6145e2565b6120559060086142d9565b8761206183600661464c565b81518110612071576120716145f5565b016020015160f81c901b9190911790600101612036565b505f8660268151811061209d5761209d6145f5565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146120e05760405162461bcd60e51b81526004016103b090614599565b5f805b600281101561212f576120f78160016145e2565b6121029060086142d9565b61ffff16858281518110612118576121186145f5565b016020015160f81c901b91909117906001016120e3565b5061ffff8116156121525760405162461bcd60e51b81526004016103b090614609565b5f805b60048110156121ad576121698160036145e2565b6121749060086142d9565b63ffffffff168661218683600261464c565b81518110612196576121966145f5565b016020015160f81c901b9190911790600101612155565b5063ffffffff81166004146121d45760405162461bcd60e51b81526004016103b09061465f565b5f805b6020811015612229576121eb81601f6145e2565b6121f69060086142d9565b8761220283600661464c565b81518110612212576122126145f5565b016020015160f81c901b91909117906001016121d7565b505f805b6008811015612288576122418160076145e2565b61224c9060086142d9565b6001600160401b03168861226183602661464c565b81518110612271576122716145f5565b016020015160f81c901b919091179060010161222d565b5090969095509350505050565b5f8181525f8051602061480d83398151915260205260408082208151610100810190925280545f805160206147cd83398151915293929190829060ff1660058111156122e3576122e361410e565b60058111156122f4576122f461410e565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561237c5761237c61410e565b146123d85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103b0565b60408101516001600160a01b0316336001600160a01b0316146124525760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103b0565b61245f8160a001516133f4565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124a3576124a361410e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61256f8461256981612b4f565b5f612cca565b5f858152600685016020526040902090915061258b8282614461565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125b8908590600401614520565b6020604051808303815f875af11580156125d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125f891906141ac565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206147ad8339815191528161266684613595565b90505f612672826107a3565b83549091506001600160401b0382161080159061269c57508260010154816001600160401b031611155b610f215760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016103b0565b5f6127036135cb565b5f805160206147cd833981519152426001600160401b03851611801561273d57506001600160401b03841661273b426202a30061464c565b115b61279f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103b0565b856127f65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103b0565b5f868152600882016020526040902054156128645760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103b0565b82516030146128cb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103b0565b6128d4856133f4565b5f8061291b6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613602565b5f828152600586016020526040902091935091506129398282614461565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612966908590600401614520565b6020604051808303815f875af1158015612982573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129a691906141ac565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612a2857612a2861410e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612ae983612b4f565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610f2160015f805160206147ed83398151915255565b5f8181525f8051602061480d8339815191526020526040812060030180545f805160206147cd833981519152916001600160401b0390911690819084612b94836146a6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061480d83398151915260205260409020815181545f805160206147cd8339815191529284929091829060ff19166001836005811115612c0d57612c0d61410e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612d4357612d038160016145e2565b612d0e9060086142d9565b5081515f90839083908110612d2557612d256145f5565b60200101906001600160f81b03191690815f1a905350600101612cef565b505f5b6004811015612da657612d5a8160036145e2565b612d659060086142d9565b6001901c60f81b82612d7883600261464c565b81518110612d8857612d886145f5565b60200101906001600160f81b03191690815f1a905350600101612d46565b505f5b6020811015612e0857612dbd81601f6145e2565b612dc89060086142d9565b86901c60f81b82612dda83600661464c565b81518110612dea57612dea6145f5565b60200101906001600160f81b03191690815f1a905350600101612da9565b505f5b6008811015612e7357612e1f8160076145e2565b612e2a9060086142d9565b6001600160401b038616901c60f81b82612e4583602661464c565b81518110612e5557612e556145f5565b60200101906001600160f81b03191690815f1a905350600101612e0b565b505f5b6008811015612ede57612e8a8160076145e2565b612e959060086142d9565b6001600160401b038516901c60f81b82612eb083602e61464c565b81518110612ec057612ec06145f5565b60200101906001600160f81b03191690815f1a905350600101612e76565b5090505b9392505050565b612ef16135cb565b5f612efe6101c283613595565b90505f805160206147ad8339815191525f612f1886611cdd565b9050600281516005811115612f2f57612f2f61410e565b14612f8e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016103b0565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b0316156130275760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b60648201526084016103b0565b613030836133f4565b828160a00181815161304291906146cb565b6001600160401b03169052506130588682612bc3565b5f61306287612b4f565b90505f61307488838560a00151612cca565b5f89815260048601602090815260408083206001600160a01b038c16845290915290209091506130a48282614461565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906130d1908590600401614520565b6020604051808303815f875af11580156130ed573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061311191906141ac565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff191660018360048111156131925761319261410e565b02179055506020828101518254604080860151606080880151610100600160881b03199094166101006001600160401b039687160267ffffffffffffffff60481b191617600160481b928616929092029190911767ffffffffffffffff60881b1916600160881b9385169390930292909217855560808601516001909501805460a0978801519685166001600160801b031990911617600160401b96851696909602959095179094559388015183518b83168152908216928101929092528616918101919091526001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b910160405180910390a450505050505061043260015f805160206147ed83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166132f857604051631afcd79f60e31b815260040160405180910390fd5b565b6133026132af565b61330b816139ba565b61333d6060820135608083013561332860c0850160a08601613f27565b61333860e0860160c087016146eb565b6139db565b50565b6133486132af565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166133d45760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016103b0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147cd8339815191529060ff165f03613432575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061347a90836145e2565b10613496576001600160401b03841660408301528082526134b5565b83826040018181516134a891906146cb565b6001600160401b03169052505b5f8260200151836040015160646134cc9190614706565b6134d69190614731565b600285015490915060ff90811690821611156135515760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103b0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6107b3827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a36565b5f805160206147ed8339815191528054600119016135fc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461366c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156136e3576136a38160016145e2565b6136ae9060086142d9565b5081515f908390839081106136c5576136c56145f5565b60200101906001600160f81b03191690815f1a90535060010161368f565b505f5b6004811015613741576136fa8160036145e2565b6137059060086142d9565b505f8261371383600261464c565b81518110613723576137236145f5565b60200101906001600160f81b03191690815f1a9053506001016136e6565b505f5b602081101561379e5784518160208110613760576137606145f5565b1a60f81b8261377083600661464c565b81518110613780576137806145f5565b60200101906001600160f81b03191690815f1a905350600101613744565b505f5b60208110156137fe57846020015181602081106137c0576137c06145f5565b1a60f81b826137d083602661464c565b815181106137e0576137e06145f5565b60200101906001600160f81b03191690815f1a9053506001016137a1565b505f5b6008811015613872576138158160076145e2565b6138209060086142d9565b60ff1685604001516001600160401b0316901c60f81b82826046613844919061464c565b81518110613854576138546145f5565b60200101906001600160f81b03191690815f1a905350600101613801565b505f5b60308110156138dd5784608001518181518110613894576138946145f5565b01602001516001600160f81b031916826138af83604e61464c565b815181106138bf576138bf6145f5565b60200101906001600160f81b03191690815f1a905350600101613875565b505f5b600881101561394f576138f48160076145e2565b6138ff9060086142d9565b60608601516001600160401b0390811691161c60f81b8261392183607e61464c565b81518110613931576139316145f5565b60200101906001600160f81b03191690815f1a9053506001016138e0565b506002816040516139609190614756565b602060405180830381855afa15801561397b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061399e91906141ac565b94909350915050565b60015f805160206147ed83398151915255565b6139c26132af565b6139ca613b98565b6139d2613ba8565b61333d81613bb0565b6139e36132af565b5f5f805160206147ad833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613aa091906141ac565b9050613ab76001600160a01b038516333086613c1c565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613afb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b1f91906141ac565b9050818111613b855760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016103b0565b613b8f82826145e2565b95945050505050565b613ba06132af565b6132f8613c76565b6132f86132af565b613bb86132af565b80355f805160206147cd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613c026060830160408401614771565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526106b9908590613c7e565b6139a76132af565b5f613c926001600160a01b03841683613cdf565b905080515f14158015613cb6575080806020019051810190613cb49190614791565b155b1561043257604051635274afe760e01b81526001600160a01b03841660048201526024016103b0565b6060612ee283835f845f80856001600160a01b03168486604051613d039190614756565b5f6040518083038185875af1925050503d805f8114613d3d576040519150601f19603f3d011682016040523d82523d5f602084013e613d42565b606091505b5091509150613d52868383613d5c565b9695505050505050565b606082613d7157613d6c82613db8565b612ee2565b8151158015613d8857506001600160a01b0384163b155b15613db157604051639996b31560e01b81526001600160a01b03851660048201526024016103b0565b5080612ee2565b805115613dc85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613ded906140d6565b5f825580601f10613dfc575050565b601f0160209004905f5260205f209081019061333d91905b80821115613e27575f8155600101613e14565b5090565b5f60208284031215613e3b575f80fd5b5035919050565b803563ffffffff81168114613e55575f80fd5b919050565b6001600160a01b038116811461333d575f80fd5b5f8060408385031215613e7f575f80fd5b613e8883613e42565b91506020830135613e9881613e5a565b809150509250929050565b5f8060408385031215613eb4575f80fd5b823591506020830135613e9881613e5a565b5f80828403610100811215613ed9575f80fd5b60e0811215613ee6575f80fd5b5082915060e0830135613e9881613e5a565b5f60208284031215613f08575f80fd5b612ee282613e42565b80356001600160401b0381168114613e55575f80fd5b5f60208284031215613f37575f80fd5b612ee282613f11565b801515811461333d575f80fd5b5f805f60608486031215613f5f575f80fd5b833592506020840135613f7181613f40565b9150613f7f60408501613e42565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613fbe57613fbe613f88565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613fec57613fec613f88565b604052919050565b5f6001600160401b0382111561400c5761400c613f88565b50601f01601f191660200190565b5f805f806080858703121561402d575f80fd5b843593506020850135925061404460408601613f11565b915060608501356001600160401b0381111561405e575f80fd5b8501601f8101871361406e575f80fd5b803561408161407c82613ff4565b613fc4565b818152886020838501011115614095575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156140c7575f80fd5b50508035926020909101359150565b600181811c908216806140ea57607f821691505b60208210810361410857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454614134816140d6565b806020870152604060018084165f811461415557600181146141715761419e565b60ff19851660408a0152604084151560051b8a0101955061419e565b895f5260205f205f5b858110156141955781548b820186015290830190880161417a565b8a016040019650505b509398975050505050505050565b5f602082840312156141bc575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f826142d4576142d461429e565b500490565b80820281158282048414176107b3576107b36142b2565b5f5b8381101561430a5781810151838201526020016142f2565b50505f910152565b8051613e5581613f40565b5f806040838503121561432e575f80fd5b82516001600160401b0380821115614344575f80fd5b9084019060608287031215614357575f80fd5b61435f613f9c565b8251815260208084015161437281613e5a565b82820152604084015183811115614387575f80fd5b80850194505087601f85011261439b575f80fd5b835192506143ab61407c84613ff4565b83815288828587010111156143be575f80fd5b6143cd848383018488016142f0565b806040840152508195506143e2818801614312565b9450505050509250929050565b6001600160401b0382811682821603908082111561440f5761440f6142b2565b5092915050565b601f82111561043257805f5260205f20601f840160051c8101602085101561443b5750805b601f840160051c820191505b8181101561445a575f8155600101614447565b5050505050565b81516001600160401b0381111561447a5761447a613f88565b61448e8161448884546140d6565b84614416565b602080601f8311600181146144c1575f84156144aa5750858301515b5f19600386901b1c1916600185901b178555614518565b5f85815260208120601f198616915b828110156144ef578886015182559484019460019091019084016144d0565b508582101561450c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f825180602084015261453e8160408501602087016142f0565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b818103818111156107b3576107b36142b2565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b808201808211156107b3576107b36142b2565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b038083168181036146c1576146c16142b2565b6001019392505050565b6001600160401b0381811683821601908082111561440f5761440f6142b2565b5f602082840312156146fb575f80fd5b8135612ee281613e5a565b6001600160401b03818116838216028082169190828114614729576147296142b2565b505092915050565b5f6001600160401b038084168061474a5761474a61429e565b92169190910492915050565b5f82516147678184602087016142f0565b9190910192915050565b5f60208284031215614781575f80fd5b813560ff81168114612ee2575f80fd5b5f602082840312156147a1575f80fd5b8151612ee281613f4056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index d88217b30..262b9b309 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"completeDelegatorRegistration\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"completeEndDelegation\",\"inputs\":[{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"initializeDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"initializeEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorAdded\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"delegatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRegistered\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"startTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"DelegatorRemovalInitialized\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"delegator\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationUptimeUpdated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"uptime\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161452b38038061452b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143de8061014d5f395ff3fe608060405260043610610104575f3560e01c80636a7e3d8311610092578063b771b3bc11610062578063b771b3bc146102f3578063bee0a03f14610325578063c599e24f14610344578063d61bed7414610357578063f40797d714610376575f80fd5b80636a7e3d831461027757806376f7862114610296578063927e7e75146102b5578063a3a65e48146102d4575f80fd5b80630cdd0985116100d85780630cdd0985146101865780632e2194d8146101e3578063467ef06f1461021a578063620658561461023957806366435abf14610258575f80fd5b8062e41792146101085780630322ed98146101295780630915204e146101485780630b77f69314610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613a30565b610389565b005b348015610134575f80fd5b50610127610143366004613a46565b61046b565b348015610153575f80fd5b50610127610162366004613a89565b6105cc565b348015610172575f80fd5b50610127610181366004613abe565b61078c565b348015610191575f80fd5b506101d06101a0366004613a46565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101ee575f80fd5b506102026101fd366004613a46565b610854565b6040516001600160401b0390911681526020016101da565b348015610225575f80fd5b50610127610234366004613ae1565b61086a565b348015610244575f80fd5b506101d0610253366004613b17565b610bc6565b348015610263575f80fd5b50610202610272366004613a46565b610bdf565b348015610282575f80fd5b50610127610291366004613abe565b610bf3565b3480156102a1575f80fd5b506101276102b0366004613b3d565b610c75565b3480156102c0575f80fd5b506101276102cf366004613a46565b610f8e565b3480156102df575f80fd5b506101276102ee366004613ae1565b61139f565b3480156102fe575f80fd5b5061030d6005600160991b0181565b6040516001600160a01b0390911681526020016101da565b348015610330575f80fd5b5061012761033f366004613a46565b611558565b610127610352366004613a46565b611627565b348015610362575f80fd5b50610127610371366004613a89565b611635565b6101d0610384366004613c0a565b611818565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a8361183a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206143728339815191529291906104b390613c9c565b90501180156104e5575060035f83815260078301602052604090205460ff1660058111156104e3576104e3613cce565b145b61054e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105879190600401613ce2565b6020604051808303815f875af11580156105a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c79190613d6c565b505050565b5f805160206143528339815191525f6105e48461184b565b90505f806105f58360400151611a2c565b50915091506106048286611c67565b5f82815260058501602090815260408083206001600160a01b03891684529091528120610630916139e6565b5f61063a83611d70565b9050816001600160401b031681606001516001600160401b031610156106725760405162461bcd60e51b815260040161054590613d83565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b9092041611156106cb5760405162461bcd60e51b815260040161054590613dc5565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561070557610705613cce565b146107225760405162461bcd60e51b815260040161054590613e0e565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6107968282611e6b565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614352833981519152916005600160991b019163ee5b48eb9161080e91600401613ce2565b6020604051808303815f875af115801561082a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084e9190613d6c565b50505050565b5f61086464e8d4a5100083613e86565b92915050565b5f805160206143728339815191525f6108828361184b565b90505f806108938360400151611f7f565b9150915080156108f85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610545565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561092957610929613cce565b600581111561093a5761093a613cce565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156109b3576109b3613cce565b14806109d157506001825160058111156109cf576109cf613cce565b145b610a305760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610545565b600382516005811115610a4557610a45613cce565b03610a6c57505f8381526006860160205260408120600491610a6791906139e6565b610a70565b5060055b6020808301515f90815260088801909152604081205581816005811115610a9957610a99613cce565b90816005811115610aac57610aac613cce565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ae057610ae0613cce565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905581516005811115610b9357610b93613cce565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6108646001600160401b03831664e8d4a51000613e99565b5f610be982611d70565b6080015192915050565b610bfd8282611c67565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f80516020614352833981519152916005600160991b019163ee5b48eb9161080e91600401613ce2565b8115610f85575f5f805160206143528339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610cd6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610cfd9190810190613edd565b9150915080610d605760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610545565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610da3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc79190613d6c565b825114610e2b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610545565b60208201516001600160a01b031615610ea15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610545565b5f80610eb08460400151612120565b91509150818814610f1d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610545565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6105c7836122f8565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f8051602061435283398151915293929190829060ff166004811115610ff957610ff9613cce565b600481111561100a5761100a613cce565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a090910152905060028151600481111561107457611074613cce565b146110d35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b6064820152608401610545565b5f6110dd84612689565b9050600382819052506001600160401b034281166060840152811660a08301525f848152600384016020526040812083916111153390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff1916600183600481111561114b5761114b613cce565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f6111f585611d70565b905082602001516001600160401b031681608001516001600160401b03161161126c5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610545565b8260200151816080018181516112829190613faf565b6001600160401b03169052506112988582612704565b5f6112a8868484608001516127f3565b5f878152600587016020908152604080832033845290915290209091506112cf8282614021565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112fc9085906004016140e0565b6020604051808303815f875af1158015611318573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061133c9190613d6c565b6080840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b5f805160206143728339815191525f6113b78361184b565b90505f806113c88360400151611f7f565b915091508061142a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610545565b5f8281526005850160205260408120805461144490613c9c565b9050118015611476575060015f83815260078601602052604090205460ff16600581111561147457611474613cce565b145b6114925760405162461bcd60e51b815260040161054590614112565b5f82815260058501602052604081206114aa916139e6565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206143728339815191529291906115a090613c9c565b90501180156115d2575060015f83815260078301602052604090205460ff1660058111156115d0576115d0613cce565b145b6115ee5760405162461bcd60e51b815260040161054590614112565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105879190600401613ce2565b611632813334612a10565b50565b5f805160206143528339815191525f61164d8461184b565b90505f8061165e8360400151611a2c565b509150915061166d8286611e6b565b5f82815260048501602090815260408083206001600160a01b03891684529091528120611699916139e6565b5f6116a383611d70565b9050816001600160401b031681606001516001600160401b031610156116db5760405162461bcd60e51b815260040161054590613d83565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b038084169116111561172d5760405162461bcd60e51b815260040161054590613dc5565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561176757611767613cce565b146117845760405162461bcd60e51b815260040161054590613e0e565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b6910161138e565b5f8061182334612de2565b905061183185828686612e8c565b95945050505050565b6118426132c0565b6116328161330b565b60408051606080820183525f8083526020830181905292820152905f805160206143728339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118c0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118e79190810190613edd565b915091508061194e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610545565b82548251146119b15760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610545565b60208201516001600160a01b031615611a245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610545565b509392505050565b5f805f8351603614611a505760405162461bcd60e51b815260040161054590614159565b5f805b6002811015611a9f57611a678160016141a2565b611a72906008613e99565b61ffff16868281518110611a8857611a886141b5565b016020015160f81c901b9190911790600101611a53565b5061ffff811615611ac25760405162461bcd60e51b8152600401610545906141c9565b5f805b6004811015611b1d57611ad98160036141a2565b611ae4906008613e99565b63ffffffff1687611af683600261420c565b81518110611b0657611b066141b5565b016020015160f81c901b9190911790600101611ac5565b5063ffffffff8116600314611b445760405162461bcd60e51b81526004016105459061421f565b5f805b6020811015611b9957611b5b81601f6141a2565b611b66906008613e99565b88611b7283600661420c565b81518110611b8257611b826141b5565b016020015160f81c901b9190911790600101611b47565b505f805b6008811015611bf857611bb18160076141a2565b611bbc906008613e99565b6001600160401b031689611bd183602661420c565b81518110611be157611be16141b5565b016020015160f81c901b9190911790600101611b9d565b505f805b6008811015611c5757611c108160076141a2565b611c1b906008613e99565b6001600160401b03168a611c3083602e61420c565b81518110611c4057611c406141b5565b016020015160f81c901b9190911790600101611bfc565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f80516020614352833981519152929190611cc390613c9c565b9050118015611d09575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611d0757611d07613cce565b145b6105c75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b6064820152608401610545565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206143b283398151915290528390208351918201909352825491925f8051602061437283398151915292829060ff166005811115611df057611df0613cce565b6005811115611e0157611e01613cce565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f80516020614352833981519152929190611ec790613c9c565b9050118015611f0d575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611f0b57611f0b613cce565b145b6105c75760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e670000000000000000006064820152608401610545565b5f808251602714611fa25760405162461bcd60e51b815260040161054590614159565b5f805b6002811015611ff157611fb98160016141a2565b611fc4906008613e99565b61ffff16858281518110611fda57611fda6141b5565b016020015160f81c901b9190911790600101611fa5565b5061ffff8116156120145760405162461bcd60e51b8152600401610545906141c9565b5f805b600481101561206f5761202b8160036141a2565b612036906008613e99565b63ffffffff168661204883600261420c565b81518110612058576120586141b5565b016020015160f81c901b9190911790600101612017565b5063ffffffff81166002146120965760405162461bcd60e51b81526004016105459061421f565b5f805b60208110156120eb576120ad81601f6141a2565b6120b8906008613e99565b876120c483600661420c565b815181106120d4576120d46141b5565b016020015160f81c901b9190911790600101612099565b505f86602681518110612100576121006141b5565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146121435760405162461bcd60e51b815260040161054590614159565b5f805b60028110156121925761215a8160016141a2565b612165906008613e99565b61ffff1685828151811061217b5761217b6141b5565b016020015160f81c901b9190911790600101612146565b5061ffff8116156121b55760405162461bcd60e51b8152600401610545906141c9565b5f805b6004811015612210576121cc8160036141a2565b6121d7906008613e99565b63ffffffff16866121e983600261420c565b815181106121f9576121f96141b5565b016020015160f81c901b91909117906001016121b8565b5063ffffffff81166004146122375760405162461bcd60e51b81526004016105459061421f565b5f805b602081101561228c5761224e81601f6141a2565b612259906008613e99565b8761226583600661420c565b81518110612275576122756141b5565b016020015160f81c901b919091179060010161223a565b505f805b60088110156122eb576122a48160076141a2565b6122af906008613e99565b6001600160401b0316886122c483602661420c565b815181106122d4576122d46141b5565b016020015160f81c901b9190911790600101612290565b5090969095509350505050565b5f8181525f805160206143b28339815191526020526040808220815160e0810190925280545f8051602061437283398151915293929190829060ff16600581111561234557612345613cce565b600581111561235657612356613cce565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c090910152909150815160058111156123d0576123d0613cce565b1461242c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610545565b60408101516001600160a01b0316336001600160a01b0316146124a65760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610545565b6124b3816080015161334e565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124f7576124f7613cce565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6125ab846125a581612689565b5f6127f3565b5f85815260068501602052604090209091506125c78282614021565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125f49085906004016140e0565b6020604051808303815f875af1158015612610573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126349190613d6c565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f805160206143b28339815191526020526040812060020180545f8051602061437283398151915291600160a01b9091046001600160401b031690819060146126d583614266565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f805160206143b283398151915260205260409020815181545f805160206143728339815191529284929091829060ff1916600183600581111561274e5761274e613cce565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561286c5761282c8160016141a2565b612837906008613e99565b5081515f9083908390811061284e5761284e6141b5565b60200101906001600160f81b03191690815f1a905350600101612818565b505f5b60048110156128cf576128838160036141a2565b61288e906008613e99565b6001901c60f81b826128a183600261420c565b815181106128b1576128b16141b5565b60200101906001600160f81b03191690815f1a90535060010161286f565b505f5b6020811015612931576128e681601f6141a2565b6128f1906008613e99565b86901c60f81b8261290383600661420c565b81518110612913576129136141b5565b60200101906001600160f81b03191690815f1a9053506001016128d2565b505f5b600881101561299c576129488160076141a2565b612953906008613e99565b6001600160401b038616901c60f81b8261296e83602661420c565b8151811061297e5761297e6141b5565b60200101906001600160f81b03191690815f1a905350600101612934565b505f5b6008811015612a07576129b38160076141a2565b6129be906008613e99565b6001600160401b038516901c60f81b826129d983602e61420c565b815181106129e9576129e96141b5565b60200101906001600160f81b03191690815f1a90535060010161299f565b50949350505050565b612a186134ef565b5f612a2282610854565b90505f805160206143528339815191525f612a3c86611d70565b9050600281516005811115612a5357612a53613cce565b14612ab25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610545565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b031615612b4b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b6064820152608401610545565b612b548361334e565b8281608001818151612b66919061428b565b6001600160401b0316905250612b7c8682612704565b5f612b8687612689565b90505f612b98888385608001516127f3565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612bc88282614021565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612bf59085906004016140e0565b6020604051808303815f875af1158015612c11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c359190613d6c565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff19166001836004811115612cb657612cb6613cce565b02179055506020820151815460408085015160608601516001600160401b03908116600160881b0267ffffffffffffffff60881b19928216600160481b0267ffffffffffffffff60481b199683166101000296909616610100600160881b03199095169490941794909417169190911783556080808501516001909401805460a0909601518416600160401b026001600160801b0319909616949093169390931793909317905585015190516001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b91612dbe918c918a906001600160401b0393841681529183166020830152909116604082015260600190565b60405180910390a45050505050506105c760015f8051602061439283398151915255565b5f5f805160206143528339815191528282612dfc82610854565b83549091506001600160401b03821610801590612e2657508260010154816001600160401b031611155b612e845760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610545565b949350505050565b5f612e956134ef565b5f80516020614372833981519152426001600160401b038516118015612ecf57506001600160401b038416612ecd426202a30061420c565b115b612f315760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610545565b85612f885760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610545565b5f86815260088201602052604090205415612ff65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610545565b825160301461305d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610545565b6130668561334e565b5f806130ad6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613539565b5f828152600586016020526040902091935091506130cb8282614021565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906130f89085906004016140e0565b6020604051808303815f875af1158015613114573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131389190613d6c565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff191660018360058111156131b1576131b1613cce565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b929091169190910217905561325a83612689565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612e8460015f8051602061439283398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661330957604051631afcd79f60e31b815260040160405180910390fd5b565b6133136132c0565b61331c816138de565b6116326060820135608083013561333960c0850160a08601613b17565b61334960e0860160c087016142ab565b6138ff565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206143728339815191529060ff165f0361338c575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133d490836141a2565b106133f0576001600160401b038416604083015280825261340f565b8382604001818151613402919061428b565b6001600160401b03169052505b5f82602001518360400151606461342691906142c6565b61343091906142f1565b600285015490915060ff90811690821611156134ab5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610545565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061439283398151915280546001190161352057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061439283398151915255565b5f60608260800151516030146135a35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610545565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561361a576135da8160016141a2565b6135e5906008613e99565b5081515f908390839081106135fc576135fc6141b5565b60200101906001600160f81b03191690815f1a9053506001016135c6565b505f5b6004811015613678576136318160036141a2565b61363c906008613e99565b505f8261364a83600261420c565b8151811061365a5761365a6141b5565b60200101906001600160f81b03191690815f1a90535060010161361d565b505f5b60208110156136d55784518160208110613697576136976141b5565b1a60f81b826136a783600661420c565b815181106136b7576136b76141b5565b60200101906001600160f81b03191690815f1a90535060010161367b565b505f5b602081101561373557846020015181602081106136f7576136f76141b5565b1a60f81b8261370783602661420c565b81518110613717576137176141b5565b60200101906001600160f81b03191690815f1a9053506001016136d8565b505f5b60088110156137a95761374c8160076141a2565b613757906008613e99565b60ff1685604001516001600160401b0316901c60f81b8282604661377b919061420c565b8151811061378b5761378b6141b5565b60200101906001600160f81b03191690815f1a905350600101613738565b505f5b603081101561381457846080015181815181106137cb576137cb6141b5565b01602001516001600160f81b031916826137e683604e61420c565b815181106137f6576137f66141b5565b60200101906001600160f81b03191690815f1a9053506001016137ac565b505f5b60088110156138865761382b8160076141a2565b613836906008613e99565b60608601516001600160401b0390811691161c60f81b8261385883607e61420c565b81518110613868576138686141b5565b60200101906001600160f81b03191690815f1a905350600101613817565b506002816040516138979190614316565b602060405180830381855afa1580156138b2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138d59190613d6c565b94909350915050565b6138e66132c0565b6138ee61395a565b6138f661396a565b61163281613972565b6139076132c0565b5f5f80516020614352833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6139626132c0565b6133096139de565b6133096132c0565b61397a6132c0565b80355f8051602061437283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139c46060830160408401614331565b600291909101805460ff191660ff90921691909117905550565b6135266132c0565b5080546139f290613c9c565b5f825580601f10613a01575050565b601f0160209004905f5260205f209081019061163291905b80821115613a2c575f8155600101613a19565b5090565b5f60e08284031215613a40575f80fd5b50919050565b5f60208284031215613a56575f80fd5b5035919050565b803563ffffffff81168114613a70575f80fd5b919050565b6001600160a01b0381168114611632575f80fd5b5f8060408385031215613a9a575f80fd5b613aa383613a5d565b91506020830135613ab381613a75565b809150509250929050565b5f8060408385031215613acf575f80fd5b823591506020830135613ab381613a75565b5f60208284031215613af1575f80fd5b613afa82613a5d565b9392505050565b80356001600160401b0381168114613a70575f80fd5b5f60208284031215613b27575f80fd5b613afa82613b01565b8015158114611632575f80fd5b5f805f60608486031215613b4f575f80fd5b833592506020840135613b6181613b30565b9150613b6f60408501613a5d565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bae57613bae613b78565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613bdc57613bdc613b78565b604052919050565b5f6001600160401b03821115613bfc57613bfc613b78565b50601f01601f191660200190565b5f805f60608486031215613c1c575f80fd5b83359250613c2c60208501613b01565b915060408401356001600160401b03811115613c46575f80fd5b8401601f81018613613c56575f80fd5b8035613c69613c6482613be4565b613bb4565b818152876020838501011115613c7d575f80fd5b816020840160208301375f602083830101528093505050509250925092565b600181811c90821680613cb057607f821691505b602082108103613a4057634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613cf481613c9c565b806020870152604060018084165f8114613d155760018114613d3157613d5e565b60ff19851660408a0152604084151560051b8a01019550613d5e565b895f5260205f205f5b85811015613d555781548b8201860152908301908801613d3a565b8a016040019650505b509398975050505050505050565b5f60208284031215613d7c575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613e9457613e94613e5e565b500490565b808202811582820484141761086457610864613e72565b5f5b83811015613eca578181015183820152602001613eb2565b50505f910152565b8051613a7081613b30565b5f8060408385031215613eee575f80fd5b82516001600160401b0380821115613f04575f80fd5b9084019060608287031215613f17575f80fd5b613f1f613b8c565b82518152602080840151613f3281613a75565b82820152604084015183811115613f47575f80fd5b80850194505087601f850112613f5b575f80fd5b83519250613f6b613c6484613be4565b8381528882858701011115613f7e575f80fd5b613f8d84838301848801613eb0565b80604084015250819550613fa2818801613ed2565b9450505050509250929050565b6001600160401b03828116828216039080821115613fcf57613fcf613e72565b5092915050565b601f8211156105c757805f5260205f20601f840160051c81016020851015613ffb5750805b601f840160051c820191505b8181101561401a575f8155600101614007565b5050505050565b81516001600160401b0381111561403a5761403a613b78565b61404e816140488454613c9c565b84613fd6565b602080601f831160018114614081575f841561406a5750858301515b5f19600386901b1c1916600185901b1785556140d8565b5f85815260208120601f198616915b828110156140af57888601518255948401946001909101908401614090565b50858210156140cc57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f82518060208401526140fe816040850160208701613eb0565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561086457610864613e72565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561086457610864613e72565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b0380831681810361428157614281613e72565b6001019392505050565b6001600160401b03818116838216019080821115613fcf57613fcf613e72565b5f602082840312156142bb575f80fd5b8135613afa81613a75565b6001600160401b038181168382160280821691908281146142e9576142e9613e72565b505092915050565b5f6001600160401b038084168061430a5761430a613e5e565b92169190910492915050565b5f8251614327818460208701613eb0565b9190910192915050565b5f60208284031215614341575f80fd5b813560ff81168114613afa575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516145b63803806145b683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6144698061014d5f395ff3fe608060405260043610610104575f3560e01c80636a7e3d8311610092578063b771b3bc11610062578063b771b3bc146102f3578063bee0a03f14610325578063c599e24f14610344578063d61bed7414610357578063f40797d714610376575f80fd5b80636a7e3d831461027757806376f7862114610296578063927e7e75146102b5578063a3a65e48146102d4575f80fd5b80630cdd0985116100d85780630cdd0985146101865780632e2194d8146101e3578063467ef06f1461021a578063620658561461023957806366435abf14610258575f80fd5b8062e41792146101085780630322ed98146101295780630915204e146101485780630b77f69314610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613abb565b610389565b005b348015610134575f80fd5b50610127610143366004613ad1565b61046b565b348015610153575f80fd5b50610127610162366004613b14565b6105cc565b348015610172575f80fd5b50610127610181366004613b49565b61078c565b348015610191575f80fd5b506101d06101a0366004613ad1565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101ee575f80fd5b506102026101fd366004613ad1565b610854565b6040516001600160401b0390911681526020016101da565b348015610225575f80fd5b50610127610234366004613b6c565b61086a565b348015610244575f80fd5b506101d0610253366004613ba2565b610bed565b348015610263575f80fd5b50610202610272366004613ad1565b610c06565b348015610282575f80fd5b50610127610291366004613b49565b610c1a565b3480156102a1575f80fd5b506101276102b0366004613bc8565b610c9c565b3480156102c0575f80fd5b506101276102cf366004613ad1565b610fb5565b3480156102df575f80fd5b506101276102ee366004613b6c565b6113c6565b3480156102fe575f80fd5b5061030d6005600160991b0181565b6040516001600160a01b0390911681526020016101da565b348015610330575f80fd5b5061012761033f366004613ad1565b611583565b610127610352366004613ad1565b611652565b348015610362575f80fd5b50610127610371366004613b14565b611660565b6101d0610384366004613c95565b611843565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611865565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206143fd8339815191529291906104b390613d27565b90501180156104e5575060035f83815260078301602052604090205460ff1660058111156104e3576104e3613d59565b145b61054e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105879190600401613d6d565b6020604051808303815f875af11580156105a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c79190613df7565b505050565b5f805160206143dd8339815191525f6105e484611876565b90505f806105f58360400151611a57565b50915091506106048286611c92565b5f82815260058501602090815260408083206001600160a01b0389168452909152812061063091613a71565b5f61063a83611d9b565b9050816001600160401b031681608001516001600160401b031610156106725760405162461bcd60e51b815260040161054590613e0e565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416600160401b9092041611156106cb5760405162461bcd60e51b815260040161054590613e50565b60035f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561070557610705613d59565b146107225760405162461bcd60e51b815260040161054590613e99565b5f83815260038601602090815260408083206001600160a01b038a168085529252808320805460ff19166004179055516001600160401b0385169286917f4da588c356f0bfa46c394126d28890aaadfc4ed6c26a611d14275e13ad1057dd9190a450505050505050565b6107968282611eac565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206143dd833981519152916005600160991b019163ee5b48eb9161080e91600401613d6d565b6020604051808303815f875af115801561082a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084e9190613df7565b50505050565b5f61086464e8d4a5100083613f11565b92915050565b5f805160206143fd8339815191525f61088283611876565b90505f806108938360400151611fc0565b9150915080156108f85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610545565b5f828152600785016020526040808220815161010081019092528054829060ff16600581111561092a5761092a613d59565b600581111561093b5761093b613d59565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156109c2576109c2613d59565b14806109e057506001825160058111156109de576109de613d59565b145b610a3f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610545565b600382516005811115610a5457610a54613d59565b03610a7b57505f8381526006860160205260408120600491610a769190613a71565b610a7f565b5060055b6020808301515f90815260088801909152604081205581816005811115610aa857610aa8613d59565b90816005811115610abb57610abb613d59565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610aef57610aef613d59565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610bba57610bba613d59565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6108646001600160401b03831664e8d4a51000613f24565b5f610c1082611d9b565b60a0015192915050565b610c248282611c92565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b038516845290915290819020905163ee5b48eb60e01b81525f805160206143dd833981519152916005600160991b019163ee5b48eb9161080e91600401613d6d565b8115610fac575f5f805160206143dd8339815191526040516306f8253560e41b815263ffffffff841660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610cfd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d249190810190613f68565b9150915080610d875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610545565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dee9190613df7565b825114610e525760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610545565b60208201516001600160a01b031615610ec85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610545565b5f80610ed78460400151612161565b91509150818814610f445760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610545565b5f888152600686016020908152604091829020805467ffffffffffffffff19166001600160401b038516908117909155915191825289917fdb66a448eb96fec571c5e9c295c4f425b0297d1fc1f4353931cb2afc2426bb8c910160405180910390a250505050505b6105c783612339565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360209081526040808320338452909152808220815160c0810190925280545f805160206143dd83398151915293929190829060ff16600481111561102057611020613d59565b600481111561103157611031613d59565b815281546001600160401b03610100820481166020840152600160481b820481166040840152600160881b909104811660608301526001909201548083166080830152600160401b900490911660a090910152905060028151600481111561109b5761109b613d59565b146110fa5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152686f742061637469766560b81b6064820152608401610545565b5f611104846126f1565b9050600382819052506001600160401b034281166060840152811660a08301525f8481526003840160205260408120839161113c3390565b6001600160a01b0316815260208101919091526040015f2081518154829060ff1916600183600481111561117257611172613d59565b02179055506020820151815460408401516060850151610100600160881b03199092166101006001600160401b039485160267ffffffffffffffff60481b191617600160481b918416919091021767ffffffffffffffff60881b1916600160881b9183169190910217825560808301516001909201805460a0909401519282166001600160801b031990941693909317600160401b92909116919091021790555f61121c85611d9b565b905082602001516001600160401b03168160a001516001600160401b0316116112935760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610545565b82602001518160a0018181516112a9919061403a565b6001600160401b03169052506112bf8582612765565b5f6112cf86848460a0015161286c565b5f878152600587016020908152604080832033845290915290209091506112f682826140ac565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061132390859060040161416b565b6020604051808303815f875af115801561133f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113639190613df7565b60a0840151604080516001600160401b039283168152918716602083015242908201529091503390829089907fadec5acd02ee9a5280893bb168456a89d9b0004eee87906795b290740f2e4bde906060015b60405180910390a450505050505050565b5f805160206143fd8339815191525f6113de83611876565b90505f806113ef8360400151611fc0565b91509150806114515760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610545565b5f8281526005850160205260408120805461146b90613d27565b905011801561149d575060015f83815260078601602052604090205460ff16600581111561149b5761149b613d59565b145b6114b95760405162461bcd60e51b81526004016105459061419d565b5f82815260058501602052604081206114d191613a71565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206143fd8339815191529291906115cb90613d27565b90501180156115fd575060015f83815260078301602052604090205460ff1660058111156115fb576115fb613d59565b145b6116195760405162461bcd60e51b81526004016105459061419d565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916105879190600401613d6d565b61165d813334612a89565b50565b5f805160206143dd8339815191525f61167884611876565b90505f806116898360400151611a57565b50915091506116988286611eac565b5f82815260048501602090815260408083206001600160a01b038916845290915281206116c491613a71565b5f6116ce83611d9b565b9050816001600160401b031681608001516001600160401b031610156117065760405162461bcd60e51b815260040161054590613e0e565b5f83815260038601602090815260408083206001600160a01b038a1684529091529020600101546001600160401b03808416911611156117585760405162461bcd60e51b815260040161054590613e50565b60015f84815260038701602090815260408083206001600160a01b038b16845290915290205460ff16600481111561179257611792613d59565b146117af5760405162461bcd60e51b815260040161054590613e99565b5f83815260038601602090815260408083206001600160a01b038a168085528184528285208054958290529184526001600160401b0342818116600160481b0270ffffffffffffffff0000000000000000ff19909716969096176002179092559151938452851692909186917fd63c8a1fc829b22698176813c742597f94f9278dde21a64f7a8192e905f932b691016113b5565b5f8061184e34612e4c565b905061185c85828686612ef6565b95945050505050565b61186d61334b565b61165d81613396565b60408051606080820183525f8083526020830181905292820152905f805160206143fd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118eb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119129190810190613f68565b91509150806119795760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610545565b82548251146119dc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610545565b60208201516001600160a01b031615611a4f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610545565b509392505050565b5f805f8351603614611a7b5760405162461bcd60e51b8152600401610545906141e4565b5f805b6002811015611aca57611a9281600161422d565b611a9d906008613f24565b61ffff16868281518110611ab357611ab3614240565b016020015160f81c901b9190911790600101611a7e565b5061ffff811615611aed5760405162461bcd60e51b815260040161054590614254565b5f805b6004811015611b4857611b0481600361422d565b611b0f906008613f24565b63ffffffff1687611b21836002614297565b81518110611b3157611b31614240565b016020015160f81c901b9190911790600101611af0565b5063ffffffff8116600314611b6f5760405162461bcd60e51b8152600401610545906142aa565b5f805b6020811015611bc457611b8681601f61422d565b611b91906008613f24565b88611b9d836006614297565b81518110611bad57611bad614240565b016020015160f81c901b9190911790600101611b72565b505f805b6008811015611c2357611bdc81600761422d565b611be7906008613f24565b6001600160401b031689611bfc836026614297565b81518110611c0c57611c0c614240565b016020015160f81c901b9190911790600101611bc8565b505f805b6008811015611c8257611c3b81600761422d565b611c46906008613f24565b6001600160401b03168a611c5b83602e614297565b81518110611c6b57611c6b614240565b016020015160f81c901b9190911790600101611c27565b5091989097509095509350505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602090815260408083206001600160a01b0385168452909152812080545f805160206143dd833981519152929190611cee90613d27565b9050118015611d34575060035f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611d3257611d32613d59565b145b6105c75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f722072604482015271656d6f76616c206e6f742070656e64696e6760701b6064820152608401610545565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061443d83398151915290528390208351918201909352825491925f805160206143fd83398151915292829060ff166005811115611e2357611e23613d59565b6005811115611e3457611e34613d59565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8281527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602090815260408083206001600160a01b0385168452909152812080545f805160206143dd833981519152929190611f0890613d27565b9050118015611f4e575060015f84815260038301602090815260408083206001600160a01b038716845290915290205460ff166004811115611f4c57611f4c613d59565b145b6105c75760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72207260448201527f6567697374726174696f6e206e6f742070656e64696e670000000000000000006064820152608401610545565b5f808251602714611fe35760405162461bcd60e51b8152600401610545906141e4565b5f805b600281101561203257611ffa81600161422d565b612005906008613f24565b61ffff1685828151811061201b5761201b614240565b016020015160f81c901b9190911790600101611fe6565b5061ffff8116156120555760405162461bcd60e51b815260040161054590614254565b5f805b60048110156120b05761206c81600361422d565b612077906008613f24565b63ffffffff1686612089836002614297565b8151811061209957612099614240565b016020015160f81c901b9190911790600101612058565b5063ffffffff81166002146120d75760405162461bcd60e51b8152600401610545906142aa565b5f805b602081101561212c576120ee81601f61422d565b6120f9906008613f24565b87612105836006614297565b8151811061211557612115614240565b016020015160f81c901b91909117906001016120da565b505f8660268151811061214157612141614240565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146121845760405162461bcd60e51b8152600401610545906141e4565b5f805b60028110156121d35761219b81600161422d565b6121a6906008613f24565b61ffff168582815181106121bc576121bc614240565b016020015160f81c901b9190911790600101612187565b5061ffff8116156121f65760405162461bcd60e51b815260040161054590614254565b5f805b60048110156122515761220d81600361422d565b612218906008613f24565b63ffffffff168661222a836002614297565b8151811061223a5761223a614240565b016020015160f81c901b91909117906001016121f9565b5063ffffffff81166004146122785760405162461bcd60e51b8152600401610545906142aa565b5f805b60208110156122cd5761228f81601f61422d565b61229a906008613f24565b876122a6836006614297565b815181106122b6576122b6614240565b016020015160f81c901b919091179060010161227b565b505f805b600881101561232c576122e581600761422d565b6122f0906008613f24565b6001600160401b031688612305836026614297565b8151811061231557612315614240565b016020015160f81c901b91909117906001016122d1565b5090969095509350505050565b5f8181525f8051602061443d83398151915260205260408082208151610100810190925280545f805160206143fd83398151915293929190829060ff16600581111561238757612387613d59565b600581111561239857612398613d59565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561242057612420613d59565b1461247c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610545565b60408101516001600160a01b0316336001600160a01b0316146124f65760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610545565b6125038160a001516133d9565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561254757612547613d59565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126138461260d816126f1565b5f61286c565b5f858152600685016020526040902090915061262f82826140ac565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061265c90859060040161416b565b6020604051808303815f875af1158015612678573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061269c9190613df7565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8181525f8051602061443d8339815191526020526040812060030180545f805160206143fd833981519152916001600160401b0390911690819084612736836142f1565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b5f8281525f8051602061443d83398151915260205260409020815181545f805160206143fd8339815191529284929091829060ff191660018360058111156127af576127af613d59565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055505050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156128e5576128a581600161422d565b6128b0906008613f24565b5081515f908390839081106128c7576128c7614240565b60200101906001600160f81b03191690815f1a905350600101612891565b505f5b6004811015612948576128fc81600361422d565b612907906008613f24565b6001901c60f81b8261291a836002614297565b8151811061292a5761292a614240565b60200101906001600160f81b03191690815f1a9053506001016128e8565b505f5b60208110156129aa5761295f81601f61422d565b61296a906008613f24565b86901c60f81b8261297c836006614297565b8151811061298c5761298c614240565b60200101906001600160f81b03191690815f1a90535060010161294b565b505f5b6008811015612a15576129c181600761422d565b6129cc906008613f24565b6001600160401b038616901c60f81b826129e7836026614297565b815181106129f7576129f7614240565b60200101906001600160f81b03191690815f1a9053506001016129ad565b505f5b6008811015612a8057612a2c81600761422d565b612a37906008613f24565b6001600160401b038516901c60f81b82612a5283602e614297565b81518110612a6257612a62614240565b60200101906001600160f81b03191690815f1a905350600101612a18565b50949350505050565b612a9161357a565b5f612a9b82610854565b90505f805160206143dd8339815191525f612ab586611d9b565b9050600281516005811115612acc57612acc613d59565b14612b2b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610545565b5f86815260038301602090815260408083206001600160a01b038916845290915290205461010090046001600160401b031615612bc45760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f7220616044820152701b1c9958591e481c9959da5cdd195c9959607a1b6064820152608401610545565b612bcd836133d9565b828160a001818151612bdf9190614316565b6001600160401b0316905250612bf58682612765565b5f612bff876126f1565b90505f612c1188838560a0015161286c565b5f89815260048601602090815260408083206001600160a01b038c1684529091529020909150612c4182826140ac565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c6e90859060040161416b565b6020604051808303815f875af1158015612c8a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cae9190613df7565b6040805160c0810190915290915080600181526001600160401b038089166020808401919091525f604080850182905260608501829052928816608085015260a09093018390528c83526003890181528183206001600160a01b038d1684529052902081518154829060ff19166001836004811115612d2f57612d2f613d59565b02179055506020828101518254604080860151606080880151610100600160881b03199094166101006001600160401b039687160267ffffffffffffffff60481b191617600160481b928616929092029190911767ffffffffffffffff60881b1916600160881b9385169390930292909217855560808601516001909501805460a0978801519685166001600160801b031990911617600160401b96851696909602959095179094559388015183518b83168152908216928101929092528616918101919091526001600160a01b038a169183918c917feea0c6dd7e326ed588ce418df1563a24af963b7a54714ba659fab8152435795b910160405180910390a45050505050506105c760015f8051602061441d83398151915255565b5f5f805160206143dd8339815191528282612e6682610854565b83549091506001600160401b03821610801590612e9057508260010154816001600160401b031611155b612eee5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610545565b949350505050565b5f612eff61357a565b5f805160206143fd833981519152426001600160401b038516118015612f3957506001600160401b038416612f37426202a300614297565b115b612f9b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610545565b85612ff25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610545565b5f868152600882016020526040902054156130605760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610545565b82516030146130c75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610545565b6130d0856133d9565b5f806131176040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506135c4565b5f8281526005860160205260409020919350915061313582826140ac565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061316290859060040161416b565b6020604051808303815f875af115801561317e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131a29190613df7565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561322457613224613d59565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556132e5836126f1565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612eee60015f8051602061441d83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661339457604051631afcd79f60e31b815260040160405180910390fd5b565b61339e61334b565b6133a781613969565b61165d606082013560808301356133c460c0850160a08601613ba2565b6133d460e0860160c08701614336565b61398a565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206143fd8339815191529060ff165f03613417575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061345f908361422d565b1061347b576001600160401b038416604083015280825261349a565b838260400181815161348d9190614316565b6001600160401b03169052505b5f8260200151836040015160646134b19190614351565b6134bb919061437c565b600285015490915060ff90811690821611156135365760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610545565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061441d8339815191528054600119016135ab57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061441d83398151915255565b5f606082608001515160301461362e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610545565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156136a55761366581600161422d565b613670906008613f24565b5081515f9083908390811061368757613687614240565b60200101906001600160f81b03191690815f1a905350600101613651565b505f5b6004811015613703576136bc81600361422d565b6136c7906008613f24565b505f826136d5836002614297565b815181106136e5576136e5614240565b60200101906001600160f81b03191690815f1a9053506001016136a8565b505f5b6020811015613760578451816020811061372257613722614240565b1a60f81b82613732836006614297565b8151811061374257613742614240565b60200101906001600160f81b03191690815f1a905350600101613706565b505f5b60208110156137c0578460200151816020811061378257613782614240565b1a60f81b82613792836026614297565b815181106137a2576137a2614240565b60200101906001600160f81b03191690815f1a905350600101613763565b505f5b6008811015613834576137d781600761422d565b6137e2906008613f24565b60ff1685604001516001600160401b0316901c60f81b828260466138069190614297565b8151811061381657613816614240565b60200101906001600160f81b03191690815f1a9053506001016137c3565b505f5b603081101561389f578460800151818151811061385657613856614240565b01602001516001600160f81b0319168261387183604e614297565b8151811061388157613881614240565b60200101906001600160f81b03191690815f1a905350600101613837565b505f5b6008811015613911576138b681600761422d565b6138c1906008613f24565b60608601516001600160401b0390811691161c60f81b826138e383607e614297565b815181106138f3576138f3614240565b60200101906001600160f81b03191690815f1a9053506001016138a2565b5060028160405161392291906143a1565b602060405180830381855afa15801561393d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139609190613df7565b94909350915050565b61397161334b565b6139796139e5565b6139816139f5565b61165d816139fd565b61399261334b565b5f5f805160206143dd833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6139ed61334b565b613394613a69565b61339461334b565b613a0561334b565b80355f805160206143fd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a4f60608301604084016143bc565b600291909101805460ff191660ff90921691909117905550565b6135b161334b565b508054613a7d90613d27565b5f825580601f10613a8c575050565b601f0160209004905f5260205f209081019061165d91905b80821115613ab7575f8155600101613aa4565b5090565b5f60e08284031215613acb575f80fd5b50919050565b5f60208284031215613ae1575f80fd5b5035919050565b803563ffffffff81168114613afb575f80fd5b919050565b6001600160a01b038116811461165d575f80fd5b5f8060408385031215613b25575f80fd5b613b2e83613ae8565b91506020830135613b3e81613b00565b809150509250929050565b5f8060408385031215613b5a575f80fd5b823591506020830135613b3e81613b00565b5f60208284031215613b7c575f80fd5b613b8582613ae8565b9392505050565b80356001600160401b0381168114613afb575f80fd5b5f60208284031215613bb2575f80fd5b613b8582613b8c565b801515811461165d575f80fd5b5f805f60608486031215613bda575f80fd5b833592506020840135613bec81613bbb565b9150613bfa60408501613ae8565b90509250925092565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613c3957613c39613c03565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c6757613c67613c03565b604052919050565b5f6001600160401b03821115613c8757613c87613c03565b50601f01601f191660200190565b5f805f60608486031215613ca7575f80fd5b83359250613cb760208501613b8c565b915060408401356001600160401b03811115613cd1575f80fd5b8401601f81018613613ce1575f80fd5b8035613cf4613cef82613c6f565b613c3f565b818152876020838501011115613d08575f80fd5b816020840160208301375f602083830101528093505050509250925092565b600181811c90821680613d3b57607f821691505b602082108103613acb57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454613d7f81613d27565b806020870152604060018084165f8114613da05760018114613dbc57613de9565b60ff19851660408a0152604084151560051b8a01019550613de9565b895f5260205f205f5b85811015613de05781548b8201860152908301908801613dc5565b8a016040019650505b509398975050505050505050565b5f60208284031215613e07575f80fd5b5051919050565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b60208082526030908201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e60408201526f1bdd081c195b991a5b99c8185919195960821b606082015260800190565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82613f1f57613f1f613ee9565b500490565b808202811582820484141761086457610864613efd565b5f5b83811015613f55578181015183820152602001613f3d565b50505f910152565b8051613afb81613bbb565b5f8060408385031215613f79575f80fd5b82516001600160401b0380821115613f8f575f80fd5b9084019060608287031215613fa2575f80fd5b613faa613c17565b82518152602080840151613fbd81613b00565b82820152604084015183811115613fd2575f80fd5b80850194505087601f850112613fe6575f80fd5b83519250613ff6613cef84613c6f565b8381528882858701011115614009575f80fd5b61401884838301848801613f3b565b8060408401525081955061402d818801613f5d565b9450505050509250929050565b6001600160401b0382811682821603908082111561405a5761405a613efd565b5092915050565b601f8211156105c757805f5260205f20601f840160051c810160208510156140865750805b601f840160051c820191505b818110156140a5575f8155600101614092565b5050505050565b81516001600160401b038111156140c5576140c5613c03565b6140d9816140d38454613d27565b84614061565b602080601f83116001811461410c575f84156140f55750858301515b5f19600386901b1c1916600185901b178555614163565b5f85815260208120601f198616915b8281101561413a5788860151825594840194600190910190840161411b565b508582101561415757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f8251806020840152614189816040850160208701613f3b565b601f01601f19169190910160400192915050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561086457610864613efd565b634e487b7160e01b5f52603260045260245ffd5b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b8082018082111561086457610864613efd565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b0380831681810361430c5761430c613efd565b6001019392505050565b6001600160401b0381811683821601908082111561405a5761405a613efd565b5f60208284031215614346575f80fd5b8135613b8581613b00565b6001600160401b0381811683821602808216919082811461437457614374613efd565b505092915050565b5f6001600160401b038084168061439557614395613ee9565b92169190910492915050565b5f82516143b2818460208701613f3b565b9190910192915050565b5f602082840312156143cc575f80fd5b813560ff81168114613b85575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 558621216..86a87b7fd 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -39,7 +39,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612b32380380612b3283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6129e58061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd3660046122fb565b61023f565b005b6101226100f23660046122fb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101226101433660046123bf565b6103a0565b6100e2610156366004612462565b6103c0565b61016e6101693660046122fb565b61071c565b6040516001600160401b03909116815260200161012c565b6100e2610730565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e03660046122fb565b610743565b6100e26101f3366004612462565b61074f565b6101ba6005600160991b0181565b6100e26102143660046122fb565b610908565b6100e26102273660046124a0565b6109d7565b6100e261023a3660046124dc565b610ae5565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206129b9833981519152929190610287906124f7565b90501180156102b9575060035f83815260078301602052604090205460ff1660058111156102b7576102b761252f565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b9190600401612543565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b91906125cd565b505050565b5f6103a9610b1f565b6103b584868585610b7a565b90505b949350505050565b5f805160206129b98339815191525f6103d883610fc1565b90505f806103e983604001516111a2565b91509150801561044e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561047f5761047f61252f565b60058111156104905761049061252f565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b90041660c0909101529091505f90825160058111156105095761050961252f565b148061052757506001825160058111156105255761052561252f565b145b6105865760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b60038251600581111561059b5761059b61252f565b036105c257505f83815260068601602052604081206004916105bd91906122b1565b6105c6565b5060055b6020808301515f908152600888019091526040812055818160058111156105ef576105ef61252f565b908160058111156106025761060261252f565b9052505f84815260078701602052604090208251815484929190829060ff191660018360058111156106365761063661252f565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055815160058111156106e9576106e961252f565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61072682611401565b6080015192915050565b610738610b1f565b6107415f61150f565b565b61074c8161157f565b50565b5f805160206129b98339815191525f61076783610fc1565b90505f8061077883604001516111a2565b91509150806107da5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600585016020526040812080546107f4906124f7565b9050118015610826575060015f83815260078601602052604090205460ff1660058111156108245761082461252f565b145b6108425760405162461bcd60e51b8152600401610319906125e4565b5f828152600585016020526040812061085a916122b1565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092178355600190930154875260088b0185528387208990559588905293835292548151931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206129b9833981519152929190610950906124f7565b9050118015610982575060015f83815260078301602052604090205460ff1660058111156109805761098061252f565b145b61099e5760405162461bcd60e51b8152600401610319906125e4565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b9190600401612543565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a1b5750825b90505f826001600160401b03166001148015610a365750303b155b905081158015610a44575080155b15610a625760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a8c57845460ff60401b1916600160401b1785555b610a968787611923565b8315610adc57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610aed610b1f565b6001600160a01b038116610b1657604051631e4fbdf760e01b81525f6004820152602401610319565b61074c8161150f565b33610b517f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107415760405163118cdaa760e01b8152336004820152602401610319565b5f610b83611941565b5f805160206129b9833981519152426001600160401b038516118015610bbd57506001600160401b038416610bbb426202a30061263f565b115b610c1f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b85610c765760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f86815260088201602052604090205415610ce45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610d4b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b610d548561198b565b5f80610d9b6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611b2c565b5f82815260058601602052604090209193509150610db982826126a3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610de6908590600401612784565b6020604051808303815f875af1158015610e02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2691906125cd565b6040805160e08101825260018152602081018c90529192508101336001600160a01b031681525f60208083018290526001600160401b038c166040808501919091526060840183905260809093018290528682526007880190522081518154829060ff19166001836005811115610e9f57610e9f61252f565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b9290911691909102179055610f4883611ed1565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f805160206129b98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611036573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261105d91908101906127c5565b91509150806110c45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146111275760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b03161561119a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146112075760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156112565761121e816001612897565b6112299060086128aa565b61ffff1685828151811061123f5761123f6128c1565b016020015160f81c901b919091179060010161120a565b5061ffff8116156112b55760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b6004811015611310576112cc816003612897565b6112d79060086128aa565b63ffffffff16866112e983600261263f565b815181106112f9576112f96128c1565b016020015160f81c901b91909117906001016112b8565b5063ffffffff81166002146113775760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b60208110156113cc5761138e81601f612897565b6113999060086128aa565b876113a583600661263f565b815181106113b5576113b56128c1565b016020015160f81c901b919091179060010161137a565b505f866026815181106113e1576113e16128c1565b016020015191976001600160f81b03199092161515965090945050505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0790528390208351918201909352825491925f805160206129b983398151915292829060ff1660058111156114945761149461252f565b60058111156114a5576114a561252f565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b900490911660c0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040808220815160e0810190925280545f805160206129b983398151915293929190829060ff1660058111156115df576115df61252f565b60058111156115f0576115f061252f565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b900490921660c0909101529091508151600581111561166a5761166a61252f565b146116c65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146117405760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b61174d816080015161198b565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156117915761179161252f565b021790555060208201516001820155604082015160028201805460608501516001600160a01b039093166001600160e01b031990911617600160a01b6001600160401b039384160217905560808301516003909201805460a085015160c0909501519383166001600160801b031990911617600160401b948316949094029390931767ffffffffffffffff60801b1916600160801b92909116919091021790555f6118458461183f81611ed1565b5f611f85565b5f858152600685016020526040902090915061186182826126a3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061188e908590600401612784565b6020604051808303815f875af11580156118aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ce91906125cd565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61192b6121a2565b611934826121eb565b61193d8161220c565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0080546001190161198557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206129b98339815191529060ff165f036119c9575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611a119083612897565b10611a2d576001600160401b0384166040830152808252611a4c565b8382604001818151611a3f91906128d5565b6001600160401b03169052505b5f826020015183604001516064611a6391906128fc565b611a6d9190612927565b600285015490915060ff9081169082161115611ae85760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610319565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611b965760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c0d57611bcd816001612897565b611bd89060086128aa565b5081515f90839083908110611bef57611bef6128c1565b60200101906001600160f81b03191690815f1a905350600101611bb9565b505f5b6004811015611c6b57611c24816003612897565b611c2f9060086128aa565b505f82611c3d83600261263f565b81518110611c4d57611c4d6128c1565b60200101906001600160f81b03191690815f1a905350600101611c10565b505f5b6020811015611cc85784518160208110611c8a57611c8a6128c1565b1a60f81b82611c9a83600661263f565b81518110611caa57611caa6128c1565b60200101906001600160f81b03191690815f1a905350600101611c6e565b505f5b6020811015611d285784602001518160208110611cea57611cea6128c1565b1a60f81b82611cfa83602661263f565b81518110611d0a57611d0a6128c1565b60200101906001600160f81b03191690815f1a905350600101611ccb565b505f5b6008811015611d9c57611d3f816007612897565b611d4a9060086128aa565b60ff1685604001516001600160401b0316901c60f81b82826046611d6e919061263f565b81518110611d7e57611d7e6128c1565b60200101906001600160f81b03191690815f1a905350600101611d2b565b505f5b6030811015611e075784608001518181518110611dbe57611dbe6128c1565b01602001516001600160f81b03191682611dd983604e61263f565b81518110611de957611de96128c1565b60200101906001600160f81b03191690815f1a905350600101611d9f565b505f5b6008811015611e7957611e1e816007612897565b611e299060086128aa565b60608601516001600160401b0390811691161c60f81b82611e4b83607e61263f565b81518110611e5b57611e5b6128c1565b60200101906001600160f81b03191690815f1a905350600101611e0a565b50600281604051611e8a9190612958565b602060405180830381855afa158015611ea5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611ec891906125cd565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060020180545f805160206129b983398151915291600160a01b9091046001600160401b03169081906014611f3083612973565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ffe57611fbe816001612897565b611fc99060086128aa565b5081515f90839083908110611fe057611fe06128c1565b60200101906001600160f81b03191690815f1a905350600101611faa565b505f5b600481101561206157612015816003612897565b6120209060086128aa565b6001901c60f81b8261203383600261263f565b81518110612043576120436128c1565b60200101906001600160f81b03191690815f1a905350600101612001565b505f5b60208110156120c35761207881601f612897565b6120839060086128aa565b86901c60f81b8261209583600661263f565b815181106120a5576120a56128c1565b60200101906001600160f81b03191690815f1a905350600101612064565b505f5b600881101561212e576120da816007612897565b6120e59060086128aa565b6001600160401b038616901c60f81b8261210083602661263f565b81518110612110576121106128c1565b60200101906001600160f81b03191690815f1a9053506001016120c6565b505f5b600881101561219957612145816007612897565b6121509060086128aa565b6001600160401b038516901c60f81b8261216b83602e61263f565b8151811061217b5761217b6128c1565b60200101906001600160f81b03191690815f1a905350600101612131565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661074157604051631afcd79f60e31b815260040160405180910390fd5b6121f36121a2565b6121fb61221d565b61220361222d565b61074c81612235565b6122146121a2565b61074c816122a1565b6122256121a2565b6107416122a9565b6107416121a2565b61223d6121a2565b80355f805160206129b983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122876060830160408401612998565b600291909101805460ff191660ff90921691909117905550565b610aed6121a2565b611f5f6121a2565b5080546122bd906124f7565b5f825580601f106122cc575050565b601f0160209004905f5260205f209081019061074c91905b808211156122f7575f81556001016122e4565b5090565b5f6020828403121561230b575f80fd5b5035919050565b80356001600160401b0381168114612328575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156123635761236361232d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156123915761239161232d565b604052919050565b5f6001600160401b038211156123b1576123b161232d565b50601f01601f191660200190565b5f805f80608085870312156123d2575f80fd5b6123db85612312565b9350602085013592506123f060408601612312565b915060608501356001600160401b0381111561240a575f80fd5b8501601f8101871361241a575f80fd5b803561242d61242882612399565b612369565b818152886020838501011115612441575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612472575f80fd5b813563ffffffff81168114612485575f80fd5b9392505050565b6001600160a01b038116811461074c575f80fd5b5f8082840360808112156124b2575f80fd5b60608112156124bf575f80fd5b5082915060608301356124d18161248c565b809150509250929050565b5f602082840312156124ec575f80fd5b81356124858161248c565b600181811c9082168061250b57607f821691505b60208210810361252957634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454612555816124f7565b806020870152604060018084165f81146125765760018114612592576125bf565b60ff19851660408a0152604084151560051b8a010195506125bf565b895f5260205f205f5b858110156125b65781548b820186015290830190880161259b565b8a016040019650505b509398975050505050505050565b5f602082840312156125dd575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126525761265261262b565b92915050565b601f82111561039b57805f5260205f20601f840160051c8101602085101561267d5750805b601f840160051c820191505b8181101561269c575f8155600101612689565b5050505050565b81516001600160401b038111156126bc576126bc61232d565b6126d0816126ca84546124f7565b84612658565b602080601f831160018114612703575f84156126ec5750858301515b5f19600386901b1c1916600185901b17855561275a565b5f85815260208120601f198616915b8281101561273157888601518255948401946001909101908401612712565b508582101561274e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561277c578181015183820152602001612764565b50505f910152565b602081525f82518060208401526127a2816040850160208701612762565b601f01601f19169190910160400192915050565b80518015158114612328575f80fd5b5f80604083850312156127d6575f80fd5b82516001600160401b03808211156127ec575f80fd5b90840190606082870312156127ff575f80fd5b612807612341565b8251815260208084015161281a8161248c565b8282015260408401518381111561282f575f80fd5b80850194505087601f850112612843575f80fd5b8351925061285361242884612399565b8381528882858701011115612866575f80fd5b61287584838301848801612762565b8060408401525081955061288a8188016127b6565b9450505050509250929050565b818103818111156126525761265261262b565b80820281158282048414176126525761265261262b565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b038181168382160190808211156128f5576128f561262b565b5092915050565b6001600160401b0381811683821602808216919082811461291f5761291f61262b565b505092915050565b5f6001600160401b038084168061294c57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612969818460208701612762565b9190910192915050565b5f6001600160401b0380831681810361298e5761298e61262b565b6001019392505050565b5f602082840312156129a8575f80fd5b813560ff81168114612485575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612bb4380380612bb483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a678061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd36600461237d565b61023f565b005b6101226100f236600461237d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612441565b6103a0565b6100e26101563660046124e4565b6103c0565b61016e61016936600461237d565b610743565b6040516001600160401b03909116815260200161012c565b6100e2610757565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e036600461237d565b61076a565b6100e26101f33660046124e4565b610776565b6101ba6005600160991b0181565b6100e261021436600461237d565b610933565b6100e2610227366004612522565b610a02565b6100e261023a36600461255e565b610b10565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612a3b83398151915292919061028790612579565b90501180156102b9575060035f83815260078301602052604090205460ff1660058111156102b7576102b76125b1565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125c5565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b919061264f565b505050565b5f6103a9610b4a565b6103b584868585610ba5565b90505b949350505050565b5f80516020612a3b8339815191525f6103d88361100d565b90505f806103e983604001516111ee565b91509150801561044e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610480576104806125b1565b6005811115610491576104916125b1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610518576105186125b1565b14806105365750600182516005811115610534576105346125b1565b145b6105955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b6003825160058111156105aa576105aa6125b1565b036105d157505f83815260068601602052604081206004916105cc9190612333565b6105d5565b5060055b6020808301515f908152600888019091526040812055818160058111156105fe576105fe6125b1565b90816005811115610611576106116125b1565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610645576106456125b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610710576107106125b1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61074d8261144d565b60a0015192915050565b61075f610b4a565b6107685f611571565b565b610773816115e1565b50565b5f80516020612a3b8339815191525f61078e8361100d565b90505f8061079f83604001516111ee565b91509150806108015760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f8281526005850160205260408120805461081b90612579565b905011801561084d575060015f83815260078601602052604090205460ff16600581111561084b5761084b6125b1565b145b6108695760405162461bcd60e51b815260040161031990612666565b5f828152600585016020526040812061088191612333565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a3b83398151915292919061097b90612579565b90501180156109ad575060015f83815260078301602052604090205460ff1660058111156109ab576109ab6125b1565b145b6109c95760405162461bcd60e51b815260040161031990612666565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125c5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a465750825b90505f826001600160401b03166001148015610a615750303b155b905081158015610a6f575080155b15610a8d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ab757845460ff60401b1916600160401b1785555b610ac187876119ac565b8315610b0757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610b18610b4a565b6001600160a01b038116610b4157604051631e4fbdf760e01b81525f6004820152602401610319565b61077381611571565b33610b7c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107685760405163118cdaa760e01b8152336004820152602401610319565b5f610bae6119ca565b5f80516020612a3b833981519152426001600160401b038516118015610be857506001600160401b038416610be6426202a3006126c1565b115b610c4a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b85610ca15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f86815260088201602052604090205415610d0f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610d765760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b610d7f85611a14565b5f80610dc66040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611bb5565b5f82815260058601602052604090209193509150610de48282612725565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610e11908590600401612806565b6020604051808303815f875af1158015610e2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e51919061264f565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115610ed357610ed36125b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610f9483611f5a565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f80516020612a3b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611082573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110a99190810190612847565b91509150806111105760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146111735760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b0316156111e65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146112535760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156112a25761126a816001612919565b61127590600861292c565b61ffff1685828151811061128b5761128b612943565b016020015160f81c901b9190911790600101611256565b5061ffff8116156113015760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b600481101561135c57611318816003612919565b61132390600861292c565b63ffffffff16866113358360026126c1565b8151811061134557611345612943565b016020015160f81c901b9190911790600101611304565b5063ffffffff81166002146113c35760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b6020811015611418576113da81601f612919565b6113e590600861292c565b876113f18360066126c1565b8151811061140157611401612943565b016020015160f81c901b91909117906001016113c6565b505f8660268151811061142d5761142d612943565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0790528390208351918201909352825491925f80516020612a3b83398151915292829060ff1660058111156114e8576114e86125b1565b60058111156114f9576114f96125b1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0760205260408082208151610100810190925280545f80516020612a3b83398151915293929190829060ff166005811115611642576116426125b1565b6005811115611653576116536125b1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156116db576116db6125b1565b146117375760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146117b15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b6117be8160a00151611a14565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff19166001836005811115611802576118026125b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6118ce846118c881611f5a565b5f612007565b5f85815260068501602052604090209091506118ea8282612725565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611917908590600401612806565b6020604051808303815f875af1158015611933573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611957919061264f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b6119b4612224565b6119bd8261226d565b6119c68161228e565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a0e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a3b8339815191529060ff165f03611a52575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611a9a9083612919565b10611ab6576001600160401b0384166040830152808252611ad5565b8382604001818151611ac89190612957565b6001600160401b03169052505b5f826020015183604001516064611aec919061297e565b611af691906129a9565b600285015490915060ff9081169082161115611b715760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610319565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c1f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c9657611c56816001612919565b611c6190600861292c565b5081515f90839083908110611c7857611c78612943565b60200101906001600160f81b03191690815f1a905350600101611c42565b505f5b6004811015611cf457611cad816003612919565b611cb890600861292c565b505f82611cc68360026126c1565b81518110611cd657611cd6612943565b60200101906001600160f81b03191690815f1a905350600101611c99565b505f5b6020811015611d515784518160208110611d1357611d13612943565b1a60f81b82611d238360066126c1565b81518110611d3357611d33612943565b60200101906001600160f81b03191690815f1a905350600101611cf7565b505f5b6020811015611db15784602001518160208110611d7357611d73612943565b1a60f81b82611d838360266126c1565b81518110611d9357611d93612943565b60200101906001600160f81b03191690815f1a905350600101611d54565b505f5b6008811015611e2557611dc8816007612919565b611dd390600861292c565b60ff1685604001516001600160401b0316901c60f81b82826046611df791906126c1565b81518110611e0757611e07612943565b60200101906001600160f81b03191690815f1a905350600101611db4565b505f5b6030811015611e905784608001518181518110611e4757611e47612943565b01602001516001600160f81b03191682611e6283604e6126c1565b81518110611e7257611e72612943565b60200101906001600160f81b03191690815f1a905350600101611e28565b505f5b6008811015611f0257611ea7816007612919565b611eb290600861292c565b60608601516001600160401b0390811691161c60f81b82611ed483607e6126c1565b81518110611ee457611ee4612943565b60200101906001600160f81b03191690815f1a905350600101611e93565b50600281604051611f1391906129da565b602060405180830381855afa158015611f2e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f51919061264f565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060030180545f80516020612a3b833981519152916001600160401b0390911690819084611fb2836129f5565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561208057612040816001612919565b61204b90600861292c565b5081515f9083908390811061206257612062612943565b60200101906001600160f81b03191690815f1a90535060010161202c565b505f5b60048110156120e357612097816003612919565b6120a290600861292c565b6001901c60f81b826120b58360026126c1565b815181106120c5576120c5612943565b60200101906001600160f81b03191690815f1a905350600101612083565b505f5b6020811015612145576120fa81601f612919565b61210590600861292c565b86901c60f81b826121178360066126c1565b8151811061212757612127612943565b60200101906001600160f81b03191690815f1a9053506001016120e6565b505f5b60088110156121b05761215c816007612919565b61216790600861292c565b6001600160401b038616901c60f81b826121828360266126c1565b8151811061219257612192612943565b60200101906001600160f81b03191690815f1a905350600101612148565b505f5b600881101561221b576121c7816007612919565b6121d290600861292c565b6001600160401b038516901c60f81b826121ed83602e6126c1565b815181106121fd576121fd612943565b60200101906001600160f81b03191690815f1a9053506001016121b3565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661076857604051631afcd79f60e31b815260040160405180910390fd5b612275612224565b61227d61229f565b6122856122af565b610773816122b7565b612296612224565b61077381612323565b6122a7612224565b61076861232b565b610768612224565b6122bf612224565b80355f80516020612a3b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123096060830160408401612a1a565b600291909101805460ff191660ff90921691909117905550565b610b18612224565b611fe1612224565b50805461233f90612579565b5f825580601f1061234e575050565b601f0160209004905f5260205f209081019061077391905b80821115612379575f8155600101612366565b5090565b5f6020828403121561238d575f80fd5b5035919050565b80356001600160401b03811681146123aa575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156123e5576123e56123af565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612413576124136123af565b604052919050565b5f6001600160401b03821115612433576124336123af565b50601f01601f191660200190565b5f805f8060808587031215612454575f80fd5b61245d85612394565b93506020850135925061247260408601612394565b915060608501356001600160401b0381111561248c575f80fd5b8501601f8101871361249c575f80fd5b80356124af6124aa8261241b565b6123eb565b8181528860208385010111156124c3575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156124f4575f80fd5b813563ffffffff81168114612507575f80fd5b9392505050565b6001600160a01b0381168114610773575f80fd5b5f808284036080811215612534575f80fd5b6060811215612541575f80fd5b5082915060608301356125538161250e565b809150509250929050565b5f6020828403121561256e575f80fd5b81356125078161250e565b600181811c9082168061258d57607f821691505b6020821081036125ab57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f84546125d781612579565b806020870152604060018084165f81146125f8576001811461261457612641565b60ff19851660408a0152604084151560051b8a01019550612641565b895f5260205f205f5b858110156126385781548b820186015290830190880161261d565b8a016040019650505b509398975050505050505050565b5f6020828403121561265f575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126d4576126d46126ad565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156126ff5750805b601f840160051c820191505b8181101561271e575f815560010161270b565b5050505050565b81516001600160401b0381111561273e5761273e6123af565b6127528161274c8454612579565b846126da565b602080601f831160018114612785575f841561276e5750858301515b5f19600386901b1c1916600185901b1785556127dc565b5f85815260208120601f198616915b828110156127b357888601518255948401946001909101908401612794565b50858210156127d057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156127fe5781810151838201526020016127e6565b50505f910152565b602081525f82518060208401526128248160408501602087016127e4565b601f01601f19169190910160400192915050565b805180151581146123aa575f80fd5b5f8060408385031215612858575f80fd5b82516001600160401b038082111561286e575f80fd5b9084019060608287031215612881575f80fd5b6128896123c3565b8251815260208084015161289c8161250e565b828201526040840151838111156128b1575f80fd5b80850194505087601f8501126128c5575f80fd5b835192506128d56124aa8461241b565b83815288828587010111156128e8575f80fd5b6128f7848383018488016127e4565b8060408401525081955061290c818801612838565b9450505050509250929050565b818103818111156126d4576126d46126ad565b80820281158282048414176126d4576126d46126ad565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b03818116838216019080821115612977576129776126ad565b5092915050565b6001600160401b038181168382160280821691908281146129a1576129a16126ad565b505092915050565b5f6001600160401b03808416806129ce57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516129eb8184602087016127e4565b9190910192915050565b5f6001600160401b03808316818103612a1057612a106126ad565b6001019392505050565b5f60208284031215612a2a575f80fd5b813560ff81168114612507575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 24643402d..0fcf44a16 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -143,6 +143,7 @@ abstract contract ValidatorManager is status: ValidatorStatus.PendingAdded, nodeID: nodeID, owner: _msgSender(), + startingWeight: weight, messageNonce: 0, weight: weight, startedAt: 0, // The validation period only starts once the registration is acknowledged. diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index e56abf033..3cb824ad7 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -18,6 +18,7 @@ struct Validator { ValidatorStatus status; bytes32 nodeID; address owner; + uint64 startingWeight; uint64 messageNonce; uint64 weight; uint64 startedAt; From d63a131d35c2ba7ab2317e2a18cc95895b813c94 Mon Sep 17 00:00:00 2001 From: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Date: Thu, 5 Sep 2024 11:38:29 -0500 Subject: [PATCH 203/545] Update contracts/staking/NativeTokenStakingManager.sol Co-authored-by: minghinmatthewlam Signed-off-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> --- contracts/staking/NativeTokenStakingManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 3baa0c19c..0162ede57 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -50,7 +50,7 @@ contract NativeTokenStakingManager is /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. + * @param registrationExpiry The Unix timestamp after which the registration is no longer valid on the P-Chain. * @param blsPublicKey The BLS public key of the validator. */ function initializeValidatorRegistration( From e9db5269172d7b1b0300a479fa58c4093d938e23 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 14:06:18 -0500 Subject: [PATCH 204/545] update mapping descriptions --- contracts/staking/PoSValidatorManager.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index c16fae9df..50ade4f1d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -28,11 +28,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 _minimumStakeDuration; /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; - /// @notice Maps the validationID to a mapping of delegator address to delegator information. + /// @notice Maps the delegationID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; - /// @notice Maps the validationID to a mapping of delegator address to pending register delegator messages. + /// @notice Maps the delegationID to pending register delegator messages. mapping(bytes32 delegationID => bytes) _pendingRegisterDelegatorMessages; - /// @notice Maps the validationID to a mapping of delegator address to pending end delegator messages. + /// @notice Maps the delegationID to pending end delegator messages. mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; } // solhint-enable private-vars-leading-underscore From aed4ed7c7941ce23fc8345c56020b1d66292efa0 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 14:28:59 -0500 Subject: [PATCH 205/545] delegationID w/keccak; remove unnecessary check --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 10 +++------- contracts/staking/tests/PoSValidatorManagerTests.t.sol | 2 +- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index bf8803839..d57c7ca9f 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161485438038061485483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147078061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613d73565b6102d6565b005b610128610138366004613dae565b61076a565b61017b61014b366004613dae565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613dae565b6108c6565b6101286101af366004613dd9565b610933565b6101c76101c2366004613dae565b610a17565b6040516001600160401b039091168152602001610185565b6101286101ed366004613e16565b610a2d565b610128610200366004613e2f565b610db0565b61017b610213366004613e6d565b610fa1565b6101c7610226366004613dae565b610fba565b610128610239366004613dae565b610fce565b61012861024c366004613d73565b61103b565b61017b61025f366004613f18565b611056565b610128610272366004613e2f565b61107b565b61017b610285366004613fb4565b61121b565b610128610298366004613e16565b61122e565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613dae565b6113eb565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061465b8339815191529184156103285761032582856114ba565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613fd4565b600481111561036b5761036b613fd4565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146104505760405162461bcd60e51b815260206004820152603360248201525f8051602061467b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b60028151600481111561046557610465613fd4565b146104b25760405162461bcd60e51b815260206004820152602a60248201525f8051602061467b8339815191526044820152696e6f742061637469766560b01b6064820152608401610447565b5f6104bc84611756565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050957610509613fd4565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105db856117ca565b905082606001516001600160401b03168160a001516001600160401b0316116106525760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610447565b5f83606001518260a001516106679190613ffc565b905061067386826118db565b5f61067f878584611923565b5f8c815260058a016020526040902090915061069b82826140a6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106c8908590600401614187565b6020604051808303815f875af11580156106e4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906141b9565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061469b8339815191529291906107b290614023565b90501180156107e4575060035f83815260078301602052604090205460ff1660058111156107e2576107e2613fd4565b145b6108485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610447565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161088191906004016141d0565b6020604051808303815f875af115801561089d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c191906141b9565b505050565b6108cf81611b40565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061465b833981519152916005600160991b019163ee5b48eb91610881916004016141d0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061097c575080546001600160401b03808416911610155b1561099a5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109c58484611c13565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a2764e8d4a510008361426e565b92915050565b5f8051602061469b8339815191525f610a4583611c2d565b90505f80610a568360400151611e0e565b915091508015610abb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610447565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610aed57610aed613fd4565b6005811115610afe57610afe613fd4565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b8557610b85613fd4565b1480610ba35750600182516005811115610ba157610ba1613fd4565b145b610c025760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610447565b600382516005811115610c1757610c17613fd4565b03610c3e57505f8381526006860160205260408120600491610c399190613d04565b610c42565b5060055b6020808301515f90815260088801909152604081205581816005811115610c6b57610c6b613fd4565b90816005811115610c7e57610c7e613fd4565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610cb257610cb2613fd4565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d7d57610d7d613fd4565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f8051602061465b8339815191525f610dc884611c2d565b90505f80610dd98360400151611faf565b5091509150610de7856121ea565b5f8581526004850160205260408120610dff91613d04565b5f610e09836117ca565b9050816001600160401b031681608001516001600160401b03161015610e415760405162461bcd60e51b815260040161044790614281565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e865760405162461bcd60e51b8152600401610447906142c3565b60015f87815260038701602052604090205460ff166004811115610eac57610eac613fd4565b14610f155760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610447565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a276001600160401b03831664e8d4a5100061430c565b5f610fc4826117ca565b60a0015192915050565b610fd7816121ea565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061465b833981519152916005600160991b019163ee5b48eb91610881916004016141d0565b811561104d5761104b83826114ba565b505b6108c1836122c3565b5f806110618661267b565b905061106f85828686612728565b9150505b949350505050565b5f8051602061465b8339815191525f61109384611c2d565b90505f806110a48360400151611faf565b50915091506110b285611b40565b5f85815260058501602052604081206110ca91613d04565b5f6110d4836117ca565b9050816001600160401b031681608001516001600160401b0316101561110c5760405162461bcd60e51b815260040161044790614281565b5f8681526003808701602052604090912001546001600160401b038084169116111561114a5760405162461bcd60e51b8152600401610447906142c3565b60035f87815260038701602052604090205460ff16600481111561117057611170613fd4565b146111c45760405162461bcd60e51b815260206004820152603160248201525f8051602061467b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610447565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611227833384612b7d565b9392505050565b5f8051602061469b8339815191525f61124683611c2d565b90505f806112578360400151611e0e565b91509150806112b95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610447565b5f828152600585016020526040812080546112d390614023565b9050118015611305575060015f83815260078601602052604090205460ff16600581111561130357611303613fd4565b145b6113215760405162461bcd60e51b815260040161044790614323565b5f828152600585016020526040812061133991613d04565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061469b83398151915292919061143390614023565b9050118015611465575060015f83815260078301602052604090205460ff16600581111561146357611463613fd4565b145b6114815760405162461bcd60e51b815260040161044790614323565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161088191906004016141d0565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611505573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152c9190810190614375565b915091508061158f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610447565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f691906141b9565b82511461165a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610447565b60208201516001600160a01b0316156116d05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610447565b5f806116df8460400151613003565b9150915081871461174c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610447565b9695505050505050565b5f8181525f805160206146db8339815191526020526040812060030180545f8051602061469b833981519152916001600160401b039091169081908461179b83614447565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f805160206146db83398151915290528390208351918201909352825491925f8051602061469b83398151915292829060ff16600581111561185257611852613fd4565b600581111561186357611863613fd4565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206146db833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561199c5761195c81600161446c565b61196790600861430c565b5081515f9083908390811061197e5761197e61447f565b60200101906001600160f81b03191690815f1a905350600101611948565b505f5b60048110156119ff576119b381600361446c565b6119be90600861430c565b6001901c60f81b826119d1836002614493565b815181106119e1576119e161447f565b60200101906001600160f81b03191690815f1a90535060010161199f565b505f5b6020811015611a6157611a1681601f61446c565b611a2190600861430c565b86901c60f81b82611a33836006614493565b81518110611a4357611a4361447f565b60200101906001600160f81b03191690815f1a905350600101611a02565b505f5b6008811015611acc57611a7881600761446c565b611a8390600861430c565b6001600160401b038616901c60f81b82611a9e836026614493565b81518110611aae57611aae61447f565b60200101906001600160f81b03191690815f1a905350600101611a64565b505f5b6008811015611b3757611ae381600761446c565b611aee90600861430c565b6001600160401b038516901c60f81b82611b0983602e614493565b81518110611b1957611b1961447f565b60200101906001600160f81b03191690815f1a905350600101611acf565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061465b833981519152929190611b8890614023565b9050118015611bba575060035f83815260038301602052604090205460ff166004811115611bb857611bb8613fd4565b145b611c0f5760405162461bcd60e51b815260206004820152603360248201525f8051602061467b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610447565b5050565b611c1b6131db565b611c2482613226565b611c0f8161326c565b60408051606080820183525f8083526020830181905292820152905f8051602061469b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ca2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cc99190810190614375565b9150915080611d305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610447565b8254825114611d935760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610447565b60208201516001600160a01b031615611e065760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610447565b509392505050565b5f808251602714611e315760405162461bcd60e51b8152600401610447906144a6565b5f805b6002811015611e8057611e4881600161446c565b611e5390600861430c565b61ffff16858281518110611e6957611e6961447f565b016020015160f81c901b9190911790600101611e34565b5061ffff811615611ea35760405162461bcd60e51b8152600401610447906144ef565b5f805b6004811015611efe57611eba81600361446c565b611ec590600861430c565b63ffffffff1686611ed7836002614493565b81518110611ee757611ee761447f565b016020015160f81c901b9190911790600101611ea6565b5063ffffffff8116600214611f255760405162461bcd60e51b815260040161044790614532565b5f805b6020811015611f7a57611f3c81601f61446c565b611f4790600861430c565b87611f53836006614493565b81518110611f6357611f6361447f565b016020015160f81c901b9190911790600101611f28565b505f86602681518110611f8f57611f8f61447f565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611fd35760405162461bcd60e51b8152600401610447906144a6565b5f805b600281101561202257611fea81600161446c565b611ff590600861430c565b61ffff1686828151811061200b5761200b61447f565b016020015160f81c901b9190911790600101611fd6565b5061ffff8116156120455760405162461bcd60e51b8152600401610447906144ef565b5f805b60048110156120a05761205c81600361446c565b61206790600861430c565b63ffffffff1687612079836002614493565b815181106120895761208961447f565b016020015160f81c901b9190911790600101612048565b5063ffffffff81166003146120c75760405162461bcd60e51b815260040161044790614532565b5f805b602081101561211c576120de81601f61446c565b6120e990600861430c565b886120f5836006614493565b815181106121055761210561447f565b016020015160f81c901b91909117906001016120ca565b505f805b600881101561217b5761213481600761446c565b61213f90600861430c565b6001600160401b031689612154836026614493565b815181106121645761216461447f565b016020015160f81c901b9190911790600101612120565b505f805b60088110156121da5761219381600761446c565b61219e90600861430c565b6001600160401b03168a6121b383602e614493565b815181106121c3576121c361447f565b016020015160f81c901b919091179060010161217f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061465b83398151915292919061223290614023565b9050118015612264575060015f83815260038301602052604090205460ff16600481111561226257612262613fd4565b145b611c0f5760405162461bcd60e51b815260206004820152603860248201525f8051602061467b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610447565b5f8181525f805160206146db83398151915260205260408082208151610100810190925280545f8051602061469b83398151915293929190829060ff16600581111561231157612311613fd4565b600581111561232257612322613fd4565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123aa576123aa613fd4565b146124065760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610447565b60408101516001600160a01b0316336001600160a01b0316146124805760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610447565b61248d8160a00151613320565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124d1576124d1613fd4565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61259d8461259781611756565b5f611923565b5f85815260068501602052604090209091506125b982826140a6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125e6908590600401614187565b6020604051808303815f875af1158015612602573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262691906141b9565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061465b83398151915281612694846134c1565b90505f6126a082610a17565b83549091506001600160401b038216108015906126ca57508260010154816001600160401b031611155b6110735760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610447565b5f6127316134f7565b5f8051602061469b833981519152426001600160401b03851611801561276b57506001600160401b038416612769426202a300614493565b115b6127cd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610447565b856128245760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610447565b5f868152600882016020526040902054156128925760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610447565b82516030146128f95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610447565b61290285613320565b5f806129496040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061352e565b5f8281526005860160205260409020919350915061296782826140a6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612994908590600401614187565b6020604051808303815f875af11580156129b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129d491906141b9565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612a5657612a56613fd4565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612b1783611756565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061107360015f805160206146bb83398151915255565b5f612b866134f7565b5f612b936101c2846134c1565b90505f8051602061465b8339815191525f612bad876117ca565b9050600281516005811115612bc457612bc4613fd4565b14612c235760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610447565b5f838260a00151612c349190614579565b9050612c4088826118db565b5f612c4a89611756565b90505f60028a8a84604051602001612c949392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f1981840301815290829052612cae91614599565b602060405180830381855afa158015612cc9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612cec91906141b9565b5f8181526003870160205260409020600201549091506001600160401b031615612d755760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e496044820152731108185b1c9958591e481c9959da5cdd195c995960621b6064820152608401610447565b612d7e86613320565b5f612d8a8b8486611923565b5f8381526004880160205260409020909150612da682826140a6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612dd3908590600401614187565b6020604051808303815f875af1158015612def573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e1391906141b9565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612ec257612ec2613fd4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061122760015f805160206146bb83398151915255565b5f808251602e146130265760405162461bcd60e51b8152600401610447906144a6565b5f805b60028110156130755761303d81600161446c565b61304890600861430c565b61ffff1685828151811061305e5761305e61447f565b016020015160f81c901b9190911790600101613029565b5061ffff8116156130985760405162461bcd60e51b8152600401610447906144ef565b5f805b60048110156130f3576130af81600361446c565b6130ba90600861430c565b63ffffffff16866130cc836002614493565b815181106130dc576130dc61447f565b016020015160f81c901b919091179060010161309b565b5063ffffffff811660041461311a5760405162461bcd60e51b815260040161044790614532565b5f805b602081101561316f5761313181601f61446c565b61313c90600861430c565b87613148836006614493565b815181106131585761315861447f565b016020015160f81c901b919091179060010161311d565b505f805b60088110156131ce5761318781600761446c565b61319290600861430c565b6001600160401b0316886131a7836026614493565b815181106131b7576131b761447f565b016020015160f81c901b9190911790600101613173565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661322457604051631afcd79f60e31b815260040160405180910390fd5b565b61322e6131db565b613237816138e6565b6132696060820135608083013561325460c0850160a08601613e6d565b61326460e0860160c087016145b4565b613907565b50565b6132746131db565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166133005760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610447565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061469b8339815191529060ff165f0361335e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133a6908361446c565b106133c2576001600160401b03841660408301528082526133e1565b83826040018181516133d49190614579565b6001600160401b03169052505b5f8260200151836040015160646133f891906145cf565b61340291906145fa565b600285015490915060ff908116908216111561347d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610447565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a27827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613962565b5f805160206146bb83398151915280546001190161352857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135985760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610447565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561360f576135cf81600161446c565b6135da90600861430c565b5081515f908390839081106135f1576135f161447f565b60200101906001600160f81b03191690815f1a9053506001016135bb565b505f5b600481101561366d5761362681600361446c565b61363190600861430c565b505f8261363f836002614493565b8151811061364f5761364f61447f565b60200101906001600160f81b03191690815f1a905350600101613612565b505f5b60208110156136ca578451816020811061368c5761368c61447f565b1a60f81b8261369c836006614493565b815181106136ac576136ac61447f565b60200101906001600160f81b03191690815f1a905350600101613670565b505f5b602081101561372a57846020015181602081106136ec576136ec61447f565b1a60f81b826136fc836026614493565b8151811061370c5761370c61447f565b60200101906001600160f81b03191690815f1a9053506001016136cd565b505f5b600881101561379e5761374181600761446c565b61374c90600861430c565b60ff1685604001516001600160401b0316901c60f81b828260466137709190614493565b815181106137805761378061447f565b60200101906001600160f81b03191690815f1a90535060010161372d565b505f5b603081101561380957846080015181815181106137c0576137c061447f565b01602001516001600160f81b031916826137db83604e614493565b815181106137eb576137eb61447f565b60200101906001600160f81b03191690815f1a9053506001016137a1565b505f5b600881101561387b5761382081600761446c565b61382b90600861430c565b60608601516001600160401b0390811691161c60f81b8261384d83607e614493565b8151811061385d5761385d61447f565b60200101906001600160f81b03191690815f1a90535060010161380c565b5060028160405161388c9190614599565b602060405180830381855afa1580156138a7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138ca91906141b9565b94909350915050565b60015f805160206146bb83398151915255565b6138ee6131db565b6138f6613ac4565b6138fe613ad4565b61326981613adc565b61390f6131db565b5f5f8051602061465b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139cc91906141b9565b90506139e36001600160a01b038516333086613b48565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a4b91906141b9565b9050818111613ab15760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610447565b613abb828261446c565b95945050505050565b613acc6131db565b613224613ba8565b6132246131db565b613ae46131db565b80355f8051602061469b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b2e606083016040840161461f565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613ba2908590613bb0565b50505050565b6138d36131db565b5f613bc46001600160a01b03841683613c11565b905080515f14158015613be8575080806020019051810190613be6919061463f565b155b156108c157604051635274afe760e01b81526001600160a01b0384166004820152602401610447565b606061122783835f845f80856001600160a01b03168486604051613c359190614599565b5f6040518083038185875af1925050503d805f8114613c6f576040519150601f19603f3d011682016040523d82523d5f602084013e613c74565b606091505b509150915061174c868383606082613c9457613c8f82613cdb565b611227565b8151158015613cab57506001600160a01b0384163b155b15613cd457604051639996b31560e01b81526001600160a01b0385166004820152602401610447565b5080611227565b805115613ceb5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d1090614023565b5f825580601f10613d1f575050565b601f0160209004905f5260205f209081019061326991905b80821115613d4a575f8155600101613d37565b5090565b8015158114613269575f80fd5b803563ffffffff81168114613d6e575f80fd5b919050565b5f805f60608486031215613d85575f80fd5b833592506020840135613d9781613d4e565b9150613da560408501613d5b565b90509250925092565b5f60208284031215613dbe575f80fd5b5035919050565b6001600160a01b0381168114613269575f80fd5b5f80828403610100811215613dec575f80fd5b60e0811215613df9575f80fd5b5082915060e0830135613e0b81613dc5565b809150509250929050565b5f60208284031215613e26575f80fd5b61122782613d5b565b5f8060408385031215613e40575f80fd5b613e4983613d5b565b946020939093013593505050565b80356001600160401b0381168114613d6e575f80fd5b5f60208284031215613e7d575f80fd5b61122782613e57565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613ebc57613ebc613e86565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613eea57613eea613e86565b604052919050565b5f6001600160401b03821115613f0a57613f0a613e86565b50601f01601f191660200190565b5f805f8060808587031215613f2b575f80fd5b8435935060208501359250613f4260408601613e57565b915060608501356001600160401b03811115613f5c575f80fd5b8501601f81018713613f6c575f80fd5b8035613f7f613f7a82613ef2565b613ec2565b818152886020838501011115613f93575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613fc5575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561401c5761401c613fe8565b5092915050565b600181811c9082168061403757607f821691505b60208210810361405557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108c157805f5260205f20601f840160051c810160208510156140805750805b601f840160051c820191505b8181101561409f575f815560010161408c565b5050505050565b81516001600160401b038111156140bf576140bf613e86565b6140d3816140cd8454614023565b8461405b565b602080601f831160018114614106575f84156140ef5750858301515b5f19600386901b1c1916600185901b17855561415d565b5f85815260208120601f198616915b8281101561413457888601518255948401946001909101908401614115565b508582101561415157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561417f578181015183820152602001614167565b50505f910152565b602081525f82518060208401526141a5816040850160208701614165565b601f01601f19169190910160400192915050565b5f602082840312156141c9575f80fd5b5051919050565b5f60208083525f84546141e281614023565b806020870152604060018084165f8114614203576001811461421f5761424c565b60ff19851660408a0152604084151560051b8a0101955061424c565b895f5260205f205f5b858110156142435781548b8201860152908301908801614228565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261427c5761427c61425a565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a2757610a27613fe8565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613d6e81613d4e565b5f8060408385031215614386575f80fd5b82516001600160401b038082111561439c575f80fd5b90840190606082870312156143af575f80fd5b6143b7613e9a565b825181526020808401516143ca81613dc5565b828201526040840151838111156143df575f80fd5b80850194505087601f8501126143f3575f80fd5b83519250614403613f7a84613ef2565b8381528882858701011115614416575f80fd5b61442584838301848801614165565b8060408401525081955061443a81880161436a565b9450505050509250929050565b5f6001600160401b0380831681810361446257614462613fe8565b6001019392505050565b81810381811115610a2757610a27613fe8565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a2757610a27613fe8565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561401c5761401c613fe8565b5f82516145aa818460208701614165565b9190910192915050565b5f602082840312156145c4575f80fd5b813561122781613dc5565b6001600160401b038181168382160280821691908281146145f2576145f2613fe8565b505092915050565b5f6001600160401b03808416806146135761461361425a565b92169190910492915050565b5f6020828403121561462f575f80fd5b813560ff81168114611227575f80fd5b5f6020828403121561464f575f80fd5b815161122781613d4e56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161478938038061478983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61463c8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613ca8565b6102d6565b005b610128610138366004613ce3565b61076a565b61017b61014b366004613ce3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613ce3565b6108c6565b6101286101af366004613d0e565b610933565b6101c76101c2366004613ce3565b610a17565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d4b565b610a2d565b610128610200366004613d64565b610db0565b61017b610213366004613da2565b610fa1565b6101c7610226366004613ce3565b610fba565b610128610239366004613ce3565b610fce565b61012861024c366004613ca8565b61103b565b61017b61025f366004613e4d565b611056565b610128610272366004613d64565b61107b565b61017b610285366004613ee9565b61121b565b610128610298366004613d4b565b61122e565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613ce3565b6113eb565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145908339815191529184156103285761032582856114ba565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613f09565b600481111561036b5761036b613f09565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146104505760405162461bcd60e51b815260206004820152603360248201525f805160206145b08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b60028151600481111561046557610465613f09565b146104b25760405162461bcd60e51b815260206004820152602a60248201525f805160206145b08339815191526044820152696e6f742061637469766560b01b6064820152608401610447565b5f6104bc84611756565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050957610509613f09565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105db856117ca565b905082606001516001600160401b03168160a001516001600160401b0316116106525760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610447565b5f83606001518260a001516106679190613f31565b905061067386826118db565b5f61067f878584611923565b5f8c815260058a016020526040902090915061069b8282613fdb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106c89085906004016140bc565b6020604051808303815f875af11580156106e4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906140ee565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145d08339815191529291906107b290613f58565b90501180156107e4575060035f83815260078301602052604090205460ff1660058111156107e2576107e2613f09565b145b6108485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610447565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108819190600401614105565b6020604051808303815f875af115801561089d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c191906140ee565b505050565b6108cf81611b40565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614590833981519152916005600160991b019163ee5b48eb9161088191600401614105565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061097c575080546001600160401b03808416911610155b1561099a5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109c58484611c13565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a2764e8d4a51000836141a3565b92915050565b5f805160206145d08339815191525f610a4583611c2d565b90505f80610a568360400151611e0e565b915091508015610abb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610447565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610aed57610aed613f09565b6005811115610afe57610afe613f09565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b8557610b85613f09565b1480610ba35750600182516005811115610ba157610ba1613f09565b145b610c025760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610447565b600382516005811115610c1757610c17613f09565b03610c3e57505f8381526006860160205260408120600491610c399190613c39565b610c42565b5060055b6020808301515f90815260088801909152604081205581816005811115610c6b57610c6b613f09565b90816005811115610c7e57610c7e613f09565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610cb257610cb2613f09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d7d57610d7d613f09565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145908339815191525f610dc884611c2d565b90505f80610dd98360400151611faf565b5091509150610de7856121ea565b5f8581526004850160205260408120610dff91613c39565b5f610e09836117ca565b9050816001600160401b031681608001516001600160401b03161015610e415760405162461bcd60e51b8152600401610447906141b6565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e865760405162461bcd60e51b8152600401610447906141f8565b60015f87815260038701602052604090205460ff166004811115610eac57610eac613f09565b14610f155760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610447565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a276001600160401b03831664e8d4a51000614241565b5f610fc4826117ca565b60a0015192915050565b610fd7816121ea565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614590833981519152916005600160991b019163ee5b48eb9161088191600401614105565b811561104d5761104b83826114ba565b505b6108c1836122c3565b5f806110618661267b565b905061106f85828686612728565b9150505b949350505050565b5f805160206145908339815191525f61109384611c2d565b90505f806110a48360400151611faf565b50915091506110b285611b40565b5f85815260058501602052604081206110ca91613c39565b5f6110d4836117ca565b9050816001600160401b031681608001516001600160401b0316101561110c5760405162461bcd60e51b8152600401610447906141b6565b5f8681526003808701602052604090912001546001600160401b038084169116111561114a5760405162461bcd60e51b8152600401610447906141f8565b60035f87815260038701602052604090205460ff16600481111561117057611170613f09565b146111c45760405162461bcd60e51b815260206004820152603160248201525f805160206145b08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610447565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611227833384612b7d565b9392505050565b5f805160206145d08339815191525f61124683611c2d565b90505f806112578360400151611e0e565b91509150806112b95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610447565b5f828152600585016020526040812080546112d390613f58565b9050118015611305575060015f83815260078601602052604090205460ff16600581111561130357611303613f09565b145b6113215760405162461bcd60e51b815260040161044790614258565b5f828152600585016020526040812061133991613c39565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145d083398151915292919061143390613f58565b9050118015611465575060015f83815260078301602052604090205460ff16600581111561146357611463613f09565b145b6114815760405162461bcd60e51b815260040161044790614258565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108819190600401614105565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611505573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152c91908101906142aa565b915091508061158f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610447565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f691906140ee565b82511461165a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610447565b60208201516001600160a01b0316156116d05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610447565b5f806116df8460400151612f38565b9150915081871461174c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610447565b9695505050505050565b5f8181525f805160206146108339815191526020526040812060030180545f805160206145d0833981519152916001600160401b039091169081908461179b8361437c565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061461083398151915290528390208351918201909352825491925f805160206145d083398151915292829060ff16600581111561185257611852613f09565b600581111561186357611863613f09565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614610833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561199c5761195c8160016143a1565b611967906008614241565b5081515f9083908390811061197e5761197e6143b4565b60200101906001600160f81b03191690815f1a905350600101611948565b505f5b60048110156119ff576119b38160036143a1565b6119be906008614241565b6001901c60f81b826119d18360026143c8565b815181106119e1576119e16143b4565b60200101906001600160f81b03191690815f1a90535060010161199f565b505f5b6020811015611a6157611a1681601f6143a1565b611a21906008614241565b86901c60f81b82611a338360066143c8565b81518110611a4357611a436143b4565b60200101906001600160f81b03191690815f1a905350600101611a02565b505f5b6008811015611acc57611a788160076143a1565b611a83906008614241565b6001600160401b038616901c60f81b82611a9e8360266143c8565b81518110611aae57611aae6143b4565b60200101906001600160f81b03191690815f1a905350600101611a64565b505f5b6008811015611b3757611ae38160076143a1565b611aee906008614241565b6001600160401b038516901c60f81b82611b0983602e6143c8565b81518110611b1957611b196143b4565b60200101906001600160f81b03191690815f1a905350600101611acf565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614590833981519152929190611b8890613f58565b9050118015611bba575060035f83815260038301602052604090205460ff166004811115611bb857611bb8613f09565b145b611c0f5760405162461bcd60e51b815260206004820152603360248201525f805160206145b083398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610447565b5050565b611c1b613110565b611c248261315b565b611c0f816131a1565b60408051606080820183525f8083526020830181905292820152905f805160206145d08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ca2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cc991908101906142aa565b9150915080611d305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610447565b8254825114611d935760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610447565b60208201516001600160a01b031615611e065760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610447565b509392505050565b5f808251602714611e315760405162461bcd60e51b8152600401610447906143db565b5f805b6002811015611e8057611e488160016143a1565b611e53906008614241565b61ffff16858281518110611e6957611e696143b4565b016020015160f81c901b9190911790600101611e34565b5061ffff811615611ea35760405162461bcd60e51b815260040161044790614424565b5f805b6004811015611efe57611eba8160036143a1565b611ec5906008614241565b63ffffffff1686611ed78360026143c8565b81518110611ee757611ee76143b4565b016020015160f81c901b9190911790600101611ea6565b5063ffffffff8116600214611f255760405162461bcd60e51b815260040161044790614467565b5f805b6020811015611f7a57611f3c81601f6143a1565b611f47906008614241565b87611f538360066143c8565b81518110611f6357611f636143b4565b016020015160f81c901b9190911790600101611f28565b505f86602681518110611f8f57611f8f6143b4565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611fd35760405162461bcd60e51b8152600401610447906143db565b5f805b600281101561202257611fea8160016143a1565b611ff5906008614241565b61ffff1686828151811061200b5761200b6143b4565b016020015160f81c901b9190911790600101611fd6565b5061ffff8116156120455760405162461bcd60e51b815260040161044790614424565b5f805b60048110156120a05761205c8160036143a1565b612067906008614241565b63ffffffff16876120798360026143c8565b81518110612089576120896143b4565b016020015160f81c901b9190911790600101612048565b5063ffffffff81166003146120c75760405162461bcd60e51b815260040161044790614467565b5f805b602081101561211c576120de81601f6143a1565b6120e9906008614241565b886120f58360066143c8565b81518110612105576121056143b4565b016020015160f81c901b91909117906001016120ca565b505f805b600881101561217b576121348160076143a1565b61213f906008614241565b6001600160401b0316896121548360266143c8565b81518110612164576121646143b4565b016020015160f81c901b9190911790600101612120565b505f805b60088110156121da576121938160076143a1565b61219e906008614241565b6001600160401b03168a6121b383602e6143c8565b815181106121c3576121c36143b4565b016020015160f81c901b919091179060010161217f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061459083398151915292919061223290613f58565b9050118015612264575060015f83815260038301602052604090205460ff16600481111561226257612262613f09565b145b611c0f5760405162461bcd60e51b815260206004820152603860248201525f805160206145b083398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610447565b5f8181525f8051602061461083398151915260205260408082208151610100810190925280545f805160206145d083398151915293929190829060ff16600581111561231157612311613f09565b600581111561232257612322613f09565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123aa576123aa613f09565b146124065760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610447565b60408101516001600160a01b0316336001600160a01b0316146124805760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610447565b61248d8160a00151613255565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124d1576124d1613f09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61259d8461259781611756565b5f611923565b5f85815260068501602052604090209091506125b98282613fdb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125e69085906004016140bc565b6020604051808303815f875af1158015612602573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262691906140ee565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061459083398151915281612694846133f6565b90505f6126a082610a17565b83549091506001600160401b038216108015906126ca57508260010154816001600160401b031611155b6110735760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610447565b5f61273161342c565b5f805160206145d0833981519152426001600160401b03851611801561276b57506001600160401b038416612769426202a3006143c8565b115b6127cd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610447565b856128245760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610447565b5f868152600882016020526040902054156128925760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610447565b82516030146128f95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610447565b61290285613255565b5f806129496040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613463565b5f828152600586016020526040902091935091506129678282613fdb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129949085906004016140bc565b6020604051808303815f875af11580156129b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129d491906140ee565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612a5657612a56613f09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612b1783611756565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061107360015f805160206145f083398151915255565b5f612b8661342c565b5f612b936101c2846133f6565b90505f805160206145908339815191525f612bad876117ca565b9050600281516005811115612bc457612bc4613f09565b14612c235760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610447565b5f838260a00151612c3491906144ae565b9050612c4088826118db565b5f612c4a89611756565b90505f898983604051602001612c929392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612cb386613255565b5f612cbf8b8486611923565b5f8381526004880160205260409020909150612cdb8282613fdb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d089085906004016140bc565b6020604051808303815f875af1158015612d24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d4891906140ee565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612df757612df7613f09565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061122760015f805160206145f083398151915255565b5f808251602e14612f5b5760405162461bcd60e51b8152600401610447906143db565b5f805b6002811015612faa57612f728160016143a1565b612f7d906008614241565b61ffff16858281518110612f9357612f936143b4565b016020015160f81c901b9190911790600101612f5e565b5061ffff811615612fcd5760405162461bcd60e51b815260040161044790614424565b5f805b600481101561302857612fe48160036143a1565b612fef906008614241565b63ffffffff16866130018360026143c8565b81518110613011576130116143b4565b016020015160f81c901b9190911790600101612fd0565b5063ffffffff811660041461304f5760405162461bcd60e51b815260040161044790614467565b5f805b60208110156130a45761306681601f6143a1565b613071906008614241565b8761307d8360066143c8565b8151811061308d5761308d6143b4565b016020015160f81c901b9190911790600101613052565b505f805b6008811015613103576130bc8160076143a1565b6130c7906008614241565b6001600160401b0316886130dc8360266143c8565b815181106130ec576130ec6143b4565b016020015160f81c901b91909117906001016130a8565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661315957604051631afcd79f60e31b815260040160405180910390fd5b565b613163613110565b61316c8161381b565b61319e6060820135608083013561318960c0850160a08601613da2565b61319960e0860160c087016144ce565b61383c565b50565b6131a9613110565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132355760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610447565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145d08339815191529060ff165f03613293575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132db90836143a1565b106132f7576001600160401b0384166040830152808252613316565b838260400181815161330991906144ae565b6001600160401b03169052505b5f82602001518360400151606461332d91906144e9565b6133379190614514565b600285015490915060ff90811690821611156133b25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610447565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a27827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613897565b5f805160206145f083398151915280546001190161345d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134cd5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610447565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613544576135048160016143a1565b61350f906008614241565b5081515f90839083908110613526576135266143b4565b60200101906001600160f81b03191690815f1a9053506001016134f0565b505f5b60048110156135a25761355b8160036143a1565b613566906008614241565b505f826135748360026143c8565b81518110613584576135846143b4565b60200101906001600160f81b03191690815f1a905350600101613547565b505f5b60208110156135ff57845181602081106135c1576135c16143b4565b1a60f81b826135d18360066143c8565b815181106135e1576135e16143b4565b60200101906001600160f81b03191690815f1a9053506001016135a5565b505f5b602081101561365f5784602001518160208110613621576136216143b4565b1a60f81b826136318360266143c8565b81518110613641576136416143b4565b60200101906001600160f81b03191690815f1a905350600101613602565b505f5b60088110156136d3576136768160076143a1565b613681906008614241565b60ff1685604001516001600160401b0316901c60f81b828260466136a591906143c8565b815181106136b5576136b56143b4565b60200101906001600160f81b03191690815f1a905350600101613662565b505f5b603081101561373e57846080015181815181106136f5576136f56143b4565b01602001516001600160f81b0319168261371083604e6143c8565b81518110613720576137206143b4565b60200101906001600160f81b03191690815f1a9053506001016136d6565b505f5b60088110156137b0576137558160076143a1565b613760906008614241565b60608601516001600160401b0390811691161c60f81b8261378283607e6143c8565b81518110613792576137926143b4565b60200101906001600160f81b03191690815f1a905350600101613741565b506002816040516137c19190614539565b602060405180830381855afa1580156137dc573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137ff91906140ee565b94909350915050565b60015f805160206145f083398151915255565b613823613110565b61382b6139f9565b613833613a09565b61319e81613a11565b613844613110565b5f5f80516020614590833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156138dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390191906140ee565b90506139186001600160a01b038516333086613a7d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561395c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061398091906140ee565b90508181116139e65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610447565b6139f082826143a1565b95945050505050565b613a01613110565b613159613add565b613159613110565b613a19613110565b80355f805160206145d083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a636060830160408401614554565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613ad7908590613ae5565b50505050565b613808613110565b5f613af96001600160a01b03841683613b46565b905080515f14158015613b1d575080806020019051810190613b1b9190614574565b155b156108c157604051635274afe760e01b81526001600160a01b0384166004820152602401610447565b606061122783835f845f80856001600160a01b03168486604051613b6a9190614539565b5f6040518083038185875af1925050503d805f8114613ba4576040519150601f19603f3d011682016040523d82523d5f602084013e613ba9565b606091505b509150915061174c868383606082613bc957613bc482613c10565b611227565b8151158015613be057506001600160a01b0384163b155b15613c0957604051639996b31560e01b81526001600160a01b0385166004820152602401610447565b5080611227565b805115613c205780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c4590613f58565b5f825580601f10613c54575050565b601f0160209004905f5260205f209081019061319e91905b80821115613c7f575f8155600101613c6c565b5090565b801515811461319e575f80fd5b803563ffffffff81168114613ca3575f80fd5b919050565b5f805f60608486031215613cba575f80fd5b833592506020840135613ccc81613c83565b9150613cda60408501613c90565b90509250925092565b5f60208284031215613cf3575f80fd5b5035919050565b6001600160a01b038116811461319e575f80fd5b5f80828403610100811215613d21575f80fd5b60e0811215613d2e575f80fd5b5082915060e0830135613d4081613cfa565b809150509250929050565b5f60208284031215613d5b575f80fd5b61122782613c90565b5f8060408385031215613d75575f80fd5b613d7e83613c90565b946020939093013593505050565b80356001600160401b0381168114613ca3575f80fd5b5f60208284031215613db2575f80fd5b61122782613d8c565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613df157613df1613dbb565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e1f57613e1f613dbb565b604052919050565b5f6001600160401b03821115613e3f57613e3f613dbb565b50601f01601f191660200190565b5f805f8060808587031215613e60575f80fd5b8435935060208501359250613e7760408601613d8c565b915060608501356001600160401b03811115613e91575f80fd5b8501601f81018713613ea1575f80fd5b8035613eb4613eaf82613e27565b613df7565b818152886020838501011115613ec8575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613efa575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f5157613f51613f1d565b5092915050565b600181811c90821680613f6c57607f821691505b602082108103613f8a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108c157805f5260205f20601f840160051c81016020851015613fb55750805b601f840160051c820191505b81811015613fd4575f8155600101613fc1565b5050505050565b81516001600160401b03811115613ff457613ff4613dbb565b614008816140028454613f58565b84613f90565b602080601f83116001811461403b575f84156140245750858301515b5f19600386901b1c1916600185901b178555614092565b5f85815260208120601f198616915b828110156140695788860151825594840194600190910190840161404a565b508582101561408657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140b457818101518382015260200161409c565b50505f910152565b602081525f82518060208401526140da81604085016020870161409a565b601f01601f19169190910160400192915050565b5f602082840312156140fe575f80fd5b5051919050565b5f60208083525f845461411781613f58565b806020870152604060018084165f8114614138576001811461415457614181565b60ff19851660408a0152604084151560051b8a01019550614181565b895f5260205f205f5b858110156141785781548b820186015290830190880161415d565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826141b1576141b161418f565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a2757610a27613f1d565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613ca381613c83565b5f80604083850312156142bb575f80fd5b82516001600160401b03808211156142d1575f80fd5b90840190606082870312156142e4575f80fd5b6142ec613dcf565b825181526020808401516142ff81613cfa565b82820152604084015183811115614314575f80fd5b80850194505087601f850112614328575f80fd5b83519250614338613eaf84613e27565b838152888285870101111561434b575f80fd5b61435a8483830184880161409a565b8060408401525081955061436f81880161429f565b9450505050509250929050565b5f6001600160401b0380831681810361439757614397613f1d565b6001019392505050565b81810381811115610a2757610a27613f1d565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a2757610a27613f1d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f5157613f51613f1d565b5f602082840312156144de575f80fd5b813561122781613cfa565b6001600160401b0381811683821602808216919082811461450c5761450c613f1d565b505092915050565b5f6001600160401b038084168061452d5761452d61418f565b92169190910492915050565b5f825161454a81846020870161409a565b9190910192915050565b5f60208284031215614564575f80fd5b813560ff81168114611227575f80fd5b5f60208284031215614584575f80fd5b815161122781613c8356fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 6cd44c303..dc2baffd2 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161447c38038061447c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61432f8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b506101276101223660046139e8565b610389565b005b348015610134575f80fd5b50610127610143366004613a23565b61046b565b348015610153575f80fd5b50610127610162366004613a5e565b6108ff565b348015610172575f80fd5b506101b1610181366004613a5e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613a5e565b610a5b565b3480156101ee575f80fd5b506102026101fd366004613a5e565b610ac8565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613a75565b610ade565b348015610244575f80fd5b50610127610253366004613a8e565b610e61565b348015610263575f80fd5b506101b1610272366004613acc565b611052565b348015610282575f80fd5b50610202610291366004613a5e565b61106b565b3480156102a1575f80fd5b506101276102b0366004613a5e565b61107f565b3480156102c0575f80fd5b506101276102cf366004613a23565b6110ec565b3480156102df575f80fd5b506101276102ee366004613a8e565b611107565b3480156102fe575f80fd5b5061012761030d366004613a75565b6112a7565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613a5e565b611464565b6101b1610371366004613a5e565b611533565b6101b1610384366004613b77565b61153f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611563565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206142838339815191529184156104bd576104ba8285611577565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613c09565b600481111561050057610500613c09565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146105e55760405162461bcd60e51b815260206004820152603360248201525f805160206142a38339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b6002815160048111156105fa576105fa613c09565b146106475760405162461bcd60e51b815260206004820152602a60248201525f805160206142a38339815191526044820152696e6f742061637469766560b01b60648201526084016105dc565b5f61065184611813565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069e5761069e613c09565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61077085611887565b905082606001516001600160401b03168160a001516001600160401b0316116107e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105dc565b5f83606001518260a001516107fc9190613c31565b90506108088682611998565b5f6108148785846119e0565b5f8c815260058a01602052604090209091506108308282613cd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061085d908590600401613db6565b6020604051808303815f875af1158015610879573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089d9190613de8565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206142c383398151915292919061094790613c58565b9050118015610979575060035f83815260078301602052604090205460ff16600581111561097757610977613c09565b145b6109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105dc565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613dff565b6020604051808303815f875af1158015610a32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a569190613de8565b505050565b610a6481611bfd565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614283833981519152916005600160991b019163ee5b48eb91610a1691600401613dff565b5f610ad864e8d4a5100083613e9d565b92915050565b5f805160206142c38339815191525f610af683611cd0565b90505f80610b078360400151611eb1565b915091508015610b6c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105dc565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610b9e57610b9e613c09565b6005811115610baf57610baf613c09565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c3657610c36613c09565b1480610c545750600182516005811115610c5257610c52613c09565b145b610cb35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105dc565b600382516005811115610cc857610cc8613c09565b03610cef57505f8381526006860160205260408120600491610cea919061399e565b610cf3565b5060055b6020808301515f90815260088801909152604081205581816005811115610d1c57610d1c613c09565b90816005811115610d2f57610d2f613c09565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d6357610d63613c09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e2e57610e2e613c09565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206142838339815191525f610e7984611cd0565b90505f80610e8a8360400151612052565b5091509150610e988561228d565b5f8581526004850160205260408120610eb09161399e565b5f610eba83611887565b9050816001600160401b031681608001516001600160401b03161015610ef25760405162461bcd60e51b81526004016105dc90613eb0565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f375760405162461bcd60e51b81526004016105dc90613ef2565b60015f87815260038701602052604090205460ff166004811115610f5d57610f5d613c09565b14610fc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105dc565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad86001600160401b03831664e8d4a51000613f3b565b5f61107582611887565b60a0015192915050565b6110888161228d565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614283833981519152916005600160991b019163ee5b48eb91610a1691600401613dff565b81156110fe576110fc8382611577565b505b610a5683612366565b5f805160206142838339815191525f61111f84611cd0565b90505f806111308360400151612052565b509150915061113e85611bfd565b5f85815260058501602052604081206111569161399e565b5f61116083611887565b9050816001600160401b031681608001516001600160401b031610156111985760405162461bcd60e51b81526004016105dc90613eb0565b5f8681526003808701602052604090912001546001600160401b03808416911611156111d65760405162461bcd60e51b81526004016105dc90613ef2565b60035f87815260038701602052604090205460ff1660048111156111fc576111fc613c09565b146112505760405162461bcd60e51b815260206004820152603160248201525f805160206142a38339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105dc565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142c38339815191525f6112bf83611cd0565b90505f806112d08360400151611eb1565b91509150806113325760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105dc565b5f8281526005850160205260408120805461134c90613c58565b905011801561137e575060015f83815260078601602052604090205460ff16600581111561137c5761137c613c09565b145b61139a5760405162461bcd60e51b81526004016105dc90613f52565b5f82815260058501602052604081206113b29161399e565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142c38339815191529291906114ac90613c58565b90501180156114de575060015f83815260078301602052604090205460ff1660058111156114dc576114dc613c09565b145b6114fa5760405162461bcd60e51b81526004016105dc90613f52565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613dff565b5f610ad882333461271e565b5f8061154a34612ba1565b905061155885828686612c4b565b9150505b9392505050565b61156b6130a0565b611574816130eb565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e99190810190613fb8565b915091508061164c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105dc565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561168f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b39190613de8565b8251146117175760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105dc565b60208201516001600160a01b03161561178d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105dc565b5f8061179c846040015161312e565b915091508187146118095760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105dc565b9695505050505050565b5f8181525f805160206143038339815191526020526040812060030180545f805160206142c3833981519152916001600160401b03909116908190846118588361408a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061430383398151915290528390208351918201909352825491925f805160206142c383398151915292829060ff16600581111561190f5761190f613c09565b600581111561192057611920613c09565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614303833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5957611a198160016140af565b611a24906008613f3b565b5081515f90839083908110611a3b57611a3b6140c2565b60200101906001600160f81b03191690815f1a905350600101611a05565b505f5b6004811015611abc57611a708160036140af565b611a7b906008613f3b565b6001901c60f81b82611a8e8360026140d6565b81518110611a9e57611a9e6140c2565b60200101906001600160f81b03191690815f1a905350600101611a5c565b505f5b6020811015611b1e57611ad381601f6140af565b611ade906008613f3b565b86901c60f81b82611af08360066140d6565b81518110611b0057611b006140c2565b60200101906001600160f81b03191690815f1a905350600101611abf565b505f5b6008811015611b8957611b358160076140af565b611b40906008613f3b565b6001600160401b038616901c60f81b82611b5b8360266140d6565b81518110611b6b57611b6b6140c2565b60200101906001600160f81b03191690815f1a905350600101611b21565b505f5b6008811015611bf457611ba08160076140af565b611bab906008613f3b565b6001600160401b038516901c60f81b82611bc683602e6140d6565b81518110611bd657611bd66140c2565b60200101906001600160f81b03191690815f1a905350600101611b8c565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614283833981519152929190611c4590613c58565b9050118015611c77575060035f83815260038301602052604090205460ff166004811115611c7557611c75613c09565b145b611ccc5760405162461bcd60e51b815260206004820152603360248201525f805160206142a383398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105dc565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206142c38339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d45573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d6c9190810190613fb8565b9150915080611dd35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105dc565b8254825114611e365760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105dc565b60208201516001600160a01b031615611ea95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105dc565b509392505050565b5f808251602714611ed45760405162461bcd60e51b81526004016105dc906140e9565b5f805b6002811015611f2357611eeb8160016140af565b611ef6906008613f3b565b61ffff16858281518110611f0c57611f0c6140c2565b016020015160f81c901b9190911790600101611ed7565b5061ffff811615611f465760405162461bcd60e51b81526004016105dc90614132565b5f805b6004811015611fa157611f5d8160036140af565b611f68906008613f3b565b63ffffffff1686611f7a8360026140d6565b81518110611f8a57611f8a6140c2565b016020015160f81c901b9190911790600101611f49565b5063ffffffff8116600214611fc85760405162461bcd60e51b81526004016105dc90614175565b5f805b602081101561201d57611fdf81601f6140af565b611fea906008613f3b565b87611ff68360066140d6565b81518110612006576120066140c2565b016020015160f81c901b9190911790600101611fcb565b505f86602681518110612032576120326140c2565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120765760405162461bcd60e51b81526004016105dc906140e9565b5f805b60028110156120c55761208d8160016140af565b612098906008613f3b565b61ffff168682815181106120ae576120ae6140c2565b016020015160f81c901b9190911790600101612079565b5061ffff8116156120e85760405162461bcd60e51b81526004016105dc90614132565b5f805b6004811015612143576120ff8160036140af565b61210a906008613f3b565b63ffffffff168761211c8360026140d6565b8151811061212c5761212c6140c2565b016020015160f81c901b91909117906001016120eb565b5063ffffffff811660031461216a5760405162461bcd60e51b81526004016105dc90614175565b5f805b60208110156121bf5761218181601f6140af565b61218c906008613f3b565b886121988360066140d6565b815181106121a8576121a86140c2565b016020015160f81c901b919091179060010161216d565b505f805b600881101561221e576121d78160076140af565b6121e2906008613f3b565b6001600160401b0316896121f78360266140d6565b81518110612207576122076140c2565b016020015160f81c901b91909117906001016121c3565b505f805b600881101561227d576122368160076140af565b612241906008613f3b565b6001600160401b03168a61225683602e6140d6565b81518110612266576122666140c2565b016020015160f81c901b9190911790600101612222565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206142838339815191529291906122d590613c58565b9050118015612307575060015f83815260038301602052604090205460ff16600481111561230557612305613c09565b145b611ccc5760405162461bcd60e51b815260206004820152603860248201525f805160206142a383398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105dc565b5f8181525f8051602061430383398151915260205260408082208151610100810190925280545f805160206142c383398151915293929190829060ff1660058111156123b4576123b4613c09565b60058111156123c5576123c5613c09565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561244d5761244d613c09565b146124a95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105dc565b60408101516001600160a01b0316336001600160a01b0316146125235760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105dc565b6125308160a00151613306565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561257457612574613c09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126408461263a81611813565b5f6119e0565b5f858152600685016020526040902090915061265c8282613cd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612689908590600401613db6565b6020604051808303815f875af11580156126a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c99190613de8565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6127276134a7565b5f61273183610ac8565b90505f805160206142838339815191525f61274b87611887565b905060028151600581111561276257612762613c09565b146127c15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105dc565b5f838260a001516127d291906141bc565b90506127de8882611998565b5f6127e889611813565b90505f60028a8a846040516020016128329392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60408051601f198184030181529082905261284c916141dc565b602060405180830381855afa158015612867573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061288a9190613de8565b5f8181526003870160205260409020600201549091506001600160401b0316156129135760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e496044820152731108185b1c9958591e481c9959da5cdd195c995960621b60648201526084016105dc565b61291c86613306565b5f6129288b84866119e0565b5f83815260048801602052604090209091506129448282613cd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612971908590600401613db6565b6020604051808303815f875af115801561298d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129b19190613de8565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a6057612a60613c09565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061155c60015f805160206142e383398151915255565b5f5f805160206142838339815191528282612bbb82610ac8565b83549091506001600160401b03821610801590612be557508260010154816001600160401b031611155b612c435760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105dc565b949350505050565b5f612c546134a7565b5f805160206142c3833981519152426001600160401b038516118015612c8e57506001600160401b038416612c8c426202a3006140d6565b115b612cf05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105dc565b85612d475760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105dc565b5f86815260088201602052604090205415612db55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105dc565b8251603014612e1c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105dc565b612e2585613306565b5f80612e6c6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134f1565b5f82815260058601602052604090209193509150612e8a8282613cd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612eb7908590600401613db6565b6020604051808303815f875af1158015612ed3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ef79190613de8565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612f7957612f79613c09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561303a83611813565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c4360015f805160206142e383398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130e957604051631afcd79f60e31b815260040160405180910390fd5b565b6130f36130a0565b6130fc81613896565b6115746060820135608083013561311960c0850160a08601613acc565b61312960e0860160c087016141f7565b6138b7565b5f808251602e146131515760405162461bcd60e51b81526004016105dc906140e9565b5f805b60028110156131a0576131688160016140af565b613173906008613f3b565b61ffff16858281518110613189576131896140c2565b016020015160f81c901b9190911790600101613154565b5061ffff8116156131c35760405162461bcd60e51b81526004016105dc90614132565b5f805b600481101561321e576131da8160036140af565b6131e5906008613f3b565b63ffffffff16866131f78360026140d6565b81518110613207576132076140c2565b016020015160f81c901b91909117906001016131c6565b5063ffffffff81166004146132455760405162461bcd60e51b81526004016105dc90614175565b5f805b602081101561329a5761325c81601f6140af565b613267906008613f3b565b876132738360066140d6565b81518110613283576132836140c2565b016020015160f81c901b9190911790600101613248565b505f805b60088110156132f9576132b28160076140af565b6132bd906008613f3b565b6001600160401b0316886132d28360266140d6565b815181106132e2576132e26140c2565b016020015160f81c901b919091179060010161329e565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142c38339815191529060ff165f03613344575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061338c90836140af565b106133a8576001600160401b03841660408301528082526133c7565b83826040018181516133ba91906141bc565b6001600160401b03169052505b5f8260200151836040015160646133de9190614212565b6133e8919061423d565b600285015490915060ff90811690821611156134635760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105dc565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206142e38339815191528054600119016134d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206142e383398151915255565b5f606082608001515160301461355b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105dc565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135d2576135928160016140af565b61359d906008613f3b565b5081515f908390839081106135b4576135b46140c2565b60200101906001600160f81b03191690815f1a90535060010161357e565b505f5b6004811015613630576135e98160036140af565b6135f4906008613f3b565b505f826136028360026140d6565b81518110613612576136126140c2565b60200101906001600160f81b03191690815f1a9053506001016135d5565b505f5b602081101561368d578451816020811061364f5761364f6140c2565b1a60f81b8261365f8360066140d6565b8151811061366f5761366f6140c2565b60200101906001600160f81b03191690815f1a905350600101613633565b505f5b60208110156136ed57846020015181602081106136af576136af6140c2565b1a60f81b826136bf8360266140d6565b815181106136cf576136cf6140c2565b60200101906001600160f81b03191690815f1a905350600101613690565b505f5b6008811015613761576137048160076140af565b61370f906008613f3b565b60ff1685604001516001600160401b0316901c60f81b8282604661373391906140d6565b81518110613743576137436140c2565b60200101906001600160f81b03191690815f1a9053506001016136f0565b505f5b60308110156137cc5784608001518181518110613783576137836140c2565b01602001516001600160f81b0319168261379e83604e6140d6565b815181106137ae576137ae6140c2565b60200101906001600160f81b03191690815f1a905350600101613764565b505f5b600881101561383e576137e38160076140af565b6137ee906008613f3b565b60608601516001600160401b0390811691161c60f81b8261381083607e6140d6565b81518110613820576138206140c2565b60200101906001600160f81b03191690815f1a9053506001016137cf565b5060028160405161384f91906141dc565b602060405180830381855afa15801561386a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061388d9190613de8565b94909350915050565b61389e6130a0565b6138a6613912565b6138ae613922565b6115748161392a565b6138bf6130a0565b5f5f80516020614283833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61391a6130a0565b6130e9613996565b6130e96130a0565b6139326130a0565b80355f805160206142c383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561397c6060830160408401614262565b600291909101805460ff191660ff90921691909117905550565b6134de6130a0565b5080546139aa90613c58565b5f825580601f106139b9575050565b601f0160209004905f5260205f209081019061157491905b808211156139e4575f81556001016139d1565b5090565b5f60e082840312156139f8575f80fd5b50919050565b8015158114611574575f80fd5b803563ffffffff81168114613a1e575f80fd5b919050565b5f805f60608486031215613a35575f80fd5b833592506020840135613a47816139fe565b9150613a5560408501613a0b565b90509250925092565b5f60208284031215613a6e575f80fd5b5035919050565b5f60208284031215613a85575f80fd5b61155c82613a0b565b5f8060408385031215613a9f575f80fd5b613aa883613a0b565b946020939093013593505050565b80356001600160401b0381168114613a1e575f80fd5b5f60208284031215613adc575f80fd5b61155c82613ab6565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b1b57613b1b613ae5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b4957613b49613ae5565b604052919050565b5f6001600160401b03821115613b6957613b69613ae5565b50601f01601f191660200190565b5f805f60608486031215613b89575f80fd5b83359250613b9960208501613ab6565b915060408401356001600160401b03811115613bb3575f80fd5b8401601f81018613613bc3575f80fd5b8035613bd6613bd182613b51565b613b21565b818152876020838501011115613bea575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613c5157613c51613c1d565b5092915050565b600181811c90821680613c6c57607f821691505b6020821081036139f857634e487b7160e01b5f52602260045260245ffd5b601f821115610a5657805f5260205f20601f840160051c81016020851015613caf5750805b601f840160051c820191505b81811015613cce575f8155600101613cbb565b5050505050565b81516001600160401b03811115613cee57613cee613ae5565b613d0281613cfc8454613c58565b84613c8a565b602080601f831160018114613d35575f8415613d1e5750858301515b5f19600386901b1c1916600185901b178555613d8c565b5f85815260208120601f198616915b82811015613d6357888601518255948401946001909101908401613d44565b5085821015613d8057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613dae578181015183820152602001613d96565b50505f910152565b602081525f8251806020840152613dd4816040850160208701613d94565b601f01601f19169190910160400192915050565b5f60208284031215613df8575f80fd5b5051919050565b5f60208083525f8454613e1181613c58565b806020870152604060018084165f8114613e325760018114613e4e57613e7b565b60ff19851660408a0152604084151560051b8a01019550613e7b565b895f5260205f205f5b85811015613e725781548b8201860152908301908801613e57565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613eab57613eab613e89565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad857610ad8613c1d565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611574575f80fd5b8051613a1e816139fe565b5f8060408385031215613fc9575f80fd5b82516001600160401b0380821115613fdf575f80fd5b9084019060608287031215613ff2575f80fd5b613ffa613af9565b8251815260208084015161400d81613f99565b82820152604084015183811115614022575f80fd5b80850194505087601f850112614036575f80fd5b83519250614046613bd184613b51565b8381528882858701011115614059575f80fd5b61406884838301848801613d94565b8060408401525081955061407d818801613fad565b9450505050509250929050565b5f6001600160401b038083168181036140a5576140a5613c1d565b6001019392505050565b81810381811115610ad857610ad8613c1d565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad857610ad8613c1d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613c5157613c51613c1d565b5f82516141ed818460208701613d94565b9190910192915050565b5f60208284031215614207575f80fd5b813561155c81613f99565b6001600160401b0381811683821602808216919082811461423557614235613c1d565b505092915050565b5f6001600160401b038084168061425657614256613e89565b92169190910492915050565b5f60208284031215614272575f80fd5b813560ff8116811461155c575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516143b13803806143b183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142648061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b5061012761012236600461391d565b610389565b005b348015610134575f80fd5b50610127610143366004613958565b61046b565b348015610153575f80fd5b50610127610162366004613993565b6108ff565b348015610172575f80fd5b506101b1610181366004613993565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613993565b610a5b565b3480156101ee575f80fd5b506102026101fd366004613993565b610ac8565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b506101276102343660046139aa565b610ade565b348015610244575f80fd5b506101276102533660046139c3565b610e61565b348015610263575f80fd5b506101b1610272366004613a01565b611052565b348015610282575f80fd5b50610202610291366004613993565b61106b565b3480156102a1575f80fd5b506101276102b0366004613993565b61107f565b3480156102c0575f80fd5b506101276102cf366004613958565b6110ec565b3480156102df575f80fd5b506101276102ee3660046139c3565b611107565b3480156102fe575f80fd5b5061012761030d3660046139aa565b6112a7565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613993565b611464565b6101b1610371366004613993565b611533565b6101b1610384366004613aac565b61153f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611563565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206141b88339815191529184156104bd576104ba8285611577565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b3e565b600481111561050057610500613b3e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146105e55760405162461bcd60e51b815260206004820152603360248201525f805160206141d88339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b6002815160048111156105fa576105fa613b3e565b146106475760405162461bcd60e51b815260206004820152602a60248201525f805160206141d88339815191526044820152696e6f742061637469766560b01b60648201526084016105dc565b5f61065184611813565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069e5761069e613b3e565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61077085611887565b905082606001516001600160401b03168160a001516001600160401b0316116107e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105dc565b5f83606001518260a001516107fc9190613b66565b90506108088682611998565b5f6108148785846119e0565b5f8c815260058a01602052604090209091506108308282613c0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061085d908590600401613ceb565b6020604051808303815f875af1158015610879573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089d9190613d1d565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206141f883398151915292919061094790613b8d565b9050118015610979575060035f83815260078301602052604090205460ff16600581111561097757610977613b3e565b145b6109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105dc565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613d34565b6020604051808303815f875af1158015610a32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a569190613d1d565b505050565b610a6481611bfd565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206141b8833981519152916005600160991b019163ee5b48eb91610a1691600401613d34565b5f610ad864e8d4a5100083613dd2565b92915050565b5f805160206141f88339815191525f610af683611cd0565b90505f80610b078360400151611eb1565b915091508015610b6c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105dc565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610b9e57610b9e613b3e565b6005811115610baf57610baf613b3e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c3657610c36613b3e565b1480610c545750600182516005811115610c5257610c52613b3e565b145b610cb35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105dc565b600382516005811115610cc857610cc8613b3e565b03610cef57505f8381526006860160205260408120600491610cea91906138d3565b610cf3565b5060055b6020808301515f90815260088801909152604081205581816005811115610d1c57610d1c613b3e565b90816005811115610d2f57610d2f613b3e565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d6357610d63613b3e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e2e57610e2e613b3e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206141b88339815191525f610e7984611cd0565b90505f80610e8a8360400151612052565b5091509150610e988561228d565b5f8581526004850160205260408120610eb0916138d3565b5f610eba83611887565b9050816001600160401b031681608001516001600160401b03161015610ef25760405162461bcd60e51b81526004016105dc90613de5565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f375760405162461bcd60e51b81526004016105dc90613e27565b60015f87815260038701602052604090205460ff166004811115610f5d57610f5d613b3e565b14610fc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105dc565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad86001600160401b03831664e8d4a51000613e70565b5f61107582611887565b60a0015192915050565b6110888161228d565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206141b8833981519152916005600160991b019163ee5b48eb91610a1691600401613d34565b81156110fe576110fc8382611577565b505b610a5683612366565b5f805160206141b88339815191525f61111f84611cd0565b90505f806111308360400151612052565b509150915061113e85611bfd565b5f8581526005850160205260408120611156916138d3565b5f61116083611887565b9050816001600160401b031681608001516001600160401b031610156111985760405162461bcd60e51b81526004016105dc90613de5565b5f8681526003808701602052604090912001546001600160401b03808416911611156111d65760405162461bcd60e51b81526004016105dc90613e27565b60035f87815260038701602052604090205460ff1660048111156111fc576111fc613b3e565b146112505760405162461bcd60e51b815260206004820152603160248201525f805160206141d88339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105dc565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206141f88339815191525f6112bf83611cd0565b90505f806112d08360400151611eb1565b91509150806113325760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105dc565b5f8281526005850160205260408120805461134c90613b8d565b905011801561137e575060015f83815260078601602052604090205460ff16600581111561137c5761137c613b3e565b145b61139a5760405162461bcd60e51b81526004016105dc90613e87565b5f82815260058501602052604081206113b2916138d3565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206141f88339815191529291906114ac90613b8d565b90501180156114de575060015f83815260078301602052604090205460ff1660058111156114dc576114dc613b3e565b145b6114fa5760405162461bcd60e51b81526004016105dc90613e87565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613d34565b5f610ad882333461271e565b5f8061154a34612ad6565b905061155885828686612b80565b9150505b9392505050565b61156b612fd5565b61157481613020565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e99190810190613eed565b915091508061164c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105dc565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561168f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b39190613d1d565b8251146117175760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105dc565b60208201516001600160a01b03161561178d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105dc565b5f8061179c8460400151613063565b915091508187146118095760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105dc565b9695505050505050565b5f8181525f805160206142388339815191526020526040812060030180545f805160206141f8833981519152916001600160401b039091169081908461185883613fbf565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061423883398151915290528390208351918201909352825491925f805160206141f883398151915292829060ff16600581111561190f5761190f613b3e565b600581111561192057611920613b3e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614238833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5957611a19816001613fe4565b611a24906008613e70565b5081515f90839083908110611a3b57611a3b613ff7565b60200101906001600160f81b03191690815f1a905350600101611a05565b505f5b6004811015611abc57611a70816003613fe4565b611a7b906008613e70565b6001901c60f81b82611a8e83600261400b565b81518110611a9e57611a9e613ff7565b60200101906001600160f81b03191690815f1a905350600101611a5c565b505f5b6020811015611b1e57611ad381601f613fe4565b611ade906008613e70565b86901c60f81b82611af083600661400b565b81518110611b0057611b00613ff7565b60200101906001600160f81b03191690815f1a905350600101611abf565b505f5b6008811015611b8957611b35816007613fe4565b611b40906008613e70565b6001600160401b038616901c60f81b82611b5b83602661400b565b81518110611b6b57611b6b613ff7565b60200101906001600160f81b03191690815f1a905350600101611b21565b505f5b6008811015611bf457611ba0816007613fe4565b611bab906008613e70565b6001600160401b038516901c60f81b82611bc683602e61400b565b81518110611bd657611bd6613ff7565b60200101906001600160f81b03191690815f1a905350600101611b8c565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206141b8833981519152929190611c4590613b8d565b9050118015611c77575060035f83815260038301602052604090205460ff166004811115611c7557611c75613b3e565b145b611ccc5760405162461bcd60e51b815260206004820152603360248201525f805160206141d883398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105dc565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206141f88339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d45573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d6c9190810190613eed565b9150915080611dd35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105dc565b8254825114611e365760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105dc565b60208201516001600160a01b031615611ea95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105dc565b509392505050565b5f808251602714611ed45760405162461bcd60e51b81526004016105dc9061401e565b5f805b6002811015611f2357611eeb816001613fe4565b611ef6906008613e70565b61ffff16858281518110611f0c57611f0c613ff7565b016020015160f81c901b9190911790600101611ed7565b5061ffff811615611f465760405162461bcd60e51b81526004016105dc90614067565b5f805b6004811015611fa157611f5d816003613fe4565b611f68906008613e70565b63ffffffff1686611f7a83600261400b565b81518110611f8a57611f8a613ff7565b016020015160f81c901b9190911790600101611f49565b5063ffffffff8116600214611fc85760405162461bcd60e51b81526004016105dc906140aa565b5f805b602081101561201d57611fdf81601f613fe4565b611fea906008613e70565b87611ff683600661400b565b8151811061200657612006613ff7565b016020015160f81c901b9190911790600101611fcb565b505f8660268151811061203257612032613ff7565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120765760405162461bcd60e51b81526004016105dc9061401e565b5f805b60028110156120c55761208d816001613fe4565b612098906008613e70565b61ffff168682815181106120ae576120ae613ff7565b016020015160f81c901b9190911790600101612079565b5061ffff8116156120e85760405162461bcd60e51b81526004016105dc90614067565b5f805b6004811015612143576120ff816003613fe4565b61210a906008613e70565b63ffffffff168761211c83600261400b565b8151811061212c5761212c613ff7565b016020015160f81c901b91909117906001016120eb565b5063ffffffff811660031461216a5760405162461bcd60e51b81526004016105dc906140aa565b5f805b60208110156121bf5761218181601f613fe4565b61218c906008613e70565b8861219883600661400b565b815181106121a8576121a8613ff7565b016020015160f81c901b919091179060010161216d565b505f805b600881101561221e576121d7816007613fe4565b6121e2906008613e70565b6001600160401b0316896121f783602661400b565b8151811061220757612207613ff7565b016020015160f81c901b91909117906001016121c3565b505f805b600881101561227d57612236816007613fe4565b612241906008613e70565b6001600160401b03168a61225683602e61400b565b8151811061226657612266613ff7565b016020015160f81c901b9190911790600101612222565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206141b88339815191529291906122d590613b8d565b9050118015612307575060015f83815260038301602052604090205460ff16600481111561230557612305613b3e565b145b611ccc5760405162461bcd60e51b815260206004820152603860248201525f805160206141d883398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105dc565b5f8181525f8051602061423883398151915260205260408082208151610100810190925280545f805160206141f883398151915293929190829060ff1660058111156123b4576123b4613b3e565b60058111156123c5576123c5613b3e565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561244d5761244d613b3e565b146124a95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105dc565b60408101516001600160a01b0316336001600160a01b0316146125235760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105dc565b6125308160a0015161323b565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561257457612574613b3e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126408461263a81611813565b5f6119e0565b5f858152600685016020526040902090915061265c8282613c0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612689908590600401613ceb565b6020604051808303815f875af11580156126a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c99190613d1d565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6127276133dc565b5f61273183610ac8565b90505f805160206141b88339815191525f61274b87611887565b905060028151600581111561276257612762613b3e565b146127c15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105dc565b5f838260a001516127d291906140f1565b90506127de8882611998565b5f6127e889611813565b90505f8989836040516020016128309392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090506128518661323b565b5f61285d8b84866119e0565b5f83815260048801602052604090209091506128798282613c0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128a6908590600401613ceb565b6020604051808303815f875af11580156128c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128e69190613d1d565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561299557612995613b3e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061155c60015f8051602061421883398151915255565b5f5f805160206141b88339815191528282612af082610ac8565b83549091506001600160401b03821610801590612b1a57508260010154816001600160401b031611155b612b785760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105dc565b949350505050565b5f612b896133dc565b5f805160206141f8833981519152426001600160401b038516118015612bc357506001600160401b038416612bc1426202a30061400b565b115b612c255760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105dc565b85612c7c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105dc565b5f86815260088201602052604090205415612cea5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105dc565b8251603014612d515760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105dc565b612d5a8561323b565b5f80612da16040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613426565b5f82815260058601602052604090209193509150612dbf8282613c0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612dec908590600401613ceb565b6020604051808303815f875af1158015612e08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e2c9190613d1d565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612eae57612eae613b3e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612f6f83611813565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b7860015f8051602061421883398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661301e57604051631afcd79f60e31b815260040160405180910390fd5b565b613028612fd5565b613031816137cb565b6115746060820135608083013561304e60c0850160a08601613a01565b61305e60e0860160c08701614111565b6137ec565b5f808251602e146130865760405162461bcd60e51b81526004016105dc9061401e565b5f805b60028110156130d55761309d816001613fe4565b6130a8906008613e70565b61ffff168582815181106130be576130be613ff7565b016020015160f81c901b9190911790600101613089565b5061ffff8116156130f85760405162461bcd60e51b81526004016105dc90614067565b5f805b60048110156131535761310f816003613fe4565b61311a906008613e70565b63ffffffff168661312c83600261400b565b8151811061313c5761313c613ff7565b016020015160f81c901b91909117906001016130fb565b5063ffffffff811660041461317a5760405162461bcd60e51b81526004016105dc906140aa565b5f805b60208110156131cf5761319181601f613fe4565b61319c906008613e70565b876131a883600661400b565b815181106131b8576131b8613ff7565b016020015160f81c901b919091179060010161317d565b505f805b600881101561322e576131e7816007613fe4565b6131f2906008613e70565b6001600160401b03168861320783602661400b565b8151811061321757613217613ff7565b016020015160f81c901b91909117906001016131d3565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206141f88339815191529060ff165f03613279575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132c19083613fe4565b106132dd576001600160401b03841660408301528082526132fc565b83826040018181516132ef91906140f1565b6001600160401b03169052505b5f826020015183604001516064613313919061412c565b61331d9190614157565b600285015490915060ff90811690821611156133985760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105dc565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061421883398151915280546001190161340d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061421883398151915255565b5f60608260800151516030146134905760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105dc565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613507576134c7816001613fe4565b6134d2906008613e70565b5081515f908390839081106134e9576134e9613ff7565b60200101906001600160f81b03191690815f1a9053506001016134b3565b505f5b60048110156135655761351e816003613fe4565b613529906008613e70565b505f8261353783600261400b565b8151811061354757613547613ff7565b60200101906001600160f81b03191690815f1a90535060010161350a565b505f5b60208110156135c2578451816020811061358457613584613ff7565b1a60f81b8261359483600661400b565b815181106135a4576135a4613ff7565b60200101906001600160f81b03191690815f1a905350600101613568565b505f5b602081101561362257846020015181602081106135e4576135e4613ff7565b1a60f81b826135f483602661400b565b8151811061360457613604613ff7565b60200101906001600160f81b03191690815f1a9053506001016135c5565b505f5b600881101561369657613639816007613fe4565b613644906008613e70565b60ff1685604001516001600160401b0316901c60f81b82826046613668919061400b565b8151811061367857613678613ff7565b60200101906001600160f81b03191690815f1a905350600101613625565b505f5b603081101561370157846080015181815181106136b8576136b8613ff7565b01602001516001600160f81b031916826136d383604e61400b565b815181106136e3576136e3613ff7565b60200101906001600160f81b03191690815f1a905350600101613699565b505f5b600881101561377357613718816007613fe4565b613723906008613e70565b60608601516001600160401b0390811691161c60f81b8261374583607e61400b565b8151811061375557613755613ff7565b60200101906001600160f81b03191690815f1a905350600101613704565b50600281604051613784919061417c565b602060405180830381855afa15801561379f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137c29190613d1d565b94909350915050565b6137d3612fd5565b6137db613847565b6137e3613857565b6115748161385f565b6137f4612fd5565b5f5f805160206141b8833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61384f612fd5565b61301e6138cb565b61301e612fd5565b613867612fd5565b80355f805160206141f883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138b16060830160408401614197565b600291909101805460ff191660ff90921691909117905550565b613413612fd5565b5080546138df90613b8d565b5f825580601f106138ee575050565b601f0160209004905f5260205f209081019061157491905b80821115613919575f8155600101613906565b5090565b5f60e0828403121561392d575f80fd5b50919050565b8015158114611574575f80fd5b803563ffffffff81168114613953575f80fd5b919050565b5f805f6060848603121561396a575f80fd5b83359250602084013561397c81613933565b915061398a60408501613940565b90509250925092565b5f602082840312156139a3575f80fd5b5035919050565b5f602082840312156139ba575f80fd5b61155c82613940565b5f80604083850312156139d4575f80fd5b6139dd83613940565b946020939093013593505050565b80356001600160401b0381168114613953575f80fd5b5f60208284031215613a11575f80fd5b61155c826139eb565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a5057613a50613a1a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613a7e57613a7e613a1a565b604052919050565b5f6001600160401b03821115613a9e57613a9e613a1a565b50601f01601f191660200190565b5f805f60608486031215613abe575f80fd5b83359250613ace602085016139eb565b915060408401356001600160401b03811115613ae8575f80fd5b8401601f81018613613af8575f80fd5b8035613b0b613b0682613a86565b613a56565b818152876020838501011115613b1f575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613b8657613b86613b52565b5092915050565b600181811c90821680613ba157607f821691505b60208210810361392d57634e487b7160e01b5f52602260045260245ffd5b601f821115610a5657805f5260205f20601f840160051c81016020851015613be45750805b601f840160051c820191505b81811015613c03575f8155600101613bf0565b5050505050565b81516001600160401b03811115613c2357613c23613a1a565b613c3781613c318454613b8d565b84613bbf565b602080601f831160018114613c6a575f8415613c535750858301515b5f19600386901b1c1916600185901b178555613cc1565b5f85815260208120601f198616915b82811015613c9857888601518255948401946001909101908401613c79565b5085821015613cb557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613ce3578181015183820152602001613ccb565b50505f910152565b602081525f8251806020840152613d09816040850160208701613cc9565b601f01601f19169190910160400192915050565b5f60208284031215613d2d575f80fd5b5051919050565b5f60208083525f8454613d4681613b8d565b806020870152604060018084165f8114613d675760018114613d8357613db0565b60ff19851660408a0152604084151560051b8a01019550613db0565b895f5260205f205f5b85811015613da75781548b8201860152908301908801613d8c565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613de057613de0613dbe565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad857610ad8613b52565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611574575f80fd5b805161395381613933565b5f8060408385031215613efe575f80fd5b82516001600160401b0380821115613f14575f80fd5b9084019060608287031215613f27575f80fd5b613f2f613a2e565b82518152602080840151613f4281613ece565b82820152604084015183811115613f57575f80fd5b80850194505087601f850112613f6b575f80fd5b83519250613f7b613b0684613a86565b8381528882858701011115613f8e575f80fd5b613f9d84838301848801613cc9565b80604084015250819550613fb2818801613ee2565b9450505050509250929050565b5f6001600160401b03808316818103613fda57613fda613b52565b6001019392505050565b81810381811115610ad857610ad8613b52565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad857610ad8613b52565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613b8657613b86613b52565b5f60208284031215614121575f80fd5b813561155c81613ece565b6001600160401b0381811683821602808216919082811461414f5761414f613b52565b505092915050565b5f6001600160401b038084168061417057614170613dbe565b92169190910492915050565b5f825161418d818460208701613cc9565b9190910192915050565b5f602082840312156141a7575f80fd5b813560ff8116811461155c575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 50ade4f1d..1b737ea7e 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -160,14 +160,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 newValidatorWeight = validator.weight + weight; _setValidatorWeight(validationID, newValidatorWeight); + // Construct the delegation ID. This is guaranteed to be unique since it is + // constructed using a new nonce. uint64 nonce = _getAndIncrementNonce(validationID); - bytes32 delegationID = sha256(abi.encodePacked(validationID, delegatorAddress, nonce)); - - // Ensure the delegationID is not already registered - require( - $._delegatorStakes[delegationID].weight == 0, - "PoSValidatorManager: delegationID already registered" - ); + bytes32 delegationID = keccak256(abi.encodePacked(validationID, delegatorAddress, nonce)); _checkAndUpdateChurnTracker(weight); diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 1fe85d75c..6dedd8b98 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -596,7 +596,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorAdded({ - delegationID: sha256(abi.encodePacked(validationID, delegatorAddress, expectedNonce)), + delegationID: keccak256(abi.encodePacked(validationID, delegatorAddress, expectedNonce)), validationID: validationID, delegatorAddress: delegatorAddress, nonce: expectedNonce, From de9845fcce64a4585c2a142fceabd1afffe15e46 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 5 Sep 2024 16:05:43 -0500 Subject: [PATCH 206/545] expand delegation comments --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 39 +++++++++++++++---- .../interfaces/IPoSValidatorManager.sol | 14 +++++-- 4 files changed, 45 insertions(+), 12 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index d57c7ca9f..5fac034af 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161478938038061478983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61463c8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613ca8565b6102d6565b005b610128610138366004613ce3565b61076a565b61017b61014b366004613ce3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613ce3565b6108c6565b6101286101af366004613d0e565b610933565b6101c76101c2366004613ce3565b610a17565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d4b565b610a2d565b610128610200366004613d64565b610db0565b61017b610213366004613da2565b610fa1565b6101c7610226366004613ce3565b610fba565b610128610239366004613ce3565b610fce565b61012861024c366004613ca8565b61103b565b61017b61025f366004613e4d565b611056565b610128610272366004613d64565b61107b565b61017b610285366004613ee9565b61121b565b610128610298366004613d4b565b61122e565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613ce3565b6113eb565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145908339815191529184156103285761032582856114ba565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613f09565b600481111561036b5761036b613f09565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146104505760405162461bcd60e51b815260206004820152603360248201525f805160206145b08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b60028151600481111561046557610465613f09565b146104b25760405162461bcd60e51b815260206004820152602a60248201525f805160206145b08339815191526044820152696e6f742061637469766560b01b6064820152608401610447565b5f6104bc84611756565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050957610509613f09565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105db856117ca565b905082606001516001600160401b03168160a001516001600160401b0316116106525760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610447565b5f83606001518260a001516106679190613f31565b905061067386826118db565b5f61067f878584611923565b5f8c815260058a016020526040902090915061069b8282613fdb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106c89085906004016140bc565b6020604051808303815f875af11580156106e4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070891906140ee565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145d08339815191529291906107b290613f58565b90501180156107e4575060035f83815260078301602052604090205460ff1660058111156107e2576107e2613f09565b145b6108485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610447565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108819190600401614105565b6020604051808303815f875af115801561089d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c191906140ee565b505050565b6108cf81611b40565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614590833981519152916005600160991b019163ee5b48eb9161088191600401614105565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061097c575080546001600160401b03808416911610155b1561099a5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109c58484611c13565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a2764e8d4a51000836141a3565b92915050565b5f805160206145d08339815191525f610a4583611c2d565b90505f80610a568360400151611e0e565b915091508015610abb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610447565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610aed57610aed613f09565b6005811115610afe57610afe613f09565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b8557610b85613f09565b1480610ba35750600182516005811115610ba157610ba1613f09565b145b610c025760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610447565b600382516005811115610c1757610c17613f09565b03610c3e57505f8381526006860160205260408120600491610c399190613c39565b610c42565b5060055b6020808301515f90815260088801909152604081205581816005811115610c6b57610c6b613f09565b90816005811115610c7e57610c7e613f09565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610cb257610cb2613f09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d7d57610d7d613f09565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145908339815191525f610dc884611c2d565b90505f80610dd98360400151611faf565b5091509150610de7856121ea565b5f8581526004850160205260408120610dff91613c39565b5f610e09836117ca565b9050816001600160401b031681608001516001600160401b03161015610e415760405162461bcd60e51b8152600401610447906141b6565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e865760405162461bcd60e51b8152600401610447906141f8565b60015f87815260038701602052604090205460ff166004811115610eac57610eac613f09565b14610f155760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610447565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a276001600160401b03831664e8d4a51000614241565b5f610fc4826117ca565b60a0015192915050565b610fd7816121ea565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614590833981519152916005600160991b019163ee5b48eb9161088191600401614105565b811561104d5761104b83826114ba565b505b6108c1836122c3565b5f806110618661267b565b905061106f85828686612728565b9150505b949350505050565b5f805160206145908339815191525f61109384611c2d565b90505f806110a48360400151611faf565b50915091506110b285611b40565b5f85815260058501602052604081206110ca91613c39565b5f6110d4836117ca565b9050816001600160401b031681608001516001600160401b0316101561110c5760405162461bcd60e51b8152600401610447906141b6565b5f8681526003808701602052604090912001546001600160401b038084169116111561114a5760405162461bcd60e51b8152600401610447906141f8565b60035f87815260038701602052604090205460ff16600481111561117057611170613f09565b146111c45760405162461bcd60e51b815260206004820152603160248201525f805160206145b08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610447565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611227833384612b7d565b9392505050565b5f805160206145d08339815191525f61124683611c2d565b90505f806112578360400151611e0e565b91509150806112b95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610447565b5f828152600585016020526040812080546112d390613f58565b9050118015611305575060015f83815260078601602052604090205460ff16600581111561130357611303613f09565b145b6113215760405162461bcd60e51b815260040161044790614258565b5f828152600585016020526040812061133991613c39565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145d083398151915292919061143390613f58565b9050118015611465575060015f83815260078301602052604090205460ff16600581111561146357611463613f09565b145b6114815760405162461bcd60e51b815260040161044790614258565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108819190600401614105565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611505573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152c91908101906142aa565b915091508061158f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610447565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f691906140ee565b82511461165a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610447565b60208201516001600160a01b0316156116d05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610447565b5f806116df8460400151612f38565b9150915081871461174c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610447565b9695505050505050565b5f8181525f805160206146108339815191526020526040812060030180545f805160206145d0833981519152916001600160401b039091169081908461179b8361437c565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061461083398151915290528390208351918201909352825491925f805160206145d083398151915292829060ff16600581111561185257611852613f09565b600581111561186357611863613f09565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614610833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561199c5761195c8160016143a1565b611967906008614241565b5081515f9083908390811061197e5761197e6143b4565b60200101906001600160f81b03191690815f1a905350600101611948565b505f5b60048110156119ff576119b38160036143a1565b6119be906008614241565b6001901c60f81b826119d18360026143c8565b815181106119e1576119e16143b4565b60200101906001600160f81b03191690815f1a90535060010161199f565b505f5b6020811015611a6157611a1681601f6143a1565b611a21906008614241565b86901c60f81b82611a338360066143c8565b81518110611a4357611a436143b4565b60200101906001600160f81b03191690815f1a905350600101611a02565b505f5b6008811015611acc57611a788160076143a1565b611a83906008614241565b6001600160401b038616901c60f81b82611a9e8360266143c8565b81518110611aae57611aae6143b4565b60200101906001600160f81b03191690815f1a905350600101611a64565b505f5b6008811015611b3757611ae38160076143a1565b611aee906008614241565b6001600160401b038516901c60f81b82611b0983602e6143c8565b81518110611b1957611b196143b4565b60200101906001600160f81b03191690815f1a905350600101611acf565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614590833981519152929190611b8890613f58565b9050118015611bba575060035f83815260038301602052604090205460ff166004811115611bb857611bb8613f09565b145b611c0f5760405162461bcd60e51b815260206004820152603360248201525f805160206145b083398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610447565b5050565b611c1b613110565b611c248261315b565b611c0f816131a1565b60408051606080820183525f8083526020830181905292820152905f805160206145d08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ca2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cc991908101906142aa565b9150915080611d305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610447565b8254825114611d935760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610447565b60208201516001600160a01b031615611e065760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610447565b509392505050565b5f808251602714611e315760405162461bcd60e51b8152600401610447906143db565b5f805b6002811015611e8057611e488160016143a1565b611e53906008614241565b61ffff16858281518110611e6957611e696143b4565b016020015160f81c901b9190911790600101611e34565b5061ffff811615611ea35760405162461bcd60e51b815260040161044790614424565b5f805b6004811015611efe57611eba8160036143a1565b611ec5906008614241565b63ffffffff1686611ed78360026143c8565b81518110611ee757611ee76143b4565b016020015160f81c901b9190911790600101611ea6565b5063ffffffff8116600214611f255760405162461bcd60e51b815260040161044790614467565b5f805b6020811015611f7a57611f3c81601f6143a1565b611f47906008614241565b87611f538360066143c8565b81518110611f6357611f636143b4565b016020015160f81c901b9190911790600101611f28565b505f86602681518110611f8f57611f8f6143b4565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611fd35760405162461bcd60e51b8152600401610447906143db565b5f805b600281101561202257611fea8160016143a1565b611ff5906008614241565b61ffff1686828151811061200b5761200b6143b4565b016020015160f81c901b9190911790600101611fd6565b5061ffff8116156120455760405162461bcd60e51b815260040161044790614424565b5f805b60048110156120a05761205c8160036143a1565b612067906008614241565b63ffffffff16876120798360026143c8565b81518110612089576120896143b4565b016020015160f81c901b9190911790600101612048565b5063ffffffff81166003146120c75760405162461bcd60e51b815260040161044790614467565b5f805b602081101561211c576120de81601f6143a1565b6120e9906008614241565b886120f58360066143c8565b81518110612105576121056143b4565b016020015160f81c901b91909117906001016120ca565b505f805b600881101561217b576121348160076143a1565b61213f906008614241565b6001600160401b0316896121548360266143c8565b81518110612164576121646143b4565b016020015160f81c901b9190911790600101612120565b505f805b60088110156121da576121938160076143a1565b61219e906008614241565b6001600160401b03168a6121b383602e6143c8565b815181106121c3576121c36143b4565b016020015160f81c901b919091179060010161217f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061459083398151915292919061223290613f58565b9050118015612264575060015f83815260038301602052604090205460ff16600481111561226257612262613f09565b145b611c0f5760405162461bcd60e51b815260206004820152603860248201525f805160206145b083398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610447565b5f8181525f8051602061461083398151915260205260408082208151610100810190925280545f805160206145d083398151915293929190829060ff16600581111561231157612311613f09565b600581111561232257612322613f09565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123aa576123aa613f09565b146124065760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610447565b60408101516001600160a01b0316336001600160a01b0316146124805760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610447565b61248d8160a00151613255565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124d1576124d1613f09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61259d8461259781611756565b5f611923565b5f85815260068501602052604090209091506125b98282613fdb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125e69085906004016140bc565b6020604051808303815f875af1158015612602573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262691906140ee565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061459083398151915281612694846133f6565b90505f6126a082610a17565b83549091506001600160401b038216108015906126ca57508260010154816001600160401b031611155b6110735760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610447565b5f61273161342c565b5f805160206145d0833981519152426001600160401b03851611801561276b57506001600160401b038416612769426202a3006143c8565b115b6127cd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610447565b856128245760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610447565b5f868152600882016020526040902054156128925760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610447565b82516030146128f95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610447565b61290285613255565b5f806129496040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613463565b5f828152600586016020526040902091935091506129678282613fdb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129949085906004016140bc565b6020604051808303815f875af11580156129b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129d491906140ee565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612a5657612a56613f09565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612b1783611756565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061107360015f805160206145f083398151915255565b5f612b8661342c565b5f612b936101c2846133f6565b90505f805160206145908339815191525f612bad876117ca565b9050600281516005811115612bc457612bc4613f09565b14612c235760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610447565b5f838260a00151612c3491906144ae565b9050612c4088826118db565b5f612c4a89611756565b90505f898983604051602001612c929392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612cb386613255565b5f612cbf8b8486611923565b5f8381526004880160205260409020909150612cdb8282613fdb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d089085906004016140bc565b6020604051808303815f875af1158015612d24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d4891906140ee565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612df757612df7613f09565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061122760015f805160206145f083398151915255565b5f808251602e14612f5b5760405162461bcd60e51b8152600401610447906143db565b5f805b6002811015612faa57612f728160016143a1565b612f7d906008614241565b61ffff16858281518110612f9357612f936143b4565b016020015160f81c901b9190911790600101612f5e565b5061ffff811615612fcd5760405162461bcd60e51b815260040161044790614424565b5f805b600481101561302857612fe48160036143a1565b612fef906008614241565b63ffffffff16866130018360026143c8565b81518110613011576130116143b4565b016020015160f81c901b9190911790600101612fd0565b5063ffffffff811660041461304f5760405162461bcd60e51b815260040161044790614467565b5f805b60208110156130a45761306681601f6143a1565b613071906008614241565b8761307d8360066143c8565b8151811061308d5761308d6143b4565b016020015160f81c901b9190911790600101613052565b505f805b6008811015613103576130bc8160076143a1565b6130c7906008614241565b6001600160401b0316886130dc8360266143c8565b815181106130ec576130ec6143b4565b016020015160f81c901b91909117906001016130a8565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661315957604051631afcd79f60e31b815260040160405180910390fd5b565b613163613110565b61316c8161381b565b61319e6060820135608083013561318960c0850160a08601613da2565b61319960e0860160c087016144ce565b61383c565b50565b6131a9613110565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132355760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610447565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145d08339815191529060ff165f03613293575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132db90836143a1565b106132f7576001600160401b0384166040830152808252613316565b838260400181815161330991906144ae565b6001600160401b03169052505b5f82602001518360400151606461332d91906144e9565b6133379190614514565b600285015490915060ff90811690821611156133b25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610447565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a27827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613897565b5f805160206145f083398151915280546001190161345d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134cd5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610447565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613544576135048160016143a1565b61350f906008614241565b5081515f90839083908110613526576135266143b4565b60200101906001600160f81b03191690815f1a9053506001016134f0565b505f5b60048110156135a25761355b8160036143a1565b613566906008614241565b505f826135748360026143c8565b81518110613584576135846143b4565b60200101906001600160f81b03191690815f1a905350600101613547565b505f5b60208110156135ff57845181602081106135c1576135c16143b4565b1a60f81b826135d18360066143c8565b815181106135e1576135e16143b4565b60200101906001600160f81b03191690815f1a9053506001016135a5565b505f5b602081101561365f5784602001518160208110613621576136216143b4565b1a60f81b826136318360266143c8565b81518110613641576136416143b4565b60200101906001600160f81b03191690815f1a905350600101613602565b505f5b60088110156136d3576136768160076143a1565b613681906008614241565b60ff1685604001516001600160401b0316901c60f81b828260466136a591906143c8565b815181106136b5576136b56143b4565b60200101906001600160f81b03191690815f1a905350600101613662565b505f5b603081101561373e57846080015181815181106136f5576136f56143b4565b01602001516001600160f81b0319168261371083604e6143c8565b81518110613720576137206143b4565b60200101906001600160f81b03191690815f1a9053506001016136d6565b505f5b60088110156137b0576137558160076143a1565b613760906008614241565b60608601516001600160401b0390811691161c60f81b8261378283607e6143c8565b81518110613792576137926143b4565b60200101906001600160f81b03191690815f1a905350600101613741565b506002816040516137c19190614539565b602060405180830381855afa1580156137dc573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137ff91906140ee565b94909350915050565b60015f805160206145f083398151915255565b613823613110565b61382b6139f9565b613833613a09565b61319e81613a11565b613844613110565b5f5f80516020614590833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156138dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390191906140ee565b90506139186001600160a01b038516333086613a7d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561395c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061398091906140ee565b90508181116139e65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610447565b6139f082826143a1565b95945050505050565b613a01613110565b613159613add565b613159613110565b613a19613110565b80355f805160206145d083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a636060830160408401614554565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613ad7908590613ae5565b50505050565b613808613110565b5f613af96001600160a01b03841683613b46565b905080515f14158015613b1d575080806020019051810190613b1b9190614574565b155b156108c157604051635274afe760e01b81526001600160a01b0384166004820152602401610447565b606061122783835f845f80856001600160a01b03168486604051613b6a9190614539565b5f6040518083038185875af1925050503d805f8114613ba4576040519150601f19603f3d011682016040523d82523d5f602084013e613ba9565b606091505b509150915061174c868383606082613bc957613bc482613c10565b611227565b8151158015613be057506001600160a01b0384163b155b15613c0957604051639996b31560e01b81526001600160a01b0385166004820152602401610447565b5080611227565b805115613c205780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c4590613f58565b5f825580601f10613c54575050565b601f0160209004905f5260205f209081019061319e91905b80821115613c7f575f8155600101613c6c565b5090565b801515811461319e575f80fd5b803563ffffffff81168114613ca3575f80fd5b919050565b5f805f60608486031215613cba575f80fd5b833592506020840135613ccc81613c83565b9150613cda60408501613c90565b90509250925092565b5f60208284031215613cf3575f80fd5b5035919050565b6001600160a01b038116811461319e575f80fd5b5f80828403610100811215613d21575f80fd5b60e0811215613d2e575f80fd5b5082915060e0830135613d4081613cfa565b809150509250929050565b5f60208284031215613d5b575f80fd5b61122782613c90565b5f8060408385031215613d75575f80fd5b613d7e83613c90565b946020939093013593505050565b80356001600160401b0381168114613ca3575f80fd5b5f60208284031215613db2575f80fd5b61122782613d8c565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613df157613df1613dbb565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e1f57613e1f613dbb565b604052919050565b5f6001600160401b03821115613e3f57613e3f613dbb565b50601f01601f191660200190565b5f805f8060808587031215613e60575f80fd5b8435935060208501359250613e7760408601613d8c565b915060608501356001600160401b03811115613e91575f80fd5b8501601f81018713613ea1575f80fd5b8035613eb4613eaf82613e27565b613df7565b818152886020838501011115613ec8575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613efa575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f5157613f51613f1d565b5092915050565b600181811c90821680613f6c57607f821691505b602082108103613f8a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108c157805f5260205f20601f840160051c81016020851015613fb55750805b601f840160051c820191505b81811015613fd4575f8155600101613fc1565b5050505050565b81516001600160401b03811115613ff457613ff4613dbb565b614008816140028454613f58565b84613f90565b602080601f83116001811461403b575f84156140245750858301515b5f19600386901b1c1916600185901b178555614092565b5f85815260208120601f198616915b828110156140695788860151825594840194600190910190840161404a565b508582101561408657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140b457818101518382015260200161409c565b50505f910152565b602081525f82518060208401526140da81604085016020870161409a565b601f01601f19169190910160400192915050565b5f602082840312156140fe575f80fd5b5051919050565b5f60208083525f845461411781613f58565b806020870152604060018084165f8114614138576001811461415457614181565b60ff19851660408a0152604084151560051b8a01019550614181565b895f5260205f205f5b858110156141785781548b820186015290830190880161415d565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826141b1576141b161418f565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a2757610a27613f1d565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613ca381613c83565b5f80604083850312156142bb575f80fd5b82516001600160401b03808211156142d1575f80fd5b90840190606082870312156142e4575f80fd5b6142ec613dcf565b825181526020808401516142ff81613cfa565b82820152604084015183811115614314575f80fd5b80850194505087601f850112614328575f80fd5b83519250614338613eaf84613e27565b838152888285870101111561434b575f80fd5b61435a8483830184880161409a565b8060408401525081955061436f81880161429f565b9450505050509250929050565b5f6001600160401b0380831681810361439757614397613f1d565b6001019392505050565b81810381811115610a2757610a27613f1d565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a2757610a27613f1d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f5157613f51613f1d565b5f602082840312156144de575f80fd5b813561122781613cfa565b6001600160401b0381811683821602808216919082811461450c5761450c613f1d565b505092915050565b5f6001600160401b038084168061452d5761452d61418f565b92169190910492915050565b5f825161454a81846020870161409a565b9190910192915050565b5f60208284031215614564575f80fd5b813560ff81168114611227575f80fd5b5f60208284031215614584575f80fd5b815161122781613c8356fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161478038038061478083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146338061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613c9f565b6102d6565b005b610128610138366004613cda565b610761565b61017b61014b366004613cda565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613cda565b6108bd565b6101286101af366004613d05565b61092a565b6101c76101c2366004613cda565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d42565b610a24565b610128610200366004613d5b565b610da7565b61017b610213366004613d99565b610f98565b6101c7610226366004613cda565b610fb1565b610128610239366004613cda565b610fc5565b61012861024c366004613c9f565b611032565b61017b61025f366004613e44565b61104d565b610128610272366004613d5b565b611072565b61017b610285366004613ee0565b611212565b610128610298366004613d42565b611225565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613cda565b6113e2565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145878339815191529184156103285761032582856114b1565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613f00565b600481111561036b5761036b613f00565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613f00565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206145a78339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206145a78339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461174d565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500613f00565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856117c1565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190613f28565b905061066a86826118d2565b5f61067687858461191a565b5f8c815260058a01602052604090209091506106928282613fd2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016140b3565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906140e5565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145c78339815191529291906107a990613f4f565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9613f00565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016140fc565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906140e5565b505050565b6108c681611b37565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614587833981519152916005600160991b019163ee5b48eb91610878916004016140fc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc8484611c0a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361419a565b92915050565b5f805160206145c78339815191525f610a3c83611c24565b90505f80610a4d8360400151611e05565b915091508015610ab25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610ae457610ae4613f00565b6005811115610af557610af5613f00565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b7c57610b7c613f00565b1480610b9a5750600182516005811115610b9857610b98613f00565b145b610bf95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610c0e57610c0e613f00565b03610c3557505f8381526006860160205260408120600491610c309190613c30565b610c39565b5060055b6020808301515f90815260088801909152604081205581816005811115610c6257610c62613f00565b90816005811115610c7557610c75613f00565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ca957610ca9613f00565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d7457610d74613f00565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145878339815191525f610dbf84611c24565b90505f80610dd08360400151611fa6565b5091509150610dde856121e1565b5f8581526004850160205260408120610df691613c30565b5f610e00836117c1565b9050816001600160401b031681608001516001600160401b03161015610e385760405162461bcd60e51b815260040161043b906141ad565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e7d5760405162461bcd60e51b815260040161043b906141ef565b60015f87815260038701602052604090205460ff166004811115610ea357610ea3613f00565b14610f0c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a51000614238565b5f610fbb826117c1565b60a0015192915050565b610fce816121e1565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614587833981519152916005600160991b019163ee5b48eb91610878916004016140fc565b81156110445761104283826114b1565b505b6108b8836122ba565b5f8061105886612672565b90506110668582868661271f565b9150505b949350505050565b5f805160206145878339815191525f61108a84611c24565b90505f8061109b8360400151611fa6565b50915091506110a985611b37565b5f85815260058501602052604081206110c191613c30565b5f6110cb836117c1565b9050816001600160401b031681608001516001600160401b031610156111035760405162461bcd60e51b815260040161043b906141ad565b5f8681526003808701602052604090912001546001600160401b03808416911611156111415760405162461bcd60e51b815260040161043b906141ef565b60035f87815260038701602052604090205460ff16600481111561116757611167613f00565b146111bb5760405162461bcd60e51b815260206004820152603160248201525f805160206145a78339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61121e833384612b74565b9392505050565b5f805160206145c78339815191525f61123d83611c24565b90505f8061124e8360400151611e05565b91509150806112b05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f828152600585016020526040812080546112ca90613f4f565b90501180156112fc575060015f83815260078601602052604090205460ff1660058111156112fa576112fa613f00565b145b6113185760405162461bcd60e51b815260040161043b9061424f565b5f828152600585016020526040812061133091613c30565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145c783398151915292919061142a90613f4f565b905011801561145c575060015f83815260078301602052604090205460ff16600581111561145a5761145a613f00565b145b6114785760405162461bcd60e51b815260040161043b9061424f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016140fc565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114fc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152391908101906142a1565b91509150806115865760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ed91906140e5565b8251146116515760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156116c75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806116d68460400151612f2f565b915091508187146117435760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206146078339815191526020526040812060030180545f805160206145c7833981519152916001600160401b039091169081908461179283614373565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061460783398151915290528390208351918201909352825491925f805160206145c783398151915292829060ff16600581111561184957611849613f00565b600581111561185a5761185a613f00565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614607833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561199357611953816001614398565b61195e906008614238565b5081515f90839083908110611975576119756143ab565b60200101906001600160f81b03191690815f1a90535060010161193f565b505f5b60048110156119f6576119aa816003614398565b6119b5906008614238565b6001901c60f81b826119c88360026143bf565b815181106119d8576119d86143ab565b60200101906001600160f81b03191690815f1a905350600101611996565b505f5b6020811015611a5857611a0d81601f614398565b611a18906008614238565b86901c60f81b82611a2a8360066143bf565b81518110611a3a57611a3a6143ab565b60200101906001600160f81b03191690815f1a9053506001016119f9565b505f5b6008811015611ac357611a6f816007614398565b611a7a906008614238565b6001600160401b038616901c60f81b82611a958360266143bf565b81518110611aa557611aa56143ab565b60200101906001600160f81b03191690815f1a905350600101611a5b565b505f5b6008811015611b2e57611ada816007614398565b611ae5906008614238565b6001600160401b038516901c60f81b82611b0083602e6143bf565b81518110611b1057611b106143ab565b60200101906001600160f81b03191690815f1a905350600101611ac6565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614587833981519152929190611b7f90613f4f565b9050118015611bb1575060035f83815260038301602052604090205460ff166004811115611baf57611baf613f00565b145b611c065760405162461bcd60e51b815260206004820152603360248201525f805160206145a783398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b611c12613107565b611c1b82613152565b611c0681613198565b60408051606080820183525f8083526020830181905292820152905f805160206145c78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c99573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cc091908101906142a1565b9150915080611d275760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611d8a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611dfd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f808251602714611e285760405162461bcd60e51b815260040161043b906143d2565b5f805b6002811015611e7757611e3f816001614398565b611e4a906008614238565b61ffff16858281518110611e6057611e606143ab565b016020015160f81c901b9190911790600101611e2b565b5061ffff811615611e9a5760405162461bcd60e51b815260040161043b9061441b565b5f805b6004811015611ef557611eb1816003614398565b611ebc906008614238565b63ffffffff1686611ece8360026143bf565b81518110611ede57611ede6143ab565b016020015160f81c901b9190911790600101611e9d565b5063ffffffff8116600214611f1c5760405162461bcd60e51b815260040161043b9061445e565b5f805b6020811015611f7157611f3381601f614398565b611f3e906008614238565b87611f4a8360066143bf565b81518110611f5a57611f5a6143ab565b016020015160f81c901b9190911790600101611f1f565b505f86602681518110611f8657611f866143ab565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611fca5760405162461bcd60e51b815260040161043b906143d2565b5f805b600281101561201957611fe1816001614398565b611fec906008614238565b61ffff16868281518110612002576120026143ab565b016020015160f81c901b9190911790600101611fcd565b5061ffff81161561203c5760405162461bcd60e51b815260040161043b9061441b565b5f805b600481101561209757612053816003614398565b61205e906008614238565b63ffffffff16876120708360026143bf565b81518110612080576120806143ab565b016020015160f81c901b919091179060010161203f565b5063ffffffff81166003146120be5760405162461bcd60e51b815260040161043b9061445e565b5f805b6020811015612113576120d581601f614398565b6120e0906008614238565b886120ec8360066143bf565b815181106120fc576120fc6143ab565b016020015160f81c901b91909117906001016120c1565b505f805b60088110156121725761212b816007614398565b612136906008614238565b6001600160401b03168961214b8360266143bf565b8151811061215b5761215b6143ab565b016020015160f81c901b9190911790600101612117565b505f805b60088110156121d15761218a816007614398565b612195906008614238565b6001600160401b03168a6121aa83602e6143bf565b815181106121ba576121ba6143ab565b016020015160f81c901b9190911790600101612176565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061458783398151915292919061222990613f4f565b905011801561225b575060015f83815260038301602052604090205460ff16600481111561225957612259613f00565b145b611c065760405162461bcd60e51b815260206004820152603860248201525f805160206145a783398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061460783398151915260205260408082208151610100810190925280545f805160206145c783398151915293929190829060ff16600581111561230857612308613f00565b600581111561231957612319613f00565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123a1576123a1613f00565b146123fd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146124775760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6124848160a0015161324c565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124c8576124c8613f00565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125948461258e8161174d565b5f61191a565b5f85815260068501602052604090209091506125b08282613fd2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125dd9085906004016140b3565b6020604051808303815f875af11580156125f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061261d91906140e5565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145878339815191528161268b846133ed565b90505f61269782610a0e565b83549091506001600160401b038216108015906126c157508260010154816001600160401b031611155b61106a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f612728613423565b5f805160206145c7833981519152426001600160401b03851611801561276257506001600160401b038416612760426202a3006143bf565b115b6127c45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b8561281b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600882016020526040902054156128895760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128f05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b6128f98561324c565b5f806129406040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061345a565b5f8281526005860160205260409020919350915061295e8282613fd2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061298b9085906004016140b3565b6020604051808303815f875af11580156129a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129cb91906140e5565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612a4d57612a4d613f00565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612b0e8361174d565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061106a60015f805160206145e783398151915255565b5f612b7d613423565b5f612b8a6101c2846133ed565b90505f805160206145878339815191525f612ba4876117c1565b9050600281516005811115612bbb57612bbb613f00565b14612c1a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612c2b91906144a5565b9050612c3788826118d2565b5f612c418961174d565b90505f898983604051602001612c899392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612caa8661324c565b5f612cb68b848661191a565b5f8381526004880160205260409020909150612cd28282613fd2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cff9085906004016140b3565b6020604051808303815f875af1158015612d1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d3f91906140e5565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612dee57612dee613f00565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061121e60015f805160206145e783398151915255565b5f808251602e14612f525760405162461bcd60e51b815260040161043b906143d2565b5f805b6002811015612fa157612f69816001614398565b612f74906008614238565b61ffff16858281518110612f8a57612f8a6143ab565b016020015160f81c901b9190911790600101612f55565b5061ffff811615612fc45760405162461bcd60e51b815260040161043b9061441b565b5f805b600481101561301f57612fdb816003614398565b612fe6906008614238565b63ffffffff1686612ff88360026143bf565b81518110613008576130086143ab565b016020015160f81c901b9190911790600101612fc7565b5063ffffffff81166004146130465760405162461bcd60e51b815260040161043b9061445e565b5f805b602081101561309b5761305d81601f614398565b613068906008614238565b876130748360066143bf565b81518110613084576130846143ab565b016020015160f81c901b9190911790600101613049565b505f805b60088110156130fa576130b3816007614398565b6130be906008614238565b6001600160401b0316886130d38360266143bf565b815181106130e3576130e36143ab565b016020015160f81c901b919091179060010161309f565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661315057604051631afcd79f60e31b815260040160405180910390fd5b565b61315a613107565b61316381613812565b6131956060820135608083013561318060c0850160a08601613d99565b61319060e0860160c087016144c5565b613833565b50565b6131a0613107565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661322c5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145c78339815191529060ff165f0361328a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132d29083614398565b106132ee576001600160401b038416604083015280825261330d565b838260400181815161330091906144a5565b6001600160401b03169052505b5f82602001518360400151606461332491906144e0565b61332e919061450b565b600285015490915060ff90811690821611156133a95760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061388e565b5f805160206145e783398151915280546001190161345457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134c45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561353b576134fb816001614398565b613506906008614238565b5081515f9083908390811061351d5761351d6143ab565b60200101906001600160f81b03191690815f1a9053506001016134e7565b505f5b600481101561359957613552816003614398565b61355d906008614238565b505f8261356b8360026143bf565b8151811061357b5761357b6143ab565b60200101906001600160f81b03191690815f1a90535060010161353e565b505f5b60208110156135f657845181602081106135b8576135b86143ab565b1a60f81b826135c88360066143bf565b815181106135d8576135d86143ab565b60200101906001600160f81b03191690815f1a90535060010161359c565b505f5b60208110156136565784602001518160208110613618576136186143ab565b1a60f81b826136288360266143bf565b81518110613638576136386143ab565b60200101906001600160f81b03191690815f1a9053506001016135f9565b505f5b60088110156136ca5761366d816007614398565b613678906008614238565b60ff1685604001516001600160401b0316901c60f81b8282604661369c91906143bf565b815181106136ac576136ac6143ab565b60200101906001600160f81b03191690815f1a905350600101613659565b505f5b603081101561373557846080015181815181106136ec576136ec6143ab565b01602001516001600160f81b0319168261370783604e6143bf565b81518110613717576137176143ab565b60200101906001600160f81b03191690815f1a9053506001016136cd565b505f5b60088110156137a75761374c816007614398565b613757906008614238565b60608601516001600160401b0390811691161c60f81b8261377983607e6143bf565b81518110613789576137896143ab565b60200101906001600160f81b03191690815f1a905350600101613738565b506002816040516137b89190614530565b602060405180830381855afa1580156137d3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137f691906140e5565b94909350915050565b60015f805160206145e783398151915255565b61381a613107565b6138226139f0565b61382a613a00565b61319581613a08565b61383b613107565b5f5f80516020614587833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156138d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138f891906140e5565b905061390f6001600160a01b038516333086613a74565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613953573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061397791906140e5565b90508181116139dd5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b6139e78282614398565b95945050505050565b6139f8613107565b613150613ad4565b613150613107565b613a10613107565b80355f805160206145c783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a5a606083016040840161454b565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613ace908590613adc565b50505050565b6137ff613107565b5f613af06001600160a01b03841683613b3d565b905080515f14158015613b14575080806020019051810190613b12919061456b565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b606061121e83835f845f80856001600160a01b03168486604051613b619190614530565b5f6040518083038185875af1925050503d805f8114613b9b576040519150601f19603f3d011682016040523d82523d5f602084013e613ba0565b606091505b5091509150611743868383606082613bc057613bbb82613c07565b61121e565b8151158015613bd757506001600160a01b0384163b155b15613c0057604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b508061121e565b805115613c175780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c3c90613f4f565b5f825580601f10613c4b575050565b601f0160209004905f5260205f209081019061319591905b80821115613c76575f8155600101613c63565b5090565b8015158114613195575f80fd5b803563ffffffff81168114613c9a575f80fd5b919050565b5f805f60608486031215613cb1575f80fd5b833592506020840135613cc381613c7a565b9150613cd160408501613c87565b90509250925092565b5f60208284031215613cea575f80fd5b5035919050565b6001600160a01b0381168114613195575f80fd5b5f80828403610100811215613d18575f80fd5b60e0811215613d25575f80fd5b5082915060e0830135613d3781613cf1565b809150509250929050565b5f60208284031215613d52575f80fd5b61121e82613c87565b5f8060408385031215613d6c575f80fd5b613d7583613c87565b946020939093013593505050565b80356001600160401b0381168114613c9a575f80fd5b5f60208284031215613da9575f80fd5b61121e82613d83565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613de857613de8613db2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e1657613e16613db2565b604052919050565b5f6001600160401b03821115613e3657613e36613db2565b50601f01601f191660200190565b5f805f8060808587031215613e57575f80fd5b8435935060208501359250613e6e60408601613d83565b915060608501356001600160401b03811115613e88575f80fd5b8501601f81018713613e98575f80fd5b8035613eab613ea682613e1e565b613dee565b818152886020838501011115613ebf575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ef1575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f4857613f48613f14565b5092915050565b600181811c90821680613f6357607f821691505b602082108103613f8157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c81016020851015613fac5750805b601f840160051c820191505b81811015613fcb575f8155600101613fb8565b5050505050565b81516001600160401b03811115613feb57613feb613db2565b613fff81613ff98454613f4f565b84613f87565b602080601f831160018114614032575f841561401b5750858301515b5f19600386901b1c1916600185901b178555614089565b5f85815260208120601f198616915b8281101561406057888601518255948401946001909101908401614041565b508582101561407d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140ab578181015183820152602001614093565b50505f910152565b602081525f82518060208401526140d1816040850160208701614091565b601f01601f19169190910160400192915050565b5f602082840312156140f5575f80fd5b5051919050565b5f60208083525f845461410e81613f4f565b806020870152604060018084165f811461412f576001811461414b57614178565b60ff19851660408a0152604084151560051b8a01019550614178565b895f5260205f205f5b8581101561416f5781548b8201860152908301908801614154565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826141a8576141a8614186565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e613f14565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613c9a81613c7a565b5f80604083850312156142b2575f80fd5b82516001600160401b03808211156142c8575f80fd5b90840190606082870312156142db575f80fd5b6142e3613dc6565b825181526020808401516142f681613cf1565b8282015260408401518381111561430b575f80fd5b80850194505087601f85011261431f575f80fd5b8351925061432f613ea684613e1e565b8381528882858701011115614342575f80fd5b61435184838301848801614091565b80604084015250819550614366818801614296565b9450505050509250929050565b5f6001600160401b0380831681810361438e5761438e613f14565b6001019392505050565b81810381811115610a1e57610a1e613f14565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e613f14565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f4857613f48613f14565b5f602082840312156144d5575f80fd5b813561121e81613cf1565b6001600160401b0381811683821602808216919082811461450357614503613f14565b505092915050565b5f6001600160401b038084168061452457614524614186565b92169190910492915050565b5f8251614541818460208701614091565b9190910192915050565b5f6020828403121561455b575f80fd5b813560ff8116811461121e575f80fd5b5f6020828403121561457b575f80fd5b815161121e81613c7a56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index dc2baffd2..511df487d 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516143b13803806143b183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142648061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b5061012761012236600461391d565b610389565b005b348015610134575f80fd5b50610127610143366004613958565b61046b565b348015610153575f80fd5b50610127610162366004613993565b6108ff565b348015610172575f80fd5b506101b1610181366004613993565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613993565b610a5b565b3480156101ee575f80fd5b506102026101fd366004613993565b610ac8565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b506101276102343660046139aa565b610ade565b348015610244575f80fd5b506101276102533660046139c3565b610e61565b348015610263575f80fd5b506101b1610272366004613a01565b611052565b348015610282575f80fd5b50610202610291366004613993565b61106b565b3480156102a1575f80fd5b506101276102b0366004613993565b61107f565b3480156102c0575f80fd5b506101276102cf366004613958565b6110ec565b3480156102df575f80fd5b506101276102ee3660046139c3565b611107565b3480156102fe575f80fd5b5061012761030d3660046139aa565b6112a7565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613993565b611464565b6101b1610371366004613993565b611533565b6101b1610384366004613aac565b61153f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611563565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206141b88339815191529184156104bd576104ba8285611577565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b3e565b600481111561050057610500613b3e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e0909101529050336001600160a01b031681602001516001600160a01b0316146105e55760405162461bcd60e51b815260206004820152603360248201525f805160206141d88339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084015b60405180910390fd5b6002815160048111156105fa576105fa613b3e565b146106475760405162461bcd60e51b815260206004820152602a60248201525f805160206141d88339815191526044820152696e6f742061637469766560b01b60648201526084016105dc565b5f61065184611813565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069e5761069e613b3e565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61077085611887565b905082606001516001600160401b03168160a001516001600160401b0316116107e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105dc565b5f83606001518260a001516107fc9190613b66565b90506108088682611998565b5f6108148785846119e0565b5f8c815260058a01602052604090209091506108308282613c0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061085d908590600401613ceb565b6020604051808303815f875af1158015610879573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089d9190613d1d565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206141f883398151915292919061094790613b8d565b9050118015610979575060035f83815260078301602052604090205460ff16600581111561097757610977613b3e565b145b6109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105dc565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613d34565b6020604051808303815f875af1158015610a32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a569190613d1d565b505050565b610a6481611bfd565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206141b8833981519152916005600160991b019163ee5b48eb91610a1691600401613d34565b5f610ad864e8d4a5100083613dd2565b92915050565b5f805160206141f88339815191525f610af683611cd0565b90505f80610b078360400151611eb1565b915091508015610b6c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105dc565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610b9e57610b9e613b3e565b6005811115610baf57610baf613b3e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c3657610c36613b3e565b1480610c545750600182516005811115610c5257610c52613b3e565b145b610cb35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105dc565b600382516005811115610cc857610cc8613b3e565b03610cef57505f8381526006860160205260408120600491610cea91906138d3565b610cf3565b5060055b6020808301515f90815260088801909152604081205581816005811115610d1c57610d1c613b3e565b90816005811115610d2f57610d2f613b3e565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d6357610d63613b3e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e2e57610e2e613b3e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206141b88339815191525f610e7984611cd0565b90505f80610e8a8360400151612052565b5091509150610e988561228d565b5f8581526004850160205260408120610eb0916138d3565b5f610eba83611887565b9050816001600160401b031681608001516001600160401b03161015610ef25760405162461bcd60e51b81526004016105dc90613de5565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f375760405162461bcd60e51b81526004016105dc90613e27565b60015f87815260038701602052604090205460ff166004811115610f5d57610f5d613b3e565b14610fc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105dc565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad86001600160401b03831664e8d4a51000613e70565b5f61107582611887565b60a0015192915050565b6110888161228d565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206141b8833981519152916005600160991b019163ee5b48eb91610a1691600401613d34565b81156110fe576110fc8382611577565b505b610a5683612366565b5f805160206141b88339815191525f61111f84611cd0565b90505f806111308360400151612052565b509150915061113e85611bfd565b5f8581526005850160205260408120611156916138d3565b5f61116083611887565b9050816001600160401b031681608001516001600160401b031610156111985760405162461bcd60e51b81526004016105dc90613de5565b5f8681526003808701602052604090912001546001600160401b03808416911611156111d65760405162461bcd60e51b81526004016105dc90613e27565b60035f87815260038701602052604090205460ff1660048111156111fc576111fc613b3e565b146112505760405162461bcd60e51b815260206004820152603160248201525f805160206141d88339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105dc565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206141f88339815191525f6112bf83611cd0565b90505f806112d08360400151611eb1565b91509150806113325760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105dc565b5f8281526005850160205260408120805461134c90613b8d565b905011801561137e575060015f83815260078601602052604090205460ff16600581111561137c5761137c613b3e565b145b61139a5760405162461bcd60e51b81526004016105dc90613e87565b5f82815260058501602052604081206113b2916138d3565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206141f88339815191529291906114ac90613b8d565b90501180156114de575060015f83815260078301602052604090205460ff1660058111156114dc576114dc613b3e565b145b6114fa5760405162461bcd60e51b81526004016105dc90613e87565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a169190600401613d34565b5f610ad882333461271e565b5f8061154a34612ad6565b905061155885828686612b80565b9150505b9392505050565b61156b612fd5565b61157481613020565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e99190810190613eed565b915091508061164c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105dc565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561168f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b39190613d1d565b8251146117175760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105dc565b60208201516001600160a01b03161561178d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105dc565b5f8061179c8460400151613063565b915091508187146118095760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105dc565b9695505050505050565b5f8181525f805160206142388339815191526020526040812060030180545f805160206141f8833981519152916001600160401b039091169081908461185883613fbf565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061423883398151915290528390208351918201909352825491925f805160206141f883398151915292829060ff16600581111561190f5761190f613b3e565b600581111561192057611920613b3e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614238833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5957611a19816001613fe4565b611a24906008613e70565b5081515f90839083908110611a3b57611a3b613ff7565b60200101906001600160f81b03191690815f1a905350600101611a05565b505f5b6004811015611abc57611a70816003613fe4565b611a7b906008613e70565b6001901c60f81b82611a8e83600261400b565b81518110611a9e57611a9e613ff7565b60200101906001600160f81b03191690815f1a905350600101611a5c565b505f5b6020811015611b1e57611ad381601f613fe4565b611ade906008613e70565b86901c60f81b82611af083600661400b565b81518110611b0057611b00613ff7565b60200101906001600160f81b03191690815f1a905350600101611abf565b505f5b6008811015611b8957611b35816007613fe4565b611b40906008613e70565b6001600160401b038616901c60f81b82611b5b83602661400b565b81518110611b6b57611b6b613ff7565b60200101906001600160f81b03191690815f1a905350600101611b21565b505f5b6008811015611bf457611ba0816007613fe4565b611bab906008613e70565b6001600160401b038516901c60f81b82611bc683602e61400b565b81518110611bd657611bd6613ff7565b60200101906001600160f81b03191690815f1a905350600101611b8c565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206141b8833981519152929190611c4590613b8d565b9050118015611c77575060035f83815260038301602052604090205460ff166004811115611c7557611c75613b3e565b145b611ccc5760405162461bcd60e51b815260206004820152603360248201525f805160206141d883398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105dc565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206141f88339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d45573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d6c9190810190613eed565b9150915080611dd35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105dc565b8254825114611e365760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105dc565b60208201516001600160a01b031615611ea95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105dc565b509392505050565b5f808251602714611ed45760405162461bcd60e51b81526004016105dc9061401e565b5f805b6002811015611f2357611eeb816001613fe4565b611ef6906008613e70565b61ffff16858281518110611f0c57611f0c613ff7565b016020015160f81c901b9190911790600101611ed7565b5061ffff811615611f465760405162461bcd60e51b81526004016105dc90614067565b5f805b6004811015611fa157611f5d816003613fe4565b611f68906008613e70565b63ffffffff1686611f7a83600261400b565b81518110611f8a57611f8a613ff7565b016020015160f81c901b9190911790600101611f49565b5063ffffffff8116600214611fc85760405162461bcd60e51b81526004016105dc906140aa565b5f805b602081101561201d57611fdf81601f613fe4565b611fea906008613e70565b87611ff683600661400b565b8151811061200657612006613ff7565b016020015160f81c901b9190911790600101611fcb565b505f8660268151811061203257612032613ff7565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120765760405162461bcd60e51b81526004016105dc9061401e565b5f805b60028110156120c55761208d816001613fe4565b612098906008613e70565b61ffff168682815181106120ae576120ae613ff7565b016020015160f81c901b9190911790600101612079565b5061ffff8116156120e85760405162461bcd60e51b81526004016105dc90614067565b5f805b6004811015612143576120ff816003613fe4565b61210a906008613e70565b63ffffffff168761211c83600261400b565b8151811061212c5761212c613ff7565b016020015160f81c901b91909117906001016120eb565b5063ffffffff811660031461216a5760405162461bcd60e51b81526004016105dc906140aa565b5f805b60208110156121bf5761218181601f613fe4565b61218c906008613e70565b8861219883600661400b565b815181106121a8576121a8613ff7565b016020015160f81c901b919091179060010161216d565b505f805b600881101561221e576121d7816007613fe4565b6121e2906008613e70565b6001600160401b0316896121f783602661400b565b8151811061220757612207613ff7565b016020015160f81c901b91909117906001016121c3565b505f805b600881101561227d57612236816007613fe4565b612241906008613e70565b6001600160401b03168a61225683602e61400b565b8151811061226657612266613ff7565b016020015160f81c901b9190911790600101612222565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206141b88339815191529291906122d590613b8d565b9050118015612307575060015f83815260038301602052604090205460ff16600481111561230557612305613b3e565b145b611ccc5760405162461bcd60e51b815260206004820152603860248201525f805160206141d883398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105dc565b5f8181525f8051602061423883398151915260205260408082208151610100810190925280545f805160206141f883398151915293929190829060ff1660058111156123b4576123b4613b3e565b60058111156123c5576123c5613b3e565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561244d5761244d613b3e565b146124a95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105dc565b60408101516001600160a01b0316336001600160a01b0316146125235760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105dc565b6125308160a0015161323b565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561257457612574613b3e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126408461263a81611813565b5f6119e0565b5f858152600685016020526040902090915061265c8282613c0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612689908590600401613ceb565b6020604051808303815f875af11580156126a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c99190613d1d565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6127276133dc565b5f61273183610ac8565b90505f805160206141b88339815191525f61274b87611887565b905060028151600581111561276257612762613b3e565b146127c15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105dc565b5f838260a001516127d291906140f1565b90506127de8882611998565b5f6127e889611813565b90505f8989836040516020016128309392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090506128518661323b565b5f61285d8b84866119e0565b5f83815260048801602052604090209091506128798282613c0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128a6908590600401613ceb565b6020604051808303815f875af11580156128c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128e69190613d1d565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561299557612995613b3e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061155c60015f8051602061421883398151915255565b5f5f805160206141b88339815191528282612af082610ac8565b83549091506001600160401b03821610801590612b1a57508260010154816001600160401b031611155b612b785760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105dc565b949350505050565b5f612b896133dc565b5f805160206141f8833981519152426001600160401b038516118015612bc357506001600160401b038416612bc1426202a30061400b565b115b612c255760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105dc565b85612c7c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105dc565b5f86815260088201602052604090205415612cea5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105dc565b8251603014612d515760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105dc565b612d5a8561323b565b5f80612da16040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613426565b5f82815260058601602052604090209193509150612dbf8282613c0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612dec908590600401613ceb565b6020604051808303815f875af1158015612e08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e2c9190613d1d565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612eae57612eae613b3e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612f6f83611813565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b7860015f8051602061421883398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661301e57604051631afcd79f60e31b815260040160405180910390fd5b565b613028612fd5565b613031816137cb565b6115746060820135608083013561304e60c0850160a08601613a01565b61305e60e0860160c08701614111565b6137ec565b5f808251602e146130865760405162461bcd60e51b81526004016105dc9061401e565b5f805b60028110156130d55761309d816001613fe4565b6130a8906008613e70565b61ffff168582815181106130be576130be613ff7565b016020015160f81c901b9190911790600101613089565b5061ffff8116156130f85760405162461bcd60e51b81526004016105dc90614067565b5f805b60048110156131535761310f816003613fe4565b61311a906008613e70565b63ffffffff168661312c83600261400b565b8151811061313c5761313c613ff7565b016020015160f81c901b91909117906001016130fb565b5063ffffffff811660041461317a5760405162461bcd60e51b81526004016105dc906140aa565b5f805b60208110156131cf5761319181601f613fe4565b61319c906008613e70565b876131a883600661400b565b815181106131b8576131b8613ff7565b016020015160f81c901b919091179060010161317d565b505f805b600881101561322e576131e7816007613fe4565b6131f2906008613e70565b6001600160401b03168861320783602661400b565b8151811061321757613217613ff7565b016020015160f81c901b91909117906001016131d3565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206141f88339815191529060ff165f03613279575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132c19083613fe4565b106132dd576001600160401b03841660408301528082526132fc565b83826040018181516132ef91906140f1565b6001600160401b03169052505b5f826020015183604001516064613313919061412c565b61331d9190614157565b600285015490915060ff90811690821611156133985760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105dc565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061421883398151915280546001190161340d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061421883398151915255565b5f60608260800151516030146134905760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105dc565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613507576134c7816001613fe4565b6134d2906008613e70565b5081515f908390839081106134e9576134e9613ff7565b60200101906001600160f81b03191690815f1a9053506001016134b3565b505f5b60048110156135655761351e816003613fe4565b613529906008613e70565b505f8261353783600261400b565b8151811061354757613547613ff7565b60200101906001600160f81b03191690815f1a90535060010161350a565b505f5b60208110156135c2578451816020811061358457613584613ff7565b1a60f81b8261359483600661400b565b815181106135a4576135a4613ff7565b60200101906001600160f81b03191690815f1a905350600101613568565b505f5b602081101561362257846020015181602081106135e4576135e4613ff7565b1a60f81b826135f483602661400b565b8151811061360457613604613ff7565b60200101906001600160f81b03191690815f1a9053506001016135c5565b505f5b600881101561369657613639816007613fe4565b613644906008613e70565b60ff1685604001516001600160401b0316901c60f81b82826046613668919061400b565b8151811061367857613678613ff7565b60200101906001600160f81b03191690815f1a905350600101613625565b505f5b603081101561370157846080015181815181106136b8576136b8613ff7565b01602001516001600160f81b031916826136d383604e61400b565b815181106136e3576136e3613ff7565b60200101906001600160f81b03191690815f1a905350600101613699565b505f5b600881101561377357613718816007613fe4565b613723906008613e70565b60608601516001600160401b0390811691161c60f81b8261374583607e61400b565b8151811061375557613755613ff7565b60200101906001600160f81b03191690815f1a905350600101613704565b50600281604051613784919061417c565b602060405180830381855afa15801561379f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137c29190613d1d565b94909350915050565b6137d3612fd5565b6137db613847565b6137e3613857565b6115748161385f565b6137f4612fd5565b5f5f805160206141b8833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61384f612fd5565b61301e6138cb565b61301e612fd5565b613867612fd5565b80355f805160206141f883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138b16060830160408401614197565b600291909101805460ff191660ff90921691909117905550565b613413612fd5565b5080546138df90613b8d565b5f825580601f106138ee575050565b601f0160209004905f5260205f209081019061157491905b80821115613919575f8155600101613906565b5090565b5f60e0828403121561392d575f80fd5b50919050565b8015158114611574575f80fd5b803563ffffffff81168114613953575f80fd5b919050565b5f805f6060848603121561396a575f80fd5b83359250602084013561397c81613933565b915061398a60408501613940565b90509250925092565b5f602082840312156139a3575f80fd5b5035919050565b5f602082840312156139ba575f80fd5b61155c82613940565b5f80604083850312156139d4575f80fd5b6139dd83613940565b946020939093013593505050565b80356001600160401b0381168114613953575f80fd5b5f60208284031215613a11575f80fd5b61155c826139eb565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a5057613a50613a1a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613a7e57613a7e613a1a565b604052919050565b5f6001600160401b03821115613a9e57613a9e613a1a565b50601f01601f191660200190565b5f805f60608486031215613abe575f80fd5b83359250613ace602085016139eb565b915060408401356001600160401b03811115613ae8575f80fd5b8401601f81018613613af8575f80fd5b8035613b0b613b0682613a86565b613a56565b818152876020838501011115613b1f575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613b8657613b86613b52565b5092915050565b600181811c90821680613ba157607f821691505b60208210810361392d57634e487b7160e01b5f52602260045260245ffd5b601f821115610a5657805f5260205f20601f840160051c81016020851015613be45750805b601f840160051c820191505b81811015613c03575f8155600101613bf0565b5050505050565b81516001600160401b03811115613c2357613c23613a1a565b613c3781613c318454613b8d565b84613bbf565b602080601f831160018114613c6a575f8415613c535750858301515b5f19600386901b1c1916600185901b178555613cc1565b5f85815260208120601f198616915b82811015613c9857888601518255948401946001909101908401613c79565b5085821015613cb557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613ce3578181015183820152602001613ccb565b50505f910152565b602081525f8251806020840152613d09816040850160208701613cc9565b601f01601f19169190910160400192915050565b5f60208284031215613d2d575f80fd5b5051919050565b5f60208083525f8454613d4681613b8d565b806020870152604060018084165f8114613d675760018114613d8357613db0565b60ff19851660408a0152604084151560051b8a01019550613db0565b895f5260205f205f5b85811015613da75781548b8201860152908301908801613d8c565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613de057613de0613dbe565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad857610ad8613b52565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611574575f80fd5b805161395381613933565b5f8060408385031215613efe575f80fd5b82516001600160401b0380821115613f14575f80fd5b9084019060608287031215613f27575f80fd5b613f2f613a2e565b82518152602080840151613f4281613ece565b82820152604084015183811115613f57575f80fd5b80850194505087601f850112613f6b575f80fd5b83519250613f7b613b0684613a86565b8381528882858701011115613f8e575f80fd5b613f9d84838301848801613cc9565b80604084015250819550613fb2818801613ee2565b9450505050509250929050565b5f6001600160401b03808316818103613fda57613fda613b52565b6001019392505050565b81810381811115610ad857610ad8613b52565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad857610ad8613b52565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613b8657613b86613b52565b5f60208284031215614121575f80fd5b813561155c81613ece565b6001600160401b0381811683821602808216919082811461414f5761414f613b52565b505092915050565b5f6001600160401b038084168061417057614170613dbe565b92169190910492915050565b5f825161418d818460208701613cc9565b9190910192915050565b5f602082840312156141a7575f80fd5b813560ff8116811461155c575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516143a83803806143a883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61425b8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613914565b610389565b005b348015610134575f80fd5b5061012761014336600461394f565b61046b565b348015610153575f80fd5b5061012761016236600461398a565b6108f6565b348015610172575f80fd5b506101b161018136600461398a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de36600461398a565b610a52565b3480156101ee575f80fd5b506102026101fd36600461398a565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b506101276102343660046139a1565b610ad5565b348015610244575f80fd5b506101276102533660046139ba565b610e58565b348015610263575f80fd5b506101b16102723660046139f8565b611049565b348015610282575f80fd5b5061020261029136600461398a565b611062565b3480156102a1575f80fd5b506101276102b036600461398a565b611076565b3480156102c0575f80fd5b506101276102cf36600461394f565b6110e3565b3480156102df575f80fd5b506101276102ee3660046139ba565b6110fe565b3480156102fe575f80fd5b5061012761030d3660046139a1565b61129e565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e36600461398a565b61145b565b6101b161037136600461398a565b61152a565b6101b1610384366004613aa3565b611536565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a8361155a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206141af8339815191529184156104bd576104ba828561156e565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b35565b600481111561050057610500613b35565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613b35565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206141cf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206141cf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f6106488461180a565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613b35565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107678561187e565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613b5d565b90506107ff868261198f565b5f61080b8785846119d7565b5f8c815260058a01602052604090209091506108278282613c01565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613ce2565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613d14565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206141ef83398151915292919061093e90613b84565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613b35565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613d2b565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613d14565b505050565b610a5b81611bf4565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206141af833981519152916005600160991b019163ee5b48eb91610a0d91600401613d2b565b5f610acf64e8d4a5100083613dc9565b92915050565b5f805160206141ef8339815191525f610aed83611cc7565b90505f80610afe8360400151611ea8565b915091508015610b635760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610b9557610b95613b35565b6005811115610ba657610ba6613b35565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c2d57610c2d613b35565b1480610c4b5750600182516005811115610c4957610c49613b35565b145b610caa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115610cbf57610cbf613b35565b03610ce657505f8381526006860160205260408120600491610ce191906138ca565b610cea565b5060055b6020808301515f90815260088801909152604081205581816005811115610d1357610d13613b35565b90816005811115610d2657610d26613b35565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d5a57610d5a613b35565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e2557610e25613b35565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206141af8339815191525f610e7084611cc7565b90505f80610e818360400151612049565b5091509150610e8f85612284565b5f8581526004850160205260408120610ea7916138ca565b5f610eb18361187e565b9050816001600160401b031681608001516001600160401b03161015610ee95760405162461bcd60e51b81526004016105d090613ddc565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f2e5760405162461bcd60e51b81526004016105d090613e1e565b60015f87815260038701602052604090205460ff166004811115610f5457610f54613b35565b14610fbd5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000613e67565b5f61106c8261187e565b60a0015192915050565b61107f81612284565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206141af833981519152916005600160991b019163ee5b48eb91610a0d91600401613d2b565b81156110f5576110f3838261156e565b505b610a4d8361235d565b5f805160206141af8339815191525f61111684611cc7565b90505f806111278360400151612049565b509150915061113585611bf4565b5f858152600585016020526040812061114d916138ca565b5f6111578361187e565b9050816001600160401b031681608001516001600160401b0316101561118f5760405162461bcd60e51b81526004016105d090613ddc565b5f8681526003808701602052604090912001546001600160401b03808416911611156111cd5760405162461bcd60e51b81526004016105d090613e1e565b60035f87815260038701602052604090205460ff1660048111156111f3576111f3613b35565b146112475760405162461bcd60e51b815260206004820152603160248201525f805160206141cf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206141ef8339815191525f6112b683611cc7565b90505f806112c78360400151611ea8565b91509150806113295760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f8281526005850160205260408120805461134390613b84565b9050118015611375575060015f83815260078601602052604090205460ff16600581111561137357611373613b35565b145b6113915760405162461bcd60e51b81526004016105d090613e7e565b5f82815260058501602052604081206113a9916138ca565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206141ef8339815191529291906114a390613b84565b90501180156114d5575060015f83815260078301602052604090205460ff1660058111156114d3576114d3613b35565b145b6114f15760405162461bcd60e51b81526004016105d090613e7e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613d2b565b5f610acf823334612715565b5f8061154134612acd565b905061154f85828686612b77565b9150505b9392505050565b611562612fcc565b61156b81613017565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115b9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e09190810190613ee4565b91509150806116435760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611686573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116aa9190613d14565b82511461170e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b0316156117845760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f80611793846040015161305a565b915091508187146118005760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f8051602061422f8339815191526020526040812060030180545f805160206141ef833981519152916001600160401b039091169081908461184f83613fb6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061422f83398151915290528390208351918201909352825491925f805160206141ef83398151915292829060ff16600581111561190657611906613b35565b600581111561191757611917613b35565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061422f833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5057611a10816001613fdb565b611a1b906008613e67565b5081515f90839083908110611a3257611a32613fee565b60200101906001600160f81b03191690815f1a9053506001016119fc565b505f5b6004811015611ab357611a67816003613fdb565b611a72906008613e67565b6001901c60f81b82611a85836002614002565b81518110611a9557611a95613fee565b60200101906001600160f81b03191690815f1a905350600101611a53565b505f5b6020811015611b1557611aca81601f613fdb565b611ad5906008613e67565b86901c60f81b82611ae7836006614002565b81518110611af757611af7613fee565b60200101906001600160f81b03191690815f1a905350600101611ab6565b505f5b6008811015611b8057611b2c816007613fdb565b611b37906008613e67565b6001600160401b038616901c60f81b82611b52836026614002565b81518110611b6257611b62613fee565b60200101906001600160f81b03191690815f1a905350600101611b18565b505f5b6008811015611beb57611b97816007613fdb565b611ba2906008613e67565b6001600160401b038516901c60f81b82611bbd83602e614002565b81518110611bcd57611bcd613fee565b60200101906001600160f81b03191690815f1a905350600101611b83565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206141af833981519152929190611c3c90613b84565b9050118015611c6e575060035f83815260038301602052604090205460ff166004811115611c6c57611c6c613b35565b145b611cc35760405162461bcd60e51b815260206004820152603360248201525f805160206141cf83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206141ef8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d3c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d639190810190613ee4565b9150915080611dca5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611e2d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611ea05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f808251602714611ecb5760405162461bcd60e51b81526004016105d090614015565b5f805b6002811015611f1a57611ee2816001613fdb565b611eed906008613e67565b61ffff16858281518110611f0357611f03613fee565b016020015160f81c901b9190911790600101611ece565b5061ffff811615611f3d5760405162461bcd60e51b81526004016105d09061405e565b5f805b6004811015611f9857611f54816003613fdb565b611f5f906008613e67565b63ffffffff1686611f71836002614002565b81518110611f8157611f81613fee565b016020015160f81c901b9190911790600101611f40565b5063ffffffff8116600214611fbf5760405162461bcd60e51b81526004016105d0906140a1565b5f805b602081101561201457611fd681601f613fdb565b611fe1906008613e67565b87611fed836006614002565b81518110611ffd57611ffd613fee565b016020015160f81c901b9190911790600101611fc2565b505f8660268151811061202957612029613fee565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461206d5760405162461bcd60e51b81526004016105d090614015565b5f805b60028110156120bc57612084816001613fdb565b61208f906008613e67565b61ffff168682815181106120a5576120a5613fee565b016020015160f81c901b9190911790600101612070565b5061ffff8116156120df5760405162461bcd60e51b81526004016105d09061405e565b5f805b600481101561213a576120f6816003613fdb565b612101906008613e67565b63ffffffff1687612113836002614002565b8151811061212357612123613fee565b016020015160f81c901b91909117906001016120e2565b5063ffffffff81166003146121615760405162461bcd60e51b81526004016105d0906140a1565b5f805b60208110156121b65761217881601f613fdb565b612183906008613e67565b8861218f836006614002565b8151811061219f5761219f613fee565b016020015160f81c901b9190911790600101612164565b505f805b6008811015612215576121ce816007613fdb565b6121d9906008613e67565b6001600160401b0316896121ee836026614002565b815181106121fe576121fe613fee565b016020015160f81c901b91909117906001016121ba565b505f805b60088110156122745761222d816007613fdb565b612238906008613e67565b6001600160401b03168a61224d83602e614002565b8151811061225d5761225d613fee565b016020015160f81c901b9190911790600101612219565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206141af8339815191529291906122cc90613b84565b90501180156122fe575060015f83815260038301602052604090205460ff1660048111156122fc576122fc613b35565b145b611cc35760405162461bcd60e51b815260206004820152603860248201525f805160206141cf83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061422f83398151915260205260408082208151610100810190925280545f805160206141ef83398151915293929190829060ff1660058111156123ab576123ab613b35565b60058111156123bc576123bc613b35565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561244457612444613b35565b146124a05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461251a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6125278160a00151613232565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561256b5761256b613b35565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612637846126318161180a565b5f6119d7565b5f85815260068501602052604090209091506126538282613c01565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612680908590600401613ce2565b6020604051808303815f875af115801561269c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c09190613d14565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61271e6133d3565b5f61272883610abf565b90505f805160206141af8339815191525f6127428761187e565b905060028151600581111561275957612759613b35565b146127b85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516127c991906140e8565b90506127d5888261198f565b5f6127df8961180a565b90505f8989836040516020016128279392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061284886613232565b5f6128548b84866119d7565b5f83815260048801602052604090209091506128708282613c01565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061289d908590600401613ce2565b6020604051808303815f875af11580156128b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128dd9190613d14565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561298c5761298c613b35565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061155360015f8051602061420f83398151915255565b5f5f805160206141af8339815191528282612ae782610abf565b83549091506001600160401b03821610801590612b1157508260010154816001600160401b031611155b612b6f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612b806133d3565b5f805160206141ef833981519152426001600160401b038516118015612bba57506001600160401b038416612bb8426202a300614002565b115b612c1c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612c735760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612ce15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612d485760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612d5185613232565b5f80612d986040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061341d565b5f82815260058601602052604090209193509150612db68282613c01565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612de3908590600401613ce2565b6020604051808303815f875af1158015612dff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e239190613d14565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612ea557612ea5613b35565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612f668361180a565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b6f60015f8051602061420f83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661301557604051631afcd79f60e31b815260040160405180910390fd5b565b61301f612fcc565b613028816137c2565b61156b6060820135608083013561304560c0850160a086016139f8565b61305560e0860160c08701614108565b6137e3565b5f808251602e1461307d5760405162461bcd60e51b81526004016105d090614015565b5f805b60028110156130cc57613094816001613fdb565b61309f906008613e67565b61ffff168582815181106130b5576130b5613fee565b016020015160f81c901b9190911790600101613080565b5061ffff8116156130ef5760405162461bcd60e51b81526004016105d09061405e565b5f805b600481101561314a57613106816003613fdb565b613111906008613e67565b63ffffffff1686613123836002614002565b8151811061313357613133613fee565b016020015160f81c901b91909117906001016130f2565b5063ffffffff81166004146131715760405162461bcd60e51b81526004016105d0906140a1565b5f805b60208110156131c65761318881601f613fdb565b613193906008613e67565b8761319f836006614002565b815181106131af576131af613fee565b016020015160f81c901b9190911790600101613174565b505f805b6008811015613225576131de816007613fdb565b6131e9906008613e67565b6001600160401b0316886131fe836026614002565b8151811061320e5761320e613fee565b016020015160f81c901b91909117906001016131ca565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206141ef8339815191529060ff165f03613270575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132b89083613fdb565b106132d4576001600160401b03841660408301528082526132f3565b83826040018181516132e691906140e8565b6001600160401b03169052505b5f82602001518360400151606461330a9190614123565b613314919061414e565b600285015490915060ff908116908216111561338f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061420f83398151915280546001190161340457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061420f83398151915255565b5f60608260800151516030146134875760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134fe576134be816001613fdb565b6134c9906008613e67565b5081515f908390839081106134e0576134e0613fee565b60200101906001600160f81b03191690815f1a9053506001016134aa565b505f5b600481101561355c57613515816003613fdb565b613520906008613e67565b505f8261352e836002614002565b8151811061353e5761353e613fee565b60200101906001600160f81b03191690815f1a905350600101613501565b505f5b60208110156135b9578451816020811061357b5761357b613fee565b1a60f81b8261358b836006614002565b8151811061359b5761359b613fee565b60200101906001600160f81b03191690815f1a90535060010161355f565b505f5b602081101561361957846020015181602081106135db576135db613fee565b1a60f81b826135eb836026614002565b815181106135fb576135fb613fee565b60200101906001600160f81b03191690815f1a9053506001016135bc565b505f5b600881101561368d57613630816007613fdb565b61363b906008613e67565b60ff1685604001516001600160401b0316901c60f81b8282604661365f9190614002565b8151811061366f5761366f613fee565b60200101906001600160f81b03191690815f1a90535060010161361c565b505f5b60308110156136f857846080015181815181106136af576136af613fee565b01602001516001600160f81b031916826136ca83604e614002565b815181106136da576136da613fee565b60200101906001600160f81b03191690815f1a905350600101613690565b505f5b600881101561376a5761370f816007613fdb565b61371a906008613e67565b60608601516001600160401b0390811691161c60f81b8261373c83607e614002565b8151811061374c5761374c613fee565b60200101906001600160f81b03191690815f1a9053506001016136fb565b5060028160405161377b9190614173565b602060405180830381855afa158015613796573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137b99190613d14565b94909350915050565b6137ca612fcc565b6137d261383e565b6137da61384e565b61156b81613856565b6137eb612fcc565b5f5f805160206141af833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613846612fcc565b6130156138c2565b613015612fcc565b61385e612fcc565b80355f805160206141ef83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138a8606083016040840161418e565b600291909101805460ff191660ff90921691909117905550565b61340a612fcc565b5080546138d690613b84565b5f825580601f106138e5575050565b601f0160209004905f5260205f209081019061156b91905b80821115613910575f81556001016138fd565b5090565b5f60e08284031215613924575f80fd5b50919050565b801515811461156b575f80fd5b803563ffffffff8116811461394a575f80fd5b919050565b5f805f60608486031215613961575f80fd5b8335925060208401356139738161392a565b915061398160408501613937565b90509250925092565b5f6020828403121561399a575f80fd5b5035919050565b5f602082840312156139b1575f80fd5b61155382613937565b5f80604083850312156139cb575f80fd5b6139d483613937565b946020939093013593505050565b80356001600160401b038116811461394a575f80fd5b5f60208284031215613a08575f80fd5b611553826139e2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a4757613a47613a11565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613a7557613a75613a11565b604052919050565b5f6001600160401b03821115613a9557613a95613a11565b50601f01601f191660200190565b5f805f60608486031215613ab5575f80fd5b83359250613ac5602085016139e2565b915060408401356001600160401b03811115613adf575f80fd5b8401601f81018613613aef575f80fd5b8035613b02613afd82613a7d565b613a4d565b818152876020838501011115613b16575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613b7d57613b7d613b49565b5092915050565b600181811c90821680613b9857607f821691505b60208210810361392457634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613bdb5750805b601f840160051c820191505b81811015613bfa575f8155600101613be7565b5050505050565b81516001600160401b03811115613c1a57613c1a613a11565b613c2e81613c288454613b84565b84613bb6565b602080601f831160018114613c61575f8415613c4a5750858301515b5f19600386901b1c1916600185901b178555613cb8565b5f85815260208120601f198616915b82811015613c8f57888601518255948401946001909101908401613c70565b5085821015613cac57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613cda578181015183820152602001613cc2565b50505f910152565b602081525f8251806020840152613d00816040850160208701613cc0565b601f01601f19169190910160400192915050565b5f60208284031215613d24575f80fd5b5051919050565b5f60208083525f8454613d3d81613b84565b806020870152604060018084165f8114613d5e5760018114613d7a57613da7565b60ff19851660408a0152604084151560051b8a01019550613da7565b895f5260205f205f5b85811015613d9e5781548b8201860152908301908801613d83565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613dd757613dd7613db5565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613b49565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b038116811461156b575f80fd5b805161394a8161392a565b5f8060408385031215613ef5575f80fd5b82516001600160401b0380821115613f0b575f80fd5b9084019060608287031215613f1e575f80fd5b613f26613a25565b82518152602080840151613f3981613ec5565b82820152604084015183811115613f4e575f80fd5b80850194505087601f850112613f62575f80fd5b83519250613f72613afd84613a7d565b8381528882858701011115613f85575f80fd5b613f9484838301848801613cc0565b80604084015250819550613fa9818801613ed9565b9450505050509250929050565b5f6001600160401b03808316818103613fd157613fd1613b49565b6001019392505050565b81810381811115610acf57610acf613b49565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613b49565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613b7d57613b7d613b49565b5f60208284031215614118575f80fd5b813561155381613ec5565b6001600160401b0381811683821602808216919082811461414657614146613b49565b505092915050565b5f6001600160401b038084168061416757614167613db5565b92169190910492915050565b5f8251614184818460208701613cc0565b9190910192915050565b5f6020828403121561419e575f80fd5b813560ff81168114611553575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 1b737ea7e..18c958c60 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -173,7 +173,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager $._pendingRegisterDelegatorMessages[delegationID] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); - // Store the delegation information + // Store the delegation information. Set the delegator status to pending added, + // so that it can be properly started in the complete step, even if the delivered + // nonce is greater than the nonce used to initialize registration. $._delegatorStakes[delegationID] = Delegator({ status: DelegatorStatus.PendingAdded, owner: delegatorAddress, @@ -216,14 +218,23 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _getValidator(validationID); - // The received nonce should be no greater than the highest sent nonce + // The received nonce should be no greater than the highest sent nonce. This should never + // happen since the staking manager is the only entity that can trigger a weight update + // on the P-Chain. require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); - // It should also be greater than or equal to the delegationID's starting nonce + + // The nonce should also be greater than or equal to the delegationID's starting nonce. This allows + // a weight update using a higher nonce (which implicitly includes the delegation's weight update) + // to be used to complete registration for an earlier delegation. This is necessary because the P-Chain + // is only willing to sign the latest weight update. require( $._delegatorStakes[delegationID].startingNonce <= nonce, "PoSValidatorManager: nonce does not match" ); + // Ensure the delegator is pending added. Since anybody can call this function once + // delegator registration has been initialized, we need to make sure that this function is only + // callable after that has been done. require( $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, "PoSValidatorManager: delegationID not pending added" @@ -257,12 +268,17 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Ensure the delegator is active Delegator memory delegator = $._delegatorStakes[delegationID]; require( - delegator.owner == _msgSender(), "PoSValidatorManager: delegation not owned by sender" + delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegation not active" ); + // Only the delegation owner can end the delegation. require( - delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegation not active" + delegator.owner == _msgSender(), "PoSValidatorManager: delegation not owned by sender" ); uint64 nonce = _getAndIncrementNonce(validationID); + + // Set the delegator status to pending removed, so that it can be properly removed in + // the complete step, even if the delivered nonce is greater than the nonce used to + // initialize the removal. delegator.status = DelegatorStatus.PendingRemoved; delegator.endedAt = uint64(block.timestamp); delegator.endingNonce = nonce; @@ -307,14 +323,23 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager delete $._pendingEndDelegatorMessages[delegationID]; Validator memory validator = _getValidator(validationID); - // The received nonce should be no greater than the highest sent nonce + // The received nonce should be no greater than the highest sent nonce. This should never + // happen since the staking manager is the only entity that can trigger a weight update + // on the P-Chain. require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); - // It should also be greater than or equal to the delegator's ending nonce + + // The nonce should also be greater than or equal to the delegationID's ending nonce. This allows + // a weight update using a higher nonce (which implicitly includes the delegation's weight update) + // to be used to complete delisting for an earlier delegation. This is necessary because the P-Chain + // is only willing to sign the latest weight update. require( $._delegatorStakes[delegationID].endingNonce <= nonce, "PoSValidatorManager: nonce does not match" ); + // Ensure the delegator is pending removed. Since anybody can call this function once + // end delegation has been initialized, we need to make sure that this function is only + // callable after that has been done. require( $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, "PoSValidatorManager: delegation not pending added" diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index aae3b8b3b..d7b7421fe 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -122,7 +122,10 @@ interface IPoSValidatorManager is IValidatorManager { * @notice Completes the delegator registration process by returning 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. + * 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 however that 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. */ @@ -130,7 +133,9 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Begins the process of removing a delegator from a validation period. The delegator must have been previously - * registered with the given validationID. + * registered with the given validationID. For the purposes of computing delegation rewards, the delegation period is + * considered ended when this function is called. In order to be eligible for rewards, an uptime proof must be provided. + * Note that 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 no uptime proof is provided, the validation uptime for the delegation period will be assumed to be 0. @@ -154,7 +159,10 @@ interface IPoSValidatorManager is IValidatorManager { * @notice Completes the process of ending a delegation by receiving an acknowledgement 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 the end of the - * delegator's delegation is valid, as long as that nonce has been sent by the contract. + * 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 however that 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. */ From b8f8f60e1522b3048ccb7857e57e1aa2c9a992ba Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 6 Sep 2024 07:43:09 -0400 Subject: [PATCH 207/545] Update contracts/staking/interfaces/IPoSValidatorManager.sol Signed-off-by: Geoff Stuart --- contracts/staking/interfaces/IPoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index d7b7421fe..987027559 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -124,7 +124,7 @@ interface IPoSValidatorManager is IValidatorManager { * 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 however that only the specified delegation will be marked as registered, even if the validator weight update + * 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. From 99a12a50c06e8328f055a2a55ba83d8c422b1f5a Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 6 Sep 2024 07:43:14 -0400 Subject: [PATCH 208/545] Update contracts/staking/interfaces/IPoSValidatorManager.sol Signed-off-by: Geoff Stuart --- contracts/staking/interfaces/IPoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 987027559..84cc32b3b 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -161,7 +161,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 however that 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. From 1c170e665ee00d6e6b3618400d0dd9a6ab62cf61 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 6 Sep 2024 09:58:22 -0400 Subject: [PATCH 209/545] Fix test --- tests/flows/staking/poa_to_pos.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index 4ec3b6798..fc3345d95 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -149,10 +149,13 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnetAInfo.SubnetID, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + ChurnTrackerStartTime: big.NewInt(0), + ChurnPeriodSeconds: uint64(0), + MaximumChurnPercentage: uint8(0), + MinimumStakeAmount: big.NewInt(1e6), + MaximumStakeAmount: big.NewInt(10e6), + MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), + RewardCalculator: common.Address{}, }, ) Expect(err).Should(BeNil()) From fc99b2ce20067bc4b5e3f12042a83a0a237ffdaf Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 6 Sep 2024 10:24:54 -0400 Subject: [PATCH 210/545] Add tests --- contracts/staking/PoSValidatorManager.sol | 4 + contracts/staking/ValidatorManager.sol | 9 +- .../tests/PoSValidatorManagerTests.t.sol | 97 +++++++++++++------ .../staking/tests/ValidatorManagerTests.t.sol | 9 ++ 4 files changed, 86 insertions(+), 33 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 4d703e6f7..99943006d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -27,8 +27,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 _minimumStakeAmount; /// @notice The maximum amount of stake allowed to be a validator. uint256 _maximumStakeAmount; + /// @notice The total weight of all validators. uint256 _totalWeight; + /// @notice The time at which the churn tracker will start. This is allow networks to bootstrap + /// their validator set without worrying about churn tracking for a set period of time. uint256 _churnTrackerStartTime; + /// @notice The number of seconds after which to reset the churn tracker. uint64 _churnPeriodSeconds; /// @notice The maximum churn rate allowed per churn period. uint8 _maximumChurnPercentage; diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 4f6905cc3..692ed14b6 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -104,10 +104,13 @@ abstract contract ValidatorManager is ) internal nonReentrant returns (bytes32) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - // Ensure the registration expiry is in a valid range. require( - registrationExpiry > block.timestamp && block.timestamp + 2 days > registrationExpiry, - "ValidatorManager: invalid registration expiry" + registrationExpiry > block.timestamp, + "ValidatorManager: registration expiry not in future" + ); + require( + block.timestamp + 2 days > registrationExpiry, + "ValidatorManager: registration expiry too far in future" ); // Ensure the nodeID is not the zero address, and is not already an active validator. diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 652178726..ec78e8525 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -24,9 +24,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { PoSValidatorManager public posValidatorManager; - // Used to create unique validator IDs in {registerValidators} - uint64 public validatorCounter = 0; - event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); event DelegatorAdded( @@ -59,24 +56,23 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce ); - function newNodeID() public returns (bytes32) { - validatorCounter++; - return sha256(new bytes(validatorCounter)); - } - - function registerValidators(uint64 n) public { + function registerValidators(uint64 n) public returns (bytes32[] memory) { + bytes32[] memory validationIDs = new bytes32[](n); for (uint64 i = 0; i < n; i++) { - _setUpCompleteValidatorRegistration({ - nodeID: newNodeID(), + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: _newNodeID(), subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); + validationIDs[i] = validationID; } + return validationIDs; } + // Attempts to register a validator with weight equal to the total weight. function testInvalidChurnRegistration() public { // First registration should work registerValidators(1); @@ -86,34 +82,73 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _beforeSend(DEFAULT_WEIGHT, address(this)); uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); - bytes32 nodeID = newNodeID(); + bytes32 nodeID = _newNodeID(); vm.expectRevert(_formatErrorMessage("maximum hourly churn rate exceeded")); _initializeValidatorRegistrationWithValue( nodeID, DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value ); } - // function testValidChurnRegistration() public { - // // First registration should work - // _setUpCompleteValidatorRegistration({ - // nodeID: sha256(new bytes(1)), - // subnetID: DEFAULT_SUBNET_ID, - // weight: DEFAULT_WEIGHT, - // registrationExpiry: DEFAULT_CHURN_TRACKER_START_TIME + 1 days, - // blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - // registrationTimestamp: DEFAULT_CHURN_TRACKER_START_TIME - 1 - // }); + // Attempts to register a validator with weight equal to the total weight. + function testInvalidChurnEndValidation() public { + // First registration should work + bytes32[] memory validationIDs = registerValidators(1); - // vm.warp(DEFAULT_CHURN_TRACKER_START_TIME + 1); + vm.warp(DEFAULT_CHURN_TRACKER_START_TIME + 1); + vm.expectRevert(_formatErrorMessage("maximum hourly churn rate exceeded")); - // _beforeSend(DEFAULT_WEIGHT, address(this)); - // uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); + // Initialize the end of one of the validators. + _initializeEndValidation(validationIDs[0]); + } + + function testCummulativeChurnRegistration() public { + registerValidators(5); - // vm.expectRevert(_formatErrorMessage("maximum hourly churn rate exceeded")); - // _initializeValidatorRegistrationWithValue( - // sha256(new bytes(2)), DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value - // ); - // } + vm.warp(DEFAULT_CHURN_TRACKER_START_TIME + 1); + + _beforeSend(DEFAULT_WEIGHT, address(this)); + uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); + + // First call after churn tracking start should work + _initializeValidatorRegistrationWithValue( + _newNodeID(), DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value + ); + + bytes32 nodeID = _newNodeID(); // Needs to be called before expectRevert + _beforeSend(DEFAULT_WEIGHT, address(this)); + + // Second call after churn tracking start should fail + vm.expectRevert(_formatErrorMessage("maximum hourly churn rate exceeded")); + _initializeValidatorRegistrationWithValue( + nodeID, DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value + ); + } + + function testCummulativeChurnRegistrationAndEndValidation() public { + bytes32[] memory validationIDs = registerValidators(10); + + vm.warp(DEFAULT_CHURN_TRACKER_START_TIME + 1); + + _beforeSend(DEFAULT_WEIGHT, address(this)); + uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); + + // First call after churn tracking start should work + _initializeValidatorRegistrationWithValue( + _newNodeID(), DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value + ); + + // Initialize the end of one of the validators. + _initializeEndValidation(validationIDs[0]); + + bytes32 nodeID = _newNodeID(); // Needs to be called before expectRevert + _beforeSend(DEFAULT_WEIGHT, address(this)); + + // Second call after churn tracking start should fail + vm.expectRevert(_formatErrorMessage("maximum hourly churn rate exceeded")); + _initializeValidatorRegistrationWithValue( + nodeID, DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value + ); + } function testInitializeEndValidationWithUptimeProof() public { _setUpCompleteValidatorRegistration({ @@ -642,6 +677,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { return posValidatorManager.initializeEndValidation(validationID, false, 0); } + // Initialize a validator registration, without making a call to weightToValue, which is an external + // call that will consume the call to vm.expectRevert and fail the test. function _initializeValidatorRegistrationWithValue( bytes32 nodeID, uint64 registrationExpiry, diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index f78c60473..d198e1005 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -43,6 +43,9 @@ abstract contract ValidatorManagerTest is Test { ValidatorManager public validatorManager; + // Used to create unique validator IDs in {newNodeID} + uint64 public nodeIDCounter = 0; + event ValidationPeriodCreated( bytes32 indexed validationID, bytes32 indexed nodeID, @@ -199,6 +202,11 @@ abstract contract ValidatorManagerTest is Test { validatorManager.completeEndValidation(0); } + function _newNodeID() internal returns (bytes32) { + nodeIDCounter++; + return sha256(new bytes(nodeIDCounter)); + } + function _setUpInitializeValidatorRegistration( bytes32 nodeID, bytes32 subnetID, @@ -225,6 +233,7 @@ abstract contract ValidatorManagerTest is Test { blsPublicKey: blsPublicKey }) ); + vm.warp(registrationExpiry - 1); _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); _beforeSend(weight, address(this)); From fc51cdcb37ecf60949addaffd88741d8fdd743a5 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 6 Sep 2024 10:43:48 -0400 Subject: [PATCH 211/545] lint --- contracts/staking/PoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 99943006d..a4cc6020c 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -29,7 +29,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 _maximumStakeAmount; /// @notice The total weight of all validators. uint256 _totalWeight; - /// @notice The time at which the churn tracker will start. This is allow networks to bootstrap + /// @notice The time at which the churn tracker will start. This is allow networks to bootstrap /// their validator set without worrying about churn tracking for a set period of time. uint256 _churnTrackerStartTime; /// @notice The number of seconds after which to reset the churn tracker. From 03b96a13011f71f173450cd82af98f064fa6b907 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 6 Sep 2024 10:43:54 -0400 Subject: [PATCH 212/545] rename to validatormanager --- .../{staking => validatormanager}/ERC20TokenStakingManager.sol | 0 .../{staking => validatormanager}/ExampleRewardCalculator.sol | 0 .../{staking => validatormanager}/NativeTokenStakingManager.sol | 0 contracts/{staking => validatormanager}/PoAValidatorManager.sol | 0 contracts/{staking => validatormanager}/PoSValidatorManager.sol | 0 contracts/{staking => validatormanager}/README.md | 0 contracts/{staking => validatormanager}/ValidatorManager.sol | 0 contracts/{staking => validatormanager}/ValidatorMessages.sol | 0 .../interfaces/IERC20TokenStakingManager.sol | 0 .../interfaces/INativeTokenStakingManager.sol | 0 .../interfaces/IPoAValidatorManager.sol | 0 .../interfaces/IPoSValidatorManager.sol | 0 .../interfaces/IRewardCalculator.sol | 0 .../interfaces/IValidatorManager.sol | 0 .../tests/ERC20TokenStakingManagerTests.t.sol | 0 .../tests/ExamplesRewardCalculatorTests.t.sol | 0 .../tests/NativeTokenStakingManagerTests.t.sol | 0 .../tests/PoAValidatorManagerTests.t.sol | 0 .../tests/PoSValidatorManagerTests.t.sol | 0 .../tests/ValidatorManagerTests.t.sol | 0 .../tests/ValidatorMessagesTests.t.sol | 0 21 files changed, 0 insertions(+), 0 deletions(-) rename contracts/{staking => validatormanager}/ERC20TokenStakingManager.sol (100%) rename contracts/{staking => validatormanager}/ExampleRewardCalculator.sol (100%) rename contracts/{staking => validatormanager}/NativeTokenStakingManager.sol (100%) rename contracts/{staking => validatormanager}/PoAValidatorManager.sol (100%) rename contracts/{staking => validatormanager}/PoSValidatorManager.sol (100%) rename contracts/{staking => validatormanager}/README.md (100%) rename contracts/{staking => validatormanager}/ValidatorManager.sol (100%) rename contracts/{staking => validatormanager}/ValidatorMessages.sol (100%) rename contracts/{staking => validatormanager}/interfaces/IERC20TokenStakingManager.sol (100%) rename contracts/{staking => validatormanager}/interfaces/INativeTokenStakingManager.sol (100%) rename contracts/{staking => validatormanager}/interfaces/IPoAValidatorManager.sol (100%) rename contracts/{staking => validatormanager}/interfaces/IPoSValidatorManager.sol (100%) rename contracts/{staking => validatormanager}/interfaces/IRewardCalculator.sol (100%) rename contracts/{staking => validatormanager}/interfaces/IValidatorManager.sol (100%) rename contracts/{staking => validatormanager}/tests/ERC20TokenStakingManagerTests.t.sol (100%) rename contracts/{staking => validatormanager}/tests/ExamplesRewardCalculatorTests.t.sol (100%) rename contracts/{staking => validatormanager}/tests/NativeTokenStakingManagerTests.t.sol (100%) rename contracts/{staking => validatormanager}/tests/PoAValidatorManagerTests.t.sol (100%) rename contracts/{staking => validatormanager}/tests/PoSValidatorManagerTests.t.sol (100%) rename contracts/{staking => validatormanager}/tests/ValidatorManagerTests.t.sol (100%) rename contracts/{staking => validatormanager}/tests/ValidatorMessagesTests.t.sol (100%) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/validatormanager/ERC20TokenStakingManager.sol similarity index 100% rename from contracts/staking/ERC20TokenStakingManager.sol rename to contracts/validatormanager/ERC20TokenStakingManager.sol diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/validatormanager/ExampleRewardCalculator.sol similarity index 100% rename from contracts/staking/ExampleRewardCalculator.sol rename to contracts/validatormanager/ExampleRewardCalculator.sol diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/validatormanager/NativeTokenStakingManager.sol similarity index 100% rename from contracts/staking/NativeTokenStakingManager.sol rename to contracts/validatormanager/NativeTokenStakingManager.sol diff --git a/contracts/staking/PoAValidatorManager.sol b/contracts/validatormanager/PoAValidatorManager.sol similarity index 100% rename from contracts/staking/PoAValidatorManager.sol rename to contracts/validatormanager/PoAValidatorManager.sol diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/validatormanager/PoSValidatorManager.sol similarity index 100% rename from contracts/staking/PoSValidatorManager.sol rename to contracts/validatormanager/PoSValidatorManager.sol diff --git a/contracts/staking/README.md b/contracts/validatormanager/README.md similarity index 100% rename from contracts/staking/README.md rename to contracts/validatormanager/README.md diff --git a/contracts/staking/ValidatorManager.sol b/contracts/validatormanager/ValidatorManager.sol similarity index 100% rename from contracts/staking/ValidatorManager.sol rename to contracts/validatormanager/ValidatorManager.sol diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/validatormanager/ValidatorMessages.sol similarity index 100% rename from contracts/staking/ValidatorMessages.sol rename to contracts/validatormanager/ValidatorMessages.sol diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/validatormanager/interfaces/IERC20TokenStakingManager.sol similarity index 100% rename from contracts/staking/interfaces/IERC20TokenStakingManager.sol rename to contracts/validatormanager/interfaces/IERC20TokenStakingManager.sol diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/validatormanager/interfaces/INativeTokenStakingManager.sol similarity index 100% rename from contracts/staking/interfaces/INativeTokenStakingManager.sol rename to contracts/validatormanager/interfaces/INativeTokenStakingManager.sol diff --git a/contracts/staking/interfaces/IPoAValidatorManager.sol b/contracts/validatormanager/interfaces/IPoAValidatorManager.sol similarity index 100% rename from contracts/staking/interfaces/IPoAValidatorManager.sol rename to contracts/validatormanager/interfaces/IPoAValidatorManager.sol diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/validatormanager/interfaces/IPoSValidatorManager.sol similarity index 100% rename from contracts/staking/interfaces/IPoSValidatorManager.sol rename to contracts/validatormanager/interfaces/IPoSValidatorManager.sol diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/validatormanager/interfaces/IRewardCalculator.sol similarity index 100% rename from contracts/staking/interfaces/IRewardCalculator.sol rename to contracts/validatormanager/interfaces/IRewardCalculator.sol diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/validatormanager/interfaces/IValidatorManager.sol similarity index 100% rename from contracts/staking/interfaces/IValidatorManager.sol rename to contracts/validatormanager/interfaces/IValidatorManager.sol diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol similarity index 100% rename from contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol rename to contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/validatormanager/tests/ExamplesRewardCalculatorTests.t.sol similarity index 100% rename from contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol rename to contracts/validatormanager/tests/ExamplesRewardCalculatorTests.t.sol diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol similarity index 100% rename from contracts/staking/tests/NativeTokenStakingManagerTests.t.sol rename to contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/validatormanager/tests/PoAValidatorManagerTests.t.sol similarity index 100% rename from contracts/staking/tests/PoAValidatorManagerTests.t.sol rename to contracts/validatormanager/tests/PoAValidatorManagerTests.t.sol diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/validatormanager/tests/PoSValidatorManagerTests.t.sol similarity index 100% rename from contracts/staking/tests/PoSValidatorManagerTests.t.sol rename to contracts/validatormanager/tests/PoSValidatorManagerTests.t.sol diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/validatormanager/tests/ValidatorManagerTests.t.sol similarity index 100% rename from contracts/staking/tests/ValidatorManagerTests.t.sol rename to contracts/validatormanager/tests/ValidatorManagerTests.t.sol diff --git a/contracts/staking/tests/ValidatorMessagesTests.t.sol b/contracts/validatormanager/tests/ValidatorMessagesTests.t.sol similarity index 100% rename from contracts/staking/tests/ValidatorMessagesTests.t.sol rename to contracts/validatormanager/tests/ValidatorMessagesTests.t.sol From ba44522ce679a643f3e34b774edfbe456b54f529 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 6 Sep 2024 10:45:02 -0400 Subject: [PATCH 213/545] lint --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../go/staking/PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 2 +- contracts/staking/tests/PoSValidatorManagerTests.t.sol | 8 ++++---- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index cf722ad68..39ee65935 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -50,7 +50,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnTrackerStartTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161489a38038061489a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61474d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872fda641461023e578063912de4da14610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613dec565b6102d6565b005b610128610138366004613e27565b610761565b61017b61014b366004613e27565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613e27565b6108bd565b6101b46101af366004613e27565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da366004613e3e565b610940565b6101286101ed366004613e57565b610cc4565b61017b610200366004613e95565b610eb5565b6101b4610213366004613e27565b610ece565b610128610226366004613e27565b610ee2565b610128610239366004613dec565b610f4f565b61017b61024c366004613f40565b610fb9565b61012861025f366004613ff0565b610fde565b610128610272366004613e57565b6110c2565b61017b61028536600461402e565b611262565b610128610298366004613e3e565b611275565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613e27565b611432565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0960205260408120600101545f805160206146a1833981519152918415610328576103258285611501565b90505b5f868152600984016020526040808220815161010081019092528054829060ff16600481111561035a5761035a61404e565b600481111561036b5761036b61404e565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f261404e565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206146c18339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206146c18339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461179d565b600383526001600160401b0342811660a0850152811660e08401525f8981526009870160205260409020835181549293508492829060ff191660018360048111156105005761050061404e565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611811565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190614076565b905061066a8682611922565b5f61067687858461196a565b5f8c8152600b8a01602052604090209091506106928282614119565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016141fa565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff919061422c565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f805160206146e18339815191529291906107a99061409d565b90501180156107db575060035f83815260048301602052604090205460ff1660058111156107d9576107d961404e565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614243565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b8919061422c565b505050565b6108c681611b87565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0b602052604090819020905163ee5b48eb60e01b81525f805160206146a1833981519152916005600160991b019163ee5b48eb9161087891600401614243565b5f61093a64e8d4a51000836142cd565b92915050565b5f805160206146e18339815191525f61095883611c5a565b90505f806109698360400151611e3b565b9150915080156109ce5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115610a0057610a0061404e565b6005811115610a1157610a1161404e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610a9857610a9861404e565b1480610ab65750600182516005811115610ab457610ab461404e565b145b610b155760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610b2a57610b2a61404e565b03610b5157505f8381526003860160205260408120600491610b4c9190613d7d565b610b55565b5060055b6020808301515f9081526005808901909252604081205582908290811115610b7f57610b7f61404e565b90816005811115610b9257610b9261404e565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115610bc657610bc661404e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610c9157610c9161404e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206146a18339815191525f610cdc84611c5a565b90505f80610ced8360400151611fdc565b5091509150610cfb85612217565b5f858152600a850160205260408120610d1391613d7d565b5f610d1d83611811565b9050816001600160401b031681608001516001600160401b03161015610d555760405162461bcd60e51b815260040161043b906142ec565b5f8681526009860160205260409020600201546001600160401b03808416600160c01b909204161115610d9a5760405162461bcd60e51b815260040161043b9061432e565b60015f87815260098701602052604090205460ff166004811115610dc057610dc061404e565b14610e295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600986016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a51000614377565b5f610ed882611811565b60a0015192915050565b610eeb81612217565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a602052604090819020905163ee5b48eb60e01b81525f805160206146a1833981519152916005600160991b019163ee5b48eb9161087891600401614243565b5f805160206146a18339815191525f610f6785611811565b60a001519050610f76816122f0565b806001600160401b0316826002015f828254610f92919061438e565b90915550508315610fa957610fa78584611501565b505b610fb2856124d5565b5050505050565b5f80610fc486612880565b9050610fd285828686612960565b9150505b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611027575080546001600160401b03808416911610155b156110455760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556110708484612dac565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206146a18339815191525f6110da84611c5a565b90505f806110eb8360400151611fdc565b50915091506110f985611b87565b5f858152600b85016020526040812061111191613d7d565b5f61111b83611811565b9050816001600160401b031681608001516001600160401b031610156111535760405162461bcd60e51b815260040161043b906142ec565b5f8681526009860160205260409020600301546001600160401b03808416911611156111915760405162461bcd60e51b815260040161043b9061432e565b60035f87815260098701602052604090205460ff1660048111156111b7576111b761404e565b1461120b5760405162461bcd60e51b815260206004820152603160248201525f805160206146c18339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600986016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61126e833384612dc6565b9392505050565b5f805160206146e18339815191525f61128d83611c5a565b90505f8061129e8360400151611e3b565b91509150806113005760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f8281526002850160205260408120805461131a9061409d565b905011801561134c575060015f83815260048601602052604090205460ff16600581111561134a5761134a61404e565b145b6113685760405162461bcd60e51b815260040161043b906143a1565b5f828152600285016020526040812061138091613d7d565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f805160206146e183398151915292919061147a9061409d565b90501180156114ac575060015f83815260048301602052604090205460ff1660058111156114aa576114aa61404e565b145b6114c85760405162461bcd60e51b815260040161043b906143a1565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614243565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561154c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261157391908101906143f3565b91509150806115d65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611619573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163d919061422c565b8251146116a15760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156117175760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806117268460400151613181565b915091508187146117935760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206147018339815191526020526040812060030180545f805160206146e1833981519152916001600160401b03909116908190846117e2836144c5565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061470183398151915290528390208351918201909352825491925f805160206146e183398151915292829060ff1660058111156118995761189961404e565b60058111156118aa576118aa61404e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614701833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119e3576119a381600161438e565b6119ae906008614377565b5081515f908390839081106119c5576119c56144ea565b60200101906001600160f81b03191690815f1a90535060010161198f565b505f5b6004811015611a46576119fa81600361438e565b611a05906008614377565b6001901c60f81b82611a188360026144fe565b81518110611a2857611a286144ea565b60200101906001600160f81b03191690815f1a9053506001016119e6565b505f5b6020811015611aa857611a5d81601f61438e565b611a68906008614377565b86901c60f81b82611a7a8360066144fe565b81518110611a8a57611a8a6144ea565b60200101906001600160f81b03191690815f1a905350600101611a49565b505f5b6008811015611b1357611abf81600761438e565b611aca906008614377565b6001600160401b038616901c60f81b82611ae58360266144fe565b81518110611af557611af56144ea565b60200101906001600160f81b03191690815f1a905350600101611aab565b505f5b6008811015611b7e57611b2a81600761438e565b611b35906008614377565b6001600160401b038516901c60f81b82611b5083602e6144fe565b81518110611b6057611b606144ea565b60200101906001600160f81b03191690815f1a905350600101611b16565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0b6020526040812080545f805160206146a1833981519152929190611bcf9061409d565b9050118015611c01575060035f83815260098301602052604090205460ff166004811115611bff57611bff61404e565b145b611c565760405162461bcd60e51b815260206004820152603360248201525f805160206146c183398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206146e18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ccf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cf691908101906143f3565b9150915080611d5d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611dc05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611e335760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f808251602714611e5e5760405162461bcd60e51b815260040161043b90614511565b5f805b6002811015611ead57611e7581600161438e565b611e80906008614377565b61ffff16858281518110611e9657611e966144ea565b016020015160f81c901b9190911790600101611e61565b5061ffff811615611ed05760405162461bcd60e51b815260040161043b9061455a565b5f805b6004811015611f2b57611ee781600361438e565b611ef2906008614377565b63ffffffff1686611f048360026144fe565b81518110611f1457611f146144ea565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff8116600214611f525760405162461bcd60e51b815260040161043b9061459d565b5f805b6020811015611fa757611f6981601f61438e565b611f74906008614377565b87611f808360066144fe565b81518110611f9057611f906144ea565b016020015160f81c901b9190911790600101611f55565b505f86602681518110611fbc57611fbc6144ea565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120005760405162461bcd60e51b815260040161043b90614511565b5f805b600281101561204f5761201781600161438e565b612022906008614377565b61ffff16868281518110612038576120386144ea565b016020015160f81c901b9190911790600101612003565b5061ffff8116156120725760405162461bcd60e51b815260040161043b9061455a565b5f805b60048110156120cd5761208981600361438e565b612094906008614377565b63ffffffff16876120a68360026144fe565b815181106120b6576120b66144ea565b016020015160f81c901b9190911790600101612075565b5063ffffffff81166003146120f45760405162461bcd60e51b815260040161043b9061459d565b5f805b60208110156121495761210b81601f61438e565b612116906008614377565b886121228360066144fe565b81518110612132576121326144ea565b016020015160f81c901b91909117906001016120f7565b505f805b60088110156121a85761216181600761438e565b61216c906008614377565b6001600160401b0316896121818360266144fe565b81518110612191576121916144ea565b016020015160f81c901b919091179060010161214d565b505f805b6008811015612207576121c081600761438e565b6121cb906008614377565b6001600160401b03168a6121e083602e6144fe565b815181106121f0576121f06144ea565b016020015160f81c901b91909117906001016121ac565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020526040812080545f805160206146a183398151915292919061225f9061409d565b9050118015612291575060015f83815260098301602052604090205460ff16600481111561228f5761228f61404e565b145b611c565760405162461bcd60e51b815260206004820152603860248201525f805160206146c183398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04545f805160206146a183398151915290600160401b900460ff16158061233957506002810154155b15612342575050565b60038101544290811161235457505050565b6040805160608101825260058401548082526006850154602083015260078501546001600160401b039081169383019390935260048501549192919091169061239d908461438e565b106123c3576001600160401b0384166040820152818152600283015460208201526123e2565b83816040018181516123d591906145e4565b6001600160401b03169052505b5f8160200151826040015160646123f99190614604565b6001600160401b031661240c91906142cd565b600485015490915060ff600160401b909104811690821611156124975760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d20686f7560448201527f726c7920636875726e2072617465206578636565646564000000000000000000606482015260840161043b565b508051600584015560208101516006840155604001516007909201805467ffffffffffffffff19166001600160401b03909316929092179091555050565b5f8181525f8051602061470183398151915260205260408082208151610100810190925280545f805160206146e183398151915293929190829060ff1660058111156125235761252361404e565b60058111156125345761253461404e565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156125bc576125bc61404e565b146126185760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146126925760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff191660018360058111156126d6576126d661404e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127a28461279c8161179d565b5f61196a565b5f85815260038501602052604090209091506127be8282614119565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127eb9085906004016141fa565b6020604051808303815f875af1158015612807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061282b919061422c565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146a18339815191528161289984613359565b90505f6128a58261092a565b83549091506001600160401b038216108015906128cf57508260010154816001600160401b031611155b61292d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b612936816122f0565b806001600160401b0316836002015f82825461295291906144fe565b909155509095945050505050565b5f61296961338f565b5f805160206146e1833981519152426001600160401b0385161180156129a357506001600160401b0384166129a1426202a3006144fe565b115b612a055760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b85612a5c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f86815260058201602052604090205415612aca5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612b315760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b5f80612b786040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506133c6565b5f82815260028601602052604090209193509150612b968282614119565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612bc39085906004016141fa565b6020604051808303815f875af1158015612bdf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c03919061422c565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff19166001836005811115612c8557612c8561404e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612d468361179d565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610fd660015f8051602061472183398151915255565b612db461377e565b612dbd826137c9565b611c5681613837565b5f612dcf61338f565b5f612ddc6101af84613359565b90505f805160206146a18339815191525f612df687611811565b9050600281516005811115612e0d57612e0d61404e565b14612e6c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612e7d91906145e4565b9050612e898882611922565b5f612e938961179d565b90505f898983604051602001612edb9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612efc866122f0565b5f612f088b848661196a565b5f838152600a880160205260409020909150612f248282614119565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f519085906004016141fa565b6020604051808303815f875af1158015612f6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f91919061422c565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876009015f8581526020019081526020015f205f820151815f015f6101000a81548160ff021916908360048111156130405761304061404e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061126e60015f8051602061472183398151915255565b5f808251602e146131a45760405162461bcd60e51b815260040161043b90614511565b5f805b60028110156131f3576131bb81600161438e565b6131c6906008614377565b61ffff168582815181106131dc576131dc6144ea565b016020015160f81c901b91909117906001016131a7565b5061ffff8116156132165760405162461bcd60e51b815260040161043b9061455a565b5f805b60048110156132715761322d81600361438e565b613238906008614377565b63ffffffff168661324a8360026144fe565b8151811061325a5761325a6144ea565b016020015160f81c901b9190911790600101613219565b5063ffffffff81166004146132985760405162461bcd60e51b815260040161043b9061459d565b5f805b60208110156132ed576132af81601f61438e565b6132ba906008614377565b876132c68360066144fe565b815181106132d6576132d66144ea565b016020015160f81c901b919091179060010161329b565b505f805b600881101561334c5761330581600761438e565b613310906008614377565b6001600160401b0316886133258360266144fe565b81518110613335576133356144ea565b016020015160f81c901b91909117906001016132f1565b5090969095509350505050565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906138eb565b5f805160206147218339815191528054600119016133c057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134305760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134a75761346781600161438e565b613472906008614377565b5081515f90839083908110613489576134896144ea565b60200101906001600160f81b03191690815f1a905350600101613453565b505f5b6004811015613505576134be81600361438e565b6134c9906008614377565b505f826134d78360026144fe565b815181106134e7576134e76144ea565b60200101906001600160f81b03191690815f1a9053506001016134aa565b505f5b60208110156135625784518160208110613524576135246144ea565b1a60f81b826135348360066144fe565b81518110613544576135446144ea565b60200101906001600160f81b03191690815f1a905350600101613508565b505f5b60208110156135c25784602001518160208110613584576135846144ea565b1a60f81b826135948360266144fe565b815181106135a4576135a46144ea565b60200101906001600160f81b03191690815f1a905350600101613565565b505f5b6008811015613636576135d981600761438e565b6135e4906008614377565b60ff1685604001516001600160401b0316901c60f81b8282604661360891906144fe565b81518110613618576136186144ea565b60200101906001600160f81b03191690815f1a9053506001016135c5565b505f5b60308110156136a15784608001518181518110613658576136586144ea565b01602001516001600160f81b0319168261367383604e6144fe565b81518110613683576136836144ea565b60200101906001600160f81b03191690815f1a905350600101613639565b505f5b6008811015613713576136b881600761438e565b6136c3906008614377565b60608601516001600160401b0390811691161c60f81b826136e583607e6144fe565b815181106136f5576136f56144ea565b60200101906001600160f81b03191690815f1a9053506001016136a4565b50600281604051613724919061462f565b602060405180830381855afa15801561373f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613762919061422c565b94909350915050565b60015f8051602061472183398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166137c757604051631afcd79f60e31b815260040160405180910390fd5b565b6137d161377e565b6137da81613a4d565b6138346040820135606083013560808401356137fc60c0860160a08701613e95565b61380c60e0870160c08801613e95565b61381d610100880160e0890161464a565b61382f61012089016101008a0161466a565b613a6e565b50565b61383f61377e565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166138cb5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613931573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613955919061422c565b905061396c6001600160a01b038516333086613b68565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139d4919061422c565b9050818111613a3a5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613a44828261438e565b95945050505050565b613a5561377e565b613a5d613bc8565b613a65613bd8565b61383481613be0565b613a7661377e565b5f805160206146a1833981519152969096557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01949094557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03929092557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0480547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0395861617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613bc2908590613c21565b50505050565b613bd061377e565b6137c7613c82565b6137c761377e565b613be861377e565b80355f805160206146e183398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b5f613c356001600160a01b03841683613c8a565b905080515f14158015613c59575080806020019051810190613c579190614685565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b61376b61377e565b606061126e83835f845f80856001600160a01b03168486604051613cae919061462f565b5f6040518083038185875af1925050503d805f8114613ce8576040519150601f19603f3d011682016040523d82523d5f602084013e613ced565b606091505b5091509150611793868383606082613d0d57613d0882613d54565b61126e565b8151158015613d2457506001600160a01b0384163b155b15613d4d57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b508061126e565b805115613d645780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d899061409d565b5f825580601f10613d98575050565b601f0160209004905f5260205f209081019061383491905b80821115613dc3575f8155600101613db0565b5090565b8015158114613834575f80fd5b803563ffffffff81168114613de7575f80fd5b919050565b5f805f60608486031215613dfe575f80fd5b833592506020840135613e1081613dc7565b9150613e1e60408501613dd4565b90509250925092565b5f60208284031215613e37575f80fd5b5035919050565b5f60208284031215613e4e575f80fd5b61126e82613dd4565b5f8060408385031215613e68575f80fd5b613e7183613dd4565b946020939093013593505050565b80356001600160401b0381168114613de7575f80fd5b5f60208284031215613ea5575f80fd5b61126e82613e7f565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613ee457613ee4613eae565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f1257613f12613eae565b604052919050565b5f6001600160401b03821115613f3257613f32613eae565b50601f01601f191660200190565b5f805f8060808587031215613f53575f80fd5b8435935060208501359250613f6a60408601613e7f565b915060608501356001600160401b03811115613f84575f80fd5b8501601f81018713613f94575f80fd5b8035613fa7613fa282613f1a565b613eea565b818152886020838501011115613fbb575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b6001600160a01b0381168114613834575f80fd5b5f80828403610140811215614003575f80fd5b61012080821215614012575f80fd5b849350830135905061402381613fdc565b809150509250929050565b5f806040838503121561403f575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561409657614096614062565b5092915050565b600181811c908216806140b157607f821691505b6020821081036140cf57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156140fa5750805b601f840160051c820191505b81811015610fb2575f8155600101614106565b81516001600160401b0381111561413257614132613eae565b61414681614140845461409d565b846140d5565b602080601f831160018114614179575f84156141625750858301515b5f19600386901b1c1916600185901b1785556141d0565b5f85815260208120601f198616915b828110156141a757888601518255948401946001909101908401614188565b50858210156141c457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156141f25781810151838201526020016141da565b50505f910152565b602081525f82518060208401526142188160408501602087016141d8565b601f01601f19169190910160400192915050565b5f6020828403121561423c575f80fd5b5051919050565b5f60208083525f84546142558161409d565b806020870152604060018084165f81146142765760018114614292576142bf565b60ff19851660408a0152604084151560051b8a010195506142bf565b895f5260205f205f5b858110156142b65781548b820186015290830190880161429b565b8a016040019650505b509398975050505050505050565b5f826142e757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a614062565b8181038181111561093a5761093a614062565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613de781613dc7565b5f8060408385031215614404575f80fd5b82516001600160401b038082111561441a575f80fd5b908401906060828703121561442d575f80fd5b614435613ec2565b8251815260208084015161444881613fdc565b8282015260408401518381111561445d575f80fd5b80850194505087601f850112614471575f80fd5b83519250614481613fa284613f1a565b8381528882858701011115614494575f80fd5b6144a3848383018488016141d8565b806040840152508195506144b88188016143e8565b9450505050509250929050565b5f6001600160401b038083168181036144e0576144e0614062565b6001019392505050565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561093a5761093a614062565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561409657614096614062565b6001600160401b0381811683821602808216919082811461462757614627614062565b505092915050565b5f82516146408184602087016141d8565b9190910192915050565b5f6020828403121561465a575f80fd5b813560ff8116811461126e575f80fd5b5f6020828403121561467a575f80fd5b813561126e81613fdc565b5f60208284031215614695575f80fd5b815161126e81613dc756fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516148fd3803806148fd83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147b08061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872fda641461023e578063912de4da14610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613e4f565b6102d6565b005b610128610138366004613e8a565b610761565b61017b61014b366004613e8a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613e8a565b6108bd565b6101b46101af366004613e8a565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da366004613ea1565b610940565b6101286101ed366004613eba565b610cc4565b61017b610200366004613ef8565b610eb5565b6101b4610213366004613e8a565b610ece565b610128610226366004613e8a565b610ee2565b610128610239366004613e4f565b610f4f565b61017b61024c366004613fa3565b610fb9565b61012861025f366004614053565b610fde565b610128610272366004613eba565b6110c2565b61017b610285366004614091565b611262565b610128610298366004613ea1565b611275565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613e8a565b611432565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0960205260408120600101545f80516020614704833981519152918415610328576103258285611501565b90505b5f868152600984016020526040808220815161010081019092528054829060ff16600481111561035a5761035a6140b1565b600481111561036b5761036b6140b1565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f26140b1565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206147248339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206147248339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461179d565b600383526001600160401b0342811660a0850152811660e08401525f8981526009870160205260409020835181549293508492829060ff19166001836004811115610500576105006140b1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611811565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e91906140d9565b905061066a8682611922565b5f61067687858461196a565b5f8c8152600b8a0160205260409020909150610692828261417c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf90859060040161425d565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff919061428f565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f805160206147448339815191529291906107a990614100565b90501180156107db575060035f83815260048301602052604090205460ff1660058111156107d9576107d96140b1565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016142a6565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b8919061428f565b505050565b6108c681611b87565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0b602052604090819020905163ee5b48eb60e01b81525f80516020614704833981519152916005600160991b019163ee5b48eb91610878916004016142a6565b5f61093a64e8d4a5100083614330565b92915050565b5f805160206147448339815191525f61095883611c5a565b90505f806109698360400151611e3b565b9150915080156109ce5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115610a0057610a006140b1565b6005811115610a1157610a116140b1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610a9857610a986140b1565b1480610ab65750600182516005811115610ab457610ab46140b1565b145b610b155760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610b2a57610b2a6140b1565b03610b5157505f8381526003860160205260408120600491610b4c9190613de0565b610b55565b5060055b6020808301515f9081526005808901909252604081205582908290811115610b7f57610b7f6140b1565b90816005811115610b9257610b926140b1565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115610bc657610bc66140b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610c9157610c916140b1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206147048339815191525f610cdc84611c5a565b90505f80610ced8360400151611fdc565b5091509150610cfb85612217565b5f858152600a850160205260408120610d1391613de0565b5f610d1d83611811565b9050816001600160401b031681608001516001600160401b03161015610d555760405162461bcd60e51b815260040161043b9061434f565b5f8681526009860160205260409020600201546001600160401b03808416600160c01b909204161115610d9a5760405162461bcd60e51b815260040161043b90614391565b60015f87815260098701602052604090205460ff166004811115610dc057610dc06140b1565b14610e295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600986016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a510006143da565b5f610ed882611811565b60a0015192915050565b610eeb81612217565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a602052604090819020905163ee5b48eb60e01b81525f80516020614704833981519152916005600160991b019163ee5b48eb91610878916004016142a6565b5f805160206147048339815191525f610f6785611811565b60a001519050610f76816122f0565b806001600160401b0316826002015f828254610f9291906143f1565b90915550508315610fa957610fa78584611501565b505b610fb2856124c8565b5050505050565b5f80610fc486612873565b9050610fd285828686612953565b9150505b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611027575080546001600160401b03808416911610155b156110455760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556110708484612e0f565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206147048339815191525f6110da84611c5a565b90505f806110eb8360400151611fdc565b50915091506110f985611b87565b5f858152600b85016020526040812061111191613de0565b5f61111b83611811565b9050816001600160401b031681608001516001600160401b031610156111535760405162461bcd60e51b815260040161043b9061434f565b5f8681526009860160205260409020600301546001600160401b03808416911611156111915760405162461bcd60e51b815260040161043b90614391565b60035f87815260098701602052604090205460ff1660048111156111b7576111b76140b1565b1461120b5760405162461bcd60e51b815260206004820152603160248201525f805160206147248339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600986016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61126e833384612e29565b9392505050565b5f805160206147448339815191525f61128d83611c5a565b90505f8061129e8360400151611e3b565b91509150806113005760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f8281526002850160205260408120805461131a90614100565b905011801561134c575060015f83815260048601602052604090205460ff16600581111561134a5761134a6140b1565b145b6113685760405162461bcd60e51b815260040161043b90614404565b5f828152600285016020526040812061138091613de0565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061474483398151915292919061147a90614100565b90501180156114ac575060015f83815260048301602052604090205460ff1660058111156114aa576114aa6140b1565b145b6114c85760405162461bcd60e51b815260040161043b90614404565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016142a6565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561154c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115739190810190614456565b91509150806115d65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611619573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163d919061428f565b8251146116a15760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156117175760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061172684604001516131e4565b915091508187146117935760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206147648339815191526020526040812060030180545f80516020614744833981519152916001600160401b03909116908190846117e283614528565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061476483398151915290528390208351918201909352825491925f8051602061474483398151915292829060ff166005811115611899576118996140b1565b60058111156118aa576118aa6140b1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614764833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119e3576119a38160016143f1565b6119ae9060086143da565b5081515f908390839081106119c5576119c561454d565b60200101906001600160f81b03191690815f1a90535060010161198f565b505f5b6004811015611a46576119fa8160036143f1565b611a059060086143da565b6001901c60f81b82611a18836002614561565b81518110611a2857611a2861454d565b60200101906001600160f81b03191690815f1a9053506001016119e6565b505f5b6020811015611aa857611a5d81601f6143f1565b611a689060086143da565b86901c60f81b82611a7a836006614561565b81518110611a8a57611a8a61454d565b60200101906001600160f81b03191690815f1a905350600101611a49565b505f5b6008811015611b1357611abf8160076143f1565b611aca9060086143da565b6001600160401b038616901c60f81b82611ae5836026614561565b81518110611af557611af561454d565b60200101906001600160f81b03191690815f1a905350600101611aab565b505f5b6008811015611b7e57611b2a8160076143f1565b611b359060086143da565b6001600160401b038516901c60f81b82611b5083602e614561565b81518110611b6057611b6061454d565b60200101906001600160f81b03191690815f1a905350600101611b16565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0b6020526040812080545f80516020614704833981519152929190611bcf90614100565b9050118015611c01575060035f83815260098301602052604090205460ff166004811115611bff57611bff6140b1565b145b611c565760405162461bcd60e51b815260206004820152603360248201525f8051602061472483398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206147448339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ccf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cf69190810190614456565b9150915080611d5d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611dc05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611e335760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f808251602714611e5e5760405162461bcd60e51b815260040161043b90614574565b5f805b6002811015611ead57611e758160016143f1565b611e809060086143da565b61ffff16858281518110611e9657611e9661454d565b016020015160f81c901b9190911790600101611e61565b5061ffff811615611ed05760405162461bcd60e51b815260040161043b906145bd565b5f805b6004811015611f2b57611ee78160036143f1565b611ef29060086143da565b63ffffffff1686611f04836002614561565b81518110611f1457611f1461454d565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff8116600214611f525760405162461bcd60e51b815260040161043b90614600565b5f805b6020811015611fa757611f6981601f6143f1565b611f749060086143da565b87611f80836006614561565b81518110611f9057611f9061454d565b016020015160f81c901b9190911790600101611f55565b505f86602681518110611fbc57611fbc61454d565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120005760405162461bcd60e51b815260040161043b90614574565b5f805b600281101561204f576120178160016143f1565b6120229060086143da565b61ffff168682815181106120385761203861454d565b016020015160f81c901b9190911790600101612003565b5061ffff8116156120725760405162461bcd60e51b815260040161043b906145bd565b5f805b60048110156120cd576120898160036143f1565b6120949060086143da565b63ffffffff16876120a6836002614561565b815181106120b6576120b661454d565b016020015160f81c901b9190911790600101612075565b5063ffffffff81166003146120f45760405162461bcd60e51b815260040161043b90614600565b5f805b60208110156121495761210b81601f6143f1565b6121169060086143da565b88612122836006614561565b815181106121325761213261454d565b016020015160f81c901b91909117906001016120f7565b505f805b60088110156121a8576121618160076143f1565b61216c9060086143da565b6001600160401b031689612181836026614561565b815181106121915761219161454d565b016020015160f81c901b919091179060010161214d565b505f805b6008811015612207576121c08160076143f1565b6121cb9060086143da565b6001600160401b03168a6121e083602e614561565b815181106121f0576121f061454d565b016020015160f81c901b91909117906001016121ac565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020526040812080545f8051602061470483398151915292919061225f90614100565b9050118015612291575060015f83815260098301602052604090205460ff16600481111561228f5761228f6140b1565b145b611c565760405162461bcd60e51b815260206004820152603860248201525f8051602061472483398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04545f8051602061470483398151915290600160401b900460ff16158061233957506002810154155b15612342575050565b60038101544290811161235457505050565b6040805160608101825260058401548082526006850154602083015260078501546001600160401b039081169383019390935260048501549192919091169061239d90846143f1565b106123c3576001600160401b0384166040820152818152600283015460208201526123e2565b83816040018181516123d59190614647565b6001600160401b03169052505b5f8160200151826040015160646123f99190614667565b6001600160401b031661240c9190614330565b600485015490915060ff600160401b9091048116908216111561248a5760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2063687560448201526f1c9b881c985d1948195e18d95959195960821b606482015260840161043b565b508051600584015560208101516006840155604001516007909201805467ffffffffffffffff19166001600160401b03909316929092179091555050565b5f8181525f8051602061476483398151915260205260408082208151610100810190925280545f8051602061474483398151915293929190829060ff166005811115612516576125166140b1565b6005811115612527576125276140b1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156125af576125af6140b1565b1461260b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146126855760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff191660018360058111156126c9576126c96140b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127958461278f8161179d565b5f61196a565b5f85815260038501602052604090209091506127b1828261417c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127de90859060040161425d565b6020604051808303815f875af11580156127fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061281e919061428f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206147048339815191528161288c846133bc565b90505f6128988261092a565b83549091506001600160401b038216108015906128c257508260010154816001600160401b031611155b6129205760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b612929816122f0565b806001600160401b0316836002015f8282546129459190614561565b909155509095945050505050565b5f61295c6133f2565b5f80516020614744833981519152426001600160401b038516116129de5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b0384166129f5426202a300614561565b11612a685760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b85612abf5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f86815260058201602052604090205415612b2d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612b945760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b5f80612bdb6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613429565b5f82815260028601602052604090209193509150612bf9828261417c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c2690859060040161425d565b6020604051808303815f875af1158015612c42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c66919061428f565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff19166001836005811115612ce857612ce86140b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612da98361179d565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610fd660015f8051602061478483398151915255565b612e176137e1565b612e208261382c565b611c568161389a565b5f612e326133f2565b5f612e3f6101af846133bc565b90505f805160206147048339815191525f612e5987611811565b9050600281516005811115612e7057612e706140b1565b14612ecf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612ee09190614647565b9050612eec8882611922565b5f612ef68961179d565b90505f898983604051602001612f3e9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612f5f866122f0565b5f612f6b8b848661196a565b5f838152600a880160205260409020909150612f87828261417c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612fb490859060040161425d565b6020604051808303815f875af1158015612fd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ff4919061428f565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876009015f8581526020019081526020015f205f820151815f015f6101000a81548160ff021916908360048111156130a3576130a36140b1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061126e60015f8051602061478483398151915255565b5f808251602e146132075760405162461bcd60e51b815260040161043b90614574565b5f805b60028110156132565761321e8160016143f1565b6132299060086143da565b61ffff1685828151811061323f5761323f61454d565b016020015160f81c901b919091179060010161320a565b5061ffff8116156132795760405162461bcd60e51b815260040161043b906145bd565b5f805b60048110156132d4576132908160036143f1565b61329b9060086143da565b63ffffffff16866132ad836002614561565b815181106132bd576132bd61454d565b016020015160f81c901b919091179060010161327c565b5063ffffffff81166004146132fb5760405162461bcd60e51b815260040161043b90614600565b5f805b60208110156133505761331281601f6143f1565b61331d9060086143da565b87613329836006614561565b815181106133395761333961454d565b016020015160f81c901b91909117906001016132fe565b505f805b60088110156133af576133688160076143f1565b6133739060086143da565b6001600160401b031688613388836026614561565b815181106133985761339861454d565b016020015160f81c901b9190911790600101613354565b5090969095509350505050565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061394e565b5f8051602061478483398151915280546001190161342357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134935760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561350a576134ca8160016143f1565b6134d59060086143da565b5081515f908390839081106134ec576134ec61454d565b60200101906001600160f81b03191690815f1a9053506001016134b6565b505f5b6004811015613568576135218160036143f1565b61352c9060086143da565b505f8261353a836002614561565b8151811061354a5761354a61454d565b60200101906001600160f81b03191690815f1a90535060010161350d565b505f5b60208110156135c557845181602081106135875761358761454d565b1a60f81b82613597836006614561565b815181106135a7576135a761454d565b60200101906001600160f81b03191690815f1a90535060010161356b565b505f5b602081101561362557846020015181602081106135e7576135e761454d565b1a60f81b826135f7836026614561565b815181106136075761360761454d565b60200101906001600160f81b03191690815f1a9053506001016135c8565b505f5b60088110156136995761363c8160076143f1565b6136479060086143da565b60ff1685604001516001600160401b0316901c60f81b8282604661366b9190614561565b8151811061367b5761367b61454d565b60200101906001600160f81b03191690815f1a905350600101613628565b505f5b603081101561370457846080015181815181106136bb576136bb61454d565b01602001516001600160f81b031916826136d683604e614561565b815181106136e6576136e661454d565b60200101906001600160f81b03191690815f1a90535060010161369c565b505f5b60088110156137765761371b8160076143f1565b6137269060086143da565b60608601516001600160401b0390811691161c60f81b8261374883607e614561565b815181106137585761375861454d565b60200101906001600160f81b03191690815f1a905350600101613707565b506002816040516137879190614692565b602060405180830381855afa1580156137a2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137c5919061428f565b94909350915050565b60015f8051602061478483398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661382a57604051631afcd79f60e31b815260040160405180910390fd5b565b6138346137e1565b61383d81613ab0565b61389760408201356060830135608084013561385f60c0860160a08701613ef8565b61386f60e0870160c08801613ef8565b613880610100880160e089016146ad565b61389261012089016101008a016146cd565b613ad1565b50565b6138a26137e1565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661392e5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613994573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139b8919061428f565b90506139cf6001600160a01b038516333086613bcb565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a13573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a37919061428f565b9050818111613a9d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613aa782826143f1565b95945050505050565b613ab86137e1565b613ac0613c2b565b613ac8613c3b565b61389781613c43565b613ad96137e1565b5f80516020614704833981519152969096557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01949094557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03929092557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0480547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0395861617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613c25908590613c84565b50505050565b613c336137e1565b61382a613ce5565b61382a6137e1565b613c4b6137e1565b80355f8051602061474483398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b5f613c986001600160a01b03841683613ced565b905080515f14158015613cbc575080806020019051810190613cba91906146e8565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6137ce6137e1565b606061126e83835f845f80856001600160a01b03168486604051613d119190614692565b5f6040518083038185875af1925050503d805f8114613d4b576040519150601f19603f3d011682016040523d82523d5f602084013e613d50565b606091505b5091509150611793868383606082613d7057613d6b82613db7565b61126e565b8151158015613d8757506001600160a01b0384163b155b15613db057604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b508061126e565b805115613dc75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613dec90614100565b5f825580601f10613dfb575050565b601f0160209004905f5260205f209081019061389791905b80821115613e26575f8155600101613e13565b5090565b8015158114613897575f80fd5b803563ffffffff81168114613e4a575f80fd5b919050565b5f805f60608486031215613e61575f80fd5b833592506020840135613e7381613e2a565b9150613e8160408501613e37565b90509250925092565b5f60208284031215613e9a575f80fd5b5035919050565b5f60208284031215613eb1575f80fd5b61126e82613e37565b5f8060408385031215613ecb575f80fd5b613ed483613e37565b946020939093013593505050565b80356001600160401b0381168114613e4a575f80fd5b5f60208284031215613f08575f80fd5b61126e82613ee2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613f4757613f47613f11565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f7557613f75613f11565b604052919050565b5f6001600160401b03821115613f9557613f95613f11565b50601f01601f191660200190565b5f805f8060808587031215613fb6575f80fd5b8435935060208501359250613fcd60408601613ee2565b915060608501356001600160401b03811115613fe7575f80fd5b8501601f81018713613ff7575f80fd5b803561400a61400582613f7d565b613f4d565b81815288602083850101111561401e575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b6001600160a01b0381168114613897575f80fd5b5f80828403610140811215614066575f80fd5b61012080821215614075575f80fd5b84935083013590506140868161403f565b809150509250929050565b5f80604083850312156140a2575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140f9576140f96140c5565b5092915050565b600181811c9082168061411457607f821691505b60208210810361413257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c8101602085101561415d5750805b601f840160051c820191505b81811015610fb2575f8155600101614169565b81516001600160401b0381111561419557614195613f11565b6141a9816141a38454614100565b84614138565b602080601f8311600181146141dc575f84156141c55750858301515b5f19600386901b1c1916600185901b178555614233565b5f85815260208120601f198616915b8281101561420a578886015182559484019460019091019084016141eb565b508582101561422757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561425557818101518382015260200161423d565b50505f910152565b602081525f825180602084015261427b81604085016020870161423b565b601f01601f19169190910160400192915050565b5f6020828403121561429f575f80fd5b5051919050565b5f60208083525f84546142b881614100565b806020870152604060018084165f81146142d957600181146142f557614322565b60ff19851660408a0152604084151560051b8a01019550614322565b895f5260205f205f5b858110156143195781548b82018601529083019088016142fe565b8a016040019650505b509398975050505050505050565b5f8261434a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a6140c5565b8181038181111561093a5761093a6140c5565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613e4a81613e2a565b5f8060408385031215614467575f80fd5b82516001600160401b038082111561447d575f80fd5b9084019060608287031215614490575f80fd5b614498613f25565b825181526020808401516144ab8161403f565b828201526040840151838111156144c0575f80fd5b80850194505087601f8501126144d4575f80fd5b835192506144e461400584613f7d565b83815288828587010111156144f7575f80fd5b6145068483830184880161423b565b8060408401525081955061451b81880161444b565b9450505050509250929050565b5f6001600160401b03808316818103614543576145436140c5565b6001019392505050565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561093a5761093a6140c5565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140f9576140f96140c5565b6001600160401b0381811683821602808216919082811461468a5761468a6140c5565b505092915050565b5f82516146a381846020870161423b565b9190910192915050565b5f602082840312156146bd575f80fd5b813560ff8116811461126e575f80fd5b5f602082840312156146dd575f80fd5b813561126e8161403f565b5f602082840312156146f8575f80fd5b815161126e81613e2a56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index e25dce551..40176a1b7 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -50,7 +50,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnTrackerStartTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516144c33803806144c383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143768061014d5f395ff3fe608060405260043610610105575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f4578063b771b3bc14610313578063bee0a03f14610345578063c599e24f14610364578063f40797d714610377575f80fd5b806366435abf146102785780636d0e43fa1461029757806376f78621146102b657806398f3e2b4146102d5575f80fd5b80632e1488ec116100d85780632e1488ec146101c55780632e2194d8146101e4578063467ef06f1461021b5780635297fae61461023a5780636206585614610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063162f1f61146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613a87565b61038a565b005b348015610135575f80fd5b50610128610144366004613ac2565b610815565b348015610154575f80fd5b50610193610163366004613ac2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b3480156101b1575f80fd5b506101286101c0366004613ac2565b610971565b3480156101d0575f80fd5b506101286101df366004613ad9565b6109de565b3480156101ef575f80fd5b506102036101fe366004613ac2565b610ac0565b6040516001600160401b03909116815260200161019d565b348015610226575f80fd5b50610128610235366004613af0565b610ad6565b348015610245575f80fd5b50610128610254366004613b09565b610e5a565b348015610264575f80fd5b50610193610273366004613b47565b61104b565b348015610283575f80fd5b50610203610292366004613ac2565b611064565b3480156102a2575f80fd5b506101286102b1366004613ac2565b611078565b3480156102c1575f80fd5b506101286102d0366004613a87565b6110e5565b3480156102e0575f80fd5b506101286102ef366004613b09565b61114f565b3480156102ff575f80fd5b5061012861030e366004613af0565b6112ef565b34801561031e575f80fd5b5061032d6005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610350575f80fd5b5061012861035f366004613ac2565b6114ac565b610193610372366004613ac2565b61157b565b610193610385366004613bf2565b611587565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0960205260408120600101545f805160206142ca8339815191529184156103dc576103d982856115ab565b90505b5f868152600984016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613c84565b600481111561041f5761041f613c84565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613c84565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206142ea8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206142ea8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f61056784611847565b600383526001600160401b0342811660a0850152811660e08401525f8981526009870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613c84565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610686856118bb565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107129190613cac565b905061071e86826119cc565b5f61072a878584611a14565b5f8c8152600b8a01602052604090209091506107468282613d49565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610773908590600401613e2a565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190613e5c565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f8051602061430a83398151915292919061085d90613cd3565b905011801561088f575060035f83815260048301602052604090205460ff16600581111561088d5761088d613c84565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401613e73565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190613e5c565b505050565b61097a81611c31565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0b602052604090819020905163ee5b48eb60e01b81525f805160206142ca833981519152916005600160991b019163ee5b48eb9161092c91600401613e73565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a27575080546001600160401b03808416911610155b15610a455760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6f83611d04565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610ad064e8d4a5100083613efd565b92915050565b5f8051602061430a8339815191525f610aee83611d18565b90505f80610aff8360400151611ef9565b915091508015610b645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115610b9657610b96613c84565b6005811115610ba757610ba7613c84565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c2e57610c2e613c84565b1480610c4c5750600182516005811115610c4a57610c4a613c84565b145b610cab5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115610cc057610cc0613c84565b03610ce757505f8381526003860160205260408120600491610ce29190613a18565b610ceb565b5060055b6020808301515f9081526005808901909252604081205582908290811115610d1557610d15613c84565b90816005811115610d2857610d28613c84565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115610d5c57610d5c613c84565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e2757610e27613c84565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206142ca8339815191525f610e7284611d18565b90505f80610e83836040015161209a565b5091509150610e91856122d5565b5f858152600a850160205260408120610ea991613a18565b5f610eb3836118bb565b9050816001600160401b031681608001516001600160401b03161015610eeb5760405162461bcd60e51b81526004016104ef90613f1c565b5f8681526009860160205260409020600201546001600160401b03808416600160c01b909204161115610f305760405162461bcd60e51b81526004016104ef90613f5e565b60015f87815260098701602052604090205460ff166004811115610f5657610f56613c84565b14610fbf5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600986016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad06001600160401b03831664e8d4a51000613fa7565b5f61106e826118bb565b60a0015192915050565b611081816122d5565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a602052604090819020905163ee5b48eb60e01b81525f805160206142ca833981519152916005600160991b019163ee5b48eb9161092c91600401613e73565b5f805160206142ca8339815191525f6110fd856118bb565b60a00151905061110c816123ae565b806001600160401b0316826002015f8282546111289190613fbe565b9091555050831561113f5761113d85846115ab565b505b61114885612593565b5050505050565b5f805160206142ca8339815191525f61116784611d18565b90505f80611178836040015161209a565b509150915061118685611c31565b5f858152600b85016020526040812061119e91613a18565b5f6111a8836118bb565b9050816001600160401b031681608001516001600160401b031610156111e05760405162461bcd60e51b81526004016104ef90613f1c565b5f8681526009860160205260409020600301546001600160401b038084169116111561121e5760405162461bcd60e51b81526004016104ef90613f5e565b60035f87815260098701602052604090205460ff16600481111561124457611244613c84565b146112985760405162461bcd60e51b815260206004820152603160248201525f805160206142ea8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f868152600986016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f8051602061430a8339815191525f61130783611d18565b90505f806113188360400151611ef9565b915091508061137a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526002850160205260408120805461139490613cd3565b90501180156113c6575060015f83815260048601602052604090205460ff1660058111156113c4576113c4613c84565b145b6113e25760405162461bcd60e51b81526004016104ef90613fd1565b5f82815260028501602052604081206113fa91613a18565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061430a8339815191529291906114f490613cd3565b9050118015611526575060015f83815260048301602052604090205460ff16600581111561152457611524613c84565b145b6115425760405162461bcd60e51b81526004016104ef90613fd1565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401613e73565b5f610ad082333461293e565b5f8061159234612cf6565b90506115a085828686612dcb565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261161d9190810190614037565b91509150806116805760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e79190613e5c565b82511461174b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156117c15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806117d0846040015161321f565b9150915081871461183d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f8051602061432a8339815191526020526040812060030180545f8051602061430a833981519152916001600160401b039091169081908461188c83614109565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061432a83398151915290528390208351918201909352825491925f8051602061430a83398151915292829060ff16600581111561194357611943613c84565b600581111561195457611954613c84565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061432a833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a8d57611a4d816001613fbe565b611a58906008613fa7565b5081515f90839083908110611a6f57611a6f61412e565b60200101906001600160f81b03191690815f1a905350600101611a39565b505f5b6004811015611af057611aa4816003613fbe565b611aaf906008613fa7565b6001901c60f81b82611ac2836002614142565b81518110611ad257611ad261412e565b60200101906001600160f81b03191690815f1a905350600101611a90565b505f5b6020811015611b5257611b0781601f613fbe565b611b12906008613fa7565b86901c60f81b82611b24836006614142565b81518110611b3457611b3461412e565b60200101906001600160f81b03191690815f1a905350600101611af3565b505f5b6008811015611bbd57611b69816007613fbe565b611b74906008613fa7565b6001600160401b038616901c60f81b82611b8f836026614142565b81518110611b9f57611b9f61412e565b60200101906001600160f81b03191690815f1a905350600101611b55565b505f5b6008811015611c2857611bd4816007613fbe565b611bdf906008613fa7565b6001600160401b038516901c60f81b82611bfa83602e614142565b81518110611c0a57611c0a61412e565b60200101906001600160f81b03191690815f1a905350600101611bc0565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0b6020526040812080545f805160206142ca833981519152929190611c7990613cd3565b9050118015611cab575060035f83815260098301602052604090205460ff166004811115611ca957611ca9613c84565b145b611d005760405162461bcd60e51b815260206004820152603360248201525f805160206142ea83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b5050565b611d0c6133f7565b611d1581613442565b50565b60408051606080820183525f8083526020830181905292820152905f8051602061430a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d8d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611db49190810190614037565b9150915080611e1b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611e7e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611ef15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f808251602714611f1c5760405162461bcd60e51b81526004016104ef90614155565b5f805b6002811015611f6b57611f33816001613fbe565b611f3e906008613fa7565b61ffff16858281518110611f5457611f5461412e565b016020015160f81c901b9190911790600101611f1f565b5061ffff811615611f8e5760405162461bcd60e51b81526004016104ef9061419e565b5f805b6004811015611fe957611fa5816003613fbe565b611fb0906008613fa7565b63ffffffff1686611fc2836002614142565b81518110611fd257611fd261412e565b016020015160f81c901b9190911790600101611f91565b5063ffffffff81166002146120105760405162461bcd60e51b81526004016104ef906141e1565b5f805b60208110156120655761202781601f613fbe565b612032906008613fa7565b8761203e836006614142565b8151811061204e5761204e61412e565b016020015160f81c901b9190911790600101612013565b505f8660268151811061207a5761207a61412e565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120be5760405162461bcd60e51b81526004016104ef90614155565b5f805b600281101561210d576120d5816001613fbe565b6120e0906008613fa7565b61ffff168682815181106120f6576120f661412e565b016020015160f81c901b91909117906001016120c1565b5061ffff8116156121305760405162461bcd60e51b81526004016104ef9061419e565b5f805b600481101561218b57612147816003613fbe565b612152906008613fa7565b63ffffffff1687612164836002614142565b815181106121745761217461412e565b016020015160f81c901b9190911790600101612133565b5063ffffffff81166003146121b25760405162461bcd60e51b81526004016104ef906141e1565b5f805b6020811015612207576121c981601f613fbe565b6121d4906008613fa7565b886121e0836006614142565b815181106121f0576121f061412e565b016020015160f81c901b91909117906001016121b5565b505f805b60088110156122665761221f816007613fbe565b61222a906008613fa7565b6001600160401b03168961223f836026614142565b8151811061224f5761224f61412e565b016020015160f81c901b919091179060010161220b565b505f805b60088110156122c55761227e816007613fbe565b612289906008613fa7565b6001600160401b03168a61229e83602e614142565b815181106122ae576122ae61412e565b016020015160f81c901b919091179060010161226a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020526040812080545f805160206142ca83398151915292919061231d90613cd3565b905011801561234f575060015f83815260098301602052604090205460ff16600481111561234d5761234d613c84565b145b611d005760405162461bcd60e51b815260206004820152603860248201525f805160206142ea83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04545f805160206142ca83398151915290600160401b900460ff1615806123f757506002810154155b15612400575050565b60038101544290811161241257505050565b6040805160608101825260058401548082526006850154602083015260078501546001600160401b039081169383019390935260048501549192919091169061245b9084613fbe565b10612481576001600160401b0384166040820152818152600283015460208201526124a0565b83816040018181516124939190614228565b6001600160401b03169052505b5f8160200151826040015160646124b79190614248565b6001600160401b03166124ca9190613efd565b600485015490915060ff600160401b909104811690821611156125555760405162461bcd60e51b815260206004820152603760248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d20686f7560448201527f726c7920636875726e207261746520657863656564656400000000000000000060648201526084016104ef565b508051600584015560208101516006840155604001516007909201805467ffffffffffffffff19166001600160401b03909316929092179091555050565b5f8181525f8051602061432a83398151915260205260408082208151610100810190925280545f8051602061430a83398151915293929190829060ff1660058111156125e1576125e1613c84565b60058111156125f2576125f2613c84565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561267a5761267a613c84565b146126d65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146127505760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff1916600183600581111561279457612794613c84565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6128608461285a81611847565b5f611a14565b5f858152600385016020526040902090915061287c8282613d49565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128a9908590600401613e2a565b6020604051808303815f875af11580156128c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128e99190613e5c565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6129476134ad565b5f61295183610ac0565b90505f805160206142ca8339815191525f61296b876118bb565b905060028151600581111561298257612982613c84565b146129e15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f838260a001516129f29190614228565b90506129fe88826119cc565b5f612a0889611847565b90505f898983604051602001612a509392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612a71866123ae565b5f612a7d8b8486611a14565b5f838152600a880160205260409020909150612a998282613d49565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ac6908590600401613e2a565b6020604051808303815f875af1158015612ae2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b069190613e5c565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876009015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612bb557612bb5613c84565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506115a460015f8051602061434a83398151915255565b5f5f805160206142ca8339815191528282612d1082610ac0565b83549091506001600160401b03821610801590612d3a57508260010154816001600160401b031611155b612d985760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b612da1816123ae565b806001600160401b0316836002015f828254612dbd9190614142565b909155509095945050505050565b5f612dd46134ad565b5f8051602061430a833981519152426001600160401b038516118015612e0e57506001600160401b038416612e0c426202a300614142565b115b612e705760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104ef565b85612ec75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f86815260058201602052604090205415612f355760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b8251603014612f9c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b5f80612fe36040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134f7565b5f828152600286016020526040902091935091506130018282613d49565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061302e908590600401613e2a565b6020604051808303815f875af115801561304a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061306e9190613e5c565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff191660018360058111156130f0576130f0613c84565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556131b183611847565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061321760015f8051602061434a83398151915255565b949350505050565b5f808251602e146132425760405162461bcd60e51b81526004016104ef90614155565b5f805b600281101561329157613259816001613fbe565b613264906008613fa7565b61ffff1685828151811061327a5761327a61412e565b016020015160f81c901b9190911790600101613245565b5061ffff8116156132b45760405162461bcd60e51b81526004016104ef9061419e565b5f805b600481101561330f576132cb816003613fbe565b6132d6906008613fa7565b63ffffffff16866132e8836002614142565b815181106132f8576132f861412e565b016020015160f81c901b91909117906001016132b7565b5063ffffffff81166004146133365760405162461bcd60e51b81526004016104ef906141e1565b5f805b602081101561338b5761334d81601f613fbe565b613358906008613fa7565b87613364836006614142565b815181106133745761337461412e565b016020015160f81c901b9190911790600101613339565b505f805b60088110156133ea576133a3816007613fbe565b6133ae906008613fa7565b6001600160401b0316886133c3836026614142565b815181106133d3576133d361412e565b016020015160f81c901b919091179060010161338f565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661344057604051631afcd79f60e31b815260040160405180910390fd5b565b61344a6133f7565b6134538161389c565b611d1560408201356060830135608084013561347560c0860160a08701613b47565b61348560e0870160c08801613b47565b613496610100880160e08901614273565b6134a861012089016101008a01614293565b6138bd565b5f8051602061434a8339815191528054600119016134de57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061434a83398151915255565b5f60608260800151516030146135615760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135d857613598816001613fbe565b6135a3906008613fa7565b5081515f908390839081106135ba576135ba61412e565b60200101906001600160f81b03191690815f1a905350600101613584565b505f5b6004811015613636576135ef816003613fbe565b6135fa906008613fa7565b505f82613608836002614142565b815181106136185761361861412e565b60200101906001600160f81b03191690815f1a9053506001016135db565b505f5b602081101561369357845181602081106136555761365561412e565b1a60f81b82613665836006614142565b815181106136755761367561412e565b60200101906001600160f81b03191690815f1a905350600101613639565b505f5b60208110156136f357846020015181602081106136b5576136b561412e565b1a60f81b826136c5836026614142565b815181106136d5576136d561412e565b60200101906001600160f81b03191690815f1a905350600101613696565b505f5b60088110156137675761370a816007613fbe565b613715906008613fa7565b60ff1685604001516001600160401b0316901c60f81b828260466137399190614142565b815181106137495761374961412e565b60200101906001600160f81b03191690815f1a9053506001016136f6565b505f5b60308110156137d257846080015181815181106137895761378961412e565b01602001516001600160f81b031916826137a483604e614142565b815181106137b4576137b461412e565b60200101906001600160f81b03191690815f1a90535060010161376a565b505f5b6008811015613844576137e9816007613fbe565b6137f4906008613fa7565b60608601516001600160401b0390811691161c60f81b8261381683607e614142565b815181106138265761382661412e565b60200101906001600160f81b03191690815f1a9053506001016137d5565b5060028160405161385591906142ae565b602060405180830381855afa158015613870573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138939190613e5c565b94909350915050565b6138a46133f7565b6138ac6139b7565b6138b46139c7565b611d15816139cf565b6138c56133f7565b5f805160206142ca833981519152969096557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01949094557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03929092557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0480547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0395861617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b6139bf6133f7565b613440613a10565b6134406133f7565b6139d76133f7565b80355f8051602061430a83398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b6134e46133f7565b508054613a2490613cd3565b5f825580601f10613a33575050565b601f0160209004905f5260205f2090810190611d1591905b80821115613a5e575f8155600101613a4b565b5090565b8015158114611d15575f80fd5b803563ffffffff81168114613a82575f80fd5b919050565b5f805f60608486031215613a99575f80fd5b833592506020840135613aab81613a62565b9150613ab960408501613a6f565b90509250925092565b5f60208284031215613ad2575f80fd5b5035919050565b5f6101208284031215613aea575f80fd5b50919050565b5f60208284031215613b00575f80fd5b6115a482613a6f565b5f8060408385031215613b1a575f80fd5b613b2383613a6f565b946020939093013593505050565b80356001600160401b0381168114613a82575f80fd5b5f60208284031215613b57575f80fd5b6115a482613b31565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b9657613b96613b60565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613bc457613bc4613b60565b604052919050565b5f6001600160401b03821115613be457613be4613b60565b50601f01601f191660200190565b5f805f60608486031215613c04575f80fd5b83359250613c1460208501613b31565b915060408401356001600160401b03811115613c2e575f80fd5b8401601f81018613613c3e575f80fd5b8035613c51613c4c82613bcc565b613b9c565b818152876020838501011115613c65575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ccc57613ccc613c98565b5092915050565b600181811c90821680613ce757607f821691505b602082108103613aea57634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c81016020851015613d2a5750805b601f840160051c820191505b81811015611148575f8155600101613d36565b81516001600160401b03811115613d6257613d62613b60565b613d7681613d708454613cd3565b84613d05565b602080601f831160018114613da9575f8415613d925750858301515b5f19600386901b1c1916600185901b178555613e00565b5f85815260208120601f198616915b82811015613dd757888601518255948401946001909101908401613db8565b5085821015613df457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613e22578181015183820152602001613e0a565b50505f910152565b602081525f8251806020840152613e48816040850160208701613e08565b601f01601f19169190910160400192915050565b5f60208284031215613e6c575f80fd5b5051919050565b5f60208083525f8454613e8581613cd3565b806020870152604060018084165f8114613ea65760018114613ec257613eef565b60ff19851660408a0152604084151560051b8a01019550613eef565b895f5260205f205f5b85811015613ee65781548b8201860152908301908801613ecb565b8a016040019650505b509398975050505050505050565b5f82613f1757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad057610ad0613c98565b81810381811115610ad057610ad0613c98565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611d15575f80fd5b8051613a8281613a62565b5f8060408385031215614048575f80fd5b82516001600160401b038082111561405e575f80fd5b9084019060608287031215614071575f80fd5b614079613b74565b8251815260208084015161408c81614018565b828201526040840151838111156140a1575f80fd5b80850194505087601f8501126140b5575f80fd5b835192506140c5613c4c84613bcc565b83815288828587010111156140d8575f80fd5b6140e784838301848801613e08565b806040840152508195506140fc81880161402c565b9450505050509250929050565b5f6001600160401b0380831681810361412457614124613c98565b6001019392505050565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad057610ad0613c98565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ccc57613ccc613c98565b6001600160401b0381811683821602808216919082811461426b5761426b613c98565b505092915050565b5f60208284031215614283575f80fd5b813560ff811681146115a4575f80fd5b5f602082840312156142a3575f80fd5b81356115a481614018565b5f82516142bf818460208701613e08565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161452638038061452683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143d98061014d5f395ff3fe608060405260043610610105575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f4578063b771b3bc14610313578063bee0a03f14610345578063c599e24f14610364578063f40797d714610377575f80fd5b806366435abf146102785780636d0e43fa1461029757806376f78621146102b657806398f3e2b4146102d5575f80fd5b80632e1488ec116100d85780632e1488ec146101c55780632e2194d8146101e4578063467ef06f1461021b5780635297fae61461023a5780636206585614610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063162f1f61146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613aea565b61038a565b005b348015610135575f80fd5b50610128610144366004613b25565b610815565b348015610154575f80fd5b50610193610163366004613b25565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b3480156101b1575f80fd5b506101286101c0366004613b25565b610971565b3480156101d0575f80fd5b506101286101df366004613b3c565b6109de565b3480156101ef575f80fd5b506102036101fe366004613b25565b610ac0565b6040516001600160401b03909116815260200161019d565b348015610226575f80fd5b50610128610235366004613b53565b610ad6565b348015610245575f80fd5b50610128610254366004613b6c565b610e5a565b348015610264575f80fd5b50610193610273366004613baa565b61104b565b348015610283575f80fd5b50610203610292366004613b25565b611064565b3480156102a2575f80fd5b506101286102b1366004613b25565b611078565b3480156102c1575f80fd5b506101286102d0366004613aea565b6110e5565b3480156102e0575f80fd5b506101286102ef366004613b6c565b61114f565b3480156102ff575f80fd5b5061012861030e366004613b53565b6112ef565b34801561031e575f80fd5b5061032d6005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610350575f80fd5b5061012861035f366004613b25565b6114ac565b610193610372366004613b25565b61157b565b610193610385366004613c55565b611587565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0960205260408120600101545f8051602061432d8339815191529184156103dc576103d982856115ab565b90505b5f868152600984016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613ce7565b600481111561041f5761041f613ce7565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613ce7565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f8051602061434d8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f8051602061434d8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f61056784611847565b600383526001600160401b0342811660a0850152811660e08401525f8981526009870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613ce7565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610686856118bb565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107129190613d0f565b905061071e86826119cc565b5f61072a878584611a14565b5f8c8152600b8a01602052604090209091506107468282613dac565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610773908590600401613e8d565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190613ebf565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f8051602061436d83398151915292919061085d90613d36565b905011801561088f575060035f83815260048301602052604090205460ff16600581111561088d5761088d613ce7565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401613ed6565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190613ebf565b505050565b61097a81611c31565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0b602052604090819020905163ee5b48eb60e01b81525f8051602061432d833981519152916005600160991b019163ee5b48eb9161092c91600401613ed6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a27575080546001600160401b03808416911610155b15610a455760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6f83611d04565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610ad064e8d4a5100083613f60565b92915050565b5f8051602061436d8339815191525f610aee83611d18565b90505f80610aff8360400151611ef9565b915091508015610b645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115610b9657610b96613ce7565b6005811115610ba757610ba7613ce7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c2e57610c2e613ce7565b1480610c4c5750600182516005811115610c4a57610c4a613ce7565b145b610cab5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115610cc057610cc0613ce7565b03610ce757505f8381526003860160205260408120600491610ce29190613a7b565b610ceb565b5060055b6020808301515f9081526005808901909252604081205582908290811115610d1557610d15613ce7565b90816005811115610d2857610d28613ce7565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115610d5c57610d5c613ce7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e2757610e27613ce7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f8051602061432d8339815191525f610e7284611d18565b90505f80610e83836040015161209a565b5091509150610e91856122d5565b5f858152600a850160205260408120610ea991613a7b565b5f610eb3836118bb565b9050816001600160401b031681608001516001600160401b03161015610eeb5760405162461bcd60e51b81526004016104ef90613f7f565b5f8681526009860160205260409020600201546001600160401b03808416600160c01b909204161115610f305760405162461bcd60e51b81526004016104ef90613fc1565b60015f87815260098701602052604090205460ff166004811115610f5657610f56613ce7565b14610fbf5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600986016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad06001600160401b03831664e8d4a5100061400a565b5f61106e826118bb565b60a0015192915050565b611081816122d5565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a602052604090819020905163ee5b48eb60e01b81525f8051602061432d833981519152916005600160991b019163ee5b48eb9161092c91600401613ed6565b5f8051602061432d8339815191525f6110fd856118bb565b60a00151905061110c816123ae565b806001600160401b0316826002015f8282546111289190614021565b9091555050831561113f5761113d85846115ab565b505b61114885612586565b5050505050565b5f8051602061432d8339815191525f61116784611d18565b90505f80611178836040015161209a565b509150915061118685611c31565b5f858152600b85016020526040812061119e91613a7b565b5f6111a8836118bb565b9050816001600160401b031681608001516001600160401b031610156111e05760405162461bcd60e51b81526004016104ef90613f7f565b5f8681526009860160205260409020600301546001600160401b038084169116111561121e5760405162461bcd60e51b81526004016104ef90613fc1565b60035f87815260098701602052604090205460ff16600481111561124457611244613ce7565b146112985760405162461bcd60e51b815260206004820152603160248201525f8051602061434d8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f868152600986016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f8051602061436d8339815191525f61130783611d18565b90505f806113188360400151611ef9565b915091508061137a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526002850160205260408120805461139490613d36565b90501180156113c6575060015f83815260048601602052604090205460ff1660058111156113c4576113c4613ce7565b145b6113e25760405162461bcd60e51b81526004016104ef90614034565b5f82815260028501602052604081206113fa91613a7b565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061436d8339815191529291906114f490613d36565b9050118015611526575060015f83815260048301602052604090205460ff16600581111561152457611524613ce7565b145b6115425760405162461bcd60e51b81526004016104ef90614034565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401613ed6565b5f610ad0823334612931565b5f8061159234612ce9565b90506115a085828686612dbe565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261161d919081019061409a565b91509150806116805760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e79190613ebf565b82511461174b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156117c15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806117d08460400151613282565b9150915081871461183d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f8051602061438d8339815191526020526040812060030180545f8051602061436d833981519152916001600160401b039091169081908461188c8361416c565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061438d83398151915290528390208351918201909352825491925f8051602061436d83398151915292829060ff16600581111561194357611943613ce7565b600581111561195457611954613ce7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061438d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a8d57611a4d816001614021565b611a5890600861400a565b5081515f90839083908110611a6f57611a6f614191565b60200101906001600160f81b03191690815f1a905350600101611a39565b505f5b6004811015611af057611aa4816003614021565b611aaf90600861400a565b6001901c60f81b82611ac28360026141a5565b81518110611ad257611ad2614191565b60200101906001600160f81b03191690815f1a905350600101611a90565b505f5b6020811015611b5257611b0781601f614021565b611b1290600861400a565b86901c60f81b82611b248360066141a5565b81518110611b3457611b34614191565b60200101906001600160f81b03191690815f1a905350600101611af3565b505f5b6008811015611bbd57611b69816007614021565b611b7490600861400a565b6001600160401b038616901c60f81b82611b8f8360266141a5565b81518110611b9f57611b9f614191565b60200101906001600160f81b03191690815f1a905350600101611b55565b505f5b6008811015611c2857611bd4816007614021565b611bdf90600861400a565b6001600160401b038516901c60f81b82611bfa83602e6141a5565b81518110611c0a57611c0a614191565b60200101906001600160f81b03191690815f1a905350600101611bc0565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0b6020526040812080545f8051602061432d833981519152929190611c7990613d36565b9050118015611cab575060035f83815260098301602052604090205460ff166004811115611ca957611ca9613ce7565b145b611d005760405162461bcd60e51b815260206004820152603360248201525f8051602061434d83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b5050565b611d0c61345a565b611d15816134a5565b50565b60408051606080820183525f8083526020830181905292820152905f8051602061436d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d8d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611db4919081019061409a565b9150915080611e1b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611e7e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611ef15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f808251602714611f1c5760405162461bcd60e51b81526004016104ef906141b8565b5f805b6002811015611f6b57611f33816001614021565b611f3e90600861400a565b61ffff16858281518110611f5457611f54614191565b016020015160f81c901b9190911790600101611f1f565b5061ffff811615611f8e5760405162461bcd60e51b81526004016104ef90614201565b5f805b6004811015611fe957611fa5816003614021565b611fb090600861400a565b63ffffffff1686611fc28360026141a5565b81518110611fd257611fd2614191565b016020015160f81c901b9190911790600101611f91565b5063ffffffff81166002146120105760405162461bcd60e51b81526004016104ef90614244565b5f805b60208110156120655761202781601f614021565b61203290600861400a565b8761203e8360066141a5565b8151811061204e5761204e614191565b016020015160f81c901b9190911790600101612013565b505f8660268151811061207a5761207a614191565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120be5760405162461bcd60e51b81526004016104ef906141b8565b5f805b600281101561210d576120d5816001614021565b6120e090600861400a565b61ffff168682815181106120f6576120f6614191565b016020015160f81c901b91909117906001016120c1565b5061ffff8116156121305760405162461bcd60e51b81526004016104ef90614201565b5f805b600481101561218b57612147816003614021565b61215290600861400a565b63ffffffff16876121648360026141a5565b8151811061217457612174614191565b016020015160f81c901b9190911790600101612133565b5063ffffffff81166003146121b25760405162461bcd60e51b81526004016104ef90614244565b5f805b6020811015612207576121c981601f614021565b6121d490600861400a565b886121e08360066141a5565b815181106121f0576121f0614191565b016020015160f81c901b91909117906001016121b5565b505f805b60088110156122665761221f816007614021565b61222a90600861400a565b6001600160401b03168961223f8360266141a5565b8151811061224f5761224f614191565b016020015160f81c901b919091179060010161220b565b505f805b60088110156122c55761227e816007614021565b61228990600861400a565b6001600160401b03168a61229e83602e6141a5565b815181106122ae576122ae614191565b016020015160f81c901b919091179060010161226a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020526040812080545f8051602061432d83398151915292919061231d90613d36565b905011801561234f575060015f83815260098301602052604090205460ff16600481111561234d5761234d613ce7565b145b611d005760405162461bcd60e51b815260206004820152603860248201525f8051602061434d83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04545f8051602061432d83398151915290600160401b900460ff1615806123f757506002810154155b15612400575050565b60038101544290811161241257505050565b6040805160608101825260058401548082526006850154602083015260078501546001600160401b039081169383019390935260048501549192919091169061245b9084614021565b10612481576001600160401b0384166040820152818152600283015460208201526124a0565b8381604001818151612493919061428b565b6001600160401b03169052505b5f8160200151826040015160646124b791906142ab565b6001600160401b03166124ca9190613f60565b600485015490915060ff600160401b909104811690821611156125485760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2063687560448201526f1c9b881c985d1948195e18d95959195960821b60648201526084016104ef565b508051600584015560208101516006840155604001516007909201805467ffffffffffffffff19166001600160401b03909316929092179091555050565b5f8181525f8051602061438d83398151915260205260408082208151610100810190925280545f8051602061436d83398151915293929190829060ff1660058111156125d4576125d4613ce7565b60058111156125e5576125e5613ce7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561266d5761266d613ce7565b146126c95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146127435760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff1916600183600581111561278757612787613ce7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6128538461284d81611847565b5f611a14565b5f858152600385016020526040902090915061286f8282613dac565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061289c908590600401613e8d565b6020604051808303815f875af11580156128b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128dc9190613ebf565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61293a613510565b5f61294483610ac0565b90505f8051602061432d8339815191525f61295e876118bb565b905060028151600581111561297557612975613ce7565b146129d45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f838260a001516129e5919061428b565b90506129f188826119cc565b5f6129fb89611847565b90505f898983604051602001612a439392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612a64866123ae565b5f612a708b8486611a14565b5f838152600a880160205260409020909150612a8c8282613dac565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ab9908590600401613e8d565b6020604051808303815f875af1158015612ad5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af99190613ebf565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876009015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612ba857612ba8613ce7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506115a460015f805160206143ad83398151915255565b5f5f8051602061432d8339815191528282612d0382610ac0565b83549091506001600160401b03821610801590612d2d57508260010154816001600160401b031611155b612d8b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b612d94816123ae565b806001600160401b0316836002015f828254612db091906141a5565b909155509095945050505050565b5f612dc7613510565b5f8051602061436d833981519152426001600160401b03851611612e495760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612e60426202a3006141a5565b11612ed35760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612f2a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f86815260058201602052604090205415612f985760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b8251603014612fff5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b5f806130466040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061355a565b5f828152600286016020526040902091935091506130648282613dac565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613091908590600401613e8d565b6020604051808303815f875af11580156130ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130d19190613ebf565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff1916600183600581111561315357613153613ce7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561321483611847565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061327a60015f805160206143ad83398151915255565b949350505050565b5f808251602e146132a55760405162461bcd60e51b81526004016104ef906141b8565b5f805b60028110156132f4576132bc816001614021565b6132c790600861400a565b61ffff168582815181106132dd576132dd614191565b016020015160f81c901b91909117906001016132a8565b5061ffff8116156133175760405162461bcd60e51b81526004016104ef90614201565b5f805b60048110156133725761332e816003614021565b61333990600861400a565b63ffffffff168661334b8360026141a5565b8151811061335b5761335b614191565b016020015160f81c901b919091179060010161331a565b5063ffffffff81166004146133995760405162461bcd60e51b81526004016104ef90614244565b5f805b60208110156133ee576133b081601f614021565b6133bb90600861400a565b876133c78360066141a5565b815181106133d7576133d7614191565b016020015160f81c901b919091179060010161339c565b505f805b600881101561344d57613406816007614021565b61341190600861400a565b6001600160401b0316886134268360266141a5565b8151811061343657613436614191565b016020015160f81c901b91909117906001016133f2565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166134a357604051631afcd79f60e31b815260040160405180910390fd5b565b6134ad61345a565b6134b6816138ff565b611d156040820135606083013560808401356134d860c0860160a08701613baa565b6134e860e0870160c08801613baa565b6134f9610100880160e089016142d6565b61350b61012089016101008a016142f6565b613920565b5f805160206143ad83398151915280546001190161354157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206143ad83398151915255565b5f60608260800151516030146135c45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561363b576135fb816001614021565b61360690600861400a565b5081515f9083908390811061361d5761361d614191565b60200101906001600160f81b03191690815f1a9053506001016135e7565b505f5b600481101561369957613652816003614021565b61365d90600861400a565b505f8261366b8360026141a5565b8151811061367b5761367b614191565b60200101906001600160f81b03191690815f1a90535060010161363e565b505f5b60208110156136f657845181602081106136b8576136b8614191565b1a60f81b826136c88360066141a5565b815181106136d8576136d8614191565b60200101906001600160f81b03191690815f1a90535060010161369c565b505f5b6020811015613756578460200151816020811061371857613718614191565b1a60f81b826137288360266141a5565b8151811061373857613738614191565b60200101906001600160f81b03191690815f1a9053506001016136f9565b505f5b60088110156137ca5761376d816007614021565b61377890600861400a565b60ff1685604001516001600160401b0316901c60f81b8282604661379c91906141a5565b815181106137ac576137ac614191565b60200101906001600160f81b03191690815f1a905350600101613759565b505f5b603081101561383557846080015181815181106137ec576137ec614191565b01602001516001600160f81b0319168261380783604e6141a5565b8151811061381757613817614191565b60200101906001600160f81b03191690815f1a9053506001016137cd565b505f5b60088110156138a75761384c816007614021565b61385790600861400a565b60608601516001600160401b0390811691161c60f81b8261387983607e6141a5565b8151811061388957613889614191565b60200101906001600160f81b03191690815f1a905350600101613838565b506002816040516138b89190614311565b602060405180830381855afa1580156138d3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138f69190613ebf565b94909350915050565b61390761345a565b61390f613a1a565b613917613a2a565b611d1581613a32565b61392861345a565b5f8051602061432d833981519152969096557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01949094557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03929092557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0480547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0395861617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b613a2261345a565b6134a3613a73565b6134a361345a565b613a3a61345a565b80355f8051602061436d83398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b61354761345a565b508054613a8790613d36565b5f825580601f10613a96575050565b601f0160209004905f5260205f2090810190611d1591905b80821115613ac1575f8155600101613aae565b5090565b8015158114611d15575f80fd5b803563ffffffff81168114613ae5575f80fd5b919050565b5f805f60608486031215613afc575f80fd5b833592506020840135613b0e81613ac5565b9150613b1c60408501613ad2565b90509250925092565b5f60208284031215613b35575f80fd5b5035919050565b5f6101208284031215613b4d575f80fd5b50919050565b5f60208284031215613b63575f80fd5b6115a482613ad2565b5f8060408385031215613b7d575f80fd5b613b8683613ad2565b946020939093013593505050565b80356001600160401b0381168114613ae5575f80fd5b5f60208284031215613bba575f80fd5b6115a482613b94565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bf957613bf9613bc3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c2757613c27613bc3565b604052919050565b5f6001600160401b03821115613c4757613c47613bc3565b50601f01601f191660200190565b5f805f60608486031215613c67575f80fd5b83359250613c7760208501613b94565b915060408401356001600160401b03811115613c91575f80fd5b8401601f81018613613ca1575f80fd5b8035613cb4613caf82613c2f565b613bff565b818152876020838501011115613cc8575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613d2f57613d2f613cfb565b5092915050565b600181811c90821680613d4a57607f821691505b602082108103613b4d57634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c81016020851015613d8d5750805b601f840160051c820191505b81811015611148575f8155600101613d99565b81516001600160401b03811115613dc557613dc5613bc3565b613dd981613dd38454613d36565b84613d68565b602080601f831160018114613e0c575f8415613df55750858301515b5f19600386901b1c1916600185901b178555613e63565b5f85815260208120601f198616915b82811015613e3a57888601518255948401946001909101908401613e1b565b5085821015613e5757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613e85578181015183820152602001613e6d565b50505f910152565b602081525f8251806020840152613eab816040850160208701613e6b565b601f01601f19169190910160400192915050565b5f60208284031215613ecf575f80fd5b5051919050565b5f60208083525f8454613ee881613d36565b806020870152604060018084165f8114613f095760018114613f2557613f52565b60ff19851660408a0152604084151560051b8a01019550613f52565b895f5260205f205f5b85811015613f495781548b8201860152908301908801613f2e565b8a016040019650505b509398975050505050505050565b5f82613f7a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad057610ad0613cfb565b81810381811115610ad057610ad0613cfb565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611d15575f80fd5b8051613ae581613ac5565b5f80604083850312156140ab575f80fd5b82516001600160401b03808211156140c1575f80fd5b90840190606082870312156140d4575f80fd5b6140dc613bd7565b825181526020808401516140ef8161407b565b82820152604084015183811115614104575f80fd5b80850194505087601f850112614118575f80fd5b83519250614128613caf84613c2f565b838152888285870101111561413b575f80fd5b61414a84838301848801613e6b565b8060408401525081955061415f81880161408f565b9450505050509250929050565b5f6001600160401b0380831681810361418757614187613cfb565b6001019392505050565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad057610ad0613cfb565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613d2f57613d2f613cfb565b6001600160401b038181168382160280821691908281146142ce576142ce613cfb565b505092915050565b5f602082840312156142e6575f80fd5b813560ff811681146115a4575f80fd5b5f60208284031215614306575f80fd5b81356115a48161407b565b5f8251614322818460208701613e6b565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 199367fe4..070d6c69f 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -38,7 +38,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161293038038061293083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6127e38061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063f2fde38b14610219578063f3e148eb1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd36600461219c565b61023f565b005b6101226100f236600461219c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612260565b6103a0565b6100e2610156366004612303565b6103c0565b61016e61016936600461219c565b610744565b6040516001600160401b03909116815260200161012c565b6100e2610758565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e036600461219c565b61076b565b6100e26101f3366004612303565b610777565b6101ba6005600160991b0181565b6100e261021436600461219c565b610934565b6100e2610227366004612341565b610a03565b6100e261023a36600461235c565b610a3d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f805160206127b783398151915292919061028790612398565b90501180156102b9575060035f83815260048301602052604090205460ff1660058111156102b7576102b76123d0565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016123e4565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b919061246e565b505050565b5f6103a9610b4b565b6103b584868585610ba6565b90505b949350505050565b5f805160206127b78339815191525f6103d883611005565b90505f806103e983604001516111e6565b91509150801561044e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115610480576104806123d0565b6005811115610491576104916123d0565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610518576105186123d0565b14806105365750600182516005811115610534576105346123d0565b145b6105955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b6003825160058111156105aa576105aa6123d0565b036105d157505f83815260038601602052604081206004916105cc9190612152565b6105d5565b5060055b6020808301515f90815260058089019092526040812055829082908111156105ff576105ff6123d0565b90816005811115610612576106126123d0565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115610646576106466123d0565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610711576107116123d0565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61074e82611445565b60a0015192915050565b610760610b4b565b6107695f611569565b565b610774816115d9565b50565b5f805160206127b78339815191525f61078f83611005565b90505f806107a083604001516111e6565b91509150806108025760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f8281526002850160205260408120805461081c90612398565b905011801561084e575060015f83815260048601602052604090205460ff16600581111561084c5761084c6123d0565b145b61086a5760405162461bcd60e51b815260040161031990612485565b5f828152600285016020526040812061088291612152565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f805160206127b783398151915292919061097c90612398565b90501180156109ae575060015f83815260048301602052604090205460ff1660058111156109ac576109ac6123d0565b145b6109ca5760405162461bcd60e51b815260040161031990612485565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016123e4565b610a0b610b4b565b6001600160a01b038116610a3457604051631e4fbdf760e01b81525f6004820152602401610319565b61077481611569565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a815750825b90505f826001600160401b03166001148015610a9c5750303b155b905081158015610aaa575080155b15610ac85760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610af257845460ff60401b1916600160401b1785555b610afc8787611997565b8315610b4257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b33610b7d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107695760405163118cdaa760e01b8152336004820152602401610319565b5f610baf6119b5565b5f805160206127b7833981519152426001600160401b038516118015610be957506001600160401b038416610be7426202a3006124e0565b115b610c4b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b85610ca25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f86815260058201602052604090205415610d105760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610d775760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b5f80610dbe6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506119ff565b5f82815260028601602052604090209193509150610ddc8282612544565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610e09908590600401612625565b6020604051808303815f875af1158015610e25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e49919061246e565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff19166001836005811115610ecb57610ecb6123d0565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610f8c83611da4565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f805160206127b78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561107a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110a19190810190612666565b91509150806111085760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b825482511461116b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b0316156111de5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f80825160271461124b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b600281101561129a57611262816001612738565b61126d90600861274b565b61ffff1685828151811061128357611283612762565b016020015160f81c901b919091179060010161124e565b5061ffff8116156112f95760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b600481101561135457611310816003612738565b61131b90600861274b565b63ffffffff168661132d8360026124e0565b8151811061133d5761133d612762565b016020015160f81c901b91909117906001016112fc565b5063ffffffff81166002146113bb5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b6020811015611410576113d281601f612738565b6113dd90600861274b565b876113e98360066124e0565b815181106113f9576113f9612762565b016020015160f81c901b91909117906001016113be565b505f8660268151811061142557611425612762565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0490528390208351918201909352825491925f805160206127b783398151915292829060ff1660058111156114e0576114e06123d0565b60058111156114f1576114f16123d0565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0460205260408082208151610100810190925280545f805160206127b783398151915293929190829060ff16600581111561163a5761163a6123d0565b600581111561164b5761164b6123d0565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156116d3576116d36123d0565b1461172f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146117a95760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff191660018360058111156117ed576117ed6123d0565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6118b9846118b381611da4565b5f611e51565b5f85815260038501602052604090209091506118d58282612544565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611902908590600401612625565b6020604051808303815f875af115801561191e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611942919061246e565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61199f61206e565b6119a8826120b7565b6119b1816120d8565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016119f957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6060826080015151603014611a695760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611ae057611aa0816001612738565b611aab90600861274b565b5081515f90839083908110611ac257611ac2612762565b60200101906001600160f81b03191690815f1a905350600101611a8c565b505f5b6004811015611b3e57611af7816003612738565b611b0290600861274b565b505f82611b108360026124e0565b81518110611b2057611b20612762565b60200101906001600160f81b03191690815f1a905350600101611ae3565b505f5b6020811015611b9b5784518160208110611b5d57611b5d612762565b1a60f81b82611b6d8360066124e0565b81518110611b7d57611b7d612762565b60200101906001600160f81b03191690815f1a905350600101611b41565b505f5b6020811015611bfb5784602001518160208110611bbd57611bbd612762565b1a60f81b82611bcd8360266124e0565b81518110611bdd57611bdd612762565b60200101906001600160f81b03191690815f1a905350600101611b9e565b505f5b6008811015611c6f57611c12816007612738565b611c1d90600861274b565b60ff1685604001516001600160401b0316901c60f81b82826046611c4191906124e0565b81518110611c5157611c51612762565b60200101906001600160f81b03191690815f1a905350600101611bfe565b505f5b6030811015611cda5784608001518181518110611c9157611c91612762565b01602001516001600160f81b03191682611cac83604e6124e0565b81518110611cbc57611cbc612762565b60200101906001600160f81b03191690815f1a905350600101611c72565b505f5b6008811015611d4c57611cf1816007612738565b611cfc90600861274b565b60608601516001600160401b0390811691161c60f81b82611d1e83607e6124e0565b81518110611d2e57611d2e612762565b60200101906001600160f81b03191690815f1a905350600101611cdd565b50600281604051611d5d9190612776565b602060405180830381855afa158015611d78573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611d9b919061246e565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040812060030180545f805160206127b7833981519152916001600160401b0390911690819084611dfc83612791565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611eca57611e8a816001612738565b611e9590600861274b565b5081515f90839083908110611eac57611eac612762565b60200101906001600160f81b03191690815f1a905350600101611e76565b505f5b6004811015611f2d57611ee1816003612738565b611eec90600861274b565b6001901c60f81b82611eff8360026124e0565b81518110611f0f57611f0f612762565b60200101906001600160f81b03191690815f1a905350600101611ecd565b505f5b6020811015611f8f57611f4481601f612738565b611f4f90600861274b565b86901c60f81b82611f618360066124e0565b81518110611f7157611f71612762565b60200101906001600160f81b03191690815f1a905350600101611f30565b505f5b6008811015611ffa57611fa6816007612738565b611fb190600861274b565b6001600160401b038616901c60f81b82611fcc8360266124e0565b81518110611fdc57611fdc612762565b60200101906001600160f81b03191690815f1a905350600101611f92565b505f5b600881101561206557612011816007612738565b61201c90600861274b565b6001600160401b038516901c60f81b8261203783602e6124e0565b8151811061204757612047612762565b60200101906001600160f81b03191690815f1a905350600101611ffd565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661076957604051631afcd79f60e31b815260040160405180910390fd5b6120bf61206e565b6120c76120e9565b6120cf6120f9565b61077481612101565b6120e061206e565b61077481612142565b6120f161206e565b61076961214a565b61076961206e565b61210961206e565b80355f805160206127b783398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b610a0b61206e565b611e2b61206e565b50805461215e90612398565b5f825580601f1061216d575050565b601f0160209004905f5260205f209081019061077491905b80821115612198575f8155600101612185565b5090565b5f602082840312156121ac575f80fd5b5035919050565b80356001600160401b03811681146121c9575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612204576122046121ce565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612232576122326121ce565b604052919050565b5f6001600160401b03821115612252576122526121ce565b50601f01601f191660200190565b5f805f8060808587031215612273575f80fd5b61227c856121b3565b935060208501359250612291604086016121b3565b915060608501356001600160401b038111156122ab575f80fd5b8501601f810187136122bb575f80fd5b80356122ce6122c98261223a565b61220a565b8181528860208385010111156122e2575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612313575f80fd5b813563ffffffff81168114612326575f80fd5b9392505050565b6001600160a01b0381168114610774575f80fd5b5f60208284031215612351575f80fd5b81356123268161232d565b5f80828403606081121561236e575f80fd5b604081121561237b575f80fd5b50829150604083013561238d8161232d565b809150509250929050565b600181811c908216806123ac57607f821691505b6020821081036123ca57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f84546123f681612398565b806020870152604060018084165f8114612417576001811461243357612460565b60ff19851660408a0152604084151560051b8a01019550612460565b895f5260205f205f5b858110156124575781548b820186015290830190880161243c565b8a016040019650505b509398975050505050505050565b5f6020828403121561247e575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156124f3576124f36124cc565b92915050565b601f82111561039b57805f5260205f20601f840160051c8101602085101561251e5750805b601f840160051c820191505b8181101561253d575f815560010161252a565b5050505050565b81516001600160401b0381111561255d5761255d6121ce565b6125718161256b8454612398565b846124f9565b602080601f8311600181146125a4575f841561258d5750858301515b5f19600386901b1c1916600185901b1785556125fb565b5f85815260208120601f198616915b828110156125d2578886015182559484019460019091019084016125b3565b50858210156125ef57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561261d578181015183820152602001612605565b50505f910152565b602081525f8251806020840152612643816040850160208701612603565b601f01601f19169190910160400192915050565b805180151581146121c9575f80fd5b5f8060408385031215612677575f80fd5b82516001600160401b038082111561268d575f80fd5b90840190606082870312156126a0575f80fd5b6126a86121e2565b825181526020808401516126bb8161232d565b828201526040840151838111156126d0575f80fd5b80850194505087601f8501126126e4575f80fd5b835192506126f46122c98461223a565b8381528882858701011115612707575f80fd5b61271684838301848801612603565b8060408401525081955061272b818801612657565b9450505050509250929050565b818103818111156124f3576124f36124cc565b80820281158282048414176124f3576124f36124cc565b634e487b7160e01b5f52603260045260245ffd5b5f8251612787818460208701612603565b9190910192915050565b5f6001600160401b038083168181036127ac576127ac6124cc565b600101939250505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516129a03803806129a083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6128538061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063f2fde38b14610219578063f3e148eb1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd36600461220c565b61023f565b005b6101226100f236600461220c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b6101226101433660046122d0565b6103a0565b6100e2610156366004612373565b6103c0565b61016e61016936600461220c565b610744565b6040516001600160401b03909116815260200161012c565b6100e2610758565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e036600461220c565b61076b565b6100e26101f3366004612373565b610777565b6101ba6005600160991b0181565b6100e261021436600461220c565b610934565b6100e26102273660046123b1565b610a03565b6100e261023a3660046123cc565b610a3d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f8051602061282783398151915292919061028790612408565b90501180156102b9575060035f83815260048301602052604090205460ff1660058111156102b7576102b7612440565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b9190600401612454565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b91906124de565b505050565b5f6103a9610b4b565b6103b584868585610ba6565b90505b949350505050565b5f805160206128278339815191525f6103d883611075565b90505f806103e98360400151611256565b91509150801561044e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600485016020526040808220815161010081019092528054829060ff16600581111561048057610480612440565b600581111561049157610491612440565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f908251600581111561051857610518612440565b1480610536575060018251600581111561053457610534612440565b145b6105955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b6003825160058111156105aa576105aa612440565b036105d157505f83815260038601602052604081206004916105cc91906121c2565b6105d5565b5060055b6020808301515f90815260058089019092526040812055829082908111156105ff576105ff612440565b9081600581111561061257610612612440565b9052505f84815260048701602052604090208251815484929190829060ff1916600183600581111561064657610646612440565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561071157610711612440565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61074e826114b5565b60a0015192915050565b610760610b4b565b6107695f6115d9565b565b61077481611649565b50565b5f805160206128278339815191525f61078f83611075565b90505f806107a08360400151611256565b91509150806108025760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f8281526002850160205260408120805461081c90612408565b905011801561084e575060015f83815260048601602052604090205460ff16600581111561084c5761084c612440565b145b61086a5760405162461bcd60e51b8152600401610319906124f5565b5f8281526002850160205260408120610882916121c2565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061282783398151915292919061097c90612408565b90501180156109ae575060015f83815260048301602052604090205460ff1660058111156109ac576109ac612440565b145b6109ca5760405162461bcd60e51b8152600401610319906124f5565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b9190600401612454565b610a0b610b4b565b6001600160a01b038116610a3457604051631e4fbdf760e01b81525f6004820152602401610319565b610774816115d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a815750825b90505f826001600160401b03166001148015610a9c5750303b155b905081158015610aaa575080155b15610ac85760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610af257845460ff60401b1916600160401b1785555b610afc8787611a07565b8315610b4257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b33610b7d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107695760405163118cdaa760e01b8152336004820152602401610319565b5f610baf611a25565b5f80516020612827833981519152426001600160401b03851611610c315760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610319565b6001600160401b038416610c48426202a300612550565b11610cbb5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610319565b85610d125760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f86815260058201602052604090205415610d805760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610de75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b5f80610e2e6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611a6f565b5f82815260028601602052604090209193509150610e4c82826125b4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610e79908590600401612695565b6020604051808303815f875af1158015610e95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb991906124de565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff19166001836005811115610f3b57610f3b612440565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610ffc83611e14565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f805160206128278339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156110ea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261111191908101906126d6565b91509150806111785760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146111db5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b03161561124e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146112bb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b600281101561130a576112d28160016127a8565b6112dd9060086127bb565b61ffff168582815181106112f3576112f36127d2565b016020015160f81c901b91909117906001016112be565b5061ffff8116156113695760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b60048110156113c4576113808160036127a8565b61138b9060086127bb565b63ffffffff168661139d836002612550565b815181106113ad576113ad6127d2565b016020015160f81c901b919091179060010161136c565b5063ffffffff811660021461142b5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b60208110156114805761144281601f6127a8565b61144d9060086127bb565b87611459836006612550565b81518110611469576114696127d2565b016020015160f81c901b919091179060010161142e565b505f86602681518110611495576114956127d2565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0490528390208351918201909352825491925f8051602061282783398151915292829060ff16600581111561155057611550612440565b600581111561156157611561612440565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0460205260408082208151610100810190925280545f8051602061282783398151915293929190829060ff1660058111156116aa576116aa612440565b60058111156116bb576116bb612440565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561174357611743612440565b1461179f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146118195760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff1916600183600581111561185d5761185d612440565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6119298461192381611e14565b5f611ec1565b5f858152600385016020526040902090915061194582826125b4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611972908590600401612695565b6020604051808303815f875af115801561198e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b291906124de565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b611a0f6120de565b611a1882612127565b611a2181612148565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a6957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6060826080015151603014611ad95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611b5057611b108160016127a8565b611b1b9060086127bb565b5081515f90839083908110611b3257611b326127d2565b60200101906001600160f81b03191690815f1a905350600101611afc565b505f5b6004811015611bae57611b678160036127a8565b611b729060086127bb565b505f82611b80836002612550565b81518110611b9057611b906127d2565b60200101906001600160f81b03191690815f1a905350600101611b53565b505f5b6020811015611c0b5784518160208110611bcd57611bcd6127d2565b1a60f81b82611bdd836006612550565b81518110611bed57611bed6127d2565b60200101906001600160f81b03191690815f1a905350600101611bb1565b505f5b6020811015611c6b5784602001518160208110611c2d57611c2d6127d2565b1a60f81b82611c3d836026612550565b81518110611c4d57611c4d6127d2565b60200101906001600160f81b03191690815f1a905350600101611c0e565b505f5b6008811015611cdf57611c828160076127a8565b611c8d9060086127bb565b60ff1685604001516001600160401b0316901c60f81b82826046611cb19190612550565b81518110611cc157611cc16127d2565b60200101906001600160f81b03191690815f1a905350600101611c6e565b505f5b6030811015611d4a5784608001518181518110611d0157611d016127d2565b01602001516001600160f81b03191682611d1c83604e612550565b81518110611d2c57611d2c6127d2565b60200101906001600160f81b03191690815f1a905350600101611ce2565b505f5b6008811015611dbc57611d618160076127a8565b611d6c9060086127bb565b60608601516001600160401b0390811691161c60f81b82611d8e83607e612550565b81518110611d9e57611d9e6127d2565b60200101906001600160f81b03191690815f1a905350600101611d4d565b50600281604051611dcd91906127e6565b602060405180830381855afa158015611de8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611e0b91906124de565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040812060030180545f80516020612827833981519152916001600160401b0390911690819084611e6c83612801565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611f3a57611efa8160016127a8565b611f059060086127bb565b5081515f90839083908110611f1c57611f1c6127d2565b60200101906001600160f81b03191690815f1a905350600101611ee6565b505f5b6004811015611f9d57611f518160036127a8565b611f5c9060086127bb565b6001901c60f81b82611f6f836002612550565b81518110611f7f57611f7f6127d2565b60200101906001600160f81b03191690815f1a905350600101611f3d565b505f5b6020811015611fff57611fb481601f6127a8565b611fbf9060086127bb565b86901c60f81b82611fd1836006612550565b81518110611fe157611fe16127d2565b60200101906001600160f81b03191690815f1a905350600101611fa0565b505f5b600881101561206a576120168160076127a8565b6120219060086127bb565b6001600160401b038616901c60f81b8261203c836026612550565b8151811061204c5761204c6127d2565b60200101906001600160f81b03191690815f1a905350600101612002565b505f5b60088110156120d5576120818160076127a8565b61208c9060086127bb565b6001600160401b038516901c60f81b826120a783602e612550565b815181106120b7576120b76127d2565b60200101906001600160f81b03191690815f1a90535060010161206d565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661076957604051631afcd79f60e31b815260040160405180910390fd5b61212f6120de565b612137612159565b61213f612169565b61077481612171565b6121506120de565b610774816121b2565b6121616120de565b6107696121ba565b6107696120de565b6121796120de565b80355f8051602061282783398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b610a0b6120de565b611e9b6120de565b5080546121ce90612408565b5f825580601f106121dd575050565b601f0160209004905f5260205f209081019061077491905b80821115612208575f81556001016121f5565b5090565b5f6020828403121561221c575f80fd5b5035919050565b80356001600160401b0381168114612239575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156122745761227461223e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156122a2576122a261223e565b604052919050565b5f6001600160401b038211156122c2576122c261223e565b50601f01601f191660200190565b5f805f80608085870312156122e3575f80fd5b6122ec85612223565b93506020850135925061230160408601612223565b915060608501356001600160401b0381111561231b575f80fd5b8501601f8101871361232b575f80fd5b803561233e612339826122aa565b61227a565b818152886020838501011115612352575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612383575f80fd5b813563ffffffff81168114612396575f80fd5b9392505050565b6001600160a01b0381168114610774575f80fd5b5f602082840312156123c1575f80fd5b81356123968161239d565b5f8082840360608112156123de575f80fd5b60408112156123eb575f80fd5b5082915060408301356123fd8161239d565b809150509250929050565b600181811c9082168061241c57607f821691505b60208210810361243a57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f845461246681612408565b806020870152604060018084165f811461248757600181146124a3576124d0565b60ff19851660408a0152604084151560051b8a010195506124d0565b895f5260205f205f5b858110156124c75781548b82018601529083019088016124ac565b8a016040019650505b509398975050505050505050565b5f602082840312156124ee575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156125635761256361253c565b92915050565b601f82111561039b57805f5260205f20601f840160051c8101602085101561258e5750805b601f840160051c820191505b818110156125ad575f815560010161259a565b5050505050565b81516001600160401b038111156125cd576125cd61223e565b6125e1816125db8454612408565b84612569565b602080601f831160018114612614575f84156125fd5750858301515b5f19600386901b1c1916600185901b17855561266b565b5f85815260208120601f198616915b8281101561264257888601518255948401946001909101908401612623565b508582101561265f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561268d578181015183820152602001612675565b50505f910152565b602081525f82518060208401526126b3816040850160208701612673565b601f01601f19169190910160400192915050565b80518015158114612239575f80fd5b5f80604083850312156126e7575f80fd5b82516001600160401b03808211156126fd575f80fd5b9084019060608287031215612710575f80fd5b612718612252565b8251815260208084015161272b8161239d565b82820152604084015183811115612740575f80fd5b80850194505087601f850112612754575f80fd5b83519250612764612339846122aa565b8381528882858701011115612777575f80fd5b61278684838301848801612673565b8060408401525081955061279b8188016126c7565b9450505050509250929050565b818103818111156125635761256361253c565b80820281158282048414176125635761256361253c565b634e487b7160e01b5f52603260045260245ffd5b5f82516127f7818460208701612673565b9190910192915050565b5f6001600160401b0380831681810361281c5761281c61253c565b600101939250505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index a4cc6020c..313832d94 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -207,7 +207,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint8 churnPercentage = uint8((churnTracker.churnAmount * 100) / churnTracker.initialWeight); require( churnPercentage <= $._maximumChurnPercentage, - "PoSValidatorManager: maximum hourly churn rate exceeded" + "PoSValidatorManager: maximum churn rate exceeded" ); $._churnTracker = churnTracker; } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index ec78e8525..472e4b152 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -83,7 +83,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); bytes32 nodeID = _newNodeID(); - vm.expectRevert(_formatErrorMessage("maximum hourly churn rate exceeded")); + vm.expectRevert(_formatErrorMessage("maximum churn rate exceeded")); _initializeValidatorRegistrationWithValue( nodeID, DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value ); @@ -95,7 +95,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32[] memory validationIDs = registerValidators(1); vm.warp(DEFAULT_CHURN_TRACKER_START_TIME + 1); - vm.expectRevert(_formatErrorMessage("maximum hourly churn rate exceeded")); + vm.expectRevert(_formatErrorMessage("maximum churn rate exceeded")); // Initialize the end of one of the validators. _initializeEndValidation(validationIDs[0]); @@ -118,7 +118,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _beforeSend(DEFAULT_WEIGHT, address(this)); // Second call after churn tracking start should fail - vm.expectRevert(_formatErrorMessage("maximum hourly churn rate exceeded")); + vm.expectRevert(_formatErrorMessage("maximum churn rate exceeded")); _initializeValidatorRegistrationWithValue( nodeID, DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value ); @@ -144,7 +144,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _beforeSend(DEFAULT_WEIGHT, address(this)); // Second call after churn tracking start should fail - vm.expectRevert(_formatErrorMessage("maximum hourly churn rate exceeded")); + vm.expectRevert(_formatErrorMessage("maximum churn rate exceeded")); _initializeValidatorRegistrationWithValue( nodeID, DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value ); From 50ce58795f4d58ef62e8d08007ca871d4f23abd8 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 6 Sep 2024 10:45:20 -0400 Subject: [PATCH 214/545] validatormanager bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 0 .../NativeTokenStakingManager/NativeTokenStakingManager.go | 0 .../PoAValidatorManager/PoAValidatorManager.go | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename abi-bindings/go/{staking => validatormanager}/ERC20TokenStakingManager/ERC20TokenStakingManager.go (100%) rename abi-bindings/go/{staking => validatormanager}/NativeTokenStakingManager/NativeTokenStakingManager.go (100%) rename abi-bindings/go/{staking => validatormanager}/PoAValidatorManager/PoAValidatorManager.go (100%) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validatormanager/ERC20TokenStakingManager/ERC20TokenStakingManager.go similarity index 100% rename from abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go rename to abi-bindings/go/validatormanager/ERC20TokenStakingManager/ERC20TokenStakingManager.go diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validatormanager/NativeTokenStakingManager/NativeTokenStakingManager.go similarity index 100% rename from abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go rename to abi-bindings/go/validatormanager/NativeTokenStakingManager/NativeTokenStakingManager.go diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/validatormanager/PoAValidatorManager/PoAValidatorManager.go similarity index 100% rename from abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go rename to abi-bindings/go/validatormanager/PoAValidatorManager/PoAValidatorManager.go From 1ea4bfc0b4659b021f2f4c284a18527e57268311 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 6 Sep 2024 10:56:30 -0400 Subject: [PATCH 215/545] natspec style review comment Co-authored-by: minghinmatthewlam Signed-off-by: F. Eugene Aumson --- contracts/staking/ValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 8abb485f3..d70b145fd 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -269,7 +269,7 @@ abstract contract ValidatorManager is * 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 + * @return The Validator instance representing the completed validation period */ function _completeEndValidation(uint32 messageIndex) internal returns (Validator memory) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); From daa99b8eede529274731ef2396f168754c3459dc Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 6 Sep 2024 11:09:34 -0400 Subject: [PATCH 216/545] Move total weight tracking to ValidatorManager --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 13 +++---------- contracts/staking/ValidatorManager.sol | 14 ++++++++++++++ 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 39ee65935..9b8887014 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -50,7 +50,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnTrackerStartTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516148fd3803806148fd83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147b08061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872fda641461023e578063912de4da14610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613e4f565b6102d6565b005b610128610138366004613e8a565b610761565b61017b61014b366004613e8a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613e8a565b6108bd565b6101b46101af366004613e8a565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da366004613ea1565b610940565b6101286101ed366004613eba565b610cc4565b61017b610200366004613ef8565b610eb5565b6101b4610213366004613e8a565b610ece565b610128610226366004613e8a565b610ee2565b610128610239366004613e4f565b610f4f565b61017b61024c366004613fa3565b610fb9565b61012861025f366004614053565b610fde565b610128610272366004613eba565b6110c2565b61017b610285366004614091565b611262565b610128610298366004613ea1565b611275565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613e8a565b611432565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0960205260408120600101545f80516020614704833981519152918415610328576103258285611501565b90505b5f868152600984016020526040808220815161010081019092528054829060ff16600481111561035a5761035a6140b1565b600481111561036b5761036b6140b1565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f26140b1565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206147248339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206147248339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461179d565b600383526001600160401b0342811660a0850152811660e08401525f8981526009870160205260409020835181549293508492829060ff19166001836004811115610500576105006140b1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611811565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e91906140d9565b905061066a8682611922565b5f61067687858461196a565b5f8c8152600b8a0160205260409020909150610692828261417c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf90859060040161425d565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff919061428f565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f805160206147448339815191529291906107a990614100565b90501180156107db575060035f83815260048301602052604090205460ff1660058111156107d9576107d96140b1565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016142a6565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b8919061428f565b505050565b6108c681611b87565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0b602052604090819020905163ee5b48eb60e01b81525f80516020614704833981519152916005600160991b019163ee5b48eb91610878916004016142a6565b5f61093a64e8d4a5100083614330565b92915050565b5f805160206147448339815191525f61095883611c5a565b90505f806109698360400151611e3b565b9150915080156109ce5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115610a0057610a006140b1565b6005811115610a1157610a116140b1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610a9857610a986140b1565b1480610ab65750600182516005811115610ab457610ab46140b1565b145b610b155760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610b2a57610b2a6140b1565b03610b5157505f8381526003860160205260408120600491610b4c9190613de0565b610b55565b5060055b6020808301515f9081526005808901909252604081205582908290811115610b7f57610b7f6140b1565b90816005811115610b9257610b926140b1565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115610bc657610bc66140b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610c9157610c916140b1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206147048339815191525f610cdc84611c5a565b90505f80610ced8360400151611fdc565b5091509150610cfb85612217565b5f858152600a850160205260408120610d1391613de0565b5f610d1d83611811565b9050816001600160401b031681608001516001600160401b03161015610d555760405162461bcd60e51b815260040161043b9061434f565b5f8681526009860160205260409020600201546001600160401b03808416600160c01b909204161115610d9a5760405162461bcd60e51b815260040161043b90614391565b60015f87815260098701602052604090205460ff166004811115610dc057610dc06140b1565b14610e295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600986016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a510006143da565b5f610ed882611811565b60a0015192915050565b610eeb81612217565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a602052604090819020905163ee5b48eb60e01b81525f80516020614704833981519152916005600160991b019163ee5b48eb91610878916004016142a6565b5f805160206147048339815191525f610f6785611811565b60a001519050610f76816122f0565b806001600160401b0316826002015f828254610f9291906143f1565b90915550508315610fa957610fa78584611501565b505b610fb2856124c8565b5050505050565b5f80610fc486612873565b9050610fd285828686612953565b9150505b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611027575080546001600160401b03808416911610155b156110455760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556110708484612e0f565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206147048339815191525f6110da84611c5a565b90505f806110eb8360400151611fdc565b50915091506110f985611b87565b5f858152600b85016020526040812061111191613de0565b5f61111b83611811565b9050816001600160401b031681608001516001600160401b031610156111535760405162461bcd60e51b815260040161043b9061434f565b5f8681526009860160205260409020600301546001600160401b03808416911611156111915760405162461bcd60e51b815260040161043b90614391565b60035f87815260098701602052604090205460ff1660048111156111b7576111b76140b1565b1461120b5760405162461bcd60e51b815260206004820152603160248201525f805160206147248339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600986016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61126e833384612e29565b9392505050565b5f805160206147448339815191525f61128d83611c5a565b90505f8061129e8360400151611e3b565b91509150806113005760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f8281526002850160205260408120805461131a90614100565b905011801561134c575060015f83815260048601602052604090205460ff16600581111561134a5761134a6140b1565b145b6113685760405162461bcd60e51b815260040161043b90614404565b5f828152600285016020526040812061138091613de0565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061474483398151915292919061147a90614100565b90501180156114ac575060015f83815260048301602052604090205460ff1660058111156114aa576114aa6140b1565b145b6114c85760405162461bcd60e51b815260040161043b90614404565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016142a6565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561154c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115739190810190614456565b91509150806115d65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611619573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061163d919061428f565b8251146116a15760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156117175760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061172684604001516131e4565b915091508187146117935760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206147648339815191526020526040812060030180545f80516020614744833981519152916001600160401b03909116908190846117e283614528565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061476483398151915290528390208351918201909352825491925f8051602061474483398151915292829060ff166005811115611899576118996140b1565b60058111156118aa576118aa6140b1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614764833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119e3576119a38160016143f1565b6119ae9060086143da565b5081515f908390839081106119c5576119c561454d565b60200101906001600160f81b03191690815f1a90535060010161198f565b505f5b6004811015611a46576119fa8160036143f1565b611a059060086143da565b6001901c60f81b82611a18836002614561565b81518110611a2857611a2861454d565b60200101906001600160f81b03191690815f1a9053506001016119e6565b505f5b6020811015611aa857611a5d81601f6143f1565b611a689060086143da565b86901c60f81b82611a7a836006614561565b81518110611a8a57611a8a61454d565b60200101906001600160f81b03191690815f1a905350600101611a49565b505f5b6008811015611b1357611abf8160076143f1565b611aca9060086143da565b6001600160401b038616901c60f81b82611ae5836026614561565b81518110611af557611af561454d565b60200101906001600160f81b03191690815f1a905350600101611aab565b505f5b6008811015611b7e57611b2a8160076143f1565b611b359060086143da565b6001600160401b038516901c60f81b82611b5083602e614561565b81518110611b6057611b6061454d565b60200101906001600160f81b03191690815f1a905350600101611b16565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0b6020526040812080545f80516020614704833981519152929190611bcf90614100565b9050118015611c01575060035f83815260098301602052604090205460ff166004811115611bff57611bff6140b1565b145b611c565760405162461bcd60e51b815260206004820152603360248201525f8051602061472483398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206147448339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ccf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cf69190810190614456565b9150915080611d5d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611dc05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611e335760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f808251602714611e5e5760405162461bcd60e51b815260040161043b90614574565b5f805b6002811015611ead57611e758160016143f1565b611e809060086143da565b61ffff16858281518110611e9657611e9661454d565b016020015160f81c901b9190911790600101611e61565b5061ffff811615611ed05760405162461bcd60e51b815260040161043b906145bd565b5f805b6004811015611f2b57611ee78160036143f1565b611ef29060086143da565b63ffffffff1686611f04836002614561565b81518110611f1457611f1461454d565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff8116600214611f525760405162461bcd60e51b815260040161043b90614600565b5f805b6020811015611fa757611f6981601f6143f1565b611f749060086143da565b87611f80836006614561565b81518110611f9057611f9061454d565b016020015160f81c901b9190911790600101611f55565b505f86602681518110611fbc57611fbc61454d565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120005760405162461bcd60e51b815260040161043b90614574565b5f805b600281101561204f576120178160016143f1565b6120229060086143da565b61ffff168682815181106120385761203861454d565b016020015160f81c901b9190911790600101612003565b5061ffff8116156120725760405162461bcd60e51b815260040161043b906145bd565b5f805b60048110156120cd576120898160036143f1565b6120949060086143da565b63ffffffff16876120a6836002614561565b815181106120b6576120b661454d565b016020015160f81c901b9190911790600101612075565b5063ffffffff81166003146120f45760405162461bcd60e51b815260040161043b90614600565b5f805b60208110156121495761210b81601f6143f1565b6121169060086143da565b88612122836006614561565b815181106121325761213261454d565b016020015160f81c901b91909117906001016120f7565b505f805b60088110156121a8576121618160076143f1565b61216c9060086143da565b6001600160401b031689612181836026614561565b815181106121915761219161454d565b016020015160f81c901b919091179060010161214d565b505f805b6008811015612207576121c08160076143f1565b6121cb9060086143da565b6001600160401b03168a6121e083602e614561565b815181106121f0576121f061454d565b016020015160f81c901b91909117906001016121ac565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020526040812080545f8051602061470483398151915292919061225f90614100565b9050118015612291575060015f83815260098301602052604090205460ff16600481111561228f5761228f6140b1565b145b611c565760405162461bcd60e51b815260206004820152603860248201525f8051602061472483398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04545f8051602061470483398151915290600160401b900460ff16158061233957506002810154155b15612342575050565b60038101544290811161235457505050565b6040805160608101825260058401548082526006850154602083015260078501546001600160401b039081169383019390935260048501549192919091169061239d90846143f1565b106123c3576001600160401b0384166040820152818152600283015460208201526123e2565b83816040018181516123d59190614647565b6001600160401b03169052505b5f8160200151826040015160646123f99190614667565b6001600160401b031661240c9190614330565b600485015490915060ff600160401b9091048116908216111561248a5760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2063687560448201526f1c9b881c985d1948195e18d95959195960821b606482015260840161043b565b508051600584015560208101516006840155604001516007909201805467ffffffffffffffff19166001600160401b03909316929092179091555050565b5f8181525f8051602061476483398151915260205260408082208151610100810190925280545f8051602061474483398151915293929190829060ff166005811115612516576125166140b1565b6005811115612527576125276140b1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156125af576125af6140b1565b1461260b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146126855760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff191660018360058111156126c9576126c96140b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127958461278f8161179d565b5f61196a565b5f85815260038501602052604090209091506127b1828261417c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127de90859060040161425d565b6020604051808303815f875af11580156127fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061281e919061428f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206147048339815191528161288c846133bc565b90505f6128988261092a565b83549091506001600160401b038216108015906128c257508260010154816001600160401b031611155b6129205760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b612929816122f0565b806001600160401b0316836002015f8282546129459190614561565b909155509095945050505050565b5f61295c6133f2565b5f80516020614744833981519152426001600160401b038516116129de5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b0384166129f5426202a300614561565b11612a685760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b85612abf5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f86815260058201602052604090205415612b2d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612b945760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b5f80612bdb6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613429565b5f82815260028601602052604090209193509150612bf9828261417c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c2690859060040161425d565b6020604051808303815f875af1158015612c42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c66919061428f565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff19166001836005811115612ce857612ce86140b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612da98361179d565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610fd660015f8051602061478483398151915255565b612e176137e1565b612e208261382c565b611c568161389a565b5f612e326133f2565b5f612e3f6101af846133bc565b90505f805160206147048339815191525f612e5987611811565b9050600281516005811115612e7057612e706140b1565b14612ecf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612ee09190614647565b9050612eec8882611922565b5f612ef68961179d565b90505f898983604051602001612f3e9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612f5f866122f0565b5f612f6b8b848661196a565b5f838152600a880160205260409020909150612f87828261417c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612fb490859060040161425d565b6020604051808303815f875af1158015612fd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ff4919061428f565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876009015f8581526020019081526020015f205f820151815f015f6101000a81548160ff021916908360048111156130a3576130a36140b1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061126e60015f8051602061478483398151915255565b5f808251602e146132075760405162461bcd60e51b815260040161043b90614574565b5f805b60028110156132565761321e8160016143f1565b6132299060086143da565b61ffff1685828151811061323f5761323f61454d565b016020015160f81c901b919091179060010161320a565b5061ffff8116156132795760405162461bcd60e51b815260040161043b906145bd565b5f805b60048110156132d4576132908160036143f1565b61329b9060086143da565b63ffffffff16866132ad836002614561565b815181106132bd576132bd61454d565b016020015160f81c901b919091179060010161327c565b5063ffffffff81166004146132fb5760405162461bcd60e51b815260040161043b90614600565b5f805b60208110156133505761331281601f6143f1565b61331d9060086143da565b87613329836006614561565b815181106133395761333961454d565b016020015160f81c901b91909117906001016132fe565b505f805b60088110156133af576133688160076143f1565b6133739060086143da565b6001600160401b031688613388836026614561565b815181106133985761339861454d565b016020015160f81c901b9190911790600101613354565b5090969095509350505050565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061394e565b5f8051602061478483398151915280546001190161342357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134935760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561350a576134ca8160016143f1565b6134d59060086143da565b5081515f908390839081106134ec576134ec61454d565b60200101906001600160f81b03191690815f1a9053506001016134b6565b505f5b6004811015613568576135218160036143f1565b61352c9060086143da565b505f8261353a836002614561565b8151811061354a5761354a61454d565b60200101906001600160f81b03191690815f1a90535060010161350d565b505f5b60208110156135c557845181602081106135875761358761454d565b1a60f81b82613597836006614561565b815181106135a7576135a761454d565b60200101906001600160f81b03191690815f1a90535060010161356b565b505f5b602081101561362557846020015181602081106135e7576135e761454d565b1a60f81b826135f7836026614561565b815181106136075761360761454d565b60200101906001600160f81b03191690815f1a9053506001016135c8565b505f5b60088110156136995761363c8160076143f1565b6136479060086143da565b60ff1685604001516001600160401b0316901c60f81b8282604661366b9190614561565b8151811061367b5761367b61454d565b60200101906001600160f81b03191690815f1a905350600101613628565b505f5b603081101561370457846080015181815181106136bb576136bb61454d565b01602001516001600160f81b031916826136d683604e614561565b815181106136e6576136e661454d565b60200101906001600160f81b03191690815f1a90535060010161369c565b505f5b60088110156137765761371b8160076143f1565b6137269060086143da565b60608601516001600160401b0390811691161c60f81b8261374883607e614561565b815181106137585761375861454d565b60200101906001600160f81b03191690815f1a905350600101613707565b506002816040516137879190614692565b602060405180830381855afa1580156137a2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137c5919061428f565b94909350915050565b60015f8051602061478483398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661382a57604051631afcd79f60e31b815260040160405180910390fd5b565b6138346137e1565b61383d81613ab0565b61389760408201356060830135608084013561385f60c0860160a08701613ef8565b61386f60e0870160c08801613ef8565b613880610100880160e089016146ad565b61389261012089016101008a016146cd565b613ad1565b50565b6138a26137e1565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661392e5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613994573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139b8919061428f565b90506139cf6001600160a01b038516333086613bcb565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a13573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a37919061428f565b9050818111613a9d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613aa782826143f1565b95945050505050565b613ab86137e1565b613ac0613c2b565b613ac8613c3b565b61389781613c43565b613ad96137e1565b5f80516020614704833981519152969096557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01949094557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03929092557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0480547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0395861617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613c25908590613c84565b50505050565b613c336137e1565b61382a613ce5565b61382a6137e1565b613c4b6137e1565b80355f8051602061474483398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b5f613c986001600160a01b03841683613ced565b905080515f14158015613cbc575080806020019051810190613cba91906146e8565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6137ce6137e1565b606061126e83835f845f80856001600160a01b03168486604051613d119190614692565b5f6040518083038185875af1925050503d805f8114613d4b576040519150601f19603f3d011682016040523d82523d5f602084013e613d50565b606091505b5091509150611793868383606082613d7057613d6b82613db7565b61126e565b8151158015613d8757506001600160a01b0384163b155b15613db057604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b508061126e565b805115613dc75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613dec90614100565b5f825580601f10613dfb575050565b601f0160209004905f5260205f209081019061389791905b80821115613e26575f8155600101613e13565b5090565b8015158114613897575f80fd5b803563ffffffff81168114613e4a575f80fd5b919050565b5f805f60608486031215613e61575f80fd5b833592506020840135613e7381613e2a565b9150613e8160408501613e37565b90509250925092565b5f60208284031215613e9a575f80fd5b5035919050565b5f60208284031215613eb1575f80fd5b61126e82613e37565b5f8060408385031215613ecb575f80fd5b613ed483613e37565b946020939093013593505050565b80356001600160401b0381168114613e4a575f80fd5b5f60208284031215613f08575f80fd5b61126e82613ee2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613f4757613f47613f11565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f7557613f75613f11565b604052919050565b5f6001600160401b03821115613f9557613f95613f11565b50601f01601f191660200190565b5f805f8060808587031215613fb6575f80fd5b8435935060208501359250613fcd60408601613ee2565b915060608501356001600160401b03811115613fe7575f80fd5b8501601f81018713613ff7575f80fd5b803561400a61400582613f7d565b613f4d565b81815288602083850101111561401e575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b6001600160a01b0381168114613897575f80fd5b5f80828403610140811215614066575f80fd5b61012080821215614075575f80fd5b84935083013590506140868161403f565b809150509250929050565b5f80604083850312156140a2575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140f9576140f96140c5565b5092915050565b600181811c9082168061411457607f821691505b60208210810361413257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c8101602085101561415d5750805b601f840160051c820191505b81811015610fb2575f8155600101614169565b81516001600160401b0381111561419557614195613f11565b6141a9816141a38454614100565b84614138565b602080601f8311600181146141dc575f84156141c55750858301515b5f19600386901b1c1916600185901b178555614233565b5f85815260208120601f198616915b8281101561420a578886015182559484019460019091019084016141eb565b508582101561422757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561425557818101518382015260200161423d565b50505f910152565b602081525f825180602084015261427b81604085016020870161423b565b601f01601f19169190910160400192915050565b5f6020828403121561429f575f80fd5b5051919050565b5f60208083525f84546142b881614100565b806020870152604060018084165f81146142d957600181146142f557614322565b60ff19851660408a0152604084151560051b8a01019550614322565b895f5260205f205f5b858110156143195781548b82018601529083019088016142fe565b8a016040019650505b509398975050505050505050565b5f8261434a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a6140c5565b8181038181111561093a5761093a6140c5565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613e4a81613e2a565b5f8060408385031215614467575f80fd5b82516001600160401b038082111561447d575f80fd5b9084019060608287031215614490575f80fd5b614498613f25565b825181526020808401516144ab8161403f565b828201526040840151838111156144c0575f80fd5b80850194505087601f8501126144d4575f80fd5b835192506144e461400584613f7d565b83815288828587010111156144f7575f80fd5b6145068483830184880161423b565b8060408401525081955061451b81880161444b565b9450505050509250929050565b5f6001600160401b03808316818103614543576145436140c5565b6001019392505050565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561093a5761093a6140c5565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140f9576140f96140c5565b6001600160401b0381811683821602808216919082811461468a5761468a6140c5565b505092915050565b5f82516146a381846020870161423b565b9190910192915050565b5f602082840312156146bd575f80fd5b813560ff8116811461126e575f80fd5b5f602082840312156146dd575f80fd5b813561126e8161403f565b5f602082840312156146f8575f80fd5b815161126e81613e2a56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516148f23803806148f283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147a58061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872fda641461023e578063912de4da14610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613e3d565b6102d6565b005b610128610138366004613e78565b610761565b61017b61014b366004613e78565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613e78565b6108bd565b6101b46101af366004613e78565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da366004613e8f565b610940565b6101286101ed366004613ea8565b610cc4565b61017b610200366004613ee6565b610eb5565b6101b4610213366004613e78565b610ece565b610128610226366004613e78565b610ee2565b610128610239366004613e3d565b610f4f565b61017b61024c366004613f91565b610f89565b61012861025f366004614041565b610fae565b610128610272366004613ea8565b611092565b61017b61028536600461407f565b611232565b610128610298366004613e8f565b611245565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613e78565b611402565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260408120600101545f805160206146f98339815191529184156103285761032582856114d1565b90505b5f868152600884016020526040808220815161010081019092528054829060ff16600481111561035a5761035a61409f565b600481111561036b5761036b61409f565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f261409f565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206147198339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206147198339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461176d565b600383526001600160401b0342811660a0850152811660e08401525f8981526008870160205260409020835181549293508492829060ff191660018360048111156105005761050061409f565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856117e1565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e91906140c7565b905061066a86826118f2565b5f61067687858461193a565b5f8c8152600a8a01602052604090209091506106928282614171565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614252565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190614284565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f805160206147398339815191529291906107a9906140ee565b90501180156107db575060035f83815260048301602052604090205460ff1660058111156107d9576107d961409f565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610878919060040161429b565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b89190614284565b505050565b6108c681611b57565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a602052604090819020905163ee5b48eb60e01b81525f805160206146f9833981519152916005600160991b019163ee5b48eb916108789160040161429b565b5f61093a64e8d4a5100083614325565b92915050565b5f805160206147398339815191525f61095883611c2a565b90505f806109698360400151611e0b565b9150915080156109ce5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115610a0057610a0061409f565b6005811115610a1157610a1161409f565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610a9857610a9861409f565b1480610ab65750600182516005811115610ab457610ab461409f565b145b610b155760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610b2a57610b2a61409f565b03610b5157505f8381526003860160205260408120600491610b4c9190613dce565b610b55565b5060055b6020808301515f9081526005808901909252604081205582908290811115610b7f57610b7f61409f565b90816005811115610b9257610b9261409f565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115610bc657610bc661409f565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610c9157610c9161409f565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206146f98339815191525f610cdc84611c2a565b90505f80610ced8360400151611fac565b5091509150610cfb856121e7565b5f8581526009850160205260408120610d1391613dce565b5f610d1d836117e1565b9050816001600160401b031681608001516001600160401b03161015610d555760405162461bcd60e51b815260040161043b90614344565b5f8681526008860160205260409020600201546001600160401b03808416600160c01b909204161115610d9a5760405162461bcd60e51b815260040161043b90614386565b60015f87815260088701602052604090205460ff166004811115610dc057610dc061409f565b14610e295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600886016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a510006143cf565b5f610ed8826117e1565b60a0015192915050565b610eeb816121e7565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d09602052604090819020905163ee5b48eb60e01b81525f805160206146f9833981519152916005600160991b019163ee5b48eb916108789160040161429b565b5f610f59846117e1565b60a001519050610f68816122c0565b8215610f7a57610f7884836114d1565b505b610f83846124a2565b50505050565b5f80610f9486612872565b9050610fa285828686612928565b9150505b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ff7575080546001600160401b03808416911610155b156110155760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556110408484612e03565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206146f98339815191525f6110aa84611c2a565b90505f806110bb8360400151611fac565b50915091506110c985611b57565b5f858152600a8501602052604081206110e191613dce565b5f6110eb836117e1565b9050816001600160401b031681608001516001600160401b031610156111235760405162461bcd60e51b815260040161043b90614344565b5f8681526008860160205260409020600301546001600160401b03808416911611156111615760405162461bcd60e51b815260040161043b90614386565b60035f87815260088701602052604090205460ff1660048111156111875761118761409f565b146111db5760405162461bcd60e51b815260206004820152603160248201525f805160206147198339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600886016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61123e833384612e1d565b9392505050565b5f805160206147398339815191525f61125d83611c2a565b90505f8061126e8360400151611e0b565b91509150806112d05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f828152600285016020526040812080546112ea906140ee565b905011801561131c575060015f83815260048601602052604090205460ff16600581111561131a5761131a61409f565b145b6113385760405162461bcd60e51b815260040161043b906143e6565b5f828152600285016020526040812061135091613dce565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061473983398151915292919061144a906140ee565b905011801561147c575060015f83815260048301602052604090205460ff16600581111561147a5761147a61409f565b145b6114985760405162461bcd60e51b815260040161043b906143e6565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610878919060040161429b565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561151c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115439190810190614438565b91509150806115a65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160d9190614284565b8251146116715760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156116e75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806116f684604001516131d8565b915091508187146117635760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206147598339815191526020526040812060030180545f80516020614739833981519152916001600160401b03909116908190846117b28361450a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061475983398151915290528390208351918201909352825491925f8051602061473983398151915292829060ff1660058111156118695761186961409f565b600581111561187a5761187a61409f565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614759833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119b35761197381600161452f565b61197e9060086143cf565b5081515f9083908390811061199557611995614542565b60200101906001600160f81b03191690815f1a90535060010161195f565b505f5b6004811015611a16576119ca81600361452f565b6119d59060086143cf565b6001901c60f81b826119e8836002614556565b815181106119f8576119f8614542565b60200101906001600160f81b03191690815f1a9053506001016119b6565b505f5b6020811015611a7857611a2d81601f61452f565b611a389060086143cf565b86901c60f81b82611a4a836006614556565b81518110611a5a57611a5a614542565b60200101906001600160f81b03191690815f1a905350600101611a19565b505f5b6008811015611ae357611a8f81600761452f565b611a9a9060086143cf565b6001600160401b038616901c60f81b82611ab5836026614556565b81518110611ac557611ac5614542565b60200101906001600160f81b03191690815f1a905350600101611a7b565b505f5b6008811015611b4e57611afa81600761452f565b611b059060086143cf565b6001600160401b038516901c60f81b82611b2083602e614556565b81518110611b3057611b30614542565b60200101906001600160f81b03191690815f1a905350600101611ae6565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020526040812080545f805160206146f9833981519152929190611b9f906140ee565b9050118015611bd1575060035f83815260088301602052604090205460ff166004811115611bcf57611bcf61409f565b145b611c265760405162461bcd60e51b815260206004820152603360248201525f8051602061471983398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206147398339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c9f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cc69190810190614438565b9150915080611d2d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611d905760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611e035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f808251602714611e2e5760405162461bcd60e51b815260040161043b90614569565b5f805b6002811015611e7d57611e4581600161452f565b611e509060086143cf565b61ffff16858281518110611e6657611e66614542565b016020015160f81c901b9190911790600101611e31565b5061ffff811615611ea05760405162461bcd60e51b815260040161043b906145b2565b5f805b6004811015611efb57611eb781600361452f565b611ec29060086143cf565b63ffffffff1686611ed4836002614556565b81518110611ee457611ee4614542565b016020015160f81c901b9190911790600101611ea3565b5063ffffffff8116600214611f225760405162461bcd60e51b815260040161043b906145f5565b5f805b6020811015611f7757611f3981601f61452f565b611f449060086143cf565b87611f50836006614556565b81518110611f6057611f60614542565b016020015160f81c901b9190911790600101611f25565b505f86602681518110611f8c57611f8c614542565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611fd05760405162461bcd60e51b815260040161043b90614569565b5f805b600281101561201f57611fe781600161452f565b611ff29060086143cf565b61ffff1686828151811061200857612008614542565b016020015160f81c901b9190911790600101611fd3565b5061ffff8116156120425760405162461bcd60e51b815260040161043b906145b2565b5f805b600481101561209d5761205981600361452f565b6120649060086143cf565b63ffffffff1687612076836002614556565b8151811061208657612086614542565b016020015160f81c901b9190911790600101612045565b5063ffffffff81166003146120c45760405162461bcd60e51b815260040161043b906145f5565b5f805b6020811015612119576120db81601f61452f565b6120e69060086143cf565b886120f2836006614556565b8151811061210257612102614542565b016020015160f81c901b91909117906001016120c7565b505f805b60088110156121785761213181600761452f565b61213c9060086143cf565b6001600160401b031689612151836026614556565b8151811061216157612161614542565b016020015160f81c901b919091179060010161211d565b505f805b60088110156121d75761219081600761452f565b61219b9060086143cf565b6001600160401b03168a6121b083602e614556565b815181106121c0576121c0614542565b016020015160f81c901b919091179060010161217c565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d096020526040812080545f805160206146f983398151915292919061222f906140ee565b9050118015612261575060015f83815260088301602052604090205460ff16600481111561225f5761225f61409f565b145b611c265760405162461bcd60e51b815260206004820152603860248201525f8051602061471983398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f805160206146f98339815191525f6122f77fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb065490565b6003830154909150600160401b900460ff161580612313575080155b1561231d57505050565b6002820154429081116123305750505050565b6040805160608101825260048501548082526005860154602083015260068601546001600160401b0390811693830193909352600386015491929190911690612379908461452f565b1061239c576001600160401b0385166040820152818152602081018390526123bb565b84816040018181516123ae919061463c565b6001600160401b03169052505b5f8160200151826040015160646123d2919061465c565b6001600160401b03166123e59190614325565b600386015490915060ff600160401b909104811690821611156124635760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2063687560448201526f1c9b881c985d1948195e18d95959195960821b606482015260840161043b565b508051600485015560208101516005850155604001516006909301805467ffffffffffffffff19166001600160401b0390941693909317909255505050565b5f8181525f8051602061475983398151915260205260408082208151610100810190925280545f8051602061473983398151915293929190829060ff1660058111156124f0576124f061409f565b60058111156125015761250161409f565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156125895761258961409f565b146125e55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461265f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff191660018360058111156126a3576126a361409f565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61276f846127698161176d565b5f61193a565b5f858152600385016020526040902090915061278b8282614171565b508160a001516001600160401b0316836006015f8282546127ac919061452f565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127dd908590600401614252565b6020604051808303815f875af11580156127f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061281d9190614284565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146f98339815191528161288b846133b0565b90505f6128978261092a565b83549091506001600160401b038216108015906128c157508260010154816001600160401b031611155b61291f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b610fa6816122c0565b5f6129316133e6565b5f80516020614739833981519152426001600160401b038516116129b35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b0384166129ca426202a300614556565b11612a3d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b85612a945760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f86815260058201602052604090205415612b025760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612b695760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b5f80612bb06040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061341d565b5f82815260028601602052604090209193509150612bce8282614171565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612bfb908590600401614252565b6020604051808303815f875af1158015612c17573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c3b9190614284565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff19166001836005811115612cbd57612cbd61409f565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695851695909517919091171692909217929092179055600685018054918a16915f90612d8e908490614556565b90915550612d9d90508361176d565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610fa660015f8051602061477983398151915255565b612e0b6137d5565b612e1482613820565b611c268161388e565b5f612e266133e6565b5f612e336101af846133b0565b90505f805160206146f98339815191525f612e4d876117e1565b9050600281516005811115612e6457612e6461409f565b14612ec35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612ed4919061463c565b9050612ee088826118f2565b5f612eea8961176d565b90505f898983604051602001612f329392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612f53866122c0565b5f612f5f8b848661193a565b5f8381526009880160205260409020909150612f7b8282614171565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612fa8908590600401614252565b6020604051808303815f875af1158015612fc4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fe89190614284565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876008015f8581526020019081526020015f205f820151815f015f6101000a81548160ff021916908360048111156130975761309761409f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061123e60015f8051602061477983398151915255565b5f808251602e146131fb5760405162461bcd60e51b815260040161043b90614569565b5f805b600281101561324a5761321281600161452f565b61321d9060086143cf565b61ffff1685828151811061323357613233614542565b016020015160f81c901b91909117906001016131fe565b5061ffff81161561326d5760405162461bcd60e51b815260040161043b906145b2565b5f805b60048110156132c85761328481600361452f565b61328f9060086143cf565b63ffffffff16866132a1836002614556565b815181106132b1576132b1614542565b016020015160f81c901b9190911790600101613270565b5063ffffffff81166004146132ef5760405162461bcd60e51b815260040161043b906145f5565b5f805b60208110156133445761330681601f61452f565b6133119060086143cf565b8761331d836006614556565b8151811061332d5761332d614542565b016020015160f81c901b91909117906001016132f2565b505f805b60088110156133a35761335c81600761452f565b6133679060086143cf565b6001600160401b03168861337c836026614556565b8151811061338c5761338c614542565b016020015160f81c901b9190911790600101613348565b5090969095509350505050565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613942565b5f8051602061477983398151915280546001190161341757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134875760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134fe576134be81600161452f565b6134c99060086143cf565b5081515f908390839081106134e0576134e0614542565b60200101906001600160f81b03191690815f1a9053506001016134aa565b505f5b600481101561355c5761351581600361452f565b6135209060086143cf565b505f8261352e836002614556565b8151811061353e5761353e614542565b60200101906001600160f81b03191690815f1a905350600101613501565b505f5b60208110156135b9578451816020811061357b5761357b614542565b1a60f81b8261358b836006614556565b8151811061359b5761359b614542565b60200101906001600160f81b03191690815f1a90535060010161355f565b505f5b602081101561361957846020015181602081106135db576135db614542565b1a60f81b826135eb836026614556565b815181106135fb576135fb614542565b60200101906001600160f81b03191690815f1a9053506001016135bc565b505f5b600881101561368d5761363081600761452f565b61363b9060086143cf565b60ff1685604001516001600160401b0316901c60f81b8282604661365f9190614556565b8151811061366f5761366f614542565b60200101906001600160f81b03191690815f1a90535060010161361c565b505f5b60308110156136f857846080015181815181106136af576136af614542565b01602001516001600160f81b031916826136ca83604e614556565b815181106136da576136da614542565b60200101906001600160f81b03191690815f1a905350600101613690565b505f5b600881101561376a5761370f81600761452f565b61371a9060086143cf565b60608601516001600160401b0390811691161c60f81b8261373c83607e614556565b8151811061374c5761374c614542565b60200101906001600160f81b03191690815f1a9053506001016136fb565b5060028160405161377b9190614687565b602060405180830381855afa158015613796573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137b99190614284565b94909350915050565b60015f8051602061477983398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661381e57604051631afcd79f60e31b815260040160405180910390fd5b565b6138286137d5565b61383181613aa4565b61388b60408201356060830135608084013561385360c0860160a08701613ee6565b61386360e0870160c08801613ee6565b613874610100880160e089016146a2565b61388661012089016101008a016146c2565b613ac5565b50565b6138966137d5565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166139225760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613988573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139ac9190614284565b90506139c36001600160a01b038516333086613bbf565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a2b9190614284565b9050818111613a915760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613a9b828261452f565b95945050505050565b613aac6137d5565b613ab4613c19565b613abc613c29565b61388b81613c31565b613acd6137d5565b5f805160206146f9833981519152969096557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01949094557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02929092557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0380547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0395861617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610f83908590613c72565b613c216137d5565b61381e613cd3565b61381e6137d5565b613c396137d5565b80355f8051602061473983398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b5f613c866001600160a01b03841683613cdb565b905080515f14158015613caa575080806020019051810190613ca891906146dd565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6137c26137d5565b606061123e83835f845f80856001600160a01b03168486604051613cff9190614687565b5f6040518083038185875af1925050503d805f8114613d39576040519150601f19603f3d011682016040523d82523d5f602084013e613d3e565b606091505b5091509150611763868383606082613d5e57613d5982613da5565b61123e565b8151158015613d7557506001600160a01b0384163b155b15613d9e57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b508061123e565b805115613db55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613dda906140ee565b5f825580601f10613de9575050565b601f0160209004905f5260205f209081019061388b91905b80821115613e14575f8155600101613e01565b5090565b801515811461388b575f80fd5b803563ffffffff81168114613e38575f80fd5b919050565b5f805f60608486031215613e4f575f80fd5b833592506020840135613e6181613e18565b9150613e6f60408501613e25565b90509250925092565b5f60208284031215613e88575f80fd5b5035919050565b5f60208284031215613e9f575f80fd5b61123e82613e25565b5f8060408385031215613eb9575f80fd5b613ec283613e25565b946020939093013593505050565b80356001600160401b0381168114613e38575f80fd5b5f60208284031215613ef6575f80fd5b61123e82613ed0565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613f3557613f35613eff565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f6357613f63613eff565b604052919050565b5f6001600160401b03821115613f8357613f83613eff565b50601f01601f191660200190565b5f805f8060808587031215613fa4575f80fd5b8435935060208501359250613fbb60408601613ed0565b915060608501356001600160401b03811115613fd5575f80fd5b8501601f81018713613fe5575f80fd5b8035613ff8613ff382613f6b565b613f3b565b81815288602083850101111561400c575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b6001600160a01b038116811461388b575f80fd5b5f80828403610140811215614054575f80fd5b61012080821215614063575f80fd5b84935083013590506140748161402d565b809150509250929050565b5f8060408385031215614090575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140e7576140e76140b3565b5092915050565b600181811c9082168061410257607f821691505b60208210810361412057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c8101602085101561414b5750805b601f840160051c820191505b8181101561416a575f8155600101614157565b5050505050565b81516001600160401b0381111561418a5761418a613eff565b61419e8161419884546140ee565b84614126565b602080601f8311600181146141d1575f84156141ba5750858301515b5f19600386901b1c1916600185901b178555614228565b5f85815260208120601f198616915b828110156141ff578886015182559484019460019091019084016141e0565b508582101561421c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561424a578181015183820152602001614232565b50505f910152565b602081525f8251806020840152614270816040850160208701614230565b601f01601f19169190910160400192915050565b5f60208284031215614294575f80fd5b5051919050565b5f60208083525f84546142ad816140ee565b806020870152604060018084165f81146142ce57600181146142ea57614317565b60ff19851660408a0152604084151560051b8a01019550614317565b895f5260205f205f5b8581101561430e5781548b82018601529083019088016142f3565b8a016040019650505b509398975050505050505050565b5f8261433f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a6140b3565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613e3881613e18565b5f8060408385031215614449575f80fd5b82516001600160401b038082111561445f575f80fd5b9084019060608287031215614472575f80fd5b61447a613f13565b8251815260208084015161448d8161402d565b828201526040840151838111156144a2575f80fd5b80850194505087601f8501126144b6575f80fd5b835192506144c6613ff384613f6b565b83815288828587010111156144d9575f80fd5b6144e884838301848801614230565b806040840152508195506144fd81880161442d565b9450505050509250929050565b5f6001600160401b03808316818103614525576145256140b3565b6001019392505050565b8181038181111561093a5761093a6140b3565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561093a5761093a6140b3565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140e7576140e76140b3565b6001600160401b0381811683821602808216919082811461467f5761467f6140b3565b505092915050565b5f8251614698818460208701614230565b9190910192915050565b5f602082840312156146b2575f80fd5b813560ff8116811461123e575f80fd5b5f602082840312156146d2575f80fd5b813561123e8161402d565b5f602082840312156146ed575f80fd5b815161123e81613e1856fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 40176a1b7..1616b4bf7 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -50,7 +50,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnTrackerStartTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161452638038061452683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143d98061014d5f395ff3fe608060405260043610610105575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f4578063b771b3bc14610313578063bee0a03f14610345578063c599e24f14610364578063f40797d714610377575f80fd5b806366435abf146102785780636d0e43fa1461029757806376f78621146102b657806398f3e2b4146102d5575f80fd5b80632e1488ec116100d85780632e1488ec146101c55780632e2194d8146101e4578063467ef06f1461021b5780635297fae61461023a5780636206585614610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063162f1f61146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613aea565b61038a565b005b348015610135575f80fd5b50610128610144366004613b25565b610815565b348015610154575f80fd5b50610193610163366004613b25565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b3480156101b1575f80fd5b506101286101c0366004613b25565b610971565b3480156101d0575f80fd5b506101286101df366004613b3c565b6109de565b3480156101ef575f80fd5b506102036101fe366004613b25565b610ac0565b6040516001600160401b03909116815260200161019d565b348015610226575f80fd5b50610128610235366004613b53565b610ad6565b348015610245575f80fd5b50610128610254366004613b6c565b610e5a565b348015610264575f80fd5b50610193610273366004613baa565b61104b565b348015610283575f80fd5b50610203610292366004613b25565b611064565b3480156102a2575f80fd5b506101286102b1366004613b25565b611078565b3480156102c1575f80fd5b506101286102d0366004613aea565b6110e5565b3480156102e0575f80fd5b506101286102ef366004613b6c565b61114f565b3480156102ff575f80fd5b5061012861030e366004613b53565b6112ef565b34801561031e575f80fd5b5061032d6005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610350575f80fd5b5061012861035f366004613b25565b6114ac565b610193610372366004613b25565b61157b565b610193610385366004613c55565b611587565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0960205260408120600101545f8051602061432d8339815191529184156103dc576103d982856115ab565b90505b5f868152600984016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613ce7565b600481111561041f5761041f613ce7565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613ce7565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f8051602061434d8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f8051602061434d8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f61056784611847565b600383526001600160401b0342811660a0850152811660e08401525f8981526009870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613ce7565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610686856118bb565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107129190613d0f565b905061071e86826119cc565b5f61072a878584611a14565b5f8c8152600b8a01602052604090209091506107468282613dac565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610773908590600401613e8d565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190613ebf565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f8051602061436d83398151915292919061085d90613d36565b905011801561088f575060035f83815260048301602052604090205460ff16600581111561088d5761088d613ce7565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401613ed6565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190613ebf565b505050565b61097a81611c31565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0b602052604090819020905163ee5b48eb60e01b81525f8051602061432d833981519152916005600160991b019163ee5b48eb9161092c91600401613ed6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a27575080546001600160401b03808416911610155b15610a455760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6f83611d04565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610ad064e8d4a5100083613f60565b92915050565b5f8051602061436d8339815191525f610aee83611d18565b90505f80610aff8360400151611ef9565b915091508015610b645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115610b9657610b96613ce7565b6005811115610ba757610ba7613ce7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c2e57610c2e613ce7565b1480610c4c5750600182516005811115610c4a57610c4a613ce7565b145b610cab5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115610cc057610cc0613ce7565b03610ce757505f8381526003860160205260408120600491610ce29190613a7b565b610ceb565b5060055b6020808301515f9081526005808901909252604081205582908290811115610d1557610d15613ce7565b90816005811115610d2857610d28613ce7565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115610d5c57610d5c613ce7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e2757610e27613ce7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f8051602061432d8339815191525f610e7284611d18565b90505f80610e83836040015161209a565b5091509150610e91856122d5565b5f858152600a850160205260408120610ea991613a7b565b5f610eb3836118bb565b9050816001600160401b031681608001516001600160401b03161015610eeb5760405162461bcd60e51b81526004016104ef90613f7f565b5f8681526009860160205260409020600201546001600160401b03808416600160c01b909204161115610f305760405162461bcd60e51b81526004016104ef90613fc1565b60015f87815260098701602052604090205460ff166004811115610f5657610f56613ce7565b14610fbf5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600986016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad06001600160401b03831664e8d4a5100061400a565b5f61106e826118bb565b60a0015192915050565b611081816122d5565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a602052604090819020905163ee5b48eb60e01b81525f8051602061432d833981519152916005600160991b019163ee5b48eb9161092c91600401613ed6565b5f8051602061432d8339815191525f6110fd856118bb565b60a00151905061110c816123ae565b806001600160401b0316826002015f8282546111289190614021565b9091555050831561113f5761113d85846115ab565b505b61114885612586565b5050505050565b5f8051602061432d8339815191525f61116784611d18565b90505f80611178836040015161209a565b509150915061118685611c31565b5f858152600b85016020526040812061119e91613a7b565b5f6111a8836118bb565b9050816001600160401b031681608001516001600160401b031610156111e05760405162461bcd60e51b81526004016104ef90613f7f565b5f8681526009860160205260409020600301546001600160401b038084169116111561121e5760405162461bcd60e51b81526004016104ef90613fc1565b60035f87815260098701602052604090205460ff16600481111561124457611244613ce7565b146112985760405162461bcd60e51b815260206004820152603160248201525f8051602061434d8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f868152600986016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f8051602061436d8339815191525f61130783611d18565b90505f806113188360400151611ef9565b915091508061137a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526002850160205260408120805461139490613d36565b90501180156113c6575060015f83815260048601602052604090205460ff1660058111156113c4576113c4613ce7565b145b6113e25760405162461bcd60e51b81526004016104ef90614034565b5f82815260028501602052604081206113fa91613a7b565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061436d8339815191529291906114f490613d36565b9050118015611526575060015f83815260048301602052604090205460ff16600581111561152457611524613ce7565b145b6115425760405162461bcd60e51b81526004016104ef90614034565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401613ed6565b5f610ad0823334612931565b5f8061159234612ce9565b90506115a085828686612dbe565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261161d919081019061409a565b91509150806116805760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e79190613ebf565b82511461174b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156117c15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806117d08460400151613282565b9150915081871461183d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f8051602061438d8339815191526020526040812060030180545f8051602061436d833981519152916001600160401b039091169081908461188c8361416c565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061438d83398151915290528390208351918201909352825491925f8051602061436d83398151915292829060ff16600581111561194357611943613ce7565b600581111561195457611954613ce7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061438d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a8d57611a4d816001614021565b611a5890600861400a565b5081515f90839083908110611a6f57611a6f614191565b60200101906001600160f81b03191690815f1a905350600101611a39565b505f5b6004811015611af057611aa4816003614021565b611aaf90600861400a565b6001901c60f81b82611ac28360026141a5565b81518110611ad257611ad2614191565b60200101906001600160f81b03191690815f1a905350600101611a90565b505f5b6020811015611b5257611b0781601f614021565b611b1290600861400a565b86901c60f81b82611b248360066141a5565b81518110611b3457611b34614191565b60200101906001600160f81b03191690815f1a905350600101611af3565b505f5b6008811015611bbd57611b69816007614021565b611b7490600861400a565b6001600160401b038616901c60f81b82611b8f8360266141a5565b81518110611b9f57611b9f614191565b60200101906001600160f81b03191690815f1a905350600101611b55565b505f5b6008811015611c2857611bd4816007614021565b611bdf90600861400a565b6001600160401b038516901c60f81b82611bfa83602e6141a5565b81518110611c0a57611c0a614191565b60200101906001600160f81b03191690815f1a905350600101611bc0565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0b6020526040812080545f8051602061432d833981519152929190611c7990613d36565b9050118015611cab575060035f83815260098301602052604090205460ff166004811115611ca957611ca9613ce7565b145b611d005760405162461bcd60e51b815260206004820152603360248201525f8051602061434d83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b5050565b611d0c61345a565b611d15816134a5565b50565b60408051606080820183525f8083526020830181905292820152905f8051602061436d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d8d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611db4919081019061409a565b9150915080611e1b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611e7e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611ef15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f808251602714611f1c5760405162461bcd60e51b81526004016104ef906141b8565b5f805b6002811015611f6b57611f33816001614021565b611f3e90600861400a565b61ffff16858281518110611f5457611f54614191565b016020015160f81c901b9190911790600101611f1f565b5061ffff811615611f8e5760405162461bcd60e51b81526004016104ef90614201565b5f805b6004811015611fe957611fa5816003614021565b611fb090600861400a565b63ffffffff1686611fc28360026141a5565b81518110611fd257611fd2614191565b016020015160f81c901b9190911790600101611f91565b5063ffffffff81166002146120105760405162461bcd60e51b81526004016104ef90614244565b5f805b60208110156120655761202781601f614021565b61203290600861400a565b8761203e8360066141a5565b8151811061204e5761204e614191565b016020015160f81c901b9190911790600101612013565b505f8660268151811061207a5761207a614191565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120be5760405162461bcd60e51b81526004016104ef906141b8565b5f805b600281101561210d576120d5816001614021565b6120e090600861400a565b61ffff168682815181106120f6576120f6614191565b016020015160f81c901b91909117906001016120c1565b5061ffff8116156121305760405162461bcd60e51b81526004016104ef90614201565b5f805b600481101561218b57612147816003614021565b61215290600861400a565b63ffffffff16876121648360026141a5565b8151811061217457612174614191565b016020015160f81c901b9190911790600101612133565b5063ffffffff81166003146121b25760405162461bcd60e51b81526004016104ef90614244565b5f805b6020811015612207576121c981601f614021565b6121d490600861400a565b886121e08360066141a5565b815181106121f0576121f0614191565b016020015160f81c901b91909117906001016121b5565b505f805b60088110156122665761221f816007614021565b61222a90600861400a565b6001600160401b03168961223f8360266141a5565b8151811061224f5761224f614191565b016020015160f81c901b919091179060010161220b565b505f805b60088110156122c55761227e816007614021565b61228990600861400a565b6001600160401b03168a61229e83602e6141a5565b815181106122ae576122ae614191565b016020015160f81c901b919091179060010161226a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020526040812080545f8051602061432d83398151915292919061231d90613d36565b905011801561234f575060015f83815260098301602052604090205460ff16600481111561234d5761234d613ce7565b145b611d005760405162461bcd60e51b815260206004820152603860248201525f8051602061434d83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04545f8051602061432d83398151915290600160401b900460ff1615806123f757506002810154155b15612400575050565b60038101544290811161241257505050565b6040805160608101825260058401548082526006850154602083015260078501546001600160401b039081169383019390935260048501549192919091169061245b9084614021565b10612481576001600160401b0384166040820152818152600283015460208201526124a0565b8381604001818151612493919061428b565b6001600160401b03169052505b5f8160200151826040015160646124b791906142ab565b6001600160401b03166124ca9190613f60565b600485015490915060ff600160401b909104811690821611156125485760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2063687560448201526f1c9b881c985d1948195e18d95959195960821b60648201526084016104ef565b508051600584015560208101516006840155604001516007909201805467ffffffffffffffff19166001600160401b03909316929092179091555050565b5f8181525f8051602061438d83398151915260205260408082208151610100810190925280545f8051602061436d83398151915293929190829060ff1660058111156125d4576125d4613ce7565b60058111156125e5576125e5613ce7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561266d5761266d613ce7565b146126c95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146127435760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff1916600183600581111561278757612787613ce7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6128538461284d81611847565b5f611a14565b5f858152600385016020526040902090915061286f8282613dac565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061289c908590600401613e8d565b6020604051808303815f875af11580156128b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128dc9190613ebf565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61293a613510565b5f61294483610ac0565b90505f8051602061432d8339815191525f61295e876118bb565b905060028151600581111561297557612975613ce7565b146129d45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f838260a001516129e5919061428b565b90506129f188826119cc565b5f6129fb89611847565b90505f898983604051602001612a439392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612a64866123ae565b5f612a708b8486611a14565b5f838152600a880160205260409020909150612a8c8282613dac565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ab9908590600401613e8d565b6020604051808303815f875af1158015612ad5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af99190613ebf565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876009015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612ba857612ba8613ce7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506115a460015f805160206143ad83398151915255565b5f5f8051602061432d8339815191528282612d0382610ac0565b83549091506001600160401b03821610801590612d2d57508260010154816001600160401b031611155b612d8b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b612d94816123ae565b806001600160401b0316836002015f828254612db091906141a5565b909155509095945050505050565b5f612dc7613510565b5f8051602061436d833981519152426001600160401b03851611612e495760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612e60426202a3006141a5565b11612ed35760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612f2a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f86815260058201602052604090205415612f985760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b8251603014612fff5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b5f806130466040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061355a565b5f828152600286016020526040902091935091506130648282613dac565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613091908590600401613e8d565b6020604051808303815f875af11580156130ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130d19190613ebf565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff1916600183600581111561315357613153613ce7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561321483611847565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061327a60015f805160206143ad83398151915255565b949350505050565b5f808251602e146132a55760405162461bcd60e51b81526004016104ef906141b8565b5f805b60028110156132f4576132bc816001614021565b6132c790600861400a565b61ffff168582815181106132dd576132dd614191565b016020015160f81c901b91909117906001016132a8565b5061ffff8116156133175760405162461bcd60e51b81526004016104ef90614201565b5f805b60048110156133725761332e816003614021565b61333990600861400a565b63ffffffff168661334b8360026141a5565b8151811061335b5761335b614191565b016020015160f81c901b919091179060010161331a565b5063ffffffff81166004146133995760405162461bcd60e51b81526004016104ef90614244565b5f805b60208110156133ee576133b081601f614021565b6133bb90600861400a565b876133c78360066141a5565b815181106133d7576133d7614191565b016020015160f81c901b919091179060010161339c565b505f805b600881101561344d57613406816007614021565b61341190600861400a565b6001600160401b0316886134268360266141a5565b8151811061343657613436614191565b016020015160f81c901b91909117906001016133f2565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166134a357604051631afcd79f60e31b815260040160405180910390fd5b565b6134ad61345a565b6134b6816138ff565b611d156040820135606083013560808401356134d860c0860160a08701613baa565b6134e860e0870160c08801613baa565b6134f9610100880160e089016142d6565b61350b61012089016101008a016142f6565b613920565b5f805160206143ad83398151915280546001190161354157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206143ad83398151915255565b5f60608260800151516030146135c45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561363b576135fb816001614021565b61360690600861400a565b5081515f9083908390811061361d5761361d614191565b60200101906001600160f81b03191690815f1a9053506001016135e7565b505f5b600481101561369957613652816003614021565b61365d90600861400a565b505f8261366b8360026141a5565b8151811061367b5761367b614191565b60200101906001600160f81b03191690815f1a90535060010161363e565b505f5b60208110156136f657845181602081106136b8576136b8614191565b1a60f81b826136c88360066141a5565b815181106136d8576136d8614191565b60200101906001600160f81b03191690815f1a90535060010161369c565b505f5b6020811015613756578460200151816020811061371857613718614191565b1a60f81b826137288360266141a5565b8151811061373857613738614191565b60200101906001600160f81b03191690815f1a9053506001016136f9565b505f5b60088110156137ca5761376d816007614021565b61377890600861400a565b60ff1685604001516001600160401b0316901c60f81b8282604661379c91906141a5565b815181106137ac576137ac614191565b60200101906001600160f81b03191690815f1a905350600101613759565b505f5b603081101561383557846080015181815181106137ec576137ec614191565b01602001516001600160f81b0319168261380783604e6141a5565b8151811061381757613817614191565b60200101906001600160f81b03191690815f1a9053506001016137cd565b505f5b60088110156138a75761384c816007614021565b61385790600861400a565b60608601516001600160401b0390811691161c60f81b8261387983607e6141a5565b8151811061388957613889614191565b60200101906001600160f81b03191690815f1a905350600101613838565b506002816040516138b89190614311565b602060405180830381855afa1580156138d3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138f69190613ebf565b94909350915050565b61390761345a565b61390f613a1a565b613917613a2a565b611d1581613a32565b61392861345a565b5f8051602061432d833981519152969096557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01949094557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03929092557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0480547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0395861617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b613a2261345a565b6134a3613a73565b6134a361345a565b613a3a61345a565b80355f8051602061436d83398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b61354761345a565b508054613a8790613d36565b5f825580601f10613a96575050565b601f0160209004905f5260205f2090810190611d1591905b80821115613ac1575f8155600101613aae565b5090565b8015158114611d15575f80fd5b803563ffffffff81168114613ae5575f80fd5b919050565b5f805f60608486031215613afc575f80fd5b833592506020840135613b0e81613ac5565b9150613b1c60408501613ad2565b90509250925092565b5f60208284031215613b35575f80fd5b5035919050565b5f6101208284031215613b4d575f80fd5b50919050565b5f60208284031215613b63575f80fd5b6115a482613ad2565b5f8060408385031215613b7d575f80fd5b613b8683613ad2565b946020939093013593505050565b80356001600160401b0381168114613ae5575f80fd5b5f60208284031215613bba575f80fd5b6115a482613b94565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bf957613bf9613bc3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c2757613c27613bc3565b604052919050565b5f6001600160401b03821115613c4757613c47613bc3565b50601f01601f191660200190565b5f805f60608486031215613c67575f80fd5b83359250613c7760208501613b94565b915060408401356001600160401b03811115613c91575f80fd5b8401601f81018613613ca1575f80fd5b8035613cb4613caf82613c2f565b613bff565b818152876020838501011115613cc8575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613d2f57613d2f613cfb565b5092915050565b600181811c90821680613d4a57607f821691505b602082108103613b4d57634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c81016020851015613d8d5750805b601f840160051c820191505b81811015611148575f8155600101613d99565b81516001600160401b03811115613dc557613dc5613bc3565b613dd981613dd38454613d36565b84613d68565b602080601f831160018114613e0c575f8415613df55750858301515b5f19600386901b1c1916600185901b178555613e63565b5f85815260208120601f198616915b82811015613e3a57888601518255948401946001909101908401613e1b565b5085821015613e5757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613e85578181015183820152602001613e6d565b50505f910152565b602081525f8251806020840152613eab816040850160208701613e6b565b601f01601f19169190910160400192915050565b5f60208284031215613ecf575f80fd5b5051919050565b5f60208083525f8454613ee881613d36565b806020870152604060018084165f8114613f095760018114613f2557613f52565b60ff19851660408a0152604084151560051b8a01019550613f52565b895f5260205f205f5b85811015613f495781548b8201860152908301908801613f2e565b8a016040019650505b509398975050505050505050565b5f82613f7a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad057610ad0613cfb565b81810381811115610ad057610ad0613cfb565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611d15575f80fd5b8051613ae581613ac5565b5f80604083850312156140ab575f80fd5b82516001600160401b03808211156140c1575f80fd5b90840190606082870312156140d4575f80fd5b6140dc613bd7565b825181526020808401516140ef8161407b565b82820152604084015183811115614104575f80fd5b80850194505087601f850112614118575f80fd5b83519250614128613caf84613c2f565b838152888285870101111561413b575f80fd5b61414a84838301848801613e6b565b8060408401525081955061415f81880161408f565b9450505050509250929050565b5f6001600160401b0380831681810361418757614187613cfb565b6001019392505050565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad057610ad0613cfb565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613d2f57613d2f613cfb565b6001600160401b038181168382160280821691908281146142ce576142ce613cfb565b505092915050565b5f602082840312156142e6575f80fd5b813560ff811681146115a4575f80fd5b5f60208284031215614306575f80fd5b81356115a48161407b565b5f8251614322818460208701613e6b565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161452138038061452183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143d48061014d5f395ff3fe608060405260043610610105575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f4578063b771b3bc14610313578063bee0a03f14610345578063c599e24f14610364578063f40797d714610377575f80fd5b806366435abf146102785780636d0e43fa1461029757806376f78621146102b657806398f3e2b4146102d5575f80fd5b80632e1488ec116100d85780632e1488ec146101c55780632e2194d8146101e4578063467ef06f1461021b5780635297fae61461023a5780636206585614610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063162f1f61146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613ade565b61038a565b005b348015610135575f80fd5b50610128610144366004613b19565b610815565b348015610154575f80fd5b50610193610163366004613b19565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b3480156101b1575f80fd5b506101286101c0366004613b19565b610971565b3480156101d0575f80fd5b506101286101df366004613b30565b6109de565b3480156101ef575f80fd5b506102036101fe366004613b19565b610ac0565b6040516001600160401b03909116815260200161019d565b348015610226575f80fd5b50610128610235366004613b47565b610ad6565b348015610245575f80fd5b50610128610254366004613b60565b610e5a565b348015610264575f80fd5b50610193610273366004613b9e565b61104b565b348015610283575f80fd5b50610203610292366004613b19565b611064565b3480156102a2575f80fd5b506101286102b1366004613b19565b611078565b3480156102c1575f80fd5b506101286102d0366004613ade565b6110e5565b3480156102e0575f80fd5b506101286102ef366004613b60565b61111f565b3480156102ff575f80fd5b5061012861030e366004613b47565b6112bf565b34801561031e575f80fd5b5061032d6005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610350575f80fd5b5061012861035f366004613b19565b61147c565b610193610372366004613b19565b61154b565b610193610385366004613c49565b611557565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260408120600101545f805160206143288339815191529184156103dc576103d9828561157b565b90505b5f868152600884016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613cdb565b600481111561041f5761041f613cdb565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613cdb565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206143488339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206143488339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f61056784611817565b600383526001600160401b0342811660a0850152811660e08401525f8981526008870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613cdb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106868561188b565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107129190613d03565b905061071e868261199c565b5f61072a8785846119e4565b5f8c8152600a8a01602052604090209091506107468282613da7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610773908590600401613e88565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190613eba565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f8051602061436883398151915292919061085d90613d2a565b905011801561088f575060035f83815260048301602052604090205460ff16600581111561088d5761088d613cdb565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401613ed1565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190613eba565b505050565b61097a81611c01565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a602052604090819020905163ee5b48eb60e01b81525f80516020614328833981519152916005600160991b019163ee5b48eb9161092c91600401613ed1565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a27575080546001600160401b03808416911610155b15610a455760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6f83611cd4565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610ad064e8d4a5100083613f5b565b92915050565b5f805160206143688339815191525f610aee83611ce8565b90505f80610aff8360400151611ec9565b915091508015610b645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115610b9657610b96613cdb565b6005811115610ba757610ba7613cdb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c2e57610c2e613cdb565b1480610c4c5750600182516005811115610c4a57610c4a613cdb565b145b610cab5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115610cc057610cc0613cdb565b03610ce757505f8381526003860160205260408120600491610ce29190613a6f565b610ceb565b5060055b6020808301515f9081526005808901909252604081205582908290811115610d1557610d15613cdb565b90816005811115610d2857610d28613cdb565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115610d5c57610d5c613cdb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e2757610e27613cdb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206143288339815191525f610e7284611ce8565b90505f80610e83836040015161206a565b5091509150610e91856122a5565b5f8581526009850160205260408120610ea991613a6f565b5f610eb38361188b565b9050816001600160401b031681608001516001600160401b03161015610eeb5760405162461bcd60e51b81526004016104ef90613f7a565b5f8681526008860160205260409020600201546001600160401b03808416600160c01b909204161115610f305760405162461bcd60e51b81526004016104ef90613fbc565b60015f87815260088701602052604090205460ff166004811115610f5657610f56613cdb565b14610fbf5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600886016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad06001600160401b03831664e8d4a51000614005565b5f61106e8261188b565b60a0015192915050565b611081816122a5565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d09602052604090819020905163ee5b48eb60e01b81525f80516020614328833981519152916005600160991b019163ee5b48eb9161092c91600401613ed1565b5f6110ef8461188b565b60a0015190506110fe8161237e565b82156111105761110e848361157b565b505b61111984612560565b50505050565b5f805160206143288339815191525f61113784611ce8565b90505f80611148836040015161206a565b509150915061115685611c01565b5f858152600a85016020526040812061116e91613a6f565b5f6111788361188b565b9050816001600160401b031681608001516001600160401b031610156111b05760405162461bcd60e51b81526004016104ef90613f7a565b5f8681526008860160205260409020600301546001600160401b03808416911611156111ee5760405162461bcd60e51b81526004016104ef90613fbc565b60035f87815260088701602052604090205460ff16600481111561121457611214613cdb565b146112685760405162461bcd60e51b815260206004820152603160248201525f805160206143488339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f868152600886016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206143688339815191525f6112d783611ce8565b90505f806112e88360400151611ec9565b915091508061134a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526002850160205260408120805461136490613d2a565b9050118015611396575060015f83815260048601602052604090205460ff16600581111561139457611394613cdb565b145b6113b25760405162461bcd60e51b81526004016104ef9061401c565b5f82815260028501602052604081206113ca91613a6f565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f805160206143688339815191529291906114c490613d2a565b90501180156114f6575060015f83815260048301602052604090205460ff1660058111156114f4576114f4613cdb565b145b6115125760405162461bcd60e51b81526004016104ef9061401c565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401613ed1565b5f610ad0823334612930565b5f8061156234612ce8565b905061157085828686612d9b565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115ed9190810190614082565b91509150806116505760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611693573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b79190613eba565b82511461171b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156117915760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806117a08460400151613276565b9150915081871461180d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206143888339815191526020526040812060030180545f80516020614368833981519152916001600160401b039091169081908461185c83614154565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061438883398151915290528390208351918201909352825491925f8051602061436883398151915292829060ff16600581111561191357611913613cdb565b600581111561192457611924613cdb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614388833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5d57611a1d816001614179565b611a28906008614005565b5081515f90839083908110611a3f57611a3f61418c565b60200101906001600160f81b03191690815f1a905350600101611a09565b505f5b6004811015611ac057611a74816003614179565b611a7f906008614005565b6001901c60f81b82611a928360026141a0565b81518110611aa257611aa261418c565b60200101906001600160f81b03191690815f1a905350600101611a60565b505f5b6020811015611b2257611ad781601f614179565b611ae2906008614005565b86901c60f81b82611af48360066141a0565b81518110611b0457611b0461418c565b60200101906001600160f81b03191690815f1a905350600101611ac3565b505f5b6008811015611b8d57611b39816007614179565b611b44906008614005565b6001600160401b038616901c60f81b82611b5f8360266141a0565b81518110611b6f57611b6f61418c565b60200101906001600160f81b03191690815f1a905350600101611b25565b505f5b6008811015611bf857611ba4816007614179565b611baf906008614005565b6001600160401b038516901c60f81b82611bca83602e6141a0565b81518110611bda57611bda61418c565b60200101906001600160f81b03191690815f1a905350600101611b90565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020526040812080545f80516020614328833981519152929190611c4990613d2a565b9050118015611c7b575060035f83815260088301602052604090205460ff166004811115611c7957611c79613cdb565b145b611cd05760405162461bcd60e51b815260206004820152603360248201525f8051602061434883398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b5050565b611cdc61344e565b611ce581613499565b50565b60408051606080820183525f8083526020830181905292820152905f805160206143688339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d849190810190614082565b9150915080611deb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611e4e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611ec15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f808251602714611eec5760405162461bcd60e51b81526004016104ef906141b3565b5f805b6002811015611f3b57611f03816001614179565b611f0e906008614005565b61ffff16858281518110611f2457611f2461418c565b016020015160f81c901b9190911790600101611eef565b5061ffff811615611f5e5760405162461bcd60e51b81526004016104ef906141fc565b5f805b6004811015611fb957611f75816003614179565b611f80906008614005565b63ffffffff1686611f928360026141a0565b81518110611fa257611fa261418c565b016020015160f81c901b9190911790600101611f61565b5063ffffffff8116600214611fe05760405162461bcd60e51b81526004016104ef9061423f565b5f805b602081101561203557611ff781601f614179565b612002906008614005565b8761200e8360066141a0565b8151811061201e5761201e61418c565b016020015160f81c901b9190911790600101611fe3565b505f8660268151811061204a5761204a61418c565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461208e5760405162461bcd60e51b81526004016104ef906141b3565b5f805b60028110156120dd576120a5816001614179565b6120b0906008614005565b61ffff168682815181106120c6576120c661418c565b016020015160f81c901b9190911790600101612091565b5061ffff8116156121005760405162461bcd60e51b81526004016104ef906141fc565b5f805b600481101561215b57612117816003614179565b612122906008614005565b63ffffffff16876121348360026141a0565b815181106121445761214461418c565b016020015160f81c901b9190911790600101612103565b5063ffffffff81166003146121825760405162461bcd60e51b81526004016104ef9061423f565b5f805b60208110156121d75761219981601f614179565b6121a4906008614005565b886121b08360066141a0565b815181106121c0576121c061418c565b016020015160f81c901b9190911790600101612185565b505f805b6008811015612236576121ef816007614179565b6121fa906008614005565b6001600160401b03168961220f8360266141a0565b8151811061221f5761221f61418c565b016020015160f81c901b91909117906001016121db565b505f805b60088110156122955761224e816007614179565b612259906008614005565b6001600160401b03168a61226e83602e6141a0565b8151811061227e5761227e61418c565b016020015160f81c901b919091179060010161223a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d096020526040812080545f805160206143288339815191529291906122ed90613d2a565b905011801561231f575060015f83815260088301602052604090205460ff16600481111561231d5761231d613cdb565b145b611cd05760405162461bcd60e51b815260206004820152603860248201525f8051602061434883398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f805160206143288339815191525f6123b57fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb065490565b6003830154909150600160401b900460ff1615806123d1575080155b156123db57505050565b6002820154429081116123ee5750505050565b6040805160608101825260048501548082526005860154602083015260068601546001600160401b03908116938301939093526003860154919291909116906124379084614179565b1061245a576001600160401b038516604082015281815260208101839052612479565b848160400181815161246c9190614286565b6001600160401b03169052505b5f81602001518260400151606461249091906142a6565b6001600160401b03166124a39190613f5b565b600386015490915060ff600160401b909104811690821611156125215760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2063687560448201526f1c9b881c985d1948195e18d95959195960821b60648201526084016104ef565b508051600485015560208101516005850155604001516006909301805467ffffffffffffffff19166001600160401b0390941693909317909255505050565b5f8181525f8051602061438883398151915260205260408082208151610100810190925280545f8051602061436883398151915293929190829060ff1660058111156125ae576125ae613cdb565b60058111156125bf576125bf613cdb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561264757612647613cdb565b146126a35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b03161461271d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff1916600183600581111561276157612761613cdb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61282d8461282781611817565b5f6119e4565b5f85815260038501602052604090209091506128498282613da7565b508160a001516001600160401b0316836006015f82825461286a9190614179565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061289b908590600401613e88565b6020604051808303815f875af11580156128b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128db9190613eba565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f612939613504565b5f61294383610ac0565b90505f805160206143288339815191525f61295d8761188b565b905060028151600581111561297457612974613cdb565b146129d35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f838260a001516129e49190614286565b90506129f0888261199c565b5f6129fa89611817565b90505f898983604051602001612a429392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612a638661237e565b5f612a6f8b84866119e4565b5f8381526009880160205260409020909150612a8b8282613da7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ab8908590600401613e88565b6020604051808303815f875af1158015612ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af89190613eba565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876008015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612ba757612ba7613cdb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061157460015f805160206143a883398151915255565b5f5f805160206143288339815191528282612d0282610ac0565b83549091506001600160401b03821610801590612d2c57508260010154816001600160401b031611155b612d8a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b612d938161237e565b949350505050565b5f612da4613504565b5f80516020614368833981519152426001600160401b03851611612e265760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612e3d426202a3006141a0565b11612eb05760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612f075760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f86815260058201602052604090205415612f755760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b8251603014612fdc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b5f806130236040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061354e565b5f828152600286016020526040902091935091506130418282613da7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061306e908590600401613e88565b6020604051808303815f875af115801561308a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130ae9190613eba565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff1916600183600581111561313057613130613cdb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695851695909517919091171692909217929092179055600685018054918a16915f906132019084906141a0565b90915550613210905083611817565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612d9360015f805160206143a883398151915255565b5f808251602e146132995760405162461bcd60e51b81526004016104ef906141b3565b5f805b60028110156132e8576132b0816001614179565b6132bb906008614005565b61ffff168582815181106132d1576132d161418c565b016020015160f81c901b919091179060010161329c565b5061ffff81161561330b5760405162461bcd60e51b81526004016104ef906141fc565b5f805b600481101561336657613322816003614179565b61332d906008614005565b63ffffffff168661333f8360026141a0565b8151811061334f5761334f61418c565b016020015160f81c901b919091179060010161330e565b5063ffffffff811660041461338d5760405162461bcd60e51b81526004016104ef9061423f565b5f805b60208110156133e2576133a481601f614179565b6133af906008614005565b876133bb8360066141a0565b815181106133cb576133cb61418c565b016020015160f81c901b9190911790600101613390565b505f805b6008811015613441576133fa816007614179565b613405906008614005565b6001600160401b03168861341a8360266141a0565b8151811061342a5761342a61418c565b016020015160f81c901b91909117906001016133e6565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661349757604051631afcd79f60e31b815260040160405180910390fd5b565b6134a161344e565b6134aa816138f3565b611ce56040820135606083013560808401356134cc60c0860160a08701613b9e565b6134dc60e0870160c08801613b9e565b6134ed610100880160e089016142d1565b6134ff61012089016101008a016142f1565b613914565b5f805160206143a883398151915280546001190161353557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206143a883398151915255565b5f60608260800151516030146135b85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561362f576135ef816001614179565b6135fa906008614005565b5081515f908390839081106136115761361161418c565b60200101906001600160f81b03191690815f1a9053506001016135db565b505f5b600481101561368d57613646816003614179565b613651906008614005565b505f8261365f8360026141a0565b8151811061366f5761366f61418c565b60200101906001600160f81b03191690815f1a905350600101613632565b505f5b60208110156136ea57845181602081106136ac576136ac61418c565b1a60f81b826136bc8360066141a0565b815181106136cc576136cc61418c565b60200101906001600160f81b03191690815f1a905350600101613690565b505f5b602081101561374a578460200151816020811061370c5761370c61418c565b1a60f81b8261371c8360266141a0565b8151811061372c5761372c61418c565b60200101906001600160f81b03191690815f1a9053506001016136ed565b505f5b60088110156137be57613761816007614179565b61376c906008614005565b60ff1685604001516001600160401b0316901c60f81b8282604661379091906141a0565b815181106137a0576137a061418c565b60200101906001600160f81b03191690815f1a90535060010161374d565b505f5b603081101561382957846080015181815181106137e0576137e061418c565b01602001516001600160f81b031916826137fb83604e6141a0565b8151811061380b5761380b61418c565b60200101906001600160f81b03191690815f1a9053506001016137c1565b505f5b600881101561389b57613840816007614179565b61384b906008614005565b60608601516001600160401b0390811691161c60f81b8261386d83607e6141a0565b8151811061387d5761387d61418c565b60200101906001600160f81b03191690815f1a90535060010161382c565b506002816040516138ac919061430c565b602060405180830381855afa1580156138c7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138ea9190613eba565b94909350915050565b6138fb61344e565b613903613a0e565b61390b613a1e565b611ce581613a26565b61391c61344e565b5f80516020614328833981519152969096557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01949094557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02929092557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0380547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0395861617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b613a1661344e565b613497613a67565b61349761344e565b613a2e61344e565b80355f8051602061436883398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b61353b61344e565b508054613a7b90613d2a565b5f825580601f10613a8a575050565b601f0160209004905f5260205f2090810190611ce591905b80821115613ab5575f8155600101613aa2565b5090565b8015158114611ce5575f80fd5b803563ffffffff81168114613ad9575f80fd5b919050565b5f805f60608486031215613af0575f80fd5b833592506020840135613b0281613ab9565b9150613b1060408501613ac6565b90509250925092565b5f60208284031215613b29575f80fd5b5035919050565b5f6101208284031215613b41575f80fd5b50919050565b5f60208284031215613b57575f80fd5b61157482613ac6565b5f8060408385031215613b71575f80fd5b613b7a83613ac6565b946020939093013593505050565b80356001600160401b0381168114613ad9575f80fd5b5f60208284031215613bae575f80fd5b61157482613b88565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bed57613bed613bb7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c1b57613c1b613bb7565b604052919050565b5f6001600160401b03821115613c3b57613c3b613bb7565b50601f01601f191660200190565b5f805f60608486031215613c5b575f80fd5b83359250613c6b60208501613b88565b915060408401356001600160401b03811115613c85575f80fd5b8401601f81018613613c95575f80fd5b8035613ca8613ca382613c23565b613bf3565b818152876020838501011115613cbc575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613d2357613d23613cef565b5092915050565b600181811c90821680613d3e57607f821691505b602082108103613b4157634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c81016020851015613d815750805b601f840160051c820191505b81811015613da0575f8155600101613d8d565b5050505050565b81516001600160401b03811115613dc057613dc0613bb7565b613dd481613dce8454613d2a565b84613d5c565b602080601f831160018114613e07575f8415613df05750858301515b5f19600386901b1c1916600185901b178555613e5e565b5f85815260208120601f198616915b82811015613e3557888601518255948401946001909101908401613e16565b5085821015613e5257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613e80578181015183820152602001613e68565b50505f910152565b602081525f8251806020840152613ea6816040850160208701613e66565b601f01601f19169190910160400192915050565b5f60208284031215613eca575f80fd5b5051919050565b5f60208083525f8454613ee381613d2a565b806020870152604060018084165f8114613f045760018114613f2057613f4d565b60ff19851660408a0152604084151560051b8a01019550613f4d565b895f5260205f205f5b85811015613f445781548b8201860152908301908801613f29565b8a016040019650505b509398975050505050505050565b5f82613f7557634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad057610ad0613cef565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611ce5575f80fd5b8051613ad981613ab9565b5f8060408385031215614093575f80fd5b82516001600160401b03808211156140a9575f80fd5b90840190606082870312156140bc575f80fd5b6140c4613bcb565b825181526020808401516140d781614063565b828201526040840151838111156140ec575f80fd5b80850194505087601f850112614100575f80fd5b83519250614110613ca384613c23565b8381528882858701011115614123575f80fd5b61413284838301848801613e66565b80604084015250819550614147818801614077565b9450505050509250929050565b5f6001600160401b0380831681810361416f5761416f613cef565b6001019392505050565b81810381811115610ad057610ad0613cef565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad057610ad0613cef565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613d2357613d23613cef565b6001600160401b038181168382160280821691908281146142c9576142c9613cef565b505092915050565b5f602082840312156142e1575f80fd5b813560ff81168114611574575f80fd5b5f60208284031215614301575f80fd5b813561157481614063565b5f825161431d818460208701613e66565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 070d6c69f..625f8c832 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -38,7 +38,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516129a03803806129a083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6128538061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063f2fde38b14610219578063f3e148eb1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd36600461220c565b61023f565b005b6101226100f236600461220c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b6101226101433660046122d0565b6103a0565b6100e2610156366004612373565b6103c0565b61016e61016936600461220c565b610744565b6040516001600160401b03909116815260200161012c565b6100e2610758565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e036600461220c565b61076b565b6100e26101f3366004612373565b610777565b6101ba6005600160991b0181565b6100e261021436600461220c565b610934565b6100e26102273660046123b1565b610a03565b6100e261023a3660046123cc565b610a3d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f8051602061282783398151915292919061028790612408565b90501180156102b9575060035f83815260048301602052604090205460ff1660058111156102b7576102b7612440565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b9190600401612454565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b91906124de565b505050565b5f6103a9610b4b565b6103b584868585610ba6565b90505b949350505050565b5f805160206128278339815191525f6103d883611075565b90505f806103e98360400151611256565b91509150801561044e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600485016020526040808220815161010081019092528054829060ff16600581111561048057610480612440565b600581111561049157610491612440565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f908251600581111561051857610518612440565b1480610536575060018251600581111561053457610534612440565b145b6105955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b6003825160058111156105aa576105aa612440565b036105d157505f83815260038601602052604081206004916105cc91906121c2565b6105d5565b5060055b6020808301515f90815260058089019092526040812055829082908111156105ff576105ff612440565b9081600581111561061257610612612440565b9052505f84815260048701602052604090208251815484929190829060ff1916600183600581111561064657610646612440565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561071157610711612440565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61074e826114b5565b60a0015192915050565b610760610b4b565b6107695f6115d9565b565b61077481611649565b50565b5f805160206128278339815191525f61078f83611075565b90505f806107a08360400151611256565b91509150806108025760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f8281526002850160205260408120805461081c90612408565b905011801561084e575060015f83815260048601602052604090205460ff16600581111561084c5761084c612440565b145b61086a5760405162461bcd60e51b8152600401610319906124f5565b5f8281526002850160205260408120610882916121c2565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061282783398151915292919061097c90612408565b90501180156109ae575060015f83815260048301602052604090205460ff1660058111156109ac576109ac612440565b145b6109ca5760405162461bcd60e51b8152600401610319906124f5565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b9190600401612454565b610a0b610b4b565b6001600160a01b038116610a3457604051631e4fbdf760e01b81525f6004820152602401610319565b610774816115d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a815750825b90505f826001600160401b03166001148015610a9c5750303b155b905081158015610aaa575080155b15610ac85760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610af257845460ff60401b1916600160401b1785555b610afc8787611a07565b8315610b4257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b33610b7d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107695760405163118cdaa760e01b8152336004820152602401610319565b5f610baf611a25565b5f80516020612827833981519152426001600160401b03851611610c315760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610319565b6001600160401b038416610c48426202a300612550565b11610cbb5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610319565b85610d125760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f86815260058201602052604090205415610d805760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610de75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b5f80610e2e6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611a6f565b5f82815260028601602052604090209193509150610e4c82826125b4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610e79908590600401612695565b6020604051808303815f875af1158015610e95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb991906124de565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff19166001836005811115610f3b57610f3b612440565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610ffc83611e14565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f805160206128278339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156110ea573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261111191908101906126d6565b91509150806111785760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146111db5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b03161561124e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146112bb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b600281101561130a576112d28160016127a8565b6112dd9060086127bb565b61ffff168582815181106112f3576112f36127d2565b016020015160f81c901b91909117906001016112be565b5061ffff8116156113695760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b60048110156113c4576113808160036127a8565b61138b9060086127bb565b63ffffffff168661139d836002612550565b815181106113ad576113ad6127d2565b016020015160f81c901b919091179060010161136c565b5063ffffffff811660021461142b5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b60208110156114805761144281601f6127a8565b61144d9060086127bb565b87611459836006612550565b81518110611469576114696127d2565b016020015160f81c901b919091179060010161142e565b505f86602681518110611495576114956127d2565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0490528390208351918201909352825491925f8051602061282783398151915292829060ff16600581111561155057611550612440565b600581111561156157611561612440565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0460205260408082208151610100810190925280545f8051602061282783398151915293929190829060ff1660058111156116aa576116aa612440565b60058111156116bb576116bb612440565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561174357611743612440565b1461179f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146118195760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff1916600183600581111561185d5761185d612440565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6119298461192381611e14565b5f611ec1565b5f858152600385016020526040902090915061194582826125b4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611972908590600401612695565b6020604051808303815f875af115801561198e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b291906124de565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b611a0f6120de565b611a1882612127565b611a2181612148565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a6957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6060826080015151603014611ad95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611b5057611b108160016127a8565b611b1b9060086127bb565b5081515f90839083908110611b3257611b326127d2565b60200101906001600160f81b03191690815f1a905350600101611afc565b505f5b6004811015611bae57611b678160036127a8565b611b729060086127bb565b505f82611b80836002612550565b81518110611b9057611b906127d2565b60200101906001600160f81b03191690815f1a905350600101611b53565b505f5b6020811015611c0b5784518160208110611bcd57611bcd6127d2565b1a60f81b82611bdd836006612550565b81518110611bed57611bed6127d2565b60200101906001600160f81b03191690815f1a905350600101611bb1565b505f5b6020811015611c6b5784602001518160208110611c2d57611c2d6127d2565b1a60f81b82611c3d836026612550565b81518110611c4d57611c4d6127d2565b60200101906001600160f81b03191690815f1a905350600101611c0e565b505f5b6008811015611cdf57611c828160076127a8565b611c8d9060086127bb565b60ff1685604001516001600160401b0316901c60f81b82826046611cb19190612550565b81518110611cc157611cc16127d2565b60200101906001600160f81b03191690815f1a905350600101611c6e565b505f5b6030811015611d4a5784608001518181518110611d0157611d016127d2565b01602001516001600160f81b03191682611d1c83604e612550565b81518110611d2c57611d2c6127d2565b60200101906001600160f81b03191690815f1a905350600101611ce2565b505f5b6008811015611dbc57611d618160076127a8565b611d6c9060086127bb565b60608601516001600160401b0390811691161c60f81b82611d8e83607e612550565b81518110611d9e57611d9e6127d2565b60200101906001600160f81b03191690815f1a905350600101611d4d565b50600281604051611dcd91906127e6565b602060405180830381855afa158015611de8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611e0b91906124de565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040812060030180545f80516020612827833981519152916001600160401b0390911690819084611e6c83612801565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611f3a57611efa8160016127a8565b611f059060086127bb565b5081515f90839083908110611f1c57611f1c6127d2565b60200101906001600160f81b03191690815f1a905350600101611ee6565b505f5b6004811015611f9d57611f518160036127a8565b611f5c9060086127bb565b6001901c60f81b82611f6f836002612550565b81518110611f7f57611f7f6127d2565b60200101906001600160f81b03191690815f1a905350600101611f3d565b505f5b6020811015611fff57611fb481601f6127a8565b611fbf9060086127bb565b86901c60f81b82611fd1836006612550565b81518110611fe157611fe16127d2565b60200101906001600160f81b03191690815f1a905350600101611fa0565b505f5b600881101561206a576120168160076127a8565b6120219060086127bb565b6001600160401b038616901c60f81b8261203c836026612550565b8151811061204c5761204c6127d2565b60200101906001600160f81b03191690815f1a905350600101612002565b505f5b60088110156120d5576120818160076127a8565b61208c9060086127bb565b6001600160401b038516901c60f81b826120a783602e612550565b815181106120b7576120b76127d2565b60200101906001600160f81b03191690815f1a90535060010161206d565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661076957604051631afcd79f60e31b815260040160405180910390fd5b61212f6120de565b612137612159565b61213f612169565b61077481612171565b6121506120de565b610774816121b2565b6121616120de565b6107696121ba565b6107696120de565b6121796120de565b80355f8051602061282783398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b610a0b6120de565b611e9b6120de565b5080546121ce90612408565b5f825580601f106121dd575050565b601f0160209004905f5260205f209081019061077491905b80821115612208575f81556001016121f5565b5090565b5f6020828403121561221c575f80fd5b5035919050565b80356001600160401b0381168114612239575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156122745761227461223e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156122a2576122a261223e565b604052919050565b5f6001600160401b038211156122c2576122c261223e565b50601f01601f191660200190565b5f805f80608085870312156122e3575f80fd5b6122ec85612223565b93506020850135925061230160408601612223565b915060608501356001600160401b0381111561231b575f80fd5b8501601f8101871361232b575f80fd5b803561233e612339826122aa565b61227a565b818152886020838501011115612352575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612383575f80fd5b813563ffffffff81168114612396575f80fd5b9392505050565b6001600160a01b0381168114610774575f80fd5b5f602082840312156123c1575f80fd5b81356123968161239d565b5f8082840360608112156123de575f80fd5b60408112156123eb575f80fd5b5082915060408301356123fd8161239d565b809150509250929050565b600181811c9082168061241c57607f821691505b60208210810361243a57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f845461246681612408565b806020870152604060018084165f811461248757600181146124a3576124d0565b60ff19851660408a0152604084151560051b8a010195506124d0565b895f5260205f205f5b858110156124c75781548b82018601529083019088016124ac565b8a016040019650505b509398975050505050505050565b5f602082840312156124ee575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156125635761256361253c565b92915050565b601f82111561039b57805f5260205f20601f840160051c8101602085101561258e5750805b601f840160051c820191505b818110156125ad575f815560010161259a565b5050505050565b81516001600160401b038111156125cd576125cd61223e565b6125e1816125db8454612408565b84612569565b602080601f831160018114612614575f84156125fd5750858301515b5f19600386901b1c1916600185901b17855561266b565b5f85815260208120601f198616915b8281101561264257888601518255948401946001909101908401612623565b508582101561265f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561268d578181015183820152602001612675565b50505f910152565b602081525f82518060208401526126b3816040850160208701612673565b601f01601f19169190910160400192915050565b80518015158114612239575f80fd5b5f80604083850312156126e7575f80fd5b82516001600160401b03808211156126fd575f80fd5b9084019060608287031215612710575f80fd5b612718612252565b8251815260208084015161272b8161239d565b82820152604084015183811115612740575f80fd5b80850194505087601f850112612754575f80fd5b83519250612764612339846122aa565b8381528882858701011115612777575f80fd5b61278684838301848801612673565b8060408401525081955061279b8188016126c7565b9450505050509250929050565b818103818111156125635761256361253c565b80820281158282048414176125635761256361253c565b634e487b7160e01b5f52603260045260245ffd5b5f82516127f7818460208701612673565b9190910192915050565b5f6001600160401b0380831681810361281c5761281c61253c565b600101939250505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516129e43803806129e483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6128978061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063f2fde38b14610219578063f3e148eb1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd366004612250565b61023f565b005b6101226100f2366004612250565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612314565b6103a0565b6100e26101563660046123b7565b6103c0565b61016e610169366004612250565b610744565b6040516001600160401b03909116815260200161012c565b6100e2610758565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e0366004612250565b61076b565b6100e26101f33660046123b7565b610777565b6101ba6005600160991b0181565b6100e2610214366004612250565b610934565b6100e26102273660046123f5565b610a03565b6100e261023a366004612410565b610a3d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f8051602061286b8339815191529291906102879061244c565b90501180156102b9575060035f83815260048301602052604090205460ff1660058111156102b7576102b7612484565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b9190600401612498565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612522565b505050565b5f6103a9610b4b565b6103b584868585610ba6565b90505b949350505050565b5f8051602061286b8339815191525f6103d883611094565b90505f806103e98360400151611275565b91509150801561044e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600485016020526040808220815161010081019092528054829060ff16600581111561048057610480612484565b600581111561049157610491612484565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f908251600581111561051857610518612484565b1480610536575060018251600581111561053457610534612484565b145b6105955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b6003825160058111156105aa576105aa612484565b036105d157505f83815260038601602052604081206004916105cc9190612206565b6105d5565b5060055b6020808301515f90815260058089019092526040812055829082908111156105ff576105ff612484565b9081600581111561061257610612612484565b9052505f84815260048701602052604090208251815484929190829060ff1916600183600581111561064657610646612484565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561071157610711612484565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61074e826114d4565b60a0015192915050565b610760610b4b565b6107695f6115f8565b565b61077481611668565b50565b5f8051602061286b8339815191525f61078f83611094565b90505f806107a08360400151611275565b91509150806108025760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f8281526002850160205260408120805461081c9061244c565b905011801561084e575060015f83815260048601602052604090205460ff16600581111561084c5761084c612484565b145b61086a5760405162461bcd60e51b815260040161031990612539565b5f828152600285016020526040812061088291612206565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061286b83398151915292919061097c9061244c565b90501180156109ae575060015f83815260048301602052604090205460ff1660058111156109ac576109ac612484565b145b6109ca5760405162461bcd60e51b815260040161031990612539565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b9190600401612498565b610a0b610b4b565b6001600160a01b038116610a3457604051631e4fbdf760e01b81525f6004820152602401610319565b610774816115f8565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a815750825b90505f826001600160401b03166001148015610a9c5750303b155b905081158015610aaa575080155b15610ac85760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610af257845460ff60401b1916600160401b1785555b610afc8787611a4b565b8315610b4257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b33610b7d7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107695760405163118cdaa760e01b8152336004820152602401610319565b5f610baf611a69565b5f8051602061286b833981519152426001600160401b03851611610c315760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610319565b6001600160401b038416610c48426202a300612594565b11610cbb5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610319565b85610d125760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f86815260058201602052604090205415610d805760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610de75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b5f80610e2e6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611ab3565b5f82815260028601602052604090209193509150610e4c82826125f8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610e799085906004016126d9565b6020604051808303815f875af1158015610e95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb99190612522565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff19166001836005811115610f3b57610f3b612484565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695851695909517919091171692909217929092179055600685018054918a16915f9061100c908490612594565b9091555061101b905083611e58565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f8051602061286b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611109573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611130919081019061271a565b91509150806111975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146111fa5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b03161561126d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146112da5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b6002811015611329576112f18160016127ec565b6112fc9060086127ff565b61ffff1685828151811061131257611312612816565b016020015160f81c901b91909117906001016112dd565b5061ffff8116156113885760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b60048110156113e35761139f8160036127ec565b6113aa9060086127ff565b63ffffffff16866113bc836002612594565b815181106113cc576113cc612816565b016020015160f81c901b919091179060010161138b565b5063ffffffff811660021461144a5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b602081101561149f5761146181601f6127ec565b61146c9060086127ff565b87611478836006612594565b8151811061148857611488612816565b016020015160f81c901b919091179060010161144d565b505f866026815181106114b4576114b4612816565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0490528390208351918201909352825491925f8051602061286b83398151915292829060ff16600581111561156f5761156f612484565b600581111561158057611580612484565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0460205260408082208151610100810190925280545f8051602061286b83398151915293929190829060ff1660058111156116c9576116c9612484565b60058111156116da576116da612484565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561176257611762612484565b146117be5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146118385760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff1916600183600581111561187c5761187c612484565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6119488461194281611e58565b5f611f05565b5f858152600385016020526040902090915061196482826125f8565b508160a001516001600160401b0316836006015f82825461198591906127ec565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906119b69085906004016126d9565b6020604051808303815f875af11580156119d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119f69190612522565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b611a53612122565b611a5c8261216b565b611a658161218c565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611aad57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6060826080015151603014611b1d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611b9457611b548160016127ec565b611b5f9060086127ff565b5081515f90839083908110611b7657611b76612816565b60200101906001600160f81b03191690815f1a905350600101611b40565b505f5b6004811015611bf257611bab8160036127ec565b611bb69060086127ff565b505f82611bc4836002612594565b81518110611bd457611bd4612816565b60200101906001600160f81b03191690815f1a905350600101611b97565b505f5b6020811015611c4f5784518160208110611c1157611c11612816565b1a60f81b82611c21836006612594565b81518110611c3157611c31612816565b60200101906001600160f81b03191690815f1a905350600101611bf5565b505f5b6020811015611caf5784602001518160208110611c7157611c71612816565b1a60f81b82611c81836026612594565b81518110611c9157611c91612816565b60200101906001600160f81b03191690815f1a905350600101611c52565b505f5b6008811015611d2357611cc68160076127ec565b611cd19060086127ff565b60ff1685604001516001600160401b0316901c60f81b82826046611cf59190612594565b81518110611d0557611d05612816565b60200101906001600160f81b03191690815f1a905350600101611cb2565b505f5b6030811015611d8e5784608001518181518110611d4557611d45612816565b01602001516001600160f81b03191682611d6083604e612594565b81518110611d7057611d70612816565b60200101906001600160f81b03191690815f1a905350600101611d26565b505f5b6008811015611e0057611da58160076127ec565b611db09060086127ff565b60608601516001600160401b0390811691161c60f81b82611dd283607e612594565b81518110611de257611de2612816565b60200101906001600160f81b03191690815f1a905350600101611d91565b50600281604051611e11919061282a565b602060405180830381855afa158015611e2c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611e4f9190612522565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040812060030180545f8051602061286b833981519152916001600160401b0390911690819084611eb083612845565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611f7e57611f3e8160016127ec565b611f499060086127ff565b5081515f90839083908110611f6057611f60612816565b60200101906001600160f81b03191690815f1a905350600101611f2a565b505f5b6004811015611fe157611f958160036127ec565b611fa09060086127ff565b6001901c60f81b82611fb3836002612594565b81518110611fc357611fc3612816565b60200101906001600160f81b03191690815f1a905350600101611f81565b505f5b602081101561204357611ff881601f6127ec565b6120039060086127ff565b86901c60f81b82612015836006612594565b8151811061202557612025612816565b60200101906001600160f81b03191690815f1a905350600101611fe4565b505f5b60088110156120ae5761205a8160076127ec565b6120659060086127ff565b6001600160401b038616901c60f81b82612080836026612594565b8151811061209057612090612816565b60200101906001600160f81b03191690815f1a905350600101612046565b505f5b6008811015612119576120c58160076127ec565b6120d09060086127ff565b6001600160401b038516901c60f81b826120eb83602e612594565b815181106120fb576120fb612816565b60200101906001600160f81b03191690815f1a9053506001016120b1565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661076957604051631afcd79f60e31b815260040160405180910390fd5b612173612122565b61217b61219d565b6121836121ad565b610774816121b5565b612194612122565b610774816121f6565b6121a5612122565b6107696121fe565b610769612122565b6121bd612122565b80355f8051602061286b83398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b610a0b612122565b611edf612122565b5080546122129061244c565b5f825580601f10612221575050565b601f0160209004905f5260205f209081019061077491905b8082111561224c575f8155600101612239565b5090565b5f60208284031215612260575f80fd5b5035919050565b80356001600160401b038116811461227d575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156122b8576122b8612282565b60405290565b604051601f8201601f191681016001600160401b03811182821017156122e6576122e6612282565b604052919050565b5f6001600160401b0382111561230657612306612282565b50601f01601f191660200190565b5f805f8060808587031215612327575f80fd5b61233085612267565b93506020850135925061234560408601612267565b915060608501356001600160401b0381111561235f575f80fd5b8501601f8101871361236f575f80fd5b803561238261237d826122ee565b6122be565b818152886020838501011115612396575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156123c7575f80fd5b813563ffffffff811681146123da575f80fd5b9392505050565b6001600160a01b0381168114610774575f80fd5b5f60208284031215612405575f80fd5b81356123da816123e1565b5f808284036060811215612422575f80fd5b604081121561242f575f80fd5b508291506040830135612441816123e1565b809150509250929050565b600181811c9082168061246057607f821691505b60208210810361247e57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f84546124aa8161244c565b806020870152604060018084165f81146124cb57600181146124e757612514565b60ff19851660408a0152604084151560051b8a01019550612514565b895f5260205f205f5b8581101561250b5781548b82018601529083019088016124f0565b8a016040019650505b509398975050505050505050565b5f60208284031215612532575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156125a7576125a7612580565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156125d25750805b601f840160051c820191505b818110156125f1575f81556001016125de565b5050505050565b81516001600160401b0381111561261157612611612282565b6126258161261f845461244c565b846125ad565b602080601f831160018114612658575f84156126415750858301515b5f19600386901b1c1916600185901b1785556126af565b5f85815260208120601f198616915b8281101561268657888601518255948401946001909101908401612667565b50858210156126a357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156126d15781810151838201526020016126b9565b50505f910152565b602081525f82518060208401526126f78160408501602087016126b7565b601f01601f19169190910160400192915050565b8051801515811461227d575f80fd5b5f806040838503121561272b575f80fd5b82516001600160401b0380821115612741575f80fd5b9084019060608287031215612754575f80fd5b61275c612296565b8251815260208084015161276f816123e1565b82820152604084015183811115612784575f80fd5b80850194505087601f850112612798575f80fd5b835192506127a861237d846122ee565b83815288828587010111156127bb575f80fd5b6127ca848383018488016126b7565b806040840152508195506127df81880161270b565b9450505050509250929050565b818103818111156125a7576125a7612580565b80820281158282048414176125a7576125a7612580565b634e487b7160e01b5f52603260045260245ffd5b5f825161283b8184602087016126b7565b9190910192915050565b5f6001600160401b0380831681810361286057612860612580565b600101939250505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 313832d94..4922d2b93 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -27,8 +27,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 _minimumStakeAmount; /// @notice The maximum amount of stake allowed to be a validator. uint256 _maximumStakeAmount; - /// @notice The total weight of all validators. - uint256 _totalWeight; /// @notice The time at which the churn tracker will start. This is allow networks to bootstrap /// their validator set without worrying about churn tracking for a set period of time. uint256 _churnTrackerStartTime; @@ -110,12 +108,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bool includeUptimeProof, uint32 messageIndex ) external { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - uint64 weight = _getValidator(validationID).weight; _checkAndUpdateChurnTracker(weight); - // Update weight after checking the churn tracker. - $._totalWeight -= weight; if (includeUptimeProof) { _getUptime(validationID, messageIndex); @@ -162,8 +156,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Check that adding this validator would not exceed the maximum churn rate. _checkAndUpdateChurnTracker(weight); - // Update weight after checking the churn tracker. - $._totalWeight += weight; return weight; } @@ -186,7 +178,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager */ function _checkAndUpdateChurnTracker(uint64 weight) private { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - if ($._maximumChurnPercentage == 0 || $._totalWeight == 0) { + uint256 totalWeight = _getTotalWeight(); + if ($._maximumChurnPercentage == 0 || totalWeight == 0) { return; } @@ -199,7 +192,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager if (currentTime - churnTracker.startedAt >= $._churnPeriodSeconds) { churnTracker.churnAmount = weight; churnTracker.startedAt = currentTime; - churnTracker.initialWeight = $._totalWeight; + churnTracker.initialWeight = totalWeight; } else { churnTracker.churnAmount += weight; } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 692ed14b6..4c237c0f4 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -44,6 +44,8 @@ abstract contract ValidatorManager is mapping(bytes32 => Validator) _validationPeriods; /// @notice Maps the nodeID to the validationID for active validation periods. mapping(bytes32 => bytes32) _activeValidators; + /// @notice The total weight of all validators. + uint256 _totalWeight; } // solhint-enable private-vars-leading-underscore @@ -144,8 +146,13 @@ abstract contract ValidatorManager is startedAt: 0, // The validation period only starts once the registration is acknowledged. endedAt: 0 }); + + // Update total weight + $._totalWeight += weight; + // Increment the nonce for the next usage. _getAndIncrementNonce(validationID); + emit ValidationPeriodCreated(validationID, nodeID, messageID, weight, registrationExpiry); return validationID; @@ -232,6 +239,9 @@ abstract contract ValidatorManager is .packSetSubnetValidatorWeightMessage(validationID, _getAndIncrementNonce(validationID), 0); $._pendingEndValidationMessages[validationID] = setValidatorWeightPayload; + // Update weight after checking the churn tracker. + $._totalWeight -= validator.weight; + bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); // Emit the event to signal the start of the validator removal process. @@ -342,6 +352,10 @@ abstract contract ValidatorManager is return $._validationPeriods[validationID]; } + function _getTotalWeight() internal view returns (uint256) { + return _getValidatorManagerStorage()._totalWeight; + } + function _setValidatorWeight(bytes32 validationID, uint64 weight) internal { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); $._validationPeriods[validationID].weight = weight; From b25685798b12f9b5ca83c3c80ab7ff5945ac1b38 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 6 Sep 2024 13:07:03 -0400 Subject: [PATCH 217/545] Remove pendingEndValidationMessages --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/staking/ValidatorManager.sol | 14 +++++++------- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 5fac034af..b7a002bc3 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161478038038061478083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146338061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613c9f565b6102d6565b005b610128610138366004613cda565b610761565b61017b61014b366004613cda565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613cda565b6108bd565b6101286101af366004613d05565b61092a565b6101c76101c2366004613cda565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d42565b610a24565b610128610200366004613d5b565b610da7565b61017b610213366004613d99565b610f98565b6101c7610226366004613cda565b610fb1565b610128610239366004613cda565b610fc5565b61012861024c366004613c9f565b611032565b61017b61025f366004613e44565b61104d565b610128610272366004613d5b565b611072565b61017b610285366004613ee0565b611212565b610128610298366004613d42565b611225565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613cda565b6113e2565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145878339815191529184156103285761032582856114b1565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613f00565b600481111561036b5761036b613f00565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613f00565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206145a78339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206145a78339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461174d565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500613f00565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856117c1565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190613f28565b905061066a86826118d2565b5f61067687858461191a565b5f8c815260058a01602052604090209091506106928282613fd2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016140b3565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906140e5565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145c78339815191529291906107a990613f4f565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9613f00565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016140fc565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906140e5565b505050565b6108c681611b37565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614587833981519152916005600160991b019163ee5b48eb91610878916004016140fc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc8484611c0a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361419a565b92915050565b5f805160206145c78339815191525f610a3c83611c24565b90505f80610a4d8360400151611e05565b915091508015610ab25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610ae457610ae4613f00565b6005811115610af557610af5613f00565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b7c57610b7c613f00565b1480610b9a5750600182516005811115610b9857610b98613f00565b145b610bf95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610c0e57610c0e613f00565b03610c3557505f8381526006860160205260408120600491610c309190613c30565b610c39565b5060055b6020808301515f90815260088801909152604081205581816005811115610c6257610c62613f00565b90816005811115610c7557610c75613f00565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ca957610ca9613f00565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d7457610d74613f00565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145878339815191525f610dbf84611c24565b90505f80610dd08360400151611fa6565b5091509150610dde856121e1565b5f8581526004850160205260408120610df691613c30565b5f610e00836117c1565b9050816001600160401b031681608001516001600160401b03161015610e385760405162461bcd60e51b815260040161043b906141ad565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e7d5760405162461bcd60e51b815260040161043b906141ef565b60015f87815260038701602052604090205460ff166004811115610ea357610ea3613f00565b14610f0c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a51000614238565b5f610fbb826117c1565b60a0015192915050565b610fce816121e1565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614587833981519152916005600160991b019163ee5b48eb91610878916004016140fc565b81156110445761104283826114b1565b505b6108b8836122ba565b5f8061105886612672565b90506110668582868661271f565b9150505b949350505050565b5f805160206145878339815191525f61108a84611c24565b90505f8061109b8360400151611fa6565b50915091506110a985611b37565b5f85815260058501602052604081206110c191613c30565b5f6110cb836117c1565b9050816001600160401b031681608001516001600160401b031610156111035760405162461bcd60e51b815260040161043b906141ad565b5f8681526003808701602052604090912001546001600160401b03808416911611156111415760405162461bcd60e51b815260040161043b906141ef565b60035f87815260038701602052604090205460ff16600481111561116757611167613f00565b146111bb5760405162461bcd60e51b815260206004820152603160248201525f805160206145a78339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61121e833384612b74565b9392505050565b5f805160206145c78339815191525f61123d83611c24565b90505f8061124e8360400151611e05565b91509150806112b05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f828152600585016020526040812080546112ca90613f4f565b90501180156112fc575060015f83815260078601602052604090205460ff1660058111156112fa576112fa613f00565b145b6113185760405162461bcd60e51b815260040161043b9061424f565b5f828152600585016020526040812061133091613c30565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145c783398151915292919061142a90613f4f565b905011801561145c575060015f83815260078301602052604090205460ff16600581111561145a5761145a613f00565b145b6114785760405162461bcd60e51b815260040161043b9061424f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016140fc565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114fc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152391908101906142a1565b91509150806115865760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ed91906140e5565b8251146116515760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156116c75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806116d68460400151612f2f565b915091508187146117435760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206146078339815191526020526040812060030180545f805160206145c7833981519152916001600160401b039091169081908461179283614373565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061460783398151915290528390208351918201909352825491925f805160206145c783398151915292829060ff16600581111561184957611849613f00565b600581111561185a5761185a613f00565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614607833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561199357611953816001614398565b61195e906008614238565b5081515f90839083908110611975576119756143ab565b60200101906001600160f81b03191690815f1a90535060010161193f565b505f5b60048110156119f6576119aa816003614398565b6119b5906008614238565b6001901c60f81b826119c88360026143bf565b815181106119d8576119d86143ab565b60200101906001600160f81b03191690815f1a905350600101611996565b505f5b6020811015611a5857611a0d81601f614398565b611a18906008614238565b86901c60f81b82611a2a8360066143bf565b81518110611a3a57611a3a6143ab565b60200101906001600160f81b03191690815f1a9053506001016119f9565b505f5b6008811015611ac357611a6f816007614398565b611a7a906008614238565b6001600160401b038616901c60f81b82611a958360266143bf565b81518110611aa557611aa56143ab565b60200101906001600160f81b03191690815f1a905350600101611a5b565b505f5b6008811015611b2e57611ada816007614398565b611ae5906008614238565b6001600160401b038516901c60f81b82611b0083602e6143bf565b81518110611b1057611b106143ab565b60200101906001600160f81b03191690815f1a905350600101611ac6565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614587833981519152929190611b7f90613f4f565b9050118015611bb1575060035f83815260038301602052604090205460ff166004811115611baf57611baf613f00565b145b611c065760405162461bcd60e51b815260206004820152603360248201525f805160206145a783398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b611c12613107565b611c1b82613152565b611c0681613198565b60408051606080820183525f8083526020830181905292820152905f805160206145c78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c99573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cc091908101906142a1565b9150915080611d275760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611d8a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611dfd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f808251602714611e285760405162461bcd60e51b815260040161043b906143d2565b5f805b6002811015611e7757611e3f816001614398565b611e4a906008614238565b61ffff16858281518110611e6057611e606143ab565b016020015160f81c901b9190911790600101611e2b565b5061ffff811615611e9a5760405162461bcd60e51b815260040161043b9061441b565b5f805b6004811015611ef557611eb1816003614398565b611ebc906008614238565b63ffffffff1686611ece8360026143bf565b81518110611ede57611ede6143ab565b016020015160f81c901b9190911790600101611e9d565b5063ffffffff8116600214611f1c5760405162461bcd60e51b815260040161043b9061445e565b5f805b6020811015611f7157611f3381601f614398565b611f3e906008614238565b87611f4a8360066143bf565b81518110611f5a57611f5a6143ab565b016020015160f81c901b9190911790600101611f1f565b505f86602681518110611f8657611f866143ab565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611fca5760405162461bcd60e51b815260040161043b906143d2565b5f805b600281101561201957611fe1816001614398565b611fec906008614238565b61ffff16868281518110612002576120026143ab565b016020015160f81c901b9190911790600101611fcd565b5061ffff81161561203c5760405162461bcd60e51b815260040161043b9061441b565b5f805b600481101561209757612053816003614398565b61205e906008614238565b63ffffffff16876120708360026143bf565b81518110612080576120806143ab565b016020015160f81c901b919091179060010161203f565b5063ffffffff81166003146120be5760405162461bcd60e51b815260040161043b9061445e565b5f805b6020811015612113576120d581601f614398565b6120e0906008614238565b886120ec8360066143bf565b815181106120fc576120fc6143ab565b016020015160f81c901b91909117906001016120c1565b505f805b60088110156121725761212b816007614398565b612136906008614238565b6001600160401b03168961214b8360266143bf565b8151811061215b5761215b6143ab565b016020015160f81c901b9190911790600101612117565b505f805b60088110156121d15761218a816007614398565b612195906008614238565b6001600160401b03168a6121aa83602e6143bf565b815181106121ba576121ba6143ab565b016020015160f81c901b9190911790600101612176565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061458783398151915292919061222990613f4f565b905011801561225b575060015f83815260038301602052604090205460ff16600481111561225957612259613f00565b145b611c065760405162461bcd60e51b815260206004820152603860248201525f805160206145a783398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061460783398151915260205260408082208151610100810190925280545f805160206145c783398151915293929190829060ff16600581111561230857612308613f00565b600581111561231957612319613f00565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123a1576123a1613f00565b146123fd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146124775760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6124848160a0015161324c565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124c8576124c8613f00565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125948461258e8161174d565b5f61191a565b5f85815260068501602052604090209091506125b08282613fd2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125dd9085906004016140b3565b6020604051808303815f875af11580156125f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061261d91906140e5565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145878339815191528161268b846133ed565b90505f61269782610a0e565b83549091506001600160401b038216108015906126c157508260010154816001600160401b031611155b61106a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f612728613423565b5f805160206145c7833981519152426001600160401b03851611801561276257506001600160401b038416612760426202a3006143bf565b115b6127c45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b8561281b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600882016020526040902054156128895760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128f05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b6128f98561324c565b5f806129406040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061345a565b5f8281526005860160205260409020919350915061295e8282613fd2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061298b9085906004016140b3565b6020604051808303815f875af11580156129a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129cb91906140e5565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612a4d57612a4d613f00565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612b0e8361174d565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061106a60015f805160206145e783398151915255565b5f612b7d613423565b5f612b8a6101c2846133ed565b90505f805160206145878339815191525f612ba4876117c1565b9050600281516005811115612bbb57612bbb613f00565b14612c1a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612c2b91906144a5565b9050612c3788826118d2565b5f612c418961174d565b90505f898983604051602001612c899392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612caa8661324c565b5f612cb68b848661191a565b5f8381526004880160205260409020909150612cd28282613fd2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cff9085906004016140b3565b6020604051808303815f875af1158015612d1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d3f91906140e5565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612dee57612dee613f00565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061121e60015f805160206145e783398151915255565b5f808251602e14612f525760405162461bcd60e51b815260040161043b906143d2565b5f805b6002811015612fa157612f69816001614398565b612f74906008614238565b61ffff16858281518110612f8a57612f8a6143ab565b016020015160f81c901b9190911790600101612f55565b5061ffff811615612fc45760405162461bcd60e51b815260040161043b9061441b565b5f805b600481101561301f57612fdb816003614398565b612fe6906008614238565b63ffffffff1686612ff88360026143bf565b81518110613008576130086143ab565b016020015160f81c901b9190911790600101612fc7565b5063ffffffff81166004146130465760405162461bcd60e51b815260040161043b9061445e565b5f805b602081101561309b5761305d81601f614398565b613068906008614238565b876130748360066143bf565b81518110613084576130846143ab565b016020015160f81c901b9190911790600101613049565b505f805b60088110156130fa576130b3816007614398565b6130be906008614238565b6001600160401b0316886130d38360266143bf565b815181106130e3576130e36143ab565b016020015160f81c901b919091179060010161309f565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661315057604051631afcd79f60e31b815260040160405180910390fd5b565b61315a613107565b61316381613812565b6131956060820135608083013561318060c0850160a08601613d99565b61319060e0860160c087016144c5565b613833565b50565b6131a0613107565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661322c5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145c78339815191529060ff165f0361328a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132d29083614398565b106132ee576001600160401b038416604083015280825261330d565b838260400181815161330091906144a5565b6001600160401b03169052505b5f82602001518360400151606461332491906144e0565b61332e919061450b565b600285015490915060ff90811690821611156133a95760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061388e565b5f805160206145e783398151915280546001190161345457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134c45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561353b576134fb816001614398565b613506906008614238565b5081515f9083908390811061351d5761351d6143ab565b60200101906001600160f81b03191690815f1a9053506001016134e7565b505f5b600481101561359957613552816003614398565b61355d906008614238565b505f8261356b8360026143bf565b8151811061357b5761357b6143ab565b60200101906001600160f81b03191690815f1a90535060010161353e565b505f5b60208110156135f657845181602081106135b8576135b86143ab565b1a60f81b826135c88360066143bf565b815181106135d8576135d86143ab565b60200101906001600160f81b03191690815f1a90535060010161359c565b505f5b60208110156136565784602001518160208110613618576136186143ab565b1a60f81b826136288360266143bf565b81518110613638576136386143ab565b60200101906001600160f81b03191690815f1a9053506001016135f9565b505f5b60088110156136ca5761366d816007614398565b613678906008614238565b60ff1685604001516001600160401b0316901c60f81b8282604661369c91906143bf565b815181106136ac576136ac6143ab565b60200101906001600160f81b03191690815f1a905350600101613659565b505f5b603081101561373557846080015181815181106136ec576136ec6143ab565b01602001516001600160f81b0319168261370783604e6143bf565b81518110613717576137176143ab565b60200101906001600160f81b03191690815f1a9053506001016136cd565b505f5b60088110156137a75761374c816007614398565b613757906008614238565b60608601516001600160401b0390811691161c60f81b8261377983607e6143bf565b81518110613789576137896143ab565b60200101906001600160f81b03191690815f1a905350600101613738565b506002816040516137b89190614530565b602060405180830381855afa1580156137d3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137f691906140e5565b94909350915050565b60015f805160206145e783398151915255565b61381a613107565b6138226139f0565b61382a613a00565b61319581613a08565b61383b613107565b5f5f80516020614587833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156138d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138f891906140e5565b905061390f6001600160a01b038516333086613a74565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613953573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061397791906140e5565b90508181116139dd5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b6139e78282614398565b95945050505050565b6139f8613107565b613150613ad4565b613150613107565b613a10613107565b80355f805160206145c783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a5a606083016040840161454b565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613ace908590613adc565b50505050565b6137ff613107565b5f613af06001600160a01b03841683613b3d565b905080515f14158015613b14575080806020019051810190613b12919061456b565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b606061121e83835f845f80856001600160a01b03168486604051613b619190614530565b5f6040518083038185875af1925050503d805f8114613b9b576040519150601f19603f3d011682016040523d82523d5f602084013e613ba0565b606091505b5091509150611743868383606082613bc057613bbb82613c07565b61121e565b8151158015613bd757506001600160a01b0384163b155b15613c0057604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b508061121e565b805115613c175780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c3c90613f4f565b5f825580601f10613c4b575050565b601f0160209004905f5260205f209081019061319591905b80821115613c76575f8155600101613c63565b5090565b8015158114613195575f80fd5b803563ffffffff81168114613c9a575f80fd5b919050565b5f805f60608486031215613cb1575f80fd5b833592506020840135613cc381613c7a565b9150613cd160408501613c87565b90509250925092565b5f60208284031215613cea575f80fd5b5035919050565b6001600160a01b0381168114613195575f80fd5b5f80828403610100811215613d18575f80fd5b60e0811215613d25575f80fd5b5082915060e0830135613d3781613cf1565b809150509250929050565b5f60208284031215613d52575f80fd5b61121e82613c87565b5f8060408385031215613d6c575f80fd5b613d7583613c87565b946020939093013593505050565b80356001600160401b0381168114613c9a575f80fd5b5f60208284031215613da9575f80fd5b61121e82613d83565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613de857613de8613db2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e1657613e16613db2565b604052919050565b5f6001600160401b03821115613e3657613e36613db2565b50601f01601f191660200190565b5f805f8060808587031215613e57575f80fd5b8435935060208501359250613e6e60408601613d83565b915060608501356001600160401b03811115613e88575f80fd5b8501601f81018713613e98575f80fd5b8035613eab613ea682613e1e565b613dee565b818152886020838501011115613ebf575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ef1575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f4857613f48613f14565b5092915050565b600181811c90821680613f6357607f821691505b602082108103613f8157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c81016020851015613fac5750805b601f840160051c820191505b81811015613fcb575f8155600101613fb8565b5050505050565b81516001600160401b03811115613feb57613feb613db2565b613fff81613ff98454613f4f565b84613f87565b602080601f831160018114614032575f841561401b5750858301515b5f19600386901b1c1916600185901b178555614089565b5f85815260208120601f198616915b8281101561406057888601518255948401946001909101908401614041565b508582101561407d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140ab578181015183820152602001614093565b50505f910152565b602081525f82518060208401526140d1816040850160208701614091565b601f01601f19169190910160400192915050565b5f602082840312156140f5575f80fd5b5051919050565b5f60208083525f845461410e81613f4f565b806020870152604060018084165f811461412f576001811461414b57614178565b60ff19851660408a0152604084151560051b8a01019550614178565b895f5260205f205f5b8581101561416f5781548b8201860152908301908801614154565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826141a8576141a8614186565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e613f14565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613c9a81613c7a565b5f80604083850312156142b2575f80fd5b82516001600160401b03808211156142c8575f80fd5b90840190606082870312156142db575f80fd5b6142e3613dc6565b825181526020808401516142f681613cf1565b8282015260408401518381111561430b575f80fd5b80850194505087601f85011261431f575f80fd5b8351925061432f613ea684613e1e565b8381528882858701011115614342575f80fd5b61435184838301848801614091565b80604084015250819550614366818801614296565b9450505050509250929050565b5f6001600160401b0380831681810361438e5761438e613f14565b6001019392505050565b81810381811115610a1e57610a1e613f14565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e613f14565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f4857613f48613f14565b5f602082840312156144d5575f80fd5b813561121e81613cf1565b6001600160401b0381811683821602808216919082811461450357614503613f14565b505092915050565b5f6001600160401b038084168061452457614524614186565b92169190910492915050565b5f8251614541818460208701614091565b9190910192915050565b5f6020828403121561455b575f80fd5b813560ff8116811461121e575f80fd5b5f6020828403121561457b575f80fd5b815161121e81613c7a56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161476f38038061476f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146228061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613c8e565b6102d6565b005b610128610138366004613cc9565b610761565b61017b61014b366004613cc9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613cc9565b6108a1565b6101286101af366004613cf4565b610953565b6101c76101c2366004613cc9565b610a37565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d31565b610a4d565b610128610200366004613d4a565b610db6565b61017b610213366004613d88565b610fa7565b6101c7610226366004613cc9565b610fc0565b610128610239366004613cc9565b610fd4565b61012861024c366004613c8e565b611041565b61017b61025f366004613e33565b61105c565b610128610272366004613d4a565b611081565b61017b610285366004613ecf565b611221565b610128610298366004613d31565b611234565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613cc9565b6113f1565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145768339815191529184156103285761032582856114c0565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613eef565b600481111561036b5761036b613eef565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613eef565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206145968339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206145968339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461175c565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500613eef565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856117d0565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190613f17565b905061066a86826118e1565b5f610676878584611929565b5f8c815260058a01602052604090209091506106928282613fc1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016140a2565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906140d4565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181525f805160206145f683398151915260205260409020545f805160206145b68339815191529060039060ff1660058111156107a1576107a1613eef565b146108065760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604081206003015461082e9084906001600160401b031683611929565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061085b9084906004016140a2565b6020604051808303815f875af1158015610877573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089b91906140d4565b50505050565b6108aa81611b46565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614576833981519152916005600160991b019163ee5b48eb9161090e916004016140eb565b6020604051808303815f875af115801561092a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094e91906140d4565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061099c575080546001600160401b03808416911610155b156109ba5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109e58484611c19565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a4764e8d4a5100083614189565b92915050565b5f805160206145b68339815191525f610a6583611c33565b90505f80610a768360400151611e14565b915091508015610adb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610b0d57610b0d613eef565b6005811115610b1e57610b1e613eef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610ba557610ba5613eef565b1480610bc35750600182516005811115610bc157610bc1613eef565b145b610c225760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610c3757610c37613eef565b03610c4457506004610c48565b5060055b6020808301515f90815260078801909152604081205581816005811115610c7157610c71613eef565b90816005811115610c8457610c84613eef565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610cb857610cb8613eef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d8357610d83613eef565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145768339815191525f610dce84611c33565b90505f80610ddf8360400151611fb5565b5091509150610ded856121f0565b5f8581526004850160205260408120610e0591613c1f565b5f610e0f836117d0565b9050816001600160401b031681608001516001600160401b03161015610e475760405162461bcd60e51b815260040161043b9061419c565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e8c5760405162461bcd60e51b815260040161043b906141de565b60015f87815260038701602052604090205460ff166004811115610eb257610eb2613eef565b14610f1b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a476001600160401b03831664e8d4a51000614227565b5f610fca826117d0565b60a0015192915050565b610fdd816121f0565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614576833981519152916005600160991b019163ee5b48eb9161090e916004016140eb565b81156110535761105183826114c0565b505b61094e836122c9565b5f8061106786612667565b905061107585828686612714565b9150505b949350505050565b5f805160206145768339815191525f61109984611c33565b90505f806110aa8360400151611fb5565b50915091506110b885611b46565b5f85815260058501602052604081206110d091613c1f565b5f6110da836117d0565b9050816001600160401b031681608001516001600160401b031610156111125760405162461bcd60e51b815260040161043b9061419c565b5f8681526003808701602052604090912001546001600160401b03808416911611156111505760405162461bcd60e51b815260040161043b906141de565b60035f87815260038701602052604090205460ff16600481111561117657611176613eef565b146111ca5760405162461bcd60e51b815260206004820152603160248201525f805160206145968339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61122d833384612b69565b9392505050565b5f805160206145b68339815191525f61124c83611c33565b90505f8061125d8360400151611e14565b91509150806112bf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f828152600585016020526040812080546112d990613f3e565b905011801561130b575060015f83815260068601602052604090205460ff16600581111561130957611309613eef565b145b6113275760405162461bcd60e51b815260040161043b9061423e565b5f828152600585016020526040812061133f91613c1f565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145b683398151915292919061143990613f3e565b905011801561146b575060015f83815260068301602052604090205460ff16600581111561146957611469613eef565b145b6114875760405162461bcd60e51b815260040161043b9061423e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161090e91906004016140eb565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561150b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115329190810190614290565b91509150806115955760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fc91906140d4565b8251146116605760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156116d65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806116e58460400151612f24565b915091508187146117525760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206145f68339815191526020526040812060030180545f805160206145b6833981519152916001600160401b03909116908190846117a183614362565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f805160206145f683398151915290528390208351918201909352825491925f805160206145b683398151915292829060ff16600581111561185857611858613eef565b600581111561186957611869613eef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206145f6833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119a257611962816001614387565b61196d906008614227565b5081515f908390839081106119845761198461439a565b60200101906001600160f81b03191690815f1a90535060010161194e565b505f5b6004811015611a05576119b9816003614387565b6119c4906008614227565b6001901c60f81b826119d78360026143ae565b815181106119e7576119e761439a565b60200101906001600160f81b03191690815f1a9053506001016119a5565b505f5b6020811015611a6757611a1c81601f614387565b611a27906008614227565b86901c60f81b82611a398360066143ae565b81518110611a4957611a4961439a565b60200101906001600160f81b03191690815f1a905350600101611a08565b505f5b6008811015611ad257611a7e816007614387565b611a89906008614227565b6001600160401b038616901c60f81b82611aa48360266143ae565b81518110611ab457611ab461439a565b60200101906001600160f81b03191690815f1a905350600101611a6a565b505f5b6008811015611b3d57611ae9816007614387565b611af4906008614227565b6001600160401b038516901c60f81b82611b0f83602e6143ae565b81518110611b1f57611b1f61439a565b60200101906001600160f81b03191690815f1a905350600101611ad5565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614576833981519152929190611b8e90613f3e565b9050118015611bc0575060035f83815260038301602052604090205460ff166004811115611bbe57611bbe613eef565b145b611c155760405162461bcd60e51b815260206004820152603360248201525f8051602061459683398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b611c216130fc565b611c2a82613147565b611c158161318d565b60408051606080820183525f8083526020830181905292820152905f805160206145b68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ca8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ccf9190810190614290565b9150915080611d365760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611d995760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611e0c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f808251602714611e375760405162461bcd60e51b815260040161043b906143c1565b5f805b6002811015611e8657611e4e816001614387565b611e59906008614227565b61ffff16858281518110611e6f57611e6f61439a565b016020015160f81c901b9190911790600101611e3a565b5061ffff811615611ea95760405162461bcd60e51b815260040161043b9061440a565b5f805b6004811015611f0457611ec0816003614387565b611ecb906008614227565b63ffffffff1686611edd8360026143ae565b81518110611eed57611eed61439a565b016020015160f81c901b9190911790600101611eac565b5063ffffffff8116600214611f2b5760405162461bcd60e51b815260040161043b9061444d565b5f805b6020811015611f8057611f4281601f614387565b611f4d906008614227565b87611f598360066143ae565b81518110611f6957611f6961439a565b016020015160f81c901b9190911790600101611f2e565b505f86602681518110611f9557611f9561439a565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611fd95760405162461bcd60e51b815260040161043b906143c1565b5f805b600281101561202857611ff0816001614387565b611ffb906008614227565b61ffff168682815181106120115761201161439a565b016020015160f81c901b9190911790600101611fdc565b5061ffff81161561204b5760405162461bcd60e51b815260040161043b9061440a565b5f805b60048110156120a657612062816003614387565b61206d906008614227565b63ffffffff168761207f8360026143ae565b8151811061208f5761208f61439a565b016020015160f81c901b919091179060010161204e565b5063ffffffff81166003146120cd5760405162461bcd60e51b815260040161043b9061444d565b5f805b6020811015612122576120e481601f614387565b6120ef906008614227565b886120fb8360066143ae565b8151811061210b5761210b61439a565b016020015160f81c901b91909117906001016120d0565b505f805b60088110156121815761213a816007614387565b612145906008614227565b6001600160401b03168961215a8360266143ae565b8151811061216a5761216a61439a565b016020015160f81c901b9190911790600101612126565b505f805b60088110156121e057612199816007614387565b6121a4906008614227565b6001600160401b03168a6121b983602e6143ae565b815181106121c9576121c961439a565b016020015160f81c901b9190911790600101612185565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061457683398151915292919061223890613f3e565b905011801561226a575060015f83815260038301602052604090205460ff16600481111561226857612268613eef565b145b611c155760405162461bcd60e51b815260206004820152603860248201525f8051602061459683398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f805160206145f683398151915260205260408082208151610100810190925280545f805160206145b683398151915293929190829060ff16600581111561231757612317613eef565b600581111561232857612328613eef565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123b0576123b0613eef565b1461240c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146124865760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6124938160a00151613241565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156124d7576124d7613eef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125a38461259d8161175c565b5f611929565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906125d29085906004016140a2565b6020604051808303815f875af11580156125ee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061261291906140d4565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061457683398151915281612680846133e2565b90505f61268c82610a37565b83549091506001600160401b038216108015906126b657508260010154816001600160401b031611155b6110795760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61271d613418565b5f805160206145b6833981519152426001600160401b03851611801561275757506001600160401b038416612755426202a3006143ae565b115b6127b95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b856128105760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f8681526007820160205260409020541561287e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128e55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b6128ee85613241565b5f806129356040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061344f565b5f828152600586016020526040902091935091506129538282613fc1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129809085906004016140a2565b6020604051808303815f875af115801561299c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129c091906140d4565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612a4257612a42613eef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612b038361175c565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061107960015f805160206145d683398151915255565b5f612b72613418565b5f612b7f6101c2846133e2565b90505f805160206145768339815191525f612b99876117d0565b9050600281516005811115612bb057612bb0613eef565b14612c0f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612c209190614494565b9050612c2c88826118e1565b5f612c368961175c565b90505f898983604051602001612c7e9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612c9f86613241565b5f612cab8b8486611929565b5f8381526004880160205260409020909150612cc78282613fc1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cf49085906004016140a2565b6020604051808303815f875af1158015612d10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d3491906140d4565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612de357612de3613eef565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061122d60015f805160206145d683398151915255565b5f808251602e14612f475760405162461bcd60e51b815260040161043b906143c1565b5f805b6002811015612f9657612f5e816001614387565b612f69906008614227565b61ffff16858281518110612f7f57612f7f61439a565b016020015160f81c901b9190911790600101612f4a565b5061ffff811615612fb95760405162461bcd60e51b815260040161043b9061440a565b5f805b600481101561301457612fd0816003614387565b612fdb906008614227565b63ffffffff1686612fed8360026143ae565b81518110612ffd57612ffd61439a565b016020015160f81c901b9190911790600101612fbc565b5063ffffffff811660041461303b5760405162461bcd60e51b815260040161043b9061444d565b5f805b60208110156130905761305281601f614387565b61305d906008614227565b876130698360066143ae565b815181106130795761307961439a565b016020015160f81c901b919091179060010161303e565b505f805b60088110156130ef576130a8816007614387565b6130b3906008614227565b6001600160401b0316886130c88360266143ae565b815181106130d8576130d861439a565b016020015160f81c901b9190911790600101613094565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661314557604051631afcd79f60e31b815260040160405180910390fd5b565b61314f6130fc565b61315881613807565b61318a6060820135608083013561317560c0850160a08601613d88565b61318560e0860160c087016144b4565b613828565b50565b6131956130fc565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132215760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145b68339815191529060ff165f0361327f575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132c79083614387565b106132e3576001600160401b0384166040830152808252613302565b83826040018181516132f59190614494565b6001600160401b03169052505b5f82602001518360400151606461331991906144cf565b61332391906144fa565b600285015490915060ff908116908216111561339e5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a47827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613883565b5f805160206145d683398151915280546001190161344957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134b95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613530576134f0816001614387565b6134fb906008614227565b5081515f908390839081106135125761351261439a565b60200101906001600160f81b03191690815f1a9053506001016134dc565b505f5b600481101561358e57613547816003614387565b613552906008614227565b505f826135608360026143ae565b815181106135705761357061439a565b60200101906001600160f81b03191690815f1a905350600101613533565b505f5b60208110156135eb57845181602081106135ad576135ad61439a565b1a60f81b826135bd8360066143ae565b815181106135cd576135cd61439a565b60200101906001600160f81b03191690815f1a905350600101613591565b505f5b602081101561364b578460200151816020811061360d5761360d61439a565b1a60f81b8261361d8360266143ae565b8151811061362d5761362d61439a565b60200101906001600160f81b03191690815f1a9053506001016135ee565b505f5b60088110156136bf57613662816007614387565b61366d906008614227565b60ff1685604001516001600160401b0316901c60f81b8282604661369191906143ae565b815181106136a1576136a161439a565b60200101906001600160f81b03191690815f1a90535060010161364e565b505f5b603081101561372a57846080015181815181106136e1576136e161439a565b01602001516001600160f81b031916826136fc83604e6143ae565b8151811061370c5761370c61439a565b60200101906001600160f81b03191690815f1a9053506001016136c2565b505f5b600881101561379c57613741816007614387565b61374c906008614227565b60608601516001600160401b0390811691161c60f81b8261376e83607e6143ae565b8151811061377e5761377e61439a565b60200101906001600160f81b03191690815f1a90535060010161372d565b506002816040516137ad919061451f565b602060405180830381855afa1580156137c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137eb91906140d4565b94909350915050565b60015f805160206145d683398151915255565b61380f6130fc565b6138176139e5565b61381f6139f5565b61318a816139fd565b6138306130fc565b5f5f80516020614576833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156138c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138ed91906140d4565b90506139046001600160a01b038516333086613a69565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061396c91906140d4565b90508181116139d25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b6139dc8282614387565b95945050505050565b6139ed6130fc565b613145613ac3565b6131456130fc565b613a056130fc565b80355f805160206145b683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a4f606083016040840161453a565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261089b908590613acb565b6137f46130fc565b5f613adf6001600160a01b03841683613b2c565b905080515f14158015613b03575080806020019051810190613b01919061455a565b155b1561094e57604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b606061122d83835f845f80856001600160a01b03168486604051613b50919061451f565b5f6040518083038185875af1925050503d805f8114613b8a576040519150601f19603f3d011682016040523d82523d5f602084013e613b8f565b606091505b5091509150611752868383606082613baf57613baa82613bf6565b61122d565b8151158015613bc657506001600160a01b0384163b155b15613bef57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b508061122d565b805115613c065780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c2b90613f3e565b5f825580601f10613c3a575050565b601f0160209004905f5260205f209081019061318a91905b80821115613c65575f8155600101613c52565b5090565b801515811461318a575f80fd5b803563ffffffff81168114613c89575f80fd5b919050565b5f805f60608486031215613ca0575f80fd5b833592506020840135613cb281613c69565b9150613cc060408501613c76565b90509250925092565b5f60208284031215613cd9575f80fd5b5035919050565b6001600160a01b038116811461318a575f80fd5b5f80828403610100811215613d07575f80fd5b60e0811215613d14575f80fd5b5082915060e0830135613d2681613ce0565b809150509250929050565b5f60208284031215613d41575f80fd5b61122d82613c76565b5f8060408385031215613d5b575f80fd5b613d6483613c76565b946020939093013593505050565b80356001600160401b0381168114613c89575f80fd5b5f60208284031215613d98575f80fd5b61122d82613d72565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613dd757613dd7613da1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e0557613e05613da1565b604052919050565b5f6001600160401b03821115613e2557613e25613da1565b50601f01601f191660200190565b5f805f8060808587031215613e46575f80fd5b8435935060208501359250613e5d60408601613d72565b915060608501356001600160401b03811115613e77575f80fd5b8501601f81018713613e87575f80fd5b8035613e9a613e9582613e0d565b613ddd565b818152886020838501011115613eae575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ee0575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f3757613f37613f03565b5092915050565b600181811c90821680613f5257607f821691505b602082108103613f7057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561094e57805f5260205f20601f840160051c81016020851015613f9b5750805b601f840160051c820191505b81811015613fba575f8155600101613fa7565b5050505050565b81516001600160401b03811115613fda57613fda613da1565b613fee81613fe88454613f3e565b84613f76565b602080601f831160018114614021575f841561400a5750858301515b5f19600386901b1c1916600185901b178555614078565b5f85815260208120601f198616915b8281101561404f57888601518255948401946001909101908401614030565b508582101561406c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561409a578181015183820152602001614082565b50505f910152565b602081525f82518060208401526140c0816040850160208701614080565b601f01601f19169190910160400192915050565b5f602082840312156140e4575f80fd5b5051919050565b5f60208083525f84546140fd81613f3e565b806020870152604060018084165f811461411e576001811461413a57614167565b60ff19851660408a0152604084151560051b8a01019550614167565b895f5260205f205f5b8581101561415e5781548b8201860152908301908801614143565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261419757614197614175565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a4757610a47613f03565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613c8981613c69565b5f80604083850312156142a1575f80fd5b82516001600160401b03808211156142b7575f80fd5b90840190606082870312156142ca575f80fd5b6142d2613db5565b825181526020808401516142e581613ce0565b828201526040840151838111156142fa575f80fd5b80850194505087601f85011261430e575f80fd5b8351925061431e613e9584613e0d565b8381528882858701011115614331575f80fd5b61434084838301848801614080565b80604084015250819550614355818801614285565b9450505050509250929050565b5f6001600160401b0380831681810361437d5761437d613f03565b6001019392505050565b81810381811115610a4757610a47613f03565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a4757610a47613f03565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f3757613f37613f03565b5f602082840312156144c4575f80fd5b813561122d81613ce0565b6001600160401b038181168382160280821691908281146144f2576144f2613f03565b505092915050565b5f6001600160401b038084168061451357614513614175565b92169190910492915050565b5f8251614530818460208701614080565b9190910192915050565b5f6020828403121561454a575f80fd5b813560ff8116811461122d575f80fd5b5f6020828403121561456a575f80fd5b815161122d81613c6956fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 511df487d..9804f590f 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516143a83803806143a883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61425b8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613914565b610389565b005b348015610134575f80fd5b5061012761014336600461394f565b61046b565b348015610153575f80fd5b5061012761016236600461398a565b6108f6565b348015610172575f80fd5b506101b161018136600461398a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de36600461398a565b610a52565b3480156101ee575f80fd5b506102026101fd36600461398a565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b506101276102343660046139a1565b610ad5565b348015610244575f80fd5b506101276102533660046139ba565b610e58565b348015610263575f80fd5b506101b16102723660046139f8565b611049565b348015610282575f80fd5b5061020261029136600461398a565b611062565b3480156102a1575f80fd5b506101276102b036600461398a565b611076565b3480156102c0575f80fd5b506101276102cf36600461394f565b6110e3565b3480156102df575f80fd5b506101276102ee3660046139ba565b6110fe565b3480156102fe575f80fd5b5061012761030d3660046139a1565b61129e565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e36600461398a565b61145b565b6101b161037136600461398a565b61152a565b6101b1610384366004613aa3565b611536565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a8361155a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206141af8339815191529184156104bd576104ba828561156e565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b35565b600481111561050057610500613b35565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613b35565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206141cf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206141cf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f6106488461180a565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613b35565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107678561187e565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613b5d565b90506107ff868261198f565b5f61080b8785846119d7565b5f8c815260058a01602052604090209091506108278282613c01565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613ce2565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613d14565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206141ef83398151915292919061093e90613b84565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613b35565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613d2b565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613d14565b505050565b610a5b81611bf4565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206141af833981519152916005600160991b019163ee5b48eb91610a0d91600401613d2b565b5f610acf64e8d4a5100083613dc9565b92915050565b5f805160206141ef8339815191525f610aed83611cc7565b90505f80610afe8360400151611ea8565b915091508015610b635760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610b9557610b95613b35565b6005811115610ba657610ba6613b35565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c2d57610c2d613b35565b1480610c4b5750600182516005811115610c4957610c49613b35565b145b610caa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115610cbf57610cbf613b35565b03610ce657505f8381526006860160205260408120600491610ce191906138ca565b610cea565b5060055b6020808301515f90815260088801909152604081205581816005811115610d1357610d13613b35565b90816005811115610d2657610d26613b35565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d5a57610d5a613b35565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e2557610e25613b35565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206141af8339815191525f610e7084611cc7565b90505f80610e818360400151612049565b5091509150610e8f85612284565b5f8581526004850160205260408120610ea7916138ca565b5f610eb18361187e565b9050816001600160401b031681608001516001600160401b03161015610ee95760405162461bcd60e51b81526004016105d090613ddc565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f2e5760405162461bcd60e51b81526004016105d090613e1e565b60015f87815260038701602052604090205460ff166004811115610f5457610f54613b35565b14610fbd5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000613e67565b5f61106c8261187e565b60a0015192915050565b61107f81612284565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206141af833981519152916005600160991b019163ee5b48eb91610a0d91600401613d2b565b81156110f5576110f3838261156e565b505b610a4d8361235d565b5f805160206141af8339815191525f61111684611cc7565b90505f806111278360400151612049565b509150915061113585611bf4565b5f858152600585016020526040812061114d916138ca565b5f6111578361187e565b9050816001600160401b031681608001516001600160401b0316101561118f5760405162461bcd60e51b81526004016105d090613ddc565b5f8681526003808701602052604090912001546001600160401b03808416911611156111cd5760405162461bcd60e51b81526004016105d090613e1e565b60035f87815260038701602052604090205460ff1660048111156111f3576111f3613b35565b146112475760405162461bcd60e51b815260206004820152603160248201525f805160206141cf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206141ef8339815191525f6112b683611cc7565b90505f806112c78360400151611ea8565b91509150806113295760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f8281526005850160205260408120805461134390613b84565b9050118015611375575060015f83815260078601602052604090205460ff16600581111561137357611373613b35565b145b6113915760405162461bcd60e51b81526004016105d090613e7e565b5f82815260058501602052604081206113a9916138ca565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206141ef8339815191529291906114a390613b84565b90501180156114d5575060015f83815260078301602052604090205460ff1660058111156114d3576114d3613b35565b145b6114f15760405162461bcd60e51b81526004016105d090613e7e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613d2b565b5f610acf823334612715565b5f8061154134612acd565b905061154f85828686612b77565b9150505b9392505050565b611562612fcc565b61156b81613017565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115b9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e09190810190613ee4565b91509150806116435760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611686573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116aa9190613d14565b82511461170e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b0316156117845760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f80611793846040015161305a565b915091508187146118005760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f8051602061422f8339815191526020526040812060030180545f805160206141ef833981519152916001600160401b039091169081908461184f83613fb6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061422f83398151915290528390208351918201909352825491925f805160206141ef83398151915292829060ff16600581111561190657611906613b35565b600581111561191757611917613b35565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061422f833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5057611a10816001613fdb565b611a1b906008613e67565b5081515f90839083908110611a3257611a32613fee565b60200101906001600160f81b03191690815f1a9053506001016119fc565b505f5b6004811015611ab357611a67816003613fdb565b611a72906008613e67565b6001901c60f81b82611a85836002614002565b81518110611a9557611a95613fee565b60200101906001600160f81b03191690815f1a905350600101611a53565b505f5b6020811015611b1557611aca81601f613fdb565b611ad5906008613e67565b86901c60f81b82611ae7836006614002565b81518110611af757611af7613fee565b60200101906001600160f81b03191690815f1a905350600101611ab6565b505f5b6008811015611b8057611b2c816007613fdb565b611b37906008613e67565b6001600160401b038616901c60f81b82611b52836026614002565b81518110611b6257611b62613fee565b60200101906001600160f81b03191690815f1a905350600101611b18565b505f5b6008811015611beb57611b97816007613fdb565b611ba2906008613e67565b6001600160401b038516901c60f81b82611bbd83602e614002565b81518110611bcd57611bcd613fee565b60200101906001600160f81b03191690815f1a905350600101611b83565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206141af833981519152929190611c3c90613b84565b9050118015611c6e575060035f83815260038301602052604090205460ff166004811115611c6c57611c6c613b35565b145b611cc35760405162461bcd60e51b815260206004820152603360248201525f805160206141cf83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206141ef8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d3c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d639190810190613ee4565b9150915080611dca5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611e2d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611ea05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f808251602714611ecb5760405162461bcd60e51b81526004016105d090614015565b5f805b6002811015611f1a57611ee2816001613fdb565b611eed906008613e67565b61ffff16858281518110611f0357611f03613fee565b016020015160f81c901b9190911790600101611ece565b5061ffff811615611f3d5760405162461bcd60e51b81526004016105d09061405e565b5f805b6004811015611f9857611f54816003613fdb565b611f5f906008613e67565b63ffffffff1686611f71836002614002565b81518110611f8157611f81613fee565b016020015160f81c901b9190911790600101611f40565b5063ffffffff8116600214611fbf5760405162461bcd60e51b81526004016105d0906140a1565b5f805b602081101561201457611fd681601f613fdb565b611fe1906008613e67565b87611fed836006614002565b81518110611ffd57611ffd613fee565b016020015160f81c901b9190911790600101611fc2565b505f8660268151811061202957612029613fee565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461206d5760405162461bcd60e51b81526004016105d090614015565b5f805b60028110156120bc57612084816001613fdb565b61208f906008613e67565b61ffff168682815181106120a5576120a5613fee565b016020015160f81c901b9190911790600101612070565b5061ffff8116156120df5760405162461bcd60e51b81526004016105d09061405e565b5f805b600481101561213a576120f6816003613fdb565b612101906008613e67565b63ffffffff1687612113836002614002565b8151811061212357612123613fee565b016020015160f81c901b91909117906001016120e2565b5063ffffffff81166003146121615760405162461bcd60e51b81526004016105d0906140a1565b5f805b60208110156121b65761217881601f613fdb565b612183906008613e67565b8861218f836006614002565b8151811061219f5761219f613fee565b016020015160f81c901b9190911790600101612164565b505f805b6008811015612215576121ce816007613fdb565b6121d9906008613e67565b6001600160401b0316896121ee836026614002565b815181106121fe576121fe613fee565b016020015160f81c901b91909117906001016121ba565b505f805b60088110156122745761222d816007613fdb565b612238906008613e67565b6001600160401b03168a61224d83602e614002565b8151811061225d5761225d613fee565b016020015160f81c901b9190911790600101612219565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206141af8339815191529291906122cc90613b84565b90501180156122fe575060015f83815260038301602052604090205460ff1660048111156122fc576122fc613b35565b145b611cc35760405162461bcd60e51b815260206004820152603860248201525f805160206141cf83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061422f83398151915260205260408082208151610100810190925280545f805160206141ef83398151915293929190829060ff1660058111156123ab576123ab613b35565b60058111156123bc576123bc613b35565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561244457612444613b35565b146124a05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461251a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6125278160a00151613232565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561256b5761256b613b35565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612637846126318161180a565b5f6119d7565b5f85815260068501602052604090209091506126538282613c01565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612680908590600401613ce2565b6020604051808303815f875af115801561269c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c09190613d14565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61271e6133d3565b5f61272883610abf565b90505f805160206141af8339815191525f6127428761187e565b905060028151600581111561275957612759613b35565b146127b85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516127c991906140e8565b90506127d5888261198f565b5f6127df8961180a565b90505f8989836040516020016128279392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061284886613232565b5f6128548b84866119d7565b5f83815260048801602052604090209091506128708282613c01565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061289d908590600401613ce2565b6020604051808303815f875af11580156128b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128dd9190613d14565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561298c5761298c613b35565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061155360015f8051602061420f83398151915255565b5f5f805160206141af8339815191528282612ae782610abf565b83549091506001600160401b03821610801590612b1157508260010154816001600160401b031611155b612b6f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612b806133d3565b5f805160206141ef833981519152426001600160401b038516118015612bba57506001600160401b038416612bb8426202a300614002565b115b612c1c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612c735760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612ce15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612d485760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612d5185613232565b5f80612d986040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061341d565b5f82815260058601602052604090209193509150612db68282613c01565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612de3908590600401613ce2565b6020604051808303815f875af1158015612dff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e239190613d14565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612ea557612ea5613b35565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612f668361180a565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b6f60015f8051602061420f83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661301557604051631afcd79f60e31b815260040160405180910390fd5b565b61301f612fcc565b613028816137c2565b61156b6060820135608083013561304560c0850160a086016139f8565b61305560e0860160c08701614108565b6137e3565b5f808251602e1461307d5760405162461bcd60e51b81526004016105d090614015565b5f805b60028110156130cc57613094816001613fdb565b61309f906008613e67565b61ffff168582815181106130b5576130b5613fee565b016020015160f81c901b9190911790600101613080565b5061ffff8116156130ef5760405162461bcd60e51b81526004016105d09061405e565b5f805b600481101561314a57613106816003613fdb565b613111906008613e67565b63ffffffff1686613123836002614002565b8151811061313357613133613fee565b016020015160f81c901b91909117906001016130f2565b5063ffffffff81166004146131715760405162461bcd60e51b81526004016105d0906140a1565b5f805b60208110156131c65761318881601f613fdb565b613193906008613e67565b8761319f836006614002565b815181106131af576131af613fee565b016020015160f81c901b9190911790600101613174565b505f805b6008811015613225576131de816007613fdb565b6131e9906008613e67565b6001600160401b0316886131fe836026614002565b8151811061320e5761320e613fee565b016020015160f81c901b91909117906001016131ca565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206141ef8339815191529060ff165f03613270575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132b89083613fdb565b106132d4576001600160401b03841660408301528082526132f3565b83826040018181516132e691906140e8565b6001600160401b03169052505b5f82602001518360400151606461330a9190614123565b613314919061414e565b600285015490915060ff908116908216111561338f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061420f83398151915280546001190161340457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061420f83398151915255565b5f60608260800151516030146134875760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134fe576134be816001613fdb565b6134c9906008613e67565b5081515f908390839081106134e0576134e0613fee565b60200101906001600160f81b03191690815f1a9053506001016134aa565b505f5b600481101561355c57613515816003613fdb565b613520906008613e67565b505f8261352e836002614002565b8151811061353e5761353e613fee565b60200101906001600160f81b03191690815f1a905350600101613501565b505f5b60208110156135b9578451816020811061357b5761357b613fee565b1a60f81b8261358b836006614002565b8151811061359b5761359b613fee565b60200101906001600160f81b03191690815f1a90535060010161355f565b505f5b602081101561361957846020015181602081106135db576135db613fee565b1a60f81b826135eb836026614002565b815181106135fb576135fb613fee565b60200101906001600160f81b03191690815f1a9053506001016135bc565b505f5b600881101561368d57613630816007613fdb565b61363b906008613e67565b60ff1685604001516001600160401b0316901c60f81b8282604661365f9190614002565b8151811061366f5761366f613fee565b60200101906001600160f81b03191690815f1a90535060010161361c565b505f5b60308110156136f857846080015181815181106136af576136af613fee565b01602001516001600160f81b031916826136ca83604e614002565b815181106136da576136da613fee565b60200101906001600160f81b03191690815f1a905350600101613690565b505f5b600881101561376a5761370f816007613fdb565b61371a906008613e67565b60608601516001600160401b0390811691161c60f81b8261373c83607e614002565b8151811061374c5761374c613fee565b60200101906001600160f81b03191690815f1a9053506001016136fb565b5060028160405161377b9190614173565b602060405180830381855afa158015613796573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137b99190613d14565b94909350915050565b6137ca612fcc565b6137d261383e565b6137da61384e565b61156b81613856565b6137eb612fcc565b5f5f805160206141af833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613846612fcc565b6130156138c2565b613015612fcc565b61385e612fcc565b80355f805160206141ef83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138a8606083016040840161418e565b600291909101805460ff191660ff90921691909117905550565b61340a612fcc565b5080546138d690613b84565b5f825580601f106138e5575050565b601f0160209004905f5260205f209081019061156b91905b80821115613910575f81556001016138fd565b5090565b5f60e08284031215613924575f80fd5b50919050565b801515811461156b575f80fd5b803563ffffffff8116811461394a575f80fd5b919050565b5f805f60608486031215613961575f80fd5b8335925060208401356139738161392a565b915061398160408501613937565b90509250925092565b5f6020828403121561399a575f80fd5b5035919050565b5f602082840312156139b1575f80fd5b61155382613937565b5f80604083850312156139cb575f80fd5b6139d483613937565b946020939093013593505050565b80356001600160401b038116811461394a575f80fd5b5f60208284031215613a08575f80fd5b611553826139e2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a4757613a47613a11565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613a7557613a75613a11565b604052919050565b5f6001600160401b03821115613a9557613a95613a11565b50601f01601f191660200190565b5f805f60608486031215613ab5575f80fd5b83359250613ac5602085016139e2565b915060408401356001600160401b03811115613adf575f80fd5b8401601f81018613613aef575f80fd5b8035613b02613afd82613a7d565b613a4d565b818152876020838501011115613b16575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613b7d57613b7d613b49565b5092915050565b600181811c90821680613b9857607f821691505b60208210810361392457634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613bdb5750805b601f840160051c820191505b81811015613bfa575f8155600101613be7565b5050505050565b81516001600160401b03811115613c1a57613c1a613a11565b613c2e81613c288454613b84565b84613bb6565b602080601f831160018114613c61575f8415613c4a5750858301515b5f19600386901b1c1916600185901b178555613cb8565b5f85815260208120601f198616915b82811015613c8f57888601518255948401946001909101908401613c70565b5085821015613cac57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613cda578181015183820152602001613cc2565b50505f910152565b602081525f8251806020840152613d00816040850160208701613cc0565b601f01601f19169190910160400192915050565b5f60208284031215613d24575f80fd5b5051919050565b5f60208083525f8454613d3d81613b84565b806020870152604060018084165f8114613d5e5760018114613d7a57613da7565b60ff19851660408a0152604084151560051b8a01019550613da7565b895f5260205f205f5b85811015613d9e5781548b8201860152908301908801613d83565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613dd757613dd7613db5565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613b49565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b038116811461156b575f80fd5b805161394a8161392a565b5f8060408385031215613ef5575f80fd5b82516001600160401b0380821115613f0b575f80fd5b9084019060608287031215613f1e575f80fd5b613f26613a25565b82518152602080840151613f3981613ec5565b82820152604084015183811115613f4e575f80fd5b80850194505087601f850112613f62575f80fd5b83519250613f72613afd84613a7d565b8381528882858701011115613f85575f80fd5b613f9484838301848801613cc0565b80604084015250819550613fa9818801613ed9565b9450505050509250929050565b5f6001600160401b03808316818103613fd157613fd1613b49565b6001019392505050565b81810381811115610acf57610acf613b49565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613b49565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613b7d57613b7d613b49565b5f60208284031215614118575f80fd5b813561155381613ec5565b6001600160401b0381811683821602808216919082811461414657614146613b49565b505092915050565b5f6001600160401b038084168061416757614167613db5565b92169190910492915050565b5f8251614184818460208701613cc0565b9190910192915050565b5f6020828403121561419e575f80fd5b813560ff81168114611553575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161439d38038061439d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142508061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613909565b610389565b005b348015610134575f80fd5b50610127610143366004613944565b61046b565b348015610153575f80fd5b5061012761016236600461397f565b6108f6565b348015610172575f80fd5b506101b161018136600461397f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de36600461397f565b610a36565b3480156101ee575f80fd5b506102026101fd36600461397f565b610ae8565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613996565b610afe565b348015610244575f80fd5b506101276102533660046139af565b610e67565b348015610263575f80fd5b506101b16102723660046139ed565b611058565b348015610282575f80fd5b5061020261029136600461397f565b611071565b3480156102a1575f80fd5b506101276102b036600461397f565b611085565b3480156102c0575f80fd5b506101276102cf366004613944565b6110f2565b3480156102df575f80fd5b506101276102ee3660046139af565b61110d565b3480156102fe575f80fd5b5061012761030d366004613996565b6112ad565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e36600461397f565b61146a565b6101b161037136600461397f565b611539565b6101b1610384366004613a98565b611545565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611569565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206141a48339815191529184156104bd576104ba828561157d565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b2a565b600481111561050057610500613b2a565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613b2a565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206141c48339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206141c48339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f61064884611819565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613b2a565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107678561188d565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613b52565b90506107ff868261199e565b5f61080b8785846119e6565b5f8c815260058a01602052604090209091506108278282613bf6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613cd7565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613d09565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181525f8051602061422483398151915260205260409020545f805160206141e48339815191529060039060ff16600581111561093657610936613b2a565b1461099b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f8281526006820160205260408120600301546109c39084906001600160401b0316836119e6565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906109f0908490600401613cd7565b6020604051808303815f875af1158015610a0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a309190613d09565b50505050565b610a3f81611c03565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206141a4833981519152916005600160991b019163ee5b48eb91610aa391600401613d20565b6020604051808303815f875af1158015610abf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ae39190613d09565b505050565b5f610af864e8d4a5100083613dbe565b92915050565b5f805160206141e48339815191525f610b1683611cd6565b90505f80610b278360400151611eb7565b915091508015610b8c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610bbe57610bbe613b2a565b6005811115610bcf57610bcf613b2a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c5657610c56613b2a565b1480610c745750600182516005811115610c7257610c72613b2a565b145b610cd35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115610ce857610ce8613b2a565b03610cf557506004610cf9565b5060055b6020808301515f90815260078801909152604081205581816005811115610d2257610d22613b2a565b90816005811115610d3557610d35613b2a565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610d6957610d69613b2a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e3457610e34613b2a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206141a48339815191525f610e7f84611cd6565b90505f80610e908360400151612058565b5091509150610e9e85612293565b5f8581526004850160205260408120610eb6916138bf565b5f610ec08361188d565b9050816001600160401b031681608001516001600160401b03161015610ef85760405162461bcd60e51b81526004016105d090613dd1565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f3d5760405162461bcd60e51b81526004016105d090613e13565b60015f87815260038701602052604090205460ff166004811115610f6357610f63613b2a565b14610fcc5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610af86001600160401b03831664e8d4a51000613e5c565b5f61107b8261188d565b60a0015192915050565b61108e81612293565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206141a4833981519152916005600160991b019163ee5b48eb91610aa391600401613d20565b811561110457611102838261157d565b505b610ae38361236c565b5f805160206141a48339815191525f61112584611cd6565b90505f806111368360400151612058565b509150915061114485611c03565b5f858152600585016020526040812061115c916138bf565b5f6111668361188d565b9050816001600160401b031681608001516001600160401b0316101561119e5760405162461bcd60e51b81526004016105d090613dd1565b5f8681526003808701602052604090912001546001600160401b03808416911611156111dc5760405162461bcd60e51b81526004016105d090613e13565b60035f87815260038701602052604090205460ff16600481111561120257611202613b2a565b146112565760405162461bcd60e51b815260206004820152603160248201525f805160206141c48339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206141e48339815191525f6112c583611cd6565b90505f806112d68360400151611eb7565b91509150806113385760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f8281526005850160205260408120805461135290613b79565b9050118015611384575060015f83815260068601602052604090205460ff16600581111561138257611382613b2a565b145b6113a05760405162461bcd60e51b81526004016105d090613e73565b5f82815260058501602052604081206113b8916138bf565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206141e48339815191529291906114b290613b79565b90501180156114e4575060015f83815260068301602052604090205460ff1660058111156114e2576114e2613b2a565b145b6115005760405162461bcd60e51b81526004016105d090613e73565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aa39190600401613d20565b5f610af882333461270a565b5f8061155034612ac2565b905061155e85828686612b6c565b9150505b9392505050565b611571612fc1565b61157a8161300c565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115ef9190810190613ed9565b91509150806116525760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611695573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b99190613d09565b82511461171d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b0316156117935760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f806117a2846040015161304f565b9150915081871461180f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f805160206142248339815191526020526040812060030180545f805160206141e4833981519152916001600160401b039091169081908461185e83613fab565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061422483398151915290528390208351918201909352825491925f805160206141e483398151915292829060ff16600581111561191557611915613b2a565b600581111561192657611926613b2a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614224833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5f57611a1f816001613fd0565b611a2a906008613e5c565b5081515f90839083908110611a4157611a41613fe3565b60200101906001600160f81b03191690815f1a905350600101611a0b565b505f5b6004811015611ac257611a76816003613fd0565b611a81906008613e5c565b6001901c60f81b82611a94836002613ff7565b81518110611aa457611aa4613fe3565b60200101906001600160f81b03191690815f1a905350600101611a62565b505f5b6020811015611b2457611ad981601f613fd0565b611ae4906008613e5c565b86901c60f81b82611af6836006613ff7565b81518110611b0657611b06613fe3565b60200101906001600160f81b03191690815f1a905350600101611ac5565b505f5b6008811015611b8f57611b3b816007613fd0565b611b46906008613e5c565b6001600160401b038616901c60f81b82611b61836026613ff7565b81518110611b7157611b71613fe3565b60200101906001600160f81b03191690815f1a905350600101611b27565b505f5b6008811015611bfa57611ba6816007613fd0565b611bb1906008613e5c565b6001600160401b038516901c60f81b82611bcc83602e613ff7565b81518110611bdc57611bdc613fe3565b60200101906001600160f81b03191690815f1a905350600101611b92565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206141a4833981519152929190611c4b90613b79565b9050118015611c7d575060035f83815260038301602052604090205460ff166004811115611c7b57611c7b613b2a565b145b611cd25760405162461bcd60e51b815260206004820152603360248201525f805160206141c483398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206141e48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d4b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d729190810190613ed9565b9150915080611dd95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611e3c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611eaf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f808251602714611eda5760405162461bcd60e51b81526004016105d09061400a565b5f805b6002811015611f2957611ef1816001613fd0565b611efc906008613e5c565b61ffff16858281518110611f1257611f12613fe3565b016020015160f81c901b9190911790600101611edd565b5061ffff811615611f4c5760405162461bcd60e51b81526004016105d090614053565b5f805b6004811015611fa757611f63816003613fd0565b611f6e906008613e5c565b63ffffffff1686611f80836002613ff7565b81518110611f9057611f90613fe3565b016020015160f81c901b9190911790600101611f4f565b5063ffffffff8116600214611fce5760405162461bcd60e51b81526004016105d090614096565b5f805b602081101561202357611fe581601f613fd0565b611ff0906008613e5c565b87611ffc836006613ff7565b8151811061200c5761200c613fe3565b016020015160f81c901b9190911790600101611fd1565b505f8660268151811061203857612038613fe3565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461207c5760405162461bcd60e51b81526004016105d09061400a565b5f805b60028110156120cb57612093816001613fd0565b61209e906008613e5c565b61ffff168682815181106120b4576120b4613fe3565b016020015160f81c901b919091179060010161207f565b5061ffff8116156120ee5760405162461bcd60e51b81526004016105d090614053565b5f805b600481101561214957612105816003613fd0565b612110906008613e5c565b63ffffffff1687612122836002613ff7565b8151811061213257612132613fe3565b016020015160f81c901b91909117906001016120f1565b5063ffffffff81166003146121705760405162461bcd60e51b81526004016105d090614096565b5f805b60208110156121c55761218781601f613fd0565b612192906008613e5c565b8861219e836006613ff7565b815181106121ae576121ae613fe3565b016020015160f81c901b9190911790600101612173565b505f805b6008811015612224576121dd816007613fd0565b6121e8906008613e5c565b6001600160401b0316896121fd836026613ff7565b8151811061220d5761220d613fe3565b016020015160f81c901b91909117906001016121c9565b505f805b60088110156122835761223c816007613fd0565b612247906008613e5c565b6001600160401b03168a61225c83602e613ff7565b8151811061226c5761226c613fe3565b016020015160f81c901b9190911790600101612228565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206141a48339815191529291906122db90613b79565b905011801561230d575060015f83815260038301602052604090205460ff16600481111561230b5761230b613b2a565b145b611cd25760405162461bcd60e51b815260206004820152603860248201525f805160206141c483398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061422483398151915260205260408082208151610100810190925280545f805160206141e483398151915293929190829060ff1660058111156123ba576123ba613b2a565b60058111156123cb576123cb613b2a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561245357612453613b2a565b146124af5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b0316146125295760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6125368160a00151613227565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561257a5761257a613b2a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126468461264081611819565b5f6119e6565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612675908590600401613cd7565b6020604051808303815f875af1158015612691573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126b59190613d09565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6127136133c8565b5f61271d83610ae8565b90505f805160206141a48339815191525f6127378761188d565b905060028151600581111561274e5761274e613b2a565b146127ad5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516127be91906140dd565b90506127ca888261199e565b5f6127d489611819565b90505f89898360405160200161281c9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061283d86613227565b5f6128498b84866119e6565b5f83815260048801602052604090209091506128658282613bf6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612892908590600401613cd7565b6020604051808303815f875af11580156128ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128d29190613d09565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561298157612981613b2a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061156260015f8051602061420483398151915255565b5f5f805160206141a48339815191528282612adc82610ae8565b83549091506001600160401b03821610801590612b0657508260010154816001600160401b031611155b612b645760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612b756133c8565b5f805160206141e4833981519152426001600160401b038516118015612baf57506001600160401b038416612bad426202a300613ff7565b115b612c115760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612c685760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260078201602052604090205415612cd65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612d3d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612d4685613227565b5f80612d8d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613412565b5f82815260058601602052604090209193509150612dab8282613bf6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612dd8908590600401613cd7565b6020604051808303815f875af1158015612df4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e189190613d09565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612e9a57612e9a613b2a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612f5b83611819565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b6460015f8051602061420483398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661300a57604051631afcd79f60e31b815260040160405180910390fd5b565b613014612fc1565b61301d816137b7565b61157a6060820135608083013561303a60c0850160a086016139ed565b61304a60e0860160c087016140fd565b6137d8565b5f808251602e146130725760405162461bcd60e51b81526004016105d09061400a565b5f805b60028110156130c157613089816001613fd0565b613094906008613e5c565b61ffff168582815181106130aa576130aa613fe3565b016020015160f81c901b9190911790600101613075565b5061ffff8116156130e45760405162461bcd60e51b81526004016105d090614053565b5f805b600481101561313f576130fb816003613fd0565b613106906008613e5c565b63ffffffff1686613118836002613ff7565b8151811061312857613128613fe3565b016020015160f81c901b91909117906001016130e7565b5063ffffffff81166004146131665760405162461bcd60e51b81526004016105d090614096565b5f805b60208110156131bb5761317d81601f613fd0565b613188906008613e5c565b87613194836006613ff7565b815181106131a4576131a4613fe3565b016020015160f81c901b9190911790600101613169565b505f805b600881101561321a576131d3816007613fd0565b6131de906008613e5c565b6001600160401b0316886131f3836026613ff7565b8151811061320357613203613fe3565b016020015160f81c901b91909117906001016131bf565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206141e48339815191529060ff165f03613265575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132ad9083613fd0565b106132c9576001600160401b03841660408301528082526132e8565b83826040018181516132db91906140dd565b6001600160401b03169052505b5f8260200151836040015160646132ff9190614118565b6133099190614143565b600285015490915060ff90811690821611156133845760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206142048339815191528054600119016133f957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061420483398151915255565b5f606082608001515160301461347c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134f3576134b3816001613fd0565b6134be906008613e5c565b5081515f908390839081106134d5576134d5613fe3565b60200101906001600160f81b03191690815f1a90535060010161349f565b505f5b60048110156135515761350a816003613fd0565b613515906008613e5c565b505f82613523836002613ff7565b8151811061353357613533613fe3565b60200101906001600160f81b03191690815f1a9053506001016134f6565b505f5b60208110156135ae578451816020811061357057613570613fe3565b1a60f81b82613580836006613ff7565b8151811061359057613590613fe3565b60200101906001600160f81b03191690815f1a905350600101613554565b505f5b602081101561360e57846020015181602081106135d0576135d0613fe3565b1a60f81b826135e0836026613ff7565b815181106135f0576135f0613fe3565b60200101906001600160f81b03191690815f1a9053506001016135b1565b505f5b600881101561368257613625816007613fd0565b613630906008613e5c565b60ff1685604001516001600160401b0316901c60f81b828260466136549190613ff7565b8151811061366457613664613fe3565b60200101906001600160f81b03191690815f1a905350600101613611565b505f5b60308110156136ed57846080015181815181106136a4576136a4613fe3565b01602001516001600160f81b031916826136bf83604e613ff7565b815181106136cf576136cf613fe3565b60200101906001600160f81b03191690815f1a905350600101613685565b505f5b600881101561375f57613704816007613fd0565b61370f906008613e5c565b60608601516001600160401b0390811691161c60f81b8261373183607e613ff7565b8151811061374157613741613fe3565b60200101906001600160f81b03191690815f1a9053506001016136f0565b506002816040516137709190614168565b602060405180830381855afa15801561378b573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137ae9190613d09565b94909350915050565b6137bf612fc1565b6137c7613833565b6137cf613843565b61157a8161384b565b6137e0612fc1565b5f5f805160206141a4833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61383b612fc1565b61300a6138b7565b61300a612fc1565b613853612fc1565b80355f805160206141e483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561389d6060830160408401614183565b600291909101805460ff191660ff90921691909117905550565b6133ff612fc1565b5080546138cb90613b79565b5f825580601f106138da575050565b601f0160209004905f5260205f209081019061157a91905b80821115613905575f81556001016138f2565b5090565b5f60e08284031215613919575f80fd5b50919050565b801515811461157a575f80fd5b803563ffffffff8116811461393f575f80fd5b919050565b5f805f60608486031215613956575f80fd5b8335925060208401356139688161391f565b91506139766040850161392c565b90509250925092565b5f6020828403121561398f575f80fd5b5035919050565b5f602082840312156139a6575f80fd5b6115628261392c565b5f80604083850312156139c0575f80fd5b6139c98361392c565b946020939093013593505050565b80356001600160401b038116811461393f575f80fd5b5f602082840312156139fd575f80fd5b611562826139d7565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a3c57613a3c613a06565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613a6a57613a6a613a06565b604052919050565b5f6001600160401b03821115613a8a57613a8a613a06565b50601f01601f191660200190565b5f805f60608486031215613aaa575f80fd5b83359250613aba602085016139d7565b915060408401356001600160401b03811115613ad4575f80fd5b8401601f81018613613ae4575f80fd5b8035613af7613af282613a72565b613a42565b818152876020838501011115613b0b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613b7257613b72613b3e565b5092915050565b600181811c90821680613b8d57607f821691505b60208210810361391957634e487b7160e01b5f52602260045260245ffd5b601f821115610ae357805f5260205f20601f840160051c81016020851015613bd05750805b601f840160051c820191505b81811015613bef575f8155600101613bdc565b5050505050565b81516001600160401b03811115613c0f57613c0f613a06565b613c2381613c1d8454613b79565b84613bab565b602080601f831160018114613c56575f8415613c3f5750858301515b5f19600386901b1c1916600185901b178555613cad565b5f85815260208120601f198616915b82811015613c8457888601518255948401946001909101908401613c65565b5085821015613ca157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613ccf578181015183820152602001613cb7565b50505f910152565b602081525f8251806020840152613cf5816040850160208701613cb5565b601f01601f19169190910160400192915050565b5f60208284031215613d19575f80fd5b5051919050565b5f60208083525f8454613d3281613b79565b806020870152604060018084165f8114613d535760018114613d6f57613d9c565b60ff19851660408a0152604084151560051b8a01019550613d9c565b895f5260205f205f5b85811015613d935781548b8201860152908301908801613d78565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613dcc57613dcc613daa565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610af857610af8613b3e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b038116811461157a575f80fd5b805161393f8161391f565b5f8060408385031215613eea575f80fd5b82516001600160401b0380821115613f00575f80fd5b9084019060608287031215613f13575f80fd5b613f1b613a1a565b82518152602080840151613f2e81613eba565b82820152604084015183811115613f43575f80fd5b80850194505087601f850112613f57575f80fd5b83519250613f67613af284613a72565b8381528882858701011115613f7a575f80fd5b613f8984838301848801613cb5565b80604084015250819550613f9e818801613ece565b9450505050509250929050565b5f6001600160401b03808316818103613fc657613fc6613b3e565b6001019392505050565b81810381811115610af857610af8613b3e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610af857610af8613b3e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613b7257613b72613b3e565b5f6020828403121561410d575f80fd5b813561156281613eba565b6001600160401b0381811683821602808216919082811461413b5761413b613b3e565b505092915050565b5f6001600160401b038084168061415c5761415c613daa565b92169190910492915050565b5f8251614179818460208701613cb5565b9190910192915050565b5f60208284031215614193575f80fd5b813560ff81168114611562575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 86a87b7fd..6127a29df 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -39,7 +39,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612bb4380380612bb483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a678061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd36600461237d565b61023f565b005b6101226100f236600461237d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612441565b6103a0565b6100e26101563660046124e4565b6103c0565b61016e61016936600461237d565b610743565b6040516001600160401b03909116815260200161012c565b6100e2610757565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e036600461237d565b61076a565b6100e26101f33660046124e4565b610776565b6101ba6005600160991b0181565b6100e261021436600461237d565b610933565b6100e2610227366004612522565b610a02565b6100e261023a36600461255e565b610b10565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612a3b83398151915292919061028790612579565b90501180156102b9575060035f83815260078301602052604090205460ff1660058111156102b7576102b76125b1565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125c5565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b919061264f565b505050565b5f6103a9610b4a565b6103b584868585610ba5565b90505b949350505050565b5f80516020612a3b8339815191525f6103d88361100d565b90505f806103e983604001516111ee565b91509150801561044e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610480576104806125b1565b6005811115610491576104916125b1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610518576105186125b1565b14806105365750600182516005811115610534576105346125b1565b145b6105955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b6003825160058111156105aa576105aa6125b1565b036105d157505f83815260068601602052604081206004916105cc9190612333565b6105d5565b5060055b6020808301515f908152600888019091526040812055818160058111156105fe576105fe6125b1565b90816005811115610611576106116125b1565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610645576106456125b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610710576107106125b1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61074d8261144d565b60a0015192915050565b61075f610b4a565b6107685f611571565b565b610773816115e1565b50565b5f80516020612a3b8339815191525f61078e8361100d565b90505f8061079f83604001516111ee565b91509150806108015760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f8281526005850160205260408120805461081b90612579565b905011801561084d575060015f83815260078601602052604090205460ff16600581111561084b5761084b6125b1565b145b6108695760405162461bcd60e51b815260040161031990612666565b5f828152600585016020526040812061088191612333565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a3b83398151915292919061097b90612579565b90501180156109ad575060015f83815260078301602052604090205460ff1660058111156109ab576109ab6125b1565b145b6109c95760405162461bcd60e51b815260040161031990612666565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125c5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a465750825b90505f826001600160401b03166001148015610a615750303b155b905081158015610a6f575080155b15610a8d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ab757845460ff60401b1916600160401b1785555b610ac187876119ac565b8315610b0757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610b18610b4a565b6001600160a01b038116610b4157604051631e4fbdf760e01b81525f6004820152602401610319565b61077381611571565b33610b7c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107685760405163118cdaa760e01b8152336004820152602401610319565b5f610bae6119ca565b5f80516020612a3b833981519152426001600160401b038516118015610be857506001600160401b038416610be6426202a3006126c1565b115b610c4a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b85610ca15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f86815260088201602052604090205415610d0f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610d765760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b610d7f85611a14565b5f80610dc66040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611bb5565b5f82815260058601602052604090209193509150610de48282612725565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610e11908590600401612806565b6020604051808303815f875af1158015610e2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e51919061264f565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115610ed357610ed36125b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610f9483611f5a565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f80516020612a3b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611082573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110a99190810190612847565b91509150806111105760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146111735760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b0316156111e65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146112535760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156112a25761126a816001612919565b61127590600861292c565b61ffff1685828151811061128b5761128b612943565b016020015160f81c901b9190911790600101611256565b5061ffff8116156113015760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b600481101561135c57611318816003612919565b61132390600861292c565b63ffffffff16866113358360026126c1565b8151811061134557611345612943565b016020015160f81c901b9190911790600101611304565b5063ffffffff81166002146113c35760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b6020811015611418576113da81601f612919565b6113e590600861292c565b876113f18360066126c1565b8151811061140157611401612943565b016020015160f81c901b91909117906001016113c6565b505f8660268151811061142d5761142d612943565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0790528390208351918201909352825491925f80516020612a3b83398151915292829060ff1660058111156114e8576114e86125b1565b60058111156114f9576114f96125b1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0760205260408082208151610100810190925280545f80516020612a3b83398151915293929190829060ff166005811115611642576116426125b1565b6005811115611653576116536125b1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156116db576116db6125b1565b146117375760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146117b15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b6117be8160a00151611a14565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff19166001836005811115611802576118026125b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6118ce846118c881611f5a565b5f612007565b5f85815260068501602052604090209091506118ea8282612725565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611917908590600401612806565b6020604051808303815f875af1158015611933573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611957919061264f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b6119b4612224565b6119bd8261226d565b6119c68161228e565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a0e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a3b8339815191529060ff165f03611a52575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611a9a9083612919565b10611ab6576001600160401b0384166040830152808252611ad5565b8382604001818151611ac89190612957565b6001600160401b03169052505b5f826020015183604001516064611aec919061297e565b611af691906129a9565b600285015490915060ff9081169082161115611b715760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610319565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c1f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c9657611c56816001612919565b611c6190600861292c565b5081515f90839083908110611c7857611c78612943565b60200101906001600160f81b03191690815f1a905350600101611c42565b505f5b6004811015611cf457611cad816003612919565b611cb890600861292c565b505f82611cc68360026126c1565b81518110611cd657611cd6612943565b60200101906001600160f81b03191690815f1a905350600101611c99565b505f5b6020811015611d515784518160208110611d1357611d13612943565b1a60f81b82611d238360066126c1565b81518110611d3357611d33612943565b60200101906001600160f81b03191690815f1a905350600101611cf7565b505f5b6020811015611db15784602001518160208110611d7357611d73612943565b1a60f81b82611d838360266126c1565b81518110611d9357611d93612943565b60200101906001600160f81b03191690815f1a905350600101611d54565b505f5b6008811015611e2557611dc8816007612919565b611dd390600861292c565b60ff1685604001516001600160401b0316901c60f81b82826046611df791906126c1565b81518110611e0757611e07612943565b60200101906001600160f81b03191690815f1a905350600101611db4565b505f5b6030811015611e905784608001518181518110611e4757611e47612943565b01602001516001600160f81b03191682611e6283604e6126c1565b81518110611e7257611e72612943565b60200101906001600160f81b03191690815f1a905350600101611e28565b505f5b6008811015611f0257611ea7816007612919565b611eb290600861292c565b60608601516001600160401b0390811691161c60f81b82611ed483607e6126c1565b81518110611ee457611ee4612943565b60200101906001600160f81b03191690815f1a905350600101611e93565b50600281604051611f1391906129da565b602060405180830381855afa158015611f2e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f51919061264f565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060030180545f80516020612a3b833981519152916001600160401b0390911690819084611fb2836129f5565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561208057612040816001612919565b61204b90600861292c565b5081515f9083908390811061206257612062612943565b60200101906001600160f81b03191690815f1a90535060010161202c565b505f5b60048110156120e357612097816003612919565b6120a290600861292c565b6001901c60f81b826120b58360026126c1565b815181106120c5576120c5612943565b60200101906001600160f81b03191690815f1a905350600101612083565b505f5b6020811015612145576120fa81601f612919565b61210590600861292c565b86901c60f81b826121178360066126c1565b8151811061212757612127612943565b60200101906001600160f81b03191690815f1a9053506001016120e6565b505f5b60088110156121b05761215c816007612919565b61216790600861292c565b6001600160401b038616901c60f81b826121828360266126c1565b8151811061219257612192612943565b60200101906001600160f81b03191690815f1a905350600101612148565b505f5b600881101561221b576121c7816007612919565b6121d290600861292c565b6001600160401b038516901c60f81b826121ed83602e6126c1565b815181106121fd576121fd612943565b60200101906001600160f81b03191690815f1a9053506001016121b3565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661076857604051631afcd79f60e31b815260040160405180910390fd5b612275612224565b61227d61229f565b6122856122af565b610773816122b7565b612296612224565b61077381612323565b6122a7612224565b61076861232b565b610768612224565b6122bf612224565b80355f80516020612a3b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123096060830160408401612a1a565b600291909101805460ff191660ff90921691909117905550565b610b18612224565b611fe1612224565b50805461233f90612579565b5f825580601f1061234e575050565b601f0160209004905f5260205f209081019061077391905b80821115612379575f8155600101612366565b5090565b5f6020828403121561238d575f80fd5b5035919050565b80356001600160401b03811681146123aa575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156123e5576123e56123af565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612413576124136123af565b604052919050565b5f6001600160401b03821115612433576124336123af565b50601f01601f191660200190565b5f805f8060808587031215612454575f80fd5b61245d85612394565b93506020850135925061247260408601612394565b915060608501356001600160401b0381111561248c575f80fd5b8501601f8101871361249c575f80fd5b80356124af6124aa8261241b565b6123eb565b8181528860208385010111156124c3575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156124f4575f80fd5b813563ffffffff81168114612507575f80fd5b9392505050565b6001600160a01b0381168114610773575f80fd5b5f808284036080811215612534575f80fd5b6060811215612541575f80fd5b5082915060608301356125538161250e565b809150509250929050565b5f6020828403121561256e575f80fd5b81356125078161250e565b600181811c9082168061258d57607f821691505b6020821081036125ab57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f84546125d781612579565b806020870152604060018084165f81146125f8576001811461261457612641565b60ff19851660408a0152604084151560051b8a01019550612641565b895f5260205f205f5b858110156126385781548b820186015290830190880161261d565b8a016040019650505b509398975050505050505050565b5f6020828403121561265f575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126d4576126d46126ad565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156126ff5750805b601f840160051c820191505b8181101561271e575f815560010161270b565b5050505050565b81516001600160401b0381111561273e5761273e6123af565b6127528161274c8454612579565b846126da565b602080601f831160018114612785575f841561276e5750858301515b5f19600386901b1c1916600185901b1785556127dc565b5f85815260208120601f198616915b828110156127b357888601518255948401946001909101908401612794565b50858210156127d057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156127fe5781810151838201526020016127e6565b50505f910152565b602081525f82518060208401526128248160408501602087016127e4565b601f01601f19169190910160400192915050565b805180151581146123aa575f80fd5b5f8060408385031215612858575f80fd5b82516001600160401b038082111561286e575f80fd5b9084019060608287031215612881575f80fd5b6128896123c3565b8251815260208084015161289c8161250e565b828201526040840151838111156128b1575f80fd5b80850194505087601f8501126128c5575f80fd5b835192506128d56124aa8461241b565b83815288828587010111156128e8575f80fd5b6128f7848383018488016127e4565b8060408401525081955061290c818801612838565b9450505050509250929050565b818103818111156126d4576126d46126ad565b80820281158282048414176126d4576126d46126ad565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b03818116838216019080821115612977576129776126ad565b5092915050565b6001600160401b038181168382160280821691908281146129a1576129a16126ad565b505092915050565b5f6001600160401b03808416806129ce57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516129eb8184602087016127e4565b9190910192915050565b5f6001600160401b03808316818103612a1057612a106126ad565b6001019392505050565b5f60208284031215612a2a575f80fd5b813560ff81168114612507575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612b90380380612b9083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a438061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd366004612339565b61023f565b005b6101226100f2366004612339565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101226101433660046123fd565b610384565b6100e26101563660046124a0565b6103a4565b61016e610169366004612339565b61070d565b6040516001600160401b03909116815260200161012c565b6100e2610721565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e0366004612339565b610734565b6100e26101f33660046124a0565b610740565b6101ba6005600160991b0181565b6100e2610214366004612339565b6108fd565b6100e26102273660046124de565b610a11565b6100e261023a36600461251a565b610b1f565b5f8181525f80516020612a1783398151915260205260409020545f805160206129f78339815191529060039060ff16600581111561027f5761027f612535565b146102e95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f8281526006820160205260408120600301546103119084906001600160401b031683610b59565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061033e90849060040161256b565b6020604051808303815f875af115801561035a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037e919061259d565b50505050565b5f61038d610d76565b61039984868585610dd1565b90505b949350505050565b5f805160206129f78339815191525f6103bc83611239565b90505f806103cd836040015161141a565b9150915080156104325760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102e0565b5f828152600685016020526040808220815161010081019092528054829060ff16600581111561046457610464612535565b600581111561047557610475612535565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156104fc576104fc612535565b148061051a575060018251600581111561051857610518612535565b145b6105795760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016102e0565b60038251600581111561058e5761058e612535565b0361059b5750600461059f565b5060055b6020808301515f908152600788019091526040812055818160058111156105c8576105c8612535565b908160058111156105db576105db612535565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561060f5761060f612535565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156106da576106da612535565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61071782611679565b60a0015192915050565b610729610d76565b6107325f61178a565b565b61073d816117fa565b50565b5f805160206129f78339815191525f61075883611239565b90505f80610769836040015161141a565b91509150806107cb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102e0565b5f828152600585016020526040812080546107e5906125b4565b9050118015610817575060015f83815260068601602052604090205460ff16600581111561081557610815612535565b145b6108335760405162461bcd60e51b81526004016102e0906125ec565b5f828152600585016020526040812061084b916122ef565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206129f7833981519152929190610945906125b4565b9050118015610977575060015f83815260068301602052604090205460ff16600581111561097557610975612535565b145b6109935760405162461bcd60e51b81526004016102e0906125ec565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109cc9190600401612633565b6020604051808303815f875af11580156109e8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0c919061259d565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a555750825b90505f826001600160401b03166001148015610a705750303b155b905081158015610a7e575080155b15610a9c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ac657845460ff60401b1916600160401b1785555b610ad08787611b98565b8315610b1657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610b27610d76565b6001600160a01b038116610b5057604051631e4fbdf760e01b81525f60048201526024016102e0565b61073d8161178a565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610bd257610b928160016126d1565b610b9d9060086126ea565b5081515f90839083908110610bb457610bb4612701565b60200101906001600160f81b03191690815f1a905350600101610b7e565b505f5b6004811015610c3557610be98160036126d1565b610bf49060086126ea565b6001901c60f81b82610c07836002612715565b81518110610c1757610c17612701565b60200101906001600160f81b03191690815f1a905350600101610bd5565b505f5b6020811015610c9757610c4c81601f6126d1565b610c579060086126ea565b86901c60f81b82610c69836006612715565b81518110610c7957610c79612701565b60200101906001600160f81b03191690815f1a905350600101610c38565b505f5b6008811015610d0257610cae8160076126d1565b610cb99060086126ea565b6001600160401b038616901c60f81b82610cd4836026612715565b81518110610ce457610ce4612701565b60200101906001600160f81b03191690815f1a905350600101610c9a565b505f5b6008811015610d6d57610d198160076126d1565b610d249060086126ea565b6001600160401b038516901c60f81b82610d3f83602e612715565b81518110610d4f57610d4f612701565b60200101906001600160f81b03191690815f1a905350600101610d05565b50949350505050565b33610da87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107325760405163118cdaa760e01b81523360048201526024016102e0565b5f610dda611bb6565b5f805160206129f7833981519152426001600160401b038516118015610e1457506001600160401b038416610e12426202a300612715565b115b610e765760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102e0565b85610ecd5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016102e0565b5f86815260078201602052604090205415610f3b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102e0565b8251603014610fa25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102e0565b610fab85611c00565b5f80610ff26040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611da1565b5f828152600586016020526040902091935091506110108282612773565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061103d90859060040161256b565b6020604051808303815f875af1158015611059573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107d919061259d565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156110ff576110ff612535565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556111c083612146565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061039c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f805160206129f78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156112ae573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112d59190810190612841565b915091508061133c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016102e0565b825482511461139f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102e0565b60208201516001600160a01b0316156114125760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102e0565b509392505050565b5f80825160271461147f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016102e0565b5f805b60028110156114ce576114968160016126d1565b6114a19060086126ea565b61ffff168582815181106114b7576114b7612701565b016020015160f81c901b9190911790600101611482565b5061ffff81161561152d5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016102e0565b5f805b6004811015611588576115448160036126d1565b61154f9060086126ea565b63ffffffff1686611561836002612715565b8151811061157157611571612701565b016020015160f81c901b9190911790600101611530565b5063ffffffff81166002146115ef5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016102e0565b5f805b60208110156116445761160681601f6126d1565b6116119060086126ea565b8761161d836006612715565b8151811061162d5761162d612701565b016020015160f81c901b91909117906001016115f2565b505f8660268151811061165957611659612701565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f80516020612a1783398151915290528390208351918201909352825491925f805160206129f783398151915292829060ff16600581111561170157611701612535565b600581111561171257611712612535565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181525f80516020612a1783398151915260205260408082208151610100810190925280545f805160206129f783398151915293929190829060ff16600581111561184857611848612535565b600581111561185957611859612535565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156118e1576118e1612535565b1461193d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102e0565b60408101516001600160a01b0316336001600160a01b0316146119b75760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016102e0565b6119c48160a00151611c00565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115611a0857611a08612535565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f611ad484611ace81612146565b5f610b59565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611b0390859060040161256b565b6020604051808303815f875af1158015611b1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b43919061259d565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b611ba06121e0565b611ba982612229565b611bb28161224a565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611bfa57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206129f78339815191529060ff165f03611c3e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611c8690836126d1565b10611ca2576001600160401b0384166040830152808252611cc1565b8382604001818151611cb49190612913565b6001600160401b03169052505b5f826020015183604001516064611cd8919061293a565b611ce29190612965565b600285015490915060ff9081169082161115611d5d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102e0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611e0b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102e0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e8257611e428160016126d1565b611e4d9060086126ea565b5081515f90839083908110611e6457611e64612701565b60200101906001600160f81b03191690815f1a905350600101611e2e565b505f5b6004811015611ee057611e998160036126d1565b611ea49060086126ea565b505f82611eb2836002612715565b81518110611ec257611ec2612701565b60200101906001600160f81b03191690815f1a905350600101611e85565b505f5b6020811015611f3d5784518160208110611eff57611eff612701565b1a60f81b82611f0f836006612715565b81518110611f1f57611f1f612701565b60200101906001600160f81b03191690815f1a905350600101611ee3565b505f5b6020811015611f9d5784602001518160208110611f5f57611f5f612701565b1a60f81b82611f6f836026612715565b81518110611f7f57611f7f612701565b60200101906001600160f81b03191690815f1a905350600101611f40565b505f5b600881101561201157611fb48160076126d1565b611fbf9060086126ea565b60ff1685604001516001600160401b0316901c60f81b82826046611fe39190612715565b81518110611ff357611ff3612701565b60200101906001600160f81b03191690815f1a905350600101611fa0565b505f5b603081101561207c578460800151818151811061203357612033612701565b01602001516001600160f81b0319168261204e83604e612715565b8151811061205e5761205e612701565b60200101906001600160f81b03191690815f1a905350600101612014565b505f5b60088110156120ee576120938160076126d1565b61209e9060086126ea565b60608601516001600160401b0390811691161c60f81b826120c083607e612715565b815181106120d0576120d0612701565b60200101906001600160f81b03191690815f1a90535060010161207f565b506002816040516120ff9190612996565b602060405180830381855afa15801561211a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061213d919061259d565b94909350915050565b5f8181525f80516020612a178339815191526020526040812060030180545f805160206129f7833981519152916001600160401b039091169081908461218b836129b1565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661073257604051631afcd79f60e31b815260040160405180910390fd5b6122316121e0565b61223961225b565b61224161226b565b61073d81612273565b6122526121e0565b61073d816122df565b6122636121e0565b6107326122e7565b6107326121e0565b61227b6121e0565b80355f805160206129f783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122c560608301604084016129d6565b600291909101805460ff191660ff90921691909117905550565b610b276121e0565b6121ba6121e0565b5080546122fb906125b4565b5f825580601f1061230a575050565b601f0160209004905f5260205f209081019061073d91905b80821115612335575f8155600101612322565b5090565b5f60208284031215612349575f80fd5b5035919050565b80356001600160401b0381168114612366575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156123a1576123a161236b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156123cf576123cf61236b565b604052919050565b5f6001600160401b038211156123ef576123ef61236b565b50601f01601f191660200190565b5f805f8060808587031215612410575f80fd5b61241985612350565b93506020850135925061242e60408601612350565b915060608501356001600160401b03811115612448575f80fd5b8501601f81018713612458575f80fd5b803561246b612466826123d7565b6123a7565b81815288602083850101111561247f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156124b0575f80fd5b813563ffffffff811681146124c3575f80fd5b9392505050565b6001600160a01b038116811461073d575f80fd5b5f8082840360808112156124f0575f80fd5b60608112156124fd575f80fd5b50829150606083013561250f816124ca565b809150509250929050565b5f6020828403121561252a575f80fd5b81356124c3816124ca565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561256357818101518382015260200161254b565b50505f910152565b602081525f8251806020840152612589816040850160208701612549565b601f01601f19169190910160400192915050565b5f602082840312156125ad575f80fd5b5051919050565b600181811c908216806125c857607f821691505b6020821081036125e657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612645816125b4565b806020870152604060018084165f81146126665760018114612682576126af565b60ff19851660408a0152604084151560051b8a010195506126af565b895f5260205f205f5b858110156126a65781548b820186015290830190880161268b565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156126e4576126e46126bd565b92915050565b80820281158282048414176126e4576126e46126bd565b634e487b7160e01b5f52603260045260245ffd5b808201808211156126e4576126e46126bd565b601f821115610a0c57805f5260205f20601f840160051c8101602085101561274d5750805b601f840160051c820191505b8181101561276c575f8155600101612759565b5050505050565b81516001600160401b0381111561278c5761278c61236b565b6127a08161279a84546125b4565b84612728565b602080601f8311600181146127d3575f84156127bc5750858301515b5f19600386901b1c1916600185901b17855561282a565b5f85815260208120601f198616915b82811015612801578886015182559484019460019091019084016127e2565b508582101561281e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b80518015158114612366575f80fd5b5f8060408385031215612852575f80fd5b82516001600160401b0380821115612868575f80fd5b908401906060828703121561287b575f80fd5b61288361237f565b82518152602080840151612896816124ca565b828201526040840151838111156128ab575f80fd5b80850194505087601f8501126128bf575f80fd5b835192506128cf612466846123d7565b83815288828587010111156128e2575f80fd5b6128f184838301848801612549565b80604084015250819550612906818801612832565b9450505050509250929050565b6001600160401b03818116838216019080821115612933576129336126bd565b5092915050565b6001600160401b0381811683821602808216919082811461295d5761295d6126bd565b505092915050565b5f6001600160401b038084168061298a57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516129a7818460208701612549565b9190910192915050565b5f6001600160401b038083168181036129cc576129cc6126bd565b6001019392505050565b5f602082840312156129e6575f80fd5b813560ff811681146124c3575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 9d95e95be..c3ac3d278 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -43,8 +43,6 @@ abstract contract ValidatorManager is ValidatorChurnPeriod _churnTracker; /// @notice Maps the validationID to the registration message such that the message can be re-sent if needed. mapping(bytes32 => bytes) _pendingRegisterValidationMessages; - /// @notice Maps the validationID to the end validation message such that the message can be re-sent if needed. - mapping(bytes32 => bytes) _pendingEndValidationMessages; /// @notice Maps the validationID to the validator information. mapping(bytes32 => Validator) _validationPeriods; /// @notice Maps the nodeID to the validationID for active validation periods. @@ -238,7 +236,6 @@ abstract contract ValidatorManager is // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, _getAndIncrementNonce(validationID), 0); - $._pendingEndValidationMessages[validationID] = setValidatorWeightPayload; bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); @@ -255,12 +252,16 @@ abstract contract ValidatorManager is ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); require( - $._pendingEndValidationMessages[validationID].length > 0 - && $._validationPeriods[validationID].status == ValidatorStatus.PendingRemoved, + $._validationPeriods[validationID].status == ValidatorStatus.PendingRemoved, "ValidatorManager: Validator not pending removal" ); - WARP_MESSENGER.sendWarpMessage($._pendingEndValidationMessages[validationID]); + bytes memory setValidatorWeightPayload = ValidatorMessages + .packSetSubnetValidatorWeightMessage( + validationID, $._validationPeriods[validationID].messageNonce, 0 + ); + + WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); } /** @@ -293,7 +294,6 @@ abstract contract ValidatorManager is if (validator.status == ValidatorStatus.PendingRemoved) { endStatus = ValidatorStatus.Completed; - delete $._pendingEndValidationMessages[validationID]; } else { endStatus = ValidatorStatus.Invalidated; } From c5ccd92355ffdde05462cb33512a3276c8cba472 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 6 Sep 2024 13:30:59 -0400 Subject: [PATCH 218/545] Remove pendingRegisterDelegatorMessages --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 41 ++++++++++--------- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index b7a002bc3..6a525ad8a 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161476f38038061476f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146228061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613c8e565b6102d6565b005b610128610138366004613cc9565b610761565b61017b61014b366004613cc9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613cc9565b6108a1565b6101286101af366004613cf4565b610953565b6101c76101c2366004613cc9565b610a37565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d31565b610a4d565b610128610200366004613d4a565b610db6565b61017b610213366004613d88565b610fa7565b6101c7610226366004613cc9565b610fc0565b610128610239366004613cc9565b610fd4565b61012861024c366004613c8e565b611041565b61017b61025f366004613e33565b61105c565b610128610272366004613d4a565b611081565b61017b610285366004613ecf565b611221565b610128610298366004613d31565b611234565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613cc9565b6113f1565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145768339815191529184156103285761032582856114c0565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613eef565b600481111561036b5761036b613eef565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613eef565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206145968339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206145968339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461175c565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500613eef565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856117d0565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190613f17565b905061066a86826118e1565b5f610676878584611929565b5f8c815260058a01602052604090209091506106928282613fc1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016140a2565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906140d4565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181525f805160206145f683398151915260205260409020545f805160206145b68339815191529060039060ff1660058111156107a1576107a1613eef565b146108065760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604081206003015461082e9084906001600160401b031683611929565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061085b9084906004016140a2565b6020604051808303815f875af1158015610877573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089b91906140d4565b50505050565b6108aa81611b46565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614576833981519152916005600160991b019163ee5b48eb9161090e916004016140eb565b6020604051808303815f875af115801561092a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094e91906140d4565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061099c575080546001600160401b03808416911610155b156109ba5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109e58484611c19565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a4764e8d4a5100083614189565b92915050565b5f805160206145b68339815191525f610a6583611c33565b90505f80610a768360400151611e14565b915091508015610adb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610b0d57610b0d613eef565b6005811115610b1e57610b1e613eef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610ba557610ba5613eef565b1480610bc35750600182516005811115610bc157610bc1613eef565b145b610c225760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610c3757610c37613eef565b03610c4457506004610c48565b5060055b6020808301515f90815260078801909152604081205581816005811115610c7157610c71613eef565b90816005811115610c8457610c84613eef565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610cb857610cb8613eef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d8357610d83613eef565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145768339815191525f610dce84611c33565b90505f80610ddf8360400151611fb5565b5091509150610ded856121f0565b5f8581526004850160205260408120610e0591613c1f565b5f610e0f836117d0565b9050816001600160401b031681608001516001600160401b03161015610e475760405162461bcd60e51b815260040161043b9061419c565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e8c5760405162461bcd60e51b815260040161043b906141de565b60015f87815260038701602052604090205460ff166004811115610eb257610eb2613eef565b14610f1b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a476001600160401b03831664e8d4a51000614227565b5f610fca826117d0565b60a0015192915050565b610fdd816121f0565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614576833981519152916005600160991b019163ee5b48eb9161090e916004016140eb565b81156110535761105183826114c0565b505b61094e836122c9565b5f8061106786612667565b905061107585828686612714565b9150505b949350505050565b5f805160206145768339815191525f61109984611c33565b90505f806110aa8360400151611fb5565b50915091506110b885611b46565b5f85815260058501602052604081206110d091613c1f565b5f6110da836117d0565b9050816001600160401b031681608001516001600160401b031610156111125760405162461bcd60e51b815260040161043b9061419c565b5f8681526003808701602052604090912001546001600160401b03808416911611156111505760405162461bcd60e51b815260040161043b906141de565b60035f87815260038701602052604090205460ff16600481111561117657611176613eef565b146111ca5760405162461bcd60e51b815260206004820152603160248201525f805160206145968339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61122d833384612b69565b9392505050565b5f805160206145b68339815191525f61124c83611c33565b90505f8061125d8360400151611e14565b91509150806112bf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f828152600585016020526040812080546112d990613f3e565b905011801561130b575060015f83815260068601602052604090205460ff16600581111561130957611309613eef565b145b6113275760405162461bcd60e51b815260040161043b9061423e565b5f828152600585016020526040812061133f91613c1f565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145b683398151915292919061143990613f3e565b905011801561146b575060015f83815260068301602052604090205460ff16600581111561146957611469613eef565b145b6114875760405162461bcd60e51b815260040161043b9061423e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161090e91906004016140eb565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561150b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115329190810190614290565b91509150806115955760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115fc91906140d4565b8251146116605760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156116d65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806116e58460400151612f24565b915091508187146117525760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206145f68339815191526020526040812060030180545f805160206145b6833981519152916001600160401b03909116908190846117a183614362565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f805160206145f683398151915290528390208351918201909352825491925f805160206145b683398151915292829060ff16600581111561185857611858613eef565b600581111561186957611869613eef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206145f6833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119a257611962816001614387565b61196d906008614227565b5081515f908390839081106119845761198461439a565b60200101906001600160f81b03191690815f1a90535060010161194e565b505f5b6004811015611a05576119b9816003614387565b6119c4906008614227565b6001901c60f81b826119d78360026143ae565b815181106119e7576119e761439a565b60200101906001600160f81b03191690815f1a9053506001016119a5565b505f5b6020811015611a6757611a1c81601f614387565b611a27906008614227565b86901c60f81b82611a398360066143ae565b81518110611a4957611a4961439a565b60200101906001600160f81b03191690815f1a905350600101611a08565b505f5b6008811015611ad257611a7e816007614387565b611a89906008614227565b6001600160401b038616901c60f81b82611aa48360266143ae565b81518110611ab457611ab461439a565b60200101906001600160f81b03191690815f1a905350600101611a6a565b505f5b6008811015611b3d57611ae9816007614387565b611af4906008614227565b6001600160401b038516901c60f81b82611b0f83602e6143ae565b81518110611b1f57611b1f61439a565b60200101906001600160f81b03191690815f1a905350600101611ad5565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614576833981519152929190611b8e90613f3e565b9050118015611bc0575060035f83815260038301602052604090205460ff166004811115611bbe57611bbe613eef565b145b611c155760405162461bcd60e51b815260206004820152603360248201525f8051602061459683398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b611c216130fc565b611c2a82613147565b611c158161318d565b60408051606080820183525f8083526020830181905292820152905f805160206145b68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ca8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ccf9190810190614290565b9150915080611d365760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611d995760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611e0c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f808251602714611e375760405162461bcd60e51b815260040161043b906143c1565b5f805b6002811015611e8657611e4e816001614387565b611e59906008614227565b61ffff16858281518110611e6f57611e6f61439a565b016020015160f81c901b9190911790600101611e3a565b5061ffff811615611ea95760405162461bcd60e51b815260040161043b9061440a565b5f805b6004811015611f0457611ec0816003614387565b611ecb906008614227565b63ffffffff1686611edd8360026143ae565b81518110611eed57611eed61439a565b016020015160f81c901b9190911790600101611eac565b5063ffffffff8116600214611f2b5760405162461bcd60e51b815260040161043b9061444d565b5f805b6020811015611f8057611f4281601f614387565b611f4d906008614227565b87611f598360066143ae565b81518110611f6957611f6961439a565b016020015160f81c901b9190911790600101611f2e565b505f86602681518110611f9557611f9561439a565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611fd95760405162461bcd60e51b815260040161043b906143c1565b5f805b600281101561202857611ff0816001614387565b611ffb906008614227565b61ffff168682815181106120115761201161439a565b016020015160f81c901b9190911790600101611fdc565b5061ffff81161561204b5760405162461bcd60e51b815260040161043b9061440a565b5f805b60048110156120a657612062816003614387565b61206d906008614227565b63ffffffff168761207f8360026143ae565b8151811061208f5761208f61439a565b016020015160f81c901b919091179060010161204e565b5063ffffffff81166003146120cd5760405162461bcd60e51b815260040161043b9061444d565b5f805b6020811015612122576120e481601f614387565b6120ef906008614227565b886120fb8360066143ae565b8151811061210b5761210b61439a565b016020015160f81c901b91909117906001016120d0565b505f805b60088110156121815761213a816007614387565b612145906008614227565b6001600160401b03168961215a8360266143ae565b8151811061216a5761216a61439a565b016020015160f81c901b9190911790600101612126565b505f805b60088110156121e057612199816007614387565b6121a4906008614227565b6001600160401b03168a6121b983602e6143ae565b815181106121c9576121c961439a565b016020015160f81c901b9190911790600101612185565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061457683398151915292919061223890613f3e565b905011801561226a575060015f83815260038301602052604090205460ff16600481111561226857612268613eef565b145b611c155760405162461bcd60e51b815260206004820152603860248201525f8051602061459683398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f805160206145f683398151915260205260408082208151610100810190925280545f805160206145b683398151915293929190829060ff16600581111561231757612317613eef565b600581111561232857612328613eef565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123b0576123b0613eef565b1461240c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146124865760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6124938160a00151613241565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156124d7576124d7613eef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125a38461259d8161175c565b5f611929565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906125d29085906004016140a2565b6020604051808303815f875af11580156125ee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061261291906140d4565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061457683398151915281612680846133e2565b90505f61268c82610a37565b83549091506001600160401b038216108015906126b657508260010154816001600160401b031611155b6110795760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61271d613418565b5f805160206145b6833981519152426001600160401b03851611801561275757506001600160401b038416612755426202a3006143ae565b115b6127b95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b856128105760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f8681526007820160205260409020541561287e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128e55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b6128ee85613241565b5f806129356040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061344f565b5f828152600586016020526040902091935091506129538282613fc1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129809085906004016140a2565b6020604051808303815f875af115801561299c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129c091906140d4565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612a4257612a42613eef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612b038361175c565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061107960015f805160206145d683398151915255565b5f612b72613418565b5f612b7f6101c2846133e2565b90505f805160206145768339815191525f612b99876117d0565b9050600281516005811115612bb057612bb0613eef565b14612c0f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612c209190614494565b9050612c2c88826118e1565b5f612c368961175c565b90505f898983604051602001612c7e9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612c9f86613241565b5f612cab8b8486611929565b5f8381526004880160205260409020909150612cc78282613fc1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cf49085906004016140a2565b6020604051808303815f875af1158015612d10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d3491906140d4565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612de357612de3613eef565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061122d60015f805160206145d683398151915255565b5f808251602e14612f475760405162461bcd60e51b815260040161043b906143c1565b5f805b6002811015612f9657612f5e816001614387565b612f69906008614227565b61ffff16858281518110612f7f57612f7f61439a565b016020015160f81c901b9190911790600101612f4a565b5061ffff811615612fb95760405162461bcd60e51b815260040161043b9061440a565b5f805b600481101561301457612fd0816003614387565b612fdb906008614227565b63ffffffff1686612fed8360026143ae565b81518110612ffd57612ffd61439a565b016020015160f81c901b9190911790600101612fbc565b5063ffffffff811660041461303b5760405162461bcd60e51b815260040161043b9061444d565b5f805b60208110156130905761305281601f614387565b61305d906008614227565b876130698360066143ae565b815181106130795761307961439a565b016020015160f81c901b919091179060010161303e565b505f805b60088110156130ef576130a8816007614387565b6130b3906008614227565b6001600160401b0316886130c88360266143ae565b815181106130d8576130d861439a565b016020015160f81c901b9190911790600101613094565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661314557604051631afcd79f60e31b815260040160405180910390fd5b565b61314f6130fc565b61315881613807565b61318a6060820135608083013561317560c0850160a08601613d88565b61318560e0860160c087016144b4565b613828565b50565b6131956130fc565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132215760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145b68339815191529060ff165f0361327f575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132c79083614387565b106132e3576001600160401b0384166040830152808252613302565b83826040018181516132f59190614494565b6001600160401b03169052505b5f82602001518360400151606461331991906144cf565b61332391906144fa565b600285015490915060ff908116908216111561339e5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a47827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613883565b5f805160206145d683398151915280546001190161344957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134b95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613530576134f0816001614387565b6134fb906008614227565b5081515f908390839081106135125761351261439a565b60200101906001600160f81b03191690815f1a9053506001016134dc565b505f5b600481101561358e57613547816003614387565b613552906008614227565b505f826135608360026143ae565b815181106135705761357061439a565b60200101906001600160f81b03191690815f1a905350600101613533565b505f5b60208110156135eb57845181602081106135ad576135ad61439a565b1a60f81b826135bd8360066143ae565b815181106135cd576135cd61439a565b60200101906001600160f81b03191690815f1a905350600101613591565b505f5b602081101561364b578460200151816020811061360d5761360d61439a565b1a60f81b8261361d8360266143ae565b8151811061362d5761362d61439a565b60200101906001600160f81b03191690815f1a9053506001016135ee565b505f5b60088110156136bf57613662816007614387565b61366d906008614227565b60ff1685604001516001600160401b0316901c60f81b8282604661369191906143ae565b815181106136a1576136a161439a565b60200101906001600160f81b03191690815f1a90535060010161364e565b505f5b603081101561372a57846080015181815181106136e1576136e161439a565b01602001516001600160f81b031916826136fc83604e6143ae565b8151811061370c5761370c61439a565b60200101906001600160f81b03191690815f1a9053506001016136c2565b505f5b600881101561379c57613741816007614387565b61374c906008614227565b60608601516001600160401b0390811691161c60f81b8261376e83607e6143ae565b8151811061377e5761377e61439a565b60200101906001600160f81b03191690815f1a90535060010161372d565b506002816040516137ad919061451f565b602060405180830381855afa1580156137c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137eb91906140d4565b94909350915050565b60015f805160206145d683398151915255565b61380f6130fc565b6138176139e5565b61381f6139f5565b61318a816139fd565b6138306130fc565b5f5f80516020614576833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156138c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138ed91906140d4565b90506139046001600160a01b038516333086613a69565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061396c91906140d4565b90508181116139d25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b6139dc8282614387565b95945050505050565b6139ed6130fc565b613145613ac3565b6131456130fc565b613a056130fc565b80355f805160206145b683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a4f606083016040840161453a565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261089b908590613acb565b6137f46130fc565b5f613adf6001600160a01b03841683613b2c565b905080515f14158015613b03575080806020019051810190613b01919061455a565b155b1561094e57604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b606061122d83835f845f80856001600160a01b03168486604051613b50919061451f565b5f6040518083038185875af1925050503d805f8114613b8a576040519150601f19603f3d011682016040523d82523d5f602084013e613b8f565b606091505b5091509150611752868383606082613baf57613baa82613bf6565b61122d565b8151158015613bc657506001600160a01b0384163b155b15613bef57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b508061122d565b805115613c065780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c2b90613f3e565b5f825580601f10613c3a575050565b601f0160209004905f5260205f209081019061318a91905b80821115613c65575f8155600101613c52565b5090565b801515811461318a575f80fd5b803563ffffffff81168114613c89575f80fd5b919050565b5f805f60608486031215613ca0575f80fd5b833592506020840135613cb281613c69565b9150613cc060408501613c76565b90509250925092565b5f60208284031215613cd9575f80fd5b5035919050565b6001600160a01b038116811461318a575f80fd5b5f80828403610100811215613d07575f80fd5b60e0811215613d14575f80fd5b5082915060e0830135613d2681613ce0565b809150509250929050565b5f60208284031215613d41575f80fd5b61122d82613c76565b5f8060408385031215613d5b575f80fd5b613d6483613c76565b946020939093013593505050565b80356001600160401b0381168114613c89575f80fd5b5f60208284031215613d98575f80fd5b61122d82613d72565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613dd757613dd7613da1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e0557613e05613da1565b604052919050565b5f6001600160401b03821115613e2557613e25613da1565b50601f01601f191660200190565b5f805f8060808587031215613e46575f80fd5b8435935060208501359250613e5d60408601613d72565b915060608501356001600160401b03811115613e77575f80fd5b8501601f81018713613e87575f80fd5b8035613e9a613e9582613e0d565b613ddd565b818152886020838501011115613eae575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ee0575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f3757613f37613f03565b5092915050565b600181811c90821680613f5257607f821691505b602082108103613f7057634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561094e57805f5260205f20601f840160051c81016020851015613f9b5750805b601f840160051c820191505b81811015613fba575f8155600101613fa7565b5050505050565b81516001600160401b03811115613fda57613fda613da1565b613fee81613fe88454613f3e565b84613f76565b602080601f831160018114614021575f841561400a5750858301515b5f19600386901b1c1916600185901b178555614078565b5f85815260208120601f198616915b8281101561404f57888601518255948401946001909101908401614030565b508582101561406c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561409a578181015183820152602001614082565b50505f910152565b602081525f82518060208401526140c0816040850160208701614080565b601f01601f19169190910160400192915050565b5f602082840312156140e4575f80fd5b5051919050565b5f60208083525f84546140fd81613f3e565b806020870152604060018084165f811461411e576001811461413a57614167565b60ff19851660408a0152604084151560051b8a01019550614167565b895f5260205f205f5b8581101561415e5781548b8201860152908301908801614143565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261419757614197614175565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a4757610a47613f03565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613c8981613c69565b5f80604083850312156142a1575f80fd5b82516001600160401b03808211156142b7575f80fd5b90840190606082870312156142ca575f80fd5b6142d2613db5565b825181526020808401516142e581613ce0565b828201526040840151838111156142fa575f80fd5b80850194505087601f85011261430e575f80fd5b8351925061431e613e9584613e0d565b8381528882858701011115614331575f80fd5b61434084838301848801614080565b80604084015250819550614355818801614285565b9450505050509250929050565b5f6001600160401b0380831681810361437d5761437d613f03565b6001019392505050565b81810381811115610a4757610a47613f03565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a4757610a47613f03565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f3757613f37613f03565b5f602082840312156144c4575f80fd5b813561122d81613ce0565b6001600160401b038181168382160280821691908281146144f2576144f2613f03565b505092915050565b5f6001600160401b038084168061451357614513614175565b92169190910492915050565b5f8251614530818460208701614080565b9190910192915050565b5f6020828403121561454a575f80fd5b813560ff8116811461122d575f80fd5b5f6020828403121561456a575f80fd5b815161122d81613c6956fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161484438038061484483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146f78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613d6a565b6102d6565b005b610128610138366004613da5565b610761565b61017b61014b366004613da5565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613da5565b6108a1565b6101286101af366004613dd0565b610953565b6101c76101c2366004613da5565b610a37565b6040516001600160401b039091168152602001610185565b6101286101ed366004613e0d565b610a4d565b610128610200366004613e26565b610db6565b61017b610213366004613e64565b610f86565b6101c7610226366004613da5565b610f9f565b610128610239366004613da5565b610fb3565b61012861024c366004613d6a565b61123f565b61017b61025f366004613f0f565b61125a565b610128610272366004613e26565b61127f565b61017b610285366004613fab565b61141f565b610128610298366004613e0d565b611432565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613da5565b6115ef565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061464b8339815191529184156103285761032582856116be565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613fcb565b600481111561036b5761036b613fcb565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613fcb565b146104445760405162461bcd60e51b815260206004820152602a60248201525f8051602061466b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f8051602061466b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461195a565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500613fcb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856119ce565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190613ff3565b905061066a8682611adf565b5f610676878584611b27565b5f8c815260048a01602052604090209091506106928282614096565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614177565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906141a9565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181525f805160206146cb83398151915260205260409020545f8051602061468b8339815191529060039060ff1660058111156107a1576107a1613fcb565b146108065760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604081206003015461082e9084906001600160401b031683611b27565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061085b908490600401614177565b6020604051808303815f875af1158015610877573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089b91906141a9565b50505050565b6108aa81611d44565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061464b833981519152916005600160991b019163ee5b48eb9161090e916004016141c0565b6020604051808303815f875af115801561092a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094e91906141a9565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061099c575080546001600160401b03808416911610155b156109ba5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109e58484611e17565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a4764e8d4a510008361425e565b92915050565b5f8051602061468b8339815191525f610a6583611e31565b90505f80610a768360400151612012565b915091508015610adb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610b0d57610b0d613fcb565b6005811115610b1e57610b1e613fcb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610ba557610ba5613fcb565b1480610bc35750600182516005811115610bc157610bc1613fcb565b145b610c225760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610c3757610c37613fcb565b03610c4457506004610c48565b5060055b6020808301515f90815260078801909152604081205581816005811115610c7157610c71613fcb565b90816005811115610c8457610c84613fcb565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610cb857610cb8613fcb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d8357610d83613fcb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f8051602061464b8339815191525f610dce84611e31565b90505f80610ddf83604001516121b3565b50915091505f610dee836119ce565b9050816001600160401b031681608001516001600160401b03161015610e265760405162461bcd60e51b815260040161043b90614271565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e6b5760405162461bcd60e51b815260040161043b906142b3565b60015f87815260038701602052604090205460ff166004811115610e9157610e91613fcb565b14610efa5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a476001600160401b03831664e8d4a510006142fc565b5f610fa9826119ce565b60a0015192915050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f8051602061464b83398151915293929190829060ff16600481111561101457611014613fcb565b600481111561102557611025613fcb565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091505f84815260038401602052604090205460ff1660048111156110bd576110bd613fcb565b1461111d5760405162461bcd60e51b815260206004820152603860248201525f8051602061466b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f61112b82604001516119ce565b905080608001516001600160401b03165f036111af5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161043b565b6005600160991b016001600160a01b031663ee5b48eb6111dc846040015184608001518560a00151611b27565b6040518263ffffffff1660e01b81526004016111f89190614177565b6020604051808303815f875af1158015611214573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123891906141a9565b5050505050565b81156112515761124f83826116be565b505b61094e836123ee565b5f806112658661278c565b905061127385828686612839565b9150505b949350505050565b5f8051602061464b8339815191525f61129784611e31565b90505f806112a883604001516121b3565b50915091506112b685611d44565b5f85815260048501602052604081206112ce91613cfb565b5f6112d8836119ce565b9050816001600160401b031681608001516001600160401b031610156113105760405162461bcd60e51b815260040161043b90614271565b5f8681526003808701602052604090912001546001600160401b038084169116111561134e5760405162461bcd60e51b815260040161043b906142b3565b60035f87815260038701602052604090205460ff16600481111561137457611374613fcb565b146113c85760405162461bcd60e51b815260206004820152603160248201525f8051602061466b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61142b833384612c8e565b9392505050565b5f8051602061468b8339815191525f61144a83611e31565b90505f8061145b8360400151612012565b91509150806114bd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f828152600585016020526040812080546114d79061401a565b9050118015611509575060015f83815260068601602052604090205460ff16600581111561150757611507613fcb565b145b6115255760405162461bcd60e51b815260040161043b90614313565b5f828152600585016020526040812061153d91613cfb565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061468b8339815191529291906116379061401a565b9050118015611669575060015f83815260068301602052604090205460ff16600581111561166757611667613fcb565b145b6116855760405162461bcd60e51b815260040161043b90614313565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161090e91906004016141c0565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611709573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117309190810190614365565b91509150806117935760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117fa91906141a9565b82511461185e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156118d45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806118e38460400151613000565b915091508187146119505760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206146cb8339815191526020526040812060030180545f8051602061468b833981519152916001600160401b039091169081908461199f83614437565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f805160206146cb83398151915290528390208351918201909352825491925f8051602061468b83398151915292829060ff166005811115611a5657611a56613fcb565b6005811115611a6757611a67613fcb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206146cb833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ba057611b6081600161445c565b611b6b9060086142fc565b5081515f90839083908110611b8257611b8261446f565b60200101906001600160f81b03191690815f1a905350600101611b4c565b505f5b6004811015611c0357611bb781600361445c565b611bc29060086142fc565b6001901c60f81b82611bd5836002614483565b81518110611be557611be561446f565b60200101906001600160f81b03191690815f1a905350600101611ba3565b505f5b6020811015611c6557611c1a81601f61445c565b611c259060086142fc565b86901c60f81b82611c37836006614483565b81518110611c4757611c4761446f565b60200101906001600160f81b03191690815f1a905350600101611c06565b505f5b6008811015611cd057611c7c81600761445c565b611c879060086142fc565b6001600160401b038616901c60f81b82611ca2836026614483565b81518110611cb257611cb261446f565b60200101906001600160f81b03191690815f1a905350600101611c68565b505f5b6008811015611d3b57611ce781600761445c565b611cf29060086142fc565b6001600160401b038516901c60f81b82611d0d83602e614483565b81518110611d1d57611d1d61446f565b60200101906001600160f81b03191690815f1a905350600101611cd3565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061464b833981519152929190611d8c9061401a565b9050118015611dbe575060035f83815260038301602052604090205460ff166004811115611dbc57611dbc613fcb565b145b611e135760405162461bcd60e51b815260206004820152603360248201525f8051602061466b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b611e1f6131d8565b611e2882613223565b611e1381613269565b60408051606080820183525f8083526020830181905292820152905f8051602061468b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ea6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ecd9190810190614365565b9150915080611f345760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611f975760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b03161561200a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f8082516027146120355760405162461bcd60e51b815260040161043b90614496565b5f805b60028110156120845761204c81600161445c565b6120579060086142fc565b61ffff1685828151811061206d5761206d61446f565b016020015160f81c901b9190911790600101612038565b5061ffff8116156120a75760405162461bcd60e51b815260040161043b906144df565b5f805b6004811015612102576120be81600361445c565b6120c99060086142fc565b63ffffffff16866120db836002614483565b815181106120eb576120eb61446f565b016020015160f81c901b91909117906001016120aa565b5063ffffffff81166002146121295760405162461bcd60e51b815260040161043b90614522565b5f805b602081101561217e5761214081601f61445c565b61214b9060086142fc565b87612157836006614483565b815181106121675761216761446f565b016020015160f81c901b919091179060010161212c565b505f866026815181106121935761219361446f565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146121d75760405162461bcd60e51b815260040161043b90614496565b5f805b6002811015612226576121ee81600161445c565b6121f99060086142fc565b61ffff1686828151811061220f5761220f61446f565b016020015160f81c901b91909117906001016121da565b5061ffff8116156122495760405162461bcd60e51b815260040161043b906144df565b5f805b60048110156122a45761226081600361445c565b61226b9060086142fc565b63ffffffff168761227d836002614483565b8151811061228d5761228d61446f565b016020015160f81c901b919091179060010161224c565b5063ffffffff81166003146122cb5760405162461bcd60e51b815260040161043b90614522565b5f805b6020811015612320576122e281601f61445c565b6122ed9060086142fc565b886122f9836006614483565b815181106123095761230961446f565b016020015160f81c901b91909117906001016122ce565b505f805b600881101561237f5761233881600761445c565b6123439060086142fc565b6001600160401b031689612358836026614483565b815181106123685761236861446f565b016020015160f81c901b9190911790600101612324565b505f805b60088110156123de5761239781600761445c565b6123a29060086142fc565b6001600160401b03168a6123b783602e614483565b815181106123c7576123c761446f565b016020015160f81c901b9190911790600101612383565b5091989097509095509350505050565b5f8181525f805160206146cb83398151915260205260408082208151610100810190925280545f8051602061468b83398151915293929190829060ff16600581111561243c5761243c613fcb565b600581111561244d5761244d613fcb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124d5576124d5613fcb565b146125315760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146125ab5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6125b88160a0015161331d565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156125fc576125fc613fcb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126c8846126c28161195a565b5f611b27565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126f7908590600401614177565b6020604051808303815f875af1158015612713573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061273791906141a9565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061464b833981519152816127a5846134be565b90505f6127b182610a37565b83549091506001600160401b038216108015906127db57508260010154816001600160401b031611155b6112775760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f6128426134f4565b5f8051602061468b833981519152426001600160401b03851611801561287c57506001600160401b03841661287a426202a300614483565b115b6128de5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b856129355760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600782016020526040902054156129a35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612a0a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b612a138561331d565b5f80612a5a6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061352b565b5f82815260058601602052604090209193509150612a788282614096565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612aa5908590600401614177565b6020604051808303815f875af1158015612ac1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ae591906141a9565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612b6757612b67613fcb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612c288361195a565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061127760015f805160206146ab83398151915255565b5f612c976134f4565b5f612ca46101c2846134be565b90505f8051602061464b8339815191525f612cbe876119ce565b9050600281516005811115612cd557612cd5613fcb565b14612d345760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612d459190614569565b9050612d518882611adf565b5f612d5b8961195a565b90505f898983604051602001612da39392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612dc48661331d565b5f6005600160991b0163ee5b48eb612ddd8d8688611b27565b6040518263ffffffff1660e01b8152600401612df99190614177565b6020604051808303815f875af1158015612e15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e3991906141a9565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff19166001836004811115612ec157612ec1613fcb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061142b60015f805160206146ab83398151915255565b5f808251602e146130235760405162461bcd60e51b815260040161043b90614496565b5f805b60028110156130725761303a81600161445c565b6130459060086142fc565b61ffff1685828151811061305b5761305b61446f565b016020015160f81c901b9190911790600101613026565b5061ffff8116156130955760405162461bcd60e51b815260040161043b906144df565b5f805b60048110156130f0576130ac81600361445c565b6130b79060086142fc565b63ffffffff16866130c9836002614483565b815181106130d9576130d961446f565b016020015160f81c901b9190911790600101613098565b5063ffffffff81166004146131175760405162461bcd60e51b815260040161043b90614522565b5f805b602081101561316c5761312e81601f61445c565b6131399060086142fc565b87613145836006614483565b815181106131555761315561446f565b016020015160f81c901b919091179060010161311a565b505f805b60088110156131cb5761318481600761445c565b61318f9060086142fc565b6001600160401b0316886131a4836026614483565b815181106131b4576131b461446f565b016020015160f81c901b9190911790600101613170565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661322157604051631afcd79f60e31b815260040160405180910390fd5b565b61322b6131d8565b613234816138e3565b6132666060820135608083013561325160c0850160a08601613e64565b61326160e0860160c08701614589565b613904565b50565b6132716131d8565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132fd5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061468b8339815191529060ff165f0361335b575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133a3908361445c565b106133bf576001600160401b03841660408301528082526133de565b83826040018181516133d19190614569565b6001600160401b03169052505b5f8260200151836040015160646133f591906145a4565b6133ff91906145cf565b600285015490915060ff908116908216111561347a5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a47827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061395f565b5f805160206146ab83398151915280546001190161352557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135955760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561360c576135cc81600161445c565b6135d79060086142fc565b5081515f908390839081106135ee576135ee61446f565b60200101906001600160f81b03191690815f1a9053506001016135b8565b505f5b600481101561366a5761362381600361445c565b61362e9060086142fc565b505f8261363c836002614483565b8151811061364c5761364c61446f565b60200101906001600160f81b03191690815f1a90535060010161360f565b505f5b60208110156136c757845181602081106136895761368961446f565b1a60f81b82613699836006614483565b815181106136a9576136a961446f565b60200101906001600160f81b03191690815f1a90535060010161366d565b505f5b602081101561372757846020015181602081106136e9576136e961446f565b1a60f81b826136f9836026614483565b815181106137095761370961446f565b60200101906001600160f81b03191690815f1a9053506001016136ca565b505f5b600881101561379b5761373e81600761445c565b6137499060086142fc565b60ff1685604001516001600160401b0316901c60f81b8282604661376d9190614483565b8151811061377d5761377d61446f565b60200101906001600160f81b03191690815f1a90535060010161372a565b505f5b603081101561380657846080015181815181106137bd576137bd61446f565b01602001516001600160f81b031916826137d883604e614483565b815181106137e8576137e861446f565b60200101906001600160f81b03191690815f1a90535060010161379e565b505f5b60088110156138785761381d81600761445c565b6138289060086142fc565b60608601516001600160401b0390811691161c60f81b8261384a83607e614483565b8151811061385a5761385a61446f565b60200101906001600160f81b03191690815f1a905350600101613809565b5060028160405161388991906145f4565b602060405180830381855afa1580156138a4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138c791906141a9565b94909350915050565b60015f805160206146ab83398151915255565b6138eb6131d8565b6138f3613ac1565b6138fb613ad1565b61326681613ad9565b61390c6131d8565b5f5f8051602061464b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139c991906141a9565b90506139e06001600160a01b038516333086613b45565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a4891906141a9565b9050818111613aae5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613ab8828261445c565b95945050505050565b613ac96131d8565b613221613b9f565b6132216131d8565b613ae16131d8565b80355f8051602061468b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b2b606083016040840161460f565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261089b908590613ba7565b6138d06131d8565b5f613bbb6001600160a01b03841683613c08565b905080515f14158015613bdf575080806020019051810190613bdd919061462f565b155b1561094e57604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b606061142b83835f845f80856001600160a01b03168486604051613c2c91906145f4565b5f6040518083038185875af1925050503d805f8114613c66576040519150601f19603f3d011682016040523d82523d5f602084013e613c6b565b606091505b5091509150611950868383606082613c8b57613c8682613cd2565b61142b565b8151158015613ca257506001600160a01b0384163b155b15613ccb57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b508061142b565b805115613ce25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d079061401a565b5f825580601f10613d16575050565b601f0160209004905f5260205f209081019061326691905b80821115613d41575f8155600101613d2e565b5090565b8015158114613266575f80fd5b803563ffffffff81168114613d65575f80fd5b919050565b5f805f60608486031215613d7c575f80fd5b833592506020840135613d8e81613d45565b9150613d9c60408501613d52565b90509250925092565b5f60208284031215613db5575f80fd5b5035919050565b6001600160a01b0381168114613266575f80fd5b5f80828403610100811215613de3575f80fd5b60e0811215613df0575f80fd5b5082915060e0830135613e0281613dbc565b809150509250929050565b5f60208284031215613e1d575f80fd5b61142b82613d52565b5f8060408385031215613e37575f80fd5b613e4083613d52565b946020939093013593505050565b80356001600160401b0381168114613d65575f80fd5b5f60208284031215613e74575f80fd5b61142b82613e4e565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613eb357613eb3613e7d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613ee157613ee1613e7d565b604052919050565b5f6001600160401b03821115613f0157613f01613e7d565b50601f01601f191660200190565b5f805f8060808587031215613f22575f80fd5b8435935060208501359250613f3960408601613e4e565b915060608501356001600160401b03811115613f53575f80fd5b8501601f81018713613f63575f80fd5b8035613f76613f7182613ee9565b613eb9565b818152886020838501011115613f8a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613fbc575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561401357614013613fdf565b5092915050565b600181811c9082168061402e57607f821691505b60208210810361404c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561094e57805f5260205f20601f840160051c810160208510156140775750805b601f840160051c820191505b81811015611238575f8155600101614083565b81516001600160401b038111156140af576140af613e7d565b6140c3816140bd845461401a565b84614052565b602080601f8311600181146140f6575f84156140df5750858301515b5f19600386901b1c1916600185901b17855561414d565b5f85815260208120601f198616915b8281101561412457888601518255948401946001909101908401614105565b508582101561414157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561416f578181015183820152602001614157565b50505f910152565b602081525f8251806020840152614195816040850160208701614155565b601f01601f19169190910160400192915050565b5f602082840312156141b9575f80fd5b5051919050565b5f60208083525f84546141d28161401a565b806020870152604060018084165f81146141f3576001811461420f5761423c565b60ff19851660408a0152604084151560051b8a0101955061423c565b895f5260205f205f5b858110156142335781548b8201860152908301908801614218565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261426c5761426c61424a565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a4757610a47613fdf565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613d6581613d45565b5f8060408385031215614376575f80fd5b82516001600160401b038082111561438c575f80fd5b908401906060828703121561439f575f80fd5b6143a7613e91565b825181526020808401516143ba81613dbc565b828201526040840151838111156143cf575f80fd5b80850194505087601f8501126143e3575f80fd5b835192506143f3613f7184613ee9565b8381528882858701011115614406575f80fd5b61441584838301848801614155565b8060408401525081955061442a81880161435a565b9450505050509250929050565b5f6001600160401b0380831681810361445257614452613fdf565b6001019392505050565b81810381811115610a4757610a47613fdf565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a4757610a47613fdf565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561401357614013613fdf565b5f60208284031215614599575f80fd5b813561142b81613dbc565b6001600160401b038181168382160280821691908281146145c7576145c7613fdf565b505092915050565b5f6001600160401b03808416806145e8576145e861424a565b92169190910492915050565b5f8251614605818460208701614155565b9190910192915050565b5f6020828403121561461f575f80fd5b813560ff8116811461142b575f80fd5b5f6020828403121561463f575f80fd5b815161142b81613d4556fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 9804f590f..18e4b0941 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161439d38038061439d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142508061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613909565b610389565b005b348015610134575f80fd5b50610127610143366004613944565b61046b565b348015610153575f80fd5b5061012761016236600461397f565b6108f6565b348015610172575f80fd5b506101b161018136600461397f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de36600461397f565b610a36565b3480156101ee575f80fd5b506102026101fd36600461397f565b610ae8565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613996565b610afe565b348015610244575f80fd5b506101276102533660046139af565b610e67565b348015610263575f80fd5b506101b16102723660046139ed565b611058565b348015610282575f80fd5b5061020261029136600461397f565b611071565b3480156102a1575f80fd5b506101276102b036600461397f565b611085565b3480156102c0575f80fd5b506101276102cf366004613944565b6110f2565b3480156102df575f80fd5b506101276102ee3660046139af565b61110d565b3480156102fe575f80fd5b5061012761030d366004613996565b6112ad565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e36600461397f565b61146a565b6101b161037136600461397f565b611539565b6101b1610384366004613a98565b611545565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611569565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206141a48339815191529184156104bd576104ba828561157d565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b2a565b600481111561050057610500613b2a565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613b2a565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206141c48339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206141c48339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f61064884611819565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613b2a565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107678561188d565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613b52565b90506107ff868261199e565b5f61080b8785846119e6565b5f8c815260058a01602052604090209091506108278282613bf6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613cd7565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613d09565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181525f8051602061422483398151915260205260409020545f805160206141e48339815191529060039060ff16600581111561093657610936613b2a565b1461099b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f8281526006820160205260408120600301546109c39084906001600160401b0316836119e6565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906109f0908490600401613cd7565b6020604051808303815f875af1158015610a0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a309190613d09565b50505050565b610a3f81611c03565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206141a4833981519152916005600160991b019163ee5b48eb91610aa391600401613d20565b6020604051808303815f875af1158015610abf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ae39190613d09565b505050565b5f610af864e8d4a5100083613dbe565b92915050565b5f805160206141e48339815191525f610b1683611cd6565b90505f80610b278360400151611eb7565b915091508015610b8c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610bbe57610bbe613b2a565b6005811115610bcf57610bcf613b2a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c5657610c56613b2a565b1480610c745750600182516005811115610c7257610c72613b2a565b145b610cd35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115610ce857610ce8613b2a565b03610cf557506004610cf9565b5060055b6020808301515f90815260078801909152604081205581816005811115610d2257610d22613b2a565b90816005811115610d3557610d35613b2a565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610d6957610d69613b2a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e3457610e34613b2a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206141a48339815191525f610e7f84611cd6565b90505f80610e908360400151612058565b5091509150610e9e85612293565b5f8581526004850160205260408120610eb6916138bf565b5f610ec08361188d565b9050816001600160401b031681608001516001600160401b03161015610ef85760405162461bcd60e51b81526004016105d090613dd1565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f3d5760405162461bcd60e51b81526004016105d090613e13565b60015f87815260038701602052604090205460ff166004811115610f6357610f63613b2a565b14610fcc5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610af86001600160401b03831664e8d4a51000613e5c565b5f61107b8261188d565b60a0015192915050565b61108e81612293565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206141a4833981519152916005600160991b019163ee5b48eb91610aa391600401613d20565b811561110457611102838261157d565b505b610ae38361236c565b5f805160206141a48339815191525f61112584611cd6565b90505f806111368360400151612058565b509150915061114485611c03565b5f858152600585016020526040812061115c916138bf565b5f6111668361188d565b9050816001600160401b031681608001516001600160401b0316101561119e5760405162461bcd60e51b81526004016105d090613dd1565b5f8681526003808701602052604090912001546001600160401b03808416911611156111dc5760405162461bcd60e51b81526004016105d090613e13565b60035f87815260038701602052604090205460ff16600481111561120257611202613b2a565b146112565760405162461bcd60e51b815260206004820152603160248201525f805160206141c48339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206141e48339815191525f6112c583611cd6565b90505f806112d68360400151611eb7565b91509150806113385760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f8281526005850160205260408120805461135290613b79565b9050118015611384575060015f83815260068601602052604090205460ff16600581111561138257611382613b2a565b145b6113a05760405162461bcd60e51b81526004016105d090613e73565b5f82815260058501602052604081206113b8916138bf565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206141e48339815191529291906114b290613b79565b90501180156114e4575060015f83815260068301602052604090205460ff1660058111156114e2576114e2613b2a565b145b6115005760405162461bcd60e51b81526004016105d090613e73565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aa39190600401613d20565b5f610af882333461270a565b5f8061155034612ac2565b905061155e85828686612b6c565b9150505b9392505050565b611571612fc1565b61157a8161300c565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115ef9190810190613ed9565b91509150806116525760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611695573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b99190613d09565b82511461171d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b0316156117935760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f806117a2846040015161304f565b9150915081871461180f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f805160206142248339815191526020526040812060030180545f805160206141e4833981519152916001600160401b039091169081908461185e83613fab565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061422483398151915290528390208351918201909352825491925f805160206141e483398151915292829060ff16600581111561191557611915613b2a565b600581111561192657611926613b2a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614224833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5f57611a1f816001613fd0565b611a2a906008613e5c565b5081515f90839083908110611a4157611a41613fe3565b60200101906001600160f81b03191690815f1a905350600101611a0b565b505f5b6004811015611ac257611a76816003613fd0565b611a81906008613e5c565b6001901c60f81b82611a94836002613ff7565b81518110611aa457611aa4613fe3565b60200101906001600160f81b03191690815f1a905350600101611a62565b505f5b6020811015611b2457611ad981601f613fd0565b611ae4906008613e5c565b86901c60f81b82611af6836006613ff7565b81518110611b0657611b06613fe3565b60200101906001600160f81b03191690815f1a905350600101611ac5565b505f5b6008811015611b8f57611b3b816007613fd0565b611b46906008613e5c565b6001600160401b038616901c60f81b82611b61836026613ff7565b81518110611b7157611b71613fe3565b60200101906001600160f81b03191690815f1a905350600101611b27565b505f5b6008811015611bfa57611ba6816007613fd0565b611bb1906008613e5c565b6001600160401b038516901c60f81b82611bcc83602e613ff7565b81518110611bdc57611bdc613fe3565b60200101906001600160f81b03191690815f1a905350600101611b92565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206141a4833981519152929190611c4b90613b79565b9050118015611c7d575060035f83815260038301602052604090205460ff166004811115611c7b57611c7b613b2a565b145b611cd25760405162461bcd60e51b815260206004820152603360248201525f805160206141c483398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206141e48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d4b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d729190810190613ed9565b9150915080611dd95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611e3c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611eaf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f808251602714611eda5760405162461bcd60e51b81526004016105d09061400a565b5f805b6002811015611f2957611ef1816001613fd0565b611efc906008613e5c565b61ffff16858281518110611f1257611f12613fe3565b016020015160f81c901b9190911790600101611edd565b5061ffff811615611f4c5760405162461bcd60e51b81526004016105d090614053565b5f805b6004811015611fa757611f63816003613fd0565b611f6e906008613e5c565b63ffffffff1686611f80836002613ff7565b81518110611f9057611f90613fe3565b016020015160f81c901b9190911790600101611f4f565b5063ffffffff8116600214611fce5760405162461bcd60e51b81526004016105d090614096565b5f805b602081101561202357611fe581601f613fd0565b611ff0906008613e5c565b87611ffc836006613ff7565b8151811061200c5761200c613fe3565b016020015160f81c901b9190911790600101611fd1565b505f8660268151811061203857612038613fe3565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461207c5760405162461bcd60e51b81526004016105d09061400a565b5f805b60028110156120cb57612093816001613fd0565b61209e906008613e5c565b61ffff168682815181106120b4576120b4613fe3565b016020015160f81c901b919091179060010161207f565b5061ffff8116156120ee5760405162461bcd60e51b81526004016105d090614053565b5f805b600481101561214957612105816003613fd0565b612110906008613e5c565b63ffffffff1687612122836002613ff7565b8151811061213257612132613fe3565b016020015160f81c901b91909117906001016120f1565b5063ffffffff81166003146121705760405162461bcd60e51b81526004016105d090614096565b5f805b60208110156121c55761218781601f613fd0565b612192906008613e5c565b8861219e836006613ff7565b815181106121ae576121ae613fe3565b016020015160f81c901b9190911790600101612173565b505f805b6008811015612224576121dd816007613fd0565b6121e8906008613e5c565b6001600160401b0316896121fd836026613ff7565b8151811061220d5761220d613fe3565b016020015160f81c901b91909117906001016121c9565b505f805b60088110156122835761223c816007613fd0565b612247906008613e5c565b6001600160401b03168a61225c83602e613ff7565b8151811061226c5761226c613fe3565b016020015160f81c901b9190911790600101612228565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206141a48339815191529291906122db90613b79565b905011801561230d575060015f83815260038301602052604090205460ff16600481111561230b5761230b613b2a565b145b611cd25760405162461bcd60e51b815260206004820152603860248201525f805160206141c483398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061422483398151915260205260408082208151610100810190925280545f805160206141e483398151915293929190829060ff1660058111156123ba576123ba613b2a565b60058111156123cb576123cb613b2a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561245357612453613b2a565b146124af5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b0316146125295760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6125368160a00151613227565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561257a5761257a613b2a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126468461264081611819565b5f6119e6565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612675908590600401613cd7565b6020604051808303815f875af1158015612691573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126b59190613d09565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6127136133c8565b5f61271d83610ae8565b90505f805160206141a48339815191525f6127378761188d565b905060028151600581111561274e5761274e613b2a565b146127ad5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516127be91906140dd565b90506127ca888261199e565b5f6127d489611819565b90505f89898360405160200161281c9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061283d86613227565b5f6128498b84866119e6565b5f83815260048801602052604090209091506128658282613bf6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612892908590600401613cd7565b6020604051808303815f875af11580156128ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128d29190613d09565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561298157612981613b2a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061156260015f8051602061420483398151915255565b5f5f805160206141a48339815191528282612adc82610ae8565b83549091506001600160401b03821610801590612b0657508260010154816001600160401b031611155b612b645760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612b756133c8565b5f805160206141e4833981519152426001600160401b038516118015612baf57506001600160401b038416612bad426202a300613ff7565b115b612c115760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612c685760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260078201602052604090205415612cd65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612d3d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612d4685613227565b5f80612d8d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613412565b5f82815260058601602052604090209193509150612dab8282613bf6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612dd8908590600401613cd7565b6020604051808303815f875af1158015612df4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e189190613d09565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612e9a57612e9a613b2a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612f5b83611819565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b6460015f8051602061420483398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661300a57604051631afcd79f60e31b815260040160405180910390fd5b565b613014612fc1565b61301d816137b7565b61157a6060820135608083013561303a60c0850160a086016139ed565b61304a60e0860160c087016140fd565b6137d8565b5f808251602e146130725760405162461bcd60e51b81526004016105d09061400a565b5f805b60028110156130c157613089816001613fd0565b613094906008613e5c565b61ffff168582815181106130aa576130aa613fe3565b016020015160f81c901b9190911790600101613075565b5061ffff8116156130e45760405162461bcd60e51b81526004016105d090614053565b5f805b600481101561313f576130fb816003613fd0565b613106906008613e5c565b63ffffffff1686613118836002613ff7565b8151811061312857613128613fe3565b016020015160f81c901b91909117906001016130e7565b5063ffffffff81166004146131665760405162461bcd60e51b81526004016105d090614096565b5f805b60208110156131bb5761317d81601f613fd0565b613188906008613e5c565b87613194836006613ff7565b815181106131a4576131a4613fe3565b016020015160f81c901b9190911790600101613169565b505f805b600881101561321a576131d3816007613fd0565b6131de906008613e5c565b6001600160401b0316886131f3836026613ff7565b8151811061320357613203613fe3565b016020015160f81c901b91909117906001016131bf565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206141e48339815191529060ff165f03613265575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132ad9083613fd0565b106132c9576001600160401b03841660408301528082526132e8565b83826040018181516132db91906140dd565b6001600160401b03169052505b5f8260200151836040015160646132ff9190614118565b6133099190614143565b600285015490915060ff90811690821611156133845760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206142048339815191528054600119016133f957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061420483398151915255565b5f606082608001515160301461347c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134f3576134b3816001613fd0565b6134be906008613e5c565b5081515f908390839081106134d5576134d5613fe3565b60200101906001600160f81b03191690815f1a90535060010161349f565b505f5b60048110156135515761350a816003613fd0565b613515906008613e5c565b505f82613523836002613ff7565b8151811061353357613533613fe3565b60200101906001600160f81b03191690815f1a9053506001016134f6565b505f5b60208110156135ae578451816020811061357057613570613fe3565b1a60f81b82613580836006613ff7565b8151811061359057613590613fe3565b60200101906001600160f81b03191690815f1a905350600101613554565b505f5b602081101561360e57846020015181602081106135d0576135d0613fe3565b1a60f81b826135e0836026613ff7565b815181106135f0576135f0613fe3565b60200101906001600160f81b03191690815f1a9053506001016135b1565b505f5b600881101561368257613625816007613fd0565b613630906008613e5c565b60ff1685604001516001600160401b0316901c60f81b828260466136549190613ff7565b8151811061366457613664613fe3565b60200101906001600160f81b03191690815f1a905350600101613611565b505f5b60308110156136ed57846080015181815181106136a4576136a4613fe3565b01602001516001600160f81b031916826136bf83604e613ff7565b815181106136cf576136cf613fe3565b60200101906001600160f81b03191690815f1a905350600101613685565b505f5b600881101561375f57613704816007613fd0565b61370f906008613e5c565b60608601516001600160401b0390811691161c60f81b8261373183607e613ff7565b8151811061374157613741613fe3565b60200101906001600160f81b03191690815f1a9053506001016136f0565b506002816040516137709190614168565b602060405180830381855afa15801561378b573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137ae9190613d09565b94909350915050565b6137bf612fc1565b6137c7613833565b6137cf613843565b61157a8161384b565b6137e0612fc1565b5f5f805160206141a4833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61383b612fc1565b61300a6138b7565b61300a612fc1565b613853612fc1565b80355f805160206141e483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561389d6060830160408401614183565b600291909101805460ff191660ff90921691909117905550565b6133ff612fc1565b5080546138cb90613b79565b5f825580601f106138da575050565b601f0160209004905f5260205f209081019061157a91905b80821115613905575f81556001016138f2565b5090565b5f60e08284031215613919575f80fd5b50919050565b801515811461157a575f80fd5b803563ffffffff8116811461393f575f80fd5b919050565b5f805f60608486031215613956575f80fd5b8335925060208401356139688161391f565b91506139766040850161392c565b90509250925092565b5f6020828403121561398f575f80fd5b5035919050565b5f602082840312156139a6575f80fd5b6115628261392c565b5f80604083850312156139c0575f80fd5b6139c98361392c565b946020939093013593505050565b80356001600160401b038116811461393f575f80fd5b5f602082840312156139fd575f80fd5b611562826139d7565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a3c57613a3c613a06565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613a6a57613a6a613a06565b604052919050565b5f6001600160401b03821115613a8a57613a8a613a06565b50601f01601f191660200190565b5f805f60608486031215613aaa575f80fd5b83359250613aba602085016139d7565b915060408401356001600160401b03811115613ad4575f80fd5b8401601f81018613613ae4575f80fd5b8035613af7613af282613a72565b613a42565b818152876020838501011115613b0b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613b7257613b72613b3e565b5092915050565b600181811c90821680613b8d57607f821691505b60208210810361391957634e487b7160e01b5f52602260045260245ffd5b601f821115610ae357805f5260205f20601f840160051c81016020851015613bd05750805b601f840160051c820191505b81811015613bef575f8155600101613bdc565b5050505050565b81516001600160401b03811115613c0f57613c0f613a06565b613c2381613c1d8454613b79565b84613bab565b602080601f831160018114613c56575f8415613c3f5750858301515b5f19600386901b1c1916600185901b178555613cad565b5f85815260208120601f198616915b82811015613c8457888601518255948401946001909101908401613c65565b5085821015613ca157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613ccf578181015183820152602001613cb7565b50505f910152565b602081525f8251806020840152613cf5816040850160208701613cb5565b601f01601f19169190910160400192915050565b5f60208284031215613d19575f80fd5b5051919050565b5f60208083525f8454613d3281613b79565b806020870152604060018084165f8114613d535760018114613d6f57613d9c565b60ff19851660408a0152604084151560051b8a01019550613d9c565b895f5260205f205f5b85811015613d935781548b8201860152908301908801613d78565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613dcc57613dcc613daa565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610af857610af8613b3e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b038116811461157a575f80fd5b805161393f8161391f565b5f8060408385031215613eea575f80fd5b82516001600160401b0380821115613f00575f80fd5b9084019060608287031215613f13575f80fd5b613f1b613a1a565b82518152602080840151613f2e81613eba565b82820152604084015183811115613f43575f80fd5b80850194505087601f850112613f57575f80fd5b83519250613f67613af284613a72565b8381528882858701011115613f7a575f80fd5b613f8984838301848801613cb5565b80604084015250819550613f9e818801613ece565b9450505050509250929050565b5f6001600160401b03808316818103613fc657613fc6613b3e565b6001019392505050565b81810381811115610af857610af8613b3e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610af857610af8613b3e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613b7257613b72613b3e565b5f6020828403121561410d575f80fd5b813561156281613eba565b6001600160401b0381811683821602808216919082811461413b5761413b613b3e565b505092915050565b5f6001600160401b038084168061415c5761415c613daa565b92169190910492915050565b5f8251614179818460208701613cb5565b9190910192915050565b5f60208284031215614193575f80fd5b813560ff81168114611562575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161447238038061447283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143258061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b506101276101223660046139e5565b610389565b005b348015610134575f80fd5b50610127610143366004613a20565b61046b565b348015610153575f80fd5b50610127610162366004613a5b565b6108f6565b348015610172575f80fd5b506101b1610181366004613a5b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613a5b565b610a36565b3480156101ee575f80fd5b506102026101fd366004613a5b565b610ae8565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613a72565b610afe565b348015610244575f80fd5b50610127610253366004613a8b565b610e67565b348015610263575f80fd5b506101b1610272366004613ac9565b611037565b348015610282575f80fd5b50610202610291366004613a5b565b611050565b3480156102a1575f80fd5b506101276102b0366004613a5b565b611064565b3480156102c0575f80fd5b506101276102cf366004613a20565b6112f0565b3480156102df575f80fd5b506101276102ee366004613a8b565b61130b565b3480156102fe575f80fd5b5061012761030d366004613a72565b6114ab565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613a5b565b611668565b6101b1610371366004613a5b565b611737565b6101b1610384366004613b74565b611743565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611767565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206142798339815191529184156104bd576104ba828561177b565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613c06565b600481111561050057610500613c06565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613c06565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206142998339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206142998339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f61064884611a17565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613c06565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076785611a8b565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613c2e565b90506107ff8682611b9c565b5f61080b878584611be4565b5f8c815260048a01602052604090209091506108278282613ccb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613dac565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613dde565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181525f805160206142f983398151915260205260409020545f805160206142b98339815191529060039060ff16600581111561093657610936613c06565b1461099b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f8281526006820160205260408120600301546109c39084906001600160401b031683611be4565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906109f0908490600401613dac565b6020604051808303815f875af1158015610a0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a309190613dde565b50505050565b610a3f81611e01565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614279833981519152916005600160991b019163ee5b48eb91610aa391600401613df5565b6020604051808303815f875af1158015610abf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ae39190613dde565b505050565b5f610af864e8d4a5100083613e93565b92915050565b5f805160206142b98339815191525f610b1683611ed4565b90505f80610b2783604001516120b5565b915091508015610b8c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610bbe57610bbe613c06565b6005811115610bcf57610bcf613c06565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c5657610c56613c06565b1480610c745750600182516005811115610c7257610c72613c06565b145b610cd35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115610ce857610ce8613c06565b03610cf557506004610cf9565b5060055b6020808301515f90815260078801909152604081205581816005811115610d2257610d22613c06565b90816005811115610d3557610d35613c06565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610d6957610d69613c06565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e3457610e34613c06565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206142798339815191525f610e7f84611ed4565b90505f80610e908360400151612256565b50915091505f610e9f83611a8b565b9050816001600160401b031681608001516001600160401b03161015610ed75760405162461bcd60e51b81526004016105d090613ea6565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f1c5760405162461bcd60e51b81526004016105d090613ee8565b60015f87815260038701602052604090205460ff166004811115610f4257610f42613c06565b14610fab5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610af86001600160401b03831664e8d4a51000613f31565b5f61105a82611a8b565b60a0015192915050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f8051602061427983398151915293929190829060ff1660048111156110c5576110c5613c06565b60048111156110d6576110d6613c06565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091505f84815260038401602052604090205460ff16600481111561116e5761116e613c06565b146111ce5760405162461bcd60e51b815260206004820152603860248201525f8051602061429983398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f6111dc8260400151611a8b565b905080608001516001600160401b03165f036112605760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105d0565b6005600160991b016001600160a01b031663ee5b48eb61128d846040015184608001518560a00151611be4565b6040518263ffffffff1660e01b81526004016112a99190613dac565b6020604051808303815f875af11580156112c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e99190613dde565b5050505050565b811561130257611300838261177b565b505b610ae383612491565b5f805160206142798339815191525f61132384611ed4565b90505f806113348360400151612256565b509150915061134285611e01565b5f858152600485016020526040812061135a9161399b565b5f61136483611a8b565b9050816001600160401b031681608001516001600160401b0316101561139c5760405162461bcd60e51b81526004016105d090613ea6565b5f8681526003808701602052604090912001546001600160401b03808416911611156113da5760405162461bcd60e51b81526004016105d090613ee8565b60035f87815260038701602052604090205460ff16600481111561140057611400613c06565b146114545760405162461bcd60e51b815260206004820152603160248201525f805160206142998339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142b98339815191525f6114c383611ed4565b90505f806114d483604001516120b5565b91509150806115365760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f8281526005850160205260408120805461155090613c55565b9050118015611582575060015f83815260068601602052604090205460ff16600581111561158057611580613c06565b145b61159e5760405162461bcd60e51b81526004016105d090613f48565b5f82815260058501602052604081206115b69161399b565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142b98339815191529291906116b090613c55565b90501180156116e2575060015f83815260068301602052604090205460ff1660058111156116e0576116e0613c06565b145b6116fe5760405162461bcd60e51b81526004016105d090613f48565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aa39190600401613df5565b5f610af882333461282f565b5f8061174e34612b9e565b905061175c85828686612c48565b9150505b9392505050565b61176f61309d565b611778816130e8565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156117c6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117ed9190810190613fae565b91509150806118505760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611893573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118b79190613dde565b82511461191b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b0316156119915760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f806119a0846040015161312b565b91509150818714611a0d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f805160206142f98339815191526020526040812060030180545f805160206142b9833981519152916001600160401b0390911690819084611a5c83614080565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f805160206142f983398151915290528390208351918201909352825491925f805160206142b983398151915292829060ff166005811115611b1357611b13613c06565b6005811115611b2457611b24613c06565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206142f9833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611c5d57611c1d8160016140a5565b611c28906008613f31565b5081515f90839083908110611c3f57611c3f6140b8565b60200101906001600160f81b03191690815f1a905350600101611c09565b505f5b6004811015611cc057611c748160036140a5565b611c7f906008613f31565b6001901c60f81b82611c928360026140cc565b81518110611ca257611ca26140b8565b60200101906001600160f81b03191690815f1a905350600101611c60565b505f5b6020811015611d2257611cd781601f6140a5565b611ce2906008613f31565b86901c60f81b82611cf48360066140cc565b81518110611d0457611d046140b8565b60200101906001600160f81b03191690815f1a905350600101611cc3565b505f5b6008811015611d8d57611d398160076140a5565b611d44906008613f31565b6001600160401b038616901c60f81b82611d5f8360266140cc565b81518110611d6f57611d6f6140b8565b60200101906001600160f81b03191690815f1a905350600101611d25565b505f5b6008811015611df857611da48160076140a5565b611daf906008613f31565b6001600160401b038516901c60f81b82611dca83602e6140cc565b81518110611dda57611dda6140b8565b60200101906001600160f81b03191690815f1a905350600101611d90565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f80516020614279833981519152929190611e4990613c55565b9050118015611e7b575060035f83815260038301602052604090205460ff166004811115611e7957611e79613c06565b145b611ed05760405162461bcd60e51b815260206004820152603360248201525f8051602061429983398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206142b98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f49573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f709190810190613fae565b9150915080611fd75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b825482511461203a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b0316156120ad5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f8082516027146120d85760405162461bcd60e51b81526004016105d0906140df565b5f805b6002811015612127576120ef8160016140a5565b6120fa906008613f31565b61ffff16858281518110612110576121106140b8565b016020015160f81c901b91909117906001016120db565b5061ffff81161561214a5760405162461bcd60e51b81526004016105d090614128565b5f805b60048110156121a5576121618160036140a5565b61216c906008613f31565b63ffffffff168661217e8360026140cc565b8151811061218e5761218e6140b8565b016020015160f81c901b919091179060010161214d565b5063ffffffff81166002146121cc5760405162461bcd60e51b81526004016105d09061416b565b5f805b6020811015612221576121e381601f6140a5565b6121ee906008613f31565b876121fa8360066140cc565b8151811061220a5761220a6140b8565b016020015160f81c901b91909117906001016121cf565b505f86602681518110612236576122366140b8565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461227a5760405162461bcd60e51b81526004016105d0906140df565b5f805b60028110156122c9576122918160016140a5565b61229c906008613f31565b61ffff168682815181106122b2576122b26140b8565b016020015160f81c901b919091179060010161227d565b5061ffff8116156122ec5760405162461bcd60e51b81526004016105d090614128565b5f805b6004811015612347576123038160036140a5565b61230e906008613f31565b63ffffffff16876123208360026140cc565b81518110612330576123306140b8565b016020015160f81c901b91909117906001016122ef565b5063ffffffff811660031461236e5760405162461bcd60e51b81526004016105d09061416b565b5f805b60208110156123c35761238581601f6140a5565b612390906008613f31565b8861239c8360066140cc565b815181106123ac576123ac6140b8565b016020015160f81c901b9190911790600101612371565b505f805b6008811015612422576123db8160076140a5565b6123e6906008613f31565b6001600160401b0316896123fb8360266140cc565b8151811061240b5761240b6140b8565b016020015160f81c901b91909117906001016123c7565b505f805b60088110156124815761243a8160076140a5565b612445906008613f31565b6001600160401b03168a61245a83602e6140cc565b8151811061246a5761246a6140b8565b016020015160f81c901b9190911790600101612426565b5091989097509095509350505050565b5f8181525f805160206142f983398151915260205260408082208151610100810190925280545f805160206142b983398151915293929190829060ff1660058111156124df576124df613c06565b60058111156124f0576124f0613c06565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561257857612578613c06565b146125d45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461264e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b61265b8160a00151613303565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561269f5761269f613c06565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61276b8461276581611a17565b5f611be4565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061279a908590600401613dac565b6020604051808303815f875af11580156127b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127da9190613dde565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6128386134a4565b5f61284283610ae8565b90505f805160206142798339815191525f61285c87611a8b565b905060028151600581111561287357612873613c06565b146128d25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516128e391906141b2565b90506128ef8882611b9c565b5f6128f989611a17565b90505f8989836040516020016129419392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061296286613303565b5f6005600160991b0163ee5b48eb61297b8d8688611be4565b6040518263ffffffff1660e01b81526004016129979190613dac565b6020604051808303815f875af11580156129b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129d79190613dde565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff19166001836004811115612a5f57612a5f613c06565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061176060015f805160206142d983398151915255565b5f5f805160206142798339815191528282612bb882610ae8565b83549091506001600160401b03821610801590612be257508260010154816001600160401b031611155b612c405760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612c516134a4565b5f805160206142b9833981519152426001600160401b038516118015612c8b57506001600160401b038416612c89426202a3006140cc565b115b612ced5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612d445760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260078201602052604090205415612db25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612e195760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612e2285613303565b5f80612e696040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134ee565b5f82815260058601602052604090209193509150612e878282613ccb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612eb4908590600401613dac565b6020604051808303815f875af1158015612ed0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ef49190613dde565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612f7657612f76613c06565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561303783611a17565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c4060015f805160206142d983398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130e657604051631afcd79f60e31b815260040160405180910390fd5b565b6130f061309d565b6130f981613893565b6117786060820135608083013561311660c0850160a08601613ac9565b61312660e0860160c087016141d2565b6138b4565b5f808251602e1461314e5760405162461bcd60e51b81526004016105d0906140df565b5f805b600281101561319d576131658160016140a5565b613170906008613f31565b61ffff16858281518110613186576131866140b8565b016020015160f81c901b9190911790600101613151565b5061ffff8116156131c05760405162461bcd60e51b81526004016105d090614128565b5f805b600481101561321b576131d78160036140a5565b6131e2906008613f31565b63ffffffff16866131f48360026140cc565b81518110613204576132046140b8565b016020015160f81c901b91909117906001016131c3565b5063ffffffff81166004146132425760405162461bcd60e51b81526004016105d09061416b565b5f805b60208110156132975761325981601f6140a5565b613264906008613f31565b876132708360066140cc565b81518110613280576132806140b8565b016020015160f81c901b9190911790600101613245565b505f805b60088110156132f6576132af8160076140a5565b6132ba906008613f31565b6001600160401b0316886132cf8360266140cc565b815181106132df576132df6140b8565b016020015160f81c901b919091179060010161329b565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142b98339815191529060ff165f03613341575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061338990836140a5565b106133a5576001600160401b03841660408301528082526133c4565b83826040018181516133b791906141b2565b6001600160401b03169052505b5f8260200151836040015160646133db91906141ed565b6133e59190614218565b600285015490915060ff90811690821611156134605760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206142d98339815191528054600119016134d557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206142d983398151915255565b5f60608260800151516030146135585760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135cf5761358f8160016140a5565b61359a906008613f31565b5081515f908390839081106135b1576135b16140b8565b60200101906001600160f81b03191690815f1a90535060010161357b565b505f5b600481101561362d576135e68160036140a5565b6135f1906008613f31565b505f826135ff8360026140cc565b8151811061360f5761360f6140b8565b60200101906001600160f81b03191690815f1a9053506001016135d2565b505f5b602081101561368a578451816020811061364c5761364c6140b8565b1a60f81b8261365c8360066140cc565b8151811061366c5761366c6140b8565b60200101906001600160f81b03191690815f1a905350600101613630565b505f5b60208110156136ea57846020015181602081106136ac576136ac6140b8565b1a60f81b826136bc8360266140cc565b815181106136cc576136cc6140b8565b60200101906001600160f81b03191690815f1a90535060010161368d565b505f5b600881101561375e576137018160076140a5565b61370c906008613f31565b60ff1685604001516001600160401b0316901c60f81b8282604661373091906140cc565b81518110613740576137406140b8565b60200101906001600160f81b03191690815f1a9053506001016136ed565b505f5b60308110156137c95784608001518181518110613780576137806140b8565b01602001516001600160f81b0319168261379b83604e6140cc565b815181106137ab576137ab6140b8565b60200101906001600160f81b03191690815f1a905350600101613761565b505f5b600881101561383b576137e08160076140a5565b6137eb906008613f31565b60608601516001600160401b0390811691161c60f81b8261380d83607e6140cc565b8151811061381d5761381d6140b8565b60200101906001600160f81b03191690815f1a9053506001016137cc565b5060028160405161384c919061423d565b602060405180830381855afa158015613867573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061388a9190613dde565b94909350915050565b61389b61309d565b6138a361390f565b6138ab61391f565b61177881613927565b6138bc61309d565b5f5f80516020614279833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61391761309d565b6130e6613993565b6130e661309d565b61392f61309d565b80355f805160206142b983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139796060830160408401614258565b600291909101805460ff191660ff90921691909117905550565b6134db61309d565b5080546139a790613c55565b5f825580601f106139b6575050565b601f0160209004905f5260205f209081019061177891905b808211156139e1575f81556001016139ce565b5090565b5f60e082840312156139f5575f80fd5b50919050565b8015158114611778575f80fd5b803563ffffffff81168114613a1b575f80fd5b919050565b5f805f60608486031215613a32575f80fd5b833592506020840135613a44816139fb565b9150613a5260408501613a08565b90509250925092565b5f60208284031215613a6b575f80fd5b5035919050565b5f60208284031215613a82575f80fd5b61176082613a08565b5f8060408385031215613a9c575f80fd5b613aa583613a08565b946020939093013593505050565b80356001600160401b0381168114613a1b575f80fd5b5f60208284031215613ad9575f80fd5b61176082613ab3565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b1857613b18613ae2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b4657613b46613ae2565b604052919050565b5f6001600160401b03821115613b6657613b66613ae2565b50601f01601f191660200190565b5f805f60608486031215613b86575f80fd5b83359250613b9660208501613ab3565b915060408401356001600160401b03811115613bb0575f80fd5b8401601f81018613613bc0575f80fd5b8035613bd3613bce82613b4e565b613b1e565b818152876020838501011115613be7575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613c4e57613c4e613c1a565b5092915050565b600181811c90821680613c6957607f821691505b6020821081036139f557634e487b7160e01b5f52602260045260245ffd5b601f821115610ae357805f5260205f20601f840160051c81016020851015613cac5750805b601f840160051c820191505b818110156112e9575f8155600101613cb8565b81516001600160401b03811115613ce457613ce4613ae2565b613cf881613cf28454613c55565b84613c87565b602080601f831160018114613d2b575f8415613d145750858301515b5f19600386901b1c1916600185901b178555613d82565b5f85815260208120601f198616915b82811015613d5957888601518255948401946001909101908401613d3a565b5085821015613d7657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613da4578181015183820152602001613d8c565b50505f910152565b602081525f8251806020840152613dca816040850160208701613d8a565b601f01601f19169190910160400192915050565b5f60208284031215613dee575f80fd5b5051919050565b5f60208083525f8454613e0781613c55565b806020870152604060018084165f8114613e285760018114613e4457613e71565b60ff19851660408a0152604084151560051b8a01019550613e71565b895f5260205f205f5b85811015613e685781548b8201860152908301908801613e4d565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613ea157613ea1613e7f565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610af857610af8613c1a565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611778575f80fd5b8051613a1b816139fb565b5f8060408385031215613fbf575f80fd5b82516001600160401b0380821115613fd5575f80fd5b9084019060608287031215613fe8575f80fd5b613ff0613af6565b8251815260208084015161400381613f8f565b82820152604084015183811115614018575f80fd5b80850194505087601f85011261402c575f80fd5b8351925061403c613bce84613b4e565b838152888285870101111561404f575f80fd5b61405e84838301848801613d8a565b80604084015250819550614073818801613fa3565b9450505050509250929050565b5f6001600160401b0380831681810361409b5761409b613c1a565b6001019392505050565b81810381811115610af857610af8613c1a565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610af857610af8613c1a565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613c4e57613c4e613c1a565b5f602082840312156141e2575f80fd5b813561176081613f8f565b6001600160401b0381811683821602808216919082811461421057614210613c1a565b505092915050565b5f6001600160401b038084168061423157614231613e7f565b92169190910492915050565b5f825161424e818460208701613d8a565b9190910192915050565b5f60208284031215614268575f80fd5b813560ff81168114611760575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 18c958c60..3ec509845 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -30,8 +30,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager IRewardCalculator _rewardCalculator; /// @notice Maps the delegationID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; - /// @notice Maps the delegationID to pending register delegator messages. - mapping(bytes32 delegationID => bytes) _pendingRegisterDelegatorMessages; /// @notice Maps the delegationID to pending end delegator messages. mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; } @@ -168,10 +166,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _checkAndUpdateChurnTracker(weight); // Submit the message to the Warp precompile. - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); - $._pendingRegisterDelegatorMessages[delegationID] = setValidatorWeightPayload; - bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); + bytes32 messageID = WARP_MESSENGER.sendWarpMessage( + ValidatorMessages.packSetSubnetValidatorWeightMessage( + validationID, nonce, newValidatorWeight + ) + ); // Store the delegation information. Set the delegator status to pending added, // so that it can be properly started in the complete step, even if the delivered @@ -200,10 +199,25 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager } function resendDelegatorRegistration(bytes32 delegationID) external { - _checkPendingRegisterDelegatorMessages(delegationID); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + Delegator memory delegator = $._delegatorStakes[delegationID]; + require( + $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, + "PoSValidatorManager: delegation registration not pending" + ); + + Validator memory validator = _getValidator(delegator.validationID); + require( + validator.messageNonce != 0, + "PoSValidatorManager: could not find validator for delegation ID" + ); + // Submit the message to the Warp precompile. - WARP_MESSENGER.sendWarpMessage($._pendingRegisterDelegatorMessages[delegationID]); + WARP_MESSENGER.sendWarpMessage( + ValidatorMessages.packSetSubnetValidatorWeightMessage( + delegator.validationID, validator.messageNonce, validator.weight + ) + ); } function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external { @@ -213,8 +227,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce,) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - _checkPendingRegisterDelegatorMessages(delegationID); - delete $._pendingRegisterDelegatorMessages[delegationID]; Validator memory validator = _getValidator(validationID); @@ -361,13 +373,4 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: delegation removal not pending" ); } - - function _checkPendingRegisterDelegatorMessages(bytes32 delegationID) private view { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - require( - $._pendingRegisterDelegatorMessages[delegationID].length > 0 - && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, - "PoSValidatorManager: delegation registration not pending" - ); - } } From d54c724eec70a6747dc8e5dd52bd0c0a049b0bc8 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 6 Sep 2024 13:38:03 -0400 Subject: [PATCH 219/545] Remove pendingEndDelegatorMessages --- .../ERC20TokenStakingManager.go | 67 +++++++------------ .../NativeTokenStakingManager.go | 67 +++++++------------ contracts/staking/PoSValidatorManager.sol | 66 +++++++----------- .../interfaces/IPoSValidatorManager.sol | 13 +--- .../tests/PoSValidatorManagerTests.t.sol | 4 +- 5 files changed, 75 insertions(+), 142 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6a525ad8a..b4f86a79c 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161484438038061484483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146f78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613d6a565b6102d6565b005b610128610138366004613da5565b610761565b61017b61014b366004613da5565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613da5565b6108a1565b6101286101af366004613dd0565b610953565b6101c76101c2366004613da5565b610a37565b6040516001600160401b039091168152602001610185565b6101286101ed366004613e0d565b610a4d565b610128610200366004613e26565b610db6565b61017b610213366004613e64565b610f86565b6101c7610226366004613da5565b610f9f565b610128610239366004613da5565b610fb3565b61012861024c366004613d6a565b61123f565b61017b61025f366004613f0f565b61125a565b610128610272366004613e26565b61127f565b61017b610285366004613fab565b61141f565b610128610298366004613e0d565b611432565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613da5565b6115ef565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061464b8339815191529184156103285761032582856116be565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613fcb565b600481111561036b5761036b613fcb565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613fcb565b146104445760405162461bcd60e51b815260206004820152602a60248201525f8051602061466b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f8051602061466b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461195a565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500613fcb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856119ce565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190613ff3565b905061066a8682611adf565b5f610676878584611b27565b5f8c815260048a01602052604090209091506106928282614096565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614177565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906141a9565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181525f805160206146cb83398151915260205260409020545f8051602061468b8339815191529060039060ff1660058111156107a1576107a1613fcb565b146108065760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604081206003015461082e9084906001600160401b031683611b27565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061085b908490600401614177565b6020604051808303815f875af1158015610877573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061089b91906141a9565b50505050565b6108aa81611d44565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061464b833981519152916005600160991b019163ee5b48eb9161090e916004016141c0565b6020604051808303815f875af115801561092a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094e91906141a9565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061099c575080546001600160401b03808416911610155b156109ba5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109e58484611e17565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a4764e8d4a510008361425e565b92915050565b5f8051602061468b8339815191525f610a6583611e31565b90505f80610a768360400151612012565b915091508015610adb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610b0d57610b0d613fcb565b6005811115610b1e57610b1e613fcb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610ba557610ba5613fcb565b1480610bc35750600182516005811115610bc157610bc1613fcb565b145b610c225760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610c3757610c37613fcb565b03610c4457506004610c48565b5060055b6020808301515f90815260078801909152604081205581816005811115610c7157610c71613fcb565b90816005811115610c8457610c84613fcb565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610cb857610cb8613fcb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d8357610d83613fcb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f8051602061464b8339815191525f610dce84611e31565b90505f80610ddf83604001516121b3565b50915091505f610dee836119ce565b9050816001600160401b031681608001516001600160401b03161015610e265760405162461bcd60e51b815260040161043b90614271565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e6b5760405162461bcd60e51b815260040161043b906142b3565b60015f87815260038701602052604090205460ff166004811115610e9157610e91613fcb565b14610efa5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a476001600160401b03831664e8d4a510006142fc565b5f610fa9826119ce565b60a0015192915050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f8051602061464b83398151915293929190829060ff16600481111561101457611014613fcb565b600481111561102557611025613fcb565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091505f84815260038401602052604090205460ff1660048111156110bd576110bd613fcb565b1461111d5760405162461bcd60e51b815260206004820152603860248201525f8051602061466b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f61112b82604001516119ce565b905080608001516001600160401b03165f036111af5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161043b565b6005600160991b016001600160a01b031663ee5b48eb6111dc846040015184608001518560a00151611b27565b6040518263ffffffff1660e01b81526004016111f89190614177565b6020604051808303815f875af1158015611214573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123891906141a9565b5050505050565b81156112515761124f83826116be565b505b61094e836123ee565b5f806112658661278c565b905061127385828686612839565b9150505b949350505050565b5f8051602061464b8339815191525f61129784611e31565b90505f806112a883604001516121b3565b50915091506112b685611d44565b5f85815260048501602052604081206112ce91613cfb565b5f6112d8836119ce565b9050816001600160401b031681608001516001600160401b031610156113105760405162461bcd60e51b815260040161043b90614271565b5f8681526003808701602052604090912001546001600160401b038084169116111561134e5760405162461bcd60e51b815260040161043b906142b3565b60035f87815260038701602052604090205460ff16600481111561137457611374613fcb565b146113c85760405162461bcd60e51b815260206004820152603160248201525f8051602061466b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61142b833384612c8e565b9392505050565b5f8051602061468b8339815191525f61144a83611e31565b90505f8061145b8360400151612012565b91509150806114bd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f828152600585016020526040812080546114d79061401a565b9050118015611509575060015f83815260068601602052604090205460ff16600581111561150757611507613fcb565b145b6115255760405162461bcd60e51b815260040161043b90614313565b5f828152600585016020526040812061153d91613cfb565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061468b8339815191529291906116379061401a565b9050118015611669575060015f83815260068301602052604090205460ff16600581111561166757611667613fcb565b145b6116855760405162461bcd60e51b815260040161043b90614313565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161090e91906004016141c0565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611709573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117309190810190614365565b91509150806117935760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117fa91906141a9565b82511461185e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156118d45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806118e38460400151613000565b915091508187146119505760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206146cb8339815191526020526040812060030180545f8051602061468b833981519152916001600160401b039091169081908461199f83614437565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f805160206146cb83398151915290528390208351918201909352825491925f8051602061468b83398151915292829060ff166005811115611a5657611a56613fcb565b6005811115611a6757611a67613fcb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206146cb833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ba057611b6081600161445c565b611b6b9060086142fc565b5081515f90839083908110611b8257611b8261446f565b60200101906001600160f81b03191690815f1a905350600101611b4c565b505f5b6004811015611c0357611bb781600361445c565b611bc29060086142fc565b6001901c60f81b82611bd5836002614483565b81518110611be557611be561446f565b60200101906001600160f81b03191690815f1a905350600101611ba3565b505f5b6020811015611c6557611c1a81601f61445c565b611c259060086142fc565b86901c60f81b82611c37836006614483565b81518110611c4757611c4761446f565b60200101906001600160f81b03191690815f1a905350600101611c06565b505f5b6008811015611cd057611c7c81600761445c565b611c879060086142fc565b6001600160401b038616901c60f81b82611ca2836026614483565b81518110611cb257611cb261446f565b60200101906001600160f81b03191690815f1a905350600101611c68565b505f5b6008811015611d3b57611ce781600761445c565b611cf29060086142fc565b6001600160401b038516901c60f81b82611d0d83602e614483565b81518110611d1d57611d1d61446f565b60200101906001600160f81b03191690815f1a905350600101611cd3565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061464b833981519152929190611d8c9061401a565b9050118015611dbe575060035f83815260038301602052604090205460ff166004811115611dbc57611dbc613fcb565b145b611e135760405162461bcd60e51b815260206004820152603360248201525f8051602061466b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b611e1f6131d8565b611e2882613223565b611e1381613269565b60408051606080820183525f8083526020830181905292820152905f8051602061468b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ea6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ecd9190810190614365565b9150915080611f345760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611f975760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b03161561200a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f8082516027146120355760405162461bcd60e51b815260040161043b90614496565b5f805b60028110156120845761204c81600161445c565b6120579060086142fc565b61ffff1685828151811061206d5761206d61446f565b016020015160f81c901b9190911790600101612038565b5061ffff8116156120a75760405162461bcd60e51b815260040161043b906144df565b5f805b6004811015612102576120be81600361445c565b6120c99060086142fc565b63ffffffff16866120db836002614483565b815181106120eb576120eb61446f565b016020015160f81c901b91909117906001016120aa565b5063ffffffff81166002146121295760405162461bcd60e51b815260040161043b90614522565b5f805b602081101561217e5761214081601f61445c565b61214b9060086142fc565b87612157836006614483565b815181106121675761216761446f565b016020015160f81c901b919091179060010161212c565b505f866026815181106121935761219361446f565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146121d75760405162461bcd60e51b815260040161043b90614496565b5f805b6002811015612226576121ee81600161445c565b6121f99060086142fc565b61ffff1686828151811061220f5761220f61446f565b016020015160f81c901b91909117906001016121da565b5061ffff8116156122495760405162461bcd60e51b815260040161043b906144df565b5f805b60048110156122a45761226081600361445c565b61226b9060086142fc565b63ffffffff168761227d836002614483565b8151811061228d5761228d61446f565b016020015160f81c901b919091179060010161224c565b5063ffffffff81166003146122cb5760405162461bcd60e51b815260040161043b90614522565b5f805b6020811015612320576122e281601f61445c565b6122ed9060086142fc565b886122f9836006614483565b815181106123095761230961446f565b016020015160f81c901b91909117906001016122ce565b505f805b600881101561237f5761233881600761445c565b6123439060086142fc565b6001600160401b031689612358836026614483565b815181106123685761236861446f565b016020015160f81c901b9190911790600101612324565b505f805b60088110156123de5761239781600761445c565b6123a29060086142fc565b6001600160401b03168a6123b783602e614483565b815181106123c7576123c761446f565b016020015160f81c901b9190911790600101612383565b5091989097509095509350505050565b5f8181525f805160206146cb83398151915260205260408082208151610100810190925280545f8051602061468b83398151915293929190829060ff16600581111561243c5761243c613fcb565b600581111561244d5761244d613fcb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124d5576124d5613fcb565b146125315760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146125ab5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6125b88160a0015161331d565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156125fc576125fc613fcb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126c8846126c28161195a565b5f611b27565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126f7908590600401614177565b6020604051808303815f875af1158015612713573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061273791906141a9565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061464b833981519152816127a5846134be565b90505f6127b182610a37565b83549091506001600160401b038216108015906127db57508260010154816001600160401b031611155b6112775760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f6128426134f4565b5f8051602061468b833981519152426001600160401b03851611801561287c57506001600160401b03841661287a426202a300614483565b115b6128de5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b856129355760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600782016020526040902054156129a35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612a0a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b612a138561331d565b5f80612a5a6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061352b565b5f82815260058601602052604090209193509150612a788282614096565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612aa5908590600401614177565b6020604051808303815f875af1158015612ac1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ae591906141a9565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612b6757612b67613fcb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612c288361195a565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061127760015f805160206146ab83398151915255565b5f612c976134f4565b5f612ca46101c2846134be565b90505f8051602061464b8339815191525f612cbe876119ce565b9050600281516005811115612cd557612cd5613fcb565b14612d345760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612d459190614569565b9050612d518882611adf565b5f612d5b8961195a565b90505f898983604051602001612da39392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612dc48661331d565b5f6005600160991b0163ee5b48eb612ddd8d8688611b27565b6040518263ffffffff1660e01b8152600401612df99190614177565b6020604051808303815f875af1158015612e15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e3991906141a9565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff19166001836004811115612ec157612ec1613fcb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061142b60015f805160206146ab83398151915255565b5f808251602e146130235760405162461bcd60e51b815260040161043b90614496565b5f805b60028110156130725761303a81600161445c565b6130459060086142fc565b61ffff1685828151811061305b5761305b61446f565b016020015160f81c901b9190911790600101613026565b5061ffff8116156130955760405162461bcd60e51b815260040161043b906144df565b5f805b60048110156130f0576130ac81600361445c565b6130b79060086142fc565b63ffffffff16866130c9836002614483565b815181106130d9576130d961446f565b016020015160f81c901b9190911790600101613098565b5063ffffffff81166004146131175760405162461bcd60e51b815260040161043b90614522565b5f805b602081101561316c5761312e81601f61445c565b6131399060086142fc565b87613145836006614483565b815181106131555761315561446f565b016020015160f81c901b919091179060010161311a565b505f805b60088110156131cb5761318481600761445c565b61318f9060086142fc565b6001600160401b0316886131a4836026614483565b815181106131b4576131b461446f565b016020015160f81c901b9190911790600101613170565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661322157604051631afcd79f60e31b815260040160405180910390fd5b565b61322b6131d8565b613234816138e3565b6132666060820135608083013561325160c0850160a08601613e64565b61326160e0860160c08701614589565b613904565b50565b6132716131d8565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132fd5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061468b8339815191529060ff165f0361335b575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133a3908361445c565b106133bf576001600160401b03841660408301528082526133de565b83826040018181516133d19190614569565b6001600160401b03169052505b5f8260200151836040015160646133f591906145a4565b6133ff91906145cf565b600285015490915060ff908116908216111561347a5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a47827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061395f565b5f805160206146ab83398151915280546001190161352557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135955760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561360c576135cc81600161445c565b6135d79060086142fc565b5081515f908390839081106135ee576135ee61446f565b60200101906001600160f81b03191690815f1a9053506001016135b8565b505f5b600481101561366a5761362381600361445c565b61362e9060086142fc565b505f8261363c836002614483565b8151811061364c5761364c61446f565b60200101906001600160f81b03191690815f1a90535060010161360f565b505f5b60208110156136c757845181602081106136895761368961446f565b1a60f81b82613699836006614483565b815181106136a9576136a961446f565b60200101906001600160f81b03191690815f1a90535060010161366d565b505f5b602081101561372757846020015181602081106136e9576136e961446f565b1a60f81b826136f9836026614483565b815181106137095761370961446f565b60200101906001600160f81b03191690815f1a9053506001016136ca565b505f5b600881101561379b5761373e81600761445c565b6137499060086142fc565b60ff1685604001516001600160401b0316901c60f81b8282604661376d9190614483565b8151811061377d5761377d61446f565b60200101906001600160f81b03191690815f1a90535060010161372a565b505f5b603081101561380657846080015181815181106137bd576137bd61446f565b01602001516001600160f81b031916826137d883604e614483565b815181106137e8576137e861446f565b60200101906001600160f81b03191690815f1a90535060010161379e565b505f5b60088110156138785761381d81600761445c565b6138289060086142fc565b60608601516001600160401b0390811691161c60f81b8261384a83607e614483565b8151811061385a5761385a61446f565b60200101906001600160f81b03191690815f1a905350600101613809565b5060028160405161388991906145f4565b602060405180830381855afa1580156138a4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138c791906141a9565b94909350915050565b60015f805160206146ab83398151915255565b6138eb6131d8565b6138f3613ac1565b6138fb613ad1565b61326681613ad9565b61390c6131d8565b5f5f8051602061464b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139c991906141a9565b90506139e06001600160a01b038516333086613b45565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a4891906141a9565b9050818111613aae5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613ab8828261445c565b95945050505050565b613ac96131d8565b613221613b9f565b6132216131d8565b613ae16131d8565b80355f8051602061468b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b2b606083016040840161460f565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261089b908590613ba7565b6138d06131d8565b5f613bbb6001600160a01b03841683613c08565b905080515f14158015613bdf575080806020019051810190613bdd919061462f565b155b1561094e57604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b606061142b83835f845f80856001600160a01b03168486604051613c2c91906145f4565b5f6040518083038185875af1925050503d805f8114613c66576040519150601f19603f3d011682016040523d82523d5f602084013e613c6b565b606091505b5091509150611950868383606082613c8b57613c8682613cd2565b61142b565b8151158015613ca257506001600160a01b0384163b155b15613ccb57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b508061142b565b805115613ce25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d079061401a565b5f825580601f10613d16575050565b601f0160209004905f5260205f209081019061326691905b80821115613d41575f8155600101613d2e565b5090565b8015158114613266575f80fd5b803563ffffffff81168114613d65575f80fd5b919050565b5f805f60608486031215613d7c575f80fd5b833592506020840135613d8e81613d45565b9150613d9c60408501613d52565b90509250925092565b5f60208284031215613db5575f80fd5b5035919050565b6001600160a01b0381168114613266575f80fd5b5f80828403610100811215613de3575f80fd5b60e0811215613df0575f80fd5b5082915060e0830135613e0281613dbc565b809150509250929050565b5f60208284031215613e1d575f80fd5b61142b82613d52565b5f8060408385031215613e37575f80fd5b613e4083613d52565b946020939093013593505050565b80356001600160401b0381168114613d65575f80fd5b5f60208284031215613e74575f80fd5b61142b82613e4e565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613eb357613eb3613e7d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613ee157613ee1613e7d565b604052919050565b5f6001600160401b03821115613f0157613f01613e7d565b50601f01601f191660200190565b5f805f8060808587031215613f22575f80fd5b8435935060208501359250613f3960408601613e4e565b915060608501356001600160401b03811115613f53575f80fd5b8501601f81018713613f63575f80fd5b8035613f76613f7182613ee9565b613eb9565b818152886020838501011115613f8a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613fbc575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561401357614013613fdf565b5092915050565b600181811c9082168061402e57607f821691505b60208210810361404c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561094e57805f5260205f20601f840160051c810160208510156140775750805b601f840160051c820191505b81811015611238575f8155600101614083565b81516001600160401b038111156140af576140af613e7d565b6140c3816140bd845461401a565b84614052565b602080601f8311600181146140f6575f84156140df5750858301515b5f19600386901b1c1916600185901b17855561414d565b5f85815260208120601f198616915b8281101561412457888601518255948401946001909101908401614105565b508582101561414157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561416f578181015183820152602001614157565b50505f910152565b602081525f8251806020840152614195816040850160208701614155565b601f01601f19169190910160400192915050565b5f602082840312156141b9575f80fd5b5051919050565b5f60208083525f84546141d28161401a565b806020870152604060018084165f81146141f3576001811461420f5761423c565b60ff19851660408a0152604084151560051b8a0101955061423c565b895f5260205f205f5b858110156142335781548b8201860152908301908801614218565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261426c5761426c61424a565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a4757610a47613fdf565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613d6581613d45565b5f8060408385031215614376575f80fd5b82516001600160401b038082111561438c575f80fd5b908401906060828703121561439f575f80fd5b6143a7613e91565b825181526020808401516143ba81613dbc565b828201526040840151838111156143cf575f80fd5b80850194505087601f8501126143e3575f80fd5b835192506143f3613f7184613ee9565b8381528882858701011115614406575f80fd5b61441584838301848801614155565b8060408401525081955061442a81880161435a565b9450505050509250929050565b5f6001600160401b0380831681810361445257614452613fdf565b6001019392505050565b81810381811115610a4757610a47613fdf565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a4757610a47613fdf565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561401357614013613fdf565b5f60208284031215614599575f80fd5b813561142b81613dbc565b6001600160401b038181168382160280821691908281146145c7576145c7613fdf565b505092915050565b5f6001600160401b03808416806145e8576145e861424a565b92169190910492915050565b5f8251614605818460208701614155565b9190910192915050565b5f6020828403121561461f575f80fd5b813560ff8116811461142b575f80fd5b5f6020828403121561463f575f80fd5b815161142b81613d4556fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516146a83803806146a883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61455b8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610246578063a3a65e4814610259578063b771b3bc1461026c578063ba3a4b9714610292578063bee0a03f146102a5575f80fd5b806366435abf146101fa57806376f786211461020d578063872fda641461022057806398f3e2b414610233575f80fd5b80632e2194d8116100d95780632e2194d814610196578063467ef06f146101c15780635297fae6146101d457806362065856146101e7575f80fd5b80630118acc41461010a5780630322ed981461011f5780630cdd09851461013257806327f39ca814610183575b5f80fd5b61011d610118366004613bce565b6102b8565b005b61011d61012d366004613c09565b610722565b610170610140366004613c09565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61011d610191366004613c34565b610862565b6101a96101a4366004613c09565b610946565b6040516001600160401b03909116815260200161017a565b61011d6101cf366004613c71565b61095c565b61011d6101e2366004613c8a565b610cc5565b6101706101f5366004613cc8565b610e95565b6101a9610208366004613c09565b610eae565b61011d61021b366004613bce565b610ec2565b61017061022e366004613d73565b610ee2565b61011d610241366004613c8a565b610f07565b610170610254366004613e0f565b611086565b61011d610267366004613c71565b611099565b61027a6005600160991b0181565b6040516001600160a01b03909116815260200161017a565b61011d6102a0366004613c09565b611256565b61011d6102b3366004613c09565b6114e2565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206144af83398151915291841561030a5761030782856115f1565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561033c5761033c613e2f565b600481111561034d5761034d613e2f565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103d4576103d4613e2f565b146104265760405162461bcd60e51b815260206004820152602a60248201525f805160206144cf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461048b5760405162461bcd60e51b815260206004820152603360248201525f805160206144cf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161041d565b5f6104958461188d565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104e2576104e2613e2f565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105b485611901565b905082606001516001600160401b03168160a001516001600160401b03161161062b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161041d565b5f83606001518260a001516106409190613e57565b905061064c8682611a12565b5f6005600160991b0163ee5b48eb610665898786611a5a565b6040518263ffffffff1660e01b81526004016106819190613ea0565b6020604051808303815f875af115801561069d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c19190613ed2565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061452f83398151915260205260409020545f805160206144ef8339815191529060039060ff16600581111561076257610762613e2f565b146107c75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161041d565b5f8281526006820160205260408120600301546107ef9084906001600160401b031683611a5a565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061081c908490600401613ea0565b6020604051808303815f875af1158015610838573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085c9190613ed2565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806108ab575080546001600160401b03808416911610155b156108c95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556108f48484611c77565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f61095664e8d4a5100083613efd565b92915050565b5f805160206144ef8339815191525f61097483611c95565b90505f806109858360400151611e76565b9150915080156109ea5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161041d565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610a1c57610a1c613e2f565b6005811115610a2d57610a2d613e2f565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610ab457610ab4613e2f565b1480610ad25750600182516005811115610ad057610ad0613e2f565b145b610b315760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161041d565b600382516005811115610b4657610b46613e2f565b03610b5357506004610b57565b5060055b6020808301515f90815260078801909152604081205581816005811115610b8057610b80613e2f565b90816005811115610b9357610b93613e2f565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610bc757610bc7613e2f565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610c9257610c92613e2f565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206144af8339815191525f610cdd84611c95565b90505f80610cee8360400151612017565b50915091505f610cfd83611901565b9050816001600160401b031681608001516001600160401b03161015610d355760405162461bcd60e51b815260040161041d90613f10565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610d7a5760405162461bcd60e51b815260040161041d90613f52565b60015f87815260038701602052604090205460ff166004811115610da057610da0613e2f565b14610e095760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161041d565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109566001600160401b03831664e8d4a51000613f9b565b5f610eb882611901565b60a0015192915050565b8115610ed457610ed283826115f1565b505b610edd83612252565b505050565b5f80610eed866125f0565b9050610efb8582868661269d565b9150505b949350505050565b5f805160206144af8339815191525f610f1f84611c95565b90505f80610f308360400151612017565b50915091505f610f3f83611901565b9050816001600160401b031681608001516001600160401b03161015610f775760405162461bcd60e51b815260040161041d90613f10565b5f8681526003808701602052604090912001546001600160401b0380841691161115610fb55760405162461bcd60e51b815260040161041d90613f52565b60035f87815260038701602052604090205460ff166004811115610fdb57610fdb613e2f565b1461102f5760405162461bcd60e51b815260206004820152603160248201525f805160206144cf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161041d565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611092833384612af2565b9392505050565b5f805160206144ef8339815191525f6110b183611c95565b90505f806110c28360400151611e76565b91509150806111245760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161041d565b5f8281526005850160205260408120805461113e90613fb2565b9050118015611170575060015f83815260068601602052604090205460ff16600581111561116e5761116e613e2f565b145b61118c5760405162461bcd60e51b815260040161041d90613fea565b5f82815260058501602052604081206111a491613b5f565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f805160206144af83398151915293929190829060ff1660048111156112b7576112b7613e2f565b60048111156112c8576112c8613e2f565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091505f84815260038401602052604090205460ff16600481111561136057611360613e2f565b146113c05760405162461bcd60e51b815260206004820152603860248201525f805160206144cf83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161041d565b5f6113ce8260400151611901565b905080608001516001600160401b03165f036114525760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb61147f846040015184608001518560a00151611a5a565b6040518263ffffffff1660e01b815260040161149b9190613ea0565b6020604051808303815f875af11580156114b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114db9190613ed2565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206144ef83398151915292919061152a90613fb2565b905011801561155c575060015f83815260068301602052604090205460ff16600581111561155a5761155a613e2f565b145b6115785760405162461bcd60e51b815260040161041d90613fea565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916115b19190600401614031565b6020604051808303815f875af11580156115cd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edd9190613ed2565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561163c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261166391908101906140c6565b91509150806116c65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161041d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611709573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172d9190613ed2565b8251146117915760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161041d565b60208201516001600160a01b0316156118075760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161041d565b5f806118168460400151612e64565b915091508187146118835760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161041d565b9695505050505050565b5f8181525f8051602061452f8339815191526020526040812060030180545f805160206144ef833981519152916001600160401b03909116908190846118d283614198565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061452f83398151915290528390208351918201909352825491925f805160206144ef83398151915292829060ff16600581111561198957611989613e2f565b600581111561199a5761199a613e2f565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061452f833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ad357611a938160016141bd565b611a9e906008613f9b565b5081515f90839083908110611ab557611ab56141d0565b60200101906001600160f81b03191690815f1a905350600101611a7f565b505f5b6004811015611b3657611aea8160036141bd565b611af5906008613f9b565b6001901c60f81b82611b088360026141e4565b81518110611b1857611b186141d0565b60200101906001600160f81b03191690815f1a905350600101611ad6565b505f5b6020811015611b9857611b4d81601f6141bd565b611b58906008613f9b565b86901c60f81b82611b6a8360066141e4565b81518110611b7a57611b7a6141d0565b60200101906001600160f81b03191690815f1a905350600101611b39565b505f5b6008811015611c0357611baf8160076141bd565b611bba906008613f9b565b6001600160401b038616901c60f81b82611bd58360266141e4565b81518110611be557611be56141d0565b60200101906001600160f81b03191690815f1a905350600101611b9b565b505f5b6008811015611c6e57611c1a8160076141bd565b611c25906008613f9b565b6001600160401b038516901c60f81b82611c4083602e6141e4565b81518110611c5057611c506141d0565b60200101906001600160f81b03191690815f1a905350600101611c06565b50949350505050565b611c7f61303c565b611c8882613087565b611c91816130cd565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206144ef8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d0a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d3191908101906140c6565b9150915080611d985760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161041d565b8254825114611dfb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161041d565b60208201516001600160a01b031615611e6e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161041d565b509392505050565b5f808251602714611e995760405162461bcd60e51b815260040161041d906141f7565b5f805b6002811015611ee857611eb08160016141bd565b611ebb906008613f9b565b61ffff16858281518110611ed157611ed16141d0565b016020015160f81c901b9190911790600101611e9c565b5061ffff811615611f0b5760405162461bcd60e51b815260040161041d90614240565b5f805b6004811015611f6657611f228160036141bd565b611f2d906008613f9b565b63ffffffff1686611f3f8360026141e4565b81518110611f4f57611f4f6141d0565b016020015160f81c901b9190911790600101611f0e565b5063ffffffff8116600214611f8d5760405162461bcd60e51b815260040161041d90614283565b5f805b6020811015611fe257611fa481601f6141bd565b611faf906008613f9b565b87611fbb8360066141e4565b81518110611fcb57611fcb6141d0565b016020015160f81c901b9190911790600101611f90565b505f86602681518110611ff757611ff76141d0565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461203b5760405162461bcd60e51b815260040161041d906141f7565b5f805b600281101561208a576120528160016141bd565b61205d906008613f9b565b61ffff16868281518110612073576120736141d0565b016020015160f81c901b919091179060010161203e565b5061ffff8116156120ad5760405162461bcd60e51b815260040161041d90614240565b5f805b6004811015612108576120c48160036141bd565b6120cf906008613f9b565b63ffffffff16876120e18360026141e4565b815181106120f1576120f16141d0565b016020015160f81c901b91909117906001016120b0565b5063ffffffff811660031461212f5760405162461bcd60e51b815260040161041d90614283565b5f805b60208110156121845761214681601f6141bd565b612151906008613f9b565b8861215d8360066141e4565b8151811061216d5761216d6141d0565b016020015160f81c901b9190911790600101612132565b505f805b60088110156121e35761219c8160076141bd565b6121a7906008613f9b565b6001600160401b0316896121bc8360266141e4565b815181106121cc576121cc6141d0565b016020015160f81c901b9190911790600101612188565b505f805b6008811015612242576121fb8160076141bd565b612206906008613f9b565b6001600160401b03168a61221b83602e6141e4565b8151811061222b5761222b6141d0565b016020015160f81c901b91909117906001016121e7565b5091989097509095509350505050565b5f8181525f8051602061452f83398151915260205260408082208151610100810190925280545f805160206144ef83398151915293929190829060ff1660058111156122a0576122a0613e2f565b60058111156122b1576122b1613e2f565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561233957612339613e2f565b146123955760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161041d565b60408101516001600160a01b0316336001600160a01b03161461240f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161041d565b61241c8160a00151613181565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561246057612460613e2f565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61252c846125268161188d565b5f611a5a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061255b908590600401613ea0565b6020604051808303815f875af1158015612577573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061259b9190613ed2565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206144af8339815191528161260984613322565b90505f61261582610946565b83549091506001600160401b0382161080159061263f57508260010154816001600160401b031611155b610eff5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161041d565b5f6126a6613358565b5f805160206144ef833981519152426001600160401b0385161180156126e057506001600160401b0384166126de426202a3006141e4565b115b6127425760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161041d565b856127995760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161041d565b5f868152600782016020526040902054156128075760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161041d565b825160301461286e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161041d565b61287785613181565b5f806128be6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061338f565b5f828152600586016020526040902091935091506128dc828261430e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612909908590600401613ea0565b6020604051808303815f875af1158015612925573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129499190613ed2565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156129cb576129cb613e2f565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612a8c8361188d565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610eff60015f8051602061450f83398151915255565b5f612afb613358565b5f612b086101a484613322565b90505f805160206144af8339815191525f612b2287611901565b9050600281516005811115612b3957612b39613e2f565b14612b985760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161041d565b5f838260a00151612ba991906143cd565b9050612bb58882611a12565b5f612bbf8961188d565b90505f898983604051602001612c079392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612c2886613181565b5f6005600160991b0163ee5b48eb612c418d8688611a5a565b6040518263ffffffff1660e01b8152600401612c5d9190613ea0565b6020604051808303815f875af1158015612c79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c9d9190613ed2565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff19166001836004811115612d2557612d25613e2f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061109260015f8051602061450f83398151915255565b5f808251602e14612e875760405162461bcd60e51b815260040161041d906141f7565b5f805b6002811015612ed657612e9e8160016141bd565b612ea9906008613f9b565b61ffff16858281518110612ebf57612ebf6141d0565b016020015160f81c901b9190911790600101612e8a565b5061ffff811615612ef95760405162461bcd60e51b815260040161041d90614240565b5f805b6004811015612f5457612f108160036141bd565b612f1b906008613f9b565b63ffffffff1686612f2d8360026141e4565b81518110612f3d57612f3d6141d0565b016020015160f81c901b9190911790600101612efc565b5063ffffffff8116600414612f7b5760405162461bcd60e51b815260040161041d90614283565b5f805b6020811015612fd057612f9281601f6141bd565b612f9d906008613f9b565b87612fa98360066141e4565b81518110612fb957612fb96141d0565b016020015160f81c901b9190911790600101612f7e565b505f805b600881101561302f57612fe88160076141bd565b612ff3906008613f9b565b6001600160401b0316886130088360266141e4565b81518110613018576130186141d0565b016020015160f81c901b9190911790600101612fd4565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661308557604051631afcd79f60e31b815260040160405180910390fd5b565b61308f61303c565b61309881613747565b6130ca606082013560808301356130b560c0850160a08601613cc8565b6130c560e0860160c087016143ed565b613768565b50565b6130d561303c565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131615760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161041d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206144ef8339815191529060ff165f036131bf575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061320790836141bd565b10613223576001600160401b0384166040830152808252613242565b838260400181815161323591906143cd565b6001600160401b03169052505b5f8260200151836040015160646132599190614408565b6132639190614433565b600285015490915060ff90811690821611156132de5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161041d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610956827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906137c3565b5f8051602061450f83398151915280546001190161338957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146133f95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161041d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613470576134308160016141bd565b61343b906008613f9b565b5081515f90839083908110613452576134526141d0565b60200101906001600160f81b03191690815f1a90535060010161341c565b505f5b60048110156134ce576134878160036141bd565b613492906008613f9b565b505f826134a08360026141e4565b815181106134b0576134b06141d0565b60200101906001600160f81b03191690815f1a905350600101613473565b505f5b602081101561352b57845181602081106134ed576134ed6141d0565b1a60f81b826134fd8360066141e4565b8151811061350d5761350d6141d0565b60200101906001600160f81b03191690815f1a9053506001016134d1565b505f5b602081101561358b578460200151816020811061354d5761354d6141d0565b1a60f81b8261355d8360266141e4565b8151811061356d5761356d6141d0565b60200101906001600160f81b03191690815f1a90535060010161352e565b505f5b60088110156135ff576135a28160076141bd565b6135ad906008613f9b565b60ff1685604001516001600160401b0316901c60f81b828260466135d191906141e4565b815181106135e1576135e16141d0565b60200101906001600160f81b03191690815f1a90535060010161358e565b505f5b603081101561366a5784608001518181518110613621576136216141d0565b01602001516001600160f81b0319168261363c83604e6141e4565b8151811061364c5761364c6141d0565b60200101906001600160f81b03191690815f1a905350600101613602565b505f5b60088110156136dc576136818160076141bd565b61368c906008613f9b565b60608601516001600160401b0390811691161c60f81b826136ae83607e6141e4565b815181106136be576136be6141d0565b60200101906001600160f81b03191690815f1a90535060010161366d565b506002816040516136ed9190614458565b602060405180830381855afa158015613708573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061372b9190613ed2565b94909350915050565b60015f8051602061450f83398151915255565b61374f61303c565b613757613925565b61375f613935565b6130ca8161393d565b61377061303c565b5f5f805160206144af833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613809573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061382d9190613ed2565b90506138446001600160a01b0385163330866139a9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613888573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138ac9190613ed2565b90508181116139125760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161041d565b61391c82826141bd565b95945050505050565b61392d61303c565b613085613a03565b61308561303c565b61394561303c565b80355f805160206144ef83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561398f6060830160408401614473565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261085c908590613a0b565b61373461303c565b5f613a1f6001600160a01b03841683613a6c565b905080515f14158015613a43575080806020019051810190613a419190614493565b155b15610edd57604051635274afe760e01b81526001600160a01b038416600482015260240161041d565b606061109283835f845f80856001600160a01b03168486604051613a909190614458565b5f6040518083038185875af1925050503d805f8114613aca576040519150601f19603f3d011682016040523d82523d5f602084013e613acf565b606091505b5091509150611883868383606082613aef57613aea82613b36565b611092565b8151158015613b0657506001600160a01b0384163b155b15613b2f57604051639996b31560e01b81526001600160a01b038516600482015260240161041d565b5080611092565b805115613b465780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613b6b90613fb2565b5f825580601f10613b7a575050565b601f0160209004905f5260205f20908101906130ca91905b80821115613ba5575f8155600101613b92565b5090565b80151581146130ca575f80fd5b803563ffffffff81168114613bc9575f80fd5b919050565b5f805f60608486031215613be0575f80fd5b833592506020840135613bf281613ba9565b9150613c0060408501613bb6565b90509250925092565b5f60208284031215613c19575f80fd5b5035919050565b6001600160a01b03811681146130ca575f80fd5b5f80828403610100811215613c47575f80fd5b60e0811215613c54575f80fd5b5082915060e0830135613c6681613c20565b809150509250929050565b5f60208284031215613c81575f80fd5b61109282613bb6565b5f8060408385031215613c9b575f80fd5b613ca483613bb6565b946020939093013593505050565b80356001600160401b0381168114613bc9575f80fd5b5f60208284031215613cd8575f80fd5b61109282613cb2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d1757613d17613ce1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d4557613d45613ce1565b604052919050565b5f6001600160401b03821115613d6557613d65613ce1565b50601f01601f191660200190565b5f805f8060808587031215613d86575f80fd5b8435935060208501359250613d9d60408601613cb2565b915060608501356001600160401b03811115613db7575f80fd5b8501601f81018713613dc7575f80fd5b8035613dda613dd582613d4d565b613d1d565b818152886020838501011115613dee575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613e20575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e7757613e77613e43565b5092915050565b5f5b83811015613e98578181015183820152602001613e80565b50505f910152565b602081525f8251806020840152613ebe816040850160208701613e7e565b601f01601f19169190910160400192915050565b5f60208284031215613ee2575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613f0b57613f0b613ee9565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761095657610956613e43565b600181811c90821680613fc657607f821691505b602082108103613fe457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461404381613fb2565b806020870152604060018084165f81146140645760018114614080576140ad565b60ff19851660408a0152604084151560051b8a010195506140ad565b895f5260205f205f5b858110156140a45781548b8201860152908301908801614089565b8a016040019650505b509398975050505050505050565b8051613bc981613ba9565b5f80604083850312156140d7575f80fd5b82516001600160401b03808211156140ed575f80fd5b9084019060608287031215614100575f80fd5b614108613cf5565b8251815260208084015161411b81613c20565b82820152604084015183811115614130575f80fd5b80850194505087601f850112614144575f80fd5b83519250614154613dd584613d4d565b8381528882858701011115614167575f80fd5b61417684838301848801613e7e565b8060408401525081955061418b8188016140bb565b9450505050509250929050565b5f6001600160401b038083168181036141b3576141b3613e43565b6001019392505050565b8181038181111561095657610956613e43565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561095657610956613e43565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610edd57805f5260205f20601f840160051c810160208510156142ef5750805b601f840160051c820191505b818110156114db575f81556001016142fb565b81516001600160401b0381111561432757614327613ce1565b61433b816143358454613fb2565b846142ca565b602080601f83116001811461436e575f84156143575750858301515b5f19600386901b1c1916600185901b1785556143c5565b5f85815260208120601f198616915b8281101561439c5788860151825594840194600190910190840161437d565b50858210156143b957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115613e7757613e77613e43565b5f602082840312156143fd575f80fd5b813561109281613c20565b6001600160401b0381811683821602808216919082811461442b5761442b613e43565b505092915050565b5f6001600160401b038084168061444c5761444c613ee9565b92169190910492915050565b5f8251614469818460208701613e7e565b9190910192915050565b5f60208284031215614483575f80fd5b813560ff81168114611092575f80fd5b5f602082840312156144a3575f80fd5b815161109281613ba956fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -562,48 +562,6 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, blsPublicKey) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. -// -// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendDelegatorRegistration(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "resendDelegatorRegistration", delegationID) -} - -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. -// -// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendDelegatorRegistration(delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, delegationID) -} - -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. -// -// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendDelegatorRegistration(delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, delegationID) -} - -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. -// -// Solidity: function resendEndDelegation(bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendEndDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "resendEndDelegation", delegationID) -} - -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. -// -// Solidity: function resendEndDelegation(bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendEndDelegation(delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) -} - -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. -// -// Solidity: function resendEndDelegation(bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendEndDelegation(delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) -} - // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. // // Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() @@ -646,6 +604,27 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Rese return _ERC20TokenStakingManager.Contract.ResendRegisterValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) } +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendUpdateDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "resendUpdateDelegation", delegationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendUpdateDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendUpdateDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) +} + // ERC20TokenStakingManagerDelegationEndedIterator is returned from FilterDelegationEnded and is used to iterate over the raw logs and unpacked data for DelegationEnded events raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegationEndedIterator struct { Event *ERC20TokenStakingManagerDelegationEnded // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 18e4b0941..dc3b2a3e6 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -47,8 +47,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161447238038061447283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143258061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b506101276101223660046139e5565b610389565b005b348015610134575f80fd5b50610127610143366004613a20565b61046b565b348015610153575f80fd5b50610127610162366004613a5b565b6108f6565b348015610172575f80fd5b506101b1610181366004613a5b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613a5b565b610a36565b3480156101ee575f80fd5b506102026101fd366004613a5b565b610ae8565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613a72565b610afe565b348015610244575f80fd5b50610127610253366004613a8b565b610e67565b348015610263575f80fd5b506101b1610272366004613ac9565b611037565b348015610282575f80fd5b50610202610291366004613a5b565b611050565b3480156102a1575f80fd5b506101276102b0366004613a5b565b611064565b3480156102c0575f80fd5b506101276102cf366004613a20565b6112f0565b3480156102df575f80fd5b506101276102ee366004613a8b565b61130b565b3480156102fe575f80fd5b5061012761030d366004613a72565b6114ab565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613a5b565b611668565b6101b1610371366004613a5b565b611737565b6101b1610384366004613b74565b611743565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611767565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206142798339815191529184156104bd576104ba828561177b565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613c06565b600481111561050057610500613c06565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613c06565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206142998339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206142998339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f61064884611a17565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613c06565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076785611a8b565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613c2e565b90506107ff8682611b9c565b5f61080b878584611be4565b5f8c815260048a01602052604090209091506108278282613ccb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613dac565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613dde565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181525f805160206142f983398151915260205260409020545f805160206142b98339815191529060039060ff16600581111561093657610936613c06565b1461099b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f8281526006820160205260408120600301546109c39084906001600160401b031683611be4565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906109f0908490600401613dac565b6020604051808303815f875af1158015610a0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a309190613dde565b50505050565b610a3f81611e01565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614279833981519152916005600160991b019163ee5b48eb91610aa391600401613df5565b6020604051808303815f875af1158015610abf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ae39190613dde565b505050565b5f610af864e8d4a5100083613e93565b92915050565b5f805160206142b98339815191525f610b1683611ed4565b90505f80610b2783604001516120b5565b915091508015610b8c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610bbe57610bbe613c06565b6005811115610bcf57610bcf613c06565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c5657610c56613c06565b1480610c745750600182516005811115610c7257610c72613c06565b145b610cd35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115610ce857610ce8613c06565b03610cf557506004610cf9565b5060055b6020808301515f90815260078801909152604081205581816005811115610d2257610d22613c06565b90816005811115610d3557610d35613c06565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610d6957610d69613c06565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e3457610e34613c06565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206142798339815191525f610e7f84611ed4565b90505f80610e908360400151612256565b50915091505f610e9f83611a8b565b9050816001600160401b031681608001516001600160401b03161015610ed75760405162461bcd60e51b81526004016105d090613ea6565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f1c5760405162461bcd60e51b81526004016105d090613ee8565b60015f87815260038701602052604090205460ff166004811115610f4257610f42613c06565b14610fab5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610af86001600160401b03831664e8d4a51000613f31565b5f61105a82611a8b565b60a0015192915050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f8051602061427983398151915293929190829060ff1660048111156110c5576110c5613c06565b60048111156110d6576110d6613c06565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091505f84815260038401602052604090205460ff16600481111561116e5761116e613c06565b146111ce5760405162461bcd60e51b815260206004820152603860248201525f8051602061429983398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f6111dc8260400151611a8b565b905080608001516001600160401b03165f036112605760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105d0565b6005600160991b016001600160a01b031663ee5b48eb61128d846040015184608001518560a00151611be4565b6040518263ffffffff1660e01b81526004016112a99190613dac565b6020604051808303815f875af11580156112c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e99190613dde565b5050505050565b811561130257611300838261177b565b505b610ae383612491565b5f805160206142798339815191525f61132384611ed4565b90505f806113348360400151612256565b509150915061134285611e01565b5f858152600485016020526040812061135a9161399b565b5f61136483611a8b565b9050816001600160401b031681608001516001600160401b0316101561139c5760405162461bcd60e51b81526004016105d090613ea6565b5f8681526003808701602052604090912001546001600160401b03808416911611156113da5760405162461bcd60e51b81526004016105d090613ee8565b60035f87815260038701602052604090205460ff16600481111561140057611400613c06565b146114545760405162461bcd60e51b815260206004820152603160248201525f805160206142998339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142b98339815191525f6114c383611ed4565b90505f806114d483604001516120b5565b91509150806115365760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f8281526005850160205260408120805461155090613c55565b9050118015611582575060015f83815260068601602052604090205460ff16600581111561158057611580613c06565b145b61159e5760405162461bcd60e51b81526004016105d090613f48565b5f82815260058501602052604081206115b69161399b565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142b98339815191529291906116b090613c55565b90501180156116e2575060015f83815260068301602052604090205460ff1660058111156116e0576116e0613c06565b145b6116fe5760405162461bcd60e51b81526004016105d090613f48565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aa39190600401613df5565b5f610af882333461282f565b5f8061174e34612b9e565b905061175c85828686612c48565b9150505b9392505050565b61176f61309d565b611778816130e8565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156117c6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117ed9190810190613fae565b91509150806118505760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611893573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118b79190613dde565b82511461191b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b0316156119915760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f806119a0846040015161312b565b91509150818714611a0d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f805160206142f98339815191526020526040812060030180545f805160206142b9833981519152916001600160401b0390911690819084611a5c83614080565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f805160206142f983398151915290528390208351918201909352825491925f805160206142b983398151915292829060ff166005811115611b1357611b13613c06565b6005811115611b2457611b24613c06565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206142f9833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611c5d57611c1d8160016140a5565b611c28906008613f31565b5081515f90839083908110611c3f57611c3f6140b8565b60200101906001600160f81b03191690815f1a905350600101611c09565b505f5b6004811015611cc057611c748160036140a5565b611c7f906008613f31565b6001901c60f81b82611c928360026140cc565b81518110611ca257611ca26140b8565b60200101906001600160f81b03191690815f1a905350600101611c60565b505f5b6020811015611d2257611cd781601f6140a5565b611ce2906008613f31565b86901c60f81b82611cf48360066140cc565b81518110611d0457611d046140b8565b60200101906001600160f81b03191690815f1a905350600101611cc3565b505f5b6008811015611d8d57611d398160076140a5565b611d44906008613f31565b6001600160401b038616901c60f81b82611d5f8360266140cc565b81518110611d6f57611d6f6140b8565b60200101906001600160f81b03191690815f1a905350600101611d25565b505f5b6008811015611df857611da48160076140a5565b611daf906008613f31565b6001600160401b038516901c60f81b82611dca83602e6140cc565b81518110611dda57611dda6140b8565b60200101906001600160f81b03191690815f1a905350600101611d90565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f80516020614279833981519152929190611e4990613c55565b9050118015611e7b575060035f83815260038301602052604090205460ff166004811115611e7957611e79613c06565b145b611ed05760405162461bcd60e51b815260206004820152603360248201525f8051602061429983398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206142b98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f49573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f709190810190613fae565b9150915080611fd75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b825482511461203a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b0316156120ad5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f8082516027146120d85760405162461bcd60e51b81526004016105d0906140df565b5f805b6002811015612127576120ef8160016140a5565b6120fa906008613f31565b61ffff16858281518110612110576121106140b8565b016020015160f81c901b91909117906001016120db565b5061ffff81161561214a5760405162461bcd60e51b81526004016105d090614128565b5f805b60048110156121a5576121618160036140a5565b61216c906008613f31565b63ffffffff168661217e8360026140cc565b8151811061218e5761218e6140b8565b016020015160f81c901b919091179060010161214d565b5063ffffffff81166002146121cc5760405162461bcd60e51b81526004016105d09061416b565b5f805b6020811015612221576121e381601f6140a5565b6121ee906008613f31565b876121fa8360066140cc565b8151811061220a5761220a6140b8565b016020015160f81c901b91909117906001016121cf565b505f86602681518110612236576122366140b8565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461227a5760405162461bcd60e51b81526004016105d0906140df565b5f805b60028110156122c9576122918160016140a5565b61229c906008613f31565b61ffff168682815181106122b2576122b26140b8565b016020015160f81c901b919091179060010161227d565b5061ffff8116156122ec5760405162461bcd60e51b81526004016105d090614128565b5f805b6004811015612347576123038160036140a5565b61230e906008613f31565b63ffffffff16876123208360026140cc565b81518110612330576123306140b8565b016020015160f81c901b91909117906001016122ef565b5063ffffffff811660031461236e5760405162461bcd60e51b81526004016105d09061416b565b5f805b60208110156123c35761238581601f6140a5565b612390906008613f31565b8861239c8360066140cc565b815181106123ac576123ac6140b8565b016020015160f81c901b9190911790600101612371565b505f805b6008811015612422576123db8160076140a5565b6123e6906008613f31565b6001600160401b0316896123fb8360266140cc565b8151811061240b5761240b6140b8565b016020015160f81c901b91909117906001016123c7565b505f805b60088110156124815761243a8160076140a5565b612445906008613f31565b6001600160401b03168a61245a83602e6140cc565b8151811061246a5761246a6140b8565b016020015160f81c901b9190911790600101612426565b5091989097509095509350505050565b5f8181525f805160206142f983398151915260205260408082208151610100810190925280545f805160206142b983398151915293929190829060ff1660058111156124df576124df613c06565b60058111156124f0576124f0613c06565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561257857612578613c06565b146125d45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461264e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b61265b8160a00151613303565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561269f5761269f613c06565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61276b8461276581611a17565b5f611be4565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061279a908590600401613dac565b6020604051808303815f875af11580156127b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127da9190613dde565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6128386134a4565b5f61284283610ae8565b90505f805160206142798339815191525f61285c87611a8b565b905060028151600581111561287357612873613c06565b146128d25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516128e391906141b2565b90506128ef8882611b9c565b5f6128f989611a17565b90505f8989836040516020016129419392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061296286613303565b5f6005600160991b0163ee5b48eb61297b8d8688611be4565b6040518263ffffffff1660e01b81526004016129979190613dac565b6020604051808303815f875af11580156129b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129d79190613dde565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff19166001836004811115612a5f57612a5f613c06565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061176060015f805160206142d983398151915255565b5f5f805160206142798339815191528282612bb882610ae8565b83549091506001600160401b03821610801590612be257508260010154816001600160401b031611155b612c405760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612c516134a4565b5f805160206142b9833981519152426001600160401b038516118015612c8b57506001600160401b038416612c89426202a3006140cc565b115b612ced5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612d445760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260078201602052604090205415612db25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612e195760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612e2285613303565b5f80612e696040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134ee565b5f82815260058601602052604090209193509150612e878282613ccb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612eb4908590600401613dac565b6020604051808303815f875af1158015612ed0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ef49190613dde565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612f7657612f76613c06565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561303783611a17565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c4060015f805160206142d983398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130e657604051631afcd79f60e31b815260040160405180910390fd5b565b6130f061309d565b6130f981613893565b6117786060820135608083013561311660c0850160a08601613ac9565b61312660e0860160c087016141d2565b6138b4565b5f808251602e1461314e5760405162461bcd60e51b81526004016105d0906140df565b5f805b600281101561319d576131658160016140a5565b613170906008613f31565b61ffff16858281518110613186576131866140b8565b016020015160f81c901b9190911790600101613151565b5061ffff8116156131c05760405162461bcd60e51b81526004016105d090614128565b5f805b600481101561321b576131d78160036140a5565b6131e2906008613f31565b63ffffffff16866131f48360026140cc565b81518110613204576132046140b8565b016020015160f81c901b91909117906001016131c3565b5063ffffffff81166004146132425760405162461bcd60e51b81526004016105d09061416b565b5f805b60208110156132975761325981601f6140a5565b613264906008613f31565b876132708360066140cc565b81518110613280576132806140b8565b016020015160f81c901b9190911790600101613245565b505f805b60088110156132f6576132af8160076140a5565b6132ba906008613f31565b6001600160401b0316886132cf8360266140cc565b815181106132df576132df6140b8565b016020015160f81c901b919091179060010161329b565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142b98339815191529060ff165f03613341575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061338990836140a5565b106133a5576001600160401b03841660408301528082526133c4565b83826040018181516133b791906141b2565b6001600160401b03169052505b5f8260200151836040015160646133db91906141ed565b6133e59190614218565b600285015490915060ff90811690821611156134605760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206142d98339815191528054600119016134d557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206142d983398151915255565b5f60608260800151516030146135585760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135cf5761358f8160016140a5565b61359a906008613f31565b5081515f908390839081106135b1576135b16140b8565b60200101906001600160f81b03191690815f1a90535060010161357b565b505f5b600481101561362d576135e68160036140a5565b6135f1906008613f31565b505f826135ff8360026140cc565b8151811061360f5761360f6140b8565b60200101906001600160f81b03191690815f1a9053506001016135d2565b505f5b602081101561368a578451816020811061364c5761364c6140b8565b1a60f81b8261365c8360066140cc565b8151811061366c5761366c6140b8565b60200101906001600160f81b03191690815f1a905350600101613630565b505f5b60208110156136ea57846020015181602081106136ac576136ac6140b8565b1a60f81b826136bc8360266140cc565b815181106136cc576136cc6140b8565b60200101906001600160f81b03191690815f1a90535060010161368d565b505f5b600881101561375e576137018160076140a5565b61370c906008613f31565b60ff1685604001516001600160401b0316901c60f81b8282604661373091906140cc565b81518110613740576137406140b8565b60200101906001600160f81b03191690815f1a9053506001016136ed565b505f5b60308110156137c95784608001518181518110613780576137806140b8565b01602001516001600160f81b0319168261379b83604e6140cc565b815181106137ab576137ab6140b8565b60200101906001600160f81b03191690815f1a905350600101613761565b505f5b600881101561383b576137e08160076140a5565b6137eb906008613f31565b60608601516001600160401b0390811691161c60f81b8261380d83607e6140cc565b8151811061381d5761381d6140b8565b60200101906001600160f81b03191690815f1a9053506001016137cc565b5060028160405161384c919061423d565b602060405180830381855afa158015613867573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061388a9190613dde565b94909350915050565b61389b61309d565b6138a361390f565b6138ab61391f565b61177881613927565b6138bc61309d565b5f5f80516020614279833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61391761309d565b6130e6613993565b6130e661309d565b61392f61309d565b80355f805160206142b983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139796060830160408401614258565b600291909101805460ff191660ff90921691909117905550565b6134db61309d565b5080546139a790613c55565b5f825580601f106139b6575050565b601f0160209004905f5260205f209081019061177891905b808211156139e1575f81556001016139ce565b5090565b5f60e082840312156139f5575f80fd5b50919050565b8015158114611778575f80fd5b803563ffffffff81168114613a1b575f80fd5b919050565b5f805f60608486031215613a32575f80fd5b833592506020840135613a44816139fb565b9150613a5260408501613a08565b90509250925092565b5f60208284031215613a6b575f80fd5b5035919050565b5f60208284031215613a82575f80fd5b61176082613a08565b5f8060408385031215613a9c575f80fd5b613aa583613a08565b946020939093013593505050565b80356001600160401b0381168114613a1b575f80fd5b5f60208284031215613ad9575f80fd5b61176082613ab3565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b1857613b18613ae2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b4657613b46613ae2565b604052919050565b5f6001600160401b03821115613b6657613b66613ae2565b50601f01601f191660200190565b5f805f60608486031215613b86575f80fd5b83359250613b9660208501613ab3565b915060408401356001600160401b03811115613bb0575f80fd5b8401601f81018613613bc0575f80fd5b8035613bd3613bce82613b4e565b613b1e565b818152876020838501011115613be7575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613c4e57613c4e613c1a565b5092915050565b600181811c90821680613c6957607f821691505b6020821081036139f557634e487b7160e01b5f52602260045260245ffd5b601f821115610ae357805f5260205f20601f840160051c81016020851015613cac5750805b601f840160051c820191505b818110156112e9575f8155600101613cb8565b81516001600160401b03811115613ce457613ce4613ae2565b613cf881613cf28454613c55565b84613c87565b602080601f831160018114613d2b575f8415613d145750858301515b5f19600386901b1c1916600185901b178555613d82565b5f85815260208120601f198616915b82811015613d5957888601518255948401946001909101908401613d3a565b5085821015613d7657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613da4578181015183820152602001613d8c565b50505f910152565b602081525f8251806020840152613dca816040850160208701613d8a565b601f01601f19169190910160400192915050565b5f60208284031215613dee575f80fd5b5051919050565b5f60208083525f8454613e0781613c55565b806020870152604060018084165f8114613e285760018114613e4457613e71565b60ff19851660408a0152604084151560051b8a01019550613e71565b895f5260205f205f5b85811015613e685781548b8201860152908301908801613e4d565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613ea157613ea1613e7f565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610af857610af8613c1a565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611778575f80fd5b8051613a1b816139fb565b5f8060408385031215613fbf575f80fd5b82516001600160401b0380821115613fd5575f80fd5b9084019060608287031215613fe8575f80fd5b613ff0613af6565b8251815260208084015161400381613f8f565b82820152604084015183811115614018575f80fd5b80850194505087601f85011261402c575f80fd5b8351925061403c613bce84613b4e565b838152888285870101111561404f575f80fd5b61405e84838301848801613d8a565b80604084015250819550614073818801613fa3565b9450505050509250929050565b5f6001600160401b0380831681810361409b5761409b613c1a565b6001019392505050565b81810381811115610af857610af8613c1a565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610af857610af8613c1a565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613c4e57613c4e613c1a565b5f602082840312156141e2575f80fd5b813561176081613f8f565b6001600160401b0381811683821602808216919082811461421057614210613c1a565b505092915050565b5f6001600160401b038084168061423157614231613e7f565b92169190910492915050565b5f825161424e818460208701613d8a565b9190910192915050565b5f60208284031215614268575f80fd5b813560ff81168114611760575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516142c63803806142c683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6141798061014d5f395ff3fe6080604052600436106100f9575f3560e01c806366435abf11610092578063b771b3bc11610062578063b771b3bc146102c9578063ba3a4b97146102fb578063bee0a03f1461031a578063c599e24f14610339578063f40797d71461034c575f80fd5b806366435abf1461024d57806376f786211461026c57806398f3e2b41461028b578063a3a65e48146102aa575f80fd5b80632e2194d8116100cd5780632e2194d8146101b9578063467ef06f146101f05780635297fae61461020f578063620658561461022e575f80fd5b8062e41792146100fd5780630118acc41461011e5780630322ed981461013d5780630cdd09851461015c575b5f80fd5b348015610108575f80fd5b5061011c610117366004613839565b61035f565b005b348015610129575f80fd5b5061011c610138366004613874565b610441565b348015610148575f80fd5b5061011c6101573660046138af565b6108ab565b348015610167575f80fd5b506101a66101763660046138af565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101c4575f80fd5b506101d86101d33660046138af565b6109eb565b6040516001600160401b0390911681526020016101b0565b3480156101fb575f80fd5b5061011c61020a3660046138c6565b610a01565b34801561021a575f80fd5b5061011c6102293660046138df565b610d6a565b348015610239575f80fd5b506101a661024836600461391d565b610f3a565b348015610258575f80fd5b506101d86102673660046138af565b610f53565b348015610277575f80fd5b5061011c610286366004613874565b610f67565b348015610296575f80fd5b5061011c6102a53660046138df565b610f87565b3480156102b5575f80fd5b5061011c6102c43660046138c6565b611106565b3480156102d4575f80fd5b506102e36005600160991b0181565b6040516001600160a01b0390911681526020016101b0565b348015610306575f80fd5b5061011c6103153660046138af565b6112c3565b348015610325575f80fd5b5061011c6103343660046138af565b61154f565b6101a66103473660046138af565b61165e565b6101a661035a3660046139c8565b61166a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103a8575080546001600160401b03808416911610155b156103c65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556103f08361168e565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206140cd8339815191529184156104935761049082856116a2565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104c5576104c5613a5a565b60048111156104d6576104d6613a5a565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561055d5761055d613a5a565b146105af5760405162461bcd60e51b815260206004820152602a60248201525f805160206140ed8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106145760405162461bcd60e51b815260206004820152603360248201525f805160206140ed8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105a6565b5f61061e8461193e565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561066b5761066b613a5a565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61073d856119b2565b905082606001516001600160401b03168160a001516001600160401b0316116107b45760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105a6565b5f83606001518260a001516107c99190613a82565b90506107d58682611ac3565b5f6005600160991b0163ee5b48eb6107ee898786611b0b565b6040518263ffffffff1660e01b815260040161080a9190613acb565b6020604051808303815f875af1158015610826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084a9190613afd565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061414d83398151915260205260409020545f8051602061410d8339815191529060039060ff1660058111156108eb576108eb613a5a565b146109505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105a6565b5f8281526006820160205260408120600301546109789084906001600160401b031683611b0b565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906109a5908490600401613acb565b6020604051808303815f875af11580156109c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e59190613afd565b50505050565b5f6109fb64e8d4a5100083613b28565b92915050565b5f8051602061410d8339815191525f610a1983611d28565b90505f80610a2a8360400151611f09565b915091508015610a8f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105a6565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610ac157610ac1613a5a565b6005811115610ad257610ad2613a5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b5957610b59613a5a565b1480610b775750600182516005811115610b7557610b75613a5a565b145b610bd65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105a6565b600382516005811115610beb57610beb613a5a565b03610bf857506004610bfc565b5060055b6020808301515f90815260078801909152604081205581816005811115610c2557610c25613a5a565b90816005811115610c3857610c38613a5a565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610c6c57610c6c613a5a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d3757610d37613a5a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206140cd8339815191525f610d8284611d28565b90505f80610d9383604001516120aa565b50915091505f610da2836119b2565b9050816001600160401b031681608001516001600160401b03161015610dda5760405162461bcd60e51b81526004016105a690613b3b565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e1f5760405162461bcd60e51b81526004016105a690613b7d565b60015f87815260038701602052604090205460ff166004811115610e4557610e45613a5a565b14610eae5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105a6565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109fb6001600160401b03831664e8d4a51000613bc6565b5f610f5d826119b2565b60a0015192915050565b8115610f7957610f7783826116a2565b505b610f82836122e5565b505050565b5f805160206140cd8339815191525f610f9f84611d28565b90505f80610fb083604001516120aa565b50915091505f610fbf836119b2565b9050816001600160401b031681608001516001600160401b03161015610ff75760405162461bcd60e51b81526004016105a690613b3b565b5f8681526003808701602052604090912001546001600160401b03808416911611156110355760405162461bcd60e51b81526004016105a690613b7d565b60035f87815260038701602052604090205460ff16600481111561105b5761105b613a5a565b146110af5760405162461bcd60e51b815260206004820152603160248201525f805160206140ed8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105a6565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f8051602061410d8339815191525f61111e83611d28565b90505f8061112f8360400151611f09565b91509150806111915760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105a6565b5f828152600585016020526040812080546111ab90613bdd565b90501180156111dd575060015f83815260068601602052604090205460ff1660058111156111db576111db613a5a565b145b6111f95760405162461bcd60e51b81526004016105a690613c0f565b5f8281526005850160205260408120611211916137ef565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f805160206140cd83398151915293929190829060ff16600481111561132457611324613a5a565b600481111561133557611335613a5a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091505f84815260038401602052604090205460ff1660048111156113cd576113cd613a5a565b1461142d5760405162461bcd60e51b815260206004820152603860248201525f805160206140ed83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105a6565b5f61143b82604001516119b2565b905080608001516001600160401b03165f036114bf5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105a6565b6005600160991b016001600160a01b031663ee5b48eb6114ec846040015184608001518560a00151611b0b565b6040518263ffffffff1660e01b81526004016115089190613acb565b6020604051808303815f875af1158015611524573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115489190613afd565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061410d83398151915292919061159790613bdd565b90501180156115c9575060015f83815260068301602052604090205460ff1660058111156115c7576115c7613a5a565b145b6115e55760405162461bcd60e51b81526004016105a690613c0f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161161e9190600401613c56565b6020604051808303815f875af115801561163a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f829190613afd565b5f6109fb823334612683565b5f80611675346129f2565b905061168385828686612a9c565b9150505b9392505050565b611696612ef1565b61169f81612f3c565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156116ed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117149190810190613cff565b91509150806117775760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105a6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117de9190613afd565b8251146118425760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105a6565b60208201516001600160a01b0316156118b85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105a6565b5f806118c78460400151612f7f565b915091508187146119345760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105a6565b9695505050505050565b5f8181525f8051602061414d8339815191526020526040812060030180545f8051602061410d833981519152916001600160401b039091169081908461198383613dd1565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061414d83398151915290528390208351918201909352825491925f8051602061410d83398151915292829060ff166005811115611a3a57611a3a613a5a565b6005811115611a4b57611a4b613a5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061414d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611b8457611b44816001613df6565b611b4f906008613bc6565b5081515f90839083908110611b6657611b66613e09565b60200101906001600160f81b03191690815f1a905350600101611b30565b505f5b6004811015611be757611b9b816003613df6565b611ba6906008613bc6565b6001901c60f81b82611bb9836002613e1d565b81518110611bc957611bc9613e09565b60200101906001600160f81b03191690815f1a905350600101611b87565b505f5b6020811015611c4957611bfe81601f613df6565b611c09906008613bc6565b86901c60f81b82611c1b836006613e1d565b81518110611c2b57611c2b613e09565b60200101906001600160f81b03191690815f1a905350600101611bea565b505f5b6008811015611cb457611c60816007613df6565b611c6b906008613bc6565b6001600160401b038616901c60f81b82611c86836026613e1d565b81518110611c9657611c96613e09565b60200101906001600160f81b03191690815f1a905350600101611c4c565b505f5b6008811015611d1f57611ccb816007613df6565b611cd6906008613bc6565b6001600160401b038516901c60f81b82611cf183602e613e1d565b81518110611d0157611d01613e09565b60200101906001600160f81b03191690815f1a905350600101611cb7565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f8051602061410d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d9d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611dc49190810190613cff565b9150915080611e2b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105a6565b8254825114611e8e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105a6565b60208201516001600160a01b031615611f015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105a6565b509392505050565b5f808251602714611f2c5760405162461bcd60e51b81526004016105a690613e30565b5f805b6002811015611f7b57611f43816001613df6565b611f4e906008613bc6565b61ffff16858281518110611f6457611f64613e09565b016020015160f81c901b9190911790600101611f2f565b5061ffff811615611f9e5760405162461bcd60e51b81526004016105a690613e79565b5f805b6004811015611ff957611fb5816003613df6565b611fc0906008613bc6565b63ffffffff1686611fd2836002613e1d565b81518110611fe257611fe2613e09565b016020015160f81c901b9190911790600101611fa1565b5063ffffffff81166002146120205760405162461bcd60e51b81526004016105a690613ebc565b5f805b60208110156120755761203781601f613df6565b612042906008613bc6565b8761204e836006613e1d565b8151811061205e5761205e613e09565b016020015160f81c901b9190911790600101612023565b505f8660268151811061208a5761208a613e09565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120ce5760405162461bcd60e51b81526004016105a690613e30565b5f805b600281101561211d576120e5816001613df6565b6120f0906008613bc6565b61ffff1686828151811061210657612106613e09565b016020015160f81c901b91909117906001016120d1565b5061ffff8116156121405760405162461bcd60e51b81526004016105a690613e79565b5f805b600481101561219b57612157816003613df6565b612162906008613bc6565b63ffffffff1687612174836002613e1d565b8151811061218457612184613e09565b016020015160f81c901b9190911790600101612143565b5063ffffffff81166003146121c25760405162461bcd60e51b81526004016105a690613ebc565b5f805b6020811015612217576121d981601f613df6565b6121e4906008613bc6565b886121f0836006613e1d565b8151811061220057612200613e09565b016020015160f81c901b91909117906001016121c5565b505f805b60088110156122765761222f816007613df6565b61223a906008613bc6565b6001600160401b03168961224f836026613e1d565b8151811061225f5761225f613e09565b016020015160f81c901b919091179060010161221b565b505f805b60088110156122d55761228e816007613df6565b612299906008613bc6565b6001600160401b03168a6122ae83602e613e1d565b815181106122be576122be613e09565b016020015160f81c901b919091179060010161227a565b5091989097509095509350505050565b5f8181525f8051602061414d83398151915260205260408082208151610100810190925280545f8051602061410d83398151915293929190829060ff16600581111561233357612333613a5a565b600581111561234457612344613a5a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123cc576123cc613a5a565b146124285760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105a6565b60408101516001600160a01b0316336001600160a01b0316146124a25760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105a6565b6124af8160a00151613157565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156124f3576124f3613a5a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125bf846125b98161193e565b5f611b0b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906125ee908590600401613acb565b6020604051808303815f875af115801561260a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262e9190613afd565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61268c6132f8565b5f612696836109eb565b90505f805160206140cd8339815191525f6126b0876119b2565b90506002815160058111156126c7576126c7613a5a565b146127265760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105a6565b5f838260a001516127379190613f03565b90506127438882611ac3565b5f61274d8961193e565b90505f8989836040516020016127959392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090506127b686613157565b5f6005600160991b0163ee5b48eb6127cf8d8688611b0b565b6040518263ffffffff1660e01b81526004016127eb9190613acb565b6020604051808303815f875af1158015612807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061282b9190613afd565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff191660018360048111156128b3576128b3613a5a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061168760015f8051602061412d83398151915255565b5f5f805160206140cd8339815191528282612a0c826109eb565b83549091506001600160401b03821610801590612a3657508260010154816001600160401b031611155b612a945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105a6565b949350505050565b5f612aa56132f8565b5f8051602061410d833981519152426001600160401b038516118015612adf57506001600160401b038416612add426202a300613e1d565b115b612b415760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105a6565b85612b985760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105a6565b5f86815260078201602052604090205415612c065760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105a6565b8251603014612c6d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105a6565b612c7685613157565b5f80612cbd6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613342565b5f82815260058601602052604090209193509150612cdb8282613f67565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d08908590600401613acb565b6020604051808303815f875af1158015612d24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d489190613afd565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612dca57612dca613a5a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612e8b8361193e565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612a9460015f8051602061412d83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612f3a57604051631afcd79f60e31b815260040160405180910390fd5b565b612f44612ef1565b612f4d816136e7565b61169f60608201356080830135612f6a60c0850160a0860161391d565b612f7a60e0860160c08701614026565b613708565b5f808251602e14612fa25760405162461bcd60e51b81526004016105a690613e30565b5f805b6002811015612ff157612fb9816001613df6565b612fc4906008613bc6565b61ffff16858281518110612fda57612fda613e09565b016020015160f81c901b9190911790600101612fa5565b5061ffff8116156130145760405162461bcd60e51b81526004016105a690613e79565b5f805b600481101561306f5761302b816003613df6565b613036906008613bc6565b63ffffffff1686613048836002613e1d565b8151811061305857613058613e09565b016020015160f81c901b9190911790600101613017565b5063ffffffff81166004146130965760405162461bcd60e51b81526004016105a690613ebc565b5f805b60208110156130eb576130ad81601f613df6565b6130b8906008613bc6565b876130c4836006613e1d565b815181106130d4576130d4613e09565b016020015160f81c901b9190911790600101613099565b505f805b600881101561314a57613103816007613df6565b61310e906008613bc6565b6001600160401b031688613123836026613e1d565b8151811061313357613133613e09565b016020015160f81c901b91909117906001016130ef565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061410d8339815191529060ff165f03613195575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906131dd9083613df6565b106131f9576001600160401b0384166040830152808252613218565b838260400181815161320b9190613f03565b6001600160401b03169052505b5f82602001518360400151606461322f9190614041565b613239919061406c565b600285015490915060ff90811690821611156132b45760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105a6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061412d83398151915280546001190161332957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061412d83398151915255565b5f60608260800151516030146133ac5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105a6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613423576133e3816001613df6565b6133ee906008613bc6565b5081515f9083908390811061340557613405613e09565b60200101906001600160f81b03191690815f1a9053506001016133cf565b505f5b60048110156134815761343a816003613df6565b613445906008613bc6565b505f82613453836002613e1d565b8151811061346357613463613e09565b60200101906001600160f81b03191690815f1a905350600101613426565b505f5b60208110156134de57845181602081106134a0576134a0613e09565b1a60f81b826134b0836006613e1d565b815181106134c0576134c0613e09565b60200101906001600160f81b03191690815f1a905350600101613484565b505f5b602081101561353e578460200151816020811061350057613500613e09565b1a60f81b82613510836026613e1d565b8151811061352057613520613e09565b60200101906001600160f81b03191690815f1a9053506001016134e1565b505f5b60088110156135b257613555816007613df6565b613560906008613bc6565b60ff1685604001516001600160401b0316901c60f81b828260466135849190613e1d565b8151811061359457613594613e09565b60200101906001600160f81b03191690815f1a905350600101613541565b505f5b603081101561361d57846080015181815181106135d4576135d4613e09565b01602001516001600160f81b031916826135ef83604e613e1d565b815181106135ff576135ff613e09565b60200101906001600160f81b03191690815f1a9053506001016135b5565b505f5b600881101561368f57613634816007613df6565b61363f906008613bc6565b60608601516001600160401b0390811691161c60f81b8261366183607e613e1d565b8151811061367157613671613e09565b60200101906001600160f81b03191690815f1a905350600101613620565b506002816040516136a09190614091565b602060405180830381855afa1580156136bb573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906136de9190613afd565b94909350915050565b6136ef612ef1565b6136f7613763565b6136ff613773565b61169f8161377b565b613710612ef1565b5f5f805160206140cd833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61376b612ef1565b612f3a6137e7565b612f3a612ef1565b613783612ef1565b80355f8051602061410d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556137cd60608301604084016140ac565b600291909101805460ff191660ff90921691909117905550565b61332f612ef1565b5080546137fb90613bdd565b5f825580601f1061380a575050565b601f0160209004905f5260205f209081019061169f91905b80821115613835575f8155600101613822565b5090565b5f60e08284031215613849575f80fd5b50919050565b801515811461169f575f80fd5b803563ffffffff8116811461386f575f80fd5b919050565b5f805f60608486031215613886575f80fd5b8335925060208401356138988161384f565b91506138a66040850161385c565b90509250925092565b5f602082840312156138bf575f80fd5b5035919050565b5f602082840312156138d6575f80fd5b6116878261385c565b5f80604083850312156138f0575f80fd5b6138f98361385c565b946020939093013593505050565b80356001600160401b038116811461386f575f80fd5b5f6020828403121561392d575f80fd5b61168782613907565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561396c5761396c613936565b60405290565b604051601f8201601f191681016001600160401b038111828210171561399a5761399a613936565b604052919050565b5f6001600160401b038211156139ba576139ba613936565b50601f01601f191660200190565b5f805f606084860312156139da575f80fd5b833592506139ea60208501613907565b915060408401356001600160401b03811115613a04575f80fd5b8401601f81018613613a14575f80fd5b8035613a27613a22826139a2565b613972565b818152876020838501011115613a3b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613aa257613aa2613a6e565b5092915050565b5f5b83811015613ac3578181015183820152602001613aab565b50505f910152565b602081525f8251806020840152613ae9816040850160208701613aa9565b601f01601f19169190910160400192915050565b5f60208284031215613b0d575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613b3657613b36613b14565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109fb576109fb613a6e565b600181811c90821680613bf157607f821691505b60208210810361384957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613c6881613bdd565b806020870152604060018084165f8114613c895760018114613ca557613cd2565b60ff19851660408a0152604084151560051b8a01019550613cd2565b895f5260205f205f5b85811015613cc95781548b8201860152908301908801613cae565b8a016040019650505b509398975050505050505050565b6001600160a01b038116811461169f575f80fd5b805161386f8161384f565b5f8060408385031215613d10575f80fd5b82516001600160401b0380821115613d26575f80fd5b9084019060608287031215613d39575f80fd5b613d4161394a565b82518152602080840151613d5481613ce0565b82820152604084015183811115613d69575f80fd5b80850194505087601f850112613d7d575f80fd5b83519250613d8d613a22846139a2565b8381528882858701011115613da0575f80fd5b613daf84838301848801613aa9565b80604084015250819550613dc4818801613cf4565b9450505050509250929050565b5f6001600160401b03808316818103613dec57613dec613a6e565b6001019392505050565b818103818111156109fb576109fb613a6e565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109fb576109fb613a6e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613aa257613aa2613a6e565b601f821115610f8257805f5260205f20601f840160051c81016020851015613f485750805b601f840160051c820191505b81811015611548575f8155600101613f54565b81516001600160401b03811115613f8057613f80613936565b613f9481613f8e8454613bdd565b84613f23565b602080601f831160018114613fc7575f8415613fb05750858301515b5f19600386901b1c1916600185901b17855561401e565b5f85815260208120601f198616915b82811015613ff557888601518255948401946001909101908401613fd6565b508582101561401257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614036575f80fd5b813561168781613ce0565b6001600160401b0381811683821602808216919082811461406457614064613a6e565b505092915050565b5f6001600160401b038084168061408557614085613b14565b92169190910492915050565b5f82516140a2818460208701613aa9565b9190910192915050565b5f602082840312156140bc575f80fd5b813560ff81168114611687575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -562,48 +562,6 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, blsPublicKey) } -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. -// -// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendDelegatorRegistration(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "resendDelegatorRegistration", delegationID) -} - -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. -// -// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendDelegatorRegistration(delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, delegationID) -} - -// ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. -// -// Solidity: function resendDelegatorRegistration(bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendDelegatorRegistration(delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, delegationID) -} - -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. -// -// Solidity: function resendEndDelegation(bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendEndDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "resendEndDelegation", delegationID) -} - -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. -// -// Solidity: function resendEndDelegation(bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendEndDelegation(delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) -} - -// ResendEndDelegation is a paid mutator transaction binding the contract method 0x162f1f61. -// -// Solidity: function resendEndDelegation(bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendEndDelegation(delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) -} - // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. // // Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() @@ -646,6 +604,27 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Re return _NativeTokenStakingManager.Contract.ResendRegisterValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) } +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendUpdateDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "resendUpdateDelegation", delegationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendUpdateDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendUpdateDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) +} + // NativeTokenStakingManagerDelegationEndedIterator is returned from FilterDelegationEnded and is used to iterate over the raw logs and unpacked data for DelegationEnded events raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegationEndedIterator struct { Event *NativeTokenStakingManagerDelegationEnded // Event containing the contract specifics and raw log diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 3ec509845..b24da729e 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -30,8 +30,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager IRewardCalculator _rewardCalculator; /// @notice Maps the delegationID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; - /// @notice Maps the delegationID to pending end delegator messages. - mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; } // solhint-enable private-vars-leading-underscore @@ -198,28 +196,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager return delegationID; } - function resendDelegatorRegistration(bytes32 delegationID) external { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - Delegator memory delegator = $._delegatorStakes[delegationID]; - require( - $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, - "PoSValidatorManager: delegation registration not pending" - ); - - Validator memory validator = _getValidator(delegator.validationID); - require( - validator.messageNonce != 0, - "PoSValidatorManager: could not find validator for delegation ID" - ); - - // Submit the message to the Warp precompile. - WARP_MESSENGER.sendWarpMessage( - ValidatorMessages.packSetSubnetValidatorWeightMessage( - delegator.validationID, validator.messageNonce, validator.weight - ) - ); - } - function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); @@ -303,10 +279,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _setValidatorWeight(validationID, newValidatorWeight); // Submit the message to the Warp precompile. - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); - $._pendingEndDelegatorMessages[delegationID] = setValidatorWeightPayload; - bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); + bytes32 messageID = WARP_MESSENGER.sendWarpMessage( + ValidatorMessages.packSetSubnetValidatorWeightMessage( + validationID, nonce, newValidatorWeight + ) + ); emit DelegatorRemovalInitialized({ delegationID: delegationID, @@ -318,10 +295,26 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager }); } - function resendEndDelegation(bytes32 delegationID) external { - _checkPendingEndDelegatorMessage(delegationID); + function resendUpdateDelegation(bytes32 delegationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - WARP_MESSENGER.sendWarpMessage($._pendingEndDelegatorMessages[delegationID]); + Delegator memory delegator = $._delegatorStakes[delegationID]; + require( + $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, + "PoSValidatorManager: delegation registration not pending" + ); + + Validator memory validator = _getValidator(delegator.validationID); + require( + validator.messageNonce != 0, + "PoSValidatorManager: could not find validator for delegation ID" + ); + + // Submit the message to the Warp precompile. + WARP_MESSENGER.sendWarpMessage( + ValidatorMessages.packSetSubnetValidatorWeightMessage( + delegator.validationID, validator.messageNonce, validator.weight + ) + ); } function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) external { @@ -331,8 +324,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce,) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - _checkPendingEndDelegatorMessage(delegationID); - delete $._pendingEndDelegatorMessages[delegationID]; Validator memory validator = _getValidator(validationID); // The received nonce should be no greater than the highest sent nonce. This should never @@ -364,13 +355,4 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager emit DelegationEnded(delegationID, validationID, nonce); } - - function _checkPendingEndDelegatorMessage(bytes32 delegationID) private view { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - require( - $._pendingEndDelegatorMessages[delegationID].length > 0 - && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, - "PoSValidatorManager: delegation removal not pending" - ); - } } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 84cc32b3b..e5c7ed2b0 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -111,13 +111,6 @@ interface IPoSValidatorManager is IValidatorManager { uint32 messageIndex ) external; - /** - * @notice Resubmits a delegator registration message to be sent to the P-Chain. - * Only necessary if the original message can't be delivered due to validator churn. - * @param delegationID The ID of the delegation being registered. - */ - function resendDelegatorRegistration(bytes32 delegationID) external; - /** * @notice Completes the delegator registration process by returning 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. @@ -149,11 +142,11 @@ interface IPoSValidatorManager is IValidatorManager { ) external; /** - * @notice Resubmits a delegator end message to be sent to the P-Chain. + * @notice Resubmits a delegator registration or delegator end message to be sent to the P-Chain. * Only necessary if the original message can't be delivered due to validator churn. - * @param delegationID The ID of the delegation being removed. + * @param delegationID The ID of the delegation. */ - function resendEndDelegation(bytes32 delegationID) external; + function resendUpdateDelegation(bytes32 delegationID) external; /** * @notice Completes the process of ending a delegation by receiving an acknowledgement from the P-Chain. diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 6dedd8b98..c6179ef21 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -188,7 +188,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, 1, DEFAULT_WEIGHT + DEFAULT_DELEGATOR_WEIGHT ); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - posValidatorManager.resendDelegatorRegistration(delegationID); + posValidatorManager.resendUpdateDelegation(delegationID); } function testCompleteDelegatorRegistration() public { @@ -368,7 +368,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - posValidatorManager.resendEndDelegation(delegationID); + posValidatorManager.resendUpdateDelegation(delegationID); } function testCompleteEndDelegation() public { From c7858092713a7758c8c133a2ccceb507f9d2e85f Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 6 Sep 2024 18:12:18 +0000 Subject: [PATCH 220/545] add unit tests --- .../tests/ERC20TokenStakingManagerTests.t.sol | 19 ++++++++++++++ .../NativeTokenStakingManagerTests.t.sol | 19 ++++++++++++++ .../staking/tests/ValidatorManagerTests.t.sol | 25 +++++++++++-------- 3 files changed, 52 insertions(+), 11 deletions(-) diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index dd8f8bdbd..db0e745c4 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -45,6 +45,25 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { posValidatorManager = app; } + function testCompleteEndValidation() public override { + bytes32 validationID = _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + }); + + uint256 balanceBefore = token.balanceOf(address(this)); + + _testCompleteEndValidation(validationID); + + uint256 balanceChange = token.balanceOf(address(this)) - balanceBefore; + require(balanceChange == DEFAULT_WEIGHT, "validator should have received their stake back"); + } + function _initializeValidatorRegistration( bytes32 nodeID, uint64 registrationExpiry, diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index cd97aee36..873e30b38 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -37,6 +37,25 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { posValidatorManager = app; } + function testCompleteEndValidation() public override { + bytes32 validationID = _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + }); + + uint256 balanceBefore = address(this).balance; + + _testCompleteEndValidation(validationID); + + uint256 balanceChange = address(this).balance - balanceBefore; + require(balanceChange == DEFAULT_WEIGHT, "validator should have received their stake back"); + } + // Helpers function _initializeValidatorRegistration( bytes32 nodeID, diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index bf196515a..28fdd64c2 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -159,7 +159,7 @@ abstract contract ValidatorManagerTest is Test { validatorManager.resendEndValidatorMessage(validationID); } - function testCompleteEndValidation() public { + function testCompleteEndValidation() public virtual { bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -169,16 +169,7 @@ abstract contract ValidatorManagerTest is Test { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); - - bytes memory subnetValidatorRegistrationMessage = - ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); - - _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); - - vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); - - validatorManager.completeEndValidation(0); + _testCompleteEndValidation(validationID); } function testCompleteInvalidatedValidation() public { @@ -287,6 +278,18 @@ abstract contract ValidatorManagerTest is Test { _initializeEndValidation(validationID); } + function _testCompleteEndValidation(bytes32 validationID) internal virtual { + bytes memory subnetValidatorRegistrationMessage = + ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); + + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); + + validatorManager.completeEndValidation(0); + } + function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { vm.mockCall( WARP_PRECOMPILE_ADDRESS, From 1ef6e2d0c8747dbbe98a3985248f1753e9dcb5d7 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 6 Sep 2024 18:29:08 +0000 Subject: [PATCH 221/545] unlock starting weight, not weight w/ delegations addresses review comment https://github.com/ava-labs/teleporter/pull/527#discussion_r1745492913 --- contracts/staking/PoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index b65515031..86f89df8a 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -98,7 +98,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function completeEndValidation(uint32 messageIndex) external { Validator memory validator = _completeEndValidation(messageIndex); - _unlock(validator.weight, validator.owner); + _unlock(validator.startingWeight, validator.owner); } function _getUptime(bytes32 validationID, uint32 messageIndex) internal view returns (uint64) { From bae1c68970fb2b133d771f731806a46557b1e6d8 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 6 Sep 2024 18:52:05 +0000 Subject: [PATCH 222/545] update abi bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index a260760e7..2264e7082 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161486538038061486583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147188061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613d84565b6102d6565b005b610128610138366004613dbf565b610761565b61017b61014b366004613dbf565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613dbf565b6108bd565b6101286101af366004613dea565b61092a565b6101c76101c2366004613dbf565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613e27565b610a24565b610128610200366004613e40565b610a4f565b61017b610213366004613e7e565b610c40565b6101c7610226366004613dbf565b610c59565b610128610239366004613dbf565b610c6d565b61012861024c366004613d84565b610cda565b61017b61025f366004613f29565b610cf5565b610128610272366004613e40565b610d1a565b61017b610285366004613fc5565b610eba565b610128610298366004613e27565b610ecd565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613dbf565b61108a565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061466c833981519152918415610328576103258285611159565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613fe5565b600481111561036b5761036b613fe5565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613fe5565b146104445760405162461bcd60e51b815260206004820152602a60248201525f8051602061468c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f8051602061468c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b3846113f5565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500613fe5565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611469565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e919061400d565b905061066a8682611548565b5f610676878584611590565b5f8c815260058a016020526040902090915061069282826140b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614198565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906141ca565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206146ac8339815191529291906107a990614034565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9613fe5565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016141e1565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906141ca565b505050565b6108c6816117ad565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061466c833981519152916005600160991b019163ee5b48eb91610878916004016141e1565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc848461187c565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361427f565b92915050565b5f610a2e82611896565b9050610a4b8160a001516001600160401b03168260400151611c23565b5050565b5f8051602061466c8339815191525f610a6784611c59565b90505f80610a788360400151611e3a565b5091509150610a8685612075565b5f8581526004850160205260408120610a9e91613ccc565b5f610aa883611469565b9050816001600160401b031681608001516001600160401b03161015610ae05760405162461bcd60e51b815260040161043b90614292565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b255760405162461bcd60e51b815260040161043b906142d4565b60015f87815260038701602052604090205460ff166004811115610b4b57610b4b613fe5565b14610bb45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a5100061431d565b5f610c6382611469565b60a0015192915050565b610c7681612075565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061466c833981519152916005600160991b019163ee5b48eb91610878916004016141e1565b8115610cec57610cea8382611159565b505b6108b88361214e565b5f80610d0086612506565b9050610d0e858286866125b3565b9150505b949350505050565b5f8051602061466c8339815191525f610d3284611c59565b90505f80610d438360400151611e3a565b5091509150610d51856117ad565b5f8581526005850160205260408120610d6991613ccc565b5f610d7383611469565b9050816001600160401b031681608001516001600160401b03161015610dab5760405162461bcd60e51b815260040161043b90614292565b5f8681526003808701602052604090912001546001600160401b0380841691161115610de95760405162461bcd60e51b815260040161043b906142d4565b60035f87815260038701602052604090205460ff166004811115610e0f57610e0f613fe5565b14610e635760405162461bcd60e51b815260206004820152603160248201525f8051602061468c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f610ec6833384612a08565b9392505050565b5f805160206146ac8339815191525f610ee583611c59565b90505f80610ef68360400151612dc3565b9150915080610f585760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260058501602052604081208054610f7290614034565b9050118015610fa4575060015f83815260078601602052604090205460ff166005811115610fa257610fa2613fe5565b145b610fc05760405162461bcd60e51b815260040161043b90614334565b5f8281526005850160205260408120610fd891613ccc565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206146ac8339815191529291906110d290614034565b9050118015611104575060015f83815260078301602052604090205460ff16600581111561110257611102613fe5565b145b6111205760405162461bcd60e51b815260040161043b90614334565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016141e1565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156111a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111cb9190810190614386565b915091508061122e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061129591906141ca565b8251146112f95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b03161561136f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061137e8460400151612f64565b915091508187146113eb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206146ec8339815191526020526040812060030180545f805160206146ac833981519152916001600160401b039091169081908461143a83614458565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611471613d03565b5f8281525f805160206146ec8339815191526020526040908190208151610100810190925280545f805160206146ac833981519152929190829060ff1660058111156114bf576114bf613fe5565b60058111156114d0576114d0613fe5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206146ec833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611609576115c981600161447d565b6115d490600861431d565b5081515f908390839081106115eb576115eb614490565b60200101906001600160f81b03191690815f1a9053506001016115b5565b505f5b600481101561166c5761162081600361447d565b61162b90600861431d565b6001901c60f81b8261163e8360026144a4565b8151811061164e5761164e614490565b60200101906001600160f81b03191690815f1a90535060010161160c565b505f5b60208110156116ce5761168381601f61447d565b61168e90600861431d565b86901c60f81b826116a08360066144a4565b815181106116b0576116b0614490565b60200101906001600160f81b03191690815f1a90535060010161166f565b505f5b6008811015611739576116e581600761447d565b6116f090600861431d565b6001600160401b038616901c60f81b8261170b8360266144a4565b8151811061171b5761171b614490565b60200101906001600160f81b03191690815f1a9053506001016116d1565b505f5b60088110156117a45761175081600761447d565b61175b90600861431d565b6001600160401b038516901c60f81b8261177683602e6144a4565b8151811061178657611786614490565b60200101906001600160f81b03191690815f1a90535060010161173c565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061466c8339815191529291906117f590614034565b9050118015611827575060035f83815260038301602052604090205460ff16600481111561182557611825613fe5565b145b610a4b5760405162461bcd60e51b815260206004820152603360248201525f8051602061468c83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b61188461313c565b61188d82613187565b610a4b816131cd565b61189e613d03565b5f805160206146ac8339815191525f6118b684611c59565b90505f806118c78360400151612dc3565b91509150801561192c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff16600581111561195e5761195e613fe5565b600581111561196f5761196f613fe5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156119f6576119f6613fe5565b1480611a145750600182516005811115611a1257611a12613fe5565b145b611a735760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611a8857611a88613fe5565b03611aaf57505f8381526006860160205260408120600491611aaa9190613ccc565b611ab3565b5060055b6020808301515f90815260088801909152604081205581816005811115611adc57611adc613fe5565b90816005811115611aef57611aef613fe5565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611b2357611b23613fe5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611bee57611bee613fe5565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a4b906001600160a01b03168284613281565b60408051606080820183525f8083526020830181905292820152905f805160206146ac8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611cce573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cf59190810190614386565b9150915080611d5c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611dbf5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611e325760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611e5e5760405162461bcd60e51b815260040161043b906144b7565b5f805b6002811015611ead57611e7581600161447d565b611e8090600861431d565b61ffff16868281518110611e9657611e96614490565b016020015160f81c901b9190911790600101611e61565b5061ffff811615611ed05760405162461bcd60e51b815260040161043b90614500565b5f805b6004811015611f2b57611ee781600361447d565b611ef290600861431d565b63ffffffff1687611f048360026144a4565b81518110611f1457611f14614490565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff8116600314611f525760405162461bcd60e51b815260040161043b90614543565b5f805b6020811015611fa757611f6981601f61447d565b611f7490600861431d565b88611f808360066144a4565b81518110611f9057611f90614490565b016020015160f81c901b9190911790600101611f55565b505f805b600881101561200657611fbf81600761447d565b611fca90600861431d565b6001600160401b031689611fdf8360266144a4565b81518110611fef57611fef614490565b016020015160f81c901b9190911790600101611fab565b505f805b60088110156120655761201e81600761447d565b61202990600861431d565b6001600160401b03168a61203e83602e6144a4565b8151811061204e5761204e614490565b016020015160f81c901b919091179060010161200a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061466c8339815191529291906120bd90614034565b90501180156120ef575060015f83815260038301602052604090205460ff1660048111156120ed576120ed613fe5565b145b610a4b5760405162461bcd60e51b815260206004820152603860248201525f8051602061468c83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f805160206146ec83398151915260205260408082208151610100810190925280545f805160206146ac83398151915293929190829060ff16600581111561219c5761219c613fe5565b60058111156121ad576121ad613fe5565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561223557612235613fe5565b146122915760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461230b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123188160a001516132e0565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561235c5761235c613fe5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61242884612422816113f5565b5f611590565b5f858152600685016020526040902090915061244482826140b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612471908590600401614198565b6020604051808303815f875af115801561248d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b191906141ca565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061466c8339815191528161251f84613481565b90505f61252b82610a0e565b83549091506001600160401b0382161080159061255557508260010154816001600160401b031611155b610d125760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f6125bc6134b7565b5f805160206146ac833981519152426001600160401b0385161180156125f657506001600160401b0384166125f4426202a3006144a4565b115b6126585760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b856126af5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f8681526008820160205260409020541561271d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146127845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b61278d856132e0565b5f806127d46040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134ee565b5f828152600586016020526040902091935091506127f282826140b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061281f908590600401614198565b6020604051808303815f875af115801561283b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061285f91906141ca565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff191660018360058111156128e1576128e1613fe5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556129a2836113f5565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1260015f805160206146cc83398151915255565b5f612a116134b7565b5f612a1e6101c284613481565b90505f8051602061466c8339815191525f612a3887611469565b9050600281516005811115612a4f57612a4f613fe5565b14612aae5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612abf919061458a565b9050612acb8882611548565b5f612ad5896113f5565b90505f898983604051602001612b1d9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612b3e866132e0565b5f612b4a8b8486611590565b5f8381526004880160205260409020909150612b6682826140b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b93908590600401614198565b6020604051808303815f875af1158015612baf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bd391906141ca565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c8257612c82613fe5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610ec660015f805160206146cc83398151915255565b5f808251602714612de65760405162461bcd60e51b815260040161043b906144b7565b5f805b6002811015612e3557612dfd81600161447d565b612e0890600861431d565b61ffff16858281518110612e1e57612e1e614490565b016020015160f81c901b9190911790600101612de9565b5061ffff811615612e585760405162461bcd60e51b815260040161043b90614500565b5f805b6004811015612eb357612e6f81600361447d565b612e7a90600861431d565b63ffffffff1686612e8c8360026144a4565b81518110612e9c57612e9c614490565b016020015160f81c901b9190911790600101612e5b565b5063ffffffff8116600214612eda5760405162461bcd60e51b815260040161043b90614543565b5f805b6020811015612f2f57612ef181601f61447d565b612efc90600861431d565b87612f088360066144a4565b81518110612f1857612f18614490565b016020015160f81c901b9190911790600101612edd565b505f86602681518110612f4457612f44614490565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612f875760405162461bcd60e51b815260040161043b906144b7565b5f805b6002811015612fd657612f9e81600161447d565b612fa990600861431d565b61ffff16858281518110612fbf57612fbf614490565b016020015160f81c901b9190911790600101612f8a565b5061ffff811615612ff95760405162461bcd60e51b815260040161043b90614500565b5f805b60048110156130545761301081600361447d565b61301b90600861431d565b63ffffffff168661302d8360026144a4565b8151811061303d5761303d614490565b016020015160f81c901b9190911790600101612ffc565b5063ffffffff811660041461307b5760405162461bcd60e51b815260040161043b90614543565b5f805b60208110156130d05761309281601f61447d565b61309d90600861431d565b876130a98360066144a4565b815181106130b9576130b9614490565b016020015160f81c901b919091179060010161307e565b505f805b600881101561312f576130e881600761447d565b6130f390600861431d565b6001600160401b0316886131088360266144a4565b8151811061311857613118614490565b016020015160f81c901b91909117906001016130d4565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661318557604051631afcd79f60e31b815260040160405180910390fd5b565b61318f61313c565b613198816138a6565b6131ca606082013560808301356131b560c0850160a08601613e7e565b6131c560e0860160c087016145aa565b6138c7565b50565b6131d561313c565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132615760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613922565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146ac8339815191529060ff165f0361331e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613366908361447d565b10613382576001600160401b03841660408301528082526133a1565b8382604001818151613394919061458a565b6001600160401b03169052505b5f8260200151836040015160646133b891906145c5565b6133c291906145f0565b600285015490915060ff908116908216111561343d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613983565b5f805160206146cc8339815191528054600119016134e857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135585760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135cf5761358f81600161447d565b61359a90600861431d565b5081515f908390839081106135b1576135b1614490565b60200101906001600160f81b03191690815f1a90535060010161357b565b505f5b600481101561362d576135e681600361447d565b6135f190600861431d565b505f826135ff8360026144a4565b8151811061360f5761360f614490565b60200101906001600160f81b03191690815f1a9053506001016135d2565b505f5b602081101561368a578451816020811061364c5761364c614490565b1a60f81b8261365c8360066144a4565b8151811061366c5761366c614490565b60200101906001600160f81b03191690815f1a905350600101613630565b505f5b60208110156136ea57846020015181602081106136ac576136ac614490565b1a60f81b826136bc8360266144a4565b815181106136cc576136cc614490565b60200101906001600160f81b03191690815f1a90535060010161368d565b505f5b600881101561375e5761370181600761447d565b61370c90600861431d565b60ff1685604001516001600160401b0316901c60f81b8282604661373091906144a4565b8151811061374057613740614490565b60200101906001600160f81b03191690815f1a9053506001016136ed565b505f5b60308110156137c9578460800151818151811061378057613780614490565b01602001516001600160f81b0319168261379b83604e6144a4565b815181106137ab576137ab614490565b60200101906001600160f81b03191690815f1a905350600101613761565b505f5b600881101561383b576137e081600761447d565b6137eb90600861431d565b60608601516001600160401b0390811691161c60f81b8261380d83607e6144a4565b8151811061381d5761381d614490565b60200101906001600160f81b03191690815f1a9053506001016137cc565b5060028160405161384c9190614615565b602060405180830381855afa158015613867573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061388a91906141ca565b94909350915050565b60015f805160206146cc83398151915255565b6138ae61313c565b6138b6613ae5565b6138be613af5565b6131ca81613afd565b6138cf61313c565b5f5f8051602061466c833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f6139366001600160a01b03841683613b69565b905080515f1415801561395a5750808060200190518101906139589190614630565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139ed91906141ca565b9050613a046001600160a01b038516333086613b76565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a6c91906141ca565b9050818111613ad25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613adc828261447d565b95945050505050565b613aed61313c565b613185613bb5565b61318561313c565b613b0561313c565b80355f805160206146ac83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b4f606083016040840161464b565b600291909101805460ff191660ff90921691909117905550565b6060610ec683835f613bbd565b6040516001600160a01b038481166024830152838116604483015260648201839052613baf9186918216906323b872dd906084016132ae565b50505050565b61389361313c565b606081471015613be25760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613bfd9190614615565b5f6040518083038185875af1925050503d805f8114613c37576040519150601f19603f3d011682016040523d82523d5f602084013e613c3c565b606091505b50915091506113eb868383606082613c5c57613c5782613ca3565b610ec6565b8151158015613c7357506001600160a01b0384163b155b15613c9c57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610ec6565b805115613cb35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613cd890614034565b5f825580601f10613ce7575050565b601f0160209004905f5260205f20908101906131ca9190613d47565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613d5b575f8155600101613d48565b5090565b80151581146131ca575f80fd5b803563ffffffff81168114613d7f575f80fd5b919050565b5f805f60608486031215613d96575f80fd5b833592506020840135613da881613d5f565b9150613db660408501613d6c565b90509250925092565b5f60208284031215613dcf575f80fd5b5035919050565b6001600160a01b03811681146131ca575f80fd5b5f80828403610100811215613dfd575f80fd5b60e0811215613e0a575f80fd5b5082915060e0830135613e1c81613dd6565b809150509250929050565b5f60208284031215613e37575f80fd5b610ec682613d6c565b5f8060408385031215613e51575f80fd5b613e5a83613d6c565b946020939093013593505050565b80356001600160401b0381168114613d7f575f80fd5b5f60208284031215613e8e575f80fd5b610ec682613e68565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613ecd57613ecd613e97565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613efb57613efb613e97565b604052919050565b5f6001600160401b03821115613f1b57613f1b613e97565b50601f01601f191660200190565b5f805f8060808587031215613f3c575f80fd5b8435935060208501359250613f5360408601613e68565b915060608501356001600160401b03811115613f6d575f80fd5b8501601f81018713613f7d575f80fd5b8035613f90613f8b82613f03565b613ed3565b818152886020838501011115613fa4575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613fd6575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561402d5761402d613ff9565b5092915050565b600181811c9082168061404857607f821691505b60208210810361406657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156140915750805b601f840160051c820191505b818110156140b0575f815560010161409d565b5050505050565b81516001600160401b038111156140d0576140d0613e97565b6140e4816140de8454614034565b8461406c565b602080601f831160018114614117575f84156141005750858301515b5f19600386901b1c1916600185901b17855561416e565b5f85815260208120601f198616915b8281101561414557888601518255948401946001909101908401614126565b508582101561416257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015614190578181015183820152602001614178565b50505f910152565b602081525f82518060208401526141b6816040850160208701614176565b601f01601f19169190910160400192915050565b5f602082840312156141da575f80fd5b5051919050565b5f60208083525f84546141f381614034565b806020870152604060018084165f811461421457600181146142305761425d565b60ff19851660408a0152604084151560051b8a0101955061425d565b895f5260205f205f5b858110156142545781548b8201860152908301908801614239565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261428d5761428d61426b565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e613ff9565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613d7f81613d5f565b5f8060408385031215614397575f80fd5b82516001600160401b03808211156143ad575f80fd5b90840190606082870312156143c0575f80fd5b6143c8613eab565b825181526020808401516143db81613dd6565b828201526040840151838111156143f0575f80fd5b80850194505087601f850112614404575f80fd5b83519250614414613f8b84613f03565b8381528882858701011115614427575f80fd5b61443684838301848801614176565b8060408401525081955061444b81880161437b565b9450505050509250929050565b5f6001600160401b0380831681810361447357614473613ff9565b6001019392505050565b81810381811115610a1e57610a1e613ff9565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e613ff9565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561402d5761402d613ff9565b5f602082840312156145ba575f80fd5b8135610ec681613dd6565b6001600160401b038181168382160280821691908281146145e8576145e8613ff9565b505092915050565b5f6001600160401b03808416806146095761460961426b565b92169190910492915050565b5f8251614626818460208701614176565b9190910192915050565b5f60208284031215614640575f80fd5b8151610ec681613d5f565b5f6020828403121561465b575f80fd5b813560ff81168114610ec6575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161486538038061486583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147188061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613d84565b6102d6565b005b610128610138366004613dbf565b610761565b61017b61014b366004613dbf565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613dbf565b6108bd565b6101286101af366004613dea565b61092a565b6101c76101c2366004613dbf565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613e27565b610a24565b610128610200366004613e40565b610a4f565b61017b610213366004613e7e565b610c40565b6101c7610226366004613dbf565b610c59565b610128610239366004613dbf565b610c6d565b61012861024c366004613d84565b610cda565b61017b61025f366004613f29565b610cf5565b610128610272366004613e40565b610d1a565b61017b610285366004613fc5565b610eba565b610128610298366004613e27565b610ecd565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613dbf565b61108a565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061466c833981519152918415610328576103258285611159565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613fe5565b600481111561036b5761036b613fe5565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613fe5565b146104445760405162461bcd60e51b815260206004820152602a60248201525f8051602061468c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f8051602061468c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b3846113f5565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500613fe5565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611469565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e919061400d565b905061066a8682611548565b5f610676878584611590565b5f8c815260058a016020526040902090915061069282826140b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614198565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906141ca565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206146ac8339815191529291906107a990614034565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9613fe5565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016141e1565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906141ca565b505050565b6108c6816117ad565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061466c833981519152916005600160991b019163ee5b48eb91610878916004016141e1565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc848461187c565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361427f565b92915050565b5f610a2e82611896565b9050610a4b81606001516001600160401b03168260400151611c23565b5050565b5f8051602061466c8339815191525f610a6784611c59565b90505f80610a788360400151611e3a565b5091509150610a8685612075565b5f8581526004850160205260408120610a9e91613ccc565b5f610aa883611469565b9050816001600160401b031681608001516001600160401b03161015610ae05760405162461bcd60e51b815260040161043b90614292565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b255760405162461bcd60e51b815260040161043b906142d4565b60015f87815260038701602052604090205460ff166004811115610b4b57610b4b613fe5565b14610bb45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a5100061431d565b5f610c6382611469565b60a0015192915050565b610c7681612075565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061466c833981519152916005600160991b019163ee5b48eb91610878916004016141e1565b8115610cec57610cea8382611159565b505b6108b88361214e565b5f80610d0086612506565b9050610d0e858286866125b3565b9150505b949350505050565b5f8051602061466c8339815191525f610d3284611c59565b90505f80610d438360400151611e3a565b5091509150610d51856117ad565b5f8581526005850160205260408120610d6991613ccc565b5f610d7383611469565b9050816001600160401b031681608001516001600160401b03161015610dab5760405162461bcd60e51b815260040161043b90614292565b5f8681526003808701602052604090912001546001600160401b0380841691161115610de95760405162461bcd60e51b815260040161043b906142d4565b60035f87815260038701602052604090205460ff166004811115610e0f57610e0f613fe5565b14610e635760405162461bcd60e51b815260206004820152603160248201525f8051602061468c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f610ec6833384612a08565b9392505050565b5f805160206146ac8339815191525f610ee583611c59565b90505f80610ef68360400151612dc3565b9150915080610f585760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260058501602052604081208054610f7290614034565b9050118015610fa4575060015f83815260078601602052604090205460ff166005811115610fa257610fa2613fe5565b145b610fc05760405162461bcd60e51b815260040161043b90614334565b5f8281526005850160205260408120610fd891613ccc565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206146ac8339815191529291906110d290614034565b9050118015611104575060015f83815260078301602052604090205460ff16600581111561110257611102613fe5565b145b6111205760405162461bcd60e51b815260040161043b90614334565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016141e1565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156111a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111cb9190810190614386565b915091508061122e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061129591906141ca565b8251146112f95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b03161561136f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061137e8460400151612f64565b915091508187146113eb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206146ec8339815191526020526040812060030180545f805160206146ac833981519152916001600160401b039091169081908461143a83614458565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611471613d03565b5f8281525f805160206146ec8339815191526020526040908190208151610100810190925280545f805160206146ac833981519152929190829060ff1660058111156114bf576114bf613fe5565b60058111156114d0576114d0613fe5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206146ec833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611609576115c981600161447d565b6115d490600861431d565b5081515f908390839081106115eb576115eb614490565b60200101906001600160f81b03191690815f1a9053506001016115b5565b505f5b600481101561166c5761162081600361447d565b61162b90600861431d565b6001901c60f81b8261163e8360026144a4565b8151811061164e5761164e614490565b60200101906001600160f81b03191690815f1a90535060010161160c565b505f5b60208110156116ce5761168381601f61447d565b61168e90600861431d565b86901c60f81b826116a08360066144a4565b815181106116b0576116b0614490565b60200101906001600160f81b03191690815f1a90535060010161166f565b505f5b6008811015611739576116e581600761447d565b6116f090600861431d565b6001600160401b038616901c60f81b8261170b8360266144a4565b8151811061171b5761171b614490565b60200101906001600160f81b03191690815f1a9053506001016116d1565b505f5b60088110156117a45761175081600761447d565b61175b90600861431d565b6001600160401b038516901c60f81b8261177683602e6144a4565b8151811061178657611786614490565b60200101906001600160f81b03191690815f1a90535060010161173c565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061466c8339815191529291906117f590614034565b9050118015611827575060035f83815260038301602052604090205460ff16600481111561182557611825613fe5565b145b610a4b5760405162461bcd60e51b815260206004820152603360248201525f8051602061468c83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b61188461313c565b61188d82613187565b610a4b816131cd565b61189e613d03565b5f805160206146ac8339815191525f6118b684611c59565b90505f806118c78360400151612dc3565b91509150801561192c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff16600581111561195e5761195e613fe5565b600581111561196f5761196f613fe5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156119f6576119f6613fe5565b1480611a145750600182516005811115611a1257611a12613fe5565b145b611a735760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611a8857611a88613fe5565b03611aaf57505f8381526006860160205260408120600491611aaa9190613ccc565b611ab3565b5060055b6020808301515f90815260088801909152604081205581816005811115611adc57611adc613fe5565b90816005811115611aef57611aef613fe5565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611b2357611b23613fe5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611bee57611bee613fe5565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a4b906001600160a01b03168284613281565b60408051606080820183525f8083526020830181905292820152905f805160206146ac8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611cce573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cf59190810190614386565b9150915080611d5c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611dbf5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611e325760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611e5e5760405162461bcd60e51b815260040161043b906144b7565b5f805b6002811015611ead57611e7581600161447d565b611e8090600861431d565b61ffff16868281518110611e9657611e96614490565b016020015160f81c901b9190911790600101611e61565b5061ffff811615611ed05760405162461bcd60e51b815260040161043b90614500565b5f805b6004811015611f2b57611ee781600361447d565b611ef290600861431d565b63ffffffff1687611f048360026144a4565b81518110611f1457611f14614490565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff8116600314611f525760405162461bcd60e51b815260040161043b90614543565b5f805b6020811015611fa757611f6981601f61447d565b611f7490600861431d565b88611f808360066144a4565b81518110611f9057611f90614490565b016020015160f81c901b9190911790600101611f55565b505f805b600881101561200657611fbf81600761447d565b611fca90600861431d565b6001600160401b031689611fdf8360266144a4565b81518110611fef57611fef614490565b016020015160f81c901b9190911790600101611fab565b505f805b60088110156120655761201e81600761447d565b61202990600861431d565b6001600160401b03168a61203e83602e6144a4565b8151811061204e5761204e614490565b016020015160f81c901b919091179060010161200a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061466c8339815191529291906120bd90614034565b90501180156120ef575060015f83815260038301602052604090205460ff1660048111156120ed576120ed613fe5565b145b610a4b5760405162461bcd60e51b815260206004820152603860248201525f8051602061468c83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f805160206146ec83398151915260205260408082208151610100810190925280545f805160206146ac83398151915293929190829060ff16600581111561219c5761219c613fe5565b60058111156121ad576121ad613fe5565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561223557612235613fe5565b146122915760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461230b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123188160a001516132e0565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561235c5761235c613fe5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61242884612422816113f5565b5f611590565b5f858152600685016020526040902090915061244482826140b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612471908590600401614198565b6020604051808303815f875af115801561248d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b191906141ca565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061466c8339815191528161251f84613481565b90505f61252b82610a0e565b83549091506001600160401b0382161080159061255557508260010154816001600160401b031611155b610d125760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f6125bc6134b7565b5f805160206146ac833981519152426001600160401b0385161180156125f657506001600160401b0384166125f4426202a3006144a4565b115b6126585760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b856126af5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f8681526008820160205260409020541561271d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146127845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b61278d856132e0565b5f806127d46040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134ee565b5f828152600586016020526040902091935091506127f282826140b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061281f908590600401614198565b6020604051808303815f875af115801561283b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061285f91906141ca565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff191660018360058111156128e1576128e1613fe5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556129a2836113f5565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1260015f805160206146cc83398151915255565b5f612a116134b7565b5f612a1e6101c284613481565b90505f8051602061466c8339815191525f612a3887611469565b9050600281516005811115612a4f57612a4f613fe5565b14612aae5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612abf919061458a565b9050612acb8882611548565b5f612ad5896113f5565b90505f898983604051602001612b1d9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612b3e866132e0565b5f612b4a8b8486611590565b5f8381526004880160205260409020909150612b6682826140b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b93908590600401614198565b6020604051808303815f875af1158015612baf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bd391906141ca565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c8257612c82613fe5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610ec660015f805160206146cc83398151915255565b5f808251602714612de65760405162461bcd60e51b815260040161043b906144b7565b5f805b6002811015612e3557612dfd81600161447d565b612e0890600861431d565b61ffff16858281518110612e1e57612e1e614490565b016020015160f81c901b9190911790600101612de9565b5061ffff811615612e585760405162461bcd60e51b815260040161043b90614500565b5f805b6004811015612eb357612e6f81600361447d565b612e7a90600861431d565b63ffffffff1686612e8c8360026144a4565b81518110612e9c57612e9c614490565b016020015160f81c901b9190911790600101612e5b565b5063ffffffff8116600214612eda5760405162461bcd60e51b815260040161043b90614543565b5f805b6020811015612f2f57612ef181601f61447d565b612efc90600861431d565b87612f088360066144a4565b81518110612f1857612f18614490565b016020015160f81c901b9190911790600101612edd565b505f86602681518110612f4457612f44614490565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612f875760405162461bcd60e51b815260040161043b906144b7565b5f805b6002811015612fd657612f9e81600161447d565b612fa990600861431d565b61ffff16858281518110612fbf57612fbf614490565b016020015160f81c901b9190911790600101612f8a565b5061ffff811615612ff95760405162461bcd60e51b815260040161043b90614500565b5f805b60048110156130545761301081600361447d565b61301b90600861431d565b63ffffffff168661302d8360026144a4565b8151811061303d5761303d614490565b016020015160f81c901b9190911790600101612ffc565b5063ffffffff811660041461307b5760405162461bcd60e51b815260040161043b90614543565b5f805b60208110156130d05761309281601f61447d565b61309d90600861431d565b876130a98360066144a4565b815181106130b9576130b9614490565b016020015160f81c901b919091179060010161307e565b505f805b600881101561312f576130e881600761447d565b6130f390600861431d565b6001600160401b0316886131088360266144a4565b8151811061311857613118614490565b016020015160f81c901b91909117906001016130d4565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661318557604051631afcd79f60e31b815260040160405180910390fd5b565b61318f61313c565b613198816138a6565b6131ca606082013560808301356131b560c0850160a08601613e7e565b6131c560e0860160c087016145aa565b6138c7565b50565b6131d561313c565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132615760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613922565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146ac8339815191529060ff165f0361331e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613366908361447d565b10613382576001600160401b03841660408301528082526133a1565b8382604001818151613394919061458a565b6001600160401b03169052505b5f8260200151836040015160646133b891906145c5565b6133c291906145f0565b600285015490915060ff908116908216111561343d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613983565b5f805160206146cc8339815191528054600119016134e857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135585760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135cf5761358f81600161447d565b61359a90600861431d565b5081515f908390839081106135b1576135b1614490565b60200101906001600160f81b03191690815f1a90535060010161357b565b505f5b600481101561362d576135e681600361447d565b6135f190600861431d565b505f826135ff8360026144a4565b8151811061360f5761360f614490565b60200101906001600160f81b03191690815f1a9053506001016135d2565b505f5b602081101561368a578451816020811061364c5761364c614490565b1a60f81b8261365c8360066144a4565b8151811061366c5761366c614490565b60200101906001600160f81b03191690815f1a905350600101613630565b505f5b60208110156136ea57846020015181602081106136ac576136ac614490565b1a60f81b826136bc8360266144a4565b815181106136cc576136cc614490565b60200101906001600160f81b03191690815f1a90535060010161368d565b505f5b600881101561375e5761370181600761447d565b61370c90600861431d565b60ff1685604001516001600160401b0316901c60f81b8282604661373091906144a4565b8151811061374057613740614490565b60200101906001600160f81b03191690815f1a9053506001016136ed565b505f5b60308110156137c9578460800151818151811061378057613780614490565b01602001516001600160f81b0319168261379b83604e6144a4565b815181106137ab576137ab614490565b60200101906001600160f81b03191690815f1a905350600101613761565b505f5b600881101561383b576137e081600761447d565b6137eb90600861431d565b60608601516001600160401b0390811691161c60f81b8261380d83607e6144a4565b8151811061381d5761381d614490565b60200101906001600160f81b03191690815f1a9053506001016137cc565b5060028160405161384c9190614615565b602060405180830381855afa158015613867573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061388a91906141ca565b94909350915050565b60015f805160206146cc83398151915255565b6138ae61313c565b6138b6613ae5565b6138be613af5565b6131ca81613afd565b6138cf61313c565b5f5f8051602061466c833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f6139366001600160a01b03841683613b69565b905080515f1415801561395a5750808060200190518101906139589190614630565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139ed91906141ca565b9050613a046001600160a01b038516333086613b76565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a6c91906141ca565b9050818111613ad25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613adc828261447d565b95945050505050565b613aed61313c565b613185613bb5565b61318561313c565b613b0561313c565b80355f805160206146ac83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b4f606083016040840161464b565b600291909101805460ff191660ff90921691909117905550565b6060610ec683835f613bbd565b6040516001600160a01b038481166024830152838116604483015260648201839052613baf9186918216906323b872dd906084016132ae565b50505050565b61389361313c565b606081471015613be25760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613bfd9190614615565b5f6040518083038185875af1925050503d805f8114613c37576040519150601f19603f3d011682016040523d82523d5f602084013e613c3c565b606091505b50915091506113eb868383606082613c5c57613c5782613ca3565b610ec6565b8151158015613c7357506001600160a01b0384163b155b15613c9c57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610ec6565b805115613cb35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613cd890614034565b5f825580601f10613ce7575050565b601f0160209004905f5260205f20908101906131ca9190613d47565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613d5b575f8155600101613d48565b5090565b80151581146131ca575f80fd5b803563ffffffff81168114613d7f575f80fd5b919050565b5f805f60608486031215613d96575f80fd5b833592506020840135613da881613d5f565b9150613db660408501613d6c565b90509250925092565b5f60208284031215613dcf575f80fd5b5035919050565b6001600160a01b03811681146131ca575f80fd5b5f80828403610100811215613dfd575f80fd5b60e0811215613e0a575f80fd5b5082915060e0830135613e1c81613dd6565b809150509250929050565b5f60208284031215613e37575f80fd5b610ec682613d6c565b5f8060408385031215613e51575f80fd5b613e5a83613d6c565b946020939093013593505050565b80356001600160401b0381168114613d7f575f80fd5b5f60208284031215613e8e575f80fd5b610ec682613e68565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613ecd57613ecd613e97565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613efb57613efb613e97565b604052919050565b5f6001600160401b03821115613f1b57613f1b613e97565b50601f01601f191660200190565b5f805f8060808587031215613f3c575f80fd5b8435935060208501359250613f5360408601613e68565b915060608501356001600160401b03811115613f6d575f80fd5b8501601f81018713613f7d575f80fd5b8035613f90613f8b82613f03565b613ed3565b818152886020838501011115613fa4575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613fd6575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561402d5761402d613ff9565b5092915050565b600181811c9082168061404857607f821691505b60208210810361406657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156140915750805b601f840160051c820191505b818110156140b0575f815560010161409d565b5050505050565b81516001600160401b038111156140d0576140d0613e97565b6140e4816140de8454614034565b8461406c565b602080601f831160018114614117575f84156141005750858301515b5f19600386901b1c1916600185901b17855561416e565b5f85815260208120601f198616915b8281101561414557888601518255948401946001909101908401614126565b508582101561416257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015614190578181015183820152602001614178565b50505f910152565b602081525f82518060208401526141b6816040850160208701614176565b601f01601f19169190910160400192915050565b5f602082840312156141da575f80fd5b5051919050565b5f60208083525f84546141f381614034565b806020870152604060018084165f811461421457600181146142305761425d565b60ff19851660408a0152604084151560051b8a0101955061425d565b895f5260205f205f5b858110156142545781548b8201860152908301908801614239565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261428d5761428d61426b565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e613ff9565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613d7f81613d5f565b5f8060408385031215614397575f80fd5b82516001600160401b03808211156143ad575f80fd5b90840190606082870312156143c0575f80fd5b6143c8613eab565b825181526020808401516143db81613dd6565b828201526040840151838111156143f0575f80fd5b80850194505087601f850112614404575f80fd5b83519250614414613f8b84613f03565b8381528882858701011115614427575f80fd5b61443684838301848801614176565b8060408401525081955061444b81880161437b565b9450505050509250929050565b5f6001600160401b0380831681810361447357614473613ff9565b6001019392505050565b81810381811115610a1e57610a1e613ff9565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e613ff9565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561402d5761402d613ff9565b5f602082840312156145ba575f80fd5b8135610ec681613dd6565b6001600160401b038181168382160280821691908281146145e8576145e8613ff9565b505092915050565b5f6001600160401b03808416806146095761460961426b565b92169190910492915050565b5f8251614626818460208701614176565b9190910192915050565b5f60208284031215614640575f80fd5b8151610ec681613d5f565b5f6020828403121561465b575f80fd5b813560ff81168114610ec6575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 47d994d9f..2376dabec 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161449638038061449683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143498061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613a02565b610389565b005b348015610134575f80fd5b50610127610143366004613a3d565b61046b565b348015610153575f80fd5b50610127610162366004613a78565b6108f6565b348015610172575f80fd5b506101b1610181366004613a78565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613a78565b610a52565b3480156101ee575f80fd5b506102026101fd366004613a78565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613a8f565b610ad5565b348015610244575f80fd5b50610127610253366004613aa8565b610b00565b348015610263575f80fd5b506101b1610272366004613ae6565b610cf1565b348015610282575f80fd5b50610202610291366004613a78565b610d0a565b3480156102a1575f80fd5b506101276102b0366004613a78565b610d1e565b3480156102c0575f80fd5b506101276102cf366004613a3d565b610d8b565b3480156102df575f80fd5b506101276102ee366004613aa8565b610da6565b3480156102fe575f80fd5b5061012761030d366004613a8f565b610f46565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613a78565b611103565b6101b1610371366004613a78565b6111d2565b6101b1610384366004613b91565b6111de565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611202565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061429d8339815191529184156104bd576104ba8285611216565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613c23565b600481111561050057610500613c23565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613c23565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206142bd8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206142bd8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f610648846114b2565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613c23565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076785611526565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613c4b565b90506107ff8682611605565b5f61080b87858461164d565b5f8c815260058a01602052604090209091506108278282613cef565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613dd0565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613e02565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206142dd83398151915292919061093e90613c72565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613c23565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613e19565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613e02565b505050565b610a5b8161186a565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061429d833981519152916005600160991b019163ee5b48eb91610a0d91600401613e19565b5f610acf64e8d4a5100083613eb7565b92915050565b5f610adf82611939565b9050610afc8160a001516001600160401b03168260400151611cc6565b5050565b5f8051602061429d8339815191525f610b1884611cd9565b90505f80610b298360400151611eba565b5091509150610b37856120f5565b5f8581526004850160205260408120610b4f9161396f565b5f610b5983611526565b9050816001600160401b031681608001516001600160401b03161015610b915760405162461bcd60e51b81526004016105d090613eca565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bd65760405162461bcd60e51b81526004016105d090613f0c565b60015f87815260038701602052604090205460ff166004811115610bfc57610bfc613c23565b14610c655760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000613f55565b5f610d1482611526565b60a0015192915050565b610d27816120f5565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061429d833981519152916005600160991b019163ee5b48eb91610a0d91600401613e19565b8115610d9d57610d9b8382611216565b505b610a4d836121ce565b5f8051602061429d8339815191525f610dbe84611cd9565b90505f80610dcf8360400151611eba565b5091509150610ddd8561186a565b5f8581526005850160205260408120610df59161396f565b5f610dff83611526565b9050816001600160401b031681608001516001600160401b03161015610e375760405162461bcd60e51b81526004016105d090613eca565b5f8681526003808701602052604090912001546001600160401b0380841691161115610e755760405162461bcd60e51b81526004016105d090613f0c565b60035f87815260038701602052604090205460ff166004811115610e9b57610e9b613c23565b14610eef5760405162461bcd60e51b815260206004820152603160248201525f805160206142bd8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142dd8339815191525f610f5e83611cd9565b90505f80610f6f8360400151612586565b9150915080610fd15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f82815260058501602052604081208054610feb90613c72565b905011801561101d575060015f83815260078601602052604090205460ff16600581111561101b5761101b613c23565b145b6110395760405162461bcd60e51b81526004016105d090613f6c565b5f82815260058501602052604081206110519161396f565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142dd83398151915292919061114b90613c72565b905011801561117d575060015f83815260078301602052604090205460ff16600581111561117b5761117b613c23565b145b6111995760405162461bcd60e51b81526004016105d090613f6c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613e19565b5f610acf823334612727565b5f806111e934612adf565b90506111f785828686612b89565b9150505b9392505050565b61120a612fde565b61121381613029565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611261573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112889190810190613fd2565b91509150806112eb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113529190613e02565b8251146113b65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b03161561142c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f8061143b846040015161306c565b915091508187146114a85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f8051602061431d8339815191526020526040812060030180545f805160206142dd833981519152916001600160401b03909116908190846114f7836140a4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61152e6139a6565b5f8281525f8051602061431d8339815191526020526040908190208151610100810190925280545f805160206142dd833981519152929190829060ff16600581111561157c5761157c613c23565b600581111561158d5761158d613c23565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061431d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116c6576116868160016140c9565b611691906008613f55565b5081515f908390839081106116a8576116a86140dc565b60200101906001600160f81b03191690815f1a905350600101611672565b505f5b6004811015611729576116dd8160036140c9565b6116e8906008613f55565b6001901c60f81b826116fb8360026140f0565b8151811061170b5761170b6140dc565b60200101906001600160f81b03191690815f1a9053506001016116c9565b505f5b602081101561178b5761174081601f6140c9565b61174b906008613f55565b86901c60f81b8261175d8360066140f0565b8151811061176d5761176d6140dc565b60200101906001600160f81b03191690815f1a90535060010161172c565b505f5b60088110156117f6576117a28160076140c9565b6117ad906008613f55565b6001600160401b038616901c60f81b826117c88360266140f0565b815181106117d8576117d86140dc565b60200101906001600160f81b03191690815f1a90535060010161178e565b505f5b60088110156118615761180d8160076140c9565b611818906008613f55565b6001600160401b038516901c60f81b8261183383602e6140f0565b81518110611843576118436140dc565b60200101906001600160f81b03191690815f1a9053506001016117f9565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061429d8339815191529291906118b290613c72565b90501180156118e4575060035f83815260038301602052604090205460ff1660048111156118e2576118e2613c23565b145b610afc5760405162461bcd60e51b815260206004820152603360248201525f805160206142bd83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b6119416139a6565b5f805160206142dd8339815191525f61195984611cd9565b90505f8061196a8360400151612586565b9150915080156119cf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611a0157611a01613c23565b6005811115611a1257611a12613c23565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a9957611a99613c23565b1480611ab75750600182516005811115611ab557611ab5613c23565b145b611b165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611b2b57611b2b613c23565b03611b5257505f8381526006860160205260408120600491611b4d919061396f565b611b56565b5060055b6020808301515f90815260088801909152604081205581816005811115611b7f57611b7f613c23565b90816005811115611b9257611b92613c23565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611bc657611bc6613c23565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c9157611c91613c23565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610afc6001600160a01b03821683613244565b60408051606080820183525f8083526020830181905292820152905f805160206142dd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d4e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d759190810190613fd2565b9150915080611ddc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611e3f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611eb25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f8351603614611ede5760405162461bcd60e51b81526004016105d090614103565b5f805b6002811015611f2d57611ef58160016140c9565b611f00906008613f55565b61ffff16868281518110611f1657611f166140dc565b016020015160f81c901b9190911790600101611ee1565b5061ffff811615611f505760405162461bcd60e51b81526004016105d09061414c565b5f805b6004811015611fab57611f678160036140c9565b611f72906008613f55565b63ffffffff1687611f848360026140f0565b81518110611f9457611f946140dc565b016020015160f81c901b9190911790600101611f53565b5063ffffffff8116600314611fd25760405162461bcd60e51b81526004016105d09061418f565b5f805b602081101561202757611fe981601f6140c9565b611ff4906008613f55565b886120008360066140f0565b81518110612010576120106140dc565b016020015160f81c901b9190911790600101611fd5565b505f805b60088110156120865761203f8160076140c9565b61204a906008613f55565b6001600160401b03168961205f8360266140f0565b8151811061206f5761206f6140dc565b016020015160f81c901b919091179060010161202b565b505f805b60088110156120e55761209e8160076140c9565b6120a9906008613f55565b6001600160401b03168a6120be83602e6140f0565b815181106120ce576120ce6140dc565b016020015160f81c901b919091179060010161208a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061429d83398151915292919061213d90613c72565b905011801561216f575060015f83815260038301602052604090205460ff16600481111561216d5761216d613c23565b145b610afc5760405162461bcd60e51b815260206004820152603860248201525f805160206142bd83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061431d83398151915260205260408082208151610100810190925280545f805160206142dd83398151915293929190829060ff16600581111561221c5761221c613c23565b600581111561222d5761222d613c23565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122b5576122b5613c23565b146123115760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461238b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6123988160a001516132d7565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123dc576123dc613c23565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124a8846124a2816114b2565b5f61164d565b5f85815260068501602052604090209091506124c48282613cef565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124f1908590600401613dd0565b6020604051808303815f875af115801561250d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125319190613e02565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146125a95760405162461bcd60e51b81526004016105d090614103565b5f805b60028110156125f8576125c08160016140c9565b6125cb906008613f55565b61ffff168582815181106125e1576125e16140dc565b016020015160f81c901b91909117906001016125ac565b5061ffff81161561261b5760405162461bcd60e51b81526004016105d09061414c565b5f805b6004811015612676576126328160036140c9565b61263d906008613f55565b63ffffffff168661264f8360026140f0565b8151811061265f5761265f6140dc565b016020015160f81c901b919091179060010161261e565b5063ffffffff811660021461269d5760405162461bcd60e51b81526004016105d09061418f565b5f805b60208110156126f2576126b481601f6140c9565b6126bf906008613f55565b876126cb8360066140f0565b815181106126db576126db6140dc565b016020015160f81c901b91909117906001016126a0565b505f86602681518110612707576127076140dc565b016020015191976001600160f81b03199092161515965090945050505050565b5f612730613478565b5f61273a83610abf565b90505f8051602061429d8339815191525f61275487611526565b905060028151600581111561276b5761276b613c23565b146127ca5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516127db91906141d6565b90506127e78882611605565b5f6127f1896114b2565b90505f8989836040516020016128399392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061285a866132d7565b5f6128668b848661164d565b5f83815260048801602052604090209091506128828282613cef565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128af908590600401613dd0565b6020604051808303815f875af11580156128cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ef9190613e02565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561299e5761299e613c23565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506111fb60015f805160206142fd83398151915255565b5f5f8051602061429d8339815191528282612af982610abf565b83549091506001600160401b03821610801590612b2357508260010154816001600160401b031611155b612b815760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612b92613478565b5f805160206142dd833981519152426001600160401b038516118015612bcc57506001600160401b038416612bca426202a3006140f0565b115b612c2e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612c855760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612cf35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612d5a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612d63856132d7565b5f80612daa6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134c2565b5f82815260058601602052604090209193509150612dc88282613cef565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612df5908590600401613dd0565b6020604051808303815f875af1158015612e11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e359190613e02565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612eb757612eb7613c23565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612f78836114b2565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b8160015f805160206142fd83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661302757604051631afcd79f60e31b815260040160405180910390fd5b565b613031612fde565b61303a81613867565b6112136060820135608083013561305760c0850160a08601613ae6565b61306760e0860160c087016141f6565b613888565b5f808251602e1461308f5760405162461bcd60e51b81526004016105d090614103565b5f805b60028110156130de576130a68160016140c9565b6130b1906008613f55565b61ffff168582815181106130c7576130c76140dc565b016020015160f81c901b9190911790600101613092565b5061ffff8116156131015760405162461bcd60e51b81526004016105d09061414c565b5f805b600481101561315c576131188160036140c9565b613123906008613f55565b63ffffffff16866131358360026140f0565b81518110613145576131456140dc565b016020015160f81c901b9190911790600101613104565b5063ffffffff81166004146131835760405162461bcd60e51b81526004016105d09061418f565b5f805b60208110156131d85761319a81601f6140c9565b6131a5906008613f55565b876131b18360066140f0565b815181106131c1576131c16140dc565b016020015160f81c901b9190911790600101613186565b505f805b6008811015613237576131f08160076140c9565b6131fb906008613f55565b6001600160401b0316886132108360266140f0565b81518110613220576132206140dc565b016020015160f81c901b91909117906001016131dc565b5090969095509350505050565b804710156132675760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146132b0576040519150601f19603f3d011682016040523d82523d5f602084013e6132b5565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142dd8339815191529060ff165f03613315575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061335d90836140c9565b10613379576001600160401b0384166040830152808252613398565b838260400181815161338b91906141d6565b6001600160401b03169052505b5f8260200151836040015160646133af9190614211565b6133b9919061423c565b600285015490915060ff90811690821611156134345760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206142fd8339815191528054600119016134a957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206142fd83398151915255565b5f606082608001515160301461352c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135a3576135638160016140c9565b61356e906008613f55565b5081515f90839083908110613585576135856140dc565b60200101906001600160f81b03191690815f1a90535060010161354f565b505f5b6004811015613601576135ba8160036140c9565b6135c5906008613f55565b505f826135d38360026140f0565b815181106135e3576135e36140dc565b60200101906001600160f81b03191690815f1a9053506001016135a6565b505f5b602081101561365e5784518160208110613620576136206140dc565b1a60f81b826136308360066140f0565b81518110613640576136406140dc565b60200101906001600160f81b03191690815f1a905350600101613604565b505f5b60208110156136be5784602001518160208110613680576136806140dc565b1a60f81b826136908360266140f0565b815181106136a0576136a06140dc565b60200101906001600160f81b03191690815f1a905350600101613661565b505f5b6008811015613732576136d58160076140c9565b6136e0906008613f55565b60ff1685604001516001600160401b0316901c60f81b8282604661370491906140f0565b81518110613714576137146140dc565b60200101906001600160f81b03191690815f1a9053506001016136c1565b505f5b603081101561379d5784608001518181518110613754576137546140dc565b01602001516001600160f81b0319168261376f83604e6140f0565b8151811061377f5761377f6140dc565b60200101906001600160f81b03191690815f1a905350600101613735565b505f5b600881101561380f576137b48160076140c9565b6137bf906008613f55565b60608601516001600160401b0390811691161c60f81b826137e183607e6140f0565b815181106137f1576137f16140dc565b60200101906001600160f81b03191690815f1a9053506001016137a0565b506002816040516138209190614261565b602060405180830381855afa15801561383b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061385e9190613e02565b94909350915050565b61386f612fde565b6138776138e3565b61387f6138f3565b611213816138fb565b613890612fde565b5f5f8051602061429d833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6138eb612fde565b613027613967565b613027612fde565b613903612fde565b80355f805160206142dd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561394d606083016040840161427c565b600291909101805460ff191660ff90921691909117905550565b6134af612fde565b50805461397b90613c72565b5f825580601f1061398a575050565b601f0160209004905f5260205f209081019061121391906139ea565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156139fe575f81556001016139eb565b5090565b5f60e08284031215613a12575f80fd5b50919050565b8015158114611213575f80fd5b803563ffffffff81168114613a38575f80fd5b919050565b5f805f60608486031215613a4f575f80fd5b833592506020840135613a6181613a18565b9150613a6f60408501613a25565b90509250925092565b5f60208284031215613a88575f80fd5b5035919050565b5f60208284031215613a9f575f80fd5b6111fb82613a25565b5f8060408385031215613ab9575f80fd5b613ac283613a25565b946020939093013593505050565b80356001600160401b0381168114613a38575f80fd5b5f60208284031215613af6575f80fd5b6111fb82613ad0565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b3557613b35613aff565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b6357613b63613aff565b604052919050565b5f6001600160401b03821115613b8357613b83613aff565b50601f01601f191660200190565b5f805f60608486031215613ba3575f80fd5b83359250613bb360208501613ad0565b915060408401356001600160401b03811115613bcd575f80fd5b8401601f81018613613bdd575f80fd5b8035613bf0613beb82613b6b565b613b3b565b818152876020838501011115613c04575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613c6b57613c6b613c37565b5092915050565b600181811c90821680613c8657607f821691505b602082108103613a1257634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613cc95750805b601f840160051c820191505b81811015613ce8575f8155600101613cd5565b5050505050565b81516001600160401b03811115613d0857613d08613aff565b613d1c81613d168454613c72565b84613ca4565b602080601f831160018114613d4f575f8415613d385750858301515b5f19600386901b1c1916600185901b178555613da6565b5f85815260208120601f198616915b82811015613d7d57888601518255948401946001909101908401613d5e565b5085821015613d9a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613dc8578181015183820152602001613db0565b50505f910152565b602081525f8251806020840152613dee816040850160208701613dae565b601f01601f19169190910160400192915050565b5f60208284031215613e12575f80fd5b5051919050565b5f60208083525f8454613e2b81613c72565b806020870152604060018084165f8114613e4c5760018114613e6857613e95565b60ff19851660408a0152604084151560051b8a01019550613e95565b895f5260205f205f5b85811015613e8c5781548b8201860152908301908801613e71565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613ec557613ec5613ea3565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613c37565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611213575f80fd5b8051613a3881613a18565b5f8060408385031215613fe3575f80fd5b82516001600160401b0380821115613ff9575f80fd5b908401906060828703121561400c575f80fd5b614014613b13565b8251815260208084015161402781613fb3565b8282015260408401518381111561403c575f80fd5b80850194505087601f850112614050575f80fd5b83519250614060613beb84613b6b565b8381528882858701011115614073575f80fd5b61408284838301848801613dae565b80604084015250819550614097818801613fc7565b9450505050509250929050565b5f6001600160401b038083168181036140bf576140bf613c37565b6001019392505050565b81810381811115610acf57610acf613c37565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613c37565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613c6b57613c6b613c37565b5f60208284031215614206575f80fd5b81356111fb81613fb3565b6001600160401b0381811683821602808216919082811461423457614234613c37565b505092915050565b5f6001600160401b038084168061425557614255613ea3565b92169190910492915050565b5f8251614272818460208701613dae565b9190910192915050565b5f6020828403121561428c575f80fd5b813560ff811681146111fb575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161449638038061449683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143498061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613a02565b610389565b005b348015610134575f80fd5b50610127610143366004613a3d565b61046b565b348015610153575f80fd5b50610127610162366004613a78565b6108f6565b348015610172575f80fd5b506101b1610181366004613a78565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613a78565b610a52565b3480156101ee575f80fd5b506102026101fd366004613a78565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613a8f565b610ad5565b348015610244575f80fd5b50610127610253366004613aa8565b610b00565b348015610263575f80fd5b506101b1610272366004613ae6565b610cf1565b348015610282575f80fd5b50610202610291366004613a78565b610d0a565b3480156102a1575f80fd5b506101276102b0366004613a78565b610d1e565b3480156102c0575f80fd5b506101276102cf366004613a3d565b610d8b565b3480156102df575f80fd5b506101276102ee366004613aa8565b610da6565b3480156102fe575f80fd5b5061012761030d366004613a8f565b610f46565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613a78565b611103565b6101b1610371366004613a78565b6111d2565b6101b1610384366004613b91565b6111de565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611202565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061429d8339815191529184156104bd576104ba8285611216565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613c23565b600481111561050057610500613c23565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613c23565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206142bd8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206142bd8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f610648846114b2565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613c23565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076785611526565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613c4b565b90506107ff8682611605565b5f61080b87858461164d565b5f8c815260058a01602052604090209091506108278282613cef565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613dd0565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613e02565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206142dd83398151915292919061093e90613c72565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613c23565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613e19565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613e02565b505050565b610a5b8161186a565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061429d833981519152916005600160991b019163ee5b48eb91610a0d91600401613e19565b5f610acf64e8d4a5100083613eb7565b92915050565b5f610adf82611939565b9050610afc81606001516001600160401b03168260400151611cc6565b5050565b5f8051602061429d8339815191525f610b1884611cd9565b90505f80610b298360400151611eba565b5091509150610b37856120f5565b5f8581526004850160205260408120610b4f9161396f565b5f610b5983611526565b9050816001600160401b031681608001516001600160401b03161015610b915760405162461bcd60e51b81526004016105d090613eca565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bd65760405162461bcd60e51b81526004016105d090613f0c565b60015f87815260038701602052604090205460ff166004811115610bfc57610bfc613c23565b14610c655760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000613f55565b5f610d1482611526565b60a0015192915050565b610d27816120f5565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061429d833981519152916005600160991b019163ee5b48eb91610a0d91600401613e19565b8115610d9d57610d9b8382611216565b505b610a4d836121ce565b5f8051602061429d8339815191525f610dbe84611cd9565b90505f80610dcf8360400151611eba565b5091509150610ddd8561186a565b5f8581526005850160205260408120610df59161396f565b5f610dff83611526565b9050816001600160401b031681608001516001600160401b03161015610e375760405162461bcd60e51b81526004016105d090613eca565b5f8681526003808701602052604090912001546001600160401b0380841691161115610e755760405162461bcd60e51b81526004016105d090613f0c565b60035f87815260038701602052604090205460ff166004811115610e9b57610e9b613c23565b14610eef5760405162461bcd60e51b815260206004820152603160248201525f805160206142bd8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142dd8339815191525f610f5e83611cd9565b90505f80610f6f8360400151612586565b9150915080610fd15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f82815260058501602052604081208054610feb90613c72565b905011801561101d575060015f83815260078601602052604090205460ff16600581111561101b5761101b613c23565b145b6110395760405162461bcd60e51b81526004016105d090613f6c565b5f82815260058501602052604081206110519161396f565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142dd83398151915292919061114b90613c72565b905011801561117d575060015f83815260078301602052604090205460ff16600581111561117b5761117b613c23565b145b6111995760405162461bcd60e51b81526004016105d090613f6c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613e19565b5f610acf823334612727565b5f806111e934612adf565b90506111f785828686612b89565b9150505b9392505050565b61120a612fde565b61121381613029565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611261573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112889190810190613fd2565b91509150806112eb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113529190613e02565b8251146113b65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b03161561142c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f8061143b846040015161306c565b915091508187146114a85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f8051602061431d8339815191526020526040812060030180545f805160206142dd833981519152916001600160401b03909116908190846114f7836140a4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61152e6139a6565b5f8281525f8051602061431d8339815191526020526040908190208151610100810190925280545f805160206142dd833981519152929190829060ff16600581111561157c5761157c613c23565b600581111561158d5761158d613c23565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061431d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116c6576116868160016140c9565b611691906008613f55565b5081515f908390839081106116a8576116a86140dc565b60200101906001600160f81b03191690815f1a905350600101611672565b505f5b6004811015611729576116dd8160036140c9565b6116e8906008613f55565b6001901c60f81b826116fb8360026140f0565b8151811061170b5761170b6140dc565b60200101906001600160f81b03191690815f1a9053506001016116c9565b505f5b602081101561178b5761174081601f6140c9565b61174b906008613f55565b86901c60f81b8261175d8360066140f0565b8151811061176d5761176d6140dc565b60200101906001600160f81b03191690815f1a90535060010161172c565b505f5b60088110156117f6576117a28160076140c9565b6117ad906008613f55565b6001600160401b038616901c60f81b826117c88360266140f0565b815181106117d8576117d86140dc565b60200101906001600160f81b03191690815f1a90535060010161178e565b505f5b60088110156118615761180d8160076140c9565b611818906008613f55565b6001600160401b038516901c60f81b8261183383602e6140f0565b81518110611843576118436140dc565b60200101906001600160f81b03191690815f1a9053506001016117f9565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061429d8339815191529291906118b290613c72565b90501180156118e4575060035f83815260038301602052604090205460ff1660048111156118e2576118e2613c23565b145b610afc5760405162461bcd60e51b815260206004820152603360248201525f805160206142bd83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b6119416139a6565b5f805160206142dd8339815191525f61195984611cd9565b90505f8061196a8360400151612586565b9150915080156119cf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611a0157611a01613c23565b6005811115611a1257611a12613c23565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a9957611a99613c23565b1480611ab75750600182516005811115611ab557611ab5613c23565b145b611b165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611b2b57611b2b613c23565b03611b5257505f8381526006860160205260408120600491611b4d919061396f565b611b56565b5060055b6020808301515f90815260088801909152604081205581816005811115611b7f57611b7f613c23565b90816005811115611b9257611b92613c23565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611bc657611bc6613c23565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c9157611c91613c23565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610afc6001600160a01b03821683613244565b60408051606080820183525f8083526020830181905292820152905f805160206142dd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d4e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d759190810190613fd2565b9150915080611ddc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611e3f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611eb25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f8351603614611ede5760405162461bcd60e51b81526004016105d090614103565b5f805b6002811015611f2d57611ef58160016140c9565b611f00906008613f55565b61ffff16868281518110611f1657611f166140dc565b016020015160f81c901b9190911790600101611ee1565b5061ffff811615611f505760405162461bcd60e51b81526004016105d09061414c565b5f805b6004811015611fab57611f678160036140c9565b611f72906008613f55565b63ffffffff1687611f848360026140f0565b81518110611f9457611f946140dc565b016020015160f81c901b9190911790600101611f53565b5063ffffffff8116600314611fd25760405162461bcd60e51b81526004016105d09061418f565b5f805b602081101561202757611fe981601f6140c9565b611ff4906008613f55565b886120008360066140f0565b81518110612010576120106140dc565b016020015160f81c901b9190911790600101611fd5565b505f805b60088110156120865761203f8160076140c9565b61204a906008613f55565b6001600160401b03168961205f8360266140f0565b8151811061206f5761206f6140dc565b016020015160f81c901b919091179060010161202b565b505f805b60088110156120e55761209e8160076140c9565b6120a9906008613f55565b6001600160401b03168a6120be83602e6140f0565b815181106120ce576120ce6140dc565b016020015160f81c901b919091179060010161208a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061429d83398151915292919061213d90613c72565b905011801561216f575060015f83815260038301602052604090205460ff16600481111561216d5761216d613c23565b145b610afc5760405162461bcd60e51b815260206004820152603860248201525f805160206142bd83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061431d83398151915260205260408082208151610100810190925280545f805160206142dd83398151915293929190829060ff16600581111561221c5761221c613c23565b600581111561222d5761222d613c23565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122b5576122b5613c23565b146123115760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461238b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6123988160a001516132d7565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123dc576123dc613c23565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124a8846124a2816114b2565b5f61164d565b5f85815260068501602052604090209091506124c48282613cef565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124f1908590600401613dd0565b6020604051808303815f875af115801561250d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125319190613e02565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146125a95760405162461bcd60e51b81526004016105d090614103565b5f805b60028110156125f8576125c08160016140c9565b6125cb906008613f55565b61ffff168582815181106125e1576125e16140dc565b016020015160f81c901b91909117906001016125ac565b5061ffff81161561261b5760405162461bcd60e51b81526004016105d09061414c565b5f805b6004811015612676576126328160036140c9565b61263d906008613f55565b63ffffffff168661264f8360026140f0565b8151811061265f5761265f6140dc565b016020015160f81c901b919091179060010161261e565b5063ffffffff811660021461269d5760405162461bcd60e51b81526004016105d09061418f565b5f805b60208110156126f2576126b481601f6140c9565b6126bf906008613f55565b876126cb8360066140f0565b815181106126db576126db6140dc565b016020015160f81c901b91909117906001016126a0565b505f86602681518110612707576127076140dc565b016020015191976001600160f81b03199092161515965090945050505050565b5f612730613478565b5f61273a83610abf565b90505f8051602061429d8339815191525f61275487611526565b905060028151600581111561276b5761276b613c23565b146127ca5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516127db91906141d6565b90506127e78882611605565b5f6127f1896114b2565b90505f8989836040516020016128399392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061285a866132d7565b5f6128668b848661164d565b5f83815260048801602052604090209091506128828282613cef565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128af908590600401613dd0565b6020604051808303815f875af11580156128cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ef9190613e02565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561299e5761299e613c23565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506111fb60015f805160206142fd83398151915255565b5f5f8051602061429d8339815191528282612af982610abf565b83549091506001600160401b03821610801590612b2357508260010154816001600160401b031611155b612b815760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612b92613478565b5f805160206142dd833981519152426001600160401b038516118015612bcc57506001600160401b038416612bca426202a3006140f0565b115b612c2e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612c855760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612cf35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612d5a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612d63856132d7565b5f80612daa6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134c2565b5f82815260058601602052604090209193509150612dc88282613cef565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612df5908590600401613dd0565b6020604051808303815f875af1158015612e11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e359190613e02565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612eb757612eb7613c23565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612f78836114b2565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b8160015f805160206142fd83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661302757604051631afcd79f60e31b815260040160405180910390fd5b565b613031612fde565b61303a81613867565b6112136060820135608083013561305760c0850160a08601613ae6565b61306760e0860160c087016141f6565b613888565b5f808251602e1461308f5760405162461bcd60e51b81526004016105d090614103565b5f805b60028110156130de576130a68160016140c9565b6130b1906008613f55565b61ffff168582815181106130c7576130c76140dc565b016020015160f81c901b9190911790600101613092565b5061ffff8116156131015760405162461bcd60e51b81526004016105d09061414c565b5f805b600481101561315c576131188160036140c9565b613123906008613f55565b63ffffffff16866131358360026140f0565b81518110613145576131456140dc565b016020015160f81c901b9190911790600101613104565b5063ffffffff81166004146131835760405162461bcd60e51b81526004016105d09061418f565b5f805b60208110156131d85761319a81601f6140c9565b6131a5906008613f55565b876131b18360066140f0565b815181106131c1576131c16140dc565b016020015160f81c901b9190911790600101613186565b505f805b6008811015613237576131f08160076140c9565b6131fb906008613f55565b6001600160401b0316886132108360266140f0565b81518110613220576132206140dc565b016020015160f81c901b91909117906001016131dc565b5090969095509350505050565b804710156132675760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146132b0576040519150601f19603f3d011682016040523d82523d5f602084013e6132b5565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142dd8339815191529060ff165f03613315575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061335d90836140c9565b10613379576001600160401b0384166040830152808252613398565b838260400181815161338b91906141d6565b6001600160401b03169052505b5f8260200151836040015160646133af9190614211565b6133b9919061423c565b600285015490915060ff90811690821611156134345760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206142fd8339815191528054600119016134a957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206142fd83398151915255565b5f606082608001515160301461352c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135a3576135638160016140c9565b61356e906008613f55565b5081515f90839083908110613585576135856140dc565b60200101906001600160f81b03191690815f1a90535060010161354f565b505f5b6004811015613601576135ba8160036140c9565b6135c5906008613f55565b505f826135d38360026140f0565b815181106135e3576135e36140dc565b60200101906001600160f81b03191690815f1a9053506001016135a6565b505f5b602081101561365e5784518160208110613620576136206140dc565b1a60f81b826136308360066140f0565b81518110613640576136406140dc565b60200101906001600160f81b03191690815f1a905350600101613604565b505f5b60208110156136be5784602001518160208110613680576136806140dc565b1a60f81b826136908360266140f0565b815181106136a0576136a06140dc565b60200101906001600160f81b03191690815f1a905350600101613661565b505f5b6008811015613732576136d58160076140c9565b6136e0906008613f55565b60ff1685604001516001600160401b0316901c60f81b8282604661370491906140f0565b81518110613714576137146140dc565b60200101906001600160f81b03191690815f1a9053506001016136c1565b505f5b603081101561379d5784608001518181518110613754576137546140dc565b01602001516001600160f81b0319168261376f83604e6140f0565b8151811061377f5761377f6140dc565b60200101906001600160f81b03191690815f1a905350600101613735565b505f5b600881101561380f576137b48160076140c9565b6137bf906008613f55565b60608601516001600160401b0390811691161c60f81b826137e183607e6140f0565b815181106137f1576137f16140dc565b60200101906001600160f81b03191690815f1a9053506001016137a0565b506002816040516138209190614261565b602060405180830381855afa15801561383b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061385e9190613e02565b94909350915050565b61386f612fde565b6138776138e3565b61387f6138f3565b611213816138fb565b613890612fde565b5f5f8051602061429d833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6138eb612fde565b613027613967565b613027612fde565b613903612fde565b80355f805160206142dd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561394d606083016040840161427c565b600291909101805460ff191660ff90921691909117905550565b6134af612fde565b50805461397b90613c72565b5f825580601f1061398a575050565b601f0160209004905f5260205f209081019061121391906139ea565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156139fe575f81556001016139eb565b5090565b5f60e08284031215613a12575f80fd5b50919050565b8015158114611213575f80fd5b803563ffffffff81168114613a38575f80fd5b919050565b5f805f60608486031215613a4f575f80fd5b833592506020840135613a6181613a18565b9150613a6f60408501613a25565b90509250925092565b5f60208284031215613a88575f80fd5b5035919050565b5f60208284031215613a9f575f80fd5b6111fb82613a25565b5f8060408385031215613ab9575f80fd5b613ac283613a25565b946020939093013593505050565b80356001600160401b0381168114613a38575f80fd5b5f60208284031215613af6575f80fd5b6111fb82613ad0565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b3557613b35613aff565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b6357613b63613aff565b604052919050565b5f6001600160401b03821115613b8357613b83613aff565b50601f01601f191660200190565b5f805f60608486031215613ba3575f80fd5b83359250613bb360208501613ad0565b915060408401356001600160401b03811115613bcd575f80fd5b8401601f81018613613bdd575f80fd5b8035613bf0613beb82613b6b565b613b3b565b818152876020838501011115613c04575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613c6b57613c6b613c37565b5092915050565b600181811c90821680613c8657607f821691505b602082108103613a1257634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613cc95750805b601f840160051c820191505b81811015613ce8575f8155600101613cd5565b5050505050565b81516001600160401b03811115613d0857613d08613aff565b613d1c81613d168454613c72565b84613ca4565b602080601f831160018114613d4f575f8415613d385750858301515b5f19600386901b1c1916600185901b178555613da6565b5f85815260208120601f198616915b82811015613d7d57888601518255948401946001909101908401613d5e565b5085821015613d9a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613dc8578181015183820152602001613db0565b50505f910152565b602081525f8251806020840152613dee816040850160208701613dae565b601f01601f19169190910160400192915050565b5f60208284031215613e12575f80fd5b5051919050565b5f60208083525f8454613e2b81613c72565b806020870152604060018084165f8114613e4c5760018114613e6857613e95565b60ff19851660408a0152604084151560051b8a01019550613e95565b895f5260205f205f5b85811015613e8c5781548b8201860152908301908801613e71565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613ec557613ec5613ea3565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613c37565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611213575f80fd5b8051613a3881613a18565b5f8060408385031215613fe3575f80fd5b82516001600160401b0380821115613ff9575f80fd5b908401906060828703121561400c575f80fd5b614014613b13565b8251815260208084015161402781613fb3565b8282015260408401518381111561403c575f80fd5b80850194505087601f850112614050575f80fd5b83519250614060613beb84613b6b565b8381528882858701011115614073575f80fd5b61408284838301848801613dae565b80604084015250819550614097818801613fc7565b9450505050509250929050565b5f6001600160401b038083168181036140bf576140bf613c37565b6001019392505050565b81810381811115610acf57610acf613c37565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613c37565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613c6b57613c6b613c37565b5f60208284031215614206575f80fd5b81356111fb81613fb3565b6001600160401b0381811683821602808216919082811461423457614234613c37565b505092915050565b5f6001600160401b038084168061425557614255613ea3565b92169190910492915050565b5f8251614272818460208701613dae565b9190910192915050565b5f6020828403121561428c575f80fd5b813560ff811681146111fb575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. From 6decd640de94d330ac9435f346f4614743fb9fe1 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 6 Sep 2024 19:59:58 +0000 Subject: [PATCH 223/545] expect ERC20.transfer for stake unlock addresses review comment https://github.com/ava-labs/teleporter/pull/527#discussion_r1747583987 --- .../staking/tests/ERC20TokenStakingManagerTests.t.sol | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index db0e745c4..5f5c22f59 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -56,11 +56,15 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); - uint256 balanceBefore = token.balanceOf(address(this)); + address validator = address(this); + + uint256 balanceBefore = token.balanceOf(validator); + + vm.expectCall(address(token), abi.encodeCall(IERC20.transfer, (validator, DEFAULT_WEIGHT))); _testCompleteEndValidation(validationID); - uint256 balanceChange = token.balanceOf(address(this)) - balanceBefore; + uint256 balanceChange = token.balanceOf(validator) - balanceBefore; require(balanceChange == DEFAULT_WEIGHT, "validator should have received their stake back"); } From fa3931d25b785a8d63223b59c3989062791ecc02 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 6 Sep 2024 20:59:17 +0000 Subject: [PATCH 224/545] expect native receive() for unlocked stake addresses review comment https://github.com/ava-labs/teleporter/pull/527/files#r1747583987 --- contracts/staking/tests/NativeTokenStakingManagerTests.t.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 873e30b38..af509d9ec 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -50,6 +50,9 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { uint256 balanceBefore = address(this).balance; + // empty calldata implies the receive function will be called + vm.expectCall(address(this), DEFAULT_WEIGHT, ""); + _testCompleteEndValidation(validationID); uint256 balanceChange = address(this).balance - balanceBefore; From 9b9d85623def92bfbc3a06a5d86cc49ae2e327f1 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 6 Sep 2024 17:05:05 -0400 Subject: [PATCH 225/545] Fix tests --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 9 ++++---- contracts/staking/ValidatorManager.sol | 22 +++++++++---------- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index b4f86a79c..8a4864d31 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516146a83803806146a883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61455b8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610246578063a3a65e4814610259578063b771b3bc1461026c578063ba3a4b9714610292578063bee0a03f146102a5575f80fd5b806366435abf146101fa57806376f786211461020d578063872fda641461022057806398f3e2b414610233575f80fd5b80632e2194d8116100d95780632e2194d814610196578063467ef06f146101c15780635297fae6146101d457806362065856146101e7575f80fd5b80630118acc41461010a5780630322ed981461011f5780630cdd09851461013257806327f39ca814610183575b5f80fd5b61011d610118366004613bce565b6102b8565b005b61011d61012d366004613c09565b610722565b610170610140366004613c09565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61011d610191366004613c34565b610862565b6101a96101a4366004613c09565b610946565b6040516001600160401b03909116815260200161017a565b61011d6101cf366004613c71565b61095c565b61011d6101e2366004613c8a565b610cc5565b6101706101f5366004613cc8565b610e95565b6101a9610208366004613c09565b610eae565b61011d61021b366004613bce565b610ec2565b61017061022e366004613d73565b610ee2565b61011d610241366004613c8a565b610f07565b610170610254366004613e0f565b611086565b61011d610267366004613c71565b611099565b61027a6005600160991b0181565b6040516001600160a01b03909116815260200161017a565b61011d6102a0366004613c09565b611256565b61011d6102b3366004613c09565b6114e2565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206144af83398151915291841561030a5761030782856115f1565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561033c5761033c613e2f565b600481111561034d5761034d613e2f565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103d4576103d4613e2f565b146104265760405162461bcd60e51b815260206004820152602a60248201525f805160206144cf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461048b5760405162461bcd60e51b815260206004820152603360248201525f805160206144cf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161041d565b5f6104958461188d565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104e2576104e2613e2f565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105b485611901565b905082606001516001600160401b03168160a001516001600160401b03161161062b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161041d565b5f83606001518260a001516106409190613e57565b905061064c8682611a12565b5f6005600160991b0163ee5b48eb610665898786611a5a565b6040518263ffffffff1660e01b81526004016106819190613ea0565b6020604051808303815f875af115801561069d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c19190613ed2565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061452f83398151915260205260409020545f805160206144ef8339815191529060039060ff16600581111561076257610762613e2f565b146107c75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161041d565b5f8281526006820160205260408120600301546107ef9084906001600160401b031683611a5a565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061081c908490600401613ea0565b6020604051808303815f875af1158015610838573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085c9190613ed2565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806108ab575080546001600160401b03808416911610155b156108c95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556108f48484611c77565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f61095664e8d4a5100083613efd565b92915050565b5f805160206144ef8339815191525f61097483611c95565b90505f806109858360400151611e76565b9150915080156109ea5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161041d565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610a1c57610a1c613e2f565b6005811115610a2d57610a2d613e2f565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610ab457610ab4613e2f565b1480610ad25750600182516005811115610ad057610ad0613e2f565b145b610b315760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161041d565b600382516005811115610b4657610b46613e2f565b03610b5357506004610b57565b5060055b6020808301515f90815260078801909152604081205581816005811115610b8057610b80613e2f565b90816005811115610b9357610b93613e2f565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610bc757610bc7613e2f565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610c9257610c92613e2f565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206144af8339815191525f610cdd84611c95565b90505f80610cee8360400151612017565b50915091505f610cfd83611901565b9050816001600160401b031681608001516001600160401b03161015610d355760405162461bcd60e51b815260040161041d90613f10565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610d7a5760405162461bcd60e51b815260040161041d90613f52565b60015f87815260038701602052604090205460ff166004811115610da057610da0613e2f565b14610e095760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161041d565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109566001600160401b03831664e8d4a51000613f9b565b5f610eb882611901565b60a0015192915050565b8115610ed457610ed283826115f1565b505b610edd83612252565b505050565b5f80610eed866125f0565b9050610efb8582868661269d565b9150505b949350505050565b5f805160206144af8339815191525f610f1f84611c95565b90505f80610f308360400151612017565b50915091505f610f3f83611901565b9050816001600160401b031681608001516001600160401b03161015610f775760405162461bcd60e51b815260040161041d90613f10565b5f8681526003808701602052604090912001546001600160401b0380841691161115610fb55760405162461bcd60e51b815260040161041d90613f52565b60035f87815260038701602052604090205460ff166004811115610fdb57610fdb613e2f565b1461102f5760405162461bcd60e51b815260206004820152603160248201525f805160206144cf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161041d565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611092833384612af2565b9392505050565b5f805160206144ef8339815191525f6110b183611c95565b90505f806110c28360400151611e76565b91509150806111245760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161041d565b5f8281526005850160205260408120805461113e90613fb2565b9050118015611170575060015f83815260068601602052604090205460ff16600581111561116e5761116e613e2f565b145b61118c5760405162461bcd60e51b815260040161041d90613fea565b5f82815260058501602052604081206111a491613b5f565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f805160206144af83398151915293929190829060ff1660048111156112b7576112b7613e2f565b60048111156112c8576112c8613e2f565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091505f84815260038401602052604090205460ff16600481111561136057611360613e2f565b146113c05760405162461bcd60e51b815260206004820152603860248201525f805160206144cf83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161041d565b5f6113ce8260400151611901565b905080608001516001600160401b03165f036114525760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb61147f846040015184608001518560a00151611a5a565b6040518263ffffffff1660e01b815260040161149b9190613ea0565b6020604051808303815f875af11580156114b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114db9190613ed2565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206144ef83398151915292919061152a90613fb2565b905011801561155c575060015f83815260068301602052604090205460ff16600581111561155a5761155a613e2f565b145b6115785760405162461bcd60e51b815260040161041d90613fea565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916115b19190600401614031565b6020604051808303815f875af11580156115cd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610edd9190613ed2565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561163c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261166391908101906140c6565b91509150806116c65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161041d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611709573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172d9190613ed2565b8251146117915760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161041d565b60208201516001600160a01b0316156118075760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161041d565b5f806118168460400151612e64565b915091508187146118835760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161041d565b9695505050505050565b5f8181525f8051602061452f8339815191526020526040812060030180545f805160206144ef833981519152916001600160401b03909116908190846118d283614198565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061452f83398151915290528390208351918201909352825491925f805160206144ef83398151915292829060ff16600581111561198957611989613e2f565b600581111561199a5761199a613e2f565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061452f833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ad357611a938160016141bd565b611a9e906008613f9b565b5081515f90839083908110611ab557611ab56141d0565b60200101906001600160f81b03191690815f1a905350600101611a7f565b505f5b6004811015611b3657611aea8160036141bd565b611af5906008613f9b565b6001901c60f81b82611b088360026141e4565b81518110611b1857611b186141d0565b60200101906001600160f81b03191690815f1a905350600101611ad6565b505f5b6020811015611b9857611b4d81601f6141bd565b611b58906008613f9b565b86901c60f81b82611b6a8360066141e4565b81518110611b7a57611b7a6141d0565b60200101906001600160f81b03191690815f1a905350600101611b39565b505f5b6008811015611c0357611baf8160076141bd565b611bba906008613f9b565b6001600160401b038616901c60f81b82611bd58360266141e4565b81518110611be557611be56141d0565b60200101906001600160f81b03191690815f1a905350600101611b9b565b505f5b6008811015611c6e57611c1a8160076141bd565b611c25906008613f9b565b6001600160401b038516901c60f81b82611c4083602e6141e4565b81518110611c5057611c506141d0565b60200101906001600160f81b03191690815f1a905350600101611c06565b50949350505050565b611c7f61303c565b611c8882613087565b611c91816130cd565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206144ef8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d0a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d3191908101906140c6565b9150915080611d985760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161041d565b8254825114611dfb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161041d565b60208201516001600160a01b031615611e6e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161041d565b509392505050565b5f808251602714611e995760405162461bcd60e51b815260040161041d906141f7565b5f805b6002811015611ee857611eb08160016141bd565b611ebb906008613f9b565b61ffff16858281518110611ed157611ed16141d0565b016020015160f81c901b9190911790600101611e9c565b5061ffff811615611f0b5760405162461bcd60e51b815260040161041d90614240565b5f805b6004811015611f6657611f228160036141bd565b611f2d906008613f9b565b63ffffffff1686611f3f8360026141e4565b81518110611f4f57611f4f6141d0565b016020015160f81c901b9190911790600101611f0e565b5063ffffffff8116600214611f8d5760405162461bcd60e51b815260040161041d90614283565b5f805b6020811015611fe257611fa481601f6141bd565b611faf906008613f9b565b87611fbb8360066141e4565b81518110611fcb57611fcb6141d0565b016020015160f81c901b9190911790600101611f90565b505f86602681518110611ff757611ff76141d0565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461203b5760405162461bcd60e51b815260040161041d906141f7565b5f805b600281101561208a576120528160016141bd565b61205d906008613f9b565b61ffff16868281518110612073576120736141d0565b016020015160f81c901b919091179060010161203e565b5061ffff8116156120ad5760405162461bcd60e51b815260040161041d90614240565b5f805b6004811015612108576120c48160036141bd565b6120cf906008613f9b565b63ffffffff16876120e18360026141e4565b815181106120f1576120f16141d0565b016020015160f81c901b91909117906001016120b0565b5063ffffffff811660031461212f5760405162461bcd60e51b815260040161041d90614283565b5f805b60208110156121845761214681601f6141bd565b612151906008613f9b565b8861215d8360066141e4565b8151811061216d5761216d6141d0565b016020015160f81c901b9190911790600101612132565b505f805b60088110156121e35761219c8160076141bd565b6121a7906008613f9b565b6001600160401b0316896121bc8360266141e4565b815181106121cc576121cc6141d0565b016020015160f81c901b9190911790600101612188565b505f805b6008811015612242576121fb8160076141bd565b612206906008613f9b565b6001600160401b03168a61221b83602e6141e4565b8151811061222b5761222b6141d0565b016020015160f81c901b91909117906001016121e7565b5091989097509095509350505050565b5f8181525f8051602061452f83398151915260205260408082208151610100810190925280545f805160206144ef83398151915293929190829060ff1660058111156122a0576122a0613e2f565b60058111156122b1576122b1613e2f565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561233957612339613e2f565b146123955760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161041d565b60408101516001600160a01b0316336001600160a01b03161461240f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161041d565b61241c8160a00151613181565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561246057612460613e2f565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61252c846125268161188d565b5f611a5a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061255b908590600401613ea0565b6020604051808303815f875af1158015612577573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061259b9190613ed2565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206144af8339815191528161260984613322565b90505f61261582610946565b83549091506001600160401b0382161080159061263f57508260010154816001600160401b031611155b610eff5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161041d565b5f6126a6613358565b5f805160206144ef833981519152426001600160401b0385161180156126e057506001600160401b0384166126de426202a3006141e4565b115b6127425760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161041d565b856127995760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161041d565b5f868152600782016020526040902054156128075760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161041d565b825160301461286e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161041d565b61287785613181565b5f806128be6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061338f565b5f828152600586016020526040902091935091506128dc828261430e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612909908590600401613ea0565b6020604051808303815f875af1158015612925573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129499190613ed2565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156129cb576129cb613e2f565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612a8c8361188d565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610eff60015f8051602061450f83398151915255565b5f612afb613358565b5f612b086101a484613322565b90505f805160206144af8339815191525f612b2287611901565b9050600281516005811115612b3957612b39613e2f565b14612b985760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161041d565b5f838260a00151612ba991906143cd565b9050612bb58882611a12565b5f612bbf8961188d565b90505f898983604051602001612c079392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612c2886613181565b5f6005600160991b0163ee5b48eb612c418d8688611a5a565b6040518263ffffffff1660e01b8152600401612c5d9190613ea0565b6020604051808303815f875af1158015612c79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c9d9190613ed2565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff19166001836004811115612d2557612d25613e2f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061109260015f8051602061450f83398151915255565b5f808251602e14612e875760405162461bcd60e51b815260040161041d906141f7565b5f805b6002811015612ed657612e9e8160016141bd565b612ea9906008613f9b565b61ffff16858281518110612ebf57612ebf6141d0565b016020015160f81c901b9190911790600101612e8a565b5061ffff811615612ef95760405162461bcd60e51b815260040161041d90614240565b5f805b6004811015612f5457612f108160036141bd565b612f1b906008613f9b565b63ffffffff1686612f2d8360026141e4565b81518110612f3d57612f3d6141d0565b016020015160f81c901b9190911790600101612efc565b5063ffffffff8116600414612f7b5760405162461bcd60e51b815260040161041d90614283565b5f805b6020811015612fd057612f9281601f6141bd565b612f9d906008613f9b565b87612fa98360066141e4565b81518110612fb957612fb96141d0565b016020015160f81c901b9190911790600101612f7e565b505f805b600881101561302f57612fe88160076141bd565b612ff3906008613f9b565b6001600160401b0316886130088360266141e4565b81518110613018576130186141d0565b016020015160f81c901b9190911790600101612fd4565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661308557604051631afcd79f60e31b815260040160405180910390fd5b565b61308f61303c565b61309881613747565b6130ca606082013560808301356130b560c0850160a08601613cc8565b6130c560e0860160c087016143ed565b613768565b50565b6130d561303c565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131615760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161041d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206144ef8339815191529060ff165f036131bf575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061320790836141bd565b10613223576001600160401b0384166040830152808252613242565b838260400181815161323591906143cd565b6001600160401b03169052505b5f8260200151836040015160646132599190614408565b6132639190614433565b600285015490915060ff90811690821611156132de5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161041d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610956827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906137c3565b5f8051602061450f83398151915280546001190161338957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146133f95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161041d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613470576134308160016141bd565b61343b906008613f9b565b5081515f90839083908110613452576134526141d0565b60200101906001600160f81b03191690815f1a90535060010161341c565b505f5b60048110156134ce576134878160036141bd565b613492906008613f9b565b505f826134a08360026141e4565b815181106134b0576134b06141d0565b60200101906001600160f81b03191690815f1a905350600101613473565b505f5b602081101561352b57845181602081106134ed576134ed6141d0565b1a60f81b826134fd8360066141e4565b8151811061350d5761350d6141d0565b60200101906001600160f81b03191690815f1a9053506001016134d1565b505f5b602081101561358b578460200151816020811061354d5761354d6141d0565b1a60f81b8261355d8360266141e4565b8151811061356d5761356d6141d0565b60200101906001600160f81b03191690815f1a90535060010161352e565b505f5b60088110156135ff576135a28160076141bd565b6135ad906008613f9b565b60ff1685604001516001600160401b0316901c60f81b828260466135d191906141e4565b815181106135e1576135e16141d0565b60200101906001600160f81b03191690815f1a90535060010161358e565b505f5b603081101561366a5784608001518181518110613621576136216141d0565b01602001516001600160f81b0319168261363c83604e6141e4565b8151811061364c5761364c6141d0565b60200101906001600160f81b03191690815f1a905350600101613602565b505f5b60088110156136dc576136818160076141bd565b61368c906008613f9b565b60608601516001600160401b0390811691161c60f81b826136ae83607e6141e4565b815181106136be576136be6141d0565b60200101906001600160f81b03191690815f1a90535060010161366d565b506002816040516136ed9190614458565b602060405180830381855afa158015613708573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061372b9190613ed2565b94909350915050565b60015f8051602061450f83398151915255565b61374f61303c565b613757613925565b61375f613935565b6130ca8161393d565b61377061303c565b5f5f805160206144af833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613809573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061382d9190613ed2565b90506138446001600160a01b0385163330866139a9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613888573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138ac9190613ed2565b90508181116139125760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161041d565b61391c82826141bd565b95945050505050565b61392d61303c565b613085613a03565b61308561303c565b61394561303c565b80355f805160206144ef83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561398f6060830160408401614473565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261085c908590613a0b565b61373461303c565b5f613a1f6001600160a01b03841683613a6c565b905080515f14158015613a43575080806020019051810190613a419190614493565b155b15610edd57604051635274afe760e01b81526001600160a01b038416600482015260240161041d565b606061109283835f845f80856001600160a01b03168486604051613a909190614458565b5f6040518083038185875af1925050503d805f8114613aca576040519150601f19603f3d011682016040523d82523d5f602084013e613acf565b606091505b5091509150611883868383606082613aef57613aea82613b36565b611092565b8151158015613b0657506001600160a01b0384163b155b15613b2f57604051639996b31560e01b81526001600160a01b038516600482015260240161041d565b5080611092565b805115613b465780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613b6b90613fb2565b5f825580601f10613b7a575050565b601f0160209004905f5260205f20908101906130ca91905b80821115613ba5575f8155600101613b92565b5090565b80151581146130ca575f80fd5b803563ffffffff81168114613bc9575f80fd5b919050565b5f805f60608486031215613be0575f80fd5b833592506020840135613bf281613ba9565b9150613c0060408501613bb6565b90509250925092565b5f60208284031215613c19575f80fd5b5035919050565b6001600160a01b03811681146130ca575f80fd5b5f80828403610100811215613c47575f80fd5b60e0811215613c54575f80fd5b5082915060e0830135613c6681613c20565b809150509250929050565b5f60208284031215613c81575f80fd5b61109282613bb6565b5f8060408385031215613c9b575f80fd5b613ca483613bb6565b946020939093013593505050565b80356001600160401b0381168114613bc9575f80fd5b5f60208284031215613cd8575f80fd5b61109282613cb2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d1757613d17613ce1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d4557613d45613ce1565b604052919050565b5f6001600160401b03821115613d6557613d65613ce1565b50601f01601f191660200190565b5f805f8060808587031215613d86575f80fd5b8435935060208501359250613d9d60408601613cb2565b915060608501356001600160401b03811115613db7575f80fd5b8501601f81018713613dc7575f80fd5b8035613dda613dd582613d4d565b613d1d565b818152886020838501011115613dee575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613e20575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e7757613e77613e43565b5092915050565b5f5b83811015613e98578181015183820152602001613e80565b50505f910152565b602081525f8251806020840152613ebe816040850160208701613e7e565b601f01601f19169190910160400192915050565b5f60208284031215613ee2575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613f0b57613f0b613ee9565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761095657610956613e43565b600181811c90821680613fc657607f821691505b602082108103613fe457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461404381613fb2565b806020870152604060018084165f81146140645760018114614080576140ad565b60ff19851660408a0152604084151560051b8a010195506140ad565b895f5260205f205f5b858110156140a45781548b8201860152908301908801614089565b8a016040019650505b509398975050505050505050565b8051613bc981613ba9565b5f80604083850312156140d7575f80fd5b82516001600160401b03808211156140ed575f80fd5b9084019060608287031215614100575f80fd5b614108613cf5565b8251815260208084015161411b81613c20565b82820152604084015183811115614130575f80fd5b80850194505087601f850112614144575f80fd5b83519250614154613dd584613d4d565b8381528882858701011115614167575f80fd5b61417684838301848801613e7e565b8060408401525081955061418b8188016140bb565b9450505050509250929050565b5f6001600160401b038083168181036141b3576141b3613e43565b6001019392505050565b8181038181111561095657610956613e43565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561095657610956613e43565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610edd57805f5260205f20601f840160051c810160208510156142ef5750805b601f840160051c820191505b818110156114db575f81556001016142fb565b81516001600160401b0381111561432757614327613ce1565b61433b816143358454613fb2565b846142ca565b602080601f83116001811461436e575f84156143575750858301515b5f19600386901b1c1916600185901b1785556143c5565b5f85815260208120601f198616915b8281101561439c5788860151825594840194600190910190840161437d565b50858210156143b957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115613e7757613e77613e43565b5f602082840312156143fd575f80fd5b813561109281613c20565b6001600160401b0381811683821602808216919082811461442b5761442b613e43565b505092915050565b5f6001600160401b038084168061444c5761444c613ee9565b92169190910492915050565b5f8251614469818460208701613e7e565b9190910192915050565b5f60208284031215614483575f80fd5b813560ff81168114611092575f80fd5b5f602082840312156144a3575f80fd5b815161109281613ba956fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161473838038061473883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145eb8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610246578063a3a65e4814610259578063b771b3bc1461026c578063ba3a4b9714610292578063bee0a03f146102a5575f80fd5b806366435abf146101fa57806376f786211461020d578063872fda641461022057806398f3e2b414610233575f80fd5b80632e2194d8116100d95780632e2194d814610196578063467ef06f146101c15780635297fae6146101d457806362065856146101e7575f80fd5b80630118acc41461010a5780630322ed981461011f5780630cdd09851461013257806327f39ca814610183575b5f80fd5b61011d610118366004613c5e565b6102b8565b005b61011d61012d366004613c99565b610722565b610170610140366004613c99565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61011d610191366004613cc4565b6108f2565b6101a96101a4366004613c99565b6109d6565b6040516001600160401b03909116815260200161017a565b61011d6101cf366004613d01565b6109ec565b61011d6101e2366004613d1a565b610d55565b6101706101f5366004613d58565b610f25565b6101a9610208366004613c99565b610f3e565b61011d61021b366004613c5e565b610f52565b61017061022e366004613e03565b610f72565b61011d610241366004613d1a565b610f97565b610170610254366004613e9f565b611116565b61011d610267366004613d01565b611129565b61027a6005600160991b0181565b6040516001600160a01b03909116815260200161017a565b61011d6102a0366004613c99565b6112e6565b61011d6102b3366004613c99565b611573565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061453f83398151915291841561030a576103078285611682565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561033c5761033c613ebf565b600481111561034d5761034d613ebf565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103d4576103d4613ebf565b146104265760405162461bcd60e51b815260206004820152602a60248201525f8051602061455f8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461048b5760405162461bcd60e51b815260206004820152603360248201525f8051602061455f8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161041d565b5f6104958461191e565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156104e2576104e2613ebf565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105b4856119a0565b905082606001516001600160401b03168160a001516001600160401b03161161062b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161041d565b5f83606001518260a001516106409190613ee7565b905061064c8682611ab1565b5f6005600160991b0163ee5b48eb610665898786611af9565b6040518263ffffffff1660e01b81526004016106819190613f30565b6020604051808303815f875af115801561069d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106c19190613f62565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206145bf83398151915260205260408082208151610100810190925280545f8051602061457f83398151915293929190829060ff16600581111561077057610770613ebf565b600581111561078157610781613ebf565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561080657610806613ebf565b1461086b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb6108908584608001515f611af9565b6040518263ffffffff1660e01b81526004016108ac9190613f30565b6020604051808303815f875af11580156108c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108ec9190613f62565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061093b575080546001600160401b03808416911610155b156109595760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109848484611d16565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109e664e8d4a5100083613f8d565b92915050565b5f8051602061457f8339815191525f610a0483611d34565b90505f80610a158360400151611f15565b915091508015610a7a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161041d565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610aac57610aac613ebf565b6005811115610abd57610abd613ebf565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b4457610b44613ebf565b1480610b625750600182516005811115610b6057610b60613ebf565b145b610bc15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161041d565b600382516005811115610bd657610bd6613ebf565b03610be357506004610be7565b5060055b6020808301515f90815260078801909152604081205581816005811115610c1057610c10613ebf565b90816005811115610c2357610c23613ebf565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610c5757610c57613ebf565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d2257610d22613ebf565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f8051602061453f8339815191525f610d6d84611d34565b90505f80610d7e83604001516120b6565b50915091505f610d8d836119a0565b9050816001600160401b031681608001516001600160401b03161015610dc55760405162461bcd60e51b815260040161041d90613fa0565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e0a5760405162461bcd60e51b815260040161041d90613fe2565b60015f87815260038701602052604090205460ff166004811115610e3057610e30613ebf565b14610e995760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161041d565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109e66001600160401b03831664e8d4a5100061402b565b5f610f48826119a0565b60a0015192915050565b8115610f6457610f628382611682565b505b610f6d836122f1565b505050565b5f80610f7d8661268f565b9050610f8b8582868661273c565b9150505b949350505050565b5f8051602061453f8339815191525f610faf84611d34565b90505f80610fc083604001516120b6565b50915091505f610fcf836119a0565b9050816001600160401b031681608001516001600160401b031610156110075760405162461bcd60e51b815260040161041d90613fa0565b5f8681526003808701602052604090912001546001600160401b03808416911611156110455760405162461bcd60e51b815260040161041d90613fe2565b60035f87815260038701602052604090205460ff16600481111561106b5761106b613ebf565b146110bf5760405162461bcd60e51b815260206004820152603160248201525f8051602061455f8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161041d565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f611122833384612b82565b9392505050565b5f8051602061457f8339815191525f61114183611d34565b90505f806111528360400151611f15565b91509150806111b45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161041d565b5f828152600585016020526040812080546111ce90614042565b9050118015611200575060015f83815260068601602052604090205460ff1660058111156111fe576111fe613ebf565b145b61121c5760405162461bcd60e51b815260040161041d9061407a565b5f828152600585016020526040812061123491613bef565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f8051602061453f83398151915293929190829060ff16600481111561134757611347613ebf565b600481111561135857611358613ebf565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156113df576113df613ebf565b14806113fd57506003815160048111156113fb576113fb613ebf565b145b6114515760405162461bcd60e51b815260206004820152603260248201525f8051602061455f833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161041d565b5f61145f82604001516119a0565b905080608001516001600160401b03165f036114e35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb611510846040015184608001518560a00151611af9565b6040518263ffffffff1660e01b815260040161152c9190613f30565b6020604051808303815f875af1158015611548573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156c9190613f62565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061457f8339815191529291906115bb90614042565b90501180156115ed575060015f83815260068301602052604090205460ff1660058111156115eb576115eb613ebf565b145b6116095760405162461bcd60e51b815260040161041d9061407a565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161164291906004016140c1565b6020604051808303815f875af115801561165e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6d9190613f62565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156116cd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116f49190810190614156565b91509150806117575760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161041d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561179a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117be9190613f62565b8251146118225760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161041d565b60208201516001600160a01b0316156118985760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161041d565b5f806118a78460400151612ef4565b915091508187146119145760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161041d565b9695505050505050565b5f8181525f805160206145bf8339815191526020526040812060030180545f8051602061457f833981519152916001600160401b03909116908361196183614228565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f805160206145bf83398151915290528390208351918201909352825491925f8051602061457f83398151915292829060ff166005811115611a2857611a28613ebf565b6005811115611a3957611a39613ebf565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206145bf833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611b7257611b3281600161424d565b611b3d90600861402b565b5081515f90839083908110611b5457611b54614260565b60200101906001600160f81b03191690815f1a905350600101611b1e565b505f5b6004811015611bd557611b8981600361424d565b611b9490600861402b565b6001901c60f81b82611ba7836002614274565b81518110611bb757611bb7614260565b60200101906001600160f81b03191690815f1a905350600101611b75565b505f5b6020811015611c3757611bec81601f61424d565b611bf790600861402b565b86901c60f81b82611c09836006614274565b81518110611c1957611c19614260565b60200101906001600160f81b03191690815f1a905350600101611bd8565b505f5b6008811015611ca257611c4e81600761424d565b611c5990600861402b565b6001600160401b038616901c60f81b82611c74836026614274565b81518110611c8457611c84614260565b60200101906001600160f81b03191690815f1a905350600101611c3a565b505f5b6008811015611d0d57611cb981600761424d565b611cc490600861402b565b6001600160401b038516901c60f81b82611cdf83602e614274565b81518110611cef57611cef614260565b60200101906001600160f81b03191690815f1a905350600101611ca5565b50949350505050565b611d1e6130cc565b611d2782613117565b611d308161315d565b5050565b60408051606080820183525f8083526020830181905292820152905f8051602061457f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611da9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611dd09190810190614156565b9150915080611e375760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161041d565b8254825114611e9a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161041d565b60208201516001600160a01b031615611f0d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161041d565b509392505050565b5f808251602714611f385760405162461bcd60e51b815260040161041d90614287565b5f805b6002811015611f8757611f4f81600161424d565b611f5a90600861402b565b61ffff16858281518110611f7057611f70614260565b016020015160f81c901b9190911790600101611f3b565b5061ffff811615611faa5760405162461bcd60e51b815260040161041d906142d0565b5f805b600481101561200557611fc181600361424d565b611fcc90600861402b565b63ffffffff1686611fde836002614274565b81518110611fee57611fee614260565b016020015160f81c901b9190911790600101611fad565b5063ffffffff811660021461202c5760405162461bcd60e51b815260040161041d90614313565b5f805b60208110156120815761204381601f61424d565b61204e90600861402b565b8761205a836006614274565b8151811061206a5761206a614260565b016020015160f81c901b919091179060010161202f565b505f8660268151811061209657612096614260565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120da5760405162461bcd60e51b815260040161041d90614287565b5f805b6002811015612129576120f181600161424d565b6120fc90600861402b565b61ffff1686828151811061211257612112614260565b016020015160f81c901b91909117906001016120dd565b5061ffff81161561214c5760405162461bcd60e51b815260040161041d906142d0565b5f805b60048110156121a75761216381600361424d565b61216e90600861402b565b63ffffffff1687612180836002614274565b8151811061219057612190614260565b016020015160f81c901b919091179060010161214f565b5063ffffffff81166003146121ce5760405162461bcd60e51b815260040161041d90614313565b5f805b6020811015612223576121e581601f61424d565b6121f090600861402b565b886121fc836006614274565b8151811061220c5761220c614260565b016020015160f81c901b91909117906001016121d1565b505f805b60088110156122825761223b81600761424d565b61224690600861402b565b6001600160401b03168961225b836026614274565b8151811061226b5761226b614260565b016020015160f81c901b9190911790600101612227565b505f805b60088110156122e15761229a81600761424d565b6122a590600861402b565b6001600160401b03168a6122ba83602e614274565b815181106122ca576122ca614260565b016020015160f81c901b9190911790600101612286565b5091989097509095509350505050565b5f8181525f805160206145bf83398151915260205260408082208151610100810190925280545f8051602061457f83398151915293929190829060ff16600581111561233f5761233f613ebf565b600581111561235057612350613ebf565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123d8576123d8613ebf565b146124345760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161041d565b60408101516001600160a01b0316336001600160a01b0316146124ae5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161041d565b6124bb8160a00151613211565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156124ff576124ff613ebf565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125cb846125c58161191e565b5f611af9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906125fa908590600401613f30565b6020604051808303815f875af1158015612616573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061263a9190613f62565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061453f833981519152816126a8846133b2565b90505f6126b4826109d6565b83549091506001600160401b038216108015906126de57508260010154816001600160401b031611155b610f8f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161041d565b5f6127456133e8565b5f8051602061457f833981519152426001600160401b03851611801561277f57506001600160401b03841661277d426202a300614274565b115b6127e15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161041d565b856128385760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161041d565b5f868152600782016020526040902054156128a65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161041d565b825160301461290d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161041d565b61291685613211565b5f8061295d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061341f565b5f8281526005860160205260409020919350915061297b828261439e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129a8908590600401613f30565b6020604051808303815f875af11580156129c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129e89190613f62565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612a6a57612a6a613ebf565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610f8f60015f8051602061459f83398151915255565b5f612b8b6133e8565b5f612b986101a4846133b2565b90505f8051602061453f8339815191525f612bb2876119a0565b9050600281516005811115612bc957612bc9613ebf565b14612c285760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161041d565b5f838260a00151612c39919061445d565b9050612c458882611ab1565b5f612c4f8961191e565b90505f898983604051602001612c979392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612cb886613211565b5f6005600160991b0163ee5b48eb612cd18d8688611af9565b6040518263ffffffff1660e01b8152600401612ced9190613f30565b6020604051808303815f875af1158015612d09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d2d9190613f62565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff19166001836004811115612db557612db5613ebf565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061112260015f8051602061459f83398151915255565b5f808251602e14612f175760405162461bcd60e51b815260040161041d90614287565b5f805b6002811015612f6657612f2e81600161424d565b612f3990600861402b565b61ffff16858281518110612f4f57612f4f614260565b016020015160f81c901b9190911790600101612f1a565b5061ffff811615612f895760405162461bcd60e51b815260040161041d906142d0565b5f805b6004811015612fe457612fa081600361424d565b612fab90600861402b565b63ffffffff1686612fbd836002614274565b81518110612fcd57612fcd614260565b016020015160f81c901b9190911790600101612f8c565b5063ffffffff811660041461300b5760405162461bcd60e51b815260040161041d90614313565b5f805b60208110156130605761302281601f61424d565b61302d90600861402b565b87613039836006614274565b8151811061304957613049614260565b016020015160f81c901b919091179060010161300e565b505f805b60088110156130bf5761307881600761424d565b61308390600861402b565b6001600160401b031688613098836026614274565b815181106130a8576130a8614260565b016020015160f81c901b9190911790600101613064565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661311557604051631afcd79f60e31b815260040160405180910390fd5b565b61311f6130cc565b613128816137d7565b61315a6060820135608083013561314560c0850160a08601613d58565b61315560e0860160c0870161447d565b6137f8565b50565b6131656130cc565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131f15760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161041d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061457f8339815191529060ff165f0361324f575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613297908361424d565b106132b3576001600160401b03841660408301528082526132d2565b83826040018181516132c5919061445d565b6001600160401b03169052505b5f8260200151836040015160646132e99190614498565b6132f391906144c3565b600285015490915060ff908116908216111561336e5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161041d565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6109e6827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613853565b5f8051602061459f83398151915280546001190161341957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134895760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161041d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613500576134c081600161424d565b6134cb90600861402b565b5081515f908390839081106134e2576134e2614260565b60200101906001600160f81b03191690815f1a9053506001016134ac565b505f5b600481101561355e5761351781600361424d565b61352290600861402b565b505f82613530836002614274565b8151811061354057613540614260565b60200101906001600160f81b03191690815f1a905350600101613503565b505f5b60208110156135bb578451816020811061357d5761357d614260565b1a60f81b8261358d836006614274565b8151811061359d5761359d614260565b60200101906001600160f81b03191690815f1a905350600101613561565b505f5b602081101561361b57846020015181602081106135dd576135dd614260565b1a60f81b826135ed836026614274565b815181106135fd576135fd614260565b60200101906001600160f81b03191690815f1a9053506001016135be565b505f5b600881101561368f5761363281600761424d565b61363d90600861402b565b60ff1685604001516001600160401b0316901c60f81b828260466136619190614274565b8151811061367157613671614260565b60200101906001600160f81b03191690815f1a90535060010161361e565b505f5b60308110156136fa57846080015181815181106136b1576136b1614260565b01602001516001600160f81b031916826136cc83604e614274565b815181106136dc576136dc614260565b60200101906001600160f81b03191690815f1a905350600101613692565b505f5b600881101561376c5761371181600761424d565b61371c90600861402b565b60608601516001600160401b0390811691161c60f81b8261373e83607e614274565b8151811061374e5761374e614260565b60200101906001600160f81b03191690815f1a9053506001016136fd565b5060028160405161377d91906144e8565b602060405180830381855afa158015613798573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137bb9190613f62565b94909350915050565b60015f8051602061459f83398151915255565b6137df6130cc565b6137e76139b5565b6137ef6139c5565b61315a816139cd565b6138006130cc565b5f5f8051602061453f833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613899573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138bd9190613f62565b90506138d46001600160a01b038516333086613a39565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613918573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061393c9190613f62565b90508181116139a25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161041d565b6139ac828261424d565b95945050505050565b6139bd6130cc565b613115613a93565b6131156130cc565b6139d56130cc565b80355f8051602061457f83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a1f6060830160408401614503565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526108ec908590613a9b565b6137c46130cc565b5f613aaf6001600160a01b03841683613afc565b905080515f14158015613ad3575080806020019051810190613ad19190614523565b155b15610f6d57604051635274afe760e01b81526001600160a01b038416600482015260240161041d565b606061112283835f845f80856001600160a01b03168486604051613b2091906144e8565b5f6040518083038185875af1925050503d805f8114613b5a576040519150601f19603f3d011682016040523d82523d5f602084013e613b5f565b606091505b5091509150611914868383606082613b7f57613b7a82613bc6565b611122565b8151158015613b9657506001600160a01b0384163b155b15613bbf57604051639996b31560e01b81526001600160a01b038516600482015260240161041d565b5080611122565b805115613bd65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613bfb90614042565b5f825580601f10613c0a575050565b601f0160209004905f5260205f209081019061315a91905b80821115613c35575f8155600101613c22565b5090565b801515811461315a575f80fd5b803563ffffffff81168114613c59575f80fd5b919050565b5f805f60608486031215613c70575f80fd5b833592506020840135613c8281613c39565b9150613c9060408501613c46565b90509250925092565b5f60208284031215613ca9575f80fd5b5035919050565b6001600160a01b038116811461315a575f80fd5b5f80828403610100811215613cd7575f80fd5b60e0811215613ce4575f80fd5b5082915060e0830135613cf681613cb0565b809150509250929050565b5f60208284031215613d11575f80fd5b61112282613c46565b5f8060408385031215613d2b575f80fd5b613d3483613c46565b946020939093013593505050565b80356001600160401b0381168114613c59575f80fd5b5f60208284031215613d68575f80fd5b61112282613d42565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613da757613da7613d71565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613dd557613dd5613d71565b604052919050565b5f6001600160401b03821115613df557613df5613d71565b50601f01601f191660200190565b5f805f8060808587031215613e16575f80fd5b8435935060208501359250613e2d60408601613d42565b915060608501356001600160401b03811115613e47575f80fd5b8501601f81018713613e57575f80fd5b8035613e6a613e6582613ddd565b613dad565b818152886020838501011115613e7e575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613eb0575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f0757613f07613ed3565b5092915050565b5f5b83811015613f28578181015183820152602001613f10565b50505f910152565b602081525f8251806020840152613f4e816040850160208701613f0e565b601f01601f19169190910160400192915050565b5f60208284031215613f72575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613f9b57613f9b613f79565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109e6576109e6613ed3565b600181811c9082168061405657607f821691505b60208210810361407457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546140d381614042565b806020870152604060018084165f81146140f457600181146141105761413d565b60ff19851660408a0152604084151560051b8a0101955061413d565b895f5260205f205f5b858110156141345781548b8201860152908301908801614119565b8a016040019650505b509398975050505050505050565b8051613c5981613c39565b5f8060408385031215614167575f80fd5b82516001600160401b038082111561417d575f80fd5b9084019060608287031215614190575f80fd5b614198613d85565b825181526020808401516141ab81613cb0565b828201526040840151838111156141c0575f80fd5b80850194505087601f8501126141d4575f80fd5b835192506141e4613e6584613ddd565b83815288828587010111156141f7575f80fd5b61420684838301848801613f0e565b8060408401525081955061421b81880161414b565b9450505050509250929050565b5f6001600160401b0380831681810361424357614243613ed3565b6001019392505050565b818103818111156109e6576109e6613ed3565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109e6576109e6613ed3565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610f6d57805f5260205f20601f840160051c8101602085101561437f5750805b601f840160051c820191505b8181101561156c575f815560010161438b565b81516001600160401b038111156143b7576143b7613d71565b6143cb816143c58454614042565b8461435a565b602080601f8311600181146143fe575f84156143e75750858301515b5f19600386901b1c1916600185901b178555614455565b5f85815260208120601f198616915b8281101561442c5788860151825594840194600190910190840161440d565b508582101561444957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115613f0757613f07613ed3565b5f6020828403121561448d575f80fd5b813561112281613cb0565b6001600160401b038181168382160280821691908281146144bb576144bb613ed3565b505092915050565b5f6001600160401b03808416806144dc576144dc613f79565b92169190910492915050565b5f82516144f9818460208701613f0e565b9190910192915050565b5f60208284031215614513575f80fd5b813560ff81168114611122575f80fd5b5f60208284031215614533575f80fd5b815161112281613c3956fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index dc3b2a3e6..b5887c0d6 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516142c63803806142c683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6141798061014d5f395ff3fe6080604052600436106100f9575f3560e01c806366435abf11610092578063b771b3bc11610062578063b771b3bc146102c9578063ba3a4b97146102fb578063bee0a03f1461031a578063c599e24f14610339578063f40797d71461034c575f80fd5b806366435abf1461024d57806376f786211461026c57806398f3e2b41461028b578063a3a65e48146102aa575f80fd5b80632e2194d8116100cd5780632e2194d8146101b9578063467ef06f146101f05780635297fae61461020f578063620658561461022e575f80fd5b8062e41792146100fd5780630118acc41461011e5780630322ed981461013d5780630cdd09851461015c575b5f80fd5b348015610108575f80fd5b5061011c610117366004613839565b61035f565b005b348015610129575f80fd5b5061011c610138366004613874565b610441565b348015610148575f80fd5b5061011c6101573660046138af565b6108ab565b348015610167575f80fd5b506101a66101763660046138af565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101c4575f80fd5b506101d86101d33660046138af565b6109eb565b6040516001600160401b0390911681526020016101b0565b3480156101fb575f80fd5b5061011c61020a3660046138c6565b610a01565b34801561021a575f80fd5b5061011c6102293660046138df565b610d6a565b348015610239575f80fd5b506101a661024836600461391d565b610f3a565b348015610258575f80fd5b506101d86102673660046138af565b610f53565b348015610277575f80fd5b5061011c610286366004613874565b610f67565b348015610296575f80fd5b5061011c6102a53660046138df565b610f87565b3480156102b5575f80fd5b5061011c6102c43660046138c6565b611106565b3480156102d4575f80fd5b506102e36005600160991b0181565b6040516001600160a01b0390911681526020016101b0565b348015610306575f80fd5b5061011c6103153660046138af565b6112c3565b348015610325575f80fd5b5061011c6103343660046138af565b61154f565b6101a66103473660046138af565b61165e565b6101a661035a3660046139c8565b61166a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103a8575080546001600160401b03808416911610155b156103c65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556103f08361168e565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206140cd8339815191529184156104935761049082856116a2565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104c5576104c5613a5a565b60048111156104d6576104d6613a5a565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561055d5761055d613a5a565b146105af5760405162461bcd60e51b815260206004820152602a60248201525f805160206140ed8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106145760405162461bcd60e51b815260206004820152603360248201525f805160206140ed8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105a6565b5f61061e8461193e565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561066b5761066b613a5a565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61073d856119b2565b905082606001516001600160401b03168160a001516001600160401b0316116107b45760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105a6565b5f83606001518260a001516107c99190613a82565b90506107d58682611ac3565b5f6005600160991b0163ee5b48eb6107ee898786611b0b565b6040518263ffffffff1660e01b815260040161080a9190613acb565b6020604051808303815f875af1158015610826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084a9190613afd565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061414d83398151915260205260409020545f8051602061410d8339815191529060039060ff1660058111156108eb576108eb613a5a565b146109505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105a6565b5f8281526006820160205260408120600301546109789084906001600160401b031683611b0b565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb906109a5908490600401613acb565b6020604051808303815f875af11580156109c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e59190613afd565b50505050565b5f6109fb64e8d4a5100083613b28565b92915050565b5f8051602061410d8339815191525f610a1983611d28565b90505f80610a2a8360400151611f09565b915091508015610a8f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105a6565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610ac157610ac1613a5a565b6005811115610ad257610ad2613a5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b5957610b59613a5a565b1480610b775750600182516005811115610b7557610b75613a5a565b145b610bd65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105a6565b600382516005811115610beb57610beb613a5a565b03610bf857506004610bfc565b5060055b6020808301515f90815260078801909152604081205581816005811115610c2557610c25613a5a565b90816005811115610c3857610c38613a5a565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610c6c57610c6c613a5a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d3757610d37613a5a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206140cd8339815191525f610d8284611d28565b90505f80610d9383604001516120aa565b50915091505f610da2836119b2565b9050816001600160401b031681608001516001600160401b03161015610dda5760405162461bcd60e51b81526004016105a690613b3b565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e1f5760405162461bcd60e51b81526004016105a690613b7d565b60015f87815260038701602052604090205460ff166004811115610e4557610e45613a5a565b14610eae5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105a6565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109fb6001600160401b03831664e8d4a51000613bc6565b5f610f5d826119b2565b60a0015192915050565b8115610f7957610f7783826116a2565b505b610f82836122e5565b505050565b5f805160206140cd8339815191525f610f9f84611d28565b90505f80610fb083604001516120aa565b50915091505f610fbf836119b2565b9050816001600160401b031681608001516001600160401b03161015610ff75760405162461bcd60e51b81526004016105a690613b3b565b5f8681526003808701602052604090912001546001600160401b03808416911611156110355760405162461bcd60e51b81526004016105a690613b7d565b60035f87815260038701602052604090205460ff16600481111561105b5761105b613a5a565b146110af5760405162461bcd60e51b815260206004820152603160248201525f805160206140ed8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105a6565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f8051602061410d8339815191525f61111e83611d28565b90505f8061112f8360400151611f09565b91509150806111915760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105a6565b5f828152600585016020526040812080546111ab90613bdd565b90501180156111dd575060015f83815260068601602052604090205460ff1660058111156111db576111db613a5a565b145b6111f95760405162461bcd60e51b81526004016105a690613c0f565b5f8281526005850160205260408120611211916137ef565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f805160206140cd83398151915293929190829060ff16600481111561132457611324613a5a565b600481111561133557611335613a5a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091505f84815260038401602052604090205460ff1660048111156113cd576113cd613a5a565b1461142d5760405162461bcd60e51b815260206004820152603860248201525f805160206140ed83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105a6565b5f61143b82604001516119b2565b905080608001516001600160401b03165f036114bf5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105a6565b6005600160991b016001600160a01b031663ee5b48eb6114ec846040015184608001518560a00151611b0b565b6040518263ffffffff1660e01b81526004016115089190613acb565b6020604051808303815f875af1158015611524573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115489190613afd565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061410d83398151915292919061159790613bdd565b90501180156115c9575060015f83815260068301602052604090205460ff1660058111156115c7576115c7613a5a565b145b6115e55760405162461bcd60e51b81526004016105a690613c0f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161161e9190600401613c56565b6020604051808303815f875af115801561163a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f829190613afd565b5f6109fb823334612683565b5f80611675346129f2565b905061168385828686612a9c565b9150505b9392505050565b611696612ef1565b61169f81612f3c565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156116ed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117149190810190613cff565b91509150806117775760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105a6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117de9190613afd565b8251146118425760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105a6565b60208201516001600160a01b0316156118b85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105a6565b5f806118c78460400151612f7f565b915091508187146119345760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105a6565b9695505050505050565b5f8181525f8051602061414d8339815191526020526040812060030180545f8051602061410d833981519152916001600160401b039091169081908461198383613dd1565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061414d83398151915290528390208351918201909352825491925f8051602061410d83398151915292829060ff166005811115611a3a57611a3a613a5a565b6005811115611a4b57611a4b613a5a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061414d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611b8457611b44816001613df6565b611b4f906008613bc6565b5081515f90839083908110611b6657611b66613e09565b60200101906001600160f81b03191690815f1a905350600101611b30565b505f5b6004811015611be757611b9b816003613df6565b611ba6906008613bc6565b6001901c60f81b82611bb9836002613e1d565b81518110611bc957611bc9613e09565b60200101906001600160f81b03191690815f1a905350600101611b87565b505f5b6020811015611c4957611bfe81601f613df6565b611c09906008613bc6565b86901c60f81b82611c1b836006613e1d565b81518110611c2b57611c2b613e09565b60200101906001600160f81b03191690815f1a905350600101611bea565b505f5b6008811015611cb457611c60816007613df6565b611c6b906008613bc6565b6001600160401b038616901c60f81b82611c86836026613e1d565b81518110611c9657611c96613e09565b60200101906001600160f81b03191690815f1a905350600101611c4c565b505f5b6008811015611d1f57611ccb816007613df6565b611cd6906008613bc6565b6001600160401b038516901c60f81b82611cf183602e613e1d565b81518110611d0157611d01613e09565b60200101906001600160f81b03191690815f1a905350600101611cb7565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f8051602061410d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d9d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611dc49190810190613cff565b9150915080611e2b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105a6565b8254825114611e8e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105a6565b60208201516001600160a01b031615611f015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105a6565b509392505050565b5f808251602714611f2c5760405162461bcd60e51b81526004016105a690613e30565b5f805b6002811015611f7b57611f43816001613df6565b611f4e906008613bc6565b61ffff16858281518110611f6457611f64613e09565b016020015160f81c901b9190911790600101611f2f565b5061ffff811615611f9e5760405162461bcd60e51b81526004016105a690613e79565b5f805b6004811015611ff957611fb5816003613df6565b611fc0906008613bc6565b63ffffffff1686611fd2836002613e1d565b81518110611fe257611fe2613e09565b016020015160f81c901b9190911790600101611fa1565b5063ffffffff81166002146120205760405162461bcd60e51b81526004016105a690613ebc565b5f805b60208110156120755761203781601f613df6565b612042906008613bc6565b8761204e836006613e1d565b8151811061205e5761205e613e09565b016020015160f81c901b9190911790600101612023565b505f8660268151811061208a5761208a613e09565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146120ce5760405162461bcd60e51b81526004016105a690613e30565b5f805b600281101561211d576120e5816001613df6565b6120f0906008613bc6565b61ffff1686828151811061210657612106613e09565b016020015160f81c901b91909117906001016120d1565b5061ffff8116156121405760405162461bcd60e51b81526004016105a690613e79565b5f805b600481101561219b57612157816003613df6565b612162906008613bc6565b63ffffffff1687612174836002613e1d565b8151811061218457612184613e09565b016020015160f81c901b9190911790600101612143565b5063ffffffff81166003146121c25760405162461bcd60e51b81526004016105a690613ebc565b5f805b6020811015612217576121d981601f613df6565b6121e4906008613bc6565b886121f0836006613e1d565b8151811061220057612200613e09565b016020015160f81c901b91909117906001016121c5565b505f805b60088110156122765761222f816007613df6565b61223a906008613bc6565b6001600160401b03168961224f836026613e1d565b8151811061225f5761225f613e09565b016020015160f81c901b919091179060010161221b565b505f805b60088110156122d55761228e816007613df6565b612299906008613bc6565b6001600160401b03168a6122ae83602e613e1d565b815181106122be576122be613e09565b016020015160f81c901b919091179060010161227a565b5091989097509095509350505050565b5f8181525f8051602061414d83398151915260205260408082208151610100810190925280545f8051602061410d83398151915293929190829060ff16600581111561233357612333613a5a565b600581111561234457612344613a5a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123cc576123cc613a5a565b146124285760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105a6565b60408101516001600160a01b0316336001600160a01b0316146124a25760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105a6565b6124af8160a00151613157565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156124f3576124f3613a5a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125bf846125b98161193e565b5f611b0b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906125ee908590600401613acb565b6020604051808303815f875af115801561260a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061262e9190613afd565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61268c6132f8565b5f612696836109eb565b90505f805160206140cd8339815191525f6126b0876119b2565b90506002815160058111156126c7576126c7613a5a565b146127265760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105a6565b5f838260a001516127379190613f03565b90506127438882611ac3565b5f61274d8961193e565b90505f8989836040516020016127959392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090506127b686613157565b5f6005600160991b0163ee5b48eb6127cf8d8688611b0b565b6040518263ffffffff1660e01b81526004016127eb9190613acb565b6020604051808303815f875af1158015612807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061282b9190613afd565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff191660018360048111156128b3576128b3613a5a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061168760015f8051602061412d83398151915255565b5f5f805160206140cd8339815191528282612a0c826109eb565b83549091506001600160401b03821610801590612a3657508260010154816001600160401b031611155b612a945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105a6565b949350505050565b5f612aa56132f8565b5f8051602061410d833981519152426001600160401b038516118015612adf57506001600160401b038416612add426202a300613e1d565b115b612b415760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105a6565b85612b985760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105a6565b5f86815260078201602052604090205415612c065760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105a6565b8251603014612c6d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105a6565b612c7685613157565b5f80612cbd6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613342565b5f82815260058601602052604090209193509150612cdb8282613f67565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d08908590600401613acb565b6020604051808303815f875af1158015612d24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d489190613afd565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612dca57612dca613a5a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612e8b8361193e565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612a9460015f8051602061412d83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612f3a57604051631afcd79f60e31b815260040160405180910390fd5b565b612f44612ef1565b612f4d816136e7565b61169f60608201356080830135612f6a60c0850160a0860161391d565b612f7a60e0860160c08701614026565b613708565b5f808251602e14612fa25760405162461bcd60e51b81526004016105a690613e30565b5f805b6002811015612ff157612fb9816001613df6565b612fc4906008613bc6565b61ffff16858281518110612fda57612fda613e09565b016020015160f81c901b9190911790600101612fa5565b5061ffff8116156130145760405162461bcd60e51b81526004016105a690613e79565b5f805b600481101561306f5761302b816003613df6565b613036906008613bc6565b63ffffffff1686613048836002613e1d565b8151811061305857613058613e09565b016020015160f81c901b9190911790600101613017565b5063ffffffff81166004146130965760405162461bcd60e51b81526004016105a690613ebc565b5f805b60208110156130eb576130ad81601f613df6565b6130b8906008613bc6565b876130c4836006613e1d565b815181106130d4576130d4613e09565b016020015160f81c901b9190911790600101613099565b505f805b600881101561314a57613103816007613df6565b61310e906008613bc6565b6001600160401b031688613123836026613e1d565b8151811061313357613133613e09565b016020015160f81c901b91909117906001016130ef565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061410d8339815191529060ff165f03613195575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906131dd9083613df6565b106131f9576001600160401b0384166040830152808252613218565b838260400181815161320b9190613f03565b6001600160401b03169052505b5f82602001518360400151606461322f9190614041565b613239919061406c565b600285015490915060ff90811690821611156132b45760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105a6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061412d83398151915280546001190161332957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061412d83398151915255565b5f60608260800151516030146133ac5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105a6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613423576133e3816001613df6565b6133ee906008613bc6565b5081515f9083908390811061340557613405613e09565b60200101906001600160f81b03191690815f1a9053506001016133cf565b505f5b60048110156134815761343a816003613df6565b613445906008613bc6565b505f82613453836002613e1d565b8151811061346357613463613e09565b60200101906001600160f81b03191690815f1a905350600101613426565b505f5b60208110156134de57845181602081106134a0576134a0613e09565b1a60f81b826134b0836006613e1d565b815181106134c0576134c0613e09565b60200101906001600160f81b03191690815f1a905350600101613484565b505f5b602081101561353e578460200151816020811061350057613500613e09565b1a60f81b82613510836026613e1d565b8151811061352057613520613e09565b60200101906001600160f81b03191690815f1a9053506001016134e1565b505f5b60088110156135b257613555816007613df6565b613560906008613bc6565b60ff1685604001516001600160401b0316901c60f81b828260466135849190613e1d565b8151811061359457613594613e09565b60200101906001600160f81b03191690815f1a905350600101613541565b505f5b603081101561361d57846080015181815181106135d4576135d4613e09565b01602001516001600160f81b031916826135ef83604e613e1d565b815181106135ff576135ff613e09565b60200101906001600160f81b03191690815f1a9053506001016135b5565b505f5b600881101561368f57613634816007613df6565b61363f906008613bc6565b60608601516001600160401b0390811691161c60f81b8261366183607e613e1d565b8151811061367157613671613e09565b60200101906001600160f81b03191690815f1a905350600101613620565b506002816040516136a09190614091565b602060405180830381855afa1580156136bb573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906136de9190613afd565b94909350915050565b6136ef612ef1565b6136f7613763565b6136ff613773565b61169f8161377b565b613710612ef1565b5f5f805160206140cd833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61376b612ef1565b612f3a6137e7565b612f3a612ef1565b613783612ef1565b80355f8051602061410d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556137cd60608301604084016140ac565b600291909101805460ff191660ff90921691909117905550565b61332f612ef1565b5080546137fb90613bdd565b5f825580601f1061380a575050565b601f0160209004905f5260205f209081019061169f91905b80821115613835575f8155600101613822565b5090565b5f60e08284031215613849575f80fd5b50919050565b801515811461169f575f80fd5b803563ffffffff8116811461386f575f80fd5b919050565b5f805f60608486031215613886575f80fd5b8335925060208401356138988161384f565b91506138a66040850161385c565b90509250925092565b5f602082840312156138bf575f80fd5b5035919050565b5f602082840312156138d6575f80fd5b6116878261385c565b5f80604083850312156138f0575f80fd5b6138f98361385c565b946020939093013593505050565b80356001600160401b038116811461386f575f80fd5b5f6020828403121561392d575f80fd5b61168782613907565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561396c5761396c613936565b60405290565b604051601f8201601f191681016001600160401b038111828210171561399a5761399a613936565b604052919050565b5f6001600160401b038211156139ba576139ba613936565b50601f01601f191660200190565b5f805f606084860312156139da575f80fd5b833592506139ea60208501613907565b915060408401356001600160401b03811115613a04575f80fd5b8401601f81018613613a14575f80fd5b8035613a27613a22826139a2565b613972565b818152876020838501011115613a3b575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613aa257613aa2613a6e565b5092915050565b5f5b83811015613ac3578181015183820152602001613aab565b50505f910152565b602081525f8251806020840152613ae9816040850160208701613aa9565b601f01601f19169190910160400192915050565b5f60208284031215613b0d575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613b3657613b36613b14565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109fb576109fb613a6e565b600181811c90821680613bf157607f821691505b60208210810361384957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613c6881613bdd565b806020870152604060018084165f8114613c895760018114613ca557613cd2565b60ff19851660408a0152604084151560051b8a01019550613cd2565b895f5260205f205f5b85811015613cc95781548b8201860152908301908801613cae565b8a016040019650505b509398975050505050505050565b6001600160a01b038116811461169f575f80fd5b805161386f8161384f565b5f8060408385031215613d10575f80fd5b82516001600160401b0380821115613d26575f80fd5b9084019060608287031215613d39575f80fd5b613d4161394a565b82518152602080840151613d5481613ce0565b82820152604084015183811115613d69575f80fd5b80850194505087601f850112613d7d575f80fd5b83519250613d8d613a22846139a2565b8381528882858701011115613da0575f80fd5b613daf84838301848801613aa9565b80604084015250819550613dc4818801613cf4565b9450505050509250929050565b5f6001600160401b03808316818103613dec57613dec613a6e565b6001019392505050565b818103818111156109fb576109fb613a6e565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109fb576109fb613a6e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613aa257613aa2613a6e565b601f821115610f8257805f5260205f20601f840160051c81016020851015613f485750805b601f840160051c820191505b81811015611548575f8155600101613f54565b81516001600160401b03811115613f8057613f80613936565b613f9481613f8e8454613bdd565b84613f23565b602080601f831160018114613fc7575f8415613fb05750858301515b5f19600386901b1c1916600185901b17855561401e565b5f85815260208120601f198616915b82811015613ff557888601518255948401946001909101908401613fd6565b508582101561401257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614036575f80fd5b813561168781613ce0565b6001600160401b0381811683821602808216919082811461406457614064613a6e565b505092915050565b5f6001600160401b038084168061408557614085613b14565b92169190910492915050565b5f82516140a2818460208701613aa9565b9190910192915050565b5f602082840312156140bc575f80fd5b813560ff81168114611687575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161435638038061435683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6142098061014d5f395ff3fe6080604052600436106100f9575f3560e01c806366435abf11610092578063b771b3bc11610062578063b771b3bc146102c9578063ba3a4b97146102fb578063bee0a03f1461031a578063c599e24f14610339578063f40797d71461034c575f80fd5b806366435abf1461024d57806376f786211461026c57806398f3e2b41461028b578063a3a65e48146102aa575f80fd5b80632e2194d8116100cd5780632e2194d8146101b9578063467ef06f146101f05780635297fae61461020f578063620658561461022e575f80fd5b8062e41792146100fd5780630118acc41461011e5780630322ed981461013d5780630cdd09851461015c575b5f80fd5b348015610108575f80fd5b5061011c6101173660046138c9565b61035f565b005b348015610129575f80fd5b5061011c610138366004613904565b610441565b348015610148575f80fd5b5061011c61015736600461393f565b6108ab565b348015610167575f80fd5b506101a661017636600461393f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101c4575f80fd5b506101d86101d336600461393f565b610a7b565b6040516001600160401b0390911681526020016101b0565b3480156101fb575f80fd5b5061011c61020a366004613956565b610a91565b34801561021a575f80fd5b5061011c61022936600461396f565b610dfa565b348015610239575f80fd5b506101a66102483660046139ad565b610fca565b348015610258575f80fd5b506101d861026736600461393f565b610fe3565b348015610277575f80fd5b5061011c610286366004613904565b610ff7565b348015610296575f80fd5b5061011c6102a536600461396f565b611017565b3480156102b5575f80fd5b5061011c6102c4366004613956565b611196565b3480156102d4575f80fd5b506102e36005600160991b0181565b6040516001600160a01b0390911681526020016101b0565b348015610306575f80fd5b5061011c61031536600461393f565b611353565b348015610325575f80fd5b5061011c61033436600461393f565b6115e0565b6101a661034736600461393f565b6116ef565b6101a661035a366004613a58565b6116fb565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103a8575080546001600160401b03808416911610155b156103c65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556103f08361171f565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061415d833981519152918415610493576104908285611733565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104c5576104c5613aea565b60048111156104d6576104d6613aea565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561055d5761055d613aea565b146105af5760405162461bcd60e51b815260206004820152602a60248201525f8051602061417d8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106145760405162461bcd60e51b815260206004820152603360248201525f8051602061417d8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105a6565b5f61061e846119cf565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561066b5761066b613aea565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61073d85611a51565b905082606001516001600160401b03168160a001516001600160401b0316116107b45760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105a6565b5f83606001518260a001516107c99190613b12565b90506107d58682611b62565b5f6005600160991b0163ee5b48eb6107ee898786611baa565b6040518263ffffffff1660e01b815260040161080a9190613b5b565b6020604051808303815f875af1158015610826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084a9190613b8d565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206141dd83398151915260205260408082208151610100810190925280545f8051602061419d83398151915293929190829060ff1660058111156108f9576108f9613aea565b600581111561090a5761090a613aea565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561098f5761098f613aea565b146109f45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105a6565b6005600160991b016001600160a01b031663ee5b48eb610a198584608001515f611baa565b6040518263ffffffff1660e01b8152600401610a359190613b5b565b6020604051808303815f875af1158015610a51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a759190613b8d565b50505050565b5f610a8b64e8d4a5100083613bb8565b92915050565b5f8051602061419d8339815191525f610aa983611dc7565b90505f80610aba8360400151611fa8565b915091508015610b1f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105a6565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610b5157610b51613aea565b6005811115610b6257610b62613aea565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610be957610be9613aea565b1480610c075750600182516005811115610c0557610c05613aea565b145b610c665760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105a6565b600382516005811115610c7b57610c7b613aea565b03610c8857506004610c8c565b5060055b6020808301515f90815260078801909152604081205581816005811115610cb557610cb5613aea565b90816005811115610cc857610cc8613aea565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610cfc57610cfc613aea565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610dc757610dc7613aea565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f8051602061415d8339815191525f610e1284611dc7565b90505f80610e238360400151612149565b50915091505f610e3283611a51565b9050816001600160401b031681608001516001600160401b03161015610e6a5760405162461bcd60e51b81526004016105a690613bcb565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610eaf5760405162461bcd60e51b81526004016105a690613c0d565b60015f87815260038701602052604090205460ff166004811115610ed557610ed5613aea565b14610f3e5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105a6565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a8b6001600160401b03831664e8d4a51000613c56565b5f610fed82611a51565b60a0015192915050565b8115611009576110078382611733565b505b61101283612384565b505050565b5f8051602061415d8339815191525f61102f84611dc7565b90505f806110408360400151612149565b50915091505f61104f83611a51565b9050816001600160401b031681608001516001600160401b031610156110875760405162461bcd60e51b81526004016105a690613bcb565b5f8681526003808701602052604090912001546001600160401b03808416911611156110c55760405162461bcd60e51b81526004016105a690613c0d565b60035f87815260038701602052604090205460ff1660048111156110eb576110eb613aea565b1461113f5760405162461bcd60e51b815260206004820152603160248201525f8051602061417d8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105a6565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f8051602061419d8339815191525f6111ae83611dc7565b90505f806111bf8360400151611fa8565b91509150806112215760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105a6565b5f8281526005850160205260408120805461123b90613c6d565b905011801561126d575060015f83815260068601602052604090205460ff16600581111561126b5761126b613aea565b145b6112895760405162461bcd60e51b81526004016105a690613c9f565b5f82815260058501602052604081206112a19161387f565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f8051602061415d83398151915293929190829060ff1660048111156113b4576113b4613aea565b60048111156113c5576113c5613aea565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561144c5761144c613aea565b148061146a575060038151600481111561146857611468613aea565b145b6114be5760405162461bcd60e51b815260206004820152603260248201525f8051602061417d833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105a6565b5f6114cc8260400151611a51565b905080608001516001600160401b03165f036115505760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105a6565b6005600160991b016001600160a01b031663ee5b48eb61157d846040015184608001518560a00151611baa565b6040518263ffffffff1660e01b81526004016115999190613b5b565b6020604051808303815f875af11580156115b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d99190613b8d565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061419d83398151915292919061162890613c6d565b905011801561165a575060015f83815260068301602052604090205460ff16600581111561165857611658613aea565b145b6116765760405162461bcd60e51b81526004016105a690613c9f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916116af9190600401613ce6565b6020604051808303815f875af11580156116cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110129190613b8d565b5f610a8b823334612722565b5f8061170634612a91565b905061171485828686612b3b565b9150505b9392505050565b611727612f81565b61173081612fcc565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561177e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117a59190810190613d8f565b91509150806118085760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105a6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561184b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061186f9190613b8d565b8251146118d35760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105a6565b60208201516001600160a01b0316156119495760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105a6565b5f80611958846040015161300f565b915091508187146119c55760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105a6565b9695505050505050565b5f8181525f805160206141dd8339815191526020526040812060030180545f8051602061419d833981519152916001600160401b039091169083611a1283613e61565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f805160206141dd83398151915290528390208351918201909352825491925f8051602061419d83398151915292829060ff166005811115611ad957611ad9613aea565b6005811115611aea57611aea613aea565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206141dd833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611c2357611be3816001613e86565b611bee906008613c56565b5081515f90839083908110611c0557611c05613e99565b60200101906001600160f81b03191690815f1a905350600101611bcf565b505f5b6004811015611c8657611c3a816003613e86565b611c45906008613c56565b6001901c60f81b82611c58836002613ead565b81518110611c6857611c68613e99565b60200101906001600160f81b03191690815f1a905350600101611c26565b505f5b6020811015611ce857611c9d81601f613e86565b611ca8906008613c56565b86901c60f81b82611cba836006613ead565b81518110611cca57611cca613e99565b60200101906001600160f81b03191690815f1a905350600101611c89565b505f5b6008811015611d5357611cff816007613e86565b611d0a906008613c56565b6001600160401b038616901c60f81b82611d25836026613ead565b81518110611d3557611d35613e99565b60200101906001600160f81b03191690815f1a905350600101611ceb565b505f5b6008811015611dbe57611d6a816007613e86565b611d75906008613c56565b6001600160401b038516901c60f81b82611d9083602e613ead565b81518110611da057611da0613e99565b60200101906001600160f81b03191690815f1a905350600101611d56565b50949350505050565b60408051606080820183525f8083526020830181905292820152905f8051602061419d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e3c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e639190810190613d8f565b9150915080611eca5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105a6565b8254825114611f2d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105a6565b60208201516001600160a01b031615611fa05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105a6565b509392505050565b5f808251602714611fcb5760405162461bcd60e51b81526004016105a690613ec0565b5f805b600281101561201a57611fe2816001613e86565b611fed906008613c56565b61ffff1685828151811061200357612003613e99565b016020015160f81c901b9190911790600101611fce565b5061ffff81161561203d5760405162461bcd60e51b81526004016105a690613f09565b5f805b600481101561209857612054816003613e86565b61205f906008613c56565b63ffffffff1686612071836002613ead565b8151811061208157612081613e99565b016020015160f81c901b9190911790600101612040565b5063ffffffff81166002146120bf5760405162461bcd60e51b81526004016105a690613f4c565b5f805b6020811015612114576120d681601f613e86565b6120e1906008613c56565b876120ed836006613ead565b815181106120fd576120fd613e99565b016020015160f81c901b91909117906001016120c2565b505f8660268151811061212957612129613e99565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461216d5760405162461bcd60e51b81526004016105a690613ec0565b5f805b60028110156121bc57612184816001613e86565b61218f906008613c56565b61ffff168682815181106121a5576121a5613e99565b016020015160f81c901b9190911790600101612170565b5061ffff8116156121df5760405162461bcd60e51b81526004016105a690613f09565b5f805b600481101561223a576121f6816003613e86565b612201906008613c56565b63ffffffff1687612213836002613ead565b8151811061222357612223613e99565b016020015160f81c901b91909117906001016121e2565b5063ffffffff81166003146122615760405162461bcd60e51b81526004016105a690613f4c565b5f805b60208110156122b65761227881601f613e86565b612283906008613c56565b8861228f836006613ead565b8151811061229f5761229f613e99565b016020015160f81c901b9190911790600101612264565b505f805b6008811015612315576122ce816007613e86565b6122d9906008613c56565b6001600160401b0316896122ee836026613ead565b815181106122fe576122fe613e99565b016020015160f81c901b91909117906001016122ba565b505f805b60088110156123745761232d816007613e86565b612338906008613c56565b6001600160401b03168a61234d83602e613ead565b8151811061235d5761235d613e99565b016020015160f81c901b9190911790600101612319565b5091989097509095509350505050565b5f8181525f805160206141dd83398151915260205260408082208151610100810190925280545f8051602061419d83398151915293929190829060ff1660058111156123d2576123d2613aea565b60058111156123e3576123e3613aea565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561246b5761246b613aea565b146124c75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105a6565b60408101516001600160a01b0316336001600160a01b0316146125415760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105a6565b61254e8160a001516131e7565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561259257612592613aea565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61265e84612658816119cf565b5f611baa565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061268d908590600401613b5b565b6020604051808303815f875af11580156126a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126cd9190613b8d565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61272b613388565b5f61273583610a7b565b90505f8051602061415d8339815191525f61274f87611a51565b905060028151600581111561276657612766613aea565b146127c55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105a6565b5f838260a001516127d69190613f93565b90506127e28882611b62565b5f6127ec896119cf565b90505f8989836040516020016128349392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612855866131e7565b5f6005600160991b0163ee5b48eb61286e8d8688611baa565b6040518263ffffffff1660e01b815260040161288a9190613b5b565b6020604051808303815f875af11580156128a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ca9190613b8d565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff1916600183600481111561295257612952613aea565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061171860015f805160206141bd83398151915255565b5f5f8051602061415d8339815191528282612aab82610a7b565b83549091506001600160401b03821610801590612ad557508260010154816001600160401b031611155b612b335760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105a6565b949350505050565b5f612b44613388565b5f8051602061419d833981519152426001600160401b038516118015612b7e57506001600160401b038416612b7c426202a300613ead565b115b612be05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105a6565b85612c375760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105a6565b5f86815260078201602052604090205415612ca55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105a6565b8251603014612d0c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105a6565b612d15856131e7565b5f80612d5c6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506133d2565b5f82815260058601602052604090209193509150612d7a8282613ff7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612da7908590600401613b5b565b6020604051808303815f875af1158015612dc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612de79190613b8d565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115612e6957612e69613aea565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b3360015f805160206141bd83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16612fca57604051631afcd79f60e31b815260040160405180910390fd5b565b612fd4612f81565b612fdd81613777565b61173060608201356080830135612ffa60c0850160a086016139ad565b61300a60e0860160c087016140b6565b613798565b5f808251602e146130325760405162461bcd60e51b81526004016105a690613ec0565b5f805b600281101561308157613049816001613e86565b613054906008613c56565b61ffff1685828151811061306a5761306a613e99565b016020015160f81c901b9190911790600101613035565b5061ffff8116156130a45760405162461bcd60e51b81526004016105a690613f09565b5f805b60048110156130ff576130bb816003613e86565b6130c6906008613c56565b63ffffffff16866130d8836002613ead565b815181106130e8576130e8613e99565b016020015160f81c901b91909117906001016130a7565b5063ffffffff81166004146131265760405162461bcd60e51b81526004016105a690613f4c565b5f805b602081101561317b5761313d81601f613e86565b613148906008613c56565b87613154836006613ead565b8151811061316457613164613e99565b016020015160f81c901b9190911790600101613129565b505f805b60088110156131da57613193816007613e86565b61319e906008613c56565b6001600160401b0316886131b3836026613ead565b815181106131c3576131c3613e99565b016020015160f81c901b919091179060010161317f565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061419d8339815191529060ff165f03613225575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061326d9083613e86565b10613289576001600160401b03841660408301528082526132a8565b838260400181815161329b9190613f93565b6001600160401b03169052505b5f8260200151836040015160646132bf91906140d1565b6132c991906140fc565b600285015490915060ff90811690821611156133445760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105a6565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206141bd8339815191528054600119016133b957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206141bd83398151915255565b5f606082608001515160301461343c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105a6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134b357613473816001613e86565b61347e906008613c56565b5081515f9083908390811061349557613495613e99565b60200101906001600160f81b03191690815f1a90535060010161345f565b505f5b6004811015613511576134ca816003613e86565b6134d5906008613c56565b505f826134e3836002613ead565b815181106134f3576134f3613e99565b60200101906001600160f81b03191690815f1a9053506001016134b6565b505f5b602081101561356e578451816020811061353057613530613e99565b1a60f81b82613540836006613ead565b8151811061355057613550613e99565b60200101906001600160f81b03191690815f1a905350600101613514565b505f5b60208110156135ce578460200151816020811061359057613590613e99565b1a60f81b826135a0836026613ead565b815181106135b0576135b0613e99565b60200101906001600160f81b03191690815f1a905350600101613571565b505f5b6008811015613642576135e5816007613e86565b6135f0906008613c56565b60ff1685604001516001600160401b0316901c60f81b828260466136149190613ead565b8151811061362457613624613e99565b60200101906001600160f81b03191690815f1a9053506001016135d1565b505f5b60308110156136ad578460800151818151811061366457613664613e99565b01602001516001600160f81b0319168261367f83604e613ead565b8151811061368f5761368f613e99565b60200101906001600160f81b03191690815f1a905350600101613645565b505f5b600881101561371f576136c4816007613e86565b6136cf906008613c56565b60608601516001600160401b0390811691161c60f81b826136f183607e613ead565b8151811061370157613701613e99565b60200101906001600160f81b03191690815f1a9053506001016136b0565b506002816040516137309190614121565b602060405180830381855afa15801561374b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061376e9190613b8d565b94909350915050565b61377f612f81565b6137876137f3565b61378f613803565b6117308161380b565b6137a0612f81565b5f5f8051602061415d833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6137fb612f81565b612fca613877565b612fca612f81565b613813612f81565b80355f8051602061419d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561385d606083016040840161413c565b600291909101805460ff191660ff90921691909117905550565b6133bf612f81565b50805461388b90613c6d565b5f825580601f1061389a575050565b601f0160209004905f5260205f209081019061173091905b808211156138c5575f81556001016138b2565b5090565b5f60e082840312156138d9575f80fd5b50919050565b8015158114611730575f80fd5b803563ffffffff811681146138ff575f80fd5b919050565b5f805f60608486031215613916575f80fd5b833592506020840135613928816138df565b9150613936604085016138ec565b90509250925092565b5f6020828403121561394f575f80fd5b5035919050565b5f60208284031215613966575f80fd5b611718826138ec565b5f8060408385031215613980575f80fd5b613989836138ec565b946020939093013593505050565b80356001600160401b03811681146138ff575f80fd5b5f602082840312156139bd575f80fd5b61171882613997565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156139fc576139fc6139c6565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613a2a57613a2a6139c6565b604052919050565b5f6001600160401b03821115613a4a57613a4a6139c6565b50601f01601f191660200190565b5f805f60608486031215613a6a575f80fd5b83359250613a7a60208501613997565b915060408401356001600160401b03811115613a94575f80fd5b8401601f81018613613aa4575f80fd5b8035613ab7613ab282613a32565b613a02565b818152876020838501011115613acb575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613b3257613b32613afe565b5092915050565b5f5b83811015613b53578181015183820152602001613b3b565b50505f910152565b602081525f8251806020840152613b79816040850160208701613b39565b601f01601f19169190910160400192915050565b5f60208284031215613b9d575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82613bc657613bc6613ba4565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a8b57610a8b613afe565b600181811c90821680613c8157607f821691505b6020821081036138d957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613cf881613c6d565b806020870152604060018084165f8114613d195760018114613d3557613d62565b60ff19851660408a0152604084151560051b8a01019550613d62565b895f5260205f205f5b85811015613d595781548b8201860152908301908801613d3e565b8a016040019650505b509398975050505050505050565b6001600160a01b0381168114611730575f80fd5b80516138ff816138df565b5f8060408385031215613da0575f80fd5b82516001600160401b0380821115613db6575f80fd5b9084019060608287031215613dc9575f80fd5b613dd16139da565b82518152602080840151613de481613d70565b82820152604084015183811115613df9575f80fd5b80850194505087601f850112613e0d575f80fd5b83519250613e1d613ab284613a32565b8381528882858701011115613e30575f80fd5b613e3f84838301848801613b39565b80604084015250819550613e54818801613d84565b9450505050509250929050565b5f6001600160401b03808316818103613e7c57613e7c613afe565b6001019392505050565b81810381811115610a8b57610a8b613afe565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a8b57610a8b613afe565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613b3257613b32613afe565b601f82111561101257805f5260205f20601f840160051c81016020851015613fd85750805b601f840160051c820191505b818110156115d9575f8155600101613fe4565b81516001600160401b03811115614010576140106139c6565b6140248161401e8454613c6d565b84613fb3565b602080601f831160018114614057575f84156140405750858301515b5f19600386901b1c1916600185901b1785556140ae565b5f85815260208120601f198616915b8281101561408557888601518255948401946001909101908401614066565b50858210156140a257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156140c6575f80fd5b813561171881613d70565b6001600160401b038181168382160280821691908281146140f4576140f4613afe565b505092915050565b5f6001600160401b038084168061411557614115613ba4565b92169190910492915050565b5f8251614132818460208701613b39565b9190910192915050565b5f6020828403121561414c575f80fd5b813560ff81168114611718575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 6127a29df..f386168cc 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -39,7 +39,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612b90380380612b9083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a438061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd366004612339565b61023f565b005b6101226100f2366004612339565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101226101433660046123fd565b610384565b6100e26101563660046124a0565b6103a4565b61016e610169366004612339565b61070d565b6040516001600160401b03909116815260200161012c565b6100e2610721565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e0366004612339565b610734565b6100e26101f33660046124a0565b610740565b6101ba6005600160991b0181565b6100e2610214366004612339565b6108fd565b6100e26102273660046124de565b610a11565b6100e261023a36600461251a565b610b1f565b5f8181525f80516020612a1783398151915260205260409020545f805160206129f78339815191529060039060ff16600581111561027f5761027f612535565b146102e95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f8281526006820160205260408120600301546103119084906001600160401b031683610b59565b60405163ee5b48eb60e01b81529091506005600160991b019063ee5b48eb9061033e90849060040161256b565b6020604051808303815f875af115801561035a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037e919061259d565b50505050565b5f61038d610d76565b61039984868585610dd1565b90505b949350505050565b5f805160206129f78339815191525f6103bc83611239565b90505f806103cd836040015161141a565b9150915080156104325760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016102e0565b5f828152600685016020526040808220815161010081019092528054829060ff16600581111561046457610464612535565b600581111561047557610475612535565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156104fc576104fc612535565b148061051a575060018251600581111561051857610518612535565b145b6105795760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016102e0565b60038251600581111561058e5761058e612535565b0361059b5750600461059f565b5060055b6020808301515f908152600788019091526040812055818160058111156105c8576105c8612535565b908160058111156105db576105db612535565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561060f5761060f612535565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156106da576106da612535565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61071782611679565b60a0015192915050565b610729610d76565b6107325f61178a565b565b61073d816117fa565b50565b5f805160206129f78339815191525f61075883611239565b90505f80610769836040015161141a565b91509150806107cb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016102e0565b5f828152600585016020526040812080546107e5906125b4565b9050118015610817575060015f83815260068601602052604090205460ff16600581111561081557610815612535565b145b6108335760405162461bcd60e51b81526004016102e0906125ec565b5f828152600585016020526040812061084b916122ef565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206129f7833981519152929190610945906125b4565b9050118015610977575060015f83815260068301602052604090205460ff16600581111561097557610975612535565b145b6109935760405162461bcd60e51b81526004016102e0906125ec565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109cc9190600401612633565b6020604051808303815f875af11580156109e8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0c919061259d565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a555750825b90505f826001600160401b03166001148015610a705750303b155b905081158015610a7e575080155b15610a9c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ac657845460ff60401b1916600160401b1785555b610ad08787611b98565b8315610b1657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610b27610d76565b6001600160a01b038116610b5057604051631e4fbdf760e01b81525f60048201526024016102e0565b61073d8161178a565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610bd257610b928160016126d1565b610b9d9060086126ea565b5081515f90839083908110610bb457610bb4612701565b60200101906001600160f81b03191690815f1a905350600101610b7e565b505f5b6004811015610c3557610be98160036126d1565b610bf49060086126ea565b6001901c60f81b82610c07836002612715565b81518110610c1757610c17612701565b60200101906001600160f81b03191690815f1a905350600101610bd5565b505f5b6020811015610c9757610c4c81601f6126d1565b610c579060086126ea565b86901c60f81b82610c69836006612715565b81518110610c7957610c79612701565b60200101906001600160f81b03191690815f1a905350600101610c38565b505f5b6008811015610d0257610cae8160076126d1565b610cb99060086126ea565b6001600160401b038616901c60f81b82610cd4836026612715565b81518110610ce457610ce4612701565b60200101906001600160f81b03191690815f1a905350600101610c9a565b505f5b6008811015610d6d57610d198160076126d1565b610d249060086126ea565b6001600160401b038516901c60f81b82610d3f83602e612715565b81518110610d4f57610d4f612701565b60200101906001600160f81b03191690815f1a905350600101610d05565b50949350505050565b33610da87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107325760405163118cdaa760e01b81523360048201526024016102e0565b5f610dda611bb6565b5f805160206129f7833981519152426001600160401b038516118015610e1457506001600160401b038416610e12426202a300612715565b115b610e765760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016102e0565b85610ecd5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016102e0565b5f86815260078201602052604090205415610f3b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016102e0565b8251603014610fa25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016102e0565b610fab85611c00565b5f80610ff26040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611da1565b5f828152600586016020526040902091935091506110108282612773565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061103d90859060040161256b565b6020604051808303815f875af1158015611059573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061107d919061259d565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156110ff576110ff612535565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556111c083612146565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061039c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f805160206129f78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156112ae573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112d59190810190612841565b915091508061133c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016102e0565b825482511461139f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016102e0565b60208201516001600160a01b0316156114125760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016102e0565b509392505050565b5f80825160271461147f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016102e0565b5f805b60028110156114ce576114968160016126d1565b6114a19060086126ea565b61ffff168582815181106114b7576114b7612701565b016020015160f81c901b9190911790600101611482565b5061ffff81161561152d5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016102e0565b5f805b6004811015611588576115448160036126d1565b61154f9060086126ea565b63ffffffff1686611561836002612715565b8151811061157157611571612701565b016020015160f81c901b9190911790600101611530565b5063ffffffff81166002146115ef5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016102e0565b5f805b60208110156116445761160681601f6126d1565b6116119060086126ea565b8761161d836006612715565b8151811061162d5761162d612701565b016020015160f81c901b91909117906001016115f2565b505f8660268151811061165957611659612701565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f80516020612a1783398151915290528390208351918201909352825491925f805160206129f783398151915292829060ff16600581111561170157611701612535565b600581111561171257611712612535565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181525f80516020612a1783398151915260205260408082208151610100810190925280545f805160206129f783398151915293929190829060ff16600581111561184857611848612535565b600581111561185957611859612535565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156118e1576118e1612535565b1461193d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016102e0565b60408101516001600160a01b0316336001600160a01b0316146119b75760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016102e0565b6119c48160a00151611c00565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115611a0857611a08612535565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f611ad484611ace81612146565b5f610b59565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611b0390859060040161256b565b6020604051808303815f875af1158015611b1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b43919061259d565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b611ba06121e0565b611ba982612229565b611bb28161224a565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611bfa57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206129f78339815191529060ff165f03611c3e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611c8690836126d1565b10611ca2576001600160401b0384166040830152808252611cc1565b8382604001818151611cb49190612913565b6001600160401b03169052505b5f826020015183604001516064611cd8919061293a565b611ce29190612965565b600285015490915060ff9081169082161115611d5d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016102e0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611e0b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016102e0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e8257611e428160016126d1565b611e4d9060086126ea565b5081515f90839083908110611e6457611e64612701565b60200101906001600160f81b03191690815f1a905350600101611e2e565b505f5b6004811015611ee057611e998160036126d1565b611ea49060086126ea565b505f82611eb2836002612715565b81518110611ec257611ec2612701565b60200101906001600160f81b03191690815f1a905350600101611e85565b505f5b6020811015611f3d5784518160208110611eff57611eff612701565b1a60f81b82611f0f836006612715565b81518110611f1f57611f1f612701565b60200101906001600160f81b03191690815f1a905350600101611ee3565b505f5b6020811015611f9d5784602001518160208110611f5f57611f5f612701565b1a60f81b82611f6f836026612715565b81518110611f7f57611f7f612701565b60200101906001600160f81b03191690815f1a905350600101611f40565b505f5b600881101561201157611fb48160076126d1565b611fbf9060086126ea565b60ff1685604001516001600160401b0316901c60f81b82826046611fe39190612715565b81518110611ff357611ff3612701565b60200101906001600160f81b03191690815f1a905350600101611fa0565b505f5b603081101561207c578460800151818151811061203357612033612701565b01602001516001600160f81b0319168261204e83604e612715565b8151811061205e5761205e612701565b60200101906001600160f81b03191690815f1a905350600101612014565b505f5b60088110156120ee576120938160076126d1565b61209e9060086126ea565b60608601516001600160401b0390811691161c60f81b826120c083607e612715565b815181106120d0576120d0612701565b60200101906001600160f81b03191690815f1a90535060010161207f565b506002816040516120ff9190612996565b602060405180830381855afa15801561211a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061213d919061259d565b94909350915050565b5f8181525f80516020612a178339815191526020526040812060030180545f805160206129f7833981519152916001600160401b039091169081908461218b836129b1565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661073257604051631afcd79f60e31b815260040160405180910390fd5b6122316121e0565b61223961225b565b61224161226b565b61073d81612273565b6122526121e0565b61073d816122df565b6122636121e0565b6107326122e7565b6107326121e0565b61227b6121e0565b80355f805160206129f783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122c560608301604084016129d6565b600291909101805460ff191660ff90921691909117905550565b610b276121e0565b6121ba6121e0565b5080546122fb906125b4565b5f825580601f1061230a575050565b601f0160209004905f5260205f209081019061073d91905b80821115612335575f8155600101612322565b5090565b5f60208284031215612349575f80fd5b5035919050565b80356001600160401b0381168114612366575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156123a1576123a161236b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156123cf576123cf61236b565b604052919050565b5f6001600160401b038211156123ef576123ef61236b565b50601f01601f191660200190565b5f805f8060808587031215612410575f80fd5b61241985612350565b93506020850135925061242e60408601612350565b915060608501356001600160401b03811115612448575f80fd5b8501601f81018713612458575f80fd5b803561246b612466826123d7565b6123a7565b81815288602083850101111561247f575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156124b0575f80fd5b813563ffffffff811681146124c3575f80fd5b9392505050565b6001600160a01b038116811461073d575f80fd5b5f8082840360808112156124f0575f80fd5b60608112156124fd575f80fd5b50829150606083013561250f816124ca565b809150509250929050565b5f6020828403121561252a575f80fd5b81356124c3816124ca565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561256357818101518382015260200161254b565b50505f910152565b602081525f8251806020840152612589816040850160208701612549565b601f01601f19169190910160400192915050565b5f602082840312156125ad575f80fd5b5051919050565b600181811c908216806125c857607f821691505b6020821081036125e657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612645816125b4565b806020870152604060018084165f81146126665760018114612682576126af565b60ff19851660408a0152604084151560051b8a010195506126af565b895f5260205f205f5b858110156126a65781548b820186015290830190880161268b565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156126e4576126e46126bd565b92915050565b80820281158282048414176126e4576126e46126bd565b634e487b7160e01b5f52603260045260245ffd5b808201808211156126e4576126e46126bd565b601f821115610a0c57805f5260205f20601f840160051c8101602085101561274d5750805b601f840160051c820191505b8181101561276c575f8155600101612759565b5050505050565b81516001600160401b0381111561278c5761278c61236b565b6127a08161279a84546125b4565b84612728565b602080601f8311600181146127d3575f84156127bc5750858301515b5f19600386901b1c1916600185901b17855561282a565b5f85815260208120601f198616915b82811015612801578886015182559484019460019091019084016127e2565b508582101561281e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b80518015158114612366575f80fd5b5f8060408385031215612852575f80fd5b82516001600160401b0380821115612868575f80fd5b908401906060828703121561287b575f80fd5b61288361237f565b82518152602080840151612896816124ca565b828201526040840151838111156128ab575f80fd5b80850194505087601f8501126128bf575f80fd5b835192506128cf612466846123d7565b83815288828587010111156128e2575f80fd5b6128f184838301848801612549565b80604084015250819550612906818801612832565b9450505050509250929050565b6001600160401b03818116838216019080821115612933576129336126bd565b5092915050565b6001600160401b0381811683821602808216919082811461295d5761295d6126bd565b505092915050565b5f6001600160401b038084168061298a57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516129a7818460208701612549565b9190910192915050565b5f6001600160401b038083168181036129cc576129cc6126bd565b6001019392505050565b5f602082840312156129e6575f80fd5b813560ff811681146124c3575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612c1f380380612c1f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612ad28061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd3660046123c8565b61023f565b005b6101226100f23660046123c8565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b61012261014336600461248c565b610414565b6100e261015636600461252f565b610434565b61016e6101693660046123c8565b61079d565b6040516001600160401b03909116815260200161012c565b6100e26107b1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e03660046123c8565b6107c4565b6100e26101f336600461252f565b6107d0565b6101ba6005600160991b0181565b6100e26102143660046123c8565b61098d565b6100e261022736600461256d565b610aa1565b6100e261023a3660046125a9565b610baf565b5f8181525f80516020612aa683398151915260205260408082208151610100810190925280545f80516020612a8683398151915293929190829060ff16600581111561028d5761028d6125c4565b600581111561029e5761029e6125c4565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610323576103236125c4565b1461038d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103b28584608001515f610be9565b6040518263ffffffff1660e01b81526004016103ce91906125fa565b6020604051808303815f875af11580156103ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040e919061262c565b50505050565b5f61041d610e06565b61042984868585610e61565b90505b949350505050565b5f80516020612a868339815191525f61044c836112ba565b90505f8061045d836040015161149b565b9150915080156104c25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610384565b5f828152600685016020526040808220815161010081019092528054829060ff1660058111156104f4576104f46125c4565b6005811115610505576105056125c4565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f908251600581111561058c5761058c6125c4565b14806105aa57506001825160058111156105a8576105a86125c4565b145b6106095760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610384565b60038251600581111561061e5761061e6125c4565b0361062b5750600461062f565b5060055b6020808301515f90815260078801909152604081205581816005811115610658576106586125c4565b9081600581111561066b5761066b6125c4565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561069f5761069f6125c4565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561076a5761076a6125c4565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f6107a7826116fa565b60a0015192915050565b6107b9610e06565b6107c25f61180b565b565b6107cd8161187b565b50565b5f80516020612a868339815191525f6107e8836112ba565b90505f806107f9836040015161149b565b915091508061085b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610384565b5f8281526005850160205260408120805461087590612643565b90501180156108a7575060015f83815260068601602052604090205460ff1660058111156108a5576108a56125c4565b145b6108c35760405162461bcd60e51b81526004016103849061267b565b5f82815260058501602052604081206108db9161237e565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a868339815191529291906109d590612643565b9050118015610a07575060015f83815260068301602052604090205460ff166005811115610a0557610a056125c4565b145b610a235760405162461bcd60e51b81526004016103849061267b565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a5c91906004016126c2565b6020604051808303815f875af1158015610a78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9c919061262c565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ae55750825b90505f826001600160401b03166001148015610b005750303b155b905081158015610b0e575080155b15610b2c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610b5657845460ff60401b1916600160401b1785555b610b608787611c19565b8315610ba657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610bb7610e06565b6001600160a01b038116610be057604051631e4fbdf760e01b81525f6004820152602401610384565b6107cd8161180b565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610c6257610c22816001612760565b610c2d906008612779565b5081515f90839083908110610c4457610c44612790565b60200101906001600160f81b03191690815f1a905350600101610c0e565b505f5b6004811015610cc557610c79816003612760565b610c84906008612779565b6001901c60f81b82610c978360026127a4565b81518110610ca757610ca7612790565b60200101906001600160f81b03191690815f1a905350600101610c65565b505f5b6020811015610d2757610cdc81601f612760565b610ce7906008612779565b86901c60f81b82610cf98360066127a4565b81518110610d0957610d09612790565b60200101906001600160f81b03191690815f1a905350600101610cc8565b505f5b6008811015610d9257610d3e816007612760565b610d49906008612779565b6001600160401b038616901c60f81b82610d648360266127a4565b81518110610d7457610d74612790565b60200101906001600160f81b03191690815f1a905350600101610d2a565b505f5b6008811015610dfd57610da9816007612760565b610db4906008612779565b6001600160401b038516901c60f81b82610dcf83602e6127a4565b81518110610ddf57610ddf612790565b60200101906001600160f81b03191690815f1a905350600101610d95565b50949350505050565b33610e387f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107c25760405163118cdaa760e01b8152336004820152602401610384565b5f610e6a611c37565b5f80516020612a86833981519152426001600160401b038516118015610ea457506001600160401b038416610ea2426202a3006127a4565b115b610f065760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610384565b85610f5d5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610384565b5f86815260078201602052604090205415610fcb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610384565b82516030146110325760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610384565b61103b85611c81565b5f806110826040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611e22565b5f828152600586016020526040902091935091506110a08282612802565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906110cd9085906004016125fa565b6020604051808303815f875af11580156110e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061110d919061262c565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff1916600183600581111561118f5761118f6125c4565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061042c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f80516020612a868339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561132f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261135691908101906128d0565b91509150806113bd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610384565b82548251146114205760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610384565b60208201516001600160a01b0316156114935760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610384565b509392505050565b5f8082516027146115005760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610384565b5f805b600281101561154f57611517816001612760565b611522906008612779565b61ffff1685828151811061153857611538612790565b016020015160f81c901b9190911790600101611503565b5061ffff8116156115ae5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610384565b5f805b6004811015611609576115c5816003612760565b6115d0906008612779565b63ffffffff16866115e28360026127a4565b815181106115f2576115f2612790565b016020015160f81c901b91909117906001016115b1565b5063ffffffff81166002146116705760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610384565b5f805b60208110156116c55761168781601f612760565b611692906008612779565b8761169e8360066127a4565b815181106116ae576116ae612790565b016020015160f81c901b9190911790600101611673565b505f866026815181106116da576116da612790565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f80516020612aa683398151915290528390208351918201909352825491925f80516020612a8683398151915292829060ff166005811115611782576117826125c4565b6005811115611793576117936125c4565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181525f80516020612aa683398151915260205260408082208151610100810190925280545f80516020612a8683398151915293929190829060ff1660058111156118c9576118c96125c4565b60058111156118da576118da6125c4565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115611962576119626125c4565b146119be5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610384565b60408101516001600160a01b0316336001600160a01b031614611a385760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610384565b611a458160a00151611c81565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115611a8957611a896125c4565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f611b5584611b4f816121ed565b5f610be9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90611b849085906004016125fa565b6020604051808303815f875af1158015611ba0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc4919061262c565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b611c2161226f565b611c2a826122b8565b611c33816122d9565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611c7b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a868339815191529060ff165f03611cbf575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611d079083612760565b10611d23576001600160401b0384166040830152808252611d42565b8382604001818151611d3591906129a2565b6001600160401b03169052505b5f826020015183604001516064611d5991906129c9565b611d6391906129f4565b600285015490915060ff9081169082161115611dde5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610384565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611e8c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610384565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611f0357611ec3816001612760565b611ece906008612779565b5081515f90839083908110611ee557611ee5612790565b60200101906001600160f81b03191690815f1a905350600101611eaf565b505f5b6004811015611f6157611f1a816003612760565b611f25906008612779565b505f82611f338360026127a4565b81518110611f4357611f43612790565b60200101906001600160f81b03191690815f1a905350600101611f06565b505f5b6020811015611fbe5784518160208110611f8057611f80612790565b1a60f81b82611f908360066127a4565b81518110611fa057611fa0612790565b60200101906001600160f81b03191690815f1a905350600101611f64565b505f5b602081101561201e5784602001518160208110611fe057611fe0612790565b1a60f81b82611ff08360266127a4565b8151811061200057612000612790565b60200101906001600160f81b03191690815f1a905350600101611fc1565b505f5b600881101561209257612035816007612760565b612040906008612779565b60ff1685604001516001600160401b0316901c60f81b8282604661206491906127a4565b8151811061207457612074612790565b60200101906001600160f81b03191690815f1a905350600101612021565b505f5b60308110156120fd57846080015181815181106120b4576120b4612790565b01602001516001600160f81b031916826120cf83604e6127a4565b815181106120df576120df612790565b60200101906001600160f81b03191690815f1a905350600101612095565b505f5b600881101561216f57612114816007612760565b61211f906008612779565b60608601516001600160401b0390811691161c60f81b8261214183607e6127a4565b8151811061215157612151612790565b60200101906001600160f81b03191690815f1a905350600101612100565b506002816040516121809190612a25565b602060405180830381855afa15801561219b573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906121be919061262c565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5f8181525f80516020612aa68339815191526020526040812060030180545f80516020612a86833981519152916001600160401b03909116908361223083612a40565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166107c257604051631afcd79f60e31b815260040160405180910390fd5b6122c061226f565b6122c86122ea565b6122d06122fa565b6107cd81612302565b6122e161226f565b6107cd8161236e565b6122f261226f565b6107c2612376565b6107c261226f565b61230a61226f565b80355f80516020612a8683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123546060830160408401612a65565b600291909101805460ff191660ff90921691909117905550565b610bb761226f565b6121c761226f565b50805461238a90612643565b5f825580601f10612399575050565b601f0160209004905f5260205f20908101906107cd91905b808211156123c4575f81556001016123b1565b5090565b5f602082840312156123d8575f80fd5b5035919050565b80356001600160401b03811681146123f5575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612430576124306123fa565b60405290565b604051601f8201601f191681016001600160401b038111828210171561245e5761245e6123fa565b604052919050565b5f6001600160401b0382111561247e5761247e6123fa565b50601f01601f191660200190565b5f805f806080858703121561249f575f80fd5b6124a8856123df565b9350602085013592506124bd604086016123df565b915060608501356001600160401b038111156124d7575f80fd5b8501601f810187136124e7575f80fd5b80356124fa6124f582612466565b612436565b81815288602083850101111561250e575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f6020828403121561253f575f80fd5b813563ffffffff81168114612552575f80fd5b9392505050565b6001600160a01b03811681146107cd575f80fd5b5f80828403608081121561257f575f80fd5b606081121561258c575f80fd5b50829150606083013561259e81612559565b809150509250929050565b5f602082840312156125b9575f80fd5b813561255281612559565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156125f25781810151838201526020016125da565b50505f910152565b602081525f82518060208401526126188160408501602087016125d8565b601f01601f19169190910160400192915050565b5f6020828403121561263c575f80fd5b5051919050565b600181811c9082168061265757607f821691505b60208210810361267557634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546126d481612643565b806020870152604060018084165f81146126f557600181146127115761273e565b60ff19851660408a0152604084151560051b8a0101955061273e565b895f5260205f205f5b858110156127355781548b820186015290830190880161271a565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156127735761277361274c565b92915050565b80820281158282048414176127735761277361274c565b634e487b7160e01b5f52603260045260245ffd5b808201808211156127735761277361274c565b601f821115610a9c57805f5260205f20601f840160051c810160208510156127dc5750805b601f840160051c820191505b818110156127fb575f81556001016127e8565b5050505050565b81516001600160401b0381111561281b5761281b6123fa565b61282f816128298454612643565b846127b7565b602080601f831160018114612862575f841561284b5750858301515b5f19600386901b1c1916600185901b1785556128b9565b5f85815260208120601f198616915b8281101561289057888601518255948401946001909101908401612871565b50858210156128ad57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b805180151581146123f5575f80fd5b5f80604083850312156128e1575f80fd5b82516001600160401b03808211156128f7575f80fd5b908401906060828703121561290a575f80fd5b61291261240e565b8251815260208084015161292581612559565b8282015260408401518381111561293a575f80fd5b80850194505087601f85011261294e575f80fd5b8351925061295e6124f584612466565b8381528882858701011115612971575f80fd5b612980848383018488016125d8565b806040840152508195506129958188016128c1565b9450505050509250929050565b6001600160401b038181168382160190808211156129c2576129c261274c565b5092915050565b6001600160401b038181168382160280821691908281146129ec576129ec61274c565b505092915050565b5f6001600160401b0380841680612a1957634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a368184602087016125d8565b9190910192915050565b5f6001600160401b03808316818103612a5b57612a5b61274c565b6001019392505050565b5f60208284031215612a75575f80fd5b813560ff81168114612552575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index b24da729e..27edaf15b 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -158,7 +158,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Construct the delegation ID. This is guaranteed to be unique since it is // constructed using a new nonce. - uint64 nonce = _getAndIncrementNonce(validationID); + uint64 nonce = _incrementAndGetNonce(validationID); bytes32 delegationID = keccak256(abi.encodePacked(validationID, delegatorAddress, nonce)); _checkAndUpdateChurnTracker(weight); @@ -262,7 +262,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( delegator.owner == _msgSender(), "PoSValidatorManager: delegation not owned by sender" ); - uint64 nonce = _getAndIncrementNonce(validationID); + uint64 nonce = _incrementAndGetNonce(validationID); // Set the delegator status to pending removed, so that it can be properly removed in // the complete step, even if the delivered nonce is greater than the nonce used to @@ -299,8 +299,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; require( - $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, - "PoSValidatorManager: delegation registration not pending" + delegator.status == DelegatorStatus.PendingAdded + || delegator.status == DelegatorStatus.PendingRemoved, + "PoSValidatorManager: delegation status not pending" ); Validator memory validator = _getValidator(delegator.validationID); diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index c3ac3d278..52040b4f3 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -147,8 +147,7 @@ abstract contract ValidatorManager is startedAt: 0, // The validation period only starts once the registration is acknowledged. endedAt: 0 }); - // Increment the nonce for the next usage. - _getAndIncrementNonce(validationID); + emit ValidationPeriodCreated(validationID, nodeID, messageID, weight, registrationExpiry); return validationID; @@ -235,7 +234,7 @@ abstract contract ValidatorManager is // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, _getAndIncrementNonce(validationID), 0); + .packSetSubnetValidatorWeightMessage(validationID, _incrementAndGetNonce(validationID), 0); bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); @@ -250,18 +249,18 @@ abstract contract ValidatorManager is // solhint-disable-next-line function resendEndValidatorMessage(bytes32 validationID) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + Validator memory validator = $._validationPeriods[validationID]; require( - $._validationPeriods[validationID].status == ValidatorStatus.PendingRemoved, + validator.status == ValidatorStatus.PendingRemoved, "ValidatorManager: Validator not pending removal" ); - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage( - validationID, $._validationPeriods[validationID].messageNonce, 0 + WARP_MESSENGER.sendWarpMessage( + ValidatorMessages.packSetSubnetValidatorWeightMessage( + validationID, validator.messageNonce, 0 + ) ); - - WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); } /** @@ -347,11 +346,10 @@ abstract contract ValidatorManager is $._churnTracker = churnTracker; } - function _getAndIncrementNonce(bytes32 validationID) internal returns (uint64) { + function _incrementAndGetNonce(bytes32 validationID) internal returns (uint64) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - uint64 currentNonce = $._validationPeriods[validationID].messageNonce; $._validationPeriods[validationID].messageNonce++; - return currentNonce; + return $._validationPeriods[validationID].messageNonce; } function _getPChainWarpMessage(uint32 messageIndex) From a8af00f3c34027193518b93583bc70f08f4097d8 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Mon, 9 Sep 2024 09:59:22 -0400 Subject: [PATCH 226/545] parameterize values init --- .../ERC20TokenStakingManager.sol | 25 ++++--- .../NativeTokenStakingManager.sol | 22 +++--- .../validatormanager/PoAValidatorManager.sol | 6 +- .../validatormanager/PoSValidatorManager.sol | 71 +++++++++++++++---- .../validatormanager/ValidatorManager.sol | 38 +++++----- .../interfaces/IERC20TokenStakingManager.sol | 16 ++--- .../interfaces/INativeTokenStakingManager.sol | 13 ++-- .../interfaces/IPoAValidatorManager.sol | 12 ++-- .../interfaces/IPoSValidatorManager.sol | 7 ++ .../interfaces/IValidatorManager.sol | 6 ++ 10 files changed, 137 insertions(+), 79 deletions(-) diff --git a/contracts/validatormanager/ERC20TokenStakingManager.sol b/contracts/validatormanager/ERC20TokenStakingManager.sol index 33f8efe5f..e211b3a28 100644 --- a/contracts/validatormanager/ERC20TokenStakingManager.sol +++ b/contracts/validatormanager/ERC20TokenStakingManager.sol @@ -13,7 +13,11 @@ import {SafeERC20TransferFrom} from "@utilities/SafeERC20TransferFrom.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 { + PoSValidatorManagerSettings, + PoSValidatorRequirements +} from "./interfaces/IPoSValidatorManager.sol"; +import {ValidatorRegistrationInput} from "./interfaces/IValidatorManager.sol"; contract ERC20TokenStakingManager is Initializable, @@ -84,20 +88,15 @@ contract ERC20TokenStakingManager is } /** - * @notice Begins the validator registration process. Locks the configured ERC20 in the contract as the stake. - * @param stakeAmount The amount to be staked. - * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. - * @param blsPublicKey The BLS public key of the validator. + * @notice See {IERC20TokenStakingManager-initializeValidatorRegistration} + * Begins the validator registration process. Locks the configured ERC20 in the contract as the stake. */ function initializeValidatorRegistration( - uint256 stakeAmount, - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory blsPublicKey - ) external returns (bytes32 validationID) { - uint64 weight = _processStake(stakeAmount); - return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); + ValidatorRegistrationInput calldata registrationInput, + PoSValidatorRequirements calldata requirements, + uint256 stakeAmount + ) external nonReentrant returns (bytes32 validationID) { + return _initializeValidatorRegistration(registrationInput, requirements, stakeAmount); } /** diff --git a/contracts/validatormanager/NativeTokenStakingManager.sol b/contracts/validatormanager/NativeTokenStakingManager.sol index 8763d0e7f..239d50bfc 100644 --- a/contracts/validatormanager/NativeTokenStakingManager.sol +++ b/contracts/validatormanager/NativeTokenStakingManager.sol @@ -11,7 +11,11 @@ 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 { + PoSValidatorManagerSettings, + PoSValidatorRequirements +} from "./interfaces/IPoSValidatorManager.sol"; +import {ValidatorRegistrationInput} from "./interfaces/IValidatorManager.sol"; contract NativeTokenStakingManager is Initializable, @@ -48,18 +52,14 @@ contract NativeTokenStakingManager is function __NativeTokenStakingManager_init_unchained() internal onlyInitializing {} /** - * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. - * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The Unix timestamp after which the registration is no longer valid on the P-Chain. - * @param blsPublicKey The BLS public key of the validator. + * @notice See {INativeTokenStakingManager-initializeValidatorRegistration}. + * Begins the validator registration process. Locks the provided native asset in the contract as the stake. */ function initializeValidatorRegistration( - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory blsPublicKey - ) external payable returns (bytes32) { - uint64 weight = _processStake(msg.value); - return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); + ValidatorRegistrationInput calldata registrationInput, + PoSValidatorRequirements calldata requirements + ) external payable nonReentrant returns (bytes32) { + return _initializeValidatorRegistration(registrationInput, requirements, msg.value); } /** diff --git a/contracts/validatormanager/PoAValidatorManager.sol b/contracts/validatormanager/PoAValidatorManager.sol index e194b7b0d..3ca618333 100644 --- a/contracts/validatormanager/PoAValidatorManager.sol +++ b/contracts/validatormanager/PoAValidatorManager.sol @@ -41,12 +41,12 @@ contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableU // solhint-enable func-name-mixedcase function initializeValidatorRegistration( - uint64 weight, bytes32 nodeID, uint64 registrationExpiry, - bytes memory signature + bytes memory blsPublicKey, + uint64 weight ) external override onlyOwner returns (bytes32 validationID) { - return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, signature); + return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); } // solhint-enable ordering diff --git a/contracts/validatormanager/PoSValidatorManager.sol b/contracts/validatormanager/PoSValidatorManager.sol index 18c958c60..af589aa0f 100644 --- a/contracts/validatormanager/PoSValidatorManager.sol +++ b/contracts/validatormanager/PoSValidatorManager.sol @@ -8,9 +8,16 @@ pragma solidity 0.8.25; import { IPoSValidatorManager, Delegator, DelegatorStatus } from "./interfaces/IPoSValidatorManager.sol"; -import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; +import { + PoSValidatorManagerSettings, + PoSValidatorRequirements +} from "./interfaces/IPoSValidatorManager.sol"; import {ValidatorManager} from "./ValidatorManager.sol"; -import {Validator, ValidatorStatus} from "./interfaces/IValidatorManager.sol"; +import { + Validator, + ValidatorStatus, + ValidatorRegistrationInput +} from "./interfaces/IValidatorManager.sol"; import {WarpMessage} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; import {ValidatorMessages} from "./ValidatorMessages.sol"; @@ -26,6 +33,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 _maximumStakeAmount; /// @notice The minimum amount of time a validator must be staked for. uint64 _minimumStakeDuration; + /// @notice The minimum delegation fee required to delegate to a validator. + uint256 _minimumDelegationFee; + /** + * @notice A multiplier applied to {_maximumStakeAmount} to determine + * the maximum amount of stake a validator can have. This maximum amount includes + * the initial stake amount at registration, and additional stake from delegations. + */ + uint64 _maximumStakeMultiplier; /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; /// @notice Maps the delegationID to the delegator information. @@ -64,6 +79,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager settings.minimumStakeAmount, settings.maximumStakeAmount, settings.minimumStakeDuration, + settings.minimumDelegationFee, + settings.maximumStakeMultiplier, settings.rewardCalculator ); } @@ -73,12 +90,26 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 minimumStakeAmount, uint256 maximumStakeAmount, uint64 minimumStakeDuration, + uint256 minimumDelegationFee, + uint64 maximumStakeMultiplier, IRewardCalculator rewardCalculator ) internal onlyInitializing { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + require(minimumDelegationFee > 0, "PoSValidatorManager: zero delegation fee"); + require( + minimumStakeAmount <= maximumStakeAmount, + "PoSValidatorManager: invalid stake amount range" + ); + require( + maximumStakeMultiplier > 0, + "PoSValidatorManager: zero max validator stake multiplier" + ); + $._minimumStakeAmount = minimumStakeAmount; $._maximumStakeAmount = maximumStakeAmount; $._minimumStakeDuration = minimumStakeDuration; + $._minimumDelegationFee = minimumDelegationFee; + $._maximumStakeMultiplier = maximumStakeMultiplier; $._rewardCalculator = rewardCalculator; } @@ -118,18 +149,31 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager return uptime; } - function _processStake(uint256 stakeAmount) internal virtual returns (uint64) { + function _initializeValidatorRegistration( + ValidatorRegistrationInput calldata registrationInput, + PoSValidatorRequirements calldata requirements, + uint256 stakeAmount + ) internal virtual returns (bytes32) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - // Lock the stake in the contract. - uint256 lockedValue = _lock(stakeAmount); - uint64 weight = valueToWeight(lockedValue); - - // Ensure the weight is within the valid range. + // Validate and save the validator requirements require( - weight >= $._minimumStakeAmount && weight <= $._maximumStakeAmount, + requirements.minStakeDuration >= $._minimumStakeDuration, + "PoSValidatorManager: invalid min stake duration" + ); + require( + requirements.delegationFee > $._minimumDelegationFee, + "PoSValidatorManager: invalid delegation fee" + ); + require( + stakeAmount >= $._minimumStakeAmount && stakeAmount <= $._maximumStakeAmount, "PoSValidatorManager: invalid stake amount" ); - return weight; + + // Lock the stake in the contract. + uint256 lockedValue = _lock(stakeAmount); + uint64 weight = valueToWeight(lockedValue); + bytes32 validationID = _initializeValidatorRegistration(registrationInput, weight); + return validationID; } function valueToWeight(uint256 value) public pure returns (uint64) { @@ -148,8 +192,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager address delegatorAddress, uint256 delegationAmount ) internal nonReentrant returns (bytes32) { - uint64 weight = valueToWeight(_lock(delegationAmount)); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + uint64 weight = valueToWeight(_lock(delegationAmount)); // Ensure the validation period is active Validator memory validator = _getValidator(validationID); @@ -158,12 +202,15 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ); // Update the validator weight uint64 newValidatorWeight = validator.weight + weight; + require( + weightToValue(newValidatorWeight) <= $._maximumStakeAmount * $._maximumStakeMultiplier, "PoSValidatorManager: maximum validator weight reached" + ); _setValidatorWeight(validationID, newValidatorWeight); // Construct the delegation ID. This is guaranteed to be unique since it is // constructed using a new nonce. uint64 nonce = _getAndIncrementNonce(validationID); - bytes32 delegationID = keccak256(abi.encodePacked(validationID, delegatorAddress, nonce)); + bytes32 delegationID = keccak256(abi.encodePacked(validationID, nonce)); _checkAndUpdateChurnTracker(weight); diff --git a/contracts/validatormanager/ValidatorManager.sol b/contracts/validatormanager/ValidatorManager.sol index 9d95e95be..6a70a5a4c 100644 --- a/contracts/validatormanager/ValidatorManager.sol +++ b/contracts/validatormanager/ValidatorManager.sol @@ -10,7 +10,8 @@ import { ValidatorManagerSettings, ValidatorStatus, Validator, - ValidatorChurnPeriod + ValidatorChurnPeriod, + ValidatorRegistrationInput } from "./interfaces/IValidatorManager.sol"; import { WarpMessage, @@ -98,30 +99,29 @@ abstract contract ValidatorManager is /** * @notice Begins the validator registration process, and sets the initial weight for the validator. - * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. - * @param blsPublicKey The BLS public key of the validator. + * @param input The inputs for a validator registration. + * @param weight The weight of the validator being registered. */ function _initializeValidatorRegistration( - bytes32 nodeID, - uint64 weight, - uint64 registrationExpiry, - bytes memory blsPublicKey - ) internal nonReentrant returns (bytes32) { + ValidatorRegistrationInput calldata input, + uint64 weight + ) internal virtual returns (bytes32) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Ensure the registration expiry is in a valid range. require( - registrationExpiry > block.timestamp && block.timestamp + 2 days > registrationExpiry, + input.registrationExpiry > block.timestamp + && block.timestamp + 2 days > input.registrationExpiry, "ValidatorManager: invalid registration expiry" ); // Ensure the nodeID is not the zero address, and is not already an active validator. - require(nodeID != bytes32(0), "ValidatorManager: invalid node ID"); + require(input.nodeID != bytes32(0), "ValidatorManager: invalid node ID"); require( - $._activeValidators[nodeID] == bytes32(0), "ValidatorManager: node ID already active" + $._activeValidators[input.nodeID] == bytes32(0), + "ValidatorManager: node ID already active" ); - require(blsPublicKey.length == 48, "ValidatorManager: invalid blsPublicKey length"); + require(input.blsPublicKey.length == 48, "ValidatorManager: invalid blsPublicKey length"); _checkAndUpdateChurnTracker(weight); @@ -129,10 +129,10 @@ abstract contract ValidatorManager is .packRegisterSubnetValidatorMessage( ValidatorMessages.ValidationPeriod({ subnetID: $._subnetID, - nodeID: nodeID, + nodeID: input.nodeID, weight: weight, - blsPublicKey: blsPublicKey, - registrationExpiry: registrationExpiry + blsPublicKey: input.blsPublicKey, + registrationExpiry: input.registrationExpiry }) ); $._pendingRegisterValidationMessages[validationID] = registerSubnetValidatorMessage; @@ -141,7 +141,7 @@ abstract contract ValidatorManager is bytes32 messageID = WARP_MESSENGER.sendWarpMessage(registerSubnetValidatorMessage); $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.PendingAdded, - nodeID: nodeID, + nodeID: input.nodeID, owner: _msgSender(), startingWeight: weight, messageNonce: 0, @@ -151,7 +151,9 @@ abstract contract ValidatorManager is }); // Increment the nonce for the next usage. _getAndIncrementNonce(validationID); - emit ValidationPeriodCreated(validationID, nodeID, messageID, weight, registrationExpiry); + emit ValidationPeriodCreated( + validationID, input.nodeID, messageID, weight, input.registrationExpiry + ); return validationID; } diff --git a/contracts/validatormanager/interfaces/IERC20TokenStakingManager.sol b/contracts/validatormanager/interfaces/IERC20TokenStakingManager.sol index 2d59cfb83..876f42fba 100644 --- a/contracts/validatormanager/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/validatormanager/interfaces/IERC20TokenStakingManager.sol @@ -5,20 +5,20 @@ pragma solidity 0.8.25; -import {IPoSValidatorManager} from "./IPoSValidatorManager.sol"; +import {ValidatorRegistrationInput} from "./IValidatorManager.sol"; +import {IPoSValidatorManager, PoSValidatorRequirements} from "./IPoSValidatorManager.sol"; interface IERC20TokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the {stakeAmount} of the managers specified ERC20 token. - * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. - * @param blsPublicKey The BLS public key of the validator. + * @param registrationInput The inputs for a validator registration. + * @param requirements The requirements for the validator being registered. + * @param stakeAmount The amount of the ERC20 token to lock in the contract as the stake. */ function initializeValidatorRegistration( - uint256 stakeAmount, - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory blsPublicKey + ValidatorRegistrationInput calldata registrationInput, + PoSValidatorRequirements calldata requirements, + uint256 stakeAmount ) external returns (bytes32 validationID); function initializeDelegatorRegistration( diff --git a/contracts/validatormanager/interfaces/INativeTokenStakingManager.sol b/contracts/validatormanager/interfaces/INativeTokenStakingManager.sol index 947d146bc..abd2e4675 100644 --- a/contracts/validatormanager/interfaces/INativeTokenStakingManager.sol +++ b/contracts/validatormanager/interfaces/INativeTokenStakingManager.sol @@ -5,19 +5,18 @@ pragma solidity 0.8.25; -import {IPoSValidatorManager} from "./IPoSValidatorManager.sol"; +import {ValidatorRegistrationInput} from "./IValidatorManager.sol"; +import {IPoSValidatorManager, PoSValidatorRequirements} from "./IPoSValidatorManager.sol"; interface INativeTokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. - * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. - * @param blsPublicKey The BLS public key of the validator. + * @param registrationInput The inputs for a validator registration. + * @param requirements The requirements for the validator being registered. */ function initializeValidatorRegistration( - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory blsPublicKey + ValidatorRegistrationInput calldata registrationInput, + PoSValidatorRequirements calldata requirements ) external payable returns (bytes32 validationID); function initializeDelegatorRegistration(bytes32 validationID) diff --git a/contracts/validatormanager/interfaces/IPoAValidatorManager.sol b/contracts/validatormanager/interfaces/IPoAValidatorManager.sol index 09c4f5017..9418a8331 100644 --- a/contracts/validatormanager/interfaces/IPoAValidatorManager.sol +++ b/contracts/validatormanager/interfaces/IPoAValidatorManager.sol @@ -5,19 +5,17 @@ pragma solidity 0.8.25; -import {IValidatorManager} from "./IValidatorManager.sol"; +import {IValidatorManager, ValidatorRegistrationInput} from "./IValidatorManager.sol"; interface IPoAValidatorManager is IValidatorManager { /** * @notice Begins the validator registration process, and sets the {weight} of the validator. - * @param nodeID The node ID of the validator being registered. - * @param registrationExpiry The Unix timestamp after which the reigistration is no longer valid on the P-Chain. + * @param registrationInput The inputs for a validator registration. + * @param weight The weight of the validator being registered. */ function initializeValidatorRegistration( - uint64 weight, - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory signature + ValidatorRegistrationInput calldata registrationInput, + uint64 weight ) external returns (bytes32 validationID); /** diff --git a/contracts/validatormanager/interfaces/IPoSValidatorManager.sol b/contracts/validatormanager/interfaces/IPoSValidatorManager.sol index 84cc32b3b..943dce9fe 100644 --- a/contracts/validatormanager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validatormanager/interfaces/IPoSValidatorManager.sol @@ -21,6 +21,8 @@ struct PoSValidatorManagerSettings { uint256 minimumStakeAmount; uint256 maximumStakeAmount; uint64 minimumStakeDuration; + uint256 minimumDelegationFee; + uint64 maximumStakeMultiplier; IRewardCalculator rewardCalculator; } @@ -35,6 +37,11 @@ struct Delegator { uint64 endingNonce; } +struct PoSValidatorRequirements { + uint256 delegationFee; + uint256 minStakeDuration; +} + interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when a delegator registration is initiated diff --git a/contracts/validatormanager/interfaces/IValidatorManager.sol b/contracts/validatormanager/interfaces/IValidatorManager.sol index 3cb824ad7..3f4164ba5 100644 --- a/contracts/validatormanager/interfaces/IValidatorManager.sol +++ b/contracts/validatormanager/interfaces/IValidatorManager.sol @@ -37,6 +37,12 @@ struct ValidatorManagerSettings { uint8 maximumHourlyChurn; } +struct ValidatorRegistrationInput { + bytes32 nodeID; + uint64 registrationExpiry; + bytes blsPublicKey; +} + interface IValidatorManager { /** * @notice Emitted when a new validation period is created by stake being locked in the manager contract. From ea5a4030aa5506f15f374dde36b0d5bb3a87fd68 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Mon, 9 Sep 2024 10:09:46 -0400 Subject: [PATCH 227/545] save validator requirements --- .../validatormanager/PoSValidatorManager.sol | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/contracts/validatormanager/PoSValidatorManager.sol b/contracts/validatormanager/PoSValidatorManager.sol index af589aa0f..43a2cd7da 100644 --- a/contracts/validatormanager/PoSValidatorManager.sol +++ b/contracts/validatormanager/PoSValidatorManager.sol @@ -43,6 +43,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 _maximumStakeMultiplier; /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; + /// @notice Maps the validation ID to its requirements. + mapping(bytes32 validationID => PoSValidatorRequirements) _validatorRequirements; /// @notice Maps the delegationID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; /// @notice Maps the delegationID to pending register delegator messages. @@ -101,8 +103,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: invalid stake amount range" ); require( - maximumStakeMultiplier > 0, - "PoSValidatorManager: zero max validator stake multiplier" + maximumStakeMultiplier > 0, "PoSValidatorManager: zero max validator stake multiplier" ); $._minimumStakeAmount = minimumStakeAmount; @@ -118,6 +119,15 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bool includeUptimeProof, uint32 messageIndex ) external { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + // Check that minimum stake duration has passed + Validator memory validator = _getValidator(validationID); + require( + block.timestamp + >= validator.startedAt + $._validatorRequirements[validationID].minStakeDuration, + "PoSValidatorManager: minimum stake duration not met" + ); + if (includeUptimeProof) { _getUptime(validationID, messageIndex); } @@ -173,6 +183,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 lockedValue = _lock(stakeAmount); uint64 weight = valueToWeight(lockedValue); bytes32 validationID = _initializeValidatorRegistration(registrationInput, weight); + + $._validatorRequirements[validationID] = requirements; return validationID; } @@ -203,7 +215,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Update the validator weight uint64 newValidatorWeight = validator.weight + weight; require( - weightToValue(newValidatorWeight) <= $._maximumStakeAmount * $._maximumStakeMultiplier, "PoSValidatorManager: maximum validator weight reached" + weightToValue(newValidatorWeight) <= $._maximumStakeAmount * $._maximumStakeMultiplier, + "PoSValidatorManager: maximum validator weight reached" ); _setValidatorWeight(validationID, newValidatorWeight); From 612b626492e3b4afd7ba2906e4448e1f0111078e Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Mon, 9 Sep 2024 15:50:43 -0400 Subject: [PATCH 228/545] unit tests passing --- .../validatormanager/PoAValidatorManager.sol | 13 ++++++----- .../validatormanager/PoSValidatorManager.sol | 2 +- .../tests/ERC20TokenStakingManagerTests.t.sol | 23 ++++++++++++++----- .../NativeTokenStakingManagerTests.t.sol | 22 +++++++++++++----- .../tests/PoAValidatorManagerTests.t.sol | 14 ++++++----- .../tests/PoSValidatorManagerTests.t.sol | 21 +++++++++++++---- .../tests/ValidatorManagerTests.t.sol | 22 ++++++++++-------- 7 files changed, 77 insertions(+), 40 deletions(-) diff --git a/contracts/validatormanager/PoAValidatorManager.sol b/contracts/validatormanager/PoAValidatorManager.sol index 3ca618333..4ccf814b8 100644 --- a/contracts/validatormanager/PoAValidatorManager.sol +++ b/contracts/validatormanager/PoAValidatorManager.sol @@ -9,7 +9,10 @@ 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 {ValidatorManagerSettings} from "./interfaces/IValidatorManager.sol"; +import { + ValidatorManagerSettings, + ValidatorRegistrationInput +} from "./interfaces/IValidatorManager.sol"; import {ValidatorManager} from "./ValidatorManager.sol"; contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableUpgradeable { @@ -41,12 +44,10 @@ contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableU // solhint-enable func-name-mixedcase function initializeValidatorRegistration( - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory blsPublicKey, + ValidatorRegistrationInput calldata registrationInput, uint64 weight - ) external override onlyOwner returns (bytes32 validationID) { - return _initializeValidatorRegistration(nodeID, weight, registrationExpiry, blsPublicKey); + ) external onlyOwner returns (bytes32 validationID) { + return _initializeValidatorRegistration(registrationInput, weight); } // solhint-enable ordering diff --git a/contracts/validatormanager/PoSValidatorManager.sol b/contracts/validatormanager/PoSValidatorManager.sol index 43a2cd7da..9c7c05fd0 100644 --- a/contracts/validatormanager/PoSValidatorManager.sol +++ b/contracts/validatormanager/PoSValidatorManager.sol @@ -171,7 +171,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: invalid min stake duration" ); require( - requirements.delegationFee > $._minimumDelegationFee, + requirements.delegationFee >= $._minimumDelegationFee, "PoSValidatorManager: invalid delegation fee" ); require( diff --git a/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol index dd8f8bdbd..f530d64e2 100644 --- a/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol @@ -7,8 +7,14 @@ pragma solidity 0.8.25; import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; -import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; -import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; +import { + ValidatorManagerSettings, + ValidatorRegistrationInput +} from "../interfaces/IValidatorManager.sol"; +import { + PoSValidatorManagerSettings, + PoSValidatorRequirements +} from "../interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {ExampleERC20} from "@mocks/ExampleERC20.sol"; @@ -37,6 +43,8 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, rewardCalculator: IRewardCalculator(address(0)) }), token @@ -46,13 +54,16 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { } function _initializeValidatorRegistration( - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory signature, + ValidatorRegistrationInput memory input, uint64 weight ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration( - app.weightToValue(weight), nodeID, registrationExpiry, signature + input, + PoSValidatorRequirements({ + minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + delegationFee: DEFAULT_MINIMUM_DELEGATION_FEE + }), + app.weightToValue(weight) ); } diff --git a/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol index cd97aee36..e7946c5fe 100644 --- a/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol @@ -7,8 +7,14 @@ pragma solidity 0.8.25; import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; -import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; -import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; +import { + ValidatorManagerSettings, + ValidatorRegistrationInput +} from "../interfaces/IValidatorManager.sol"; +import { + PoSValidatorManagerSettings, + PoSValidatorRequirements +} from "../interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; @@ -30,6 +36,8 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, rewardCalculator: IRewardCalculator(address(0)) }) ); @@ -39,13 +47,15 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { // Helpers function _initializeValidatorRegistration( - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory signature, + ValidatorRegistrationInput memory input, uint64 weight ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration{value: app.weightToValue(weight)}( - nodeID, registrationExpiry, signature + input, + PoSValidatorRequirements({ + minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + delegationFee: DEFAULT_MINIMUM_DELEGATION_FEE + }) ); } diff --git a/contracts/validatormanager/tests/PoAValidatorManagerTests.t.sol b/contracts/validatormanager/tests/PoAValidatorManagerTests.t.sol index 3e247c9d8..595783c59 100644 --- a/contracts/validatormanager/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/validatormanager/tests/PoAValidatorManagerTests.t.sol @@ -8,7 +8,10 @@ pragma solidity 0.8.25; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoAValidatorManager} from "../PoAValidatorManager.sol"; import {ICMInitializable} from "@utilities/ICMInitializable.sol"; -import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; +import { + ValidatorManagerSettings, + ValidatorRegistrationInput +} from "../interfaces/IValidatorManager.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; @@ -38,17 +41,16 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { ) ); _initializeValidatorRegistration( - DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY, DEFAULT_WEIGHT + ValidatorRegistrationInput(DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY), + DEFAULT_WEIGHT ); } function _initializeValidatorRegistration( - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory signature, + ValidatorRegistrationInput memory input, uint64 weight ) internal virtual override returns (bytes32) { - return app.initializeValidatorRegistration(weight, nodeID, registrationExpiry, signature); + return app.initializeValidatorRegistration(input, weight); } function _initializeEndValidation(bytes32 validationID) internal virtual override { diff --git a/contracts/validatormanager/tests/PoSValidatorManagerTests.t.sol b/contracts/validatormanager/tests/PoSValidatorManagerTests.t.sol index 6dedd8b98..40efa94f3 100644 --- a/contracts/validatormanager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validatormanager/tests/PoSValidatorManagerTests.t.sol @@ -16,11 +16,19 @@ import {ValidatorMessages} from "../ValidatorMessages.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_UPTIME = uint64(100); uint64 public constant DEFAULT_DELEGATOR_WEIGHT = uint64(1e5); - uint64 public constant DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP = uint64(2000); - uint64 public constant DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP = uint64(3000); - uint64 public constant DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP = uint64(4000); + uint64 public constant DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP = + DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_EXPIRY; + uint64 public constant DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP = + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + DEFAULT_EXPIRY; + uint64 public constant DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP = + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_EXPIRY; address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); + uint256 public constant DEFAULT_MINIMUM_STAKE = 1e6; + uint256 public constant DEFAULT_MAXIMUM_STAKE = 1e20; + uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; + uint256 public constant DEFAULT_MINIMUM_DELEGATION_FEE = 100; + uint64 public constant DEFAULT_MAXIMUM_STAKE_MULTIPLIER = 4; PoSValidatorManager public posValidatorManager; @@ -63,7 +71,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - + vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); _mockGetVerifiedWarpMessage(new bytes(0), false); vm.expectRevert(_formatErrorMessage("invalid warp message")); posValidatorManager.initializeEndValidation(validationID, true, 0); @@ -78,6 +86,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); + vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); _mockGetVerifiedWarpMessage(new bytes(0), true); _mockGetBlockchainID(); @@ -94,6 +103,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); + vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); _mockGetBlockchainID(); vm.mockCall( @@ -125,6 +135,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); + vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); _mockGetBlockchainID(); vm.mockCall( @@ -596,7 +607,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorAdded({ - delegationID: keccak256(abi.encodePacked(validationID, delegatorAddress, expectedNonce)), + delegationID: keccak256(abi.encodePacked(validationID, expectedNonce)), validationID: validationID, delegatorAddress: delegatorAddress, nonce: expectedNonce, diff --git a/contracts/validatormanager/tests/ValidatorManagerTests.t.sol b/contracts/validatormanager/tests/ValidatorManagerTests.t.sol index 605aefb87..cd757cda1 100644 --- a/contracts/validatormanager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validatormanager/tests/ValidatorManagerTests.t.sol @@ -8,7 +8,7 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {ValidatorManager} from "../ValidatorManager.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; -import {ValidatorStatus} from "../interfaces/IValidatorManager.sol"; +import {ValidatorStatus, ValidatorRegistrationInput} from "../interfaces/IValidatorManager.sol"; import { WarpMessage, IWarpMessenger @@ -31,13 +31,10 @@ abstract contract ValidatorManagerTest is Test { address public constant WARP_PRECOMPILE_ADDRESS = 0x0200000000000000000000000000000000000005; uint64 public constant DEFAULT_WEIGHT = 1e6; - uint256 public constant DEFAULT_MINIMUM_STAKE = 20; - uint256 public constant DEFAULT_MAXIMUM_STAKE = 1e10; - uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; - uint8 public constant DEFAULT_MAXIMUM_HOURLY_CHURN = 0; uint64 public constant DEFAULT_EXPIRY = 1000; + uint8 public constant DEFAULT_MAXIMUM_HOURLY_CHURN = 0; uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; - uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = 2000; + uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = 100_000; ValidatorManager public validatorManager; @@ -230,7 +227,14 @@ abstract contract ValidatorManagerTest is Test { vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodCreated(validationID, nodeID, bytes32(0), weight, registrationExpiry); - _initializeValidatorRegistration(nodeID, registrationExpiry, blsPublicKey, weight); + _initializeValidatorRegistration( + ValidatorRegistrationInput({ + nodeID: nodeID, + registrationExpiry: registrationExpiry, + blsPublicKey: blsPublicKey + }), + weight + ); } function _setUpCompleteValidatorRegistration( @@ -325,9 +329,7 @@ abstract contract ValidatorManagerTest is Test { } function _initializeValidatorRegistration( - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory blsPublicKey, + ValidatorRegistrationInput memory input, uint64 weight ) internal virtual returns (bytes32); From 299d3a4ad97e97949a0d6c384ed0bcf9d22fb6b3 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Mon, 9 Sep 2024 15:57:55 -0400 Subject: [PATCH 229/545] add initializer tests --- .../validatormanager/PoSValidatorManager.sol | 4 +- .../tests/ERC20TokenStakingManagerTests.t.sol | 63 +++++++++++++++++++ .../NativeTokenStakingManagerTests.t.sol | 60 ++++++++++++++++++ 3 files changed, 124 insertions(+), 3 deletions(-) diff --git a/contracts/validatormanager/PoSValidatorManager.sol b/contracts/validatormanager/PoSValidatorManager.sol index 9c7c05fd0..2a52e4e3f 100644 --- a/contracts/validatormanager/PoSValidatorManager.sol +++ b/contracts/validatormanager/PoSValidatorManager.sol @@ -102,9 +102,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager minimumStakeAmount <= maximumStakeAmount, "PoSValidatorManager: invalid stake amount range" ); - require( - maximumStakeMultiplier > 0, "PoSValidatorManager: zero max validator stake multiplier" - ); + require(maximumStakeMultiplier > 0, "PoSValidatorManager: zero maximum stake multiplier"); $._minimumStakeAmount = minimumStakeAmount; $._maximumStakeAmount = maximumStakeAmount; diff --git a/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol index f530d64e2..74485a722 100644 --- a/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol @@ -53,6 +53,69 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { posValidatorManager = app; } + function testZeroDelegationFee() public { + app = new ERC20TokenStakingManager(ICMInitializable.Allowed); + vm.expectRevert("PoSValidatorManager: zero delegation fee"); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFee: 0, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + rewardCalculator: IRewardCalculator(address(0)) + }), + token + ); + } + + function testInvalidStakeAmountRange() public { + app = new ERC20TokenStakingManager(ICMInitializable.Allowed); + vm.expectRevert("PoSValidatorManager: invalid stake amount range"); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MAXIMUM_STAKE, + maximumStakeAmount: DEFAULT_MINIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + rewardCalculator: IRewardCalculator(address(0)) + }), + token + ); + } + + function testZeroMaxStakeMultiplier() public { + app = new ERC20TokenStakingManager(ICMInitializable.Allowed); + vm.expectRevert("PoSValidatorManager: zero maximum stake multiplier"); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + maximumStakeMultiplier: 0, + rewardCalculator: IRewardCalculator(address(0)) + }), + token + ); + } + function _initializeValidatorRegistration( ValidatorRegistrationInput memory input, uint64 weight diff --git a/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol index e7946c5fe..f9295d144 100644 --- a/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol @@ -45,6 +45,66 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { posValidatorManager = app; } + function testZeroDelegationFee() public { + app = new NativeTokenStakingManager(ICMInitializable.Allowed); + vm.expectRevert("PoSValidatorManager: zero delegation fee"); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFee: 0, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + rewardCalculator: IRewardCalculator(address(0)) + }) + ); + } + + function testInvalidStakeAmountRange() public { + app = new NativeTokenStakingManager(ICMInitializable.Allowed); + vm.expectRevert("PoSValidatorManager: invalid stake amount range"); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MAXIMUM_STAKE, + maximumStakeAmount: DEFAULT_MINIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + rewardCalculator: IRewardCalculator(address(0)) + }) + ); + } + + function testZeroMaxStakeMultiplier() public { + app = new NativeTokenStakingManager(ICMInitializable.Allowed); + vm.expectRevert("PoSValidatorManager: zero maximum stake multiplier"); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + maximumStakeMultiplier: 0, + rewardCalculator: IRewardCalculator(address(0)) + }) + ); + } + // Helpers function _initializeValidatorRegistration( ValidatorRegistrationInput memory input, From 0dd5b6c5d835bbd75521787dadf393e255ea1b69 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Mon, 9 Sep 2024 16:16:16 -0400 Subject: [PATCH 230/545] invalid validator requirements --- .../tests/ERC20TokenStakingManagerTests.t.sol | 36 +++++++++++++++++-- .../NativeTokenStakingManagerTests.t.sol | 6 ++-- .../tests/PoSValidatorManagerTests.t.sol | 21 ++++++++--- 3 files changed, 53 insertions(+), 10 deletions(-) diff --git a/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol index 74485a722..e0d3239de 100644 --- a/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol @@ -55,7 +55,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testZeroDelegationFee() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert("PoSValidatorManager: zero delegation fee"); + vm.expectRevert(_formatErrorMessage("zero delegation fee")); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -76,7 +76,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testInvalidStakeAmountRange() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert("PoSValidatorManager: invalid stake amount range"); + vm.expectRevert(_formatErrorMessage("invalid stake amount range")); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -97,7 +97,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMaxStakeMultiplier() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert("PoSValidatorManager: zero maximum stake multiplier"); + vm.expectRevert(_formatErrorMessage("zero maximum stake multiplier")); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -116,6 +116,36 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ); } + function testInvalidValidatorMinStakeDuration() public { + ValidatorRegistrationInput memory input = + ValidatorRegistrationInput(DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY); + uint256 stakeAmount = app.weightToValue(DEFAULT_WEIGHT); + vm.expectRevert(_formatErrorMessage("invalid min stake duration")); + app.initializeValidatorRegistration( + input, + PoSValidatorRequirements({ + minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION - 1, + delegationFee: DEFAULT_MINIMUM_DELEGATION_FEE + }), + stakeAmount + ); + } + + function testInvalidValidatorDelegationFee() public { + ValidatorRegistrationInput memory input = + ValidatorRegistrationInput(DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY); + uint256 stakeAmount = app.weightToValue(DEFAULT_WEIGHT); + vm.expectRevert(_formatErrorMessage("invalid delegation fee")); + app.initializeValidatorRegistration( + input, + PoSValidatorRequirements({ + minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + delegationFee: DEFAULT_MINIMUM_DELEGATION_FEE - 1 + }), + stakeAmount + ); + } + function _initializeValidatorRegistration( ValidatorRegistrationInput memory input, uint64 weight diff --git a/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol index f9295d144..43a672027 100644 --- a/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol @@ -47,7 +47,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testZeroDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert("PoSValidatorManager: zero delegation fee"); + vm.expectRevert(_formatErrorMessage("zero delegation fee")); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -67,7 +67,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testInvalidStakeAmountRange() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert("PoSValidatorManager: invalid stake amount range"); + vm.expectRevert(_formatErrorMessage("invalid stake amount range")); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -87,7 +87,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMaxStakeMultiplier() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert("PoSValidatorManager: zero maximum stake multiplier"); + vm.expectRevert(_formatErrorMessage("zero maximum stake multiplier")); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ diff --git a/contracts/validatormanager/tests/PoSValidatorManagerTests.t.sol b/contracts/validatormanager/tests/PoSValidatorManagerTests.t.sol index 40efa94f3..a53b62fac 100644 --- a/contracts/validatormanager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validatormanager/tests/PoSValidatorManagerTests.t.sol @@ -62,6 +62,19 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce ); + function testInvalidInitializeEndTime() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + vm.expectRevert(_formatErrorMessage("minimum stake duration not met")); + posValidatorManager.initializeEndValidation(validationID, false, 0); + } + function testInvalidUptimeWarpMessage() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -71,8 +84,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); _mockGetVerifiedWarpMessage(new bytes(0), false); + vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid warp message")); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -86,10 +99,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); _mockGetVerifiedWarpMessage(new bytes(0), true); _mockGetBlockchainID(); + vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid source chain ID")); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -103,7 +116,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); _mockGetBlockchainID(); vm.mockCall( @@ -122,6 +134,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) ); + vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid origin sender address")); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -135,7 +148,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); _mockGetBlockchainID(); vm.mockCall( @@ -154,6 +166,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) ); + vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid uptime validation ID")); posValidatorManager.initializeEndValidation(validationID, true, 0); } From 8be8b5e4e05d835c107814ed564672ccd13ed5d6 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Tue, 10 Sep 2024 14:07:14 +0000 Subject: [PATCH 231/545] unlock stake at delegation end --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 4 ++- .../tests/ERC20TokenStakingManagerTests.t.sol | 31 +++++----------- .../NativeTokenStakingManagerTests.t.sol | 31 +++++----------- .../tests/PoSValidatorManagerTests.t.sol | 35 +++++++++++++++++++ 6 files changed, 57 insertions(+), 48 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 2264e7082..18d5f149c 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161486538038061486583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147188061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613d84565b6102d6565b005b610128610138366004613dbf565b610761565b61017b61014b366004613dbf565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613dbf565b6108bd565b6101286101af366004613dea565b61092a565b6101c76101c2366004613dbf565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613e27565b610a24565b610128610200366004613e40565b610a4f565b61017b610213366004613e7e565b610c40565b6101c7610226366004613dbf565b610c59565b610128610239366004613dbf565b610c6d565b61012861024c366004613d84565b610cda565b61017b61025f366004613f29565b610cf5565b610128610272366004613e40565b610d1a565b61017b610285366004613fc5565b610eba565b610128610298366004613e27565b610ecd565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613dbf565b61108a565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061466c833981519152918415610328576103258285611159565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613fe5565b600481111561036b5761036b613fe5565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613fe5565b146104445760405162461bcd60e51b815260206004820152602a60248201525f8051602061468c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f8051602061468c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b3846113f5565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500613fe5565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611469565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e919061400d565b905061066a8682611548565b5f610676878584611590565b5f8c815260058a016020526040902090915061069282826140b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614198565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906141ca565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206146ac8339815191529291906107a990614034565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9613fe5565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016141e1565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906141ca565b505050565b6108c6816117ad565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061466c833981519152916005600160991b019163ee5b48eb91610878916004016141e1565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc848461187c565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361427f565b92915050565b5f610a2e82611896565b9050610a4b81606001516001600160401b03168260400151611c23565b5050565b5f8051602061466c8339815191525f610a6784611c59565b90505f80610a788360400151611e3a565b5091509150610a8685612075565b5f8581526004850160205260408120610a9e91613ccc565b5f610aa883611469565b9050816001600160401b031681608001516001600160401b03161015610ae05760405162461bcd60e51b815260040161043b90614292565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b255760405162461bcd60e51b815260040161043b906142d4565b60015f87815260038701602052604090205460ff166004811115610b4b57610b4b613fe5565b14610bb45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a5100061431d565b5f610c6382611469565b60a0015192915050565b610c7681612075565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061466c833981519152916005600160991b019163ee5b48eb91610878916004016141e1565b8115610cec57610cea8382611159565b505b6108b88361214e565b5f80610d0086612506565b9050610d0e858286866125b3565b9150505b949350505050565b5f8051602061466c8339815191525f610d3284611c59565b90505f80610d438360400151611e3a565b5091509150610d51856117ad565b5f8581526005850160205260408120610d6991613ccc565b5f610d7383611469565b9050816001600160401b031681608001516001600160401b03161015610dab5760405162461bcd60e51b815260040161043b90614292565b5f8681526003808701602052604090912001546001600160401b0380841691161115610de95760405162461bcd60e51b815260040161043b906142d4565b60035f87815260038701602052604090205460ff166004811115610e0f57610e0f613fe5565b14610e635760405162461bcd60e51b815260206004820152603160248201525f8051602061468c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f610ec6833384612a08565b9392505050565b5f805160206146ac8339815191525f610ee583611c59565b90505f80610ef68360400151612dc3565b9150915080610f585760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260058501602052604081208054610f7290614034565b9050118015610fa4575060015f83815260078601602052604090205460ff166005811115610fa257610fa2613fe5565b145b610fc05760405162461bcd60e51b815260040161043b90614334565b5f8281526005850160205260408120610fd891613ccc565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206146ac8339815191529291906110d290614034565b9050118015611104575060015f83815260078301602052604090205460ff16600581111561110257611102613fe5565b145b6111205760405162461bcd60e51b815260040161043b90614334565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016141e1565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156111a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111cb9190810190614386565b915091508061122e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611271573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061129591906141ca565b8251146112f95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b03161561136f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061137e8460400151612f64565b915091508187146113eb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206146ec8339815191526020526040812060030180545f805160206146ac833981519152916001600160401b039091169081908461143a83614458565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611471613d03565b5f8281525f805160206146ec8339815191526020526040908190208151610100810190925280545f805160206146ac833981519152929190829060ff1660058111156114bf576114bf613fe5565b60058111156114d0576114d0613fe5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206146ec833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611609576115c981600161447d565b6115d490600861431d565b5081515f908390839081106115eb576115eb614490565b60200101906001600160f81b03191690815f1a9053506001016115b5565b505f5b600481101561166c5761162081600361447d565b61162b90600861431d565b6001901c60f81b8261163e8360026144a4565b8151811061164e5761164e614490565b60200101906001600160f81b03191690815f1a90535060010161160c565b505f5b60208110156116ce5761168381601f61447d565b61168e90600861431d565b86901c60f81b826116a08360066144a4565b815181106116b0576116b0614490565b60200101906001600160f81b03191690815f1a90535060010161166f565b505f5b6008811015611739576116e581600761447d565b6116f090600861431d565b6001600160401b038616901c60f81b8261170b8360266144a4565b8151811061171b5761171b614490565b60200101906001600160f81b03191690815f1a9053506001016116d1565b505f5b60088110156117a45761175081600761447d565b61175b90600861431d565b6001600160401b038516901c60f81b8261177683602e6144a4565b8151811061178657611786614490565b60200101906001600160f81b03191690815f1a90535060010161173c565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061466c8339815191529291906117f590614034565b9050118015611827575060035f83815260038301602052604090205460ff16600481111561182557611825613fe5565b145b610a4b5760405162461bcd60e51b815260206004820152603360248201525f8051602061468c83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b61188461313c565b61188d82613187565b610a4b816131cd565b61189e613d03565b5f805160206146ac8339815191525f6118b684611c59565b90505f806118c78360400151612dc3565b91509150801561192c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff16600581111561195e5761195e613fe5565b600581111561196f5761196f613fe5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156119f6576119f6613fe5565b1480611a145750600182516005811115611a1257611a12613fe5565b145b611a735760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611a8857611a88613fe5565b03611aaf57505f8381526006860160205260408120600491611aaa9190613ccc565b611ab3565b5060055b6020808301515f90815260088801909152604081205581816005811115611adc57611adc613fe5565b90816005811115611aef57611aef613fe5565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611b2357611b23613fe5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611bee57611bee613fe5565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a4b906001600160a01b03168284613281565b60408051606080820183525f8083526020830181905292820152905f805160206146ac8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611cce573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cf59190810190614386565b9150915080611d5c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611dbf5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611e325760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611e5e5760405162461bcd60e51b815260040161043b906144b7565b5f805b6002811015611ead57611e7581600161447d565b611e8090600861431d565b61ffff16868281518110611e9657611e96614490565b016020015160f81c901b9190911790600101611e61565b5061ffff811615611ed05760405162461bcd60e51b815260040161043b90614500565b5f805b6004811015611f2b57611ee781600361447d565b611ef290600861431d565b63ffffffff1687611f048360026144a4565b81518110611f1457611f14614490565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff8116600314611f525760405162461bcd60e51b815260040161043b90614543565b5f805b6020811015611fa757611f6981601f61447d565b611f7490600861431d565b88611f808360066144a4565b81518110611f9057611f90614490565b016020015160f81c901b9190911790600101611f55565b505f805b600881101561200657611fbf81600761447d565b611fca90600861431d565b6001600160401b031689611fdf8360266144a4565b81518110611fef57611fef614490565b016020015160f81c901b9190911790600101611fab565b505f805b60088110156120655761201e81600761447d565b61202990600861431d565b6001600160401b03168a61203e83602e6144a4565b8151811061204e5761204e614490565b016020015160f81c901b919091179060010161200a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061466c8339815191529291906120bd90614034565b90501180156120ef575060015f83815260038301602052604090205460ff1660048111156120ed576120ed613fe5565b145b610a4b5760405162461bcd60e51b815260206004820152603860248201525f8051602061468c83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f805160206146ec83398151915260205260408082208151610100810190925280545f805160206146ac83398151915293929190829060ff16600581111561219c5761219c613fe5565b60058111156121ad576121ad613fe5565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561223557612235613fe5565b146122915760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461230b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123188160a001516132e0565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561235c5761235c613fe5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61242884612422816113f5565b5f611590565b5f858152600685016020526040902090915061244482826140b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612471908590600401614198565b6020604051808303815f875af115801561248d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b191906141ca565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061466c8339815191528161251f84613481565b90505f61252b82610a0e565b83549091506001600160401b0382161080159061255557508260010154816001600160401b031611155b610d125760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f6125bc6134b7565b5f805160206146ac833981519152426001600160401b0385161180156125f657506001600160401b0384166125f4426202a3006144a4565b115b6126585760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b856126af5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f8681526008820160205260409020541561271d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146127845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b61278d856132e0565b5f806127d46040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134ee565b5f828152600586016020526040902091935091506127f282826140b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061281f908590600401614198565b6020604051808303815f875af115801561283b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061285f91906141ca565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff191660018360058111156128e1576128e1613fe5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556129a2836113f5565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1260015f805160206146cc83398151915255565b5f612a116134b7565b5f612a1e6101c284613481565b90505f8051602061466c8339815191525f612a3887611469565b9050600281516005811115612a4f57612a4f613fe5565b14612aae5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612abf919061458a565b9050612acb8882611548565b5f612ad5896113f5565b90505f898983604051602001612b1d9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612b3e866132e0565b5f612b4a8b8486611590565b5f8381526004880160205260409020909150612b6682826140b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b93908590600401614198565b6020604051808303815f875af1158015612baf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bd391906141ca565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c8257612c82613fe5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610ec660015f805160206146cc83398151915255565b5f808251602714612de65760405162461bcd60e51b815260040161043b906144b7565b5f805b6002811015612e3557612dfd81600161447d565b612e0890600861431d565b61ffff16858281518110612e1e57612e1e614490565b016020015160f81c901b9190911790600101612de9565b5061ffff811615612e585760405162461bcd60e51b815260040161043b90614500565b5f805b6004811015612eb357612e6f81600361447d565b612e7a90600861431d565b63ffffffff1686612e8c8360026144a4565b81518110612e9c57612e9c614490565b016020015160f81c901b9190911790600101612e5b565b5063ffffffff8116600214612eda5760405162461bcd60e51b815260040161043b90614543565b5f805b6020811015612f2f57612ef181601f61447d565b612efc90600861431d565b87612f088360066144a4565b81518110612f1857612f18614490565b016020015160f81c901b9190911790600101612edd565b505f86602681518110612f4457612f44614490565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612f875760405162461bcd60e51b815260040161043b906144b7565b5f805b6002811015612fd657612f9e81600161447d565b612fa990600861431d565b61ffff16858281518110612fbf57612fbf614490565b016020015160f81c901b9190911790600101612f8a565b5061ffff811615612ff95760405162461bcd60e51b815260040161043b90614500565b5f805b60048110156130545761301081600361447d565b61301b90600861431d565b63ffffffff168661302d8360026144a4565b8151811061303d5761303d614490565b016020015160f81c901b9190911790600101612ffc565b5063ffffffff811660041461307b5760405162461bcd60e51b815260040161043b90614543565b5f805b60208110156130d05761309281601f61447d565b61309d90600861431d565b876130a98360066144a4565b815181106130b9576130b9614490565b016020015160f81c901b919091179060010161307e565b505f805b600881101561312f576130e881600761447d565b6130f390600861431d565b6001600160401b0316886131088360266144a4565b8151811061311857613118614490565b016020015160f81c901b91909117906001016130d4565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661318557604051631afcd79f60e31b815260040160405180910390fd5b565b61318f61313c565b613198816138a6565b6131ca606082013560808301356131b560c0850160a08601613e7e565b6131c560e0860160c087016145aa565b6138c7565b50565b6131d561313c565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132615760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613922565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146ac8339815191529060ff165f0361331e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613366908361447d565b10613382576001600160401b03841660408301528082526133a1565b8382604001818151613394919061458a565b6001600160401b03169052505b5f8260200151836040015160646133b891906145c5565b6133c291906145f0565b600285015490915060ff908116908216111561343d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613983565b5f805160206146cc8339815191528054600119016134e857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135585760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135cf5761358f81600161447d565b61359a90600861431d565b5081515f908390839081106135b1576135b1614490565b60200101906001600160f81b03191690815f1a90535060010161357b565b505f5b600481101561362d576135e681600361447d565b6135f190600861431d565b505f826135ff8360026144a4565b8151811061360f5761360f614490565b60200101906001600160f81b03191690815f1a9053506001016135d2565b505f5b602081101561368a578451816020811061364c5761364c614490565b1a60f81b8261365c8360066144a4565b8151811061366c5761366c614490565b60200101906001600160f81b03191690815f1a905350600101613630565b505f5b60208110156136ea57846020015181602081106136ac576136ac614490565b1a60f81b826136bc8360266144a4565b815181106136cc576136cc614490565b60200101906001600160f81b03191690815f1a90535060010161368d565b505f5b600881101561375e5761370181600761447d565b61370c90600861431d565b60ff1685604001516001600160401b0316901c60f81b8282604661373091906144a4565b8151811061374057613740614490565b60200101906001600160f81b03191690815f1a9053506001016136ed565b505f5b60308110156137c9578460800151818151811061378057613780614490565b01602001516001600160f81b0319168261379b83604e6144a4565b815181106137ab576137ab614490565b60200101906001600160f81b03191690815f1a905350600101613761565b505f5b600881101561383b576137e081600761447d565b6137eb90600861431d565b60608601516001600160401b0390811691161c60f81b8261380d83607e6144a4565b8151811061381d5761381d614490565b60200101906001600160f81b03191690815f1a9053506001016137cc565b5060028160405161384c9190614615565b602060405180830381855afa158015613867573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061388a91906141ca565b94909350915050565b60015f805160206146cc83398151915255565b6138ae61313c565b6138b6613ae5565b6138be613af5565b6131ca81613afd565b6138cf61313c565b5f5f8051602061466c833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f6139366001600160a01b03841683613b69565b905080515f1415801561395a5750808060200190518101906139589190614630565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156139c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139ed91906141ca565b9050613a046001600160a01b038516333086613b76565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613a48573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a6c91906141ca565b9050818111613ad25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613adc828261447d565b95945050505050565b613aed61313c565b613185613bb5565b61318561313c565b613b0561313c565b80355f805160206146ac83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b4f606083016040840161464b565b600291909101805460ff191660ff90921691909117905550565b6060610ec683835f613bbd565b6040516001600160a01b038481166024830152838116604483015260648201839052613baf9186918216906323b872dd906084016132ae565b50505050565b61389361313c565b606081471015613be25760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613bfd9190614615565b5f6040518083038185875af1925050503d805f8114613c37576040519150601f19603f3d011682016040523d82523d5f602084013e613c3c565b606091505b50915091506113eb868383606082613c5c57613c5782613ca3565b610ec6565b8151158015613c7357506001600160a01b0384163b155b15613c9c57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610ec6565b805115613cb35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613cd890614034565b5f825580601f10613ce7575050565b601f0160209004905f5260205f20908101906131ca9190613d47565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613d5b575f8155600101613d48565b5090565b80151581146131ca575f80fd5b803563ffffffff81168114613d7f575f80fd5b919050565b5f805f60608486031215613d96575f80fd5b833592506020840135613da881613d5f565b9150613db660408501613d6c565b90509250925092565b5f60208284031215613dcf575f80fd5b5035919050565b6001600160a01b03811681146131ca575f80fd5b5f80828403610100811215613dfd575f80fd5b60e0811215613e0a575f80fd5b5082915060e0830135613e1c81613dd6565b809150509250929050565b5f60208284031215613e37575f80fd5b610ec682613d6c565b5f8060408385031215613e51575f80fd5b613e5a83613d6c565b946020939093013593505050565b80356001600160401b0381168114613d7f575f80fd5b5f60208284031215613e8e575f80fd5b610ec682613e68565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613ecd57613ecd613e97565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613efb57613efb613e97565b604052919050565b5f6001600160401b03821115613f1b57613f1b613e97565b50601f01601f191660200190565b5f805f8060808587031215613f3c575f80fd5b8435935060208501359250613f5360408601613e68565b915060608501356001600160401b03811115613f6d575f80fd5b8501601f81018713613f7d575f80fd5b8035613f90613f8b82613f03565b613ed3565b818152886020838501011115613fa4575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613fd6575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561402d5761402d613ff9565b5092915050565b600181811c9082168061404857607f821691505b60208210810361406657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156140915750805b601f840160051c820191505b818110156140b0575f815560010161409d565b5050505050565b81516001600160401b038111156140d0576140d0613e97565b6140e4816140de8454614034565b8461406c565b602080601f831160018114614117575f84156141005750858301515b5f19600386901b1c1916600185901b17855561416e565b5f85815260208120601f198616915b8281101561414557888601518255948401946001909101908401614126565b508582101561416257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015614190578181015183820152602001614178565b50505f910152565b602081525f82518060208401526141b6816040850160208701614176565b601f01601f19169190910160400192915050565b5f602082840312156141da575f80fd5b5051919050565b5f60208083525f84546141f381614034565b806020870152604060018084165f811461421457600181146142305761425d565b60ff19851660408a0152604084151560051b8a0101955061425d565b895f5260205f205f5b858110156142545781548b8201860152908301908801614239565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261428d5761428d61426b565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e613ff9565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613d7f81613d5f565b5f8060408385031215614397575f80fd5b82516001600160401b03808211156143ad575f80fd5b90840190606082870312156143c0575f80fd5b6143c8613eab565b825181526020808401516143db81613dd6565b828201526040840151838111156143f0575f80fd5b80850194505087601f850112614404575f80fd5b83519250614414613f8b84613f03565b8381528882858701011115614427575f80fd5b61443684838301848801614176565b8060408401525081955061444b81880161437b565b9450505050509250929050565b5f6001600160401b0380831681810361447357614473613ff9565b6001019392505050565b81810381811115610a1e57610a1e613ff9565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e613ff9565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561402d5761402d613ff9565b5f602082840312156145ba575f80fd5b8135610ec681613dd6565b6001600160401b038181168382160280821691908281146145e8576145e8613ff9565b505092915050565b5f6001600160401b03808416806146095761460961426b565b92169190910492915050565b5f8251614626818460208701614176565b9190910192915050565b5f60208284031215614640575f80fd5b8151610ec681613d5f565b5f6020828403121561465b575f80fd5b813560ff81168114610ec6575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516148f43803806148f483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147a78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613e13565b6102d6565b005b610128610138366004613e4e565b610761565b61017b61014b366004613e4e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613e4e565b6108bd565b6101286101af366004613e79565b61092a565b6101c76101c2366004613e4e565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613eb6565b610a24565b610128610200366004613ecf565b610a4f565b61017b610213366004613f0d565b610c40565b6101c7610226366004613e4e565b610c59565b610128610239366004613e4e565b610c6d565b61012861024c366004613e13565b610cda565b61017b61025f366004613fb8565b610cf5565b610128610272366004613ecf565b610d1a565b61017b610285366004614054565b610f49565b610128610298366004613eb6565b610f5c565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613e4e565b611119565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206146fb8339815191529184156103285761032582856111e8565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614074565b600481111561036b5761036b614074565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614074565b146104445760405162461bcd60e51b815260206004820152602a60248201525f8051602061471b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f8051602061471b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611484565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500614074565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856114f8565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e919061409c565b905061066a86826115d7565b5f61067687858461161f565b5f8c815260058a01602052604090209091506106928282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614227565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190614259565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061473b8339815191529291906107a9906140c3565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9614074565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b89190614259565b505050565b6108c68161183c565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc848461190b565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361430e565b92915050565b5f610a2e82611925565b9050610a4b81606001516001600160401b03168260400151611cb2565b5050565b5f805160206146fb8339815191525f610a6784611ce8565b90505f80610a788360400151611ec9565b5091509150610a8685612104565b5f8581526004850160205260408120610a9e91613d5b565b5f610aa8836114f8565b9050816001600160401b031681608001516001600160401b03161015610ae05760405162461bcd60e51b815260040161043b90614321565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b255760405162461bcd60e51b815260040161043b90614363565b60015f87815260038701602052604090205460ff166004811115610b4b57610b4b614074565b14610bb45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a510006143ac565b5f610c63826114f8565b60a0015192915050565b610c7681612104565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b8115610cec57610cea83826111e8565b505b6108b8836121dd565b5f80610d0086612595565b9050610d0e85828686612642565b9150505b949350505050565b5f805160206146fb8339815191525f610d3284611ce8565b90505f80610d438360400151611ec9565b5091509150610d518561183c565b5f8581526005850160205260408120610d6991613d5b565b5f610d73836114f8565b9050816001600160401b031681608001516001600160401b03161015610dab5760405162461bcd60e51b815260040161043b90614321565b5f8681526003808701602052604090912001546001600160401b0380841691161115610de95760405162461bcd60e51b815260040161043b90614363565b60035f87815260038701602052604090205460ff166004811115610e0f57610e0f614074565b14610e635760405162461bcd60e51b815260206004820152603160248201525f8051602061471b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f079190611cb2565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f55833384612a97565b9392505050565b5f8051602061473b8339815191525f610f7483611ce8565b90505f80610f858360400151612e52565b9150915080610fe75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260058501602052604081208054611001906140c3565b9050118015611033575060015f83815260078601602052604090205460ff16600581111561103157611031614074565b145b61104f5760405162461bcd60e51b815260040161043b906143c3565b5f828152600585016020526040812061106791613d5b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061473b833981519152929190611161906140c3565b9050118015611193575060015f83815260078301602052604090205460ff16600581111561119157611191614074565b145b6111af5760405162461bcd60e51b815260040161043b906143c3565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611233573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261125a9190810190614415565b91509150806112bd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611300573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113249190614259565b8251146113885760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156113fe5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061140d8460400151612ff3565b9150915081871461147a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f8051602061477b8339815191526020526040812060030180545f8051602061473b833981519152916001600160401b03909116908190846114c9836144e7565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611500613d92565b5f8281525f8051602061477b8339815191526020526040908190208151610100810190925280545f8051602061473b833981519152929190829060ff16600581111561154e5761154e614074565b600581111561155f5761155f614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061477b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116985761165881600161450c565b6116639060086143ac565b5081515f9083908390811061167a5761167a61451f565b60200101906001600160f81b03191690815f1a905350600101611644565b505f5b60048110156116fb576116af81600361450c565b6116ba9060086143ac565b6001901c60f81b826116cd836002614533565b815181106116dd576116dd61451f565b60200101906001600160f81b03191690815f1a90535060010161169b565b505f5b602081101561175d5761171281601f61450c565b61171d9060086143ac565b86901c60f81b8261172f836006614533565b8151811061173f5761173f61451f565b60200101906001600160f81b03191690815f1a9053506001016116fe565b505f5b60088110156117c85761177481600761450c565b61177f9060086143ac565b6001600160401b038616901c60f81b8261179a836026614533565b815181106117aa576117aa61451f565b60200101906001600160f81b03191690815f1a905350600101611760565b505f5b6008811015611833576117df81600761450c565b6117ea9060086143ac565b6001600160401b038516901c60f81b8261180583602e614533565b815181106118155761181561451f565b60200101906001600160f81b03191690815f1a9053506001016117cb565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206146fb833981519152929190611884906140c3565b90501180156118b6575060035f83815260038301602052604090205460ff1660048111156118b4576118b4614074565b145b610a4b5760405162461bcd60e51b815260206004820152603360248201525f8051602061471b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b6119136131cb565b61191c82613216565b610a4b8161325c565b61192d613d92565b5f8051602061473b8339815191525f61194584611ce8565b90505f806119568360400151612e52565b9150915080156119bb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff1660058111156119ed576119ed614074565b60058111156119fe576119fe614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8557611a85614074565b1480611aa35750600182516005811115611aa157611aa1614074565b145b611b025760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1757611b17614074565b03611b3e57505f8381526006860160205260408120600491611b399190613d5b565b611b42565b5060055b6020808301515f90815260088801909152604081205581816005811115611b6b57611b6b614074565b90816005811115611b7e57611b7e614074565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611bb257611bb2614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c7d57611c7d614074565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a4b906001600160a01b03168284613310565b60408051606080820183525f8083526020830181905292820152905f8051602061473b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d849190810190614415565b9150915080611deb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e4e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ec15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611eed5760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015611f3c57611f0481600161450c565b611f0f9060086143ac565b61ffff16868281518110611f2557611f2561451f565b016020015160f81c901b9190911790600101611ef0565b5061ffff811615611f5f5760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015611fba57611f7681600361450c565b611f819060086143ac565b63ffffffff1687611f93836002614533565b81518110611fa357611fa361451f565b016020015160f81c901b9190911790600101611f62565b5063ffffffff8116600314611fe15760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561203657611ff881601f61450c565b6120039060086143ac565b8861200f836006614533565b8151811061201f5761201f61451f565b016020015160f81c901b9190911790600101611fe4565b505f805b60088110156120955761204e81600761450c565b6120599060086143ac565b6001600160401b03168961206e836026614533565b8151811061207e5761207e61451f565b016020015160f81c901b919091179060010161203a565b505f805b60088110156120f4576120ad81600761450c565b6120b89060086143ac565b6001600160401b03168a6120cd83602e614533565b815181106120dd576120dd61451f565b016020015160f81c901b9190911790600101612099565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206146fb83398151915292919061214c906140c3565b905011801561217e575060015f83815260038301602052604090205460ff16600481111561217c5761217c614074565b145b610a4b5760405162461bcd60e51b815260206004820152603860248201525f8051602061471b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061477b83398151915260205260408082208151610100810190925280545f8051602061473b83398151915293929190829060ff16600581111561222b5761222b614074565b600581111561223c5761223c614074565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122c4576122c4614074565b146123205760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461239a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123a78160a0015161336f565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123eb576123eb614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124b7846124b181611484565b5f61161f565b5f85815260068501602052604090209091506124d38282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612500908590600401614227565b6020604051808303815f875af115801561251c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125409190614259565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146fb833981519152816125ae84613510565b90505f6125ba82610a0e565b83549091506001600160401b038216108015906125e457508260010154816001600160401b031611155b610d125760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61264b613546565b5f8051602061473b833981519152426001600160401b03851611801561268557506001600160401b038416612683426202a300614533565b115b6126e75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b8561273e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600882016020526040902054156127ac5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b61281c8561336f565b5f806128636040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061357d565b5f828152600586016020526040902091935091506128818282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128ae908590600401614227565b6020604051808303815f875af11580156128ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ee9190614259565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561297057612970614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612a3183611484565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1260015f8051602061475b83398151915255565b5f612aa0613546565b5f612aad6101c284613510565b90505f805160206146fb8339815191525f612ac7876114f8565b9050600281516005811115612ade57612ade614074565b14612b3d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612b4e9190614619565b9050612b5a88826115d7565b5f612b6489611484565b90505f898983604051602001612bac9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612bcd8661336f565b5f612bd98b848661161f565b5f8381526004880160205260409020909150612bf58282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c22908590600401614227565b6020604051808303815f875af1158015612c3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c629190614259565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d1157612d11614074565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610f5560015f8051602061475b83398151915255565b5f808251602714612e755760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015612ec457612e8c81600161450c565b612e979060086143ac565b61ffff16858281518110612ead57612ead61451f565b016020015160f81c901b9190911790600101612e78565b5061ffff811615612ee75760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015612f4257612efe81600361450c565b612f099060086143ac565b63ffffffff1686612f1b836002614533565b81518110612f2b57612f2b61451f565b016020015160f81c901b9190911790600101612eea565b5063ffffffff8116600214612f695760405162461bcd60e51b815260040161043b906145d2565b5f805b6020811015612fbe57612f8081601f61450c565b612f8b9060086143ac565b87612f97836006614533565b81518110612fa757612fa761451f565b016020015160f81c901b9190911790600101612f6c565b505f86602681518110612fd357612fd361451f565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146130165760405162461bcd60e51b815260040161043b90614546565b5f805b60028110156130655761302d81600161450c565b6130389060086143ac565b61ffff1685828151811061304e5761304e61451f565b016020015160f81c901b9190911790600101613019565b5061ffff8116156130885760405162461bcd60e51b815260040161043b9061458f565b5f805b60048110156130e35761309f81600361450c565b6130aa9060086143ac565b63ffffffff16866130bc836002614533565b815181106130cc576130cc61451f565b016020015160f81c901b919091179060010161308b565b5063ffffffff811660041461310a5760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561315f5761312181601f61450c565b61312c9060086143ac565b87613138836006614533565b815181106131485761314861451f565b016020015160f81c901b919091179060010161310d565b505f805b60088110156131be5761317781600761450c565b6131829060086143ac565b6001600160401b031688613197836026614533565b815181106131a7576131a761451f565b016020015160f81c901b9190911790600101613163565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661321457604051631afcd79f60e31b815260040160405180910390fd5b565b61321e6131cb565b61322781613935565b6132596060820135608083013561324460c0850160a08601613f0d565b61325460e0860160c08701614639565b613956565b50565b6132646131cb565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132f05760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506139b1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061473b8339815191529060ff165f036133ad575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133f5908361450c565b10613411576001600160401b0384166040830152808252613430565b83826040018181516134239190614619565b6001600160401b03169052505b5f8260200151836040015160646134479190614654565b613451919061467f565b600285015490915060ff90811690821611156134cc5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a12565b5f8051602061475b83398151915280546001190161357757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135e75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561365e5761361e81600161450c565b6136299060086143ac565b5081515f908390839081106136405761364061451f565b60200101906001600160f81b03191690815f1a90535060010161360a565b505f5b60048110156136bc5761367581600361450c565b6136809060086143ac565b505f8261368e836002614533565b8151811061369e5761369e61451f565b60200101906001600160f81b03191690815f1a905350600101613661565b505f5b602081101561371957845181602081106136db576136db61451f565b1a60f81b826136eb836006614533565b815181106136fb576136fb61451f565b60200101906001600160f81b03191690815f1a9053506001016136bf565b505f5b6020811015613779578460200151816020811061373b5761373b61451f565b1a60f81b8261374b836026614533565b8151811061375b5761375b61451f565b60200101906001600160f81b03191690815f1a90535060010161371c565b505f5b60088110156137ed5761379081600761450c565b61379b9060086143ac565b60ff1685604001516001600160401b0316901c60f81b828260466137bf9190614533565b815181106137cf576137cf61451f565b60200101906001600160f81b03191690815f1a90535060010161377c565b505f5b6030811015613858578460800151818151811061380f5761380f61451f565b01602001516001600160f81b0319168261382a83604e614533565b8151811061383a5761383a61451f565b60200101906001600160f81b03191690815f1a9053506001016137f0565b505f5b60088110156138ca5761386f81600761450c565b61387a9060086143ac565b60608601516001600160401b0390811691161c60f81b8261389c83607e614533565b815181106138ac576138ac61451f565b60200101906001600160f81b03191690815f1a90535060010161385b565b506002816040516138db91906146a4565b602060405180830381855afa1580156138f6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139199190614259565b94909350915050565b60015f8051602061475b83398151915255565b61393d6131cb565b613945613b74565b61394d613b84565b61325981613b8c565b61395e6131cb565b5f5f805160206146fb833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f6139c56001600160a01b03841683613bf8565b905080515f141580156139e95750808060200190518101906139e791906146bf565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a7c9190614259565b9050613a936001600160a01b038516333086613c05565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ad7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afb9190614259565b9050818111613b615760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613b6b828261450c565b95945050505050565b613b7c6131cb565b613214613c44565b6132146131cb565b613b946131cb565b80355f8051602061473b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bde60608301604084016146da565b600291909101805460ff191660ff90921691909117905550565b6060610f5583835f613c4c565b6040516001600160a01b038481166024830152838116604483015260648201839052613c3e9186918216906323b872dd9060840161333d565b50505050565b6139226131cb565b606081471015613c715760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613c8c91906146a4565b5f6040518083038185875af1925050503d805f8114613cc6576040519150601f19603f3d011682016040523d82523d5f602084013e613ccb565b606091505b509150915061147a868383606082613ceb57613ce682613d32565b610f55565b8151158015613d0257506001600160a01b0384163b155b15613d2b57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610f55565b805115613d425780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d67906140c3565b5f825580601f10613d76575050565b601f0160209004905f5260205f20908101906132599190613dd6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613dea575f8155600101613dd7565b5090565b8015158114613259575f80fd5b803563ffffffff81168114613e0e575f80fd5b919050565b5f805f60608486031215613e25575f80fd5b833592506020840135613e3781613dee565b9150613e4560408501613dfb565b90509250925092565b5f60208284031215613e5e575f80fd5b5035919050565b6001600160a01b0381168114613259575f80fd5b5f80828403610100811215613e8c575f80fd5b60e0811215613e99575f80fd5b5082915060e0830135613eab81613e65565b809150509250929050565b5f60208284031215613ec6575f80fd5b610f5582613dfb565b5f8060408385031215613ee0575f80fd5b613ee983613dfb565b946020939093013593505050565b80356001600160401b0381168114613e0e575f80fd5b5f60208284031215613f1d575f80fd5b610f5582613ef7565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613f5c57613f5c613f26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f8a57613f8a613f26565b604052919050565b5f6001600160401b03821115613faa57613faa613f26565b50601f01601f191660200190565b5f805f8060808587031215613fcb575f80fd5b8435935060208501359250613fe260408601613ef7565b915060608501356001600160401b03811115613ffc575f80fd5b8501601f8101871361400c575f80fd5b803561401f61401a82613f92565b613f62565b818152886020838501011115614033575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215614065575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140bc576140bc614088565b5092915050565b600181811c908216806140d757607f821691505b6020821081036140f557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156141205750805b601f840160051c820191505b8181101561413f575f815560010161412c565b5050505050565b81516001600160401b0381111561415f5761415f613f26565b6141738161416d84546140c3565b846140fb565b602080601f8311600181146141a6575f841561418f5750858301515b5f19600386901b1c1916600185901b1785556141fd565b5f85815260208120601f198616915b828110156141d4578886015182559484019460019091019084016141b5565b50858210156141f157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561421f578181015183820152602001614207565b50505f910152565b602081525f8251806020840152614245816040850160208701614205565b601f01601f19169190910160400192915050565b5f60208284031215614269575f80fd5b5051919050565b5f60208083525f8454614282816140c3565b806020870152604060018084165f81146142a357600181146142bf576142ec565b60ff19851660408a0152604084151560051b8a010195506142ec565b895f5260205f205f5b858110156142e35781548b82018601529083019088016142c8565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261431c5761431c6142fa565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e614088565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613e0e81613dee565b5f8060408385031215614426575f80fd5b82516001600160401b038082111561443c575f80fd5b908401906060828703121561444f575f80fd5b614457613f3a565b8251815260208084015161446a81613e65565b8282015260408401518381111561447f575f80fd5b80850194505087601f850112614493575f80fd5b835192506144a361401a84613f92565b83815288828587010111156144b6575f80fd5b6144c584838301848801614205565b806040840152508195506144da81880161440a565b9450505050509250929050565b5f6001600160401b0380831681810361450257614502614088565b6001019392505050565b81810381811115610a1e57610a1e614088565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e614088565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140bc576140bc614088565b5f60208284031215614649575f80fd5b8135610f5581613e65565b6001600160401b0381811683821602808216919082811461467757614677614088565b505092915050565b5f6001600160401b0380841680614698576146986142fa565b92169190910492915050565b5f82516146b5818460208701614205565b9190910192915050565b5f602082840312156146cf575f80fd5b8151610f5581613dee565b5f602082840312156146ea575f80fd5b813560ff81168114610f55575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 2376dabec..417ebce75 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161449638038061449683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143498061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613a02565b610389565b005b348015610134575f80fd5b50610127610143366004613a3d565b61046b565b348015610153575f80fd5b50610127610162366004613a78565b6108f6565b348015610172575f80fd5b506101b1610181366004613a78565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613a78565b610a52565b3480156101ee575f80fd5b506102026101fd366004613a78565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613a8f565b610ad5565b348015610244575f80fd5b50610127610253366004613aa8565b610b00565b348015610263575f80fd5b506101b1610272366004613ae6565b610cf1565b348015610282575f80fd5b50610202610291366004613a78565b610d0a565b3480156102a1575f80fd5b506101276102b0366004613a78565b610d1e565b3480156102c0575f80fd5b506101276102cf366004613a3d565b610d8b565b3480156102df575f80fd5b506101276102ee366004613aa8565b610da6565b3480156102fe575f80fd5b5061012761030d366004613a8f565b610f46565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613a78565b611103565b6101b1610371366004613a78565b6111d2565b6101b1610384366004613b91565b6111de565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611202565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061429d8339815191529184156104bd576104ba8285611216565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613c23565b600481111561050057610500613c23565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613c23565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206142bd8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206142bd8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f610648846114b2565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613c23565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076785611526565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613c4b565b90506107ff8682611605565b5f61080b87858461164d565b5f8c815260058a01602052604090209091506108278282613cef565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613dd0565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613e02565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206142dd83398151915292919061093e90613c72565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613c23565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613e19565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613e02565b505050565b610a5b8161186a565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061429d833981519152916005600160991b019163ee5b48eb91610a0d91600401613e19565b5f610acf64e8d4a5100083613eb7565b92915050565b5f610adf82611939565b9050610afc81606001516001600160401b03168260400151611cc6565b5050565b5f8051602061429d8339815191525f610b1884611cd9565b90505f80610b298360400151611eba565b5091509150610b37856120f5565b5f8581526004850160205260408120610b4f9161396f565b5f610b5983611526565b9050816001600160401b031681608001516001600160401b03161015610b915760405162461bcd60e51b81526004016105d090613eca565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bd65760405162461bcd60e51b81526004016105d090613f0c565b60015f87815260038701602052604090205460ff166004811115610bfc57610bfc613c23565b14610c655760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000613f55565b5f610d1482611526565b60a0015192915050565b610d27816120f5565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061429d833981519152916005600160991b019163ee5b48eb91610a0d91600401613e19565b8115610d9d57610d9b8382611216565b505b610a4d836121ce565b5f8051602061429d8339815191525f610dbe84611cd9565b90505f80610dcf8360400151611eba565b5091509150610ddd8561186a565b5f8581526005850160205260408120610df59161396f565b5f610dff83611526565b9050816001600160401b031681608001516001600160401b03161015610e375760405162461bcd60e51b81526004016105d090613eca565b5f8681526003808701602052604090912001546001600160401b0380841691161115610e755760405162461bcd60e51b81526004016105d090613f0c565b60035f87815260038701602052604090205460ff166004811115610e9b57610e9b613c23565b14610eef5760405162461bcd60e51b815260206004820152603160248201525f805160206142bd8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206142dd8339815191525f610f5e83611cd9565b90505f80610f6f8360400151612586565b9150915080610fd15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f82815260058501602052604081208054610feb90613c72565b905011801561101d575060015f83815260078601602052604090205460ff16600581111561101b5761101b613c23565b145b6110395760405162461bcd60e51b81526004016105d090613f6c565b5f82815260058501602052604081206110519161396f565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206142dd83398151915292919061114b90613c72565b905011801561117d575060015f83815260078301602052604090205460ff16600581111561117b5761117b613c23565b145b6111995760405162461bcd60e51b81526004016105d090613f6c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613e19565b5f610acf823334612727565b5f806111e934612adf565b90506111f785828686612b89565b9150505b9392505050565b61120a612fde565b61121381613029565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611261573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112889190810190613fd2565b91509150806112eb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561132e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113529190613e02565b8251146113b65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b03161561142c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f8061143b846040015161306c565b915091508187146114a85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f8051602061431d8339815191526020526040812060030180545f805160206142dd833981519152916001600160401b03909116908190846114f7836140a4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61152e6139a6565b5f8281525f8051602061431d8339815191526020526040908190208151610100810190925280545f805160206142dd833981519152929190829060ff16600581111561157c5761157c613c23565b600581111561158d5761158d613c23565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061431d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116c6576116868160016140c9565b611691906008613f55565b5081515f908390839081106116a8576116a86140dc565b60200101906001600160f81b03191690815f1a905350600101611672565b505f5b6004811015611729576116dd8160036140c9565b6116e8906008613f55565b6001901c60f81b826116fb8360026140f0565b8151811061170b5761170b6140dc565b60200101906001600160f81b03191690815f1a9053506001016116c9565b505f5b602081101561178b5761174081601f6140c9565b61174b906008613f55565b86901c60f81b8261175d8360066140f0565b8151811061176d5761176d6140dc565b60200101906001600160f81b03191690815f1a90535060010161172c565b505f5b60088110156117f6576117a28160076140c9565b6117ad906008613f55565b6001600160401b038616901c60f81b826117c88360266140f0565b815181106117d8576117d86140dc565b60200101906001600160f81b03191690815f1a90535060010161178e565b505f5b60088110156118615761180d8160076140c9565b611818906008613f55565b6001600160401b038516901c60f81b8261183383602e6140f0565b81518110611843576118436140dc565b60200101906001600160f81b03191690815f1a9053506001016117f9565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061429d8339815191529291906118b290613c72565b90501180156118e4575060035f83815260038301602052604090205460ff1660048111156118e2576118e2613c23565b145b610afc5760405162461bcd60e51b815260206004820152603360248201525f805160206142bd83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b6119416139a6565b5f805160206142dd8339815191525f61195984611cd9565b90505f8061196a8360400151612586565b9150915080156119cf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611a0157611a01613c23565b6005811115611a1257611a12613c23565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a9957611a99613c23565b1480611ab75750600182516005811115611ab557611ab5613c23565b145b611b165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611b2b57611b2b613c23565b03611b5257505f8381526006860160205260408120600491611b4d919061396f565b611b56565b5060055b6020808301515f90815260088801909152604081205581816005811115611b7f57611b7f613c23565b90816005811115611b9257611b92613c23565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611bc657611bc6613c23565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c9157611c91613c23565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610afc6001600160a01b03821683613244565b60408051606080820183525f8083526020830181905292820152905f805160206142dd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d4e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d759190810190613fd2565b9150915080611ddc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611e3f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611eb25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f8351603614611ede5760405162461bcd60e51b81526004016105d090614103565b5f805b6002811015611f2d57611ef58160016140c9565b611f00906008613f55565b61ffff16868281518110611f1657611f166140dc565b016020015160f81c901b9190911790600101611ee1565b5061ffff811615611f505760405162461bcd60e51b81526004016105d09061414c565b5f805b6004811015611fab57611f678160036140c9565b611f72906008613f55565b63ffffffff1687611f848360026140f0565b81518110611f9457611f946140dc565b016020015160f81c901b9190911790600101611f53565b5063ffffffff8116600314611fd25760405162461bcd60e51b81526004016105d09061418f565b5f805b602081101561202757611fe981601f6140c9565b611ff4906008613f55565b886120008360066140f0565b81518110612010576120106140dc565b016020015160f81c901b9190911790600101611fd5565b505f805b60088110156120865761203f8160076140c9565b61204a906008613f55565b6001600160401b03168961205f8360266140f0565b8151811061206f5761206f6140dc565b016020015160f81c901b919091179060010161202b565b505f805b60088110156120e55761209e8160076140c9565b6120a9906008613f55565b6001600160401b03168a6120be83602e6140f0565b815181106120ce576120ce6140dc565b016020015160f81c901b919091179060010161208a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061429d83398151915292919061213d90613c72565b905011801561216f575060015f83815260038301602052604090205460ff16600481111561216d5761216d613c23565b145b610afc5760405162461bcd60e51b815260206004820152603860248201525f805160206142bd83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061431d83398151915260205260408082208151610100810190925280545f805160206142dd83398151915293929190829060ff16600581111561221c5761221c613c23565b600581111561222d5761222d613c23565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122b5576122b5613c23565b146123115760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461238b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6123988160a001516132d7565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123dc576123dc613c23565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124a8846124a2816114b2565b5f61164d565b5f85815260068501602052604090209091506124c48282613cef565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124f1908590600401613dd0565b6020604051808303815f875af115801561250d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125319190613e02565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146125a95760405162461bcd60e51b81526004016105d090614103565b5f805b60028110156125f8576125c08160016140c9565b6125cb906008613f55565b61ffff168582815181106125e1576125e16140dc565b016020015160f81c901b91909117906001016125ac565b5061ffff81161561261b5760405162461bcd60e51b81526004016105d09061414c565b5f805b6004811015612676576126328160036140c9565b61263d906008613f55565b63ffffffff168661264f8360026140f0565b8151811061265f5761265f6140dc565b016020015160f81c901b919091179060010161261e565b5063ffffffff811660021461269d5760405162461bcd60e51b81526004016105d09061418f565b5f805b60208110156126f2576126b481601f6140c9565b6126bf906008613f55565b876126cb8360066140f0565b815181106126db576126db6140dc565b016020015160f81c901b91909117906001016126a0565b505f86602681518110612707576127076140dc565b016020015191976001600160f81b03199092161515965090945050505050565b5f612730613478565b5f61273a83610abf565b90505f8051602061429d8339815191525f61275487611526565b905060028151600581111561276b5761276b613c23565b146127ca5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516127db91906141d6565b90506127e78882611605565b5f6127f1896114b2565b90505f8989836040516020016128399392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061285a866132d7565b5f6128668b848661164d565b5f83815260048801602052604090209091506128828282613cef565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128af908590600401613dd0565b6020604051808303815f875af11580156128cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ef9190613e02565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561299e5761299e613c23565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506111fb60015f805160206142fd83398151915255565b5f5f8051602061429d8339815191528282612af982610abf565b83549091506001600160401b03821610801590612b2357508260010154816001600160401b031611155b612b815760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612b92613478565b5f805160206142dd833981519152426001600160401b038516118015612bcc57506001600160401b038416612bca426202a3006140f0565b115b612c2e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612c855760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612cf35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612d5a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612d63856132d7565b5f80612daa6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506134c2565b5f82815260058601602052604090209193509150612dc88282613cef565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612df5908590600401613dd0565b6020604051808303815f875af1158015612e11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e359190613e02565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612eb757612eb7613c23565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612f78836114b2565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b8160015f805160206142fd83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661302757604051631afcd79f60e31b815260040160405180910390fd5b565b613031612fde565b61303a81613867565b6112136060820135608083013561305760c0850160a08601613ae6565b61306760e0860160c087016141f6565b613888565b5f808251602e1461308f5760405162461bcd60e51b81526004016105d090614103565b5f805b60028110156130de576130a68160016140c9565b6130b1906008613f55565b61ffff168582815181106130c7576130c76140dc565b016020015160f81c901b9190911790600101613092565b5061ffff8116156131015760405162461bcd60e51b81526004016105d09061414c565b5f805b600481101561315c576131188160036140c9565b613123906008613f55565b63ffffffff16866131358360026140f0565b81518110613145576131456140dc565b016020015160f81c901b9190911790600101613104565b5063ffffffff81166004146131835760405162461bcd60e51b81526004016105d09061418f565b5f805b60208110156131d85761319a81601f6140c9565b6131a5906008613f55565b876131b18360066140f0565b815181106131c1576131c16140dc565b016020015160f81c901b9190911790600101613186565b505f805b6008811015613237576131f08160076140c9565b6131fb906008613f55565b6001600160401b0316886132108360266140f0565b81518110613220576132206140dc565b016020015160f81c901b91909117906001016131dc565b5090969095509350505050565b804710156132675760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146132b0576040519150601f19603f3d011682016040523d82523d5f602084013e6132b5565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206142dd8339815191529060ff165f03613315575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061335d90836140c9565b10613379576001600160401b0384166040830152808252613398565b838260400181815161338b91906141d6565b6001600160401b03169052505b5f8260200151836040015160646133af9190614211565b6133b9919061423c565b600285015490915060ff90811690821611156134345760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206142fd8339815191528054600119016134a957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206142fd83398151915255565b5f606082608001515160301461352c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135a3576135638160016140c9565b61356e906008613f55565b5081515f90839083908110613585576135856140dc565b60200101906001600160f81b03191690815f1a90535060010161354f565b505f5b6004811015613601576135ba8160036140c9565b6135c5906008613f55565b505f826135d38360026140f0565b815181106135e3576135e36140dc565b60200101906001600160f81b03191690815f1a9053506001016135a6565b505f5b602081101561365e5784518160208110613620576136206140dc565b1a60f81b826136308360066140f0565b81518110613640576136406140dc565b60200101906001600160f81b03191690815f1a905350600101613604565b505f5b60208110156136be5784602001518160208110613680576136806140dc565b1a60f81b826136908360266140f0565b815181106136a0576136a06140dc565b60200101906001600160f81b03191690815f1a905350600101613661565b505f5b6008811015613732576136d58160076140c9565b6136e0906008613f55565b60ff1685604001516001600160401b0316901c60f81b8282604661370491906140f0565b81518110613714576137146140dc565b60200101906001600160f81b03191690815f1a9053506001016136c1565b505f5b603081101561379d5784608001518181518110613754576137546140dc565b01602001516001600160f81b0319168261376f83604e6140f0565b8151811061377f5761377f6140dc565b60200101906001600160f81b03191690815f1a905350600101613735565b505f5b600881101561380f576137b48160076140c9565b6137bf906008613f55565b60608601516001600160401b0390811691161c60f81b826137e183607e6140f0565b815181106137f1576137f16140dc565b60200101906001600160f81b03191690815f1a9053506001016137a0565b506002816040516138209190614261565b602060405180830381855afa15801561383b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061385e9190613e02565b94909350915050565b61386f612fde565b6138776138e3565b61387f6138f3565b611213816138fb565b613890612fde565b5f5f8051602061429d833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6138eb612fde565b613027613967565b613027612fde565b613903612fde565b80355f805160206142dd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561394d606083016040840161427c565b600291909101805460ff191660ff90921691909117905550565b6134af612fde565b50805461397b90613c72565b5f825580601f1061398a575050565b601f0160209004905f5260205f209081019061121391906139ea565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156139fe575f81556001016139eb565b5090565b5f60e08284031215613a12575f80fd5b50919050565b8015158114611213575f80fd5b803563ffffffff81168114613a38575f80fd5b919050565b5f805f60608486031215613a4f575f80fd5b833592506020840135613a6181613a18565b9150613a6f60408501613a25565b90509250925092565b5f60208284031215613a88575f80fd5b5035919050565b5f60208284031215613a9f575f80fd5b6111fb82613a25565b5f8060408385031215613ab9575f80fd5b613ac283613a25565b946020939093013593505050565b80356001600160401b0381168114613a38575f80fd5b5f60208284031215613af6575f80fd5b6111fb82613ad0565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613b3557613b35613aff565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613b6357613b63613aff565b604052919050565b5f6001600160401b03821115613b8357613b83613aff565b50601f01601f191660200190565b5f805f60608486031215613ba3575f80fd5b83359250613bb360208501613ad0565b915060408401356001600160401b03811115613bcd575f80fd5b8401601f81018613613bdd575f80fd5b8035613bf0613beb82613b6b565b613b3b565b818152876020838501011115613c04575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613c6b57613c6b613c37565b5092915050565b600181811c90821680613c8657607f821691505b602082108103613a1257634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613cc95750805b601f840160051c820191505b81811015613ce8575f8155600101613cd5565b5050505050565b81516001600160401b03811115613d0857613d08613aff565b613d1c81613d168454613c72565b84613ca4565b602080601f831160018114613d4f575f8415613d385750858301515b5f19600386901b1c1916600185901b178555613da6565b5f85815260208120601f198616915b82811015613d7d57888601518255948401946001909101908401613d5e565b5085821015613d9a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613dc8578181015183820152602001613db0565b50505f910152565b602081525f8251806020840152613dee816040850160208701613dae565b601f01601f19169190910160400192915050565b5f60208284031215613e12575f80fd5b5051919050565b5f60208083525f8454613e2b81613c72565b806020870152604060018084165f8114613e4c5760018114613e6857613e95565b60ff19851660408a0152604084151560051b8a01019550613e95565b895f5260205f205f5b85811015613e8c5781548b8201860152908301908801613e71565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613ec557613ec5613ea3565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613c37565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611213575f80fd5b8051613a3881613a18565b5f8060408385031215613fe3575f80fd5b82516001600160401b0380821115613ff9575f80fd5b908401906060828703121561400c575f80fd5b614014613b13565b8251815260208084015161402781613fb3565b8282015260408401518381111561403c575f80fd5b80850194505087601f850112614050575f80fd5b83519250614060613beb84613b6b565b8381528882858701011115614073575f80fd5b61408284838301848801613dae565b80604084015250819550614097818801613fc7565b9450505050509250929050565b5f6001600160401b038083168181036140bf576140bf613c37565b6001019392505050565b81810381811115610acf57610acf613c37565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613c37565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613c6b57613c6b613c37565b5f60208284031215614206575f80fd5b81356111fb81613fb3565b6001600160401b0381811683821602808216919082811461423457614234613c37565b505092915050565b5f6001600160401b038084168061425557614255613ea3565b92169190910492915050565b5f8251614272818460208701613dae565b9190910192915050565b5f6020828403121561428c575f80fd5b813560ff811681146111fb575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161452538038061452583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143d88061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613a91565b610389565b005b348015610134575f80fd5b50610127610143366004613acc565b61046b565b348015610153575f80fd5b50610127610162366004613b07565b6108f6565b348015610172575f80fd5b506101b1610181366004613b07565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613b07565b610a52565b3480156101ee575f80fd5b506102026101fd366004613b07565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613b1e565b610ad5565b348015610244575f80fd5b50610127610253366004613b37565b610b00565b348015610263575f80fd5b506101b1610272366004613b75565b610cf1565b348015610282575f80fd5b50610202610291366004613b07565b610d0a565b3480156102a1575f80fd5b506101276102b0366004613b07565b610d1e565b3480156102c0575f80fd5b506101276102cf366004613acc565b610d8b565b3480156102df575f80fd5b506101276102ee366004613b37565b610da6565b3480156102fe575f80fd5b5061012761030d366004613b1e565b610fd5565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613b07565b611192565b6101b1610371366004613b07565b611261565b6101b1610384366004613c20565b61126d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611291565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061432c8339815191529184156104bd576104ba82856112a5565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613cb2565b600481111561050057610500613cb2565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613cb2565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f8051602061434c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f8051602061434c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f61064884611541565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613cb2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610767856115b5565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613cda565b90506107ff8682611694565b5f61080b8785846116dc565b5f8c815260058a01602052604090209091506108278282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613e5f565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613e91565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061436c83398151915292919061093e90613d01565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613cb2565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613ea8565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613e91565b505050565b610a5b816118f9565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061432c833981519152916005600160991b019163ee5b48eb91610a0d91600401613ea8565b5f610acf64e8d4a5100083613f46565b92915050565b5f610adf826119c8565b9050610afc81606001516001600160401b03168260400151611d55565b5050565b5f8051602061432c8339815191525f610b1884611d68565b90505f80610b298360400151611f49565b5091509150610b3785612184565b5f8581526004850160205260408120610b4f916139fe565b5f610b59836115b5565b9050816001600160401b031681608001516001600160401b03161015610b915760405162461bcd60e51b81526004016105d090613f59565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bd65760405162461bcd60e51b81526004016105d090613f9b565b60015f87815260038701602052604090205460ff166004811115610bfc57610bfc613cb2565b14610c655760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000613fe4565b5f610d14826115b5565b60a0015192915050565b610d2781612184565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061432c833981519152916005600160991b019163ee5b48eb91610a0d91600401613ea8565b8115610d9d57610d9b83826112a5565b505b610a4d8361225d565b5f8051602061432c8339815191525f610dbe84611d68565b90505f80610dcf8360400151611f49565b5091509150610ddd856118f9565b5f8581526005850160205260408120610df5916139fe565b5f610dff836115b5565b9050816001600160401b031681608001516001600160401b03161015610e375760405162461bcd60e51b81526004016105d090613f59565b5f8681526003808701602052604090912001546001600160401b0380841691161115610e755760405162461bcd60e51b81526004016105d090613f9b565b60035f87815260038701602052604090205460ff166004811115610e9b57610e9b613cb2565b14610eef5760405162461bcd60e51b815260206004820152603160248201525f8051602061434c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f939190611d55565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061436c8339815191525f610fed83611d68565b90505f80610ffe8360400151612615565b91509150806110605760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f8281526005850160205260408120805461107a90613d01565b90501180156110ac575060015f83815260078601602052604090205460ff1660058111156110aa576110aa613cb2565b145b6110c85760405162461bcd60e51b81526004016105d090613ffb565b5f82815260058501602052604081206110e0916139fe565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061436c8339815191529291906111da90613d01565b905011801561120c575060015f83815260078301602052604090205460ff16600581111561120a5761120a613cb2565b145b6112285760405162461bcd60e51b81526004016105d090613ffb565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613ea8565b5f610acf8233346127b6565b5f8061127834612b6e565b905061128685828686612c18565b9150505b9392505050565b61129961306d565b6112a2816130b8565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112f0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113179190810190614061565b915091508061137a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e19190613e91565b8251146114455760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b0316156114bb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f806114ca84604001516130fb565b915091508187146115375760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f805160206143ac8339815191526020526040812060030180545f8051602061436c833981519152916001600160401b039091169081908461158683614133565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115bd613a35565b5f8281525f805160206143ac8339815191526020526040908190208151610100810190925280545f8051602061436c833981519152929190829060ff16600581111561160b5761160b613cb2565b600581111561161c5761161c613cb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206143ac833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561175557611715816001614158565b611720906008613fe4565b5081515f908390839081106117375761173761416b565b60200101906001600160f81b03191690815f1a905350600101611701565b505f5b60048110156117b85761176c816003614158565b611777906008613fe4565b6001901c60f81b8261178a83600261417f565b8151811061179a5761179a61416b565b60200101906001600160f81b03191690815f1a905350600101611758565b505f5b602081101561181a576117cf81601f614158565b6117da906008613fe4565b86901c60f81b826117ec83600661417f565b815181106117fc576117fc61416b565b60200101906001600160f81b03191690815f1a9053506001016117bb565b505f5b600881101561188557611831816007614158565b61183c906008613fe4565b6001600160401b038616901c60f81b8261185783602661417f565b815181106118675761186761416b565b60200101906001600160f81b03191690815f1a90535060010161181d565b505f5b60088110156118f05761189c816007614158565b6118a7906008613fe4565b6001600160401b038516901c60f81b826118c283602e61417f565b815181106118d2576118d261416b565b60200101906001600160f81b03191690815f1a905350600101611888565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061432c83398151915292919061194190613d01565b9050118015611973575060035f83815260038301602052604090205460ff16600481111561197157611971613cb2565b145b610afc5760405162461bcd60e51b815260206004820152603360248201525f8051602061434c83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b6119d0613a35565b5f8051602061436c8339815191525f6119e884611d68565b90505f806119f98360400151612615565b915091508015611a5e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611a9057611a90613cb2565b6005811115611aa157611aa1613cb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b2857611b28613cb2565b1480611b465750600182516005811115611b4457611b44613cb2565b145b611ba55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611bba57611bba613cb2565b03611be157505f8381526006860160205260408120600491611bdc91906139fe565b611be5565b5060055b6020808301515f90815260088801909152604081205581816005811115611c0e57611c0e613cb2565b90816005811115611c2157611c21613cb2565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611c5557611c55613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d2057611d20613cb2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610afc6001600160a01b038216836132d3565b60408051606080820183525f8083526020830181905292820152905f8051602061436c8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ddd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e049190810190614061565b9150915080611e6b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611ece5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611f415760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f8351603614611f6d5760405162461bcd60e51b81526004016105d090614192565b5f805b6002811015611fbc57611f84816001614158565b611f8f906008613fe4565b61ffff16868281518110611fa557611fa561416b565b016020015160f81c901b9190911790600101611f70565b5061ffff811615611fdf5760405162461bcd60e51b81526004016105d0906141db565b5f805b600481101561203a57611ff6816003614158565b612001906008613fe4565b63ffffffff168761201383600261417f565b815181106120235761202361416b565b016020015160f81c901b9190911790600101611fe2565b5063ffffffff81166003146120615760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156120b65761207881601f614158565b612083906008613fe4565b8861208f83600661417f565b8151811061209f5761209f61416b565b016020015160f81c901b9190911790600101612064565b505f805b6008811015612115576120ce816007614158565b6120d9906008613fe4565b6001600160401b0316896120ee83602661417f565b815181106120fe576120fe61416b565b016020015160f81c901b91909117906001016120ba565b505f805b60088110156121745761212d816007614158565b612138906008613fe4565b6001600160401b03168a61214d83602e61417f565b8151811061215d5761215d61416b565b016020015160f81c901b9190911790600101612119565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061432c8339815191529291906121cc90613d01565b90501180156121fe575060015f83815260038301602052604090205460ff1660048111156121fc576121fc613cb2565b145b610afc5760405162461bcd60e51b815260206004820152603860248201525f8051602061434c83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f805160206143ac83398151915260205260408082208151610100810190925280545f8051602061436c83398151915293929190829060ff1660058111156122ab576122ab613cb2565b60058111156122bc576122bc613cb2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561234457612344613cb2565b146123a05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461241a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6124278160a00151613366565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561246b5761246b613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125378461253181611541565b5f6116dc565b5f85815260068501602052604090209091506125538282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612580908590600401613e5f565b6020604051808303815f875af115801561259c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c09190613e91565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146126385760405162461bcd60e51b81526004016105d090614192565b5f805b60028110156126875761264f816001614158565b61265a906008613fe4565b61ffff168582815181106126705761267061416b565b016020015160f81c901b919091179060010161263b565b5061ffff8116156126aa5760405162461bcd60e51b81526004016105d0906141db565b5f805b6004811015612705576126c1816003614158565b6126cc906008613fe4565b63ffffffff16866126de83600261417f565b815181106126ee576126ee61416b565b016020015160f81c901b91909117906001016126ad565b5063ffffffff811660021461272c5760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156127815761274381601f614158565b61274e906008613fe4565b8761275a83600661417f565b8151811061276a5761276a61416b565b016020015160f81c901b919091179060010161272f565b505f866026815181106127965761279661416b565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127bf613507565b5f6127c983610abf565b90505f8051602061432c8339815191525f6127e3876115b5565b90506002815160058111156127fa576127fa613cb2565b146128595760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a0015161286a9190614265565b90506128768882611694565b5f61288089611541565b90505f8989836040516020016128c89392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090506128e986613366565b5f6128f58b84866116dc565b5f83815260048801602052604090209091506129118282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061293e908590600401613e5f565b6020604051808303815f875af115801561295a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297e9190613e91565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a2d57612a2d613cb2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061128a60015f8051602061438c83398151915255565b5f5f8051602061432c8339815191528282612b8882610abf565b83549091506001600160401b03821610801590612bb257508260010154816001600160401b031611155b612c105760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612c21613507565b5f8051602061436c833981519152426001600160401b038516118015612c5b57506001600160401b038416612c59426202a30061417f565b115b612cbd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612d145760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612d825760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612de95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612df285613366565b5f80612e396040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613551565b5f82815260058601602052604090209193509150612e578282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e84908590600401613e5f565b6020604051808303815f875af1158015612ea0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ec49190613e91565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612f4657612f46613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561300783611541565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c1060015f8051602061438c83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130b657604051631afcd79f60e31b815260040160405180910390fd5b565b6130c061306d565b6130c9816138f6565b6112a2606082013560808301356130e660c0850160a08601613b75565b6130f660e0860160c08701614285565b613917565b5f808251602e1461311e5760405162461bcd60e51b81526004016105d090614192565b5f805b600281101561316d57613135816001614158565b613140906008613fe4565b61ffff168582815181106131565761315661416b565b016020015160f81c901b9190911790600101613121565b5061ffff8116156131905760405162461bcd60e51b81526004016105d0906141db565b5f805b60048110156131eb576131a7816003614158565b6131b2906008613fe4565b63ffffffff16866131c483600261417f565b815181106131d4576131d461416b565b016020015160f81c901b9190911790600101613193565b5063ffffffff81166004146132125760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156132675761322981601f614158565b613234906008613fe4565b8761324083600661417f565b815181106132505761325061416b565b016020015160f81c901b9190911790600101613215565b505f805b60088110156132c65761327f816007614158565b61328a906008613fe4565b6001600160401b03168861329f83602661417f565b815181106132af576132af61416b565b016020015160f81c901b919091179060010161326b565b5090969095509350505050565b804710156132f65760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461333f576040519150601f19603f3d011682016040523d82523d5f602084013e613344565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061436c8339815191529060ff165f036133a4575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133ec9083614158565b10613408576001600160401b0384166040830152808252613427565b838260400181815161341a9190614265565b6001600160401b03169052505b5f82602001518360400151606461343e91906142a0565b61344891906142cb565b600285015490915060ff90811690821611156134c35760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061438c83398151915280546001190161353857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061438c83398151915255565b5f60608260800151516030146135bb5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613632576135f2816001614158565b6135fd906008613fe4565b5081515f908390839081106136145761361461416b565b60200101906001600160f81b03191690815f1a9053506001016135de565b505f5b600481101561369057613649816003614158565b613654906008613fe4565b505f8261366283600261417f565b815181106136725761367261416b565b60200101906001600160f81b03191690815f1a905350600101613635565b505f5b60208110156136ed57845181602081106136af576136af61416b565b1a60f81b826136bf83600661417f565b815181106136cf576136cf61416b565b60200101906001600160f81b03191690815f1a905350600101613693565b505f5b602081101561374d578460200151816020811061370f5761370f61416b565b1a60f81b8261371f83602661417f565b8151811061372f5761372f61416b565b60200101906001600160f81b03191690815f1a9053506001016136f0565b505f5b60088110156137c157613764816007614158565b61376f906008613fe4565b60ff1685604001516001600160401b0316901c60f81b82826046613793919061417f565b815181106137a3576137a361416b565b60200101906001600160f81b03191690815f1a905350600101613750565b505f5b603081101561382c57846080015181815181106137e3576137e361416b565b01602001516001600160f81b031916826137fe83604e61417f565b8151811061380e5761380e61416b565b60200101906001600160f81b03191690815f1a9053506001016137c4565b505f5b600881101561389e57613843816007614158565b61384e906008613fe4565b60608601516001600160401b0390811691161c60f81b8261387083607e61417f565b815181106138805761388061416b565b60200101906001600160f81b03191690815f1a90535060010161382f565b506002816040516138af91906142f0565b602060405180830381855afa1580156138ca573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138ed9190613e91565b94909350915050565b6138fe61306d565b613906613972565b61390e613982565b6112a28161398a565b61391f61306d565b5f5f8051602061432c833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61397a61306d565b6130b66139f6565b6130b661306d565b61399261306d565b80355f8051602061436c83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139dc606083016040840161430b565b600291909101805460ff191660ff90921691909117905550565b61353e61306d565b508054613a0a90613d01565b5f825580601f10613a19575050565b601f0160209004905f5260205f20908101906112a29190613a79565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613a8d575f8155600101613a7a565b5090565b5f60e08284031215613aa1575f80fd5b50919050565b80151581146112a2575f80fd5b803563ffffffff81168114613ac7575f80fd5b919050565b5f805f60608486031215613ade575f80fd5b833592506020840135613af081613aa7565b9150613afe60408501613ab4565b90509250925092565b5f60208284031215613b17575f80fd5b5035919050565b5f60208284031215613b2e575f80fd5b61128a82613ab4565b5f8060408385031215613b48575f80fd5b613b5183613ab4565b946020939093013593505050565b80356001600160401b0381168114613ac7575f80fd5b5f60208284031215613b85575f80fd5b61128a82613b5f565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bc457613bc4613b8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613bf257613bf2613b8e565b604052919050565b5f6001600160401b03821115613c1257613c12613b8e565b50601f01601f191660200190565b5f805f60608486031215613c32575f80fd5b83359250613c4260208501613b5f565b915060408401356001600160401b03811115613c5c575f80fd5b8401601f81018613613c6c575f80fd5b8035613c7f613c7a82613bfa565b613bca565b818152876020838501011115613c93575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613cfa57613cfa613cc6565b5092915050565b600181811c90821680613d1557607f821691505b602082108103613aa157634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613d585750805b601f840160051c820191505b81811015613d77575f8155600101613d64565b5050505050565b81516001600160401b03811115613d9757613d97613b8e565b613dab81613da58454613d01565b84613d33565b602080601f831160018114613dde575f8415613dc75750858301515b5f19600386901b1c1916600185901b178555613e35565b5f85815260208120601f198616915b82811015613e0c57888601518255948401946001909101908401613ded565b5085821015613e2957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613e57578181015183820152602001613e3f565b50505f910152565b602081525f8251806020840152613e7d816040850160208701613e3d565b601f01601f19169190910160400192915050565b5f60208284031215613ea1575f80fd5b5051919050565b5f60208083525f8454613eba81613d01565b806020870152604060018084165f8114613edb5760018114613ef757613f24565b60ff19851660408a0152604084151560051b8a01019550613f24565b895f5260205f205f5b85811015613f1b5781548b8201860152908301908801613f00565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613f5457613f54613f32565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613cc6565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b03811681146112a2575f80fd5b8051613ac781613aa7565b5f8060408385031215614072575f80fd5b82516001600160401b0380821115614088575f80fd5b908401906060828703121561409b575f80fd5b6140a3613ba2565b825181526020808401516140b681614042565b828201526040840151838111156140cb575f80fd5b80850194505087601f8501126140df575f80fd5b835192506140ef613c7a84613bfa565b8381528882858701011115614102575f80fd5b61411184838301848801613e3d565b80604084015250819550614126818801614056565b9450505050509250929050565b5f6001600160401b0380831681810361414e5761414e613cc6565b6001019392505050565b81810381811115610acf57610acf613cc6565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613cc6565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613cfa57613cfa613cc6565b5f60208284031215614295575f80fd5b813561128a81614042565b6001600160401b038181168382160280821691908281146142c3576142c3613cc6565b505092915050565b5f6001600160401b03808416806142e4576142e4613f32565b92169190910492915050565b5f8251614301818460208701613e3d565b9190910192915050565b5f6020828403121561431b575f80fd5b813560ff8116811461128a575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 86f89df8a..20e61e03a 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -354,7 +354,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Update the delegator status $._delegatorStakes[delegationID].status = DelegatorStatus.Completed; - // TODO: Unlock the delegator's stake and their reward + Delegator memory delegator = $._delegatorStakes[delegationID]; + _unlock(delegator.weight, delegator.owner); + // TODO: issue rewards emit DelegationEnded(delegationID, validationID, nonce); } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 5f5c22f59..36b877a52 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -45,29 +45,6 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { posValidatorManager = app; } - function testCompleteEndValidation() public override { - bytes32 validationID = _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP - }); - - address validator = address(this); - - uint256 balanceBefore = token.balanceOf(validator); - - vm.expectCall(address(token), abi.encodeCall(IERC20.transfer, (validator, DEFAULT_WEIGHT))); - - _testCompleteEndValidation(validationID); - - uint256 balanceChange = token.balanceOf(validator) - balanceBefore; - require(balanceChange == DEFAULT_WEIGHT, "validator should have received their stake back"); - } - function _initializeValidatorRegistration( bytes32 nodeID, uint64 registrationExpiry, @@ -101,4 +78,12 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { token.safeIncreaseAllowance(address(app), value); vm.stopPrank(); } + + function _expectStakeUnlock(address account, uint256 amount) internal override { + vm.expectCall(address(token), abi.encodeCall(IERC20.transfer, (account, amount))); + } + + function _getStakeAssetBalance(address account) internal view override returns (uint256) { + return token.balanceOf(account); + } } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index af509d9ec..467ed85f8 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -37,28 +37,6 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { posValidatorManager = app; } - function testCompleteEndValidation() public override { - bytes32 validationID = _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP - }); - - uint256 balanceBefore = address(this).balance; - - // empty calldata implies the receive function will be called - vm.expectCall(address(this), DEFAULT_WEIGHT, ""); - - _testCompleteEndValidation(validationID); - - uint256 balanceChange = address(this).balance - balanceBefore; - require(balanceChange == DEFAULT_WEIGHT, "validator should have received their stake back"); - } - // Helpers function _initializeValidatorRegistration( bytes32 nodeID, @@ -85,6 +63,15 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function _beforeSend(uint64 weight, address spender) internal override { // Native tokens no need pre approve } + + function _expectStakeUnlock(address account, uint256 amount) internal override { + // empty calldata implies the receive function will be called + vm.expectCall(account, amount, ""); + } + + function _getStakeAssetBalance(address account) internal view override returns (uint256) { + return account.balance; + } } // TODO: Remove this once all unit tests implemented // solhint-enable no-empty-blocks diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 6dedd8b98..5e99fa2bc 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -403,7 +403,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 }); + + address delegator = DEFAULT_DELEGATOR_ADDRESS; + uint256 balanceBefore = _getStakeAssetBalance(delegator); + _expectStakeUnlock(delegator, DEFAULT_DELEGATOR_WEIGHT); + _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2); + + uint256 balanceChange = _getStakeAssetBalance(delegator) - balanceBefore; + require( + balanceChange >= DEFAULT_DELEGATOR_WEIGHT, + "delegator should have received their stake back" + ); } function testCompleteEndDelegationWrongNonce() public { @@ -546,6 +557,27 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpCompleteEndDelegation(validationID, delegationID1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); } + function testCompleteEndValidation() public override { + bytes32 validationID = _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + }); + + uint256 balanceBefore = _getStakeAssetBalance(address(this)); + + _expectStakeUnlock(address(this), DEFAULT_WEIGHT); + + _testCompleteEndValidation(validationID); + + uint256 balanceChange = _getStakeAssetBalance(address(this)) - balanceBefore; + require(balanceChange == DEFAULT_WEIGHT, "validator should have received their stake back"); + } + function testValueToWeight() public view { uint64 w1 = posValidatorManager.valueToWeight(1e12); uint64 w2 = posValidatorManager.valueToWeight(1e18); @@ -679,6 +711,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { return delegationID; } + function _getStakeAssetBalance(address account) internal virtual returns (uint256); + function _expectStakeUnlock(address account, uint256 amount) internal virtual; + function _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { return abi.encodePacked("PoSValidatorManager: ", errorMessage); } From c6c290d855ebb0ee4fc9219d80b7bd906c47967f Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 6 Sep 2024 13:33:01 +0000 Subject: [PATCH 232/545] `IERC20Mintable`, not `IERC20` --- .../go/mocks/ExampleERC20/ExampleERC20.go | 43 ++++++++++++++----- .../ERC20TokenStakingManager.go | 2 +- contracts/mocks/ExampleERC20.sol | 7 ++- .../staking/ERC20TokenStakingManager.sol | 17 +++++--- .../staking/interfaces/IERC20Mintable.sol | 12 ++++++ .../tests/ERC20TokenStakingManagerTests.t.sol | 5 ++- 6 files changed, 64 insertions(+), 22 deletions(-) create mode 100644 contracts/staking/interfaces/IERC20Mintable.sol diff --git a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go index bc7f00d16..fe803b2d1 100644 --- a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go +++ b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go @@ -31,8 +31,8 @@ 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\":\"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: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108328061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100b1575f3560e01c806370a082311161006e57806370a082311461013f57806379cc67901461016757806395d89b411461017a578063a0712d6814610182578063a9059cbb14610195578063dd62ed3e146101a8575f80fd5b806306fdde03146100b5578063095ea7b3146100d357806318160ddd146100f657806323b872dd14610108578063313ce5671461011b57806342966c681461012a575b5f80fd5b6100bd6101e0565b6040516100ca919061069e565b60405180910390f35b6100e66100e1366004610705565b610270565b60405190151581526020016100ca565b6002545b6040519081526020016100ca565b6100e661011636600461072d565b610289565b604051601281526020016100ca565b61013d610138366004610766565b6102ac565b005b6100fa61014d36600461077d565b6001600160a01b03165f9081526020819052604090205490565b61013d610175366004610705565b6102b9565b6100bd6102d2565b61013d610190366004610766565b6102e1565b6100e66101a3366004610705565b610347565b6100fa6101b636600461079d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6060600380546101ef906107ce565b80601f016020809104026020016040519081016040528092919081815260200182805461021b906107ce565b80156102665780601f1061023d57610100808354040283529160200191610266565b820191905f5260205f20905b81548152906001019060200180831161024957829003601f168201915b5050505050905090565b5f3361027d818585610354565b60019150505b92915050565b5f33610296858285610366565b6102a18585856103e1565b506001949350505050565b6102b6338261043e565b50565b6102c4823383610366565b6102ce828261043e565b5050565b6060600480546101ef906107ce565b662386f26fc1000081111561033d5760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b6102b63382610472565b5f3361027d8185856103e1565b61036183838360016104a6565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f1981146103db57818110156103cd57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610334565b6103db84848484035f6104a6565b50505050565b6001600160a01b03831661040a57604051634b637e8f60e11b81525f6004820152602401610334565b6001600160a01b0382166104335760405163ec442f0560e01b81525f6004820152602401610334565b610361838383610578565b6001600160a01b03821661046757604051634b637e8f60e11b81525f6004820152602401610334565b6102ce825f83610578565b6001600160a01b03821661049b5760405163ec442f0560e01b81525f6004820152602401610334565b6102ce5f8383610578565b6001600160a01b0384166104cf5760405163e602df0560e01b81525f6004820152602401610334565b6001600160a01b0383166104f857604051634a1406b160e11b81525f6004820152602401610334565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156103db57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161056a91815260200190565b60405180910390a350505050565b6001600160a01b0383166105a2578060025f8282546105979190610806565b909155506106129050565b6001600160a01b0383165f90815260208190526040902054818110156105f45760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610334565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661062e5760028054829003905561064c565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161069191815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b818110156106ca578581018301518582016040015282016106ae565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610700575f80fd5b919050565b5f8060408385031215610716575f80fd5b61071f836106ea565b946020939093013593505050565b5f805f6060848603121561073f575f80fd5b610748846106ea565b9250610756602085016106ea565b9150604084013590509250925092565b5f60208284031215610776575f80fd5b5035919050565b5f6020828403121561078d575f80fd5b610796826106ea565b9392505050565b5f80604083850312156107ae575f80fd5b6107b7836106ea565b91506107c5602084016106ea565b90509250929050565b600181811c908216806107e257607f821691505b60208210810361080057634e487b7160e01b5f52602260045260245ffd5b50919050565b8082018082111561028357634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", + 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: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108698061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101a7578063a0712d68146101af578063a9059cbb146101c2578063dd62ed3e146101d5575f80fd5b806342966c681461015957806370a082311461016c57806379cc679014610194575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce5671461013557806340c10f1914610144575b5f80fd5b6100d761020d565b6040516100e491906106d5565b60405180910390f35b6101006100fb36600461073c565b61029d565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b610100610130366004610764565b6102b6565b604051601281526020016100e4565b61015761015236600461073c565b6102d9565b005b61015761016736600461079d565b6102e7565b61011461017a3660046107b4565b6001600160a01b03165f9081526020819052604090205490565b6101576101a236600461073c565b6102f4565b6100d7610309565b6101576101bd36600461079d565b610318565b6101006101d036600461073c565b61037e565b6101146101e33660046107d4565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021c90610805565b80601f016020809104026020016040519081016040528092919081815260200182805461024890610805565b80156102935780601f1061026a57610100808354040283529160200191610293565b820191905f5260205f20905b81548152906001019060200180831161027657829003601f168201915b5050505050905090565b5f336102aa81858561038b565b60019150505b92915050565b5f336102c385828561039d565b6102ce858585610418565b506001949350505050565b6102e38282610475565b5050565b6102f133826104a9565b50565b6102ff82338361039d565b6102e382826104a9565b60606004805461021c90610805565b662386f26fc100008111156103745760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b6102f13382610475565b5f336102aa818585610418565b61039883838360016104dd565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610412578181101561040457604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161036b565b61041284848484035f6104dd565b50505050565b6001600160a01b03831661044157604051634b637e8f60e11b81525f600482015260240161036b565b6001600160a01b03821661046a5760405163ec442f0560e01b81525f600482015260240161036b565b6103988383836105af565b6001600160a01b03821661049e5760405163ec442f0560e01b81525f600482015260240161036b565b6102e35f83836105af565b6001600160a01b0382166104d257604051634b637e8f60e11b81525f600482015260240161036b565b6102e3825f836105af565b6001600160a01b0384166105065760405163e602df0560e01b81525f600482015260240161036b565b6001600160a01b03831661052f57604051634a1406b160e11b81525f600482015260240161036b565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561041257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a191815260200190565b60405180910390a350505050565b6001600160a01b0383166105d9578060025f8282546105ce919061083d565b909155506106499050565b6001600160a01b0383165f908152602081905260409020548181101561062b5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161036b565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661066557600280548290039055610683565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106c891815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b81811015610701578581018301518582016040015282016106e5565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610737575f80fd5b919050565b5f806040838503121561074d575f80fd5b61075683610721565b946020939093013593505050565b5f805f60608486031215610776575f80fd5b61077f84610721565b925061078d60208501610721565b9150604084013590509250925092565b5f602082840312156107ad575f80fd5b5035919050565b5f602082840312156107c4575f80fd5b6107cd82610721565b9392505050565b5f80604083850312156107e5575f80fd5b6107ee83610721565b91506107fc60208401610721565b90509250929050565b600181811c9082168061081957607f821691505b60208210810361083757634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102b057634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", } // ExampleERC20ABI is the input ABI used to generate the binding from. @@ -451,25 +451,46 @@ func (_ExampleERC20 *ExampleERC20TransactorSession) BurnFrom(account common.Addr return _ExampleERC20.Contract.BurnFrom(&_ExampleERC20.TransactOpts, account, value) } -// Mint is a paid mutator transaction binding the contract method 0xa0712d68. +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_ExampleERC20 *ExampleERC20Transactor) Mint(opts *bind.TransactOpts, account common.Address, amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.contract.Transact(opts, "mint", account, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_ExampleERC20 *ExampleERC20Session) Mint(account common.Address, amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.Contract.Mint(&_ExampleERC20.TransactOpts, account, amount) +} + +// Mint is a paid mutator transaction binding the contract method 0x40c10f19. +// +// Solidity: function mint(address account, uint256 amount) returns() +func (_ExampleERC20 *ExampleERC20TransactorSession) Mint(account common.Address, amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.Contract.Mint(&_ExampleERC20.TransactOpts, account, amount) +} + +// Mint0 is a paid mutator transaction binding the contract method 0xa0712d68. // // Solidity: function mint(uint256 amount) returns() -func (_ExampleERC20 *ExampleERC20Transactor) Mint(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { - return _ExampleERC20.contract.Transact(opts, "mint", amount) +func (_ExampleERC20 *ExampleERC20Transactor) Mint0(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.contract.Transact(opts, "mint0", amount) } -// Mint is a paid mutator transaction binding the contract method 0xa0712d68. +// Mint0 is a paid mutator transaction binding the contract method 0xa0712d68. // // Solidity: function mint(uint256 amount) returns() -func (_ExampleERC20 *ExampleERC20Session) Mint(amount *big.Int) (*types.Transaction, error) { - return _ExampleERC20.Contract.Mint(&_ExampleERC20.TransactOpts, amount) +func (_ExampleERC20 *ExampleERC20Session) Mint0(amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.Contract.Mint0(&_ExampleERC20.TransactOpts, amount) } -// Mint is a paid mutator transaction binding the contract method 0xa0712d68. +// Mint0 is a paid mutator transaction binding the contract method 0xa0712d68. // // Solidity: function mint(uint256 amount) returns() -func (_ExampleERC20 *ExampleERC20TransactorSession) Mint(amount *big.Int) (*types.Transaction, error) { - return _ExampleERC20.Contract.Mint(&_ExampleERC20.TransactOpts, amount) +func (_ExampleERC20 *ExampleERC20TransactorSession) Mint0(amount *big.Int) (*types.Transaction, error) { + return _ExampleERC20.Contract.Mint0(&_ExampleERC20.TransactOpts, amount) } // Transfer is a paid mutator transaction binding the contract method 0xa9059cbb. diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 18d5f149c..6c1c39fa8 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -47,7 +47,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", Bin: "0x608060405234801561000f575f80fd5b506040516148f43803806148f483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147a78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613e13565b6102d6565b005b610128610138366004613e4e565b610761565b61017b61014b366004613e4e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613e4e565b6108bd565b6101286101af366004613e79565b61092a565b6101c76101c2366004613e4e565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613eb6565b610a24565b610128610200366004613ecf565b610a4f565b61017b610213366004613f0d565b610c40565b6101c7610226366004613e4e565b610c59565b610128610239366004613e4e565b610c6d565b61012861024c366004613e13565b610cda565b61017b61025f366004613fb8565b610cf5565b610128610272366004613ecf565b610d1a565b61017b610285366004614054565b610f49565b610128610298366004613eb6565b610f5c565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613e4e565b611119565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206146fb8339815191529184156103285761032582856111e8565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614074565b600481111561036b5761036b614074565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614074565b146104445760405162461bcd60e51b815260206004820152602a60248201525f8051602061471b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f8051602061471b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611484565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500614074565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856114f8565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e919061409c565b905061066a86826115d7565b5f61067687858461161f565b5f8c815260058a01602052604090209091506106928282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614227565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190614259565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061473b8339815191529291906107a9906140c3565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9614074565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b89190614259565b505050565b6108c68161183c565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc848461190b565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361430e565b92915050565b5f610a2e82611925565b9050610a4b81606001516001600160401b03168260400151611cb2565b5050565b5f805160206146fb8339815191525f610a6784611ce8565b90505f80610a788360400151611ec9565b5091509150610a8685612104565b5f8581526004850160205260408120610a9e91613d5b565b5f610aa8836114f8565b9050816001600160401b031681608001516001600160401b03161015610ae05760405162461bcd60e51b815260040161043b90614321565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b255760405162461bcd60e51b815260040161043b90614363565b60015f87815260038701602052604090205460ff166004811115610b4b57610b4b614074565b14610bb45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a510006143ac565b5f610c63826114f8565b60a0015192915050565b610c7681612104565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b8115610cec57610cea83826111e8565b505b6108b8836121dd565b5f80610d0086612595565b9050610d0e85828686612642565b9150505b949350505050565b5f805160206146fb8339815191525f610d3284611ce8565b90505f80610d438360400151611ec9565b5091509150610d518561183c565b5f8581526005850160205260408120610d6991613d5b565b5f610d73836114f8565b9050816001600160401b031681608001516001600160401b03161015610dab5760405162461bcd60e51b815260040161043b90614321565b5f8681526003808701602052604090912001546001600160401b0380841691161115610de95760405162461bcd60e51b815260040161043b90614363565b60035f87815260038701602052604090205460ff166004811115610e0f57610e0f614074565b14610e635760405162461bcd60e51b815260206004820152603160248201525f8051602061471b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f079190611cb2565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f55833384612a97565b9392505050565b5f8051602061473b8339815191525f610f7483611ce8565b90505f80610f858360400151612e52565b9150915080610fe75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260058501602052604081208054611001906140c3565b9050118015611033575060015f83815260078601602052604090205460ff16600581111561103157611031614074565b145b61104f5760405162461bcd60e51b815260040161043b906143c3565b5f828152600585016020526040812061106791613d5b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061473b833981519152929190611161906140c3565b9050118015611193575060015f83815260078301602052604090205460ff16600581111561119157611191614074565b145b6111af5760405162461bcd60e51b815260040161043b906143c3565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611233573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261125a9190810190614415565b91509150806112bd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611300573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113249190614259565b8251146113885760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156113fe5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061140d8460400151612ff3565b9150915081871461147a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f8051602061477b8339815191526020526040812060030180545f8051602061473b833981519152916001600160401b03909116908190846114c9836144e7565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611500613d92565b5f8281525f8051602061477b8339815191526020526040908190208151610100810190925280545f8051602061473b833981519152929190829060ff16600581111561154e5761154e614074565b600581111561155f5761155f614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061477b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116985761165881600161450c565b6116639060086143ac565b5081515f9083908390811061167a5761167a61451f565b60200101906001600160f81b03191690815f1a905350600101611644565b505f5b60048110156116fb576116af81600361450c565b6116ba9060086143ac565b6001901c60f81b826116cd836002614533565b815181106116dd576116dd61451f565b60200101906001600160f81b03191690815f1a90535060010161169b565b505f5b602081101561175d5761171281601f61450c565b61171d9060086143ac565b86901c60f81b8261172f836006614533565b8151811061173f5761173f61451f565b60200101906001600160f81b03191690815f1a9053506001016116fe565b505f5b60088110156117c85761177481600761450c565b61177f9060086143ac565b6001600160401b038616901c60f81b8261179a836026614533565b815181106117aa576117aa61451f565b60200101906001600160f81b03191690815f1a905350600101611760565b505f5b6008811015611833576117df81600761450c565b6117ea9060086143ac565b6001600160401b038516901c60f81b8261180583602e614533565b815181106118155761181561451f565b60200101906001600160f81b03191690815f1a9053506001016117cb565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206146fb833981519152929190611884906140c3565b90501180156118b6575060035f83815260038301602052604090205460ff1660048111156118b4576118b4614074565b145b610a4b5760405162461bcd60e51b815260206004820152603360248201525f8051602061471b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b6119136131cb565b61191c82613216565b610a4b8161325c565b61192d613d92565b5f8051602061473b8339815191525f61194584611ce8565b90505f806119568360400151612e52565b9150915080156119bb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff1660058111156119ed576119ed614074565b60058111156119fe576119fe614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8557611a85614074565b1480611aa35750600182516005811115611aa157611aa1614074565b145b611b025760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1757611b17614074565b03611b3e57505f8381526006860160205260408120600491611b399190613d5b565b611b42565b5060055b6020808301515f90815260088801909152604081205581816005811115611b6b57611b6b614074565b90816005811115611b7e57611b7e614074565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611bb257611bb2614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c7d57611c7d614074565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a4b906001600160a01b03168284613310565b60408051606080820183525f8083526020830181905292820152905f8051602061473b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d849190810190614415565b9150915080611deb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e4e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ec15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611eed5760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015611f3c57611f0481600161450c565b611f0f9060086143ac565b61ffff16868281518110611f2557611f2561451f565b016020015160f81c901b9190911790600101611ef0565b5061ffff811615611f5f5760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015611fba57611f7681600361450c565b611f819060086143ac565b63ffffffff1687611f93836002614533565b81518110611fa357611fa361451f565b016020015160f81c901b9190911790600101611f62565b5063ffffffff8116600314611fe15760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561203657611ff881601f61450c565b6120039060086143ac565b8861200f836006614533565b8151811061201f5761201f61451f565b016020015160f81c901b9190911790600101611fe4565b505f805b60088110156120955761204e81600761450c565b6120599060086143ac565b6001600160401b03168961206e836026614533565b8151811061207e5761207e61451f565b016020015160f81c901b919091179060010161203a565b505f805b60088110156120f4576120ad81600761450c565b6120b89060086143ac565b6001600160401b03168a6120cd83602e614533565b815181106120dd576120dd61451f565b016020015160f81c901b9190911790600101612099565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206146fb83398151915292919061214c906140c3565b905011801561217e575060015f83815260038301602052604090205460ff16600481111561217c5761217c614074565b145b610a4b5760405162461bcd60e51b815260206004820152603860248201525f8051602061471b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061477b83398151915260205260408082208151610100810190925280545f8051602061473b83398151915293929190829060ff16600581111561222b5761222b614074565b600581111561223c5761223c614074565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122c4576122c4614074565b146123205760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461239a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123a78160a0015161336f565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123eb576123eb614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124b7846124b181611484565b5f61161f565b5f85815260068501602052604090209091506124d38282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612500908590600401614227565b6020604051808303815f875af115801561251c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125409190614259565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146fb833981519152816125ae84613510565b90505f6125ba82610a0e565b83549091506001600160401b038216108015906125e457508260010154816001600160401b031611155b610d125760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61264b613546565b5f8051602061473b833981519152426001600160401b03851611801561268557506001600160401b038416612683426202a300614533565b115b6126e75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b8561273e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600882016020526040902054156127ac5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b61281c8561336f565b5f806128636040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061357d565b5f828152600586016020526040902091935091506128818282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128ae908590600401614227565b6020604051808303815f875af11580156128ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ee9190614259565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561297057612970614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612a3183611484565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1260015f8051602061475b83398151915255565b5f612aa0613546565b5f612aad6101c284613510565b90505f805160206146fb8339815191525f612ac7876114f8565b9050600281516005811115612ade57612ade614074565b14612b3d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612b4e9190614619565b9050612b5a88826115d7565b5f612b6489611484565b90505f898983604051602001612bac9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612bcd8661336f565b5f612bd98b848661161f565b5f8381526004880160205260409020909150612bf58282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c22908590600401614227565b6020604051808303815f875af1158015612c3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c629190614259565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d1157612d11614074565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610f5560015f8051602061475b83398151915255565b5f808251602714612e755760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015612ec457612e8c81600161450c565b612e979060086143ac565b61ffff16858281518110612ead57612ead61451f565b016020015160f81c901b9190911790600101612e78565b5061ffff811615612ee75760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015612f4257612efe81600361450c565b612f099060086143ac565b63ffffffff1686612f1b836002614533565b81518110612f2b57612f2b61451f565b016020015160f81c901b9190911790600101612eea565b5063ffffffff8116600214612f695760405162461bcd60e51b815260040161043b906145d2565b5f805b6020811015612fbe57612f8081601f61450c565b612f8b9060086143ac565b87612f97836006614533565b81518110612fa757612fa761451f565b016020015160f81c901b9190911790600101612f6c565b505f86602681518110612fd357612fd361451f565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146130165760405162461bcd60e51b815260040161043b90614546565b5f805b60028110156130655761302d81600161450c565b6130389060086143ac565b61ffff1685828151811061304e5761304e61451f565b016020015160f81c901b9190911790600101613019565b5061ffff8116156130885760405162461bcd60e51b815260040161043b9061458f565b5f805b60048110156130e35761309f81600361450c565b6130aa9060086143ac565b63ffffffff16866130bc836002614533565b815181106130cc576130cc61451f565b016020015160f81c901b919091179060010161308b565b5063ffffffff811660041461310a5760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561315f5761312181601f61450c565b61312c9060086143ac565b87613138836006614533565b815181106131485761314861451f565b016020015160f81c901b919091179060010161310d565b505f805b60088110156131be5761317781600761450c565b6131829060086143ac565b6001600160401b031688613197836026614533565b815181106131a7576131a761451f565b016020015160f81c901b9190911790600101613163565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661321457604051631afcd79f60e31b815260040160405180910390fd5b565b61321e6131cb565b61322781613935565b6132596060820135608083013561324460c0850160a08601613f0d565b61325460e0860160c08701614639565b613956565b50565b6132646131cb565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132f05760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506139b1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061473b8339815191529060ff165f036133ad575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133f5908361450c565b10613411576001600160401b0384166040830152808252613430565b83826040018181516134239190614619565b6001600160401b03169052505b5f8260200151836040015160646134479190614654565b613451919061467f565b600285015490915060ff90811690821611156134cc5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a12565b5f8051602061475b83398151915280546001190161357757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135e75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561365e5761361e81600161450c565b6136299060086143ac565b5081515f908390839081106136405761364061451f565b60200101906001600160f81b03191690815f1a90535060010161360a565b505f5b60048110156136bc5761367581600361450c565b6136809060086143ac565b505f8261368e836002614533565b8151811061369e5761369e61451f565b60200101906001600160f81b03191690815f1a905350600101613661565b505f5b602081101561371957845181602081106136db576136db61451f565b1a60f81b826136eb836006614533565b815181106136fb576136fb61451f565b60200101906001600160f81b03191690815f1a9053506001016136bf565b505f5b6020811015613779578460200151816020811061373b5761373b61451f565b1a60f81b8261374b836026614533565b8151811061375b5761375b61451f565b60200101906001600160f81b03191690815f1a90535060010161371c565b505f5b60088110156137ed5761379081600761450c565b61379b9060086143ac565b60ff1685604001516001600160401b0316901c60f81b828260466137bf9190614533565b815181106137cf576137cf61451f565b60200101906001600160f81b03191690815f1a90535060010161377c565b505f5b6030811015613858578460800151818151811061380f5761380f61451f565b01602001516001600160f81b0319168261382a83604e614533565b8151811061383a5761383a61451f565b60200101906001600160f81b03191690815f1a9053506001016137f0565b505f5b60088110156138ca5761386f81600761450c565b61387a9060086143ac565b60608601516001600160401b0390811691161c60f81b8261389c83607e614533565b815181106138ac576138ac61451f565b60200101906001600160f81b03191690815f1a90535060010161385b565b506002816040516138db91906146a4565b602060405180830381855afa1580156138f6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139199190614259565b94909350915050565b60015f8051602061475b83398151915255565b61393d6131cb565b613945613b74565b61394d613b84565b61325981613b8c565b61395e6131cb565b5f5f805160206146fb833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f6139c56001600160a01b03841683613bf8565b905080515f141580156139e95750808060200190518101906139e791906146bf565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a7c9190614259565b9050613a936001600160a01b038516333086613c05565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ad7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afb9190614259565b9050818111613b615760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613b6b828261450c565b95945050505050565b613b7c6131cb565b613214613c44565b6132146131cb565b613b946131cb565b80355f8051602061473b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bde60608301604084016146da565b600291909101805460ff191660ff90921691909117905550565b6060610f5583835f613c4c565b6040516001600160a01b038481166024830152838116604483015260648201839052613c3e9186918216906323b872dd9060840161333d565b50505050565b6139226131cb565b606081471015613c715760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613c8c91906146a4565b5f6040518083038185875af1925050503d805f8114613cc6576040519150601f19603f3d011682016040523d82523d5f602084013e613ccb565b606091505b509150915061147a868383606082613ceb57613ce682613d32565b610f55565b8151158015613d0257506001600160a01b0384163b155b15613d2b57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610f55565b805115613d425780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d67906140c3565b5f825580601f10613d76575050565b601f0160209004905f5260205f20908101906132599190613dd6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613dea575f8155600101613dd7565b5090565b8015158114613259575f80fd5b803563ffffffff81168114613e0e575f80fd5b919050565b5f805f60608486031215613e25575f80fd5b833592506020840135613e3781613dee565b9150613e4560408501613dfb565b90509250925092565b5f60208284031215613e5e575f80fd5b5035919050565b6001600160a01b0381168114613259575f80fd5b5f80828403610100811215613e8c575f80fd5b60e0811215613e99575f80fd5b5082915060e0830135613eab81613e65565b809150509250929050565b5f60208284031215613ec6575f80fd5b610f5582613dfb565b5f8060408385031215613ee0575f80fd5b613ee983613dfb565b946020939093013593505050565b80356001600160401b0381168114613e0e575f80fd5b5f60208284031215613f1d575f80fd5b610f5582613ef7565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613f5c57613f5c613f26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f8a57613f8a613f26565b604052919050565b5f6001600160401b03821115613faa57613faa613f26565b50601f01601f191660200190565b5f805f8060808587031215613fcb575f80fd5b8435935060208501359250613fe260408601613ef7565b915060608501356001600160401b03811115613ffc575f80fd5b8501601f8101871361400c575f80fd5b803561401f61401a82613f92565b613f62565b818152886020838501011115614033575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215614065575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140bc576140bc614088565b5092915050565b600181811c908216806140d757607f821691505b6020821081036140f557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156141205750805b601f840160051c820191505b8181101561413f575f815560010161412c565b5050505050565b81516001600160401b0381111561415f5761415f613f26565b6141738161416d84546140c3565b846140fb565b602080601f8311600181146141a6575f841561418f5750858301515b5f19600386901b1c1916600185901b1785556141fd565b5f85815260208120601f198616915b828110156141d4578886015182559484019460019091019084016141b5565b50858210156141f157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561421f578181015183820152602001614207565b50505f910152565b602081525f8251806020840152614245816040850160208701614205565b601f01601f19169190910160400192915050565b5f60208284031215614269575f80fd5b5051919050565b5f60208083525f8454614282816140c3565b806020870152604060018084165f81146142a357600181146142bf576142ec565b60ff19851660408a0152604084151560051b8a010195506142ec565b895f5260205f205f5b858110156142e35781548b82018601529083019088016142c8565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261431c5761431c6142fa565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e614088565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613e0e81613dee565b5f8060408385031215614426575f80fd5b82516001600160401b038082111561443c575f80fd5b908401906060828703121561444f575f80fd5b614457613f3a565b8251815260208084015161446a81613e65565b8282015260408401518381111561447f575f80fd5b80850194505087601f850112614493575f80fd5b835192506144a361401a84613f92565b83815288828587010111156144b6575f80fd5b6144c584838301848801614205565b806040840152508195506144da81880161440a565b9450505050509250929050565b5f6001600160401b0380831681810361450257614502614088565b6001019392505050565b81810381811115610a1e57610a1e614088565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e614088565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140bc576140bc614088565b5f60208284031215614649575f80fd5b8135610f5581613e65565b6001600160401b0381811683821602808216919082811461467757614677614088565b505092915050565b5f6001600160401b0380841680614698576146986142fa565b92169190910492915050565b5f82516146b5818460208701614205565b9190910192915050565b5f602082840312156146cf575f80fd5b8151610f5581613dee565b5f602082840312156146ea575f80fd5b813560ff81168114610f55575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } diff --git a/contracts/mocks/ExampleERC20.sol b/contracts/mocks/ExampleERC20.sol index db4d6cb92..9f6d137a7 100644 --- a/contracts/mocks/ExampleERC20.sol +++ b/contracts/mocks/ExampleERC20.sol @@ -13,8 +13,9 @@ import { ERC20Burnable, ERC20 } from "@openzeppelin/contracts@5.0.2/token/ERC20/extensions/ERC20Burnable.sol"; +import {IERC20Mintable} from "../staking/interfaces/IERC20Mintable.sol"; -contract ExampleERC20 is ERC20Burnable { +contract ExampleERC20 is ERC20Burnable, IERC20Mintable { string private constant _TOKEN_NAME = "Mock Token"; string private constant _TOKEN_SYMBOL = "EXMP"; @@ -30,4 +31,8 @@ contract ExampleERC20 is ERC20Burnable { _mint(msg.sender, amount); } + + function mint(address account, uint256 amount) external { + _mint(account, amount); + } } diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 33f8efe5f..046dce5c1 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -8,7 +8,7 @@ pragma solidity 0.8.25; import {IERC20TokenStakingManager} from "./interfaces/IERC20TokenStakingManager.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; -import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; +import {IERC20Mintable} from "./interfaces/IERC20Mintable.sol"; import {SafeERC20TransferFrom} from "@utilities/SafeERC20TransferFrom.sol"; import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; import {ICMInitializable} from "../utilities/ICMInitializable.sol"; @@ -20,13 +20,13 @@ contract ERC20TokenStakingManager is PoSValidatorManager, IERC20TokenStakingManager { - using SafeERC20 for IERC20; - using SafeERC20TransferFrom for IERC20; + using SafeERC20 for IERC20Mintable; + using SafeERC20TransferFrom for IERC20Mintable; // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.ERC20TokenStakingManager struct ERC20TokenStakingManagerStorage { - IERC20 _token; + IERC20Mintable _token; uint8 _tokenDecimals; } // solhint-enable private-vars-leading-underscore @@ -62,7 +62,7 @@ contract ERC20TokenStakingManager is */ function initialize( PoSValidatorManagerSettings calldata settings, - IERC20 token + IERC20Mintable token ) external reinitializer(2) { __ERC20TokenStakingManager_init(settings, token); } @@ -70,14 +70,17 @@ contract ERC20TokenStakingManager is // solhint-disable func-name-mixedcase function __ERC20TokenStakingManager_init( PoSValidatorManagerSettings calldata settings, - IERC20 token + IERC20Mintable token ) internal onlyInitializing { __POS_Validator_Manager_init(settings); __ERC20TokenStakingManager_init_unchained(token); } // solhint-disable func-name-mixedcase - function __ERC20TokenStakingManager_init_unchained(IERC20 token) internal onlyInitializing { + function __ERC20TokenStakingManager_init_unchained(IERC20Mintable token) + internal + onlyInitializing + { ERC20TokenStakingManagerStorage storage $ = _getERC20StakingManagerStorage(); require(address(token) != address(0), "ERC20TokenStakingManager: zero token address"); $._token = token; diff --git a/contracts/staking/interfaces/IERC20Mintable.sol b/contracts/staking/interfaces/IERC20Mintable.sol new file mode 100644 index 000000000..fd28ad6b1 --- /dev/null +++ b/contracts/staking/interfaces/IERC20Mintable.sol @@ -0,0 +1,12 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +// SPDX-License-Identifier: Ecosystem + +pragma solidity 0.8.25; + +import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; + +interface IERC20Mintable is IERC20 { + function mint(address account, uint256 amount) external; +} diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 36b877a52..ea5ddebdb 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -13,15 +13,16 @@ import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {ExampleERC20} from "@mocks/ExampleERC20.sol"; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; +import {IERC20Mintable} from "../interfaces/IERC20Mintable.sol"; import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { - using SafeERC20 for IERC20; + using SafeERC20 for IERC20Mintable; ERC20TokenStakingManager public app; - IERC20 public token; + IERC20Mintable public token; function setUp() public virtual { // Construct the object under test From 318c2775b6b0c4726224184097595436ffe09a31 Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Fri, 6 Sep 2024 14:11:27 +0000 Subject: [PATCH 233/545] issue ERC20 staking rewards (native rewards TBD) --- .../ERC20TokenStakingManager.go | 2 +- .../ExampleRewardCalculator.go | 296 ++++++++++++++++++ .../NativeTokenStakingManager.go | 2 +- .../staking/ERC20TokenStakingManager.sol | 5 + .../staking/NativeTokenStakingManager.sol | 5 + contracts/staking/PoSValidatorManager.sol | 16 +- .../tests/ERC20TokenStakingManagerTests.t.sol | 10 +- .../NativeTokenStakingManagerTests.t.sol | 17 +- .../tests/PoSValidatorManagerTests.t.sol | 52 ++- scripts/abi_bindings.sh | 2 +- tests/flows/governance/validator_set_sig.go | 11 +- tests/flows/staking/poa_to_pos.go | 10 +- tests/utils/staking.go | 38 ++- 13 files changed, 435 insertions(+), 31 deletions(-) create mode 100644 abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6c1c39fa8..c15551c16 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516148f43803806148f483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147a78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613e13565b6102d6565b005b610128610138366004613e4e565b610761565b61017b61014b366004613e4e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613e4e565b6108bd565b6101286101af366004613e79565b61092a565b6101c76101c2366004613e4e565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613eb6565b610a24565b610128610200366004613ecf565b610a4f565b61017b610213366004613f0d565b610c40565b6101c7610226366004613e4e565b610c59565b610128610239366004613e4e565b610c6d565b61012861024c366004613e13565b610cda565b61017b61025f366004613fb8565b610cf5565b610128610272366004613ecf565b610d1a565b61017b610285366004614054565b610f49565b610128610298366004613eb6565b610f5c565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613e4e565b611119565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206146fb8339815191529184156103285761032582856111e8565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614074565b600481111561036b5761036b614074565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614074565b146104445760405162461bcd60e51b815260206004820152602a60248201525f8051602061471b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f8051602061471b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611484565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500614074565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856114f8565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e919061409c565b905061066a86826115d7565b5f61067687858461161f565b5f8c815260058a01602052604090209091506106928282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614227565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190614259565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061473b8339815191529291906107a9906140c3565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9614074565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b89190614259565b505050565b6108c68161183c565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc848461190b565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361430e565b92915050565b5f610a2e82611925565b9050610a4b81606001516001600160401b03168260400151611cb2565b5050565b5f805160206146fb8339815191525f610a6784611ce8565b90505f80610a788360400151611ec9565b5091509150610a8685612104565b5f8581526004850160205260408120610a9e91613d5b565b5f610aa8836114f8565b9050816001600160401b031681608001516001600160401b03161015610ae05760405162461bcd60e51b815260040161043b90614321565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b255760405162461bcd60e51b815260040161043b90614363565b60015f87815260038701602052604090205460ff166004811115610b4b57610b4b614074565b14610bb45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a510006143ac565b5f610c63826114f8565b60a0015192915050565b610c7681612104565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b8115610cec57610cea83826111e8565b505b6108b8836121dd565b5f80610d0086612595565b9050610d0e85828686612642565b9150505b949350505050565b5f805160206146fb8339815191525f610d3284611ce8565b90505f80610d438360400151611ec9565b5091509150610d518561183c565b5f8581526005850160205260408120610d6991613d5b565b5f610d73836114f8565b9050816001600160401b031681608001516001600160401b03161015610dab5760405162461bcd60e51b815260040161043b90614321565b5f8681526003808701602052604090912001546001600160401b0380841691161115610de95760405162461bcd60e51b815260040161043b90614363565b60035f87815260038701602052604090205460ff166004811115610e0f57610e0f614074565b14610e635760405162461bcd60e51b815260206004820152603160248201525f8051602061471b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f079190611cb2565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f55833384612a97565b9392505050565b5f8051602061473b8339815191525f610f7483611ce8565b90505f80610f858360400151612e52565b9150915080610fe75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260058501602052604081208054611001906140c3565b9050118015611033575060015f83815260078601602052604090205460ff16600581111561103157611031614074565b145b61104f5760405162461bcd60e51b815260040161043b906143c3565b5f828152600585016020526040812061106791613d5b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061473b833981519152929190611161906140c3565b9050118015611193575060015f83815260078301602052604090205460ff16600581111561119157611191614074565b145b6111af5760405162461bcd60e51b815260040161043b906143c3565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611233573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261125a9190810190614415565b91509150806112bd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611300573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113249190614259565b8251146113885760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156113fe5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061140d8460400151612ff3565b9150915081871461147a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f8051602061477b8339815191526020526040812060030180545f8051602061473b833981519152916001600160401b03909116908190846114c9836144e7565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611500613d92565b5f8281525f8051602061477b8339815191526020526040908190208151610100810190925280545f8051602061473b833981519152929190829060ff16600581111561154e5761154e614074565b600581111561155f5761155f614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061477b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116985761165881600161450c565b6116639060086143ac565b5081515f9083908390811061167a5761167a61451f565b60200101906001600160f81b03191690815f1a905350600101611644565b505f5b60048110156116fb576116af81600361450c565b6116ba9060086143ac565b6001901c60f81b826116cd836002614533565b815181106116dd576116dd61451f565b60200101906001600160f81b03191690815f1a90535060010161169b565b505f5b602081101561175d5761171281601f61450c565b61171d9060086143ac565b86901c60f81b8261172f836006614533565b8151811061173f5761173f61451f565b60200101906001600160f81b03191690815f1a9053506001016116fe565b505f5b60088110156117c85761177481600761450c565b61177f9060086143ac565b6001600160401b038616901c60f81b8261179a836026614533565b815181106117aa576117aa61451f565b60200101906001600160f81b03191690815f1a905350600101611760565b505f5b6008811015611833576117df81600761450c565b6117ea9060086143ac565b6001600160401b038516901c60f81b8261180583602e614533565b815181106118155761181561451f565b60200101906001600160f81b03191690815f1a9053506001016117cb565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206146fb833981519152929190611884906140c3565b90501180156118b6575060035f83815260038301602052604090205460ff1660048111156118b4576118b4614074565b145b610a4b5760405162461bcd60e51b815260206004820152603360248201525f8051602061471b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b6119136131cb565b61191c82613216565b610a4b8161325c565b61192d613d92565b5f8051602061473b8339815191525f61194584611ce8565b90505f806119568360400151612e52565b9150915080156119bb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff1660058111156119ed576119ed614074565b60058111156119fe576119fe614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8557611a85614074565b1480611aa35750600182516005811115611aa157611aa1614074565b145b611b025760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1757611b17614074565b03611b3e57505f8381526006860160205260408120600491611b399190613d5b565b611b42565b5060055b6020808301515f90815260088801909152604081205581816005811115611b6b57611b6b614074565b90816005811115611b7e57611b7e614074565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611bb257611bb2614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c7d57611c7d614074565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a4b906001600160a01b03168284613310565b60408051606080820183525f8083526020830181905292820152905f8051602061473b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d849190810190614415565b9150915080611deb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e4e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ec15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611eed5760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015611f3c57611f0481600161450c565b611f0f9060086143ac565b61ffff16868281518110611f2557611f2561451f565b016020015160f81c901b9190911790600101611ef0565b5061ffff811615611f5f5760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015611fba57611f7681600361450c565b611f819060086143ac565b63ffffffff1687611f93836002614533565b81518110611fa357611fa361451f565b016020015160f81c901b9190911790600101611f62565b5063ffffffff8116600314611fe15760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561203657611ff881601f61450c565b6120039060086143ac565b8861200f836006614533565b8151811061201f5761201f61451f565b016020015160f81c901b9190911790600101611fe4565b505f805b60088110156120955761204e81600761450c565b6120599060086143ac565b6001600160401b03168961206e836026614533565b8151811061207e5761207e61451f565b016020015160f81c901b919091179060010161203a565b505f805b60088110156120f4576120ad81600761450c565b6120b89060086143ac565b6001600160401b03168a6120cd83602e614533565b815181106120dd576120dd61451f565b016020015160f81c901b9190911790600101612099565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206146fb83398151915292919061214c906140c3565b905011801561217e575060015f83815260038301602052604090205460ff16600481111561217c5761217c614074565b145b610a4b5760405162461bcd60e51b815260206004820152603860248201525f8051602061471b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061477b83398151915260205260408082208151610100810190925280545f8051602061473b83398151915293929190829060ff16600581111561222b5761222b614074565b600581111561223c5761223c614074565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122c4576122c4614074565b146123205760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461239a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123a78160a0015161336f565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123eb576123eb614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124b7846124b181611484565b5f61161f565b5f85815260068501602052604090209091506124d38282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612500908590600401614227565b6020604051808303815f875af115801561251c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125409190614259565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146fb833981519152816125ae84613510565b90505f6125ba82610a0e565b83549091506001600160401b038216108015906125e457508260010154816001600160401b031611155b610d125760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61264b613546565b5f8051602061473b833981519152426001600160401b03851611801561268557506001600160401b038416612683426202a300614533565b115b6126e75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b8561273e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600882016020526040902054156127ac5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b61281c8561336f565b5f806128636040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061357d565b5f828152600586016020526040902091935091506128818282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128ae908590600401614227565b6020604051808303815f875af11580156128ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ee9190614259565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561297057612970614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612a3183611484565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1260015f8051602061475b83398151915255565b5f612aa0613546565b5f612aad6101c284613510565b90505f805160206146fb8339815191525f612ac7876114f8565b9050600281516005811115612ade57612ade614074565b14612b3d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612b4e9190614619565b9050612b5a88826115d7565b5f612b6489611484565b90505f898983604051602001612bac9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612bcd8661336f565b5f612bd98b848661161f565b5f8381526004880160205260409020909150612bf58282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c22908590600401614227565b6020604051808303815f875af1158015612c3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c629190614259565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d1157612d11614074565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610f5560015f8051602061475b83398151915255565b5f808251602714612e755760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015612ec457612e8c81600161450c565b612e979060086143ac565b61ffff16858281518110612ead57612ead61451f565b016020015160f81c901b9190911790600101612e78565b5061ffff811615612ee75760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015612f4257612efe81600361450c565b612f099060086143ac565b63ffffffff1686612f1b836002614533565b81518110612f2b57612f2b61451f565b016020015160f81c901b9190911790600101612eea565b5063ffffffff8116600214612f695760405162461bcd60e51b815260040161043b906145d2565b5f805b6020811015612fbe57612f8081601f61450c565b612f8b9060086143ac565b87612f97836006614533565b81518110612fa757612fa761451f565b016020015160f81c901b9190911790600101612f6c565b505f86602681518110612fd357612fd361451f565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146130165760405162461bcd60e51b815260040161043b90614546565b5f805b60028110156130655761302d81600161450c565b6130389060086143ac565b61ffff1685828151811061304e5761304e61451f565b016020015160f81c901b9190911790600101613019565b5061ffff8116156130885760405162461bcd60e51b815260040161043b9061458f565b5f805b60048110156130e35761309f81600361450c565b6130aa9060086143ac565b63ffffffff16866130bc836002614533565b815181106130cc576130cc61451f565b016020015160f81c901b919091179060010161308b565b5063ffffffff811660041461310a5760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561315f5761312181601f61450c565b61312c9060086143ac565b87613138836006614533565b815181106131485761314861451f565b016020015160f81c901b919091179060010161310d565b505f805b60088110156131be5761317781600761450c565b6131829060086143ac565b6001600160401b031688613197836026614533565b815181106131a7576131a761451f565b016020015160f81c901b9190911790600101613163565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661321457604051631afcd79f60e31b815260040160405180910390fd5b565b61321e6131cb565b61322781613935565b6132596060820135608083013561324460c0850160a08601613f0d565b61325460e0860160c08701614639565b613956565b50565b6132646131cb565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132f05760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506139b1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061473b8339815191529060ff165f036133ad575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133f5908361450c565b10613411576001600160401b0384166040830152808252613430565b83826040018181516134239190614619565b6001600160401b03169052505b5f8260200151836040015160646134479190614654565b613451919061467f565b600285015490915060ff90811690821611156134cc5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a12565b5f8051602061475b83398151915280546001190161357757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135e75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561365e5761361e81600161450c565b6136299060086143ac565b5081515f908390839081106136405761364061451f565b60200101906001600160f81b03191690815f1a90535060010161360a565b505f5b60048110156136bc5761367581600361450c565b6136809060086143ac565b505f8261368e836002614533565b8151811061369e5761369e61451f565b60200101906001600160f81b03191690815f1a905350600101613661565b505f5b602081101561371957845181602081106136db576136db61451f565b1a60f81b826136eb836006614533565b815181106136fb576136fb61451f565b60200101906001600160f81b03191690815f1a9053506001016136bf565b505f5b6020811015613779578460200151816020811061373b5761373b61451f565b1a60f81b8261374b836026614533565b8151811061375b5761375b61451f565b60200101906001600160f81b03191690815f1a90535060010161371c565b505f5b60088110156137ed5761379081600761450c565b61379b9060086143ac565b60ff1685604001516001600160401b0316901c60f81b828260466137bf9190614533565b815181106137cf576137cf61451f565b60200101906001600160f81b03191690815f1a90535060010161377c565b505f5b6030811015613858578460800151818151811061380f5761380f61451f565b01602001516001600160f81b0319168261382a83604e614533565b8151811061383a5761383a61451f565b60200101906001600160f81b03191690815f1a9053506001016137f0565b505f5b60088110156138ca5761386f81600761450c565b61387a9060086143ac565b60608601516001600160401b0390811691161c60f81b8261389c83607e614533565b815181106138ac576138ac61451f565b60200101906001600160f81b03191690815f1a90535060010161385b565b506002816040516138db91906146a4565b602060405180830381855afa1580156138f6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139199190614259565b94909350915050565b60015f8051602061475b83398151915255565b61393d6131cb565b613945613b74565b61394d613b84565b61325981613b8c565b61395e6131cb565b5f5f805160206146fb833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f6139c56001600160a01b03841683613bf8565b905080515f141580156139e95750808060200190518101906139e791906146bf565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a7c9190614259565b9050613a936001600160a01b038516333086613c05565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ad7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afb9190614259565b9050818111613b615760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613b6b828261450c565b95945050505050565b613b7c6131cb565b613214613c44565b6132146131cb565b613b946131cb565b80355f8051602061473b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bde60608301604084016146da565b600291909101805460ff191660ff90921691909117905550565b6060610f5583835f613c4c565b6040516001600160a01b038481166024830152838116604483015260648201839052613c3e9186918216906323b872dd9060840161333d565b50505050565b6139226131cb565b606081471015613c715760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613c8c91906146a4565b5f6040518083038185875af1925050503d805f8114613cc6576040519150601f19603f3d011682016040523d82523d5f602084013e613ccb565b606091505b509150915061147a868383606082613ceb57613ce682613d32565b610f55565b8151158015613d0257506001600160a01b0384163b155b15613d2b57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610f55565b805115613d425780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d67906140c3565b5f825580601f10613d76575050565b601f0160209004905f5260205f20908101906132599190613dd6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613dea575f8155600101613dd7565b5090565b8015158114613259575f80fd5b803563ffffffff81168114613e0e575f80fd5b919050565b5f805f60608486031215613e25575f80fd5b833592506020840135613e3781613dee565b9150613e4560408501613dfb565b90509250925092565b5f60208284031215613e5e575f80fd5b5035919050565b6001600160a01b0381168114613259575f80fd5b5f80828403610100811215613e8c575f80fd5b60e0811215613e99575f80fd5b5082915060e0830135613eab81613e65565b809150509250929050565b5f60208284031215613ec6575f80fd5b610f5582613dfb565b5f8060408385031215613ee0575f80fd5b613ee983613dfb565b946020939093013593505050565b80356001600160401b0381168114613e0e575f80fd5b5f60208284031215613f1d575f80fd5b610f5582613ef7565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613f5c57613f5c613f26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f8a57613f8a613f26565b604052919050565b5f6001600160401b03821115613faa57613faa613f26565b50601f01601f191660200190565b5f805f8060808587031215613fcb575f80fd5b8435935060208501359250613fe260408601613ef7565b915060608501356001600160401b03811115613ffc575f80fd5b8501601f8101871361400c575f80fd5b803561401f61401a82613f92565b613f62565b818152886020838501011115614033575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215614065575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140bc576140bc614088565b5092915050565b600181811c908216806140d757607f821691505b6020821081036140f557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156141205750805b601f840160051c820191505b8181101561413f575f815560010161412c565b5050505050565b81516001600160401b0381111561415f5761415f613f26565b6141738161416d84546140c3565b846140fb565b602080601f8311600181146141a6575f841561418f5750858301515b5f19600386901b1c1916600185901b1785556141fd565b5f85815260208120601f198616915b828110156141d4578886015182559484019460019091019084016141b5565b50858210156141f157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561421f578181015183820152602001614207565b50505f910152565b602081525f8251806020840152614245816040850160208701614205565b601f01601f19169190910160400192915050565b5f60208284031215614269575f80fd5b5051919050565b5f60208083525f8454614282816140c3565b806020870152604060018084165f81146142a357600181146142bf576142ec565b60ff19851660408a0152604084151560051b8a010195506142ec565b895f5260205f205f5b858110156142e35781548b82018601529083019088016142c8565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261431c5761431c6142fa565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e614088565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613e0e81613dee565b5f8060408385031215614426575f80fd5b82516001600160401b038082111561443c575f80fd5b908401906060828703121561444f575f80fd5b614457613f3a565b8251815260208084015161446a81613e65565b8282015260408401518381111561447f575f80fd5b80850194505087601f850112614493575f80fd5b835192506144a361401a84613f92565b83815288828587010111156144b6575f80fd5b6144c584838301848801614205565b806040840152508195506144da81880161440a565b9450505050509250929050565b5f6001600160401b0380831681810361450257614502614088565b6001019392505050565b81810381811115610a1e57610a1e614088565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e614088565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140bc576140bc614088565b5f60208284031215614649575f80fd5b8135610f5581613e65565b6001600160401b0381811683821602808216919082811461467757614677614088565b505092915050565b5f6001600160401b0380841680614698576146986142fa565b92169190910492915050565b5f82516146b5818460208701614205565b9190910192915050565b5f602082840312156146cf575f80fd5b8151610f5581613dee565b5f602082840312156146ea575f80fd5b813560ff81168114610f55575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614ada380380614ada83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61498d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613fd9565b6102d6565b005b610128610138366004614014565b610761565b61017b61014b366004614014565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004614014565b6108bd565b6101286101af36600461403f565b61092a565b6101c76101c2366004614014565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed36600461407c565b610a24565b610128610200366004614095565b610b1e565b61017b6102133660046140d3565b610d0f565b6101c7610226366004614014565b610d28565b610128610239366004614014565b610d3c565b61012861024c366004613fd9565b610da9565b61017b61025f36600461417e565b610dc4565b610128610272366004614095565b610de9565b61017b61028536600461421a565b6110d4565b61012861029836600461407c565b6110e7565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004614014565b6112a4565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206148e1833981519152918415610328576103258285611373565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a61423a565b600481111561036b5761036b61423a565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f261423a565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206149018339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206149018339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461160f565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156105005761050061423a565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611683565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190614262565b905061066a8682611762565b5f6106768785846117aa565b5f8c815260058a0160205260409020909150610692828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016143ed565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff919061441f565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206149218339815191529291906107a990614289565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d961423a565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614436565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b8919061441f565b505050565b6108c6816119c7565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206148e1833981519152916005600160991b019163ee5b48eb9161087891600401614436565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc8484611a9a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a51000836144d4565b92915050565b5f610a2e82611ab4565b90505f5f805160206148e1833981519152600281015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f6064820181905260848201819052929350600160401b9091046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610ac9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aed919061441f565b9050610afd836040015182611e41565b610b1883606001516001600160401b03168460400151611eb7565b50505050565b5f805160206148e18339815191525f610b3684611eda565b90505f80610b4783604001516120bb565b5091509150610b55856122f6565b5f8581526004850160205260408120610b6d91613f21565b5f610b7783611683565b9050816001600160401b031681608001516001600160401b03161015610baf5760405162461bcd60e51b815260040161043b906144e7565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bf45760405162461bcd60e51b815260040161043b90614529565b60015f87815260038701602052604090205460ff166004811115610c1a57610c1a61423a565b14610c835760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a51000614572565b5f610d3282611683565b60a0015192915050565b610d45816122f6565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206148e1833981519152916005600160991b019163ee5b48eb9161087891600401614436565b8115610dbb57610db98382611373565b505b6108b8836123cf565b5f80610dcf86612787565b9050610ddd85828686612834565b9150505b949350505050565b5f805160206148e18339815191525f610e0184611eda565b90505f80610e1283604001516120bb565b5091509150610e20856119c7565b5f8581526005850160205260408120610e3891613f21565b5f610e4283611683565b9050816001600160401b031681608001516001600160401b03161015610e7a5760405162461bcd60e51b815260040161043b906144e7565b5f8681526003808701602052604090912001546001600160401b0380841691161115610eb85760405162461bcd60e51b815260040161043b90614529565b60035f87815260038701602052604090205460ff166004811115610ede57610ede61423a565b14610f325760405162461bcd60e51b815260206004820152603160248201525f805160206149018339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610fd69190611eb7565b60028601546060820151608083015160a0840151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f606482018190526084820181905291600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561105d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611081919061441f565b9050611091826020015182611e41565b836001600160401b031685897f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050505050565b5f6110e0833384612c89565b9392505050565b5f805160206149218339815191525f6110ff83611eda565b90505f806111108360400151613044565b91509150806111725760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f8281526005850160205260408120805461118c90614289565b90501180156111be575060015f83815260078601602052604090205460ff1660058111156111bc576111bc61423a565b145b6111da5760405162461bcd60e51b815260040161043b90614589565b5f82815260058501602052604081206111f291613f21565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149218339815191529291906112ec90614289565b905011801561131e575060015f83815260078301602052604090205460ff16600581111561131c5761131c61423a565b145b61133a5760405162461bcd60e51b815260040161043b90614589565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614436565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113e591908101906145db565b91509150806114485760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114af919061441f565b8251146115135760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156115895760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061159884604001516131e5565b915091508187146116055760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206149618339815191526020526040812060030180545f80516020614921833981519152916001600160401b0390911690819084611654836146ad565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61168b613f58565b5f8281525f805160206149618339815191526020526040908190208151610100810190925280545f80516020614921833981519152929190829060ff1660058111156116d9576116d961423a565b60058111156116ea576116ea61423a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614961833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611823576117e38160016146d2565b6117ee906008614572565b5081515f90839083908110611805576118056146e5565b60200101906001600160f81b03191690815f1a9053506001016117cf565b505f5b60048110156118865761183a8160036146d2565b611845906008614572565b6001901c60f81b826118588360026146f9565b81518110611868576118686146e5565b60200101906001600160f81b03191690815f1a905350600101611826565b505f5b60208110156118e85761189d81601f6146d2565b6118a8906008614572565b86901c60f81b826118ba8360066146f9565b815181106118ca576118ca6146e5565b60200101906001600160f81b03191690815f1a905350600101611889565b505f5b6008811015611953576118ff8160076146d2565b61190a906008614572565b6001600160401b038616901c60f81b826119258360266146f9565b81518110611935576119356146e5565b60200101906001600160f81b03191690815f1a9053506001016118eb565b505f5b60088110156119be5761196a8160076146d2565b611975906008614572565b6001600160401b038516901c60f81b8261199083602e6146f9565b815181106119a0576119a06146e5565b60200101906001600160f81b03191690815f1a905350600101611956565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206148e1833981519152929190611a0f90614289565b9050118015611a41575060035f83815260038301602052604090205460ff166004811115611a3f57611a3f61423a565b145b611a965760405162461bcd60e51b815260206004820152603360248201525f8051602061490183398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b611aa26133bd565b611aab82613408565b611a968161344e565b611abc613f58565b5f805160206149218339815191525f611ad484611eda565b90505f80611ae58360400151613044565b915091508015611b4a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611b7c57611b7c61423a565b6005811115611b8d57611b8d61423a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c1457611c1461423a565b1480611c325750600182516005811115611c3057611c3061423a565b145b611c915760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611ca657611ca661423a565b03611ccd57505f8381526006860160205260408120600491611cc89190613f21565b611cd1565b5060055b6020808301515f90815260088801909152604081205581816005811115611cfa57611cfa61423a565b90816005811115611d0d57611d0d61423a565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611d4157611d4161423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e0c57611e0c61423a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206148c183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015611e9c575f80fd5b505af1158015611eae573d5f803e3d5ffd5b50505050505050565b5f805160206148c183398151915254611a96906001600160a01b031682846134ef565b60408051606080820183525f8083526020830181905292820152905f805160206149218339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f4f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7691908101906145db565b9150915080611fdd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b82548251146120405760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b0316156120b35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f83516036146120df5760405162461bcd60e51b815260040161043b9061470c565b5f805b600281101561212e576120f68160016146d2565b612101906008614572565b61ffff16868281518110612117576121176146e5565b016020015160f81c901b91909117906001016120e2565b5061ffff8116156121515760405162461bcd60e51b815260040161043b90614755565b5f805b60048110156121ac576121688160036146d2565b612173906008614572565b63ffffffff16876121858360026146f9565b81518110612195576121956146e5565b016020015160f81c901b9190911790600101612154565b5063ffffffff81166003146121d35760405162461bcd60e51b815260040161043b90614798565b5f805b6020811015612228576121ea81601f6146d2565b6121f5906008614572565b886122018360066146f9565b81518110612211576122116146e5565b016020015160f81c901b91909117906001016121d6565b505f805b6008811015612287576122408160076146d2565b61224b906008614572565b6001600160401b0316896122608360266146f9565b81518110612270576122706146e5565b016020015160f81c901b919091179060010161222c565b505f805b60088110156122e65761229f8160076146d2565b6122aa906008614572565b6001600160401b03168a6122bf83602e6146f9565b815181106122cf576122cf6146e5565b016020015160f81c901b919091179060010161228b565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206148e183398151915292919061233e90614289565b9050118015612370575060015f83815260038301602052604090205460ff16600481111561236e5761236e61423a565b145b611a965760405162461bcd60e51b815260206004820152603860248201525f8051602061490183398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061496183398151915260205260408082208151610100810190925280545f8051602061492183398151915293929190829060ff16600581111561241d5761241d61423a565b600581111561242e5761242e61423a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124b6576124b661423a565b146125125760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461258c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6125998160a0015161354e565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156125dd576125dd61423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126a9846126a38161160f565b5f6117aa565b5f85815260068501602052604090209091506126c5828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126f29085906004016143ed565b6020604051808303815f875af115801561270e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612732919061441f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206148e1833981519152816127a0846136ef565b90505f6127ac82610a0e565b83549091506001600160401b038216108015906127d657508260010154816001600160401b031611155b610de15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61283d613712565b5f80516020614921833981519152426001600160401b03851611801561287757506001600160401b038416612875426202a3006146f9565b115b6128d95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b856129305760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f8681526008820160205260409020541561299e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612a055760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b612a0e8561354e565b5f80612a556040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613749565b5f82815260058601602052604090209193509150612a73828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612aa09085906004016143ed565b6020604051808303815f875af1158015612abc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ae0919061441f565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612b6257612b6261423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612c238361160f565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610de160015f8051602061494183398151915255565b5f612c92613712565b5f612c9f6101c2846136ef565b90505f805160206148e18339815191525f612cb987611683565b9050600281516005811115612cd057612cd061423a565b14612d2f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612d4091906147df565b9050612d4c8882611762565b5f612d568961160f565b90505f898983604051602001612d9e9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612dbf8661354e565b5f612dcb8b84866117aa565b5f8381526004880160205260409020909150612de7828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e149085906004016143ed565b6020604051808303815f875af1158015612e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e54919061441f565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612f0357612f0361423a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506110e060015f8051602061494183398151915255565b5f8082516027146130675760405162461bcd60e51b815260040161043b9061470c565b5f805b60028110156130b65761307e8160016146d2565b613089906008614572565b61ffff1685828151811061309f5761309f6146e5565b016020015160f81c901b919091179060010161306a565b5061ffff8116156130d95760405162461bcd60e51b815260040161043b90614755565b5f805b6004811015613134576130f08160036146d2565b6130fb906008614572565b63ffffffff168661310d8360026146f9565b8151811061311d5761311d6146e5565b016020015160f81c901b91909117906001016130dc565b5063ffffffff811660021461315b5760405162461bcd60e51b815260040161043b90614798565b5f805b60208110156131b05761317281601f6146d2565b61317d906008614572565b876131898360066146f9565b81518110613199576131996146e5565b016020015160f81c901b919091179060010161315e565b505f866026815181106131c5576131c56146e5565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132085760405162461bcd60e51b815260040161043b9061470c565b5f805b60028110156132575761321f8160016146d2565b61322a906008614572565b61ffff16858281518110613240576132406146e5565b016020015160f81c901b919091179060010161320b565b5061ffff81161561327a5760405162461bcd60e51b815260040161043b90614755565b5f805b60048110156132d5576132918160036146d2565b61329c906008614572565b63ffffffff16866132ae8360026146f9565b815181106132be576132be6146e5565b016020015160f81c901b919091179060010161327d565b5063ffffffff81166004146132fc5760405162461bcd60e51b815260040161043b90614798565b5f805b60208110156133515761331381601f6146d2565b61331e906008614572565b8761332a8360066146f9565b8151811061333a5761333a6146e5565b016020015160f81c901b91909117906001016132ff565b505f805b60088110156133b0576133698160076146d2565b613374906008614572565b6001600160401b0316886133898360266146f9565b81518110613399576133996146e5565b016020015160f81c901b9190911790600101613355565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661340657604051631afcd79f60e31b815260040160405180910390fd5b565b6134106133bd565b61341981613b01565b61344b6060820135608083013561343660c0850160a086016140d3565b61344660e0860160c087016147ff565b613b22565b50565b6134566133bd565b5f805160206148c18339815191526001600160a01b0382166134cf5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613b7d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149218339815191529060ff165f0361358c575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135d490836146d2565b106135f0576001600160401b038416604083015280825261360f565b838260400181815161360291906147df565b6001600160401b03169052505b5f826020015183604001516064613626919061481a565b6136309190614845565b600285015490915060ff90811690821611156136ab5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e825f805160206148c1833981519152546001600160a01b031690613bde565b5f8051602061494183398151915280546001190161374357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146137b35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561382a576137ea8160016146d2565b6137f5906008614572565b5081515f9083908390811061380c5761380c6146e5565b60200101906001600160f81b03191690815f1a9053506001016137d6565b505f5b6004811015613888576138418160036146d2565b61384c906008614572565b505f8261385a8360026146f9565b8151811061386a5761386a6146e5565b60200101906001600160f81b03191690815f1a90535060010161382d565b505f5b60208110156138e557845181602081106138a7576138a76146e5565b1a60f81b826138b78360066146f9565b815181106138c7576138c76146e5565b60200101906001600160f81b03191690815f1a90535060010161388b565b505f5b60208110156139455784602001518160208110613907576139076146e5565b1a60f81b826139178360266146f9565b81518110613927576139276146e5565b60200101906001600160f81b03191690815f1a9053506001016138e8565b505f5b60088110156139b95761395c8160076146d2565b613967906008614572565b60ff1685604001516001600160401b0316901c60f81b8282604661398b91906146f9565b8151811061399b5761399b6146e5565b60200101906001600160f81b03191690815f1a905350600101613948565b505f5b6030811015613a2457846080015181815181106139db576139db6146e5565b01602001516001600160f81b031916826139f683604e6146f9565b81518110613a0657613a066146e5565b60200101906001600160f81b03191690815f1a9053506001016139bc565b505f5b6008811015613a9657613a3b8160076146d2565b613a46906008614572565b60608601516001600160401b0390811691161c60f81b82613a6883607e6146f9565b81518110613a7857613a786146e5565b60200101906001600160f81b03191690815f1a905350600101613a27565b50600281604051613aa7919061486a565b602060405180830381855afa158015613ac2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613ae5919061441f565b94909350915050565b60015f8051602061494183398151915255565b613b096133bd565b613b11613d40565b613b19613d50565b61344b81613d58565b613b2a6133bd565b5f5f805160206148e1833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f613b916001600160a01b03841683613dc4565b905080515f14158015613bb5575080806020019051810190613bb39190614885565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613c24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c48919061441f565b9050613c5f6001600160a01b038516333086613dd1565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ca3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cc7919061441f565b9050818111613d2d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613d3782826146d2565b95945050505050565b613d486133bd565b613406613e0a565b6134066133bd565b613d606133bd565b80355f8051602061492183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613daa60608301604084016148a0565b600291909101805460ff191660ff90921691909117905550565b60606110e083835f613e12565b6040516001600160a01b038481166024830152838116604483015260648201839052610b189186918216906323b872dd9060840161351c565b613aee6133bd565b606081471015613e375760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613e52919061486a565b5f6040518083038185875af1925050503d805f8114613e8c576040519150601f19603f3d011682016040523d82523d5f602084013e613e91565b606091505b5091509150611605868383606082613eb157613eac82613ef8565b6110e0565b8151158015613ec857506001600160a01b0384163b155b15613ef157604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b50806110e0565b805115613f085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613f2d90614289565b5f825580601f10613f3c575050565b601f0160209004905f5260205f209081019061344b9190613f9c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613fb0575f8155600101613f9d565b5090565b801515811461344b575f80fd5b803563ffffffff81168114613fd4575f80fd5b919050565b5f805f60608486031215613feb575f80fd5b833592506020840135613ffd81613fb4565b915061400b60408501613fc1565b90509250925092565b5f60208284031215614024575f80fd5b5035919050565b6001600160a01b038116811461344b575f80fd5b5f80828403610100811215614052575f80fd5b60e081121561405f575f80fd5b5082915060e08301356140718161402b565b809150509250929050565b5f6020828403121561408c575f80fd5b6110e082613fc1565b5f80604083850312156140a6575f80fd5b6140af83613fc1565b946020939093013593505050565b80356001600160401b0381168114613fd4575f80fd5b5f602082840312156140e3575f80fd5b6110e0826140bd565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614122576141226140ec565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614150576141506140ec565b604052919050565b5f6001600160401b03821115614170576141706140ec565b50601f01601f191660200190565b5f805f8060808587031215614191575f80fd5b84359350602085013592506141a8604086016140bd565b915060608501356001600160401b038111156141c2575f80fd5b8501601f810187136141d2575f80fd5b80356141e56141e082614158565b614128565b8181528860208385010111156141f9575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561422b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156142825761428261424e565b5092915050565b600181811c9082168061429d57607f821691505b6020821081036142bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156142e65750805b601f840160051c820191505b81811015614305575f81556001016142f2565b5050505050565b81516001600160401b03811115614325576143256140ec565b614339816143338454614289565b846142c1565b602080601f83116001811461436c575f84156143555750858301515b5f19600386901b1c1916600185901b1785556143c3565b5f85815260208120601f198616915b8281101561439a5788860151825594840194600190910190840161437b565b50858210156143b757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156143e55781810151838201526020016143cd565b50505f910152565b602081525f825180602084015261440b8160408501602087016143cb565b601f01601f19169190910160400192915050565b5f6020828403121561442f575f80fd5b5051919050565b5f60208083525f845461444881614289565b806020870152604060018084165f81146144695760018114614485576144b2565b60ff19851660408a0152604084151560051b8a010195506144b2565b895f5260205f205f5b858110156144a95781548b820186015290830190880161448e565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826144e2576144e26144c0565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e61424e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613fd481613fb4565b5f80604083850312156145ec575f80fd5b82516001600160401b0380821115614602575f80fd5b9084019060608287031215614615575f80fd5b61461d614100565b825181526020808401516146308161402b565b82820152604084015183811115614645575f80fd5b80850194505087601f850112614659575f80fd5b835192506146696141e084614158565b838152888285870101111561467c575f80fd5b61468b848383018488016143cb565b806040840152508195506146a08188016145d0565b9450505050509250929050565b5f6001600160401b038083168181036146c8576146c861424e565b6001019392505050565b81810381811115610a1e57610a1e61424e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e61424e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156142825761428261424e565b5f6020828403121561480f575f80fd5b81356110e08161402b565b6001600160401b0381811683821602808216919082811461483d5761483d61424e565b505092915050565b5f6001600160401b038084168061485e5761485e6144c0565b92169190910492915050565b5f825161487b8184602087016143cb565b9190910192915050565b5f60208284031215614895575f80fd5b81516110e081613fb4565b5f602082840312156148b0575f80fd5b813560ff811681146110e0575f80fdfe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go new file mode 100644 index 000000000..75980496a --- /dev/null +++ b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go @@ -0,0 +1,296 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package examplerewardcalculator + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// 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\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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: "0x60a0604052348015600e575f80fd5b5060405161029d38038061029d833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b60805161021a6100835f395f81816079015260d3015261021a5ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780639d4ba9db14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f36600461014b565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6103e86301e133806100c787876101a9565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168961010791906101d1565b61011191906101d1565b61011b91906101ee565b61012591906101ee565b9695505050505050565b803567ffffffffffffffff81168114610146575f80fd5b919050565b5f805f805f60a0868803121561015f575f80fd5b8535945061016f6020870161012f565b935061017d6040870161012f565b94979396509394606081013594506080013592915050565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156101ca576101ca610195565b5092915050565b80820281158282048414176101e8576101e8610195565b92915050565b5f8261020857634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", +} + +// ExampleRewardCalculatorABI is the input ABI used to generate the binding from. +// Deprecated: Use ExampleRewardCalculatorMetaData.ABI instead. +var ExampleRewardCalculatorABI = ExampleRewardCalculatorMetaData.ABI + +// ExampleRewardCalculatorBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ExampleRewardCalculatorMetaData.Bin instead. +var ExampleRewardCalculatorBin = ExampleRewardCalculatorMetaData.Bin + +// DeployExampleRewardCalculator deploys a new Ethereum contract, binding an instance of ExampleRewardCalculator to it. +func DeployExampleRewardCalculator(auth *bind.TransactOpts, backend bind.ContractBackend, rewardBasisPoints_ uint64) (common.Address, *types.Transaction, *ExampleRewardCalculator, error) { + parsed, err := ExampleRewardCalculatorMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ExampleRewardCalculatorBin), backend, rewardBasisPoints_) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ExampleRewardCalculator{ExampleRewardCalculatorCaller: ExampleRewardCalculatorCaller{contract: contract}, ExampleRewardCalculatorTransactor: ExampleRewardCalculatorTransactor{contract: contract}, ExampleRewardCalculatorFilterer: ExampleRewardCalculatorFilterer{contract: contract}}, nil +} + +// ExampleRewardCalculator is an auto generated Go binding around an Ethereum contract. +type ExampleRewardCalculator struct { + ExampleRewardCalculatorCaller // Read-only binding to the contract + ExampleRewardCalculatorTransactor // Write-only binding to the contract + ExampleRewardCalculatorFilterer // Log filterer for contract events +} + +// ExampleRewardCalculatorCaller is an auto generated read-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ExampleRewardCalculatorFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ExampleRewardCalculatorSession struct { + Contract *ExampleRewardCalculator // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ExampleRewardCalculatorCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ExampleRewardCalculatorCallerSession struct { + Contract *ExampleRewardCalculatorCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ExampleRewardCalculatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ExampleRewardCalculatorTransactorSession struct { + Contract *ExampleRewardCalculatorTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ExampleRewardCalculatorRaw is an auto generated low-level Go binding around an Ethereum contract. +type ExampleRewardCalculatorRaw struct { + Contract *ExampleRewardCalculator // Generic contract binding to access the raw methods on +} + +// ExampleRewardCalculatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorCallerRaw struct { + Contract *ExampleRewardCalculatorCaller // Generic read-only contract binding to access the raw methods on +} + +// ExampleRewardCalculatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorTransactorRaw struct { + Contract *ExampleRewardCalculatorTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewExampleRewardCalculator creates a new instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculator(address common.Address, backend bind.ContractBackend) (*ExampleRewardCalculator, error) { + contract, err := bindExampleRewardCalculator(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ExampleRewardCalculator{ExampleRewardCalculatorCaller: ExampleRewardCalculatorCaller{contract: contract}, ExampleRewardCalculatorTransactor: ExampleRewardCalculatorTransactor{contract: contract}, ExampleRewardCalculatorFilterer: ExampleRewardCalculatorFilterer{contract: contract}}, nil +} + +// NewExampleRewardCalculatorCaller creates a new read-only instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorCaller(address common.Address, caller bind.ContractCaller) (*ExampleRewardCalculatorCaller, error) { + contract, err := bindExampleRewardCalculator(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorCaller{contract: contract}, nil +} + +// NewExampleRewardCalculatorTransactor creates a new write-only instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorTransactor(address common.Address, transactor bind.ContractTransactor) (*ExampleRewardCalculatorTransactor, error) { + contract, err := bindExampleRewardCalculator(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorTransactor{contract: contract}, nil +} + +// NewExampleRewardCalculatorFilterer creates a new log filterer instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorFilterer(address common.Address, filterer bind.ContractFilterer) (*ExampleRewardCalculatorFilterer, error) { + contract, err := bindExampleRewardCalculator(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorFilterer{contract: contract}, nil +} + +// bindExampleRewardCalculator binds a generic wrapper to an already deployed contract. +func bindExampleRewardCalculator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ExampleRewardCalculatorMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ExampleRewardCalculator.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.contract.Transact(opts, method, params...) +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) SECONDSINYEAR(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "SECONDS_IN_YEAR") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) SECONDSINYEAR() (*big.Int, error) { + return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINYEAR() (*big.Int, error) { + return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) +} + +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, startTime, endTime, arg3, arg4) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +} + +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) RewardBasisPoints(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "rewardBasisPoints") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) RewardBasisPoints() (uint64, error) { + return _ExampleRewardCalculator.Contract.RewardBasisPoints(&_ExampleRewardCalculator.CallOpts) +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) RewardBasisPoints() (uint64, error) { + return _ExampleRewardCalculator.Contract.RewardBasisPoints(&_ExampleRewardCalculator.CallOpts) +} diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 417ebce75..24b9a52d7 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161452538038061452583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143d88061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613a91565b610389565b005b348015610134575f80fd5b50610127610143366004613acc565b61046b565b348015610153575f80fd5b50610127610162366004613b07565b6108f6565b348015610172575f80fd5b506101b1610181366004613b07565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613b07565b610a52565b3480156101ee575f80fd5b506102026101fd366004613b07565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613b1e565b610ad5565b348015610244575f80fd5b50610127610253366004613b37565b610b00565b348015610263575f80fd5b506101b1610272366004613b75565b610cf1565b348015610282575f80fd5b50610202610291366004613b07565b610d0a565b3480156102a1575f80fd5b506101276102b0366004613b07565b610d1e565b3480156102c0575f80fd5b506101276102cf366004613acc565b610d8b565b3480156102df575f80fd5b506101276102ee366004613b37565b610da6565b3480156102fe575f80fd5b5061012761030d366004613b1e565b610fd5565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613b07565b611192565b6101b1610371366004613b07565b611261565b6101b1610384366004613c20565b61126d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611291565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061432c8339815191529184156104bd576104ba82856112a5565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613cb2565b600481111561050057610500613cb2565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613cb2565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f8051602061434c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f8051602061434c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f61064884611541565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613cb2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610767856115b5565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613cda565b90506107ff8682611694565b5f61080b8785846116dc565b5f8c815260058a01602052604090209091506108278282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613e5f565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613e91565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061436c83398151915292919061093e90613d01565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613cb2565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613ea8565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613e91565b505050565b610a5b816118f9565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061432c833981519152916005600160991b019163ee5b48eb91610a0d91600401613ea8565b5f610acf64e8d4a5100083613f46565b92915050565b5f610adf826119c8565b9050610afc81606001516001600160401b03168260400151611d55565b5050565b5f8051602061432c8339815191525f610b1884611d68565b90505f80610b298360400151611f49565b5091509150610b3785612184565b5f8581526004850160205260408120610b4f916139fe565b5f610b59836115b5565b9050816001600160401b031681608001516001600160401b03161015610b915760405162461bcd60e51b81526004016105d090613f59565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bd65760405162461bcd60e51b81526004016105d090613f9b565b60015f87815260038701602052604090205460ff166004811115610bfc57610bfc613cb2565b14610c655760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000613fe4565b5f610d14826115b5565b60a0015192915050565b610d2781612184565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061432c833981519152916005600160991b019163ee5b48eb91610a0d91600401613ea8565b8115610d9d57610d9b83826112a5565b505b610a4d8361225d565b5f8051602061432c8339815191525f610dbe84611d68565b90505f80610dcf8360400151611f49565b5091509150610ddd856118f9565b5f8581526005850160205260408120610df5916139fe565b5f610dff836115b5565b9050816001600160401b031681608001516001600160401b03161015610e375760405162461bcd60e51b81526004016105d090613f59565b5f8681526003808701602052604090912001546001600160401b0380841691161115610e755760405162461bcd60e51b81526004016105d090613f9b565b60035f87815260038701602052604090205460ff166004811115610e9b57610e9b613cb2565b14610eef5760405162461bcd60e51b815260206004820152603160248201525f8051602061434c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f939190611d55565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061436c8339815191525f610fed83611d68565b90505f80610ffe8360400151612615565b91509150806110605760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f8281526005850160205260408120805461107a90613d01565b90501180156110ac575060015f83815260078601602052604090205460ff1660058111156110aa576110aa613cb2565b145b6110c85760405162461bcd60e51b81526004016105d090613ffb565b5f82815260058501602052604081206110e0916139fe565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061436c8339815191529291906111da90613d01565b905011801561120c575060015f83815260078301602052604090205460ff16600581111561120a5761120a613cb2565b145b6112285760405162461bcd60e51b81526004016105d090613ffb565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613ea8565b5f610acf8233346127b6565b5f8061127834612b6e565b905061128685828686612c18565b9150505b9392505050565b61129961306d565b6112a2816130b8565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112f0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113179190810190614061565b915091508061137a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e19190613e91565b8251146114455760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b0316156114bb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f806114ca84604001516130fb565b915091508187146115375760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f805160206143ac8339815191526020526040812060030180545f8051602061436c833981519152916001600160401b039091169081908461158683614133565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115bd613a35565b5f8281525f805160206143ac8339815191526020526040908190208151610100810190925280545f8051602061436c833981519152929190829060ff16600581111561160b5761160b613cb2565b600581111561161c5761161c613cb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206143ac833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561175557611715816001614158565b611720906008613fe4565b5081515f908390839081106117375761173761416b565b60200101906001600160f81b03191690815f1a905350600101611701565b505f5b60048110156117b85761176c816003614158565b611777906008613fe4565b6001901c60f81b8261178a83600261417f565b8151811061179a5761179a61416b565b60200101906001600160f81b03191690815f1a905350600101611758565b505f5b602081101561181a576117cf81601f614158565b6117da906008613fe4565b86901c60f81b826117ec83600661417f565b815181106117fc576117fc61416b565b60200101906001600160f81b03191690815f1a9053506001016117bb565b505f5b600881101561188557611831816007614158565b61183c906008613fe4565b6001600160401b038616901c60f81b8261185783602661417f565b815181106118675761186761416b565b60200101906001600160f81b03191690815f1a90535060010161181d565b505f5b60088110156118f05761189c816007614158565b6118a7906008613fe4565b6001600160401b038516901c60f81b826118c283602e61417f565b815181106118d2576118d261416b565b60200101906001600160f81b03191690815f1a905350600101611888565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061432c83398151915292919061194190613d01565b9050118015611973575060035f83815260038301602052604090205460ff16600481111561197157611971613cb2565b145b610afc5760405162461bcd60e51b815260206004820152603360248201525f8051602061434c83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b6119d0613a35565b5f8051602061436c8339815191525f6119e884611d68565b90505f806119f98360400151612615565b915091508015611a5e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611a9057611a90613cb2565b6005811115611aa157611aa1613cb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b2857611b28613cb2565b1480611b465750600182516005811115611b4457611b44613cb2565b145b611ba55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611bba57611bba613cb2565b03611be157505f8381526006860160205260408120600491611bdc91906139fe565b611be5565b5060055b6020808301515f90815260088801909152604081205581816005811115611c0e57611c0e613cb2565b90816005811115611c2157611c21613cb2565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611c5557611c55613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d2057611d20613cb2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610afc6001600160a01b038216836132d3565b60408051606080820183525f8083526020830181905292820152905f8051602061436c8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ddd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e049190810190614061565b9150915080611e6b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611ece5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611f415760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f8351603614611f6d5760405162461bcd60e51b81526004016105d090614192565b5f805b6002811015611fbc57611f84816001614158565b611f8f906008613fe4565b61ffff16868281518110611fa557611fa561416b565b016020015160f81c901b9190911790600101611f70565b5061ffff811615611fdf5760405162461bcd60e51b81526004016105d0906141db565b5f805b600481101561203a57611ff6816003614158565b612001906008613fe4565b63ffffffff168761201383600261417f565b815181106120235761202361416b565b016020015160f81c901b9190911790600101611fe2565b5063ffffffff81166003146120615760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156120b65761207881601f614158565b612083906008613fe4565b8861208f83600661417f565b8151811061209f5761209f61416b565b016020015160f81c901b9190911790600101612064565b505f805b6008811015612115576120ce816007614158565b6120d9906008613fe4565b6001600160401b0316896120ee83602661417f565b815181106120fe576120fe61416b565b016020015160f81c901b91909117906001016120ba565b505f805b60088110156121745761212d816007614158565b612138906008613fe4565b6001600160401b03168a61214d83602e61417f565b8151811061215d5761215d61416b565b016020015160f81c901b9190911790600101612119565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061432c8339815191529291906121cc90613d01565b90501180156121fe575060015f83815260038301602052604090205460ff1660048111156121fc576121fc613cb2565b145b610afc5760405162461bcd60e51b815260206004820152603860248201525f8051602061434c83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f805160206143ac83398151915260205260408082208151610100810190925280545f8051602061436c83398151915293929190829060ff1660058111156122ab576122ab613cb2565b60058111156122bc576122bc613cb2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561234457612344613cb2565b146123a05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461241a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6124278160a00151613366565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561246b5761246b613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125378461253181611541565b5f6116dc565b5f85815260068501602052604090209091506125538282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612580908590600401613e5f565b6020604051808303815f875af115801561259c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c09190613e91565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146126385760405162461bcd60e51b81526004016105d090614192565b5f805b60028110156126875761264f816001614158565b61265a906008613fe4565b61ffff168582815181106126705761267061416b565b016020015160f81c901b919091179060010161263b565b5061ffff8116156126aa5760405162461bcd60e51b81526004016105d0906141db565b5f805b6004811015612705576126c1816003614158565b6126cc906008613fe4565b63ffffffff16866126de83600261417f565b815181106126ee576126ee61416b565b016020015160f81c901b91909117906001016126ad565b5063ffffffff811660021461272c5760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156127815761274381601f614158565b61274e906008613fe4565b8761275a83600661417f565b8151811061276a5761276a61416b565b016020015160f81c901b919091179060010161272f565b505f866026815181106127965761279661416b565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127bf613507565b5f6127c983610abf565b90505f8051602061432c8339815191525f6127e3876115b5565b90506002815160058111156127fa576127fa613cb2565b146128595760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a0015161286a9190614265565b90506128768882611694565b5f61288089611541565b90505f8989836040516020016128c89392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090506128e986613366565b5f6128f58b84866116dc565b5f83815260048801602052604090209091506129118282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061293e908590600401613e5f565b6020604051808303815f875af115801561295a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297e9190613e91565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a2d57612a2d613cb2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061128a60015f8051602061438c83398151915255565b5f5f8051602061432c8339815191528282612b8882610abf565b83549091506001600160401b03821610801590612bb257508260010154816001600160401b031611155b612c105760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612c21613507565b5f8051602061436c833981519152426001600160401b038516118015612c5b57506001600160401b038416612c59426202a30061417f565b115b612cbd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612d145760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612d825760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612de95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612df285613366565b5f80612e396040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613551565b5f82815260058601602052604090209193509150612e578282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e84908590600401613e5f565b6020604051808303815f875af1158015612ea0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ec49190613e91565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612f4657612f46613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561300783611541565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c1060015f8051602061438c83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130b657604051631afcd79f60e31b815260040160405180910390fd5b565b6130c061306d565b6130c9816138f6565b6112a2606082013560808301356130e660c0850160a08601613b75565b6130f660e0860160c08701614285565b613917565b5f808251602e1461311e5760405162461bcd60e51b81526004016105d090614192565b5f805b600281101561316d57613135816001614158565b613140906008613fe4565b61ffff168582815181106131565761315661416b565b016020015160f81c901b9190911790600101613121565b5061ffff8116156131905760405162461bcd60e51b81526004016105d0906141db565b5f805b60048110156131eb576131a7816003614158565b6131b2906008613fe4565b63ffffffff16866131c483600261417f565b815181106131d4576131d461416b565b016020015160f81c901b9190911790600101613193565b5063ffffffff81166004146132125760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156132675761322981601f614158565b613234906008613fe4565b8761324083600661417f565b815181106132505761325061416b565b016020015160f81c901b9190911790600101613215565b505f805b60088110156132c65761327f816007614158565b61328a906008613fe4565b6001600160401b03168861329f83602661417f565b815181106132af576132af61416b565b016020015160f81c901b919091179060010161326b565b5090969095509350505050565b804710156132f65760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461333f576040519150601f19603f3d011682016040523d82523d5f602084013e613344565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061436c8339815191529060ff165f036133a4575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133ec9083614158565b10613408576001600160401b0384166040830152808252613427565b838260400181815161341a9190614265565b6001600160401b03169052505b5f82602001518360400151606461343e91906142a0565b61344891906142cb565b600285015490915060ff90811690821611156134c35760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061438c83398151915280546001190161353857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061438c83398151915255565b5f60608260800151516030146135bb5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613632576135f2816001614158565b6135fd906008613fe4565b5081515f908390839081106136145761361461416b565b60200101906001600160f81b03191690815f1a9053506001016135de565b505f5b600481101561369057613649816003614158565b613654906008613fe4565b505f8261366283600261417f565b815181106136725761367261416b565b60200101906001600160f81b03191690815f1a905350600101613635565b505f5b60208110156136ed57845181602081106136af576136af61416b565b1a60f81b826136bf83600661417f565b815181106136cf576136cf61416b565b60200101906001600160f81b03191690815f1a905350600101613693565b505f5b602081101561374d578460200151816020811061370f5761370f61416b565b1a60f81b8261371f83602661417f565b8151811061372f5761372f61416b565b60200101906001600160f81b03191690815f1a9053506001016136f0565b505f5b60088110156137c157613764816007614158565b61376f906008613fe4565b60ff1685604001516001600160401b0316901c60f81b82826046613793919061417f565b815181106137a3576137a361416b565b60200101906001600160f81b03191690815f1a905350600101613750565b505f5b603081101561382c57846080015181815181106137e3576137e361416b565b01602001516001600160f81b031916826137fe83604e61417f565b8151811061380e5761380e61416b565b60200101906001600160f81b03191690815f1a9053506001016137c4565b505f5b600881101561389e57613843816007614158565b61384e906008613fe4565b60608601516001600160401b0390811691161c60f81b8261387083607e61417f565b815181106138805761388061416b565b60200101906001600160f81b03191690815f1a90535060010161382f565b506002816040516138af91906142f0565b602060405180830381855afa1580156138ca573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138ed9190613e91565b94909350915050565b6138fe61306d565b613906613972565b61390e613982565b6112a28161398a565b61391f61306d565b5f5f8051602061432c833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61397a61306d565b6130b66139f6565b6130b661306d565b61399261306d565b80355f8051602061436c83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139dc606083016040840161430b565b600291909101805460ff191660ff90921691909117905550565b61353e61306d565b508054613a0a90613d01565b5f825580601f10613a19575050565b601f0160209004905f5260205f20908101906112a29190613a79565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613a8d575f8155600101613a7a565b5090565b5f60e08284031215613aa1575f80fd5b50919050565b80151581146112a2575f80fd5b803563ffffffff81168114613ac7575f80fd5b919050565b5f805f60608486031215613ade575f80fd5b833592506020840135613af081613aa7565b9150613afe60408501613ab4565b90509250925092565b5f60208284031215613b17575f80fd5b5035919050565b5f60208284031215613b2e575f80fd5b61128a82613ab4565b5f8060408385031215613b48575f80fd5b613b5183613ab4565b946020939093013593505050565b80356001600160401b0381168114613ac7575f80fd5b5f60208284031215613b85575f80fd5b61128a82613b5f565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bc457613bc4613b8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613bf257613bf2613b8e565b604052919050565b5f6001600160401b03821115613c1257613c12613b8e565b50601f01601f191660200190565b5f805f60608486031215613c32575f80fd5b83359250613c4260208501613b5f565b915060408401356001600160401b03811115613c5c575f80fd5b8401601f81018613613c6c575f80fd5b8035613c7f613c7a82613bfa565b613bca565b818152876020838501011115613c93575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613cfa57613cfa613cc6565b5092915050565b600181811c90821680613d1557607f821691505b602082108103613aa157634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613d585750805b601f840160051c820191505b81811015613d77575f8155600101613d64565b5050505050565b81516001600160401b03811115613d9757613d97613b8e565b613dab81613da58454613d01565b84613d33565b602080601f831160018114613dde575f8415613dc75750858301515b5f19600386901b1c1916600185901b178555613e35565b5f85815260208120601f198616915b82811015613e0c57888601518255948401946001909101908401613ded565b5085821015613e2957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613e57578181015183820152602001613e3f565b50505f910152565b602081525f8251806020840152613e7d816040850160208701613e3d565b601f01601f19169190910160400192915050565b5f60208284031215613ea1575f80fd5b5051919050565b5f60208083525f8454613eba81613d01565b806020870152604060018084165f8114613edb5760018114613ef757613f24565b60ff19851660408a0152604084151560051b8a01019550613f24565b895f5260205f205f5b85811015613f1b5781548b8201860152908301908801613f00565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613f5457613f54613f32565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613cc6565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b03811681146112a2575f80fd5b8051613ac781613aa7565b5f8060408385031215614072575f80fd5b82516001600160401b0380821115614088575f80fd5b908401906060828703121561409b575f80fd5b6140a3613ba2565b825181526020808401516140b681614042565b828201526040840151838111156140cb575f80fd5b80850194505087601f8501126140df575f80fd5b835192506140ef613c7a84613bfa565b8381528882858701011115614102575f80fd5b61411184838301848801613e3d565b80604084015250819550614126818801614056565b9450505050509250929050565b5f6001600160401b0380831681810361414e5761414e613cc6565b6001019392505050565b81810381811115610acf57610acf613cc6565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613cc6565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613cfa57613cfa613cc6565b5f60208284031215614295575f80fd5b813561128a81614042565b6001600160401b038181168382160280821691908281146142c3576142c3613cc6565b505092915050565b5f6001600160401b03808416806142e4576142e4613f32565b92169190910492915050565b5f8251614301818460208701613e3d565b9190910192915050565b5f6020828403121561431b575f80fd5b813560ff8116811461128a575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161469838038061469883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61454b8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613c04565b610389565b005b348015610134575f80fd5b50610127610143366004613c3f565b61046b565b348015610153575f80fd5b50610127610162366004613c7a565b6108f6565b348015610172575f80fd5b506101b1610181366004613c7a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613c7a565b610a52565b3480156101ee575f80fd5b506102026101fd366004613c7a565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613c91565b610ad5565b348015610244575f80fd5b50610127610253366004613caa565b610bc1565b348015610263575f80fd5b506101b1610272366004613ce8565b610db2565b348015610282575f80fd5b50610202610291366004613c7a565b610dcb565b3480156102a1575f80fd5b506101276102b0366004613c7a565b610ddf565b3480156102c0575f80fd5b506101276102cf366004613c3f565b610e4c565b3480156102df575f80fd5b506101276102ee366004613caa565b610e67565b3480156102fe575f80fd5b5061012761030d366004613c91565b611144565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613c7a565b611301565b6101b1610371366004613c7a565b6113d0565b6101b1610384366004613d93565b6113dc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611400565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061449f8339815191529184156104bd576104ba8285611414565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613e25565b600481111561050057610500613e25565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613e25565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206144bf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206144bf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f610648846116b0565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613e25565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076785611724565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613e4d565b90506107ff8682611803565b5f61080b87858461184b565b5f8c815260058a01602052604090209091506108278282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613fd2565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190614004565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206144df83398151915292919061093e90613e74565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613e25565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d919060040161401b565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190614004565b505050565b610a5b81611a68565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061449f833981519152916005600160991b019163ee5b48eb91610a0d9160040161401b565b5f610acf64e8d4a51000836140b9565b92915050565b5f610adf82611b3b565b90505f5f8051602061449f833981519152600281015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f6064820181905260848201819052929350600160401b9091046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610b7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9e9190614004565b9050610bbb83606001516001600160401b03168460400151611ec8565b50505050565b5f8051602061449f8339815191525f610bd984611edb565b90505f80610bea83604001516120bc565b5091509150610bf8856122f7565b5f8581526004850160205260408120610c1091613b71565b5f610c1a83611724565b9050816001600160401b031681608001516001600160401b03161015610c525760405162461bcd60e51b81526004016105d0906140cc565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610c975760405162461bcd60e51b81526004016105d09061410e565b60015f87815260038701602052604090205460ff166004811115610cbd57610cbd613e25565b14610d265760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000614157565b5f610dd582611724565b60a0015192915050565b610de8816122f7565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061449f833981519152916005600160991b019163ee5b48eb91610a0d9160040161401b565b8115610e5e57610e5c8382611414565b505b610a4d836123d0565b5f8051602061449f8339815191525f610e7f84611edb565b90505f80610e9083604001516120bc565b5091509150610e9e85611a68565b5f8581526005850160205260408120610eb691613b71565b5f610ec083611724565b9050816001600160401b031681608001516001600160401b03161015610ef85760405162461bcd60e51b81526004016105d0906140cc565b5f8681526003808701602052604090912001546001600160401b0380841691161115610f365760405162461bcd60e51b81526004016105d09061410e565b60035f87815260038701602052604090205460ff166004811115610f5c57610f5c613e25565b14610fb05760405162461bcd60e51b815260206004820152603160248201525f805160206144bf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526110549190611ec8565b60028601546060820151608083015160a0840151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f606482018190526084820181905291600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa1580156110db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ff9190614004565b9050836001600160401b031685897f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050505050565b5f805160206144df8339815191525f61115c83611edb565b90505f8061116d8360400151612788565b91509150806111cf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f828152600585016020526040812080546111e990613e74565b905011801561121b575060015f83815260078601602052604090205460ff16600581111561121957611219613e25565b145b6112375760405162461bcd60e51b81526004016105d09061416e565b5f828152600585016020526040812061124f91613b71565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206144df83398151915292919061134990613e74565b905011801561137b575060015f83815260078301602052604090205460ff16600581111561137957611379613e25565b145b6113975760405162461bcd60e51b81526004016105d09061416e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d919060040161401b565b5f610acf823334612929565b5f806113e734612ce1565b90506113f585828686612d8b565b9150505b9392505050565b6114086131e0565b6114118161322b565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561145f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261148691908101906141d4565b91509150806114e95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561152c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115509190614004565b8251146115b45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b03161561162a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f80611639846040015161326e565b915091508187146116a65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f8051602061451f8339815191526020526040812060030180545f805160206144df833981519152916001600160401b03909116908190846116f5836142a6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61172c613ba8565b5f8281525f8051602061451f8339815191526020526040908190208151610100810190925280545f805160206144df833981519152929190829060ff16600581111561177a5761177a613e25565b600581111561178b5761178b613e25565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061451f833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118c4576118848160016142cb565b61188f906008614157565b5081515f908390839081106118a6576118a66142de565b60200101906001600160f81b03191690815f1a905350600101611870565b505f5b6004811015611927576118db8160036142cb565b6118e6906008614157565b6001901c60f81b826118f98360026142f2565b81518110611909576119096142de565b60200101906001600160f81b03191690815f1a9053506001016118c7565b505f5b60208110156119895761193e81601f6142cb565b611949906008614157565b86901c60f81b8261195b8360066142f2565b8151811061196b5761196b6142de565b60200101906001600160f81b03191690815f1a90535060010161192a565b505f5b60088110156119f4576119a08160076142cb565b6119ab906008614157565b6001600160401b038616901c60f81b826119c68360266142f2565b815181106119d6576119d66142de565b60200101906001600160f81b03191690815f1a90535060010161198c565b505f5b6008811015611a5f57611a0b8160076142cb565b611a16906008614157565b6001600160401b038516901c60f81b82611a3183602e6142f2565b81518110611a4157611a416142de565b60200101906001600160f81b03191690815f1a9053506001016119f7565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061449f833981519152929190611ab090613e74565b9050118015611ae2575060035f83815260038301602052604090205460ff166004811115611ae057611ae0613e25565b145b611b375760405162461bcd60e51b815260206004820152603360248201525f805160206144bf83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b5050565b611b43613ba8565b5f805160206144df8339815191525f611b5b84611edb565b90505f80611b6c8360400151612788565b915091508015611bd15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c0357611c03613e25565b6005811115611c1457611c14613e25565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c9b57611c9b613e25565b1480611cb95750600182516005811115611cb757611cb7613e25565b145b611d185760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611d2d57611d2d613e25565b03611d5457505f8381526006860160205260408120600491611d4f9190613b71565b611d58565b5060055b6020808301515f90815260088801909152604081205581816005811115611d8157611d81613e25565b90816005811115611d9457611d94613e25565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611dc857611dc8613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e9357611e93613e25565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b611b376001600160a01b03821683613446565b60408051606080820183525f8083526020830181905292820152905f805160206144df8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7791908101906141d4565b9150915080611fde5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b82548251146120415760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b0316156120b45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f83516036146120e05760405162461bcd60e51b81526004016105d090614305565b5f805b600281101561212f576120f78160016142cb565b612102906008614157565b61ffff16868281518110612118576121186142de565b016020015160f81c901b91909117906001016120e3565b5061ffff8116156121525760405162461bcd60e51b81526004016105d09061434e565b5f805b60048110156121ad576121698160036142cb565b612174906008614157565b63ffffffff16876121868360026142f2565b81518110612196576121966142de565b016020015160f81c901b9190911790600101612155565b5063ffffffff81166003146121d45760405162461bcd60e51b81526004016105d090614391565b5f805b6020811015612229576121eb81601f6142cb565b6121f6906008614157565b886122028360066142f2565b81518110612212576122126142de565b016020015160f81c901b91909117906001016121d7565b505f805b6008811015612288576122418160076142cb565b61224c906008614157565b6001600160401b0316896122618360266142f2565b81518110612271576122716142de565b016020015160f81c901b919091179060010161222d565b505f805b60088110156122e7576122a08160076142cb565b6122ab906008614157565b6001600160401b03168a6122c083602e6142f2565b815181106122d0576122d06142de565b016020015160f81c901b919091179060010161228c565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061449f83398151915292919061233f90613e74565b9050118015612371575060015f83815260038301602052604090205460ff16600481111561236f5761236f613e25565b145b611b375760405162461bcd60e51b815260206004820152603860248201525f805160206144bf83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061451f83398151915260205260408082208151610100810190925280545f805160206144df83398151915293929190829060ff16600581111561241e5761241e613e25565b600581111561242f5761242f613e25565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124b7576124b7613e25565b146125135760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461258d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b61259a8160a001516134d9565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156125de576125de613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126aa846126a4816116b0565b5f61184b565b5f85815260068501602052604090209091506126c68282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126f3908590600401613fd2565b6020604051808303815f875af115801561270f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127339190614004565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146127ab5760405162461bcd60e51b81526004016105d090614305565b5f805b60028110156127fa576127c28160016142cb565b6127cd906008614157565b61ffff168582815181106127e3576127e36142de565b016020015160f81c901b91909117906001016127ae565b5061ffff81161561281d5760405162461bcd60e51b81526004016105d09061434e565b5f805b6004811015612878576128348160036142cb565b61283f906008614157565b63ffffffff16866128518360026142f2565b81518110612861576128616142de565b016020015160f81c901b9190911790600101612820565b5063ffffffff811660021461289f5760405162461bcd60e51b81526004016105d090614391565b5f805b60208110156128f4576128b681601f6142cb565b6128c1906008614157565b876128cd8360066142f2565b815181106128dd576128dd6142de565b016020015160f81c901b91909117906001016128a2565b505f86602681518110612909576129096142de565b016020015191976001600160f81b03199092161515965090945050505050565b5f61293261367a565b5f61293c83610abf565b90505f8051602061449f8339815191525f61295687611724565b905060028151600581111561296d5761296d613e25565b146129cc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516129dd91906143d8565b90506129e98882611803565b5f6129f3896116b0565b90505f898983604051602001612a3b9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612a5c866134d9565b5f612a688b848661184b565b5f8381526004880160205260409020909150612a848282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ab1908590600401613fd2565b6020604051808303815f875af1158015612acd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af19190614004565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612ba057612ba0613e25565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506113f960015f805160206144ff83398151915255565b5f5f8051602061449f8339815191528282612cfb82610abf565b83549091506001600160401b03821610801590612d2557508260010154816001600160401b031611155b612d835760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612d9461367a565b5f805160206144df833981519152426001600160401b038516118015612dce57506001600160401b038416612dcc426202a3006142f2565b115b612e305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612e875760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612ef55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612f5c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612f65856134d9565b5f80612fac6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506136c4565b5f82815260058601602052604090209193509150612fca8282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ff7908590600401613fd2565b6020604051808303815f875af1158015613013573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130379190614004565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff191660018360058111156130b9576130b9613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561317a836116b0565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612d8360015f805160206144ff83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661322957604051631afcd79f60e31b815260040160405180910390fd5b565b6132336131e0565b61323c81613a69565b6114116060820135608083013561325960c0850160a08601613ce8565b61326960e0860160c087016143f8565b613a8a565b5f808251602e146132915760405162461bcd60e51b81526004016105d090614305565b5f805b60028110156132e0576132a88160016142cb565b6132b3906008614157565b61ffff168582815181106132c9576132c96142de565b016020015160f81c901b9190911790600101613294565b5061ffff8116156133035760405162461bcd60e51b81526004016105d09061434e565b5f805b600481101561335e5761331a8160036142cb565b613325906008614157565b63ffffffff16866133378360026142f2565b81518110613347576133476142de565b016020015160f81c901b9190911790600101613306565b5063ffffffff81166004146133855760405162461bcd60e51b81526004016105d090614391565b5f805b60208110156133da5761339c81601f6142cb565b6133a7906008614157565b876133b38360066142f2565b815181106133c3576133c36142de565b016020015160f81c901b9190911790600101613388565b505f805b6008811015613439576133f28160076142cb565b6133fd906008614157565b6001600160401b0316886134128360266142f2565b81518110613422576134226142de565b016020015160f81c901b91909117906001016133de565b5090969095509350505050565b804710156134695760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146134b2576040519150601f19603f3d011682016040523d82523d5f602084013e6134b7565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206144df8339815191529060ff165f03613517575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061355f90836142cb565b1061357b576001600160401b038416604083015280825261359a565b838260400181815161358d91906143d8565b6001600160401b03169052505b5f8260200151836040015160646135b19190614413565b6135bb919061443e565b600285015490915060ff90811690821611156136365760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206144ff8339815191528054600119016136ab57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206144ff83398151915255565b5f606082608001515160301461372e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137a5576137658160016142cb565b613770906008614157565b5081515f90839083908110613787576137876142de565b60200101906001600160f81b03191690815f1a905350600101613751565b505f5b6004811015613803576137bc8160036142cb565b6137c7906008614157565b505f826137d58360026142f2565b815181106137e5576137e56142de565b60200101906001600160f81b03191690815f1a9053506001016137a8565b505f5b60208110156138605784518160208110613822576138226142de565b1a60f81b826138328360066142f2565b81518110613842576138426142de565b60200101906001600160f81b03191690815f1a905350600101613806565b505f5b60208110156138c05784602001518160208110613882576138826142de565b1a60f81b826138928360266142f2565b815181106138a2576138a26142de565b60200101906001600160f81b03191690815f1a905350600101613863565b505f5b6008811015613934576138d78160076142cb565b6138e2906008614157565b60ff1685604001516001600160401b0316901c60f81b8282604661390691906142f2565b81518110613916576139166142de565b60200101906001600160f81b03191690815f1a9053506001016138c3565b505f5b603081101561399f5784608001518181518110613956576139566142de565b01602001516001600160f81b0319168261397183604e6142f2565b81518110613981576139816142de565b60200101906001600160f81b03191690815f1a905350600101613937565b505f5b6008811015613a11576139b68160076142cb565b6139c1906008614157565b60608601516001600160401b0390811691161c60f81b826139e383607e6142f2565b815181106139f3576139f36142de565b60200101906001600160f81b03191690815f1a9053506001016139a2565b50600281604051613a229190614463565b602060405180830381855afa158015613a3d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a609190614004565b94909350915050565b613a716131e0565b613a79613ae5565b613a81613af5565b61141181613afd565b613a926131e0565b5f5f8051602061449f833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613aed6131e0565b613229613b69565b6132296131e0565b613b056131e0565b80355f805160206144df83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b4f606083016040840161447e565b600291909101805460ff191660ff90921691909117905550565b6136b16131e0565b508054613b7d90613e74565b5f825580601f10613b8c575050565b601f0160209004905f5260205f20908101906114119190613bec565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c00575f8155600101613bed565b5090565b5f60e08284031215613c14575f80fd5b50919050565b8015158114611411575f80fd5b803563ffffffff81168114613c3a575f80fd5b919050565b5f805f60608486031215613c51575f80fd5b833592506020840135613c6381613c1a565b9150613c7160408501613c27565b90509250925092565b5f60208284031215613c8a575f80fd5b5035919050565b5f60208284031215613ca1575f80fd5b6113f982613c27565b5f8060408385031215613cbb575f80fd5b613cc483613c27565b946020939093013593505050565b80356001600160401b0381168114613c3a575f80fd5b5f60208284031215613cf8575f80fd5b6113f982613cd2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d3757613d37613d01565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d6557613d65613d01565b604052919050565b5f6001600160401b03821115613d8557613d85613d01565b50601f01601f191660200190565b5f805f60608486031215613da5575f80fd5b83359250613db560208501613cd2565b915060408401356001600160401b03811115613dcf575f80fd5b8401601f81018613613ddf575f80fd5b8035613df2613ded82613d6d565b613d3d565b818152876020838501011115613e06575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e6d57613e6d613e39565b5092915050565b600181811c90821680613e8857607f821691505b602082108103613c1457634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613ecb5750805b601f840160051c820191505b81811015613eea575f8155600101613ed7565b5050505050565b81516001600160401b03811115613f0a57613f0a613d01565b613f1e81613f188454613e74565b84613ea6565b602080601f831160018114613f51575f8415613f3a5750858301515b5f19600386901b1c1916600185901b178555613fa8565b5f85815260208120601f198616915b82811015613f7f57888601518255948401946001909101908401613f60565b5085821015613f9c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613fca578181015183820152602001613fb2565b50505f910152565b602081525f8251806020840152613ff0816040850160208701613fb0565b601f01601f19169190910160400192915050565b5f60208284031215614014575f80fd5b5051919050565b5f60208083525f845461402d81613e74565b806020870152604060018084165f811461404e576001811461406a57614097565b60ff19851660408a0152604084151560051b8a01019550614097565b895f5260205f205f5b8581101561408e5781548b8201860152908301908801614073565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826140c7576140c76140a5565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613e39565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611411575f80fd5b8051613c3a81613c1a565b5f80604083850312156141e5575f80fd5b82516001600160401b03808211156141fb575f80fd5b908401906060828703121561420e575f80fd5b614216613d15565b82518152602080840151614229816141b5565b8282015260408401518381111561423e575f80fd5b80850194505087601f850112614252575f80fd5b83519250614262613ded84613d6d565b8381528882858701011115614275575f80fd5b61428484838301848801613fb0565b806040840152508195506142998188016141c9565b9450505050509250929050565b5f6001600160401b038083168181036142c1576142c1613e39565b6001019392505050565b81810381811115610acf57610acf613e39565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613e39565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613e6d57613e6d613e39565b5f60208284031215614408575f80fd5b81356113f9816141b5565b6001600160401b0381811683821602808216919082811461443657614436613e39565b505092915050565b5f6001600160401b0380841680614457576144576140a5565b92169190910492915050565b5f8251614474818460208701613fb0565b9190910192915050565b5f6020828403121561448e575f80fd5b813560ff811681146113f9575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 046dce5c1..27145e00f 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -123,4 +123,9 @@ contract ERC20TokenStakingManager is function _unlock(uint256 value, address to) internal virtual override { _getERC20StakingManagerStorage()._token.safeTransfer(to, value); } + + function _reward(address account, uint256 amount) internal virtual override { + ERC20TokenStakingManagerStorage storage $ = _getERC20StakingManagerStorage(); + $._token.mint(account, amount); + } } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 8763d0e7f..9b1443a84 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -82,4 +82,9 @@ contract NativeTokenStakingManager is function _unlock(uint256 value, address to) internal virtual override { payable(to).sendValue(value); } + + // solhint-disable-next-line no-empty-blocks + function _reward(address account, uint256 amount) internal virtual override { + // TODO: call the native minter precompile to mint `amount` for `account` + } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 20e61e03a..302c1da6d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -98,6 +98,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function completeEndValidation(uint32 messageIndex) external { Validator memory validator = _completeEndValidation(messageIndex); + + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + uint256 rewardAmount = $._rewardCalculator.calculateReward( + validator.weight, validator.startedAt, validator.endedAt, 0, 0 + ); + + _reward(validator.owner, rewardAmount); + _unlock(validator.startingWeight, validator.owner); } @@ -356,7 +364,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Delegator memory delegator = $._delegatorStakes[delegationID]; _unlock(delegator.weight, delegator.owner); - // TODO: issue rewards + + uint256 rewardAmount = $._rewardCalculator.calculateReward( + delegator.weight, delegator.startedAt, delegator.endedAt, 0, 0 + ); + _reward(delegator.owner, rewardAmount); emit DelegationEnded(delegationID, validationID, nonce); } @@ -378,4 +390,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: delegation registration not pending" ); } + + function _reward(address account, uint256 amount) internal virtual; } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index ea5ddebdb..b6970f91e 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -9,7 +9,7 @@ import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; -import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {ExampleERC20} from "@mocks/ExampleERC20.sol"; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; @@ -23,11 +23,13 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ERC20TokenStakingManager public app; IERC20Mintable public token; + ExampleRewardCalculator public rewardCalculator; function setUp() public virtual { // Construct the object under test app = new ERC20TokenStakingManager(ICMInitializable.Allowed); token = new ExampleERC20(); + rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -38,7 +40,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - rewardCalculator: IRewardCalculator(address(0)) + rewardCalculator: rewardCalculator }), token ); @@ -84,6 +86,10 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(address(token), abi.encodeCall(IERC20.transfer, (account, amount))); } + function _expectRewardIssuance(address account, uint256 amount) internal override { + vm.expectCall(address(token), abi.encodeCall(IERC20Mintable.mint, (account, amount))); + } + function _getStakeAssetBalance(address account) internal view override returns (uint256) { return token.balanceOf(account); } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 467ed85f8..536e299a5 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -10,6 +10,7 @@ import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; import {ValidatorManagerSettings} from "../interfaces/IValidatorManager.sol"; import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; +import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; // TODO: Remove this once all unit tests implemented @@ -30,13 +31,25 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - rewardCalculator: IRewardCalculator(address(0)) + rewardCalculator: IRewardCalculator(new ExampleRewardCalculator(DEFAULT_REWARD_RATE)) }) ); validatorManager = app; posValidatorManager = app; } + function testCompleteEndValidation() public override { + // TODO: get native token staking rewards working, then remove this + // method and let the implementation in PosValidatorManagerTests do the + // test, and remove the `virtual` modifier from that implementation. + } + + function testCompleteEndDelegation() public override { + // TODO: get native token staking rewards working, then remove this + // method and let the implementation in PosValidatorManagerTests do the + // test, and remove the `virtual` modifier from that implementation. + } + // Helpers function _initializeValidatorRegistration( bytes32 nodeID, @@ -69,6 +82,8 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(account, amount, ""); } + function _expectRewardIssuance(address account, uint256 amount) internal override {} + function _getStakeAssetBalance(address account) internal view override returns (uint256) { return account.balance; } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 5e99fa2bc..7629c6343 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -21,6 +21,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP = uint64(4000); address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); + uint64 public constant DEFAULT_REWARD_RATE = uint64(10); PoSValidatorManager public posValidatorManager; @@ -371,14 +372,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.resendEndDelegation(delegationID); } - function testCompleteEndDelegation() public { + function testCompleteEndDelegation() public virtual { + uint256 registrationDuration = 1000 * 60 * 60 * 24; // 1 day + + uint256 registrationExpiry = vm.getBlockTimestamp() + registrationDuration; + bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, + registrationExpiry: uint64(registrationExpiry), blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + registrationTimestamp: uint64(registrationExpiry) }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, @@ -388,32 +393,34 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); - _setUpCompleteDelegatorRegistration( - validationID, - delegationID, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + _setUpCompleteDelegatorRegistration({ + validationID: validationID, + delegationID: delegationID, + completeRegistrationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); _setUpInitializeEndDelegation({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, - endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + endDelegationTimestamp: uint64(registrationExpiry), expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 }); address delegator = DEFAULT_DELEGATOR_ADDRESS; uint256 balanceBefore = _getStakeAssetBalance(delegator); + uint256 expectedReward = DEFAULT_DELEGATOR_WEIGHT * DEFAULT_REWARD_RATE / 365; _expectStakeUnlock(delegator, DEFAULT_DELEGATOR_WEIGHT); + _expectRewardIssuance(delegator, expectedReward); _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2); uint256 balanceChange = _getStakeAssetBalance(delegator) - balanceBefore; require( - balanceChange >= DEFAULT_DELEGATOR_WEIGHT, - "delegator should have received their stake back" + balanceChange == DEFAULT_DELEGATOR_WEIGHT + expectedReward, + "delegator should have received their stake back and been rewarded" ); } @@ -557,25 +564,35 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _setUpCompleteEndDelegation(validationID, delegationID1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); } - function testCompleteEndValidation() public override { + function testCompleteEndValidation() public virtual override { + uint256 registrationDuration = 1000 * 60 * 60 * 24; // 1 day + + uint256 registrationExpiry = vm.getBlockTimestamp() + registrationDuration; + bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, + registrationExpiry: uint64(registrationExpiry), blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: uint64(registrationExpiry) }); uint256 balanceBefore = _getStakeAssetBalance(address(this)); + uint256 expectedReward = DEFAULT_WEIGHT * DEFAULT_REWARD_RATE / 365 - 1; + _expectStakeUnlock(address(this), DEFAULT_WEIGHT); + _expectRewardIssuance(address(this), expectedReward); _testCompleteEndValidation(validationID); uint256 balanceChange = _getStakeAssetBalance(address(this)) - balanceBefore; - require(balanceChange == DEFAULT_WEIGHT, "validator should have received their stake back"); + require( + balanceChange == DEFAULT_WEIGHT + expectedReward, + "validator should have received their stake back and been rewarded" + ); } function testValueToWeight() public view { @@ -713,6 +730,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _getStakeAssetBalance(address account) internal virtual returns (uint256); function _expectStakeUnlock(address account, uint256 amount) internal virtual; + function _expectRewardIssuance(address account, uint256 amount) internal virtual; function _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { return abi.encodePacked("PoSValidatorManager: ", errorMessage); diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index 2b91a7405..a4cbc1338 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -16,7 +16,7 @@ export ARCH=$(uname -m) [ $ARCH = x86_64 ] && ARCH=amd64 echo "ARCH set to $ARCH" -DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager PoAValidatorManager" +DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 ExampleRewardCalculator TestMessenger ValidatorSetSig NativeTokenStakingManager ERC20TokenStakingManager PoAValidatorManager" PROXY_LIST="TransparentUpgradeableProxy ProxyAdmin" diff --git a/tests/flows/governance/validator_set_sig.go b/tests/flows/governance/validator_set_sig.go index 8a3d60960..2901f1f9b 100644 --- a/tests/flows/governance/validator_set_sig.go +++ b/tests/flows/governance/validator_set_sig.go @@ -85,7 +85,7 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { // Construct a ValidatorSetSig message with mock ERC20 as the target contract // and mint 100 tokens as the TxPayload - callData, err := erc20ABI.Pack("mint", big.NewInt(100)) + callData, err := erc20ABI.Pack("mint", validatorSetSigContractAddress, big.NewInt(100)) Expect(err).Should(BeNil()) vssMessage1 := validatorsetsig.ValidatorSetSigMessage{ @@ -99,7 +99,7 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { // Construct a second ValidatorSetSig message with mock ERC20 as the target contract // and mint 50 tokens as the TxPayload - callData2, err := erc20ABI.Pack("mint", big.NewInt(50)) + callData2, err := erc20ABI.Pack("mint", validatorSetSigContractAddress, big.NewInt(50)) Expect(err).Should(BeNil()) vssMessage2 := validatorsetsig.ValidatorSetSigMessage{ ValidatorSetSigAddress: validatorSetSigContractAddress, @@ -111,13 +111,18 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { } // Create a message for the case where validatorSetSig contract and targetContract are on the same chain. + // Construct a ValidatorSetSig message with mock ERC20 as the target contract + // and mint 100 tokens as the TxPayload + callData3, err := erc20ABI.Pack("mint", validatorSetSigContractAddress2, big.NewInt(100)) + Expect(err).Should(BeNil()) + vssMessage3 := validatorsetsig.ValidatorSetSigMessage{ ValidatorSetSigAddress: validatorSetSigContractAddress2, TargetContractAddress: exampleERC20ContractAddressB, TargetBlockchainID: subnetB.BlockchainID, Nonce: big.NewInt(0), Value: big.NewInt(0), - Payload: callData, + Payload: callData3, } // Create chain config file with off-chain validatorsetsig message diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index 367121ca0..2280e8e38 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -12,7 +12,6 @@ import ( poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/crypto" . "github.com/onsi/gomega" @@ -143,6 +142,13 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) + rewardCalculatorAddress, _ := utils.DeployExampleRewardCalculator( + ctx, + fundedKey, + subnetAInfo, + uint64(10), + ) + tx, err = posValidatorManager.Initialize( opts, nativetokenstakingmanager.PoSValidatorManagerSettings{ @@ -154,7 +160,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + RewardCalculator: rewardCalculatorAddress, }, ) Expect(err).Should(BeNil()) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 31dde39f1..6a543aa2b 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -18,6 +18,7 @@ import ( predicateutils "github.com/ava-labs/subnet-evm/predicate" exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/ERC20TokenStakingManager" + examplerewardcalculator "github.com/ava-labs/teleporter/abi-bindings/go/staking/ExampleRewardCalculator" nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" @@ -61,6 +62,12 @@ func DeployAndInitializeNativeTokenStakingManager( senderKey, subnet, ) + rewardCalculatorAddress, _ := DeployExampleRewardCalculator( + ctx, + senderKey, + subnet, + uint64(10), + ) opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.Initialize( @@ -74,7 +81,7 @@ func DeployAndInitializeNativeTokenStakingManager( MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + RewardCalculator: rewardCalculatorAddress, }, ) Expect(err).Should(BeNil()) @@ -121,6 +128,12 @@ func DeployAndInitializeERC20TokenStakingManager( ) erc20Address, erc20 := DeployExampleERC20(ctx, senderKey, subnet) + rewardCalculatorAddress, _ := DeployExampleRewardCalculator( + ctx, + senderKey, + subnet, + uint64(10), + ) opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.Initialize( @@ -134,7 +147,7 @@ func DeployAndInitializeERC20TokenStakingManager( MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + RewardCalculator: rewardCalculatorAddress, }, erc20Address, ) @@ -193,6 +206,27 @@ func DeployAndInitializePoAValidatorManager( return validatorManagerAddress, validatorManager } +func DeployExampleRewardCalculator( + ctx context.Context, + senderKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + rewardBasisPoints uint64, +) (common.Address, *examplerewardcalculator.ExampleRewardCalculator) { + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + address, tx, calculator, err := examplerewardcalculator.DeployExampleRewardCalculator( + opts, + subnet.RPCClient, + rewardBasisPoints, + ) + Expect(err).Should(BeNil()) + + // Wait for the transaction to be mined + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + + return address, calculator +} + // // Function call utils // From 1763ca2a0ce097730dbe5d2a89a62c2d55600b5b Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 10 Sep 2024 14:13:37 -0400 Subject: [PATCH 234/545] Update contracts/staking/PoSValidatorManager.sol Co-authored-by: minghinmatthewlam Signed-off-by: Geoff Stuart --- contracts/staking/PoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index c496b8b96..984028db8 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -28,7 +28,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 _minimumStakeAmount; /// @notice The maximum amount of stake allowed to be a validator. uint256 _maximumStakeAmount; - /// @notice The time at which the churn tracker will start. This is allow networks to bootstrap + /// @notice The time at which the churn tracker will start. This allows networks to bootstrap /// their validator set without worrying about churn tracking for a set period of time. uint256 _churnTrackerStartTime; /// @notice The number of seconds after which to reset the churn tracker. From c6dd4b3157615f49e7e7ee810a9a29f3b33c8635 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 10 Sep 2024 14:41:11 -0400 Subject: [PATCH 235/545] Remove churn tracker start time --- .../ERC20TokenStakingManager.go | 17 ++++---- .../NativeTokenStakingManager.go | 17 ++++---- contracts/staking/PoSValidatorManager.sol | 11 +---- .../interfaces/IPoSValidatorManager.sol | 1 - .../tests/ERC20TokenStakingManagerTests.t.sol | 1 - .../NativeTokenStakingManagerTests.t.sol | 1 - .../tests/PoSValidatorManagerTests.t.sol | 41 ++----------------- .../staking/tests/ValidatorManagerTests.t.sol | 1 - 8 files changed, 21 insertions(+), 69 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index d148a3022..b84d91bc6 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -34,7 +34,6 @@ type PoSValidatorManagerSettings struct { BaseSettings ValidatorManagerSettings MinimumStakeAmount *big.Int MaximumStakeAmount *big.Int - ChurnTrackerStartTime *big.Int ChurnPeriodSeconds uint64 MinimumStakeDuration uint64 MaximumChurnPercentage uint8 @@ -49,8 +48,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnTrackerStartTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614a6c380380614a6c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61491f8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872fda641461023e578063912de4da14610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613fb7565b6102d6565b005b610128610138366004613ff2565b610761565b61017b61014b366004613ff2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613ff2565b6108bd565b6101b46101af366004613ff2565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da366004614009565b610940565b6101286101ed366004614022565b61096b565b61017b610200366004614060565b610b5c565b6101b4610213366004613ff2565b610b75565b610128610226366004613ff2565b610b89565b610128610239366004613fb7565b610bf6565b61017b61024c36600461410b565b610c30565b61012861025f3660046141bb565b610c55565b610128610272366004614022565b610d39565b61017b6102853660046141f9565b610f69565b610128610298366004614009565b610f7c565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613ff2565b611139565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260408120600101545f80516020614873833981519152918415610328576103258285611208565b90505b5f868152600884016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614219565b600481111561036b5761036b614219565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614219565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206148938339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206148938339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b3846114a4565b600383526001600160401b0342811660a0850152811660e08401525f8981526008870160205260409020835181549293508492829060ff1916600183600481111561050057610500614219565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611518565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190614241565b905061066a86826115f7565b5f61067687858461163f565b5f8c8152600a8a016020526040902090915061069282826142eb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016143cc565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906143fe565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f805160206148b38339815191529291906107a990614268565b90501180156107db575060035f83815260048301602052604090205460ff1660058111156107d9576107d9614219565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614415565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906143fe565b505050565b6108c68161185c565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a602052604090819020905163ee5b48eb60e01b81525f80516020614873833981519152916005600160991b019163ee5b48eb9161087891600401614415565b5f61093a64e8d4a510008361449f565b92915050565b5f61094a8261192b565b905061096781606001516001600160401b03168260400151611cb9565b5050565b5f805160206148738339815191525f61098384611cef565b90505f806109948360400151611ed0565b50915091506109a28561210b565b5f85815260098501602052604081206109ba91613eff565b5f6109c483611518565b9050816001600160401b031681608001516001600160401b031610156109fc5760405162461bcd60e51b815260040161043b906144be565b5f8681526008860160205260409020600201546001600160401b03808416600160c01b909204161115610a415760405162461bcd60e51b815260040161043b90614500565b60015f87815260088701602052604090205460ff166004811115610a6757610a67614219565b14610ad05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600886016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a51000614549565b5f610b7f82611518565b60a0015192915050565b610b928161210b565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d09602052604090819020905163ee5b48eb60e01b81525f80516020614873833981519152916005600160991b019163ee5b48eb9161087891600401614415565b5f610c0084611518565b60a001519050610c0f816121e4565b8215610c2157610c1f8483611208565b505b610c2a846123c6565b50505050565b5f80610c3b86612796565b9050610c498582868661284c565b9150505b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610c9e575080546001600160401b03808416911610155b15610cbc5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ce78484612d27565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206148738339815191525f610d5184611cef565b90505f80610d628360400151611ed0565b5091509150610d708561185c565b5f858152600a850160205260408120610d8891613eff565b5f610d9283611518565b9050816001600160401b031681608001516001600160401b03161015610dca5760405162461bcd60e51b815260040161043b906144be565b5f8681526008860160205260409020600301546001600160401b0380841691161115610e085760405162461bcd60e51b815260040161043b90614500565b60035f87815260088701602052604090205460ff166004811115610e2e57610e2e614219565b14610e825760405162461bcd60e51b815260206004820152603160248201525f805160206148938339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600886016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f2791611cb9565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f75833384612d41565b9392505050565b5f805160206148b38339815191525f610f9483611cef565b90505f80610fa583604001516130fc565b91509150806110075760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f8281526002850160205260408120805461102190614268565b9050118015611053575060015f83815260048601602052604090205460ff16600581111561105157611051614219565b145b61106f5760405162461bcd60e51b815260040161043b90614560565b5f828152600285016020526040812061108791613eff565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f805160206148b383398151915292919061118190614268565b90501180156111b3575060015f83815260048301602052604090205460ff1660058111156111b1576111b1614219565b145b6111cf5760405162461bcd60e51b815260040161043b90614560565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614415565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611253573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261127a91908101906145b2565b91509150806112dd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611320573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134491906143fe565b8251146113a85760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b03161561141e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061142d846040015161329d565b9150915081871461149a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206148d38339815191526020526040812060030180545f805160206148b3833981519152916001600160401b03909116908190846114e983614684565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611520613f36565b5f8281525f805160206148d38339815191526020526040908190208151610100810190925280545f805160206148b3833981519152929190829060ff16600581111561156e5761156e614219565b600581111561157f5761157f614219565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206148d3833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116b8576116788160016146a9565b611683906008614549565b5081515f9083908390811061169a5761169a6146bc565b60200101906001600160f81b03191690815f1a905350600101611664565b505f5b600481101561171b576116cf8160036146a9565b6116da906008614549565b6001901c60f81b826116ed8360026146d0565b815181106116fd576116fd6146bc565b60200101906001600160f81b03191690815f1a9053506001016116bb565b505f5b602081101561177d5761173281601f6146a9565b61173d906008614549565b86901c60f81b8261174f8360066146d0565b8151811061175f5761175f6146bc565b60200101906001600160f81b03191690815f1a90535060010161171e565b505f5b60088110156117e8576117948160076146a9565b61179f906008614549565b6001600160401b038616901c60f81b826117ba8360266146d0565b815181106117ca576117ca6146bc565b60200101906001600160f81b03191690815f1a905350600101611780565b505f5b6008811015611853576117ff8160076146a9565b61180a906008614549565b6001600160401b038516901c60f81b8261182583602e6146d0565b81518110611835576118356146bc565b60200101906001600160f81b03191690815f1a9053506001016117eb565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020526040812080545f805160206148738339815191529291906118a490614268565b90501180156118d6575060035f83815260088301602052604090205460ff1660048111156118d4576118d4614219565b145b6109675760405162461bcd60e51b815260206004820152603360248201525f8051602061489383398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b611933613f36565b5f805160206148b38339815191525f61194b84611cef565b90505f8061195c83604001516130fc565b9150915080156119c15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600485016020526040808220815161010081019092528054829060ff1660058111156119f3576119f3614219565b6005811115611a0457611a04614219565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8b57611a8b614219565b1480611aa95750600182516005811115611aa757611aa7614219565b145b611b085760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1d57611b1d614219565b03611b4457505f8381526003860160205260408120600491611b3f9190613eff565b611b48565b5060055b6020808301515f9081526005808901909252604081205582908290811115611b7257611b72614219565b90816005811115611b8557611b85614219565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115611bb957611bb9614219565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c8457611c84614219565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610967906001600160a01b03168284613475565b60408051606080820183525f8083526020830181905292820152905f805160206148b38339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d8b91908101906145b2565b9150915080611df25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e555760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ec85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611ef45760405162461bcd60e51b815260040161043b906146e3565b5f805b6002811015611f4357611f0b8160016146a9565b611f16906008614549565b61ffff16868281518110611f2c57611f2c6146bc565b016020015160f81c901b9190911790600101611ef7565b5061ffff811615611f665760405162461bcd60e51b815260040161043b9061472c565b5f805b6004811015611fc157611f7d8160036146a9565b611f88906008614549565b63ffffffff1687611f9a8360026146d0565b81518110611faa57611faa6146bc565b016020015160f81c901b9190911790600101611f69565b5063ffffffff8116600314611fe85760405162461bcd60e51b815260040161043b9061476f565b5f805b602081101561203d57611fff81601f6146a9565b61200a906008614549565b886120168360066146d0565b81518110612026576120266146bc565b016020015160f81c901b9190911790600101611feb565b505f805b600881101561209c576120558160076146a9565b612060906008614549565b6001600160401b0316896120758360266146d0565b81518110612085576120856146bc565b016020015160f81c901b9190911790600101612041565b505f805b60088110156120fb576120b48160076146a9565b6120bf906008614549565b6001600160401b03168a6120d483602e6146d0565b815181106120e4576120e46146bc565b016020015160f81c901b91909117906001016120a0565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d096020526040812080545f8051602061487383398151915292919061215390614268565b9050118015612185575060015f83815260088301602052604090205460ff16600481111561218357612183614219565b145b6109675760405162461bcd60e51b815260206004820152603860248201525f8051602061489383398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f805160206148738339815191525f61221b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb065490565b6003830154909150600160401b900460ff161580612237575080155b1561224157505050565b6002820154429081116122545750505050565b6040805160608101825260048501548082526005860154602083015260068601546001600160401b039081169383019390935260038601549192919091169061229d90846146a9565b106122c0576001600160401b0385166040820152818152602081018390526122df565b84816040018181516122d291906147b6565b6001600160401b03169052505b5f8160200151826040015160646122f691906147d6565b6001600160401b0316612309919061449f565b600386015490915060ff600160401b909104811690821611156123875760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2063687560448201526f1c9b881c985d1948195e18d95959195960821b606482015260840161043b565b508051600485015560208101516005850155604001516006909301805467ffffffffffffffff19166001600160401b0390941693909317909255505050565b5f8181525f805160206148d383398151915260205260408082208151610100810190925280545f805160206148b383398151915293929190829060ff16600581111561241457612414614219565b600581111561242557612425614219565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124ad576124ad614219565b146125095760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146125835760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff191660018360058111156125c7576125c7614219565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126938461268d816114a4565b5f61163f565b5f85815260038501602052604090209091506126af82826142eb565b508160a001516001600160401b0316836006015f8282546126d091906146a9565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127019085906004016143cc565b6020604051808303815f875af115801561271d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061274191906143fe565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f80516020614873833981519152816127af846134d4565b90505f6127bb8261092a565b83549091506001600160401b038216108015906127e557508260010154816001600160401b031611155b6128435760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b610c4d816121e4565b5f61285561350a565b5f805160206148b3833981519152426001600160401b038516116128d75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b0384166128ee426202a3006146d0565b116129615760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b856129b85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f86815260058201602052604090205415612a265760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612a8d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b5f80612ad46040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613541565b5f82815260028601602052604090209193509150612af282826142eb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b1f9085906004016143cc565b6020604051808303815f875af1158015612b3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5f91906143fe565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff19166001836005811115612be157612be1614219565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695851695909517919091171692909217929092179055600685018054918a16915f90612cb29084906146d0565b90915550612cc19050836114a4565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610c4d60015f805160206148f383398151915255565b612d2f6138f9565b612d3882613944565b610967816139b2565b5f612d4a61350a565b5f612d576101af846134d4565b90505f805160206148738339815191525f612d7187611518565b9050600281516005811115612d8857612d88614219565b14612de75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612df891906147b6565b9050612e0488826115f7565b5f612e0e896114a4565b90505f898983604051602001612e569392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612e77866121e4565b5f612e838b848661163f565b5f8381526009880160205260409020909150612e9f82826142eb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ecc9085906004016143cc565b6020604051808303815f875af1158015612ee8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f0c91906143fe565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876008015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612fbb57612fbb614219565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610f7560015f805160206148f383398151915255565b5f80825160271461311f5760405162461bcd60e51b815260040161043b906146e3565b5f805b600281101561316e576131368160016146a9565b613141906008614549565b61ffff16858281518110613157576131576146bc565b016020015160f81c901b9190911790600101613122565b5061ffff8116156131915760405162461bcd60e51b815260040161043b9061472c565b5f805b60048110156131ec576131a88160036146a9565b6131b3906008614549565b63ffffffff16866131c58360026146d0565b815181106131d5576131d56146bc565b016020015160f81c901b9190911790600101613194565b5063ffffffff81166002146132135760405162461bcd60e51b815260040161043b9061476f565b5f805b60208110156132685761322a81601f6146a9565b613235906008614549565b876132418360066146d0565b81518110613251576132516146bc565b016020015160f81c901b9190911790600101613216565b505f8660268151811061327d5761327d6146bc565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132c05760405162461bcd60e51b815260040161043b906146e3565b5f805b600281101561330f576132d78160016146a9565b6132e2906008614549565b61ffff168582815181106132f8576132f86146bc565b016020015160f81c901b91909117906001016132c3565b5061ffff8116156133325760405162461bcd60e51b815260040161043b9061472c565b5f805b600481101561338d576133498160036146a9565b613354906008614549565b63ffffffff16866133668360026146d0565b81518110613376576133766146bc565b016020015160f81c901b9190911790600101613335565b5063ffffffff81166004146133b45760405162461bcd60e51b815260040161043b9061476f565b5f805b6020811015613409576133cb81601f6146a9565b6133d6906008614549565b876133e28360066146d0565b815181106133f2576133f26146bc565b016020015160f81c901b91909117906001016133b7565b505f805b6008811015613468576134218160076146a9565b61342c906008614549565b6001600160401b0316886134418360266146d0565b81518110613451576134516146bc565b016020015160f81c901b919091179060010161340d565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613a66565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613ac7565b5f805160206148f383398151915280546001190161353b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135ab5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613622576135e28160016146a9565b6135ed906008614549565b5081515f90839083908110613604576136046146bc565b60200101906001600160f81b03191690815f1a9053506001016135ce565b505f5b6004811015613680576136398160036146a9565b613644906008614549565b505f826136528360026146d0565b81518110613662576136626146bc565b60200101906001600160f81b03191690815f1a905350600101613625565b505f5b60208110156136dd578451816020811061369f5761369f6146bc565b1a60f81b826136af8360066146d0565b815181106136bf576136bf6146bc565b60200101906001600160f81b03191690815f1a905350600101613683565b505f5b602081101561373d57846020015181602081106136ff576136ff6146bc565b1a60f81b8261370f8360266146d0565b8151811061371f5761371f6146bc565b60200101906001600160f81b03191690815f1a9053506001016136e0565b505f5b60088110156137b1576137548160076146a9565b61375f906008614549565b60ff1685604001516001600160401b0316901c60f81b8282604661378391906146d0565b81518110613793576137936146bc565b60200101906001600160f81b03191690815f1a905350600101613740565b505f5b603081101561381c57846080015181815181106137d3576137d36146bc565b01602001516001600160f81b031916826137ee83604e6146d0565b815181106137fe576137fe6146bc565b60200101906001600160f81b03191690815f1a9053506001016137b4565b505f5b600881101561388e576138338160076146a9565b61383e906008614549565b60608601516001600160401b0390811691161c60f81b8261386083607e6146d0565b81518110613870576138706146bc565b60200101906001600160f81b03191690815f1a90535060010161381f565b5060028160405161389f9190614801565b602060405180830381855afa1580156138ba573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138dd91906143fe565b94909350915050565b60015f805160206148f383398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661394257604051631afcd79f60e31b815260040160405180910390fd5b565b61394c6138f9565b61395581613c29565b6139af60408201356060830135608084013561397760c0860160a08701614060565b61398760e0870160c08801614060565b613998610100880160e0890161481c565b6139aa61012089016101008a0161483c565b613c4a565b50565b6139ba6138f9565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613a465760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613a7a6001600160a01b03841683613d44565b905080515f14158015613a9e575080806020019051810190613a9c9190614857565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613b0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b3191906143fe565b9050613b486001600160a01b038516333086613d51565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613b8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bb091906143fe565b9050818111613c165760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613c2082826146a9565b95945050505050565b613c316138f9565b613c39613d8a565b613c41613d9a565b6139af81613da2565b613c526138f9565b5f80516020614873833981519152969096557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01949094557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02929092557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0380547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0395861617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b6060610f7583835f613de3565b6040516001600160a01b038481166024830152838116604483015260648201839052610c2a9186918216906323b872dd906084016134a2565b613d926138f9565b613942613e72565b6139426138f9565b613daa6138f9565b80355f805160206148b383398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b606081471015613e085760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613e239190614801565b5f6040518083038185875af1925050503d805f8114613e5d576040519150601f19603f3d011682016040523d82523d5f602084013e613e62565b606091505b509150915061149a868383613e7a565b6138e66138f9565b606082613e8f57613e8a82613ed6565b610f75565b8151158015613ea657506001600160a01b0384163b155b15613ecf57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610f75565b805115613ee65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613f0b90614268565b5f825580601f10613f1a575050565b601f0160209004905f5260205f20908101906139af9190613f7a565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613f8e575f8155600101613f7b565b5090565b80151581146139af575f80fd5b803563ffffffff81168114613fb2575f80fd5b919050565b5f805f60608486031215613fc9575f80fd5b833592506020840135613fdb81613f92565b9150613fe960408501613f9f565b90509250925092565b5f60208284031215614002575f80fd5b5035919050565b5f60208284031215614019575f80fd5b610f7582613f9f565b5f8060408385031215614033575f80fd5b61403c83613f9f565b946020939093013593505050565b80356001600160401b0381168114613fb2575f80fd5b5f60208284031215614070575f80fd5b610f758261404a565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156140af576140af614079565b60405290565b604051601f8201601f191681016001600160401b03811182821017156140dd576140dd614079565b604052919050565b5f6001600160401b038211156140fd576140fd614079565b50601f01601f191660200190565b5f805f806080858703121561411e575f80fd5b84359350602085013592506141356040860161404a565b915060608501356001600160401b0381111561414f575f80fd5b8501601f8101871361415f575f80fd5b803561417261416d826140e5565b6140b5565b818152886020838501011115614186575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b6001600160a01b03811681146139af575f80fd5b5f808284036101408112156141ce575f80fd5b610120808212156141dd575f80fd5b84935083013590506141ee816141a7565b809150509250929050565b5f806040838503121561420a575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156142615761426161422d565b5092915050565b600181811c9082168061427c57607f821691505b60208210810361429a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156142c55750805b601f840160051c820191505b818110156142e4575f81556001016142d1565b5050505050565b81516001600160401b0381111561430457614304614079565b614318816143128454614268565b846142a0565b602080601f83116001811461434b575f84156143345750858301515b5f19600386901b1c1916600185901b1785556143a2565b5f85815260208120601f198616915b828110156143795788860151825594840194600190910190840161435a565b508582101561439657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156143c45781810151838201526020016143ac565b50505f910152565b602081525f82518060208401526143ea8160408501602087016143aa565b601f01601f19169190910160400192915050565b5f6020828403121561440e575f80fd5b5051919050565b5f60208083525f845461442781614268565b806020870152604060018084165f8114614448576001811461446457614491565b60ff19851660408a0152604084151560051b8a01019550614491565b895f5260205f205f5b858110156144885781548b820186015290830190880161446d565b8a016040019650505b509398975050505050505050565b5f826144b957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a61422d565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613fb281613f92565b5f80604083850312156145c3575f80fd5b82516001600160401b03808211156145d9575f80fd5b90840190606082870312156145ec575f80fd5b6145f461408d565b82518152602080840151614607816141a7565b8282015260408401518381111561461c575f80fd5b80850194505087601f850112614630575f80fd5b8351925061464061416d846140e5565b8381528882858701011115614653575f80fd5b614662848383018488016143aa565b806040840152508195506146778188016145a7565b9450505050509250929050565b5f6001600160401b0380831681810361469f5761469f61422d565b6001019392505050565b8181038181111561093a5761093a61422d565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561093a5761093a61422d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156142615761426161422d565b6001600160401b038181168382160280821691908281146147f9576147f961422d565b505092915050565b5f82516148128184602087016143aa565b9190910192915050565b5f6020828403121561482c575f80fd5b813560ff81168114610f75575f80fd5b5f6020828403121561484c575f80fd5b8135610f75816141a7565b5f60208284031215614867575f80fd5b8151610f7581613f9256fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614a2a380380614a2a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148dd8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063a7f7f0701461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872fda641461023e57806398f3e2b414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613f75565b6102d6565b005b610128610138366004613fb0565b610761565b61017b61014b366004613fb0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613fb0565b6108bd565b6101b46101af366004613fb0565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da366004613fc7565b610940565b6101286101ed366004613fe0565b61096b565b61017b61020036600461401e565b610b5c565b6101b4610213366004613fb0565b610b75565b610128610226366004613fb0565b610b89565b610128610239366004613f75565b610bf6565b61017b61024c3660046140c9565b610c30565b61012861025f366004613fe0565b610c55565b61017b610272366004614165565b610e85565b610128610285366004613fc7565b610e98565b610128610298366004614199565b611055565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613fb0565b611139565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0760205260408120600101545f80516020614831833981519152918415610328576103258285611208565b90505b5f868152600784016020526040808220815161010081019092528054829060ff16600481111561035a5761035a6141d7565b600481111561036b5761036b6141d7565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f26141d7565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206148518339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206148518339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b3846114a4565b600383526001600160401b0342811660a0850152811660e08401525f8981526007870160205260409020835181549293508492829060ff19166001836004811115610500576105006141d7565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611518565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e91906141ff565b905061066a86826115f7565b5f61067687858461163f565b5f8c815260098a016020526040902090915061069282826142a9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf90859060040161438a565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906143bc565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f805160206148718339815191529291906107a990614226565b90501180156107db575060035f83815260048301602052604090205460ff1660058111156107d9576107d96141d7565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016143d3565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906143bc565b505050565b6108c68161185c565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d09602052604090819020905163ee5b48eb60e01b81525f80516020614831833981519152916005600160991b019163ee5b48eb91610878916004016143d3565b5f61093a64e8d4a510008361445d565b92915050565b5f61094a8261192b565b905061096781606001516001600160401b03168260400151611cb9565b5050565b5f805160206148318339815191525f61098384611cef565b90505f806109948360400151611ed0565b50915091506109a28561210b565b5f85815260088501602052604081206109ba91613ebd565b5f6109c483611518565b9050816001600160401b031681608001516001600160401b031610156109fc5760405162461bcd60e51b815260040161043b9061447c565b5f8681526007860160205260409020600201546001600160401b03808416600160c01b909204161115610a415760405162461bcd60e51b815260040161043b906144be565b60015f87815260078701602052604090205460ff166004811115610a6757610a676141d7565b14610ad05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600786016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a51000614507565b5f610b7f82611518565b60a0015192915050565b610b928161210b565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614831833981519152916005600160991b019163ee5b48eb91610878916004016143d3565b5f610c0084611518565b60a001519050610c0f816121e4565b8215610c2157610c1f8483611208565b505b610c2a846123b0565b50505050565b5f80610c3b86612780565b9050610c4985828686612836565b9150505b949350505050565b5f805160206148318339815191525f610c6d84611cef565b90505f80610c7e8360400151611ed0565b5091509150610c8c8561185c565b5f8581526009850160205260408120610ca491613ebd565b5f610cae83611518565b9050816001600160401b031681608001516001600160401b03161015610ce65760405162461bcd60e51b815260040161043b9061447c565b5f8681526007860160205260409020600301546001600160401b0380841691161115610d245760405162461bcd60e51b815260040161043b906144be565b60035f87815260078701602052604090205460ff166004811115610d4a57610d4a6141d7565b14610d9e5760405162461bcd60e51b815260206004820152603160248201525f805160206148518339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600786016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610e4391611cb9565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610e91833384612d11565b9392505050565b5f805160206148718339815191525f610eb083611cef565b90505f80610ec183604001516130cc565b9150915080610f235760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260028501602052604081208054610f3d90614226565b9050118015610f6f575060015f83815260048601602052604090205460ff166005811115610f6d57610f6d6141d7565b145b610f8b5760405162461bcd60e51b815260040161043b9061451e565b5f8281526002850160205260408120610fa391613ebd565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061109e575080546001600160401b03808416911610155b156110bc5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556110e7848461326d565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061487183398151915292919061118190614226565b90501180156111b3575060015f83815260048301602052604090205460ff1660058111156111b1576111b16141d7565b145b6111cf5760405162461bcd60e51b815260040161043b9061451e565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016143d3565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611253573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261127a9190810190614570565b91509150806112dd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611320573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134491906143bc565b8251146113a85760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b03161561141e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061142d8460400151613287565b9150915081871461149a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206148918339815191526020526040812060030180545f80516020614871833981519152916001600160401b03909116908190846114e983614642565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611520613ef4565b5f8281525f805160206148918339815191526020526040908190208151610100810190925280545f80516020614871833981519152929190829060ff16600581111561156e5761156e6141d7565b600581111561157f5761157f6141d7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614891833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116b857611678816001614667565b611683906008614507565b5081515f9083908390811061169a5761169a61467a565b60200101906001600160f81b03191690815f1a905350600101611664565b505f5b600481101561171b576116cf816003614667565b6116da906008614507565b6001901c60f81b826116ed83600261468e565b815181106116fd576116fd61467a565b60200101906001600160f81b03191690815f1a9053506001016116bb565b505f5b602081101561177d5761173281601f614667565b61173d906008614507565b86901c60f81b8261174f83600661468e565b8151811061175f5761175f61467a565b60200101906001600160f81b03191690815f1a90535060010161171e565b505f5b60088110156117e857611794816007614667565b61179f906008614507565b6001600160401b038616901c60f81b826117ba83602661468e565b815181106117ca576117ca61467a565b60200101906001600160f81b03191690815f1a905350600101611780565b505f5b6008811015611853576117ff816007614667565b61180a906008614507565b6001600160401b038516901c60f81b8261182583602e61468e565b815181106118355761183561467a565b60200101906001600160f81b03191690815f1a9053506001016117eb565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d096020526040812080545f805160206148318339815191529291906118a490614226565b90501180156118d6575060035f83815260078301602052604090205460ff1660048111156118d4576118d46141d7565b145b6109675760405162461bcd60e51b815260206004820152603360248201525f8051602061485183398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b611933613ef4565b5f805160206148718339815191525f61194b84611cef565b90505f8061195c83604001516130cc565b9150915080156119c15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600485016020526040808220815161010081019092528054829060ff1660058111156119f3576119f36141d7565b6005811115611a0457611a046141d7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8b57611a8b6141d7565b1480611aa95750600182516005811115611aa757611aa76141d7565b145b611b085760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1d57611b1d6141d7565b03611b4457505f8381526003860160205260408120600491611b3f9190613ebd565b611b48565b5060055b6020808301515f9081526005808901909252604081205582908290811115611b7257611b726141d7565b90816005811115611b8557611b856141d7565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115611bb957611bb96141d7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c8457611c846141d7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610967906001600160a01b0316828461345f565b60408051606080820183525f8083526020830181905292820152905f805160206148718339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d8b9190810190614570565b9150915080611df25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e555760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ec85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611ef45760405162461bcd60e51b815260040161043b906146a1565b5f805b6002811015611f4357611f0b816001614667565b611f16906008614507565b61ffff16868281518110611f2c57611f2c61467a565b016020015160f81c901b9190911790600101611ef7565b5061ffff811615611f665760405162461bcd60e51b815260040161043b906146ea565b5f805b6004811015611fc157611f7d816003614667565b611f88906008614507565b63ffffffff1687611f9a83600261468e565b81518110611faa57611faa61467a565b016020015160f81c901b9190911790600101611f69565b5063ffffffff8116600314611fe85760405162461bcd60e51b815260040161043b9061472d565b5f805b602081101561203d57611fff81601f614667565b61200a906008614507565b8861201683600661468e565b815181106120265761202661467a565b016020015160f81c901b9190911790600101611feb565b505f805b600881101561209c57612055816007614667565b612060906008614507565b6001600160401b03168961207583602661468e565b815181106120855761208561467a565b016020015160f81c901b9190911790600101612041565b505f805b60088110156120fb576120b4816007614667565b6120bf906008614507565b6001600160401b03168a6120d483602e61468e565b815181106120e4576120e461467a565b016020015160f81c901b91909117906001016120a0565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f8051602061483183398151915292919061215390614226565b9050118015612185575060015f83815260078301602052604090205460ff166004811115612183576121836141d7565b145b6109675760405162461bcd60e51b815260206004820152603860248201525f8051602061485183398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f805160206148318339815191525f61221b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb065490565b6002830154909150600160401b900460ff161580612237575080155b1561224157505050565b6040805160608101825260038401548082526004850154602083015260058501546001600160401b03908116938301939093526002850154429316906122879084614667565b106122aa576001600160401b0385166040820152818152602081018390526122c9565b84816040018181516122bc9190614774565b6001600160401b03169052505b5f8160200151826040015160646122e09190614794565b6001600160401b03166122f3919061445d565b600286015490915060ff600160401b909104811690821611156123715760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2063687560448201526f1c9b881c985d1948195e18d95959195960821b606482015260840161043b565b508051600385015560208101516004850155604001516005909301805467ffffffffffffffff19166001600160401b0390941693909317909255505050565b5f8181525f8051602061489183398151915260205260408082208151610100810190925280545f8051602061487183398151915293929190829060ff1660058111156123fe576123fe6141d7565b600581111561240f5761240f6141d7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612497576124976141d7565b146124f35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461256d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff191660018360058111156125b1576125b16141d7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61267d84612677816114a4565b5f61163f565b5f858152600385016020526040902090915061269982826142a9565b508160a001516001600160401b0316836006015f8282546126ba9190614667565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126eb90859060040161438a565b6020604051808303815f875af1158015612707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061272b91906143bc565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061483183398151915281612799846134be565b90505f6127a58261092a565b83549091506001600160401b038216108015906127cf57508260010154816001600160401b031611155b61282d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b610c4d816121e4565b5f61283f6134f4565b5f80516020614871833981519152426001600160401b038516116128c15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b0384166128d8426202a30061468e565b1161294b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b856129a25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f86815260058201602052604090205415612a105760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612a775760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b5f80612abe6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061352b565b5f82815260028601602052604090209193509150612adc82826142a9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b0990859060040161438a565b6020604051808303815f875af1158015612b25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b4991906143bc565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff19166001836005811115612bcb57612bcb6141d7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695851695909517919091171692909217929092179055600685018054918a16915f90612c9c90849061468e565b90915550612cab9050836114a4565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610c4d60015f805160206148b183398151915255565b5f612d1a6134f4565b5f612d276101af846134be565b90505f805160206148318339815191525f612d4187611518565b9050600281516005811115612d5857612d586141d7565b14612db75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612dc89190614774565b9050612dd488826115f7565b5f612dde896114a4565b90505f898983604051602001612e269392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612e47866121e4565b5f612e538b848661163f565b5f8381526008880160205260409020909150612e6f82826142a9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e9c90859060040161438a565b6020604051808303815f875af1158015612eb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612edc91906143bc565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876007015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612f8b57612f8b6141d7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610e9160015f805160206148b183398151915255565b5f8082516027146130ef5760405162461bcd60e51b815260040161043b906146a1565b5f805b600281101561313e57613106816001614667565b613111906008614507565b61ffff168582815181106131275761312761467a565b016020015160f81c901b91909117906001016130f2565b5061ffff8116156131615760405162461bcd60e51b815260040161043b906146ea565b5f805b60048110156131bc57613178816003614667565b613183906008614507565b63ffffffff168661319583600261468e565b815181106131a5576131a561467a565b016020015160f81c901b9190911790600101613164565b5063ffffffff81166002146131e35760405162461bcd60e51b815260040161043b9061472d565b5f805b6020811015613238576131fa81601f614667565b613205906008614507565b8761321183600661468e565b815181106132215761322161467a565b016020015160f81c901b91909117906001016131e6565b505f8660268151811061324d5761324d61467a565b016020015191976001600160f81b03199092161515965090945050505050565b6132756138e3565b61327e8261392e565b61096781613995565b5f808251602e146132aa5760405162461bcd60e51b815260040161043b906146a1565b5f805b60028110156132f9576132c1816001614667565b6132cc906008614507565b61ffff168582815181106132e2576132e261467a565b016020015160f81c901b91909117906001016132ad565b5061ffff81161561331c5760405162461bcd60e51b815260040161043b906146ea565b5f805b600481101561337757613333816003614667565b61333e906008614507565b63ffffffff168661335083600261468e565b815181106133605761336061467a565b016020015160f81c901b919091179060010161331f565b5063ffffffff811660041461339e5760405162461bcd60e51b815260040161043b9061472d565b5f805b60208110156133f3576133b581601f614667565b6133c0906008614507565b876133cc83600661468e565b815181106133dc576133dc61467a565b016020015160f81c901b91909117906001016133a1565b505f805b60088110156134525761340b816007614667565b613416906008614507565b6001600160401b03168861342b83602661468e565b8151811061343b5761343b61467a565b016020015160f81c901b91909117906001016133f7565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613a49565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613aaa565b5f805160206148b183398151915280546001190161352557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135955760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561360c576135cc816001614667565b6135d7906008614507565b5081515f908390839081106135ee576135ee61467a565b60200101906001600160f81b03191690815f1a9053506001016135b8565b505f5b600481101561366a57613623816003614667565b61362e906008614507565b505f8261363c83600261468e565b8151811061364c5761364c61467a565b60200101906001600160f81b03191690815f1a90535060010161360f565b505f5b60208110156136c757845181602081106136895761368961467a565b1a60f81b8261369983600661468e565b815181106136a9576136a961467a565b60200101906001600160f81b03191690815f1a90535060010161366d565b505f5b602081101561372757846020015181602081106136e9576136e961467a565b1a60f81b826136f983602661468e565b815181106137095761370961467a565b60200101906001600160f81b03191690815f1a9053506001016136ca565b505f5b600881101561379b5761373e816007614667565b613749906008614507565b60ff1685604001516001600160401b0316901c60f81b8282604661376d919061468e565b8151811061377d5761377d61467a565b60200101906001600160f81b03191690815f1a90535060010161372a565b505f5b603081101561380657846080015181815181106137bd576137bd61467a565b01602001516001600160f81b031916826137d883604e61468e565b815181106137e8576137e861467a565b60200101906001600160f81b03191690815f1a90535060010161379e565b505f5b60088110156138785761381d816007614667565b613828906008614507565b60608601516001600160401b0390811691161c60f81b8261384a83607e61468e565b8151811061385a5761385a61467a565b60200101906001600160f81b03191690815f1a905350600101613809565b5060028160405161388991906147bf565b602060405180830381855afa1580156138a4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138c791906143bc565b94909350915050565b60015f805160206148b183398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661392c57604051631afcd79f60e31b815260040160405180910390fd5b565b6139366138e3565b61393f81613c0c565b6139926040820135606083013561395c60a085016080860161401e565b61396c60c0860160a0870161401e565b61397c60e0870160c088016147da565b61398d610100880160e089016147fa565b613c2d565b50565b61399d6138e3565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613a295760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613a5d6001600160a01b03841683613d02565b905080515f14158015613a81575080806020019051810190613a7f9190614815565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613af0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b1491906143bc565b9050613b2b6001600160a01b038516333086613d0f565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613b6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b9391906143bc565b9050818111613bf95760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613c038282614667565b95945050505050565b613c146138e3565b613c1c613d48565b613c24613d58565b61399281613d60565b613c356138e3565b5f80516020614831833981519152959095557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01939093557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0280547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0396871617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b6060610e9183835f613da1565b6040516001600160a01b038481166024830152838116604483015260648201839052610c2a9186918216906323b872dd9060840161348c565b613d506138e3565b61392c613e30565b61392c6138e3565b613d686138e3565b80355f8051602061487183398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b606081471015613dc65760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613de191906147bf565b5f6040518083038185875af1925050503d805f8114613e1b576040519150601f19603f3d011682016040523d82523d5f602084013e613e20565b606091505b509150915061149a868383613e38565b6138d06138e3565b606082613e4d57613e4882613e94565b610e91565b8151158015613e6457506001600160a01b0384163b155b15613e8d57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610e91565b805115613ea45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613ec990614226565b5f825580601f10613ed8575050565b601f0160209004905f5260205f20908101906139929190613f38565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613f4c575f8155600101613f39565b5090565b8015158114613992575f80fd5b803563ffffffff81168114613f70575f80fd5b919050565b5f805f60608486031215613f87575f80fd5b833592506020840135613f9981613f50565b9150613fa760408501613f5d565b90509250925092565b5f60208284031215613fc0575f80fd5b5035919050565b5f60208284031215613fd7575f80fd5b610e9182613f5d565b5f8060408385031215613ff1575f80fd5b613ffa83613f5d565b946020939093013593505050565b80356001600160401b0381168114613f70575f80fd5b5f6020828403121561402e575f80fd5b610e9182614008565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561406d5761406d614037565b60405290565b604051601f8201601f191681016001600160401b038111828210171561409b5761409b614037565b604052919050565b5f6001600160401b038211156140bb576140bb614037565b50601f01601f191660200190565b5f805f80608085870312156140dc575f80fd5b84359350602085013592506140f360408601614008565b915060608501356001600160401b0381111561410d575f80fd5b8501601f8101871361411d575f80fd5b803561413061412b826140a3565b614073565b818152886020838501011115614144575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215614176575f80fd5b50508035926020909101359150565b6001600160a01b0381168114613992575f80fd5b5f808284036101208112156141ac575f80fd5b610100808212156141bb575f80fd5b84935083013590506141cc81614185565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561421f5761421f6141eb565b5092915050565b600181811c9082168061423a57607f821691505b60208210810361425857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156142835750805b601f840160051c820191505b818110156142a2575f815560010161428f565b5050505050565b81516001600160401b038111156142c2576142c2614037565b6142d6816142d08454614226565b8461425e565b602080601f831160018114614309575f84156142f25750858301515b5f19600386901b1c1916600185901b178555614360565b5f85815260208120601f198616915b8281101561433757888601518255948401946001909101908401614318565b508582101561435457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561438257818101518382015260200161436a565b50505f910152565b602081525f82518060208401526143a8816040850160208701614368565b601f01601f19169190910160400192915050565b5f602082840312156143cc575f80fd5b5051919050565b5f60208083525f84546143e581614226565b806020870152604060018084165f811461440657600181146144225761444f565b60ff19851660408a0152604084151560051b8a0101955061444f565b895f5260205f205f5b858110156144465781548b820186015290830190880161442b565b8a016040019650505b509398975050505050505050565b5f8261447757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a6141eb565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613f7081613f50565b5f8060408385031215614581575f80fd5b82516001600160401b0380821115614597575f80fd5b90840190606082870312156145aa575f80fd5b6145b261404b565b825181526020808401516145c581614185565b828201526040840151838111156145da575f80fd5b80850194505087601f8501126145ee575f80fd5b835192506145fe61412b846140a3565b8381528882858701011115614611575f80fd5b61462084838301848801614368565b80604084015250819550614635818801614565565b9450505050509250929050565b5f6001600160401b0380831681810361465d5761465d6141eb565b6001019392505050565b8181038181111561093a5761093a6141eb565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561093a5761093a6141eb565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561421f5761421f6141eb565b6001600160401b038181168382160280821691908281146147b7576147b76141eb565b505092915050565b5f82516147d0818460208701614368565b9190910192915050565b5f602082840312156147ea575f80fd5b813560ff81168114610e91575f80fd5b5f6020828403121561480a575f80fd5b8135610e9181614185565b5f60208284031215614825575f80fd5b8151610e9181613f5056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -459,23 +458,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x912de4da. +// Initialize is a paid mutator transaction binding the contract method 0xa7f7f070. // -// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint256,uint64,uint64,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint64,uint64,uint8,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 0x912de4da. +// Initialize is a paid mutator transaction binding the contract method 0xa7f7f070. // -// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint256,uint64,uint64,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint64,uint64,uint8,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 0x912de4da. +// Initialize is a paid mutator transaction binding the contract method 0xa7f7f070. // -// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint256,uint64,uint64,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint64,uint64,uint8,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/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 4686aa4ec..131bac52a 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -34,7 +34,6 @@ type PoSValidatorManagerSettings struct { BaseSettings ValidatorManagerSettings MinimumStakeAmount *big.Int MaximumStakeAmount *big.Int - ChurnTrackerStartTime *big.Int ChurnPeriodSeconds uint64 MinimumStakeDuration uint64 MaximumChurnPercentage uint8 @@ -49,8 +48,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnTrackerStartTime\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161469f38038061469f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145528061014d5f395ff3fe608060405260043610610105575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f4578063b771b3bc14610313578063bee0a03f14610345578063c599e24f14610364578063f40797d714610377575f80fd5b806366435abf146102785780636d0e43fa1461029757806376f78621146102b657806398f3e2b4146102d5575f80fd5b80632e1488ec116100d85780632e1488ec146101c55780632e2194d8146101e4578063467ef06f1461021b5780635297fae61461023a5780636206585614610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063162f1f61146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613c5c565b61038a565b005b348015610135575f80fd5b50610128610144366004613c97565b610815565b348015610154575f80fd5b50610193610163366004613c97565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b3480156101b1575f80fd5b506101286101c0366004613c97565b610971565b3480156101d0575f80fd5b506101286101df366004613cae565b6109de565b3480156101ef575f80fd5b506102036101fe366004613c97565b610ac0565b6040516001600160401b03909116815260200161019d565b348015610226575f80fd5b50610128610235366004613cc5565b610ad6565b348015610245575f80fd5b50610128610254366004613cde565b610b01565b348015610264575f80fd5b50610193610273366004613d1c565b610cf2565b348015610283575f80fd5b50610203610292366004613c97565b610d0b565b3480156102a2575f80fd5b506101286102b1366004613c97565b610d1f565b3480156102c1575f80fd5b506101286102d0366004613c5c565b610d8c565b3480156102e0575f80fd5b506101286102ef366004613cde565b610dc6565b3480156102ff575f80fd5b5061012861030e366004613cc5565b610ff6565b34801561031e575f80fd5b5061032d6005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610350575f80fd5b5061012861035f366004613c97565b6111b3565b610193610372366004613c97565b611282565b610193610385366004613dc7565b61128e565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260408120600101545f805160206144a68339815191529184156103dc576103d982856112b2565b90505b5f868152600884016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613e59565b600481111561041f5761041f613e59565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613e59565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206144c68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206144c68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f6105678461154e565b600383526001600160401b0342811660a0850152811660e08401525f8981526008870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613e59565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610686856115c2565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107129190613e81565b905061071e86826116a1565b5f61072a8785846116e9565b5f8c8152600a8a01602052604090209091506107468282613f25565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610773908590600401614006565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190614038565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f805160206144e683398151915292919061085d90613ea8565b905011801561088f575060035f83815260048301602052604090205460ff16600581111561088d5761088d613e59565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c919060040161404f565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190614038565b505050565b61097a81611906565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a602052604090819020905163ee5b48eb60e01b81525f805160206144a6833981519152916005600160991b019163ee5b48eb9161092c9160040161404f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a27575080546001600160401b03808416911610155b15610a455760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6f836119d5565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610ad064e8d4a51000836140d9565b92915050565b5f610ae0826119e9565b9050610afd81606001516001600160401b03168260400151611d77565b5050565b5f805160206144a68339815191525f610b1984611d8a565b90505f80610b2a8360400151611f6b565b5091509150610b38856121a6565b5f8581526009850160205260408120610b5091613ba4565b5f610b5a836115c2565b9050816001600160401b031681608001516001600160401b03161015610b925760405162461bcd60e51b81526004016104ef906140f8565b5f8681526008860160205260409020600201546001600160401b03808416600160c01b909204161115610bd75760405162461bcd60e51b81526004016104ef9061413a565b60015f87815260088701602052604090205460ff166004811115610bfd57610bfd613e59565b14610c665760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600886016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad06001600160401b03831664e8d4a51000614183565b5f610d15826115c2565b60a0015192915050565b610d28816121a6565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d09602052604090819020905163ee5b48eb60e01b81525f805160206144a6833981519152916005600160991b019163ee5b48eb9161092c9160040161404f565b5f610d96846115c2565b60a001519050610da58161227f565b8215610db757610db584836112b2565b505b610dc084612461565b50505050565b5f805160206144a68339815191525f610dde84611d8a565b90505f80610def8360400151611f6b565b5091509150610dfd85611906565b5f858152600a850160205260408120610e1591613ba4565b5f610e1f836115c2565b9050816001600160401b031681608001516001600160401b03161015610e575760405162461bcd60e51b81526004016104ef906140f8565b5f8681526008860160205260409020600301546001600160401b0380841691161115610e955760405162461bcd60e51b81526004016104ef9061413a565b60035f87815260088701602052604090205460ff166004811115610ebb57610ebb613e59565b14610f0f5760405162461bcd60e51b815260206004820152603160248201525f805160206144c68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f868152600886016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610fb491611d77565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206144e68339815191525f61100e83611d8a565b90505f8061101f8360400151612831565b91509150806110815760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526002850160205260408120805461109b90613ea8565b90501180156110cd575060015f83815260048601602052604090205460ff1660058111156110cb576110cb613e59565b145b6110e95760405162461bcd60e51b81526004016104ef9061419a565b5f828152600285016020526040812061110191613ba4565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f805160206144e68339815191529291906111fb90613ea8565b905011801561122d575060015f83815260048301602052604090205460ff16600581111561122b5761122b613e59565b145b6112495760405162461bcd60e51b81526004016104ef9061419a565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c919060040161404f565b5f610ad08233346129d2565b5f8061129934612d8a565b90506112a785828686612e3d565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112fd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113249190810190614200565b91509150806113875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ee9190614038565b8251146114525760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156114c85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806114d78460400151613318565b915091508187146115445760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206145068339815191526020526040812060030180545f805160206144e6833981519152916001600160401b0390911690819084611593836142d2565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115ca613bdb565b5f8281525f805160206145068339815191526020526040908190208151610100810190925280545f805160206144e6833981519152929190829060ff16600581111561161857611618613e59565b600581111561162957611629613e59565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614506833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611762576117228160016142f7565b61172d906008614183565b5081515f908390839081106117445761174461430a565b60200101906001600160f81b03191690815f1a90535060010161170e565b505f5b60048110156117c5576117798160036142f7565b611784906008614183565b6001901c60f81b8261179783600261431e565b815181106117a7576117a761430a565b60200101906001600160f81b03191690815f1a905350600101611765565b505f5b6020811015611827576117dc81601f6142f7565b6117e7906008614183565b86901c60f81b826117f983600661431e565b815181106118095761180961430a565b60200101906001600160f81b03191690815f1a9053506001016117c8565b505f5b60088110156118925761183e8160076142f7565b611849906008614183565b6001600160401b038616901c60f81b8261186483602661431e565b815181106118745761187461430a565b60200101906001600160f81b03191690815f1a90535060010161182a565b505f5b60088110156118fd576118a98160076142f7565b6118b4906008614183565b6001600160401b038516901c60f81b826118cf83602e61431e565b815181106118df576118df61430a565b60200101906001600160f81b03191690815f1a905350600101611895565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020526040812080545f805160206144a683398151915292919061194e90613ea8565b9050118015611980575060035f83815260088301602052604090205460ff16600481111561197e5761197e613e59565b145b610afd5760405162461bcd60e51b815260206004820152603360248201525f805160206144c683398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b6119dd6134f0565b6119e68161353b565b50565b6119f1613bdb565b5f805160206144e68339815191525f611a0984611d8a565b90505f80611a1a8360400151612831565b915091508015611a7f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115611ab157611ab1613e59565b6005811115611ac257611ac2613e59565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b4957611b49613e59565b1480611b675750600182516005811115611b6557611b65613e59565b145b611bc65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115611bdb57611bdb613e59565b03611c0257505f8381526003860160205260408120600491611bfd9190613ba4565b611c06565b5060055b6020808301515f9081526005808901909252604081205582908290811115611c3057611c30613e59565b90816005811115611c4357611c43613e59565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115611c7757611c77613e59565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d4257611d42613e59565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610afd6001600160a01b038216836135a6565b60408051606080820183525f8083526020830181905292820152905f805160206144e68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611dff573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e269190810190614200565b9150915080611e8d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611ef05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611f635760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f805f8351603614611f8f5760405162461bcd60e51b81526004016104ef90614331565b5f805b6002811015611fde57611fa68160016142f7565b611fb1906008614183565b61ffff16868281518110611fc757611fc761430a565b016020015160f81c901b9190911790600101611f92565b5061ffff8116156120015760405162461bcd60e51b81526004016104ef9061437a565b5f805b600481101561205c576120188160036142f7565b612023906008614183565b63ffffffff168761203583600261431e565b815181106120455761204561430a565b016020015160f81c901b9190911790600101612004565b5063ffffffff81166003146120835760405162461bcd60e51b81526004016104ef906143bd565b5f805b60208110156120d85761209a81601f6142f7565b6120a5906008614183565b886120b183600661431e565b815181106120c1576120c161430a565b016020015160f81c901b9190911790600101612086565b505f805b6008811015612137576120f08160076142f7565b6120fb906008614183565b6001600160401b03168961211083602661431e565b815181106121205761212061430a565b016020015160f81c901b91909117906001016120dc565b505f805b60088110156121965761214f8160076142f7565b61215a906008614183565b6001600160401b03168a61216f83602e61431e565b8151811061217f5761217f61430a565b016020015160f81c901b919091179060010161213b565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d096020526040812080545f805160206144a68339815191529291906121ee90613ea8565b9050118015612220575060015f83815260088301602052604090205460ff16600481111561221e5761221e613e59565b145b610afd5760405162461bcd60e51b815260206004820152603860248201525f805160206144c683398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f805160206144a68339815191525f6122b67fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb065490565b6003830154909150600160401b900460ff1615806122d2575080155b156122dc57505050565b6002820154429081116122ef5750505050565b6040805160608101825260048501548082526005860154602083015260068601546001600160401b039081169383019390935260038601549192919091169061233890846142f7565b1061235b576001600160401b03851660408201528181526020810183905261237a565b848160400181815161236d9190614404565b6001600160401b03169052505b5f8160200151826040015160646123919190614424565b6001600160401b03166123a491906140d9565b600386015490915060ff600160401b909104811690821611156124225760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2063687560448201526f1c9b881c985d1948195e18d95959195960821b60648201526084016104ef565b508051600485015560208101516005850155604001516006909301805467ffffffffffffffff19166001600160401b0390941693909317909255505050565b5f8181525f8051602061450683398151915260205260408082208151610100810190925280545f805160206144e683398151915293929190829060ff1660058111156124af576124af613e59565b60058111156124c0576124c0613e59565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561254857612548613e59565b146125a45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b03161461261e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff1916600183600581111561266257612662613e59565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61272e846127288161154e565b5f6116e9565b5f858152600385016020526040902090915061274a8282613f25565b508160a001516001600160401b0316836006015f82825461276b91906142f7565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061279c908590600401614006565b6020604051808303815f875af11580156127b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127dc9190614038565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146128545760405162461bcd60e51b81526004016104ef90614331565b5f805b60028110156128a35761286b8160016142f7565b612876906008614183565b61ffff1685828151811061288c5761288c61430a565b016020015160f81c901b9190911790600101612857565b5061ffff8116156128c65760405162461bcd60e51b81526004016104ef9061437a565b5f805b6004811015612921576128dd8160036142f7565b6128e8906008614183565b63ffffffff16866128fa83600261431e565b8151811061290a5761290a61430a565b016020015160f81c901b91909117906001016128c9565b5063ffffffff81166002146129485760405162461bcd60e51b81526004016104ef906143bd565b5f805b602081101561299d5761295f81601f6142f7565b61296a906008614183565b8761297683600661431e565b815181106129865761298661430a565b016020015160f81c901b919091179060010161294b565b505f866026815181106129b2576129b261430a565b016020015191976001600160f81b03199092161515965090945050505050565b5f6129db613639565b5f6129e583610ac0565b90505f805160206144a68339815191525f6129ff876115c2565b9050600281516005811115612a1657612a16613e59565b14612a755760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f838260a00151612a869190614404565b9050612a9288826116a1565b5f612a9c8961154e565b90505f898983604051602001612ae49392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612b058661227f565b5f612b118b84866116e9565b5f8381526009880160205260409020909150612b2d8282613f25565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b5a908590600401614006565b6020604051808303815f875af1158015612b76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b9a9190614038565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876008015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c4957612c49613e59565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506112ab60015f8051602061452683398151915255565b5f5f805160206144a68339815191528282612da482610ac0565b83549091506001600160401b03821610801590612dce57508260010154816001600160401b031611155b612e2c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b612e358161227f565b949350505050565b5f612e46613639565b5f805160206144e6833981519152426001600160401b03851611612ec85760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612edf426202a30061431e565b11612f525760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612fa95760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f868152600582016020526040902054156130175760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b825160301461307e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b5f806130c56040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613683565b5f828152600286016020526040902091935091506130e38282613f25565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613110908590600401614006565b6020604051808303815f875af115801561312c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131509190614038565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff191660018360058111156131d2576131d2613e59565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695851695909517919091171692909217929092179055600685018054918a16915f906132a390849061431e565b909155506132b290508361154e565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612e3560015f8051602061452683398151915255565b5f808251602e1461333b5760405162461bcd60e51b81526004016104ef90614331565b5f805b600281101561338a576133528160016142f7565b61335d906008614183565b61ffff168582815181106133735761337361430a565b016020015160f81c901b919091179060010161333e565b5061ffff8116156133ad5760405162461bcd60e51b81526004016104ef9061437a565b5f805b6004811015613408576133c48160036142f7565b6133cf906008614183565b63ffffffff16866133e183600261431e565b815181106133f1576133f161430a565b016020015160f81c901b91909117906001016133b0565b5063ffffffff811660041461342f5760405162461bcd60e51b81526004016104ef906143bd565b5f805b60208110156134845761344681601f6142f7565b613451906008614183565b8761345d83600661431e565b8151811061346d5761346d61430a565b016020015160f81c901b9190911790600101613432565b505f805b60088110156134e35761349c8160076142f7565b6134a7906008614183565b6001600160401b0316886134bc83602661431e565b815181106134cc576134cc61430a565b016020015160f81c901b9190911790600101613488565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661353957604051631afcd79f60e31b815260040160405180910390fd5b565b6135436134f0565b61354c81613a28565b6119e660408201356060830135608084013561356e60c0860160a08701613d1c565b61357e60e0870160c08801613d1c565b61358f610100880160e0890161444f565b6135a161012089016101008a0161446f565b613a49565b804710156135c95760405163cd78605960e01b81523060048201526024016104ef565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613612576040519150601f19603f3d011682016040523d82523d5f602084013e613617565b606091505b505090508061096c57604051630a12f52160e11b815260040160405180910390fd5b5f8051602061452683398151915280546001190161366a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061452683398151915255565b5f60608260800151516030146136ed5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613764576137248160016142f7565b61372f906008614183565b5081515f908390839081106137465761374661430a565b60200101906001600160f81b03191690815f1a905350600101613710565b505f5b60048110156137c25761377b8160036142f7565b613786906008614183565b505f8261379483600261431e565b815181106137a4576137a461430a565b60200101906001600160f81b03191690815f1a905350600101613767565b505f5b602081101561381f57845181602081106137e1576137e161430a565b1a60f81b826137f183600661431e565b815181106138015761380161430a565b60200101906001600160f81b03191690815f1a9053506001016137c5565b505f5b602081101561387f57846020015181602081106138415761384161430a565b1a60f81b8261385183602661431e565b815181106138615761386161430a565b60200101906001600160f81b03191690815f1a905350600101613822565b505f5b60088110156138f3576138968160076142f7565b6138a1906008614183565b60ff1685604001516001600160401b0316901c60f81b828260466138c5919061431e565b815181106138d5576138d561430a565b60200101906001600160f81b03191690815f1a905350600101613882565b505f5b603081101561395e57846080015181815181106139155761391561430a565b01602001516001600160f81b0319168261393083604e61431e565b815181106139405761394061430a565b60200101906001600160f81b03191690815f1a9053506001016138f6565b505f5b60088110156139d0576139758160076142f7565b613980906008614183565b60608601516001600160401b0390811691161c60f81b826139a283607e61431e565b815181106139b2576139b261430a565b60200101906001600160f81b03191690815f1a905350600101613961565b506002816040516139e1919061448a565b602060405180830381855afa1580156139fc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a1f9190614038565b94909350915050565b613a306134f0565b613a38613b43565b613a40613b53565b6119e681613b5b565b613a516134f0565b5f805160206144a6833981519152969096557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01949094557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02929092557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0380547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0395861617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b613b4b6134f0565b613539613b9c565b6135396134f0565b613b636134f0565b80355f805160206144e683398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b6136706134f0565b508054613bb090613ea8565b5f825580601f10613bbf575050565b601f0160209004905f5260205f20908101906119e69190613c1f565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c33575f8155600101613c20565b5090565b80151581146119e6575f80fd5b803563ffffffff81168114613c57575f80fd5b919050565b5f805f60608486031215613c6e575f80fd5b833592506020840135613c8081613c37565b9150613c8e60408501613c44565b90509250925092565b5f60208284031215613ca7575f80fd5b5035919050565b5f6101208284031215613cbf575f80fd5b50919050565b5f60208284031215613cd5575f80fd5b6112ab82613c44565b5f8060408385031215613cef575f80fd5b613cf883613c44565b946020939093013593505050565b80356001600160401b0381168114613c57575f80fd5b5f60208284031215613d2c575f80fd5b6112ab82613d06565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d6b57613d6b613d35565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d9957613d99613d35565b604052919050565b5f6001600160401b03821115613db957613db9613d35565b50601f01601f191660200190565b5f805f60608486031215613dd9575f80fd5b83359250613de960208501613d06565b915060408401356001600160401b03811115613e03575f80fd5b8401601f81018613613e13575f80fd5b8035613e26613e2182613da1565b613d71565b818152876020838501011115613e3a575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ea157613ea1613e6d565b5092915050565b600181811c90821680613ebc57607f821691505b602082108103613cbf57634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c81016020851015613eff5750805b601f840160051c820191505b81811015613f1e575f8155600101613f0b565b5050505050565b81516001600160401b03811115613f3e57613f3e613d35565b613f5281613f4c8454613ea8565b84613eda565b602080601f831160018114613f85575f8415613f6e5750858301515b5f19600386901b1c1916600185901b178555613fdc565b5f85815260208120601f198616915b82811015613fb357888601518255948401946001909101908401613f94565b5085821015613fd057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613ffe578181015183820152602001613fe6565b50505f910152565b602081525f8251806020840152614024816040850160208701613fe4565b601f01601f19169190910160400192915050565b5f60208284031215614048575f80fd5b5051919050565b5f60208083525f845461406181613ea8565b806020870152604060018084165f8114614082576001811461409e576140cb565b60ff19851660408a0152604084151560051b8a010195506140cb565b895f5260205f205f5b858110156140c25781548b82018601529083019088016140a7565b8a016040019650505b509398975050505050505050565b5f826140f357634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad057610ad0613e6d565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b03811681146119e6575f80fd5b8051613c5781613c37565b5f8060408385031215614211575f80fd5b82516001600160401b0380821115614227575f80fd5b908401906060828703121561423a575f80fd5b614242613d49565b82518152602080840151614255816141e1565b8282015260408401518381111561426a575f80fd5b80850194505087601f85011261427e575f80fd5b8351925061428e613e2184613da1565b83815288828587010111156142a1575f80fd5b6142b084838301848801613fe4565b806040840152508195506142c58188016141f5565b9450505050509250929050565b5f6001600160401b038083168181036142ed576142ed613e6d565b6001019392505050565b81810381811115610ad057610ad0613e6d565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad057610ad0613e6d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ea157613ea1613e6d565b6001600160401b0381811683821602808216919082811461444757614447613e6d565b505092915050565b5f6020828403121561445f575f80fd5b813560ff811681146112ab575f80fd5b5f6020828403121561447f575f80fd5b81356112ab816141e1565b5f825161449b818460208701613fe4565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161465d38038061465d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145108061014d5f395ff3fe608060405260043610610105575f3560e01c80636d0e43fa11610092578063b771b3bc11610062578063b771b3bc146102f4578063bee0a03f14610326578063c599e24f14610345578063ed849d8f14610358578063f40797d714610377575f80fd5b80636d0e43fa1461027857806376f786211461029757806398f3e2b4146102b6578063a3a65e48146102d5575f80fd5b80632e2194d8116100d85780632e2194d8146101c5578063467ef06f146101fc5780635297fae61461021b578063620658561461023a57806366435abf14610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063162f1f61146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613c1a565b61038a565b005b348015610135575f80fd5b50610128610144366004613c55565b610815565b348015610154575f80fd5b50610193610163366004613c55565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b3480156101b1575f80fd5b506101286101c0366004613c55565b610971565b3480156101d0575f80fd5b506101e46101df366004613c55565b6109de565b6040516001600160401b03909116815260200161019d565b348015610207575f80fd5b50610128610216366004613c6c565b6109f4565b348015610226575f80fd5b50610128610235366004613c85565b610a1f565b348015610245575f80fd5b50610193610254366004613cc3565b610c10565b348015610264575f80fd5b506101e4610273366004613c55565b610c29565b348015610283575f80fd5b50610128610292366004613c55565b610c3d565b3480156102a2575f80fd5b506101286102b1366004613c1a565b610caa565b3480156102c1575f80fd5b506101286102d0366004613c85565b610ce4565b3480156102e0575f80fd5b506101286102ef366004613c6c565b610f14565b3480156102ff575f80fd5b5061030e6005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610331575f80fd5b50610128610340366004613c55565b6110d1565b610193610353366004613c55565b6111a0565b348015610363575f80fd5b50610128610372366004613cdc565b6111ac565b610193610385366004613d85565b61128e565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0760205260408120600101545f805160206144648339815191529184156103dc576103d982856112b2565b90505b5f868152600784016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613e17565b600481111561041f5761041f613e17565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613e17565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206144848339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206144848339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f6105678461154e565b600383526001600160401b0342811660a0850152811660e08401525f8981526007870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613e17565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610686856115c2565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107129190613e3f565b905061071e86826116a1565b5f61072a8785846116e9565b5f8c815260098a01602052604090209091506107468282613ee3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610773908590600401613fc4565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190613ff6565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f805160206144a483398151915292919061085d90613e66565b905011801561088f575060035f83815260048301602052604090205460ff16600581111561088d5761088d613e17565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c919060040161400d565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190613ff6565b505050565b61097a81611906565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d09602052604090819020905163ee5b48eb60e01b81525f80516020614464833981519152916005600160991b019163ee5b48eb9161092c9160040161400d565b5f6109ee64e8d4a5100083614097565b92915050565b5f6109fe826119d5565b9050610a1b81606001516001600160401b03168260400151611d63565b5050565b5f805160206144648339815191525f610a3784611d76565b90505f80610a488360400151611f57565b5091509150610a5685612192565b5f8581526008850160205260408120610a6e91613b62565b5f610a78836115c2565b9050816001600160401b031681608001516001600160401b03161015610ab05760405162461bcd60e51b81526004016104ef906140b6565b5f8681526007860160205260409020600201546001600160401b03808416600160c01b909204161115610af55760405162461bcd60e51b81526004016104ef906140f8565b60015f87815260078701602052604090205460ff166004811115610b1b57610b1b613e17565b14610b845760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600786016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109ee6001600160401b03831664e8d4a51000614141565b5f610c33826115c2565b60a0015192915050565b610c4681612192565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614464833981519152916005600160991b019163ee5b48eb9161092c9160040161400d565b5f610cb4846115c2565b60a001519050610cc38161226b565b8215610cd557610cd384836112b2565b505b610cde84612437565b50505050565b5f805160206144648339815191525f610cfc84611d76565b90505f80610d0d8360400151611f57565b5091509150610d1b85611906565b5f8581526009850160205260408120610d3391613b62565b5f610d3d836115c2565b9050816001600160401b031681608001516001600160401b03161015610d755760405162461bcd60e51b81526004016104ef906140b6565b5f8681526007860160205260409020600301546001600160401b0380841691161115610db35760405162461bcd60e51b81526004016104ef906140f8565b60035f87815260078701602052604090205460ff166004811115610dd957610dd9613e17565b14610e2d5760405162461bcd60e51b815260206004820152603160248201525f805160206144848339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f868152600786016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610ed291611d63565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206144a48339815191525f610f2c83611d76565b90505f80610f3d8360400151612807565b9150915080610f9f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f82815260028501602052604081208054610fb990613e66565b9050118015610feb575060015f83815260048601602052604090205460ff166005811115610fe957610fe9613e17565b145b6110075760405162461bcd60e51b81526004016104ef90614158565b5f828152600285016020526040812061101f91613b62565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f805160206144a483398151915292919061111990613e66565b905011801561114b575060015f83815260048301602052604090205460ff16600581111561114957611149613e17565b145b6111675760405162461bcd60e51b81526004016104ef90614158565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c919060040161400d565b5f6109ee8233346129a8565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806111f5575080546001600160401b03808416911610155b156112135760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561123d83612d60565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8061129934612d74565b90506112a785828686612e27565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112fd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261132491908101906141be565b91509150806113875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ee9190613ff6565b8251146114525760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156114c85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806114d78460400151613302565b915091508187146115445760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206144c48339815191526020526040812060030180545f805160206144a4833981519152916001600160401b039091169081908461159383614290565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115ca613b99565b5f8281525f805160206144c48339815191526020526040908190208151610100810190925280545f805160206144a4833981519152929190829060ff16600581111561161857611618613e17565b600581111561162957611629613e17565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206144c4833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611762576117228160016142b5565b61172d906008614141565b5081515f90839083908110611744576117446142c8565b60200101906001600160f81b03191690815f1a90535060010161170e565b505f5b60048110156117c5576117798160036142b5565b611784906008614141565b6001901c60f81b826117978360026142dc565b815181106117a7576117a76142c8565b60200101906001600160f81b03191690815f1a905350600101611765565b505f5b6020811015611827576117dc81601f6142b5565b6117e7906008614141565b86901c60f81b826117f98360066142dc565b81518110611809576118096142c8565b60200101906001600160f81b03191690815f1a9053506001016117c8565b505f5b60088110156118925761183e8160076142b5565b611849906008614141565b6001600160401b038616901c60f81b826118648360266142dc565b81518110611874576118746142c8565b60200101906001600160f81b03191690815f1a90535060010161182a565b505f5b60088110156118fd576118a98160076142b5565b6118b4906008614141565b6001600160401b038516901c60f81b826118cf83602e6142dc565b815181106118df576118df6142c8565b60200101906001600160f81b03191690815f1a905350600101611895565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d096020526040812080545f8051602061446483398151915292919061194e90613e66565b9050118015611980575060035f83815260078301602052604090205460ff16600481111561197e5761197e613e17565b145b610a1b5760405162461bcd60e51b815260206004820152603360248201525f8051602061448483398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b6119dd613b99565b5f805160206144a48339815191525f6119f584611d76565b90505f80611a068360400151612807565b915091508015611a6b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115611a9d57611a9d613e17565b6005811115611aae57611aae613e17565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b3557611b35613e17565b1480611b535750600182516005811115611b5157611b51613e17565b145b611bb25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115611bc757611bc7613e17565b03611bee57505f8381526003860160205260408120600491611be99190613b62565b611bf2565b5060055b6020808301515f9081526005808901909252604081205582908290811115611c1c57611c1c613e17565b90816005811115611c2f57611c2f613e17565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115611c6357611c63613e17565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d2e57611d2e613e17565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a1b6001600160a01b038216836134da565b60408051606080820183525f8083526020830181905292820152905f805160206144a48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611deb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e1291908101906141be565b9150915080611e795760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611edc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611f4f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f805f8351603614611f7b5760405162461bcd60e51b81526004016104ef906142ef565b5f805b6002811015611fca57611f928160016142b5565b611f9d906008614141565b61ffff16868281518110611fb357611fb36142c8565b016020015160f81c901b9190911790600101611f7e565b5061ffff811615611fed5760405162461bcd60e51b81526004016104ef90614338565b5f805b6004811015612048576120048160036142b5565b61200f906008614141565b63ffffffff16876120218360026142dc565b81518110612031576120316142c8565b016020015160f81c901b9190911790600101611ff0565b5063ffffffff811660031461206f5760405162461bcd60e51b81526004016104ef9061437b565b5f805b60208110156120c45761208681601f6142b5565b612091906008614141565b8861209d8360066142dc565b815181106120ad576120ad6142c8565b016020015160f81c901b9190911790600101612072565b505f805b6008811015612123576120dc8160076142b5565b6120e7906008614141565b6001600160401b0316896120fc8360266142dc565b8151811061210c5761210c6142c8565b016020015160f81c901b91909117906001016120c8565b505f805b60088110156121825761213b8160076142b5565b612146906008614141565b6001600160401b03168a61215b83602e6142dc565b8151811061216b5761216b6142c8565b016020015160f81c901b9190911790600101612127565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f805160206144648339815191529291906121da90613e66565b905011801561220c575060015f83815260078301602052604090205460ff16600481111561220a5761220a613e17565b145b610a1b5760405162461bcd60e51b815260206004820152603860248201525f8051602061448483398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f805160206144648339815191525f6122a27fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb065490565b6002830154909150600160401b900460ff1615806122be575080155b156122c857505050565b6040805160608101825260038401548082526004850154602083015260058501546001600160401b039081169383019390935260028501544293169061230e90846142b5565b10612331576001600160401b038516604082015281815260208101839052612350565b848160400181815161234391906143c2565b6001600160401b03169052505b5f81602001518260400151606461236791906143e2565b6001600160401b031661237a9190614097565b600286015490915060ff600160401b909104811690821611156123f85760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2063687560448201526f1c9b881c985d1948195e18d95959195960821b60648201526084016104ef565b508051600385015560208101516004850155604001516005909301805467ffffffffffffffff19166001600160401b0390941693909317909255505050565b5f8181525f805160206144c483398151915260205260408082208151610100810190925280545f805160206144a483398151915293929190829060ff16600581111561248557612485613e17565b600581111561249657612496613e17565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561251e5761251e613e17565b1461257a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146125f45760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff1916600183600581111561263857612638613e17565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612704846126fe8161154e565b5f6116e9565b5f85815260038501602052604090209091506127208282613ee3565b508160a001516001600160401b0316836006015f82825461274191906142b5565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612772908590600401613fc4565b6020604051808303815f875af115801561278e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b29190613ff6565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461282a5760405162461bcd60e51b81526004016104ef906142ef565b5f805b6002811015612879576128418160016142b5565b61284c906008614141565b61ffff16858281518110612862576128626142c8565b016020015160f81c901b919091179060010161282d565b5061ffff81161561289c5760405162461bcd60e51b81526004016104ef90614338565b5f805b60048110156128f7576128b38160036142b5565b6128be906008614141565b63ffffffff16866128d08360026142dc565b815181106128e0576128e06142c8565b016020015160f81c901b919091179060010161289f565b5063ffffffff811660021461291e5760405162461bcd60e51b81526004016104ef9061437b565b5f805b60208110156129735761293581601f6142b5565b612940906008614141565b8761294c8360066142dc565b8151811061295c5761295c6142c8565b016020015160f81c901b9190911790600101612921565b505f86602681518110612988576129886142c8565b016020015191976001600160f81b03199092161515965090945050505050565b5f6129b161356d565b5f6129bb836109de565b90505f805160206144648339815191525f6129d5876115c2565b90506002815160058111156129ec576129ec613e17565b14612a4b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f838260a00151612a5c91906143c2565b9050612a6888826116a1565b5f612a728961154e565b90505f898983604051602001612aba9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612adb8661226b565b5f612ae78b84866116e9565b5f8381526008880160205260409020909150612b038282613ee3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b30908590600401613fc4565b6020604051808303815f875af1158015612b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b709190613ff6565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876007015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c1f57612c1f613e17565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506112ab60015f805160206144e483398151915255565b612d686135b7565b612d7181613602565b50565b5f5f805160206144648339815191528282612d8e826109de565b83549091506001600160401b03821610801590612db857508260010154816001600160401b031611155b612e165760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b612e1f8161226b565b949350505050565b5f612e3061356d565b5f805160206144a4833981519152426001600160401b03851611612eb25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612ec9426202a3006142dc565b11612f3c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612f935760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f868152600582016020526040902054156130015760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b82516030146130685760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b5f806130af6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613666565b5f828152600286016020526040902091935091506130cd8282613ee3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906130fa908590600401613fc4565b6020604051808303815f875af1158015613116573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061313a9190613ff6565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff191660018360058111156131bc576131bc613e17565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695851695909517919091171692909217929092179055600685018054918a16915f9061328d9084906142dc565b9091555061329c90508361154e565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612e1f60015f805160206144e483398151915255565b5f808251602e146133255760405162461bcd60e51b81526004016104ef906142ef565b5f805b60028110156133745761333c8160016142b5565b613347906008614141565b61ffff1685828151811061335d5761335d6142c8565b016020015160f81c901b9190911790600101613328565b5061ffff8116156133975760405162461bcd60e51b81526004016104ef90614338565b5f805b60048110156133f2576133ae8160036142b5565b6133b9906008614141565b63ffffffff16866133cb8360026142dc565b815181106133db576133db6142c8565b016020015160f81c901b919091179060010161339a565b5063ffffffff81166004146134195760405162461bcd60e51b81526004016104ef9061437b565b5f805b602081101561346e5761343081601f6142b5565b61343b906008614141565b876134478360066142dc565b81518110613457576134576142c8565b016020015160f81c901b919091179060010161341c565b505f805b60088110156134cd576134868160076142b5565b613491906008614141565b6001600160401b0316886134a68360266142dc565b815181106134b6576134b66142c8565b016020015160f81c901b9190911790600101613472565b5090969095509350505050565b804710156134fd5760405163cd78605960e01b81523060048201526024016104ef565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613546576040519150601f19603f3d011682016040523d82523d5f602084013e61354b565b606091505b505090508061096c57604051630a12f52160e11b815260040160405180910390fd5b5f805160206144e483398151915280546001190161359e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206144e483398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661360057604051631afcd79f60e31b815260040160405180910390fd5b565b61360a6135b7565b61361381613a0b565b612d716040820135606083013561363060a0850160808601613cc3565b61364060c0860160a08701613cc3565b61365060e0870160c0880161440d565b613661610100880160e0890161442d565b613a2c565b5f60608260800151516030146136d05760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613747576137078160016142b5565b613712906008614141565b5081515f90839083908110613729576137296142c8565b60200101906001600160f81b03191690815f1a9053506001016136f3565b505f5b60048110156137a55761375e8160036142b5565b613769906008614141565b505f826137778360026142dc565b81518110613787576137876142c8565b60200101906001600160f81b03191690815f1a90535060010161374a565b505f5b602081101561380257845181602081106137c4576137c46142c8565b1a60f81b826137d48360066142dc565b815181106137e4576137e46142c8565b60200101906001600160f81b03191690815f1a9053506001016137a8565b505f5b60208110156138625784602001518160208110613824576138246142c8565b1a60f81b826138348360266142dc565b81518110613844576138446142c8565b60200101906001600160f81b03191690815f1a905350600101613805565b505f5b60088110156138d6576138798160076142b5565b613884906008614141565b60ff1685604001516001600160401b0316901c60f81b828260466138a891906142dc565b815181106138b8576138b86142c8565b60200101906001600160f81b03191690815f1a905350600101613865565b505f5b603081101561394157846080015181815181106138f8576138f86142c8565b01602001516001600160f81b0319168261391383604e6142dc565b81518110613923576139236142c8565b60200101906001600160f81b03191690815f1a9053506001016138d9565b505f5b60088110156139b3576139588160076142b5565b613963906008614141565b60608601516001600160401b0390811691161c60f81b8261398583607e6142dc565b81518110613995576139956142c8565b60200101906001600160f81b03191690815f1a905350600101613944565b506002816040516139c49190614448565b602060405180830381855afa1580156139df573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a029190613ff6565b94909350915050565b613a136135b7565b613a1b613b01565b613a23613b11565b612d7181613b19565b613a346135b7565b5f80516020614464833981519152959095557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01939093557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0280547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0396871617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b613b096135b7565b613600613b5a565b6136006135b7565b613b216135b7565b80355f805160206144a483398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b6135a46135b7565b508054613b6e90613e66565b5f825580601f10613b7d575050565b601f0160209004905f5260205f2090810190612d719190613bdd565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613bf1575f8155600101613bde565b5090565b8015158114612d71575f80fd5b803563ffffffff81168114613c15575f80fd5b919050565b5f805f60608486031215613c2c575f80fd5b833592506020840135613c3e81613bf5565b9150613c4c60408501613c02565b90509250925092565b5f60208284031215613c65575f80fd5b5035919050565b5f60208284031215613c7c575f80fd5b6112ab82613c02565b5f8060408385031215613c96575f80fd5b613c9f83613c02565b946020939093013593505050565b80356001600160401b0381168114613c15575f80fd5b5f60208284031215613cd3575f80fd5b6112ab82613cad565b5f6101008284031215613ced575f80fd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d2957613d29613cf3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d5757613d57613cf3565b604052919050565b5f6001600160401b03821115613d7757613d77613cf3565b50601f01601f191660200190565b5f805f60608486031215613d97575f80fd5b83359250613da760208501613cad565b915060408401356001600160401b03811115613dc1575f80fd5b8401601f81018613613dd1575f80fd5b8035613de4613ddf82613d5f565b613d2f565b818152876020838501011115613df8575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e5f57613e5f613e2b565b5092915050565b600181811c90821680613e7a57607f821691505b602082108103613ced57634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c81016020851015613ebd5750805b601f840160051c820191505b81811015613edc575f8155600101613ec9565b5050505050565b81516001600160401b03811115613efc57613efc613cf3565b613f1081613f0a8454613e66565b84613e98565b602080601f831160018114613f43575f8415613f2c5750858301515b5f19600386901b1c1916600185901b178555613f9a565b5f85815260208120601f198616915b82811015613f7157888601518255948401946001909101908401613f52565b5085821015613f8e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613fbc578181015183820152602001613fa4565b50505f910152565b602081525f8251806020840152613fe2816040850160208701613fa2565b601f01601f19169190910160400192915050565b5f60208284031215614006575f80fd5b5051919050565b5f60208083525f845461401f81613e66565b806020870152604060018084165f8114614040576001811461405c57614089565b60ff19851660408a0152604084151560051b8a01019550614089565b895f5260205f205f5b858110156140805781548b8201860152908301908801614065565b8a016040019650505b509398975050505050505050565b5f826140b157634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109ee576109ee613e2b565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114612d71575f80fd5b8051613c1581613bf5565b5f80604083850312156141cf575f80fd5b82516001600160401b03808211156141e5575f80fd5b90840190606082870312156141f8575f80fd5b614200613d07565b825181526020808401516142138161419f565b82820152604084015183811115614228575f80fd5b80850194505087601f85011261423c575f80fd5b8351925061424c613ddf84613d5f565b838152888285870101111561425f575f80fd5b61426e84838301848801613fa2565b806040840152508195506142838188016141b3565b9450505050509250929050565b5f6001600160401b038083168181036142ab576142ab613e2b565b6001019392505050565b818103818111156109ee576109ee613e2b565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109ee576109ee613e2b565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613e5f57613e5f613e2b565b6001600160401b0381811683821602808216919082811461440557614405613e2b565b505092915050565b5f6020828403121561441d575f80fd5b813560ff811681146112ab575f80fd5b5f6020828403121561443d575f80fd5b81356112ab8161419f565b5f8251614459818460208701613fa2565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -459,23 +458,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x2e1488ec. +// Initialize is a paid mutator transaction binding the contract method 0xed849d8f. // -// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint256,uint64,uint64,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint64,uint64,uint8,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 0x2e1488ec. +// Initialize is a paid mutator transaction binding the contract method 0xed849d8f. // -// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint256,uint64,uint64,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint64,uint64,uint8,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 0x2e1488ec. +// Initialize is a paid mutator transaction binding the contract method 0xed849d8f. // -// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint256,uint64,uint64,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint64,uint64,uint8,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index fb5fafbf4..be95236bf 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -28,9 +28,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 _minimumStakeAmount; /// @notice The maximum amount of stake allowed to be a validator. uint256 _maximumStakeAmount; - /// @notice The time at which the churn tracker will start. This allows networks to bootstrap - /// their validator set without worrying about churn tracking for a set period of time. - uint256 _churnTrackerStartTime; /// @notice The number of seconds after which to reset the churn tracker. uint64 _churnPeriodSeconds; /// @notice The maximum churn rate allowed per churn period. @@ -76,7 +73,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager __POS_Validator_Manager_init_unchained({ minimumStakeAmount: settings.minimumStakeAmount, maximumStakeAmount: settings.maximumStakeAmount, - churnTrackerStartTime: settings.churnTrackerStartTime, churnPeriodSeconds: settings.churnPeriodSeconds, minimumStakeDuration: settings.minimumStakeDuration, maximumChurnPercentage: settings.maximumChurnPercentage, @@ -88,7 +84,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function __POS_Validator_Manager_init_unchained( uint256 minimumStakeAmount, uint256 maximumStakeAmount, - uint256 churnTrackerStartTime, uint64 churnPeriodSeconds, uint64 minimumStakeDuration, uint8 maximumChurnPercentage, @@ -97,7 +92,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); $._minimumStakeAmount = minimumStakeAmount; $._maximumStakeAmount = maximumStakeAmount; - $._churnTrackerStartTime = churnTrackerStartTime; $._churnPeriodSeconds = churnPeriodSeconds; $._minimumStakeDuration = minimumStakeDuration; $._maximumChurnPercentage = maximumChurnPercentage; @@ -190,11 +184,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager } uint256 currentTime = block.timestamp; - if ($._churnTrackerStartTime >= currentTime) { - return; - } - ValidatorChurnPeriod memory churnTracker = $._churnTracker; + if (currentTime - churnTracker.startedAt >= $._churnPeriodSeconds) { churnTracker.churnAmount = weight; churnTracker.startedAt = currentTime; diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 618d1e533..8277cf348 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -20,7 +20,6 @@ struct PoSValidatorManagerSettings { ValidatorManagerSettings baseSettings; uint256 minimumStakeAmount; uint256 maximumStakeAmount; - uint256 churnTrackerStartTime; uint64 churnPeriodSeconds; uint64 minimumStakeDuration; uint8 maximumChurnPercentage; diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index c380dd4c4..4b5704fe4 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -35,7 +35,6 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { }), minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, - churnTrackerStartTime: DEFAULT_CHURN_TRACKER_START_TIME, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE, diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index d413d3941..cd0d4127c 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -29,7 +29,6 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, - churnTrackerStartTime: DEFAULT_CHURN_TRACKER_START_TIME, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE, rewardCalculator: IRewardCalculator(address(0)) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 55f567ccd..73a16573a 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -72,46 +72,15 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { return validationIDs; } - // Attempts to register a validator with weight equal to the total weight. - function testInvalidChurnRegistration() public { - // First registration should work - registerValidators(1); - - vm.warp(DEFAULT_CHURN_TRACKER_START_TIME + 1); - - _beforeSend(DEFAULT_WEIGHT, address(this)); - uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); - - bytes32 nodeID = _newNodeID(); - vm.expectRevert(_formatErrorMessage("maximum churn rate exceeded")); - _initializeValidatorRegistrationWithValue( - nodeID, DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value - ); - } - - // Attempts to register a validator with weight equal to the total weight. - function testInvalidChurnEndValidation() public { - // First registration should work - bytes32[] memory validationIDs = registerValidators(1); - - vm.warp(DEFAULT_CHURN_TRACKER_START_TIME + 1); - vm.expectRevert(_formatErrorMessage("maximum churn rate exceeded")); - - // Initialize the end of one of the validators. - _initializeEndValidation(validationIDs[0]); - } - function testCummulativeChurnRegistration() public { registerValidators(5); - vm.warp(DEFAULT_CHURN_TRACKER_START_TIME + 1); - _beforeSend(DEFAULT_WEIGHT, address(this)); uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); // First call after churn tracking start should work _initializeValidatorRegistrationWithValue( - _newNodeID(), DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value + _newNodeID(), uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value ); bytes32 nodeID = _newNodeID(); // Needs to be called before expectRevert @@ -120,21 +89,19 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Second call after churn tracking start should fail vm.expectRevert(_formatErrorMessage("maximum churn rate exceeded")); _initializeValidatorRegistrationWithValue( - nodeID, DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value + nodeID, uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value ); } function testCummulativeChurnRegistrationAndEndValidation() public { bytes32[] memory validationIDs = registerValidators(10); - vm.warp(DEFAULT_CHURN_TRACKER_START_TIME + 1); - _beforeSend(DEFAULT_WEIGHT, address(this)); uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); // First call after churn tracking start should work _initializeValidatorRegistrationWithValue( - _newNodeID(), DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value + _newNodeID(), uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value ); // Initialize the end of one of the validators. @@ -146,7 +113,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Second call after churn tracking start should fail vm.expectRevert(_formatErrorMessage("maximum churn rate exceeded")); _initializeValidatorRegistrationWithValue( - nodeID, DEFAULT_CHURN_TRACKER_START_TIME + 1 days, DEFAULT_BLS_PUBLIC_KEY, value + nodeID, uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value ); } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 008e08073..ab7b3cfa3 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -34,7 +34,6 @@ abstract contract ValidatorManagerTest is Test { uint256 public constant DEFAULT_MINIMUM_STAKE = 20; uint256 public constant DEFAULT_MAXIMUM_STAKE = 1e10; uint64 public constant DEFAULT_CHURN_PERIOD = 1 hours; - uint64 public constant DEFAULT_CHURN_TRACKER_START_TIME = 1 days; uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint8 public constant DEFAULT_MAXIMUM_CHURN_PERCENTAGE = 20; uint64 public constant DEFAULT_EXPIRY = 1000; From f52c04a1ea8b6f23e643d7df93e0ee38d65d861a Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 10 Sep 2024 15:37:17 -0400 Subject: [PATCH 236/545] Churn tracker to ValidatorManager --- .../ERC20TokenStakingManager.go | 34 ++++++------ .../NativeTokenStakingManager.go | 34 ++++++------ .../PoAValidatorManager.go | 22 ++++---- contracts/staking/PoSValidatorManager.sol | 55 +------------------ contracts/staking/ValidatorManager.sol | 45 +++++++++++++-- .../interfaces/IPoSValidatorManager.sol | 8 --- .../staking/interfaces/IValidatorManager.sol | 8 +++ .../tests/ERC20TokenStakingManagerTests.t.sol | 6 +- .../NativeTokenStakingManagerTests.t.sol | 6 +- .../tests/PoAValidatorManagerTests.t.sol | 4 +- 10 files changed, 106 insertions(+), 116 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index b84d91bc6..319b5a12e 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -31,25 +31,25 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { - BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int - ChurnPeriodSeconds uint64 - MinimumStakeDuration uint64 - MaximumChurnPercentage uint8 - RewardCalculator common.Address + BaseSettings ValidatorManagerSettings + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + MinimumStakeDuration uint64 + RewardCalculator common.Address } // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { - PChainBlockchainID [32]byte - SubnetID [32]byte + PChainBlockchainID [32]byte + SubnetID [32]byte + ChurnPeriodSeconds uint64 + MaximumChurnPercentage uint8 } // 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614a2a380380614a2a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148dd8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063a7f7f0701461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872fda641461023e57806398f3e2b414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613f75565b6102d6565b005b610128610138366004613fb0565b610761565b61017b61014b366004613fb0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613fb0565b6108bd565b6101b46101af366004613fb0565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da366004613fc7565b610940565b6101286101ed366004613fe0565b61096b565b61017b61020036600461401e565b610b5c565b6101b4610213366004613fb0565b610b75565b610128610226366004613fb0565b610b89565b610128610239366004613f75565b610bf6565b61017b61024c3660046140c9565b610c30565b61012861025f366004613fe0565b610c55565b61017b610272366004614165565b610e85565b610128610285366004613fc7565b610e98565b610128610298366004614199565b611055565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613fb0565b611139565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0760205260408120600101545f80516020614831833981519152918415610328576103258285611208565b90505b5f868152600784016020526040808220815161010081019092528054829060ff16600481111561035a5761035a6141d7565b600481111561036b5761036b6141d7565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f26141d7565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206148518339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206148518339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b3846114a4565b600383526001600160401b0342811660a0850152811660e08401525f8981526007870160205260409020835181549293508492829060ff19166001836004811115610500576105006141d7565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611518565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e91906141ff565b905061066a86826115f7565b5f61067687858461163f565b5f8c815260098a016020526040902090915061069282826142a9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf90859060040161438a565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906143bc565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f805160206148718339815191529291906107a990614226565b90501180156107db575060035f83815260048301602052604090205460ff1660058111156107d9576107d96141d7565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016143d3565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906143bc565b505050565b6108c68161185c565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d09602052604090819020905163ee5b48eb60e01b81525f80516020614831833981519152916005600160991b019163ee5b48eb91610878916004016143d3565b5f61093a64e8d4a510008361445d565b92915050565b5f61094a8261192b565b905061096781606001516001600160401b03168260400151611cb9565b5050565b5f805160206148318339815191525f61098384611cef565b90505f806109948360400151611ed0565b50915091506109a28561210b565b5f85815260088501602052604081206109ba91613ebd565b5f6109c483611518565b9050816001600160401b031681608001516001600160401b031610156109fc5760405162461bcd60e51b815260040161043b9061447c565b5f8681526007860160205260409020600201546001600160401b03808416600160c01b909204161115610a415760405162461bcd60e51b815260040161043b906144be565b60015f87815260078701602052604090205460ff166004811115610a6757610a676141d7565b14610ad05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600786016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a51000614507565b5f610b7f82611518565b60a0015192915050565b610b928161210b565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614831833981519152916005600160991b019163ee5b48eb91610878916004016143d3565b5f610c0084611518565b60a001519050610c0f816121e4565b8215610c2157610c1f8483611208565b505b610c2a846123b0565b50505050565b5f80610c3b86612780565b9050610c4985828686612836565b9150505b949350505050565b5f805160206148318339815191525f610c6d84611cef565b90505f80610c7e8360400151611ed0565b5091509150610c8c8561185c565b5f8581526009850160205260408120610ca491613ebd565b5f610cae83611518565b9050816001600160401b031681608001516001600160401b03161015610ce65760405162461bcd60e51b815260040161043b9061447c565b5f8681526007860160205260409020600301546001600160401b0380841691161115610d245760405162461bcd60e51b815260040161043b906144be565b60035f87815260078701602052604090205460ff166004811115610d4a57610d4a6141d7565b14610d9e5760405162461bcd60e51b815260206004820152603160248201525f805160206148518339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600786016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610e4391611cb9565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610e91833384612d11565b9392505050565b5f805160206148718339815191525f610eb083611cef565b90505f80610ec183604001516130cc565b9150915080610f235760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260028501602052604081208054610f3d90614226565b9050118015610f6f575060015f83815260048601602052604090205460ff166005811115610f6d57610f6d6141d7565b145b610f8b5760405162461bcd60e51b815260040161043b9061451e565b5f8281526002850160205260408120610fa391613ebd565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061109e575080546001600160401b03808416911610155b156110bc5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556110e7848461326d565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061487183398151915292919061118190614226565b90501180156111b3575060015f83815260048301602052604090205460ff1660058111156111b1576111b16141d7565b145b6111cf5760405162461bcd60e51b815260040161043b9061451e565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016143d3565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611253573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261127a9190810190614570565b91509150806112dd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611320573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061134491906143bc565b8251146113a85760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b03161561141e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061142d8460400151613287565b9150915081871461149a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206148918339815191526020526040812060030180545f80516020614871833981519152916001600160401b03909116908190846114e983614642565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611520613ef4565b5f8281525f805160206148918339815191526020526040908190208151610100810190925280545f80516020614871833981519152929190829060ff16600581111561156e5761156e6141d7565b600581111561157f5761157f6141d7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614891833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116b857611678816001614667565b611683906008614507565b5081515f9083908390811061169a5761169a61467a565b60200101906001600160f81b03191690815f1a905350600101611664565b505f5b600481101561171b576116cf816003614667565b6116da906008614507565b6001901c60f81b826116ed83600261468e565b815181106116fd576116fd61467a565b60200101906001600160f81b03191690815f1a9053506001016116bb565b505f5b602081101561177d5761173281601f614667565b61173d906008614507565b86901c60f81b8261174f83600661468e565b8151811061175f5761175f61467a565b60200101906001600160f81b03191690815f1a90535060010161171e565b505f5b60088110156117e857611794816007614667565b61179f906008614507565b6001600160401b038616901c60f81b826117ba83602661468e565b815181106117ca576117ca61467a565b60200101906001600160f81b03191690815f1a905350600101611780565b505f5b6008811015611853576117ff816007614667565b61180a906008614507565b6001600160401b038516901c60f81b8261182583602e61468e565b815181106118355761183561467a565b60200101906001600160f81b03191690815f1a9053506001016117eb565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d096020526040812080545f805160206148318339815191529291906118a490614226565b90501180156118d6575060035f83815260078301602052604090205460ff1660048111156118d4576118d46141d7565b145b6109675760405162461bcd60e51b815260206004820152603360248201525f8051602061485183398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b611933613ef4565b5f805160206148718339815191525f61194b84611cef565b90505f8061195c83604001516130cc565b9150915080156119c15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600485016020526040808220815161010081019092528054829060ff1660058111156119f3576119f36141d7565b6005811115611a0457611a046141d7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8b57611a8b6141d7565b1480611aa95750600182516005811115611aa757611aa76141d7565b145b611b085760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1d57611b1d6141d7565b03611b4457505f8381526003860160205260408120600491611b3f9190613ebd565b611b48565b5060055b6020808301515f9081526005808901909252604081205582908290811115611b7257611b726141d7565b90816005811115611b8557611b856141d7565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115611bb957611bb96141d7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c8457611c846141d7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610967906001600160a01b0316828461345f565b60408051606080820183525f8083526020830181905292820152905f805160206148718339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d8b9190810190614570565b9150915080611df25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e555760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ec85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611ef45760405162461bcd60e51b815260040161043b906146a1565b5f805b6002811015611f4357611f0b816001614667565b611f16906008614507565b61ffff16868281518110611f2c57611f2c61467a565b016020015160f81c901b9190911790600101611ef7565b5061ffff811615611f665760405162461bcd60e51b815260040161043b906146ea565b5f805b6004811015611fc157611f7d816003614667565b611f88906008614507565b63ffffffff1687611f9a83600261468e565b81518110611faa57611faa61467a565b016020015160f81c901b9190911790600101611f69565b5063ffffffff8116600314611fe85760405162461bcd60e51b815260040161043b9061472d565b5f805b602081101561203d57611fff81601f614667565b61200a906008614507565b8861201683600661468e565b815181106120265761202661467a565b016020015160f81c901b9190911790600101611feb565b505f805b600881101561209c57612055816007614667565b612060906008614507565b6001600160401b03168961207583602661468e565b815181106120855761208561467a565b016020015160f81c901b9190911790600101612041565b505f805b60088110156120fb576120b4816007614667565b6120bf906008614507565b6001600160401b03168a6120d483602e61468e565b815181106120e4576120e461467a565b016020015160f81c901b91909117906001016120a0565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f8051602061483183398151915292919061215390614226565b9050118015612185575060015f83815260078301602052604090205460ff166004811115612183576121836141d7565b145b6109675760405162461bcd60e51b815260206004820152603860248201525f8051602061485183398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f805160206148318339815191525f61221b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb065490565b6002830154909150600160401b900460ff161580612237575080155b1561224157505050565b6040805160608101825260038401548082526004850154602083015260058501546001600160401b03908116938301939093526002850154429316906122879084614667565b106122aa576001600160401b0385166040820152818152602081018390526122c9565b84816040018181516122bc9190614774565b6001600160401b03169052505b5f8160200151826040015160646122e09190614794565b6001600160401b03166122f3919061445d565b600286015490915060ff600160401b909104811690821611156123715760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2063687560448201526f1c9b881c985d1948195e18d95959195960821b606482015260840161043b565b508051600385015560208101516004850155604001516005909301805467ffffffffffffffff19166001600160401b0390941693909317909255505050565b5f8181525f8051602061489183398151915260205260408082208151610100810190925280545f8051602061487183398151915293929190829060ff1660058111156123fe576123fe6141d7565b600581111561240f5761240f6141d7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612497576124976141d7565b146124f35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461256d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff191660018360058111156125b1576125b16141d7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61267d84612677816114a4565b5f61163f565b5f858152600385016020526040902090915061269982826142a9565b508160a001516001600160401b0316836006015f8282546126ba9190614667565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126eb90859060040161438a565b6020604051808303815f875af1158015612707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061272b91906143bc565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061483183398151915281612799846134be565b90505f6127a58261092a565b83549091506001600160401b038216108015906127cf57508260010154816001600160401b031611155b61282d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b610c4d816121e4565b5f61283f6134f4565b5f80516020614871833981519152426001600160401b038516116128c15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b0384166128d8426202a30061468e565b1161294b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b856129a25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f86815260058201602052604090205415612a105760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612a775760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b5f80612abe6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061352b565b5f82815260028601602052604090209193509150612adc82826142a9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b0990859060040161438a565b6020604051808303815f875af1158015612b25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b4991906143bc565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff19166001836005811115612bcb57612bcb6141d7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695851695909517919091171692909217929092179055600685018054918a16915f90612c9c90849061468e565b90915550612cab9050836114a4565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610c4d60015f805160206148b183398151915255565b5f612d1a6134f4565b5f612d276101af846134be565b90505f805160206148318339815191525f612d4187611518565b9050600281516005811115612d5857612d586141d7565b14612db75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612dc89190614774565b9050612dd488826115f7565b5f612dde896114a4565b90505f898983604051602001612e269392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612e47866121e4565b5f612e538b848661163f565b5f8381526008880160205260409020909150612e6f82826142a9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e9c90859060040161438a565b6020604051808303815f875af1158015612eb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612edc91906143bc565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876007015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612f8b57612f8b6141d7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610e9160015f805160206148b183398151915255565b5f8082516027146130ef5760405162461bcd60e51b815260040161043b906146a1565b5f805b600281101561313e57613106816001614667565b613111906008614507565b61ffff168582815181106131275761312761467a565b016020015160f81c901b91909117906001016130f2565b5061ffff8116156131615760405162461bcd60e51b815260040161043b906146ea565b5f805b60048110156131bc57613178816003614667565b613183906008614507565b63ffffffff168661319583600261468e565b815181106131a5576131a561467a565b016020015160f81c901b9190911790600101613164565b5063ffffffff81166002146131e35760405162461bcd60e51b815260040161043b9061472d565b5f805b6020811015613238576131fa81601f614667565b613205906008614507565b8761321183600661468e565b815181106132215761322161467a565b016020015160f81c901b91909117906001016131e6565b505f8660268151811061324d5761324d61467a565b016020015191976001600160f81b03199092161515965090945050505050565b6132756138e3565b61327e8261392e565b61096781613995565b5f808251602e146132aa5760405162461bcd60e51b815260040161043b906146a1565b5f805b60028110156132f9576132c1816001614667565b6132cc906008614507565b61ffff168582815181106132e2576132e261467a565b016020015160f81c901b91909117906001016132ad565b5061ffff81161561331c5760405162461bcd60e51b815260040161043b906146ea565b5f805b600481101561337757613333816003614667565b61333e906008614507565b63ffffffff168661335083600261468e565b815181106133605761336061467a565b016020015160f81c901b919091179060010161331f565b5063ffffffff811660041461339e5760405162461bcd60e51b815260040161043b9061472d565b5f805b60208110156133f3576133b581601f614667565b6133c0906008614507565b876133cc83600661468e565b815181106133dc576133dc61467a565b016020015160f81c901b91909117906001016133a1565b505f805b60088110156134525761340b816007614667565b613416906008614507565b6001600160401b03168861342b83602661468e565b8151811061343b5761343b61467a565b016020015160f81c901b91909117906001016133f7565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613a49565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613aaa565b5f805160206148b183398151915280546001190161352557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135955760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561360c576135cc816001614667565b6135d7906008614507565b5081515f908390839081106135ee576135ee61467a565b60200101906001600160f81b03191690815f1a9053506001016135b8565b505f5b600481101561366a57613623816003614667565b61362e906008614507565b505f8261363c83600261468e565b8151811061364c5761364c61467a565b60200101906001600160f81b03191690815f1a90535060010161360f565b505f5b60208110156136c757845181602081106136895761368961467a565b1a60f81b8261369983600661468e565b815181106136a9576136a961467a565b60200101906001600160f81b03191690815f1a90535060010161366d565b505f5b602081101561372757846020015181602081106136e9576136e961467a565b1a60f81b826136f983602661468e565b815181106137095761370961467a565b60200101906001600160f81b03191690815f1a9053506001016136ca565b505f5b600881101561379b5761373e816007614667565b613749906008614507565b60ff1685604001516001600160401b0316901c60f81b8282604661376d919061468e565b8151811061377d5761377d61467a565b60200101906001600160f81b03191690815f1a90535060010161372a565b505f5b603081101561380657846080015181815181106137bd576137bd61467a565b01602001516001600160f81b031916826137d883604e61468e565b815181106137e8576137e861467a565b60200101906001600160f81b03191690815f1a90535060010161379e565b505f5b60088110156138785761381d816007614667565b613828906008614507565b60608601516001600160401b0390811691161c60f81b8261384a83607e61468e565b8151811061385a5761385a61467a565b60200101906001600160f81b03191690815f1a905350600101613809565b5060028160405161388991906147bf565b602060405180830381855afa1580156138a4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138c791906143bc565b94909350915050565b60015f805160206148b183398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661392c57604051631afcd79f60e31b815260040160405180910390fd5b565b6139366138e3565b61393f81613c0c565b6139926040820135606083013561395c60a085016080860161401e565b61396c60c0860160a0870161401e565b61397c60e0870160c088016147da565b61398d610100880160e089016147fa565b613c2d565b50565b61399d6138e3565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613a295760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613a5d6001600160a01b03841683613d02565b905080515f14158015613a81575080806020019051810190613a7f9190614815565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613af0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b1491906143bc565b9050613b2b6001600160a01b038516333086613d0f565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613b6f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b9391906143bc565b9050818111613bf95760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613c038282614667565b95945050505050565b613c146138e3565b613c1c613d48565b613c24613d58565b61399281613d60565b613c356138e3565b5f80516020614831833981519152959095557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01939093557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0280547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0396871617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b6060610e9183835f613da1565b6040516001600160a01b038481166024830152838116604483015260648201839052610c2a9186918216906323b872dd9060840161348c565b613d506138e3565b61392c613e30565b61392c6138e3565b613d686138e3565b80355f8051602061487183398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b606081471015613dc65760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613de191906147bf565b5f6040518083038185875af1925050503d805f8114613e1b576040519150601f19603f3d011682016040523d82523d5f602084013e613e20565b606091505b509150915061149a868383613e38565b6138d06138e3565b606082613e4d57613e4882613e94565b610e91565b8151158015613e6457506001600160a01b0384163b155b15613e8d57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610e91565b805115613ea45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613ec990614226565b5f825580601f10613ed8575050565b601f0160209004905f5260205f20908101906139929190613f38565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613f4c575f8155600101613f39565b5090565b8015158114613992575f80fd5b803563ffffffff81168114613f70575f80fd5b919050565b5f805f60608486031215613f87575f80fd5b833592506020840135613f9981613f50565b9150613fa760408501613f5d565b90509250925092565b5f60208284031215613fc0575f80fd5b5035919050565b5f60208284031215613fd7575f80fd5b610e9182613f5d565b5f8060408385031215613ff1575f80fd5b613ffa83613f5d565b946020939093013593505050565b80356001600160401b0381168114613f70575f80fd5b5f6020828403121561402e575f80fd5b610e9182614008565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561406d5761406d614037565b60405290565b604051601f8201601f191681016001600160401b038111828210171561409b5761409b614037565b604052919050565b5f6001600160401b038211156140bb576140bb614037565b50601f01601f191660200190565b5f805f80608085870312156140dc575f80fd5b84359350602085013592506140f360408601614008565b915060608501356001600160401b0381111561410d575f80fd5b8501601f8101871361411d575f80fd5b803561413061412b826140a3565b614073565b818152886020838501011115614144575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215614176575f80fd5b50508035926020909101359150565b6001600160a01b0381168114613992575f80fd5b5f808284036101208112156141ac575f80fd5b610100808212156141bb575f80fd5b84935083013590506141cc81614185565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561421f5761421f6141eb565b5092915050565b600181811c9082168061423a57607f821691505b60208210810361425857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156142835750805b601f840160051c820191505b818110156142a2575f815560010161428f565b5050505050565b81516001600160401b038111156142c2576142c2614037565b6142d6816142d08454614226565b8461425e565b602080601f831160018114614309575f84156142f25750858301515b5f19600386901b1c1916600185901b178555614360565b5f85815260208120601f198616915b8281101561433757888601518255948401946001909101908401614318565b508582101561435457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561438257818101518382015260200161436a565b50505f910152565b602081525f82518060208401526143a8816040850160208701614368565b601f01601f19169190910160400192915050565b5f602082840312156143cc575f80fd5b5051919050565b5f60208083525f84546143e581614226565b806020870152604060018084165f811461440657600181146144225761444f565b60ff19851660408a0152604084151560051b8a0101955061444f565b895f5260205f205f5b858110156144465781548b820186015290830190880161442b565b8a016040019650505b509398975050505050505050565b5f8261447757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a6141eb565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613f7081613f50565b5f8060408385031215614581575f80fd5b82516001600160401b0380821115614597575f80fd5b90840190606082870312156145aa575f80fd5b6145b261404b565b825181526020808401516145c581614185565b828201526040840151838111156145da575f80fd5b80850194505087601f8501126145ee575f80fd5b835192506145fe61412b846140a3565b8381528882858701011115614611575f80fd5b61462084838301848801614368565b80604084015250819550614635818801614565565b9450505050509250929050565b5f6001600160401b0380831681810361465d5761465d6141eb565b6001019392505050565b8181038181111561093a5761093a6141eb565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561093a5761093a6141eb565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561421f5761421f6141eb565b6001600160401b038181168382160280821691908281146147b7576147b76141eb565b505092915050565b5f82516147d0818460208701614368565b9190910192915050565b5f602082840312156147ea575f80fd5b813560ff81168114610e91575f80fd5b5f6020828403121561480a575f80fd5b8135610e9181614185565b5f60208284031215614825575f80fd5b8151610e9181613f5056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161494c38038061494c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147ff8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063b771b3bc1461028a578063bee0a03f146102b0578063e74e8cab146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872fda641461023e57806398f3e2b414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613eb7565b6102d6565b005b610128610138366004613ef2565b610761565b61017b61014b366004613ef2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613ef2565b6108bd565b6101b46101af366004613ef2565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da366004613f09565b610940565b6101286101ed366004613f22565b61096b565b61017b610200366004613f60565b610b5c565b6101b4610213366004613ef2565b610b75565b610128610226366004613ef2565b610b89565b610128610239366004613eb7565b610bf6565b61017b61024c36600461400b565b610c11565b61012861025f366004613f22565b610c36565b61017b6102723660046140a7565b610e65565b610128610285366004613f09565b610e78565b6102986005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102be366004613ef2565b611035565b6101286102d13660046140db565b611104565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206147538339815191529184156103285761032582856111e8565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614119565b600481111561036b5761036b614119565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614119565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206147738339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206147738339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611484565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500614119565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856114f8565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190614141565b905061066a86826115d7565b5f61067687858461161f565b5f8c815260058a016020526040902090915061069282826141eb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016142cc565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906142fe565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206147938339815191529291906107a990614168565b90501180156107db575060035f83815260088301602052604090205460ff1660058111156107d9576107d9614119565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614315565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906142fe565b505050565b6108c68161183c565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614753833981519152916005600160991b019163ee5b48eb9161087891600401614315565b5f61093a64e8d4a510008361439f565b92915050565b5f61094a8261190b565b905061096781606001516001600160401b03168260400151611c98565b5050565b5f805160206147538339815191525f61098384611cce565b90505f806109948360400151611eaf565b50915091506109a2856120ea565b5f85815260048501602052604081206109ba91613dff565b5f6109c4836114f8565b9050816001600160401b031681608001516001600160401b031610156109fc5760405162461bcd60e51b815260040161043b906143be565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610a415760405162461bcd60e51b815260040161043b90614400565b60015f87815260038701602052604090205460ff166004811115610a6757610a67614119565b14610ad05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a51000614449565b5f610b7f826114f8565b60a0015192915050565b610b92816120ea565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614753833981519152916005600160991b019163ee5b48eb9161087891600401614315565b8115610c0857610c0683826111e8565b505b6108b8836121c3565b5f80610c1c866125a0565b9050610c2a8582868661264d565b9150505b949350505050565b5f805160206147538339815191525f610c4e84611cce565b90505f80610c5f8360400151611eaf565b5091509150610c6d8561183c565b5f8581526005850160205260408120610c8591613dff565b5f610c8f836114f8565b9050816001600160401b031681608001516001600160401b03161015610cc75760405162461bcd60e51b815260040161043b906143be565b5f8681526003808701602052604090912001546001600160401b0380841691161115610d055760405162461bcd60e51b815260040161043b90614400565b60035f87815260038701602052604090205460ff166004811115610d2b57610d2b614119565b14610d7f5760405162461bcd60e51b815260206004820152603160248201525f805160206147738339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610e239190611c98565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610e71833384612b34565b9392505050565b5f805160206147938339815191525f610e9083611cce565b90505f80610ea18360400151612eef565b9150915080610f035760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260068501602052604081208054610f1d90614168565b9050118015610f4f575060015f83815260088601602052604090205460ff166005811115610f4d57610f4d614119565b145b610f6b5760405162461bcd60e51b815260040161043b90614460565b5f8281526006850160205260408120610f8391613dff565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061479383398151915292919061107d90614168565b90501180156110af575060015f83815260088301602052604090205460ff1660058111156110ad576110ad614119565b145b6110cb5760405162461bcd60e51b815260040161043b90614460565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614315565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061114d575080546001600160401b03808416911610155b1561116b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556111968484613090565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611233573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261125a91908101906144b2565b91509150806112bd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611300573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132491906142fe565b8251146113885760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156113fe5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061140d84604001516130aa565b9150915081871461147a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206147d38339815191526020526040812060030180545f80516020614793833981519152916001600160401b03909116908190846114c983614584565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611500613e36565b5f8281525f805160206147d38339815191526020526040908190208151610100810190925280545f80516020614793833981519152929190829060ff16600581111561154e5761154e614119565b600581111561155f5761155f614119565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206147d3833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611698576116588160016145a9565b611663906008614449565b5081515f9083908390811061167a5761167a6145bc565b60200101906001600160f81b03191690815f1a905350600101611644565b505f5b60048110156116fb576116af8160036145a9565b6116ba906008614449565b6001901c60f81b826116cd8360026145d0565b815181106116dd576116dd6145bc565b60200101906001600160f81b03191690815f1a90535060010161169b565b505f5b602081101561175d5761171281601f6145a9565b61171d906008614449565b86901c60f81b8261172f8360066145d0565b8151811061173f5761173f6145bc565b60200101906001600160f81b03191690815f1a9053506001016116fe565b505f5b60088110156117c8576117748160076145a9565b61177f906008614449565b6001600160401b038616901c60f81b8261179a8360266145d0565b815181106117aa576117aa6145bc565b60200101906001600160f81b03191690815f1a905350600101611760565b505f5b6008811015611833576117df8160076145a9565b6117ea906008614449565b6001600160401b038516901c60f81b8261180583602e6145d0565b81518110611815576118156145bc565b60200101906001600160f81b03191690815f1a9053506001016117cb565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061475383398151915292919061188490614168565b90501180156118b6575060035f83815260038301602052604090205460ff1660048111156118b4576118b4614119565b145b6109675760405162461bcd60e51b815260206004820152603360248201525f8051602061477383398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b611913613e36565b5f805160206147938339815191525f61192b84611cce565b90505f8061193c8360400151612eef565b9150915080156119a15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600885016020526040808220815161010081019092528054829060ff1660058111156119d3576119d3614119565b60058111156119e4576119e4614119565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a6b57611a6b614119565b1480611a895750600182516005811115611a8757611a87614119565b145b611ae85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611afd57611afd614119565b03611b2457505f8381526007860160205260408120600491611b1f9190613dff565b611b28565b5060055b6020808301515f90815260098801909152604081205581816005811115611b5157611b51614119565b90816005811115611b6457611b64614119565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611b9857611b98614119565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c6357611c63614119565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610967906001600160a01b03168284613282565b60408051606080820183525f8083526020830181905292820152905f805160206147938339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d6a91908101906144b2565b9150915080611dd15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e345760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ea75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611ed35760405162461bcd60e51b815260040161043b906145e3565b5f805b6002811015611f2257611eea8160016145a9565b611ef5906008614449565b61ffff16868281518110611f0b57611f0b6145bc565b016020015160f81c901b9190911790600101611ed6565b5061ffff811615611f455760405162461bcd60e51b815260040161043b9061462c565b5f805b6004811015611fa057611f5c8160036145a9565b611f67906008614449565b63ffffffff1687611f798360026145d0565b81518110611f8957611f896145bc565b016020015160f81c901b9190911790600101611f48565b5063ffffffff8116600314611fc75760405162461bcd60e51b815260040161043b9061466f565b5f805b602081101561201c57611fde81601f6145a9565b611fe9906008614449565b88611ff58360066145d0565b81518110612005576120056145bc565b016020015160f81c901b9190911790600101611fca565b505f805b600881101561207b576120348160076145a9565b61203f906008614449565b6001600160401b0316896120548360266145d0565b81518110612064576120646145bc565b016020015160f81c901b9190911790600101612020565b505f805b60088110156120da576120938160076145a9565b61209e906008614449565b6001600160401b03168a6120b383602e6145d0565b815181106120c3576120c36145bc565b016020015160f81c901b919091179060010161207f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061475383398151915292919061213290614168565b9050118015612164575060015f83815260038301602052604090205460ff16600481111561216257612162614119565b145b6109675760405162461bcd60e51b815260206004820152603860248201525f8051602061477383398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f805160206147d383398151915260205260408082208151610100810190925280545f8051602061479383398151915293929190829060ff16600581111561221157612211614119565b600581111561222257612222614119565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122aa576122aa614119565b146123065760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146123805760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156123c4576123c4614119565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124908461248a81611484565b5f61161f565b5f85815260078501602052604090209091506124ac82826141eb565b506124ba8260a001516132e1565b8160a001516001600160401b031683600a015f8282546124da91906145a9565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061250b9085906004016142cc565b6020604051808303815f875af1158015612527573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254b91906142fe565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f80516020614753833981519152816125b984613494565b90505f6125c58261092a565b83549091506001600160401b038216108015906125ef57508260010154816001600160401b031611155b610c2e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f6126566134ca565b5f80516020614793833981519152426001600160401b038516116126d85760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b0384166126ef426202a3006145d0565b116127625760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b856127b95760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600982016020526040902054156128275760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b825160301461288e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b5f806128d56040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613501565b5f828152600686016020526040902091935091506128f382826141eb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129209085906004016142cc565b6020604051808303815f875af115801561293c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296091906142fe565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff191660018360058111156129e2576129e2614119565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612aa3886132e1565b876001600160401b031684600a015f828254612abf91906145d0565b90915550612ace905083611484565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610c2e60015f805160206147b383398151915255565b5f612b3d6134ca565b5f612b4a6101af84613494565b90505f805160206147538339815191525f612b64876114f8565b9050600281516005811115612b7b57612b7b614119565b14612bda5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612beb91906146b6565b9050612bf788826115d7565b5f612c0189611484565b90505f898983604051602001612c499392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612c6a866132e1565b5f612c768b848661161f565b5f8381526004880160205260409020909150612c9282826141eb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cbf9085906004016142cc565b6020604051808303815f875af1158015612cdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cff91906142fe565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612dae57612dae614119565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610e7160015f805160206147b383398151915255565b5f808251602714612f125760405162461bcd60e51b815260040161043b906145e3565b5f805b6002811015612f6157612f298160016145a9565b612f34906008614449565b61ffff16858281518110612f4a57612f4a6145bc565b016020015160f81c901b9190911790600101612f15565b5061ffff811615612f845760405162461bcd60e51b815260040161043b9061462c565b5f805b6004811015612fdf57612f9b8160036145a9565b612fa6906008614449565b63ffffffff1686612fb88360026145d0565b81518110612fc857612fc86145bc565b016020015160f81c901b9190911790600101612f87565b5063ffffffff81166002146130065760405162461bcd60e51b815260040161043b9061466f565b5f805b602081101561305b5761301d81601f6145a9565b613028906008614449565b876130348360066145d0565b81518110613044576130446145bc565b016020015160f81c901b9190911790600101613009565b505f86602681518110613070576130706145bc565b016020015191976001600160f81b03199092161515965090945050505050565b6130986138b9565b6130a182613904565b6109678161394b565b5f808251602e146130cd5760405162461bcd60e51b815260040161043b906145e3565b5f805b600281101561311c576130e48160016145a9565b6130ef906008614449565b61ffff16858281518110613105576131056145bc565b016020015160f81c901b91909117906001016130d0565b5061ffff81161561313f5760405162461bcd60e51b815260040161043b9061462c565b5f805b600481101561319a576131568160036145a9565b613161906008614449565b63ffffffff16866131738360026145d0565b81518110613183576131836145bc565b016020015160f81c901b9190911790600101613142565b5063ffffffff81166004146131c15760405162461bcd60e51b815260040161043b9061466f565b5f805b6020811015613216576131d881601f6145a9565b6131e3906008614449565b876131ef8360066145d0565b815181106131ff576131ff6145bc565b016020015160f81c901b91909117906001016131c4565b505f805b60088110156132755761322e8160076145a9565b613239906008614449565b6001600160401b03168861324e8360266145d0565b8151811061325e5761325e6145bc565b016020015160f81c901b919091179060010161321a565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506139ff565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061479383398151915290600160401b900460ff165f03613326575050565b6040805160608101825260038301548082526004840154602083015260058401546001600160401b039081169383019390935260028401544293169061336c90846145a9565b10613392576001600160401b0384166040820152818152600a83015460208201526133b1565b83816040018181516133a491906146b6565b6001600160401b03169052505b5f8160200151826040015160646133c891906146d6565b6001600160401b03166133db919061439f565b600285015490915060ff600160401b909104811690821611156134565760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043b565b508051600384015560208101516004840155604001516005909201805467ffffffffffffffff19166001600160401b03909316929092179091555050565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a60565b5f805160206147b38339815191528054600119016134fb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461356b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135e2576135a28160016145a9565b6135ad906008614449565b5081515f908390839081106135c4576135c46145bc565b60200101906001600160f81b03191690815f1a90535060010161358e565b505f5b6004811015613640576135f98160036145a9565b613604906008614449565b505f826136128360026145d0565b81518110613622576136226145bc565b60200101906001600160f81b03191690815f1a9053506001016135e5565b505f5b602081101561369d578451816020811061365f5761365f6145bc565b1a60f81b8261366f8360066145d0565b8151811061367f5761367f6145bc565b60200101906001600160f81b03191690815f1a905350600101613643565b505f5b60208110156136fd57846020015181602081106136bf576136bf6145bc565b1a60f81b826136cf8360266145d0565b815181106136df576136df6145bc565b60200101906001600160f81b03191690815f1a9053506001016136a0565b505f5b6008811015613771576137148160076145a9565b61371f906008614449565b60ff1685604001516001600160401b0316901c60f81b8282604661374391906145d0565b81518110613753576137536145bc565b60200101906001600160f81b03191690815f1a905350600101613700565b505f5b60308110156137dc5784608001518181518110613793576137936145bc565b01602001516001600160f81b031916826137ae83604e6145d0565b815181106137be576137be6145bc565b60200101906001600160f81b03191690815f1a905350600101613774565b505f5b600881101561384e576137f38160076145a9565b6137fe906008614449565b60608601516001600160401b0390811691161c60f81b8261382083607e6145d0565b81518110613830576138306145bc565b60200101906001600160f81b03191690815f1a9053506001016137df565b5060028160405161385f9190614701565b602060405180830381855afa15801561387a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061389d91906142fe565b94909350915050565b60015f805160206147b383398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661390257604051631afcd79f60e31b815260040160405180910390fd5b565b61390c6138b9565b61391581613bc2565b613948608082013560a083013561393260e0850160c08601613f60565b613943610100860160e0870161471c565b613be3565b50565b6139536138b9565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166139df5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613a136001600160a01b03841683613c3e565b905080515f14158015613a37575080806020019051810190613a359190614737565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613aa6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613aca91906142fe565b9050613ae16001600160a01b038516333086613c4b565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613b25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b4991906142fe565b9050818111613baf5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613bb982826145a9565b95945050505050565b613bca6138b9565b613bd2613c8a565b613bda613c9a565b61394881613ca2565b613beb6138b9565b5f5f80516020614753833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6060610e7183835f613ce3565b6040516001600160a01b038481166024830152838116604483015260648201839052613c849186918216906323b872dd906084016132af565b50505050565b613c926138b9565b613902613d72565b6139026138b9565b613caa6138b9565b80355f8051602061479383398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b606081471015613d085760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613d239190614701565b5f6040518083038185875af1925050503d805f8114613d5d576040519150601f19603f3d011682016040523d82523d5f602084013e613d62565b606091505b509150915061147a868383613d7a565b6138a66138b9565b606082613d8f57613d8a82613dd6565b610e71565b8151158015613da657506001600160a01b0384163b155b15613dcf57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610e71565b805115613de65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613e0b90614168565b5f825580601f10613e1a575050565b601f0160209004905f5260205f20908101906139489190613e7a565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613e8e575f8155600101613e7b565b5090565b8015158114613948575f80fd5b803563ffffffff81168114613eb2575f80fd5b919050565b5f805f60608486031215613ec9575f80fd5b833592506020840135613edb81613e92565b9150613ee960408501613e9f565b90509250925092565b5f60208284031215613f02575f80fd5b5035919050565b5f60208284031215613f19575f80fd5b610e7182613e9f565b5f8060408385031215613f33575f80fd5b613f3c83613e9f565b946020939093013593505050565b80356001600160401b0381168114613eb2575f80fd5b5f60208284031215613f70575f80fd5b610e7182613f4a565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613faf57613faf613f79565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613fdd57613fdd613f79565b604052919050565b5f6001600160401b03821115613ffd57613ffd613f79565b50601f01601f191660200190565b5f805f806080858703121561401e575f80fd5b843593506020850135925061403560408601613f4a565b915060608501356001600160401b0381111561404f575f80fd5b8501601f8101871361405f575f80fd5b803561407261406d82613fe5565b613fb5565b818152886020838501011115614086575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156140b8575f80fd5b50508035926020909101359150565b6001600160a01b0381168114613948575f80fd5b5f808284036101208112156140ee575f80fd5b610100808212156140fd575f80fd5b849350830135905061410e816140c7565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156141615761416161412d565b5092915050565b600181811c9082168061417c57607f821691505b60208210810361419a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156141c55750805b601f840160051c820191505b818110156141e4575f81556001016141d1565b5050505050565b81516001600160401b0381111561420457614204613f79565b614218816142128454614168565b846141a0565b602080601f83116001811461424b575f84156142345750858301515b5f19600386901b1c1916600185901b1785556142a2565b5f85815260208120601f198616915b828110156142795788860151825594840194600190910190840161425a565b508582101561429657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156142c45781810151838201526020016142ac565b50505f910152565b602081525f82518060208401526142ea8160408501602087016142aa565b601f01601f19169190910160400192915050565b5f6020828403121561430e575f80fd5b5051919050565b5f60208083525f845461432781614168565b806020870152604060018084165f8114614348576001811461436457614391565b60ff19851660408a0152604084151560051b8a01019550614391565b895f5260205f205f5b858110156143885781548b820186015290830190880161436d565b8a016040019650505b509398975050505050505050565b5f826143b957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a61412d565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613eb281613e92565b5f80604083850312156144c3575f80fd5b82516001600160401b03808211156144d9575f80fd5b90840190606082870312156144ec575f80fd5b6144f4613f8d565b82518152602080840151614507816140c7565b8282015260408401518381111561451c575f80fd5b80850194505087601f850112614530575f80fd5b8351925061454061406d84613fe5565b8381528882858701011115614553575f80fd5b614562848383018488016142aa565b806040840152508195506145778188016144a7565b9450505050509250929050565b5f6001600160401b0380831681810361459f5761459f61412d565b6001019392505050565b8181038181111561093a5761093a61412d565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561093a5761093a61412d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156141615761416161412d565b6001600160401b038181168382160280821691908281146146f9576146f961412d565b505092915050565b5f82516147128184602087016142aa565b9190910192915050565b5f6020828403121561472c575f80fd5b8135610e71816140c7565b5f60208284031215614747575f80fd5b8151610e7181613e9256fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -458,23 +458,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0xa7f7f070. +// Initialize is a paid mutator transaction binding the contract method 0xe74e8cab. // -// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint64,uint64,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,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 0xa7f7f070. +// Initialize is a paid mutator transaction binding the contract method 0xe74e8cab. // -// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint64,uint64,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,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 0xa7f7f070. +// Initialize is a paid mutator transaction binding the contract method 0xe74e8cab. // -// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint64,uint64,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,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/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 131bac52a..30e59f1cd 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -31,25 +31,25 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { - BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int - ChurnPeriodSeconds uint64 - MinimumStakeDuration uint64 - MaximumChurnPercentage uint8 - RewardCalculator common.Address + BaseSettings ValidatorManagerSettings + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + MinimumStakeDuration uint64 + RewardCalculator common.Address } // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { - PChainBlockchainID [32]byte - SubnetID [32]byte + PChainBlockchainID [32]byte + SubnetID [32]byte + ChurnPeriodSeconds uint64 + MaximumChurnPercentage uint8 } // 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161465d38038061465d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145108061014d5f395ff3fe608060405260043610610105575f3560e01c80636d0e43fa11610092578063b771b3bc11610062578063b771b3bc146102f4578063bee0a03f14610326578063c599e24f14610345578063ed849d8f14610358578063f40797d714610377575f80fd5b80636d0e43fa1461027857806376f786211461029757806398f3e2b4146102b6578063a3a65e48146102d5575f80fd5b80632e2194d8116100d85780632e2194d8146101c5578063467ef06f146101fc5780635297fae61461021b578063620658561461023a57806366435abf14610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063162f1f61146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613c1a565b61038a565b005b348015610135575f80fd5b50610128610144366004613c55565b610815565b348015610154575f80fd5b50610193610163366004613c55565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b3480156101b1575f80fd5b506101286101c0366004613c55565b610971565b3480156101d0575f80fd5b506101e46101df366004613c55565b6109de565b6040516001600160401b03909116815260200161019d565b348015610207575f80fd5b50610128610216366004613c6c565b6109f4565b348015610226575f80fd5b50610128610235366004613c85565b610a1f565b348015610245575f80fd5b50610193610254366004613cc3565b610c10565b348015610264575f80fd5b506101e4610273366004613c55565b610c29565b348015610283575f80fd5b50610128610292366004613c55565b610c3d565b3480156102a2575f80fd5b506101286102b1366004613c1a565b610caa565b3480156102c1575f80fd5b506101286102d0366004613c85565b610ce4565b3480156102e0575f80fd5b506101286102ef366004613c6c565b610f14565b3480156102ff575f80fd5b5061030e6005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610331575f80fd5b50610128610340366004613c55565b6110d1565b610193610353366004613c55565b6111a0565b348015610363575f80fd5b50610128610372366004613cdc565b6111ac565b610193610385366004613d85565b61128e565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0760205260408120600101545f805160206144648339815191529184156103dc576103d982856112b2565b90505b5f868152600784016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613e17565b600481111561041f5761041f613e17565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613e17565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206144848339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206144848339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f6105678461154e565b600383526001600160401b0342811660a0850152811660e08401525f8981526007870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613e17565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610686856115c2565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107129190613e3f565b905061071e86826116a1565b5f61072a8785846116e9565b5f8c815260098a01602052604090209091506107468282613ee3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610773908590600401613fc4565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190613ff6565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f805160206144a483398151915292919061085d90613e66565b905011801561088f575060035f83815260048301602052604090205460ff16600581111561088d5761088d613e17565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c919060040161400d565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190613ff6565b505050565b61097a81611906565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d09602052604090819020905163ee5b48eb60e01b81525f80516020614464833981519152916005600160991b019163ee5b48eb9161092c9160040161400d565b5f6109ee64e8d4a5100083614097565b92915050565b5f6109fe826119d5565b9050610a1b81606001516001600160401b03168260400151611d63565b5050565b5f805160206144648339815191525f610a3784611d76565b90505f80610a488360400151611f57565b5091509150610a5685612192565b5f8581526008850160205260408120610a6e91613b62565b5f610a78836115c2565b9050816001600160401b031681608001516001600160401b03161015610ab05760405162461bcd60e51b81526004016104ef906140b6565b5f8681526007860160205260409020600201546001600160401b03808416600160c01b909204161115610af55760405162461bcd60e51b81526004016104ef906140f8565b60015f87815260078701602052604090205460ff166004811115610b1b57610b1b613e17565b14610b845760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600786016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109ee6001600160401b03831664e8d4a51000614141565b5f610c33826115c2565b60a0015192915050565b610c4681612192565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614464833981519152916005600160991b019163ee5b48eb9161092c9160040161400d565b5f610cb4846115c2565b60a001519050610cc38161226b565b8215610cd557610cd384836112b2565b505b610cde84612437565b50505050565b5f805160206144648339815191525f610cfc84611d76565b90505f80610d0d8360400151611f57565b5091509150610d1b85611906565b5f8581526009850160205260408120610d3391613b62565b5f610d3d836115c2565b9050816001600160401b031681608001516001600160401b03161015610d755760405162461bcd60e51b81526004016104ef906140b6565b5f8681526007860160205260409020600301546001600160401b0380841691161115610db35760405162461bcd60e51b81526004016104ef906140f8565b60035f87815260078701602052604090205460ff166004811115610dd957610dd9613e17565b14610e2d5760405162461bcd60e51b815260206004820152603160248201525f805160206144848339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f868152600786016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610ed291611d63565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206144a48339815191525f610f2c83611d76565b90505f80610f3d8360400151612807565b9150915080610f9f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f82815260028501602052604081208054610fb990613e66565b9050118015610feb575060015f83815260048601602052604090205460ff166005811115610fe957610fe9613e17565b145b6110075760405162461bcd60e51b81526004016104ef90614158565b5f828152600285016020526040812061101f91613b62565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f805160206144a483398151915292919061111990613e66565b905011801561114b575060015f83815260048301602052604090205460ff16600581111561114957611149613e17565b145b6111675760405162461bcd60e51b81526004016104ef90614158565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c919060040161400d565b5f6109ee8233346129a8565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806111f5575080546001600160401b03808416911610155b156112135760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561123d83612d60565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8061129934612d74565b90506112a785828686612e27565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112fd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261132491908101906141be565b91509150806113875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ee9190613ff6565b8251146114525760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156114c85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806114d78460400151613302565b915091508187146115445760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206144c48339815191526020526040812060030180545f805160206144a4833981519152916001600160401b039091169081908461159383614290565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115ca613b99565b5f8281525f805160206144c48339815191526020526040908190208151610100810190925280545f805160206144a4833981519152929190829060ff16600581111561161857611618613e17565b600581111561162957611629613e17565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206144c4833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611762576117228160016142b5565b61172d906008614141565b5081515f90839083908110611744576117446142c8565b60200101906001600160f81b03191690815f1a90535060010161170e565b505f5b60048110156117c5576117798160036142b5565b611784906008614141565b6001901c60f81b826117978360026142dc565b815181106117a7576117a76142c8565b60200101906001600160f81b03191690815f1a905350600101611765565b505f5b6020811015611827576117dc81601f6142b5565b6117e7906008614141565b86901c60f81b826117f98360066142dc565b81518110611809576118096142c8565b60200101906001600160f81b03191690815f1a9053506001016117c8565b505f5b60088110156118925761183e8160076142b5565b611849906008614141565b6001600160401b038616901c60f81b826118648360266142dc565b81518110611874576118746142c8565b60200101906001600160f81b03191690815f1a90535060010161182a565b505f5b60088110156118fd576118a98160076142b5565b6118b4906008614141565b6001600160401b038516901c60f81b826118cf83602e6142dc565b815181106118df576118df6142c8565b60200101906001600160f81b03191690815f1a905350600101611895565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d096020526040812080545f8051602061446483398151915292919061194e90613e66565b9050118015611980575060035f83815260078301602052604090205460ff16600481111561197e5761197e613e17565b145b610a1b5760405162461bcd60e51b815260206004820152603360248201525f8051602061448483398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b6119dd613b99565b5f805160206144a48339815191525f6119f584611d76565b90505f80611a068360400151612807565b915091508015611a6b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115611a9d57611a9d613e17565b6005811115611aae57611aae613e17565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b3557611b35613e17565b1480611b535750600182516005811115611b5157611b51613e17565b145b611bb25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115611bc757611bc7613e17565b03611bee57505f8381526003860160205260408120600491611be99190613b62565b611bf2565b5060055b6020808301515f9081526005808901909252604081205582908290811115611c1c57611c1c613e17565b90816005811115611c2f57611c2f613e17565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115611c6357611c63613e17565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d2e57611d2e613e17565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a1b6001600160a01b038216836134da565b60408051606080820183525f8083526020830181905292820152905f805160206144a48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611deb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e1291908101906141be565b9150915080611e795760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611edc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611f4f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f805f8351603614611f7b5760405162461bcd60e51b81526004016104ef906142ef565b5f805b6002811015611fca57611f928160016142b5565b611f9d906008614141565b61ffff16868281518110611fb357611fb36142c8565b016020015160f81c901b9190911790600101611f7e565b5061ffff811615611fed5760405162461bcd60e51b81526004016104ef90614338565b5f805b6004811015612048576120048160036142b5565b61200f906008614141565b63ffffffff16876120218360026142dc565b81518110612031576120316142c8565b016020015160f81c901b9190911790600101611ff0565b5063ffffffff811660031461206f5760405162461bcd60e51b81526004016104ef9061437b565b5f805b60208110156120c45761208681601f6142b5565b612091906008614141565b8861209d8360066142dc565b815181106120ad576120ad6142c8565b016020015160f81c901b9190911790600101612072565b505f805b6008811015612123576120dc8160076142b5565b6120e7906008614141565b6001600160401b0316896120fc8360266142dc565b8151811061210c5761210c6142c8565b016020015160f81c901b91909117906001016120c8565b505f805b60088110156121825761213b8160076142b5565b612146906008614141565b6001600160401b03168a61215b83602e6142dc565b8151811061216b5761216b6142c8565b016020015160f81c901b9190911790600101612127565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f805160206144648339815191529291906121da90613e66565b905011801561220c575060015f83815260078301602052604090205460ff16600481111561220a5761220a613e17565b145b610a1b5760405162461bcd60e51b815260206004820152603860248201525f8051602061448483398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f805160206144648339815191525f6122a27fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb065490565b6002830154909150600160401b900460ff1615806122be575080155b156122c857505050565b6040805160608101825260038401548082526004850154602083015260058501546001600160401b039081169383019390935260028501544293169061230e90846142b5565b10612331576001600160401b038516604082015281815260208101839052612350565b848160400181815161234391906143c2565b6001600160401b03169052505b5f81602001518260400151606461236791906143e2565b6001600160401b031661237a9190614097565b600286015490915060ff600160401b909104811690821611156123f85760405162461bcd60e51b815260206004820152603060248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2063687560448201526f1c9b881c985d1948195e18d95959195960821b60648201526084016104ef565b508051600385015560208101516004850155604001516005909301805467ffffffffffffffff19166001600160401b0390941693909317909255505050565b5f8181525f805160206144c483398151915260205260408082208151610100810190925280545f805160206144a483398151915293929190829060ff16600581111561248557612485613e17565b600581111561249657612496613e17565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561251e5761251e613e17565b1461257a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146125f45760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff1916600183600581111561263857612638613e17565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612704846126fe8161154e565b5f6116e9565b5f85815260038501602052604090209091506127208282613ee3565b508160a001516001600160401b0316836006015f82825461274191906142b5565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612772908590600401613fc4565b6020604051808303815f875af115801561278e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b29190613ff6565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461282a5760405162461bcd60e51b81526004016104ef906142ef565b5f805b6002811015612879576128418160016142b5565b61284c906008614141565b61ffff16858281518110612862576128626142c8565b016020015160f81c901b919091179060010161282d565b5061ffff81161561289c5760405162461bcd60e51b81526004016104ef90614338565b5f805b60048110156128f7576128b38160036142b5565b6128be906008614141565b63ffffffff16866128d08360026142dc565b815181106128e0576128e06142c8565b016020015160f81c901b919091179060010161289f565b5063ffffffff811660021461291e5760405162461bcd60e51b81526004016104ef9061437b565b5f805b60208110156129735761293581601f6142b5565b612940906008614141565b8761294c8360066142dc565b8151811061295c5761295c6142c8565b016020015160f81c901b9190911790600101612921565b505f86602681518110612988576129886142c8565b016020015191976001600160f81b03199092161515965090945050505050565b5f6129b161356d565b5f6129bb836109de565b90505f805160206144648339815191525f6129d5876115c2565b90506002815160058111156129ec576129ec613e17565b14612a4b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f838260a00151612a5c91906143c2565b9050612a6888826116a1565b5f612a728961154e565b90505f898983604051602001612aba9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612adb8661226b565b5f612ae78b84866116e9565b5f8381526008880160205260409020909150612b038282613ee3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b30908590600401613fc4565b6020604051808303815f875af1158015612b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b709190613ff6565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876007015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c1f57612c1f613e17565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506112ab60015f805160206144e483398151915255565b612d686135b7565b612d7181613602565b50565b5f5f805160206144648339815191528282612d8e826109de565b83549091506001600160401b03821610801590612db857508260010154816001600160401b031611155b612e165760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b612e1f8161226b565b949350505050565b5f612e3061356d565b5f805160206144a4833981519152426001600160401b03851611612eb25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612ec9426202a3006142dc565b11612f3c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612f935760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f868152600582016020526040902054156130015760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b82516030146130685760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b5f806130af6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613666565b5f828152600286016020526040902091935091506130cd8282613ee3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906130fa908590600401613fc4565b6020604051808303815f875af1158015613116573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061313a9190613ff6565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff191660018360058111156131bc576131bc613e17565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695851695909517919091171692909217929092179055600685018054918a16915f9061328d9084906142dc565b9091555061329c90508361154e565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612e1f60015f805160206144e483398151915255565b5f808251602e146133255760405162461bcd60e51b81526004016104ef906142ef565b5f805b60028110156133745761333c8160016142b5565b613347906008614141565b61ffff1685828151811061335d5761335d6142c8565b016020015160f81c901b9190911790600101613328565b5061ffff8116156133975760405162461bcd60e51b81526004016104ef90614338565b5f805b60048110156133f2576133ae8160036142b5565b6133b9906008614141565b63ffffffff16866133cb8360026142dc565b815181106133db576133db6142c8565b016020015160f81c901b919091179060010161339a565b5063ffffffff81166004146134195760405162461bcd60e51b81526004016104ef9061437b565b5f805b602081101561346e5761343081601f6142b5565b61343b906008614141565b876134478360066142dc565b81518110613457576134576142c8565b016020015160f81c901b919091179060010161341c565b505f805b60088110156134cd576134868160076142b5565b613491906008614141565b6001600160401b0316886134a68360266142dc565b815181106134b6576134b66142c8565b016020015160f81c901b9190911790600101613472565b5090969095509350505050565b804710156134fd5760405163cd78605960e01b81523060048201526024016104ef565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613546576040519150601f19603f3d011682016040523d82523d5f602084013e61354b565b606091505b505090508061096c57604051630a12f52160e11b815260040160405180910390fd5b5f805160206144e483398151915280546001190161359e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206144e483398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661360057604051631afcd79f60e31b815260040160405180910390fd5b565b61360a6135b7565b61361381613a0b565b612d716040820135606083013561363060a0850160808601613cc3565b61364060c0860160a08701613cc3565b61365060e0870160c0880161440d565b613661610100880160e0890161442d565b613a2c565b5f60608260800151516030146136d05760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613747576137078160016142b5565b613712906008614141565b5081515f90839083908110613729576137296142c8565b60200101906001600160f81b03191690815f1a9053506001016136f3565b505f5b60048110156137a55761375e8160036142b5565b613769906008614141565b505f826137778360026142dc565b81518110613787576137876142c8565b60200101906001600160f81b03191690815f1a90535060010161374a565b505f5b602081101561380257845181602081106137c4576137c46142c8565b1a60f81b826137d48360066142dc565b815181106137e4576137e46142c8565b60200101906001600160f81b03191690815f1a9053506001016137a8565b505f5b60208110156138625784602001518160208110613824576138246142c8565b1a60f81b826138348360266142dc565b81518110613844576138446142c8565b60200101906001600160f81b03191690815f1a905350600101613805565b505f5b60088110156138d6576138798160076142b5565b613884906008614141565b60ff1685604001516001600160401b0316901c60f81b828260466138a891906142dc565b815181106138b8576138b86142c8565b60200101906001600160f81b03191690815f1a905350600101613865565b505f5b603081101561394157846080015181815181106138f8576138f86142c8565b01602001516001600160f81b0319168261391383604e6142dc565b81518110613923576139236142c8565b60200101906001600160f81b03191690815f1a9053506001016138d9565b505f5b60088110156139b3576139588160076142b5565b613963906008614141565b60608601516001600160401b0390811691161c60f81b8261398583607e6142dc565b81518110613995576139956142c8565b60200101906001600160f81b03191690815f1a905350600101613944565b506002816040516139c49190614448565b602060405180830381855afa1580156139df573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a029190613ff6565b94909350915050565b613a136135b7565b613a1b613b01565b613a23613b11565b612d7181613b19565b613a346135b7565b5f80516020614464833981519152959095557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d01939093557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0280547f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06805460ff909616600160401b90810268ffffffffffffffffff199093166001600160401b0396871617929092179092556001600160a01b039095169094026001600160e01b0319909316911617179055565b613b096135b7565b613600613b5a565b6136006135b7565b613b216135b7565b80355f805160206144a483398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b6135a46135b7565b508054613b6e90613e66565b5f825580601f10613b7d575050565b601f0160209004905f5260205f2090810190612d719190613bdd565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613bf1575f8155600101613bde565b5090565b8015158114612d71575f80fd5b803563ffffffff81168114613c15575f80fd5b919050565b5f805f60608486031215613c2c575f80fd5b833592506020840135613c3e81613bf5565b9150613c4c60408501613c02565b90509250925092565b5f60208284031215613c65575f80fd5b5035919050565b5f60208284031215613c7c575f80fd5b6112ab82613c02565b5f8060408385031215613c96575f80fd5b613c9f83613c02565b946020939093013593505050565b80356001600160401b0381168114613c15575f80fd5b5f60208284031215613cd3575f80fd5b6112ab82613cad565b5f6101008284031215613ced575f80fd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d2957613d29613cf3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d5757613d57613cf3565b604052919050565b5f6001600160401b03821115613d7757613d77613cf3565b50601f01601f191660200190565b5f805f60608486031215613d97575f80fd5b83359250613da760208501613cad565b915060408401356001600160401b03811115613dc1575f80fd5b8401601f81018613613dd1575f80fd5b8035613de4613ddf82613d5f565b613d2f565b818152876020838501011115613df8575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e5f57613e5f613e2b565b5092915050565b600181811c90821680613e7a57607f821691505b602082108103613ced57634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c81016020851015613ebd5750805b601f840160051c820191505b81811015613edc575f8155600101613ec9565b5050505050565b81516001600160401b03811115613efc57613efc613cf3565b613f1081613f0a8454613e66565b84613e98565b602080601f831160018114613f43575f8415613f2c5750858301515b5f19600386901b1c1916600185901b178555613f9a565b5f85815260208120601f198616915b82811015613f7157888601518255948401946001909101908401613f52565b5085821015613f8e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613fbc578181015183820152602001613fa4565b50505f910152565b602081525f8251806020840152613fe2816040850160208701613fa2565b601f01601f19169190910160400192915050565b5f60208284031215614006575f80fd5b5051919050565b5f60208083525f845461401f81613e66565b806020870152604060018084165f8114614040576001811461405c57614089565b60ff19851660408a0152604084151560051b8a01019550614089565b895f5260205f205f5b858110156140805781548b8201860152908301908801614065565b8a016040019650505b509398975050505050505050565b5f826140b157634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109ee576109ee613e2b565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114612d71575f80fd5b8051613c1581613bf5565b5f80604083850312156141cf575f80fd5b82516001600160401b03808211156141e5575f80fd5b90840190606082870312156141f8575f80fd5b614200613d07565b825181526020808401516142138161419f565b82820152604084015183811115614228575f80fd5b80850194505087601f85011261423c575f80fd5b8351925061424c613ddf84613d5f565b838152888285870101111561425f575f80fd5b61426e84838301848801613fa2565b806040840152508195506142838188016141b3565b9450505050509250929050565b5f6001600160401b038083168181036142ab576142ab613e2b565b6001019392505050565b818103818111156109ee576109ee613e2b565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109ee576109ee613e2b565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613e5f57613e5f613e2b565b6001600160401b0381811683821602808216919082811461440557614405613e2b565b505092915050565b5f6020828403121561441d575f80fd5b813560ff811681146112ab575f80fd5b5f6020828403121561443d575f80fd5b81356112ab8161419f565b5f8251614459818460208701613fa2565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb049b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161457938038061457983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61442c8061014d5f395ff3fe608060405260043610610105575f3560e01c80636d0e43fa11610092578063a3a65e4811610062578063a3a65e48146102f4578063b771b3bc14610313578063bee0a03f14610345578063c599e24f14610364578063f40797d714610377575f80fd5b80636d0e43fa1461027857806376f78621146102975780637978da3a146102b657806398f3e2b4146102d5575f80fd5b80632e2194d8116100d85780632e2194d8146101c5578063467ef06f146101fc5780635297fae61461021b578063620658561461023a57806366435abf14610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063162f1f61146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613b56565b61038a565b005b348015610135575f80fd5b50610128610144366004613b91565b610815565b348015610154575f80fd5b50610193610163366004613b91565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101b1575f80fd5b506101286101c0366004613b91565b610971565b3480156101d0575f80fd5b506101e46101df366004613b91565b6109de565b6040516001600160401b03909116815260200161019d565b348015610207575f80fd5b50610128610216366004613ba8565b6109f4565b348015610226575f80fd5b50610128610235366004613bc1565b610a1f565b348015610245575f80fd5b50610193610254366004613bff565b610c10565b348015610264575f80fd5b506101e4610273366004613b91565b610c29565b348015610283575f80fd5b50610128610292366004613b91565b610c3d565b3480156102a2575f80fd5b506101286102b1366004613b56565b610caa565b3480156102c1575f80fd5b506101286102d0366004613c18565b610cc5565b3480156102e0575f80fd5b506101286102ef366004613bc1565b610da7565b3480156102ff575f80fd5b5061012861030e366004613ba8565b610fd6565b34801561031e575f80fd5b5061032d6005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610350575f80fd5b5061012861035f366004613b91565b611193565b610193610372366004613b91565b611262565b610193610385366004613cc1565b61126e565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206143808339815191529184156103dc576103d98285611292565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613d53565b600481111561041f5761041f613d53565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613d53565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206143a08339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206143a08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f6105678461152e565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613d53565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610686856115a2565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107129190613d7b565b905061071e8682611681565b5f61072a8785846116c9565b5f8c815260058a01602052604090209091506107468282613e1f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610773908590600401613f00565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190613f32565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206143c083398151915292919061085d90613da2565b905011801561088f575060035f83815260088301602052604090205460ff16600581111561088d5761088d613d53565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401613f49565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190613f32565b505050565b61097a816118e6565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614380833981519152916005600160991b019163ee5b48eb9161092c91600401613f49565b5f6109ee64e8d4a5100083613fd3565b92915050565b5f6109fe826119b5565b9050610a1b81606001516001600160401b03168260400151611d42565b5050565b5f805160206143808339815191525f610a3784611d55565b90505f80610a488360400151611f36565b5091509150610a5685612171565b5f8581526004850160205260408120610a6e91613a9e565b5f610a78836115a2565b9050816001600160401b031681608001516001600160401b03161015610ab05760405162461bcd60e51b81526004016104ef90613ff2565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610af55760405162461bcd60e51b81526004016104ef90614034565b60015f87815260038701602052604090205460ff166004811115610b1b57610b1b613d53565b14610b845760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109ee6001600160401b03831664e8d4a5100061407d565b5f610c33826115a2565b60a0015192915050565b610c4681612171565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614380833981519152916005600160991b019163ee5b48eb9161092c91600401613f49565b8115610cbc57610cba8382611292565b505b61096c8361224a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d0e575080546001600160401b03808416911610155b15610d2c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610d5683612627565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f805160206143808339815191525f610dbf84611d55565b90505f80610dd08360400151611f36565b5091509150610dde856118e6565b5f8581526005850160205260408120610df691613a9e565b5f610e00836115a2565b9050816001600160401b031681608001516001600160401b03161015610e385760405162461bcd60e51b81526004016104ef90613ff2565b5f8681526003808701602052604090912001546001600160401b0380841691161115610e765760405162461bcd60e51b81526004016104ef90614034565b60035f87815260038701602052604090205460ff166004811115610e9c57610e9c613d53565b14610ef05760405162461bcd60e51b815260206004820152603160248201525f805160206143a08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f949190611d42565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206143c08339815191525f610fee83611d55565b90505f80610fff836040015161263b565b91509150806110615760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526006850160205260408120805461107b90613da2565b90501180156110ad575060015f83815260088601602052604090205460ff1660058111156110ab576110ab613d53565b145b6110c95760405162461bcd60e51b81526004016104ef90614094565b5f82815260068501602052604081206110e191613a9e565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206143c08339815191529291906111db90613da2565b905011801561120d575060015f83815260088301602052604090205460ff16600581111561120b5761120b613d53565b145b6112295760405162461bcd60e51b81526004016104ef90614094565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401613f49565b5f6109ee8233346127dc565b5f8061127934612b94565b905061128785828686612c3e565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112dd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261130491908101906140fa565b91509150806113675760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ce9190613f32565b8251146114325760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156114a85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806114b78460400151613125565b915091508187146115245760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206144008339815191526020526040812060030180545f805160206143c0833981519152916001600160401b0390911690819084611573836141cc565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115aa613ad5565b5f8281525f805160206144008339815191526020526040908190208151610100810190925280545f805160206143c0833981519152929190829060ff1660058111156115f8576115f8613d53565b600581111561160957611609613d53565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614400833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611742576117028160016141f1565b61170d90600861407d565b5081515f9083908390811061172457611724614204565b60200101906001600160f81b03191690815f1a9053506001016116ee565b505f5b60048110156117a5576117598160036141f1565b61176490600861407d565b6001901c60f81b82611777836002614218565b8151811061178757611787614204565b60200101906001600160f81b03191690815f1a905350600101611745565b505f5b6020811015611807576117bc81601f6141f1565b6117c790600861407d565b86901c60f81b826117d9836006614218565b815181106117e9576117e9614204565b60200101906001600160f81b03191690815f1a9053506001016117a8565b505f5b60088110156118725761181e8160076141f1565b61182990600861407d565b6001600160401b038616901c60f81b82611844836026614218565b8151811061185457611854614204565b60200101906001600160f81b03191690815f1a90535060010161180a565b505f5b60088110156118dd576118898160076141f1565b61189490600861407d565b6001600160401b038516901c60f81b826118af83602e614218565b815181106118bf576118bf614204565b60200101906001600160f81b03191690815f1a905350600101611875565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061438083398151915292919061192e90613da2565b9050118015611960575060035f83815260038301602052604090205460ff16600481111561195e5761195e613d53565b145b610a1b5760405162461bcd60e51b815260206004820152603360248201525f805160206143a083398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b6119bd613ad5565b5f805160206143c08339815191525f6119d584611d55565b90505f806119e6836040015161263b565b915091508015611a4b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611a7d57611a7d613d53565b6005811115611a8e57611a8e613d53565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b1557611b15613d53565b1480611b335750600182516005811115611b3157611b31613d53565b145b611b925760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115611ba757611ba7613d53565b03611bce57505f8381526007860160205260408120600491611bc99190613a9e565b611bd2565b5060055b6020808301515f90815260098801909152604081205581816005811115611bfb57611bfb613d53565b90816005811115611c0e57611c0e613d53565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611c4257611c42613d53565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d0d57611d0d613d53565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a1b6001600160a01b038216836132fd565b60408051606080820183525f8083526020830181905292820152905f805160206143c08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611dca573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611df191908101906140fa565b9150915080611e585760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611ebb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611f2e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f805f8351603614611f5a5760405162461bcd60e51b81526004016104ef9061422b565b5f805b6002811015611fa957611f718160016141f1565b611f7c90600861407d565b61ffff16868281518110611f9257611f92614204565b016020015160f81c901b9190911790600101611f5d565b5061ffff811615611fcc5760405162461bcd60e51b81526004016104ef90614274565b5f805b600481101561202757611fe38160036141f1565b611fee90600861407d565b63ffffffff1687612000836002614218565b8151811061201057612010614204565b016020015160f81c901b9190911790600101611fcf565b5063ffffffff811660031461204e5760405162461bcd60e51b81526004016104ef906142b7565b5f805b60208110156120a35761206581601f6141f1565b61207090600861407d565b8861207c836006614218565b8151811061208c5761208c614204565b016020015160f81c901b9190911790600101612051565b505f805b6008811015612102576120bb8160076141f1565b6120c690600861407d565b6001600160401b0316896120db836026614218565b815181106120eb576120eb614204565b016020015160f81c901b91909117906001016120a7565b505f805b60088110156121615761211a8160076141f1565b61212590600861407d565b6001600160401b03168a61213a83602e614218565b8151811061214a5761214a614204565b016020015160f81c901b9190911790600101612106565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206143808339815191529291906121b990613da2565b90501180156121eb575060015f83815260038301602052604090205460ff1660048111156121e9576121e9613d53565b145b610a1b5760405162461bcd60e51b815260206004820152603860248201525f805160206143a083398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f8181525f8051602061440083398151915260205260408082208151610100810190925280545f805160206143c083398151915293929190829060ff16600581111561229857612298613d53565b60058111156122a9576122a9613d53565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561233157612331613d53565b1461238d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146124075760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561244b5761244b613d53565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612517846125118161152e565b5f6116c9565b5f85815260078501602052604090209091506125338282613e1f565b506125418260a00151613390565b8160a001516001600160401b031683600a015f82825461256191906141f1565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612592908590600401613f00565b6020604051808303815f875af11580156125ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d29190613f32565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61262f613543565b6126388161358e565b50565b5f80825160271461265e5760405162461bcd60e51b81526004016104ef9061422b565b5f805b60028110156126ad576126758160016141f1565b61268090600861407d565b61ffff1685828151811061269657612696614204565b016020015160f81c901b9190911790600101612661565b5061ffff8116156126d05760405162461bcd60e51b81526004016104ef90614274565b5f805b600481101561272b576126e78160036141f1565b6126f290600861407d565b63ffffffff1686612704836002614218565b8151811061271457612714614204565b016020015160f81c901b91909117906001016126d3565b5063ffffffff81166002146127525760405162461bcd60e51b81526004016104ef906142b7565b5f805b60208110156127a75761276981601f6141f1565b61277490600861407d565b87612780836006614218565b8151811061279057612790614204565b016020015160f81c901b9190911790600101612755565b505f866026815181106127bc576127bc614204565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127e56135d2565b5f6127ef836109de565b90505f805160206143808339815191525f612809876115a2565b905060028151600581111561282057612820613d53565b1461287f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f838260a0015161289091906142fe565b905061289c8882611681565b5f6128a68961152e565b90505f8989836040516020016128ee9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061290f86613390565b5f61291b8b84866116c9565b5f83815260048801602052604090209091506129378282613e1f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612964908590600401613f00565b6020604051808303815f875af1158015612980573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129a49190613f32565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a5357612a53613d53565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061128b60015f805160206143e083398151915255565b5f5f805160206143808339815191528282612bae826109de565b83549091506001600160401b03821610801590612bd857508260010154816001600160401b031611155b612c365760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b949350505050565b5f612c476135d2565b5f805160206143c0833981519152426001600160401b03851611612cc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612ce0426202a300614218565b11612d535760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612daa5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f86815260098201602052604090205415612e185760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b8251603014612e7f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b5f80612ec66040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061361c565b5f82815260068601602052604090209193509150612ee48282613e1f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f11908590600401613f00565b6020604051808303815f875af1158015612f2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f519190613f32565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115612fd357612fd3613d53565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561309488613390565b876001600160401b031684600a015f8282546130b09190614218565b909155506130bf90508361152e565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c3660015f805160206143e083398151915255565b5f808251602e146131485760405162461bcd60e51b81526004016104ef9061422b565b5f805b60028110156131975761315f8160016141f1565b61316a90600861407d565b61ffff1685828151811061318057613180614204565b016020015160f81c901b919091179060010161314b565b5061ffff8116156131ba5760405162461bcd60e51b81526004016104ef90614274565b5f805b6004811015613215576131d18160036141f1565b6131dc90600861407d565b63ffffffff16866131ee836002614218565b815181106131fe576131fe614204565b016020015160f81c901b91909117906001016131bd565b5063ffffffff811660041461323c5760405162461bcd60e51b81526004016104ef906142b7565b5f805b60208110156132915761325381601f6141f1565b61325e90600861407d565b8761326a836006614218565b8151811061327a5761327a614204565b016020015160f81c901b919091179060010161323f565b505f805b60088110156132f0576132a98160076141f1565b6132b490600861407d565b6001600160401b0316886132c9836026614218565b815181106132d9576132d9614204565b016020015160f81c901b9190911790600101613295565b5090969095509350505050565b804710156133205760405163cd78605960e01b81523060048201526024016104ef565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613369576040519150601f19603f3d011682016040523d82523d5f602084013e61336e565b606091505b505090508061096c57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206143c083398151915290600160401b900460ff165f036133d5575050565b6040805160608101825260038301548082526004840154602083015260058401546001600160401b039081169383019390935260028401544293169061341b90846141f1565b10613441576001600160401b0384166040820152818152600a8301546020820152613460565b838160400181815161345391906142fe565b6001600160401b03169052505b5f816020015182604001516064613477919061431e565b6001600160401b031661348a9190613fd3565b600285015490915060ff600160401b909104811690821611156135055760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104ef565b508051600384015560208101516004840155604001516005909201805467ffffffffffffffff19166001600160401b03909316929092179091555050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661358c57604051631afcd79f60e31b815260040160405180910390fd5b565b613596613543565b61359f816139c1565b612638608082013560a08301356135bc60e0850160c08601613bff565b6135cd610100860160e08701614349565b6139e2565b5f805160206143e083398151915280546001190161360357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206143e083398151915255565b5f60608260800151516030146136865760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156136fd576136bd8160016141f1565b6136c890600861407d565b5081515f908390839081106136df576136df614204565b60200101906001600160f81b03191690815f1a9053506001016136a9565b505f5b600481101561375b576137148160036141f1565b61371f90600861407d565b505f8261372d836002614218565b8151811061373d5761373d614204565b60200101906001600160f81b03191690815f1a905350600101613700565b505f5b60208110156137b8578451816020811061377a5761377a614204565b1a60f81b8261378a836006614218565b8151811061379a5761379a614204565b60200101906001600160f81b03191690815f1a90535060010161375e565b505f5b602081101561381857846020015181602081106137da576137da614204565b1a60f81b826137ea836026614218565b815181106137fa576137fa614204565b60200101906001600160f81b03191690815f1a9053506001016137bb565b505f5b600881101561388c5761382f8160076141f1565b61383a90600861407d565b60ff1685604001516001600160401b0316901c60f81b8282604661385e9190614218565b8151811061386e5761386e614204565b60200101906001600160f81b03191690815f1a90535060010161381b565b505f5b60308110156138f757846080015181815181106138ae576138ae614204565b01602001516001600160f81b031916826138c983604e614218565b815181106138d9576138d9614204565b60200101906001600160f81b03191690815f1a90535060010161388f565b505f5b60088110156139695761390e8160076141f1565b61391990600861407d565b60608601516001600160401b0390811691161c60f81b8261393b83607e614218565b8151811061394b5761394b614204565b60200101906001600160f81b03191690815f1a9053506001016138fa565b5060028160405161397a9190614364565b602060405180830381855afa158015613995573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139b89190613f32565b94909350915050565b6139c9613543565b6139d1613a3d565b6139d9613a4d565b61263881613a55565b6139ea613543565b5f5f80516020614380833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613a45613543565b61358c613a96565b61358c613543565b613a5d613543565b80355f805160206143c083398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b613609613543565b508054613aaa90613da2565b5f825580601f10613ab9575050565b601f0160209004905f5260205f20908101906126389190613b19565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613b2d575f8155600101613b1a565b5090565b8015158114612638575f80fd5b803563ffffffff81168114613b51575f80fd5b919050565b5f805f60608486031215613b68575f80fd5b833592506020840135613b7a81613b31565b9150613b8860408501613b3e565b90509250925092565b5f60208284031215613ba1575f80fd5b5035919050565b5f60208284031215613bb8575f80fd5b61128b82613b3e565b5f8060408385031215613bd2575f80fd5b613bdb83613b3e565b946020939093013593505050565b80356001600160401b0381168114613b51575f80fd5b5f60208284031215613c0f575f80fd5b61128b82613be9565b5f6101008284031215613c29575f80fd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613c6557613c65613c2f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c9357613c93613c2f565b604052919050565b5f6001600160401b03821115613cb357613cb3613c2f565b50601f01601f191660200190565b5f805f60608486031215613cd3575f80fd5b83359250613ce360208501613be9565b915060408401356001600160401b03811115613cfd575f80fd5b8401601f81018613613d0d575f80fd5b8035613d20613d1b82613c9b565b613c6b565b818152876020838501011115613d34575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613d9b57613d9b613d67565b5092915050565b600181811c90821680613db657607f821691505b602082108103613c2957634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c81016020851015613df95750805b601f840160051c820191505b81811015613e18575f8155600101613e05565b5050505050565b81516001600160401b03811115613e3857613e38613c2f565b613e4c81613e468454613da2565b84613dd4565b602080601f831160018114613e7f575f8415613e685750858301515b5f19600386901b1c1916600185901b178555613ed6565b5f85815260208120601f198616915b82811015613ead57888601518255948401946001909101908401613e8e565b5085821015613eca57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613ef8578181015183820152602001613ee0565b50505f910152565b602081525f8251806020840152613f1e816040850160208701613ede565b601f01601f19169190910160400192915050565b5f60208284031215613f42575f80fd5b5051919050565b5f60208083525f8454613f5b81613da2565b806020870152604060018084165f8114613f7c5760018114613f9857613fc5565b60ff19851660408a0152604084151560051b8a01019550613fc5565b895f5260205f205f5b85811015613fbc5781548b8201860152908301908801613fa1565b8a016040019650505b509398975050505050505050565b5f82613fed57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109ee576109ee613d67565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114612638575f80fd5b8051613b5181613b31565b5f806040838503121561410b575f80fd5b82516001600160401b0380821115614121575f80fd5b9084019060608287031215614134575f80fd5b61413c613c43565b8251815260208084015161414f816140db565b82820152604084015183811115614164575f80fd5b80850194505087601f850112614178575f80fd5b83519250614188613d1b84613c9b565b838152888285870101111561419b575f80fd5b6141aa84838301848801613ede565b806040840152508195506141bf8188016140ef565b9450505050509250929050565b5f6001600160401b038083168181036141e7576141e7613d67565b6001019392505050565b818103818111156109ee576109ee613d67565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109ee576109ee613d67565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613d9b57613d9b613d67565b6001600160401b0381811683821602808216919082811461434157614341613d67565b505092915050565b5f60208284031215614359575f80fd5b813561128b816140db565b5f8251614375818460208701613ede565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -458,23 +458,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0xed849d8f. +// Initialize is a paid mutator transaction binding the contract method 0x7978da3a. // -// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint64,uint64,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,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 0xed849d8f. +// Initialize is a paid mutator transaction binding the contract method 0x7978da3a. // -// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint64,uint64,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,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 0xed849d8f. +// Initialize is a paid mutator transaction binding the contract method 0x7978da3a. // -// Solidity: function initialize(((bytes32,bytes32),uint256,uint256,uint64,uint64,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 01a851efe..f8a6e1d18 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -31,14 +31,16 @@ var ( // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { - PChainBlockchainID [32]byte - SubnetID [32]byte + PChainBlockchainID [32]byte + SubnetID [32]byte + ChurnPeriodSeconds uint64 + MaximumChurnPercentage uint8 } // 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612a0e380380612a0e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6128c18061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063f2fde38b14610219578063f3e148eb1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd36600461227a565b61023f565b005b6101226100f236600461227a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb05602052604090205490565b6040519081526020015b60405180910390f35b61012261014336600461233e565b6103a0565b6100e26101563660046123e1565b6103c0565b61016e61016936600461227a565b6103cd565b6040516001600160401b03909116815260200161012c565b6100e26103e1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e036600461227a565b6103f4565b6100e26101f33660046123e1565b610400565b6101ba6005600160991b0181565b6100e261021436600461227a565b6105bd565b6100e261022736600461241f565b61068c565b6100e261023a36600461243a565b6106c6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb036020526040812080545f8051602061289583398151915292919061028790612476565b90501180156102b9575060035f83815260048301602052604090205460ff1660058111156102b7576102b76124ae565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260038201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016124c2565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b919061254c565b505050565b5f6103a96107d4565b6103b58486858561082f565b90505b949350505050565b6103c981610d1d565b5050565b5f6103d7826110ab565b60a0015192915050565b6103e96107d4565b6103f25f61119d565b565b6103fd8161120d565b50565b5f805160206128958339815191525f610418836115f0565b90505f8061042983604001516117d1565b915091508061048b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600285016020526040812080546104a590612476565b90501180156104d7575060015f83815260048601602052604090205460ff1660058111156104d5576104d56124ae565b145b6104f35760405162461bcd60e51b815260040161031990612563565b5f828152600285016020526040812061050b916121e7565b5f8281526004850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260058b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb026020526040812080545f8051602061289583398151915292919061060590612476565b9050118015610637575060015f83815260048301602052604090205460ff166005811115610635576106356124ae565b145b6106535760405162461bcd60e51b815260040161031990612563565b5f82815260028201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016124c2565b6106946107d4565b6001600160a01b0381166106bd57604051631e4fbdf760e01b81525f6004820152602401610319565b6103fd8161119d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561070a5750825b90505f826001600160401b031660011480156107255750303b155b905081158015610733575080155b156107515760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561077b57845460ff60401b1916600160401b1785555b6107858787611a30565b83156107cb57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b336108067f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103f25760405163118cdaa760e01b8152336004820152602401610319565b5f610838611a4a565b5f80516020612895833981519152426001600160401b038516116108ba5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610319565b6001600160401b0384166108d1426202a3006125be565b116109445760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610319565b8561099b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f86815260058201602052604090205415610a095760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610a705760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b5f80610ab76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611a94565b5f82815260028601602052604090209193509150610ad58282612622565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610b02908590600401612703565b6020604051808303815f875af1158015610b1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b42919061254c565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600488019052902081518154829060ff19166001836005811115610bc457610bc46124ae565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695851695909517919091171692909217929092179055600685018054918a16915f90610c959084906125be565b90915550610ca4905083611e39565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610d2561221e565b5f805160206128958339815191525f610d3d846115f0565b90505f80610d4e83604001516117d1565b915091508015610db35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600485016020526040808220815161010081019092528054829060ff166005811115610de557610de56124ae565b6005811115610df657610df66124ae565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610e7d57610e7d6124ae565b1480610e9b5750600182516005811115610e9957610e996124ae565b145b610efa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b600382516005811115610f0f57610f0f6124ae565b03610f3657505f8381526003860160205260408120600491610f3191906121e7565b610f3a565b5060055b6020808301515f9081526005808901909252604081205582908290811115610f6457610f646124ae565b90816005811115610f7757610f776124ae565b9052505f84815260048701602052604090208251815484929190829060ff19166001836005811115610fab57610fab6124ae565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611076576110766124ae565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b6110b361221e565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040908190208151610100810190925280545f80516020612895833981519152929190829060ff166005811115611114576111146124ae565b6005811115611125576111256124ae565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0460205260408082208151610100810190925280545f8051602061289583398151915293929190829060ff16600581111561126e5761126e6124ae565b600581111561127f5761127f6124ae565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115611307576113076124ae565b146113635760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146113dd5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b60038152426001600160401b031660e08201525f83815260048301602052604090208151815483929190829060ff19166001836005811115611421576114216124ae565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6114ed846114e781611e39565b5f611ee6565b5f85815260038501602052604090209091506115098282612622565b508160a001516001600160401b0316836006015f82825461152a9190612735565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061155b908590600401612703565b6020604051808303815f875af1158015611577573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159b919061254c565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f805160206128958339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611665573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261168c9190810190612757565b91509150806116f35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146117565760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b0316156117c95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146118365760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156118855761184d816001612735565b611858906008612829565b61ffff1685828151811061186e5761186e612840565b016020015160f81c901b9190911790600101611839565b5061ffff8116156118e45760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b600481101561193f576118fb816003612735565b611906906008612829565b63ffffffff16866119188360026125be565b8151811061192857611928612840565b016020015160f81c901b91909117906001016118e7565b5063ffffffff81166002146119a65760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b60208110156119fb576119bd81601f612735565b6119c8906008612829565b876119d48360066125be565b815181106119e4576119e4612840565b016020015160f81c901b91909117906001016119a9565b505f86602681518110611a1057611a10612840565b016020015191976001600160f81b03199092161515965090945050505050565b611a38612103565b611a418261214c565b6103c98161216d565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a8e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6060826080015151603014611afe5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611b7557611b35816001612735565b611b40906008612829565b5081515f90839083908110611b5757611b57612840565b60200101906001600160f81b03191690815f1a905350600101611b21565b505f5b6004811015611bd357611b8c816003612735565b611b97906008612829565b505f82611ba58360026125be565b81518110611bb557611bb5612840565b60200101906001600160f81b03191690815f1a905350600101611b78565b505f5b6020811015611c305784518160208110611bf257611bf2612840565b1a60f81b82611c028360066125be565b81518110611c1257611c12612840565b60200101906001600160f81b03191690815f1a905350600101611bd6565b505f5b6020811015611c905784602001518160208110611c5257611c52612840565b1a60f81b82611c628360266125be565b81518110611c7257611c72612840565b60200101906001600160f81b03191690815f1a905350600101611c33565b505f5b6008811015611d0457611ca7816007612735565b611cb2906008612829565b60ff1685604001516001600160401b0316901c60f81b82826046611cd691906125be565b81518110611ce657611ce6612840565b60200101906001600160f81b03191690815f1a905350600101611c93565b505f5b6030811015611d6f5784608001518181518110611d2657611d26612840565b01602001516001600160f81b03191682611d4183604e6125be565b81518110611d5157611d51612840565b60200101906001600160f81b03191690815f1a905350600101611d07565b505f5b6008811015611de157611d86816007612735565b611d91906008612829565b60608601516001600160401b0390811691161c60f81b82611db383607e6125be565b81518110611dc357611dc3612840565b60200101906001600160f81b03191690815f1a905350600101611d72565b50600281604051611df29190612854565b602060405180830381855afa158015611e0d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611e30919061254c565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb046020526040812060030180545f80516020612895833981519152916001600160401b0390911690819084611e918361286f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611f5f57611f1f816001612735565b611f2a906008612829565b5081515f90839083908110611f4157611f41612840565b60200101906001600160f81b03191690815f1a905350600101611f0b565b505f5b6004811015611fc257611f76816003612735565b611f81906008612829565b6001901c60f81b82611f948360026125be565b81518110611fa457611fa4612840565b60200101906001600160f81b03191690815f1a905350600101611f62565b505f5b602081101561202457611fd981601f612735565b611fe4906008612829565b86901c60f81b82611ff68360066125be565b8151811061200657612006612840565b60200101906001600160f81b03191690815f1a905350600101611fc5565b505f5b600881101561208f5761203b816007612735565b612046906008612829565b6001600160401b038616901c60f81b826120618360266125be565b8151811061207157612071612840565b60200101906001600160f81b03191690815f1a905350600101612027565b505f5b60088110156120fa576120a6816007612735565b6120b1906008612829565b6001600160401b038516901c60f81b826120cc83602e6125be565b815181106120dc576120dc612840565b60200101906001600160f81b03191690815f1a905350600101612092565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103f257604051631afcd79f60e31b815260040160405180910390fd5b612154612103565b61215c61217e565b61216461218e565b6103fd81612196565b612175612103565b6103fd816121d7565b612186612103565b6103f26121df565b6103f2612103565b61219e612103565b80355f8051602061289583398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b610694612103565b611ec0612103565b5080546121f390612476565b5f825580601f10612202575050565b601f0160209004905f5260205f20908101906103fd9190612262565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612276575f8155600101612263565b5090565b5f6020828403121561228a575f80fd5b5035919050565b80356001600160401b03811681146122a7575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156122e2576122e26122ac565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612310576123106122ac565b604052919050565b5f6001600160401b03821115612330576123306122ac565b50601f01601f191660200190565b5f805f8060808587031215612351575f80fd5b61235a85612291565b93506020850135925061236f60408601612291565b915060608501356001600160401b03811115612389575f80fd5b8501601f81018713612399575f80fd5b80356123ac6123a782612318565b6122e8565b8181528860208385010111156123c0575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156123f1575f80fd5b813563ffffffff81168114612404575f80fd5b9392505050565b6001600160a01b03811681146103fd575f80fd5b5f6020828403121561242f575f80fd5b81356124048161240b565b5f80828403606081121561244c575f80fd5b6040811215612459575f80fd5b50829150604083013561246b8161240b565b809150509250929050565b600181811c9082168061248a57607f821691505b6020821081036124a857634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f84546124d481612476565b806020870152604060018084165f81146124f557600181146125115761253e565b60ff19851660408a0152604084151560051b8a0101955061253e565b895f5260205f205f5b858110156125355781548b820186015290830190880161251a565b8a016040019650505b509398975050505050505050565b5f6020828403121561255c575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156125d1576125d16125aa565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156125fc5750805b601f840160051c820191505b8181101561261b575f8155600101612608565b5050505050565b81516001600160401b0381111561263b5761263b6122ac565b61264f816126498454612476565b846125d7565b602080601f831160018114612682575f841561266b5750858301515b5f19600386901b1c1916600185901b1785556126d9565b5f85815260208120601f198616915b828110156126b057888601518255948401946001909101908401612691565b50858210156126cd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156126fb5781810151838201526020016126e3565b50505f910152565b602081525f82518060208401526127218160408501602087016126e1565b601f01601f19169190910160400192915050565b818103818111156125d1576125d16125aa565b805180151581146122a7575f80fd5b5f8060408385031215612768575f80fd5b82516001600160401b038082111561277e575f80fd5b9084019060608287031215612791575f80fd5b6127996122c0565b825181526020808401516127ac8161240b565b828201526040840151838111156127c1575f80fd5b80850194505087601f8501126127d5575f80fd5b835192506127e56123a784612318565b83815288828587010111156127f8575f80fd5b612807848383018488016126e1565b8060408401525081955061281c818801612748565b9450505050509250929050565b80820281158282048414176125d1576125d16125aa565b634e487b7160e01b5f52603260045260245ffd5b5f82516128658184602087016126e1565b9190910192915050565b5f6001600160401b0380831681810361288a5761288a6125aa565b600101939250505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612c4a380380612c4a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612afd8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c8063715018a611610088578063a3a65e4811610063578063a3a65e48146101f8578063b771b3bc1461020b578063bee0a03f14610219578063f2fde38b1461022c575f80fd5b8063715018a6146101995780638da5cb5b146101a157806397fb70d4146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f14610148578063580a40061461015b57806366435abf1461016e575b5f80fd5b6100e26100dd366004612445565b61023f565b005b6101226100f2366004612445565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612509565b6103a0565b6100e26101563660046125ac565b6103c0565b6100e26101693660046125ea565b6103cd565b61018161017c366004612445565b6104db565b6040516001600160401b03909116815260200161012c565b6100e26104ef565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101f3366004612445565b610502565b6100e26102063660046125ac565b61050e565b6101cd6005600160991b0181565b6100e2610227366004612445565b6106cb565b6100e261023a366004612626565b61079a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612ad183398151915292919061028790612641565b90501180156102b9575060035f83815260088301602052604090205460ff1660058111156102b7576102b7612679565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b919060040161268d565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612717565b505050565b5f6103a96107d4565b6103b58486858561082f565b90505b949350505050565b6103c981610d29565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104115750825b90505f826001600160401b0316600114801561042c5750303b155b90508115801561043a575080155b156104585760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561048257845460ff60401b1916600160401b1785555b61048c87876110b6565b83156104d257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6104e5826110d0565b60a0015192915050565b6104f76107d4565b6105005f6111c2565b565b61050b81611232565b50565b5f80516020612ad18339815191525f61052683611622565b90505f806105378360400151611803565b91509150806105995760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600685016020526040812080546105b390612641565b90501180156105e5575060015f83815260088601602052604090205460ff1660058111156105e3576105e3612679565b145b6106015760405162461bcd60e51b81526004016103199061272e565b5f8281526006850160205260408120610619916123b2565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612ad183398151915292919061071390612641565b9050118015610745575060015f83815260088301602052604090205460ff16600581111561074357610743612679565b145b6107615760405162461bcd60e51b81526004016103199061272e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b919060040161268d565b6107a26107d4565b6001600160a01b0381166107cb57604051631e4fbdf760e01b81525f6004820152602401610319565b61050b816111c2565b336108067f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105005760405163118cdaa760e01b8152336004820152602401610319565b5f610838611a62565b5f80516020612ad1833981519152426001600160401b038516116108ba5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610319565b6001600160401b0384166108d1426202a300612789565b116109445760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610319565b8561099b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f86815260098201602052604090205415610a095760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610a705760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b5f80610ab76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611aac565b5f82815260068601602052604090209193509150610ad582826127ed565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610b029085906004016128ce565b6020604051808303815f875af1158015610b1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b429190612717565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115610bc457610bc4612679565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610c8588611e51565b876001600160401b031684600a015f828254610ca19190612789565b90915550610cb0905083612004565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610d316123e9565b5f80516020612ad18339815191525f610d4984611622565b90505f80610d5a8360400151611803565b915091508015610dbf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610df157610df1612679565b6005811115610e0257610e02612679565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610e8957610e89612679565b1480610ea75750600182516005811115610ea557610ea5612679565b145b610f065760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b600382516005811115610f1b57610f1b612679565b03610f4257505f8381526007860160205260408120600491610f3d91906123b2565b610f46565b5060055b6020808301515f90815260098801909152604081205581816005811115610f6f57610f6f612679565b90816005811115610f8257610f82612679565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610fb657610fb6612679565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561108157611081612679565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b6110be6120b1565b6110c7826120fa565b6103c98161211b565b6110d86123e9565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040908190208151610100810190925280545f80516020612ad1833981519152929190829060ff16600581111561113957611139612679565b600581111561114a5761114a612679565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0860205260408082208151610100810190925280545f80516020612ad183398151915293929190829060ff16600581111561129357611293612679565b60058111156112a4576112a4612679565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561132c5761132c612679565b146113885760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146114025760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561144657611446612679565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6115128461150c81612004565b5f61212c565b5f858152600785016020526040902090915061152e82826127ed565b5061153c8260a00151611e51565b8160a001516001600160401b031683600a015f82825461155c9190612900565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061158d9085906004016128ce565b6020604051808303815f875af11580156115a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115cd9190612717565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612ad18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611697573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116be9190810190612922565b91509150806117255760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146117885760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b0316156117fb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146118685760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156118b75761187f816001612900565b61188a9060086129f4565b61ffff168582815181106118a0576118a0612a0b565b016020015160f81c901b919091179060010161186b565b5061ffff8116156119165760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b60048110156119715761192d816003612900565b6119389060086129f4565b63ffffffff168661194a836002612789565b8151811061195a5761195a612a0b565b016020015160f81c901b9190911790600101611919565b5063ffffffff81166002146119d85760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b6020811015611a2d576119ef81601f612900565b6119fa9060086129f4565b87611a06836006612789565b81518110611a1657611a16612a0b565b016020015160f81c901b91909117906001016119db565b505f86602681518110611a4257611a42612a0b565b016020015191976001600160f81b03199092161515965090945050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611aa657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6060826080015151603014611b165760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611b8d57611b4d816001612900565b611b589060086129f4565b5081515f90839083908110611b6f57611b6f612a0b565b60200101906001600160f81b03191690815f1a905350600101611b39565b505f5b6004811015611beb57611ba4816003612900565b611baf9060086129f4565b505f82611bbd836002612789565b81518110611bcd57611bcd612a0b565b60200101906001600160f81b03191690815f1a905350600101611b90565b505f5b6020811015611c485784518160208110611c0a57611c0a612a0b565b1a60f81b82611c1a836006612789565b81518110611c2a57611c2a612a0b565b60200101906001600160f81b03191690815f1a905350600101611bee565b505f5b6020811015611ca85784602001518160208110611c6a57611c6a612a0b565b1a60f81b82611c7a836026612789565b81518110611c8a57611c8a612a0b565b60200101906001600160f81b03191690815f1a905350600101611c4b565b505f5b6008811015611d1c57611cbf816007612900565b611cca9060086129f4565b60ff1685604001516001600160401b0316901c60f81b82826046611cee9190612789565b81518110611cfe57611cfe612a0b565b60200101906001600160f81b03191690815f1a905350600101611cab565b505f5b6030811015611d875784608001518181518110611d3e57611d3e612a0b565b01602001516001600160f81b03191682611d5983604e612789565b81518110611d6957611d69612a0b565b60200101906001600160f81b03191690815f1a905350600101611d1f565b505f5b6008811015611df957611d9e816007612900565b611da99060086129f4565b60608601516001600160401b0390811691161c60f81b82611dcb83607e612789565b81518110611ddb57611ddb612a0b565b60200101906001600160f81b03191690815f1a905350600101611d8a565b50600281604051611e0a9190612a1f565b602060405180830381855afa158015611e25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611e489190612717565b94909350915050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612ad183398151915290600160401b900460ff165f03611e96575050565b6040805160608101825260038301548082526004840154602083015260058401546001600160401b0390811693830193909352600284015442931690611edc9084612900565b10611f02576001600160401b0384166040820152818152600a8301546020820152611f21565b8381604001818151611f149190612a3a565b6001600160401b03169052505b5f816020015182604001516064611f389190612a61565b6001600160401b0316611f4b9190612a8c565b600285015490915060ff600160401b90910481169082161115611fc65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610319565b508051600384015560208101516004840155604001516005909201805467ffffffffffffffff19166001600160401b03909316929092179091555050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812060030180545f80516020612ad1833981519152916001600160401b039091169081908461205c83612aab565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661050057604051631afcd79f60e31b815260040160405180910390fd5b6121026120b1565b61210a612349565b612112612359565b61050b81612361565b6121236120b1565b61050b816123a2565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156121a557612165816001612900565b6121709060086129f4565b5081515f9083908390811061218757612187612a0b565b60200101906001600160f81b03191690815f1a905350600101612151565b505f5b6004811015612208576121bc816003612900565b6121c79060086129f4565b6001901c60f81b826121da836002612789565b815181106121ea576121ea612a0b565b60200101906001600160f81b03191690815f1a9053506001016121a8565b505f5b602081101561226a5761221f81601f612900565b61222a9060086129f4565b86901c60f81b8261223c836006612789565b8151811061224c5761224c612a0b565b60200101906001600160f81b03191690815f1a90535060010161220b565b505f5b60088110156122d557612281816007612900565b61228c9060086129f4565b6001600160401b038616901c60f81b826122a7836026612789565b815181106122b7576122b7612a0b565b60200101906001600160f81b03191690815f1a90535060010161226d565b505f5b6008811015612340576122ec816007612900565b6122f79060086129f4565b6001600160401b038516901c60f81b8261231283602e612789565b8151811061232257612322612a0b565b60200101906001600160f81b03191690815f1a9053506001016122d8565b50949350505050565b6123516120b1565b6105006123aa565b6105006120b1565b6123696120b1565b80355f80516020612ad183398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b6107a26120b1565b61208b6120b1565b5080546123be90612641565b5f825580601f106123cd575050565b601f0160209004905f5260205f209081019061050b919061242d565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612441575f815560010161242e565b5090565b5f60208284031215612455575f80fd5b5035919050565b80356001600160401b0381168114612472575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156124ad576124ad612477565b60405290565b604051601f8201601f191681016001600160401b03811182821017156124db576124db612477565b604052919050565b5f6001600160401b038211156124fb576124fb612477565b50601f01601f191660200190565b5f805f806080858703121561251c575f80fd5b6125258561245c565b93506020850135925061253a6040860161245c565b915060608501356001600160401b03811115612554575f80fd5b8501601f81018713612564575f80fd5b8035612577612572826124e3565b6124b3565b81815288602083850101111561258b575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156125bc575f80fd5b813563ffffffff811681146125cf575f80fd5b9392505050565b6001600160a01b038116811461050b575f80fd5b5f8082840360a08112156125fc575f80fd5b6080811215612609575f80fd5b50829150608083013561261b816125d6565b809150509250929050565b5f60208284031215612636575f80fd5b81356125cf816125d6565b600181811c9082168061265557607f821691505b60208210810361267357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f845461269f81612641565b806020870152604060018084165f81146126c057600181146126dc57612709565b60ff19851660408a0152604084151560051b8a01019550612709565b895f5260205f205f5b858110156127005781548b82018601529083019088016126e5565b8a016040019650505b509398975050505050505050565b5f60208284031215612727575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561279c5761279c612775565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156127c75750805b601f840160051c820191505b818110156127e6575f81556001016127d3565b5050505050565b81516001600160401b0381111561280657612806612477565b61281a816128148454612641565b846127a2565b602080601f83116001811461284d575f84156128365750858301515b5f19600386901b1c1916600185901b1785556128a4565b5f85815260208120601f198616915b8281101561287b5788860151825594840194600190910190840161285c565b508582101561289857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156128c65781810151838201526020016128ae565b50505f910152565b602081525f82518060208401526128ec8160408501602087016128ac565b601f01601f19169190910160400192915050565b8181038181111561279c5761279c612775565b80518015158114612472575f80fd5b5f8060408385031215612933575f80fd5b82516001600160401b0380821115612949575f80fd5b908401906060828703121561295c575f80fd5b61296461248b565b82518152602080840151612977816125d6565b8282015260408401518381111561298c575f80fd5b80850194505087601f8501126129a0575f80fd5b835192506129b0612572846124e3565b83815288828587010111156129c3575f80fd5b6129d2848383018488016128ac565b806040840152508195506129e7818801612913565b9450505050509250929050565b808202811582820484141761279c5761279c612775565b634e487b7160e01b5f52603260045260245ffd5b5f8251612a308184602087016128ac565b9190910192915050565b6001600160401b03818116838216019080821115612a5a57612a5a612775565b5092915050565b6001600160401b03818116838216028082169190828114612a8457612a84612775565b505092915050565b5f82612aa657634e487b7160e01b5f52601260045260245ffd5b500490565b5f6001600160401b03808316818103612ac657612ac6612775565b600101939250505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -374,23 +376,23 @@ func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteValida return _PoAValidatorManager.Contract.CompleteValidatorRegistration(&_PoAValidatorManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0xf3e148eb. +// Initialize is a paid mutator transaction binding the contract method 0x580a4006. // -// Solidity: function initialize((bytes32,bytes32) settings, address initialOwner) returns() +// Solidity: function initialize((bytes32,bytes32,uint64,uint8) settings, address initialOwner) returns() func (_PoAValidatorManager *PoAValidatorManagerTransactor) Initialize(opts *bind.TransactOpts, settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { return _PoAValidatorManager.contract.Transact(opts, "initialize", settings, initialOwner) } -// Initialize is a paid mutator transaction binding the contract method 0xf3e148eb. +// Initialize is a paid mutator transaction binding the contract method 0x580a4006. // -// Solidity: function initialize((bytes32,bytes32) settings, address initialOwner) returns() +// Solidity: function initialize((bytes32,bytes32,uint64,uint8) settings, address initialOwner) returns() func (_PoAValidatorManager *PoAValidatorManagerSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) } -// Initialize is a paid mutator transaction binding the contract method 0xf3e148eb. +// Initialize is a paid mutator transaction binding the contract method 0x580a4006. // -// Solidity: function initialize((bytes32,bytes32) settings, address initialOwner) returns() +// Solidity: function initialize((bytes32,bytes32,uint64,uint8) settings, address initialOwner) returns() func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index be95236bf..1702c057e 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -6,10 +6,7 @@ pragma solidity 0.8.25; import { - IPoSValidatorManager, - Delegator, - DelegatorStatus, - ValidatorChurnPeriod + IPoSValidatorManager, Delegator, DelegatorStatus } from "./interfaces/IPoSValidatorManager.sol"; import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; import {Validator} from "./interfaces/IValidatorManager.sol"; @@ -28,12 +25,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 _minimumStakeAmount; /// @notice The maximum amount of stake allowed to be a validator. uint256 _maximumStakeAmount; - /// @notice The number of seconds after which to reset the churn tracker. - uint64 _churnPeriodSeconds; - /// @notice The maximum churn rate allowed per churn period. - uint8 _maximumChurnPercentage; - /// @notice The churn tracker used to track the amount of stake added or removed in the churn period. - ValidatorChurnPeriod _churnTracker; /// @notice The minimum amount of time a validator must be staked for. uint64 _minimumStakeDuration; /// @notice The reward calculator for this validator manager. @@ -73,9 +64,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager __POS_Validator_Manager_init_unchained({ minimumStakeAmount: settings.minimumStakeAmount, maximumStakeAmount: settings.maximumStakeAmount, - churnPeriodSeconds: settings.churnPeriodSeconds, minimumStakeDuration: settings.minimumStakeDuration, - maximumChurnPercentage: settings.maximumChurnPercentage, rewardCalculator: settings.rewardCalculator }); } @@ -84,17 +73,13 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function __POS_Validator_Manager_init_unchained( uint256 minimumStakeAmount, uint256 maximumStakeAmount, - uint64 churnPeriodSeconds, uint64 minimumStakeDuration, - uint8 maximumChurnPercentage, IRewardCalculator rewardCalculator ) internal onlyInitializing { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); $._minimumStakeAmount = minimumStakeAmount; $._maximumStakeAmount = maximumStakeAmount; - $._churnPeriodSeconds = churnPeriodSeconds; $._minimumStakeDuration = minimumStakeDuration; - $._maximumChurnPercentage = maximumChurnPercentage; $._rewardCalculator = rewardCalculator; } @@ -103,9 +88,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bool includeUptimeProof, uint32 messageIndex ) external { - uint64 weight = _getValidator(validationID).weight; - _checkAndUpdateChurnTracker(weight); - if (includeUptimeProof) { _getUptime(validationID, messageIndex); } @@ -154,9 +136,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: invalid stake amount" ); - // Check that adding this validator would not exceed the maximum churn rate. - _checkAndUpdateChurnTracker(weight); - return weight; } @@ -171,37 +150,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function _lock(uint256 value) internal virtual returns (uint256); function _unlock(uint256 value, address to) internal virtual; - /** - * @notice Helper function to check if the stake amount to be added or removed would exceed the maximum stake churn - * rate for the past hour. If the churn rate is exceeded, the function will revert. If the churn rate is not exceeded, - * the function will update the churn tracker with the new amount. - */ - function _checkAndUpdateChurnTracker(uint64 weight) private { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - uint256 totalWeight = _getTotalWeight(); - if ($._maximumChurnPercentage == 0 || totalWeight == 0) { - return; - } - - uint256 currentTime = block.timestamp; - ValidatorChurnPeriod memory churnTracker = $._churnTracker; - - if (currentTime - churnTracker.startedAt >= $._churnPeriodSeconds) { - churnTracker.churnAmount = weight; - churnTracker.startedAt = currentTime; - churnTracker.initialWeight = totalWeight; - } else { - churnTracker.churnAmount += weight; - } - - uint8 churnPercentage = uint8((churnTracker.churnAmount * 100) / churnTracker.initialWeight); - require( - churnPercentage <= $._maximumChurnPercentage, - "PoSValidatorManager: maximum churn rate exceeded" - ); - $._churnTracker = churnTracker; - } - function _initializeDelegatorRegistration( bytes32 validationID, address delegatorAddress, @@ -224,6 +172,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 nonce = _getAndIncrementNonce(validationID); bytes32 delegationID = keccak256(abi.encodePacked(validationID, delegatorAddress, nonce)); + // Check that adding this validator would not exceed the maximum churn rate. _checkAndUpdateChurnTracker(weight); // Submit the message to the Warp precompile. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 6697377a9..bb5641244 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -8,6 +8,7 @@ pragma solidity 0.8.25; import { IValidatorManager, ValidatorManagerSettings, + ValidatorChurnPeriod, ValidatorStatus, Validator } from "./interfaces/IValidatorManager.sol"; @@ -36,6 +37,12 @@ abstract contract ValidatorManager is bytes32 _pChainBlockchainID; /// @notice The subnetID associated with this validator manager. bytes32 _subnetID; + /// @notice The number of seconds after which to reset the churn tracker. + uint64 _churnPeriodSeconds; + /// @notice The maximum churn rate allowed per churn period. + uint8 _maximumChurnPercentage; + /// @notice The churn tracker used to track the amount of stake added or removed in the churn period. + ValidatorChurnPeriod _churnTracker; /// @notice Maps the validationID to the registration message such that the message can be re-sent if needed. mapping(bytes32 => bytes) _pendingRegisterValidationMessages; /// @notice Maps the validationID to the end validation message such that the message can be re-sent if needed. @@ -147,6 +154,8 @@ abstract contract ValidatorManager is endedAt: 0 }); + // Check that adding this validator would not exceed the maximum churn rate. + _checkAndUpdateChurnTracker(weight); // Update total weight $._totalWeight += weight; @@ -239,6 +248,7 @@ abstract contract ValidatorManager is .packSetSubnetValidatorWeightMessage(validationID, _getAndIncrementNonce(validationID), 0); $._pendingEndValidationMessages[validationID] = setValidatorWeightPayload; + _checkAndUpdateChurnTracker(validator.weight); // Update weight after checking the churn tracker. $._totalWeight -= validator.weight; @@ -355,12 +365,39 @@ abstract contract ValidatorManager is return $._validationPeriods[validationID]; } - function _getTotalWeight() internal view returns (uint256) { - return _getValidatorManagerStorage()._totalWeight; - } - function _setValidatorWeight(bytes32 validationID, uint64 weight) internal { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); $._validationPeriods[validationID].weight = weight; } + + /** + * @notice Helper function to check if the stake amount to be added or removed would exceed the maximum stake churn + * rate for the past hour. If the churn rate is exceeded, the function will revert. If the churn rate is not exceeded, + * the function will update the churn tracker with the new amount. + */ + function _checkAndUpdateChurnTracker(uint64 weight) internal { + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + + if ($._maximumChurnPercentage == 0) { + return; + } + + uint256 currentTime = block.timestamp; + ValidatorChurnPeriod memory churnTracker = $._churnTracker; + + if (currentTime - churnTracker.startedAt >= $._churnPeriodSeconds) { + churnTracker.churnAmount = weight; + churnTracker.startedAt = currentTime; + churnTracker.initialWeight = $._totalWeight; + } else { + churnTracker.churnAmount += weight; + } + + uint8 churnPercentage = uint8((churnTracker.churnAmount * 100) / churnTracker.initialWeight); + require( + churnPercentage <= $._maximumChurnPercentage, + "ValidatorManager: maximum churn rate exceeded" + ); + $._churnTracker = churnTracker; + } } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 8277cf348..84cc32b3b 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -20,18 +20,10 @@ struct PoSValidatorManagerSettings { ValidatorManagerSettings baseSettings; uint256 minimumStakeAmount; uint256 maximumStakeAmount; - uint64 churnPeriodSeconds; uint64 minimumStakeDuration; - uint8 maximumChurnPercentage; IRewardCalculator rewardCalculator; } -struct ValidatorChurnPeriod { - uint256 startedAt; - uint256 initialWeight; - uint64 churnAmount; -} - struct Delegator { DelegatorStatus status; address owner; diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 06bddd2cd..d8a93a58f 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -28,6 +28,14 @@ struct Validator { struct ValidatorManagerSettings { bytes32 pChainBlockchainID; bytes32 subnetID; + uint64 churnPeriodSeconds; + uint8 maximumChurnPercentage; +} + +struct ValidatorChurnPeriod { + uint256 startedAt; + uint256 initialWeight; + uint64 churnAmount; } interface IValidatorManager { diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 4b5704fe4..7b8c8f636 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -31,13 +31,13 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, - subnetID: DEFAULT_SUBNET_ID + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE, rewardCalculator: IRewardCalculator(address(0)) }), token diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index cd0d4127c..8cbf072a7 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -24,13 +24,13 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, - subnetID: DEFAULT_SUBNET_ID + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, - churnPeriodSeconds: DEFAULT_CHURN_PERIOD, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE, rewardCalculator: IRewardCalculator(address(0)) }) ); diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index 9eb86fa6d..63cc10282 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -22,7 +22,9 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { app.initialize( ValidatorManagerSettings({ pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, - subnetID: DEFAULT_SUBNET_ID + subnetID: DEFAULT_SUBNET_ID, + churnPeriodSeconds: DEFAULT_CHURN_PERIOD, + maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), address(this) ); From f45cce738e2c16f9e80b95a9d73fd07de1cb6fba Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Tue, 10 Sep 2024 21:35:06 +0000 Subject: [PATCH 237/545] mint(addr,amount): respect _MAX_MINT addresses review comment https://github.com/ava-labs/teleporter/pull/534#discussion_r1752539780 --- abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go | 2 +- contracts/mocks/ExampleERC20.sol | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go index fe803b2d1..f3b31c597 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: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108698061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101a7578063a0712d68146101af578063a9059cbb146101c2578063dd62ed3e146101d5575f80fd5b806342966c681461015957806370a082311461016c57806379cc679014610194575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce5671461013557806340c10f1914610144575b5f80fd5b6100d761020d565b6040516100e491906106d5565b60405180910390f35b6101006100fb36600461073c565b61029d565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b610100610130366004610764565b6102b6565b604051601281526020016100e4565b61015761015236600461073c565b6102d9565b005b61015761016736600461079d565b6102e7565b61011461017a3660046107b4565b6001600160a01b03165f9081526020819052604090205490565b6101576101a236600461073c565b6102f4565b6100d7610309565b6101576101bd36600461079d565b610318565b6101006101d036600461073c565b61037e565b6101146101e33660046107d4565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021c90610805565b80601f016020809104026020016040519081016040528092919081815260200182805461024890610805565b80156102935780601f1061026a57610100808354040283529160200191610293565b820191905f5260205f20905b81548152906001019060200180831161027657829003601f168201915b5050505050905090565b5f336102aa81858561038b565b60019150505b92915050565b5f336102c385828561039d565b6102ce858585610418565b506001949350505050565b6102e38282610475565b5050565b6102f133826104a9565b50565b6102ff82338361039d565b6102e382826104a9565b60606004805461021c90610805565b662386f26fc100008111156103745760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b6102f13382610475565b5f336102aa818585610418565b61039883838360016104dd565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610412578181101561040457604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161036b565b61041284848484035f6104dd565b50505050565b6001600160a01b03831661044157604051634b637e8f60e11b81525f600482015260240161036b565b6001600160a01b03821661046a5760405163ec442f0560e01b81525f600482015260240161036b565b6103988383836105af565b6001600160a01b03821661049e5760405163ec442f0560e01b81525f600482015260240161036b565b6102e35f83836105af565b6001600160a01b0382166104d257604051634b637e8f60e11b81525f600482015260240161036b565b6102e3825f836105af565b6001600160a01b0384166105065760405163e602df0560e01b81525f600482015260240161036b565b6001600160a01b03831661052f57604051634a1406b160e11b81525f600482015260240161036b565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561041257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105a191815260200190565b60405180910390a350505050565b6001600160a01b0383166105d9578060025f8282546105ce919061083d565b909155506106499050565b6001600160a01b0383165f908152602081905260409020548181101561062b5760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161036b565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661066557600280548290039055610683565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516106c891815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b81811015610701578581018301518582016040015282016106e5565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610737575f80fd5b919050565b5f806040838503121561074d575f80fd5b61075683610721565b946020939093013593505050565b5f805f60608486031215610776575f80fd5b61077f84610721565b925061078d60208501610721565b9150604084013590509250925092565b5f602082840312156107ad575f80fd5b5035919050565b5f602082840312156107c4575f80fd5b6107cd82610721565b9392505050565b5f80604083850312156107e5575f80fd5b6107ee83610721565b91506107fc60208401610721565b90509250929050565b600181811c9082168061081957607f821691505b60208210810361083757634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102b057634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108c08061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101a7578063a0712d68146101af578063a9059cbb146101c2578063dd62ed3e146101d5575f80fd5b806342966c681461015957806370a082311461016c57806379cc679014610194575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce5671461013557806340c10f1914610144575b5f80fd5b6100d761020d565b6040516100e4919061072c565b60405180910390f35b6101006100fb366004610793565b61029d565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b6101006101303660046107bb565b6102b6565b604051601281526020016100e4565b610157610152366004610793565b6102d9565b005b6101576101673660046107f4565b610343565b61011461017a36600461080b565b6001600160a01b03165f9081526020819052604090205490565b6101576101a2366004610793565b610350565b6100d7610365565b6101576101bd3660046107f4565b610374565b6101006101d0366004610793565b6103d5565b6101146101e336600461082b565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021c9061085c565b80601f01602080910402602001604051908101604052809291908181526020018280546102489061085c565b80156102935780601f1061026a57610100808354040283529160200191610293565b820191905f5260205f20905b81548152906001019060200180831161027657829003601f168201915b5050505050905090565b5f336102aa8185856103e2565b60019150505b92915050565b5f336102c38582856103f4565b6102ce85858561046f565b506001949350505050565b662386f26fc100008111156103355760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b61033f82826104cc565b5050565b61034d3382610500565b50565b61035b8233836103f4565b61033f8282610500565b60606004805461021c9061085c565b662386f26fc100008111156103cb5760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e7420657863656564656400604482015260640161032c565b61034d33826104cc565b5f336102aa81858561046f565b6103ef8383836001610534565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610469578181101561045b57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161032c565b61046984848484035f610534565b50505050565b6001600160a01b03831661049857604051634b637e8f60e11b81525f600482015260240161032c565b6001600160a01b0382166104c15760405163ec442f0560e01b81525f600482015260240161032c565b6103ef838383610606565b6001600160a01b0382166104f55760405163ec442f0560e01b81525f600482015260240161032c565b61033f5f8383610606565b6001600160a01b03821661052957604051634b637e8f60e11b81525f600482015260240161032c565b61033f825f83610606565b6001600160a01b03841661055d5760405163e602df0560e01b81525f600482015260240161032c565b6001600160a01b03831661058657604051634a1406b160e11b81525f600482015260240161032c565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561046957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105f891815260200190565b60405180910390a350505050565b6001600160a01b038316610630578060025f8282546106259190610894565b909155506106a09050565b6001600160a01b0383165f90815260208190526040902054818110156106825760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161032c565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166106bc576002805482900390556106da565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161071f91815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b818110156107585785810183015185820160400152820161073c565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461078e575f80fd5b919050565b5f80604083850312156107a4575f80fd5b6107ad83610778565b946020939093013593505050565b5f805f606084860312156107cd575f80fd5b6107d684610778565b92506107e460208501610778565b9150604084013590509250925092565b5f60208284031215610804575f80fd5b5035919050565b5f6020828403121561081b575f80fd5b61082482610778565b9392505050565b5f806040838503121561083c575f80fd5b61084583610778565b915061085360208401610778565b90509250929050565b600181811c9082168061087057607f821691505b60208210810361088e57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102b057634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", } // ExampleERC20ABI is the input ABI used to generate the binding from. diff --git a/contracts/mocks/ExampleERC20.sol b/contracts/mocks/ExampleERC20.sol index 9f6d137a7..a17f2f49d 100644 --- a/contracts/mocks/ExampleERC20.sol +++ b/contracts/mocks/ExampleERC20.sol @@ -33,6 +33,9 @@ contract ExampleERC20 is ERC20Burnable, IERC20Mintable { } function mint(address account, uint256 amount) external { + // Can only mint 10 at a time. + require(amount <= _MAX_MINT, "ExampleERC20: max mint exceeded"); + _mint(account, amount); } } From 57a519e728da4431a644ebd148f588bad396ad9e Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Wed, 11 Sep 2024 00:05:36 +0000 Subject: [PATCH 238/545] incorporate uptime in rewards --- .../ERC20TokenStakingManager.go | 2 +- .../ExampleRewardCalculator.go | 28 +++++------ .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- contracts/staking/ExampleRewardCalculator.sol | 5 +- contracts/staking/PoSValidatorManager.sol | 33 ++++++------ contracts/staking/ValidatorManager.sol | 8 ++- .../staking/interfaces/IRewardCalculator.sol | 3 +- .../tests/ExamplesRewardCalculatorTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 50 +++++++++++++++++-- .../staking/tests/ValidatorManagerTests.t.sol | 39 +++++++++++++-- 11 files changed, 130 insertions(+), 44 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index c15551c16..f3eab1c63 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614ada380380614ada83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61498d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613fd9565b6102d6565b005b610128610138366004614014565b610761565b61017b61014b366004614014565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004614014565b6108bd565b6101286101af36600461403f565b61092a565b6101c76101c2366004614014565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed36600461407c565b610a24565b610128610200366004614095565b610b1e565b61017b6102133660046140d3565b610d0f565b6101c7610226366004614014565b610d28565b610128610239366004614014565b610d3c565b61012861024c366004613fd9565b610da9565b61017b61025f36600461417e565b610dc4565b610128610272366004614095565b610de9565b61017b61028536600461421a565b6110d4565b61012861029836600461407c565b6110e7565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004614014565b6112a4565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206148e1833981519152918415610328576103258285611373565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a61423a565b600481111561036b5761036b61423a565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f261423a565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206149018339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206149018339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461160f565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156105005761050061423a565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d285611683565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190614262565b905061066a8682611762565b5f6106768785846117aa565b5f8c815260058a0160205260409020909150610692828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016143ed565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff919061441f565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206149218339815191529291906107a990614289565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d961423a565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614436565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b8919061441f565b505050565b6108c6816119c7565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206148e1833981519152916005600160991b019163ee5b48eb9161087891600401614436565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc8484611a9a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a51000836144d4565b92915050565b5f610a2e82611ab4565b90505f5f805160206148e1833981519152600281015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f6064820181905260848201819052929350600160401b9091046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610ac9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aed919061441f565b9050610afd836040015182611e41565b610b1883606001516001600160401b03168460400151611eb7565b50505050565b5f805160206148e18339815191525f610b3684611eda565b90505f80610b4783604001516120bb565b5091509150610b55856122f6565b5f8581526004850160205260408120610b6d91613f21565b5f610b7783611683565b9050816001600160401b031681608001516001600160401b03161015610baf5760405162461bcd60e51b815260040161043b906144e7565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bf45760405162461bcd60e51b815260040161043b90614529565b60015f87815260038701602052604090205460ff166004811115610c1a57610c1a61423a565b14610c835760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a51000614572565b5f610d3282611683565b60a0015192915050565b610d45816122f6565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206148e1833981519152916005600160991b019163ee5b48eb9161087891600401614436565b8115610dbb57610db98382611373565b505b6108b8836123cf565b5f80610dcf86612787565b9050610ddd85828686612834565b9150505b949350505050565b5f805160206148e18339815191525f610e0184611eda565b90505f80610e1283604001516120bb565b5091509150610e20856119c7565b5f8581526005850160205260408120610e3891613f21565b5f610e4283611683565b9050816001600160401b031681608001516001600160401b03161015610e7a5760405162461bcd60e51b815260040161043b906144e7565b5f8681526003808701602052604090912001546001600160401b0380841691161115610eb85760405162461bcd60e51b815260040161043b90614529565b60035f87815260038701602052604090205460ff166004811115610ede57610ede61423a565b14610f325760405162461bcd60e51b815260206004820152603160248201525f805160206149018339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610fd69190611eb7565b60028601546060820151608083015160a0840151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f606482018190526084820181905291600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561105d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611081919061441f565b9050611091826020015182611e41565b836001600160401b031685897f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050505050565b5f6110e0833384612c89565b9392505050565b5f805160206149218339815191525f6110ff83611eda565b90505f806111108360400151613044565b91509150806111725760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f8281526005850160205260408120805461118c90614289565b90501180156111be575060015f83815260078601602052604090205460ff1660058111156111bc576111bc61423a565b145b6111da5760405162461bcd60e51b815260040161043b90614589565b5f82815260058501602052604081206111f291613f21565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149218339815191529291906112ec90614289565b905011801561131e575060015f83815260078301602052604090205460ff16600581111561131c5761131c61423a565b145b61133a5760405162461bcd60e51b815260040161043b90614589565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614436565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113e591908101906145db565b91509150806114485760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561148b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114af919061441f565b8251146115135760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156115895760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061159884604001516131e5565b915091508187146116055760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206149618339815191526020526040812060030180545f80516020614921833981519152916001600160401b0390911690819084611654836146ad565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61168b613f58565b5f8281525f805160206149618339815191526020526040908190208151610100810190925280545f80516020614921833981519152929190829060ff1660058111156116d9576116d961423a565b60058111156116ea576116ea61423a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614961833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611823576117e38160016146d2565b6117ee906008614572565b5081515f90839083908110611805576118056146e5565b60200101906001600160f81b03191690815f1a9053506001016117cf565b505f5b60048110156118865761183a8160036146d2565b611845906008614572565b6001901c60f81b826118588360026146f9565b81518110611868576118686146e5565b60200101906001600160f81b03191690815f1a905350600101611826565b505f5b60208110156118e85761189d81601f6146d2565b6118a8906008614572565b86901c60f81b826118ba8360066146f9565b815181106118ca576118ca6146e5565b60200101906001600160f81b03191690815f1a905350600101611889565b505f5b6008811015611953576118ff8160076146d2565b61190a906008614572565b6001600160401b038616901c60f81b826119258360266146f9565b81518110611935576119356146e5565b60200101906001600160f81b03191690815f1a9053506001016118eb565b505f5b60088110156119be5761196a8160076146d2565b611975906008614572565b6001600160401b038516901c60f81b8261199083602e6146f9565b815181106119a0576119a06146e5565b60200101906001600160f81b03191690815f1a905350600101611956565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206148e1833981519152929190611a0f90614289565b9050118015611a41575060035f83815260038301602052604090205460ff166004811115611a3f57611a3f61423a565b145b611a965760405162461bcd60e51b815260206004820152603360248201525f8051602061490183398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b611aa26133bd565b611aab82613408565b611a968161344e565b611abc613f58565b5f805160206149218339815191525f611ad484611eda565b90505f80611ae58360400151613044565b915091508015611b4a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611b7c57611b7c61423a565b6005811115611b8d57611b8d61423a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c1457611c1461423a565b1480611c325750600182516005811115611c3057611c3061423a565b145b611c915760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611ca657611ca661423a565b03611ccd57505f8381526006860160205260408120600491611cc89190613f21565b611cd1565b5060055b6020808301515f90815260088801909152604081205581816005811115611cfa57611cfa61423a565b90816005811115611d0d57611d0d61423a565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611d4157611d4161423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e0c57611e0c61423a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206148c183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015611e9c575f80fd5b505af1158015611eae573d5f803e3d5ffd5b50505050505050565b5f805160206148c183398151915254611a96906001600160a01b031682846134ef565b60408051606080820183525f8083526020830181905292820152905f805160206149218339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f4f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7691908101906145db565b9150915080611fdd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b82548251146120405760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b0316156120b35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f83516036146120df5760405162461bcd60e51b815260040161043b9061470c565b5f805b600281101561212e576120f68160016146d2565b612101906008614572565b61ffff16868281518110612117576121176146e5565b016020015160f81c901b91909117906001016120e2565b5061ffff8116156121515760405162461bcd60e51b815260040161043b90614755565b5f805b60048110156121ac576121688160036146d2565b612173906008614572565b63ffffffff16876121858360026146f9565b81518110612195576121956146e5565b016020015160f81c901b9190911790600101612154565b5063ffffffff81166003146121d35760405162461bcd60e51b815260040161043b90614798565b5f805b6020811015612228576121ea81601f6146d2565b6121f5906008614572565b886122018360066146f9565b81518110612211576122116146e5565b016020015160f81c901b91909117906001016121d6565b505f805b6008811015612287576122408160076146d2565b61224b906008614572565b6001600160401b0316896122608360266146f9565b81518110612270576122706146e5565b016020015160f81c901b919091179060010161222c565b505f805b60088110156122e65761229f8160076146d2565b6122aa906008614572565b6001600160401b03168a6122bf83602e6146f9565b815181106122cf576122cf6146e5565b016020015160f81c901b919091179060010161228b565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206148e183398151915292919061233e90614289565b9050118015612370575060015f83815260038301602052604090205460ff16600481111561236e5761236e61423a565b145b611a965760405162461bcd60e51b815260206004820152603860248201525f8051602061490183398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061496183398151915260205260408082208151610100810190925280545f8051602061492183398151915293929190829060ff16600581111561241d5761241d61423a565b600581111561242e5761242e61423a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124b6576124b661423a565b146125125760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461258c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6125998160a0015161354e565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156125dd576125dd61423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126a9846126a38161160f565b5f6117aa565b5f85815260068501602052604090209091506126c5828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126f29085906004016143ed565b6020604051808303815f875af115801561270e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612732919061441f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206148e1833981519152816127a0846136ef565b90505f6127ac82610a0e565b83549091506001600160401b038216108015906127d657508260010154816001600160401b031611155b610de15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61283d613712565b5f80516020614921833981519152426001600160401b03851611801561287757506001600160401b038416612875426202a3006146f9565b115b6128d95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b856129305760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f8681526008820160205260409020541561299e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b8251603014612a055760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b612a0e8561354e565b5f80612a556040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613749565b5f82815260058601602052604090209193509150612a73828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612aa09085906004016143ed565b6020604051808303815f875af1158015612abc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ae0919061441f565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612b6257612b6261423a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612c238361160f565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610de160015f8051602061494183398151915255565b5f612c92613712565b5f612c9f6101c2846136ef565b90505f805160206148e18339815191525f612cb987611683565b9050600281516005811115612cd057612cd061423a565b14612d2f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612d4091906147df565b9050612d4c8882611762565b5f612d568961160f565b90505f898983604051602001612d9e9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612dbf8661354e565b5f612dcb8b84866117aa565b5f8381526004880160205260409020909150612de7828261430c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e149085906004016143ed565b6020604051808303815f875af1158015612e30573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e54919061441f565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612f0357612f0361423a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506110e060015f8051602061494183398151915255565b5f8082516027146130675760405162461bcd60e51b815260040161043b9061470c565b5f805b60028110156130b65761307e8160016146d2565b613089906008614572565b61ffff1685828151811061309f5761309f6146e5565b016020015160f81c901b919091179060010161306a565b5061ffff8116156130d95760405162461bcd60e51b815260040161043b90614755565b5f805b6004811015613134576130f08160036146d2565b6130fb906008614572565b63ffffffff168661310d8360026146f9565b8151811061311d5761311d6146e5565b016020015160f81c901b91909117906001016130dc565b5063ffffffff811660021461315b5760405162461bcd60e51b815260040161043b90614798565b5f805b60208110156131b05761317281601f6146d2565b61317d906008614572565b876131898360066146f9565b81518110613199576131996146e5565b016020015160f81c901b919091179060010161315e565b505f866026815181106131c5576131c56146e5565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132085760405162461bcd60e51b815260040161043b9061470c565b5f805b60028110156132575761321f8160016146d2565b61322a906008614572565b61ffff16858281518110613240576132406146e5565b016020015160f81c901b919091179060010161320b565b5061ffff81161561327a5760405162461bcd60e51b815260040161043b90614755565b5f805b60048110156132d5576132918160036146d2565b61329c906008614572565b63ffffffff16866132ae8360026146f9565b815181106132be576132be6146e5565b016020015160f81c901b919091179060010161327d565b5063ffffffff81166004146132fc5760405162461bcd60e51b815260040161043b90614798565b5f805b60208110156133515761331381601f6146d2565b61331e906008614572565b8761332a8360066146f9565b8151811061333a5761333a6146e5565b016020015160f81c901b91909117906001016132ff565b505f805b60088110156133b0576133698160076146d2565b613374906008614572565b6001600160401b0316886133898360266146f9565b81518110613399576133996146e5565b016020015160f81c901b9190911790600101613355565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661340657604051631afcd79f60e31b815260040160405180910390fd5b565b6134106133bd565b61341981613b01565b61344b6060820135608083013561343660c0850160a086016140d3565b61344660e0860160c087016147ff565b613b22565b50565b6134566133bd565b5f805160206148c18339815191526001600160a01b0382166134cf5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613b7d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149218339815191529060ff165f0361358c575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135d490836146d2565b106135f0576001600160401b038416604083015280825261360f565b838260400181815161360291906147df565b6001600160401b03169052505b5f826020015183604001516064613626919061481a565b6136309190614845565b600285015490915060ff90811690821611156136ab5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e825f805160206148c1833981519152546001600160a01b031690613bde565b5f8051602061494183398151915280546001190161374357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146137b35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561382a576137ea8160016146d2565b6137f5906008614572565b5081515f9083908390811061380c5761380c6146e5565b60200101906001600160f81b03191690815f1a9053506001016137d6565b505f5b6004811015613888576138418160036146d2565b61384c906008614572565b505f8261385a8360026146f9565b8151811061386a5761386a6146e5565b60200101906001600160f81b03191690815f1a90535060010161382d565b505f5b60208110156138e557845181602081106138a7576138a76146e5565b1a60f81b826138b78360066146f9565b815181106138c7576138c76146e5565b60200101906001600160f81b03191690815f1a90535060010161388b565b505f5b60208110156139455784602001518160208110613907576139076146e5565b1a60f81b826139178360266146f9565b81518110613927576139276146e5565b60200101906001600160f81b03191690815f1a9053506001016138e8565b505f5b60088110156139b95761395c8160076146d2565b613967906008614572565b60ff1685604001516001600160401b0316901c60f81b8282604661398b91906146f9565b8151811061399b5761399b6146e5565b60200101906001600160f81b03191690815f1a905350600101613948565b505f5b6030811015613a2457846080015181815181106139db576139db6146e5565b01602001516001600160f81b031916826139f683604e6146f9565b81518110613a0657613a066146e5565b60200101906001600160f81b03191690815f1a9053506001016139bc565b505f5b6008811015613a9657613a3b8160076146d2565b613a46906008614572565b60608601516001600160401b0390811691161c60f81b82613a6883607e6146f9565b81518110613a7857613a786146e5565b60200101906001600160f81b03191690815f1a905350600101613a27565b50600281604051613aa7919061486a565b602060405180830381855afa158015613ac2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613ae5919061441f565b94909350915050565b60015f8051602061494183398151915255565b613b096133bd565b613b11613d40565b613b19613d50565b61344b81613d58565b613b2a6133bd565b5f5f805160206148e1833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f613b916001600160a01b03841683613dc4565b905080515f14158015613bb5575080806020019051810190613bb39190614885565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613c24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c48919061441f565b9050613c5f6001600160a01b038516333086613dd1565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ca3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cc7919061441f565b9050818111613d2d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613d3782826146d2565b95945050505050565b613d486133bd565b613406613e0a565b6134066133bd565b613d606133bd565b80355f8051602061492183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613daa60608301604084016148a0565b600291909101805460ff191660ff90921691909117905550565b60606110e083835f613e12565b6040516001600160a01b038481166024830152838116604483015260648201839052610b189186918216906323b872dd9060840161351c565b613aee6133bd565b606081471015613e375760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613e52919061486a565b5f6040518083038185875af1925050503d805f8114613e8c576040519150601f19603f3d011682016040523d82523d5f602084013e613e91565b606091505b5091509150611605868383606082613eb157613eac82613ef8565b6110e0565b8151158015613ec857506001600160a01b0384163b155b15613ef157604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b50806110e0565b805115613f085780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613f2d90614289565b5f825580601f10613f3c575050565b601f0160209004905f5260205f209081019061344b9190613f9c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613fb0575f8155600101613f9d565b5090565b801515811461344b575f80fd5b803563ffffffff81168114613fd4575f80fd5b919050565b5f805f60608486031215613feb575f80fd5b833592506020840135613ffd81613fb4565b915061400b60408501613fc1565b90509250925092565b5f60208284031215614024575f80fd5b5035919050565b6001600160a01b038116811461344b575f80fd5b5f80828403610100811215614052575f80fd5b60e081121561405f575f80fd5b5082915060e08301356140718161402b565b809150509250929050565b5f6020828403121561408c575f80fd5b6110e082613fc1565b5f80604083850312156140a6575f80fd5b6140af83613fc1565b946020939093013593505050565b80356001600160401b0381168114613fd4575f80fd5b5f602082840312156140e3575f80fd5b6110e0826140bd565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614122576141226140ec565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614150576141506140ec565b604052919050565b5f6001600160401b03821115614170576141706140ec565b50601f01601f191660200190565b5f805f8060808587031215614191575f80fd5b84359350602085013592506141a8604086016140bd565b915060608501356001600160401b038111156141c2575f80fd5b8501601f810187136141d2575f80fd5b80356141e56141e082614158565b614128565b8181528860208385010111156141f9575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561422b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156142825761428261424e565b5092915050565b600181811c9082168061429d57607f821691505b6020821081036142bb57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156142e65750805b601f840160051c820191505b81811015614305575f81556001016142f2565b5050505050565b81516001600160401b03811115614325576143256140ec565b614339816143338454614289565b846142c1565b602080601f83116001811461436c575f84156143555750858301515b5f19600386901b1c1916600185901b1785556143c3565b5f85815260208120601f198616915b8281101561439a5788860151825594840194600190910190840161437b565b50858210156143b757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156143e55781810151838201526020016143cd565b50505f910152565b602081525f825180602084015261440b8160408501602087016143cb565b601f01601f19169190910160400192915050565b5f6020828403121561442f575f80fd5b5051919050565b5f60208083525f845461444881614289565b806020870152604060018084165f81146144695760018114614485576144b2565b60ff19851660408a0152604084151560051b8a010195506144b2565b895f5260205f205f5b858110156144a95781548b820186015290830190880161448e565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826144e2576144e26144c0565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e61424e565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613fd481613fb4565b5f80604083850312156145ec575f80fd5b82516001600160401b0380821115614602575f80fd5b9084019060608287031215614615575f80fd5b61461d614100565b825181526020808401516146308161402b565b82820152604084015183811115614645575f80fd5b80850194505087601f850112614659575f80fd5b835192506146696141e084614158565b838152888285870101111561467c575f80fd5b61468b848383018488016143cb565b806040840152508195506146a08188016145d0565b9450505050509250929050565b5f6001600160401b038083168181036146c8576146c861424e565b6001019392505050565b81810381811115610a1e57610a1e61424e565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e61424e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156142825761428261424e565b5f6020828403121561480f575f80fd5b81356110e08161402b565b6001600160401b0381811683821602808216919082811461483d5761483d61424e565b505092915050565b5f6001600160401b038084168061485e5761485e6144c0565b92169190910492915050565b5f825161487b8184602087016143cb565b9190910192915050565b5f60208284031215614895575f80fd5b81516110e081613fb4565b5f602082840312156148b0575f80fd5b813560ff811681146110e0575f80fdfe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614b72380380614b7283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614a258061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004614071565b6102d6565b005b6101286101383660046140ac565b6107ff565b61017b61014b3660046140ac565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c3660046140ac565b61095b565b6101286101af3660046140d7565b6109c8565b6101c76101c23660046140ac565b610aac565b6040516001600160401b039091168152602001610185565b6101286101ed366004614114565b610ac2565b61012861020036600461412d565b610b61565b61017b61021336600461416b565b610d52565b6101c76102263660046140ac565b610d6b565b6101286102393660046140ac565b610d7f565b61012861024c366004614071565b610dec565b61017b61025f366004614216565b610ed8565b61012861027236600461412d565b610efd565b61017b6102853660046142b2565b61115b565b610128610298366004614114565b61116e565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d13660046140ac565b61132b565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604080822060018101548251610100810190935281545f80516020614979833981519152949193919290829060ff16600481111561033e5761033e6142d2565b600481111561034f5761034f6142d2565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f85156103d5576103d283866113fa565b90505b60028401546060830151604051636588aa7f60e01b81526001600160401b03918216600482015290831660248201525f604482018190526064820152600160401b9091046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610447573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046b91906142e6565b5f888152600686016020526040902055600282516004811115610490576104906142d2565b146104e25760405162461bcd60e51b815260206004820152602a60248201525f805160206149998339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105475760405162461bcd60e51b815260206004820152603360248201525f805160206149998339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104d9565b5f61055184611696565b60038085526001600160401b0342811660a0870152821660e08601525f8a815290870160205260409020845181549293508592829060ff1916600183600481111561059e5761059e6142d2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106708561170a565b905083606001516001600160401b03168160a001516001600160401b0316116106e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104d9565b5f84606001518260a001516106fc9190614311565b905061070886826117e9565b5f610714878584611831565b5f8c815260058a016020526040902090915061073082826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061075d90859060040161449c565b6020604051808303815f875af1158015610779573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079d91906142e6565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206149b983398151915292919061084790614338565b9050118015610879575060035f83815260078301602052604090205460ff166005811115610877576108776142d2565b145b6108dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104d9565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161091691906004016144ce565b6020604051808303815f875af1158015610932573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095691906142e6565b505050565b61096481611a4e565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614979833981519152916005600160991b019163ee5b48eb91610916916004016144ce565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a11575080546001600160401b03808416911610155b15610a2f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5a8484611b21565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610abc64e8d4a510008361456c565b92915050565b5f610acc82611b3b565b6040808201516001600160a01b0381165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0760205291909120549192505f8051602061497983398151915291610b259190611ec8565b604080830180516001600160a01b03165f908152600784016020529182209190915560608301519051610956916001600160401b031690611f3e565b5f805160206149798339815191525f610b7984611f61565b90505f80610b8a8360400151612142565b5091509150610b988561237d565b5f8581526004850160205260408120610bb091613fb9565b5f610bba8361170a565b9050816001600160401b031681608001516001600160401b03161015610bf25760405162461bcd60e51b81526004016104d99061457f565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610c375760405162461bcd60e51b81526004016104d9906145c1565b60015f87815260038701602052604090205460ff166004811115610c5d57610c5d6142d2565b14610cc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104d9565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610abc6001600160401b03831664e8d4a5100061460a565b5f610d758261170a565b60a0015192915050565b610d888161237d565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614979833981519152916005600160991b019163ee5b48eb91610916916004016144ce565b5f8215610e0057610dfd84836113fa565b90505b5f610e0a85612456565b90505f5f80516020614979833981519152600281015460a0840151604051636588aa7f60e01b81526001600160401b03918216600482015290861660248201525f604482018190526064820152919250600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610e8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb391906142e6565b6040928301516001600160a01b03165f90815260079092016020529190205550505050565b5f80610ee386612819565b9050610ef1858286866128c6565b9150505b949350505050565b5f805160206149798339815191525f610f1584611f61565b90505f80610f268360400151612142565b5091509150610f3485611a4e565b5f8581526005850160205260408120610f4c91613fb9565b5f610f568361170a565b9050816001600160401b031681608001516001600160401b03161015610f8e5760405162461bcd60e51b81526004016104d99061457f565b5f8681526003808701602052604090912001546001600160401b0380841691161115610fcc5760405162461bcd60e51b81526004016104d9906145c1565b60035f87815260038701602052604090205460ff166004811115610ff257610ff26142d2565b146110465760405162461bcd60e51b815260206004820152603160248201525f805160206149998339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104d9565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526110ea9190611f3e565b61110b8160200151876006015f8a81526020019081526020015f2054611ec8565b5f878152600687016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f611167833384612d1b565b9392505050565b5f805160206149b98339815191525f61118683611f61565b90505f8061119783604001516130d6565b91509150806111f95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104d9565b5f8281526005850160205260408120805461121390614338565b9050118015611245575060015f83815260078601602052604090205460ff166005811115611243576112436142d2565b145b6112615760405162461bcd60e51b81526004016104d990614621565b5f828152600585016020526040812061127991613fb9565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149b983398151915292919061137390614338565b90501180156113a5575060015f83815260078301602052604090205460ff1660058111156113a3576113a36142d2565b145b6113c15760405162461bcd60e51b81526004016104d990614621565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161091691906004016144ce565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611445573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261146c9190810190614673565b91509150806114cf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104d9565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611512573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153691906142e6565b82511461159a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104d9565b60208201516001600160a01b0316156116105760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104d9565b5f8061161f8460400151613277565b9150915081871461168c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104d9565b9695505050505050565b5f8181525f805160206149f98339815191526020526040812060030180545f805160206149b9833981519152916001600160401b03909116908190846116db83614745565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611712613ff0565b5f8281525f805160206149f98339815191526020526040908190208151610100810190925280545f805160206149b9833981519152929190829060ff166005811115611760576117606142d2565b6005811115611771576117716142d2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206149f9833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118aa5761186a81600161476a565b61187590600861460a565b5081515f9083908390811061188c5761188c61477d565b60200101906001600160f81b03191690815f1a905350600101611856565b505f5b600481101561190d576118c181600361476a565b6118cc90600861460a565b6001901c60f81b826118df836002614791565b815181106118ef576118ef61477d565b60200101906001600160f81b03191690815f1a9053506001016118ad565b505f5b602081101561196f5761192481601f61476a565b61192f90600861460a565b86901c60f81b82611941836006614791565b815181106119515761195161477d565b60200101906001600160f81b03191690815f1a905350600101611910565b505f5b60088110156119da5761198681600761476a565b61199190600861460a565b6001600160401b038616901c60f81b826119ac836026614791565b815181106119bc576119bc61477d565b60200101906001600160f81b03191690815f1a905350600101611972565b505f5b6008811015611a45576119f181600761476a565b6119fc90600861460a565b6001600160401b038516901c60f81b82611a1783602e614791565b81518110611a2757611a2761477d565b60200101906001600160f81b03191690815f1a9053506001016119dd565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614979833981519152929190611a9690614338565b9050118015611ac8575060035f83815260038301602052604090205460ff166004811115611ac657611ac66142d2565b145b611b1d5760405162461bcd60e51b815260206004820152603360248201525f8051602061499983398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104d9565b5050565b611b2961344f565b611b328261349a565b611b1d816134e0565b611b43613ff0565b5f805160206149b98339815191525f611b5b84611f61565b90505f80611b6c83604001516130d6565b915091508015611bd15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104d9565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c0357611c036142d2565b6005811115611c1457611c146142d2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c9b57611c9b6142d2565b1480611cb95750600182516005811115611cb757611cb76142d2565b145b611d185760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104d9565b600382516005811115611d2d57611d2d6142d2565b03611d5457505f8381526006860160205260408120600491611d4f9190613fb9565b611d58565b5060055b6020808301515f90815260088801909152604081205581816005811115611d8157611d816142d2565b90816005811115611d9457611d946142d2565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611dc857611dc86142d2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e9357611e936142d2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061495983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015611f23575f80fd5b505af1158015611f35573d5f803e3d5ffd5b50505050505050565b5f8051602061495983398151915254611b1d906001600160a01b03168284613581565b60408051606080820183525f8083526020830181905292820152905f805160206149b98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fd6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ffd9190810190614673565b91509150806120645760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104d9565b82548251146120c75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104d9565b60208201516001600160a01b03161561213a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104d9565b509392505050565b5f805f83516036146121665760405162461bcd60e51b81526004016104d9906147a4565b5f805b60028110156121b55761217d81600161476a565b61218890600861460a565b61ffff1686828151811061219e5761219e61477d565b016020015160f81c901b9190911790600101612169565b5061ffff8116156121d85760405162461bcd60e51b81526004016104d9906147ed565b5f805b6004811015612233576121ef81600361476a565b6121fa90600861460a565b63ffffffff168761220c836002614791565b8151811061221c5761221c61477d565b016020015160f81c901b91909117906001016121db565b5063ffffffff811660031461225a5760405162461bcd60e51b81526004016104d990614830565b5f805b60208110156122af5761227181601f61476a565b61227c90600861460a565b88612288836006614791565b815181106122985761229861477d565b016020015160f81c901b919091179060010161225d565b505f805b600881101561230e576122c781600761476a565b6122d290600861460a565b6001600160401b0316896122e7836026614791565b815181106122f7576122f761477d565b016020015160f81c901b91909117906001016122b3565b505f805b600881101561236d5761232681600761476a565b61233190600861460a565b6001600160401b03168a61234683602e614791565b815181106123565761235661477d565b016020015160f81c901b9190911790600101612312565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206149798339815191529291906123c590614338565b90501180156123f7575060015f83815260038301602052604090205460ff1660048111156123f5576123f56142d2565b145b611b1d5760405162461bcd60e51b815260206004820152603860248201525f8051602061499983398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104d9565b61245e613ff0565b5f8281525f805160206149f983398151915260205260408082208151610100810190925280545f805160206149b983398151915293929190829060ff1660058111156124ac576124ac6142d2565b60058111156124bd576124bd6142d2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612545576125456142d2565b146125a15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104d9565b60408101516001600160a01b0316336001600160a01b03161461261b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104d9565b6126288160a001516135e0565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561266c5761266c6142d2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127388561273281611696565b5f611831565b5f868152600685016020526040902090915061275482826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061278190859060040161449c565b6020604051808303815f875af115801561279d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127c191906142e6565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f5f805160206149798339815191528161283284613781565b90505f61283e82610aac565b83549091506001600160401b0382161080159061286857508260010154816001600160401b031611155b610ef55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104d9565b5f6128cf6137a4565b5f805160206149b9833981519152426001600160401b03851611801561290957506001600160401b038416612907426202a300614791565b115b61296b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104d9565b856129c25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104d9565b5f86815260088201602052604090205415612a305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104d9565b8251603014612a975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104d9565b612aa0856135e0565b5f80612ae76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506137db565b5f82815260058601602052604090209193509150612b0582826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b3290859060040161449c565b6020604051808303815f875af1158015612b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7291906142e6565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612bf457612bf46142d2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612cb583611696565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610ef560015f805160206149d983398151915255565b5f612d246137a4565b5f612d316101c284613781565b90505f805160206149798339815191525f612d4b8761170a565b9050600281516005811115612d6257612d626142d2565b14612dc15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104d9565b5f838260a00151612dd29190614877565b9050612dde88826117e9565b5f612de889611696565b90505f898983604051602001612e309392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612e51866135e0565b5f612e5d8b8486611831565b5f8381526004880160205260409020909150612e7982826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ea690859060040161449c565b6020604051808303815f875af1158015612ec2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ee691906142e6565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612f9557612f956142d2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061116760015f805160206149d983398151915255565b5f8082516027146130f95760405162461bcd60e51b81526004016104d9906147a4565b5f805b60028110156131485761311081600161476a565b61311b90600861460a565b61ffff168582815181106131315761313161477d565b016020015160f81c901b91909117906001016130fc565b5061ffff81161561316b5760405162461bcd60e51b81526004016104d9906147ed565b5f805b60048110156131c65761318281600361476a565b61318d90600861460a565b63ffffffff168661319f836002614791565b815181106131af576131af61477d565b016020015160f81c901b919091179060010161316e565b5063ffffffff81166002146131ed5760405162461bcd60e51b81526004016104d990614830565b5f805b60208110156132425761320481601f61476a565b61320f90600861460a565b8761321b836006614791565b8151811061322b5761322b61477d565b016020015160f81c901b91909117906001016131f0565b505f866026815181106132575761325761477d565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461329a5760405162461bcd60e51b81526004016104d9906147a4565b5f805b60028110156132e9576132b181600161476a565b6132bc90600861460a565b61ffff168582815181106132d2576132d261477d565b016020015160f81c901b919091179060010161329d565b5061ffff81161561330c5760405162461bcd60e51b81526004016104d9906147ed565b5f805b60048110156133675761332381600361476a565b61332e90600861460a565b63ffffffff1686613340836002614791565b815181106133505761335061477d565b016020015160f81c901b919091179060010161330f565b5063ffffffff811660041461338e5760405162461bcd60e51b81526004016104d990614830565b5f805b60208110156133e3576133a581601f61476a565b6133b090600861460a565b876133bc836006614791565b815181106133cc576133cc61477d565b016020015160f81c901b9190911790600101613391565b505f805b6008811015613442576133fb81600761476a565b61340690600861460a565b6001600160401b03168861341b836026614791565b8151811061342b5761342b61477d565b016020015160f81c901b91909117906001016133e7565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661349857604051631afcd79f60e31b815260040160405180910390fd5b565b6134a261344f565b6134ab81613b93565b6134dd606082013560808301356134c860c0850160a0860161416b565b6134d860e0860160c08701614897565b613bb4565b50565b6134e861344f565b5f805160206149598339815191526001600160a01b0382166135615760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104d9565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261095691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613c0f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149b98339815191529060ff165f0361361e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613666908361476a565b10613682576001600160401b03841660408301528082526136a1565b83826040018181516136949190614877565b6001600160401b03169052505b5f8260200151836040015160646136b891906148b2565b6136c291906148dd565b600285015490915060ff908116908216111561373d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104d9565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610abc825f80516020614959833981519152546001600160a01b031690613c70565b5f805160206149d98339815191528054600119016137d557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146138455760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104d9565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156138bc5761387c81600161476a565b61388790600861460a565b5081515f9083908390811061389e5761389e61477d565b60200101906001600160f81b03191690815f1a905350600101613868565b505f5b600481101561391a576138d381600361476a565b6138de90600861460a565b505f826138ec836002614791565b815181106138fc576138fc61477d565b60200101906001600160f81b03191690815f1a9053506001016138bf565b505f5b602081101561397757845181602081106139395761393961477d565b1a60f81b82613949836006614791565b815181106139595761395961477d565b60200101906001600160f81b03191690815f1a90535060010161391d565b505f5b60208110156139d757846020015181602081106139995761399961477d565b1a60f81b826139a9836026614791565b815181106139b9576139b961477d565b60200101906001600160f81b03191690815f1a90535060010161397a565b505f5b6008811015613a4b576139ee81600761476a565b6139f990600861460a565b60ff1685604001516001600160401b0316901c60f81b82826046613a1d9190614791565b81518110613a2d57613a2d61477d565b60200101906001600160f81b03191690815f1a9053506001016139da565b505f5b6030811015613ab65784608001518181518110613a6d57613a6d61477d565b01602001516001600160f81b03191682613a8883604e614791565b81518110613a9857613a9861477d565b60200101906001600160f81b03191690815f1a905350600101613a4e565b505f5b6008811015613b2857613acd81600761476a565b613ad890600861460a565b60608601516001600160401b0390811691161c60f81b82613afa83607e614791565b81518110613b0a57613b0a61477d565b60200101906001600160f81b03191690815f1a905350600101613ab9565b50600281604051613b399190614902565b602060405180830381855afa158015613b54573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613b7791906142e6565b94909350915050565b60015f805160206149d983398151915255565b613b9b61344f565b613ba3613dd2565b613bab613de2565b6134dd81613dea565b613bbc61344f565b5f5f80516020614979833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f613c236001600160a01b03841683613e56565b905080515f14158015613c47575080806020019051810190613c45919061491d565b155b1561095657604051635274afe760e01b81526001600160a01b03841660048201526024016104d9565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613cb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cda91906142e6565b9050613cf16001600160a01b038516333086613e63565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613d35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d5991906142e6565b9050818111613dbf5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104d9565b613dc9828261476a565b95945050505050565b613dda61344f565b613498613ea2565b61349861344f565b613df261344f565b80355f805160206149b983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e3c6060830160408401614938565b600291909101805460ff191660ff90921691909117905550565b606061116783835f613eaa565b6040516001600160a01b038481166024830152838116604483015260648201839052613e9c9186918216906323b872dd906084016135ae565b50505050565b613b8061344f565b606081471015613ecf5760405163cd78605960e01b81523060048201526024016104d9565b5f80856001600160a01b03168486604051613eea9190614902565b5f6040518083038185875af1925050503d805f8114613f24576040519150601f19603f3d011682016040523d82523d5f602084013e613f29565b606091505b509150915061168c868383606082613f4957613f4482613f90565b611167565b8151158015613f6057506001600160a01b0384163b155b15613f8957604051639996b31560e01b81526001600160a01b03851660048201526024016104d9565b5080611167565b805115613fa05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613fc590614338565b5f825580601f10613fd4575050565b601f0160209004905f5260205f20908101906134dd9190614034565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614048575f8155600101614035565b5090565b80151581146134dd575f80fd5b803563ffffffff8116811461406c575f80fd5b919050565b5f805f60608486031215614083575f80fd5b8335925060208401356140958161404c565b91506140a360408501614059565b90509250925092565b5f602082840312156140bc575f80fd5b5035919050565b6001600160a01b03811681146134dd575f80fd5b5f808284036101008112156140ea575f80fd5b60e08112156140f7575f80fd5b5082915060e0830135614109816140c3565b809150509250929050565b5f60208284031215614124575f80fd5b61116782614059565b5f806040838503121561413e575f80fd5b61414783614059565b946020939093013593505050565b80356001600160401b038116811461406c575f80fd5b5f6020828403121561417b575f80fd5b61116782614155565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156141ba576141ba614184565b60405290565b604051601f8201601f191681016001600160401b03811182821017156141e8576141e8614184565b604052919050565b5f6001600160401b0382111561420857614208614184565b50601f01601f191660200190565b5f805f8060808587031215614229575f80fd5b843593506020850135925061424060408601614155565b915060608501356001600160401b0381111561425a575f80fd5b8501601f8101871361426a575f80fd5b803561427d614278826141f0565b6141c0565b818152886020838501011115614291575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156142c3575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b5f602082840312156142f6575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614331576143316142fd565b5092915050565b600181811c9082168061434c57607f821691505b60208210810361436a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561095657805f5260205f20601f840160051c810160208510156143955750805b601f840160051c820191505b818110156143b4575f81556001016143a1565b5050505050565b81516001600160401b038111156143d4576143d4614184565b6143e8816143e28454614338565b84614370565b602080601f83116001811461441b575f84156144045750858301515b5f19600386901b1c1916600185901b178555614472565b5f85815260208120601f198616915b828110156144495788860151825594840194600190910190840161442a565b508582101561446657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561449457818101518382015260200161447c565b50505f910152565b602081525f82518060208401526144ba81604085016020870161447a565b601f01601f19169190910160400192915050565b5f60208083525f84546144e081614338565b806020870152604060018084165f8114614501576001811461451d5761454a565b60ff19851660408a0152604084151560051b8a0101955061454a565b895f5260205f205f5b858110156145415781548b8201860152908301908801614526565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261457a5761457a614558565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610abc57610abc6142fd565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b805161406c8161404c565b5f8060408385031215614684575f80fd5b82516001600160401b038082111561469a575f80fd5b90840190606082870312156146ad575f80fd5b6146b5614198565b825181526020808401516146c8816140c3565b828201526040840151838111156146dd575f80fd5b80850194505087601f8501126146f1575f80fd5b83519250614701614278846141f0565b8381528882858701011115614714575f80fd5b6147238483830184880161447a565b80604084015250819550614738818801614668565b9450505050509250929050565b5f6001600160401b03808316818103614760576147606142fd565b6001019392505050565b81810381811115610abc57610abc6142fd565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610abc57610abc6142fd565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115614331576143316142fd565b5f602082840312156148a7575f80fd5b8135611167816140c3565b6001600160401b038181168382160280821691908281146148d5576148d56142fd565b505092915050565b5f6001600160401b03808416806148f6576148f6614558565b92169190910492915050565b5f825161491381846020870161447a565b9190910192915050565b5f6020828403121561492d575f80fd5b81516111678161404c565b5f60208284031215614948575f80fd5b813560ff81168114611167575f80fdfe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go index 75980496a..a464de3c8 100644 --- a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go +++ b/abi-bindings/go/staking/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\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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: "0x60a0604052348015600e575f80fd5b5060405161029d38038061029d833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b60805161021a6100835f395f81816079015260d3015261021a5ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780639d4ba9db14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f36600461014b565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6103e86301e133806100c787876101a9565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168961010791906101d1565b61011191906101d1565b61011b91906101ee565b61012591906101ee565b9695505050505050565b803567ffffffffffffffff81168114610146575f80fd5b919050565b5f805f805f60a0868803121561015f575f80fd5b8535945061016f6020870161012f565b935061017d6040870161012f565b94979396509394606081013594506080013592915050565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156101ca576101ca610195565b5092915050565b80820281158282048414176101e8576101e8610195565b92915050565b5f8261020857634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", + 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\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"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: "0x60a0604052348015600e575f80fd5b50604051610243380380610243833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516101c06100835f395f81816079015260ca01526101c05ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780636588aa7f14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f366004610125565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6103e86301e133808567ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16886100fe919061016b565b610108919061016b565b6101129190610194565b61011c9190610194565b95945050505050565b5f805f8060808587031215610138575f80fd5b84359350602085013567ffffffffffffffff81168114610156575f80fd5b93969395505050506040820135916060013590565b808202811582820484141761018e57634e487b7160e01b5f52601160045260245ffd5b92915050565b5f826101ae57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", } // ExampleRewardCalculatorABI is the input ABI used to generate the binding from. @@ -233,12 +233,12 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINY return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) } -// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// CalculateReward is a free data retrieval call binding the contract method 0x6588aa7f. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { +// Solidity: function calculateReward(uint256 stakeAmount, uint64 uptime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, uptime uint64, arg2 *big.Int, arg3 *big.Int) (*big.Int, error) { var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, startTime, endTime, arg3, arg4) + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, uptime, arg2, arg3) if err != nil { return *new(*big.Int), err @@ -250,18 +250,18 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(o } -// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// CalculateReward is a free data retrieval call binding the contract method 0x6588aa7f. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 uptime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, uptime uint64, arg2 *big.Int, arg3 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, uptime, arg2, arg3) } -// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// CalculateReward is a free data retrieval call binding the contract method 0x6588aa7f. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 uptime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, uptime uint64, arg2 *big.Int, arg3 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, uptime, arg2, arg3) } // RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 24b9a52d7..aa09a95c3 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161469838038061469883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61454b8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613c04565b610389565b005b348015610134575f80fd5b50610127610143366004613c3f565b61046b565b348015610153575f80fd5b50610127610162366004613c7a565b6108f6565b348015610172575f80fd5b506101b1610181366004613c7a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613c7a565b610a52565b3480156101ee575f80fd5b506102026101fd366004613c7a565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613c91565b610ad5565b348015610244575f80fd5b50610127610253366004613caa565b610bc1565b348015610263575f80fd5b506101b1610272366004613ce8565b610db2565b348015610282575f80fd5b50610202610291366004613c7a565b610dcb565b3480156102a1575f80fd5b506101276102b0366004613c7a565b610ddf565b3480156102c0575f80fd5b506101276102cf366004613c3f565b610e4c565b3480156102df575f80fd5b506101276102ee366004613caa565b610e67565b3480156102fe575f80fd5b5061012761030d366004613c91565b611144565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613c7a565b611301565b6101b1610371366004613c7a565b6113d0565b6101b1610384366004613d93565b6113dc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611400565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061449f8339815191529184156104bd576104ba8285611414565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613e25565b600481111561050057610500613e25565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613e25565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206144bf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206144bf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f610648846116b0565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613e25565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076785611724565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613e4d565b90506107ff8682611803565b5f61080b87858461184b565b5f8c815260058a01602052604090209091506108278282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613fd2565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190614004565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206144df83398151915292919061093e90613e74565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613e25565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d919060040161401b565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190614004565b505050565b610a5b81611a68565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061449f833981519152916005600160991b019163ee5b48eb91610a0d9160040161401b565b5f610acf64e8d4a51000836140b9565b92915050565b5f610adf82611b3b565b90505f5f8051602061449f833981519152600281015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f6064820181905260848201819052929350600160401b9091046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610b7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b9e9190614004565b9050610bbb83606001516001600160401b03168460400151611ec8565b50505050565b5f8051602061449f8339815191525f610bd984611edb565b90505f80610bea83604001516120bc565b5091509150610bf8856122f7565b5f8581526004850160205260408120610c1091613b71565b5f610c1a83611724565b9050816001600160401b031681608001516001600160401b03161015610c525760405162461bcd60e51b81526004016105d0906140cc565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610c975760405162461bcd60e51b81526004016105d09061410e565b60015f87815260038701602052604090205460ff166004811115610cbd57610cbd613e25565b14610d265760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000614157565b5f610dd582611724565b60a0015192915050565b610de8816122f7565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061449f833981519152916005600160991b019163ee5b48eb91610a0d9160040161401b565b8115610e5e57610e5c8382611414565b505b610a4d836123d0565b5f8051602061449f8339815191525f610e7f84611edb565b90505f80610e9083604001516120bc565b5091509150610e9e85611a68565b5f8581526005850160205260408120610eb691613b71565b5f610ec083611724565b9050816001600160401b031681608001516001600160401b03161015610ef85760405162461bcd60e51b81526004016105d0906140cc565b5f8681526003808701602052604090912001546001600160401b0380841691161115610f365760405162461bcd60e51b81526004016105d09061410e565b60035f87815260038701602052604090205460ff166004811115610f5c57610f5c613e25565b14610fb05760405162461bcd60e51b815260206004820152603160248201525f805160206144bf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526110549190611ec8565b60028601546060820151608083015160a0840151604051639d4ba9db60e01b81526001600160401b03938416600482015291831660248301529190911660448201525f606482018190526084820181905291600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa1580156110db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ff9190614004565b9050836001600160401b031685897f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050505050565b5f805160206144df8339815191525f61115c83611edb565b90505f8061116d8360400151612788565b91509150806111cf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f828152600585016020526040812080546111e990613e74565b905011801561121b575060015f83815260078601602052604090205460ff16600581111561121957611219613e25565b145b6112375760405162461bcd60e51b81526004016105d09061416e565b5f828152600585016020526040812061124f91613b71565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206144df83398151915292919061134990613e74565b905011801561137b575060015f83815260078301602052604090205460ff16600581111561137957611379613e25565b145b6113975760405162461bcd60e51b81526004016105d09061416e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d919060040161401b565b5f610acf823334612929565b5f806113e734612ce1565b90506113f585828686612d8b565b9150505b9392505050565b6114086131e0565b6114118161322b565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561145f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261148691908101906141d4565b91509150806114e95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561152c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115509190614004565b8251146115b45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b03161561162a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f80611639846040015161326e565b915091508187146116a65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f8051602061451f8339815191526020526040812060030180545f805160206144df833981519152916001600160401b03909116908190846116f5836142a6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61172c613ba8565b5f8281525f8051602061451f8339815191526020526040908190208151610100810190925280545f805160206144df833981519152929190829060ff16600581111561177a5761177a613e25565b600581111561178b5761178b613e25565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061451f833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118c4576118848160016142cb565b61188f906008614157565b5081515f908390839081106118a6576118a66142de565b60200101906001600160f81b03191690815f1a905350600101611870565b505f5b6004811015611927576118db8160036142cb565b6118e6906008614157565b6001901c60f81b826118f98360026142f2565b81518110611909576119096142de565b60200101906001600160f81b03191690815f1a9053506001016118c7565b505f5b60208110156119895761193e81601f6142cb565b611949906008614157565b86901c60f81b8261195b8360066142f2565b8151811061196b5761196b6142de565b60200101906001600160f81b03191690815f1a90535060010161192a565b505f5b60088110156119f4576119a08160076142cb565b6119ab906008614157565b6001600160401b038616901c60f81b826119c68360266142f2565b815181106119d6576119d66142de565b60200101906001600160f81b03191690815f1a90535060010161198c565b505f5b6008811015611a5f57611a0b8160076142cb565b611a16906008614157565b6001600160401b038516901c60f81b82611a3183602e6142f2565b81518110611a4157611a416142de565b60200101906001600160f81b03191690815f1a9053506001016119f7565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061449f833981519152929190611ab090613e74565b9050118015611ae2575060035f83815260038301602052604090205460ff166004811115611ae057611ae0613e25565b145b611b375760405162461bcd60e51b815260206004820152603360248201525f805160206144bf83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b5050565b611b43613ba8565b5f805160206144df8339815191525f611b5b84611edb565b90505f80611b6c8360400151612788565b915091508015611bd15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c0357611c03613e25565b6005811115611c1457611c14613e25565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c9b57611c9b613e25565b1480611cb95750600182516005811115611cb757611cb7613e25565b145b611d185760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611d2d57611d2d613e25565b03611d5457505f8381526006860160205260408120600491611d4f9190613b71565b611d58565b5060055b6020808301515f90815260088801909152604081205581816005811115611d8157611d81613e25565b90816005811115611d9457611d94613e25565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611dc857611dc8613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e9357611e93613e25565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b611b376001600160a01b03821683613446565b60408051606080820183525f8083526020830181905292820152905f805160206144df8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7791908101906141d4565b9150915080611fde5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b82548251146120415760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b0316156120b45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f83516036146120e05760405162461bcd60e51b81526004016105d090614305565b5f805b600281101561212f576120f78160016142cb565b612102906008614157565b61ffff16868281518110612118576121186142de565b016020015160f81c901b91909117906001016120e3565b5061ffff8116156121525760405162461bcd60e51b81526004016105d09061434e565b5f805b60048110156121ad576121698160036142cb565b612174906008614157565b63ffffffff16876121868360026142f2565b81518110612196576121966142de565b016020015160f81c901b9190911790600101612155565b5063ffffffff81166003146121d45760405162461bcd60e51b81526004016105d090614391565b5f805b6020811015612229576121eb81601f6142cb565b6121f6906008614157565b886122028360066142f2565b81518110612212576122126142de565b016020015160f81c901b91909117906001016121d7565b505f805b6008811015612288576122418160076142cb565b61224c906008614157565b6001600160401b0316896122618360266142f2565b81518110612271576122716142de565b016020015160f81c901b919091179060010161222d565b505f805b60088110156122e7576122a08160076142cb565b6122ab906008614157565b6001600160401b03168a6122c083602e6142f2565b815181106122d0576122d06142de565b016020015160f81c901b919091179060010161228c565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061449f83398151915292919061233f90613e74565b9050118015612371575060015f83815260038301602052604090205460ff16600481111561236f5761236f613e25565b145b611b375760405162461bcd60e51b815260206004820152603860248201525f805160206144bf83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061451f83398151915260205260408082208151610100810190925280545f805160206144df83398151915293929190829060ff16600581111561241e5761241e613e25565b600581111561242f5761242f613e25565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124b7576124b7613e25565b146125135760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461258d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b61259a8160a001516134d9565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156125de576125de613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126aa846126a4816116b0565b5f61184b565b5f85815260068501602052604090209091506126c68282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126f3908590600401613fd2565b6020604051808303815f875af115801561270f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127339190614004565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146127ab5760405162461bcd60e51b81526004016105d090614305565b5f805b60028110156127fa576127c28160016142cb565b6127cd906008614157565b61ffff168582815181106127e3576127e36142de565b016020015160f81c901b91909117906001016127ae565b5061ffff81161561281d5760405162461bcd60e51b81526004016105d09061434e565b5f805b6004811015612878576128348160036142cb565b61283f906008614157565b63ffffffff16866128518360026142f2565b81518110612861576128616142de565b016020015160f81c901b9190911790600101612820565b5063ffffffff811660021461289f5760405162461bcd60e51b81526004016105d090614391565b5f805b60208110156128f4576128b681601f6142cb565b6128c1906008614157565b876128cd8360066142f2565b815181106128dd576128dd6142de565b016020015160f81c901b91909117906001016128a2565b505f86602681518110612909576129096142de565b016020015191976001600160f81b03199092161515965090945050505050565b5f61293261367a565b5f61293c83610abf565b90505f8051602061449f8339815191525f61295687611724565b905060028151600581111561296d5761296d613e25565b146129cc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516129dd91906143d8565b90506129e98882611803565b5f6129f3896116b0565b90505f898983604051602001612a3b9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612a5c866134d9565b5f612a688b848661184b565b5f8381526004880160205260409020909150612a848282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ab1908590600401613fd2565b6020604051808303815f875af1158015612acd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af19190614004565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612ba057612ba0613e25565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506113f960015f805160206144ff83398151915255565b5f5f8051602061449f8339815191528282612cfb82610abf565b83549091506001600160401b03821610801590612d2557508260010154816001600160401b031611155b612d835760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612d9461367a565b5f805160206144df833981519152426001600160401b038516118015612dce57506001600160401b038416612dcc426202a3006142f2565b115b612e305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612e875760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612ef55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612f5c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612f65856134d9565b5f80612fac6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506136c4565b5f82815260058601602052604090209193509150612fca8282613ef1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ff7908590600401613fd2565b6020604051808303815f875af1158015613013573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130379190614004565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff191660018360058111156130b9576130b9613e25565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561317a836116b0565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612d8360015f805160206144ff83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661322957604051631afcd79f60e31b815260040160405180910390fd5b565b6132336131e0565b61323c81613a69565b6114116060820135608083013561325960c0850160a08601613ce8565b61326960e0860160c087016143f8565b613a8a565b5f808251602e146132915760405162461bcd60e51b81526004016105d090614305565b5f805b60028110156132e0576132a88160016142cb565b6132b3906008614157565b61ffff168582815181106132c9576132c96142de565b016020015160f81c901b9190911790600101613294565b5061ffff8116156133035760405162461bcd60e51b81526004016105d09061434e565b5f805b600481101561335e5761331a8160036142cb565b613325906008614157565b63ffffffff16866133378360026142f2565b81518110613347576133476142de565b016020015160f81c901b9190911790600101613306565b5063ffffffff81166004146133855760405162461bcd60e51b81526004016105d090614391565b5f805b60208110156133da5761339c81601f6142cb565b6133a7906008614157565b876133b38360066142f2565b815181106133c3576133c36142de565b016020015160f81c901b9190911790600101613388565b505f805b6008811015613439576133f28160076142cb565b6133fd906008614157565b6001600160401b0316886134128360266142f2565b81518110613422576134226142de565b016020015160f81c901b91909117906001016133de565b5090969095509350505050565b804710156134695760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146134b2576040519150601f19603f3d011682016040523d82523d5f602084013e6134b7565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206144df8339815191529060ff165f03613517575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061355f90836142cb565b1061357b576001600160401b038416604083015280825261359a565b838260400181815161358d91906143d8565b6001600160401b03169052505b5f8260200151836040015160646135b19190614413565b6135bb919061443e565b600285015490915060ff90811690821611156136365760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f805160206144ff8339815191528054600119016136ab57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206144ff83398151915255565b5f606082608001515160301461372e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137a5576137658160016142cb565b613770906008614157565b5081515f90839083908110613787576137876142de565b60200101906001600160f81b03191690815f1a905350600101613751565b505f5b6004811015613803576137bc8160036142cb565b6137c7906008614157565b505f826137d58360026142f2565b815181106137e5576137e56142de565b60200101906001600160f81b03191690815f1a9053506001016137a8565b505f5b60208110156138605784518160208110613822576138226142de565b1a60f81b826138328360066142f2565b81518110613842576138426142de565b60200101906001600160f81b03191690815f1a905350600101613806565b505f5b60208110156138c05784602001518160208110613882576138826142de565b1a60f81b826138928360266142f2565b815181106138a2576138a26142de565b60200101906001600160f81b03191690815f1a905350600101613863565b505f5b6008811015613934576138d78160076142cb565b6138e2906008614157565b60ff1685604001516001600160401b0316901c60f81b8282604661390691906142f2565b81518110613916576139166142de565b60200101906001600160f81b03191690815f1a9053506001016138c3565b505f5b603081101561399f5784608001518181518110613956576139566142de565b01602001516001600160f81b0319168261397183604e6142f2565b81518110613981576139816142de565b60200101906001600160f81b03191690815f1a905350600101613937565b505f5b6008811015613a11576139b68160076142cb565b6139c1906008614157565b60608601516001600160401b0390811691161c60f81b826139e383607e6142f2565b815181106139f3576139f36142de565b60200101906001600160f81b03191690815f1a9053506001016139a2565b50600281604051613a229190614463565b602060405180830381855afa158015613a3d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a609190614004565b94909350915050565b613a716131e0565b613a79613ae5565b613a81613af5565b61141181613afd565b613a926131e0565b5f5f8051602061449f833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613aed6131e0565b613229613b69565b6132296131e0565b613b056131e0565b80355f805160206144df83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613b4f606083016040840161447e565b600291909101805460ff191660ff90921691909117905550565b6136b16131e0565b508054613b7d90613e74565b5f825580601f10613b8c575050565b601f0160209004905f5260205f20908101906114119190613bec565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c00575f8155600101613bed565b5090565b5f60e08284031215613c14575f80fd5b50919050565b8015158114611411575f80fd5b803563ffffffff81168114613c3a575f80fd5b919050565b5f805f60608486031215613c51575f80fd5b833592506020840135613c6381613c1a565b9150613c7160408501613c27565b90509250925092565b5f60208284031215613c8a575f80fd5b5035919050565b5f60208284031215613ca1575f80fd5b6113f982613c27565b5f8060408385031215613cbb575f80fd5b613cc483613c27565b946020939093013593505050565b80356001600160401b0381168114613c3a575f80fd5b5f60208284031215613cf8575f80fd5b6113f982613cd2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d3757613d37613d01565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613d6557613d65613d01565b604052919050565b5f6001600160401b03821115613d8557613d85613d01565b50601f01601f191660200190565b5f805f60608486031215613da5575f80fd5b83359250613db560208501613cd2565b915060408401356001600160401b03811115613dcf575f80fd5b8401601f81018613613ddf575f80fd5b8035613df2613ded82613d6d565b613d3d565b818152876020838501011115613e06575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613e6d57613e6d613e39565b5092915050565b600181811c90821680613e8857607f821691505b602082108103613c1457634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613ecb5750805b601f840160051c820191505b81811015613eea575f8155600101613ed7565b5050505050565b81516001600160401b03811115613f0a57613f0a613d01565b613f1e81613f188454613e74565b84613ea6565b602080601f831160018114613f51575f8415613f3a5750858301515b5f19600386901b1c1916600185901b178555613fa8565b5f85815260208120601f198616915b82811015613f7f57888601518255948401946001909101908401613f60565b5085821015613f9c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613fca578181015183820152602001613fb2565b50505f910152565b602081525f8251806020840152613ff0816040850160208701613fb0565b601f01601f19169190910160400192915050565b5f60208284031215614014575f80fd5b5051919050565b5f60208083525f845461402d81613e74565b806020870152604060018084165f811461404e576001811461406a57614097565b60ff19851660408a0152604084151560051b8a01019550614097565b895f5260205f205f5b8581101561408e5781548b8201860152908301908801614073565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826140c7576140c76140a5565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613e39565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611411575f80fd5b8051613c3a81613c1a565b5f80604083850312156141e5575f80fd5b82516001600160401b03808211156141fb575f80fd5b908401906060828703121561420e575f80fd5b614216613d15565b82518152602080840151614229816141b5565b8282015260408401518381111561423e575f80fd5b80850194505087601f850112614252575f80fd5b83519250614262613ded84613d6d565b8381528882858701011115614275575f80fd5b61428484838301848801613fb0565b806040840152508195506142998188016141c9565b9450505050509250929050565b5f6001600160401b038083168181036142c1576142c1613e39565b6001019392505050565b81810381811115610acf57610acf613e39565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613e39565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613e6d57613e6d613e39565b5f60208284031215614408575f80fd5b81356113f9816141b5565b6001600160401b0381811683821602808216919082811461443657614436613e39565b505092915050565b5f6001600160401b0380841680614457576144576140a5565b92169190910492915050565b5f8251614474818460208701613fb0565b9190910192915050565b5f6020828403121561448e575f80fd5b813560ff811681146113f9575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161470438038061470483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145b78061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613c70565b610389565b005b348015610134575f80fd5b50610127610143366004613cab565b61046b565b348015610153575f80fd5b50610127610162366004613ce6565b610994565b348015610172575f80fd5b506101b1610181366004613ce6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613ce6565b610af0565b3480156101ee575f80fd5b506102026101fd366004613ce6565b610b5d565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613cfd565b610b73565b348015610244575f80fd5b50610127610253366004613d16565b610bf1565b348015610263575f80fd5b506101b1610272366004613d54565b610de2565b348015610282575f80fd5b50610202610291366004613ce6565b610dfb565b3480156102a1575f80fd5b506101276102b0366004613ce6565b610e0f565b3480156102c0575f80fd5b506101276102cf366004613cab565b610e7c565b3480156102df575f80fd5b506101276102ee366004613d16565b610f68565b3480156102fe575f80fd5b5061012761030d366004613cfd565b6111a5565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613ce6565b611362565b6101b1610371366004613ce6565b611431565b6101b1610384366004613dff565b61143d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611461565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604080822060018101548251610100810190935281545f8051602061450b833981519152949193919290829060ff1660048111156104d3576104d3613e91565b60048111156104e4576104e4613e91565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f851561056a576105678386611475565b90505b60028401546060830151604051636588aa7f60e01b81526001600160401b03918216600482015290831660248201525f604482018190526064820152600160401b9091046001600160a01b031690636588aa7f90608401602060405180830381865afa1580156105dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106009190613ea5565b5f88815260068601602052604090205560028251600481111561062557610625613e91565b146106775760405162461bcd60e51b815260206004820152602a60248201525f8051602061452b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106dc5760405162461bcd60e51b815260206004820152603360248201525f8051602061452b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161066e565b5f6106e684611711565b60038085526001600160401b0342811660a0870152821660e08601525f8a815290870160205260409020845181549293508592829060ff1916600183600481111561073357610733613e91565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61080585611785565b905083606001516001600160401b03168160a001516001600160401b03161161087c5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161066e565b5f84606001518260a001516108919190613ed0565b905061089d8682611864565b5f6108a98785846118ac565b5f8c815260058a01602052604090209091506108c58282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906108f2908590600401614055565b6020604051808303815f875af115801561090e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109329190613ea5565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061454b8339815191529291906109dc90613ef7565b9050118015610a0e575060035f83815260078301602052604090205460ff166005811115610a0c57610a0c613e91565b145b610a725760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161066e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aab9190600401614087565b6020604051808303815f875af1158015610ac7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aeb9190613ea5565b505050565b610af981611ac9565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061450b833981519152916005600160991b019163ee5b48eb91610aab91600401614087565b5f610b6d64e8d4a5100083614125565b92915050565b5f610b7d82611b9c565b604080820180516001600160a01b039081165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020528251909116815291822091909155606082015190519192505f8051602061450b83398151915291610aeb916001600160401b031690611f29565b5f8051602061450b8339815191525f610c0984611f3c565b90505f80610c1a836040015161211d565b5091509150610c2885612358565b5f8581526004850160205260408120610c4091613bdd565b5f610c4a83611785565b9050816001600160401b031681608001516001600160401b03161015610c825760405162461bcd60e51b815260040161066e90614138565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610cc75760405162461bcd60e51b815260040161066e9061417a565b60015f87815260038701602052604090205460ff166004811115610ced57610ced613e91565b14610d565760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161066e565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610b6d6001600160401b03831664e8d4a510006141c3565b5f610e0582611785565b60a0015192915050565b610e1881612358565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061450b833981519152916005600160991b019163ee5b48eb91610aab91600401614087565b5f8215610e9057610e8d8483611475565b90505b5f610e9a85612431565b90505f5f8051602061450b833981519152600281015460a0840151604051636588aa7f60e01b81526001600160401b03918216600482015290861660248201525f604482018190526064820152919250600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610f1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f439190613ea5565b6040928301516001600160a01b03165f90815260079092016020529190205550505050565b5f8051602061450b8339815191525f610f8084611f3c565b90505f80610f91836040015161211d565b5091509150610f9f85611ac9565b5f8581526005850160205260408120610fb791613bdd565b5f610fc183611785565b9050816001600160401b031681608001516001600160401b03161015610ff95760405162461bcd60e51b815260040161066e90614138565b5f8681526003808701602052604090912001546001600160401b03808416911611156110375760405162461bcd60e51b815260040161066e9061417a565b60035f87815260038701602052604090205460ff16600481111561105d5761105d613e91565b146110b15760405162461bcd60e51b815260206004820152603160248201525f8051602061452b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161066e565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526111559190611f29565b5f878152600687016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f8051602061454b8339815191525f6111bd83611f3c565b90505f806111ce83604001516127f4565b91509150806112305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161066e565b5f8281526005850160205260408120805461124a90613ef7565b905011801561127c575060015f83815260078601602052604090205460ff16600581111561127a5761127a613e91565b145b6112985760405162461bcd60e51b815260040161066e906141da565b5f82815260058501602052604081206112b091613bdd565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061454b8339815191529291906113aa90613ef7565b90501180156113dc575060015f83815260078301602052604090205460ff1660058111156113da576113da613e91565b145b6113f85760405162461bcd60e51b815260040161066e906141da565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aab9190600401614087565b5f610b6d823334612995565b5f8061144834612d4d565b905061145685828686612df7565b9150505b9392505050565b61146961324c565b61147281613297565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114c0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114e79190810190614240565b915091508061154a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161066e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561158d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b19190613ea5565b8251146116155760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161066e565b60208201516001600160a01b03161561168b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161066e565b5f8061169a84604001516132da565b915091508187146117075760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161066e565b9695505050505050565b5f8181525f8051602061458b8339815191526020526040812060030180545f8051602061454b833981519152916001600160401b039091169081908461175683614312565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61178d613c14565b5f8281525f8051602061458b8339815191526020526040908190208151610100810190925280545f8051602061454b833981519152929190829060ff1660058111156117db576117db613e91565b60058111156117ec576117ec613e91565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061458b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611925576118e5816001614337565b6118f09060086141c3565b5081515f908390839081106119075761190761434a565b60200101906001600160f81b03191690815f1a9053506001016118d1565b505f5b60048110156119885761193c816003614337565b6119479060086141c3565b6001901c60f81b8261195a83600261435e565b8151811061196a5761196a61434a565b60200101906001600160f81b03191690815f1a905350600101611928565b505f5b60208110156119ea5761199f81601f614337565b6119aa9060086141c3565b86901c60f81b826119bc83600661435e565b815181106119cc576119cc61434a565b60200101906001600160f81b03191690815f1a90535060010161198b565b505f5b6008811015611a5557611a01816007614337565b611a0c9060086141c3565b6001600160401b038616901c60f81b82611a2783602661435e565b81518110611a3757611a3761434a565b60200101906001600160f81b03191690815f1a9053506001016119ed565b505f5b6008811015611ac057611a6c816007614337565b611a779060086141c3565b6001600160401b038516901c60f81b82611a9283602e61435e565b81518110611aa257611aa261434a565b60200101906001600160f81b03191690815f1a905350600101611a58565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061450b833981519152929190611b1190613ef7565b9050118015611b43575060035f83815260038301602052604090205460ff166004811115611b4157611b41613e91565b145b611b985760405162461bcd60e51b815260206004820152603360248201525f8051602061452b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161066e565b5050565b611ba4613c14565b5f8051602061454b8339815191525f611bbc84611f3c565b90505f80611bcd83604001516127f4565b915091508015611c325760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161066e565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c6457611c64613e91565b6005811115611c7557611c75613e91565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611cfc57611cfc613e91565b1480611d1a5750600182516005811115611d1857611d18613e91565b145b611d795760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161066e565b600382516005811115611d8e57611d8e613e91565b03611db557505f8381526006860160205260408120600491611db09190613bdd565b611db9565b5060055b6020808301515f90815260088801909152604081205581816005811115611de257611de2613e91565b90816005811115611df557611df5613e91565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611e2957611e29613e91565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ef457611ef4613e91565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b611b986001600160a01b038216836134b2565b60408051606080820183525f8083526020830181905292820152905f8051602061454b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fb1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fd89190810190614240565b915091508061203f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161066e565b82548251146120a25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161066e565b60208201516001600160a01b0316156121155760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161066e565b509392505050565b5f805f83516036146121415760405162461bcd60e51b815260040161066e90614371565b5f805b600281101561219057612158816001614337565b6121639060086141c3565b61ffff168682815181106121795761217961434a565b016020015160f81c901b9190911790600101612144565b5061ffff8116156121b35760405162461bcd60e51b815260040161066e906143ba565b5f805b600481101561220e576121ca816003614337565b6121d59060086141c3565b63ffffffff16876121e783600261435e565b815181106121f7576121f761434a565b016020015160f81c901b91909117906001016121b6565b5063ffffffff81166003146122355760405162461bcd60e51b815260040161066e906143fd565b5f805b602081101561228a5761224c81601f614337565b6122579060086141c3565b8861226383600661435e565b815181106122735761227361434a565b016020015160f81c901b9190911790600101612238565b505f805b60088110156122e9576122a2816007614337565b6122ad9060086141c3565b6001600160401b0316896122c283602661435e565b815181106122d2576122d261434a565b016020015160f81c901b919091179060010161228e565b505f805b600881101561234857612301816007614337565b61230c9060086141c3565b6001600160401b03168a61232183602e61435e565b815181106123315761233161434a565b016020015160f81c901b91909117906001016122ed565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061450b8339815191529291906123a090613ef7565b90501180156123d2575060015f83815260038301602052604090205460ff1660048111156123d0576123d0613e91565b145b611b985760405162461bcd60e51b815260206004820152603860248201525f8051602061452b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161066e565b612439613c14565b5f8281525f8051602061458b83398151915260205260408082208151610100810190925280545f8051602061454b83398151915293929190829060ff16600581111561248757612487613e91565b600581111561249857612498613e91565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561252057612520613e91565b1461257c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161066e565b60408101516001600160a01b0316336001600160a01b0316146125f65760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161066e565b6126038160a00151613545565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561264757612647613e91565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127138561270d81611711565b5f6118ac565b5f868152600685016020526040902090915061272f8282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061275c908590600401614055565b6020604051808303815f875af1158015612778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061279c9190613ea5565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f8082516027146128175760405162461bcd60e51b815260040161066e90614371565b5f805b60028110156128665761282e816001614337565b6128399060086141c3565b61ffff1685828151811061284f5761284f61434a565b016020015160f81c901b919091179060010161281a565b5061ffff8116156128895760405162461bcd60e51b815260040161066e906143ba565b5f805b60048110156128e4576128a0816003614337565b6128ab9060086141c3565b63ffffffff16866128bd83600261435e565b815181106128cd576128cd61434a565b016020015160f81c901b919091179060010161288c565b5063ffffffff811660021461290b5760405162461bcd60e51b815260040161066e906143fd565b5f805b60208110156129605761292281601f614337565b61292d9060086141c3565b8761293983600661435e565b815181106129495761294961434a565b016020015160f81c901b919091179060010161290e565b505f866026815181106129755761297561434a565b016020015191976001600160f81b03199092161515965090945050505050565b5f61299e6136e6565b5f6129a883610b5d565b90505f8051602061450b8339815191525f6129c287611785565b90506002815160058111156129d9576129d9613e91565b14612a385760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161066e565b5f838260a00151612a499190614444565b9050612a558882611864565b5f612a5f89611711565b90505f898983604051602001612aa79392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612ac886613545565b5f612ad48b84866118ac565b5f8381526004880160205260409020909150612af08282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b1d908590600401614055565b6020604051808303815f875af1158015612b39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5d9190613ea5565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c0c57612c0c613e91565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061145a60015f8051602061456b83398151915255565b5f5f8051602061450b8339815191528282612d6782610b5d565b83549091506001600160401b03821610801590612d9157508260010154816001600160401b031611155b612def5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161066e565b949350505050565b5f612e006136e6565b5f8051602061454b833981519152426001600160401b038516118015612e3a57506001600160401b038416612e38426202a30061435e565b115b612e9c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161066e565b85612ef35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161066e565b5f86815260088201602052604090205415612f615760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161066e565b8251603014612fc85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161066e565b612fd185613545565b5f806130186040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613730565b5f828152600586016020526040902091935091506130368282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613063908590600401614055565b6020604051808303815f875af115801561307f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a39190613ea5565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561312557613125613e91565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556131e683611711565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612def60015f8051602061456b83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661329557604051631afcd79f60e31b815260040160405180910390fd5b565b61329f61324c565b6132a881613ad5565b611472606082013560808301356132c560c0850160a08601613d54565b6132d560e0860160c08701614464565b613af6565b5f808251602e146132fd5760405162461bcd60e51b815260040161066e90614371565b5f805b600281101561334c57613314816001614337565b61331f9060086141c3565b61ffff168582815181106133355761333561434a565b016020015160f81c901b9190911790600101613300565b5061ffff81161561336f5760405162461bcd60e51b815260040161066e906143ba565b5f805b60048110156133ca57613386816003614337565b6133919060086141c3565b63ffffffff16866133a383600261435e565b815181106133b3576133b361434a565b016020015160f81c901b9190911790600101613372565b5063ffffffff81166004146133f15760405162461bcd60e51b815260040161066e906143fd565b5f805b60208110156134465761340881601f614337565b6134139060086141c3565b8761341f83600661435e565b8151811061342f5761342f61434a565b016020015160f81c901b91909117906001016133f4565b505f805b60088110156134a55761345e816007614337565b6134699060086141c3565b6001600160401b03168861347e83602661435e565b8151811061348e5761348e61434a565b016020015160f81c901b919091179060010161344a565b5090969095509350505050565b804710156134d55760405163cd78605960e01b815230600482015260240161066e565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461351e576040519150601f19603f3d011682016040523d82523d5f602084013e613523565b606091505b5050905080610aeb57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061454b8339815191529060ff165f03613583575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135cb9083614337565b106135e7576001600160401b0384166040830152808252613606565b83826040018181516135f99190614444565b6001600160401b03169052505b5f82602001518360400151606461361d919061447f565b61362791906144aa565b600285015490915060ff90811690821611156136a25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161066e565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061456b83398151915280546001190161371757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061456b83398151915255565b5f606082608001515160301461379a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161066e565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613811576137d1816001614337565b6137dc9060086141c3565b5081515f908390839081106137f3576137f361434a565b60200101906001600160f81b03191690815f1a9053506001016137bd565b505f5b600481101561386f57613828816003614337565b6138339060086141c3565b505f8261384183600261435e565b815181106138515761385161434a565b60200101906001600160f81b03191690815f1a905350600101613814565b505f5b60208110156138cc578451816020811061388e5761388e61434a565b1a60f81b8261389e83600661435e565b815181106138ae576138ae61434a565b60200101906001600160f81b03191690815f1a905350600101613872565b505f5b602081101561392c57846020015181602081106138ee576138ee61434a565b1a60f81b826138fe83602661435e565b8151811061390e5761390e61434a565b60200101906001600160f81b03191690815f1a9053506001016138cf565b505f5b60088110156139a057613943816007614337565b61394e9060086141c3565b60ff1685604001516001600160401b0316901c60f81b82826046613972919061435e565b815181106139825761398261434a565b60200101906001600160f81b03191690815f1a90535060010161392f565b505f5b6030811015613a0b57846080015181815181106139c2576139c261434a565b01602001516001600160f81b031916826139dd83604e61435e565b815181106139ed576139ed61434a565b60200101906001600160f81b03191690815f1a9053506001016139a3565b505f5b6008811015613a7d57613a22816007614337565b613a2d9060086141c3565b60608601516001600160401b0390811691161c60f81b82613a4f83607e61435e565b81518110613a5f57613a5f61434a565b60200101906001600160f81b03191690815f1a905350600101613a0e565b50600281604051613a8e91906144cf565b602060405180830381855afa158015613aa9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613acc9190613ea5565b94909350915050565b613add61324c565b613ae5613b51565b613aed613b61565b61147281613b69565b613afe61324c565b5f5f8051602061450b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613b5961324c565b613295613bd5565b61329561324c565b613b7161324c565b80355f8051602061454b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bbb60608301604084016144ea565b600291909101805460ff191660ff90921691909117905550565b61371d61324c565b508054613be990613ef7565b5f825580601f10613bf8575050565b601f0160209004905f5260205f20908101906114729190613c58565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c6c575f8155600101613c59565b5090565b5f60e08284031215613c80575f80fd5b50919050565b8015158114611472575f80fd5b803563ffffffff81168114613ca6575f80fd5b919050565b5f805f60608486031215613cbd575f80fd5b833592506020840135613ccf81613c86565b9150613cdd60408501613c93565b90509250925092565b5f60208284031215613cf6575f80fd5b5035919050565b5f60208284031215613d0d575f80fd5b61145a82613c93565b5f8060408385031215613d27575f80fd5b613d3083613c93565b946020939093013593505050565b80356001600160401b0381168114613ca6575f80fd5b5f60208284031215613d64575f80fd5b61145a82613d3e565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613da357613da3613d6d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613dd157613dd1613d6d565b604052919050565b5f6001600160401b03821115613df157613df1613d6d565b50601f01601f191660200190565b5f805f60608486031215613e11575f80fd5b83359250613e2160208501613d3e565b915060408401356001600160401b03811115613e3b575f80fd5b8401601f81018613613e4b575f80fd5b8035613e5e613e5982613dd9565b613da9565b818152876020838501011115613e72575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215613eb5575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ef057613ef0613ebc565b5092915050565b600181811c90821680613f0b57607f821691505b602082108103613c8057634e487b7160e01b5f52602260045260245ffd5b601f821115610aeb57805f5260205f20601f840160051c81016020851015613f4e5750805b601f840160051c820191505b81811015613f6d575f8155600101613f5a565b5050505050565b81516001600160401b03811115613f8d57613f8d613d6d565b613fa181613f9b8454613ef7565b84613f29565b602080601f831160018114613fd4575f8415613fbd5750858301515b5f19600386901b1c1916600185901b17855561402b565b5f85815260208120601f198616915b8281101561400257888601518255948401946001909101908401613fe3565b508582101561401f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561404d578181015183820152602001614035565b50505f910152565b602081525f8251806020840152614073816040850160208701614033565b601f01601f19169190910160400192915050565b5f60208083525f845461409981613ef7565b806020870152604060018084165f81146140ba57600181146140d657614103565b60ff19851660408a0152604084151560051b8a01019550614103565b895f5260205f205f5b858110156140fa5781548b82018601529083019088016140df565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261413357614133614111565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610b6d57610b6d613ebc565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611472575f80fd5b8051613ca681613c86565b5f8060408385031215614251575f80fd5b82516001600160401b0380821115614267575f80fd5b908401906060828703121561427a575f80fd5b614282613d81565b8251815260208084015161429581614221565b828201526040840151838111156142aa575f80fd5b80850194505087601f8501126142be575f80fd5b835192506142ce613e5984613dd9565b83815288828587010111156142e1575f80fd5b6142f084838301848801614033565b80604084015250819550614305818801614235565b9450505050509250929050565b5f6001600160401b0380831681810361432d5761432d613ebc565b6001019392505050565b81810381811115610b6d57610b6d613ebc565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610b6d57610b6d613ebc565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ef057613ef0613ebc565b5f60208284031215614474575f80fd5b813561145a81614221565b6001600160401b038181168382160280821691908281146144a2576144a2613ebc565b505092915050565b5f6001600160401b03808416806144c3576144c3614111565b92169190910492915050565b5f82516144e0818460208701614033565b9190910192915050565b5f602082840312156144fa575f80fd5b813560ff8116811461145a575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 37830db11..534ad1470 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -39,7 +39,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612bde380380612bde83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a918061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd3660046123a7565b61023f565b005b6101226100f23660046123a7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012261014336600461246b565b6103a0565b6100e261015636600461250e565b6103c0565b61016e6101693660046123a7565b6103cd565b6040516001600160401b03909116815260200161012c565b6100e26103e1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e03660046123a7565b6103f4565b6100e26101f336600461250e565b610400565b6101ba6005600160991b0181565b6100e26102143660046123a7565b6105bd565b6100e261022736600461254c565b61068c565b6100e261023a366004612588565b61079a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612a65833981519152929190610287906125a3565b90501180156102b9575060035f83815260078301602052604090205460ff1660058111156102b7576102b76125db565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125ef565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612679565b505050565b5f6103a96107d4565b6103b58486858561082f565b90505b949350505050565b6103c981610c97565b5050565b5f6103d782611024565b60a0015192915050565b6103e96107d4565b6103f25f611116565b565b6103fd81611186565b50565b5f80516020612a658339815191525f61041883611551565b90505f806104298360400151611732565b915091508061048b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600585016020526040812080546104a5906125a3565b90501180156104d7575060015f83815260078601602052604090205460ff1660058111156104d5576104d56125db565b145b6104f35760405162461bcd60e51b815260040161031990612690565b5f828152600585016020526040812061050b91612314565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a65833981519152929190610605906125a3565b9050118015610637575060015f83815260078301602052604090205460ff166005811115610635576106356125db565b145b6106535760405162461bcd60e51b815260040161031990612690565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125ef565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106d05750825b90505f826001600160401b031660011480156106eb5750303b155b9050811580156106f9575080155b156107175760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561074157845460ff60401b1916600160401b1785555b61074b8787611991565b831561079157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6107a26107d4565b6001600160a01b0381166107cb57604051631e4fbdf760e01b81525f6004820152602401610319565b6103fd81611116565b336108067f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103f25760405163118cdaa760e01b8152336004820152602401610319565b5f6108386119ab565b5f80516020612a65833981519152426001600160401b03851611801561087257506001600160401b038416610870426202a3006126eb565b115b6108d45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b8561092b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f868152600882016020526040902054156109995760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610a005760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b610a09856119f5565b5f80610a506040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611b96565b5f82815260058601602052604090209193509150610a6e828261274f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610a9b908590600401612830565b6020604051808303815f875af1158015610ab7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610adb9190612679565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115610b5d57610b5d6125db565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610c1e83611f3b565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610c9f61234b565b5f80516020612a658339815191525f610cb784611551565b90505f80610cc88360400151611732565b915091508015610d2d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610d5f57610d5f6125db565b6005811115610d7057610d706125db565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610df757610df76125db565b1480610e155750600182516005811115610e1357610e136125db565b145b610e745760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b600382516005811115610e8957610e896125db565b03610eb057505f8381526006860160205260408120600491610eab9190612314565b610eb4565b5060055b6020808301515f90815260088801909152604081205581816005811115610edd57610edd6125db565b90816005811115610ef057610ef06125db565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610f2457610f246125db565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610fef57610fef6125db565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b61102c61234b565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040908190208151610100810190925280545f80516020612a65833981519152929190829060ff16600581111561108d5761108d6125db565b600581111561109e5761109e6125db565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0760205260408082208151610100810190925280545f80516020612a6583398151915293929190829060ff1660058111156111e7576111e76125db565b60058111156111f8576111f86125db565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115611280576112806125db565b146112dc5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146113565760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b6113638160a001516119f5565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156113a7576113a76125db565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6114738461146d81611f3b565b5f611fe8565b5f858152600685016020526040902090915061148f828261274f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906114bc908590600401612830565b6020604051808303815f875af11580156114d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114fc9190612679565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612a658339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115ed9190810190612871565b91509150806116545760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146116b75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b03161561172a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146117975760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156117e6576117ae816001612943565b6117b9906008612956565b61ffff168582815181106117cf576117cf61296d565b016020015160f81c901b919091179060010161179a565b5061ffff8116156118455760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b60048110156118a05761185c816003612943565b611867906008612956565b63ffffffff16866118798360026126eb565b815181106118895761188961296d565b016020015160f81c901b9190911790600101611848565b5063ffffffff81166002146119075760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b602081101561195c5761191e81601f612943565b611929906008612956565b876119358360066126eb565b815181106119455761194561296d565b016020015160f81c901b919091179060010161190a565b505f866026815181106119715761197161296d565b016020015191976001600160f81b03199092161515965090945050505050565b611999612205565b6119a28261224e565b6103c98161226f565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016119ef57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a658339815191529060ff165f03611a33575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611a7b9083612943565b10611a97576001600160401b0384166040830152808252611ab6565b8382604001818151611aa99190612981565b6001600160401b03169052505b5f826020015183604001516064611acd91906129a8565b611ad791906129d3565b600285015490915060ff9081169082161115611b525760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610319565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c005760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c7757611c37816001612943565b611c42906008612956565b5081515f90839083908110611c5957611c5961296d565b60200101906001600160f81b03191690815f1a905350600101611c23565b505f5b6004811015611cd557611c8e816003612943565b611c99906008612956565b505f82611ca78360026126eb565b81518110611cb757611cb761296d565b60200101906001600160f81b03191690815f1a905350600101611c7a565b505f5b6020811015611d325784518160208110611cf457611cf461296d565b1a60f81b82611d048360066126eb565b81518110611d1457611d1461296d565b60200101906001600160f81b03191690815f1a905350600101611cd8565b505f5b6020811015611d925784602001518160208110611d5457611d5461296d565b1a60f81b82611d648360266126eb565b81518110611d7457611d7461296d565b60200101906001600160f81b03191690815f1a905350600101611d35565b505f5b6008811015611e0657611da9816007612943565b611db4906008612956565b60ff1685604001516001600160401b0316901c60f81b82826046611dd891906126eb565b81518110611de857611de861296d565b60200101906001600160f81b03191690815f1a905350600101611d95565b505f5b6030811015611e715784608001518181518110611e2857611e2861296d565b01602001516001600160f81b03191682611e4383604e6126eb565b81518110611e5357611e5361296d565b60200101906001600160f81b03191690815f1a905350600101611e09565b505f5b6008811015611ee357611e88816007612943565b611e93906008612956565b60608601516001600160401b0390811691161c60f81b82611eb583607e6126eb565b81518110611ec557611ec561296d565b60200101906001600160f81b03191690815f1a905350600101611e74565b50600281604051611ef49190612a04565b602060405180830381855afa158015611f0f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f329190612679565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060030180545f80516020612a65833981519152916001600160401b0390911690819084611f9383612a1f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561206157612021816001612943565b61202c906008612956565b5081515f908390839081106120435761204361296d565b60200101906001600160f81b03191690815f1a90535060010161200d565b505f5b60048110156120c457612078816003612943565b612083906008612956565b6001901c60f81b826120968360026126eb565b815181106120a6576120a661296d565b60200101906001600160f81b03191690815f1a905350600101612064565b505f5b6020811015612126576120db81601f612943565b6120e6906008612956565b86901c60f81b826120f88360066126eb565b815181106121085761210861296d565b60200101906001600160f81b03191690815f1a9053506001016120c7565b505f5b60088110156121915761213d816007612943565b612148906008612956565b6001600160401b038616901c60f81b826121638360266126eb565b815181106121735761217361296d565b60200101906001600160f81b03191690815f1a905350600101612129565b505f5b60088110156121fc576121a8816007612943565b6121b3906008612956565b6001600160401b038516901c60f81b826121ce83602e6126eb565b815181106121de576121de61296d565b60200101906001600160f81b03191690815f1a905350600101612194565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103f257604051631afcd79f60e31b815260040160405180910390fd5b612256612205565b61225e612280565b612266612290565b6103fd81612298565b612277612205565b6103fd81612304565b612288612205565b6103f261230c565b6103f2612205565b6122a0612205565b80355f80516020612a6583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122ea6060830160408401612a44565b600291909101805460ff191660ff90921691909117905550565b6107a2612205565b611fc2612205565b508054612320906125a3565b5f825580601f1061232f575050565b601f0160209004905f5260205f20908101906103fd919061238f565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156123a3575f8155600101612390565b5090565b5f602082840312156123b7575f80fd5b5035919050565b80356001600160401b03811681146123d4575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561240f5761240f6123d9565b60405290565b604051601f8201601f191681016001600160401b038111828210171561243d5761243d6123d9565b604052919050565b5f6001600160401b0382111561245d5761245d6123d9565b50601f01601f191660200190565b5f805f806080858703121561247e575f80fd5b612487856123be565b93506020850135925061249c604086016123be565b915060608501356001600160401b038111156124b6575f80fd5b8501601f810187136124c6575f80fd5b80356124d96124d482612445565b612415565b8181528860208385010111156124ed575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f6020828403121561251e575f80fd5b813563ffffffff81168114612531575f80fd5b9392505050565b6001600160a01b03811681146103fd575f80fd5b5f80828403608081121561255e575f80fd5b606081121561256b575f80fd5b50829150606083013561257d81612538565b809150509250929050565b5f60208284031215612598575f80fd5b813561253181612538565b600181811c908216806125b757607f821691505b6020821081036125d557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454612601816125a3565b806020870152604060018084165f8114612622576001811461263e5761266b565b60ff19851660408a0152604084151560051b8a0101955061266b565b895f5260205f205f5b858110156126625781548b8201860152908301908801612647565b8a016040019650505b509398975050505050505050565b5f60208284031215612689575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126fe576126fe6126d7565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156127295750805b601f840160051c820191505b81811015612748575f8155600101612735565b5050505050565b81516001600160401b03811115612768576127686123d9565b61277c8161277684546125a3565b84612704565b602080601f8311600181146127af575f84156127985750858301515b5f19600386901b1c1916600185901b178555612806565b5f85815260208120601f198616915b828110156127dd578886015182559484019460019091019084016127be565b50858210156127fa57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015612828578181015183820152602001612810565b50505f910152565b602081525f825180602084015261284e81604085016020870161280e565b601f01601f19169190910160400192915050565b805180151581146123d4575f80fd5b5f8060408385031215612882575f80fd5b82516001600160401b0380821115612898575f80fd5b90840190606082870312156128ab575f80fd5b6128b36123ed565b825181526020808401516128c681612538565b828201526040840151838111156128db575f80fd5b80850194505087601f8501126128ef575f80fd5b835192506128ff6124d484612445565b8381528882858701011115612912575f80fd5b6129218483830184880161280e565b80604084015250819550612936818801612862565b9450505050509250929050565b818103818111156126fe576126fe6126d7565b80820281158282048414176126fe576126fe6126d7565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b038181168382160190808211156129a1576129a16126d7565b5092915050565b6001600160401b038181168382160280821691908281146129cb576129cb6126d7565b505092915050565b5f6001600160401b03808416806129f857634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a1581846020870161280e565b9190910192915050565b5f6001600160401b03808316818103612a3a57612a3a6126d7565b6001019392505050565b5f60208284031215612a54575f80fd5b813560ff81168114612531575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612be9380380612be983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a9c8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd3660046123b2565b61023f565b005b6101226100f23660046123b2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612476565b6103a0565b6100e2610156366004612519565b6103c0565b61016e6101693660046123b2565b6103cd565b6040516001600160401b03909116815260200161012c565b6100e26103e1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e03660046123b2565b6103f4565b6100e26101f3366004612519565b6103fd565b6101ba6005600160991b0181565b6100e26102143660046123b2565b6105ba565b6100e2610227366004612557565b610689565b6100e261023a366004612593565b610797565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612a70833981519152929190610287906125ae565b90501180156102b9575060035f83815260078301602052604090205460ff1660058111156102b7576102b76125e6565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125fa565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612684565b505050565b5f6103a96107d4565b6103b58486858561082f565b90505b949350505050565b6103c981610c97565b5050565b5f6103d782611024565b60a0015192915050565b6103e96107d4565b6103f25f611116565b565b6103c981611186565b5f80516020612a708339815191525f6104158361155c565b90505f80610426836040015161173d565b91509150806104885760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600585016020526040812080546104a2906125ae565b90501180156104d4575060015f83815260078601602052604090205460ff1660058111156104d2576104d26125e6565b145b6104f05760405162461bcd60e51b81526004016103199061269b565b5f82815260058501602052604081206105089161231f565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a70833981519152929190610602906125ae565b9050118015610634575060015f83815260078301602052604090205460ff166005811115610632576106326125e6565b145b6106505760405162461bcd60e51b81526004016103199061269b565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125fa565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106cd5750825b90505f826001600160401b031660011480156106e85750303b155b9050811580156106f6575080155b156107145760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561073e57845460ff60401b1916600160401b1785555b610748878761199c565b831561078e57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61079f6107d4565b6001600160a01b0381166107c857604051631e4fbdf760e01b81525f6004820152602401610319565b6107d181611116565b50565b336108067f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103f25760405163118cdaa760e01b8152336004820152602401610319565b5f6108386119b6565b5f80516020612a70833981519152426001600160401b03851611801561087257506001600160401b038416610870426202a3006126f6565b115b6108d45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b8561092b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f868152600882016020526040902054156109995760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610a005760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b610a0985611a00565b5f80610a506040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611ba1565b5f82815260058601602052604090209193509150610a6e828261275a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610a9b90859060040161283b565b6020604051808303815f875af1158015610ab7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610adb9190612684565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115610b5d57610b5d6125e6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610c1e83611f46565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610c9f612356565b5f80516020612a708339815191525f610cb78461155c565b90505f80610cc8836040015161173d565b915091508015610d2d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610d5f57610d5f6125e6565b6005811115610d7057610d706125e6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610df757610df76125e6565b1480610e155750600182516005811115610e1357610e136125e6565b145b610e745760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b600382516005811115610e8957610e896125e6565b03610eb057505f8381526006860160205260408120600491610eab919061231f565b610eb4565b5060055b6020808301515f90815260088801909152604081205581816005811115610edd57610edd6125e6565b90816005811115610ef057610ef06125e6565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610f2457610f246125e6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610fef57610fef6125e6565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b61102c612356565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040908190208151610100810190925280545f80516020612a70833981519152929190829060ff16600581111561108d5761108d6125e6565b600581111561109e5761109e6125e6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b61118e612356565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0760205260408082208151610100810190925280545f80516020612a7083398151915293929190829060ff1660058111156111ef576111ef6125e6565b6005811115611200576112006125e6565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115611288576112886125e6565b146112e45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b03161461135e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b61136b8160a00151611a00565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156113af576113af6125e6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61147b8561147581611f46565b5f611ff3565b5f8681526006850160205260409020909150611497828261275a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906114c490859060040161283b565b6020604051808303815f875af11580156114e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115049190612684565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b60408051606080820183525f8083526020830181905292820152905f80516020612a708339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115d1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115f8919081019061287c565b915091508061165f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146116c25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b0316156117355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146117a25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156117f1576117b981600161294e565b6117c4906008612961565b61ffff168582815181106117da576117da612978565b016020015160f81c901b91909117906001016117a5565b5061ffff8116156118505760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b60048110156118ab5761186781600361294e565b611872906008612961565b63ffffffff16866118848360026126f6565b8151811061189457611894612978565b016020015160f81c901b9190911790600101611853565b5063ffffffff81166002146119125760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b60208110156119675761192981601f61294e565b611934906008612961565b876119408360066126f6565b8151811061195057611950612978565b016020015160f81c901b9190911790600101611915565b505f8660268151811061197c5761197c612978565b016020015191976001600160f81b03199092161515965090945050505050565b6119a4612210565b6119ad82612259565b6103c98161227a565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016119fa57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a708339815191529060ff165f03611a3e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611a86908361294e565b10611aa2576001600160401b0384166040830152808252611ac1565b8382604001818151611ab4919061298c565b6001600160401b03169052505b5f826020015183604001516064611ad891906129b3565b611ae291906129de565b600285015490915060ff9081169082161115611b5d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610319565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c0b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c8257611c4281600161294e565b611c4d906008612961565b5081515f90839083908110611c6457611c64612978565b60200101906001600160f81b03191690815f1a905350600101611c2e565b505f5b6004811015611ce057611c9981600361294e565b611ca4906008612961565b505f82611cb28360026126f6565b81518110611cc257611cc2612978565b60200101906001600160f81b03191690815f1a905350600101611c85565b505f5b6020811015611d3d5784518160208110611cff57611cff612978565b1a60f81b82611d0f8360066126f6565b81518110611d1f57611d1f612978565b60200101906001600160f81b03191690815f1a905350600101611ce3565b505f5b6020811015611d9d5784602001518160208110611d5f57611d5f612978565b1a60f81b82611d6f8360266126f6565b81518110611d7f57611d7f612978565b60200101906001600160f81b03191690815f1a905350600101611d40565b505f5b6008811015611e1157611db481600761294e565b611dbf906008612961565b60ff1685604001516001600160401b0316901c60f81b82826046611de391906126f6565b81518110611df357611df3612978565b60200101906001600160f81b03191690815f1a905350600101611da0565b505f5b6030811015611e7c5784608001518181518110611e3357611e33612978565b01602001516001600160f81b03191682611e4e83604e6126f6565b81518110611e5e57611e5e612978565b60200101906001600160f81b03191690815f1a905350600101611e14565b505f5b6008811015611eee57611e9381600761294e565b611e9e906008612961565b60608601516001600160401b0390811691161c60f81b82611ec083607e6126f6565b81518110611ed057611ed0612978565b60200101906001600160f81b03191690815f1a905350600101611e7f565b50600281604051611eff9190612a0f565b602060405180830381855afa158015611f1a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f3d9190612684565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060030180545f80516020612a70833981519152916001600160401b0390911690819084611f9e83612a2a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561206c5761202c81600161294e565b612037906008612961565b5081515f9083908390811061204e5761204e612978565b60200101906001600160f81b03191690815f1a905350600101612018565b505f5b60048110156120cf5761208381600361294e565b61208e906008612961565b6001901c60f81b826120a18360026126f6565b815181106120b1576120b1612978565b60200101906001600160f81b03191690815f1a90535060010161206f565b505f5b6020811015612131576120e681601f61294e565b6120f1906008612961565b86901c60f81b826121038360066126f6565b8151811061211357612113612978565b60200101906001600160f81b03191690815f1a9053506001016120d2565b505f5b600881101561219c5761214881600761294e565b612153906008612961565b6001600160401b038616901c60f81b8261216e8360266126f6565b8151811061217e5761217e612978565b60200101906001600160f81b03191690815f1a905350600101612134565b505f5b6008811015612207576121b381600761294e565b6121be906008612961565b6001600160401b038516901c60f81b826121d983602e6126f6565b815181106121e9576121e9612978565b60200101906001600160f81b03191690815f1a90535060010161219f565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103f257604051631afcd79f60e31b815260040160405180910390fd5b612261612210565b61226961228b565b61227161229b565b6107d1816122a3565b612282612210565b6107d18161230f565b612293612210565b6103f2612317565b6103f2612210565b6122ab612210565b80355f80516020612a7083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122f56060830160408401612a4f565b600291909101805460ff191660ff90921691909117905550565b61079f612210565b611fcd612210565b50805461232b906125ae565b5f825580601f1061233a575050565b601f0160209004905f5260205f20908101906107d1919061239a565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156123ae575f815560010161239b565b5090565b5f602082840312156123c2575f80fd5b5035919050565b80356001600160401b03811681146123df575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561241a5761241a6123e4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612448576124486123e4565b604052919050565b5f6001600160401b03821115612468576124686123e4565b50601f01601f191660200190565b5f805f8060808587031215612489575f80fd5b612492856123c9565b9350602085013592506124a7604086016123c9565b915060608501356001600160401b038111156124c1575f80fd5b8501601f810187136124d1575f80fd5b80356124e46124df82612450565b612420565b8181528860208385010111156124f8575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612529575f80fd5b813563ffffffff8116811461253c575f80fd5b9392505050565b6001600160a01b03811681146107d1575f80fd5b5f808284036080811215612569575f80fd5b6060811215612576575f80fd5b50829150606083013561258881612543565b809150509250929050565b5f602082840312156125a3575f80fd5b813561253c81612543565b600181811c908216806125c257607f821691505b6020821081036125e057634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f845461260c816125ae565b806020870152604060018084165f811461262d576001811461264957612676565b60ff19851660408a0152604084151560051b8a01019550612676565b895f5260205f205f5b8581101561266d5781548b8201860152908301908801612652565b8a016040019650505b509398975050505050505050565b5f60208284031215612694575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115612709576127096126e2565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156127345750805b601f840160051c820191505b81811015612753575f8155600101612740565b5050505050565b81516001600160401b03811115612773576127736123e4565b6127878161278184546125ae565b8461270f565b602080601f8311600181146127ba575f84156127a35750858301515b5f19600386901b1c1916600185901b178555612811565b5f85815260208120601f198616915b828110156127e8578886015182559484019460019091019084016127c9565b508582101561280557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561283357818101518382015260200161281b565b50505f910152565b602081525f8251806020840152612859816040850160208701612819565b601f01601f19169190910160400192915050565b805180151581146123df575f80fd5b5f806040838503121561288d575f80fd5b82516001600160401b03808211156128a3575f80fd5b90840190606082870312156128b6575f80fd5b6128be6123f8565b825181526020808401516128d181612543565b828201526040840151838111156128e6575f80fd5b80850194505087601f8501126128fa575f80fd5b8351925061290a6124df84612450565b838152888285870101111561291d575f80fd5b61292c84838301848801612819565b8060408401525081955061294181880161286d565b9450505050509250929050565b81810381811115612709576127096126e2565b8082028115828204841417612709576127096126e2565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b038181168382160190808211156129ac576129ac6126e2565b5092915050565b6001600160401b038181168382160280821691908281146129d6576129d66126e2565b505092915050565b5f6001600160401b0380841680612a0357634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a20818460208701612819565b9190910192915050565b5f6001600160401b03808316818103612a4557612a456126e2565b6001019392505050565b5f60208284031215612a5f575f80fd5b813560ff8116811461253c575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index 981a9db95..752069164 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -21,11 +21,10 @@ contract ExampleRewardCalculator is IRewardCalculator { */ function calculateReward( uint256 stakeAmount, - uint64 startTime, - uint64 endTime, + uint64 uptime, uint256, // initialSupply uint256 // endSupply ) external view returns (uint256) { - return (stakeAmount * rewardBasisPoints * (endTime - startTime)) / SECONDS_IN_YEAR / 1000; + return (stakeAmount * rewardBasisPoints * uptime) / SECONDS_IN_YEAR / 1000; } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 302c1da6d..fcd905f54 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -35,6 +35,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager mapping(bytes32 delegationID => bytes) _pendingRegisterDelegatorMessages; /// @notice Maps the delegationID to pending end delegator messages. mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; + /// @notice Maps the delegationID to its pending staking rewards. + mapping(bytes32 delegationID => uint256) _pendingDelegatorRewards; + /// @notice Maps the validator owner address to its pending staking rewards. + mapping(address validatorOwner => uint256) _pendingValidatorRewards; } // solhint-enable private-vars-leading-underscore @@ -88,23 +92,25 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bool includeUptimeProof, uint32 messageIndex ) external { + uint64 uptime; if (includeUptimeProof) { - _getUptime(validationID, messageIndex); + uptime = _getUptime(validationID, messageIndex); } - // TODO: Calculate the reward for the validator, but do not unlock it - _initializeEndValidation(validationID); + Validator memory validator = _initializeEndValidation(validationID); + + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + $._pendingValidatorRewards[validator.owner] = + $._rewardCalculator.calculateReward(validator.weight, uptime, 0, 0); } function completeEndValidation(uint32 messageIndex) external { Validator memory validator = _completeEndValidation(messageIndex); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - uint256 rewardAmount = $._rewardCalculator.calculateReward( - validator.weight, validator.startedAt, validator.endedAt, 0, 0 - ); - _reward(validator.owner, rewardAmount); + _reward(validator.owner, $._pendingValidatorRewards[validator.owner]); + delete $._pendingValidatorRewards[validator.owner]; _unlock(validator.startingWeight, validator.owner); } @@ -272,15 +278,16 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); bytes32 validationID = $._delegatorStakes[delegationID].validationID; + Delegator memory delegator = $._delegatorStakes[delegationID]; + uint64 uptime; if (includeUptimeProof) { uptime = _getUptime(validationID, messageIndex); } - - // TODO: Calculate the delegator's reward, but do not unlock it + $._pendingDelegatorRewards[delegationID] = + $._rewardCalculator.calculateReward(delegator.weight, uptime, 0, 0); // Ensure the delegator is active - Delegator memory delegator = $._delegatorStakes[delegationID]; require( delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegation not active" ); @@ -365,10 +372,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Delegator memory delegator = $._delegatorStakes[delegationID]; _unlock(delegator.weight, delegator.owner); - uint256 rewardAmount = $._rewardCalculator.calculateReward( - delegator.weight, delegator.startedAt, delegator.endedAt, 0, 0 - ); - _reward(delegator.owner, rewardAmount); + _reward(delegator.owner, $._pendingDelegatorRewards[delegationID]); + delete $._pendingDelegatorRewards[delegationID]; emit DelegationEnded(delegationID, validationID, nonce); } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index d70b145fd..510fb9607 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -210,7 +210,11 @@ abstract contract ValidatorManager is * Any rewards for this validation period will stop accruing when this function is called. * @param validationID The ID of the validation being ended. */ - function _initializeEndValidation(bytes32 validationID) internal virtual { + function _initializeEndValidation(bytes32 validationID) + internal + virtual + returns (Validator memory) + { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Ensure the validation period is active. @@ -244,6 +248,8 @@ abstract contract ValidatorManager is // Emit the event to signal the start of the validator removal process. emit ValidatorRemovalInitialized(validationID, messageID, validator.weight, block.timestamp); + + return validator; } /** diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol index 51fffb6a7..c06bf3bec 100644 --- a/contracts/staking/interfaces/IRewardCalculator.sol +++ b/contracts/staking/interfaces/IRewardCalculator.sol @@ -8,8 +8,7 @@ pragma solidity 0.8.25; interface IRewardCalculator { function calculateReward( uint256 stakeAmount, - uint64 startTime, - uint64 endTime, + uint64 uptime, uint256 initialSupply, uint256 endSupply ) external view returns (uint256); diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol index dcee84052..b51a699f0 100644 --- a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -22,7 +22,7 @@ contract ExampleRewardCalculatorTest is Test { function testRewardCalculation() public view { uint256 output = exampleRewardCalculator.calculateReward( - DEFAULT_STAKE_AMOUNT, DEFAULT_START_TIME, DEFAULT_END_TIME, 0, 0 + DEFAULT_STAKE_AMOUNT, DEFAULT_END_TIME - DEFAULT_START_TIME, 0, 0 ); assertEq(output, 42e9); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 7629c6343..68cdcc5ea 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -55,6 +55,19 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce ); + function testInitializeEndValidation() public override { + _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true + }); + } + function testInvalidUptimeWarpMessage() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -328,6 +341,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -362,6 +376,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -372,6 +387,23 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.resendEndDelegation(delegationID); } + function testResendEndValidation() public override { + bytes32 validationID = _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true + }); + bytes memory setValidatorWeightPayload = + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + validatorManager.resendEndValidatorMessage(validationID); + } + function testCompleteEndDelegation() public virtual { uint256 registrationDuration = 1000 * 60 * 60 * 24; // 1 day @@ -404,6 +436,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: uint64(registrationExpiry), expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -473,6 +506,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator1, delegationID: delegationID1, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 3 @@ -481,6 +515,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator2, delegationID: delegationID2, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 @@ -547,6 +582,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator1, delegationID: delegationID1, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 3 @@ -555,6 +591,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator2, delegationID: delegationID2, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 @@ -576,7 +613,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: uint64(registrationExpiry), blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: uint64(registrationExpiry) + completionTimestamp: uint64(registrationExpiry), + includeUptime: true }); uint256 balanceBefore = _getStakeAssetBalance(address(this)); @@ -616,7 +654,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function _initializeEndValidation(bytes32 validationID) internal virtual override { - return posValidatorManager.initializeEndValidation(validationID, false, 0); + return posValidatorManager.initializeEndValidation(validationID, true, 0); } function _initializeDelegatorRegistration( @@ -686,6 +724,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID, address delegatorAddress, bytes32 delegationID, + uint64 startDelegationTimestamp, uint64 endDelegationTimestamp, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -694,6 +733,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, expectedNonce, expectedValidatorWeight); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, endDelegationTimestamp - startDelegationTimestamp + ); + _mockGetVerifiedWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorRemovalInitialized({ @@ -705,7 +749,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { setWeightMessageID: bytes32(0) }); vm.prank(delegatorAddress); - posValidatorManager.initializeEndDelegation(delegationID, false, 0); + posValidatorManager.initializeEndDelegation(delegationID, true, 0); return delegationID; } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 28fdd64c2..1f8afce00 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -127,7 +127,7 @@ abstract contract ValidatorManagerTest is Test { }); } - function testInitializeEndValidation() public { + function testInitializeEndValidation() public virtual { _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -143,7 +143,7 @@ abstract contract ValidatorManagerTest is Test { // TODO: implement } - function testResendEndValidation() public { + function testResendEndValidation() public virtual { bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -258,6 +258,28 @@ abstract contract ValidatorManagerTest is Test { bytes memory blsPublicKey, uint64 registrationTimestamp, uint64 completionTimestamp + ) internal returns (bytes32 validationID) { + return _setUpInitializeEndValidation({ + nodeID: nodeID, + subnetID: subnetID, + weight: weight, + registrationExpiry: registrationExpiry, + blsPublicKey: blsPublicKey, + registrationTimestamp: registrationTimestamp, + completionTimestamp: completionTimestamp, + includeUptime: false + }); + } + + function _setUpInitializeEndValidation( + bytes32 nodeID, + bytes32 subnetID, + uint64 weight, + uint64 registrationExpiry, + bytes memory blsPublicKey, + uint64 registrationTimestamp, + uint64 completionTimestamp, + bool includeUptime ) internal returns (bytes32 validationID) { validationID = _setUpCompleteValidatorRegistration({ nodeID: nodeID, @@ -272,6 +294,13 @@ abstract contract ValidatorManagerTest is Test { bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + if (includeUptime) { + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, registrationExpiry - registrationTimestamp + ); + _mockGetVerifiedWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); + } vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); @@ -320,10 +349,14 @@ abstract contract ValidatorManagerTest is Test { } function _mockGetBlockchainID() internal { + _mockGetBlockchainID(DEFAULT_SOURCE_BLOCKCHAIN_ID); + } + + function _mockGetBlockchainID(bytes32 blockchainID) internal { vm.mockCall( WARP_PRECOMPILE_ADDRESS, abi.encodeWithSelector(IWarpMessenger.getBlockchainID.selector), - abi.encode(DEFAULT_SOURCE_BLOCKCHAIN_ID) + abi.encode(blockchainID) ); vm.expectCall( WARP_PRECOMPILE_ADDRESS, abi.encodeWithSelector(IWarpMessenger.getBlockchainID.selector) From 538ea24ff584b518118eb8b0c1b44c353db314ae Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 11 Sep 2024 10:58:33 -0400 Subject: [PATCH 239/545] Fixup churn tracker --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 8 ++- contracts/staking/ValidatorManager.sol | 53 +++++++++++++----- .../staking/interfaces/IValidatorManager.sol | 1 + .../tests/ERC20TokenStakingManagerTests.t.sol | 4 ++ .../NativeTokenStakingManagerTests.t.sol | 4 ++ .../tests/PoAValidatorManagerTests.t.sol | 15 ++++++ .../tests/PoSValidatorManagerTests.t.sol | 54 ------------------- .../staking/tests/ValidatorManagerTests.t.sol | 51 ++++++++++++++++++ tests/flows/staking/poa_to_pos.go | 17 +++--- tests/utils/staking.go | 34 ++++++------ 13 files changed, 148 insertions(+), 99 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 319b5a12e..960ec27c5 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -49,7 +49,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161494c38038061494c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147ff8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063b771b3bc1461028a578063bee0a03f146102b0578063e74e8cab146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872fda641461023e57806398f3e2b414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613eb7565b6102d6565b005b610128610138366004613ef2565b610761565b61017b61014b366004613ef2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613ef2565b6108bd565b6101b46101af366004613ef2565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da366004613f09565b610940565b6101286101ed366004613f22565b61096b565b61017b610200366004613f60565b610b5c565b6101b4610213366004613ef2565b610b75565b610128610226366004613ef2565b610b89565b610128610239366004613eb7565b610bf6565b61017b61024c36600461400b565b610c11565b61012861025f366004613f22565b610c36565b61017b6102723660046140a7565b610e65565b610128610285366004613f09565b610e78565b6102986005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102be366004613ef2565b611035565b6101286102d13660046140db565b611104565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206147538339815191529184156103285761032582856111e8565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614119565b600481111561036b5761036b614119565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614119565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206147738339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206147738339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611484565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500614119565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856114f8565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190614141565b905061066a86826115d7565b5f61067687858461161f565b5f8c815260058a016020526040902090915061069282826141eb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016142cc565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906142fe565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206147938339815191529291906107a990614168565b90501180156107db575060035f83815260088301602052604090205460ff1660058111156107d9576107d9614119565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614315565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906142fe565b505050565b6108c68161183c565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614753833981519152916005600160991b019163ee5b48eb9161087891600401614315565b5f61093a64e8d4a510008361439f565b92915050565b5f61094a8261190b565b905061096781606001516001600160401b03168260400151611c98565b5050565b5f805160206147538339815191525f61098384611cce565b90505f806109948360400151611eaf565b50915091506109a2856120ea565b5f85815260048501602052604081206109ba91613dff565b5f6109c4836114f8565b9050816001600160401b031681608001516001600160401b031610156109fc5760405162461bcd60e51b815260040161043b906143be565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610a415760405162461bcd60e51b815260040161043b90614400565b60015f87815260038701602052604090205460ff166004811115610a6757610a67614119565b14610ad05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a51000614449565b5f610b7f826114f8565b60a0015192915050565b610b92816120ea565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614753833981519152916005600160991b019163ee5b48eb9161087891600401614315565b8115610c0857610c0683826111e8565b505b6108b8836121c3565b5f80610c1c866125a0565b9050610c2a8582868661264d565b9150505b949350505050565b5f805160206147538339815191525f610c4e84611cce565b90505f80610c5f8360400151611eaf565b5091509150610c6d8561183c565b5f8581526005850160205260408120610c8591613dff565b5f610c8f836114f8565b9050816001600160401b031681608001516001600160401b03161015610cc75760405162461bcd60e51b815260040161043b906143be565b5f8681526003808701602052604090912001546001600160401b0380841691161115610d055760405162461bcd60e51b815260040161043b90614400565b60035f87815260038701602052604090205460ff166004811115610d2b57610d2b614119565b14610d7f5760405162461bcd60e51b815260206004820152603160248201525f805160206147738339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610e239190611c98565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610e71833384612b34565b9392505050565b5f805160206147938339815191525f610e9083611cce565b90505f80610ea18360400151612eef565b9150915080610f035760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260068501602052604081208054610f1d90614168565b9050118015610f4f575060015f83815260088601602052604090205460ff166005811115610f4d57610f4d614119565b145b610f6b5760405162461bcd60e51b815260040161043b90614460565b5f8281526006850160205260408120610f8391613dff565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061479383398151915292919061107d90614168565b90501180156110af575060015f83815260088301602052604090205460ff1660058111156110ad576110ad614119565b145b6110cb5760405162461bcd60e51b815260040161043b90614460565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614315565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061114d575080546001600160401b03808416911610155b1561116b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556111968484613090565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611233573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261125a91908101906144b2565b91509150806112bd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611300573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132491906142fe565b8251146113885760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156113fe5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061140d84604001516130aa565b9150915081871461147a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206147d38339815191526020526040812060030180545f80516020614793833981519152916001600160401b03909116908190846114c983614584565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611500613e36565b5f8281525f805160206147d38339815191526020526040908190208151610100810190925280545f80516020614793833981519152929190829060ff16600581111561154e5761154e614119565b600581111561155f5761155f614119565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206147d3833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611698576116588160016145a9565b611663906008614449565b5081515f9083908390811061167a5761167a6145bc565b60200101906001600160f81b03191690815f1a905350600101611644565b505f5b60048110156116fb576116af8160036145a9565b6116ba906008614449565b6001901c60f81b826116cd8360026145d0565b815181106116dd576116dd6145bc565b60200101906001600160f81b03191690815f1a90535060010161169b565b505f5b602081101561175d5761171281601f6145a9565b61171d906008614449565b86901c60f81b8261172f8360066145d0565b8151811061173f5761173f6145bc565b60200101906001600160f81b03191690815f1a9053506001016116fe565b505f5b60088110156117c8576117748160076145a9565b61177f906008614449565b6001600160401b038616901c60f81b8261179a8360266145d0565b815181106117aa576117aa6145bc565b60200101906001600160f81b03191690815f1a905350600101611760565b505f5b6008811015611833576117df8160076145a9565b6117ea906008614449565b6001600160401b038516901c60f81b8261180583602e6145d0565b81518110611815576118156145bc565b60200101906001600160f81b03191690815f1a9053506001016117cb565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061475383398151915292919061188490614168565b90501180156118b6575060035f83815260038301602052604090205460ff1660048111156118b4576118b4614119565b145b6109675760405162461bcd60e51b815260206004820152603360248201525f8051602061477383398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b611913613e36565b5f805160206147938339815191525f61192b84611cce565b90505f8061193c8360400151612eef565b9150915080156119a15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600885016020526040808220815161010081019092528054829060ff1660058111156119d3576119d3614119565b60058111156119e4576119e4614119565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a6b57611a6b614119565b1480611a895750600182516005811115611a8757611a87614119565b145b611ae85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611afd57611afd614119565b03611b2457505f8381526007860160205260408120600491611b1f9190613dff565b611b28565b5060055b6020808301515f90815260098801909152604081205581816005811115611b5157611b51614119565b90816005811115611b6457611b64614119565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611b9857611b98614119565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c6357611c63614119565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610967906001600160a01b03168284613282565b60408051606080820183525f8083526020830181905292820152905f805160206147938339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d6a91908101906144b2565b9150915080611dd15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e345760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ea75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611ed35760405162461bcd60e51b815260040161043b906145e3565b5f805b6002811015611f2257611eea8160016145a9565b611ef5906008614449565b61ffff16868281518110611f0b57611f0b6145bc565b016020015160f81c901b9190911790600101611ed6565b5061ffff811615611f455760405162461bcd60e51b815260040161043b9061462c565b5f805b6004811015611fa057611f5c8160036145a9565b611f67906008614449565b63ffffffff1687611f798360026145d0565b81518110611f8957611f896145bc565b016020015160f81c901b9190911790600101611f48565b5063ffffffff8116600314611fc75760405162461bcd60e51b815260040161043b9061466f565b5f805b602081101561201c57611fde81601f6145a9565b611fe9906008614449565b88611ff58360066145d0565b81518110612005576120056145bc565b016020015160f81c901b9190911790600101611fca565b505f805b600881101561207b576120348160076145a9565b61203f906008614449565b6001600160401b0316896120548360266145d0565b81518110612064576120646145bc565b016020015160f81c901b9190911790600101612020565b505f805b60088110156120da576120938160076145a9565b61209e906008614449565b6001600160401b03168a6120b383602e6145d0565b815181106120c3576120c36145bc565b016020015160f81c901b919091179060010161207f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061475383398151915292919061213290614168565b9050118015612164575060015f83815260038301602052604090205460ff16600481111561216257612162614119565b145b6109675760405162461bcd60e51b815260206004820152603860248201525f8051602061477383398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f805160206147d383398151915260205260408082208151610100810190925280545f8051602061479383398151915293929190829060ff16600581111561221157612211614119565b600581111561222257612222614119565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122aa576122aa614119565b146123065760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146123805760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156123c4576123c4614119565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124908461248a81611484565b5f61161f565b5f85815260078501602052604090209091506124ac82826141eb565b506124ba8260a001516132e1565b8160a001516001600160401b031683600a015f8282546124da91906145a9565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061250b9085906004016142cc565b6020604051808303815f875af1158015612527573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254b91906142fe565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f80516020614753833981519152816125b984613494565b90505f6125c58261092a565b83549091506001600160401b038216108015906125ef57508260010154816001600160401b031611155b610c2e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f6126566134ca565b5f80516020614793833981519152426001600160401b038516116126d85760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b0384166126ef426202a3006145d0565b116127625760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b856127b95760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600982016020526040902054156128275760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b825160301461288e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b5f806128d56040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613501565b5f828152600686016020526040902091935091506128f382826141eb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129209085906004016142cc565b6020604051808303815f875af115801561293c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296091906142fe565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff191660018360058111156129e2576129e2614119565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612aa3886132e1565b876001600160401b031684600a015f828254612abf91906145d0565b90915550612ace905083611484565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610c2e60015f805160206147b383398151915255565b5f612b3d6134ca565b5f612b4a6101af84613494565b90505f805160206147538339815191525f612b64876114f8565b9050600281516005811115612b7b57612b7b614119565b14612bda5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612beb91906146b6565b9050612bf788826115d7565b5f612c0189611484565b90505f898983604051602001612c499392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612c6a866132e1565b5f612c768b848661161f565b5f8381526004880160205260409020909150612c9282826141eb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cbf9085906004016142cc565b6020604051808303815f875af1158015612cdb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cff91906142fe565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612dae57612dae614119565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610e7160015f805160206147b383398151915255565b5f808251602714612f125760405162461bcd60e51b815260040161043b906145e3565b5f805b6002811015612f6157612f298160016145a9565b612f34906008614449565b61ffff16858281518110612f4a57612f4a6145bc565b016020015160f81c901b9190911790600101612f15565b5061ffff811615612f845760405162461bcd60e51b815260040161043b9061462c565b5f805b6004811015612fdf57612f9b8160036145a9565b612fa6906008614449565b63ffffffff1686612fb88360026145d0565b81518110612fc857612fc86145bc565b016020015160f81c901b9190911790600101612f87565b5063ffffffff81166002146130065760405162461bcd60e51b815260040161043b9061466f565b5f805b602081101561305b5761301d81601f6145a9565b613028906008614449565b876130348360066145d0565b81518110613044576130446145bc565b016020015160f81c901b9190911790600101613009565b505f86602681518110613070576130706145bc565b016020015191976001600160f81b03199092161515965090945050505050565b6130986138b9565b6130a182613904565b6109678161394b565b5f808251602e146130cd5760405162461bcd60e51b815260040161043b906145e3565b5f805b600281101561311c576130e48160016145a9565b6130ef906008614449565b61ffff16858281518110613105576131056145bc565b016020015160f81c901b91909117906001016130d0565b5061ffff81161561313f5760405162461bcd60e51b815260040161043b9061462c565b5f805b600481101561319a576131568160036145a9565b613161906008614449565b63ffffffff16866131738360026145d0565b81518110613183576131836145bc565b016020015160f81c901b9190911790600101613142565b5063ffffffff81166004146131c15760405162461bcd60e51b815260040161043b9061466f565b5f805b6020811015613216576131d881601f6145a9565b6131e3906008614449565b876131ef8360066145d0565b815181106131ff576131ff6145bc565b016020015160f81c901b91909117906001016131c4565b505f805b60088110156132755761322e8160076145a9565b613239906008614449565b6001600160401b03168861324e8360266145d0565b8151811061325e5761325e6145bc565b016020015160f81c901b919091179060010161321a565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506139ff565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061479383398151915290600160401b900460ff165f03613326575050565b6040805160608101825260038301548082526004840154602083015260058401546001600160401b039081169383019390935260028401544293169061336c90846145a9565b10613392576001600160401b0384166040820152818152600a83015460208201526133b1565b83816040018181516133a491906146b6565b6001600160401b03169052505b5f8160200151826040015160646133c891906146d6565b6001600160401b03166133db919061439f565b600285015490915060ff600160401b909104811690821611156134565760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043b565b508051600384015560208101516004840155604001516005909201805467ffffffffffffffff19166001600160401b03909316929092179091555050565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a60565b5f805160206147b38339815191528054600119016134fb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461356b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156135e2576135a28160016145a9565b6135ad906008614449565b5081515f908390839081106135c4576135c46145bc565b60200101906001600160f81b03191690815f1a90535060010161358e565b505f5b6004811015613640576135f98160036145a9565b613604906008614449565b505f826136128360026145d0565b81518110613622576136226145bc565b60200101906001600160f81b03191690815f1a9053506001016135e5565b505f5b602081101561369d578451816020811061365f5761365f6145bc565b1a60f81b8261366f8360066145d0565b8151811061367f5761367f6145bc565b60200101906001600160f81b03191690815f1a905350600101613643565b505f5b60208110156136fd57846020015181602081106136bf576136bf6145bc565b1a60f81b826136cf8360266145d0565b815181106136df576136df6145bc565b60200101906001600160f81b03191690815f1a9053506001016136a0565b505f5b6008811015613771576137148160076145a9565b61371f906008614449565b60ff1685604001516001600160401b0316901c60f81b8282604661374391906145d0565b81518110613753576137536145bc565b60200101906001600160f81b03191690815f1a905350600101613700565b505f5b60308110156137dc5784608001518181518110613793576137936145bc565b01602001516001600160f81b031916826137ae83604e6145d0565b815181106137be576137be6145bc565b60200101906001600160f81b03191690815f1a905350600101613774565b505f5b600881101561384e576137f38160076145a9565b6137fe906008614449565b60608601516001600160401b0390811691161c60f81b8261382083607e6145d0565b81518110613830576138306145bc565b60200101906001600160f81b03191690815f1a9053506001016137df565b5060028160405161385f9190614701565b602060405180830381855afa15801561387a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061389d91906142fe565b94909350915050565b60015f805160206147b383398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661390257604051631afcd79f60e31b815260040160405180910390fd5b565b61390c6138b9565b61391581613bc2565b613948608082013560a083013561393260e0850160c08601613f60565b613943610100860160e0870161471c565b613be3565b50565b6139536138b9565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166139df5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613a136001600160a01b03841683613c3e565b905080515f14158015613a37575080806020019051810190613a359190614737565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613aa6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613aca91906142fe565b9050613ae16001600160a01b038516333086613c4b565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613b25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b4991906142fe565b9050818111613baf5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613bb982826145a9565b95945050505050565b613bca6138b9565b613bd2613c8a565b613bda613c9a565b61394881613ca2565b613beb6138b9565b5f5f80516020614753833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6060610e7183835f613ce3565b6040516001600160a01b038481166024830152838116604483015260648201839052613c849186918216906323b872dd906084016132af565b50505050565b613c926138b9565b613902613d72565b6139026138b9565b613caa6138b9565b80355f8051602061479383398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b606081471015613d085760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613d239190614701565b5f6040518083038185875af1925050503d805f8114613d5d576040519150601f19603f3d011682016040523d82523d5f602084013e613d62565b606091505b509150915061147a868383613d7a565b6138a66138b9565b606082613d8f57613d8a82613dd6565b610e71565b8151158015613da657506001600160a01b0384163b155b15613dcf57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610e71565b805115613de65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613e0b90614168565b5f825580601f10613e1a575050565b601f0160209004905f5260205f20908101906139489190613e7a565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613e8e575f8155600101613e7b565b5090565b8015158114613948575f80fd5b803563ffffffff81168114613eb2575f80fd5b919050565b5f805f60608486031215613ec9575f80fd5b833592506020840135613edb81613e92565b9150613ee960408501613e9f565b90509250925092565b5f60208284031215613f02575f80fd5b5035919050565b5f60208284031215613f19575f80fd5b610e7182613e9f565b5f8060408385031215613f33575f80fd5b613f3c83613e9f565b946020939093013593505050565b80356001600160401b0381168114613eb2575f80fd5b5f60208284031215613f70575f80fd5b610e7182613f4a565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613faf57613faf613f79565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613fdd57613fdd613f79565b604052919050565b5f6001600160401b03821115613ffd57613ffd613f79565b50601f01601f191660200190565b5f805f806080858703121561401e575f80fd5b843593506020850135925061403560408601613f4a565b915060608501356001600160401b0381111561404f575f80fd5b8501601f8101871361405f575f80fd5b803561407261406d82613fe5565b613fb5565b818152886020838501011115614086575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156140b8575f80fd5b50508035926020909101359150565b6001600160a01b0381168114613948575f80fd5b5f808284036101208112156140ee575f80fd5b610100808212156140fd575f80fd5b849350830135905061410e816140c7565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156141615761416161412d565b5092915050565b600181811c9082168061417c57607f821691505b60208210810361419a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156141c55750805b601f840160051c820191505b818110156141e4575f81556001016141d1565b5050505050565b81516001600160401b0381111561420457614204613f79565b614218816142128454614168565b846141a0565b602080601f83116001811461424b575f84156142345750858301515b5f19600386901b1c1916600185901b1785556142a2565b5f85815260208120601f198616915b828110156142795788860151825594840194600190910190840161425a565b508582101561429657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156142c45781810151838201526020016142ac565b50505f910152565b602081525f82518060208401526142ea8160408501602087016142aa565b601f01601f19169190910160400192915050565b5f6020828403121561430e575f80fd5b5051919050565b5f60208083525f845461432781614168565b806020870152604060018084165f8114614348576001811461436457614391565b60ff19851660408a0152604084151560051b8a01019550614391565b895f5260205f205f5b858110156143885781548b820186015290830190880161436d565b8a016040019650505b509398975050505050505050565b5f826143b957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a61412d565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613eb281613e92565b5f80604083850312156144c3575f80fd5b82516001600160401b03808211156144d9575f80fd5b90840190606082870312156144ec575f80fd5b6144f4613f8d565b82518152602080840151614507816140c7565b8282015260408401518381111561451c575f80fd5b80850194505087601f850112614530575f80fd5b8351925061454061406d84613fe5565b8381528882858701011115614553575f80fd5b614562848383018488016142aa565b806040840152508195506145778188016144a7565b9450505050509250929050565b5f6001600160401b0380831681810361459f5761459f61412d565b6001019392505050565b8181038181111561093a5761093a61412d565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561093a5761093a61412d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156141615761416161412d565b6001600160401b038181168382160280821691908281146146f9576146f961412d565b505092915050565b5f82516147128184602087016142aa565b9190910192915050565b5f6020828403121561472c575f80fd5b8135610e71816140c7565b5f60208284031215614747575f80fd5b8151610e7181613e9256fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614a95380380614a9583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149488061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063b771b3bc1461028a578063bee0a03f146102b0578063e74e8cab146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872fda641461023e57806398f3e2b414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613fe0565b6102d6565b005b61012861013836600461401b565b610772565b61017b61014b36600461401b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b61012861019c36600461401b565b6108ce565b6101b46101af36600461401b565b61093b565b6040516001600160401b039091168152602001610185565b6101286101da366004614032565b610951565b6101286101ed36600461404b565b61097c565b61017b610200366004614089565b610b6d565b6101b461021336600461401b565b610b86565b61012861022636600461401b565b610b9a565b610128610239366004613fe0565b610c07565b61017b61024c366004614134565b610c22565b61012861025f36600461404b565b610c47565b61017b6102723660046141d0565b610e76565b610128610285366004614032565b610e89565b6102986005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102be36600461401b565b611046565b6101286102d1366004614204565b611115565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061489c8339815191529184156103285761032582856111f4565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614242565b600481111561036b5761036b614242565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614242565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206148bc8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206148bc8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611490565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500614242565b021790555060208201518154610100600160a81b0319166101006001600160a01b039092169190910217815560408201516001820155606080830151600283018054608086015160a087015160c08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909301516003909201805467ffffffffffffffff191692909316919091179091558201516105d990611504565b5f6105e385611511565b905082606001516001600160401b03168160a001516001600160401b03161161065a5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161066f919061426a565b905061067b86826115f0565b5f610687878584611638565b5f8c815260058a01602052604090209091506106a38282614314565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106d09085906004016143f5565b6020604051808303815f875af11580156106ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107109190614427565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f805160206148dc8339815191529291906107ba90614291565b90501180156107ec575060035f83815260098301602052604090205460ff1660058111156107ea576107ea614242565b145b6108505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610889919060040161443e565b6020604051808303815f875af11580156108a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c99190614427565b505050565b6108d781611855565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061489c833981519152916005600160991b019163ee5b48eb916108899160040161443e565b5f61094b64e8d4a51000836144c8565b92915050565b5f61095b82611924565b905061097881606001516001600160401b03168260400151611cb1565b5050565b5f8051602061489c8339815191525f61099484611ce7565b90505f806109a58360400151611ec8565b50915091506109b385612103565b5f85815260048501602052604081206109cb91613f28565b5f6109d583611511565b9050816001600160401b031681608001516001600160401b03161015610a0d5760405162461bcd60e51b815260040161043b906144e7565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610a525760405162461bcd60e51b815260040161043b90614529565b60015f87815260038701602052604090205460ff166004811115610a7857610a78614242565b14610ae15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61094b6001600160401b03831664e8d4a51000614572565b5f610b9082611511565b60a0015192915050565b610ba381612103565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061489c833981519152916005600160991b019163ee5b48eb916108899160040161443e565b8115610c1957610c1783826111f4565b505b6108c9836121dc565b5f80610c2d86612594565b9050610c3b85828686612641565b9150505b949350505050565b5f8051602061489c8339815191525f610c5f84611ce7565b90505f80610c708360400151611ec8565b5091509150610c7e85611855565b5f8581526005850160205260408120610c9691613f28565b5f610ca083611511565b9050816001600160401b031681608001516001600160401b03161015610cd85760405162461bcd60e51b815260040161043b906144e7565b5f8681526003808701602052604090912001546001600160401b0380841691161115610d165760405162461bcd60e51b815260040161043b90614529565b60035f87815260038701602052604090205460ff166004811115610d3c57610d3c614242565b14610d905760405162461bcd60e51b815260206004820152603160248201525f805160206148bc8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610e349190611cb1565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610e82833384612b06565b9392505050565b5f805160206148dc8339815191525f610ea183611ce7565b90505f80610eb28360400151612ec1565b9150915080610f145760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260078501602052604081208054610f2e90614291565b9050118015610f60575060015f83815260098601602052604090205460ff166005811115610f5e57610f5e614242565b145b610f7c5760405162461bcd60e51b815260040161043b90614589565b5f8281526007850160205260408120610f9491613f28565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206148dc83398151915292919061108e90614291565b90501180156110c0575060015f83815260098301602052604090205460ff1660058111156110be576110be614242565b145b6110dc5760405162461bcd60e51b815260040161043b90614589565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610889919060040161443e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061115e575080546001600160401b03808416911610155b1561117c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556111a78484613062565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561123f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261126691908101906145db565b91509150806112c95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561130c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113309190614427565b8251146113945760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b03161561140a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f80611419846040015161307c565b915091508187146114865760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f8051602061491c8339815191526020526040812060030180545f805160206148dc833981519152916001600160401b03909116908190846114d5836146ad565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61150e815f613254565b50565b611519613f5f565b5f8281525f8051602061491c8339815191526020526040908190208151610100810190925280545f805160206148dc833981519152929190829060ff16600581111561156757611567614242565b600581111561157857611578614242565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061491c833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116b1576116718160016146d2565b61167c906008614572565b5081515f90839083908110611693576116936146e5565b60200101906001600160f81b03191690815f1a90535060010161165d565b505f5b6004811015611714576116c88160036146d2565b6116d3906008614572565b6001901c60f81b826116e68360026146f9565b815181106116f6576116f66146e5565b60200101906001600160f81b03191690815f1a9053506001016116b4565b505f5b60208110156117765761172b81601f6146d2565b611736906008614572565b86901c60f81b826117488360066146f9565b81518110611758576117586146e5565b60200101906001600160f81b03191690815f1a905350600101611717565b505f5b60088110156117e15761178d8160076146d2565b611798906008614572565b6001600160401b038616901c60f81b826117b38360266146f9565b815181106117c3576117c36146e5565b60200101906001600160f81b03191690815f1a905350600101611779565b505f5b600881101561184c576117f88160076146d2565b611803906008614572565b6001600160401b038516901c60f81b8261181e83602e6146f9565b8151811061182e5761182e6146e5565b60200101906001600160f81b03191690815f1a9053506001016117e4565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061489c83398151915292919061189d90614291565b90501180156118cf575060035f83815260038301602052604090205460ff1660048111156118cd576118cd614242565b145b6109785760405162461bcd60e51b815260206004820152603360248201525f805160206148bc83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b61192c613f5f565b5f805160206148dc8339815191525f61194484611ce7565b90505f806119558360400151612ec1565b9150915080156119ba5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600985016020526040808220815161010081019092528054829060ff1660058111156119ec576119ec614242565b60058111156119fd576119fd614242565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8457611a84614242565b1480611aa25750600182516005811115611aa057611aa0614242565b145b611b015760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1657611b16614242565b03611b3d57505f8381526008860160205260408120600491611b389190613f28565b611b41565b5060055b6020808301515f908152600a8801909152604081205581816005811115611b6a57611b6a614242565b90816005811115611b7d57611b7d614242565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115611bb157611bb1614242565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c7c57611c7c614242565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610978906001600160a01b03168284613466565b60408051606080820183525f8083526020830181905292820152905f805160206148dc8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d8391908101906145db565b9150915080611dea5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e4d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ec05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611eec5760405162461bcd60e51b815260040161043b9061470c565b5f805b6002811015611f3b57611f038160016146d2565b611f0e906008614572565b61ffff16868281518110611f2457611f246146e5565b016020015160f81c901b9190911790600101611eef565b5061ffff811615611f5e5760405162461bcd60e51b815260040161043b90614755565b5f805b6004811015611fb957611f758160036146d2565b611f80906008614572565b63ffffffff1687611f928360026146f9565b81518110611fa257611fa26146e5565b016020015160f81c901b9190911790600101611f61565b5063ffffffff8116600314611fe05760405162461bcd60e51b815260040161043b90614798565b5f805b602081101561203557611ff781601f6146d2565b612002906008614572565b8861200e8360066146f9565b8151811061201e5761201e6146e5565b016020015160f81c901b9190911790600101611fe3565b505f805b60088110156120945761204d8160076146d2565b612058906008614572565b6001600160401b03168961206d8360266146f9565b8151811061207d5761207d6146e5565b016020015160f81c901b9190911790600101612039565b505f805b60088110156120f3576120ac8160076146d2565b6120b7906008614572565b6001600160401b03168a6120cc83602e6146f9565b815181106120dc576120dc6146e5565b016020015160f81c901b9190911790600101612098565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061489c83398151915292919061214b90614291565b905011801561217d575060015f83815260038301602052604090205460ff16600481111561217b5761217b614242565b145b6109785760405162461bcd60e51b815260206004820152603860248201525f805160206148bc83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061491c83398151915260205260408082208151610100810190925280545f805160206148dc83398151915293929190829060ff16600581111561222a5761222a614242565b600581111561223b5761223b614242565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122c3576122c3614242565b1461231f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146123995760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff191660018360058111156123dd576123dd614242565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124a9846124a381611490565b5f611638565b5f85815260088501602052604090209091506124c58282614314565b506124d38260a00151611504565b60405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124ff9085906004016143f5565b6020604051808303815f875af115801561251b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253f9190614427565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061489c833981519152816125ad846134c5565b90505f6125b98261093b565b83549091506001600160401b038216108015906125e357508260010154816001600160401b031611155b610c3f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61264a6134fb565b5f805160206148dc833981519152426001600160401b038516116126cc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b0384166126e3426202a3006146f9565b116127565760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b856127ad5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600a820160205260409020541561281b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128825760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b5f806128c96040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613532565b5f828152600786016020526040902091935091506128e78282614314565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129149085906004016143f5565b6020604051808303815f875af1158015612930573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129549190614427565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff191660018360058111156129d6576129d6614242565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612a97886138d7565b612aa083611490565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610c3f60015f805160206148fc83398151915255565b5f612b0f6134fb565b5f612b1c6101af846134c5565b90505f8051602061489c8339815191525f612b3687611511565b9050600281516005811115612b4d57612b4d614242565b14612bac5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612bbd91906147df565b9050612bc988826115f0565b5f612bd389611490565b90505f898983604051602001612c1b9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612c3c866138d7565b5f612c488b8486611638565b5f8381526004880160205260409020909150612c648282614314565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c919085906004016143f5565b6020604051808303815f875af1158015612cad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cd19190614427565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d8057612d80614242565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610e8260015f805160206148fc83398151915255565b5f808251602714612ee45760405162461bcd60e51b815260040161043b9061470c565b5f805b6002811015612f3357612efb8160016146d2565b612f06906008614572565b61ffff16858281518110612f1c57612f1c6146e5565b016020015160f81c901b9190911790600101612ee7565b5061ffff811615612f565760405162461bcd60e51b815260040161043b90614755565b5f805b6004811015612fb157612f6d8160036146d2565b612f78906008614572565b63ffffffff1686612f8a8360026146f9565b81518110612f9a57612f9a6146e5565b016020015160f81c901b9190911790600101612f59565b5063ffffffff8116600214612fd85760405162461bcd60e51b815260040161043b90614798565b5f805b602081101561302d57612fef81601f6146d2565b612ffa906008614572565b876130068360066146f9565b81518110613016576130166146e5565b016020015160f81c901b9190911790600101612fdb565b505f86602681518110613042576130426146e5565b016020015191976001600160f81b03199092161515965090945050505050565b61306a6138f5565b61307382613940565b61097881613984565b5f808251602e1461309f5760405162461bcd60e51b815260040161043b9061470c565b5f805b60028110156130ee576130b68160016146d2565b6130c1906008614572565b61ffff168582815181106130d7576130d76146e5565b016020015160f81c901b91909117906001016130a2565b5061ffff8116156131115760405162461bcd60e51b815260040161043b90614755565b5f805b600481101561316c576131288160036146d2565b613133906008614572565b63ffffffff16866131458360026146f9565b81518110613155576131556146e5565b016020015160f81c901b9190911790600101613114565b5063ffffffff81166004146131935760405162461bcd60e51b815260040161043b90614798565b5f805b60208110156131e8576131aa81601f6146d2565b6131b5906008614572565b876131c18360066146f9565b815181106131d1576131d16146e5565b016020015160f81c901b9190911790600101613196565b505f805b6008811015613247576132008160076146d2565b61320b906008614572565b6001600160401b0316886132208360266146f9565b81518110613230576132306146e5565b016020015160f81c901b91909117906001016131ec565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206148dc83398151915290600160401b900460ff165f0361329a57505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b039081166060830152600284015442939116906132eb90846146d2565b10613311576001600160401b038516606082015281815260408101516020820152613330565b848160600181815161332391906147df565b6001600160401b03169052505b5f81602001518260600151606461334791906147ff565b6001600160401b031661335a91906144c8565b600285015490915060ff600160401b909104811690821611156133d55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043b565b84156133fe57856001600160401b0316826040018181516133f691906146f9565b90525061341d565b856001600160401b03168260400181815161341991906146d2565b9052505b50805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b6040516001600160a01b038381166024830152604482018390526108c991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613a38565b5f61094b827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a99565b5f805160206148fc83398151915280546001190161352c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461359c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613613576135d38160016146d2565b6135de906008614572565b5081515f908390839081106135f5576135f56146e5565b60200101906001600160f81b03191690815f1a9053506001016135bf565b505f5b60048110156136715761362a8160036146d2565b613635906008614572565b505f826136438360026146f9565b81518110613653576136536146e5565b60200101906001600160f81b03191690815f1a905350600101613616565b505f5b60208110156136ce5784518160208110613690576136906146e5565b1a60f81b826136a08360066146f9565b815181106136b0576136b06146e5565b60200101906001600160f81b03191690815f1a905350600101613674565b505f5b602081101561372e57846020015181602081106136f0576136f06146e5565b1a60f81b826137008360266146f9565b81518110613710576137106146e5565b60200101906001600160f81b03191690815f1a9053506001016136d1565b505f5b60088110156137a2576137458160076146d2565b613750906008614572565b60ff1685604001516001600160401b0316901c60f81b8282604661377491906146f9565b81518110613784576137846146e5565b60200101906001600160f81b03191690815f1a905350600101613731565b505f5b603081101561380d57846080015181815181106137c4576137c46146e5565b01602001516001600160f81b031916826137df83604e6146f9565b815181106137ef576137ef6146e5565b60200101906001600160f81b03191690815f1a9053506001016137a5565b505f5b600881101561387f576138248160076146d2565b61382f906008614572565b60608601516001600160401b0390811691161c60f81b8261385183607e6146f9565b81518110613861576138616146e5565b60200101906001600160f81b03191690815f1a905350600101613810565b50600281604051613890919061482a565b602060405180830381855afa1580156138ab573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138ce9190614427565b94909350915050565b61150e816001613254565b60015f805160206148fc83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661393e57604051631afcd79f60e31b815260040160405180910390fd5b565b6139486138f5565b61395181613bfb565b61150e608082013560a083013561396e60e0850160c08601614089565b61397f610100860160e08701614845565b613c1c565b61398c6138f5565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613a185760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613a4c6001600160a01b03841683613c77565b905080515f14158015613a70575080806020019051810190613a6e9190614860565b155b156108c957604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613adf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b039190614427565b9050613b1a6001600160a01b038516333086613c84565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613b5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b829190614427565b9050818111613be85760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613bf282826146d2565b95945050505050565b613c036138f5565b613c0b613cc3565b613c13613cd3565b61150e81613cdb565b613c246138f5565b5f5f8051602061489c833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6060610e8283835f613e0c565b6040516001600160a01b038481166024830152838116604483015260648201839052613cbd9186918216906323b872dd90608401613493565b50505050565b613ccb6138f5565b61393e613e9b565b61393e6138f5565b613ce36138f5565b80355f805160206148dc83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613d2f608084016060850161487b565b60ff161115613d9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043b565b613dac608083016060840161487b565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613ddd6060830160408401614089565b60028201805467ffffffffffffffff19166001600160401b039290921691909117905561271060059091015550565b606081471015613e315760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613e4c919061482a565b5f6040518083038185875af1925050503d805f8114613e86576040519150601f19603f3d011682016040523d82523d5f602084013e613e8b565b606091505b5091509150611486868383613ea3565b6138e26138f5565b606082613eb857613eb382613eff565b610e82565b8151158015613ecf57506001600160a01b0384163b155b15613ef857604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610e82565b805115613f0f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613f3490614291565b5f825580601f10613f43575050565b601f0160209004905f5260205f209081019061150e9190613fa3565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613fb7575f8155600101613fa4565b5090565b801515811461150e575f80fd5b803563ffffffff81168114613fdb575f80fd5b919050565b5f805f60608486031215613ff2575f80fd5b83359250602084013561400481613fbb565b915061401260408501613fc8565b90509250925092565b5f6020828403121561402b575f80fd5b5035919050565b5f60208284031215614042575f80fd5b610e8282613fc8565b5f806040838503121561405c575f80fd5b61406583613fc8565b946020939093013593505050565b80356001600160401b0381168114613fdb575f80fd5b5f60208284031215614099575f80fd5b610e8282614073565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156140d8576140d86140a2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614106576141066140a2565b604052919050565b5f6001600160401b03821115614126576141266140a2565b50601f01601f191660200190565b5f805f8060808587031215614147575f80fd5b843593506020850135925061415e60408601614073565b915060608501356001600160401b03811115614178575f80fd5b8501601f81018713614188575f80fd5b803561419b6141968261410e565b6140de565b8181528860208385010111156141af575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156141e1575f80fd5b50508035926020909101359150565b6001600160a01b038116811461150e575f80fd5b5f80828403610120811215614217575f80fd5b61010080821215614226575f80fd5b8493508301359050614237816141f0565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561428a5761428a614256565b5092915050565b600181811c908216806142a557607f821691505b6020821081036142c357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108c957805f5260205f20601f840160051c810160208510156142ee5750805b601f840160051c820191505b8181101561430d575f81556001016142fa565b5050505050565b81516001600160401b0381111561432d5761432d6140a2565b6143418161433b8454614291565b846142c9565b602080601f831160018114614374575f841561435d5750858301515b5f19600386901b1c1916600185901b1785556143cb565b5f85815260208120601f198616915b828110156143a257888601518255948401946001909101908401614383565b50858210156143bf57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156143ed5781810151838201526020016143d5565b50505f910152565b602081525f82518060208401526144138160408501602087016143d3565b601f01601f19169190910160400192915050565b5f60208284031215614437575f80fd5b5051919050565b5f60208083525f845461445081614291565b806020870152604060018084165f8114614471576001811461448d576144ba565b60ff19851660408a0152604084151560051b8a010195506144ba565b895f5260205f205f5b858110156144b15781548b8201860152908301908801614496565b8a016040019650505b509398975050505050505050565b5f826144e257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761094b5761094b614256565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613fdb81613fbb565b5f80604083850312156145ec575f80fd5b82516001600160401b0380821115614602575f80fd5b9084019060608287031215614615575f80fd5b61461d6140b6565b82518152602080840151614630816141f0565b82820152604084015183811115614645575f80fd5b80850194505087601f850112614659575f80fd5b835192506146696141968461410e565b838152888285870101111561467c575f80fd5b61468b848383018488016143d3565b806040840152508195506146a08188016145d0565b9450505050509250929050565b5f6001600160401b038083168181036146c8576146c8614256565b6001019392505050565b8181038181111561094b5761094b614256565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561094b5761094b614256565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561428a5761428a614256565b6001600160401b0381811683821602808216919082811461482257614822614256565b505092915050565b5f825161483b8184602087016143d3565b9190910192915050565b5f60208284031215614855575f80fd5b8135610e82816141f0565b5f60208284031215614870575f80fd5b8151610e8281613fbb565b5f6020828403121561488b575f80fd5b813560ff81168114610e82575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 30e59f1cd..f2c847684 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -49,7 +49,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161457938038061457983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61442c8061014d5f395ff3fe608060405260043610610105575f3560e01c80636d0e43fa11610092578063a3a65e4811610062578063a3a65e48146102f4578063b771b3bc14610313578063bee0a03f14610345578063c599e24f14610364578063f40797d714610377575f80fd5b80636d0e43fa1461027857806376f78621146102975780637978da3a146102b657806398f3e2b4146102d5575f80fd5b80632e2194d8116100d85780632e2194d8146101c5578063467ef06f146101fc5780635297fae61461021b578063620658561461023a57806366435abf14610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063162f1f61146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613b56565b61038a565b005b348015610135575f80fd5b50610128610144366004613b91565b610815565b348015610154575f80fd5b50610193610163366004613b91565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101b1575f80fd5b506101286101c0366004613b91565b610971565b3480156101d0575f80fd5b506101e46101df366004613b91565b6109de565b6040516001600160401b03909116815260200161019d565b348015610207575f80fd5b50610128610216366004613ba8565b6109f4565b348015610226575f80fd5b50610128610235366004613bc1565b610a1f565b348015610245575f80fd5b50610193610254366004613bff565b610c10565b348015610264575f80fd5b506101e4610273366004613b91565b610c29565b348015610283575f80fd5b50610128610292366004613b91565b610c3d565b3480156102a2575f80fd5b506101286102b1366004613b56565b610caa565b3480156102c1575f80fd5b506101286102d0366004613c18565b610cc5565b3480156102e0575f80fd5b506101286102ef366004613bc1565b610da7565b3480156102ff575f80fd5b5061012861030e366004613ba8565b610fd6565b34801561031e575f80fd5b5061032d6005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610350575f80fd5b5061012861035f366004613b91565b611193565b610193610372366004613b91565b611262565b610193610385366004613cc1565b61126e565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206143808339815191529184156103dc576103d98285611292565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613d53565b600481111561041f5761041f613d53565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613d53565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206143a08339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206143a08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f6105678461152e565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613d53565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610686856115a2565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107129190613d7b565b905061071e8682611681565b5f61072a8785846116c9565b5f8c815260058a01602052604090209091506107468282613e1f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610773908590600401613f00565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190613f32565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206143c083398151915292919061085d90613da2565b905011801561088f575060035f83815260088301602052604090205460ff16600581111561088d5761088d613d53565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401613f49565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190613f32565b505050565b61097a816118e6565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614380833981519152916005600160991b019163ee5b48eb9161092c91600401613f49565b5f6109ee64e8d4a5100083613fd3565b92915050565b5f6109fe826119b5565b9050610a1b81606001516001600160401b03168260400151611d42565b5050565b5f805160206143808339815191525f610a3784611d55565b90505f80610a488360400151611f36565b5091509150610a5685612171565b5f8581526004850160205260408120610a6e91613a9e565b5f610a78836115a2565b9050816001600160401b031681608001516001600160401b03161015610ab05760405162461bcd60e51b81526004016104ef90613ff2565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610af55760405162461bcd60e51b81526004016104ef90614034565b60015f87815260038701602052604090205460ff166004811115610b1b57610b1b613d53565b14610b845760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109ee6001600160401b03831664e8d4a5100061407d565b5f610c33826115a2565b60a0015192915050565b610c4681612171565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614380833981519152916005600160991b019163ee5b48eb9161092c91600401613f49565b8115610cbc57610cba8382611292565b505b61096c8361224a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d0e575080546001600160401b03808416911610155b15610d2c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610d5683612627565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f805160206143808339815191525f610dbf84611d55565b90505f80610dd08360400151611f36565b5091509150610dde856118e6565b5f8581526005850160205260408120610df691613a9e565b5f610e00836115a2565b9050816001600160401b031681608001516001600160401b03161015610e385760405162461bcd60e51b81526004016104ef90613ff2565b5f8681526003808701602052604090912001546001600160401b0380841691161115610e765760405162461bcd60e51b81526004016104ef90614034565b60035f87815260038701602052604090205460ff166004811115610e9c57610e9c613d53565b14610ef05760405162461bcd60e51b815260206004820152603160248201525f805160206143a08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f949190611d42565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206143c08339815191525f610fee83611d55565b90505f80610fff836040015161263b565b91509150806110615760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526006850160205260408120805461107b90613da2565b90501180156110ad575060015f83815260088601602052604090205460ff1660058111156110ab576110ab613d53565b145b6110c95760405162461bcd60e51b81526004016104ef90614094565b5f82815260068501602052604081206110e191613a9e565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206143c08339815191529291906111db90613da2565b905011801561120d575060015f83815260088301602052604090205460ff16600581111561120b5761120b613d53565b145b6112295760405162461bcd60e51b81526004016104ef90614094565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401613f49565b5f6109ee8233346127dc565b5f8061127934612b94565b905061128785828686612c3e565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112dd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261130491908101906140fa565b91509150806113675760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ce9190613f32565b8251146114325760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156114a85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806114b78460400151613125565b915091508187146115245760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206144008339815191526020526040812060030180545f805160206143c0833981519152916001600160401b0390911690819084611573836141cc565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115aa613ad5565b5f8281525f805160206144008339815191526020526040908190208151610100810190925280545f805160206143c0833981519152929190829060ff1660058111156115f8576115f8613d53565b600581111561160957611609613d53565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614400833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611742576117028160016141f1565b61170d90600861407d565b5081515f9083908390811061172457611724614204565b60200101906001600160f81b03191690815f1a9053506001016116ee565b505f5b60048110156117a5576117598160036141f1565b61176490600861407d565b6001901c60f81b82611777836002614218565b8151811061178757611787614204565b60200101906001600160f81b03191690815f1a905350600101611745565b505f5b6020811015611807576117bc81601f6141f1565b6117c790600861407d565b86901c60f81b826117d9836006614218565b815181106117e9576117e9614204565b60200101906001600160f81b03191690815f1a9053506001016117a8565b505f5b60088110156118725761181e8160076141f1565b61182990600861407d565b6001600160401b038616901c60f81b82611844836026614218565b8151811061185457611854614204565b60200101906001600160f81b03191690815f1a90535060010161180a565b505f5b60088110156118dd576118898160076141f1565b61189490600861407d565b6001600160401b038516901c60f81b826118af83602e614218565b815181106118bf576118bf614204565b60200101906001600160f81b03191690815f1a905350600101611875565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061438083398151915292919061192e90613da2565b9050118015611960575060035f83815260038301602052604090205460ff16600481111561195e5761195e613d53565b145b610a1b5760405162461bcd60e51b815260206004820152603360248201525f805160206143a083398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b6119bd613ad5565b5f805160206143c08339815191525f6119d584611d55565b90505f806119e6836040015161263b565b915091508015611a4b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611a7d57611a7d613d53565b6005811115611a8e57611a8e613d53565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b1557611b15613d53565b1480611b335750600182516005811115611b3157611b31613d53565b145b611b925760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115611ba757611ba7613d53565b03611bce57505f8381526007860160205260408120600491611bc99190613a9e565b611bd2565b5060055b6020808301515f90815260098801909152604081205581816005811115611bfb57611bfb613d53565b90816005811115611c0e57611c0e613d53565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611c4257611c42613d53565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d0d57611d0d613d53565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a1b6001600160a01b038216836132fd565b60408051606080820183525f8083526020830181905292820152905f805160206143c08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611dca573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611df191908101906140fa565b9150915080611e585760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611ebb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611f2e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f805f8351603614611f5a5760405162461bcd60e51b81526004016104ef9061422b565b5f805b6002811015611fa957611f718160016141f1565b611f7c90600861407d565b61ffff16868281518110611f9257611f92614204565b016020015160f81c901b9190911790600101611f5d565b5061ffff811615611fcc5760405162461bcd60e51b81526004016104ef90614274565b5f805b600481101561202757611fe38160036141f1565b611fee90600861407d565b63ffffffff1687612000836002614218565b8151811061201057612010614204565b016020015160f81c901b9190911790600101611fcf565b5063ffffffff811660031461204e5760405162461bcd60e51b81526004016104ef906142b7565b5f805b60208110156120a35761206581601f6141f1565b61207090600861407d565b8861207c836006614218565b8151811061208c5761208c614204565b016020015160f81c901b9190911790600101612051565b505f805b6008811015612102576120bb8160076141f1565b6120c690600861407d565b6001600160401b0316896120db836026614218565b815181106120eb576120eb614204565b016020015160f81c901b91909117906001016120a7565b505f805b60088110156121615761211a8160076141f1565b61212590600861407d565b6001600160401b03168a61213a83602e614218565b8151811061214a5761214a614204565b016020015160f81c901b9190911790600101612106565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206143808339815191529291906121b990613da2565b90501180156121eb575060015f83815260038301602052604090205460ff1660048111156121e9576121e9613d53565b145b610a1b5760405162461bcd60e51b815260206004820152603860248201525f805160206143a083398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f8181525f8051602061440083398151915260205260408082208151610100810190925280545f805160206143c083398151915293929190829060ff16600581111561229857612298613d53565b60058111156122a9576122a9613d53565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561233157612331613d53565b1461238d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146124075760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561244b5761244b613d53565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612517846125118161152e565b5f6116c9565b5f85815260078501602052604090209091506125338282613e1f565b506125418260a00151613390565b8160a001516001600160401b031683600a015f82825461256191906141f1565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612592908590600401613f00565b6020604051808303815f875af11580156125ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d29190613f32565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61262f613543565b6126388161358e565b50565b5f80825160271461265e5760405162461bcd60e51b81526004016104ef9061422b565b5f805b60028110156126ad576126758160016141f1565b61268090600861407d565b61ffff1685828151811061269657612696614204565b016020015160f81c901b9190911790600101612661565b5061ffff8116156126d05760405162461bcd60e51b81526004016104ef90614274565b5f805b600481101561272b576126e78160036141f1565b6126f290600861407d565b63ffffffff1686612704836002614218565b8151811061271457612714614204565b016020015160f81c901b91909117906001016126d3565b5063ffffffff81166002146127525760405162461bcd60e51b81526004016104ef906142b7565b5f805b60208110156127a75761276981601f6141f1565b61277490600861407d565b87612780836006614218565b8151811061279057612790614204565b016020015160f81c901b9190911790600101612755565b505f866026815181106127bc576127bc614204565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127e56135d2565b5f6127ef836109de565b90505f805160206143808339815191525f612809876115a2565b905060028151600581111561282057612820613d53565b1461287f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f838260a0015161289091906142fe565b905061289c8882611681565b5f6128a68961152e565b90505f8989836040516020016128ee9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061290f86613390565b5f61291b8b84866116c9565b5f83815260048801602052604090209091506129378282613e1f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612964908590600401613f00565b6020604051808303815f875af1158015612980573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129a49190613f32565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a5357612a53613d53565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061128b60015f805160206143e083398151915255565b5f5f805160206143808339815191528282612bae826109de565b83549091506001600160401b03821610801590612bd857508260010154816001600160401b031611155b612c365760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b949350505050565b5f612c476135d2565b5f805160206143c0833981519152426001600160401b03851611612cc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612ce0426202a300614218565b11612d535760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612daa5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f86815260098201602052604090205415612e185760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b8251603014612e7f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b5f80612ec66040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061361c565b5f82815260068601602052604090209193509150612ee48282613e1f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f11908590600401613f00565b6020604051808303815f875af1158015612f2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f519190613f32565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115612fd357612fd3613d53565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561309488613390565b876001600160401b031684600a015f8282546130b09190614218565b909155506130bf90508361152e565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c3660015f805160206143e083398151915255565b5f808251602e146131485760405162461bcd60e51b81526004016104ef9061422b565b5f805b60028110156131975761315f8160016141f1565b61316a90600861407d565b61ffff1685828151811061318057613180614204565b016020015160f81c901b919091179060010161314b565b5061ffff8116156131ba5760405162461bcd60e51b81526004016104ef90614274565b5f805b6004811015613215576131d18160036141f1565b6131dc90600861407d565b63ffffffff16866131ee836002614218565b815181106131fe576131fe614204565b016020015160f81c901b91909117906001016131bd565b5063ffffffff811660041461323c5760405162461bcd60e51b81526004016104ef906142b7565b5f805b60208110156132915761325381601f6141f1565b61325e90600861407d565b8761326a836006614218565b8151811061327a5761327a614204565b016020015160f81c901b919091179060010161323f565b505f805b60088110156132f0576132a98160076141f1565b6132b490600861407d565b6001600160401b0316886132c9836026614218565b815181106132d9576132d9614204565b016020015160f81c901b9190911790600101613295565b5090969095509350505050565b804710156133205760405163cd78605960e01b81523060048201526024016104ef565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613369576040519150601f19603f3d011682016040523d82523d5f602084013e61336e565b606091505b505090508061096c57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206143c083398151915290600160401b900460ff165f036133d5575050565b6040805160608101825260038301548082526004840154602083015260058401546001600160401b039081169383019390935260028401544293169061341b90846141f1565b10613441576001600160401b0384166040820152818152600a8301546020820152613460565b838160400181815161345391906142fe565b6001600160401b03169052505b5f816020015182604001516064613477919061431e565b6001600160401b031661348a9190613fd3565b600285015490915060ff600160401b909104811690821611156135055760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104ef565b508051600384015560208101516004840155604001516005909201805467ffffffffffffffff19166001600160401b03909316929092179091555050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661358c57604051631afcd79f60e31b815260040160405180910390fd5b565b613596613543565b61359f816139c1565b612638608082013560a08301356135bc60e0850160c08601613bff565b6135cd610100860160e08701614349565b6139e2565b5f805160206143e083398151915280546001190161360357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206143e083398151915255565b5f60608260800151516030146136865760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156136fd576136bd8160016141f1565b6136c890600861407d565b5081515f908390839081106136df576136df614204565b60200101906001600160f81b03191690815f1a9053506001016136a9565b505f5b600481101561375b576137148160036141f1565b61371f90600861407d565b505f8261372d836002614218565b8151811061373d5761373d614204565b60200101906001600160f81b03191690815f1a905350600101613700565b505f5b60208110156137b8578451816020811061377a5761377a614204565b1a60f81b8261378a836006614218565b8151811061379a5761379a614204565b60200101906001600160f81b03191690815f1a90535060010161375e565b505f5b602081101561381857846020015181602081106137da576137da614204565b1a60f81b826137ea836026614218565b815181106137fa576137fa614204565b60200101906001600160f81b03191690815f1a9053506001016137bb565b505f5b600881101561388c5761382f8160076141f1565b61383a90600861407d565b60ff1685604001516001600160401b0316901c60f81b8282604661385e9190614218565b8151811061386e5761386e614204565b60200101906001600160f81b03191690815f1a90535060010161381b565b505f5b60308110156138f757846080015181815181106138ae576138ae614204565b01602001516001600160f81b031916826138c983604e614218565b815181106138d9576138d9614204565b60200101906001600160f81b03191690815f1a90535060010161388f565b505f5b60088110156139695761390e8160076141f1565b61391990600861407d565b60608601516001600160401b0390811691161c60f81b8261393b83607e614218565b8151811061394b5761394b614204565b60200101906001600160f81b03191690815f1a9053506001016138fa565b5060028160405161397a9190614364565b602060405180830381855afa158015613995573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139b89190613f32565b94909350915050565b6139c9613543565b6139d1613a3d565b6139d9613a4d565b61263881613a55565b6139ea613543565b5f5f80516020614380833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613a45613543565b61358c613a96565b61358c613543565b613a5d613543565b80355f805160206143c083398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b613609613543565b508054613aaa90613da2565b5f825580601f10613ab9575050565b601f0160209004905f5260205f20908101906126389190613b19565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613b2d575f8155600101613b1a565b5090565b8015158114612638575f80fd5b803563ffffffff81168114613b51575f80fd5b919050565b5f805f60608486031215613b68575f80fd5b833592506020840135613b7a81613b31565b9150613b8860408501613b3e565b90509250925092565b5f60208284031215613ba1575f80fd5b5035919050565b5f60208284031215613bb8575f80fd5b61128b82613b3e565b5f8060408385031215613bd2575f80fd5b613bdb83613b3e565b946020939093013593505050565b80356001600160401b0381168114613b51575f80fd5b5f60208284031215613c0f575f80fd5b61128b82613be9565b5f6101008284031215613c29575f80fd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613c6557613c65613c2f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613c9357613c93613c2f565b604052919050565b5f6001600160401b03821115613cb357613cb3613c2f565b50601f01601f191660200190565b5f805f60608486031215613cd3575f80fd5b83359250613ce360208501613be9565b915060408401356001600160401b03811115613cfd575f80fd5b8401601f81018613613d0d575f80fd5b8035613d20613d1b82613c9b565b613c6b565b818152876020838501011115613d34575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613d9b57613d9b613d67565b5092915050565b600181811c90821680613db657607f821691505b602082108103613c2957634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c81016020851015613df95750805b601f840160051c820191505b81811015613e18575f8155600101613e05565b5050505050565b81516001600160401b03811115613e3857613e38613c2f565b613e4c81613e468454613da2565b84613dd4565b602080601f831160018114613e7f575f8415613e685750858301515b5f19600386901b1c1916600185901b178555613ed6565b5f85815260208120601f198616915b82811015613ead57888601518255948401946001909101908401613e8e565b5085821015613eca57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613ef8578181015183820152602001613ee0565b50505f910152565b602081525f8251806020840152613f1e816040850160208701613ede565b601f01601f19169190910160400192915050565b5f60208284031215613f42575f80fd5b5051919050565b5f60208083525f8454613f5b81613da2565b806020870152604060018084165f8114613f7c5760018114613f9857613fc5565b60ff19851660408a0152604084151560051b8a01019550613fc5565b895f5260205f205f5b85811015613fbc5781548b8201860152908301908801613fa1565b8a016040019650505b509398975050505050505050565b5f82613fed57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109ee576109ee613d67565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114612638575f80fd5b8051613b5181613b31565b5f806040838503121561410b575f80fd5b82516001600160401b0380821115614121575f80fd5b9084019060608287031215614134575f80fd5b61413c613c43565b8251815260208084015161414f816140db565b82820152604084015183811115614164575f80fd5b80850194505087601f850112614178575f80fd5b83519250614188613d1b84613c9b565b838152888285870101111561419b575f80fd5b6141aa84838301848801613ede565b806040840152508195506141bf8188016140ef565b9450505050509250929050565b5f6001600160401b038083168181036141e7576141e7613d67565b6001019392505050565b818103818111156109ee576109ee613d67565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109ee576109ee613d67565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613d9b57613d9b613d67565b6001600160401b0381811683821602808216919082811461434157614341613d67565b505092915050565b5f60208284031215614359575f80fd5b813561128b816140db565b5f8251614375818460208701613ede565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516146c23803806146c283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145758061014d5f395ff3fe608060405260043610610105575f3560e01c80636d0e43fa11610092578063a3a65e4811610062578063a3a65e48146102f4578063b771b3bc14610313578063bee0a03f14610345578063c599e24f14610364578063f40797d714610377575f80fd5b80636d0e43fa1461027857806376f78621146102975780637978da3a146102b657806398f3e2b4146102d5575f80fd5b80632e2194d8116100d85780632e2194d8146101c5578063467ef06f146101fc5780635297fae61461021b578063620658561461023a57806366435abf14610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063162f1f61146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613c7f565b61038a565b005b348015610135575f80fd5b50610128610144366004613cba565b610826565b348015610154575f80fd5b50610193610163366004613cba565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b3480156101b1575f80fd5b506101286101c0366004613cba565b610982565b3480156101d0575f80fd5b506101e46101df366004613cba565b6109ef565b6040516001600160401b03909116815260200161019d565b348015610207575f80fd5b50610128610216366004613cd1565b610a05565b348015610226575f80fd5b50610128610235366004613cea565b610a30565b348015610245575f80fd5b50610193610254366004613d28565b610c21565b348015610264575f80fd5b506101e4610273366004613cba565b610c3a565b348015610283575f80fd5b50610128610292366004613cba565b610c4e565b3480156102a2575f80fd5b506101286102b1366004613c7f565b610cbb565b3480156102c1575f80fd5b506101286102d0366004613d41565b610cd6565b3480156102e0575f80fd5b506101286102ef366004613cea565b610db3565b3480156102ff575f80fd5b5061012861030e366004613cd1565b610fe2565b34801561031e575f80fd5b5061032d6005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610350575f80fd5b5061012861035f366004613cba565b61119f565b610193610372366004613cba565b61126e565b610193610385366004613dea565b61127a565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206144c98339815191529184156103dc576103d9828561129e565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613e7c565b600481111561041f5761041f613e7c565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613e7c565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206144e98339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206144e98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f6105678461153a565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613e7c565b021790555060208201518154610100600160a81b0319166101006001600160a01b039092169190910217815560408201516001820155606080830151600283018054608086015160a087015160c08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909301516003909201805467ffffffffffffffff1916929093169190911790915582015161068d906115ae565b5f610697856115bb565b905082606001516001600160401b03168160a001516001600160401b03161161070e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107239190613ea4565b905061072f868261169a565b5f61073b8785846116e2565b5f8c815260058a01602052604090209091506107578282613f48565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610784908590600401614029565b6020604051808303815f875af11580156107a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c4919061405b565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f8051602061450983398151915292919061086e90613ecb565b90501180156108a0575060035f83815260098301602052604090205460ff16600581111561089e5761089e613e7c565b145b6109045760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161093d9190600401614072565b6020604051808303815f875af1158015610959573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097d919061405b565b505050565b61098b816118ff565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206144c9833981519152916005600160991b019163ee5b48eb9161093d91600401614072565b5f6109ff64e8d4a51000836140fc565b92915050565b5f610a0f826119ce565b9050610a2c81606001516001600160401b03168260400151611d5b565b5050565b5f805160206144c98339815191525f610a4884611d6e565b90505f80610a598360400151611f4f565b5091509150610a678561218a565b5f8581526004850160205260408120610a7f91613bc7565b5f610a89836115bb565b9050816001600160401b031681608001516001600160401b03161015610ac15760405162461bcd60e51b81526004016104ef9061411b565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b065760405162461bcd60e51b81526004016104ef9061415d565b60015f87815260038701602052604090205460ff166004811115610b2c57610b2c613e7c565b14610b955760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109ff6001600160401b03831664e8d4a510006141a6565b5f610c44826115bb565b60a0015192915050565b610c578161218a565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206144c9833981519152916005600160991b019163ee5b48eb9161093d91600401614072565b8115610ccd57610ccb838261129e565b505b61097d83612263565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d1f575080546001600160401b03808416911610155b15610d3d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610d678361261b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f805160206144c98339815191525f610dcb84611d6e565b90505f80610ddc8360400151611f4f565b5091509150610dea856118ff565b5f8581526005850160205260408120610e0291613bc7565b5f610e0c836115bb565b9050816001600160401b031681608001516001600160401b03161015610e445760405162461bcd60e51b81526004016104ef9061411b565b5f8681526003808701602052604090912001546001600160401b0380841691161115610e825760405162461bcd60e51b81526004016104ef9061415d565b60035f87815260038701602052604090205460ff166004811115610ea857610ea8613e7c565b14610efc5760405162461bcd60e51b815260206004820152603160248201525f805160206144e98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610fa09190611d5b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206145098339815191525f610ffa83611d6e565b90505f8061100b836040015161262c565b915091508061106d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526007850160205260408120805461108790613ecb565b90501180156110b9575060015f83815260098601602052604090205460ff1660058111156110b7576110b7613e7c565b145b6110d55760405162461bcd60e51b81526004016104ef906141bd565b5f82815260078501602052604081206110ed91613bc7565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206145098339815191529291906111e790613ecb565b9050118015611219575060015f83815260098301602052604090205460ff16600581111561121757611217613e7c565b145b6112355760405162461bcd60e51b81526004016104ef906141bd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161093d9190600401614072565b5f6109ff8233346127cd565b5f8061128534612b85565b905061129385828686612c2f565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113109190810190614223565b91509150806113735760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113da919061405b565b82511461143e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156114b45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806114c384604001516130f4565b915091508187146115305760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206145498339815191526020526040812060030180545f80516020614509833981519152916001600160401b039091169081908461157f836142f5565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115b8815f6132cc565b50565b6115c3613bfe565b5f8281525f805160206145498339815191526020526040908190208151610100810190925280545f80516020614509833981519152929190829060ff16600581111561161157611611613e7c565b600581111561162257611622613e7c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614549833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561175b5761171b81600161431a565b6117269060086141a6565b5081515f9083908390811061173d5761173d61432d565b60200101906001600160f81b03191690815f1a905350600101611707565b505f5b60048110156117be5761177281600361431a565b61177d9060086141a6565b6001901c60f81b82611790836002614341565b815181106117a0576117a061432d565b60200101906001600160f81b03191690815f1a90535060010161175e565b505f5b6020811015611820576117d581601f61431a565b6117e09060086141a6565b86901c60f81b826117f2836006614341565b815181106118025761180261432d565b60200101906001600160f81b03191690815f1a9053506001016117c1565b505f5b600881101561188b5761183781600761431a565b6118429060086141a6565b6001600160401b038616901c60f81b8261185d836026614341565b8151811061186d5761186d61432d565b60200101906001600160f81b03191690815f1a905350600101611823565b505f5b60088110156118f6576118a281600761431a565b6118ad9060086141a6565b6001600160401b038516901c60f81b826118c883602e614341565b815181106118d8576118d861432d565b60200101906001600160f81b03191690815f1a90535060010161188e565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206144c983398151915292919061194790613ecb565b9050118015611979575060035f83815260038301602052604090205460ff16600481111561197757611977613e7c565b145b610a2c5760405162461bcd60e51b815260206004820152603360248201525f805160206144e983398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b6119d6613bfe565b5f805160206145098339815191525f6119ee84611d6e565b90505f806119ff836040015161262c565b915091508015611a645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600985016020526040808220815161010081019092528054829060ff166005811115611a9657611a96613e7c565b6005811115611aa757611aa7613e7c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b2e57611b2e613e7c565b1480611b4c5750600182516005811115611b4a57611b4a613e7c565b145b611bab5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115611bc057611bc0613e7c565b03611be757505f8381526008860160205260408120600491611be29190613bc7565b611beb565b5060055b6020808301515f908152600a8801909152604081205581816005811115611c1457611c14613e7c565b90816005811115611c2757611c27613e7c565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115611c5b57611c5b613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d2657611d26613e7c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a2c6001600160a01b038216836134de565b60408051606080820183525f8083526020830181905292820152905f805160206145098339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611de3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e0a9190810190614223565b9150915080611e715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611ed45760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611f475760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f805f8351603614611f735760405162461bcd60e51b81526004016104ef90614354565b5f805b6002811015611fc257611f8a81600161431a565b611f959060086141a6565b61ffff16868281518110611fab57611fab61432d565b016020015160f81c901b9190911790600101611f76565b5061ffff811615611fe55760405162461bcd60e51b81526004016104ef9061439d565b5f805b600481101561204057611ffc81600361431a565b6120079060086141a6565b63ffffffff1687612019836002614341565b815181106120295761202961432d565b016020015160f81c901b9190911790600101611fe8565b5063ffffffff81166003146120675760405162461bcd60e51b81526004016104ef906143e0565b5f805b60208110156120bc5761207e81601f61431a565b6120899060086141a6565b88612095836006614341565b815181106120a5576120a561432d565b016020015160f81c901b919091179060010161206a565b505f805b600881101561211b576120d481600761431a565b6120df9060086141a6565b6001600160401b0316896120f4836026614341565b815181106121045761210461432d565b016020015160f81c901b91909117906001016120c0565b505f805b600881101561217a5761213381600761431a565b61213e9060086141a6565b6001600160401b03168a61215383602e614341565b815181106121635761216361432d565b016020015160f81c901b919091179060010161211f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206144c98339815191529291906121d290613ecb565b9050118015612204575060015f83815260038301602052604090205460ff16600481111561220257612202613e7c565b145b610a2c5760405162461bcd60e51b815260206004820152603860248201525f805160206144e983398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f8181525f8051602061454983398151915260205260408082208151610100810190925280545f8051602061450983398151915293929190829060ff1660058111156122b1576122b1613e7c565b60058111156122c2576122c2613e7c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561234a5761234a613e7c565b146123a65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146124205760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff1916600183600581111561246457612464613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125308461252a8161153a565b5f6116e2565b5f858152600885016020526040902090915061254c8282613f48565b5061255a8260a001516115ae565b60405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612586908590600401614029565b6020604051808303815f875af11580156125a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c6919061405b565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b612623613571565b6115b8816135bc565b5f80825160271461264f5760405162461bcd60e51b81526004016104ef90614354565b5f805b600281101561269e5761266681600161431a565b6126719060086141a6565b61ffff168582815181106126875761268761432d565b016020015160f81c901b9190911790600101612652565b5061ffff8116156126c15760405162461bcd60e51b81526004016104ef9061439d565b5f805b600481101561271c576126d881600361431a565b6126e39060086141a6565b63ffffffff16866126f5836002614341565b815181106127055761270561432d565b016020015160f81c901b91909117906001016126c4565b5063ffffffff81166002146127435760405162461bcd60e51b81526004016104ef906143e0565b5f805b60208110156127985761275a81601f61431a565b6127659060086141a6565b87612771836006614341565b815181106127815761278161432d565b016020015160f81c901b9190911790600101612746565b505f866026815181106127ad576127ad61432d565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127d6613600565b5f6127e0836109ef565b90505f805160206144c98339815191525f6127fa876115bb565b905060028151600581111561281157612811613e7c565b146128705760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f838260a001516128819190614427565b905061288d888261169a565b5f6128978961153a565b90505f8989836040516020016128df9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061290086613637565b5f61290c8b84866116e2565b5f83815260048801602052604090209091506129288282613f48565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612955908590600401614029565b6020604051808303815f875af1158015612971573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612995919061405b565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a4457612a44613e7c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061129760015f8051602061452983398151915255565b5f5f805160206144c98339815191528282612b9f826109ef565b83549091506001600160401b03821610801590612bc957508260010154816001600160401b031611155b612c275760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b949350505050565b5f612c38613600565b5f80516020614509833981519152426001600160401b03851611612cba5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612cd1426202a300614341565b11612d445760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612d9b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f868152600a8201602052604090205415612e095760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b8251603014612e705760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b5f80612eb76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613655565b5f82815260078601602052604090209193509150612ed58282613f48565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f02908590600401614029565b6020604051808303815f875af1158015612f1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f42919061405b565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff19166001836005811115612fc457612fc4613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561308588613637565b61308e8361153a565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c2760015f8051602061452983398151915255565b5f808251602e146131175760405162461bcd60e51b81526004016104ef90614354565b5f805b60028110156131665761312e81600161431a565b6131399060086141a6565b61ffff1685828151811061314f5761314f61432d565b016020015160f81c901b919091179060010161311a565b5061ffff8116156131895760405162461bcd60e51b81526004016104ef9061439d565b5f805b60048110156131e4576131a081600361431a565b6131ab9060086141a6565b63ffffffff16866131bd836002614341565b815181106131cd576131cd61432d565b016020015160f81c901b919091179060010161318c565b5063ffffffff811660041461320b5760405162461bcd60e51b81526004016104ef906143e0565b5f805b60208110156132605761322281601f61431a565b61322d9060086141a6565b87613239836006614341565b815181106132495761324961432d565b016020015160f81c901b919091179060010161320e565b505f805b60088110156132bf5761327881600761431a565b6132839060086141a6565b6001600160401b031688613298836026614341565b815181106132a8576132a861432d565b016020015160f81c901b9190911790600101613264565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061450983398151915290600160401b900460ff165f0361331257505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b03908116606083015260028401544293911690613363908461431a565b10613389576001600160401b0385166060820152818152604081015160208201526133a8565b848160600181815161339b9190614427565b6001600160401b03169052505b5f8160200151826060015160646133bf9190614447565b6001600160401b03166133d291906140fc565b600285015490915060ff600160401b9091048116908216111561344d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104ef565b841561347657856001600160401b03168260400181815161346e9190614341565b905250613495565b856001600160401b031682604001818151613491919061431a565b9052505b50805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b804710156135015760405163cd78605960e01b81523060048201526024016104ef565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461354a576040519150601f19603f3d011682016040523d82523d5f602084013e61354f565b606091505b505090508061097d57604051630a12f52160e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166135ba57604051631afcd79f60e31b815260040160405180910390fd5b565b6135c4613571565b6135cd816139fa565b6115b8608082013560a08301356135ea60e0850160c08601613d28565b6135fb610100860160e08701614472565b613a1b565b5f8051602061452983398151915280546001190161363157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6115b88160016132cc565b60015f8051602061452983398151915255565b5f60608260800151516030146136bf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613736576136f681600161431a565b6137019060086141a6565b5081515f908390839081106137185761371861432d565b60200101906001600160f81b03191690815f1a9053506001016136e2565b505f5b60048110156137945761374d81600361431a565b6137589060086141a6565b505f82613766836002614341565b815181106137765761377661432d565b60200101906001600160f81b03191690815f1a905350600101613739565b505f5b60208110156137f157845181602081106137b3576137b361432d565b1a60f81b826137c3836006614341565b815181106137d3576137d361432d565b60200101906001600160f81b03191690815f1a905350600101613797565b505f5b602081101561385157846020015181602081106138135761381361432d565b1a60f81b82613823836026614341565b815181106138335761383361432d565b60200101906001600160f81b03191690815f1a9053506001016137f4565b505f5b60088110156138c55761386881600761431a565b6138739060086141a6565b60ff1685604001516001600160401b0316901c60f81b828260466138979190614341565b815181106138a7576138a761432d565b60200101906001600160f81b03191690815f1a905350600101613854565b505f5b603081101561393057846080015181815181106138e7576138e761432d565b01602001516001600160f81b0319168261390283604e614341565b815181106139125761391261432d565b60200101906001600160f81b03191690815f1a9053506001016138c8565b505f5b60088110156139a25761394781600761431a565b6139529060086141a6565b60608601516001600160401b0390811691161c60f81b8261397483607e614341565b815181106139845761398461432d565b60200101906001600160f81b03191690815f1a905350600101613933565b506002816040516139b3919061448d565b602060405180830381855afa1580156139ce573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139f1919061405b565b94909350915050565b613a02613571565b613a0a613a76565b613a12613a86565b6115b881613a8e565b613a23613571565b5f5f805160206144c9833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613a7e613571565b6135ba613bbf565b6135ba613571565b613a96613571565b80355f8051602061450983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613ae260808401606085016144a8565b60ff161115613b4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104ef565b613b5f60808301606084016144a8565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613b906060830160408401613d28565b60028201805467ffffffffffffffff19166001600160401b039290921691909117905561271060059091015550565b613642613571565b508054613bd390613ecb565b5f825580601f10613be2575050565b601f0160209004905f5260205f20908101906115b89190613c42565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c56575f8155600101613c43565b5090565b80151581146115b8575f80fd5b803563ffffffff81168114613c7a575f80fd5b919050565b5f805f60608486031215613c91575f80fd5b833592506020840135613ca381613c5a565b9150613cb160408501613c67565b90509250925092565b5f60208284031215613cca575f80fd5b5035919050565b5f60208284031215613ce1575f80fd5b61129782613c67565b5f8060408385031215613cfb575f80fd5b613d0483613c67565b946020939093013593505050565b80356001600160401b0381168114613c7a575f80fd5b5f60208284031215613d38575f80fd5b61129782613d12565b5f6101008284031215613d52575f80fd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d8e57613d8e613d58565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613dbc57613dbc613d58565b604052919050565b5f6001600160401b03821115613ddc57613ddc613d58565b50601f01601f191660200190565b5f805f60608486031215613dfc575f80fd5b83359250613e0c60208501613d12565b915060408401356001600160401b03811115613e26575f80fd5b8401601f81018613613e36575f80fd5b8035613e49613e4482613dc4565b613d94565b818152876020838501011115613e5d575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ec457613ec4613e90565b5092915050565b600181811c90821680613edf57607f821691505b602082108103613d5257634e487b7160e01b5f52602260045260245ffd5b601f82111561097d57805f5260205f20601f840160051c81016020851015613f225750805b601f840160051c820191505b81811015613f41575f8155600101613f2e565b5050505050565b81516001600160401b03811115613f6157613f61613d58565b613f7581613f6f8454613ecb565b84613efd565b602080601f831160018114613fa8575f8415613f915750858301515b5f19600386901b1c1916600185901b178555613fff565b5f85815260208120601f198616915b82811015613fd657888601518255948401946001909101908401613fb7565b5085821015613ff357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015614021578181015183820152602001614009565b50505f910152565b602081525f8251806020840152614047816040850160208701614007565b601f01601f19169190910160400192915050565b5f6020828403121561406b575f80fd5b5051919050565b5f60208083525f845461408481613ecb565b806020870152604060018084165f81146140a557600181146140c1576140ee565b60ff19851660408a0152604084151560051b8a010195506140ee565b895f5260205f205f5b858110156140e55781548b82018601529083019088016140ca565b8a016040019650505b509398975050505050505050565b5f8261411657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109ff576109ff613e90565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b03811681146115b8575f80fd5b8051613c7a81613c5a565b5f8060408385031215614234575f80fd5b82516001600160401b038082111561424a575f80fd5b908401906060828703121561425d575f80fd5b614265613d6c565b8251815260208084015161427881614204565b8282015260408401518381111561428d575f80fd5b80850194505087601f8501126142a1575f80fd5b835192506142b1613e4484613dc4565b83815288828587010111156142c4575f80fd5b6142d384838301848801614007565b806040840152508195506142e8818801614218565b9450505050509250929050565b5f6001600160401b0380831681810361431057614310613e90565b6001019392505050565b818103818111156109ff576109ff613e90565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109ff576109ff613e90565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ec457613ec4613e90565b6001600160401b0381811683821602808216919082811461446a5761446a613e90565b505092915050565b5f60208284031215614482575f80fd5b813561129781614204565b5f825161449e818460208701614007565b9190910192915050565b5f602082840312156144b8575f80fd5b813560ff81168114611297575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index f8a6e1d18..4850a65fd 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -40,7 +40,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c4a380380612c4a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612afd8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c8063715018a611610088578063a3a65e4811610063578063a3a65e48146101f8578063b771b3bc1461020b578063bee0a03f14610219578063f2fde38b1461022c575f80fd5b8063715018a6146101995780638da5cb5b146101a157806397fb70d4146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f14610148578063580a40061461015b57806366435abf1461016e575b5f80fd5b6100e26100dd366004612445565b61023f565b005b6101226100f2366004612445565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612509565b6103a0565b6100e26101563660046125ac565b6103c0565b6100e26101693660046125ea565b6103cd565b61018161017c366004612445565b6104db565b6040516001600160401b03909116815260200161012c565b6100e26104ef565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101f3366004612445565b610502565b6100e26102063660046125ac565b61050e565b6101cd6005600160991b0181565b6100e2610227366004612445565b6106cb565b6100e261023a366004612626565b61079a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612ad183398151915292919061028790612641565b90501180156102b9575060035f83815260088301602052604090205460ff1660058111156102b7576102b7612679565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b919060040161268d565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612717565b505050565b5f6103a96107d4565b6103b58486858561082f565b90505b949350505050565b6103c981610d29565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104115750825b90505f826001600160401b0316600114801561042c5750303b155b90508115801561043a575080155b156104585760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561048257845460ff60401b1916600160401b1785555b61048c87876110b6565b83156104d257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6104e5826110d0565b60a0015192915050565b6104f76107d4565b6105005f6111c2565b565b61050b81611232565b50565b5f80516020612ad18339815191525f61052683611622565b90505f806105378360400151611803565b91509150806105995760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600685016020526040812080546105b390612641565b90501180156105e5575060015f83815260088601602052604090205460ff1660058111156105e3576105e3612679565b145b6106015760405162461bcd60e51b81526004016103199061272e565b5f8281526006850160205260408120610619916123b2565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612ad183398151915292919061071390612641565b9050118015610745575060015f83815260088301602052604090205460ff16600581111561074357610743612679565b145b6107615760405162461bcd60e51b81526004016103199061272e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b919060040161268d565b6107a26107d4565b6001600160a01b0381166107cb57604051631e4fbdf760e01b81525f6004820152602401610319565b61050b816111c2565b336108067f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105005760405163118cdaa760e01b8152336004820152602401610319565b5f610838611a62565b5f80516020612ad1833981519152426001600160401b038516116108ba5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610319565b6001600160401b0384166108d1426202a300612789565b116109445760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610319565b8561099b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f86815260098201602052604090205415610a095760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610a705760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b5f80610ab76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611aac565b5f82815260068601602052604090209193509150610ad582826127ed565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610b029085906004016128ce565b6020604051808303815f875af1158015610b1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b429190612717565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115610bc457610bc4612679565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610c8588611e51565b876001600160401b031684600a015f828254610ca19190612789565b90915550610cb0905083612004565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610d316123e9565b5f80516020612ad18339815191525f610d4984611622565b90505f80610d5a8360400151611803565b915091508015610dbf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610df157610df1612679565b6005811115610e0257610e02612679565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610e8957610e89612679565b1480610ea75750600182516005811115610ea557610ea5612679565b145b610f065760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b600382516005811115610f1b57610f1b612679565b03610f4257505f8381526007860160205260408120600491610f3d91906123b2565b610f46565b5060055b6020808301515f90815260098801909152604081205581816005811115610f6f57610f6f612679565b90816005811115610f8257610f82612679565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610fb657610fb6612679565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561108157611081612679565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b6110be6120b1565b6110c7826120fa565b6103c98161211b565b6110d86123e9565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040908190208151610100810190925280545f80516020612ad1833981519152929190829060ff16600581111561113957611139612679565b600581111561114a5761114a612679565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0860205260408082208151610100810190925280545f80516020612ad183398151915293929190829060ff16600581111561129357611293612679565b60058111156112a4576112a4612679565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561132c5761132c612679565b146113885760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146114025760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561144657611446612679565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6115128461150c81612004565b5f61212c565b5f858152600785016020526040902090915061152e82826127ed565b5061153c8260a00151611e51565b8160a001516001600160401b031683600a015f82825461155c9190612900565b909155505060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061158d9085906004016128ce565b6020604051808303815f875af11580156115a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115cd9190612717565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612ad18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611697573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116be9190810190612922565b91509150806117255760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146117885760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b0316156117fb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146118685760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156118b75761187f816001612900565b61188a9060086129f4565b61ffff168582815181106118a0576118a0612a0b565b016020015160f81c901b919091179060010161186b565b5061ffff8116156119165760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b60048110156119715761192d816003612900565b6119389060086129f4565b63ffffffff168661194a836002612789565b8151811061195a5761195a612a0b565b016020015160f81c901b9190911790600101611919565b5063ffffffff81166002146119d85760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b6020811015611a2d576119ef81601f612900565b6119fa9060086129f4565b87611a06836006612789565b81518110611a1657611a16612a0b565b016020015160f81c901b91909117906001016119db565b505f86602681518110611a4257611a42612a0b565b016020015191976001600160f81b03199092161515965090945050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611aa657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6060826080015151603014611b165760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611b8d57611b4d816001612900565b611b589060086129f4565b5081515f90839083908110611b6f57611b6f612a0b565b60200101906001600160f81b03191690815f1a905350600101611b39565b505f5b6004811015611beb57611ba4816003612900565b611baf9060086129f4565b505f82611bbd836002612789565b81518110611bcd57611bcd612a0b565b60200101906001600160f81b03191690815f1a905350600101611b90565b505f5b6020811015611c485784518160208110611c0a57611c0a612a0b565b1a60f81b82611c1a836006612789565b81518110611c2a57611c2a612a0b565b60200101906001600160f81b03191690815f1a905350600101611bee565b505f5b6020811015611ca85784602001518160208110611c6a57611c6a612a0b565b1a60f81b82611c7a836026612789565b81518110611c8a57611c8a612a0b565b60200101906001600160f81b03191690815f1a905350600101611c4b565b505f5b6008811015611d1c57611cbf816007612900565b611cca9060086129f4565b60ff1685604001516001600160401b0316901c60f81b82826046611cee9190612789565b81518110611cfe57611cfe612a0b565b60200101906001600160f81b03191690815f1a905350600101611cab565b505f5b6030811015611d875784608001518181518110611d3e57611d3e612a0b565b01602001516001600160f81b03191682611d5983604e612789565b81518110611d6957611d69612a0b565b60200101906001600160f81b03191690815f1a905350600101611d1f565b505f5b6008811015611df957611d9e816007612900565b611da99060086129f4565b60608601516001600160401b0390811691161c60f81b82611dcb83607e612789565b81518110611ddb57611ddb612a0b565b60200101906001600160f81b03191690815f1a905350600101611d8a565b50600281604051611e0a9190612a1f565b602060405180830381855afa158015611e25573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611e489190612717565b94909350915050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612ad183398151915290600160401b900460ff165f03611e96575050565b6040805160608101825260038301548082526004840154602083015260058401546001600160401b0390811693830193909352600284015442931690611edc9084612900565b10611f02576001600160401b0384166040820152818152600a8301546020820152611f21565b8381604001818151611f149190612a3a565b6001600160401b03169052505b5f816020015182604001516064611f389190612a61565b6001600160401b0316611f4b9190612a8c565b600285015490915060ff600160401b90910481169082161115611fc65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610319565b508051600384015560208101516004840155604001516005909201805467ffffffffffffffff19166001600160401b03909316929092179091555050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812060030180545f80516020612ad1833981519152916001600160401b039091169081908461205c83612aab565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661050057604051631afcd79f60e31b815260040160405180910390fd5b6121026120b1565b61210a612349565b612112612359565b61050b81612361565b6121236120b1565b61050b816123a2565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156121a557612165816001612900565b6121709060086129f4565b5081515f9083908390811061218757612187612a0b565b60200101906001600160f81b03191690815f1a905350600101612151565b505f5b6004811015612208576121bc816003612900565b6121c79060086129f4565b6001901c60f81b826121da836002612789565b815181106121ea576121ea612a0b565b60200101906001600160f81b03191690815f1a9053506001016121a8565b505f5b602081101561226a5761221f81601f612900565b61222a9060086129f4565b86901c60f81b8261223c836006612789565b8151811061224c5761224c612a0b565b60200101906001600160f81b03191690815f1a90535060010161220b565b505f5b60088110156122d557612281816007612900565b61228c9060086129f4565b6001600160401b038616901c60f81b826122a7836026612789565b815181106122b7576122b7612a0b565b60200101906001600160f81b03191690815f1a90535060010161226d565b505f5b6008811015612340576122ec816007612900565b6122f79060086129f4565b6001600160401b038516901c60f81b8261231283602e612789565b8151811061232257612322612a0b565b60200101906001600160f81b03191690815f1a9053506001016122d8565b50949350505050565b6123516120b1565b6105006123aa565b6105006120b1565b6123696120b1565b80355f80516020612ad183398151915255602001357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155565b6107a26120b1565b61208b6120b1565b5080546123be90612641565b5f825580601f106123cd575050565b601f0160209004905f5260205f209081019061050b919061242d565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612441575f815560010161242e565b5090565b5f60208284031215612455575f80fd5b5035919050565b80356001600160401b0381168114612472575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156124ad576124ad612477565b60405290565b604051601f8201601f191681016001600160401b03811182821017156124db576124db612477565b604052919050565b5f6001600160401b038211156124fb576124fb612477565b50601f01601f191660200190565b5f805f806080858703121561251c575f80fd5b6125258561245c565b93506020850135925061253a6040860161245c565b915060608501356001600160401b03811115612554575f80fd5b8501601f81018713612564575f80fd5b8035612577612572826124e3565b6124b3565b81815288602083850101111561258b575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156125bc575f80fd5b813563ffffffff811681146125cf575f80fd5b9392505050565b6001600160a01b038116811461050b575f80fd5b5f8082840360a08112156125fc575f80fd5b6080811215612609575f80fd5b50829150608083013561261b816125d6565b809150509250929050565b5f60208284031215612636575f80fd5b81356125cf816125d6565b600181811c9082168061265557607f821691505b60208210810361267357634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f845461269f81612641565b806020870152604060018084165f81146126c057600181146126dc57612709565b60ff19851660408a0152604084151560051b8a01019550612709565b895f5260205f205f5b858110156127005781548b82018601529083019088016126e5565b8a016040019650505b509398975050505050505050565b5f60208284031215612727575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561279c5761279c612775565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156127c75750805b601f840160051c820191505b818110156127e6575f81556001016127d3565b5050505050565b81516001600160401b0381111561280657612806612477565b61281a816128148454612641565b846127a2565b602080601f83116001811461284d575f84156128365750858301515b5f19600386901b1c1916600185901b1785556128a4565b5f85815260208120601f198616915b8281101561287b5788860151825594840194600190910190840161285c565b508582101561289857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156128c65781810151838201526020016128ae565b50505f910152565b602081525f82518060208401526128ec8160408501602087016128ac565b601f01601f19169190910160400192915050565b8181038181111561279c5761279c612775565b80518015158114612472575f80fd5b5f8060408385031215612933575f80fd5b82516001600160401b0380821115612949575f80fd5b908401906060828703121561295c575f80fd5b61296461248b565b82518152602080840151612977816125d6565b8282015260408401518381111561298c575f80fd5b80850194505087601f8501126129a0575f80fd5b835192506129b0612572846124e3565b83815288828587010111156129c3575f80fd5b6129d2848383018488016128ac565b806040840152508195506129e7818801612913565b9450505050509250929050565b808202811582820484141761279c5761279c612775565b634e487b7160e01b5f52603260045260245ffd5b5f8251612a308184602087016128ac565b9190910192915050565b6001600160401b03818116838216019080821115612a5a57612a5a612775565b5092915050565b6001600160401b03818116838216028082169190828114612a8457612a84612775565b505092915050565b5f82612aa657634e487b7160e01b5f52601260045260245ffd5b500490565b5f6001600160401b03808316818103612ac657612ac6612775565b600101939250505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612d9c380380612d9c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c4f8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c8063715018a611610088578063a3a65e4811610063578063a3a65e48146101f8578063b771b3bc1461020b578063bee0a03f14610219578063f2fde38b1461022c575f80fd5b8063715018a6146101995780638da5cb5b146101a157806397fb70d4146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f14610148578063580a40061461015b57806366435abf1461016e575b5f80fd5b6100e26100dd36600461255e565b61023f565b005b6101226100f236600461255e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612622565b6103a0565b6100e26101563660046126c5565b6103c0565b6100e2610169366004612703565b6103cd565b61018161017c36600461255e565b6104db565b6040516001600160401b03909116815260200161012c565b6100e26104ef565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101f336600461255e565b610502565b6100e26102063660046126c5565b61050e565b6101cd6005600160991b0181565b6100e261022736600461255e565b6106cb565b6100e261023a36600461273f565b61079a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f80516020612c238339815191529291906102879061275a565b90501180156102b9575060035f83815260098301602052604090205460ff1660058111156102b7576102b7612792565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016127a6565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612830565b505050565b5f6103a96107d4565b6103b58486858561082f565b90505b949350505050565b6103c981610d07565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104115750825b90505f826001600160401b0316600114801561042c5750303b155b90508115801561043a575080155b156104585760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561048257845460ff60401b1916600160401b1785555b61048c8787611094565b83156104d257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6104e5826110ae565b60a0015192915050565b6104f76107d4565b6105005f6111a0565b565b61050b81611210565b50565b5f80516020612c238339815191525f610526836115db565b90505f8061053783604001516117bc565b91509150806105995760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600785016020526040812080546105b39061275a565b90501180156105e5575060015f83815260098601602052604090205460ff1660058111156105e3576105e3612792565b145b6106015760405162461bcd60e51b815260040161031990612847565b5f8281526007850160205260408120610619916124cb565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612c238339815191529291906107139061275a565b9050118015610745575060015f83815260098301602052604090205460ff16600581111561074357610743612792565b145b6107615760405162461bcd60e51b815260040161031990612847565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016127a6565b6107a26107d4565b6001600160a01b0381166107cb57604051631e4fbdf760e01b81525f6004820152602401610319565b61050b816111a0565b336108067f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105005760405163118cdaa760e01b8152336004820152602401610319565b5f610838611a1b565b5f80516020612c23833981519152426001600160401b038516116108ba5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610319565b6001600160401b0384166108d1426202a3006128a2565b116109445760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610319565b8561099b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f868152600a8201602052604090205415610a095760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610a705760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b5f80610ab76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611a65565b5f82815260078601602052604090209193509150610ad58282612906565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610b029085906004016129e7565b6020604051808303815f875af1158015610b1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b429190612830565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff19166001836005811115610bc457610bc4612792565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610c8588611e0a565b610c8e83611e15565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610d0f612502565b5f80516020612c238339815191525f610d27846115db565b90505f80610d3883604001516117bc565b915091508015610d9d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600985016020526040808220815161010081019092528054829060ff166005811115610dcf57610dcf612792565b6005811115610de057610de0612792565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610e6757610e67612792565b1480610e855750600182516005811115610e8357610e83612792565b145b610ee45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b600382516005811115610ef957610ef9612792565b03610f2057505f8381526008860160205260408120600491610f1b91906124cb565b610f24565b5060055b6020808301515f908152600a8801909152604081205581816005811115610f4d57610f4d612792565b90816005811115610f6057610f60612792565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115610f9457610f94612792565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561105f5761105f612792565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b61109c611ec2565b6110a582611f0b565b6103c981611f2c565b6110b6612502565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb096020526040908190208151610100810190925280545f80516020612c23833981519152929190829060ff16600581111561111757611117612792565b600581111561112857611128612792565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0960205260408082208151610100810190925280545f80516020612c2383398151915293929190829060ff16600581111561127157611271612792565b600581111561128257611282612792565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561130a5761130a612792565b146113665760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146113e05760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff1916600183600581111561142457611424612792565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6114f0846114ea81611e15565b5f611f3d565b5f858152600885016020526040902090915061150c8282612906565b5061151a8260a0015161215a565b60405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906115469085906004016129e7565b6020604051808303815f875af1158015611562573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115869190612830565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612c238339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611650573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116779190810190612a28565b91509150806116de5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146117415760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b0316156117b45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146118215760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b600281101561187057611838816001612afa565b611843906008612b0d565b61ffff1685828151811061185957611859612b24565b016020015160f81c901b9190911790600101611824565b5061ffff8116156118cf5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b600481101561192a576118e6816003612afa565b6118f1906008612b0d565b63ffffffff16866119038360026128a2565b8151811061191357611913612b24565b016020015160f81c901b91909117906001016118d2565b5063ffffffff81166002146119915760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b60208110156119e6576119a881601f612afa565b6119b3906008612b0d565b876119bf8360066128a2565b815181106119cf576119cf612b24565b016020015160f81c901b9190911790600101611994565b505f866026815181106119fb576119fb612b24565b016020015191976001600160f81b03199092161515965090945050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a5f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6060826080015151603014611acf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611b4657611b06816001612afa565b611b11906008612b0d565b5081515f90839083908110611b2857611b28612b24565b60200101906001600160f81b03191690815f1a905350600101611af2565b505f5b6004811015611ba457611b5d816003612afa565b611b68906008612b0d565b505f82611b768360026128a2565b81518110611b8657611b86612b24565b60200101906001600160f81b03191690815f1a905350600101611b49565b505f5b6020811015611c015784518160208110611bc357611bc3612b24565b1a60f81b82611bd38360066128a2565b81518110611be357611be3612b24565b60200101906001600160f81b03191690815f1a905350600101611ba7565b505f5b6020811015611c615784602001518160208110611c2357611c23612b24565b1a60f81b82611c338360266128a2565b81518110611c4357611c43612b24565b60200101906001600160f81b03191690815f1a905350600101611c04565b505f5b6008811015611cd557611c78816007612afa565b611c83906008612b0d565b60ff1685604001516001600160401b0316901c60f81b82826046611ca791906128a2565b81518110611cb757611cb7612b24565b60200101906001600160f81b03191690815f1a905350600101611c64565b505f5b6030811015611d405784608001518181518110611cf757611cf7612b24565b01602001516001600160f81b03191682611d1283604e6128a2565b81518110611d2257611d22612b24565b60200101906001600160f81b03191690815f1a905350600101611cd8565b505f5b6008811015611db257611d57816007612afa565b611d62906008612b0d565b60608601516001600160401b0390811691161c60f81b82611d8483607e6128a2565b81518110611d9457611d94612b24565b60200101906001600160f81b03191690815f1a905350600101611d43565b50600281604051611dc39190612b38565b602060405180830381855afa158015611dde573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611e019190612830565b94909350915050565b61050b816001612160565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb096020526040812060030180545f80516020612c23833981519152916001600160401b0390911690819084611e6d83612b53565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661050057604051631afcd79f60e31b815260040160405180910390fd5b611f13611ec2565b611f1b612372565b611f23612382565b61050b8161238a565b611f34611ec2565b61050b816124bb565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611fb657611f76816001612afa565b611f81906008612b0d565b5081515f90839083908110611f9857611f98612b24565b60200101906001600160f81b03191690815f1a905350600101611f62565b505f5b600481101561201957611fcd816003612afa565b611fd8906008612b0d565b6001901c60f81b82611feb8360026128a2565b81518110611ffb57611ffb612b24565b60200101906001600160f81b03191690815f1a905350600101611fb9565b505f5b602081101561207b5761203081601f612afa565b61203b906008612b0d565b86901c60f81b8261204d8360066128a2565b8151811061205d5761205d612b24565b60200101906001600160f81b03191690815f1a90535060010161201c565b505f5b60088110156120e657612092816007612afa565b61209d906008612b0d565b6001600160401b038616901c60f81b826120b88360266128a2565b815181106120c8576120c8612b24565b60200101906001600160f81b03191690815f1a90535060010161207e565b505f5b6008811015612151576120fd816007612afa565b612108906008612b0d565b6001600160401b038516901c60f81b8261212383602e6128a2565b8151811061213357612133612b24565b60200101906001600160f81b03191690815f1a9053506001016120e9565b50949350505050565b61050b815f5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612c2383398151915290600160401b900460ff165f036121a657505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b039081166060830152600284015442939116906121f79084612afa565b1061221d576001600160401b03851660608201528181526040810151602082015261223c565b848160600181815161222f9190612b78565b6001600160401b03169052505b5f8160200151826060015160646122539190612b9f565b6001600160401b03166122669190612bca565b600285015490915060ff600160401b909104811690821611156122e15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610319565b841561230a57856001600160401b03168260400181815161230291906128a2565b905250612329565b856001600160401b0316826040018181516123259190612afa565b9052505b50805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b61237a611ec2565b6105006124c3565b610500611ec2565b612392611ec2565b80355f80516020612c2383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146123de6080840160608501612be9565b60ff16111561244b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610319565b61245b6080830160608401612be9565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561248c6060830160408401612c09565b60028201805467ffffffffffffffff19166001600160401b039290921691909117905561271060059091015550565b6107a2611ec2565b611e9c611ec2565b5080546124d79061275a565b5f825580601f106124e6575050565b601f0160209004905f5260205f209081019061050b9190612546565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561255a575f8155600101612547565b5090565b5f6020828403121561256e575f80fd5b5035919050565b80356001600160401b038116811461258b575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156125c6576125c6612590565b60405290565b604051601f8201601f191681016001600160401b03811182821017156125f4576125f4612590565b604052919050565b5f6001600160401b0382111561261457612614612590565b50601f01601f191660200190565b5f805f8060808587031215612635575f80fd5b61263e85612575565b93506020850135925061265360408601612575565b915060608501356001600160401b0381111561266d575f80fd5b8501601f8101871361267d575f80fd5b803561269061268b826125fc565b6125cc565b8181528860208385010111156126a4575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156126d5575f80fd5b813563ffffffff811681146126e8575f80fd5b9392505050565b6001600160a01b038116811461050b575f80fd5b5f8082840360a0811215612715575f80fd5b6080811215612722575f80fd5b508291506080830135612734816126ef565b809150509250929050565b5f6020828403121561274f575f80fd5b81356126e8816126ef565b600181811c9082168061276e57607f821691505b60208210810361278c57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f84546127b88161275a565b806020870152604060018084165f81146127d957600181146127f557612822565b60ff19851660408a0152604084151560051b8a01019550612822565b895f5260205f205f5b858110156128195781548b82018601529083019088016127fe565b8a016040019650505b509398975050505050505050565b5f60208284031215612840575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156128b5576128b561288e565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156128e05750805b601f840160051c820191505b818110156128ff575f81556001016128ec565b5050505050565b81516001600160401b0381111561291f5761291f612590565b6129338161292d845461275a565b846128bb565b602080601f831160018114612966575f841561294f5750858301515b5f19600386901b1c1916600185901b1785556129bd565b5f85815260208120601f198616915b8281101561299457888601518255948401946001909101908401612975565b50858210156129b157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156129df5781810151838201526020016129c7565b50505f910152565b602081525f8251806020840152612a058160408501602087016129c5565b601f01601f19169190910160400192915050565b8051801515811461258b575f80fd5b5f8060408385031215612a39575f80fd5b82516001600160401b0380821115612a4f575f80fd5b9084019060608287031215612a62575f80fd5b612a6a6125a4565b82518152602080840151612a7d816126ef565b82820152604084015183811115612a92575f80fd5b80850194505087601f850112612aa6575f80fd5b83519250612ab661268b846125fc565b8381528882858701011115612ac9575f80fd5b612ad8848383018488016129c5565b80604084015250819550612aed818801612a19565b9450505050509250929050565b818103818111156128b5576128b561288e565b80820281158282048414176128b5576128b561288e565b634e487b7160e01b5f52603260045260245ffd5b5f8251612b498184602087016129c5565b9190910192915050565b5f6001600160401b03808316818103612b6e57612b6e61288e565b6001019392505050565b6001600160401b03818116838216019080821115612b9857612b9861288e565b5092915050565b6001600160401b03818116838216028082169190828114612bc257612bc261288e565b505092915050565b5f82612be457634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612bf9575f80fd5b813560ff811681146126e8575f80fd5b5f60208284031215612c19575f80fd5b6126e88261257556fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 1702c057e..c70e94072 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -172,8 +172,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 nonce = _getAndIncrementNonce(validationID); bytes32 delegationID = keccak256(abi.encodePacked(validationID, delegatorAddress, nonce)); - // Check that adding this validator would not exceed the maximum churn rate. - _checkAndUpdateChurnTracker(weight); + // Check that adding this delegator would not exceed the maximum churn rate. + _checkAndUpdateChurnTrackerAddition(weight); // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages @@ -293,6 +293,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager $._delegatorStakes[delegationID] = delegator; + // Check that removing this delegator would not exceed the maximum churn rate. + // TODO this check won't be necessary for a delegator whose validator has already initialized ending their validation period. + _checkAndUpdateChurnTrackerRemoval(delegator.weight); + Validator memory validator = _getValidator(validationID); require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); uint64 newValidatorWeight = validator.weight - delegator.weight; diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index bb5641244..c441cfade 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -51,8 +51,6 @@ abstract contract ValidatorManager is mapping(bytes32 => Validator) _validationPeriods; /// @notice Maps the nodeID to the validationID for active validation periods. mapping(bytes32 => bytes32) _activeValidators; - /// @notice The total weight of all validators. - uint256 _totalWeight; } // solhint-enable private-vars-leading-underscore @@ -97,6 +95,17 @@ abstract contract ValidatorManager is ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); $._pChainBlockchainID = settings.pChainBlockchainID; $._subnetID = settings.subnetID; + + require( + settings.maximumChurnPercentage <= 20, + "ValidatorManager: maximum churn percentage too high" + ); + $._maximumChurnPercentage = settings.maximumChurnPercentage; + $._churnPeriodSeconds = settings.churnPeriodSeconds; + + // TODO Remove - this is a hack to get a starting total weight before + // adding an initial validator set is implemented. + $._churnTracker.totalWeight = 10000; } /** @@ -155,9 +164,7 @@ abstract contract ValidatorManager is }); // Check that adding this validator would not exceed the maximum churn rate. - _checkAndUpdateChurnTracker(weight); - // Update total weight - $._totalWeight += weight; + _checkAndUpdateChurnTrackerAddition(weight); // Increment the nonce for the next usage. _getAndIncrementNonce(validationID); @@ -248,9 +255,8 @@ abstract contract ValidatorManager is .packSetSubnetValidatorWeightMessage(validationID, _getAndIncrementNonce(validationID), 0); $._pendingEndValidationMessages[validationID] = setValidatorWeightPayload; - _checkAndUpdateChurnTracker(validator.weight); - // Update weight after checking the churn tracker. - $._totalWeight -= validator.weight; + // Check that removing this delegator would not exceed the maximum churn rate. + _checkAndUpdateChurnTrackerRemoval(validator.weight); bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); @@ -371,11 +377,25 @@ abstract contract ValidatorManager is } /** - * @notice Helper function to check if the stake amount to be added or removed would exceed the maximum stake churn - * rate for the past hour. If the churn rate is exceeded, the function will revert. If the churn rate is not exceeded, - * the function will update the churn tracker with the new amount. + * @dev Helper function to check if the stake amount to be added exceeds churn thresholds. + */ + function _checkAndUpdateChurnTrackerAddition(uint64 weight) internal { + _checkAndUpdateChurnTracker(weight, true); + } + + /** + * @dev Helper function to check if the stake amount to be removed exceeds churn thresholds. */ - function _checkAndUpdateChurnTracker(uint64 weight) internal { + function _checkAndUpdateChurnTrackerRemoval(uint64 weight) internal { + _checkAndUpdateChurnTracker(weight, false); + } + + /** + * @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 + * not exceeded, the function will update the churn tracker with the new weight. + */ + function _checkAndUpdateChurnTracker(uint64 weight, bool addition) private { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); if ($._maximumChurnPercentage == 0) { @@ -388,7 +408,7 @@ abstract contract ValidatorManager is if (currentTime - churnTracker.startedAt >= $._churnPeriodSeconds) { churnTracker.churnAmount = weight; churnTracker.startedAt = currentTime; - churnTracker.initialWeight = $._totalWeight; + churnTracker.initialWeight = churnTracker.totalWeight; } else { churnTracker.churnAmount += weight; } @@ -398,6 +418,13 @@ abstract contract ValidatorManager is churnPercentage <= $._maximumChurnPercentage, "ValidatorManager: maximum churn rate exceeded" ); + + if (addition) { + churnTracker.totalWeight += weight; + } else { + churnTracker.totalWeight -= weight; + } + $._churnTracker = churnTracker; } } diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index d8a93a58f..d73d5519b 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -35,6 +35,7 @@ struct ValidatorManagerSettings { struct ValidatorChurnPeriod { uint256 startedAt; uint256 initialWeight; + uint256 totalWeight; // TODO add initial validator set to total weight. uint64 churnAmount; } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 7b8c8f636..f87f17430 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -93,6 +93,10 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(address(token), abi.encodeCall(IERC20.transfer, (account, amount))); } + function _weightToValue(uint64 weight) internal virtual override returns (uint256) { + return app.weightToValue(weight); + } + function _getStakeAssetBalance(address account) internal view override returns (uint256) { return token.balanceOf(account); } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 8cbf072a7..f5b700130 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -80,6 +80,10 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(account, amount, ""); } + function _weightToValue(uint64 weight) internal virtual override returns (uint256) { + return app.weightToValue(weight); + } + function _getStakeAssetBalance(address account) internal view override returns (uint256) { return account.balance; } diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index 63cc10282..0d10d0c18 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -52,10 +52,25 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { return app.initializeValidatorRegistration(weight, nodeID, registrationExpiry, signature); } + function _initializeValidatorRegistrationWithValue( + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory signature, + uint256 value + ) internal virtual override returns (bytes32) { + return app.initializeValidatorRegistration( + uint64(value), nodeID, registrationExpiry, signature + ); + } + function _initializeEndValidation(bytes32 validationID) internal virtual override { return app.initializeEndValidation(validationID); } // solhint-disable-next-line no-empty-blocks function _beforeSend(uint64 weight, address spender) internal virtual override {} + + function _weightToValue(uint64 weight) internal virtual override returns (uint256) { + return uint256(weight); + } } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 73a16573a..3f1d83df4 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -72,51 +72,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { return validationIDs; } - function testCummulativeChurnRegistration() public { - registerValidators(5); - - _beforeSend(DEFAULT_WEIGHT, address(this)); - uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); - - // First call after churn tracking start should work - _initializeValidatorRegistrationWithValue( - _newNodeID(), uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value - ); - - bytes32 nodeID = _newNodeID(); // Needs to be called before expectRevert - _beforeSend(DEFAULT_WEIGHT, address(this)); - - // Second call after churn tracking start should fail - vm.expectRevert(_formatErrorMessage("maximum churn rate exceeded")); - _initializeValidatorRegistrationWithValue( - nodeID, uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value - ); - } - - function testCummulativeChurnRegistrationAndEndValidation() public { - bytes32[] memory validationIDs = registerValidators(10); - - _beforeSend(DEFAULT_WEIGHT, address(this)); - uint256 value = posValidatorManager.weightToValue(DEFAULT_WEIGHT); - - // First call after churn tracking start should work - _initializeValidatorRegistrationWithValue( - _newNodeID(), uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value - ); - - // Initialize the end of one of the validators. - _initializeEndValidation(validationIDs[0]); - - bytes32 nodeID = _newNodeID(); // Needs to be called before expectRevert - _beforeSend(DEFAULT_WEIGHT, address(this)); - - // Second call after churn tracking start should fail - vm.expectRevert(_formatErrorMessage("maximum churn rate exceeded")); - _initializeValidatorRegistrationWithValue( - nodeID, uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value - ); - } - function testInitializeEndValidationWithUptimeProof() public { _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -676,15 +631,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { return posValidatorManager.initializeEndValidation(validationID, false, 0); } - // Initialize a validator registration, without making a call to weightToValue, which is an external - // call that will consume the call to vm.expectRevert and fail the test. - function _initializeValidatorRegistrationWithValue( - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory blsPublicKey, - uint256 value - ) internal virtual returns (bytes32); - function _initializeDelegatorRegistration( bytes32 validationID, address delegatorAddress, diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index ab7b3cfa3..5b702b2ad 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -39,6 +39,7 @@ abstract contract ValidatorManagerTest is Test { uint64 public constant DEFAULT_EXPIRY = 1000; uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = 2000; + uint256 public constant DEFAULT_STARTING_TOTAL_WEIGHT = 10000; ValidatorManager public validatorManager; @@ -195,6 +196,45 @@ abstract contract ValidatorManagerTest is Test { validatorManager.completeEndValidation(0); } + function testCummulativeChurnRegistration() public { + uint64 churnThreshold = + uint64(DEFAULT_STARTING_TOTAL_WEIGHT) * 100 / DEFAULT_MAXIMUM_CHURN_PERCENTAGE; + _beforeSend(churnThreshold, address(this)); + uint256 value = _weightToValue(churnThreshold); + + // First call should succeed + _initializeValidatorRegistrationWithValue( + _newNodeID(), uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value + ); + + bytes32 nodeID = _newNodeID(); // Needs to be called before expectRevert + uint64 secondWeight = 1; + _beforeSend(secondWeight, address(this)); // TODO may need to be updated with minimum stake amount + uint256 value2 = _weightToValue(secondWeight); + + // Second call should fail + vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); + _initializeValidatorRegistrationWithValue( + nodeID, uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value2 + ); + } + + function testCummulativeChurnRegistrationAndEndValidation() public { + uint64 churnThreshold = + uint64(DEFAULT_STARTING_TOTAL_WEIGHT) * 100 / DEFAULT_MAXIMUM_CHURN_PERCENTAGE; + _beforeSend(churnThreshold, address(this)); + uint256 value = _weightToValue(churnThreshold); + + // First call should succeed + bytes32 validationID = _initializeValidatorRegistrationWithValue( + _newNodeID(), uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value + ); + + // Second call should fail + vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); + _initializeEndValidation(validationID); + } + function _newNodeID() internal returns (bytes32) { nodeIDCounter++; return sha256(new bytes(nodeIDCounter)); @@ -346,8 +386,19 @@ abstract contract ValidatorManagerTest is Test { uint64 weight ) internal virtual returns (bytes32); + // Initialize a validator registration, without making a call to weightToValue, which is an external + // call that will consume the call to vm.expectRevert and fail the test. + function _initializeValidatorRegistrationWithValue( + bytes32 nodeID, + uint64 registrationExpiry, + bytes memory blsPublicKey, + uint256 value + ) internal virtual returns (bytes32); + function _initializeEndValidation(bytes32 validationID) internal virtual; function _beforeSend(uint64 weight, address spender) internal virtual; + + function _weightToValue(uint64 weight) internal virtual returns (uint256); } // solhint-enable no-empty-blocks diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index fc3345d95..06aeaa31c 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -146,16 +146,15 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { opts, nativetokenstakingmanager.PoSValidatorManagerSettings{ BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, - SubnetID: subnetAInfo.SubnetID, + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnetAInfo.SubnetID, + ChurnPeriodSeconds: uint64(0), + MaximumChurnPercentage: uint8(0), }, - ChurnTrackerStartTime: big.NewInt(0), - ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(0), - MinimumStakeAmount: big.NewInt(1e6), - MaximumStakeAmount: big.NewInt(10e6), - MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), - RewardCalculator: common.Address{}, + MinimumStakeAmount: big.NewInt(1e6), + MaximumStakeAmount: big.NewInt(10e6), + MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), + RewardCalculator: common.Address{}, }, ) Expect(err).Should(BeNil()) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 122fcc8d4..c05ab83c6 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -67,16 +67,15 @@ func DeployAndInitializeNativeTokenStakingManager( opts, nativetokenstakingmanager.PoSValidatorManagerSettings{ BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, - SubnetID: subnet.SubnetID, + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnet.SubnetID, + ChurnPeriodSeconds: uint64(0), + MaximumChurnPercentage: uint8(0), }, - ChurnTrackerStartTime: big.NewInt(0), - ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(0), - MinimumStakeAmount: big.NewInt(1e6), - MaximumStakeAmount: big.NewInt(10e6), - MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), - RewardCalculator: common.Address{}, + MinimumStakeAmount: big.NewInt(1e6), + MaximumStakeAmount: big.NewInt(10e6), + MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), + RewardCalculator: common.Address{}, }, ) Expect(err).Should(BeNil()) @@ -129,16 +128,15 @@ func DeployAndInitializeERC20TokenStakingManager( opts, erc20tokenstakingmanager.PoSValidatorManagerSettings{ BaseSettings: erc20tokenstakingmanager.ValidatorManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, - SubnetID: subnet.SubnetID, + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnet.SubnetID, + ChurnPeriodSeconds: uint64(0), + MaximumChurnPercentage: uint8(0), }, - ChurnTrackerStartTime: big.NewInt(0), - ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(0), - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), - RewardCalculator: common.Address{}, + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), + RewardCalculator: common.Address{}, }, erc20Address, ) From c4ec69c36172b1245c3dcabb0a0001fc590c806c Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 11 Sep 2024 12:57:12 -0400 Subject: [PATCH 240/545] Fix tests --- .../ERC20TokenStakingManager.go | 20 +++--- .../NativeTokenStakingManager.go | 20 +++--- .../PoAValidatorManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 37 +++++------ contracts/staking/ValidatorManager.sol | 23 ++++--- .../interfaces/IPoSValidatorManager.sol | 4 +- .../tests/ERC20TokenStakingManagerTests.t.sol | 27 ++++---- .../NativeTokenStakingManagerTests.t.sol | 30 ++++----- .../tests/PoAValidatorManagerTests.t.sol | 15 ++--- .../staking/tests/ValidatorManagerTests.t.sol | 64 +++++++++---------- tests/flows/staking/poa_to_pos.go | 4 +- tests/utils/staking.go | 8 +-- 12 files changed, 122 insertions(+), 132 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 960ec27c5..b6b060d8b 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -32,8 +32,8 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int + MinimumStakeWeight uint64 + MaximumStakeWeight uint64 MinimumStakeDuration uint64 RewardCalculator common.Address } @@ -48,8 +48,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614a95380380614a9583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149488061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063b771b3bc1461028a578063bee0a03f146102b0578063e74e8cab146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872fda641461023e57806398f3e2b414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613fe0565b6102d6565b005b61012861013836600461401b565b610772565b61017b61014b36600461401b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b61012861019c36600461401b565b6108ce565b6101b46101af36600461401b565b61093b565b6040516001600160401b039091168152602001610185565b6101286101da366004614032565b610951565b6101286101ed36600461404b565b61097c565b61017b610200366004614089565b610b6d565b6101b461021336600461401b565b610b86565b61012861022636600461401b565b610b9a565b610128610239366004613fe0565b610c07565b61017b61024c366004614134565b610c22565b61012861025f36600461404b565b610c47565b61017b6102723660046141d0565b610e76565b610128610285366004614032565b610e89565b6102986005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102be36600461401b565b611046565b6101286102d1366004614204565b611115565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061489c8339815191529184156103285761032582856111f4565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614242565b600481111561036b5761036b614242565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614242565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206148bc8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206148bc8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611490565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500614242565b021790555060208201518154610100600160a81b0319166101006001600160a01b039092169190910217815560408201516001820155606080830151600283018054608086015160a087015160c08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909301516003909201805467ffffffffffffffff191692909316919091179091558201516105d990611504565b5f6105e385611511565b905082606001516001600160401b03168160a001516001600160401b03161161065a5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161066f919061426a565b905061067b86826115f0565b5f610687878584611638565b5f8c815260058a01602052604090209091506106a38282614314565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106d09085906004016143f5565b6020604051808303815f875af11580156106ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107109190614427565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f805160206148dc8339815191529291906107ba90614291565b90501180156107ec575060035f83815260098301602052604090205460ff1660058111156107ea576107ea614242565b145b6108505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610889919060040161443e565b6020604051808303815f875af11580156108a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c99190614427565b505050565b6108d781611855565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061489c833981519152916005600160991b019163ee5b48eb916108899160040161443e565b5f61094b64e8d4a51000836144c8565b92915050565b5f61095b82611924565b905061097881606001516001600160401b03168260400151611cb1565b5050565b5f8051602061489c8339815191525f61099484611ce7565b90505f806109a58360400151611ec8565b50915091506109b385612103565b5f85815260048501602052604081206109cb91613f28565b5f6109d583611511565b9050816001600160401b031681608001516001600160401b03161015610a0d5760405162461bcd60e51b815260040161043b906144e7565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610a525760405162461bcd60e51b815260040161043b90614529565b60015f87815260038701602052604090205460ff166004811115610a7857610a78614242565b14610ae15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61094b6001600160401b03831664e8d4a51000614572565b5f610b9082611511565b60a0015192915050565b610ba381612103565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061489c833981519152916005600160991b019163ee5b48eb916108899160040161443e565b8115610c1957610c1783826111f4565b505b6108c9836121dc565b5f80610c2d86612594565b9050610c3b85828686612641565b9150505b949350505050565b5f8051602061489c8339815191525f610c5f84611ce7565b90505f80610c708360400151611ec8565b5091509150610c7e85611855565b5f8581526005850160205260408120610c9691613f28565b5f610ca083611511565b9050816001600160401b031681608001516001600160401b03161015610cd85760405162461bcd60e51b815260040161043b906144e7565b5f8681526003808701602052604090912001546001600160401b0380841691161115610d165760405162461bcd60e51b815260040161043b90614529565b60035f87815260038701602052604090205460ff166004811115610d3c57610d3c614242565b14610d905760405162461bcd60e51b815260206004820152603160248201525f805160206148bc8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610e349190611cb1565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610e82833384612b06565b9392505050565b5f805160206148dc8339815191525f610ea183611ce7565b90505f80610eb28360400151612ec1565b9150915080610f145760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260078501602052604081208054610f2e90614291565b9050118015610f60575060015f83815260098601602052604090205460ff166005811115610f5e57610f5e614242565b145b610f7c5760405162461bcd60e51b815260040161043b90614589565b5f8281526007850160205260408120610f9491613f28565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206148dc83398151915292919061108e90614291565b90501180156110c0575060015f83815260098301602052604090205460ff1660058111156110be576110be614242565b145b6110dc5760405162461bcd60e51b815260040161043b90614589565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610889919060040161443e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061115e575080546001600160401b03808416911610155b1561117c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556111a78484613062565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561123f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261126691908101906145db565b91509150806112c95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561130c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113309190614427565b8251146113945760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b03161561140a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f80611419846040015161307c565b915091508187146114865760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f8051602061491c8339815191526020526040812060030180545f805160206148dc833981519152916001600160401b03909116908190846114d5836146ad565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61150e815f613254565b50565b611519613f5f565b5f8281525f8051602061491c8339815191526020526040908190208151610100810190925280545f805160206148dc833981519152929190829060ff16600581111561156757611567614242565b600581111561157857611578614242565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061491c833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116b1576116718160016146d2565b61167c906008614572565b5081515f90839083908110611693576116936146e5565b60200101906001600160f81b03191690815f1a90535060010161165d565b505f5b6004811015611714576116c88160036146d2565b6116d3906008614572565b6001901c60f81b826116e68360026146f9565b815181106116f6576116f66146e5565b60200101906001600160f81b03191690815f1a9053506001016116b4565b505f5b60208110156117765761172b81601f6146d2565b611736906008614572565b86901c60f81b826117488360066146f9565b81518110611758576117586146e5565b60200101906001600160f81b03191690815f1a905350600101611717565b505f5b60088110156117e15761178d8160076146d2565b611798906008614572565b6001600160401b038616901c60f81b826117b38360266146f9565b815181106117c3576117c36146e5565b60200101906001600160f81b03191690815f1a905350600101611779565b505f5b600881101561184c576117f88160076146d2565b611803906008614572565b6001600160401b038516901c60f81b8261181e83602e6146f9565b8151811061182e5761182e6146e5565b60200101906001600160f81b03191690815f1a9053506001016117e4565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061489c83398151915292919061189d90614291565b90501180156118cf575060035f83815260038301602052604090205460ff1660048111156118cd576118cd614242565b145b6109785760405162461bcd60e51b815260206004820152603360248201525f805160206148bc83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b61192c613f5f565b5f805160206148dc8339815191525f61194484611ce7565b90505f806119558360400151612ec1565b9150915080156119ba5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600985016020526040808220815161010081019092528054829060ff1660058111156119ec576119ec614242565b60058111156119fd576119fd614242565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8457611a84614242565b1480611aa25750600182516005811115611aa057611aa0614242565b145b611b015760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1657611b16614242565b03611b3d57505f8381526008860160205260408120600491611b389190613f28565b611b41565b5060055b6020808301515f908152600a8801909152604081205581816005811115611b6a57611b6a614242565b90816005811115611b7d57611b7d614242565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115611bb157611bb1614242565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c7c57611c7c614242565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610978906001600160a01b03168284613466565b60408051606080820183525f8083526020830181905292820152905f805160206148dc8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d8391908101906145db565b9150915080611dea5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e4d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ec05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611eec5760405162461bcd60e51b815260040161043b9061470c565b5f805b6002811015611f3b57611f038160016146d2565b611f0e906008614572565b61ffff16868281518110611f2457611f246146e5565b016020015160f81c901b9190911790600101611eef565b5061ffff811615611f5e5760405162461bcd60e51b815260040161043b90614755565b5f805b6004811015611fb957611f758160036146d2565b611f80906008614572565b63ffffffff1687611f928360026146f9565b81518110611fa257611fa26146e5565b016020015160f81c901b9190911790600101611f61565b5063ffffffff8116600314611fe05760405162461bcd60e51b815260040161043b90614798565b5f805b602081101561203557611ff781601f6146d2565b612002906008614572565b8861200e8360066146f9565b8151811061201e5761201e6146e5565b016020015160f81c901b9190911790600101611fe3565b505f805b60088110156120945761204d8160076146d2565b612058906008614572565b6001600160401b03168961206d8360266146f9565b8151811061207d5761207d6146e5565b016020015160f81c901b9190911790600101612039565b505f805b60088110156120f3576120ac8160076146d2565b6120b7906008614572565b6001600160401b03168a6120cc83602e6146f9565b815181106120dc576120dc6146e5565b016020015160f81c901b9190911790600101612098565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061489c83398151915292919061214b90614291565b905011801561217d575060015f83815260038301602052604090205460ff16600481111561217b5761217b614242565b145b6109785760405162461bcd60e51b815260206004820152603860248201525f805160206148bc83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061491c83398151915260205260408082208151610100810190925280545f805160206148dc83398151915293929190829060ff16600581111561222a5761222a614242565b600581111561223b5761223b614242565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122c3576122c3614242565b1461231f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146123995760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff191660018360058111156123dd576123dd614242565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124a9846124a381611490565b5f611638565b5f85815260088501602052604090209091506124c58282614314565b506124d38260a00151611504565b60405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124ff9085906004016143f5565b6020604051808303815f875af115801561251b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253f9190614427565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f8051602061489c833981519152816125ad846134c5565b90505f6125b98261093b565b83549091506001600160401b038216108015906125e357508260010154816001600160401b031611155b610c3f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61264a6134fb565b5f805160206148dc833981519152426001600160401b038516116126cc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b0384166126e3426202a3006146f9565b116127565760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b856127ad5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600a820160205260409020541561281b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128825760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b5f806128c96040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613532565b5f828152600786016020526040902091935091506128e78282614314565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906129149085906004016143f5565b6020604051808303815f875af1158015612930573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129549190614427565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff191660018360058111156129d6576129d6614242565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612a97886138d7565b612aa083611490565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610c3f60015f805160206148fc83398151915255565b5f612b0f6134fb565b5f612b1c6101af846134c5565b90505f8051602061489c8339815191525f612b3687611511565b9050600281516005811115612b4d57612b4d614242565b14612bac5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612bbd91906147df565b9050612bc988826115f0565b5f612bd389611490565b90505f898983604051602001612c1b9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612c3c866138d7565b5f612c488b8486611638565b5f8381526004880160205260409020909150612c648282614314565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c919085906004016143f5565b6020604051808303815f875af1158015612cad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cd19190614427565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d8057612d80614242565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610e8260015f805160206148fc83398151915255565b5f808251602714612ee45760405162461bcd60e51b815260040161043b9061470c565b5f805b6002811015612f3357612efb8160016146d2565b612f06906008614572565b61ffff16858281518110612f1c57612f1c6146e5565b016020015160f81c901b9190911790600101612ee7565b5061ffff811615612f565760405162461bcd60e51b815260040161043b90614755565b5f805b6004811015612fb157612f6d8160036146d2565b612f78906008614572565b63ffffffff1686612f8a8360026146f9565b81518110612f9a57612f9a6146e5565b016020015160f81c901b9190911790600101612f59565b5063ffffffff8116600214612fd85760405162461bcd60e51b815260040161043b90614798565b5f805b602081101561302d57612fef81601f6146d2565b612ffa906008614572565b876130068360066146f9565b81518110613016576130166146e5565b016020015160f81c901b9190911790600101612fdb565b505f86602681518110613042576130426146e5565b016020015191976001600160f81b03199092161515965090945050505050565b61306a6138f5565b61307382613940565b61097881613984565b5f808251602e1461309f5760405162461bcd60e51b815260040161043b9061470c565b5f805b60028110156130ee576130b68160016146d2565b6130c1906008614572565b61ffff168582815181106130d7576130d76146e5565b016020015160f81c901b91909117906001016130a2565b5061ffff8116156131115760405162461bcd60e51b815260040161043b90614755565b5f805b600481101561316c576131288160036146d2565b613133906008614572565b63ffffffff16866131458360026146f9565b81518110613155576131556146e5565b016020015160f81c901b9190911790600101613114565b5063ffffffff81166004146131935760405162461bcd60e51b815260040161043b90614798565b5f805b60208110156131e8576131aa81601f6146d2565b6131b5906008614572565b876131c18360066146f9565b815181106131d1576131d16146e5565b016020015160f81c901b9190911790600101613196565b505f805b6008811015613247576132008160076146d2565b61320b906008614572565b6001600160401b0316886132208360266146f9565b81518110613230576132306146e5565b016020015160f81c901b91909117906001016131ec565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206148dc83398151915290600160401b900460ff165f0361329a57505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b039081166060830152600284015442939116906132eb90846146d2565b10613311576001600160401b038516606082015281815260408101516020820152613330565b848160600181815161332391906147df565b6001600160401b03169052505b5f81602001518260600151606461334791906147ff565b6001600160401b031661335a91906144c8565b600285015490915060ff600160401b909104811690821611156133d55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043b565b84156133fe57856001600160401b0316826040018181516133f691906146f9565b90525061341d565b856001600160401b03168260400181815161341991906146d2565b9052505b50805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b6040516001600160a01b038381166024830152604482018390526108c991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613a38565b5f61094b827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a99565b5f805160206148fc83398151915280546001190161352c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461359c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613613576135d38160016146d2565b6135de906008614572565b5081515f908390839081106135f5576135f56146e5565b60200101906001600160f81b03191690815f1a9053506001016135bf565b505f5b60048110156136715761362a8160036146d2565b613635906008614572565b505f826136438360026146f9565b81518110613653576136536146e5565b60200101906001600160f81b03191690815f1a905350600101613616565b505f5b60208110156136ce5784518160208110613690576136906146e5565b1a60f81b826136a08360066146f9565b815181106136b0576136b06146e5565b60200101906001600160f81b03191690815f1a905350600101613674565b505f5b602081101561372e57846020015181602081106136f0576136f06146e5565b1a60f81b826137008360266146f9565b81518110613710576137106146e5565b60200101906001600160f81b03191690815f1a9053506001016136d1565b505f5b60088110156137a2576137458160076146d2565b613750906008614572565b60ff1685604001516001600160401b0316901c60f81b8282604661377491906146f9565b81518110613784576137846146e5565b60200101906001600160f81b03191690815f1a905350600101613731565b505f5b603081101561380d57846080015181815181106137c4576137c46146e5565b01602001516001600160f81b031916826137df83604e6146f9565b815181106137ef576137ef6146e5565b60200101906001600160f81b03191690815f1a9053506001016137a5565b505f5b600881101561387f576138248160076146d2565b61382f906008614572565b60608601516001600160401b0390811691161c60f81b8261385183607e6146f9565b81518110613861576138616146e5565b60200101906001600160f81b03191690815f1a905350600101613810565b50600281604051613890919061482a565b602060405180830381855afa1580156138ab573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138ce9190614427565b94909350915050565b61150e816001613254565b60015f805160206148fc83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661393e57604051631afcd79f60e31b815260040160405180910390fd5b565b6139486138f5565b61395181613bfb565b61150e608082013560a083013561396e60e0850160c08601614089565b61397f610100860160e08701614845565b613c1c565b61398c6138f5565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613a185760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613a4c6001600160a01b03841683613c77565b905080515f14158015613a70575080806020019051810190613a6e9190614860565b155b156108c957604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613adf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b039190614427565b9050613b1a6001600160a01b038516333086613c84565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613b5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b829190614427565b9050818111613be85760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613bf282826146d2565b95945050505050565b613c036138f5565b613c0b613cc3565b613c13613cd3565b61150e81613cdb565b613c246138f5565b5f5f8051602061489c833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6060610e8283835f613e0c565b6040516001600160a01b038481166024830152838116604483015260648201839052613cbd9186918216906323b872dd90608401613493565b50505050565b613ccb6138f5565b61393e613e9b565b61393e6138f5565b613ce36138f5565b80355f805160206148dc83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613d2f608084016060850161487b565b60ff161115613d9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043b565b613dac608083016060840161487b565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613ddd6060830160408401614089565b60028201805467ffffffffffffffff19166001600160401b039290921691909117905561271060059091015550565b606081471015613e315760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613e4c919061482a565b5f6040518083038185875af1925050503d805f8114613e86576040519150601f19603f3d011682016040523d82523d5f602084013e613e8b565b606091505b5091509150611486868383613ea3565b6138e26138f5565b606082613eb857613eb382613eff565b610e82565b8151158015613ecf57506001600160a01b0384163b155b15613ef857604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610e82565b805115613f0f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613f3490614291565b5f825580601f10613f43575050565b601f0160209004905f5260205f209081019061150e9190613fa3565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613fb7575f8155600101613fa4565b5090565b801515811461150e575f80fd5b803563ffffffff81168114613fdb575f80fd5b919050565b5f805f60608486031215613ff2575f80fd5b83359250602084013561400481613fbb565b915061401260408501613fc8565b90509250925092565b5f6020828403121561402b575f80fd5b5035919050565b5f60208284031215614042575f80fd5b610e8282613fc8565b5f806040838503121561405c575f80fd5b61406583613fc8565b946020939093013593505050565b80356001600160401b0381168114613fdb575f80fd5b5f60208284031215614099575f80fd5b610e8282614073565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156140d8576140d86140a2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614106576141066140a2565b604052919050565b5f6001600160401b03821115614126576141266140a2565b50601f01601f191660200190565b5f805f8060808587031215614147575f80fd5b843593506020850135925061415e60408601614073565b915060608501356001600160401b03811115614178575f80fd5b8501601f81018713614188575f80fd5b803561419b6141968261410e565b6140de565b8181528860208385010111156141af575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156141e1575f80fd5b50508035926020909101359150565b6001600160a01b038116811461150e575f80fd5b5f80828403610120811215614217575f80fd5b61010080821215614226575f80fd5b8493508301359050614237816141f0565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561428a5761428a614256565b5092915050565b600181811c908216806142a557607f821691505b6020821081036142c357634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108c957805f5260205f20601f840160051c810160208510156142ee5750805b601f840160051c820191505b8181101561430d575f81556001016142fa565b5050505050565b81516001600160401b0381111561432d5761432d6140a2565b6143418161433b8454614291565b846142c9565b602080601f831160018114614374575f841561435d5750858301515b5f19600386901b1c1916600185901b1785556143cb565b5f85815260208120601f198616915b828110156143a257888601518255948401946001909101908401614383565b50858210156143bf57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156143ed5781810151838201526020016143d5565b50505f910152565b602081525f82518060208401526144138160408501602087016143d3565b601f01601f19169190910160400192915050565b5f60208284031215614437575f80fd5b5051919050565b5f60208083525f845461445081614291565b806020870152604060018084165f8114614471576001811461448d576144ba565b60ff19851660408a0152604084151560051b8a010195506144ba565b895f5260205f205f5b858110156144b15781548b8201860152908301908801614496565b8a016040019650505b509398975050505050505050565b5f826144e257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761094b5761094b614256565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613fdb81613fbb565b5f80604083850312156145ec575f80fd5b82516001600160401b0380821115614602575f80fd5b9084019060608287031215614615575f80fd5b61461d6140b6565b82518152602080840151614630816141f0565b82820152604084015183811115614645575f80fd5b80850194505087601f850112614659575f80fd5b835192506146696141968461410e565b838152888285870101111561467c575f80fd5b61468b848383018488016143d3565b806040840152508195506146a08188016145d0565b9450505050509250929050565b5f6001600160401b038083168181036146c8576146c8614256565b6001019392505050565b8181038181111561094b5761094b614256565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561094b5761094b614256565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561428a5761428a614256565b6001600160401b0381811683821602808216919082811461482257614822614256565b505092915050565b5f825161483b8184602087016143d3565b9190910192915050565b5f60208284031215614855575f80fd5b8135610e82816141f0565b5f60208284031215614870575f80fd5b8151610e8281613fbb565b5f6020828403121561488b575f80fd5b813560ff81168114610e82575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumStakeWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614b09380380614b0983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149bc8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872e999e1461023e578063872fda6414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004614054565b6102d6565b005b61012861013836600461408f565b61076f565b61017b61014b36600461408f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b61012861019c36600461408f565b6108cb565b6101b46101af36600461408f565b610938565b6040516001600160401b039091168152602001610185565b6101286101da3660046140a6565b61094e565b6101286101ed3660046140bf565b610979565b61017b6102003660046140fd565b610b6a565b6101b461021336600461408f565b610b83565b61012861022636600461408f565b610b97565b610128610239366004614054565b610c04565b61012861024c36600461412a565b610c1f565b61017b61025f3660046141fa565b610cfe565b6101286102723660046140bf565b610d23565b61017b610285366004614296565b610f54565b6101286102983660046140a6565b610f67565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d136600461408f565b611124565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0260205260408120600101545f805160206149108339815191529184156103285761032582856111f3565b90505b5f868152600284016020526040808220815161010081019092528054829060ff16600481111561035a5761035a6142b6565b600481111561036b5761036b6142b6565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f26142b6565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206149308339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206149308339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461148f565b90506104c28260600151611503565b600382526001600160401b0342811660a0840152811660e08301525f88815260028601602052604090208251815484929190829060ff1916600183600481111561050e5761050e6142b6565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105e085611510565b905082606001516001600160401b03168160a001516001600160401b0316116106575760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161066c91906142de565b905061067886826115ef565b5f610684878584611637565b5f8c815260048a01602052604090209091506106a08282614388565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106cd908590600401614469565b6020604051808303815f875af11580156106e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070d919061449b565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f805160206149508339815191529291906107b790614305565b90501180156107e9575060035f83815260098301602052604090205460ff1660058111156107e7576107e76142b6565b145b61084d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161088691906004016144b2565b6020604051808303815f875af11580156108a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c6919061449b565b505050565b6108d481611854565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614910833981519152916005600160991b019163ee5b48eb91610886916004016144b2565b5f61094864e8d4a510008361453c565b92915050565b5f61095882611923565b905061097581606001516001600160401b03168260400151611cb0565b5050565b5f805160206149108339815191525f61099184611ce6565b90505f806109a28360400151611ec7565b50915091506109b085612102565b5f85815260038501602052604081206109c891613f9c565b5f6109d283611510565b9050816001600160401b031681608001516001600160401b03161015610a0a5760405162461bcd60e51b815260040161043b9061455b565b5f8681526002808701602052604090912001546001600160401b03808416600160c01b909204161115610a4f5760405162461bcd60e51b815260040161043b9061459d565b60015f87815260028701602052604090205460ff166004811115610a7557610a756142b6565b14610ade5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f86815260028681016020908152604092839020805460ff19168317815590910180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109486001600160401b03831664e8d4a510006145e6565b5f610b8d82611510565b60a0015192915050565b610ba081612102565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604090819020905163ee5b48eb60e01b81525f80516020614910833981519152916005600160991b019163ee5b48eb91610886916004016144b2565b8115610c1657610c1483826111f3565b505b6108c6836121db565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610c68575080546001600160401b03808416911610155b15610c865760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610cb18484612593565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80610d09866125ad565b9050610d1785828686612666565b9150505b949350505050565b5f805160206149108339815191525f610d3b84611ce6565b90505f80610d4c8360400151611ec7565b5091509150610d5a85611854565b5f8581526004850160205260408120610d7291613f9c565b5f610d7c83611510565b9050816001600160401b031681608001516001600160401b03161015610db45760405162461bcd60e51b815260040161043b9061455b565b5f8681526002860160205260409020600301546001600160401b0380841691161115610df25760405162461bcd60e51b815260040161043b9061459d565b60035f87815260028701602052604090205460ff166004811115610e1857610e186142b6565b14610e6c5760405162461bcd60e51b815260206004820152603160248201525f805160206149308339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260028681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b0316928101839052600182015494810194909452918201546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039093015490921660e0840152610f129190611cb0565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f60833384612b2b565b9392505050565b5f805160206149508339815191525f610f7f83611ce6565b90505f80610f908360400151612ee6565b9150915080610ff25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f8281526007850160205260408120805461100c90614305565b905011801561103e575060015f83815260098601602052604090205460ff16600581111561103c5761103c6142b6565b145b61105a5760405162461bcd60e51b815260040161043b906145fd565b5f828152600785016020526040812061107291613f9c565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061495083398151915292919061116c90614305565b905011801561119e575060015f83815260098301602052604090205460ff16600581111561119c5761119c6142b6565b145b6111ba5760405162461bcd60e51b815260040161043b906145fd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161088691906004016144b2565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561123e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611265919081019061464f565b91509150806112c85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561130b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132f919061449b565b8251146113935760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156114095760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806114188460400151613087565b915091508187146114855760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206149908339815191526020526040812060030180545f80516020614950833981519152916001600160401b03909116908190846114d483614721565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61150d815f61325f565b50565b611518613fd3565b5f8281525f805160206149908339815191526020526040908190208151610100810190925280545f80516020614950833981519152929190829060ff166005811115611566576115666142b6565b6005811115611577576115776142b6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614990833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116b057611670816001614746565b61167b9060086145e6565b5081515f9083908390811061169257611692614759565b60200101906001600160f81b03191690815f1a90535060010161165c565b505f5b6004811015611713576116c7816003614746565b6116d29060086145e6565b6001901c60f81b826116e583600261476d565b815181106116f5576116f5614759565b60200101906001600160f81b03191690815f1a9053506001016116b3565b505f5b60208110156117755761172a81601f614746565b6117359060086145e6565b86901c60f81b8261174783600661476d565b8151811061175757611757614759565b60200101906001600160f81b03191690815f1a905350600101611716565b505f5b60088110156117e05761178c816007614746565b6117979060086145e6565b6001600160401b038616901c60f81b826117b283602661476d565b815181106117c2576117c2614759565b60200101906001600160f81b03191690815f1a905350600101611778565b505f5b600881101561184b576117f7816007614746565b6118029060086145e6565b6001600160401b038516901c60f81b8261181d83602e61476d565b8151811061182d5761182d614759565b60200101906001600160f81b03191690815f1a9053506001016117e3565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061491083398151915292919061189c90614305565b90501180156118ce575060035f83815260028301602052604090205460ff1660048111156118cc576118cc6142b6565b145b6109755760405162461bcd60e51b815260206004820152603360248201525f8051602061493083398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b61192b613fd3565b5f805160206149508339815191525f61194384611ce6565b90505f806119548360400151612ee6565b9150915080156119b95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600985016020526040808220815161010081019092528054829060ff1660058111156119eb576119eb6142b6565b60058111156119fc576119fc6142b6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8357611a836142b6565b1480611aa15750600182516005811115611a9f57611a9f6142b6565b145b611b005760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1557611b156142b6565b03611b3c57505f8381526008860160205260408120600491611b379190613f9c565b611b40565b5060055b6020808301515f908152600a8801909152604081205581816005811115611b6957611b696142b6565b90816005811115611b7c57611b7c6142b6565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115611bb057611bb06142b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c7b57611c7b6142b6565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610975906001600160a01b0316828461347b565b60408051606080820183525f8083526020830181905292820152905f805160206149508339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d82919081019061464f565b9150915080611de95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e4c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ebf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611eeb5760405162461bcd60e51b815260040161043b90614780565b5f805b6002811015611f3a57611f02816001614746565b611f0d9060086145e6565b61ffff16868281518110611f2357611f23614759565b016020015160f81c901b9190911790600101611eee565b5061ffff811615611f5d5760405162461bcd60e51b815260040161043b906147c9565b5f805b6004811015611fb857611f74816003614746565b611f7f9060086145e6565b63ffffffff1687611f9183600261476d565b81518110611fa157611fa1614759565b016020015160f81c901b9190911790600101611f60565b5063ffffffff8116600314611fdf5760405162461bcd60e51b815260040161043b9061480c565b5f805b602081101561203457611ff681601f614746565b6120019060086145e6565b8861200d83600661476d565b8151811061201d5761201d614759565b016020015160f81c901b9190911790600101611fe2565b505f805b60088110156120935761204c816007614746565b6120579060086145e6565b6001600160401b03168961206c83602661476d565b8151811061207c5761207c614759565b016020015160f81c901b9190911790600101612038565b505f805b60088110156120f2576120ab816007614746565b6120b69060086145e6565b6001600160401b03168a6120cb83602e61476d565b815181106120db576120db614759565b016020015160f81c901b9190911790600101612097565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d036020526040812080545f8051602061491083398151915292919061214a90614305565b905011801561217c575060015f83815260028301602052604090205460ff16600481111561217a5761217a6142b6565b145b6109755760405162461bcd60e51b815260206004820152603860248201525f8051602061493083398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061499083398151915260205260408082208151610100810190925280545f8051602061495083398151915293929190829060ff166005811115612229576122296142b6565b600581111561223a5761223a6142b6565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122c2576122c26142b6565b1461231e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146123985760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123a58160a00151611503565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff191660018360058111156123e9576123e96142b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124b5846124af8161148f565b5f611637565b5f85815260088501602052604090209091506124d18282614388565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124fe908590600401614469565b6020604051808303815f875af115801561251a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253e919061449b565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61259b6134da565b6125a482613525565b6109758161357f565b5f5f80516020614910833981519152816125c684613633565b90505f6125d282610938565b83549091506001600160401b0390811690821610801590612608575082546001600160401b03600160401b909104811690821611155b610d1b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61266f613669565b5f80516020614950833981519152426001600160401b038516116126f15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b038416612708426202a30061476d565b1161277b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b856127d25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600a82016020526040902054156128405760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128a75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b6128b0856136a0565b5f806128f76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506136ab565b5f828152600786016020526040902091935091506129158282614388565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612942908590600401614469565b6020604051808303815f875af115801561295e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612982919061449b565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff19166001836005811115612a0457612a046142b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612ac58361148f565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1b60015f8051602061497083398151915255565b5f612b34613669565b5f612b416101af84613633565b90505f805160206149108339815191525f612b5b87611510565b9050600281516005811115612b7257612b726142b6565b14612bd15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b612bda836136a0565b5f838260a00151612beb9190614853565b9050612bf788826115ef565b5f612c018961148f565b90505f898983604051602001612c499392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090505f612c6d8b8486611637565b5f8381526003880160205260409020909150612c898282614388565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cb6908590600401614469565b6020604051808303815f875af1158015612cd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cf6919061449b565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876002015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612da557612da56142b6565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610f6060015f8051602061497083398151915255565b5f808251602714612f095760405162461bcd60e51b815260040161043b90614780565b5f805b6002811015612f5857612f20816001614746565b612f2b9060086145e6565b61ffff16858281518110612f4157612f41614759565b016020015160f81c901b9190911790600101612f0c565b5061ffff811615612f7b5760405162461bcd60e51b815260040161043b906147c9565b5f805b6004811015612fd657612f92816003614746565b612f9d9060086145e6565b63ffffffff1686612faf83600261476d565b81518110612fbf57612fbf614759565b016020015160f81c901b9190911790600101612f7e565b5063ffffffff8116600214612ffd5760405162461bcd60e51b815260040161043b9061480c565b5f805b60208110156130525761301481601f614746565b61301f9060086145e6565b8761302b83600661476d565b8151811061303b5761303b614759565b016020015160f81c901b9190911790600101613000565b505f8660268151811061306757613067614759565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146130aa5760405162461bcd60e51b815260040161043b90614780565b5f805b60028110156130f9576130c1816001614746565b6130cc9060086145e6565b61ffff168582815181106130e2576130e2614759565b016020015160f81c901b91909117906001016130ad565b5061ffff81161561311c5760405162461bcd60e51b815260040161043b906147c9565b5f805b600481101561317757613133816003614746565b61313e9060086145e6565b63ffffffff168661315083600261476d565b8151811061316057613160614759565b016020015160f81c901b919091179060010161311f565b5063ffffffff811660041461319e5760405162461bcd60e51b815260040161043b9061480c565b5f805b60208110156131f3576131b581601f614746565b6131c09060086145e6565b876131cc83600661476d565b815181106131dc576131dc614759565b016020015160f81c901b91909117906001016131a1565b505f805b60088110156132525761320b816007614746565b6132169060086145e6565b6001600160401b03168861322b83602661476d565b8151811061323b5761323b614759565b016020015160f81c901b91909117906001016131f7565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061495083398151915290600160401b900460ff165f036132a557505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b0316606082015242911580613307575060028301548151613303916001600160401b03169061476d565b8210155b1561332d576001600160401b03851660608201528181526040810151602082015261334c565b848160600181815161333f9190614853565b6001600160401b03169052505b606081015161335c906064614873565b602082015160028501546001600160401b0392909216916133879190600160401b900460ff166145e6565b10156133eb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043b565b831561341457846001600160401b03168160400181815161340c919061476d565b905250613433565b846001600160401b03168160400181815161342f9190614746565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b6040516001600160a01b038381166024830152604482018390526108c691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613a63565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661352357604051631afcd79f60e31b815260040160405180910390fd5b565b61352d6134da565b61353681613ac4565b61150d61354960a08301608084016140fd565b61355960c0840160a085016140fd565b61356960e0850160c086016140fd565b61357a610100860160e0870161489e565b613ae5565b6135876134da565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166136135760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f610948827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b86565b5f8051602061497083398151915280546001190161369a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b61150d81600161325f565b5f60608260800151516030146137155760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561378c5761374c816001614746565b6137579060086145e6565b5081515f9083908390811061376e5761376e614759565b60200101906001600160f81b03191690815f1a905350600101613738565b505f5b60048110156137ea576137a3816003614746565b6137ae9060086145e6565b505f826137bc83600261476d565b815181106137cc576137cc614759565b60200101906001600160f81b03191690815f1a90535060010161378f565b505f5b6020811015613847578451816020811061380957613809614759565b1a60f81b8261381983600661476d565b8151811061382957613829614759565b60200101906001600160f81b03191690815f1a9053506001016137ed565b505f5b60208110156138a7578460200151816020811061386957613869614759565b1a60f81b8261387983602661476d565b8151811061388957613889614759565b60200101906001600160f81b03191690815f1a90535060010161384a565b505f5b600881101561391b576138be816007614746565b6138c99060086145e6565b60ff1685604001516001600160401b0316901c60f81b828260466138ed919061476d565b815181106138fd576138fd614759565b60200101906001600160f81b03191690815f1a9053506001016138aa565b505f5b6030811015613986578460800151818151811061393d5761393d614759565b01602001516001600160f81b0319168261395883604e61476d565b8151811061396857613968614759565b60200101906001600160f81b03191690815f1a90535060010161391e565b505f5b60088110156139f85761399d816007614746565b6139a89060086145e6565b60608601516001600160401b0390811691161c60f81b826139ca83607e61476d565b815181106139da576139da614759565b60200101906001600160f81b03191690815f1a905350600101613989565b50600281604051613a0991906148b9565b602060405180830381855afa158015613a24573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a47919061449b565b94909350915050565b60015f8051602061497083398151915255565b5f613a776001600160a01b03841683613ce8565b905080515f14158015613a9b575080806020019051810190613a9991906148d4565b155b156108c657604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b613acc6134da565b613ad4613cf5565b613adc613d05565b61150d81613d0d565b613aed6134da565b5f8051602061491083398151915280546001600160401b03938416600160801b0267ffffffffffffffff60801b19958516600160401b026001600160801b031990921696909416959095179490941792909216179091557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0180546001600160a01b039092166001600160a01b0319909216919091179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613bcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bf0919061449b565b9050613c076001600160a01b038516333086613e41565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c6f919061449b565b9050818111613cd55760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613cdf8282614746565b95945050505050565b6060610f6083835f613e80565b613cfd6134da565b613523613f0f565b6135236134da565b613d156134da565b80355f8051602061495083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613d6160808401606085016148ef565b60ff161115613dce5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043b565b613dde60808301606084016148ef565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613e0f60608301604084016140fd565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6040516001600160a01b038481166024830152838116604483015260648201839052613e7a9186918216906323b872dd906084016134a8565b50505050565b606081471015613ea55760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613ec091906148b9565b5f6040518083038185875af1925050503d805f8114613efa576040519150601f19603f3d011682016040523d82523d5f602084013e613eff565b606091505b5091509150611485868383613f17565b613a506134da565b606082613f2c57613f2782613f73565b610f60565b8151158015613f4357506001600160a01b0384163b155b15613f6c57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610f60565b805115613f835780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613fa890614305565b5f825580601f10613fb7575050565b601f0160209004905f5260205f209081019061150d9190614017565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561402b575f8155600101614018565b5090565b801515811461150d575f80fd5b803563ffffffff8116811461404f575f80fd5b919050565b5f805f60608486031215614066575f80fd5b8335925060208401356140788161402f565b91506140866040850161403c565b90509250925092565b5f6020828403121561409f575f80fd5b5035919050565b5f602082840312156140b6575f80fd5b610f608261403c565b5f80604083850312156140d0575f80fd5b6140d98361403c565b946020939093013593505050565b80356001600160401b038116811461404f575f80fd5b5f6020828403121561410d575f80fd5b610f60826140e7565b6001600160a01b038116811461150d575f80fd5b5f8082840361012081121561413d575f80fd5b6101008082121561414c575f80fd5b849350830135905061415d81614116565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561419e5761419e614168565b60405290565b604051601f8201601f191681016001600160401b03811182821017156141cc576141cc614168565b604052919050565b5f6001600160401b038211156141ec576141ec614168565b50601f01601f191660200190565b5f805f806080858703121561420d575f80fd5b8435935060208501359250614224604086016140e7565b915060608501356001600160401b0381111561423e575f80fd5b8501601f8101871361424e575f80fd5b803561426161425c826141d4565b6141a4565b818152886020838501011115614275575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156142a7575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156142fe576142fe6142ca565b5092915050565b600181811c9082168061431957607f821691505b60208210810361433757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108c657805f5260205f20601f840160051c810160208510156143625750805b601f840160051c820191505b81811015614381575f815560010161436e565b5050505050565b81516001600160401b038111156143a1576143a1614168565b6143b5816143af8454614305565b8461433d565b602080601f8311600181146143e8575f84156143d15750858301515b5f19600386901b1c1916600185901b17855561443f565b5f85815260208120601f198616915b82811015614416578886015182559484019460019091019084016143f7565b508582101561443357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015614461578181015183820152602001614449565b50505f910152565b602081525f8251806020840152614487816040850160208701614447565b601f01601f19169190910160400192915050565b5f602082840312156144ab575f80fd5b5051919050565b5f60208083525f84546144c481614305565b806020870152604060018084165f81146144e557600181146145015761452e565b60ff19851660408a0152604084151560051b8a0101955061452e565b895f5260205f205f5b858110156145255781548b820186015290830190880161450a565b8a016040019650505b509398975050505050505050565b5f8261455657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610948576109486142ca565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b805161404f8161402f565b5f8060408385031215614660575f80fd5b82516001600160401b0380821115614676575f80fd5b9084019060608287031215614689575f80fd5b61469161417c565b825181526020808401516146a481614116565b828201526040840151838111156146b9575f80fd5b80850194505087601f8501126146cd575f80fd5b835192506146dd61425c846141d4565b83815288828587010111156146f0575f80fd5b6146ff84838301848801614447565b80604084015250819550614714818801614644565b9450505050509250929050565b5f6001600160401b0380831681810361473c5761473c6142ca565b6001019392505050565b81810381811115610948576109486142ca565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610948576109486142ca565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156142fe576142fe6142ca565b6001600160401b03818116838216028082169190828114614896576148966142ca565b505092915050565b5f602082840312156148ae575f80fd5b8135610f6081614116565b5f82516148ca818460208701614447565b9190910192915050565b5f602082840312156148e4575f80fd5b8151610f608161402f565b5f602082840312156148ff575f80fd5b813560ff81168114610f60575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -458,23 +458,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0xe74e8cab. +// Initialize is a paid mutator transaction binding the contract method 0x872e999e. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint64,uint64,uint64,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 0xe74e8cab. +// Initialize is a paid mutator transaction binding the contract method 0x872e999e. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint64,uint64,uint64,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 0xe74e8cab. +// Initialize is a paid mutator transaction binding the contract method 0x872e999e. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint64,uint64,uint64,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/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index f2c847684..53912b456 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -32,8 +32,8 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int + MinimumStakeWeight uint64 + MaximumStakeWeight uint64 MinimumStakeDuration uint64 RewardCalculator common.Address } @@ -48,8 +48,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516146c23803806146c283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145758061014d5f395ff3fe608060405260043610610105575f3560e01c80636d0e43fa11610092578063a3a65e4811610062578063a3a65e48146102f4578063b771b3bc14610313578063bee0a03f14610345578063c599e24f14610364578063f40797d714610377575f80fd5b80636d0e43fa1461027857806376f78621146102975780637978da3a146102b657806398f3e2b4146102d5575f80fd5b80632e2194d8116100d85780632e2194d8146101c5578063467ef06f146101fc5780635297fae61461021b578063620658561461023a57806366435abf14610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063162f1f61146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613c7f565b61038a565b005b348015610135575f80fd5b50610128610144366004613cba565b610826565b348015610154575f80fd5b50610193610163366004613cba565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b3480156101b1575f80fd5b506101286101c0366004613cba565b610982565b3480156101d0575f80fd5b506101e46101df366004613cba565b6109ef565b6040516001600160401b03909116815260200161019d565b348015610207575f80fd5b50610128610216366004613cd1565b610a05565b348015610226575f80fd5b50610128610235366004613cea565b610a30565b348015610245575f80fd5b50610193610254366004613d28565b610c21565b348015610264575f80fd5b506101e4610273366004613cba565b610c3a565b348015610283575f80fd5b50610128610292366004613cba565b610c4e565b3480156102a2575f80fd5b506101286102b1366004613c7f565b610cbb565b3480156102c1575f80fd5b506101286102d0366004613d41565b610cd6565b3480156102e0575f80fd5b506101286102ef366004613cea565b610db3565b3480156102ff575f80fd5b5061012861030e366004613cd1565b610fe2565b34801561031e575f80fd5b5061032d6005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610350575f80fd5b5061012861035f366004613cba565b61119f565b610193610372366004613cba565b61126e565b610193610385366004613dea565b61127a565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206144c98339815191529184156103dc576103d9828561129e565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613e7c565b600481111561041f5761041f613e7c565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613e7c565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206144e98339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206144e98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f6105678461153a565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613e7c565b021790555060208201518154610100600160a81b0319166101006001600160a01b039092169190910217815560408201516001820155606080830151600283018054608086015160a087015160c08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909301516003909201805467ffffffffffffffff1916929093169190911790915582015161068d906115ae565b5f610697856115bb565b905082606001516001600160401b03168160a001516001600160401b03161161070e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107239190613ea4565b905061072f868261169a565b5f61073b8785846116e2565b5f8c815260058a01602052604090209091506107578282613f48565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610784908590600401614029565b6020604051808303815f875af11580156107a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c4919061405b565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f8051602061450983398151915292919061086e90613ecb565b90501180156108a0575060035f83815260098301602052604090205460ff16600581111561089e5761089e613e7c565b145b6109045760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161093d9190600401614072565b6020604051808303815f875af1158015610959573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097d919061405b565b505050565b61098b816118ff565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206144c9833981519152916005600160991b019163ee5b48eb9161093d91600401614072565b5f6109ff64e8d4a51000836140fc565b92915050565b5f610a0f826119ce565b9050610a2c81606001516001600160401b03168260400151611d5b565b5050565b5f805160206144c98339815191525f610a4884611d6e565b90505f80610a598360400151611f4f565b5091509150610a678561218a565b5f8581526004850160205260408120610a7f91613bc7565b5f610a89836115bb565b9050816001600160401b031681608001516001600160401b03161015610ac15760405162461bcd60e51b81526004016104ef9061411b565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b065760405162461bcd60e51b81526004016104ef9061415d565b60015f87815260038701602052604090205460ff166004811115610b2c57610b2c613e7c565b14610b955760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109ff6001600160401b03831664e8d4a510006141a6565b5f610c44826115bb565b60a0015192915050565b610c578161218a565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206144c9833981519152916005600160991b019163ee5b48eb9161093d91600401614072565b8115610ccd57610ccb838261129e565b505b61097d83612263565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d1f575080546001600160401b03808416911610155b15610d3d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610d678361261b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f805160206144c98339815191525f610dcb84611d6e565b90505f80610ddc8360400151611f4f565b5091509150610dea856118ff565b5f8581526005850160205260408120610e0291613bc7565b5f610e0c836115bb565b9050816001600160401b031681608001516001600160401b03161015610e445760405162461bcd60e51b81526004016104ef9061411b565b5f8681526003808701602052604090912001546001600160401b0380841691161115610e825760405162461bcd60e51b81526004016104ef9061415d565b60035f87815260038701602052604090205460ff166004811115610ea857610ea8613e7c565b14610efc5760405162461bcd60e51b815260206004820152603160248201525f805160206144e98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610fa09190611d5b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206145098339815191525f610ffa83611d6e565b90505f8061100b836040015161262c565b915091508061106d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526007850160205260408120805461108790613ecb565b90501180156110b9575060015f83815260098601602052604090205460ff1660058111156110b7576110b7613e7c565b145b6110d55760405162461bcd60e51b81526004016104ef906141bd565b5f82815260078501602052604081206110ed91613bc7565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206145098339815191529291906111e790613ecb565b9050118015611219575060015f83815260098301602052604090205460ff16600581111561121757611217613e7c565b145b6112355760405162461bcd60e51b81526004016104ef906141bd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161093d9190600401614072565b5f6109ff8233346127cd565b5f8061128534612b85565b905061129385828686612c2f565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113109190810190614223565b91509150806113735760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113da919061405b565b82511461143e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156114b45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806114c384604001516130f4565b915091508187146115305760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206145498339815191526020526040812060030180545f80516020614509833981519152916001600160401b039091169081908461157f836142f5565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115b8815f6132cc565b50565b6115c3613bfe565b5f8281525f805160206145498339815191526020526040908190208151610100810190925280545f80516020614509833981519152929190829060ff16600581111561161157611611613e7c565b600581111561162257611622613e7c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614549833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561175b5761171b81600161431a565b6117269060086141a6565b5081515f9083908390811061173d5761173d61432d565b60200101906001600160f81b03191690815f1a905350600101611707565b505f5b60048110156117be5761177281600361431a565b61177d9060086141a6565b6001901c60f81b82611790836002614341565b815181106117a0576117a061432d565b60200101906001600160f81b03191690815f1a90535060010161175e565b505f5b6020811015611820576117d581601f61431a565b6117e09060086141a6565b86901c60f81b826117f2836006614341565b815181106118025761180261432d565b60200101906001600160f81b03191690815f1a9053506001016117c1565b505f5b600881101561188b5761183781600761431a565b6118429060086141a6565b6001600160401b038616901c60f81b8261185d836026614341565b8151811061186d5761186d61432d565b60200101906001600160f81b03191690815f1a905350600101611823565b505f5b60088110156118f6576118a281600761431a565b6118ad9060086141a6565b6001600160401b038516901c60f81b826118c883602e614341565b815181106118d8576118d861432d565b60200101906001600160f81b03191690815f1a90535060010161188e565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206144c983398151915292919061194790613ecb565b9050118015611979575060035f83815260038301602052604090205460ff16600481111561197757611977613e7c565b145b610a2c5760405162461bcd60e51b815260206004820152603360248201525f805160206144e983398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b6119d6613bfe565b5f805160206145098339815191525f6119ee84611d6e565b90505f806119ff836040015161262c565b915091508015611a645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600985016020526040808220815161010081019092528054829060ff166005811115611a9657611a96613e7c565b6005811115611aa757611aa7613e7c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b2e57611b2e613e7c565b1480611b4c5750600182516005811115611b4a57611b4a613e7c565b145b611bab5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115611bc057611bc0613e7c565b03611be757505f8381526008860160205260408120600491611be29190613bc7565b611beb565b5060055b6020808301515f908152600a8801909152604081205581816005811115611c1457611c14613e7c565b90816005811115611c2757611c27613e7c565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115611c5b57611c5b613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d2657611d26613e7c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a2c6001600160a01b038216836134de565b60408051606080820183525f8083526020830181905292820152905f805160206145098339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611de3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e0a9190810190614223565b9150915080611e715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611ed45760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611f475760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f805f8351603614611f735760405162461bcd60e51b81526004016104ef90614354565b5f805b6002811015611fc257611f8a81600161431a565b611f959060086141a6565b61ffff16868281518110611fab57611fab61432d565b016020015160f81c901b9190911790600101611f76565b5061ffff811615611fe55760405162461bcd60e51b81526004016104ef9061439d565b5f805b600481101561204057611ffc81600361431a565b6120079060086141a6565b63ffffffff1687612019836002614341565b815181106120295761202961432d565b016020015160f81c901b9190911790600101611fe8565b5063ffffffff81166003146120675760405162461bcd60e51b81526004016104ef906143e0565b5f805b60208110156120bc5761207e81601f61431a565b6120899060086141a6565b88612095836006614341565b815181106120a5576120a561432d565b016020015160f81c901b919091179060010161206a565b505f805b600881101561211b576120d481600761431a565b6120df9060086141a6565b6001600160401b0316896120f4836026614341565b815181106121045761210461432d565b016020015160f81c901b91909117906001016120c0565b505f805b600881101561217a5761213381600761431a565b61213e9060086141a6565b6001600160401b03168a61215383602e614341565b815181106121635761216361432d565b016020015160f81c901b919091179060010161211f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206144c98339815191529291906121d290613ecb565b9050118015612204575060015f83815260038301602052604090205460ff16600481111561220257612202613e7c565b145b610a2c5760405162461bcd60e51b815260206004820152603860248201525f805160206144e983398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f8181525f8051602061454983398151915260205260408082208151610100810190925280545f8051602061450983398151915293929190829060ff1660058111156122b1576122b1613e7c565b60058111156122c2576122c2613e7c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561234a5761234a613e7c565b146123a65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146124205760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff1916600183600581111561246457612464613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125308461252a8161153a565b5f6116e2565b5f858152600885016020526040902090915061254c8282613f48565b5061255a8260a001516115ae565b60405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612586908590600401614029565b6020604051808303815f875af11580156125a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c6919061405b565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b612623613571565b6115b8816135bc565b5f80825160271461264f5760405162461bcd60e51b81526004016104ef90614354565b5f805b600281101561269e5761266681600161431a565b6126719060086141a6565b61ffff168582815181106126875761268761432d565b016020015160f81c901b9190911790600101612652565b5061ffff8116156126c15760405162461bcd60e51b81526004016104ef9061439d565b5f805b600481101561271c576126d881600361431a565b6126e39060086141a6565b63ffffffff16866126f5836002614341565b815181106127055761270561432d565b016020015160f81c901b91909117906001016126c4565b5063ffffffff81166002146127435760405162461bcd60e51b81526004016104ef906143e0565b5f805b60208110156127985761275a81601f61431a565b6127659060086141a6565b87612771836006614341565b815181106127815761278161432d565b016020015160f81c901b9190911790600101612746565b505f866026815181106127ad576127ad61432d565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127d6613600565b5f6127e0836109ef565b90505f805160206144c98339815191525f6127fa876115bb565b905060028151600581111561281157612811613e7c565b146128705760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f838260a001516128819190614427565b905061288d888261169a565b5f6128978961153a565b90505f8989836040516020016128df9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061290086613637565b5f61290c8b84866116e2565b5f83815260048801602052604090209091506129288282613f48565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612955908590600401614029565b6020604051808303815f875af1158015612971573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612995919061405b565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a4457612a44613e7c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061129760015f8051602061452983398151915255565b5f5f805160206144c98339815191528282612b9f826109ef565b83549091506001600160401b03821610801590612bc957508260010154816001600160401b031611155b612c275760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b949350505050565b5f612c38613600565b5f80516020614509833981519152426001600160401b03851611612cba5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612cd1426202a300614341565b11612d445760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612d9b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f868152600a8201602052604090205415612e095760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b8251603014612e705760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b5f80612eb76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613655565b5f82815260078601602052604090209193509150612ed58282613f48565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f02908590600401614029565b6020604051808303815f875af1158015612f1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f42919061405b565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff19166001836005811115612fc457612fc4613e7c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561308588613637565b61308e8361153a565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c2760015f8051602061452983398151915255565b5f808251602e146131175760405162461bcd60e51b81526004016104ef90614354565b5f805b60028110156131665761312e81600161431a565b6131399060086141a6565b61ffff1685828151811061314f5761314f61432d565b016020015160f81c901b919091179060010161311a565b5061ffff8116156131895760405162461bcd60e51b81526004016104ef9061439d565b5f805b60048110156131e4576131a081600361431a565b6131ab9060086141a6565b63ffffffff16866131bd836002614341565b815181106131cd576131cd61432d565b016020015160f81c901b919091179060010161318c565b5063ffffffff811660041461320b5760405162461bcd60e51b81526004016104ef906143e0565b5f805b60208110156132605761322281601f61431a565b61322d9060086141a6565b87613239836006614341565b815181106132495761324961432d565b016020015160f81c901b919091179060010161320e565b505f805b60088110156132bf5761327881600761431a565b6132839060086141a6565b6001600160401b031688613298836026614341565b815181106132a8576132a861432d565b016020015160f81c901b9190911790600101613264565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061450983398151915290600160401b900460ff165f0361331257505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b03908116606083015260028401544293911690613363908461431a565b10613389576001600160401b0385166060820152818152604081015160208201526133a8565b848160600181815161339b9190614427565b6001600160401b03169052505b5f8160200151826060015160646133bf9190614447565b6001600160401b03166133d291906140fc565b600285015490915060ff600160401b9091048116908216111561344d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104ef565b841561347657856001600160401b03168260400181815161346e9190614341565b905250613495565b856001600160401b031682604001818151613491919061431a565b9052505b50805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b804710156135015760405163cd78605960e01b81523060048201526024016104ef565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461354a576040519150601f19603f3d011682016040523d82523d5f602084013e61354f565b606091505b505090508061097d57604051630a12f52160e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166135ba57604051631afcd79f60e31b815260040160405180910390fd5b565b6135c4613571565b6135cd816139fa565b6115b8608082013560a08301356135ea60e0850160c08601613d28565b6135fb610100860160e08701614472565b613a1b565b5f8051602061452983398151915280546001190161363157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6115b88160016132cc565b60015f8051602061452983398151915255565b5f60608260800151516030146136bf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613736576136f681600161431a565b6137019060086141a6565b5081515f908390839081106137185761371861432d565b60200101906001600160f81b03191690815f1a9053506001016136e2565b505f5b60048110156137945761374d81600361431a565b6137589060086141a6565b505f82613766836002614341565b815181106137765761377661432d565b60200101906001600160f81b03191690815f1a905350600101613739565b505f5b60208110156137f157845181602081106137b3576137b361432d565b1a60f81b826137c3836006614341565b815181106137d3576137d361432d565b60200101906001600160f81b03191690815f1a905350600101613797565b505f5b602081101561385157846020015181602081106138135761381361432d565b1a60f81b82613823836026614341565b815181106138335761383361432d565b60200101906001600160f81b03191690815f1a9053506001016137f4565b505f5b60088110156138c55761386881600761431a565b6138739060086141a6565b60ff1685604001516001600160401b0316901c60f81b828260466138979190614341565b815181106138a7576138a761432d565b60200101906001600160f81b03191690815f1a905350600101613854565b505f5b603081101561393057846080015181815181106138e7576138e761432d565b01602001516001600160f81b0319168261390283604e614341565b815181106139125761391261432d565b60200101906001600160f81b03191690815f1a9053506001016138c8565b505f5b60088110156139a25761394781600761431a565b6139529060086141a6565b60608601516001600160401b0390811691161c60f81b8261397483607e614341565b815181106139845761398461432d565b60200101906001600160f81b03191690815f1a905350600101613933565b506002816040516139b3919061448d565b602060405180830381855afa1580156139ce573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139f1919061405b565b94909350915050565b613a02613571565b613a0a613a76565b613a12613a86565b6115b881613a8e565b613a23613571565b5f5f805160206144c9833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613a7e613571565b6135ba613bbf565b6135ba613571565b613a96613571565b80355f8051602061450983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613ae260808401606085016144a8565b60ff161115613b4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104ef565b613b5f60808301606084016144a8565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613b906060830160408401613d28565b60028201805467ffffffffffffffff19166001600160401b039290921691909117905561271060059091015550565b613642613571565b508054613bd390613ecb565b5f825580601f10613be2575050565b601f0160209004905f5260205f20908101906115b89190613c42565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c56575f8155600101613c43565b5090565b80151581146115b8575f80fd5b803563ffffffff81168114613c7a575f80fd5b919050565b5f805f60608486031215613c91575f80fd5b833592506020840135613ca381613c5a565b9150613cb160408501613c67565b90509250925092565b5f60208284031215613cca575f80fd5b5035919050565b5f60208284031215613ce1575f80fd5b61129782613c67565b5f8060408385031215613cfb575f80fd5b613d0483613c67565b946020939093013593505050565b80356001600160401b0381168114613c7a575f80fd5b5f60208284031215613d38575f80fd5b61129782613d12565b5f6101008284031215613d52575f80fd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613d8e57613d8e613d58565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613dbc57613dbc613d58565b604052919050565b5f6001600160401b03821115613ddc57613ddc613d58565b50601f01601f191660200190565b5f805f60608486031215613dfc575f80fd5b83359250613e0c60208501613d12565b915060408401356001600160401b03811115613e26575f80fd5b8401601f81018613613e36575f80fd5b8035613e49613e4482613dc4565b613d94565b818152876020838501011115613e5d575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ec457613ec4613e90565b5092915050565b600181811c90821680613edf57607f821691505b602082108103613d5257634e487b7160e01b5f52602260045260245ffd5b601f82111561097d57805f5260205f20601f840160051c81016020851015613f225750805b601f840160051c820191505b81811015613f41575f8155600101613f2e565b5050505050565b81516001600160401b03811115613f6157613f61613d58565b613f7581613f6f8454613ecb565b84613efd565b602080601f831160018114613fa8575f8415613f915750858301515b5f19600386901b1c1916600185901b178555613fff565b5f85815260208120601f198616915b82811015613fd657888601518255948401946001909101908401613fb7565b5085821015613ff357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015614021578181015183820152602001614009565b50505f910152565b602081525f8251806020840152614047816040850160208701614007565b601f01601f19169190910160400192915050565b5f6020828403121561406b575f80fd5b5051919050565b5f60208083525f845461408481613ecb565b806020870152604060018084165f81146140a557600181146140c1576140ee565b60ff19851660408a0152604084151560051b8a010195506140ee565b895f5260205f205f5b858110156140e55781548b82018601529083019088016140ca565b8a016040019650505b509398975050505050505050565b5f8261411657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109ff576109ff613e90565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b03811681146115b8575f80fd5b8051613c7a81613c5a565b5f8060408385031215614234575f80fd5b82516001600160401b038082111561424a575f80fd5b908401906060828703121561425d575f80fd5b614265613d6c565b8251815260208084015161427881614204565b8282015260408401518381111561428d575f80fd5b80850194505087601f8501126142a1575f80fd5b835192506142b1613e4484613dc4565b83815288828587010111156142c4575f80fd5b6142d384838301848801614007565b806040840152508195506142e8818801614218565b9450505050509250929050565b5f6001600160401b0380831681810361431057614310613e90565b6001019392505050565b818103818111156109ff576109ff613e90565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109ff576109ff613e90565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ec457613ec4613e90565b6001600160401b0381811683821602808216919082811461446a5761446a613e90565b505092915050565b5f60208284031215614482575f80fd5b813561129781614204565b5f825161449e818460208701614007565b9190910192915050565b5f602082840312156144b8575f80fd5b813560ff81168114611297575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumStakeWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161473638038061473683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145e98061014d5f395ff3fe608060405260043610610105575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f4578063b771b3bc14610313578063bee0a03f14610345578063c599e24f14610364578063f40797d714610377575f80fd5b806366435abf146102785780636d0e43fa1461029757806376f78621146102b657806398f3e2b4146102d5575f80fd5b8063162f1f61116100d8578063162f1f61146101c55780632e2194d8146101e4578063467ef06f1461021b5780635297fae61461023a5780636206585614610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630a115d26146101495780630cdd098514610168575b5f80fd5b348015610114575f80fd5b50610128610123366004613cf3565b61038a565b005b348015610135575f80fd5b50610128610144366004613d2e565b610823565b348015610154575f80fd5b50610128610163366004613d45565b61097f565b348015610173575f80fd5b506101b2610182366004613d2e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b3480156101d0575f80fd5b506101286101df366004613d2e565b610a5c565b3480156101ef575f80fd5b506102036101fe366004613d2e565b610ac9565b6040516001600160401b0390911681526020016101bc565b348015610226575f80fd5b50610128610235366004613d5c565b610adf565b348015610245575f80fd5b50610128610254366004613d75565b610b0a565b348015610264575f80fd5b506101b2610273366004613db3565b610cfb565b348015610283575f80fd5b50610203610292366004613d2e565b610d14565b3480156102a2575f80fd5b506101286102b1366004613d2e565b610d28565b3480156102c1575f80fd5b506101286102d0366004613cf3565b610d95565b3480156102e0575f80fd5b506101286102ef366004613d75565b610db0565b3480156102ff575f80fd5b5061012861030e366004613d5c565b610fe1565b34801561031e575f80fd5b5061032d6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b348015610350575f80fd5b5061012861035f366004613d2e565b61119e565b6101b2610372366004613d2e565b61126d565b6101b2610385366004613e5e565b611279565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0260205260408120600101545f8051602061453d8339815191529184156103dc576103d9828561129d565b90505b5f868152600284016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613ef0565b600481111561041f5761041f613ef0565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613ef0565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f8051602061455d8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f8051602061455d8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f61056784611539565b905061057682606001516115ad565b600382526001600160401b0342811660a0840152811660e08301525f88815260028601602052604090208251815484929190829060ff191660018360048111156105c2576105c2613ef0565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610694856115ba565b905082606001516001600160401b03168160a001516001600160401b03161161070b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107209190613f18565b905061072c8682611699565b5f6107388785846116e1565b5f8c815260048a01602052604090209091506107548282613fbc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061078190859060040161409d565b6020604051808303815f875af115801561079d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c191906140cf565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f8051602061457d83398151915292919061086b90613f3f565b905011801561089d575060035f83815260098301602052604090205460ff16600581111561089b5761089b613ef0565b145b6109015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161093a91906004016140e6565b6020604051808303815f875af1158015610956573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097a91906140cf565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109c8575080546001600160401b03808416911610155b156109e65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a10836118fe565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610a658161190f565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061453d833981519152916005600160991b019163ee5b48eb9161093a916004016140e6565b5f610ad964e8d4a5100083614170565b92915050565b5f610ae9826119de565b9050610b0681606001516001600160401b03168260400151611d6b565b5050565b5f8051602061453d8339815191525f610b2284611d7e565b90505f80610b338360400151611f5f565b5091509150610b418561219a565b5f8581526003850160205260408120610b5991613c3b565b5f610b63836115ba565b9050816001600160401b031681608001516001600160401b03161015610b9b5760405162461bcd60e51b81526004016104ef9061418f565b5f8681526002808701602052604090912001546001600160401b03808416600160c01b909204161115610be05760405162461bcd60e51b81526004016104ef906141d1565b60015f87815260028701602052604090205460ff166004811115610c0657610c06613ef0565b14610c6f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f86815260028681016020908152604092839020805460ff19168317815590910180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad96001600160401b03831664e8d4a5100061421a565b5f610d1e826115ba565b60a0015192915050565b610d318161219a565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604090819020905163ee5b48eb60e01b81525f8051602061453d833981519152916005600160991b019163ee5b48eb9161093a916004016140e6565b8115610da757610da5838261129d565b505b61097a83612273565b5f8051602061453d8339815191525f610dc884611d7e565b90505f80610dd98360400151611f5f565b5091509150610de78561190f565b5f8581526004850160205260408120610dff91613c3b565b5f610e09836115ba565b9050816001600160401b031681608001516001600160401b03161015610e415760405162461bcd60e51b81526004016104ef9061418f565b5f8681526002860160205260409020600301546001600160401b0380841691161115610e7f5760405162461bcd60e51b81526004016104ef906141d1565b60035f87815260028701602052604090205460ff166004811115610ea557610ea5613ef0565b14610ef95760405162461bcd60e51b815260206004820152603160248201525f8051602061455d8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f86815260028681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b0316928101839052600182015494810194909452918201546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039093015490921660e0840152610f9f9190611d6b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061457d8339815191525f610ff983611d7e565b90505f8061100a836040015161262b565b915091508061106c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526007850160205260408120805461108690613f3f565b90501180156110b8575060015f83815260098601602052604090205460ff1660058111156110b6576110b6613ef0565b145b6110d45760405162461bcd60e51b81526004016104ef90614231565b5f82815260078501602052604081206110ec91613c3b565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061457d8339815191529291906111e690613f3f565b9050118015611218575060015f83815260098301602052604090205460ff16600581111561121657611216613ef0565b145b6112345760405162461bcd60e51b81526004016104ef90614231565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161093a91906004016140e6565b5f610ad98233346127cc565b5f8061128434612b84565b905061129285828686612c3a565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112e8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261130f9190810190614297565b91509150806113725760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d991906140cf565b82511461143d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156114b35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806114c284604001516130ff565b9150915081871461152f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206145bd8339815191526020526040812060030180545f8051602061457d833981519152916001600160401b039091169081908461157e83614369565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115b7815f6132d7565b50565b6115c2613c72565b5f8281525f805160206145bd8339815191526020526040908190208151610100810190925280545f8051602061457d833981519152929190829060ff16600581111561161057611610613ef0565b600581111561162157611621613ef0565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206145bd833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561175a5761171a81600161438e565b61172590600861421a565b5081515f9083908390811061173c5761173c6143a1565b60200101906001600160f81b03191690815f1a905350600101611706565b505f5b60048110156117bd5761177181600361438e565b61177c90600861421a565b6001901c60f81b8261178f8360026143b5565b8151811061179f5761179f6143a1565b60200101906001600160f81b03191690815f1a90535060010161175d565b505f5b602081101561181f576117d481601f61438e565b6117df90600861421a565b86901c60f81b826117f18360066143b5565b81518110611801576118016143a1565b60200101906001600160f81b03191690815f1a9053506001016117c0565b505f5b600881101561188a5761183681600761438e565b61184190600861421a565b6001600160401b038616901c60f81b8261185c8360266143b5565b8151811061186c5761186c6143a1565b60200101906001600160f81b03191690815f1a905350600101611822565b505f5b60088110156118f5576118a181600761438e565b6118ac90600861421a565b6001600160401b038516901c60f81b826118c783602e6143b5565b815181106118d7576118d76143a1565b60200101906001600160f81b03191690815f1a90535060010161188d565b50949350505050565b6119066134f3565b6115b78161353e565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061453d83398151915292919061195790613f3f565b9050118015611989575060035f83815260028301602052604090205460ff16600481111561198757611987613ef0565b145b610b065760405162461bcd60e51b815260206004820152603360248201525f8051602061455d83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b6119e6613c72565b5f8051602061457d8339815191525f6119fe84611d7e565b90505f80611a0f836040015161262b565b915091508015611a745760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600985016020526040808220815161010081019092528054829060ff166005811115611aa657611aa6613ef0565b6005811115611ab757611ab7613ef0565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b3e57611b3e613ef0565b1480611b5c5750600182516005811115611b5a57611b5a613ef0565b145b611bbb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115611bd057611bd0613ef0565b03611bf757505f8381526008860160205260408120600491611bf29190613c3b565b611bfb565b5060055b6020808301515f908152600a8801909152604081205581816005811115611c2457611c24613ef0565b90816005811115611c3757611c37613ef0565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115611c6b57611c6b613ef0565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d3657611d36613ef0565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610b066001600160a01b03821683613598565b60408051606080820183525f8083526020830181905292820152905f8051602061457d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611df3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e1a9190810190614297565b9150915080611e815760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611ee45760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611f575760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f805f8351603614611f835760405162461bcd60e51b81526004016104ef906143c8565b5f805b6002811015611fd257611f9a81600161438e565b611fa590600861421a565b61ffff16868281518110611fbb57611fbb6143a1565b016020015160f81c901b9190911790600101611f86565b5061ffff811615611ff55760405162461bcd60e51b81526004016104ef90614411565b5f805b60048110156120505761200c81600361438e565b61201790600861421a565b63ffffffff16876120298360026143b5565b81518110612039576120396143a1565b016020015160f81c901b9190911790600101611ff8565b5063ffffffff81166003146120775760405162461bcd60e51b81526004016104ef90614454565b5f805b60208110156120cc5761208e81601f61438e565b61209990600861421a565b886120a58360066143b5565b815181106120b5576120b56143a1565b016020015160f81c901b919091179060010161207a565b505f805b600881101561212b576120e481600761438e565b6120ef90600861421a565b6001600160401b0316896121048360266143b5565b81518110612114576121146143a1565b016020015160f81c901b91909117906001016120d0565b505f805b600881101561218a5761214381600761438e565b61214e90600861421a565b6001600160401b03168a61216383602e6143b5565b81518110612173576121736143a1565b016020015160f81c901b919091179060010161212f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d036020526040812080545f8051602061453d8339815191529291906121e290613f3f565b9050118015612214575060015f83815260028301602052604090205460ff16600481111561221257612212613ef0565b145b610b065760405162461bcd60e51b815260206004820152603860248201525f8051602061455d83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f8181525f805160206145bd83398151915260205260408082208151610100810190925280545f8051602061457d83398151915293929190829060ff1660058111156122c1576122c1613ef0565b60058111156122d2576122d2613ef0565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561235a5761235a613ef0565b146123b65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146124305760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b61243d8160a001516115ad565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff1916600183600581111561248157612481613ef0565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61254d8461254781611539565b5f6116e1565b5f85815260088501602052604090209091506125698282613fbc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061259690859060040161409d565b6020604051808303815f875af11580156125b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d691906140cf565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461264e5760405162461bcd60e51b81526004016104ef906143c8565b5f805b600281101561269d5761266581600161438e565b61267090600861421a565b61ffff16858281518110612686576126866143a1565b016020015160f81c901b9190911790600101612651565b5061ffff8116156126c05760405162461bcd60e51b81526004016104ef90614411565b5f805b600481101561271b576126d781600361438e565b6126e290600861421a565b63ffffffff16866126f48360026143b5565b81518110612704576127046143a1565b016020015160f81c901b91909117906001016126c3565b5063ffffffff81166002146127425760405162461bcd60e51b81526004016104ef90614454565b5f805b60208110156127975761275981601f61438e565b61276490600861421a565b876127708360066143b5565b81518110612780576127806143a1565b016020015160f81c901b9190911790600101612745565b505f866026815181106127ac576127ac6143a1565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127d561362b565b5f6127df83610ac9565b90505f8051602061453d8339815191525f6127f9876115ba565b905060028151600581111561281057612810613ef0565b1461286f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b61287883613662565b5f838260a00151612889919061449b565b90506128958882611699565b5f61289f89611539565b90505f8989836040516020016128e79392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090505f61290b8b84866116e1565b5f83815260038801602052604090209091506129278282613fbc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061295490859060040161409d565b6020604051808303815f875af1158015612970573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299491906140cf565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876002015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a4357612a43613ef0565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061129660015f8051602061459d83398151915255565b5f5f8051602061453d8339815191528282612b9e82610ac9565b83549091506001600160401b0390811690821610801590612bd4575082546001600160401b03600160401b909104811690821611155b612c325760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b949350505050565b5f612c4361362b565b5f8051602061457d833981519152426001600160401b03851611612cc55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612cdc426202a3006143b5565b11612d4f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612da65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f868152600a8201602052604090205415612e145760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b8251603014612e7b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b612e8485613662565b5f80612ecb6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613680565b5f82815260078601602052604090209193509150612ee98282613fbc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f1690859060040161409d565b6020604051808303815f875af1158015612f32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f5691906140cf565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff19166001836005811115612fd857612fd8613ef0565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561309983611539565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c3260015f8051602061459d83398151915255565b5f808251602e146131225760405162461bcd60e51b81526004016104ef906143c8565b5f805b60028110156131715761313981600161438e565b61314490600861421a565b61ffff1685828151811061315a5761315a6143a1565b016020015160f81c901b9190911790600101613125565b5061ffff8116156131945760405162461bcd60e51b81526004016104ef90614411565b5f805b60048110156131ef576131ab81600361438e565b6131b690600861421a565b63ffffffff16866131c88360026143b5565b815181106131d8576131d86143a1565b016020015160f81c901b9190911790600101613197565b5063ffffffff81166004146132165760405162461bcd60e51b81526004016104ef90614454565b5f805b602081101561326b5761322d81601f61438e565b61323890600861421a565b876132448360066143b5565b81518110613254576132546143a1565b016020015160f81c901b9190911790600101613219565b505f805b60088110156132ca5761328381600761438e565b61328e90600861421a565b6001600160401b0316886132a38360266143b5565b815181106132b3576132b36143a1565b016020015160f81c901b919091179060010161326f565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061457d83398151915290600160401b900460ff165f0361331d57505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b031660608201524291158061337f57506002830154815161337b916001600160401b0316906143b5565b8210155b156133a5576001600160401b0385166060820152818152604081015160208201526133c4565b84816060018181516133b7919061449b565b6001600160401b03169052505b60608101516133d49060646144bb565b602082015160028501546001600160401b0392909216916133ff9190600160401b900460ff1661421a565b10156134635760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104ef565b831561348c57846001600160401b03168160400181815161348491906143b5565b9052506134ab565b846001600160401b0316816040018181516134a7919061438e565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661353c57604051631afcd79f60e31b815260040160405180910390fd5b565b6135466134f3565b61354f81613a25565b6115b761356260a0830160808401613db3565b61357260c0840160a08501613db3565b61358260e0850160c08601613db3565b613593610100860160e087016144e6565b613a46565b804710156135bb5760405163cd78605960e01b81523060048201526024016104ef565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613604576040519150601f19603f3d011682016040523d82523d5f602084013e613609565b606091505b505090508061097a57604051630a12f52160e11b815260040160405180910390fd5b5f8051602061459d83398151915280546001190161365c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6115b78160016132d7565b60015f8051602061459d83398151915255565b5f60608260800151516030146136ea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137615761372181600161438e565b61372c90600861421a565b5081515f90839083908110613743576137436143a1565b60200101906001600160f81b03191690815f1a90535060010161370d565b505f5b60048110156137bf5761377881600361438e565b61378390600861421a565b505f826137918360026143b5565b815181106137a1576137a16143a1565b60200101906001600160f81b03191690815f1a905350600101613764565b505f5b602081101561381c57845181602081106137de576137de6143a1565b1a60f81b826137ee8360066143b5565b815181106137fe576137fe6143a1565b60200101906001600160f81b03191690815f1a9053506001016137c2565b505f5b602081101561387c578460200151816020811061383e5761383e6143a1565b1a60f81b8261384e8360266143b5565b8151811061385e5761385e6143a1565b60200101906001600160f81b03191690815f1a90535060010161381f565b505f5b60088110156138f05761389381600761438e565b61389e90600861421a565b60ff1685604001516001600160401b0316901c60f81b828260466138c291906143b5565b815181106138d2576138d26143a1565b60200101906001600160f81b03191690815f1a90535060010161387f565b505f5b603081101561395b5784608001518181518110613912576139126143a1565b01602001516001600160f81b0319168261392d83604e6143b5565b8151811061393d5761393d6143a1565b60200101906001600160f81b03191690815f1a9053506001016138f3565b505f5b60088110156139cd5761397281600761438e565b61397d90600861421a565b60608601516001600160401b0390811691161c60f81b8261399f83607e6143b5565b815181106139af576139af6143a1565b60200101906001600160f81b03191690815f1a90535060010161395e565b506002816040516139de9190614501565b602060405180830381855afa1580156139f9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a1c91906140cf565b94909350915050565b613a2d6134f3565b613a35613ae7565b613a3d613af7565b6115b781613aff565b613a4e6134f3565b5f8051602061453d83398151915280546001600160401b03938416600160801b0267ffffffffffffffff60801b19958516600160401b026001600160801b031990921696909416959095179490941792909216179091557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0180546001600160a01b039092166001600160a01b0319909216919091179055565b613aef6134f3565b61353c613c33565b61353c6134f3565b613b076134f3565b80355f8051602061457d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613b53608084016060850161451c565b60ff161115613bc05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104ef565b613bd0608083016060840161451c565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613c016060830160408401613db3565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b61366d6134f3565b508054613c4790613f3f565b5f825580601f10613c56575050565b601f0160209004905f5260205f20908101906115b79190613cb6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613cca575f8155600101613cb7565b5090565b80151581146115b7575f80fd5b803563ffffffff81168114613cee575f80fd5b919050565b5f805f60608486031215613d05575f80fd5b833592506020840135613d1781613cce565b9150613d2560408501613cdb565b90509250925092565b5f60208284031215613d3e575f80fd5b5035919050565b5f6101008284031215613d56575f80fd5b50919050565b5f60208284031215613d6c575f80fd5b61129682613cdb565b5f8060408385031215613d86575f80fd5b613d8f83613cdb565b946020939093013593505050565b80356001600160401b0381168114613cee575f80fd5b5f60208284031215613dc3575f80fd5b61129682613d9d565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e0257613e02613dcc565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e3057613e30613dcc565b604052919050565b5f6001600160401b03821115613e5057613e50613dcc565b50601f01601f191660200190565b5f805f60608486031215613e70575f80fd5b83359250613e8060208501613d9d565b915060408401356001600160401b03811115613e9a575f80fd5b8401601f81018613613eaa575f80fd5b8035613ebd613eb882613e38565b613e08565b818152876020838501011115613ed1575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f3857613f38613f04565b5092915050565b600181811c90821680613f5357607f821691505b602082108103613d5657634e487b7160e01b5f52602260045260245ffd5b601f82111561097a57805f5260205f20601f840160051c81016020851015613f965750805b601f840160051c820191505b81811015613fb5575f8155600101613fa2565b5050505050565b81516001600160401b03811115613fd557613fd5613dcc565b613fe981613fe38454613f3f565b84613f71565b602080601f83116001811461401c575f84156140055750858301515b5f19600386901b1c1916600185901b178555614073565b5f85815260208120601f198616915b8281101561404a5788860151825594840194600190910190840161402b565b508582101561406757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561409557818101518382015260200161407d565b50505f910152565b602081525f82518060208401526140bb81604085016020870161407b565b601f01601f19169190910160400192915050565b5f602082840312156140df575f80fd5b5051919050565b5f60208083525f84546140f881613f3f565b806020870152604060018084165f8114614119576001811461413557614162565b60ff19851660408a0152604084151560051b8a01019550614162565b895f5260205f205f5b858110156141595781548b820186015290830190880161413e565b8a016040019650505b509398975050505050505050565b5f8261418a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad957610ad9613f04565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b03811681146115b7575f80fd5b8051613cee81613cce565b5f80604083850312156142a8575f80fd5b82516001600160401b03808211156142be575f80fd5b90840190606082870312156142d1575f80fd5b6142d9613de0565b825181526020808401516142ec81614278565b82820152604084015183811115614301575f80fd5b80850194505087601f850112614315575f80fd5b83519250614325613eb884613e38565b8381528882858701011115614338575f80fd5b6143478483830184880161407b565b8060408401525081955061435c81880161428c565b9450505050509250929050565b5f6001600160401b0380831681810361438457614384613f04565b6001019392505050565b81810381811115610ad957610ad9613f04565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad957610ad9613f04565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f3857613f38613f04565b6001600160401b038181168382160280821691908281146144de576144de613f04565b505092915050565b5f602082840312156144f6575f80fd5b813561129681614278565b5f825161451281846020870161407b565b9190910192915050565b5f6020828403121561452c575f80fd5b813560ff81168114611296575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -458,23 +458,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x7978da3a. +// Initialize is a paid mutator transaction binding the contract method 0x0a115d26. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint64,uint64,uint64,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 0x7978da3a. +// Initialize is a paid mutator transaction binding the contract method 0x0a115d26. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint64,uint64,uint64,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 0x7978da3a. +// Initialize is a paid mutator transaction binding the contract method 0x0a115d26. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint64,uint64,uint64,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 4850a65fd..2128f9c4e 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -40,7 +40,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612d9c380380612d9c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c4f8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c8063715018a611610088578063a3a65e4811610063578063a3a65e48146101f8578063b771b3bc1461020b578063bee0a03f14610219578063f2fde38b1461022c575f80fd5b8063715018a6146101995780638da5cb5b146101a157806397fb70d4146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f14610148578063580a40061461015b57806366435abf1461016e575b5f80fd5b6100e26100dd36600461255e565b61023f565b005b6101226100f236600461255e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612622565b6103a0565b6100e26101563660046126c5565b6103c0565b6100e2610169366004612703565b6103cd565b61018161017c36600461255e565b6104db565b6040516001600160401b03909116815260200161012c565b6100e26104ef565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101f336600461255e565b610502565b6100e26102063660046126c5565b61050e565b6101cd6005600160991b0181565b6100e261022736600461255e565b6106cb565b6100e261023a36600461273f565b61079a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f80516020612c238339815191529291906102879061275a565b90501180156102b9575060035f83815260098301602052604090205460ff1660058111156102b7576102b7612792565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016127a6565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612830565b505050565b5f6103a96107d4565b6103b58486858561082f565b90505b949350505050565b6103c981610d07565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104115750825b90505f826001600160401b0316600114801561042c5750303b155b90508115801561043a575080155b156104585760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561048257845460ff60401b1916600160401b1785555b61048c8787611094565b83156104d257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6104e5826110ae565b60a0015192915050565b6104f76107d4565b6105005f6111a0565b565b61050b81611210565b50565b5f80516020612c238339815191525f610526836115db565b90505f8061053783604001516117bc565b91509150806105995760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600785016020526040812080546105b39061275a565b90501180156105e5575060015f83815260098601602052604090205460ff1660058111156105e3576105e3612792565b145b6106015760405162461bcd60e51b815260040161031990612847565b5f8281526007850160205260408120610619916124cb565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612c238339815191529291906107139061275a565b9050118015610745575060015f83815260098301602052604090205460ff16600581111561074357610743612792565b145b6107615760405162461bcd60e51b815260040161031990612847565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016127a6565b6107a26107d4565b6001600160a01b0381166107cb57604051631e4fbdf760e01b81525f6004820152602401610319565b61050b816111a0565b336108067f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105005760405163118cdaa760e01b8152336004820152602401610319565b5f610838611a1b565b5f80516020612c23833981519152426001600160401b038516116108ba5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610319565b6001600160401b0384166108d1426202a3006128a2565b116109445760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610319565b8561099b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f868152600a8201602052604090205415610a095760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610a705760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b5f80610ab76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611a65565b5f82815260078601602052604090209193509150610ad58282612906565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610b029085906004016129e7565b6020604051808303815f875af1158015610b1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b429190612830565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff19166001836005811115610bc457610bc4612792565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610c8588611e0a565b610c8e83611e15565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610d0f612502565b5f80516020612c238339815191525f610d27846115db565b90505f80610d3883604001516117bc565b915091508015610d9d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600985016020526040808220815161010081019092528054829060ff166005811115610dcf57610dcf612792565b6005811115610de057610de0612792565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610e6757610e67612792565b1480610e855750600182516005811115610e8357610e83612792565b145b610ee45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b600382516005811115610ef957610ef9612792565b03610f2057505f8381526008860160205260408120600491610f1b91906124cb565b610f24565b5060055b6020808301515f908152600a8801909152604081205581816005811115610f4d57610f4d612792565b90816005811115610f6057610f60612792565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115610f9457610f94612792565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561105f5761105f612792565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b61109c611ec2565b6110a582611f0b565b6103c981611f2c565b6110b6612502565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb096020526040908190208151610100810190925280545f80516020612c23833981519152929190829060ff16600581111561111757611117612792565b600581111561112857611128612792565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0960205260408082208151610100810190925280545f80516020612c2383398151915293929190829060ff16600581111561127157611271612792565b600581111561128257611282612792565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561130a5761130a612792565b146113665760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146113e05760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff1916600183600581111561142457611424612792565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6114f0846114ea81611e15565b5f611f3d565b5f858152600885016020526040902090915061150c8282612906565b5061151a8260a0015161215a565b60405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906115469085906004016129e7565b6020604051808303815f875af1158015611562573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115869190612830565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612c238339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611650573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116779190810190612a28565b91509150806116de5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146117415760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b0316156117b45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146118215760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b600281101561187057611838816001612afa565b611843906008612b0d565b61ffff1685828151811061185957611859612b24565b016020015160f81c901b9190911790600101611824565b5061ffff8116156118cf5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b600481101561192a576118e6816003612afa565b6118f1906008612b0d565b63ffffffff16866119038360026128a2565b8151811061191357611913612b24565b016020015160f81c901b91909117906001016118d2565b5063ffffffff81166002146119915760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b60208110156119e6576119a881601f612afa565b6119b3906008612b0d565b876119bf8360066128a2565b815181106119cf576119cf612b24565b016020015160f81c901b9190911790600101611994565b505f866026815181106119fb576119fb612b24565b016020015191976001600160f81b03199092161515965090945050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a5f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6060826080015151603014611acf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611b4657611b06816001612afa565b611b11906008612b0d565b5081515f90839083908110611b2857611b28612b24565b60200101906001600160f81b03191690815f1a905350600101611af2565b505f5b6004811015611ba457611b5d816003612afa565b611b68906008612b0d565b505f82611b768360026128a2565b81518110611b8657611b86612b24565b60200101906001600160f81b03191690815f1a905350600101611b49565b505f5b6020811015611c015784518160208110611bc357611bc3612b24565b1a60f81b82611bd38360066128a2565b81518110611be357611be3612b24565b60200101906001600160f81b03191690815f1a905350600101611ba7565b505f5b6020811015611c615784602001518160208110611c2357611c23612b24565b1a60f81b82611c338360266128a2565b81518110611c4357611c43612b24565b60200101906001600160f81b03191690815f1a905350600101611c04565b505f5b6008811015611cd557611c78816007612afa565b611c83906008612b0d565b60ff1685604001516001600160401b0316901c60f81b82826046611ca791906128a2565b81518110611cb757611cb7612b24565b60200101906001600160f81b03191690815f1a905350600101611c64565b505f5b6030811015611d405784608001518181518110611cf757611cf7612b24565b01602001516001600160f81b03191682611d1283604e6128a2565b81518110611d2257611d22612b24565b60200101906001600160f81b03191690815f1a905350600101611cd8565b505f5b6008811015611db257611d57816007612afa565b611d62906008612b0d565b60608601516001600160401b0390811691161c60f81b82611d8483607e6128a2565b81518110611d9457611d94612b24565b60200101906001600160f81b03191690815f1a905350600101611d43565b50600281604051611dc39190612b38565b602060405180830381855afa158015611dde573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611e019190612830565b94909350915050565b61050b816001612160565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb096020526040812060030180545f80516020612c23833981519152916001600160401b0390911690819084611e6d83612b53565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661050057604051631afcd79f60e31b815260040160405180910390fd5b611f13611ec2565b611f1b612372565b611f23612382565b61050b8161238a565b611f34611ec2565b61050b816124bb565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611fb657611f76816001612afa565b611f81906008612b0d565b5081515f90839083908110611f9857611f98612b24565b60200101906001600160f81b03191690815f1a905350600101611f62565b505f5b600481101561201957611fcd816003612afa565b611fd8906008612b0d565b6001901c60f81b82611feb8360026128a2565b81518110611ffb57611ffb612b24565b60200101906001600160f81b03191690815f1a905350600101611fb9565b505f5b602081101561207b5761203081601f612afa565b61203b906008612b0d565b86901c60f81b8261204d8360066128a2565b8151811061205d5761205d612b24565b60200101906001600160f81b03191690815f1a90535060010161201c565b505f5b60088110156120e657612092816007612afa565b61209d906008612b0d565b6001600160401b038616901c60f81b826120b88360266128a2565b815181106120c8576120c8612b24565b60200101906001600160f81b03191690815f1a90535060010161207e565b505f5b6008811015612151576120fd816007612afa565b612108906008612b0d565b6001600160401b038516901c60f81b8261212383602e6128a2565b8151811061213357612133612b24565b60200101906001600160f81b03191690815f1a9053506001016120e9565b50949350505050565b61050b815f5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612c2383398151915290600160401b900460ff165f036121a657505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b039081166060830152600284015442939116906121f79084612afa565b1061221d576001600160401b03851660608201528181526040810151602082015261223c565b848160600181815161222f9190612b78565b6001600160401b03169052505b5f8160200151826060015160646122539190612b9f565b6001600160401b03166122669190612bca565b600285015490915060ff600160401b909104811690821611156122e15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610319565b841561230a57856001600160401b03168260400181815161230291906128a2565b905250612329565b856001600160401b0316826040018181516123259190612afa565b9052505b50805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b61237a611ec2565b6105006124c3565b610500611ec2565b612392611ec2565b80355f80516020612c2383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146123de6080840160608501612be9565b60ff16111561244b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610319565b61245b6080830160608401612be9565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561248c6060830160408401612c09565b60028201805467ffffffffffffffff19166001600160401b039290921691909117905561271060059091015550565b6107a2611ec2565b611e9c611ec2565b5080546124d79061275a565b5f825580601f106124e6575050565b601f0160209004905f5260205f209081019061050b9190612546565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561255a575f8155600101612547565b5090565b5f6020828403121561256e575f80fd5b5035919050565b80356001600160401b038116811461258b575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156125c6576125c6612590565b60405290565b604051601f8201601f191681016001600160401b03811182821017156125f4576125f4612590565b604052919050565b5f6001600160401b0382111561261457612614612590565b50601f01601f191660200190565b5f805f8060808587031215612635575f80fd5b61263e85612575565b93506020850135925061265360408601612575565b915060608501356001600160401b0381111561266d575f80fd5b8501601f8101871361267d575f80fd5b803561269061268b826125fc565b6125cc565b8181528860208385010111156126a4575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156126d5575f80fd5b813563ffffffff811681146126e8575f80fd5b9392505050565b6001600160a01b038116811461050b575f80fd5b5f8082840360a0811215612715575f80fd5b6080811215612722575f80fd5b508291506080830135612734816126ef565b809150509250929050565b5f6020828403121561274f575f80fd5b81356126e8816126ef565b600181811c9082168061276e57607f821691505b60208210810361278c57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f84546127b88161275a565b806020870152604060018084165f81146127d957600181146127f557612822565b60ff19851660408a0152604084151560051b8a01019550612822565b895f5260205f205f5b858110156128195781548b82018601529083019088016127fe565b8a016040019650505b509398975050505050505050565b5f60208284031215612840575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156128b5576128b561288e565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156128e05750805b601f840160051c820191505b818110156128ff575f81556001016128ec565b5050505050565b81516001600160401b0381111561291f5761291f612590565b6129338161292d845461275a565b846128bb565b602080601f831160018114612966575f841561294f5750858301515b5f19600386901b1c1916600185901b1785556129bd565b5f85815260208120601f198616915b8281101561299457888601518255948401946001909101908401612975565b50858210156129b157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156129df5781810151838201526020016129c7565b50505f910152565b602081525f8251806020840152612a058160408501602087016129c5565b601f01601f19169190910160400192915050565b8051801515811461258b575f80fd5b5f8060408385031215612a39575f80fd5b82516001600160401b0380821115612a4f575f80fd5b9084019060608287031215612a62575f80fd5b612a6a6125a4565b82518152602080840151612a7d816126ef565b82820152604084015183811115612a92575f80fd5b80850194505087601f850112612aa6575f80fd5b83519250612ab661268b846125fc565b8381528882858701011115612ac9575f80fd5b612ad8848383018488016129c5565b80604084015250819550612aed818801612a19565b9450505050509250929050565b818103818111156128b5576128b561288e565b80820281158282048414176128b5576128b561288e565b634e487b7160e01b5f52603260045260245ffd5b5f8251612b498184602087016129c5565b9190910192915050565b5f6001600160401b03808316818103612b6e57612b6e61288e565b6001019392505050565b6001600160401b03818116838216019080821115612b9857612b9861288e565b5092915050565b6001600160401b03818116838216028082169190828114612bc257612bc261288e565b505092915050565b5f82612be457634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612bf9575f80fd5b813560ff811681146126e8575f80fd5b5f60208284031215612c19575f80fd5b6126e88261257556fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612d8e380380612d8e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c418061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c8063715018a611610088578063a3a65e4811610063578063a3a65e48146101f8578063b771b3bc1461020b578063bee0a03f14610219578063f2fde38b1461022c575f80fd5b8063715018a6146101995780638da5cb5b146101a157806397fb70d4146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f14610148578063580a40061461015b57806366435abf1461016e575b5f80fd5b6100e26100dd36600461256f565b61023f565b005b6101226100f236600461256f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612633565b6103a0565b6100e26101563660046126d6565b6103c0565b6100e2610169366004612714565b6103cd565b61018161017c36600461256f565b6104db565b6040516001600160401b03909116815260200161012c565b6100e26104ef565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101f336600461256f565b610502565b6100e26102063660046126d6565b61050e565b6101cd6005600160991b0181565b6100e261022736600461256f565b6106cb565b6100e261023a366004612750565b61079a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f80516020612c158339815191529291906102879061276b565b90501180156102b9575060035f83815260098301602052604090205460ff1660058111156102b7576102b76127a3565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016127b7565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612841565b505050565b5f6103a96107d4565b6103b58486858561082f565b90505b949350505050565b6103c981610d07565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104115750825b90505f826001600160401b0316600114801561042c5750303b155b90508115801561043a575080155b156104585760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561048257845460ff60401b1916600160401b1785555b61048c8787611094565b83156104d257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6104e5826110ae565b60a0015192915050565b6104f76107d4565b6105005f6111a0565b565b61050b81611210565b50565b5f80516020612c158339815191525f610526836115db565b90505f8061053783604001516117bc565b91509150806105995760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600785016020526040812080546105b39061276b565b90501180156105e5575060015f83815260098601602052604090205460ff1660058111156105e3576105e36127a3565b145b6106015760405162461bcd60e51b815260040161031990612858565b5f8281526007850160205260408120610619916124dc565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612c158339815191529291906107139061276b565b9050118015610745575060015f83815260098301602052604090205460ff166005811115610743576107436127a3565b145b6107615760405162461bcd60e51b815260040161031990612858565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016127b7565b6107a26107d4565b6001600160a01b0381166107cb57604051631e4fbdf760e01b81525f6004820152602401610319565b61050b816111a0565b336108067f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105005760405163118cdaa760e01b8152336004820152602401610319565b5f610838611a1b565b5f80516020612c15833981519152426001600160401b038516116108ba5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610319565b6001600160401b0384166108d1426202a3006128b3565b116109445760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610319565b8561099b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f868152600a8201602052604090205415610a095760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610a705760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b610a7985611a65565b5f80610ac06040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611a70565b5f82815260078601602052604090209193509150610ade8282612917565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610b0b9085906004016129f8565b6020604051808303815f875af1158015610b27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4b9190612841565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff19166001836005811115610bcd57610bcd6127a3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610c8e83611e15565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610d0f612513565b5f80516020612c158339815191525f610d27846115db565b90505f80610d3883604001516117bc565b915091508015610d9d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600985016020526040808220815161010081019092528054829060ff166005811115610dcf57610dcf6127a3565b6005811115610de057610de06127a3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610e6757610e676127a3565b1480610e855750600182516005811115610e8357610e836127a3565b145b610ee45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b600382516005811115610ef957610ef96127a3565b03610f2057505f8381526008860160205260408120600491610f1b91906124dc565b610f24565b5060055b6020808301515f908152600a8801909152604081205581816005811115610f4d57610f4d6127a3565b90816005811115610f6057610f606127a3565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115610f9457610f946127a3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561105f5761105f6127a3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b61109c611ec2565b6110a582611f0b565b6103c981611f2c565b6110b6612513565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb096020526040908190208151610100810190925280545f80516020612c15833981519152929190829060ff166005811115611117576111176127a3565b6005811115611128576111286127a3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0960205260408082208151610100810190925280545f80516020612c1583398151915293929190829060ff166005811115611271576112716127a3565b6005811115611282576112826127a3565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561130a5761130a6127a3565b146113665760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146113e05760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b6113ed8160a00151611f3d565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff19166001836005811115611431576114316127a3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6114fd846114f781611e15565b5f611f47565b5f85815260088501602052604090209091506115198282612917565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906115469085906004016129f8565b6020604051808303815f875af1158015611562573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115869190612841565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612c158339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611650573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116779190810190612a39565b91509150806116de5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146117415760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b0316156117b45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146118215760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b600281101561187057611838816001612b0b565b611843906008612b1e565b61ffff1685828151811061185957611859612b35565b016020015160f81c901b9190911790600101611824565b5061ffff8116156118cf5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b600481101561192a576118e6816003612b0b565b6118f1906008612b1e565b63ffffffff16866119038360026128b3565b8151811061191357611913612b35565b016020015160f81c901b91909117906001016118d2565b5063ffffffff81166002146119915760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b60208110156119e6576119a881601f612b0b565b6119b3906008612b1e565b876119bf8360066128b3565b815181106119cf576119cf612b35565b016020015160f81c901b9190911790600101611994565b505f866026815181106119fb576119fb612b35565b016020015191976001600160f81b03199092161515965090945050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a5f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b61050b816001612164565b5f6060826080015151603014611ada5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611b5157611b11816001612b0b565b611b1c906008612b1e565b5081515f90839083908110611b3357611b33612b35565b60200101906001600160f81b03191690815f1a905350600101611afd565b505f5b6004811015611baf57611b68816003612b0b565b611b73906008612b1e565b505f82611b818360026128b3565b81518110611b9157611b91612b35565b60200101906001600160f81b03191690815f1a905350600101611b54565b505f5b6020811015611c0c5784518160208110611bce57611bce612b35565b1a60f81b82611bde8360066128b3565b81518110611bee57611bee612b35565b60200101906001600160f81b03191690815f1a905350600101611bb2565b505f5b6020811015611c6c5784602001518160208110611c2e57611c2e612b35565b1a60f81b82611c3e8360266128b3565b81518110611c4e57611c4e612b35565b60200101906001600160f81b03191690815f1a905350600101611c0f565b505f5b6008811015611ce057611c83816007612b0b565b611c8e906008612b1e565b60ff1685604001516001600160401b0316901c60f81b82826046611cb291906128b3565b81518110611cc257611cc2612b35565b60200101906001600160f81b03191690815f1a905350600101611c6f565b505f5b6030811015611d4b5784608001518181518110611d0257611d02612b35565b01602001516001600160f81b03191682611d1d83604e6128b3565b81518110611d2d57611d2d612b35565b60200101906001600160f81b03191690815f1a905350600101611ce3565b505f5b6008811015611dbd57611d62816007612b0b565b611d6d906008612b1e565b60608601516001600160401b0390811691161c60f81b82611d8f83607e6128b3565b81518110611d9f57611d9f612b35565b60200101906001600160f81b03191690815f1a905350600101611d4e565b50600281604051611dce9190612b49565b602060405180830381855afa158015611de9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611e0c9190612841565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb096020526040812060030180545f80516020612c15833981519152916001600160401b0390911690819084611e6d83612b64565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661050057604051631afcd79f60e31b815260040160405180910390fd5b611f13611ec2565b611f1b612380565b611f23612390565b61050b81612398565b611f34611ec2565b61050b816124cc565b61050b815f612164565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611fc057611f80816001612b0b565b611f8b906008612b1e565b5081515f90839083908110611fa257611fa2612b35565b60200101906001600160f81b03191690815f1a905350600101611f6c565b505f5b600481101561202357611fd7816003612b0b565b611fe2906008612b1e565b6001901c60f81b82611ff58360026128b3565b8151811061200557612005612b35565b60200101906001600160f81b03191690815f1a905350600101611fc3565b505f5b60208110156120855761203a81601f612b0b565b612045906008612b1e565b86901c60f81b826120578360066128b3565b8151811061206757612067612b35565b60200101906001600160f81b03191690815f1a905350600101612026565b505f5b60088110156120f05761209c816007612b0b565b6120a7906008612b1e565b6001600160401b038616901c60f81b826120c28360266128b3565b815181106120d2576120d2612b35565b60200101906001600160f81b03191690815f1a905350600101612088565b505f5b600881101561215b57612107816007612b0b565b612112906008612b1e565b6001600160401b038516901c60f81b8261212d83602e6128b3565b8151811061213d5761213d612b35565b60200101906001600160f81b03191690815f1a9053506001016120f3565b50949350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612c1583398151915290600160401b900460ff165f036121aa57505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b031660608201524291158061220c575060028301548151612208916001600160401b0316906128b3565b8210155b15612232576001600160401b038516606082015281815260408101516020820152612251565b84816060018181516122449190612b89565b6001600160401b03169052505b6060810151612261906064612bb0565b602082015160028501546001600160401b03929092169161228c9190600160401b900460ff16612b1e565b10156122f05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610319565b831561231957846001600160401b03168160400181815161231191906128b3565b905250612338565b846001600160401b0316816040018181516123349190612b0b565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b612388611ec2565b6105006124d4565b610500611ec2565b6123a0611ec2565b80355f80516020612c1583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146123ec6080840160608501612bdb565b60ff1611156124595760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610319565b6124696080830160608401612bdb565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561249a6060830160408401612bfb565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6107a2611ec2565b611e9c611ec2565b5080546124e89061276b565b5f825580601f106124f7575050565b601f0160209004905f5260205f209081019061050b9190612557565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561256b575f8155600101612558565b5090565b5f6020828403121561257f575f80fd5b5035919050565b80356001600160401b038116811461259c575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156125d7576125d76125a1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612605576126056125a1565b604052919050565b5f6001600160401b03821115612625576126256125a1565b50601f01601f191660200190565b5f805f8060808587031215612646575f80fd5b61264f85612586565b93506020850135925061266460408601612586565b915060608501356001600160401b0381111561267e575f80fd5b8501601f8101871361268e575f80fd5b80356126a161269c8261260d565b6125dd565b8181528860208385010111156126b5575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156126e6575f80fd5b813563ffffffff811681146126f9575f80fd5b9392505050565b6001600160a01b038116811461050b575f80fd5b5f8082840360a0811215612726575f80fd5b6080811215612733575f80fd5b50829150608083013561274581612700565b809150509250929050565b5f60208284031215612760575f80fd5b81356126f981612700565b600181811c9082168061277f57607f821691505b60208210810361279d57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f84546127c98161276b565b806020870152604060018084165f81146127ea576001811461280657612833565b60ff19851660408a0152604084151560051b8a01019550612833565b895f5260205f205f5b8581101561282a5781548b820186015290830190880161280f565b8a016040019650505b509398975050505050505050565b5f60208284031215612851575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156128c6576128c661289f565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156128f15750805b601f840160051c820191505b81811015612910575f81556001016128fd565b5050505050565b81516001600160401b03811115612930576129306125a1565b6129448161293e845461276b565b846128cc565b602080601f831160018114612977575f84156129605750858301515b5f19600386901b1c1916600185901b1785556129ce565b5f85815260208120601f198616915b828110156129a557888601518255948401946001909101908401612986565b50858210156129c257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156129f05781810151838201526020016129d8565b50505f910152565b602081525f8251806020840152612a168160408501602087016129d6565b601f01601f19169190910160400192915050565b8051801515811461259c575f80fd5b5f8060408385031215612a4a575f80fd5b82516001600160401b0380821115612a60575f80fd5b9084019060608287031215612a73575f80fd5b612a7b6125b5565b82518152602080840151612a8e81612700565b82820152604084015183811115612aa3575f80fd5b80850194505087601f850112612ab7575f80fd5b83519250612ac761269c8461260d565b8381528882858701011115612ada575f80fd5b612ae9848383018488016129d6565b80604084015250819550612afe818801612a2a565b9450505050509250929050565b818103818111156128c6576128c661289f565b80820281158282048414176128c6576128c661289f565b634e487b7160e01b5f52603260045260245ffd5b5f8251612b5a8184602087016129d6565b9190910192915050565b5f6001600160401b03808316818103612b7f57612b7f61289f565b6001019392505050565b6001600160401b03818116838216019080821115612ba957612ba961289f565b5092915050565b6001600160401b03818116838216028082169190828114612bd357612bd361289f565b505092915050565b5f60208284031215612beb575f80fd5b813560ff811681146126f9575f80fd5b5f60208284031215612c0b575f80fd5b6126f98261258656fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index c70e94072..4c195e8b4 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -21,10 +21,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.PoSValidatorManager struct PoSValidatorManagerStorage { - /// @notice The minimum amount of stake required to be a validator. - uint256 _minimumStakeAmount; - /// @notice The maximum amount of stake allowed to be a validator. - uint256 _maximumStakeAmount; + /// @notice The minimum weight of stake required to be a validator. + uint64 _minimumStakeWeight; + /// @notice The maximum weight of stake allowed to be a validator. + uint64 _maximumStakeWeight; /// @notice The minimum amount of time a validator must be staked for. uint64 _minimumStakeDuration; /// @notice The reward calculator for this validator manager. @@ -62,8 +62,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager { __ValidatorManager_init(settings.baseSettings); __POS_Validator_Manager_init_unchained({ - minimumStakeAmount: settings.minimumStakeAmount, - maximumStakeAmount: settings.maximumStakeAmount, + minimumStakeWeight: settings.minimumStakeWeight, + maximumStakeWeight: settings.maximumStakeWeight, minimumStakeDuration: settings.minimumStakeDuration, rewardCalculator: settings.rewardCalculator }); @@ -71,14 +71,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // solhint-disable-next-line func-name-mixedcase function __POS_Validator_Manager_init_unchained( - uint256 minimumStakeAmount, - uint256 maximumStakeAmount, + uint64 minimumStakeWeight, + uint64 maximumStakeWeight, uint64 minimumStakeDuration, IRewardCalculator rewardCalculator ) internal onlyInitializing { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - $._minimumStakeAmount = minimumStakeAmount; - $._maximumStakeAmount = maximumStakeAmount; + $._minimumStakeWeight = minimumStakeWeight; + $._maximumStakeWeight = maximumStakeWeight; $._minimumStakeDuration = minimumStakeDuration; $._rewardCalculator = rewardCalculator; } @@ -132,7 +132,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Ensure the weight is within the valid range. require( - weight >= $._minimumStakeAmount && weight <= $._maximumStakeAmount, + weight >= $._minimumStakeWeight && weight <= $._maximumStakeWeight, "PoSValidatorManager: invalid stake amount" ); @@ -163,6 +163,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( validator.status == ValidatorStatus.Active, "PoSValidatorManager: validator not active" ); + + // Check that adding this delegator would not exceed the maximum churn rate. + _checkAndUpdateChurnTrackerAddition(weight); + // Update the validator weight uint64 newValidatorWeight = validator.weight + weight; _setValidatorWeight(validationID, newValidatorWeight); @@ -172,9 +176,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 nonce = _getAndIncrementNonce(validationID); bytes32 delegationID = keccak256(abi.encodePacked(validationID, delegatorAddress, nonce)); - // Check that adding this delegator would not exceed the maximum churn rate. - _checkAndUpdateChurnTrackerAddition(weight); - // Submit the message to the Warp precompile. bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, nonce, newValidatorWeight); @@ -284,6 +285,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ); uint64 nonce = _getAndIncrementNonce(validationID); + // Check that removing this delegator would not exceed the maximum churn rate. + // TODO this check won't be necessary for a delegator whose validator has already initialized ending their validation period. + _checkAndUpdateChurnTrackerRemoval(delegator.weight); + // Set the delegator status to pending removed, so that it can be properly removed in // the complete step, even if the delivered nonce is greater than the nonce used to // initialize the removal. @@ -293,10 +298,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager $._delegatorStakes[delegationID] = delegator; - // Check that removing this delegator would not exceed the maximum churn rate. - // TODO this check won't be necessary for a delegator whose validator has already initialized ending their validation period. - _checkAndUpdateChurnTrackerRemoval(delegator.weight); - Validator memory validator = _getValidator(validationID); require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); uint64 newValidatorWeight = validator.weight - delegator.weight; diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index c441cfade..8ce05a5bd 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -105,7 +105,7 @@ abstract contract ValidatorManager is // TODO Remove - this is a hack to get a starting total weight before // adding an initial validator set is implemented. - $._churnTracker.totalWeight = 10000; + $._churnTracker.totalWeight = 1e10; } /** @@ -138,6 +138,9 @@ abstract contract ValidatorManager is ); require(blsPublicKey.length == 48, "ValidatorManager: invalid blsPublicKey length"); + // Check that adding this validator would not exceed the maximum churn rate. + _checkAndUpdateChurnTrackerAddition(weight); + (bytes32 validationID, bytes memory registerSubnetValidatorMessage) = ValidatorMessages .packRegisterSubnetValidatorMessage( ValidatorMessages.ValidationPeriod({ @@ -163,9 +166,6 @@ abstract contract ValidatorManager is endedAt: 0 }); - // Check that adding this validator would not exceed the maximum churn rate. - _checkAndUpdateChurnTrackerAddition(weight); - // Increment the nonce for the next usage. _getAndIncrementNonce(validationID); @@ -238,6 +238,9 @@ abstract contract ValidatorManager is ); require(_msgSender() == validator.owner, "ValidatorManager: sender not validator owner"); + // Check that removing this delegator would not exceed the maximum churn rate. + _checkAndUpdateChurnTrackerRemoval(validator.weight); + // Update the validator status to pending removal. // They are not removed from the active validators mapping until the P-Chain acknowledges the removal. validator.status = ValidatorStatus.PendingRemoved; @@ -255,9 +258,6 @@ abstract contract ValidatorManager is .packSetSubnetValidatorWeightMessage(validationID, _getAndIncrementNonce(validationID), 0); $._pendingEndValidationMessages[validationID] = setValidatorWeightPayload; - // Check that removing this delegator would not exceed the maximum churn rate. - _checkAndUpdateChurnTrackerRemoval(validator.weight); - bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); // Emit the event to signal the start of the validator removal process. @@ -405,7 +405,10 @@ abstract contract ValidatorManager is uint256 currentTime = block.timestamp; ValidatorChurnPeriod memory churnTracker = $._churnTracker; - if (currentTime - churnTracker.startedAt >= $._churnPeriodSeconds) { + if ( + churnTracker.startedAt == 0 + || currentTime >= churnTracker.startedAt + $._churnPeriodSeconds + ) { churnTracker.churnAmount = weight; churnTracker.startedAt = currentTime; churnTracker.initialWeight = churnTracker.totalWeight; @@ -413,9 +416,9 @@ abstract contract ValidatorManager is churnTracker.churnAmount += weight; } - uint8 churnPercentage = uint8((churnTracker.churnAmount * 100) / churnTracker.initialWeight); require( - churnPercentage <= $._maximumChurnPercentage, + // Rearranged equation of maximumChurnPercentage >= currentChurnPercentage to avoid integer division truncation. + $._maximumChurnPercentage * churnTracker.initialWeight >= churnTracker.churnAmount * 100, "ValidatorManager: maximum churn rate exceeded" ); diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 84cc32b3b..6b5ed60cb 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -18,8 +18,8 @@ enum DelegatorStatus { struct PoSValidatorManagerSettings { ValidatorManagerSettings baseSettings; - uint256 minimumStakeAmount; - uint256 maximumStakeAmount; + uint64 minimumStakeWeight; + uint64 maximumStakeWeight; uint64 minimumStakeDuration; IRewardCalculator rewardCalculator; } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index f87f17430..cb97fb3e4 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -35,9 +35,9 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumStakeWeight: DEFAULT_MINIMUM_STAKE_WEIGHT, + maximumStakeWeight: DEFAULT_MAXIMUM_STAKE_WEIGHT, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_WEIGHT_DURATION, rewardCalculator: IRewardCalculator(address(0)) }), token @@ -53,25 +53,16 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { uint64 weight ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration( - app.weightToValue(weight), nodeID, registrationExpiry, signature + _weightToValue(weight), nodeID, registrationExpiry, signature ); } - function _initializeValidatorRegistrationWithValue( - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory signature, - uint256 value - ) internal virtual override returns (bytes32) { - return app.initializeValidatorRegistration(value, nodeID, registrationExpiry, signature); - } - function _initializeDelegatorRegistration( bytes32 validationID, address delegatorAddress, uint64 weight ) internal virtual override returns (bytes32) { - uint256 value = app.weightToValue(weight); + uint256 value = _weightToValue(weight); vm.startPrank(delegatorAddress); bytes32 delegationID = app.initializeDelegatorRegistration(validationID, value); vm.stopPrank(); @@ -79,7 +70,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { } function _beforeSend(uint64 weight, address spender) internal override { - uint256 value = app.weightToValue(weight); + uint256 value = _weightToValue(weight); token.safeIncreaseAllowance(spender, value); token.safeTransfer(spender, value); @@ -93,8 +84,12 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(address(token), abi.encodeCall(IERC20.transfer, (account, amount))); } + function _valueToWeight(uint256 value) internal virtual override returns (uint64) { + return uint64(value / 1e12); + } + function _weightToValue(uint64 weight) internal virtual override returns (uint256) { - return app.weightToValue(weight); + return uint256(weight) * 1e12; } function _getStakeAssetBalance(address account) internal view override returns (uint256) { diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index f5b700130..f67b379fa 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -28,9 +28,9 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumStakeWeight: DEFAULT_MINIMUM_STAKE_WEIGHT, + maximumStakeWeight: DEFAULT_MAXIMUM_STAKE_WEIGHT, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_WEIGHT_DURATION, rewardCalculator: IRewardCalculator(address(0)) }) ); @@ -45,27 +45,17 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { bytes memory signature, uint64 weight ) internal virtual override returns (bytes32) { - return app.initializeValidatorRegistration{value: app.weightToValue(weight)}( + return app.initializeValidatorRegistration{value: _weightToValue(weight)}( nodeID, registrationExpiry, signature ); } - function _initializeValidatorRegistrationWithValue( - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory signature, - uint256 value - ) internal virtual override returns (bytes32) { - return - app.initializeValidatorRegistration{value: value}(nodeID, registrationExpiry, signature); - } - function _initializeDelegatorRegistration( bytes32 validationID, address delegatorAddress, uint64 weight ) internal virtual override returns (bytes32) { - uint256 value = app.weightToValue(weight); + uint256 value = _weightToValue(weight); vm.prank(delegatorAddress); vm.deal(delegatorAddress, value); return app.initializeDelegatorRegistration{value: value}(validationID); @@ -80,8 +70,16 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(account, amount, ""); } + // 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 + function _valueToWeight(uint256 value) internal virtual override 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 + // to the contract and use vm.expectRevert at the same time function _weightToValue(uint64 weight) internal virtual override returns (uint256) { - return app.weightToValue(weight); + return uint256(weight) * 1e12; } function _getStakeAssetBalance(address account) internal view override returns (uint256) { diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index 0d10d0c18..a62d1499c 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -52,17 +52,6 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { return app.initializeValidatorRegistration(weight, nodeID, registrationExpiry, signature); } - function _initializeValidatorRegistrationWithValue( - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory signature, - uint256 value - ) internal virtual override returns (bytes32) { - return app.initializeValidatorRegistration( - uint64(value), nodeID, registrationExpiry, signature - ); - } - function _initializeEndValidation(bytes32 validationID) internal virtual override { return app.initializeEndValidation(validationID); } @@ -70,6 +59,10 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { // solhint-disable-next-line no-empty-blocks function _beforeSend(uint64 weight, address spender) internal virtual override {} + function _valueToWeight(uint256 value) internal virtual override returns (uint64) { + return uint64(value); + } + function _weightToValue(uint64 weight) internal virtual override returns (uint256) { return uint256(weight); } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 5b702b2ad..60634e0ef 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -31,15 +31,15 @@ abstract contract ValidatorManagerTest is Test { address public constant WARP_PRECOMPILE_ADDRESS = 0x0200000000000000000000000000000000000005; uint64 public constant DEFAULT_WEIGHT = 1e6; - uint256 public constant DEFAULT_MINIMUM_STAKE = 20; - uint256 public constant DEFAULT_MAXIMUM_STAKE = 1e10; + uint64 public constant DEFAULT_MINIMUM_STAKE_WEIGHT = 20; + uint64 public constant DEFAULT_MAXIMUM_STAKE_WEIGHT = 1e10; uint64 public constant DEFAULT_CHURN_PERIOD = 1 hours; - uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; + uint64 public constant DEFAULT_MINIMUM_STAKE_WEIGHT_DURATION = 24 hours; uint8 public constant DEFAULT_MAXIMUM_CHURN_PERCENTAGE = 20; uint64 public constant DEFAULT_EXPIRY = 1000; uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = 2000; - uint256 public constant DEFAULT_STARTING_TOTAL_WEIGHT = 10000; + uint256 public constant DEFAULT_STARTING_TOTAL_WEIGHT = 1e10; ValidatorManager public validatorManager; @@ -198,37 +198,45 @@ abstract contract ValidatorManagerTest is Test { function testCummulativeChurnRegistration() public { uint64 churnThreshold = - uint64(DEFAULT_STARTING_TOTAL_WEIGHT) * 100 / DEFAULT_MAXIMUM_CHURN_PERCENTAGE; + uint64(DEFAULT_STARTING_TOTAL_WEIGHT) * DEFAULT_MAXIMUM_CHURN_PERCENTAGE / 100; _beforeSend(churnThreshold, address(this)); - uint256 value = _weightToValue(churnThreshold); - // First call should succeed - _initializeValidatorRegistrationWithValue( - _newNodeID(), uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value - ); + // First registration should succeed + _setUpCompleteValidatorRegistration({ + nodeID: _newNodeID(), + subnetID: DEFAULT_SUBNET_ID, + weight: churnThreshold, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); - bytes32 nodeID = _newNodeID(); // Needs to be called before expectRevert - uint64 secondWeight = 1; - _beforeSend(secondWeight, address(this)); // TODO may need to be updated with minimum stake amount - uint256 value2 = _weightToValue(secondWeight); + _beforeSend(DEFAULT_MINIMUM_STAKE_WEIGHT, address(this)); // TODO may need to be updated with minimum stake amount // Second call should fail vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); - _initializeValidatorRegistrationWithValue( - nodeID, uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value2 + _initializeValidatorRegistration( + DEFAULT_NODE_ID, + DEFAULT_REGISTRATION_TIMESTAMP + 1, + DEFAULT_BLS_PUBLIC_KEY, + DEFAULT_MINIMUM_STAKE_WEIGHT ); } function testCummulativeChurnRegistrationAndEndValidation() public { uint64 churnThreshold = - uint64(DEFAULT_STARTING_TOTAL_WEIGHT) * 100 / DEFAULT_MAXIMUM_CHURN_PERCENTAGE; + uint64(DEFAULT_STARTING_TOTAL_WEIGHT) * DEFAULT_MAXIMUM_CHURN_PERCENTAGE / 100; _beforeSend(churnThreshold, address(this)); - uint256 value = _weightToValue(churnThreshold); - // First call should succeed - bytes32 validationID = _initializeValidatorRegistrationWithValue( - _newNodeID(), uint64(block.timestamp) + 1 days, DEFAULT_BLS_PUBLIC_KEY, value - ); + // Registration should succeed + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: churnThreshold, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); // Second call should fail vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); @@ -385,20 +393,12 @@ abstract contract ValidatorManagerTest is Test { bytes memory blsPublicKey, uint64 weight ) internal virtual returns (bytes32); - - // Initialize a validator registration, without making a call to weightToValue, which is an external - // call that will consume the call to vm.expectRevert and fail the test. - function _initializeValidatorRegistrationWithValue( - bytes32 nodeID, - uint64 registrationExpiry, - bytes memory blsPublicKey, - uint256 value - ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID) internal virtual; function _beforeSend(uint64 weight, address spender) internal virtual; function _weightToValue(uint64 weight) internal virtual returns (uint256); + + function _valueToWeight(uint256 value) internal virtual returns (uint64); } // solhint-enable no-empty-blocks diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index 06aeaa31c..f5347b2bb 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -151,8 +151,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(0), }, - MinimumStakeAmount: big.NewInt(1e6), - MaximumStakeAmount: big.NewInt(10e6), + MinimumStakeWeight: 1e6, + MaximumStakeWeight: 10e6, MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), RewardCalculator: common.Address{}, }, diff --git a/tests/utils/staking.go b/tests/utils/staking.go index c05ab83c6..a8dd9b7cf 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -72,8 +72,8 @@ func DeployAndInitializeNativeTokenStakingManager( ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(0), }, - MinimumStakeAmount: big.NewInt(1e6), - MaximumStakeAmount: big.NewInt(10e6), + MinimumStakeWeight: 1e6, + MaximumStakeWeight: 10e6, MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), RewardCalculator: common.Address{}, }, @@ -133,8 +133,8 @@ func DeployAndInitializeERC20TokenStakingManager( ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(0), }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeWeight: 1e6, + MaximumStakeWeight: 10e6, MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), RewardCalculator: common.Address{}, }, From 1fc2700feb6fe733871e88f1babeb74807b058ec Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 11 Sep 2024 13:03:05 -0400 Subject: [PATCH 241/545] Fix comment --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index b6b060d8b..52d07f63d 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -49,7 +49,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumStakeWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614b09380380614b0983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149bc8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872e999e1461023e578063872fda6414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004614054565b6102d6565b005b61012861013836600461408f565b61076f565b61017b61014b36600461408f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b61012861019c36600461408f565b6108cb565b6101b46101af36600461408f565b610938565b6040516001600160401b039091168152602001610185565b6101286101da3660046140a6565b61094e565b6101286101ed3660046140bf565b610979565b61017b6102003660046140fd565b610b6a565b6101b461021336600461408f565b610b83565b61012861022636600461408f565b610b97565b610128610239366004614054565b610c04565b61012861024c36600461412a565b610c1f565b61017b61025f3660046141fa565b610cfe565b6101286102723660046140bf565b610d23565b61017b610285366004614296565b610f54565b6101286102983660046140a6565b610f67565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d136600461408f565b611124565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0260205260408120600101545f805160206149108339815191529184156103285761032582856111f3565b90505b5f868152600284016020526040808220815161010081019092528054829060ff16600481111561035a5761035a6142b6565b600481111561036b5761036b6142b6565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f26142b6565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206149308339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206149308339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461148f565b90506104c28260600151611503565b600382526001600160401b0342811660a0840152811660e08301525f88815260028601602052604090208251815484929190829060ff1916600183600481111561050e5761050e6142b6565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105e085611510565b905082606001516001600160401b03168160a001516001600160401b0316116106575760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161066c91906142de565b905061067886826115ef565b5f610684878584611637565b5f8c815260048a01602052604090209091506106a08282614388565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106cd908590600401614469565b6020604051808303815f875af11580156106e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070d919061449b565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f805160206149508339815191529291906107b790614305565b90501180156107e9575060035f83815260098301602052604090205460ff1660058111156107e7576107e76142b6565b145b61084d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161088691906004016144b2565b6020604051808303815f875af11580156108a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c6919061449b565b505050565b6108d481611854565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614910833981519152916005600160991b019163ee5b48eb91610886916004016144b2565b5f61094864e8d4a510008361453c565b92915050565b5f61095882611923565b905061097581606001516001600160401b03168260400151611cb0565b5050565b5f805160206149108339815191525f61099184611ce6565b90505f806109a28360400151611ec7565b50915091506109b085612102565b5f85815260038501602052604081206109c891613f9c565b5f6109d283611510565b9050816001600160401b031681608001516001600160401b03161015610a0a5760405162461bcd60e51b815260040161043b9061455b565b5f8681526002808701602052604090912001546001600160401b03808416600160c01b909204161115610a4f5760405162461bcd60e51b815260040161043b9061459d565b60015f87815260028701602052604090205460ff166004811115610a7557610a756142b6565b14610ade5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f86815260028681016020908152604092839020805460ff19168317815590910180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109486001600160401b03831664e8d4a510006145e6565b5f610b8d82611510565b60a0015192915050565b610ba081612102565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604090819020905163ee5b48eb60e01b81525f80516020614910833981519152916005600160991b019163ee5b48eb91610886916004016144b2565b8115610c1657610c1483826111f3565b505b6108c6836121db565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610c68575080546001600160401b03808416911610155b15610c865760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610cb18484612593565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80610d09866125ad565b9050610d1785828686612666565b9150505b949350505050565b5f805160206149108339815191525f610d3b84611ce6565b90505f80610d4c8360400151611ec7565b5091509150610d5a85611854565b5f8581526004850160205260408120610d7291613f9c565b5f610d7c83611510565b9050816001600160401b031681608001516001600160401b03161015610db45760405162461bcd60e51b815260040161043b9061455b565b5f8681526002860160205260409020600301546001600160401b0380841691161115610df25760405162461bcd60e51b815260040161043b9061459d565b60035f87815260028701602052604090205460ff166004811115610e1857610e186142b6565b14610e6c5760405162461bcd60e51b815260206004820152603160248201525f805160206149308339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260028681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b0316928101839052600182015494810194909452918201546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039093015490921660e0840152610f129190611cb0565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f60833384612b2b565b9392505050565b5f805160206149508339815191525f610f7f83611ce6565b90505f80610f908360400151612ee6565b9150915080610ff25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f8281526007850160205260408120805461100c90614305565b905011801561103e575060015f83815260098601602052604090205460ff16600581111561103c5761103c6142b6565b145b61105a5760405162461bcd60e51b815260040161043b906145fd565b5f828152600785016020526040812061107291613f9c565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061495083398151915292919061116c90614305565b905011801561119e575060015f83815260098301602052604090205460ff16600581111561119c5761119c6142b6565b145b6111ba5760405162461bcd60e51b815260040161043b906145fd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161088691906004016144b2565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561123e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611265919081019061464f565b91509150806112c85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561130b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132f919061449b565b8251146113935760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156114095760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806114188460400151613087565b915091508187146114855760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206149908339815191526020526040812060030180545f80516020614950833981519152916001600160401b03909116908190846114d483614721565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61150d815f61325f565b50565b611518613fd3565b5f8281525f805160206149908339815191526020526040908190208151610100810190925280545f80516020614950833981519152929190829060ff166005811115611566576115666142b6565b6005811115611577576115776142b6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614990833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116b057611670816001614746565b61167b9060086145e6565b5081515f9083908390811061169257611692614759565b60200101906001600160f81b03191690815f1a90535060010161165c565b505f5b6004811015611713576116c7816003614746565b6116d29060086145e6565b6001901c60f81b826116e583600261476d565b815181106116f5576116f5614759565b60200101906001600160f81b03191690815f1a9053506001016116b3565b505f5b60208110156117755761172a81601f614746565b6117359060086145e6565b86901c60f81b8261174783600661476d565b8151811061175757611757614759565b60200101906001600160f81b03191690815f1a905350600101611716565b505f5b60088110156117e05761178c816007614746565b6117979060086145e6565b6001600160401b038616901c60f81b826117b283602661476d565b815181106117c2576117c2614759565b60200101906001600160f81b03191690815f1a905350600101611778565b505f5b600881101561184b576117f7816007614746565b6118029060086145e6565b6001600160401b038516901c60f81b8261181d83602e61476d565b8151811061182d5761182d614759565b60200101906001600160f81b03191690815f1a9053506001016117e3565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061491083398151915292919061189c90614305565b90501180156118ce575060035f83815260028301602052604090205460ff1660048111156118cc576118cc6142b6565b145b6109755760405162461bcd60e51b815260206004820152603360248201525f8051602061493083398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b61192b613fd3565b5f805160206149508339815191525f61194384611ce6565b90505f806119548360400151612ee6565b9150915080156119b95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600985016020526040808220815161010081019092528054829060ff1660058111156119eb576119eb6142b6565b60058111156119fc576119fc6142b6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8357611a836142b6565b1480611aa15750600182516005811115611a9f57611a9f6142b6565b145b611b005760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1557611b156142b6565b03611b3c57505f8381526008860160205260408120600491611b379190613f9c565b611b40565b5060055b6020808301515f908152600a8801909152604081205581816005811115611b6957611b696142b6565b90816005811115611b7c57611b7c6142b6565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115611bb057611bb06142b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c7b57611c7b6142b6565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610975906001600160a01b0316828461347b565b60408051606080820183525f8083526020830181905292820152905f805160206149508339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d82919081019061464f565b9150915080611de95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e4c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ebf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611eeb5760405162461bcd60e51b815260040161043b90614780565b5f805b6002811015611f3a57611f02816001614746565b611f0d9060086145e6565b61ffff16868281518110611f2357611f23614759565b016020015160f81c901b9190911790600101611eee565b5061ffff811615611f5d5760405162461bcd60e51b815260040161043b906147c9565b5f805b6004811015611fb857611f74816003614746565b611f7f9060086145e6565b63ffffffff1687611f9183600261476d565b81518110611fa157611fa1614759565b016020015160f81c901b9190911790600101611f60565b5063ffffffff8116600314611fdf5760405162461bcd60e51b815260040161043b9061480c565b5f805b602081101561203457611ff681601f614746565b6120019060086145e6565b8861200d83600661476d565b8151811061201d5761201d614759565b016020015160f81c901b9190911790600101611fe2565b505f805b60088110156120935761204c816007614746565b6120579060086145e6565b6001600160401b03168961206c83602661476d565b8151811061207c5761207c614759565b016020015160f81c901b9190911790600101612038565b505f805b60088110156120f2576120ab816007614746565b6120b69060086145e6565b6001600160401b03168a6120cb83602e61476d565b815181106120db576120db614759565b016020015160f81c901b9190911790600101612097565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d036020526040812080545f8051602061491083398151915292919061214a90614305565b905011801561217c575060015f83815260028301602052604090205460ff16600481111561217a5761217a6142b6565b145b6109755760405162461bcd60e51b815260206004820152603860248201525f8051602061493083398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061499083398151915260205260408082208151610100810190925280545f8051602061495083398151915293929190829060ff166005811115612229576122296142b6565b600581111561223a5761223a6142b6565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122c2576122c26142b6565b1461231e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146123985760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123a58160a00151611503565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff191660018360058111156123e9576123e96142b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124b5846124af8161148f565b5f611637565b5f85815260088501602052604090209091506124d18282614388565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124fe908590600401614469565b6020604051808303815f875af115801561251a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253e919061449b565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61259b6134da565b6125a482613525565b6109758161357f565b5f5f80516020614910833981519152816125c684613633565b90505f6125d282610938565b83549091506001600160401b0390811690821610801590612608575082546001600160401b03600160401b909104811690821611155b610d1b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61266f613669565b5f80516020614950833981519152426001600160401b038516116126f15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b038416612708426202a30061476d565b1161277b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b856127d25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600a82016020526040902054156128405760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128a75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b6128b0856136a0565b5f806128f76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506136ab565b5f828152600786016020526040902091935091506129158282614388565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612942908590600401614469565b6020604051808303815f875af115801561295e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612982919061449b565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff19166001836005811115612a0457612a046142b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612ac58361148f565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1b60015f8051602061497083398151915255565b5f612b34613669565b5f612b416101af84613633565b90505f805160206149108339815191525f612b5b87611510565b9050600281516005811115612b7257612b726142b6565b14612bd15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b612bda836136a0565b5f838260a00151612beb9190614853565b9050612bf788826115ef565b5f612c018961148f565b90505f898983604051602001612c499392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090505f612c6d8b8486611637565b5f8381526003880160205260409020909150612c898282614388565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cb6908590600401614469565b6020604051808303815f875af1158015612cd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cf6919061449b565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876002015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612da557612da56142b6565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610f6060015f8051602061497083398151915255565b5f808251602714612f095760405162461bcd60e51b815260040161043b90614780565b5f805b6002811015612f5857612f20816001614746565b612f2b9060086145e6565b61ffff16858281518110612f4157612f41614759565b016020015160f81c901b9190911790600101612f0c565b5061ffff811615612f7b5760405162461bcd60e51b815260040161043b906147c9565b5f805b6004811015612fd657612f92816003614746565b612f9d9060086145e6565b63ffffffff1686612faf83600261476d565b81518110612fbf57612fbf614759565b016020015160f81c901b9190911790600101612f7e565b5063ffffffff8116600214612ffd5760405162461bcd60e51b815260040161043b9061480c565b5f805b60208110156130525761301481601f614746565b61301f9060086145e6565b8761302b83600661476d565b8151811061303b5761303b614759565b016020015160f81c901b9190911790600101613000565b505f8660268151811061306757613067614759565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146130aa5760405162461bcd60e51b815260040161043b90614780565b5f805b60028110156130f9576130c1816001614746565b6130cc9060086145e6565b61ffff168582815181106130e2576130e2614759565b016020015160f81c901b91909117906001016130ad565b5061ffff81161561311c5760405162461bcd60e51b815260040161043b906147c9565b5f805b600481101561317757613133816003614746565b61313e9060086145e6565b63ffffffff168661315083600261476d565b8151811061316057613160614759565b016020015160f81c901b919091179060010161311f565b5063ffffffff811660041461319e5760405162461bcd60e51b815260040161043b9061480c565b5f805b60208110156131f3576131b581601f614746565b6131c09060086145e6565b876131cc83600661476d565b815181106131dc576131dc614759565b016020015160f81c901b91909117906001016131a1565b505f805b60088110156132525761320b816007614746565b6132169060086145e6565b6001600160401b03168861322b83602661476d565b8151811061323b5761323b614759565b016020015160f81c901b91909117906001016131f7565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061495083398151915290600160401b900460ff165f036132a557505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b0316606082015242911580613307575060028301548151613303916001600160401b03169061476d565b8210155b1561332d576001600160401b03851660608201528181526040810151602082015261334c565b848160600181815161333f9190614853565b6001600160401b03169052505b606081015161335c906064614873565b602082015160028501546001600160401b0392909216916133879190600160401b900460ff166145e6565b10156133eb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043b565b831561341457846001600160401b03168160400181815161340c919061476d565b905250613433565b846001600160401b03168160400181815161342f9190614746565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b6040516001600160a01b038381166024830152604482018390526108c691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613a63565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661352357604051631afcd79f60e31b815260040160405180910390fd5b565b61352d6134da565b61353681613ac4565b61150d61354960a08301608084016140fd565b61355960c0840160a085016140fd565b61356960e0850160c086016140fd565b61357a610100860160e0870161489e565b613ae5565b6135876134da565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166136135760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f610948827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b86565b5f8051602061497083398151915280546001190161369a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b61150d81600161325f565b5f60608260800151516030146137155760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561378c5761374c816001614746565b6137579060086145e6565b5081515f9083908390811061376e5761376e614759565b60200101906001600160f81b03191690815f1a905350600101613738565b505f5b60048110156137ea576137a3816003614746565b6137ae9060086145e6565b505f826137bc83600261476d565b815181106137cc576137cc614759565b60200101906001600160f81b03191690815f1a90535060010161378f565b505f5b6020811015613847578451816020811061380957613809614759565b1a60f81b8261381983600661476d565b8151811061382957613829614759565b60200101906001600160f81b03191690815f1a9053506001016137ed565b505f5b60208110156138a7578460200151816020811061386957613869614759565b1a60f81b8261387983602661476d565b8151811061388957613889614759565b60200101906001600160f81b03191690815f1a90535060010161384a565b505f5b600881101561391b576138be816007614746565b6138c99060086145e6565b60ff1685604001516001600160401b0316901c60f81b828260466138ed919061476d565b815181106138fd576138fd614759565b60200101906001600160f81b03191690815f1a9053506001016138aa565b505f5b6030811015613986578460800151818151811061393d5761393d614759565b01602001516001600160f81b0319168261395883604e61476d565b8151811061396857613968614759565b60200101906001600160f81b03191690815f1a90535060010161391e565b505f5b60088110156139f85761399d816007614746565b6139a89060086145e6565b60608601516001600160401b0390811691161c60f81b826139ca83607e61476d565b815181106139da576139da614759565b60200101906001600160f81b03191690815f1a905350600101613989565b50600281604051613a0991906148b9565b602060405180830381855afa158015613a24573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a47919061449b565b94909350915050565b60015f8051602061497083398151915255565b5f613a776001600160a01b03841683613ce8565b905080515f14158015613a9b575080806020019051810190613a9991906148d4565b155b156108c657604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b613acc6134da565b613ad4613cf5565b613adc613d05565b61150d81613d0d565b613aed6134da565b5f8051602061491083398151915280546001600160401b03938416600160801b0267ffffffffffffffff60801b19958516600160401b026001600160801b031990921696909416959095179490941792909216179091557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0180546001600160a01b039092166001600160a01b0319909216919091179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613bcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bf0919061449b565b9050613c076001600160a01b038516333086613e41565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c6f919061449b565b9050818111613cd55760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613cdf8282614746565b95945050505050565b6060610f6083835f613e80565b613cfd6134da565b613523613f0f565b6135236134da565b613d156134da565b80355f8051602061495083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613d6160808401606085016148ef565b60ff161115613dce5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043b565b613dde60808301606084016148ef565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613e0f60608301604084016140fd565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6040516001600160a01b038481166024830152838116604483015260648201839052613e7a9186918216906323b872dd906084016134a8565b50505050565b606081471015613ea55760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613ec091906148b9565b5f6040518083038185875af1925050503d805f8114613efa576040519150601f19603f3d011682016040523d82523d5f602084013e613eff565b606091505b5091509150611485868383613f17565b613a506134da565b606082613f2c57613f2782613f73565b610f60565b8151158015613f4357506001600160a01b0384163b155b15613f6c57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610f60565b805115613f835780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613fa890614305565b5f825580601f10613fb7575050565b601f0160209004905f5260205f209081019061150d9190614017565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561402b575f8155600101614018565b5090565b801515811461150d575f80fd5b803563ffffffff8116811461404f575f80fd5b919050565b5f805f60608486031215614066575f80fd5b8335925060208401356140788161402f565b91506140866040850161403c565b90509250925092565b5f6020828403121561409f575f80fd5b5035919050565b5f602082840312156140b6575f80fd5b610f608261403c565b5f80604083850312156140d0575f80fd5b6140d98361403c565b946020939093013593505050565b80356001600160401b038116811461404f575f80fd5b5f6020828403121561410d575f80fd5b610f60826140e7565b6001600160a01b038116811461150d575f80fd5b5f8082840361012081121561413d575f80fd5b6101008082121561414c575f80fd5b849350830135905061415d81614116565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561419e5761419e614168565b60405290565b604051601f8201601f191681016001600160401b03811182821017156141cc576141cc614168565b604052919050565b5f6001600160401b038211156141ec576141ec614168565b50601f01601f191660200190565b5f805f806080858703121561420d575f80fd5b8435935060208501359250614224604086016140e7565b915060608501356001600160401b0381111561423e575f80fd5b8501601f8101871361424e575f80fd5b803561426161425c826141d4565b6141a4565b818152886020838501011115614275575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156142a7575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156142fe576142fe6142ca565b5092915050565b600181811c9082168061431957607f821691505b60208210810361433757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108c657805f5260205f20601f840160051c810160208510156143625750805b601f840160051c820191505b81811015614381575f815560010161436e565b5050505050565b81516001600160401b038111156143a1576143a1614168565b6143b5816143af8454614305565b8461433d565b602080601f8311600181146143e8575f84156143d15750858301515b5f19600386901b1c1916600185901b17855561443f565b5f85815260208120601f198616915b82811015614416578886015182559484019460019091019084016143f7565b508582101561443357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015614461578181015183820152602001614449565b50505f910152565b602081525f8251806020840152614487816040850160208701614447565b601f01601f19169190910160400192915050565b5f602082840312156144ab575f80fd5b5051919050565b5f60208083525f84546144c481614305565b806020870152604060018084165f81146144e557600181146145015761452e565b60ff19851660408a0152604084151560051b8a0101955061452e565b895f5260205f205f5b858110156145255781548b820186015290830190880161450a565b8a016040019650505b509398975050505050505050565b5f8261455657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610948576109486142ca565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b805161404f8161402f565b5f8060408385031215614660575f80fd5b82516001600160401b0380821115614676575f80fd5b9084019060608287031215614689575f80fd5b61469161417c565b825181526020808401516146a481614116565b828201526040840151838111156146b9575f80fd5b80850194505087601f8501126146cd575f80fd5b835192506146dd61425c846141d4565b83815288828587010111156146f0575f80fd5b6146ff84838301848801614447565b80604084015250819550614714818801614644565b9450505050509250929050565b5f6001600160401b0380831681810361473c5761473c6142ca565b6001019392505050565b81810381811115610948576109486142ca565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610948576109486142ca565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156142fe576142fe6142ca565b6001600160401b03818116838216028082169190828114614896576148966142ca565b505092915050565b5f602082840312156148ae575f80fd5b8135610f6081614116565b5f82516148ca818460208701614447565b9190910192915050565b5f602082840312156148e4575f80fd5b8151610f608161402f565b5f602082840312156148ff575f80fd5b813560ff81168114610f60575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614b09380380614b0983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149bc8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c80636d0e43fa1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b80636d0e43fa1461021857806376f786211461022b578063872e999e1461023e578063872fda6414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806366435abf14610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004614054565b6102d6565b005b61012861013836600461408f565b61076f565b61017b61014b36600461408f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b61012861019c36600461408f565b6108cb565b6101b46101af36600461408f565b610938565b6040516001600160401b039091168152602001610185565b6101286101da3660046140a6565b61094e565b6101286101ed3660046140bf565b610979565b61017b6102003660046140fd565b610b6a565b6101b461021336600461408f565b610b83565b61012861022636600461408f565b610b97565b610128610239366004614054565b610c04565b61012861024c36600461412a565b610c1f565b61017b61025f3660046141fa565b610cfe565b6101286102723660046140bf565b610d23565b61017b610285366004614296565b610f54565b6101286102983660046140a6565b610f67565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d136600461408f565b611124565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0260205260408120600101545f805160206149108339815191529184156103285761032582856111f3565b90505b5f868152600284016020526040808220815161010081019092528054829060ff16600481111561035a5761035a6142b6565b600481111561036b5761036b6142b6565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f26142b6565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206149308339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206149308339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461148f565b90506104c28260600151611503565b600382526001600160401b0342811660a0840152811660e08301525f88815260028601602052604090208251815484929190829060ff1916600183600481111561050e5761050e6142b6565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105e085611510565b905082606001516001600160401b03168160a001516001600160401b0316116106575760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161066c91906142de565b905061067886826115ef565b5f610684878584611637565b5f8c815260048a01602052604090209091506106a08282614388565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106cd908590600401614469565b6020604051808303815f875af11580156106e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070d919061449b565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f805160206149508339815191529291906107b790614305565b90501180156107e9575060035f83815260098301602052604090205460ff1660058111156107e7576107e76142b6565b145b61084d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161088691906004016144b2565b6020604051808303815f875af11580156108a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c6919061449b565b505050565b6108d481611854565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614910833981519152916005600160991b019163ee5b48eb91610886916004016144b2565b5f61094864e8d4a510008361453c565b92915050565b5f61095882611923565b905061097581606001516001600160401b03168260400151611cb0565b5050565b5f805160206149108339815191525f61099184611ce6565b90505f806109a28360400151611ec7565b50915091506109b085612102565b5f85815260038501602052604081206109c891613f9c565b5f6109d283611510565b9050816001600160401b031681608001516001600160401b03161015610a0a5760405162461bcd60e51b815260040161043b9061455b565b5f8681526002808701602052604090912001546001600160401b03808416600160c01b909204161115610a4f5760405162461bcd60e51b815260040161043b9061459d565b60015f87815260028701602052604090205460ff166004811115610a7557610a756142b6565b14610ade5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f86815260028681016020908152604092839020805460ff19168317815590910180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109486001600160401b03831664e8d4a510006145e6565b5f610b8d82611510565b60a0015192915050565b610ba081612102565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604090819020905163ee5b48eb60e01b81525f80516020614910833981519152916005600160991b019163ee5b48eb91610886916004016144b2565b8115610c1657610c1483826111f3565b505b6108c6836121db565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610c68575080546001600160401b03808416911610155b15610c865760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610cb18484612593565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80610d09866125ad565b9050610d1785828686612666565b9150505b949350505050565b5f805160206149108339815191525f610d3b84611ce6565b90505f80610d4c8360400151611ec7565b5091509150610d5a85611854565b5f8581526004850160205260408120610d7291613f9c565b5f610d7c83611510565b9050816001600160401b031681608001516001600160401b03161015610db45760405162461bcd60e51b815260040161043b9061455b565b5f8681526002860160205260409020600301546001600160401b0380841691161115610df25760405162461bcd60e51b815260040161043b9061459d565b60035f87815260028701602052604090205460ff166004811115610e1857610e186142b6565b14610e6c5760405162461bcd60e51b815260206004820152603160248201525f805160206149308339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260028681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b0316928101839052600182015494810194909452918201546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039093015490921660e0840152610f129190611cb0565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f60833384612b2b565b9392505050565b5f805160206149508339815191525f610f7f83611ce6565b90505f80610f908360400151612ee6565b9150915080610ff25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f8281526007850160205260408120805461100c90614305565b905011801561103e575060015f83815260098601602052604090205460ff16600581111561103c5761103c6142b6565b145b61105a5760405162461bcd60e51b815260040161043b906145fd565b5f828152600785016020526040812061107291613f9c565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061495083398151915292919061116c90614305565b905011801561119e575060015f83815260098301602052604090205460ff16600581111561119c5761119c6142b6565b145b6111ba5760405162461bcd60e51b815260040161043b906145fd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161088691906004016144b2565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561123e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611265919081019061464f565b91509150806112c85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561130b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132f919061449b565b8251146113935760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156114095760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806114188460400151613087565b915091508187146114855760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206149908339815191526020526040812060030180545f80516020614950833981519152916001600160401b03909116908190846114d483614721565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61150d815f61325f565b50565b611518613fd3565b5f8281525f805160206149908339815191526020526040908190208151610100810190925280545f80516020614950833981519152929190829060ff166005811115611566576115666142b6565b6005811115611577576115776142b6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614990833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116b057611670816001614746565b61167b9060086145e6565b5081515f9083908390811061169257611692614759565b60200101906001600160f81b03191690815f1a90535060010161165c565b505f5b6004811015611713576116c7816003614746565b6116d29060086145e6565b6001901c60f81b826116e583600261476d565b815181106116f5576116f5614759565b60200101906001600160f81b03191690815f1a9053506001016116b3565b505f5b60208110156117755761172a81601f614746565b6117359060086145e6565b86901c60f81b8261174783600661476d565b8151811061175757611757614759565b60200101906001600160f81b03191690815f1a905350600101611716565b505f5b60088110156117e05761178c816007614746565b6117979060086145e6565b6001600160401b038616901c60f81b826117b283602661476d565b815181106117c2576117c2614759565b60200101906001600160f81b03191690815f1a905350600101611778565b505f5b600881101561184b576117f7816007614746565b6118029060086145e6565b6001600160401b038516901c60f81b8261181d83602e61476d565b8151811061182d5761182d614759565b60200101906001600160f81b03191690815f1a9053506001016117e3565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061491083398151915292919061189c90614305565b90501180156118ce575060035f83815260028301602052604090205460ff1660048111156118cc576118cc6142b6565b145b6109755760405162461bcd60e51b815260206004820152603360248201525f8051602061493083398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b61192b613fd3565b5f805160206149508339815191525f61194384611ce6565b90505f806119548360400151612ee6565b9150915080156119b95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600985016020526040808220815161010081019092528054829060ff1660058111156119eb576119eb6142b6565b60058111156119fc576119fc6142b6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8357611a836142b6565b1480611aa15750600182516005811115611a9f57611a9f6142b6565b145b611b005760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1557611b156142b6565b03611b3c57505f8381526008860160205260408120600491611b379190613f9c565b611b40565b5060055b6020808301515f908152600a8801909152604081205581816005811115611b6957611b696142b6565b90816005811115611b7c57611b7c6142b6565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115611bb057611bb06142b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c7b57611c7b6142b6565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610975906001600160a01b0316828461347b565b60408051606080820183525f8083526020830181905292820152905f805160206149508339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d82919081019061464f565b9150915080611de95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e4c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ebf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611eeb5760405162461bcd60e51b815260040161043b90614780565b5f805b6002811015611f3a57611f02816001614746565b611f0d9060086145e6565b61ffff16868281518110611f2357611f23614759565b016020015160f81c901b9190911790600101611eee565b5061ffff811615611f5d5760405162461bcd60e51b815260040161043b906147c9565b5f805b6004811015611fb857611f74816003614746565b611f7f9060086145e6565b63ffffffff1687611f9183600261476d565b81518110611fa157611fa1614759565b016020015160f81c901b9190911790600101611f60565b5063ffffffff8116600314611fdf5760405162461bcd60e51b815260040161043b9061480c565b5f805b602081101561203457611ff681601f614746565b6120019060086145e6565b8861200d83600661476d565b8151811061201d5761201d614759565b016020015160f81c901b9190911790600101611fe2565b505f805b60088110156120935761204c816007614746565b6120579060086145e6565b6001600160401b03168961206c83602661476d565b8151811061207c5761207c614759565b016020015160f81c901b9190911790600101612038565b505f805b60088110156120f2576120ab816007614746565b6120b69060086145e6565b6001600160401b03168a6120cb83602e61476d565b815181106120db576120db614759565b016020015160f81c901b9190911790600101612097565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d036020526040812080545f8051602061491083398151915292919061214a90614305565b905011801561217c575060015f83815260028301602052604090205460ff16600481111561217a5761217a6142b6565b145b6109755760405162461bcd60e51b815260206004820152603860248201525f8051602061493083398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061499083398151915260205260408082208151610100810190925280545f8051602061495083398151915293929190829060ff166005811115612229576122296142b6565b600581111561223a5761223a6142b6565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122c2576122c26142b6565b1461231e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146123985760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123a58160a00151611503565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff191660018360058111156123e9576123e96142b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124b5846124af8161148f565b5f611637565b5f85815260088501602052604090209091506124d18282614388565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906124fe908590600401614469565b6020604051808303815f875af115801561251a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253e919061449b565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61259b6134da565b6125a482613525565b6109758161357f565b5f5f80516020614910833981519152816125c684613633565b90505f6125d282610938565b83549091506001600160401b0390811690821610801590612608575082546001600160401b03600160401b909104811690821611155b610d1b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad9481dd95a59da1d60ba1b606482015260840161043b565b5f61266f613669565b5f80516020614950833981519152426001600160401b038516116126f15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043b565b6001600160401b038416612708426202a30061476d565b1161277b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043b565b856127d25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600a82016020526040902054156128405760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128a75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b6128b0856136a0565b5f806128f76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506136ab565b5f828152600786016020526040902091935091506129158282614388565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612942908590600401614469565b6020604051808303815f875af115801561295e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612982919061449b565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff19166001836005811115612a0457612a046142b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612ac58361148f565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1b60015f8051602061497083398151915255565b5f612b34613669565b5f612b416101af84613633565b90505f805160206149108339815191525f612b5b87611510565b9050600281516005811115612b7257612b726142b6565b14612bd15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b612bda836136a0565b5f838260a00151612beb9190614853565b9050612bf788826115ef565b5f612c018961148f565b90505f898983604051602001612c499392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090505f612c6d8b8486611637565b5f8381526003880160205260409020909150612c898282614388565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cb6908590600401614469565b6020604051808303815f875af1158015612cd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cf6919061449b565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876002015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612da557612da56142b6565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610f6060015f8051602061497083398151915255565b5f808251602714612f095760405162461bcd60e51b815260040161043b90614780565b5f805b6002811015612f5857612f20816001614746565b612f2b9060086145e6565b61ffff16858281518110612f4157612f41614759565b016020015160f81c901b9190911790600101612f0c565b5061ffff811615612f7b5760405162461bcd60e51b815260040161043b906147c9565b5f805b6004811015612fd657612f92816003614746565b612f9d9060086145e6565b63ffffffff1686612faf83600261476d565b81518110612fbf57612fbf614759565b016020015160f81c901b9190911790600101612f7e565b5063ffffffff8116600214612ffd5760405162461bcd60e51b815260040161043b9061480c565b5f805b60208110156130525761301481601f614746565b61301f9060086145e6565b8761302b83600661476d565b8151811061303b5761303b614759565b016020015160f81c901b9190911790600101613000565b505f8660268151811061306757613067614759565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146130aa5760405162461bcd60e51b815260040161043b90614780565b5f805b60028110156130f9576130c1816001614746565b6130cc9060086145e6565b61ffff168582815181106130e2576130e2614759565b016020015160f81c901b91909117906001016130ad565b5061ffff81161561311c5760405162461bcd60e51b815260040161043b906147c9565b5f805b600481101561317757613133816003614746565b61313e9060086145e6565b63ffffffff168661315083600261476d565b8151811061316057613160614759565b016020015160f81c901b919091179060010161311f565b5063ffffffff811660041461319e5760405162461bcd60e51b815260040161043b9061480c565b5f805b60208110156131f3576131b581601f614746565b6131c09060086145e6565b876131cc83600661476d565b815181106131dc576131dc614759565b016020015160f81c901b91909117906001016131a1565b505f805b60088110156132525761320b816007614746565b6132169060086145e6565b6001600160401b03168861322b83602661476d565b8151811061323b5761323b614759565b016020015160f81c901b91909117906001016131f7565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061495083398151915290600160401b900460ff165f036132a557505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b0316606082015242911580613307575060028301548151613303916001600160401b03169061476d565b8210155b1561332d576001600160401b03851660608201528181526040810151602082015261334c565b848160600181815161333f9190614853565b6001600160401b03169052505b606081015161335c906064614873565b602082015160028501546001600160401b0392909216916133879190600160401b900460ff166145e6565b10156133eb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043b565b831561341457846001600160401b03168160400181815161340c919061476d565b905250613433565b846001600160401b03168160400181815161342f9190614746565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b6040516001600160a01b038381166024830152604482018390526108c691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613a63565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661352357604051631afcd79f60e31b815260040160405180910390fd5b565b61352d6134da565b61353681613ac4565b61150d61354960a08301608084016140fd565b61355960c0840160a085016140fd565b61356960e0850160c086016140fd565b61357a610100860160e0870161489e565b613ae5565b6135876134da565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166136135760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f610948827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b86565b5f8051602061497083398151915280546001190161369a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b61150d81600161325f565b5f60608260800151516030146137155760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561378c5761374c816001614746565b6137579060086145e6565b5081515f9083908390811061376e5761376e614759565b60200101906001600160f81b03191690815f1a905350600101613738565b505f5b60048110156137ea576137a3816003614746565b6137ae9060086145e6565b505f826137bc83600261476d565b815181106137cc576137cc614759565b60200101906001600160f81b03191690815f1a90535060010161378f565b505f5b6020811015613847578451816020811061380957613809614759565b1a60f81b8261381983600661476d565b8151811061382957613829614759565b60200101906001600160f81b03191690815f1a9053506001016137ed565b505f5b60208110156138a7578460200151816020811061386957613869614759565b1a60f81b8261387983602661476d565b8151811061388957613889614759565b60200101906001600160f81b03191690815f1a90535060010161384a565b505f5b600881101561391b576138be816007614746565b6138c99060086145e6565b60ff1685604001516001600160401b0316901c60f81b828260466138ed919061476d565b815181106138fd576138fd614759565b60200101906001600160f81b03191690815f1a9053506001016138aa565b505f5b6030811015613986578460800151818151811061393d5761393d614759565b01602001516001600160f81b0319168261395883604e61476d565b8151811061396857613968614759565b60200101906001600160f81b03191690815f1a90535060010161391e565b505f5b60088110156139f85761399d816007614746565b6139a89060086145e6565b60608601516001600160401b0390811691161c60f81b826139ca83607e61476d565b815181106139da576139da614759565b60200101906001600160f81b03191690815f1a905350600101613989565b50600281604051613a0991906148b9565b602060405180830381855afa158015613a24573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a47919061449b565b94909350915050565b60015f8051602061497083398151915255565b5f613a776001600160a01b03841683613ce8565b905080515f14158015613a9b575080806020019051810190613a9991906148d4565b155b156108c657604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b613acc6134da565b613ad4613cf5565b613adc613d05565b61150d81613d0d565b613aed6134da565b5f8051602061491083398151915280546001600160401b03938416600160801b0267ffffffffffffffff60801b19958516600160401b026001600160801b031990921696909416959095179490941792909216179091557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0180546001600160a01b039092166001600160a01b0319909216919091179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613bcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bf0919061449b565b9050613c076001600160a01b038516333086613e41565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c6f919061449b565b9050818111613cd55760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613cdf8282614746565b95945050505050565b6060610f6083835f613e80565b613cfd6134da565b613523613f0f565b6135236134da565b613d156134da565b80355f8051602061495083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613d6160808401606085016148ef565b60ff161115613dce5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043b565b613dde60808301606084016148ef565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613e0f60608301604084016140fd565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6040516001600160a01b038481166024830152838116604483015260648201839052613e7a9186918216906323b872dd906084016134a8565b50505050565b606081471015613ea55760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613ec091906148b9565b5f6040518083038185875af1925050503d805f8114613efa576040519150601f19603f3d011682016040523d82523d5f602084013e613eff565b606091505b5091509150611485868383613f17565b613a506134da565b606082613f2c57613f2782613f73565b610f60565b8151158015613f4357506001600160a01b0384163b155b15613f6c57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610f60565b805115613f835780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613fa890614305565b5f825580601f10613fb7575050565b601f0160209004905f5260205f209081019061150d9190614017565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561402b575f8155600101614018565b5090565b801515811461150d575f80fd5b803563ffffffff8116811461404f575f80fd5b919050565b5f805f60608486031215614066575f80fd5b8335925060208401356140788161402f565b91506140866040850161403c565b90509250925092565b5f6020828403121561409f575f80fd5b5035919050565b5f602082840312156140b6575f80fd5b610f608261403c565b5f80604083850312156140d0575f80fd5b6140d98361403c565b946020939093013593505050565b80356001600160401b038116811461404f575f80fd5b5f6020828403121561410d575f80fd5b610f60826140e7565b6001600160a01b038116811461150d575f80fd5b5f8082840361012081121561413d575f80fd5b6101008082121561414c575f80fd5b849350830135905061415d81614116565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561419e5761419e614168565b60405290565b604051601f8201601f191681016001600160401b03811182821017156141cc576141cc614168565b604052919050565b5f6001600160401b038211156141ec576141ec614168565b50601f01601f191660200190565b5f805f806080858703121561420d575f80fd5b8435935060208501359250614224604086016140e7565b915060608501356001600160401b0381111561423e575f80fd5b8501601f8101871361424e575f80fd5b803561426161425c826141d4565b6141a4565b818152886020838501011115614275575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156142a7575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156142fe576142fe6142ca565b5092915050565b600181811c9082168061431957607f821691505b60208210810361433757634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108c657805f5260205f20601f840160051c810160208510156143625750805b601f840160051c820191505b81811015614381575f815560010161436e565b5050505050565b81516001600160401b038111156143a1576143a1614168565b6143b5816143af8454614305565b8461433d565b602080601f8311600181146143e8575f84156143d15750858301515b5f19600386901b1c1916600185901b17855561443f565b5f85815260208120601f198616915b82811015614416578886015182559484019460019091019084016143f7565b508582101561443357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015614461578181015183820152602001614449565b50505f910152565b602081525f8251806020840152614487816040850160208701614447565b601f01601f19169190910160400192915050565b5f602082840312156144ab575f80fd5b5051919050565b5f60208083525f84546144c481614305565b806020870152604060018084165f81146144e557600181146145015761452e565b60ff19851660408a0152604084151560051b8a0101955061452e565b895f5260205f205f5b858110156145255781548b820186015290830190880161450a565b8a016040019650505b509398975050505050505050565b5f8261455657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610948576109486142ca565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b805161404f8161402f565b5f8060408385031215614660575f80fd5b82516001600160401b0380821115614676575f80fd5b9084019060608287031215614689575f80fd5b61469161417c565b825181526020808401516146a481614116565b828201526040840151838111156146b9575f80fd5b80850194505087601f8501126146cd575f80fd5b835192506146dd61425c846141d4565b83815288828587010111156146f0575f80fd5b6146ff84838301848801614447565b80604084015250819550614714818801614644565b9450505050509250929050565b5f6001600160401b0380831681810361473c5761473c6142ca565b6001019392505050565b81810381811115610948576109486142ca565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610948576109486142ca565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156142fe576142fe6142ca565b6001600160401b03818116838216028082169190828114614896576148966142ca565b505092915050565b5f602082840312156148ae575f80fd5b8135610f6081614116565b5f82516148ca818460208701614447565b9190910192915050565b5f602082840312156148e4575f80fd5b8151610f608161402f565b5f602082840312156148ff575f80fd5b813560ff81168114610f60575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 53912b456..b6d597580 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -49,7 +49,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumStakeWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161473638038061473683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145e98061014d5f395ff3fe608060405260043610610105575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f4578063b771b3bc14610313578063bee0a03f14610345578063c599e24f14610364578063f40797d714610377575f80fd5b806366435abf146102785780636d0e43fa1461029757806376f78621146102b657806398f3e2b4146102d5575f80fd5b8063162f1f61116100d8578063162f1f61146101c55780632e2194d8146101e4578063467ef06f1461021b5780635297fae61461023a5780636206585614610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630a115d26146101495780630cdd098514610168575b5f80fd5b348015610114575f80fd5b50610128610123366004613cf3565b61038a565b005b348015610135575f80fd5b50610128610144366004613d2e565b610823565b348015610154575f80fd5b50610128610163366004613d45565b61097f565b348015610173575f80fd5b506101b2610182366004613d2e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b3480156101d0575f80fd5b506101286101df366004613d2e565b610a5c565b3480156101ef575f80fd5b506102036101fe366004613d2e565b610ac9565b6040516001600160401b0390911681526020016101bc565b348015610226575f80fd5b50610128610235366004613d5c565b610adf565b348015610245575f80fd5b50610128610254366004613d75565b610b0a565b348015610264575f80fd5b506101b2610273366004613db3565b610cfb565b348015610283575f80fd5b50610203610292366004613d2e565b610d14565b3480156102a2575f80fd5b506101286102b1366004613d2e565b610d28565b3480156102c1575f80fd5b506101286102d0366004613cf3565b610d95565b3480156102e0575f80fd5b506101286102ef366004613d75565b610db0565b3480156102ff575f80fd5b5061012861030e366004613d5c565b610fe1565b34801561031e575f80fd5b5061032d6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b348015610350575f80fd5b5061012861035f366004613d2e565b61119e565b6101b2610372366004613d2e565b61126d565b6101b2610385366004613e5e565b611279565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0260205260408120600101545f8051602061453d8339815191529184156103dc576103d9828561129d565b90505b5f868152600284016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613ef0565b600481111561041f5761041f613ef0565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613ef0565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f8051602061455d8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f8051602061455d8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f61056784611539565b905061057682606001516115ad565b600382526001600160401b0342811660a0840152811660e08301525f88815260028601602052604090208251815484929190829060ff191660018360048111156105c2576105c2613ef0565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610694856115ba565b905082606001516001600160401b03168160a001516001600160401b03161161070b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107209190613f18565b905061072c8682611699565b5f6107388785846116e1565b5f8c815260048a01602052604090209091506107548282613fbc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061078190859060040161409d565b6020604051808303815f875af115801561079d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c191906140cf565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f8051602061457d83398151915292919061086b90613f3f565b905011801561089d575060035f83815260098301602052604090205460ff16600581111561089b5761089b613ef0565b145b6109015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161093a91906004016140e6565b6020604051808303815f875af1158015610956573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097a91906140cf565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109c8575080546001600160401b03808416911610155b156109e65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a10836118fe565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610a658161190f565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061453d833981519152916005600160991b019163ee5b48eb9161093a916004016140e6565b5f610ad964e8d4a5100083614170565b92915050565b5f610ae9826119de565b9050610b0681606001516001600160401b03168260400151611d6b565b5050565b5f8051602061453d8339815191525f610b2284611d7e565b90505f80610b338360400151611f5f565b5091509150610b418561219a565b5f8581526003850160205260408120610b5991613c3b565b5f610b63836115ba565b9050816001600160401b031681608001516001600160401b03161015610b9b5760405162461bcd60e51b81526004016104ef9061418f565b5f8681526002808701602052604090912001546001600160401b03808416600160c01b909204161115610be05760405162461bcd60e51b81526004016104ef906141d1565b60015f87815260028701602052604090205460ff166004811115610c0657610c06613ef0565b14610c6f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f86815260028681016020908152604092839020805460ff19168317815590910180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad96001600160401b03831664e8d4a5100061421a565b5f610d1e826115ba565b60a0015192915050565b610d318161219a565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604090819020905163ee5b48eb60e01b81525f8051602061453d833981519152916005600160991b019163ee5b48eb9161093a916004016140e6565b8115610da757610da5838261129d565b505b61097a83612273565b5f8051602061453d8339815191525f610dc884611d7e565b90505f80610dd98360400151611f5f565b5091509150610de78561190f565b5f8581526004850160205260408120610dff91613c3b565b5f610e09836115ba565b9050816001600160401b031681608001516001600160401b03161015610e415760405162461bcd60e51b81526004016104ef9061418f565b5f8681526002860160205260409020600301546001600160401b0380841691161115610e7f5760405162461bcd60e51b81526004016104ef906141d1565b60035f87815260028701602052604090205460ff166004811115610ea557610ea5613ef0565b14610ef95760405162461bcd60e51b815260206004820152603160248201525f8051602061455d8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f86815260028681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b0316928101839052600182015494810194909452918201546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039093015490921660e0840152610f9f9190611d6b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061457d8339815191525f610ff983611d7e565b90505f8061100a836040015161262b565b915091508061106c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526007850160205260408120805461108690613f3f565b90501180156110b8575060015f83815260098601602052604090205460ff1660058111156110b6576110b6613ef0565b145b6110d45760405162461bcd60e51b81526004016104ef90614231565b5f82815260078501602052604081206110ec91613c3b565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061457d8339815191529291906111e690613f3f565b9050118015611218575060015f83815260098301602052604090205460ff16600581111561121657611216613ef0565b145b6112345760405162461bcd60e51b81526004016104ef90614231565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161093a91906004016140e6565b5f610ad98233346127cc565b5f8061128434612b84565b905061129285828686612c3a565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112e8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261130f9190810190614297565b91509150806113725760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d991906140cf565b82511461143d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156114b35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806114c284604001516130ff565b9150915081871461152f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206145bd8339815191526020526040812060030180545f8051602061457d833981519152916001600160401b039091169081908461157e83614369565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115b7815f6132d7565b50565b6115c2613c72565b5f8281525f805160206145bd8339815191526020526040908190208151610100810190925280545f8051602061457d833981519152929190829060ff16600581111561161057611610613ef0565b600581111561162157611621613ef0565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206145bd833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561175a5761171a81600161438e565b61172590600861421a565b5081515f9083908390811061173c5761173c6143a1565b60200101906001600160f81b03191690815f1a905350600101611706565b505f5b60048110156117bd5761177181600361438e565b61177c90600861421a565b6001901c60f81b8261178f8360026143b5565b8151811061179f5761179f6143a1565b60200101906001600160f81b03191690815f1a90535060010161175d565b505f5b602081101561181f576117d481601f61438e565b6117df90600861421a565b86901c60f81b826117f18360066143b5565b81518110611801576118016143a1565b60200101906001600160f81b03191690815f1a9053506001016117c0565b505f5b600881101561188a5761183681600761438e565b61184190600861421a565b6001600160401b038616901c60f81b8261185c8360266143b5565b8151811061186c5761186c6143a1565b60200101906001600160f81b03191690815f1a905350600101611822565b505f5b60088110156118f5576118a181600761438e565b6118ac90600861421a565b6001600160401b038516901c60f81b826118c783602e6143b5565b815181106118d7576118d76143a1565b60200101906001600160f81b03191690815f1a90535060010161188d565b50949350505050565b6119066134f3565b6115b78161353e565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061453d83398151915292919061195790613f3f565b9050118015611989575060035f83815260028301602052604090205460ff16600481111561198757611987613ef0565b145b610b065760405162461bcd60e51b815260206004820152603360248201525f8051602061455d83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b6119e6613c72565b5f8051602061457d8339815191525f6119fe84611d7e565b90505f80611a0f836040015161262b565b915091508015611a745760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600985016020526040808220815161010081019092528054829060ff166005811115611aa657611aa6613ef0565b6005811115611ab757611ab7613ef0565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b3e57611b3e613ef0565b1480611b5c5750600182516005811115611b5a57611b5a613ef0565b145b611bbb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115611bd057611bd0613ef0565b03611bf757505f8381526008860160205260408120600491611bf29190613c3b565b611bfb565b5060055b6020808301515f908152600a8801909152604081205581816005811115611c2457611c24613ef0565b90816005811115611c3757611c37613ef0565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115611c6b57611c6b613ef0565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d3657611d36613ef0565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610b066001600160a01b03821683613598565b60408051606080820183525f8083526020830181905292820152905f8051602061457d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611df3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e1a9190810190614297565b9150915080611e815760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611ee45760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611f575760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f805f8351603614611f835760405162461bcd60e51b81526004016104ef906143c8565b5f805b6002811015611fd257611f9a81600161438e565b611fa590600861421a565b61ffff16868281518110611fbb57611fbb6143a1565b016020015160f81c901b9190911790600101611f86565b5061ffff811615611ff55760405162461bcd60e51b81526004016104ef90614411565b5f805b60048110156120505761200c81600361438e565b61201790600861421a565b63ffffffff16876120298360026143b5565b81518110612039576120396143a1565b016020015160f81c901b9190911790600101611ff8565b5063ffffffff81166003146120775760405162461bcd60e51b81526004016104ef90614454565b5f805b60208110156120cc5761208e81601f61438e565b61209990600861421a565b886120a58360066143b5565b815181106120b5576120b56143a1565b016020015160f81c901b919091179060010161207a565b505f805b600881101561212b576120e481600761438e565b6120ef90600861421a565b6001600160401b0316896121048360266143b5565b81518110612114576121146143a1565b016020015160f81c901b91909117906001016120d0565b505f805b600881101561218a5761214381600761438e565b61214e90600861421a565b6001600160401b03168a61216383602e6143b5565b81518110612173576121736143a1565b016020015160f81c901b919091179060010161212f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d036020526040812080545f8051602061453d8339815191529291906121e290613f3f565b9050118015612214575060015f83815260028301602052604090205460ff16600481111561221257612212613ef0565b145b610b065760405162461bcd60e51b815260206004820152603860248201525f8051602061455d83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f8181525f805160206145bd83398151915260205260408082208151610100810190925280545f8051602061457d83398151915293929190829060ff1660058111156122c1576122c1613ef0565b60058111156122d2576122d2613ef0565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561235a5761235a613ef0565b146123b65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146124305760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b61243d8160a001516115ad565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff1916600183600581111561248157612481613ef0565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61254d8461254781611539565b5f6116e1565b5f85815260088501602052604090209091506125698282613fbc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061259690859060040161409d565b6020604051808303815f875af11580156125b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d691906140cf565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461264e5760405162461bcd60e51b81526004016104ef906143c8565b5f805b600281101561269d5761266581600161438e565b61267090600861421a565b61ffff16858281518110612686576126866143a1565b016020015160f81c901b9190911790600101612651565b5061ffff8116156126c05760405162461bcd60e51b81526004016104ef90614411565b5f805b600481101561271b576126d781600361438e565b6126e290600861421a565b63ffffffff16866126f48360026143b5565b81518110612704576127046143a1565b016020015160f81c901b91909117906001016126c3565b5063ffffffff81166002146127425760405162461bcd60e51b81526004016104ef90614454565b5f805b60208110156127975761275981601f61438e565b61276490600861421a565b876127708360066143b5565b81518110612780576127806143a1565b016020015160f81c901b9190911790600101612745565b505f866026815181106127ac576127ac6143a1565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127d561362b565b5f6127df83610ac9565b90505f8051602061453d8339815191525f6127f9876115ba565b905060028151600581111561281057612810613ef0565b1461286f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b61287883613662565b5f838260a00151612889919061449b565b90506128958882611699565b5f61289f89611539565b90505f8989836040516020016128e79392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090505f61290b8b84866116e1565b5f83815260038801602052604090209091506129278282613fbc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061295490859060040161409d565b6020604051808303815f875af1158015612970573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299491906140cf565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876002015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a4357612a43613ef0565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061129660015f8051602061459d83398151915255565b5f5f8051602061453d8339815191528282612b9e82610ac9565b83549091506001600160401b0390811690821610801590612bd4575082546001600160401b03600160401b909104811690821611155b612c325760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b949350505050565b5f612c4361362b565b5f8051602061457d833981519152426001600160401b03851611612cc55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612cdc426202a3006143b5565b11612d4f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612da65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f868152600a8201602052604090205415612e145760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b8251603014612e7b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b612e8485613662565b5f80612ecb6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613680565b5f82815260078601602052604090209193509150612ee98282613fbc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f1690859060040161409d565b6020604051808303815f875af1158015612f32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f5691906140cf565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff19166001836005811115612fd857612fd8613ef0565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561309983611539565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c3260015f8051602061459d83398151915255565b5f808251602e146131225760405162461bcd60e51b81526004016104ef906143c8565b5f805b60028110156131715761313981600161438e565b61314490600861421a565b61ffff1685828151811061315a5761315a6143a1565b016020015160f81c901b9190911790600101613125565b5061ffff8116156131945760405162461bcd60e51b81526004016104ef90614411565b5f805b60048110156131ef576131ab81600361438e565b6131b690600861421a565b63ffffffff16866131c88360026143b5565b815181106131d8576131d86143a1565b016020015160f81c901b9190911790600101613197565b5063ffffffff81166004146132165760405162461bcd60e51b81526004016104ef90614454565b5f805b602081101561326b5761322d81601f61438e565b61323890600861421a565b876132448360066143b5565b81518110613254576132546143a1565b016020015160f81c901b9190911790600101613219565b505f805b60088110156132ca5761328381600761438e565b61328e90600861421a565b6001600160401b0316886132a38360266143b5565b815181106132b3576132b36143a1565b016020015160f81c901b919091179060010161326f565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061457d83398151915290600160401b900460ff165f0361331d57505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b031660608201524291158061337f57506002830154815161337b916001600160401b0316906143b5565b8210155b156133a5576001600160401b0385166060820152818152604081015160208201526133c4565b84816060018181516133b7919061449b565b6001600160401b03169052505b60608101516133d49060646144bb565b602082015160028501546001600160401b0392909216916133ff9190600160401b900460ff1661421a565b10156134635760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104ef565b831561348c57846001600160401b03168160400181815161348491906143b5565b9052506134ab565b846001600160401b0316816040018181516134a7919061438e565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661353c57604051631afcd79f60e31b815260040160405180910390fd5b565b6135466134f3565b61354f81613a25565b6115b761356260a0830160808401613db3565b61357260c0840160a08501613db3565b61358260e0850160c08601613db3565b613593610100860160e087016144e6565b613a46565b804710156135bb5760405163cd78605960e01b81523060048201526024016104ef565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613604576040519150601f19603f3d011682016040523d82523d5f602084013e613609565b606091505b505090508061097a57604051630a12f52160e11b815260040160405180910390fd5b5f8051602061459d83398151915280546001190161365c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6115b78160016132d7565b60015f8051602061459d83398151915255565b5f60608260800151516030146136ea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137615761372181600161438e565b61372c90600861421a565b5081515f90839083908110613743576137436143a1565b60200101906001600160f81b03191690815f1a90535060010161370d565b505f5b60048110156137bf5761377881600361438e565b61378390600861421a565b505f826137918360026143b5565b815181106137a1576137a16143a1565b60200101906001600160f81b03191690815f1a905350600101613764565b505f5b602081101561381c57845181602081106137de576137de6143a1565b1a60f81b826137ee8360066143b5565b815181106137fe576137fe6143a1565b60200101906001600160f81b03191690815f1a9053506001016137c2565b505f5b602081101561387c578460200151816020811061383e5761383e6143a1565b1a60f81b8261384e8360266143b5565b8151811061385e5761385e6143a1565b60200101906001600160f81b03191690815f1a90535060010161381f565b505f5b60088110156138f05761389381600761438e565b61389e90600861421a565b60ff1685604001516001600160401b0316901c60f81b828260466138c291906143b5565b815181106138d2576138d26143a1565b60200101906001600160f81b03191690815f1a90535060010161387f565b505f5b603081101561395b5784608001518181518110613912576139126143a1565b01602001516001600160f81b0319168261392d83604e6143b5565b8151811061393d5761393d6143a1565b60200101906001600160f81b03191690815f1a9053506001016138f3565b505f5b60088110156139cd5761397281600761438e565b61397d90600861421a565b60608601516001600160401b0390811691161c60f81b8261399f83607e6143b5565b815181106139af576139af6143a1565b60200101906001600160f81b03191690815f1a90535060010161395e565b506002816040516139de9190614501565b602060405180830381855afa1580156139f9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a1c91906140cf565b94909350915050565b613a2d6134f3565b613a35613ae7565b613a3d613af7565b6115b781613aff565b613a4e6134f3565b5f8051602061453d83398151915280546001600160401b03938416600160801b0267ffffffffffffffff60801b19958516600160401b026001600160801b031990921696909416959095179490941792909216179091557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0180546001600160a01b039092166001600160a01b0319909216919091179055565b613aef6134f3565b61353c613c33565b61353c6134f3565b613b076134f3565b80355f8051602061457d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613b53608084016060850161451c565b60ff161115613bc05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104ef565b613bd0608083016060840161451c565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613c016060830160408401613db3565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b61366d6134f3565b508054613c4790613f3f565b5f825580601f10613c56575050565b601f0160209004905f5260205f20908101906115b79190613cb6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613cca575f8155600101613cb7565b5090565b80151581146115b7575f80fd5b803563ffffffff81168114613cee575f80fd5b919050565b5f805f60608486031215613d05575f80fd5b833592506020840135613d1781613cce565b9150613d2560408501613cdb565b90509250925092565b5f60208284031215613d3e575f80fd5b5035919050565b5f6101008284031215613d56575f80fd5b50919050565b5f60208284031215613d6c575f80fd5b61129682613cdb565b5f8060408385031215613d86575f80fd5b613d8f83613cdb565b946020939093013593505050565b80356001600160401b0381168114613cee575f80fd5b5f60208284031215613dc3575f80fd5b61129682613d9d565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e0257613e02613dcc565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e3057613e30613dcc565b604052919050565b5f6001600160401b03821115613e5057613e50613dcc565b50601f01601f191660200190565b5f805f60608486031215613e70575f80fd5b83359250613e8060208501613d9d565b915060408401356001600160401b03811115613e9a575f80fd5b8401601f81018613613eaa575f80fd5b8035613ebd613eb882613e38565b613e08565b818152876020838501011115613ed1575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f3857613f38613f04565b5092915050565b600181811c90821680613f5357607f821691505b602082108103613d5657634e487b7160e01b5f52602260045260245ffd5b601f82111561097a57805f5260205f20601f840160051c81016020851015613f965750805b601f840160051c820191505b81811015613fb5575f8155600101613fa2565b5050505050565b81516001600160401b03811115613fd557613fd5613dcc565b613fe981613fe38454613f3f565b84613f71565b602080601f83116001811461401c575f84156140055750858301515b5f19600386901b1c1916600185901b178555614073565b5f85815260208120601f198616915b8281101561404a5788860151825594840194600190910190840161402b565b508582101561406757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561409557818101518382015260200161407d565b50505f910152565b602081525f82518060208401526140bb81604085016020870161407b565b601f01601f19169190910160400192915050565b5f602082840312156140df575f80fd5b5051919050565b5f60208083525f84546140f881613f3f565b806020870152604060018084165f8114614119576001811461413557614162565b60ff19851660408a0152604084151560051b8a01019550614162565b895f5260205f205f5b858110156141595781548b820186015290830190880161413e565b8a016040019650505b509398975050505050505050565b5f8261418a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad957610ad9613f04565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b03811681146115b7575f80fd5b8051613cee81613cce565b5f80604083850312156142a8575f80fd5b82516001600160401b03808211156142be575f80fd5b90840190606082870312156142d1575f80fd5b6142d9613de0565b825181526020808401516142ec81614278565b82820152604084015183811115614301575f80fd5b80850194505087601f850112614315575f80fd5b83519250614325613eb884613e38565b8381528882858701011115614338575f80fd5b6143478483830184880161407b565b8060408401525081955061435c81880161428c565b9450505050509250929050565b5f6001600160401b0380831681810361438457614384613f04565b6001019392505050565b81810381811115610ad957610ad9613f04565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad957610ad9613f04565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f3857613f38613f04565b6001600160401b038181168382160280821691908281146144de576144de613f04565b505092915050565b5f602082840312156144f6575f80fd5b813561129681614278565b5f825161451281846020870161407b565b9190910192915050565b5f6020828403121561452c575f80fd5b813560ff81168114611296575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161473638038061473683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145e98061014d5f395ff3fe608060405260043610610105575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f4578063b771b3bc14610313578063bee0a03f14610345578063c599e24f14610364578063f40797d714610377575f80fd5b806366435abf146102785780636d0e43fa1461029757806376f78621146102b657806398f3e2b4146102d5575f80fd5b8063162f1f61116100d8578063162f1f61146101c55780632e2194d8146101e4578063467ef06f1461021b5780635297fae61461023a5780636206585614610259575f80fd5b80630118acc4146101095780630322ed981461012a5780630a115d26146101495780630cdd098514610168575b5f80fd5b348015610114575f80fd5b50610128610123366004613cf3565b61038a565b005b348015610135575f80fd5b50610128610144366004613d2e565b610823565b348015610154575f80fd5b50610128610163366004613d45565b61097f565b348015610173575f80fd5b506101b2610182366004613d2e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a602052604090205490565b6040519081526020015b60405180910390f35b3480156101d0575f80fd5b506101286101df366004613d2e565b610a5c565b3480156101ef575f80fd5b506102036101fe366004613d2e565b610ac9565b6040516001600160401b0390911681526020016101bc565b348015610226575f80fd5b50610128610235366004613d5c565b610adf565b348015610245575f80fd5b50610128610254366004613d75565b610b0a565b348015610264575f80fd5b506101b2610273366004613db3565b610cfb565b348015610283575f80fd5b50610203610292366004613d2e565b610d14565b3480156102a2575f80fd5b506101286102b1366004613d2e565b610d28565b3480156102c1575f80fd5b506101286102d0366004613cf3565b610d95565b3480156102e0575f80fd5b506101286102ef366004613d75565b610db0565b3480156102ff575f80fd5b5061012861030e366004613d5c565b610fe1565b34801561031e575f80fd5b5061032d6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b348015610350575f80fd5b5061012861035f366004613d2e565b61119e565b6101b2610372366004613d2e565b61126d565b6101b2610385366004613e5e565b611279565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0260205260408120600101545f8051602061453d8339815191529184156103dc576103d9828561129d565b90505b5f868152600284016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613ef0565b600481111561041f5761041f613ef0565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613ef0565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f8051602061455d8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f8051602061455d8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f61056784611539565b905061057682606001516115ad565b600382526001600160401b0342811660a0840152811660e08301525f88815260028601602052604090208251815484929190829060ff191660018360048111156105c2576105c2613ef0565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610694856115ba565b905082606001516001600160401b03168160a001516001600160401b03161161070b5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107209190613f18565b905061072c8682611699565b5f6107388785846116e1565b5f8c815260048a01602052604090209091506107548282613fbc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061078190859060040161409d565b6020604051808303815f875af115801561079d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c191906140cf565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb086020526040812080545f8051602061457d83398151915292919061086b90613f3f565b905011801561089d575060035f83815260098301602052604090205460ff16600581111561089b5761089b613ef0565b145b6109015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260088201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161093a91906004016140e6565b6020604051808303815f875af1158015610956573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097a91906140cf565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109c8575080546001600160401b03808416911610155b156109e65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a10836118fe565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610a658161190f565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061453d833981519152916005600160991b019163ee5b48eb9161093a916004016140e6565b5f610ad964e8d4a5100083614170565b92915050565b5f610ae9826119de565b9050610b0681606001516001600160401b03168260400151611d6b565b5050565b5f8051602061453d8339815191525f610b2284611d7e565b90505f80610b338360400151611f5f565b5091509150610b418561219a565b5f8581526003850160205260408120610b5991613c3b565b5f610b63836115ba565b9050816001600160401b031681608001516001600160401b03161015610b9b5760405162461bcd60e51b81526004016104ef9061418f565b5f8681526002808701602052604090912001546001600160401b03808416600160c01b909204161115610be05760405162461bcd60e51b81526004016104ef906141d1565b60015f87815260028701602052604090205460ff166004811115610c0657610c06613ef0565b14610c6f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f86815260028681016020908152604092839020805460ff19168317815590910180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ad96001600160401b03831664e8d4a5100061421a565b5f610d1e826115ba565b60a0015192915050565b610d318161219a565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604090819020905163ee5b48eb60e01b81525f8051602061453d833981519152916005600160991b019163ee5b48eb9161093a916004016140e6565b8115610da757610da5838261129d565b505b61097a83612273565b5f8051602061453d8339815191525f610dc884611d7e565b90505f80610dd98360400151611f5f565b5091509150610de78561190f565b5f8581526004850160205260408120610dff91613c3b565b5f610e09836115ba565b9050816001600160401b031681608001516001600160401b03161015610e415760405162461bcd60e51b81526004016104ef9061418f565b5f8681526002860160205260409020600301546001600160401b0380841691161115610e7f5760405162461bcd60e51b81526004016104ef906141d1565b60035f87815260028701602052604090205460ff166004811115610ea557610ea5613ef0565b14610ef95760405162461bcd60e51b815260206004820152603160248201525f8051602061455d8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f86815260028681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b0316928101839052600182015494810194909452918201546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039093015490921660e0840152610f9f9190611d6b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061457d8339815191525f610ff983611d7e565b90505f8061100a836040015161262b565b915091508061106c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526007850160205260408120805461108690613f3f565b90501180156110b8575060015f83815260098601602052604090205460ff1660058111156110b6576110b6613ef0565b145b6110d45760405162461bcd60e51b81526004016104ef90614231565b5f82815260078501602052604081206110ec91613c3b565b5f8281526009850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b199093169290921783556001909301548752600a8b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061457d8339815191529291906111e690613f3f565b9050118015611218575060015f83815260098301602052604090205460ff16600581111561121657611216613ef0565b145b6112345760405162461bcd60e51b81526004016104ef90614231565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161093a91906004016140e6565b5f610ad98233346127cc565b5f8061128434612b84565b905061129285828686612c3a565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112e8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261130f9190810190614297565b91509150806113725760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113d991906140cf565b82511461143d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156114b35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806114c284604001516130ff565b9150915081871461152f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206145bd8339815191526020526040812060030180545f8051602061457d833981519152916001600160401b039091169081908461157e83614369565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115b7815f6132d7565b50565b6115c2613c72565b5f8281525f805160206145bd8339815191526020526040908190208151610100810190925280545f8051602061457d833981519152929190829060ff16600581111561161057611610613ef0565b600581111561162157611621613ef0565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206145bd833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561175a5761171a81600161438e565b61172590600861421a565b5081515f9083908390811061173c5761173c6143a1565b60200101906001600160f81b03191690815f1a905350600101611706565b505f5b60048110156117bd5761177181600361438e565b61177c90600861421a565b6001901c60f81b8261178f8360026143b5565b8151811061179f5761179f6143a1565b60200101906001600160f81b03191690815f1a90535060010161175d565b505f5b602081101561181f576117d481601f61438e565b6117df90600861421a565b86901c60f81b826117f18360066143b5565b81518110611801576118016143a1565b60200101906001600160f81b03191690815f1a9053506001016117c0565b505f5b600881101561188a5761183681600761438e565b61184190600861421a565b6001600160401b038616901c60f81b8261185c8360266143b5565b8151811061186c5761186c6143a1565b60200101906001600160f81b03191690815f1a905350600101611822565b505f5b60088110156118f5576118a181600761438e565b6118ac90600861421a565b6001600160401b038516901c60f81b826118c783602e6143b5565b815181106118d7576118d76143a1565b60200101906001600160f81b03191690815f1a90535060010161188d565b50949350505050565b6119066134f3565b6115b78161353e565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061453d83398151915292919061195790613f3f565b9050118015611989575060035f83815260028301602052604090205460ff16600481111561198757611987613ef0565b145b610b065760405162461bcd60e51b815260206004820152603360248201525f8051602061455d83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b6119e6613c72565b5f8051602061457d8339815191525f6119fe84611d7e565b90505f80611a0f836040015161262b565b915091508015611a745760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600985016020526040808220815161010081019092528054829060ff166005811115611aa657611aa6613ef0565b6005811115611ab757611ab7613ef0565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b3e57611b3e613ef0565b1480611b5c5750600182516005811115611b5a57611b5a613ef0565b145b611bbb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115611bd057611bd0613ef0565b03611bf757505f8381526008860160205260408120600491611bf29190613c3b565b611bfb565b5060055b6020808301515f908152600a8801909152604081205581816005811115611c2457611c24613ef0565b90816005811115611c3757611c37613ef0565b9052505f84815260098701602052604090208251815484929190829060ff19166001836005811115611c6b57611c6b613ef0565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d3657611d36613ef0565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610b066001600160a01b03821683613598565b60408051606080820183525f8083526020830181905292820152905f8051602061457d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611df3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e1a9190810190614297565b9150915080611e815760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b8254825114611ee45760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b031615611f575760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f805f8351603614611f835760405162461bcd60e51b81526004016104ef906143c8565b5f805b6002811015611fd257611f9a81600161438e565b611fa590600861421a565b61ffff16868281518110611fbb57611fbb6143a1565b016020015160f81c901b9190911790600101611f86565b5061ffff811615611ff55760405162461bcd60e51b81526004016104ef90614411565b5f805b60048110156120505761200c81600361438e565b61201790600861421a565b63ffffffff16876120298360026143b5565b81518110612039576120396143a1565b016020015160f81c901b9190911790600101611ff8565b5063ffffffff81166003146120775760405162461bcd60e51b81526004016104ef90614454565b5f805b60208110156120cc5761208e81601f61438e565b61209990600861421a565b886120a58360066143b5565b815181106120b5576120b56143a1565b016020015160f81c901b919091179060010161207a565b505f805b600881101561212b576120e481600761438e565b6120ef90600861421a565b6001600160401b0316896121048360266143b5565b81518110612114576121146143a1565b016020015160f81c901b91909117906001016120d0565b505f805b600881101561218a5761214381600761438e565b61214e90600861421a565b6001600160401b03168a61216383602e6143b5565b81518110612173576121736143a1565b016020015160f81c901b919091179060010161212f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d036020526040812080545f8051602061453d8339815191529291906121e290613f3f565b9050118015612214575060015f83815260028301602052604090205460ff16600481111561221257612212613ef0565b145b610b065760405162461bcd60e51b815260206004820152603860248201525f8051602061455d83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f8181525f805160206145bd83398151915260205260408082208151610100810190925280545f8051602061457d83398151915293929190829060ff1660058111156122c1576122c1613ef0565b60058111156122d2576122d2613ef0565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561235a5761235a613ef0565b146123b65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146124305760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b61243d8160a001516115ad565b60038152426001600160401b031660e08201525f83815260098301602052604090208151815483929190829060ff1916600183600581111561248157612481613ef0565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61254d8461254781611539565b5f6116e1565b5f85815260088501602052604090209091506125698282613fbc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061259690859060040161409d565b6020604051808303815f875af11580156125b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d691906140cf565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461264e5760405162461bcd60e51b81526004016104ef906143c8565b5f805b600281101561269d5761266581600161438e565b61267090600861421a565b61ffff16858281518110612686576126866143a1565b016020015160f81c901b9190911790600101612651565b5061ffff8116156126c05760405162461bcd60e51b81526004016104ef90614411565b5f805b600481101561271b576126d781600361438e565b6126e290600861421a565b63ffffffff16866126f48360026143b5565b81518110612704576127046143a1565b016020015160f81c901b91909117906001016126c3565b5063ffffffff81166002146127425760405162461bcd60e51b81526004016104ef90614454565b5f805b60208110156127975761275981601f61438e565b61276490600861421a565b876127708360066143b5565b81518110612780576127806143a1565b016020015160f81c901b9190911790600101612745565b505f866026815181106127ac576127ac6143a1565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127d561362b565b5f6127df83610ac9565b90505f8051602061453d8339815191525f6127f9876115ba565b905060028151600581111561281057612810613ef0565b1461286f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b61287883613662565b5f838260a00151612889919061449b565b90506128958882611699565b5f61289f89611539565b90505f8989836040516020016128e79392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090505f61290b8b84866116e1565b5f83815260038801602052604090209091506129278282613fbc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061295490859060040161409d565b6020604051808303815f875af1158015612970573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299491906140cf565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876002015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a4357612a43613ef0565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061129660015f8051602061459d83398151915255565b5f5f8051602061453d8339815191528282612b9e82610ac9565b83549091506001600160401b0390811690821610801590612bd4575082546001600160401b03600160401b909104811690821611155b612c325760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad9481dd95a59da1d60ba1b60648201526084016104ef565b949350505050565b5f612c4361362b565b5f8051602061457d833981519152426001600160401b03851611612cc55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ef565b6001600160401b038416612cdc426202a3006143b5565b11612d4f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ef565b85612da65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b5f868152600a8201602052604090205415612e145760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b8251603014612e7b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b612e8485613662565b5f80612ecb6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613680565b5f82815260078601602052604090209193509150612ee98282613fbc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f1690859060040161409d565b6020604051808303815f875af1158015612f32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f5691906140cf565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600988019052902081518154829060ff19166001836005811115612fd857612fd8613ef0565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561309983611539565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c3260015f8051602061459d83398151915255565b5f808251602e146131225760405162461bcd60e51b81526004016104ef906143c8565b5f805b60028110156131715761313981600161438e565b61314490600861421a565b61ffff1685828151811061315a5761315a6143a1565b016020015160f81c901b9190911790600101613125565b5061ffff8116156131945760405162461bcd60e51b81526004016104ef90614411565b5f805b60048110156131ef576131ab81600361438e565b6131b690600861421a565b63ffffffff16866131c88360026143b5565b815181106131d8576131d86143a1565b016020015160f81c901b9190911790600101613197565b5063ffffffff81166004146132165760405162461bcd60e51b81526004016104ef90614454565b5f805b602081101561326b5761322d81601f61438e565b61323890600861421a565b876132448360066143b5565b81518110613254576132546143a1565b016020015160f81c901b9190911790600101613219565b505f805b60088110156132ca5761328381600761438e565b61328e90600861421a565b6001600160401b0316886132a38360266143b5565b815181106132b3576132b36143a1565b016020015160f81c901b919091179060010161326f565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061457d83398151915290600160401b900460ff165f0361331d57505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b031660608201524291158061337f57506002830154815161337b916001600160401b0316906143b5565b8210155b156133a5576001600160401b0385166060820152818152604081015160208201526133c4565b84816060018181516133b7919061449b565b6001600160401b03169052505b60608101516133d49060646144bb565b602082015160028501546001600160401b0392909216916133ff9190600160401b900460ff1661421a565b10156134635760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104ef565b831561348c57846001600160401b03168160400181815161348491906143b5565b9052506134ab565b846001600160401b0316816040018181516134a7919061438e565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661353c57604051631afcd79f60e31b815260040160405180910390fd5b565b6135466134f3565b61354f81613a25565b6115b761356260a0830160808401613db3565b61357260c0840160a08501613db3565b61358260e0850160c08601613db3565b613593610100860160e087016144e6565b613a46565b804710156135bb5760405163cd78605960e01b81523060048201526024016104ef565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613604576040519150601f19603f3d011682016040523d82523d5f602084013e613609565b606091505b505090508061097a57604051630a12f52160e11b815260040160405180910390fd5b5f8051602061459d83398151915280546001190161365c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6115b78160016132d7565b60015f8051602061459d83398151915255565b5f60608260800151516030146136ea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137615761372181600161438e565b61372c90600861421a565b5081515f90839083908110613743576137436143a1565b60200101906001600160f81b03191690815f1a90535060010161370d565b505f5b60048110156137bf5761377881600361438e565b61378390600861421a565b505f826137918360026143b5565b815181106137a1576137a16143a1565b60200101906001600160f81b03191690815f1a905350600101613764565b505f5b602081101561381c57845181602081106137de576137de6143a1565b1a60f81b826137ee8360066143b5565b815181106137fe576137fe6143a1565b60200101906001600160f81b03191690815f1a9053506001016137c2565b505f5b602081101561387c578460200151816020811061383e5761383e6143a1565b1a60f81b8261384e8360266143b5565b8151811061385e5761385e6143a1565b60200101906001600160f81b03191690815f1a90535060010161381f565b505f5b60088110156138f05761389381600761438e565b61389e90600861421a565b60ff1685604001516001600160401b0316901c60f81b828260466138c291906143b5565b815181106138d2576138d26143a1565b60200101906001600160f81b03191690815f1a90535060010161387f565b505f5b603081101561395b5784608001518181518110613912576139126143a1565b01602001516001600160f81b0319168261392d83604e6143b5565b8151811061393d5761393d6143a1565b60200101906001600160f81b03191690815f1a9053506001016138f3565b505f5b60088110156139cd5761397281600761438e565b61397d90600861421a565b60608601516001600160401b0390811691161c60f81b8261399f83607e6143b5565b815181106139af576139af6143a1565b60200101906001600160f81b03191690815f1a90535060010161395e565b506002816040516139de9190614501565b602060405180830381855afa1580156139f9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a1c91906140cf565b94909350915050565b613a2d6134f3565b613a35613ae7565b613a3d613af7565b6115b781613aff565b613a4e6134f3565b5f8051602061453d83398151915280546001600160401b03938416600160801b0267ffffffffffffffff60801b19958516600160401b026001600160801b031990921696909416959095179490941792909216179091557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0180546001600160a01b039092166001600160a01b0319909216919091179055565b613aef6134f3565b61353c613c33565b61353c6134f3565b613b076134f3565b80355f8051602061457d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613b53608084016060850161451c565b60ff161115613bc05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104ef565b613bd0608083016060840161451c565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613c016060830160408401613db3565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b61366d6134f3565b508054613c4790613f3f565b5f825580601f10613c56575050565b601f0160209004905f5260205f20908101906115b79190613cb6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613cca575f8155600101613cb7565b5090565b80151581146115b7575f80fd5b803563ffffffff81168114613cee575f80fd5b919050565b5f805f60608486031215613d05575f80fd5b833592506020840135613d1781613cce565b9150613d2560408501613cdb565b90509250925092565b5f60208284031215613d3e575f80fd5b5035919050565b5f6101008284031215613d56575f80fd5b50919050565b5f60208284031215613d6c575f80fd5b61129682613cdb565b5f8060408385031215613d86575f80fd5b613d8f83613cdb565b946020939093013593505050565b80356001600160401b0381168114613cee575f80fd5b5f60208284031215613dc3575f80fd5b61129682613d9d565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e0257613e02613dcc565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e3057613e30613dcc565b604052919050565b5f6001600160401b03821115613e5057613e50613dcc565b50601f01601f191660200190565b5f805f60608486031215613e70575f80fd5b83359250613e8060208501613d9d565b915060408401356001600160401b03811115613e9a575f80fd5b8401601f81018613613eaa575f80fd5b8035613ebd613eb882613e38565b613e08565b818152876020838501011115613ed1575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f3857613f38613f04565b5092915050565b600181811c90821680613f5357607f821691505b602082108103613d5657634e487b7160e01b5f52602260045260245ffd5b601f82111561097a57805f5260205f20601f840160051c81016020851015613f965750805b601f840160051c820191505b81811015613fb5575f8155600101613fa2565b5050505050565b81516001600160401b03811115613fd557613fd5613dcc565b613fe981613fe38454613f3f565b84613f71565b602080601f83116001811461401c575f84156140055750858301515b5f19600386901b1c1916600185901b178555614073565b5f85815260208120601f198616915b8281101561404a5788860151825594840194600190910190840161402b565b508582101561406757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561409557818101518382015260200161407d565b50505f910152565b602081525f82518060208401526140bb81604085016020870161407b565b601f01601f19169190910160400192915050565b5f602082840312156140df575f80fd5b5051919050565b5f60208083525f84546140f881613f3f565b806020870152604060018084165f8114614119576001811461413557614162565b60ff19851660408a0152604084151560051b8a01019550614162565b895f5260205f205f5b858110156141595781548b820186015290830190880161413e565b8a016040019650505b509398975050505050505050565b5f8261418a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ad957610ad9613f04565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b03811681146115b7575f80fd5b8051613cee81613cce565b5f80604083850312156142a8575f80fd5b82516001600160401b03808211156142be575f80fd5b90840190606082870312156142d1575f80fd5b6142d9613de0565b825181526020808401516142ec81614278565b82820152604084015183811115614301575f80fd5b80850194505087601f850112614315575f80fd5b83519250614325613eb884613e38565b8381528882858701011115614338575f80fd5b6143478483830184880161407b565b8060408401525081955061435c81880161428c565b9450505050509250929050565b5f6001600160401b0380831681810361438457614384613f04565b6001019392505050565b81810381811115610ad957610ad9613f04565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ad957610ad9613f04565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f3857613f38613f04565b6001600160401b038181168382160280821691908281146144de576144de613f04565b505092915050565b5f602082840312156144f6575f80fd5b813561129681614278565b5f825161451281846020870161407b565b9190910192915050565b5f6020828403121561452c575f80fd5b813560ff81168114611296575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 4c195e8b4..0b8044750 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -133,7 +133,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Ensure the weight is within the valid range. require( weight >= $._minimumStakeWeight && weight <= $._maximumStakeWeight, - "PoSValidatorManager: invalid stake amount" + "PoSValidatorManager: invalid stake weight" ); return weight; From 42810781088c0a118597885a96d904469409bea7 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 11 Sep 2024 13:23:23 -0400 Subject: [PATCH 242/545] Fixups --- .../staking/interfaces/IValidatorManager.sol | 14 +++++++------- .../tests/ERC20TokenStakingManagerTests.t.sol | 6 +++++- .../tests/NativeTokenStakingManagerTests.t.sol | 2 +- .../staking/tests/PoSValidatorManagerTests.t.sol | 16 ---------------- .../staking/tests/ValidatorManagerTests.t.sol | 5 +++-- 5 files changed, 16 insertions(+), 27 deletions(-) diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index d73d5519b..a6f9c4f1e 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -25,13 +25,6 @@ struct Validator { uint64 endedAt; } -struct ValidatorManagerSettings { - bytes32 pChainBlockchainID; - bytes32 subnetID; - uint64 churnPeriodSeconds; - uint8 maximumChurnPercentage; -} - struct ValidatorChurnPeriod { uint256 startedAt; uint256 initialWeight; @@ -39,6 +32,13 @@ struct ValidatorChurnPeriod { uint64 churnAmount; } +struct ValidatorManagerSettings { + bytes32 pChainBlockchainID; + bytes32 subnetID; + uint64 churnPeriodSeconds; + uint8 maximumChurnPercentage; +} + interface IValidatorManager { /** * @notice Emitted when a new validation period is created by stake being locked in the manager contract. diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index cb97fb3e4..f5c43f843 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -37,7 +37,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { }), minimumStakeWeight: DEFAULT_MINIMUM_STAKE_WEIGHT, maximumStakeWeight: DEFAULT_MAXIMUM_STAKE_WEIGHT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_WEIGHT_DURATION, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, rewardCalculator: IRewardCalculator(address(0)) }), token @@ -84,10 +84,14 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(address(token), abi.encodeCall(IERC20.transfer, (account, amount))); } + // 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 function _valueToWeight(uint256 value) internal virtual override 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 + // to the contract and use vm.expectRevert at the same time function _weightToValue(uint64 weight) internal virtual override returns (uint256) { return uint256(weight) * 1e12; } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index f67b379fa..ad5ebe9e6 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -30,7 +30,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { }), minimumStakeWeight: DEFAULT_MINIMUM_STAKE_WEIGHT, maximumStakeWeight: DEFAULT_MAXIMUM_STAKE_WEIGHT, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_WEIGHT_DURATION, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, rewardCalculator: IRewardCalculator(address(0)) }) ); diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 3f1d83df4..a70ebb605 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -56,22 +56,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce ); - function registerValidators(uint64 n) public returns (bytes32[] memory) { - bytes32[] memory validationIDs = new bytes32[](n); - for (uint64 i = 0; i < n; i++) { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: _newNodeID(), - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); - validationIDs[i] = validationID; - } - return validationIDs; - } - function testInitializeEndValidationWithUptimeProof() public { _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 60634e0ef..edff60be4 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -34,7 +34,7 @@ abstract contract ValidatorManagerTest is Test { uint64 public constant DEFAULT_MINIMUM_STAKE_WEIGHT = 20; uint64 public constant DEFAULT_MAXIMUM_STAKE_WEIGHT = 1e10; uint64 public constant DEFAULT_CHURN_PERIOD = 1 hours; - uint64 public constant DEFAULT_MINIMUM_STAKE_WEIGHT_DURATION = 24 hours; + uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint8 public constant DEFAULT_MAXIMUM_CHURN_PERCENTAGE = 20; uint64 public constant DEFAULT_EXPIRY = 1000; uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; @@ -43,7 +43,7 @@ abstract contract ValidatorManagerTest is Test { ValidatorManager public validatorManager; - // Used to create unique validator IDs in {newNodeID} + // Used to create unique validator IDs in {_newNodeID} uint64 public nodeIDCounter = 0; event ValidationPeriodCreated( @@ -393,6 +393,7 @@ abstract contract ValidatorManagerTest is Test { bytes memory blsPublicKey, uint64 weight ) internal virtual returns (bytes32); + function _initializeEndValidation(bytes32 validationID) internal virtual; function _beforeSend(uint64 weight, address spender) internal virtual; From 06ef0379e2e37ec5ff4e698fc45d442bed65416b Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 11 Sep 2024 13:57:05 -0400 Subject: [PATCH 243/545] Add comment --- contracts/staking/PoSValidatorManager.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index ea9724c95..5d4f9541b 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -301,6 +301,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager }); } + /** + * @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. + */ function resendUpdateDelegation(bytes32 delegationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; From f26ecbe8cb75b19247396aa0c083b48ab5f2f02c Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Wed, 11 Sep 2024 18:39:13 +0000 Subject: [PATCH 244/545] increment validator rewards, not overwrite them addresses review comment https://github.com/ava-labs/teleporter/pull/534#discussion_r1755308871 --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index f3eab1c63..ccb2c92c9 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614b72380380614b7283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614a258061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004614071565b6102d6565b005b6101286101383660046140ac565b6107ff565b61017b61014b3660046140ac565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c3660046140ac565b61095b565b6101286101af3660046140d7565b6109c8565b6101c76101c23660046140ac565b610aac565b6040516001600160401b039091168152602001610185565b6101286101ed366004614114565b610ac2565b61012861020036600461412d565b610b61565b61017b61021336600461416b565b610d52565b6101c76102263660046140ac565b610d6b565b6101286102393660046140ac565b610d7f565b61012861024c366004614071565b610dec565b61017b61025f366004614216565b610ed8565b61012861027236600461412d565b610efd565b61017b6102853660046142b2565b61115b565b610128610298366004614114565b61116e565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d13660046140ac565b61132b565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604080822060018101548251610100810190935281545f80516020614979833981519152949193919290829060ff16600481111561033e5761033e6142d2565b600481111561034f5761034f6142d2565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f85156103d5576103d283866113fa565b90505b60028401546060830151604051636588aa7f60e01b81526001600160401b03918216600482015290831660248201525f604482018190526064820152600160401b9091046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610447573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046b91906142e6565b5f888152600686016020526040902055600282516004811115610490576104906142d2565b146104e25760405162461bcd60e51b815260206004820152602a60248201525f805160206149998339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105475760405162461bcd60e51b815260206004820152603360248201525f805160206149998339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104d9565b5f61055184611696565b60038085526001600160401b0342811660a0870152821660e08601525f8a815290870160205260409020845181549293508592829060ff1916600183600481111561059e5761059e6142d2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106708561170a565b905083606001516001600160401b03168160a001516001600160401b0316116106e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104d9565b5f84606001518260a001516106fc9190614311565b905061070886826117e9565b5f610714878584611831565b5f8c815260058a016020526040902090915061073082826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061075d90859060040161449c565b6020604051808303815f875af1158015610779573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079d91906142e6565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206149b983398151915292919061084790614338565b9050118015610879575060035f83815260078301602052604090205460ff166005811115610877576108776142d2565b145b6108dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104d9565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161091691906004016144ce565b6020604051808303815f875af1158015610932573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095691906142e6565b505050565b61096481611a4e565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614979833981519152916005600160991b019163ee5b48eb91610916916004016144ce565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a11575080546001600160401b03808416911610155b15610a2f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5a8484611b21565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610abc64e8d4a510008361456c565b92915050565b5f610acc82611b3b565b6040808201516001600160a01b0381165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0760205291909120549192505f8051602061497983398151915291610b259190611ec8565b604080830180516001600160a01b03165f908152600784016020529182209190915560608301519051610956916001600160401b031690611f3e565b5f805160206149798339815191525f610b7984611f61565b90505f80610b8a8360400151612142565b5091509150610b988561237d565b5f8581526004850160205260408120610bb091613fb9565b5f610bba8361170a565b9050816001600160401b031681608001516001600160401b03161015610bf25760405162461bcd60e51b81526004016104d99061457f565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610c375760405162461bcd60e51b81526004016104d9906145c1565b60015f87815260038701602052604090205460ff166004811115610c5d57610c5d6142d2565b14610cc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104d9565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610abc6001600160401b03831664e8d4a5100061460a565b5f610d758261170a565b60a0015192915050565b610d888161237d565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614979833981519152916005600160991b019163ee5b48eb91610916916004016144ce565b5f8215610e0057610dfd84836113fa565b90505b5f610e0a85612456565b90505f5f80516020614979833981519152600281015460a0840151604051636588aa7f60e01b81526001600160401b03918216600482015290861660248201525f604482018190526064820152919250600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610e8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb391906142e6565b6040928301516001600160a01b03165f90815260079092016020529190205550505050565b5f80610ee386612819565b9050610ef1858286866128c6565b9150505b949350505050565b5f805160206149798339815191525f610f1584611f61565b90505f80610f268360400151612142565b5091509150610f3485611a4e565b5f8581526005850160205260408120610f4c91613fb9565b5f610f568361170a565b9050816001600160401b031681608001516001600160401b03161015610f8e5760405162461bcd60e51b81526004016104d99061457f565b5f8681526003808701602052604090912001546001600160401b0380841691161115610fcc5760405162461bcd60e51b81526004016104d9906145c1565b60035f87815260038701602052604090205460ff166004811115610ff257610ff26142d2565b146110465760405162461bcd60e51b815260206004820152603160248201525f805160206149998339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104d9565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526110ea9190611f3e565b61110b8160200151876006015f8a81526020019081526020015f2054611ec8565b5f878152600687016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f611167833384612d1b565b9392505050565b5f805160206149b98339815191525f61118683611f61565b90505f8061119783604001516130d6565b91509150806111f95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104d9565b5f8281526005850160205260408120805461121390614338565b9050118015611245575060015f83815260078601602052604090205460ff166005811115611243576112436142d2565b145b6112615760405162461bcd60e51b81526004016104d990614621565b5f828152600585016020526040812061127991613fb9565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149b983398151915292919061137390614338565b90501180156113a5575060015f83815260078301602052604090205460ff1660058111156113a3576113a36142d2565b145b6113c15760405162461bcd60e51b81526004016104d990614621565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161091691906004016144ce565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611445573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261146c9190810190614673565b91509150806114cf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104d9565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611512573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153691906142e6565b82511461159a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104d9565b60208201516001600160a01b0316156116105760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104d9565b5f8061161f8460400151613277565b9150915081871461168c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104d9565b9695505050505050565b5f8181525f805160206149f98339815191526020526040812060030180545f805160206149b9833981519152916001600160401b03909116908190846116db83614745565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611712613ff0565b5f8281525f805160206149f98339815191526020526040908190208151610100810190925280545f805160206149b9833981519152929190829060ff166005811115611760576117606142d2565b6005811115611771576117716142d2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206149f9833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118aa5761186a81600161476a565b61187590600861460a565b5081515f9083908390811061188c5761188c61477d565b60200101906001600160f81b03191690815f1a905350600101611856565b505f5b600481101561190d576118c181600361476a565b6118cc90600861460a565b6001901c60f81b826118df836002614791565b815181106118ef576118ef61477d565b60200101906001600160f81b03191690815f1a9053506001016118ad565b505f5b602081101561196f5761192481601f61476a565b61192f90600861460a565b86901c60f81b82611941836006614791565b815181106119515761195161477d565b60200101906001600160f81b03191690815f1a905350600101611910565b505f5b60088110156119da5761198681600761476a565b61199190600861460a565b6001600160401b038616901c60f81b826119ac836026614791565b815181106119bc576119bc61477d565b60200101906001600160f81b03191690815f1a905350600101611972565b505f5b6008811015611a45576119f181600761476a565b6119fc90600861460a565b6001600160401b038516901c60f81b82611a1783602e614791565b81518110611a2757611a2761477d565b60200101906001600160f81b03191690815f1a9053506001016119dd565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614979833981519152929190611a9690614338565b9050118015611ac8575060035f83815260038301602052604090205460ff166004811115611ac657611ac66142d2565b145b611b1d5760405162461bcd60e51b815260206004820152603360248201525f8051602061499983398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104d9565b5050565b611b2961344f565b611b328261349a565b611b1d816134e0565b611b43613ff0565b5f805160206149b98339815191525f611b5b84611f61565b90505f80611b6c83604001516130d6565b915091508015611bd15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104d9565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c0357611c036142d2565b6005811115611c1457611c146142d2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c9b57611c9b6142d2565b1480611cb95750600182516005811115611cb757611cb76142d2565b145b611d185760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104d9565b600382516005811115611d2d57611d2d6142d2565b03611d5457505f8381526006860160205260408120600491611d4f9190613fb9565b611d58565b5060055b6020808301515f90815260088801909152604081205581816005811115611d8157611d816142d2565b90816005811115611d9457611d946142d2565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611dc857611dc86142d2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e9357611e936142d2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061495983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015611f23575f80fd5b505af1158015611f35573d5f803e3d5ffd5b50505050505050565b5f8051602061495983398151915254611b1d906001600160a01b03168284613581565b60408051606080820183525f8083526020830181905292820152905f805160206149b98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fd6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ffd9190810190614673565b91509150806120645760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104d9565b82548251146120c75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104d9565b60208201516001600160a01b03161561213a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104d9565b509392505050565b5f805f83516036146121665760405162461bcd60e51b81526004016104d9906147a4565b5f805b60028110156121b55761217d81600161476a565b61218890600861460a565b61ffff1686828151811061219e5761219e61477d565b016020015160f81c901b9190911790600101612169565b5061ffff8116156121d85760405162461bcd60e51b81526004016104d9906147ed565b5f805b6004811015612233576121ef81600361476a565b6121fa90600861460a565b63ffffffff168761220c836002614791565b8151811061221c5761221c61477d565b016020015160f81c901b91909117906001016121db565b5063ffffffff811660031461225a5760405162461bcd60e51b81526004016104d990614830565b5f805b60208110156122af5761227181601f61476a565b61227c90600861460a565b88612288836006614791565b815181106122985761229861477d565b016020015160f81c901b919091179060010161225d565b505f805b600881101561230e576122c781600761476a565b6122d290600861460a565b6001600160401b0316896122e7836026614791565b815181106122f7576122f761477d565b016020015160f81c901b91909117906001016122b3565b505f805b600881101561236d5761232681600761476a565b61233190600861460a565b6001600160401b03168a61234683602e614791565b815181106123565761235661477d565b016020015160f81c901b9190911790600101612312565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206149798339815191529291906123c590614338565b90501180156123f7575060015f83815260038301602052604090205460ff1660048111156123f5576123f56142d2565b145b611b1d5760405162461bcd60e51b815260206004820152603860248201525f8051602061499983398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104d9565b61245e613ff0565b5f8281525f805160206149f983398151915260205260408082208151610100810190925280545f805160206149b983398151915293929190829060ff1660058111156124ac576124ac6142d2565b60058111156124bd576124bd6142d2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612545576125456142d2565b146125a15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104d9565b60408101516001600160a01b0316336001600160a01b03161461261b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104d9565b6126288160a001516135e0565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561266c5761266c6142d2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127388561273281611696565b5f611831565b5f868152600685016020526040902090915061275482826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061278190859060040161449c565b6020604051808303815f875af115801561279d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127c191906142e6565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f5f805160206149798339815191528161283284613781565b90505f61283e82610aac565b83549091506001600160401b0382161080159061286857508260010154816001600160401b031611155b610ef55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104d9565b5f6128cf6137a4565b5f805160206149b9833981519152426001600160401b03851611801561290957506001600160401b038416612907426202a300614791565b115b61296b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104d9565b856129c25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104d9565b5f86815260088201602052604090205415612a305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104d9565b8251603014612a975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104d9565b612aa0856135e0565b5f80612ae76040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506137db565b5f82815260058601602052604090209193509150612b0582826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b3290859060040161449c565b6020604051808303815f875af1158015612b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7291906142e6565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612bf457612bf46142d2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612cb583611696565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610ef560015f805160206149d983398151915255565b5f612d246137a4565b5f612d316101c284613781565b90505f805160206149798339815191525f612d4b8761170a565b9050600281516005811115612d6257612d626142d2565b14612dc15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104d9565b5f838260a00151612dd29190614877565b9050612dde88826117e9565b5f612de889611696565b90505f898983604051602001612e309392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612e51866135e0565b5f612e5d8b8486611831565b5f8381526004880160205260409020909150612e7982826143bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ea690859060040161449c565b6020604051808303815f875af1158015612ec2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ee691906142e6565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612f9557612f956142d2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061116760015f805160206149d983398151915255565b5f8082516027146130f95760405162461bcd60e51b81526004016104d9906147a4565b5f805b60028110156131485761311081600161476a565b61311b90600861460a565b61ffff168582815181106131315761313161477d565b016020015160f81c901b91909117906001016130fc565b5061ffff81161561316b5760405162461bcd60e51b81526004016104d9906147ed565b5f805b60048110156131c65761318281600361476a565b61318d90600861460a565b63ffffffff168661319f836002614791565b815181106131af576131af61477d565b016020015160f81c901b919091179060010161316e565b5063ffffffff81166002146131ed5760405162461bcd60e51b81526004016104d990614830565b5f805b60208110156132425761320481601f61476a565b61320f90600861460a565b8761321b836006614791565b8151811061322b5761322b61477d565b016020015160f81c901b91909117906001016131f0565b505f866026815181106132575761325761477d565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461329a5760405162461bcd60e51b81526004016104d9906147a4565b5f805b60028110156132e9576132b181600161476a565b6132bc90600861460a565b61ffff168582815181106132d2576132d261477d565b016020015160f81c901b919091179060010161329d565b5061ffff81161561330c5760405162461bcd60e51b81526004016104d9906147ed565b5f805b60048110156133675761332381600361476a565b61332e90600861460a565b63ffffffff1686613340836002614791565b815181106133505761335061477d565b016020015160f81c901b919091179060010161330f565b5063ffffffff811660041461338e5760405162461bcd60e51b81526004016104d990614830565b5f805b60208110156133e3576133a581601f61476a565b6133b090600861460a565b876133bc836006614791565b815181106133cc576133cc61477d565b016020015160f81c901b9190911790600101613391565b505f805b6008811015613442576133fb81600761476a565b61340690600861460a565b6001600160401b03168861341b836026614791565b8151811061342b5761342b61477d565b016020015160f81c901b91909117906001016133e7565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661349857604051631afcd79f60e31b815260040160405180910390fd5b565b6134a261344f565b6134ab81613b93565b6134dd606082013560808301356134c860c0850160a0860161416b565b6134d860e0860160c08701614897565b613bb4565b50565b6134e861344f565b5f805160206149598339815191526001600160a01b0382166135615760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104d9565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261095691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613c0f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149b98339815191529060ff165f0361361e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613666908361476a565b10613682576001600160401b03841660408301528082526136a1565b83826040018181516136949190614877565b6001600160401b03169052505b5f8260200151836040015160646136b891906148b2565b6136c291906148dd565b600285015490915060ff908116908216111561373d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104d9565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610abc825f80516020614959833981519152546001600160a01b031690613c70565b5f805160206149d98339815191528054600119016137d557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146138455760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104d9565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156138bc5761387c81600161476a565b61388790600861460a565b5081515f9083908390811061389e5761389e61477d565b60200101906001600160f81b03191690815f1a905350600101613868565b505f5b600481101561391a576138d381600361476a565b6138de90600861460a565b505f826138ec836002614791565b815181106138fc576138fc61477d565b60200101906001600160f81b03191690815f1a9053506001016138bf565b505f5b602081101561397757845181602081106139395761393961477d565b1a60f81b82613949836006614791565b815181106139595761395961477d565b60200101906001600160f81b03191690815f1a90535060010161391d565b505f5b60208110156139d757846020015181602081106139995761399961477d565b1a60f81b826139a9836026614791565b815181106139b9576139b961477d565b60200101906001600160f81b03191690815f1a90535060010161397a565b505f5b6008811015613a4b576139ee81600761476a565b6139f990600861460a565b60ff1685604001516001600160401b0316901c60f81b82826046613a1d9190614791565b81518110613a2d57613a2d61477d565b60200101906001600160f81b03191690815f1a9053506001016139da565b505f5b6030811015613ab65784608001518181518110613a6d57613a6d61477d565b01602001516001600160f81b03191682613a8883604e614791565b81518110613a9857613a9861477d565b60200101906001600160f81b03191690815f1a905350600101613a4e565b505f5b6008811015613b2857613acd81600761476a565b613ad890600861460a565b60608601516001600160401b0390811691161c60f81b82613afa83607e614791565b81518110613b0a57613b0a61477d565b60200101906001600160f81b03191690815f1a905350600101613ab9565b50600281604051613b399190614902565b602060405180830381855afa158015613b54573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613b7791906142e6565b94909350915050565b60015f805160206149d983398151915255565b613b9b61344f565b613ba3613dd2565b613bab613de2565b6134dd81613dea565b613bbc61344f565b5f5f80516020614979833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f613c236001600160a01b03841683613e56565b905080515f14158015613c47575080806020019051810190613c45919061491d565b155b1561095657604051635274afe760e01b81526001600160a01b03841660048201526024016104d9565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613cb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cda91906142e6565b9050613cf16001600160a01b038516333086613e63565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613d35573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d5991906142e6565b9050818111613dbf5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104d9565b613dc9828261476a565b95945050505050565b613dda61344f565b613498613ea2565b61349861344f565b613df261344f565b80355f805160206149b983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e3c6060830160408401614938565b600291909101805460ff191660ff90921691909117905550565b606061116783835f613eaa565b6040516001600160a01b038481166024830152838116604483015260648201839052613e9c9186918216906323b872dd906084016135ae565b50505050565b613b8061344f565b606081471015613ecf5760405163cd78605960e01b81523060048201526024016104d9565b5f80856001600160a01b03168486604051613eea9190614902565b5f6040518083038185875af1925050503d805f8114613f24576040519150601f19603f3d011682016040523d82523d5f602084013e613f29565b606091505b509150915061168c868383606082613f4957613f4482613f90565b611167565b8151158015613f6057506001600160a01b0384163b155b15613f8957604051639996b31560e01b81526001600160a01b03851660048201526024016104d9565b5080611167565b805115613fa05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613fc590614338565b5f825580601f10613fd4575050565b601f0160209004905f5260205f20908101906134dd9190614034565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614048575f8155600101614035565b5090565b80151581146134dd575f80fd5b803563ffffffff8116811461406c575f80fd5b919050565b5f805f60608486031215614083575f80fd5b8335925060208401356140958161404c565b91506140a360408501614059565b90509250925092565b5f602082840312156140bc575f80fd5b5035919050565b6001600160a01b03811681146134dd575f80fd5b5f808284036101008112156140ea575f80fd5b60e08112156140f7575f80fd5b5082915060e0830135614109816140c3565b809150509250929050565b5f60208284031215614124575f80fd5b61116782614059565b5f806040838503121561413e575f80fd5b61414783614059565b946020939093013593505050565b80356001600160401b038116811461406c575f80fd5b5f6020828403121561417b575f80fd5b61116782614155565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156141ba576141ba614184565b60405290565b604051601f8201601f191681016001600160401b03811182821017156141e8576141e8614184565b604052919050565b5f6001600160401b0382111561420857614208614184565b50601f01601f191660200190565b5f805f8060808587031215614229575f80fd5b843593506020850135925061424060408601614155565b915060608501356001600160401b0381111561425a575f80fd5b8501601f8101871361426a575f80fd5b803561427d614278826141f0565b6141c0565b818152886020838501011115614291575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156142c3575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b5f602082840312156142f6575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614331576143316142fd565b5092915050565b600181811c9082168061434c57607f821691505b60208210810361436a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561095657805f5260205f20601f840160051c810160208510156143955750805b601f840160051c820191505b818110156143b4575f81556001016143a1565b5050505050565b81516001600160401b038111156143d4576143d4614184565b6143e8816143e28454614338565b84614370565b602080601f83116001811461441b575f84156144045750858301515b5f19600386901b1c1916600185901b178555614472565b5f85815260208120601f198616915b828110156144495788860151825594840194600190910190840161442a565b508582101561446657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561449457818101518382015260200161447c565b50505f910152565b602081525f82518060208401526144ba81604085016020870161447a565b601f01601f19169190910160400192915050565b5f60208083525f84546144e081614338565b806020870152604060018084165f8114614501576001811461451d5761454a565b60ff19851660408a0152604084151560051b8a0101955061454a565b895f5260205f205f5b858110156145415781548b8201860152908301908801614526565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261457a5761457a614558565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610abc57610abc6142fd565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b805161406c8161404c565b5f8060408385031215614684575f80fd5b82516001600160401b038082111561469a575f80fd5b90840190606082870312156146ad575f80fd5b6146b5614198565b825181526020808401516146c8816140c3565b828201526040840151838111156146dd575f80fd5b80850194505087601f8501126146f1575f80fd5b83519250614701614278846141f0565b8381528882858701011115614714575f80fd5b6147238483830184880161447a565b80604084015250819550614738818801614668565b9450505050509250929050565b5f6001600160401b03808316818103614760576147606142fd565b6001019392505050565b81810381811115610abc57610abc6142fd565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610abc57610abc6142fd565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115614331576143316142fd565b5f602082840312156148a7575f80fd5b8135611167816140c3565b6001600160401b038181168382160280821691908281146148d5576148d56142fd565b505092915050565b5f6001600160401b03808416806148f6576148f6614558565b92169190910492915050565b5f825161491381846020870161447a565b9190910192915050565b5f6020828403121561492d575f80fd5b81516111678161404c565b5f60208284031215614948575f80fd5b813560ff81168114611167575f80fdfe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614b87380380614b8783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614a3a8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004614086565b6102d6565b005b6101286101383660046140c1565b6107ff565b61017b61014b3660046140c1565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c3660046140c1565b61095b565b6101286101af3660046140ec565b6109c8565b6101c76101c23660046140c1565b610aac565b6040516001600160401b039091168152602001610185565b6101286101ed366004614129565b610ac2565b610128610200366004614142565b610b61565b61017b610213366004614180565b610d52565b6101c76102263660046140c1565b610d6b565b6101286102393660046140c1565b610d7f565b61012861024c366004614086565b610dec565b61017b61025f36600461422b565b610eed565b610128610272366004614142565b610f12565b61017b6102853660046142c7565b611170565b610128610298366004614129565b611183565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d13660046140c1565b611340565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604080822060018101548251610100810190935281545f8051602061498e833981519152949193919290829060ff16600481111561033e5761033e6142e7565b600481111561034f5761034f6142e7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f85156103d5576103d2838661140f565b90505b60028401546060830151604051636588aa7f60e01b81526001600160401b03918216600482015290831660248201525f604482018190526064820152600160401b9091046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610447573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046b91906142fb565b5f888152600686016020526040902055600282516004811115610490576104906142e7565b146104e25760405162461bcd60e51b815260206004820152602a60248201525f805160206149ae8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105475760405162461bcd60e51b815260206004820152603360248201525f805160206149ae8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104d9565b5f610551846116ab565b60038085526001600160401b0342811660a0870152821660e08601525f8a815290870160205260409020845181549293508592829060ff1916600183600481111561059e5761059e6142e7565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106708561171f565b905083606001516001600160401b03168160a001516001600160401b0316116106e75760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104d9565b5f84606001518260a001516106fc9190614326565b905061070886826117fe565b5f610714878584611846565b5f8c815260058a016020526040902090915061073082826143d0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061075d9085906004016144b1565b6020604051808303815f875af1158015610779573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061079d91906142fb565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206149ce8339815191529291906108479061434d565b9050118015610879575060035f83815260078301602052604090205460ff166005811115610877576108776142e7565b145b6108dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104d9565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161091691906004016144e3565b6020604051808303815f875af1158015610932573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095691906142fb565b505050565b61096481611a63565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061498e833981519152916005600160991b019163ee5b48eb91610916916004016144e3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a11575080546001600160401b03808416911610155b15610a2f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5a8484611b36565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610abc64e8d4a5100083614581565b92915050565b5f610acc82611b50565b6040808201516001600160a01b0381165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0760205291909120549192505f8051602061498e83398151915291610b259190611edd565b604080830180516001600160a01b03165f908152600784016020529182209190915560608301519051610956916001600160401b031690611f53565b5f8051602061498e8339815191525f610b7984611f76565b90505f80610b8a8360400151612157565b5091509150610b9885612392565b5f8581526004850160205260408120610bb091613fce565b5f610bba8361171f565b9050816001600160401b031681608001516001600160401b03161015610bf25760405162461bcd60e51b81526004016104d990614594565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610c375760405162461bcd60e51b81526004016104d9906145d6565b60015f87815260038701602052604090205460ff166004811115610c5d57610c5d6142e7565b14610cc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104d9565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610abc6001600160401b03831664e8d4a5100061461f565b5f610d758261171f565b60a0015192915050565b610d8881612392565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061498e833981519152916005600160991b019163ee5b48eb91610916916004016144e3565b5f8215610e0057610dfd848361140f565b90505b5f610e0a8561246b565b90505f5f8051602061498e833981519152600281015460a0840151604051636588aa7f60e01b81526001600160401b03918216600482015290861660248201525f604482018190526064820152919250600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610e8f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb391906142fb565b6040808401516001600160a01b03165f908152600784016020529081208054909190610ee0908490614636565b9091555050505050505050565b5f80610ef88661282e565b9050610f06858286866128db565b9150505b949350505050565b5f8051602061498e8339815191525f610f2a84611f76565b90505f80610f3b8360400151612157565b5091509150610f4985611a63565b5f8581526005850160205260408120610f6191613fce565b5f610f6b8361171f565b9050816001600160401b031681608001516001600160401b03161015610fa35760405162461bcd60e51b81526004016104d990614594565b5f8681526003808701602052604090912001546001600160401b0380841691161115610fe15760405162461bcd60e51b81526004016104d9906145d6565b60035f87815260038701602052604090205460ff166004811115611007576110076142e7565b1461105b5760405162461bcd60e51b815260206004820152603160248201525f805160206149ae8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104d9565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526110ff9190611f53565b6111208160200151876006015f8a81526020019081526020015f2054611edd565b5f878152600687016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f61117c833384612d30565b9392505050565b5f805160206149ce8339815191525f61119b83611f76565b90505f806111ac83604001516130eb565b915091508061120e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104d9565b5f828152600585016020526040812080546112289061434d565b905011801561125a575060015f83815260078601602052604090205460ff166005811115611258576112586142e7565b145b6112765760405162461bcd60e51b81526004016104d990614649565b5f828152600585016020526040812061128e91613fce565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149ce8339815191529291906113889061434d565b90501180156113ba575060015f83815260078301602052604090205460ff1660058111156113b8576113b86142e7565b145b6113d65760405162461bcd60e51b81526004016104d990614649565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161091691906004016144e3565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561145a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611481919081019061469b565b91509150806114e45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104d9565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611527573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154b91906142fb565b8251146115af5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104d9565b60208201516001600160a01b0316156116255760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104d9565b5f80611634846040015161328c565b915091508187146116a15760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104d9565b9695505050505050565b5f8181525f80516020614a0e8339815191526020526040812060030180545f805160206149ce833981519152916001600160401b03909116908190846116f08361476d565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611727614005565b5f8281525f80516020614a0e8339815191526020526040908190208151610100810190925280545f805160206149ce833981519152929190829060ff166005811115611775576117756142e7565b6005811115611786576117866142e7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614a0e833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118bf5761187f816001614792565b61188a90600861461f565b5081515f908390839081106118a1576118a16147a5565b60200101906001600160f81b03191690815f1a90535060010161186b565b505f5b6004811015611922576118d6816003614792565b6118e190600861461f565b6001901c60f81b826118f4836002614636565b81518110611904576119046147a5565b60200101906001600160f81b03191690815f1a9053506001016118c2565b505f5b60208110156119845761193981601f614792565b61194490600861461f565b86901c60f81b82611956836006614636565b81518110611966576119666147a5565b60200101906001600160f81b03191690815f1a905350600101611925565b505f5b60088110156119ef5761199b816007614792565b6119a690600861461f565b6001600160401b038616901c60f81b826119c1836026614636565b815181106119d1576119d16147a5565b60200101906001600160f81b03191690815f1a905350600101611987565b505f5b6008811015611a5a57611a06816007614792565b611a1190600861461f565b6001600160401b038516901c60f81b82611a2c83602e614636565b81518110611a3c57611a3c6147a5565b60200101906001600160f81b03191690815f1a9053506001016119f2565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061498e833981519152929190611aab9061434d565b9050118015611add575060035f83815260038301602052604090205460ff166004811115611adb57611adb6142e7565b145b611b325760405162461bcd60e51b815260206004820152603360248201525f805160206149ae83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104d9565b5050565b611b3e613464565b611b47826134af565b611b32816134f5565b611b58614005565b5f805160206149ce8339815191525f611b7084611f76565b90505f80611b8183604001516130eb565b915091508015611be65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104d9565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c1857611c186142e7565b6005811115611c2957611c296142e7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611cb057611cb06142e7565b1480611cce5750600182516005811115611ccc57611ccc6142e7565b145b611d2d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104d9565b600382516005811115611d4257611d426142e7565b03611d6957505f8381526006860160205260408120600491611d649190613fce565b611d6d565b5060055b6020808301515f90815260088801909152604081205581816005811115611d9657611d966142e7565b90816005811115611da957611da96142e7565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611ddd57611ddd6142e7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ea857611ea86142e7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061496e83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015611f38575f80fd5b505af1158015611f4a573d5f803e3d5ffd5b50505050505050565b5f8051602061496e83398151915254611b32906001600160a01b03168284613596565b60408051606080820183525f8083526020830181905292820152905f805160206149ce8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611feb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612012919081019061469b565b91509150806120795760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104d9565b82548251146120dc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104d9565b60208201516001600160a01b03161561214f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104d9565b509392505050565b5f805f835160361461217b5760405162461bcd60e51b81526004016104d9906147b9565b5f805b60028110156121ca57612192816001614792565b61219d90600861461f565b61ffff168682815181106121b3576121b36147a5565b016020015160f81c901b919091179060010161217e565b5061ffff8116156121ed5760405162461bcd60e51b81526004016104d990614802565b5f805b600481101561224857612204816003614792565b61220f90600861461f565b63ffffffff1687612221836002614636565b81518110612231576122316147a5565b016020015160f81c901b91909117906001016121f0565b5063ffffffff811660031461226f5760405162461bcd60e51b81526004016104d990614845565b5f805b60208110156122c45761228681601f614792565b61229190600861461f565b8861229d836006614636565b815181106122ad576122ad6147a5565b016020015160f81c901b9190911790600101612272565b505f805b6008811015612323576122dc816007614792565b6122e790600861461f565b6001600160401b0316896122fc836026614636565b8151811061230c5761230c6147a5565b016020015160f81c901b91909117906001016122c8565b505f805b60088110156123825761233b816007614792565b61234690600861461f565b6001600160401b03168a61235b83602e614636565b8151811061236b5761236b6147a5565b016020015160f81c901b9190911790600101612327565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061498e8339815191529291906123da9061434d565b905011801561240c575060015f83815260038301602052604090205460ff16600481111561240a5761240a6142e7565b145b611b325760405162461bcd60e51b815260206004820152603860248201525f805160206149ae83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104d9565b612473614005565b5f8281525f80516020614a0e83398151915260205260408082208151610100810190925280545f805160206149ce83398151915293929190829060ff1660058111156124c1576124c16142e7565b60058111156124d2576124d26142e7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561255a5761255a6142e7565b146125b65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104d9565b60408101516001600160a01b0316336001600160a01b0316146126305760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104d9565b61263d8160a001516135f5565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612681576126816142e7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61274d85612747816116ab565b5f611846565b5f868152600685016020526040902090915061276982826143d0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127969085906004016144b1565b6020604051808303815f875af11580156127b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127d691906142fb565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f5f8051602061498e8339815191528161284784613796565b90505f61285382610aac565b83549091506001600160401b0382161080159061287d57508260010154816001600160401b031611155b610f0a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104d9565b5f6128e46137b9565b5f805160206149ce833981519152426001600160401b03851611801561291e57506001600160401b03841661291c426202a300614636565b115b6129805760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104d9565b856129d75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104d9565b5f86815260088201602052604090205415612a455760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104d9565b8251603014612aac5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104d9565b612ab5856135f5565b5f80612afc6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b03168152602001878152506137f0565b5f82815260058601602052604090209193509150612b1a82826143d0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b479085906004016144b1565b6020604051808303815f875af1158015612b63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b8791906142fb565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612c0957612c096142e7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612cca836116ab565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610f0a60015f805160206149ee83398151915255565b5f612d396137b9565b5f612d466101c284613796565b90505f8051602061498e8339815191525f612d608761171f565b9050600281516005811115612d7757612d776142e7565b14612dd65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104d9565b5f838260a00151612de7919061488c565b9050612df388826117fe565b5f612dfd896116ab565b90505f898983604051602001612e459392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612e66866135f5565b5f612e728b8486611846565b5f8381526004880160205260409020909150612e8e82826143d0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ebb9085906004016144b1565b6020604051808303815f875af1158015612ed7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612efb91906142fb565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612faa57612faa6142e7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061117c60015f805160206149ee83398151915255565b5f80825160271461310e5760405162461bcd60e51b81526004016104d9906147b9565b5f805b600281101561315d57613125816001614792565b61313090600861461f565b61ffff16858281518110613146576131466147a5565b016020015160f81c901b9190911790600101613111565b5061ffff8116156131805760405162461bcd60e51b81526004016104d990614802565b5f805b60048110156131db57613197816003614792565b6131a290600861461f565b63ffffffff16866131b4836002614636565b815181106131c4576131c46147a5565b016020015160f81c901b9190911790600101613183565b5063ffffffff81166002146132025760405162461bcd60e51b81526004016104d990614845565b5f805b60208110156132575761321981601f614792565b61322490600861461f565b87613230836006614636565b81518110613240576132406147a5565b016020015160f81c901b9190911790600101613205565b505f8660268151811061326c5761326c6147a5565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132af5760405162461bcd60e51b81526004016104d9906147b9565b5f805b60028110156132fe576132c6816001614792565b6132d190600861461f565b61ffff168582815181106132e7576132e76147a5565b016020015160f81c901b91909117906001016132b2565b5061ffff8116156133215760405162461bcd60e51b81526004016104d990614802565b5f805b600481101561337c57613338816003614792565b61334390600861461f565b63ffffffff1686613355836002614636565b81518110613365576133656147a5565b016020015160f81c901b9190911790600101613324565b5063ffffffff81166004146133a35760405162461bcd60e51b81526004016104d990614845565b5f805b60208110156133f8576133ba81601f614792565b6133c590600861461f565b876133d1836006614636565b815181106133e1576133e16147a5565b016020015160f81c901b91909117906001016133a6565b505f805b600881101561345757613410816007614792565b61341b90600861461f565b6001600160401b031688613430836026614636565b81518110613440576134406147a5565b016020015160f81c901b91909117906001016133fc565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166134ad57604051631afcd79f60e31b815260040160405180910390fd5b565b6134b7613464565b6134c081613ba8565b6134f2606082013560808301356134dd60c0850160a08601614180565b6134ed60e0860160c087016148ac565b613bc9565b50565b6134fd613464565b5f8051602061496e8339815191526001600160a01b0382166135765760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104d9565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261095691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613c24565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149ce8339815191529060ff165f03613633575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061367b9083614792565b10613697576001600160401b03841660408301528082526136b6565b83826040018181516136a9919061488c565b6001600160401b03169052505b5f8260200151836040015160646136cd91906148c7565b6136d791906148f2565b600285015490915060ff90811690821611156137525760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104d9565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610abc825f8051602061496e833981519152546001600160a01b031690613c85565b5f805160206149ee8339815191528054600119016137ea57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f606082608001515160301461385a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104d9565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156138d157613891816001614792565b61389c90600861461f565b5081515f908390839081106138b3576138b36147a5565b60200101906001600160f81b03191690815f1a90535060010161387d565b505f5b600481101561392f576138e8816003614792565b6138f390600861461f565b505f82613901836002614636565b81518110613911576139116147a5565b60200101906001600160f81b03191690815f1a9053506001016138d4565b505f5b602081101561398c578451816020811061394e5761394e6147a5565b1a60f81b8261395e836006614636565b8151811061396e5761396e6147a5565b60200101906001600160f81b03191690815f1a905350600101613932565b505f5b60208110156139ec57846020015181602081106139ae576139ae6147a5565b1a60f81b826139be836026614636565b815181106139ce576139ce6147a5565b60200101906001600160f81b03191690815f1a90535060010161398f565b505f5b6008811015613a6057613a03816007614792565b613a0e90600861461f565b60ff1685604001516001600160401b0316901c60f81b82826046613a329190614636565b81518110613a4257613a426147a5565b60200101906001600160f81b03191690815f1a9053506001016139ef565b505f5b6030811015613acb5784608001518181518110613a8257613a826147a5565b01602001516001600160f81b03191682613a9d83604e614636565b81518110613aad57613aad6147a5565b60200101906001600160f81b03191690815f1a905350600101613a63565b505f5b6008811015613b3d57613ae2816007614792565b613aed90600861461f565b60608601516001600160401b0390811691161c60f81b82613b0f83607e614636565b81518110613b1f57613b1f6147a5565b60200101906001600160f81b03191690815f1a905350600101613ace565b50600281604051613b4e9190614917565b602060405180830381855afa158015613b69573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613b8c91906142fb565b94909350915050565b60015f805160206149ee83398151915255565b613bb0613464565b613bb8613de7565b613bc0613df7565b6134f281613dff565b613bd1613464565b5f5f8051602061498e833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f613c386001600160a01b03841683613e6b565b905080515f14158015613c5c575080806020019051810190613c5a9190614932565b155b1561095657604051635274afe760e01b81526001600160a01b03841660048201526024016104d9565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613ccb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cef91906142fb565b9050613d066001600160a01b038516333086613e78565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613d4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d6e91906142fb565b9050818111613dd45760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104d9565b613dde8282614792565b95945050505050565b613def613464565b6134ad613eb7565b6134ad613464565b613e07613464565b80355f805160206149ce83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e51606083016040840161494d565b600291909101805460ff191660ff90921691909117905550565b606061117c83835f613ebf565b6040516001600160a01b038481166024830152838116604483015260648201839052613eb19186918216906323b872dd906084016135c3565b50505050565b613b95613464565b606081471015613ee45760405163cd78605960e01b81523060048201526024016104d9565b5f80856001600160a01b03168486604051613eff9190614917565b5f6040518083038185875af1925050503d805f8114613f39576040519150601f19603f3d011682016040523d82523d5f602084013e613f3e565b606091505b50915091506116a1868383606082613f5e57613f5982613fa5565b61117c565b8151158015613f7557506001600160a01b0384163b155b15613f9e57604051639996b31560e01b81526001600160a01b03851660048201526024016104d9565b508061117c565b805115613fb55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613fda9061434d565b5f825580601f10613fe9575050565b601f0160209004905f5260205f20908101906134f29190614049565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561405d575f815560010161404a565b5090565b80151581146134f2575f80fd5b803563ffffffff81168114614081575f80fd5b919050565b5f805f60608486031215614098575f80fd5b8335925060208401356140aa81614061565b91506140b86040850161406e565b90509250925092565b5f602082840312156140d1575f80fd5b5035919050565b6001600160a01b03811681146134f2575f80fd5b5f808284036101008112156140ff575f80fd5b60e081121561410c575f80fd5b5082915060e083013561411e816140d8565b809150509250929050565b5f60208284031215614139575f80fd5b61117c8261406e565b5f8060408385031215614153575f80fd5b61415c8361406e565b946020939093013593505050565b80356001600160401b0381168114614081575f80fd5b5f60208284031215614190575f80fd5b61117c8261416a565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156141cf576141cf614199565b60405290565b604051601f8201601f191681016001600160401b03811182821017156141fd576141fd614199565b604052919050565b5f6001600160401b0382111561421d5761421d614199565b50601f01601f191660200190565b5f805f806080858703121561423e575f80fd5b84359350602085013592506142556040860161416a565b915060608501356001600160401b0381111561426f575f80fd5b8501601f8101871361427f575f80fd5b803561429261428d82614205565b6141d5565b8181528860208385010111156142a6575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f80604083850312156142d8575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b5f6020828403121561430b575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561434657614346614312565b5092915050565b600181811c9082168061436157607f821691505b60208210810361437f57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561095657805f5260205f20601f840160051c810160208510156143aa5750805b601f840160051c820191505b818110156143c9575f81556001016143b6565b5050505050565b81516001600160401b038111156143e9576143e9614199565b6143fd816143f7845461434d565b84614385565b602080601f831160018114614430575f84156144195750858301515b5f19600386901b1c1916600185901b178555614487565b5f85815260208120601f198616915b8281101561445e5788860151825594840194600190910190840161443f565b508582101561447b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156144a9578181015183820152602001614491565b50505f910152565b602081525f82518060208401526144cf81604085016020870161448f565b601f01601f19169190910160400192915050565b5f60208083525f84546144f58161434d565b806020870152604060018084165f811461451657600181146145325761455f565b60ff19851660408a0152604084151560051b8a0101955061455f565b895f5260205f205f5b858110156145565781548b820186015290830190880161453b565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261458f5761458f61456d565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610abc57610abc614312565b80820180821115610abc57610abc614312565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b805161408181614061565b5f80604083850312156146ac575f80fd5b82516001600160401b03808211156146c2575f80fd5b90840190606082870312156146d5575f80fd5b6146dd6141ad565b825181526020808401516146f0816140d8565b82820152604084015183811115614705575f80fd5b80850194505087601f850112614719575f80fd5b8351925061472961428d84614205565b838152888285870101111561473c575f80fd5b61474b8483830184880161448f565b80604084015250819550614760818801614690565b9450505050509250929050565b5f6001600160401b0380831681810361478857614788614312565b6001019392505050565b81810381811115610abc57610abc614312565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561434657614346614312565b5f602082840312156148bc575f80fd5b813561117c816140d8565b6001600160401b038181168382160280821691908281146148ea576148ea614312565b505092915050565b5f6001600160401b038084168061490b5761490b61456d565b92169190910492915050565b5f825161492881846020870161448f565b9190910192915050565b5f60208284031215614942575f80fd5b815161117c81614061565b5f6020828403121561495d575f80fd5b813560ff8116811461117c575f80fdfe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index aa09a95c3..caebaf901 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -48,7 +48,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161470438038061470483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145b78061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613c70565b610389565b005b348015610134575f80fd5b50610127610143366004613cab565b61046b565b348015610153575f80fd5b50610127610162366004613ce6565b610994565b348015610172575f80fd5b506101b1610181366004613ce6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613ce6565b610af0565b3480156101ee575f80fd5b506102026101fd366004613ce6565b610b5d565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613cfd565b610b73565b348015610244575f80fd5b50610127610253366004613d16565b610bf1565b348015610263575f80fd5b506101b1610272366004613d54565b610de2565b348015610282575f80fd5b50610202610291366004613ce6565b610dfb565b3480156102a1575f80fd5b506101276102b0366004613ce6565b610e0f565b3480156102c0575f80fd5b506101276102cf366004613cab565b610e7c565b3480156102df575f80fd5b506101276102ee366004613d16565b610f68565b3480156102fe575f80fd5b5061012761030d366004613cfd565b6111a5565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613ce6565b611362565b6101b1610371366004613ce6565b611431565b6101b1610384366004613dff565b61143d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611461565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604080822060018101548251610100810190935281545f8051602061450b833981519152949193919290829060ff1660048111156104d3576104d3613e91565b60048111156104e4576104e4613e91565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f851561056a576105678386611475565b90505b60028401546060830151604051636588aa7f60e01b81526001600160401b03918216600482015290831660248201525f604482018190526064820152600160401b9091046001600160a01b031690636588aa7f90608401602060405180830381865afa1580156105dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106009190613ea5565b5f88815260068601602052604090205560028251600481111561062557610625613e91565b146106775760405162461bcd60e51b815260206004820152602a60248201525f8051602061452b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106dc5760405162461bcd60e51b815260206004820152603360248201525f8051602061452b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161066e565b5f6106e684611711565b60038085526001600160401b0342811660a0870152821660e08601525f8a815290870160205260409020845181549293508592829060ff1916600183600481111561073357610733613e91565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61080585611785565b905083606001516001600160401b03168160a001516001600160401b03161161087c5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161066e565b5f84606001518260a001516108919190613ed0565b905061089d8682611864565b5f6108a98785846118ac565b5f8c815260058a01602052604090209091506108c58282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906108f2908590600401614055565b6020604051808303815f875af115801561090e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109329190613ea5565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061454b8339815191529291906109dc90613ef7565b9050118015610a0e575060035f83815260078301602052604090205460ff166005811115610a0c57610a0c613e91565b145b610a725760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161066e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aab9190600401614087565b6020604051808303815f875af1158015610ac7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aeb9190613ea5565b505050565b610af981611ac9565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061450b833981519152916005600160991b019163ee5b48eb91610aab91600401614087565b5f610b6d64e8d4a5100083614125565b92915050565b5f610b7d82611b9c565b604080820180516001600160a01b039081165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020528251909116815291822091909155606082015190519192505f8051602061450b83398151915291610aeb916001600160401b031690611f29565b5f8051602061450b8339815191525f610c0984611f3c565b90505f80610c1a836040015161211d565b5091509150610c2885612358565b5f8581526004850160205260408120610c4091613bdd565b5f610c4a83611785565b9050816001600160401b031681608001516001600160401b03161015610c825760405162461bcd60e51b815260040161066e90614138565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610cc75760405162461bcd60e51b815260040161066e9061417a565b60015f87815260038701602052604090205460ff166004811115610ced57610ced613e91565b14610d565760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161066e565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610b6d6001600160401b03831664e8d4a510006141c3565b5f610e0582611785565b60a0015192915050565b610e1881612358565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061450b833981519152916005600160991b019163ee5b48eb91610aab91600401614087565b5f8215610e9057610e8d8483611475565b90505b5f610e9a85612431565b90505f5f8051602061450b833981519152600281015460a0840151604051636588aa7f60e01b81526001600160401b03918216600482015290861660248201525f604482018190526064820152919250600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610f1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f439190613ea5565b6040928301516001600160a01b03165f90815260079092016020529190205550505050565b5f8051602061450b8339815191525f610f8084611f3c565b90505f80610f91836040015161211d565b5091509150610f9f85611ac9565b5f8581526005850160205260408120610fb791613bdd565b5f610fc183611785565b9050816001600160401b031681608001516001600160401b03161015610ff95760405162461bcd60e51b815260040161066e90614138565b5f8681526003808701602052604090912001546001600160401b03808416911611156110375760405162461bcd60e51b815260040161066e9061417a565b60035f87815260038701602052604090205460ff16600481111561105d5761105d613e91565b146110b15760405162461bcd60e51b815260206004820152603160248201525f8051602061452b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161066e565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e08401526111559190611f29565b5f878152600687016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f8051602061454b8339815191525f6111bd83611f3c565b90505f806111ce83604001516127f4565b91509150806112305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161066e565b5f8281526005850160205260408120805461124a90613ef7565b905011801561127c575060015f83815260078601602052604090205460ff16600581111561127a5761127a613e91565b145b6112985760405162461bcd60e51b815260040161066e906141da565b5f82815260058501602052604081206112b091613bdd565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061454b8339815191529291906113aa90613ef7565b90501180156113dc575060015f83815260078301602052604090205460ff1660058111156113da576113da613e91565b145b6113f85760405162461bcd60e51b815260040161066e906141da565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aab9190600401614087565b5f610b6d823334612995565b5f8061144834612d4d565b905061145685828686612df7565b9150505b9392505050565b61146961324c565b61147281613297565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114c0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114e79190810190614240565b915091508061154a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161066e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561158d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b19190613ea5565b8251146116155760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161066e565b60208201516001600160a01b03161561168b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161066e565b5f8061169a84604001516132da565b915091508187146117075760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161066e565b9695505050505050565b5f8181525f8051602061458b8339815191526020526040812060030180545f8051602061454b833981519152916001600160401b039091169081908461175683614312565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61178d613c14565b5f8281525f8051602061458b8339815191526020526040908190208151610100810190925280545f8051602061454b833981519152929190829060ff1660058111156117db576117db613e91565b60058111156117ec576117ec613e91565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061458b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611925576118e5816001614337565b6118f09060086141c3565b5081515f908390839081106119075761190761434a565b60200101906001600160f81b03191690815f1a9053506001016118d1565b505f5b60048110156119885761193c816003614337565b6119479060086141c3565b6001901c60f81b8261195a83600261435e565b8151811061196a5761196a61434a565b60200101906001600160f81b03191690815f1a905350600101611928565b505f5b60208110156119ea5761199f81601f614337565b6119aa9060086141c3565b86901c60f81b826119bc83600661435e565b815181106119cc576119cc61434a565b60200101906001600160f81b03191690815f1a90535060010161198b565b505f5b6008811015611a5557611a01816007614337565b611a0c9060086141c3565b6001600160401b038616901c60f81b82611a2783602661435e565b81518110611a3757611a3761434a565b60200101906001600160f81b03191690815f1a9053506001016119ed565b505f5b6008811015611ac057611a6c816007614337565b611a779060086141c3565b6001600160401b038516901c60f81b82611a9283602e61435e565b81518110611aa257611aa261434a565b60200101906001600160f81b03191690815f1a905350600101611a58565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061450b833981519152929190611b1190613ef7565b9050118015611b43575060035f83815260038301602052604090205460ff166004811115611b4157611b41613e91565b145b611b985760405162461bcd60e51b815260206004820152603360248201525f8051602061452b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161066e565b5050565b611ba4613c14565b5f8051602061454b8339815191525f611bbc84611f3c565b90505f80611bcd83604001516127f4565b915091508015611c325760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161066e565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c6457611c64613e91565b6005811115611c7557611c75613e91565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611cfc57611cfc613e91565b1480611d1a5750600182516005811115611d1857611d18613e91565b145b611d795760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161066e565b600382516005811115611d8e57611d8e613e91565b03611db557505f8381526006860160205260408120600491611db09190613bdd565b611db9565b5060055b6020808301515f90815260088801909152604081205581816005811115611de257611de2613e91565b90816005811115611df557611df5613e91565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611e2957611e29613e91565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ef457611ef4613e91565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b611b986001600160a01b038216836134b2565b60408051606080820183525f8083526020830181905292820152905f8051602061454b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fb1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fd89190810190614240565b915091508061203f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161066e565b82548251146120a25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161066e565b60208201516001600160a01b0316156121155760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161066e565b509392505050565b5f805f83516036146121415760405162461bcd60e51b815260040161066e90614371565b5f805b600281101561219057612158816001614337565b6121639060086141c3565b61ffff168682815181106121795761217961434a565b016020015160f81c901b9190911790600101612144565b5061ffff8116156121b35760405162461bcd60e51b815260040161066e906143ba565b5f805b600481101561220e576121ca816003614337565b6121d59060086141c3565b63ffffffff16876121e783600261435e565b815181106121f7576121f761434a565b016020015160f81c901b91909117906001016121b6565b5063ffffffff81166003146122355760405162461bcd60e51b815260040161066e906143fd565b5f805b602081101561228a5761224c81601f614337565b6122579060086141c3565b8861226383600661435e565b815181106122735761227361434a565b016020015160f81c901b9190911790600101612238565b505f805b60088110156122e9576122a2816007614337565b6122ad9060086141c3565b6001600160401b0316896122c283602661435e565b815181106122d2576122d261434a565b016020015160f81c901b919091179060010161228e565b505f805b600881101561234857612301816007614337565b61230c9060086141c3565b6001600160401b03168a61232183602e61435e565b815181106123315761233161434a565b016020015160f81c901b91909117906001016122ed565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061450b8339815191529291906123a090613ef7565b90501180156123d2575060015f83815260038301602052604090205460ff1660048111156123d0576123d0613e91565b145b611b985760405162461bcd60e51b815260206004820152603860248201525f8051602061452b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161066e565b612439613c14565b5f8281525f8051602061458b83398151915260205260408082208151610100810190925280545f8051602061454b83398151915293929190829060ff16600581111561248757612487613e91565b600581111561249857612498613e91565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561252057612520613e91565b1461257c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161066e565b60408101516001600160a01b0316336001600160a01b0316146125f65760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161066e565b6126038160a00151613545565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561264757612647613e91565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127138561270d81611711565b5f6118ac565b5f868152600685016020526040902090915061272f8282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061275c908590600401614055565b6020604051808303815f875af1158015612778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061279c9190613ea5565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f8082516027146128175760405162461bcd60e51b815260040161066e90614371565b5f805b60028110156128665761282e816001614337565b6128399060086141c3565b61ffff1685828151811061284f5761284f61434a565b016020015160f81c901b919091179060010161281a565b5061ffff8116156128895760405162461bcd60e51b815260040161066e906143ba565b5f805b60048110156128e4576128a0816003614337565b6128ab9060086141c3565b63ffffffff16866128bd83600261435e565b815181106128cd576128cd61434a565b016020015160f81c901b919091179060010161288c565b5063ffffffff811660021461290b5760405162461bcd60e51b815260040161066e906143fd565b5f805b60208110156129605761292281601f614337565b61292d9060086141c3565b8761293983600661435e565b815181106129495761294961434a565b016020015160f81c901b919091179060010161290e565b505f866026815181106129755761297561434a565b016020015191976001600160f81b03199092161515965090945050505050565b5f61299e6136e6565b5f6129a883610b5d565b90505f8051602061450b8339815191525f6129c287611785565b90506002815160058111156129d9576129d9613e91565b14612a385760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161066e565b5f838260a00151612a499190614444565b9050612a558882611864565b5f612a5f89611711565b90505f898983604051602001612aa79392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612ac886613545565b5f612ad48b84866118ac565b5f8381526004880160205260409020909150612af08282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b1d908590600401614055565b6020604051808303815f875af1158015612b39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b5d9190613ea5565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c0c57612c0c613e91565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061145a60015f8051602061456b83398151915255565b5f5f8051602061450b8339815191528282612d6782610b5d565b83549091506001600160401b03821610801590612d9157508260010154816001600160401b031611155b612def5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161066e565b949350505050565b5f612e006136e6565b5f8051602061454b833981519152426001600160401b038516118015612e3a57506001600160401b038416612e38426202a30061435e565b115b612e9c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161066e565b85612ef35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161066e565b5f86815260088201602052604090205415612f615760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161066e565b8251603014612fc85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161066e565b612fd185613545565b5f806130186040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613730565b5f828152600586016020526040902091935091506130368282613f74565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613063908590600401614055565b6020604051808303815f875af115801561307f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a39190613ea5565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561312557613125613e91565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556131e683611711565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612def60015f8051602061456b83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661329557604051631afcd79f60e31b815260040160405180910390fd5b565b61329f61324c565b6132a881613ad5565b611472606082013560808301356132c560c0850160a08601613d54565b6132d560e0860160c08701614464565b613af6565b5f808251602e146132fd5760405162461bcd60e51b815260040161066e90614371565b5f805b600281101561334c57613314816001614337565b61331f9060086141c3565b61ffff168582815181106133355761333561434a565b016020015160f81c901b9190911790600101613300565b5061ffff81161561336f5760405162461bcd60e51b815260040161066e906143ba565b5f805b60048110156133ca57613386816003614337565b6133919060086141c3565b63ffffffff16866133a383600261435e565b815181106133b3576133b361434a565b016020015160f81c901b9190911790600101613372565b5063ffffffff81166004146133f15760405162461bcd60e51b815260040161066e906143fd565b5f805b60208110156134465761340881601f614337565b6134139060086141c3565b8761341f83600661435e565b8151811061342f5761342f61434a565b016020015160f81c901b91909117906001016133f4565b505f805b60088110156134a55761345e816007614337565b6134699060086141c3565b6001600160401b03168861347e83602661435e565b8151811061348e5761348e61434a565b016020015160f81c901b919091179060010161344a565b5090969095509350505050565b804710156134d55760405163cd78605960e01b815230600482015260240161066e565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461351e576040519150601f19603f3d011682016040523d82523d5f602084013e613523565b606091505b5050905080610aeb57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061454b8339815191529060ff165f03613583575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135cb9083614337565b106135e7576001600160401b0384166040830152808252613606565b83826040018181516135f99190614444565b6001600160401b03169052505b5f82602001518360400151606461361d919061447f565b61362791906144aa565b600285015490915060ff90811690821611156136a25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161066e565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061456b83398151915280546001190161371757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061456b83398151915255565b5f606082608001515160301461379a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161066e565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613811576137d1816001614337565b6137dc9060086141c3565b5081515f908390839081106137f3576137f361434a565b60200101906001600160f81b03191690815f1a9053506001016137bd565b505f5b600481101561386f57613828816003614337565b6138339060086141c3565b505f8261384183600261435e565b815181106138515761385161434a565b60200101906001600160f81b03191690815f1a905350600101613814565b505f5b60208110156138cc578451816020811061388e5761388e61434a565b1a60f81b8261389e83600661435e565b815181106138ae576138ae61434a565b60200101906001600160f81b03191690815f1a905350600101613872565b505f5b602081101561392c57846020015181602081106138ee576138ee61434a565b1a60f81b826138fe83602661435e565b8151811061390e5761390e61434a565b60200101906001600160f81b03191690815f1a9053506001016138cf565b505f5b60088110156139a057613943816007614337565b61394e9060086141c3565b60ff1685604001516001600160401b0316901c60f81b82826046613972919061435e565b815181106139825761398261434a565b60200101906001600160f81b03191690815f1a90535060010161392f565b505f5b6030811015613a0b57846080015181815181106139c2576139c261434a565b01602001516001600160f81b031916826139dd83604e61435e565b815181106139ed576139ed61434a565b60200101906001600160f81b03191690815f1a9053506001016139a3565b505f5b6008811015613a7d57613a22816007614337565b613a2d9060086141c3565b60608601516001600160401b0390811691161c60f81b82613a4f83607e61435e565b81518110613a5f57613a5f61434a565b60200101906001600160f81b03191690815f1a905350600101613a0e565b50600281604051613a8e91906144cf565b602060405180830381855afa158015613aa9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613acc9190613ea5565b94909350915050565b613add61324c565b613ae5613b51565b613aed613b61565b61147281613b69565b613afe61324c565b5f5f8051602061450b833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613b5961324c565b613295613bd5565b61329561324c565b613b7161324c565b80355f8051602061454b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bbb60608301604084016144ea565b600291909101805460ff191660ff90921691909117905550565b61371d61324c565b508054613be990613ef7565b5f825580601f10613bf8575050565b601f0160209004905f5260205f20908101906114729190613c58565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c6c575f8155600101613c59565b5090565b5f60e08284031215613c80575f80fd5b50919050565b8015158114611472575f80fd5b803563ffffffff81168114613ca6575f80fd5b919050565b5f805f60608486031215613cbd575f80fd5b833592506020840135613ccf81613c86565b9150613cdd60408501613c93565b90509250925092565b5f60208284031215613cf6575f80fd5b5035919050565b5f60208284031215613d0d575f80fd5b61145a82613c93565b5f8060408385031215613d27575f80fd5b613d3083613c93565b946020939093013593505050565b80356001600160401b0381168114613ca6575f80fd5b5f60208284031215613d64575f80fd5b61145a82613d3e565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613da357613da3613d6d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613dd157613dd1613d6d565b604052919050565b5f6001600160401b03821115613df157613df1613d6d565b50601f01601f191660200190565b5f805f60608486031215613e11575f80fd5b83359250613e2160208501613d3e565b915060408401356001600160401b03811115613e3b575f80fd5b8401601f81018613613e4b575f80fd5b8035613e5e613e5982613dd9565b613da9565b818152876020838501011115613e72575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215613eb5575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ef057613ef0613ebc565b5092915050565b600181811c90821680613f0b57607f821691505b602082108103613c8057634e487b7160e01b5f52602260045260245ffd5b601f821115610aeb57805f5260205f20601f840160051c81016020851015613f4e5750805b601f840160051c820191505b81811015613f6d575f8155600101613f5a565b5050505050565b81516001600160401b03811115613f8d57613f8d613d6d565b613fa181613f9b8454613ef7565b84613f29565b602080601f831160018114613fd4575f8415613fbd5750858301515b5f19600386901b1c1916600185901b17855561402b565b5f85815260208120601f198616915b8281101561400257888601518255948401946001909101908401613fe3565b508582101561401f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561404d578181015183820152602001614035565b50505f910152565b602081525f8251806020840152614073816040850160208701614033565b601f01601f19169190910160400192915050565b5f60208083525f845461409981613ef7565b806020870152604060018084165f81146140ba57600181146140d657614103565b60ff19851660408a0152604084151560051b8a01019550614103565b895f5260205f205f5b858110156140fa5781548b82018601529083019088016140df565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261413357614133614111565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610b6d57610b6d613ebc565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611472575f80fd5b8051613ca681613c86565b5f8060408385031215614251575f80fd5b82516001600160401b0380821115614267575f80fd5b908401906060828703121561427a575f80fd5b614282613d81565b8251815260208084015161429581614221565b828201526040840151838111156142aa575f80fd5b80850194505087601f8501126142be575f80fd5b835192506142ce613e5984613dd9565b83815288828587010111156142e1575f80fd5b6142f084838301848801614033565b80604084015250819550614305818801614235565b9450505050509250929050565b5f6001600160401b0380831681810361432d5761432d613ebc565b6001019392505050565b81810381811115610b6d57610b6d613ebc565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610b6d57610b6d613ebc565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ef057613ef0613ebc565b5f60208284031215614474575f80fd5b813561145a81614221565b6001600160401b038181168382160280821691908281146144a2576144a2613ebc565b505092915050565b5f6001600160401b03808416806144c3576144c3614111565b92169190910492915050565b5f82516144e0818460208701614033565b9190910192915050565b5f602082840312156144fa575f80fd5b813560ff8116811461145a575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161471938038061471983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145cc8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613c85565b610389565b005b348015610134575f80fd5b50610127610143366004613cc0565b61046b565b348015610153575f80fd5b50610127610162366004613cfb565b610994565b348015610172575f80fd5b506101b1610181366004613cfb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613cfb565b610af0565b3480156101ee575f80fd5b506102026101fd366004613cfb565b610b5d565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613d12565b610b73565b348015610244575f80fd5b50610127610253366004613d2b565b610bf1565b348015610263575f80fd5b506101b1610272366004613d69565b610de2565b348015610282575f80fd5b50610202610291366004613cfb565b610dfb565b3480156102a1575f80fd5b506101276102b0366004613cfb565b610e0f565b3480156102c0575f80fd5b506101276102cf366004613cc0565b610e7c565b3480156102df575f80fd5b506101276102ee366004613d2b565b610f7d565b3480156102fe575f80fd5b5061012761030d366004613d12565b6111ba565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613cfb565b611377565b6101b1610371366004613cfb565b611446565b6101b1610384366004613e14565b611452565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611476565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03602052604080822060018101548251610100810190935281545f80516020614520833981519152949193919290829060ff1660048111156104d3576104d3613ea6565b60048111156104e4576104e4613ea6565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f851561056a57610567838661148a565b90505b60028401546060830151604051636588aa7f60e01b81526001600160401b03918216600482015290831660248201525f604482018190526064820152600160401b9091046001600160a01b031690636588aa7f90608401602060405180830381865afa1580156105dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106009190613eba565b5f88815260068601602052604090205560028251600481111561062557610625613ea6565b146106775760405162461bcd60e51b815260206004820152602a60248201525f805160206145408339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106dc5760405162461bcd60e51b815260206004820152603360248201525f805160206145408339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161066e565b5f6106e684611726565b60038085526001600160401b0342811660a0870152821660e08601525f8a815290870160205260409020845181549293508592829060ff1916600183600481111561073357610733613ea6565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6108058561179a565b905083606001516001600160401b03168160a001516001600160401b03161161087c5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161066e565b5f84606001518260a001516108919190613ee5565b905061089d8682611879565b5f6108a98785846118c1565b5f8c815260058a01602052604090209091506108c58282613f89565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906108f290859060040161406a565b6020604051808303815f875af115801561090e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109329190613eba565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145608339815191529291906109dc90613f0c565b9050118015610a0e575060035f83815260078301602052604090205460ff166005811115610a0c57610a0c613ea6565b145b610a725760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161066e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aab919060040161409c565b6020604051808303815f875af1158015610ac7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aeb9190613eba565b505050565b610af981611ade565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614520833981519152916005600160991b019163ee5b48eb91610aab9160040161409c565b5f610b6d64e8d4a510008361413a565b92915050565b5f610b7d82611bb1565b604080820180516001600160a01b039081165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020528251909116815291822091909155606082015190519192505f8051602061452083398151915291610aeb916001600160401b031690611f3e565b5f805160206145208339815191525f610c0984611f51565b90505f80610c1a8360400151612132565b5091509150610c288561236d565b5f8581526004850160205260408120610c4091613bf2565b5f610c4a8361179a565b9050816001600160401b031681608001516001600160401b03161015610c825760405162461bcd60e51b815260040161066e9061414d565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610cc75760405162461bcd60e51b815260040161066e9061418f565b60015f87815260038701602052604090205460ff166004811115610ced57610ced613ea6565b14610d565760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161066e565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610b6d6001600160401b03831664e8d4a510006141d8565b5f610e058261179a565b60a0015192915050565b610e188161236d565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614520833981519152916005600160991b019163ee5b48eb91610aab9160040161409c565b5f8215610e9057610e8d848361148a565b90505b5f610e9a85612446565b90505f5f80516020614520833981519152600281015460a0840151604051636588aa7f60e01b81526001600160401b03918216600482015290861660248201525f604482018190526064820152919250600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610f1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f439190613eba565b6040808401516001600160a01b03165f908152600784016020529081208054909190610f709084906141ef565b9091555050505050505050565b5f805160206145208339815191525f610f9584611f51565b90505f80610fa68360400151612132565b5091509150610fb485611ade565b5f8581526005850160205260408120610fcc91613bf2565b5f610fd68361179a565b9050816001600160401b031681608001516001600160401b0316101561100e5760405162461bcd60e51b815260040161066e9061414d565b5f8681526003808701602052604090912001546001600160401b038084169116111561104c5760405162461bcd60e51b815260040161066e9061418f565b60035f87815260038701602052604090205460ff16600481111561107257611072613ea6565b146110c65760405162461bcd60e51b815260206004820152603160248201525f805160206145408339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161066e565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e084015261116a9190611f3e565b5f878152600687016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f805160206145608339815191525f6111d283611f51565b90505f806111e38360400151612809565b91509150806112455760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161066e565b5f8281526005850160205260408120805461125f90613f0c565b9050118015611291575060015f83815260078601602052604090205460ff16600581111561128f5761128f613ea6565b145b6112ad5760405162461bcd60e51b815260040161066e90614202565b5f82815260058501602052604081206112c591613bf2565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145608339815191529291906113bf90613f0c565b90501180156113f1575060015f83815260078301602052604090205460ff1660058111156113ef576113ef613ea6565b145b61140d5760405162461bcd60e51b815260040161066e90614202565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610aab919060040161409c565b5f610b6d8233346129aa565b5f8061145d34612d62565b905061146b85828686612e0c565b9150505b9392505050565b61147e613261565b611487816132ac565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114d5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114fc9190810190614268565b915091508061155f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161066e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c69190613eba565b82511461162a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161066e565b60208201516001600160a01b0316156116a05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161066e565b5f806116af84604001516132ef565b9150915081871461171c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161066e565b9695505050505050565b5f8181525f805160206145a08339815191526020526040812060030180545f80516020614560833981519152916001600160401b039091169081908461176b8361433a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6117a2613c29565b5f8281525f805160206145a08339815191526020526040908190208151610100810190925280545f80516020614560833981519152929190829060ff1660058111156117f0576117f0613ea6565b600581111561180157611801613ea6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206145a0833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561193a576118fa81600161435f565b6119059060086141d8565b5081515f9083908390811061191c5761191c614372565b60200101906001600160f81b03191690815f1a9053506001016118e6565b505f5b600481101561199d5761195181600361435f565b61195c9060086141d8565b6001901c60f81b8261196f8360026141ef565b8151811061197f5761197f614372565b60200101906001600160f81b03191690815f1a90535060010161193d565b505f5b60208110156119ff576119b481601f61435f565b6119bf9060086141d8565b86901c60f81b826119d18360066141ef565b815181106119e1576119e1614372565b60200101906001600160f81b03191690815f1a9053506001016119a0565b505f5b6008811015611a6a57611a1681600761435f565b611a219060086141d8565b6001600160401b038616901c60f81b82611a3c8360266141ef565b81518110611a4c57611a4c614372565b60200101906001600160f81b03191690815f1a905350600101611a02565b505f5b6008811015611ad557611a8181600761435f565b611a8c9060086141d8565b6001600160401b038516901c60f81b82611aa783602e6141ef565b81518110611ab757611ab7614372565b60200101906001600160f81b03191690815f1a905350600101611a6d565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614520833981519152929190611b2690613f0c565b9050118015611b58575060035f83815260038301602052604090205460ff166004811115611b5657611b56613ea6565b145b611bad5760405162461bcd60e51b815260206004820152603360248201525f8051602061454083398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161066e565b5050565b611bb9613c29565b5f805160206145608339815191525f611bd184611f51565b90505f80611be28360400151612809565b915091508015611c475760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161066e565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611c7957611c79613ea6565b6005811115611c8a57611c8a613ea6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d1157611d11613ea6565b1480611d2f5750600182516005811115611d2d57611d2d613ea6565b145b611d8e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161066e565b600382516005811115611da357611da3613ea6565b03611dca57505f8381526006860160205260408120600491611dc59190613bf2565b611dce565b5060055b6020808301515f90815260088801909152604081205581816005811115611df757611df7613ea6565b90816005811115611e0a57611e0a613ea6565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611e3e57611e3e613ea6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f0957611f09613ea6565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b611bad6001600160a01b038216836134c7565b60408051606080820183525f8083526020830181905292820152905f805160206145608339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fc6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fed9190810190614268565b91509150806120545760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161066e565b82548251146120b75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161066e565b60208201516001600160a01b03161561212a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161066e565b509392505050565b5f805f83516036146121565760405162461bcd60e51b815260040161066e90614386565b5f805b60028110156121a55761216d81600161435f565b6121789060086141d8565b61ffff1686828151811061218e5761218e614372565b016020015160f81c901b9190911790600101612159565b5061ffff8116156121c85760405162461bcd60e51b815260040161066e906143cf565b5f805b6004811015612223576121df81600361435f565b6121ea9060086141d8565b63ffffffff16876121fc8360026141ef565b8151811061220c5761220c614372565b016020015160f81c901b91909117906001016121cb565b5063ffffffff811660031461224a5760405162461bcd60e51b815260040161066e90614412565b5f805b602081101561229f5761226181601f61435f565b61226c9060086141d8565b886122788360066141ef565b8151811061228857612288614372565b016020015160f81c901b919091179060010161224d565b505f805b60088110156122fe576122b781600761435f565b6122c29060086141d8565b6001600160401b0316896122d78360266141ef565b815181106122e7576122e7614372565b016020015160f81c901b91909117906001016122a3565b505f805b600881101561235d5761231681600761435f565b6123219060086141d8565b6001600160401b03168a61233683602e6141ef565b8151811061234657612346614372565b016020015160f81c901b9190911790600101612302565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206145208339815191529291906123b590613f0c565b90501180156123e7575060015f83815260038301602052604090205460ff1660048111156123e5576123e5613ea6565b145b611bad5760405162461bcd60e51b815260206004820152603860248201525f8051602061454083398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161066e565b61244e613c29565b5f8281525f805160206145a083398151915260205260408082208151610100810190925280545f8051602061456083398151915293929190829060ff16600581111561249c5761249c613ea6565b60058111156124ad576124ad613ea6565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561253557612535613ea6565b146125915760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161066e565b60408101516001600160a01b0316336001600160a01b03161461260b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161066e565b6126188160a0015161355a565b60038152426001600160401b031660e08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561265c5761265c613ea6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127288561272281611726565b5f6118c1565b5f86815260068501602052604090209091506127448282613f89565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061277190859060040161406a565b6020604051808303815f875af115801561278d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127b19190613eba565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80825160271461282c5760405162461bcd60e51b815260040161066e90614386565b5f805b600281101561287b5761284381600161435f565b61284e9060086141d8565b61ffff1685828151811061286457612864614372565b016020015160f81c901b919091179060010161282f565b5061ffff81161561289e5760405162461bcd60e51b815260040161066e906143cf565b5f805b60048110156128f9576128b581600361435f565b6128c09060086141d8565b63ffffffff16866128d28360026141ef565b815181106128e2576128e2614372565b016020015160f81c901b91909117906001016128a1565b5063ffffffff81166002146129205760405162461bcd60e51b815260040161066e90614412565b5f805b60208110156129755761293781601f61435f565b6129429060086141d8565b8761294e8360066141ef565b8151811061295e5761295e614372565b016020015160f81c901b9190911790600101612923565b505f8660268151811061298a5761298a614372565b016020015191976001600160f81b03199092161515965090945050505050565b5f6129b36136fb565b5f6129bd83610b5d565b90505f805160206145208339815191525f6129d78761179a565b90506002815160058111156129ee576129ee613ea6565b14612a4d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161066e565b5f838260a00151612a5e9190614459565b9050612a6a8882611879565b5f612a7489611726565b90505f898983604051602001612abc9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612add8661355a565b5f612ae98b84866118c1565b5f8381526004880160205260409020909150612b058282613f89565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b3290859060040161406a565b6020604051808303815f875af1158015612b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b729190613eba565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c2157612c21613ea6565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061146f60015f8051602061458083398151915255565b5f5f805160206145208339815191528282612d7c82610b5d565b83549091506001600160401b03821610801590612da657508260010154816001600160401b031611155b612e045760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161066e565b949350505050565b5f612e156136fb565b5f80516020614560833981519152426001600160401b038516118015612e4f57506001600160401b038416612e4d426202a3006141ef565b115b612eb15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161066e565b85612f085760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161066e565b5f86815260088201602052604090205415612f765760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161066e565b8251603014612fdd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161066e565b612fe68561355a565b5f8061302d6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613745565b5f8281526005860160205260409020919350915061304b8282613f89565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061307890859060040161406a565b6020604051808303815f875af1158015613094573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130b89190613eba565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561313a5761313a613ea6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556131fb83611726565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612e0460015f8051602061458083398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166132aa57604051631afcd79f60e31b815260040160405180910390fd5b565b6132b4613261565b6132bd81613aea565b611487606082013560808301356132da60c0850160a08601613d69565b6132ea60e0860160c08701614479565b613b0b565b5f808251602e146133125760405162461bcd60e51b815260040161066e90614386565b5f805b60028110156133615761332981600161435f565b6133349060086141d8565b61ffff1685828151811061334a5761334a614372565b016020015160f81c901b9190911790600101613315565b5061ffff8116156133845760405162461bcd60e51b815260040161066e906143cf565b5f805b60048110156133df5761339b81600361435f565b6133a69060086141d8565b63ffffffff16866133b88360026141ef565b815181106133c8576133c8614372565b016020015160f81c901b9190911790600101613387565b5063ffffffff81166004146134065760405162461bcd60e51b815260040161066e90614412565b5f805b602081101561345b5761341d81601f61435f565b6134289060086141d8565b876134348360066141ef565b8151811061344457613444614372565b016020015160f81c901b9190911790600101613409565b505f805b60088110156134ba5761347381600761435f565b61347e9060086141d8565b6001600160401b0316886134938360266141ef565b815181106134a3576134a3614372565b016020015160f81c901b919091179060010161345f565b5090969095509350505050565b804710156134ea5760405163cd78605960e01b815230600482015260240161066e565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613533576040519150601f19603f3d011682016040523d82523d5f602084013e613538565b606091505b5050905080610aeb57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145608339815191529060ff165f03613598575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906135e0908361435f565b106135fc576001600160401b038416604083015280825261361b565b838260400181815161360e9190614459565b6001600160401b03169052505b5f8260200151836040015160646136329190614494565b61363c91906144bf565b600285015490915060ff90811690821611156136b75760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161066e565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061458083398151915280546001190161372c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061458083398151915255565b5f60608260800151516030146137af5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161066e565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613826576137e681600161435f565b6137f19060086141d8565b5081515f9083908390811061380857613808614372565b60200101906001600160f81b03191690815f1a9053506001016137d2565b505f5b60048110156138845761383d81600361435f565b6138489060086141d8565b505f826138568360026141ef565b8151811061386657613866614372565b60200101906001600160f81b03191690815f1a905350600101613829565b505f5b60208110156138e157845181602081106138a3576138a3614372565b1a60f81b826138b38360066141ef565b815181106138c3576138c3614372565b60200101906001600160f81b03191690815f1a905350600101613887565b505f5b6020811015613941578460200151816020811061390357613903614372565b1a60f81b826139138360266141ef565b8151811061392357613923614372565b60200101906001600160f81b03191690815f1a9053506001016138e4565b505f5b60088110156139b55761395881600761435f565b6139639060086141d8565b60ff1685604001516001600160401b0316901c60f81b8282604661398791906141ef565b8151811061399757613997614372565b60200101906001600160f81b03191690815f1a905350600101613944565b505f5b6030811015613a2057846080015181815181106139d7576139d7614372565b01602001516001600160f81b031916826139f283604e6141ef565b81518110613a0257613a02614372565b60200101906001600160f81b03191690815f1a9053506001016139b8565b505f5b6008811015613a9257613a3781600761435f565b613a429060086141d8565b60608601516001600160401b0390811691161c60f81b82613a6483607e6141ef565b81518110613a7457613a74614372565b60200101906001600160f81b03191690815f1a905350600101613a23565b50600281604051613aa391906144e4565b602060405180830381855afa158015613abe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613ae19190613eba565b94909350915050565b613af2613261565b613afa613b66565b613b02613b76565b61148781613b7e565b613b13613261565b5f5f80516020614520833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613b6e613261565b6132aa613bea565b6132aa613261565b613b86613261565b80355f8051602061456083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bd060608301604084016144ff565b600291909101805460ff191660ff90921691909117905550565b613732613261565b508054613bfe90613f0c565b5f825580601f10613c0d575050565b601f0160209004905f5260205f20908101906114879190613c6d565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c81575f8155600101613c6e565b5090565b5f60e08284031215613c95575f80fd5b50919050565b8015158114611487575f80fd5b803563ffffffff81168114613cbb575f80fd5b919050565b5f805f60608486031215613cd2575f80fd5b833592506020840135613ce481613c9b565b9150613cf260408501613ca8565b90509250925092565b5f60208284031215613d0b575f80fd5b5035919050565b5f60208284031215613d22575f80fd5b61146f82613ca8565b5f8060408385031215613d3c575f80fd5b613d4583613ca8565b946020939093013593505050565b80356001600160401b0381168114613cbb575f80fd5b5f60208284031215613d79575f80fd5b61146f82613d53565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613db857613db8613d82565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613de657613de6613d82565b604052919050565b5f6001600160401b03821115613e0657613e06613d82565b50601f01601f191660200190565b5f805f60608486031215613e26575f80fd5b83359250613e3660208501613d53565b915060408401356001600160401b03811115613e50575f80fd5b8401601f81018613613e60575f80fd5b8035613e73613e6e82613dee565b613dbe565b818152876020838501011115613e87575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215613eca575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f0557613f05613ed1565b5092915050565b600181811c90821680613f2057607f821691505b602082108103613c9557634e487b7160e01b5f52602260045260245ffd5b601f821115610aeb57805f5260205f20601f840160051c81016020851015613f635750805b601f840160051c820191505b81811015613f82575f8155600101613f6f565b5050505050565b81516001600160401b03811115613fa257613fa2613d82565b613fb681613fb08454613f0c565b84613f3e565b602080601f831160018114613fe9575f8415613fd25750858301515b5f19600386901b1c1916600185901b178555614040565b5f85815260208120601f198616915b8281101561401757888601518255948401946001909101908401613ff8565b508582101561403457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561406257818101518382015260200161404a565b50505f910152565b602081525f8251806020840152614088816040850160208701614048565b601f01601f19169190910160400192915050565b5f60208083525f84546140ae81613f0c565b806020870152604060018084165f81146140cf57600181146140eb57614118565b60ff19851660408a0152604084151560051b8a01019550614118565b895f5260205f205f5b8581101561410f5781548b82018601529083019088016140f4565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261414857614148614126565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610b6d57610b6d613ed1565b80820180821115610b6d57610b6d613ed1565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b0381168114611487575f80fd5b8051613cbb81613c9b565b5f8060408385031215614279575f80fd5b82516001600160401b038082111561428f575f80fd5b90840190606082870312156142a2575f80fd5b6142aa613d96565b825181526020808401516142bd81614249565b828201526040840151838111156142d2575f80fd5b80850194505087601f8501126142e6575f80fd5b835192506142f6613e6e84613dee565b8381528882858701011115614309575f80fd5b61431884838301848801614048565b8060408401525081955061432d81880161425d565b9450505050509250929050565b5f6001600160401b0380831681810361435557614355613ed1565b6001019392505050565b81810381811115610b6d57610b6d613ed1565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f0557613f05613ed1565b5f60208284031215614489575f80fd5b813561146f81614249565b6001600160401b038181168382160280821691908281146144b7576144b7613ed1565b505092915050565b5f6001600160401b03808416806144d8576144d8614126565b92169190910492915050565b5f82516144f5818460208701614048565b9190910192915050565b5f6020828403121561450f575f80fd5b813560ff8116811461146f575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index fcd905f54..59857327b 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -100,7 +100,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _initializeEndValidation(validationID); PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - $._pendingValidatorRewards[validator.owner] = + $._pendingValidatorRewards[validator.owner] += $._rewardCalculator.calculateReward(validator.weight, uptime, 0, 0); } From f5d460add32c712ad76cdb39c4fc7687e4539bdf Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 11 Sep 2024 16:19:19 -0400 Subject: [PATCH 245/545] rename back to staking and lint --- .../ERC20TokenStakingManager.go | 65 ++++++++++++------- .../NativeTokenStakingManager.go | 65 ++++++++++++------- .../PoAValidatorManager.go | 35 ++++++---- .../ERC20TokenStakingManager.sol | 0 .../ExampleRewardCalculator.sol | 0 .../NativeTokenStakingManager.sol | 0 .../PoAValidatorManager.sol | 0 .../PoSValidatorManager.sol | 16 ++--- .../{validatormanager => staking}/README.md | 0 .../ValidatorManager.sol | 0 .../ValidatorMessages.sol | 0 .../interfaces/IERC20TokenStakingManager.sol | 0 .../interfaces/INativeTokenStakingManager.sol | 0 .../interfaces/IPoAValidatorManager.sol | 0 .../interfaces/IPoSValidatorManager.sol | 0 .../interfaces/IRewardCalculator.sol | 0 .../interfaces/IValidatorManager.sol | 0 .../tests/ERC20TokenStakingManagerTests.t.sol | 0 .../tests/ExamplesRewardCalculatorTests.t.sol | 0 .../NativeTokenStakingManagerTests.t.sol | 0 .../tests/PoAValidatorManagerTests.t.sol | 0 .../tests/PoSValidatorManagerTests.t.sol | 0 .../tests/ValidatorManagerTests.t.sol | 0 .../tests/ValidatorMessagesTests.t.sol | 0 24 files changed, 109 insertions(+), 72 deletions(-) rename abi-bindings/go/{validatormanager => staking}/ERC20TokenStakingManager/ERC20TokenStakingManager.go (68%) rename abi-bindings/go/{validatormanager => staking}/NativeTokenStakingManager/NativeTokenStakingManager.go (68%) rename abi-bindings/go/{validatormanager => staking}/PoAValidatorManager/PoAValidatorManager.go (72%) rename contracts/{validatormanager => staking}/ERC20TokenStakingManager.sol (100%) rename contracts/{validatormanager => staking}/ExampleRewardCalculator.sol (100%) rename contracts/{validatormanager => staking}/NativeTokenStakingManager.sol (100%) rename contracts/{validatormanager => staking}/PoAValidatorManager.sol (100%) rename contracts/{validatormanager => staking}/PoSValidatorManager.sol (97%) rename contracts/{validatormanager => staking}/README.md (100%) rename contracts/{validatormanager => staking}/ValidatorManager.sol (100%) rename contracts/{validatormanager => staking}/ValidatorMessages.sol (100%) rename contracts/{validatormanager => staking}/interfaces/IERC20TokenStakingManager.sol (100%) rename contracts/{validatormanager => staking}/interfaces/INativeTokenStakingManager.sol (100%) rename contracts/{validatormanager => staking}/interfaces/IPoAValidatorManager.sol (100%) rename contracts/{validatormanager => staking}/interfaces/IPoSValidatorManager.sol (100%) rename contracts/{validatormanager => staking}/interfaces/IRewardCalculator.sol (100%) rename contracts/{validatormanager => staking}/interfaces/IValidatorManager.sol (100%) rename contracts/{validatormanager => staking}/tests/ERC20TokenStakingManagerTests.t.sol (100%) rename contracts/{validatormanager => staking}/tests/ExamplesRewardCalculatorTests.t.sol (100%) rename contracts/{validatormanager => staking}/tests/NativeTokenStakingManagerTests.t.sol (100%) rename contracts/{validatormanager => staking}/tests/PoAValidatorManagerTests.t.sol (100%) rename contracts/{validatormanager => staking}/tests/PoSValidatorManagerTests.t.sol (100%) rename contracts/{validatormanager => staking}/tests/ValidatorManagerTests.t.sol (100%) rename contracts/{validatormanager => staking}/tests/ValidatorMessagesTests.t.sol (100%) diff --git a/abi-bindings/go/validatormanager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go similarity index 68% rename from abi-bindings/go/validatormanager/ERC20TokenStakingManager/ERC20TokenStakingManager.go rename to abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 5fac034af..4d42da3dd 100644 --- a/abi-bindings/go/validatormanager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -31,11 +31,19 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { - BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int - MinimumStakeDuration uint64 - RewardCalculator common.Address + BaseSettings ValidatorManagerSettings + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + MinimumStakeDuration uint64 + MinimumDelegationFee *big.Int + MaximumStakeMultiplier uint64 + RewardCalculator common.Address +} + +// PoSValidatorRequirements is an auto generated low-level Go binding around an user-defined struct. +type PoSValidatorRequirements struct { + DelegationFee *big.Int + MinStakeDuration *big.Int } // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. @@ -45,10 +53,17 @@ type ValidatorManagerSettings struct { MaximumHourlyChurn uint8 } +// ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. +type ValidatorRegistrationInput struct { + NodeID [32]byte + RegistrationExpiry uint64 + BlsPublicKey []byte +} + // 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161478038038061478083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146338061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613c9f565b6102d6565b005b610128610138366004613cda565b610761565b61017b61014b366004613cda565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613cda565b6108bd565b6101286101af366004613d05565b61092a565b6101c76101c2366004613cda565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613d42565b610a24565b610128610200366004613d5b565b610da7565b61017b610213366004613d99565b610f98565b6101c7610226366004613cda565b610fb1565b610128610239366004613cda565b610fc5565b61012861024c366004613c9f565b611032565b61017b61025f366004613e44565b61104d565b610128610272366004613d5b565b611072565b61017b610285366004613ee0565b611212565b610128610298366004613d42565b611225565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613cda565b6113e2565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145878339815191529184156103285761032582856114b1565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a613f00565b600481111561036b5761036b613f00565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2613f00565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206145a78339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206145a78339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461174d565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500613f00565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856117c1565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190613f28565b905061066a86826118d2565b5f61067687858461191a565b5f8c815260058a01602052604090209091506106928282613fd2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016140b3565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906140e5565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206145c78339815191529291906107a990613f4f565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9613f00565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016140fc565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906140e5565b505050565b6108c681611b37565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f80516020614587833981519152916005600160991b019163ee5b48eb91610878916004016140fc565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc8484611c0a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361419a565b92915050565b5f805160206145c78339815191525f610a3c83611c24565b90505f80610a4d8360400151611e05565b915091508015610ab25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610ae457610ae4613f00565b6005811115610af557610af5613f00565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b7c57610b7c613f00565b1480610b9a5750600182516005811115610b9857610b98613f00565b145b610bf95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610c0e57610c0e613f00565b03610c3557505f8381526006860160205260408120600491610c309190613c30565b610c39565b5060055b6020808301515f90815260088801909152604081205581816005811115610c6257610c62613f00565b90816005811115610c7557610c75613f00565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ca957610ca9613f00565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d7457610d74613f00565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145878339815191525f610dbf84611c24565b90505f80610dd08360400151611fa6565b5091509150610dde856121e1565b5f8581526004850160205260408120610df691613c30565b5f610e00836117c1565b9050816001600160401b031681608001516001600160401b03161015610e385760405162461bcd60e51b815260040161043b906141ad565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610e7d5760405162461bcd60e51b815260040161043b906141ef565b60015f87815260038701602052604090205460ff166004811115610ea357610ea3613f00565b14610f0c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a51000614238565b5f610fbb826117c1565b60a0015192915050565b610fce816121e1565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f80516020614587833981519152916005600160991b019163ee5b48eb91610878916004016140fc565b81156110445761104283826114b1565b505b6108b8836122ba565b5f8061105886612672565b90506110668582868661271f565b9150505b949350505050565b5f805160206145878339815191525f61108a84611c24565b90505f8061109b8360400151611fa6565b50915091506110a985611b37565b5f85815260058501602052604081206110c191613c30565b5f6110cb836117c1565b9050816001600160401b031681608001516001600160401b031610156111035760405162461bcd60e51b815260040161043b906141ad565b5f8681526003808701602052604090912001546001600160401b03808416911611156111415760405162461bcd60e51b815260040161043b906141ef565b60035f87815260038701602052604090205460ff16600481111561116757611167613f00565b146111bb5760405162461bcd60e51b815260206004820152603160248201525f805160206145a78339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f61121e833384612b74565b9392505050565b5f805160206145c78339815191525f61123d83611c24565b90505f8061124e8360400151611e05565b91509150806112b05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f828152600585016020526040812080546112ca90613f4f565b90501180156112fc575060015f83815260078601602052604090205460ff1660058111156112fa576112fa613f00565b145b6113185760405162461bcd60e51b815260040161043b9061424f565b5f828152600585016020526040812061133091613c30565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206145c783398151915292919061142a90613f4f565b905011801561145c575060015f83815260078301602052604090205460ff16600581111561145a5761145a613f00565b145b6114785760405162461bcd60e51b815260040161043b9061424f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016140fc565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114fc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261152391908101906142a1565b91509150806115865760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ed91906140e5565b8251146116515760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156116c75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806116d68460400151612f2f565b915091508187146117435760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f805160206146078339815191526020526040812060030180545f805160206145c7833981519152916001600160401b039091169081908461179283614373565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061460783398151915290528390208351918201909352825491925f805160206145c783398151915292829060ff16600581111561184957611849613f00565b600581111561185a5761185a613f00565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614607833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561199357611953816001614398565b61195e906008614238565b5081515f90839083908110611975576119756143ab565b60200101906001600160f81b03191690815f1a90535060010161193f565b505f5b60048110156119f6576119aa816003614398565b6119b5906008614238565b6001901c60f81b826119c88360026143bf565b815181106119d8576119d86143ab565b60200101906001600160f81b03191690815f1a905350600101611996565b505f5b6020811015611a5857611a0d81601f614398565b611a18906008614238565b86901c60f81b82611a2a8360066143bf565b81518110611a3a57611a3a6143ab565b60200101906001600160f81b03191690815f1a9053506001016119f9565b505f5b6008811015611ac357611a6f816007614398565b611a7a906008614238565b6001600160401b038616901c60f81b82611a958360266143bf565b81518110611aa557611aa56143ab565b60200101906001600160f81b03191690815f1a905350600101611a5b565b505f5b6008811015611b2e57611ada816007614398565b611ae5906008614238565b6001600160401b038516901c60f81b82611b0083602e6143bf565b81518110611b1057611b106143ab565b60200101906001600160f81b03191690815f1a905350600101611ac6565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f80516020614587833981519152929190611b7f90613f4f565b9050118015611bb1575060035f83815260038301602052604090205460ff166004811115611baf57611baf613f00565b145b611c065760405162461bcd60e51b815260206004820152603360248201525f805160206145a783398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b611c12613107565b611c1b82613152565b611c0681613198565b60408051606080820183525f8083526020830181905292820152905f805160206145c78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611c99573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cc091908101906142a1565b9150915080611d275760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611d8a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611dfd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f808251602714611e285760405162461bcd60e51b815260040161043b906143d2565b5f805b6002811015611e7757611e3f816001614398565b611e4a906008614238565b61ffff16858281518110611e6057611e606143ab565b016020015160f81c901b9190911790600101611e2b565b5061ffff811615611e9a5760405162461bcd60e51b815260040161043b9061441b565b5f805b6004811015611ef557611eb1816003614398565b611ebc906008614238565b63ffffffff1686611ece8360026143bf565b81518110611ede57611ede6143ab565b016020015160f81c901b9190911790600101611e9d565b5063ffffffff8116600214611f1c5760405162461bcd60e51b815260040161043b9061445e565b5f805b6020811015611f7157611f3381601f614398565b611f3e906008614238565b87611f4a8360066143bf565b81518110611f5a57611f5a6143ab565b016020015160f81c901b9190911790600101611f1f565b505f86602681518110611f8657611f866143ab565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f8351603614611fca5760405162461bcd60e51b815260040161043b906143d2565b5f805b600281101561201957611fe1816001614398565b611fec906008614238565b61ffff16868281518110612002576120026143ab565b016020015160f81c901b9190911790600101611fcd565b5061ffff81161561203c5760405162461bcd60e51b815260040161043b9061441b565b5f805b600481101561209757612053816003614398565b61205e906008614238565b63ffffffff16876120708360026143bf565b81518110612080576120806143ab565b016020015160f81c901b919091179060010161203f565b5063ffffffff81166003146120be5760405162461bcd60e51b815260040161043b9061445e565b5f805b6020811015612113576120d581601f614398565b6120e0906008614238565b886120ec8360066143bf565b815181106120fc576120fc6143ab565b016020015160f81c901b91909117906001016120c1565b505f805b60088110156121725761212b816007614398565b612136906008614238565b6001600160401b03168961214b8360266143bf565b8151811061215b5761215b6143ab565b016020015160f81c901b9190911790600101612117565b505f805b60088110156121d15761218a816007614398565b612195906008614238565b6001600160401b03168a6121aa83602e6143bf565b815181106121ba576121ba6143ab565b016020015160f81c901b9190911790600101612176565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061458783398151915292919061222990613f4f565b905011801561225b575060015f83815260038301602052604090205460ff16600481111561225957612259613f00565b145b611c065760405162461bcd60e51b815260206004820152603860248201525f805160206145a783398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061460783398151915260205260408082208151610100810190925280545f805160206145c783398151915293929190829060ff16600581111561230857612308613f00565b600581111561231957612319613f00565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123a1576123a1613f00565b146123fd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146124775760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6124848160a0015161324c565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156124c8576124c8613f00565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125948461258e8161174d565b5f61191a565b5f85815260068501602052604090209091506125b08282613fd2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906125dd9085906004016140b3565b6020604051808303815f875af11580156125f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061261d91906140e5565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206145878339815191528161268b846133ed565b90505f61269782610a0e565b83549091506001600160401b038216108015906126c157508260010154816001600160401b031611155b61106a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f612728613423565b5f805160206145c7833981519152426001600160401b03851611801561276257506001600160401b038416612760426202a3006143bf565b115b6127c45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b8561281b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600882016020526040902054156128895760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128f05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b6128f98561324c565b5f806129406040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061345a565b5f8281526005860160205260409020919350915061295e8282613fd2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061298b9085906004016140b3565b6020604051808303815f875af11580156129a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129cb91906140e5565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612a4d57612a4d613f00565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612b0e8361174d565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061106a60015f805160206145e783398151915255565b5f612b7d613423565b5f612b8a6101c2846133ed565b90505f805160206145878339815191525f612ba4876117c1565b9050600281516005811115612bbb57612bbb613f00565b14612c1a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612c2b91906144a5565b9050612c3788826118d2565b5f612c418961174d565b90505f898983604051602001612c899392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612caa8661324c565b5f612cb68b848661191a565b5f8381526004880160205260409020909150612cd28282613fd2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cff9085906004016140b3565b6020604051808303815f875af1158015612d1b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d3f91906140e5565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612dee57612dee613f00565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061121e60015f805160206145e783398151915255565b5f808251602e14612f525760405162461bcd60e51b815260040161043b906143d2565b5f805b6002811015612fa157612f69816001614398565b612f74906008614238565b61ffff16858281518110612f8a57612f8a6143ab565b016020015160f81c901b9190911790600101612f55565b5061ffff811615612fc45760405162461bcd60e51b815260040161043b9061441b565b5f805b600481101561301f57612fdb816003614398565b612fe6906008614238565b63ffffffff1686612ff88360026143bf565b81518110613008576130086143ab565b016020015160f81c901b9190911790600101612fc7565b5063ffffffff81166004146130465760405162461bcd60e51b815260040161043b9061445e565b5f805b602081101561309b5761305d81601f614398565b613068906008614238565b876130748360066143bf565b81518110613084576130846143ab565b016020015160f81c901b9190911790600101613049565b505f805b60088110156130fa576130b3816007614398565b6130be906008614238565b6001600160401b0316886130d38360266143bf565b815181106130e3576130e36143ab565b016020015160f81c901b919091179060010161309f565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661315057604051631afcd79f60e31b815260040160405180910390fd5b565b61315a613107565b61316381613812565b6131956060820135608083013561318060c0850160a08601613d99565b61319060e0860160c087016144c5565b613833565b50565b6131a0613107565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661322c5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206145c78339815191529060ff165f0361328a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132d29083614398565b106132ee576001600160401b038416604083015280825261330d565b838260400181815161330091906144a5565b6001600160401b03169052505b5f82602001518360400151606461332491906144e0565b61332e919061450b565b600285015490915060ff90811690821611156133a95760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061388e565b5f805160206145e783398151915280546001190161345457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146134c45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561353b576134fb816001614398565b613506906008614238565b5081515f9083908390811061351d5761351d6143ab565b60200101906001600160f81b03191690815f1a9053506001016134e7565b505f5b600481101561359957613552816003614398565b61355d906008614238565b505f8261356b8360026143bf565b8151811061357b5761357b6143ab565b60200101906001600160f81b03191690815f1a90535060010161353e565b505f5b60208110156135f657845181602081106135b8576135b86143ab565b1a60f81b826135c88360066143bf565b815181106135d8576135d86143ab565b60200101906001600160f81b03191690815f1a90535060010161359c565b505f5b60208110156136565784602001518160208110613618576136186143ab565b1a60f81b826136288360266143bf565b81518110613638576136386143ab565b60200101906001600160f81b03191690815f1a9053506001016135f9565b505f5b60088110156136ca5761366d816007614398565b613678906008614238565b60ff1685604001516001600160401b0316901c60f81b8282604661369c91906143bf565b815181106136ac576136ac6143ab565b60200101906001600160f81b03191690815f1a905350600101613659565b505f5b603081101561373557846080015181815181106136ec576136ec6143ab565b01602001516001600160f81b0319168261370783604e6143bf565b81518110613717576137176143ab565b60200101906001600160f81b03191690815f1a9053506001016136cd565b505f5b60088110156137a75761374c816007614398565b613757906008614238565b60608601516001600160401b0390811691161c60f81b8261377983607e6143bf565b81518110613789576137896143ab565b60200101906001600160f81b03191690815f1a905350600101613738565b506002816040516137b89190614530565b602060405180830381855afa1580156137d3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137f691906140e5565b94909350915050565b60015f805160206145e783398151915255565b61381a613107565b6138226139f0565b61382a613a00565b61319581613a08565b61383b613107565b5f5f80516020614587833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156138d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138f891906140e5565b905061390f6001600160a01b038516333086613a74565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613953573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061397791906140e5565b90508181116139dd5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b6139e78282614398565b95945050505050565b6139f8613107565b613150613ad4565b613150613107565b613a10613107565b80355f805160206145c783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613a5a606083016040840161454b565b600291909101805460ff191660ff90921691909117905550565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613ace908590613adc565b50505050565b6137ff613107565b5f613af06001600160a01b03841683613b3d565b905080515f14158015613b14575080806020019051810190613b12919061456b565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b606061121e83835f845f80856001600160a01b03168486604051613b619190614530565b5f6040518083038185875af1925050503d805f8114613b9b576040519150601f19603f3d011682016040523d82523d5f602084013e613ba0565b606091505b5091509150611743868383606082613bc057613bbb82613c07565b61121e565b8151158015613bd757506001600160a01b0384163b155b15613c0057604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b508061121e565b805115613c175780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613c3c90613f4f565b5f825580601f10613c4b575050565b601f0160209004905f5260205f209081019061319591905b80821115613c76575f8155600101613c63565b5090565b8015158114613195575f80fd5b803563ffffffff81168114613c9a575f80fd5b919050565b5f805f60608486031215613cb1575f80fd5b833592506020840135613cc381613c7a565b9150613cd160408501613c87565b90509250925092565b5f60208284031215613cea575f80fd5b5035919050565b6001600160a01b0381168114613195575f80fd5b5f80828403610100811215613d18575f80fd5b60e0811215613d25575f80fd5b5082915060e0830135613d3781613cf1565b809150509250929050565b5f60208284031215613d52575f80fd5b61121e82613c87565b5f8060408385031215613d6c575f80fd5b613d7583613c87565b946020939093013593505050565b80356001600160401b0381168114613c9a575f80fd5b5f60208284031215613da9575f80fd5b61121e82613d83565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613de857613de8613db2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e1657613e16613db2565b604052919050565b5f6001600160401b03821115613e3657613e36613db2565b50601f01601f191660200190565b5f805f8060808587031215613e57575f80fd5b8435935060208501359250613e6e60408601613d83565b915060608501356001600160401b03811115613e88575f80fd5b8501601f81018713613e98575f80fd5b8035613eab613ea682613e1e565b613dee565b818152886020838501011115613ebf575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215613ef1575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f4857613f48613f14565b5092915050565b600181811c90821680613f6357607f821691505b602082108103613f8157634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c81016020851015613fac5750805b601f840160051c820191505b81811015613fcb575f8155600101613fb8565b5050505050565b81516001600160401b03811115613feb57613feb613db2565b613fff81613ff98454613f4f565b84613f87565b602080601f831160018114614032575f841561401b5750858301515b5f19600386901b1c1916600185901b178555614089565b5f85815260208120601f198616915b8281101561406057888601518255948401946001909101908401614041565b508582101561407d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156140ab578181015183820152602001614093565b50505f910152565b602081525f82518060208401526140d1816040850160208701614091565b601f01601f19169190910160400192915050565b5f602082840312156140f5575f80fd5b5051919050565b5f60208083525f845461410e81613f4f565b806020870152604060018084165f811461412f576001811461414b57614178565b60ff19851660408a0152604084151560051b8a01019550614178565b895f5260205f205f5b8581101561416f5781548b8201860152908301908801614154565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826141a8576141a8614186565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e613f14565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613c9a81613c7a565b5f80604083850312156142b2575f80fd5b82516001600160401b03808211156142c8575f80fd5b90840190606082870312156142db575f80fd5b6142e3613dc6565b825181526020808401516142f681613cf1565b8282015260408401518381111561430b575f80fd5b80850194505087601f85011261431f575f80fd5b8351925061432f613ea684613e1e565b8381528882858701011115614342575f80fd5b61435184838301848801614091565b80604084015250819550614366818801614296565b9450505050509250929050565b5f6001600160401b0380831681810361438e5761438e613f14565b6001019392505050565b81810381811115610a1e57610a1e613f14565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e613f14565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f4857613f48613f14565b5f602082840312156144d5575f80fd5b813561121e81613cf1565b6001600160401b0381811683821602808216919082811461450357614503613f14565b505092915050565b5f6001600160401b038084168061452457614524614186565b92169190910492915050565b5f8251614541818460208701614091565b9190910192915050565b5f6020828403121561455b575f80fd5b813560ff8116811461121e575f80fd5b5f6020828403121561457b575f80fd5b815161121e81613c7a56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614bb9380380614bb983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614a6c8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063b771b3bc1461028a578063bee0a03f146102b0578063fbf50cdb146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e57806398f3e2b414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806365b3a62114610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b6101286101233660046140e9565b6102d6565b005b610128610138366004614124565b610761565b61017b61014b366004614124565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004614124565b6108bd565b6101b46101af366004614124565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da36600461413b565b610940565b6101286101ed366004614154565b610cc3565b61017b61020036600461417c565b610eb4565b61017b6102133660046141a2565b610ecd565b6101b4610226366004614124565b610f00565b610128610239366004614124565b610f14565b61012861024c3660046140e9565b610f81565b61012861025f366004614154565b611053565b61017b610272366004614203565b6111f3565b61012861028536600461413b565b6111ff565b6102986005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102be366004614124565b6113bc565b6101286102d1366004614237565b61148b565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206149c083398151915291841561032857610325828561156f565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614275565b600481111561036b5761036b614275565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614275565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206149e08339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206149e08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461180b565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561050057610500614275565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d28561187f565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e919061429d565b905061066a8682611990565b5f6106768785846119d8565b5f8c815260088a01602052604090209091506106928282614354565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614435565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190614467565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020614a008339815191529291906107a9906142d8565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9614275565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610878919060040161447e565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b89190614467565b505050565b6108c681611bf5565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f805160206149c0833981519152916005600160991b019163ee5b48eb916108789160040161447e565b5f61093a64e8d4a510008361451c565b92915050565b5f80516020614a008339815191525f61095883611cc8565b90505f806109698360400151611ea9565b9150915080156109ce5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610a0057610a00614275565b6005811115610a1157610a11614275565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610a9857610a98614275565b1480610ab65750600182516005811115610ab457610ab4614275565b145b610b155760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610b2a57610b2a614275565b03610b5157505f8381526006860160205260408120600491610b4c919061407a565b610b55565b5060055b6020808301515f90815260088801909152604081205581816005811115610b7e57610b7e614275565b90816005811115610b9157610b91614275565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610bc557610bc5614275565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610c9057610c90614275565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206149c08339815191525f610cdb84611cc8565b90505f80610cec836040015161204a565b5091509150610cfa85612285565b5f8581526007850160205260408120610d129161407a565b5f610d1c8361187f565b9050816001600160401b031681608001516001600160401b03161015610d545760405162461bcd60e51b815260040161043b9061452f565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d995760405162461bcd60e51b815260040161043b90614571565b60015f87815260068701602052604090205460ff166004811115610dbf57610dbf614275565b14610e285760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a510006145ba565b5f610ed661235e565b610ee1848484612395565b9050610ef960015f80516020614a2083398151915255565b9392505050565b5f610f0a8261187f565b60a0015192915050565b610f1d81612285565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f805160206149c0833981519152916005600160991b019163ee5b48eb916108789160040161447e565b5f805160206149c08339815191525f610f998561187f565b5f86815260058401602052604090206001015460c0820151919250610fc6916001600160401b03166145d1565b4210156110315760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161043b565b831561104357611041858461156f565b505b61104c8561257f565b5050505050565b5f805160206149c08339815191525f61106b84611cc8565b90505f8061107c836040015161204a565b509150915061108a85611bf5565b5f85815260088501602052604081206110a29161407a565b5f6110ac8361187f565b9050816001600160401b031681608001516001600160401b031610156110e45760405162461bcd60e51b815260040161043b9061452f565b5f8681526006860160205260409020600301546001600160401b03808416911611156111225760405162461bcd60e51b815260040161043b90614571565b60035f87815260068701602052604090205460ff16600481111561114857611148614275565b1461119c5760405162461bcd60e51b815260206004820152603160248201525f805160206149e08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600686016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f610ef9833384612937565b5f80516020614a008339815191525f61121783611cc8565b90505f806112288360400151611ea9565b915091508061128a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f828152600585016020526040812080546112a4906142d8565b90501180156112d6575060015f83815260078601602052604090205460ff1660058111156112d4576112d4614275565b145b6112f25760405162461bcd60e51b815260040161043b906145e4565b5f828152600585016020526040812061130a9161407a565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614a00833981519152929190611404906142d8565b9050118015611436575060015f83815260078301602052604090205460ff16600581111561143457611434614275565b145b6114525760405162461bcd60e51b815260040161043b906145e4565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610878919060040161447e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806114d4575080546001600160401b03808416911610155b156114f25760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561151d8484612d6b565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115ba573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e1919081019061468e565b91509150806116445760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611687573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ab9190614467565b82511461170f5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156117855760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806117948460400151612d85565b915091508187146118015760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f80516020614a408339815191526020526040812060030180545f80516020614a00833981519152916001600160401b039091169081908461185083614776565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f80516020614a4083398151915290528390208351918201909352825491925f80516020614a0083398151915292829060ff16600581111561190757611907614275565b600581111561191857611918614275565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614a40833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5157611a1181600161479b565b611a1c9060086145ba565b5081515f90839083908110611a3357611a336147ae565b60200101906001600160f81b03191690815f1a9053506001016119fd565b505f5b6004811015611ab457611a6881600361479b565b611a739060086145ba565b6001901c60f81b82611a868360026145d1565b81518110611a9657611a966147ae565b60200101906001600160f81b03191690815f1a905350600101611a54565b505f5b6020811015611b1657611acb81601f61479b565b611ad69060086145ba565b86901c60f81b82611ae88360066145d1565b81518110611af857611af86147ae565b60200101906001600160f81b03191690815f1a905350600101611ab7565b505f5b6008811015611b8157611b2d81600761479b565b611b389060086145ba565b6001600160401b038616901c60f81b82611b538360266145d1565b81518110611b6357611b636147ae565b60200101906001600160f81b03191690815f1a905350600101611b19565b505f5b6008811015611bec57611b9881600761479b565b611ba39060086145ba565b6001600160401b038516901c60f81b82611bbe83602e6145d1565b81518110611bce57611bce6147ae565b60200101906001600160f81b03191690815f1a905350600101611b84565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f805160206149c0833981519152929190611c3d906142d8565b9050118015611c6f575060035f83815260068301602052604090205460ff166004811115611c6d57611c6d614275565b145b611cc45760405162461bcd60e51b815260206004820152603360248201525f805160206149e083398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b60408051606080820183525f8083526020830181905292820152905f80516020614a008339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d3d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d64919081019061468e565b9150915080611dcb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e2e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ea15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f808251602714611ecc5760405162461bcd60e51b815260040161043b906147c2565b5f805b6002811015611f1b57611ee381600161479b565b611eee9060086145ba565b61ffff16858281518110611f0457611f046147ae565b016020015160f81c901b9190911790600101611ecf565b5061ffff811615611f3e5760405162461bcd60e51b815260040161043b9061480b565b5f805b6004811015611f9957611f5581600361479b565b611f609060086145ba565b63ffffffff1686611f728360026145d1565b81518110611f8257611f826147ae565b016020015160f81c901b9190911790600101611f41565b5063ffffffff8116600214611fc05760405162461bcd60e51b815260040161043b9061484e565b5f805b602081101561201557611fd781601f61479b565b611fe29060086145ba565b87611fee8360066145d1565b81518110611ffe57611ffe6147ae565b016020015160f81c901b9190911790600101611fc3565b505f8660268151811061202a5761202a6147ae565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461206e5760405162461bcd60e51b815260040161043b906147c2565b5f805b60028110156120bd5761208581600161479b565b6120909060086145ba565b61ffff168682815181106120a6576120a66147ae565b016020015160f81c901b9190911790600101612071565b5061ffff8116156120e05760405162461bcd60e51b815260040161043b9061480b565b5f805b600481101561213b576120f781600361479b565b6121029060086145ba565b63ffffffff16876121148360026145d1565b81518110612124576121246147ae565b016020015160f81c901b91909117906001016120e3565b5063ffffffff81166003146121625760405162461bcd60e51b815260040161043b9061484e565b5f805b60208110156121b75761217981601f61479b565b6121849060086145ba565b886121908360066145d1565b815181106121a0576121a06147ae565b016020015160f81c901b9190911790600101612165565b505f805b6008811015612216576121cf81600761479b565b6121da9060086145ba565b6001600160401b0316896121ef8360266145d1565b815181106121ff576121ff6147ae565b016020015160f81c901b91909117906001016121bb565b505f805b60088110156122755761222e81600761479b565b6122399060086145ba565b6001600160401b03168a61224e83602e6145d1565b8151811061225e5761225e6147ae565b016020015160f81c901b919091179060010161221a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f805160206149c08339815191529291906122cd906142d8565b90501180156122ff575060015f83815260068301602052604090205460ff1660048111156122fd576122fd614275565b145b611cc45760405162461bcd60e51b815260206004820152603860248201525f805160206149e083398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f80516020614a2083398151915280546001190161238f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206149c0833981519152906001600160401b03166020850135101561243c5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161043b565b6003810154843510156124a55760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161043b565b805483108015906124ba575080600101548311155b6125185760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61252284612f5d565b90505f61252e8261092a565b90505f61253b8883612f93565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f80516020614a2083398151915255565b5f8181525f80516020614a4083398151915260205260408082208151610100810190925280545f80516020614a0083398151915293929190829060ff1660058111156125cd576125cd614275565b60058111156125de576125de614275565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561266657612666614275565b146126c25760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461273c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6127498160a00151613460565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561278d5761278d614275565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612859846128538161180b565b5f6119d8565b5f85815260068501602052604090209091506128758282614354565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128a2908590600401614435565b6020604051808303815f875af11580156128be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128e29190614467565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61294061235e565b5f805160206149c08339815191525f61295b6101af85612f5d565b90505f6129678761187f565b905060028151600581111561297e5761297e614275565b146129dd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f828260a001516129ee9190614895565b60048501546001860154919250612a10916001600160401b03909116906145ba565b612a1982610eb4565b1115612a855760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161043b565b612a8f8882611990565b5f612a998961180b565b90505f8982604051602001612ac592919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612ae685613460565b5f612af28b84866119d8565b5f8381526007890160205260409020909150612b0e8282614354565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b3b908590600401614435565b6020604051808303815f875af1158015612b57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7b9190614467565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c2a57612c2a614275565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610ef960015f80516020614a2083398151915255565b612d73613601565b612d7c8261364c565b611cc4816136aa565b5f808251602e14612da85760405162461bcd60e51b815260040161043b906147c2565b5f805b6002811015612df757612dbf81600161479b565b612dca9060086145ba565b61ffff16858281518110612de057612de06147ae565b016020015160f81c901b9190911790600101612dab565b5061ffff811615612e1a5760405162461bcd60e51b815260040161043b9061480b565b5f805b6004811015612e7557612e3181600361479b565b612e3c9060086145ba565b63ffffffff1686612e4e8360026145d1565b81518110612e5e57612e5e6147ae565b016020015160f81c901b9190911790600101612e1d565b5063ffffffff8116600414612e9c5760405162461bcd60e51b815260040161043b9061484e565b5f805b6020811015612ef157612eb381601f61479b565b612ebe9060086145ba565b87612eca8360066145d1565b81518110612eda57612eda6147ae565b016020015160f81c901b9190911790600101612e9f565b505f805b6008811015612f5057612f0981600761479b565b612f149060086145ba565b6001600160401b031688612f298360266145d1565b81518110612f3957612f396147ae565b016020015160f81c901b9190911790600101612ef5565b5090969095509350505050565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061375e565b5f5f80516020614a0083398151915242612fb3604086016020870161417c565b6001600160401b0316118015612fec5750612fd4604085016020860161417c565b6001600160401b0316612fea426202a3006145d1565b115b61304e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b83356130a65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b83355f908152600882016020526040902054156131165760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b61312360408501856148b5565b905060301461318a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b61319383613460565b5f8061322d6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906131d8919061417c565b6001600160401b031681526020016131f360408a018a6148b5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506138c0565b5f8281526005860160205260409020919350915061324b8282614354565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613278908590600401614435565b6020604051808303815f875af1158015613294573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132b89190614467565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561333a5761333a614275565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556133fb8361180b565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961343260408d0160208e0161417c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614a008339815191529060ff165f0361349e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906134e6908361479b565b10613502576001600160401b0384166040830152808252613521565b83826040018181516135149190614895565b6001600160401b03169052505b5f82602001518360400151606461353891906148fe565b6135429190614929565b600285015490915060ff90811690821611156135bd5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661364a57604051631afcd79f60e31b815260040160405180910390fd5b565b613654613601565b61365d81613c65565b6136a76060820135608083013561367a60c0850160a0860161417c565b60c0850135613690610100870160e0880161417c565b6136a26101208801610100890161494e565b613c86565b50565b6136b2613601565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661373e5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156137a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c89190614467565b90506137df6001600160a01b038516333086613e3a565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613823573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138479190614467565b90508181116138ad5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b6138b7828261479b565b95945050505050565b5f606082608001515160301461392a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156139a15761396181600161479b565b61396c9060086145ba565b5081515f90839083908110613983576139836147ae565b60200101906001600160f81b03191690815f1a90535060010161394d565b505f5b60048110156139ff576139b881600361479b565b6139c39060086145ba565b505f826139d18360026145d1565b815181106139e1576139e16147ae565b60200101906001600160f81b03191690815f1a9053506001016139a4565b505f5b6020811015613a5c5784518160208110613a1e57613a1e6147ae565b1a60f81b82613a2e8360066145d1565b81518110613a3e57613a3e6147ae565b60200101906001600160f81b03191690815f1a905350600101613a02565b505f5b6020811015613abc5784602001518160208110613a7e57613a7e6147ae565b1a60f81b82613a8e8360266145d1565b81518110613a9e57613a9e6147ae565b60200101906001600160f81b03191690815f1a905350600101613a5f565b505f5b6008811015613b3057613ad381600761479b565b613ade9060086145ba565b60ff1685604001516001600160401b0316901c60f81b82826046613b0291906145d1565b81518110613b1257613b126147ae565b60200101906001600160f81b03191690815f1a905350600101613abf565b505f5b6030811015613b9b5784608001518181518110613b5257613b526147ae565b01602001516001600160f81b03191682613b6d83604e6145d1565b81518110613b7d57613b7d6147ae565b60200101906001600160f81b03191690815f1a905350600101613b33565b505f5b6008811015613c0d57613bb281600761479b565b613bbd9060086145ba565b60608601516001600160401b0390811691161c60f81b82613bdf83607e6145d1565b81518110613bef57613bef6147ae565b60200101906001600160f81b03191690815f1a905350600101613b9e565b50600281604051613c1e9190614969565b602060405180830381855afa158015613c39573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c5c9190614467565b94909350915050565b613c6d613601565b613c75613e9a565b613c7d613eaa565b6136a781613eb2565b613c8e613601565b5f805160206149c083398151915283613cfa5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161043b565b85871115613d625760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161043b565b5f836001600160401b031611613dd55760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161043b565b95865560018601949094556002850180546001600160401b0394851667ffffffffffffffff199091161790556003850191909155600490930180546001600160a01b03909316600160401b026001600160e01b03199093169390911692909217179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613e94908590613f1e565b50505050565b613ea2613601565b61364a613f7f565b61364a613601565b613eba613601565b80355f80516020614a0083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613f046060830160408401614984565b600291909101805460ff191660ff90921691909117905550565b5f613f326001600160a01b03841683613f87565b905080515f14158015613f56575080806020019051810190613f5491906149a4565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b61256c613601565b6060610ef983835f845f80856001600160a01b03168486604051613fab9190614969565b5f6040518083038185875af1925050503d805f8114613fe5576040519150601f19603f3d011682016040523d82523d5f602084013e613fea565b606091505b509150915061180186838360608261400a5761400582614051565b610ef9565b815115801561402157506001600160a01b0384163b155b1561404a57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610ef9565b8051156140615780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614086906142d8565b5f825580601f10614095575050565b601f0160209004905f5260205f20908101906136a791905b808211156140c0575f81556001016140ad565b5090565b80151581146136a7575f80fd5b803563ffffffff811681146140e4575f80fd5b919050565b5f805f606084860312156140fb575f80fd5b83359250602084013561410d816140c4565b915061411b604085016140d1565b90509250925092565b5f60208284031215614134575f80fd5b5035919050565b5f6020828403121561414b575f80fd5b610ef9826140d1565b5f8060408385031215614165575f80fd5b61416e836140d1565b946020939093013593505050565b5f6020828403121561418c575f80fd5b81356001600160401b0381168114610ef9575f80fd5b5f805f83850360808112156141b5575f80fd5b84356001600160401b038111156141ca575f80fd5b8501606081880312156141db575f80fd5b93506040601f19820112156141ee575f80fd5b50602084019150606084013590509250925092565b5f8060408385031215614214575f80fd5b50508035926020909101359150565b6001600160a01b03811681146136a7575f80fd5b5f8082840361014081121561424a575f80fd5b61012080821215614259575f80fd5b849350830135905061426a81614223565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156142bd576142bd614289565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806142ec57607f821691505b60208210810361430a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156143355750805b601f840160051c820191505b8181101561104c575f8155600101614341565b81516001600160401b0381111561436d5761436d6142c4565b6143818161437b84546142d8565b84614310565b602080601f8311600181146143b4575f841561439d5750858301515b5f19600386901b1c1916600185901b17855561440b565b5f85815260208120601f198616915b828110156143e2578886015182559484019460019091019084016143c3565b50858210156143ff57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561442d578181015183820152602001614415565b50505f910152565b602081525f8251806020840152614453816040850160208701614413565b601f01601f19169190910160400192915050565b5f60208284031215614477575f80fd5b5051919050565b5f60208083525f8454614490816142d8565b806020870152604060018084165f81146144b157600181146144cd576144fa565b60ff19851660408a0152604084151560051b8a010195506144fa565b895f5260205f205f5b858110156144f15781548b82018601529083019088016144d6565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261452a5761452a614508565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a614289565b8082018082111561093a5761093a614289565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b038111828210171561464d5761464d6142c4565b60405290565b604051601f8201601f191681016001600160401b038111828210171561467b5761467b6142c4565b604052919050565b80516140e4816140c4565b5f806040838503121561469f575f80fd5b82516001600160401b03808211156146b5575f80fd5b90840190606082870312156146c8575f80fd5b6146d061462b565b825181526020808401516146e381614223565b828201526040840151838111156146f8575f80fd5b80850194505087601f85011261470c575f80fd5b83518381111561471e5761471e6142c4565b614730601f8201601f19168301614653565b93508084528882828701011115614745575f80fd5b61475481838601848801614413565b50826040830152819550614769818801614683565b9450505050509250929050565b5f6001600160401b0380831681810361479157614791614289565b6001019392505050565b8181038181111561093a5761093a614289565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156142bd576142bd614289565b5f808335601e198436030181126148ca575f80fd5b8301803591506001600160401b038211156148e3575f80fd5b6020019150368190038213156148f7575f80fd5b9250929050565b6001600160401b0381811683821602808216919082811461492157614921614289565b505092915050565b5f6001600160401b038084168061494257614942614508565b92169190910492915050565b5f6020828403121561495e575f80fd5b8135610ef981614223565b5f825161497a818460208701614413565b9190910192915050565b5f60208284031215614994575f80fd5b813560ff81168114610ef9575f80fd5b5f602082840312156149b4575f80fd5b8151610ef9816140c456fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -457,23 +472,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x27f39ca8. +// Initialize is a paid mutator transaction binding the contract method 0xfbf50cdb. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint64,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 0x27f39ca8. +// Initialize is a paid mutator transaction binding the contract method 0xfbf50cdb. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint64,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 0x27f39ca8. +// Initialize is a paid mutator transaction binding the contract method 0xfbf50cdb. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint64,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) } @@ -541,25 +556,25 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init return _ERC20TokenStakingManager.Contract.InitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x872fda64. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x65b3a621. // -// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", stakeAmount, nodeID, registrationExpiry, blsPublicKey) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint256,uint256) requirements, uint256 stakeAmount) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, requirements, stakeAmount) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x872fda64. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x65b3a621. // -// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, blsPublicKey) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint256,uint256) requirements, uint256 stakeAmount) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, requirements, stakeAmount) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x872fda64. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x65b3a621. // -// Solidity: function initializeValidatorRegistration(uint256 stakeAmount, bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(stakeAmount *big.Int, nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, stakeAmount, nodeID, registrationExpiry, blsPublicKey) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint256,uint256) requirements, uint256 stakeAmount) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, requirements, stakeAmount) } // ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. diff --git a/abi-bindings/go/validatormanager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go similarity index 68% rename from abi-bindings/go/validatormanager/NativeTokenStakingManager/NativeTokenStakingManager.go rename to abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 511df487d..b369a13e0 100644 --- a/abi-bindings/go/validatormanager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -31,11 +31,19 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { - BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int - MinimumStakeDuration uint64 - RewardCalculator common.Address + BaseSettings ValidatorManagerSettings + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + MinimumStakeDuration uint64 + MinimumDelegationFee *big.Int + MaximumStakeMultiplier uint64 + RewardCalculator common.Address +} + +// PoSValidatorRequirements is an auto generated low-level Go binding around an user-defined struct. +type PoSValidatorRequirements struct { + DelegationFee *big.Int + MinStakeDuration *big.Int } // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. @@ -45,10 +53,17 @@ type ValidatorManagerSettings struct { MaximumHourlyChurn uint8 } +// ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. +type ValidatorRegistrationInput struct { + NodeID [32]byte + RegistrationExpiry uint64 + BlsPublicKey []byte +} + // 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516143a83803806143a883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61425b8061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613914565b610389565b005b348015610134575f80fd5b5061012761014336600461394f565b61046b565b348015610153575f80fd5b5061012761016236600461398a565b6108f6565b348015610172575f80fd5b506101b161018136600461398a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de36600461398a565b610a52565b3480156101ee575f80fd5b506102026101fd36600461398a565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b506101276102343660046139a1565b610ad5565b348015610244575f80fd5b506101276102533660046139ba565b610e58565b348015610263575f80fd5b506101b16102723660046139f8565b611049565b348015610282575f80fd5b5061020261029136600461398a565b611062565b3480156102a1575f80fd5b506101276102b036600461398a565b611076565b3480156102c0575f80fd5b506101276102cf36600461394f565b6110e3565b3480156102df575f80fd5b506101276102ee3660046139ba565b6110fe565b3480156102fe575f80fd5b5061012761030d3660046139a1565b61129e565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e36600461398a565b61145b565b6101b161037136600461398a565b61152a565b6101b1610384366004613aa3565b611536565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a8361155a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206141af8339815191529184156104bd576104ba828561156e565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613b35565b600481111561050057610500613b35565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613b35565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f805160206141cf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f805160206141cf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f6106488461180a565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613b35565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107678561187e565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613b5d565b90506107ff868261198f565b5f61080b8785846119d7565b5f8c815260058a01602052604090209091506108278282613c01565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613ce2565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613d14565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206141ef83398151915292919061093e90613b84565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613b35565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613d2b565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613d14565b505050565b610a5b81611bf4565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206141af833981519152916005600160991b019163ee5b48eb91610a0d91600401613d2b565b5f610acf64e8d4a5100083613dc9565b92915050565b5f805160206141ef8339815191525f610aed83611cc7565b90505f80610afe8360400151611ea8565b915091508015610b635760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610b9557610b95613b35565b6005811115610ba657610ba6613b35565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c2d57610c2d613b35565b1480610c4b5750600182516005811115610c4957610c49613b35565b145b610caa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115610cbf57610cbf613b35565b03610ce657505f8381526006860160205260408120600491610ce191906138ca565b610cea565b5060055b6020808301515f90815260088801909152604081205581816005811115610d1357610d13613b35565b90816005811115610d2657610d26613b35565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610d5a57610d5a613b35565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610e2557610e25613b35565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206141af8339815191525f610e7084611cc7565b90505f80610e818360400151612049565b5091509150610e8f85612284565b5f8581526004850160205260408120610ea7916138ca565b5f610eb18361187e565b9050816001600160401b031681608001516001600160401b03161015610ee95760405162461bcd60e51b81526004016105d090613ddc565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610f2e5760405162461bcd60e51b81526004016105d090613e1e565b60015f87815260038701602052604090205460ff166004811115610f5457610f54613b35565b14610fbd5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000613e67565b5f61106c8261187e565b60a0015192915050565b61107f81612284565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206141af833981519152916005600160991b019163ee5b48eb91610a0d91600401613d2b565b81156110f5576110f3838261156e565b505b610a4d8361235d565b5f805160206141af8339815191525f61111684611cc7565b90505f806111278360400151612049565b509150915061113585611bf4565b5f858152600585016020526040812061114d916138ca565b5f6111578361187e565b9050816001600160401b031681608001516001600160401b0316101561118f5760405162461bcd60e51b81526004016105d090613ddc565b5f8681526003808701602052604090912001546001600160401b03808416911611156111cd5760405162461bcd60e51b81526004016105d090613e1e565b60035f87815260038701602052604090205460ff1660048111156111f3576111f3613b35565b146112475760405162461bcd60e51b815260206004820152603160248201525f805160206141cf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f868152600386016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206141ef8339815191525f6112b683611cc7565b90505f806112c78360400151611ea8565b91509150806113295760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f8281526005850160205260408120805461134390613b84565b9050118015611375575060015f83815260078601602052604090205460ff16600581111561137357611373613b35565b145b6113915760405162461bcd60e51b81526004016105d090613e7e565b5f82815260058501602052604081206113a9916138ca565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206141ef8339815191529291906114a390613b84565b90501180156114d5575060015f83815260078301602052604090205460ff1660058111156114d3576114d3613b35565b145b6114f15760405162461bcd60e51b81526004016105d090613e7e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613d2b565b5f610acf823334612715565b5f8061154134612acd565b905061154f85828686612b77565b9150505b9392505050565b611562612fcc565b61156b81613017565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115b9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e09190810190613ee4565b91509150806116435760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611686573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116aa9190613d14565b82511461170e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b0316156117845760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f80611793846040015161305a565b915091508187146118005760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f8051602061422f8339815191526020526040812060030180545f805160206141ef833981519152916001600160401b039091169081908461184f83613fb6565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061422f83398151915290528390208351918201909352825491925f805160206141ef83398151915292829060ff16600581111561190657611906613b35565b600581111561191757611917613b35565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061422f833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5057611a10816001613fdb565b611a1b906008613e67565b5081515f90839083908110611a3257611a32613fee565b60200101906001600160f81b03191690815f1a9053506001016119fc565b505f5b6004811015611ab357611a67816003613fdb565b611a72906008613e67565b6001901c60f81b82611a85836002614002565b81518110611a9557611a95613fee565b60200101906001600160f81b03191690815f1a905350600101611a53565b505f5b6020811015611b1557611aca81601f613fdb565b611ad5906008613e67565b86901c60f81b82611ae7836006614002565b81518110611af757611af7613fee565b60200101906001600160f81b03191690815f1a905350600101611ab6565b505f5b6008811015611b8057611b2c816007613fdb565b611b37906008613e67565b6001600160401b038616901c60f81b82611b52836026614002565b81518110611b6257611b62613fee565b60200101906001600160f81b03191690815f1a905350600101611b18565b505f5b6008811015611beb57611b97816007613fdb565b611ba2906008613e67565b6001600160401b038516901c60f81b82611bbd83602e614002565b81518110611bcd57611bcd613fee565b60200101906001600160f81b03191690815f1a905350600101611b83565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206141af833981519152929190611c3c90613b84565b9050118015611c6e575060035f83815260038301602052604090205460ff166004811115611c6c57611c6c613b35565b145b611cc35760405162461bcd60e51b815260206004820152603360248201525f805160206141cf83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206141ef8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d3c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d639190810190613ee4565b9150915080611dca5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611e2d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611ea05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f808251602714611ecb5760405162461bcd60e51b81526004016105d090614015565b5f805b6002811015611f1a57611ee2816001613fdb565b611eed906008613e67565b61ffff16858281518110611f0357611f03613fee565b016020015160f81c901b9190911790600101611ece565b5061ffff811615611f3d5760405162461bcd60e51b81526004016105d09061405e565b5f805b6004811015611f9857611f54816003613fdb565b611f5f906008613e67565b63ffffffff1686611f71836002614002565b81518110611f8157611f81613fee565b016020015160f81c901b9190911790600101611f40565b5063ffffffff8116600214611fbf5760405162461bcd60e51b81526004016105d0906140a1565b5f805b602081101561201457611fd681601f613fdb565b611fe1906008613e67565b87611fed836006614002565b81518110611ffd57611ffd613fee565b016020015160f81c901b9190911790600101611fc2565b505f8660268151811061202957612029613fee565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461206d5760405162461bcd60e51b81526004016105d090614015565b5f805b60028110156120bc57612084816001613fdb565b61208f906008613e67565b61ffff168682815181106120a5576120a5613fee565b016020015160f81c901b9190911790600101612070565b5061ffff8116156120df5760405162461bcd60e51b81526004016105d09061405e565b5f805b600481101561213a576120f6816003613fdb565b612101906008613e67565b63ffffffff1687612113836002614002565b8151811061212357612123613fee565b016020015160f81c901b91909117906001016120e2565b5063ffffffff81166003146121615760405162461bcd60e51b81526004016105d0906140a1565b5f805b60208110156121b65761217881601f613fdb565b612183906008613e67565b8861218f836006614002565b8151811061219f5761219f613fee565b016020015160f81c901b9190911790600101612164565b505f805b6008811015612215576121ce816007613fdb565b6121d9906008613e67565b6001600160401b0316896121ee836026614002565b815181106121fe576121fe613fee565b016020015160f81c901b91909117906001016121ba565b505f805b60088110156122745761222d816007613fdb565b612238906008613e67565b6001600160401b03168a61224d83602e614002565b8151811061225d5761225d613fee565b016020015160f81c901b9190911790600101612219565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206141af8339815191529291906122cc90613b84565b90501180156122fe575060015f83815260038301602052604090205460ff1660048111156122fc576122fc613b35565b145b611cc35760405162461bcd60e51b815260206004820152603860248201525f805160206141cf83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f8051602061422f83398151915260205260408082208151610100810190925280545f805160206141ef83398151915293929190829060ff1660058111156123ab576123ab613b35565b60058111156123bc576123bc613b35565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561244457612444613b35565b146124a05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461251a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6125278160a00151613232565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561256b5761256b613b35565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612637846126318161180a565b5f6119d7565b5f85815260068501602052604090209091506126538282613c01565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612680908590600401613ce2565b6020604051808303815f875af115801561269c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126c09190613d14565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61271e6133d3565b5f61272883610abf565b90505f805160206141af8339815191525f6127428761187e565b905060028151600581111561275957612759613b35565b146127b85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a001516127c991906140e8565b90506127d5888261198f565b5f6127df8961180a565b90505f8989836040516020016128279392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b60405160208183030381529060405280519060200120905061284886613232565b5f6128548b84866119d7565b5f83815260048801602052604090209091506128708282613c01565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061289d908590600401613ce2565b6020604051808303815f875af11580156128b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128dd9190613d14565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff0219169083600481111561298c5761298c613b35565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061155360015f8051602061420f83398151915255565b5f5f805160206141af8339815191528282612ae782610abf565b83549091506001600160401b03821610801590612b1157508260010154816001600160401b031611155b612b6f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612b806133d3565b5f805160206141ef833981519152426001600160401b038516118015612bba57506001600160401b038416612bb8426202a300614002565b115b612c1c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612c735760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612ce15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612d485760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612d5185613232565b5f80612d986040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061341d565b5f82815260058601602052604090209193509150612db68282613c01565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612de3908590600401613ce2565b6020604051808303815f875af1158015612dff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e239190613d14565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612ea557612ea5613b35565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612f668361180a565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612b6f60015f8051602061420f83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661301557604051631afcd79f60e31b815260040160405180910390fd5b565b61301f612fcc565b613028816137c2565b61156b6060820135608083013561304560c0850160a086016139f8565b61305560e0860160c08701614108565b6137e3565b5f808251602e1461307d5760405162461bcd60e51b81526004016105d090614015565b5f805b60028110156130cc57613094816001613fdb565b61309f906008613e67565b61ffff168582815181106130b5576130b5613fee565b016020015160f81c901b9190911790600101613080565b5061ffff8116156130ef5760405162461bcd60e51b81526004016105d09061405e565b5f805b600481101561314a57613106816003613fdb565b613111906008613e67565b63ffffffff1686613123836002614002565b8151811061313357613133613fee565b016020015160f81c901b91909117906001016130f2565b5063ffffffff81166004146131715760405162461bcd60e51b81526004016105d0906140a1565b5f805b60208110156131c65761318881601f613fdb565b613193906008613e67565b8761319f836006614002565b815181106131af576131af613fee565b016020015160f81c901b9190911790600101613174565b505f805b6008811015613225576131de816007613fdb565b6131e9906008613e67565b6001600160401b0316886131fe836026614002565b8151811061320e5761320e613fee565b016020015160f81c901b91909117906001016131ca565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206141ef8339815191529060ff165f03613270575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132b89083613fdb565b106132d4576001600160401b03841660408301528082526132f3565b83826040018181516132e691906140e8565b6001600160401b03169052505b5f82602001518360400151606461330a9190614123565b613314919061414e565b600285015490915060ff908116908216111561338f5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061420f83398151915280546001190161340457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061420f83398151915255565b5f60608260800151516030146134875760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156134fe576134be816001613fdb565b6134c9906008613e67565b5081515f908390839081106134e0576134e0613fee565b60200101906001600160f81b03191690815f1a9053506001016134aa565b505f5b600481101561355c57613515816003613fdb565b613520906008613e67565b505f8261352e836002614002565b8151811061353e5761353e613fee565b60200101906001600160f81b03191690815f1a905350600101613501565b505f5b60208110156135b9578451816020811061357b5761357b613fee565b1a60f81b8261358b836006614002565b8151811061359b5761359b613fee565b60200101906001600160f81b03191690815f1a90535060010161355f565b505f5b602081101561361957846020015181602081106135db576135db613fee565b1a60f81b826135eb836026614002565b815181106135fb576135fb613fee565b60200101906001600160f81b03191690815f1a9053506001016135bc565b505f5b600881101561368d57613630816007613fdb565b61363b906008613e67565b60ff1685604001516001600160401b0316901c60f81b8282604661365f9190614002565b8151811061366f5761366f613fee565b60200101906001600160f81b03191690815f1a90535060010161361c565b505f5b60308110156136f857846080015181815181106136af576136af613fee565b01602001516001600160f81b031916826136ca83604e614002565b815181106136da576136da613fee565b60200101906001600160f81b03191690815f1a905350600101613690565b505f5b600881101561376a5761370f816007613fdb565b61371a906008613e67565b60608601516001600160401b0390811691161c60f81b8261373c83607e614002565b8151811061374c5761374c613fee565b60200101906001600160f81b03191690815f1a9053506001016136fb565b5060028160405161377b9190614173565b602060405180830381855afa158015613796573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906137b99190613d14565b94909350915050565b6137ca612fcc565b6137d261383e565b6137da61384e565b61156b81613856565b6137eb612fcc565b5f5f805160206141af833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613846612fcc565b6130156138c2565b613015612fcc565b61385e612fcc565b80355f805160206141ef83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556138a8606083016040840161418e565b600291909101805460ff191660ff90921691909117905550565b61340a612fcc565b5080546138d690613b84565b5f825580601f106138e5575050565b601f0160209004905f5260205f209081019061156b91905b80821115613910575f81556001016138fd565b5090565b5f60e08284031215613924575f80fd5b50919050565b801515811461156b575f80fd5b803563ffffffff8116811461394a575f80fd5b919050565b5f805f60608486031215613961575f80fd5b8335925060208401356139738161392a565b915061398160408501613937565b90509250925092565b5f6020828403121561399a575f80fd5b5035919050565b5f602082840312156139b1575f80fd5b61155382613937565b5f80604083850312156139cb575f80fd5b6139d483613937565b946020939093013593505050565b80356001600160401b038116811461394a575f80fd5b5f60208284031215613a08575f80fd5b611553826139e2565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613a4757613a47613a11565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613a7557613a75613a11565b604052919050565b5f6001600160401b03821115613a9557613a95613a11565b50601f01601f191660200190565b5f805f60608486031215613ab5575f80fd5b83359250613ac5602085016139e2565b915060408401356001600160401b03811115613adf575f80fd5b8401601f81018613613aef575f80fd5b8035613b02613afd82613a7d565b613a4d565b818152876020838501011115613b16575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613b7d57613b7d613b49565b5092915050565b600181811c90821680613b9857607f821691505b60208210810361392457634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613bdb5750805b601f840160051c820191505b81811015613bfa575f8155600101613be7565b5050505050565b81516001600160401b03811115613c1a57613c1a613a11565b613c2e81613c288454613b84565b84613bb6565b602080601f831160018114613c61575f8415613c4a5750858301515b5f19600386901b1c1916600185901b178555613cb8565b5f85815260208120601f198616915b82811015613c8f57888601518255948401946001909101908401613c70565b5085821015613cac57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613cda578181015183820152602001613cc2565b50505f910152565b602081525f8251806020840152613d00816040850160208701613cc0565b601f01601f19169190910160400192915050565b5f60208284031215613d24575f80fd5b5051919050565b5f60208083525f8454613d3d81613b84565b806020870152604060018084165f8114613d5e5760018114613d7a57613da7565b60ff19851660408a0152604084151560051b8a01019550613da7565b895f5260205f205f5b85811015613d9e5781548b8201860152908301908801613d83565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613dd757613dd7613db5565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613b49565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b038116811461156b575f80fd5b805161394a8161392a565b5f8060408385031215613ef5575f80fd5b82516001600160401b0380821115613f0b575f80fd5b9084019060608287031215613f1e575f80fd5b613f26613a25565b82518152602080840151613f3981613ec5565b82820152604084015183811115613f4e575f80fd5b80850194505087601f850112613f62575f80fd5b83519250613f72613afd84613a7d565b8381528882858701011115613f85575f80fd5b613f9484838301848801613cc0565b80604084015250819550613fa9818801613ed9565b9450505050509250929050565b5f6001600160401b03808316818103613fd157613fd1613b49565b6001019392505050565b81810381811115610acf57610acf613b49565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613b49565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613b7d57613b7d613b49565b5f60208284031215614118575f80fd5b813561155381613ec5565b6001600160401b0381811683821602808216919082811461414657614146613b49565b505092915050565b5f6001600160401b038084168061416757614167613db5565b92169190910492915050565b5f8251614184818460208701613cc0565b9190910192915050565b5f6020828403121561419e575f80fd5b813560ff81168114611553575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516147df3803806147df83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146928061014d5f395ff3fe608060405260043610610105575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102e8578063b771b3bc14610307578063bee0a03f14610339578063c599e24f14610358578063dac806231461036b575f80fd5b806366435abf1461026c5780636d0e43fa1461028b57806376f78621146102aa57806398f3e2b4146102c9575f80fd5b8063162f1f61116100d8578063162f1f61146101b95780632e2194d8146101d8578063467ef06f1461020f5780635297fae61461022e578063620658561461024d575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063104595c4146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613d7f565b61038a565b005b348015610135575f80fd5b50610128610144366004613dba565b610815565b348015610154575f80fd5b50610193610163366004613dba565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101936101b4366004613dd1565b610971565b3480156101c4575f80fd5b506101286101d3366004613dba565b6109a3565b3480156101e3575f80fd5b506101f76101f2366004613dba565b610a10565b6040516001600160401b03909116815260200161019d565b34801561021a575f80fd5b50610128610229366004613e2a565b610a20565b348015610239575f80fd5b50610128610248366004613e43565b610da3565b348015610258575f80fd5b50610193610267366004613e6b565b610f94565b348015610277575f80fd5b506101f7610286366004613dba565b610fad565b348015610296575f80fd5b506101286102a5366004613dba565b610fc1565b3480156102b5575f80fd5b506101286102c4366004613d7f565b61102e565b3480156102d4575f80fd5b506101286102e3366004613e43565b611100565b3480156102f3575f80fd5b50610128610302366004613e2a565b6112a0565b348015610312575f80fd5b506103216005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610344575f80fd5b50610128610353366004613dba565b61145d565b610193610366366004613dba565b61152c565b348015610376575f80fd5b50610128610385366004613e91565b611538565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206145e68339815191529184156103dc576103d9828561161a565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613ea8565b600481111561041f5761041f613ea8565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613ea8565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206146068339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206146068339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f610567846118b6565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613ea8565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106868561192a565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107129190613ed0565b905061071e8682611a3b565b5f61072a878584611a83565b5f8c815260088a01602052604090209091506107468282613f81565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610773908590600401614062565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190614094565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061462683398151915292919061085d90613f0b565b905011801561088f575060035f83815260078301602052604090205460ff16600581111561088d5761088d613ea8565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c91906004016140ab565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190614094565b505050565b5f61097a611ca2565b610985838334611cd9565b905061099d60015f8051602061464683398151915255565b92915050565b6109ac81611eb8565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f805160206145e6833981519152916005600160991b019163ee5b48eb9161092c916004016140ab565b5f61099d64e8d4a5100083614149565b5f805160206146268339815191525f610a3883611f8b565b90505f80610a49836040015161216c565b915091508015610aae5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610ae057610ae0613ea8565b6005811115610af157610af1613ea8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b7857610b78613ea8565b1480610b965750600182516005811115610b9457610b94613ea8565b145b610bf55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115610c0a57610c0a613ea8565b03610c3157505f8381526006860160205260408120600491610c2c9190613d10565b610c35565b5060055b6020808301515f90815260088801909152604081205581816005811115610c5e57610c5e613ea8565b90816005811115610c7157610c71613ea8565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ca557610ca5613ea8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d7057610d70613ea8565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145e68339815191525f610dbb84611f8b565b90505f80610dcc836040015161230d565b5091509150610dda85612548565b5f8581526007850160205260408120610df291613d10565b5f610dfc8361192a565b9050816001600160401b031681608001516001600160401b03161015610e345760405162461bcd60e51b81526004016104ef9061415c565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e795760405162461bcd60e51b81526004016104ef9061419e565b60015f87815260068701602052604090205460ff166004811115610e9f57610e9f613ea8565b14610f085760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61099d6001600160401b03831664e8d4a510006141e7565b5f610fb78261192a565b60a0015192915050565b610fca81612548565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f805160206145e6833981519152916005600160991b019163ee5b48eb9161092c916004016140ab565b5f805160206145e68339815191525f6110468561192a565b5f86815260058401602052604090206001015460c0820151919250611073916001600160401b03166141fe565b4210156110de5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104ef565b83156110f0576110ee858461161a565b505b6110f985612621565b5050505050565b5f805160206145e68339815191525f61111884611f8b565b90505f80611129836040015161230d565b509150915061113785611eb8565b5f858152600885016020526040812061114f91613d10565b5f6111598361192a565b9050816001600160401b031681608001516001600160401b031610156111915760405162461bcd60e51b81526004016104ef9061415c565b5f8681526006860160205260409020600301546001600160401b03808416911611156111cf5760405162461bcd60e51b81526004016104ef9061419e565b60035f87815260068701602052604090205460ff1660048111156111f5576111f5613ea8565b146112495760405162461bcd60e51b815260206004820152603160248201525f805160206146068339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f868152600686016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206146268339815191525f6112b883611f8b565b90505f806112c9836040015161216c565b915091508061132b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526005850160205260408120805461134590613f0b565b9050118015611377575060015f83815260078601602052604090205460ff16600581111561137557611375613ea8565b145b6113935760405162461bcd60e51b81526004016104ef90614211565b5f82815260058501602052604081206113ab91613d10565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206146268339815191529291906114a590613f0b565b90501180156114d7575060015f83815260078301602052604090205460ff1660058111156114d5576114d5613ea8565b145b6114f35760405162461bcd60e51b81526004016104ef90614211565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c91906004016140ab565b5f61099d8233346129d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611581575080546001600160401b03808416911610155b1561159f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556115c983612e0a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611665573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261168c91908101906142cf565b91509150806116ef5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611732573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117569190614094565b8251146117ba5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156118305760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f8061183f8460400151612e1e565b915091508187146118ac5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206146668339815191526020526040812060030180545f80516020614626833981519152916001600160401b03909116908190846118fb836143b7565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061466683398151915290528390208351918201909352825491925f8051602061462683398151915292829060ff1660058111156119b2576119b2613ea8565b60058111156119c3576119c3613ea8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614666833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611afc57611abc8160016143dc565b611ac79060086141e7565b5081515f90839083908110611ade57611ade6143ef565b60200101906001600160f81b03191690815f1a905350600101611aa8565b505f5b6004811015611b5f57611b138160036143dc565b611b1e9060086141e7565b6001901c60f81b82611b318360026141fe565b81518110611b4157611b416143ef565b60200101906001600160f81b03191690815f1a905350600101611aff565b505f5b6020811015611bc157611b7681601f6143dc565b611b819060086141e7565b86901c60f81b82611b938360066141fe565b81518110611ba357611ba36143ef565b60200101906001600160f81b03191690815f1a905350600101611b62565b505f5b6008811015611c2c57611bd88160076143dc565b611be39060086141e7565b6001600160401b038616901c60f81b82611bfe8360266141fe565b81518110611c0e57611c0e6143ef565b60200101906001600160f81b03191690815f1a905350600101611bc4565b505f5b6008811015611c9757611c438160076143dc565b611c4e9060086141e7565b6001600160401b038516901c60f81b82611c6983602e6141fe565b81518110611c7957611c796143ef565b60200101906001600160f81b03191690815f1a905350600101611c2f565b5090505b9392505050565b5f80516020614646833981519152805460011901611cd357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206145e6833981519152906001600160401b031660208501351015611d805760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104ef565b600381015484351015611de95760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016104ef565b80548310801590611dfe575080600101548311155b611e5c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b825f611e6782610a10565b90505f611e748883612ff6565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f8051602061464683398151915255565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f805160206145e6833981519152929190611f0090613f0b565b9050118015611f32575060035f83815260068301602052604090205460ff166004811115611f3057611f30613ea8565b145b611f875760405162461bcd60e51b815260206004820152603360248201525f8051602061460683398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206146268339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612000573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261202791908101906142cf565b915091508061208e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b82548251146120f15760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b0316156121645760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f80825160271461218f5760405162461bcd60e51b81526004016104ef90614403565b5f805b60028110156121de576121a68160016143dc565b6121b19060086141e7565b61ffff168582815181106121c7576121c76143ef565b016020015160f81c901b9190911790600101612192565b5061ffff8116156122015760405162461bcd60e51b81526004016104ef9061444c565b5f805b600481101561225c576122188160036143dc565b6122239060086141e7565b63ffffffff16866122358360026141fe565b81518110612245576122456143ef565b016020015160f81c901b9190911790600101612204565b5063ffffffff81166002146122835760405162461bcd60e51b81526004016104ef9061448f565b5f805b60208110156122d85761229a81601f6143dc565b6122a59060086141e7565b876122b18360066141fe565b815181106122c1576122c16143ef565b016020015160f81c901b9190911790600101612286565b505f866026815181106122ed576122ed6143ef565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146123315760405162461bcd60e51b81526004016104ef90614403565b5f805b6002811015612380576123488160016143dc565b6123539060086141e7565b61ffff16868281518110612369576123696143ef565b016020015160f81c901b9190911790600101612334565b5061ffff8116156123a35760405162461bcd60e51b81526004016104ef9061444c565b5f805b60048110156123fe576123ba8160036143dc565b6123c59060086141e7565b63ffffffff16876123d78360026141fe565b815181106123e7576123e76143ef565b016020015160f81c901b91909117906001016123a6565b5063ffffffff81166003146124255760405162461bcd60e51b81526004016104ef9061448f565b5f805b602081101561247a5761243c81601f6143dc565b6124479060086141e7565b886124538360066141fe565b81518110612463576124636143ef565b016020015160f81c901b9190911790600101612428565b505f805b60088110156124d9576124928160076143dc565b61249d9060086141e7565b6001600160401b0316896124b28360266141fe565b815181106124c2576124c26143ef565b016020015160f81c901b919091179060010161247e565b505f805b6008811015612538576124f18160076143dc565b6124fc9060086141e7565b6001600160401b03168a61251183602e6141fe565b81518110612521576125216143ef565b016020015160f81c901b91909117906001016124dd565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f805160206145e683398151915292919061259090613f0b565b90501180156125c2575060015f83815260068301602052604090205460ff1660048111156125c0576125c0613ea8565b145b611f875760405162461bcd60e51b815260206004820152603860248201525f8051602061460683398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f8181525f8051602061466683398151915260205260408082208151610100810190925280545f8051602061462683398151915293929190829060ff16600581111561266f5761266f613ea8565b600581111561268057612680613ea8565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561270857612708613ea8565b146127645760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146127de5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b6127eb8160a001516134c3565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561282f5761282f613ea8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6128fb846128f5816118b6565b5f611a83565b5f85815260068501602052604090209091506129178282613f81565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612944908590600401614062565b6020604051808303815f875af1158015612960573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129849190614094565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6129e2611ca2565b5f805160206145e68339815191525f6129fa84610a10565b90505f612a068761192a565b9050600281516005811115612a1d57612a1d613ea8565b14612a7c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f828260a00151612a8d91906144d6565b60048501546001860154919250612aaf916001600160401b03909116906141e7565b612ab882610f94565b1115612b245760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104ef565b612b2e8882611a3b565b5f612b38896118b6565b90505f8982604051602001612b6492919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612b85856134c3565b5f612b918b8486611a83565b5f8381526007890160205260409020909150612bad8282613f81565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612bda908590600401614062565b6020604051808303815f875af1158015612bf6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c1a9190614094565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612cc957612cc9613ea8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050611c9b60015f8051602061464683398151915255565b612e12613664565b612e1b816136af565b50565b5f808251602e14612e415760405162461bcd60e51b81526004016104ef90614403565b5f805b6002811015612e9057612e588160016143dc565b612e639060086141e7565b61ffff16858281518110612e7957612e796143ef565b016020015160f81c901b9190911790600101612e44565b5061ffff811615612eb35760405162461bcd60e51b81526004016104ef9061444c565b5f805b6004811015612f0e57612eca8160036143dc565b612ed59060086141e7565b63ffffffff1686612ee78360026141fe565b81518110612ef757612ef76143ef565b016020015160f81c901b9190911790600101612eb6565b5063ffffffff8116600414612f355760405162461bcd60e51b81526004016104ef9061448f565b5f805b6020811015612f8a57612f4c81601f6143dc565b612f579060086141e7565b87612f638360066141fe565b81518110612f7357612f736143ef565b016020015160f81c901b9190911790600101612f38565b505f805b6008811015612fe957612fa28160076143dc565b612fad9060086141e7565b6001600160401b031688612fc28360266141fe565b81518110612fd257612fd26143ef565b016020015160f81c901b9190911790600101612f8e565b5090969095509350505050565b5f5f80516020614626833981519152426130166040860160208701613e6b565b6001600160401b031611801561304f57506130376040850160208601613e6b565b6001600160401b031661304d426202a3006141fe565b115b6130b15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104ef565b83356131095760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b83355f908152600882016020526040902054156131795760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b61318660408501856144f6565b90506030146131ed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b6131f6836134c3565b5f806132906040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061323b9190613e6b565b6001600160401b0316815260200161325660408a018a6144f6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061370a565b5f828152600586016020526040902091935091506132ae8282613f81565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906132db908590600401614062565b6020604051808303815f875af11580156132f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061331b9190614094565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561339d5761339d613ea8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561345e836118b6565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961349560408d0160208e01613e6b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146268339815191529060ff165f03613501575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061354990836143dc565b10613565576001600160401b0384166040830152808252613584565b838260400181815161357791906144d6565b6001600160401b03169052505b5f82602001518360400151606461359b919061453f565b6135a5919061456a565b600285015490915060ff90811690821611156136205760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104ef565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136ad57604051631afcd79f60e31b815260040160405180910390fd5b565b6136b7613664565b6136c081613aaf565b612e1b606082013560808301356136dd60c0850160a08601613e6b565b60c08501356136f3610100870160e08801613e6b565b6137056101208801610100890161458f565b613ad0565b5f60608260800151516030146137745760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137eb576137ab8160016143dc565b6137b69060086141e7565b5081515f908390839081106137cd576137cd6143ef565b60200101906001600160f81b03191690815f1a905350600101613797565b505f5b6004811015613849576138028160036143dc565b61380d9060086141e7565b505f8261381b8360026141fe565b8151811061382b5761382b6143ef565b60200101906001600160f81b03191690815f1a9053506001016137ee565b505f5b60208110156138a65784518160208110613868576138686143ef565b1a60f81b826138788360066141fe565b81518110613888576138886143ef565b60200101906001600160f81b03191690815f1a90535060010161384c565b505f5b602081101561390657846020015181602081106138c8576138c86143ef565b1a60f81b826138d88360266141fe565b815181106138e8576138e86143ef565b60200101906001600160f81b03191690815f1a9053506001016138a9565b505f5b600881101561397a5761391d8160076143dc565b6139289060086141e7565b60ff1685604001516001600160401b0316901c60f81b8282604661394c91906141fe565b8151811061395c5761395c6143ef565b60200101906001600160f81b03191690815f1a905350600101613909565b505f5b60308110156139e5578460800151818151811061399c5761399c6143ef565b01602001516001600160f81b031916826139b783604e6141fe565b815181106139c7576139c76143ef565b60200101906001600160f81b03191690815f1a90535060010161397d565b505f5b6008811015613a57576139fc8160076143dc565b613a079060086141e7565b60608601516001600160401b0390811691161c60f81b82613a2983607e6141fe565b81518110613a3957613a396143ef565b60200101906001600160f81b03191690815f1a9053506001016139e8565b50600281604051613a6891906145aa565b602060405180830381855afa158015613a83573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613aa69190614094565b94909350915050565b613ab7613664565b613abf613c84565b613ac7613c94565b612e1b81613c9c565b613ad8613664565b5f805160206145e683398151915283613b445760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104ef565b85871115613bac5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104ef565b5f836001600160401b031611613c1f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104ef565b95865560018601949094556002850180546001600160401b0394851667ffffffffffffffff199091161790556003850191909155600490930180546001600160a01b03909316600160401b026001600160e01b03199093169390911692909217179055565b613c8c613664565b6136ad613d08565b6136ad613664565b613ca4613664565b80355f8051602061462683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613cee60608301604084016145c5565b600291909101805460ff191660ff90921691909117905550565b611ea5613664565b508054613d1c90613f0b565b5f825580601f10613d2b575050565b601f0160209004905f5260205f2090810190612e1b91905b80821115613d56575f8155600101613d43565b5090565b8015158114612e1b575f80fd5b803563ffffffff81168114613d7a575f80fd5b919050565b5f805f60608486031215613d91575f80fd5b833592506020840135613da381613d5a565b9150613db160408501613d67565b90509250925092565b5f60208284031215613dca575f80fd5b5035919050565b5f808284036060811215613de3575f80fd5b83356001600160401b03811115613df8575f80fd5b840160608187031215613e09575f80fd5b92506040601f1982011215613e1c575f80fd5b506020830190509250929050565b5f60208284031215613e3a575f80fd5b611c9b82613d67565b5f8060408385031215613e54575f80fd5b613e5d83613d67565b946020939093013593505050565b5f60208284031215613e7b575f80fd5b81356001600160401b0381168114611c9b575f80fd5b5f6101208284031215613ea2575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ef057613ef0613ebc565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680613f1f57607f821691505b602082108103613ea257634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c81016020851015613f625750805b601f840160051c820191505b818110156110f9575f8155600101613f6e565b81516001600160401b03811115613f9a57613f9a613ef7565b613fae81613fa88454613f0b565b84613f3d565b602080601f831160018114613fe1575f8415613fca5750858301515b5f19600386901b1c1916600185901b178555614038565b5f85815260208120601f198616915b8281101561400f57888601518255948401946001909101908401613ff0565b508582101561402c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561405a578181015183820152602001614042565b50505f910152565b602081525f8251806020840152614080816040850160208701614040565b601f01601f19169190910160400192915050565b5f602082840312156140a4575f80fd5b5051919050565b5f60208083525f84546140bd81613f0b565b806020870152604060018084165f81146140de57600181146140fa57614127565b60ff19851660408a0152604084151560051b8a01019550614127565b895f5260205f205f5b8581101561411e5781548b8201860152908301908801614103565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261415757614157614135565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761099d5761099d613ebc565b8082018082111561099d5761099d613ebc565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b038111828210171561427a5761427a613ef7565b60405290565b604051601f8201601f191681016001600160401b03811182821017156142a8576142a8613ef7565b604052919050565b6001600160a01b0381168114612e1b575f80fd5b8051613d7a81613d5a565b5f80604083850312156142e0575f80fd5b82516001600160401b03808211156142f6575f80fd5b9084019060608287031215614309575f80fd5b614311614258565b82518152602080840151614324816142b0565b82820152604084015183811115614339575f80fd5b80850194505087601f85011261434d575f80fd5b83518381111561435f5761435f613ef7565b614371601f8201601f19168301614280565b93508084528882828701011115614386575f80fd5b61439581838601848801614040565b508260408301528195506143aa8188016142c4565b9450505050509250929050565b5f6001600160401b038083168181036143d2576143d2613ebc565b6001019392505050565b8181038181111561099d5761099d613ebc565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ef057613ef0613ebc565b5f808335601e1984360301811261450b575f80fd5b8301803591506001600160401b03821115614524575f80fd5b602001915036819003821315614538575f80fd5b9250929050565b6001600160401b0381811683821602808216919082811461456257614562613ebc565b505092915050565b5f6001600160401b038084168061458357614583614135565b92169190910492915050565b5f6020828403121561459f575f80fd5b8135611c9b816142b0565b5f82516145bb818460208701614040565b9190910192915050565b5f602082840312156145d5575f80fd5b813560ff81168114611c9b575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -457,23 +472,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x00e41792. +// Initialize is a paid mutator transaction binding the contract method 0xdac80623. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint64,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 0x00e41792. +// Initialize is a paid mutator transaction binding the contract method 0xdac80623. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint64,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 0x00e41792. +// Initialize is a paid mutator transaction binding the contract method 0xdac80623. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint64,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } @@ -541,25 +556,25 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In return _NativeTokenStakingManager.Contract.InitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xf40797d7. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x104595c4. // -// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", nodeID, registrationExpiry, blsPublicKey) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint256,uint256) requirements) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, requirements) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xf40797d7. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x104595c4. // -// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, blsPublicKey) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint256,uint256) requirements) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, requirements) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xf40797d7. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x104595c4. // -// Solidity: function initializeValidatorRegistration(bytes32 nodeID, uint64 registrationExpiry, bytes blsPublicKey) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(nodeID [32]byte, registrationExpiry uint64, blsPublicKey []byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, nodeID, registrationExpiry, blsPublicKey) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint256,uint256) requirements) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, requirements) } // ResendDelegatorRegistration is a paid mutator transaction binding the contract method 0x6d0e43fa. diff --git a/abi-bindings/go/validatormanager/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go similarity index 72% rename from abi-bindings/go/validatormanager/PoAValidatorManager/PoAValidatorManager.go rename to abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 86a87b7fd..a4008df88 100644 --- a/abi-bindings/go/validatormanager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -36,10 +36,17 @@ type ValidatorManagerSettings struct { MaximumHourlyChurn uint8 } +// ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. +type ValidatorRegistrationInput struct { + NodeID [32]byte + RegistrationExpiry uint64 + BlsPublicKey []byte +} + // 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612bb4380380612bb483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a678061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd36600461237d565b61023f565b005b6101226100f236600461237d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612441565b6103a0565b6100e26101563660046124e4565b6103c0565b61016e61016936600461237d565b610743565b6040516001600160401b03909116815260200161012c565b6100e2610757565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e036600461237d565b61076a565b6100e26101f33660046124e4565b610776565b6101ba6005600160991b0181565b6100e261021436600461237d565b610933565b6100e2610227366004612522565b610a02565b6100e261023a36600461255e565b610b10565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612a3b83398151915292919061028790612579565b90501180156102b9575060035f83815260078301602052604090205460ff1660058111156102b7576102b76125b1565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125c5565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b919061264f565b505050565b5f6103a9610b4a565b6103b584868585610ba5565b90505b949350505050565b5f80516020612a3b8339815191525f6103d88361100d565b90505f806103e983604001516111ee565b91509150801561044e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610480576104806125b1565b6005811115610491576104916125b1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610518576105186125b1565b14806105365750600182516005811115610534576105346125b1565b145b6105955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b6003825160058111156105aa576105aa6125b1565b036105d157505f83815260068601602052604081206004916105cc9190612333565b6105d5565b5060055b6020808301515f908152600888019091526040812055818160058111156105fe576105fe6125b1565b90816005811115610611576106116125b1565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610645576106456125b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610710576107106125b1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61074d8261144d565b60a0015192915050565b61075f610b4a565b6107685f611571565b565b610773816115e1565b50565b5f80516020612a3b8339815191525f61078e8361100d565b90505f8061079f83604001516111ee565b91509150806108015760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f8281526005850160205260408120805461081b90612579565b905011801561084d575060015f83815260078601602052604090205460ff16600581111561084b5761084b6125b1565b145b6108695760405162461bcd60e51b815260040161031990612666565b5f828152600585016020526040812061088191612333565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a3b83398151915292919061097b90612579565b90501180156109ad575060015f83815260078301602052604090205460ff1660058111156109ab576109ab6125b1565b145b6109c95760405162461bcd60e51b815260040161031990612666565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125c5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a465750825b90505f826001600160401b03166001148015610a615750303b155b905081158015610a6f575080155b15610a8d5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ab757845460ff60401b1916600160401b1785555b610ac187876119ac565b8315610b0757845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610b18610b4a565b6001600160a01b038116610b4157604051631e4fbdf760e01b81525f6004820152602401610319565b61077381611571565b33610b7c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107685760405163118cdaa760e01b8152336004820152602401610319565b5f610bae6119ca565b5f80516020612a3b833981519152426001600160401b038516118015610be857506001600160401b038416610be6426202a3006126c1565b115b610c4a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b85610ca15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f86815260088201602052604090205415610d0f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610d765760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b610d7f85611a14565b5f80610dc66040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611bb5565b5f82815260058601602052604090209193509150610de48282612725565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610e11908590600401612806565b6020604051808303815f875af1158015610e2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e51919061264f565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115610ed357610ed36125b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610f9483611f5a565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051606080820183525f8083526020830181905292820152905f80516020612a3b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611082573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110a99190810190612847565b91509150806111105760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146111735760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b0316156111e65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146112535760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156112a25761126a816001612919565b61127590600861292c565b61ffff1685828151811061128b5761128b612943565b016020015160f81c901b9190911790600101611256565b5061ffff8116156113015760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b600481101561135c57611318816003612919565b61132390600861292c565b63ffffffff16866113358360026126c1565b8151811061134557611345612943565b016020015160f81c901b9190911790600101611304565b5063ffffffff81166002146113c35760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b6020811015611418576113da81601f612919565b6113e590600861292c565b876113f18360066126c1565b8151811061140157611401612943565b016020015160f81c901b91909117906001016113c6565b505f8660268151811061142d5761142d612943565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0790528390208351918201909352825491925f80516020612a3b83398151915292829060ff1660058111156114e8576114e86125b1565b60058111156114f9576114f96125b1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0760205260408082208151610100810190925280545f80516020612a3b83398151915293929190829060ff166005811115611642576116426125b1565b6005811115611653576116536125b1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156116db576116db6125b1565b146117375760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146117b15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b6117be8160a00151611a14565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff19166001836005811115611802576118026125b1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6118ce846118c881611f5a565b5f612007565b5f85815260068501602052604090209091506118ea8282612725565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611917908590600401612806565b6020604051808303815f875af1158015611933573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611957919061264f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b6119b4612224565b6119bd8261226d565b6119c68161228e565b5050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611a0e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a3b8339815191529060ff165f03611a52575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611a9a9083612919565b10611ab6576001600160401b0384166040830152808252611ad5565b8382604001818151611ac89190612957565b6001600160401b03169052505b5f826020015183604001516064611aec919061297e565b611af691906129a9565b600285015490915060ff9081169082161115611b715760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610319565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c1f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c9657611c56816001612919565b611c6190600861292c565b5081515f90839083908110611c7857611c78612943565b60200101906001600160f81b03191690815f1a905350600101611c42565b505f5b6004811015611cf457611cad816003612919565b611cb890600861292c565b505f82611cc68360026126c1565b81518110611cd657611cd6612943565b60200101906001600160f81b03191690815f1a905350600101611c99565b505f5b6020811015611d515784518160208110611d1357611d13612943565b1a60f81b82611d238360066126c1565b81518110611d3357611d33612943565b60200101906001600160f81b03191690815f1a905350600101611cf7565b505f5b6020811015611db15784602001518160208110611d7357611d73612943565b1a60f81b82611d838360266126c1565b81518110611d9357611d93612943565b60200101906001600160f81b03191690815f1a905350600101611d54565b505f5b6008811015611e2557611dc8816007612919565b611dd390600861292c565b60ff1685604001516001600160401b0316901c60f81b82826046611df791906126c1565b81518110611e0757611e07612943565b60200101906001600160f81b03191690815f1a905350600101611db4565b505f5b6030811015611e905784608001518181518110611e4757611e47612943565b01602001516001600160f81b03191682611e6283604e6126c1565b81518110611e7257611e72612943565b60200101906001600160f81b03191690815f1a905350600101611e28565b505f5b6008811015611f0257611ea7816007612919565b611eb290600861292c565b60608601516001600160401b0390811691161c60f81b82611ed483607e6126c1565b81518110611ee457611ee4612943565b60200101906001600160f81b03191690815f1a905350600101611e93565b50600281604051611f1391906129da565b602060405180830381855afa158015611f2e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f51919061264f565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060030180545f80516020612a3b833981519152916001600160401b0390911690819084611fb2836129f5565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561208057612040816001612919565b61204b90600861292c565b5081515f9083908390811061206257612062612943565b60200101906001600160f81b03191690815f1a90535060010161202c565b505f5b60048110156120e357612097816003612919565b6120a290600861292c565b6001901c60f81b826120b58360026126c1565b815181106120c5576120c5612943565b60200101906001600160f81b03191690815f1a905350600101612083565b505f5b6020811015612145576120fa81601f612919565b61210590600861292c565b86901c60f81b826121178360066126c1565b8151811061212757612127612943565b60200101906001600160f81b03191690815f1a9053506001016120e6565b505f5b60088110156121b05761215c816007612919565b61216790600861292c565b6001600160401b038616901c60f81b826121828360266126c1565b8151811061219257612192612943565b60200101906001600160f81b03191690815f1a905350600101612148565b505f5b600881101561221b576121c7816007612919565b6121d290600861292c565b6001600160401b038516901c60f81b826121ed83602e6126c1565b815181106121fd576121fd612943565b60200101906001600160f81b03191690815f1a9053506001016121b3565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661076857604051631afcd79f60e31b815260040160405180910390fd5b612275612224565b61227d61229f565b6122856122af565b610773816122b7565b612296612224565b61077381612323565b6122a7612224565b61076861232b565b610768612224565b6122bf612224565b80355f80516020612a3b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123096060830160408401612a1a565b600291909101805460ff191660ff90921691909117905550565b610b18612224565b611fe1612224565b50805461233f90612579565b5f825580601f1061234e575050565b601f0160209004905f5260205f209081019061077391905b80821115612379575f8155600101612366565b5090565b5f6020828403121561238d575f80fd5b5035919050565b80356001600160401b03811681146123aa575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156123e5576123e56123af565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612413576124136123af565b604052919050565b5f6001600160401b03821115612433576124336123af565b50601f01601f191660200190565b5f805f8060808587031215612454575f80fd5b61245d85612394565b93506020850135925061247260408601612394565b915060608501356001600160401b0381111561248c575f80fd5b8501601f8101871361249c575f80fd5b80356124af6124aa8261241b565b6123eb565b8181528860208385010111156124c3575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156124f4575f80fd5b813563ffffffff81168114612507575f80fd5b9392505050565b6001600160a01b0381168114610773575f80fd5b5f808284036080811215612534575f80fd5b6060811215612541575f80fd5b5082915060608301356125538161250e565b809150509250929050565b5f6020828403121561256e575f80fd5b81356125078161250e565b600181811c9082168061258d57607f821691505b6020821081036125ab57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f84546125d781612579565b806020870152604060018084165f81146125f8576001811461261457612641565b60ff19851660408a0152604084151560051b8a01019550612641565b895f5260205f205f5b858110156126385781548b820186015290830190880161261d565b8a016040019650505b509398975050505050505050565b5f6020828403121561265f575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126d4576126d46126ad565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156126ff5750805b601f840160051c820191505b8181101561271e575f815560010161270b565b5050505050565b81516001600160401b0381111561273e5761273e6123af565b6127528161274c8454612579565b846126da565b602080601f831160018114612785575f841561276e5750858301515b5f19600386901b1c1916600185901b1785556127dc565b5f85815260208120601f198616915b828110156127b357888601518255948401946001909101908401612794565b50858210156127d057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156127fe5781810151838201526020016127e6565b50505f910152565b602081525f82518060208401526128248160408501602087016127e4565b601f01601f19169190910160400192915050565b805180151581146123aa575f80fd5b5f8060408385031215612858575f80fd5b82516001600160401b038082111561286e575f80fd5b9084019060608287031215612881575f80fd5b6128896123c3565b8251815260208084015161289c8161250e565b828201526040840151838111156128b1575f80fd5b80850194505087601f8501126128c5575f80fd5b835192506128d56124aa8461241b565b83815288828587010111156128e8575f80fd5b6128f7848383018488016127e4565b8060408401525081955061290c818801612838565b9450505050509250929050565b818103818111156126d4576126d46126ad565b80820281158282048414176126d4576126d46126ad565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b03818116838216019080821115612977576129776126ad565b5092915050565b6001600160401b038181168382160280821691908281146129a1576129a16126ad565b505092915050565b5f6001600160401b03808416806129ce57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516129eb8184602087016127e4565b9190910192915050565b5f6001600160401b03808316818103612a1057612a106126ad565b6001019392505050565b5f60208284031215612a2a575f80fd5b813560ff81168114612507575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612bc8380380612bc883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a7b8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e4578063467ef06f1461013557806366435abf14610148578063715018a6146101735780638994ab491461017b575b5f80fd5b6100e26100dd366004612394565b61023f565b005b6101226100f2366004612394565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6100e26101433660046123ab565b6103a0565b61015b610156366004612394565b610723565b6040516001600160401b03909116815260200161012c565b6100e2610737565b610122610189366004612406565b61074a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e0366004612394565b610766565b6100e26101f33660046123ab565b610772565b6101ba6005600160991b0181565b6100e2610214366004612394565b61092f565b6100e2610227366004612464565b6109fe565b6100e261023a36600461249a565b610b0c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612a4f833981519152929190610287906124b5565b90501180156102b9575060035f83815260078301602052604090205460ff1660058111156102b7576102b76124e7565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016124fb565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612585565b505050565b5f80516020612a4f8339815191525f6103b883610b46565b90505f806103c98360400151610d27565b91509150801561042e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610460576104606124e7565b6005811115610471576104716124e7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156104f8576104f86124e7565b14806105165750600182516005811115610514576105146124e7565b145b6105755760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b60038251600581111561058a5761058a6124e7565b036105b157505f83815260068601602052604081206004916105ac919061234a565b6105b5565b5060055b6020808301515f908152600888019091526040812055818160058111156105de576105de6124e7565b908160058111156105f1576105f16124e7565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610625576106256124e7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156106f0576106f06124e7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61072d82610f86565b60a0015192915050565b61073f6110aa565b6107485f611105565b565b5f6107536110aa565b61075d8383611175565b90505b92915050565b61076f81611642565b50565b5f80516020612a4f8339815191525f61078a83610b46565b90505f8061079b8360400151610d27565b91509150806107fd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f82815260058501602052604081208054610817906124b5565b9050118015610849575060015f83815260078601602052604090205460ff166005811115610847576108476124e7565b145b6108655760405162461bcd60e51b81526004016103199061259c565b5f828152600585016020526040812061087d9161234a565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a4f833981519152929190610977906124b5565b90501180156109a9575060015f83815260078301602052604090205460ff1660058111156109a7576109a76124e7565b145b6109c55760405162461bcd60e51b81526004016103199061259c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016124fb565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a425750825b90505f826001600160401b03166001148015610a5d5750303b155b905081158015610a6b575080155b15610a895760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ab357845460ff60401b1916600160401b1785555b610abd8787611a0d565b8315610b0357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610b146110aa565b6001600160a01b038116610b3d57604051631e4fbdf760e01b81525f6004820152602401610319565b61076f81611105565b60408051606080820183525f8083526020830181905292820152905f80516020612a4f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610bbb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610be29190810190612680565b9150915080610c495760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b8254825114610cac5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b031615610d1f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f808251602714610d8c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b6002811015610ddb57610da381600161277c565b610dae90600861278f565b61ffff16858281518110610dc457610dc46127a6565b016020015160f81c901b9190911790600101610d8f565b5061ffff811615610e3a5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b6004811015610e9557610e5181600361277c565b610e5c90600861278f565b63ffffffff1686610e6e8360026127ba565b81518110610e7e57610e7e6127a6565b016020015160f81c901b9190911790600101610e3d565b5063ffffffff8116600214610efc5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b6020811015610f5157610f1381601f61277c565b610f1e90600861278f565b87610f2a8360066127ba565b81518110610f3a57610f3a6127a6565b016020015160f81c901b9190911790600101610eff565b505f86602681518110610f6657610f666127a6565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0790528390208351918201909352825491925f80516020612a4f83398151915292829060ff166005811115611021576110216124e7565b6005811115611032576110326124e7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b336110dc7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107485760405163118cdaa760e01b8152336004820152602401610319565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612a4f8339815191524261119560408601602087016127cd565b6001600160401b03161180156111ce57506111b660408501602086016127cd565b6001600160401b03166111cc426202a3006127ba565b115b6112305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b83356112885760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b83355f908152600882016020526040902054156112f85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b61130560408501856127e6565b905060301461136c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b61137583611a2b565b5f8061140f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906113ba91906127cd565b6001600160401b031681526020016113d560408a018a6127e6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611bcc565b5f8281526005860160205260409020919350915061142d828261287a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061145a908590600401612939565b6020604051808303815f875af1158015611476573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149a9190612585565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561151c5761151c6124e7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556115dd83611f71565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961161460408d0160208e016127cd565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0760205260408082208151610100810190925280545f80516020612a4f83398151915293929190829060ff1660058111156116a3576116a36124e7565b60058111156116b4576116b46124e7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561173c5761173c6124e7565b146117985760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146118125760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b61181f8160a00151611a2b565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff19166001836005811115611863576118636124e7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61192f8461192981611f71565b5f611ff8565b5f858152600685016020526040902090915061194b828261287a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611978908590600401612939565b6020604051808303815f875af1158015611994573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b89190612585565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b611a15612215565b611a1e8261225e565b611a278161227f565b5050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a4f8339815191529060ff165f03611a69575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611ab1908361277c565b10611acd576001600160401b0384166040830152808252611aec565b8382604001818151611adf919061296b565b6001600160401b03169052505b5f826020015183604001516064611b039190612992565b611b0d91906129bd565b600285015490915060ff9081169082161115611b885760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610319565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c365760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611cad57611c6d81600161277c565b611c7890600861278f565b5081515f90839083908110611c8f57611c8f6127a6565b60200101906001600160f81b03191690815f1a905350600101611c59565b505f5b6004811015611d0b57611cc481600361277c565b611ccf90600861278f565b505f82611cdd8360026127ba565b81518110611ced57611ced6127a6565b60200101906001600160f81b03191690815f1a905350600101611cb0565b505f5b6020811015611d685784518160208110611d2a57611d2a6127a6565b1a60f81b82611d3a8360066127ba565b81518110611d4a57611d4a6127a6565b60200101906001600160f81b03191690815f1a905350600101611d0e565b505f5b6020811015611dc85784602001518160208110611d8a57611d8a6127a6565b1a60f81b82611d9a8360266127ba565b81518110611daa57611daa6127a6565b60200101906001600160f81b03191690815f1a905350600101611d6b565b505f5b6008811015611e3c57611ddf81600761277c565b611dea90600861278f565b60ff1685604001516001600160401b0316901c60f81b82826046611e0e91906127ba565b81518110611e1e57611e1e6127a6565b60200101906001600160f81b03191690815f1a905350600101611dcb565b505f5b6030811015611ea75784608001518181518110611e5e57611e5e6127a6565b01602001516001600160f81b03191682611e7983604e6127ba565b81518110611e8957611e896127a6565b60200101906001600160f81b03191690815f1a905350600101611e3f565b505f5b6008811015611f1957611ebe81600761277c565b611ec990600861278f565b60608601516001600160401b0390811691161c60f81b82611eeb83607e6127ba565b81518110611efb57611efb6127a6565b60200101906001600160f81b03191690815f1a905350600101611eaa565b50600281604051611f2a91906129ee565b602060405180830381855afa158015611f45573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f689190612585565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060030180545f80516020612a4f833981519152916001600160401b0390911690819084611fc983612a09565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156120715761203181600161277c565b61203c90600861278f565b5081515f90839083908110612053576120536127a6565b60200101906001600160f81b03191690815f1a90535060010161201d565b505f5b60048110156120d45761208881600361277c565b61209390600861278f565b6001901c60f81b826120a68360026127ba565b815181106120b6576120b66127a6565b60200101906001600160f81b03191690815f1a905350600101612074565b505f5b6020811015612136576120eb81601f61277c565b6120f690600861278f565b86901c60f81b826121088360066127ba565b81518110612118576121186127a6565b60200101906001600160f81b03191690815f1a9053506001016120d7565b505f5b60088110156121a15761214d81600761277c565b61215890600861278f565b6001600160401b038616901c60f81b826121738360266127ba565b81518110612183576121836127a6565b60200101906001600160f81b03191690815f1a905350600101612139565b505f5b600881101561220c576121b881600761277c565b6121c390600861278f565b6001600160401b038516901c60f81b826121de83602e6127ba565b815181106121ee576121ee6127a6565b60200101906001600160f81b03191690815f1a9053506001016121a4565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661074857604051631afcd79f60e31b815260040160405180910390fd5b612266612215565b61226e612290565b6122766122a0565b61076f816122a8565b612287612215565b61076f81612314565b612298612215565b61074861231c565b610748612215565b6122b0612215565b80355f80516020612a4f83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122fa6060830160408401612a2e565b600291909101805460ff191660ff90921691909117905550565b610b14612215565b612324612215565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b508054612356906124b5565b5f825580601f10612365575050565b601f0160209004905f5260205f209081019061076f91905b80821115612390575f815560010161237d565b5090565b5f602082840312156123a4575f80fd5b5035919050565b5f602082840312156123bb575f80fd5b813563ffffffff811681146123ce575f80fd5b9392505050565b5f606082840312156123e5575f80fd5b50919050565b80356001600160401b0381168114612401575f80fd5b919050565b5f8060408385031215612417575f80fd5b82356001600160401b0381111561242c575f80fd5b612438858286016123d5565b925050612447602084016123eb565b90509250929050565b6001600160a01b038116811461076f575f80fd5b5f8060808385031215612475575f80fd5b61247f84846123d5565b9150606083013561248f81612450565b809150509250929050565b5f602082840312156124aa575f80fd5b81356123ce81612450565b600181811c908216806124c957607f821691505b6020821081036123e557634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f845461250d816124b5565b806020870152604060018084165f811461252e576001811461254a57612577565b60ff19851660408a0152604084151560051b8a01019550612577565b895f5260205f205f5b8581101561256e5781548b8201860152908301908801612553565b8a016040019650505b509398975050505050505050565b5f60208284031215612595575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612619576126196125e3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612647576126476125e3565b604052919050565b5f5b83811015612669578181015183820152602001612651565b50505f910152565b80518015158114612401575f80fd5b5f8060408385031215612691575f80fd5b82516001600160401b03808211156126a7575f80fd5b90840190606082870312156126ba575f80fd5b6126c26125f7565b825181526020808401516126d581612450565b828201526040840151838111156126ea575f80fd5b80850194505087601f8501126126fe575f80fd5b835183811115612710576127106125e3565b612722601f8201601f1916830161261f565b93508084528882828701011115612737575f80fd5b6127468183860184880161264f565b5082604083015281955061275b818801612671565b9450505050509250929050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561076057610760612768565b808202811582820484141761076057610760612768565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561076057610760612768565b5f602082840312156127dd575f80fd5b61075d826123eb565b5f808335601e198436030181126127fb575f80fd5b8301803591506001600160401b03821115612814575f80fd5b602001915036819003821315612828575f80fd5b9250929050565b601f82111561039b57805f5260205f20601f840160051c810160208510156128545750805b601f840160051c820191505b81811015612873575f8155600101612860565b5050505050565b81516001600160401b03811115612893576128936125e3565b6128a7816128a184546124b5565b8461282f565b602080601f8311600181146128da575f84156128c35750858301515b5f19600386901b1c1916600185901b178555612931565b5f85815260208120601f198616915b82811015612908578886015182559484019460019091019084016128e9565b508582101561292557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f825180602084015261295781604085016020870161264f565b601f01601f19169190910160400192915050565b6001600160401b0381811683821601908082111561298b5761298b612768565b5092915050565b6001600160401b038181168382160280821691908281146129b5576129b5612768565b505092915050565b5f6001600160401b03808416806129e257634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516129ff81846020870161264f565b9190910192915050565b5f6001600160401b03808316818103612a2457612a24612768565b6001019392505050565b5f60208284031215612a3e575f80fd5b813560ff811681146123ce575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -417,25 +424,25 @@ func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeEndV return _PoAValidatorManager.Contract.InitializeEndValidation(&_PoAValidatorManager.TransactOpts, validationID) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x3aaa9f25. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8994ab49. // -// Solidity: function initializeValidatorRegistration(uint64 weight, bytes32 nodeID, uint64 registrationExpiry, bytes signature) returns(bytes32 validationID) -func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, weight uint64, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { - return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorRegistration", weight, nodeID, registrationExpiry, signature) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint64 weight) returns(bytes32 validationID) +func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, weight) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x3aaa9f25. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8994ab49. // -// Solidity: function initializeValidatorRegistration(uint64 weight, bytes32 nodeID, uint64 registrationExpiry, bytes signature) returns(bytes32 validationID) -func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorRegistration(weight uint64, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, weight, nodeID, registrationExpiry, signature) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint64 weight) returns(bytes32 validationID) +func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, registrationInput, weight) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x3aaa9f25. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8994ab49. // -// Solidity: function initializeValidatorRegistration(uint64 weight, bytes32 nodeID, uint64 registrationExpiry, bytes signature) returns(bytes32 validationID) -func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorRegistration(weight uint64, nodeID [32]byte, registrationExpiry uint64, signature []byte) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, weight, nodeID, registrationExpiry, signature) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint64 weight) returns(bytes32 validationID) +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, registrationInput, weight) } // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. diff --git a/contracts/validatormanager/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol similarity index 100% rename from contracts/validatormanager/ERC20TokenStakingManager.sol rename to contracts/staking/ERC20TokenStakingManager.sol diff --git a/contracts/validatormanager/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol similarity index 100% rename from contracts/validatormanager/ExampleRewardCalculator.sol rename to contracts/staking/ExampleRewardCalculator.sol diff --git a/contracts/validatormanager/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol similarity index 100% rename from contracts/validatormanager/NativeTokenStakingManager.sol rename to contracts/staking/NativeTokenStakingManager.sol diff --git a/contracts/validatormanager/PoAValidatorManager.sol b/contracts/staking/PoAValidatorManager.sol similarity index 100% rename from contracts/validatormanager/PoAValidatorManager.sol rename to contracts/staking/PoAValidatorManager.sol diff --git a/contracts/validatormanager/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol similarity index 97% rename from contracts/validatormanager/PoSValidatorManager.sol rename to contracts/staking/PoSValidatorManager.sol index 2a52e4e3f..97780e76d 100644 --- a/contracts/validatormanager/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -77,14 +77,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager onlyInitializing { __ValidatorManager_init(settings.baseSettings); - __POS_Validator_Manager_init_unchained( - settings.minimumStakeAmount, - settings.maximumStakeAmount, - settings.minimumStakeDuration, - settings.minimumDelegationFee, - settings.maximumStakeMultiplier, - settings.rewardCalculator - ); + __POS_Validator_Manager_init_unchained({ + minimumStakeAmount: settings.minimumStakeAmount, + maximumStakeAmount: settings.maximumStakeAmount, + minimumStakeDuration: settings.minimumStakeDuration, + minimumDelegationFee: settings.minimumDelegationFee, + maximumStakeMultiplier: settings.maximumStakeMultiplier, + rewardCalculator: settings.rewardCalculator + }); } // solhint-disable-next-line func-name-mixedcase diff --git a/contracts/validatormanager/README.md b/contracts/staking/README.md similarity index 100% rename from contracts/validatormanager/README.md rename to contracts/staking/README.md diff --git a/contracts/validatormanager/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol similarity index 100% rename from contracts/validatormanager/ValidatorManager.sol rename to contracts/staking/ValidatorManager.sol diff --git a/contracts/validatormanager/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol similarity index 100% rename from contracts/validatormanager/ValidatorMessages.sol rename to contracts/staking/ValidatorMessages.sol diff --git a/contracts/validatormanager/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol similarity index 100% rename from contracts/validatormanager/interfaces/IERC20TokenStakingManager.sol rename to contracts/staking/interfaces/IERC20TokenStakingManager.sol diff --git a/contracts/validatormanager/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol similarity index 100% rename from contracts/validatormanager/interfaces/INativeTokenStakingManager.sol rename to contracts/staking/interfaces/INativeTokenStakingManager.sol diff --git a/contracts/validatormanager/interfaces/IPoAValidatorManager.sol b/contracts/staking/interfaces/IPoAValidatorManager.sol similarity index 100% rename from contracts/validatormanager/interfaces/IPoAValidatorManager.sol rename to contracts/staking/interfaces/IPoAValidatorManager.sol diff --git a/contracts/validatormanager/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol similarity index 100% rename from contracts/validatormanager/interfaces/IPoSValidatorManager.sol rename to contracts/staking/interfaces/IPoSValidatorManager.sol diff --git a/contracts/validatormanager/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol similarity index 100% rename from contracts/validatormanager/interfaces/IRewardCalculator.sol rename to contracts/staking/interfaces/IRewardCalculator.sol diff --git a/contracts/validatormanager/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol similarity index 100% rename from contracts/validatormanager/interfaces/IValidatorManager.sol rename to contracts/staking/interfaces/IValidatorManager.sol diff --git a/contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol similarity index 100% rename from contracts/validatormanager/tests/ERC20TokenStakingManagerTests.t.sol rename to contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol diff --git a/contracts/validatormanager/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol similarity index 100% rename from contracts/validatormanager/tests/ExamplesRewardCalculatorTests.t.sol rename to contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol diff --git a/contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol similarity index 100% rename from contracts/validatormanager/tests/NativeTokenStakingManagerTests.t.sol rename to contracts/staking/tests/NativeTokenStakingManagerTests.t.sol diff --git a/contracts/validatormanager/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol similarity index 100% rename from contracts/validatormanager/tests/PoAValidatorManagerTests.t.sol rename to contracts/staking/tests/PoAValidatorManagerTests.t.sol diff --git a/contracts/validatormanager/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol similarity index 100% rename from contracts/validatormanager/tests/PoSValidatorManagerTests.t.sol rename to contracts/staking/tests/PoSValidatorManagerTests.t.sol diff --git a/contracts/validatormanager/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol similarity index 100% rename from contracts/validatormanager/tests/ValidatorManagerTests.t.sol rename to contracts/staking/tests/ValidatorManagerTests.t.sol diff --git a/contracts/validatormanager/tests/ValidatorMessagesTests.t.sol b/contracts/staking/tests/ValidatorMessagesTests.t.sol similarity index 100% rename from contracts/validatormanager/tests/ValidatorMessagesTests.t.sol rename to contracts/staking/tests/ValidatorMessagesTests.t.sol From 35bb886143f08b5cb9df4a6f8be0dbac9b295edf Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 11 Sep 2024 16:22:12 -0400 Subject: [PATCH 246/545] bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 7 +------ .../NativeTokenStakingManager.go | 9 ++------- .../staking/PoAValidatorManager/PoAValidatorManager.go | 7 +------ 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 49baa6c64..8c47f3c0f 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -62,13 +62,8 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ -<<<<<<< HEAD ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614bb9380380614bb983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614a6c8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063b771b3bc1461028a578063bee0a03f146102b0578063fbf50cdb146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e57806398f3e2b414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806365b3a62114610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b6101286101233660046140e9565b6102d6565b005b610128610138366004614124565b610761565b61017b61014b366004614124565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004614124565b6108bd565b6101b46101af366004614124565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da36600461413b565b610940565b6101286101ed366004614154565b610cc3565b61017b61020036600461417c565b610eb4565b61017b6102133660046141a2565b610ecd565b6101b4610226366004614124565b610f00565b610128610239366004614124565b610f14565b61012861024c3660046140e9565b610f81565b61012861025f366004614154565b611053565b61017b610272366004614203565b6111f3565b61012861028536600461413b565b6111ff565b6102986005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102be366004614124565b6113bc565b6101286102d1366004614237565b61148b565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206149c083398151915291841561032857610325828561156f565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614275565b600481111561036b5761036b614275565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614275565b146104445760405162461bcd60e51b815260206004820152602a60248201525f805160206149e08339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f805160206149e08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b38461180b565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561050057610500614275565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d28561187f565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e919061429d565b905061066a8682611990565b5f6106768785846119d8565b5f8c815260088a01602052604090209091506106928282614354565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614435565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190614467565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020614a008339815191529291906107a9906142d8565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9614275565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610878919060040161447e565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b89190614467565b505050565b6108c681611bf5565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f805160206149c0833981519152916005600160991b019163ee5b48eb916108789160040161447e565b5f61093a64e8d4a510008361451c565b92915050565b5f80516020614a008339815191525f61095883611cc8565b90505f806109698360400151611ea9565b9150915080156109ce5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610a0057610a00614275565b6005811115610a1157610a11614275565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610a9857610a98614275565b1480610ab65750600182516005811115610ab457610ab4614275565b145b610b155760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115610b2a57610b2a614275565b03610b5157505f8381526006860160205260408120600491610b4c919061407a565b610b55565b5060055b6020808301515f90815260088801909152604081205581816005811115610b7e57610b7e614275565b90816005811115610b9157610b91614275565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610bc557610bc5614275565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610c9057610c90614275565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206149c08339815191525f610cdb84611cc8565b90505f80610cec836040015161204a565b5091509150610cfa85612285565b5f8581526007850160205260408120610d129161407a565b5f610d1c8361187f565b9050816001600160401b031681608001516001600160401b03161015610d545760405162461bcd60e51b815260040161043b9061452f565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d995760405162461bcd60e51b815260040161043b90614571565b60015f87815260068701602052604090205460ff166004811115610dbf57610dbf614275565b14610e285760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a510006145ba565b5f610ed661235e565b610ee1848484612395565b9050610ef960015f80516020614a2083398151915255565b9392505050565b5f610f0a8261187f565b60a0015192915050565b610f1d81612285565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f805160206149c0833981519152916005600160991b019163ee5b48eb916108789160040161447e565b5f805160206149c08339815191525f610f998561187f565b5f86815260058401602052604090206001015460c0820151919250610fc6916001600160401b03166145d1565b4210156110315760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161043b565b831561104357611041858461156f565b505b61104c8561257f565b5050505050565b5f805160206149c08339815191525f61106b84611cc8565b90505f8061107c836040015161204a565b509150915061108a85611bf5565b5f85815260088501602052604081206110a29161407a565b5f6110ac8361187f565b9050816001600160401b031681608001516001600160401b031610156110e45760405162461bcd60e51b815260040161043b9061452f565b5f8681526006860160205260409020600301546001600160401b03808416911611156111225760405162461bcd60e51b815260040161043b90614571565b60035f87815260068701602052604090205460ff16600481111561114857611148614275565b1461119c5760405162461bcd60e51b815260206004820152603160248201525f805160206149e08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600686016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f610ef9833384612937565b5f80516020614a008339815191525f61121783611cc8565b90505f806112288360400151611ea9565b915091508061128a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f828152600585016020526040812080546112a4906142d8565b90501180156112d6575060015f83815260078601602052604090205460ff1660058111156112d4576112d4614275565b145b6112f25760405162461bcd60e51b815260040161043b906145e4565b5f828152600585016020526040812061130a9161407a565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614a00833981519152929190611404906142d8565b9050118015611436575060015f83815260078301602052604090205460ff16600581111561143457611434614275565b145b6114525760405162461bcd60e51b815260040161043b906145e4565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610878919060040161447e565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806114d4575080546001600160401b03808416911610155b156114f25760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561151d8484612d6b565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115ba573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e1919081019061468e565b91509150806116445760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611687573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ab9190614467565b82511461170f5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156117855760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806117948460400151612d85565b915091508187146118015760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f80516020614a408339815191526020526040812060030180545f80516020614a00833981519152916001600160401b039091169081908461185083614776565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f80516020614a4083398151915290528390208351918201909352825491925f80516020614a0083398151915292829060ff16600581111561190757611907614275565b600581111561191857611918614275565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614a40833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5157611a1181600161479b565b611a1c9060086145ba565b5081515f90839083908110611a3357611a336147ae565b60200101906001600160f81b03191690815f1a9053506001016119fd565b505f5b6004811015611ab457611a6881600361479b565b611a739060086145ba565b6001901c60f81b82611a868360026145d1565b81518110611a9657611a966147ae565b60200101906001600160f81b03191690815f1a905350600101611a54565b505f5b6020811015611b1657611acb81601f61479b565b611ad69060086145ba565b86901c60f81b82611ae88360066145d1565b81518110611af857611af86147ae565b60200101906001600160f81b03191690815f1a905350600101611ab7565b505f5b6008811015611b8157611b2d81600761479b565b611b389060086145ba565b6001600160401b038616901c60f81b82611b538360266145d1565b81518110611b6357611b636147ae565b60200101906001600160f81b03191690815f1a905350600101611b19565b505f5b6008811015611bec57611b9881600761479b565b611ba39060086145ba565b6001600160401b038516901c60f81b82611bbe83602e6145d1565b81518110611bce57611bce6147ae565b60200101906001600160f81b03191690815f1a905350600101611b84565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f805160206149c0833981519152929190611c3d906142d8565b9050118015611c6f575060035f83815260068301602052604090205460ff166004811115611c6d57611c6d614275565b145b611cc45760405162461bcd60e51b815260206004820152603360248201525f805160206149e083398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b5050565b60408051606080820183525f8083526020830181905292820152905f80516020614a008339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d3d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d64919081019061468e565b9150915080611dcb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e2e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ea15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f808251602714611ecc5760405162461bcd60e51b815260040161043b906147c2565b5f805b6002811015611f1b57611ee381600161479b565b611eee9060086145ba565b61ffff16858281518110611f0457611f046147ae565b016020015160f81c901b9190911790600101611ecf565b5061ffff811615611f3e5760405162461bcd60e51b815260040161043b9061480b565b5f805b6004811015611f9957611f5581600361479b565b611f609060086145ba565b63ffffffff1686611f728360026145d1565b81518110611f8257611f826147ae565b016020015160f81c901b9190911790600101611f41565b5063ffffffff8116600214611fc05760405162461bcd60e51b815260040161043b9061484e565b5f805b602081101561201557611fd781601f61479b565b611fe29060086145ba565b87611fee8360066145d1565b81518110611ffe57611ffe6147ae565b016020015160f81c901b9190911790600101611fc3565b505f8660268151811061202a5761202a6147ae565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f835160361461206e5760405162461bcd60e51b815260040161043b906147c2565b5f805b60028110156120bd5761208581600161479b565b6120909060086145ba565b61ffff168682815181106120a6576120a66147ae565b016020015160f81c901b9190911790600101612071565b5061ffff8116156120e05760405162461bcd60e51b815260040161043b9061480b565b5f805b600481101561213b576120f781600361479b565b6121029060086145ba565b63ffffffff16876121148360026145d1565b81518110612124576121246147ae565b016020015160f81c901b91909117906001016120e3565b5063ffffffff81166003146121625760405162461bcd60e51b815260040161043b9061484e565b5f805b60208110156121b75761217981601f61479b565b6121849060086145ba565b886121908360066145d1565b815181106121a0576121a06147ae565b016020015160f81c901b9190911790600101612165565b505f805b6008811015612216576121cf81600761479b565b6121da9060086145ba565b6001600160401b0316896121ef8360266145d1565b815181106121ff576121ff6147ae565b016020015160f81c901b91909117906001016121bb565b505f805b60088110156122755761222e81600761479b565b6122399060086145ba565b6001600160401b03168a61224e83602e6145d1565b8151811061225e5761225e6147ae565b016020015160f81c901b919091179060010161221a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f805160206149c08339815191529291906122cd906142d8565b90501180156122ff575060015f83815260068301602052604090205460ff1660048111156122fd576122fd614275565b145b611cc45760405162461bcd60e51b815260206004820152603860248201525f805160206149e083398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f80516020614a2083398151915280546001190161238f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206149c0833981519152906001600160401b03166020850135101561243c5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161043b565b6003810154843510156124a55760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161043b565b805483108015906124ba575080600101548311155b6125185760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61252284612f5d565b90505f61252e8261092a565b90505f61253b8883612f93565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f80516020614a2083398151915255565b5f8181525f80516020614a4083398151915260205260408082208151610100810190925280545f80516020614a0083398151915293929190829060ff1660058111156125cd576125cd614275565b60058111156125de576125de614275565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561266657612666614275565b146126c25760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461273c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6127498160a00151613460565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561278d5761278d614275565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612859846128538161180b565b5f6119d8565b5f85815260068501602052604090209091506128758282614354565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128a2908590600401614435565b6020604051808303815f875af11580156128be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128e29190614467565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61294061235e565b5f805160206149c08339815191525f61295b6101af85612f5d565b90505f6129678761187f565b905060028151600581111561297e5761297e614275565b146129dd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f828260a001516129ee9190614895565b60048501546001860154919250612a10916001600160401b03909116906145ba565b612a1982610eb4565b1115612a855760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161043b565b612a8f8882611990565b5f612a998961180b565b90505f8982604051602001612ac592919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612ae685613460565b5f612af28b84866119d8565b5f8381526007890160205260409020909150612b0e8282614354565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612b3b908590600401614435565b6020604051808303815f875af1158015612b57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b7b9190614467565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612c2a57612c2a614275565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610ef960015f80516020614a2083398151915255565b612d73613601565b612d7c8261364c565b611cc4816136aa565b5f808251602e14612da85760405162461bcd60e51b815260040161043b906147c2565b5f805b6002811015612df757612dbf81600161479b565b612dca9060086145ba565b61ffff16858281518110612de057612de06147ae565b016020015160f81c901b9190911790600101612dab565b5061ffff811615612e1a5760405162461bcd60e51b815260040161043b9061480b565b5f805b6004811015612e7557612e3181600361479b565b612e3c9060086145ba565b63ffffffff1686612e4e8360026145d1565b81518110612e5e57612e5e6147ae565b016020015160f81c901b9190911790600101612e1d565b5063ffffffff8116600414612e9c5760405162461bcd60e51b815260040161043b9061484e565b5f805b6020811015612ef157612eb381601f61479b565b612ebe9060086145ba565b87612eca8360066145d1565b81518110612eda57612eda6147ae565b016020015160f81c901b9190911790600101612e9f565b505f805b6008811015612f5057612f0981600761479b565b612f149060086145ba565b6001600160401b031688612f298360266145d1565b81518110612f3957612f396147ae565b016020015160f81c901b9190911790600101612ef5565b5090969095509350505050565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061375e565b5f5f80516020614a0083398151915242612fb3604086016020870161417c565b6001600160401b0316118015612fec5750612fd4604085016020860161417c565b6001600160401b0316612fea426202a3006145d1565b115b61304e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b83356130a65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b83355f908152600882016020526040902054156131165760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b61312360408501856148b5565b905060301461318a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b61319383613460565b5f8061322d6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906131d8919061417c565b6001600160401b031681526020016131f360408a018a6148b5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506138c0565b5f8281526005860160205260409020919350915061324b8282614354565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613278908590600401614435565b6020604051808303815f875af1158015613294573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132b89190614467565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561333a5761333a614275565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556133fb8361180b565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961343260408d0160208e0161417c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614a008339815191529060ff165f0361349e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906134e6908361479b565b10613502576001600160401b0384166040830152808252613521565b83826040018181516135149190614895565b6001600160401b03169052505b5f82602001518360400151606461353891906148fe565b6135429190614929565b600285015490915060ff90811690821611156135bd5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661364a57604051631afcd79f60e31b815260040160405180910390fd5b565b613654613601565b61365d81613c65565b6136a76060820135608083013561367a60c0850160a0860161417c565b60c0850135613690610100870160e0880161417c565b6136a26101208801610100890161494e565b613c86565b50565b6136b2613601565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661373e5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156137a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c89190614467565b90506137df6001600160a01b038516333086613e3a565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613823573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138479190614467565b90508181116138ad5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b6138b7828261479b565b95945050505050565b5f606082608001515160301461392a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156139a15761396181600161479b565b61396c9060086145ba565b5081515f90839083908110613983576139836147ae565b60200101906001600160f81b03191690815f1a90535060010161394d565b505f5b60048110156139ff576139b881600361479b565b6139c39060086145ba565b505f826139d18360026145d1565b815181106139e1576139e16147ae565b60200101906001600160f81b03191690815f1a9053506001016139a4565b505f5b6020811015613a5c5784518160208110613a1e57613a1e6147ae565b1a60f81b82613a2e8360066145d1565b81518110613a3e57613a3e6147ae565b60200101906001600160f81b03191690815f1a905350600101613a02565b505f5b6020811015613abc5784602001518160208110613a7e57613a7e6147ae565b1a60f81b82613a8e8360266145d1565b81518110613a9e57613a9e6147ae565b60200101906001600160f81b03191690815f1a905350600101613a5f565b505f5b6008811015613b3057613ad381600761479b565b613ade9060086145ba565b60ff1685604001516001600160401b0316901c60f81b82826046613b0291906145d1565b81518110613b1257613b126147ae565b60200101906001600160f81b03191690815f1a905350600101613abf565b505f5b6030811015613b9b5784608001518181518110613b5257613b526147ae565b01602001516001600160f81b03191682613b6d83604e6145d1565b81518110613b7d57613b7d6147ae565b60200101906001600160f81b03191690815f1a905350600101613b33565b505f5b6008811015613c0d57613bb281600761479b565b613bbd9060086145ba565b60608601516001600160401b0390811691161c60f81b82613bdf83607e6145d1565b81518110613bef57613bef6147ae565b60200101906001600160f81b03191690815f1a905350600101613b9e565b50600281604051613c1e9190614969565b602060405180830381855afa158015613c39573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c5c9190614467565b94909350915050565b613c6d613601565b613c75613e9a565b613c7d613eaa565b6136a781613eb2565b613c8e613601565b5f805160206149c083398151915283613cfa5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161043b565b85871115613d625760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161043b565b5f836001600160401b031611613dd55760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161043b565b95865560018601949094556002850180546001600160401b0394851667ffffffffffffffff199091161790556003850191909155600490930180546001600160a01b03909316600160401b026001600160e01b03199093169390911692909217179055565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052613e94908590613f1e565b50505050565b613ea2613601565b61364a613f7f565b61364a613601565b613eba613601565b80355f80516020614a0083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613f046060830160408401614984565b600291909101805460ff191660ff90921691909117905550565b5f613f326001600160a01b03841683613f87565b905080515f14158015613f56575080806020019051810190613f5491906149a4565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b61256c613601565b6060610ef983835f845f80856001600160a01b03168486604051613fab9190614969565b5f6040518083038185875af1925050503d805f8114613fe5576040519150601f19603f3d011682016040523d82523d5f602084013e613fea565b606091505b509150915061180186838360608261400a5761400582614051565b610ef9565b815115801561402157506001600160a01b0384163b155b1561404a57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610ef9565b8051156140615780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614086906142d8565b5f825580601f10614095575050565b601f0160209004905f5260205f20908101906136a791905b808211156140c0575f81556001016140ad565b5090565b80151581146136a7575f80fd5b803563ffffffff811681146140e4575f80fd5b919050565b5f805f606084860312156140fb575f80fd5b83359250602084013561410d816140c4565b915061411b604085016140d1565b90509250925092565b5f60208284031215614134575f80fd5b5035919050565b5f6020828403121561414b575f80fd5b610ef9826140d1565b5f8060408385031215614165575f80fd5b61416e836140d1565b946020939093013593505050565b5f6020828403121561418c575f80fd5b81356001600160401b0381168114610ef9575f80fd5b5f805f83850360808112156141b5575f80fd5b84356001600160401b038111156141ca575f80fd5b8501606081880312156141db575f80fd5b93506040601f19820112156141ee575f80fd5b50602084019150606084013590509250925092565b5f8060408385031215614214575f80fd5b50508035926020909101359150565b6001600160a01b03811681146136a7575f80fd5b5f8082840361014081121561424a575f80fd5b61012080821215614259575f80fd5b849350830135905061426a81614223565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156142bd576142bd614289565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806142ec57607f821691505b60208210810361430a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156143355750805b601f840160051c820191505b8181101561104c575f8155600101614341565b81516001600160401b0381111561436d5761436d6142c4565b6143818161437b84546142d8565b84614310565b602080601f8311600181146143b4575f841561439d5750858301515b5f19600386901b1c1916600185901b17855561440b565b5f85815260208120601f198616915b828110156143e2578886015182559484019460019091019084016143c3565b50858210156143ff57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561442d578181015183820152602001614415565b50505f910152565b602081525f8251806020840152614453816040850160208701614413565b601f01601f19169190910160400192915050565b5f60208284031215614477575f80fd5b5051919050565b5f60208083525f8454614490816142d8565b806020870152604060018084165f81146144b157600181146144cd576144fa565b60ff19851660408a0152604084151560051b8a010195506144fa565b895f5260205f205f5b858110156144f15781548b82018601529083019088016144d6565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261452a5761452a614508565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a614289565b8082018082111561093a5761093a614289565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b038111828210171561464d5761464d6142c4565b60405290565b604051601f8201601f191681016001600160401b038111828210171561467b5761467b6142c4565b604052919050565b80516140e4816140c4565b5f806040838503121561469f575f80fd5b82516001600160401b03808211156146b5575f80fd5b90840190606082870312156146c8575f80fd5b6146d061462b565b825181526020808401516146e381614223565b828201526040840151838111156146f8575f80fd5b80850194505087601f85011261470c575f80fd5b83518381111561471e5761471e6142c4565b614730601f8201601f19168301614653565b93508084528882828701011115614745575f80fd5b61475481838601848801614413565b50826040830152819550614769818801614683565b9450505050509250929050565b5f6001600160401b0380831681810361479157614791614289565b6001019392505050565b8181038181111561093a5761093a614289565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156142bd576142bd614289565b5f808335601e198436030181126148ca575f80fd5b8301803591506001600160401b038211156148e3575f80fd5b6020019150368190038213156148f7575f80fd5b9250929050565b6001600160401b0381811683821602808216919082811461492157614921614289565b505092915050565b5f6001600160401b038084168061494257614942614508565b92169190910492915050565b5f6020828403121561495e575f80fd5b8135610ef981614223565b5f825161497a818460208701614413565b9190910192915050565b5f60208284031215614994575f80fd5b813560ff81168114610ef9575f80fd5b5f602082840312156149b4575f80fd5b8151610ef9816140c456fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", -======= - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516148f43803806148f483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6147a78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e57806398f3e2b41161006e57806398f3e2b4146102645780639e1bc4ef14610277578063a3a65e481461028a578063b771b3bc1461029d578063bee0a03f146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e578063872fda6414610251575f80fd5b806327f39ca8116100e457806327f39ca8146101a15780632e2194d8146101b4578063467ef06f146101df5780635297fae6146101f25780636206585614610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004613e13565b6102d6565b005b610128610138366004613e4e565b610761565b61017b61014b366004613e4e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c366004613e4e565b6108bd565b6101286101af366004613e79565b61092a565b6101c76101c2366004613e4e565b610a0e565b6040516001600160401b039091168152602001610185565b6101286101ed366004613eb6565b610a24565b610128610200366004613ecf565b610a4f565b61017b610213366004613f0d565b610c40565b6101c7610226366004613e4e565b610c59565b610128610239366004613e4e565b610c6d565b61012861024c366004613e13565b610cda565b61017b61025f366004613fb8565b610cf5565b610128610272366004613ecf565b610d1a565b61017b610285366004614054565b610f49565b610128610298366004613eb6565b610f5c565b6102ab6005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102d1366004613e4e565b611119565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206146fb8339815191529184156103285761032582856111e8565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561035a5761035a614074565b600481111561036b5761036b614074565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f2614074565b146104445760405162461bcd60e51b815260206004820152602a60248201525f8051602061471b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f8051602061471b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611484565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561050057610500614074565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856114f8565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e919061409c565b905061066a86826115d7565b5f61067687858461161f565b5f8c815260058a01602052604090209091506106928282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf908590600401614227565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff9190614259565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061473b8339815191529291906107a9906140c3565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d9614074565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b89190614259565b505050565b6108c68161183c565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610973575080546001600160401b03808416911610155b156109915760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109bc848461190b565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a1e64e8d4a510008361430e565b92915050565b5f610a2e82611925565b9050610a4b81606001516001600160401b03168260400151611cb2565b5050565b5f805160206146fb8339815191525f610a6784611ce8565b90505f80610a788360400151611ec9565b5091509150610a8685612104565b5f8581526004850160205260408120610a9e91613d5b565b5f610aa8836114f8565b9050816001600160401b031681608001516001600160401b03161015610ae05760405162461bcd60e51b815260040161043b90614321565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610b255760405162461bcd60e51b815260040161043b90614363565b60015f87815260038701602052604090205460ff166004811115610b4b57610b4b614074565b14610bb45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a1e6001600160401b03831664e8d4a510006143ac565b5f610c63826114f8565b60a0015192915050565b610c7681612104565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f805160206146fb833981519152916005600160991b019163ee5b48eb9161087891600401614270565b8115610cec57610cea83826111e8565b505b6108b8836121dd565b5f80610d0086612595565b9050610d0e85828686612642565b9150505b949350505050565b5f805160206146fb8339815191525f610d3284611ce8565b90505f80610d438360400151611ec9565b5091509150610d518561183c565b5f8581526005850160205260408120610d6991613d5b565b5f610d73836114f8565b9050816001600160401b031681608001516001600160401b03161015610dab5760405162461bcd60e51b815260040161043b90614321565b5f8681526003808701602052604090912001546001600160401b0380841691161115610de95760405162461bcd60e51b815260040161043b90614363565b60035f87815260038701602052604090205460ff166004811115610e0f57610e0f614074565b14610e635760405162461bcd60e51b815260206004820152603160248201525f8051602061471b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f079190611cb2565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f55833384612a97565b9392505050565b5f8051602061473b8339815191525f610f7483611ce8565b90505f80610f858360400151612e52565b9150915080610fe75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260058501602052604081208054611001906140c3565b9050118015611033575060015f83815260078601602052604090205460ff16600581111561103157611031614074565b145b61104f5760405162461bcd60e51b815260040161043b906143c3565b5f828152600585016020526040812061106791613d5b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061473b833981519152929190611161906140c3565b9050118015611193575060015f83815260078301602052604090205460ff16600581111561119157611191614074565b145b6111af5760405162461bcd60e51b815260040161043b906143c3565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108789190600401614270565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611233573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261125a9190810190614415565b91509150806112bd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611300573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113249190614259565b8251146113885760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156113fe5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f8061140d8460400151612ff3565b9150915081871461147a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f8051602061477b8339815191526020526040812060030180545f8051602061473b833981519152916001600160401b03909116908190846114c9836144e7565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b611500613d92565b5f8281525f8051602061477b8339815191526020526040908190208151610100810190925280545f8051602061473b833981519152929190829060ff16600581111561154e5761154e614074565b600581111561155f5761155f614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061477b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156116985761165881600161450c565b6116639060086143ac565b5081515f9083908390811061167a5761167a61451f565b60200101906001600160f81b03191690815f1a905350600101611644565b505f5b60048110156116fb576116af81600361450c565b6116ba9060086143ac565b6001901c60f81b826116cd836002614533565b815181106116dd576116dd61451f565b60200101906001600160f81b03191690815f1a90535060010161169b565b505f5b602081101561175d5761171281601f61450c565b61171d9060086143ac565b86901c60f81b8261172f836006614533565b8151811061173f5761173f61451f565b60200101906001600160f81b03191690815f1a9053506001016116fe565b505f5b60088110156117c85761177481600761450c565b61177f9060086143ac565b6001600160401b038616901c60f81b8261179a836026614533565b815181106117aa576117aa61451f565b60200101906001600160f81b03191690815f1a905350600101611760565b505f5b6008811015611833576117df81600761450c565b6117ea9060086143ac565b6001600160401b038516901c60f81b8261180583602e614533565b815181106118155761181561451f565b60200101906001600160f81b03191690815f1a9053506001016117cb565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f805160206146fb833981519152929190611884906140c3565b90501180156118b6575060035f83815260038301602052604090205460ff1660048111156118b4576118b4614074565b145b610a4b5760405162461bcd60e51b815260206004820152603360248201525f8051602061471b83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b6119136131cb565b61191c82613216565b610a4b8161325c565b61192d613d92565b5f8051602061473b8339815191525f61194584611ce8565b90505f806119568360400151612e52565b9150915080156119bb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff1660058111156119ed576119ed614074565b60058111156119fe576119fe614074565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611a8557611a85614074565b1480611aa35750600182516005811115611aa157611aa1614074565b145b611b025760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611b1757611b17614074565b03611b3e57505f8381526006860160205260408120600491611b399190613d5b565b611b42565b5060055b6020808301515f90815260088801909152604081205581816005811115611b6b57611b6b614074565b90816005811115611b7e57611b7e614074565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611bb257611bb2614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611c7d57611c7d614074565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a4b906001600160a01b03168284613310565b60408051606080820183525f8083526020830181905292820152905f8051602061473b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d5d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d849190810190614415565b9150915080611deb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611e4e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611ec15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611eed5760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015611f3c57611f0481600161450c565b611f0f9060086143ac565b61ffff16868281518110611f2557611f2561451f565b016020015160f81c901b9190911790600101611ef0565b5061ffff811615611f5f5760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015611fba57611f7681600361450c565b611f819060086143ac565b63ffffffff1687611f93836002614533565b81518110611fa357611fa361451f565b016020015160f81c901b9190911790600101611f62565b5063ffffffff8116600314611fe15760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561203657611ff881601f61450c565b6120039060086143ac565b8861200f836006614533565b8151811061201f5761201f61451f565b016020015160f81c901b9190911790600101611fe4565b505f805b60088110156120955761204e81600761450c565b6120599060086143ac565b6001600160401b03168961206e836026614533565b8151811061207e5761207e61451f565b016020015160f81c901b919091179060010161203a565b505f805b60088110156120f4576120ad81600761450c565b6120b89060086143ac565b6001600160401b03168a6120cd83602e614533565b815181106120dd576120dd61451f565b016020015160f81c901b9190911790600101612099565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f805160206146fb83398151915292919061214c906140c3565b905011801561217e575060015f83815260038301602052604090205460ff16600481111561217c5761217c614074565b145b610a4b5760405162461bcd60e51b815260206004820152603860248201525f8051602061471b83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f8181525f8051602061477b83398151915260205260408082208151610100810190925280545f8051602061473b83398151915293929190829060ff16600581111561222b5761222b614074565b600581111561223c5761223c614074565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122c4576122c4614074565b146123205760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b03161461239a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b6123a78160a0015161336f565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156123eb576123eb614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124b7846124b181611484565b5f61161f565b5f85815260068501602052604090209091506124d38282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612500908590600401614227565b6020604051808303815f875af115801561251c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125409190614259565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f805160206146fb833981519152816125ae84613510565b90505f6125ba82610a0e565b83549091506001600160401b038216108015906125e457508260010154816001600160401b031611155b610d125760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61264b613546565b5f8051602061473b833981519152426001600160401b03851611801561268557506001600160401b038416612683426202a300614533565b115b6126e75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b8561273e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b5f868152600882016020526040902054156127ac5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b82516030146128135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b61281c8561336f565b5f806128636040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b031681526020018781525061357d565b5f828152600586016020526040902091935091506128818282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128ae908590600401614227565b6020604051808303815f875af11580156128ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ee9190614259565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561297057612970614074565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055612a3183611484565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610d1260015f8051602061475b83398151915255565b5f612aa0613546565b5f612aad6101c284613510565b90505f805160206146fb8339815191525f612ac7876114f8565b9050600281516005811115612ade57612ade614074565b14612b3d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f838260a00151612b4e9190614619565b9050612b5a88826115d7565b5f612b6489611484565b90505f898983604051602001612bac9392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b604051602081830303815290604052805190602001209050612bcd8661336f565b5f612bd98b848661161f565b5f8381526004880160205260409020909150612bf58282614146565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c22908590600401614227565b6020604051808303815f875af1158015612c3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c629190614259565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d1157612d11614074565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610f5560015f8051602061475b83398151915255565b5f808251602714612e755760405162461bcd60e51b815260040161043b90614546565b5f805b6002811015612ec457612e8c81600161450c565b612e979060086143ac565b61ffff16858281518110612ead57612ead61451f565b016020015160f81c901b9190911790600101612e78565b5061ffff811615612ee75760405162461bcd60e51b815260040161043b9061458f565b5f805b6004811015612f4257612efe81600361450c565b612f099060086143ac565b63ffffffff1686612f1b836002614533565b81518110612f2b57612f2b61451f565b016020015160f81c901b9190911790600101612eea565b5063ffffffff8116600214612f695760405162461bcd60e51b815260040161043b906145d2565b5f805b6020811015612fbe57612f8081601f61450c565b612f8b9060086143ac565b87612f97836006614533565b81518110612fa757612fa761451f565b016020015160f81c901b9190911790600101612f6c565b505f86602681518110612fd357612fd361451f565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146130165760405162461bcd60e51b815260040161043b90614546565b5f805b60028110156130655761302d81600161450c565b6130389060086143ac565b61ffff1685828151811061304e5761304e61451f565b016020015160f81c901b9190911790600101613019565b5061ffff8116156130885760405162461bcd60e51b815260040161043b9061458f565b5f805b60048110156130e35761309f81600361450c565b6130aa9060086143ac565b63ffffffff16866130bc836002614533565b815181106130cc576130cc61451f565b016020015160f81c901b919091179060010161308b565b5063ffffffff811660041461310a5760405162461bcd60e51b815260040161043b906145d2565b5f805b602081101561315f5761312181601f61450c565b61312c9060086143ac565b87613138836006614533565b815181106131485761314861451f565b016020015160f81c901b919091179060010161310d565b505f805b60088110156131be5761317781600761450c565b6131829060086143ac565b6001600160401b031688613197836026614533565b815181106131a7576131a761451f565b016020015160f81c901b9190911790600101613163565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661321457604051631afcd79f60e31b815260040160405180910390fd5b565b61321e6131cb565b61322781613935565b6132596060820135608083013561324460c0850160a08601613f0d565b61325460e0860160c08701614639565b613956565b50565b6132646131cb565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132f05760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506139b1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061473b8339815191529060ff165f036133ad575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133f5908361450c565b10613411576001600160401b0384166040830152808252613430565b83826040018181516134239190614619565b6001600160401b03169052505b5f8260200151836040015160646134479190614654565b613451919061467f565b600285015490915060ff90811690821611156134cc5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610a1e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613a12565b5f8051602061475b83398151915280546001190161357757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f60608260800151516030146135e75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561365e5761361e81600161450c565b6136299060086143ac565b5081515f908390839081106136405761364061451f565b60200101906001600160f81b03191690815f1a90535060010161360a565b505f5b60048110156136bc5761367581600361450c565b6136809060086143ac565b505f8261368e836002614533565b8151811061369e5761369e61451f565b60200101906001600160f81b03191690815f1a905350600101613661565b505f5b602081101561371957845181602081106136db576136db61451f565b1a60f81b826136eb836006614533565b815181106136fb576136fb61451f565b60200101906001600160f81b03191690815f1a9053506001016136bf565b505f5b6020811015613779578460200151816020811061373b5761373b61451f565b1a60f81b8261374b836026614533565b8151811061375b5761375b61451f565b60200101906001600160f81b03191690815f1a90535060010161371c565b505f5b60088110156137ed5761379081600761450c565b61379b9060086143ac565b60ff1685604001516001600160401b0316901c60f81b828260466137bf9190614533565b815181106137cf576137cf61451f565b60200101906001600160f81b03191690815f1a90535060010161377c565b505f5b6030811015613858578460800151818151811061380f5761380f61451f565b01602001516001600160f81b0319168261382a83604e614533565b8151811061383a5761383a61451f565b60200101906001600160f81b03191690815f1a9053506001016137f0565b505f5b60088110156138ca5761386f81600761450c565b61387a9060086143ac565b60608601516001600160401b0390811691161c60f81b8261389c83607e614533565b815181106138ac576138ac61451f565b60200101906001600160f81b03191690815f1a90535060010161385b565b506002816040516138db91906146a4565b602060405180830381855afa1580156138f6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139199190614259565b94909350915050565b60015f8051602061475b83398151915255565b61393d6131cb565b613945613b74565b61394d613b84565b61325981613b8c565b61395e6131cb565b5f5f805160206146fb833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b5f6139c56001600160a01b03841683613bf8565b905080515f141580156139e95750808060200190518101906139e791906146bf565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613a58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a7c9190614259565b9050613a936001600160a01b038516333086613c05565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613ad7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afb9190614259565b9050818111613b615760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613b6b828261450c565b95945050505050565b613b7c6131cb565b613214613c44565b6132146131cb565b613b946131cb565b80355f8051602061473b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613bde60608301604084016146da565b600291909101805460ff191660ff90921691909117905550565b6060610f5583835f613c4c565b6040516001600160a01b038481166024830152838116604483015260648201839052613c3e9186918216906323b872dd9060840161333d565b50505050565b6139226131cb565b606081471015613c715760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b03168486604051613c8c91906146a4565b5f6040518083038185875af1925050503d805f8114613cc6576040519150601f19603f3d011682016040523d82523d5f602084013e613ccb565b606091505b509150915061147a868383606082613ceb57613ce682613d32565b610f55565b8151158015613d0257506001600160a01b0384163b155b15613d2b57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610f55565b805115613d425780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613d67906140c3565b5f825580601f10613d76575050565b601f0160209004905f5260205f20908101906132599190613dd6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613dea575f8155600101613dd7565b5090565b8015158114613259575f80fd5b803563ffffffff81168114613e0e575f80fd5b919050565b5f805f60608486031215613e25575f80fd5b833592506020840135613e3781613dee565b9150613e4560408501613dfb565b90509250925092565b5f60208284031215613e5e575f80fd5b5035919050565b6001600160a01b0381168114613259575f80fd5b5f80828403610100811215613e8c575f80fd5b60e0811215613e99575f80fd5b5082915060e0830135613eab81613e65565b809150509250929050565b5f60208284031215613ec6575f80fd5b610f5582613dfb565b5f8060408385031215613ee0575f80fd5b613ee983613dfb565b946020939093013593505050565b80356001600160401b0381168114613e0e575f80fd5b5f60208284031215613f1d575f80fd5b610f5582613ef7565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613f5c57613f5c613f26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613f8a57613f8a613f26565b604052919050565b5f6001600160401b03821115613faa57613faa613f26565b50601f01601f191660200190565b5f805f8060808587031215613fcb575f80fd5b8435935060208501359250613fe260408601613ef7565b915060608501356001600160401b03811115613ffc575f80fd5b8501601f8101871361400c575f80fd5b803561401f61401a82613f92565b613f62565b818152886020838501011115614033575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f8060408385031215614065575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140bc576140bc614088565b5092915050565b600181811c908216806140d757607f821691505b6020821081036140f557634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156141205750805b601f840160051c820191505b8181101561413f575f815560010161412c565b5050505050565b81516001600160401b0381111561415f5761415f613f26565b6141738161416d84546140c3565b846140fb565b602080601f8311600181146141a6575f841561418f5750858301515b5f19600386901b1c1916600185901b1785556141fd565b5f85815260208120601f198616915b828110156141d4578886015182559484019460019091019084016141b5565b50858210156141f157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561421f578181015183820152602001614207565b50505f910152565b602081525f8251806020840152614245816040850160208701614205565b601f01601f19169190910160400192915050565b5f60208284031215614269575f80fd5b5051919050565b5f60208083525f8454614282816140c3565b806020870152604060018084165f81146142a357600181146142bf576142ec565b60ff19851660408a0152604084151560051b8a010195506142ec565b895f5260205f205f5b858110156142e35781548b82018601529083019088016142c8565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261431c5761431c6142fa565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a1e57610a1e614088565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b8051613e0e81613dee565b5f8060408385031215614426575f80fd5b82516001600160401b038082111561443c575f80fd5b908401906060828703121561444f575f80fd5b614457613f3a565b8251815260208084015161446a81613e65565b8282015260408401518381111561447f575f80fd5b80850194505087601f850112614493575f80fd5b835192506144a361401a84613f92565b83815288828587010111156144b6575f80fd5b6144c584838301848801614205565b806040840152508195506144da81880161440a565b9450505050509250929050565b5f6001600160401b0380831681810361450257614502614088565b6001019392505050565b81810381811115610a1e57610a1e614088565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a1e57610a1e614088565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140bc576140bc614088565b5f60208284031215614649575f80fd5b8135610f5581613e65565b6001600160401b0381811683821602808216919082811461467757614677614088565b505092915050565b5f6001600160401b0380841680614698576146986142fa565b92169190910492915050565b5f82516146b5818460208701614205565b9190910192915050565b5f602082840312156146cf575f80fd5b8151610f5581613dee565b5f602082840312156146ea575f80fd5b813560ff81168114610f55575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", ->>>>>>> origin/staking-contract + Bin: "0x608060405234801561000f575f80fd5b50604051614d33380380614d3383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614be68061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063b771b3bc1461028a578063bee0a03f146102b0578063fbf50cdb146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e57806398f3e2b414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806365b3a62114610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004614263565b6102d6565b005b61012861013836600461429e565b610761565b61017b61014b36600461429e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c36600461429e565b6108bd565b6101b46101af36600461429e565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da3660046142b5565b610940565b6101286101ed3660046142ce565b61096b565b61017b6102003660046142f6565b610b5c565b61017b61021336600461431c565b610b75565b6101b461022636600461429e565b610ba8565b61012861023936600461429e565b610bbc565b61012861024c366004614263565b610c29565b61012861025f3660046142ce565b610cfb565b61017b61027236600461437d565b610f2b565b6101286102853660046142b5565b610f37565b6102986005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102be36600461429e565b6110f4565b6101286102d13660046143b1565b6111c3565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614b3a8339815191529184156103285761032582856112a7565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561035a5761035a6143ef565b600481111561036b5761036b6143ef565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f26143ef565b146104445760405162461bcd60e51b815260206004820152602a60248201525f80516020614b5a8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f80516020614b5a8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611543565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff19166001836004811115610500576105006143ef565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856115b7565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190614417565b905061066a8682611696565b5f6106768785846116de565b5f8c815260088a016020526040902090915061069282826144ce565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016145af565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906145e1565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020614b7a8339815191529291906107a990614452565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d96143ef565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016145f8565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906145e1565b505050565b6108c6816118fb565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614b3a833981519152916005600160991b019163ee5b48eb91610878916004016145f8565b5f61093a64e8d4a5100083614696565b92915050565b5f61094a826119ca565b905061096781606001516001600160401b03168260400151611d57565b5050565b5f80516020614b3a8339815191525f61098384611d8d565b90505f806109948360400151611f6e565b50915091506109a2856121a9565b5f85815260078501602052604081206109ba916141ab565b5f6109c4836115b7565b9050816001600160401b031681608001516001600160401b031610156109fc5760405162461bcd60e51b815260040161043b906146a9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a415760405162461bcd60e51b815260040161043b906146eb565b60015f87815260068701602052604090205460ff166004811115610a6757610a676143ef565b14610ad05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a51000614734565b5f610b7e612282565b610b898484846122b9565b9050610ba160015f80516020614b9a83398151915255565b9392505050565b5f610bb2826115b7565b60a0015192915050565b610bc5816121a9565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f80516020614b3a833981519152916005600160991b019163ee5b48eb91610878916004016145f8565b5f80516020614b3a8339815191525f610c41856115b7565b5f86815260058401602052604090206001015460c0820151919250610c6e916001600160401b031661474b565b421015610cd95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161043b565b8315610ceb57610ce985846112a7565b505b610cf4856124a3565b5050505050565b5f80516020614b3a8339815191525f610d1384611d8d565b90505f80610d248360400151611f6e565b5091509150610d32856118fb565b5f8581526008850160205260408120610d4a916141ab565b5f610d54836115b7565b9050816001600160401b031681608001516001600160401b03161015610d8c5760405162461bcd60e51b815260040161043b906146a9565b5f8681526006860160205260409020600301546001600160401b0380841691161115610dca5760405162461bcd60e51b815260040161043b906146eb565b60035f87815260068701602052604090205460ff166004811115610df057610df06143ef565b14610e445760405162461bcd60e51b815260206004820152603160248201525f80516020614b5a8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610ee991611d57565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610ba183338461285b565b5f80516020614b7a8339815191525f610f4f83611d8d565b90505f80610f608360400151612c8f565b9150915080610fc25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260058501602052604081208054610fdc90614452565b905011801561100e575060015f83815260078601602052604090205460ff16600581111561100c5761100c6143ef565b145b61102a5760405162461bcd60e51b815260040161043b9061475e565b5f8281526005850160205260408120611042916141ab565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614b7a83398151915292919061113c90614452565b905011801561116e575060015f83815260078301602052604090205460ff16600581111561116c5761116c6143ef565b145b61118a5760405162461bcd60e51b815260040161043b9061475e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016145f8565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061120c575080546001600160401b03808416911610155b1561122a5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556112558484612e30565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112f2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113199190810190614808565b915091508061137c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e391906145e1565b8251146114475760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156114bd5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806114cc8460400151612e4a565b915091508187146115395760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f80516020614bba8339815191526020526040812060030180545f80516020614b7a833981519152916001600160401b0390911690819084611588836148f0565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115bf6141e2565b5f8281525f80516020614bba8339815191526020526040908190208151610100810190925280545f80516020614b7a833981519152929190829060ff16600581111561160d5761160d6143ef565b600581111561161e5761161e6143ef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614bba833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561175757611717816001614915565b611722906008614734565b5081515f9083908390811061173957611739614928565b60200101906001600160f81b03191690815f1a905350600101611703565b505f5b60048110156117ba5761176e816003614915565b611779906008614734565b6001901c60f81b8261178c83600261474b565b8151811061179c5761179c614928565b60200101906001600160f81b03191690815f1a90535060010161175a565b505f5b602081101561181c576117d181601f614915565b6117dc906008614734565b86901c60f81b826117ee83600661474b565b815181106117fe576117fe614928565b60200101906001600160f81b03191690815f1a9053506001016117bd565b505f5b600881101561188757611833816007614915565b61183e906008614734565b6001600160401b038616901c60f81b8261185983602661474b565b8151811061186957611869614928565b60200101906001600160f81b03191690815f1a90535060010161181f565b505f5b60088110156118f25761189e816007614915565b6118a9906008614734565b6001600160401b038516901c60f81b826118c483602e61474b565b815181106118d4576118d4614928565b60200101906001600160f81b03191690815f1a90535060010161188a565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f80516020614b3a83398151915292919061194390614452565b9050118015611975575060035f83815260068301602052604090205460ff166004811115611973576119736143ef565b145b6109675760405162461bcd60e51b815260206004820152603360248201525f80516020614b5a83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b6119d26141e2565b5f80516020614b7a8339815191525f6119ea84611d8d565b90505f806119fb8360400151612c8f565b915091508015611a605760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611a9257611a926143ef565b6005811115611aa357611aa36143ef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b2a57611b2a6143ef565b1480611b485750600182516005811115611b4657611b466143ef565b145b611ba75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611bbc57611bbc6143ef565b03611be357505f8381526006860160205260408120600491611bde91906141ab565b611be7565b5060055b6020808301515f90815260088801909152604081205581816005811115611c1057611c106143ef565b90816005811115611c2357611c236143ef565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611c5757611c576143ef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d2257611d226143ef565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610967906001600160a01b03168284613022565b60408051606080820183525f8083526020830181905292820152905f80516020614b7a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e02573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e299190810190614808565b9150915080611e905760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611ef35760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611f665760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611f925760405162461bcd60e51b815260040161043b9061493c565b5f805b6002811015611fe157611fa9816001614915565b611fb4906008614734565b61ffff16868281518110611fca57611fca614928565b016020015160f81c901b9190911790600101611f95565b5061ffff8116156120045760405162461bcd60e51b815260040161043b90614985565b5f805b600481101561205f5761201b816003614915565b612026906008614734565b63ffffffff168761203883600261474b565b8151811061204857612048614928565b016020015160f81c901b9190911790600101612007565b5063ffffffff81166003146120865760405162461bcd60e51b815260040161043b906149c8565b5f805b60208110156120db5761209d81601f614915565b6120a8906008614734565b886120b483600661474b565b815181106120c4576120c4614928565b016020015160f81c901b9190911790600101612089565b505f805b600881101561213a576120f3816007614915565b6120fe906008614734565b6001600160401b03168961211383602661474b565b8151811061212357612123614928565b016020015160f81c901b91909117906001016120df565b505f805b600881101561219957612152816007614915565b61215d906008614734565b6001600160401b03168a61217283602e61474b565b8151811061218257612182614928565b016020015160f81c901b919091179060010161213e565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f80516020614b3a8339815191529291906121f190614452565b9050118015612223575060015f83815260068301602052604090205460ff166004811115612221576122216143ef565b145b6109675760405162461bcd60e51b815260206004820152603860248201525f80516020614b5a83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f80516020614b9a8339815191528054600119016122b357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614b3a833981519152906001600160401b0316602085013510156123605760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161043b565b6003810154843510156123c95760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161043b565b805483108015906123de575080600101548311155b61243c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61244684613081565b90505f6124528261092a565b90505f61245f88836130b7565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f80516020614b9a83398151915255565b5f8181525f80516020614bba83398151915260205260408082208151610100810190925280545f80516020614b7a83398151915293929190829060ff1660058111156124f1576124f16143ef565b6005811115612502576125026143ef565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561258a5761258a6143ef565b146125e65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146126605760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b61266d8160a00151613584565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156126b1576126b16143ef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61277d8461277781611543565b5f6116de565b5f858152600685016020526040902090915061279982826144ce565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127c69085906004016145af565b6020604051808303815f875af11580156127e2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061280691906145e1565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f612864612282565b5f80516020614b3a8339815191525f61287f6101af85613081565b90505f61288b876115b7565b90506002815160058111156128a2576128a26143ef565b146129015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f828260a001516129129190614a0f565b60048501546001860154919250612934916001600160401b0390911690614734565b61293d82610b5c565b11156129a95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161043b565b6129b38882611696565b5f6129bd89611543565b90505f89826040516020016129e992919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612a0a85613584565b5f612a168b84866116de565b5f8381526007890160205260409020909150612a3282826144ce565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612a5f9085906004016145af565b6020604051808303815f875af1158015612a7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9f91906145e1565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612b4e57612b4e6143ef565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610ba160015f80516020614b9a83398151915255565b5f808251602714612cb25760405162461bcd60e51b815260040161043b9061493c565b5f805b6002811015612d0157612cc9816001614915565b612cd4906008614734565b61ffff16858281518110612cea57612cea614928565b016020015160f81c901b9190911790600101612cb5565b5061ffff811615612d245760405162461bcd60e51b815260040161043b90614985565b5f805b6004811015612d7f57612d3b816003614915565b612d46906008614734565b63ffffffff1686612d5883600261474b565b81518110612d6857612d68614928565b016020015160f81c901b9190911790600101612d27565b5063ffffffff8116600214612da65760405162461bcd60e51b815260040161043b906149c8565b5f805b6020811015612dfb57612dbd81601f614915565b612dc8906008614734565b87612dd483600661474b565b81518110612de457612de4614928565b016020015160f81c901b9190911790600101612da9565b505f86602681518110612e1057612e10614928565b016020015191976001600160f81b03199092161515965090945050505050565b612e38613725565b612e4182613770565b610967816137ce565b5f808251602e14612e6d5760405162461bcd60e51b815260040161043b9061493c565b5f805b6002811015612ebc57612e84816001614915565b612e8f906008614734565b61ffff16858281518110612ea557612ea5614928565b016020015160f81c901b9190911790600101612e70565b5061ffff811615612edf5760405162461bcd60e51b815260040161043b90614985565b5f805b6004811015612f3a57612ef6816003614915565b612f01906008614734565b63ffffffff1686612f1383600261474b565b81518110612f2357612f23614928565b016020015160f81c901b9190911790600101612ee2565b5063ffffffff8116600414612f615760405162461bcd60e51b815260040161043b906149c8565b5f805b6020811015612fb657612f7881601f614915565b612f83906008614734565b87612f8f83600661474b565b81518110612f9f57612f9f614928565b016020015160f81c901b9190911790600101612f64565b505f805b600881101561301557612fce816007614915565b612fd9906008614734565b6001600160401b031688612fee83602661474b565b81518110612ffe57612ffe614928565b016020015160f81c901b9190911790600101612fba565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613882565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906138e3565b5f5f80516020614b7a833981519152426130d760408601602087016142f6565b6001600160401b031611801561311057506130f860408501602086016142f6565b6001600160401b031661310e426202a30061474b565b115b6131725760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b83356131ca5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b83355f9081526008820160205260409020541561323a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b6132476040850185614a2f565b90506030146132ae5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b6132b783613584565b5f806133516040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906132fc91906142f6565b6001600160401b0316815260200161331760408a018a614a2f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613a45565b5f8281526005860160205260409020919350915061336f82826144ce565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061339c9085906004016145af565b6020604051808303815f875af11580156133b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133dc91906145e1565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561345e5761345e6143ef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561351f83611543565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961355660408d0160208e016142f6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614b7a8339815191529060ff165f036135c2575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061360a9083614915565b10613626576001600160401b0384166040830152808252613645565b83826040018181516136389190614a0f565b6001600160401b03169052505b5f82602001518360400151606461365c9190614a78565b6136669190614aa3565b600285015490915060ff90811690821611156136e15760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661376e57604051631afcd79f60e31b815260040160405180910390fd5b565b613778613725565b61378181613dea565b6137cb6060820135608083013561379e60c0850160a086016142f6565b60c08501356137b4610100870160e088016142f6565b6137c661012088016101008901614ac8565b613e0b565b50565b6137d6613725565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166138625760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6138966001600160a01b03841683613fbf565b905080515f141580156138ba5750808060200190518101906138b89190614ae3565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061394d91906145e1565b90506139646001600160a01b038516333086613fcc565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139cc91906145e1565b9050818111613a325760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613a3c8282614915565b95945050505050565b5f6060826080015151603014613aaf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613b2657613ae6816001614915565b613af1906008614734565b5081515f90839083908110613b0857613b08614928565b60200101906001600160f81b03191690815f1a905350600101613ad2565b505f5b6004811015613b8457613b3d816003614915565b613b48906008614734565b505f82613b5683600261474b565b81518110613b6657613b66614928565b60200101906001600160f81b03191690815f1a905350600101613b29565b505f5b6020811015613be15784518160208110613ba357613ba3614928565b1a60f81b82613bb383600661474b565b81518110613bc357613bc3614928565b60200101906001600160f81b03191690815f1a905350600101613b87565b505f5b6020811015613c415784602001518160208110613c0357613c03614928565b1a60f81b82613c1383602661474b565b81518110613c2357613c23614928565b60200101906001600160f81b03191690815f1a905350600101613be4565b505f5b6008811015613cb557613c58816007614915565b613c63906008614734565b60ff1685604001516001600160401b0316901c60f81b82826046613c87919061474b565b81518110613c9757613c97614928565b60200101906001600160f81b03191690815f1a905350600101613c44565b505f5b6030811015613d205784608001518181518110613cd757613cd7614928565b01602001516001600160f81b03191682613cf283604e61474b565b81518110613d0257613d02614928565b60200101906001600160f81b03191690815f1a905350600101613cb8565b505f5b6008811015613d9257613d37816007614915565b613d42906008614734565b60608601516001600160401b0390811691161c60f81b82613d6483607e61474b565b81518110613d7457613d74614928565b60200101906001600160f81b03191690815f1a905350600101613d23565b50600281604051613da39190614afe565b602060405180830381855afa158015613dbe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613de191906145e1565b94909350915050565b613df2613725565b613dfa61400b565b613e0261401b565b6137cb81614023565b613e13613725565b5f80516020614b3a83398151915283613e7f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161043b565b85871115613ee75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161043b565b5f836001600160401b031611613f5a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161043b565b95865560018601949094556002850180546001600160401b0394851667ffffffffffffffff199091161790556003850191909155600490930180546001600160a01b03909316600160401b026001600160e01b03199093169390911692909217179055565b6060610ba183835f61408f565b6040516001600160a01b0384811660248301528381166044830152606482018390526140059186918216906323b872dd9060840161304f565b50505050565b614013613725565b61376e61411e565b61376e613725565b61402b613725565b80355f80516020614b7a83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556140756060830160408401614b19565b600291909101805460ff191660ff90921691909117905550565b6060814710156140b45760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b031684866040516140cf9190614afe565b5f6040518083038185875af1925050503d805f8114614109576040519150601f19603f3d011682016040523d82523d5f602084013e61410e565b606091505b5091509150611539868383614126565b612490613725565b60608261413b5761413682614182565b610ba1565b815115801561415257506001600160a01b0384163b155b1561417b57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610ba1565b8051156141925780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546141b790614452565b5f825580601f106141c6575050565b601f0160209004905f5260205f20908101906137cb9190614226565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561423a575f8155600101614227565b5090565b80151581146137cb575f80fd5b803563ffffffff8116811461425e575f80fd5b919050565b5f805f60608486031215614275575f80fd5b8335925060208401356142878161423e565b91506142956040850161424b565b90509250925092565b5f602082840312156142ae575f80fd5b5035919050565b5f602082840312156142c5575f80fd5b610ba18261424b565b5f80604083850312156142df575f80fd5b6142e88361424b565b946020939093013593505050565b5f60208284031215614306575f80fd5b81356001600160401b0381168114610ba1575f80fd5b5f805f838503608081121561432f575f80fd5b84356001600160401b03811115614344575f80fd5b850160608188031215614355575f80fd5b93506040601f1982011215614368575f80fd5b50602084019150606084013590509250925092565b5f806040838503121561438e575f80fd5b50508035926020909101359150565b6001600160a01b03811681146137cb575f80fd5b5f808284036101408112156143c4575f80fd5b610120808212156143d3575f80fd5b84935083013590506143e48161439d565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561443757614437614403565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061446657607f821691505b60208210810361448457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156144af5750805b601f840160051c820191505b81811015610cf4575f81556001016144bb565b81516001600160401b038111156144e7576144e761443e565b6144fb816144f58454614452565b8461448a565b602080601f83116001811461452e575f84156145175750858301515b5f19600386901b1c1916600185901b178555614585565b5f85815260208120601f198616915b8281101561455c5788860151825594840194600190910190840161453d565b508582101561457957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156145a757818101518382015260200161458f565b50505f910152565b602081525f82518060208401526145cd81604085016020870161458d565b601f01601f19169190910160400192915050565b5f602082840312156145f1575f80fd5b5051919050565b5f60208083525f845461460a81614452565b806020870152604060018084165f811461462b576001811461464757614674565b60ff19851660408a0152604084151560051b8a01019550614674565b895f5260205f205f5b8581101561466b5781548b8201860152908301908801614650565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826146a4576146a4614682565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a614403565b8082018082111561093a5761093a614403565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b03811182821017156147c7576147c761443e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156147f5576147f561443e565b604052919050565b805161425e8161423e565b5f8060408385031215614819575f80fd5b82516001600160401b038082111561482f575f80fd5b9084019060608287031215614842575f80fd5b61484a6147a5565b8251815260208084015161485d8161439d565b82820152604084015183811115614872575f80fd5b80850194505087601f850112614886575f80fd5b8351838111156148985761489861443e565b6148aa601f8201601f191683016147cd565b935080845288828287010111156148bf575f80fd5b6148ce8183860184880161458d565b508260408301528195506148e38188016147fd565b9450505050509250929050565b5f6001600160401b0380831681810361490b5761490b614403565b6001019392505050565b8181038181111561093a5761093a614403565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561443757614437614403565b5f808335601e19843603018112614a44575f80fd5b8301803591506001600160401b03821115614a5d575f80fd5b602001915036819003821315614a71575f80fd5b9250929050565b6001600160401b03818116838216028082169190828114614a9b57614a9b614403565b505092915050565b5f6001600160401b0380841680614abc57614abc614682565b92169190910492915050565b5f60208284031215614ad8575f80fd5b8135610ba18161439d565b5f60208284031215614af3575f80fd5b8151610ba18161423e565b5f8251614b0f81846020870161458d565b9190910192915050565b5f60208284031215614b29575f80fd5b813560ff81168114610ba1575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 460203994..8bd7fd291 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -62,13 +62,8 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ -<<<<<<< HEAD - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516147df3803806147df83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146928061014d5f395ff3fe608060405260043610610105575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102e8578063b771b3bc14610307578063bee0a03f14610339578063c599e24f14610358578063dac806231461036b575f80fd5b806366435abf1461026c5780636d0e43fa1461028b57806376f78621146102aa57806398f3e2b4146102c9575f80fd5b8063162f1f61116100d8578063162f1f61146101b95780632e2194d8146101d8578063467ef06f1461020f5780635297fae61461022e578063620658561461024d575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063104595c4146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613d7f565b61038a565b005b348015610135575f80fd5b50610128610144366004613dba565b610815565b348015610154575f80fd5b50610193610163366004613dba565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101936101b4366004613dd1565b610971565b3480156101c4575f80fd5b506101286101d3366004613dba565b6109a3565b3480156101e3575f80fd5b506101f76101f2366004613dba565b610a10565b6040516001600160401b03909116815260200161019d565b34801561021a575f80fd5b50610128610229366004613e2a565b610a20565b348015610239575f80fd5b50610128610248366004613e43565b610da3565b348015610258575f80fd5b50610193610267366004613e6b565b610f94565b348015610277575f80fd5b506101f7610286366004613dba565b610fad565b348015610296575f80fd5b506101286102a5366004613dba565b610fc1565b3480156102b5575f80fd5b506101286102c4366004613d7f565b61102e565b3480156102d4575f80fd5b506101286102e3366004613e43565b611100565b3480156102f3575f80fd5b50610128610302366004613e2a565b6112a0565b348015610312575f80fd5b506103216005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610344575f80fd5b50610128610353366004613dba565b61145d565b610193610366366004613dba565b61152c565b348015610376575f80fd5b50610128610385366004613e91565b611538565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206145e68339815191529184156103dc576103d9828561161a565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561040e5761040e613ea8565b600481111561041f5761041f613ea8565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6613ea8565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206146068339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206146068339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f610567846118b6565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4613ea8565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106868561192a565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a001516107129190613ed0565b905061071e8682611a3b565b5f61072a878584611a83565b5f8c815260088a01602052604090209091506107468282613f81565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610773908590600401614062565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190614094565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061462683398151915292919061085d90613f0b565b905011801561088f575060035f83815260078301602052604090205460ff16600581111561088d5761088d613ea8565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c91906004016140ab565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190614094565b505050565b5f61097a611ca2565b610985838334611cd9565b905061099d60015f8051602061464683398151915255565b92915050565b6109ac81611eb8565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f805160206145e6833981519152916005600160991b019163ee5b48eb9161092c916004016140ab565b5f61099d64e8d4a5100083614149565b5f805160206146268339815191525f610a3883611f8b565b90505f80610a49836040015161216c565b915091508015610aae5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610ae057610ae0613ea8565b6005811115610af157610af1613ea8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610b7857610b78613ea8565b1480610b965750600182516005811115610b9457610b94613ea8565b145b610bf55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115610c0a57610c0a613ea8565b03610c3157505f8381526006860160205260408120600491610c2c9190613d10565b610c35565b5060055b6020808301515f90815260088801909152604081205581816005811115610c5e57610c5e613ea8565b90816005811115610c7157610c71613ea8565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610ca557610ca5613ea8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610d7057610d70613ea8565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f805160206145e68339815191525f610dbb84611f8b565b90505f80610dcc836040015161230d565b5091509150610dda85612548565b5f8581526007850160205260408120610df291613d10565b5f610dfc8361192a565b9050816001600160401b031681608001516001600160401b03161015610e345760405162461bcd60e51b81526004016104ef9061415c565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e795760405162461bcd60e51b81526004016104ef9061419e565b60015f87815260068701602052604090205460ff166004811115610e9f57610e9f613ea8565b14610f085760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61099d6001600160401b03831664e8d4a510006141e7565b5f610fb78261192a565b60a0015192915050565b610fca81612548565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f805160206145e6833981519152916005600160991b019163ee5b48eb9161092c916004016140ab565b5f805160206145e68339815191525f6110468561192a565b5f86815260058401602052604090206001015460c0820151919250611073916001600160401b03166141fe565b4210156110de5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104ef565b83156110f0576110ee858461161a565b505b6110f985612621565b5050505050565b5f805160206145e68339815191525f61111884611f8b565b90505f80611129836040015161230d565b509150915061113785611eb8565b5f858152600885016020526040812061114f91613d10565b5f6111598361192a565b9050816001600160401b031681608001516001600160401b031610156111915760405162461bcd60e51b81526004016104ef9061415c565b5f8681526006860160205260409020600301546001600160401b03808416911611156111cf5760405162461bcd60e51b81526004016104ef9061419e565b60035f87815260068701602052604090205460ff1660048111156111f5576111f5613ea8565b146112495760405162461bcd60e51b815260206004820152603160248201525f805160206146068339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f868152600686016020526040808220805460ff19166004179055516001600160401b03841691859189917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a450505050505050565b5f805160206146268339815191525f6112b883611f8b565b90505f806112c9836040015161216c565b915091508061132b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526005850160205260408120805461134590613f0b565b9050118015611377575060015f83815260078601602052604090205460ff16600581111561137557611375613ea8565b145b6113935760405162461bcd60e51b81526004016104ef90614211565b5f82815260058501602052604081206113ab91613d10565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206146268339815191529291906114a590613f0b565b90501180156114d7575060015f83815260078301602052604090205460ff1660058111156114d5576114d5613ea8565b145b6114f35760405162461bcd60e51b81526004016104ef90614211565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c91906004016140ab565b5f61099d8233346129d9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611581575080546001600160401b03808416911610155b1561159f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556115c983612e0a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611665573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261168c91908101906142cf565b91509150806116ef5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611732573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117569190614094565b8251146117ba5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156118305760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f8061183f8460400151612e1e565b915091508187146118ac5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206146668339815191526020526040812060030180545f80516020614626833981519152916001600160401b03909116908190846118fb836143b7565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582525f8051602061466683398151915290528390208351918201909352825491925f8051602061462683398151915292829060ff1660058111156119b2576119b2613ea8565b60058111156119c3576119c3613ea8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614666833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611afc57611abc8160016143dc565b611ac79060086141e7565b5081515f90839083908110611ade57611ade6143ef565b60200101906001600160f81b03191690815f1a905350600101611aa8565b505f5b6004811015611b5f57611b138160036143dc565b611b1e9060086141e7565b6001901c60f81b82611b318360026141fe565b81518110611b4157611b416143ef565b60200101906001600160f81b03191690815f1a905350600101611aff565b505f5b6020811015611bc157611b7681601f6143dc565b611b819060086141e7565b86901c60f81b82611b938360066141fe565b81518110611ba357611ba36143ef565b60200101906001600160f81b03191690815f1a905350600101611b62565b505f5b6008811015611c2c57611bd88160076143dc565b611be39060086141e7565b6001600160401b038616901c60f81b82611bfe8360266141fe565b81518110611c0e57611c0e6143ef565b60200101906001600160f81b03191690815f1a905350600101611bc4565b505f5b6008811015611c9757611c438160076143dc565b611c4e9060086141e7565b6001600160401b038516901c60f81b82611c6983602e6141fe565b81518110611c7957611c796143ef565b60200101906001600160f81b03191690815f1a905350600101611c2f565b5090505b9392505050565b5f80516020614646833981519152805460011901611cd357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206145e6833981519152906001600160401b031660208501351015611d805760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104ef565b600381015484351015611de95760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016104ef565b80548310801590611dfe575080600101548311155b611e5c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b825f611e6782610a10565b90505f611e748883612ff6565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f8051602061464683398151915255565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f805160206145e6833981519152929190611f0090613f0b565b9050118015611f32575060035f83815260068301602052604090205460ff166004811115611f3057611f30613ea8565b145b611f875760405162461bcd60e51b815260206004820152603360248201525f8051602061460683398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206146268339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612000573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261202791908101906142cf565b915091508061208e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b82548251146120f15760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b0316156121645760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f80825160271461218f5760405162461bcd60e51b81526004016104ef90614403565b5f805b60028110156121de576121a68160016143dc565b6121b19060086141e7565b61ffff168582815181106121c7576121c76143ef565b016020015160f81c901b9190911790600101612192565b5061ffff8116156122015760405162461bcd60e51b81526004016104ef9061444c565b5f805b600481101561225c576122188160036143dc565b6122239060086141e7565b63ffffffff16866122358360026141fe565b81518110612245576122456143ef565b016020015160f81c901b9190911790600101612204565b5063ffffffff81166002146122835760405162461bcd60e51b81526004016104ef9061448f565b5f805b60208110156122d85761229a81601f6143dc565b6122a59060086141e7565b876122b18360066141fe565b815181106122c1576122c16143ef565b016020015160f81c901b9190911790600101612286565b505f866026815181106122ed576122ed6143ef565b016020015191976001600160f81b03199092161515965090945050505050565b5f805f83516036146123315760405162461bcd60e51b81526004016104ef90614403565b5f805b6002811015612380576123488160016143dc565b6123539060086141e7565b61ffff16868281518110612369576123696143ef565b016020015160f81c901b9190911790600101612334565b5061ffff8116156123a35760405162461bcd60e51b81526004016104ef9061444c565b5f805b60048110156123fe576123ba8160036143dc565b6123c59060086141e7565b63ffffffff16876123d78360026141fe565b815181106123e7576123e76143ef565b016020015160f81c901b91909117906001016123a6565b5063ffffffff81166003146124255760405162461bcd60e51b81526004016104ef9061448f565b5f805b602081101561247a5761243c81601f6143dc565b6124479060086141e7565b886124538360066141fe565b81518110612463576124636143ef565b016020015160f81c901b9190911790600101612428565b505f805b60088110156124d9576124928160076143dc565b61249d9060086141e7565b6001600160401b0316896124b28360266141fe565b815181106124c2576124c26143ef565b016020015160f81c901b919091179060010161247e565b505f805b6008811015612538576124f18160076143dc565b6124fc9060086141e7565b6001600160401b03168a61251183602e6141fe565b81518110612521576125216143ef565b016020015160f81c901b91909117906001016124dd565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f805160206145e683398151915292919061259090613f0b565b90501180156125c2575060015f83815260068301602052604090205460ff1660048111156125c0576125c0613ea8565b145b611f875760405162461bcd60e51b815260206004820152603860248201525f8051602061460683398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f8181525f8051602061466683398151915260205260408082208151610100810190925280545f8051602061462683398151915293929190829060ff16600581111561266f5761266f613ea8565b600581111561268057612680613ea8565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561270857612708613ea8565b146127645760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146127de5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b6127eb8160a001516134c3565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561282f5761282f613ea8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6128fb846128f5816118b6565b5f611a83565b5f85815260068501602052604090209091506129178282613f81565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612944908590600401614062565b6020604051808303815f875af1158015612960573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129849190614094565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6129e2611ca2565b5f805160206145e68339815191525f6129fa84610a10565b90505f612a068761192a565b9050600281516005811115612a1d57612a1d613ea8565b14612a7c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f828260a00151612a8d91906144d6565b60048501546001860154919250612aaf916001600160401b03909116906141e7565b612ab882610f94565b1115612b245760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104ef565b612b2e8882611a3b565b5f612b38896118b6565b90505f8982604051602001612b6492919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612b85856134c3565b5f612b918b8486611a83565b5f8381526007890160205260409020909150612bad8282613f81565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612bda908590600401614062565b6020604051808303815f875af1158015612bf6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c1a9190614094565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612cc957612cc9613ea8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050611c9b60015f8051602061464683398151915255565b612e12613664565b612e1b816136af565b50565b5f808251602e14612e415760405162461bcd60e51b81526004016104ef90614403565b5f805b6002811015612e9057612e588160016143dc565b612e639060086141e7565b61ffff16858281518110612e7957612e796143ef565b016020015160f81c901b9190911790600101612e44565b5061ffff811615612eb35760405162461bcd60e51b81526004016104ef9061444c565b5f805b6004811015612f0e57612eca8160036143dc565b612ed59060086141e7565b63ffffffff1686612ee78360026141fe565b81518110612ef757612ef76143ef565b016020015160f81c901b9190911790600101612eb6565b5063ffffffff8116600414612f355760405162461bcd60e51b81526004016104ef9061448f565b5f805b6020811015612f8a57612f4c81601f6143dc565b612f579060086141e7565b87612f638360066141fe565b81518110612f7357612f736143ef565b016020015160f81c901b9190911790600101612f38565b505f805b6008811015612fe957612fa28160076143dc565b612fad9060086141e7565b6001600160401b031688612fc28360266141fe565b81518110612fd257612fd26143ef565b016020015160f81c901b9190911790600101612f8e565b5090969095509350505050565b5f5f80516020614626833981519152426130166040860160208701613e6b565b6001600160401b031611801561304f57506130376040850160208601613e6b565b6001600160401b031661304d426202a3006141fe565b115b6130b15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104ef565b83356131095760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b83355f908152600882016020526040902054156131795760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b61318660408501856144f6565b90506030146131ed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b6131f6836134c3565b5f806132906040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061323b9190613e6b565b6001600160401b0316815260200161325660408a018a6144f6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061370a565b5f828152600586016020526040902091935091506132ae8282613f81565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906132db908590600401614062565b6020604051808303815f875af11580156132f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061331b9190614094565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561339d5761339d613ea8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561345e836118b6565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961349560408d0160208e01613e6b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206146268339815191529060ff165f03613501575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061354990836143dc565b10613565576001600160401b0384166040830152808252613584565b838260400181815161357791906144d6565b6001600160401b03169052505b5f82602001518360400151606461359b919061453f565b6135a5919061456a565b600285015490915060ff90811690821611156136205760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104ef565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136ad57604051631afcd79f60e31b815260040160405180910390fd5b565b6136b7613664565b6136c081613aaf565b612e1b606082013560808301356136dd60c0850160a08601613e6b565b60c08501356136f3610100870160e08801613e6b565b6137056101208801610100890161458f565b613ad0565b5f60608260800151516030146137745760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156137eb576137ab8160016143dc565b6137b69060086141e7565b5081515f908390839081106137cd576137cd6143ef565b60200101906001600160f81b03191690815f1a905350600101613797565b505f5b6004811015613849576138028160036143dc565b61380d9060086141e7565b505f8261381b8360026141fe565b8151811061382b5761382b6143ef565b60200101906001600160f81b03191690815f1a9053506001016137ee565b505f5b60208110156138a65784518160208110613868576138686143ef565b1a60f81b826138788360066141fe565b81518110613888576138886143ef565b60200101906001600160f81b03191690815f1a90535060010161384c565b505f5b602081101561390657846020015181602081106138c8576138c86143ef565b1a60f81b826138d88360266141fe565b815181106138e8576138e86143ef565b60200101906001600160f81b03191690815f1a9053506001016138a9565b505f5b600881101561397a5761391d8160076143dc565b6139289060086141e7565b60ff1685604001516001600160401b0316901c60f81b8282604661394c91906141fe565b8151811061395c5761395c6143ef565b60200101906001600160f81b03191690815f1a905350600101613909565b505f5b60308110156139e5578460800151818151811061399c5761399c6143ef565b01602001516001600160f81b031916826139b783604e6141fe565b815181106139c7576139c76143ef565b60200101906001600160f81b03191690815f1a90535060010161397d565b505f5b6008811015613a57576139fc8160076143dc565b613a079060086141e7565b60608601516001600160401b0390811691161c60f81b82613a2983607e6141fe565b81518110613a3957613a396143ef565b60200101906001600160f81b03191690815f1a9053506001016139e8565b50600281604051613a6891906145aa565b602060405180830381855afa158015613a83573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613aa69190614094565b94909350915050565b613ab7613664565b613abf613c84565b613ac7613c94565b612e1b81613c9c565b613ad8613664565b5f805160206145e683398151915283613b445760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104ef565b85871115613bac5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104ef565b5f836001600160401b031611613c1f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104ef565b95865560018601949094556002850180546001600160401b0394851667ffffffffffffffff199091161790556003850191909155600490930180546001600160a01b03909316600160401b026001600160e01b03199093169390911692909217179055565b613c8c613664565b6136ad613d08565b6136ad613664565b613ca4613664565b80355f8051602061462683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613cee60608301604084016145c5565b600291909101805460ff191660ff90921691909117905550565b611ea5613664565b508054613d1c90613f0b565b5f825580601f10613d2b575050565b601f0160209004905f5260205f2090810190612e1b91905b80821115613d56575f8155600101613d43565b5090565b8015158114612e1b575f80fd5b803563ffffffff81168114613d7a575f80fd5b919050565b5f805f60608486031215613d91575f80fd5b833592506020840135613da381613d5a565b9150613db160408501613d67565b90509250925092565b5f60208284031215613dca575f80fd5b5035919050565b5f808284036060811215613de3575f80fd5b83356001600160401b03811115613df8575f80fd5b840160608187031215613e09575f80fd5b92506040601f1982011215613e1c575f80fd5b506020830190509250929050565b5f60208284031215613e3a575f80fd5b611c9b82613d67565b5f8060408385031215613e54575f80fd5b613e5d83613d67565b946020939093013593505050565b5f60208284031215613e7b575f80fd5b81356001600160401b0381168114611c9b575f80fd5b5f6101208284031215613ea2575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613ef057613ef0613ebc565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c90821680613f1f57607f821691505b602082108103613ea257634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c81016020851015613f625750805b601f840160051c820191505b818110156110f9575f8155600101613f6e565b81516001600160401b03811115613f9a57613f9a613ef7565b613fae81613fa88454613f0b565b84613f3d565b602080601f831160018114613fe1575f8415613fca5750858301515b5f19600386901b1c1916600185901b178555614038565b5f85815260208120601f198616915b8281101561400f57888601518255948401946001909101908401613ff0565b508582101561402c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561405a578181015183820152602001614042565b50505f910152565b602081525f8251806020840152614080816040850160208701614040565b601f01601f19169190910160400192915050565b5f602082840312156140a4575f80fd5b5051919050565b5f60208083525f84546140bd81613f0b565b806020870152604060018084165f81146140de57600181146140fa57614127565b60ff19851660408a0152604084151560051b8a01019550614127565b895f5260205f205f5b8581101561411e5781548b8201860152908301908801614103565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261415757614157614135565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761099d5761099d613ebc565b8082018082111561099d5761099d613ebc565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b038111828210171561427a5761427a613ef7565b60405290565b604051601f8201601f191681016001600160401b03811182821017156142a8576142a8613ef7565b604052919050565b6001600160a01b0381168114612e1b575f80fd5b8051613d7a81613d5a565b5f80604083850312156142e0575f80fd5b82516001600160401b03808211156142f6575f80fd5b9084019060608287031215614309575f80fd5b614311614258565b82518152602080840151614324816142b0565b82820152604084015183811115614339575f80fd5b80850194505087601f85011261434d575f80fd5b83518381111561435f5761435f613ef7565b614371601f8201601f19168301614280565b93508084528882828701011115614386575f80fd5b61439581838601848801614040565b508260408301528195506143aa8188016142c4565b9450505050509250929050565b5f6001600160401b038083168181036143d2576143d2613ebc565b6001019392505050565b8181038181111561099d5761099d613ebc565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613ef057613ef0613ebc565b5f808335601e1984360301811261450b575f80fd5b8301803591506001600160401b03821115614524575f80fd5b602001915036819003821315614538575f80fd5b9250929050565b6001600160401b0381811683821602808216919082811461456257614562613ebc565b505092915050565b5f6001600160401b038084168061458357614583614135565b92169190910492915050565b5f6020828403121561459f575f80fd5b8135611c9b816142b0565b5f82516145bb818460208701614040565b9190910192915050565b5f602082840312156145d5575f80fd5b813560ff81168114611c9b575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", -======= - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161452538038061452583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6143d88061014d5f395ff3fe608060405260043610610104575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102f3578063b771b3bc14610312578063bee0a03f14610344578063c599e24f14610363578063f40797d714610376575f80fd5b806366435abf146102775780636d0e43fa1461029657806376f78621146102b557806398f3e2b4146102d4575f80fd5b8063162f1f61116100d8578063162f1f61146101c45780632e2194d8146101e3578063467ef06f1461021a5780635297fae6146102395780636206585614610258575f80fd5b8062e41792146101085780630118acc4146101295780630322ed98146101485780630cdd098514610167575b5f80fd5b348015610113575f80fd5b50610127610122366004613a91565b610389565b005b348015610134575f80fd5b50610127610143366004613acc565b61046b565b348015610153575f80fd5b50610127610162366004613b07565b6108f6565b348015610172575f80fd5b506101b1610181366004613b07565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101cf575f80fd5b506101276101de366004613b07565b610a52565b3480156101ee575f80fd5b506102026101fd366004613b07565b610abf565b6040516001600160401b0390911681526020016101bb565b348015610225575f80fd5b50610127610234366004613b1e565b610ad5565b348015610244575f80fd5b50610127610253366004613b37565b610b00565b348015610263575f80fd5b506101b1610272366004613b75565b610cf1565b348015610282575f80fd5b50610202610291366004613b07565b610d0a565b3480156102a1575f80fd5b506101276102b0366004613b07565b610d1e565b3480156102c0575f80fd5b506101276102cf366004613acc565b610d8b565b3480156102df575f80fd5b506101276102ee366004613b37565b610da6565b3480156102fe575f80fd5b5061012761030d366004613b1e565b610fd5565b34801561031d575f80fd5b5061032c6005600160991b0181565b6040516001600160a01b0390911681526020016101bb565b34801561034f575f80fd5b5061012761035e366004613b07565b611192565b6101b1610371366004613b07565b611261565b6101b1610384366004613c20565b61126d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806103d2575080546001600160401b03808416911610155b156103f05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561041a83611291565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061432c8339815191529184156104bd576104ba82856112a5565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156104ef576104ef613cb2565b600481111561050057610500613cb2565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058757610587613cb2565b146105d95760405162461bcd60e51b815260206004820152602a60248201525f8051602061434c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461063e5760405162461bcd60e51b815260206004820152603360248201525f8051602061434c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d0565b5f61064884611541565b60038084526001600160401b0342811660a0860152821660e08501525f8a815290870160205260409020835181549293508492829060ff1916600183600481111561069557610695613cb2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610767856115b5565b905082606001516001600160401b03168160a001516001600160401b0316116107de5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105d0565b5f83606001518260a001516107f39190613cda565b90506107ff8682611694565b5f61080b8785846116dc565b5f8c815260058a01602052604090209091506108278282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610854908590600401613e5f565b6020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108949190613e91565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061436c83398151915292919061093e90613d01565b9050118015610970575060035f83815260078301602052604090205460ff16600581111561096e5761096e613cb2565b145b6109d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613ea8565b6020604051808303815f875af1158015610a29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4d9190613e91565b505050565b610a5b816118f9565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d05602052604090819020905163ee5b48eb60e01b81525f8051602061432c833981519152916005600160991b019163ee5b48eb91610a0d91600401613ea8565b5f610acf64e8d4a5100083613f46565b92915050565b5f610adf826119c8565b9050610afc81606001516001600160401b03168260400151611d55565b5050565b5f8051602061432c8339815191525f610b1884611d68565b90505f80610b298360400151611f49565b5091509150610b3785612184565b5f8581526004850160205260408120610b4f916139fe565b5f610b59836115b5565b9050816001600160401b031681608001516001600160401b03161015610b915760405162461bcd60e51b81526004016105d090613f59565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610bd65760405162461bcd60e51b81526004016105d090613f9b565b60015f87815260038701602052604090205460ff166004811115610bfc57610bfc613cb2565b14610c655760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d0565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610acf6001600160401b03831664e8d4a51000613fe4565b5f610d14826115b5565b60a0015192915050565b610d2781612184565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d04602052604090819020905163ee5b48eb60e01b81525f8051602061432c833981519152916005600160991b019163ee5b48eb91610a0d91600401613ea8565b8115610d9d57610d9b83826112a5565b505b610a4d8361225d565b5f8051602061432c8339815191525f610dbe84611d68565b90505f80610dcf8360400151611f49565b5091509150610ddd856118f9565b5f8581526005850160205260408120610df5916139fe565b5f610dff836115b5565b9050816001600160401b031681608001516001600160401b03161015610e375760405162461bcd60e51b81526004016105d090613f59565b5f8681526003808701602052604090912001546001600160401b0380841691161115610e755760405162461bcd60e51b81526004016105d090613f9b565b60035f87815260038701602052604090205460ff166004811115610e9b57610e9b613cb2565b14610eef5760405162461bcd60e51b815260206004820152603160248201525f8051602061434c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d0565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610f939190611d55565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061436c8339815191525f610fed83611d68565b90505f80610ffe8360400151612615565b91509150806110605760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d0565b5f8281526005850160205260408120805461107a90613d01565b90501180156110ac575060015f83815260078601602052604090205460ff1660058111156110aa576110aa613cb2565b145b6110c85760405162461bcd60e51b81526004016105d090613ffb565b5f82815260058501602052604081206110e0916139fe565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061436c8339815191529291906111da90613d01565b905011801561120c575060015f83815260078301602052604090205460ff16600581111561120a5761120a613cb2565b145b6112285760405162461bcd60e51b81526004016105d090613ffb565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610a0d9190600401613ea8565b5f610acf8233346127b6565b5f8061127834612b6e565b905061128685828686612c18565b9150505b9392505050565b61129961306d565b6112a2816130b8565b50565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112f0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113179190810190614061565b915091508061137a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e19190613e91565b8251146114455760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d0565b60208201516001600160a01b0316156114bb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d0565b5f806114ca84604001516130fb565b915091508187146115375760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d0565b9695505050505050565b5f8181525f805160206143ac8339815191526020526040812060030180545f8051602061436c833981519152916001600160401b039091169081908461158683614133565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115bd613a35565b5f8281525f805160206143ac8339815191526020526040908190208151610100810190925280545f8051602061436c833981519152929190829060ff16600581111561160b5761160b613cb2565b600581111561161c5761161c613cb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206143ac833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561175557611715816001614158565b611720906008613fe4565b5081515f908390839081106117375761173761416b565b60200101906001600160f81b03191690815f1a905350600101611701565b505f5b60048110156117b85761176c816003614158565b611777906008613fe4565b6001901c60f81b8261178a83600261417f565b8151811061179a5761179a61416b565b60200101906001600160f81b03191690815f1a905350600101611758565b505f5b602081101561181a576117cf81601f614158565b6117da906008613fe4565b86901c60f81b826117ec83600661417f565b815181106117fc576117fc61416b565b60200101906001600160f81b03191690815f1a9053506001016117bb565b505f5b600881101561188557611831816007614158565b61183c906008613fe4565b6001600160401b038616901c60f81b8261185783602661417f565b815181106118675761186761416b565b60200101906001600160f81b03191690815f1a90535060010161181d565b505f5b60088110156118f05761189c816007614158565b6118a7906008613fe4565b6001600160401b038516901c60f81b826118c283602e61417f565b815181106118d2576118d261416b565b60200101906001600160f81b03191690815f1a905350600101611888565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056020526040812080545f8051602061432c83398151915292919061194190613d01565b9050118015611973575060035f83815260038301602052604090205460ff16600481111561197157611971613cb2565b145b610afc5760405162461bcd60e51b815260206004820152603360248201525f8051602061434c83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016105d0565b6119d0613a35565b5f8051602061436c8339815191525f6119e884611d68565b90505f806119f98360400151612615565b915091508015611a5e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d0565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611a9057611a90613cb2565b6005811115611aa157611aa1613cb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b2857611b28613cb2565b1480611b465750600182516005811115611b4457611b44613cb2565b145b611ba55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d0565b600382516005811115611bba57611bba613cb2565b03611be157505f8381526006860160205260408120600491611bdc91906139fe565b611be5565b5060055b6020808301515f90815260088801909152604081205581816005811115611c0e57611c0e613cb2565b90816005811115611c2157611c21613cb2565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611c5557611c55613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d2057611d20613cb2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610afc6001600160a01b038216836132d3565b60408051606080820183525f8083526020830181905292820152905f8051602061436c8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ddd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e049190810190614061565b9150915080611e6b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d0565b8254825114611ece5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d0565b60208201516001600160a01b031615611f415760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d0565b509392505050565b5f805f8351603614611f6d5760405162461bcd60e51b81526004016105d090614192565b5f805b6002811015611fbc57611f84816001614158565b611f8f906008613fe4565b61ffff16868281518110611fa557611fa561416b565b016020015160f81c901b9190911790600101611f70565b5061ffff811615611fdf5760405162461bcd60e51b81526004016105d0906141db565b5f805b600481101561203a57611ff6816003614158565b612001906008613fe4565b63ffffffff168761201383600261417f565b815181106120235761202361416b565b016020015160f81c901b9190911790600101611fe2565b5063ffffffff81166003146120615760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156120b65761207881601f614158565b612083906008613fe4565b8861208f83600661417f565b8151811061209f5761209f61416b565b016020015160f81c901b9190911790600101612064565b505f805b6008811015612115576120ce816007614158565b6120d9906008613fe4565b6001600160401b0316896120ee83602661417f565b815181106120fe576120fe61416b565b016020015160f81c901b91909117906001016120ba565b505f805b60088110156121745761212d816007614158565b612138906008613fe4565b6001600160401b03168a61214d83602e61417f565b8151811061215d5761215d61416b565b016020015160f81c901b9190911790600101612119565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d046020526040812080545f8051602061432c8339815191529291906121cc90613d01565b90501180156121fe575060015f83815260038301602052604090205460ff1660048111156121fc576121fc613cb2565b145b610afc5760405162461bcd60e51b815260206004820152603860248201525f8051602061434c83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016105d0565b5f8181525f805160206143ac83398151915260205260408082208151610100810190925280545f8051602061436c83398151915293929190829060ff1660058111156122ab576122ab613cb2565b60058111156122bc576122bc613cb2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561234457612344613cb2565b146123a05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d0565b60408101516001600160a01b0316336001600160a01b03161461241a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d0565b6124278160a00151613366565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561246b5761246b613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125378461253181611541565b5f6116dc565b5f85815260068501602052604090209091506125538282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612580908590600401613e5f565b6020604051808303815f875af115801561259c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c09190613e91565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146126385760405162461bcd60e51b81526004016105d090614192565b5f805b60028110156126875761264f816001614158565b61265a906008613fe4565b61ffff168582815181106126705761267061416b565b016020015160f81c901b919091179060010161263b565b5061ffff8116156126aa5760405162461bcd60e51b81526004016105d0906141db565b5f805b6004811015612705576126c1816003614158565b6126cc906008613fe4565b63ffffffff16866126de83600261417f565b815181106126ee576126ee61416b565b016020015160f81c901b91909117906001016126ad565b5063ffffffff811660021461272c5760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156127815761274381601f614158565b61274e906008613fe4565b8761275a83600661417f565b8151811061276a5761276a61416b565b016020015160f81c901b919091179060010161272f565b505f866026815181106127965761279661416b565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127bf613507565b5f6127c983610abf565b90505f8051602061432c8339815191525f6127e3876115b5565b90506002815160058111156127fa576127fa613cb2565b146128595760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d0565b5f838260a0015161286a9190614265565b90506128768882611694565b5f61288089611541565b90505f8989836040516020016128c89392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090506128e986613366565b5f6128f58b84866116dc565b5f83815260048801602052604090209091506129118282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061293e908590600401613e5f565b6020604051808303815f875af115801561295a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297e9190613e91565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001896001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250876003015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612a2d57612a2d613cb2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938d1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061128a60015f8051602061438c83398151915255565b5f5f8051602061432c8339815191528282612b8882610abf565b83549091506001600160401b03821610801590612bb257508260010154816001600160401b031611155b612c105760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016105d0565b949350505050565b5f612c21613507565b5f8051602061436c833981519152426001600160401b038516118015612c5b57506001600160401b038416612c59426202a30061417f565b115b612cbd5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016105d0565b85612d145760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d0565b5f86815260088201602052604090205415612d825760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d0565b8251603014612de95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d0565b612df285613366565b5f80612e396040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613551565b5f82815260058601602052604090209193509150612e578282613d7e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612e84908590600401613e5f565b6020604051808303815f875af1158015612ea0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ec49190613e91565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115612f4657612f46613cb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561300783611541565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c1060015f8051602061438c83398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130b657604051631afcd79f60e31b815260040160405180910390fd5b565b6130c061306d565b6130c9816138f6565b6112a2606082013560808301356130e660c0850160a08601613b75565b6130f660e0860160c08701614285565b613917565b5f808251602e1461311e5760405162461bcd60e51b81526004016105d090614192565b5f805b600281101561316d57613135816001614158565b613140906008613fe4565b61ffff168582815181106131565761315661416b565b016020015160f81c901b9190911790600101613121565b5061ffff8116156131905760405162461bcd60e51b81526004016105d0906141db565b5f805b60048110156131eb576131a7816003614158565b6131b2906008613fe4565b63ffffffff16866131c483600261417f565b815181106131d4576131d461416b565b016020015160f81c901b9190911790600101613193565b5063ffffffff81166004146132125760405162461bcd60e51b81526004016105d09061421e565b5f805b60208110156132675761322981601f614158565b613234906008613fe4565b8761324083600661417f565b815181106132505761325061416b565b016020015160f81c901b9190911790600101613215565b505f805b60088110156132c65761327f816007614158565b61328a906008613fe4565b6001600160401b03168861329f83602661417f565b815181106132af576132af61416b565b016020015160f81c901b919091179060010161326b565b5090969095509350505050565b804710156132f65760405163cd78605960e01b81523060048201526024016105d0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461333f576040519150601f19603f3d011682016040523d82523d5f602084013e613344565b606091505b5050905080610a4d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061436c8339815191529060ff165f036133a4575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906133ec9083614158565b10613408576001600160401b0384166040830152808252613427565b838260400181815161341a9190614265565b6001600160401b03169052505b5f82602001518360400151606461343e91906142a0565b61344891906142cb565b600285015490915060ff90811690821611156134c35760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016105d0565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f8051602061438c83398151915280546001190161353857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061438c83398151915255565b5f60608260800151516030146135bb5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613632576135f2816001614158565b6135fd906008613fe4565b5081515f908390839081106136145761361461416b565b60200101906001600160f81b03191690815f1a9053506001016135de565b505f5b600481101561369057613649816003614158565b613654906008613fe4565b505f8261366283600261417f565b815181106136725761367261416b565b60200101906001600160f81b03191690815f1a905350600101613635565b505f5b60208110156136ed57845181602081106136af576136af61416b565b1a60f81b826136bf83600661417f565b815181106136cf576136cf61416b565b60200101906001600160f81b03191690815f1a905350600101613693565b505f5b602081101561374d578460200151816020811061370f5761370f61416b565b1a60f81b8261371f83602661417f565b8151811061372f5761372f61416b565b60200101906001600160f81b03191690815f1a9053506001016136f0565b505f5b60088110156137c157613764816007614158565b61376f906008613fe4565b60ff1685604001516001600160401b0316901c60f81b82826046613793919061417f565b815181106137a3576137a361416b565b60200101906001600160f81b03191690815f1a905350600101613750565b505f5b603081101561382c57846080015181815181106137e3576137e361416b565b01602001516001600160f81b031916826137fe83604e61417f565b8151811061380e5761380e61416b565b60200101906001600160f81b03191690815f1a9053506001016137c4565b505f5b600881101561389e57613843816007614158565b61384e906008613fe4565b60608601516001600160401b0390811691161c60f81b8261387083607e61417f565b815181106138805761388061416b565b60200101906001600160f81b03191690815f1a90535060010161382f565b506002816040516138af91906142f0565b602060405180830381855afa1580156138ca573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138ed9190613e91565b94909350915050565b6138fe61306d565b613906613972565b61390e613982565b6112a28161398a565b61391f61306d565b5f5f8051602061432c833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b61397a61306d565b6130b66139f6565b6130b661306d565b61399261306d565b80355f8051602061436c83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556139dc606083016040840161430b565b600291909101805460ff191660ff90921691909117905550565b61353e61306d565b508054613a0a90613d01565b5f825580601f10613a19575050565b601f0160209004905f5260205f20908101906112a29190613a79565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613a8d575f8155600101613a7a565b5090565b5f60e08284031215613aa1575f80fd5b50919050565b80151581146112a2575f80fd5b803563ffffffff81168114613ac7575f80fd5b919050565b5f805f60608486031215613ade575f80fd5b833592506020840135613af081613aa7565b9150613afe60408501613ab4565b90509250925092565b5f60208284031215613b17575f80fd5b5035919050565b5f60208284031215613b2e575f80fd5b61128a82613ab4565b5f8060408385031215613b48575f80fd5b613b5183613ab4565b946020939093013593505050565b80356001600160401b0381168114613ac7575f80fd5b5f60208284031215613b85575f80fd5b61128a82613b5f565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613bc457613bc4613b8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613bf257613bf2613b8e565b604052919050565b5f6001600160401b03821115613c1257613c12613b8e565b50601f01601f191660200190565b5f805f60608486031215613c32575f80fd5b83359250613c4260208501613b5f565b915060408401356001600160401b03811115613c5c575f80fd5b8401601f81018613613c6c575f80fd5b8035613c7f613c7a82613bfa565b613bca565b818152876020838501011115613c93575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613cfa57613cfa613cc6565b5092915050565b600181811c90821680613d1557607f821691505b602082108103613aa157634e487b7160e01b5f52602260045260245ffd5b601f821115610a4d57805f5260205f20601f840160051c81016020851015613d585750805b601f840160051c820191505b81811015613d77575f8155600101613d64565b5050505050565b81516001600160401b03811115613d9757613d97613b8e565b613dab81613da58454613d01565b84613d33565b602080601f831160018114613dde575f8415613dc75750858301515b5f19600386901b1c1916600185901b178555613e35565b5f85815260208120601f198616915b82811015613e0c57888601518255948401946001909101908401613ded565b5085821015613e2957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015613e57578181015183820152602001613e3f565b50505f910152565b602081525f8251806020840152613e7d816040850160208701613e3d565b601f01601f19169190910160400192915050565b5f60208284031215613ea1575f80fd5b5051919050565b5f60208083525f8454613eba81613d01565b806020870152604060018084165f8114613edb5760018114613ef757613f24565b60ff19851660408a0152604084151560051b8a01019550613f24565b895f5260205f205f5b85811015613f1b5781548b8201860152908301908801613f00565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f82613f5457613f54613f32565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610acf57610acf613cc6565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b6001600160a01b03811681146112a2575f80fd5b8051613ac781613aa7565b5f8060408385031215614072575f80fd5b82516001600160401b0380821115614088575f80fd5b908401906060828703121561409b575f80fd5b6140a3613ba2565b825181526020808401516140b681614042565b828201526040840151838111156140cb575f80fd5b80850194505087601f8501126140df575f80fd5b835192506140ef613c7a84613bfa565b8381528882858701011115614102575f80fd5b61411184838301848801613e3d565b80604084015250819550614126818801614056565b9450505050509250929050565b5f6001600160401b0380831681810361414e5761414e613cc6565b6001019392505050565b81810381811115610acf57610acf613cc6565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610acf57610acf613cc6565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613cfa57613cfa613cc6565b5f60208284031215614295575f80fd5b813561128a81614042565b6001600160401b038181168382160280821691908281146142c3576142c3613cc6565b505092915050565b5f6001600160401b03808416806142e4576142e4613f32565b92169190910492915050565b5f8251614301818460208701613e3d565b9190910192915050565b5f6020828403121561431b575f80fd5b813560ff8116811461128a575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", ->>>>>>> origin/staking-contract + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161495d38038061495d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148108061014d5f395ff3fe608060405260043610610105575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102e8578063b771b3bc14610307578063bee0a03f14610339578063c599e24f14610358578063dac806231461036b575f80fd5b806366435abf1461026c5780636d0e43fa1461028b57806376f78621146102aa57806398f3e2b4146102c9575f80fd5b8063162f1f61116100d8578063162f1f61146101b95780632e2194d8146101d8578063467ef06f1461020f5780635297fae61461022e578063620658561461024d575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063104595c4146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613efd565b61038a565b005b348015610135575f80fd5b50610128610144366004613f38565b610815565b348015610154575f80fd5b50610193610163366004613f38565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101936101b4366004613f4f565b610971565b3480156101c4575f80fd5b506101286101d3366004613f38565b6109a3565b3480156101e3575f80fd5b506101f76101f2366004613f38565b610a10565b6040516001600160401b03909116815260200161019d565b34801561021a575f80fd5b50610128610229366004613fa8565b610a20565b348015610239575f80fd5b50610128610248366004613fc1565b610a4b565b348015610258575f80fd5b50610193610267366004613fe9565b610c3c565b348015610277575f80fd5b506101f7610286366004613f38565b610c55565b348015610296575f80fd5b506101286102a5366004613f38565b610c69565b3480156102b5575f80fd5b506101286102c4366004613efd565b610cd6565b3480156102d4575f80fd5b506101286102e3366004613fc1565b610da8565b3480156102f3575f80fd5b50610128610302366004613fa8565b610fd8565b348015610312575f80fd5b506103216005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610344575f80fd5b50610128610353366004613f38565b611195565b610193610366366004613f38565b611264565b348015610376575f80fd5b5061012861038536600461400f565b611270565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206147648339815191529184156103dc576103d98285611352565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561040e5761040e614026565b600481111561041f5761041f614026565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6614026565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206147848339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206147848339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f610567846115ee565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4614026565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61068685611662565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a00151610712919061404e565b905061071e8682611741565b5f61072a878584611789565b5f8c815260088a016020526040902090915061074682826140ff565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906107739085906004016141e0565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190614212565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206147a483398151915292919061085d90614089565b905011801561088f575060035f83815260078301602052604090205460ff16600581111561088d5761088d614026565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401614229565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190614212565b505050565b5f61097a6119a8565b6109858383346119df565b905061099d60015f805160206147c483398151915255565b92915050565b6109ac81611bbe565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614764833981519152916005600160991b019163ee5b48eb9161092c91600401614229565b5f61099d64e8d4a51000836142c7565b5f610a2a82611c8d565b9050610a4781606001516001600160401b0316826040015161201a565b5050565b5f805160206147648339815191525f610a638461202d565b90505f80610a74836040015161220e565b5091509150610a8285612449565b5f8581526007850160205260408120610a9a91613e45565b5f610aa483611662565b9050816001600160401b031681608001516001600160401b03161015610adc5760405162461bcd60e51b81526004016104ef906142da565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b215760405162461bcd60e51b81526004016104ef9061431c565b60015f87815260068701602052604090205460ff166004811115610b4757610b47614026565b14610bb05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61099d6001600160401b03831664e8d4a51000614365565b5f610c5f82611662565b60a0015192915050565b610c7281612449565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f80516020614764833981519152916005600160991b019163ee5b48eb9161092c91600401614229565b5f805160206147648339815191525f610cee85611662565b5f86815260058401602052604090206001015460c0820151919250610d1b916001600160401b031661437c565b421015610d865760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104ef565b8315610d9857610d968584611352565b505b610da185612522565b5050505050565b5f805160206147648339815191525f610dc08461202d565b90505f80610dd1836040015161220e565b5091509150610ddf85611bbe565b5f8581526008850160205260408120610df791613e45565b5f610e0183611662565b9050816001600160401b031681608001516001600160401b03161015610e395760405162461bcd60e51b81526004016104ef906142da565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e775760405162461bcd60e51b81526004016104ef9061431c565b60035f87815260068701602052604090205460ff166004811115610e9d57610e9d614026565b14610ef15760405162461bcd60e51b815260206004820152603160248201525f805160206147848339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f969161201a565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206147a48339815191525f610ff08361202d565b90505f8061100183604001516128da565b91509150806110635760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526005850160205260408120805461107d90614089565b90501180156110af575060015f83815260078601602052604090205460ff1660058111156110ad576110ad614026565b145b6110cb5760405162461bcd60e51b81526004016104ef9061438f565b5f82815260058501602052604081206110e391613e45565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147a48339815191529291906111dd90614089565b905011801561120f575060015f83815260078301602052604090205460ff16600581111561120d5761120d614026565b145b61122b5760405162461bcd60e51b81526004016104ef9061438f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401614229565b5f61099d823334612a7b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806112b9575080546001600160401b03808416911610155b156112d75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561130183612eac565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561139d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113c4919081019061444d565b91509150806114275760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561146a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148e9190614212565b8251146114f25760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156115685760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806115778460400151612ec0565b915091508187146115e45760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206147e48339815191526020526040812060030180545f805160206147a4833981519152916001600160401b039091169081908461163383614535565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61166a613e7c565b5f8281525f805160206147e48339815191526020526040908190208151610100810190925280545f805160206147a4833981519152929190829060ff1660058111156116b8576116b8614026565b60058111156116c9576116c9614026565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206147e4833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611802576117c281600161455a565b6117cd906008614365565b5081515f908390839081106117e4576117e461456d565b60200101906001600160f81b03191690815f1a9053506001016117ae565b505f5b60048110156118655761181981600361455a565b611824906008614365565b6001901c60f81b8261183783600261437c565b815181106118475761184761456d565b60200101906001600160f81b03191690815f1a905350600101611805565b505f5b60208110156118c75761187c81601f61455a565b611887906008614365565b86901c60f81b8261189983600661437c565b815181106118a9576118a961456d565b60200101906001600160f81b03191690815f1a905350600101611868565b505f5b6008811015611932576118de81600761455a565b6118e9906008614365565b6001600160401b038616901c60f81b8261190483602661437c565b815181106119145761191461456d565b60200101906001600160f81b03191690815f1a9053506001016118ca565b505f5b600881101561199d5761194981600761455a565b611954906008614365565b6001600160401b038516901c60f81b8261196f83602e61437c565b8151811061197f5761197f61456d565b60200101906001600160f81b03191690815f1a905350600101611935565b5090505b9392505050565b5f805160206147c48339815191528054600119016119d957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614764833981519152906001600160401b031660208501351015611a865760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104ef565b600381015484351015611aef5760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016104ef565b80548310801590611b04575080600101548311155b611b625760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b825f611b6d82610a10565b90505f611b7a8883613098565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f805160206147c483398151915255565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f80516020614764833981519152929190611c0690614089565b9050118015611c38575060035f83815260068301602052604090205460ff166004811115611c3657611c36614026565b145b610a475760405162461bcd60e51b815260206004820152603360248201525f8051602061478483398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b611c95613e7c565b5f805160206147a48339815191525f611cad8461202d565b90505f80611cbe83604001516128da565b915091508015611d235760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611d5557611d55614026565b6005811115611d6657611d66614026565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ded57611ded614026565b1480611e0b5750600182516005811115611e0957611e09614026565b145b611e6a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115611e7f57611e7f614026565b03611ea657505f8381526006860160205260408120600491611ea19190613e45565b611eaa565b5060055b6020808301515f90815260088801909152604081205581816005811115611ed357611ed3614026565b90816005811115611ee657611ee6614026565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611f1a57611f1a614026565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611fe557611fe5614026565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a476001600160a01b03821683613565565b60408051606080820183525f8083526020830181905292820152905f805160206147a48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120a2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120c9919081019061444d565b91509150806121305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b82548251146121935760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b0316156122065760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f805f83516036146122325760405162461bcd60e51b81526004016104ef90614581565b5f805b60028110156122815761224981600161455a565b612254906008614365565b61ffff1686828151811061226a5761226a61456d565b016020015160f81c901b9190911790600101612235565b5061ffff8116156122a45760405162461bcd60e51b81526004016104ef906145ca565b5f805b60048110156122ff576122bb81600361455a565b6122c6906008614365565b63ffffffff16876122d883600261437c565b815181106122e8576122e861456d565b016020015160f81c901b91909117906001016122a7565b5063ffffffff81166003146123265760405162461bcd60e51b81526004016104ef9061460d565b5f805b602081101561237b5761233d81601f61455a565b612348906008614365565b8861235483600661437c565b815181106123645761236461456d565b016020015160f81c901b9190911790600101612329565b505f805b60088110156123da5761239381600761455a565b61239e906008614365565b6001600160401b0316896123b383602661437c565b815181106123c3576123c361456d565b016020015160f81c901b919091179060010161237f565b505f805b6008811015612439576123f281600761455a565b6123fd906008614365565b6001600160401b03168a61241283602e61437c565b815181106124225761242261456d565b016020015160f81c901b91909117906001016123de565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f8051602061476483398151915292919061249190614089565b90501180156124c3575060015f83815260068301602052604090205460ff1660048111156124c1576124c1614026565b145b610a475760405162461bcd60e51b815260206004820152603860248201525f8051602061478483398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f8181525f805160206147e483398151915260205260408082208151610100810190925280545f805160206147a483398151915293929190829060ff16600581111561257057612570614026565b600581111561258157612581614026565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561260957612609614026565b146126655760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146126df5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b6126ec8160a001516135f8565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561273057612730614026565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127fc846127f6816115ee565b5f611789565b5f858152600685016020526040902090915061281882826140ff565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128459085906004016141e0565b6020604051808303815f875af1158015612861573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128859190614212565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146128fd5760405162461bcd60e51b81526004016104ef90614581565b5f805b600281101561294c5761291481600161455a565b61291f906008614365565b61ffff168582815181106129355761293561456d565b016020015160f81c901b9190911790600101612900565b5061ffff81161561296f5760405162461bcd60e51b81526004016104ef906145ca565b5f805b60048110156129ca5761298681600361455a565b612991906008614365565b63ffffffff16866129a383600261437c565b815181106129b3576129b361456d565b016020015160f81c901b9190911790600101612972565b5063ffffffff81166002146129f15760405162461bcd60e51b81526004016104ef9061460d565b5f805b6020811015612a4657612a0881601f61455a565b612a13906008614365565b87612a1f83600661437c565b81518110612a2f57612a2f61456d565b016020015160f81c901b91909117906001016129f4565b505f86602681518110612a5b57612a5b61456d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612a846119a8565b5f805160206147648339815191525f612a9c84610a10565b90505f612aa887611662565b9050600281516005811115612abf57612abf614026565b14612b1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f828260a00151612b2f9190614654565b60048501546001860154919250612b51916001600160401b0390911690614365565b612b5a82610c3c565b1115612bc65760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104ef565b612bd08882611741565b5f612bda896115ee565b90505f8982604051602001612c0692919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612c27856135f8565b5f612c338b8486611789565b5f8381526007890160205260409020909150612c4f82826140ff565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c7c9085906004016141e0565b6020604051808303815f875af1158015612c98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cbc9190614212565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d6b57612d6b614026565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506119a160015f805160206147c483398151915255565b612eb4613799565b612ebd816137e4565b50565b5f808251602e14612ee35760405162461bcd60e51b81526004016104ef90614581565b5f805b6002811015612f3257612efa81600161455a565b612f05906008614365565b61ffff16858281518110612f1b57612f1b61456d565b016020015160f81c901b9190911790600101612ee6565b5061ffff811615612f555760405162461bcd60e51b81526004016104ef906145ca565b5f805b6004811015612fb057612f6c81600361455a565b612f77906008614365565b63ffffffff1686612f8983600261437c565b81518110612f9957612f9961456d565b016020015160f81c901b9190911790600101612f58565b5063ffffffff8116600414612fd75760405162461bcd60e51b81526004016104ef9061460d565b5f805b602081101561302c57612fee81601f61455a565b612ff9906008614365565b8761300583600661437c565b815181106130155761301561456d565b016020015160f81c901b9190911790600101612fda565b505f805b600881101561308b5761304481600761455a565b61304f906008614365565b6001600160401b03168861306483602661437c565b815181106130745761307461456d565b016020015160f81c901b9190911790600101613030565b5090969095509350505050565b5f5f805160206147a4833981519152426130b86040860160208701613fe9565b6001600160401b03161180156130f157506130d96040850160208601613fe9565b6001600160401b03166130ef426202a30061437c565b115b6131535760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104ef565b83356131ab5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b83355f9081526008820160205260409020541561321b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b6132286040850185614674565b905060301461328f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b613298836135f8565b5f806133326040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906132dd9190613fe9565b6001600160401b031681526020016132f860408a018a614674565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061383f565b5f8281526005860160205260409020919350915061335082826140ff565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061337d9085906004016141e0565b6020604051808303815f875af1158015613399573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133bd9190614212565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561343f5761343f614026565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055613500836115ee565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961353760408d0160208e01613fe9565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156135885760405163cd78605960e01b81523060048201526024016104ef565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146135d1576040519150601f19603f3d011682016040523d82523d5f602084013e6135d6565b606091505b505090508061096c57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147a48339815191529060ff165f03613636575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061367e908361455a565b1061369a576001600160401b03841660408301528082526136b9565b83826040018181516136ac9190614654565b6001600160401b03169052505b5f8260200151836040015160646136d091906146bd565b6136da91906146e8565b600285015490915060ff90811690821611156137555760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104ef565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166137e257604051631afcd79f60e31b815260040160405180910390fd5b565b6137ec613799565b6137f581613be4565b612ebd6060820135608083013561381260c0850160a08601613fe9565b60c0850135613828610100870160e08801613fe9565b61383a6101208801610100890161470d565b613c05565b5f60608260800151516030146138a95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613920576138e081600161455a565b6138eb906008614365565b5081515f908390839081106139025761390261456d565b60200101906001600160f81b03191690815f1a9053506001016138cc565b505f5b600481101561397e5761393781600361455a565b613942906008614365565b505f8261395083600261437c565b815181106139605761396061456d565b60200101906001600160f81b03191690815f1a905350600101613923565b505f5b60208110156139db578451816020811061399d5761399d61456d565b1a60f81b826139ad83600661437c565b815181106139bd576139bd61456d565b60200101906001600160f81b03191690815f1a905350600101613981565b505f5b6020811015613a3b57846020015181602081106139fd576139fd61456d565b1a60f81b82613a0d83602661437c565b81518110613a1d57613a1d61456d565b60200101906001600160f81b03191690815f1a9053506001016139de565b505f5b6008811015613aaf57613a5281600761455a565b613a5d906008614365565b60ff1685604001516001600160401b0316901c60f81b82826046613a81919061437c565b81518110613a9157613a9161456d565b60200101906001600160f81b03191690815f1a905350600101613a3e565b505f5b6030811015613b1a5784608001518181518110613ad157613ad161456d565b01602001516001600160f81b03191682613aec83604e61437c565b81518110613afc57613afc61456d565b60200101906001600160f81b03191690815f1a905350600101613ab2565b505f5b6008811015613b8c57613b3181600761455a565b613b3c906008614365565b60608601516001600160401b0390811691161c60f81b82613b5e83607e61437c565b81518110613b6e57613b6e61456d565b60200101906001600160f81b03191690815f1a905350600101613b1d565b50600281604051613b9d9190614728565b602060405180830381855afa158015613bb8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613bdb9190614212565b94909350915050565b613bec613799565b613bf4613db9565b613bfc613dc9565b612ebd81613dd1565b613c0d613799565b5f8051602061476483398151915283613c795760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104ef565b85871115613ce15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104ef565b5f836001600160401b031611613d545760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104ef565b95865560018601949094556002850180546001600160401b0394851667ffffffffffffffff199091161790556003850191909155600490930180546001600160a01b03909316600160401b026001600160e01b03199093169390911692909217179055565b613dc1613799565b6137e2613e3d565b6137e2613799565b613dd9613799565b80355f805160206147a483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e236060830160408401614743565b600291909101805460ff191660ff90921691909117905550565b611bab613799565b508054613e5190614089565b5f825580601f10613e60575050565b601f0160209004905f5260205f2090810190612ebd9190613ec0565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613ed4575f8155600101613ec1565b5090565b8015158114612ebd575f80fd5b803563ffffffff81168114613ef8575f80fd5b919050565b5f805f60608486031215613f0f575f80fd5b833592506020840135613f2181613ed8565b9150613f2f60408501613ee5565b90509250925092565b5f60208284031215613f48575f80fd5b5035919050565b5f808284036060811215613f61575f80fd5b83356001600160401b03811115613f76575f80fd5b840160608187031215613f87575f80fd5b92506040601f1982011215613f9a575f80fd5b506020830190509250929050565b5f60208284031215613fb8575f80fd5b6119a182613ee5565b5f8060408385031215613fd2575f80fd5b613fdb83613ee5565b946020939093013593505050565b5f60208284031215613ff9575f80fd5b81356001600160401b03811681146119a1575f80fd5b5f6101208284031215614020575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561406e5761406e61403a565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061409d57607f821691505b60208210810361402057634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c810160208510156140e05750805b601f840160051c820191505b81811015610da1575f81556001016140ec565b81516001600160401b0381111561411857614118614075565b61412c816141268454614089565b846140bb565b602080601f83116001811461415f575f84156141485750858301515b5f19600386901b1c1916600185901b1785556141b6565b5f85815260208120601f198616915b8281101561418d5788860151825594840194600190910190840161416e565b50858210156141aa57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156141d85781810151838201526020016141c0565b50505f910152565b602081525f82518060208401526141fe8160408501602087016141be565b601f01601f19169190910160400192915050565b5f60208284031215614222575f80fd5b5051919050565b5f60208083525f845461423b81614089565b806020870152604060018084165f811461425c5760018114614278576142a5565b60ff19851660408a0152604084151560051b8a010195506142a5565b895f5260205f205f5b8581101561429c5781548b8201860152908301908801614281565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826142d5576142d56142b3565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761099d5761099d61403a565b8082018082111561099d5761099d61403a565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b03811182821017156143f8576143f8614075565b60405290565b604051601f8201601f191681016001600160401b038111828210171561442657614426614075565b604052919050565b6001600160a01b0381168114612ebd575f80fd5b8051613ef881613ed8565b5f806040838503121561445e575f80fd5b82516001600160401b0380821115614474575f80fd5b9084019060608287031215614487575f80fd5b61448f6143d6565b825181526020808401516144a28161442e565b828201526040840151838111156144b7575f80fd5b80850194505087601f8501126144cb575f80fd5b8351838111156144dd576144dd614075565b6144ef601f8201601f191683016143fe565b93508084528882828701011115614504575f80fd5b614513818386018488016141be565b50826040830152819550614528818801614442565b9450505050509250929050565b5f6001600160401b038083168181036145505761455061403a565b6001019392505050565b8181038181111561099d5761099d61403a565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561406e5761406e61403a565b5f808335601e19843603018112614689575f80fd5b8301803591506001600160401b038211156146a2575f80fd5b6020019150368190038213156146b6575f80fd5b9250929050565b6001600160401b038181168382160280821691908281146146e0576146e061403a565b505092915050565b5f6001600160401b0380841680614701576147016142b3565b92169190910492915050565b5f6020828403121561471d575f80fd5b81356119a18161442e565b5f82516147398184602087016141be565b9190910192915050565b5f60208284031215614753575f80fd5b813560ff811681146119a1575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 424c1b564..793d953f6 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -45,13 +45,8 @@ type ValidatorRegistrationInput struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ -<<<<<<< HEAD ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612bc8380380612bc883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a7b8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e4578063467ef06f1461013557806366435abf14610148578063715018a6146101735780638994ab491461017b575b5f80fd5b6100e26100dd366004612394565b61023f565b005b6101226100f2366004612394565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6100e26101433660046123ab565b6103a0565b61015b610156366004612394565b610723565b6040516001600160401b03909116815260200161012c565b6100e2610737565b610122610189366004612406565b61074a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e0366004612394565b610766565b6100e26101f33660046123ab565b610772565b6101ba6005600160991b0181565b6100e2610214366004612394565b61092f565b6100e2610227366004612464565b6109fe565b6100e261023a36600461249a565b610b0c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612a4f833981519152929190610287906124b5565b90501180156102b9575060035f83815260078301602052604090205460ff1660058111156102b7576102b76124e7565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016124fb565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612585565b505050565b5f80516020612a4f8339815191525f6103b883610b46565b90505f806103c98360400151610d27565b91509150801561042e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610460576104606124e7565b6005811115610471576104716124e7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156104f8576104f86124e7565b14806105165750600182516005811115610514576105146124e7565b145b6105755760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b60038251600581111561058a5761058a6124e7565b036105b157505f83815260068601602052604081206004916105ac919061234a565b6105b5565b5060055b6020808301515f908152600888019091526040812055818160058111156105de576105de6124e7565b908160058111156105f1576105f16124e7565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610625576106256124e7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156106f0576106f06124e7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350505050505050565b5f61072d82610f86565b60a0015192915050565b61073f6110aa565b6107485f611105565b565b5f6107536110aa565b61075d8383611175565b90505b92915050565b61076f81611642565b50565b5f80516020612a4f8339815191525f61078a83610b46565b90505f8061079b8360400151610d27565b91509150806107fd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f82815260058501602052604081208054610817906124b5565b9050118015610849575060015f83815260078601602052604090205460ff166005811115610847576108476124e7565b145b6108655760405162461bcd60e51b81526004016103199061259c565b5f828152600585016020526040812061087d9161234a565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a4f833981519152929190610977906124b5565b90501180156109a9575060015f83815260078301602052604090205460ff1660058111156109a7576109a76124e7565b145b6109c55760405162461bcd60e51b81526004016103199061259c565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016124fb565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610a425750825b90505f826001600160401b03166001148015610a5d5750303b155b905081158015610a6b575080155b15610a895760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ab357845460ff60401b1916600160401b1785555b610abd8787611a0d565b8315610b0357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610b146110aa565b6001600160a01b038116610b3d57604051631e4fbdf760e01b81525f6004820152602401610319565b61076f81611105565b60408051606080820183525f8083526020830181905292820152905f80516020612a4f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015610bbb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610be29190810190612680565b9150915080610c495760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b8254825114610cac5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b031615610d1f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f808251602714610d8c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b6002811015610ddb57610da381600161277c565b610dae90600861278f565b61ffff16858281518110610dc457610dc46127a6565b016020015160f81c901b9190911790600101610d8f565b5061ffff811615610e3a5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b6004811015610e9557610e5181600361277c565b610e5c90600861278f565b63ffffffff1686610e6e8360026127ba565b81518110610e7e57610e7e6127a6565b016020015160f81c901b9190911790600101610e3d565b5063ffffffff8116600214610efc5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b6020811015610f5157610f1381601f61277c565b610f1e90600861278f565b87610f2a8360066127ba565b81518110610f3a57610f3a6127a6565b016020015160f81c901b9190911790600101610eff565b505f86602681518110610f6657610f666127a6565b016020015191976001600160f81b03199092161515965090945050505050565b6040805161010080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c0840182905260e084018290528582527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0790528390208351918201909352825491925f80516020612a4f83398151915292829060ff166005811115611021576110216124e7565b6005811115611032576110326124e7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b336110dc7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146107485760405163118cdaa760e01b8152336004820152602401610319565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612a4f8339815191524261119560408601602087016127cd565b6001600160401b03161180156111ce57506111b660408501602086016127cd565b6001600160401b03166111cc426202a3006127ba565b115b6112305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b83356112885760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b83355f908152600882016020526040902054156112f85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b61130560408501856127e6565b905060301461136c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b61137583611a2b565b5f8061140f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906113ba91906127cd565b6001600160401b031681526020016113d560408a018a6127e6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611bcc565b5f8281526005860160205260409020919350915061142d828261287a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061145a908590600401612939565b6020604051808303815f875af1158015611476573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149a9190612585565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561151c5761151c6124e7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556115dd83611f71565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961161460408d0160208e016127cd565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0760205260408082208151610100810190925280545f80516020612a4f83398151915293929190829060ff1660058111156116a3576116a36124e7565b60058111156116b4576116b46124e7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561173c5761173c6124e7565b146117985760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146118125760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b61181f8160a00151611a2b565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff19166001836005811115611863576118636124e7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61192f8461192981611f71565b5f611ff8565b5f858152600685016020526040902090915061194b828261287a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611978908590600401612939565b6020604051808303815f875af1158015611994573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119b89190612585565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b611a15612215565b611a1e8261225e565b611a278161227f565b5050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a4f8339815191529060ff165f03611a69575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611ab1908361277c565b10611acd576001600160401b0384166040830152808252611aec565b8382604001818151611adf919061296b565b6001600160401b03169052505b5f826020015183604001516064611b039190612992565b611b0d91906129bd565b600285015490915060ff9081169082161115611b885760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610319565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c365760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611cad57611c6d81600161277c565b611c7890600861278f565b5081515f90839083908110611c8f57611c8f6127a6565b60200101906001600160f81b03191690815f1a905350600101611c59565b505f5b6004811015611d0b57611cc481600361277c565b611ccf90600861278f565b505f82611cdd8360026127ba565b81518110611ced57611ced6127a6565b60200101906001600160f81b03191690815f1a905350600101611cb0565b505f5b6020811015611d685784518160208110611d2a57611d2a6127a6565b1a60f81b82611d3a8360066127ba565b81518110611d4a57611d4a6127a6565b60200101906001600160f81b03191690815f1a905350600101611d0e565b505f5b6020811015611dc85784602001518160208110611d8a57611d8a6127a6565b1a60f81b82611d9a8360266127ba565b81518110611daa57611daa6127a6565b60200101906001600160f81b03191690815f1a905350600101611d6b565b505f5b6008811015611e3c57611ddf81600761277c565b611dea90600861278f565b60ff1685604001516001600160401b0316901c60f81b82826046611e0e91906127ba565b81518110611e1e57611e1e6127a6565b60200101906001600160f81b03191690815f1a905350600101611dcb565b505f5b6030811015611ea75784608001518181518110611e5e57611e5e6127a6565b01602001516001600160f81b03191682611e7983604e6127ba565b81518110611e8957611e896127a6565b60200101906001600160f81b03191690815f1a905350600101611e3f565b505f5b6008811015611f1957611ebe81600761277c565b611ec990600861278f565b60608601516001600160401b0390811691161c60f81b82611eeb83607e6127ba565b81518110611efb57611efb6127a6565b60200101906001600160f81b03191690815f1a905350600101611eaa565b50600281604051611f2a91906129ee565b602060405180830381855afa158015611f45573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f689190612585565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060030180545f80516020612a4f833981519152916001600160401b0390911690819084611fc983612a09565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156120715761203181600161277c565b61203c90600861278f565b5081515f90839083908110612053576120536127a6565b60200101906001600160f81b03191690815f1a90535060010161201d565b505f5b60048110156120d45761208881600361277c565b61209390600861278f565b6001901c60f81b826120a68360026127ba565b815181106120b6576120b66127a6565b60200101906001600160f81b03191690815f1a905350600101612074565b505f5b6020811015612136576120eb81601f61277c565b6120f690600861278f565b86901c60f81b826121088360066127ba565b81518110612118576121186127a6565b60200101906001600160f81b03191690815f1a9053506001016120d7565b505f5b60088110156121a15761214d81600761277c565b61215890600861278f565b6001600160401b038616901c60f81b826121738360266127ba565b81518110612183576121836127a6565b60200101906001600160f81b03191690815f1a905350600101612139565b505f5b600881101561220c576121b881600761277c565b6121c390600861278f565b6001600160401b038516901c60f81b826121de83602e6127ba565b815181106121ee576121ee6127a6565b60200101906001600160f81b03191690815f1a9053506001016121a4565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661074857604051631afcd79f60e31b815260040160405180910390fd5b612266612215565b61226e612290565b6122766122a0565b61076f816122a8565b612287612215565b61076f81612314565b612298612215565b61074861231c565b610748612215565b6122b0612215565b80355f80516020612a4f83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122fa6060830160408401612a2e565b600291909101805460ff191660ff90921691909117905550565b610b14612215565b612324612215565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b508054612356906124b5565b5f825580601f10612365575050565b601f0160209004905f5260205f209081019061076f91905b80821115612390575f815560010161237d565b5090565b5f602082840312156123a4575f80fd5b5035919050565b5f602082840312156123bb575f80fd5b813563ffffffff811681146123ce575f80fd5b9392505050565b5f606082840312156123e5575f80fd5b50919050565b80356001600160401b0381168114612401575f80fd5b919050565b5f8060408385031215612417575f80fd5b82356001600160401b0381111561242c575f80fd5b612438858286016123d5565b925050612447602084016123eb565b90509250929050565b6001600160a01b038116811461076f575f80fd5b5f8060808385031215612475575f80fd5b61247f84846123d5565b9150606083013561248f81612450565b809150509250929050565b5f602082840312156124aa575f80fd5b81356123ce81612450565b600181811c908216806124c957607f821691505b6020821081036123e557634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f845461250d816124b5565b806020870152604060018084165f811461252e576001811461254a57612577565b60ff19851660408a0152604084151560051b8a01019550612577565b895f5260205f205f5b8581101561256e5781548b8201860152908301908801612553565b8a016040019650505b509398975050505050505050565b5f60208284031215612595575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612619576126196125e3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612647576126476125e3565b604052919050565b5f5b83811015612669578181015183820152602001612651565b50505f910152565b80518015158114612401575f80fd5b5f8060408385031215612691575f80fd5b82516001600160401b03808211156126a7575f80fd5b90840190606082870312156126ba575f80fd5b6126c26125f7565b825181526020808401516126d581612450565b828201526040840151838111156126ea575f80fd5b80850194505087601f8501126126fe575f80fd5b835183811115612710576127106125e3565b612722601f8201601f1916830161261f565b93508084528882828701011115612737575f80fd5b6127468183860184880161264f565b5082604083015281955061275b818801612671565b9450505050509250929050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561076057610760612768565b808202811582820484141761076057610760612768565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561076057610760612768565b5f602082840312156127dd575f80fd5b61075d826123eb565b5f808335601e198436030181126127fb575f80fd5b8301803591506001600160401b03821115612814575f80fd5b602001915036819003821315612828575f80fd5b9250929050565b601f82111561039b57805f5260205f20601f840160051c810160208510156128545750805b601f840160051c820191505b81811015612873575f8155600101612860565b5050505050565b81516001600160401b03811115612893576128936125e3565b6128a7816128a184546124b5565b8461282f565b602080601f8311600181146128da575f84156128c35750858301515b5f19600386901b1c1916600185901b178555612931565b5f85815260208120601f198616915b82811015612908578886015182559484019460019091019084016128e9565b508582101561292557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b602081525f825180602084015261295781604085016020870161264f565b601f01601f19169190910160400192915050565b6001600160401b0381811683821601908082111561298b5761298b612768565b5092915050565b6001600160401b038181168382160280821691908281146129b5576129b5612768565b505092915050565b5f6001600160401b03808416806129e257634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f82516129ff81846020870161264f565b9190910192915050565b5f6001600160401b03808316818103612a2457612a24612768565b6001019392505050565b5f60208284031215612a3e575f80fd5b813560ff811681146123ce575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", -======= - ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612bde380380612bde83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612a918061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f1461014857806366435abf1461015b578063715018a614610186575b5f80fd5b6100e26100dd3660046123a7565b61023f565b005b6101226100f23660046123a7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012261014336600461246b565b6103a0565b6100e261015636600461250e565b6103c0565b61016e6101693660046123a7565b6103cd565b6040516001600160401b03909116815260200161012c565b6100e26103e1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e03660046123a7565b6103f4565b6100e26101f336600461250e565b610400565b6101ba6005600160991b0181565b6100e26102143660046123a7565b6105bd565b6100e261022736600461254c565b61068c565b6100e261023a366004612588565b61079a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612a65833981519152929190610287906125a3565b90501180156102b9575060035f83815260078301602052604090205460ff1660058111156102b7576102b76125db565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125ef565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b9190612679565b505050565b5f6103a96107d4565b6103b58486858561082f565b90505b949350505050565b6103c981610c97565b5050565b5f6103d782611024565b60a0015192915050565b6103e96107d4565b6103f25f611116565b565b6103fd81611186565b50565b5f80516020612a658339815191525f61041883611551565b90505f806104298360400151611732565b915091508061048b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600585016020526040812080546104a5906125a3565b90501180156104d7575060015f83815260078601602052604090205460ff1660058111156104d5576104d56125db565b145b6104f35760405162461bcd60e51b815260040161031990612690565b5f828152600585016020526040812061050b91612314565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a65833981519152929190610605906125a3565b9050118015610637575060015f83815260078301602052604090205460ff166005811115610635576106356125db565b145b6106535760405162461bcd60e51b815260040161031990612690565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b91906004016125ef565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106d05750825b90505f826001600160401b031660011480156106eb5750303b155b9050811580156106f9575080155b156107175760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561074157845460ff60401b1916600160401b1785555b61074b8787611991565b831561079157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6107a26107d4565b6001600160a01b0381166107cb57604051631e4fbdf760e01b81525f6004820152602401610319565b6103fd81611116565b336108067f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103f25760405163118cdaa760e01b8152336004820152602401610319565b5f6108386119ab565b5f80516020612a65833981519152426001600160401b03851611801561087257506001600160401b038416610870426202a3006126eb565b115b6108d45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b8561092b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b5f868152600882016020526040902054156109995760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b8251603014610a005760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b610a09856119f5565b5f80610a506040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611b96565b5f82815260058601602052604090209193509150610a6e828261274f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610a9b908590600401612830565b6020604051808303815f875af1158015610ab7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610adb9190612679565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115610b5d57610b5d6125db565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055610c1e83611f3b565b50604080516001600160401b03808b1682528916602082015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a45090925050506103b860017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610c9f61234b565b5f80516020612a658339815191525f610cb784611551565b90505f80610cc88360400151611732565b915091508015610d2d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115610d5f57610d5f6125db565b6005811115610d7057610d706125db565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610df757610df76125db565b1480610e155750600182516005811115610e1357610e136125db565b145b610e745760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b600382516005811115610e8957610e896125db565b03610eb057505f8381526006860160205260408120600491610eab9190612314565b610eb4565b5060055b6020808301515f90815260088801909152604081205581816005811115610edd57610edd6125db565b90816005811115610ef057610ef06125db565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610f2457610f246125db565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610fef57610fef6125db565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b61102c61234b565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040908190208151610100810190925280545f80516020612a65833981519152929190829060ff16600581111561108d5761108d6125db565b600581111561109e5761109e6125db565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0760205260408082208151610100810190925280545f80516020612a6583398151915293929190829060ff1660058111156111e7576111e76125db565b60058111156111f8576111f86125db565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115611280576112806125db565b146112dc5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146113565760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b6113638160a001516119f5565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156113a7576113a76125db565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6114738461146d81611f3b565b5f611fe8565b5f858152600685016020526040902090915061148f828261274f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906114bc908590600401612830565b6020604051808303815f875af11580156114d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114fc9190612679565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612a658339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115ed9190810190612871565b91509150806116545760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146116b75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b03161561172a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146117975760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156117e6576117ae816001612943565b6117b9906008612956565b61ffff168582815181106117cf576117cf61296d565b016020015160f81c901b919091179060010161179a565b5061ffff8116156118455760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b60048110156118a05761185c816003612943565b611867906008612956565b63ffffffff16866118798360026126eb565b815181106118895761188961296d565b016020015160f81c901b9190911790600101611848565b5063ffffffff81166002146119075760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b602081101561195c5761191e81601f612943565b611929906008612956565b876119358360066126eb565b815181106119455761194561296d565b016020015160f81c901b919091179060010161190a565b505f866026815181106119715761197161296d565b016020015191976001600160f81b03199092161515965090945050505050565b611999612205565b6119a28261224e565b6103c98161226f565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f008054600119016119ef57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a658339815191529060ff165f03611a33575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611a7b9083612943565b10611a97576001600160401b0384166040830152808252611ab6565b8382604001818151611aa99190612981565b6001600160401b03169052505b5f826020015183604001516064611acd91906129a8565b611ad791906129d3565b600285015490915060ff9081169082161115611b525760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610319565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c005760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c7757611c37816001612943565b611c42906008612956565b5081515f90839083908110611c5957611c5961296d565b60200101906001600160f81b03191690815f1a905350600101611c23565b505f5b6004811015611cd557611c8e816003612943565b611c99906008612956565b505f82611ca78360026126eb565b81518110611cb757611cb761296d565b60200101906001600160f81b03191690815f1a905350600101611c7a565b505f5b6020811015611d325784518160208110611cf457611cf461296d565b1a60f81b82611d048360066126eb565b81518110611d1457611d1461296d565b60200101906001600160f81b03191690815f1a905350600101611cd8565b505f5b6020811015611d925784602001518160208110611d5457611d5461296d565b1a60f81b82611d648360266126eb565b81518110611d7457611d7461296d565b60200101906001600160f81b03191690815f1a905350600101611d35565b505f5b6008811015611e0657611da9816007612943565b611db4906008612956565b60ff1685604001516001600160401b0316901c60f81b82826046611dd891906126eb565b81518110611de857611de861296d565b60200101906001600160f81b03191690815f1a905350600101611d95565b505f5b6030811015611e715784608001518181518110611e2857611e2861296d565b01602001516001600160f81b03191682611e4383604e6126eb565b81518110611e5357611e5361296d565b60200101906001600160f81b03191690815f1a905350600101611e09565b505f5b6008811015611ee357611e88816007612943565b611e93906008612956565b60608601516001600160401b0390811691161c60f81b82611eb583607e6126eb565b81518110611ec557611ec561296d565b60200101906001600160f81b03191690815f1a905350600101611e74565b50600281604051611ef49190612a04565b602060405180830381855afa158015611f0f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f329190612679565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060030180545f80516020612a65833981519152916001600160401b0390911690819084611f9383612a1f565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561206157612021816001612943565b61202c906008612956565b5081515f908390839081106120435761204361296d565b60200101906001600160f81b03191690815f1a90535060010161200d565b505f5b60048110156120c457612078816003612943565b612083906008612956565b6001901c60f81b826120968360026126eb565b815181106120a6576120a661296d565b60200101906001600160f81b03191690815f1a905350600101612064565b505f5b6020811015612126576120db81601f612943565b6120e6906008612956565b86901c60f81b826120f88360066126eb565b815181106121085761210861296d565b60200101906001600160f81b03191690815f1a9053506001016120c7565b505f5b60088110156121915761213d816007612943565b612148906008612956565b6001600160401b038616901c60f81b826121638360266126eb565b815181106121735761217361296d565b60200101906001600160f81b03191690815f1a905350600101612129565b505f5b60088110156121fc576121a8816007612943565b6121b3906008612956565b6001600160401b038516901c60f81b826121ce83602e6126eb565b815181106121de576121de61296d565b60200101906001600160f81b03191690815f1a905350600101612194565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103f257604051631afcd79f60e31b815260040160405180910390fd5b612256612205565b61225e612280565b612266612290565b6103fd81612298565b612277612205565b6103fd81612304565b612288612205565b6103f261230c565b6103f2612205565b6122a0612205565b80355f80516020612a6583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122ea6060830160408401612a44565b600291909101805460ff191660ff90921691909117905550565b6107a2612205565b611fc2612205565b508054612320906125a3565b5f825580601f1061232f575050565b601f0160209004905f5260205f20908101906103fd919061238f565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156123a3575f8155600101612390565b5090565b5f602082840312156123b7575f80fd5b5035919050565b80356001600160401b03811681146123d4575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561240f5761240f6123d9565b60405290565b604051601f8201601f191681016001600160401b038111828210171561243d5761243d6123d9565b604052919050565b5f6001600160401b0382111561245d5761245d6123d9565b50601f01601f191660200190565b5f805f806080858703121561247e575f80fd5b612487856123be565b93506020850135925061249c604086016123be565b915060608501356001600160401b038111156124b6575f80fd5b8501601f810187136124c6575f80fd5b80356124d96124d482612445565b612415565b8181528860208385010111156124ed575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f6020828403121561251e575f80fd5b813563ffffffff81168114612531575f80fd5b9392505050565b6001600160a01b03811681146103fd575f80fd5b5f80828403608081121561255e575f80fd5b606081121561256b575f80fd5b50829150606083013561257d81612538565b809150509250929050565b5f60208284031215612598575f80fd5b813561253181612538565b600181811c908216806125b757607f821691505b6020821081036125d557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454612601816125a3565b806020870152604060018084165f8114612622576001811461263e5761266b565b60ff19851660408a0152604084151560051b8a0101955061266b565b895f5260205f205f5b858110156126625781548b8201860152908301908801612647565b8a016040019650505b509398975050505050505050565b5f60208284031215612689575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b634e487b7160e01b5f52601160045260245ffd5b808201808211156126fe576126fe6126d7565b92915050565b601f82111561039b57805f5260205f20601f840160051c810160208510156127295750805b601f840160051c820191505b81811015612748575f8155600101612735565b5050505050565b81516001600160401b03811115612768576127686123d9565b61277c8161277684546125a3565b84612704565b602080601f8311600181146127af575f84156127985750858301515b5f19600386901b1c1916600185901b178555612806565b5f85815260208120601f198616915b828110156127dd578886015182559484019460019091019084016127be565b50858210156127fa57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b83811015612828578181015183820152602001612810565b50505f910152565b602081525f825180602084015261284e81604085016020870161280e565b601f01601f19169190910160400192915050565b805180151581146123d4575f80fd5b5f8060408385031215612882575f80fd5b82516001600160401b0380821115612898575f80fd5b90840190606082870312156128ab575f80fd5b6128b36123ed565b825181526020808401516128c681612538565b828201526040840151838111156128db575f80fd5b80850194505087601f8501126128ef575f80fd5b835192506128ff6124d484612445565b8381528882858701011115612912575f80fd5b6129218483830184880161280e565b80604084015250819550612936818801612862565b9450505050509250929050565b818103818111156126fe576126fe6126d7565b80820281158282048414176126fe576126fe6126d7565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b038181168382160190808211156129a1576129a16126d7565b5092915050565b6001600160401b038181168382160280821691908281146129cb576129cb6126d7565b505092915050565b5f6001600160401b03808416806129f857634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a1581846020870161280e565b9190910192915050565b5f6001600160401b03808316818103612a3a57612a3a6126d7565b6001019392505050565b5f60208284031215612a54575f80fd5b813560ff81168114612531575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", ->>>>>>> origin/staking-contract + Bin: "0x608060405234801561000f575f80fd5b50604051612bf2380380612bf283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612aa58061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e4578063467ef06f1461013557806366435abf14610148578063715018a6146101735780638994ab491461017b575b5f80fd5b6100e26100dd3660046123be565b61023f565b005b6101226100f23660046123be565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6100e26101433660046123d5565b6103a0565b61015b6101563660046123be565b6103ad565b6040516001600160401b03909116815260200161012c565b6100e26103c1565b610122610189366004612430565b6103d4565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e03660046123be565b6103f0565b6100e26101f33660046123d5565b6103fc565b6101ba6005600160991b0181565b6100e26102143660046123be565b6105b9565b6100e261022736600461248e565b610688565b6100e261023a3660046124c4565b610796565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020612a79833981519152929190610287906124df565b90501180156102b9575060035f83815260078301602052604090205460ff1660058111156102b7576102b7612511565b145b6103225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b9190600401612525565b6020604051808303815f875af1158015610377573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061039b91906125af565b505050565b6103a9816107d0565b5050565b5f6103b782610b5d565b60a0015192915050565b6103c9610c4f565b6103d25f610caa565b565b5f6103dd610c4f565b6103e78383610d1a565b90505b92915050565b6103f9816111e7565b50565b5f80516020612a798339815191525f610414836115b2565b90505f806104258360400151611793565b91509150806104875760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610319565b5f828152600585016020526040812080546104a1906124df565b90501180156104d3575060015f83815260078601602052604090205460ff1660058111156104d1576104d1612511565b145b6104ef5760405162461bcd60e51b8152600401610319906125c6565b5f82815260058501602052604081206105079161232b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612a79833981519152929190610601906124df565b9050118015610633575060015f83815260078301602052604090205460ff16600581111561063157610631612511565b145b61064f5760405162461bcd60e51b8152600401610319906125c6565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161035b9190600401612525565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156106cc5750825b90505f826001600160401b031660011480156106e75750303b155b9050811580156106f5575080155b156107135760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561073d57845460ff60401b1916600160401b1785555b61074787876119f2565b831561078d57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b61079e610c4f565b6001600160a01b0381166107c757604051631e4fbdf760e01b81525f6004820152602401610319565b6103f981610caa565b6107d8612362565b5f80516020612a798339815191525f6107f0846115b2565b90505f806108018360400151611793565b9150915080156108665760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610319565b5f828152600785016020526040808220815161010081019092528054829060ff16600581111561089857610898612511565b60058111156108a9576108a9612511565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f908251600581111561093057610930612511565b148061094e575060018251600581111561094c5761094c612511565b145b6109ad5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610319565b6003825160058111156109c2576109c2612511565b036109e957505f83815260068601602052604081206004916109e4919061232b565b6109ed565b5060055b6020808301515f90815260088801909152604081205581816005811115610a1657610a16612511565b90816005811115610a2957610a29612511565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115610a5d57610a5d612511565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610b2857610b28612511565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610b65612362565b5f8281527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040908190208151610100810190925280545f80516020612a79833981519152929190829060ff166005811115610bc657610bc6612511565b6005811115610bd757610bd7612511565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b33610c817f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146103d25760405163118cdaa760e01b8152336004820152602401610319565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612a7983398151915242610d3a604086016020870161260d565b6001600160401b0316118015610d735750610d5b604085016020860161260d565b6001600160401b0316610d71426202a30061263a565b115b610dd55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610319565b8335610e2d5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610319565b83355f90815260088201602052604090205415610e9d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610319565b610eaa604085018561264d565b9050603014610f115760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610319565b610f1a83611a0c565b5f80610fb46040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190610f5f919061260d565b6001600160401b03168152602001610f7a60408a018a61264d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611bad565b5f82815260058601602052604090209193509150610fd282826126f5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610fff9085906004016127d6565b6020604051808303815f875af115801561101b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103f91906125af565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff191660018360058111156110c1576110c1612511565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561118283611f52565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e896111b960408d0160208e0161260d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0760205260408082208151610100810190925280545f80516020612a7983398151915293929190829060ff16600581111561124857611248612511565b600581111561125957611259612511565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156112e1576112e1612511565b1461133d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610319565b60408101516001600160a01b0316336001600160a01b0316146113b75760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610319565b6113c48160a00151611a0c565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561140857611408612511565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6114d4846114ce81611f52565b5f611fd9565b5f85815260068501602052604090209091506114f082826126f5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061151d9085906004016127d6565b6020604051808303815f875af1158015611539573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061155d91906125af565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612a798339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611627573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261164e919081019061286f565b91509150806116b55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610319565b82548251146117185760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610319565b60208201516001600160a01b03161561178b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610319565b509392505050565b5f8082516027146117f85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610319565b5f805b60028110156118475761180f816001612957565b61181a90600861296a565b61ffff1685828151811061183057611830612981565b016020015160f81c901b91909117906001016117fb565b5061ffff8116156118a65760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610319565b5f805b6004811015611901576118bd816003612957565b6118c890600861296a565b63ffffffff16866118da83600261263a565b815181106118ea576118ea612981565b016020015160f81c901b91909117906001016118a9565b5063ffffffff81166002146119685760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610319565b5f805b60208110156119bd5761197f81601f612957565b61198a90600861296a565b8761199683600661263a565b815181106119a6576119a6612981565b016020015160f81c901b919091179060010161196b565b505f866026815181106119d2576119d2612981565b016020015191976001600160f81b03199092161515965090945050505050565b6119fa6121f6565b611a038261223f565b6103a981612260565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612a798339815191529060ff165f03611a4a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611a929083612957565b10611aae576001600160401b0384166040830152808252611acd565b8382604001818151611ac09190612995565b6001600160401b03169052505b5f826020015183604001516064611ae491906129bc565b611aee91906129e7565b600285015490915060ff9081169082161115611b695760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610319565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611c175760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610319565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611c8e57611c4e816001612957565b611c5990600861296a565b5081515f90839083908110611c7057611c70612981565b60200101906001600160f81b03191690815f1a905350600101611c3a565b505f5b6004811015611cec57611ca5816003612957565b611cb090600861296a565b505f82611cbe83600261263a565b81518110611cce57611cce612981565b60200101906001600160f81b03191690815f1a905350600101611c91565b505f5b6020811015611d495784518160208110611d0b57611d0b612981565b1a60f81b82611d1b83600661263a565b81518110611d2b57611d2b612981565b60200101906001600160f81b03191690815f1a905350600101611cef565b505f5b6020811015611da95784602001518160208110611d6b57611d6b612981565b1a60f81b82611d7b83602661263a565b81518110611d8b57611d8b612981565b60200101906001600160f81b03191690815f1a905350600101611d4c565b505f5b6008811015611e1d57611dc0816007612957565b611dcb90600861296a565b60ff1685604001516001600160401b0316901c60f81b82826046611def919061263a565b81518110611dff57611dff612981565b60200101906001600160f81b03191690815f1a905350600101611dac565b505f5b6030811015611e885784608001518181518110611e3f57611e3f612981565b01602001516001600160f81b03191682611e5a83604e61263a565b81518110611e6a57611e6a612981565b60200101906001600160f81b03191690815f1a905350600101611e20565b505f5b6008811015611efa57611e9f816007612957565b611eaa90600861296a565b60608601516001600160401b0390811691161c60f81b82611ecc83607e61263a565b81518110611edc57611edc612981565b60200101906001600160f81b03191690815f1a905350600101611e8b565b50600281604051611f0b9190612a18565b602060405180830381855afa158015611f26573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611f4991906125af565b94909350915050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812060030180545f80516020612a79833981519152916001600160401b0390911690819084611faa83612a33565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561205257612012816001612957565b61201d90600861296a565b5081515f9083908390811061203457612034612981565b60200101906001600160f81b03191690815f1a905350600101611ffe565b505f5b60048110156120b557612069816003612957565b61207490600861296a565b6001901c60f81b8261208783600261263a565b8151811061209757612097612981565b60200101906001600160f81b03191690815f1a905350600101612055565b505f5b6020811015612117576120cc81601f612957565b6120d790600861296a565b86901c60f81b826120e983600661263a565b815181106120f9576120f9612981565b60200101906001600160f81b03191690815f1a9053506001016120b8565b505f5b60088110156121825761212e816007612957565b61213990600861296a565b6001600160401b038616901c60f81b8261215483602661263a565b8151811061216457612164612981565b60200101906001600160f81b03191690815f1a90535060010161211a565b505f5b60088110156121ed57612199816007612957565b6121a490600861296a565b6001600160401b038516901c60f81b826121bf83602e61263a565b815181106121cf576121cf612981565b60200101906001600160f81b03191690815f1a905350600101612185565b50949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166103d257604051631afcd79f60e31b815260040160405180910390fd5b6122476121f6565b61224f612271565b612257612281565b6103f981612289565b6122686121f6565b6103f9816122f5565b6122796121f6565b6103d26122fd565b6103d26121f6565b6122916121f6565b80355f80516020612a7983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556122db6060830160408401612a58565b600291909101805460ff191660ff90921691909117905550565b61079e6121f6565b6123056121f6565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b508054612337906124df565b5f825580601f10612346575050565b601f0160209004905f5260205f20908101906103f991906123a6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156123ba575f81556001016123a7565b5090565b5f602082840312156123ce575f80fd5b5035919050565b5f602082840312156123e5575f80fd5b813563ffffffff811681146123f8575f80fd5b9392505050565b5f6060828403121561240f575f80fd5b50919050565b80356001600160401b038116811461242b575f80fd5b919050565b5f8060408385031215612441575f80fd5b82356001600160401b03811115612456575f80fd5b612462858286016123ff565b92505061247160208401612415565b90509250929050565b6001600160a01b03811681146103f9575f80fd5b5f806080838503121561249f575f80fd5b6124a984846123ff565b915060608301356124b98161247a565b809150509250929050565b5f602082840312156124d4575f80fd5b81356123f88161247a565b600181811c908216806124f357607f821691505b60208210810361240f57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52602160045260245ffd5b5f60208083525f8454612537816124df565b806020870152604060018084165f81146125585760018114612574576125a1565b60ff19851660408a0152604084151560051b8a010195506125a1565b895f5260205f205f5b858110156125985781548b820186015290830190880161257d565b8a016040019650505b509398975050505050505050565b5f602082840312156125bf575f80fd5b5051919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f6020828403121561261d575f80fd5b6103e782612415565b634e487b7160e01b5f52601160045260245ffd5b808201808211156103ea576103ea612626565b5f808335601e19843603018112612662575f80fd5b8301803591506001600160401b0382111561267b575f80fd5b60200191503681900382131561268f575f80fd5b9250929050565b634e487b7160e01b5f52604160045260245ffd5b601f82111561039b57805f5260205f20601f840160051c810160208510156126cf5750805b601f840160051c820191505b818110156126ee575f81556001016126db565b5050505050565b81516001600160401b0381111561270e5761270e612696565b6127228161271c84546124df565b846126aa565b602080601f831160018114612755575f841561273e5750858301515b5f19600386901b1c1916600185901b1785556127ac565b5f85815260208120601f198616915b8281101561278357888601518255948401946001909101908401612764565b50858210156127a057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156127ce5781810151838201526020016127b6565b50505f910152565b602081525f82518060208401526127f48160408501602087016127b4565b601f01601f19169190910160400192915050565b604051606081016001600160401b038111828210171561282a5761282a612696565b60405290565b604051601f8201601f191681016001600160401b038111828210171561285857612858612696565b604052919050565b8051801515811461242b575f80fd5b5f8060408385031215612880575f80fd5b82516001600160401b0380821115612896575f80fd5b90840190606082870312156128a9575f80fd5b6128b1612808565b825181526020808401516128c48161247a565b828201526040840151838111156128d9575f80fd5b80850194505087601f8501126128ed575f80fd5b8351838111156128ff576128ff612696565b612911601f8201601f19168301612830565b93508084528882828701011115612926575f80fd5b612935818386018488016127b4565b5082604083015281955061294a818801612860565b9450505050509250929050565b818103818111156103ea576103ea612626565b80820281158282048414176103ea576103ea612626565b634e487b7160e01b5f52603260045260245ffd5b6001600160401b038181168382160190808211156129b5576129b5612626565b5092915050565b6001600160401b038181168382160280821691908281146129df576129df612626565b505092915050565b5f6001600160401b0380841680612a0c57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a298184602087016127b4565b9190910192915050565b5f6001600160401b03808316818103612a4e57612a4e612626565b6001019392505050565b5f60208284031215612a68575f80fd5b813560ff811681146123f8575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. From e336fc7cf036e821633807927df5098471190bb1 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 11 Sep 2024 16:31:07 -0400 Subject: [PATCH 247/545] add cap to maximum stake multiplier --- contracts/staking/PoSValidatorManager.sol | 7 +++++- .../tests/ERC20TokenStakingManagerTests.t.sol | 24 ++++++++++++++++++- .../NativeTokenStakingManagerTests.t.sol | 23 +++++++++++++++++- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 2730161b0..26d256fe3 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -60,6 +60,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bytes32 private constant _POS_VALIDATOR_MANAGER_STORAGE_LOCATION = 0x4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00; + uint8 public constant MAXIMUM_STAKE_MULTIPLIER_LIMIT = 10; + // solhint-disable ordering function _getPoSValidatorManagerStorage() private @@ -103,7 +105,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager minimumStakeAmount <= maximumStakeAmount, "PoSValidatorManager: invalid stake amount range" ); - require(maximumStakeMultiplier > 0, "PoSValidatorManager: zero maximum stake multiplier"); + require( + maximumStakeMultiplier > 0 && maximumStakeMultiplier <= MAXIMUM_STAKE_MULTIPLIER_LIMIT, + "PoSValidatorManager: invalid maximum stake multiplier" + ); $._minimumStakeAmount = minimumStakeAmount; $._maximumStakeAmount = maximumStakeAmount; diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 08e854c40..cf742ec9f 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -97,7 +97,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMaxStakeMultiplier() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(_formatErrorMessage("zero maximum stake multiplier")); + vm.expectRevert(_formatErrorMessage("invalid maximum stake multiplier")); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -116,6 +116,28 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ); } + function testMaxStakeMultiplierOverLimit() public { + app = new ERC20TokenStakingManager(ICMInitializable.Allowed); + uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; + vm.expectRevert(_formatErrorMessage("invalid maximum stake multiplier")); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + maximumStakeMultiplier: maximumStakeMultiplier, + rewardCalculator: IRewardCalculator(address(0)) + }), + token + ); + } + function testInvalidValidatorMinStakeDuration() public { ValidatorRegistrationInput memory input = ValidatorRegistrationInput(DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY); diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index d6b24d5c6..82466f49e 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -87,7 +87,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMaxStakeMultiplier() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(_formatErrorMessage("zero maximum stake multiplier")); + vm.expectRevert(_formatErrorMessage("invalid maximum stake multiplier")); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -105,6 +105,27 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ); } + function testMaxStakeMultiplierOverLimit() public { + app = new NativeTokenStakingManager(ICMInitializable.Allowed); + uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; + vm.expectRevert(_formatErrorMessage("invalid maximum stake multiplier")); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + maximumStakeMultiplier: maximumStakeMultiplier, + rewardCalculator: IRewardCalculator(address(0)) + }) + ); + } + // Helpers function _initializeValidatorRegistration( ValidatorRegistrationInput memory input, From a34ab4ff3fa04e5397bcd58edcd3c4c349f464f2 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 11 Sep 2024 16:35:04 -0400 Subject: [PATCH 248/545] allow 0 maximum stake multiplier --- .../ERC20TokenStakingManager.go | 35 +++++++++++++++++-- .../NativeTokenStakingManager.go | 35 +++++++++++++++++-- contracts/staking/PoSValidatorManager.sol | 4 ++- .../tests/ERC20TokenStakingManagerTests.t.sol | 21 ----------- .../NativeTokenStakingManagerTests.t.sol | 20 ----------- 5 files changed, 69 insertions(+), 46 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 8c47f3c0f..b3cd62d98 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -62,8 +62,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614d33380380614d3383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614be68061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610111575f3560e01c806366435abf1161009e5780639e1bc4ef1161006e5780639e1bc4ef14610264578063a3a65e4814610277578063b771b3bc1461028a578063bee0a03f146102b0578063fbf50cdb146102c3575f80fd5b806366435abf146102185780636d0e43fa1461022b57806376f786211461023e57806398f3e2b414610251575f80fd5b80632e2194d8116100e45780632e2194d8146101a1578063467ef06f146101cc5780635297fae6146101df57806362065856146101f257806365b3a62114610205575f80fd5b80630118acc4146101155780630322ed981461012a5780630cdd09851461013d578063162f1f611461018e575b5f80fd5b610128610123366004614263565b6102d6565b005b61012861013836600461429e565b610761565b61017b61014b36600461429e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61012861019c36600461429e565b6108bd565b6101b46101af36600461429e565b61092a565b6040516001600160401b039091168152602001610185565b6101286101da3660046142b5565b610940565b6101286101ed3660046142ce565b61096b565b61017b6102003660046142f6565b610b5c565b61017b61021336600461431c565b610b75565b6101b461022636600461429e565b610ba8565b61012861023936600461429e565b610bbc565b61012861024c366004614263565b610c29565b61012861025f3660046142ce565b610cfb565b61017b61027236600461437d565b610f2b565b6101286102853660046142b5565b610f37565b6102986005600160991b0181565b6040516001600160a01b039091168152602001610185565b6101286102be36600461429e565b6110f4565b6101286102d13660046143b1565b6111c3565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614b3a8339815191529184156103285761032582856112a7565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561035a5761035a6143ef565b600481111561036b5761036b6143ef565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103f2576103f26143ef565b146104445760405162461bcd60e51b815260206004820152602a60248201525f80516020614b5a8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104a95760405162461bcd60e51b815260206004820152603360248201525f80516020614b5a8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161043b565b5f6104b384611543565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff19166001836004811115610500576105006143ef565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105d2856115b7565b905082606001516001600160401b03168160a001516001600160401b0316116106495760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161043b565b5f83606001518260a0015161065e9190614417565b905061066a8682611696565b5f6106768785846116de565b5f8c815260088a016020526040902090915061069282826144ce565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106bf9085906004016145af565b6020604051808303815f875af11580156106db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ff91906145e1565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020614b7a8339815191529291906107a990614452565b90501180156107db575060035f83815260078301602052604090205460ff1660058111156107d9576107d96143ef565b145b61083f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161043b565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016145f8565b6020604051808303815f875af1158015610894573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b891906145e1565b505050565b6108c6816118fb565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614b3a833981519152916005600160991b019163ee5b48eb91610878916004016145f8565b5f61093a64e8d4a5100083614696565b92915050565b5f61094a826119ca565b905061096781606001516001600160401b03168260400151611d57565b5050565b5f80516020614b3a8339815191525f61098384611d8d565b90505f806109948360400151611f6e565b50915091506109a2856121a9565b5f85815260078501602052604081206109ba916141ab565b5f6109c4836115b7565b9050816001600160401b031681608001516001600160401b031610156109fc5760405162461bcd60e51b815260040161043b906146a9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a415760405162461bcd60e51b815260040161043b906146eb565b60015f87815260068701602052604090205460ff166004811115610a6757610a676143ef565b14610ad05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161043b565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61093a6001600160401b03831664e8d4a51000614734565b5f610b7e612282565b610b898484846122b9565b9050610ba160015f80516020614b9a83398151915255565b9392505050565b5f610bb2826115b7565b60a0015192915050565b610bc5816121a9565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f80516020614b3a833981519152916005600160991b019163ee5b48eb91610878916004016145f8565b5f80516020614b3a8339815191525f610c41856115b7565b5f86815260058401602052604090206001015460c0820151919250610c6e916001600160401b031661474b565b421015610cd95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161043b565b8315610ceb57610ce985846112a7565b505b610cf4856124a3565b5050505050565b5f80516020614b3a8339815191525f610d1384611d8d565b90505f80610d248360400151611f6e565b5091509150610d32856118fb565b5f8581526008850160205260408120610d4a916141ab565b5f610d54836115b7565b9050816001600160401b031681608001516001600160401b03161015610d8c5760405162461bcd60e51b815260040161043b906146a9565b5f8681526006860160205260409020600301546001600160401b0380841691161115610dca5760405162461bcd60e51b815260040161043b906146eb565b60035f87815260068701602052604090205460ff166004811115610df057610df06143ef565b14610e445760405162461bcd60e51b815260206004820152603160248201525f80516020614b5a8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161043b565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610ee991611d57565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610ba183338461285b565b5f80516020614b7a8339815191525f610f4f83611d8d565b90505f80610f608360400151612c8f565b9150915080610fc25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043b565b5f82815260058501602052604081208054610fdc90614452565b905011801561100e575060015f83815260078601602052604090205460ff16600581111561100c5761100c6143ef565b145b61102a5760405162461bcd60e51b815260040161043b9061475e565b5f8281526005850160205260408120611042916141ab565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614b7a83398151915292919061113c90614452565b905011801561116e575060015f83815260078301602052604090205460ff16600581111561116c5761116c6143ef565b145b61118a5760405162461bcd60e51b815260040161043b9061475e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087891906004016145f8565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061120c575080546001600160401b03808416911610155b1561122a5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556112558484612e30565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156112f2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113199190810190614808565b915091508061137c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161043b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e391906145e1565b8251146114475760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161043b565b60208201516001600160a01b0316156114bd5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161043b565b5f806114cc8460400151612e4a565b915091508187146115395760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161043b565b9695505050505050565b5f8181525f80516020614bba8339815191526020526040812060030180545f80516020614b7a833981519152916001600160401b0390911690819084611588836148f0565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115bf6141e2565b5f8281525f80516020614bba8339815191526020526040908190208151610100810190925280545f80516020614b7a833981519152929190829060ff16600581111561160d5761160d6143ef565b600581111561161e5761161e6143ef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614bba833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561175757611717816001614915565b611722906008614734565b5081515f9083908390811061173957611739614928565b60200101906001600160f81b03191690815f1a905350600101611703565b505f5b60048110156117ba5761176e816003614915565b611779906008614734565b6001901c60f81b8261178c83600261474b565b8151811061179c5761179c614928565b60200101906001600160f81b03191690815f1a90535060010161175a565b505f5b602081101561181c576117d181601f614915565b6117dc906008614734565b86901c60f81b826117ee83600661474b565b815181106117fe576117fe614928565b60200101906001600160f81b03191690815f1a9053506001016117bd565b505f5b600881101561188757611833816007614915565b61183e906008614734565b6001600160401b038616901c60f81b8261185983602661474b565b8151811061186957611869614928565b60200101906001600160f81b03191690815f1a90535060010161181f565b505f5b60088110156118f25761189e816007614915565b6118a9906008614734565b6001600160401b038516901c60f81b826118c483602e61474b565b815181106118d4576118d4614928565b60200101906001600160f81b03191690815f1a90535060010161188a565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f80516020614b3a83398151915292919061194390614452565b9050118015611975575060035f83815260068301602052604090205460ff166004811115611973576119736143ef565b145b6109675760405162461bcd60e51b815260206004820152603360248201525f80516020614b5a83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b606482015260840161043b565b6119d26141e2565b5f80516020614b7a8339815191525f6119ea84611d8d565b90505f806119fb8360400151612c8f565b915091508015611a605760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043b565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611a9257611a926143ef565b6005811115611aa357611aa36143ef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b2a57611b2a6143ef565b1480611b485750600182516005811115611b4657611b466143ef565b145b611ba75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043b565b600382516005811115611bbc57611bbc6143ef565b03611be357505f8381526006860160205260408120600491611bde91906141ab565b611be7565b5060055b6020808301515f90815260088801909152604081205581816005811115611c1057611c106143ef565b90816005811115611c2357611c236143ef565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611c5757611c576143ef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d2257611d226143ef565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610967906001600160a01b03168284613022565b60408051606080820183525f8083526020830181905292820152905f80516020614b7a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e02573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e299190810190614808565b9150915080611e905760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161043b565b8254825114611ef35760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043b565b60208201516001600160a01b031615611f665760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043b565b509392505050565b5f805f8351603614611f925760405162461bcd60e51b815260040161043b9061493c565b5f805b6002811015611fe157611fa9816001614915565b611fb4906008614734565b61ffff16868281518110611fca57611fca614928565b016020015160f81c901b9190911790600101611f95565b5061ffff8116156120045760405162461bcd60e51b815260040161043b90614985565b5f805b600481101561205f5761201b816003614915565b612026906008614734565b63ffffffff168761203883600261474b565b8151811061204857612048614928565b016020015160f81c901b9190911790600101612007565b5063ffffffff81166003146120865760405162461bcd60e51b815260040161043b906149c8565b5f805b60208110156120db5761209d81601f614915565b6120a8906008614734565b886120b483600661474b565b815181106120c4576120c4614928565b016020015160f81c901b9190911790600101612089565b505f805b600881101561213a576120f3816007614915565b6120fe906008614734565b6001600160401b03168961211383602661474b565b8151811061212357612123614928565b016020015160f81c901b91909117906001016120df565b505f805b600881101561219957612152816007614915565b61215d906008614734565b6001600160401b03168a61217283602e61474b565b8151811061218257612182614928565b016020015160f81c901b919091179060010161213e565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f80516020614b3a8339815191529291906121f190614452565b9050118015612223575060015f83815260068301602052604090205460ff166004811115612221576122216143ef565b145b6109675760405162461bcd60e51b815260206004820152603860248201525f80516020614b5a83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e670000000000000000606482015260840161043b565b5f80516020614b9a8339815191528054600119016122b357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614b3a833981519152906001600160401b0316602085013510156123605760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161043b565b6003810154843510156123c95760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161043b565b805483108015906123de575080600101548311155b61243c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161043b565b5f61244684613081565b90505f6124528261092a565b90505f61245f88836130b7565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f80516020614b9a83398151915255565b5f8181525f80516020614bba83398151915260205260408082208151610100810190925280545f80516020614b7a83398151915293929190829060ff1660058111156124f1576124f16143ef565b6005811115612502576125026143ef565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561258a5761258a6143ef565b146125e65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043b565b60408101516001600160a01b0316336001600160a01b0316146126605760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161043b565b61266d8160a00151613584565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156126b1576126b16143ef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61277d8461277781611543565b5f6116de565b5f858152600685016020526040902090915061279982826144ce565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127c69085906004016145af565b6020604051808303815f875af11580156127e2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061280691906145e1565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f612864612282565b5f80516020614b3a8339815191525f61287f6101af85613081565b90505f61288b876115b7565b90506002815160058111156128a2576128a26143ef565b146129015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161043b565b5f828260a001516129129190614a0f565b60048501546001860154919250612934916001600160401b0390911690614734565b61293d82610b5c565b11156129a95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161043b565b6129b38882611696565b5f6129bd89611543565b90505f89826040516020016129e992919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612a0a85613584565b5f612a168b84866116de565b5f8381526007890160205260409020909150612a3282826144ce565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612a5f9085906004016145af565b6020604051808303815f875af1158015612a7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9f91906145e1565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612b4e57612b4e6143ef565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610ba160015f80516020614b9a83398151915255565b5f808251602714612cb25760405162461bcd60e51b815260040161043b9061493c565b5f805b6002811015612d0157612cc9816001614915565b612cd4906008614734565b61ffff16858281518110612cea57612cea614928565b016020015160f81c901b9190911790600101612cb5565b5061ffff811615612d245760405162461bcd60e51b815260040161043b90614985565b5f805b6004811015612d7f57612d3b816003614915565b612d46906008614734565b63ffffffff1686612d5883600261474b565b81518110612d6857612d68614928565b016020015160f81c901b9190911790600101612d27565b5063ffffffff8116600214612da65760405162461bcd60e51b815260040161043b906149c8565b5f805b6020811015612dfb57612dbd81601f614915565b612dc8906008614734565b87612dd483600661474b565b81518110612de457612de4614928565b016020015160f81c901b9190911790600101612da9565b505f86602681518110612e1057612e10614928565b016020015191976001600160f81b03199092161515965090945050505050565b612e38613725565b612e4182613770565b610967816137ce565b5f808251602e14612e6d5760405162461bcd60e51b815260040161043b9061493c565b5f805b6002811015612ebc57612e84816001614915565b612e8f906008614734565b61ffff16858281518110612ea557612ea5614928565b016020015160f81c901b9190911790600101612e70565b5061ffff811615612edf5760405162461bcd60e51b815260040161043b90614985565b5f805b6004811015612f3a57612ef6816003614915565b612f01906008614734565b63ffffffff1686612f1383600261474b565b81518110612f2357612f23614928565b016020015160f81c901b9190911790600101612ee2565b5063ffffffff8116600414612f615760405162461bcd60e51b815260040161043b906149c8565b5f805b6020811015612fb657612f7881601f614915565b612f83906008614734565b87612f8f83600661474b565b81518110612f9f57612f9f614928565b016020015160f81c901b9190911790600101612f64565b505f805b600881101561301557612fce816007614915565b612fd9906008614734565b6001600160401b031688612fee83602661474b565b81518110612ffe57612ffe614928565b016020015160f81c901b9190911790600101612fba565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526108b891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613882565b5f61093a827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906138e3565b5f5f80516020614b7a833981519152426130d760408601602087016142f6565b6001600160401b031611801561311057506130f860408501602086016142f6565b6001600160401b031661310e426202a30061474b565b115b6131725760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161043b565b83356131ca5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043b565b83355f9081526008820160205260409020541561323a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161043b565b6132476040850185614a2f565b90506030146132ae5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043b565b6132b783613584565b5f806133516040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906132fc91906142f6565b6001600160401b0316815260200161331760408a018a614a2f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613a45565b5f8281526005860160205260409020919350915061336f82826144ce565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061339c9085906004016145af565b6020604051808303815f875af11580156133b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133dc91906145e1565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561345e5761345e6143ef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561351f83611543565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961355660408d0160208e016142f6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614b7a8339815191529060ff165f036135c2575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061360a9083614915565b10613626576001600160401b0384166040830152808252613645565b83826040018181516136389190614a0f565b6001600160401b03169052505b5f82602001518360400151606461365c9190614a78565b6136669190614aa3565b600285015490915060ff90811690821611156136e15760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161043b565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661376e57604051631afcd79f60e31b815260040160405180910390fd5b565b613778613725565b61378181613dea565b6137cb6060820135608083013561379e60c0850160a086016142f6565b60c08501356137b4610100870160e088016142f6565b6137c661012088016101008901614ac8565b613e0b565b50565b6137d6613725565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166138625760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161043b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6138966001600160a01b03841683613fbf565b905080515f141580156138ba5750808060200190518101906138b89190614ae3565b155b156108b857604051635274afe760e01b81526001600160a01b038416600482015260240161043b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061394d91906145e1565b90506139646001600160a01b038516333086613fcc565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139cc91906145e1565b9050818111613a325760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161043b565b613a3c8282614915565b95945050505050565b5f6060826080015151603014613aaf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613b2657613ae6816001614915565b613af1906008614734565b5081515f90839083908110613b0857613b08614928565b60200101906001600160f81b03191690815f1a905350600101613ad2565b505f5b6004811015613b8457613b3d816003614915565b613b48906008614734565b505f82613b5683600261474b565b81518110613b6657613b66614928565b60200101906001600160f81b03191690815f1a905350600101613b29565b505f5b6020811015613be15784518160208110613ba357613ba3614928565b1a60f81b82613bb383600661474b565b81518110613bc357613bc3614928565b60200101906001600160f81b03191690815f1a905350600101613b87565b505f5b6020811015613c415784602001518160208110613c0357613c03614928565b1a60f81b82613c1383602661474b565b81518110613c2357613c23614928565b60200101906001600160f81b03191690815f1a905350600101613be4565b505f5b6008811015613cb557613c58816007614915565b613c63906008614734565b60ff1685604001516001600160401b0316901c60f81b82826046613c87919061474b565b81518110613c9757613c97614928565b60200101906001600160f81b03191690815f1a905350600101613c44565b505f5b6030811015613d205784608001518181518110613cd757613cd7614928565b01602001516001600160f81b03191682613cf283604e61474b565b81518110613d0257613d02614928565b60200101906001600160f81b03191690815f1a905350600101613cb8565b505f5b6008811015613d9257613d37816007614915565b613d42906008614734565b60608601516001600160401b0390811691161c60f81b82613d6483607e61474b565b81518110613d7457613d74614928565b60200101906001600160f81b03191690815f1a905350600101613d23565b50600281604051613da39190614afe565b602060405180830381855afa158015613dbe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613de191906145e1565b94909350915050565b613df2613725565b613dfa61400b565b613e0261401b565b6137cb81614023565b613e13613725565b5f80516020614b3a83398151915283613e7f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161043b565b85871115613ee75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161043b565b5f836001600160401b031611613f5a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161043b565b95865560018601949094556002850180546001600160401b0394851667ffffffffffffffff199091161790556003850191909155600490930180546001600160a01b03909316600160401b026001600160e01b03199093169390911692909217179055565b6060610ba183835f61408f565b6040516001600160a01b0384811660248301528381166044830152606482018390526140059186918216906323b872dd9060840161304f565b50505050565b614013613725565b61376e61411e565b61376e613725565b61402b613725565b80355f80516020614b7a83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556140756060830160408401614b19565b600291909101805460ff191660ff90921691909117905550565b6060814710156140b45760405163cd78605960e01b815230600482015260240161043b565b5f80856001600160a01b031684866040516140cf9190614afe565b5f6040518083038185875af1925050503d805f8114614109576040519150601f19603f3d011682016040523d82523d5f602084013e61410e565b606091505b5091509150611539868383614126565b612490613725565b60608261413b5761413682614182565b610ba1565b815115801561415257506001600160a01b0384163b155b1561417b57604051639996b31560e01b81526001600160a01b038516600482015260240161043b565b5080610ba1565b8051156141925780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546141b790614452565b5f825580601f106141c6575050565b601f0160209004905f5260205f20908101906137cb9190614226565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561423a575f8155600101614227565b5090565b80151581146137cb575f80fd5b803563ffffffff8116811461425e575f80fd5b919050565b5f805f60608486031215614275575f80fd5b8335925060208401356142878161423e565b91506142956040850161424b565b90509250925092565b5f602082840312156142ae575f80fd5b5035919050565b5f602082840312156142c5575f80fd5b610ba18261424b565b5f80604083850312156142df575f80fd5b6142e88361424b565b946020939093013593505050565b5f60208284031215614306575f80fd5b81356001600160401b0381168114610ba1575f80fd5b5f805f838503608081121561432f575f80fd5b84356001600160401b03811115614344575f80fd5b850160608188031215614355575f80fd5b93506040601f1982011215614368575f80fd5b50602084019150606084013590509250925092565b5f806040838503121561438e575f80fd5b50508035926020909101359150565b6001600160a01b03811681146137cb575f80fd5b5f808284036101408112156143c4575f80fd5b610120808212156143d3575f80fd5b84935083013590506143e48161439d565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561443757614437614403565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061446657607f821691505b60208210810361448457634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108b857805f5260205f20601f840160051c810160208510156144af5750805b601f840160051c820191505b81811015610cf4575f81556001016144bb565b81516001600160401b038111156144e7576144e761443e565b6144fb816144f58454614452565b8461448a565b602080601f83116001811461452e575f84156145175750858301515b5f19600386901b1c1916600185901b178555614585565b5f85815260208120601f198616915b8281101561455c5788860151825594840194600190910190840161453d565b508582101561457957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156145a757818101518382015260200161458f565b50505f910152565b602081525f82518060208401526145cd81604085016020870161458d565b601f01601f19169190910160400192915050565b5f602082840312156145f1575f80fd5b5051919050565b5f60208083525f845461460a81614452565b806020870152604060018084165f811461462b576001811461464757614674565b60ff19851660408a0152604084151560051b8a01019550614674565b895f5260205f205f5b8581101561466b5781548b8201860152908301908801614650565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826146a4576146a4614682565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761093a5761093a614403565b8082018082111561093a5761093a614403565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b03811182821017156147c7576147c761443e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156147f5576147f561443e565b604052919050565b805161425e8161423e565b5f8060408385031215614819575f80fd5b82516001600160401b038082111561482f575f80fd5b9084019060608287031215614842575f80fd5b61484a6147a5565b8251815260208084015161485d8161439d565b82820152604084015183811115614872575f80fd5b80850194505087601f850112614886575f80fd5b8351838111156148985761489861443e565b6148aa601f8201601f191683016147cd565b935080845288828287010111156148bf575f80fd5b6148ce8183860184880161458d565b508260408301528195506148e38188016147fd565b9450505050509250929050565b5f6001600160401b0380831681810361490b5761490b614403565b6001019392505050565b8181038181111561093a5761093a614403565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561443757614437614403565b5f808335601e19843603018112614a44575f80fd5b8301803591506001600160401b03821115614a5d575f80fd5b602001915036819003821315614a71575f80fd5b9250929050565b6001600160401b03818116838216028082169190828114614a9b57614a9b614403565b505092915050565b5f6001600160401b0380841680614abc57614abc614682565b92169190910492915050565b5f60208284031215614ad8575f80fd5b8135610ba18161439d565b5f60208284031215614af3575f80fd5b8151610ba18161423e565b5f8251614b0f81846020870161458d565b9190910192915050565b5f60208284031215614b29575f80fd5b813560ff81168114610ba1575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614d5d380380614d5d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614c108061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c806365b3a621116100a95780639e1bc4ef1161006e5780639e1bc4ef14610289578063a3a65e481461029c578063b771b3bc146102af578063bee0a03f146102d5578063fbf50cdb146102e8575f80fd5b806365b3a6211461022a57806366435abf1461023d5780636d0e43fa1461025057806376f786211461026357806398f3e2b414610276575f80fd5b8063162f1f61116100ef578063162f1f61146101b35780632e2194d8146101c6578063467ef06f146101f15780635297fae6146102045780636206585614610217575f80fd5b80630118acc4146101205780630322ed98146101355780630cdd098514610148578063151d30d114610199575b5f80fd5b61013361012e36600461428d565b6102fb565b005b6101336101433660046142c8565b610786565b6101866101563660046142c8565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101a1600a81565b60405160ff9091168152602001610190565b6101336101c13660046142c8565b6108e2565b6101d96101d43660046142c8565b61094f565b6040516001600160401b039091168152602001610190565b6101336101ff3660046142df565b610965565b6101336102123660046142f8565b610990565b610186610225366004614320565b610b81565b610186610238366004614346565b610b9a565b6101d961024b3660046142c8565b610bcd565b61013361025e3660046142c8565b610be1565b61013361027136600461428d565b610c4e565b6101336102843660046142f8565b610d20565b6101866102973660046143a7565b610f50565b6101336102aa3660046142df565b610f5c565b6102bd6005600160991b0181565b6040516001600160a01b039091168152602001610190565b6101336102e33660046142c8565b611119565b6101336102f63660046143db565b6111e8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614b6483398151915291841561034d5761034a82856112cc565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561037f5761037f614419565b600481111561039057610390614419565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561041757610417614419565b146104695760405162461bcd60e51b815260206004820152602a60248201525f80516020614b848339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104ce5760405162461bcd60e51b815260206004820152603360248201525f80516020614b848339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610460565b5f6104d884611568565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561052557610525614419565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105f7856115dc565b905082606001516001600160401b03168160a001516001600160401b03161161066e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610460565b5f83606001518260a001516106839190614441565b905061068f86826116bb565b5f61069b878584611703565b5f8c815260088a01602052604090209091506106b782826144f8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106e49085906004016145d9565b6020604051808303815f875af1158015610700573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610724919061460b565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020614ba48339815191529291906107ce9061447c565b9050118015610800575060035f83815260078301602052604090205460ff1660058111156107fe576107fe614419565b145b6108645760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610460565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161089d9190600401614622565b6020604051808303815f875af11580156108b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108dd919061460b565b505050565b6108eb81611920565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614b64833981519152916005600160991b019163ee5b48eb9161089d91600401614622565b5f61095f64e8d4a51000836146c0565b92915050565b5f61096f826119ef565b905061098c81606001516001600160401b03168260400151611d7c565b5050565b5f80516020614b648339815191525f6109a884611db2565b90505f806109b98360400151611f93565b50915091506109c7856121ce565b5f85815260078501602052604081206109df916141d5565b5f6109e9836115dc565b9050816001600160401b031681608001516001600160401b03161015610a215760405162461bcd60e51b8152600401610460906146d3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a665760405162461bcd60e51b815260040161046090614715565b60015f87815260068701602052604090205460ff166004811115610a8c57610a8c614419565b14610af55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610460565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61095f6001600160401b03831664e8d4a5100061475e565b5f610ba36122a7565b610bae8484846122de565b9050610bc660015f80516020614bc483398151915255565b9392505050565b5f610bd7826115dc565b60a0015192915050565b610bea816121ce565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f80516020614b64833981519152916005600160991b019163ee5b48eb9161089d91600401614622565b5f80516020614b648339815191525f610c66856115dc565b5f86815260058401602052604090206001015460c0820151919250610c93916001600160401b0316614775565b421015610cfe5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610460565b8315610d1057610d0e85846112cc565b505b610d19856124c8565b5050505050565b5f80516020614b648339815191525f610d3884611db2565b90505f80610d498360400151611f93565b5091509150610d5785611920565b5f8581526008850160205260408120610d6f916141d5565b5f610d79836115dc565b9050816001600160401b031681608001516001600160401b03161015610db15760405162461bcd60e51b8152600401610460906146d3565b5f8681526006860160205260409020600301546001600160401b0380841691161115610def5760405162461bcd60e51b815260040161046090614715565b60035f87815260068701602052604090205460ff166004811115610e1557610e15614419565b14610e695760405162461bcd60e51b815260206004820152603160248201525f80516020614b848339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610460565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f0e91611d7c565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610bc6833384612880565b5f80516020614ba48339815191525f610f7483611db2565b90505f80610f858360400151612cb4565b9150915080610fe75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610460565b5f828152600585016020526040812080546110019061447c565b9050118015611033575060015f83815260078601602052604090205460ff16600581111561103157611031614419565b145b61104f5760405162461bcd60e51b815260040161046090614788565b5f8281526005850160205260408120611067916141d5565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614ba48339815191529291906111619061447c565b9050118015611193575060015f83815260078301602052604090205460ff16600581111561119157611191614419565b145b6111af5760405162461bcd60e51b815260040161046090614788565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161089d9190600401614622565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611231575080546001600160401b03808416911610155b1561124f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561127a8484612e55565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611317573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261133e9190810190614832565b91509150806113a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610460565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611408919061460b565b82511461146c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610460565b60208201516001600160a01b0316156114e25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610460565b5f806114f18460400151612e6f565b9150915081871461155e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610460565b9695505050505050565b5f8181525f80516020614be48339815191526020526040812060030180545f80516020614ba4833981519152916001600160401b03909116908190846115ad8361491a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115e461420c565b5f8281525f80516020614be48339815191526020526040908190208151610100810190925280545f80516020614ba4833981519152929190829060ff16600581111561163257611632614419565b600581111561164357611643614419565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614be4833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561177c5761173c81600161493f565b61174790600861475e565b5081515f9083908390811061175e5761175e614952565b60200101906001600160f81b03191690815f1a905350600101611728565b505f5b60048110156117df5761179381600361493f565b61179e90600861475e565b6001901c60f81b826117b1836002614775565b815181106117c1576117c1614952565b60200101906001600160f81b03191690815f1a90535060010161177f565b505f5b6020811015611841576117f681601f61493f565b61180190600861475e565b86901c60f81b82611813836006614775565b8151811061182357611823614952565b60200101906001600160f81b03191690815f1a9053506001016117e2565b505f5b60088110156118ac5761185881600761493f565b61186390600861475e565b6001600160401b038616901c60f81b8261187e836026614775565b8151811061188e5761188e614952565b60200101906001600160f81b03191690815f1a905350600101611844565b505f5b6008811015611917576118c381600761493f565b6118ce90600861475e565b6001600160401b038516901c60f81b826118e983602e614775565b815181106118f9576118f9614952565b60200101906001600160f81b03191690815f1a9053506001016118af565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f80516020614b648339815191529291906119689061447c565b905011801561199a575060035f83815260068301602052604090205460ff16600481111561199857611998614419565b145b61098c5760405162461bcd60e51b815260206004820152603360248201525f80516020614b8483398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610460565b6119f761420c565b5f80516020614ba48339815191525f611a0f84611db2565b90505f80611a208360400151612cb4565b915091508015611a855760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610460565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611ab757611ab7614419565b6005811115611ac857611ac8614419565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b4f57611b4f614419565b1480611b6d5750600182516005811115611b6b57611b6b614419565b145b611bcc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610460565b600382516005811115611be157611be1614419565b03611c0857505f8381526006860160205260408120600491611c0391906141d5565b611c0c565b5060055b6020808301515f90815260088801909152604081205581816005811115611c3557611c35614419565b90816005811115611c4857611c48614419565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611c7c57611c7c614419565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d4757611d47614419565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461098c906001600160a01b03168284613047565b60408051606080820183525f8083526020830181905292820152905f80516020614ba48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e27573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e4e9190810190614832565b9150915080611eb55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610460565b8254825114611f185760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610460565b60208201516001600160a01b031615611f8b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610460565b509392505050565b5f805f8351603614611fb75760405162461bcd60e51b815260040161046090614966565b5f805b600281101561200657611fce81600161493f565b611fd990600861475e565b61ffff16868281518110611fef57611fef614952565b016020015160f81c901b9190911790600101611fba565b5061ffff8116156120295760405162461bcd60e51b8152600401610460906149af565b5f805b60048110156120845761204081600361493f565b61204b90600861475e565b63ffffffff168761205d836002614775565b8151811061206d5761206d614952565b016020015160f81c901b919091179060010161202c565b5063ffffffff81166003146120ab5760405162461bcd60e51b8152600401610460906149f2565b5f805b6020811015612100576120c281601f61493f565b6120cd90600861475e565b886120d9836006614775565b815181106120e9576120e9614952565b016020015160f81c901b91909117906001016120ae565b505f805b600881101561215f5761211881600761493f565b61212390600861475e565b6001600160401b031689612138836026614775565b8151811061214857612148614952565b016020015160f81c901b9190911790600101612104565b505f805b60088110156121be5761217781600761493f565b61218290600861475e565b6001600160401b03168a61219783602e614775565b815181106121a7576121a7614952565b016020015160f81c901b9190911790600101612163565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f80516020614b648339815191529291906122169061447c565b9050118015612248575060015f83815260068301602052604090205460ff16600481111561224657612246614419565b145b61098c5760405162461bcd60e51b815260206004820152603860248201525f80516020614b8483398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610460565b5f80516020614bc48339815191528054600119016122d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614b64833981519152906001600160401b0316602085013510156123855760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610460565b6003810154843510156123ee5760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610460565b80548310801590612403575080600101548311155b6124615760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610460565b5f61246b846130a6565b90505f6124778261094f565b90505f61248488836130dc565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f80516020614bc483398151915255565b5f8181525f80516020614be483398151915260205260408082208151610100810190925280545f80516020614ba483398151915293929190829060ff16600581111561251657612516614419565b600581111561252757612527614419565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156125af576125af614419565b1461260b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610460565b60408101516001600160a01b0316336001600160a01b0316146126855760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610460565b6126928160a001516135a9565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156126d6576126d6614419565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127a28461279c81611568565b5f611703565b5f85815260068501602052604090209091506127be82826144f8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127eb9085906004016145d9565b6020604051808303815f875af1158015612807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061282b919061460b565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6128896122a7565b5f80516020614b648339815191525f6128a46101d4856130a6565b90505f6128b0876115dc565b90506002815160058111156128c7576128c7614419565b146129265760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610460565b5f828260a001516129379190614a39565b60048501546001860154919250612959916001600160401b039091169061475e565b61296282610b81565b11156129ce5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610460565b6129d888826116bb565b5f6129e289611568565b90505f8982604051602001612a0e92919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612a2f856135a9565b5f612a3b8b8486611703565b5f8381526007890160205260409020909150612a5782826144f8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612a849085906004016145d9565b6020604051808303815f875af1158015612aa0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ac4919061460b565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612b7357612b73614419565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610bc660015f80516020614bc483398151915255565b5f808251602714612cd75760405162461bcd60e51b815260040161046090614966565b5f805b6002811015612d2657612cee81600161493f565b612cf990600861475e565b61ffff16858281518110612d0f57612d0f614952565b016020015160f81c901b9190911790600101612cda565b5061ffff811615612d495760405162461bcd60e51b8152600401610460906149af565b5f805b6004811015612da457612d6081600361493f565b612d6b90600861475e565b63ffffffff1686612d7d836002614775565b81518110612d8d57612d8d614952565b016020015160f81c901b9190911790600101612d4c565b5063ffffffff8116600214612dcb5760405162461bcd60e51b8152600401610460906149f2565b5f805b6020811015612e2057612de281601f61493f565b612ded90600861475e565b87612df9836006614775565b81518110612e0957612e09614952565b016020015160f81c901b9190911790600101612dce565b505f86602681518110612e3557612e35614952565b016020015191976001600160f81b03199092161515965090945050505050565b612e5d61374a565b612e6682613795565b61098c816137f3565b5f808251602e14612e925760405162461bcd60e51b815260040161046090614966565b5f805b6002811015612ee157612ea981600161493f565b612eb490600861475e565b61ffff16858281518110612eca57612eca614952565b016020015160f81c901b9190911790600101612e95565b5061ffff811615612f045760405162461bcd60e51b8152600401610460906149af565b5f805b6004811015612f5f57612f1b81600361493f565b612f2690600861475e565b63ffffffff1686612f38836002614775565b81518110612f4857612f48614952565b016020015160f81c901b9190911790600101612f07565b5063ffffffff8116600414612f865760405162461bcd60e51b8152600401610460906149f2565b5f805b6020811015612fdb57612f9d81601f61493f565b612fa890600861475e565b87612fb4836006614775565b81518110612fc457612fc4614952565b016020015160f81c901b9190911790600101612f89565b505f805b600881101561303a57612ff381600761493f565b612ffe90600861475e565b6001600160401b031688613013836026614775565b8151811061302357613023614952565b016020015160f81c901b9190911790600101612fdf565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526108dd91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506138a7565b5f61095f827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613908565b5f5f80516020614ba4833981519152426130fc6040860160208701614320565b6001600160401b0316118015613135575061311d6040850160208601614320565b6001600160401b0316613133426202a300614775565b115b6131975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610460565b83356131ef5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610460565b83355f9081526008820160205260409020541561325f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610460565b61326c6040850185614a59565b90506030146132d35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610460565b6132dc836135a9565b5f806133766040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906133219190614320565b6001600160401b0316815260200161333c60408a018a614a59565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613a6a565b5f8281526005860160205260409020919350915061339482826144f8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906133c19085906004016145d9565b6020604051808303815f875af11580156133dd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613401919061460b565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561348357613483614419565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561354483611568565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961357b60408d0160208e01614320565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614ba48339815191529060ff165f036135e7575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061362f908361493f565b1061364b576001600160401b038416604083015280825261366a565b838260400181815161365d9190614a39565b6001600160401b03169052505b5f8260200151836040015160646136819190614aa2565b61368b9190614acd565b600285015490915060ff90811690821611156137065760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610460565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661379357604051631afcd79f60e31b815260040160405180910390fd5b565b61379d61374a565b6137a681613e0f565b6137f0606082013560808301356137c360c0850160a08601614320565b60c08501356137d9610100870160e08801614320565b6137eb61012088016101008901614af2565b613e30565b50565b6137fb61374a565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166138875760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610460565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6138bb6001600160a01b03841683613fe9565b905080515f141580156138df5750808060200190518101906138dd9190614b0d565b155b156108dd57604051635274afe760e01b81526001600160a01b0384166004820152602401610460565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561394e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613972919061460b565b90506139896001600160a01b038516333086613ff6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139f1919061460b565b9050818111613a575760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610460565b613a61828261493f565b95945050505050565b5f6060826080015151603014613ad45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610460565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613b4b57613b0b81600161493f565b613b1690600861475e565b5081515f90839083908110613b2d57613b2d614952565b60200101906001600160f81b03191690815f1a905350600101613af7565b505f5b6004811015613ba957613b6281600361493f565b613b6d90600861475e565b505f82613b7b836002614775565b81518110613b8b57613b8b614952565b60200101906001600160f81b03191690815f1a905350600101613b4e565b505f5b6020811015613c065784518160208110613bc857613bc8614952565b1a60f81b82613bd8836006614775565b81518110613be857613be8614952565b60200101906001600160f81b03191690815f1a905350600101613bac565b505f5b6020811015613c665784602001518160208110613c2857613c28614952565b1a60f81b82613c38836026614775565b81518110613c4857613c48614952565b60200101906001600160f81b03191690815f1a905350600101613c09565b505f5b6008811015613cda57613c7d81600761493f565b613c8890600861475e565b60ff1685604001516001600160401b0316901c60f81b82826046613cac9190614775565b81518110613cbc57613cbc614952565b60200101906001600160f81b03191690815f1a905350600101613c69565b505f5b6030811015613d455784608001518181518110613cfc57613cfc614952565b01602001516001600160f81b03191682613d1783604e614775565b81518110613d2757613d27614952565b60200101906001600160f81b03191690815f1a905350600101613cdd565b505f5b6008811015613db757613d5c81600761493f565b613d6790600861475e565b60608601516001600160401b0390811691161c60f81b82613d8983607e614775565b81518110613d9957613d99614952565b60200101906001600160f81b03191690815f1a905350600101613d48565b50600281604051613dc89190614b28565b602060405180830381855afa158015613de3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613e06919061460b565b94909350915050565b613e1761374a565b613e1f614035565b613e27614045565b6137f08161404d565b613e3861374a565b5f80516020614b6483398151915283613ea45760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610460565b85871115613f0c5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610460565b600a6001600160401b0384161115613f845760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610460565b95865560018601949094556002850180546001600160401b0394851667ffffffffffffffff199091161790556003850191909155600490930180546001600160a01b03909316600160401b026001600160e01b03199093169390911692909217179055565b6060610bc683835f6140b9565b6040516001600160a01b03848116602483015283811660448301526064820183905261402f9186918216906323b872dd90608401613074565b50505050565b61403d61374a565b613793614148565b61379361374a565b61405561374a565b80355f80516020614ba483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561409f6060830160408401614b43565b600291909101805460ff191660ff90921691909117905550565b6060814710156140de5760405163cd78605960e01b8152306004820152602401610460565b5f80856001600160a01b031684866040516140f99190614b28565b5f6040518083038185875af1925050503d805f8114614133576040519150601f19603f3d011682016040523d82523d5f602084013e614138565b606091505b509150915061155e868383614150565b6124b561374a565b60608261416557614160826141ac565b610bc6565b815115801561417c57506001600160a01b0384163b155b156141a557604051639996b31560e01b81526001600160a01b0385166004820152602401610460565b5080610bc6565b8051156141bc5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546141e19061447c565b5f825580601f106141f0575050565b601f0160209004905f5260205f20908101906137f09190614250565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614264575f8155600101614251565b5090565b80151581146137f0575f80fd5b803563ffffffff81168114614288575f80fd5b919050565b5f805f6060848603121561429f575f80fd5b8335925060208401356142b181614268565b91506142bf60408501614275565b90509250925092565b5f602082840312156142d8575f80fd5b5035919050565b5f602082840312156142ef575f80fd5b610bc682614275565b5f8060408385031215614309575f80fd5b61431283614275565b946020939093013593505050565b5f60208284031215614330575f80fd5b81356001600160401b0381168114610bc6575f80fd5b5f805f8385036080811215614359575f80fd5b84356001600160401b0381111561436e575f80fd5b85016060818803121561437f575f80fd5b93506040601f1982011215614392575f80fd5b50602084019150606084013590509250925092565b5f80604083850312156143b8575f80fd5b50508035926020909101359150565b6001600160a01b03811681146137f0575f80fd5b5f808284036101408112156143ee575f80fd5b610120808212156143fd575f80fd5b849350830135905061440e816143c7565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144615761446161442d565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061449057607f821691505b6020821081036144ae57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108dd57805f5260205f20601f840160051c810160208510156144d95750805b601f840160051c820191505b81811015610d19575f81556001016144e5565b81516001600160401b0381111561451157614511614468565b6145258161451f845461447c565b846144b4565b602080601f831160018114614558575f84156145415750858301515b5f19600386901b1c1916600185901b1785556145af565b5f85815260208120601f198616915b8281101561458657888601518255948401946001909101908401614567565b50858210156145a357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156145d15781810151838201526020016145b9565b50505f910152565b602081525f82518060208401526145f78160408501602087016145b7565b601f01601f19169190910160400192915050565b5f6020828403121561461b575f80fd5b5051919050565b5f60208083525f84546146348161447c565b806020870152604060018084165f811461465557600181146146715761469e565b60ff19851660408a0152604084151560051b8a0101955061469e565b895f5260205f205f5b858110156146955781548b820186015290830190880161467a565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826146ce576146ce6146ac565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761095f5761095f61442d565b8082018082111561095f5761095f61442d565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b03811182821017156147f1576147f1614468565b60405290565b604051601f8201601f191681016001600160401b038111828210171561481f5761481f614468565b604052919050565b805161428881614268565b5f8060408385031215614843575f80fd5b82516001600160401b0380821115614859575f80fd5b908401906060828703121561486c575f80fd5b6148746147cf565b82518152602080840151614887816143c7565b8282015260408401518381111561489c575f80fd5b80850194505087601f8501126148b0575f80fd5b8351838111156148c2576148c2614468565b6148d4601f8201601f191683016147f7565b935080845288828287010111156148e9575f80fd5b6148f8818386018488016145b7565b5082604083015281955061490d818801614827565b9450505050509250929050565b5f6001600160401b038083168181036149355761493561442d565b6001019392505050565b8181038181111561095f5761095f61442d565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156144615761446161442d565b5f808335601e19843603018112614a6e575f80fd5b8301803591506001600160401b03821115614a87575f80fd5b602001915036819003821315614a9b575f80fd5b9250929050565b6001600160401b03818116838216028082169190828114614ac557614ac561442d565b505092915050565b5f6001600160401b0380841680614ae657614ae66146ac565b92169190910492915050565b5f60208284031215614b02575f80fd5b8135610bc6816143c7565b5f60208284031215614b1d575f80fd5b8151610bc681614268565b5f8251614b398184602087016145b7565b9190910192915050565b5f60208284031215614b53575f80fd5b813560ff81168114610bc6575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -233,6 +233,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorRaw) Transact return _ERC20TokenStakingManager.Contract.contract.Transact(opts, method, params...) } +// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. +// +// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMSTAKEMULTIPLIERLIMIT(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_STAKE_MULTIPLIER_LIMIT") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. +// +// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMSTAKEMULTIPLIERLIMIT() (uint8, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. +// +// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMSTAKEMULTIPLIERLIMIT() (uint8, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_ERC20TokenStakingManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 8bd7fd291..a5ad21469 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -62,8 +62,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161495d38038061495d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148108061014d5f395ff3fe608060405260043610610105575f3560e01c806366435abf11610092578063a3a65e4811610062578063a3a65e48146102e8578063b771b3bc14610307578063bee0a03f14610339578063c599e24f14610358578063dac806231461036b575f80fd5b806366435abf1461026c5780636d0e43fa1461028b57806376f78621146102aa57806398f3e2b4146102c9575f80fd5b8063162f1f61116100d8578063162f1f61146101b95780632e2194d8146101d8578063467ef06f1461020f5780635297fae61461022e578063620658561461024d575f80fd5b80630118acc4146101095780630322ed981461012a5780630cdd098514610149578063104595c4146101a6575b5f80fd5b348015610114575f80fd5b50610128610123366004613efd565b61038a565b005b348015610135575f80fd5b50610128610144366004613f38565b610815565b348015610154575f80fd5b50610193610163366004613f38565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101936101b4366004613f4f565b610971565b3480156101c4575f80fd5b506101286101d3366004613f38565b6109a3565b3480156101e3575f80fd5b506101f76101f2366004613f38565b610a10565b6040516001600160401b03909116815260200161019d565b34801561021a575f80fd5b50610128610229366004613fa8565b610a20565b348015610239575f80fd5b50610128610248366004613fc1565b610a4b565b348015610258575f80fd5b50610193610267366004613fe9565b610c3c565b348015610277575f80fd5b506101f7610286366004613f38565b610c55565b348015610296575f80fd5b506101286102a5366004613f38565b610c69565b3480156102b5575f80fd5b506101286102c4366004613efd565b610cd6565b3480156102d4575f80fd5b506101286102e3366004613fc1565b610da8565b3480156102f3575f80fd5b50610128610302366004613fa8565b610fd8565b348015610312575f80fd5b506103216005600160991b0181565b6040516001600160a01b03909116815260200161019d565b348015610344575f80fd5b50610128610353366004613f38565b611195565b610193610366366004613f38565b611264565b348015610376575f80fd5b5061012861038536600461400f565b611270565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206147648339815191529184156103dc576103d98285611352565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561040e5761040e614026565b600481111561041f5761041f614026565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104a6576104a6614026565b146104f85760405162461bcd60e51b815260206004820152602a60248201525f805160206147848339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461055d5760405162461bcd60e51b815260206004820152603360248201525f805160206147848339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ef565b5f610567846115ee565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105b4576105b4614026565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61068685611662565b905082606001516001600160401b03168160a001516001600160401b0316116106fd5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104ef565b5f83606001518260a00151610712919061404e565b905061071e8682611741565b5f61072a878584611789565b5f8c815260088a016020526040902090915061074682826140ff565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906107739085906004016141e0565b6020604051808303815f875af115801561078f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b39190614212565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206147a483398151915292919061085d90614089565b905011801561088f575060035f83815260078301602052604090205460ff16600581111561088d5761088d614026565b145b6108f35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ef565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401614229565b6020604051808303815f875af1158015610948573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096c9190614212565b505050565b5f61097a6119a8565b6109858383346119df565b905061099d60015f805160206147c483398151915255565b92915050565b6109ac81611bbe565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614764833981519152916005600160991b019163ee5b48eb9161092c91600401614229565b5f61099d64e8d4a51000836142c7565b5f610a2a82611c8d565b9050610a4781606001516001600160401b0316826040015161201a565b5050565b5f805160206147648339815191525f610a638461202d565b90505f80610a74836040015161220e565b5091509150610a8285612449565b5f8581526007850160205260408120610a9a91613e45565b5f610aa483611662565b9050816001600160401b031681608001516001600160401b03161015610adc5760405162461bcd60e51b81526004016104ef906142da565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b215760405162461bcd60e51b81526004016104ef9061431c565b60015f87815260068701602052604090205460ff166004811115610b4757610b47614026565b14610bb05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ef565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61099d6001600160401b03831664e8d4a51000614365565b5f610c5f82611662565b60a0015192915050565b610c7281612449565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f80516020614764833981519152916005600160991b019163ee5b48eb9161092c91600401614229565b5f805160206147648339815191525f610cee85611662565b5f86815260058401602052604090206001015460c0820151919250610d1b916001600160401b031661437c565b421015610d865760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104ef565b8315610d9857610d968584611352565b505b610da185612522565b5050505050565b5f805160206147648339815191525f610dc08461202d565b90505f80610dd1836040015161220e565b5091509150610ddf85611bbe565b5f8581526008850160205260408120610df791613e45565b5f610e0183611662565b9050816001600160401b031681608001516001600160401b03161015610e395760405162461bcd60e51b81526004016104ef906142da565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e775760405162461bcd60e51b81526004016104ef9061431c565b60035f87815260068701602052604090205460ff166004811115610e9d57610e9d614026565b14610ef15760405162461bcd60e51b815260206004820152603160248201525f805160206147848339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ef565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f969161201a565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206147a48339815191525f610ff08361202d565b90505f8061100183604001516128da565b91509150806110635760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ef565b5f8281526005850160205260408120805461107d90614089565b90501180156110af575060015f83815260078601602052604090205460ff1660058111156110ad576110ad614026565b145b6110cb5760405162461bcd60e51b81526004016104ef9061438f565b5f82815260058501602052604081206110e391613e45565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147a48339815191529291906111dd90614089565b905011801561120f575060015f83815260078301602052604090205460ff16600581111561120d5761120d614026565b145b61122b5760405162461bcd60e51b81526004016104ef9061438f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161092c9190600401614229565b5f61099d823334612a7b565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806112b9575080546001600160401b03808416911610155b156112d75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561130183612eac565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561139d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113c4919081019061444d565b91509150806114275760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ef565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561146a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061148e9190614212565b8251146114f25760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ef565b60208201516001600160a01b0316156115685760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ef565b5f806115778460400151612ec0565b915091508187146115e45760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ef565b9695505050505050565b5f8181525f805160206147e48339815191526020526040812060030180545f805160206147a4833981519152916001600160401b039091169081908461163383614535565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61166a613e7c565b5f8281525f805160206147e48339815191526020526040908190208151610100810190925280545f805160206147a4833981519152929190829060ff1660058111156116b8576116b8614026565b60058111156116c9576116c9614026565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206147e4833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611802576117c281600161455a565b6117cd906008614365565b5081515f908390839081106117e4576117e461456d565b60200101906001600160f81b03191690815f1a9053506001016117ae565b505f5b60048110156118655761181981600361455a565b611824906008614365565b6001901c60f81b8261183783600261437c565b815181106118475761184761456d565b60200101906001600160f81b03191690815f1a905350600101611805565b505f5b60208110156118c75761187c81601f61455a565b611887906008614365565b86901c60f81b8261189983600661437c565b815181106118a9576118a961456d565b60200101906001600160f81b03191690815f1a905350600101611868565b505f5b6008811015611932576118de81600761455a565b6118e9906008614365565b6001600160401b038616901c60f81b8261190483602661437c565b815181106119145761191461456d565b60200101906001600160f81b03191690815f1a9053506001016118ca565b505f5b600881101561199d5761194981600761455a565b611954906008614365565b6001600160401b038516901c60f81b8261196f83602e61437c565b8151811061197f5761197f61456d565b60200101906001600160f81b03191690815f1a905350600101611935565b5090505b9392505050565b5f805160206147c48339815191528054600119016119d957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614764833981519152906001600160401b031660208501351015611a865760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104ef565b600381015484351015611aef5760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016104ef565b80548310801590611b04575080600101548311155b611b625760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104ef565b825f611b6d82610a10565b90505f611b7a8883613098565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f805160206147c483398151915255565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f80516020614764833981519152929190611c0690614089565b9050118015611c38575060035f83815260068301602052604090205460ff166004811115611c3657611c36614026565b145b610a475760405162461bcd60e51b815260206004820152603360248201525f8051602061478483398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b60648201526084016104ef565b611c95613e7c565b5f805160206147a48339815191525f611cad8461202d565b90505f80611cbe83604001516128da565b915091508015611d235760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ef565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611d5557611d55614026565b6005811115611d6657611d66614026565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ded57611ded614026565b1480611e0b5750600182516005811115611e0957611e09614026565b145b611e6a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ef565b600382516005811115611e7f57611e7f614026565b03611ea657505f8381526006860160205260408120600491611ea19190613e45565b611eaa565b5060055b6020808301515f90815260088801909152604081205581816005811115611ed357611ed3614026565b90816005811115611ee657611ee6614026565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611f1a57611f1a614026565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611fe557611fe5614026565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a476001600160a01b03821683613565565b60408051606080820183525f8083526020830181905292820152905f805160206147a48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120a2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120c9919081019061444d565b91509150806121305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ef565b82548251146121935760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ef565b60208201516001600160a01b0316156122065760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ef565b509392505050565b5f805f83516036146122325760405162461bcd60e51b81526004016104ef90614581565b5f805b60028110156122815761224981600161455a565b612254906008614365565b61ffff1686828151811061226a5761226a61456d565b016020015160f81c901b9190911790600101612235565b5061ffff8116156122a45760405162461bcd60e51b81526004016104ef906145ca565b5f805b60048110156122ff576122bb81600361455a565b6122c6906008614365565b63ffffffff16876122d883600261437c565b815181106122e8576122e861456d565b016020015160f81c901b91909117906001016122a7565b5063ffffffff81166003146123265760405162461bcd60e51b81526004016104ef9061460d565b5f805b602081101561237b5761233d81601f61455a565b612348906008614365565b8861235483600661437c565b815181106123645761236461456d565b016020015160f81c901b9190911790600101612329565b505f805b60088110156123da5761239381600761455a565b61239e906008614365565b6001600160401b0316896123b383602661437c565b815181106123c3576123c361456d565b016020015160f81c901b919091179060010161237f565b505f805b6008811015612439576123f281600761455a565b6123fd906008614365565b6001600160401b03168a61241283602e61437c565b815181106124225761242261456d565b016020015160f81c901b91909117906001016123de565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f8051602061476483398151915292919061249190614089565b90501180156124c3575060015f83815260068301602052604090205460ff1660048111156124c1576124c1614026565b145b610a475760405162461bcd60e51b815260206004820152603860248201525f8051602061478483398151915260448201527f726567697374726174696f6e206e6f742070656e64696e67000000000000000060648201526084016104ef565b5f8181525f805160206147e483398151915260205260408082208151610100810190925280545f805160206147a483398151915293929190829060ff16600581111561257057612570614026565b600581111561258157612581614026565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561260957612609614026565b146126655760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ef565b60408101516001600160a01b0316336001600160a01b0316146126df5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ef565b6126ec8160a001516135f8565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561273057612730614026565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127fc846127f6816115ee565b5f611789565b5f858152600685016020526040902090915061281882826140ff565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128459085906004016141e0565b6020604051808303815f875af1158015612861573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128859190614212565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146128fd5760405162461bcd60e51b81526004016104ef90614581565b5f805b600281101561294c5761291481600161455a565b61291f906008614365565b61ffff168582815181106129355761293561456d565b016020015160f81c901b9190911790600101612900565b5061ffff81161561296f5760405162461bcd60e51b81526004016104ef906145ca565b5f805b60048110156129ca5761298681600361455a565b612991906008614365565b63ffffffff16866129a383600261437c565b815181106129b3576129b361456d565b016020015160f81c901b9190911790600101612972565b5063ffffffff81166002146129f15760405162461bcd60e51b81526004016104ef9061460d565b5f805b6020811015612a4657612a0881601f61455a565b612a13906008614365565b87612a1f83600661437c565b81518110612a2f57612a2f61456d565b016020015160f81c901b91909117906001016129f4565b505f86602681518110612a5b57612a5b61456d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612a846119a8565b5f805160206147648339815191525f612a9c84610a10565b90505f612aa887611662565b9050600281516005811115612abf57612abf614026565b14612b1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ef565b5f828260a00151612b2f9190614654565b60048501546001860154919250612b51916001600160401b0390911690614365565b612b5a82610c3c565b1115612bc65760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104ef565b612bd08882611741565b5f612bda896115ee565b90505f8982604051602001612c0692919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612c27856135f8565b5f612c338b8486611789565b5f8381526007890160205260409020909150612c4f82826140ff565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612c7c9085906004016141e0565b6020604051808303815f875af1158015612c98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cbc9190614212565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d6b57612d6b614026565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506119a160015f805160206147c483398151915255565b612eb4613799565b612ebd816137e4565b50565b5f808251602e14612ee35760405162461bcd60e51b81526004016104ef90614581565b5f805b6002811015612f3257612efa81600161455a565b612f05906008614365565b61ffff16858281518110612f1b57612f1b61456d565b016020015160f81c901b9190911790600101612ee6565b5061ffff811615612f555760405162461bcd60e51b81526004016104ef906145ca565b5f805b6004811015612fb057612f6c81600361455a565b612f77906008614365565b63ffffffff1686612f8983600261437c565b81518110612f9957612f9961456d565b016020015160f81c901b9190911790600101612f58565b5063ffffffff8116600414612fd75760405162461bcd60e51b81526004016104ef9061460d565b5f805b602081101561302c57612fee81601f61455a565b612ff9906008614365565b8761300583600661437c565b815181106130155761301561456d565b016020015160f81c901b9190911790600101612fda565b505f805b600881101561308b5761304481600761455a565b61304f906008614365565b6001600160401b03168861306483602661437c565b815181106130745761307461456d565b016020015160f81c901b9190911790600101613030565b5090969095509350505050565b5f5f805160206147a4833981519152426130b86040860160208701613fe9565b6001600160401b03161180156130f157506130d96040850160208601613fe9565b6001600160401b03166130ef426202a30061437c565b115b6131535760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104ef565b83356131ab5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ef565b83355f9081526008820160205260409020541561321b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ef565b6132286040850185614674565b905060301461328f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ef565b613298836135f8565b5f806133326040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906132dd9190613fe9565b6001600160401b031681526020016132f860408a018a614674565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061383f565b5f8281526005860160205260409020919350915061335082826140ff565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061337d9085906004016141e0565b6020604051808303815f875af1158015613399573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133bd9190614212565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561343f5761343f614026565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055613500836115ee565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961353760408d0160208e01613fe9565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156135885760405163cd78605960e01b81523060048201526024016104ef565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146135d1576040519150601f19603f3d011682016040523d82523d5f602084013e6135d6565b606091505b505090508061096c57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147a48339815191529060ff165f03613636575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061367e908361455a565b1061369a576001600160401b03841660408301528082526136b9565b83826040018181516136ac9190614654565b6001600160401b03169052505b5f8260200151836040015160646136d091906146bd565b6136da91906146e8565b600285015490915060ff90811690821611156137555760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104ef565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166137e257604051631afcd79f60e31b815260040160405180910390fd5b565b6137ec613799565b6137f581613be4565b612ebd6060820135608083013561381260c0850160a08601613fe9565b60c0850135613828610100870160e08801613fe9565b61383a6101208801610100890161470d565b613c05565b5f60608260800151516030146138a95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ef565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613920576138e081600161455a565b6138eb906008614365565b5081515f908390839081106139025761390261456d565b60200101906001600160f81b03191690815f1a9053506001016138cc565b505f5b600481101561397e5761393781600361455a565b613942906008614365565b505f8261395083600261437c565b815181106139605761396061456d565b60200101906001600160f81b03191690815f1a905350600101613923565b505f5b60208110156139db578451816020811061399d5761399d61456d565b1a60f81b826139ad83600661437c565b815181106139bd576139bd61456d565b60200101906001600160f81b03191690815f1a905350600101613981565b505f5b6020811015613a3b57846020015181602081106139fd576139fd61456d565b1a60f81b82613a0d83602661437c565b81518110613a1d57613a1d61456d565b60200101906001600160f81b03191690815f1a9053506001016139de565b505f5b6008811015613aaf57613a5281600761455a565b613a5d906008614365565b60ff1685604001516001600160401b0316901c60f81b82826046613a81919061437c565b81518110613a9157613a9161456d565b60200101906001600160f81b03191690815f1a905350600101613a3e565b505f5b6030811015613b1a5784608001518181518110613ad157613ad161456d565b01602001516001600160f81b03191682613aec83604e61437c565b81518110613afc57613afc61456d565b60200101906001600160f81b03191690815f1a905350600101613ab2565b505f5b6008811015613b8c57613b3181600761455a565b613b3c906008614365565b60608601516001600160401b0390811691161c60f81b82613b5e83607e61437c565b81518110613b6e57613b6e61456d565b60200101906001600160f81b03191690815f1a905350600101613b1d565b50600281604051613b9d9190614728565b602060405180830381855afa158015613bb8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613bdb9190614212565b94909350915050565b613bec613799565b613bf4613db9565b613bfc613dc9565b612ebd81613dd1565b613c0d613799565b5f8051602061476483398151915283613c795760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104ef565b85871115613ce15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104ef565b5f836001600160401b031611613d545760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104ef565b95865560018601949094556002850180546001600160401b0394851667ffffffffffffffff199091161790556003850191909155600490930180546001600160a01b03909316600160401b026001600160e01b03199093169390911692909217179055565b613dc1613799565b6137e2613e3d565b6137e2613799565b613dd9613799565b80355f805160206147a483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e236060830160408401614743565b600291909101805460ff191660ff90921691909117905550565b611bab613799565b508054613e5190614089565b5f825580601f10613e60575050565b601f0160209004905f5260205f2090810190612ebd9190613ec0565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613ed4575f8155600101613ec1565b5090565b8015158114612ebd575f80fd5b803563ffffffff81168114613ef8575f80fd5b919050565b5f805f60608486031215613f0f575f80fd5b833592506020840135613f2181613ed8565b9150613f2f60408501613ee5565b90509250925092565b5f60208284031215613f48575f80fd5b5035919050565b5f808284036060811215613f61575f80fd5b83356001600160401b03811115613f76575f80fd5b840160608187031215613f87575f80fd5b92506040601f1982011215613f9a575f80fd5b506020830190509250929050565b5f60208284031215613fb8575f80fd5b6119a182613ee5565b5f8060408385031215613fd2575f80fd5b613fdb83613ee5565b946020939093013593505050565b5f60208284031215613ff9575f80fd5b81356001600160401b03811681146119a1575f80fd5b5f6101208284031215614020575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561406e5761406e61403a565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061409d57607f821691505b60208210810361402057634e487b7160e01b5f52602260045260245ffd5b601f82111561096c57805f5260205f20601f840160051c810160208510156140e05750805b601f840160051c820191505b81811015610da1575f81556001016140ec565b81516001600160401b0381111561411857614118614075565b61412c816141268454614089565b846140bb565b602080601f83116001811461415f575f84156141485750858301515b5f19600386901b1c1916600185901b1785556141b6565b5f85815260208120601f198616915b8281101561418d5788860151825594840194600190910190840161416e565b50858210156141aa57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156141d85781810151838201526020016141c0565b50505f910152565b602081525f82518060208401526141fe8160408501602087016141be565b601f01601f19169190910160400192915050565b5f60208284031215614222575f80fd5b5051919050565b5f60208083525f845461423b81614089565b806020870152604060018084165f811461425c5760018114614278576142a5565b60ff19851660408a0152604084151560051b8a010195506142a5565b895f5260205f205f5b8581101561429c5781548b8201860152908301908801614281565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826142d5576142d56142b3565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761099d5761099d61403a565b8082018082111561099d5761099d61403a565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b03811182821017156143f8576143f8614075565b60405290565b604051601f8201601f191681016001600160401b038111828210171561442657614426614075565b604052919050565b6001600160a01b0381168114612ebd575f80fd5b8051613ef881613ed8565b5f806040838503121561445e575f80fd5b82516001600160401b0380821115614474575f80fd5b9084019060608287031215614487575f80fd5b61448f6143d6565b825181526020808401516144a28161442e565b828201526040840151838111156144b7575f80fd5b80850194505087601f8501126144cb575f80fd5b8351838111156144dd576144dd614075565b6144ef601f8201601f191683016143fe565b93508084528882828701011115614504575f80fd5b614513818386018488016141be565b50826040830152819550614528818801614442565b9450505050509250929050565b5f6001600160401b038083168181036145505761455061403a565b6001019392505050565b8181038181111561099d5761099d61403a565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561406e5761406e61403a565b5f808335601e19843603018112614689575f80fd5b8301803591506001600160401b038211156146a2575f80fd5b6020019150368190038213156146b6575f80fd5b9250929050565b6001600160401b038181168382160280821691908281146146e0576146e061403a565b505092915050565b5f6001600160401b0380841680614701576147016142b3565b92169190910492915050565b5f6020828403121561471d575f80fd5b81356119a18161442e565b5f82516147398184602087016141be565b9190910192915050565b5f60208284031215614753575f80fd5b813560ff811681146119a1575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161499338038061499383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148468061014d5f395ff3fe608060405260043610610110575f3560e01c8063620658561161009d578063a3a65e4811610062578063a3a65e4814610319578063b771b3bc14610338578063bee0a03f1461036a578063c599e24f14610389578063dac806231461039c575f80fd5b8063620658561461027e57806366435abf1461029d5780636d0e43fa146102bc57806376f78621146102db57806398f3e2b4146102fa575f80fd5b8063151d30d1116100e3578063151d30d1146101c4578063162f1f61146101ea5780632e2194d814610209578063467ef06f146102405780635297fae61461025f575f80fd5b80630118acc4146101145780630322ed98146101355780630cdd098514610154578063104595c4146101b1575b5f80fd5b34801561011f575f80fd5b5061013361012e366004613f33565b6103bb565b005b348015610140575f80fd5b5061013361014f366004613f6e565b610846565b34801561015f575f80fd5b5061019e61016e366004613f6e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61019e6101bf366004613f85565b6109a2565b3480156101cf575f80fd5b506101d8600a81565b60405160ff90911681526020016101a8565b3480156101f5575f80fd5b50610133610204366004613f6e565b6109d4565b348015610214575f80fd5b50610228610223366004613f6e565b610a41565b6040516001600160401b0390911681526020016101a8565b34801561024b575f80fd5b5061013361025a366004613fde565b610a51565b34801561026a575f80fd5b50610133610279366004613ff7565b610a7c565b348015610289575f80fd5b5061019e61029836600461401f565b610c6d565b3480156102a8575f80fd5b506102286102b7366004613f6e565b610c86565b3480156102c7575f80fd5b506101336102d6366004613f6e565b610c9a565b3480156102e6575f80fd5b506101336102f5366004613f33565b610d07565b348015610305575f80fd5b50610133610314366004613ff7565b610dd9565b348015610324575f80fd5b50610133610333366004613fde565b611009565b348015610343575f80fd5b506103526005600160991b0181565b6040516001600160a01b0390911681526020016101a8565b348015610375575f80fd5b50610133610384366004613f6e565b6111c6565b61019e610397366004613f6e565b611295565b3480156103a7575f80fd5b506101336103b6366004614045565b6112a1565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061479a83398151915291841561040d5761040a8285611383565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561043f5761043f61405c565b60048111156104505761045061405c565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104d7576104d761405c565b146105295760405162461bcd60e51b815260206004820152602a60248201525f805160206147ba8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461058e5760405162461bcd60e51b815260206004820152603360248201525f805160206147ba8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610520565b5f6105988461161f565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105e5576105e561405c565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106b785611693565b905082606001516001600160401b03168160a001516001600160401b03161161072e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610520565b5f83606001518260a001516107439190614084565b905061074f8682611772565b5f61075b8785846117ba565b5f8c815260088a01602052604090209091506107778282614135565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906107a4908590600401614216565b6020604051808303815f875af11580156107c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e49190614248565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206147da83398151915292919061088e906140bf565b90501180156108c0575060035f83815260078301602052604090205460ff1660058111156108be576108be61405c565b145b6109245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610520565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161095d919060040161425f565b6020604051808303815f875af1158015610979573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099d9190614248565b505050565b5f6109ab6119d9565b6109b6838334611a10565b90506109ce60015f805160206147fa83398151915255565b92915050565b6109dd81611bef565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f8051602061479a833981519152916005600160991b019163ee5b48eb9161095d9160040161425f565b5f6109ce64e8d4a51000836142fd565b5f610a5b82611cbe565b9050610a7881606001516001600160401b0316826040015161204b565b5050565b5f8051602061479a8339815191525f610a948461205e565b90505f80610aa5836040015161223f565b5091509150610ab38561247a565b5f8581526007850160205260408120610acb91613e7b565b5f610ad583611693565b9050816001600160401b031681608001516001600160401b03161015610b0d5760405162461bcd60e51b815260040161052090614310565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b525760405162461bcd60e51b815260040161052090614352565b60015f87815260068701602052604090205460ff166004811115610b7857610b7861405c565b14610be15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610520565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109ce6001600160401b03831664e8d4a5100061439b565b5f610c9082611693565b60a0015192915050565b610ca38161247a565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f8051602061479a833981519152916005600160991b019163ee5b48eb9161095d9160040161425f565b5f8051602061479a8339815191525f610d1f85611693565b5f86815260058401602052604090206001015460c0820151919250610d4c916001600160401b03166143b2565b421015610db75760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610520565b8315610dc957610dc78584611383565b505b610dd285612553565b5050505050565b5f8051602061479a8339815191525f610df18461205e565b90505f80610e02836040015161223f565b5091509150610e1085611bef565b5f8581526008850160205260408120610e2891613e7b565b5f610e3283611693565b9050816001600160401b031681608001516001600160401b03161015610e6a5760405162461bcd60e51b815260040161052090614310565b5f8681526006860160205260409020600301546001600160401b0380841691161115610ea85760405162461bcd60e51b815260040161052090614352565b60035f87815260068701602052604090205460ff166004811115610ece57610ece61405c565b14610f225760405162461bcd60e51b815260206004820152603160248201525f805160206147ba8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610520565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610fc79161204b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206147da8339815191525f6110218361205e565b90505f80611032836040015161290b565b91509150806110945760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610520565b5f828152600585016020526040812080546110ae906140bf565b90501180156110e0575060015f83815260078601602052604090205460ff1660058111156110de576110de61405c565b145b6110fc5760405162461bcd60e51b8152600401610520906143c5565b5f828152600585016020526040812061111491613e7b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147da83398151915292919061120e906140bf565b9050118015611240575060015f83815260078301602052604090205460ff16600581111561123e5761123e61405c565b145b61125c5760405162461bcd60e51b8152600401610520906143c5565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161095d919060040161425f565b5f6109ce823334612aac565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806112ea575080546001600160401b03808416911610155b156113085760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561133283612edd565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113ce573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113f59190810190614483565b91509150806114585760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610520565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561149b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114bf9190614248565b8251146115235760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610520565b60208201516001600160a01b0316156115995760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610520565b5f806115a88460400151612ef1565b915091508187146116155760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610520565b9695505050505050565b5f8181525f8051602061481a8339815191526020526040812060030180545f805160206147da833981519152916001600160401b03909116908190846116648361456b565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61169b613eb2565b5f8281525f8051602061481a8339815191526020526040908190208151610100810190925280545f805160206147da833981519152929190829060ff1660058111156116e9576116e961405c565b60058111156116fa576116fa61405c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061481a833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611833576117f3816001614590565b6117fe90600861439b565b5081515f90839083908110611815576118156145a3565b60200101906001600160f81b03191690815f1a9053506001016117df565b505f5b60048110156118965761184a816003614590565b61185590600861439b565b6001901c60f81b826118688360026143b2565b81518110611878576118786145a3565b60200101906001600160f81b03191690815f1a905350600101611836565b505f5b60208110156118f8576118ad81601f614590565b6118b890600861439b565b86901c60f81b826118ca8360066143b2565b815181106118da576118da6145a3565b60200101906001600160f81b03191690815f1a905350600101611899565b505f5b60088110156119635761190f816007614590565b61191a90600861439b565b6001600160401b038616901c60f81b826119358360266143b2565b81518110611945576119456145a3565b60200101906001600160f81b03191690815f1a9053506001016118fb565b505f5b60088110156119ce5761197a816007614590565b61198590600861439b565b6001600160401b038516901c60f81b826119a083602e6143b2565b815181106119b0576119b06145a3565b60200101906001600160f81b03191690815f1a905350600101611966565b5090505b9392505050565b5f805160206147fa833981519152805460011901611a0a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061479a833981519152906001600160401b031660208501351015611ab75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610520565b600381015484351015611b205760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610520565b80548310801590611b35575080600101548311155b611b935760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610520565b825f611b9e82610a41565b90505f611bab88836130c9565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f805160206147fa83398151915255565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f8051602061479a833981519152929190611c37906140bf565b9050118015611c69575060035f83815260068301602052604090205460ff166004811115611c6757611c6761405c565b145b610a785760405162461bcd60e51b815260206004820152603360248201525f805160206147ba83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610520565b611cc6613eb2565b5f805160206147da8339815191525f611cde8461205e565b90505f80611cef836040015161290b565b915091508015611d545760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610520565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611d8657611d8661405c565b6005811115611d9757611d9761405c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611e1e57611e1e61405c565b1480611e3c5750600182516005811115611e3a57611e3a61405c565b145b611e9b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610520565b600382516005811115611eb057611eb061405c565b03611ed757505f8381526006860160205260408120600491611ed29190613e7b565b611edb565b5060055b6020808301515f90815260088801909152604081205581816005811115611f0457611f0461405c565b90816005811115611f1757611f1761405c565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611f4b57611f4b61405c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156120165761201661405c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a786001600160a01b03821683613596565b60408051606080820183525f8083526020830181905292820152905f805160206147da8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120d3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120fa9190810190614483565b91509150806121615760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610520565b82548251146121c45760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610520565b60208201516001600160a01b0316156122375760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610520565b509392505050565b5f805f83516036146122635760405162461bcd60e51b8152600401610520906145b7565b5f805b60028110156122b25761227a816001614590565b61228590600861439b565b61ffff1686828151811061229b5761229b6145a3565b016020015160f81c901b9190911790600101612266565b5061ffff8116156122d55760405162461bcd60e51b815260040161052090614600565b5f805b6004811015612330576122ec816003614590565b6122f790600861439b565b63ffffffff16876123098360026143b2565b81518110612319576123196145a3565b016020015160f81c901b91909117906001016122d8565b5063ffffffff81166003146123575760405162461bcd60e51b815260040161052090614643565b5f805b60208110156123ac5761236e81601f614590565b61237990600861439b565b886123858360066143b2565b81518110612395576123956145a3565b016020015160f81c901b919091179060010161235a565b505f805b600881101561240b576123c4816007614590565b6123cf90600861439b565b6001600160401b0316896123e48360266143b2565b815181106123f4576123f46145a3565b016020015160f81c901b91909117906001016123b0565b505f805b600881101561246a57612423816007614590565b61242e90600861439b565b6001600160401b03168a61244383602e6143b2565b81518110612453576124536145a3565b016020015160f81c901b919091179060010161240f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f8051602061479a8339815191529291906124c2906140bf565b90501180156124f4575060015f83815260068301602052604090205460ff1660048111156124f2576124f261405c565b145b610a785760405162461bcd60e51b815260206004820152603860248201525f805160206147ba83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610520565b5f8181525f8051602061481a83398151915260205260408082208151610100810190925280545f805160206147da83398151915293929190829060ff1660058111156125a1576125a161405c565b60058111156125b2576125b261405c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561263a5761263a61405c565b146126965760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610520565b60408101516001600160a01b0316336001600160a01b0316146127105760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610520565b61271d8160a00151613629565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156127615761276161405c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61282d846128278161161f565b5f6117ba565b5f85815260068501602052604090209091506128498282614135565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612876908590600401614216565b6020604051808303815f875af1158015612892573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128b69190614248565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461292e5760405162461bcd60e51b8152600401610520906145b7565b5f805b600281101561297d57612945816001614590565b61295090600861439b565b61ffff16858281518110612966576129666145a3565b016020015160f81c901b9190911790600101612931565b5061ffff8116156129a05760405162461bcd60e51b815260040161052090614600565b5f805b60048110156129fb576129b7816003614590565b6129c290600861439b565b63ffffffff16866129d48360026143b2565b815181106129e4576129e46145a3565b016020015160f81c901b91909117906001016129a3565b5063ffffffff8116600214612a225760405162461bcd60e51b815260040161052090614643565b5f805b6020811015612a7757612a3981601f614590565b612a4490600861439b565b87612a508360066143b2565b81518110612a6057612a606145a3565b016020015160f81c901b9190911790600101612a25565b505f86602681518110612a8c57612a8c6145a3565b016020015191976001600160f81b03199092161515965090945050505050565b5f612ab56119d9565b5f8051602061479a8339815191525f612acd84610a41565b90505f612ad987611693565b9050600281516005811115612af057612af061405c565b14612b4f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610520565b5f828260a00151612b60919061468a565b60048501546001860154919250612b82916001600160401b039091169061439b565b612b8b82610c6d565b1115612bf75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610520565b612c018882611772565b5f612c0b8961161f565b90505f8982604051602001612c3792919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612c5885613629565b5f612c648b84866117ba565b5f8381526007890160205260409020909150612c808282614135565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cad908590600401614216565b6020604051808303815f875af1158015612cc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ced9190614248565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d9c57612d9c61405c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506119d260015f805160206147fa83398151915255565b612ee56137ca565b612eee81613815565b50565b5f808251602e14612f145760405162461bcd60e51b8152600401610520906145b7565b5f805b6002811015612f6357612f2b816001614590565b612f3690600861439b565b61ffff16858281518110612f4c57612f4c6145a3565b016020015160f81c901b9190911790600101612f17565b5061ffff811615612f865760405162461bcd60e51b815260040161052090614600565b5f805b6004811015612fe157612f9d816003614590565b612fa890600861439b565b63ffffffff1686612fba8360026143b2565b81518110612fca57612fca6145a3565b016020015160f81c901b9190911790600101612f89565b5063ffffffff81166004146130085760405162461bcd60e51b815260040161052090614643565b5f805b602081101561305d5761301f81601f614590565b61302a90600861439b565b876130368360066143b2565b81518110613046576130466145a3565b016020015160f81c901b919091179060010161300b565b505f805b60088110156130bc57613075816007614590565b61308090600861439b565b6001600160401b0316886130958360266143b2565b815181106130a5576130a56145a3565b016020015160f81c901b9190911790600101613061565b5090969095509350505050565b5f5f805160206147da833981519152426130e9604086016020870161401f565b6001600160401b0316118015613122575061310a604085016020860161401f565b6001600160401b0316613120426202a3006143b2565b115b6131845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610520565b83356131dc5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610520565b83355f9081526008820160205260409020541561324c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610520565b61325960408501856146aa565b90506030146132c05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610520565b6132c983613629565b5f806133636040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061330e919061401f565b6001600160401b0316815260200161332960408a018a6146aa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613870565b5f828152600586016020526040902091935091506133818282614135565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906133ae908590600401614216565b6020604051808303815f875af11580156133ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133ee9190614248565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff191660018360058111156134705761347061405c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556135318361161f565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961356860408d0160208e0161401f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156135b95760405163cd78605960e01b8152306004820152602401610520565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613602576040519150601f19603f3d011682016040523d82523d5f602084013e613607565b606091505b505090508061099d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147da8339815191529060ff165f03613667575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906136af9083614590565b106136cb576001600160401b03841660408301528082526136ea565b83826040018181516136dd919061468a565b6001600160401b03169052505b5f82602001518360400151606461370191906146f3565b61370b919061471e565b600285015490915060ff90811690821611156137865760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610520565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661381357604051631afcd79f60e31b815260040160405180910390fd5b565b61381d6137ca565b61382681613c15565b612eee6060820135608083013561384360c0850160a0860161401f565b60c0850135613859610100870160e0880161401f565b61386b61012088016101008901614743565b613c36565b5f60608260800151516030146138da5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610520565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561395157613911816001614590565b61391c90600861439b565b5081515f90839083908110613933576139336145a3565b60200101906001600160f81b03191690815f1a9053506001016138fd565b505f5b60048110156139af57613968816003614590565b61397390600861439b565b505f826139818360026143b2565b81518110613991576139916145a3565b60200101906001600160f81b03191690815f1a905350600101613954565b505f5b6020811015613a0c57845181602081106139ce576139ce6145a3565b1a60f81b826139de8360066143b2565b815181106139ee576139ee6145a3565b60200101906001600160f81b03191690815f1a9053506001016139b2565b505f5b6020811015613a6c5784602001518160208110613a2e57613a2e6145a3565b1a60f81b82613a3e8360266143b2565b81518110613a4e57613a4e6145a3565b60200101906001600160f81b03191690815f1a905350600101613a0f565b505f5b6008811015613ae057613a83816007614590565b613a8e90600861439b565b60ff1685604001516001600160401b0316901c60f81b82826046613ab291906143b2565b81518110613ac257613ac26145a3565b60200101906001600160f81b03191690815f1a905350600101613a6f565b505f5b6030811015613b4b5784608001518181518110613b0257613b026145a3565b01602001516001600160f81b03191682613b1d83604e6143b2565b81518110613b2d57613b2d6145a3565b60200101906001600160f81b03191690815f1a905350600101613ae3565b505f5b6008811015613bbd57613b62816007614590565b613b6d90600861439b565b60608601516001600160401b0390811691161c60f81b82613b8f83607e6143b2565b81518110613b9f57613b9f6145a3565b60200101906001600160f81b03191690815f1a905350600101613b4e565b50600281604051613bce919061475e565b602060405180830381855afa158015613be9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c0c9190614248565b94909350915050565b613c1d6137ca565b613c25613def565b613c2d613dff565b612eee81613e07565b613c3e6137ca565b5f8051602061479a83398151915283613caa5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610520565b85871115613d125760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610520565b600a6001600160401b0384161115613d8a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610520565b95865560018601949094556002850180546001600160401b0394851667ffffffffffffffff199091161790556003850191909155600490930180546001600160a01b03909316600160401b026001600160e01b03199093169390911692909217179055565b613df76137ca565b613813613e73565b6138136137ca565b613e0f6137ca565b80355f805160206147da83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e596060830160408401614779565b600291909101805460ff191660ff90921691909117905550565b611bdc6137ca565b508054613e87906140bf565b5f825580601f10613e96575050565b601f0160209004905f5260205f2090810190612eee9190613ef6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613f0a575f8155600101613ef7565b5090565b8015158114612eee575f80fd5b803563ffffffff81168114613f2e575f80fd5b919050565b5f805f60608486031215613f45575f80fd5b833592506020840135613f5781613f0e565b9150613f6560408501613f1b565b90509250925092565b5f60208284031215613f7e575f80fd5b5035919050565b5f808284036060811215613f97575f80fd5b83356001600160401b03811115613fac575f80fd5b840160608187031215613fbd575f80fd5b92506040601f1982011215613fd0575f80fd5b506020830190509250929050565b5f60208284031215613fee575f80fd5b6119d282613f1b565b5f8060408385031215614008575f80fd5b61401183613f1b565b946020939093013593505050565b5f6020828403121561402f575f80fd5b81356001600160401b03811681146119d2575f80fd5b5f6101208284031215614056575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140a4576140a4614070565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806140d357607f821691505b60208210810361405657634e487b7160e01b5f52602260045260245ffd5b601f82111561099d57805f5260205f20601f840160051c810160208510156141165750805b601f840160051c820191505b81811015610dd2575f8155600101614122565b81516001600160401b0381111561414e5761414e6140ab565b6141628161415c84546140bf565b846140f1565b602080601f831160018114614195575f841561417e5750858301515b5f19600386901b1c1916600185901b1785556141ec565b5f85815260208120601f198616915b828110156141c3578886015182559484019460019091019084016141a4565b50858210156141e057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561420e5781810151838201526020016141f6565b50505f910152565b602081525f82518060208401526142348160408501602087016141f4565b601f01601f19169190910160400192915050565b5f60208284031215614258575f80fd5b5051919050565b5f60208083525f8454614271816140bf565b806020870152604060018084165f811461429257600181146142ae576142db565b60ff19851660408a0152604084151560051b8a010195506142db565b895f5260205f205f5b858110156142d25781548b82018601529083019088016142b7565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261430b5761430b6142e9565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109ce576109ce614070565b808201808211156109ce576109ce614070565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b038111828210171561442e5761442e6140ab565b60405290565b604051601f8201601f191681016001600160401b038111828210171561445c5761445c6140ab565b604052919050565b6001600160a01b0381168114612eee575f80fd5b8051613f2e81613f0e565b5f8060408385031215614494575f80fd5b82516001600160401b03808211156144aa575f80fd5b90840190606082870312156144bd575f80fd5b6144c561440c565b825181526020808401516144d881614464565b828201526040840151838111156144ed575f80fd5b80850194505087601f850112614501575f80fd5b835183811115614513576145136140ab565b614525601f8201601f19168301614434565b9350808452888282870101111561453a575f80fd5b614549818386018488016141f4565b5082604083015281955061455e818801614478565b9450505050509250929050565b5f6001600160401b0380831681810361458657614586614070565b6001019392505050565b818103818111156109ce576109ce614070565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140a4576140a4614070565b5f808335601e198436030181126146bf575f80fd5b8301803591506001600160401b038211156146d8575f80fd5b6020019150368190038213156146ec575f80fd5b9250929050565b6001600160401b0381811683821602808216919082811461471657614716614070565b505092915050565b5f6001600160401b0380841680614737576147376142e9565b92169190910492915050565b5f60208284031215614753575f80fd5b81356119d281614464565b5f825161476f8184602087016141f4565b9190910192915050565b5f60208284031215614789575f80fd5b813560ff811681146119d2575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -233,6 +233,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorRaw) Transa return _NativeTokenStakingManager.Contract.contract.Transact(opts, method, params...) } +// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. +// +// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMSTAKEMULTIPLIERLIMIT(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_STAKE_MULTIPLIER_LIMIT") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. +// +// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMSTAKEMULTIPLIERLIMIT() (uint8, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. +// +// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMSTAKEMULTIPLIERLIMIT() (uint8, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 26d256fe3..e67b1d1fb 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -40,6 +40,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager * @notice A multiplier applied to {_maximumStakeAmount} to determine * the maximum amount of stake a validator can have. This maximum amount includes * the initial stake amount at registration, and additional stake from delegations. + * + * Note: Zero is a valid value, which would disable delegations to validators. */ uint64 _maximumStakeMultiplier; /// @notice The reward calculator for this validator manager. @@ -106,7 +108,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: invalid stake amount range" ); require( - maximumStakeMultiplier > 0 && maximumStakeMultiplier <= MAXIMUM_STAKE_MULTIPLIER_LIMIT, + maximumStakeMultiplier <= MAXIMUM_STAKE_MULTIPLIER_LIMIT, "PoSValidatorManager: invalid maximum stake multiplier" ); diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index cf742ec9f..e892b8024 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -95,27 +95,6 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ); } - function testZeroMaxStakeMultiplier() public { - app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(_formatErrorMessage("invalid maximum stake multiplier")); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, - subnetID: DEFAULT_SUBNET_ID, - maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, - maximumStakeMultiplier: 0, - rewardCalculator: IRewardCalculator(address(0)) - }), - token - ); - } - function testMaxStakeMultiplierOverLimit() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 82466f49e..a03f59bd9 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -85,26 +85,6 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ); } - function testZeroMaxStakeMultiplier() public { - app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(_formatErrorMessage("invalid maximum stake multiplier")); - app.initialize( - PoSValidatorManagerSettings({ - baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, - subnetID: DEFAULT_SUBNET_ID, - maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN - }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, - minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, - maximumStakeMultiplier: 0, - rewardCalculator: IRewardCalculator(address(0)) - }) - ); - } - function testMaxStakeMultiplierOverLimit() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; From 437d61ed0371d23a5ef3f63a0477a3796da95e0c Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 11 Sep 2024 16:53:38 -0400 Subject: [PATCH 249/545] update e2e tests --- .../ERC20TokenStakingManager.go | 18 +++---- .../NativeTokenStakingManager.go | 18 +++---- contracts/staking/PoSValidatorManager.sol | 3 +- .../interfaces/IPoSValidatorManager.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 2 +- tests/flows/staking/poa_validator_manager.go | 9 ++-- tests/utils/staking.go | 52 +++++++++++++------ 7 files changed, 63 insertions(+), 41 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index b3cd62d98..140ef1aa6 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -36,7 +36,7 @@ type PoSValidatorManagerSettings struct { MaximumStakeAmount *big.Int MinimumStakeDuration uint64 MinimumDelegationFee *big.Int - MaximumStakeMultiplier uint64 + MaximumStakeMultiplier uint8 RewardCalculator common.Address } @@ -62,8 +62,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\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614d5d380380614d5d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614c108061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c806365b3a621116100a95780639e1bc4ef1161006e5780639e1bc4ef14610289578063a3a65e481461029c578063b771b3bc146102af578063bee0a03f146102d5578063fbf50cdb146102e8575f80fd5b806365b3a6211461022a57806366435abf1461023d5780636d0e43fa1461025057806376f786211461026357806398f3e2b414610276575f80fd5b8063162f1f61116100ef578063162f1f61146101b35780632e2194d8146101c6578063467ef06f146101f15780635297fae6146102045780636206585614610217575f80fd5b80630118acc4146101205780630322ed98146101355780630cdd098514610148578063151d30d114610199575b5f80fd5b61013361012e36600461428d565b6102fb565b005b6101336101433660046142c8565b610786565b6101866101563660046142c8565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101a1600a81565b60405160ff9091168152602001610190565b6101336101c13660046142c8565b6108e2565b6101d96101d43660046142c8565b61094f565b6040516001600160401b039091168152602001610190565b6101336101ff3660046142df565b610965565b6101336102123660046142f8565b610990565b610186610225366004614320565b610b81565b610186610238366004614346565b610b9a565b6101d961024b3660046142c8565b610bcd565b61013361025e3660046142c8565b610be1565b61013361027136600461428d565b610c4e565b6101336102843660046142f8565b610d20565b6101866102973660046143a7565b610f50565b6101336102aa3660046142df565b610f5c565b6102bd6005600160991b0181565b6040516001600160a01b039091168152602001610190565b6101336102e33660046142c8565b611119565b6101336102f63660046143db565b6111e8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614b6483398151915291841561034d5761034a82856112cc565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561037f5761037f614419565b600481111561039057610390614419565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561041757610417614419565b146104695760405162461bcd60e51b815260206004820152602a60248201525f80516020614b848339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104ce5760405162461bcd60e51b815260206004820152603360248201525f80516020614b848339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610460565b5f6104d884611568565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561052557610525614419565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105f7856115dc565b905082606001516001600160401b03168160a001516001600160401b03161161066e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610460565b5f83606001518260a001516106839190614441565b905061068f86826116bb565b5f61069b878584611703565b5f8c815260088a01602052604090209091506106b782826144f8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106e49085906004016145d9565b6020604051808303815f875af1158015610700573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610724919061460b565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020614ba48339815191529291906107ce9061447c565b9050118015610800575060035f83815260078301602052604090205460ff1660058111156107fe576107fe614419565b145b6108645760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610460565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161089d9190600401614622565b6020604051808303815f875af11580156108b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108dd919061460b565b505050565b6108eb81611920565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614b64833981519152916005600160991b019163ee5b48eb9161089d91600401614622565b5f61095f64e8d4a51000836146c0565b92915050565b5f61096f826119ef565b905061098c81606001516001600160401b03168260400151611d7c565b5050565b5f80516020614b648339815191525f6109a884611db2565b90505f806109b98360400151611f93565b50915091506109c7856121ce565b5f85815260078501602052604081206109df916141d5565b5f6109e9836115dc565b9050816001600160401b031681608001516001600160401b03161015610a215760405162461bcd60e51b8152600401610460906146d3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a665760405162461bcd60e51b815260040161046090614715565b60015f87815260068701602052604090205460ff166004811115610a8c57610a8c614419565b14610af55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610460565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61095f6001600160401b03831664e8d4a5100061475e565b5f610ba36122a7565b610bae8484846122de565b9050610bc660015f80516020614bc483398151915255565b9392505050565b5f610bd7826115dc565b60a0015192915050565b610bea816121ce565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f80516020614b64833981519152916005600160991b019163ee5b48eb9161089d91600401614622565b5f80516020614b648339815191525f610c66856115dc565b5f86815260058401602052604090206001015460c0820151919250610c93916001600160401b0316614775565b421015610cfe5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610460565b8315610d1057610d0e85846112cc565b505b610d19856124c8565b5050505050565b5f80516020614b648339815191525f610d3884611db2565b90505f80610d498360400151611f93565b5091509150610d5785611920565b5f8581526008850160205260408120610d6f916141d5565b5f610d79836115dc565b9050816001600160401b031681608001516001600160401b03161015610db15760405162461bcd60e51b8152600401610460906146d3565b5f8681526006860160205260409020600301546001600160401b0380841691161115610def5760405162461bcd60e51b815260040161046090614715565b60035f87815260068701602052604090205460ff166004811115610e1557610e15614419565b14610e695760405162461bcd60e51b815260206004820152603160248201525f80516020614b848339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610460565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f0e91611d7c565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610bc6833384612880565b5f80516020614ba48339815191525f610f7483611db2565b90505f80610f858360400151612cb4565b9150915080610fe75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610460565b5f828152600585016020526040812080546110019061447c565b9050118015611033575060015f83815260078601602052604090205460ff16600581111561103157611031614419565b145b61104f5760405162461bcd60e51b815260040161046090614788565b5f8281526005850160205260408120611067916141d5565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614ba48339815191529291906111619061447c565b9050118015611193575060015f83815260078301602052604090205460ff16600581111561119157611191614419565b145b6111af5760405162461bcd60e51b815260040161046090614788565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161089d9190600401614622565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611231575080546001600160401b03808416911610155b1561124f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561127a8484612e55565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611317573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261133e9190810190614832565b91509150806113a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610460565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611408919061460b565b82511461146c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610460565b60208201516001600160a01b0316156114e25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610460565b5f806114f18460400151612e6f565b9150915081871461155e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610460565b9695505050505050565b5f8181525f80516020614be48339815191526020526040812060030180545f80516020614ba4833981519152916001600160401b03909116908190846115ad8361491a565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115e461420c565b5f8281525f80516020614be48339815191526020526040908190208151610100810190925280545f80516020614ba4833981519152929190829060ff16600581111561163257611632614419565b600581111561164357611643614419565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614be4833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561177c5761173c81600161493f565b61174790600861475e565b5081515f9083908390811061175e5761175e614952565b60200101906001600160f81b03191690815f1a905350600101611728565b505f5b60048110156117df5761179381600361493f565b61179e90600861475e565b6001901c60f81b826117b1836002614775565b815181106117c1576117c1614952565b60200101906001600160f81b03191690815f1a90535060010161177f565b505f5b6020811015611841576117f681601f61493f565b61180190600861475e565b86901c60f81b82611813836006614775565b8151811061182357611823614952565b60200101906001600160f81b03191690815f1a9053506001016117e2565b505f5b60088110156118ac5761185881600761493f565b61186390600861475e565b6001600160401b038616901c60f81b8261187e836026614775565b8151811061188e5761188e614952565b60200101906001600160f81b03191690815f1a905350600101611844565b505f5b6008811015611917576118c381600761493f565b6118ce90600861475e565b6001600160401b038516901c60f81b826118e983602e614775565b815181106118f9576118f9614952565b60200101906001600160f81b03191690815f1a9053506001016118af565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f80516020614b648339815191529291906119689061447c565b905011801561199a575060035f83815260068301602052604090205460ff16600481111561199857611998614419565b145b61098c5760405162461bcd60e51b815260206004820152603360248201525f80516020614b8483398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610460565b6119f761420c565b5f80516020614ba48339815191525f611a0f84611db2565b90505f80611a208360400151612cb4565b915091508015611a855760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610460565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611ab757611ab7614419565b6005811115611ac857611ac8614419565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b4f57611b4f614419565b1480611b6d5750600182516005811115611b6b57611b6b614419565b145b611bcc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610460565b600382516005811115611be157611be1614419565b03611c0857505f8381526006860160205260408120600491611c0391906141d5565b611c0c565b5060055b6020808301515f90815260088801909152604081205581816005811115611c3557611c35614419565b90816005811115611c4857611c48614419565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611c7c57611c7c614419565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d4757611d47614419565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461098c906001600160a01b03168284613047565b60408051606080820183525f8083526020830181905292820152905f80516020614ba48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e27573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e4e9190810190614832565b9150915080611eb55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610460565b8254825114611f185760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610460565b60208201516001600160a01b031615611f8b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610460565b509392505050565b5f805f8351603614611fb75760405162461bcd60e51b815260040161046090614966565b5f805b600281101561200657611fce81600161493f565b611fd990600861475e565b61ffff16868281518110611fef57611fef614952565b016020015160f81c901b9190911790600101611fba565b5061ffff8116156120295760405162461bcd60e51b8152600401610460906149af565b5f805b60048110156120845761204081600361493f565b61204b90600861475e565b63ffffffff168761205d836002614775565b8151811061206d5761206d614952565b016020015160f81c901b919091179060010161202c565b5063ffffffff81166003146120ab5760405162461bcd60e51b8152600401610460906149f2565b5f805b6020811015612100576120c281601f61493f565b6120cd90600861475e565b886120d9836006614775565b815181106120e9576120e9614952565b016020015160f81c901b91909117906001016120ae565b505f805b600881101561215f5761211881600761493f565b61212390600861475e565b6001600160401b031689612138836026614775565b8151811061214857612148614952565b016020015160f81c901b9190911790600101612104565b505f805b60088110156121be5761217781600761493f565b61218290600861475e565b6001600160401b03168a61219783602e614775565b815181106121a7576121a7614952565b016020015160f81c901b9190911790600101612163565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f80516020614b648339815191529291906122169061447c565b9050118015612248575060015f83815260068301602052604090205460ff16600481111561224657612246614419565b145b61098c5760405162461bcd60e51b815260206004820152603860248201525f80516020614b8483398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610460565b5f80516020614bc48339815191528054600119016122d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614b64833981519152906001600160401b0316602085013510156123855760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610460565b6003810154843510156123ee5760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610460565b80548310801590612403575080600101548311155b6124615760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610460565b5f61246b846130a6565b90505f6124778261094f565b90505f61248488836130dc565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f80516020614bc483398151915255565b5f8181525f80516020614be483398151915260205260408082208151610100810190925280545f80516020614ba483398151915293929190829060ff16600581111561251657612516614419565b600581111561252757612527614419565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156125af576125af614419565b1461260b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610460565b60408101516001600160a01b0316336001600160a01b0316146126855760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610460565b6126928160a001516135a9565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156126d6576126d6614419565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127a28461279c81611568565b5f611703565b5f85815260068501602052604090209091506127be82826144f8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127eb9085906004016145d9565b6020604051808303815f875af1158015612807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061282b919061460b565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6128896122a7565b5f80516020614b648339815191525f6128a46101d4856130a6565b90505f6128b0876115dc565b90506002815160058111156128c7576128c7614419565b146129265760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610460565b5f828260a001516129379190614a39565b60048501546001860154919250612959916001600160401b039091169061475e565b61296282610b81565b11156129ce5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610460565b6129d888826116bb565b5f6129e289611568565b90505f8982604051602001612a0e92919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612a2f856135a9565b5f612a3b8b8486611703565b5f8381526007890160205260409020909150612a5782826144f8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612a849085906004016145d9565b6020604051808303815f875af1158015612aa0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ac4919061460b565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612b7357612b73614419565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610bc660015f80516020614bc483398151915255565b5f808251602714612cd75760405162461bcd60e51b815260040161046090614966565b5f805b6002811015612d2657612cee81600161493f565b612cf990600861475e565b61ffff16858281518110612d0f57612d0f614952565b016020015160f81c901b9190911790600101612cda565b5061ffff811615612d495760405162461bcd60e51b8152600401610460906149af565b5f805b6004811015612da457612d6081600361493f565b612d6b90600861475e565b63ffffffff1686612d7d836002614775565b81518110612d8d57612d8d614952565b016020015160f81c901b9190911790600101612d4c565b5063ffffffff8116600214612dcb5760405162461bcd60e51b8152600401610460906149f2565b5f805b6020811015612e2057612de281601f61493f565b612ded90600861475e565b87612df9836006614775565b81518110612e0957612e09614952565b016020015160f81c901b9190911790600101612dce565b505f86602681518110612e3557612e35614952565b016020015191976001600160f81b03199092161515965090945050505050565b612e5d61374a565b612e6682613795565b61098c816137f3565b5f808251602e14612e925760405162461bcd60e51b815260040161046090614966565b5f805b6002811015612ee157612ea981600161493f565b612eb490600861475e565b61ffff16858281518110612eca57612eca614952565b016020015160f81c901b9190911790600101612e95565b5061ffff811615612f045760405162461bcd60e51b8152600401610460906149af565b5f805b6004811015612f5f57612f1b81600361493f565b612f2690600861475e565b63ffffffff1686612f38836002614775565b81518110612f4857612f48614952565b016020015160f81c901b9190911790600101612f07565b5063ffffffff8116600414612f865760405162461bcd60e51b8152600401610460906149f2565b5f805b6020811015612fdb57612f9d81601f61493f565b612fa890600861475e565b87612fb4836006614775565b81518110612fc457612fc4614952565b016020015160f81c901b9190911790600101612f89565b505f805b600881101561303a57612ff381600761493f565b612ffe90600861475e565b6001600160401b031688613013836026614775565b8151811061302357613023614952565b016020015160f81c901b9190911790600101612fdf565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526108dd91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506138a7565b5f61095f827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613908565b5f5f80516020614ba4833981519152426130fc6040860160208701614320565b6001600160401b0316118015613135575061311d6040850160208601614320565b6001600160401b0316613133426202a300614775565b115b6131975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610460565b83356131ef5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610460565b83355f9081526008820160205260409020541561325f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610460565b61326c6040850185614a59565b90506030146132d35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610460565b6132dc836135a9565b5f806133766040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906133219190614320565b6001600160401b0316815260200161333c60408a018a614a59565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613a6a565b5f8281526005860160205260409020919350915061339482826144f8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906133c19085906004016145d9565b6020604051808303815f875af11580156133dd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613401919061460b565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561348357613483614419565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561354483611568565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961357b60408d0160208e01614320565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614ba48339815191529060ff165f036135e7575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061362f908361493f565b1061364b576001600160401b038416604083015280825261366a565b838260400181815161365d9190614a39565b6001600160401b03169052505b5f8260200151836040015160646136819190614aa2565b61368b9190614acd565b600285015490915060ff90811690821611156137065760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610460565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661379357604051631afcd79f60e31b815260040160405180910390fd5b565b61379d61374a565b6137a681613e0f565b6137f0606082013560808301356137c360c0850160a08601614320565b60c08501356137d9610100870160e08801614320565b6137eb61012088016101008901614af2565b613e30565b50565b6137fb61374a565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166138875760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610460565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6138bb6001600160a01b03841683613fe9565b905080515f141580156138df5750808060200190518101906138dd9190614b0d565b155b156108dd57604051635274afe760e01b81526001600160a01b0384166004820152602401610460565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561394e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613972919061460b565b90506139896001600160a01b038516333086613ff6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139f1919061460b565b9050818111613a575760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610460565b613a61828261493f565b95945050505050565b5f6060826080015151603014613ad45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610460565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613b4b57613b0b81600161493f565b613b1690600861475e565b5081515f90839083908110613b2d57613b2d614952565b60200101906001600160f81b03191690815f1a905350600101613af7565b505f5b6004811015613ba957613b6281600361493f565b613b6d90600861475e565b505f82613b7b836002614775565b81518110613b8b57613b8b614952565b60200101906001600160f81b03191690815f1a905350600101613b4e565b505f5b6020811015613c065784518160208110613bc857613bc8614952565b1a60f81b82613bd8836006614775565b81518110613be857613be8614952565b60200101906001600160f81b03191690815f1a905350600101613bac565b505f5b6020811015613c665784602001518160208110613c2857613c28614952565b1a60f81b82613c38836026614775565b81518110613c4857613c48614952565b60200101906001600160f81b03191690815f1a905350600101613c09565b505f5b6008811015613cda57613c7d81600761493f565b613c8890600861475e565b60ff1685604001516001600160401b0316901c60f81b82826046613cac9190614775565b81518110613cbc57613cbc614952565b60200101906001600160f81b03191690815f1a905350600101613c69565b505f5b6030811015613d455784608001518181518110613cfc57613cfc614952565b01602001516001600160f81b03191682613d1783604e614775565b81518110613d2757613d27614952565b60200101906001600160f81b03191690815f1a905350600101613cdd565b505f5b6008811015613db757613d5c81600761493f565b613d6790600861475e565b60608601516001600160401b0390811691161c60f81b82613d8983607e614775565b81518110613d9957613d99614952565b60200101906001600160f81b03191690815f1a905350600101613d48565b50600281604051613dc89190614b28565b602060405180830381855afa158015613de3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613e06919061460b565b94909350915050565b613e1761374a565b613e1f614035565b613e27614045565b6137f08161404d565b613e3861374a565b5f80516020614b6483398151915283613ea45760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610460565b85871115613f0c5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610460565b600a6001600160401b0384161115613f845760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610460565b95865560018601949094556002850180546001600160401b0394851667ffffffffffffffff199091161790556003850191909155600490930180546001600160a01b03909316600160401b026001600160e01b03199093169390911692909217179055565b6060610bc683835f6140b9565b6040516001600160a01b03848116602483015283811660448301526064820183905261402f9186918216906323b872dd90608401613074565b50505050565b61403d61374a565b613793614148565b61379361374a565b61405561374a565b80355f80516020614ba483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561409f6060830160408401614b43565b600291909101805460ff191660ff90921691909117905550565b6060814710156140de5760405163cd78605960e01b8152306004820152602401610460565b5f80856001600160a01b031684866040516140f99190614b28565b5f6040518083038185875af1925050503d805f8114614133576040519150601f19603f3d011682016040523d82523d5f602084013e614138565b606091505b509150915061155e868383614150565b6124b561374a565b60608261416557614160826141ac565b610bc6565b815115801561417c57506001600160a01b0384163b155b156141a557604051639996b31560e01b81526001600160a01b0385166004820152602401610460565b5080610bc6565b8051156141bc5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546141e19061447c565b5f825580601f106141f0575050565b601f0160209004905f5260205f20908101906137f09190614250565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614264575f8155600101614251565b5090565b80151581146137f0575f80fd5b803563ffffffff81168114614288575f80fd5b919050565b5f805f6060848603121561429f575f80fd5b8335925060208401356142b181614268565b91506142bf60408501614275565b90509250925092565b5f602082840312156142d8575f80fd5b5035919050565b5f602082840312156142ef575f80fd5b610bc682614275565b5f8060408385031215614309575f80fd5b61431283614275565b946020939093013593505050565b5f60208284031215614330575f80fd5b81356001600160401b0381168114610bc6575f80fd5b5f805f8385036080811215614359575f80fd5b84356001600160401b0381111561436e575f80fd5b85016060818803121561437f575f80fd5b93506040601f1982011215614392575f80fd5b50602084019150606084013590509250925092565b5f80604083850312156143b8575f80fd5b50508035926020909101359150565b6001600160a01b03811681146137f0575f80fd5b5f808284036101408112156143ee575f80fd5b610120808212156143fd575f80fd5b849350830135905061440e816143c7565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144615761446161442d565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061449057607f821691505b6020821081036144ae57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108dd57805f5260205f20601f840160051c810160208510156144d95750805b601f840160051c820191505b81811015610d19575f81556001016144e5565b81516001600160401b0381111561451157614511614468565b6145258161451f845461447c565b846144b4565b602080601f831160018114614558575f84156145415750858301515b5f19600386901b1c1916600185901b1785556145af565b5f85815260208120601f198616915b8281101561458657888601518255948401946001909101908401614567565b50858210156145a357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156145d15781810151838201526020016145b9565b50505f910152565b602081525f82518060208401526145f78160408501602087016145b7565b601f01601f19169190910160400192915050565b5f6020828403121561461b575f80fd5b5051919050565b5f60208083525f84546146348161447c565b806020870152604060018084165f811461465557600181146146715761469e565b60ff19851660408a0152604084151560051b8a0101955061469e565b895f5260205f205f5b858110156146955781548b820186015290830190880161467a565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826146ce576146ce6146ac565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761095f5761095f61442d565b8082018082111561095f5761095f61442d565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b03811182821017156147f1576147f1614468565b60405290565b604051601f8201601f191681016001600160401b038111828210171561481f5761481f614468565b604052919050565b805161428881614268565b5f8060408385031215614843575f80fd5b82516001600160401b0380821115614859575f80fd5b908401906060828703121561486c575f80fd5b6148746147cf565b82518152602080840151614887816143c7565b8282015260408401518381111561489c575f80fd5b80850194505087601f8501126148b0575f80fd5b8351838111156148c2576148c2614468565b6148d4601f8201601f191683016147f7565b935080845288828287010111156148e9575f80fd5b6148f8818386018488016145b7565b5082604083015281955061490d818801614827565b9450505050509250929050565b5f6001600160401b038083168181036149355761493561442d565b6001019392505050565b8181038181111561095f5761095f61442d565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156144615761446161442d565b5f808335601e19843603018112614a6e575f80fd5b8301803591506001600160401b03821115614a87575f80fd5b602001915036819003821315614a9b575f80fd5b9250929050565b6001600160401b03818116838216028082169190828114614ac557614ac561442d565b505092915050565b5f6001600160401b0380841680614ae657614ae66146ac565b92169190910492915050565b5f60208284031215614b02575f80fd5b8135610bc6816143c7565b5f60208284031215614b1d575f80fd5b8151610bc681614268565b5f8251614b398184602087016145b7565b9190910192915050565b5f60208284031215614b53575f80fd5b813560ff81168114610bc6575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614d7f380380614d7f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614c328061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c806365b3a621116100a95780639cb443411161006e5780639cb44341146102895780639e1bc4ef1461029c578063a3a65e48146102af578063b771b3bc146102c2578063bee0a03f146102e8575f80fd5b806365b3a6211461022a57806366435abf1461023d5780636d0e43fa1461025057806376f786211461026357806398f3e2b414610276575f80fd5b8063162f1f61116100ef578063162f1f61146101b35780632e2194d8146101c6578063467ef06f146101f15780635297fae6146102045780636206585614610217575f80fd5b80630118acc4146101205780630322ed98146101355780630cdd098514610148578063151d30d114610199575b5f80fd5b61013361012e366004614267565b6102fb565b005b6101336101433660046142a2565b610786565b6101866101563660046142a2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101a1600a81565b60405160ff9091168152602001610190565b6101336101c13660046142a2565b6108e2565b6101d96101d43660046142a2565b61094f565b6040516001600160401b039091168152602001610190565b6101336101ff3660046142b9565b610965565b6101336102123660046142d2565b610990565b6101866102253660046142fa565b610b81565b610186610238366004614320565b610b9a565b6101d961024b3660046142a2565b610bcd565b61013361025e3660046142a2565b610be1565b610133610271366004614267565b610c4e565b6101336102843660046142d2565b610d20565b610133610297366004614395565b610f50565b6101866102aa3660046143d3565b611034565b6101336102bd3660046142b9565b611040565b6102d06005600160991b0181565b6040516001600160a01b039091168152602001610190565b6101336102f63660046142a2565b6111fd565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614b8683398151915291841561034d5761034a82856112cc565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561037f5761037f6143f3565b6004811115610390576103906143f3565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610417576104176143f3565b146104695760405162461bcd60e51b815260206004820152602a60248201525f80516020614ba68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104ce5760405162461bcd60e51b815260206004820152603360248201525f80516020614ba68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610460565b5f6104d884611568565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff19166001836004811115610525576105256143f3565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105f7856115dc565b905082606001516001600160401b03168160a001516001600160401b03161161066e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610460565b5f83606001518260a00151610683919061441b565b905061068f86826116bb565b5f61069b878584611703565b5f8c815260088a01602052604090209091506106b782826144d2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106e49085906004016145b3565b6020604051808303815f875af1158015610700573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072491906145e5565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020614bc68339815191529291906107ce90614456565b9050118015610800575060035f83815260078301602052604090205460ff1660058111156107fe576107fe6143f3565b145b6108645760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610460565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161089d91906004016145fc565b6020604051808303815f875af11580156108b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108dd91906145e5565b505050565b6108eb81611920565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614b86833981519152916005600160991b019163ee5b48eb9161089d916004016145fc565b5f61095f64e8d4a510008361469a565b92915050565b5f61096f826119ef565b905061098c81606001516001600160401b03168260400151611d7c565b5050565b5f80516020614b868339815191525f6109a884611db2565b90505f806109b98360400151611f93565b50915091506109c7856121ce565b5f85815260078501602052604081206109df916141af565b5f6109e9836115dc565b9050816001600160401b031681608001516001600160401b03161015610a215760405162461bcd60e51b8152600401610460906146ad565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a665760405162461bcd60e51b8152600401610460906146ef565b60015f87815260068701602052604090205460ff166004811115610a8c57610a8c6143f3565b14610af55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610460565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61095f6001600160401b03831664e8d4a51000614738565b5f610ba36122a7565b610bae8484846122de565b9050610bc660015f80516020614be683398151915255565b9392505050565b5f610bd7826115dc565b60a0015192915050565b610bea816121ce565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f80516020614b86833981519152916005600160991b019163ee5b48eb9161089d916004016145fc565b5f80516020614b868339815191525f610c66856115dc565b5f86815260058401602052604090206001015460c0820151919250610c93916001600160401b031661474f565b421015610cfe5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610460565b8315610d1057610d0e85846112cc565b505b610d19856124c8565b5050505050565b5f80516020614b868339815191525f610d3884611db2565b90505f80610d498360400151611f93565b5091509150610d5785611920565b5f8581526008850160205260408120610d6f916141af565b5f610d79836115dc565b9050816001600160401b031681608001516001600160401b03161015610db15760405162461bcd60e51b8152600401610460906146ad565b5f8681526006860160205260409020600301546001600160401b0380841691161115610def5760405162461bcd60e51b8152600401610460906146ef565b60035f87815260068701602052604090205460ff166004811115610e1557610e156143f3565b14610e695760405162461bcd60e51b815260206004820152603160248201525f80516020614ba68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610460565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f0e91611d7c565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610f99575080546001600160401b03808416911610155b15610fb75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610fe28484612880565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610bc683338461289a565b5f80516020614bc68339815191525f61105883611db2565b90505f806110698360400151612cce565b91509150806110cb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610460565b5f828152600585016020526040812080546110e590614456565b9050118015611117575060015f83815260078601602052604090205460ff166005811115611115576111156143f3565b145b6111335760405162461bcd60e51b815260040161046090614762565b5f828152600585016020526040812061114b916141af565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614bc683398151915292919061124590614456565b9050118015611277575060015f83815260078301602052604090205460ff166005811115611275576112756143f3565b145b6112935760405162461bcd60e51b815260040161046090614762565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161089d91906004016145fc565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611317573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261133e919081019061480c565b91509150806113a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610460565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140891906145e5565b82511461146c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610460565b60208201516001600160a01b0316156114e25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610460565b5f806114f18460400151612e6f565b9150915081871461155e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610460565b9695505050505050565b5f8181525f80516020614c068339815191526020526040812060030180545f80516020614bc6833981519152916001600160401b03909116908190846115ad836148f4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115e46141e6565b5f8281525f80516020614c068339815191526020526040908190208151610100810190925280545f80516020614bc6833981519152929190829060ff166005811115611632576116326143f3565b6005811115611643576116436143f3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614c06833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561177c5761173c816001614919565b611747906008614738565b5081515f9083908390811061175e5761175e61492c565b60200101906001600160f81b03191690815f1a905350600101611728565b505f5b60048110156117df57611793816003614919565b61179e906008614738565b6001901c60f81b826117b183600261474f565b815181106117c1576117c161492c565b60200101906001600160f81b03191690815f1a90535060010161177f565b505f5b6020811015611841576117f681601f614919565b611801906008614738565b86901c60f81b8261181383600661474f565b815181106118235761182361492c565b60200101906001600160f81b03191690815f1a9053506001016117e2565b505f5b60088110156118ac57611858816007614919565b611863906008614738565b6001600160401b038616901c60f81b8261187e83602661474f565b8151811061188e5761188e61492c565b60200101906001600160f81b03191690815f1a905350600101611844565b505f5b6008811015611917576118c3816007614919565b6118ce906008614738565b6001600160401b038516901c60f81b826118e983602e61474f565b815181106118f9576118f961492c565b60200101906001600160f81b03191690815f1a9053506001016118af565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f80516020614b8683398151915292919061196890614456565b905011801561199a575060035f83815260068301602052604090205460ff166004811115611998576119986143f3565b145b61098c5760405162461bcd60e51b815260206004820152603360248201525f80516020614ba683398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610460565b6119f76141e6565b5f80516020614bc68339815191525f611a0f84611db2565b90505f80611a208360400151612cce565b915091508015611a855760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610460565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611ab757611ab76143f3565b6005811115611ac857611ac86143f3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b4f57611b4f6143f3565b1480611b6d5750600182516005811115611b6b57611b6b6143f3565b145b611bcc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610460565b600382516005811115611be157611be16143f3565b03611c0857505f8381526006860160205260408120600491611c0391906141af565b611c0c565b5060055b6020808301515f90815260088801909152604081205581816005811115611c3557611c356143f3565b90816005811115611c4857611c486143f3565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611c7c57611c7c6143f3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d4757611d476143f3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461098c906001600160a01b03168284613047565b60408051606080820183525f8083526020830181905292820152905f80516020614bc68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e27573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e4e919081019061480c565b9150915080611eb55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610460565b8254825114611f185760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610460565b60208201516001600160a01b031615611f8b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610460565b509392505050565b5f805f8351603614611fb75760405162461bcd60e51b815260040161046090614940565b5f805b600281101561200657611fce816001614919565b611fd9906008614738565b61ffff16868281518110611fef57611fef61492c565b016020015160f81c901b9190911790600101611fba565b5061ffff8116156120295760405162461bcd60e51b815260040161046090614989565b5f805b600481101561208457612040816003614919565b61204b906008614738565b63ffffffff168761205d83600261474f565b8151811061206d5761206d61492c565b016020015160f81c901b919091179060010161202c565b5063ffffffff81166003146120ab5760405162461bcd60e51b8152600401610460906149cc565b5f805b6020811015612100576120c281601f614919565b6120cd906008614738565b886120d983600661474f565b815181106120e9576120e961492c565b016020015160f81c901b91909117906001016120ae565b505f805b600881101561215f57612118816007614919565b612123906008614738565b6001600160401b03168961213883602661474f565b815181106121485761214861492c565b016020015160f81c901b9190911790600101612104565b505f805b60088110156121be57612177816007614919565b612182906008614738565b6001600160401b03168a61219783602e61474f565b815181106121a7576121a761492c565b016020015160f81c901b9190911790600101612163565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f80516020614b8683398151915292919061221690614456565b9050118015612248575060015f83815260068301602052604090205460ff166004811115612246576122466143f3565b145b61098c5760405162461bcd60e51b815260206004820152603860248201525f80516020614ba683398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610460565b5f80516020614be68339815191528054600119016122d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614b86833981519152906001600160401b0316602085013510156123855760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610460565b6003810154843510156123ee5760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610460565b80548310801590612403575080600101548311155b6124615760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610460565b5f61246b846130a6565b90505f6124778261094f565b90505f61248488836130dc565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f80516020614be683398151915255565b5f8181525f80516020614c0683398151915260205260408082208151610100810190925280545f80516020614bc683398151915293929190829060ff166005811115612516576125166143f3565b6005811115612527576125276143f3565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156125af576125af6143f3565b1461260b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610460565b60408101516001600160a01b0316336001600160a01b0316146126855760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610460565b6126928160a001516135a9565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156126d6576126d66143f3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127a28461279c81611568565b5f611703565b5f85815260068501602052604090209091506127be82826144d2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127eb9085906004016145b3565b6020604051808303815f875af1158015612807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061282b91906145e5565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61288861374a565b61289182613795565b61098c816137f3565b5f6128a36122a7565b5f80516020614b868339815191525f6128be6101d4856130a6565b90505f6128ca876115dc565b90506002815160058111156128e1576128e16143f3565b146129405760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610460565b5f828260a001516129519190614a13565b60048501546001860154919250612973916001600160401b0390911690614738565b61297c82610b81565b11156129e85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610460565b6129f288826116bb565b5f6129fc89611568565b90505f8982604051602001612a2892919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612a49856135a9565b5f612a558b8486611703565b5f8381526007890160205260409020909150612a7182826144d2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612a9e9085906004016145b3565b6020604051808303815f875af1158015612aba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ade91906145e5565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612b8d57612b8d6143f3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610bc660015f80516020614be683398151915255565b5f808251602714612cf15760405162461bcd60e51b815260040161046090614940565b5f805b6002811015612d4057612d08816001614919565b612d13906008614738565b61ffff16858281518110612d2957612d2961492c565b016020015160f81c901b9190911790600101612cf4565b5061ffff811615612d635760405162461bcd60e51b815260040161046090614989565b5f805b6004811015612dbe57612d7a816003614919565b612d85906008614738565b63ffffffff1686612d9783600261474f565b81518110612da757612da761492c565b016020015160f81c901b9190911790600101612d66565b5063ffffffff8116600214612de55760405162461bcd60e51b8152600401610460906149cc565b5f805b6020811015612e3a57612dfc81601f614919565b612e07906008614738565b87612e1383600661474f565b81518110612e2357612e2361492c565b016020015160f81c901b9190911790600101612de8565b505f86602681518110612e4f57612e4f61492c565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e925760405162461bcd60e51b815260040161046090614940565b5f805b6002811015612ee157612ea9816001614919565b612eb4906008614738565b61ffff16858281518110612eca57612eca61492c565b016020015160f81c901b9190911790600101612e95565b5061ffff811615612f045760405162461bcd60e51b815260040161046090614989565b5f805b6004811015612f5f57612f1b816003614919565b612f26906008614738565b63ffffffff1686612f3883600261474f565b81518110612f4857612f4861492c565b016020015160f81c901b9190911790600101612f07565b5063ffffffff8116600414612f865760405162461bcd60e51b8152600401610460906149cc565b5f805b6020811015612fdb57612f9d81601f614919565b612fa8906008614738565b87612fb483600661474f565b81518110612fc457612fc461492c565b016020015160f81c901b9190911790600101612f89565b505f805b600881101561303a57612ff3816007614919565b612ffe906008614738565b6001600160401b03168861301383602661474f565b815181106130235761302361492c565b016020015160f81c901b9190911790600101612fdf565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526108dd91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506138a7565b5f61095f827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613908565b5f5f80516020614bc6833981519152426130fc60408601602087016142fa565b6001600160401b0316118015613135575061311d60408501602086016142fa565b6001600160401b0316613133426202a30061474f565b115b6131975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610460565b83356131ef5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610460565b83355f9081526008820160205260409020541561325f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610460565b61326c6040850185614a33565b90506030146132d35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610460565b6132dc836135a9565b5f806133766040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061332191906142fa565b6001600160401b0316815260200161333c60408a018a614a33565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613a6a565b5f8281526005860160205260409020919350915061339482826144d2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906133c19085906004016145b3565b6020604051808303815f875af11580156133dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061340191906145e5565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115613483576134836143f3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561354483611568565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961357b60408d0160208e016142fa565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614bc68339815191529060ff165f036135e7575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061362f9083614919565b1061364b576001600160401b038416604083015280825261366a565b838260400181815161365d9190614a13565b6001600160401b03169052505b5f8260200151836040015160646136819190614a7c565b61368b9190614aa7565b600285015490915060ff90811690821611156137065760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610460565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661379357604051631afcd79f60e31b815260040160405180910390fd5b565b61379d61374a565b6137a681613e0f565b6137f0606082013560808301356137c360c0850160a086016142fa565b60c08501356137d9610100870160e08801614acc565b6137eb61012088016101008901614aec565b613e30565b50565b6137fb61374a565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166138875760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610460565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6138bb6001600160a01b03841683613fc3565b905080515f141580156138df5750808060200190518101906138dd9190614b07565b155b156108dd57604051635274afe760e01b81526001600160a01b0384166004820152602401610460565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561394e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061397291906145e5565b90506139896001600160a01b038516333086613fd0565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139f191906145e5565b9050818111613a575760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610460565b613a618282614919565b95945050505050565b5f6060826080015151603014613ad45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610460565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613b4b57613b0b816001614919565b613b16906008614738565b5081515f90839083908110613b2d57613b2d61492c565b60200101906001600160f81b03191690815f1a905350600101613af7565b505f5b6004811015613ba957613b62816003614919565b613b6d906008614738565b505f82613b7b83600261474f565b81518110613b8b57613b8b61492c565b60200101906001600160f81b03191690815f1a905350600101613b4e565b505f5b6020811015613c065784518160208110613bc857613bc861492c565b1a60f81b82613bd883600661474f565b81518110613be857613be861492c565b60200101906001600160f81b03191690815f1a905350600101613bac565b505f5b6020811015613c665784602001518160208110613c2857613c2861492c565b1a60f81b82613c3883602661474f565b81518110613c4857613c4861492c565b60200101906001600160f81b03191690815f1a905350600101613c09565b505f5b6008811015613cda57613c7d816007614919565b613c88906008614738565b60ff1685604001516001600160401b0316901c60f81b82826046613cac919061474f565b81518110613cbc57613cbc61492c565b60200101906001600160f81b03191690815f1a905350600101613c69565b505f5b6030811015613d455784608001518181518110613cfc57613cfc61492c565b01602001516001600160f81b03191682613d1783604e61474f565b81518110613d2757613d2761492c565b60200101906001600160f81b03191690815f1a905350600101613cdd565b505f5b6008811015613db757613d5c816007614919565b613d67906008614738565b60608601516001600160401b0390811691161c60f81b82613d8983607e61474f565b81518110613d9957613d9961492c565b60200101906001600160f81b03191690815f1a905350600101613d48565b50600281604051613dc89190614b22565b602060405180830381855afa158015613de3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613e0691906145e5565b94909350915050565b613e1761374a565b613e1f61400f565b613e2761401f565b6137f081614027565b613e3861374a565b5f80516020614b8683398151915283613e635760405162461bcd60e51b815260040161046090614b3d565b85871115613ecb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610460565b600a60ff84161115613f3d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610460565b5f8411613f5c5760405162461bcd60e51b815260040161046090614b3d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6060610bc683835f614093565b6040516001600160a01b0384811660248301528381166044830152606482018390526140099186918216906323b872dd90608401613074565b50505050565b61401761374a565b613793614122565b61379361374a565b61402f61374a565b80355f80516020614bc683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556140796060830160408401614acc565b600291909101805460ff191660ff90921691909117905550565b6060814710156140b85760405163cd78605960e01b8152306004820152602401610460565b5f80856001600160a01b031684866040516140d39190614b22565b5f6040518083038185875af1925050503d805f811461410d576040519150601f19603f3d011682016040523d82523d5f602084013e614112565b606091505b509150915061155e86838361412a565b6124b561374a565b60608261413f5761413a82614186565b610bc6565b815115801561415657506001600160a01b0384163b155b1561417f57604051639996b31560e01b81526001600160a01b0385166004820152602401610460565b5080610bc6565b8051156141965780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546141bb90614456565b5f825580601f106141ca575050565b601f0160209004905f5260205f20908101906137f0919061422a565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561423e575f815560010161422b565b5090565b80151581146137f0575f80fd5b803563ffffffff81168114614262575f80fd5b919050565b5f805f60608486031215614279575f80fd5b83359250602084013561428b81614242565b91506142996040850161424f565b90509250925092565b5f602082840312156142b2575f80fd5b5035919050565b5f602082840312156142c9575f80fd5b610bc68261424f565b5f80604083850312156142e3575f80fd5b6142ec8361424f565b946020939093013593505050565b5f6020828403121561430a575f80fd5b81356001600160401b0381168114610bc6575f80fd5b5f805f8385036080811215614333575f80fd5b84356001600160401b03811115614348575f80fd5b850160608188031215614359575f80fd5b93506040601f198201121561436c575f80fd5b50602084019150606084013590509250925092565b6001600160a01b03811681146137f0575f80fd5b5f808284036101408112156143a8575f80fd5b610120808212156143b7575f80fd5b84935083013590506143c881614381565b809150509250929050565b5f80604083850312156143e4575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561443b5761443b614407565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061446a57607f821691505b60208210810361448857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108dd57805f5260205f20601f840160051c810160208510156144b35750805b601f840160051c820191505b81811015610d19575f81556001016144bf565b81516001600160401b038111156144eb576144eb614442565b6144ff816144f98454614456565b8461448e565b602080601f831160018114614532575f841561451b5750858301515b5f19600386901b1c1916600185901b178555614589565b5f85815260208120601f198616915b8281101561456057888601518255948401946001909101908401614541565b508582101561457d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156145ab578181015183820152602001614593565b50505f910152565b602081525f82518060208401526145d1816040850160208701614591565b601f01601f19169190910160400192915050565b5f602082840312156145f5575f80fd5b5051919050565b5f60208083525f845461460e81614456565b806020870152604060018084165f811461462f576001811461464b57614678565b60ff19851660408a0152604084151560051b8a01019550614678565b895f5260205f205f5b8581101561466f5781548b8201860152908301908801614654565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826146a8576146a8614686565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761095f5761095f614407565b8082018082111561095f5761095f614407565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b03811182821017156147cb576147cb614442565b60405290565b604051601f8201601f191681016001600160401b03811182821017156147f9576147f9614442565b604052919050565b805161426281614242565b5f806040838503121561481d575f80fd5b82516001600160401b0380821115614833575f80fd5b9084019060608287031215614846575f80fd5b61484e6147a9565b8251815260208084015161486181614381565b82820152604084015183811115614876575f80fd5b80850194505087601f85011261488a575f80fd5b83518381111561489c5761489c614442565b6148ae601f8201601f191683016147d1565b935080845288828287010111156148c3575f80fd5b6148d281838601848801614591565b508260408301528195506148e7818801614801565b9450505050509250929050565b5f6001600160401b0380831681810361490f5761490f614407565b6001019392505050565b8181038181111561095f5761095f614407565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561443b5761443b614407565b5f808335601e19843603018112614a48575f80fd5b8301803591506001600160401b03821115614a61575f80fd5b602001915036819003821315614a75575f80fd5b9250929050565b6001600160401b03818116838216028082169190828114614a9f57614a9f614407565b505092915050565b5f6001600160401b0380841680614ac057614ac0614686565b92169190910492915050565b5f60208284031215614adc575f80fd5b813560ff81168114610bc6575f80fd5b5f60208284031215614afc575f80fd5b8135610bc681614381565b5f60208284031215614b17575f80fd5b8151610bc681614242565b5f8251614b33818460208701614591565b9190910192915050565b60208082526028908201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160408201526774696f6e2066656560c01b60608201526080019056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -503,23 +503,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0xfbf50cdb. +// Initialize is a paid mutator transaction binding the contract method 0x9cb44341. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint8,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 0xfbf50cdb. +// Initialize is a paid mutator transaction binding the contract method 0x9cb44341. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint8,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 0xfbf50cdb. +// Initialize is a paid mutator transaction binding the contract method 0x9cb44341. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint8,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/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index a5ad21469..6d61c0bd8 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -36,7 +36,7 @@ type PoSValidatorManagerSettings struct { MaximumStakeAmount *big.Int MinimumStakeDuration uint64 MinimumDelegationFee *big.Int - MaximumStakeMultiplier uint64 + MaximumStakeMultiplier uint8 RewardCalculator common.Address } @@ -62,8 +62,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\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161499338038061499383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148468061014d5f395ff3fe608060405260043610610110575f3560e01c8063620658561161009d578063a3a65e4811610062578063a3a65e4814610319578063b771b3bc14610338578063bee0a03f1461036a578063c599e24f14610389578063dac806231461039c575f80fd5b8063620658561461027e57806366435abf1461029d5780636d0e43fa146102bc57806376f78621146102db57806398f3e2b4146102fa575f80fd5b8063151d30d1116100e3578063151d30d1146101c4578063162f1f61146101ea5780632e2194d814610209578063467ef06f146102405780635297fae61461025f575f80fd5b80630118acc4146101145780630322ed98146101355780630cdd098514610154578063104595c4146101b1575b5f80fd5b34801561011f575f80fd5b5061013361012e366004613f33565b6103bb565b005b348015610140575f80fd5b5061013361014f366004613f6e565b610846565b34801561015f575f80fd5b5061019e61016e366004613f6e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61019e6101bf366004613f85565b6109a2565b3480156101cf575f80fd5b506101d8600a81565b60405160ff90911681526020016101a8565b3480156101f5575f80fd5b50610133610204366004613f6e565b6109d4565b348015610214575f80fd5b50610228610223366004613f6e565b610a41565b6040516001600160401b0390911681526020016101a8565b34801561024b575f80fd5b5061013361025a366004613fde565b610a51565b34801561026a575f80fd5b50610133610279366004613ff7565b610a7c565b348015610289575f80fd5b5061019e61029836600461401f565b610c6d565b3480156102a8575f80fd5b506102286102b7366004613f6e565b610c86565b3480156102c7575f80fd5b506101336102d6366004613f6e565b610c9a565b3480156102e6575f80fd5b506101336102f5366004613f33565b610d07565b348015610305575f80fd5b50610133610314366004613ff7565b610dd9565b348015610324575f80fd5b50610133610333366004613fde565b611009565b348015610343575f80fd5b506103526005600160991b0181565b6040516001600160a01b0390911681526020016101a8565b348015610375575f80fd5b50610133610384366004613f6e565b6111c6565b61019e610397366004613f6e565b611295565b3480156103a7575f80fd5b506101336103b6366004614045565b6112a1565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061479a83398151915291841561040d5761040a8285611383565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561043f5761043f61405c565b60048111156104505761045061405c565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104d7576104d761405c565b146105295760405162461bcd60e51b815260206004820152602a60248201525f805160206147ba8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461058e5760405162461bcd60e51b815260206004820152603360248201525f805160206147ba8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610520565b5f6105988461161f565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105e5576105e561405c565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106b785611693565b905082606001516001600160401b03168160a001516001600160401b03161161072e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610520565b5f83606001518260a001516107439190614084565b905061074f8682611772565b5f61075b8785846117ba565b5f8c815260088a01602052604090209091506107778282614135565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906107a4908590600401614216565b6020604051808303815f875af11580156107c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e49190614248565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206147da83398151915292919061088e906140bf565b90501180156108c0575060035f83815260078301602052604090205460ff1660058111156108be576108be61405c565b145b6109245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610520565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161095d919060040161425f565b6020604051808303815f875af1158015610979573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099d9190614248565b505050565b5f6109ab6119d9565b6109b6838334611a10565b90506109ce60015f805160206147fa83398151915255565b92915050565b6109dd81611bef565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f8051602061479a833981519152916005600160991b019163ee5b48eb9161095d9160040161425f565b5f6109ce64e8d4a51000836142fd565b5f610a5b82611cbe565b9050610a7881606001516001600160401b0316826040015161204b565b5050565b5f8051602061479a8339815191525f610a948461205e565b90505f80610aa5836040015161223f565b5091509150610ab38561247a565b5f8581526007850160205260408120610acb91613e7b565b5f610ad583611693565b9050816001600160401b031681608001516001600160401b03161015610b0d5760405162461bcd60e51b815260040161052090614310565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b525760405162461bcd60e51b815260040161052090614352565b60015f87815260068701602052604090205460ff166004811115610b7857610b7861405c565b14610be15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610520565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109ce6001600160401b03831664e8d4a5100061439b565b5f610c9082611693565b60a0015192915050565b610ca38161247a565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f8051602061479a833981519152916005600160991b019163ee5b48eb9161095d9160040161425f565b5f8051602061479a8339815191525f610d1f85611693565b5f86815260058401602052604090206001015460c0820151919250610d4c916001600160401b03166143b2565b421015610db75760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610520565b8315610dc957610dc78584611383565b505b610dd285612553565b5050505050565b5f8051602061479a8339815191525f610df18461205e565b90505f80610e02836040015161223f565b5091509150610e1085611bef565b5f8581526008850160205260408120610e2891613e7b565b5f610e3283611693565b9050816001600160401b031681608001516001600160401b03161015610e6a5760405162461bcd60e51b815260040161052090614310565b5f8681526006860160205260409020600301546001600160401b0380841691161115610ea85760405162461bcd60e51b815260040161052090614352565b60035f87815260068701602052604090205460ff166004811115610ece57610ece61405c565b14610f225760405162461bcd60e51b815260206004820152603160248201525f805160206147ba8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610520565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610fc79161204b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206147da8339815191525f6110218361205e565b90505f80611032836040015161290b565b91509150806110945760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610520565b5f828152600585016020526040812080546110ae906140bf565b90501180156110e0575060015f83815260078601602052604090205460ff1660058111156110de576110de61405c565b145b6110fc5760405162461bcd60e51b8152600401610520906143c5565b5f828152600585016020526040812061111491613e7b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147da83398151915292919061120e906140bf565b9050118015611240575060015f83815260078301602052604090205460ff16600581111561123e5761123e61405c565b145b61125c5760405162461bcd60e51b8152600401610520906143c5565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161095d919060040161425f565b5f6109ce823334612aac565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806112ea575080546001600160401b03808416911610155b156113085760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561133283612edd565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113ce573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113f59190810190614483565b91509150806114585760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610520565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561149b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114bf9190614248565b8251146115235760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610520565b60208201516001600160a01b0316156115995760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610520565b5f806115a88460400151612ef1565b915091508187146116155760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610520565b9695505050505050565b5f8181525f8051602061481a8339815191526020526040812060030180545f805160206147da833981519152916001600160401b03909116908190846116648361456b565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61169b613eb2565b5f8281525f8051602061481a8339815191526020526040908190208151610100810190925280545f805160206147da833981519152929190829060ff1660058111156116e9576116e961405c565b60058111156116fa576116fa61405c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061481a833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611833576117f3816001614590565b6117fe90600861439b565b5081515f90839083908110611815576118156145a3565b60200101906001600160f81b03191690815f1a9053506001016117df565b505f5b60048110156118965761184a816003614590565b61185590600861439b565b6001901c60f81b826118688360026143b2565b81518110611878576118786145a3565b60200101906001600160f81b03191690815f1a905350600101611836565b505f5b60208110156118f8576118ad81601f614590565b6118b890600861439b565b86901c60f81b826118ca8360066143b2565b815181106118da576118da6145a3565b60200101906001600160f81b03191690815f1a905350600101611899565b505f5b60088110156119635761190f816007614590565b61191a90600861439b565b6001600160401b038616901c60f81b826119358360266143b2565b81518110611945576119456145a3565b60200101906001600160f81b03191690815f1a9053506001016118fb565b505f5b60088110156119ce5761197a816007614590565b61198590600861439b565b6001600160401b038516901c60f81b826119a083602e6143b2565b815181106119b0576119b06145a3565b60200101906001600160f81b03191690815f1a905350600101611966565b5090505b9392505050565b5f805160206147fa833981519152805460011901611a0a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061479a833981519152906001600160401b031660208501351015611ab75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610520565b600381015484351015611b205760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610520565b80548310801590611b35575080600101548311155b611b935760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610520565b825f611b9e82610a41565b90505f611bab88836130c9565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f805160206147fa83398151915255565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f8051602061479a833981519152929190611c37906140bf565b9050118015611c69575060035f83815260068301602052604090205460ff166004811115611c6757611c6761405c565b145b610a785760405162461bcd60e51b815260206004820152603360248201525f805160206147ba83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610520565b611cc6613eb2565b5f805160206147da8339815191525f611cde8461205e565b90505f80611cef836040015161290b565b915091508015611d545760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610520565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611d8657611d8661405c565b6005811115611d9757611d9761405c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611e1e57611e1e61405c565b1480611e3c5750600182516005811115611e3a57611e3a61405c565b145b611e9b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610520565b600382516005811115611eb057611eb061405c565b03611ed757505f8381526006860160205260408120600491611ed29190613e7b565b611edb565b5060055b6020808301515f90815260088801909152604081205581816005811115611f0457611f0461405c565b90816005811115611f1757611f1761405c565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611f4b57611f4b61405c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156120165761201661405c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a786001600160a01b03821683613596565b60408051606080820183525f8083526020830181905292820152905f805160206147da8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120d3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120fa9190810190614483565b91509150806121615760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610520565b82548251146121c45760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610520565b60208201516001600160a01b0316156122375760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610520565b509392505050565b5f805f83516036146122635760405162461bcd60e51b8152600401610520906145b7565b5f805b60028110156122b25761227a816001614590565b61228590600861439b565b61ffff1686828151811061229b5761229b6145a3565b016020015160f81c901b9190911790600101612266565b5061ffff8116156122d55760405162461bcd60e51b815260040161052090614600565b5f805b6004811015612330576122ec816003614590565b6122f790600861439b565b63ffffffff16876123098360026143b2565b81518110612319576123196145a3565b016020015160f81c901b91909117906001016122d8565b5063ffffffff81166003146123575760405162461bcd60e51b815260040161052090614643565b5f805b60208110156123ac5761236e81601f614590565b61237990600861439b565b886123858360066143b2565b81518110612395576123956145a3565b016020015160f81c901b919091179060010161235a565b505f805b600881101561240b576123c4816007614590565b6123cf90600861439b565b6001600160401b0316896123e48360266143b2565b815181106123f4576123f46145a3565b016020015160f81c901b91909117906001016123b0565b505f805b600881101561246a57612423816007614590565b61242e90600861439b565b6001600160401b03168a61244383602e6143b2565b81518110612453576124536145a3565b016020015160f81c901b919091179060010161240f565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f8051602061479a8339815191529291906124c2906140bf565b90501180156124f4575060015f83815260068301602052604090205460ff1660048111156124f2576124f261405c565b145b610a785760405162461bcd60e51b815260206004820152603860248201525f805160206147ba83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610520565b5f8181525f8051602061481a83398151915260205260408082208151610100810190925280545f805160206147da83398151915293929190829060ff1660058111156125a1576125a161405c565b60058111156125b2576125b261405c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561263a5761263a61405c565b146126965760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610520565b60408101516001600160a01b0316336001600160a01b0316146127105760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610520565b61271d8160a00151613629565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156127615761276161405c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61282d846128278161161f565b5f6117ba565b5f85815260068501602052604090209091506128498282614135565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612876908590600401614216565b6020604051808303815f875af1158015612892573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128b69190614248565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461292e5760405162461bcd60e51b8152600401610520906145b7565b5f805b600281101561297d57612945816001614590565b61295090600861439b565b61ffff16858281518110612966576129666145a3565b016020015160f81c901b9190911790600101612931565b5061ffff8116156129a05760405162461bcd60e51b815260040161052090614600565b5f805b60048110156129fb576129b7816003614590565b6129c290600861439b565b63ffffffff16866129d48360026143b2565b815181106129e4576129e46145a3565b016020015160f81c901b91909117906001016129a3565b5063ffffffff8116600214612a225760405162461bcd60e51b815260040161052090614643565b5f805b6020811015612a7757612a3981601f614590565b612a4490600861439b565b87612a508360066143b2565b81518110612a6057612a606145a3565b016020015160f81c901b9190911790600101612a25565b505f86602681518110612a8c57612a8c6145a3565b016020015191976001600160f81b03199092161515965090945050505050565b5f612ab56119d9565b5f8051602061479a8339815191525f612acd84610a41565b90505f612ad987611693565b9050600281516005811115612af057612af061405c565b14612b4f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610520565b5f828260a00151612b60919061468a565b60048501546001860154919250612b82916001600160401b039091169061439b565b612b8b82610c6d565b1115612bf75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610520565b612c018882611772565b5f612c0b8961161f565b90505f8982604051602001612c3792919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612c5885613629565b5f612c648b84866117ba565b5f8381526007890160205260409020909150612c808282614135565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cad908590600401614216565b6020604051808303815f875af1158015612cc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ced9190614248565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612d9c57612d9c61405c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506119d260015f805160206147fa83398151915255565b612ee56137ca565b612eee81613815565b50565b5f808251602e14612f145760405162461bcd60e51b8152600401610520906145b7565b5f805b6002811015612f6357612f2b816001614590565b612f3690600861439b565b61ffff16858281518110612f4c57612f4c6145a3565b016020015160f81c901b9190911790600101612f17565b5061ffff811615612f865760405162461bcd60e51b815260040161052090614600565b5f805b6004811015612fe157612f9d816003614590565b612fa890600861439b565b63ffffffff1686612fba8360026143b2565b81518110612fca57612fca6145a3565b016020015160f81c901b9190911790600101612f89565b5063ffffffff81166004146130085760405162461bcd60e51b815260040161052090614643565b5f805b602081101561305d5761301f81601f614590565b61302a90600861439b565b876130368360066143b2565b81518110613046576130466145a3565b016020015160f81c901b919091179060010161300b565b505f805b60088110156130bc57613075816007614590565b61308090600861439b565b6001600160401b0316886130958360266143b2565b815181106130a5576130a56145a3565b016020015160f81c901b9190911790600101613061565b5090969095509350505050565b5f5f805160206147da833981519152426130e9604086016020870161401f565b6001600160401b0316118015613122575061310a604085016020860161401f565b6001600160401b0316613120426202a3006143b2565b115b6131845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610520565b83356131dc5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610520565b83355f9081526008820160205260409020541561324c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610520565b61325960408501856146aa565b90506030146132c05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610520565b6132c983613629565b5f806133636040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061330e919061401f565b6001600160401b0316815260200161332960408a018a6146aa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613870565b5f828152600586016020526040902091935091506133818282614135565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906133ae908590600401614216565b6020604051808303815f875af11580156133ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133ee9190614248565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff191660018360058111156134705761347061405c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556135318361161f565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961356860408d0160208e0161401f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156135b95760405163cd78605960e01b8152306004820152602401610520565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613602576040519150601f19603f3d011682016040523d82523d5f602084013e613607565b606091505b505090508061099d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147da8339815191529060ff165f03613667575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906136af9083614590565b106136cb576001600160401b03841660408301528082526136ea565b83826040018181516136dd919061468a565b6001600160401b03169052505b5f82602001518360400151606461370191906146f3565b61370b919061471e565b600285015490915060ff90811690821611156137865760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610520565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661381357604051631afcd79f60e31b815260040160405180910390fd5b565b61381d6137ca565b61382681613c15565b612eee6060820135608083013561384360c0850160a0860161401f565b60c0850135613859610100870160e0880161401f565b61386b61012088016101008901614743565b613c36565b5f60608260800151516030146138da5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610520565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561395157613911816001614590565b61391c90600861439b565b5081515f90839083908110613933576139336145a3565b60200101906001600160f81b03191690815f1a9053506001016138fd565b505f5b60048110156139af57613968816003614590565b61397390600861439b565b505f826139818360026143b2565b81518110613991576139916145a3565b60200101906001600160f81b03191690815f1a905350600101613954565b505f5b6020811015613a0c57845181602081106139ce576139ce6145a3565b1a60f81b826139de8360066143b2565b815181106139ee576139ee6145a3565b60200101906001600160f81b03191690815f1a9053506001016139b2565b505f5b6020811015613a6c5784602001518160208110613a2e57613a2e6145a3565b1a60f81b82613a3e8360266143b2565b81518110613a4e57613a4e6145a3565b60200101906001600160f81b03191690815f1a905350600101613a0f565b505f5b6008811015613ae057613a83816007614590565b613a8e90600861439b565b60ff1685604001516001600160401b0316901c60f81b82826046613ab291906143b2565b81518110613ac257613ac26145a3565b60200101906001600160f81b03191690815f1a905350600101613a6f565b505f5b6030811015613b4b5784608001518181518110613b0257613b026145a3565b01602001516001600160f81b03191682613b1d83604e6143b2565b81518110613b2d57613b2d6145a3565b60200101906001600160f81b03191690815f1a905350600101613ae3565b505f5b6008811015613bbd57613b62816007614590565b613b6d90600861439b565b60608601516001600160401b0390811691161c60f81b82613b8f83607e6143b2565b81518110613b9f57613b9f6145a3565b60200101906001600160f81b03191690815f1a905350600101613b4e565b50600281604051613bce919061475e565b602060405180830381855afa158015613be9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c0c9190614248565b94909350915050565b613c1d6137ca565b613c25613def565b613c2d613dff565b612eee81613e07565b613c3e6137ca565b5f8051602061479a83398151915283613caa5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610520565b85871115613d125760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610520565b600a6001600160401b0384161115613d8a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610520565b95865560018601949094556002850180546001600160401b0394851667ffffffffffffffff199091161790556003850191909155600490930180546001600160a01b03909316600160401b026001600160e01b03199093169390911692909217179055565b613df76137ca565b613813613e73565b6138136137ca565b613e0f6137ca565b80355f805160206147da83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e596060830160408401614779565b600291909101805460ff191660ff90921691909117905550565b611bdc6137ca565b508054613e87906140bf565b5f825580601f10613e96575050565b601f0160209004905f5260205f2090810190612eee9190613ef6565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613f0a575f8155600101613ef7565b5090565b8015158114612eee575f80fd5b803563ffffffff81168114613f2e575f80fd5b919050565b5f805f60608486031215613f45575f80fd5b833592506020840135613f5781613f0e565b9150613f6560408501613f1b565b90509250925092565b5f60208284031215613f7e575f80fd5b5035919050565b5f808284036060811215613f97575f80fd5b83356001600160401b03811115613fac575f80fd5b840160608187031215613fbd575f80fd5b92506040601f1982011215613fd0575f80fd5b506020830190509250929050565b5f60208284031215613fee575f80fd5b6119d282613f1b565b5f8060408385031215614008575f80fd5b61401183613f1b565b946020939093013593505050565b5f6020828403121561402f575f80fd5b81356001600160401b03811681146119d2575f80fd5b5f6101208284031215614056575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140a4576140a4614070565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806140d357607f821691505b60208210810361405657634e487b7160e01b5f52602260045260245ffd5b601f82111561099d57805f5260205f20601f840160051c810160208510156141165750805b601f840160051c820191505b81811015610dd2575f8155600101614122565b81516001600160401b0381111561414e5761414e6140ab565b6141628161415c84546140bf565b846140f1565b602080601f831160018114614195575f841561417e5750858301515b5f19600386901b1c1916600185901b1785556141ec565b5f85815260208120601f198616915b828110156141c3578886015182559484019460019091019084016141a4565b50858210156141e057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561420e5781810151838201526020016141f6565b50505f910152565b602081525f82518060208401526142348160408501602087016141f4565b601f01601f19169190910160400192915050565b5f60208284031215614258575f80fd5b5051919050565b5f60208083525f8454614271816140bf565b806020870152604060018084165f811461429257600181146142ae576142db565b60ff19851660408a0152604084151560051b8a010195506142db565b895f5260205f205f5b858110156142d25781548b82018601529083019088016142b7565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261430b5761430b6142e9565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109ce576109ce614070565b808201808211156109ce576109ce614070565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b038111828210171561442e5761442e6140ab565b60405290565b604051601f8201601f191681016001600160401b038111828210171561445c5761445c6140ab565b604052919050565b6001600160a01b0381168114612eee575f80fd5b8051613f2e81613f0e565b5f8060408385031215614494575f80fd5b82516001600160401b03808211156144aa575f80fd5b90840190606082870312156144bd575f80fd5b6144c561440c565b825181526020808401516144d881614464565b828201526040840151838111156144ed575f80fd5b80850194505087601f850112614501575f80fd5b835183811115614513576145136140ab565b614525601f8201601f19168301614434565b9350808452888282870101111561453a575f80fd5b614549818386018488016141f4565b5082604083015281955061455e818801614478565b9450505050509250929050565b5f6001600160401b0380831681810361458657614586614070565b6001019392505050565b818103818111156109ce576109ce614070565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160190808211156140a4576140a4614070565b5f808335601e198436030181126146bf575f80fd5b8301803591506001600160401b038211156146d8575f80fd5b6020019150368190038213156146ec575f80fd5b9250929050565b6001600160401b0381811683821602808216919082811461471657614716614070565b505092915050565b5f6001600160401b0380841680614737576147376142e9565b92169190910492915050565b5f60208284031215614753575f80fd5b81356119d281614464565b5f825161476f8184602087016141f4565b9190910192915050565b5f60208284031215614789575f80fd5b813560ff811681146119d2575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516149b53803806149b583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148688061014d5f395ff3fe608060405260043610610110575f3560e01c80635297fae61161009d57806398f3e2b41161006257806398f3e2b414610319578063a3a65e4814610338578063b771b3bc14610357578063bee0a03f14610389578063c599e24f146103a8575f80fd5b80635297fae61461027e578063620658561461029d57806366435abf146102bc5780636d0e43fa146102db57806376f78621146102fa575f80fd5b8063151d30d1116100e3578063151d30d1146101c4578063162f1f61146101ea5780632e2194d8146102095780634565701714610240578063467ef06f1461025f575f80fd5b80630118acc4146101145780630322ed98146101355780630cdd098514610154578063104595c4146101b1575b5f80fd5b34801561011f575f80fd5b5061013361012e366004613f0d565b6103bb565b005b348015610140575f80fd5b5061013361014f366004613f48565b610846565b34801561015f575f80fd5b5061019e61016e366004613f48565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61019e6101bf366004613f5f565b6109a2565b3480156101cf575f80fd5b506101d8600a81565b60405160ff90911681526020016101a8565b3480156101f5575f80fd5b50610133610204366004613f48565b6109d4565b348015610214575f80fd5b50610228610223366004613f48565b610a41565b6040516001600160401b0390911681526020016101a8565b34801561024b575f80fd5b5061013361025a366004613fb8565b610a51565b34801561026a575f80fd5b50610133610279366004613fcf565b610b33565b348015610289575f80fd5b50610133610298366004613fe8565b610b5e565b3480156102a8575f80fd5b5061019e6102b7366004614010565b610d4f565b3480156102c7575f80fd5b506102286102d6366004613f48565b610d68565b3480156102e6575f80fd5b506101336102f5366004613f48565b610d7c565b348015610305575f80fd5b50610133610314366004613f0d565b610de9565b348015610324575f80fd5b50610133610333366004613fe8565b610ebb565b348015610343575f80fd5b50610133610352366004613fcf565b6110eb565b348015610362575f80fd5b506103716005600160991b0181565b6040516001600160a01b0390911681526020016101a8565b348015610394575f80fd5b506101336103a3366004613f48565b6112a8565b61019e6103b6366004613f48565b611377565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206147bc83398151915291841561040d5761040a8285611383565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561043f5761043f614036565b600481111561045057610450614036565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104d7576104d7614036565b146105295760405162461bcd60e51b815260206004820152602a60248201525f805160206147dc8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461058e5760405162461bcd60e51b815260206004820152603360248201525f805160206147dc8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610520565b5f6105988461161f565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105e5576105e5614036565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106b785611693565b905082606001516001600160401b03168160a001516001600160401b03161161072e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610520565b5f83606001518260a00151610743919061405e565b905061074f8682611772565b5f61075b8785846117ba565b5f8c815260088a0160205260409020909150610777828261410f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906107a49085906004016141f0565b6020604051808303815f875af11580156107c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e49190614222565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206147fc83398151915292919061088e90614099565b90501180156108c0575060035f83815260078301602052604090205460ff1660058111156108be576108be614036565b145b6109245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610520565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161095d9190600401614239565b6020604051808303815f875af1158015610979573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099d9190614222565b505050565b5f6109ab6119d9565b6109b6838334611a10565b90506109ce60015f8051602061481c83398151915255565b92915050565b6109dd81611bef565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f805160206147bc833981519152916005600160991b019163ee5b48eb9161095d91600401614239565b5f6109ce64e8d4a51000836142d7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a9a575080546001600160401b03808416911610155b15610ab85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ae283611cbe565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b3d82611cd2565b9050610b5a81606001516001600160401b0316826040015161205f565b5050565b5f805160206147bc8339815191525f610b7684612072565b90505f80610b878360400151612253565b5091509150610b958561248e565b5f8581526007850160205260408120610bad91613e55565b5f610bb783611693565b9050816001600160401b031681608001516001600160401b03161015610bef5760405162461bcd60e51b8152600401610520906142ea565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c345760405162461bcd60e51b81526004016105209061432c565b60015f87815260068701602052604090205460ff166004811115610c5a57610c5a614036565b14610cc35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610520565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109ce6001600160401b03831664e8d4a51000614375565b5f610d7282611693565b60a0015192915050565b610d858161248e565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f805160206147bc833981519152916005600160991b019163ee5b48eb9161095d91600401614239565b5f805160206147bc8339815191525f610e0185611693565b5f86815260058401602052604090206001015460c0820151919250610e2e916001600160401b031661438c565b421015610e995760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610520565b8315610eab57610ea98584611383565b505b610eb485612567565b5050505050565b5f805160206147bc8339815191525f610ed384612072565b90505f80610ee48360400151612253565b5091509150610ef285611bef565b5f8581526008850160205260408120610f0a91613e55565b5f610f1483611693565b9050816001600160401b031681608001516001600160401b03161015610f4c5760405162461bcd60e51b8152600401610520906142ea565b5f8681526006860160205260409020600301546001600160401b0380841691161115610f8a5760405162461bcd60e51b81526004016105209061432c565b60035f87815260068701602052604090205460ff166004811115610fb057610fb0614036565b146110045760405162461bcd60e51b815260206004820152603160248201525f805160206147dc8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610520565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526110a99161205f565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206147fc8339815191525f61110383612072565b90505f80611114836040015161291f565b91509150806111765760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610520565b5f8281526005850160205260408120805461119090614099565b90501180156111c2575060015f83815260078601602052604090205460ff1660058111156111c0576111c0614036565b145b6111de5760405162461bcd60e51b81526004016105209061439f565b5f82815260058501602052604081206111f691613e55565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147fc8339815191529291906112f090614099565b9050118015611322575060015f83815260078301602052604090205460ff16600581111561132057611320614036565b145b61133e5760405162461bcd60e51b81526004016105209061439f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161095d9190600401614239565b5f6109ce823334612ac0565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113ce573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113f5919081019061445d565b91509150806114585760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610520565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561149b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114bf9190614222565b8251146115235760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610520565b60208201516001600160a01b0316156115995760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610520565b5f806115a88460400151612ef1565b915091508187146116155760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610520565b9695505050505050565b5f8181525f8051602061483c8339815191526020526040812060030180545f805160206147fc833981519152916001600160401b039091169081908461166483614545565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61169b613e8c565b5f8281525f8051602061483c8339815191526020526040908190208151610100810190925280545f805160206147fc833981519152929190829060ff1660058111156116e9576116e9614036565b60058111156116fa576116fa614036565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061483c833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611833576117f381600161456a565b6117fe906008614375565b5081515f908390839081106118155761181561457d565b60200101906001600160f81b03191690815f1a9053506001016117df565b505f5b60048110156118965761184a81600361456a565b611855906008614375565b6001901c60f81b8261186883600261438c565b815181106118785761187861457d565b60200101906001600160f81b03191690815f1a905350600101611836565b505f5b60208110156118f8576118ad81601f61456a565b6118b8906008614375565b86901c60f81b826118ca83600661438c565b815181106118da576118da61457d565b60200101906001600160f81b03191690815f1a905350600101611899565b505f5b60088110156119635761190f81600761456a565b61191a906008614375565b6001600160401b038616901c60f81b8261193583602661438c565b815181106119455761194561457d565b60200101906001600160f81b03191690815f1a9053506001016118fb565b505f5b60088110156119ce5761197a81600761456a565b611985906008614375565b6001600160401b038516901c60f81b826119a083602e61438c565b815181106119b0576119b061457d565b60200101906001600160f81b03191690815f1a905350600101611966565b5090505b9392505050565b5f8051602061481c833981519152805460011901611a0a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206147bc833981519152906001600160401b031660208501351015611ab75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610520565b600381015484351015611b205760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610520565b80548310801590611b35575080600101548311155b611b935760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610520565b825f611b9e82610a41565b90505f611bab88836130c9565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f8051602061481c83398151915255565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f805160206147bc833981519152929190611c3790614099565b9050118015611c69575060035f83815260068301602052604090205460ff166004811115611c6757611c67614036565b145b610b5a5760405162461bcd60e51b815260206004820152603360248201525f805160206147dc83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610520565b611cc6613596565b611ccf816135e1565b50565b611cda613e8c565b5f805160206147fc8339815191525f611cf284612072565b90505f80611d03836040015161291f565b915091508015611d685760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610520565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611d9a57611d9a614036565b6005811115611dab57611dab614036565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611e3257611e32614036565b1480611e505750600182516005811115611e4e57611e4e614036565b145b611eaf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610520565b600382516005811115611ec457611ec4614036565b03611eeb57505f8381526006860160205260408120600491611ee69190613e55565b611eef565b5060055b6020808301515f90815260088801909152604081205581816005811115611f1857611f18614036565b90816005811115611f2b57611f2b614036565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611f5f57611f5f614036565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561202a5761202a614036565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610b5a6001600160a01b0382168361363c565b60408051606080820183525f8083526020830181905292820152905f805160206147fc8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120e7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261210e919081019061445d565b91509150806121755760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610520565b82548251146121d85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610520565b60208201516001600160a01b03161561224b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610520565b509392505050565b5f805f83516036146122775760405162461bcd60e51b815260040161052090614591565b5f805b60028110156122c65761228e81600161456a565b612299906008614375565b61ffff168682815181106122af576122af61457d565b016020015160f81c901b919091179060010161227a565b5061ffff8116156122e95760405162461bcd60e51b8152600401610520906145da565b5f805b60048110156123445761230081600361456a565b61230b906008614375565b63ffffffff168761231d83600261438c565b8151811061232d5761232d61457d565b016020015160f81c901b91909117906001016122ec565b5063ffffffff811660031461236b5760405162461bcd60e51b81526004016105209061461d565b5f805b60208110156123c05761238281601f61456a565b61238d906008614375565b8861239983600661438c565b815181106123a9576123a961457d565b016020015160f81c901b919091179060010161236e565b505f805b600881101561241f576123d881600761456a565b6123e3906008614375565b6001600160401b0316896123f883602661438c565b815181106124085761240861457d565b016020015160f81c901b91909117906001016123c4565b505f805b600881101561247e5761243781600761456a565b612442906008614375565b6001600160401b03168a61245783602e61438c565b815181106124675761246761457d565b016020015160f81c901b9190911790600101612423565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f805160206147bc8339815191529291906124d690614099565b9050118015612508575060015f83815260068301602052604090205460ff16600481111561250657612506614036565b145b610b5a5760405162461bcd60e51b815260206004820152603860248201525f805160206147dc83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610520565b5f8181525f8051602061483c83398151915260205260408082208151610100810190925280545f805160206147fc83398151915293929190829060ff1660058111156125b5576125b5614036565b60058111156125c6576125c6614036565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561264e5761264e614036565b146126aa5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610520565b60408101516001600160a01b0316336001600160a01b0316146127245760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610520565b6127318160a001516136cf565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561277557612775614036565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6128418461283b8161161f565b5f6117ba565b5f858152600685016020526040902090915061285d828261410f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061288a9085906004016141f0565b6020604051808303815f875af11580156128a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ca9190614222565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146129425760405162461bcd60e51b815260040161052090614591565b5f805b60028110156129915761295981600161456a565b612964906008614375565b61ffff1685828151811061297a5761297a61457d565b016020015160f81c901b9190911790600101612945565b5061ffff8116156129b45760405162461bcd60e51b8152600401610520906145da565b5f805b6004811015612a0f576129cb81600361456a565b6129d6906008614375565b63ffffffff16866129e883600261438c565b815181106129f8576129f861457d565b016020015160f81c901b91909117906001016129b7565b5063ffffffff8116600214612a365760405162461bcd60e51b81526004016105209061461d565b5f805b6020811015612a8b57612a4d81601f61456a565b612a58906008614375565b87612a6483600661438c565b81518110612a7457612a7461457d565b016020015160f81c901b9190911790600101612a39565b505f86602681518110612aa057612aa061457d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612ac96119d9565b5f805160206147bc8339815191525f612ae184610a41565b90505f612aed87611693565b9050600281516005811115612b0457612b04614036565b14612b635760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610520565b5f828260a00151612b749190614664565b60048501546001860154919250612b96916001600160401b0390911690614375565b612b9f82610d4f565b1115612c0b5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610520565b612c158882611772565b5f612c1f8961161f565b90505f8982604051602001612c4b92919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612c6c856136cf565b5f612c788b84866117ba565b5f8381526007890160205260409020909150612c94828261410f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cc19085906004016141f0565b6020604051808303815f875af1158015612cdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d019190614222565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612db057612db0614036565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506119d260015f8051602061481c83398151915255565b5f808251602e14612f145760405162461bcd60e51b815260040161052090614591565b5f805b6002811015612f6357612f2b81600161456a565b612f36906008614375565b61ffff16858281518110612f4c57612f4c61457d565b016020015160f81c901b9190911790600101612f17565b5061ffff811615612f865760405162461bcd60e51b8152600401610520906145da565b5f805b6004811015612fe157612f9d81600361456a565b612fa8906008614375565b63ffffffff1686612fba83600261438c565b81518110612fca57612fca61457d565b016020015160f81c901b9190911790600101612f89565b5063ffffffff81166004146130085760405162461bcd60e51b81526004016105209061461d565b5f805b602081101561305d5761301f81601f61456a565b61302a906008614375565b8761303683600661438c565b815181106130465761304661457d565b016020015160f81c901b919091179060010161300b565b505f805b60088110156130bc5761307581600761456a565b613080906008614375565b6001600160401b03168861309583602661438c565b815181106130a5576130a561457d565b016020015160f81c901b9190911790600101613061565b5090969095509350505050565b5f5f805160206147fc833981519152426130e96040860160208701614010565b6001600160401b0316118015613122575061310a6040850160208601614010565b6001600160401b0316613120426202a30061438c565b115b6131845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610520565b83356131dc5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610520565b83355f9081526008820160205260409020541561324c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610520565b6132596040850185614684565b90506030146132c05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610520565b6132c9836136cf565b5f806133636040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061330e9190614010565b6001600160401b0316815260200161332960408a018a614684565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613870565b5f82815260058601602052604090209193509150613381828261410f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906133ae9085906004016141f0565b6020604051808303815f875af11580156133ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133ee9190614222565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561347057613470614036565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556135318361161f565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961356860408d0160208e01614010565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166135df57604051631afcd79f60e31b815260040160405180910390fd5b565b6135e9613596565b6135f281613c15565b611ccf6060820135608083013561360f60c0850160a08601614010565b60c0850135613625610100870160e088016146cd565b613637610120880161010089016146ed565b613c36565b8047101561365f5760405163cd78605960e01b8152306004820152602401610520565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146136a8576040519150601f19603f3d011682016040523d82523d5f602084013e6136ad565b606091505b505090508061099d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147fc8339815191529060ff165f0361370d575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613755908361456a565b10613771576001600160401b0384166040830152808252613790565b83826040018181516137839190614664565b6001600160401b03169052505b5f8260200151836040015160646137a79190614708565b6137b19190614733565b600285015490915060ff908116908216111561382c5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610520565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f60608260800151516030146138da5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610520565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156139515761391181600161456a565b61391c906008614375565b5081515f908390839081106139335761393361457d565b60200101906001600160f81b03191690815f1a9053506001016138fd565b505f5b60048110156139af5761396881600361456a565b613973906008614375565b505f8261398183600261438c565b815181106139915761399161457d565b60200101906001600160f81b03191690815f1a905350600101613954565b505f5b6020811015613a0c57845181602081106139ce576139ce61457d565b1a60f81b826139de83600661438c565b815181106139ee576139ee61457d565b60200101906001600160f81b03191690815f1a9053506001016139b2565b505f5b6020811015613a6c5784602001518160208110613a2e57613a2e61457d565b1a60f81b82613a3e83602661438c565b81518110613a4e57613a4e61457d565b60200101906001600160f81b03191690815f1a905350600101613a0f565b505f5b6008811015613ae057613a8381600761456a565b613a8e906008614375565b60ff1685604001516001600160401b0316901c60f81b82826046613ab2919061438c565b81518110613ac257613ac261457d565b60200101906001600160f81b03191690815f1a905350600101613a6f565b505f5b6030811015613b4b5784608001518181518110613b0257613b0261457d565b01602001516001600160f81b03191682613b1d83604e61438c565b81518110613b2d57613b2d61457d565b60200101906001600160f81b03191690815f1a905350600101613ae3565b505f5b6008811015613bbd57613b6281600761456a565b613b6d906008614375565b60608601516001600160401b0390811691161c60f81b82613b8f83607e61438c565b81518110613b9f57613b9f61457d565b60200101906001600160f81b03191690815f1a905350600101613b4e565b50600281604051613bce9190614758565b602060405180830381855afa158015613be9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c0c9190614222565b94909350915050565b613c1d613596565b613c25613dc9565b613c2d613dd9565b611ccf81613de1565b613c3e613596565b5f805160206147bc83398151915283613c695760405162461bcd60e51b815260040161052090614773565b85871115613cd15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610520565b600a60ff84161115613d435760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610520565b5f8411613d625760405162461bcd60e51b815260040161052090614773565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b613dd1613596565b6135df613e4d565b6135df613596565b613de9613596565b80355f805160206147fc83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e3360608301604084016146cd565b600291909101805460ff191660ff90921691909117905550565b611bdc613596565b508054613e6190614099565b5f825580601f10613e70575050565b601f0160209004905f5260205f2090810190611ccf9190613ed0565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613ee4575f8155600101613ed1565b5090565b8015158114611ccf575f80fd5b803563ffffffff81168114613f08575f80fd5b919050565b5f805f60608486031215613f1f575f80fd5b833592506020840135613f3181613ee8565b9150613f3f60408501613ef5565b90509250925092565b5f60208284031215613f58575f80fd5b5035919050565b5f808284036060811215613f71575f80fd5b83356001600160401b03811115613f86575f80fd5b840160608187031215613f97575f80fd5b92506040601f1982011215613faa575f80fd5b506020830190509250929050565b5f6101208284031215613fc9575f80fd5b50919050565b5f60208284031215613fdf575f80fd5b6119d282613ef5565b5f8060408385031215613ff9575f80fd5b61400283613ef5565b946020939093013593505050565b5f60208284031215614020575f80fd5b81356001600160401b03811681146119d2575f80fd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561407e5761407e61404a565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806140ad57607f821691505b602082108103613fc957634e487b7160e01b5f52602260045260245ffd5b601f82111561099d57805f5260205f20601f840160051c810160208510156140f05750805b601f840160051c820191505b81811015610eb4575f81556001016140fc565b81516001600160401b0381111561412857614128614085565b61413c816141368454614099565b846140cb565b602080601f83116001811461416f575f84156141585750858301515b5f19600386901b1c1916600185901b1785556141c6565b5f85815260208120601f198616915b8281101561419d5788860151825594840194600190910190840161417e565b50858210156141ba57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156141e85781810151838201526020016141d0565b50505f910152565b602081525f825180602084015261420e8160408501602087016141ce565b601f01601f19169190910160400192915050565b5f60208284031215614232575f80fd5b5051919050565b5f60208083525f845461424b81614099565b806020870152604060018084165f811461426c5760018114614288576142b5565b60ff19851660408a0152604084151560051b8a010195506142b5565b895f5260205f205f5b858110156142ac5781548b8201860152908301908801614291565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826142e5576142e56142c3565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109ce576109ce61404a565b808201808211156109ce576109ce61404a565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b038111828210171561440857614408614085565b60405290565b604051601f8201601f191681016001600160401b038111828210171561443657614436614085565b604052919050565b6001600160a01b0381168114611ccf575f80fd5b8051613f0881613ee8565b5f806040838503121561446e575f80fd5b82516001600160401b0380821115614484575f80fd5b9084019060608287031215614497575f80fd5b61449f6143e6565b825181526020808401516144b28161443e565b828201526040840151838111156144c7575f80fd5b80850194505087601f8501126144db575f80fd5b8351838111156144ed576144ed614085565b6144ff601f8201601f1916830161440e565b93508084528882828701011115614514575f80fd5b614523818386018488016141ce565b50826040830152819550614538818801614452565b9450505050509250929050565b5f6001600160401b038083168181036145605761456061404a565b6001019392505050565b818103818111156109ce576109ce61404a565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561407e5761407e61404a565b5f808335601e19843603018112614699575f80fd5b8301803591506001600160401b038211156146b2575f80fd5b6020019150368190038213156146c6575f80fd5b9250929050565b5f602082840312156146dd575f80fd5b813560ff811681146119d2575f80fd5b5f602082840312156146fd575f80fd5b81356119d28161443e565b6001600160401b0381811683821602808216919082811461472b5761472b61404a565b505092915050565b5f6001600160401b038084168061474c5761474c6142c3565b92169190910492915050565b5f82516147698184602087016141ce565b9190910192915050565b60208082526028908201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160408201526774696f6e2066656560c01b60608201526080019056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -503,23 +503,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0xdac80623. +// Initialize is a paid mutator transaction binding the contract method 0x45657017. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint8,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 0xdac80623. +// Initialize is a paid mutator transaction binding the contract method 0x45657017. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint8,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 0xdac80623. +// Initialize is a paid mutator transaction binding the contract method 0x45657017. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint8,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index e67b1d1fb..9a96eb705 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -98,7 +98,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 maximumStakeAmount, uint64 minimumStakeDuration, uint256 minimumDelegationFee, - uint64 maximumStakeMultiplier, + uint8 maximumStakeMultiplier, IRewardCalculator rewardCalculator ) internal onlyInitializing { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); @@ -111,6 +111,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager maximumStakeMultiplier <= MAXIMUM_STAKE_MULTIPLIER_LIMIT, "PoSValidatorManager: invalid maximum stake multiplier" ); + require(minimumDelegationFee > 0, "PoSValidatorManager: zero delegation fee"); $._minimumStakeAmount = minimumStakeAmount; $._maximumStakeAmount = maximumStakeAmount; diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 943dce9fe..e38e48aea 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -22,7 +22,7 @@ struct PoSValidatorManagerSettings { uint256 maximumStakeAmount; uint64 minimumStakeDuration; uint256 minimumDelegationFee; - uint64 maximumStakeMultiplier; + uint8 maximumStakeMultiplier; IRewardCalculator rewardCalculator; } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 8e11416ee..50e245a40 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -28,7 +28,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 public constant DEFAULT_MAXIMUM_STAKE = 1e20; uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint256 public constant DEFAULT_MINIMUM_DELEGATION_FEE = 100; - uint64 public constant DEFAULT_MAXIMUM_STAKE_MULTIPLIER = 4; + uint8 public constant DEFAULT_MAXIMUM_STAKE_MULTIPLIER = 4; PoSValidatorManager public posValidatorManager; diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index cc0060703..1310f9835 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -8,6 +8,7 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/crypto" @@ -84,10 +85,12 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { _, err = validatorManager.InitializeValidatorRegistration( opts, + poavalidatormanager.ValidatorRegistrationInput{ + NodeID: nodeID, + RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), + BlsPublicKey: blsPublicKey[:], + }, weight, - nodeID, - uint64(time.Now().Add(24*time.Hour).Unix()), - blsPublicKey[:], ) Expect(err).ShouldNot(BeNil()) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 31dde39f1..3ce9b7228 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -71,10 +71,12 @@ func DeployAndInitializeNativeTokenStakingManager( SubnetID: subnet.SubnetID, MaximumHourlyChurn: 0, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: uint64(24 * time.Hour), + MinimumDelegationFee: big.NewInt(1), + MaximumStakeMultiplier: uint8(1), + RewardCalculator: common.Address{}, }, ) Expect(err).Should(BeNil()) @@ -131,10 +133,12 @@ func DeployAndInitializeERC20TokenStakingManager( SubnetID: subnet.SubnetID, MaximumHourlyChurn: 0, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: uint64(24 * time.Hour), + MinimumDelegationFee: big.NewInt(1), + MaximumStakeMultiplier: uint8(1), + RewardCalculator: common.Address{}, }, erc20Address, ) @@ -211,9 +215,15 @@ func InitializeNativeValidatorRegistration( tx, err := stakingManager.InitializeValidatorRegistration( opts, - nodeID, - uint64(time.Now().Add(24*time.Hour).Unix()), - blsPublicKey[:], + nativetokenstakingmanager.ValidatorRegistrationInput{ + NodeID: nodeID, + RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), + BlsPublicKey: blsPublicKey[:], + }, + nativetokenstakingmanager.PoSValidatorRequirements{ + DelegationFee: big.NewInt(1), + MinStakeDuration: big.NewInt(int64(24 * time.Hour.Seconds())), + }, ) Expect(err).Should(BeNil()) receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) @@ -249,10 +259,16 @@ func InitializeERC20ValidatorRegistration( tx, err := stakingManager.InitializeValidatorRegistration( opts, + erc20tokenstakingmanager.ValidatorRegistrationInput{ + NodeID: nodeID, + RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), + BlsPublicKey: blsPublicKey[:], + }, + erc20tokenstakingmanager.PoSValidatorRequirements{ + DelegationFee: big.NewInt(1), + MinStakeDuration: big.NewInt(int64(24 * time.Hour.Seconds())), + }, stakeAmount, - nodeID, - uint64(time.Now().Add(24*time.Hour).Unix()), - blsPublicKey[:], ) Expect(err).Should(BeNil()) receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) @@ -277,10 +293,12 @@ func InitializePoAValidatorRegistration( tx, err := validatorManager.InitializeValidatorRegistration( opts, + poavalidatormanager.ValidatorRegistrationInput{ + NodeID: nodeID, + RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), + BlsPublicKey: blsPublicKey[:], + }, weight, - nodeID, - uint64(time.Now().Add(24*time.Hour).Unix()), - blsPublicKey[:], ) Expect(err).Should(BeNil()) receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) From 16e04fc47588f5403c22b486ecbf4fc6ac5338b3 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 12 Sep 2024 07:32:38 -0400 Subject: [PATCH 250/545] zero min staking duration --- tests/utils/staking.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 3ce9b7228..63890e988 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -135,7 +135,7 @@ func DeployAndInitializeERC20TokenStakingManager( }, MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), + MinimumStakeDuration: 0, MinimumDelegationFee: big.NewInt(1), MaximumStakeMultiplier: uint8(1), RewardCalculator: common.Address{}, @@ -222,7 +222,7 @@ func InitializeNativeValidatorRegistration( }, nativetokenstakingmanager.PoSValidatorRequirements{ DelegationFee: big.NewInt(1), - MinStakeDuration: big.NewInt(int64(24 * time.Hour.Seconds())), + MinStakeDuration: big.NewInt(0), }, ) Expect(err).Should(BeNil()) @@ -266,7 +266,7 @@ func InitializeERC20ValidatorRegistration( }, erc20tokenstakingmanager.PoSValidatorRequirements{ DelegationFee: big.NewInt(1), - MinStakeDuration: big.NewInt(int64(24 * time.Hour.Seconds())), + MinStakeDuration: big.NewInt(0), }, stakeAmount, ) From 4b61e039209b65cb3549ecc105a1edd93b52eb54 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 10 Sep 2024 14:01:04 -0400 Subject: [PATCH 251/545] handle initial validator end --- contracts/staking/ValidatorManager.sol | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 990a466cc..efb79edda 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -24,6 +24,7 @@ import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/utils/ContextUpgradeable.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; +import {EnumerableSet} from "@openzeppelin/contracts@5.0.2/utils/structs/EnumerableSet.sol"; abstract contract ValidatorManager is Initializable, @@ -31,8 +32,10 @@ abstract contract ValidatorManager is ReentrancyGuardUpgradeable, IValidatorManager { + using EnumerableSet for EnumerableSet.Bytes32Set; // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.ValidatorManager + struct ValidatorManagerStorage { /// @notice The blockchainID of the P-Chain. bytes32 _pChainBlockchainID; @@ -50,6 +53,8 @@ abstract contract ValidatorManager is mapping(bytes32 => Validator) _validationPeriods; /// @notice Maps the nodeID to the validationID for active validation periods. mapping(bytes32 => bytes32) _activeValidators; + /// @notice The set of initial validators added as part of chain initialization. + EnumerableSet.Bytes32Set _initialValidators; } // solhint-enable private-vars-leading-underscore @@ -220,7 +225,15 @@ abstract contract ValidatorManager is require( validator.status == ValidatorStatus.Active, "ValidatorManager: validator not active" ); - require(_msgSender() == validator.owner, "ValidatorManager: sender not validator owner"); + + if (validator.owner != address(0)) { + require(_msgSender() == validator.owner, "ValidatorManager: sender not validator owner"); + } else { + require( + $._initialValidators.contains(validationID), + "ValidatorManager: invalid initial validator" + ); + } // Check that removing this validator would not exceed the maximum churn rate. _checkAndUpdateChurnTracker(validator.weight); From 4a35b8c0252ebe04a63ae6c1b0519dc474238e6e Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 10 Sep 2024 15:31:48 -0400 Subject: [PATCH 252/545] initial validator draft --- contracts/staking/ValidatorManager.sol | 75 ++++++++++++++++++- contracts/staking/ValidatorMessages.sol | 30 ++++++++ .../staking/interfaces/IValidatorManager.sol | 17 +++++ 3 files changed, 120 insertions(+), 2 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index efb79edda..7627a1c08 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -11,6 +11,8 @@ import { ValidatorStatus, Validator, ValidatorChurnPeriod, + SubnetConversionData, + InitialValidators, ValidatorRegistrationInput } from "./interfaces/IValidatorManager.sol"; import { @@ -100,8 +102,79 @@ abstract contract ValidatorManager is $._pChainBlockchainID = settings.pChainBlockchainID; $._subnetID = settings.subnetID; $._maximumHourlyChurn = settings.maximumHourlyChurn; + _validateInitialValidators(settings.subnetConversionData, settings.messageIndex); } + function _validateInitialValidators( + SubnetConversionData memory subnetConversionData, + uint32 messageIndex + ) internal { + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); + // Parse the Warp message into SubnetConversionMessage + bytes32 subnetConversionID = + ValidatorMessages.unpackSubnetConversionMessage(warpMessage.payload); + + // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's subnetConversionID. + bytes memory encodedConversion = abi.encodePacked( + subnetConversionData.convertSubnetTxID, + subnetConversionData.blockchainID, + subnetConversionData.validatorManagerAddress + ); + uint256 length = encodedConversion.length; + for (uint256 i; i < length; i++) { + InitialValidators memory initialValidator = subnetConversionData.initialValidators[i]; + encodedConversion = abi.encodePacked( + encodedConversion, + initialValidator.nodeID, + initialValidator.weight, + initialValidator.blsPublickey + ); + } + require( + sha256(encodedConversion) == subnetConversionID, + "ValidatorManager: invalid subnet conversion ID" + ); + require( + subnetConversionData.blockchainID == WARP_MESSENGER.getBlockchainID(), + "ValidatorManager: invalid blockchain ID" + ); + + // TODO: might have more efficient conversion with assembly + require( + address(bytes20(subnetConversionData.validatorManagerAddress)) == address(this), + "ValidatorManager: invalid validator manager address" + ); + require( + subnetConversionData.initialValidators.length > 0, + "ValidatorManager: no initial validators" + ); + + // Insert the initial validators into the storage. + for (uint256 i; i < length; i++) { + InitialValidators memory initialValidator = subnetConversionData.initialValidators[i]; + bytes32 validationID = + sha256(abi.encodePacked(subnetConversionData.convertSubnetTxID, i)); + $._validationPeriods[validationID] = Validator({ + status: ValidatorStatus.PendingAdded, + nodeID: initialValidator.nodeID, + owner: _initialValidatorOwner(), + startingWeight: initialValidator.weight, + messageNonce: 0, + weight: initialValidator.weight, + startedAt: 0, // The validation period only starts once the registration is acknowledged. + endedAt: 0 + }); + // Increment the nonce for the next usage. + _getAndIncrementNonce(validationID); + emit ValidationPeriodCreated( + validationID, initialValidator.nodeID, bytes32(0), initialValidator.weight, 0 + ); + } + } + + function _initialValidatorOwner() internal virtual returns (address); + /** * @notice Begins the validator registration process, and sets the initial weight for the validator. * @param input The inputs for a validator registration. @@ -320,8 +393,6 @@ abstract contract ValidatorManager is validator.status = endStatus; $._validationPeriods[validationID] = validator; - // TODO: Unlock the stake. - // Emit event. emit ValidationPeriodEnded(validationID, validator.status); diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index 849658043..4e4f0531b 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -38,9 +38,39 @@ library ValidatorMessages { // the end of their validation period. uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 4; + uint32 internal constant SUBNET_CONVERSION_MESSAGE_TYPE_ID = 5; + // TODO: The implementation of these packing and unpacking functions is neither tested nor optimized at all. // Full test coverage should be provided, and the implementation should be optimized for gas efficiency. + function unpackSubnetConversionMessage(bytes memory input) internal pure returns (bytes32) { + require(input.length == 38, "ValidatorMessages: invalid message length"); + + // Unpack the codec ID + uint16 codecID; + for (uint256 i; i < 2; ++i) { + codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); + } + require(codecID == CODEC_ID, "ValidatorMessages: invalid codec ID"); + + // Unpack the type ID + uint32 typeID; + for (uint256 i; i < 4; ++i) { + typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); + } + require( + typeID == SUBNET_CONVERSION_MESSAGE_TYPE_ID, "ValidatorMessages: invalid message type" + ); + + // Unpack the subnetConversionID + bytes32 subnetConversionID; + for (uint256 i; i < 32; ++i) { + subnetConversionID |= bytes32(uint256(uint8(input[i + 6])) << (8 * (31 - i))); + } + + return subnetConversionID; + } + /** * @notice Packs a RegisterSubnetValidatorMessage message into a byte array. * The message format specification is: diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 3f4164ba5..cf7d4bd43 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -3,6 +3,8 @@ // SPDX-License-Identifier: Ecosystem +import {EnumerableSet} from "@openzeppelin/contracts@5.0.2/utils/structs/EnumerableSet.sol"; + pragma solidity 0.8.25; enum ValidatorStatus { @@ -35,6 +37,21 @@ struct ValidatorManagerSettings { bytes32 pChainBlockchainID; bytes32 subnetID; uint8 maximumHourlyChurn; + SubnetConversionData initialValidators; + uint32 messageIndex; +} + +struct SubnetConversionData { + bytes32 convertSubnetTxID; + bytes32 blockchainID; + bytes validatorManagerAddress; + InitialValidators[] initialValidators; +} + +struct InitialValidators { + bytes32 nodeID; + uint64 weight; + bytes blsPublickey; } struct ValidatorRegistrationInput { From f502ea71afb6cb9608b75240d4c04acbb0396d00 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 11 Sep 2024 16:15:57 -0400 Subject: [PATCH 253/545] change in initialize --- contracts/staking/PoAValidatorManager.sol | 4 +- contracts/staking/ValidatorManager.sol | 54 +++++++++++++------ .../staking/interfaces/IValidatorManager.sol | 6 ++- 3 files changed, 44 insertions(+), 20 deletions(-) diff --git a/contracts/staking/PoAValidatorManager.sol b/contracts/staking/PoAValidatorManager.sol index 47ebe17a6..de95a91d6 100644 --- a/contracts/staking/PoAValidatorManager.sol +++ b/contracts/staking/PoAValidatorManager.sol @@ -34,7 +34,7 @@ contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableU ValidatorManagerSettings calldata settings, address initialOwner ) internal onlyInitializing { - __ValidatorManager_init(settings); + __ValidatorManager_init(settings, initialOwner); __Ownable_init(initialOwner); } @@ -51,7 +51,7 @@ contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableU } // solhint-enable ordering - function initializeEndValidation(bytes32 validationID) external override { + function initializeEndValidation(bytes32 validationID) external override onlyOwner { _initializeEndValidation(validationID); } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 7627a1c08..9dadd783f 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -84,32 +84,45 @@ abstract contract ValidatorManager is IWarpMessenger(0x0200000000000000000000000000000000000005); // solhint-disable-next-line func-name-mixedcase - function __ValidatorManager_init(ValidatorManagerSettings calldata settings) - internal - onlyInitializing - { + function __ValidatorManager_init( + ValidatorManagerSettings calldata settings, + address initialValidatorOwner + ) internal onlyInitializing { __ReentrancyGuard_init(); __Context_init(); - __ValidatorManager_init_unchained(settings); + __ValidatorManager_init_unchained(settings, initialValidatorOwner); } // solhint-disable-next-line func-name-mixedcase - function __ValidatorManager_init_unchained(ValidatorManagerSettings calldata settings) - internal - onlyInitializing - { + function __ValidatorManager_init_unchained( + ValidatorManagerSettings calldata settings, + address initialValidatorOwner + ) internal onlyInitializing { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); $._pChainBlockchainID = settings.pChainBlockchainID; $._subnetID = settings.subnetID; $._maximumHourlyChurn = settings.maximumHourlyChurn; - _validateInitialValidators(settings.subnetConversionData, settings.messageIndex); + + // If initial validators was already set previously, ensure that the initial validators are not set again. + if ($._initialValidators.length() > 0) { + require( + settings.subnetConversionData.initialValidators.length == 0, + "ValidatorManager: initial validators already set" + ); + } else { + _validateInitialValidators( + settings.subnetConversionData, settings.messageIndex, initialValidatorOwner + ); + } } function _validateInitialValidators( SubnetConversionData memory subnetConversionData, - uint32 messageIndex + uint32 messageIndex, + address initialValidatorOwner ) internal { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); // Parse the Warp message into SubnetConversionMessage bytes32 subnetConversionID = @@ -140,7 +153,7 @@ abstract contract ValidatorManager is "ValidatorManager: invalid blockchain ID" ); - // TODO: might have more efficient conversion with assembly + // TODO: might have more efficient conversion with assembly, check length of bytes require( address(bytes20(subnetConversionData.validatorManagerAddress)) == address(this), "ValidatorManager: invalid validator manager address" @@ -155,10 +168,15 @@ abstract contract ValidatorManager is InitialValidators memory initialValidator = subnetConversionData.initialValidators[i]; bytes32 validationID = sha256(abi.encodePacked(subnetConversionData.convertSubnetTxID, i)); + require( + $._initialValidators.add(validationID), + "ValidatorManager: duplicate initial validator" + ); + $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.PendingAdded, nodeID: initialValidator.nodeID, - owner: _initialValidatorOwner(), + owner: address(0), startingWeight: initialValidator.weight, messageNonce: 0, weight: initialValidator.weight, @@ -167,14 +185,12 @@ abstract contract ValidatorManager is }); // Increment the nonce for the next usage. _getAndIncrementNonce(validationID); - emit ValidationPeriodCreated( - validationID, initialValidator.nodeID, bytes32(0), initialValidator.weight, 0 + emit InitialValidatorCreated( + validationID, initialValidator.nodeID, initialValidator.weight ); } } - function _initialValidatorOwner() internal virtual returns (address); - /** * @notice Begins the validator registration process, and sets the initial weight for the validator. * @param input The inputs for a validator registration. @@ -308,6 +324,10 @@ abstract contract ValidatorManager is ); } + if (!($._initialValidators.contains(validationID))) { + require(_msgSender() == validator.owner, "ValidatorManager: sender not validator owner"); + } + // Check that removing this validator would not exceed the maximum churn rate. _checkAndUpdateChurnTracker(validator.weight); diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index cf7d4bd43..c33f021c6 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -37,7 +37,7 @@ struct ValidatorManagerSettings { bytes32 pChainBlockchainID; bytes32 subnetID; uint8 maximumHourlyChurn; - SubnetConversionData initialValidators; + SubnetConversionData subnetConversionData; uint32 messageIndex; } @@ -81,6 +81,10 @@ interface IValidatorManager { uint64 registrationExpiry ); + event InitialValidatorCreated( + bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight + ); + /** * @notice Emitted when the staking manager learns that the validation period has been successfully registered * on the P-Chain. Rewards for this validation period will begin accruing when this event is emitted. From d3b8cccbe8f0ffe68c73c738c2b7315055ab7b73 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 12 Sep 2024 08:53:48 -0400 Subject: [PATCH 254/545] remove owner as part of validator struct --- contracts/staking/PoAValidatorManager.sol | 2 +- contracts/staking/ValidatorManager.sol | 77 ++++++++----------- .../staking/interfaces/IValidatorManager.sol | 12 ++- 3 files changed, 46 insertions(+), 45 deletions(-) diff --git a/contracts/staking/PoAValidatorManager.sol b/contracts/staking/PoAValidatorManager.sol index de95a91d6..43d5e5aaf 100644 --- a/contracts/staking/PoAValidatorManager.sol +++ b/contracts/staking/PoAValidatorManager.sol @@ -34,7 +34,7 @@ contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableU ValidatorManagerSettings calldata settings, address initialOwner ) internal onlyInitializing { - __ValidatorManager_init(settings, initialOwner); + __ValidatorManager_init(settings); __Ownable_init(initialOwner); } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 9dadd783f..347282c66 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -57,6 +57,8 @@ abstract contract ValidatorManager is mapping(bytes32 => bytes32) _activeValidators; /// @notice The set of initial validators added as part of chain initialization. EnumerableSet.Bytes32Set _initialValidators; + /// @notice Boolean that indicates if the initial validator set has been set. + bool _initializedValidatorSet; } // solhint-enable private-vars-leading-underscore @@ -84,44 +86,44 @@ abstract contract ValidatorManager is IWarpMessenger(0x0200000000000000000000000000000000000005); // solhint-disable-next-line func-name-mixedcase - function __ValidatorManager_init( - ValidatorManagerSettings calldata settings, - address initialValidatorOwner - ) internal onlyInitializing { + function __ValidatorManager_init(ValidatorManagerSettings calldata settings) + internal + onlyInitializing + { __ReentrancyGuard_init(); __Context_init(); - __ValidatorManager_init_unchained(settings, initialValidatorOwner); + __ValidatorManager_init_unchained(settings); } // solhint-disable-next-line func-name-mixedcase - function __ValidatorManager_init_unchained( - ValidatorManagerSettings calldata settings, - address initialValidatorOwner - ) internal onlyInitializing { + function __ValidatorManager_init_unchained(ValidatorManagerSettings calldata settings) + internal + onlyInitializing + { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); $._pChainBlockchainID = settings.pChainBlockchainID; $._subnetID = settings.subnetID; $._maximumHourlyChurn = settings.maximumHourlyChurn; + $._initializedValidatorSet = false; + } - // If initial validators was already set previously, ensure that the initial validators are not set again. - if ($._initialValidators.length() > 0) { - require( - settings.subnetConversionData.initialValidators.length == 0, - "ValidatorManager: initial validators already set" - ); - } else { - _validateInitialValidators( - settings.subnetConversionData, settings.messageIndex, initialValidatorOwner - ); - } + modifier initializedValidatorSet() { + require( + _getValidatorManagerStorage()._initializedValidatorSet, + "ValidatorManager: validator set not initialized" + ); + _; } - function _validateInitialValidators( - SubnetConversionData memory subnetConversionData, - uint32 messageIndex, - address initialValidatorOwner - ) internal { + /** + * @notice See {IValidatorManager-initializeValidatorSet}. + */ + function initializeValidatorSet( + SubnetConversionData calldata subnetConversionData, + uint32 messageIndex + ) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + require(!$._initializedValidatorSet, "ValidatorManager: already initialized validator set"); WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); // Parse the Warp message into SubnetConversionMessage @@ -154,6 +156,7 @@ abstract contract ValidatorManager is ); // TODO: might have more efficient conversion with assembly, check length of bytes + // TODO: might want to check the length of validator manager address require( address(bytes20(subnetConversionData.validatorManagerAddress)) == address(this), "ValidatorManager: invalid validator manager address" @@ -176,7 +179,6 @@ abstract contract ValidatorManager is $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.PendingAdded, nodeID: initialValidator.nodeID, - owner: address(0), startingWeight: initialValidator.weight, messageNonce: 0, weight: initialValidator.weight, @@ -236,7 +238,6 @@ abstract contract ValidatorManager is $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.PendingAdded, nodeID: input.nodeID, - owner: _msgSender(), startingWeight: weight, messageNonce: 0, weight: weight, @@ -256,7 +257,10 @@ abstract contract ValidatorManager is * @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. */ - function resendRegisterValidatorMessage(bytes32 validationID) external { + function resendRegisterValidatorMessage(bytes32 validationID) + external + initializedValidatorSet + { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); require( $._pendingRegisterValidationMessages[validationID].length > 0 @@ -273,7 +277,7 @@ abstract contract ValidatorManager is * validationID from the P-Chain. * @param messageIndex The index of the Warp message to be received providing the acknowledgement. */ - function completeValidatorRegistration(uint32 messageIndex) external { + function completeValidatorRegistration(uint32 messageIndex) external initializedValidatorSet { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, bool validRegistration) = @@ -315,19 +319,6 @@ abstract contract ValidatorManager is validator.status == ValidatorStatus.Active, "ValidatorManager: validator not active" ); - if (validator.owner != address(0)) { - require(_msgSender() == validator.owner, "ValidatorManager: sender not validator owner"); - } else { - require( - $._initialValidators.contains(validationID), - "ValidatorManager: invalid initial validator" - ); - } - - if (!($._initialValidators.contains(validationID))) { - require(_msgSender() == validator.owner, "ValidatorManager: sender not validator owner"); - } - // Check that removing this validator would not exceed the maximum churn rate. _checkAndUpdateChurnTracker(validator.weight); @@ -359,7 +350,7 @@ abstract contract ValidatorManager is * Only necessary if the original message can't be delivered due to validator churn. */ // solhint-disable-next-line - function resendEndValidatorMessage(bytes32 validationID) external { + function resendEndValidatorMessage(bytes32 validationID) external initializedValidatorSet { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); require( diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index c33f021c6..6c4c401e6 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -19,7 +19,6 @@ enum ValidatorStatus { struct Validator { ValidatorStatus status; bytes32 nodeID; - address owner; uint64 startingWeight; uint64 messageNonce; uint64 weight; @@ -120,6 +119,17 @@ interface IValidatorManager { */ event ValidationPeriodEnded(bytes32 indexed validationID, ValidatorStatus indexed status); + /** + * @notice Verifies and sets the initial validator set for the chain through a P-Chain + * SubnetConversionMessage. + * @param subnetConversionData The subnet conversion message data used to recompute and verify against the subnetConversionID. + * @param messsageIndex The storage slot index that contains the SubnetConversionMessage Warp message. + */ + function initializeValidatorSet( + SubnetConversionData calldata subnetConversionData, + uint32 messsageIndex + ) external; + /** * @notice Resubmits a validator registration message to be sent to the P-Chain. * Only necessary if the original message can't be delivered due to validator churn. From de7ab80b9f1d89a2a817494025c4dcf54964976a Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 12 Sep 2024 10:57:11 -0400 Subject: [PATCH 255/545] draft with initialValidatorSet, removing owner from ValidatorManager, and change in ReentrancyGuard --- .../staking/ERC20TokenStakingManager.sol | 9 ++-- .../staking/NativeTokenStakingManager.sol | 8 +++- contracts/staking/PoSValidatorManager.sol | 42 ++++++++++++++----- contracts/staking/ValidatorManager.sol | 39 ++++++++--------- .../interfaces/IERC20TokenStakingManager.sol | 7 ++-- .../interfaces/INativeTokenStakingManager.sol | 6 ++- .../interfaces/IPoSValidatorManager.sol | 1 + 7 files changed, 72 insertions(+), 40 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index e211b3a28..74e3b2268 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -93,10 +93,13 @@ contract ERC20TokenStakingManager is */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, - PoSValidatorRequirements calldata requirements, + uint256 delegationFee, + uint256 minStakeDuration, uint256 stakeAmount ) external nonReentrant returns (bytes32 validationID) { - return _initializeValidatorRegistration(registrationInput, requirements, stakeAmount); + return _initializeValidatorRegistration( + registrationInput, delegationFee, minStakeDuration, stakeAmount + ); } /** @@ -107,7 +110,7 @@ contract ERC20TokenStakingManager is function initializeDelegatorRegistration( bytes32 validationID, uint256 delegationAmount - ) external returns (bytes32) { + ) external nonReentrant returns (bytes32) { return _initializeDelegatorRegistration(validationID, _msgSender(), delegationAmount); } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 239d50bfc..9a4d31173 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -57,9 +57,12 @@ contract NativeTokenStakingManager is */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, - PoSValidatorRequirements calldata requirements + uint256 delegationFee, + uint256 minStakeDuration ) external payable nonReentrant returns (bytes32) { - return _initializeValidatorRegistration(registrationInput, requirements, msg.value); + return _initializeValidatorRegistration( + registrationInput, delegationFee, minStakeDuration, msg.value + ); } /** @@ -69,6 +72,7 @@ contract NativeTokenStakingManager is function initializeDelegatorRegistration(bytes32 validationID) external payable + nonReentrant returns (bytes32) { return _initializeDelegatorRegistration(validationID, _msgSender(), msg.value); diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 9a96eb705..158127106 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -23,8 +23,10 @@ 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"; -abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager { +abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager, ReentrancyGuardUpgradeable { // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.PoSValidatorManager struct PoSValidatorManagerStorage { @@ -82,6 +84,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager onlyInitializing { __ValidatorManager_init(settings.baseSettings); + __ReentrancyGuard_init(); __POS_Validator_Manager_init_unchained({ minimumStakeAmount: settings.minimumStakeAmount, maximumStakeAmount: settings.maximumStakeAmount, @@ -144,8 +147,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager } function completeEndValidation(uint32 messageIndex) external { - Validator memory validator = _completeEndValidation(messageIndex); - _unlock(validator.startingWeight, validator.owner); + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + (bytes32 validationID, Validator memory validator) = _completeEndValidation(messageIndex); + _unlock(validator.startingWeight, $._validatorRequirements[validationID].owner); } function _getUptime(bytes32 validationID, uint32 messageIndex) internal view returns (uint64) { @@ -173,18 +177,18 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager function _initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, - PoSValidatorRequirements calldata requirements, + uint256 delegationFee, + uint256 minStakeDuration, uint256 stakeAmount ) internal virtual returns (bytes32) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Validate and save the validator requirements require( - requirements.minStakeDuration >= $._minimumStakeDuration, - "PoSValidatorManager: invalid min stake duration" + delegationFee >= $._minimumDelegationFee, "PoSValidatorManager: invalid delegation fee" ); require( - requirements.delegationFee >= $._minimumDelegationFee, - "PoSValidatorManager: invalid delegation fee" + minStakeDuration >= $._minimumStakeDuration, + "PoSValidatorManager: invalid min stake duration" ); require( stakeAmount >= $._minimumStakeAmount && stakeAmount <= $._maximumStakeAmount, @@ -196,7 +200,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 weight = valueToWeight(lockedValue); bytes32 validationID = _initializeValidatorRegistration(registrationInput, weight); - $._validatorRequirements[validationID] = requirements; + $._validatorRequirements[validationID] = PoSValidatorRequirements({ + owner: _msgSender(), + delegationFee: delegationFee, + minStakeDuration: minStakeDuration + }); return validationID; } @@ -215,7 +223,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bytes32 validationID, address delegatorAddress, uint256 delegationAmount - ) internal nonReentrant returns (bytes32) { + ) internal returns (bytes32) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); uint64 weight = valueToWeight(_lock(delegationAmount)); @@ -224,6 +232,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( validator.status == ValidatorStatus.Active, "PoSValidatorManager: validator not active" ); + + // Check that the validation ID is a PoS validator + require(_isPoSValidator(validationID), "PoSValidatorManager: not a PoS validator"); + // Update the validator weight uint64 newValidatorWeight = validator.weight + weight; require( @@ -384,7 +396,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager WARP_MESSENGER.sendWarpMessage($._pendingEndDelegatorMessages[delegationID]); } - function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) external { + function completeEndDelegation( + uint32 messageIndex, + bytes32 delegationID + ) external nonReentrant { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Unpack the Warp message @@ -444,4 +459,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: delegation registration not pending" ); } + + function _isPoSValidator(bytes32 validationID) internal view returns (bool) { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + return $._validatorRequirements[validationID].owner != address(0); + } } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 347282c66..186f02b56 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -19,8 +19,6 @@ import { WarpMessage, IWarpMessenger } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; -import {ReentrancyGuardUpgradeable} from - "@openzeppelin/contracts-upgradeable@5.0.2/utils/ReentrancyGuardUpgradeable.sol"; import {ValidatorMessages} from "./ValidatorMessages.sol"; import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/utils/ContextUpgradeable.sol"; @@ -28,12 +26,7 @@ import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; import {EnumerableSet} from "@openzeppelin/contracts@5.0.2/utils/structs/EnumerableSet.sol"; -abstract contract ValidatorManager is - Initializable, - ContextUpgradeable, - ReentrancyGuardUpgradeable, - IValidatorManager -{ +abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValidatorManager { using EnumerableSet for EnumerableSet.Bytes32Set; // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.ValidatorManager @@ -90,7 +83,6 @@ abstract contract ValidatorManager is internal onlyInitializing { - __ReentrancyGuard_init(); __Context_init(); __ValidatorManager_init_unchained(settings); } @@ -156,7 +148,10 @@ abstract contract ValidatorManager is ); // TODO: might have more efficient conversion with assembly, check length of bytes - // TODO: might want to check the length of validator manager address + require( + subnetConversionData.validatorManagerAddress.length == 20, + "ValidatorManager: invalid validator manager address length" + ); require( address(bytes20(subnetConversionData.validatorManagerAddress)) == address(this), "ValidatorManager: invalid validator manager address" @@ -191,6 +186,7 @@ abstract contract ValidatorManager is validationID, initialValidator.nodeID, initialValidator.weight ); } + $._initializedValidatorSet = true; } /** @@ -201,7 +197,7 @@ abstract contract ValidatorManager is function _initializeValidatorRegistration( ValidatorRegistrationInput calldata input, uint64 weight - ) internal virtual returns (bytes32) { + ) internal virtual initializedValidatorSet returns (bytes32) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Ensure the registration expiry is in a valid range. @@ -257,11 +253,9 @@ abstract contract ValidatorManager is * @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. */ - function resendRegisterValidatorMessage(bytes32 validationID) - external - initializedValidatorSet - { + function resendRegisterValidatorMessage(bytes32 validationID) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + // The initial validator set must have been set already to have pending register validation messages. require( $._pendingRegisterValidationMessages[validationID].length > 0 && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, @@ -277,13 +271,14 @@ abstract contract ValidatorManager is * validationID from the P-Chain. * @param messageIndex The index of the Warp message to be received providing the acknowledgement. */ - function completeValidatorRegistration(uint32 messageIndex) external initializedValidatorSet { + function completeValidatorRegistration(uint32 messageIndex) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, bool validRegistration) = ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); require(validRegistration, "ValidatorManager: Registration not valid"); + // The initial validator set must have been set already to have pending register validation messages. require( $._pendingRegisterValidationMessages[validationID].length > 0 && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, @@ -314,6 +309,7 @@ abstract contract ValidatorManager is ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Ensure the validation period is active. + // The initial validator set must have been set already to have active validators. Validator memory validator = $._validationPeriods[validationID]; require( validator.status == ValidatorStatus.Active, "ValidatorManager: validator not active" @@ -350,9 +346,10 @@ abstract contract ValidatorManager is * Only necessary if the original message can't be delivered due to validator churn. */ // solhint-disable-next-line - function resendEndValidatorMessage(bytes32 validationID) external initializedValidatorSet { + function resendEndValidatorMessage(bytes32 validationID) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + // The initial validator set must have been set already to have pending end validation messages. require( $._pendingEndValidationMessages[validationID].length > 0 && $._validationPeriods[validationID].status == ValidatorStatus.PendingRemoved, @@ -370,7 +367,10 @@ abstract contract ValidatorManager is * {registrationExpiry} being reached. * @return The Validator instance representing the completed validation period */ - function _completeEndValidation(uint32 messageIndex) internal returns (Validator memory) { + function _completeEndValidation(uint32 messageIndex) + internal + returns (bytes32, Validator memory) + { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Get the Warp message. @@ -385,6 +385,7 @@ abstract contract ValidatorManager is // The validation status is PendingRemoved if validator removal was initiated with a call to {initiateEndValidation}. // The validation status is PendingAdded if the validator was never registered on the P-Chain. + // The initial validator set must have been set already to have pending validation messages. require( validator.status == ValidatorStatus.PendingRemoved || validator.status == ValidatorStatus.PendingAdded, @@ -407,7 +408,7 @@ abstract contract ValidatorManager is // Emit event. emit ValidationPeriodEnded(validationID, validator.status); - return validator; + return (validationID, validator); } /** diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index 876f42fba..43cd317f4 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -12,12 +12,13 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the {stakeAmount} of the managers specified ERC20 token. * @param registrationInput The inputs for a validator registration. - * @param requirements The requirements for the validator being registered. - * @param stakeAmount The amount of the ERC20 token to lock in the contract as the stake. + * @param delegationFee The fee that delegators must pay to delegate to this validator. + * @param minStakeDuration The minimum amount of time this validator must be staked for. */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, - PoSValidatorRequirements calldata requirements, + uint256 delegationFee, + uint256 minStakeDuration, uint256 stakeAmount ) external returns (bytes32 validationID); diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index abd2e4675..967451eb3 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -12,11 +12,13 @@ interface INativeTokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param registrationInput The inputs for a validator registration. - * @param requirements The requirements for the validator being registered. + * @param delegationFee The fee that delegators must pay to delegate to this validator. + * @param minStakeDuration The minimum amount of time this validator must be staked for. */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, - PoSValidatorRequirements calldata requirements + uint256 delegationFee, + uint256 minStakeDuration ) external payable returns (bytes32 validationID); function initializeDelegatorRegistration(bytes32 validationID) diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index e38e48aea..708ca979d 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -38,6 +38,7 @@ struct Delegator { } struct PoSValidatorRequirements { + address owner; uint256 delegationFee; uint256 minStakeDuration; } From 0d815a08b1f05ff0deebaf9dde4d1c95d85342e9 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 12 Sep 2024 12:00:22 -0400 Subject: [PATCH 256/545] fix checks for initial validator set --- contracts/staking/ValidatorManager.sol | 11 ++++++++--- contracts/staking/interfaces/IValidatorManager.sol | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 186f02b56..4c617e82f 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -163,14 +163,19 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Insert the initial validators into the storage. for (uint256 i; i < length; i++) { - InitialValidators memory initialValidator = subnetConversionData.initialValidators[i]; + InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; bytes32 validationID = sha256(abi.encodePacked(subnetConversionData.convertSubnetTxID, i)); + require(input.nodeID != bytes32(0), "ValidatorManager: invalid node ID"); + require( + $._activeValidators[input.nodeID] == bytes32(0), + "ValidatorManager: node ID already active" + ); require( - $._initialValidators.add(validationID), - "ValidatorManager: duplicate initial validator" + input.blsPublicKey.length == 48, "ValidatorManager: invalid blsPublicKey length" ); + $._activeValidators[input.nodeID] = validationID; $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.PendingAdded, nodeID: initialValidator.nodeID, diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 6c4c401e6..bf8d9508b 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -44,10 +44,10 @@ struct SubnetConversionData { bytes32 convertSubnetTxID; bytes32 blockchainID; bytes validatorManagerAddress; - InitialValidators[] initialValidators; + InitialValidator[] initialValidators; } -struct InitialValidators { +struct InitialValidator { bytes32 nodeID; uint64 weight; bytes blsPublickey; From 2be83057acf2bb076e602fe6f49c71ed0cd5125d Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 12 Sep 2024 14:17:01 -0400 Subject: [PATCH 257/545] remove enumerable set use --- contracts/staking/ValidatorManager.sol | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 4c617e82f..f309726b1 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -12,7 +12,7 @@ import { Validator, ValidatorChurnPeriod, SubnetConversionData, - InitialValidators, + InitialValidator, ValidatorRegistrationInput } from "./interfaces/IValidatorManager.sol"; import { @@ -24,10 +24,8 @@ import {ContextUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/utils/ContextUpgradeable.sol"; import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; -import {EnumerableSet} from "@openzeppelin/contracts@5.0.2/utils/structs/EnumerableSet.sol"; abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValidatorManager { - using EnumerableSet for EnumerableSet.Bytes32Set; // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.ValidatorManager @@ -48,8 +46,6 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida mapping(bytes32 => Validator) _validationPeriods; /// @notice Maps the nodeID to the validationID for active validation periods. mapping(bytes32 => bytes32) _activeValidators; - /// @notice The set of initial validators added as part of chain initialization. - EnumerableSet.Bytes32Set _initialValidators; /// @notice Boolean that indicates if the initial validator set has been set. bool _initializedValidatorSet; } @@ -130,7 +126,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ); uint256 length = encodedConversion.length; for (uint256 i; i < length; i++) { - InitialValidators memory initialValidator = subnetConversionData.initialValidators[i]; + InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; encodedConversion = abi.encodePacked( encodedConversion, initialValidator.nodeID, From e0ca11778887f45703c6f23f342d19aea54cfb92 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 12 Sep 2024 14:44:00 -0400 Subject: [PATCH 258/545] fix up delegation fees and add unit tests --- contracts/staking/PoSValidatorManager.sol | 31 +++---- .../interfaces/IPoSValidatorManager.sol | 4 +- .../tests/ERC20TokenStakingManagerTests.t.sol | 24 ++++-- .../NativeTokenStakingManagerTests.t.sol | 21 +++-- .../tests/PoSValidatorManagerTests.t.sol | 80 ++++++++++++++++++- 5 files changed, 129 insertions(+), 31 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 9a96eb705..7e3f3db20 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -34,14 +34,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 _maximumStakeAmount; /// @notice The minimum amount of time a validator must be staked for. uint64 _minimumStakeDuration; - /// @notice The minimum delegation fee required to delegate to a validator. - uint256 _minimumDelegationFee; + /// @notice The minimum delegation fee percentage, in basis points, required to delegate to a validator. + uint256 _minimumDelegationFeeBips; /** - * @notice A multiplier applied to {_maximumStakeAmount} to determine - * the maximum amount of stake a validator can have. This maximum amount includes - * the initial stake amount at registration, and additional stake from delegations. + * @notice A multiplier applied to validator's initial stake amount to determine + * the maximum amount of stake a validator can have with delegations. * - * Note: Zero is a valid value, which would disable delegations to validators. + * Note: Setting this value to 1 would disable delegations to validators, since + * the maximum stake would be equal to the initial stake. */ uint64 _maximumStakeMultiplier; /// @notice The reward calculator for this validator manager. @@ -64,6 +64,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint8 public constant MAXIMUM_STAKE_MULTIPLIER_LIMIT = 10; + // TODO: revisit maximum, currently set to 100% + uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; + // solhint-disable ordering function _getPoSValidatorManagerStorage() private @@ -86,7 +89,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager minimumStakeAmount: settings.minimumStakeAmount, maximumStakeAmount: settings.maximumStakeAmount, minimumStakeDuration: settings.minimumStakeDuration, - minimumDelegationFee: settings.minimumDelegationFee, + minimumDelegationFeeBips: settings.minimumDelegationFeeBips, maximumStakeMultiplier: settings.maximumStakeMultiplier, rewardCalculator: settings.rewardCalculator }); @@ -97,26 +100,25 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint256 minimumStakeAmount, uint256 maximumStakeAmount, uint64 minimumStakeDuration, - uint256 minimumDelegationFee, + uint256 minimumDelegationFeeBips, uint8 maximumStakeMultiplier, IRewardCalculator rewardCalculator ) internal onlyInitializing { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - require(minimumDelegationFee > 0, "PoSValidatorManager: zero delegation fee"); + require(minimumDelegationFeeBips > 0, "PoSValidatorManager: zero delegation fee"); require( minimumStakeAmount <= maximumStakeAmount, "PoSValidatorManager: invalid stake amount range" ); require( - maximumStakeMultiplier <= MAXIMUM_STAKE_MULTIPLIER_LIMIT, + maximumStakeMultiplier <= MAXIMUM_STAKE_MULTIPLIER_LIMIT && maximumStakeMultiplier > 0, "PoSValidatorManager: invalid maximum stake multiplier" ); - require(minimumDelegationFee > 0, "PoSValidatorManager: zero delegation fee"); $._minimumStakeAmount = minimumStakeAmount; $._maximumStakeAmount = maximumStakeAmount; $._minimumStakeDuration = minimumStakeDuration; - $._minimumDelegationFee = minimumDelegationFee; + $._minimumDelegationFeeBips = minimumDelegationFeeBips; $._maximumStakeMultiplier = maximumStakeMultiplier; $._rewardCalculator = rewardCalculator; } @@ -183,7 +185,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: invalid min stake duration" ); require( - requirements.delegationFee >= $._minimumDelegationFee, + requirements.delegationFeeBips >= $._minimumDelegationFeeBips + && requirements.delegationFeeBips <= MAXIMUM_DELEGATION_FEE_BIPS, "PoSValidatorManager: invalid delegation fee" ); require( @@ -227,7 +230,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Update the validator weight uint64 newValidatorWeight = validator.weight + weight; require( - weightToValue(newValidatorWeight) <= $._maximumStakeAmount * $._maximumStakeMultiplier, + newValidatorWeight <= validator.startingWeight * $._maximumStakeMultiplier, "PoSValidatorManager: maximum validator weight reached" ); _setValidatorWeight(validationID, newValidatorWeight); diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index e38e48aea..1508bb3a0 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -21,7 +21,7 @@ struct PoSValidatorManagerSettings { uint256 minimumStakeAmount; uint256 maximumStakeAmount; uint64 minimumStakeDuration; - uint256 minimumDelegationFee; + uint256 minimumDelegationFeeBips; uint8 maximumStakeMultiplier; IRewardCalculator rewardCalculator; } @@ -38,7 +38,7 @@ struct Delegator { } struct PoSValidatorRequirements { - uint256 delegationFee; + uint256 delegationFeeBips; uint256 minStakeDuration; } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index e892b8024..1652c1fa8 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -43,7 +43,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, rewardCalculator: IRewardCalculator(address(0)) }), @@ -53,7 +53,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { posValidatorManager = app; } - function testZeroDelegationFee() public { + function testZeroMinimumDelegationFee() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); vm.expectRevert(_formatErrorMessage("zero delegation fee")); app.initialize( @@ -66,7 +66,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFee: 0, + minimumDelegationFeeBips: 0, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, rewardCalculator: IRewardCalculator(address(0)) }), @@ -87,7 +87,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MAXIMUM_STAKE, maximumStakeAmount: DEFAULT_MINIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, rewardCalculator: IRewardCalculator(address(0)) }), @@ -109,7 +109,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: maximumStakeMultiplier, rewardCalculator: IRewardCalculator(address(0)) }), @@ -126,7 +126,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { input, PoSValidatorRequirements({ minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION - 1, - delegationFee: DEFAULT_MINIMUM_DELEGATION_FEE + delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS }), stakeAmount ); @@ -141,12 +141,20 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { input, PoSValidatorRequirements({ minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - delegationFee: DEFAULT_MINIMUM_DELEGATION_FEE - 1 + delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1 }), stakeAmount ); } + function _initializeValidatorRegistration( + ValidatorRegistrationInput memory registrationInput, + PoSValidatorRequirements memory requirements, + uint256 stakeAmount + ) internal virtual override returns (bytes32) { + return app.initializeValidatorRegistration(registrationInput, requirements, stakeAmount); + } + function _initializeValidatorRegistration( ValidatorRegistrationInput memory input, uint64 weight @@ -155,7 +163,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { input, PoSValidatorRequirements({ minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - delegationFee: DEFAULT_MINIMUM_DELEGATION_FEE + delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS }), app.weightToValue(weight) ); diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index a03f59bd9..b5d1987e4 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -36,7 +36,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, rewardCalculator: IRewardCalculator(address(0)) }) @@ -45,7 +45,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { posValidatorManager = app; } - function testZeroDelegationFee() public { + function testZeroMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); vm.expectRevert(_formatErrorMessage("zero delegation fee")); app.initialize( @@ -58,7 +58,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFee: 0, + minimumDelegationFeeBips: 0, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, rewardCalculator: IRewardCalculator(address(0)) }) @@ -78,7 +78,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MAXIMUM_STAKE, maximumStakeAmount: DEFAULT_MINIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, rewardCalculator: IRewardCalculator(address(0)) }) @@ -99,7 +99,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeAmount: DEFAULT_MINIMUM_STAKE, maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - minimumDelegationFee: DEFAULT_MINIMUM_DELEGATION_FEE, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: maximumStakeMultiplier, rewardCalculator: IRewardCalculator(address(0)) }) @@ -107,6 +107,15 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { } // Helpers + function _initializeValidatorRegistration( + ValidatorRegistrationInput memory registrationInput, + PoSValidatorRequirements memory requirements, + uint256 stakeAmount + ) internal virtual override returns (bytes32) { + return + app.initializeValidatorRegistration{value: stakeAmount}(registrationInput, requirements); + } + function _initializeValidatorRegistration( ValidatorRegistrationInput memory input, uint64 weight @@ -115,7 +124,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { input, PoSValidatorRequirements({ minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - delegationFee: DEFAULT_MINIMUM_DELEGATION_FEE + delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS }) ); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 50e245a40..219a2502c 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -7,11 +7,13 @@ pragma solidity 0.8.25; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; +import {PoSValidatorRequirements} from "../interfaces/IPoSValidatorManager.sol"; import { WarpMessage, IWarpMessenger } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; +import {ValidatorRegistrationInput} from "../interfaces/IValidatorManager.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_UPTIME = uint64(100); @@ -27,7 +29,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 public constant DEFAULT_MINIMUM_STAKE = 1e6; uint256 public constant DEFAULT_MAXIMUM_STAKE = 1e20; uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; - uint256 public constant DEFAULT_MINIMUM_DELEGATION_FEE = 100; + uint256 public constant DEFAULT_MINIMUM_DELEGATION_FEE_BIPS = 100; uint8 public constant DEFAULT_MAXIMUM_STAKE_MULTIPLIER = 4; PoSValidatorManager public posValidatorManager; @@ -62,6 +64,76 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce ); + function testDelegationFeeBipsTooLow() public { + PoSValidatorRequirements memory requirements = PoSValidatorRequirements({ + minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1 + }); + ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ + nodeID: DEFAULT_NODE_ID, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); + vm.expectRevert(_formatErrorMessage("invalid delegation fee")); + _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE); + } + + function testDelegationFeeBipsTooHigh() public { + PoSValidatorRequirements memory requirements = PoSValidatorRequirements({ + minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + delegationFeeBips: posValidatorManager.MAXIMUM_DELEGATION_FEE_BIPS() + 1 + }); + ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ + nodeID: DEFAULT_NODE_ID, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); + vm.expectRevert(_formatErrorMessage("invalid delegation fee")); + _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE); + } + + function testInvalidMinStakeDuration() public { + PoSValidatorRequirements memory requirements = PoSValidatorRequirements({ + minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION - 1, + delegationFeeBips: DEFAULT_MINIMUM_STAKE_DURATION + }); + ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ + nodeID: DEFAULT_NODE_ID, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); + vm.expectRevert(_formatErrorMessage("invalid min stake duration")); + _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE); + } + + function testStakeAmountTooLow() public { + PoSValidatorRequirements memory requirements = PoSValidatorRequirements({ + minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS + }); + ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ + nodeID: DEFAULT_NODE_ID, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); + vm.expectRevert(_formatErrorMessage("invalid stake amount")); + _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE - 1); + } + + function testStakeAmountTooHigh() public { + PoSValidatorRequirements memory requirements = PoSValidatorRequirements({ + minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS + }); + ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ + nodeID: DEFAULT_NODE_ID, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); + vm.expectRevert(_formatErrorMessage("invalid stake amount")); + _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MAXIMUM_STAKE + 1); + } + function testInvalidInitializeEndTime() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -622,6 +694,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { assertEq(v3, 1e27); } + function _initializeValidatorRegistration( + ValidatorRegistrationInput memory registrationInput, + PoSValidatorRequirements memory requirements, + uint256 stakeAmount + ) internal virtual returns (bytes32); + function _initializeEndValidation(bytes32 validationID) internal virtual override { return posValidatorManager.initializeEndValidation(validationID, false, 0); } From b86ec1a4878736839b8acb3cb95091aa68851022 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 12 Sep 2024 14:59:17 -0400 Subject: [PATCH 259/545] change types for parameterized valuse --- .../ERC20TokenStakingManager.go | 77 +++++++++++++------ .../NativeTokenStakingManager.go | 77 +++++++++++++------ .../interfaces/IPoSValidatorManager.sol | 7 +- .../tests/PoSValidatorManagerTests.t.sol | 4 +- tests/utils/staking.go | 37 +++++---- 5 files changed, 135 insertions(+), 67 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 140ef1aa6..59310ae69 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -31,19 +31,19 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { - BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int - MinimumStakeDuration uint64 - MinimumDelegationFee *big.Int - MaximumStakeMultiplier uint8 - RewardCalculator common.Address + BaseSettings ValidatorManagerSettings + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + MinimumStakeDuration uint64 + MinimumDelegationFeeBips uint16 + MaximumStakeMultiplier uint8 + RewardCalculator common.Address } // PoSValidatorRequirements is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorRequirements struct { - DelegationFee *big.Int - MinStakeDuration *big.Int + DelegationFeeBips uint16 + MinStakeDuration uint64 } // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. @@ -62,8 +62,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\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeMultiplier\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614d7f380380614d7f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614c328061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c806365b3a621116100a95780639cb443411161006e5780639cb44341146102895780639e1bc4ef1461029c578063a3a65e48146102af578063b771b3bc146102c2578063bee0a03f146102e8575f80fd5b806365b3a6211461022a57806366435abf1461023d5780636d0e43fa1461025057806376f786211461026357806398f3e2b414610276575f80fd5b8063162f1f61116100ef578063162f1f61146101b35780632e2194d8146101c6578063467ef06f146101f15780635297fae6146102045780636206585614610217575f80fd5b80630118acc4146101205780630322ed98146101355780630cdd098514610148578063151d30d114610199575b5f80fd5b61013361012e366004614267565b6102fb565b005b6101336101433660046142a2565b610786565b6101866101563660046142a2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101a1600a81565b60405160ff9091168152602001610190565b6101336101c13660046142a2565b6108e2565b6101d96101d43660046142a2565b61094f565b6040516001600160401b039091168152602001610190565b6101336101ff3660046142b9565b610965565b6101336102123660046142d2565b610990565b6101866102253660046142fa565b610b81565b610186610238366004614320565b610b9a565b6101d961024b3660046142a2565b610bcd565b61013361025e3660046142a2565b610be1565b610133610271366004614267565b610c4e565b6101336102843660046142d2565b610d20565b610133610297366004614395565b610f50565b6101866102aa3660046143d3565b611034565b6101336102bd3660046142b9565b611040565b6102d06005600160991b0181565b6040516001600160a01b039091168152602001610190565b6101336102f63660046142a2565b6111fd565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614b8683398151915291841561034d5761034a82856112cc565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561037f5761037f6143f3565b6004811115610390576103906143f3565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610417576104176143f3565b146104695760405162461bcd60e51b815260206004820152602a60248201525f80516020614ba68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104ce5760405162461bcd60e51b815260206004820152603360248201525f80516020614ba68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610460565b5f6104d884611568565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff19166001836004811115610525576105256143f3565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105f7856115dc565b905082606001516001600160401b03168160a001516001600160401b03161161066e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610460565b5f83606001518260a00151610683919061441b565b905061068f86826116bb565b5f61069b878584611703565b5f8c815260088a01602052604090209091506106b782826144d2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906106e49085906004016145b3565b6020604051808303815f875af1158015610700573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072491906145e5565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020614bc68339815191529291906107ce90614456565b9050118015610800575060035f83815260078301602052604090205460ff1660058111156107fe576107fe6143f3565b145b6108645760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610460565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161089d91906004016145fc565b6020604051808303815f875af11580156108b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108dd91906145e5565b505050565b6108eb81611920565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614b86833981519152916005600160991b019163ee5b48eb9161089d916004016145fc565b5f61095f64e8d4a510008361469a565b92915050565b5f61096f826119ef565b905061098c81606001516001600160401b03168260400151611d7c565b5050565b5f80516020614b868339815191525f6109a884611db2565b90505f806109b98360400151611f93565b50915091506109c7856121ce565b5f85815260078501602052604081206109df916141af565b5f6109e9836115dc565b9050816001600160401b031681608001516001600160401b03161015610a215760405162461bcd60e51b8152600401610460906146ad565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a665760405162461bcd60e51b8152600401610460906146ef565b60015f87815260068701602052604090205460ff166004811115610a8c57610a8c6143f3565b14610af55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610460565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61095f6001600160401b03831664e8d4a51000614738565b5f610ba36122a7565b610bae8484846122de565b9050610bc660015f80516020614be683398151915255565b9392505050565b5f610bd7826115dc565b60a0015192915050565b610bea816121ce565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f80516020614b86833981519152916005600160991b019163ee5b48eb9161089d916004016145fc565b5f80516020614b868339815191525f610c66856115dc565b5f86815260058401602052604090206001015460c0820151919250610c93916001600160401b031661474f565b421015610cfe5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610460565b8315610d1057610d0e85846112cc565b505b610d19856124c8565b5050505050565b5f80516020614b868339815191525f610d3884611db2565b90505f80610d498360400151611f93565b5091509150610d5785611920565b5f8581526008850160205260408120610d6f916141af565b5f610d79836115dc565b9050816001600160401b031681608001516001600160401b03161015610db15760405162461bcd60e51b8152600401610460906146ad565b5f8681526006860160205260409020600301546001600160401b0380841691161115610def5760405162461bcd60e51b8152600401610460906146ef565b60035f87815260068701602052604090205460ff166004811115610e1557610e156143f3565b14610e695760405162461bcd60e51b815260206004820152603160248201525f80516020614ba68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610460565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f0e91611d7c565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610f99575080546001600160401b03808416911610155b15610fb75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610fe28484612880565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610bc683338461289a565b5f80516020614bc68339815191525f61105883611db2565b90505f806110698360400151612cce565b91509150806110cb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610460565b5f828152600585016020526040812080546110e590614456565b9050118015611117575060015f83815260078601602052604090205460ff166005811115611115576111156143f3565b145b6111335760405162461bcd60e51b815260040161046090614762565b5f828152600585016020526040812061114b916141af565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614bc683398151915292919061124590614456565b9050118015611277575060015f83815260078301602052604090205460ff166005811115611275576112756143f3565b145b6112935760405162461bcd60e51b815260040161046090614762565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161089d91906004016145fc565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611317573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261133e919081019061480c565b91509150806113a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610460565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113e4573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140891906145e5565b82511461146c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610460565b60208201516001600160a01b0316156114e25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610460565b5f806114f18460400151612e6f565b9150915081871461155e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610460565b9695505050505050565b5f8181525f80516020614c068339815191526020526040812060030180545f80516020614bc6833981519152916001600160401b03909116908190846115ad836148f4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6115e46141e6565b5f8281525f80516020614c068339815191526020526040908190208151610100810190925280545f80516020614bc6833981519152929190829060ff166005811115611632576116326143f3565b6005811115611643576116436143f3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614c06833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561177c5761173c816001614919565b611747906008614738565b5081515f9083908390811061175e5761175e61492c565b60200101906001600160f81b03191690815f1a905350600101611728565b505f5b60048110156117df57611793816003614919565b61179e906008614738565b6001901c60f81b826117b183600261474f565b815181106117c1576117c161492c565b60200101906001600160f81b03191690815f1a90535060010161177f565b505f5b6020811015611841576117f681601f614919565b611801906008614738565b86901c60f81b8261181383600661474f565b815181106118235761182361492c565b60200101906001600160f81b03191690815f1a9053506001016117e2565b505f5b60088110156118ac57611858816007614919565b611863906008614738565b6001600160401b038616901c60f81b8261187e83602661474f565b8151811061188e5761188e61492c565b60200101906001600160f81b03191690815f1a905350600101611844565b505f5b6008811015611917576118c3816007614919565b6118ce906008614738565b6001600160401b038516901c60f81b826118e983602e61474f565b815181106118f9576118f961492c565b60200101906001600160f81b03191690815f1a9053506001016118af565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f80516020614b8683398151915292919061196890614456565b905011801561199a575060035f83815260068301602052604090205460ff166004811115611998576119986143f3565b145b61098c5760405162461bcd60e51b815260206004820152603360248201525f80516020614ba683398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610460565b6119f76141e6565b5f80516020614bc68339815191525f611a0f84611db2565b90505f80611a208360400151612cce565b915091508015611a855760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610460565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611ab757611ab76143f3565b6005811115611ac857611ac86143f3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b4f57611b4f6143f3565b1480611b6d5750600182516005811115611b6b57611b6b6143f3565b145b611bcc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610460565b600382516005811115611be157611be16143f3565b03611c0857505f8381526006860160205260408120600491611c0391906141af565b611c0c565b5060055b6020808301515f90815260088801909152604081205581816005811115611c3557611c356143f3565b90816005811115611c4857611c486143f3565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611c7c57611c7c6143f3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d4757611d476143f3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461098c906001600160a01b03168284613047565b60408051606080820183525f8083526020830181905292820152905f80516020614bc68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e27573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e4e919081019061480c565b9150915080611eb55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610460565b8254825114611f185760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610460565b60208201516001600160a01b031615611f8b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610460565b509392505050565b5f805f8351603614611fb75760405162461bcd60e51b815260040161046090614940565b5f805b600281101561200657611fce816001614919565b611fd9906008614738565b61ffff16868281518110611fef57611fef61492c565b016020015160f81c901b9190911790600101611fba565b5061ffff8116156120295760405162461bcd60e51b815260040161046090614989565b5f805b600481101561208457612040816003614919565b61204b906008614738565b63ffffffff168761205d83600261474f565b8151811061206d5761206d61492c565b016020015160f81c901b919091179060010161202c565b5063ffffffff81166003146120ab5760405162461bcd60e51b8152600401610460906149cc565b5f805b6020811015612100576120c281601f614919565b6120cd906008614738565b886120d983600661474f565b815181106120e9576120e961492c565b016020015160f81c901b91909117906001016120ae565b505f805b600881101561215f57612118816007614919565b612123906008614738565b6001600160401b03168961213883602661474f565b815181106121485761214861492c565b016020015160f81c901b9190911790600101612104565b505f805b60088110156121be57612177816007614919565b612182906008614738565b6001600160401b03168a61219783602e61474f565b815181106121a7576121a761492c565b016020015160f81c901b9190911790600101612163565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f80516020614b8683398151915292919061221690614456565b9050118015612248575060015f83815260068301602052604090205460ff166004811115612246576122466143f3565b145b61098c5760405162461bcd60e51b815260206004820152603860248201525f80516020614ba683398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610460565b5f80516020614be68339815191528054600119016122d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614b86833981519152906001600160401b0316602085013510156123855760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610460565b6003810154843510156123ee5760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610460565b80548310801590612403575080600101548311155b6124615760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610460565b5f61246b846130a6565b90505f6124778261094f565b90505f61248488836130dc565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f80516020614be683398151915255565b5f8181525f80516020614c0683398151915260205260408082208151610100810190925280545f80516020614bc683398151915293929190829060ff166005811115612516576125166143f3565b6005811115612527576125276143f3565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156125af576125af6143f3565b1461260b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610460565b60408101516001600160a01b0316336001600160a01b0316146126855760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610460565b6126928160a001516135a9565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156126d6576126d66143f3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127a28461279c81611568565b5f611703565b5f85815260068501602052604090209091506127be82826144d2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906127eb9085906004016145b3565b6020604051808303815f875af1158015612807573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061282b91906145e5565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61288861374a565b61289182613795565b61098c816137f3565b5f6128a36122a7565b5f80516020614b868339815191525f6128be6101d4856130a6565b90505f6128ca876115dc565b90506002815160058111156128e1576128e16143f3565b146129405760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610460565b5f828260a001516129519190614a13565b60048501546001860154919250612973916001600160401b0390911690614738565b61297c82610b81565b11156129e85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610460565b6129f288826116bb565b5f6129fc89611568565b90505f8982604051602001612a2892919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612a49856135a9565b5f612a558b8486611703565b5f8381526007890160205260409020909150612a7182826144d2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612a9e9085906004016145b3565b6020604051808303815f875af1158015612aba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ade91906145e5565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612b8d57612b8d6143f3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050610bc660015f80516020614be683398151915255565b5f808251602714612cf15760405162461bcd60e51b815260040161046090614940565b5f805b6002811015612d4057612d08816001614919565b612d13906008614738565b61ffff16858281518110612d2957612d2961492c565b016020015160f81c901b9190911790600101612cf4565b5061ffff811615612d635760405162461bcd60e51b815260040161046090614989565b5f805b6004811015612dbe57612d7a816003614919565b612d85906008614738565b63ffffffff1686612d9783600261474f565b81518110612da757612da761492c565b016020015160f81c901b9190911790600101612d66565b5063ffffffff8116600214612de55760405162461bcd60e51b8152600401610460906149cc565b5f805b6020811015612e3a57612dfc81601f614919565b612e07906008614738565b87612e1383600661474f565b81518110612e2357612e2361492c565b016020015160f81c901b9190911790600101612de8565b505f86602681518110612e4f57612e4f61492c565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e925760405162461bcd60e51b815260040161046090614940565b5f805b6002811015612ee157612ea9816001614919565b612eb4906008614738565b61ffff16858281518110612eca57612eca61492c565b016020015160f81c901b9190911790600101612e95565b5061ffff811615612f045760405162461bcd60e51b815260040161046090614989565b5f805b6004811015612f5f57612f1b816003614919565b612f26906008614738565b63ffffffff1686612f3883600261474f565b81518110612f4857612f4861492c565b016020015160f81c901b9190911790600101612f07565b5063ffffffff8116600414612f865760405162461bcd60e51b8152600401610460906149cc565b5f805b6020811015612fdb57612f9d81601f614919565b612fa8906008614738565b87612fb483600661474f565b81518110612fc457612fc461492c565b016020015160f81c901b9190911790600101612f89565b505f805b600881101561303a57612ff3816007614919565b612ffe906008614738565b6001600160401b03168861301383602661474f565b815181106130235761302361492c565b016020015160f81c901b9190911790600101612fdf565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526108dd91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506138a7565b5f61095f827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613908565b5f5f80516020614bc6833981519152426130fc60408601602087016142fa565b6001600160401b0316118015613135575061311d60408501602086016142fa565b6001600160401b0316613133426202a30061474f565b115b6131975760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610460565b83356131ef5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610460565b83355f9081526008820160205260409020541561325f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610460565b61326c6040850185614a33565b90506030146132d35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610460565b6132dc836135a9565b5f806133766040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061332191906142fa565b6001600160401b0316815260200161333c60408a018a614a33565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613a6a565b5f8281526005860160205260409020919350915061339482826144d2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906133c19085906004016145b3565b6020604051808303815f875af11580156133dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061340191906145e5565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff19166001836005811115613483576134836143f3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905561354483611568565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961357b60408d0160208e016142fa565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614bc68339815191529060ff165f036135e7575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061362f9083614919565b1061364b576001600160401b038416604083015280825261366a565b838260400181815161365d9190614a13565b6001600160401b03169052505b5f8260200151836040015160646136819190614a7c565b61368b9190614aa7565b600285015490915060ff90811690821611156137065760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610460565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661379357604051631afcd79f60e31b815260040160405180910390fd5b565b61379d61374a565b6137a681613e0f565b6137f0606082013560808301356137c360c0850160a086016142fa565b60c08501356137d9610100870160e08801614acc565b6137eb61012088016101008901614aec565b613e30565b50565b6137fb61374a565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166138875760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610460565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6138bb6001600160a01b03841683613fc3565b905080515f141580156138df5750808060200190518101906138dd9190614b07565b155b156108dd57604051635274afe760e01b81526001600160a01b0384166004820152602401610460565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561394e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061397291906145e5565b90506139896001600160a01b038516333086613fd0565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156139cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139f191906145e5565b9050818111613a575760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610460565b613a618282614919565b95945050505050565b5f6060826080015151603014613ad45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610460565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613b4b57613b0b816001614919565b613b16906008614738565b5081515f90839083908110613b2d57613b2d61492c565b60200101906001600160f81b03191690815f1a905350600101613af7565b505f5b6004811015613ba957613b62816003614919565b613b6d906008614738565b505f82613b7b83600261474f565b81518110613b8b57613b8b61492c565b60200101906001600160f81b03191690815f1a905350600101613b4e565b505f5b6020811015613c065784518160208110613bc857613bc861492c565b1a60f81b82613bd883600661474f565b81518110613be857613be861492c565b60200101906001600160f81b03191690815f1a905350600101613bac565b505f5b6020811015613c665784602001518160208110613c2857613c2861492c565b1a60f81b82613c3883602661474f565b81518110613c4857613c4861492c565b60200101906001600160f81b03191690815f1a905350600101613c09565b505f5b6008811015613cda57613c7d816007614919565b613c88906008614738565b60ff1685604001516001600160401b0316901c60f81b82826046613cac919061474f565b81518110613cbc57613cbc61492c565b60200101906001600160f81b03191690815f1a905350600101613c69565b505f5b6030811015613d455784608001518181518110613cfc57613cfc61492c565b01602001516001600160f81b03191682613d1783604e61474f565b81518110613d2757613d2761492c565b60200101906001600160f81b03191690815f1a905350600101613cdd565b505f5b6008811015613db757613d5c816007614919565b613d67906008614738565b60608601516001600160401b0390811691161c60f81b82613d8983607e61474f565b81518110613d9957613d9961492c565b60200101906001600160f81b03191690815f1a905350600101613d48565b50600281604051613dc89190614b22565b602060405180830381855afa158015613de3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613e0691906145e5565b94909350915050565b613e1761374a565b613e1f61400f565b613e2761401f565b6137f081614027565b613e3861374a565b5f80516020614b8683398151915283613e635760405162461bcd60e51b815260040161046090614b3d565b85871115613ecb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610460565b600a60ff84161115613f3d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610460565b5f8411613f5c5760405162461bcd60e51b815260040161046090614b3d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6060610bc683835f614093565b6040516001600160a01b0384811660248301528381166044830152606482018390526140099186918216906323b872dd90608401613074565b50505050565b61401761374a565b613793614122565b61379361374a565b61402f61374a565b80355f80516020614bc683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556140796060830160408401614acc565b600291909101805460ff191660ff90921691909117905550565b6060814710156140b85760405163cd78605960e01b8152306004820152602401610460565b5f80856001600160a01b031684866040516140d39190614b22565b5f6040518083038185875af1925050503d805f811461410d576040519150601f19603f3d011682016040523d82523d5f602084013e614112565b606091505b509150915061155e86838361412a565b6124b561374a565b60608261413f5761413a82614186565b610bc6565b815115801561415657506001600160a01b0384163b155b1561417f57604051639996b31560e01b81526001600160a01b0385166004820152602401610460565b5080610bc6565b8051156141965780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546141bb90614456565b5f825580601f106141ca575050565b601f0160209004905f5260205f20908101906137f0919061422a565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561423e575f815560010161422b565b5090565b80151581146137f0575f80fd5b803563ffffffff81168114614262575f80fd5b919050565b5f805f60608486031215614279575f80fd5b83359250602084013561428b81614242565b91506142996040850161424f565b90509250925092565b5f602082840312156142b2575f80fd5b5035919050565b5f602082840312156142c9575f80fd5b610bc68261424f565b5f80604083850312156142e3575f80fd5b6142ec8361424f565b946020939093013593505050565b5f6020828403121561430a575f80fd5b81356001600160401b0381168114610bc6575f80fd5b5f805f8385036080811215614333575f80fd5b84356001600160401b03811115614348575f80fd5b850160608188031215614359575f80fd5b93506040601f198201121561436c575f80fd5b50602084019150606084013590509250925092565b6001600160a01b03811681146137f0575f80fd5b5f808284036101408112156143a8575f80fd5b610120808212156143b7575f80fd5b84935083013590506143c881614381565b809150509250929050565b5f80604083850312156143e4575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561443b5761443b614407565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061446a57607f821691505b60208210810361448857634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156108dd57805f5260205f20601f840160051c810160208510156144b35750805b601f840160051c820191505b81811015610d19575f81556001016144bf565b81516001600160401b038111156144eb576144eb614442565b6144ff816144f98454614456565b8461448e565b602080601f831160018114614532575f841561451b5750858301515b5f19600386901b1c1916600185901b178555614589565b5f85815260208120601f198616915b8281101561456057888601518255948401946001909101908401614541565b508582101561457d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156145ab578181015183820152602001614593565b50505f910152565b602081525f82518060208401526145d1816040850160208701614591565b601f01601f19169190910160400192915050565b5f602082840312156145f5575f80fd5b5051919050565b5f60208083525f845461460e81614456565b806020870152604060018084165f811461462f576001811461464b57614678565b60ff19851660408a0152604084151560051b8a01019550614678565b895f5260205f205f5b8581101561466f5781548b8201860152908301908801614654565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826146a8576146a8614686565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761095f5761095f614407565b8082018082111561095f5761095f614407565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b03811182821017156147cb576147cb614442565b60405290565b604051601f8201601f191681016001600160401b03811182821017156147f9576147f9614442565b604052919050565b805161426281614242565b5f806040838503121561481d575f80fd5b82516001600160401b0380821115614833575f80fd5b9084019060608287031215614846575f80fd5b61484e6147a9565b8251815260208084015161486181614381565b82820152604084015183811115614876575f80fd5b80850194505087601f85011261488a575f80fd5b83518381111561489c5761489c614442565b6148ae601f8201601f191683016147d1565b935080845288828287010111156148c3575f80fd5b6148d281838601848801614591565b508260408301528195506148e7818801614801565b9450505050509250929050565b5f6001600160401b0380831681810361490f5761490f614407565b6001019392505050565b8181038181111561095f5761095f614407565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561443b5761443b614407565b5f808335601e19843603018112614a48575f80fd5b8301803591506001600160401b03821115614a61575f80fd5b602001915036819003821315614a75575f80fd5b9250929050565b6001600160401b03818116838216028082169190828114614a9f57614a9f614407565b505092915050565b5f6001600160401b0380841680614ac057614ac0614686565b92169190910492915050565b5f60208284031215614adc575f80fd5b813560ff81168114610bc6575f80fd5b5f60208284031215614afc575f80fd5b8135610bc681614381565b5f60208284031215614b17575f80fd5b8151610bc681614242565b5f8251614b33818460208701614591565b9190910192915050565b60208082526028908201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160408201526774696f6e2066656560c01b60608201526080019056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614e7a380380614e7a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d2d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806366435abf116100a95780639e1bc4ef1161006e5780639e1bc4ef146102b0578063a13fd29d146102c3578063a3a65e48146102d6578063b771b3bc146102e9578063bee0a03f1461030f575f80fd5b806366435abf146102515780636d0e43fa146102645780636f5f1c941461027757806376f786211461028a57806398f3e2b41461029d575f80fd5b80632e2194d8116100ef5780632e2194d8146101d157806335455ded146101fc578063467ef06f146102185780635297fae61461022b578063620658561461023e575f80fd5b80630118acc41461012b5780630322ed98146101405780630cdd098514610153578063151d30d1146101a4578063162f1f61146101be575b5f80fd5b61013e610139366004614321565b610322565b005b61013e61014e36600461435c565b6107ad565b61019161016136600461435c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b6101ac600a81565b60405160ff909116815260200161019b565b61013e6101cc36600461435c565b610909565b6101e46101df36600461435c565b610976565b6040516001600160401b03909116815260200161019b565b61020561271081565b60405161ffff909116815260200161019b565b61013e610226366004614373565b61098c565b61013e61023936600461438c565b6109b7565b61019161024c3660046143c8565b610ba8565b6101e461025f36600461435c565b610bc1565b61013e61027236600461435c565b610bd5565b61013e6102853660046143f7565b610c42565b61013e610298366004614321565b610d26565b61013e6102ab36600461438c565b610e06565b6101916102be366004614435565b611036565b6101916102d1366004614455565b611049565b61013e6102e4366004614373565b611075565b6102f76005600160991b0181565b6040516001600160a01b03909116815260200161019b565b61013e61031d36600461435c565b611232565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614c81833981519152918415610374576103718285611301565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103a6576103a66144b6565b60048111156103b7576103b76144b6565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561043e5761043e6144b6565b146104905760405162461bcd60e51b815260206004820152602a60248201525f80516020614ca18339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104f55760405162461bcd60e51b815260206004820152603360248201525f80516020614ca18339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610487565b5f6104ff8461159d565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561054c5761054c6144b6565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61061e85611611565b905082606001516001600160401b03168160a001516001600160401b0316116106955760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610487565b5f83606001518260a001516106aa91906144de565b90506106b686826116f0565b5f6106c2878584611738565b5f8c815260088a01602052604090209091506106de8282614595565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061070b908590600401614676565b6020604051808303815f875af1158015610727573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074b91906146a8565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020614cc18339815191529291906107f590614519565b9050118015610827575060035f83815260078301602052604090205460ff166005811115610825576108256144b6565b145b61088b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610487565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108c491906004016146bf565b6020604051808303815f875af11580156108e0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090491906146a8565b505050565b61091281611955565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f80516020614c81833981519152916005600160991b019163ee5b48eb916108c4916004016146bf565b5f61098664e8d4a510008361475d565b92915050565b5f61099682611a24565b90506109b381606001516001600160401b03168260400151611db1565b5050565b5f80516020614c818339815191525f6109cf84611de7565b90505f806109e08360400151611fc8565b50915091506109ee85612203565b5f8581526007850160205260408120610a0691614269565b5f610a1083611611565b9050816001600160401b031681608001516001600160401b03161015610a485760405162461bcd60e51b815260040161048790614770565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a8d5760405162461bcd60e51b8152600401610487906147b2565b60015f87815260068701602052604090205460ff166004811115610ab357610ab36144b6565b14610b1c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610487565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109866001600160401b03831664e8d4a510006147fb565b5f610bcb82611611565b60a0015192915050565b610bde81612203565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f80516020614c81833981519152916005600160991b019163ee5b48eb916108c4916004016146bf565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610c8b575080546001600160401b03808416911610155b15610ca95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610cd484846122dc565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020614c818339815191525f610d3e85611611565b5f86815260058401602052604090205460c0820151919250610d7091620100009091046001600160401b031690614812565b6001600160401b0316421015610de45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610487565b8315610df657610df48584611301565b505b610dff856122f6565b5050505050565b5f80516020614c818339815191525f610e1e84611de7565b90505f80610e2f8360400151611fc8565b5091509150610e3d85611955565b5f8581526008850160205260408120610e5591614269565b5f610e5f83611611565b9050816001600160401b031681608001516001600160401b03161015610e975760405162461bcd60e51b815260040161048790614770565b5f8681526006860160205260409020600301546001600160401b0380841691161115610ed55760405162461bcd60e51b8152600401610487906147b2565b60035f87815260068701602052604090205460ff166004811115610efb57610efb6144b6565b14610f4f5760405162461bcd60e51b815260206004820152603160248201525f80516020614ca18339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610487565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610ff491611db1565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f6110428333846126ae565b9392505050565b5f611052612aec565b61105d848484612b23565b905061104260015f80516020614ce183398151915255565b5f80516020614cc18339815191525f61108d83611de7565b90505f8061109e8360400151612d49565b91509150806111005760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610487565b5f8281526005850160205260408120805461111a90614519565b905011801561114c575060015f83815260078601602052604090205460ff16600581111561114a5761114a6144b6565b145b6111685760405162461bcd60e51b815260040161048790614832565b5f828152600585016020526040812061118091614269565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614cc183398151915292919061127a90614519565b90501180156112ac575060015f83815260078301602052604090205460ff1660058111156112aa576112aa6144b6565b145b6112c85760405162461bcd60e51b815260040161048790614832565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108c491906004016146bf565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561134c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261137391908101906148dc565b91509150806113d65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610487565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611419573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061143d91906146a8565b8251146114a15760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610487565b60208201516001600160a01b0316156115175760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610487565b5f806115268460400151612eea565b915091508187146115935760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610487565b9695505050505050565b5f8181525f80516020614d018339815191526020526040812060030180545f80516020614cc1833981519152916001600160401b03909116908190846115e2836149c4565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6116196142a0565b5f8281525f80516020614d018339815191526020526040908190208151610100810190925280545f80516020614cc1833981519152929190829060ff166005811115611667576116676144b6565b6005811115611678576116786144b6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614d01833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156117b1576117718160016149e9565b61177c9060086147fb565b5081515f90839083908110611793576117936149fc565b60200101906001600160f81b03191690815f1a90535060010161175d565b505f5b6004811015611814576117c88160036149e9565b6117d39060086147fb565b6001901c60f81b826117e6836002614a10565b815181106117f6576117f66149fc565b60200101906001600160f81b03191690815f1a9053506001016117b4565b505f5b60208110156118765761182b81601f6149e9565b6118369060086147fb565b86901c60f81b82611848836006614a10565b81518110611858576118586149fc565b60200101906001600160f81b03191690815f1a905350600101611817565b505f5b60088110156118e15761188d8160076149e9565b6118989060086147fb565b6001600160401b038616901c60f81b826118b3836026614a10565b815181106118c3576118c36149fc565b60200101906001600160f81b03191690815f1a905350600101611879565b505f5b600881101561194c576118f88160076149e9565b6119039060086147fb565b6001600160401b038516901c60f81b8261191e83602e614a10565b8151811061192e5761192e6149fc565b60200101906001600160f81b03191690815f1a9053506001016118e4565b50949350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f80516020614c8183398151915292919061199d90614519565b90501180156119cf575060035f83815260068301602052604090205460ff1660048111156119cd576119cd6144b6565b145b6109b35760405162461bcd60e51b815260206004820152603360248201525f80516020614ca183398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610487565b611a2c6142a0565b5f80516020614cc18339815191525f611a4484611de7565b90505f80611a558360400151612d49565b915091508015611aba5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610487565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611aec57611aec6144b6565b6005811115611afd57611afd6144b6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611b8457611b846144b6565b1480611ba25750600182516005811115611ba057611ba06144b6565b145b611c015760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610487565b600382516005811115611c1657611c166144b6565b03611c3d57505f8381526006860160205260408120600491611c389190614269565b611c41565b5060055b6020808301515f90815260088801909152604081205581816005811115611c6a57611c6a6144b6565b90816005811115611c7d57611c7d6144b6565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611cb157611cb16144b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d7c57611d7c6144b6565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546109b3906001600160a01b031682846130c2565b60408051606080820183525f8083526020830181905292820152905f80516020614cc18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e5c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e8391908101906148dc565b9150915080611eea5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610487565b8254825114611f4d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610487565b60208201516001600160a01b031615611fc05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610487565b509392505050565b5f805f8351603614611fec5760405162461bcd60e51b815260040161048790614a23565b5f805b600281101561203b576120038160016149e9565b61200e9060086147fb565b61ffff16868281518110612024576120246149fc565b016020015160f81c901b9190911790600101611fef565b5061ffff81161561205e5760405162461bcd60e51b815260040161048790614a6c565b5f805b60048110156120b9576120758160036149e9565b6120809060086147fb565b63ffffffff1687612092836002614a10565b815181106120a2576120a26149fc565b016020015160f81c901b9190911790600101612061565b5063ffffffff81166003146120e05760405162461bcd60e51b815260040161048790614aaf565b5f805b6020811015612135576120f781601f6149e9565b6121029060086147fb565b8861210e836006614a10565b8151811061211e5761211e6149fc565b016020015160f81c901b91909117906001016120e3565b505f805b60088110156121945761214d8160076149e9565b6121589060086147fb565b6001600160401b03168961216d836026614a10565b8151811061217d5761217d6149fc565b016020015160f81c901b9190911790600101612139565b505f805b60088110156121f3576121ac8160076149e9565b6121b79060086147fb565b6001600160401b03168a6121cc83602e614a10565b815181106121dc576121dc6149fc565b016020015160f81c901b9190911790600101612198565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f80516020614c8183398151915292919061224b90614519565b905011801561227d575060015f83815260068301602052604090205460ff16600481111561227b5761227b6144b6565b145b6109b35760405162461bcd60e51b815260206004820152603860248201525f80516020614ca183398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610487565b6122e4613121565b6122ed8261316c565b6109b3816131d9565b5f8181525f80516020614d0183398151915260205260408082208151610100810190925280545f80516020614cc183398151915293929190829060ff166005811115612344576123446144b6565b6005811115612355576123556144b6565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156123dd576123dd6144b6565b146124395760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610487565b60408101516001600160a01b0316336001600160a01b0316146124b35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610487565b6124c08160a0015161328d565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff19166001836005811115612504576125046144b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125d0846125ca8161159d565b5f611738565b5f85815260068501602052604090209091506125ec8282614595565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612619908590600401614676565b6020604051808303815f875af1158015612635573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061265991906146a8565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126b7612aec565b5f80516020614c818339815191525f6126d26101df8561342e565b90505f6126de87611611565b90506002815160058111156126f5576126f56144b6565b146127545760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610487565b5f828260a001516127659190614812565b60048501546060840151919250612787916001600160401b0390911690614af6565b6001600160401b0316816001600160401b031611156128065760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610487565b61281088826116f0565b5f61281a8961159d565b90505f898260405160200161284692919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090506128678561328d565b5f6128738b8486611738565b5f838152600789016020526040902090915061288f8282614595565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906128bc908590600401614676565b6020604051808303815f875af11580156128d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128fc91906146a8565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff021916908360048111156129ab576129ab6144b6565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45090965050505050505061104260015f80516020614ce183398151915255565b5f80516020614ce1833981519152805460011901612b1d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614c81833981519152906001600160401b0316612b6f60408601602087016143c8565b6001600160401b03161015612bde5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610487565b6003810154612bf06020860186614b30565b61ffff1610158015612c145750612710612c0d6020860186614b30565b61ffff1611155b612c745760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610487565b80548310801590612c89575080600101548311155b612ce75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610487565b5f612cf18461342e565b90505f612cfd82610976565b90505f612d0a8883613464565b5f81815260058601602052604090209091508790612d288282614b4b565b509098975050505050505050565b60015f80516020614ce183398151915255565b5f808251602714612d6c5760405162461bcd60e51b815260040161048790614a23565b5f805b6002811015612dbb57612d838160016149e9565b612d8e9060086147fb565b61ffff16858281518110612da457612da46149fc565b016020015160f81c901b9190911790600101612d6f565b5061ffff811615612dde5760405162461bcd60e51b815260040161048790614a6c565b5f805b6004811015612e3957612df58160036149e9565b612e009060086147fb565b63ffffffff1686612e12836002614a10565b81518110612e2257612e226149fc565b016020015160f81c901b9190911790600101612de1565b5063ffffffff8116600214612e605760405162461bcd60e51b815260040161048790614aaf565b5f805b6020811015612eb557612e7781601f6149e9565b612e829060086147fb565b87612e8e836006614a10565b81518110612e9e57612e9e6149fc565b016020015160f81c901b9190911790600101612e63565b505f86602681518110612eca57612eca6149fc565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612f0d5760405162461bcd60e51b815260040161048790614a23565b5f805b6002811015612f5c57612f248160016149e9565b612f2f9060086147fb565b61ffff16858281518110612f4557612f456149fc565b016020015160f81c901b9190911790600101612f10565b5061ffff811615612f7f5760405162461bcd60e51b815260040161048790614a6c565b5f805b6004811015612fda57612f968160036149e9565b612fa19060086147fb565b63ffffffff1686612fb3836002614a10565b81518110612fc357612fc36149fc565b016020015160f81c901b9190911790600101612f82565b5063ffffffff81166004146130015760405162461bcd60e51b815260040161048790614aaf565b5f805b60208110156130565761301881601f6149e9565b6130239060086147fb565b8761302f836006614a10565b8151811061303f5761303f6149fc565b016020015160f81c901b9190911790600101613004565b505f805b60088110156130b55761306e8160076149e9565b6130799060086147fb565b6001600160401b03168861308e836026614a10565b8151811061309e5761309e6149fc565b016020015160f81c901b919091179060010161305a565b5090969095509350505050565b6040516001600160a01b0383811660248301526044820183905261090491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613931565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661316a57604051631afcd79f60e31b815260040160405180910390fd5b565b613174613121565b61317d81613992565b6131d66060820135608083013561319a60c0850160a086016143c8565b6131aa60e0860160c08701614b30565b61ffff166131bf610100870160e08801614ba1565b6131d161012088016101008901614bc1565b6139b3565b50565b6131e1613121565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661326d5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610487565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614cc18339815191529060ff165f036132cb575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061331390836149e9565b1061332f576001600160401b038416604083015280825261334e565b83826040018181516133419190614812565b6001600160401b03169052505b5f8260200151836040015160646133659190614af6565b61336f9190614bdc565b600285015490915060ff90811690821611156133ea5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610487565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610986827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b76565b5f5f80516020614cc18339815191524261348460408601602087016143c8565b6001600160401b03161180156134bd57506134a560408501602086016143c8565b6001600160401b03166134bb426202a300614a10565b115b61351f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610487565b83356135775760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610487565b83355f908152600882016020526040902054156135e75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610487565b6135f46040850185614c01565b905060301461365b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610487565b6136648361328d565b5f806136fe6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906136a991906143c8565b6001600160401b031681526020016136c460408a018a614c01565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613cd8565b5f8281526005860160205260409020919350915061371c8282614595565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613749908590600401614676565b6020604051808303815f875af1158015613765573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061378991906146a8565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561380b5761380b6144b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556138cc8361159d565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961390360408d0160208e016143c8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6139456001600160a01b0384168361407d565b905080515f141580156139695750808060200190518101906139679190614c4a565b155b1561090457604051635274afe760e01b81526001600160a01b0384166004820152602401610487565b61399a613121565b6139a261408a565b6139aa61409a565b6131d6816140a2565b6139bb613121565b5f80516020614c8183398151915283613a275760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610487565b85871115613a8f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610487565b600a60ff841611801590613aa557505f8360ff16115b613b0f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610487565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613bbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613be091906146a8565b9050613bf76001600160a01b03851633308661410e565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c5f91906146a8565b9050818111613cc55760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610487565b613ccf82826149e9565b95945050505050565b5f6060826080015151603014613d425760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610487565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613db957613d798160016149e9565b613d849060086147fb565b5081515f90839083908110613d9b57613d9b6149fc565b60200101906001600160f81b03191690815f1a905350600101613d65565b505f5b6004811015613e1757613dd08160036149e9565b613ddb9060086147fb565b505f82613de9836002614a10565b81518110613df957613df96149fc565b60200101906001600160f81b03191690815f1a905350600101613dbc565b505f5b6020811015613e745784518160208110613e3657613e366149fc565b1a60f81b82613e46836006614a10565b81518110613e5657613e566149fc565b60200101906001600160f81b03191690815f1a905350600101613e1a565b505f5b6020811015613ed45784602001518160208110613e9657613e966149fc565b1a60f81b82613ea6836026614a10565b81518110613eb657613eb66149fc565b60200101906001600160f81b03191690815f1a905350600101613e77565b505f5b6008811015613f4857613eeb8160076149e9565b613ef69060086147fb565b60ff1685604001516001600160401b0316901c60f81b82826046613f1a9190614a10565b81518110613f2a57613f2a6149fc565b60200101906001600160f81b03191690815f1a905350600101613ed7565b505f5b6030811015613fb35784608001518181518110613f6a57613f6a6149fc565b01602001516001600160f81b03191682613f8583604e614a10565b81518110613f9557613f956149fc565b60200101906001600160f81b03191690815f1a905350600101613f4b565b505f5b600881101561402557613fca8160076149e9565b613fd59060086147fb565b60608601516001600160401b0390811691161c60f81b82613ff783607e614a10565b81518110614007576140076149fc565b60200101906001600160f81b03191690815f1a905350600101613fb6565b506002816040516140369190614c65565b602060405180830381855afa158015614051573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061407491906146a8565b94909350915050565b606061104283835f61414d565b614092613121565b61316a6141dc565b61316a613121565b6140aa613121565b80355f80516020614cc183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556140f46060830160408401614ba1565b600291909101805460ff191660ff90921691909117905550565b6040516001600160a01b0384811660248301528381166044830152606482018390526141479186918216906323b872dd906084016130ef565b50505050565b6060814710156141725760405163cd78605960e01b8152306004820152602401610487565b5f80856001600160a01b0316848660405161418d9190614c65565b5f6040518083038185875af1925050503d805f81146141c7576040519150601f19603f3d011682016040523d82523d5f602084013e6141cc565b606091505b50915091506115938683836141e4565b612d36613121565b6060826141f9576141f482614240565b611042565b815115801561421057506001600160a01b0384163b155b1561423957604051639996b31560e01b81526001600160a01b0385166004820152602401610487565b5080611042565b8051156142505780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461427590614519565b5f825580601f10614284575050565b601f0160209004905f5260205f20908101906131d691906142e4565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156142f8575f81556001016142e5565b5090565b80151581146131d6575f80fd5b803563ffffffff8116811461431c575f80fd5b919050565b5f805f60608486031215614333575f80fd5b833592506020840135614345816142fc565b915061435360408501614309565b90509250925092565b5f6020828403121561436c575f80fd5b5035919050565b5f60208284031215614383575f80fd5b61104282614309565b5f806040838503121561439d575f80fd5b6143a683614309565b946020939093013593505050565b6001600160401b03811681146131d6575f80fd5b5f602082840312156143d8575f80fd5b8135611042816143b4565b6001600160a01b03811681146131d6575f80fd5b5f8082840361014081121561440a575f80fd5b61012080821215614419575f80fd5b849350830135905061442a816143e3565b809150509250929050565b5f8060408385031215614446575f80fd5b50508035926020909101359150565b5f805f8385036080811215614468575f80fd5b84356001600160401b0381111561447d575f80fd5b85016060818803121561448e575f80fd5b93506040601f19820112156144a1575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144fe576144fe6144ca565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061452d57607f821691505b60208210810361454b57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561090457805f5260205f20601f840160051c810160208510156145765750805b601f840160051c820191505b81811015610dff575f8155600101614582565b81516001600160401b038111156145ae576145ae614505565b6145c2816145bc8454614519565b84614551565b602080601f8311600181146145f5575f84156145de5750858301515b5f19600386901b1c1916600185901b17855561464c565b5f85815260208120601f198616915b8281101561462357888601518255948401946001909101908401614604565b508582101561464057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b8381101561466e578181015183820152602001614656565b50505f910152565b602081525f8251806020840152614694816040850160208701614654565b601f01601f19169190910160400192915050565b5f602082840312156146b8575f80fd5b5051919050565b5f60208083525f84546146d181614519565b806020870152604060018084165f81146146f2576001811461470e5761473b565b60ff19851660408a0152604084151560051b8a0101955061473b565b895f5260205f205f5b858110156147325781548b8201860152908301908801614717565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f8261476b5761476b614749565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610986576109866144ca565b6001600160401b038181168382160190808211156144fe576144fe6144ca565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b038111828210171561489b5761489b614505565b60405290565b604051601f8201601f191681016001600160401b03811182821017156148c9576148c9614505565b604052919050565b805161431c816142fc565b5f80604083850312156148ed575f80fd5b82516001600160401b0380821115614903575f80fd5b9084019060608287031215614916575f80fd5b61491e614879565b82518152602080840151614931816143e3565b82820152604084015183811115614946575f80fd5b80850194505087601f85011261495a575f80fd5b83518381111561496c5761496c614505565b61497e601f8201601f191683016148a1565b93508084528882828701011115614993575f80fd5b6149a281838601848801614654565b508260408301528195506149b78188016148d1565b9450505050509250929050565b5f6001600160401b038083168181036149df576149df6144ca565b6001019392505050565b81810381811115610986576109866144ca565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610986576109866144ca565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614b1957614b196144ca565b505092915050565b61ffff811681146131d6575f80fd5b5f60208284031215614b40575f80fd5b813561104281614b21565b8135614b5681614b21565b61ffff8116905081548161ffff1982161783556020840135614b77816143b4565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614bb1575f80fd5b813560ff81168114611042575f80fd5b5f60208284031215614bd1575f80fd5b8135611042816143e3565b5f6001600160401b0380841680614bf557614bf5614749565b92169190910492915050565b5f808335601e19843603018112614c16575f80fd5b8301803591506001600160401b03821115614c2f575f80fd5b602001915036819003821315614c43575f80fd5b9250929050565b5f60208284031215614c5a575f80fd5b8151611042816142fc565b5f8251614c76818460208701614654565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -233,6 +233,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorRaw) Transact return _ERC20TokenStakingManager.Contract.contract.Transact(opts, method, params...) } +// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMDELEGATIONFEEBIPS(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_DELEGATION_FEE_BIPS") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMDELEGATIONFEEBIPS() (uint16, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMDELEGATIONFEEBIPS() (uint16, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_ERC20TokenStakingManager.CallOpts) +} + // MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. // // Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) @@ -503,23 +534,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x9cb44341. +// Initialize is a paid mutator transaction binding the contract method 0x6f5f1c94. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint16,uint8,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 0x9cb44341. +// Initialize is a paid mutator transaction binding the contract method 0x6f5f1c94. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint16,uint8,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 0x9cb44341. +// Initialize is a paid mutator transaction binding the contract method 0x6f5f1c94. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint16,uint8,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) } @@ -587,23 +618,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init return _ERC20TokenStakingManager.Contract.InitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x65b3a621. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xa13fd29d. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint256,uint256) requirements, uint256 stakeAmount) returns(bytes32 validationID) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements, uint256 stakeAmount) returns(bytes32 validationID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements, stakeAmount *big.Int) (*types.Transaction, error) { return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, requirements, stakeAmount) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x65b3a621. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xa13fd29d. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint256,uint256) requirements, uint256 stakeAmount) returns(bytes32 validationID) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements, uint256 stakeAmount) returns(bytes32 validationID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements, stakeAmount *big.Int) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, requirements, stakeAmount) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x65b3a621. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xa13fd29d. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint256,uint256) requirements, uint256 stakeAmount) returns(bytes32 validationID) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements, uint256 stakeAmount) returns(bytes32 validationID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements, stakeAmount *big.Int) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, requirements, stakeAmount) } diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 6d61c0bd8..8822c1083 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -31,19 +31,19 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { - BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int - MinimumStakeDuration uint64 - MinimumDelegationFee *big.Int - MaximumStakeMultiplier uint8 - RewardCalculator common.Address + BaseSettings ValidatorManagerSettings + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + MinimumStakeDuration uint64 + MinimumDelegationFeeBips uint16 + MaximumStakeMultiplier uint8 + RewardCalculator common.Address } // PoSValidatorRequirements is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorRequirements struct { - DelegationFee *big.Int - MinStakeDuration *big.Int + DelegationFeeBips uint16 + MinStakeDuration uint64 } // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. @@ -62,8 +62,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\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"maximumStakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumDelegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFee\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"minStakeDuration\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516149b53803806149b583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6148688061014d5f395ff3fe608060405260043610610110575f3560e01c80635297fae61161009d57806398f3e2b41161006257806398f3e2b414610319578063a3a65e4814610338578063b771b3bc14610357578063bee0a03f14610389578063c599e24f146103a8575f80fd5b80635297fae61461027e578063620658561461029d57806366435abf146102bc5780636d0e43fa146102db57806376f78621146102fa575f80fd5b8063151d30d1116100e3578063151d30d1146101c4578063162f1f61146101ea5780632e2194d8146102095780634565701714610240578063467ef06f1461025f575f80fd5b80630118acc4146101145780630322ed98146101355780630cdd098514610154578063104595c4146101b1575b5f80fd5b34801561011f575f80fd5b5061013361012e366004613f0d565b6103bb565b005b348015610140575f80fd5b5061013361014f366004613f48565b610846565b34801561015f575f80fd5b5061019e61016e366004613f48565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61019e6101bf366004613f5f565b6109a2565b3480156101cf575f80fd5b506101d8600a81565b60405160ff90911681526020016101a8565b3480156101f5575f80fd5b50610133610204366004613f48565b6109d4565b348015610214575f80fd5b50610228610223366004613f48565b610a41565b6040516001600160401b0390911681526020016101a8565b34801561024b575f80fd5b5061013361025a366004613fb8565b610a51565b34801561026a575f80fd5b50610133610279366004613fcf565b610b33565b348015610289575f80fd5b50610133610298366004613fe8565b610b5e565b3480156102a8575f80fd5b5061019e6102b7366004614010565b610d4f565b3480156102c7575f80fd5b506102286102d6366004613f48565b610d68565b3480156102e6575f80fd5b506101336102f5366004613f48565b610d7c565b348015610305575f80fd5b50610133610314366004613f0d565b610de9565b348015610324575f80fd5b50610133610333366004613fe8565b610ebb565b348015610343575f80fd5b50610133610352366004613fcf565b6110eb565b348015610362575f80fd5b506103716005600160991b0181565b6040516001600160a01b0390911681526020016101a8565b348015610394575f80fd5b506101336103a3366004613f48565b6112a8565b61019e6103b6366004613f48565b611377565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206147bc83398151915291841561040d5761040a8285611383565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561043f5761043f614036565b600481111561045057610450614036565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104d7576104d7614036565b146105295760405162461bcd60e51b815260206004820152602a60248201525f805160206147dc8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461058e5760405162461bcd60e51b815260206004820152603360248201525f805160206147dc8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610520565b5f6105988461161f565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105e5576105e5614036565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106b785611693565b905082606001516001600160401b03168160a001516001600160401b03161161072e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610520565b5f83606001518260a00151610743919061405e565b905061074f8682611772565b5f61075b8785846117ba565b5f8c815260088a0160205260409020909150610777828261410f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906107a49085906004016141f0565b6020604051808303815f875af11580156107c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e49190614222565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206147fc83398151915292919061088e90614099565b90501180156108c0575060035f83815260078301602052604090205460ff1660058111156108be576108be614036565b145b6109245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610520565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161095d9190600401614239565b6020604051808303815f875af1158015610979573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099d9190614222565b505050565b5f6109ab6119d9565b6109b6838334611a10565b90506109ce60015f8051602061481c83398151915255565b92915050565b6109dd81611bef565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f805160206147bc833981519152916005600160991b019163ee5b48eb9161095d91600401614239565b5f6109ce64e8d4a51000836142d7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a9a575080546001600160401b03808416911610155b15610ab85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ae283611cbe565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b3d82611cd2565b9050610b5a81606001516001600160401b0316826040015161205f565b5050565b5f805160206147bc8339815191525f610b7684612072565b90505f80610b878360400151612253565b5091509150610b958561248e565b5f8581526007850160205260408120610bad91613e55565b5f610bb783611693565b9050816001600160401b031681608001516001600160401b03161015610bef5760405162461bcd60e51b8152600401610520906142ea565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c345760405162461bcd60e51b81526004016105209061432c565b60015f87815260068701602052604090205460ff166004811115610c5a57610c5a614036565b14610cc35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610520565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109ce6001600160401b03831664e8d4a51000614375565b5f610d7282611693565b60a0015192915050565b610d858161248e565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f805160206147bc833981519152916005600160991b019163ee5b48eb9161095d91600401614239565b5f805160206147bc8339815191525f610e0185611693565b5f86815260058401602052604090206001015460c0820151919250610e2e916001600160401b031661438c565b421015610e995760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610520565b8315610eab57610ea98584611383565b505b610eb485612567565b5050505050565b5f805160206147bc8339815191525f610ed384612072565b90505f80610ee48360400151612253565b5091509150610ef285611bef565b5f8581526008850160205260408120610f0a91613e55565b5f610f1483611693565b9050816001600160401b031681608001516001600160401b03161015610f4c5760405162461bcd60e51b8152600401610520906142ea565b5f8681526006860160205260409020600301546001600160401b0380841691161115610f8a5760405162461bcd60e51b81526004016105209061432c565b60035f87815260068701602052604090205460ff166004811115610fb057610fb0614036565b146110045760405162461bcd60e51b815260206004820152603160248201525f805160206147dc8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610520565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526110a99161205f565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206147fc8339815191525f61110383612072565b90505f80611114836040015161291f565b91509150806111765760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610520565b5f8281526005850160205260408120805461119090614099565b90501180156111c2575060015f83815260078601602052604090205460ff1660058111156111c0576111c0614036565b145b6111de5760405162461bcd60e51b81526004016105209061439f565b5f82815260058501602052604081206111f691613e55565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206147fc8339815191529291906112f090614099565b9050118015611322575060015f83815260078301602052604090205460ff16600581111561132057611320614036565b145b61133e5760405162461bcd60e51b81526004016105209061439f565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161095d9190600401614239565b5f6109ce823334612ac0565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156113ce573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113f5919081019061445d565b91509150806114585760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610520565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561149b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114bf9190614222565b8251146115235760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610520565b60208201516001600160a01b0316156115995760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610520565b5f806115a88460400151612ef1565b915091508187146116155760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610520565b9695505050505050565b5f8181525f8051602061483c8339815191526020526040812060030180545f805160206147fc833981519152916001600160401b039091169081908461166483614545565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b61169b613e8c565b5f8281525f8051602061483c8339815191526020526040908190208151610100810190925280545f805160206147fc833981519152929190829060ff1660058111156116e9576116e9614036565b60058111156116fa576116fa614036565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061483c833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611833576117f381600161456a565b6117fe906008614375565b5081515f908390839081106118155761181561457d565b60200101906001600160f81b03191690815f1a9053506001016117df565b505f5b60048110156118965761184a81600361456a565b611855906008614375565b6001901c60f81b8261186883600261438c565b815181106118785761187861457d565b60200101906001600160f81b03191690815f1a905350600101611836565b505f5b60208110156118f8576118ad81601f61456a565b6118b8906008614375565b86901c60f81b826118ca83600661438c565b815181106118da576118da61457d565b60200101906001600160f81b03191690815f1a905350600101611899565b505f5b60088110156119635761190f81600761456a565b61191a906008614375565b6001600160401b038616901c60f81b8261193583602661438c565b815181106119455761194561457d565b60200101906001600160f81b03191690815f1a9053506001016118fb565b505f5b60088110156119ce5761197a81600761456a565b611985906008614375565b6001600160401b038516901c60f81b826119a083602e61438c565b815181106119b0576119b061457d565b60200101906001600160f81b03191690815f1a905350600101611966565b5090505b9392505050565b5f8051602061481c833981519152805460011901611a0a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206147bc833981519152906001600160401b031660208501351015611ab75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610520565b600381015484351015611b205760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610520565b80548310801590611b35575080600101548311155b611b935760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610520565b825f611b9e82610a41565b90505f611bab88836130c9565b5f81815260059590950160209081526040909520883581559790940135600190970196909655509095945050505050565b60015f8051602061481c83398151915255565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f805160206147bc833981519152929190611c3790614099565b9050118015611c69575060035f83815260068301602052604090205460ff166004811115611c6757611c67614036565b145b610b5a5760405162461bcd60e51b815260206004820152603360248201525f805160206147dc83398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610520565b611cc6613596565b611ccf816135e1565b50565b611cda613e8c565b5f805160206147fc8339815191525f611cf284612072565b90505f80611d03836040015161291f565b915091508015611d685760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610520565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611d9a57611d9a614036565b6005811115611dab57611dab614036565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611e3257611e32614036565b1480611e505750600182516005811115611e4e57611e4e614036565b145b611eaf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610520565b600382516005811115611ec457611ec4614036565b03611eeb57505f8381526006860160205260408120600491611ee69190613e55565b611eef565b5060055b6020808301515f90815260088801909152604081205581816005811115611f1857611f18614036565b90816005811115611f2b57611f2b614036565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611f5f57611f5f614036565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561202a5761202a614036565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610b5a6001600160a01b0382168361363c565b60408051606080820183525f8083526020830181905292820152905f805160206147fc8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120e7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261210e919081019061445d565b91509150806121755760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610520565b82548251146121d85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610520565b60208201516001600160a01b03161561224b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610520565b509392505050565b5f805f83516036146122775760405162461bcd60e51b815260040161052090614591565b5f805b60028110156122c65761228e81600161456a565b612299906008614375565b61ffff168682815181106122af576122af61457d565b016020015160f81c901b919091179060010161227a565b5061ffff8116156122e95760405162461bcd60e51b8152600401610520906145da565b5f805b60048110156123445761230081600361456a565b61230b906008614375565b63ffffffff168761231d83600261438c565b8151811061232d5761232d61457d565b016020015160f81c901b91909117906001016122ec565b5063ffffffff811660031461236b5760405162461bcd60e51b81526004016105209061461d565b5f805b60208110156123c05761238281601f61456a565b61238d906008614375565b8861239983600661438c565b815181106123a9576123a961457d565b016020015160f81c901b919091179060010161236e565b505f805b600881101561241f576123d881600761456a565b6123e3906008614375565b6001600160401b0316896123f883602661438c565b815181106124085761240861457d565b016020015160f81c901b91909117906001016123c4565b505f805b600881101561247e5761243781600761456a565b612442906008614375565b6001600160401b03168a61245783602e61438c565b815181106124675761246761457d565b016020015160f81c901b9190911790600101612423565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f805160206147bc8339815191529291906124d690614099565b9050118015612508575060015f83815260068301602052604090205460ff16600481111561250657612506614036565b145b610b5a5760405162461bcd60e51b815260206004820152603860248201525f805160206147dc83398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610520565b5f8181525f8051602061483c83398151915260205260408082208151610100810190925280545f805160206147fc83398151915293929190829060ff1660058111156125b5576125b5614036565b60058111156125c6576125c6614036565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561264e5761264e614036565b146126aa5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610520565b60408101516001600160a01b0316336001600160a01b0316146127245760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610520565b6127318160a001516136cf565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561277557612775614036565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6128418461283b8161161f565b5f6117ba565b5f858152600685016020526040902090915061285d828261410f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061288a9085906004016141f0565b6020604051808303815f875af11580156128a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128ca9190614222565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146129425760405162461bcd60e51b815260040161052090614591565b5f805b60028110156129915761295981600161456a565b612964906008614375565b61ffff1685828151811061297a5761297a61457d565b016020015160f81c901b9190911790600101612945565b5061ffff8116156129b45760405162461bcd60e51b8152600401610520906145da565b5f805b6004811015612a0f576129cb81600361456a565b6129d6906008614375565b63ffffffff16866129e883600261438c565b815181106129f8576129f861457d565b016020015160f81c901b91909117906001016129b7565b5063ffffffff8116600214612a365760405162461bcd60e51b81526004016105209061461d565b5f805b6020811015612a8b57612a4d81601f61456a565b612a58906008614375565b87612a6483600661438c565b81518110612a7457612a7461457d565b016020015160f81c901b9190911790600101612a39565b505f86602681518110612aa057612aa061457d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612ac96119d9565b5f805160206147bc8339815191525f612ae184610a41565b90505f612aed87611693565b9050600281516005811115612b0457612b04614036565b14612b635760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610520565b5f828260a00151612b749190614664565b60048501546001860154919250612b96916001600160401b0390911690614375565b612b9f82610d4f565b1115612c0b5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610520565b612c158882611772565b5f612c1f8961161f565b90505f8982604051602001612c4b92919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612c6c856136cf565b5f612c788b84866117ba565b5f8381526007890160205260409020909150612c94828261410f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612cc19085906004016141f0565b6020604051808303815f875af1158015612cdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d019190614222565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612db057612db0614036565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509096505050505050506119d260015f8051602061481c83398151915255565b5f808251602e14612f145760405162461bcd60e51b815260040161052090614591565b5f805b6002811015612f6357612f2b81600161456a565b612f36906008614375565b61ffff16858281518110612f4c57612f4c61457d565b016020015160f81c901b9190911790600101612f17565b5061ffff811615612f865760405162461bcd60e51b8152600401610520906145da565b5f805b6004811015612fe157612f9d81600361456a565b612fa8906008614375565b63ffffffff1686612fba83600261438c565b81518110612fca57612fca61457d565b016020015160f81c901b9190911790600101612f89565b5063ffffffff81166004146130085760405162461bcd60e51b81526004016105209061461d565b5f805b602081101561305d5761301f81601f61456a565b61302a906008614375565b8761303683600661438c565b815181106130465761304661457d565b016020015160f81c901b919091179060010161300b565b505f805b60088110156130bc5761307581600761456a565b613080906008614375565b6001600160401b03168861309583602661438c565b815181106130a5576130a561457d565b016020015160f81c901b9190911790600101613061565b5090969095509350505050565b5f5f805160206147fc833981519152426130e96040860160208701614010565b6001600160401b0316118015613122575061310a6040850160208601614010565b6001600160401b0316613120426202a30061438c565b115b6131845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610520565b83356131dc5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610520565b83355f9081526008820160205260409020541561324c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610520565b6132596040850185614684565b90506030146132c05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610520565b6132c9836136cf565b5f806133636040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061330e9190614010565b6001600160401b0316815260200161332960408a018a614684565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613870565b5f82815260058601602052604090209193509150613381828261410f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906133ae9085906004016141f0565b6020604051808303815f875af11580156133ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133ee9190614222565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561347057613470614036565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556135318361161f565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961356860408d0160208e01614010565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166135df57604051631afcd79f60e31b815260040160405180910390fd5b565b6135e9613596565b6135f281613c15565b611ccf6060820135608083013561360f60c0850160a08601614010565b60c0850135613625610100870160e088016146cd565b613637610120880161010089016146ed565b613c36565b8047101561365f5760405163cd78605960e01b8152306004820152602401610520565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146136a8576040519150601f19603f3d011682016040523d82523d5f602084013e6136ad565b606091505b505090508061099d57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206147fc8339815191529060ff165f0361370d575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613755908361456a565b10613771576001600160401b0384166040830152808252613790565b83826040018181516137839190614664565b6001600160401b03169052505b5f8260200151836040015160646137a79190614708565b6137b19190614733565b600285015490915060ff908116908216111561382c5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610520565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f60608260800151516030146138da5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610520565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156139515761391181600161456a565b61391c906008614375565b5081515f908390839081106139335761393361457d565b60200101906001600160f81b03191690815f1a9053506001016138fd565b505f5b60048110156139af5761396881600361456a565b613973906008614375565b505f8261398183600261438c565b815181106139915761399161457d565b60200101906001600160f81b03191690815f1a905350600101613954565b505f5b6020811015613a0c57845181602081106139ce576139ce61457d565b1a60f81b826139de83600661438c565b815181106139ee576139ee61457d565b60200101906001600160f81b03191690815f1a9053506001016139b2565b505f5b6020811015613a6c5784602001518160208110613a2e57613a2e61457d565b1a60f81b82613a3e83602661438c565b81518110613a4e57613a4e61457d565b60200101906001600160f81b03191690815f1a905350600101613a0f565b505f5b6008811015613ae057613a8381600761456a565b613a8e906008614375565b60ff1685604001516001600160401b0316901c60f81b82826046613ab2919061438c565b81518110613ac257613ac261457d565b60200101906001600160f81b03191690815f1a905350600101613a6f565b505f5b6030811015613b4b5784608001518181518110613b0257613b0261457d565b01602001516001600160f81b03191682613b1d83604e61438c565b81518110613b2d57613b2d61457d565b60200101906001600160f81b03191690815f1a905350600101613ae3565b505f5b6008811015613bbd57613b6281600761456a565b613b6d906008614375565b60608601516001600160401b0390811691161c60f81b82613b8f83607e61438c565b81518110613b9f57613b9f61457d565b60200101906001600160f81b03191690815f1a905350600101613b4e565b50600281604051613bce9190614758565b602060405180830381855afa158015613be9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c0c9190614222565b94909350915050565b613c1d613596565b613c25613dc9565b613c2d613dd9565b611ccf81613de1565b613c3e613596565b5f805160206147bc83398151915283613c695760405162461bcd60e51b815260040161052090614773565b85871115613cd15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610520565b600a60ff84161115613d435760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610520565b5f8411613d625760405162461bcd60e51b815260040161052090614773565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b613dd1613596565b6135df613e4d565b6135df613596565b613de9613596565b80355f805160206147fc83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e3360608301604084016146cd565b600291909101805460ff191660ff90921691909117905550565b611bdc613596565b508054613e6190614099565b5f825580601f10613e70575050565b601f0160209004905f5260205f2090810190611ccf9190613ed0565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613ee4575f8155600101613ed1565b5090565b8015158114611ccf575f80fd5b803563ffffffff81168114613f08575f80fd5b919050565b5f805f60608486031215613f1f575f80fd5b833592506020840135613f3181613ee8565b9150613f3f60408501613ef5565b90509250925092565b5f60208284031215613f58575f80fd5b5035919050565b5f808284036060811215613f71575f80fd5b83356001600160401b03811115613f86575f80fd5b840160608187031215613f97575f80fd5b92506040601f1982011215613faa575f80fd5b506020830190509250929050565b5f6101208284031215613fc9575f80fd5b50919050565b5f60208284031215613fdf575f80fd5b6119d282613ef5565b5f8060408385031215613ff9575f80fd5b61400283613ef5565b946020939093013593505050565b5f60208284031215614020575f80fd5b81356001600160401b03811681146119d2575f80fd5b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561407e5761407e61404a565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806140ad57607f821691505b602082108103613fc957634e487b7160e01b5f52602260045260245ffd5b601f82111561099d57805f5260205f20601f840160051c810160208510156140f05750805b601f840160051c820191505b81811015610eb4575f81556001016140fc565b81516001600160401b0381111561412857614128614085565b61413c816141368454614099565b846140cb565b602080601f83116001811461416f575f84156141585750858301515b5f19600386901b1c1916600185901b1785556141c6565b5f85815260208120601f198616915b8281101561419d5788860151825594840194600190910190840161417e565b50858210156141ba57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156141e85781810151838201526020016141d0565b50505f910152565b602081525f825180602084015261420e8160408501602087016141ce565b601f01601f19169190910160400192915050565b5f60208284031215614232575f80fd5b5051919050565b5f60208083525f845461424b81614099565b806020870152604060018084165f811461426c5760018114614288576142b5565b60ff19851660408a0152604084151560051b8a010195506142b5565b895f5260205f205f5b858110156142ac5781548b8201860152908301908801614291565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826142e5576142e56142c3565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109ce576109ce61404a565b808201808211156109ce576109ce61404a565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b038111828210171561440857614408614085565b60405290565b604051601f8201601f191681016001600160401b038111828210171561443657614436614085565b604052919050565b6001600160a01b0381168114611ccf575f80fd5b8051613f0881613ee8565b5f806040838503121561446e575f80fd5b82516001600160401b0380821115614484575f80fd5b9084019060608287031215614497575f80fd5b61449f6143e6565b825181526020808401516144b28161443e565b828201526040840151838111156144c7575f80fd5b80850194505087601f8501126144db575f80fd5b8351838111156144ed576144ed614085565b6144ff601f8201601f1916830161440e565b93508084528882828701011115614514575f80fd5b614523818386018488016141ce565b50826040830152819550614538818801614452565b9450505050509250929050565b5f6001600160401b038083168181036145605761456061404a565b6001019392505050565b818103818111156109ce576109ce61404a565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821601908082111561407e5761407e61404a565b5f808335601e19843603018112614699575f80fd5b8301803591506001600160401b038211156146b2575f80fd5b6020019150368190038213156146c6575f80fd5b9250929050565b5f602082840312156146dd575f80fd5b813560ff811681146119d2575f80fd5b5f602082840312156146fd575f80fd5b81356119d28161443e565b6001600160401b0381811683821602808216919082811461472b5761472b61404a565b505092915050565b5f6001600160401b038084168061474c5761474c6142c3565b92169190910492915050565b5f82516147698184602087016141ce565b9190910192915050565b60208082526028908201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160408201526774696f6e2066656560c01b60608201526080019056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"resendDelegatorRegistration\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"resendEndDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614abc380380614abc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61496f8061014d5f395ff3fe60806040526004361061011b575f3560e01c806366435abf1161009d578063a3a65e4811610062578063a3a65e481461034c578063b771b3bc1461036b578063bee0a03f1461039d578063c123c6db146103bc578063c599e24f146103db575f80fd5b806366435abf146102bd5780636d0e43fa146102dc57806376f78621146102fb57806380a8ad941461031a57806398f3e2b41461032d575f80fd5b80632e2194d8116100e35780632e2194d81461020157806335455ded14610238578063467ef06f146102605780635297fae61461027f578063620658561461029e575f80fd5b80630118acc41461011f5780630322ed98146101405780630cdd09851461015f578063151d30d1146101bc578063162f1f61146101e2575b5f80fd5b34801561012a575f80fd5b5061013e610139366004613fd3565b6103ee565b005b34801561014b575f80fd5b5061013e61015a36600461400e565b610879565b34801561016a575f80fd5b506101a961017936600461400e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b3480156101c7575f80fd5b506101d0600a81565b60405160ff90911681526020016101b3565b3480156101ed575f80fd5b5061013e6101fc36600461400e565b6109d5565b34801561020c575f80fd5b5061022061021b36600461400e565b610a42565b6040516001600160401b0390911681526020016101b3565b348015610243575f80fd5b5061024d61271081565b60405161ffff90911681526020016101b3565b34801561026b575f80fd5b5061013e61027a366004614025565b610a58565b34801561028a575f80fd5b5061013e61029936600461403e565b610a83565b3480156102a9575f80fd5b506101a96102b836600461407a565b610c74565b3480156102c8575f80fd5b506102206102d736600461400e565b610c8d565b3480156102e7575f80fd5b5061013e6102f636600461400e565b610ca1565b348015610306575f80fd5b5061013e610315366004613fd3565b610d0e565b6101a9610328366004614095565b610dee565b348015610338575f80fd5b5061013e61034736600461403e565b610e1a565b348015610357575f80fd5b5061013e610366366004614025565b61104a565b348015610376575f80fd5b506103856005600160991b0181565b6040516001600160a01b0390911681526020016101b3565b3480156103a8575f80fd5b5061013e6103b736600461400e565b611207565b3480156103c7575f80fd5b5061013e6103d63660046140ee565b6112d6565b6101a96103e936600461400e565b6113b8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206148c38339815191529184156104405761043d82856113c4565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561047257610472614105565b600481111561048357610483614105565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561050a5761050a614105565b1461055c5760405162461bcd60e51b815260206004820152602a60248201525f805160206148e38339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105c15760405162461bcd60e51b815260206004820152603360248201525f805160206148e38339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610553565b5f6105cb84611660565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561061857610618614105565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106ea856116d4565b905082606001516001600160401b03168160a001516001600160401b0316116107615760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610553565b5f83606001518260a00151610776919061412d565b905061078286826117b3565b5f61078e8785846117fb565b5f8c815260088a01602052604090209091506107aa82826141de565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906107d79085906004016142bf565b6020604051808303815f875af11580156107f3573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061081791906142f1565b604080516001600160401b03868116825242602083015291810183905291925086169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206149038339815191529291906108c190614168565b90501180156108f3575060035f83815260078301602052604090205460ff1660058111156108f1576108f1614105565b145b6109575760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610553565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109909190600401614308565b6020604051808303815f875af11580156109ac573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d091906142f1565b505050565b6109de81611a1a565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d08602052604090819020905163ee5b48eb60e01b81525f805160206148c3833981519152916005600160991b019163ee5b48eb9161099091600401614308565b5f610a5264e8d4a51000836143a6565b92915050565b5f610a6282611ae9565b9050610a7f81606001516001600160401b03168260400151611e76565b5050565b5f805160206148c38339815191525f610a9b84611e89565b90505f80610aac836040015161206a565b5091509150610aba856122a5565b5f8581526007850160205260408120610ad291613f1b565b5f610adc836116d4565b9050816001600160401b031681608001516001600160401b03161015610b145760405162461bcd60e51b8152600401610553906143b9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b595760405162461bcd60e51b8152600401610553906143fb565b60015f87815260068701602052604090205460ff166004811115610b7f57610b7f614105565b14610be85760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610553565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a526001600160401b03831664e8d4a51000614444565b5f610c97826116d4565b60a0015192915050565b610caa816122a5565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d07602052604090819020905163ee5b48eb60e01b81525f805160206148c3833981519152916005600160991b019163ee5b48eb9161099091600401614308565b5f805160206148c38339815191525f610d26856116d4565b5f86815260058401602052604090205460c0820151919250610d5891620100009091046001600160401b03169061445b565b6001600160401b0316421015610dcc5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610553565b8315610dde57610ddc85846113c4565b505b610de78561237e565b5050505050565b5f610df7612736565b610e0283833461276d565b9050610a5260015f8051602061492383398151915255565b5f805160206148c38339815191525f610e3284611e89565b90505f80610e43836040015161206a565b5091509150610e5185611a1a565b5f8581526008850160205260408120610e6991613f1b565b5f610e73836116d4565b9050816001600160401b031681608001516001600160401b03161015610eab5760405162461bcd60e51b8152600401610553906143b9565b5f8681526006860160205260409020600301546001600160401b0380841691161115610ee95760405162461bcd60e51b8152600401610553906143fb565b60035f87815260068701602052604090205460ff166004811115610f0f57610f0f614105565b14610f635760405162461bcd60e51b815260206004820152603160248201525f805160206148e38339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610553565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261100891611e76565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206149038339815191525f61106283611e89565b90505f806110738360400151612988565b91509150806110d55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610553565b5f828152600585016020526040812080546110ef90614168565b9050118015611121575060015f83815260078601602052604090205460ff16600581111561111f5761111f614105565b145b61113d5760405162461bcd60e51b81526004016105539061447b565b5f828152600585016020526040812061115591613f1b565b5f8281526007850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061490383398151915292919061124f90614168565b9050118015611281575060015f83815260078301602052604090205460ff16600581111561127f5761127f614105565b145b61129d5760405162461bcd60e51b81526004016105539061447b565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916109909190600401614308565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061131f575080546001600160401b03808416911610155b1561133d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561136783612b29565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a52823334612b3d565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561140f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114369190810190614539565b91509150806114995760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610553565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061150091906142f1565b8251146115645760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610553565b60208201516001600160a01b0316156115da5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610553565b5f806115e98460400151612f78565b915091508187146116565760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610553565b9695505050505050565b5f8181525f805160206149438339815191526020526040812060030180545f80516020614903833981519152916001600160401b03909116908190846116a583614621565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550508092505050919050565b6116dc613f52565b5f8281525f805160206149438339815191526020526040908190208151610100810190925280545f80516020614903833981519152929190829060ff16600581111561172a5761172a614105565b600581111561173b5761173b614105565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614943833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561187457611834816001614646565b61183f906008614444565b5081515f9083908390811061185657611856614659565b60200101906001600160f81b03191690815f1a905350600101611820565b505f5b60048110156118d75761188b816003614646565b611896906008614444565b6001901c60f81b826118a983600261466d565b815181106118b9576118b9614659565b60200101906001600160f81b03191690815f1a905350600101611877565b505f5b6020811015611939576118ee81601f614646565b6118f9906008614444565b86901c60f81b8261190b83600661466d565b8151811061191b5761191b614659565b60200101906001600160f81b03191690815f1a9053506001016118da565b505f5b60088110156119a457611950816007614646565b61195b906008614444565b6001600160401b038616901c60f81b8261197683602661466d565b8151811061198657611986614659565b60200101906001600160f81b03191690815f1a90535060010161193c565b505f5b6008811015611a0f576119bb816007614646565b6119c6906008614444565b6001600160401b038516901c60f81b826119e183602e61466d565b815181106119f1576119f1614659565b60200101906001600160f81b03191690815f1a9053506001016119a7565b5090505b9392505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d086020526040812080545f805160206148c3833981519152929190611a6290614168565b9050118015611a94575060035f83815260068301602052604090205460ff166004811115611a9257611a92614105565b145b610a7f5760405162461bcd60e51b815260206004820152603360248201525f805160206148e383398151915260448201527272656d6f76616c206e6f742070656e64696e6760681b6064820152608401610553565b611af1613f52565b5f805160206149038339815191525f611b0984611e89565b90505f80611b1a8360400151612988565b915091508015611b7f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610553565b5f828152600785016020526040808220815161010081019092528054829060ff166005811115611bb157611bb1614105565b6005811115611bc257611bc2614105565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c4957611c49614105565b1480611c675750600182516005811115611c6557611c65614105565b145b611cc65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610553565b600382516005811115611cdb57611cdb614105565b03611d0257505f8381526006860160205260408120600491611cfd9190613f1b565b611d06565b5060055b6020808301515f90815260088801909152604081205581816005811115611d2f57611d2f614105565b90816005811115611d4257611d42614105565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611d7657611d76614105565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e4157611e41614105565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a7f6001600160a01b03821683613150565b60408051606080820183525f8083526020830181905292820152905f805160206149038339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611efe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f259190810190614539565b9150915080611f8c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610553565b8254825114611fef5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610553565b60208201516001600160a01b0316156120625760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610553565b509392505050565b5f805f835160361461208e5760405162461bcd60e51b815260040161055390614680565b5f805b60028110156120dd576120a5816001614646565b6120b0906008614444565b61ffff168682815181106120c6576120c6614659565b016020015160f81c901b9190911790600101612091565b5061ffff8116156121005760405162461bcd60e51b8152600401610553906146c9565b5f805b600481101561215b57612117816003614646565b612122906008614444565b63ffffffff168761213483600261466d565b8151811061214457612144614659565b016020015160f81c901b9190911790600101612103565b5063ffffffff81166003146121825760405162461bcd60e51b81526004016105539061470c565b5f805b60208110156121d75761219981601f614646565b6121a4906008614444565b886121b083600661466d565b815181106121c0576121c0614659565b016020015160f81c901b9190911790600101612185565b505f805b6008811015612236576121ef816007614646565b6121fa906008614444565b6001600160401b03168961220f83602661466d565b8151811061221f5761221f614659565b016020015160f81c901b91909117906001016121db565b505f805b60088110156122955761224e816007614646565b612259906008614444565b6001600160401b03168a61226e83602e61466d565b8151811061227e5761227e614659565b016020015160f81c901b919091179060010161223a565b5091989097509095509350505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d076020526040812080545f805160206148c38339815191529291906122ed90614168565b905011801561231f575060015f83815260068301602052604090205460ff16600481111561231d5761231d614105565b145b610a7f5760405162461bcd60e51b815260206004820152603860248201525f805160206148e383398151915260448201527f726567697374726174696f6e206e6f742070656e64696e6700000000000000006064820152608401610553565b5f8181525f8051602061494383398151915260205260408082208151610100810190925280545f8051602061490383398151915293929190829060ff1660058111156123cc576123cc614105565b60058111156123dd576123dd614105565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561246557612465614105565b146124c15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610553565b60408101516001600160a01b0316336001600160a01b03161461253b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610553565b6125488160a001516131e3565b60038152426001600160401b031660e08201525f83815260078301602052604090208151815483929190829060ff1916600183600581111561258c5761258c614105565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126588461265281611660565b5f6117fb565b5f858152600685016020526040902090915061267482826141de565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906126a19085906004016142bf565b6020604051808303815f875af11580156126bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126e191906142f1565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8051602061492383398151915280546001190161276757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206148c3833981519152906001600160401b03166127b9604086016020870161407a565b6001600160401b031610156128285760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610553565b600381015461283a6020860186614762565b61ffff161015801561285e57506127106128576020860186614762565b61ffff1611155b6128be5760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610553565b805483108015906128d3575080600101548311155b6129315760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610553565b825f61293c82610a42565b90505f6129498883613384565b5f81815260058601602052604090209091508790612967828261477d565b509098975050505050505050565b60015f8051602061492383398151915255565b5f8082516027146129ab5760405162461bcd60e51b815260040161055390614680565b5f805b60028110156129fa576129c2816001614646565b6129cd906008614444565b61ffff168582815181106129e3576129e3614659565b016020015160f81c901b91909117906001016129ae565b5061ffff811615612a1d5760405162461bcd60e51b8152600401610553906146c9565b5f805b6004811015612a7857612a34816003614646565b612a3f906008614444565b63ffffffff1686612a5183600261466d565b81518110612a6157612a61614659565b016020015160f81c901b9190911790600101612a20565b5063ffffffff8116600214612a9f5760405162461bcd60e51b81526004016105539061470c565b5f805b6020811015612af457612ab681601f614646565b612ac1906008614444565b87612acd83600661466d565b81518110612add57612add614659565b016020015160f81c901b9190911790600101612aa2565b505f86602681518110612b0957612b09614659565b016020015191976001600160f81b03199092161515965090945050505050565b612b31613851565b612b3a8161389c565b50565b5f612b46612736565b5f805160206148c38339815191525f612b5e84610a42565b90505f612b6a876116d4565b9050600281516005811115612b8157612b81614105565b14612be05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610553565b5f828260a00151612bf1919061445b565b60048501546060840151919250612c13916001600160401b03909116906147d3565b6001600160401b0316816001600160401b03161115612c925760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610553565b612c9c88826117b3565b5f612ca689611660565b90505f8982604051602001612cd292919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612cf3856131e3565b5f612cff8b84866117fb565b5f8381526007890160205260409020909150612d1b82826141de565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612d489085906004016142bf565b6020604051808303815f875af1158015612d64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d8891906142f1565b60408051610100810190915290915080600181526020018c6001600160a01b031681526020018d8152602001886001600160401b031681526020015f6001600160401b031681526020015f6001600160401b03168152602001856001600160401b031681526020015f6001600160401b0316815250886006015f8581526020019081526020015f205f820151815f015f6101000a81548160ff02191690836004811115612e3757612e37614105565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff19169682169690961790955581518a861681528b861694810194909452938c1690830152918101849052908d16918e9186917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450909650505050505050611a1360015f8051602061492383398151915255565b5f808251602e14612f9b5760405162461bcd60e51b815260040161055390614680565b5f805b6002811015612fea57612fb2816001614646565b612fbd906008614444565b61ffff16858281518110612fd357612fd3614659565b016020015160f81c901b9190911790600101612f9e565b5061ffff81161561300d5760405162461bcd60e51b8152600401610553906146c9565b5f805b600481101561306857613024816003614646565b61302f906008614444565b63ffffffff168661304183600261466d565b8151811061305157613051614659565b016020015160f81c901b9190911790600101613010565b5063ffffffff811660041461308f5760405162461bcd60e51b81526004016105539061470c565b5f805b60208110156130e4576130a681601f614646565b6130b1906008614444565b876130bd83600661466d565b815181106130cd576130cd614659565b016020015160f81c901b9190911790600101613092565b505f805b6008811015613143576130fc816007614646565b613107906008614444565b6001600160401b03168861311c83602661466d565b8151811061312c5761312c614659565b016020015160f81c901b91909117906001016130e8565b5090969095509350505050565b804710156131735760405163cd78605960e01b8152306004820152602401610553565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146131bc576040519150601f19603f3d011682016040523d82523d5f602084013e6131c1565b606091505b50509050806109d057604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149038339815191529060ff165f03613221575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132699083614646565b10613285576001600160401b03841660408301528082526132a4565b8382604001818151613297919061445b565b6001600160401b03169052505b5f8260200151836040015160646132bb91906147d3565b6132c591906147fe565b600285015490915060ff90811690821611156133405760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610553565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f5f80516020614903833981519152426133a4604086016020870161407a565b6001600160401b03161180156133dd57506133c5604085016020860161407a565b6001600160401b03166133db426202a30061466d565b115b61343f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610553565b83356134975760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610553565b83355f908152600882016020526040902054156135075760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610553565b6135146040850185614823565b905060301461357b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610553565b613584836131e3565b5f8061361e6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906135c9919061407a565b6001600160401b031681526020016135e460408a018a614823565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613906565b5f8281526005860160205260409020919350915061363c82826141de565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906136699085906004016142bf565b6020604051808303815f875af1158015613685573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136a991906142f1565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600788019052902081518154829060ff1916600183600581111561372b5761372b614105565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790556137ec83611660565b50808735847f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e8961382360408d0160208e0161407a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661389a57604051631afcd79f60e31b815260040160405180910390fd5b565b6138a4613851565b6138ad81613cab565b612b3a606082013560808301356138ca60c0850160a0860161407a565b6138da60e0860160c08701614762565b61ffff166138ef610100870160e0880161486c565b6139016101208801610100890161488c565b613ccc565b5f60608260800151516030146139705760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610553565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156139e7576139a7816001614646565b6139b2906008614444565b5081515f908390839081106139c9576139c9614659565b60200101906001600160f81b03191690815f1a905350600101613993565b505f5b6004811015613a45576139fe816003614646565b613a09906008614444565b505f82613a1783600261466d565b81518110613a2757613a27614659565b60200101906001600160f81b03191690815f1a9053506001016139ea565b505f5b6020811015613aa25784518160208110613a6457613a64614659565b1a60f81b82613a7483600661466d565b81518110613a8457613a84614659565b60200101906001600160f81b03191690815f1a905350600101613a48565b505f5b6020811015613b025784602001518160208110613ac457613ac4614659565b1a60f81b82613ad483602661466d565b81518110613ae457613ae4614659565b60200101906001600160f81b03191690815f1a905350600101613aa5565b505f5b6008811015613b7657613b19816007614646565b613b24906008614444565b60ff1685604001516001600160401b0316901c60f81b82826046613b48919061466d565b81518110613b5857613b58614659565b60200101906001600160f81b03191690815f1a905350600101613b05565b505f5b6030811015613be15784608001518181518110613b9857613b98614659565b01602001516001600160f81b03191682613bb383604e61466d565b81518110613bc357613bc3614659565b60200101906001600160f81b03191690815f1a905350600101613b79565b505f5b6008811015613c5357613bf8816007614646565b613c03906008614444565b60608601516001600160401b0390811691161c60f81b82613c2583607e61466d565b81518110613c3557613c35614659565b60200101906001600160f81b03191690815f1a905350600101613be4565b50600281604051613c6491906148a7565b602060405180830381855afa158015613c7f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613ca291906142f1565b94909350915050565b613cb3613851565b613cbb613e8f565b613cc3613e9f565b612b3a81613ea7565b613cd4613851565b5f805160206148c383398151915283613d405760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610553565b85871115613da85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610553565b600a60ff841611801590613dbe57505f8360ff16115b613e285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610553565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b613e97613851565b61389a613f13565b61389a613851565b613eaf613851565b80355f8051602061490383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613ef9606083016040840161486c565b600291909101805460ff191660ff90921691909117905550565b612975613851565b508054613f2790614168565b5f825580601f10613f36575050565b601f0160209004905f5260205f2090810190612b3a9190613f96565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613faa575f8155600101613f97565b5090565b8015158114612b3a575f80fd5b803563ffffffff81168114613fce575f80fd5b919050565b5f805f60608486031215613fe5575f80fd5b833592506020840135613ff781613fae565b915061400560408501613fbb565b90509250925092565b5f6020828403121561401e575f80fd5b5035919050565b5f60208284031215614035575f80fd5b611a1382613fbb565b5f806040838503121561404f575f80fd5b61405883613fbb565b946020939093013593505050565b6001600160401b0381168114612b3a575f80fd5b5f6020828403121561408a575f80fd5b8135611a1381614066565b5f8082840360608112156140a7575f80fd5b83356001600160401b038111156140bc575f80fd5b8401606081870312156140cd575f80fd5b92506040601f19820112156140e0575f80fd5b506020830190509250929050565b5f61012082840312156140ff575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561414d5761414d614119565b5092915050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061417c57607f821691505b6020821081036140ff57634e487b7160e01b5f52602260045260245ffd5b601f8211156109d057805f5260205f20601f840160051c810160208510156141bf5750805b601f840160051c820191505b81811015610de7575f81556001016141cb565b81516001600160401b038111156141f7576141f7614154565b61420b816142058454614168565b8461419a565b602080601f83116001811461423e575f84156142275750858301515b5f19600386901b1c1916600185901b178555614295565b5f85815260208120601f198616915b8281101561426c5788860151825594840194600190910190840161424d565b508582101561428957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f5b838110156142b757818101518382015260200161429f565b50505f910152565b602081525f82518060208401526142dd81604085016020870161429d565b601f01601f19169190910160400192915050565b5f60208284031215614301575f80fd5b5051919050565b5f60208083525f845461431a81614168565b806020870152604060018084165f811461433b576001811461435757614384565b60ff19851660408a0152604084151560051b8a01019550614384565b895f5260205f205f5b8581101561437b5781548b8201860152908301908801614360565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601260045260245ffd5b5f826143b4576143b4614392565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a5257610a52614119565b6001600160401b0381811683821601908082111561414d5761414d614119565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b604051606081016001600160401b03811182821017156144e4576144e4614154565b60405290565b604051601f8201601f191681016001600160401b038111828210171561451257614512614154565b604052919050565b6001600160a01b0381168114612b3a575f80fd5b8051613fce81613fae565b5f806040838503121561454a575f80fd5b82516001600160401b0380821115614560575f80fd5b9084019060608287031215614573575f80fd5b61457b6144c2565b8251815260208084015161458e8161451a565b828201526040840151838111156145a3575f80fd5b80850194505087601f8501126145b7575f80fd5b8351838111156145c9576145c9614154565b6145db601f8201601f191683016144ea565b935080845288828287010111156145f0575f80fd5b6145ff8183860184880161429d565b5082604083015281955061461481880161452e565b9450505050509250929050565b5f6001600160401b0380831681810361463c5761463c614119565b6001019392505050565b81810381811115610a5257610a52614119565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a5257610a52614119565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114612b3a575f80fd5b5f60208284031215614772575f80fd5b8135611a1381614753565b813561478881614753565b61ffff8116905081548161ffff19821617835560208401356147a981614066565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b038181168382160280821691908281146147f6576147f6614119565b505092915050565b5f6001600160401b038084168061481757614817614392565b92169190910492915050565b5f808335601e19843603018112614838575f80fd5b8301803591506001600160401b03821115614851575f80fd5b602001915036819003821315614865575f80fd5b9250929050565b5f6020828403121561487c575f80fd5b813560ff81168114611a13575f80fd5b5f6020828403121561489c575f80fd5b8135611a138161451a565b5f82516148b881846020870161429d565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -233,6 +233,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorRaw) Transa return _NativeTokenStakingManager.Contract.contract.Transact(opts, method, params...) } +// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMDELEGATIONFEEBIPS(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_DELEGATION_FEE_BIPS") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMDELEGATIONFEEBIPS() (uint16, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMDELEGATIONFEEBIPS() (uint16, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_NativeTokenStakingManager.CallOpts) +} + // MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. // // Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) @@ -503,23 +534,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x45657017. +// Initialize is a paid mutator transaction binding the contract method 0xc123c6db. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint16,uint8,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 0x45657017. +// Initialize is a paid mutator transaction binding the contract method 0xc123c6db. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint16,uint8,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 0x45657017. +// Initialize is a paid mutator transaction binding the contract method 0xc123c6db. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint256,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } @@ -587,23 +618,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In return _NativeTokenStakingManager.Contract.InitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x104595c4. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x80a8ad94. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint256,uint256) requirements) payable returns(bytes32) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements) payable returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements) (*types.Transaction, error) { return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, requirements) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x104595c4. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x80a8ad94. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint256,uint256) requirements) payable returns(bytes32) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements) payable returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, requirements) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x104595c4. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x80a8ad94. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint256,uint256) requirements) payable returns(bytes32) +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements) payable returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, requirements) } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 1508bb3a0..40db7c279 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -16,12 +16,13 @@ enum DelegatorStatus { Completed } +// TODO: visit types of these fields, for example uint64 might be too big for stake duration seconds. struct PoSValidatorManagerSettings { ValidatorManagerSettings baseSettings; uint256 minimumStakeAmount; uint256 maximumStakeAmount; uint64 minimumStakeDuration; - uint256 minimumDelegationFeeBips; + uint16 minimumDelegationFeeBips; uint8 maximumStakeMultiplier; IRewardCalculator rewardCalculator; } @@ -38,8 +39,8 @@ struct Delegator { } struct PoSValidatorRequirements { - uint256 delegationFeeBips; - uint256 minStakeDuration; + uint16 delegationFeeBips; + uint64 minStakeDuration; } interface IPoSValidatorManager is IValidatorManager { diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 219a2502c..41634e5b1 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -29,7 +29,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 public constant DEFAULT_MINIMUM_STAKE = 1e6; uint256 public constant DEFAULT_MAXIMUM_STAKE = 1e20; uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; - uint256 public constant DEFAULT_MINIMUM_DELEGATION_FEE_BIPS = 100; + uint16 public constant DEFAULT_MINIMUM_DELEGATION_FEE_BIPS = 100; uint8 public constant DEFAULT_MAXIMUM_STAKE_MULTIPLIER = 4; PoSValidatorManager public posValidatorManager; @@ -95,7 +95,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testInvalidMinStakeDuration() public { PoSValidatorRequirements memory requirements = PoSValidatorRequirements({ minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION - 1, - delegationFeeBips: DEFAULT_MINIMUM_STAKE_DURATION + delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS }); ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 63890e988..eb2687745 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -26,6 +26,11 @@ import ( . "github.com/onsi/gomega" ) +const ( + defaultMinDelegateFeeBips = 1 + defaultMinStakeDurationSeconds = 1 +) + // // Deployment utils // @@ -71,12 +76,12 @@ func DeployAndInitializeNativeTokenStakingManager( SubnetID: subnet.SubnetID, MaximumHourlyChurn: 0, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - MinimumDelegationFee: big.NewInt(1), - MaximumStakeMultiplier: uint8(1), - RewardCalculator: common.Address{}, + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: defaultMinStakeDurationSeconds, + MinimumDelegationFeeBips: defaultMinDelegateFeeBips, + MaximumStakeMultiplier: uint8(1), + RewardCalculator: common.Address{}, }, ) Expect(err).Should(BeNil()) @@ -133,12 +138,12 @@ func DeployAndInitializeERC20TokenStakingManager( SubnetID: subnet.SubnetID, MaximumHourlyChurn: 0, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: 0, - MinimumDelegationFee: big.NewInt(1), - MaximumStakeMultiplier: uint8(1), - RewardCalculator: common.Address{}, + MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), + MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), + MinimumStakeDuration: defaultMinStakeDurationSeconds, + MinimumDelegationFeeBips: defaultMinDelegateFeeBips, + MaximumStakeMultiplier: uint8(1), + RewardCalculator: common.Address{}, }, erc20Address, ) @@ -221,8 +226,8 @@ func InitializeNativeValidatorRegistration( BlsPublicKey: blsPublicKey[:], }, nativetokenstakingmanager.PoSValidatorRequirements{ - DelegationFee: big.NewInt(1), - MinStakeDuration: big.NewInt(0), + DelegationFeeBips: defaultMinDelegateFeeBips, + MinStakeDuration: defaultMinStakeDurationSeconds, }, ) Expect(err).Should(BeNil()) @@ -265,8 +270,8 @@ func InitializeERC20ValidatorRegistration( BlsPublicKey: blsPublicKey[:], }, erc20tokenstakingmanager.PoSValidatorRequirements{ - DelegationFee: big.NewInt(1), - MinStakeDuration: big.NewInt(0), + DelegationFeeBips: defaultMinDelegateFeeBips, + MinStakeDuration: defaultMinStakeDurationSeconds, }, stakeAmount, ) From d704a4025b679919ca28a82d5012480bad71965e Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 12 Sep 2024 15:54:02 -0400 Subject: [PATCH 260/545] add max for minimum delegation fee --- contracts/staking/PoSValidatorManager.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 39e504b7a..30b199b39 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -102,6 +102,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ) internal onlyInitializing { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); require(minimumDelegationFeeBips > 0, "PoSValidatorManager: zero delegation fee"); + require( + minimumDelegationFeeBips <= MAXIMUM_DELEGATION_FEE_BIPS, + "PoSValidatorManager: invalid delegation fee" + ); require( minimumStakeAmount <= maximumStakeAmount, "PoSValidatorManager: invalid stake amount range" From eb844c58b8354a3632b8de0e5b01a7edbdd07c8e Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 12 Sep 2024 16:04:52 -0400 Subject: [PATCH 261/545] add max check for min delegation fee --- contracts/staking/ValidatorManager.sol | 2 +- .../tests/ERC20TokenStakingManagerTests.t.sol | 22 +++++++++++++++++++ .../NativeTokenStakingManagerTests.t.sol | 21 ++++++++++++++++++ 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 647b13384..2f7cabb64 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -142,7 +142,7 @@ abstract contract ValidatorManager is nodeID: input.nodeID, owner: _msgSender(), startingWeight: weight, - messageNonce: _incrementAndGetNonce(validationID), + messageNonce: 0, weight: weight, startedAt: 0, // The validation period only starts once the registration is acknowledged. endedAt: 0 diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 1652c1fa8..d1404df9f 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -74,6 +74,28 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ); } + function testMaxMinimumDelegationFee() public { + app = new ERC20TokenStakingManager(ICMInitializable.Allowed); + uint16 minimumDelegationFeeBips = app.MAXIMUM_DELEGATION_FEE_BIPS() + 1; + vm.expectRevert(_formatErrorMessage("invalid delegation fee")); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeBips: minimumDelegationFeeBips, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + rewardCalculator: IRewardCalculator(address(0)) + }), + token + ); + } + function testInvalidStakeAmountRange() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); vm.expectRevert(_formatErrorMessage("invalid stake amount range")); diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index b5d1987e4..4fb4a0294 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -65,6 +65,27 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ); } + function testMaxMinimumDelegationFee() public { + app = new NativeTokenStakingManager(ICMInitializable.Allowed); + uint16 minimumDelegationFeeBips = app.MAXIMUM_DELEGATION_FEE_BIPS() + 1; + vm.expectRevert(_formatErrorMessage("invalid delegation fee")); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeBips: minimumDelegationFeeBips, + maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, + rewardCalculator: IRewardCalculator(address(0)) + }) + ); + } + function testInvalidStakeAmountRange() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); vm.expectRevert(_formatErrorMessage("invalid stake amount range")); From 6c697c3c6c6315074c8106a989a6f579843a9033 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 12 Sep 2024 16:05:33 -0400 Subject: [PATCH 262/545] bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- .../go/staking/PoAValidatorManager/PoAValidatorManager.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index a6913e526..b239e92d6 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -63,7 +63,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614e50380380614e5083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d038061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c806366435abf116100a9578063a13fd29d1161006e578063a13fd29d14610292578063a3a65e48146102a5578063b771b3bc146102b8578063ba3a4b97146102de578063bee0a03f146102f1575f80fd5b806366435abf146102335780636f5f1c941461024657806376f786211461025957806398f3e2b41461026c5780639e1bc4ef1461027f575f80fd5b80632e2194d8116100ef5780632e2194d8146101b357806335455ded146101de578063467ef06f146101fa5780635297fae61461020d5780636206585614610220575f80fd5b80630118acc4146101205780630322ed98146101355780630cdd098514610148578063151d30d114610199575b5f80fd5b61013361012e3660046142f7565b610304565b005b610133610143366004614332565b61076e565b610186610156366004614332565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101a1600a81565b60405160ff9091168152602001610190565b6101c66101c1366004614332565b61093e565b6040516001600160401b039091168152602001610190565b6101e761271081565b60405161ffff9091168152602001610190565b610133610208366004614349565b610954565b61013361021b366004614362565b61097f565b61018661022e36600461439e565b610b4f565b6101c6610241366004614332565b610b68565b6101336102543660046143cd565b610b7c565b6101336102673660046142f7565b610c60565b61013361027a366004614362565b610d40565b61018661028d36600461440b565b610f4f565b6101866102a036600461442b565b610f62565b6101336102b3366004614349565b610f8e565b6102c66005600160991b0181565b6040516001600160a01b039091168152602001610190565b6101336102ec366004614332565b61114b565b6101336102ff366004614332565b6113d1565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614c578339815191529184156103565761035382856114e5565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103885761038861448c565b60048111156103995761039961448c565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104205761042061448c565b146104725760405162461bcd60e51b815260206004820152602a60248201525f80516020614c778339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104d75760405162461bcd60e51b815260206004820152603360248201525f80516020614c778339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610469565b5f6104e184611781565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561052e5761052e61448c565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61060085611803565b905082606001516001600160401b03168160a001516001600160401b0316116106775760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610469565b5f83606001518260a0015161068c91906144b4565b905061069886826118e2565b5f6005600160991b0163ee5b48eb6106b189878661192a565b6040518263ffffffff1660e01b81526004016106cd91906144fd565b6020604051808303815f875af11580156106e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070d919061452f565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614cd783398151915260205260408082208151610100810190925280545f80516020614c9783398151915293929190829060ff1660058111156107bc576107bc61448c565b60058111156107cd576107cd61448c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108525761085261448c565b146108b75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610469565b6005600160991b016001600160a01b031663ee5b48eb6108dc8584608001515f61192a565b6040518263ffffffff1660e01b81526004016108f891906144fd565b6020604051808303815f875af1158015610914573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610938919061452f565b50505050565b5f61094e64e8d4a510008361455a565b92915050565b5f61095e82611b47565b905061097b81606001516001600160401b03168260400151611eba565b5050565b5f80516020614c578339815191525f61099784611ef0565b90505f806109a883604001516120d1565b50915091505f6109b783611803565b9050816001600160401b031681608001516001600160401b031610156109ef5760405162461bcd60e51b81526004016104699061456d565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a345760405162461bcd60e51b8152600401610469906145af565b60015f87815260068701602052604090205460ff166004811115610a5a57610a5a61448c565b14610ac35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610469565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61094e6001600160401b03831664e8d4a510006145f8565b5f610b7282611803565b60a0015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bc5575080546001600160401b03808416911610155b15610be35760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c0e848461230c565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020614c578339815191525f610c7885611803565b5f86815260058401602052604090205460c0820151919250610caa91620100009091046001600160401b03169061460f565b6001600160401b0316421015610d1e5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610469565b8315610d3057610d2e85846114e5565b505b610d3985612326565b5050505050565b5f80516020614c578339815191525f610d5884611ef0565b90505f80610d6983604001516120d1565b50915091505f610d7883611803565b9050816001600160401b031681608001516001600160401b03161015610db05760405162461bcd60e51b81526004016104699061456d565b5f8681526006860160205260409020600301546001600160401b0380841691161115610dee5760405162461bcd60e51b8152600401610469906145af565b60035f87815260068701602052604090205460ff166004811115610e1457610e1461448c565b14610e685760405162461bcd60e51b815260206004820152603160248201525f80516020614c778339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610469565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f0d91611eba565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f5b8333846126c4565b9392505050565b5f610f6b612ab9565b610f76848484612af0565b9050610f5b60015f80516020614cb783398151915255565b5f80516020614c978339815191525f610fa683611ef0565b90505f80610fb78360400151612d16565b91509150806110195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610469565b5f828152600585016020526040812080546110339061462f565b9050118015611065575060015f83815260068601602052604090205460ff1660058111156110635761106361448c565b145b6110815760405162461bcd60e51b815260040161046990614667565b5f82815260058501602052604081206110999161423f565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614c5783398151915293929190829060ff1660048111156111ac576111ac61448c565b60048111156111bd576111bd61448c565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112445761124461448c565b148061126257506003815160048111156112605761126061448c565b145b6112b65760405162461bcd60e51b815260206004820152603260248201525f80516020614c77833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610469565b5f6112c48260400151611803565b905080608001516001600160401b03165f036113485760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610469565b6005600160991b016001600160a01b031663ee5b48eb611375846040015184608001518560a0015161192a565b6040518263ffffffff1660e01b815260040161139191906144fd565b6020604051808303815f875af11580156113ad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d39919061452f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614c978339815191529291906114199061462f565b905011801561144b575060015f83815260068301602052604090205460ff1660058111156114495761144961448c565b145b6114675760405162461bcd60e51b815260040161046990614667565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114a091906004016146ae565b6020604051808303815f875af11580156114bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e0919061452f565b505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611530573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261155791908101906147af565b91509150806115ba5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610469565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115fd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611621919061452f565b8251146116855760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610469565b60208201516001600160a01b0316156116fb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610469565b5f8061170a8460400151612eb7565b915091508187146117775760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610469565b9695505050505050565b5f8181525f80516020614cd78339815191526020526040812060030180545f80516020614c97833981519152916001600160401b0390911690836117c483614897565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b61180b614276565b5f8281525f80516020614cd78339815191526020526040908190208151610100810190925280545f80516020614c97833981519152929190829060ff1660058111156118595761185961448c565b600581111561186a5761186a61448c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614cd7833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119a3576119638160016148bc565b61196e9060086145f8565b5081515f90839083908110611985576119856148cf565b60200101906001600160f81b03191690815f1a90535060010161194f565b505f5b6004811015611a06576119ba8160036148bc565b6119c59060086145f8565b6001901c60f81b826119d88360026148e3565b815181106119e8576119e86148cf565b60200101906001600160f81b03191690815f1a9053506001016119a6565b505f5b6020811015611a6857611a1d81601f6148bc565b611a289060086145f8565b86901c60f81b82611a3a8360066148e3565b81518110611a4a57611a4a6148cf565b60200101906001600160f81b03191690815f1a905350600101611a09565b505f5b6008811015611ad357611a7f8160076148bc565b611a8a9060086145f8565b6001600160401b038616901c60f81b82611aa58360266148e3565b81518110611ab557611ab56148cf565b60200101906001600160f81b03191690815f1a905350600101611a6b565b505f5b6008811015611b3e57611aea8160076148bc565b611af59060086145f8565b6001600160401b038516901c60f81b82611b1083602e6148e3565b81518110611b2057611b206148cf565b60200101906001600160f81b03191690815f1a905350600101611ad6565b50949350505050565b611b4f614276565b5f80516020614c978339815191525f611b6784611ef0565b90505f80611b788360400151612d16565b915091508015611bdd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610469565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611c0f57611c0f61448c565b6005811115611c2057611c2061448c565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ca757611ca761448c565b1480611cc55750600182516005811115611cc357611cc361448c565b145b611d245760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610469565b600382516005811115611d3957611d3961448c565b03611d4657506004611d4a565b5060055b6020808301515f90815260078801909152604081205581816005811115611d7357611d7361448c565b90816005811115611d8657611d8661448c565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611dba57611dba61448c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e8557611e8561448c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461097b906001600160a01b0316828461308f565b60408051606080820183525f8083526020830181905292820152905f80516020614c978339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f8c91908101906147af565b9150915080611ff35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610469565b82548251146120565760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610469565b60208201516001600160a01b0316156120c95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610469565b509392505050565b5f805f83516036146120f55760405162461bcd60e51b8152600401610469906148f6565b5f805b60028110156121445761210c8160016148bc565b6121179060086145f8565b61ffff1686828151811061212d5761212d6148cf565b016020015160f81c901b91909117906001016120f8565b5061ffff8116156121675760405162461bcd60e51b81526004016104699061493f565b5f805b60048110156121c25761217e8160036148bc565b6121899060086145f8565b63ffffffff168761219b8360026148e3565b815181106121ab576121ab6148cf565b016020015160f81c901b919091179060010161216a565b5063ffffffff81166003146121e95760405162461bcd60e51b815260040161046990614982565b5f805b602081101561223e5761220081601f6148bc565b61220b9060086145f8565b886122178360066148e3565b81518110612227576122276148cf565b016020015160f81c901b91909117906001016121ec565b505f805b600881101561229d576122568160076148bc565b6122619060086145f8565b6001600160401b0316896122768360266148e3565b81518110612286576122866148cf565b016020015160f81c901b9190911790600101612242565b505f805b60088110156122fc576122b58160076148bc565b6122c09060086145f8565b6001600160401b03168a6122d583602e6148e3565b815181106122e5576122e56148cf565b016020015160f81c901b91909117906001016122a1565b5091989097509095509350505050565b6123146130ee565b61231d82613139565b61097b816131a6565b5f8181525f80516020614cd783398151915260205260408082208151610100810190925280545f80516020614c9783398151915293929190829060ff1660058111156123745761237461448c565b60058111156123855761238561448c565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561240d5761240d61448c565b146124695760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610469565b60408101516001600160a01b0316336001600160a01b0316146124e35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610469565b6124f08160a0015161325a565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156125345761253461448c565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612600846125fa81611781565b5f61192a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061262f9085906004016144fd565b6020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f919061452f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126cd612ab9565b5f80516020614c578339815191525f6126e86101c1856133fb565b90505f6126f487611803565b905060028151600581111561270b5761270b61448c565b1461276a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610469565b5f828260a0015161277b919061460f565b6004850154606084015191925061279d916001600160401b03909116906149c9565b6001600160401b0316816001600160401b0316111561281c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610469565b61282688826118e2565b5f61283089611781565b90505f898260405160200161285c92919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061287d8561325a565b5f6005600160991b0163ee5b48eb6128968d868861192a565b6040518263ffffffff1660e01b81526004016128b291906144fd565b6020604051808303815f875af11580156128ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128f2919061452f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561297a5761297a61448c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610f5b60015f80516020614cb783398151915255565b5f80516020614cb7833981519152805460011901612aea57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614c57833981519152906001600160401b0316612b3c604086016020870161439e565b6001600160401b03161015612bab5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610469565b6003810154612bbd6020860186614a03565b61ffff1610158015612be15750612710612bda6020860186614a03565b61ffff1611155b612c415760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610469565b80548310801590612c56575080600101548311155b612cb45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610469565b5f612cbe846133fb565b90505f612cca8261093e565b90505f612cd78883613431565b5f81815260058601602052604090209091508790612cf58282614a1e565b509098975050505050505050565b60015f80516020614cb783398151915255565b5f808251602714612d395760405162461bcd60e51b8152600401610469906148f6565b5f805b6002811015612d8857612d508160016148bc565b612d5b9060086145f8565b61ffff16858281518110612d7157612d716148cf565b016020015160f81c901b9190911790600101612d3c565b5061ffff811615612dab5760405162461bcd60e51b81526004016104699061493f565b5f805b6004811015612e0657612dc28160036148bc565b612dcd9060086145f8565b63ffffffff1686612ddf8360026148e3565b81518110612def57612def6148cf565b016020015160f81c901b9190911790600101612dae565b5063ffffffff8116600214612e2d5760405162461bcd60e51b815260040161046990614982565b5f805b6020811015612e8257612e4481601f6148bc565b612e4f9060086145f8565b87612e5b8360066148e3565b81518110612e6b57612e6b6148cf565b016020015160f81c901b9190911790600101612e30565b505f86602681518110612e9757612e976148cf565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612eda5760405162461bcd60e51b8152600401610469906148f6565b5f805b6002811015612f2957612ef18160016148bc565b612efc9060086145f8565b61ffff16858281518110612f1257612f126148cf565b016020015160f81c901b9190911790600101612edd565b5061ffff811615612f4c5760405162461bcd60e51b81526004016104699061493f565b5f805b6004811015612fa757612f638160036148bc565b612f6e9060086145f8565b63ffffffff1686612f808360026148e3565b81518110612f9057612f906148cf565b016020015160f81c901b9190911790600101612f4f565b5063ffffffff8116600414612fce5760405162461bcd60e51b815260040161046990614982565b5f805b602081101561302357612fe581601f6148bc565b612ff09060086145f8565b87612ffc8360066148e3565b8151811061300c5761300c6148cf565b016020015160f81c901b9190911790600101612fd1565b505f805b60088110156130825761303b8160076148bc565b6130469060086145f8565b6001600160401b03168861305b8360266148e3565b8151811061306b5761306b6148cf565b016020015160f81c901b9190911790600101613027565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526114e091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061390d565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661313757604051631afcd79f60e31b815260040160405180910390fd5b565b6131416130ee565b61314a8161396e565b6131a36060820135608083013561316760c0850160a0860161439e565b61317760e0860160c08701614a03565b61ffff1661318c610100870160e08801614a74565b61319e61012088016101008901614a94565b61398f565b50565b6131ae6130ee565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661323a5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610469565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614c978339815191529060ff165f03613298575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132e090836148bc565b106132fc576001600160401b038416604083015280825261331b565b838260400181815161330e919061460f565b6001600160401b03169052505b5f82602001518360400151606461333291906149c9565b61333c9190614aaf565b600285015490915060ff90811690821611156133b75760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610469565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f61094e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b52565b5f5f80516020614c9783398151915242613451604086016020870161439e565b6001600160401b031611801561348a5750613472604085016020860161439e565b6001600160401b0316613488426202a3006148e3565b115b6134ec5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610469565b83356135445760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610469565b83355f908152600782016020526040902054156135b45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610469565b6135c16040850185614ad4565b90506030146136285760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610469565b6136318361325a565b5f806136cb6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613676919061439e565b6001600160401b0316815260200161369160408a018a614ad4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613cb4565b5f828152600586016020526040902091935091506136e98282614b61565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906137169085906004016144fd565b6020604051808303815f875af1158015613732573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613756919061452f565b604080516101008101825260018152893560208201529192508101336001600160a01b03168152602001876001600160401b0316815260200161379885611781565b6001600160401b03908116825288166020808301919091525f60408084018290526060909301819052868152600688019091522081518154829060ff191660018360058111156137ea576137ea61448c565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916138df91908e01908e0161439e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6139216001600160a01b03841683614059565b905080515f141580156139455750808060200190518101906139439190614c20565b155b156114e057604051635274afe760e01b81526001600160a01b0384166004820152602401610469565b6139766130ee565b61397e614066565b613986614076565b6131a38161407e565b6139976130ee565b5f80516020614c5783398151915283613a035760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610469565b85871115613a6b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610469565b600a60ff841611801590613a8157505f8360ff16115b613aeb5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610469565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613b98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bbc919061452f565b9050613bd36001600160a01b0385163330866140ea565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c17573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c3b919061452f565b9050818111613ca15760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610469565b613cab82826148bc565b95945050505050565b5f6060826080015151603014613d1e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610469565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613d9557613d558160016148bc565b613d609060086145f8565b5081515f90839083908110613d7757613d776148cf565b60200101906001600160f81b03191690815f1a905350600101613d41565b505f5b6004811015613df357613dac8160036148bc565b613db79060086145f8565b505f82613dc58360026148e3565b81518110613dd557613dd56148cf565b60200101906001600160f81b03191690815f1a905350600101613d98565b505f5b6020811015613e505784518160208110613e1257613e126148cf565b1a60f81b82613e228360066148e3565b81518110613e3257613e326148cf565b60200101906001600160f81b03191690815f1a905350600101613df6565b505f5b6020811015613eb05784602001518160208110613e7257613e726148cf565b1a60f81b82613e828360266148e3565b81518110613e9257613e926148cf565b60200101906001600160f81b03191690815f1a905350600101613e53565b505f5b6008811015613f2457613ec78160076148bc565b613ed29060086145f8565b60ff1685604001516001600160401b0316901c60f81b82826046613ef691906148e3565b81518110613f0657613f066148cf565b60200101906001600160f81b03191690815f1a905350600101613eb3565b505f5b6030811015613f8f5784608001518181518110613f4657613f466148cf565b01602001516001600160f81b03191682613f6183604e6148e3565b81518110613f7157613f716148cf565b60200101906001600160f81b03191690815f1a905350600101613f27565b505f5b600881101561400157613fa68160076148bc565b613fb19060086145f8565b60608601516001600160401b0390811691161c60f81b82613fd383607e6148e3565b81518110613fe357613fe36148cf565b60200101906001600160f81b03191690815f1a905350600101613f92565b506002816040516140129190614c3b565b602060405180830381855afa15801561402d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614050919061452f565b94909350915050565b6060610f5b83835f614123565b61406e6130ee565b6131376141b2565b6131376130ee565b6140866130ee565b80355f80516020614c9783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556140d06060830160408401614a74565b600291909101805460ff191660ff90921691909117905550565b6040516001600160a01b0384811660248301528381166044830152606482018390526109389186918216906323b872dd906084016130bc565b6060814710156141485760405163cd78605960e01b8152306004820152602401610469565b5f80856001600160a01b031684866040516141639190614c3b565b5f6040518083038185875af1925050503d805f811461419d576040519150601f19603f3d011682016040523d82523d5f602084013e6141a2565b606091505b50915091506117778683836141ba565b612d036130ee565b6060826141cf576141ca82614216565b610f5b565b81511580156141e657506001600160a01b0384163b155b1561420f57604051639996b31560e01b81526001600160a01b0385166004820152602401610469565b5080610f5b565b8051156142265780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461424b9061462f565b5f825580601f1061425a575050565b601f0160209004905f5260205f20908101906131a391906142ba565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156142ce575f81556001016142bb565b5090565b80151581146131a3575f80fd5b803563ffffffff811681146142f2575f80fd5b919050565b5f805f60608486031215614309575f80fd5b83359250602084013561431b816142d2565b9150614329604085016142df565b90509250925092565b5f60208284031215614342575f80fd5b5035919050565b5f60208284031215614359575f80fd5b610f5b826142df565b5f8060408385031215614373575f80fd5b61437c836142df565b946020939093013593505050565b6001600160401b03811681146131a3575f80fd5b5f602082840312156143ae575f80fd5b8135610f5b8161438a565b6001600160a01b03811681146131a3575f80fd5b5f808284036101408112156143e0575f80fd5b610120808212156143ef575f80fd5b8493508301359050614400816143b9565b809150509250929050565b5f806040838503121561441c575f80fd5b50508035926020909101359150565b5f805f838503608081121561443e575f80fd5b84356001600160401b03811115614453575f80fd5b850160608188031215614464575f80fd5b93506040601f1982011215614477575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144d4576144d46144a0565b5092915050565b5f5b838110156144f55781810151838201526020016144dd565b50505f910152565b602081525f825180602084015261451b8160408501602087016144db565b601f01601f19169190910160400192915050565b5f6020828403121561453f575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261456857614568614546565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761094e5761094e6144a0565b6001600160401b038181168382160190808211156144d4576144d46144a0565b600181811c9082168061464357607f821691505b60208210810361466157634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546146c08161462f565b806020870152604060018084165f81146146e157600181146146fd5761472a565b60ff19851660408a0152604084151560051b8a0101955061472a565b895f5260205f205f5b858110156147215781548b8201860152908301908801614706565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561476e5761476e614738565b60405290565b604051601f8201601f191681016001600160401b038111828210171561479c5761479c614738565b604052919050565b80516142f2816142d2565b5f80604083850312156147c0575f80fd5b82516001600160401b03808211156147d6575f80fd5b90840190606082870312156147e9575f80fd5b6147f161474c565b82518152602080840151614804816143b9565b82820152604084015183811115614819575f80fd5b80850194505087601f85011261482d575f80fd5b83518381111561483f5761483f614738565b614851601f8201601f19168301614774565b93508084528882828701011115614866575f80fd5b614875818386018488016144db565b5082604083015281955061488a8188016147a4565b9450505050509250929050565b5f6001600160401b038083168181036148b2576148b26144a0565b6001019392505050565b8181038181111561094e5761094e6144a0565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561094e5761094e6144a0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146149ec576149ec6144a0565b505092915050565b61ffff811681146131a3575f80fd5b5f60208284031215614a13575f80fd5b8135610f5b816149f4565b8135614a29816149f4565b61ffff8116905081548161ffff1982161783556020840135614a4a8161438a565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614a84575f80fd5b813560ff81168114610f5b575f80fd5b5f60208284031215614aa4575f80fd5b8135610f5b816143b9565b5f6001600160401b0380841680614ac857614ac8614546565b92169190910492915050565b5f808335601e19843603018112614ae9575f80fd5b8301803591506001600160401b03821115614b02575f80fd5b602001915036819003821315614b16575f80fd5b9250929050565b601f8211156114e057805f5260205f20601f840160051c81016020851015614b425750805b601f840160051c820191505b81811015610d39575f8155600101614b4e565b81516001600160401b03811115614b7a57614b7a614738565b614b8e81614b88845461462f565b84614b1d565b602080601f831160018114614bc1575f8415614baa5750858301515b5f19600386901b1c1916600185901b178555614c18565b5f85815260208120601f198616915b82811015614bef57888601518255948401946001909101908401614bd0565b5085821015614c0c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614c30575f80fd5b8151610f5b816142d2565b5f8251614c4c8184602087016144db565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614e67380380614e6783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d1a8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c806366435abf116100a9578063a13fd29d1161006e578063a13fd29d14610292578063a3a65e48146102a5578063b771b3bc146102b8578063ba3a4b97146102de578063bee0a03f146102f1575f80fd5b806366435abf146102335780636f5f1c941461024657806376f786211461025957806398f3e2b41461026c5780639e1bc4ef1461027f575f80fd5b80632e2194d8116100ef5780632e2194d8146101b357806335455ded146101de578063467ef06f146101fa5780635297fae61461020d5780636206585614610220575f80fd5b80630118acc4146101205780630322ed98146101355780630cdd098514610148578063151d30d114610199575b5f80fd5b61013361012e3660046142c3565b610304565b005b6101336101433660046142fe565b61076e565b6101866101563660046142fe565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101a1600a81565b60405160ff9091168152602001610190565b6101c66101c13660046142fe565b61093e565b6040516001600160401b039091168152602001610190565b6101e761271081565b60405161ffff9091168152602001610190565b610133610208366004614315565b610954565b61013361021b36600461432e565b61097f565b61018661022e36600461436a565b610b4f565b6101c66102413660046142fe565b610b68565b610133610254366004614399565b610b7c565b6101336102673660046142c3565b610c60565b61013361027a36600461432e565b610d40565b61018661028d3660046143d7565b610f4f565b6101866102a03660046143f7565b610f62565b6101336102b3366004614315565b610f8e565b6102c66005600160991b0181565b6040516001600160a01b039091168152602001610190565b6101336102ec3660046142fe565b61114b565b6101336102ff3660046142fe565b6113d1565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614c6e8339815191529184156103565761035382856114e5565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561038857610388614458565b600481111561039957610399614458565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561042057610420614458565b146104725760405162461bcd60e51b815260206004820152602a60248201525f80516020614c8e8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104d75760405162461bcd60e51b815260206004820152603360248201525f80516020614c8e8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610469565b5f6104e184611781565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561052e5761052e614458565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61060085611803565b905082606001516001600160401b03168160a001516001600160401b0316116106775760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610469565b5f83606001518260a0015161068c9190614480565b905061069886826118e2565b5f6005600160991b0163ee5b48eb6106b189878661192a565b6040518263ffffffff1660e01b81526004016106cd91906144c9565b6020604051808303815f875af11580156106e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070d91906144fb565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614cee83398151915260205260408082208151610100810190925280545f80516020614cae83398151915293929190829060ff1660058111156107bc576107bc614458565b60058111156107cd576107cd614458565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561085257610852614458565b146108b75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610469565b6005600160991b016001600160a01b031663ee5b48eb6108dc8584608001515f61192a565b6040518263ffffffff1660e01b81526004016108f891906144c9565b6020604051808303815f875af1158015610914573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093891906144fb565b50505050565b5f61094e64e8d4a5100083614526565b92915050565b5f61095e82611b47565b905061097b81606001516001600160401b03168260400151611eba565b5050565b5f80516020614c6e8339815191525f61099784611ef0565b90505f806109a883604001516120d1565b50915091505f6109b783611803565b9050816001600160401b031681608001516001600160401b031610156109ef5760405162461bcd60e51b815260040161046990614539565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a345760405162461bcd60e51b81526004016104699061457b565b60015f87815260068701602052604090205460ff166004811115610a5a57610a5a614458565b14610ac35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610469565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61094e6001600160401b03831664e8d4a510006145c4565b5f610b7282611803565b60a0015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bc5575080546001600160401b03808416911610155b15610be35760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c0e848461230c565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020614c6e8339815191525f610c7885611803565b5f86815260058401602052604090205460c0820151919250610caa91620100009091046001600160401b0316906145db565b6001600160401b0316421015610d1e5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610469565b8315610d3057610d2e85846114e5565b505b610d3985612326565b5050505050565b5f80516020614c6e8339815191525f610d5884611ef0565b90505f80610d6983604001516120d1565b50915091505f610d7883611803565b9050816001600160401b031681608001516001600160401b03161015610db05760405162461bcd60e51b815260040161046990614539565b5f8681526006860160205260409020600301546001600160401b0380841691161115610dee5760405162461bcd60e51b81526004016104699061457b565b60035f87815260068701602052604090205460ff166004811115610e1457610e14614458565b14610e685760405162461bcd60e51b815260206004820152603160248201525f80516020614c8e8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610469565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f0d91611eba565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f5b8333846126c4565b9392505050565b5f610f6b612ab9565b610f76848484612af0565b9050610f5b60015f80516020614cce83398151915255565b5f80516020614cae8339815191525f610fa683611ef0565b90505f80610fb78360400151612cd2565b91509150806110195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610469565b5f82815260058501602052604081208054611033906145fb565b9050118015611065575060015f83815260068601602052604090205460ff16600581111561106357611063614458565b145b6110815760405162461bcd60e51b815260040161046990614633565b5f82815260058501602052604081206110999161420b565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614c6e83398151915293929190829060ff1660048111156111ac576111ac614458565b60048111156111bd576111bd614458565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561124457611244614458565b1480611262575060038151600481111561126057611260614458565b145b6112b65760405162461bcd60e51b815260206004820152603260248201525f80516020614c8e833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610469565b5f6112c48260400151611803565b905080608001516001600160401b03165f036113485760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610469565b6005600160991b016001600160a01b031663ee5b48eb611375846040015184608001518560a0015161192a565b6040518263ffffffff1660e01b815260040161139191906144c9565b6020604051808303815f875af11580156113ad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d3991906144fb565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614cae833981519152929190611419906145fb565b905011801561144b575060015f83815260068301602052604090205460ff16600581111561144957611449614458565b145b6114675760405162461bcd60e51b815260040161046990614633565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114a0919060040161467a565b6020604051808303815f875af11580156114bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e091906144fb565b505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611530573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611557919081019061477b565b91509150806115ba5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610469565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162191906144fb565b8251146116855760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610469565b60208201516001600160a01b0316156116fb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610469565b5f8061170a8460400151612e73565b915091508187146117775760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610469565b9695505050505050565b5f8181525f80516020614cee8339815191526020526040812060030180545f80516020614cae833981519152916001600160401b0390911690836117c483614863565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b61180b614242565b5f8281525f80516020614cee8339815191526020526040908190208151610100810190925280545f80516020614cae833981519152929190829060ff16600581111561185957611859614458565b600581111561186a5761186a614458565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614cee833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119a357611963816001614888565b61196e9060086145c4565b5081515f908390839081106119855761198561489b565b60200101906001600160f81b03191690815f1a90535060010161194f565b505f5b6004811015611a06576119ba816003614888565b6119c59060086145c4565b6001901c60f81b826119d88360026148af565b815181106119e8576119e861489b565b60200101906001600160f81b03191690815f1a9053506001016119a6565b505f5b6020811015611a6857611a1d81601f614888565b611a289060086145c4565b86901c60f81b82611a3a8360066148af565b81518110611a4a57611a4a61489b565b60200101906001600160f81b03191690815f1a905350600101611a09565b505f5b6008811015611ad357611a7f816007614888565b611a8a9060086145c4565b6001600160401b038616901c60f81b82611aa58360266148af565b81518110611ab557611ab561489b565b60200101906001600160f81b03191690815f1a905350600101611a6b565b505f5b6008811015611b3e57611aea816007614888565b611af59060086145c4565b6001600160401b038516901c60f81b82611b1083602e6148af565b81518110611b2057611b2061489b565b60200101906001600160f81b03191690815f1a905350600101611ad6565b50949350505050565b611b4f614242565b5f80516020614cae8339815191525f611b6784611ef0565b90505f80611b788360400151612cd2565b915091508015611bdd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610469565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611c0f57611c0f614458565b6005811115611c2057611c20614458565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ca757611ca7614458565b1480611cc55750600182516005811115611cc357611cc3614458565b145b611d245760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610469565b600382516005811115611d3957611d39614458565b03611d4657506004611d4a565b5060055b6020808301515f90815260078801909152604081205581816005811115611d7357611d73614458565b90816005811115611d8657611d86614458565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611dba57611dba614458565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e8557611e85614458565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461097b906001600160a01b0316828461304b565b60408051606080820183525f8083526020830181905292820152905f80516020614cae8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f8c919081019061477b565b9150915080611ff35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610469565b82548251146120565760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610469565b60208201516001600160a01b0316156120c95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610469565b509392505050565b5f805f83516036146120f55760405162461bcd60e51b8152600401610469906148c2565b5f805b60028110156121445761210c816001614888565b6121179060086145c4565b61ffff1686828151811061212d5761212d61489b565b016020015160f81c901b91909117906001016120f8565b5061ffff8116156121675760405162461bcd60e51b81526004016104699061490b565b5f805b60048110156121c25761217e816003614888565b6121899060086145c4565b63ffffffff168761219b8360026148af565b815181106121ab576121ab61489b565b016020015160f81c901b919091179060010161216a565b5063ffffffff81166003146121e95760405162461bcd60e51b81526004016104699061494e565b5f805b602081101561223e5761220081601f614888565b61220b9060086145c4565b886122178360066148af565b815181106122275761222761489b565b016020015160f81c901b91909117906001016121ec565b505f805b600881101561229d57612256816007614888565b6122619060086145c4565b6001600160401b0316896122768360266148af565b815181106122865761228661489b565b016020015160f81c901b9190911790600101612242565b505f805b60088110156122fc576122b5816007614888565b6122c09060086145c4565b6001600160401b03168a6122d583602e6148af565b815181106122e5576122e561489b565b016020015160f81c901b91909117906001016122a1565b5091989097509095509350505050565b6123146130aa565b61231d826130f5565b61097b81613162565b5f8181525f80516020614cee83398151915260205260408082208151610100810190925280545f80516020614cae83398151915293929190829060ff16600581111561237457612374614458565b600581111561238557612385614458565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561240d5761240d614458565b146124695760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610469565b60408101516001600160a01b0316336001600160a01b0316146124e35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610469565b6124f08160a00151613216565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561253457612534614458565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612600846125fa81611781565b5f61192a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061262f9085906004016144c9565b6020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906144fb565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126cd612ab9565b5f80516020614c6e8339815191525f6126e86101c1856133b7565b90505f6126f487611803565b905060028151600581111561270b5761270b614458565b1461276a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610469565b5f828260a0015161277b91906145db565b6004850154606084015191925061279d916001600160401b0390911690614995565b6001600160401b0316816001600160401b0316111561281c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610469565b61282688826118e2565b5f61283089611781565b90505f898260405160200161285c92919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061287d85613216565b5f6005600160991b0163ee5b48eb6128968d868861192a565b6040518263ffffffff1660e01b81526004016128b291906144c9565b6020604051808303815f875af11580156128ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128f291906144fb565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561297a5761297a614458565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610f5b60015f80516020614cce83398151915255565b5f80516020614cce833981519152805460011901612aea57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614c6e833981519152906001600160401b0316612b3c604086016020870161436a565b6001600160401b03161015612bab5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610469565b6003810154612bbd60208601866149cf565b61ffff1610158015612be15750612710612bda60208601866149cf565b61ffff1611155b612bfd5760405162461bcd60e51b8152600401610469906149ea565b80548310801590612c12575080600101548311155b612c705760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610469565b5f612c7a846133b7565b90505f612c868261093e565b90505f612c9388836133ed565b5f81815260058601602052604090209091508790612cb18282614a35565b509098975050505050505050565b60015f80516020614cce83398151915255565b5f808251602714612cf55760405162461bcd60e51b8152600401610469906148c2565b5f805b6002811015612d4457612d0c816001614888565b612d179060086145c4565b61ffff16858281518110612d2d57612d2d61489b565b016020015160f81c901b9190911790600101612cf8565b5061ffff811615612d675760405162461bcd60e51b81526004016104699061490b565b5f805b6004811015612dc257612d7e816003614888565b612d899060086145c4565b63ffffffff1686612d9b8360026148af565b81518110612dab57612dab61489b565b016020015160f81c901b9190911790600101612d6a565b5063ffffffff8116600214612de95760405162461bcd60e51b81526004016104699061494e565b5f805b6020811015612e3e57612e0081601f614888565b612e0b9060086145c4565b87612e178360066148af565b81518110612e2757612e2761489b565b016020015160f81c901b9190911790600101612dec565b505f86602681518110612e5357612e5361489b565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e965760405162461bcd60e51b8152600401610469906148c2565b5f805b6002811015612ee557612ead816001614888565b612eb89060086145c4565b61ffff16858281518110612ece57612ece61489b565b016020015160f81c901b9190911790600101612e99565b5061ffff811615612f085760405162461bcd60e51b81526004016104699061490b565b5f805b6004811015612f6357612f1f816003614888565b612f2a9060086145c4565b63ffffffff1686612f3c8360026148af565b81518110612f4c57612f4c61489b565b016020015160f81c901b9190911790600101612f0b565b5063ffffffff8116600414612f8a5760405162461bcd60e51b81526004016104699061494e565b5f805b6020811015612fdf57612fa181601f614888565b612fac9060086145c4565b87612fb88360066148af565b81518110612fc857612fc861489b565b016020015160f81c901b9190911790600101612f8d565b505f805b600881101561303e57612ff7816007614888565b6130029060086145c4565b6001600160401b0316886130178360266148af565b815181106130275761302761489b565b016020015160f81c901b9190911790600101612fe3565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526114e091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506138b7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130f357604051631afcd79f60e31b815260040160405180910390fd5b565b6130fd6130aa565b61310681613918565b61315f6060820135608083013561312360c0850160a0860161436a565b61313360e0860160c087016149cf565b61ffff16613148610100870160e08801614a8b565b61315a61012088016101008901614aab565b613939565b50565b61316a6130aa565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131f65760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610469565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614cae8339815191529060ff165f03613254575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061329c9083614888565b106132b8576001600160401b03841660408301528082526132d7565b83826040018181516132ca91906145db565b6001600160401b03169052505b5f8260200151836040015160646132ee9190614995565b6132f89190614ac6565b600285015490915060ff90811690821611156133735760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610469565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f61094e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b1e565b5f5f80516020614cae8339815191524261340d604086016020870161436a565b6001600160401b0316118015613446575061342e604085016020860161436a565b6001600160401b0316613444426202a3006148af565b115b6134a85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610469565b83356135005760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610469565b83355f908152600782016020526040902054156135705760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610469565b61357d6040850185614aeb565b90506030146135e45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610469565b6135ed83613216565b5f806136876040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613632919061436a565b6001600160401b0316815260200161364d60408a018a614aeb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613c80565b5f828152600586016020526040902091935091506136a58282614b78565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906136d29085906004016144c9565b6020604051808303815f875af11580156136ee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061371291906144fb565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff1916600183600581111561379457613794614458565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161388991908e01908e0161436a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6138cb6001600160a01b03841683614025565b905080515f141580156138ef5750808060200190518101906138ed9190614c37565b155b156114e057604051635274afe760e01b81526001600160a01b0384166004820152602401610469565b6139206130aa565b613928614032565b613930614042565b61315f8161404a565b6139416130aa565b5f80516020614c6e833981519152836139ad5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610469565b6127108411156139cf5760405162461bcd60e51b8152600401610469906149ea565b85871115613a375760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610469565b600a60ff841611801590613a4d57505f8360ff16115b613ab75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610469565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613b64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b8891906144fb565b9050613b9f6001600160a01b0385163330866140b6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613be3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0791906144fb565b9050818111613c6d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610469565b613c778282614888565b95945050505050565b5f6060826080015151603014613cea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610469565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613d6157613d21816001614888565b613d2c9060086145c4565b5081515f90839083908110613d4357613d4361489b565b60200101906001600160f81b03191690815f1a905350600101613d0d565b505f5b6004811015613dbf57613d78816003614888565b613d839060086145c4565b505f82613d918360026148af565b81518110613da157613da161489b565b60200101906001600160f81b03191690815f1a905350600101613d64565b505f5b6020811015613e1c5784518160208110613dde57613dde61489b565b1a60f81b82613dee8360066148af565b81518110613dfe57613dfe61489b565b60200101906001600160f81b03191690815f1a905350600101613dc2565b505f5b6020811015613e7c5784602001518160208110613e3e57613e3e61489b565b1a60f81b82613e4e8360266148af565b81518110613e5e57613e5e61489b565b60200101906001600160f81b03191690815f1a905350600101613e1f565b505f5b6008811015613ef057613e93816007614888565b613e9e9060086145c4565b60ff1685604001516001600160401b0316901c60f81b82826046613ec291906148af565b81518110613ed257613ed261489b565b60200101906001600160f81b03191690815f1a905350600101613e7f565b505f5b6030811015613f5b5784608001518181518110613f1257613f1261489b565b01602001516001600160f81b03191682613f2d83604e6148af565b81518110613f3d57613f3d61489b565b60200101906001600160f81b03191690815f1a905350600101613ef3565b505f5b6008811015613fcd57613f72816007614888565b613f7d9060086145c4565b60608601516001600160401b0390811691161c60f81b82613f9f83607e6148af565b81518110613faf57613faf61489b565b60200101906001600160f81b03191690815f1a905350600101613f5e565b50600281604051613fde9190614c52565b602060405180830381855afa158015613ff9573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061401c91906144fb565b94909350915050565b6060610f5b83835f6140ef565b61403a6130aa565b6130f361417e565b6130f36130aa565b6140526130aa565b80355f80516020614cae83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561409c6060830160408401614a8b565b600291909101805460ff191660ff90921691909117905550565b6040516001600160a01b0384811660248301528381166044830152606482018390526109389186918216906323b872dd90608401613078565b6060814710156141145760405163cd78605960e01b8152306004820152602401610469565b5f80856001600160a01b0316848660405161412f9190614c52565b5f6040518083038185875af1925050503d805f8114614169576040519150601f19603f3d011682016040523d82523d5f602084013e61416e565b606091505b5091509150611777868383614186565b612cbf6130aa565b60608261419b57614196826141e2565b610f5b565b81511580156141b257506001600160a01b0384163b155b156141db57604051639996b31560e01b81526001600160a01b0385166004820152602401610469565b5080610f5b565b8051156141f25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614217906145fb565b5f825580601f10614226575050565b601f0160209004905f5260205f209081019061315f9190614286565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561429a575f8155600101614287565b5090565b801515811461315f575f80fd5b803563ffffffff811681146142be575f80fd5b919050565b5f805f606084860312156142d5575f80fd5b8335925060208401356142e78161429e565b91506142f5604085016142ab565b90509250925092565b5f6020828403121561430e575f80fd5b5035919050565b5f60208284031215614325575f80fd5b610f5b826142ab565b5f806040838503121561433f575f80fd5b614348836142ab565b946020939093013593505050565b6001600160401b038116811461315f575f80fd5b5f6020828403121561437a575f80fd5b8135610f5b81614356565b6001600160a01b038116811461315f575f80fd5b5f808284036101408112156143ac575f80fd5b610120808212156143bb575f80fd5b84935083013590506143cc81614385565b809150509250929050565b5f80604083850312156143e8575f80fd5b50508035926020909101359150565b5f805f838503608081121561440a575f80fd5b84356001600160401b0381111561441f575f80fd5b850160608188031215614430575f80fd5b93506040601f1982011215614443575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144a0576144a061446c565b5092915050565b5f5b838110156144c15781810151838201526020016144a9565b50505f910152565b602081525f82518060208401526144e78160408501602087016144a7565b601f01601f19169190910160400192915050565b5f6020828403121561450b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261453457614534614512565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761094e5761094e61446c565b6001600160401b038181168382160190808211156144a0576144a061446c565b600181811c9082168061460f57607f821691505b60208210810361462d57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461468c816145fb565b806020870152604060018084165f81146146ad57600181146146c9576146f6565b60ff19851660408a0152604084151560051b8a010195506146f6565b895f5260205f205f5b858110156146ed5781548b82018601529083019088016146d2565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561473a5761473a614704565b60405290565b604051601f8201601f191681016001600160401b038111828210171561476857614768614704565b604052919050565b80516142be8161429e565b5f806040838503121561478c575f80fd5b82516001600160401b03808211156147a2575f80fd5b90840190606082870312156147b5575f80fd5b6147bd614718565b825181526020808401516147d081614385565b828201526040840151838111156147e5575f80fd5b80850194505087601f8501126147f9575f80fd5b83518381111561480b5761480b614704565b61481d601f8201601f19168301614740565b93508084528882828701011115614832575f80fd5b614841818386018488016144a7565b50826040830152819550614856818801614770565b9450505050509250929050565b5f6001600160401b0380831681810361487e5761487e61446c565b6001019392505050565b8181038181111561094e5761094e61446c565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561094e5761094e61446c565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146149b8576149b861446c565b505092915050565b61ffff8116811461315f575f80fd5b5f602082840312156149df575f80fd5b8135610f5b816149c0565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614a40816149c0565b61ffff8116905081548161ffff1982161783556020840135614a6181614356565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614a9b575f80fd5b813560ff81168114610f5b575f80fd5b5f60208284031215614abb575f80fd5b8135610f5b81614385565b5f6001600160401b0380841680614adf57614adf614512565b92169190910492915050565b5f808335601e19843603018112614b00575f80fd5b8301803591506001600160401b03821115614b19575f80fd5b602001915036819003821315614b2d575f80fd5b9250929050565b601f8211156114e057805f5260205f20601f840160051c81016020851015614b595750805b601f840160051c820191505b81811015610d39575f8155600101614b65565b81516001600160401b03811115614b9157614b91614704565b614ba581614b9f84546145fb565b84614b34565b602080601f831160018114614bd8575f8415614bc15750858301515b5f19600386901b1c1916600185901b178555614c2f565b5f85815260208120601f198616915b82811015614c0657888601518255948401946001909101908401614be7565b5085821015614c2357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614c47575f80fd5b8151610f5b8161429e565b5f8251614c638184602087016144a7565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 89d7fc795..2e6f977e2 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -63,7 +63,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614a8c380380614a8c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61493f8061014d5f395ff3fe608060405260043610610110575f3560e01c806366435abf1161009d578063b771b3bc11610062578063b771b3bc14610322578063ba3a4b9714610354578063bee0a03f14610373578063c123c6db14610392578063c599e24f146103b1575f80fd5b806366435abf1461029357806376f78621146102b257806380a8ad94146102d157806398f3e2b4146102e4578063a3a65e4814610303575f80fd5b80632e2194d8116100e35780632e2194d8146101d757806335455ded1461020e578063467ef06f146102365780635297fae6146102555780636206585614610274575f80fd5b80630118acc4146101145780630322ed98146101355780630cdd098514610154578063151d30d1146101b1575b5f80fd5b34801561011f575f80fd5b5061013361012e366004613fa3565b6103c4565b005b348015610140575f80fd5b5061013361014f366004613fde565b61082e565b34801561015f575f80fd5b5061019e61016e366004613fde565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101bc575f80fd5b506101c5600a81565b60405160ff90911681526020016101a8565b3480156101e2575f80fd5b506101f66101f1366004613fde565b6109fe565b6040516001600160401b0390911681526020016101a8565b348015610219575f80fd5b5061022361271081565b60405161ffff90911681526020016101a8565b348015610241575f80fd5b50610133610250366004613ff5565b610a14565b348015610260575f80fd5b5061013361026f36600461400e565b610a3f565b34801561027f575f80fd5b5061019e61028e36600461404a565b610c0f565b34801561029e575f80fd5b506101f66102ad366004613fde565b610c28565b3480156102bd575f80fd5b506101336102cc366004613fa3565b610c3c565b61019e6102df366004614065565b610d1c565b3480156102ef575f80fd5b506101336102fe36600461400e565b610d48565b34801561030e575f80fd5b5061013361031d366004613ff5565b610f57565b34801561032d575f80fd5b5061033c6005600160991b0181565b6040516001600160a01b0390911681526020016101a8565b34801561035f575f80fd5b5061013361036e366004613fde565b611114565b34801561037e575f80fd5b5061013361038d366004613fde565b61139a565b34801561039d575f80fd5b506101336103ac3660046140be565b6114ae565b61019e6103bf366004613fde565b611590565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061489383398151915291841561041657610413828561159c565b90505b5f868152600684016020526040808220815161010081019092528054829060ff166004811115610448576104486140d5565b6004811115610459576104596140d5565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104e0576104e06140d5565b146105325760405162461bcd60e51b815260206004820152602a60248201525f805160206148b38339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105975760405162461bcd60e51b815260206004820152603360248201525f805160206148b38339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610529565b5f6105a184611838565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105ee576105ee6140d5565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106c0856118ba565b905082606001516001600160401b03168160a001516001600160401b0316116107375760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610529565b5f83606001518260a0015161074c91906140fd565b90506107588682611999565b5f6005600160991b0163ee5b48eb6107718987866119e1565b6040518263ffffffff1660e01b815260040161078d9190614146565b6020604051808303815f875af11580156107a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107cd9190614178565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061491383398151915260205260408082208151610100810190925280545f805160206148d383398151915293929190829060ff16600581111561087c5761087c6140d5565b600581111561088d5761088d6140d5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610912576109126140d5565b146109775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610529565b6005600160991b016001600160a01b031663ee5b48eb61099c8584608001515f6119e1565b6040518263ffffffff1660e01b81526004016109b89190614146565b6020604051808303815f875af11580156109d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f89190614178565b50505050565b5f610a0e64e8d4a51000836141a3565b92915050565b5f610a1e82611c00565b9050610a3b81606001516001600160401b03168260400151611f73565b5050565b5f805160206148938339815191525f610a5784611f86565b90505f80610a688360400151612167565b50915091505f610a77836118ba565b9050816001600160401b031681608001516001600160401b03161015610aaf5760405162461bcd60e51b8152600401610529906141b6565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610af45760405162461bcd60e51b8152600401610529906141f8565b60015f87815260068701602052604090205460ff166004811115610b1a57610b1a6140d5565b14610b835760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610529565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a0e6001600160401b03831664e8d4a51000614241565b5f610c32826118ba565b60a0015192915050565b5f805160206148938339815191525f610c54856118ba565b5f86815260058401602052604090205460c0820151919250610c8691620100009091046001600160401b031690614258565b6001600160401b0316421015610cfa5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610529565b8315610d0c57610d0a858461159c565b505b610d15856123a2565b5050505050565b5f610d25612740565b610d30838334612777565b9050610a0e60015f805160206148f383398151915255565b5f805160206148938339815191525f610d6084611f86565b90505f80610d718360400151612167565b50915091505f610d80836118ba565b9050816001600160401b031681608001516001600160401b03161015610db85760405162461bcd60e51b8152600401610529906141b6565b5f8681526006860160205260409020600301546001600160401b0380841691161115610df65760405162461bcd60e51b8152600401610529906141f8565b60035f87815260068701602052604090205460ff166004811115610e1c57610e1c6140d5565b14610e705760405162461bcd60e51b815260206004820152603160248201525f805160206148b38339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610529565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f1591611f73565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206148d38339815191525f610f6f83611f86565b90505f80610f808360400151612992565b9150915080610fe25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610529565b5f82815260058501602052604081208054610ffc90614278565b905011801561102e575060015f83815260068601602052604090205460ff16600581111561102c5761102c6140d5565b145b61104a5760405162461bcd60e51b8152600401610529906142aa565b5f828152600585016020526040812061106291613eeb565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061489383398151915293929190829060ff166004811115611175576111756140d5565b6004811115611186576111866140d5565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561120d5761120d6140d5565b148061122b5750600381516004811115611229576112296140d5565b145b61127f5760405162461bcd60e51b815260206004820152603260248201525f805160206148b3833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610529565b5f61128d82604001516118ba565b905080608001516001600160401b03165f036113115760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610529565b6005600160991b016001600160a01b031663ee5b48eb61133e846040015184608001518560a001516119e1565b6040518263ffffffff1660e01b815260040161135a9190614146565b6020604051808303815f875af1158015611376573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d159190614178565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206148d38339815191529291906113e290614278565b9050118015611414575060015f83815260068301602052604090205460ff166005811115611412576114126140d5565b145b6114305760405162461bcd60e51b8152600401610529906142aa565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161146991906004016142f1565b6020604051808303815f875af1158015611485573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a99190614178565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806114f7575080546001600160401b03808416911610155b156115155760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561153f83612b33565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a0e823334612b47565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115e7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261160e9190810190614406565b91509150806116715760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610529565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d89190614178565b82511461173c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610529565b60208201516001600160a01b0316156117b25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610529565b5f806117c18460400151612f39565b9150915081871461182e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610529565b9695505050505050565b5f8181525f805160206149138339815191526020526040812060030180545f805160206148d3833981519152916001600160401b03909116908361187b836144ee565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6118c2613f22565b5f8281525f805160206149138339815191526020526040908190208151610100810190925280545f805160206148d3833981519152929190829060ff166005811115611910576119106140d5565b6005811115611921576119216140d5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614913833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5a57611a1a816001614513565b611a25906008614241565b5081515f90839083908110611a3c57611a3c614526565b60200101906001600160f81b03191690815f1a905350600101611a06565b505f5b6004811015611abd57611a71816003614513565b611a7c906008614241565b6001901c60f81b82611a8f83600261453a565b81518110611a9f57611a9f614526565b60200101906001600160f81b03191690815f1a905350600101611a5d565b505f5b6020811015611b1f57611ad481601f614513565b611adf906008614241565b86901c60f81b82611af183600661453a565b81518110611b0157611b01614526565b60200101906001600160f81b03191690815f1a905350600101611ac0565b505f5b6008811015611b8a57611b36816007614513565b611b41906008614241565b6001600160401b038616901c60f81b82611b5c83602661453a565b81518110611b6c57611b6c614526565b60200101906001600160f81b03191690815f1a905350600101611b22565b505f5b6008811015611bf557611ba1816007614513565b611bac906008614241565b6001600160401b038516901c60f81b82611bc783602e61453a565b81518110611bd757611bd7614526565b60200101906001600160f81b03191690815f1a905350600101611b8d565b5090505b9392505050565b611c08613f22565b5f805160206148d38339815191525f611c2084611f86565b90505f80611c318360400151612992565b915091508015611c965760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610529565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611cc857611cc86140d5565b6005811115611cd957611cd96140d5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d6057611d606140d5565b1480611d7e5750600182516005811115611d7c57611d7c6140d5565b145b611ddd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610529565b600382516005811115611df257611df26140d5565b03611dff57506004611e03565b5060055b6020808301515f90815260078801909152604081205581816005811115611e2c57611e2c6140d5565b90816005811115611e3f57611e3f6140d5565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611e7357611e736140d5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f3e57611f3e6140d5565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a3b6001600160a01b03821683613111565b60408051606080820183525f8083526020830181905292820152905f805160206148d38339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ffb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120229190810190614406565b91509150806120895760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610529565b82548251146120ec5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610529565b60208201516001600160a01b03161561215f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610529565b509392505050565b5f805f835160361461218b5760405162461bcd60e51b81526004016105299061454d565b5f805b60028110156121da576121a2816001614513565b6121ad906008614241565b61ffff168682815181106121c3576121c3614526565b016020015160f81c901b919091179060010161218e565b5061ffff8116156121fd5760405162461bcd60e51b815260040161052990614596565b5f805b600481101561225857612214816003614513565b61221f906008614241565b63ffffffff168761223183600261453a565b8151811061224157612241614526565b016020015160f81c901b9190911790600101612200565b5063ffffffff811660031461227f5760405162461bcd60e51b8152600401610529906145d9565b5f805b60208110156122d45761229681601f614513565b6122a1906008614241565b886122ad83600661453a565b815181106122bd576122bd614526565b016020015160f81c901b9190911790600101612282565b505f805b6008811015612333576122ec816007614513565b6122f7906008614241565b6001600160401b03168961230c83602661453a565b8151811061231c5761231c614526565b016020015160f81c901b91909117906001016122d8565b505f805b60088110156123925761234b816007614513565b612356906008614241565b6001600160401b03168a61236b83602e61453a565b8151811061237b5761237b614526565b016020015160f81c901b9190911790600101612337565b5091989097509095509350505050565b5f8181525f8051602061491383398151915260205260408082208151610100810190925280545f805160206148d383398151915293929190829060ff1660058111156123f0576123f06140d5565b6005811115612401576124016140d5565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612489576124896140d5565b146124e55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610529565b60408101516001600160a01b0316336001600160a01b03161461255f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610529565b61256c8160a001516131a4565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156125b0576125b06140d5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61267c8461267681611838565b5f6119e1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126ab908590600401614146565b6020604051808303815f875af11580156126c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126eb9190614178565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f805160206148f383398151915280546001190161277157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614893833981519152906001600160401b03166127c3604086016020870161404a565b6001600160401b031610156128325760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610529565b6003810154612844602086018661462f565b61ffff16101580156128685750612710612861602086018661462f565b61ffff1611155b6128c85760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610529565b805483108015906128dd575080600101548311155b61293b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610529565b825f612946826109fe565b90505f6129538883613345565b5f81815260058601602052604090209091508790612971828261464a565b509098975050505050505050565b60015f805160206148f383398151915255565b5f8082516027146129b55760405162461bcd60e51b81526004016105299061454d565b5f805b6002811015612a04576129cc816001614513565b6129d7906008614241565b61ffff168582815181106129ed576129ed614526565b016020015160f81c901b91909117906001016129b8565b5061ffff811615612a275760405162461bcd60e51b815260040161052990614596565b5f805b6004811015612a8257612a3e816003614513565b612a49906008614241565b63ffffffff1686612a5b83600261453a565b81518110612a6b57612a6b614526565b016020015160f81c901b9190911790600101612a2a565b5063ffffffff8116600214612aa95760405162461bcd60e51b8152600401610529906145d9565b5f805b6020811015612afe57612ac081601f614513565b612acb906008614241565b87612ad783600661453a565b81518110612ae757612ae7614526565b016020015160f81c901b9190911790600101612aac565b505f86602681518110612b1357612b13614526565b016020015191976001600160f81b03199092161515965090945050505050565b612b3b613821565b612b448161386c565b50565b5f612b50612740565b5f805160206148938339815191525f612b68846109fe565b90505f612b74876118ba565b9050600281516005811115612b8b57612b8b6140d5565b14612bea5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610529565b5f828260a00151612bfb9190614258565b60048501546060840151919250612c1d916001600160401b03909116906146a0565b6001600160401b0316816001600160401b03161115612c9c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610529565b612ca68882611999565b5f612cb089611838565b90505f8982604051602001612cdc92919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612cfd856131a4565b5f6005600160991b0163ee5b48eb612d168d86886119e1565b6040518263ffffffff1660e01b8152600401612d329190614146565b6020604051808303815f875af1158015612d4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d729190614178565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612dfa57612dfa6140d5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611bf960015f805160206148f383398151915255565b5f808251602e14612f5c5760405162461bcd60e51b81526004016105299061454d565b5f805b6002811015612fab57612f73816001614513565b612f7e906008614241565b61ffff16858281518110612f9457612f94614526565b016020015160f81c901b9190911790600101612f5f565b5061ffff811615612fce5760405162461bcd60e51b815260040161052990614596565b5f805b600481101561302957612fe5816003614513565b612ff0906008614241565b63ffffffff168661300283600261453a565b8151811061301257613012614526565b016020015160f81c901b9190911790600101612fd1565b5063ffffffff81166004146130505760405162461bcd60e51b8152600401610529906145d9565b5f805b60208110156130a55761306781601f614513565b613072906008614241565b8761307e83600661453a565b8151811061308e5761308e614526565b016020015160f81c901b9190911790600101613053565b505f805b6008811015613104576130bd816007614513565b6130c8906008614241565b6001600160401b0316886130dd83602661453a565b815181106130ed576130ed614526565b016020015160f81c901b91909117906001016130a9565b5090969095509350505050565b804710156131345760405163cd78605960e01b8152306004820152602401610529565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461317d576040519150601f19603f3d011682016040523d82523d5f602084013e613182565b606091505b50509050806114a957604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206148d38339815191529060ff165f036131e2575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061322a9083614513565b10613246576001600160401b0384166040830152808252613265565b83826040018181516132589190614258565b6001600160401b03169052505b5f82602001518360400151606461327c91906146a0565b61328691906146cb565b600285015490915060ff90811690821611156133015760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610529565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f5f805160206148d383398151915242613365604086016020870161404a565b6001600160401b031611801561339e5750613386604085016020860161404a565b6001600160401b031661339c426202a30061453a565b115b6134005760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610529565b83356134585760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610529565b83355f908152600782016020526040902054156134c85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610529565b6134d560408501856146f0565b905060301461353c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610529565b613545836131a4565b5f806135df6040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061358a919061404a565b6001600160401b031681526020016135a560408a018a6146f0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506138d6565b5f828152600586016020526040902091935091506135fd828261477d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061362a908590600401614146565b6020604051808303815f875af1158015613646573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061366a9190614178565b604080516101008101825260018152893560208201529192508101336001600160a01b03168152602001876001600160401b031681526020016136ac85611838565b6001600160401b03908116825288166020808301919091525f60408084018290526060909301819052868152600688019091522081518154829060ff191660018360058111156136fe576136fe6140d5565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916137f391908e01908e0161404a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661386a57604051631afcd79f60e31b815260040160405180910390fd5b565b613874613821565b61387d81613c7b565b612b446060820135608083013561389a60c0850160a0860161404a565b6138aa60e0860160c0870161462f565b61ffff166138bf610100870160e0880161483c565b6138d16101208801610100890161485c565b613c9c565b5f60608260800151516030146139405760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610529565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156139b757613977816001614513565b613982906008614241565b5081515f9083908390811061399957613999614526565b60200101906001600160f81b03191690815f1a905350600101613963565b505f5b6004811015613a15576139ce816003614513565b6139d9906008614241565b505f826139e783600261453a565b815181106139f7576139f7614526565b60200101906001600160f81b03191690815f1a9053506001016139ba565b505f5b6020811015613a725784518160208110613a3457613a34614526565b1a60f81b82613a4483600661453a565b81518110613a5457613a54614526565b60200101906001600160f81b03191690815f1a905350600101613a18565b505f5b6020811015613ad25784602001518160208110613a9457613a94614526565b1a60f81b82613aa483602661453a565b81518110613ab457613ab4614526565b60200101906001600160f81b03191690815f1a905350600101613a75565b505f5b6008811015613b4657613ae9816007614513565b613af4906008614241565b60ff1685604001516001600160401b0316901c60f81b82826046613b18919061453a565b81518110613b2857613b28614526565b60200101906001600160f81b03191690815f1a905350600101613ad5565b505f5b6030811015613bb15784608001518181518110613b6857613b68614526565b01602001516001600160f81b03191682613b8383604e61453a565b81518110613b9357613b93614526565b60200101906001600160f81b03191690815f1a905350600101613b49565b505f5b6008811015613c2357613bc8816007614513565b613bd3906008614241565b60608601516001600160401b0390811691161c60f81b82613bf583607e61453a565b81518110613c0557613c05614526565b60200101906001600160f81b03191690815f1a905350600101613bb4565b50600281604051613c349190614877565b602060405180830381855afa158015613c4f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c729190614178565b94909350915050565b613c83613821565b613c8b613e5f565b613c93613e6f565b612b4481613e77565b613ca4613821565b5f8051602061489383398151915283613d105760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610529565b85871115613d785760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610529565b600a60ff841611801590613d8e57505f8360ff16115b613df85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610529565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b613e67613821565b61386a613ee3565b61386a613821565b613e7f613821565b80355f805160206148d383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613ec9606083016040840161483c565b600291909101805460ff191660ff90921691909117905550565b61297f613821565b508054613ef790614278565b5f825580601f10613f06575050565b601f0160209004905f5260205f2090810190612b449190613f66565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613f7a575f8155600101613f67565b5090565b8015158114612b44575f80fd5b803563ffffffff81168114613f9e575f80fd5b919050565b5f805f60608486031215613fb5575f80fd5b833592506020840135613fc781613f7e565b9150613fd560408501613f8b565b90509250925092565b5f60208284031215613fee575f80fd5b5035919050565b5f60208284031215614005575f80fd5b611bf982613f8b565b5f806040838503121561401f575f80fd5b61402883613f8b565b946020939093013593505050565b6001600160401b0381168114612b44575f80fd5b5f6020828403121561405a575f80fd5b8135611bf981614036565b5f808284036060811215614077575f80fd5b83356001600160401b0381111561408c575f80fd5b84016060818703121561409d575f80fd5b92506040601f19820112156140b0575f80fd5b506020830190509250929050565b5f61012082840312156140cf575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561411d5761411d6140e9565b5092915050565b5f5b8381101561413e578181015183820152602001614126565b50505f910152565b602081525f8251806020840152614164816040850160208701614124565b601f01601f19169190910160400192915050565b5f60208284031215614188575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826141b1576141b161418f565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a0e57610a0e6140e9565b6001600160401b0381811683821601908082111561411d5761411d6140e9565b600181811c9082168061428c57607f821691505b6020821081036140cf57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461430381614278565b806020870152604060018084165f811461432457600181146143405761436d565b60ff19851660408a0152604084151560051b8a0101955061436d565b895f5260205f205f5b858110156143645781548b8201860152908301908801614349565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156143b1576143b161437b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156143df576143df61437b565b604052919050565b6001600160a01b0381168114612b44575f80fd5b8051613f9e81613f7e565b5f8060408385031215614417575f80fd5b82516001600160401b038082111561442d575f80fd5b9084019060608287031215614440575f80fd5b61444861438f565b8251815260208084015161445b816143e7565b82820152604084015183811115614470575f80fd5b80850194505087601f850112614484575f80fd5b8351838111156144965761449661437b565b6144a8601f8201601f191683016143b7565b935080845288828287010111156144bd575f80fd5b6144cc81838601848801614124565b508260408301528195506144e18188016143fb565b9450505050509250929050565b5f6001600160401b03808316818103614509576145096140e9565b6001019392505050565b81810381811115610a0e57610a0e6140e9565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a0e57610a0e6140e9565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114612b44575f80fd5b5f6020828403121561463f575f80fd5b8135611bf981614620565b813561465581614620565b61ffff8116905081548161ffff198216178355602084013561467681614036565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b038181168382160280821691908281146146c3576146c36140e9565b505092915050565b5f6001600160401b03808416806146e4576146e461418f565b92169190910492915050565b5f808335601e19843603018112614705575f80fd5b8301803591506001600160401b0382111561471e575f80fd5b602001915036819003821315614732575f80fd5b9250929050565b601f8211156114a957805f5260205f20601f840160051c8101602085101561475e5750805b601f840160051c820191505b81811015610d15575f815560010161476a565b81516001600160401b038111156147965761479661437b565b6147aa816147a48454614278565b84614739565b602080601f8311600181146147dd575f84156147c65750858301515b5f19600386901b1c1916600185901b178555614834565b5f85815260208120601f198616915b8281101561480b578886015182559484019460019091019084016147ec565b508582101561482857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561484c575f80fd5b813560ff81168114611bf9575f80fd5b5f6020828403121561486c575f80fd5b8135611bf9816143e7565b5f8251614888818460208701614124565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614aa3380380614aa383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149568061014d5f395ff3fe608060405260043610610110575f3560e01c806366435abf1161009d578063b771b3bc11610062578063b771b3bc14610322578063ba3a4b9714610354578063bee0a03f14610373578063c123c6db14610392578063c599e24f146103b1575f80fd5b806366435abf1461029357806376f78621146102b257806380a8ad94146102d157806398f3e2b4146102e4578063a3a65e4814610303575f80fd5b80632e2194d8116100e35780632e2194d8146101d757806335455ded1461020e578063467ef06f146102365780635297fae6146102555780636206585614610274575f80fd5b80630118acc4146101145780630322ed98146101355780630cdd098514610154578063151d30d1146101b1575b5f80fd5b34801561011f575f80fd5b5061013361012e366004613f6f565b6103c4565b005b348015610140575f80fd5b5061013361014f366004613faa565b61082e565b34801561015f575f80fd5b5061019e61016e366004613faa565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101bc575f80fd5b506101c5600a81565b60405160ff90911681526020016101a8565b3480156101e2575f80fd5b506101f66101f1366004613faa565b6109fe565b6040516001600160401b0390911681526020016101a8565b348015610219575f80fd5b5061022361271081565b60405161ffff90911681526020016101a8565b348015610241575f80fd5b50610133610250366004613fc1565b610a14565b348015610260575f80fd5b5061013361026f366004613fda565b610a3f565b34801561027f575f80fd5b5061019e61028e366004614016565b610c0f565b34801561029e575f80fd5b506101f66102ad366004613faa565b610c28565b3480156102bd575f80fd5b506101336102cc366004613f6f565b610c3c565b61019e6102df366004614031565b610d1c565b3480156102ef575f80fd5b506101336102fe366004613fda565b610d48565b34801561030e575f80fd5b5061013361031d366004613fc1565b610f57565b34801561032d575f80fd5b5061033c6005600160991b0181565b6040516001600160a01b0390911681526020016101a8565b34801561035f575f80fd5b5061013361036e366004613faa565b611114565b34801561037e575f80fd5b5061013361038d366004613faa565b61139a565b34801561039d575f80fd5b506101336103ac36600461408a565b6114ae565b61019e6103bf366004613faa565b611590565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206148aa83398151915291841561041657610413828561159c565b90505b5f868152600684016020526040808220815161010081019092528054829060ff166004811115610448576104486140a1565b6004811115610459576104596140a1565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104e0576104e06140a1565b146105325760405162461bcd60e51b815260206004820152602a60248201525f805160206148ca8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105975760405162461bcd60e51b815260206004820152603360248201525f805160206148ca8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610529565b5f6105a184611838565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105ee576105ee6140a1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106c0856118ba565b905082606001516001600160401b03168160a001516001600160401b0316116107375760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610529565b5f83606001518260a0015161074c91906140c9565b90506107588682611999565b5f6005600160991b0163ee5b48eb6107718987866119e1565b6040518263ffffffff1660e01b815260040161078d9190614112565b6020604051808303815f875af11580156107a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107cd9190614144565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061492a83398151915260205260408082208151610100810190925280545f805160206148ea83398151915293929190829060ff16600581111561087c5761087c6140a1565b600581111561088d5761088d6140a1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610912576109126140a1565b146109775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610529565b6005600160991b016001600160a01b031663ee5b48eb61099c8584608001515f6119e1565b6040518263ffffffff1660e01b81526004016109b89190614112565b6020604051808303815f875af11580156109d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f89190614144565b50505050565b5f610a0e64e8d4a510008361416f565b92915050565b5f610a1e82611c00565b9050610a3b81606001516001600160401b03168260400151611f73565b5050565b5f805160206148aa8339815191525f610a5784611f86565b90505f80610a688360400151612167565b50915091505f610a77836118ba565b9050816001600160401b031681608001516001600160401b03161015610aaf5760405162461bcd60e51b815260040161052990614182565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610af45760405162461bcd60e51b8152600401610529906141c4565b60015f87815260068701602052604090205460ff166004811115610b1a57610b1a6140a1565b14610b835760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610529565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a0e6001600160401b03831664e8d4a5100061420d565b5f610c32826118ba565b60a0015192915050565b5f805160206148aa8339815191525f610c54856118ba565b5f86815260058401602052604090205460c0820151919250610c8691620100009091046001600160401b031690614224565b6001600160401b0316421015610cfa5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610529565b8315610d0c57610d0a858461159c565b505b610d15856123a2565b5050505050565b5f610d25612740565b610d30838334612777565b9050610a0e60015f8051602061490a83398151915255565b5f805160206148aa8339815191525f610d6084611f86565b90505f80610d718360400151612167565b50915091505f610d80836118ba565b9050816001600160401b031681608001516001600160401b03161015610db85760405162461bcd60e51b815260040161052990614182565b5f8681526006860160205260409020600301546001600160401b0380841691161115610df65760405162461bcd60e51b8152600401610529906141c4565b60035f87815260068701602052604090205460ff166004811115610e1c57610e1c6140a1565b14610e705760405162461bcd60e51b815260206004820152603160248201525f805160206148ca8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610529565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f1591611f73565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206148ea8339815191525f610f6f83611f86565b90505f80610f80836040015161294e565b9150915080610fe25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610529565b5f82815260058501602052604081208054610ffc90614244565b905011801561102e575060015f83815260068601602052604090205460ff16600581111561102c5761102c6140a1565b145b61104a5760405162461bcd60e51b815260040161052990614276565b5f828152600585016020526040812061106291613eb7565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206148aa83398151915293929190829060ff166004811115611175576111756140a1565b6004811115611186576111866140a1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561120d5761120d6140a1565b148061122b5750600381516004811115611229576112296140a1565b145b61127f5760405162461bcd60e51b815260206004820152603260248201525f805160206148ca833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610529565b5f61128d82604001516118ba565b905080608001516001600160401b03165f036113115760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610529565b6005600160991b016001600160a01b031663ee5b48eb61133e846040015184608001518560a001516119e1565b6040518263ffffffff1660e01b815260040161135a9190614112565b6020604051808303815f875af1158015611376573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d159190614144565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206148ea8339815191529291906113e290614244565b9050118015611414575060015f83815260068301602052604090205460ff166005811115611412576114126140a1565b145b6114305760405162461bcd60e51b815260040161052990614276565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161146991906004016142bd565b6020604051808303815f875af1158015611485573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a99190614144565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806114f7575080546001600160401b03808416911610155b156115155760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561153f83612aef565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a0e823334612b03565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115e7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261160e91908101906143d2565b91509150806116715760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610529565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d89190614144565b82511461173c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610529565b60208201516001600160a01b0316156117b25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610529565b5f806117c18460400151612ef5565b9150915081871461182e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610529565b9695505050505050565b5f8181525f8051602061492a8339815191526020526040812060030180545f805160206148ea833981519152916001600160401b03909116908361187b836144ba565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6118c2613eee565b5f8281525f8051602061492a8339815191526020526040908190208151610100810190925280545f805160206148ea833981519152929190829060ff166005811115611910576119106140a1565b6005811115611921576119216140a1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061492a833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5a57611a1a8160016144df565b611a2590600861420d565b5081515f90839083908110611a3c57611a3c6144f2565b60200101906001600160f81b03191690815f1a905350600101611a06565b505f5b6004811015611abd57611a718160036144df565b611a7c90600861420d565b6001901c60f81b82611a8f836002614506565b81518110611a9f57611a9f6144f2565b60200101906001600160f81b03191690815f1a905350600101611a5d565b505f5b6020811015611b1f57611ad481601f6144df565b611adf90600861420d565b86901c60f81b82611af1836006614506565b81518110611b0157611b016144f2565b60200101906001600160f81b03191690815f1a905350600101611ac0565b505f5b6008811015611b8a57611b368160076144df565b611b4190600861420d565b6001600160401b038616901c60f81b82611b5c836026614506565b81518110611b6c57611b6c6144f2565b60200101906001600160f81b03191690815f1a905350600101611b22565b505f5b6008811015611bf557611ba18160076144df565b611bac90600861420d565b6001600160401b038516901c60f81b82611bc783602e614506565b81518110611bd757611bd76144f2565b60200101906001600160f81b03191690815f1a905350600101611b8d565b5090505b9392505050565b611c08613eee565b5f805160206148ea8339815191525f611c2084611f86565b90505f80611c31836040015161294e565b915091508015611c965760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610529565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611cc857611cc86140a1565b6005811115611cd957611cd96140a1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d6057611d606140a1565b1480611d7e5750600182516005811115611d7c57611d7c6140a1565b145b611ddd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610529565b600382516005811115611df257611df26140a1565b03611dff57506004611e03565b5060055b6020808301515f90815260078801909152604081205581816005811115611e2c57611e2c6140a1565b90816005811115611e3f57611e3f6140a1565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611e7357611e736140a1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f3e57611f3e6140a1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a3b6001600160a01b038216836130cd565b60408051606080820183525f8083526020830181905292820152905f805160206148ea8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ffb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261202291908101906143d2565b91509150806120895760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610529565b82548251146120ec5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610529565b60208201516001600160a01b03161561215f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610529565b509392505050565b5f805f835160361461218b5760405162461bcd60e51b815260040161052990614519565b5f805b60028110156121da576121a28160016144df565b6121ad90600861420d565b61ffff168682815181106121c3576121c36144f2565b016020015160f81c901b919091179060010161218e565b5061ffff8116156121fd5760405162461bcd60e51b815260040161052990614562565b5f805b6004811015612258576122148160036144df565b61221f90600861420d565b63ffffffff1687612231836002614506565b81518110612241576122416144f2565b016020015160f81c901b9190911790600101612200565b5063ffffffff811660031461227f5760405162461bcd60e51b8152600401610529906145a5565b5f805b60208110156122d45761229681601f6144df565b6122a190600861420d565b886122ad836006614506565b815181106122bd576122bd6144f2565b016020015160f81c901b9190911790600101612282565b505f805b6008811015612333576122ec8160076144df565b6122f790600861420d565b6001600160401b03168961230c836026614506565b8151811061231c5761231c6144f2565b016020015160f81c901b91909117906001016122d8565b505f805b60088110156123925761234b8160076144df565b61235690600861420d565b6001600160401b03168a61236b83602e614506565b8151811061237b5761237b6144f2565b016020015160f81c901b9190911790600101612337565b5091989097509095509350505050565b5f8181525f8051602061492a83398151915260205260408082208151610100810190925280545f805160206148ea83398151915293929190829060ff1660058111156123f0576123f06140a1565b6005811115612401576124016140a1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612489576124896140a1565b146124e55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610529565b60408101516001600160a01b0316336001600160a01b03161461255f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610529565b61256c8160a00151613160565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156125b0576125b06140a1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61267c8461267681611838565b5f6119e1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126ab908590600401614112565b6020604051808303815f875af11580156126c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126eb9190614144565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8051602061490a83398151915280546001190161277157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206148aa833981519152906001600160401b03166127c36040860160208701614016565b6001600160401b031610156128325760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610529565b600381015461284460208601866145fb565b61ffff1610158015612868575061271061286160208601866145fb565b61ffff1611155b6128845760405162461bcd60e51b815260040161052990614616565b80548310801590612899575080600101548311155b6128f75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610529565b825f612902826109fe565b90505f61290f8883613301565b5f8181526005860160205260409020909150879061292d8282614661565b509098975050505050505050565b60015f8051602061490a83398151915255565b5f8082516027146129715760405162461bcd60e51b815260040161052990614519565b5f805b60028110156129c0576129888160016144df565b61299390600861420d565b61ffff168582815181106129a9576129a96144f2565b016020015160f81c901b9190911790600101612974565b5061ffff8116156129e35760405162461bcd60e51b815260040161052990614562565b5f805b6004811015612a3e576129fa8160036144df565b612a0590600861420d565b63ffffffff1686612a17836002614506565b81518110612a2757612a276144f2565b016020015160f81c901b91909117906001016129e6565b5063ffffffff8116600214612a655760405162461bcd60e51b8152600401610529906145a5565b5f805b6020811015612aba57612a7c81601f6144df565b612a8790600861420d565b87612a93836006614506565b81518110612aa357612aa36144f2565b016020015160f81c901b9190911790600101612a68565b505f86602681518110612acf57612acf6144f2565b016020015191976001600160f81b03199092161515965090945050505050565b612af76137cb565b612b0081613816565b50565b5f612b0c612740565b5f805160206148aa8339815191525f612b24846109fe565b90505f612b30876118ba565b9050600281516005811115612b4757612b476140a1565b14612ba65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610529565b5f828260a00151612bb79190614224565b60048501546060840151919250612bd9916001600160401b03909116906146b7565b6001600160401b0316816001600160401b03161115612c585760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610529565b612c628882611999565b5f612c6c89611838565b90505f8982604051602001612c9892919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612cb985613160565b5f6005600160991b0163ee5b48eb612cd28d86886119e1565b6040518263ffffffff1660e01b8152600401612cee9190614112565b6020604051808303815f875af1158015612d0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d2e9190614144565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612db657612db66140a1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611bf960015f8051602061490a83398151915255565b5f808251602e14612f185760405162461bcd60e51b815260040161052990614519565b5f805b6002811015612f6757612f2f8160016144df565b612f3a90600861420d565b61ffff16858281518110612f5057612f506144f2565b016020015160f81c901b9190911790600101612f1b565b5061ffff811615612f8a5760405162461bcd60e51b815260040161052990614562565b5f805b6004811015612fe557612fa18160036144df565b612fac90600861420d565b63ffffffff1686612fbe836002614506565b81518110612fce57612fce6144f2565b016020015160f81c901b9190911790600101612f8d565b5063ffffffff811660041461300c5760405162461bcd60e51b8152600401610529906145a5565b5f805b60208110156130615761302381601f6144df565b61302e90600861420d565b8761303a836006614506565b8151811061304a5761304a6144f2565b016020015160f81c901b919091179060010161300f565b505f805b60088110156130c0576130798160076144df565b61308490600861420d565b6001600160401b031688613099836026614506565b815181106130a9576130a96144f2565b016020015160f81c901b9190911790600101613065565b5090969095509350505050565b804710156130f05760405163cd78605960e01b8152306004820152602401610529565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613139576040519150601f19603f3d011682016040523d82523d5f602084013e61313e565b606091505b50509050806114a957604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206148ea8339815191529060ff165f0361319e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906131e690836144df565b10613202576001600160401b0384166040830152808252613221565b83826040018181516132149190614224565b6001600160401b03169052505b5f82602001518360400151606461323891906146b7565b61324291906146e2565b600285015490915060ff90811690821611156132bd5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610529565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f5f805160206148ea833981519152426133216040860160208701614016565b6001600160401b031611801561335a57506133426040850160208601614016565b6001600160401b0316613358426202a300614506565b115b6133bc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610529565b83356134145760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610529565b83355f908152600782016020526040902054156134845760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610529565b6134916040850185614707565b90506030146134f85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610529565b61350183613160565b5f8061359b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906135469190614016565b6001600160401b0316815260200161356160408a018a614707565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613880565b5f828152600586016020526040902091935091506135b98282614794565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906135e6908590600401614112565b6020604051808303815f875af1158015613602573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136269190614144565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156136a8576136a86140a1565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161379d91908e01908e01614016565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661381457604051631afcd79f60e31b815260040160405180910390fd5b565b61381e6137cb565b61382781613c25565b612b006060820135608083013561384460c0850160a08601614016565b61385460e0860160c087016145fb565b61ffff16613869610100870160e08801614853565b61387b61012088016101008901614873565b613c46565b5f60608260800151516030146138ea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610529565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613961576139218160016144df565b61392c90600861420d565b5081515f90839083908110613943576139436144f2565b60200101906001600160f81b03191690815f1a90535060010161390d565b505f5b60048110156139bf576139788160036144df565b61398390600861420d565b505f82613991836002614506565b815181106139a1576139a16144f2565b60200101906001600160f81b03191690815f1a905350600101613964565b505f5b6020811015613a1c57845181602081106139de576139de6144f2565b1a60f81b826139ee836006614506565b815181106139fe576139fe6144f2565b60200101906001600160f81b03191690815f1a9053506001016139c2565b505f5b6020811015613a7c5784602001518160208110613a3e57613a3e6144f2565b1a60f81b82613a4e836026614506565b81518110613a5e57613a5e6144f2565b60200101906001600160f81b03191690815f1a905350600101613a1f565b505f5b6008811015613af057613a938160076144df565b613a9e90600861420d565b60ff1685604001516001600160401b0316901c60f81b82826046613ac29190614506565b81518110613ad257613ad26144f2565b60200101906001600160f81b03191690815f1a905350600101613a7f565b505f5b6030811015613b5b5784608001518181518110613b1257613b126144f2565b01602001516001600160f81b03191682613b2d83604e614506565b81518110613b3d57613b3d6144f2565b60200101906001600160f81b03191690815f1a905350600101613af3565b505f5b6008811015613bcd57613b728160076144df565b613b7d90600861420d565b60608601516001600160401b0390811691161c60f81b82613b9f83607e614506565b81518110613baf57613baf6144f2565b60200101906001600160f81b03191690815f1a905350600101613b5e565b50600281604051613bde919061488e565b602060405180830381855afa158015613bf9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c1c9190614144565b94909350915050565b613c2d6137cb565b613c35613e2b565b613c3d613e3b565b612b0081613e43565b613c4e6137cb565b5f805160206148aa83398151915283613cba5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610529565b612710841115613cdc5760405162461bcd60e51b815260040161052990614616565b85871115613d445760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610529565b600a60ff841611801590613d5a57505f8360ff16115b613dc45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610529565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b613e336137cb565b613814613eaf565b6138146137cb565b613e4b6137cb565b80355f805160206148ea83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e956060830160408401614853565b600291909101805460ff191660ff90921691909117905550565b61293b6137cb565b508054613ec390614244565b5f825580601f10613ed2575050565b601f0160209004905f5260205f2090810190612b009190613f32565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613f46575f8155600101613f33565b5090565b8015158114612b00575f80fd5b803563ffffffff81168114613f6a575f80fd5b919050565b5f805f60608486031215613f81575f80fd5b833592506020840135613f9381613f4a565b9150613fa160408501613f57565b90509250925092565b5f60208284031215613fba575f80fd5b5035919050565b5f60208284031215613fd1575f80fd5b611bf982613f57565b5f8060408385031215613feb575f80fd5b613ff483613f57565b946020939093013593505050565b6001600160401b0381168114612b00575f80fd5b5f60208284031215614026575f80fd5b8135611bf981614002565b5f808284036060811215614043575f80fd5b83356001600160401b03811115614058575f80fd5b840160608187031215614069575f80fd5b92506040601f198201121561407c575f80fd5b506020830190509250929050565b5f610120828403121561409b575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140e9576140e96140b5565b5092915050565b5f5b8381101561410a5781810151838201526020016140f2565b50505f910152565b602081525f82518060208401526141308160408501602087016140f0565b601f01601f19169190910160400192915050565b5f60208284031215614154575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261417d5761417d61415b565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a0e57610a0e6140b5565b6001600160401b038181168382160190808211156140e9576140e96140b5565b600181811c9082168061425857607f821691505b60208210810361409b57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546142cf81614244565b806020870152604060018084165f81146142f0576001811461430c57614339565b60ff19851660408a0152604084151560051b8a01019550614339565b895f5260205f205f5b858110156143305781548b8201860152908301908801614315565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561437d5761437d614347565b60405290565b604051601f8201601f191681016001600160401b03811182821017156143ab576143ab614347565b604052919050565b6001600160a01b0381168114612b00575f80fd5b8051613f6a81613f4a565b5f80604083850312156143e3575f80fd5b82516001600160401b03808211156143f9575f80fd5b908401906060828703121561440c575f80fd5b61441461435b565b82518152602080840151614427816143b3565b8282015260408401518381111561443c575f80fd5b80850194505087601f850112614450575f80fd5b83518381111561446257614462614347565b614474601f8201601f19168301614383565b93508084528882828701011115614489575f80fd5b614498818386018488016140f0565b508260408301528195506144ad8188016143c7565b9450505050509250929050565b5f6001600160401b038083168181036144d5576144d56140b5565b6001019392505050565b81810381811115610a0e57610a0e6140b5565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a0e57610a0e6140b5565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114612b00575f80fd5b5f6020828403121561460b575f80fd5b8135611bf9816145ec565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561466c816145ec565b61ffff8116905081548161ffff198216178355602084013561468d81614002565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b038181168382160280821691908281146146da576146da6140b5565b505092915050565b5f6001600160401b03808416806146fb576146fb61415b565b92169190910492915050565b5f808335601e1984360301811261471c575f80fd5b8301803591506001600160401b03821115614735575f80fd5b602001915036819003821315614749575f80fd5b9250929050565b601f8211156114a957805f5260205f20601f840160051c810160208510156147755750805b601f840160051c820191505b81811015610d15575f8155600101614781565b81516001600160401b038111156147ad576147ad614347565b6147c1816147bb8454614244565b84614750565b602080601f8311600181146147f4575f84156147dd5750858301515b5f19600386901b1c1916600185901b17855561484b565b5f85815260208120601f198616915b8281101561482257888601518255948401946001909101908401614803565b508582101561483f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614863575f80fd5b813560ff81168114611bf9575f80fd5b5f60208284031215614883575f80fd5b8135611bf9816143b3565b5f825161489f8184602087016140f0565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index adf7c0b98..1ba9f83a3 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -46,7 +46,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c7b380380612c7b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612b2e8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e4578063467ef06f1461013557806366435abf14610148578063715018a6146101735780638994ab491461017b575b5f80fd5b6100e26100dd366004612427565b61023f565b005b6101226100f2366004612427565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6100e261014336600461243e565b610414565b61015b610156366004612427565b610421565b6040516001600160401b03909116815260200161012c565b6100e2610435565b610122610189366004612499565b610448565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e0366004612427565b610464565b6100e26101f336600461243e565b610470565b6101ba6005600160991b0181565b6100e2610214366004612427565b61062d565b6100e26102273660046124f7565b610741565b6100e261023a36600461252d565b61084f565b5f8181525f80516020612b0283398151915260205260408082208151610100810190925280545f80516020612ae283398151915293929190829060ff16600581111561028d5761028d612548565b600581111561029e5761029e612548565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561032357610323612548565b1461038d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103b28584608001515f610889565b6040518263ffffffff1660e01b81526004016103ce919061257e565b6020604051808303815f875af11580156103ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040e91906125b0565b50505050565b61041d81610aa6565b5050565b5f61042b82610e19565b60a0015192915050565b61043d610ef8565b6104465f610f53565b565b5f610451610ef8565b61045b8383610fc3565b90505b92915050565b61046d8161149f565b50565b5f80516020612ae28339815191525f6104888361183d565b90505f806104998360400151611a1e565b91509150806104fb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610384565b5f82815260058501602052604081208054610515906125c7565b9050118015610547575060015f83815260068601602052604090205460ff16600581111561054557610545612548565b145b6105635760405162461bcd60e51b8152600401610384906125f9565b5f828152600585016020526040812061057b91612394565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612ae2833981519152929190610675906125c7565b90501180156106a7575060015f83815260068301602052604090205460ff1660058111156106a5576106a5612548565b145b6106c35760405162461bcd60e51b8152600401610384906125f9565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916106fc9190600401612640565b6020604051808303815f875af1158015610718573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073c91906125b0565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107855750825b90505f826001600160401b031660011480156107a05750303b155b9050811580156107ae575080155b156107cc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156107f657845460ff60401b1916600160401b1785555b6108008787611c7d565b831561084657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610857610ef8565b6001600160a01b03811661088057604051631e4fbdf760e01b81525f6004820152602401610384565b61046d81610f53565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610902576108c28160016126f2565b6108cd906008612705565b5081515f908390839081106108e4576108e461271c565b60200101906001600160f81b03191690815f1a9053506001016108ae565b505f5b6004811015610965576109198160036126f2565b610924906008612705565b6001901c60f81b82610937836002612730565b815181106109475761094761271c565b60200101906001600160f81b03191690815f1a905350600101610905565b505f5b60208110156109c75761097c81601f6126f2565b610987906008612705565b86901c60f81b82610999836006612730565b815181106109a9576109a961271c565b60200101906001600160f81b03191690815f1a905350600101610968565b505f5b6008811015610a32576109de8160076126f2565b6109e9906008612705565b6001600160401b038616901c60f81b82610a04836026612730565b81518110610a1457610a1461271c565b60200101906001600160f81b03191690815f1a9053506001016109ca565b505f5b6008811015610a9d57610a498160076126f2565b610a54906008612705565b6001600160401b038516901c60f81b82610a6f83602e612730565b81518110610a7f57610a7f61271c565b60200101906001600160f81b03191690815f1a905350600101610a35565b50949350505050565b610aae6123cb565b5f80516020612ae28339815191525f610ac68461183d565b90505f80610ad78360400151611a1e565b915091508015610b3c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610384565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610b6e57610b6e612548565b6005811115610b7f57610b7f612548565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c0657610c06612548565b1480610c245750600182516005811115610c2257610c22612548565b145b610c835760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610384565b600382516005811115610c9857610c98612548565b03610ca557506004610ca9565b5060055b6020808301515f90815260078801909152604081205581816005811115610cd257610cd2612548565b90816005811115610ce557610ce5612548565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610d1957610d19612548565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610de457610de4612548565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610e216123cb565b5f8281525f80516020612b028339815191526020526040908190208151610100810190925280545f80516020612ae2833981519152929190829060ff166005811115610e6f57610e6f612548565b6005811115610e8057610e80612548565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b33610f2a7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104465760405163118cdaa760e01b8152336004820152602401610384565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612ae283398151915242610fe36040860160208701612743565b6001600160401b031611801561101c57506110046040850160208601612743565b6001600160401b031661101a426202a300612730565b115b61107e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610384565b83356110d65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610384565b83355f908152600782016020526040902054156111465760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610384565b611153604085018561275c565b90506030146111ba5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610384565b6111c383611c97565b5f8061125d6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906112089190612743565b6001600160401b0316815260200161122360408a018a61275c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611e38565b5f8281526005860160205260409020919350915061127b82826127f0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112a890859060040161257e565b6020604051808303815f875af11580156112c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e891906125b0565b604080516101008101825260018152893560208201529192508101336001600160a01b03168152602001876001600160401b0316815260200161132a856121dd565b6001600160401b03908116825288166020808301919091525f60408084018290526060909301819052868152600688019091522081518154829060ff1916600183600581111561137c5761137c612548565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161147191908e01908e01612743565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612b0283398151915260205260408082208151610100810190925280545f80516020612ae283398151915293929190829060ff1660058111156114ed576114ed612548565b60058111156114fe576114fe612548565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561158657611586612548565b146115e25760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610384565b60408101516001600160a01b0316336001600160a01b03161461165c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610384565b6116698160a00151611c97565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156116ad576116ad612548565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61177984611773816121dd565b5f610889565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906117a890859060040161257e565b6020604051808303815f875af11580156117c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117e891906125b0565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612ae28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118b2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118d99190810190612916565b91509150806119405760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610384565b82548251146119a35760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610384565b60208201516001600160a01b031615611a165760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610384565b509392505050565b5f808251602714611a835760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610384565b5f805b6002811015611ad257611a9a8160016126f2565b611aa5906008612705565b61ffff16858281518110611abb57611abb61271c565b016020015160f81c901b9190911790600101611a86565b5061ffff811615611b315760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610384565b5f805b6004811015611b8c57611b488160036126f2565b611b53906008612705565b63ffffffff1686611b65836002612730565b81518110611b7557611b7561271c565b016020015160f81c901b9190911790600101611b34565b5063ffffffff8116600214611bf35760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610384565b5f805b6020811015611c4857611c0a81601f6126f2565b611c15906008612705565b87611c21836006612730565b81518110611c3157611c3161271c565b016020015160f81c901b9190911790600101611bf6565b505f86602681518110611c5d57611c5d61271c565b016020015191976001600160f81b03199092161515965090945050505050565b611c8561225f565b611c8e826122a8565b61041d816122c9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612ae28339815191529060ff165f03611cd5575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611d1d90836126f2565b10611d39576001600160401b0384166040830152808252611d58565b8382604001818151611d4b91906129fe565b6001600160401b03169052505b5f826020015183604001516064611d6f9190612a25565b611d799190612a50565b600285015490915060ff9081169082161115611df45760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610384565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611ea25760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610384565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611f1957611ed98160016126f2565b611ee4906008612705565b5081515f90839083908110611efb57611efb61271c565b60200101906001600160f81b03191690815f1a905350600101611ec5565b505f5b6004811015611f7757611f308160036126f2565b611f3b906008612705565b505f82611f49836002612730565b81518110611f5957611f5961271c565b60200101906001600160f81b03191690815f1a905350600101611f1c565b505f5b6020811015611fd45784518160208110611f9657611f9661271c565b1a60f81b82611fa6836006612730565b81518110611fb657611fb661271c565b60200101906001600160f81b03191690815f1a905350600101611f7a565b505f5b60208110156120345784602001518160208110611ff657611ff661271c565b1a60f81b82612006836026612730565b815181106120165761201661271c565b60200101906001600160f81b03191690815f1a905350600101611fd7565b505f5b60088110156120a85761204b8160076126f2565b612056906008612705565b60ff1685604001516001600160401b0316901c60f81b8282604661207a9190612730565b8151811061208a5761208a61271c565b60200101906001600160f81b03191690815f1a905350600101612037565b505f5b603081101561211357846080015181815181106120ca576120ca61271c565b01602001516001600160f81b031916826120e583604e612730565b815181106120f5576120f561271c565b60200101906001600160f81b03191690815f1a9053506001016120ab565b505f5b60088110156121855761212a8160076126f2565b612135906008612705565b60608601516001600160401b0390811691161c60f81b8261215783607e612730565b815181106121675761216761271c565b60200101906001600160f81b03191690815f1a905350600101612116565b506002816040516121969190612a81565b602060405180830381855afa1580156121b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906121d491906125b0565b94909350915050565b5f8181525f80516020612b028339815191526020526040812060030180545f80516020612ae2833981519152916001600160401b03909116908361222083612a9c565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661044657604051631afcd79f60e31b815260040160405180910390fd5b6122b061225f565b6122b86122da565b6122c06122ea565b61046d816122f2565b6122d161225f565b61046d8161235e565b6122e261225f565b610446612366565b61044661225f565b6122fa61225f565b80355f80516020612ae283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123446060830160408401612ac1565b600291909101805460ff191660ff90921691909117905550565b61085761225f565b61236e61225f565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5080546123a0906125c7565b5f825580601f106123af575050565b601f0160209004905f5260205f209081019061046d919061240f565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612423575f8155600101612410565b5090565b5f60208284031215612437575f80fd5b5035919050565b5f6020828403121561244e575f80fd5b813563ffffffff81168114612461575f80fd5b9392505050565b5f60608284031215612478575f80fd5b50919050565b80356001600160401b0381168114612494575f80fd5b919050565b5f80604083850312156124aa575f80fd5b82356001600160401b038111156124bf575f80fd5b6124cb85828601612468565b9250506124da6020840161247e565b90509250929050565b6001600160a01b038116811461046d575f80fd5b5f8060808385031215612508575f80fd5b6125128484612468565b91506060830135612522816124e3565b809150509250929050565b5f6020828403121561253d575f80fd5b8135612461816124e3565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561257657818101518382015260200161255e565b50505f910152565b602081525f825180602084015261259c81604085016020870161255c565b601f01601f19169190910160400192915050565b5f602082840312156125c0575f80fd5b5051919050565b600181811c908216806125db57607f821691505b60208210810361247857634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612652816125c7565b806020870152604060018084165f8114612673576001811461268f576126bc565b60ff19851660408a0152604084151560051b8a010195506126bc565b895f5260205f205f5b858110156126b35781548b8201860152908301908801612698565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561045e5761045e6126de565b808202811582820484141761045e5761045e6126de565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561045e5761045e6126de565b5f60208284031215612753575f80fd5b61045b8261247e565b5f808335601e19843603018112612771575f80fd5b8301803591506001600160401b0382111561278a575f80fd5b60200191503681900382131561279e575f80fd5b9250929050565b601f82111561073c57805f5260205f20601f840160051c810160208510156127ca5750805b601f840160051c820191505b818110156127e9575f81556001016127d6565b5050505050565b81516001600160401b03811115612809576128096126ca565b61281d8161281784546125c7565b846127a5565b602080601f831160018114612850575f84156128395750858301515b5f19600386901b1c1916600185901b1785556128a7565b5f85815260208120601f198616915b8281101561287e5788860151825594840194600190910190840161285f565b508582101561289b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b03811182821017156128d1576128d16126ca565b60405290565b604051601f8201601f191681016001600160401b03811182821017156128ff576128ff6126ca565b604052919050565b80518015158114612494575f80fd5b5f8060408385031215612927575f80fd5b82516001600160401b038082111561293d575f80fd5b9084019060608287031215612950575f80fd5b6129586128af565b8251815260208084015161296b816124e3565b82820152604084015183811115612980575f80fd5b80850194505087601f850112612994575f80fd5b8351838111156129a6576129a66126ca565b6129b8601f8201601f191683016128d7565b935080845288828287010111156129cd575f80fd5b6129dc8183860184880161255c565b508260408301528195506129f1818801612907565b9450505050509250929050565b6001600160401b03818116838216019080821115612a1e57612a1e6126de565b5092915050565b6001600160401b03818116838216028082169190828114612a4857612a486126de565b505092915050565b5f6001600160401b0380841680612a7557634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a9281846020870161255c565b9190910192915050565b5f6001600160401b03808316818103612ab757612ab76126de565b6001019392505050565b5f60208284031215612ad1575f80fd5b813560ff81168114612461575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612c69380380612c6983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612b1c8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e4578063467ef06f1461013557806366435abf14610148578063715018a6146101735780638994ab491461017b575b5f80fd5b6100e26100dd366004612415565b61023f565b005b6101226100f2366004612415565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6100e261014336600461242c565b610414565b61015b610156366004612415565b610421565b6040516001600160401b03909116815260200161012c565b6100e2610435565b610122610189366004612487565b610448565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e0366004612415565b610464565b6100e26101f336600461242c565b610470565b6101ba6005600160991b0181565b6100e2610214366004612415565b61062d565b6100e26102273660046124e5565b610741565b6100e261023a36600461251b565b61084f565b5f8181525f80516020612af083398151915260205260408082208151610100810190925280545f80516020612ad083398151915293929190829060ff16600581111561028d5761028d612536565b600581111561029e5761029e612536565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561032357610323612536565b1461038d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103b28584608001515f610889565b6040518263ffffffff1660e01b81526004016103ce919061256c565b6020604051808303815f875af11580156103ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040e919061259e565b50505050565b61041d81610aa6565b5050565b5f61042b82610e19565b60a0015192915050565b61043d610ef8565b6104465f610f53565b565b5f610451610ef8565b61045b8383610fc3565b90505b92915050565b61046d8161148d565b50565b5f80516020612ad08339815191525f6104888361182b565b90505f806104998360400151611a0c565b91509150806104fb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610384565b5f82815260058501602052604081208054610515906125b5565b9050118015610547575060015f83815260068601602052604090205460ff16600581111561054557610545612536565b145b6105635760405162461bcd60e51b8152600401610384906125e7565b5f828152600585016020526040812061057b91612382565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612ad0833981519152929190610675906125b5565b90501180156106a7575060015f83815260068301602052604090205460ff1660058111156106a5576106a5612536565b145b6106c35760405162461bcd60e51b8152600401610384906125e7565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916106fc919060040161262e565b6020604051808303815f875af1158015610718573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073c919061259e565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107855750825b90505f826001600160401b031660011480156107a05750303b155b9050811580156107ae575080155b156107cc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156107f657845460ff60401b1916600160401b1785555b6108008787611c6b565b831561084657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610857610ef8565b6001600160a01b03811661088057604051631e4fbdf760e01b81525f6004820152602401610384565b61046d81610f53565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610902576108c28160016126e0565b6108cd9060086126f3565b5081515f908390839081106108e4576108e461270a565b60200101906001600160f81b03191690815f1a9053506001016108ae565b505f5b6004811015610965576109198160036126e0565b6109249060086126f3565b6001901c60f81b8261093783600261271e565b815181106109475761094761270a565b60200101906001600160f81b03191690815f1a905350600101610905565b505f5b60208110156109c75761097c81601f6126e0565b6109879060086126f3565b86901c60f81b8261099983600661271e565b815181106109a9576109a961270a565b60200101906001600160f81b03191690815f1a905350600101610968565b505f5b6008811015610a32576109de8160076126e0565b6109e99060086126f3565b6001600160401b038616901c60f81b82610a0483602661271e565b81518110610a1457610a1461270a565b60200101906001600160f81b03191690815f1a9053506001016109ca565b505f5b6008811015610a9d57610a498160076126e0565b610a549060086126f3565b6001600160401b038516901c60f81b82610a6f83602e61271e565b81518110610a7f57610a7f61270a565b60200101906001600160f81b03191690815f1a905350600101610a35565b50949350505050565b610aae6123b9565b5f80516020612ad08339815191525f610ac68461182b565b90505f80610ad78360400151611a0c565b915091508015610b3c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610384565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610b6e57610b6e612536565b6005811115610b7f57610b7f612536565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c0657610c06612536565b1480610c245750600182516005811115610c2257610c22612536565b145b610c835760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610384565b600382516005811115610c9857610c98612536565b03610ca557506004610ca9565b5060055b6020808301515f90815260078801909152604081205581816005811115610cd257610cd2612536565b90816005811115610ce557610ce5612536565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610d1957610d19612536565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610de457610de4612536565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610e216123b9565b5f8281525f80516020612af08339815191526020526040908190208151610100810190925280545f80516020612ad0833981519152929190829060ff166005811115610e6f57610e6f612536565b6005811115610e8057610e80612536565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b33610f2a7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104465760405163118cdaa760e01b8152336004820152602401610384565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612ad083398151915242610fe36040860160208701612731565b6001600160401b031611801561101c57506110046040850160208601612731565b6001600160401b031661101a426202a30061271e565b115b61107e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610384565b83356110d65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610384565b83355f908152600782016020526040902054156111465760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610384565b611153604085018561274a565b90506030146111ba5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610384565b6111c383611c85565b5f8061125d6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906112089190612731565b6001600160401b0316815260200161122360408a018a61274a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611e26565b5f8281526005860160205260409020919350915061127b82826127de565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112a890859060040161256c565b6020604051808303815f875af11580156112c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e8919061259e565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff1916600183600581111561136a5761136a612536565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161145f91908e01908e01612731565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612af083398151915260205260408082208151610100810190925280545f80516020612ad083398151915293929190829060ff1660058111156114db576114db612536565b60058111156114ec576114ec612536565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561157457611574612536565b146115d05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610384565b60408101516001600160a01b0316336001600160a01b03161461164a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610384565b6116578160a00151611c85565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561169b5761169b612536565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61176784611761816121cb565b5f610889565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061179690859060040161256c565b6020604051808303815f875af11580156117b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d6919061259e565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612ad08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118a0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118c79190810190612904565b915091508061192e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610384565b82548251146119915760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610384565b60208201516001600160a01b031615611a045760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610384565b509392505050565b5f808251602714611a715760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610384565b5f805b6002811015611ac057611a888160016126e0565b611a939060086126f3565b61ffff16858281518110611aa957611aa961270a565b016020015160f81c901b9190911790600101611a74565b5061ffff811615611b1f5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610384565b5f805b6004811015611b7a57611b368160036126e0565b611b419060086126f3565b63ffffffff1686611b5383600261271e565b81518110611b6357611b6361270a565b016020015160f81c901b9190911790600101611b22565b5063ffffffff8116600214611be15760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610384565b5f805b6020811015611c3657611bf881601f6126e0565b611c039060086126f3565b87611c0f83600661271e565b81518110611c1f57611c1f61270a565b016020015160f81c901b9190911790600101611be4565b505f86602681518110611c4b57611c4b61270a565b016020015191976001600160f81b03199092161515965090945050505050565b611c7361224d565b611c7c82612296565b61041d816122b7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612ad08339815191529060ff165f03611cc3575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611d0b90836126e0565b10611d27576001600160401b0384166040830152808252611d46565b8382604001818151611d3991906129ec565b6001600160401b03169052505b5f826020015183604001516064611d5d9190612a13565b611d679190612a3e565b600285015490915060ff9081169082161115611de25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610384565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611e905760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610384565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611f0757611ec78160016126e0565b611ed29060086126f3565b5081515f90839083908110611ee957611ee961270a565b60200101906001600160f81b03191690815f1a905350600101611eb3565b505f5b6004811015611f6557611f1e8160036126e0565b611f299060086126f3565b505f82611f3783600261271e565b81518110611f4757611f4761270a565b60200101906001600160f81b03191690815f1a905350600101611f0a565b505f5b6020811015611fc25784518160208110611f8457611f8461270a565b1a60f81b82611f9483600661271e565b81518110611fa457611fa461270a565b60200101906001600160f81b03191690815f1a905350600101611f68565b505f5b60208110156120225784602001518160208110611fe457611fe461270a565b1a60f81b82611ff483602661271e565b815181106120045761200461270a565b60200101906001600160f81b03191690815f1a905350600101611fc5565b505f5b6008811015612096576120398160076126e0565b6120449060086126f3565b60ff1685604001516001600160401b0316901c60f81b82826046612068919061271e565b815181106120785761207861270a565b60200101906001600160f81b03191690815f1a905350600101612025565b505f5b603081101561210157846080015181815181106120b8576120b861270a565b01602001516001600160f81b031916826120d383604e61271e565b815181106120e3576120e361270a565b60200101906001600160f81b03191690815f1a905350600101612099565b505f5b6008811015612173576121188160076126e0565b6121239060086126f3565b60608601516001600160401b0390811691161c60f81b8261214583607e61271e565b815181106121555761215561270a565b60200101906001600160f81b03191690815f1a905350600101612104565b506002816040516121849190612a6f565b602060405180830381855afa15801561219f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906121c2919061259e565b94909350915050565b5f8181525f80516020612af08339815191526020526040812060030180545f80516020612ad0833981519152916001600160401b03909116908361220e83612a8a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661044657604051631afcd79f60e31b815260040160405180910390fd5b61229e61224d565b6122a66122c8565b6122ae6122d8565b61046d816122e0565b6122bf61224d565b61046d8161234c565b6122d061224d565b610446612354565b61044661224d565b6122e861224d565b80355f80516020612ad083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123326060830160408401612aaf565b600291909101805460ff191660ff90921691909117905550565b61085761224d565b61235c61224d565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50805461238e906125b5565b5f825580601f1061239d575050565b601f0160209004905f5260205f209081019061046d91906123fd565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612411575f81556001016123fe565b5090565b5f60208284031215612425575f80fd5b5035919050565b5f6020828403121561243c575f80fd5b813563ffffffff8116811461244f575f80fd5b9392505050565b5f60608284031215612466575f80fd5b50919050565b80356001600160401b0381168114612482575f80fd5b919050565b5f8060408385031215612498575f80fd5b82356001600160401b038111156124ad575f80fd5b6124b985828601612456565b9250506124c86020840161246c565b90509250929050565b6001600160a01b038116811461046d575f80fd5b5f80608083850312156124f6575f80fd5b6125008484612456565b91506060830135612510816124d1565b809150509250929050565b5f6020828403121561252b575f80fd5b813561244f816124d1565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561256457818101518382015260200161254c565b50505f910152565b602081525f825180602084015261258a81604085016020870161254a565b601f01601f19169190910160400192915050565b5f602082840312156125ae575f80fd5b5051919050565b600181811c908216806125c957607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612640816125b5565b806020870152604060018084165f8114612661576001811461267d576126aa565b60ff19851660408a0152604084151560051b8a010195506126aa565b895f5260205f205f5b858110156126a15781548b8201860152908301908801612686565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561045e5761045e6126cc565b808202811582820484141761045e5761045e6126cc565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561045e5761045e6126cc565b5f60208284031215612741575f80fd5b61045b8261246c565b5f808335601e1984360301811261275f575f80fd5b8301803591506001600160401b03821115612778575f80fd5b60200191503681900382131561278c575f80fd5b9250929050565b601f82111561073c57805f5260205f20601f840160051c810160208510156127b85750805b601f840160051c820191505b818110156127d7575f81556001016127c4565b5050505050565b81516001600160401b038111156127f7576127f76126b8565b61280b8161280584546125b5565b84612793565b602080601f83116001811461283e575f84156128275750858301515b5f19600386901b1c1916600185901b178555612895565b5f85815260208120601f198616915b8281101561286c5788860151825594840194600190910190840161284d565b508582101561288957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b03811182821017156128bf576128bf6126b8565b60405290565b604051601f8201601f191681016001600160401b03811182821017156128ed576128ed6126b8565b604052919050565b80518015158114612482575f80fd5b5f8060408385031215612915575f80fd5b82516001600160401b038082111561292b575f80fd5b908401906060828703121561293e575f80fd5b61294661289d565b82518152602080840151612959816124d1565b8282015260408401518381111561296e575f80fd5b80850194505087601f850112612982575f80fd5b835183811115612994576129946126b8565b6129a6601f8201601f191683016128c5565b935080845288828287010111156129bb575f80fd5b6129ca8183860184880161254a565b508260408301528195506129df8188016128f5565b9450505050509250929050565b6001600160401b03818116838216019080821115612a0c57612a0c6126cc565b5092915050565b6001600160401b03818116838216028082169190828114612a3657612a366126cc565b505092915050565b5f6001600160401b0380841680612a6357634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a8081846020870161254a565b9190910192915050565b5f6001600160401b03808316818103612aa557612aa56126cc565b6001019392505050565b5f60208284031215612abf575f80fd5b813560ff8116811461244f575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. From 9fa3ec29706cb56e9f3f8a964a6f89408c912fb4 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 12 Sep 2024 16:13:31 -0400 Subject: [PATCH 263/545] fix merge --- contracts/staking/ERC20TokenStakingManager.sol | 6 +++--- contracts/staking/NativeTokenStakingManager.sol | 6 +++--- contracts/staking/PoSValidatorManager.sol | 11 ++++++++--- contracts/staking/ValidatorManager.sol | 16 +++++++++------- .../interfaces/IERC20TokenStakingManager.sol | 6 +++--- .../interfaces/INativeTokenStakingManager.sol | 6 +++--- .../staking/interfaces/IValidatorManager.sol | 2 +- 7 files changed, 30 insertions(+), 23 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index 74e3b2268..e0f37c17e 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -93,12 +93,12 @@ contract ERC20TokenStakingManager is */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, - uint256 delegationFee, - uint256 minStakeDuration, + uint16 delegationFeeBips, + uint64 minStakeDuration, uint256 stakeAmount ) external nonReentrant returns (bytes32 validationID) { return _initializeValidatorRegistration( - registrationInput, delegationFee, minStakeDuration, stakeAmount + registrationInput, delegationFeeBips, minStakeDuration, stakeAmount ); } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 9a4d31173..5449ccd7e 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -57,11 +57,11 @@ contract NativeTokenStakingManager is */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, - uint256 delegationFee, - uint256 minStakeDuration + uint16 delegationFeeBips, + uint64 minStakeDuration ) external payable nonReentrant returns (bytes32) { return _initializeValidatorRegistration( - registrationInput, delegationFee, minStakeDuration, msg.value + registrationInput, delegationFeeBips, minStakeDuration, msg.value ); } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 1cadb3d65..89096852f 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -26,7 +26,11 @@ import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/utils/ReentrancyGuardUpgradeable.sol"; -abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager, ReentrancyGuardUpgradeable { +abstract contract PoSValidatorManager is + IPoSValidatorManager, + ValidatorManager, + ReentrancyGuardUpgradeable +{ // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.PoSValidatorManager struct PoSValidatorManagerStorage { @@ -180,11 +184,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager, function _initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, uint16 delegationFeeBips, - uint256 minStakeDuration, + uint64 minStakeDuration, uint256 stakeAmount ) internal virtual returns (bytes32) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Validate and save the validator requirements + require( delegationFeeBips >= $._minimumDelegationFeeBips && delegationFeeBips <= MAXIMUM_DELEGATION_FEE_BIPS, "PoSValidatorManager: invalid delegation fee" @@ -205,7 +210,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager, $._validatorRequirements[validationID] = PoSValidatorRequirements({ owner: _msgSender(), - delegationFee: delegationFee, + delegationFeeBips: delegationFeeBips, minStakeDuration: minStakeDuration }); return validationID; diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 85c08deba..95ba3bf88 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -129,7 +129,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida encodedConversion, initialValidator.nodeID, initialValidator.weight, - initialValidator.blsPublickey + initialValidator.blsPublicKey ); } require( @@ -160,16 +160,18 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; bytes32 validationID = sha256(abi.encodePacked(subnetConversionData.convertSubnetTxID, i)); - require(input.nodeID != bytes32(0), "ValidatorManager: invalid node ID"); + bytes32 nodeID = initialValidator.nodeID; + require(nodeID != bytes32(0), "ValidatorManager: invalid node ID"); require( - $._activeValidators[input.nodeID] == bytes32(0), + $._activeValidators[nodeID] == bytes32(0), "ValidatorManager: node ID already active" ); require( - input.blsPublicKey.length == 48, "ValidatorManager: invalid blsPublicKey length" + initialValidator.blsPublicKey.length == 48, + "ValidatorManager: invalid blsPublicKey length" ); - $._activeValidators[input.nodeID] = validationID; + $._activeValidators[nodeID] = validationID; $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.PendingAdded, nodeID: initialValidator.nodeID, @@ -179,8 +181,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida startedAt: 0, // The validation period only starts once the registration is acknowledged. endedAt: 0 }); - // Increment the nonce for the next usage. - _getAndIncrementNonce(validationID); + // Increment the nonce since these validations are completed. + _incrementAndGetNonce(validationID); emit InitialValidatorCreated( validationID, initialValidator.nodeID, initialValidator.weight ); diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index 43cd317f4..680d81ce4 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -12,13 +12,13 @@ interface IERC20TokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the {stakeAmount} of the managers specified ERC20 token. * @param registrationInput The inputs for a validator registration. - * @param delegationFee The fee that delegators must pay to delegate to this validator. + * @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. */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, - uint256 delegationFee, - uint256 minStakeDuration, + uint16 delegationFeeBips, + uint64 minStakeDuration, uint256 stakeAmount ) external returns (bytes32 validationID); diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index 967451eb3..4729acf0b 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -12,13 +12,13 @@ interface INativeTokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the provided native asset in the contract as the stake. * @param registrationInput The inputs for a validator registration. - * @param delegationFee The fee that delegators must pay to delegate to this validator. + * @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. */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, - uint256 delegationFee, - uint256 minStakeDuration + uint16 delegationFeeBips, + uint64 minStakeDuration ) external payable returns (bytes32 validationID); function initializeDelegatorRegistration(bytes32 validationID) diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index bf8d9508b..964a261e2 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -50,7 +50,7 @@ struct SubnetConversionData { struct InitialValidator { bytes32 nodeID; uint64 weight; - bytes blsPublickey; + bytes blsPublicKey; } struct ValidatorRegistrationInput { From 06e650eb3d730dd598a53dd75c1a494188f5e55f Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 13 Sep 2024 10:28:17 -0400 Subject: [PATCH 264/545] pr fixes --- contracts/staking/PoSValidatorManager.sol | 4 ++-- .../tests/ERC20TokenStakingManagerTests.t.sol | 21 +++++++++++++++++++ .../NativeTokenStakingManagerTests.t.sol | 20 ++++++++++++++++++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 30b199b39..e9bd736de 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -60,7 +60,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint8 public constant MAXIMUM_STAKE_MULTIPLIER_LIMIT = 10; - // TODO: revisit maximum, currently set to 100% uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; // solhint-disable ordering @@ -110,8 +109,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager minimumStakeAmount <= maximumStakeAmount, "PoSValidatorManager: invalid stake amount range" ); + require(maximumStakeMultiplier > 0, "PoSValidatorManager: zero maximum stake multiplier"); require( - maximumStakeMultiplier <= MAXIMUM_STAKE_MULTIPLIER_LIMIT && maximumStakeMultiplier > 0, + maximumStakeMultiplier <= MAXIMUM_STAKE_MULTIPLIER_LIMIT, "PoSValidatorManager: invalid maximum stake multiplier" ); diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index d1404df9f..301a73d96 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -117,6 +117,27 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ); } + function testZeroMaxStakeMultiplier() public { + app = new ERC20TokenStakingManager(ICMInitializable.Allowed); + vm.expectRevert(_formatErrorMessage("zero maximum stake multiplier")); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + maximumStakeMultiplier: 0, + rewardCalculator: IRewardCalculator(address(0)) + }), + token + ); + } + function testMaxStakeMultiplierOverLimit() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 4fb4a0294..8b3e2b528 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -106,6 +106,26 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ); } + function testZeroMaxStakeMultiplier() public { + app = new NativeTokenStakingManager(ICMInitializable.Allowed); + vm.expectRevert(_formatErrorMessage("zero maximum stake multiplier")); + app.initialize( + PoSValidatorManagerSettings({ + baseSettings: ValidatorManagerSettings({ + pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, + subnetID: DEFAULT_SUBNET_ID, + maximumHourlyChurn: DEFAULT_MAXIMUM_HOURLY_CHURN + }), + minimumStakeAmount: DEFAULT_MINIMUM_STAKE, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, + minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + maximumStakeMultiplier: 0, + rewardCalculator: IRewardCalculator(address(0)) + }) + ); + } + function testMaxStakeMultiplierOverLimit() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; From b906016f5916f6445566d0ef96efe119ce7b84e5 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 13 Sep 2024 10:58:26 -0400 Subject: [PATCH 265/545] e2e tests fixing --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- tests/flows/staking/erc20_delegation.go | 2 +- tests/flows/staking/erc20_token_staking.go | 3 +- tests/flows/staking/native_delegation.go | 2 +- tests/flows/staking/native_token_staking.go | 3 +- tests/flows/staking/poa_to_pos.go | 12 ++--- tests/utils/staking.go | 46 ++++++++++++------- 8 files changed, 42 insertions(+), 30 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index b239e92d6..fca30a149 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -63,7 +63,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614e67380380614e6783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d1a8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c806366435abf116100a9578063a13fd29d1161006e578063a13fd29d14610292578063a3a65e48146102a5578063b771b3bc146102b8578063ba3a4b97146102de578063bee0a03f146102f1575f80fd5b806366435abf146102335780636f5f1c941461024657806376f786211461025957806398f3e2b41461026c5780639e1bc4ef1461027f575f80fd5b80632e2194d8116100ef5780632e2194d8146101b357806335455ded146101de578063467ef06f146101fa5780635297fae61461020d5780636206585614610220575f80fd5b80630118acc4146101205780630322ed98146101355780630cdd098514610148578063151d30d114610199575b5f80fd5b61013361012e3660046142c3565b610304565b005b6101336101433660046142fe565b61076e565b6101866101563660046142fe565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101a1600a81565b60405160ff9091168152602001610190565b6101c66101c13660046142fe565b61093e565b6040516001600160401b039091168152602001610190565b6101e761271081565b60405161ffff9091168152602001610190565b610133610208366004614315565b610954565b61013361021b36600461432e565b61097f565b61018661022e36600461436a565b610b4f565b6101c66102413660046142fe565b610b68565b610133610254366004614399565b610b7c565b6101336102673660046142c3565b610c60565b61013361027a36600461432e565b610d40565b61018661028d3660046143d7565b610f4f565b6101866102a03660046143f7565b610f62565b6101336102b3366004614315565b610f8e565b6102c66005600160991b0181565b6040516001600160a01b039091168152602001610190565b6101336102ec3660046142fe565b61114b565b6101336102ff3660046142fe565b6113d1565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614c6e8339815191529184156103565761035382856114e5565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561038857610388614458565b600481111561039957610399614458565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561042057610420614458565b146104725760405162461bcd60e51b815260206004820152602a60248201525f80516020614c8e8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104d75760405162461bcd60e51b815260206004820152603360248201525f80516020614c8e8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610469565b5f6104e184611781565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561052e5761052e614458565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61060085611803565b905082606001516001600160401b03168160a001516001600160401b0316116106775760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610469565b5f83606001518260a0015161068c9190614480565b905061069886826118e2565b5f6005600160991b0163ee5b48eb6106b189878661192a565b6040518263ffffffff1660e01b81526004016106cd91906144c9565b6020604051808303815f875af11580156106e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070d91906144fb565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614cee83398151915260205260408082208151610100810190925280545f80516020614cae83398151915293929190829060ff1660058111156107bc576107bc614458565b60058111156107cd576107cd614458565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561085257610852614458565b146108b75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610469565b6005600160991b016001600160a01b031663ee5b48eb6108dc8584608001515f61192a565b6040518263ffffffff1660e01b81526004016108f891906144c9565b6020604051808303815f875af1158015610914573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093891906144fb565b50505050565b5f61094e64e8d4a5100083614526565b92915050565b5f61095e82611b47565b905061097b81606001516001600160401b03168260400151611eba565b5050565b5f80516020614c6e8339815191525f61099784611ef0565b90505f806109a883604001516120d1565b50915091505f6109b783611803565b9050816001600160401b031681608001516001600160401b031610156109ef5760405162461bcd60e51b815260040161046990614539565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a345760405162461bcd60e51b81526004016104699061457b565b60015f87815260068701602052604090205460ff166004811115610a5a57610a5a614458565b14610ac35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610469565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61094e6001600160401b03831664e8d4a510006145c4565b5f610b7282611803565b60a0015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bc5575080546001600160401b03808416911610155b15610be35760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c0e848461230c565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020614c6e8339815191525f610c7885611803565b5f86815260058401602052604090205460c0820151919250610caa91620100009091046001600160401b0316906145db565b6001600160401b0316421015610d1e5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610469565b8315610d3057610d2e85846114e5565b505b610d3985612326565b5050505050565b5f80516020614c6e8339815191525f610d5884611ef0565b90505f80610d6983604001516120d1565b50915091505f610d7883611803565b9050816001600160401b031681608001516001600160401b03161015610db05760405162461bcd60e51b815260040161046990614539565b5f8681526006860160205260409020600301546001600160401b0380841691161115610dee5760405162461bcd60e51b81526004016104699061457b565b60035f87815260068701602052604090205460ff166004811115610e1457610e14614458565b14610e685760405162461bcd60e51b815260206004820152603160248201525f80516020614c8e8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610469565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f0d91611eba565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f5b8333846126c4565b9392505050565b5f610f6b612ab9565b610f76848484612af0565b9050610f5b60015f80516020614cce83398151915255565b5f80516020614cae8339815191525f610fa683611ef0565b90505f80610fb78360400151612cd2565b91509150806110195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610469565b5f82815260058501602052604081208054611033906145fb565b9050118015611065575060015f83815260068601602052604090205460ff16600581111561106357611063614458565b145b6110815760405162461bcd60e51b815260040161046990614633565b5f82815260058501602052604081206110999161420b565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614c6e83398151915293929190829060ff1660048111156111ac576111ac614458565b60048111156111bd576111bd614458565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561124457611244614458565b1480611262575060038151600481111561126057611260614458565b145b6112b65760405162461bcd60e51b815260206004820152603260248201525f80516020614c8e833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610469565b5f6112c48260400151611803565b905080608001516001600160401b03165f036113485760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610469565b6005600160991b016001600160a01b031663ee5b48eb611375846040015184608001518560a0015161192a565b6040518263ffffffff1660e01b815260040161139191906144c9565b6020604051808303815f875af11580156113ad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d3991906144fb565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614cae833981519152929190611419906145fb565b905011801561144b575060015f83815260068301602052604090205460ff16600581111561144957611449614458565b145b6114675760405162461bcd60e51b815260040161046990614633565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114a0919060040161467a565b6020604051808303815f875af11580156114bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e091906144fb565b505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611530573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611557919081019061477b565b91509150806115ba5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610469565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162191906144fb565b8251146116855760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610469565b60208201516001600160a01b0316156116fb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610469565b5f8061170a8460400151612e73565b915091508187146117775760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610469565b9695505050505050565b5f8181525f80516020614cee8339815191526020526040812060030180545f80516020614cae833981519152916001600160401b0390911690836117c483614863565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b61180b614242565b5f8281525f80516020614cee8339815191526020526040908190208151610100810190925280545f80516020614cae833981519152929190829060ff16600581111561185957611859614458565b600581111561186a5761186a614458565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614cee833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119a357611963816001614888565b61196e9060086145c4565b5081515f908390839081106119855761198561489b565b60200101906001600160f81b03191690815f1a90535060010161194f565b505f5b6004811015611a06576119ba816003614888565b6119c59060086145c4565b6001901c60f81b826119d88360026148af565b815181106119e8576119e861489b565b60200101906001600160f81b03191690815f1a9053506001016119a6565b505f5b6020811015611a6857611a1d81601f614888565b611a289060086145c4565b86901c60f81b82611a3a8360066148af565b81518110611a4a57611a4a61489b565b60200101906001600160f81b03191690815f1a905350600101611a09565b505f5b6008811015611ad357611a7f816007614888565b611a8a9060086145c4565b6001600160401b038616901c60f81b82611aa58360266148af565b81518110611ab557611ab561489b565b60200101906001600160f81b03191690815f1a905350600101611a6b565b505f5b6008811015611b3e57611aea816007614888565b611af59060086145c4565b6001600160401b038516901c60f81b82611b1083602e6148af565b81518110611b2057611b2061489b565b60200101906001600160f81b03191690815f1a905350600101611ad6565b50949350505050565b611b4f614242565b5f80516020614cae8339815191525f611b6784611ef0565b90505f80611b788360400151612cd2565b915091508015611bdd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610469565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611c0f57611c0f614458565b6005811115611c2057611c20614458565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ca757611ca7614458565b1480611cc55750600182516005811115611cc357611cc3614458565b145b611d245760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610469565b600382516005811115611d3957611d39614458565b03611d4657506004611d4a565b5060055b6020808301515f90815260078801909152604081205581816005811115611d7357611d73614458565b90816005811115611d8657611d86614458565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611dba57611dba614458565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e8557611e85614458565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461097b906001600160a01b0316828461304b565b60408051606080820183525f8083526020830181905292820152905f80516020614cae8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f8c919081019061477b565b9150915080611ff35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610469565b82548251146120565760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610469565b60208201516001600160a01b0316156120c95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610469565b509392505050565b5f805f83516036146120f55760405162461bcd60e51b8152600401610469906148c2565b5f805b60028110156121445761210c816001614888565b6121179060086145c4565b61ffff1686828151811061212d5761212d61489b565b016020015160f81c901b91909117906001016120f8565b5061ffff8116156121675760405162461bcd60e51b81526004016104699061490b565b5f805b60048110156121c25761217e816003614888565b6121899060086145c4565b63ffffffff168761219b8360026148af565b815181106121ab576121ab61489b565b016020015160f81c901b919091179060010161216a565b5063ffffffff81166003146121e95760405162461bcd60e51b81526004016104699061494e565b5f805b602081101561223e5761220081601f614888565b61220b9060086145c4565b886122178360066148af565b815181106122275761222761489b565b016020015160f81c901b91909117906001016121ec565b505f805b600881101561229d57612256816007614888565b6122619060086145c4565b6001600160401b0316896122768360266148af565b815181106122865761228661489b565b016020015160f81c901b9190911790600101612242565b505f805b60088110156122fc576122b5816007614888565b6122c09060086145c4565b6001600160401b03168a6122d583602e6148af565b815181106122e5576122e561489b565b016020015160f81c901b91909117906001016122a1565b5091989097509095509350505050565b6123146130aa565b61231d826130f5565b61097b81613162565b5f8181525f80516020614cee83398151915260205260408082208151610100810190925280545f80516020614cae83398151915293929190829060ff16600581111561237457612374614458565b600581111561238557612385614458565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561240d5761240d614458565b146124695760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610469565b60408101516001600160a01b0316336001600160a01b0316146124e35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610469565b6124f08160a00151613216565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561253457612534614458565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612600846125fa81611781565b5f61192a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061262f9085906004016144c9565b6020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906144fb565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126cd612ab9565b5f80516020614c6e8339815191525f6126e86101c1856133b7565b90505f6126f487611803565b905060028151600581111561270b5761270b614458565b1461276a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610469565b5f828260a0015161277b91906145db565b6004850154606084015191925061279d916001600160401b0390911690614995565b6001600160401b0316816001600160401b0316111561281c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610469565b61282688826118e2565b5f61283089611781565b90505f898260405160200161285c92919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061287d85613216565b5f6005600160991b0163ee5b48eb6128968d868861192a565b6040518263ffffffff1660e01b81526004016128b291906144c9565b6020604051808303815f875af11580156128ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128f291906144fb565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561297a5761297a614458565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610f5b60015f80516020614cce83398151915255565b5f80516020614cce833981519152805460011901612aea57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614c6e833981519152906001600160401b0316612b3c604086016020870161436a565b6001600160401b03161015612bab5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610469565b6003810154612bbd60208601866149cf565b61ffff1610158015612be15750612710612bda60208601866149cf565b61ffff1611155b612bfd5760405162461bcd60e51b8152600401610469906149ea565b80548310801590612c12575080600101548311155b612c705760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610469565b5f612c7a846133b7565b90505f612c868261093e565b90505f612c9388836133ed565b5f81815260058601602052604090209091508790612cb18282614a35565b509098975050505050505050565b60015f80516020614cce83398151915255565b5f808251602714612cf55760405162461bcd60e51b8152600401610469906148c2565b5f805b6002811015612d4457612d0c816001614888565b612d179060086145c4565b61ffff16858281518110612d2d57612d2d61489b565b016020015160f81c901b9190911790600101612cf8565b5061ffff811615612d675760405162461bcd60e51b81526004016104699061490b565b5f805b6004811015612dc257612d7e816003614888565b612d899060086145c4565b63ffffffff1686612d9b8360026148af565b81518110612dab57612dab61489b565b016020015160f81c901b9190911790600101612d6a565b5063ffffffff8116600214612de95760405162461bcd60e51b81526004016104699061494e565b5f805b6020811015612e3e57612e0081601f614888565b612e0b9060086145c4565b87612e178360066148af565b81518110612e2757612e2761489b565b016020015160f81c901b9190911790600101612dec565b505f86602681518110612e5357612e5361489b565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e965760405162461bcd60e51b8152600401610469906148c2565b5f805b6002811015612ee557612ead816001614888565b612eb89060086145c4565b61ffff16858281518110612ece57612ece61489b565b016020015160f81c901b9190911790600101612e99565b5061ffff811615612f085760405162461bcd60e51b81526004016104699061490b565b5f805b6004811015612f6357612f1f816003614888565b612f2a9060086145c4565b63ffffffff1686612f3c8360026148af565b81518110612f4c57612f4c61489b565b016020015160f81c901b9190911790600101612f0b565b5063ffffffff8116600414612f8a5760405162461bcd60e51b81526004016104699061494e565b5f805b6020811015612fdf57612fa181601f614888565b612fac9060086145c4565b87612fb88360066148af565b81518110612fc857612fc861489b565b016020015160f81c901b9190911790600101612f8d565b505f805b600881101561303e57612ff7816007614888565b6130029060086145c4565b6001600160401b0316886130178360266148af565b815181106130275761302761489b565b016020015160f81c901b9190911790600101612fe3565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526114e091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506138b7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130f357604051631afcd79f60e31b815260040160405180910390fd5b565b6130fd6130aa565b61310681613918565b61315f6060820135608083013561312360c0850160a0860161436a565b61313360e0860160c087016149cf565b61ffff16613148610100870160e08801614a8b565b61315a61012088016101008901614aab565b613939565b50565b61316a6130aa565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131f65760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610469565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614cae8339815191529060ff165f03613254575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061329c9083614888565b106132b8576001600160401b03841660408301528082526132d7565b83826040018181516132ca91906145db565b6001600160401b03169052505b5f8260200151836040015160646132ee9190614995565b6132f89190614ac6565b600285015490915060ff90811690821611156133735760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610469565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f61094e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b1e565b5f5f80516020614cae8339815191524261340d604086016020870161436a565b6001600160401b0316118015613446575061342e604085016020860161436a565b6001600160401b0316613444426202a3006148af565b115b6134a85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610469565b83356135005760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610469565b83355f908152600782016020526040902054156135705760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610469565b61357d6040850185614aeb565b90506030146135e45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610469565b6135ed83613216565b5f806136876040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613632919061436a565b6001600160401b0316815260200161364d60408a018a614aeb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613c80565b5f828152600586016020526040902091935091506136a58282614b78565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906136d29085906004016144c9565b6020604051808303815f875af11580156136ee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061371291906144fb565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff1916600183600581111561379457613794614458565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161388991908e01908e0161436a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6138cb6001600160a01b03841683614025565b905080515f141580156138ef5750808060200190518101906138ed9190614c37565b155b156114e057604051635274afe760e01b81526001600160a01b0384166004820152602401610469565b6139206130aa565b613928614032565b613930614042565b61315f8161404a565b6139416130aa565b5f80516020614c6e833981519152836139ad5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610469565b6127108411156139cf5760405162461bcd60e51b8152600401610469906149ea565b85871115613a375760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610469565b600a60ff841611801590613a4d57505f8360ff16115b613ab75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610469565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613b64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b8891906144fb565b9050613b9f6001600160a01b0385163330866140b6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613be3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0791906144fb565b9050818111613c6d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610469565b613c778282614888565b95945050505050565b5f6060826080015151603014613cea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610469565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613d6157613d21816001614888565b613d2c9060086145c4565b5081515f90839083908110613d4357613d4361489b565b60200101906001600160f81b03191690815f1a905350600101613d0d565b505f5b6004811015613dbf57613d78816003614888565b613d839060086145c4565b505f82613d918360026148af565b81518110613da157613da161489b565b60200101906001600160f81b03191690815f1a905350600101613d64565b505f5b6020811015613e1c5784518160208110613dde57613dde61489b565b1a60f81b82613dee8360066148af565b81518110613dfe57613dfe61489b565b60200101906001600160f81b03191690815f1a905350600101613dc2565b505f5b6020811015613e7c5784602001518160208110613e3e57613e3e61489b565b1a60f81b82613e4e8360266148af565b81518110613e5e57613e5e61489b565b60200101906001600160f81b03191690815f1a905350600101613e1f565b505f5b6008811015613ef057613e93816007614888565b613e9e9060086145c4565b60ff1685604001516001600160401b0316901c60f81b82826046613ec291906148af565b81518110613ed257613ed261489b565b60200101906001600160f81b03191690815f1a905350600101613e7f565b505f5b6030811015613f5b5784608001518181518110613f1257613f1261489b565b01602001516001600160f81b03191682613f2d83604e6148af565b81518110613f3d57613f3d61489b565b60200101906001600160f81b03191690815f1a905350600101613ef3565b505f5b6008811015613fcd57613f72816007614888565b613f7d9060086145c4565b60608601516001600160401b0390811691161c60f81b82613f9f83607e6148af565b81518110613faf57613faf61489b565b60200101906001600160f81b03191690815f1a905350600101613f5e565b50600281604051613fde9190614c52565b602060405180830381855afa158015613ff9573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061401c91906144fb565b94909350915050565b6060610f5b83835f6140ef565b61403a6130aa565b6130f361417e565b6130f36130aa565b6140526130aa565b80355f80516020614cae83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561409c6060830160408401614a8b565b600291909101805460ff191660ff90921691909117905550565b6040516001600160a01b0384811660248301528381166044830152606482018390526109389186918216906323b872dd90608401613078565b6060814710156141145760405163cd78605960e01b8152306004820152602401610469565b5f80856001600160a01b0316848660405161412f9190614c52565b5f6040518083038185875af1925050503d805f8114614169576040519150601f19603f3d011682016040523d82523d5f602084013e61416e565b606091505b5091509150611777868383614186565b612cbf6130aa565b60608261419b57614196826141e2565b610f5b565b81511580156141b257506001600160a01b0384163b155b156141db57604051639996b31560e01b81526001600160a01b0385166004820152602401610469565b5080610f5b565b8051156141f25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614217906145fb565b5f825580601f10614226575050565b601f0160209004905f5260205f209081019061315f9190614286565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561429a575f8155600101614287565b5090565b801515811461315f575f80fd5b803563ffffffff811681146142be575f80fd5b919050565b5f805f606084860312156142d5575f80fd5b8335925060208401356142e78161429e565b91506142f5604085016142ab565b90509250925092565b5f6020828403121561430e575f80fd5b5035919050565b5f60208284031215614325575f80fd5b610f5b826142ab565b5f806040838503121561433f575f80fd5b614348836142ab565b946020939093013593505050565b6001600160401b038116811461315f575f80fd5b5f6020828403121561437a575f80fd5b8135610f5b81614356565b6001600160a01b038116811461315f575f80fd5b5f808284036101408112156143ac575f80fd5b610120808212156143bb575f80fd5b84935083013590506143cc81614385565b809150509250929050565b5f80604083850312156143e8575f80fd5b50508035926020909101359150565b5f805f838503608081121561440a575f80fd5b84356001600160401b0381111561441f575f80fd5b850160608188031215614430575f80fd5b93506040601f1982011215614443575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144a0576144a061446c565b5092915050565b5f5b838110156144c15781810151838201526020016144a9565b50505f910152565b602081525f82518060208401526144e78160408501602087016144a7565b601f01601f19169190910160400192915050565b5f6020828403121561450b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261453457614534614512565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761094e5761094e61446c565b6001600160401b038181168382160190808211156144a0576144a061446c565b600181811c9082168061460f57607f821691505b60208210810361462d57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461468c816145fb565b806020870152604060018084165f81146146ad57600181146146c9576146f6565b60ff19851660408a0152604084151560051b8a010195506146f6565b895f5260205f205f5b858110156146ed5781548b82018601529083019088016146d2565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561473a5761473a614704565b60405290565b604051601f8201601f191681016001600160401b038111828210171561476857614768614704565b604052919050565b80516142be8161429e565b5f806040838503121561478c575f80fd5b82516001600160401b03808211156147a2575f80fd5b90840190606082870312156147b5575f80fd5b6147bd614718565b825181526020808401516147d081614385565b828201526040840151838111156147e5575f80fd5b80850194505087601f8501126147f9575f80fd5b83518381111561480b5761480b614704565b61481d601f8201601f19168301614740565b93508084528882828701011115614832575f80fd5b614841818386018488016144a7565b50826040830152819550614856818801614770565b9450505050509250929050565b5f6001600160401b0380831681810361487e5761487e61446c565b6001019392505050565b8181038181111561094e5761094e61446c565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561094e5761094e61446c565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146149b8576149b861446c565b505092915050565b61ffff8116811461315f575f80fd5b5f602082840312156149df575f80fd5b8135610f5b816149c0565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614a40816149c0565b61ffff8116905081548161ffff1982161783556020840135614a6181614356565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614a9b575f80fd5b813560ff81168114610f5b575f80fd5b5f60208284031215614abb575f80fd5b8135610f5b81614385565b5f6001600160401b0380841680614adf57614adf614512565b92169190910492915050565b5f808335601e19843603018112614b00575f80fd5b8301803591506001600160401b03821115614b19575f80fd5b602001915036819003821315614b2d575f80fd5b9250929050565b601f8211156114e057805f5260205f20601f840160051c81016020851015614b595750805b601f840160051c820191505b81811015610d39575f8155600101614b65565b81516001600160401b03811115614b9157614b91614704565b614ba581614b9f84546145fb565b84614b34565b602080601f831160018114614bd8575f8415614bc15750858301515b5f19600386901b1c1916600185901b178555614c2f565b5f85815260208120601f198616915b82811015614c0657888601518255948401946001909101908401614be7565b5085821015614c2357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614c47575f80fd5b8151610f5b8161429e565b5f8251614c638184602087016144a7565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614ec6380380614ec683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d798061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c806366435abf116100a9578063a13fd29d1161006e578063a13fd29d14610292578063a3a65e48146102a5578063b771b3bc146102b8578063ba3a4b97146102de578063bee0a03f146102f1575f80fd5b806366435abf146102335780636f5f1c941461024657806376f786211461025957806398f3e2b41461026c5780639e1bc4ef1461027f575f80fd5b80632e2194d8116100ef5780632e2194d8146101b357806335455ded146101de578063467ef06f146101fa5780635297fae61461020d5780636206585614610220575f80fd5b80630118acc4146101205780630322ed98146101355780630cdd098514610148578063151d30d114610199575b5f80fd5b61013361012e366004614322565b610304565b005b61013361014336600461435d565b61076e565b61018661015636600461435d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101a1600a81565b60405160ff9091168152602001610190565b6101c66101c136600461435d565b61093e565b6040516001600160401b039091168152602001610190565b6101e761271081565b60405161ffff9091168152602001610190565b610133610208366004614374565b610954565b61013361021b36600461438d565b61097f565b61018661022e3660046143c9565b610b4f565b6101c661024136600461435d565b610b68565b6101336102543660046143f8565b610b7c565b610133610267366004614322565b610c60565b61013361027a36600461438d565b610d40565b61018661028d366004614436565b610f4f565b6101866102a0366004614456565b610f62565b6101336102b3366004614374565b610f8e565b6102c66005600160991b0181565b6040516001600160a01b039091168152602001610190565b6101336102ec36600461435d565b61114b565b6101336102ff36600461435d565b6113d1565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614ccd8339815191529184156103565761035382856114e5565b90505b5f868152600684016020526040808220815161010081019092528054829060ff166004811115610388576103886144b7565b6004811115610399576103996144b7565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610420576104206144b7565b146104725760405162461bcd60e51b815260206004820152602a60248201525f80516020614ced8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104d75760405162461bcd60e51b815260206004820152603360248201525f80516020614ced8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610469565b5f6104e184611781565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561052e5761052e6144b7565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61060085611803565b905082606001516001600160401b03168160a001516001600160401b0316116106775760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610469565b5f83606001518260a0015161068c91906144df565b905061069886826118e2565b5f6005600160991b0163ee5b48eb6106b189878661192a565b6040518263ffffffff1660e01b81526004016106cd9190614528565b6020604051808303815f875af11580156106e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070d919061455a565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614d4d83398151915260205260408082208151610100810190925280545f80516020614d0d83398151915293929190829060ff1660058111156107bc576107bc6144b7565b60058111156107cd576107cd6144b7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610852576108526144b7565b146108b75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610469565b6005600160991b016001600160a01b031663ee5b48eb6108dc8584608001515f61192a565b6040518263ffffffff1660e01b81526004016108f89190614528565b6020604051808303815f875af1158015610914573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610938919061455a565b50505050565b5f61094e64e8d4a5100083614585565b92915050565b5f61095e82611b47565b905061097b81606001516001600160401b03168260400151611eba565b5050565b5f80516020614ccd8339815191525f61099784611ef0565b90505f806109a883604001516120d1565b50915091505f6109b783611803565b9050816001600160401b031681608001516001600160401b031610156109ef5760405162461bcd60e51b815260040161046990614598565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a345760405162461bcd60e51b8152600401610469906145da565b60015f87815260068701602052604090205460ff166004811115610a5a57610a5a6144b7565b14610ac35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610469565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61094e6001600160401b03831664e8d4a51000614623565b5f610b7282611803565b60a0015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bc5575080546001600160401b03808416911610155b15610be35760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c0e848461230c565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020614ccd8339815191525f610c7885611803565b5f86815260058401602052604090205460c0820151919250610caa91620100009091046001600160401b03169061463a565b6001600160401b0316421015610d1e5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610469565b8315610d3057610d2e85846114e5565b505b610d3985612326565b5050505050565b5f80516020614ccd8339815191525f610d5884611ef0565b90505f80610d6983604001516120d1565b50915091505f610d7883611803565b9050816001600160401b031681608001516001600160401b03161015610db05760405162461bcd60e51b815260040161046990614598565b5f8681526006860160205260409020600301546001600160401b0380841691161115610dee5760405162461bcd60e51b8152600401610469906145da565b60035f87815260068701602052604090205460ff166004811115610e1457610e146144b7565b14610e685760405162461bcd60e51b815260206004820152603160248201525f80516020614ced8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610469565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f0d91611eba565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f5b8333846126c4565b9392505050565b5f610f6b612ab9565b610f76848484612af0565b9050610f5b60015f80516020614d2d83398151915255565b5f80516020614d0d8339815191525f610fa683611ef0565b90505f80610fb78360400151612cd2565b91509150806110195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610469565b5f828152600585016020526040812080546110339061465a565b9050118015611065575060015f83815260068601602052604090205460ff166005811115611063576110636144b7565b145b6110815760405162461bcd60e51b815260040161046990614692565b5f82815260058501602052604081206110999161426a565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614ccd83398151915293929190829060ff1660048111156111ac576111ac6144b7565b60048111156111bd576111bd6144b7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611244576112446144b7565b14806112625750600381516004811115611260576112606144b7565b145b6112b65760405162461bcd60e51b815260206004820152603260248201525f80516020614ced833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610469565b5f6112c48260400151611803565b905080608001516001600160401b03165f036113485760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610469565b6005600160991b016001600160a01b031663ee5b48eb611375846040015184608001518560a0015161192a565b6040518263ffffffff1660e01b81526004016113919190614528565b6020604051808303815f875af11580156113ad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d39919061455a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614d0d8339815191529291906114199061465a565b905011801561144b575060015f83815260068301602052604090205460ff166005811115611449576114496144b7565b145b6114675760405162461bcd60e51b815260040161046990614692565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114a091906004016146d9565b6020604051808303815f875af11580156114bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e0919061455a565b505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611530573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261155791908101906147da565b91509150806115ba5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610469565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115fd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611621919061455a565b8251146116855760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610469565b60208201516001600160a01b0316156116fb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610469565b5f8061170a8460400151612e73565b915091508187146117775760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610469565b9695505050505050565b5f8181525f80516020614d4d8339815191526020526040812060030180545f80516020614d0d833981519152916001600160401b0390911690836117c4836148c2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b61180b6142a1565b5f8281525f80516020614d4d8339815191526020526040908190208151610100810190925280545f80516020614d0d833981519152929190829060ff166005811115611859576118596144b7565b600581111561186a5761186a6144b7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614d4d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119a3576119638160016148e7565b61196e906008614623565b5081515f90839083908110611985576119856148fa565b60200101906001600160f81b03191690815f1a90535060010161194f565b505f5b6004811015611a06576119ba8160036148e7565b6119c5906008614623565b6001901c60f81b826119d883600261490e565b815181106119e8576119e86148fa565b60200101906001600160f81b03191690815f1a9053506001016119a6565b505f5b6020811015611a6857611a1d81601f6148e7565b611a28906008614623565b86901c60f81b82611a3a83600661490e565b81518110611a4a57611a4a6148fa565b60200101906001600160f81b03191690815f1a905350600101611a09565b505f5b6008811015611ad357611a7f8160076148e7565b611a8a906008614623565b6001600160401b038616901c60f81b82611aa583602661490e565b81518110611ab557611ab56148fa565b60200101906001600160f81b03191690815f1a905350600101611a6b565b505f5b6008811015611b3e57611aea8160076148e7565b611af5906008614623565b6001600160401b038516901c60f81b82611b1083602e61490e565b81518110611b2057611b206148fa565b60200101906001600160f81b03191690815f1a905350600101611ad6565b50949350505050565b611b4f6142a1565b5f80516020614d0d8339815191525f611b6784611ef0565b90505f80611b788360400151612cd2565b915091508015611bdd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610469565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611c0f57611c0f6144b7565b6005811115611c2057611c206144b7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ca757611ca76144b7565b1480611cc55750600182516005811115611cc357611cc36144b7565b145b611d245760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610469565b600382516005811115611d3957611d396144b7565b03611d4657506004611d4a565b5060055b6020808301515f90815260078801909152604081205581816005811115611d7357611d736144b7565b90816005811115611d8657611d866144b7565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611dba57611dba6144b7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e8557611e856144b7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461097b906001600160a01b0316828461304b565b60408051606080820183525f8083526020830181905292820152905f80516020614d0d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f8c91908101906147da565b9150915080611ff35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610469565b82548251146120565760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610469565b60208201516001600160a01b0316156120c95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610469565b509392505050565b5f805f83516036146120f55760405162461bcd60e51b815260040161046990614921565b5f805b60028110156121445761210c8160016148e7565b612117906008614623565b61ffff1686828151811061212d5761212d6148fa565b016020015160f81c901b91909117906001016120f8565b5061ffff8116156121675760405162461bcd60e51b81526004016104699061496a565b5f805b60048110156121c25761217e8160036148e7565b612189906008614623565b63ffffffff168761219b83600261490e565b815181106121ab576121ab6148fa565b016020015160f81c901b919091179060010161216a565b5063ffffffff81166003146121e95760405162461bcd60e51b8152600401610469906149ad565b5f805b602081101561223e5761220081601f6148e7565b61220b906008614623565b8861221783600661490e565b81518110612227576122276148fa565b016020015160f81c901b91909117906001016121ec565b505f805b600881101561229d576122568160076148e7565b612261906008614623565b6001600160401b03168961227683602661490e565b81518110612286576122866148fa565b016020015160f81c901b9190911790600101612242565b505f805b60088110156122fc576122b58160076148e7565b6122c0906008614623565b6001600160401b03168a6122d583602e61490e565b815181106122e5576122e56148fa565b016020015160f81c901b91909117906001016122a1565b5091989097509095509350505050565b6123146130aa565b61231d826130f5565b61097b81613162565b5f8181525f80516020614d4d83398151915260205260408082208151610100810190925280545f80516020614d0d83398151915293929190829060ff166005811115612374576123746144b7565b6005811115612385576123856144b7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561240d5761240d6144b7565b146124695760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610469565b60408101516001600160a01b0316336001600160a01b0316146124e35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610469565b6124f08160a00151613216565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115612534576125346144b7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612600846125fa81611781565b5f61192a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061262f908590600401614528565b6020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f919061455a565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126cd612ab9565b5f80516020614ccd8339815191525f6126e86101c1856133b7565b90505f6126f487611803565b905060028151600581111561270b5761270b6144b7565b1461276a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610469565b5f828260a0015161277b919061463a565b6004850154606084015191925061279d916001600160401b03909116906149f4565b6001600160401b0316816001600160401b0316111561281c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610469565b61282688826118e2565b5f61283089611781565b90505f898260405160200161285c92919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061287d85613216565b5f6005600160991b0163ee5b48eb6128968d868861192a565b6040518263ffffffff1660e01b81526004016128b29190614528565b6020604051808303815f875af11580156128ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128f2919061455a565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561297a5761297a6144b7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610f5b60015f80516020614d2d83398151915255565b5f80516020614d2d833981519152805460011901612aea57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ccd833981519152906001600160401b0316612b3c60408601602087016143c9565b6001600160401b03161015612bab5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610469565b6003810154612bbd6020860186614a2e565b61ffff1610158015612be15750612710612bda6020860186614a2e565b61ffff1611155b612bfd5760405162461bcd60e51b815260040161046990614a49565b80548310801590612c12575080600101548311155b612c705760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610469565b5f612c7a846133b7565b90505f612c868261093e565b90505f612c9388836133ed565b5f81815260058601602052604090209091508790612cb18282614a94565b509098975050505050505050565b60015f80516020614d2d83398151915255565b5f808251602714612cf55760405162461bcd60e51b815260040161046990614921565b5f805b6002811015612d4457612d0c8160016148e7565b612d17906008614623565b61ffff16858281518110612d2d57612d2d6148fa565b016020015160f81c901b9190911790600101612cf8565b5061ffff811615612d675760405162461bcd60e51b81526004016104699061496a565b5f805b6004811015612dc257612d7e8160036148e7565b612d89906008614623565b63ffffffff1686612d9b83600261490e565b81518110612dab57612dab6148fa565b016020015160f81c901b9190911790600101612d6a565b5063ffffffff8116600214612de95760405162461bcd60e51b8152600401610469906149ad565b5f805b6020811015612e3e57612e0081601f6148e7565b612e0b906008614623565b87612e1783600661490e565b81518110612e2757612e276148fa565b016020015160f81c901b9190911790600101612dec565b505f86602681518110612e5357612e536148fa565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e965760405162461bcd60e51b815260040161046990614921565b5f805b6002811015612ee557612ead8160016148e7565b612eb8906008614623565b61ffff16858281518110612ece57612ece6148fa565b016020015160f81c901b9190911790600101612e99565b5061ffff811615612f085760405162461bcd60e51b81526004016104699061496a565b5f805b6004811015612f6357612f1f8160036148e7565b612f2a906008614623565b63ffffffff1686612f3c83600261490e565b81518110612f4c57612f4c6148fa565b016020015160f81c901b9190911790600101612f0b565b5063ffffffff8116600414612f8a5760405162461bcd60e51b8152600401610469906149ad565b5f805b6020811015612fdf57612fa181601f6148e7565b612fac906008614623565b87612fb883600661490e565b81518110612fc857612fc86148fa565b016020015160f81c901b9190911790600101612f8d565b505f805b600881101561303e57612ff78160076148e7565b613002906008614623565b6001600160401b03168861301783602661490e565b81518110613027576130276148fa565b016020015160f81c901b9190911790600101612fe3565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526114e091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506138b7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130f357604051631afcd79f60e31b815260040160405180910390fd5b565b6130fd6130aa565b61310681613918565b61315f6060820135608083013561312360c0850160a086016143c9565b61313360e0860160c08701614a2e565b61ffff16613148610100870160e08801614aea565b61315a61012088016101008901614b0a565b613939565b50565b61316a6130aa565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131f65760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610469565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614d0d8339815191529060ff165f03613254575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061329c90836148e7565b106132b8576001600160401b03841660408301528082526132d7565b83826040018181516132ca919061463a565b6001600160401b03169052505b5f8260200151836040015160646132ee91906149f4565b6132f89190614b25565b600285015490915060ff90811690821611156133735760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610469565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f61094e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b7d565b5f5f80516020614d0d8339815191524261340d60408601602087016143c9565b6001600160401b0316118015613446575061342e60408501602086016143c9565b6001600160401b0316613444426202a30061490e565b115b6134a85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610469565b83356135005760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610469565b83355f908152600782016020526040902054156135705760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610469565b61357d6040850185614b4a565b90506030146135e45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610469565b6135ed83613216565b5f806136876040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061363291906143c9565b6001600160401b0316815260200161364d60408a018a614b4a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613cdf565b5f828152600586016020526040902091935091506136a58282614bd7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906136d2908590600401614528565b6020604051808303815f875af11580156136ee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613712919061455a565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115613794576137946144b7565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161388991908e01908e016143c9565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6138cb6001600160a01b03841683614084565b905080515f141580156138ef5750808060200190518101906138ed9190614c96565b155b156114e057604051635274afe760e01b81526001600160a01b0384166004820152602401610469565b6139206130aa565b613928614091565b6139306140a1565b61315f816140a9565b6139416130aa565b5f80516020614ccd833981519152836139ad5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610469565b6127108411156139cf5760405162461bcd60e51b815260040161046990614a49565b85871115613a375760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610469565b5f8360ff1611613aa45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610469565b600a60ff84161115613b165760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610469565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613be7919061455a565b9050613bfe6001600160a01b038516333086614115565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c66919061455a565b9050818111613ccc5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610469565b613cd682826148e7565b95945050505050565b5f6060826080015151603014613d495760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610469565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613dc057613d808160016148e7565b613d8b906008614623565b5081515f90839083908110613da257613da26148fa565b60200101906001600160f81b03191690815f1a905350600101613d6c565b505f5b6004811015613e1e57613dd78160036148e7565b613de2906008614623565b505f82613df083600261490e565b81518110613e0057613e006148fa565b60200101906001600160f81b03191690815f1a905350600101613dc3565b505f5b6020811015613e7b5784518160208110613e3d57613e3d6148fa565b1a60f81b82613e4d83600661490e565b81518110613e5d57613e5d6148fa565b60200101906001600160f81b03191690815f1a905350600101613e21565b505f5b6020811015613edb5784602001518160208110613e9d57613e9d6148fa565b1a60f81b82613ead83602661490e565b81518110613ebd57613ebd6148fa565b60200101906001600160f81b03191690815f1a905350600101613e7e565b505f5b6008811015613f4f57613ef28160076148e7565b613efd906008614623565b60ff1685604001516001600160401b0316901c60f81b82826046613f21919061490e565b81518110613f3157613f316148fa565b60200101906001600160f81b03191690815f1a905350600101613ede565b505f5b6030811015613fba5784608001518181518110613f7157613f716148fa565b01602001516001600160f81b03191682613f8c83604e61490e565b81518110613f9c57613f9c6148fa565b60200101906001600160f81b03191690815f1a905350600101613f52565b505f5b600881101561402c57613fd18160076148e7565b613fdc906008614623565b60608601516001600160401b0390811691161c60f81b82613ffe83607e61490e565b8151811061400e5761400e6148fa565b60200101906001600160f81b03191690815f1a905350600101613fbd565b5060028160405161403d9190614cb1565b602060405180830381855afa158015614058573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061407b919061455a565b94909350915050565b6060610f5b83835f61414e565b6140996130aa565b6130f36141dd565b6130f36130aa565b6140b16130aa565b80355f80516020614d0d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556140fb6060830160408401614aea565b600291909101805460ff191660ff90921691909117905550565b6040516001600160a01b0384811660248301528381166044830152606482018390526109389186918216906323b872dd90608401613078565b6060814710156141735760405163cd78605960e01b8152306004820152602401610469565b5f80856001600160a01b0316848660405161418e9190614cb1565b5f6040518083038185875af1925050503d805f81146141c8576040519150601f19603f3d011682016040523d82523d5f602084013e6141cd565b606091505b50915091506117778683836141e5565b612cbf6130aa565b6060826141fa576141f582614241565b610f5b565b815115801561421157506001600160a01b0384163b155b1561423a57604051639996b31560e01b81526001600160a01b0385166004820152602401610469565b5080610f5b565b8051156142515780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546142769061465a565b5f825580601f10614285575050565b601f0160209004905f5260205f209081019061315f91906142e5565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156142f9575f81556001016142e6565b5090565b801515811461315f575f80fd5b803563ffffffff8116811461431d575f80fd5b919050565b5f805f60608486031215614334575f80fd5b833592506020840135614346816142fd565b91506143546040850161430a565b90509250925092565b5f6020828403121561436d575f80fd5b5035919050565b5f60208284031215614384575f80fd5b610f5b8261430a565b5f806040838503121561439e575f80fd5b6143a78361430a565b946020939093013593505050565b6001600160401b038116811461315f575f80fd5b5f602082840312156143d9575f80fd5b8135610f5b816143b5565b6001600160a01b038116811461315f575f80fd5b5f8082840361014081121561440b575f80fd5b6101208082121561441a575f80fd5b849350830135905061442b816143e4565b809150509250929050565b5f8060408385031215614447575f80fd5b50508035926020909101359150565b5f805f8385036080811215614469575f80fd5b84356001600160401b0381111561447e575f80fd5b85016060818803121561448f575f80fd5b93506040601f19820112156144a2575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144ff576144ff6144cb565b5092915050565b5f5b83811015614520578181015183820152602001614508565b50505f910152565b602081525f8251806020840152614546816040850160208701614506565b601f01601f19169190910160400192915050565b5f6020828403121561456a575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261459357614593614571565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761094e5761094e6144cb565b6001600160401b038181168382160190808211156144ff576144ff6144cb565b600181811c9082168061466e57607f821691505b60208210810361468c57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546146eb8161465a565b806020870152604060018084165f811461470c576001811461472857614755565b60ff19851660408a0152604084151560051b8a01019550614755565b895f5260205f205f5b8581101561474c5781548b8201860152908301908801614731565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561479957614799614763565b60405290565b604051601f8201601f191681016001600160401b03811182821017156147c7576147c7614763565b604052919050565b805161431d816142fd565b5f80604083850312156147eb575f80fd5b82516001600160401b0380821115614801575f80fd5b9084019060608287031215614814575f80fd5b61481c614777565b8251815260208084015161482f816143e4565b82820152604084015183811115614844575f80fd5b80850194505087601f850112614858575f80fd5b83518381111561486a5761486a614763565b61487c601f8201601f1916830161479f565b93508084528882828701011115614891575f80fd5b6148a081838601848801614506565b508260408301528195506148b58188016147cf565b9450505050509250929050565b5f6001600160401b038083168181036148dd576148dd6144cb565b6001019392505050565b8181038181111561094e5761094e6144cb565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561094e5761094e6144cb565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614a1757614a176144cb565b505092915050565b61ffff8116811461315f575f80fd5b5f60208284031215614a3e575f80fd5b8135610f5b81614a1f565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614a9f81614a1f565b61ffff8116905081548161ffff1982161783556020840135614ac0816143b5565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614afa575f80fd5b813560ff81168114610f5b575f80fd5b5f60208284031215614b1a575f80fd5b8135610f5b816143e4565b5f6001600160401b0380841680614b3e57614b3e614571565b92169190910492915050565b5f808335601e19843603018112614b5f575f80fd5b8301803591506001600160401b03821115614b78575f80fd5b602001915036819003821315614b8c575f80fd5b9250929050565b601f8211156114e057805f5260205f20601f840160051c81016020851015614bb85750805b601f840160051c820191505b81811015610d39575f8155600101614bc4565b81516001600160401b03811115614bf057614bf0614763565b614c0481614bfe845461465a565b84614b93565b602080601f831160018114614c37575f8415614c205750858301515b5f19600386901b1c1916600185901b178555614c8e565b5f85815260208120601f198616915b82811015614c6557888601518255948401946001909101908401614c46565b5085821015614c8257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614ca6575f80fd5b8151610f5b816142fd565b5f8251614cc2818460208701614506565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 2e6f977e2..e99e4d6b5 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -63,7 +63,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614aa3380380614aa383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149568061014d5f395ff3fe608060405260043610610110575f3560e01c806366435abf1161009d578063b771b3bc11610062578063b771b3bc14610322578063ba3a4b9714610354578063bee0a03f14610373578063c123c6db14610392578063c599e24f146103b1575f80fd5b806366435abf1461029357806376f78621146102b257806380a8ad94146102d157806398f3e2b4146102e4578063a3a65e4814610303575f80fd5b80632e2194d8116100e35780632e2194d8146101d757806335455ded1461020e578063467ef06f146102365780635297fae6146102555780636206585614610274575f80fd5b80630118acc4146101145780630322ed98146101355780630cdd098514610154578063151d30d1146101b1575b5f80fd5b34801561011f575f80fd5b5061013361012e366004613f6f565b6103c4565b005b348015610140575f80fd5b5061013361014f366004613faa565b61082e565b34801561015f575f80fd5b5061019e61016e366004613faa565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101bc575f80fd5b506101c5600a81565b60405160ff90911681526020016101a8565b3480156101e2575f80fd5b506101f66101f1366004613faa565b6109fe565b6040516001600160401b0390911681526020016101a8565b348015610219575f80fd5b5061022361271081565b60405161ffff90911681526020016101a8565b348015610241575f80fd5b50610133610250366004613fc1565b610a14565b348015610260575f80fd5b5061013361026f366004613fda565b610a3f565b34801561027f575f80fd5b5061019e61028e366004614016565b610c0f565b34801561029e575f80fd5b506101f66102ad366004613faa565b610c28565b3480156102bd575f80fd5b506101336102cc366004613f6f565b610c3c565b61019e6102df366004614031565b610d1c565b3480156102ef575f80fd5b506101336102fe366004613fda565b610d48565b34801561030e575f80fd5b5061013361031d366004613fc1565b610f57565b34801561032d575f80fd5b5061033c6005600160991b0181565b6040516001600160a01b0390911681526020016101a8565b34801561035f575f80fd5b5061013361036e366004613faa565b611114565b34801561037e575f80fd5b5061013361038d366004613faa565b61139a565b34801561039d575f80fd5b506101336103ac36600461408a565b6114ae565b61019e6103bf366004613faa565b611590565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206148aa83398151915291841561041657610413828561159c565b90505b5f868152600684016020526040808220815161010081019092528054829060ff166004811115610448576104486140a1565b6004811115610459576104596140a1565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104e0576104e06140a1565b146105325760405162461bcd60e51b815260206004820152602a60248201525f805160206148ca8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105975760405162461bcd60e51b815260206004820152603360248201525f805160206148ca8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610529565b5f6105a184611838565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105ee576105ee6140a1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106c0856118ba565b905082606001516001600160401b03168160a001516001600160401b0316116107375760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610529565b5f83606001518260a0015161074c91906140c9565b90506107588682611999565b5f6005600160991b0163ee5b48eb6107718987866119e1565b6040518263ffffffff1660e01b815260040161078d9190614112565b6020604051808303815f875af11580156107a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107cd9190614144565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061492a83398151915260205260408082208151610100810190925280545f805160206148ea83398151915293929190829060ff16600581111561087c5761087c6140a1565b600581111561088d5761088d6140a1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610912576109126140a1565b146109775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610529565b6005600160991b016001600160a01b031663ee5b48eb61099c8584608001515f6119e1565b6040518263ffffffff1660e01b81526004016109b89190614112565b6020604051808303815f875af11580156109d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f89190614144565b50505050565b5f610a0e64e8d4a510008361416f565b92915050565b5f610a1e82611c00565b9050610a3b81606001516001600160401b03168260400151611f73565b5050565b5f805160206148aa8339815191525f610a5784611f86565b90505f80610a688360400151612167565b50915091505f610a77836118ba565b9050816001600160401b031681608001516001600160401b03161015610aaf5760405162461bcd60e51b815260040161052990614182565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610af45760405162461bcd60e51b8152600401610529906141c4565b60015f87815260068701602052604090205460ff166004811115610b1a57610b1a6140a1565b14610b835760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610529565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a0e6001600160401b03831664e8d4a5100061420d565b5f610c32826118ba565b60a0015192915050565b5f805160206148aa8339815191525f610c54856118ba565b5f86815260058401602052604090205460c0820151919250610c8691620100009091046001600160401b031690614224565b6001600160401b0316421015610cfa5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610529565b8315610d0c57610d0a858461159c565b505b610d15856123a2565b5050505050565b5f610d25612740565b610d30838334612777565b9050610a0e60015f8051602061490a83398151915255565b5f805160206148aa8339815191525f610d6084611f86565b90505f80610d718360400151612167565b50915091505f610d80836118ba565b9050816001600160401b031681608001516001600160401b03161015610db85760405162461bcd60e51b815260040161052990614182565b5f8681526006860160205260409020600301546001600160401b0380841691161115610df65760405162461bcd60e51b8152600401610529906141c4565b60035f87815260068701602052604090205460ff166004811115610e1c57610e1c6140a1565b14610e705760405162461bcd60e51b815260206004820152603160248201525f805160206148ca8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610529565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f1591611f73565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206148ea8339815191525f610f6f83611f86565b90505f80610f80836040015161294e565b9150915080610fe25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610529565b5f82815260058501602052604081208054610ffc90614244565b905011801561102e575060015f83815260068601602052604090205460ff16600581111561102c5761102c6140a1565b145b61104a5760405162461bcd60e51b815260040161052990614276565b5f828152600585016020526040812061106291613eb7565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206148aa83398151915293929190829060ff166004811115611175576111756140a1565b6004811115611186576111866140a1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561120d5761120d6140a1565b148061122b5750600381516004811115611229576112296140a1565b145b61127f5760405162461bcd60e51b815260206004820152603260248201525f805160206148ca833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610529565b5f61128d82604001516118ba565b905080608001516001600160401b03165f036113115760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610529565b6005600160991b016001600160a01b031663ee5b48eb61133e846040015184608001518560a001516119e1565b6040518263ffffffff1660e01b815260040161135a9190614112565b6020604051808303815f875af1158015611376573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d159190614144565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206148ea8339815191529291906113e290614244565b9050118015611414575060015f83815260068301602052604090205460ff166005811115611412576114126140a1565b145b6114305760405162461bcd60e51b815260040161052990614276565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161146991906004016142bd565b6020604051808303815f875af1158015611485573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a99190614144565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806114f7575080546001600160401b03808416911610155b156115155760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561153f83612aef565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a0e823334612b03565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115e7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261160e91908101906143d2565b91509150806116715760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610529565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d89190614144565b82511461173c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610529565b60208201516001600160a01b0316156117b25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610529565b5f806117c18460400151612ef5565b9150915081871461182e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610529565b9695505050505050565b5f8181525f8051602061492a8339815191526020526040812060030180545f805160206148ea833981519152916001600160401b03909116908361187b836144ba565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6118c2613eee565b5f8281525f8051602061492a8339815191526020526040908190208151610100810190925280545f805160206148ea833981519152929190829060ff166005811115611910576119106140a1565b6005811115611921576119216140a1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061492a833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5a57611a1a8160016144df565b611a2590600861420d565b5081515f90839083908110611a3c57611a3c6144f2565b60200101906001600160f81b03191690815f1a905350600101611a06565b505f5b6004811015611abd57611a718160036144df565b611a7c90600861420d565b6001901c60f81b82611a8f836002614506565b81518110611a9f57611a9f6144f2565b60200101906001600160f81b03191690815f1a905350600101611a5d565b505f5b6020811015611b1f57611ad481601f6144df565b611adf90600861420d565b86901c60f81b82611af1836006614506565b81518110611b0157611b016144f2565b60200101906001600160f81b03191690815f1a905350600101611ac0565b505f5b6008811015611b8a57611b368160076144df565b611b4190600861420d565b6001600160401b038616901c60f81b82611b5c836026614506565b81518110611b6c57611b6c6144f2565b60200101906001600160f81b03191690815f1a905350600101611b22565b505f5b6008811015611bf557611ba18160076144df565b611bac90600861420d565b6001600160401b038516901c60f81b82611bc783602e614506565b81518110611bd757611bd76144f2565b60200101906001600160f81b03191690815f1a905350600101611b8d565b5090505b9392505050565b611c08613eee565b5f805160206148ea8339815191525f611c2084611f86565b90505f80611c31836040015161294e565b915091508015611c965760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610529565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611cc857611cc86140a1565b6005811115611cd957611cd96140a1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d6057611d606140a1565b1480611d7e5750600182516005811115611d7c57611d7c6140a1565b145b611ddd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610529565b600382516005811115611df257611df26140a1565b03611dff57506004611e03565b5060055b6020808301515f90815260078801909152604081205581816005811115611e2c57611e2c6140a1565b90816005811115611e3f57611e3f6140a1565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611e7357611e736140a1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f3e57611f3e6140a1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a3b6001600160a01b038216836130cd565b60408051606080820183525f8083526020830181905292820152905f805160206148ea8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ffb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261202291908101906143d2565b91509150806120895760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610529565b82548251146120ec5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610529565b60208201516001600160a01b03161561215f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610529565b509392505050565b5f805f835160361461218b5760405162461bcd60e51b815260040161052990614519565b5f805b60028110156121da576121a28160016144df565b6121ad90600861420d565b61ffff168682815181106121c3576121c36144f2565b016020015160f81c901b919091179060010161218e565b5061ffff8116156121fd5760405162461bcd60e51b815260040161052990614562565b5f805b6004811015612258576122148160036144df565b61221f90600861420d565b63ffffffff1687612231836002614506565b81518110612241576122416144f2565b016020015160f81c901b9190911790600101612200565b5063ffffffff811660031461227f5760405162461bcd60e51b8152600401610529906145a5565b5f805b60208110156122d45761229681601f6144df565b6122a190600861420d565b886122ad836006614506565b815181106122bd576122bd6144f2565b016020015160f81c901b9190911790600101612282565b505f805b6008811015612333576122ec8160076144df565b6122f790600861420d565b6001600160401b03168961230c836026614506565b8151811061231c5761231c6144f2565b016020015160f81c901b91909117906001016122d8565b505f805b60088110156123925761234b8160076144df565b61235690600861420d565b6001600160401b03168a61236b83602e614506565b8151811061237b5761237b6144f2565b016020015160f81c901b9190911790600101612337565b5091989097509095509350505050565b5f8181525f8051602061492a83398151915260205260408082208151610100810190925280545f805160206148ea83398151915293929190829060ff1660058111156123f0576123f06140a1565b6005811115612401576124016140a1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612489576124896140a1565b146124e55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610529565b60408101516001600160a01b0316336001600160a01b03161461255f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610529565b61256c8160a00151613160565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156125b0576125b06140a1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61267c8461267681611838565b5f6119e1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126ab908590600401614112565b6020604051808303815f875af11580156126c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126eb9190614144565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8051602061490a83398151915280546001190161277157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206148aa833981519152906001600160401b03166127c36040860160208701614016565b6001600160401b031610156128325760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610529565b600381015461284460208601866145fb565b61ffff1610158015612868575061271061286160208601866145fb565b61ffff1611155b6128845760405162461bcd60e51b815260040161052990614616565b80548310801590612899575080600101548311155b6128f75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610529565b825f612902826109fe565b90505f61290f8883613301565b5f8181526005860160205260409020909150879061292d8282614661565b509098975050505050505050565b60015f8051602061490a83398151915255565b5f8082516027146129715760405162461bcd60e51b815260040161052990614519565b5f805b60028110156129c0576129888160016144df565b61299390600861420d565b61ffff168582815181106129a9576129a96144f2565b016020015160f81c901b9190911790600101612974565b5061ffff8116156129e35760405162461bcd60e51b815260040161052990614562565b5f805b6004811015612a3e576129fa8160036144df565b612a0590600861420d565b63ffffffff1686612a17836002614506565b81518110612a2757612a276144f2565b016020015160f81c901b91909117906001016129e6565b5063ffffffff8116600214612a655760405162461bcd60e51b8152600401610529906145a5565b5f805b6020811015612aba57612a7c81601f6144df565b612a8790600861420d565b87612a93836006614506565b81518110612aa357612aa36144f2565b016020015160f81c901b9190911790600101612a68565b505f86602681518110612acf57612acf6144f2565b016020015191976001600160f81b03199092161515965090945050505050565b612af76137cb565b612b0081613816565b50565b5f612b0c612740565b5f805160206148aa8339815191525f612b24846109fe565b90505f612b30876118ba565b9050600281516005811115612b4757612b476140a1565b14612ba65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610529565b5f828260a00151612bb79190614224565b60048501546060840151919250612bd9916001600160401b03909116906146b7565b6001600160401b0316816001600160401b03161115612c585760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610529565b612c628882611999565b5f612c6c89611838565b90505f8982604051602001612c9892919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612cb985613160565b5f6005600160991b0163ee5b48eb612cd28d86886119e1565b6040518263ffffffff1660e01b8152600401612cee9190614112565b6020604051808303815f875af1158015612d0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d2e9190614144565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612db657612db66140a1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611bf960015f8051602061490a83398151915255565b5f808251602e14612f185760405162461bcd60e51b815260040161052990614519565b5f805b6002811015612f6757612f2f8160016144df565b612f3a90600861420d565b61ffff16858281518110612f5057612f506144f2565b016020015160f81c901b9190911790600101612f1b565b5061ffff811615612f8a5760405162461bcd60e51b815260040161052990614562565b5f805b6004811015612fe557612fa18160036144df565b612fac90600861420d565b63ffffffff1686612fbe836002614506565b81518110612fce57612fce6144f2565b016020015160f81c901b9190911790600101612f8d565b5063ffffffff811660041461300c5760405162461bcd60e51b8152600401610529906145a5565b5f805b60208110156130615761302381601f6144df565b61302e90600861420d565b8761303a836006614506565b8151811061304a5761304a6144f2565b016020015160f81c901b919091179060010161300f565b505f805b60088110156130c0576130798160076144df565b61308490600861420d565b6001600160401b031688613099836026614506565b815181106130a9576130a96144f2565b016020015160f81c901b9190911790600101613065565b5090969095509350505050565b804710156130f05760405163cd78605960e01b8152306004820152602401610529565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613139576040519150601f19603f3d011682016040523d82523d5f602084013e61313e565b606091505b50509050806114a957604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206148ea8339815191529060ff165f0361319e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906131e690836144df565b10613202576001600160401b0384166040830152808252613221565b83826040018181516132149190614224565b6001600160401b03169052505b5f82602001518360400151606461323891906146b7565b61324291906146e2565b600285015490915060ff90811690821611156132bd5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610529565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f5f805160206148ea833981519152426133216040860160208701614016565b6001600160401b031611801561335a57506133426040850160208601614016565b6001600160401b0316613358426202a300614506565b115b6133bc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610529565b83356134145760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610529565b83355f908152600782016020526040902054156134845760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610529565b6134916040850185614707565b90506030146134f85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610529565b61350183613160565b5f8061359b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906135469190614016565b6001600160401b0316815260200161356160408a018a614707565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613880565b5f828152600586016020526040902091935091506135b98282614794565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906135e6908590600401614112565b6020604051808303815f875af1158015613602573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136269190614144565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156136a8576136a86140a1565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161379d91908e01908e01614016565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661381457604051631afcd79f60e31b815260040160405180910390fd5b565b61381e6137cb565b61382781613c25565b612b006060820135608083013561384460c0850160a08601614016565b61385460e0860160c087016145fb565b61ffff16613869610100870160e08801614853565b61387b61012088016101008901614873565b613c46565b5f60608260800151516030146138ea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610529565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613961576139218160016144df565b61392c90600861420d565b5081515f90839083908110613943576139436144f2565b60200101906001600160f81b03191690815f1a90535060010161390d565b505f5b60048110156139bf576139788160036144df565b61398390600861420d565b505f82613991836002614506565b815181106139a1576139a16144f2565b60200101906001600160f81b03191690815f1a905350600101613964565b505f5b6020811015613a1c57845181602081106139de576139de6144f2565b1a60f81b826139ee836006614506565b815181106139fe576139fe6144f2565b60200101906001600160f81b03191690815f1a9053506001016139c2565b505f5b6020811015613a7c5784602001518160208110613a3e57613a3e6144f2565b1a60f81b82613a4e836026614506565b81518110613a5e57613a5e6144f2565b60200101906001600160f81b03191690815f1a905350600101613a1f565b505f5b6008811015613af057613a938160076144df565b613a9e90600861420d565b60ff1685604001516001600160401b0316901c60f81b82826046613ac29190614506565b81518110613ad257613ad26144f2565b60200101906001600160f81b03191690815f1a905350600101613a7f565b505f5b6030811015613b5b5784608001518181518110613b1257613b126144f2565b01602001516001600160f81b03191682613b2d83604e614506565b81518110613b3d57613b3d6144f2565b60200101906001600160f81b03191690815f1a905350600101613af3565b505f5b6008811015613bcd57613b728160076144df565b613b7d90600861420d565b60608601516001600160401b0390811691161c60f81b82613b9f83607e614506565b81518110613baf57613baf6144f2565b60200101906001600160f81b03191690815f1a905350600101613b5e565b50600281604051613bde919061488e565b602060405180830381855afa158015613bf9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c1c9190614144565b94909350915050565b613c2d6137cb565b613c35613e2b565b613c3d613e3b565b612b0081613e43565b613c4e6137cb565b5f805160206148aa83398151915283613cba5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610529565b612710841115613cdc5760405162461bcd60e51b815260040161052990614616565b85871115613d445760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610529565b600a60ff841611801590613d5a57505f8360ff16115b613dc45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610529565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b613e336137cb565b613814613eaf565b6138146137cb565b613e4b6137cb565b80355f805160206148ea83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e956060830160408401614853565b600291909101805460ff191660ff90921691909117905550565b61293b6137cb565b508054613ec390614244565b5f825580601f10613ed2575050565b601f0160209004905f5260205f2090810190612b009190613f32565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613f46575f8155600101613f33565b5090565b8015158114612b00575f80fd5b803563ffffffff81168114613f6a575f80fd5b919050565b5f805f60608486031215613f81575f80fd5b833592506020840135613f9381613f4a565b9150613fa160408501613f57565b90509250925092565b5f60208284031215613fba575f80fd5b5035919050565b5f60208284031215613fd1575f80fd5b611bf982613f57565b5f8060408385031215613feb575f80fd5b613ff483613f57565b946020939093013593505050565b6001600160401b0381168114612b00575f80fd5b5f60208284031215614026575f80fd5b8135611bf981614002565b5f808284036060811215614043575f80fd5b83356001600160401b03811115614058575f80fd5b840160608187031215614069575f80fd5b92506040601f198201121561407c575f80fd5b506020830190509250929050565b5f610120828403121561409b575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140e9576140e96140b5565b5092915050565b5f5b8381101561410a5781810151838201526020016140f2565b50505f910152565b602081525f82518060208401526141308160408501602087016140f0565b601f01601f19169190910160400192915050565b5f60208284031215614154575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261417d5761417d61415b565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a0e57610a0e6140b5565b6001600160401b038181168382160190808211156140e9576140e96140b5565b600181811c9082168061425857607f821691505b60208210810361409b57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546142cf81614244565b806020870152604060018084165f81146142f0576001811461430c57614339565b60ff19851660408a0152604084151560051b8a01019550614339565b895f5260205f205f5b858110156143305781548b8201860152908301908801614315565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561437d5761437d614347565b60405290565b604051601f8201601f191681016001600160401b03811182821017156143ab576143ab614347565b604052919050565b6001600160a01b0381168114612b00575f80fd5b8051613f6a81613f4a565b5f80604083850312156143e3575f80fd5b82516001600160401b03808211156143f9575f80fd5b908401906060828703121561440c575f80fd5b61441461435b565b82518152602080840151614427816143b3565b8282015260408401518381111561443c575f80fd5b80850194505087601f850112614450575f80fd5b83518381111561446257614462614347565b614474601f8201601f19168301614383565b93508084528882828701011115614489575f80fd5b614498818386018488016140f0565b508260408301528195506144ad8188016143c7565b9450505050509250929050565b5f6001600160401b038083168181036144d5576144d56140b5565b6001019392505050565b81810381811115610a0e57610a0e6140b5565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a0e57610a0e6140b5565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114612b00575f80fd5b5f6020828403121561460b575f80fd5b8135611bf9816145ec565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561466c816145ec565b61ffff8116905081548161ffff198216178355602084013561468d81614002565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b038181168382160280821691908281146146da576146da6140b5565b505092915050565b5f6001600160401b03808416806146fb576146fb61415b565b92169190910492915050565b5f808335601e1984360301811261471c575f80fd5b8301803591506001600160401b03821115614735575f80fd5b602001915036819003821315614749575f80fd5b9250929050565b601f8211156114a957805f5260205f20601f840160051c810160208510156147755750805b601f840160051c820191505b81811015610d15575f8155600101614781565b81516001600160401b038111156147ad576147ad614347565b6147c1816147bb8454614244565b84614750565b602080601f8311600181146147f4575f84156147dd5750858301515b5f19600386901b1c1916600185901b17855561484b565b5f85815260208120601f198616915b8281101561482257888601518255948401946001909101908401614803565b508582101561483f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614863575f80fd5b813560ff81168114611bf9575f80fd5b5f60208284031215614883575f80fd5b8135611bf9816143b3565b5f825161489f8184602087016140f0565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614b02380380614b0283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149b58061014d5f395ff3fe608060405260043610610110575f3560e01c806366435abf1161009d578063b771b3bc11610062578063b771b3bc14610322578063ba3a4b9714610354578063bee0a03f14610373578063c123c6db14610392578063c599e24f146103b1575f80fd5b806366435abf1461029357806376f78621146102b257806380a8ad94146102d157806398f3e2b4146102e4578063a3a65e4814610303575f80fd5b80632e2194d8116100e35780632e2194d8146101d757806335455ded1461020e578063467ef06f146102365780635297fae6146102555780636206585614610274575f80fd5b80630118acc4146101145780630322ed98146101355780630cdd098514610154578063151d30d1146101b1575b5f80fd5b34801561011f575f80fd5b5061013361012e366004613fce565b6103c4565b005b348015610140575f80fd5b5061013361014f366004614009565b61082e565b34801561015f575f80fd5b5061019e61016e366004614009565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101bc575f80fd5b506101c5600a81565b60405160ff90911681526020016101a8565b3480156101e2575f80fd5b506101f66101f1366004614009565b6109fe565b6040516001600160401b0390911681526020016101a8565b348015610219575f80fd5b5061022361271081565b60405161ffff90911681526020016101a8565b348015610241575f80fd5b50610133610250366004614020565b610a14565b348015610260575f80fd5b5061013361026f366004614039565b610a3f565b34801561027f575f80fd5b5061019e61028e366004614075565b610c0f565b34801561029e575f80fd5b506101f66102ad366004614009565b610c28565b3480156102bd575f80fd5b506101336102cc366004613fce565b610c3c565b61019e6102df366004614090565b610d1c565b3480156102ef575f80fd5b506101336102fe366004614039565b610d48565b34801561030e575f80fd5b5061013361031d366004614020565b610f57565b34801561032d575f80fd5b5061033c6005600160991b0181565b6040516001600160a01b0390911681526020016101a8565b34801561035f575f80fd5b5061013361036e366004614009565b611114565b34801561037e575f80fd5b5061013361038d366004614009565b61139a565b34801561039d575f80fd5b506101336103ac3660046140e9565b6114ae565b61019e6103bf366004614009565b611590565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061490983398151915291841561041657610413828561159c565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561044857610448614100565b600481111561045957610459614100565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104e0576104e0614100565b146105325760405162461bcd60e51b815260206004820152602a60248201525f805160206149298339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105975760405162461bcd60e51b815260206004820152603360248201525f805160206149298339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610529565b5f6105a184611838565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105ee576105ee614100565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106c0856118ba565b905082606001516001600160401b03168160a001516001600160401b0316116107375760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610529565b5f83606001518260a0015161074c9190614128565b90506107588682611999565b5f6005600160991b0163ee5b48eb6107718987866119e1565b6040518263ffffffff1660e01b815260040161078d9190614171565b6020604051808303815f875af11580156107a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107cd91906141a3565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061498983398151915260205260408082208151610100810190925280545f8051602061494983398151915293929190829060ff16600581111561087c5761087c614100565b600581111561088d5761088d614100565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561091257610912614100565b146109775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610529565b6005600160991b016001600160a01b031663ee5b48eb61099c8584608001515f6119e1565b6040518263ffffffff1660e01b81526004016109b89190614171565b6020604051808303815f875af11580156109d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f891906141a3565b50505050565b5f610a0e64e8d4a51000836141ce565b92915050565b5f610a1e82611c00565b9050610a3b81606001516001600160401b03168260400151611f73565b5050565b5f805160206149098339815191525f610a5784611f86565b90505f80610a688360400151612167565b50915091505f610a77836118ba565b9050816001600160401b031681608001516001600160401b03161015610aaf5760405162461bcd60e51b8152600401610529906141e1565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610af45760405162461bcd60e51b815260040161052990614223565b60015f87815260068701602052604090205460ff166004811115610b1a57610b1a614100565b14610b835760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610529565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a0e6001600160401b03831664e8d4a5100061426c565b5f610c32826118ba565b60a0015192915050565b5f805160206149098339815191525f610c54856118ba565b5f86815260058401602052604090205460c0820151919250610c8691620100009091046001600160401b031690614283565b6001600160401b0316421015610cfa5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610529565b8315610d0c57610d0a858461159c565b505b610d15856123a2565b5050505050565b5f610d25612740565b610d30838334612777565b9050610a0e60015f8051602061496983398151915255565b5f805160206149098339815191525f610d6084611f86565b90505f80610d718360400151612167565b50915091505f610d80836118ba565b9050816001600160401b031681608001516001600160401b03161015610db85760405162461bcd60e51b8152600401610529906141e1565b5f8681526006860160205260409020600301546001600160401b0380841691161115610df65760405162461bcd60e51b815260040161052990614223565b60035f87815260068701602052604090205460ff166004811115610e1c57610e1c614100565b14610e705760405162461bcd60e51b815260206004820152603160248201525f805160206149298339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610529565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f1591611f73565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206149498339815191525f610f6f83611f86565b90505f80610f80836040015161294e565b9150915080610fe25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610529565b5f82815260058501602052604081208054610ffc906142a3565b905011801561102e575060015f83815260068601602052604090205460ff16600581111561102c5761102c614100565b145b61104a5760405162461bcd60e51b8152600401610529906142d5565b5f828152600585016020526040812061106291613f16565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061490983398151915293929190829060ff16600481111561117557611175614100565b600481111561118657611186614100565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561120d5761120d614100565b148061122b575060038151600481111561122957611229614100565b145b61127f5760405162461bcd60e51b815260206004820152603260248201525f80516020614929833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610529565b5f61128d82604001516118ba565b905080608001516001600160401b03165f036113115760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610529565b6005600160991b016001600160a01b031663ee5b48eb61133e846040015184608001518560a001516119e1565b6040518263ffffffff1660e01b815260040161135a9190614171565b6020604051808303815f875af1158015611376573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1591906141a3565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149498339815191529291906113e2906142a3565b9050118015611414575060015f83815260068301602052604090205460ff16600581111561141257611412614100565b145b6114305760405162461bcd60e51b8152600401610529906142d5565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611469919060040161431c565b6020604051808303815f875af1158015611485573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a991906141a3565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806114f7575080546001600160401b03808416911610155b156115155760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561153f83612aef565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a0e823334612b03565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115e7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261160e9190810190614431565b91509150806116715760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610529565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d891906141a3565b82511461173c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610529565b60208201516001600160a01b0316156117b25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610529565b5f806117c18460400151612ef5565b9150915081871461182e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610529565b9695505050505050565b5f8181525f805160206149898339815191526020526040812060030180545f80516020614949833981519152916001600160401b03909116908361187b83614519565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6118c2613f4d565b5f8281525f805160206149898339815191526020526040908190208151610100810190925280545f80516020614949833981519152929190829060ff16600581111561191057611910614100565b600581111561192157611921614100565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614989833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5a57611a1a81600161453e565b611a2590600861426c565b5081515f90839083908110611a3c57611a3c614551565b60200101906001600160f81b03191690815f1a905350600101611a06565b505f5b6004811015611abd57611a7181600361453e565b611a7c90600861426c565b6001901c60f81b82611a8f836002614565565b81518110611a9f57611a9f614551565b60200101906001600160f81b03191690815f1a905350600101611a5d565b505f5b6020811015611b1f57611ad481601f61453e565b611adf90600861426c565b86901c60f81b82611af1836006614565565b81518110611b0157611b01614551565b60200101906001600160f81b03191690815f1a905350600101611ac0565b505f5b6008811015611b8a57611b3681600761453e565b611b4190600861426c565b6001600160401b038616901c60f81b82611b5c836026614565565b81518110611b6c57611b6c614551565b60200101906001600160f81b03191690815f1a905350600101611b22565b505f5b6008811015611bf557611ba181600761453e565b611bac90600861426c565b6001600160401b038516901c60f81b82611bc783602e614565565b81518110611bd757611bd7614551565b60200101906001600160f81b03191690815f1a905350600101611b8d565b5090505b9392505050565b611c08613f4d565b5f805160206149498339815191525f611c2084611f86565b90505f80611c31836040015161294e565b915091508015611c965760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610529565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611cc857611cc8614100565b6005811115611cd957611cd9614100565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d6057611d60614100565b1480611d7e5750600182516005811115611d7c57611d7c614100565b145b611ddd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610529565b600382516005811115611df257611df2614100565b03611dff57506004611e03565b5060055b6020808301515f90815260078801909152604081205581816005811115611e2c57611e2c614100565b90816005811115611e3f57611e3f614100565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611e7357611e73614100565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f3e57611f3e614100565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a3b6001600160a01b038216836130cd565b60408051606080820183525f8083526020830181905292820152905f805160206149498339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ffb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120229190810190614431565b91509150806120895760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610529565b82548251146120ec5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610529565b60208201516001600160a01b03161561215f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610529565b509392505050565b5f805f835160361461218b5760405162461bcd60e51b815260040161052990614578565b5f805b60028110156121da576121a281600161453e565b6121ad90600861426c565b61ffff168682815181106121c3576121c3614551565b016020015160f81c901b919091179060010161218e565b5061ffff8116156121fd5760405162461bcd60e51b8152600401610529906145c1565b5f805b60048110156122585761221481600361453e565b61221f90600861426c565b63ffffffff1687612231836002614565565b8151811061224157612241614551565b016020015160f81c901b9190911790600101612200565b5063ffffffff811660031461227f5760405162461bcd60e51b815260040161052990614604565b5f805b60208110156122d45761229681601f61453e565b6122a190600861426c565b886122ad836006614565565b815181106122bd576122bd614551565b016020015160f81c901b9190911790600101612282565b505f805b6008811015612333576122ec81600761453e565b6122f790600861426c565b6001600160401b03168961230c836026614565565b8151811061231c5761231c614551565b016020015160f81c901b91909117906001016122d8565b505f805b60088110156123925761234b81600761453e565b61235690600861426c565b6001600160401b03168a61236b83602e614565565b8151811061237b5761237b614551565b016020015160f81c901b9190911790600101612337565b5091989097509095509350505050565b5f8181525f8051602061498983398151915260205260408082208151610100810190925280545f8051602061494983398151915293929190829060ff1660058111156123f0576123f0614100565b600581111561240157612401614100565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561248957612489614100565b146124e55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610529565b60408101516001600160a01b0316336001600160a01b03161461255f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610529565b61256c8160a00151613160565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156125b0576125b0614100565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61267c8461267681611838565b5f6119e1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126ab908590600401614171565b6020604051808303815f875af11580156126c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126eb91906141a3565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8051602061496983398151915280546001190161277157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614909833981519152906001600160401b03166127c36040860160208701614075565b6001600160401b031610156128325760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610529565b6003810154612844602086018661465a565b61ffff16101580156128685750612710612861602086018661465a565b61ffff1611155b6128845760405162461bcd60e51b815260040161052990614675565b80548310801590612899575080600101548311155b6128f75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610529565b825f612902826109fe565b90505f61290f8883613301565b5f8181526005860160205260409020909150879061292d82826146c0565b509098975050505050505050565b60015f8051602061496983398151915255565b5f8082516027146129715760405162461bcd60e51b815260040161052990614578565b5f805b60028110156129c05761298881600161453e565b61299390600861426c565b61ffff168582815181106129a9576129a9614551565b016020015160f81c901b9190911790600101612974565b5061ffff8116156129e35760405162461bcd60e51b8152600401610529906145c1565b5f805b6004811015612a3e576129fa81600361453e565b612a0590600861426c565b63ffffffff1686612a17836002614565565b81518110612a2757612a27614551565b016020015160f81c901b91909117906001016129e6565b5063ffffffff8116600214612a655760405162461bcd60e51b815260040161052990614604565b5f805b6020811015612aba57612a7c81601f61453e565b612a8790600861426c565b87612a93836006614565565b81518110612aa357612aa3614551565b016020015160f81c901b9190911790600101612a68565b505f86602681518110612acf57612acf614551565b016020015191976001600160f81b03199092161515965090945050505050565b612af76137cb565b612b0081613816565b50565b5f612b0c612740565b5f805160206149098339815191525f612b24846109fe565b90505f612b30876118ba565b9050600281516005811115612b4757612b47614100565b14612ba65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610529565b5f828260a00151612bb79190614283565b60048501546060840151919250612bd9916001600160401b0390911690614716565b6001600160401b0316816001600160401b03161115612c585760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610529565b612c628882611999565b5f612c6c89611838565b90505f8982604051602001612c9892919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612cb985613160565b5f6005600160991b0163ee5b48eb612cd28d86886119e1565b6040518263ffffffff1660e01b8152600401612cee9190614171565b6020604051808303815f875af1158015612d0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d2e91906141a3565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612db657612db6614100565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611bf960015f8051602061496983398151915255565b5f808251602e14612f185760405162461bcd60e51b815260040161052990614578565b5f805b6002811015612f6757612f2f81600161453e565b612f3a90600861426c565b61ffff16858281518110612f5057612f50614551565b016020015160f81c901b9190911790600101612f1b565b5061ffff811615612f8a5760405162461bcd60e51b8152600401610529906145c1565b5f805b6004811015612fe557612fa181600361453e565b612fac90600861426c565b63ffffffff1686612fbe836002614565565b81518110612fce57612fce614551565b016020015160f81c901b9190911790600101612f8d565b5063ffffffff811660041461300c5760405162461bcd60e51b815260040161052990614604565b5f805b60208110156130615761302381601f61453e565b61302e90600861426c565b8761303a836006614565565b8151811061304a5761304a614551565b016020015160f81c901b919091179060010161300f565b505f805b60088110156130c05761307981600761453e565b61308490600861426c565b6001600160401b031688613099836026614565565b815181106130a9576130a9614551565b016020015160f81c901b9190911790600101613065565b5090969095509350505050565b804710156130f05760405163cd78605960e01b8152306004820152602401610529565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613139576040519150601f19603f3d011682016040523d82523d5f602084013e61313e565b606091505b50509050806114a957604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149498339815191529060ff165f0361319e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906131e6908361453e565b10613202576001600160401b0384166040830152808252613221565b83826040018181516132149190614283565b6001600160401b03169052505b5f8260200151836040015160646132389190614716565b6132429190614741565b600285015490915060ff90811690821611156132bd5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610529565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f5f80516020614949833981519152426133216040860160208701614075565b6001600160401b031611801561335a57506133426040850160208601614075565b6001600160401b0316613358426202a300614565565b115b6133bc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610529565b83356134145760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610529565b83355f908152600782016020526040902054156134845760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610529565b6134916040850185614766565b90506030146134f85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610529565b61350183613160565b5f8061359b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906135469190614075565b6001600160401b0316815260200161356160408a018a614766565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613880565b5f828152600586016020526040902091935091506135b982826147f3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906135e6908590600401614171565b6020604051808303815f875af1158015613602573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061362691906141a3565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156136a8576136a8614100565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161379d91908e01908e01614075565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661381457604051631afcd79f60e31b815260040160405180910390fd5b565b61381e6137cb565b61382781613c25565b612b006060820135608083013561384460c0850160a08601614075565b61385460e0860160c0870161465a565b61ffff16613869610100870160e088016148b2565b61387b610120880161010089016148d2565b613c46565b5f60608260800151516030146138ea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610529565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156139615761392181600161453e565b61392c90600861426c565b5081515f9083908390811061394357613943614551565b60200101906001600160f81b03191690815f1a90535060010161390d565b505f5b60048110156139bf5761397881600361453e565b61398390600861426c565b505f82613991836002614565565b815181106139a1576139a1614551565b60200101906001600160f81b03191690815f1a905350600101613964565b505f5b6020811015613a1c57845181602081106139de576139de614551565b1a60f81b826139ee836006614565565b815181106139fe576139fe614551565b60200101906001600160f81b03191690815f1a9053506001016139c2565b505f5b6020811015613a7c5784602001518160208110613a3e57613a3e614551565b1a60f81b82613a4e836026614565565b81518110613a5e57613a5e614551565b60200101906001600160f81b03191690815f1a905350600101613a1f565b505f5b6008811015613af057613a9381600761453e565b613a9e90600861426c565b60ff1685604001516001600160401b0316901c60f81b82826046613ac29190614565565b81518110613ad257613ad2614551565b60200101906001600160f81b03191690815f1a905350600101613a7f565b505f5b6030811015613b5b5784608001518181518110613b1257613b12614551565b01602001516001600160f81b03191682613b2d83604e614565565b81518110613b3d57613b3d614551565b60200101906001600160f81b03191690815f1a905350600101613af3565b505f5b6008811015613bcd57613b7281600761453e565b613b7d90600861426c565b60608601516001600160401b0390811691161c60f81b82613b9f83607e614565565b81518110613baf57613baf614551565b60200101906001600160f81b03191690815f1a905350600101613b5e565b50600281604051613bde91906148ed565b602060405180830381855afa158015613bf9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c1c91906141a3565b94909350915050565b613c2d6137cb565b613c35613e8a565b613c3d613e9a565b612b0081613ea2565b613c4e6137cb565b5f8051602061490983398151915283613cba5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610529565b612710841115613cdc5760405162461bcd60e51b815260040161052990614675565b85871115613d445760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610529565b5f8360ff1611613db15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610529565b600a60ff84161115613e235760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610529565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b613e926137cb565b613814613f0e565b6138146137cb565b613eaa6137cb565b80355f8051602061494983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613ef460608301604084016148b2565b600291909101805460ff191660ff90921691909117905550565b61293b6137cb565b508054613f22906142a3565b5f825580601f10613f31575050565b601f0160209004905f5260205f2090810190612b009190613f91565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613fa5575f8155600101613f92565b5090565b8015158114612b00575f80fd5b803563ffffffff81168114613fc9575f80fd5b919050565b5f805f60608486031215613fe0575f80fd5b833592506020840135613ff281613fa9565b915061400060408501613fb6565b90509250925092565b5f60208284031215614019575f80fd5b5035919050565b5f60208284031215614030575f80fd5b611bf982613fb6565b5f806040838503121561404a575f80fd5b61405383613fb6565b946020939093013593505050565b6001600160401b0381168114612b00575f80fd5b5f60208284031215614085575f80fd5b8135611bf981614061565b5f8082840360608112156140a2575f80fd5b83356001600160401b038111156140b7575f80fd5b8401606081870312156140c8575f80fd5b92506040601f19820112156140db575f80fd5b506020830190509250929050565b5f61012082840312156140fa575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561414857614148614114565b5092915050565b5f5b83811015614169578181015183820152602001614151565b50505f910152565b602081525f825180602084015261418f81604085016020870161414f565b601f01601f19169190910160400192915050565b5f602082840312156141b3575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826141dc576141dc6141ba565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a0e57610a0e614114565b6001600160401b0381811683821601908082111561414857614148614114565b600181811c908216806142b757607f821691505b6020821081036140fa57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461432e816142a3565b806020870152604060018084165f811461434f576001811461436b57614398565b60ff19851660408a0152604084151560051b8a01019550614398565b895f5260205f205f5b8581101561438f5781548b8201860152908301908801614374565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156143dc576143dc6143a6565b60405290565b604051601f8201601f191681016001600160401b038111828210171561440a5761440a6143a6565b604052919050565b6001600160a01b0381168114612b00575f80fd5b8051613fc981613fa9565b5f8060408385031215614442575f80fd5b82516001600160401b0380821115614458575f80fd5b908401906060828703121561446b575f80fd5b6144736143ba565b8251815260208084015161448681614412565b8282015260408401518381111561449b575f80fd5b80850194505087601f8501126144af575f80fd5b8351838111156144c1576144c16143a6565b6144d3601f8201601f191683016143e2565b935080845288828287010111156144e8575f80fd5b6144f78183860184880161414f565b5082604083015281955061450c818801614426565b9450505050509250929050565b5f6001600160401b0380831681810361453457614534614114565b6001019392505050565b81810381811115610a0e57610a0e614114565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a0e57610a0e614114565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114612b00575f80fd5b5f6020828403121561466a575f80fd5b8135611bf98161464b565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356146cb8161464b565b61ffff8116905081548161ffff19821617835560208401356146ec81614061565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b0381811683821602808216919082811461473957614739614114565b505092915050565b5f6001600160401b038084168061475a5761475a6141ba565b92169190910492915050565b5f808335601e1984360301811261477b575f80fd5b8301803591506001600160401b03821115614794575f80fd5b6020019150368190038213156147a8575f80fd5b9250929050565b601f8211156114a957805f5260205f20601f840160051c810160208510156147d45750805b601f840160051c820191505b81811015610d15575f81556001016147e0565b81516001600160401b0381111561480c5761480c6143a6565b6148208161481a84546142a3565b846147af565b602080601f831160018114614853575f841561483c5750858301515b5f19600386901b1c1916600185901b1785556148aa565b5f85815260208120601f198616915b8281101561488157888601518255948401946001909101908401614862565b508582101561489e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156148c2575f80fd5b813560ff81168114611bf9575f80fd5b5f602082840312156148e2575f80fd5b8135611bf981614412565b5f82516148fe81846020870161414f565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/tests/flows/staking/erc20_delegation.go b/tests/flows/staking/erc20_delegation.go index 9f8c7485f..fe1305516 100644 --- a/tests/flows/staking/erc20_delegation.go +++ b/tests/flows/staking/erc20_delegation.go @@ -51,7 +51,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // Register a validator // var validationID ids.ID // To be used in the delisting step - validatorStake := big.NewInt(1e18) + validatorStake := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) validatorWeight, err := stakingManager.ValueToWeight( &bind.CallOpts{}, validatorStake, diff --git a/tests/flows/staking/erc20_token_staking.go b/tests/flows/staking/erc20_token_staking.go index fb874c7f6..7c3fd4e07 100644 --- a/tests/flows/staking/erc20_token_staking.go +++ b/tests/flows/staking/erc20_token_staking.go @@ -53,7 +53,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // // Register a validator // - stakeAmount := big.NewInt(1e18) + stakeAmount := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) weight, err := stakingManager.ValueToWeight( &bind.CallOpts{}, stakeAmount, @@ -67,7 +67,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { pChainInfo, stakingManager, stakingManagerAddress, - weight, erc20, stakeAmount, ) diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go index 2dc915c5c..77de84389 100644 --- a/tests/flows/staking/native_delegation.go +++ b/tests/flows/staking/native_delegation.go @@ -51,7 +51,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // Register a validator // var validationID ids.ID // To be used in the delisting step - validatorStake := big.NewInt(1e18) + validatorStake := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) validatorWeight, err := stakingManager.ValueToWeight( &bind.CallOpts{}, validatorStake, diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index 46b11bf2f..12b7b8a94 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -55,7 +55,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Register a validator // var validationID ids.ID // To be used in the delisting step - stakeAmount := big.NewInt(1e18) + stakeAmount := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) weight, err := stakingManager.ValueToWeight( &bind.CallOpts{}, stakeAmount, @@ -73,7 +73,6 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { pChainInfo, stakingManager, stakingManagerContractAddress, - weight, nodeID, blsPublicKey, stakeAmount, diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index 367121ca0..21e9b92c0 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -3,7 +3,6 @@ package staking import ( "context" "math/big" - "time" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" @@ -151,10 +150,12 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { SubnetID: subnetAInfo.SubnetID, MaximumHourlyChurn: 0, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: common.Address{}, + MinimumStakeAmount: big.NewInt(0).SetUint64(utils.DefaultMinStakeAmount), + MaximumStakeAmount: big.NewInt(0).SetUint64(utils.DefaultMaxStakeAmount), + MinimumStakeDuration: utils.DefaultMinStakeDurationSeconds, + MinimumDelegationFeeBips: utils.DefaultMinDelegateFeeBips, + MaximumStakeMultiplier: uint8(1), + RewardCalculator: common.Address{}, }, ) Expect(err).Should(BeNil()) @@ -182,7 +183,6 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { pChainInfo, posValidatorManager, proxyAddress, - posWeight, posNodeID, blsPublicKey, stakeAmount, diff --git a/tests/utils/staking.go b/tests/utils/staking.go index eb2687745..184443c6c 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -27,8 +27,10 @@ import ( ) const ( - defaultMinDelegateFeeBips = 1 - defaultMinStakeDurationSeconds = 1 + DefaultMinDelegateFeeBips uint16 = 1 + DefaultMinStakeDurationSeconds uint64 = 1 + DefaultMinStakeAmount uint64 = 1e18 + DefaultMaxStakeAmount uint64 = 10e18 ) // @@ -76,10 +78,10 @@ func DeployAndInitializeNativeTokenStakingManager( SubnetID: subnet.SubnetID, MaximumHourlyChurn: 0, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: defaultMinStakeDurationSeconds, - MinimumDelegationFeeBips: defaultMinDelegateFeeBips, + MinimumStakeAmount: big.NewInt(0).SetUint64(DefaultMinStakeAmount), + MaximumStakeAmount: big.NewInt(0).SetUint64(DefaultMaxStakeAmount), + MinimumStakeDuration: DefaultMinStakeDurationSeconds, + MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, MaximumStakeMultiplier: uint8(1), RewardCalculator: common.Address{}, }, @@ -138,10 +140,10 @@ func DeployAndInitializeERC20TokenStakingManager( SubnetID: subnet.SubnetID, MaximumHourlyChurn: 0, }, - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: defaultMinStakeDurationSeconds, - MinimumDelegationFeeBips: defaultMinDelegateFeeBips, + MinimumStakeAmount: big.NewInt(0).SetUint64(DefaultMinStakeAmount), + MaximumStakeAmount: big.NewInt(0).SetUint64(DefaultMaxStakeAmount), + MinimumStakeDuration: DefaultMinStakeDurationSeconds, + MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, MaximumStakeMultiplier: uint8(1), RewardCalculator: common.Address{}, }, @@ -226,8 +228,8 @@ func InitializeNativeValidatorRegistration( BlsPublicKey: blsPublicKey[:], }, nativetokenstakingmanager.PoSValidatorRequirements{ - DelegationFeeBips: defaultMinDelegateFeeBips, - MinStakeDuration: defaultMinStakeDurationSeconds, + DelegationFeeBips: DefaultMinDelegateFeeBips, + MinStakeDuration: DefaultMinStakeDurationSeconds, }, ) Expect(err).Should(BeNil()) @@ -270,8 +272,8 @@ func InitializeERC20ValidatorRegistration( BlsPublicKey: blsPublicKey[:], }, erc20tokenstakingmanager.PoSValidatorRequirements{ - DelegationFeeBips: defaultMinDelegateFeeBips, - MinStakeDuration: defaultMinStakeDurationSeconds, + DelegationFeeBips: DefaultMinDelegateFeeBips, + MinStakeDuration: DefaultMinStakeDurationSeconds, }, stakeAmount, ) @@ -406,7 +408,6 @@ func InitializeAndCompleteNativeValidatorRegistration( pChainInfo interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, stakingManagerContractAddress common.Address, - weight uint64, nodeID ids.ID, blsPublicKey [bls.PublicKeyLen]byte, stakeAmount *big.Int, @@ -424,6 +425,11 @@ func InitializeAndCompleteNativeValidatorRegistration( // (Sending to the P-Chain will be skipped for now) signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + weight, err := stakingManager.ValueToWeight( + &bind.CallOpts{}, + stakeAmount, + ) + Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) ValidateRegisterSubnetValidatorMessage( signedWarpMessage, @@ -469,7 +475,6 @@ func InitializeAndCompleteERC20ValidatorRegistration( pChainInfo interfaces.SubnetTestInfo, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, stakingManagerAddress common.Address, - weight uint64, erc20 *exampleerc20.ExampleERC20, stakeAmount *big.Int, ) ids.ID { @@ -492,6 +497,11 @@ func InitializeAndCompleteERC20ValidatorRegistration( // (Sending to the P-Chain will be skipped for now) signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + weight, err := stakingManager.ValueToWeight( + &bind.CallOpts{}, + stakeAmount, + ) + Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) ValidateRegisterSubnetValidatorMessage( signedWarpMessage, @@ -598,6 +608,8 @@ func InitializeEndNativeValidation( stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, validationID ids.ID, ) *types.Receipt { + // Make sure minimum stake duration has passed + time.Sleep(time.Duration(DefaultMinStakeDurationSeconds) * time.Second) opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndValidation( @@ -616,6 +628,8 @@ func InitializeEndERC20Validation( stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, validationID ids.ID, ) *types.Receipt { + // Make sure minimum stake duration has passed + time.Sleep(time.Duration(DefaultMinStakeDurationSeconds) * time.Second) opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndValidation( From 0fa897d4974256f55e09feee378c8c4a87b9f719 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 13 Sep 2024 11:19:43 -0400 Subject: [PATCH 266/545] Review fixes --- .../ERC20TokenStakingManager.go | 20 +++++++-------- .../NativeTokenStakingManager.go | 20 +++++++-------- .../PoAValidatorManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 25 ++++++++----------- contracts/staking/ValidatorManager.sol | 4 +++ .../interfaces/IPoSValidatorManager.sol | 4 +-- .../tests/ERC20TokenStakingManagerTests.t.sol | 13 +++++----- .../NativeTokenStakingManagerTests.t.sol | 6 ++--- .../tests/PoAValidatorManagerTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 2 +- .../staking/tests/ValidatorManagerTests.t.sol | 16 ++++++------ tests/flows/staking/poa_to_pos.go | 4 +-- tests/utils/staking.go | 8 +++--- 13 files changed, 63 insertions(+), 63 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 7bde4fbfa..307380e43 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -32,8 +32,8 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { BaseSettings ValidatorManagerSettings - MinimumStakeWeight uint64 - MaximumStakeWeight uint64 + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int MinimumStakeDuration uint64 RewardCalculator common.Address } @@ -48,8 +48,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumStakeWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614aca380380614aca83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61497d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c806376f786211161009e5780639e1bc4ef1161006e5780639e1bc4ef14610246578063a3a65e4814610259578063b771b3bc1461026c578063ba3a4b9714610292578063bee0a03f146102a5575f80fd5b806376f78621146101fa578063872e999e1461020d578063872fda641461022057806398f3e2b414610233575f80fd5b8063467ef06f116100d9578063467ef06f146101ae5780635297fae6146101c157806362065856146101d457806366435abf146101e7575f80fd5b80630118acc41461010a5780630322ed981461011f5780630cdd0985146101325780632e2194d814610183575b5f80fd5b61011d61011836600461401c565b6102b8565b005b61011d61012d366004614057565b610730565b610170610140366004614057565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610196610191366004614057565b610900565b6040516001600160401b03909116815260200161017a565b61011d6101bc36600461406e565b610916565b61011d6101cf366004614087565b610941565b6101706101e23660046140c5565b610b11565b6101966101f5366004614057565b610b2a565b61011d61020836600461401c565b610b3e565b61011d61021b3660046140f2565b610b5e565b61017061022e3660046141c2565b610c3d565b61011d610241366004614087565b610c62565b61017061025436600461425e565b610e72565b61011d61026736600461406e565b610e85565b61027a6005600160991b0181565b6040516001600160a01b03909116815260200161017a565b61011d6102a0366004614057565b611042565b61011d6102b3366004614057565b6112cf565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0260205260408120600101545f805160206148d183398151915291841561030a5761030782856113de565b90505b5f868152600284016020526040808220815161010081019092528054829060ff16600481111561033c5761033c61427e565b600481111561034d5761034d61427e565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103d4576103d461427e565b146104265760405162461bcd60e51b815260206004820152602a60248201525f805160206148f18339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461048b5760405162461bcd60e51b815260206004820152603360248201525f805160206148f18339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161041d565b5f6104958461167a565b90506104a482606001516116fc565b600382526001600160401b0342811660a0840152811660e08301525f88815260028601602052604090208251815484929190829060ff191660018360048111156104f0576104f061427e565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105c285611709565b905082606001516001600160401b03168160a001516001600160401b0316116106395760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161041d565b5f83606001518260a0015161064e91906142a6565b905061065a86826117e8565b5f6005600160991b0163ee5b48eb610673898786611830565b6040518263ffffffff1660e01b815260040161068f91906142ef565b6020604051808303815f875af11580156106ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106cf9190614321565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061495183398151915260205260408082208151610100810190925280545f8051602061491183398151915293929190829060ff16600581111561077e5761077e61427e565b600581111561078f5761078f61427e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108145761081461427e565b146108795760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb61089e8584608001515f611830565b6040518263ffffffff1660e01b81526004016108ba91906142ef565b6020604051808303815f875af11580156108d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108fa9190614321565b50505050565b5f61091064e8d4a5100083614338565b92915050565b5f61092082611a4d565b905061093d81606001516001600160401b03168260400151611dc0565b5050565b5f805160206148d18339815191525f61095984611df6565b90505f8061096a8360400151611fd7565b50915091505f61097983611709565b9050816001600160401b031681608001516001600160401b031610156109b15760405162461bcd60e51b815260040161041d90614357565b5f8681526002808701602052604090912001546001600160401b03808416600160c01b9092041611156109f65760405162461bcd60e51b815260040161041d90614399565b60015f87815260028701602052604090205460ff166004811115610a1c57610a1c61427e565b14610a855760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161041d565b5f86815260028681016020908152604092839020805460ff19168317815590910180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109106001600160401b03831664e8d4a510006143e2565b5f610b3482611709565b60a0015192915050565b8115610b5057610b4e83826113de565b505b610b5983612212565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ba7575080546001600160401b03808416911610155b15610bc55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610bf084846125b0565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80610c48866125ca565b9050610c5685828686612683565b9150505b949350505050565b5f805160206148d18339815191525f610c7a84611df6565b90505f80610c8b8360400151611fd7565b50915091505f610c9a83611709565b9050816001600160401b031681608001516001600160401b03161015610cd25760405162461bcd60e51b815260040161041d90614357565b5f8681526002860160205260409020600301546001600160401b0380841691161115610d105760405162461bcd60e51b815260040161041d90614399565b60035f87815260028701602052604090205460ff166004811115610d3657610d3661427e565b14610d8a5760405162461bcd60e51b815260206004820152603160248201525f805160206148f18339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161041d565b5f86815260028681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b0316928101839052600182015494810194909452918201546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039093015490921660e0840152610e309190611dc0565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610e7e833384612b39565b9392505050565b5f805160206149118339815191525f610e9d83611df6565b90505f80610eae8360400151612eb4565b9150915080610f105760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161041d565b5f82815260078501602052604081208054610f2a906143f9565b9050118015610f5c575060015f83815260088601602052604090205460ff166005811115610f5a57610f5a61427e565b145b610f785760405162461bcd60e51b815260040161041d90614431565b5f8281526007850160205260408120610f9091613f64565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0260205260408082208151610100810190925280545f805160206148d183398151915293929190829060ff1660048111156110a3576110a361427e565b60048111156110b4576110b461427e565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561113b5761113b61427e565b148061115957506003815160048111156111575761115761427e565b145b6111ad5760405162461bcd60e51b815260206004820152603260248201525f805160206148f1833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161041d565b5f6111bb8260400151611709565b905080608001516001600160401b03165f0361123f5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb61126c846040015184608001518560a00151611830565b6040518263ffffffff1660e01b815260040161128891906142ef565b6020604051808303815f875af11580156112a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112c89190614321565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614911833981519152929190611317906143f9565b9050118015611349575060015f83815260088301602052604090205460ff1660058111156113475761134761427e565b145b6113655760405162461bcd60e51b815260040161041d90614431565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161139e9190600401614478565b6020604051808303815f875af11580156113ba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b599190614321565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611429573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611450919081019061450d565b91509150806114b35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161041d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061151a9190614321565b82511461157e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161041d565b60208201516001600160a01b0316156115f45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161041d565b5f806116038460400151613055565b915091508187146116705760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161041d565b9695505050505050565b5f8181525f805160206149518339815191526020526040812060030180545f80516020614911833981519152916001600160401b0390911690836116bd836145df565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611706815f61322d565b50565b611711613f9b565b5f8281525f805160206149518339815191526020526040908190208151610100810190925280545f80516020614911833981519152929190829060ff16600581111561175f5761175f61427e565b60058111156117705761177061427e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614951833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118a957611869816001614604565b6118749060086143e2565b5081515f9083908390811061188b5761188b614617565b60200101906001600160f81b03191690815f1a905350600101611855565b505f5b600481101561190c576118c0816003614604565b6118cb9060086143e2565b6001901c60f81b826118de83600261462b565b815181106118ee576118ee614617565b60200101906001600160f81b03191690815f1a9053506001016118ac565b505f5b602081101561196e5761192381601f614604565b61192e9060086143e2565b86901c60f81b8261194083600661462b565b8151811061195057611950614617565b60200101906001600160f81b03191690815f1a90535060010161190f565b505f5b60088110156119d957611985816007614604565b6119909060086143e2565b6001600160401b038616901c60f81b826119ab83602661462b565b815181106119bb576119bb614617565b60200101906001600160f81b03191690815f1a905350600101611971565b505f5b6008811015611a44576119f0816007614604565b6119fb9060086143e2565b6001600160401b038516901c60f81b82611a1683602e61462b565b81518110611a2657611a26614617565b60200101906001600160f81b03191690815f1a9053506001016119dc565b50949350505050565b611a55613f9b565b5f805160206149118339815191525f611a6d84611df6565b90505f80611a7e8360400151612eb4565b915091508015611ae35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161041d565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611b1557611b1561427e565b6005811115611b2657611b2661427e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611bad57611bad61427e565b1480611bcb5750600182516005811115611bc957611bc961427e565b145b611c2a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161041d565b600382516005811115611c3f57611c3f61427e565b03611c4c57506004611c50565b5060055b6020808301515f90815260098801909152604081205581816005811115611c7957611c7961427e565b90816005811115611c8c57611c8c61427e565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611cc057611cc061427e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d8b57611d8b61427e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461093d906001600160a01b03168284613449565b60408051606080820183525f8083526020830181905292820152905f805160206149118339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e6b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e92919081019061450d565b9150915080611ef95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161041d565b8254825114611f5c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161041d565b60208201516001600160a01b031615611fcf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161041d565b509392505050565b5f805f8351603614611ffb5760405162461bcd60e51b815260040161041d9061463e565b5f805b600281101561204a57612012816001614604565b61201d9060086143e2565b61ffff1686828151811061203357612033614617565b016020015160f81c901b9190911790600101611ffe565b5061ffff81161561206d5760405162461bcd60e51b815260040161041d90614687565b5f805b60048110156120c857612084816003614604565b61208f9060086143e2565b63ffffffff16876120a183600261462b565b815181106120b1576120b1614617565b016020015160f81c901b9190911790600101612070565b5063ffffffff81166003146120ef5760405162461bcd60e51b815260040161041d906146ca565b5f805b60208110156121445761210681601f614604565b6121119060086143e2565b8861211d83600661462b565b8151811061212d5761212d614617565b016020015160f81c901b91909117906001016120f2565b505f805b60088110156121a35761215c816007614604565b6121679060086143e2565b6001600160401b03168961217c83602661462b565b8151811061218c5761218c614617565b016020015160f81c901b9190911790600101612148565b505f805b6008811015612202576121bb816007614604565b6121c69060086143e2565b6001600160401b03168a6121db83602e61462b565b815181106121eb576121eb614617565b016020015160f81c901b91909117906001016121a7565b5091989097509095509350505050565b5f8181525f8051602061495183398151915260205260408082208151610100810190925280545f8051602061491183398151915293929190829060ff1660058111156122605761226061427e565b60058111156122715761227161427e565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122f9576122f961427e565b146123555760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161041d565b60408101516001600160a01b0316336001600160a01b0316146123cf5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161041d565b6123dc8160a001516116fc565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156124205761242061427e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124ec846124e68161167a565b5f611830565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061251b9085906004016142ef565b6020604051808303815f875af1158015612537573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061255b9190614321565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b6125b86134a8565b6125c1826134f3565b61093d8161354d565b5f5f805160206148d1833981519152816125e384613601565b90505f6125ef82610900565b83549091506001600160401b0390811690821610801590612625575082546001600160401b03600160401b909104811690821611155b610c5a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad9481dd95a59da1d60ba1b606482015260840161041d565b5f61268c613637565b5f80516020614911833981519152426001600160401b0385161161270e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161041d565b6001600160401b038416612725426202a30061462b565b116127985760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161041d565b856127ef5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161041d565b5f8681526009820160205260409020541561285d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161041d565b82516030146128c45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161041d565b6128cd8561366e565b5f806129146040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613679565b5f828152600786016020526040902091935091506129328282614755565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061295f9085906004016142ef565b6020604051808303815f875af115801561297b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299f9190614321565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115612a2157612a2161427e565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610c5a60015f8051602061493183398151915255565b5f612b42613637565b5f612b4f61019184613601565b90505f805160206148d18339815191525f612b6987611709565b9050600281516005811115612b8057612b8061427e565b14612bdf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161041d565b612be88361366e565b5f838260a00151612bf99190614814565b9050612c0588826117e8565b5f612c0f8961167a565b90505f898983604051602001612c579392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c918d8688611830565b6040518263ffffffff1660e01b8152600401612cad91906142ef565b6020604051808303815f875af1158015612cc9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ced9190614321565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260028a01909152902081518154829060ff19166001836004811115612d7557612d7561427e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610e7e60015f8051602061493183398151915255565b5f808251602714612ed75760405162461bcd60e51b815260040161041d9061463e565b5f805b6002811015612f2657612eee816001614604565b612ef99060086143e2565b61ffff16858281518110612f0f57612f0f614617565b016020015160f81c901b9190911790600101612eda565b5061ffff811615612f495760405162461bcd60e51b815260040161041d90614687565b5f805b6004811015612fa457612f60816003614604565b612f6b9060086143e2565b63ffffffff1686612f7d83600261462b565b81518110612f8d57612f8d614617565b016020015160f81c901b9190911790600101612f4c565b5063ffffffff8116600214612fcb5760405162461bcd60e51b815260040161041d906146ca565b5f805b602081101561302057612fe281601f614604565b612fed9060086143e2565b87612ff983600661462b565b8151811061300957613009614617565b016020015160f81c901b9190911790600101612fce565b505f8660268151811061303557613035614617565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146130785760405162461bcd60e51b815260040161041d9061463e565b5f805b60028110156130c75761308f816001614604565b61309a9060086143e2565b61ffff168582815181106130b0576130b0614617565b016020015160f81c901b919091179060010161307b565b5061ffff8116156130ea5760405162461bcd60e51b815260040161041d90614687565b5f805b600481101561314557613101816003614604565b61310c9060086143e2565b63ffffffff168661311e83600261462b565b8151811061312e5761312e614617565b016020015160f81c901b91909117906001016130ed565b5063ffffffff811660041461316c5760405162461bcd60e51b815260040161041d906146ca565b5f805b60208110156131c15761318381601f614604565b61318e9060086143e2565b8761319a83600661462b565b815181106131aa576131aa614617565b016020015160f81c901b919091179060010161316f565b505f805b6008811015613220576131d9816007614604565b6131e49060086143e2565b6001600160401b0316886131f983602661462b565b8151811061320957613209614617565b016020015160f81c901b91909117906001016131c5565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061491183398151915290600160401b900460ff165f0361327357505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b03166060820152429115806132d55750600283015481516132d1916001600160401b03169061462b565b8210155b156132fb576001600160401b03851660608201528181526040810151602082015261331a565b848160600181815161330d9190614814565b6001600160401b03169052505b606081015161332a906064614834565b602082015160028501546001600160401b0392909216916133559190600160401b900460ff166143e2565b10156133b95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161041d565b83156133e257846001600160401b0316816040018181516133da919061462b565b905250613401565b846001600160401b0316816040018181516133fd9190614604565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b6040516001600160a01b03838116602483015260448201839052610b5991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613a31565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166134f157604051631afcd79f60e31b815260040160405180910390fd5b565b6134fb6134a8565b61350481613a92565b61170661351760a08301608084016140c5565b61352760c0840160a085016140c5565b61353760e0850160c086016140c5565b613548610100860160e0870161485f565b613ab3565b6135556134a8565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166135e15760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161041d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f610910827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b54565b5f8051602061493183398151915280546001190161366857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b61170681600161322d565b5f60608260800151516030146136e35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161041d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561375a5761371a816001614604565b6137259060086143e2565b5081515f9083908390811061373c5761373c614617565b60200101906001600160f81b03191690815f1a905350600101613706565b505f5b60048110156137b857613771816003614604565b61377c9060086143e2565b505f8261378a83600261462b565b8151811061379a5761379a614617565b60200101906001600160f81b03191690815f1a90535060010161375d565b505f5b602081101561381557845181602081106137d7576137d7614617565b1a60f81b826137e783600661462b565b815181106137f7576137f7614617565b60200101906001600160f81b03191690815f1a9053506001016137bb565b505f5b6020811015613875578460200151816020811061383757613837614617565b1a60f81b8261384783602661462b565b8151811061385757613857614617565b60200101906001600160f81b03191690815f1a905350600101613818565b505f5b60088110156138e95761388c816007614604565b6138979060086143e2565b60ff1685604001516001600160401b0316901c60f81b828260466138bb919061462b565b815181106138cb576138cb614617565b60200101906001600160f81b03191690815f1a905350600101613878565b505f5b6030811015613954578460800151818151811061390b5761390b614617565b01602001516001600160f81b0319168261392683604e61462b565b8151811061393657613936614617565b60200101906001600160f81b03191690815f1a9053506001016138ec565b505f5b60088110156139c65761396b816007614604565b6139769060086143e2565b60608601516001600160401b0390811691161c60f81b8261399883607e61462b565b815181106139a8576139a8614617565b60200101906001600160f81b03191690815f1a905350600101613957565b506002816040516139d7919061487a565b602060405180830381855afa1580156139f2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613a159190614321565b94909350915050565b60015f8051602061493183398151915255565b5f613a456001600160a01b03841683613cb6565b905080515f14158015613a69575080806020019051810190613a679190614895565b155b15610b5957604051635274afe760e01b81526001600160a01b038416600482015260240161041d565b613a9a6134a8565b613aa2613cc3565b613aaa613cd3565b61170681613cdb565b613abb6134a8565b5f805160206148d183398151915280546001600160401b03938416600160801b0267ffffffffffffffff60801b19958516600160401b026001600160801b031990921696909416959095179490941792909216179091557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0180546001600160a01b039092166001600160a01b0319909216919091179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613b9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613bbe9190614321565b9050613bd56001600160a01b038516333086613e0f565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c3d9190614321565b9050818111613ca35760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161041d565b613cad8282614604565b95945050505050565b6060610e7e83835f613e48565b613ccb6134a8565b6134f1613ed7565b6134f16134a8565b613ce36134a8565b80355f8051602061491183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613d2f60808401606085016148b0565b60ff161115613d9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161041d565b613dac60808301606084016148b0565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613ddd60608301604084016140c5565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6040516001600160a01b0384811660248301528381166044830152606482018390526108fa9186918216906323b872dd90608401613476565b606081471015613e6d5760405163cd78605960e01b815230600482015260240161041d565b5f80856001600160a01b03168486604051613e88919061487a565b5f6040518083038185875af1925050503d805f8114613ec2576040519150601f19603f3d011682016040523d82523d5f602084013e613ec7565b606091505b5091509150611670868383613edf565b613a1e6134a8565b606082613ef457613eef82613f3b565b610e7e565b8151158015613f0b57506001600160a01b0384163b155b15613f3457604051639996b31560e01b81526001600160a01b038516600482015260240161041d565b5080610e7e565b805115613f4b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613f70906143f9565b5f825580601f10613f7f575050565b601f0160209004905f5260205f20908101906117069190613fdf565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613ff3575f8155600101613fe0565b5090565b8015158114611706575f80fd5b803563ffffffff81168114614017575f80fd5b919050565b5f805f6060848603121561402e575f80fd5b83359250602084013561404081613ff7565b915061404e60408501614004565b90509250925092565b5f60208284031215614067575f80fd5b5035919050565b5f6020828403121561407e575f80fd5b610e7e82614004565b5f8060408385031215614098575f80fd5b6140a183614004565b946020939093013593505050565b80356001600160401b0381168114614017575f80fd5b5f602082840312156140d5575f80fd5b610e7e826140af565b6001600160a01b0381168114611706575f80fd5b5f80828403610120811215614105575f80fd5b61010080821215614114575f80fd5b8493508301359050614125816140de565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561416657614166614130565b60405290565b604051601f8201601f191681016001600160401b038111828210171561419457614194614130565b604052919050565b5f6001600160401b038211156141b4576141b4614130565b50601f01601f191660200190565b5f805f80608085870312156141d5575f80fd5b84359350602085013592506141ec604086016140af565b915060608501356001600160401b03811115614206575f80fd5b8501601f81018713614216575f80fd5b80356142296142248261419c565b61416c565b81815288602083850101111561423d575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561426f575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156142c6576142c6614292565b5092915050565b5f5b838110156142e75781810151838201526020016142cf565b50505f910152565b602081525f825180602084015261430d8160408501602087016142cd565b601f01601f19169190910160400192915050565b5f60208284031215614331575f80fd5b5051919050565b5f8261435257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761091057610910614292565b600181811c9082168061440d57607f821691505b60208210810361442b57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461448a816143f9565b806020870152604060018084165f81146144ab57600181146144c7576144f4565b60ff19851660408a0152604084151560051b8a010195506144f4565b895f5260205f205f5b858110156144eb5781548b82018601529083019088016144d0565b8a016040019650505b509398975050505050505050565b805161401781613ff7565b5f806040838503121561451e575f80fd5b82516001600160401b0380821115614534575f80fd5b9084019060608287031215614547575f80fd5b61454f614144565b82518152602080840151614562816140de565b82820152604084015183811115614577575f80fd5b80850194505087601f85011261458b575f80fd5b8351925061459b6142248461419c565b83815288828587010111156145ae575f80fd5b6145bd848383018488016142cd565b806040840152508195506145d2818801614502565b9450505050509250929050565b5f6001600160401b038083168181036145fa576145fa614292565b6001019392505050565b8181038181111561091057610910614292565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561091057610910614292565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610b5957805f5260205f20601f840160051c810160208510156147365750805b601f840160051c820191505b818110156112c8575f8155600101614742565b81516001600160401b0381111561476e5761476e614130565b6147828161477c84546143f9565b84614711565b602080601f8311600181146147b5575f841561479e5750858301515b5f19600386901b1c1916600185901b17855561480c565b5f85815260208120601f198616915b828110156147e3578886015182559484019460019091019084016147c4565b508582101561480057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b038181168382160190808211156142c6576142c6614292565b6001600160401b0381811683821602808216919082811461485757614857614292565b505092915050565b5f6020828403121561486f575f80fd5b8135610e7e816140de565b5f825161488b8184602087016142cd565b9190910192915050565b5f602082840312156148a5575f80fd5b8151610e7e81613ff7565b5f602082840312156148c0575f80fd5b813560ff81168114610e7e575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"rewardCalculator\",\"type\":\"address\",\"internalType\":\"contractIRewardCalculator\"}]},{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"contractIERC20\"}],\"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\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614b29380380614b2983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149dc8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c806376f786211161009e578063a3a65e481161006e578063a3a65e4814610246578063b771b3bc14610259578063ba3a4b971461027f578063bee0a03f14610292578063e74e8cab146102a5575f80fd5b806376f78621146101fa578063872fda641461020d57806398f3e2b4146102205780639e1bc4ef14610233575f80fd5b8063467ef06f116100d9578063467ef06f146101ae5780635297fae6146101c157806362065856146101d457806366435abf146101e7575f80fd5b80630118acc41461010a5780630322ed981461011f5780630cdd0985146101325780632e2194d814610183575b5f80fd5b61011d61011836600461407b565b6102b8565b005b61011d61012d3660046140b6565b610730565b6101706101403660046140b6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101966101913660046140b6565b610900565b6040516001600160401b03909116815260200161017a565b61011d6101bc3660046140cd565b610916565b61011d6101cf3660046140e6565b610941565b6101706101e2366004614124565b610b11565b6101966101f53660046140b6565b610b2a565b61011d61020836600461407b565b610b3e565b61017061021b3660046141cf565b610b5e565b61011d61022e3660046140e6565b610b83565b61017061024136600461426b565b610d91565b61011d6102543660046140cd565b610da4565b6102676005600160991b0181565b6040516001600160a01b03909116815260200161017a565b61011d61028d3660046140b6565b610f61565b61011d6102a03660046140b6565b6111ee565b61011d6102b336600461429f565b6112fd565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f8051602061493083398151915291841561030a5761030782856113dc565b90505b5f868152600384016020526040808220815161010081019092528054829060ff16600481111561033c5761033c6142dd565b600481111561034d5761034d6142dd565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156103d4576103d46142dd565b146104265760405162461bcd60e51b815260206004820152602a60248201525f805160206149508339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461048b5760405162461bcd60e51b815260206004820152603360248201525f805160206149508339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161041d565b5f61049584611678565b90506104a482606001516116fa565b60038083526001600160401b0342811660a0850152821660e08401525f898152908601602052604090208251815484929190829060ff191660018360048111156104f0576104f06142dd565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6105c285611707565b905082606001516001600160401b03168160a001516001600160401b0316116106395760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161041d565b5f83606001518260a0015161064e9190614305565b905061065a86826117e6565b5f6005600160991b0163ee5b48eb61067389878661182e565b6040518263ffffffff1660e01b815260040161068f919061434e565b6020604051808303815f875af11580156106ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106cf9190614380565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206149b083398151915260205260408082208151610100810190925280545f8051602061497083398151915293929190829060ff16600581111561077e5761077e6142dd565b600581111561078f5761078f6142dd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610814576108146142dd565b146108795760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb61089e8584608001515f61182e565b6040518263ffffffff1660e01b81526004016108ba919061434e565b6020604051808303815f875af11580156108d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108fa9190614380565b50505050565b5f61091064e8d4a5100083614397565b92915050565b5f61092082611a4b565b905061093d81606001516001600160401b03168260400151611dbe565b5050565b5f805160206149308339815191525f61095984611df4565b90505f8061096a8360400151611fd5565b50915091505f61097983611707565b9050816001600160401b031681608001516001600160401b031610156109b15760405162461bcd60e51b815260040161041d906143b6565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b9092041611156109f65760405162461bcd60e51b815260040161041d906143f8565b60015f87815260038701602052604090205460ff166004811115610a1c57610a1c6142dd565b14610a855760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161041d565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109106001600160401b03831664e8d4a51000614441565b5f610b3482611707565b60a0015192915050565b8115610b5057610b4e83826113dc565b505b610b5983612210565b505050565b5f80610b69866125ae565b9050610b778582868661269d565b9150505b949350505050565b5f805160206149308339815191525f610b9b84611df4565b90505f80610bac8360400151611fd5565b50915091505f610bbb83611707565b9050816001600160401b031681608001516001600160401b03161015610bf35760405162461bcd60e51b815260040161041d906143b6565b5f8681526003808701602052604090912001546001600160401b0380841691161115610c315760405162461bcd60e51b815260040161041d906143f8565b60035f87815260038701602052604090205460ff166004811115610c5757610c576142dd565b14610cab5760405162461bcd60e51b815260206004820152603160248201525f805160206149508339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161041d565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610d4f9190611dbe565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610d9d833384612b53565b9392505050565b5f805160206149708339815191525f610dbc83611df4565b90505f80610dcd8360400151612ece565b9150915080610e2f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161041d565b5f82815260078501602052604081208054610e4990614458565b9050118015610e7b575060015f83815260088601602052604090205460ff166005811115610e7957610e796142dd565b145b610e975760405162461bcd60e51b815260040161041d90614490565b5f8281526007850160205260408120610eaf91613fc3565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f8051602061493083398151915293929190829060ff166004811115610fc257610fc26142dd565b6004811115610fd357610fd36142dd565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561105a5761105a6142dd565b14806110785750600381516004811115611076576110766142dd565b145b6110cc5760405162461bcd60e51b815260206004820152603260248201525f80516020614950833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161041d565b5f6110da8260400151611707565b905080608001516001600160401b03165f0361115e5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161041d565b6005600160991b016001600160a01b031663ee5b48eb61118b846040015184608001518560a0015161182e565b6040518263ffffffff1660e01b81526004016111a7919061434e565b6020604051808303815f875af11580156111c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111e79190614380565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061497083398151915292919061123690614458565b9050118015611268575060015f83815260088301602052604090205460ff166005811115611266576112666142dd565b145b6112845760405162461bcd60e51b815260040161041d90614490565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916112bd91906004016144d7565b6020604051808303815f875af11580156112d9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b599190614380565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611346575080546001600160401b03808416911610155b156113645760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561138f848461306f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611427573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261144e919081019061456c565b91509150806114b15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161041d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156114f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115189190614380565b82511461157c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161041d565b60208201516001600160a01b0316156115f25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161041d565b5f806116018460400151613089565b9150915081871461166e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161041d565b9695505050505050565b5f8181525f805160206149b08339815191526020526040812060030180545f80516020614970833981519152916001600160401b0390911690836116bb8361463e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611704815f613261565b50565b61170f613ffa565b5f8281525f805160206149b08339815191526020526040908190208151610100810190925280545f80516020614970833981519152929190829060ff16600581111561175d5761175d6142dd565b600581111561176e5761176e6142dd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206149b0833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156118a757611867816001614663565b611872906008614441565b5081515f9083908390811061188957611889614676565b60200101906001600160f81b03191690815f1a905350600101611853565b505f5b600481101561190a576118be816003614663565b6118c9906008614441565b6001901c60f81b826118dc83600261468a565b815181106118ec576118ec614676565b60200101906001600160f81b03191690815f1a9053506001016118aa565b505f5b602081101561196c5761192181601f614663565b61192c906008614441565b86901c60f81b8261193e83600661468a565b8151811061194e5761194e614676565b60200101906001600160f81b03191690815f1a90535060010161190d565b505f5b60088110156119d757611983816007614663565b61198e906008614441565b6001600160401b038616901c60f81b826119a983602661468a565b815181106119b9576119b9614676565b60200101906001600160f81b03191690815f1a90535060010161196f565b505f5b6008811015611a42576119ee816007614663565b6119f9906008614441565b6001600160401b038516901c60f81b82611a1483602e61468a565b81518110611a2457611a24614676565b60200101906001600160f81b03191690815f1a9053506001016119da565b50949350505050565b611a53613ffa565b5f805160206149708339815191525f611a6b84611df4565b90505f80611a7c8360400151612ece565b915091508015611ae15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161041d565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611b1357611b136142dd565b6005811115611b2457611b246142dd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611bab57611bab6142dd565b1480611bc95750600182516005811115611bc757611bc76142dd565b145b611c285760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161041d565b600382516005811115611c3d57611c3d6142dd565b03611c4a57506004611c4e565b5060055b6020808301515f90815260098801909152604081205581816005811115611c7757611c776142dd565b90816005811115611c8a57611c8a6142dd565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611cbe57611cbe6142dd565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611d8957611d896142dd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461093d906001600160a01b0316828461347d565b60408051606080820183525f8083526020830181905292820152905f805160206149708339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611e69573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e90919081019061456c565b9150915080611ef75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161041d565b8254825114611f5a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161041d565b60208201516001600160a01b031615611fcd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161041d565b509392505050565b5f805f8351603614611ff95760405162461bcd60e51b815260040161041d9061469d565b5f805b600281101561204857612010816001614663565b61201b906008614441565b61ffff1686828151811061203157612031614676565b016020015160f81c901b9190911790600101611ffc565b5061ffff81161561206b5760405162461bcd60e51b815260040161041d906146e6565b5f805b60048110156120c657612082816003614663565b61208d906008614441565b63ffffffff168761209f83600261468a565b815181106120af576120af614676565b016020015160f81c901b919091179060010161206e565b5063ffffffff81166003146120ed5760405162461bcd60e51b815260040161041d90614729565b5f805b60208110156121425761210481601f614663565b61210f906008614441565b8861211b83600661468a565b8151811061212b5761212b614676565b016020015160f81c901b91909117906001016120f0565b505f805b60088110156121a15761215a816007614663565b612165906008614441565b6001600160401b03168961217a83602661468a565b8151811061218a5761218a614676565b016020015160f81c901b9190911790600101612146565b505f805b6008811015612200576121b9816007614663565b6121c4906008614441565b6001600160401b03168a6121d983602e61468a565b815181106121e9576121e9614676565b016020015160f81c901b91909117906001016121a5565b5091989097509095509350505050565b5f8181525f805160206149b083398151915260205260408082208151610100810190925280545f8051602061497083398151915293929190829060ff16600581111561225e5761225e6142dd565b600581111561226f5761226f6142dd565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156122f7576122f76142dd565b146123535760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161041d565b60408101516001600160a01b0316336001600160a01b0316146123cd5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161041d565b6123da8160a001516116fa565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561241e5761241e6142dd565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6124ea846124e481611678565b5f61182e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061251990859060040161434e565b6020604051808303815f875af1158015612535573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125599190614380565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f5f80516020614930833981519152816125c7846134dc565b825490915084101561262d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161041d565b81600101548411156126945760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161041d565b610b7b81610900565b5f6126a6613512565b5f80516020614970833981519152426001600160401b038516116127285760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161041d565b6001600160401b03841661273f426202a30061468a565b116127b25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161041d565b856128095760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161041d565b5f868152600982016020526040902054156128775760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161041d565b82516030146128de5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161041d565b6128e785613549565b5f8061292e6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613554565b5f8281526007860160205260409020919350915061294c82826147b4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061297990859060040161434e565b6020604051808303815f875af1158015612995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129b99190614380565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115612a3b57612a3b6142dd565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050610b7b60015f8051602061499083398151915255565b5f612b5c613512565b5f612b69610191846134dc565b90505f805160206149308339815191525f612b8387611707565b9050600281516005811115612b9a57612b9a6142dd565b14612bf95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161041d565b612c0283613549565b5f838260a00151612c139190614873565b9050612c1f88826117e6565b5f612c2989611678565b90505f898983604051602001612c719392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612cab8d868861182e565b6040518263ffffffff1660e01b8152600401612cc7919061434e565b6020604051808303815f875af1158015612ce3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d079190614380565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff19166001836004811115612d8f57612d8f6142dd565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610d9d60015f8051602061499083398151915255565b5f808251602714612ef15760405162461bcd60e51b815260040161041d9061469d565b5f805b6002811015612f4057612f08816001614663565b612f13906008614441565b61ffff16858281518110612f2957612f29614676565b016020015160f81c901b9190911790600101612ef4565b5061ffff811615612f635760405162461bcd60e51b815260040161041d906146e6565b5f805b6004811015612fbe57612f7a816003614663565b612f85906008614441565b63ffffffff1686612f9783600261468a565b81518110612fa757612fa7614676565b016020015160f81c901b9190911790600101612f66565b5063ffffffff8116600214612fe55760405162461bcd60e51b815260040161041d90614729565b5f805b602081101561303a57612ffc81601f614663565b613007906008614441565b8761301383600661468a565b8151811061302357613023614676565b016020015160f81c901b9190911790600101612fe8565b505f8660268151811061304f5761304f614676565b016020015191976001600160f81b03199092161515965090945050505050565b61307761390c565b61308082613957565b61093d8161399b565b5f808251602e146130ac5760405162461bcd60e51b815260040161041d9061469d565b5f805b60028110156130fb576130c3816001614663565b6130ce906008614441565b61ffff168582815181106130e4576130e4614676565b016020015160f81c901b91909117906001016130af565b5061ffff81161561311e5760405162461bcd60e51b815260040161041d906146e6565b5f805b600481101561317957613135816003614663565b613140906008614441565b63ffffffff168661315283600261468a565b8151811061316257613162614676565b016020015160f81c901b9190911790600101613121565b5063ffffffff81166004146131a05760405162461bcd60e51b815260040161041d90614729565b5f805b60208110156131f5576131b781601f614663565b6131c2906008614441565b876131ce83600661468a565b815181106131de576131de614676565b016020015160f81c901b91909117906001016131a3565b505f805b60088110156132545761320d816007614663565b613218906008614441565b6001600160401b03168861322d83602661468a565b8151811061323d5761323d614676565b016020015160f81c901b91909117906001016131f9565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061497083398151915290600160401b900460ff165f036132a757505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b0316606082015242911580613309575060028301548151613305916001600160401b03169061468a565b8210155b1561332f576001600160401b03851660608201528181526040810151602082015261334e565b84816060018181516133419190614873565b6001600160401b03169052505b606081015161335e906064614893565b602082015160028501546001600160401b0392909216916133899190600160401b900460ff16614441565b10156133ed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161041d565b831561341657846001600160401b03168160400181815161340e919061468a565b905250613435565b846001600160401b0316816040018181516134319190614663565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b6040516001600160a01b03838116602483015260448201839052610b5991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613a4f565b5f610910827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613ab0565b5f8051602061499083398151915280546001190161354357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b611704816001613261565b5f60608260800151516030146135be5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161041d565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613635576135f5816001614663565b613600906008614441565b5081515f9083908390811061361757613617614676565b60200101906001600160f81b03191690815f1a9053506001016135e1565b505f5b60048110156136935761364c816003614663565b613657906008614441565b505f8261366583600261468a565b8151811061367557613675614676565b60200101906001600160f81b03191690815f1a905350600101613638565b505f5b60208110156136f057845181602081106136b2576136b2614676565b1a60f81b826136c283600661468a565b815181106136d2576136d2614676565b60200101906001600160f81b03191690815f1a905350600101613696565b505f5b6020811015613750578460200151816020811061371257613712614676565b1a60f81b8261372283602661468a565b8151811061373257613732614676565b60200101906001600160f81b03191690815f1a9053506001016136f3565b505f5b60088110156137c457613767816007614663565b613772906008614441565b60ff1685604001516001600160401b0316901c60f81b82826046613796919061468a565b815181106137a6576137a6614676565b60200101906001600160f81b03191690815f1a905350600101613753565b505f5b603081101561382f57846080015181815181106137e6576137e6614676565b01602001516001600160f81b0319168261380183604e61468a565b8151811061381157613811614676565b60200101906001600160f81b03191690815f1a9053506001016137c7565b505f5b60088110156138a157613846816007614663565b613851906008614441565b60608601516001600160401b0390811691161c60f81b8261387383607e61468a565b8151811061388357613883614676565b60200101906001600160f81b03191690815f1a905350600101613832565b506002816040516138b291906148be565b602060405180830381855afa1580156138cd573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906138f09190614380565b94909350915050565b60015f8051602061499083398151915255565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661395557604051631afcd79f60e31b815260040160405180910390fd5b565b61395f61390c565b61396881613c12565b611704608082013560a083013561398560e0850160c08601614124565b613996610100860160e087016148d9565b613c33565b6139a361390c565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613a2f5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161041d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613a636001600160a01b03841683613c8e565b905080515f14158015613a87575080806020019051810190613a8591906148f4565b155b15610b5957604051635274afe760e01b81526001600160a01b038416600482015260240161041d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613af6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b1a9190614380565b9050613b316001600160a01b038516333086613c9b565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613b75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b999190614380565b9050818111613bff5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161041d565b613c098282614663565b95945050505050565b613c1a61390c565b613c22613cd4565b613c2a613ce4565b61170481613cec565b613c3b61390c565b5f5f80516020614930833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b6060610d9d83835f613ea7565b6040516001600160a01b0384811660248301528381166044830152606482018390526108fa9186918216906323b872dd906084016134aa565b613cdc61390c565b613955613f36565b61395561390c565b613cf461390c565b80355f8051602061497083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613d40608084016060850161490f565b60ff161115613dad5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161041d565b5f613dbe608084016060850161490f565b60ff1611613e345760405162461bcd60e51b815260206004820152603960248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201527f70657263656e746167652063616e6e6f74206265207a65726f00000000000000606482015260840161041d565b613e44608083016060840161490f565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613e756060830160408401614124565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606081471015613ecc5760405163cd78605960e01b815230600482015260240161041d565b5f80856001600160a01b03168486604051613ee791906148be565b5f6040518083038185875af1925050503d805f8114613f21576040519150601f19603f3d011682016040523d82523d5f602084013e613f26565b606091505b509150915061166e868383613f3e565b6138f961390c565b606082613f5357613f4e82613f9a565b610d9d565b8151158015613f6a57506001600160a01b0384163b155b15613f9357604051639996b31560e01b81526001600160a01b038516600482015260240161041d565b5080610d9d565b805115613faa5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054613fcf90614458565b5f825580601f10613fde575050565b601f0160209004905f5260205f2090810190611704919061403e565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614052575f815560010161403f565b5090565b8015158114611704575f80fd5b803563ffffffff81168114614076575f80fd5b919050565b5f805f6060848603121561408d575f80fd5b83359250602084013561409f81614056565b91506140ad60408501614063565b90509250925092565b5f602082840312156140c6575f80fd5b5035919050565b5f602082840312156140dd575f80fd5b610d9d82614063565b5f80604083850312156140f7575f80fd5b61410083614063565b946020939093013593505050565b80356001600160401b0381168114614076575f80fd5b5f60208284031215614134575f80fd5b610d9d8261410e565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156141735761417361413d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156141a1576141a161413d565b604052919050565b5f6001600160401b038211156141c1576141c161413d565b50601f01601f191660200190565b5f805f80608085870312156141e2575f80fd5b84359350602085013592506141f96040860161410e565b915060608501356001600160401b03811115614213575f80fd5b8501601f81018713614223575f80fd5b8035614236614231826141a9565b614179565b81815288602083850101111561424a575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561427c575f80fd5b50508035926020909101359150565b6001600160a01b0381168114611704575f80fd5b5f808284036101208112156142b2575f80fd5b610100808212156142c1575f80fd5b84935083013590506142d28161428b565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614325576143256142f1565b5092915050565b5f5b8381101561434657818101518382015260200161432e565b50505f910152565b602081525f825180602084015261436c81604085016020870161432c565b601f01601f19169190910160400192915050565b5f60208284031215614390575f80fd5b5051919050565b5f826143b157634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610910576109106142f1565b600181811c9082168061446c57607f821691505b60208210810361448a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546144e981614458565b806020870152604060018084165f811461450a576001811461452657614553565b60ff19851660408a0152604084151560051b8a01019550614553565b895f5260205f205f5b8581101561454a5781548b820186015290830190880161452f565b8a016040019650505b509398975050505050505050565b805161407681614056565b5f806040838503121561457d575f80fd5b82516001600160401b0380821115614593575f80fd5b90840190606082870312156145a6575f80fd5b6145ae614151565b825181526020808401516145c18161428b565b828201526040840151838111156145d6575f80fd5b80850194505087601f8501126145ea575f80fd5b835192506145fa614231846141a9565b838152888285870101111561460d575f80fd5b61461c8483830184880161432c565b80604084015250819550614631818801614561565b9450505050509250929050565b5f6001600160401b03808316818103614659576146596142f1565b6001019392505050565b81810381811115610910576109106142f1565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610910576109106142f1565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b601f821115610b5957805f5260205f20601f840160051c810160208510156147955750805b601f840160051c820191505b818110156111e7575f81556001016147a1565b81516001600160401b038111156147cd576147cd61413d565b6147e1816147db8454614458565b84614770565b602080601f831160018114614814575f84156147fd5750858301515b5f19600386901b1c1916600185901b17855561486b565b5f85815260208120601f198616915b8281101561484257888601518255948401946001909101908401614823565b508582101561485f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115614325576143256142f1565b6001600160401b038181168382160280821691908281146148b6576148b66142f1565b505092915050565b5f82516148cf81846020870161432c565b9190910192915050565b5f602082840312156148e9575f80fd5b8135610d9d8161428b565b5f60208284031215614904575f80fd5b8151610d9d81614056565b5f6020828403121561491f575f80fd5b813560ff81168114610d9d575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -458,23 +458,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x872e999e. +// Initialize is a paid mutator transaction binding the contract method 0xe74e8cab. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint64,uint64,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,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 0x872e999e. +// Initialize is a paid mutator transaction binding the contract method 0xe74e8cab. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint64,uint64,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,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 0x872e999e. +// Initialize is a paid mutator transaction binding the contract method 0xe74e8cab. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint64,uint64,uint64,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,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/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 8836bcb74..58353033f 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -32,8 +32,8 @@ var ( // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { BaseSettings ValidatorManagerSettings - MinimumStakeWeight uint64 - MaximumStakeWeight uint64 + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int MinimumStakeDuration uint64 RewardCalculator common.Address } @@ -48,8 +48,8 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"churnPeriodSeconds\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumChurnPercentage\",\"type\":\"uint8\",\"internalType\":\"uint8\"}]},{\"name\":\"minimumStakeWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"maximumStakeWeight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"minimumStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516146f13803806146f183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6145a48061014d5f395ff3fe6080604052600436106100fa575f3560e01c806366435abf11610092578063b771b3bc11610062578063b771b3bc146102ca578063ba3a4b97146102fc578063bee0a03f1461031b578063c599e24f1461033a578063f40797d71461034d575f80fd5b806366435abf1461024e57806376f786211461026d57806398f3e2b41461028c578063a3a65e48146102ab575f80fd5b80632e2194d8116100cd5780632e2194d8146101ba578063467ef06f146101f15780635297fae614610210578063620658561461022f575f80fd5b80630118acc4146100fe5780630322ed981461011f5780630a115d261461013e5780630cdd09851461015d575b5f80fd5b348015610109575f80fd5b5061011d610118366004613cb5565b610360565b005b34801561012a575f80fd5b5061011d610139366004613cf0565b6107d8565b348015610149575f80fd5b5061011d610158366004613d07565b6109a8565b348015610168575f80fd5b506101a7610177366004613cf0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101c5575f80fd5b506101d96101d4366004613cf0565b610a85565b6040516001600160401b0390911681526020016101b1565b3480156101fc575f80fd5b5061011d61020b366004613d1e565b610a9b565b34801561021b575f80fd5b5061011d61022a366004613d37565b610ac6565b34801561023a575f80fd5b506101a7610249366004613d75565b610c96565b348015610259575f80fd5b506101d9610268366004613cf0565b610caf565b348015610278575f80fd5b5061011d610287366004613cb5565b610cc3565b348015610297575f80fd5b5061011d6102a6366004613d37565b610ce3565b3480156102b6575f80fd5b5061011d6102c5366004613d1e565b610ef3565b3480156102d5575f80fd5b506102e46005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b348015610307575f80fd5b5061011d610316366004613cf0565b6110b0565b348015610326575f80fd5b5061011d610335366004613cf0565b61133d565b6101a7610348366004613cf0565b61144c565b6101a761035b366004613e20565b611458565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0260205260408120600101545f805160206144f88339815191529184156103b2576103af828561147c565b90505b5f868152600284016020526040808220815161010081019092528054829060ff1660048111156103e4576103e4613eb2565b60048111156103f5576103f5613eb2565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561047c5761047c613eb2565b146104ce5760405162461bcd60e51b815260206004820152602a60248201525f805160206145188339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105335760405162461bcd60e51b815260206004820152603360248201525f805160206145188339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c5565b5f61053d84611718565b905061054c826060015161179a565b600382526001600160401b0342811660a0840152811660e08301525f88815260028601602052604090208251815484929190829060ff1916600183600481111561059857610598613eb2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61066a856117a7565b905082606001516001600160401b03168160a001516001600160401b0316116106e15760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104c5565b5f83606001518260a001516106f69190613eda565b90506107028682611886565b5f6005600160991b0163ee5b48eb61071b8987866118ce565b6040518263ffffffff1660e01b81526004016107379190613f23565b6020604051808303815f875af1158015610753573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107779190613f55565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061457883398151915260205260408082208151610100810190925280545f8051602061453883398151915293929190829060ff16600581111561082657610826613eb2565b600581111561083757610837613eb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108bc576108bc613eb2565b146109215760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c5565b6005600160991b016001600160a01b031663ee5b48eb6109468584608001515f6118ce565b6040518263ffffffff1660e01b81526004016109629190613f23565b6020604051808303815f875af115801561097e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a29190613f55565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109f1575080546001600160401b03808416911610155b15610a0f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a3983611aeb565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a9564e8d4a5100083613f6c565b92915050565b5f610aa582611afc565b9050610ac281606001516001600160401b03168260400151611e6f565b5050565b5f805160206144f88339815191525f610ade84611e82565b90505f80610aef8360400151612063565b50915091505f610afe836117a7565b9050816001600160401b031681608001516001600160401b03161015610b365760405162461bcd60e51b81526004016104c590613f8b565b5f8681526002808701602052604090912001546001600160401b03808416600160c01b909204161115610b7b5760405162461bcd60e51b81526004016104c590613fcd565b60015f87815260028701602052604090205460ff166004811115610ba157610ba1613eb2565b14610c0a5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c5565b5f86815260028681016020908152604092839020805460ff19168317815590910180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a956001600160401b03831664e8d4a51000614016565b5f610cb9826117a7565b60a0015192915050565b8115610cd557610cd3838261147c565b505b610cde8361229e565b505050565b5f805160206144f88339815191525f610cfb84611e82565b90505f80610d0c8360400151612063565b50915091505f610d1b836117a7565b9050816001600160401b031681608001516001600160401b03161015610d535760405162461bcd60e51b81526004016104c590613f8b565b5f8681526002860160205260409020600301546001600160401b0380841691161115610d915760405162461bcd60e51b81526004016104c590613fcd565b60035f87815260028701602052604090205460ff166004811115610db757610db7613eb2565b14610e0b5760405162461bcd60e51b815260206004820152603160248201525f805160206145188339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c5565b5f86815260028681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b0316928101839052600182015494810194909452918201546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039093015490921660e0840152610eb19190611e6f565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206145388339815191525f610f0b83611e82565b90505f80610f1c836040015161263c565b9150915080610f7e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c5565b5f82815260078501602052604081208054610f989061402d565b9050118015610fca575060015f83815260088601602052604090205460ff166005811115610fc857610fc8613eb2565b145b610fe65760405162461bcd60e51b81526004016104c59061405f565b5f8281526007850160205260408120610ffe91613bfd565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0260205260408082208151610100810190925280545f805160206144f883398151915293929190829060ff16600481111561111157611111613eb2565b600481111561112257611122613eb2565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156111a9576111a9613eb2565b14806111c757506003815160048111156111c5576111c5613eb2565b145b61121b5760405162461bcd60e51b815260206004820152603260248201525f80516020614518833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c5565b5f61122982604001516117a7565b905080608001516001600160401b03165f036112ad5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c5565b6005600160991b016001600160a01b031663ee5b48eb6112da846040015184608001518560a001516118ce565b6040518263ffffffff1660e01b81526004016112f69190613f23565b6020604051808303815f875af1158015611312573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113369190613f55565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206145388339815191529291906113859061402d565b90501180156113b7575060015f83815260088301602052604090205460ff1660058111156113b5576113b5613eb2565b145b6113d35760405162461bcd60e51b81526004016104c59061405f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161140c91906004016140a6565b6020604051808303815f875af1158015611428573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cde9190613f55565b5f610a958233346127dd565b5f8061146334612b55565b905061147185828686612c0b565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114c7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114ee919081019061414f565b91509150806115515760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611594573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b89190613f55565b82511461161c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c5565b60208201516001600160a01b0316156116925760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c5565b5f806116a184604001516130c1565b9150915081871461170e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c5565b9695505050505050565b5f8181525f805160206145788339815191526020526040812060030180545f80516020614538833981519152916001600160401b03909116908361175b83614221565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6117a4815f613299565b50565b6117af613c34565b5f8281525f805160206145788339815191526020526040908190208151610100810190925280545f80516020614538833981519152929190829060ff1660058111156117fd576117fd613eb2565b600581111561180e5761180e613eb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614578833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561194757611907816001614246565b611912906008614016565b5081515f9083908390811061192957611929614259565b60200101906001600160f81b03191690815f1a9053506001016118f3565b505f5b60048110156119aa5761195e816003614246565b611969906008614016565b6001901c60f81b8261197c83600261426d565b8151811061198c5761198c614259565b60200101906001600160f81b03191690815f1a90535060010161194a565b505f5b6020811015611a0c576119c181601f614246565b6119cc906008614016565b86901c60f81b826119de83600661426d565b815181106119ee576119ee614259565b60200101906001600160f81b03191690815f1a9053506001016119ad565b505f5b6008811015611a7757611a23816007614246565b611a2e906008614016565b6001600160401b038616901c60f81b82611a4983602661426d565b81518110611a5957611a59614259565b60200101906001600160f81b03191690815f1a905350600101611a0f565b505f5b6008811015611ae257611a8e816007614246565b611a99906008614016565b6001600160401b038516901c60f81b82611ab483602e61426d565b81518110611ac457611ac4614259565b60200101906001600160f81b03191690815f1a905350600101611a7a565b50949350505050565b611af36134b5565b6117a481613500565b611b04613c34565b5f805160206145388339815191525f611b1c84611e82565b90505f80611b2d836040015161263c565b915091508015611b925760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c5565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611bc457611bc4613eb2565b6005811115611bd557611bd5613eb2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c5c57611c5c613eb2565b1480611c7a5750600182516005811115611c7857611c78613eb2565b145b611cd95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c5565b600382516005811115611cee57611cee613eb2565b03611cfb57506004611cff565b5060055b6020808301515f90815260098801909152604081205581816005811115611d2857611d28613eb2565b90816005811115611d3b57611d3b613eb2565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611d6f57611d6f613eb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e3a57611e3a613eb2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610ac26001600160a01b0382168361355a565b60408051606080820183525f8083526020830181905292820152905f805160206145388339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ef7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f1e919081019061414f565b9150915080611f855760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c5565b8254825114611fe85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c5565b60208201516001600160a01b03161561205b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c5565b509392505050565b5f805f83516036146120875760405162461bcd60e51b81526004016104c590614280565b5f805b60028110156120d65761209e816001614246565b6120a9906008614016565b61ffff168682815181106120bf576120bf614259565b016020015160f81c901b919091179060010161208a565b5061ffff8116156120f95760405162461bcd60e51b81526004016104c5906142c9565b5f805b600481101561215457612110816003614246565b61211b906008614016565b63ffffffff168761212d83600261426d565b8151811061213d5761213d614259565b016020015160f81c901b91909117906001016120fc565b5063ffffffff811660031461217b5760405162461bcd60e51b81526004016104c59061430c565b5f805b60208110156121d05761219281601f614246565b61219d906008614016565b886121a983600661426d565b815181106121b9576121b9614259565b016020015160f81c901b919091179060010161217e565b505f805b600881101561222f576121e8816007614246565b6121f3906008614016565b6001600160401b03168961220883602661426d565b8151811061221857612218614259565b016020015160f81c901b91909117906001016121d4565b505f805b600881101561228e57612247816007614246565b612252906008614016565b6001600160401b03168a61226783602e61426d565b8151811061227757612277614259565b016020015160f81c901b9190911790600101612233565b5091989097509095509350505050565b5f8181525f8051602061457883398151915260205260408082208151610100810190925280545f8051602061453883398151915293929190829060ff1660058111156122ec576122ec613eb2565b60058111156122fd576122fd613eb2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561238557612385613eb2565b146123e15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c5565b60408101516001600160a01b0316336001600160a01b03161461245b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c5565b6124688160a0015161179a565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156124ac576124ac613eb2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125788461257281611718565b5f6118ce565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906125a7908590600401613f23565b6020604051808303815f875af11580156125c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125e79190613f55565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461265f5760405162461bcd60e51b81526004016104c590614280565b5f805b60028110156126ae57612676816001614246565b612681906008614016565b61ffff1685828151811061269757612697614259565b016020015160f81c901b9190911790600101612662565b5061ffff8116156126d15760405162461bcd60e51b81526004016104c5906142c9565b5f805b600481101561272c576126e8816003614246565b6126f3906008614016565b63ffffffff168661270583600261426d565b8151811061271557612715614259565b016020015160f81c901b91909117906001016126d4565b5063ffffffff81166002146127535760405162461bcd60e51b81526004016104c59061430c565b5f805b60208110156127a85761276a81601f614246565b612775906008614016565b8761278183600661426d565b8151811061279157612791614259565b016020015160f81c901b9190911790600101612756565b505f866026815181106127bd576127bd614259565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127e66135ed565b5f6127f083610a85565b90505f805160206144f88339815191525f61280a876117a7565b905060028151600581111561282157612821613eb2565b146128805760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c5565b61288983613624565b5f838260a0015161289a9190614353565b90506128a68882611886565b5f6128b089611718565b90505f8989836040516020016128f89392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6129328d86886118ce565b6040518263ffffffff1660e01b815260040161294e9190613f23565b6020604051808303815f875af115801561296a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061298e9190613f55565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260028a01909152902081518154829060ff19166001836004811115612a1657612a16613eb2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061147560015f8051602061455883398151915255565b5f5f805160206144f88339815191528282612b6f82610a85565b83549091506001600160401b0390811690821610801590612ba5575082546001600160401b03600160401b909104811690821611155b612c035760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad9481dd95a59da1d60ba1b60648201526084016104c5565b949350505050565b5f612c146135ed565b5f80516020614538833981519152426001600160401b03851611612c965760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c5565b6001600160401b038416612cad426202a30061426d565b11612d205760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c5565b85612d775760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c5565b5f86815260098201602052604090205415612de55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c5565b8251603014612e4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c5565b612e5585613624565b5f80612e9c6040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613642565b5f82815260078601602052604090209193509150612eba82826143b7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612ee7908590600401613f23565b6020604051808303815f875af1158015612f03573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f279190613f55565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115612fa957612fa9613eb2565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c0360015f8051602061455883398151915255565b5f808251602e146130e45760405162461bcd60e51b81526004016104c590614280565b5f805b6002811015613133576130fb816001614246565b613106906008614016565b61ffff1685828151811061311c5761311c614259565b016020015160f81c901b91909117906001016130e7565b5061ffff8116156131565760405162461bcd60e51b81526004016104c5906142c9565b5f805b60048110156131b15761316d816003614246565b613178906008614016565b63ffffffff168661318a83600261426d565b8151811061319a5761319a614259565b016020015160f81c901b9190911790600101613159565b5063ffffffff81166004146131d85760405162461bcd60e51b81526004016104c59061430c565b5f805b602081101561322d576131ef81601f614246565b6131fa906008614016565b8761320683600661426d565b8151811061321657613216614259565b016020015160f81c901b91909117906001016131db565b505f805b600881101561328c57613245816007614246565b613250906008614016565b6001600160401b03168861326583602661426d565b8151811061327557613275614259565b016020015160f81c901b9190911790600101613231565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061453883398151915290600160401b900460ff165f036132df57505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b031660608201524291158061334157506002830154815161333d916001600160401b03169061426d565b8210155b15613367576001600160401b038516606082015281815260408101516020820152613386565b84816060018181516133799190614353565b6001600160401b03169052505b6060810151613396906064614476565b602082015160028501546001600160401b0392909216916133c19190600160401b900460ff16614016565b10156134255760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c5565b831561344e57846001600160401b031681604001818151613446919061426d565b90525061346d565b846001600160401b0316816040018181516134699190614246565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166134fe57604051631afcd79f60e31b815260040160405180910390fd5b565b6135086134b5565b613511816139e7565b6117a461352460a0830160808401613d75565b61353460c0840160a08501613d75565b61354460e0850160c08601613d75565b613555610100860160e087016144a1565b613a08565b8047101561357d5760405163cd78605960e01b81523060048201526024016104c5565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146135c6576040519150601f19603f3d011682016040523d82523d5f602084013e6135cb565b606091505b5050905080610cde57604051630a12f52160e11b815260040160405180910390fd5b5f8051602061455883398151915280546001190161361e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6117a4816001613299565b60015f8051602061455883398151915255565b5f60608260800151516030146136ac5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613723576136e3816001614246565b6136ee906008614016565b5081515f9083908390811061370557613705614259565b60200101906001600160f81b03191690815f1a9053506001016136cf565b505f5b60048110156137815761373a816003614246565b613745906008614016565b505f8261375383600261426d565b8151811061376357613763614259565b60200101906001600160f81b03191690815f1a905350600101613726565b505f5b60208110156137de57845181602081106137a0576137a0614259565b1a60f81b826137b083600661426d565b815181106137c0576137c0614259565b60200101906001600160f81b03191690815f1a905350600101613784565b505f5b602081101561383e578460200151816020811061380057613800614259565b1a60f81b8261381083602661426d565b8151811061382057613820614259565b60200101906001600160f81b03191690815f1a9053506001016137e1565b505f5b60088110156138b257613855816007614246565b613860906008614016565b60ff1685604001516001600160401b0316901c60f81b82826046613884919061426d565b8151811061389457613894614259565b60200101906001600160f81b03191690815f1a905350600101613841565b505f5b603081101561391d57846080015181815181106138d4576138d4614259565b01602001516001600160f81b031916826138ef83604e61426d565b815181106138ff576138ff614259565b60200101906001600160f81b03191690815f1a9053506001016138b5565b505f5b600881101561398f57613934816007614246565b61393f906008614016565b60608601516001600160401b0390811691161c60f81b8261396183607e61426d565b8151811061397157613971614259565b60200101906001600160f81b03191690815f1a905350600101613920565b506002816040516139a091906144bc565b602060405180830381855afa1580156139bb573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139de9190613f55565b94909350915050565b6139ef6134b5565b6139f7613aa9565b6139ff613ab9565b6117a481613ac1565b613a106134b5565b5f805160206144f883398151915280546001600160401b03938416600160801b0267ffffffffffffffff60801b19958516600160401b026001600160801b031990921696909416959095179490941792909216179091557f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0180546001600160a01b039092166001600160a01b0319909216919091179055565b613ab16134b5565b6134fe613bf5565b6134fe6134b5565b613ac96134b5565b80355f8051602061453883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613b1560808401606085016144d7565b60ff161115613b825760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c5565b613b9260808301606084016144d7565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613bc36060830160408401613d75565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b61362f6134b5565b508054613c099061402d565b5f825580601f10613c18575050565b601f0160209004905f5260205f20908101906117a49190613c78565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613c8c575f8155600101613c79565b5090565b80151581146117a4575f80fd5b803563ffffffff81168114613cb0575f80fd5b919050565b5f805f60608486031215613cc7575f80fd5b833592506020840135613cd981613c90565b9150613ce760408501613c9d565b90509250925092565b5f60208284031215613d00575f80fd5b5035919050565b5f6101008284031215613d18575f80fd5b50919050565b5f60208284031215613d2e575f80fd5b61147582613c9d565b5f8060408385031215613d48575f80fd5b613d5183613c9d565b946020939093013593505050565b80356001600160401b0381168114613cb0575f80fd5b5f60208284031215613d85575f80fd5b61147582613d5f565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613dc457613dc4613d8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613df257613df2613d8e565b604052919050565b5f6001600160401b03821115613e1257613e12613d8e565b50601f01601f191660200190565b5f805f60608486031215613e32575f80fd5b83359250613e4260208501613d5f565b915060408401356001600160401b03811115613e5c575f80fd5b8401601f81018613613e6c575f80fd5b8035613e7f613e7a82613dfa565b613dca565b818152876020838501011115613e93575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613efa57613efa613ec6565b5092915050565b5f5b83811015613f1b578181015183820152602001613f03565b50505f910152565b602081525f8251806020840152613f41816040850160208701613f01565b601f01601f19169190910160400192915050565b5f60208284031215613f65575f80fd5b5051919050565b5f82613f8657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a9557610a95613ec6565b600181811c9082168061404157607f821691505b602082108103613d1857634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546140b88161402d565b806020870152604060018084165f81146140d957600181146140f557614122565b60ff19851660408a0152604084151560051b8a01019550614122565b895f5260205f205f5b858110156141195781548b82018601529083019088016140fe565b8a016040019650505b509398975050505050505050565b6001600160a01b03811681146117a4575f80fd5b8051613cb081613c90565b5f8060408385031215614160575f80fd5b82516001600160401b0380821115614176575f80fd5b9084019060608287031215614189575f80fd5b614191613da2565b825181526020808401516141a481614130565b828201526040840151838111156141b9575f80fd5b80850194505087601f8501126141cd575f80fd5b835192506141dd613e7a84613dfa565b83815288828587010111156141f0575f80fd5b6141ff84838301848801613f01565b80604084015250819550614214818801614144565b9450505050509250929050565b5f6001600160401b0380831681810361423c5761423c613ec6565b6001019392505050565b81810381811115610a9557610a95613ec6565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a9557610a95613ec6565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613efa57613efa613ec6565b601f821115610cde57805f5260205f20601f840160051c810160208510156143985750805b601f840160051c820191505b81811015611336575f81556001016143a4565b81516001600160401b038111156143d0576143d0613d8e565b6143e4816143de845461402d565b84614373565b602080601f831160018114614417575f84156144005750858301515b5f19600386901b1c1916600185901b17855561446e565b5f85815260208120601f198616915b8281101561444557888601518255948401946001909101908401614426565b508582101561446257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0381811683821602808216919082811461449957614499613ec6565b505092915050565b5f602082840312156144b1575f80fd5b813561147581614130565b5f82516144cd818460208701613f01565b9190910192915050565b5f602082840312156144e7575f80fd5b813560ff81168114611475575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"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\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161475238038061475283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6146058061014d5f395ff3fe6080604052600436106100fa575f3560e01c806376f7862111610092578063b771b3bc11610062578063b771b3bc146102ca578063ba3a4b97146102fc578063bee0a03f1461031b578063c599e24f1461033a578063f40797d71461034d575f80fd5b806376f786211461024e5780637978da3a1461026d57806398f3e2b41461028c578063a3a65e48146102ab575f80fd5b8063467ef06f116100cd578063467ef06f146101d25780635297fae6146101f1578063620658561461021057806366435abf1461022f575f80fd5b80630118acc4146100fe5780630322ed981461011f5780630cdd09851461013e5780632e2194d81461019b575b5f80fd5b348015610109575f80fd5b5061011d610118366004613d16565b610360565b005b34801561012a575f80fd5b5061011d610139366004613d51565b6107d8565b348015610149575f80fd5b50610188610158366004613d51565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101a6575f80fd5b506101ba6101b5366004613d51565b6109a8565b6040516001600160401b039091168152602001610192565b3480156101dd575f80fd5b5061011d6101ec366004613d68565b6109be565b3480156101fc575f80fd5b5061011d61020b366004613d81565b6109e9565b34801561021b575f80fd5b5061018861022a366004613dbf565b610bb9565b34801561023a575f80fd5b506101ba610249366004613d51565b610bd2565b348015610259575f80fd5b5061011d610268366004613d16565b610be6565b348015610278575f80fd5b5061011d610287366004613dd8565b610c06565b348015610297575f80fd5b5061011d6102a6366004613d81565b610ce3565b3480156102b6575f80fd5b5061011d6102c5366004613d68565b610ef1565b3480156102d5575f80fd5b506102e46005600160991b0181565b6040516001600160a01b039091168152602001610192565b348015610307575f80fd5b5061011d610316366004613d51565b6110ae565b348015610326575f80fd5b5061011d610335366004613d51565b61133b565b610188610348366004613d51565b61144a565b61018861035b366004613e81565b611456565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408120600101545f805160206145598339815191529184156103b2576103af828561147a565b90505b5f868152600384016020526040808220815161010081019092528054829060ff1660048111156103e4576103e4613f13565b60048111156103f5576103f5613f13565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561047c5761047c613f13565b146104ce5760405162461bcd60e51b815260206004820152602a60248201525f805160206145798339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105335760405162461bcd60e51b815260206004820152603360248201525f805160206145798339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c5565b5f61053d84611716565b905061054c8260600151611798565b60038083526001600160401b0342811660a0850152821660e08401525f898152908601602052604090208251815484929190829060ff1916600183600481111561059857610598613f13565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61066a856117a5565b905082606001516001600160401b03168160a001516001600160401b0316116106e15760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104c5565b5f83606001518260a001516106f69190613f3b565b90506107028682611884565b5f6005600160991b0163ee5b48eb61071b8987866118cc565b6040518263ffffffff1660e01b81526004016107379190613f84565b6020604051808303815f875af1158015610753573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107779190613fb6565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206145d983398151915260205260408082208151610100810190925280545f8051602061459983398151915293929190829060ff16600581111561082657610826613f13565b600581111561083757610837613f13565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108bc576108bc613f13565b146109215760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c5565b6005600160991b016001600160a01b031663ee5b48eb6109468584608001515f6118cc565b6040518263ffffffff1660e01b81526004016109629190613f84565b6020604051808303815f875af115801561097e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a29190613fb6565b50505050565b5f6109b864e8d4a5100083613fcd565b92915050565b5f6109c882611ae9565b90506109e581606001516001600160401b03168260400151611e5c565b5050565b5f805160206145598339815191525f610a0184611e6f565b90505f80610a128360400151612050565b50915091505f610a21836117a5565b9050816001600160401b031681608001516001600160401b03161015610a595760405162461bcd60e51b81526004016104c590613fec565b5f8681526003860160205260409020600201546001600160401b03808416600160c01b909204161115610a9e5760405162461bcd60e51b81526004016104c59061402e565b60015f87815260038701602052604090205460ff166004811115610ac457610ac4613f13565b14610b2d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c5565b5f868152600386016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109b86001600160401b03831664e8d4a51000614077565b5f610bdc826117a5565b60a0015192915050565b8115610bf857610bf6838261147a565b505b610c018361228b565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610c4f575080546001600160401b03808416911610155b15610c6d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c9783612629565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f805160206145598339815191525f610cfb84611e6f565b90505f80610d0c8360400151612050565b50915091505f610d1b836117a5565b9050816001600160401b031681608001516001600160401b03161015610d535760405162461bcd60e51b81526004016104c590613fec565b5f8681526003808701602052604090912001546001600160401b0380841691161115610d915760405162461bcd60e51b81526004016104c59061402e565b60035f87815260038701602052604090205460ff166004811115610db757610db7613f13565b14610e0b5760405162461bcd60e51b815260206004820152603160248201525f805160206145798339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c5565b5f86815260038681016020908152604092839020805460ff19166004908117808355855161010080820188529281529190046001600160a01b031692810183905260018201549481019490945260028101546001600160401b0380821660608701819052600160401b830482166080880152600160801b8304821660a0880152600160c01b909204811660c087015291909301541660e0840152610eaf9190611e5c565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206145998339815191525f610f0983611e6f565b90505f80610f1a836040015161263a565b9150915080610f7c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c5565b5f82815260078501602052604081208054610f969061408e565b9050118015610fc8575060015f83815260088601602052604090205460ff166005811115610fc657610fc6613f13565b145b610fe45760405162461bcd60e51b81526004016104c5906140c0565b5f8281526007850160205260408120610ffc91613c5e565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0360205260408082208151610100810190925280545f8051602061455983398151915293929190829060ff16600481111561110f5761110f613f13565b600481111561112057611120613f13565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156111a7576111a7613f13565b14806111c557506003815160048111156111c3576111c3613f13565b145b6112195760405162461bcd60e51b815260206004820152603260248201525f80516020614579833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c5565b5f61122782604001516117a5565b905080608001516001600160401b03165f036112ab5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c5565b6005600160991b016001600160a01b031663ee5b48eb6112d8846040015184608001518560a001516118cc565b6040518263ffffffff1660e01b81526004016112f49190613f84565b6020604051808303815f875af1158015611310573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113349190613fb6565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206145998339815191529291906113839061408e565b90501180156113b5575060015f83815260088301602052604090205460ff1660058111156113b3576113b3613f13565b145b6113d15760405162461bcd60e51b81526004016104c5906140c0565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161140a9190600401614107565b6020604051808303815f875af1158015611426573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c019190613fb6565b5f6109b88233346127db565b5f8061146134612b53565b905061146f85828686612c41565b9150505b9392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156114c5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114ec91908101906141b0565b915091508061154f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611592573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b69190613fb6565b82511461161a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c5565b60208201516001600160a01b0316156116905760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c5565b5f8061169f84604001516130f7565b9150915081871461170c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c5565b9695505050505050565b5f8181525f805160206145d98339815191526020526040812060030180545f80516020614599833981519152916001600160401b03909116908361175983614282565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6117a2815f6132cf565b50565b6117ad613c95565b5f8281525f805160206145d98339815191526020526040908190208151610100810190925280545f80516020614599833981519152929190829060ff1660058111156117fb576117fb613f13565b600581111561180c5761180c613f13565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f805160206145d9833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611945576119058160016142a7565b611910906008614077565b5081515f90839083908110611927576119276142ba565b60200101906001600160f81b03191690815f1a9053506001016118f1565b505f5b60048110156119a85761195c8160036142a7565b611967906008614077565b6001901c60f81b8261197a8360026142ce565b8151811061198a5761198a6142ba565b60200101906001600160f81b03191690815f1a905350600101611948565b505f5b6020811015611a0a576119bf81601f6142a7565b6119ca906008614077565b86901c60f81b826119dc8360066142ce565b815181106119ec576119ec6142ba565b60200101906001600160f81b03191690815f1a9053506001016119ab565b505f5b6008811015611a7557611a218160076142a7565b611a2c906008614077565b6001600160401b038616901c60f81b82611a478360266142ce565b81518110611a5757611a576142ba565b60200101906001600160f81b03191690815f1a905350600101611a0d565b505f5b6008811015611ae057611a8c8160076142a7565b611a97906008614077565b6001600160401b038516901c60f81b82611ab283602e6142ce565b81518110611ac257611ac26142ba565b60200101906001600160f81b03191690815f1a905350600101611a78565b50949350505050565b611af1613c95565b5f805160206145998339815191525f611b0984611e6f565b90505f80611b1a836040015161263a565b915091508015611b7f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c5565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611bb157611bb1613f13565b6005811115611bc257611bc2613f13565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611c4957611c49613f13565b1480611c675750600182516005811115611c6557611c65613f13565b145b611cc65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c5565b600382516005811115611cdb57611cdb613f13565b03611ce857506004611cec565b5060055b6020808301515f90815260098801909152604081205581816005811115611d1557611d15613f13565b90816005811115611d2857611d28613f13565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611d5c57611d5c613f13565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e2757611e27613f13565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b6109e56001600160a01b038216836134eb565b60408051606080820183525f8083526020830181905292820152905f805160206145998339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ee4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f0b91908101906141b0565b9150915080611f725760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c5565b8254825114611fd55760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c5565b60208201516001600160a01b0316156120485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c5565b509392505050565b5f805f83516036146120745760405162461bcd60e51b81526004016104c5906142e1565b5f805b60028110156120c35761208b8160016142a7565b612096906008614077565b61ffff168682815181106120ac576120ac6142ba565b016020015160f81c901b9190911790600101612077565b5061ffff8116156120e65760405162461bcd60e51b81526004016104c59061432a565b5f805b6004811015612141576120fd8160036142a7565b612108906008614077565b63ffffffff168761211a8360026142ce565b8151811061212a5761212a6142ba565b016020015160f81c901b91909117906001016120e9565b5063ffffffff81166003146121685760405162461bcd60e51b81526004016104c59061436d565b5f805b60208110156121bd5761217f81601f6142a7565b61218a906008614077565b886121968360066142ce565b815181106121a6576121a66142ba565b016020015160f81c901b919091179060010161216b565b505f805b600881101561221c576121d58160076142a7565b6121e0906008614077565b6001600160401b0316896121f58360266142ce565b81518110612205576122056142ba565b016020015160f81c901b91909117906001016121c1565b505f805b600881101561227b576122348160076142a7565b61223f906008614077565b6001600160401b03168a61225483602e6142ce565b81518110612264576122646142ba565b016020015160f81c901b9190911790600101612220565b5091989097509095509350505050565b5f8181525f805160206145d983398151915260205260408082208151610100810190925280545f8051602061459983398151915293929190829060ff1660058111156122d9576122d9613f13565b60058111156122ea576122ea613f13565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561237257612372613f13565b146123ce5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c5565b60408101516001600160a01b0316336001600160a01b0316146124485760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c5565b6124558160a00151611798565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561249957612499613f13565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6125658461255f81611716565b5f6118cc565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612594908590600401613f84565b6020604051808303815f875af11580156125b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d49190613fb6565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b61263161357e565b6117a2816135c9565b5f80825160271461265d5760405162461bcd60e51b81526004016104c5906142e1565b5f805b60028110156126ac576126748160016142a7565b61267f906008614077565b61ffff16858281518110612695576126956142ba565b016020015160f81c901b9190911790600101612660565b5061ffff8116156126cf5760405162461bcd60e51b81526004016104c59061432a565b5f805b600481101561272a576126e68160036142a7565b6126f1906008614077565b63ffffffff16866127038360026142ce565b81518110612713576127136142ba565b016020015160f81c901b91909117906001016126d2565b5063ffffffff81166002146127515760405162461bcd60e51b81526004016104c59061436d565b5f805b60208110156127a65761276881601f6142a7565b612773906008614077565b8761277f8360066142ce565b8151811061278f5761278f6142ba565b016020015160f81c901b9190911790600101612754565b505f866026815181106127bb576127bb6142ba565b016020015191976001600160f81b03199092161515965090945050505050565b5f6127e461360d565b5f6127ee836109a8565b90505f805160206145598339815191525f612808876117a5565b905060028151600581111561281f5761281f613f13565b1461287e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c5565b61288783613644565b5f838260a0015161289891906143b4565b90506128a48882611884565b5f6128ae89611716565b90505f8989836040516020016128f69392919092835260609190911b6bffffffffffffffffffffffff1916602083015260c01b6001600160c01b0319166034820152603c0190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6129308d86886118cc565b6040518263ffffffff1660e01b815260040161294c9190613f84565b6020604051808303815f875af1158015612968573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061298c9190613fb6565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808c1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260038a01909152902081518154829060ff19166001836004811115612a1457612a14613f13565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938c1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061147360015f805160206145b983398151915255565b5f8051602061455983398151915280545f91908390811015612bc95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c5565b8160010154841115612c305760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c5565b612c39816109a8565b949350505050565b5f612c4a61360d565b5f80516020614599833981519152426001600160401b03851611612ccc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c5565b6001600160401b038416612ce3426202a3006142ce565b11612d565760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c5565b85612dad5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c5565b5f86815260098201602052604090205415612e1b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c5565b8251603014612e825760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c5565b612e8b85613644565b5f80612ed26040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250613662565b5f82815260078601602052604090209193509150612ef08282614418565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612f1d908590600401613f84565b6020604051808303815f875af1158015612f39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f5d9190613fb6565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115612fdf57612fdf613f13565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a4509092505050612c3960015f805160206145b983398151915255565b5f808251602e1461311a5760405162461bcd60e51b81526004016104c5906142e1565b5f805b6002811015613169576131318160016142a7565b61313c906008614077565b61ffff16858281518110613152576131526142ba565b016020015160f81c901b919091179060010161311d565b5061ffff81161561318c5760405162461bcd60e51b81526004016104c59061432a565b5f805b60048110156131e7576131a38160036142a7565b6131ae906008614077565b63ffffffff16866131c08360026142ce565b815181106131d0576131d06142ba565b016020015160f81c901b919091179060010161318f565b5063ffffffff811660041461320e5760405162461bcd60e51b81526004016104c59061436d565b5f805b60208110156132635761322581601f6142a7565b613230906008614077565b8761323c8360066142ce565b8151811061324c5761324c6142ba565b016020015160f81c901b9190911790600101613211565b505f805b60088110156132c25761327b8160076142a7565b613286906008614077565b6001600160401b03168861329b8360266142ce565b815181106132ab576132ab6142ba565b016020015160f81c901b9190911790600101613267565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061459983398151915290600160401b900460ff165f0361331557505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b0316606082015242911580613377575060028301548151613373916001600160401b0316906142ce565b8210155b1561339d576001600160401b0385166060820152818152604081015160208201526133bc565b84816060018181516133af91906143b4565b6001600160401b03169052505b60608101516133cc9060646144d7565b602082015160028501546001600160401b0392909216916133f79190600160401b900460ff16614077565b101561345b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c5565b831561348457846001600160401b03168160400181815161347c91906142ce565b9052506134a3565b846001600160401b03168160400181815161349f91906142a7565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b8047101561350e5760405163cd78605960e01b81523060048201526024016104c5565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613557576040519150601f19603f3d011682016040523d82523d5f602084013e61355c565b606091505b5050905080610c0157604051630a12f52160e11b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166135c757604051631afcd79f60e31b815260040160405180910390fd5b565b6135d161357e565b6135da81613a07565b6117a2608082013560a08301356135f760e0850160c08601613dbf565b613608610100860160e08701614502565b613a28565b5f805160206145b983398151915280546001190161363e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b6117a28160016132cf565b60015f805160206145b983398151915255565b5f60608260800151516030146136cc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613743576137038160016142a7565b61370e906008614077565b5081515f90839083908110613725576137256142ba565b60200101906001600160f81b03191690815f1a9053506001016136ef565b505f5b60048110156137a15761375a8160036142a7565b613765906008614077565b505f826137738360026142ce565b81518110613783576137836142ba565b60200101906001600160f81b03191690815f1a905350600101613746565b505f5b60208110156137fe57845181602081106137c0576137c06142ba565b1a60f81b826137d08360066142ce565b815181106137e0576137e06142ba565b60200101906001600160f81b03191690815f1a9053506001016137a4565b505f5b602081101561385e5784602001518160208110613820576138206142ba565b1a60f81b826138308360266142ce565b81518110613840576138406142ba565b60200101906001600160f81b03191690815f1a905350600101613801565b505f5b60088110156138d2576138758160076142a7565b613880906008614077565b60ff1685604001516001600160401b0316901c60f81b828260466138a491906142ce565b815181106138b4576138b46142ba565b60200101906001600160f81b03191690815f1a905350600101613861565b505f5b603081101561393d57846080015181815181106138f4576138f46142ba565b01602001516001600160f81b0319168261390f83604e6142ce565b8151811061391f5761391f6142ba565b60200101906001600160f81b03191690815f1a9053506001016138d5565b505f5b60088110156139af576139548160076142a7565b61395f906008614077565b60608601516001600160401b0390811691161c60f81b8261398183607e6142ce565b81518110613991576139916142ba565b60200101906001600160f81b03191690815f1a905350600101613940565b506002816040516139c0919061451d565b602060405180830381855afa1580156139db573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906139fe9190613fb6565b94909350915050565b613a0f61357e565b613a17613a83565b613a1f613a93565b6117a281613a9b565b613a3061357e565b5f5f80516020614559833981519152948555506001840192909255600290920180546001600160a01b03909216600160401b026001600160e01b03199092166001600160401b0390931692909217179055565b613a8b61357e565b6135c7613c56565b6135c761357e565b613aa361357e565b80355f8051602061459983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613aef6080840160608501614538565b60ff161115613b5c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c5565b5f613b6d6080840160608501614538565b60ff1611613be35760405162461bcd60e51b815260206004820152603960248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201527f70657263656e746167652063616e6e6f74206265207a65726f0000000000000060648201526084016104c5565b613bf36080830160608401614538565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055613c246060830160408401613dbf565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b61364f61357e565b508054613c6a9061408e565b5f825580601f10613c79575050565b601f0160209004905f5260205f20908101906117a29190613cd9565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613ced575f8155600101613cda565b5090565b80151581146117a2575f80fd5b803563ffffffff81168114613d11575f80fd5b919050565b5f805f60608486031215613d28575f80fd5b833592506020840135613d3a81613cf1565b9150613d4860408501613cfe565b90509250925092565b5f60208284031215613d61575f80fd5b5035919050565b5f60208284031215613d78575f80fd5b61147382613cfe565b5f8060408385031215613d92575f80fd5b613d9b83613cfe565b946020939093013593505050565b80356001600160401b0381168114613d11575f80fd5b5f60208284031215613dcf575f80fd5b61147382613da9565b5f6101008284031215613de9575f80fd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613e2557613e25613def565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613e5357613e53613def565b604052919050565b5f6001600160401b03821115613e7357613e73613def565b50601f01601f191660200190565b5f805f60608486031215613e93575f80fd5b83359250613ea360208501613da9565b915060408401356001600160401b03811115613ebd575f80fd5b8401601f81018613613ecd575f80fd5b8035613ee0613edb82613e5b565b613e2b565b818152876020838501011115613ef4575f80fd5b816020840160208301375f602083830101528093505050509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613f5b57613f5b613f27565b5092915050565b5f5b83811015613f7c578181015183820152602001613f64565b50505f910152565b602081525f8251806020840152613fa2816040850160208701613f62565b601f01601f19169190910160400192915050565b5f60208284031215613fc6575f80fd5b5051919050565b5f82613fe757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109b8576109b8613f27565b600181811c908216806140a257607f821691505b602082108103613de957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546141198161408e565b806020870152604060018084165f811461413a576001811461415657614183565b60ff19851660408a0152604084151560051b8a01019550614183565b895f5260205f205f5b8581101561417a5781548b820186015290830190880161415f565b8a016040019650505b509398975050505050505050565b6001600160a01b03811681146117a2575f80fd5b8051613d1181613cf1565b5f80604083850312156141c1575f80fd5b82516001600160401b03808211156141d7575f80fd5b90840190606082870312156141ea575f80fd5b6141f2613e03565b8251815260208084015161420581614191565b8282015260408401518381111561421a575f80fd5b80850194505087601f85011261422e575f80fd5b8351925061423e613edb84613e5b565b8381528882858701011115614251575f80fd5b61426084838301848801613f62565b806040840152508195506142758188016141a5565b9450505050509250929050565b5f6001600160401b0380831681810361429d5761429d613f27565b6001019392505050565b818103818111156109b8576109b8613f27565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109b8576109b8613f27565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216019080821115613f5b57613f5b613f27565b601f821115610c0157805f5260205f20601f840160051c810160208510156143f95750805b601f840160051c820191505b81811015611334575f8155600101614405565b81516001600160401b0381111561443157614431613def565b6144458161443f845461408e565b846143d4565b602080601f831160018114614478575f84156144615750858301515b5f19600386901b1c1916600185901b1785556144cf565b5f85815260208120601f198616915b828110156144a657888601518255948401946001909101908401614487565b50858210156144c357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b038181168382160280821691908281146144fa576144fa613f27565b505092915050565b5f60208284031215614512575f80fd5b813561147381614191565b5f825161452e818460208701613f62565b9190910192915050565b5f60208284031215614548575f80fd5b813560ff81168114611473575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -458,23 +458,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x0a115d26. +// Initialize is a paid mutator transaction binding the contract method 0x7978da3a. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint64,uint64,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,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 0x0a115d26. +// Initialize is a paid mutator transaction binding the contract method 0x7978da3a. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint64,uint64,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,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 0x0a115d26. +// Initialize is a paid mutator transaction binding the contract method 0x7978da3a. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint64,uint64,uint64,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 5c23bb03c..02f372f65 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -40,7 +40,7 @@ type ValidatorManagerSettings 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"signature\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612df9380380612df983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612cac8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c8063715018a611610088578063a3a65e4811610063578063a3a65e48146101f8578063b771b3bc1461020b578063bee0a03f14610219578063f2fde38b1461022c575f80fd5b8063715018a6146101995780638da5cb5b146101a157806397fb70d4146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f14610148578063580a40061461015b57806366435abf1461016e575b5f80fd5b6100e26100dd3660046125ba565b61023f565b005b6101226100f23660046125ba565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61012261014336600461267e565b610414565b6100e2610156366004612721565b610434565b6100e261016936600461275f565b610441565b61018161017c3660046125ba565b61054f565b6040516001600160401b03909116815260200161012c565b6100e2610563565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101f33660046125ba565b610576565b6100e2610206366004612721565b610582565b6101cd6005600160991b0181565b6100e26102273660046125ba565b61073f565b6100e261023a36600461279b565b610853565b5f8181525f80516020612c8083398151915260205260408082208151610100810190925280545f80516020612c6083398151915293929190829060ff16600581111561028d5761028d6127b6565b600581111561029e5761029e6127b6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610323576103236127b6565b1461038d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103b28584608001515f61088d565b6040518263ffffffff1660e01b81526004016103ce91906127ec565b6020604051808303815f875af11580156103ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040e919061281e565b50505050565b5f61041d610aaa565b61042984868585610b05565b90505b949350505050565b61043d81610fce565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104855750825b90505f826001600160401b031660011480156104a05750303b155b9050811580156104ae575080155b156104cc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104f657845460ff60401b1916600160401b1785555b6105008787611341565b831561054657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105598261135b565b60a0015192915050565b61056b610aaa565b6105745f61143a565b565b61057f816114aa565b50565b5f80516020612c608339815191525f61059a83611848565b90505f806105ab8360400151611a29565b915091508061060d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610384565b5f8281526007850160205260408120805461062790612835565b9050118015610659575060015f83815260088601602052604090205460ff166005811115610657576106576127b6565b145b6106755760405162461bcd60e51b81526004016103849061286d565b5f828152600785016020526040812061068d91612527565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612c6083398151915292919061078790612835565b90501180156107b9575060015f83815260088301602052604090205460ff1660058111156107b7576107b76127b6565b145b6107d55760405162461bcd60e51b81526004016103849061286d565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161080e91906004016128b4565b6020604051808303815f875af115801561082a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084e919061281e565b505050565b61085b610aaa565b6001600160a01b03811661088457604051631e4fbdf760e01b81525f6004820152602401610384565b61057f8161143a565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610906576108c6816001612952565b6108d190600861296b565b5081515f908390839081106108e8576108e8612982565b60200101906001600160f81b03191690815f1a9053506001016108b2565b505f5b60048110156109695761091d816003612952565b61092890600861296b565b6001901c60f81b8261093b836002612996565b8151811061094b5761094b612982565b60200101906001600160f81b03191690815f1a905350600101610909565b505f5b60208110156109cb5761098081601f612952565b61098b90600861296b565b86901c60f81b8261099d836006612996565b815181106109ad576109ad612982565b60200101906001600160f81b03191690815f1a90535060010161096c565b505f5b6008811015610a36576109e2816007612952565b6109ed90600861296b565b6001600160401b038616901c60f81b82610a08836026612996565b81518110610a1857610a18612982565b60200101906001600160f81b03191690815f1a9053506001016109ce565b505f5b6008811015610aa157610a4d816007612952565b610a5890600861296b565b6001600160401b038516901c60f81b82610a7383602e612996565b81518110610a8357610a83612982565b60200101906001600160f81b03191690815f1a905350600101610a39565b50949350505050565b33610adc7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105745760405163118cdaa760e01b8152336004820152602401610384565b5f610b0e611c88565b5f80516020612c60833981519152426001600160401b03851611610b905760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610384565b6001600160401b038416610ba7426202a300612996565b11610c1a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610384565b85610c715760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610384565b5f86815260098201602052604090205415610cdf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610384565b8251603014610d465760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610384565b610d4f85611cd2565b5f80610d966040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611cdd565b5f82815260078601602052604090209193509150610db482826129f4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610de19085906004016127ec565b6020604051808303815f875af1158015610dfd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e21919061281e565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115610ea357610ea36127b6565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061042c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610fd661255e565b5f80516020612c608339815191525f610fee84611848565b90505f80610fff8360400151611a29565b9150915080156110645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610384565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611096576110966127b6565b60058111156110a7576110a76127b6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f908251600581111561112e5761112e6127b6565b148061114c575060018251600581111561114a5761114a6127b6565b145b6111ab5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610384565b6003825160058111156111c0576111c06127b6565b036111cd575060046111d1565b5060055b6020808301515f908152600988019091526040812055818160058111156111fa576111fa6127b6565b9081600581111561120d5761120d6127b6565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611241576112416127b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561130c5761130c6127b6565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b6113496120a8565b611352826120f1565b61043d81612112565b61136361255e565b5f8281525f80516020612c808339815191526020526040908190208151610100810190925280545f80516020612c60833981519152929190829060ff1660058111156113b1576113b16127b6565b60058111156113c2576113c26127b6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181525f80516020612c8083398151915260205260408082208151610100810190925280545f80516020612c6083398151915293929190829060ff1660058111156114f8576114f86127b6565b6005811115611509576115096127b6565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115611591576115916127b6565b146115ed5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610384565b60408101516001600160a01b0316336001600160a01b0316146116675760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610384565b6116748160a00151612123565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156116b8576116b86127b6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6117848461177e8161212d565b5f61088d565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906117b39085906004016127ec565b6020604051808303815f875af11580156117cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f3919061281e565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612c608339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118bd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118e49190810190612ac2565b915091508061194b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610384565b82548251146119ae5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610384565b60208201516001600160a01b031615611a215760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610384565b509392505050565b5f808251602714611a8e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610384565b5f805b6002811015611add57611aa5816001612952565b611ab090600861296b565b61ffff16858281518110611ac657611ac6612982565b016020015160f81c901b9190911790600101611a91565b5061ffff811615611b3c5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610384565b5f805b6004811015611b9757611b53816003612952565b611b5e90600861296b565b63ffffffff1686611b70836002612996565b81518110611b8057611b80612982565b016020015160f81c901b9190911790600101611b3f565b5063ffffffff8116600214611bfe5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610384565b5f805b6020811015611c5357611c1581601f612952565b611c2090600861296b565b87611c2c836006612996565b81518110611c3c57611c3c612982565b016020015160f81c901b9190911790600101611c01565b505f86602681518110611c6857611c68612982565b016020015191976001600160f81b03199092161515965090945050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611ccc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b61057f8160016121af565b5f6060826080015151603014611d475760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610384565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611dbe57611d7e816001612952565b611d8990600861296b565b5081515f90839083908110611da057611da0612982565b60200101906001600160f81b03191690815f1a905350600101611d6a565b505f5b6004811015611e1c57611dd5816003612952565b611de090600861296b565b505f82611dee836002612996565b81518110611dfe57611dfe612982565b60200101906001600160f81b03191690815f1a905350600101611dc1565b505f5b6020811015611e795784518160208110611e3b57611e3b612982565b1a60f81b82611e4b836006612996565b81518110611e5b57611e5b612982565b60200101906001600160f81b03191690815f1a905350600101611e1f565b505f5b6020811015611ed95784602001518160208110611e9b57611e9b612982565b1a60f81b82611eab836026612996565b81518110611ebb57611ebb612982565b60200101906001600160f81b03191690815f1a905350600101611e7c565b505f5b6008811015611f4d57611ef0816007612952565b611efb90600861296b565b60ff1685604001516001600160401b0316901c60f81b82826046611f1f9190612996565b81518110611f2f57611f2f612982565b60200101906001600160f81b03191690815f1a905350600101611edc565b505f5b6030811015611fb85784608001518181518110611f6f57611f6f612982565b01602001516001600160f81b03191682611f8a83604e612996565b81518110611f9a57611f9a612982565b60200101906001600160f81b03191690815f1a905350600101611f50565b505f5b600881101561202a57611fcf816007612952565b611fda90600861296b565b60608601516001600160401b0390811691161c60f81b82611ffc83607e612996565b8151811061200c5761200c612982565b60200101906001600160f81b03191690815f1a905350600101611fbb565b5060028160405161203b9190612b94565b602060405180830381855afa158015612056573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612079919061281e565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661057457604051631afcd79f60e31b815260040160405180910390fd5b6120f96120a8565b6121016123cb565b6121096123db565b61057f816123e3565b61211a6120a8565b61057f81612517565b61057f815f6121af565b5f8181525f80516020612c808339815191526020526040812060030180545f80516020612c60833981519152916001600160401b03909116908361217083612baf565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612c6083398151915290600160401b900460ff165f036121f557505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b0316606082015242911580612257575060028301548151612253916001600160401b031690612996565b8210155b1561227d576001600160401b03851660608201528181526040810151602082015261229c565b848160600181815161228f9190612bd4565b6001600160401b03169052505b60608101516122ac906064612bfb565b602082015160028501546001600160401b0392909216916122d79190600160401b900460ff1661296b565b101561233b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610384565b831561236457846001600160401b03168160400181815161235c9190612996565b905250612383565b846001600160401b03168160400181815161237f9190612952565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b6123d36120a8565b61057461251f565b6105746120a8565b6123eb6120a8565b80355f80516020612c6083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146124376080840160608501612c26565b60ff1611156124a45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610384565b6124b46080830160608401612c26565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556124e56060830160408401612c46565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b61085b6120a8565b6120826120a8565b50805461253390612835565b5f825580601f10612542575050565b601f0160209004905f5260205f209081019061057f91906125a2565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156125b6575f81556001016125a3565b5090565b5f602082840312156125ca575f80fd5b5035919050565b80356001600160401b03811681146125e7575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612622576126226125ec565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612650576126506125ec565b604052919050565b5f6001600160401b03821115612670576126706125ec565b50601f01601f191660200190565b5f805f8060808587031215612691575f80fd5b61269a856125d1565b9350602085013592506126af604086016125d1565b915060608501356001600160401b038111156126c9575f80fd5b8501601f810187136126d9575f80fd5b80356126ec6126e782612658565b612628565b818152886020838501011115612700575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f60208284031215612731575f80fd5b813563ffffffff81168114612744575f80fd5b9392505050565b6001600160a01b038116811461057f575f80fd5b5f8082840360a0811215612771575f80fd5b608081121561277e575f80fd5b5082915060808301356127908161274b565b809150509250929050565b5f602082840312156127ab575f80fd5b81356127448161274b565b634e487b7160e01b5f52602160045260245ffd5b5f5b838110156127e45781810151838201526020016127cc565b50505f910152565b602081525f825180602084015261280a8160408501602087016127ca565b601f01601f19169190910160400192915050565b5f6020828403121561282e575f80fd5b5051919050565b600181811c9082168061284957607f821691505b60208210810361286757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546128c681612835565b806020870152604060018084165f81146128e7576001811461290357612930565b60ff19851660408a0152604084151560051b8a01019550612930565b895f5260205f205f5b858110156129275781548b820186015290830190880161290c565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156129655761296561293e565b92915050565b80820281158282048414176129655761296561293e565b634e487b7160e01b5f52603260045260245ffd5b808201808211156129655761296561293e565b601f82111561084e57805f5260205f20601f840160051c810160208510156129ce5750805b601f840160051c820191505b818110156129ed575f81556001016129da565b5050505050565b81516001600160401b03811115612a0d57612a0d6125ec565b612a2181612a1b8454612835565b846129a9565b602080601f831160018114612a54575f8415612a3d5750858301515b5f19600386901b1c1916600185901b178555612aab565b5f85815260208120601f198616915b82811015612a8257888601518255948401946001909101908401612a63565b5085821015612a9f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b805180151581146125e7575f80fd5b5f8060408385031215612ad3575f80fd5b82516001600160401b0380821115612ae9575f80fd5b9084019060608287031215612afc575f80fd5b612b04612600565b82518152602080840151612b178161274b565b82820152604084015183811115612b2c575f80fd5b80850194505087601f850112612b40575f80fd5b83519250612b506126e784612658565b8381528882858701011115612b63575f80fd5b612b72848383018488016127ca565b80604084015250819550612b87818801612ab3565b9450505050509250929050565b5f8251612ba58184602087016127ca565b9190910192915050565b5f6001600160401b03808316818103612bca57612bca61293e565b6001019392505050565b6001600160401b03818116838216019080821115612bf457612bf461293e565b5092915050565b6001600160401b03818116838216028082169190828114612c1e57612c1e61293e565b505092915050565b5f60208284031215612c36575f80fd5b813560ff81168114612744575f80fd5b5f60208284031215612c56575f80fd5b612744826125d156fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612e80380380612e8083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612d338061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c8063715018a611610088578063a3a65e4811610063578063a3a65e48146101f8578063b771b3bc1461020b578063bee0a03f14610219578063f2fde38b1461022c575f80fd5b8063715018a6146101995780638da5cb5b146101a157806397fb70d4146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e45780633aaa9f2514610135578063467ef06f14610148578063580a40061461015b57806366435abf1461016e575b5f80fd5b6100e26100dd366004612641565b61023f565b005b6101226100f2366004612641565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610122610143366004612705565b610414565b6100e26101563660046127a8565b610434565b6100e26101693660046127e6565b610441565b61018161017c366004612641565b61054f565b6040516001600160401b03909116815260200161012c565b6100e2610563565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101f3366004612641565b610576565b6100e26102063660046127a8565b610582565b6101cd6005600160991b0181565b6100e2610227366004612641565b61073f565b6100e261023a366004612822565b610853565b5f8181525f80516020612d0783398151915260205260408082208151610100810190925280545f80516020612ce783398151915293929190829060ff16600581111561028d5761028d61283d565b600581111561029e5761029e61283d565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156103235761032361283d565b1461038d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103b28584608001515f61088d565b6040518263ffffffff1660e01b81526004016103ce9190612873565b6020604051808303815f875af11580156103ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040e91906128a5565b50505050565b5f61041d610aaa565b61042984868585610b05565b90505b949350505050565b61043d81610fce565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104855750825b90505f826001600160401b031660011480156104a05750303b155b9050811580156104ae575080155b156104cc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104f657845460ff60401b1916600160401b1785555b6105008787611341565b831561054657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105598261135b565b60a0015192915050565b61056b610aaa565b6105745f61143a565b565b61057f816114aa565b50565b5f80516020612ce78339815191525f61059a83611848565b90505f806105ab8360400151611a29565b915091508061060d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610384565b5f82815260078501602052604081208054610627906128bc565b9050118015610659575060015f83815260088601602052604090205460ff1660058111156106575761065761283d565b145b6106755760405162461bcd60e51b8152600401610384906128f4565b5f828152600785016020526040812061068d916125ae565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612ce7833981519152929190610787906128bc565b90501180156107b9575060015f83815260088301602052604090205460ff1660058111156107b7576107b761283d565b145b6107d55760405162461bcd60e51b8152600401610384906128f4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161080e919060040161293b565b6020604051808303815f875af115801561082a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084e91906128a5565b505050565b61085b610aaa565b6001600160a01b03811661088457604051631e4fbdf760e01b81525f6004820152602401610384565b61057f8161143a565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610906576108c68160016129d9565b6108d19060086129f2565b5081515f908390839081106108e8576108e8612a09565b60200101906001600160f81b03191690815f1a9053506001016108b2565b505f5b60048110156109695761091d8160036129d9565b6109289060086129f2565b6001901c60f81b8261093b836002612a1d565b8151811061094b5761094b612a09565b60200101906001600160f81b03191690815f1a905350600101610909565b505f5b60208110156109cb5761098081601f6129d9565b61098b9060086129f2565b86901c60f81b8261099d836006612a1d565b815181106109ad576109ad612a09565b60200101906001600160f81b03191690815f1a90535060010161096c565b505f5b6008811015610a36576109e28160076129d9565b6109ed9060086129f2565b6001600160401b038616901c60f81b82610a08836026612a1d565b81518110610a1857610a18612a09565b60200101906001600160f81b03191690815f1a9053506001016109ce565b505f5b6008811015610aa157610a4d8160076129d9565b610a589060086129f2565b6001600160401b038516901c60f81b82610a7383602e612a1d565b81518110610a8357610a83612a09565b60200101906001600160f81b03191690815f1a905350600101610a39565b50949350505050565b33610adc7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105745760405163118cdaa760e01b8152336004820152602401610384565b5f610b0e611c88565b5f80516020612ce7833981519152426001600160401b03851611610b905760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610384565b6001600160401b038416610ba7426202a300612a1d565b11610c1a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610384565b85610c715760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610384565b5f86815260098201602052604090205415610cdf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610384565b8251603014610d465760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610384565b610d4f85611cd2565b5f80610d966040518060a00160405280856001015481526020018a8152602001896001600160401b03168152602001886001600160401b0316815260200187815250611cdd565b5f82815260078601602052604090209193509150610db48282612a7b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90610de1908590600401612873565b6020604051808303815f875af1158015610dfd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2191906128a5565b604080516101008101825260018152602081018c90529192508101336001600160a01b031681526001600160401b038a1660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115610ea357610ea361283d565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316978516979097179190911716949094179490941790925581518b84168152928a169083015282918b9186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e910160405180910390a450909250505061042c60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b610fd66125e5565b5f80516020612ce78339815191525f610fee84611848565b90505f80610fff8360400151611a29565b9150915080156110645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610384565b5f828152600885016020526040808220815161010081019092528054829060ff1660058111156110965761109661283d565b60058111156110a7576110a761283d565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f908251600581111561112e5761112e61283d565b148061114c575060018251600581111561114a5761114a61283d565b145b6111ab5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610384565b6003825160058111156111c0576111c061283d565b036111cd575060046111d1565b5060055b6020808301515f908152600988019091526040812055818160058111156111fa576111fa61283d565b9081600581111561120d5761120d61283d565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156112415761124161283d565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561130c5761130c61283d565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b6113496120a8565b611352826120f1565b61043d81612112565b6113636125e5565b5f8281525f80516020612d078339815191526020526040908190208151610100810190925280545f80516020612ce7833981519152929190829060ff1660058111156113b1576113b161283d565b60058111156113c2576113c261283d565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f8181525f80516020612d0783398151915260205260408082208151610100810190925280545f80516020612ce783398151915293929190829060ff1660058111156114f8576114f861283d565b60058111156115095761150961283d565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156115915761159161283d565b146115ed5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610384565b60408101516001600160a01b0316336001600160a01b0316146116675760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610384565b6116748160a00151612123565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156116b8576116b861283d565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6117848461177e8161212d565b5f61088d565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906117b3908590600401612873565b6020604051808303815f875af11580156117cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f391906128a5565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612ce78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118bd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118e49190810190612b49565b915091508061194b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610384565b82548251146119ae5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610384565b60208201516001600160a01b031615611a215760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610384565b509392505050565b5f808251602714611a8e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610384565b5f805b6002811015611add57611aa58160016129d9565b611ab09060086129f2565b61ffff16858281518110611ac657611ac6612a09565b016020015160f81c901b9190911790600101611a91565b5061ffff811615611b3c5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610384565b5f805b6004811015611b9757611b538160036129d9565b611b5e9060086129f2565b63ffffffff1686611b70836002612a1d565b81518110611b8057611b80612a09565b016020015160f81c901b9190911790600101611b3f565b5063ffffffff8116600214611bfe5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610384565b5f805b6020811015611c5357611c1581601f6129d9565b611c209060086129f2565b87611c2c836006612a1d565b81518110611c3c57611c3c612a09565b016020015160f81c901b9190911790600101611c01565b505f86602681518110611c6857611c68612a09565b016020015191976001600160f81b03199092161515965090945050505050565b7f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00805460011901611ccc57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b61057f8160016121af565b5f6060826080015151603014611d475760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610384565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611dbe57611d7e8160016129d9565b611d899060086129f2565b5081515f90839083908110611da057611da0612a09565b60200101906001600160f81b03191690815f1a905350600101611d6a565b505f5b6004811015611e1c57611dd58160036129d9565b611de09060086129f2565b505f82611dee836002612a1d565b81518110611dfe57611dfe612a09565b60200101906001600160f81b03191690815f1a905350600101611dc1565b505f5b6020811015611e795784518160208110611e3b57611e3b612a09565b1a60f81b82611e4b836006612a1d565b81518110611e5b57611e5b612a09565b60200101906001600160f81b03191690815f1a905350600101611e1f565b505f5b6020811015611ed95784602001518160208110611e9b57611e9b612a09565b1a60f81b82611eab836026612a1d565b81518110611ebb57611ebb612a09565b60200101906001600160f81b03191690815f1a905350600101611e7c565b505f5b6008811015611f4d57611ef08160076129d9565b611efb9060086129f2565b60ff1685604001516001600160401b0316901c60f81b82826046611f1f9190612a1d565b81518110611f2f57611f2f612a09565b60200101906001600160f81b03191690815f1a905350600101611edc565b505f5b6030811015611fb85784608001518181518110611f6f57611f6f612a09565b01602001516001600160f81b03191682611f8a83604e612a1d565b81518110611f9a57611f9a612a09565b60200101906001600160f81b03191690815f1a905350600101611f50565b505f5b600881101561202a57611fcf8160076129d9565b611fda9060086129f2565b60608601516001600160401b0390811691161c60f81b82611ffc83607e612a1d565b8151811061200c5761200c612a09565b60200101906001600160f81b03191690815f1a905350600101611fbb565b5060028160405161203b9190612c1b565b602060405180830381855afa158015612056573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061207991906128a5565b94909350915050565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661057457604051631afcd79f60e31b815260040160405180910390fd5b6120f96120a8565b6121016123cb565b6121096123db565b61057f816123e3565b61211a6120a8565b61057f8161259e565b61057f815f6121af565b5f8181525f80516020612d078339815191526020526040812060030180545f80516020612ce7833981519152916001600160401b03909116908361217083612c36565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612ce783398151915290600160401b900460ff165f036121f557505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b0316606082015242911580612257575060028301548151612253916001600160401b031690612a1d565b8210155b1561227d576001600160401b03851660608201528181526040810151602082015261229c565b848160600181815161228f9190612c5b565b6001600160401b03169052505b60608101516122ac906064612c82565b602082015160028501546001600160401b0392909216916122d79190600160401b900460ff166129f2565b101561233b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610384565b831561236457846001600160401b03168160400181815161235c9190612a1d565b905250612383565b846001600160401b03168160400181815161237f91906129d9565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b6123d36120a8565b6105746125a6565b6105746120a8565b6123eb6120a8565b80355f80516020612ce783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146124376080840160608501612cad565b60ff1611156124a45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610384565b5f6124b56080840160608501612cad565b60ff161161252b5760405162461bcd60e51b815260206004820152603960248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201527f70657263656e746167652063616e6e6f74206265207a65726f000000000000006064820152608401610384565b61253b6080830160608401612cad565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561256c6060830160408401612ccd565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b61085b6120a8565b6120826120a8565b5080546125ba906128bc565b5f825580601f106125c9575050565b601f0160209004905f5260205f209081019061057f9190612629565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561263d575f815560010161262a565b5090565b5f60208284031215612651575f80fd5b5035919050565b80356001600160401b038116811461266e575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156126a9576126a9612673565b60405290565b604051601f8201601f191681016001600160401b03811182821017156126d7576126d7612673565b604052919050565b5f6001600160401b038211156126f7576126f7612673565b50601f01601f191660200190565b5f805f8060808587031215612718575f80fd5b61272185612658565b93506020850135925061273660408601612658565b915060608501356001600160401b03811115612750575f80fd5b8501601f81018713612760575f80fd5b803561277361276e826126df565b6126af565b818152886020838501011115612787575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f602082840312156127b8575f80fd5b813563ffffffff811681146127cb575f80fd5b9392505050565b6001600160a01b038116811461057f575f80fd5b5f8082840360a08112156127f8575f80fd5b6080811215612805575f80fd5b508291506080830135612817816127d2565b809150509250929050565b5f60208284031215612832575f80fd5b81356127cb816127d2565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561286b578181015183820152602001612853565b50505f910152565b602081525f8251806020840152612891816040850160208701612851565b601f01601f19169190910160400192915050565b5f602082840312156128b5575f80fd5b5051919050565b600181811c908216806128d057607f821691505b6020821081036128ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461294d816128bc565b806020870152604060018084165f811461296e576001811461298a576129b7565b60ff19851660408a0152604084151560051b8a010195506129b7565b895f5260205f205f5b858110156129ae5781548b8201860152908301908801612993565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156129ec576129ec6129c5565b92915050565b80820281158282048414176129ec576129ec6129c5565b634e487b7160e01b5f52603260045260245ffd5b808201808211156129ec576129ec6129c5565b601f82111561084e57805f5260205f20601f840160051c81016020851015612a555750805b601f840160051c820191505b81811015612a74575f8155600101612a61565b5050505050565b81516001600160401b03811115612a9457612a94612673565b612aa881612aa284546128bc565b84612a30565b602080601f831160018114612adb575f8415612ac45750858301515b5f19600386901b1c1916600185901b178555612b32565b5f85815260208120601f198616915b82811015612b0957888601518255948401946001909101908401612aea565b5085821015612b2657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8051801515811461266e575f80fd5b5f8060408385031215612b5a575f80fd5b82516001600160401b0380821115612b70575f80fd5b9084019060608287031215612b83575f80fd5b612b8b612687565b82518152602080840151612b9e816127d2565b82820152604084015183811115612bb3575f80fd5b80850194505087601f850112612bc7575f80fd5b83519250612bd761276e846126df565b8381528882858701011115612bea575f80fd5b612bf984838301848801612851565b80604084015250819550612c0e818801612b3a565b9450505050509250929050565b5f8251612c2c818460208701612851565b9190910192915050565b5f6001600160401b03808316818103612c5157612c516129c5565b6001019392505050565b6001600160401b03818116838216019080821115612c7b57612c7b6129c5565b5092915050565b6001600160401b03818116838216028082169190828114612ca557612ca56129c5565b505092915050565b5f60208284031215612cbd575f80fd5b813560ff811681146127cb575f80fd5b5f60208284031215612cdd575f80fd5b6127cb8261265856fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 672595c2c..ccb64403b 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -22,9 +22,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager /// @custom:storage-location erc7201:avalanche-icm.storage.PoSValidatorManager struct PoSValidatorManagerStorage { /// @notice The minimum weight of stake required to be a validator. - uint64 _minimumStakeWeight; + uint256 _minimumStakeAmount; /// @notice The maximum weight of stake allowed to be a validator. - uint64 _maximumStakeWeight; + uint256 _maximumStakeAmount; /// @notice The minimum amount of time a validator must be staked for. uint64 _minimumStakeDuration; /// @notice The reward calculator for this validator manager. @@ -58,8 +58,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager { __ValidatorManager_init(settings.baseSettings); __POS_Validator_Manager_init_unchained({ - minimumStakeWeight: settings.minimumStakeWeight, - maximumStakeWeight: settings.maximumStakeWeight, + minimumStakeAmount: settings.minimumStakeAmount, + maximumStakeAmount: settings.maximumStakeAmount, minimumStakeDuration: settings.minimumStakeDuration, rewardCalculator: settings.rewardCalculator }); @@ -67,14 +67,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // solhint-disable-next-line func-name-mixedcase function __POS_Validator_Manager_init_unchained( - uint64 minimumStakeWeight, - uint64 maximumStakeWeight, + uint256 minimumStakeAmount, + uint256 maximumStakeAmount, uint64 minimumStakeDuration, IRewardCalculator rewardCalculator ) internal onlyInitializing { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - $._minimumStakeWeight = minimumStakeWeight; - $._maximumStakeWeight = maximumStakeWeight; + $._minimumStakeAmount = minimumStakeAmount; + $._maximumStakeAmount = maximumStakeAmount; $._minimumStakeDuration = minimumStakeDuration; $._rewardCalculator = rewardCalculator; } @@ -124,15 +124,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Lock the stake in the contract. uint256 lockedValue = _lock(stakeAmount); - uint64 weight = valueToWeight(lockedValue); // Ensure the weight is within the valid range. - require( - weight >= $._minimumStakeWeight && weight <= $._maximumStakeWeight, - "PoSValidatorManager: invalid stake weight" - ); + require(stakeAmount >= $._minimumStakeAmount, "PoSValidatorManager: stake amount too low"); + require(stakeAmount <= $._maximumStakeAmount, "PoSValidatorManager: stake amount too high"); - return weight; + return valueToWeight(lockedValue); } function valueToWeight(uint256 value) public pure returns (uint64) { diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 48bade91a..d572e20c2 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -98,6 +98,10 @@ abstract contract ValidatorManager is settings.maximumChurnPercentage <= 20, "ValidatorManager: maximum churn percentage too high" ); + require( + settings.maximumChurnPercentage > 0, + "ValidatorManager: maximum churn percentage cannot be zero" + ); $._maximumChurnPercentage = settings.maximumChurnPercentage; $._churnPeriodSeconds = settings.churnPeriodSeconds; diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index f34e472cd..e5c7ed2b0 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -18,8 +18,8 @@ enum DelegatorStatus { struct PoSValidatorManagerSettings { ValidatorManagerSettings baseSettings; - uint64 minimumStakeWeight; - uint64 maximumStakeWeight; + uint256 minimumStakeAmount; + uint256 maximumStakeAmount; uint64 minimumStakeDuration; IRewardCalculator rewardCalculator; } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index f5c43f843..e2ad6708c 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -35,8 +35,8 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeWeight: DEFAULT_MINIMUM_STAKE_WEIGHT, - maximumStakeWeight: DEFAULT_MAXIMUM_STAKE_WEIGHT, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, rewardCalculator: IRewardCalculator(address(0)) }), @@ -69,14 +69,13 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { return delegationID; } - function _beforeSend(uint64 weight, address spender) internal override { - uint256 value = _weightToValue(weight); - token.safeIncreaseAllowance(spender, value); - token.safeTransfer(spender, value); + function _beforeSend(uint256 amount, address spender) internal override { + token.safeIncreaseAllowance(spender, amount); + token.safeTransfer(spender, amount); // ERC20 tokens need to be pre-approved vm.startPrank(spender); - token.safeIncreaseAllowance(address(app), value); + token.safeIncreaseAllowance(address(app), amount); vm.stopPrank(); } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index ad5ebe9e6..aae8b94c3 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -28,8 +28,8 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeWeight: DEFAULT_MINIMUM_STAKE_WEIGHT, - maximumStakeWeight: DEFAULT_MAXIMUM_STAKE_WEIGHT, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, rewardCalculator: IRewardCalculator(address(0)) }) @@ -61,7 +61,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { return app.initializeDelegatorRegistration{value: value}(validationID); } - function _beforeSend(uint64 weight, address spender) internal override { + function _beforeSend(uint256 amount, address spender) internal override { // Native tokens no need pre approve } diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index a62d1499c..c82a926fa 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -57,7 +57,7 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { } // solhint-disable-next-line no-empty-blocks - function _beforeSend(uint64 weight, address spender) internal virtual override {} + function _beforeSend(uint256 amount, address spender) internal virtual override {} function _valueToWeight(uint256 value) internal virtual override returns (uint64) { return uint64(value); diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 5baf0e428..c696c2760 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -637,7 +637,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.warp(registrationTimestamp); - _beforeSend(weight, delegatorAddress); + _beforeSend(_weightToValue(weight), delegatorAddress); vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorAdded({ diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index edff60be4..ca09f578e 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -31,8 +31,8 @@ abstract contract ValidatorManagerTest is Test { address public constant WARP_PRECOMPILE_ADDRESS = 0x0200000000000000000000000000000000000005; uint64 public constant DEFAULT_WEIGHT = 1e6; - uint64 public constant DEFAULT_MINIMUM_STAKE_WEIGHT = 20; - uint64 public constant DEFAULT_MAXIMUM_STAKE_WEIGHT = 1e10; + uint256 public constant DEFAULT_MINIMUM_STAKE_AMOUNT = 20; + uint256 public constant DEFAULT_MAXIMUM_STAKE_AMOUNT = 1e10; uint64 public constant DEFAULT_CHURN_PERIOD = 1 hours; uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint8 public constant DEFAULT_MAXIMUM_CHURN_PERCENTAGE = 20; @@ -199,7 +199,7 @@ abstract contract ValidatorManagerTest is Test { function testCummulativeChurnRegistration() public { uint64 churnThreshold = uint64(DEFAULT_STARTING_TOTAL_WEIGHT) * DEFAULT_MAXIMUM_CHURN_PERCENTAGE / 100; - _beforeSend(churnThreshold, address(this)); + _beforeSend(_weightToValue(churnThreshold), address(this)); // First registration should succeed _setUpCompleteValidatorRegistration({ @@ -211,7 +211,7 @@ abstract contract ValidatorManagerTest is Test { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _beforeSend(DEFAULT_MINIMUM_STAKE_WEIGHT, address(this)); // TODO may need to be updated with minimum stake amount + _beforeSend(DEFAULT_MINIMUM_STAKE_AMOUNT, address(this)); // TODO may need to be updated with minimum stake amount // Second call should fail vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); @@ -219,14 +219,14 @@ abstract contract ValidatorManagerTest is Test { DEFAULT_NODE_ID, DEFAULT_REGISTRATION_TIMESTAMP + 1, DEFAULT_BLS_PUBLIC_KEY, - DEFAULT_MINIMUM_STAKE_WEIGHT + _valueToWeight(DEFAULT_MINIMUM_STAKE_AMOUNT) ); } function testCummulativeChurnRegistrationAndEndValidation() public { uint64 churnThreshold = uint64(DEFAULT_STARTING_TOTAL_WEIGHT) * DEFAULT_MAXIMUM_CHURN_PERCENTAGE / 100; - _beforeSend(churnThreshold, address(this)); + _beforeSend(_weightToValue(churnThreshold), address(this)); // Registration should succeed bytes32 validationID = _setUpCompleteValidatorRegistration({ @@ -277,7 +277,7 @@ abstract contract ValidatorManagerTest is Test { vm.warp(registrationExpiry - 1); _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); - _beforeSend(weight, address(this)); + _beforeSend(_weightToValue(weight), address(this)); vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodCreated(validationID, nodeID, bytes32(0), weight, registrationExpiry); @@ -396,7 +396,7 @@ abstract contract ValidatorManagerTest is Test { function _initializeEndValidation(bytes32 validationID) internal virtual; - function _beforeSend(uint64 weight, address spender) internal virtual; + function _beforeSend(uint256 amount, address spender) internal virtual; function _weightToValue(uint64 weight) internal virtual returns (uint256); diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index f5347b2bb..06aeaa31c 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -151,8 +151,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(0), }, - MinimumStakeWeight: 1e6, - MaximumStakeWeight: 10e6, + MinimumStakeAmount: big.NewInt(1e6), + MaximumStakeAmount: big.NewInt(10e6), MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), RewardCalculator: common.Address{}, }, diff --git a/tests/utils/staking.go b/tests/utils/staking.go index a8dd9b7cf..c75b64add 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -72,8 +72,8 @@ func DeployAndInitializeNativeTokenStakingManager( ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(0), }, - MinimumStakeWeight: 1e6, - MaximumStakeWeight: 10e6, + MinimumStakeAmount: big.NewInt(1e6), + MaximumStakeAmount: big.NewInt(10e6), MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), RewardCalculator: common.Address{}, }, @@ -133,8 +133,8 @@ func DeployAndInitializeERC20TokenStakingManager( ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(0), }, - MinimumStakeWeight: 1e6, - MaximumStakeWeight: 10e6, + MinimumStakeAmount: big.NewInt(1e6), + MaximumStakeAmount: big.NewInt(10e6), MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), RewardCalculator: common.Address{}, }, From 95b20fa8fe3a9255862b8c21c561c1992c5d5380 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 13 Sep 2024 12:05:44 -0400 Subject: [PATCH 267/545] min stake duration not passing --- tests/flows/staking/erc20_delegation.go | 67 ++++--------------- tests/flows/staking/native_delegation.go | 68 +++++--------------- tests/flows/staking/poa_to_pos.go | 2 +- tests/flows/staking/poa_validator_manager.go | 18 ++---- tests/local/e2e_test.go | 4 +- tests/utils/staking.go | 9 +-- 6 files changed, 40 insertions(+), 128 deletions(-) diff --git a/tests/flows/staking/erc20_delegation.go b/tests/flows/staking/erc20_delegation.go index fe1305516..87bd34e6e 100644 --- a/tests/flows/staking/erc20_delegation.go +++ b/tests/flows/staking/erc20_delegation.go @@ -5,9 +5,7 @@ import ( "math/big" "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" . "github.com/onsi/gomega" @@ -57,60 +55,17 @@ func ERC20Delegation(network interfaces.LocalNetwork) { validatorStake, ) Expect(err).Should(BeNil()) - { - // Initiate validator registration - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} - var receipt *types.Receipt - receipt, validationID = utils.InitializeERC20ValidatorRegistration( - fundedKey, - subnetAInfo, - validatorStake, - erc20, - stakingManagerAddress, - nodeID, - blsPublicKey, - stakingManager, - ) - - // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - - // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateRegisterSubnetValidatorMessage( - signedWarpMessage, - nodeID, - validatorWeight, - subnetAInfo.SubnetID, - blsPublicKey, - ) - - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( - validationID, - true, - subnetAInfo, - pChainInfo, - network, - signatureAggregator, - ) - - // Deliver the Warp message to the subnet - receipt = utils.CompleteERC20ValidatorRegistration( - fundedKey, - subnetAInfo, - stakingManagerAddress, - registrationSignedMessage, - ) - // Check that the validator is registered in the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidationPeriodRegistered, - ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - } + validationID = utils.InitializeAndCompleteERC20ValidatorRegistration( + network, + signatureAggregator, + fundedKey, + subnetAInfo, + pChainInfo, + stakingManager, + stakingManagerAddress, + erc20, + validatorStake, + ) // // Register a delegator diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go index 77de84389..401b43ecf 100644 --- a/tests/flows/staking/native_delegation.go +++ b/tests/flows/staking/native_delegation.go @@ -7,7 +7,6 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" . "github.com/onsi/gomega" @@ -57,58 +56,21 @@ func NativeDelegation(network interfaces.LocalNetwork) { validatorStake, ) Expect(err).Should(BeNil()) - { - // Iniatiate validator registration - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} - var receipt *types.Receipt - receipt, validationID = utils.InitializeNativeValidatorRegistration( - fundedKey, - subnetAInfo, - validatorStake, - nodeID, - blsPublicKey, - stakingManager, - ) - - // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - - // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateRegisterSubnetValidatorMessage( - signedWarpMessage, - nodeID, - validatorWeight, - subnetAInfo.SubnetID, - blsPublicKey, - ) - - // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorRegistrationMessage( - validationID, - true, - subnetAInfo, - pChainInfo, - network, - signatureAggregator, - ) - - // Deliver the Warp message to the subnet - receipt = utils.CompleteNativeValidatorRegistration( - fundedKey, - subnetAInfo, - stakingManagerAddress, - registrationSignedMessage, - ) - // Check that the validator is registered in the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseValidationPeriodRegistered, - ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - } + nodeID := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} + stakeAmount := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) + validationID = utils.InitializeAndCompleteNativeValidatorRegistration( + network, + signatureAggregator, + fundedKey, + subnetAInfo, + pChainInfo, + stakingManager, + stakingManagerAddress, + nodeID, + blsPublicKey, + stakeAmount, + ) // // Register a delegator // diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index 21e9b92c0..c325295b5 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -154,7 +154,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { MaximumStakeAmount: big.NewInt(0).SetUint64(utils.DefaultMaxStakeAmount), MinimumStakeDuration: utils.DefaultMinStakeDurationSeconds, MinimumDelegationFeeBips: utils.DefaultMinDelegateFeeBips, - MaximumStakeMultiplier: uint8(1), + MaximumStakeMultiplier: utils.DefaultMaxStakeMultiplier, RewardCalculator: common.Address{}, }, ) diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 1310f9835..1902801fc 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -3,12 +3,10 @@ package staking import ( "context" "math/big" - "time" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/crypto" @@ -80,17 +78,13 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { { // Try to call with invalid owner - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) - Expect(err).Should(BeNil()) - - _, err = validatorManager.InitializeValidatorRegistration( - opts, - poavalidatormanager.ValidatorRegistrationInput{ - NodeID: nodeID, - RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), - BlsPublicKey: blsPublicKey[:], - }, + utils.InitializePoAValidatorRegistration( + fundedKey, + subnetAInfo, weight, + nodeID, + blsPublicKey, + validatorManager, ) Expect(err).ShouldNot(BeNil()) diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index b4e93b14e..ff69cb939 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -197,12 +197,12 @@ var _ = ginkgo.Describe("[Teleporter integration tests]", func() { }) // Staking tests - ginkgo.It("Native token staking manager", + ginkgo.FIt("Native token staking manager", ginkgo.Label(validatorManagerLabel), func() { staking.NativeTokenStakingManager(LocalNetworkInstance) }) - ginkgo.It("ERC20 token staking manager", + ginkgo.FIt("ERC20 token staking manager", ginkgo.Label(validatorManagerLabel), func() { staking.ERC20TokenStakingManager(LocalNetworkInstance) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 184443c6c..7eb5bde6b 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -31,6 +31,7 @@ const ( DefaultMinStakeDurationSeconds uint64 = 1 DefaultMinStakeAmount uint64 = 1e18 DefaultMaxStakeAmount uint64 = 10e18 + DefaultMaxStakeMultiplier uint8 = 4 ) // @@ -82,7 +83,7 @@ func DeployAndInitializeNativeTokenStakingManager( MaximumStakeAmount: big.NewInt(0).SetUint64(DefaultMaxStakeAmount), MinimumStakeDuration: DefaultMinStakeDurationSeconds, MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, - MaximumStakeMultiplier: uint8(1), + MaximumStakeMultiplier: DefaultMaxStakeMultiplier, RewardCalculator: common.Address{}, }, ) @@ -144,7 +145,7 @@ func DeployAndInitializeERC20TokenStakingManager( MaximumStakeAmount: big.NewInt(0).SetUint64(DefaultMaxStakeAmount), MinimumStakeDuration: DefaultMinStakeDurationSeconds, MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, - MaximumStakeMultiplier: uint8(1), + MaximumStakeMultiplier: DefaultMaxStakeMultiplier, RewardCalculator: common.Address{}, }, erc20Address, @@ -609,7 +610,7 @@ func InitializeEndNativeValidation( validationID ids.ID, ) *types.Receipt { // Make sure minimum stake duration has passed - time.Sleep(time.Duration(DefaultMinStakeDurationSeconds) * time.Second) + time.Sleep(time.Duration(DefaultMinStakeDurationSeconds*2) * time.Second) opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndValidation( @@ -629,7 +630,7 @@ func InitializeEndERC20Validation( validationID ids.ID, ) *types.Receipt { // Make sure minimum stake duration has passed - time.Sleep(time.Duration(DefaultMinStakeDurationSeconds) * time.Second) + time.Sleep(time.Duration(DefaultMinStakeDurationSeconds*15) * time.Second) opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndValidation( From 18365835d9d4fd856fa9bcf641fbd94967fd3dba Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 13 Sep 2024 12:11:55 -0400 Subject: [PATCH 268/545] Fix unit tests --- contracts/staking/tests/ValidatorManagerTests.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index ca09f578e..5de7650a8 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -31,8 +31,8 @@ abstract contract ValidatorManagerTest is Test { address public constant WARP_PRECOMPILE_ADDRESS = 0x0200000000000000000000000000000000000005; uint64 public constant DEFAULT_WEIGHT = 1e6; - uint256 public constant DEFAULT_MINIMUM_STAKE_AMOUNT = 20; - uint256 public constant DEFAULT_MAXIMUM_STAKE_AMOUNT = 1e10; + uint256 public constant DEFAULT_MINIMUM_STAKE_AMOUNT = 20e12; + uint256 public constant DEFAULT_MAXIMUM_STAKE_AMOUNT = 1e22; uint64 public constant DEFAULT_CHURN_PERIOD = 1 hours; uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint8 public constant DEFAULT_MAXIMUM_CHURN_PERCENTAGE = 20; From ceff4ed65efeecff6bad4316958505b16e2b9662 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 13 Sep 2024 12:13:25 -0400 Subject: [PATCH 269/545] Fix e2e tests --- contracts/staking/tests/ValidatorManagerTests.t.sol | 2 +- tests/flows/staking/poa_to_pos.go | 2 +- tests/utils/staking.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 5de7650a8..96cac9864 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -32,7 +32,7 @@ abstract contract ValidatorManagerTest is Test { uint64 public constant DEFAULT_WEIGHT = 1e6; uint256 public constant DEFAULT_MINIMUM_STAKE_AMOUNT = 20e12; - uint256 public constant DEFAULT_MAXIMUM_STAKE_AMOUNT = 1e22; +uint256 public constant DEFAULT_MAXIMUM_STAKE_AMOUNT = 1e22; uint64 public constant DEFAULT_CHURN_PERIOD = 1 hours; uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint8 public constant DEFAULT_MAXIMUM_CHURN_PERCENTAGE = 20; diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index 06aeaa31c..85f55155d 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -149,7 +149,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnetAInfo.SubnetID, ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(0), + MaximumChurnPercentage: uint8(20), }, MinimumStakeAmount: big.NewInt(1e6), MaximumStakeAmount: big.NewInt(10e6), diff --git a/tests/utils/staking.go b/tests/utils/staking.go index c75b64add..df3b5d809 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -70,7 +70,7 @@ func DeployAndInitializeNativeTokenStakingManager( PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnet.SubnetID, ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(0), + MaximumChurnPercentage: uint8(20), }, MinimumStakeAmount: big.NewInt(1e6), MaximumStakeAmount: big.NewInt(10e6), @@ -131,7 +131,7 @@ func DeployAndInitializeERC20TokenStakingManager( PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnet.SubnetID, ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(0), + MaximumChurnPercentage: uint8(20), }, MinimumStakeAmount: big.NewInt(1e6), MaximumStakeAmount: big.NewInt(10e6), From 2eb6d02c397eb960904a7d98728527730f1fd31e Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 13 Sep 2024 12:17:41 -0400 Subject: [PATCH 270/545] Add comment --- contracts/staking/ValidatorManager.sol | 1 + contracts/staking/tests/ValidatorManagerTests.t.sol | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index d572e20c2..b67122fe3 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -413,6 +413,7 @@ abstract contract ValidatorManager is churnTracker.startedAt = currentTime; churnTracker.initialWeight = churnTracker.totalWeight; } else { + // Churn is always additive whether the weight is being added or removed. churnTracker.churnAmount += weight; } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 96cac9864..5de7650a8 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -32,7 +32,7 @@ abstract contract ValidatorManagerTest is Test { uint64 public constant DEFAULT_WEIGHT = 1e6; uint256 public constant DEFAULT_MINIMUM_STAKE_AMOUNT = 20e12; -uint256 public constant DEFAULT_MAXIMUM_STAKE_AMOUNT = 1e22; + uint256 public constant DEFAULT_MAXIMUM_STAKE_AMOUNT = 1e22; uint64 public constant DEFAULT_CHURN_PERIOD = 1 hours; uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint8 public constant DEFAULT_MAXIMUM_CHURN_PERCENTAGE = 20; From 6372e82a3ce8f5fb42fff3890cfcc2137af087c2 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Fri, 13 Sep 2024 13:07:53 -0400 Subject: [PATCH 271/545] min stake duration fix --- tests/flows/staking/erc20_token_staking.go | 16 +++++++++++++++- tests/flows/staking/native_token_staking.go | 16 +++++++++++++++- tests/utils/staking.go | 4 ---- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/tests/flows/staking/erc20_token_staking.go b/tests/flows/staking/erc20_token_staking.go index 7c3fd4e07..922abc51f 100644 --- a/tests/flows/staking/erc20_token_staking.go +++ b/tests/flows/staking/erc20_token_staking.go @@ -3,6 +3,7 @@ package staking import ( "context" "math/big" + "time" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/subnet-evm/accounts/abi/bind" @@ -31,7 +32,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // Get the subnets info cChainInfo := network.GetPrimaryNetworkInfo() subnetAInfo, _ := utils.GetTwoSubnets(network) - _, fundedKey := network.GetFundedAccountInfo() + fundedAddress, fundedKey := network.GetFundedAccountInfo() pChainInfo := utils.GetPChainInfo(cChainInfo) signatureAggregator := utils.NewSignatureAggregator( @@ -71,6 +72,19 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakeAmount, ) + // Make sure minimum stake duration has passed + time.Sleep(time.Duration(utils.DefaultMinStakeDurationSeconds) * time.Second) + + // Send a loopback transaction to self to force a block production + // before delisting the validator. + utils.SendNativeTransfer( + context.Background(), + subnetAInfo, + fundedKey, + fundedAddress, + big.NewInt(10), + ) + // // Delist the validator // diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index 12b7b8a94..859c2e943 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -3,6 +3,7 @@ package staking import ( "context" "math/big" + "time" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" @@ -32,7 +33,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Get the subnets info cChainInfo := network.GetPrimaryNetworkInfo() subnetAInfo, _ := utils.GetTwoSubnets(network) - _, fundedKey := network.GetFundedAccountInfo() + fundedAddress, fundedKey := network.GetFundedAccountInfo() pChainInfo := utils.GetPChainInfo(cChainInfo) signatureAggregator := utils.NewSignatureAggregator( @@ -79,6 +80,19 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { ) } + // Make sure minimum stake duration has passed + time.Sleep(time.Duration(utils.DefaultMinStakeDurationSeconds) * time.Second) + + // Send a loopback transaction to self to force a block production + // before delisting the validator. + utils.SendNativeTransfer( + context.Background(), + subnetAInfo, + fundedKey, + fundedAddress, + big.NewInt(10), + ) + // // Delist the validator // diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 7eb5bde6b..c2fe4339d 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -609,8 +609,6 @@ func InitializeEndNativeValidation( stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, validationID ids.ID, ) *types.Receipt { - // Make sure minimum stake duration has passed - time.Sleep(time.Duration(DefaultMinStakeDurationSeconds*2) * time.Second) opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndValidation( @@ -629,8 +627,6 @@ func InitializeEndERC20Validation( stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, validationID ids.ID, ) *types.Receipt { - // Make sure minimum stake duration has passed - time.Sleep(time.Duration(DefaultMinStakeDurationSeconds*15) * time.Second) opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndValidation( From 4894609d90a7f339b488a93e4f69dd4e5b09a8d9 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 13 Sep 2024 13:21:54 -0400 Subject: [PATCH 272/545] add public getValidator function and fix e2e test --- .../ERC20TokenStakingManager.go | 47 ++++++++++++++- .../NativeTokenStakingManager.go | 47 ++++++++++++++- .../PoAValidatorManager.go | 47 ++++++++++++++- contracts/staking/PoSValidatorManager.sol | 12 ++-- contracts/staking/ValidatorManager.sol | 12 ++-- tests/flows/staking/native_delegation.go | 5 -- tests/flows/staking/native_token_staking.go | 57 ++++++++----------- tests/flows/staking/poa_to_pos.go | 11 +--- tests/flows/staking/poa_validator_manager.go | 24 ++++---- tests/local/e2e_test.go | 6 +- tests/utils/staking.go | 10 ++-- 11 files changed, 197 insertions(+), 81 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index fca30a149..6c18cfbc6 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -46,6 +46,18 @@ type PoSValidatorRequirements struct { MinStakeDuration uint64 } +// Validator is an auto generated low-level Go binding around an user-defined struct. +type Validator struct { + Status uint8 + NodeID [32]byte + Owner common.Address + StartingWeight uint64 + MessageNonce uint64 + Weight uint64 + StartedAt uint64 + EndedAt uint64 +} + // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { PChainBlockchainID [32]byte @@ -62,8 +74,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614ec6380380614ec683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d798061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c806366435abf116100a9578063a13fd29d1161006e578063a13fd29d14610292578063a3a65e48146102a5578063b771b3bc146102b8578063ba3a4b97146102de578063bee0a03f146102f1575f80fd5b806366435abf146102335780636f5f1c941461024657806376f786211461025957806398f3e2b41461026c5780639e1bc4ef1461027f575f80fd5b80632e2194d8116100ef5780632e2194d8146101b357806335455ded146101de578063467ef06f146101fa5780635297fae61461020d5780636206585614610220575f80fd5b80630118acc4146101205780630322ed98146101355780630cdd098514610148578063151d30d114610199575b5f80fd5b61013361012e366004614322565b610304565b005b61013361014336600461435d565b61076e565b61018661015636600461435d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101a1600a81565b60405160ff9091168152602001610190565b6101c66101c136600461435d565b61093e565b6040516001600160401b039091168152602001610190565b6101e761271081565b60405161ffff9091168152602001610190565b610133610208366004614374565b610954565b61013361021b36600461438d565b61097f565b61018661022e3660046143c9565b610b4f565b6101c661024136600461435d565b610b68565b6101336102543660046143f8565b610b7c565b610133610267366004614322565b610c60565b61013361027a36600461438d565b610d40565b61018661028d366004614436565b610f4f565b6101866102a0366004614456565b610f62565b6101336102b3366004614374565b610f8e565b6102c66005600160991b0181565b6040516001600160a01b039091168152602001610190565b6101336102ec36600461435d565b61114b565b6101336102ff36600461435d565b6113d1565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614ccd8339815191529184156103565761035382856114e5565b90505b5f868152600684016020526040808220815161010081019092528054829060ff166004811115610388576103886144b7565b6004811115610399576103996144b7565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610420576104206144b7565b146104725760405162461bcd60e51b815260206004820152602a60248201525f80516020614ced8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104d75760405162461bcd60e51b815260206004820152603360248201525f80516020614ced8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610469565b5f6104e184611781565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561052e5761052e6144b7565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61060085611803565b905082606001516001600160401b03168160a001516001600160401b0316116106775760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610469565b5f83606001518260a0015161068c91906144df565b905061069886826118e2565b5f6005600160991b0163ee5b48eb6106b189878661192a565b6040518263ffffffff1660e01b81526004016106cd9190614528565b6020604051808303815f875af11580156106e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070d919061455a565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614d4d83398151915260205260408082208151610100810190925280545f80516020614d0d83398151915293929190829060ff1660058111156107bc576107bc6144b7565b60058111156107cd576107cd6144b7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610852576108526144b7565b146108b75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610469565b6005600160991b016001600160a01b031663ee5b48eb6108dc8584608001515f61192a565b6040518263ffffffff1660e01b81526004016108f89190614528565b6020604051808303815f875af1158015610914573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610938919061455a565b50505050565b5f61094e64e8d4a5100083614585565b92915050565b5f61095e82611b47565b905061097b81606001516001600160401b03168260400151611eba565b5050565b5f80516020614ccd8339815191525f61099784611ef0565b90505f806109a883604001516120d1565b50915091505f6109b783611803565b9050816001600160401b031681608001516001600160401b031610156109ef5760405162461bcd60e51b815260040161046990614598565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a345760405162461bcd60e51b8152600401610469906145da565b60015f87815260068701602052604090205460ff166004811115610a5a57610a5a6144b7565b14610ac35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610469565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61094e6001600160401b03831664e8d4a51000614623565b5f610b7282611803565b60a0015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bc5575080546001600160401b03808416911610155b15610be35760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c0e848461230c565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020614ccd8339815191525f610c7885611803565b5f86815260058401602052604090205460c0820151919250610caa91620100009091046001600160401b03169061463a565b6001600160401b0316421015610d1e5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610469565b8315610d3057610d2e85846114e5565b505b610d3985612326565b5050505050565b5f80516020614ccd8339815191525f610d5884611ef0565b90505f80610d6983604001516120d1565b50915091505f610d7883611803565b9050816001600160401b031681608001516001600160401b03161015610db05760405162461bcd60e51b815260040161046990614598565b5f8681526006860160205260409020600301546001600160401b0380841691161115610dee5760405162461bcd60e51b8152600401610469906145da565b60035f87815260068701602052604090205460ff166004811115610e1457610e146144b7565b14610e685760405162461bcd60e51b815260206004820152603160248201525f80516020614ced8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610469565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f0d91611eba565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f5b8333846126c4565b9392505050565b5f610f6b612ab9565b610f76848484612af0565b9050610f5b60015f80516020614d2d83398151915255565b5f80516020614d0d8339815191525f610fa683611ef0565b90505f80610fb78360400151612cd2565b91509150806110195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610469565b5f828152600585016020526040812080546110339061465a565b9050118015611065575060015f83815260068601602052604090205460ff166005811115611063576110636144b7565b145b6110815760405162461bcd60e51b815260040161046990614692565b5f82815260058501602052604081206110999161426a565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614ccd83398151915293929190829060ff1660048111156111ac576111ac6144b7565b60048111156111bd576111bd6144b7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611244576112446144b7565b14806112625750600381516004811115611260576112606144b7565b145b6112b65760405162461bcd60e51b815260206004820152603260248201525f80516020614ced833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610469565b5f6112c48260400151611803565b905080608001516001600160401b03165f036113485760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610469565b6005600160991b016001600160a01b031663ee5b48eb611375846040015184608001518560a0015161192a565b6040518263ffffffff1660e01b81526004016113919190614528565b6020604051808303815f875af11580156113ad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d39919061455a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614d0d8339815191529291906114199061465a565b905011801561144b575060015f83815260068301602052604090205460ff166005811115611449576114496144b7565b145b6114675760405162461bcd60e51b815260040161046990614692565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114a091906004016146d9565b6020604051808303815f875af11580156114bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e0919061455a565b505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611530573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261155791908101906147da565b91509150806115ba5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610469565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115fd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611621919061455a565b8251146116855760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610469565b60208201516001600160a01b0316156116fb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610469565b5f8061170a8460400151612e73565b915091508187146117775760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610469565b9695505050505050565b5f8181525f80516020614d4d8339815191526020526040812060030180545f80516020614d0d833981519152916001600160401b0390911690836117c4836148c2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b61180b6142a1565b5f8281525f80516020614d4d8339815191526020526040908190208151610100810190925280545f80516020614d0d833981519152929190829060ff166005811115611859576118596144b7565b600581111561186a5761186a6144b7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614d4d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119a3576119638160016148e7565b61196e906008614623565b5081515f90839083908110611985576119856148fa565b60200101906001600160f81b03191690815f1a90535060010161194f565b505f5b6004811015611a06576119ba8160036148e7565b6119c5906008614623565b6001901c60f81b826119d883600261490e565b815181106119e8576119e86148fa565b60200101906001600160f81b03191690815f1a9053506001016119a6565b505f5b6020811015611a6857611a1d81601f6148e7565b611a28906008614623565b86901c60f81b82611a3a83600661490e565b81518110611a4a57611a4a6148fa565b60200101906001600160f81b03191690815f1a905350600101611a09565b505f5b6008811015611ad357611a7f8160076148e7565b611a8a906008614623565b6001600160401b038616901c60f81b82611aa583602661490e565b81518110611ab557611ab56148fa565b60200101906001600160f81b03191690815f1a905350600101611a6b565b505f5b6008811015611b3e57611aea8160076148e7565b611af5906008614623565b6001600160401b038516901c60f81b82611b1083602e61490e565b81518110611b2057611b206148fa565b60200101906001600160f81b03191690815f1a905350600101611ad6565b50949350505050565b611b4f6142a1565b5f80516020614d0d8339815191525f611b6784611ef0565b90505f80611b788360400151612cd2565b915091508015611bdd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610469565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611c0f57611c0f6144b7565b6005811115611c2057611c206144b7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ca757611ca76144b7565b1480611cc55750600182516005811115611cc357611cc36144b7565b145b611d245760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610469565b600382516005811115611d3957611d396144b7565b03611d4657506004611d4a565b5060055b6020808301515f90815260078801909152604081205581816005811115611d7357611d736144b7565b90816005811115611d8657611d866144b7565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611dba57611dba6144b7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e8557611e856144b7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461097b906001600160a01b0316828461304b565b60408051606080820183525f8083526020830181905292820152905f80516020614d0d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f8c91908101906147da565b9150915080611ff35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610469565b82548251146120565760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610469565b60208201516001600160a01b0316156120c95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610469565b509392505050565b5f805f83516036146120f55760405162461bcd60e51b815260040161046990614921565b5f805b60028110156121445761210c8160016148e7565b612117906008614623565b61ffff1686828151811061212d5761212d6148fa565b016020015160f81c901b91909117906001016120f8565b5061ffff8116156121675760405162461bcd60e51b81526004016104699061496a565b5f805b60048110156121c25761217e8160036148e7565b612189906008614623565b63ffffffff168761219b83600261490e565b815181106121ab576121ab6148fa565b016020015160f81c901b919091179060010161216a565b5063ffffffff81166003146121e95760405162461bcd60e51b8152600401610469906149ad565b5f805b602081101561223e5761220081601f6148e7565b61220b906008614623565b8861221783600661490e565b81518110612227576122276148fa565b016020015160f81c901b91909117906001016121ec565b505f805b600881101561229d576122568160076148e7565b612261906008614623565b6001600160401b03168961227683602661490e565b81518110612286576122866148fa565b016020015160f81c901b9190911790600101612242565b505f805b60088110156122fc576122b58160076148e7565b6122c0906008614623565b6001600160401b03168a6122d583602e61490e565b815181106122e5576122e56148fa565b016020015160f81c901b91909117906001016122a1565b5091989097509095509350505050565b6123146130aa565b61231d826130f5565b61097b81613162565b5f8181525f80516020614d4d83398151915260205260408082208151610100810190925280545f80516020614d0d83398151915293929190829060ff166005811115612374576123746144b7565b6005811115612385576123856144b7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561240d5761240d6144b7565b146124695760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610469565b60408101516001600160a01b0316336001600160a01b0316146124e35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610469565b6124f08160a00151613216565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115612534576125346144b7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612600846125fa81611781565b5f61192a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061262f908590600401614528565b6020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f919061455a565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126cd612ab9565b5f80516020614ccd8339815191525f6126e86101c1856133b7565b90505f6126f487611803565b905060028151600581111561270b5761270b6144b7565b1461276a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610469565b5f828260a0015161277b919061463a565b6004850154606084015191925061279d916001600160401b03909116906149f4565b6001600160401b0316816001600160401b0316111561281c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610469565b61282688826118e2565b5f61283089611781565b90505f898260405160200161285c92919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061287d85613216565b5f6005600160991b0163ee5b48eb6128968d868861192a565b6040518263ffffffff1660e01b81526004016128b29190614528565b6020604051808303815f875af11580156128ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128f2919061455a565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561297a5761297a6144b7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610f5b60015f80516020614d2d83398151915255565b5f80516020614d2d833981519152805460011901612aea57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ccd833981519152906001600160401b0316612b3c60408601602087016143c9565b6001600160401b03161015612bab5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610469565b6003810154612bbd6020860186614a2e565b61ffff1610158015612be15750612710612bda6020860186614a2e565b61ffff1611155b612bfd5760405162461bcd60e51b815260040161046990614a49565b80548310801590612c12575080600101548311155b612c705760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610469565b5f612c7a846133b7565b90505f612c868261093e565b90505f612c9388836133ed565b5f81815260058601602052604090209091508790612cb18282614a94565b509098975050505050505050565b60015f80516020614d2d83398151915255565b5f808251602714612cf55760405162461bcd60e51b815260040161046990614921565b5f805b6002811015612d4457612d0c8160016148e7565b612d17906008614623565b61ffff16858281518110612d2d57612d2d6148fa565b016020015160f81c901b9190911790600101612cf8565b5061ffff811615612d675760405162461bcd60e51b81526004016104699061496a565b5f805b6004811015612dc257612d7e8160036148e7565b612d89906008614623565b63ffffffff1686612d9b83600261490e565b81518110612dab57612dab6148fa565b016020015160f81c901b9190911790600101612d6a565b5063ffffffff8116600214612de95760405162461bcd60e51b8152600401610469906149ad565b5f805b6020811015612e3e57612e0081601f6148e7565b612e0b906008614623565b87612e1783600661490e565b81518110612e2757612e276148fa565b016020015160f81c901b9190911790600101612dec565b505f86602681518110612e5357612e536148fa565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e965760405162461bcd60e51b815260040161046990614921565b5f805b6002811015612ee557612ead8160016148e7565b612eb8906008614623565b61ffff16858281518110612ece57612ece6148fa565b016020015160f81c901b9190911790600101612e99565b5061ffff811615612f085760405162461bcd60e51b81526004016104699061496a565b5f805b6004811015612f6357612f1f8160036148e7565b612f2a906008614623565b63ffffffff1686612f3c83600261490e565b81518110612f4c57612f4c6148fa565b016020015160f81c901b9190911790600101612f0b565b5063ffffffff8116600414612f8a5760405162461bcd60e51b8152600401610469906149ad565b5f805b6020811015612fdf57612fa181601f6148e7565b612fac906008614623565b87612fb883600661490e565b81518110612fc857612fc86148fa565b016020015160f81c901b9190911790600101612f8d565b505f805b600881101561303e57612ff78160076148e7565b613002906008614623565b6001600160401b03168861301783602661490e565b81518110613027576130276148fa565b016020015160f81c901b9190911790600101612fe3565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526114e091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506138b7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130f357604051631afcd79f60e31b815260040160405180910390fd5b565b6130fd6130aa565b61310681613918565b61315f6060820135608083013561312360c0850160a086016143c9565b61313360e0860160c08701614a2e565b61ffff16613148610100870160e08801614aea565b61315a61012088016101008901614b0a565b613939565b50565b61316a6130aa565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131f65760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610469565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614d0d8339815191529060ff165f03613254575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061329c90836148e7565b106132b8576001600160401b03841660408301528082526132d7565b83826040018181516132ca919061463a565b6001600160401b03169052505b5f8260200151836040015160646132ee91906149f4565b6132f89190614b25565b600285015490915060ff90811690821611156133735760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610469565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f61094e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b7d565b5f5f80516020614d0d8339815191524261340d60408601602087016143c9565b6001600160401b0316118015613446575061342e60408501602086016143c9565b6001600160401b0316613444426202a30061490e565b115b6134a85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610469565b83356135005760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610469565b83355f908152600782016020526040902054156135705760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610469565b61357d6040850185614b4a565b90506030146135e45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610469565b6135ed83613216565b5f806136876040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061363291906143c9565b6001600160401b0316815260200161364d60408a018a614b4a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613cdf565b5f828152600586016020526040902091935091506136a58282614bd7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906136d2908590600401614528565b6020604051808303815f875af11580156136ee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613712919061455a565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff19166001836005811115613794576137946144b7565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161388991908e01908e016143c9565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6138cb6001600160a01b03841683614084565b905080515f141580156138ef5750808060200190518101906138ed9190614c96565b155b156114e057604051635274afe760e01b81526001600160a01b0384166004820152602401610469565b6139206130aa565b613928614091565b6139306140a1565b61315f816140a9565b6139416130aa565b5f80516020614ccd833981519152836139ad5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610469565b6127108411156139cf5760405162461bcd60e51b815260040161046990614a49565b85871115613a375760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610469565b5f8360ff1611613aa45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610469565b600a60ff84161115613b165760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610469565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613be7919061455a565b9050613bfe6001600160a01b038516333086614115565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c66919061455a565b9050818111613ccc5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610469565b613cd682826148e7565b95945050505050565b5f6060826080015151603014613d495760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610469565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613dc057613d808160016148e7565b613d8b906008614623565b5081515f90839083908110613da257613da26148fa565b60200101906001600160f81b03191690815f1a905350600101613d6c565b505f5b6004811015613e1e57613dd78160036148e7565b613de2906008614623565b505f82613df083600261490e565b81518110613e0057613e006148fa565b60200101906001600160f81b03191690815f1a905350600101613dc3565b505f5b6020811015613e7b5784518160208110613e3d57613e3d6148fa565b1a60f81b82613e4d83600661490e565b81518110613e5d57613e5d6148fa565b60200101906001600160f81b03191690815f1a905350600101613e21565b505f5b6020811015613edb5784602001518160208110613e9d57613e9d6148fa565b1a60f81b82613ead83602661490e565b81518110613ebd57613ebd6148fa565b60200101906001600160f81b03191690815f1a905350600101613e7e565b505f5b6008811015613f4f57613ef28160076148e7565b613efd906008614623565b60ff1685604001516001600160401b0316901c60f81b82826046613f21919061490e565b81518110613f3157613f316148fa565b60200101906001600160f81b03191690815f1a905350600101613ede565b505f5b6030811015613fba5784608001518181518110613f7157613f716148fa565b01602001516001600160f81b03191682613f8c83604e61490e565b81518110613f9c57613f9c6148fa565b60200101906001600160f81b03191690815f1a905350600101613f52565b505f5b600881101561402c57613fd18160076148e7565b613fdc906008614623565b60608601516001600160401b0390811691161c60f81b82613ffe83607e61490e565b8151811061400e5761400e6148fa565b60200101906001600160f81b03191690815f1a905350600101613fbd565b5060028160405161403d9190614cb1565b602060405180830381855afa158015614058573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061407b919061455a565b94909350915050565b6060610f5b83835f61414e565b6140996130aa565b6130f36141dd565b6130f36130aa565b6140b16130aa565b80355f80516020614d0d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556140fb6060830160408401614aea565b600291909101805460ff191660ff90921691909117905550565b6040516001600160a01b0384811660248301528381166044830152606482018390526109389186918216906323b872dd90608401613078565b6060814710156141735760405163cd78605960e01b8152306004820152602401610469565b5f80856001600160a01b0316848660405161418e9190614cb1565b5f6040518083038185875af1925050503d805f81146141c8576040519150601f19603f3d011682016040523d82523d5f602084013e6141cd565b606091505b50915091506117778683836141e5565b612cbf6130aa565b6060826141fa576141f582614241565b610f5b565b815115801561421157506001600160a01b0384163b155b1561423a57604051639996b31560e01b81526001600160a01b0385166004820152602401610469565b5080610f5b565b8051156142515780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546142769061465a565b5f825580601f10614285575050565b601f0160209004905f5260205f209081019061315f91906142e5565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156142f9575f81556001016142e6565b5090565b801515811461315f575f80fd5b803563ffffffff8116811461431d575f80fd5b919050565b5f805f60608486031215614334575f80fd5b833592506020840135614346816142fd565b91506143546040850161430a565b90509250925092565b5f6020828403121561436d575f80fd5b5035919050565b5f60208284031215614384575f80fd5b610f5b8261430a565b5f806040838503121561439e575f80fd5b6143a78361430a565b946020939093013593505050565b6001600160401b038116811461315f575f80fd5b5f602082840312156143d9575f80fd5b8135610f5b816143b5565b6001600160a01b038116811461315f575f80fd5b5f8082840361014081121561440b575f80fd5b6101208082121561441a575f80fd5b849350830135905061442b816143e4565b809150509250929050565b5f8060408385031215614447575f80fd5b50508035926020909101359150565b5f805f8385036080811215614469575f80fd5b84356001600160401b0381111561447e575f80fd5b85016060818803121561448f575f80fd5b93506040601f19820112156144a2575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144ff576144ff6144cb565b5092915050565b5f5b83811015614520578181015183820152602001614508565b50505f910152565b602081525f8251806020840152614546816040850160208701614506565b601f01601f19169190910160400192915050565b5f6020828403121561456a575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261459357614593614571565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761094e5761094e6144cb565b6001600160401b038181168382160190808211156144ff576144ff6144cb565b600181811c9082168061466e57607f821691505b60208210810361468c57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546146eb8161465a565b806020870152604060018084165f811461470c576001811461472857614755565b60ff19851660408a0152604084151560051b8a01019550614755565b895f5260205f205f5b8581101561474c5781548b8201860152908301908801614731565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561479957614799614763565b60405290565b604051601f8201601f191681016001600160401b03811182821017156147c7576147c7614763565b604052919050565b805161431d816142fd565b5f80604083850312156147eb575f80fd5b82516001600160401b0380821115614801575f80fd5b9084019060608287031215614814575f80fd5b61481c614777565b8251815260208084015161482f816143e4565b82820152604084015183811115614844575f80fd5b80850194505087601f850112614858575f80fd5b83518381111561486a5761486a614763565b61487c601f8201601f1916830161479f565b93508084528882828701011115614891575f80fd5b6148a081838601848801614506565b508260408301528195506148b58188016147cf565b9450505050509250929050565b5f6001600160401b038083168181036148dd576148dd6144cb565b6001019392505050565b8181038181111561094e5761094e6144cb565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561094e5761094e6144cb565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614a1757614a176144cb565b505092915050565b61ffff8116811461315f575f80fd5b5f60208284031215614a3e575f80fd5b8135610f5b81614a1f565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614a9f81614a1f565b61ffff8116905081548161ffff1982161783556020840135614ac0816143b5565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614afa575f80fd5b813560ff81168114610f5b575f80fd5b5f60208284031215614b1a575f80fd5b8135610f5b816143e4565b5f6001600160401b0380841680614b3e57614b3e614571565b92169190910492915050565b5f808335601e19843603018112614b5f575f80fd5b8301803591506001600160401b03821115614b78575f80fd5b602001915036819003821315614b8c575f80fd5b9250929050565b601f8211156114e057805f5260205f20601f840160051c81016020851015614bb85750805b601f840160051c820191505b81811015610d39575f8155600101614bc4565b81516001600160401b03811115614bf057614bf0614763565b614c0481614bfe845461465a565b84614b93565b602080601f831160018114614c37575f8415614c205750858301515b5f19600386901b1c1916600185901b178555614c8e565b5f85815260208120601f198616915b82811015614c6557888601518255948401946001909101908401614c46565b5085821015614c8257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614ca6575f80fd5b8151610f5b816142fd565b5f8251614cc2818460208701614506565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614fc4380380614fc483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614e778061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c80636f5f1c94116100a9578063a3a65e481161006e578063a3a65e48146102b0578063b771b3bc146102c3578063ba3a4b97146102e9578063bee0a03f146102fc578063d5f20ff61461030f575f80fd5b80636f5f1c941461025157806376f786211461026457806398f3e2b4146102775780639e1bc4ef1461028a578063a13fd29d1461029d575f80fd5b806335455ded116100ef57806335455ded146101e9578063467ef06f146102055780635297fae614610218578063620658561461022b57806366435abf1461023e575f80fd5b80630118acc41461012b5780630322ed98146101405780630cdd098514610153578063151d30d1146101a45780632e2194d8146101be575b5f80fd5b61013e61013936600461434d565b61032f565b005b61013e61014e366004614388565b610799565b610191610161366004614388565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101ac600a81565b60405160ff909116815260200161019b565b6101d16101cc366004614388565b610969565b6040516001600160401b03909116815260200161019b565b6101f261271081565b60405161ffff909116815260200161019b565b61013e61021336600461439f565b61097f565b61013e6102263660046143b8565b6109aa565b6101916102393660046143f4565b610b7a565b6101d161024c366004614388565b610b93565b61013e61025f366004614423565b610ba7565b61013e61027236600461434d565b610c8b565b61013e6102853660046143b8565b610d6b565b610191610298366004614461565b610f7a565b6101916102ab366004614481565b610f8d565b61013e6102be36600461439f565b610fb9565b6102d16005600160991b0181565b6040516001600160a01b03909116815260200161019b565b61013e6102f7366004614388565b611176565b61013e61030a366004614388565b6113fc565b61032261031d366004614388565b611510565b60405161019b91906144f6565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614dcb8339815191529184156103815761037e82856115ef565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103b3576103b36144e2565b60048111156103c4576103c46144e2565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561044b5761044b6144e2565b1461049d5760405162461bcd60e51b815260206004820152602a60248201525f80516020614deb8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105025760405162461bcd60e51b815260206004820152603360248201525f80516020614deb8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610494565b5f61050c8461188b565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff19166001836004811115610559576105596144e2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61062b85611510565b905082606001516001600160401b03168160a001516001600160401b0316116106a25760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610494565b5f83606001518260a001516106b791906145e4565b90506106c3868261190d565b5f6005600160991b0163ee5b48eb6106dc898786611955565b6040518263ffffffff1660e01b81526004016106f89190614626565b6020604051808303815f875af1158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190614658565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614e4b83398151915260205260408082208151610100810190925280545f80516020614e0b83398151915293929190829060ff1660058111156107e7576107e76144e2565b60058111156107f8576107f86144e2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561087d5761087d6144e2565b146108e25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610494565b6005600160991b016001600160a01b031663ee5b48eb6109078584608001515f611955565b6040518263ffffffff1660e01b81526004016109239190614626565b6020604051808303815f875af115801561093f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109639190614658565b50505050565b5f61097964e8d4a5100083614683565b92915050565b5f61098982611b72565b90506109a681606001516001600160401b03168260400151611ee5565b5050565b5f80516020614dcb8339815191525f6109c284611f1b565b90505f806109d383604001516120fc565b50915091505f6109e283611510565b9050816001600160401b031681608001516001600160401b03161015610a1a5760405162461bcd60e51b815260040161049490614696565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a5f5760405162461bcd60e51b8152600401610494906146d8565b60015f87815260068701602052604090205460ff166004811115610a8557610a856144e2565b14610aee5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610494565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109796001600160401b03831664e8d4a51000614721565b5f610b9d82611510565b60a0015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c398484612337565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020614dcb8339815191525f610ca385611510565b5f86815260058401602052604090205460c0820151919250610cd591620100009091046001600160401b031690614738565b6001600160401b0316421015610d495760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610494565b8315610d5b57610d5985846115ef565b505b610d6485612351565b5050505050565b5f80516020614dcb8339815191525f610d8384611f1b565b90505f80610d9483604001516120fc565b50915091505f610da383611510565b9050816001600160401b031681608001516001600160401b03161015610ddb5760405162461bcd60e51b815260040161049490614696565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e195760405162461bcd60e51b8152600401610494906146d8565b60035f87815260068701602052604090205460ff166004811115610e3f57610e3f6144e2565b14610e935760405162461bcd60e51b815260206004820152603160248201525f80516020614deb8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610494565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f3891611ee5565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f868333846126ef565b9392505050565b5f610f96612ae4565b610fa1848484612b1b565b9050610f8660015f80516020614e2b83398151915255565b5f80516020614e0b8339815191525f610fd183611f1b565b90505f80610fe28360400151612cfd565b91509150806110445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610494565b5f8281526005850160205260408120805461105e90614758565b9050118015611090575060015f83815260068601602052604090205460ff16600581111561108e5761108e6144e2565b145b6110ac5760405162461bcd60e51b815260040161049490614790565b5f82815260058501602052604081206110c491614295565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614dcb83398151915293929190829060ff1660048111156111d7576111d76144e2565b60048111156111e8576111e86144e2565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561126f5761126f6144e2565b148061128d575060038151600481111561128b5761128b6144e2565b145b6112e15760405162461bcd60e51b815260206004820152603260248201525f80516020614deb833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610494565b5f6112ef8260400151611510565b905080608001516001600160401b03165f036113735760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610494565b6005600160991b016001600160a01b031663ee5b48eb6113a0846040015184608001518560a00151611955565b6040518263ffffffff1660e01b81526004016113bc9190614626565b6020604051808303815f875af11580156113d8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d649190614658565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614e0b83398151915292919061144490614758565b9050118015611476575060015f83815260068301602052604090205460ff166005811115611474576114746144e2565b145b6114925760405162461bcd60e51b815260040161049490614790565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114cb91906004016147d7565b6020604051808303815f875af11580156114e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061150b9190614658565b505050565b6115186142cc565b5f8281525f80516020614e4b8339815191526020526040908190208151610100810190925280545f80516020614e0b833981519152929190829060ff166005811115611566576115666144e2565b6005811115611577576115776144e2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561163a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261166191908101906148d8565b91509150806116c45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610494565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172b9190614658565b82511461178f5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610494565b60208201516001600160a01b0316156118055760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610494565b5f806118148460400151612e9e565b915091508187146118815760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610494565b9695505050505050565b5f8181525f80516020614e4b8339815191526020526040812060030180545f80516020614e0b833981519152916001600160401b0390911690836118ce836149c0565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b5f9182525f80516020614e4b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119ce5761198e8160016149e5565b611999906008614721565b5081515f908390839081106119b0576119b06149f8565b60200101906001600160f81b03191690815f1a90535060010161197a565b505f5b6004811015611a31576119e58160036149e5565b6119f0906008614721565b6001901c60f81b82611a03836002614a0c565b81518110611a1357611a136149f8565b60200101906001600160f81b03191690815f1a9053506001016119d1565b505f5b6020811015611a9357611a4881601f6149e5565b611a53906008614721565b86901c60f81b82611a65836006614a0c565b81518110611a7557611a756149f8565b60200101906001600160f81b03191690815f1a905350600101611a34565b505f5b6008811015611afe57611aaa8160076149e5565b611ab5906008614721565b6001600160401b038616901c60f81b82611ad0836026614a0c565b81518110611ae057611ae06149f8565b60200101906001600160f81b03191690815f1a905350600101611a96565b505f5b6008811015611b6957611b158160076149e5565b611b20906008614721565b6001600160401b038516901c60f81b82611b3b83602e614a0c565b81518110611b4b57611b4b6149f8565b60200101906001600160f81b03191690815f1a905350600101611b01565b50949350505050565b611b7a6142cc565b5f80516020614e0b8339815191525f611b9284611f1b565b90505f80611ba38360400151612cfd565b915091508015611c085760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610494565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611c3a57611c3a6144e2565b6005811115611c4b57611c4b6144e2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611cd257611cd26144e2565b1480611cf05750600182516005811115611cee57611cee6144e2565b145b611d4f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610494565b600382516005811115611d6457611d646144e2565b03611d7157506004611d75565b5060055b6020808301515f90815260078801909152604081205581816005811115611d9e57611d9e6144e2565b90816005811115611db157611db16144e2565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611de557611de56144e2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611eb057611eb06144e2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546109a6906001600160a01b03168284613076565b60408051606080820183525f8083526020830181905292820152905f80516020614e0b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f90573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fb791908101906148d8565b915091508061201e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610494565b82548251146120815760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610494565b60208201516001600160a01b0316156120f45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610494565b509392505050565b5f805f83516036146121205760405162461bcd60e51b815260040161049490614a1f565b5f805b600281101561216f576121378160016149e5565b612142906008614721565b61ffff16868281518110612158576121586149f8565b016020015160f81c901b9190911790600101612123565b5061ffff8116156121925760405162461bcd60e51b815260040161049490614a68565b5f805b60048110156121ed576121a98160036149e5565b6121b4906008614721565b63ffffffff16876121c6836002614a0c565b815181106121d6576121d66149f8565b016020015160f81c901b9190911790600101612195565b5063ffffffff81166003146122145760405162461bcd60e51b815260040161049490614aab565b5f805b60208110156122695761222b81601f6149e5565b612236906008614721565b88612242836006614a0c565b81518110612252576122526149f8565b016020015160f81c901b9190911790600101612217565b505f805b60088110156122c8576122818160076149e5565b61228c906008614721565b6001600160401b0316896122a1836026614a0c565b815181106122b1576122b16149f8565b016020015160f81c901b919091179060010161226d565b505f805b6008811015612327576122e08160076149e5565b6122eb906008614721565b6001600160401b03168a61230083602e614a0c565b81518110612310576123106149f8565b016020015160f81c901b91909117906001016122cc565b5091989097509095509350505050565b61233f6130d5565b61234882613120565b6109a68161318d565b5f8181525f80516020614e4b83398151915260205260408082208151610100810190925280545f80516020614e0b83398151915293929190829060ff16600581111561239f5761239f6144e2565b60058111156123b0576123b06144e2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612438576124386144e2565b146124945760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610494565b60408101516001600160a01b0316336001600160a01b03161461250e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610494565b61251b8160a00151613241565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561255f5761255f6144e2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61262b846126258161188b565b5f611955565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061265a908590600401614626565b6020604051808303815f875af1158015612676573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061269a9190614658565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126f8612ae4565b5f80516020614dcb8339815191525f6127136101cc856133e2565b90505f61271f87611510565b9050600281516005811115612736576127366144e2565b146127955760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610494565b5f828260a001516127a69190614738565b600485015460608401519192506127c8916001600160401b0390911690614af2565b6001600160401b0316816001600160401b031611156128475760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610494565b612851888261190d565b5f61285b8961188b565b90505f898260405160200161288792919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090506128a885613241565b5f6005600160991b0163ee5b48eb6128c18d8688611955565b6040518263ffffffff1660e01b81526004016128dd9190614626565b6020604051808303815f875af11580156128f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061291d9190614658565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156129a5576129a56144e2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610f8660015f80516020614e2b83398151915255565b5f80516020614e2b833981519152805460011901612b1557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614dcb833981519152906001600160401b0316612b6760408601602087016143f4565b6001600160401b03161015612bd65760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610494565b6003810154612be86020860186614b2c565b61ffff1610158015612c0c5750612710612c056020860186614b2c565b61ffff1611155b612c285760405162461bcd60e51b815260040161049490614b47565b80548310801590612c3d575080600101548311155b612c9b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610494565b5f612ca5846133e2565b90505f612cb182610969565b90505f612cbe8883613418565b5f81815260058601602052604090209091508790612cdc8282614b92565b509098975050505050505050565b60015f80516020614e2b83398151915255565b5f808251602714612d205760405162461bcd60e51b815260040161049490614a1f565b5f805b6002811015612d6f57612d378160016149e5565b612d42906008614721565b61ffff16858281518110612d5857612d586149f8565b016020015160f81c901b9190911790600101612d23565b5061ffff811615612d925760405162461bcd60e51b815260040161049490614a68565b5f805b6004811015612ded57612da98160036149e5565b612db4906008614721565b63ffffffff1686612dc6836002614a0c565b81518110612dd657612dd66149f8565b016020015160f81c901b9190911790600101612d95565b5063ffffffff8116600214612e145760405162461bcd60e51b815260040161049490614aab565b5f805b6020811015612e6957612e2b81601f6149e5565b612e36906008614721565b87612e42836006614a0c565b81518110612e5257612e526149f8565b016020015160f81c901b9190911790600101612e17565b505f86602681518110612e7e57612e7e6149f8565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612ec15760405162461bcd60e51b815260040161049490614a1f565b5f805b6002811015612f1057612ed88160016149e5565b612ee3906008614721565b61ffff16858281518110612ef957612ef96149f8565b016020015160f81c901b9190911790600101612ec4565b5061ffff811615612f335760405162461bcd60e51b815260040161049490614a68565b5f805b6004811015612f8e57612f4a8160036149e5565b612f55906008614721565b63ffffffff1686612f67836002614a0c565b81518110612f7757612f776149f8565b016020015160f81c901b9190911790600101612f36565b5063ffffffff8116600414612fb55760405162461bcd60e51b815260040161049490614aab565b5f805b602081101561300a57612fcc81601f6149e5565b612fd7906008614721565b87612fe3836006614a0c565b81518110612ff357612ff36149f8565b016020015160f81c901b9190911790600101612fb8565b505f805b6008811015613069576130228160076149e5565b61302d906008614721565b6001600160401b031688613042836026614a0c565b81518110613052576130526149f8565b016020015160f81c901b919091179060010161300e565b5090969095509350505050565b6040516001600160a01b0383811660248301526044820183905261150b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506138e2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661311e57604051631afcd79f60e31b815260040160405180910390fd5b565b6131286130d5565b61313181613943565b61318a6060820135608083013561314e60c0850160a086016143f4565b61315e60e0860160c08701614b2c565b61ffff16613173610100870160e08801614be8565b61318561012088016101008901614c08565b613964565b50565b6131956130d5565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132215760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610494565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614e0b8339815191529060ff165f0361327f575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132c790836149e5565b106132e3576001600160401b0384166040830152808252613302565b83826040018181516132f59190614738565b6001600160401b03169052505b5f8260200151836040015160646133199190614af2565b6133239190614c23565b600285015490915060ff908116908216111561339e5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610494565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610979827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613ba8565b5f5f80516020614e0b8339815191524261343860408601602087016143f4565b6001600160401b0316118015613471575061345960408501602086016143f4565b6001600160401b031661346f426202a300614a0c565b115b6134d35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610494565b833561352b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610494565b83355f9081526007820160205260409020541561359b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610494565b6135a86040850185614c48565b905060301461360f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610494565b61361883613241565b5f806136b26040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061365d91906143f4565b6001600160401b0316815260200161367860408a018a614c48565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613d0a565b5f828152600586016020526040902091935091506136d08282614cd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906136fd908590600401614626565b6020604051808303815f875af1158015613719573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061373d9190614658565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156137bf576137bf6144e2565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916138b491908e01908e016143f4565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6138f66001600160a01b038416836140af565b905080515f1415801561391a5750808060200190518101906139189190614d94565b155b1561150b57604051635274afe760e01b81526001600160a01b0384166004820152602401610494565b61394b6130d5565b6139536140bc565b61395b6140cc565b61318a816140d4565b61396c6130d5565b5f80516020614dcb833981519152836139d85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610494565b6127108411156139fa5760405162461bcd60e51b815260040161049490614b47565b85871115613a625760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610494565b5f8360ff1611613acf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610494565b600a60ff84161115613b415760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610494565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613bee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c129190614658565b9050613c296001600160a01b038516333086614140565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c919190614658565b9050818111613cf75760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610494565b613d0182826149e5565b95945050505050565b5f6060826080015151603014613d745760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610494565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613deb57613dab8160016149e5565b613db6906008614721565b5081515f90839083908110613dcd57613dcd6149f8565b60200101906001600160f81b03191690815f1a905350600101613d97565b505f5b6004811015613e4957613e028160036149e5565b613e0d906008614721565b505f82613e1b836002614a0c565b81518110613e2b57613e2b6149f8565b60200101906001600160f81b03191690815f1a905350600101613dee565b505f5b6020811015613ea65784518160208110613e6857613e686149f8565b1a60f81b82613e78836006614a0c565b81518110613e8857613e886149f8565b60200101906001600160f81b03191690815f1a905350600101613e4c565b505f5b6020811015613f065784602001518160208110613ec857613ec86149f8565b1a60f81b82613ed8836026614a0c565b81518110613ee857613ee86149f8565b60200101906001600160f81b03191690815f1a905350600101613ea9565b505f5b6008811015613f7a57613f1d8160076149e5565b613f28906008614721565b60ff1685604001516001600160401b0316901c60f81b82826046613f4c9190614a0c565b81518110613f5c57613f5c6149f8565b60200101906001600160f81b03191690815f1a905350600101613f09565b505f5b6030811015613fe55784608001518181518110613f9c57613f9c6149f8565b01602001516001600160f81b03191682613fb783604e614a0c565b81518110613fc757613fc76149f8565b60200101906001600160f81b03191690815f1a905350600101613f7d565b505f5b600881101561405757613ffc8160076149e5565b614007906008614721565b60608601516001600160401b0390811691161c60f81b8261402983607e614a0c565b81518110614039576140396149f8565b60200101906001600160f81b03191690815f1a905350600101613fe8565b506002816040516140689190614daf565b602060405180830381855afa158015614083573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906140a69190614658565b94909350915050565b6060610f8683835f614179565b6140c46130d5565b61311e614208565b61311e6130d5565b6140dc6130d5565b80355f80516020614e0b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556141266060830160408401614be8565b600291909101805460ff191660ff90921691909117905550565b6040516001600160a01b0384811660248301528381166044830152606482018390526109639186918216906323b872dd906084016130a3565b60608147101561419e5760405163cd78605960e01b8152306004820152602401610494565b5f80856001600160a01b031684866040516141b99190614daf565b5f6040518083038185875af1925050503d805f81146141f3576040519150601f19603f3d011682016040523d82523d5f602084013e6141f8565b606091505b5091509150611881868383614210565b612cea6130d5565b606082614225576142208261426c565b610f86565b815115801561423c57506001600160a01b0384163b155b1561426557604051639996b31560e01b81526001600160a01b0385166004820152602401610494565b5080610f86565b80511561427c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546142a190614758565b5f825580601f106142b0575050565b601f0160209004905f5260205f209081019061318a9190614310565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614324575f8155600101614311565b5090565b801515811461318a575f80fd5b803563ffffffff81168114614348575f80fd5b919050565b5f805f6060848603121561435f575f80fd5b83359250602084013561437181614328565b915061437f60408501614335565b90509250925092565b5f60208284031215614398575f80fd5b5035919050565b5f602082840312156143af575f80fd5b610f8682614335565b5f80604083850312156143c9575f80fd5b6143d283614335565b946020939093013593505050565b6001600160401b038116811461318a575f80fd5b5f60208284031215614404575f80fd5b8135610f86816143e0565b6001600160a01b038116811461318a575f80fd5b5f80828403610140811215614436575f80fd5b61012080821215614445575f80fd5b84935083013590506144568161440f565b809150509250929050565b5f8060408385031215614472575f80fd5b50508035926020909101359150565b5f805f8385036080811215614494575f80fd5b84356001600160401b038111156144a9575f80fd5b8501606081880312156144ba575f80fd5b93506040601f19820112156144cd575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061451a57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161454260408401826001600160a01b03169052565b50606083015161455d60608401826001600160401b03169052565b50608083015161457860808401826001600160401b03169052565b5060a083015161459360a08401826001600160401b03169052565b5060c08301516145ae60c08401826001600160401b03169052565b5060e08301516145c960e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156145c9576145c96145d0565b5f5b8381101561461e578181015183820152602001614606565b50505f910152565b602081525f8251806020840152614644816040850160208701614604565b601f01601f19169190910160400192915050565b5f60208284031215614668575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826146915761469161466f565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610979576109796145d0565b6001600160401b038181168382160190808211156145c9576145c96145d0565b600181811c9082168061476c57607f821691505b60208210810361478a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546147e981614758565b806020870152604060018084165f811461480a576001811461482657614853565b60ff19851660408a0152604084151560051b8a01019550614853565b895f5260205f205f5b8581101561484a5781548b820186015290830190880161482f565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561489757614897614861565b60405290565b604051601f8201601f191681016001600160401b03811182821017156148c5576148c5614861565b604052919050565b805161434881614328565b5f80604083850312156148e9575f80fd5b82516001600160401b03808211156148ff575f80fd5b9084019060608287031215614912575f80fd5b61491a614875565b8251815260208084015161492d8161440f565b82820152604084015183811115614942575f80fd5b80850194505087601f850112614956575f80fd5b83518381111561496857614968614861565b61497a601f8201601f1916830161489d565b9350808452888282870101111561498f575f80fd5b61499e81838601848801614604565b508260408301528195506149b38188016148cd565b9450505050509250929050565b5f6001600160401b038083168181036149db576149db6145d0565b6001019392505050565b81810381811115610979576109796145d0565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610979576109796145d0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614b1557614b156145d0565b505092915050565b61ffff8116811461318a575f80fd5b5f60208284031215614b3c575f80fd5b8135610f8681614b1d565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614b9d81614b1d565b61ffff8116905081548161ffff1982161783556020840135614bbe816143e0565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614bf8575f80fd5b813560ff81168114610f86575f80fd5b5f60208284031215614c18575f80fd5b8135610f868161440f565b5f6001600160401b0380841680614c3c57614c3c61466f565b92169190910492915050565b5f808335601e19843603018112614c5d575f80fd5b8301803591506001600160401b03821115614c76575f80fd5b602001915036819003821315614c8a575f80fd5b9250929050565b601f82111561150b57805f5260205f20601f840160051c81016020851015614cb65750805b601f840160051c820191505b81811015610d64575f8155600101614cc2565b81516001600160401b03811115614cee57614cee614861565b614d0281614cfc8454614758565b84614c91565b602080601f831160018114614d35575f8415614d1e5750858301515b5f19600386901b1c1916600185901b178555614d8c565b5f85815260208120601f198616915b82811015614d6357888601518255948401946001909101908401614d44565b5085821015614d8057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614da4575f80fd5b8151610f8681614328565b5f8251614dc0818460208701614604565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -357,6 +369,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) ActiveVa return _ERC20TokenStakingManager.Contract.ActiveValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) } +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "getValidator", validationID) + + if err != nil { + return *new(Validator), err + } + + out0 := *abi.ConvertType(out[0], new(Validator)).(*Validator) + + return out0, err + +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _ERC20TokenStakingManager.Contract.GetValidator(&_ERC20TokenStakingManager.CallOpts, validationID) +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _ERC20TokenStakingManager.Contract.GetValidator(&_ERC20TokenStakingManager.CallOpts, validationID) +} + // GetWeight is a free data retrieval call binding the contract method 0x66435abf. // // Solidity: function getWeight(bytes32 validationID) view returns(uint64) diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index e99e4d6b5..56b263790 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -46,6 +46,18 @@ type PoSValidatorRequirements struct { MinStakeDuration uint64 } +// Validator is an auto generated low-level Go binding around an user-defined struct. +type Validator struct { + Status uint8 + NodeID [32]byte + Owner common.Address + StartingWeight uint64 + MessageNonce uint64 + Weight uint64 + StartedAt uint64 + EndedAt uint64 +} + // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { PChainBlockchainID [32]byte @@ -62,8 +74,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614b02380380614b0283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149b58061014d5f395ff3fe608060405260043610610110575f3560e01c806366435abf1161009d578063b771b3bc11610062578063b771b3bc14610322578063ba3a4b9714610354578063bee0a03f14610373578063c123c6db14610392578063c599e24f146103b1575f80fd5b806366435abf1461029357806376f78621146102b257806380a8ad94146102d157806398f3e2b4146102e4578063a3a65e4814610303575f80fd5b80632e2194d8116100e35780632e2194d8146101d757806335455ded1461020e578063467ef06f146102365780635297fae6146102555780636206585614610274575f80fd5b80630118acc4146101145780630322ed98146101355780630cdd098514610154578063151d30d1146101b1575b5f80fd5b34801561011f575f80fd5b5061013361012e366004613fce565b6103c4565b005b348015610140575f80fd5b5061013361014f366004614009565b61082e565b34801561015f575f80fd5b5061019e61016e366004614009565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101bc575f80fd5b506101c5600a81565b60405160ff90911681526020016101a8565b3480156101e2575f80fd5b506101f66101f1366004614009565b6109fe565b6040516001600160401b0390911681526020016101a8565b348015610219575f80fd5b5061022361271081565b60405161ffff90911681526020016101a8565b348015610241575f80fd5b50610133610250366004614020565b610a14565b348015610260575f80fd5b5061013361026f366004614039565b610a3f565b34801561027f575f80fd5b5061019e61028e366004614075565b610c0f565b34801561029e575f80fd5b506101f66102ad366004614009565b610c28565b3480156102bd575f80fd5b506101336102cc366004613fce565b610c3c565b61019e6102df366004614090565b610d1c565b3480156102ef575f80fd5b506101336102fe366004614039565b610d48565b34801561030e575f80fd5b5061013361031d366004614020565b610f57565b34801561032d575f80fd5b5061033c6005600160991b0181565b6040516001600160a01b0390911681526020016101a8565b34801561035f575f80fd5b5061013361036e366004614009565b611114565b34801561037e575f80fd5b5061013361038d366004614009565b61139a565b34801561039d575f80fd5b506101336103ac3660046140e9565b6114ae565b61019e6103bf366004614009565b611590565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061490983398151915291841561041657610413828561159c565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561044857610448614100565b600481111561045957610459614100565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104e0576104e0614100565b146105325760405162461bcd60e51b815260206004820152602a60248201525f805160206149298339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105975760405162461bcd60e51b815260206004820152603360248201525f805160206149298339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610529565b5f6105a184611838565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105ee576105ee614100565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106c0856118ba565b905082606001516001600160401b03168160a001516001600160401b0316116107375760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610529565b5f83606001518260a0015161074c9190614128565b90506107588682611999565b5f6005600160991b0163ee5b48eb6107718987866119e1565b6040518263ffffffff1660e01b815260040161078d9190614171565b6020604051808303815f875af11580156107a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107cd91906141a3565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061498983398151915260205260408082208151610100810190925280545f8051602061494983398151915293929190829060ff16600581111561087c5761087c614100565b600581111561088d5761088d614100565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561091257610912614100565b146109775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610529565b6005600160991b016001600160a01b031663ee5b48eb61099c8584608001515f6119e1565b6040518263ffffffff1660e01b81526004016109b89190614171565b6020604051808303815f875af11580156109d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f891906141a3565b50505050565b5f610a0e64e8d4a51000836141ce565b92915050565b5f610a1e82611c00565b9050610a3b81606001516001600160401b03168260400151611f73565b5050565b5f805160206149098339815191525f610a5784611f86565b90505f80610a688360400151612167565b50915091505f610a77836118ba565b9050816001600160401b031681608001516001600160401b03161015610aaf5760405162461bcd60e51b8152600401610529906141e1565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610af45760405162461bcd60e51b815260040161052990614223565b60015f87815260068701602052604090205460ff166004811115610b1a57610b1a614100565b14610b835760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610529565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a0e6001600160401b03831664e8d4a5100061426c565b5f610c32826118ba565b60a0015192915050565b5f805160206149098339815191525f610c54856118ba565b5f86815260058401602052604090205460c0820151919250610c8691620100009091046001600160401b031690614283565b6001600160401b0316421015610cfa5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610529565b8315610d0c57610d0a858461159c565b505b610d15856123a2565b5050505050565b5f610d25612740565b610d30838334612777565b9050610a0e60015f8051602061496983398151915255565b5f805160206149098339815191525f610d6084611f86565b90505f80610d718360400151612167565b50915091505f610d80836118ba565b9050816001600160401b031681608001516001600160401b03161015610db85760405162461bcd60e51b8152600401610529906141e1565b5f8681526006860160205260409020600301546001600160401b0380841691161115610df65760405162461bcd60e51b815260040161052990614223565b60035f87815260068701602052604090205460ff166004811115610e1c57610e1c614100565b14610e705760405162461bcd60e51b815260206004820152603160248201525f805160206149298339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610529565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f1591611f73565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206149498339815191525f610f6f83611f86565b90505f80610f80836040015161294e565b9150915080610fe25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610529565b5f82815260058501602052604081208054610ffc906142a3565b905011801561102e575060015f83815260068601602052604090205460ff16600581111561102c5761102c614100565b145b61104a5760405162461bcd60e51b8152600401610529906142d5565b5f828152600585016020526040812061106291613f16565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061490983398151915293929190829060ff16600481111561117557611175614100565b600481111561118657611186614100565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561120d5761120d614100565b148061122b575060038151600481111561122957611229614100565b145b61127f5760405162461bcd60e51b815260206004820152603260248201525f80516020614929833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610529565b5f61128d82604001516118ba565b905080608001516001600160401b03165f036113115760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610529565b6005600160991b016001600160a01b031663ee5b48eb61133e846040015184608001518560a001516119e1565b6040518263ffffffff1660e01b815260040161135a9190614171565b6020604051808303815f875af1158015611376573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1591906141a3565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206149498339815191529291906113e2906142a3565b9050118015611414575060015f83815260068301602052604090205460ff16600581111561141257611412614100565b145b6114305760405162461bcd60e51b8152600401610529906142d5565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611469919060040161431c565b6020604051808303815f875af1158015611485573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a991906141a3565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806114f7575080546001600160401b03808416911610155b156115155760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561153f83612aef565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a0e823334612b03565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115e7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261160e9190810190614431565b91509150806116715760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610529565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d891906141a3565b82511461173c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610529565b60208201516001600160a01b0316156117b25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610529565b5f806117c18460400151612ef5565b9150915081871461182e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610529565b9695505050505050565b5f8181525f805160206149898339815191526020526040812060030180545f80516020614949833981519152916001600160401b03909116908361187b83614519565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6118c2613f4d565b5f8281525f805160206149898339815191526020526040908190208151610100810190925280545f80516020614949833981519152929190829060ff16600581111561191057611910614100565b600581111561192157611921614100565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614989833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5a57611a1a81600161453e565b611a2590600861426c565b5081515f90839083908110611a3c57611a3c614551565b60200101906001600160f81b03191690815f1a905350600101611a06565b505f5b6004811015611abd57611a7181600361453e565b611a7c90600861426c565b6001901c60f81b82611a8f836002614565565b81518110611a9f57611a9f614551565b60200101906001600160f81b03191690815f1a905350600101611a5d565b505f5b6020811015611b1f57611ad481601f61453e565b611adf90600861426c565b86901c60f81b82611af1836006614565565b81518110611b0157611b01614551565b60200101906001600160f81b03191690815f1a905350600101611ac0565b505f5b6008811015611b8a57611b3681600761453e565b611b4190600861426c565b6001600160401b038616901c60f81b82611b5c836026614565565b81518110611b6c57611b6c614551565b60200101906001600160f81b03191690815f1a905350600101611b22565b505f5b6008811015611bf557611ba181600761453e565b611bac90600861426c565b6001600160401b038516901c60f81b82611bc783602e614565565b81518110611bd757611bd7614551565b60200101906001600160f81b03191690815f1a905350600101611b8d565b5090505b9392505050565b611c08613f4d565b5f805160206149498339815191525f611c2084611f86565b90505f80611c31836040015161294e565b915091508015611c965760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610529565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611cc857611cc8614100565b6005811115611cd957611cd9614100565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d6057611d60614100565b1480611d7e5750600182516005811115611d7c57611d7c614100565b145b611ddd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610529565b600382516005811115611df257611df2614100565b03611dff57506004611e03565b5060055b6020808301515f90815260078801909152604081205581816005811115611e2c57611e2c614100565b90816005811115611e3f57611e3f614100565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611e7357611e73614100565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f3e57611f3e614100565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a3b6001600160a01b038216836130cd565b60408051606080820183525f8083526020830181905292820152905f805160206149498339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ffb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120229190810190614431565b91509150806120895760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610529565b82548251146120ec5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610529565b60208201516001600160a01b03161561215f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610529565b509392505050565b5f805f835160361461218b5760405162461bcd60e51b815260040161052990614578565b5f805b60028110156121da576121a281600161453e565b6121ad90600861426c565b61ffff168682815181106121c3576121c3614551565b016020015160f81c901b919091179060010161218e565b5061ffff8116156121fd5760405162461bcd60e51b8152600401610529906145c1565b5f805b60048110156122585761221481600361453e565b61221f90600861426c565b63ffffffff1687612231836002614565565b8151811061224157612241614551565b016020015160f81c901b9190911790600101612200565b5063ffffffff811660031461227f5760405162461bcd60e51b815260040161052990614604565b5f805b60208110156122d45761229681601f61453e565b6122a190600861426c565b886122ad836006614565565b815181106122bd576122bd614551565b016020015160f81c901b9190911790600101612282565b505f805b6008811015612333576122ec81600761453e565b6122f790600861426c565b6001600160401b03168961230c836026614565565b8151811061231c5761231c614551565b016020015160f81c901b91909117906001016122d8565b505f805b60088110156123925761234b81600761453e565b61235690600861426c565b6001600160401b03168a61236b83602e614565565b8151811061237b5761237b614551565b016020015160f81c901b9190911790600101612337565b5091989097509095509350505050565b5f8181525f8051602061498983398151915260205260408082208151610100810190925280545f8051602061494983398151915293929190829060ff1660058111156123f0576123f0614100565b600581111561240157612401614100565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561248957612489614100565b146124e55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610529565b60408101516001600160a01b0316336001600160a01b03161461255f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610529565b61256c8160a00151613160565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156125b0576125b0614100565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61267c8461267681611838565b5f6119e1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126ab908590600401614171565b6020604051808303815f875af11580156126c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126eb91906141a3565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8051602061496983398151915280546001190161277157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614909833981519152906001600160401b03166127c36040860160208701614075565b6001600160401b031610156128325760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610529565b6003810154612844602086018661465a565b61ffff16101580156128685750612710612861602086018661465a565b61ffff1611155b6128845760405162461bcd60e51b815260040161052990614675565b80548310801590612899575080600101548311155b6128f75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610529565b825f612902826109fe565b90505f61290f8883613301565b5f8181526005860160205260409020909150879061292d82826146c0565b509098975050505050505050565b60015f8051602061496983398151915255565b5f8082516027146129715760405162461bcd60e51b815260040161052990614578565b5f805b60028110156129c05761298881600161453e565b61299390600861426c565b61ffff168582815181106129a9576129a9614551565b016020015160f81c901b9190911790600101612974565b5061ffff8116156129e35760405162461bcd60e51b8152600401610529906145c1565b5f805b6004811015612a3e576129fa81600361453e565b612a0590600861426c565b63ffffffff1686612a17836002614565565b81518110612a2757612a27614551565b016020015160f81c901b91909117906001016129e6565b5063ffffffff8116600214612a655760405162461bcd60e51b815260040161052990614604565b5f805b6020811015612aba57612a7c81601f61453e565b612a8790600861426c565b87612a93836006614565565b81518110612aa357612aa3614551565b016020015160f81c901b9190911790600101612a68565b505f86602681518110612acf57612acf614551565b016020015191976001600160f81b03199092161515965090945050505050565b612af76137cb565b612b0081613816565b50565b5f612b0c612740565b5f805160206149098339815191525f612b24846109fe565b90505f612b30876118ba565b9050600281516005811115612b4757612b47614100565b14612ba65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610529565b5f828260a00151612bb79190614283565b60048501546060840151919250612bd9916001600160401b0390911690614716565b6001600160401b0316816001600160401b03161115612c585760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610529565b612c628882611999565b5f612c6c89611838565b90505f8982604051602001612c9892919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612cb985613160565b5f6005600160991b0163ee5b48eb612cd28d86886119e1565b6040518263ffffffff1660e01b8152600401612cee9190614171565b6020604051808303815f875af1158015612d0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d2e91906141a3565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612db657612db6614100565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611bf960015f8051602061496983398151915255565b5f808251602e14612f185760405162461bcd60e51b815260040161052990614578565b5f805b6002811015612f6757612f2f81600161453e565b612f3a90600861426c565b61ffff16858281518110612f5057612f50614551565b016020015160f81c901b9190911790600101612f1b565b5061ffff811615612f8a5760405162461bcd60e51b8152600401610529906145c1565b5f805b6004811015612fe557612fa181600361453e565b612fac90600861426c565b63ffffffff1686612fbe836002614565565b81518110612fce57612fce614551565b016020015160f81c901b9190911790600101612f8d565b5063ffffffff811660041461300c5760405162461bcd60e51b815260040161052990614604565b5f805b60208110156130615761302381601f61453e565b61302e90600861426c565b8761303a836006614565565b8151811061304a5761304a614551565b016020015160f81c901b919091179060010161300f565b505f805b60088110156130c05761307981600761453e565b61308490600861426c565b6001600160401b031688613099836026614565565b815181106130a9576130a9614551565b016020015160f81c901b9190911790600101613065565b5090969095509350505050565b804710156130f05760405163cd78605960e01b8152306004820152602401610529565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613139576040519150601f19603f3d011682016040523d82523d5f602084013e61313e565b606091505b50509050806114a957604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206149498339815191529060ff165f0361319e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906131e6908361453e565b10613202576001600160401b0384166040830152808252613221565b83826040018181516132149190614283565b6001600160401b03169052505b5f8260200151836040015160646132389190614716565b6132429190614741565b600285015490915060ff90811690821611156132bd5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610529565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f5f80516020614949833981519152426133216040860160208701614075565b6001600160401b031611801561335a57506133426040850160208601614075565b6001600160401b0316613358426202a300614565565b115b6133bc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610529565b83356134145760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610529565b83355f908152600782016020526040902054156134845760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610529565b6134916040850185614766565b90506030146134f85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610529565b61350183613160565b5f8061359b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906135469190614075565b6001600160401b0316815260200161356160408a018a614766565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613880565b5f828152600586016020526040902091935091506135b982826147f3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906135e6908590600401614171565b6020604051808303815f875af1158015613602573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061362691906141a3565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156136a8576136a8614100565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161379d91908e01908e01614075565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661381457604051631afcd79f60e31b815260040160405180910390fd5b565b61381e6137cb565b61382781613c25565b612b006060820135608083013561384460c0850160a08601614075565b61385460e0860160c0870161465a565b61ffff16613869610100870160e088016148b2565b61387b610120880161010089016148d2565b613c46565b5f60608260800151516030146138ea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610529565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156139615761392181600161453e565b61392c90600861426c565b5081515f9083908390811061394357613943614551565b60200101906001600160f81b03191690815f1a90535060010161390d565b505f5b60048110156139bf5761397881600361453e565b61398390600861426c565b505f82613991836002614565565b815181106139a1576139a1614551565b60200101906001600160f81b03191690815f1a905350600101613964565b505f5b6020811015613a1c57845181602081106139de576139de614551565b1a60f81b826139ee836006614565565b815181106139fe576139fe614551565b60200101906001600160f81b03191690815f1a9053506001016139c2565b505f5b6020811015613a7c5784602001518160208110613a3e57613a3e614551565b1a60f81b82613a4e836026614565565b81518110613a5e57613a5e614551565b60200101906001600160f81b03191690815f1a905350600101613a1f565b505f5b6008811015613af057613a9381600761453e565b613a9e90600861426c565b60ff1685604001516001600160401b0316901c60f81b82826046613ac29190614565565b81518110613ad257613ad2614551565b60200101906001600160f81b03191690815f1a905350600101613a7f565b505f5b6030811015613b5b5784608001518181518110613b1257613b12614551565b01602001516001600160f81b03191682613b2d83604e614565565b81518110613b3d57613b3d614551565b60200101906001600160f81b03191690815f1a905350600101613af3565b505f5b6008811015613bcd57613b7281600761453e565b613b7d90600861426c565b60608601516001600160401b0390811691161c60f81b82613b9f83607e614565565b81518110613baf57613baf614551565b60200101906001600160f81b03191690815f1a905350600101613b5e565b50600281604051613bde91906148ed565b602060405180830381855afa158015613bf9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c1c91906141a3565b94909350915050565b613c2d6137cb565b613c35613e8a565b613c3d613e9a565b612b0081613ea2565b613c4e6137cb565b5f8051602061490983398151915283613cba5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610529565b612710841115613cdc5760405162461bcd60e51b815260040161052990614675565b85871115613d445760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610529565b5f8360ff1611613db15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610529565b600a60ff84161115613e235760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610529565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b613e926137cb565b613814613f0e565b6138146137cb565b613eaa6137cb565b80355f8051602061494983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613ef460608301604084016148b2565b600291909101805460ff191660ff90921691909117905550565b61293b6137cb565b508054613f22906142a3565b5f825580601f10613f31575050565b601f0160209004905f5260205f2090810190612b009190613f91565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613fa5575f8155600101613f92565b5090565b8015158114612b00575f80fd5b803563ffffffff81168114613fc9575f80fd5b919050565b5f805f60608486031215613fe0575f80fd5b833592506020840135613ff281613fa9565b915061400060408501613fb6565b90509250925092565b5f60208284031215614019575f80fd5b5035919050565b5f60208284031215614030575f80fd5b611bf982613fb6565b5f806040838503121561404a575f80fd5b61405383613fb6565b946020939093013593505050565b6001600160401b0381168114612b00575f80fd5b5f60208284031215614085575f80fd5b8135611bf981614061565b5f8082840360608112156140a2575f80fd5b83356001600160401b038111156140b7575f80fd5b8401606081870312156140c8575f80fd5b92506040601f19820112156140db575f80fd5b506020830190509250929050565b5f61012082840312156140fa575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561414857614148614114565b5092915050565b5f5b83811015614169578181015183820152602001614151565b50505f910152565b602081525f825180602084015261418f81604085016020870161414f565b601f01601f19169190910160400192915050565b5f602082840312156141b3575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826141dc576141dc6141ba565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a0e57610a0e614114565b6001600160401b0381811683821601908082111561414857614148614114565b600181811c908216806142b757607f821691505b6020821081036140fa57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461432e816142a3565b806020870152604060018084165f811461434f576001811461436b57614398565b60ff19851660408a0152604084151560051b8a01019550614398565b895f5260205f205f5b8581101561438f5781548b8201860152908301908801614374565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156143dc576143dc6143a6565b60405290565b604051601f8201601f191681016001600160401b038111828210171561440a5761440a6143a6565b604052919050565b6001600160a01b0381168114612b00575f80fd5b8051613fc981613fa9565b5f8060408385031215614442575f80fd5b82516001600160401b0380821115614458575f80fd5b908401906060828703121561446b575f80fd5b6144736143ba565b8251815260208084015161448681614412565b8282015260408401518381111561449b575f80fd5b80850194505087601f8501126144af575f80fd5b8351838111156144c1576144c16143a6565b6144d3601f8201601f191683016143e2565b935080845288828287010111156144e8575f80fd5b6144f78183860184880161414f565b5082604083015281955061450c818801614426565b9450505050509250929050565b5f6001600160401b0380831681810361453457614534614114565b6001019392505050565b81810381811115610a0e57610a0e614114565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a0e57610a0e614114565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114612b00575f80fd5b5f6020828403121561466a575f80fd5b8135611bf98161464b565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356146cb8161464b565b61ffff8116905081548161ffff19821617835560208401356146ec81614061565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b0381811683821602808216919082811461473957614739614114565b505092915050565b5f6001600160401b038084168061475a5761475a6141ba565b92169190910492915050565b5f808335601e1984360301811261477b575f80fd5b8301803591506001600160401b03821115614794575f80fd5b6020019150368190038213156147a8575f80fd5b9250929050565b601f8211156114a957805f5260205f20601f840160051c810160208510156147d45750805b601f840160051c820191505b81811015610d15575f81556001016147e0565b81516001600160401b0381111561480c5761480c6143a6565b6148208161481a84546142a3565b846147af565b602080601f831160018114614853575f841561483c5750858301515b5f19600386901b1c1916600185901b1785556148aa565b5f85815260208120601f198616915b8281101561488157888601518255948401946001909101908401614862565b508582101561489e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156148c2575f80fd5b813560ff81168114611bf9575f80fd5b5f602082840312156148e2575f80fd5b8135611bf981614412565b5f82516148fe81846020870161414f565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614c0c380380614c0c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614abf8061014d5f395ff3fe60806040526004361061011b575f3560e01c806376f786211161009d578063ba3a4b9711610062578063ba3a4b971461035f578063bee0a03f1461037e578063c123c6db1461039d578063c599e24f146103bc578063d5f20ff6146103cf575f80fd5b806376f78621146102bd57806380a8ad94146102dc57806398f3e2b4146102ef578063a3a65e481461030e578063b771b3bc1461032d575f80fd5b806335455ded116100e357806335455ded14610219578063467ef06f146102415780635297fae614610260578063620658561461027f57806366435abf1461029e575f80fd5b80630118acc41461011f5780630322ed98146101405780630cdd09851461015f578063151d30d1146101bc5780632e2194d8146101e2575b5f80fd5b34801561012a575f80fd5b5061013e610139366004614005565b6103fb565b005b34801561014b575f80fd5b5061013e61015a366004614040565b610865565b34801561016a575f80fd5b506101a9610179366004614040565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101c7575f80fd5b506101d0600a81565b60405160ff90911681526020016101b3565b3480156101ed575f80fd5b506102016101fc366004614040565b610a35565b6040516001600160401b0390911681526020016101b3565b348015610224575f80fd5b5061022e61271081565b60405161ffff90911681526020016101b3565b34801561024c575f80fd5b5061013e61025b366004614057565b610a4b565b34801561026b575f80fd5b5061013e61027a366004614070565b610a76565b34801561028a575f80fd5b506101a96102993660046140ac565b610c46565b3480156102a9575f80fd5b506102016102b8366004614040565b610c5f565b3480156102c8575f80fd5b5061013e6102d7366004614005565b610c73565b6101a96102ea3660046140c7565b610d53565b3480156102fa575f80fd5b5061013e610309366004614070565b610d7f565b348015610319575f80fd5b5061013e610328366004614057565b610f8e565b348015610338575f80fd5b506103476005600160991b0181565b6040516001600160a01b0390911681526020016101b3565b34801561036a575f80fd5b5061013e610379366004614040565b61114b565b348015610389575f80fd5b5061013e610398366004614040565b6113d1565b3480156103a8575f80fd5b5061013e6103b7366004614120565b6114e5565b6101a96103ca366004614040565b6115c7565b3480156103da575f80fd5b506103ee6103e9366004614040565b6115d3565b6040516101b3919061414b565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614a1383398151915291841561044d5761044a82856116b2565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561047f5761047f614137565b600481111561049057610490614137565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561051757610517614137565b146105695760405162461bcd60e51b815260206004820152602a60248201525f80516020614a338339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105ce5760405162461bcd60e51b815260206004820152603360248201525f80516020614a338339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610560565b5f6105d88461194e565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561062557610625614137565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106f7856115d3565b905082606001516001600160401b03168160a001516001600160401b03161161076e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610560565b5f83606001518260a001516107839190614239565b905061078f86826119d0565b5f6005600160991b0163ee5b48eb6107a8898786611a18565b6040518263ffffffff1660e01b81526004016107c4919061427b565b6020604051808303815f875af11580156107e0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080491906142ad565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614a9383398151915260205260408082208151610100810190925280545f80516020614a5383398151915293929190829060ff1660058111156108b3576108b3614137565b60058111156108c4576108c4614137565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561094957610949614137565b146109ae5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610560565b6005600160991b016001600160a01b031663ee5b48eb6109d38584608001515f611a18565b6040518263ffffffff1660e01b81526004016109ef919061427b565b6020604051808303815f875af1158015610a0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2f91906142ad565b50505050565b5f610a4564e8d4a51000836142d8565b92915050565b5f610a5582611c37565b9050610a7281606001516001600160401b03168260400151611faa565b5050565b5f80516020614a138339815191525f610a8e84611fbd565b90505f80610a9f836040015161219e565b50915091505f610aae836115d3565b9050816001600160401b031681608001516001600160401b03161015610ae65760405162461bcd60e51b8152600401610560906142eb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b2b5760405162461bcd60e51b81526004016105609061432d565b60015f87815260068701602052604090205460ff166004811115610b5157610b51614137565b14610bba5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610560565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a456001600160401b03831664e8d4a51000614376565b5f610c69826115d3565b60a0015192915050565b5f80516020614a138339815191525f610c8b856115d3565b5f86815260058401602052604090205460c0820151919250610cbd91620100009091046001600160401b03169061438d565b6001600160401b0316421015610d315760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610560565b8315610d4357610d4185846116b2565b505b610d4c856123d9565b5050505050565b5f610d5c612777565b610d678383346127ae565b9050610a4560015f80516020614a7383398151915255565b5f80516020614a138339815191525f610d9784611fbd565b90505f80610da8836040015161219e565b50915091505f610db7836115d3565b9050816001600160401b031681608001516001600160401b03161015610def5760405162461bcd60e51b8152600401610560906142eb565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e2d5760405162461bcd60e51b81526004016105609061432d565b60035f87815260068701602052604090205460ff166004811115610e5357610e53614137565b14610ea75760405162461bcd60e51b815260206004820152603160248201525f80516020614a338339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610560565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f4c91611faa565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614a538339815191525f610fa683611fbd565b90505f80610fb78360400151612985565b91509150806110195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610560565b5f82815260058501602052604081208054611033906143ad565b9050118015611065575060015f83815260068601602052604090205460ff16600581111561106357611063614137565b145b6110815760405162461bcd60e51b8152600401610560906143df565b5f828152600585016020526040812061109991613f4d565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614a1383398151915293929190829060ff1660048111156111ac576111ac614137565b60048111156111bd576111bd614137565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561124457611244614137565b1480611262575060038151600481111561126057611260614137565b145b6112b65760405162461bcd60e51b815260206004820152603260248201525f80516020614a33833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610560565b5f6112c482604001516115d3565b905080608001516001600160401b03165f036113485760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610560565b6005600160991b016001600160a01b031663ee5b48eb611375846040015184608001518560a00151611a18565b6040518263ffffffff1660e01b8152600401611391919061427b565b6020604051808303815f875af11580156113ad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d4c91906142ad565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614a53833981519152929190611419906143ad565b905011801561144b575060015f83815260068301602052604090205460ff16600581111561144957611449614137565b145b6114675760405162461bcd60e51b8152600401610560906143df565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114a09190600401614426565b6020604051808303815f875af11580156114bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e091906142ad565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061152e575080546001600160401b03808416911610155b1561154c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561157683612b26565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a45823334612b3a565b6115db613f84565b5f8281525f80516020614a938339815191526020526040908190208151610100810190925280545f80516020614a53833981519152929190829060ff16600581111561162957611629614137565b600581111561163a5761163a614137565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156116fd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611724919081019061453b565b91509150806117875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610560565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ee91906142ad565b8251146118525760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610560565b60208201516001600160a01b0316156118c85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610560565b5f806118d78460400151612f2c565b915091508187146119445760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610560565b9695505050505050565b5f8181525f80516020614a938339815191526020526040812060030180545f80516020614a53833981519152916001600160401b03909116908361199183614623565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b5f9182525f80516020614a93833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a9157611a51816001614648565b611a5c906008614376565b5081515f90839083908110611a7357611a7361465b565b60200101906001600160f81b03191690815f1a905350600101611a3d565b505f5b6004811015611af457611aa8816003614648565b611ab3906008614376565b6001901c60f81b82611ac683600261466f565b81518110611ad657611ad661465b565b60200101906001600160f81b03191690815f1a905350600101611a94565b505f5b6020811015611b5657611b0b81601f614648565b611b16906008614376565b86901c60f81b82611b2883600661466f565b81518110611b3857611b3861465b565b60200101906001600160f81b03191690815f1a905350600101611af7565b505f5b6008811015611bc157611b6d816007614648565b611b78906008614376565b6001600160401b038616901c60f81b82611b9383602661466f565b81518110611ba357611ba361465b565b60200101906001600160f81b03191690815f1a905350600101611b59565b505f5b6008811015611c2c57611bd8816007614648565b611be3906008614376565b6001600160401b038516901c60f81b82611bfe83602e61466f565b81518110611c0e57611c0e61465b565b60200101906001600160f81b03191690815f1a905350600101611bc4565b5090505b9392505050565b611c3f613f84565b5f80516020614a538339815191525f611c5784611fbd565b90505f80611c688360400151612985565b915091508015611ccd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610560565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611cff57611cff614137565b6005811115611d1057611d10614137565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d9757611d97614137565b1480611db55750600182516005811115611db357611db3614137565b145b611e145760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610560565b600382516005811115611e2957611e29614137565b03611e3657506004611e3a565b5060055b6020808301515f90815260078801909152604081205581816005811115611e6357611e63614137565b90816005811115611e7657611e76614137565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611eaa57611eaa614137565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f7557611f75614137565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a726001600160a01b03821683613104565b60408051606080820183525f8083526020830181905292820152905f80516020614a538339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612032573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612059919081019061453b565b91509150806120c05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610560565b82548251146121235760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610560565b60208201516001600160a01b0316156121965760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610560565b509392505050565b5f805f83516036146121c25760405162461bcd60e51b815260040161056090614682565b5f805b6002811015612211576121d9816001614648565b6121e4906008614376565b61ffff168682815181106121fa576121fa61465b565b016020015160f81c901b91909117906001016121c5565b5061ffff8116156122345760405162461bcd60e51b8152600401610560906146cb565b5f805b600481101561228f5761224b816003614648565b612256906008614376565b63ffffffff168761226883600261466f565b815181106122785761227861465b565b016020015160f81c901b9190911790600101612237565b5063ffffffff81166003146122b65760405162461bcd60e51b81526004016105609061470e565b5f805b602081101561230b576122cd81601f614648565b6122d8906008614376565b886122e483600661466f565b815181106122f4576122f461465b565b016020015160f81c901b91909117906001016122b9565b505f805b600881101561236a57612323816007614648565b61232e906008614376565b6001600160401b03168961234383602661466f565b815181106123535761235361465b565b016020015160f81c901b919091179060010161230f565b505f805b60088110156123c957612382816007614648565b61238d906008614376565b6001600160401b03168a6123a283602e61466f565b815181106123b2576123b261465b565b016020015160f81c901b919091179060010161236e565b5091989097509095509350505050565b5f8181525f80516020614a9383398151915260205260408082208151610100810190925280545f80516020614a5383398151915293929190829060ff16600581111561242757612427614137565b600581111561243857612438614137565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124c0576124c0614137565b1461251c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610560565b60408101516001600160a01b0316336001600160a01b0316146125965760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610560565b6125a38160a00151613197565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156125e7576125e7614137565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126b3846126ad8161194e565b5f611a18565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126e290859060040161427b565b6020604051808303815f875af11580156126fe573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061272291906142ad565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020614a738339815191528054600119016127a857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614a13833981519152906001600160401b03166127fa60408601602087016140ac565b6001600160401b031610156128695760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610560565b600381015461287b6020860186614764565b61ffff161015801561289f57506127106128986020860186614764565b61ffff1611155b6128bb5760405162461bcd60e51b81526004016105609061477f565b805483108015906128d0575080600101548311155b61292e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610560565b825f61293982610a35565b90505f6129468883613338565b5f8181526005860160205260409020909150879061296482826147ca565b509098975050505050505050565b60015f80516020614a7383398151915255565b5f8082516027146129a85760405162461bcd60e51b815260040161056090614682565b5f805b60028110156129f7576129bf816001614648565b6129ca906008614376565b61ffff168582815181106129e0576129e061465b565b016020015160f81c901b91909117906001016129ab565b5061ffff811615612a1a5760405162461bcd60e51b8152600401610560906146cb565b5f805b6004811015612a7557612a31816003614648565b612a3c906008614376565b63ffffffff1686612a4e83600261466f565b81518110612a5e57612a5e61465b565b016020015160f81c901b9190911790600101612a1d565b5063ffffffff8116600214612a9c5760405162461bcd60e51b81526004016105609061470e565b5f805b6020811015612af157612ab381601f614648565b612abe906008614376565b87612aca83600661466f565b81518110612ada57612ada61465b565b016020015160f81c901b9190911790600101612a9f565b505f86602681518110612b0657612b0661465b565b016020015191976001600160f81b03199092161515965090945050505050565b612b2e613802565b612b378161384d565b50565b5f612b43612777565b5f80516020614a138339815191525f612b5b84610a35565b90505f612b67876115d3565b9050600281516005811115612b7e57612b7e614137565b14612bdd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610560565b5f828260a00151612bee919061438d565b60048501546060840151919250612c10916001600160401b0390911690614820565b6001600160401b0316816001600160401b03161115612c8f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610560565b612c9988826119d0565b5f612ca38961194e565b90505f8982604051602001612ccf92919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612cf085613197565b5f6005600160991b0163ee5b48eb612d098d8688611a18565b6040518263ffffffff1660e01b8152600401612d25919061427b565b6020604051808303815f875af1158015612d41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d6591906142ad565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612ded57612ded614137565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611c3060015f80516020614a7383398151915255565b5f808251602e14612f4f5760405162461bcd60e51b815260040161056090614682565b5f805b6002811015612f9e57612f66816001614648565b612f71906008614376565b61ffff16858281518110612f8757612f8761465b565b016020015160f81c901b9190911790600101612f52565b5061ffff811615612fc15760405162461bcd60e51b8152600401610560906146cb565b5f805b600481101561301c57612fd8816003614648565b612fe3906008614376565b63ffffffff1686612ff583600261466f565b815181106130055761300561465b565b016020015160f81c901b9190911790600101612fc4565b5063ffffffff81166004146130435760405162461bcd60e51b81526004016105609061470e565b5f805b60208110156130985761305a81601f614648565b613065906008614376565b8761307183600661466f565b815181106130815761308161465b565b016020015160f81c901b9190911790600101613046565b505f805b60088110156130f7576130b0816007614648565b6130bb906008614376565b6001600160401b0316886130d083602661466f565b815181106130e0576130e061465b565b016020015160f81c901b919091179060010161309c565b5090969095509350505050565b804710156131275760405163cd78605960e01b8152306004820152602401610560565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613170576040519150601f19603f3d011682016040523d82523d5f602084013e613175565b606091505b50509050806114e057604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614a538339815191529060ff165f036131d5575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061321d9083614648565b10613239576001600160401b0384166040830152808252613258565b838260400181815161324b919061438d565b6001600160401b03169052505b5f82602001518360400151606461326f9190614820565b613279919061484b565b600285015490915060ff90811690821611156132f45760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610560565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f5f80516020614a538339815191524261335860408601602087016140ac565b6001600160401b0316118015613391575061337960408501602086016140ac565b6001600160401b031661338f426202a30061466f565b115b6133f35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610560565b833561344b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610560565b83355f908152600782016020526040902054156134bb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610560565b6134c86040850185614870565b905060301461352f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610560565b61353883613197565b5f806135d26040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061357d91906140ac565b6001600160401b0316815260200161359860408a018a614870565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506138b7565b5f828152600586016020526040902091935091506135f082826148fd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061361d90859060040161427b565b6020604051808303815f875af1158015613639573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061365d91906142ad565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156136df576136df614137565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916137d491908e01908e016140ac565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661384b57604051631afcd79f60e31b815260040160405180910390fd5b565b613855613802565b61385e81613c5c565b612b376060820135608083013561387b60c0850160a086016140ac565b61388b60e0860160c08701614764565b61ffff166138a0610100870160e088016149bc565b6138b2610120880161010089016149dc565b613c7d565b5f60608260800151516030146139215760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610560565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561399857613958816001614648565b613963906008614376565b5081515f9083908390811061397a5761397a61465b565b60200101906001600160f81b03191690815f1a905350600101613944565b505f5b60048110156139f6576139af816003614648565b6139ba906008614376565b505f826139c883600261466f565b815181106139d8576139d861465b565b60200101906001600160f81b03191690815f1a90535060010161399b565b505f5b6020811015613a535784518160208110613a1557613a1561465b565b1a60f81b82613a2583600661466f565b81518110613a3557613a3561465b565b60200101906001600160f81b03191690815f1a9053506001016139f9565b505f5b6020811015613ab35784602001518160208110613a7557613a7561465b565b1a60f81b82613a8583602661466f565b81518110613a9557613a9561465b565b60200101906001600160f81b03191690815f1a905350600101613a56565b505f5b6008811015613b2757613aca816007614648565b613ad5906008614376565b60ff1685604001516001600160401b0316901c60f81b82826046613af9919061466f565b81518110613b0957613b0961465b565b60200101906001600160f81b03191690815f1a905350600101613ab6565b505f5b6030811015613b925784608001518181518110613b4957613b4961465b565b01602001516001600160f81b03191682613b6483604e61466f565b81518110613b7457613b7461465b565b60200101906001600160f81b03191690815f1a905350600101613b2a565b505f5b6008811015613c0457613ba9816007614648565b613bb4906008614376565b60608601516001600160401b0390811691161c60f81b82613bd683607e61466f565b81518110613be657613be661465b565b60200101906001600160f81b03191690815f1a905350600101613b95565b50600281604051613c1591906149f7565b602060405180830381855afa158015613c30573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c5391906142ad565b94909350915050565b613c64613802565b613c6c613ec1565b613c74613ed1565b612b3781613ed9565b613c85613802565b5f80516020614a1383398151915283613cf15760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610560565b612710841115613d135760405162461bcd60e51b81526004016105609061477f565b85871115613d7b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610560565b5f8360ff1611613de85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610560565b600a60ff84161115613e5a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610560565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b613ec9613802565b61384b613f45565b61384b613802565b613ee1613802565b80355f80516020614a5383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613f2b60608301604084016149bc565b600291909101805460ff191660ff90921691909117905550565b612972613802565b508054613f59906143ad565b5f825580601f10613f68575050565b601f0160209004905f5260205f2090810190612b379190613fc8565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613fdc575f8155600101613fc9565b5090565b8015158114612b37575f80fd5b803563ffffffff81168114614000575f80fd5b919050565b5f805f60608486031215614017575f80fd5b83359250602084013561402981613fe0565b915061403760408501613fed565b90509250925092565b5f60208284031215614050575f80fd5b5035919050565b5f60208284031215614067575f80fd5b611c3082613fed565b5f8060408385031215614081575f80fd5b61408a83613fed565b946020939093013593505050565b6001600160401b0381168114612b37575f80fd5b5f602082840312156140bc575f80fd5b8135611c3081614098565b5f8082840360608112156140d9575f80fd5b83356001600160401b038111156140ee575f80fd5b8401606081870312156140ff575f80fd5b92506040601f1982011215614112575f80fd5b506020830190509250929050565b5f6101208284031215614131575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061416f57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161419760408401826001600160a01b03169052565b5060608301516141b260608401826001600160401b03169052565b5060808301516141cd60808401826001600160401b03169052565b5060a08301516141e860a08401826001600160401b03169052565b5060c083015161420360c08401826001600160401b03169052565b5060e083015161421e60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561421e5761421e614225565b5f5b8381101561427357818101518382015260200161425b565b50505f910152565b602081525f8251806020840152614299816040850160208701614259565b601f01601f19169190910160400192915050565b5f602082840312156142bd575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826142e6576142e66142c4565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a4557610a45614225565b6001600160401b0381811683821601908082111561421e5761421e614225565b600181811c908216806143c157607f821691505b60208210810361413157634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614438816143ad565b806020870152604060018084165f81146144595760018114614475576144a2565b60ff19851660408a0152604084151560051b8a010195506144a2565b895f5260205f205f5b858110156144995781548b820186015290830190880161447e565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156144e6576144e66144b0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614514576145146144b0565b604052919050565b6001600160a01b0381168114612b37575f80fd5b805161400081613fe0565b5f806040838503121561454c575f80fd5b82516001600160401b0380821115614562575f80fd5b9084019060608287031215614575575f80fd5b61457d6144c4565b825181526020808401516145908161451c565b828201526040840151838111156145a5575f80fd5b80850194505087601f8501126145b9575f80fd5b8351838111156145cb576145cb6144b0565b6145dd601f8201601f191683016144ec565b935080845288828287010111156145f2575f80fd5b61460181838601848801614259565b50826040830152819550614616818801614530565b9450505050509250929050565b5f6001600160401b0380831681810361463e5761463e614225565b6001019392505050565b81810381811115610a4557610a45614225565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a4557610a45614225565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114612b37575f80fd5b5f60208284031215614774575f80fd5b8135611c3081614755565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356147d581614755565b61ffff8116905081548161ffff19821617835560208401356147f681614098565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b0381811683821602808216919082811461484357614843614225565b505092915050565b5f6001600160401b0380841680614864576148646142c4565b92169190910492915050565b5f808335601e19843603018112614885575f80fd5b8301803591506001600160401b0382111561489e575f80fd5b6020019150368190038213156148b2575f80fd5b9250929050565b601f8211156114e057805f5260205f20601f840160051c810160208510156148de5750805b601f840160051c820191505b81811015610d4c575f81556001016148ea565b81516001600160401b03811115614916576149166144b0565b61492a8161492484546143ad565b846148b9565b602080601f83116001811461495d575f84156149465750858301515b5f19600386901b1c1916600185901b1785556149b4565b5f85815260208120601f198616915b8281101561498b5788860151825594840194600190910190840161496c565b50858210156149a857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156149cc575f80fd5b813560ff81168114611c30575f80fd5b5f602082840312156149ec575f80fd5b8135611c308161451c565b5f8251614a08818460208701614259565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -357,6 +369,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) Active return _NativeTokenStakingManager.Contract.ActiveValidators(&_NativeTokenStakingManager.CallOpts, nodeID) } +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "getValidator", validationID) + + if err != nil { + return *new(Validator), err + } + + out0 := *abi.ConvertType(out[0], new(Validator)).(*Validator) + + return out0, err + +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _NativeTokenStakingManager.Contract.GetValidator(&_NativeTokenStakingManager.CallOpts, validationID) +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _NativeTokenStakingManager.Contract.GetValidator(&_NativeTokenStakingManager.CallOpts, validationID) +} + // GetWeight is a free data retrieval call binding the contract method 0x66435abf. // // Solidity: function getWeight(bytes32 validationID) view returns(uint64) diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 1ba9f83a3..77ccc88a4 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -29,6 +29,18 @@ var ( _ = abi.ConvertType ) +// Validator is an auto generated low-level Go binding around an user-defined struct. +type Validator struct { + Status uint8 + NodeID [32]byte + Owner common.Address + StartingWeight uint64 + MessageNonce uint64 + Weight uint64 + StartedAt uint64 + EndedAt uint64 +} + // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { PChainBlockchainID [32]byte @@ -45,8 +57,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c69380380612c6983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612b1c8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e4578063467ef06f1461013557806366435abf14610148578063715018a6146101735780638994ab491461017b575b5f80fd5b6100e26100dd366004612415565b61023f565b005b6101226100f2366004612415565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6100e261014336600461242c565b610414565b61015b610156366004612415565b610421565b6040516001600160401b03909116815260200161012c565b6100e2610435565b610122610189366004612487565b610448565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e0366004612415565b610464565b6100e26101f336600461242c565b610470565b6101ba6005600160991b0181565b6100e2610214366004612415565b61062d565b6100e26102273660046124e5565b610741565b6100e261023a36600461251b565b61084f565b5f8181525f80516020612af083398151915260205260408082208151610100810190925280545f80516020612ad083398151915293929190829060ff16600581111561028d5761028d612536565b600581111561029e5761029e612536565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561032357610323612536565b1461038d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103b28584608001515f610889565b6040518263ffffffff1660e01b81526004016103ce919061256c565b6020604051808303815f875af11580156103ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040e919061259e565b50505050565b61041d81610aa6565b5050565b5f61042b82610e19565b60a0015192915050565b61043d610ef8565b6104465f610f53565b565b5f610451610ef8565b61045b8383610fc3565b90505b92915050565b61046d8161148d565b50565b5f80516020612ad08339815191525f6104888361182b565b90505f806104998360400151611a0c565b91509150806104fb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610384565b5f82815260058501602052604081208054610515906125b5565b9050118015610547575060015f83815260068601602052604090205460ff16600581111561054557610545612536565b145b6105635760405162461bcd60e51b8152600401610384906125e7565b5f828152600585016020526040812061057b91612382565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612ad0833981519152929190610675906125b5565b90501180156106a7575060015f83815260068301602052604090205460ff1660058111156106a5576106a5612536565b145b6106c35760405162461bcd60e51b8152600401610384906125e7565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916106fc919060040161262e565b6020604051808303815f875af1158015610718573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073c919061259e565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107855750825b90505f826001600160401b031660011480156107a05750303b155b9050811580156107ae575080155b156107cc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156107f657845460ff60401b1916600160401b1785555b6108008787611c6b565b831561084657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610857610ef8565b6001600160a01b03811661088057604051631e4fbdf760e01b81525f6004820152602401610384565b61046d81610f53565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610902576108c28160016126e0565b6108cd9060086126f3565b5081515f908390839081106108e4576108e461270a565b60200101906001600160f81b03191690815f1a9053506001016108ae565b505f5b6004811015610965576109198160036126e0565b6109249060086126f3565b6001901c60f81b8261093783600261271e565b815181106109475761094761270a565b60200101906001600160f81b03191690815f1a905350600101610905565b505f5b60208110156109c75761097c81601f6126e0565b6109879060086126f3565b86901c60f81b8261099983600661271e565b815181106109a9576109a961270a565b60200101906001600160f81b03191690815f1a905350600101610968565b505f5b6008811015610a32576109de8160076126e0565b6109e99060086126f3565b6001600160401b038616901c60f81b82610a0483602661271e565b81518110610a1457610a1461270a565b60200101906001600160f81b03191690815f1a9053506001016109ca565b505f5b6008811015610a9d57610a498160076126e0565b610a549060086126f3565b6001600160401b038516901c60f81b82610a6f83602e61271e565b81518110610a7f57610a7f61270a565b60200101906001600160f81b03191690815f1a905350600101610a35565b50949350505050565b610aae6123b9565b5f80516020612ad08339815191525f610ac68461182b565b90505f80610ad78360400151611a0c565b915091508015610b3c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610384565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610b6e57610b6e612536565b6005811115610b7f57610b7f612536565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c0657610c06612536565b1480610c245750600182516005811115610c2257610c22612536565b145b610c835760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610384565b600382516005811115610c9857610c98612536565b03610ca557506004610ca9565b5060055b6020808301515f90815260078801909152604081205581816005811115610cd257610cd2612536565b90816005811115610ce557610ce5612536565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610d1957610d19612536565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610de457610de4612536565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610e216123b9565b5f8281525f80516020612af08339815191526020526040908190208151610100810190925280545f80516020612ad0833981519152929190829060ff166005811115610e6f57610e6f612536565b6005811115610e8057610e80612536565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b33610f2a7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104465760405163118cdaa760e01b8152336004820152602401610384565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612ad083398151915242610fe36040860160208701612731565b6001600160401b031611801561101c57506110046040850160208601612731565b6001600160401b031661101a426202a30061271e565b115b61107e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610384565b83356110d65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610384565b83355f908152600782016020526040902054156111465760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610384565b611153604085018561274a565b90506030146111ba5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610384565b6111c383611c85565b5f8061125d6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906112089190612731565b6001600160401b0316815260200161122360408a018a61274a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611e26565b5f8281526005860160205260409020919350915061127b82826127de565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112a890859060040161256c565b6020604051808303815f875af11580156112c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e8919061259e565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff1916600183600581111561136a5761136a612536565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161145f91908e01908e01612731565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612af083398151915260205260408082208151610100810190925280545f80516020612ad083398151915293929190829060ff1660058111156114db576114db612536565b60058111156114ec576114ec612536565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561157457611574612536565b146115d05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610384565b60408101516001600160a01b0316336001600160a01b03161461164a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610384565b6116578160a00151611c85565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561169b5761169b612536565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61176784611761816121cb565b5f610889565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061179690859060040161256c565b6020604051808303815f875af11580156117b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d6919061259e565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612ad08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118a0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118c79190810190612904565b915091508061192e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610384565b82548251146119915760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610384565b60208201516001600160a01b031615611a045760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610384565b509392505050565b5f808251602714611a715760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610384565b5f805b6002811015611ac057611a888160016126e0565b611a939060086126f3565b61ffff16858281518110611aa957611aa961270a565b016020015160f81c901b9190911790600101611a74565b5061ffff811615611b1f5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610384565b5f805b6004811015611b7a57611b368160036126e0565b611b419060086126f3565b63ffffffff1686611b5383600261271e565b81518110611b6357611b6361270a565b016020015160f81c901b9190911790600101611b22565b5063ffffffff8116600214611be15760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610384565b5f805b6020811015611c3657611bf881601f6126e0565b611c039060086126f3565b87611c0f83600661271e565b81518110611c1f57611c1f61270a565b016020015160f81c901b9190911790600101611be4565b505f86602681518110611c4b57611c4b61270a565b016020015191976001600160f81b03199092161515965090945050505050565b611c7361224d565b611c7c82612296565b61041d816122b7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612ad08339815191529060ff165f03611cc3575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611d0b90836126e0565b10611d27576001600160401b0384166040830152808252611d46565b8382604001818151611d3991906129ec565b6001600160401b03169052505b5f826020015183604001516064611d5d9190612a13565b611d679190612a3e565b600285015490915060ff9081169082161115611de25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610384565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611e905760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610384565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611f0757611ec78160016126e0565b611ed29060086126f3565b5081515f90839083908110611ee957611ee961270a565b60200101906001600160f81b03191690815f1a905350600101611eb3565b505f5b6004811015611f6557611f1e8160036126e0565b611f299060086126f3565b505f82611f3783600261271e565b81518110611f4757611f4761270a565b60200101906001600160f81b03191690815f1a905350600101611f0a565b505f5b6020811015611fc25784518160208110611f8457611f8461270a565b1a60f81b82611f9483600661271e565b81518110611fa457611fa461270a565b60200101906001600160f81b03191690815f1a905350600101611f68565b505f5b60208110156120225784602001518160208110611fe457611fe461270a565b1a60f81b82611ff483602661271e565b815181106120045761200461270a565b60200101906001600160f81b03191690815f1a905350600101611fc5565b505f5b6008811015612096576120398160076126e0565b6120449060086126f3565b60ff1685604001516001600160401b0316901c60f81b82826046612068919061271e565b815181106120785761207861270a565b60200101906001600160f81b03191690815f1a905350600101612025565b505f5b603081101561210157846080015181815181106120b8576120b861270a565b01602001516001600160f81b031916826120d383604e61271e565b815181106120e3576120e361270a565b60200101906001600160f81b03191690815f1a905350600101612099565b505f5b6008811015612173576121188160076126e0565b6121239060086126f3565b60608601516001600160401b0390811691161c60f81b8261214583607e61271e565b815181106121555761215561270a565b60200101906001600160f81b03191690815f1a905350600101612104565b506002816040516121849190612a6f565b602060405180830381855afa15801561219f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906121c2919061259e565b94909350915050565b5f8181525f80516020612af08339815191526020526040812060030180545f80516020612ad0833981519152916001600160401b03909116908361220e83612a8a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661044657604051631afcd79f60e31b815260040160405180910390fd5b61229e61224d565b6122a66122c8565b6122ae6122d8565b61046d816122e0565b6122bf61224d565b61046d8161234c565b6122d061224d565b610446612354565b61044661224d565b6122e861224d565b80355f80516020612ad083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123326060830160408401612aaf565b600291909101805460ff191660ff90921691909117905550565b61085761224d565b61235c61224d565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50805461238e906125b5565b5f825580601f1061239d575050565b601f0160209004905f5260205f209081019061046d91906123fd565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612411575f81556001016123fe565b5090565b5f60208284031215612425575f80fd5b5035919050565b5f6020828403121561243c575f80fd5b813563ffffffff8116811461244f575f80fd5b9392505050565b5f60608284031215612466575f80fd5b50919050565b80356001600160401b0381168114612482575f80fd5b919050565b5f8060408385031215612498575f80fd5b82356001600160401b038111156124ad575f80fd5b6124b985828601612456565b9250506124c86020840161246c565b90509250929050565b6001600160a01b038116811461046d575f80fd5b5f80608083850312156124f6575f80fd5b6125008484612456565b91506060830135612510816124d1565b809150509250929050565b5f6020828403121561252b575f80fd5b813561244f816124d1565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561256457818101518382015260200161254c565b50505f910152565b602081525f825180602084015261258a81604085016020870161254a565b601f01601f19169190910160400192915050565b5f602082840312156125ae575f80fd5b5051919050565b600181811c908216806125c957607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612640816125b5565b806020870152604060018084165f8114612661576001811461267d576126aa565b60ff19851660408a0152604084151560051b8a010195506126aa565b895f5260205f205f5b858110156126a15781548b8201860152908301908801612686565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561045e5761045e6126cc565b808202811582820484141761045e5761045e6126cc565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561045e5761045e6126cc565b5f60208284031215612741575f80fd5b61045b8261246c565b5f808335601e1984360301811261275f575f80fd5b8301803591506001600160401b03821115612778575f80fd5b60200191503681900382131561278c575f80fd5b9250929050565b601f82111561073c57805f5260205f20601f840160051c810160208510156127b85750805b601f840160051c820191505b818110156127d7575f81556001016127c4565b5050505050565b81516001600160401b038111156127f7576127f76126b8565b61280b8161280584546125b5565b84612793565b602080601f83116001811461283e575f84156128275750858301515b5f19600386901b1c1916600185901b178555612895565b5f85815260208120601f198616915b8281101561286c5788860151825594840194600190910190840161284d565b508582101561288957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b03811182821017156128bf576128bf6126b8565b60405290565b604051601f8201601f191681016001600160401b03811182821017156128ed576128ed6126b8565b604052919050565b80518015158114612482575f80fd5b5f8060408385031215612915575f80fd5b82516001600160401b038082111561292b575f80fd5b908401906060828703121561293e575f80fd5b61294661289d565b82518152602080840151612959816124d1565b8282015260408401518381111561296e575f80fd5b80850194505087601f850112612982575f80fd5b835183811115612994576129946126b8565b6129a6601f8201601f191683016128c5565b935080845288828287010111156129bb575f80fd5b6129ca8183860184880161254a565b508260408301528195506129df8188016128f5565b9450505050509250929050565b6001600160401b03818116838216019080821115612a0c57612a0c6126cc565b5092915050565b6001600160401b03818116838216028082169190828114612a3657612a366126cc565b505092915050565b5f6001600160401b0380841680612a6357634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a8081846020870161254a565b9190910192915050565b5f6001600160401b03808316818103612aa557612aa56126cc565b6001019392505050565b5f60208284031215612abf575f80fd5b813560ff8116811461244f575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612d76380380612d7683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c298061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806397fb70d411610088578063bee0a03f11610063578063bee0a03f14610220578063c151c0b914610233578063d5f20ff614610246578063f2fde38b14610266575f80fd5b806397fb70d4146101ec578063a3a65e48146101ff578063b771b3bc14610212575f80fd5b806366435abf116100c357806366435abf14610162578063715018a61461018d5780638994ab49146101955780638da5cb5b146101a8575f80fd5b80630322ed98146100e95780630cdd0985146100fe578063467ef06f1461014f575b5f80fd5b6100fc6100f736600461244f565b610279565b005b61013c61010c36600461244f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6100fc61015d366004612466565b61044e565b61017561017036600461244f565b61045b565b6040516001600160401b039091168152602001610146565b6100fc61046f565b61013c6101a33660046124c1565b610482565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610146565b6100fc6101fa36600461244f565b61049e565b6100fc61020d366004612466565b6104aa565b6101d46005600160991b0181565b6100fc61022e36600461244f565b610667565b6100fc61024136600461251f565b61077b565b61025961025436600461244f565b610889565b6040516101469190612569565b6100fc610274366004612643565b610968565b5f8181525f80516020612bfd83398151915260205260408082208151610100810190925280545f80516020612bdd83398151915293929190829060ff1660058111156102c7576102c7612555565b60058111156102d8576102d8612555565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561035d5761035d612555565b146103c75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103ec8584608001515f6109a2565b6040518263ffffffff1660e01b81526004016104089190612680565b6020604051808303815f875af1158015610424573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044891906126b2565b50505050565b61045781610bbf565b5050565b5f61046582610889565b60a0015192915050565b610477610f32565b6104805f610f8d565b565b5f61048b610f32565b6104958383610ffd565b90505b92915050565b6104a7816114c7565b50565b5f80516020612bdd8339815191525f6104c283611865565b90505f806104d38360400151611a46565b91509150806105355760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103be565b5f8281526005850160205260408120805461054f906126c9565b9050118015610581575060015f83815260068601602052604090205460ff16600581111561057f5761057f612555565b145b61059d5760405162461bcd60e51b81526004016103be906126fb565b5f82815260058501602052604081206105b5916123bc565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612bdd8339815191529291906106af906126c9565b90501180156106e1575060015f83815260068301602052604090205460ff1660058111156106df576106df612555565b145b6106fd5760405162461bcd60e51b81526004016103be906126fb565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107369190600401612742565b6020604051808303815f875af1158015610752573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061077691906126b2565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107bf5750825b90505f826001600160401b031660011480156107da5750303b155b9050811580156107e8575080155b156108065760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561083057845460ff60401b1916600160401b1785555b61083a8787611ca5565b831561088057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6108916123f3565b5f8281525f80516020612bfd8339815191526020526040908190208151610100810190925280545f80516020612bdd833981519152929190829060ff1660058111156108df576108df612555565b60058111156108f0576108f0612555565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b610970610f32565b6001600160a01b03811661099957604051631e4fbdf760e01b81525f60048201526024016103be565b6104a781610f8d565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a1b576109db8160016127f4565b6109e6906008612807565b5081515f908390839081106109fd576109fd61281e565b60200101906001600160f81b03191690815f1a9053506001016109c7565b505f5b6004811015610a7e57610a328160036127f4565b610a3d906008612807565b6001901c60f81b82610a50836002612832565b81518110610a6057610a6061281e565b60200101906001600160f81b03191690815f1a905350600101610a1e565b505f5b6020811015610ae057610a9581601f6127f4565b610aa0906008612807565b86901c60f81b82610ab2836006612832565b81518110610ac257610ac261281e565b60200101906001600160f81b03191690815f1a905350600101610a81565b505f5b6008811015610b4b57610af78160076127f4565b610b02906008612807565b6001600160401b038616901c60f81b82610b1d836026612832565b81518110610b2d57610b2d61281e565b60200101906001600160f81b03191690815f1a905350600101610ae3565b505f5b6008811015610bb657610b628160076127f4565b610b6d906008612807565b6001600160401b038516901c60f81b82610b8883602e612832565b81518110610b9857610b9861281e565b60200101906001600160f81b03191690815f1a905350600101610b4e565b50949350505050565b610bc76123f3565b5f80516020612bdd8339815191525f610bdf84611865565b90505f80610bf08360400151611a46565b915091508015610c555760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103be565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610c8757610c87612555565b6005811115610c9857610c98612555565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d1f57610d1f612555565b1480610d3d5750600182516005811115610d3b57610d3b612555565b145b610d9c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103be565b600382516005811115610db157610db1612555565b03610dbe57506004610dc2565b5060055b6020808301515f90815260078801909152604081205581816005811115610deb57610deb612555565b90816005811115610dfe57610dfe612555565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610e3257610e32612555565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610efd57610efd612555565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b33610f647f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104805760405163118cdaa760e01b81523360048201526024016103be565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612bdd8339815191524261101d6040860160208701612845565b6001600160401b0316118015611056575061103e6040850160208601612845565b6001600160401b0316611054426202a300612832565b115b6110b85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103be565b83356111105760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103be565b83355f908152600782016020526040902054156111805760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103be565b61118d604085018561285e565b90506030146111f45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103be565b6111fd83611cbf565b5f806112976040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906112429190612845565b6001600160401b0316815260200161125d60408a018a61285e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611e60565b5f828152600586016020526040902091935091506112b582826128f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112e2908590600401612680565b6020604051808303815f875af11580156112fe573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132291906126b2565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156113a4576113a4612555565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161149991908e01908e01612845565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612bfd83398151915260205260408082208151610100810190925280545f80516020612bdd83398151915293929190829060ff16600581111561151557611515612555565b600581111561152657611526612555565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156115ae576115ae612555565b1461160a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103be565b60408101516001600160a01b0316336001600160a01b0316146116845760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103be565b6116918160a00151611cbf565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156116d5576116d5612555565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6117a18461179b81612205565b5f6109a2565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906117d0908590600401612680565b6020604051808303815f875af11580156117ec573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061181091906126b2565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612bdd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118da573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119019190810190612a18565b91509150806119685760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103be565b82548251146119cb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103be565b60208201516001600160a01b031615611a3e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103be565b509392505050565b5f808251602714611aab5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103be565b5f805b6002811015611afa57611ac28160016127f4565b611acd906008612807565b61ffff16858281518110611ae357611ae361281e565b016020015160f81c901b9190911790600101611aae565b5061ffff811615611b595760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103be565b5f805b6004811015611bb457611b708160036127f4565b611b7b906008612807565b63ffffffff1686611b8d836002612832565b81518110611b9d57611b9d61281e565b016020015160f81c901b9190911790600101611b5c565b5063ffffffff8116600214611c1b5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103be565b5f805b6020811015611c7057611c3281601f6127f4565b611c3d906008612807565b87611c49836006612832565b81518110611c5957611c5961281e565b016020015160f81c901b9190911790600101611c1e565b505f86602681518110611c8557611c8561281e565b016020015191976001600160f81b03199092161515965090945050505050565b611cad612287565b611cb6826122d0565b610457816122f1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612bdd8339815191529060ff165f03611cfd575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611d4590836127f4565b10611d61576001600160401b0384166040830152808252611d80565b8382604001818151611d739190612b00565b6001600160401b03169052505b5f826020015183604001516064611d979190612b20565b611da19190612b4b565b600285015490915060ff9081169082161115611e1c5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103be565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611eca5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103be565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611f4157611f018160016127f4565b611f0c906008612807565b5081515f90839083908110611f2357611f2361281e565b60200101906001600160f81b03191690815f1a905350600101611eed565b505f5b6004811015611f9f57611f588160036127f4565b611f63906008612807565b505f82611f71836002612832565b81518110611f8157611f8161281e565b60200101906001600160f81b03191690815f1a905350600101611f44565b505f5b6020811015611ffc5784518160208110611fbe57611fbe61281e565b1a60f81b82611fce836006612832565b81518110611fde57611fde61281e565b60200101906001600160f81b03191690815f1a905350600101611fa2565b505f5b602081101561205c578460200151816020811061201e5761201e61281e565b1a60f81b8261202e836026612832565b8151811061203e5761203e61281e565b60200101906001600160f81b03191690815f1a905350600101611fff565b505f5b60088110156120d0576120738160076127f4565b61207e906008612807565b60ff1685604001516001600160401b0316901c60f81b828260466120a29190612832565b815181106120b2576120b261281e565b60200101906001600160f81b03191690815f1a90535060010161205f565b505f5b603081101561213b57846080015181815181106120f2576120f261281e565b01602001516001600160f81b0319168261210d83604e612832565b8151811061211d5761211d61281e565b60200101906001600160f81b03191690815f1a9053506001016120d3565b505f5b60088110156121ad576121528160076127f4565b61215d906008612807565b60608601516001600160401b0390811691161c60f81b8261217f83607e612832565b8151811061218f5761218f61281e565b60200101906001600160f81b03191690815f1a90535060010161213e565b506002816040516121be9190612b7c565b602060405180830381855afa1580156121d9573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906121fc91906126b2565b94909350915050565b5f8181525f80516020612bfd8339815191526020526040812060030180545f80516020612bdd833981519152916001600160401b03909116908361224883612b97565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661048057604051631afcd79f60e31b815260040160405180910390fd5b6122d8612287565b6122e0612302565b6122e8612312565b6104a78161231a565b6122f9612287565b6104a781612386565b61230a612287565b61048061238e565b610480612287565b612322612287565b80355f80516020612bdd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561236c6060830160408401612bbc565b600291909101805460ff191660ff90921691909117905550565b610970612287565b612396612287565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5080546123c8906126c9565b5f825580601f106123d7575050565b601f0160209004905f5260205f20908101906104a79190612437565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561244b575f8155600101612438565b5090565b5f6020828403121561245f575f80fd5b5035919050565b5f60208284031215612476575f80fd5b813563ffffffff81168114612489575f80fd5b9392505050565b5f606082840312156124a0575f80fd5b50919050565b80356001600160401b03811681146124bc575f80fd5b919050565b5f80604083850312156124d2575f80fd5b82356001600160401b038111156124e7575f80fd5b6124f385828601612490565b925050612502602084016124a6565b90509250929050565b6001600160a01b03811681146104a7575f80fd5b5f8060808385031215612530575f80fd5b61253a8484612490565b9150606083013561254a8161250b565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061258d57634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516125b560408401826001600160a01b03169052565b5060608301516125d060608401826001600160401b03169052565b5060808301516125eb60808401826001600160401b03169052565b5060a083015161260660a08401826001600160401b03169052565b5060c083015161262160c08401826001600160401b03169052565b5060e083015161263c60e08401826001600160401b03169052565b5092915050565b5f60208284031215612653575f80fd5b81356124898161250b565b5f5b83811015612678578181015183820152602001612660565b50505f910152565b602081525f825180602084015261269e81604085016020870161265e565b601f01601f19169190910160400192915050565b5f602082840312156126c2575f80fd5b5051919050565b600181811c908216806126dd57607f821691505b6020821081036124a057634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612754816126c9565b806020870152604060018084165f81146127755760018114612791576127be565b60ff19851660408a0152604084151560051b8a010195506127be565b895f5260205f205f5b858110156127b55781548b820186015290830190880161279a565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610498576104986127e0565b8082028115828204841417610498576104986127e0565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610498576104986127e0565b5f60208284031215612855575f80fd5b610495826124a6565b5f808335601e19843603018112612873575f80fd5b8301803591506001600160401b0382111561288c575f80fd5b6020019150368190038213156128a0575f80fd5b9250929050565b601f82111561077657805f5260205f20601f840160051c810160208510156128cc5750805b601f840160051c820191505b818110156128eb575f81556001016128d8565b5050505050565b81516001600160401b0381111561290b5761290b6127cc565b61291f8161291984546126c9565b846128a7565b602080601f831160018114612952575f841561293b5750858301515b5f19600386901b1c1916600185901b1785556129a9565b5f85815260208120601f198616915b8281101561298057888601518255948401946001909101908401612961565b508582101561299d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b03811182821017156129d3576129d36127cc565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612a0157612a016127cc565b604052919050565b805180151581146124bc575f80fd5b5f8060408385031215612a29575f80fd5b82516001600160401b0380821115612a3f575f80fd5b9084019060608287031215612a52575f80fd5b612a5a6129b1565b82518152602080840151612a6d8161250b565b82820152604084015183811115612a82575f80fd5b80850194505087601f850112612a96575f80fd5b835183811115612aa857612aa86127cc565b612aba601f8201601f191683016129d9565b93508084528882828701011115612acf575f80fd5b612ade8183860184880161265e565b50826040830152819550612af3818801612a09565b9450505050509250929050565b6001600160401b0381811683821601908082111561263c5761263c6127e0565b6001600160401b03818116838216028082169190828114612b4357612b436127e0565b505092915050565b5f6001600160401b0380841680612b7057634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612b8d81846020870161265e565b9190910192915050565b5f6001600160401b03808316818103612bb257612bb26127e0565b6001019392505050565b5f60208284031215612bcc575f80fd5b813560ff81168114612489575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -278,6 +290,37 @@ func (_PoAValidatorManager *PoAValidatorManagerCallerSession) ActiveValidators(n return _PoAValidatorManager.Contract.ActiveValidators(&_PoAValidatorManager.CallOpts, nodeID) } +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +func (_PoAValidatorManager *PoAValidatorManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "getValidator", validationID) + + if err != nil { + return *new(Validator), err + } + + out0 := *abi.ConvertType(out[0], new(Validator)).(*Validator) + + return out0, err + +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +func (_PoAValidatorManager *PoAValidatorManagerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _PoAValidatorManager.Contract.GetValidator(&_PoAValidatorManager.CallOpts, validationID) +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _PoAValidatorManager.Contract.GetValidator(&_PoAValidatorManager.CallOpts, validationID) +} + // GetWeight is a free data retrieval call binding the contract method 0x66435abf. // // Solidity: function getWeight(bytes32 validationID) view returns(uint64) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index e9bd736de..1fe224a92 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -130,7 +130,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Check that minimum stake duration has passed - Validator memory validator = _getValidator(validationID); + Validator memory validator = getValidator(validationID); require( block.timestamp >= validator.startedAt + $._validatorRequirements[validationID].minStakeDuration, @@ -223,7 +223,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint64 weight = valueToWeight(_lock(delegationAmount)); // Ensure the validation period is active - Validator memory validator = _getValidator(validationID); + Validator memory validator = getValidator(validationID); require( validator.status == ValidatorStatus.Active, "PoSValidatorManager: validator not active" ); @@ -283,7 +283,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager (bytes32 validationID, uint64 nonce,) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - Validator memory validator = _getValidator(validationID); + Validator memory validator = getValidator(validationID); // The received nonce should be no greater than the highest sent nonce. This should never // happen since the staking manager is the only entity that can trigger a weight update @@ -352,7 +352,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager $._delegatorStakes[delegationID] = delegator; - Validator memory validator = _getValidator(validationID); + Validator memory validator = getValidator(validationID); require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); uint64 newValidatorWeight = validator.weight - delegator.weight; _setValidatorWeight(validationID, newValidatorWeight); @@ -387,7 +387,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: delegation status not pending" ); - Validator memory validator = _getValidator(delegator.validationID); + Validator memory validator = getValidator(delegator.validationID); require( validator.messageNonce != 0, "PoSValidatorManager: could not find validator for delegation ID" @@ -409,7 +409,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager (bytes32 validationID, uint64 nonce,) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - Validator memory validator = _getValidator(validationID); + Validator memory validator = getValidator(validationID); // The received nonce should be no greater than the highest sent nonce. This should never // happen since the staking manager is the only entity that can trigger a weight update // on the P-Chain. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 2f7cabb64..efddd534f 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -203,6 +203,11 @@ abstract contract ValidatorManager is return $._activeValidators[nodeID]; } + function getValidator(bytes32 validationID) public view returns (Validator memory) { + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + return $._validationPeriods[validationID]; + } + /** * @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. @@ -319,7 +324,7 @@ abstract contract ValidatorManager is * @return The 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; + return getValidator(validationID).weight; } /** @@ -377,11 +382,6 @@ abstract contract ValidatorManager is return warpMessage; } - function _getValidator(bytes32 validationID) internal view returns (Validator memory) { - ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - return $._validationPeriods[validationID]; - } - function _setValidatorWeight(bytes32 validationID, uint64 weight) internal { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); $._validationPeriods[validationID].weight = weight; diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go index 401b43ecf..3de9608f0 100644 --- a/tests/flows/staking/native_delegation.go +++ b/tests/flows/staking/native_delegation.go @@ -5,7 +5,6 @@ import ( "math/big" "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" @@ -56,8 +55,6 @@ func NativeDelegation(network interfaces.LocalNetwork) { validatorStake, ) Expect(err).Should(BeNil()) - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} stakeAmount := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) validationID = utils.InitializeAndCompleteNativeValidatorRegistration( network, @@ -67,8 +64,6 @@ func NativeDelegation(network interfaces.LocalNetwork) { pChainInfo, stakingManager, stakingManagerAddress, - nodeID, - blsPublicKey, stakeAmount, ) // diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index 12b7b8a94..49045269a 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -5,7 +5,6 @@ import ( "math/big" "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" @@ -54,46 +53,38 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // // Register a validator // - var validationID ids.ID // To be used in the delisting step stakeAmount := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) weight, err := stakingManager.ValueToWeight( &bind.CallOpts{}, stakeAmount, ) Expect(err).Should(BeNil()) - { - // Iniatiate validator registration - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} - validationID = utils.InitializeAndCompleteNativeValidatorRegistration( - network, - signatureAggregator, - fundedKey, - subnetAInfo, - pChainInfo, - stakingManager, - stakingManagerContractAddress, - nodeID, - blsPublicKey, - stakeAmount, - ) - } + // Iniatiate validator registration + validationID := utils.InitializeAndCompleteNativeValidatorRegistration( + network, + signatureAggregator, + fundedKey, + subnetAInfo, + pChainInfo, + stakingManager, + stakingManagerContractAddress, + stakeAmount, + ) // // Delist the validator // - { - utils.InitializeAndCompleteEndNativeValidation( - network, - signatureAggregator, - fundedKey, - subnetAInfo, - pChainInfo, - stakingManager, - stakingManagerContractAddress, - validationID, - weight, - 1, - ) - } + utils.InitializeAndCompleteEndNativeValidation( + network, + signatureAggregator, + fundedKey, + subnetAInfo, + pChainInfo, + stakingManager, + stakingManagerContractAddress, + validationID, + weight, + 1, + ) + } diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index c325295b5..983b74559 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -5,7 +5,6 @@ import ( "math/big" "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" @@ -101,8 +100,6 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { // Register a validator poaWeight := uint64(1) - poaNodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} poaValidationID := utils.InitializeAndCompletePoAValidatorRegistration( network, signatureAggregator, @@ -113,9 +110,10 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { poaValidatorManager, proxyAddress, poaWeight, - poaNodeID, - blsPublicKey, ) + poaValidator, err := poaValidatorManager.GetValidator(&bind.CallOpts{}, poaValidationID) + Expect(err).Should(BeNil()) + poaNodeID := poaValidator.NodeID /* ****************** @@ -167,7 +165,6 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { Expect(validationID[:]).Should(Equal(poaValidationID[:])) // Register a PoS validator - posNodeID := ids.GenerateTestID() stakeAmount := big.NewInt(1e18) posWeight, err := posValidatorManager.ValueToWeight( &bind.CallOpts{}, @@ -183,8 +180,6 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { pChainInfo, posValidatorManager, proxyAddress, - posNodeID, - blsPublicKey, stakeAmount, ) diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 1902801fc..a910859d1 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -3,10 +3,12 @@ package staking import ( "context" "math/big" + "time" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/crypto" @@ -72,19 +74,23 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { ) var validationID ids.ID // To be used in the delisting step - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} weight := uint64(1) { // Try to call with invalid owner - utils.InitializePoAValidatorRegistration( - fundedKey, - subnetAInfo, + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + Expect(err).Should(BeNil()) + + nodeID := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} + _, err = validatorManager.InitializeValidatorRegistration( + opts, + poavalidatormanager.ValidatorRegistrationInput{ + NodeID: nodeID, + RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), + BlsPublicKey: blsPublicKey[:], + }, weight, - nodeID, - blsPublicKey, - validatorManager, ) Expect(err).ShouldNot(BeNil()) @@ -99,8 +105,6 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { validatorManager, validatorManagerAddress, weight, - nodeID, - blsPublicKey, ) } diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index ff69cb939..88011b97b 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -196,13 +196,13 @@ var _ = ginkgo.Describe("[Teleporter integration tests]", func() { governance.ValidatorSetSig(LocalNetworkInstance) }) - // Staking tests - ginkgo.FIt("Native token staking manager", + // Validator Manager tests + ginkgo.It("Native token staking manager", ginkgo.Label(validatorManagerLabel), func() { staking.NativeTokenStakingManager(LocalNetworkInstance) }) - ginkgo.FIt("ERC20 token staking manager", + ginkgo.It("ERC20 token staking manager", ginkgo.Label(validatorManagerLabel), func() { staking.ERC20TokenStakingManager(LocalNetworkInstance) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 7eb5bde6b..8f603cc7d 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -409,10 +409,11 @@ func InitializeAndCompleteNativeValidatorRegistration( pChainInfo interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, stakingManagerContractAddress common.Address, - nodeID ids.ID, - blsPublicKey [bls.PublicKeyLen]byte, stakeAmount *big.Int, ) ids.ID { + // Initiate validator registration + nodeID := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} receipt, validationID := InitializeNativeValidatorRegistration( fundedKey, subnetInfo, @@ -550,9 +551,10 @@ func InitializeAndCompletePoAValidatorRegistration( validatorManager *poavalidatormanager.PoAValidatorManager, validatorManagerAddress common.Address, weight uint64, - nodeID ids.ID, - blsPublicKey [bls.PublicKeyLen]byte, ) ids.ID { + // Initiate validator registration + nodeID := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} receipt, validationID := InitializePoAValidatorRegistration( ownerKey, subnetInfo, From 72a64171e95a6795f915077e9a4388df3800e3ad Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 13 Sep 2024 13:30:03 -0400 Subject: [PATCH 273/545] add utils and fix lint --- tests/flows/staking/erc20_token_staking.go | 16 +--------------- tests/flows/staking/native_token_staking.go | 17 +---------------- tests/utils/staking.go | 20 ++++++++++++++++++++ 3 files changed, 22 insertions(+), 31 deletions(-) diff --git a/tests/flows/staking/erc20_token_staking.go b/tests/flows/staking/erc20_token_staking.go index 922abc51f..7c3fd4e07 100644 --- a/tests/flows/staking/erc20_token_staking.go +++ b/tests/flows/staking/erc20_token_staking.go @@ -3,7 +3,6 @@ package staking import ( "context" "math/big" - "time" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/subnet-evm/accounts/abi/bind" @@ -32,7 +31,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // Get the subnets info cChainInfo := network.GetPrimaryNetworkInfo() subnetAInfo, _ := utils.GetTwoSubnets(network) - fundedAddress, fundedKey := network.GetFundedAccountInfo() + _, fundedKey := network.GetFundedAccountInfo() pChainInfo := utils.GetPChainInfo(cChainInfo) signatureAggregator := utils.NewSignatureAggregator( @@ -72,19 +71,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakeAmount, ) - // Make sure minimum stake duration has passed - time.Sleep(time.Duration(utils.DefaultMinStakeDurationSeconds) * time.Second) - - // Send a loopback transaction to self to force a block production - // before delisting the validator. - utils.SendNativeTransfer( - context.Background(), - subnetAInfo, - fundedKey, - fundedAddress, - big.NewInt(10), - ) - // // Delist the validator // diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index 5177648ea..77ac8b6c3 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -3,7 +3,6 @@ package staking import ( "context" "math/big" - "time" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/subnet-evm/accounts/abi/bind" @@ -32,7 +31,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Get the subnets info cChainInfo := network.GetPrimaryNetworkInfo() subnetAInfo, _ := utils.GetTwoSubnets(network) - fundedAddress, fundedKey := network.GetFundedAccountInfo() + _, fundedKey := network.GetFundedAccountInfo() pChainInfo := utils.GetPChainInfo(cChainInfo) signatureAggregator := utils.NewSignatureAggregator( @@ -72,19 +71,6 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { stakeAmount, ) - // Make sure minimum stake duration has passed - time.Sleep(time.Duration(utils.DefaultMinStakeDurationSeconds) * time.Second) - - // Send a loopback transaction to self to force a block production - // before delisting the validator. - utils.SendNativeTransfer( - context.Background(), - subnetAInfo, - fundedKey, - fundedAddress, - big.NewInt(10), - ) - // // Delist the validator // @@ -100,5 +86,4 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { weight, 1, ) - } diff --git a/tests/utils/staking.go b/tests/utils/staking.go index f43591947..e352d7e86 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -903,6 +903,7 @@ func InitializeAndCompleteEndNativeValidation( weight uint64, nonce uint64, ) { + WaitMinStakeDuration(subnetInfo, fundedKey) receipt := InitializeEndNativeValidation( fundedKey, subnetInfo, @@ -964,6 +965,7 @@ func InitializeAndCompleteEndERC20Validation( weight uint64, nonce uint64, ) { + WaitMinStakeDuration(subnetInfo, fundedKey) receipt := InitializeEndERC20Validation( fundedKey, subnetInfo, @@ -1187,3 +1189,21 @@ func ValidateSetSubnetValidatorWeightMessage( Expect(registerValidatorPayload.Weight).Should(Equal(weight)) Expect(registerValidatorPayload.Nonce).Should(Equal(nonce)) } + +func WaitMinStakeDuration( + subnet interfaces.SubnetTestInfo, + fundedKey *ecdsa.PrivateKey, +) { + // Make sure minimum stake duration has passed + time.Sleep(time.Duration(DefaultMinStakeDurationSeconds) * time.Second) + + // Send a loopback transaction to self to force a block production + // before delisting the validator. + SendNativeTransfer( + context.Background(), + subnet, + fundedKey, + common.Address{}, + big.NewInt(10), + ) +} From 65cf9727ade83b277f62fefd4a6b3a83f8fcb272 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 13 Sep 2024 13:47:26 -0400 Subject: [PATCH 274/545] Fix e2e tests --- tests/flows/staking/poa_to_pos.go | 10 ++++++---- tests/utils/staking.go | 14 ++++++++------ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index 85f55155d..0f7f09915 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -91,8 +91,10 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { tx, err := poaValidatorManager.Initialize( opts, poavalidatormanager.ValidatorManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, - SubnetID: subnetAInfo.SubnetID, + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnetAInfo.SubnetID, + ChurnPeriodSeconds: uint64(0), + MaximumChurnPercentage: uint8(20), }, ownerAddress, ) @@ -151,8 +153,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(20), }, - MinimumStakeAmount: big.NewInt(1e6), - MaximumStakeAmount: big.NewInt(10e6), + MinimumStakeAmount: utils.BigIntMul(big.NewInt(1e6), big.NewInt(1e12)), + MaximumStakeAmount: utils.BigIntMul(big.NewInt(10e6), big.NewInt(1e12)), MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), RewardCalculator: common.Address{}, }, diff --git a/tests/utils/staking.go b/tests/utils/staking.go index df3b5d809..25c9b743a 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -72,8 +72,8 @@ func DeployAndInitializeNativeTokenStakingManager( ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(20), }, - MinimumStakeAmount: big.NewInt(1e6), - MaximumStakeAmount: big.NewInt(10e6), + MinimumStakeAmount: BigIntMul(big.NewInt(1e6), big.NewInt(1e12)), + MaximumStakeAmount: BigIntMul(big.NewInt(10e6), big.NewInt(1e12)), MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), RewardCalculator: common.Address{}, }, @@ -133,8 +133,8 @@ func DeployAndInitializeERC20TokenStakingManager( ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(20), }, - MinimumStakeAmount: big.NewInt(1e6), - MaximumStakeAmount: big.NewInt(10e6), + MinimumStakeAmount: BigIntMul(big.NewInt(1e6), big.NewInt(1e12)), + MaximumStakeAmount: BigIntMul(big.NewInt(10e6), big.NewInt(1e12)), MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), RewardCalculator: common.Address{}, }, @@ -183,8 +183,10 @@ func DeployAndInitializePoAValidatorManager( tx, err := validatorManager.Initialize( opts, poavalidatormanager.ValidatorManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, - SubnetID: subnet.SubnetID, + PChainBlockchainID: pChainInfo.BlockchainID, + SubnetID: subnet.SubnetID, + ChurnPeriodSeconds: uint64(0), + MaximumChurnPercentage: uint8(20), }, ownerAddress, ) From 0542c826e50ffa65b14e57ced2b1c40eb16b23d0 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 13 Sep 2024 14:52:24 -0400 Subject: [PATCH 275/545] Fix most unit tests --- .../tests/PoSValidatorManagerTests.t.sol | 4 ++-- .../staking/tests/ValidatorManagerTests.t.sol | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 13c98b1cb..ab3304ce8 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -118,7 +118,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(_formatErrorMessage("invalid stake amount")); + vm.expectRevert(_formatErrorMessage("stake amount too low")); _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE - 1); } @@ -132,7 +132,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(_formatErrorMessage("invalid stake amount")); + vm.expectRevert(_formatErrorMessage("stake amount too high")); _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MAXIMUM_STAKE + 1); } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 1aacf7078..ebc9477a9 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -226,18 +226,28 @@ abstract contract ValidatorManagerTest is Test { } function testCummulativeChurnRegistrationAndEndValidation() public { + // Registration should succeed + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: _valueToWeight(DEFAULT_MINIMUM_STAKE_AMOUNT), + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + uint64 churnThreshold = uint64(DEFAULT_STARTING_TOTAL_WEIGHT) * DEFAULT_MAXIMUM_CHURN_PERCENTAGE / 100; _beforeSend(_weightToValue(churnThreshold), address(this)); // Registration should succeed - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, + _setUpCompleteValidatorRegistration({ + nodeID: _newNodeID(), subnetID: DEFAULT_SUBNET_ID, weight: churnThreshold, - registrationExpiry: DEFAULT_EXPIRY, + registrationExpiry: DEFAULT_EXPIRY + 25 hours, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + 25 hours }); // Second call should fail From 2c1a1b100b9acf5890073e83bd7668ad4cee9715 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 13 Sep 2024 15:11:24 -0400 Subject: [PATCH 276/545] unit tests compile but need initial validator set --- .../staking/interfaces/IValidatorManager.sol | 2 - .../tests/ERC20TokenStakingManagerTests.t.sol | 25 ++++---- .../NativeTokenStakingManagerTests.t.sol | 14 ++--- .../tests/PoSValidatorManagerTests.t.sol | 58 ++++++++++--------- 4 files changed, 49 insertions(+), 50 deletions(-) diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 964a261e2..8bba89223 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -36,8 +36,6 @@ struct ValidatorManagerSettings { bytes32 pChainBlockchainID; bytes32 subnetID; uint8 maximumHourlyChurn; - SubnetConversionData subnetConversionData; - uint32 messageIndex; } struct SubnetConversionData { diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 301a73d96..c2d3e8366 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -167,10 +167,8 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectRevert(_formatErrorMessage("invalid min stake duration")); app.initializeValidatorRegistration( input, - PoSValidatorRequirements({ - minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION - 1, - delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - }), + DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_MINIMUM_STAKE_DURATION - 1, stakeAmount ); } @@ -182,20 +180,21 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectRevert(_formatErrorMessage("invalid delegation fee")); app.initializeValidatorRegistration( input, - PoSValidatorRequirements({ - minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1 - }), + DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1, + DEFAULT_MINIMUM_STAKE_DURATION, stakeAmount ); } function _initializeValidatorRegistration( ValidatorRegistrationInput memory registrationInput, - PoSValidatorRequirements memory requirements, + uint16 delegationFeeBips, + uint64 minStakeDuration, uint256 stakeAmount ) internal virtual override returns (bytes32) { - return app.initializeValidatorRegistration(registrationInput, requirements, stakeAmount); + return app.initializeValidatorRegistration( + registrationInput, delegationFeeBips, minStakeDuration, stakeAmount + ); } function _initializeValidatorRegistration( @@ -204,10 +203,8 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration( input, - PoSValidatorRequirements({ - minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - }), + DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_MINIMUM_STAKE_DURATION, app.weightToValue(weight) ); } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 8b3e2b528..1f7105af6 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -150,11 +150,13 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { // Helpers function _initializeValidatorRegistration( ValidatorRegistrationInput memory registrationInput, - PoSValidatorRequirements memory requirements, + uint16 delegationFeeBips, + uint64 minStakeDuration, uint256 stakeAmount ) internal virtual override returns (bytes32) { - return - app.initializeValidatorRegistration{value: stakeAmount}(registrationInput, requirements); + return app.initializeValidatorRegistration{value: stakeAmount}( + registrationInput, delegationFeeBips, minStakeDuration + ); } function _initializeValidatorRegistration( @@ -162,11 +164,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { uint64 weight ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration{value: app.weightToValue(weight)}( - input, - PoSValidatorRequirements({ - minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - }) + input, DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION ); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index b07cc30bd..7d03d3096 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -65,73 +65,78 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); function testDelegationFeeBipsTooLow() public { - PoSValidatorRequirements memory requirements = PoSValidatorRequirements({ - minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1 - }); + // ValidatorRegistrationInput calldata registrationInput, + // uint16 delegationFeeBips, + // uint64 minStakeDuration, + // uint256 stakeAmount ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); vm.expectRevert(_formatErrorMessage("invalid delegation fee")); - _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE); + _initializeValidatorRegistration( + registrationInput, + DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1, + DEFAULT_MINIMUM_STAKE_DURATION, + DEFAULT_MINIMUM_STAKE + ); } function testDelegationFeeBipsTooHigh() public { - PoSValidatorRequirements memory requirements = PoSValidatorRequirements({ - minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - delegationFeeBips: posValidatorManager.MAXIMUM_DELEGATION_FEE_BIPS() + 1 - }); ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); + uint16 delegationFeeBips = posValidatorManager.MAXIMUM_DELEGATION_FEE_BIPS() + 1; vm.expectRevert(_formatErrorMessage("invalid delegation fee")); - _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE); + _initializeValidatorRegistration( + registrationInput, + delegationFeeBips, + DEFAULT_MINIMUM_STAKE_DURATION, + DEFAULT_MINIMUM_STAKE + ); } function testInvalidMinStakeDuration() public { - PoSValidatorRequirements memory requirements = PoSValidatorRequirements({ - minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION - 1, - delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - }); ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); vm.expectRevert(_formatErrorMessage("invalid min stake duration")); - _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE); + _initializeValidatorRegistration( + registrationInput, + DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_MINIMUM_STAKE_DURATION - 1, + DEFAULT_MINIMUM_STAKE + ); } function testStakeAmountTooLow() public { - PoSValidatorRequirements memory requirements = PoSValidatorRequirements({ - minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - }); ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); vm.expectRevert(_formatErrorMessage("invalid stake amount")); - _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE - 1); + _initializeValidatorRegistration( + registrationInput, + DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_MINIMUM_STAKE_DURATION, + DEFAULT_MINIMUM_STAKE - 1 + ); } function testStakeAmountTooHigh() public { - PoSValidatorRequirements memory requirements = PoSValidatorRequirements({ - minStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, - delegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - }); ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); vm.expectRevert(_formatErrorMessage("invalid stake amount")); - _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MAXIMUM_STAKE + 1); + _initializeValidatorRegistration(registrationInput, DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MAXIMUM_STAKE + 1); } function testInvalidInitializeEndTime() public { @@ -696,7 +701,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _initializeValidatorRegistration( ValidatorRegistrationInput memory registrationInput, - PoSValidatorRequirements memory requirements, + uint16 delegationFeeBips, + uint64 minStakeDuration, uint256 stakeAmount ) internal virtual returns (bytes32); From 1dcb74ccd7d8f9eddb54c642e9aa03527b8558be Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 13 Sep 2024 15:12:16 -0400 Subject: [PATCH 277/545] bindings --- .../ERC20TokenStakingManager.go | 227 ++++++++++++++++-- .../NativeTokenStakingManager.go | 227 ++++++++++++++++-- .../PoAValidatorManager.go | 201 +++++++++++++++- 3 files changed, 605 insertions(+), 50 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6c18cfbc6..7a309347b 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -29,6 +29,13 @@ var ( _ = abi.ConvertType ) +// InitialValidator is an auto generated low-level Go binding around an user-defined struct. +type InitialValidator struct { + NodeID [32]byte + Weight uint64 + BlsPublicKey []byte +} + // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { BaseSettings ValidatorManagerSettings @@ -40,17 +47,18 @@ type PoSValidatorManagerSettings struct { RewardCalculator common.Address } -// PoSValidatorRequirements is an auto generated low-level Go binding around an user-defined struct. -type PoSValidatorRequirements struct { - DelegationFeeBips uint16 - MinStakeDuration uint64 +// SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. +type SubnetConversionData struct { + ConvertSubnetTxID [32]byte + BlockchainID [32]byte + ValidatorManagerAddress []byte + InitialValidators []InitialValidator } // Validator is an auto generated low-level Go binding around an user-defined struct. type Validator struct { Status uint8 NodeID [32]byte - Owner common.Address StartingWeight uint64 MessageNonce uint64 Weight uint64 @@ -74,8 +82,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614fc4380380614fc483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614e778061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c80636f5f1c94116100a9578063a3a65e481161006e578063a3a65e48146102b0578063b771b3bc146102c3578063ba3a4b97146102e9578063bee0a03f146102fc578063d5f20ff61461030f575f80fd5b80636f5f1c941461025157806376f786211461026457806398f3e2b4146102775780639e1bc4ef1461028a578063a13fd29d1461029d575f80fd5b806335455ded116100ef57806335455ded146101e9578063467ef06f146102055780635297fae614610218578063620658561461022b57806366435abf1461023e575f80fd5b80630118acc41461012b5780630322ed98146101405780630cdd098514610153578063151d30d1146101a45780632e2194d8146101be575b5f80fd5b61013e61013936600461434d565b61032f565b005b61013e61014e366004614388565b610799565b610191610161366004614388565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101ac600a81565b60405160ff909116815260200161019b565b6101d16101cc366004614388565b610969565b6040516001600160401b03909116815260200161019b565b6101f261271081565b60405161ffff909116815260200161019b565b61013e61021336600461439f565b61097f565b61013e6102263660046143b8565b6109aa565b6101916102393660046143f4565b610b7a565b6101d161024c366004614388565b610b93565b61013e61025f366004614423565b610ba7565b61013e61027236600461434d565b610c8b565b61013e6102853660046143b8565b610d6b565b610191610298366004614461565b610f7a565b6101916102ab366004614481565b610f8d565b61013e6102be36600461439f565b610fb9565b6102d16005600160991b0181565b6040516001600160a01b03909116815260200161019b565b61013e6102f7366004614388565b611176565b61013e61030a366004614388565b6113fc565b61032261031d366004614388565b611510565b60405161019b91906144f6565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614dcb8339815191529184156103815761037e82856115ef565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103b3576103b36144e2565b60048111156103c4576103c46144e2565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561044b5761044b6144e2565b1461049d5760405162461bcd60e51b815260206004820152602a60248201525f80516020614deb8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105025760405162461bcd60e51b815260206004820152603360248201525f80516020614deb8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610494565b5f61050c8461188b565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff19166001836004811115610559576105596144e2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61062b85611510565b905082606001516001600160401b03168160a001516001600160401b0316116106a25760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610494565b5f83606001518260a001516106b791906145e4565b90506106c3868261190d565b5f6005600160991b0163ee5b48eb6106dc898786611955565b6040518263ffffffff1660e01b81526004016106f89190614626565b6020604051808303815f875af1158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190614658565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614e4b83398151915260205260408082208151610100810190925280545f80516020614e0b83398151915293929190829060ff1660058111156107e7576107e76144e2565b60058111156107f8576107f86144e2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561087d5761087d6144e2565b146108e25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610494565b6005600160991b016001600160a01b031663ee5b48eb6109078584608001515f611955565b6040518263ffffffff1660e01b81526004016109239190614626565b6020604051808303815f875af115801561093f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109639190614658565b50505050565b5f61097964e8d4a5100083614683565b92915050565b5f61098982611b72565b90506109a681606001516001600160401b03168260400151611ee5565b5050565b5f80516020614dcb8339815191525f6109c284611f1b565b90505f806109d383604001516120fc565b50915091505f6109e283611510565b9050816001600160401b031681608001516001600160401b03161015610a1a5760405162461bcd60e51b815260040161049490614696565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a5f5760405162461bcd60e51b8152600401610494906146d8565b60015f87815260068701602052604090205460ff166004811115610a8557610a856144e2565b14610aee5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610494565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109796001600160401b03831664e8d4a51000614721565b5f610b9d82611510565b60a0015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c398484612337565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020614dcb8339815191525f610ca385611510565b5f86815260058401602052604090205460c0820151919250610cd591620100009091046001600160401b031690614738565b6001600160401b0316421015610d495760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610494565b8315610d5b57610d5985846115ef565b505b610d6485612351565b5050505050565b5f80516020614dcb8339815191525f610d8384611f1b565b90505f80610d9483604001516120fc565b50915091505f610da383611510565b9050816001600160401b031681608001516001600160401b03161015610ddb5760405162461bcd60e51b815260040161049490614696565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e195760405162461bcd60e51b8152600401610494906146d8565b60035f87815260068701602052604090205460ff166004811115610e3f57610e3f6144e2565b14610e935760405162461bcd60e51b815260206004820152603160248201525f80516020614deb8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610494565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f3891611ee5565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f868333846126ef565b9392505050565b5f610f96612ae4565b610fa1848484612b1b565b9050610f8660015f80516020614e2b83398151915255565b5f80516020614e0b8339815191525f610fd183611f1b565b90505f80610fe28360400151612cfd565b91509150806110445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610494565b5f8281526005850160205260408120805461105e90614758565b9050118015611090575060015f83815260068601602052604090205460ff16600581111561108e5761108e6144e2565b145b6110ac5760405162461bcd60e51b815260040161049490614790565b5f82815260058501602052604081206110c491614295565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614dcb83398151915293929190829060ff1660048111156111d7576111d76144e2565b60048111156111e8576111e86144e2565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561126f5761126f6144e2565b148061128d575060038151600481111561128b5761128b6144e2565b145b6112e15760405162461bcd60e51b815260206004820152603260248201525f80516020614deb833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610494565b5f6112ef8260400151611510565b905080608001516001600160401b03165f036113735760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610494565b6005600160991b016001600160a01b031663ee5b48eb6113a0846040015184608001518560a00151611955565b6040518263ffffffff1660e01b81526004016113bc9190614626565b6020604051808303815f875af11580156113d8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d649190614658565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614e0b83398151915292919061144490614758565b9050118015611476575060015f83815260068301602052604090205460ff166005811115611474576114746144e2565b145b6114925760405162461bcd60e51b815260040161049490614790565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114cb91906004016147d7565b6020604051808303815f875af11580156114e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061150b9190614658565b505050565b6115186142cc565b5f8281525f80516020614e4b8339815191526020526040908190208151610100810190925280545f80516020614e0b833981519152929190829060ff166005811115611566576115666144e2565b6005811115611577576115776144e2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561163a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261166191908101906148d8565b91509150806116c45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610494565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172b9190614658565b82511461178f5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610494565b60208201516001600160a01b0316156118055760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610494565b5f806118148460400151612e9e565b915091508187146118815760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610494565b9695505050505050565b5f8181525f80516020614e4b8339815191526020526040812060030180545f80516020614e0b833981519152916001600160401b0390911690836118ce836149c0565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b5f9182525f80516020614e4b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119ce5761198e8160016149e5565b611999906008614721565b5081515f908390839081106119b0576119b06149f8565b60200101906001600160f81b03191690815f1a90535060010161197a565b505f5b6004811015611a31576119e58160036149e5565b6119f0906008614721565b6001901c60f81b82611a03836002614a0c565b81518110611a1357611a136149f8565b60200101906001600160f81b03191690815f1a9053506001016119d1565b505f5b6020811015611a9357611a4881601f6149e5565b611a53906008614721565b86901c60f81b82611a65836006614a0c565b81518110611a7557611a756149f8565b60200101906001600160f81b03191690815f1a905350600101611a34565b505f5b6008811015611afe57611aaa8160076149e5565b611ab5906008614721565b6001600160401b038616901c60f81b82611ad0836026614a0c565b81518110611ae057611ae06149f8565b60200101906001600160f81b03191690815f1a905350600101611a96565b505f5b6008811015611b6957611b158160076149e5565b611b20906008614721565b6001600160401b038516901c60f81b82611b3b83602e614a0c565b81518110611b4b57611b4b6149f8565b60200101906001600160f81b03191690815f1a905350600101611b01565b50949350505050565b611b7a6142cc565b5f80516020614e0b8339815191525f611b9284611f1b565b90505f80611ba38360400151612cfd565b915091508015611c085760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610494565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611c3a57611c3a6144e2565b6005811115611c4b57611c4b6144e2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611cd257611cd26144e2565b1480611cf05750600182516005811115611cee57611cee6144e2565b145b611d4f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610494565b600382516005811115611d6457611d646144e2565b03611d7157506004611d75565b5060055b6020808301515f90815260078801909152604081205581816005811115611d9e57611d9e6144e2565b90816005811115611db157611db16144e2565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611de557611de56144e2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611eb057611eb06144e2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546109a6906001600160a01b03168284613076565b60408051606080820183525f8083526020830181905292820152905f80516020614e0b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f90573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fb791908101906148d8565b915091508061201e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610494565b82548251146120815760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610494565b60208201516001600160a01b0316156120f45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610494565b509392505050565b5f805f83516036146121205760405162461bcd60e51b815260040161049490614a1f565b5f805b600281101561216f576121378160016149e5565b612142906008614721565b61ffff16868281518110612158576121586149f8565b016020015160f81c901b9190911790600101612123565b5061ffff8116156121925760405162461bcd60e51b815260040161049490614a68565b5f805b60048110156121ed576121a98160036149e5565b6121b4906008614721565b63ffffffff16876121c6836002614a0c565b815181106121d6576121d66149f8565b016020015160f81c901b9190911790600101612195565b5063ffffffff81166003146122145760405162461bcd60e51b815260040161049490614aab565b5f805b60208110156122695761222b81601f6149e5565b612236906008614721565b88612242836006614a0c565b81518110612252576122526149f8565b016020015160f81c901b9190911790600101612217565b505f805b60088110156122c8576122818160076149e5565b61228c906008614721565b6001600160401b0316896122a1836026614a0c565b815181106122b1576122b16149f8565b016020015160f81c901b919091179060010161226d565b505f805b6008811015612327576122e08160076149e5565b6122eb906008614721565b6001600160401b03168a61230083602e614a0c565b81518110612310576123106149f8565b016020015160f81c901b91909117906001016122cc565b5091989097509095509350505050565b61233f6130d5565b61234882613120565b6109a68161318d565b5f8181525f80516020614e4b83398151915260205260408082208151610100810190925280545f80516020614e0b83398151915293929190829060ff16600581111561239f5761239f6144e2565b60058111156123b0576123b06144e2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612438576124386144e2565b146124945760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610494565b60408101516001600160a01b0316336001600160a01b03161461250e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610494565b61251b8160a00151613241565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561255f5761255f6144e2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61262b846126258161188b565b5f611955565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061265a908590600401614626565b6020604051808303815f875af1158015612676573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061269a9190614658565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126f8612ae4565b5f80516020614dcb8339815191525f6127136101cc856133e2565b90505f61271f87611510565b9050600281516005811115612736576127366144e2565b146127955760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610494565b5f828260a001516127a69190614738565b600485015460608401519192506127c8916001600160401b0390911690614af2565b6001600160401b0316816001600160401b031611156128475760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610494565b612851888261190d565b5f61285b8961188b565b90505f898260405160200161288792919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090506128a885613241565b5f6005600160991b0163ee5b48eb6128c18d8688611955565b6040518263ffffffff1660e01b81526004016128dd9190614626565b6020604051808303815f875af11580156128f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061291d9190614658565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156129a5576129a56144e2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610f8660015f80516020614e2b83398151915255565b5f80516020614e2b833981519152805460011901612b1557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614dcb833981519152906001600160401b0316612b6760408601602087016143f4565b6001600160401b03161015612bd65760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610494565b6003810154612be86020860186614b2c565b61ffff1610158015612c0c5750612710612c056020860186614b2c565b61ffff1611155b612c285760405162461bcd60e51b815260040161049490614b47565b80548310801590612c3d575080600101548311155b612c9b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610494565b5f612ca5846133e2565b90505f612cb182610969565b90505f612cbe8883613418565b5f81815260058601602052604090209091508790612cdc8282614b92565b509098975050505050505050565b60015f80516020614e2b83398151915255565b5f808251602714612d205760405162461bcd60e51b815260040161049490614a1f565b5f805b6002811015612d6f57612d378160016149e5565b612d42906008614721565b61ffff16858281518110612d5857612d586149f8565b016020015160f81c901b9190911790600101612d23565b5061ffff811615612d925760405162461bcd60e51b815260040161049490614a68565b5f805b6004811015612ded57612da98160036149e5565b612db4906008614721565b63ffffffff1686612dc6836002614a0c565b81518110612dd657612dd66149f8565b016020015160f81c901b9190911790600101612d95565b5063ffffffff8116600214612e145760405162461bcd60e51b815260040161049490614aab565b5f805b6020811015612e6957612e2b81601f6149e5565b612e36906008614721565b87612e42836006614a0c565b81518110612e5257612e526149f8565b016020015160f81c901b9190911790600101612e17565b505f86602681518110612e7e57612e7e6149f8565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612ec15760405162461bcd60e51b815260040161049490614a1f565b5f805b6002811015612f1057612ed88160016149e5565b612ee3906008614721565b61ffff16858281518110612ef957612ef96149f8565b016020015160f81c901b9190911790600101612ec4565b5061ffff811615612f335760405162461bcd60e51b815260040161049490614a68565b5f805b6004811015612f8e57612f4a8160036149e5565b612f55906008614721565b63ffffffff1686612f67836002614a0c565b81518110612f7757612f776149f8565b016020015160f81c901b9190911790600101612f36565b5063ffffffff8116600414612fb55760405162461bcd60e51b815260040161049490614aab565b5f805b602081101561300a57612fcc81601f6149e5565b612fd7906008614721565b87612fe3836006614a0c565b81518110612ff357612ff36149f8565b016020015160f81c901b9190911790600101612fb8565b505f805b6008811015613069576130228160076149e5565b61302d906008614721565b6001600160401b031688613042836026614a0c565b81518110613052576130526149f8565b016020015160f81c901b919091179060010161300e565b5090969095509350505050565b6040516001600160a01b0383811660248301526044820183905261150b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506138e2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661311e57604051631afcd79f60e31b815260040160405180910390fd5b565b6131286130d5565b61313181613943565b61318a6060820135608083013561314e60c0850160a086016143f4565b61315e60e0860160c08701614b2c565b61ffff16613173610100870160e08801614be8565b61318561012088016101008901614c08565b613964565b50565b6131956130d5565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166132215760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610494565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614e0b8339815191529060ff165f0361327f575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906132c790836149e5565b106132e3576001600160401b0384166040830152808252613302565b83826040018181516132f59190614738565b6001600160401b03169052505b5f8260200151836040015160646133199190614af2565b6133239190614c23565b600285015490915060ff908116908216111561339e5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610494565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610979827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613ba8565b5f5f80516020614e0b8339815191524261343860408601602087016143f4565b6001600160401b0316118015613471575061345960408501602086016143f4565b6001600160401b031661346f426202a300614a0c565b115b6134d35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610494565b833561352b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610494565b83355f9081526007820160205260409020541561359b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610494565b6135a86040850185614c48565b905060301461360f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610494565b61361883613241565b5f806136b26040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061365d91906143f4565b6001600160401b0316815260200161367860408a018a614c48565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613d0a565b5f828152600586016020526040902091935091506136d08282614cd5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906136fd908590600401614626565b6020604051808303815f875af1158015613719573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061373d9190614658565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156137bf576137bf6144e2565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916138b491908e01908e016143f4565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6138f66001600160a01b038416836140af565b905080515f1415801561391a5750808060200190518101906139189190614d94565b155b1561150b57604051635274afe760e01b81526001600160a01b0384166004820152602401610494565b61394b6130d5565b6139536140bc565b61395b6140cc565b61318a816140d4565b61396c6130d5565b5f80516020614dcb833981519152836139d85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610494565b6127108411156139fa5760405162461bcd60e51b815260040161049490614b47565b85871115613a625760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610494565b5f8360ff1611613acf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610494565b600a60ff84161115613b415760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610494565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613bee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c129190614658565b9050613c296001600160a01b038516333086614140565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613c6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c919190614658565b9050818111613cf75760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610494565b613d0182826149e5565b95945050505050565b5f6060826080015151603014613d745760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610494565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613deb57613dab8160016149e5565b613db6906008614721565b5081515f90839083908110613dcd57613dcd6149f8565b60200101906001600160f81b03191690815f1a905350600101613d97565b505f5b6004811015613e4957613e028160036149e5565b613e0d906008614721565b505f82613e1b836002614a0c565b81518110613e2b57613e2b6149f8565b60200101906001600160f81b03191690815f1a905350600101613dee565b505f5b6020811015613ea65784518160208110613e6857613e686149f8565b1a60f81b82613e78836006614a0c565b81518110613e8857613e886149f8565b60200101906001600160f81b03191690815f1a905350600101613e4c565b505f5b6020811015613f065784602001518160208110613ec857613ec86149f8565b1a60f81b82613ed8836026614a0c565b81518110613ee857613ee86149f8565b60200101906001600160f81b03191690815f1a905350600101613ea9565b505f5b6008811015613f7a57613f1d8160076149e5565b613f28906008614721565b60ff1685604001516001600160401b0316901c60f81b82826046613f4c9190614a0c565b81518110613f5c57613f5c6149f8565b60200101906001600160f81b03191690815f1a905350600101613f09565b505f5b6030811015613fe55784608001518181518110613f9c57613f9c6149f8565b01602001516001600160f81b03191682613fb783604e614a0c565b81518110613fc757613fc76149f8565b60200101906001600160f81b03191690815f1a905350600101613f7d565b505f5b600881101561405757613ffc8160076149e5565b614007906008614721565b60608601516001600160401b0390811691161c60f81b8261402983607e614a0c565b81518110614039576140396149f8565b60200101906001600160f81b03191690815f1a905350600101613fe8565b506002816040516140689190614daf565b602060405180830381855afa158015614083573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906140a69190614658565b94909350915050565b6060610f8683835f614179565b6140c46130d5565b61311e614208565b61311e6130d5565b6140dc6130d5565b80355f80516020614e0b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556141266060830160408401614be8565b600291909101805460ff191660ff90921691909117905550565b6040516001600160a01b0384811660248301528381166044830152606482018390526109639186918216906323b872dd906084016130a3565b60608147101561419e5760405163cd78605960e01b8152306004820152602401610494565b5f80856001600160a01b031684866040516141b99190614daf565b5f6040518083038185875af1925050503d805f81146141f3576040519150601f19603f3d011682016040523d82523d5f602084013e6141f8565b606091505b5091509150611881868383614210565b612cea6130d5565b606082614225576142208261426c565b610f86565b815115801561423c57506001600160a01b0384163b155b1561426557604051639996b31560e01b81526001600160a01b0385166004820152602401610494565b5080610f86565b80511561427c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546142a190614758565b5f825580601f106142b0575050565b601f0160209004905f5260205f209081019061318a9190614310565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614324575f8155600101614311565b5090565b801515811461318a575f80fd5b803563ffffffff81168114614348575f80fd5b919050565b5f805f6060848603121561435f575f80fd5b83359250602084013561437181614328565b915061437f60408501614335565b90509250925092565b5f60208284031215614398575f80fd5b5035919050565b5f602082840312156143af575f80fd5b610f8682614335565b5f80604083850312156143c9575f80fd5b6143d283614335565b946020939093013593505050565b6001600160401b038116811461318a575f80fd5b5f60208284031215614404575f80fd5b8135610f86816143e0565b6001600160a01b038116811461318a575f80fd5b5f80828403610140811215614436575f80fd5b61012080821215614445575f80fd5b84935083013590506144568161440f565b809150509250929050565b5f8060408385031215614472575f80fd5b50508035926020909101359150565b5f805f8385036080811215614494575f80fd5b84356001600160401b038111156144a9575f80fd5b8501606081880312156144ba575f80fd5b93506040601f19820112156144cd575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061451a57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161454260408401826001600160a01b03169052565b50606083015161455d60608401826001600160401b03169052565b50608083015161457860808401826001600160401b03169052565b5060a083015161459360a08401826001600160401b03169052565b5060c08301516145ae60c08401826001600160401b03169052565b5060e08301516145c960e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156145c9576145c96145d0565b5f5b8381101561461e578181015183820152602001614606565b50505f910152565b602081525f8251806020840152614644816040850160208701614604565b601f01601f19169190910160400192915050565b5f60208284031215614668575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826146915761469161466f565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610979576109796145d0565b6001600160401b038181168382160190808211156145c9576145c96145d0565b600181811c9082168061476c57607f821691505b60208210810361478a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546147e981614758565b806020870152604060018084165f811461480a576001811461482657614853565b60ff19851660408a0152604084151560051b8a01019550614853565b895f5260205f205f5b8581101561484a5781548b820186015290830190880161482f565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561489757614897614861565b60405290565b604051601f8201601f191681016001600160401b03811182821017156148c5576148c5614861565b604052919050565b805161434881614328565b5f80604083850312156148e9575f80fd5b82516001600160401b03808211156148ff575f80fd5b9084019060608287031215614912575f80fd5b61491a614875565b8251815260208084015161492d8161440f565b82820152604084015183811115614942575f80fd5b80850194505087601f850112614956575f80fd5b83518381111561496857614968614861565b61497a601f8201601f1916830161489d565b9350808452888282870101111561498f575f80fd5b61499e81838601848801614604565b508260408301528195506149b38188016148cd565b9450505050509250929050565b5f6001600160401b038083168181036149db576149db6145d0565b6001019392505050565b81810381811115610979576109796145d0565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610979576109796145d0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614b1557614b156145d0565b505092915050565b61ffff8116811461318a575f80fd5b5f60208284031215614b3c575f80fd5b8135610f8681614b1d565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614b9d81614b1d565b61ffff8116905081548161ffff1982161783556020840135614bbe816143e0565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614bf8575f80fd5b813560ff81168114610f86575f80fd5b5f60208284031215614c18575f80fd5b8135610f868161440f565b5f6001600160401b0380841680614c3c57614c3c61466f565b92169190910492915050565b5f808335601e19843603018112614c5d575f80fd5b8301803591506001600160401b03821115614c76575f80fd5b602001915036819003821315614c8a575f80fd5b9250929050565b601f82111561150b57805f5260205f20601f840160051c81016020851015614cb65750805b601f840160051c820191505b81811015610d64575f8155600101614cc2565b81516001600160401b03811115614cee57614cee614861565b614d0281614cfc8454614758565b84614c91565b602080601f831160018114614d35575f8415614d1e5750858301515b5f19600386901b1c1916600185901b178555614d8c565b5f85815260208120601f198616915b82811015614d6357888601518255948401946001909101908401614d44565b5085821015614d8057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614da4575f80fd5b8151610f8681614328565b5f8251614dc0818460208701614604565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615aa3380380615aa383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159568061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c806366435abf116100b4578063a3a65e4811610079578063a3a65e48146102bb578063b771b3bc146102ce578063ba3a4b97146102f4578063bee0a03f14610307578063d5f20ff61461031a578063eb0acb891461033a575f80fd5b806366435abf1461025c5780636f5f1c941461026f57806376f786211461028257806398f3e2b4146102955780639e1bc4ef146102a8575f80fd5b806335455ded116100fa57806335455ded146101f4578063467ef06f146102105780635297fae614610223578063561404fd146102365780636206585614610249575f80fd5b80630118acc4146101365780630322ed981461014b5780630cdd09851461015e578063151d30d1146101af5780632e2194d8146101c9575b5f80fd5b610149610144366004614bd5565b61034d565b005b610149610159366004614c10565b6107b7565b61019c61016c366004614c10565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101b7600a81565b60405160ff90911681526020016101a6565b6101dc6101d7366004614c10565b610970565b6040516001600160401b0390911681526020016101a6565b6101fd61271081565b60405161ffff90911681526020016101a6565b61014961021e366004614c27565b610986565b610149610231366004614c40565b6109d9565b610149610244366004614c68565b610bae565b61019c610257366004614ccc565b6112b4565b6101dc61026a366004614c10565b6112cd565b61014961027d366004614cf9565b6112e1565b610149610290366004614bd5565b6113c5565b6101496102a3366004614c40565b6114a6565b61019c6102b6366004614d37565b6116d3565b6101496102c9366004614c27565b6116ff565b6102dc6005600160991b0181565b6040516001600160a01b0390911681526020016101a6565b610149610302366004614c10565b6118b7565b610149610315366004614c10565b611b3d565b61032d610328366004614c10565b611c51565b6040516101a69190614d6b565b61019c610348366004614e32565b611d44565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061588a83398151915291841561039f5761039c8285611d79565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103d1576103d1614d57565b60048111156103e2576103e2614d57565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561046957610469614d57565b146104bb5760405162461bcd60e51b815260206004820152602a60248201525f805160206158aa8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105205760405162461bcd60e51b815260206004820152603360248201525f805160206158aa8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104b2565b5f61052a84612015565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561057757610577614d57565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61064985611c51565b905082606001516001600160401b031681608001516001600160401b0316116106c05760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104b2565b5f836060015182608001516106d59190614eab565b90506106e186826120a5565b5f6005600160991b0163ee5b48eb6106fa8987866120ed565b6040518263ffffffff1660e01b81526004016107169190614eed565b6020604051808303815f875af1158015610732573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107569190614f1f565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061592a8339815191526020526040808220815160e0810190925280545f805160206158ca83398151915293929190829060ff16600581111561080457610804614d57565b600581111561081557610815614d57565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561088457610884614d57565b146108e95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb61090e8584606001515f6120ed565b6040518263ffffffff1660e01b815260040161092a9190614eed565b6020604051808303815f875af1158015610946573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096a9190614f1f565b50505050565b5f61098064e8d4a5100083614f4a565b92915050565b5f8051602061588a8339815191525f8061099f8461230c565b6040808201515f84815260058801602052919091205492945090925061096a916001600160401b03909116906001600160a01b0316612671565b5f8051602061588a8339815191525f6109f1846126a7565b90505f80610a028360400151612888565b50915091505f610a1183611c51565b9050816001600160401b031681606001516001600160401b03161015610a495760405162461bcd60e51b81526004016104b290614f5d565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a8e5760405162461bcd60e51b81526004016104b290614f9f565b60015f87815260068701602052604090205460ff166004811115610ab457610ab4614d57565b14610b1d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206158ca8339815191529060ff1615610c4b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104b2565b5f610c55836126a7565b90505f610c658260400151612ac3565b90505f85356020870135610c7c6040890189614fe8565b604051602001610c8f9493929190615031565b60408051601f1981840301815291905280519091505f5b81811015610d22575f610cbc60608a018a615051565b83818110610ccc57610ccc615096565b9050602002810190610cde91906150aa565b610ce79061515a565b80516020808301516040808501519051949550610d0794899493016151f1565b60408051601f19818403018152919052935050600101610ca6565b5082600283604051610d349190615240565b602060405180830381855afa158015610d4f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d729190614f1f565b14610dd65760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3d9190614f1f565b876020013514610e9f5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104b2565b610eac6040880188614fe8565b9050601414610f105760405162461bcd60e51b815260206004820152603a60248201525f805160206158ea83398151915260448201527f746f72206d616e616765722061646472657373206c656e67746800000000000060648201526084016104b2565b30610f1e6040890189614fe8565b610f2791615251565b60601c14610f805760405162461bcd60e51b815260206004820152603360248201525f805160206158ea833981519152604482015272746f72206d616e61676572206164647265737360681b60648201526084016104b2565b5f610f8e6060890189615051565b905011610fed5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104b2565b5f5b8181101561129b575f61100560608a018a615051565b8381811061101557611015615096565b905060200281019061102791906150aa565b6110309061515a565b604080518b3560208201529081018490529091505f9060029060600160408051601f198184030181529082905261106691615240565b602060405180830381855afa158015611081573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110a49190614f1f565b8251909150806110c65760405162461bcd60e51b81526004016104b290615286565b5f81815260078a016020526040902054156110f35760405162461bcd60e51b81526004016104b2906152c7565b8260400151516030146111185760405162461bcd60e51b81526004016104b29061530f565b5f81815260078a0160209081526040808320859055805160e081018252600180825287518285015287840180516001600160401b039081168486015260608401879052905116608083015260a0820185905260c0820185905286855260068e0190935292208251815491929091839160ff19909116908360058111156111a0576111a0614d57565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905561124a82612015565b5082516020808501516040516001600160401b03909116815284917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101610fef565b5050506008909201805460ff1916600117905550505050565b5f6109806001600160401b03831664e8d4a5100061535c565b5f6112d782611c51565b6080015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061132a575080546001600160401b03808416911610155b156113485760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556113738484612c37565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f8051602061588a8339815191525f6113dd85611c51565b5f86815260058401602052604090205460a082015191925061141091600160b01b9091046001600160401b031690615373565b6001600160401b03164210156114845760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104b2565b8315611496576114948584611d79565b505b61149f85612c51565b5050505050565b6114ae612f47565b5f8051602061588a8339815191525f6114c6846126a7565b90505f806114d78360400151612888565b50915091505f6114e683611c51565b9050816001600160401b031681606001516001600160401b0316101561151e5760405162461bcd60e51b81526004016104b290614f5d565b5f8681526006860160205260409020600301546001600160401b038084169116111561155c5760405162461bcd60e51b81526004016104b290614f9f565b60035f87815260068701602052604090205460ff16600481111561158257611582614d57565b146115d65760405162461bcd60e51b815260206004820152603160248201525f805160206158aa8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261167b91612671565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506116cf60015f8051602061590a83398151915255565b5050565b5f6116dc612f47565b6116e7833384612f91565b905061098060015f8051602061590a83398151915255565b5f805160206158ca8339815191525f611717836126a7565b90505f806117288360400151613401565b915091508061178a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104b2565b5f828152600585016020526040812080546117a490615393565b90501180156117d6575060015f83815260068601602052604090205460ff1660058111156117d4576117d4614d57565b145b6117f25760405162461bcd60e51b81526004016104b2906153cb565b5f828152600585016020526040812061180a91614b66565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061588a83398151915293929190829060ff16600481111561191857611918614d57565b600481111561192957611929614d57565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119b0576119b0614d57565b14806119ce57506003815160048111156119cc576119cc614d57565b145b611a225760405162461bcd60e51b815260206004820152603260248201525f805160206158aa833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104b2565b5f611a308260400151611c51565b905080606001516001600160401b03165f03611ab45760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb611ae18460400151846060015185608001516120ed565b6040518263ffffffff1660e01b8152600401611afd9190614eed565b6020604051808303815f875af1158015611b19573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149f9190614f1f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206158ca833981519152929190611b8590615393565b9050118015611bb7575060015f83815260068301602052604090205460ff166005811115611bb557611bb5614d57565b145b611bd35760405162461bcd60e51b81526004016104b2906153cb565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c0c91906004016153ff565b6020604051808303815f875af1158015611c28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4c9190614f1f565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061592a83398151915290528390208351918201909352825491925f805160206158ca83398151915292829060ff166005811115611cd157611cd1614d57565b6005811115611ce257611ce2614d57565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611d4d612f47565b611d59858585856135a2565b9050611d7160015f8051602061590a83398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611dc4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611deb9190810190615494565b9150915080611e4e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eb59190614f1f565b825114611f195760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104b2565b60208201516001600160a01b031615611f8f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104b2565b5f80611f9e84604001516137c0565b9150915081871461200b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104b2565b9695505050505050565b5f8181525f8051602061592a8339815191526020526040812060020180545f805160206158ca83398151915291600160401b9091046001600160401b031690600861205f83615566565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f8051602061592a833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156121665761212681600161558b565b61213190600861535c565b5081515f9083908390811061214857612148615096565b60200101906001600160f81b03191690815f1a905350600101612112565b505f5b60048110156121c95761217d81600361558b565b61218890600861535c565b6001901c60f81b8261219b83600261559e565b815181106121ab576121ab615096565b60200101906001600160f81b03191690815f1a905350600101612169565b505f5b602081101561222b576121e081601f61558b565b6121eb90600861535c565b86901c60f81b826121fd83600661559e565b8151811061220d5761220d615096565b60200101906001600160f81b03191690815f1a9053506001016121cc565b505f5b60088110156122965761224281600761558b565b61224d90600861535c565b6001600160401b038616901c60f81b8261226883602661559e565b8151811061227857612278615096565b60200101906001600160f81b03191690815f1a90535060010161222e565b505f5b6008811015612301576122ad81600761558b565b6122b890600861535c565b6001600160401b038516901c60f81b826122d383602e61559e565b815181106122e3576122e3615096565b60200101906001600160f81b03191690815f1a905350600101612299565b5090505b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158ca8339815191525f61235b856126a7565b90505f8061236c8360400151613401565b9150915080156123d15760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104b2565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561240257612402614d57565b600581111561241357612413614d57565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561248457612484614d57565b14806124a257506001825160058111156124a0576124a0614d57565b145b6124ee5760405162461bcd60e51b815260206004820152602a60248201525f805160206158ea833981519152604482015269746f722073746174757360b01b60648201526084016104b2565b60038251600581111561250357612503614d57565b0361251057506004612514565b5060055b6020808301515f9081526007880190915260408120558181600581111561253d5761253d614d57565b9081600581111561255057612550614d57565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561258457612584614d57565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561263857612638614d57565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546116cf906001600160a01b03168284613998565b60408051606080820183525f8083526020830181905292820152905f805160206158ca8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561271c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127439190810190615494565b91509150806127aa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104b2565b825482511461280d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104b2565b60208201516001600160a01b0316156128805760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104b2565b509392505050565b5f805f83516036146128ac5760405162461bcd60e51b81526004016104b2906155b1565b5f805b60028110156128fb576128c381600161558b565b6128ce90600861535c565b61ffff168682815181106128e4576128e4615096565b016020015160f81c901b91909117906001016128af565b5061ffff81161561291e5760405162461bcd60e51b81526004016104b2906155fa565b5f805b60048110156129795761293581600361558b565b61294090600861535c565b63ffffffff168761295283600261559e565b8151811061296257612962615096565b016020015160f81c901b9190911790600101612921565b5063ffffffff81166003146129a05760405162461bcd60e51b81526004016104b29061563d565b5f805b60208110156129f5576129b781601f61558b565b6129c290600861535c565b886129ce83600661559e565b815181106129de576129de615096565b016020015160f81c901b91909117906001016129a3565b505f805b6008811015612a5457612a0d81600761558b565b612a1890600861535c565b6001600160401b031689612a2d83602661559e565b81518110612a3d57612a3d615096565b016020015160f81c901b91909117906001016129f9565b505f805b6008811015612ab357612a6c81600761558b565b612a7790600861535c565b6001600160401b03168a612a8c83602e61559e565b81518110612a9c57612a9c615096565b016020015160f81c901b9190911790600101612a58565b5091989097509095509350505050565b5f8151602614612ae55760405162461bcd60e51b81526004016104b2906155b1565b5f805b6002811015612b3457612afc81600161558b565b612b0790600861535c565b61ffff16848281518110612b1d57612b1d615096565b016020015160f81c901b9190911790600101612ae8565b5061ffff811615612b575760405162461bcd60e51b81526004016104b2906155fa565b5f805b6004811015612bb257612b6e81600361558b565b612b7990600861535c565b63ffffffff1685612b8b83600261559e565b81518110612b9b57612b9b615096565b016020015160f81c901b9190911790600101612b5a565b5063ffffffff8116600514612bd95760405162461bcd60e51b81526004016104b29061563d565b5f805b6020811015612c2e57612bf081601f61558b565b612bfb90600861535c565b86612c0783600661559e565b81518110612c1757612c17615096565b016020015160f81c901b9190911790600101612bdc565b50949350505050565b612c3f6139f7565b612c4882613a42565b6116cf81613ab7565b5f8181525f8051602061592a8339815191526020526040808220815160e0810190925280545f805160206158ca83398151915293929190829060ff166005811115612c9e57612c9e614d57565b6005811115612caf57612caf614d57565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612d2157612d21614d57565b14612d7d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104b2565b612d8a8160800151613b6b565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115612dce57612dce614d57565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612e8384612e7d81612015565b5f6120ed565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612eb2908590600401614eed565b6020604051808303815f875af1158015612ece573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ef29190614f1f565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8051602061590a833981519152805460011901612f7857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061590a83398151915255565b5f5f8051602061588a83398151915281612fad6101d785613d0c565b90505f612fb987611c51565b9050600281516005811115612fd057612fd0614d57565b1461302f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104b2565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166130c25760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104b2565b5f8282608001516130d39190615373565b600485015460408401519192506130f5916001600160401b0390911690615684565b6001600160401b0316816001600160401b031611156131745760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104b2565b61317e88826120a5565b5f61318889612015565b90505f89826040516020016131b492919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090506131d585613b6b565b5f6005600160991b0163ee5b48eb6131ee8d86886120ed565b6040518263ffffffff1660e01b815260040161320a9190614eed565b6020604051808303815f875af1158015613226573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061324a9190614f1f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156132d2576132d2614d57565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134245760405162461bcd60e51b81526004016104b2906155b1565b5f805b60028110156134735761343b81600161558b565b61344690600861535c565b61ffff1685828151811061345c5761345c615096565b016020015160f81c901b9190911790600101613427565b5061ffff8116156134965760405162461bcd60e51b81526004016104b2906155fa565b5f805b60048110156134f1576134ad81600361558b565b6134b890600861535c565b63ffffffff16866134ca83600261559e565b815181106134da576134da615096565b016020015160f81c901b9190911790600101613499565b5063ffffffff81166002146135185760405162461bcd60e51b81526004016104b29061563d565b5f805b602081101561356d5761352f81601f61558b565b61353a90600861535c565b8761354683600661559e565b8151811061355657613556615096565b016020015160f81c901b919091179060010161351b565b505f8660268151811061358257613582615096565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061588a8339815191529061ffff8616108015906135ee575061271061ffff861611155b61360a5760405162461bcd60e51b81526004016104b2906156a7565b60028101546001600160401b0390811690851610156136835760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104b2565b80548310801590613698575080600101548311155b6136f65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104b2565b5f61370084613d0c565b90505f61370c82610970565b90505f6137198983613d42565b9050604051806060016040528061372d3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146137e35760405162461bcd60e51b81526004016104b2906155b1565b5f805b6002811015613832576137fa81600161558b565b61380590600861535c565b61ffff1685828151811061381b5761381b615096565b016020015160f81c901b91909117906001016137e6565b5061ffff8116156138555760405162461bcd60e51b81526004016104b2906155fa565b5f805b60048110156138b05761386c81600361558b565b61387790600861535c565b63ffffffff168661388983600261559e565b8151811061389957613899615096565b016020015160f81c901b9190911790600101613858565b5063ffffffff81166004146138d75760405162461bcd60e51b81526004016104b29061563d565b5f805b602081101561392c576138ee81601f61558b565b6138f990600861535c565b8761390583600661559e565b8151811061391557613915615096565b016020015160f81c901b91909117906001016138da565b505f805b600881101561398b5761394481600761558b565b61394f90600861535c565b6001600160401b03168861396483602661559e565b8151811061397457613974615096565b016020015160f81c901b9190911790600101613930565b5090969095509350505050565b6040516001600160a01b03838116602483015260448201839052611c4c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506141b6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a4057604051631afcd79f60e31b815260040160405180910390fd5b565b613a4a6139f7565b613a5381614217565b613a5b614230565b613ab460608201356080830135613a7860c0850160a08601614ccc565b613a8860e0860160c087016156f2565b61ffff16613a9d610100870160e0880161570b565b613aaf6101208801610100890161572b565b614240565b50565b613abf6139f7565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613b4b5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104b2565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206158ca8339815191529060ff165f03613ba9575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613bf1908361558b565b10613c0d576001600160401b0384166040830152808252613c2c565b8382604001818151613c1f9190615373565b6001600160401b03169052505b5f826020015183604001516064613c439190615684565b613c4d9190615746565b600285015490915060ff9081169082161115613cc85760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104b2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610980827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690614484565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613dcd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104b2565b5f805160206158ca83398151915242613dec6040860160208701614ccc565b6001600160401b0316118015613e255750613e0d6040850160208601614ccc565b6001600160401b0316613e23426202a30061559e565b115b613e875760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104b2565b8335613ea55760405162461bcd60e51b81526004016104b290615286565b83355f90815260078201602052604090205415613ed45760405162461bcd60e51b81526004016104b2906152c7565b613ee16040850185614fe8565b9050603014613f025760405162461bcd60e51b81526004016104b29061530f565b613f0b83613b6b565b5f80613fa56040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f509190614ccc565b6001600160401b03168152602001613f6b60408a018a614fe8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506145e6565b5f82815260058601602052604090209193509150613fc382826157af565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613ff0908590600401614eed565b6020604051808303815f875af115801561400c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140309190614f1f565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff191660018360058111156140a8576140a8614d57565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614188918e01908e01614ccc565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6141ca6001600160a01b0384168361498b565b905080515f141580156141ee5750808060200190518101906141ec919061586e565b155b15611c4c57604051635274afe760e01b81526001600160a01b03841660048201526024016104b2565b61421f6139f7565b614227614998565b613ab4816149a0565b6142386139f7565b613a40614a16565b6142486139f7565b5f8051602061588a833981519152836142b45760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104b2565b6127108411156142d65760405162461bcd60e51b81526004016104b2906156a7565b8587111561433e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104b2565b5f8360ff16116143ab5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104b2565b600a60ff8416111561441d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104b2565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156144ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144ee9190614f1f565b90506145056001600160a01b038516333086614a1e565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061456d9190614f1f565b90508181116145d35760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104b2565b6145dd828261558b565b95945050505050565b5f60608260800151516030146146505760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104b2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156146c75761468781600161558b565b61469290600861535c565b5081515f908390839081106146a9576146a9615096565b60200101906001600160f81b03191690815f1a905350600101614673565b505f5b6004811015614725576146de81600361558b565b6146e990600861535c565b505f826146f783600261559e565b8151811061470757614707615096565b60200101906001600160f81b03191690815f1a9053506001016146ca565b505f5b6020811015614782578451816020811061474457614744615096565b1a60f81b8261475483600661559e565b8151811061476457614764615096565b60200101906001600160f81b03191690815f1a905350600101614728565b505f5b60208110156147e257846020015181602081106147a4576147a4615096565b1a60f81b826147b483602661559e565b815181106147c4576147c4615096565b60200101906001600160f81b03191690815f1a905350600101614785565b505f5b6008811015614856576147f981600761558b565b61480490600861535c565b60ff1685604001516001600160401b0316901c60f81b82826046614828919061559e565b8151811061483857614838615096565b60200101906001600160f81b03191690815f1a9053506001016147e5565b505f5b60308110156148c1578460800151818151811061487857614878615096565b01602001516001600160f81b0319168261489383604e61559e565b815181106148a3576148a3615096565b60200101906001600160f81b03191690815f1a905350600101614859565b505f5b6008811015614933576148d881600761558b565b6148e390600861535c565b60608601516001600160401b0390811691161c60f81b8261490583607e61559e565b8151811061491557614915615096565b60200101906001600160f81b03191690815f1a9053506001016148c4565b506002816040516149449190615240565b602060405180830381855afa15801561495f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906149829190614f1f565b94909350915050565b606061230583835f614a57565b613a406139f7565b6149a86139f7565b80355f805160206158ca83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556149f2606083016040840161570b565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612f7e6139f7565b6040516001600160a01b03848116602483015283811660448301526064820183905261096a9186918216906323b872dd906084016139c5565b606081471015614a7c5760405163cd78605960e01b81523060048201526024016104b2565b5f80856001600160a01b03168486604051614a979190615240565b5f6040518083038185875af1925050503d805f8114614ad1576040519150601f19603f3d011682016040523d82523d5f602084013e614ad6565b606091505b509150915061200b868383606082614af657614af182614b3d565b612305565b8151158015614b0d57506001600160a01b0384163b155b15614b3657604051639996b31560e01b81526001600160a01b03851660048201526024016104b2565b5080612305565b805115614b4d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614b7290615393565b5f825580601f10614b81575050565b601f0160209004905f5260205f2090810190613ab491905b80821115614bac575f8155600101614b99565b5090565b8015158114613ab4575f80fd5b803563ffffffff81168114614bd0575f80fd5b919050565b5f805f60608486031215614be7575f80fd5b833592506020840135614bf981614bb0565b9150614c0760408501614bbd565b90509250925092565b5f60208284031215614c20575f80fd5b5035919050565b5f60208284031215614c37575f80fd5b61230582614bbd565b5f8060408385031215614c51575f80fd5b614c5a83614bbd565b946020939093013593505050565b5f8060408385031215614c79575f80fd5b82356001600160401b03811115614c8e575f80fd5b830160808186031215614c9f575f80fd5b9150614cad60208401614bbd565b90509250929050565b80356001600160401b0381168114614bd0575f80fd5b5f60208284031215614cdc575f80fd5b61230582614cb6565b6001600160a01b0381168114613ab4575f80fd5b5f80828403610140811215614d0c575f80fd5b61012080821215614d1b575f80fd5b8493508301359050614d2c81614ce5565b809150509250929050565b5f8060408385031215614d48575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614d8e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614dc960608401826001600160401b03169052565b506080830151614de460808401826001600160401b03169052565b5060a0830151614dff60a08401826001600160401b03169052565b5060c0830151614e1a60c08401826001600160401b03169052565b5092915050565b803561ffff81168114614bd0575f80fd5b5f805f8060808587031215614e45575f80fd5b84356001600160401b03811115614e5a575f80fd5b850160608188031215614e6b575f80fd5b9350614e7960208601614e21565b9250614e8760408601614cb6565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e1a57614e1a614e97565b5f5b83811015614ee5578181015183820152602001614ecd565b50505f910152565b602081525f8251806020840152614f0b816040850160208701614ecb565b601f01601f19169190910160400192915050565b5f60208284031215614f2f575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614f5857614f58614f36565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f808335601e19843603018112614ffd575f80fd5b8301803591506001600160401b03821115615016575f80fd5b60200191503681900382131561502a575f80fd5b9250929050565b848152836020820152818360408301375f91016040019081529392505050565b5f808335601e19843603018112615066575f80fd5b8301803591506001600160401b0382111561507f575f80fd5b6020019150600581901b360382131561502a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150be575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150fe576150fe6150c8565b60405290565b604051601f8201601f191681016001600160401b038111828210171561512c5761512c6150c8565b604052919050565b5f6001600160401b0382111561514c5761514c6150c8565b50601f01601f191660200190565b5f6060823603121561516a575f80fd5b6151726150dc565b823581526020615183818501614cb6565b8183015260408401356001600160401b0381111561519f575f80fd5b840136601f8201126151af575f80fd5b80356151c26151bd82615134565b615104565b81815236848385010111156151d5575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551615202818460208a01614ecb565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615232816028840160208801614ecb565b016028019695505050505050565b5f82516150be818460208701614ecb565b6bffffffffffffffffffffffff19813581811691601485101561527e5780818660140360031b1b83161692505b505092915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b808202811582820484141761098057610980614e97565b6001600160401b03818116838216019080821115614e1a57614e1a614e97565b600181811c908216806153a757607f821691505b6020821081036153c557634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201525f805160206158ea8339815191526040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461541181615393565b806020870152604060018084165f8114615432576001811461544e5761547b565b60ff19851660408a0152604084151560051b8a0101955061547b565b895f5260205f205f5b858110156154725781548b8201860152908301908801615457565b8a016040019650505b509398975050505050505050565b8051614bd081614bb0565b5f80604083850312156154a5575f80fd5b82516001600160401b03808211156154bb575f80fd5b90840190606082870312156154ce575f80fd5b6154d66150dc565b825181526020808401516154e981614ce5565b828201526040840151838111156154fe575f80fd5b80850194505087601f850112615512575f80fd5b835192506155226151bd84615134565b8381528882858701011115615535575f80fd5b61554484838301848801614ecb565b80604084015250819550615559818801615489565b9450505050509250929050565b5f6001600160401b0380831681810361558157615581614e97565b6001019392505050565b8181038181111561098057610980614e97565b8082018082111561098057610980614e97565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461527e5761527e614e97565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f60208284031215615702575f80fd5b61230582614e21565b5f6020828403121561571b575f80fd5b813560ff81168114612305575f80fd5b5f6020828403121561573b575f80fd5b813561230581614ce5565b5f6001600160401b038084168061575f5761575f614f36565b92169190910492915050565b601f821115611c4c57805f5260205f20601f840160051c810160208510156157905750805b601f840160051c820191505b8181101561149f575f815560010161579c565b81516001600160401b038111156157c8576157c86150c8565b6157dc816157d68454615393565b8461576b565b602080601f83116001811461580f575f84156157f85750858301515b5f19600386901b1c1916600185901b178555615866565b5f85815260208120601f198616915b8281101561583d5788860151825594840194600190910190840161581e565b508582101561585a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561587e575f80fd5b815161230581614bb056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0056616c696461746f724d616e616765723a20696e76616c69642076616c6964619b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -371,7 +379,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) ActiveVa // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { var out []interface{} err := _ERC20TokenStakingManager.contract.Call(opts, &out, "getValidator", validationID) @@ -388,14 +396,14 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetValidator(op // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) GetValidator(validationID [32]byte) (Validator, error) { return _ERC20TokenStakingManager.Contract.GetValidator(&_ERC20TokenStakingManager.CallOpts, validationID) } // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { return _ERC20TokenStakingManager.Contract.GetValidator(&_ERC20TokenStakingManager.CallOpts, validationID) } @@ -661,25 +669,46 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init return _ERC20TokenStakingManager.Contract.InitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xa13fd29d. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements, uint256 stakeAmount) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements, stakeAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, requirements, stakeAmount) +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xa13fd29d. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements, uint256 stakeAmount) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements, stakeAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, requirements, stakeAmount) +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorSet(&_ERC20TokenStakingManager.TransactOpts, subnetConversionData, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xa13fd29d. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements, uint256 stakeAmount) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements, stakeAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, requirements, stakeAmount) +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorSet(&_ERC20TokenStakingManager.TransactOpts, subnetConversionData, messageIndex) } // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. @@ -1401,6 +1430,160 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegato return event, nil } +// ERC20TokenStakingManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerInitialValidatorCreatedIterator struct { + Event *ERC20TokenStakingManagerInitialValidatorCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerInitialValidatorCreated struct { + ValidationID [32]byte + NodeID [32]byte + Weight *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*ERC20TokenStakingManagerInitialValidatorCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerInitialValidatorCreatedIterator{contract: _ERC20TokenStakingManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil +} + +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerInitialValidatorCreated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*ERC20TokenStakingManagerInitialValidatorCreated, error) { + event := new(ERC20TokenStakingManagerInitialValidatorCreated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // ERC20TokenStakingManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerInitializedIterator struct { Event *ERC20TokenStakingManagerInitialized // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 56b263790..8741381dd 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -29,6 +29,13 @@ var ( _ = abi.ConvertType ) +// InitialValidator is an auto generated low-level Go binding around an user-defined struct. +type InitialValidator struct { + NodeID [32]byte + Weight uint64 + BlsPublicKey []byte +} + // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { BaseSettings ValidatorManagerSettings @@ -40,17 +47,18 @@ type PoSValidatorManagerSettings struct { RewardCalculator common.Address } -// PoSValidatorRequirements is an auto generated low-level Go binding around an user-defined struct. -type PoSValidatorRequirements struct { - DelegationFeeBips uint16 - MinStakeDuration uint64 +// SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. +type SubnetConversionData struct { + ConvertSubnetTxID [32]byte + BlockchainID [32]byte + ValidatorManagerAddress []byte + InitialValidators []InitialValidator } // Validator is an auto generated low-level Go binding around an user-defined struct. type Validator struct { Status uint8 NodeID [32]byte - Owner common.Address StartingWeight uint64 MessageNonce uint64 Weight uint64 @@ -74,8 +82,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614c0c380380614c0c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614abf8061014d5f395ff3fe60806040526004361061011b575f3560e01c806376f786211161009d578063ba3a4b9711610062578063ba3a4b971461035f578063bee0a03f1461037e578063c123c6db1461039d578063c599e24f146103bc578063d5f20ff6146103cf575f80fd5b806376f78621146102bd57806380a8ad94146102dc57806398f3e2b4146102ef578063a3a65e481461030e578063b771b3bc1461032d575f80fd5b806335455ded116100e357806335455ded14610219578063467ef06f146102415780635297fae614610260578063620658561461027f57806366435abf1461029e575f80fd5b80630118acc41461011f5780630322ed98146101405780630cdd09851461015f578063151d30d1146101bc5780632e2194d8146101e2575b5f80fd5b34801561012a575f80fd5b5061013e610139366004614005565b6103fb565b005b34801561014b575f80fd5b5061013e61015a366004614040565b610865565b34801561016a575f80fd5b506101a9610179366004614040565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101c7575f80fd5b506101d0600a81565b60405160ff90911681526020016101b3565b3480156101ed575f80fd5b506102016101fc366004614040565b610a35565b6040516001600160401b0390911681526020016101b3565b348015610224575f80fd5b5061022e61271081565b60405161ffff90911681526020016101b3565b34801561024c575f80fd5b5061013e61025b366004614057565b610a4b565b34801561026b575f80fd5b5061013e61027a366004614070565b610a76565b34801561028a575f80fd5b506101a96102993660046140ac565b610c46565b3480156102a9575f80fd5b506102016102b8366004614040565b610c5f565b3480156102c8575f80fd5b5061013e6102d7366004614005565b610c73565b6101a96102ea3660046140c7565b610d53565b3480156102fa575f80fd5b5061013e610309366004614070565b610d7f565b348015610319575f80fd5b5061013e610328366004614057565b610f8e565b348015610338575f80fd5b506103476005600160991b0181565b6040516001600160a01b0390911681526020016101b3565b34801561036a575f80fd5b5061013e610379366004614040565b61114b565b348015610389575f80fd5b5061013e610398366004614040565b6113d1565b3480156103a8575f80fd5b5061013e6103b7366004614120565b6114e5565b6101a96103ca366004614040565b6115c7565b3480156103da575f80fd5b506103ee6103e9366004614040565b6115d3565b6040516101b3919061414b565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614a1383398151915291841561044d5761044a82856116b2565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561047f5761047f614137565b600481111561049057610490614137565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561051757610517614137565b146105695760405162461bcd60e51b815260206004820152602a60248201525f80516020614a338339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105ce5760405162461bcd60e51b815260206004820152603360248201525f80516020614a338339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610560565b5f6105d88461194e565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561062557610625614137565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106f7856115d3565b905082606001516001600160401b03168160a001516001600160401b03161161076e5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610560565b5f83606001518260a001516107839190614239565b905061078f86826119d0565b5f6005600160991b0163ee5b48eb6107a8898786611a18565b6040518263ffffffff1660e01b81526004016107c4919061427b565b6020604051808303815f875af11580156107e0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080491906142ad565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614a9383398151915260205260408082208151610100810190925280545f80516020614a5383398151915293929190829060ff1660058111156108b3576108b3614137565b60058111156108c4576108c4614137565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561094957610949614137565b146109ae5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610560565b6005600160991b016001600160a01b031663ee5b48eb6109d38584608001515f611a18565b6040518263ffffffff1660e01b81526004016109ef919061427b565b6020604051808303815f875af1158015610a0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2f91906142ad565b50505050565b5f610a4564e8d4a51000836142d8565b92915050565b5f610a5582611c37565b9050610a7281606001516001600160401b03168260400151611faa565b5050565b5f80516020614a138339815191525f610a8e84611fbd565b90505f80610a9f836040015161219e565b50915091505f610aae836115d3565b9050816001600160401b031681608001516001600160401b03161015610ae65760405162461bcd60e51b8152600401610560906142eb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b2b5760405162461bcd60e51b81526004016105609061432d565b60015f87815260068701602052604090205460ff166004811115610b5157610b51614137565b14610bba5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610560565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a456001600160401b03831664e8d4a51000614376565b5f610c69826115d3565b60a0015192915050565b5f80516020614a138339815191525f610c8b856115d3565b5f86815260058401602052604090205460c0820151919250610cbd91620100009091046001600160401b03169061438d565b6001600160401b0316421015610d315760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610560565b8315610d4357610d4185846116b2565b505b610d4c856123d9565b5050505050565b5f610d5c612777565b610d678383346127ae565b9050610a4560015f80516020614a7383398151915255565b5f80516020614a138339815191525f610d9784611fbd565b90505f80610da8836040015161219e565b50915091505f610db7836115d3565b9050816001600160401b031681608001516001600160401b03161015610def5760405162461bcd60e51b8152600401610560906142eb565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e2d5760405162461bcd60e51b81526004016105609061432d565b60035f87815260068701602052604090205460ff166004811115610e5357610e53614137565b14610ea75760405162461bcd60e51b815260206004820152603160248201525f80516020614a338339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610560565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f4c91611faa565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614a538339815191525f610fa683611fbd565b90505f80610fb78360400151612985565b91509150806110195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610560565b5f82815260058501602052604081208054611033906143ad565b9050118015611065575060015f83815260068601602052604090205460ff16600581111561106357611063614137565b145b6110815760405162461bcd60e51b8152600401610560906143df565b5f828152600585016020526040812061109991613f4d565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614a1383398151915293929190829060ff1660048111156111ac576111ac614137565b60048111156111bd576111bd614137565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561124457611244614137565b1480611262575060038151600481111561126057611260614137565b145b6112b65760405162461bcd60e51b815260206004820152603260248201525f80516020614a33833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610560565b5f6112c482604001516115d3565b905080608001516001600160401b03165f036113485760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610560565b6005600160991b016001600160a01b031663ee5b48eb611375846040015184608001518560a00151611a18565b6040518263ffffffff1660e01b8152600401611391919061427b565b6020604051808303815f875af11580156113ad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d4c91906142ad565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614a53833981519152929190611419906143ad565b905011801561144b575060015f83815260068301602052604090205460ff16600581111561144957611449614137565b145b6114675760405162461bcd60e51b8152600401610560906143df565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114a09190600401614426565b6020604051808303815f875af11580156114bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e091906142ad565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061152e575080546001600160401b03808416911610155b1561154c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561157683612b26565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a45823334612b3a565b6115db613f84565b5f8281525f80516020614a938339815191526020526040908190208151610100810190925280545f80516020614a53833981519152929190829060ff16600581111561162957611629614137565b600581111561163a5761163a614137565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156116fd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611724919081019061453b565b91509150806117875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610560565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117ee91906142ad565b8251146118525760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610560565b60208201516001600160a01b0316156118c85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610560565b5f806118d78460400151612f2c565b915091508187146119445760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610560565b9695505050505050565b5f8181525f80516020614a938339815191526020526040812060030180545f80516020614a53833981519152916001600160401b03909116908361199183614623565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b5f9182525f80516020614a93833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a9157611a51816001614648565b611a5c906008614376565b5081515f90839083908110611a7357611a7361465b565b60200101906001600160f81b03191690815f1a905350600101611a3d565b505f5b6004811015611af457611aa8816003614648565b611ab3906008614376565b6001901c60f81b82611ac683600261466f565b81518110611ad657611ad661465b565b60200101906001600160f81b03191690815f1a905350600101611a94565b505f5b6020811015611b5657611b0b81601f614648565b611b16906008614376565b86901c60f81b82611b2883600661466f565b81518110611b3857611b3861465b565b60200101906001600160f81b03191690815f1a905350600101611af7565b505f5b6008811015611bc157611b6d816007614648565b611b78906008614376565b6001600160401b038616901c60f81b82611b9383602661466f565b81518110611ba357611ba361465b565b60200101906001600160f81b03191690815f1a905350600101611b59565b505f5b6008811015611c2c57611bd8816007614648565b611be3906008614376565b6001600160401b038516901c60f81b82611bfe83602e61466f565b81518110611c0e57611c0e61465b565b60200101906001600160f81b03191690815f1a905350600101611bc4565b5090505b9392505050565b611c3f613f84565b5f80516020614a538339815191525f611c5784611fbd565b90505f80611c688360400151612985565b915091508015611ccd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610560565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611cff57611cff614137565b6005811115611d1057611d10614137565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d9757611d97614137565b1480611db55750600182516005811115611db357611db3614137565b145b611e145760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610560565b600382516005811115611e2957611e29614137565b03611e3657506004611e3a565b5060055b6020808301515f90815260078801909152604081205581816005811115611e6357611e63614137565b90816005811115611e7657611e76614137565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611eaa57611eaa614137565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f7557611f75614137565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a726001600160a01b03821683613104565b60408051606080820183525f8083526020830181905292820152905f80516020614a538339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612032573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612059919081019061453b565b91509150806120c05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610560565b82548251146121235760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610560565b60208201516001600160a01b0316156121965760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610560565b509392505050565b5f805f83516036146121c25760405162461bcd60e51b815260040161056090614682565b5f805b6002811015612211576121d9816001614648565b6121e4906008614376565b61ffff168682815181106121fa576121fa61465b565b016020015160f81c901b91909117906001016121c5565b5061ffff8116156122345760405162461bcd60e51b8152600401610560906146cb565b5f805b600481101561228f5761224b816003614648565b612256906008614376565b63ffffffff168761226883600261466f565b815181106122785761227861465b565b016020015160f81c901b9190911790600101612237565b5063ffffffff81166003146122b65760405162461bcd60e51b81526004016105609061470e565b5f805b602081101561230b576122cd81601f614648565b6122d8906008614376565b886122e483600661466f565b815181106122f4576122f461465b565b016020015160f81c901b91909117906001016122b9565b505f805b600881101561236a57612323816007614648565b61232e906008614376565b6001600160401b03168961234383602661466f565b815181106123535761235361465b565b016020015160f81c901b919091179060010161230f565b505f805b60088110156123c957612382816007614648565b61238d906008614376565b6001600160401b03168a6123a283602e61466f565b815181106123b2576123b261465b565b016020015160f81c901b919091179060010161236e565b5091989097509095509350505050565b5f8181525f80516020614a9383398151915260205260408082208151610100810190925280545f80516020614a5383398151915293929190829060ff16600581111561242757612427614137565b600581111561243857612438614137565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124c0576124c0614137565b1461251c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610560565b60408101516001600160a01b0316336001600160a01b0316146125965760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610560565b6125a38160a00151613197565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156125e7576125e7614137565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126b3846126ad8161194e565b5f611a18565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126e290859060040161427b565b6020604051808303815f875af11580156126fe573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061272291906142ad565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020614a738339815191528054600119016127a857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614a13833981519152906001600160401b03166127fa60408601602087016140ac565b6001600160401b031610156128695760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610560565b600381015461287b6020860186614764565b61ffff161015801561289f57506127106128986020860186614764565b61ffff1611155b6128bb5760405162461bcd60e51b81526004016105609061477f565b805483108015906128d0575080600101548311155b61292e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610560565b825f61293982610a35565b90505f6129468883613338565b5f8181526005860160205260409020909150879061296482826147ca565b509098975050505050505050565b60015f80516020614a7383398151915255565b5f8082516027146129a85760405162461bcd60e51b815260040161056090614682565b5f805b60028110156129f7576129bf816001614648565b6129ca906008614376565b61ffff168582815181106129e0576129e061465b565b016020015160f81c901b91909117906001016129ab565b5061ffff811615612a1a5760405162461bcd60e51b8152600401610560906146cb565b5f805b6004811015612a7557612a31816003614648565b612a3c906008614376565b63ffffffff1686612a4e83600261466f565b81518110612a5e57612a5e61465b565b016020015160f81c901b9190911790600101612a1d565b5063ffffffff8116600214612a9c5760405162461bcd60e51b81526004016105609061470e565b5f805b6020811015612af157612ab381601f614648565b612abe906008614376565b87612aca83600661466f565b81518110612ada57612ada61465b565b016020015160f81c901b9190911790600101612a9f565b505f86602681518110612b0657612b0661465b565b016020015191976001600160f81b03199092161515965090945050505050565b612b2e613802565b612b378161384d565b50565b5f612b43612777565b5f80516020614a138339815191525f612b5b84610a35565b90505f612b67876115d3565b9050600281516005811115612b7e57612b7e614137565b14612bdd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610560565b5f828260a00151612bee919061438d565b60048501546060840151919250612c10916001600160401b0390911690614820565b6001600160401b0316816001600160401b03161115612c8f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610560565b612c9988826119d0565b5f612ca38961194e565b90505f8982604051602001612ccf92919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612cf085613197565b5f6005600160991b0163ee5b48eb612d098d8688611a18565b6040518263ffffffff1660e01b8152600401612d25919061427b565b6020604051808303815f875af1158015612d41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d6591906142ad565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612ded57612ded614137565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611c3060015f80516020614a7383398151915255565b5f808251602e14612f4f5760405162461bcd60e51b815260040161056090614682565b5f805b6002811015612f9e57612f66816001614648565b612f71906008614376565b61ffff16858281518110612f8757612f8761465b565b016020015160f81c901b9190911790600101612f52565b5061ffff811615612fc15760405162461bcd60e51b8152600401610560906146cb565b5f805b600481101561301c57612fd8816003614648565b612fe3906008614376565b63ffffffff1686612ff583600261466f565b815181106130055761300561465b565b016020015160f81c901b9190911790600101612fc4565b5063ffffffff81166004146130435760405162461bcd60e51b81526004016105609061470e565b5f805b60208110156130985761305a81601f614648565b613065906008614376565b8761307183600661466f565b815181106130815761308161465b565b016020015160f81c901b9190911790600101613046565b505f805b60088110156130f7576130b0816007614648565b6130bb906008614376565b6001600160401b0316886130d083602661466f565b815181106130e0576130e061465b565b016020015160f81c901b919091179060010161309c565b5090969095509350505050565b804710156131275760405163cd78605960e01b8152306004820152602401610560565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613170576040519150601f19603f3d011682016040523d82523d5f602084013e613175565b606091505b50509050806114e057604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614a538339815191529060ff165f036131d5575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061321d9083614648565b10613239576001600160401b0384166040830152808252613258565b838260400181815161324b919061438d565b6001600160401b03169052505b5f82602001518360400151606461326f9190614820565b613279919061484b565b600285015490915060ff90811690821611156132f45760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610560565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f5f80516020614a538339815191524261335860408601602087016140ac565b6001600160401b0316118015613391575061337960408501602086016140ac565b6001600160401b031661338f426202a30061466f565b115b6133f35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610560565b833561344b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610560565b83355f908152600782016020526040902054156134bb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610560565b6134c86040850185614870565b905060301461352f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610560565b61353883613197565b5f806135d26040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061357d91906140ac565b6001600160401b0316815260200161359860408a018a614870565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506138b7565b5f828152600586016020526040902091935091506135f082826148fd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061361d90859060040161427b565b6020604051808303815f875af1158015613639573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061365d91906142ad565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156136df576136df614137565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916137d491908e01908e016140ac565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661384b57604051631afcd79f60e31b815260040160405180910390fd5b565b613855613802565b61385e81613c5c565b612b376060820135608083013561387b60c0850160a086016140ac565b61388b60e0860160c08701614764565b61ffff166138a0610100870160e088016149bc565b6138b2610120880161010089016149dc565b613c7d565b5f60608260800151516030146139215760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610560565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561399857613958816001614648565b613963906008614376565b5081515f9083908390811061397a5761397a61465b565b60200101906001600160f81b03191690815f1a905350600101613944565b505f5b60048110156139f6576139af816003614648565b6139ba906008614376565b505f826139c883600261466f565b815181106139d8576139d861465b565b60200101906001600160f81b03191690815f1a90535060010161399b565b505f5b6020811015613a535784518160208110613a1557613a1561465b565b1a60f81b82613a2583600661466f565b81518110613a3557613a3561465b565b60200101906001600160f81b03191690815f1a9053506001016139f9565b505f5b6020811015613ab35784602001518160208110613a7557613a7561465b565b1a60f81b82613a8583602661466f565b81518110613a9557613a9561465b565b60200101906001600160f81b03191690815f1a905350600101613a56565b505f5b6008811015613b2757613aca816007614648565b613ad5906008614376565b60ff1685604001516001600160401b0316901c60f81b82826046613af9919061466f565b81518110613b0957613b0961465b565b60200101906001600160f81b03191690815f1a905350600101613ab6565b505f5b6030811015613b925784608001518181518110613b4957613b4961465b565b01602001516001600160f81b03191682613b6483604e61466f565b81518110613b7457613b7461465b565b60200101906001600160f81b03191690815f1a905350600101613b2a565b505f5b6008811015613c0457613ba9816007614648565b613bb4906008614376565b60608601516001600160401b0390811691161c60f81b82613bd683607e61466f565b81518110613be657613be661465b565b60200101906001600160f81b03191690815f1a905350600101613b95565b50600281604051613c1591906149f7565b602060405180830381855afa158015613c30573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c5391906142ad565b94909350915050565b613c64613802565b613c6c613ec1565b613c74613ed1565b612b3781613ed9565b613c85613802565b5f80516020614a1383398151915283613cf15760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610560565b612710841115613d135760405162461bcd60e51b81526004016105609061477f565b85871115613d7b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610560565b5f8360ff1611613de85760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610560565b600a60ff84161115613e5a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610560565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b613ec9613802565b61384b613f45565b61384b613802565b613ee1613802565b80355f80516020614a5383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613f2b60608301604084016149bc565b600291909101805460ff191660ff90921691909117905550565b612972613802565b508054613f59906143ad565b5f825580601f10613f68575050565b601f0160209004905f5260205f2090810190612b379190613fc8565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613fdc575f8155600101613fc9565b5090565b8015158114612b37575f80fd5b803563ffffffff81168114614000575f80fd5b919050565b5f805f60608486031215614017575f80fd5b83359250602084013561402981613fe0565b915061403760408501613fed565b90509250925092565b5f60208284031215614050575f80fd5b5035919050565b5f60208284031215614067575f80fd5b611c3082613fed565b5f8060408385031215614081575f80fd5b61408a83613fed565b946020939093013593505050565b6001600160401b0381168114612b37575f80fd5b5f602082840312156140bc575f80fd5b8135611c3081614098565b5f8082840360608112156140d9575f80fd5b83356001600160401b038111156140ee575f80fd5b8401606081870312156140ff575f80fd5b92506040601f1982011215614112575f80fd5b506020830190509250929050565b5f6101208284031215614131575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061416f57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161419760408401826001600160a01b03169052565b5060608301516141b260608401826001600160401b03169052565b5060808301516141cd60808401826001600160401b03169052565b5060a08301516141e860a08401826001600160401b03169052565b5060c083015161420360c08401826001600160401b03169052565b5060e083015161421e60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561421e5761421e614225565b5f5b8381101561427357818101518382015260200161425b565b50505f910152565b602081525f8251806020840152614299816040850160208701614259565b601f01601f19169190910160400192915050565b5f602082840312156142bd575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f826142e6576142e66142c4565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a4557610a45614225565b6001600160401b0381811683821601908082111561421e5761421e614225565b600181811c908216806143c157607f821691505b60208210810361413157634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614438816143ad565b806020870152604060018084165f81146144595760018114614475576144a2565b60ff19851660408a0152604084151560051b8a010195506144a2565b895f5260205f205f5b858110156144995781548b820186015290830190880161447e565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156144e6576144e66144b0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614514576145146144b0565b604052919050565b6001600160a01b0381168114612b37575f80fd5b805161400081613fe0565b5f806040838503121561454c575f80fd5b82516001600160401b0380821115614562575f80fd5b9084019060608287031215614575575f80fd5b61457d6144c4565b825181526020808401516145908161451c565b828201526040840151838111156145a5575f80fd5b80850194505087601f8501126145b9575f80fd5b8351838111156145cb576145cb6144b0565b6145dd601f8201601f191683016144ec565b935080845288828287010111156145f2575f80fd5b61460181838601848801614259565b50826040830152819550614616818801614530565b9450505050509250929050565b5f6001600160401b0380831681810361463e5761463e614225565b6001019392505050565b81810381811115610a4557610a45614225565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a4557610a45614225565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114612b37575f80fd5b5f60208284031215614774575f80fd5b8135611c3081614755565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356147d581614755565b61ffff8116905081548161ffff19821617835560208401356147f681614098565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b0381811683821602808216919082811461484357614843614225565b505092915050565b5f6001600160401b0380841680614864576148646142c4565b92169190910492915050565b5f808335601e19843603018112614885575f80fd5b8301803591506001600160401b0382111561489e575f80fd5b6020019150368190038213156148b2575f80fd5b9250929050565b601f8211156114e057805f5260205f20601f840160051c810160208510156148de5750805b601f840160051c820191505b81811015610d4c575f81556001016148ea565b81516001600160401b03811115614916576149166144b0565b61492a8161492484546143ad565b846148b9565b602080601f83116001811461495d575f84156149465750858301515b5f19600386901b1c1916600185901b1785556149b4565b5f85815260208120601f198616915b8281101561498b5788860151825594840194600190910190840161496c565b50858210156149a857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156149cc575f80fd5b813560ff81168114611c30575f80fd5b5f602082840312156149ec575f80fd5b8135611c308161451c565b5f8251614a08818460208701614259565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516156ec3803806156ec83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61559f8061014d5f395ff3fe608060405260043610610126575f3560e01c806362065856116100a8578063b771b3bc1161006d578063b771b3bc14610357578063ba3a4b9714610389578063bee0a03f146103a8578063c123c6db146103c7578063c599e24f146103e6578063d5f20ff6146103f9575f80fd5b806362065856146102bc57806366435abf146102db57806376f78621146102fa57806398f3e2b414610319578063a3a65e4814610338575f80fd5b806335455ded116100ee57806335455ded1461022457806340034a931461024c578063467ef06f1461025f5780635297fae61461027e578063561404fd1461029d575f80fd5b80630118acc41461012a5780630322ed981461014b5780630cdd09851461016a578063151d30d1146101c75780632e2194d8146101ed575b5f80fd5b348015610135575f80fd5b50610149610144366004614897565b610425565b005b348015610156575f80fd5b506101496101653660046148d2565b61088f565b348015610175575f80fd5b506101b46101843660046148d2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101d2575f80fd5b506101db600a81565b60405160ff90911681526020016101be565b3480156101f8575f80fd5b5061020c6102073660046148d2565b610a48565b6040516001600160401b0390911681526020016101be565b34801561022f575f80fd5b5061023961271081565b60405161ffff90911681526020016101be565b6101b461025a366004614910565b610a5e565b34801561026a575f80fd5b50610149610279366004614964565b610a92565b348015610289575f80fd5b5061014961029836600461497d565b610ae5565b3480156102a8575f80fd5b506101496102b73660046149a5565b610cba565b3480156102c7575f80fd5b506101b46102d63660046149f3565b6113c0565b3480156102e6575f80fd5b5061020c6102f53660046148d2565b6113d9565b348015610305575f80fd5b50610149610314366004614897565b6113ed565b348015610324575f80fd5b5061014961033336600461497d565b6114ce565b348015610343575f80fd5b50610149610352366004614964565b6116fb565b348015610362575f80fd5b506103716005600160991b0181565b6040516001600160a01b0390911681526020016101be565b348015610394575f80fd5b506101496103a33660046148d2565b6118b3565b3480156103b3575f80fd5b506101496103c23660046148d2565b611b39565b3480156103d2575f80fd5b506101496103e1366004614a0c565b611c4d565b6101b46103f43660046148d2565b611d2f565b348015610404575f80fd5b506104186104133660046148d2565b611d60565b6040516101be9190614a37565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206154d3833981519152918415610477576104748285611e53565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104a9576104a9614a23565b60048111156104ba576104ba614a23565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561054157610541614a23565b146105935760405162461bcd60e51b815260206004820152602a60248201525f805160206154f38339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105f85760405162461bcd60e51b815260206004820152603360248201525f805160206154f38339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161058a565b5f610602846120ef565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561064f5761064f614a23565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61072185611d60565b905082606001516001600160401b031681608001516001600160401b0316116107985760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161058a565b5f836060015182608001516107ad9190614b01565b90506107b9868261217f565b5f6005600160991b0163ee5b48eb6107d28987866121c7565b6040518263ffffffff1660e01b81526004016107ee9190614b43565b6020604051808303815f875af115801561080a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082e9190614b75565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206155738339815191526020526040808220815160e0810190925280545f8051602061551383398151915293929190829060ff1660058111156108dc576108dc614a23565b60058111156108ed576108ed614a23565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c614a23565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6121c7565b6040518263ffffffff1660e01b8152600401610a029190614b43565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a429190614b75565b50505050565b5f610a5864e8d4a5100083614ba0565b92915050565b5f610a676123e4565b610a738484843461241b565b9050610a8b60015f8051602061555383398151915255565b9392505050565b5f805160206154d38339815191525f80610aab84612641565b6040808201515f848152600588016020529190912054929450909250610a42916001600160401b03909116906001600160a01b03166129a6565b5f805160206154d38339815191525f610afd846129b9565b90505f80610b0e8360400151612b9a565b50915091505f610b1d83611d60565b9050816001600160401b031681606001516001600160401b03161015610b555760405162461bcd60e51b815260040161058a90614bb3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b9a5760405162461bcd60e51b815260040161058a90614bf5565b60015f87815260068701602052604090205460ff166004811115610bc057610bc0614a23565b14610c295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206155138339815191529060ff1615610d575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161058a565b5f610d61836129b9565b90505f610d718260400151612dd5565b90505f85356020870135610d886040890189614c3e565b604051602001610d9b9493929190614c87565b60408051601f1981840301815291905280519091505f5b81811015610e2e575f610dc860608a018a614ca7565b83818110610dd857610dd8614cec565b9050602002810190610dea9190614d00565b610df390614db0565b80516020808301516040808501519051949550610e139489949301614e47565b60408051601f19818403018152919052935050600101610db2565b5082600283604051610e409190614e96565b602060405180830381855afa158015610e5b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610e7e9190614b75565b14610ee25760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f499190614b75565b876020013514610fab5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161058a565b610fb86040880188614c3e565b905060141461101c5760405162461bcd60e51b815260206004820152603a60248201525f8051602061553383398151915260448201527f746f72206d616e616765722061646472657373206c656e677468000000000000606482015260840161058a565b3061102a6040890189614c3e565b61103391614ea7565b60601c1461108c5760405162461bcd60e51b815260206004820152603360248201525f80516020615533833981519152604482015272746f72206d616e61676572206164647265737360681b606482015260840161058a565b5f61109a6060890189614ca7565b9050116110f95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161058a565b5f5b818110156113a7575f61111160608a018a614ca7565b8381811061112157611121614cec565b90506020028101906111339190614d00565b61113c90614db0565b604080518b3560208201529081018490529091505f9060029060600160408051601f198184030181529082905261117291614e96565b602060405180830381855afa15801561118d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111b09190614b75565b8251909150806111d25760405162461bcd60e51b815260040161058a90614edc565b5f81815260078a016020526040902054156111ff5760405162461bcd60e51b815260040161058a90614f1d565b8260400151516030146112245760405162461bcd60e51b815260040161058a90614f65565b5f81815260078a0160209081526040808320859055805160e081018252600180825287518285015287840180516001600160401b039081168486015260608401879052905116608083015260a0820185905260c0820185905286855260068e0190935292208251815491929091839160ff19909116908360058111156112ac576112ac614a23565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055611356826120ef565b5082516020808501516040516001600160401b03909116815284917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050506001016110fb565b5050506008909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a51000614fb2565b5f6113e382611d60565b6080015192915050565b5f805160206154d38339815191525f61140585611d60565b5f86815260058401602052604090205460a082015191925061143891600160b01b9091046001600160401b031690614fc9565b6001600160401b03164210156114ac5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161058a565b83156114be576114bc8584611e53565b505b6114c785612f40565b5050505050565b6114d66123e4565b5f805160206154d38339815191525f6114ee846129b9565b90505f806114ff8360400151612b9a565b50915091505f61150e83611d60565b9050816001600160401b031681606001516001600160401b031610156115465760405162461bcd60e51b815260040161058a90614bb3565b5f8681526006860160205260409020600301546001600160401b03808416911611156115845760405162461bcd60e51b815260040161058a90614bf5565b60035f87815260068701602052604090205460ff1660048111156115aa576115aa614a23565b146115fe5760405162461bcd60e51b815260206004820152603160248201525f805160206154f38339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526116a3916129a6565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506116f760015f8051602061555383398151915255565b5050565b5f805160206155138339815191525f611713836129b9565b90505f806117248360400151613236565b91509150806117865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161058a565b5f828152600585016020526040812080546117a090614fe9565b90501180156117d2575060015f83815260068601602052604090205460ff1660058111156117d0576117d0614a23565b145b6117ee5760405162461bcd60e51b815260040161058a9061501b565b5f82815260058501602052604081206118069161482d565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206154d383398151915293929190829060ff16600481111561191457611914614a23565b600481111561192557611925614a23565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119ac576119ac614a23565b14806119ca57506003815160048111156119c8576119c8614a23565b145b611a1e5760405162461bcd60e51b815260206004820152603260248201525f805160206154f3833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161058a565b5f611a2c8260400151611d60565b905080606001516001600160401b03165f03611ab05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb611add8460400151846060015185608001516121c7565b6040518263ffffffff1660e01b8152600401611af99190614b43565b6020604051808303815f875af1158015611b15573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c79190614b75565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020615513833981519152929190611b8190614fe9565b9050118015611bb3575060015f83815260068301602052604090205460ff166005811115611bb157611bb1614a23565b145b611bcf5760405162461bcd60e51b815260040161058a9061501b565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c08919060040161504f565b6020604051808303815f875af1158015611c24573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c489190614b75565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611c96575080546001600160401b03808416911610155b15611cb45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611cde836133d7565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611d386123e4565b611d438233346133eb565b9050611d5b60015f8051602061555383398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061557383398151915290528390208351918201909352825491925f8051602061551383398151915292829060ff166005811115611de057611de0614a23565b6005811115611df157611df1614a23565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e9e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ec591908101906150f8565b9150915080611f285760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f6b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8f9190614b75565b825114611ff35760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161058a565b60208201516001600160a01b0316156120695760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161058a565b5f806120788460400151613858565b915091508187146120e55760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161058a565b9695505050505050565b5f8181525f805160206155738339815191526020526040812060020180545f8051602061551383398151915291600160401b9091046001600160401b0316906008612139836151ca565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f80516020615573833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612240576122008160016151ef565b61220b906008614fb2565b5081515f9083908390811061222257612222614cec565b60200101906001600160f81b03191690815f1a9053506001016121ec565b505f5b60048110156122a3576122578160036151ef565b612262906008614fb2565b6001901c60f81b82612275836002615202565b8151811061228557612285614cec565b60200101906001600160f81b03191690815f1a905350600101612243565b505f5b6020811015612305576122ba81601f6151ef565b6122c5906008614fb2565b86901c60f81b826122d7836006615202565b815181106122e7576122e7614cec565b60200101906001600160f81b03191690815f1a9053506001016122a6565b505f5b60088110156123705761231c8160076151ef565b612327906008614fb2565b6001600160401b038616901c60f81b82612342836026615202565b8151811061235257612352614cec565b60200101906001600160f81b03191690815f1a905350600101612308565b505f5b60088110156123db576123878160076151ef565b612392906008614fb2565b6001600160401b038516901c60f81b826123ad83602e615202565b815181106123bd576123bd614cec565b60200101906001600160f81b03191690815f1a905350600101612373565b50949350505050565b5f8051602061555383398151915280546001190161241557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206154d38339815191529061ffff861610801590612467575061271061ffff861611155b6124835760405162461bcd60e51b815260040161058a90615215565b60028101546001600160401b0390811690851610156124fc5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161058a565b80548310801590612511575080600101548311155b61256f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161058a565b825f61257a82610a48565b90505f6125878983613a30565b9050604051806060016040528061259b3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061555383398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206155138339815191525f612690856129b9565b90505f806126a18360400151613236565b9150915080156127065760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161058a565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561273757612737614a23565b600581111561274857612748614a23565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156127b9576127b9614a23565b14806127d757506001825160058111156127d5576127d5614a23565b145b6128235760405162461bcd60e51b815260206004820152602a60248201525f80516020615533833981519152604482015269746f722073746174757360b01b606482015260840161058a565b60038251600581111561283857612838614a23565b0361284557506004612849565b5060055b6020808301515f9081526007880190915260408120558181600581111561287257612872614a23565b9081600581111561288557612885614a23565b9052505f84815260068701602052604090208251815484929190829060ff191660018360058111156128b9576128b9614a23565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561296d5761296d614a23565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6116f76001600160a01b03821683613ea4565b60408051606080820183525f8083526020830181905292820152905f805160206155138339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a2e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a5591908101906150f8565b9150915080612abc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161058a565b8254825114612b1f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161058a565b60208201516001600160a01b031615612b925760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161058a565b509392505050565b5f805f8351603614612bbe5760405162461bcd60e51b815260040161058a90615260565b5f805b6002811015612c0d57612bd58160016151ef565b612be0906008614fb2565b61ffff16868281518110612bf657612bf6614cec565b016020015160f81c901b9190911790600101612bc1565b5061ffff811615612c305760405162461bcd60e51b815260040161058a906152a9565b5f805b6004811015612c8b57612c478160036151ef565b612c52906008614fb2565b63ffffffff1687612c64836002615202565b81518110612c7457612c74614cec565b016020015160f81c901b9190911790600101612c33565b5063ffffffff8116600314612cb25760405162461bcd60e51b815260040161058a906152ec565b5f805b6020811015612d0757612cc981601f6151ef565b612cd4906008614fb2565b88612ce0836006615202565b81518110612cf057612cf0614cec565b016020015160f81c901b9190911790600101612cb5565b505f805b6008811015612d6657612d1f8160076151ef565b612d2a906008614fb2565b6001600160401b031689612d3f836026615202565b81518110612d4f57612d4f614cec565b016020015160f81c901b9190911790600101612d0b565b505f805b6008811015612dc557612d7e8160076151ef565b612d89906008614fb2565b6001600160401b03168a612d9e83602e615202565b81518110612dae57612dae614cec565b016020015160f81c901b9190911790600101612d6a565b5091989097509095509350505050565b5f8151602614612df75760405162461bcd60e51b815260040161058a90615260565b5f805b6002811015612e4657612e0e8160016151ef565b612e19906008614fb2565b61ffff16848281518110612e2f57612e2f614cec565b016020015160f81c901b9190911790600101612dfa565b5061ffff811615612e695760405162461bcd60e51b815260040161058a906152a9565b5f805b6004811015612ec457612e808160036151ef565b612e8b906008614fb2565b63ffffffff1685612e9d836002615202565b81518110612ead57612ead614cec565b016020015160f81c901b9190911790600101612e6c565b5063ffffffff8116600514612eeb5760405162461bcd60e51b815260040161058a906152ec565b5f805b60208110156123db57612f0281601f6151ef565b612f0d906008614fb2565b86612f19836006615202565b81518110612f2957612f29614cec565b016020015160f81c901b9190911790600101612eee565b5f8181525f805160206155738339815191526020526040808220815160e0810190925280545f8051602061551383398151915293929190829060ff166005811115612f8d57612f8d614a23565b6005811115612f9e57612f9e614a23565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561301057613010614a23565b1461306c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161058a565b6130798160800151613f37565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156130bd576130bd614a23565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131728461316c816120ef565b5f6121c7565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906131a1908590600401614b43565b6020604051808303815f875af11580156131bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131e19190614b75565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146132595760405162461bcd60e51b815260040161058a90615260565b5f805b60028110156132a8576132708160016151ef565b61327b906008614fb2565b61ffff1685828151811061329157613291614cec565b016020015160f81c901b919091179060010161325c565b5061ffff8116156132cb5760405162461bcd60e51b815260040161058a906152a9565b5f805b6004811015613326576132e28160036151ef565b6132ed906008614fb2565b63ffffffff16866132ff836002615202565b8151811061330f5761330f614cec565b016020015160f81c901b91909117906001016132ce565b5063ffffffff811660021461334d5760405162461bcd60e51b815260040161058a906152ec565b5f805b60208110156133a25761336481601f6151ef565b61336f906008614fb2565b8761337b836006615202565b8151811061338b5761338b614cec565b016020015160f81c901b9190911790600101613350565b505f866026815181106133b7576133b7614cec565b016020015191976001600160f81b03199092161515965090945050505050565b6133df6140d8565b6133e881614123565b50565b5f5f805160206154d38339815191528161340484610a48565b90505f61341087611d60565b905060028151600581111561342757613427614a23565b146134865760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161058a565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166135195760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161058a565b5f82826080015161352a9190614fc9565b6004850154604084015191925061354c916001600160401b0390911690615333565b6001600160401b0316816001600160401b031611156135cb5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161058a565b6135d5888261217f565b5f6135df896120ef565b90505f898260405160200161360b92919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061362c85613f37565b5f6005600160991b0163ee5b48eb6136458d86886121c7565b6040518263ffffffff1660e01b81526004016136619190614b43565b6020604051808303815f875af115801561367d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136a19190614b75565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561372957613729614a23565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e1461387b5760405162461bcd60e51b815260040161058a90615260565b5f805b60028110156138ca576138928160016151ef565b61389d906008614fb2565b61ffff168582815181106138b3576138b3614cec565b016020015160f81c901b919091179060010161387e565b5061ffff8116156138ed5760405162461bcd60e51b815260040161058a906152a9565b5f805b6004811015613948576139048160036151ef565b61390f906008614fb2565b63ffffffff1686613921836002615202565b8151811061393157613931614cec565b016020015160f81c901b91909117906001016138f0565b5063ffffffff811660041461396f5760405162461bcd60e51b815260040161058a906152ec565b5f805b60208110156139c45761398681601f6151ef565b613991906008614fb2565b8761399d836006615202565b815181106139ad576139ad614cec565b016020015160f81c901b9190911790600101613972565b505f805b6008811015613a23576139dc8160076151ef565b6139e7906008614fb2565b6001600160401b0316886139fc836026615202565b81518110613a0c57613a0c614cec565b016020015160f81c901b91909117906001016139c8565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613abb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161058a565b5f8051602061551383398151915242613ada60408601602087016149f3565b6001600160401b0316118015613b135750613afb60408501602086016149f3565b6001600160401b0316613b11426202a300615202565b115b613b755760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161058a565b8335613b935760405162461bcd60e51b815260040161058a90614edc565b83355f90815260078201602052604090205415613bc25760405162461bcd60e51b815260040161058a90614f1d565b613bcf6040850185614c3e565b9050603014613bf05760405162461bcd60e51b815260040161058a90614f65565b613bf983613f37565b5f80613c936040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613c3e91906149f3565b6001600160401b03168152602001613c5960408a018a614c3e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614195565b5f82815260058601602052604090209193509150613cb1828261539a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613cde908590600401614b43565b6020604051808303815f875af1158015613cfa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d1e9190614b75565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115613d9657613d96614a23565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613e76918e01908e016149f3565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613ec75760405163cd78605960e01b815230600482015260240161058a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f10576040519150601f19603f3d011682016040523d82523d5f602084013e613f15565b606091505b5050905080611c4857604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206155138339815191529060ff165f03613f75575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613fbd90836151ef565b10613fd9576001600160401b0384166040830152808252613ff8565b8382604001818151613feb9190614fc9565b6001600160401b03169052505b5f82602001518360400151606461400f9190615333565b6140199190615459565b600285015490915060ff90811690821611156140945760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161058a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661412157604051631afcd79f60e31b815260040160405180910390fd5b565b61412b6140d8565b6141348161453a565b61413c614553565b6133e86060820135608083013561415960c0850160a086016149f3565b61416960e0860160c0870161547e565b61ffff1661417e610100870160e08801615497565b614190610120880161010089016154b7565b614563565b5f60608260800151516030146141ff5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161058a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614276576142368160016151ef565b614241906008614fb2565b5081515f9083908390811061425857614258614cec565b60200101906001600160f81b03191690815f1a905350600101614222565b505f5b60048110156142d45761428d8160036151ef565b614298906008614fb2565b505f826142a6836002615202565b815181106142b6576142b6614cec565b60200101906001600160f81b03191690815f1a905350600101614279565b505f5b602081101561433157845181602081106142f3576142f3614cec565b1a60f81b82614303836006615202565b8151811061431357614313614cec565b60200101906001600160f81b03191690815f1a9053506001016142d7565b505f5b6020811015614391578460200151816020811061435357614353614cec565b1a60f81b82614363836026615202565b8151811061437357614373614cec565b60200101906001600160f81b03191690815f1a905350600101614334565b505f5b6008811015614405576143a88160076151ef565b6143b3906008614fb2565b60ff1685604001516001600160401b0316901c60f81b828260466143d79190615202565b815181106143e7576143e7614cec565b60200101906001600160f81b03191690815f1a905350600101614394565b505f5b6030811015614470578460800151818151811061442757614427614cec565b01602001516001600160f81b0319168261444283604e615202565b8151811061445257614452614cec565b60200101906001600160f81b03191690815f1a905350600101614408565b505f5b60088110156144e2576144878160076151ef565b614492906008614fb2565b60608601516001600160401b0390811691161c60f81b826144b483607e615202565b815181106144c4576144c4614cec565b60200101906001600160f81b03191690815f1a905350600101614473565b506002816040516144f39190614e96565b602060405180830381855afa15801561450e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145319190614b75565b94909350915050565b6145426140d8565b61454a6147a7565b6133e8816147af565b61455b6140d8565b614121614825565b61456b6140d8565b5f805160206154d3833981519152836145d75760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161058a565b6127108411156145f95760405162461bcd60e51b815260040161058a90615215565b858711156146615760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161058a565b5f8360ff16116146ce5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161058a565b600a60ff841611156147405760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161058a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6141216140d8565b6147b76140d8565b80355f8051602061551383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556148016060830160408401615497565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b61262e6140d8565b50805461483990614fe9565b5f825580601f10614848575050565b601f0160209004905f5260205f20908101906133e891905b80821115614873575f8155600101614860565b5090565b80151581146133e8575f80fd5b803563ffffffff81168114611d5b575f80fd5b5f805f606084860312156148a9575f80fd5b8335925060208401356148bb81614877565b91506148c960408501614884565b90509250925092565b5f602082840312156148e2575f80fd5b5035919050565b803561ffff81168114611d5b575f80fd5b80356001600160401b0381168114611d5b575f80fd5b5f805f60608486031215614922575f80fd5b83356001600160401b03811115614937575f80fd5b840160608187031215614948575f80fd5b9250614956602085016148e9565b91506148c9604085016148fa565b5f60208284031215614974575f80fd5b610a8b82614884565b5f806040838503121561498e575f80fd5b61499783614884565b946020939093013593505050565b5f80604083850312156149b6575f80fd5b82356001600160401b038111156149cb575f80fd5b8301608081860312156149dc575f80fd5b91506149ea60208401614884565b90509250929050565b5f60208284031215614a03575f80fd5b610a8b826148fa565b5f6101208284031215614a1d575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614a5a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614a9560608401826001600160401b03169052565b506080830151614ab060808401826001600160401b03169052565b5060a0830151614acb60a08401826001600160401b03169052565b5060c0830151614ae660c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614ae657614ae6614aed565b5f5b83811015614b3b578181015183820152602001614b23565b50505f910152565b602081525f8251806020840152614b61816040850160208701614b21565b601f01601f19169190910160400192915050565b5f60208284031215614b85575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614bae57614bae614b8c565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f808335601e19843603018112614c53575f80fd5b8301803591506001600160401b03821115614c6c575f80fd5b602001915036819003821315614c80575f80fd5b9250929050565b848152836020820152818360408301375f91016040019081529392505050565b5f808335601e19843603018112614cbc575f80fd5b8301803591506001600160401b03821115614cd5575f80fd5b6020019150600581901b3603821315614c80575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614d14575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614d5457614d54614d1e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614d8257614d82614d1e565b604052919050565b5f6001600160401b03821115614da257614da2614d1e565b50601f01601f191660200190565b5f60608236031215614dc0575f80fd5b614dc8614d32565b823581526020614dd98185016148fa565b8183015260408401356001600160401b03811115614df5575f80fd5b840136601f820112614e05575f80fd5b8035614e18614e1382614d8a565b614d5a565b8181523684838501011115614e2b575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551614e58818460208a01614b21565b80830190508581526001600160401b0360c01b8560c01b1660208201528351614e88816028840160208801614b21565b016028019695505050505050565b5f8251614d14818460208701614b21565b6bffffffffffffffffffffffff198135818116916014851015614ed45780818660140360031b1b83161692505b505092915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b8082028115828204841417610a5857610a58614aed565b6001600160401b03818116838216019080821115614ae657614ae6614aed565b600181811c90821680614ffd57607f821691505b602082108103614a1d57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201525f805160206155338339815191526040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461506181614fe9565b806020870152604060018084165f8114615082576001811461509e576150cb565b60ff19851660408a0152604084151560051b8a010195506150cb565b895f5260205f205f5b858110156150c25781548b82018601529083019088016150a7565b8a016040019650505b509398975050505050505050565b6001600160a01b03811681146133e8575f80fd5b8051611d5b81614877565b5f8060408385031215615109575f80fd5b82516001600160401b038082111561511f575f80fd5b9084019060608287031215615132575f80fd5b61513a614d32565b8251815260208084015161514d816150d9565b82820152604084015183811115615162575f80fd5b80850194505087601f850112615176575f80fd5b83519250615186614e1384614d8a565b8381528882858701011115615199575f80fd5b6151a884838301848801614b21565b806040840152508195506151bd8188016150ed565b9450505050509250929050565b5f6001600160401b038083168181036151e5576151e5614aed565b6001019392505050565b81810381811115610a5857610a58614aed565b80820180821115610a5857610a58614aed565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614ed457614ed4614aed565b601f821115611c4857805f5260205f20601f840160051c8101602085101561537b5750805b601f840160051c820191505b818110156114c7575f8155600101615387565b81516001600160401b038111156153b3576153b3614d1e565b6153c7816153c18454614fe9565b84615356565b602080601f8311600181146153fa575f84156153e35750858301515b5f19600386901b1c1916600185901b178555615451565b5f85815260208120601f198616915b8281101561542857888601518255948401946001909101908401615409565b508582101561544557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b038084168061547257615472614b8c565b92169190910492915050565b5f6020828403121561548e575f80fd5b610a8b826148e9565b5f602082840312156154a7575f80fd5b813560ff81168114610a8b575f80fd5b5f602082840312156154c7575f80fd5b8135610a8b816150d956fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0056616c696461746f724d616e616765723a20696e76616c69642076616c6964619b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -371,7 +379,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) Active // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { var out []interface{} err := _NativeTokenStakingManager.contract.Call(opts, &out, "getValidator", validationID) @@ -388,14 +396,14 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetValidator( // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) GetValidator(validationID [32]byte) (Validator, error) { return _NativeTokenStakingManager.Contract.GetValidator(&_NativeTokenStakingManager.CallOpts, validationID) } // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { return _NativeTokenStakingManager.Contract.GetValidator(&_NativeTokenStakingManager.CallOpts, validationID) } @@ -661,25 +669,46 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In return _NativeTokenStakingManager.Contract.InitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x80a8ad94. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, delegationFeeBips, minStakeDuration) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, requirements) +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x80a8ad94. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, requirements) +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorSet(&_NativeTokenStakingManager.TransactOpts, subnetConversionData, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x80a8ad94. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, requirements) +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorSet(&_NativeTokenStakingManager.TransactOpts, subnetConversionData, messageIndex) } // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. @@ -1401,6 +1430,160 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelega return event, nil } +// NativeTokenStakingManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerInitialValidatorCreatedIterator struct { + Event *NativeTokenStakingManagerInitialValidatorCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerInitialValidatorCreated struct { + ValidationID [32]byte + NodeID [32]byte + Weight *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*NativeTokenStakingManagerInitialValidatorCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerInitialValidatorCreatedIterator{contract: _NativeTokenStakingManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil +} + +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerInitialValidatorCreated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*NativeTokenStakingManagerInitialValidatorCreated, error) { + event := new(NativeTokenStakingManagerInitialValidatorCreated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // NativeTokenStakingManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerInitializedIterator struct { Event *NativeTokenStakingManagerInitialized // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 77ccc88a4..dfd04bb03 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -29,11 +29,25 @@ var ( _ = abi.ConvertType ) +// InitialValidator is an auto generated low-level Go binding around an user-defined struct. +type InitialValidator struct { + NodeID [32]byte + Weight uint64 + BlsPublicKey []byte +} + +// SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. +type SubnetConversionData struct { + ConvertSubnetTxID [32]byte + BlockchainID [32]byte + ValidatorManagerAddress []byte + InitialValidators []InitialValidator +} + // Validator is an auto generated low-level Go binding around an user-defined struct. type Validator struct { Status uint8 NodeID [32]byte - Owner common.Address StartingWeight uint64 MessageNonce uint64 Weight uint64 @@ -57,8 +71,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612d76380380612d7683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612c298061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806397fb70d411610088578063bee0a03f11610063578063bee0a03f14610220578063c151c0b914610233578063d5f20ff614610246578063f2fde38b14610266575f80fd5b806397fb70d4146101ec578063a3a65e48146101ff578063b771b3bc14610212575f80fd5b806366435abf116100c357806366435abf14610162578063715018a61461018d5780638994ab49146101955780638da5cb5b146101a8575f80fd5b80630322ed98146100e95780630cdd0985146100fe578063467ef06f1461014f575b5f80fd5b6100fc6100f736600461244f565b610279565b005b61013c61010c36600461244f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6100fc61015d366004612466565b61044e565b61017561017036600461244f565b61045b565b6040516001600160401b039091168152602001610146565b6100fc61046f565b61013c6101a33660046124c1565b610482565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610146565b6100fc6101fa36600461244f565b61049e565b6100fc61020d366004612466565b6104aa565b6101d46005600160991b0181565b6100fc61022e36600461244f565b610667565b6100fc61024136600461251f565b61077b565b61025961025436600461244f565b610889565b6040516101469190612569565b6100fc610274366004612643565b610968565b5f8181525f80516020612bfd83398151915260205260408082208151610100810190925280545f80516020612bdd83398151915293929190829060ff1660058111156102c7576102c7612555565b60058111156102d8576102d8612555565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561035d5761035d612555565b146103c75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103ec8584608001515f6109a2565b6040518263ffffffff1660e01b81526004016104089190612680565b6020604051808303815f875af1158015610424573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044891906126b2565b50505050565b61045781610bbf565b5050565b5f61046582610889565b60a0015192915050565b610477610f32565b6104805f610f8d565b565b5f61048b610f32565b6104958383610ffd565b90505b92915050565b6104a7816114c7565b50565b5f80516020612bdd8339815191525f6104c283611865565b90505f806104d38360400151611a46565b91509150806105355760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103be565b5f8281526005850160205260408120805461054f906126c9565b9050118015610581575060015f83815260068601602052604090205460ff16600581111561057f5761057f612555565b145b61059d5760405162461bcd60e51b81526004016103be906126fb565b5f82815260058501602052604081206105b5916123bc565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612bdd8339815191529291906106af906126c9565b90501180156106e1575060015f83815260068301602052604090205460ff1660058111156106df576106df612555565b145b6106fd5760405162461bcd60e51b81526004016103be906126fb565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916107369190600401612742565b6020604051808303815f875af1158015610752573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061077691906126b2565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107bf5750825b90505f826001600160401b031660011480156107da5750303b155b9050811580156107e8575080155b156108065760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561083057845460ff60401b1916600160401b1785555b61083a8787611ca5565b831561088057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6108916123f3565b5f8281525f80516020612bfd8339815191526020526040908190208151610100810190925280545f80516020612bdd833981519152929190829060ff1660058111156108df576108df612555565b60058111156108f0576108f0612555565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b610970610f32565b6001600160a01b03811661099957604051631e4fbdf760e01b81525f60048201526024016103be565b6104a781610f8d565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a1b576109db8160016127f4565b6109e6906008612807565b5081515f908390839081106109fd576109fd61281e565b60200101906001600160f81b03191690815f1a9053506001016109c7565b505f5b6004811015610a7e57610a328160036127f4565b610a3d906008612807565b6001901c60f81b82610a50836002612832565b81518110610a6057610a6061281e565b60200101906001600160f81b03191690815f1a905350600101610a1e565b505f5b6020811015610ae057610a9581601f6127f4565b610aa0906008612807565b86901c60f81b82610ab2836006612832565b81518110610ac257610ac261281e565b60200101906001600160f81b03191690815f1a905350600101610a81565b505f5b6008811015610b4b57610af78160076127f4565b610b02906008612807565b6001600160401b038616901c60f81b82610b1d836026612832565b81518110610b2d57610b2d61281e565b60200101906001600160f81b03191690815f1a905350600101610ae3565b505f5b6008811015610bb657610b628160076127f4565b610b6d906008612807565b6001600160401b038516901c60f81b82610b8883602e612832565b81518110610b9857610b9861281e565b60200101906001600160f81b03191690815f1a905350600101610b4e565b50949350505050565b610bc76123f3565b5f80516020612bdd8339815191525f610bdf84611865565b90505f80610bf08360400151611a46565b915091508015610c555760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103be565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610c8757610c87612555565b6005811115610c9857610c98612555565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d1f57610d1f612555565b1480610d3d5750600182516005811115610d3b57610d3b612555565b145b610d9c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103be565b600382516005811115610db157610db1612555565b03610dbe57506004610dc2565b5060055b6020808301515f90815260078801909152604081205581816005811115610deb57610deb612555565b90816005811115610dfe57610dfe612555565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610e3257610e32612555565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610efd57610efd612555565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b33610f647f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104805760405163118cdaa760e01b81523360048201526024016103be565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612bdd8339815191524261101d6040860160208701612845565b6001600160401b0316118015611056575061103e6040850160208601612845565b6001600160401b0316611054426202a300612832565b115b6110b85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103be565b83356111105760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103be565b83355f908152600782016020526040902054156111805760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103be565b61118d604085018561285e565b90506030146111f45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103be565b6111fd83611cbf565b5f806112976040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906112429190612845565b6001600160401b0316815260200161125d60408a018a61285e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611e60565b5f828152600586016020526040902091935091506112b582826128f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112e2908590600401612680565b6020604051808303815f875af11580156112fe573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061132291906126b2565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156113a4576113a4612555565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161149991908e01908e01612845565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612bfd83398151915260205260408082208151610100810190925280545f80516020612bdd83398151915293929190829060ff16600581111561151557611515612555565b600581111561152657611526612555565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156115ae576115ae612555565b1461160a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103be565b60408101516001600160a01b0316336001600160a01b0316146116845760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103be565b6116918160a00151611cbf565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156116d5576116d5612555565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6117a18461179b81612205565b5f6109a2565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906117d0908590600401612680565b6020604051808303815f875af11580156117ec573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061181091906126b2565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612bdd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118da573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119019190810190612a18565b91509150806119685760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103be565b82548251146119cb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103be565b60208201516001600160a01b031615611a3e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103be565b509392505050565b5f808251602714611aab5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103be565b5f805b6002811015611afa57611ac28160016127f4565b611acd906008612807565b61ffff16858281518110611ae357611ae361281e565b016020015160f81c901b9190911790600101611aae565b5061ffff811615611b595760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103be565b5f805b6004811015611bb457611b708160036127f4565b611b7b906008612807565b63ffffffff1686611b8d836002612832565b81518110611b9d57611b9d61281e565b016020015160f81c901b9190911790600101611b5c565b5063ffffffff8116600214611c1b5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103be565b5f805b6020811015611c7057611c3281601f6127f4565b611c3d906008612807565b87611c49836006612832565b81518110611c5957611c5961281e565b016020015160f81c901b9190911790600101611c1e565b505f86602681518110611c8557611c8561281e565b016020015191976001600160f81b03199092161515965090945050505050565b611cad612287565b611cb6826122d0565b610457816122f1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612bdd8339815191529060ff165f03611cfd575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611d4590836127f4565b10611d61576001600160401b0384166040830152808252611d80565b8382604001818151611d739190612b00565b6001600160401b03169052505b5f826020015183604001516064611d979190612b20565b611da19190612b4b565b600285015490915060ff9081169082161115611e1c5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103be565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611eca5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103be565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611f4157611f018160016127f4565b611f0c906008612807565b5081515f90839083908110611f2357611f2361281e565b60200101906001600160f81b03191690815f1a905350600101611eed565b505f5b6004811015611f9f57611f588160036127f4565b611f63906008612807565b505f82611f71836002612832565b81518110611f8157611f8161281e565b60200101906001600160f81b03191690815f1a905350600101611f44565b505f5b6020811015611ffc5784518160208110611fbe57611fbe61281e565b1a60f81b82611fce836006612832565b81518110611fde57611fde61281e565b60200101906001600160f81b03191690815f1a905350600101611fa2565b505f5b602081101561205c578460200151816020811061201e5761201e61281e565b1a60f81b8261202e836026612832565b8151811061203e5761203e61281e565b60200101906001600160f81b03191690815f1a905350600101611fff565b505f5b60088110156120d0576120738160076127f4565b61207e906008612807565b60ff1685604001516001600160401b0316901c60f81b828260466120a29190612832565b815181106120b2576120b261281e565b60200101906001600160f81b03191690815f1a90535060010161205f565b505f5b603081101561213b57846080015181815181106120f2576120f261281e565b01602001516001600160f81b0319168261210d83604e612832565b8151811061211d5761211d61281e565b60200101906001600160f81b03191690815f1a9053506001016120d3565b505f5b60088110156121ad576121528160076127f4565b61215d906008612807565b60608601516001600160401b0390811691161c60f81b8261217f83607e612832565b8151811061218f5761218f61281e565b60200101906001600160f81b03191690815f1a90535060010161213e565b506002816040516121be9190612b7c565b602060405180830381855afa1580156121d9573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906121fc91906126b2565b94909350915050565b5f8181525f80516020612bfd8339815191526020526040812060030180545f80516020612bdd833981519152916001600160401b03909116908361224883612b97565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661048057604051631afcd79f60e31b815260040160405180910390fd5b6122d8612287565b6122e0612302565b6122e8612312565b6104a78161231a565b6122f9612287565b6104a781612386565b61230a612287565b61048061238e565b610480612287565b612322612287565b80355f80516020612bdd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561236c6060830160408401612bbc565b600291909101805460ff191660ff90921691909117905550565b610970612287565b612396612287565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5080546123c8906126c9565b5f825580601f106123d7575050565b601f0160209004905f5260205f20908101906104a79190612437565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561244b575f8155600101612438565b5090565b5f6020828403121561245f575f80fd5b5035919050565b5f60208284031215612476575f80fd5b813563ffffffff81168114612489575f80fd5b9392505050565b5f606082840312156124a0575f80fd5b50919050565b80356001600160401b03811681146124bc575f80fd5b919050565b5f80604083850312156124d2575f80fd5b82356001600160401b038111156124e7575f80fd5b6124f385828601612490565b925050612502602084016124a6565b90509250929050565b6001600160a01b03811681146104a7575f80fd5b5f8060808385031215612530575f80fd5b61253a8484612490565b9150606083013561254a8161250b565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061258d57634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516125b560408401826001600160a01b03169052565b5060608301516125d060608401826001600160401b03169052565b5060808301516125eb60808401826001600160401b03169052565b5060a083015161260660a08401826001600160401b03169052565b5060c083015161262160c08401826001600160401b03169052565b5060e083015161263c60e08401826001600160401b03169052565b5092915050565b5f60208284031215612653575f80fd5b81356124898161250b565b5f5b83811015612678578181015183820152602001612660565b50505f910152565b602081525f825180602084015261269e81604085016020870161265e565b601f01601f19169190910160400192915050565b5f602082840312156126c2575f80fd5b5051919050565b600181811c908216806126dd57607f821691505b6020821081036124a057634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612754816126c9565b806020870152604060018084165f81146127755760018114612791576127be565b60ff19851660408a0152604084151560051b8a010195506127be565b895f5260205f205f5b858110156127b55781548b820186015290830190880161279a565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b81810381811115610498576104986127e0565b8082028115828204841417610498576104986127e0565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610498576104986127e0565b5f60208284031215612855575f80fd5b610495826124a6565b5f808335601e19843603018112612873575f80fd5b8301803591506001600160401b0382111561288c575f80fd5b6020019150368190038213156128a0575f80fd5b9250929050565b601f82111561077657805f5260205f20601f840160051c810160208510156128cc5750805b601f840160051c820191505b818110156128eb575f81556001016128d8565b5050505050565b81516001600160401b0381111561290b5761290b6127cc565b61291f8161291984546126c9565b846128a7565b602080601f831160018114612952575f841561293b5750858301515b5f19600386901b1c1916600185901b1785556129a9565b5f85815260208120601f198616915b8281101561298057888601518255948401946001909101908401612961565b508582101561299d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b03811182821017156129d3576129d36127cc565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612a0157612a016127cc565b604052919050565b805180151581146124bc575f80fd5b5f8060408385031215612a29575f80fd5b82516001600160401b0380821115612a3f575f80fd5b9084019060608287031215612a52575f80fd5b612a5a6129b1565b82518152602080840151612a6d8161250b565b82820152604084015183811115612a82575f80fd5b80850194505087601f850112612a96575f80fd5b835183811115612aa857612aa86127cc565b612aba601f8201601f191683016129d9565b93508084528882828701011115612acf575f80fd5b612ade8183860184880161265e565b50826040830152819550612af3818801612a09565b9450505050509250929050565b6001600160401b0381811683821601908082111561263c5761263c6127e0565b6001600160401b03818116838216028082169190828114612b4357612b436127e0565b505092915050565b5f6001600160401b0380841680612b7057634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612b8d81846020870161265e565b9190910192915050565b5f6001600160401b03808316818103612bb257612bb26127e0565b6001019392505050565b5f60208284031215612bcc575f80fd5b813560ff81168114612489575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161374038038061374083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6135f38061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c80638da5cb5b11610093578063bee0a03f11610063578063bee0a03f1461023e578063c151c0b914610251578063d5f20ff614610264578063f2fde38b14610284575f80fd5b80638da5cb5b146101c657806397fb70d41461020a578063a3a65e481461021d578063b771b3bc14610230575f80fd5b8063561404fd116100ce578063561404fd1461016d57806366435abf14610180578063715018a6146101ab5780638994ab49146101b3575f80fd5b80630322ed98146100f45780630cdd098514610109578063467ef06f1461015a575b5f80fd5b610107610102366004612a9d565b610297565b005b610147610117366004612a9d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b610107610168366004612acc565b610455565b61010761017b366004612ae5565b610463565b61019361018e366004612a9d565b610b69565b6040516001600160401b039091168152602001610151565b610107610b7d565b6101476101c1366004612b5f565b610b90565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610151565b610107610218366004612a9d565b610bac565b61010761022b366004612acc565b610bc0565b6101f26005600160991b0181565b61010761024c366004612a9d565b610d78565b61010761025f366004612bb4565b610e87565b610277610272366004612a9d565b610f95565b6040516101519190612bfe565b610107610292366004612cb4565b611088565b5f8181525f805160206135c78339815191526020526040808220815160e0810190925280545f8051602061358783398151915293929190829060ff1660058111156102e4576102e4612bea565b60058111156102f5576102f5612bea565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561036457610364612bea565b146103ce5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103f38584606001515f6110c2565b6040518263ffffffff1660e01b815260040161040f9190612cf8565b6020604051808303815f875af115801561042b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044f9190612d2a565b50505050565b61045e816112df565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206135878339815191529060ff16156105005760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103c5565b5f61050a83611644565b90505f61051a8260400151611825565b90505f853560208701356105316040890189612d41565b6040516020016105449493929190612d8a565b60408051601f1981840301815291905280519091505f5b818110156105d7575f61057160608a018a612daa565b8381811061058157610581612def565b90506020028101906105939190612e03565b61059c90612eb3565b805160208083015160408085015190519495506105bc9489949301612f4a565b60408051601f1981840301815291905293505060010161055b565b50826002836040516105e99190612f99565b602060405180830381855afa158015610604573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906106279190612d2a565b1461068b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103c5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106f29190612d2a565b8760200135146107545760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103c5565b6107616040880188612d41565b90506014146107c55760405162461bcd60e51b815260206004820152603a60248201525f805160206135a783398151915260448201527f746f72206d616e616765722061646472657373206c656e67746800000000000060648201526084016103c5565b306107d36040890189612d41565b6107dc91612faa565b60601c146108355760405162461bcd60e51b815260206004820152603360248201525f805160206135a7833981519152604482015272746f72206d616e61676572206164647265737360681b60648201526084016103c5565b5f6108436060890189612daa565b9050116108a25760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103c5565b5f5b81811015610b50575f6108ba60608a018a612daa565b838181106108ca576108ca612def565b90506020028101906108dc9190612e03565b6108e590612eb3565b604080518b3560208201529081018490529091505f9060029060600160408051601f198184030181529082905261091b91612f99565b602060405180830381855afa158015610936573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109599190612d2a565b82519091508061097b5760405162461bcd60e51b81526004016103c590612fdf565b5f81815260078a016020526040902054156109a85760405162461bcd60e51b81526004016103c590613020565b8260400151516030146109cd5760405162461bcd60e51b81526004016103c590613068565b5f81815260078a0160209081526040808320859055805160e081018252600180825287518285015287840180516001600160401b039081168486015260608401879052905116608083015260a0820185905260c0820185905286855260068e0190935292208251815491929091839160ff1990911690836005811115610a5557610a55612bea565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055610aff82611990565b5082516020808501516040516001600160401b03909116815284917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050506001016108a4565b5050506008909201805460ff1916600117905550505050565b5f610b7382610f95565b6080015192915050565b610b85611a20565b610b8e5f611a7b565b565b5f610b99611a20565b610ba38383611aeb565b90505b92915050565b610bb4611a20565b610bbd81611f5f565b50565b5f805160206135878339815191525f610bd883611644565b90505f80610be98360400151612255565b9150915080610c4b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103c5565b5f82815260058501602052604081208054610c65906130b5565b9050118015610c97575060015f83815260068601602052604090205460ff166005811115610c9557610c95612bea565b145b610cb35760405162461bcd60e51b81526004016103c5906130e7565b5f8281526005850160205260408120610ccb91612a53565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613587833981519152929190610dc0906130b5565b9050118015610df2575060015f83815260068301602052604090205460ff166005811115610df057610df0612bea565b145b610e0e5760405162461bcd60e51b81526004016103c5906130e7565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e47919060040161311b565b6020604051808303815f875af1158015610e63573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045e9190612d2a565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ecb5750825b90505f826001600160401b03166001148015610ee65750303b155b905081158015610ef4575080155b15610f125760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610f3c57845460ff60401b1916600160401b1785555b610f4687876123f6565b8315610f8c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206135c783398151915290528390208351918201909352825491925f8051602061358783398151915292829060ff16600581111561101557611015612bea565b600581111561102657611026612bea565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611090611a20565b6001600160a01b0381166110b957604051631e4fbdf760e01b81525f60048201526024016103c5565b610bbd81611a7b565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561113b576110fb8160016131b9565b6111069060086131cc565b5081515f9083908390811061111d5761111d612def565b60200101906001600160f81b03191690815f1a9053506001016110e7565b505f5b600481101561119e576111528160036131b9565b61115d9060086131cc565b6001901c60f81b826111708360026131e3565b8151811061118057611180612def565b60200101906001600160f81b03191690815f1a90535060010161113e565b505f5b6020811015611200576111b581601f6131b9565b6111c09060086131cc565b86901c60f81b826111d28360066131e3565b815181106111e2576111e2612def565b60200101906001600160f81b03191690815f1a9053506001016111a1565b505f5b600881101561126b576112178160076131b9565b6112229060086131cc565b6001600160401b038616901c60f81b8261123d8360266131e3565b8151811061124d5761124d612def565b60200101906001600160f81b03191690815f1a905350600101611203565b505f5b60088110156112d6576112828160076131b9565b61128d9060086131cc565b6001600160401b038516901c60f81b826112a883602e6131e3565b815181106112b8576112b8612def565b60200101906001600160f81b03191690815f1a90535060010161126e565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206135878339815191525f61132e85611644565b90505f8061133f8360400151612255565b9150915080156113a45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103c5565b5f828152600685016020526040808220815160e081019092528054829060ff1660058111156113d5576113d5612bea565b60058111156113e6576113e6612bea565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561145757611457612bea565b1480611475575060018251600581111561147357611473612bea565b145b6114c15760405162461bcd60e51b815260206004820152602a60248201525f805160206135a7833981519152604482015269746f722073746174757360b01b60648201526084016103c5565b6003825160058111156114d6576114d6612bea565b036114e3575060046114e7565b5060055b6020808301515f9081526007880190915260408120558181600581111561151057611510612bea565b9081600581111561152357611523612bea565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561155757611557612bea565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561160b5761160b612bea565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830181905292820152905f805160206135878339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156116b9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116e09190810190613205565b91509150806117475760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103c5565b82548251146117aa5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103c5565b60208201516001600160a01b03161561181d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103c5565b509392505050565b5f81516026146118475760405162461bcd60e51b81526004016103c5906132d7565b5f805b60028110156118965761185e8160016131b9565b6118699060086131cc565b61ffff1684828151811061187f5761187f612def565b016020015160f81c901b919091179060010161184a565b5061ffff8116156118b95760405162461bcd60e51b81526004016103c590613320565b5f805b6004811015611914576118d08160036131b9565b6118db9060086131cc565b63ffffffff16856118ed8360026131e3565b815181106118fd576118fd612def565b016020015160f81c901b91909117906001016118bc565b5063ffffffff811660051461193b5760405162461bcd60e51b81526004016103c590613363565b5f805b60208110156112d65761195281601f6131b9565b61195d9060086131cc565b866119698360066131e3565b8151811061197957611979612def565b016020015160f81c901b919091179060010161193e565b5f8181525f805160206135c78339815191526020526040812060020180545f8051602061358783398151915291600160401b9091046001600160401b03169060086119da836133aa565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b33611a527f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b8e5760405163118cdaa760e01b81523360048201526024016103c5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16611b765760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103c5565b5f8051602061358783398151915242611b9560408601602087016133cf565b6001600160401b0316118015611bce5750611bb660408501602086016133cf565b6001600160401b0316611bcc426202a3006131e3565b115b611c305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103c5565b8335611c4e5760405162461bcd60e51b81526004016103c590612fdf565b83355f90815260078201602052604090205415611c7d5760405162461bcd60e51b81526004016103c590613020565b611c8a6040850185612d41565b9050603014611cab5760405162461bcd60e51b81526004016103c590613068565b611cb483612414565b5f80611d4e6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611cf991906133cf565b6001600160401b03168152602001611d1460408a018a612d41565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506125b5565b5f82815260058601602052604090209193509150611d6c8282613433565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d99908590600401612cf8565b6020604051808303815f875af1158015611db5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd99190612d2a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115611e5157611e51612bea565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f31918e01908e016133cf565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206135c78339815191526020526040808220815160e0810190925280545f8051602061358783398151915293929190829060ff166005811115611fac57611fac612bea565b6005811115611fbd57611fbd612bea565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561202f5761202f612bea565b1461208b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103c5565b6120988160800151612414565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156120dc576120dc612bea565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121918461218b81611990565b5f6110c2565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906121c0908590600401612cf8565b6020604051808303815f875af11580156121dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122009190612d2a565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146122785760405162461bcd60e51b81526004016103c5906132d7565b5f805b60028110156122c75761228f8160016131b9565b61229a9060086131cc565b61ffff168582815181106122b0576122b0612def565b016020015160f81c901b919091179060010161227b565b5061ffff8116156122ea5760405162461bcd60e51b81526004016103c590613320565b5f805b6004811015612345576123018160036131b9565b61230c9060086131cc565b63ffffffff168661231e8360026131e3565b8151811061232e5761232e612def565b016020015160f81c901b91909117906001016122ed565b5063ffffffff811660021461236c5760405162461bcd60e51b81526004016103c590613363565b5f805b60208110156123c15761238381601f6131b9565b61238e9060086131cc565b8761239a8360066131e3565b815181106123aa576123aa612def565b016020015160f81c901b919091179060010161236f565b505f866026815181106123d6576123d6612def565b016020015191976001600160f81b03199092161515965090945050505050565b6123fe61295a565b612407826129a3565b612410816129bc565b5050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206135878339815191529060ff165f03612452575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061249a90836131b9565b106124b6576001600160401b03841660408301528082526124d5565b83826040018181516124c891906134f2565b6001600160401b03169052505b5f8260200151836040015160646124ec9190613512565b6124f69190613535565b600285015490915060ff90811690821611156125715760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103c5565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f606082608001515160301461261f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103c5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612696576126568160016131b9565b6126619060086131cc565b5081515f9083908390811061267857612678612def565b60200101906001600160f81b03191690815f1a905350600101612642565b505f5b60048110156126f4576126ad8160036131b9565b6126b89060086131cc565b505f826126c68360026131e3565b815181106126d6576126d6612def565b60200101906001600160f81b03191690815f1a905350600101612699565b505f5b6020811015612751578451816020811061271357612713612def565b1a60f81b826127238360066131e3565b8151811061273357612733612def565b60200101906001600160f81b03191690815f1a9053506001016126f7565b505f5b60208110156127b1578460200151816020811061277357612773612def565b1a60f81b826127838360266131e3565b8151811061279357612793612def565b60200101906001600160f81b03191690815f1a905350600101612754565b505f5b6008811015612825576127c88160076131b9565b6127d39060086131cc565b60ff1685604001516001600160401b0316901c60f81b828260466127f791906131e3565b8151811061280757612807612def565b60200101906001600160f81b03191690815f1a9053506001016127b4565b505f5b6030811015612890578460800151818151811061284757612847612def565b01602001516001600160f81b0319168261286283604e6131e3565b8151811061287257612872612def565b60200101906001600160f81b03191690815f1a905350600101612828565b505f5b6008811015612902576128a78160076131b9565b6128b29060086131cc565b60608601516001600160401b0390811691161c60f81b826128d483607e6131e3565b815181106128e4576128e4612def565b60200101906001600160f81b03191690815f1a905350600101612893565b506002816040516129139190612f99565b602060405180830381855afa15801561292e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129519190612d2a565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b8e57604051631afcd79f60e31b815260040160405180910390fd5b6129ab61295a565b6129b36129cd565b610bbd816129d5565b6129c461295a565b610bbd81612a4b565b610b8e61295a565b6129dd61295a565b80355f8051602061358783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612a276060830160408401613566565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b61109061295a565b508054612a5f906130b5565b5f825580601f10612a6e575050565b601f0160209004905f5260205f2090810190610bbd91905b80821115612a99575f8155600101612a86565b5090565b5f60208284031215612aad575f80fd5b5035919050565b803563ffffffff81168114612ac7575f80fd5b919050565b5f60208284031215612adc575f80fd5b610ba382612ab4565b5f8060408385031215612af6575f80fd5b82356001600160401b03811115612b0b575f80fd5b830160808186031215612b1c575f80fd5b9150612b2a60208401612ab4565b90509250929050565b5f60608284031215612b43575f80fd5b50919050565b80356001600160401b0381168114612ac7575f80fd5b5f8060408385031215612b70575f80fd5b82356001600160401b03811115612b85575f80fd5b612b9185828601612b33565b925050612b2a60208401612b49565b6001600160a01b0381168114610bbd575f80fd5b5f8060808385031215612bc5575f80fd5b612bcf8484612b33565b91506060830135612bdf81612ba0565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612c2157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612c5c60608401826001600160401b03169052565b506080830151612c7760808401826001600160401b03169052565b5060a0830151612c9260a08401826001600160401b03169052565b5060c0830151612cad60c08401826001600160401b03169052565b5092915050565b5f60208284031215612cc4575f80fd5b8135612ccf81612ba0565b9392505050565b5f5b83811015612cf0578181015183820152602001612cd8565b50505f910152565b602081525f8251806020840152612d16816040850160208701612cd6565b601f01601f19169190910160400192915050565b5f60208284031215612d3a575f80fd5b5051919050565b5f808335601e19843603018112612d56575f80fd5b8301803591506001600160401b03821115612d6f575f80fd5b602001915036819003821315612d83575f80fd5b9250929050565b848152836020820152818360408301375f91016040019081529392505050565b5f808335601e19843603018112612dbf575f80fd5b8301803591506001600160401b03821115612dd8575f80fd5b6020019150600581901b3603821315612d83575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612e17575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612e5757612e57612e21565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e8557612e85612e21565b604052919050565b5f6001600160401b03821115612ea557612ea5612e21565b50601f01601f191660200190565b5f60608236031215612ec3575f80fd5b612ecb612e35565b823581526020612edc818501612b49565b8183015260408401356001600160401b03811115612ef8575f80fd5b840136601f820112612f08575f80fd5b8035612f1b612f1682612e8d565b612e5d565b8181523684838501011115612f2e575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551612f5b818460208a01612cd6565b80830190508581526001600160401b0360c01b8560c01b1660208201528351612f8b816028840160208801612cd6565b016028019695505050505050565b5f8251612e17818460208701612cd6565b6bffffffffffffffffffffffff198135818116916014851015612fd75780818660140360031b1b83161692505b505092915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b600181811c908216806130c957607f821691505b602082108103612b4357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201525f805160206135a78339815191526040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461312d816130b5565b806020870152604060018084165f811461314e576001811461316a57613197565b60ff19851660408a0152604084151560051b8a01019550613197565b895f5260205f205f5b8581101561318e5781548b8201860152908301908801613173565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610ba657610ba66131a5565b8082028115828204841417610ba657610ba66131a5565b80820180821115610ba657610ba66131a5565b80518015158114612ac7575f80fd5b5f8060408385031215613216575f80fd5b82516001600160401b038082111561322c575f80fd5b908401906060828703121561323f575f80fd5b613247612e35565b8251815260208084015161325a81612ba0565b8282015260408401518381111561326f575f80fd5b80850194505087601f850112613283575f80fd5b83519250613293612f1684612e8d565b83815288828587010111156132a6575f80fd5b6132b584838301848801612cd6565b806040840152508195506132ca8188016131f6565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b038083168181036133c5576133c56131a5565b6001019392505050565b5f602082840312156133df575f80fd5b610ba382612b49565b601f82111561045e57805f5260205f20601f840160051c8101602085101561340d5750805b601f840160051c820191505b8181101561342c575f8155600101613419565b5050505050565b81516001600160401b0381111561344c5761344c612e21565b6134608161345a84546130b5565b846133e8565b602080601f831160018114613493575f841561347c5750858301515b5f19600386901b1c1916600185901b1785556134ea565b5f85815260208120601f198616915b828110156134c1578886015182559484019460019091019084016134a2565b50858210156134de57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115612cad57612cad6131a5565b6001600160401b03818116838216028082169190828114612fd757612fd76131a5565b5f6001600160401b038084168061355a57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f60208284031215613576575f80fd5b813560ff81168114612ccf575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0056616c696461746f724d616e616765723a20696e76616c69642076616c696461e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -292,7 +306,7 @@ func (_PoAValidatorManager *PoAValidatorManagerCallerSession) ActiveValidators(n // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) func (_PoAValidatorManager *PoAValidatorManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { var out []interface{} err := _PoAValidatorManager.contract.Call(opts, &out, "getValidator", validationID) @@ -309,14 +323,14 @@ func (_PoAValidatorManager *PoAValidatorManagerCaller) GetValidator(opts *bind.C // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) func (_PoAValidatorManager *PoAValidatorManagerSession) GetValidator(validationID [32]byte) (Validator, error) { return _PoAValidatorManager.Contract.GetValidator(&_PoAValidatorManager.CallOpts, validationID) } // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,address,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) func (_PoAValidatorManager *PoAValidatorManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { return _PoAValidatorManager.Contract.GetValidator(&_PoAValidatorManager.CallOpts, validationID) } @@ -488,6 +502,27 @@ func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeVali return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, registrationInput, weight) } +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorSet(&_PoAValidatorManager.TransactOpts, subnetConversionData, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorSet(&_PoAValidatorManager.TransactOpts, subnetConversionData, messageIndex) +} + // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. // // Solidity: function renounceOwnership() returns() @@ -572,6 +607,160 @@ func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) TransferOwners return _PoAValidatorManager.Contract.TransferOwnership(&_PoAValidatorManager.TransactOpts, newOwner) } +// PoAValidatorManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitialValidatorCreatedIterator struct { + Event *PoAValidatorManagerInitialValidatorCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitialValidatorCreated struct { + ValidationID [32]byte + NodeID [32]byte + Weight *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*PoAValidatorManagerInitialValidatorCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerInitialValidatorCreatedIterator{contract: _PoAValidatorManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil +} + +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerInitialValidatorCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*PoAValidatorManagerInitialValidatorCreated, error) { + event := new(PoAValidatorManagerInitialValidatorCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // PoAValidatorManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the PoAValidatorManager contract. type PoAValidatorManagerInitializedIterator struct { Event *PoAValidatorManagerInitialized // Event containing the contract specifics and raw log From b7f267720137414caa73f3137b52f56026869c63 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 13 Sep 2024 15:16:01 -0400 Subject: [PATCH 278/545] bug fixes --- contracts/staking/ValidatorManager.sol | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 04c8b0cce..cfa1bac41 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -122,8 +122,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida subnetConversionData.blockchainID, subnetConversionData.validatorManagerAddress ); - uint256 length = encodedConversion.length; - for (uint256 i; i < length; i++) { + uint256 numInitialValidators = subnetConversionData.initialValidators.length; + for (uint256 i; i < numInitialValidators; i++) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; encodedConversion = abi.encodePacked( encodedConversion, @@ -156,7 +156,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ); // Insert the initial validators into the storage. - for (uint256 i; i < length; i++) { + for (uint256 i; i < numInitialValidators; i++) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; bytes32 validationID = sha256(abi.encodePacked(subnetConversionData.convertSubnetTxID, i)); @@ -173,7 +173,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida $._activeValidators[nodeID] = validationID; $._validationPeriods[validationID] = Validator({ - status: ValidatorStatus.PendingAdded, + status: ValidatorStatus.Active, nodeID: initialValidator.nodeID, startingWeight: initialValidator.weight, messageNonce: 0, @@ -181,8 +181,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida startedAt: 0, // The validation period only starts once the registration is acknowledged. endedAt: 0 }); - // Increment the nonce since these validations are completed. - _incrementAndGetNonce(validationID); + emit InitialValidatorCreated( validationID, initialValidator.nodeID, initialValidator.weight ); From ba9024cc0e353c60f3e9c31c934cefdec56b185d Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 13 Sep 2024 18:45:28 -0400 Subject: [PATCH 279/545] Fix most unit tests --- .../tests/ERC20TokenStakingManagerTests.t.sol | 20 ++++++++--------- .../NativeTokenStakingManagerTests.t.sol | 20 ++++++++--------- .../tests/PoSValidatorManagerTests.t.sol | 22 +++++++++++++------ 3 files changed, 35 insertions(+), 27 deletions(-) diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 44c8538d4..9543004e6 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -65,8 +65,8 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: 0, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, @@ -88,8 +88,8 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: minimumDelegationFeeBips, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, @@ -110,8 +110,8 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeAmount: DEFAULT_MAXIMUM_STAKE, - maximumStakeAmount: DEFAULT_MINIMUM_STAKE, + minimumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, @@ -132,8 +132,8 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: 0, @@ -155,8 +155,8 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: maximumStakeMultiplier, diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index db74824d8..e4d3dc83f 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -57,8 +57,8 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: 0, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, @@ -79,8 +79,8 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: minimumDelegationFeeBips, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, @@ -100,8 +100,8 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeAmount: DEFAULT_MAXIMUM_STAKE, - maximumStakeAmount: DEFAULT_MINIMUM_STAKE, + minimumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, @@ -121,8 +121,8 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: 0, @@ -143,8 +143,8 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE }), - minimumStakeAmount: DEFAULT_MINIMUM_STAKE, - maximumStakeAmount: DEFAULT_MAXIMUM_STAKE, + minimumStakeAmount: DEFAULT_MINIMUM_STAKE_AMOUNT, + maximumStakeAmount: DEFAULT_MAXIMUM_STAKE_AMOUNT, minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: maximumStakeMultiplier, diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index ab3304ce8..69eec67db 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -26,8 +26,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_EXPIRY; address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); - uint256 public constant DEFAULT_MINIMUM_STAKE = 1e6; - uint256 public constant DEFAULT_MAXIMUM_STAKE = 1e20; uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint16 public constant DEFAULT_MINIMUM_DELEGATION_FEE_BIPS = 100; uint8 public constant DEFAULT_MAXIMUM_STAKE_MULTIPLIER = 4; @@ -77,7 +75,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); vm.expectRevert(_formatErrorMessage("invalid delegation fee")); - _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE); + _initializeValidatorRegistration( + registrationInput, requirements, DEFAULT_MINIMUM_STAKE_AMOUNT + ); } function testDelegationFeeBipsTooHigh() public { @@ -91,7 +91,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); vm.expectRevert(_formatErrorMessage("invalid delegation fee")); - _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE); + _initializeValidatorRegistration( + registrationInput, requirements, DEFAULT_MINIMUM_STAKE_AMOUNT + ); } function testInvalidMinStakeDuration() public { @@ -105,7 +107,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); vm.expectRevert(_formatErrorMessage("invalid min stake duration")); - _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE); + _initializeValidatorRegistration( + registrationInput, requirements, DEFAULT_MINIMUM_STAKE_AMOUNT + ); } function testStakeAmountTooLow() public { @@ -119,7 +123,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); vm.expectRevert(_formatErrorMessage("stake amount too low")); - _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MINIMUM_STAKE - 1); + _initializeValidatorRegistration( + registrationInput, requirements, DEFAULT_MINIMUM_STAKE_AMOUNT - 1 + ); } function testStakeAmountTooHigh() public { @@ -133,7 +139,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); vm.expectRevert(_formatErrorMessage("stake amount too high")); - _initializeValidatorRegistration(registrationInput, requirements, DEFAULT_MAXIMUM_STAKE + 1); + _initializeValidatorRegistration( + registrationInput, requirements, DEFAULT_MAXIMUM_STAKE_AMOUNT + 1 + ); } function testInvalidInitializeEndTime() public { From 58d58035f573f95e0176588a8e335de66962008d Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 13 Sep 2024 18:58:37 -0400 Subject: [PATCH 280/545] Fix all unit tests --- .../tests/ERC20TokenStakingManagerTests.t.sol | 12 ------------ .../tests/NativeTokenStakingManagerTests.t.sol | 12 ------------ .../staking/tests/PoAValidatorManagerTests.t.sol | 8 -------- .../staking/tests/ValidatorManagerTests.t.sol | 14 ++++++++++++-- 4 files changed, 12 insertions(+), 34 deletions(-) diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 9543004e6..0a2e18b0c 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -244,18 +244,6 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(address(token), abi.encodeCall(IERC20.transfer, (account, amount))); } - // 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 - function _valueToWeight(uint256 value) internal virtual override 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 - // to the contract and use vm.expectRevert at the same time - function _weightToValue(uint64 weight) internal virtual override returns (uint256) { - return uint256(weight) * 1e12; - } - function _getStakeAssetBalance(address account) internal view override returns (uint256) { return token.balanceOf(account); } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index e4d3dc83f..145fc45ac 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -196,18 +196,6 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(account, amount, ""); } - // 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 - function _valueToWeight(uint256 value) internal virtual override 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 - // to the contract and use vm.expectRevert at the same time - function _weightToValue(uint64 weight) internal virtual override returns (uint256) { - return uint256(weight) * 1e12; - } - function _getStakeAssetBalance(address account) internal view override returns (uint256) { return account.balance; } diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index ab1aeb2ad..7ef076bb1 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -60,12 +60,4 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { // solhint-disable-next-line no-empty-blocks function _beforeSend(uint256 amount, address spender) internal virtual override {} - - function _valueToWeight(uint256 value) internal virtual override returns (uint64) { - return uint64(value); - } - - function _weightToValue(uint64 weight) internal virtual override returns (uint256) { - return uint256(weight); - } } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index ebc9477a9..16dcf3b5a 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -415,8 +415,18 @@ abstract contract ValidatorManagerTest is Test { function _beforeSend(uint256 amount, address spender) internal virtual; - function _weightToValue(uint64 weight) internal virtual returns (uint256); + // 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. + function _valueToWeight(uint256 value) internal returns (uint64) { + return uint64(value / 1e12); + } - function _valueToWeight(uint256 value) internal virtual returns (uint64); + // 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. + function _weightToValue(uint64 weight) internal returns (uint256) { + return uint256(weight) * 1e12; + } } // solhint-enable no-empty-blocks From 22a0a8c526d2693c354e581c775a754398e6de33 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 13 Sep 2024 19:38:02 -0400 Subject: [PATCH 281/545] Fix e2e tests --- tests/flows/staking/poa_to_pos.go | 4 ++-- tests/utils/staking.go | 20 ++++++++++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index f1865f794..dd402ff02 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -147,8 +147,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnetAInfo.SubnetID, - ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(20), + ChurnPeriodSeconds: utils.DefaultChurnPeriodSeconds, + MaximumChurnPercentage: utils.DefaultMaxChurnPercentage, }, MinimumStakeAmount: big.NewInt(0).SetUint64(utils.DefaultMinStakeAmount), MaximumStakeAmount: big.NewInt(0).SetUint64(utils.DefaultMaxStakeAmount), diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 96b9443fe..18328bef2 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -32,6 +32,8 @@ const ( DefaultMinStakeAmount uint64 = 1e18 DefaultMaxStakeAmount uint64 = 10e18 DefaultMaxStakeMultiplier uint8 = 4 + DefaultMaxChurnPercentage uint8 = 20 + DefaultChurnPeriodSeconds uint64 = 1 ) // @@ -77,13 +79,15 @@ func DeployAndInitializeNativeTokenStakingManager( BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnet.SubnetID, - ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(20), + ChurnPeriodSeconds: DefaultChurnPeriodSeconds, + MaximumChurnPercentage: DefaultMaxChurnPercentage, }, - MinimumStakeAmount: BigIntMul(big.NewInt(1e6), big.NewInt(1e12)), - MaximumStakeAmount: BigIntMul(big.NewInt(10e6), big.NewInt(1e12)), - MinimumStakeDuration: uint64(24 * time.Hour.Seconds()), - RewardCalculator: common.Address{}, + MinimumStakeAmount: big.NewInt(0).SetUint64(DefaultMinStakeAmount), + MaximumStakeAmount: big.NewInt(0).SetUint64(DefaultMaxStakeAmount), + MinimumStakeDuration: DefaultMinStakeDurationSeconds, + MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, + MaximumStakeMultiplier: DefaultMaxStakeMultiplier, + RewardCalculator: common.Address{}, }, ) Expect(err).Should(BeNil()) @@ -138,8 +142,8 @@ func DeployAndInitializeERC20TokenStakingManager( BaseSettings: erc20tokenstakingmanager.ValidatorManagerSettings{ PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnet.SubnetID, - ChurnPeriodSeconds: uint64(0), - MaximumChurnPercentage: uint8(20), + ChurnPeriodSeconds: DefaultChurnPeriodSeconds, + MaximumChurnPercentage: DefaultMaxChurnPercentage, }, MinimumStakeAmount: big.NewInt(0).SetUint64(DefaultMinStakeAmount), MaximumStakeAmount: big.NewInt(0).SetUint64(DefaultMaxStakeAmount), From 0c6713314f527da625246a4215c9a94ab8567f34 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 13 Sep 2024 19:51:32 -0400 Subject: [PATCH 282/545] Review fixes --- .../ERC20TokenStakingManager.go | 66 ++++++++++++++++++- .../NativeTokenStakingManager.go | 66 ++++++++++++++++++- .../PoAValidatorManager.go | 66 ++++++++++++++++++- contracts/staking/PoSValidatorManager.sol | 4 +- contracts/staking/ValidatorManager.sol | 14 ++-- 5 files changed, 200 insertions(+), 16 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index bad0a3e33..a536044ab 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -75,8 +75,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161524c38038061524c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150ff8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806366435abf116100a9578063a3a65e481161006e578063a3a65e48146102b0578063b771b3bc146102c3578063ba3a4b97146102e9578063bee0a03f146102fc578063d5f20ff61461030f575f80fd5b806366435abf1461025157806376f786211461026457806398f3e2b4146102775780639e1bc4ef1461028a578063a13fd29d1461029d575f80fd5b8063330a0a3a116100ef578063330a0a3a146101e957806335455ded146101fc578063467ef06f146102185780635297fae61461022b578063620658561461023e575f80fd5b80630118acc41461012b5780630322ed98146101405780630cdd098514610153578063151d30d1146101a45780632e2194d8146101be575b5f80fd5b61013e610139366004614602565b61032f565b005b61013e61014e36600461463d565b6107a7565b61019161016136600461463d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101ac600a81565b60405160ff909116815260200161019b565b6101d16101cc36600461463d565b610977565b6040516001600160401b03909116815260200161019b565b61013e6101f7366004614668565b61098d565b61020561271081565b60405161ffff909116815260200161019b565b61013e6102263660046146a6565b610a6c565b61013e6102393660046146bf565b610a97565b61019161024c3660046146fb565b610c67565b6101d161025f36600461463d565b610c80565b61013e610272366004614602565b610c94565b61013e6102853660046146bf565b610d74565b610191610298366004614716565b610f83565b6101916102ab366004614736565b610f96565b61013e6102be3660046146a6565b610fc2565b6102d16005600160991b0181565b6040516001600160a01b03909116815260200161019b565b61013e6102f736600461463d565b61117f565b61013e61030a36600461463d565b611405565b61032261031d36600461463d565b611519565b60405161019b91906147ab565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206150538339815191529184156103815761037e82856115f8565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103b3576103b3614797565b60048111156103c4576103c4614797565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561044b5761044b614797565b1461049d5760405162461bcd60e51b815260206004820152602a60248201525f805160206150738339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105025760405162461bcd60e51b815260206004820152603360248201525f805160206150738339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610494565b5f61050c84611894565b905061051b8260600151611916565b600382526001600160401b0342811660a0840152811660e08301525f88815260068601602052604090208251815484929190829060ff1916600183600481111561056757610567614797565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61063985611519565b905082606001516001600160401b03168160a001516001600160401b0316116106b05760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610494565b5f83606001518260a001516106c59190614899565b90506106d18682611923565b5f6005600160991b0163ee5b48eb6106ea89878661196b565b6040518263ffffffff1660e01b815260040161070691906148db565b6020604051808303815f875af1158015610722573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610746919061490d565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206150d383398151915260205260408082208151610100810190925280545f8051602061509383398151915293929190829060ff1660058111156107f5576107f5614797565b600581111561080657610806614797565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561088b5761088b614797565b146108f05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610494565b6005600160991b016001600160a01b031663ee5b48eb6109158584608001515f61196b565b6040518263ffffffff1660e01b815260040161093191906148db565b6020604051808303815f875af115801561094d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610971919061490d565b50505050565b5f61098764e8d4a5100083614924565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109d6575080546001600160401b03808416911610155b156109f45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a1f8484611b88565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a7682611ba2565b9050610a9381606001516001600160401b03168260400151611f15565b5050565b5f805160206150538339815191525f610aaf84611f4b565b90505f80610ac0836040015161212c565b50915091505f610acf83611519565b9050816001600160401b031681608001516001600160401b03161015610b075760405162461bcd60e51b815260040161049490614943565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b4c5760405162461bcd60e51b815260040161049490614985565b60015f87815260068701602052604090205460ff166004811115610b7257610b72614797565b14610bdb5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610494565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109876001600160401b03831664e8d4a510006149ce565b5f610c8a82611519565b60a0015192915050565b5f805160206150538339815191525f610cac85611519565b5f86815260058401602052604090205460c0820151919250610cde91620100009091046001600160401b0316906149e5565b6001600160401b0316421015610d525760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610494565b8315610d6457610d6285846115f8565b505b610d6d85612367565b5050505050565b5f805160206150538339815191525f610d8c84611f4b565b90505f80610d9d836040015161212c565b50915091505f610dac83611519565b9050816001600160401b031681608001516001600160401b03161015610de45760405162461bcd60e51b815260040161049490614943565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e225760405162461bcd60e51b815260040161049490614985565b60035f87815260068701602052604090205460ff166004811115610e4857610e48614797565b14610e9c5760405162461bcd60e51b815260206004820152603160248201525f805160206150738339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610494565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f4191611f15565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f8f833384612705565b9392505050565b5f610f9f612b03565b610faa848484612b3a565b9050610f8f60015f805160206150b383398151915255565b5f805160206150938339815191525f610fda83611f4b565b90505f80610feb8360400151612d73565b915091508061104d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610494565b5f8281526007850160205260408120805461106790614a05565b9050118015611099575060015f83815260088601602052604090205460ff16600581111561109757611097614797565b145b6110b55760405162461bcd60e51b815260040161049490614a3d565b5f82815260078501602052604081206110cd9161454a565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061505383398151915293929190829060ff1660048111156111e0576111e0614797565b60048111156111f1576111f1614797565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561127857611278614797565b1480611296575060038151600481111561129457611294614797565b145b6112ea5760405162461bcd60e51b815260206004820152603260248201525f80516020615073833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610494565b5f6112f88260400151611519565b905080608001516001600160401b03165f0361137c5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610494565b6005600160991b016001600160a01b031663ee5b48eb6113a9846040015184608001518560a0015161196b565b6040518263ffffffff1660e01b81526004016113c591906148db565b6020604051808303815f875af11580156113e1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6d919061490d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061509383398151915292919061144d90614a05565b905011801561147f575060015f83815260088301602052604090205460ff16600581111561147d5761147d614797565b145b61149b5760405162461bcd60e51b815260040161049490614a3d565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114d49190600401614a84565b6020604051808303815f875af11580156114f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611514919061490d565b505050565b611521614581565b5f8281525f805160206150d38339815191526020526040908190208151610100810190925280545f80516020615093833981519152929190829060ff16600581111561156f5761156f614797565b600581111561158057611580614797565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611643573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261166a9190810190614b85565b91509150806116cd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610494565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611710573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611734919061490d565b8251146117985760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610494565b60208201516001600160a01b03161561180e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610494565b5f8061181d8460400151612f14565b9150915081871461188a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610494565b9695505050505050565b5f8181525f805160206150d38339815191526020526040812060030180545f80516020615093833981519152916001600160401b0390911690836118d783614c6d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611920815f6130ec565b50565b5f9182525f805160206150d3833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119e4576119a4816001614c92565b6119af9060086149ce565b5081515f908390839081106119c6576119c6614ca5565b60200101906001600160f81b03191690815f1a905350600101611990565b505f5b6004811015611a47576119fb816003614c92565b611a069060086149ce565b6001901c60f81b82611a19836002614cb9565b81518110611a2957611a29614ca5565b60200101906001600160f81b03191690815f1a9053506001016119e7565b505f5b6020811015611aa957611a5e81601f614c92565b611a699060086149ce565b86901c60f81b82611a7b836006614cb9565b81518110611a8b57611a8b614ca5565b60200101906001600160f81b03191690815f1a905350600101611a4a565b505f5b6008811015611b1457611ac0816007614c92565b611acb9060086149ce565b6001600160401b038616901c60f81b82611ae6836026614cb9565b81518110611af657611af6614ca5565b60200101906001600160f81b03191690815f1a905350600101611aac565b505f5b6008811015611b7f57611b2b816007614c92565b611b369060086149ce565b6001600160401b038516901c60f81b82611b5183602e614cb9565b81518110611b6157611b61614ca5565b60200101906001600160f81b03191690815f1a905350600101611b17565b50949350505050565b611b90613308565b611b9982613353565b610a93816133bf565b611baa614581565b5f805160206150938339815191525f611bc284611f4b565b90505f80611bd38360400151612d73565b915091508015611c385760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610494565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611c6a57611c6a614797565b6005811115611c7b57611c7b614797565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d0257611d02614797565b1480611d205750600182516005811115611d1e57611d1e614797565b145b611d7f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610494565b600382516005811115611d9457611d94614797565b03611da157506004611da5565b5060055b6020808301515f90815260098801909152604081205581816005811115611dce57611dce614797565b90816005811115611de157611de1614797565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611e1557611e15614797565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ee057611ee0614797565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a93906001600160a01b03168284613473565b60408051606080820183525f8083526020830181905292820152905f805160206150938339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fc0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fe79190810190614b85565b915091508061204e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610494565b82548251146120b15760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610494565b60208201516001600160a01b0316156121245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610494565b509392505050565b5f805f83516036146121505760405162461bcd60e51b815260040161049490614ccc565b5f805b600281101561219f57612167816001614c92565b6121729060086149ce565b61ffff1686828151811061218857612188614ca5565b016020015160f81c901b9190911790600101612153565b5061ffff8116156121c25760405162461bcd60e51b815260040161049490614d15565b5f805b600481101561221d576121d9816003614c92565b6121e49060086149ce565b63ffffffff16876121f6836002614cb9565b8151811061220657612206614ca5565b016020015160f81c901b91909117906001016121c5565b5063ffffffff81166003146122445760405162461bcd60e51b815260040161049490614d58565b5f805b60208110156122995761225b81601f614c92565b6122669060086149ce565b88612272836006614cb9565b8151811061228257612282614ca5565b016020015160f81c901b9190911790600101612247565b505f805b60088110156122f8576122b1816007614c92565b6122bc9060086149ce565b6001600160401b0316896122d1836026614cb9565b815181106122e1576122e1614ca5565b016020015160f81c901b919091179060010161229d565b505f805b600881101561235757612310816007614c92565b61231b9060086149ce565b6001600160401b03168a61233083602e614cb9565b8151811061234057612340614ca5565b016020015160f81c901b91909117906001016122fc565b5091989097509095509350505050565b5f8181525f805160206150d383398151915260205260408082208151610100810190925280545f8051602061509383398151915293929190829060ff1660058111156123b5576123b5614797565b60058111156123c6576123c6614797565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561244e5761244e614797565b146124aa5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610494565b60408101516001600160a01b0316336001600160a01b0316146125245760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610494565b6125318160a00151611916565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561257557612575614797565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126418461263b81611894565b5f61196b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126709085906004016148db565b6020604051808303815f875af115801561268c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126b0919061490d565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61270e612b03565b5f805160206150538339815191525f6127296101cc856134d2565b90505f61273587611519565b905060028151600581111561274c5761274c614797565b146127ab5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610494565b6127b482613508565b5f828260a001516127c591906149e5565b600485015460608401519192506127e7916001600160401b0390911690614d9f565b6001600160401b0316816001600160401b031611156128665760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610494565b6128708882611923565b5f61287a89611894565b90505f89826040516020016128a692919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6128e08d868861196b565b6040518263ffffffff1660e01b81526004016128fc91906148db565b6020604051808303815f875af1158015612918573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061293c919061490d565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156129c4576129c4614797565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610f8f60015f805160206150b383398151915255565b5f805160206150b3833981519152805460011901612b3457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615053833981519152906001600160401b0316612b8660408601602087016146fb565b6001600160401b03161015612bf55760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610494565b6003810154612c076020860186614dd9565b61ffff1610158015612c2b5750612710612c246020860186614dd9565b61ffff1611155b612c475760405162461bcd60e51b815260040161049490614df4565b8054831015612caa5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610494565b8060010154831115612d115760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610494565b5f612d1b846134d2565b90505f612d2782610977565b90505f612d348883613513565b5f81815260058601602052604090209091508790612d528282614e3f565b509098975050505050505050565b60015f805160206150b383398151915255565b5f808251602714612d965760405162461bcd60e51b815260040161049490614ccc565b5f805b6002811015612de557612dad816001614c92565b612db89060086149ce565b61ffff16858281518110612dce57612dce614ca5565b016020015160f81c901b9190911790600101612d99565b5061ffff811615612e085760405162461bcd60e51b815260040161049490614d15565b5f805b6004811015612e6357612e1f816003614c92565b612e2a9060086149ce565b63ffffffff1686612e3c836002614cb9565b81518110612e4c57612e4c614ca5565b016020015160f81c901b9190911790600101612e0b565b5063ffffffff8116600214612e8a5760405162461bcd60e51b815260040161049490614d58565b5f805b6020811015612edf57612ea181601f614c92565b612eac9060086149ce565b87612eb8836006614cb9565b81518110612ec857612ec8614ca5565b016020015160f81c901b9190911790600101612e8d565b505f86602681518110612ef457612ef4614ca5565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612f375760405162461bcd60e51b815260040161049490614ccc565b5f805b6002811015612f8657612f4e816001614c92565b612f599060086149ce565b61ffff16858281518110612f6f57612f6f614ca5565b016020015160f81c901b9190911790600101612f3a565b5061ffff811615612fa95760405162461bcd60e51b815260040161049490614d15565b5f805b600481101561300457612fc0816003614c92565b612fcb9060086149ce565b63ffffffff1686612fdd836002614cb9565b81518110612fed57612fed614ca5565b016020015160f81c901b9190911790600101612fac565b5063ffffffff811660041461302b5760405162461bcd60e51b815260040161049490614d58565b5f805b60208110156130805761304281601f614c92565b61304d9060086149ce565b87613059836006614cb9565b8151811061306957613069614ca5565b016020015160f81c901b919091179060010161302e565b505f805b60088110156130df57613098816007614c92565b6130a39060086149ce565b6001600160401b0316886130b8836026614cb9565b815181106130c8576130c8614ca5565b016020015160f81c901b9190911790600101613084565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061509383398151915290600160401b900460ff165f0361313257505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b0316606082015242911580613194575060028301548151613190916001600160401b031690614cb9565b8210155b156131ba576001600160401b0385166060820152818152604081015160208201526131d9565b84816060018181516131cc91906149e5565b6001600160401b03169052505b60608101516131e9906064614d9f565b602082015160028501546001600160401b0392909216916132149190600160401b900460ff166149ce565b10156132785760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610494565b83156132a157846001600160401b0316816040018181516132999190614cb9565b9052506132c0565b846001600160401b0316816040018181516132bc9190614c92565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661335157604051631afcd79f60e31b815260040160405180910390fd5b565b61335b613308565b61336481613a4d565b611920608082013560a083013561338160e0850160c086016146fb565b613392610100860160e08701614dd9565b61ffff166133a861012087016101008801614e95565b6133ba61014088016101208901614eb5565b613a6e565b6133c7613308565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166134535760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610494565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261151491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613cb2565b5f610987827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613d13565b6119208160016130ec565b5f5f805160206150938339815191524261353360408601602087016146fb565b6001600160401b0316116135a55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610494565b6135b560408501602086016146fb565b6001600160401b03166135cb426202a300614cb9565b1161363e5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610494565b83356136965760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610494565b83355f908152600982016020526040902054156137065760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610494565b6137136040850185614ed0565b905060301461377a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610494565b61378383613508565b5f8061381d6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906137c891906146fb565b6001600160401b031681526020016137e360408a018a614ed0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613e75565b5f8281526007860160205260409020919350915061383b8282614f5d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138689085906004016148db565b6020604051808303815f875af1158015613884573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138a8919061490d565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561392a5761392a614797565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a1f91908e01908e016146fb565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613a55613308565b613a5d61421a565b613a6561422a565b61192081614232565b613a76613308565b5f8051602061505383398151915283613ae25760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610494565b612710841115613b045760405162461bcd60e51b815260040161049490614df4565b85871115613b6c5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610494565b5f8360ff1611613bd95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610494565b600a60ff84161115613c4b5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610494565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613cc66001600160a01b038416836143ed565b905080515f14158015613cea575080806020019051810190613ce8919061501c565b155b1561151457604051635274afe760e01b81526001600160a01b0384166004820152602401610494565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613d59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d7d919061490d565b9050613d946001600160a01b0385163330866143fa565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613dd8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dfc919061490d565b9050818111613e625760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610494565b613e6c8282614c92565b95945050505050565b5f6060826080015151603014613edf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610494565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613f5657613f16816001614c92565b613f219060086149ce565b5081515f90839083908110613f3857613f38614ca5565b60200101906001600160f81b03191690815f1a905350600101613f02565b505f5b6004811015613fb457613f6d816003614c92565b613f789060086149ce565b505f82613f86836002614cb9565b81518110613f9657613f96614ca5565b60200101906001600160f81b03191690815f1a905350600101613f59565b505f5b60208110156140115784518160208110613fd357613fd3614ca5565b1a60f81b82613fe3836006614cb9565b81518110613ff357613ff3614ca5565b60200101906001600160f81b03191690815f1a905350600101613fb7565b505f5b6020811015614071578460200151816020811061403357614033614ca5565b1a60f81b82614043836026614cb9565b8151811061405357614053614ca5565b60200101906001600160f81b03191690815f1a905350600101614014565b505f5b60088110156140e557614088816007614c92565b6140939060086149ce565b60ff1685604001516001600160401b0316901c60f81b828260466140b79190614cb9565b815181106140c7576140c7614ca5565b60200101906001600160f81b03191690815f1a905350600101614074565b505f5b6030811015614150578460800151818151811061410757614107614ca5565b01602001516001600160f81b0319168261412283604e614cb9565b8151811061413257614132614ca5565b60200101906001600160f81b03191690815f1a9053506001016140e8565b505f5b60088110156141c257614167816007614c92565b6141729060086149ce565b60608601516001600160401b0390811691161c60f81b8261419483607e614cb9565b815181106141a4576141a4614ca5565b60200101906001600160f81b03191690815f1a905350600101614153565b506002816040516141d39190615037565b602060405180830381855afa1580156141ee573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614211919061490d565b94909350915050565b614222613308565b613351614433565b613351613308565b61423a613308565b80355f8051602061509383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146142866080840160608501614e95565b60ff1611156142f35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610494565b5f6143046080840160608501614e95565b60ff161161437a5760405162461bcd60e51b815260206004820152603960248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201527f70657263656e746167652063616e6e6f74206265207a65726f000000000000006064820152608401610494565b61438a6080830160608401614e95565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556143bb60608301604084016146fb565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610f8f83835f61443b565b6040516001600160a01b0384811660248301528381166044830152606482018390526109719186918216906323b872dd906084016134a0565b612d60613308565b6060814710156144605760405163cd78605960e01b8152306004820152602401610494565b5f80856001600160a01b0316848660405161447b9190615037565b5f6040518083038185875af1925050503d805f81146144b5576040519150601f19603f3d011682016040523d82523d5f602084013e6144ba565b606091505b509150915061188a8683836060826144da576144d582614521565b610f8f565b81511580156144f157506001600160a01b0384163b155b1561451a57604051639996b31560e01b81526001600160a01b0385166004820152602401610494565b5080610f8f565b8051156145315780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461455690614a05565b5f825580601f10614565575050565b601f0160209004905f5260205f209081019061192091906145c5565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156145d9575f81556001016145c6565b5090565b8015158114611920575f80fd5b803563ffffffff811681146145fd575f80fd5b919050565b5f805f60608486031215614614575f80fd5b833592506020840135614626816145dd565b9150614634604085016145ea565b90509250925092565b5f6020828403121561464d575f80fd5b5035919050565b6001600160a01b0381168114611920575f80fd5b5f8082840361016081121561467b575f80fd5b6101408082121561468a575f80fd5b849350830135905061469b81614654565b809150509250929050565b5f602082840312156146b6575f80fd5b610f8f826145ea565b5f80604083850312156146d0575f80fd5b6146d9836145ea565b946020939093013593505050565b6001600160401b0381168114611920575f80fd5b5f6020828403121561470b575f80fd5b8135610f8f816146e7565b5f8060408385031215614727575f80fd5b50508035926020909101359150565b5f805f8385036080811215614749575f80fd5b84356001600160401b0381111561475e575f80fd5b85016060818803121561476f575f80fd5b93506040601f1982011215614782575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106147cf57634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516147f760408401826001600160a01b03169052565b50606083015161481260608401826001600160401b03169052565b50608083015161482d60808401826001600160401b03169052565b5060a083015161484860a08401826001600160401b03169052565b5060c083015161486360c08401826001600160401b03169052565b5060e083015161487e60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561487e5761487e614885565b5f5b838110156148d35781810151838201526020016148bb565b50505f910152565b602081525f82518060208401526148f98160408501602087016148b9565b601f01601f19169190910160400192915050565b5f6020828403121561491d575f80fd5b5051919050565b5f8261493e57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761098757610987614885565b6001600160401b0381811683821601908082111561487e5761487e614885565b600181811c90821680614a1957607f821691505b602082108103614a3757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a9681614a05565b806020870152604060018084165f8114614ab75760018114614ad357614b00565b60ff19851660408a0152604084151560051b8a01019550614b00565b895f5260205f205f5b85811015614af75781548b8201860152908301908801614adc565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b4457614b44614b0e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b7257614b72614b0e565b604052919050565b80516145fd816145dd565b5f8060408385031215614b96575f80fd5b82516001600160401b0380821115614bac575f80fd5b9084019060608287031215614bbf575f80fd5b614bc7614b22565b82518152602080840151614bda81614654565b82820152604084015183811115614bef575f80fd5b80850194505087601f850112614c03575f80fd5b835183811115614c1557614c15614b0e565b614c27601f8201601f19168301614b4a565b93508084528882828701011115614c3c575f80fd5b614c4b818386018488016148b9565b50826040830152819550614c60818801614b7a565b9450505050509250929050565b5f6001600160401b03808316818103614c8857614c88614885565b6001019392505050565b8181038181111561098757610987614885565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561098757610987614885565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614dc257614dc2614885565b505092915050565b61ffff81168114611920575f80fd5b5f60208284031215614de9575f80fd5b8135610f8f81614dca565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e4a81614dca565b61ffff8116905081548161ffff1982161783556020840135614e6b816146e7565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614ea5575f80fd5b813560ff81168114610f8f575f80fd5b5f60208284031215614ec5575f80fd5b8135610f8f81614654565b5f808335601e19843603018112614ee5575f80fd5b8301803591506001600160401b03821115614efe575f80fd5b602001915036819003821315614f12575f80fd5b9250929050565b601f82111561151457805f5260205f20601f840160051c81016020851015614f3e5750805b601f840160051c820191505b81811015610d6d575f8155600101614f4a565b81516001600160401b03811115614f7657614f76614b0e565b614f8a81614f848454614a05565b84614f19565b602080601f831160018114614fbd575f8415614fa65750858301515b5f19600386901b1c1916600185901b178555615014565b5f85815260208120601f198616915b82811015614feb57888601518255948401946001909101908401614fcc565b508582101561500857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561502c575f80fd5b8151610f8f816145dd565b5f82516150488184602087016148b9565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516152a43803806152a483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151578061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f36600461465a565b610357565b005b610154610164366004614695565b6107cf565b6101a7610177366004614695565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e2366004614695565b61099f565b6040516001600160401b0390911681526020016101b1565b61015461020d3660046146c0565b6109b5565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c3660046146fe565b610a94565b61015461024f366004614717565b610abf565b6101a7610262366004614753565b610c8f565b6101e7610275366004614695565b610ca8565b61015461028836600461465a565b610cbc565b61015461029b366004614717565b610d9c565b6101a76102ae36600461476e565b610fab565b6101a76102c136600461478e565b610fbe565b6101546102d43660046146fe565b610fea565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d366004614695565b6111a7565b610154610320366004614695565b61142d565b6101c2601481565b61034061033b366004614695565b611541565b6040516101b19190614803565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206150ab8339815191529184156103a9576103a68285611620565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db6147ef565b60048111156103ec576103ec6147ef565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610473576104736147ef565b146104c55760405162461bcd60e51b815260206004820152602a60248201525f805160206150cb8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461052a5760405162461bcd60e51b815260206004820152603360248201525f805160206150cb8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104bc565b5f610534846118bc565b9050610543826060015161193e565b600382526001600160401b0342811660a0840152811660e08301525f88815260068601602052604090208251815484929190829060ff1916600183600481111561058f5761058f6147ef565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61066185611541565b905082606001516001600160401b03168160a001516001600160401b0316116106d85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104bc565b5f83606001518260a001516106ed91906148f1565b90506106f9868261194b565b5f6005600160991b0163ee5b48eb610712898786611993565b6040518263ffffffff1660e01b815260040161072e9190614933565b6020604051808303815f875af115801561074a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076e9190614965565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061512b83398151915260205260408082208151610100810190925280545f805160206150eb83398151915293929190829060ff16600581111561081d5761081d6147ef565b600581111561082e5761082e6147ef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108b3576108b36147ef565b146109185760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104bc565b6005600160991b016001600160a01b031663ee5b48eb61093d8584608001515f611993565b6040518263ffffffff1660e01b81526004016109599190614933565b6020604051808303815f875af1158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190614965565b50505050565b5f6109af64e8d4a510008361497c565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109fe575080546001600160401b03808416911610155b15610a1c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a478484611bb0565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a9e82611bca565b9050610abb81606001516001600160401b03168260400151611f3d565b5050565b5f805160206150ab8339815191525f610ad784611f73565b90505f80610ae88360400151612154565b50915091505f610af783611541565b9050816001600160401b031681608001516001600160401b03161015610b2f5760405162461bcd60e51b81526004016104bc9061499b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b745760405162461bcd60e51b81526004016104bc906149dd565b60015f87815260068701602052604090205460ff166004811115610b9a57610b9a6147ef565b14610c035760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104bc565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109af6001600160401b03831664e8d4a51000614a26565b5f610cb282611541565b60a0015192915050565b5f805160206150ab8339815191525f610cd485611541565b5f86815260058401602052604090205460c0820151919250610d0691620100009091046001600160401b031690614a3d565b6001600160401b0316421015610d7a5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104bc565b8315610d8c57610d8a8584611620565b505b610d958561238f565b5050505050565b5f805160206150ab8339815191525f610db484611f73565b90505f80610dc58360400151612154565b50915091505f610dd483611541565b9050816001600160401b031681608001516001600160401b03161015610e0c5760405162461bcd60e51b81526004016104bc9061499b565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e4a5760405162461bcd60e51b81526004016104bc906149dd565b60035f87815260068701602052604090205460ff166004811115610e7057610e706147ef565b14610ec45760405162461bcd60e51b815260206004820152603160248201525f805160206150cb8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104bc565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f6991611f3d565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610fb783338461272d565b9392505050565b5f610fc7612b2b565b610fd2848484612b62565b9050610fb760015f8051602061510b83398151915255565b5f805160206150eb8339815191525f61100283611f73565b90505f806110138360400151612d9b565b91509150806110755760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104bc565b5f8281526007850160205260408120805461108f90614a5d565b90501180156110c1575060015f83815260088601602052604090205460ff1660058111156110bf576110bf6147ef565b145b6110dd5760405162461bcd60e51b81526004016104bc90614a95565b5f82815260078501602052604081206110f5916145a2565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206150ab83398151915293929190829060ff166004811115611208576112086147ef565b6004811115611219576112196147ef565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112a0576112a06147ef565b14806112be57506003815160048111156112bc576112bc6147ef565b145b6113125760405162461bcd60e51b815260206004820152603260248201525f805160206150cb833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104bc565b5f6113208260400151611541565b905080608001516001600160401b03165f036113a45760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104bc565b6005600160991b016001600160a01b031663ee5b48eb6113d1846040015184608001518560a00151611993565b6040518263ffffffff1660e01b81526004016113ed9190614933565b6020604051808303815f875af1158015611409573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d959190614965565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150eb83398151915292919061147590614a5d565b90501180156114a7575060015f83815260088301602052604090205460ff1660058111156114a5576114a56147ef565b145b6114c35760405162461bcd60e51b81526004016104bc90614a95565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114fc9190600401614adc565b6020604051808303815f875af1158015611518573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153c9190614965565b505050565b6115496145d9565b5f8281525f8051602061512b8339815191526020526040908190208151610100810190925280545f805160206150eb833981519152929190829060ff166005811115611597576115976147ef565b60058111156115a8576115a86147ef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561166b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116929190810190614bdd565b91509150806116f55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104bc565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611738573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175c9190614965565b8251146117c05760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104bc565b60208201516001600160a01b0316156118365760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104bc565b5f806118458460400151612f3c565b915091508187146118b25760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104bc565b9695505050505050565b5f8181525f8051602061512b8339815191526020526040812060030180545f805160206150eb833981519152916001600160401b0390911690836118ff83614cc5565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611948815f613114565b50565b5f9182525f8051602061512b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a0c576119cc816001614cea565b6119d7906008614a26565b5081515f908390839081106119ee576119ee614cfd565b60200101906001600160f81b03191690815f1a9053506001016119b8565b505f5b6004811015611a6f57611a23816003614cea565b611a2e906008614a26565b6001901c60f81b82611a41836002614d11565b81518110611a5157611a51614cfd565b60200101906001600160f81b03191690815f1a905350600101611a0f565b505f5b6020811015611ad157611a8681601f614cea565b611a91906008614a26565b86901c60f81b82611aa3836006614d11565b81518110611ab357611ab3614cfd565b60200101906001600160f81b03191690815f1a905350600101611a72565b505f5b6008811015611b3c57611ae8816007614cea565b611af3906008614a26565b6001600160401b038616901c60f81b82611b0e836026614d11565b81518110611b1e57611b1e614cfd565b60200101906001600160f81b03191690815f1a905350600101611ad4565b505f5b6008811015611ba757611b53816007614cea565b611b5e906008614a26565b6001600160401b038516901c60f81b82611b7983602e614d11565b81518110611b8957611b89614cfd565b60200101906001600160f81b03191690815f1a905350600101611b3f565b50949350505050565b611bb861336e565b611bc1826133b9565b610abb81613425565b611bd26145d9565b5f805160206150eb8339815191525f611bea84611f73565b90505f80611bfb8360400151612d9b565b915091508015611c605760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104bc565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611c9257611c926147ef565b6005811115611ca357611ca36147ef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d2a57611d2a6147ef565b1480611d485750600182516005811115611d4657611d466147ef565b145b611da75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104bc565b600382516005811115611dbc57611dbc6147ef565b03611dc957506004611dcd565b5060055b6020808301515f90815260098801909152604081205581816005811115611df657611df66147ef565b90816005811115611e0957611e096147ef565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611e3d57611e3d6147ef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f0857611f086147ef565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610abb906001600160a01b031682846134d9565b60408051606080820183525f8083526020830181905292820152905f805160206150eb8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fe8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261200f9190810190614bdd565b91509150806120765760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104bc565b82548251146120d95760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104bc565b60208201516001600160a01b03161561214c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104bc565b509392505050565b5f805f83516036146121785760405162461bcd60e51b81526004016104bc90614d24565b5f805b60028110156121c75761218f816001614cea565b61219a906008614a26565b61ffff168682815181106121b0576121b0614cfd565b016020015160f81c901b919091179060010161217b565b5061ffff8116156121ea5760405162461bcd60e51b81526004016104bc90614d6d565b5f805b600481101561224557612201816003614cea565b61220c906008614a26565b63ffffffff168761221e836002614d11565b8151811061222e5761222e614cfd565b016020015160f81c901b91909117906001016121ed565b5063ffffffff811660031461226c5760405162461bcd60e51b81526004016104bc90614db0565b5f805b60208110156122c15761228381601f614cea565b61228e906008614a26565b8861229a836006614d11565b815181106122aa576122aa614cfd565b016020015160f81c901b919091179060010161226f565b505f805b6008811015612320576122d9816007614cea565b6122e4906008614a26565b6001600160401b0316896122f9836026614d11565b8151811061230957612309614cfd565b016020015160f81c901b91909117906001016122c5565b505f805b600881101561237f57612338816007614cea565b612343906008614a26565b6001600160401b03168a61235883602e614d11565b8151811061236857612368614cfd565b016020015160f81c901b9190911790600101612324565b5091989097509095509350505050565b5f8181525f8051602061512b83398151915260205260408082208151610100810190925280545f805160206150eb83398151915293929190829060ff1660058111156123dd576123dd6147ef565b60058111156123ee576123ee6147ef565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612476576124766147ef565b146124d25760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104bc565b60408101516001600160a01b0316336001600160a01b03161461254c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104bc565b6125598160a0015161193e565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561259d5761259d6147ef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61266984612663816118bc565b5f611993565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612698908590600401614933565b6020604051808303815f875af11580156126b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126d89190614965565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f612736612b2b565b5f805160206150ab8339815191525f6127516101e285613538565b90505f61275d87611541565b9050600281516005811115612774576127746147ef565b146127d35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104bc565b6127dc8261356e565b5f828260a001516127ed9190614a3d565b6004850154606084015191925061280f916001600160401b0390911690614df7565b6001600160401b0316816001600160401b0316111561288e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104bc565b612898888261194b565b5f6128a2896118bc565b90505f89826040516020016128ce92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6129088d8688611993565b6040518263ffffffff1660e01b81526004016129249190614933565b6020604051808303815f875af1158015612940573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129649190614965565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156129ec576129ec6147ef565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610fb760015f8051602061510b83398151915255565b5f8051602061510b833981519152805460011901612b5c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206150ab833981519152906001600160401b0316612bae6040860160208701614753565b6001600160401b03161015612c1d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104bc565b6003810154612c2f6020860186614e31565b61ffff1610158015612c535750612710612c4c6020860186614e31565b61ffff1611155b612c6f5760405162461bcd60e51b81526004016104bc90614e4c565b8054831015612cd25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104bc565b8060010154831115612d395760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104bc565b5f612d4384613538565b90505f612d4f8261099f565b90505f612d5c8883613579565b5f81815260058601602052604090209091508790612d7a8282614e97565b509098975050505050505050565b60015f8051602061510b83398151915255565b5f808251602714612dbe5760405162461bcd60e51b81526004016104bc90614d24565b5f805b6002811015612e0d57612dd5816001614cea565b612de0906008614a26565b61ffff16858281518110612df657612df6614cfd565b016020015160f81c901b9190911790600101612dc1565b5061ffff811615612e305760405162461bcd60e51b81526004016104bc90614d6d565b5f805b6004811015612e8b57612e47816003614cea565b612e52906008614a26565b63ffffffff1686612e64836002614d11565b81518110612e7457612e74614cfd565b016020015160f81c901b9190911790600101612e33565b5063ffffffff8116600214612eb25760405162461bcd60e51b81526004016104bc90614db0565b5f805b6020811015612f0757612ec981601f614cea565b612ed4906008614a26565b87612ee0836006614d11565b81518110612ef057612ef0614cfd565b016020015160f81c901b9190911790600101612eb5565b505f86602681518110612f1c57612f1c614cfd565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612f5f5760405162461bcd60e51b81526004016104bc90614d24565b5f805b6002811015612fae57612f76816001614cea565b612f81906008614a26565b61ffff16858281518110612f9757612f97614cfd565b016020015160f81c901b9190911790600101612f62565b5061ffff811615612fd15760405162461bcd60e51b81526004016104bc90614d6d565b5f805b600481101561302c57612fe8816003614cea565b612ff3906008614a26565b63ffffffff1686613005836002614d11565b8151811061301557613015614cfd565b016020015160f81c901b9190911790600101612fd4565b5063ffffffff81166004146130535760405162461bcd60e51b81526004016104bc90614db0565b5f805b60208110156130a85761306a81601f614cea565b613075906008614a26565b87613081836006614d11565b8151811061309157613091614cfd565b016020015160f81c901b9190911790600101613056565b505f805b6008811015613107576130c0816007614cea565b6130cb906008614a26565b6001600160401b0316886130e0836026614d11565b815181106130f0576130f0614cfd565b016020015160f81c901b91909117906001016130ac565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206150eb8339815191529142919015806131fa5750600283015481516131f6916001600160401b031690614d11565b8210155b15613220576001600160401b03851660608201528181526040810151602082015261323f565b84816060018181516132329190614a3d565b6001600160401b03169052505b606081015161324f906064614df7565b602082015160028501546001600160401b03929092169161327a9190600160401b900460ff16614a26565b10156132de5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104bc565b831561330757846001600160401b0316816040018181516132ff9190614d11565b905250613326565b846001600160401b0316816040018181516133229190614cea565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166133b757604051631afcd79f60e31b815260040160405180910390fd5b565b6133c161336e565b6133ca81613ab3565b611948608082013560a08301356133e760e0850160c08601614753565b6133f8610100860160e08701614e31565b61ffff1661340e61012087016101008801614eed565b61342061014088016101208901614f0d565b613ad4565b61342d61336e565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166134b95760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104bc565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261153c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613d18565b5f6109af827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613d79565b611948816001613114565b5f5f805160206150eb833981519152426135996040860160208701614753565b6001600160401b03161161360b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104bc565b61361b6040850160208601614753565b6001600160401b03166136316202a30042614d11565b116136a45760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104bc565b83356136fc5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104bc565b83355f9081526009820160205260409020541561376c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104bc565b6137796040850185614f28565b90506030146137e05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104bc565b6137e98361356e565b5f806138836040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061382e9190614753565b6001600160401b0316815260200161384960408a018a614f28565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613edb565b5f828152600786016020526040902091935091506138a18282614fb5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138ce908590600401614933565b6020604051808303815f875af11580156138ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390e9190614965565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613990576139906147ef565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a8591908e01908e01614753565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613abb61336e565b613ac3614280565b613acb614290565b61194881614298565b613adc61336e565b5f805160206150ab83398151915283613b485760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104bc565b612710841115613b6a5760405162461bcd60e51b81526004016104bc90614e4c565b85871115613bd25760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104bc565b5f8360ff1611613c3f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104bc565b600a60ff84161115613cb15760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104bc565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613d2c6001600160a01b03841683614445565b905080515f14158015613d50575080806020019051810190613d4e9190615074565b155b1561153c57604051635274afe760e01b81526001600160a01b03841660048201526024016104bc565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613dbf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613de39190614965565b9050613dfa6001600160a01b038516333086614452565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613e3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e629190614965565b9050818111613ec85760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104bc565b613ed28282614cea565b95945050505050565b5f6060826080015151603014613f455760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104bc565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613fbc57613f7c816001614cea565b613f87906008614a26565b5081515f90839083908110613f9e57613f9e614cfd565b60200101906001600160f81b03191690815f1a905350600101613f68565b505f5b600481101561401a57613fd3816003614cea565b613fde906008614a26565b505f82613fec836002614d11565b81518110613ffc57613ffc614cfd565b60200101906001600160f81b03191690815f1a905350600101613fbf565b505f5b6020811015614077578451816020811061403957614039614cfd565b1a60f81b82614049836006614d11565b8151811061405957614059614cfd565b60200101906001600160f81b03191690815f1a90535060010161401d565b505f5b60208110156140d7578460200151816020811061409957614099614cfd565b1a60f81b826140a9836026614d11565b815181106140b9576140b9614cfd565b60200101906001600160f81b03191690815f1a90535060010161407a565b505f5b600881101561414b576140ee816007614cea565b6140f9906008614a26565b60ff1685604001516001600160401b0316901c60f81b8282604661411d9190614d11565b8151811061412d5761412d614cfd565b60200101906001600160f81b03191690815f1a9053506001016140da565b505f5b60308110156141b6578460800151818151811061416d5761416d614cfd565b01602001516001600160f81b0319168261418883604e614d11565b8151811061419857614198614cfd565b60200101906001600160f81b03191690815f1a90535060010161414e565b505f5b6008811015614228576141cd816007614cea565b6141d8906008614a26565b60608601516001600160401b0390811691161c60f81b826141fa83607e614d11565b8151811061420a5761420a614cfd565b60200101906001600160f81b03191690815f1a9053506001016141b9565b50600281604051614239919061508f565b602060405180830381855afa158015614254573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142779190614965565b94909350915050565b61428861336e565b6133b761448b565b6133b761336e565b6142a061336e565b80355f805160206150eb83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146142ec6080840160608501614eed565b60ff1611156143595760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104bc565b5f61436a6080840160608501614eed565b60ff16116143d25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104bc565b6143e26080830160608401614eed565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144136060830160408401614753565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610fb783835f614493565b6040516001600160a01b0384811660248301528381166044830152606482018390526109999186918216906323b872dd90608401613506565b612d8861336e565b6060814710156144b85760405163cd78605960e01b81523060048201526024016104bc565b5f80856001600160a01b031684866040516144d3919061508f565b5f6040518083038185875af1925050503d805f811461450d576040519150601f19603f3d011682016040523d82523d5f602084013e614512565b606091505b50915091506118b28683836060826145325761452d82614579565b610fb7565b815115801561454957506001600160a01b0384163b155b1561457257604051639996b31560e01b81526001600160a01b03851660048201526024016104bc565b5080610fb7565b8051156145895780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546145ae90614a5d565b5f825580601f106145bd575050565b601f0160209004905f5260205f2090810190611948919061461d565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614631575f815560010161461e565b5090565b8015158114611948575f80fd5b803563ffffffff81168114614655575f80fd5b919050565b5f805f6060848603121561466c575f80fd5b83359250602084013561467e81614635565b915061468c60408501614642565b90509250925092565b5f602082840312156146a5575f80fd5b5035919050565b6001600160a01b0381168114611948575f80fd5b5f808284036101608112156146d3575f80fd5b610140808212156146e2575f80fd5b84935083013590506146f3816146ac565b809150509250929050565b5f6020828403121561470e575f80fd5b610fb782614642565b5f8060408385031215614728575f80fd5b61473183614642565b946020939093013593505050565b6001600160401b0381168114611948575f80fd5b5f60208284031215614763575f80fd5b8135610fb78161473f565b5f806040838503121561477f575f80fd5b50508035926020909101359150565b5f805f83850360808112156147a1575f80fd5b84356001600160401b038111156147b6575f80fd5b8501606081880312156147c7575f80fd5b93506040601f19820112156147da575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061482757634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161484f60408401826001600160a01b03169052565b50606083015161486a60608401826001600160401b03169052565b50608083015161488560808401826001600160401b03169052565b5060a08301516148a060a08401826001600160401b03169052565b5060c08301516148bb60c08401826001600160401b03169052565b5060e08301516148d660e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156148d6576148d66148dd565b5f5b8381101561492b578181015183820152602001614913565b50505f910152565b602081525f8251806020840152614951816040850160208701614911565b601f01601f19169190910160400192915050565b5f60208284031215614975575f80fd5b5051919050565b5f8261499657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109af576109af6148dd565b6001600160401b038181168382160190808211156148d6576148d66148dd565b600181811c90821680614a7157607f821691505b602082108103614a8f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614aee81614a5d565b806020870152604060018084165f8114614b0f5760018114614b2b57614b58565b60ff19851660408a0152604084151560051b8a01019550614b58565b895f5260205f205f5b85811015614b4f5781548b8201860152908301908801614b34565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b9c57614b9c614b66565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614bca57614bca614b66565b604052919050565b805161465581614635565b5f8060408385031215614bee575f80fd5b82516001600160401b0380821115614c04575f80fd5b9084019060608287031215614c17575f80fd5b614c1f614b7a565b82518152602080840151614c32816146ac565b82820152604084015183811115614c47575f80fd5b80850194505087601f850112614c5b575f80fd5b835183811115614c6d57614c6d614b66565b614c7f601f8201601f19168301614ba2565b93508084528882828701011115614c94575f80fd5b614ca381838601848801614911565b50826040830152819550614cb8818801614bd2565b9450505050509250929050565b5f6001600160401b03808316818103614ce057614ce06148dd565b6001019392505050565b818103818111156109af576109af6148dd565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109af576109af6148dd565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614e1a57614e1a6148dd565b505092915050565b61ffff81168114611948575f80fd5b5f60208284031215614e41575f80fd5b8135610fb781614e22565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614ea281614e22565b61ffff8116905081548161ffff1982161783556020840135614ec38161473f565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614efd575f80fd5b813560ff81168114610fb7575f80fd5b5f60208284031215614f1d575f80fd5b8135610fb7816146ac565b5f808335601e19843603018112614f3d575f80fd5b8301803591506001600160401b03821115614f56575f80fd5b602001915036819003821315614f6a575f80fd5b9250929050565b601f82111561153c57805f5260205f20601f840160051c81016020851015614f965750805b601f840160051c820191505b81811015610d95575f8155600101614fa2565b81516001600160401b03811115614fce57614fce614b66565b614fe281614fdc8454614a5d565b84614f71565b602080601f831160018114615015575f8415614ffe5750858301515b5f19600386901b1c1916600185901b17855561506c565b5f85815260208120601f198616915b8281101561504357888601518255948401946001909101908401615024565b508582101561506057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615084575f80fd5b8151610fb781614635565b5f82516150a0818460208701614911565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -246,6 +246,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorRaw) Transact return _ERC20TokenStakingManager.Contract.contract.Transact(opts, method, params...) } +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMCHURNPERCENTAGELIMIT(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_CHURN_PERCENTAGE_LIMIT") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_ERC20TokenStakingManager.CallOpts) +} + // MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. // // Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) @@ -277,6 +308,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMD return _ERC20TokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_ERC20TokenStakingManager.CallOpts) } +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMREGISTRATIONEXPIRYLENGTH(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_REGISTRATION_EXPIRY_LENGTH") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_ERC20TokenStakingManager.CallOpts) +} + // MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. // // Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 5ff89d69b..2429f6c94 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -75,8 +75,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614e99380380614e9983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d4c8061014d5f395ff3fe60806040526004361061011b575f3560e01c806366435abf1161009d578063b771b3bc11610062578063b771b3bc1461034c578063ba3a4b971461037e578063bee0a03f1461039d578063c599e24f146103bc578063d5f20ff6146103cf575f80fd5b806366435abf146102bd57806376f78621146102dc57806380a8ad94146102fb57806398f3e2b41461030e578063a3a65e481461032d575f80fd5b80632e2194d8116100e35780632e2194d81461020157806335455ded14610238578063467ef06f146102605780635297fae61461027f578063620658561461029e575f80fd5b80630118acc41461011f5780630322ed98146101405780630cdd09851461015f578063151d30d1146101bc5780631f7a9d8f146101e2575b5f80fd5b34801561012a575f80fd5b5061013e6101393660046142bf565b6103fb565b005b34801561014b575f80fd5b5061013e61015a3660046142fa565b610873565b34801561016a575f80fd5b506101a96101793660046142fa565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101c7575f80fd5b506101d0600a81565b60405160ff90911681526020016101b3565b3480156101ed575f80fd5b5061013e6101fc366004614311565b610a43565b34801561020c575f80fd5b5061022061021b3660046142fa565b610b20565b6040516001600160401b0390911681526020016101b3565b348015610243575f80fd5b5061024d61271081565b60405161ffff90911681526020016101b3565b34801561026b575f80fd5b5061013e61027a366004614328565b610b36565b34801561028a575f80fd5b5061013e610299366004614341565b610b61565b3480156102a9575f80fd5b506101a96102b836600461437d565b610d31565b3480156102c8575f80fd5b506102206102d73660046142fa565b610d4a565b3480156102e7575f80fd5b5061013e6102f63660046142bf565b610d5e565b6101a9610309366004614398565b610e3e565b348015610319575f80fd5b5061013e610328366004614341565b610e6a565b348015610338575f80fd5b5061013e610347366004614328565b611079565b348015610357575f80fd5b506103666005600160991b0181565b6040516001600160a01b0390911681526020016101b3565b348015610389575f80fd5b5061013e6103983660046142fa565b611236565b3480156103a8575f80fd5b5061013e6103b73660046142fa565b6114bc565b6101a96103ca3660046142fa565b6115d0565b3480156103da575f80fd5b506103ee6103e93660046142fa565b6115dc565b6040516101b39190614405565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614ca083398151915291841561044d5761044a82856116bb565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561047f5761047f6143f1565b6004811115610490576104906143f1565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610517576105176143f1565b146105695760405162461bcd60e51b815260206004820152602a60248201525f80516020614cc08339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105ce5760405162461bcd60e51b815260206004820152603360248201525f80516020614cc08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610560565b5f6105d884611957565b90506105e782606001516119d9565b600382526001600160401b0342811660a0840152811660e08301525f88815260068601602052604090208251815484929190829060ff19166001836004811115610633576106336143f1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f610705856115dc565b905082606001516001600160401b03168160a001516001600160401b03161161077c5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610560565b5f83606001518260a0015161079191906144f3565b905061079d86826119e6565b5f6005600160991b0163ee5b48eb6107b6898786611a2e565b6040518263ffffffff1660e01b81526004016107d29190614535565b6020604051808303815f875af11580156107ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108129190614567565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614d2083398151915260205260408082208151610100810190925280545f80516020614ce083398151915293929190829060ff1660058111156108c1576108c16143f1565b60058111156108d2576108d26143f1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610957576109576143f1565b146109bc5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610560565b6005600160991b016001600160a01b031663ee5b48eb6109e18584608001515f611a2e565b6040518263ffffffff1660e01b81526004016109fd9190614535565b6020604051808303815f875af1158015610a19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3d9190614567565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a8c575080546001600160401b03808416911610155b15610aaa5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ad483611c4d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b3064e8d4a510008361457e565b92915050565b5f610b4082611c5e565b9050610b5d81606001516001600160401b03168260400151611fd1565b5050565b5f80516020614ca08339815191525f610b7984611fe4565b90505f80610b8a83604001516121c5565b50915091505f610b99836115dc565b9050816001600160401b031681608001516001600160401b03161015610bd15760405162461bcd60e51b81526004016105609061459d565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c165760405162461bcd60e51b8152600401610560906145df565b60015f87815260068701602052604090205460ff166004811115610c3c57610c3c6143f1565b14610ca55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610560565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610b306001600160401b03831664e8d4a51000614628565b5f610d54826115dc565b60a0015192915050565b5f80516020614ca08339815191525f610d76856115dc565b5f86815260058401602052604090205460c0820151919250610da891620100009091046001600160401b03169061463f565b6001600160401b0316421015610e1c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610560565b8315610e2e57610e2c85846116bb565b505b610e3785612400565b5050505050565b5f610e4761279e565b610e528383346127d5565b9050610b3060015f80516020614d0083398151915255565b5f80516020614ca08339815191525f610e8284611fe4565b90505f80610e9383604001516121c5565b50915091505f610ea2836115dc565b9050816001600160401b031681608001516001600160401b03161015610eda5760405162461bcd60e51b81526004016105609061459d565b5f8681526006860160205260409020600301546001600160401b0380841691161115610f185760405162461bcd60e51b8152600401610560906145df565b60035f87815260068701602052604090205460ff166004811115610f3e57610f3e6143f1565b14610f925760405162461bcd60e51b815260206004820152603160248201525f80516020614cc08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610560565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261103791611fd1565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614ce08339815191525f61109183611fe4565b90505f806110a28360400151612a03565b91509150806111045760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610560565b5f8281526007850160205260408120805461111e9061465f565b9050118015611150575060015f83815260088601602052604090205460ff16600581111561114e5761114e6143f1565b145b61116c5760405162461bcd60e51b815260040161056090614691565b5f828152600785016020526040812061118491614207565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614ca083398151915293929190829060ff166004811115611297576112976143f1565b60048111156112a8576112a86143f1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561132f5761132f6143f1565b148061134d575060038151600481111561134b5761134b6143f1565b145b6113a15760405162461bcd60e51b815260206004820152603260248201525f80516020614cc0833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610560565b5f6113af82604001516115dc565b905080608001516001600160401b03165f036114335760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610560565b6005600160991b016001600160a01b031663ee5b48eb611460846040015184608001518560a00151611a2e565b6040518263ffffffff1660e01b815260040161147c9190614535565b6020604051808303815f875af1158015611498573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e379190614567565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614ce08339815191529291906115049061465f565b9050118015611536575060015f83815260088301602052604090205460ff166005811115611534576115346143f1565b145b6115525760405162461bcd60e51b815260040161056090614691565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161158b91906004016146d8565b6020604051808303815f875af11580156115a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115cb9190614567565b505050565b5f610b30823334612ba4565b6115e461423e565b5f8281525f80516020614d208339815191526020526040908190208151610100810190925280545f80516020614ce0833981519152929190829060ff166005811115611632576116326143f1565b6005811115611643576116436143f1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611706573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261172d91908101906147ed565b91509150806117905760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610560565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f79190614567565b82511461185b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610560565b60208201516001600160a01b0316156118d15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610560565b5f806118e08460400151612f9f565b9150915081871461194d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610560565b9695505050505050565b5f8181525f80516020614d208339815191526020526040812060030180545f80516020614ce0833981519152916001600160401b03909116908361199a836148d5565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6119e3815f613177565b50565b5f9182525f80516020614d20833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611aa757611a678160016148fa565b611a72906008614628565b5081515f90839083908110611a8957611a8961490d565b60200101906001600160f81b03191690815f1a905350600101611a53565b505f5b6004811015611b0a57611abe8160036148fa565b611ac9906008614628565b6001901c60f81b82611adc836002614921565b81518110611aec57611aec61490d565b60200101906001600160f81b03191690815f1a905350600101611aaa565b505f5b6020811015611b6c57611b2181601f6148fa565b611b2c906008614628565b86901c60f81b82611b3e836006614921565b81518110611b4e57611b4e61490d565b60200101906001600160f81b03191690815f1a905350600101611b0d565b505f5b6008811015611bd757611b838160076148fa565b611b8e906008614628565b6001600160401b038616901c60f81b82611ba9836026614921565b81518110611bb957611bb961490d565b60200101906001600160f81b03191690815f1a905350600101611b6f565b505f5b6008811015611c4257611bee8160076148fa565b611bf9906008614628565b6001600160401b038516901c60f81b82611c1483602e614921565b81518110611c2457611c2461490d565b60200101906001600160f81b03191690815f1a905350600101611bda565b5090505b9392505050565b611c55613393565b6119e3816133de565b611c6661423e565b5f80516020614ce08339815191525f611c7e84611fe4565b90505f80611c8f8360400151612a03565b915091508015611cf45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610560565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d2657611d266143f1565b6005811115611d3757611d376143f1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611dbe57611dbe6143f1565b1480611ddc5750600182516005811115611dda57611dda6143f1565b145b611e3b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610560565b600382516005811115611e5057611e506143f1565b03611e5d57506004611e61565b5060055b6020808301515f90815260098801909152604081205581816005811115611e8a57611e8a6143f1565b90816005811115611e9d57611e9d6143f1565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611ed157611ed16143f1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f9c57611f9c6143f1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610b5d6001600160a01b0382168361344a565b60408051606080820183525f8083526020830181905292820152905f80516020614ce08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612059573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208091908101906147ed565b91509150806120e75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610560565b825482511461214a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610560565b60208201516001600160a01b0316156121bd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610560565b509392505050565b5f805f83516036146121e95760405162461bcd60e51b815260040161056090614934565b5f805b6002811015612238576122008160016148fa565b61220b906008614628565b61ffff168682815181106122215761222161490d565b016020015160f81c901b91909117906001016121ec565b5061ffff81161561225b5760405162461bcd60e51b81526004016105609061497d565b5f805b60048110156122b6576122728160036148fa565b61227d906008614628565b63ffffffff168761228f836002614921565b8151811061229f5761229f61490d565b016020015160f81c901b919091179060010161225e565b5063ffffffff81166003146122dd5760405162461bcd60e51b8152600401610560906149c0565b5f805b6020811015612332576122f481601f6148fa565b6122ff906008614628565b8861230b836006614921565b8151811061231b5761231b61490d565b016020015160f81c901b91909117906001016122e0565b505f805b60088110156123915761234a8160076148fa565b612355906008614628565b6001600160401b03168961236a836026614921565b8151811061237a5761237a61490d565b016020015160f81c901b9190911790600101612336565b505f805b60088110156123f0576123a98160076148fa565b6123b4906008614628565b6001600160401b03168a6123c983602e614921565b815181106123d9576123d961490d565b016020015160f81c901b9190911790600101612395565b5091989097509095509350505050565b5f8181525f80516020614d2083398151915260205260408082208151610100810190925280545f80516020614ce083398151915293929190829060ff16600581111561244e5761244e6143f1565b600581111561245f5761245f6143f1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124e7576124e76143f1565b146125435760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610560565b60408101516001600160a01b0316336001600160a01b0316146125bd5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610560565b6125ca8160a001516119d9565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561260e5761260e6143f1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126da846126d481611957565b5f611a2e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612709908590600401614535565b6020604051808303815f875af1158015612725573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127499190614567565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020614d008339815191528054600119016127cf57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ca0833981519152906001600160401b0316612821604086016020870161437d565b6001600160401b031610156128905760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610560565b60038101546128a26020860186614a16565b61ffff16101580156128c657506127106128bf6020860186614a16565b61ffff1611155b6128e25760405162461bcd60e51b815260040161056090614a31565b80548310156129455760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610560565b80600101548311156129ac5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610560565b825f6129b782610b20565b90505f6129c488836134dd565b5f818152600586016020526040902090915087906129e28282614a7c565b509098975050505050505050565b60015f80516020614d0083398151915255565b5f808251602714612a265760405162461bcd60e51b815260040161056090614934565b5f805b6002811015612a7557612a3d8160016148fa565b612a48906008614628565b61ffff16858281518110612a5e57612a5e61490d565b016020015160f81c901b9190911790600101612a29565b5061ffff811615612a985760405162461bcd60e51b81526004016105609061497d565b5f805b6004811015612af357612aaf8160036148fa565b612aba906008614628565b63ffffffff1686612acc836002614921565b81518110612adc57612adc61490d565b016020015160f81c901b9190911790600101612a9b565b5063ffffffff8116600214612b1a5760405162461bcd60e51b8152600401610560906149c0565b5f805b6020811015612b6f57612b3181601f6148fa565b612b3c906008614628565b87612b48836006614921565b81518110612b5857612b5861490d565b016020015160f81c901b9190911790600101612b1d565b505f86602681518110612b8457612b8461490d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612bad61279e565b5f80516020614ca08339815191525f612bc584610b20565b90505f612bd1876115dc565b9050600281516005811115612be857612be86143f1565b14612c475760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610560565b612c5082613a17565b5f828260a00151612c61919061463f565b60048501546060840151919250612c83916001600160401b0390911690614ad2565b6001600160401b0316816001600160401b03161115612d025760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610560565b612d0c88826119e6565b5f612d1689611957565b90505f8982604051602001612d4292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612d7c8d8688611a2e565b6040518263ffffffff1660e01b8152600401612d989190614535565b6020604051808303815f875af1158015612db4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dd89190614567565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612e6057612e606143f1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611c4660015f80516020614d0083398151915255565b5f808251602e14612fc25760405162461bcd60e51b815260040161056090614934565b5f805b600281101561301157612fd98160016148fa565b612fe4906008614628565b61ffff16858281518110612ffa57612ffa61490d565b016020015160f81c901b9190911790600101612fc5565b5061ffff8116156130345760405162461bcd60e51b81526004016105609061497d565b5f805b600481101561308f5761304b8160036148fa565b613056906008614628565b63ffffffff1686613068836002614921565b815181106130785761307861490d565b016020015160f81c901b9190911790600101613037565b5063ffffffff81166004146130b65760405162461bcd60e51b8152600401610560906149c0565b5f805b602081101561310b576130cd81601f6148fa565b6130d8906008614628565b876130e4836006614921565b815181106130f4576130f461490d565b016020015160f81c901b91909117906001016130b9565b505f805b600881101561316a576131238160076148fa565b61312e906008614628565b6001600160401b031688613143836026614921565b815181106131535761315361490d565b016020015160f81c901b919091179060010161310f565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614ce083398151915290600160401b900460ff165f036131bd57505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b031660608201524291158061321f57506002830154815161321b916001600160401b031690614921565b8210155b15613245576001600160401b038516606082015281815260408101516020820152613264565b8481606001818151613257919061463f565b6001600160401b03169052505b6060810151613274906064614ad2565b602082015160028501546001600160401b03929092169161329f9190600160401b900460ff16614628565b10156133035760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610560565b831561332c57846001600160401b0316816040018181516133249190614921565b90525061334b565b846001600160401b03168160400181815161334791906148fa565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166133dc57604051631afcd79f60e31b815260040160405180910390fd5b565b6133e6613393565b6133ef81613a22565b6119e3608082013560a083013561340c60e0850160c0860161437d565b61341d610100860160e08701614a16565b61ffff1661343361012087016101008801614afd565b61344561014088016101208901614b1d565b613a43565b8047101561346d5760405163cd78605960e01b8152306004820152602401610560565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146134b6576040519150601f19603f3d011682016040523d82523d5f602084013e6134bb565b606091505b50509050806115cb57604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614ce0833981519152426134fd604086016020870161437d565b6001600160401b03161161356f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610560565b61357f604085016020860161437d565b6001600160401b0316613595426202a300614921565b116136085760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610560565b83356136605760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610560565b83355f908152600982016020526040902054156136d05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610560565b6136dd6040850185614b38565b90506030146137445760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610560565b61374d83613a17565b5f806137e76040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613792919061437d565b6001600160401b031681526020016137ad60408a018a614b38565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613c87565b5f828152600786016020526040902091935091506138058282614bc5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613832908590600401614535565b6020604051808303815f875af115801561384e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138729190614567565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff191660018360058111156138f4576138f46143f1565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916139e991908e01908e0161437d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6119e3816001613177565b613a2a613393565b613a3261402c565b613a3a61403c565b6119e381614044565b613a4b613393565b5f80516020614ca083398151915283613ab75760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610560565b612710841115613ad95760405162461bcd60e51b815260040161056090614a31565b85871115613b415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610560565b5f8360ff1611613bae5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610560565b600a60ff84161115613c205760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610560565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613cf15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610560565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613d6857613d288160016148fa565b613d33906008614628565b5081515f90839083908110613d4a57613d4a61490d565b60200101906001600160f81b03191690815f1a905350600101613d14565b505f5b6004811015613dc657613d7f8160036148fa565b613d8a906008614628565b505f82613d98836002614921565b81518110613da857613da861490d565b60200101906001600160f81b03191690815f1a905350600101613d6b565b505f5b6020811015613e235784518160208110613de557613de561490d565b1a60f81b82613df5836006614921565b81518110613e0557613e0561490d565b60200101906001600160f81b03191690815f1a905350600101613dc9565b505f5b6020811015613e835784602001518160208110613e4557613e4561490d565b1a60f81b82613e55836026614921565b81518110613e6557613e6561490d565b60200101906001600160f81b03191690815f1a905350600101613e26565b505f5b6008811015613ef757613e9a8160076148fa565b613ea5906008614628565b60ff1685604001516001600160401b0316901c60f81b82826046613ec99190614921565b81518110613ed957613ed961490d565b60200101906001600160f81b03191690815f1a905350600101613e86565b505f5b6030811015613f625784608001518181518110613f1957613f1961490d565b01602001516001600160f81b03191682613f3483604e614921565b81518110613f4457613f4461490d565b60200101906001600160f81b03191690815f1a905350600101613efa565b505f5b6008811015613fd457613f798160076148fa565b613f84906008614628565b60608601516001600160401b0390811691161c60f81b82613fa683607e614921565b81518110613fb657613fb661490d565b60200101906001600160f81b03191690815f1a905350600101613f65565b50600281604051613fe59190614c84565b602060405180830381855afa158015614000573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906140239190614567565b94909350915050565b614034613393565b6133dc6141ff565b6133dc613393565b61404c613393565b80355f80516020614ce083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146140986080840160608501614afd565b60ff1611156141055760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610560565b5f6141166080840160608501614afd565b60ff161161418c5760405162461bcd60e51b815260206004820152603960248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201527f70657263656e746167652063616e6e6f74206265207a65726f000000000000006064820152608401610560565b61419c6080830160608401614afd565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556141cd606083016040840161437d565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6129f0613393565b5080546142139061465f565b5f825580601f10614222575050565b601f0160209004905f5260205f20908101906119e39190614282565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614296575f8155600101614283565b5090565b80151581146119e3575f80fd5b803563ffffffff811681146142ba575f80fd5b919050565b5f805f606084860312156142d1575f80fd5b8335925060208401356142e38161429a565b91506142f1604085016142a7565b90509250925092565b5f6020828403121561430a575f80fd5b5035919050565b5f6101408284031215614322575f80fd5b50919050565b5f60208284031215614338575f80fd5b611c46826142a7565b5f8060408385031215614352575f80fd5b61435b836142a7565b946020939093013593505050565b6001600160401b03811681146119e3575f80fd5b5f6020828403121561438d575f80fd5b8135611c4681614369565b5f8082840360608112156143aa575f80fd5b83356001600160401b038111156143bf575f80fd5b8401606081870312156143d0575f80fd5b92506040601f19820112156143e3575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061442957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161445160408401826001600160a01b03169052565b50606083015161446c60608401826001600160401b03169052565b50608083015161448760808401826001600160401b03169052565b5060a08301516144a260a08401826001600160401b03169052565b5060c08301516144bd60c08401826001600160401b03169052565b5060e08301516144d860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144d8576144d86144df565b5f5b8381101561452d578181015183820152602001614515565b50505f910152565b602081525f8251806020840152614553816040850160208701614513565b601f01601f19169190910160400192915050565b5f60208284031215614577575f80fd5b5051919050565b5f8261459857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610b3057610b306144df565b6001600160401b038181168382160190808211156144d8576144d86144df565b600181811c9082168061467357607f821691505b60208210810361432257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546146ea8161465f565b806020870152604060018084165f811461470b576001811461472757614754565b60ff19851660408a0152604084151560051b8a01019550614754565b895f5260205f205f5b8581101561474b5781548b8201860152908301908801614730565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561479857614798614762565b60405290565b604051601f8201601f191681016001600160401b03811182821017156147c6576147c6614762565b604052919050565b6001600160a01b03811681146119e3575f80fd5b80516142ba8161429a565b5f80604083850312156147fe575f80fd5b82516001600160401b0380821115614814575f80fd5b9084019060608287031215614827575f80fd5b61482f614776565b82518152602080840151614842816147ce565b82820152604084015183811115614857575f80fd5b80850194505087601f85011261486b575f80fd5b83518381111561487d5761487d614762565b61488f601f8201601f1916830161479e565b935080845288828287010111156148a4575f80fd5b6148b381838601848801614513565b508260408301528195506148c88188016147e2565b9450505050509250929050565b5f6001600160401b038083168181036148f0576148f06144df565b6001019392505050565b81810381811115610b3057610b306144df565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610b3057610b306144df565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff811681146119e3575f80fd5b5f60208284031215614a26575f80fd5b8135611c4681614a07565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614a8781614a07565b61ffff8116905081548161ffff1982161783556020840135614aa881614369565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614af557614af56144df565b505092915050565b5f60208284031215614b0d575f80fd5b813560ff81168114611c46575f80fd5b5f60208284031215614b2d575f80fd5b8135611c46816147ce565b5f808335601e19843603018112614b4d575f80fd5b8301803591506001600160401b03821115614b66575f80fd5b602001915036819003821315614b7a575f80fd5b9250929050565b601f8211156115cb57805f5260205f20601f840160051c81016020851015614ba65750805b601f840160051c820191505b81811015610e37575f8155600101614bb2565b81516001600160401b03811115614bde57614bde614762565b614bf281614bec845461465f565b84614b81565b602080601f831160018114614c25575f8415614c0e5750858301515b5f19600386901b1c1916600185901b178555614c7c565b5f85815260208120601f198616915b82811015614c5357888601518255948401946001909101908401614c34565b5085821015614c7057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614c95818460208701614513565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614f09380380614f0983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614dbc8061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f36600461432f565b61043b565b005b348015610161575f80fd5b5061015461017036600461436a565b6108b3565b348015610180575f80fd5b506101bf61018f36600461436a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b50610154610212366004614381565b610a83565b348015610222575f80fd5b5061023661023136600461436a565b610b60565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b50610154610290366004614398565b610b76565b3480156102a0575f80fd5b506101546102af3660046143b1565b610ba1565b3480156102bf575f80fd5b506101bf6102ce3660046143ed565b610d71565b3480156102de575f80fd5b506102366102ed36600461436a565b610d8a565b3480156102fd575f80fd5b5061015461030c36600461432f565b610d9e565b6101bf61031f366004614408565b610e7e565b34801561032f575f80fd5b5061015461033e3660046143b1565b610eaa565b34801561034e575f80fd5b5061015461035d366004614398565b6110b9565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae36600461436a565b611276565b3480156103be575f80fd5b506101546103cd36600461436a565b6114fc565b6101bf6103e036600461436a565b611610565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b5061041861041336600461436a565b61161c565b6040516101c99190614475565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614d1083398151915291841561048d5761048a82856116fb565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf614461565b60048111156104d0576104d0614461565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561055757610557614461565b146105a95760405162461bcd60e51b815260206004820152602a60248201525f80516020614d308339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461060e5760405162461bcd60e51b815260206004820152603360248201525f80516020614d308339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105a0565b5f61061884611997565b90506106278260600151611a19565b600382526001600160401b0342811660a0840152811660e08301525f88815260068601602052604090208251815484929190829060ff1916600183600481111561067357610673614461565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107458561161c565b905082606001516001600160401b03168160a001516001600160401b0316116107bc5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105a0565b5f83606001518260a001516107d19190614563565b90506107dd8682611a26565b5f6005600160991b0163ee5b48eb6107f6898786611a6e565b6040518263ffffffff1660e01b815260040161081291906145a5565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085291906145d7565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614d9083398151915260205260408082208151610100810190925280545f80516020614d5083398151915293929190829060ff16600581111561090157610901614461565b600581111561091257610912614461565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561099757610997614461565b146109fc5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105a0565b6005600160991b016001600160a01b031663ee5b48eb610a218584608001515f611a6e565b6040518263ffffffff1660e01b8152600401610a3d91906145a5565b6020604051808303815f875af1158015610a59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7d91906145d7565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610acc575080546001600160401b03808416911610155b15610aea5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b1483611c8d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b7064e8d4a51000836145ee565b92915050565b5f610b8082611c9e565b9050610b9d81606001516001600160401b03168260400151612011565b5050565b5f80516020614d108339815191525f610bb984612024565b90505f80610bca8360400151612205565b50915091505f610bd98361161c565b9050816001600160401b031681608001516001600160401b03161015610c115760405162461bcd60e51b81526004016105a09061460d565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c565760405162461bcd60e51b81526004016105a09061464f565b60015f87815260068701602052604090205460ff166004811115610c7c57610c7c614461565b14610ce55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105a0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610b706001600160401b03831664e8d4a51000614698565b5f610d948261161c565b60a0015192915050565b5f80516020614d108339815191525f610db68561161c565b5f86815260058401602052604090205460c0820151919250610de891620100009091046001600160401b0316906146af565b6001600160401b0316421015610e5c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105a0565b8315610e6e57610e6c85846116fb565b505b610e7785612440565b5050505050565b5f610e876127de565b610e92838334612815565b9050610b7060015f80516020614d7083398151915255565b5f80516020614d108339815191525f610ec284612024565b90505f80610ed38360400151612205565b50915091505f610ee28361161c565b9050816001600160401b031681608001516001600160401b03161015610f1a5760405162461bcd60e51b81526004016105a09061460d565b5f8681526006860160205260409020600301546001600160401b0380841691161115610f585760405162461bcd60e51b81526004016105a09061464f565b60035f87815260068701602052604090205460ff166004811115610f7e57610f7e614461565b14610fd25760405162461bcd60e51b815260206004820152603160248201525f80516020614d308339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105a0565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261107791612011565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614d508339815191525f6110d183612024565b90505f806110e28360400151612a43565b91509150806111445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105a0565b5f8281526007850160205260408120805461115e906146cf565b9050118015611190575060015f83815260088601602052604090205460ff16600581111561118e5761118e614461565b145b6111ac5760405162461bcd60e51b81526004016105a090614701565b5f82815260078501602052604081206111c491614277565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614d1083398151915293929190829060ff1660048111156112d7576112d7614461565b60048111156112e8576112e8614461565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561136f5761136f614461565b148061138d575060038151600481111561138b5761138b614461565b145b6113e15760405162461bcd60e51b815260206004820152603260248201525f80516020614d30833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105a0565b5f6113ef826040015161161c565b905080608001516001600160401b03165f036114735760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105a0565b6005600160991b016001600160a01b031663ee5b48eb6114a0846040015184608001518560a00151611a6e565b6040518263ffffffff1660e01b81526004016114bc91906145a5565b6020604051808303815f875af11580156114d8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e7791906145d7565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614d50833981519152929190611544906146cf565b9050118015611576575060015f83815260088301602052604090205460ff16600581111561157457611574614461565b145b6115925760405162461bcd60e51b81526004016105a090614701565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916115cb9190600401614748565b6020604051808303815f875af11580156115e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160b91906145d7565b505050565b5f610b70823334612be4565b6116246142ae565b5f8281525f80516020614d908339815191526020526040908190208151610100810190925280545f80516020614d50833981519152929190829060ff16600581111561167257611672614461565b600581111561168357611683614461565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611746573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261176d919081019061485d565b91509150806117d05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105a0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611813573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183791906145d7565b82511461189b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105a0565b60208201516001600160a01b0316156119115760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105a0565b5f806119208460400151612fdf565b9150915081871461198d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105a0565b9695505050505050565b5f8181525f80516020614d908339815191526020526040812060030180545f80516020614d50833981519152916001600160401b0390911690836119da83614945565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611a23815f6131b7565b50565b5f9182525f80516020614d90833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ae757611aa781600161496a565b611ab2906008614698565b5081515f90839083908110611ac957611ac961497d565b60200101906001600160f81b03191690815f1a905350600101611a93565b505f5b6004811015611b4a57611afe81600361496a565b611b09906008614698565b6001901c60f81b82611b1c836002614991565b81518110611b2c57611b2c61497d565b60200101906001600160f81b03191690815f1a905350600101611aea565b505f5b6020811015611bac57611b6181601f61496a565b611b6c906008614698565b86901c60f81b82611b7e836006614991565b81518110611b8e57611b8e61497d565b60200101906001600160f81b03191690815f1a905350600101611b4d565b505f5b6008811015611c1757611bc381600761496a565b611bce906008614698565b6001600160401b038616901c60f81b82611be9836026614991565b81518110611bf957611bf961497d565b60200101906001600160f81b03191690815f1a905350600101611baf565b505f5b6008811015611c8257611c2e81600761496a565b611c39906008614698565b6001600160401b038516901c60f81b82611c5483602e614991565b81518110611c6457611c6461497d565b60200101906001600160f81b03191690815f1a905350600101611c1a565b5090505b9392505050565b611c95613411565b611a238161345c565b611ca66142ae565b5f80516020614d508339815191525f611cbe84612024565b90505f80611ccf8360400151612a43565b915091508015611d345760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105a0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d6657611d66614461565b6005811115611d7757611d77614461565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611dfe57611dfe614461565b1480611e1c5750600182516005811115611e1a57611e1a614461565b145b611e7b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105a0565b600382516005811115611e9057611e90614461565b03611e9d57506004611ea1565b5060055b6020808301515f90815260098801909152604081205581816005811115611eca57611eca614461565b90816005811115611edd57611edd614461565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611f1157611f11614461565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611fdc57611fdc614461565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610b9d6001600160a01b038216836134c8565b60408051606080820183525f8083526020830181905292820152905f80516020614d508339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612099573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120c0919081019061485d565b91509150806121275760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105a0565b825482511461218a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105a0565b60208201516001600160a01b0316156121fd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105a0565b509392505050565b5f805f83516036146122295760405162461bcd60e51b81526004016105a0906149a4565b5f805b60028110156122785761224081600161496a565b61224b906008614698565b61ffff168682815181106122615761226161497d565b016020015160f81c901b919091179060010161222c565b5061ffff81161561229b5760405162461bcd60e51b81526004016105a0906149ed565b5f805b60048110156122f6576122b281600361496a565b6122bd906008614698565b63ffffffff16876122cf836002614991565b815181106122df576122df61497d565b016020015160f81c901b919091179060010161229e565b5063ffffffff811660031461231d5760405162461bcd60e51b81526004016105a090614a30565b5f805b60208110156123725761233481601f61496a565b61233f906008614698565b8861234b836006614991565b8151811061235b5761235b61497d565b016020015160f81c901b9190911790600101612320565b505f805b60088110156123d15761238a81600761496a565b612395906008614698565b6001600160401b0316896123aa836026614991565b815181106123ba576123ba61497d565b016020015160f81c901b9190911790600101612376565b505f805b6008811015612430576123e981600761496a565b6123f4906008614698565b6001600160401b03168a61240983602e614991565b815181106124195761241961497d565b016020015160f81c901b91909117906001016123d5565b5091989097509095509350505050565b5f8181525f80516020614d9083398151915260205260408082208151610100810190925280545f80516020614d5083398151915293929190829060ff16600581111561248e5761248e614461565b600581111561249f5761249f614461565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561252757612527614461565b146125835760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105a0565b60408101516001600160a01b0316336001600160a01b0316146125fd5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105a0565b61260a8160a00151611a19565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561264e5761264e614461565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61271a8461271481611997565b5f611a6e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906127499085906004016145a5565b6020604051808303815f875af1158015612765573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278991906145d7565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020614d7083398151915280546001190161280f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614d10833981519152906001600160401b031661286160408601602087016143ed565b6001600160401b031610156128d05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105a0565b60038101546128e26020860186614a86565b61ffff161015801561290657506127106128ff6020860186614a86565b61ffff1611155b6129225760405162461bcd60e51b81526004016105a090614aa1565b80548310156129855760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105a0565b80600101548311156129ec5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105a0565b825f6129f782610b60565b90505f612a04888361355b565b5f81815260058601602052604090209091508790612a228282614aec565b509098975050505050505050565b60015f80516020614d7083398151915255565b5f808251602714612a665760405162461bcd60e51b81526004016105a0906149a4565b5f805b6002811015612ab557612a7d81600161496a565b612a88906008614698565b61ffff16858281518110612a9e57612a9e61497d565b016020015160f81c901b9190911790600101612a69565b5061ffff811615612ad85760405162461bcd60e51b81526004016105a0906149ed565b5f805b6004811015612b3357612aef81600361496a565b612afa906008614698565b63ffffffff1686612b0c836002614991565b81518110612b1c57612b1c61497d565b016020015160f81c901b9190911790600101612adb565b5063ffffffff8116600214612b5a5760405162461bcd60e51b81526004016105a090614a30565b5f805b6020811015612baf57612b7181601f61496a565b612b7c906008614698565b87612b88836006614991565b81518110612b9857612b9861497d565b016020015160f81c901b9190911790600101612b5d565b505f86602681518110612bc457612bc461497d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612bed6127de565b5f80516020614d108339815191525f612c0584610b60565b90505f612c118761161c565b9050600281516005811115612c2857612c28614461565b14612c875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105a0565b612c9082613a95565b5f828260a00151612ca191906146af565b60048501546060840151919250612cc3916001600160401b0390911690614b42565b6001600160401b0316816001600160401b03161115612d425760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105a0565b612d4c8882611a26565b5f612d5689611997565b90505f8982604051602001612d8292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612dbc8d8688611a6e565b6040518263ffffffff1660e01b8152600401612dd891906145a5565b6020604051808303815f875af1158015612df4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e1891906145d7565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612ea057612ea0614461565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611c8660015f80516020614d7083398151915255565b5f808251602e146130025760405162461bcd60e51b81526004016105a0906149a4565b5f805b60028110156130515761301981600161496a565b613024906008614698565b61ffff1685828151811061303a5761303a61497d565b016020015160f81c901b9190911790600101613005565b5061ffff8116156130745760405162461bcd60e51b81526004016105a0906149ed565b5f805b60048110156130cf5761308b81600361496a565b613096906008614698565b63ffffffff16866130a8836002614991565b815181106130b8576130b861497d565b016020015160f81c901b9190911790600101613077565b5063ffffffff81166004146130f65760405162461bcd60e51b81526004016105a090614a30565b5f805b602081101561314b5761310d81601f61496a565b613118906008614698565b87613124836006614991565b815181106131345761313461497d565b016020015160f81c901b91909117906001016130f9565b505f805b60088110156131aa5761316381600761496a565b61316e906008614698565b6001600160401b031688613183836026614991565b815181106131935761319361497d565b016020015160f81c901b919091179060010161314f565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614d5083398151915291429190158061329d575060028301548151613299916001600160401b031690614991565b8210155b156132c3576001600160401b0385166060820152818152604081015160208201526132e2565b84816060018181516132d591906146af565b6001600160401b03169052505b60608101516132f2906064614b42565b602082015160028501546001600160401b03929092169161331d9190600160401b900460ff16614698565b10156133815760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105a0565b83156133aa57846001600160401b0316816040018181516133a29190614991565b9052506133c9565b846001600160401b0316816040018181516133c5919061496a565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661345a57604051631afcd79f60e31b815260040160405180910390fd5b565b613464613411565b61346d81613aa0565b611a23608082013560a083013561348a60e0850160c086016143ed565b61349b610100860160e08701614a86565b61ffff166134b161012087016101008801614b6d565b6134c361014088016101208901614b8d565b613ac1565b804710156134eb5760405163cd78605960e01b81523060048201526024016105a0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613534576040519150601f19603f3d011682016040523d82523d5f602084013e613539565b606091505b505090508061160b57604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614d508339815191524261357b60408601602087016143ed565b6001600160401b0316116135ed5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105a0565b6135fd60408501602086016143ed565b6001600160401b03166136136202a30042614991565b116136865760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105a0565b83356136de5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105a0565b83355f9081526009820160205260409020541561374e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105a0565b61375b6040850185614ba8565b90506030146137c25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105a0565b6137cb83613a95565b5f806138656040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061381091906143ed565b6001600160401b0316815260200161382b60408a018a614ba8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613d05565b5f828152600786016020526040902091935091506138838282614c35565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138b09085906004016145a5565b6020604051808303815f875af11580156138cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138f091906145d7565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561397257613972614461565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a6791908e01908e016143ed565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611a238160016131b7565b613aa8613411565b613ab06140aa565b613ab86140ba565b611a23816140c2565b613ac9613411565b5f80516020614d1083398151915283613b355760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105a0565b612710841115613b575760405162461bcd60e51b81526004016105a090614aa1565b85871115613bbf5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105a0565b5f8360ff1611613c2c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105a0565b600a60ff84161115613c9e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105a0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613d6f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105a0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613de657613da681600161496a565b613db1906008614698565b5081515f90839083908110613dc857613dc861497d565b60200101906001600160f81b03191690815f1a905350600101613d92565b505f5b6004811015613e4457613dfd81600361496a565b613e08906008614698565b505f82613e16836002614991565b81518110613e2657613e2661497d565b60200101906001600160f81b03191690815f1a905350600101613de9565b505f5b6020811015613ea15784518160208110613e6357613e6361497d565b1a60f81b82613e73836006614991565b81518110613e8357613e8361497d565b60200101906001600160f81b03191690815f1a905350600101613e47565b505f5b6020811015613f015784602001518160208110613ec357613ec361497d565b1a60f81b82613ed3836026614991565b81518110613ee357613ee361497d565b60200101906001600160f81b03191690815f1a905350600101613ea4565b505f5b6008811015613f7557613f1881600761496a565b613f23906008614698565b60ff1685604001516001600160401b0316901c60f81b82826046613f479190614991565b81518110613f5757613f5761497d565b60200101906001600160f81b03191690815f1a905350600101613f04565b505f5b6030811015613fe05784608001518181518110613f9757613f9761497d565b01602001516001600160f81b03191682613fb283604e614991565b81518110613fc257613fc261497d565b60200101906001600160f81b03191690815f1a905350600101613f78565b505f5b600881101561405257613ff781600761496a565b614002906008614698565b60608601516001600160401b0390811691161c60f81b8261402483607e614991565b815181106140345761403461497d565b60200101906001600160f81b03191690815f1a905350600101613fe3565b506002816040516140639190614cf4565b602060405180830381855afa15801561407e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906140a191906145d7565b94909350915050565b6140b2613411565b61345a61426f565b61345a613411565b6140ca613411565b80355f80516020614d5083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146141166080840160608501614b6d565b60ff1611156141835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105a0565b5f6141946080840160608501614b6d565b60ff16116141fc5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105a0565b61420c6080830160608401614b6d565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561423d60608301604084016143ed565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612a30613411565b508054614283906146cf565b5f825580601f10614292575050565b601f0160209004905f5260205f2090810190611a2391906142f2565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614306575f81556001016142f3565b5090565b8015158114611a23575f80fd5b803563ffffffff8116811461432a575f80fd5b919050565b5f805f60608486031215614341575f80fd5b8335925060208401356143538161430a565b915061436160408501614317565b90509250925092565b5f6020828403121561437a575f80fd5b5035919050565b5f6101408284031215614392575f80fd5b50919050565b5f602082840312156143a8575f80fd5b611c8682614317565b5f80604083850312156143c2575f80fd5b6143cb83614317565b946020939093013593505050565b6001600160401b0381168114611a23575f80fd5b5f602082840312156143fd575f80fd5b8135611c86816143d9565b5f80828403606081121561441a575f80fd5b83356001600160401b0381111561442f575f80fd5b840160608187031215614440575f80fd5b92506040601f1982011215614453575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061449957634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516144c160408401826001600160a01b03169052565b5060608301516144dc60608401826001600160401b03169052565b5060808301516144f760808401826001600160401b03169052565b5060a083015161451260a08401826001600160401b03169052565b5060c083015161452d60c08401826001600160401b03169052565b5060e083015161454860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156145485761454861454f565b5f5b8381101561459d578181015183820152602001614585565b50505f910152565b602081525f82518060208401526145c3816040850160208701614583565b601f01601f19169190910160400192915050565b5f602082840312156145e7575f80fd5b5051919050565b5f8261460857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610b7057610b7061454f565b6001600160401b038181168382160190808211156145485761454861454f565b600181811c908216806146e357607f821691505b60208210810361439257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461475a816146cf565b806020870152604060018084165f811461477b5760018114614797576147c4565b60ff19851660408a0152604084151560051b8a010195506147c4565b895f5260205f205f5b858110156147bb5781548b82018601529083019088016147a0565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614808576148086147d2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614836576148366147d2565b604052919050565b6001600160a01b0381168114611a23575f80fd5b805161432a8161430a565b5f806040838503121561486e575f80fd5b82516001600160401b0380821115614884575f80fd5b9084019060608287031215614897575f80fd5b61489f6147e6565b825181526020808401516148b28161483e565b828201526040840151838111156148c7575f80fd5b80850194505087601f8501126148db575f80fd5b8351838111156148ed576148ed6147d2565b6148ff601f8201601f1916830161480e565b93508084528882828701011115614914575f80fd5b61492381838601848801614583565b50826040830152819550614938818801614852565b9450505050509250929050565b5f6001600160401b038083168181036149605761496061454f565b6001019392505050565b81810381811115610b7057610b7061454f565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610b7057610b7061454f565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611a23575f80fd5b5f60208284031215614a96575f80fd5b8135611c8681614a77565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614af781614a77565b61ffff8116905081548161ffff1982161783556020840135614b18816143d9565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614b6557614b6561454f565b505092915050565b5f60208284031215614b7d575f80fd5b813560ff81168114611c86575f80fd5b5f60208284031215614b9d575f80fd5b8135611c868161483e565b5f808335601e19843603018112614bbd575f80fd5b8301803591506001600160401b03821115614bd6575f80fd5b602001915036819003821315614bea575f80fd5b9250929050565b601f82111561160b57805f5260205f20601f840160051c81016020851015614c165750805b601f840160051c820191505b81811015610e77575f8155600101614c22565b81516001600160401b03811115614c4e57614c4e6147d2565b614c6281614c5c84546146cf565b84614bf1565b602080601f831160018114614c95575f8415614c7e5750858301515b5f19600386901b1c1916600185901b178555614cec565b5f85815260208120601f198616915b82811015614cc357888601518255948401946001909101908401614ca4565b5085821015614ce057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614d05818460208701614583565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -246,6 +246,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorRaw) Transa return _NativeTokenStakingManager.Contract.contract.Transact(opts, method, params...) } +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMCHURNPERCENTAGELIMIT(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_CHURN_PERCENTAGE_LIMIT") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_NativeTokenStakingManager.CallOpts) +} + // MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. // // Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) @@ -277,6 +308,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMU return _NativeTokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_NativeTokenStakingManager.CallOpts) } +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMREGISTRATIONEXPIRYLENGTH(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_REGISTRATION_EXPIRY_LENGTH") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_NativeTokenStakingManager.CallOpts) +} + // MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. // // Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index c6bd85d5c..e8db2a7e7 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -58,8 +58,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612f8e380380612f8e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612e418061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc14610225578063bee0a03f14610233578063d5f20ff614610246578063f2fde38b14610266575f80fd5b80638da5cb5b146101bb57806397fb70d4146101ff578063a3a65e4814610212575f80fd5b8063580a4006116100c3578063580a40061461016257806366435abf14610175578063715018a6146101a05780638994ab49146101a8575f80fd5b80630322ed98146100e95780630cdd0985146100fe578063467ef06f1461014f575b5f80fd5b6100fc6100f736600461269e565b610279565b005b61013c61010c36600461269e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6100fc61015d3660046126b5565b61044e565b6100fc6101703660046126f3565b61045b565b61018861018336600461269e565b610569565b6040516001600160401b039091168152602001610146565b6100fc61057d565b61013c6101b636600461274a565b610590565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610146565b6100fc61020d36600461269e565b6105ac565b6100fc6102203660046126b5565b6105b8565b6101e76005600160991b0181565b6100fc61024136600461269e565b610775565b61025961025436600461269e565b610889565b60405161014691906127ac565b6100fc610274366004612886565b610968565b5f8181525f80516020612e1583398151915260205260408082208151610100810190925280545f80516020612df583398151915293929190829060ff1660058111156102c7576102c7612798565b60058111156102d8576102d8612798565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561035d5761035d612798565b146103c75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103ec8584608001515f6109a2565b6040518263ffffffff1660e01b815260040161040891906128c3565b6020604051808303815f875af1158015610424573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044891906128f5565b50505050565b61045781610bbf565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561049f5750825b90505f826001600160401b031660011480156104ba5750303b155b9050811580156104c8575080155b156104e65760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561051057845460ff60401b1916600160401b1785555b61051a8787610f32565b831561056057845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f61057382610889565b60a0015192915050565b610585610f4c565b61058e5f610fa7565b565b5f610599610f4c565b6105a38383611017565b90505b92915050565b6105b581611551565b50565b5f80516020612df58339815191525f6105d0836118ef565b90505f806105e18360400151611ad0565b91509150806106435760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103be565b5f8281526007850160205260408120805461065d9061290c565b905011801561068f575060015f83815260088601602052604090205460ff16600581111561068d5761068d612798565b145b6106ab5760405162461bcd60e51b81526004016103be90612944565b5f82815260078501602052604081206106c39161260b565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612df58339815191529291906107bd9061290c565b90501180156107ef575060015f83815260088301602052604090205460ff1660058111156107ed576107ed612798565b145b61080b5760405162461bcd60e51b81526004016103be90612944565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610844919060040161298b565b6020604051808303815f875af1158015610860573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088491906128f5565b505050565b610891612642565b5f8281525f80516020612e158339815191526020526040908190208151610100810190925280545f80516020612df5833981519152929190829060ff1660058111156108df576108df612798565b60058111156108f0576108f0612798565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b610970610f4c565b6001600160a01b03811661099957604051631e4fbdf760e01b81525f60048201526024016103be565b6105b581610fa7565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a1b576109db816001612a3d565b6109e6906008612a50565b5081515f908390839081106109fd576109fd612a67565b60200101906001600160f81b03191690815f1a9053506001016109c7565b505f5b6004811015610a7e57610a32816003612a3d565b610a3d906008612a50565b6001901c60f81b82610a50836002612a7b565b81518110610a6057610a60612a67565b60200101906001600160f81b03191690815f1a905350600101610a1e565b505f5b6020811015610ae057610a9581601f612a3d565b610aa0906008612a50565b86901c60f81b82610ab2836006612a7b565b81518110610ac257610ac2612a67565b60200101906001600160f81b03191690815f1a905350600101610a81565b505f5b6008811015610b4b57610af7816007612a3d565b610b02906008612a50565b6001600160401b038616901c60f81b82610b1d836026612a7b565b81518110610b2d57610b2d612a67565b60200101906001600160f81b03191690815f1a905350600101610ae3565b505f5b6008811015610bb657610b62816007612a3d565b610b6d906008612a50565b6001600160401b038516901c60f81b82610b8883602e612a7b565b81518110610b9857610b98612a67565b60200101906001600160f81b03191690815f1a905350600101610b4e565b50949350505050565b610bc7612642565b5f80516020612df58339815191525f610bdf846118ef565b90505f80610bf08360400151611ad0565b915091508015610c555760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103be565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610c8757610c87612798565b6005811115610c9857610c98612798565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d1f57610d1f612798565b1480610d3d5750600182516005811115610d3b57610d3b612798565b145b610d9c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103be565b600382516005811115610db157610db1612798565b03610dbe57506004610dc2565b5060055b6020808301515f90815260098801909152604081205581816005811115610deb57610deb612798565b90816005811115610dfe57610dfe612798565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610e3257610e32612798565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610efd57610efd612798565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610f3a611d2f565b610f4382611d78565b61045781611d99565b33610f7e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461058e5760405163118cdaa760e01b81523360048201526024016103be565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612df5833981519152426110376040860160208701612a8e565b6001600160401b0316116110a95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103be565b6110b96040850160208601612a8e565b6001600160401b03166110cf426202a300612a7b565b116111425760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103be565b833561119a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103be565b83355f9081526009820160205260409020541561120a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103be565b6112176040850185612aa7565b905060301461127e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103be565b61128783611daa565b5f806113216040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906112cc9190612a8e565b6001600160401b031681526020016112e760408a018a612aa7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611db5565b5f8281526007860160205260409020919350915061133f8282612b3b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061136c9085906004016128c3565b6020604051808303815f875af1158015611388573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ac91906128f5565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561142e5761142e612798565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161152391908e01908e01612a8e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612e1583398151915260205260408082208151610100810190925280545f80516020612df583398151915293929190829060ff16600581111561159f5761159f612798565b60058111156115b0576115b0612798565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561163857611638612798565b146116945760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103be565b60408101516001600160a01b0316336001600160a01b03161461170e5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103be565b61171b8160a0015161215a565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561175f5761175f612798565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61182b8461182581612164565b5f6109a2565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061185a9085906004016128c3565b6020604051808303815f875af1158015611876573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061189a91906128f5565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612df58339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611964573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261198b9190810190612c61565b91509150806119f25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103be565b8254825114611a555760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103be565b60208201516001600160a01b031615611ac85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103be565b509392505050565b5f808251602714611b355760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103be565b5f805b6002811015611b8457611b4c816001612a3d565b611b57906008612a50565b61ffff16858281518110611b6d57611b6d612a67565b016020015160f81c901b9190911790600101611b38565b5061ffff811615611be35760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103be565b5f805b6004811015611c3e57611bfa816003612a3d565b611c05906008612a50565b63ffffffff1686611c17836002612a7b565b81518110611c2757611c27612a67565b016020015160f81c901b9190911790600101611be6565b5063ffffffff8116600214611ca55760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103be565b5f805b6020811015611cfa57611cbc81601f612a3d565b611cc7906008612a50565b87611cd3836006612a7b565b81518110611ce357611ce3612a67565b016020015160f81c901b9190911790600101611ca8565b505f86602681518110611d0f57611d0f612a67565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661058e57604051631afcd79f60e31b815260040160405180910390fd5b611d80611d2f565b611d886121e6565b611d906121f6565b6105b5816121fe565b611da1611d2f565b6105b5816123b9565b6105b58160016123c1565b5f6060826080015151603014611e1f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103be565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e9657611e56816001612a3d565b611e61906008612a50565b5081515f90839083908110611e7857611e78612a67565b60200101906001600160f81b03191690815f1a905350600101611e42565b505f5b6004811015611ef457611ead816003612a3d565b611eb8906008612a50565b505f82611ec6836002612a7b565b81518110611ed657611ed6612a67565b60200101906001600160f81b03191690815f1a905350600101611e99565b505f5b6020811015611f515784518160208110611f1357611f13612a67565b1a60f81b82611f23836006612a7b565b81518110611f3357611f33612a67565b60200101906001600160f81b03191690815f1a905350600101611ef7565b505f5b6020811015611fb15784602001518160208110611f7357611f73612a67565b1a60f81b82611f83836026612a7b565b81518110611f9357611f93612a67565b60200101906001600160f81b03191690815f1a905350600101611f54565b505f5b600881101561202557611fc8816007612a3d565b611fd3906008612a50565b60ff1685604001516001600160401b0316901c60f81b82826046611ff79190612a7b565b8151811061200757612007612a67565b60200101906001600160f81b03191690815f1a905350600101611fb4565b505f5b6030811015612090578460800151818151811061204757612047612a67565b01602001516001600160f81b0319168261206283604e612a7b565b8151811061207257612072612a67565b60200101906001600160f81b03191690815f1a905350600101612028565b505f5b6008811015612102576120a7816007612a3d565b6120b2906008612a50565b60608601516001600160401b0390811691161c60f81b826120d483607e612a7b565b815181106120e4576120e4612a67565b60200101906001600160f81b03191690815f1a905350600101612093565b506002816040516121139190612d49565b602060405180830381855afa15801561212e573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061215191906128f5565b94909350915050565b6105b5815f6123c1565b5f8181525f80516020612e158339815191526020526040812060030180545f80516020612df5833981519152916001600160401b0390911690836121a783612d64565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6121ee611d2f565b61058e6125dd565b61058e611d2f565b612206611d2f565b80355f80516020612df583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146122526080840160608501612d89565b60ff1611156122bf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103be565b5f6122d06080840160608501612d89565b60ff16116123465760405162461bcd60e51b815260206004820152603960248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201527f70657263656e746167652063616e6e6f74206265207a65726f0000000000000060648201526084016103be565b6123566080830160608401612d89565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556123876060830160408401612a8e565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b610970611d2f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612df583398151915290600160401b900460ff165f0361240757505050565b6040805160808101825260038301548082526004840154602083015260058401549282019290925260068301546001600160401b0316606082015242911580612469575060028301548151612465916001600160401b031690612a7b565b8210155b1561248f576001600160401b0385166060820152818152604081015160208201526124ae565b84816060018181516124a19190612da9565b6001600160401b03169052505b60608101516124be906064612dc9565b602082015160028501546001600160401b0392909216916124e99190600160401b900460ff16612a50565b101561254d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103be565b831561257657846001600160401b03168160400181815161256e9190612a7b565b905250612595565b846001600160401b0316816040018181516125919190612a3d565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b6125e5611d2f565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5080546126179061290c565b5f825580601f10612626575050565b601f0160209004905f5260205f20908101906105b59190612686565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561269a575f8155600101612687565b5090565b5f602082840312156126ae575f80fd5b5035919050565b5f602082840312156126c5575f80fd5b813563ffffffff811681146126d8575f80fd5b9392505050565b6001600160a01b03811681146105b5575f80fd5b5f8082840360a0811215612705575f80fd5b6080811215612712575f80fd5b508291506080830135612724816126df565b809150509250929050565b80356001600160401b0381168114612745575f80fd5b919050565b5f806040838503121561275b575f80fd5b82356001600160401b03811115612770575f80fd5b830160608186031215612781575f80fd5b915061278f6020840161272f565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106127d057634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516127f860408401826001600160a01b03169052565b50606083015161281360608401826001600160401b03169052565b50608083015161282e60808401826001600160401b03169052565b5060a083015161284960a08401826001600160401b03169052565b5060c083015161286460c08401826001600160401b03169052565b5060e083015161287f60e08401826001600160401b03169052565b5092915050565b5f60208284031215612896575f80fd5b81356126d8816126df565b5f5b838110156128bb5781810151838201526020016128a3565b50505f910152565b602081525f82518060208401526128e18160408501602087016128a1565b601f01601f19169190910160400192915050565b5f60208284031215612905575f80fd5b5051919050565b600181811c9082168061292057607f821691505b60208210810361293e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461299d8161290c565b806020870152604060018084165f81146129be57600181146129da57612a07565b60ff19851660408a0152604084151560051b8a01019550612a07565b895f5260205f205f5b858110156129fe5781548b82018601529083019088016129e3565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105a6576105a6612a29565b80820281158282048414176105a6576105a6612a29565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105a6576105a6612a29565b5f60208284031215612a9e575f80fd5b6105a38261272f565b5f808335601e19843603018112612abc575f80fd5b8301803591506001600160401b03821115612ad5575f80fd5b602001915036819003821315612ae9575f80fd5b9250929050565b601f82111561088457805f5260205f20601f840160051c81016020851015612b155750805b601f840160051c820191505b81811015612b34575f8155600101612b21565b5050505050565b81516001600160401b03811115612b5457612b54612a15565b612b6881612b62845461290c565b84612af0565b602080601f831160018114612b9b575f8415612b845750858301515b5f19600386901b1c1916600185901b178555612bf2565b5f85815260208120601f198616915b82811015612bc957888601518255948401946001909101908401612baa565b5085821015612be657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b0381118282101715612c1c57612c1c612a15565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612c4a57612c4a612a15565b604052919050565b80518015158114612745575f80fd5b5f8060408385031215612c72575f80fd5b82516001600160401b0380821115612c88575f80fd5b9084019060608287031215612c9b575f80fd5b612ca3612bfa565b82518152602080840151612cb6816126df565b82820152604084015183811115612ccb575f80fd5b80850194505087601f850112612cdf575f80fd5b835183811115612cf157612cf1612a15565b612d03601f8201601f19168301612c22565b93508084528882828701011115612d18575f80fd5b612d27818386018488016128a1565b50826040830152819550612d3c818801612c52565b9450505050509250929050565b5f8251612d5a8184602087016128a1565b9190910192915050565b5f6001600160401b03808316818103612d7f57612d7f612a29565b6001019392505050565b5f60208284031215612d99575f80fd5b813560ff811681146126d8575f80fd5b6001600160401b0381811683821601908082111561287f5761287f612a29565b6001600160401b03818116838216028082169190828114612dec57612dec612a29565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051612ff8380380612ff883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612eab8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c806397fb70d411610093578063c974d1b611610063578063c974d1b61461025c578063d5f20ff614610276578063df93d8de14610296578063f2fde38b146102a0575f80fd5b806397fb70d414610215578063a3a65e4814610228578063b771b3bc1461023b578063bee0a03f14610249575f80fd5b806366435abf116100ce57806366435abf1461018b578063715018a6146101b65780638994ab49146101be5780638da5cb5b146101d1575f80fd5b80630322ed98146100ff5780630cdd098514610114578063467ef06f14610165578063580a400614610178575b5f80fd5b61011261010d366004612708565b6102b3565b005b610152610122366004612708565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011261017336600461271f565b610488565b61011261018636600461275d565b610495565b61019e610199366004612708565b6105a3565b6040516001600160401b03909116815260200161015c565b6101126105b7565b6101526101cc3660046127b4565b6105ca565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b610112610223366004612708565b6105e6565b61011261023636600461271f565b6105f2565b6101fd6005600160991b0181565b610112610257366004612708565b6107af565b610264601481565b60405160ff909116815260200161015c565b610289610284366004612708565b6108c3565b60405161015c9190612816565b61019e6202a30081565b6101126102ae3660046128f0565b6109a2565b5f8181525f80516020612e7f83398151915260205260408082208151610100810190925280545f80516020612e5f83398151915293929190829060ff16600581111561030157610301612802565b600581111561031257610312612802565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561039757610397612802565b146104015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104268584608001515f6109dc565b6040518263ffffffff1660e01b8152600401610442919061292d565b6020604051808303815f875af115801561045e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610482919061295f565b50505050565b61049181610bf9565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104d95750825b90505f826001600160401b031660011480156104f45750303b155b905081158015610502575080155b156105205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561054a57845460ff60401b1916600160401b1785555b6105548787610f6c565b831561059a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105ad826108c3565b60a0015192915050565b6105bf610f86565b6105c85f610fe1565b565b5f6105d3610f86565b6105dd8383611051565b90505b92915050565b6105ef8161158b565b50565b5f80516020612e5f8339815191525f61060a83611929565b90505f8061061b8360400151611b0a565b915091508061067d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f8565b5f8281526007850160205260408120805461069790612976565b90501180156106c9575060015f83815260088601602052604090205460ff1660058111156106c7576106c7612802565b145b6106e55760405162461bcd60e51b81526004016103f8906129ae565b5f82815260078501602052604081206106fd91612675565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612e5f8339815191529291906107f790612976565b9050118015610829575060015f83815260088301602052604090205460ff16600581111561082757610827612802565b145b6108455760405162461bcd60e51b81526004016103f8906129ae565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087e91906004016129f5565b6020604051808303815f875af115801561089a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108be919061295f565b505050565b6108cb6126ac565b5f8281525f80516020612e7f8339815191526020526040908190208151610100810190925280545f80516020612e5f833981519152929190829060ff16600581111561091957610919612802565b600581111561092a5761092a612802565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6109aa610f86565b6001600160a01b0381166109d357604051631e4fbdf760e01b81525f60048201526024016103f8565b6105ef81610fe1565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a5557610a15816001612aa7565b610a20906008612aba565b5081515f90839083908110610a3757610a37612ad1565b60200101906001600160f81b03191690815f1a905350600101610a01565b505f5b6004811015610ab857610a6c816003612aa7565b610a77906008612aba565b6001901c60f81b82610a8a836002612ae5565b81518110610a9a57610a9a612ad1565b60200101906001600160f81b03191690815f1a905350600101610a58565b505f5b6020811015610b1a57610acf81601f612aa7565b610ada906008612aba565b86901c60f81b82610aec836006612ae5565b81518110610afc57610afc612ad1565b60200101906001600160f81b03191690815f1a905350600101610abb565b505f5b6008811015610b8557610b31816007612aa7565b610b3c906008612aba565b6001600160401b038616901c60f81b82610b57836026612ae5565b81518110610b6757610b67612ad1565b60200101906001600160f81b03191690815f1a905350600101610b1d565b505f5b6008811015610bf057610b9c816007612aa7565b610ba7906008612aba565b6001600160401b038516901c60f81b82610bc283602e612ae5565b81518110610bd257610bd2612ad1565b60200101906001600160f81b03191690815f1a905350600101610b88565b50949350505050565b610c016126ac565b5f80516020612e5f8339815191525f610c1984611929565b90505f80610c2a8360400151611b0a565b915091508015610c8f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610cc157610cc1612802565b6005811115610cd257610cd2612802565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d5957610d59612802565b1480610d775750600182516005811115610d7557610d75612802565b145b610dd65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103f8565b600382516005811115610deb57610deb612802565b03610df857506004610dfc565b5060055b6020808301515f90815260098801909152604081205581816005811115610e2557610e25612802565b90816005811115610e3857610e38612802565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610e6c57610e6c612802565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610f3757610f37612802565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610f74611d69565b610f7d82611db2565b61049181611dd3565b33610fb87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c85760405163118cdaa760e01b81523360048201526024016103f8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612e5f833981519152426110716040860160208701612af8565b6001600160401b0316116110e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103f8565b6110f36040850160208601612af8565b6001600160401b03166111096202a30042612ae5565b1161117c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103f8565b83356111d45760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f8565b83355f908152600982016020526040902054156112445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f8565b6112516040850185612b11565b90506030146112b85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f8565b6112c183611de4565b5f8061135b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906113069190612af8565b6001600160401b0316815260200161132160408a018a612b11565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611def565b5f828152600786016020526040902091935091506113798282612ba5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113a690859060040161292d565b6020604051808303815f875af11580156113c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e6919061295f565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561146857611468612802565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161155d91908e01908e01612af8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612e7f83398151915260205260408082208151610100810190925280545f80516020612e5f83398151915293929190829060ff1660058111156115d9576115d9612802565b60058111156115ea576115ea612802565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561167257611672612802565b146116ce5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f8565b60408101516001600160a01b0316336001600160a01b0316146117485760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103f8565b6117558160a00151612194565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561179957611799612802565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6118658461185f8161219e565b5f6109dc565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061189490859060040161292d565b6020604051808303815f875af11580156118b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118d4919061295f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612e5f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561199e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119c59190810190612ccb565b9150915080611a2c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f8565b8254825114611a8f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103f8565b60208201516001600160a01b031615611b025760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103f8565b509392505050565b5f808251602714611b6f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103f8565b5f805b6002811015611bbe57611b86816001612aa7565b611b91906008612aba565b61ffff16858281518110611ba757611ba7612ad1565b016020015160f81c901b9190911790600101611b72565b5061ffff811615611c1d5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103f8565b5f805b6004811015611c7857611c34816003612aa7565b611c3f906008612aba565b63ffffffff1686611c51836002612ae5565b81518110611c6157611c61612ad1565b016020015160f81c901b9190911790600101611c20565b5063ffffffff8116600214611cdf5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103f8565b5f805b6020811015611d3457611cf681601f612aa7565b611d01906008612aba565b87611d0d836006612ae5565b81518110611d1d57611d1d612ad1565b016020015160f81c901b9190911790600101611ce2565b505f86602681518110611d4957611d49612ad1565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c857604051631afcd79f60e31b815260040160405180910390fd5b611dba611d69565b611dc2612220565b611dca612230565b6105ef81612238565b611ddb611d69565b6105ef816123e5565b6105ef8160016123ed565b5f6060826080015151603014611e595760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611ed057611e90816001612aa7565b611e9b906008612aba565b5081515f90839083908110611eb257611eb2612ad1565b60200101906001600160f81b03191690815f1a905350600101611e7c565b505f5b6004811015611f2e57611ee7816003612aa7565b611ef2906008612aba565b505f82611f00836002612ae5565b81518110611f1057611f10612ad1565b60200101906001600160f81b03191690815f1a905350600101611ed3565b505f5b6020811015611f8b5784518160208110611f4d57611f4d612ad1565b1a60f81b82611f5d836006612ae5565b81518110611f6d57611f6d612ad1565b60200101906001600160f81b03191690815f1a905350600101611f31565b505f5b6020811015611feb5784602001518160208110611fad57611fad612ad1565b1a60f81b82611fbd836026612ae5565b81518110611fcd57611fcd612ad1565b60200101906001600160f81b03191690815f1a905350600101611f8e565b505f5b600881101561205f57612002816007612aa7565b61200d906008612aba565b60ff1685604001516001600160401b0316901c60f81b828260466120319190612ae5565b8151811061204157612041612ad1565b60200101906001600160f81b03191690815f1a905350600101611fee565b505f5b60308110156120ca578460800151818151811061208157612081612ad1565b01602001516001600160f81b0319168261209c83604e612ae5565b815181106120ac576120ac612ad1565b60200101906001600160f81b03191690815f1a905350600101612062565b505f5b600881101561213c576120e1816007612aa7565b6120ec906008612aba565b60608601516001600160401b0390811691161c60f81b8261210e83607e612ae5565b8151811061211e5761211e612ad1565b60200101906001600160f81b03191690815f1a9053506001016120cd565b5060028160405161214d9190612db3565b602060405180830381855afa158015612168573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061218b919061295f565b94909350915050565b6105ef815f6123ed565b5f8181525f80516020612e7f8339815191526020526040812060030180545f80516020612e5f833981519152916001600160401b0390911690836121e183612dce565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b612228611d69565b6105c8612647565b6105c8611d69565b612240611d69565b80355f80516020612e5f83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461228c6080840160608501612df3565b60ff1611156122f95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103f8565b5f61230a6080840160608501612df3565b60ff16116123725760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103f8565b6123826080830160608401612df3565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556123b36060830160408401612af8565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6109aa611d69565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020612e5f8339815191529142919015806124d35750600283015481516124cf916001600160401b031690612ae5565b8210155b156124f9576001600160401b038516606082015281815260408101516020820152612518565b848160600181815161250b9190612e13565b6001600160401b03169052505b6060810151612528906064612e33565b602082015160028501546001600160401b0392909216916125539190600160401b900460ff16612aba565b10156125b75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103f8565b83156125e057846001600160401b0316816040018181516125d89190612ae5565b9052506125ff565b846001600160401b0316816040018181516125fb9190612aa7565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b61264f611d69565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50805461268190612976565b5f825580601f10612690575050565b601f0160209004905f5260205f20908101906105ef91906126f0565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612704575f81556001016126f1565b5090565b5f60208284031215612718575f80fd5b5035919050565b5f6020828403121561272f575f80fd5b813563ffffffff81168114612742575f80fd5b9392505050565b6001600160a01b03811681146105ef575f80fd5b5f8082840360a081121561276f575f80fd5b608081121561277c575f80fd5b50829150608083013561278e81612749565b809150509250929050565b80356001600160401b03811681146127af575f80fd5b919050565b5f80604083850312156127c5575f80fd5b82356001600160401b038111156127da575f80fd5b8301606081860312156127eb575f80fd5b91506127f960208401612799565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061283a57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161286260408401826001600160a01b03169052565b50606083015161287d60608401826001600160401b03169052565b50608083015161289860808401826001600160401b03169052565b5060a08301516128b360a08401826001600160401b03169052565b5060c08301516128ce60c08401826001600160401b03169052565b5060e08301516128e960e08401826001600160401b03169052565b5092915050565b5f60208284031215612900575f80fd5b813561274281612749565b5f5b8381101561292557818101518382015260200161290d565b50505f910152565b602081525f825180602084015261294b81604085016020870161290b565b601f01601f19169190910160400192915050565b5f6020828403121561296f575f80fd5b5051919050565b600181811c9082168061298a57607f821691505b6020821081036129a857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612a0781612976565b806020870152604060018084165f8114612a285760018114612a4457612a71565b60ff19851660408a0152604084151560051b8a01019550612a71565b895f5260205f205f5b85811015612a685781548b8201860152908301908801612a4d565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105e0576105e0612a93565b80820281158282048414176105e0576105e0612a93565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105e0576105e0612a93565b5f60208284031215612b08575f80fd5b6105dd82612799565b5f808335601e19843603018112612b26575f80fd5b8301803591506001600160401b03821115612b3f575f80fd5b602001915036819003821315612b53575f80fd5b9250929050565b601f8211156108be57805f5260205f20601f840160051c81016020851015612b7f5750805b601f840160051c820191505b81811015612b9e575f8155600101612b8b565b5050505050565b81516001600160401b03811115612bbe57612bbe612a7f565b612bd281612bcc8454612976565b84612b5a565b602080601f831160018114612c05575f8415612bee5750858301515b5f19600386901b1c1916600185901b178555612c5c565b5f85815260208120601f198616915b82811015612c3357888601518255948401946001909101908401612c14565b5085821015612c5057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b0381118282101715612c8657612c86612a7f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612cb457612cb4612a7f565b604052919050565b805180151581146127af575f80fd5b5f8060408385031215612cdc575f80fd5b82516001600160401b0380821115612cf2575f80fd5b9084019060608287031215612d05575f80fd5b612d0d612c64565b82518152602080840151612d2081612749565b82820152604084015183811115612d35575f80fd5b80850194505087601f850112612d49575f80fd5b835183811115612d5b57612d5b612a7f565b612d6d601f8201601f19168301612c8c565b93508084528882828701011115612d82575f80fd5b612d918183860184880161290b565b50826040830152819550612da6818801612cbc565b9450505050509250929050565b5f8251612dc481846020870161290b565b9190910192915050565b5f6001600160401b03808316818103612de957612de9612a93565b6001019392505050565b5f60208284031215612e03575f80fd5b813560ff81168114612742575f80fd5b6001600160401b038181168382160190808211156128e9576128e9612a93565b6001600160401b03818116838216028082169190828114612e5657612e56612a93565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -229,6 +229,68 @@ func (_PoAValidatorManager *PoAValidatorManagerTransactorRaw) Transact(opts *bin return _PoAValidatorManager.Contract.contract.Transact(opts, method, params...) } +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerCaller) MAXIMUMCHURNPERCENTAGELIMIT(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "MAXIMUM_CHURN_PERCENTAGE_LIMIT") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _PoAValidatorManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_PoAValidatorManager.CallOpts) +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _PoAValidatorManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_PoAValidatorManager.CallOpts) +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerCaller) MAXIMUMREGISTRATIONEXPIRYLENGTH(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "MAXIMUM_REGISTRATION_EXPIRY_LENGTH") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _PoAValidatorManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_PoAValidatorManager.CallOpts) +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _PoAValidatorManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_PoAValidatorManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index fa75d21ae..47871d856 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -28,9 +28,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.PoSValidatorManager struct PoSValidatorManagerStorage { - /// @notice The minimum weight of stake required to be a validator. + /// @notice The minimum amount of stake required to be a validator. uint256 _minimumStakeAmount; - /// @notice The maximum weight of stake allowed to be a validator. + /// @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. uint64 _minimumStakeDuration; diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 1cb12ac9c..66cf64b92 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -59,6 +59,9 @@ abstract contract ValidatorManager is bytes32 private constant _VALIDATOR_MANAGER_STORAGE_LOCATION = 0xe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00; + uint8 public constant MAXIMUM_CHURN_PERCENTAGE_LIMIT = 20; + uint64 public constant MAXIMUM_REGISTRATION_EXPIRY_LENGTH = 2 days; + // solhint-disable ordering function _getValidatorManagerStorage() private @@ -97,12 +100,11 @@ abstract contract ValidatorManager is $._subnetID = settings.subnetID; require( - settings.maximumChurnPercentage <= 20, + settings.maximumChurnPercentage <= MAXIMUM_CHURN_PERCENTAGE_LIMIT, "ValidatorManager: maximum churn percentage too high" ); require( - settings.maximumChurnPercentage > 0, - "ValidatorManager: maximum churn percentage cannot be zero" + settings.maximumChurnPercentage > 0, "ValidatorManager: zero maximum churn percentage" ); $._maximumChurnPercentage = settings.maximumChurnPercentage; $._churnPeriodSeconds = settings.churnPeriodSeconds; @@ -128,7 +130,7 @@ abstract contract ValidatorManager is "ValidatorManager: registration expiry not in future" ); require( - block.timestamp + 2 days > input.registrationExpiry, + block.timestamp + MAXIMUM_REGISTRATION_EXPIRY_LENGTH > input.registrationExpiry, "ValidatorManager: registration expiry too far in future" ); @@ -400,10 +402,6 @@ abstract contract ValidatorManager is function _checkAndUpdateChurnTracker(uint64 weight, bool addition) private { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - if ($._maximumChurnPercentage == 0) { - return; - } - uint256 currentTime = block.timestamp; ValidatorChurnPeriod memory churnTracker = $._churnTracker; From d1038440936dda3a8960912c74b6fcfea30c8971 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 13 Sep 2024 19:57:52 -0400 Subject: [PATCH 283/545] Review fixes --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 13 +++++++++---- contracts/staking/tests/ValidatorManagerTests.t.sol | 4 ++-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index a536044ab..11cd94930 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516152a43803806152a483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151578061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f36600461465a565b610357565b005b610154610164366004614695565b6107cf565b6101a7610177366004614695565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e2366004614695565b61099f565b6040516001600160401b0390911681526020016101b1565b61015461020d3660046146c0565b6109b5565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c3660046146fe565b610a94565b61015461024f366004614717565b610abf565b6101a7610262366004614753565b610c8f565b6101e7610275366004614695565b610ca8565b61015461028836600461465a565b610cbc565b61015461029b366004614717565b610d9c565b6101a76102ae36600461476e565b610fab565b6101a76102c136600461478e565b610fbe565b6101546102d43660046146fe565b610fea565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d366004614695565b6111a7565b610154610320366004614695565b61142d565b6101c2601481565b61034061033b366004614695565b611541565b6040516101b19190614803565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206150ab8339815191529184156103a9576103a68285611620565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db6147ef565b60048111156103ec576103ec6147ef565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610473576104736147ef565b146104c55760405162461bcd60e51b815260206004820152602a60248201525f805160206150cb8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461052a5760405162461bcd60e51b815260206004820152603360248201525f805160206150cb8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104bc565b5f610534846118bc565b9050610543826060015161193e565b600382526001600160401b0342811660a0840152811660e08301525f88815260068601602052604090208251815484929190829060ff1916600183600481111561058f5761058f6147ef565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61066185611541565b905082606001516001600160401b03168160a001516001600160401b0316116106d85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104bc565b5f83606001518260a001516106ed91906148f1565b90506106f9868261194b565b5f6005600160991b0163ee5b48eb610712898786611993565b6040518263ffffffff1660e01b815260040161072e9190614933565b6020604051808303815f875af115801561074a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061076e9190614965565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061512b83398151915260205260408082208151610100810190925280545f805160206150eb83398151915293929190829060ff16600581111561081d5761081d6147ef565b600581111561082e5761082e6147ef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108b3576108b36147ef565b146109185760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104bc565b6005600160991b016001600160a01b031663ee5b48eb61093d8584608001515f611993565b6040518263ffffffff1660e01b81526004016109599190614933565b6020604051808303815f875af1158015610975573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109999190614965565b50505050565b5f6109af64e8d4a510008361497c565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109fe575080546001600160401b03808416911610155b15610a1c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a478484611bb0565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610a9e82611bca565b9050610abb81606001516001600160401b03168260400151611f3d565b5050565b5f805160206150ab8339815191525f610ad784611f73565b90505f80610ae88360400151612154565b50915091505f610af783611541565b9050816001600160401b031681608001516001600160401b03161015610b2f5760405162461bcd60e51b81526004016104bc9061499b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b745760405162461bcd60e51b81526004016104bc906149dd565b60015f87815260068701602052604090205460ff166004811115610b9a57610b9a6147ef565b14610c035760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104bc565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109af6001600160401b03831664e8d4a51000614a26565b5f610cb282611541565b60a0015192915050565b5f805160206150ab8339815191525f610cd485611541565b5f86815260058401602052604090205460c0820151919250610d0691620100009091046001600160401b031690614a3d565b6001600160401b0316421015610d7a5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104bc565b8315610d8c57610d8a8584611620565b505b610d958561238f565b5050505050565b5f805160206150ab8339815191525f610db484611f73565b90505f80610dc58360400151612154565b50915091505f610dd483611541565b9050816001600160401b031681608001516001600160401b03161015610e0c5760405162461bcd60e51b81526004016104bc9061499b565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e4a5760405162461bcd60e51b81526004016104bc906149dd565b60035f87815260068701602052604090205460ff166004811115610e7057610e706147ef565b14610ec45760405162461bcd60e51b815260206004820152603160248201525f805160206150cb8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104bc565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f6991611f3d565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610fb783338461272d565b9392505050565b5f610fc7612b2b565b610fd2848484612b62565b9050610fb760015f8051602061510b83398151915255565b5f805160206150eb8339815191525f61100283611f73565b90505f806110138360400151612d9b565b91509150806110755760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104bc565b5f8281526007850160205260408120805461108f90614a5d565b90501180156110c1575060015f83815260088601602052604090205460ff1660058111156110bf576110bf6147ef565b145b6110dd5760405162461bcd60e51b81526004016104bc90614a95565b5f82815260078501602052604081206110f5916145a2565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206150ab83398151915293929190829060ff166004811115611208576112086147ef565b6004811115611219576112196147ef565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112a0576112a06147ef565b14806112be57506003815160048111156112bc576112bc6147ef565b145b6113125760405162461bcd60e51b815260206004820152603260248201525f805160206150cb833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104bc565b5f6113208260400151611541565b905080608001516001600160401b03165f036113a45760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104bc565b6005600160991b016001600160a01b031663ee5b48eb6113d1846040015184608001518560a00151611993565b6040518263ffffffff1660e01b81526004016113ed9190614933565b6020604051808303815f875af1158015611409573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d959190614965565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150eb83398151915292919061147590614a5d565b90501180156114a7575060015f83815260088301602052604090205460ff1660058111156114a5576114a56147ef565b145b6114c35760405162461bcd60e51b81526004016104bc90614a95565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114fc9190600401614adc565b6020604051808303815f875af1158015611518573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061153c9190614965565b505050565b6115496145d9565b5f8281525f8051602061512b8339815191526020526040908190208151610100810190925280545f805160206150eb833981519152929190829060ff166005811115611597576115976147ef565b60058111156115a8576115a86147ef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561166b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116929190810190614bdd565b91509150806116f55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104bc565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611738573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061175c9190614965565b8251146117c05760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104bc565b60208201516001600160a01b0316156118365760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104bc565b5f806118458460400151612f3c565b915091508187146118b25760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104bc565b9695505050505050565b5f8181525f8051602061512b8339815191526020526040812060030180545f805160206150eb833981519152916001600160401b0390911690836118ff83614cc5565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611948815f613114565b50565b5f9182525f8051602061512b833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a0c576119cc816001614cea565b6119d7906008614a26565b5081515f908390839081106119ee576119ee614cfd565b60200101906001600160f81b03191690815f1a9053506001016119b8565b505f5b6004811015611a6f57611a23816003614cea565b611a2e906008614a26565b6001901c60f81b82611a41836002614d11565b81518110611a5157611a51614cfd565b60200101906001600160f81b03191690815f1a905350600101611a0f565b505f5b6020811015611ad157611a8681601f614cea565b611a91906008614a26565b86901c60f81b82611aa3836006614d11565b81518110611ab357611ab3614cfd565b60200101906001600160f81b03191690815f1a905350600101611a72565b505f5b6008811015611b3c57611ae8816007614cea565b611af3906008614a26565b6001600160401b038616901c60f81b82611b0e836026614d11565b81518110611b1e57611b1e614cfd565b60200101906001600160f81b03191690815f1a905350600101611ad4565b505f5b6008811015611ba757611b53816007614cea565b611b5e906008614a26565b6001600160401b038516901c60f81b82611b7983602e614d11565b81518110611b8957611b89614cfd565b60200101906001600160f81b03191690815f1a905350600101611b3f565b50949350505050565b611bb861336e565b611bc1826133b9565b610abb81613425565b611bd26145d9565b5f805160206150eb8339815191525f611bea84611f73565b90505f80611bfb8360400151612d9b565b915091508015611c605760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104bc565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611c9257611c926147ef565b6005811115611ca357611ca36147ef565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d2a57611d2a6147ef565b1480611d485750600182516005811115611d4657611d466147ef565b145b611da75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104bc565b600382516005811115611dbc57611dbc6147ef565b03611dc957506004611dcd565b5060055b6020808301515f90815260098801909152604081205581816005811115611df657611df66147ef565b90816005811115611e0957611e096147ef565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611e3d57611e3d6147ef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f0857611f086147ef565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610abb906001600160a01b031682846134d9565b60408051606080820183525f8083526020830181905292820152905f805160206150eb8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fe8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261200f9190810190614bdd565b91509150806120765760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104bc565b82548251146120d95760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104bc565b60208201516001600160a01b03161561214c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104bc565b509392505050565b5f805f83516036146121785760405162461bcd60e51b81526004016104bc90614d24565b5f805b60028110156121c75761218f816001614cea565b61219a906008614a26565b61ffff168682815181106121b0576121b0614cfd565b016020015160f81c901b919091179060010161217b565b5061ffff8116156121ea5760405162461bcd60e51b81526004016104bc90614d6d565b5f805b600481101561224557612201816003614cea565b61220c906008614a26565b63ffffffff168761221e836002614d11565b8151811061222e5761222e614cfd565b016020015160f81c901b91909117906001016121ed565b5063ffffffff811660031461226c5760405162461bcd60e51b81526004016104bc90614db0565b5f805b60208110156122c15761228381601f614cea565b61228e906008614a26565b8861229a836006614d11565b815181106122aa576122aa614cfd565b016020015160f81c901b919091179060010161226f565b505f805b6008811015612320576122d9816007614cea565b6122e4906008614a26565b6001600160401b0316896122f9836026614d11565b8151811061230957612309614cfd565b016020015160f81c901b91909117906001016122c5565b505f805b600881101561237f57612338816007614cea565b612343906008614a26565b6001600160401b03168a61235883602e614d11565b8151811061236857612368614cfd565b016020015160f81c901b9190911790600101612324565b5091989097509095509350505050565b5f8181525f8051602061512b83398151915260205260408082208151610100810190925280545f805160206150eb83398151915293929190829060ff1660058111156123dd576123dd6147ef565b60058111156123ee576123ee6147ef565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612476576124766147ef565b146124d25760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104bc565b60408101516001600160a01b0316336001600160a01b03161461254c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104bc565b6125598160a0015161193e565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561259d5761259d6147ef565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61266984612663816118bc565b5f611993565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612698908590600401614933565b6020604051808303815f875af11580156126b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126d89190614965565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f612736612b2b565b5f805160206150ab8339815191525f6127516101e285613538565b90505f61275d87611541565b9050600281516005811115612774576127746147ef565b146127d35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104bc565b6127dc8261356e565b5f828260a001516127ed9190614a3d565b6004850154606084015191925061280f916001600160401b0390911690614df7565b6001600160401b0316816001600160401b0316111561288e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104bc565b612898888261194b565b5f6128a2896118bc565b90505f89826040516020016128ce92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6129088d8688611993565b6040518263ffffffff1660e01b81526004016129249190614933565b6020604051808303815f875af1158015612940573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129649190614965565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156129ec576129ec6147ef565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610fb760015f8051602061510b83398151915255565b5f8051602061510b833981519152805460011901612b5c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206150ab833981519152906001600160401b0316612bae6040860160208701614753565b6001600160401b03161015612c1d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104bc565b6003810154612c2f6020860186614e31565b61ffff1610158015612c535750612710612c4c6020860186614e31565b61ffff1611155b612c6f5760405162461bcd60e51b81526004016104bc90614e4c565b8054831015612cd25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104bc565b8060010154831115612d395760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104bc565b5f612d4384613538565b90505f612d4f8261099f565b90505f612d5c8883613579565b5f81815260058601602052604090209091508790612d7a8282614e97565b509098975050505050505050565b60015f8051602061510b83398151915255565b5f808251602714612dbe5760405162461bcd60e51b81526004016104bc90614d24565b5f805b6002811015612e0d57612dd5816001614cea565b612de0906008614a26565b61ffff16858281518110612df657612df6614cfd565b016020015160f81c901b9190911790600101612dc1565b5061ffff811615612e305760405162461bcd60e51b81526004016104bc90614d6d565b5f805b6004811015612e8b57612e47816003614cea565b612e52906008614a26565b63ffffffff1686612e64836002614d11565b81518110612e7457612e74614cfd565b016020015160f81c901b9190911790600101612e33565b5063ffffffff8116600214612eb25760405162461bcd60e51b81526004016104bc90614db0565b5f805b6020811015612f0757612ec981601f614cea565b612ed4906008614a26565b87612ee0836006614d11565b81518110612ef057612ef0614cfd565b016020015160f81c901b9190911790600101612eb5565b505f86602681518110612f1c57612f1c614cfd565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612f5f5760405162461bcd60e51b81526004016104bc90614d24565b5f805b6002811015612fae57612f76816001614cea565b612f81906008614a26565b61ffff16858281518110612f9757612f97614cfd565b016020015160f81c901b9190911790600101612f62565b5061ffff811615612fd15760405162461bcd60e51b81526004016104bc90614d6d565b5f805b600481101561302c57612fe8816003614cea565b612ff3906008614a26565b63ffffffff1686613005836002614d11565b8151811061301557613015614cfd565b016020015160f81c901b9190911790600101612fd4565b5063ffffffff81166004146130535760405162461bcd60e51b81526004016104bc90614db0565b5f805b60208110156130a85761306a81601f614cea565b613075906008614a26565b87613081836006614d11565b8151811061309157613091614cfd565b016020015160f81c901b9190911790600101613056565b505f805b6008811015613107576130c0816007614cea565b6130cb906008614a26565b6001600160401b0316886130e0836026614d11565b815181106130f0576130f0614cfd565b016020015160f81c901b91909117906001016130ac565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206150eb8339815191529142919015806131fa5750600283015481516131f6916001600160401b031690614d11565b8210155b15613220576001600160401b03851660608201528181526040810151602082015261323f565b84816060018181516132329190614a3d565b6001600160401b03169052505b606081015161324f906064614df7565b602082015160028501546001600160401b03929092169161327a9190600160401b900460ff16614a26565b10156132de5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104bc565b831561330757846001600160401b0316816040018181516132ff9190614d11565b905250613326565b846001600160401b0316816040018181516133229190614cea565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166133b757604051631afcd79f60e31b815260040160405180910390fd5b565b6133c161336e565b6133ca81613ab3565b611948608082013560a08301356133e760e0850160c08601614753565b6133f8610100860160e08701614e31565b61ffff1661340e61012087016101008801614eed565b61342061014088016101208901614f0d565b613ad4565b61342d61336e565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166134b95760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104bc565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261153c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613d18565b5f6109af827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613d79565b611948816001613114565b5f5f805160206150eb833981519152426135996040860160208701614753565b6001600160401b03161161360b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104bc565b61361b6040850160208601614753565b6001600160401b03166136316202a30042614d11565b116136a45760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104bc565b83356136fc5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104bc565b83355f9081526009820160205260409020541561376c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104bc565b6137796040850185614f28565b90506030146137e05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104bc565b6137e98361356e565b5f806138836040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061382e9190614753565b6001600160401b0316815260200161384960408a018a614f28565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613edb565b5f828152600786016020526040902091935091506138a18282614fb5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138ce908590600401614933565b6020604051808303815f875af11580156138ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390e9190614965565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613990576139906147ef565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a8591908e01908e01614753565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613abb61336e565b613ac3614280565b613acb614290565b61194881614298565b613adc61336e565b5f805160206150ab83398151915283613b485760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104bc565b612710841115613b6a5760405162461bcd60e51b81526004016104bc90614e4c565b85871115613bd25760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104bc565b5f8360ff1611613c3f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104bc565b600a60ff84161115613cb15760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104bc565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613d2c6001600160a01b03841683614445565b905080515f14158015613d50575080806020019051810190613d4e9190615074565b155b1561153c57604051635274afe760e01b81526001600160a01b03841660048201526024016104bc565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613dbf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613de39190614965565b9050613dfa6001600160a01b038516333086614452565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613e3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e629190614965565b9050818111613ec85760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104bc565b613ed28282614cea565b95945050505050565b5f6060826080015151603014613f455760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104bc565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613fbc57613f7c816001614cea565b613f87906008614a26565b5081515f90839083908110613f9e57613f9e614cfd565b60200101906001600160f81b03191690815f1a905350600101613f68565b505f5b600481101561401a57613fd3816003614cea565b613fde906008614a26565b505f82613fec836002614d11565b81518110613ffc57613ffc614cfd565b60200101906001600160f81b03191690815f1a905350600101613fbf565b505f5b6020811015614077578451816020811061403957614039614cfd565b1a60f81b82614049836006614d11565b8151811061405957614059614cfd565b60200101906001600160f81b03191690815f1a90535060010161401d565b505f5b60208110156140d7578460200151816020811061409957614099614cfd565b1a60f81b826140a9836026614d11565b815181106140b9576140b9614cfd565b60200101906001600160f81b03191690815f1a90535060010161407a565b505f5b600881101561414b576140ee816007614cea565b6140f9906008614a26565b60ff1685604001516001600160401b0316901c60f81b8282604661411d9190614d11565b8151811061412d5761412d614cfd565b60200101906001600160f81b03191690815f1a9053506001016140da565b505f5b60308110156141b6578460800151818151811061416d5761416d614cfd565b01602001516001600160f81b0319168261418883604e614d11565b8151811061419857614198614cfd565b60200101906001600160f81b03191690815f1a90535060010161414e565b505f5b6008811015614228576141cd816007614cea565b6141d8906008614a26565b60608601516001600160401b0390811691161c60f81b826141fa83607e614d11565b8151811061420a5761420a614cfd565b60200101906001600160f81b03191690815f1a9053506001016141b9565b50600281604051614239919061508f565b602060405180830381855afa158015614254573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142779190614965565b94909350915050565b61428861336e565b6133b761448b565b6133b761336e565b6142a061336e565b80355f805160206150eb83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146142ec6080840160608501614eed565b60ff1611156143595760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104bc565b5f61436a6080840160608501614eed565b60ff16116143d25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104bc565b6143e26080830160608401614eed565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144136060830160408401614753565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610fb783835f614493565b6040516001600160a01b0384811660248301528381166044830152606482018390526109999186918216906323b872dd90608401613506565b612d8861336e565b6060814710156144b85760405163cd78605960e01b81523060048201526024016104bc565b5f80856001600160a01b031684866040516144d3919061508f565b5f6040518083038185875af1925050503d805f811461450d576040519150601f19603f3d011682016040523d82523d5f602084013e614512565b606091505b50915091506118b28683836060826145325761452d82614579565b610fb7565b815115801561454957506001600160a01b0384163b155b1561457257604051639996b31560e01b81526001600160a01b03851660048201526024016104bc565b5080610fb7565b8051156145895780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546145ae90614a5d565b5f825580601f106145bd575050565b601f0160209004905f5260205f2090810190611948919061461d565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614631575f815560010161461e565b5090565b8015158114611948575f80fd5b803563ffffffff81168114614655575f80fd5b919050565b5f805f6060848603121561466c575f80fd5b83359250602084013561467e81614635565b915061468c60408501614642565b90509250925092565b5f602082840312156146a5575f80fd5b5035919050565b6001600160a01b0381168114611948575f80fd5b5f808284036101608112156146d3575f80fd5b610140808212156146e2575f80fd5b84935083013590506146f3816146ac565b809150509250929050565b5f6020828403121561470e575f80fd5b610fb782614642565b5f8060408385031215614728575f80fd5b61473183614642565b946020939093013593505050565b6001600160401b0381168114611948575f80fd5b5f60208284031215614763575f80fd5b8135610fb78161473f565b5f806040838503121561477f575f80fd5b50508035926020909101359150565b5f805f83850360808112156147a1575f80fd5b84356001600160401b038111156147b6575f80fd5b8501606081880312156147c7575f80fd5b93506040601f19820112156147da575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061482757634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161484f60408401826001600160a01b03169052565b50606083015161486a60608401826001600160401b03169052565b50608083015161488560808401826001600160401b03169052565b5060a08301516148a060a08401826001600160401b03169052565b5060c08301516148bb60c08401826001600160401b03169052565b5060e08301516148d660e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156148d6576148d66148dd565b5f5b8381101561492b578181015183820152602001614913565b50505f910152565b602081525f8251806020840152614951816040850160208701614911565b601f01601f19169190910160400192915050565b5f60208284031215614975575f80fd5b5051919050565b5f8261499657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109af576109af6148dd565b6001600160401b038181168382160190808211156148d6576148d66148dd565b600181811c90821680614a7157607f821691505b602082108103614a8f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614aee81614a5d565b806020870152604060018084165f8114614b0f5760018114614b2b57614b58565b60ff19851660408a0152604084151560051b8a01019550614b58565b895f5260205f205f5b85811015614b4f5781548b8201860152908301908801614b34565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b9c57614b9c614b66565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614bca57614bca614b66565b604052919050565b805161465581614635565b5f8060408385031215614bee575f80fd5b82516001600160401b0380821115614c04575f80fd5b9084019060608287031215614c17575f80fd5b614c1f614b7a565b82518152602080840151614c32816146ac565b82820152604084015183811115614c47575f80fd5b80850194505087601f850112614c5b575f80fd5b835183811115614c6d57614c6d614b66565b614c7f601f8201601f19168301614ba2565b93508084528882828701011115614c94575f80fd5b614ca381838601848801614911565b50826040830152819550614cb8818801614bd2565b9450505050509250929050565b5f6001600160401b03808316818103614ce057614ce06148dd565b6001019392505050565b818103818111156109af576109af6148dd565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109af576109af6148dd565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614e1a57614e1a6148dd565b505092915050565b61ffff81168114611948575f80fd5b5f60208284031215614e41575f80fd5b8135610fb781614e22565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614ea281614e22565b61ffff8116905081548161ffff1982161783556020840135614ec38161473f565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614efd575f80fd5b813560ff81168114610fb7575f80fd5b5f60208284031215614f1d575f80fd5b8135610fb7816146ac565b5f808335601e19843603018112614f3d575f80fd5b8301803591506001600160401b03821115614f56575f80fd5b602001915036819003821315614f6a575f80fd5b9250929050565b601f82111561153c57805f5260205f20601f840160051c81016020851015614f965750805b601f840160051c820191505b81811015610d95575f8155600101614fa2565b81516001600160401b03811115614fce57614fce614b66565b614fe281614fdc8454614a5d565b84614f71565b602080601f831160018114615015575f8415614ffe5750858301515b5f19600386901b1c1916600185901b17855561506c565b5f85815260208120601f198616915b8281101561504357888601518255948401946001909101908401615024565b508582101561506057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615084575f80fd5b8151610fb781614635565b5f82516150a0818460208701614911565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516152bd3803806152bd83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151708061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f366004614673565b610357565b005b6101546101643660046146ae565b6107e8565b6101a76101773660046146ae565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e23660046146ae565b6109b8565b6040516001600160401b0390911681526020016101b1565b61015461020d3660046146d9565b6109ce565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c366004614717565b610aad565b61015461024f366004614730565b610ad8565b6101a761026236600461476c565b610ca8565b6101e76102753660046146ae565b610cc1565b610154610288366004614673565b610cd5565b61015461029b366004614730565b610db5565b6101a76102ae366004614787565b610fc4565b6101a76102c13660046147a7565b610fd7565b6101546102d4366004614717565b611003565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d3660046146ae565b6111c0565b6101546103203660046146ae565b611446565b6101c2601481565b61034061033b3660046146ae565b61155a565b6040516101b1919061481c565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206150c48339815191529184156103a9576103a68285611639565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db614808565b60048111156103ec576103ec614808565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561047357610473614808565b146104c55760405162461bcd60e51b815260206004820152602a60248201525f805160206150e48339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461052a5760405162461bcd60e51b815260206004820152603360248201525f805160206150e48339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104bc565b5f610534846118d5565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561058157610581614808565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106538561155a565b905082606001516001600160401b03168160a001516001600160401b0316116106ca5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104bc565b6002815160058111156106df576106df614808565b036106f1576106f18360600151611957565b5f83606001518260a00151610706919061490a565b90506107128682611964565b5f6005600160991b0163ee5b48eb61072b8987866119ac565b6040518263ffffffff1660e01b8152600401610747919061494c565b6020604051808303815f875af1158015610763573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610787919061497e565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061514483398151915260205260408082208151610100810190925280545f8051602061510483398151915293929190829060ff16600581111561083657610836614808565b600581111561084757610847614808565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108cc576108cc614808565b146109315760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104bc565b6005600160991b016001600160a01b031663ee5b48eb6109568584608001515f6119ac565b6040518263ffffffff1660e01b8152600401610972919061494c565b6020604051808303815f875af115801561098e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b2919061497e565b50505050565b5f6109c864e8d4a5100083614995565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a17575080546001600160401b03808416911610155b15610a355760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a608484611bc9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610ab782611be3565b9050610ad481606001516001600160401b03168260400151611f56565b5050565b5f805160206150c48339815191525f610af084611f8c565b90505f80610b01836040015161216d565b50915091505f610b108361155a565b9050816001600160401b031681608001516001600160401b03161015610b485760405162461bcd60e51b81526004016104bc906149b4565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b8d5760405162461bcd60e51b81526004016104bc906149f6565b60015f87815260068701602052604090205460ff166004811115610bb357610bb3614808565b14610c1c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104bc565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109c86001600160401b03831664e8d4a51000614a3f565b5f610ccb8261155a565b60a0015192915050565b5f805160206150c48339815191525f610ced8561155a565b5f86815260058401602052604090205460c0820151919250610d1f91620100009091046001600160401b031690614a56565b6001600160401b0316421015610d935760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104bc565b8315610da557610da38584611639565b505b610dae856123a8565b5050505050565b5f805160206150c48339815191525f610dcd84611f8c565b90505f80610dde836040015161216d565b50915091505f610ded8361155a565b9050816001600160401b031681608001516001600160401b03161015610e255760405162461bcd60e51b81526004016104bc906149b4565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e635760405162461bcd60e51b81526004016104bc906149f6565b60035f87815260068701602052604090205460ff166004811115610e8957610e89614808565b14610edd5760405162461bcd60e51b815260206004820152603160248201525f805160206150e48339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104bc565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f8291611f56565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610fd0833384612746565b9392505050565b5f610fe0612b44565b610feb848484612b7b565b9050610fd060015f8051602061512483398151915255565b5f805160206151048339815191525f61101b83611f8c565b90505f8061102c8360400151612db4565b915091508061108e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104bc565b5f828152600785016020526040812080546110a890614a76565b90501180156110da575060015f83815260088601602052604090205460ff1660058111156110d8576110d8614808565b145b6110f65760405162461bcd60e51b81526004016104bc90614aae565b5f828152600785016020526040812061110e916145bb565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206150c483398151915293929190829060ff16600481111561122157611221614808565b600481111561123257611232614808565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112b9576112b9614808565b14806112d757506003815160048111156112d5576112d5614808565b145b61132b5760405162461bcd60e51b815260206004820152603260248201525f805160206150e4833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104bc565b5f611339826040015161155a565b905080608001516001600160401b03165f036113bd5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104bc565b6005600160991b016001600160a01b031663ee5b48eb6113ea846040015184608001518560a001516119ac565b6040518263ffffffff1660e01b8152600401611406919061494c565b6020604051808303815f875af1158015611422573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dae919061497e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061510483398151915292919061148e90614a76565b90501180156114c0575060015f83815260088301602052604090205460ff1660058111156114be576114be614808565b145b6114dc5760405162461bcd60e51b81526004016104bc90614aae565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916115159190600401614af5565b6020604051808303815f875af1158015611531573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611555919061497e565b505050565b6115626145f2565b5f8281525f805160206151448339815191526020526040908190208151610100810190925280545f80516020615104833981519152929190829060ff1660058111156115b0576115b0614808565b60058111156115c1576115c1614808565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611684573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116ab9190810190614bf6565b915091508061170e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104bc565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611751573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611775919061497e565b8251146117d95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104bc565b60208201516001600160a01b03161561184f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104bc565b5f8061185e8460400151612f55565b915091508187146118cb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104bc565b9695505050505050565b5f8181525f805160206151448339815191526020526040812060030180545f80516020615104833981519152916001600160401b03909116908361191883614cde565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611961815f61312d565b50565b5f9182525f80516020615144833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a25576119e5816001614d03565b6119f0906008614a3f565b5081515f90839083908110611a0757611a07614d16565b60200101906001600160f81b03191690815f1a9053506001016119d1565b505f5b6004811015611a8857611a3c816003614d03565b611a47906008614a3f565b6001901c60f81b82611a5a836002614d2a565b81518110611a6a57611a6a614d16565b60200101906001600160f81b03191690815f1a905350600101611a28565b505f5b6020811015611aea57611a9f81601f614d03565b611aaa906008614a3f565b86901c60f81b82611abc836006614d2a565b81518110611acc57611acc614d16565b60200101906001600160f81b03191690815f1a905350600101611a8b565b505f5b6008811015611b5557611b01816007614d03565b611b0c906008614a3f565b6001600160401b038616901c60f81b82611b27836026614d2a565b81518110611b3757611b37614d16565b60200101906001600160f81b03191690815f1a905350600101611aed565b505f5b6008811015611bc057611b6c816007614d03565b611b77906008614a3f565b6001600160401b038516901c60f81b82611b9283602e614d2a565b81518110611ba257611ba2614d16565b60200101906001600160f81b03191690815f1a905350600101611b58565b50949350505050565b611bd1613387565b611bda826133d2565b610ad48161343e565b611beb6145f2565b5f805160206151048339815191525f611c0384611f8c565b90505f80611c148360400151612db4565b915091508015611c795760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104bc565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611cab57611cab614808565b6005811115611cbc57611cbc614808565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d4357611d43614808565b1480611d615750600182516005811115611d5f57611d5f614808565b145b611dc05760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104bc565b600382516005811115611dd557611dd5614808565b03611de257506004611de6565b5060055b6020808301515f90815260098801909152604081205581816005811115611e0f57611e0f614808565b90816005811115611e2257611e22614808565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611e5657611e56614808565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f2157611f21614808565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610ad4906001600160a01b031682846134f2565b60408051606080820183525f8083526020830181905292820152905f805160206151048339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612001573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120289190810190614bf6565b915091508061208f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104bc565b82548251146120f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104bc565b60208201516001600160a01b0316156121655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104bc565b509392505050565b5f805f83516036146121915760405162461bcd60e51b81526004016104bc90614d3d565b5f805b60028110156121e0576121a8816001614d03565b6121b3906008614a3f565b61ffff168682815181106121c9576121c9614d16565b016020015160f81c901b9190911790600101612194565b5061ffff8116156122035760405162461bcd60e51b81526004016104bc90614d86565b5f805b600481101561225e5761221a816003614d03565b612225906008614a3f565b63ffffffff1687612237836002614d2a565b8151811061224757612247614d16565b016020015160f81c901b9190911790600101612206565b5063ffffffff81166003146122855760405162461bcd60e51b81526004016104bc90614dc9565b5f805b60208110156122da5761229c81601f614d03565b6122a7906008614a3f565b886122b3836006614d2a565b815181106122c3576122c3614d16565b016020015160f81c901b9190911790600101612288565b505f805b6008811015612339576122f2816007614d03565b6122fd906008614a3f565b6001600160401b031689612312836026614d2a565b8151811061232257612322614d16565b016020015160f81c901b91909117906001016122de565b505f805b600881101561239857612351816007614d03565b61235c906008614a3f565b6001600160401b03168a61237183602e614d2a565b8151811061238157612381614d16565b016020015160f81c901b919091179060010161233d565b5091989097509095509350505050565b5f8181525f8051602061514483398151915260205260408082208151610100810190925280545f8051602061510483398151915293929190829060ff1660058111156123f6576123f6614808565b600581111561240757612407614808565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561248f5761248f614808565b146124eb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104bc565b60408101516001600160a01b0316336001600160a01b0316146125655760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104bc565b6125728160a00151611957565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156125b6576125b6614808565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126828461267c816118d5565b5f6119ac565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126b190859060040161494c565b6020604051808303815f875af11580156126cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126f1919061497e565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61274f612b44565b5f805160206150c48339815191525f61276a6101e285613551565b90505f6127768761155a565b905060028151600581111561278d5761278d614808565b146127ec5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104bc565b6127f582613587565b5f828260a001516128069190614a56565b60048501546060840151919250612828916001600160401b0390911690614e10565b6001600160401b0316816001600160401b031611156128a75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104bc565b6128b18882611964565b5f6128bb896118d5565b90505f89826040516020016128e792919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6129218d86886119ac565b6040518263ffffffff1660e01b815260040161293d919061494c565b6020604051808303815f875af1158015612959573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297d919061497e565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612a0557612a05614808565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610fd060015f8051602061512483398151915255565b5f80516020615124833981519152805460011901612b7557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206150c4833981519152906001600160401b0316612bc7604086016020870161476c565b6001600160401b03161015612c365760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104bc565b6003810154612c486020860186614e4a565b61ffff1610158015612c6c5750612710612c656020860186614e4a565b61ffff1611155b612c885760405162461bcd60e51b81526004016104bc90614e65565b8054831015612ceb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104bc565b8060010154831115612d525760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104bc565b5f612d5c84613551565b90505f612d68826109b8565b90505f612d758883613592565b5f81815260058601602052604090209091508790612d938282614eb0565b509098975050505050505050565b60015f8051602061512483398151915255565b5f808251602714612dd75760405162461bcd60e51b81526004016104bc90614d3d565b5f805b6002811015612e2657612dee816001614d03565b612df9906008614a3f565b61ffff16858281518110612e0f57612e0f614d16565b016020015160f81c901b9190911790600101612dda565b5061ffff811615612e495760405162461bcd60e51b81526004016104bc90614d86565b5f805b6004811015612ea457612e60816003614d03565b612e6b906008614a3f565b63ffffffff1686612e7d836002614d2a565b81518110612e8d57612e8d614d16565b016020015160f81c901b9190911790600101612e4c565b5063ffffffff8116600214612ecb5760405162461bcd60e51b81526004016104bc90614dc9565b5f805b6020811015612f2057612ee281601f614d03565b612eed906008614a3f565b87612ef9836006614d2a565b81518110612f0957612f09614d16565b016020015160f81c901b9190911790600101612ece565b505f86602681518110612f3557612f35614d16565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612f785760405162461bcd60e51b81526004016104bc90614d3d565b5f805b6002811015612fc757612f8f816001614d03565b612f9a906008614a3f565b61ffff16858281518110612fb057612fb0614d16565b016020015160f81c901b9190911790600101612f7b565b5061ffff811615612fea5760405162461bcd60e51b81526004016104bc90614d86565b5f805b600481101561304557613001816003614d03565b61300c906008614a3f565b63ffffffff168661301e836002614d2a565b8151811061302e5761302e614d16565b016020015160f81c901b9190911790600101612fed565b5063ffffffff811660041461306c5760405162461bcd60e51b81526004016104bc90614dc9565b5f805b60208110156130c15761308381601f614d03565b61308e906008614a3f565b8761309a836006614d2a565b815181106130aa576130aa614d16565b016020015160f81c901b919091179060010161306f565b505f805b6008811015613120576130d9816007614d03565b6130e4906008614a3f565b6001600160401b0316886130f9836026614d2a565b8151811061310957613109614d16565b016020015160f81c901b91909117906001016130c5565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061510483398151915291429190158061321357506002830154815161320f916001600160401b031690614d2a565b8210155b15613239576001600160401b038516606082015281815260408101516020820152613258565b848160600181815161324b9190614a56565b6001600160401b03169052505b6060810151613268906064614e10565b602082015160028501546001600160401b0392909216916132939190600160401b900460ff16614a3f565b10156132f75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104bc565b831561332057846001600160401b0316816040018181516133189190614d2a565b90525061333f565b846001600160401b03168160400181815161333b9190614d03565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166133d057604051631afcd79f60e31b815260040160405180910390fd5b565b6133da613387565b6133e381613acc565b611961608082013560a083013561340060e0850160c0860161476c565b613411610100860160e08701614e4a565b61ffff1661342761012087016101008801614f06565b61343961014088016101208901614f26565b613aed565b613446613387565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166134d25760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104bc565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261155591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613d31565b5f6109c8827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613d92565b61196181600161312d565b5f5f80516020615104833981519152426135b2604086016020870161476c565b6001600160401b0316116136245760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104bc565b613634604085016020860161476c565b6001600160401b031661364a6202a30042614d2a565b116136bd5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104bc565b83356137155760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104bc565b83355f908152600982016020526040902054156137855760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104bc565b6137926040850185614f41565b90506030146137f95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104bc565b61380283613587565b5f8061389c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613847919061476c565b6001600160401b0316815260200161386260408a018a614f41565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613ef4565b5f828152600786016020526040902091935091506138ba8282614fce565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138e790859060040161494c565b6020604051808303815f875af1158015613903573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613927919061497e565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff191660018360058111156139a9576139a9614808565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a9e91908e01908e0161476c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613ad4613387565b613adc614299565b613ae46142a9565b611961816142b1565b613af5613387565b5f805160206150c483398151915283613b615760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104bc565b612710841115613b835760405162461bcd60e51b81526004016104bc90614e65565b85871115613beb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104bc565b5f8360ff1611613c585760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104bc565b600a60ff84161115613cca5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104bc565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613d456001600160a01b0384168361445e565b905080515f14158015613d69575080806020019051810190613d67919061508d565b155b1561155557604051635274afe760e01b81526001600160a01b03841660048201526024016104bc565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613dd8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dfc919061497e565b9050613e136001600160a01b03851633308661446b565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613e57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e7b919061497e565b9050818111613ee15760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104bc565b613eeb8282614d03565b95945050505050565b5f6060826080015151603014613f5e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104bc565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613fd557613f95816001614d03565b613fa0906008614a3f565b5081515f90839083908110613fb757613fb7614d16565b60200101906001600160f81b03191690815f1a905350600101613f81565b505f5b600481101561403357613fec816003614d03565b613ff7906008614a3f565b505f82614005836002614d2a565b8151811061401557614015614d16565b60200101906001600160f81b03191690815f1a905350600101613fd8565b505f5b6020811015614090578451816020811061405257614052614d16565b1a60f81b82614062836006614d2a565b8151811061407257614072614d16565b60200101906001600160f81b03191690815f1a905350600101614036565b505f5b60208110156140f057846020015181602081106140b2576140b2614d16565b1a60f81b826140c2836026614d2a565b815181106140d2576140d2614d16565b60200101906001600160f81b03191690815f1a905350600101614093565b505f5b600881101561416457614107816007614d03565b614112906008614a3f565b60ff1685604001516001600160401b0316901c60f81b828260466141369190614d2a565b8151811061414657614146614d16565b60200101906001600160f81b03191690815f1a9053506001016140f3565b505f5b60308110156141cf578460800151818151811061418657614186614d16565b01602001516001600160f81b031916826141a183604e614d2a565b815181106141b1576141b1614d16565b60200101906001600160f81b03191690815f1a905350600101614167565b505f5b6008811015614241576141e6816007614d03565b6141f1906008614a3f565b60608601516001600160401b0390811691161c60f81b8261421383607e614d2a565b8151811061422357614223614d16565b60200101906001600160f81b03191690815f1a9053506001016141d2565b5060028160405161425291906150a8565b602060405180830381855afa15801561426d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614290919061497e565b94909350915050565b6142a1613387565b6133d06144a4565b6133d0613387565b6142b9613387565b80355f8051602061510483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143056080840160608501614f06565b60ff1611156143725760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104bc565b5f6143836080840160608501614f06565b60ff16116143eb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104bc565b6143fb6080830160608401614f06565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561442c606083016040840161476c565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610fd083835f6144ac565b6040516001600160a01b0384811660248301528381166044830152606482018390526109b29186918216906323b872dd9060840161351f565b612da1613387565b6060814710156144d15760405163cd78605960e01b81523060048201526024016104bc565b5f80856001600160a01b031684866040516144ec91906150a8565b5f6040518083038185875af1925050503d805f8114614526576040519150601f19603f3d011682016040523d82523d5f602084013e61452b565b606091505b50915091506118cb86838360608261454b5761454682614592565b610fd0565b815115801561456257506001600160a01b0384163b155b1561458b57604051639996b31560e01b81526001600160a01b03851660048201526024016104bc565b5080610fd0565b8051156145a25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546145c790614a76565b5f825580601f106145d6575050565b601f0160209004905f5260205f20908101906119619190614636565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561464a575f8155600101614637565b5090565b8015158114611961575f80fd5b803563ffffffff8116811461466e575f80fd5b919050565b5f805f60608486031215614685575f80fd5b8335925060208401356146978161464e565b91506146a56040850161465b565b90509250925092565b5f602082840312156146be575f80fd5b5035919050565b6001600160a01b0381168114611961575f80fd5b5f808284036101608112156146ec575f80fd5b610140808212156146fb575f80fd5b849350830135905061470c816146c5565b809150509250929050565b5f60208284031215614727575f80fd5b610fd08261465b565b5f8060408385031215614741575f80fd5b61474a8361465b565b946020939093013593505050565b6001600160401b0381168114611961575f80fd5b5f6020828403121561477c575f80fd5b8135610fd081614758565b5f8060408385031215614798575f80fd5b50508035926020909101359150565b5f805f83850360808112156147ba575f80fd5b84356001600160401b038111156147cf575f80fd5b8501606081880312156147e0575f80fd5b93506040601f19820112156147f3575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061484057634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161486860408401826001600160a01b03169052565b50606083015161488360608401826001600160401b03169052565b50608083015161489e60808401826001600160401b03169052565b5060a08301516148b960a08401826001600160401b03169052565b5060c08301516148d460c08401826001600160401b03169052565b5060e08301516148ef60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156148ef576148ef6148f6565b5f5b8381101561494457818101518382015260200161492c565b50505f910152565b602081525f825180602084015261496a81604085016020870161492a565b601f01601f19169190910160400192915050565b5f6020828403121561498e575f80fd5b5051919050565b5f826149af57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109c8576109c86148f6565b6001600160401b038181168382160190808211156148ef576148ef6148f6565b600181811c90821680614a8a57607f821691505b602082108103614aa857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614b0781614a76565b806020870152604060018084165f8114614b285760018114614b4457614b71565b60ff19851660408a0152604084151560051b8a01019550614b71565b895f5260205f205f5b85811015614b685781548b8201860152908301908801614b4d565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614bb557614bb5614b7f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614be357614be3614b7f565b604052919050565b805161466e8161464e565b5f8060408385031215614c07575f80fd5b82516001600160401b0380821115614c1d575f80fd5b9084019060608287031215614c30575f80fd5b614c38614b93565b82518152602080840151614c4b816146c5565b82820152604084015183811115614c60575f80fd5b80850194505087601f850112614c74575f80fd5b835183811115614c8657614c86614b7f565b614c98601f8201601f19168301614bbb565b93508084528882828701011115614cad575f80fd5b614cbc8183860184880161492a565b50826040830152819550614cd1818801614beb565b9450505050509250929050565b5f6001600160401b03808316818103614cf957614cf96148f6565b6001019392505050565b818103818111156109c8576109c86148f6565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109c8576109c86148f6565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614e3357614e336148f6565b505092915050565b61ffff81168114611961575f80fd5b5f60208284031215614e5a575f80fd5b8135610fd081614e3b565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614ebb81614e3b565b61ffff8116905081548161ffff1982161783556020840135614edc81614758565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614f16575f80fd5b813560ff81168114610fd0575f80fd5b5f60208284031215614f36575f80fd5b8135610fd0816146c5565b5f808335601e19843603018112614f56575f80fd5b8301803591506001600160401b03821115614f6f575f80fd5b602001915036819003821315614f83575f80fd5b9250929050565b601f82111561155557805f5260205f20601f840160051c81016020851015614faf5750805b601f840160051c820191505b81811015610dae575f8155600101614fbb565b81516001600160401b03811115614fe757614fe7614b7f565b614ffb81614ff58454614a76565b84614f8a565b602080601f83116001811461502e575f84156150175750858301515b5f19600386901b1c1916600185901b178555615085565b5f85815260208120601f198616915b8281101561505c5788860151825594840194600190910190840161503d565b508582101561507957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561509d575f80fd5b8151610fd08161464e565b5f82516150b981846020870161492a565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 2429f6c94..dba7a22cc 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614f09380380614f0983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614dbc8061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f36600461432f565b61043b565b005b348015610161575f80fd5b5061015461017036600461436a565b6108b3565b348015610180575f80fd5b506101bf61018f36600461436a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b50610154610212366004614381565b610a83565b348015610222575f80fd5b5061023661023136600461436a565b610b60565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b50610154610290366004614398565b610b76565b3480156102a0575f80fd5b506101546102af3660046143b1565b610ba1565b3480156102bf575f80fd5b506101bf6102ce3660046143ed565b610d71565b3480156102de575f80fd5b506102366102ed36600461436a565b610d8a565b3480156102fd575f80fd5b5061015461030c36600461432f565b610d9e565b6101bf61031f366004614408565b610e7e565b34801561032f575f80fd5b5061015461033e3660046143b1565b610eaa565b34801561034e575f80fd5b5061015461035d366004614398565b6110b9565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae36600461436a565b611276565b3480156103be575f80fd5b506101546103cd36600461436a565b6114fc565b6101bf6103e036600461436a565b611610565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b5061041861041336600461436a565b61161c565b6040516101c99190614475565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614d1083398151915291841561048d5761048a82856116fb565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf614461565b60048111156104d0576104d0614461565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561055757610557614461565b146105a95760405162461bcd60e51b815260206004820152602a60248201525f80516020614d308339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461060e5760405162461bcd60e51b815260206004820152603360248201525f80516020614d308339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105a0565b5f61061884611997565b90506106278260600151611a19565b600382526001600160401b0342811660a0840152811660e08301525f88815260068601602052604090208251815484929190829060ff1916600183600481111561067357610673614461565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107458561161c565b905082606001516001600160401b03168160a001516001600160401b0316116107bc5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105a0565b5f83606001518260a001516107d19190614563565b90506107dd8682611a26565b5f6005600160991b0163ee5b48eb6107f6898786611a6e565b6040518263ffffffff1660e01b815260040161081291906145a5565b6020604051808303815f875af115801561082e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085291906145d7565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614d9083398151915260205260408082208151610100810190925280545f80516020614d5083398151915293929190829060ff16600581111561090157610901614461565b600581111561091257610912614461565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561099757610997614461565b146109fc5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105a0565b6005600160991b016001600160a01b031663ee5b48eb610a218584608001515f611a6e565b6040518263ffffffff1660e01b8152600401610a3d91906145a5565b6020604051808303815f875af1158015610a59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7d91906145d7565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610acc575080546001600160401b03808416911610155b15610aea5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b1483611c8d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b7064e8d4a51000836145ee565b92915050565b5f610b8082611c9e565b9050610b9d81606001516001600160401b03168260400151612011565b5050565b5f80516020614d108339815191525f610bb984612024565b90505f80610bca8360400151612205565b50915091505f610bd98361161c565b9050816001600160401b031681608001516001600160401b03161015610c115760405162461bcd60e51b81526004016105a09061460d565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c565760405162461bcd60e51b81526004016105a09061464f565b60015f87815260068701602052604090205460ff166004811115610c7c57610c7c614461565b14610ce55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105a0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610b706001600160401b03831664e8d4a51000614698565b5f610d948261161c565b60a0015192915050565b5f80516020614d108339815191525f610db68561161c565b5f86815260058401602052604090205460c0820151919250610de891620100009091046001600160401b0316906146af565b6001600160401b0316421015610e5c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105a0565b8315610e6e57610e6c85846116fb565b505b610e7785612440565b5050505050565b5f610e876127de565b610e92838334612815565b9050610b7060015f80516020614d7083398151915255565b5f80516020614d108339815191525f610ec284612024565b90505f80610ed38360400151612205565b50915091505f610ee28361161c565b9050816001600160401b031681608001516001600160401b03161015610f1a5760405162461bcd60e51b81526004016105a09061460d565b5f8681526006860160205260409020600301546001600160401b0380841691161115610f585760405162461bcd60e51b81526004016105a09061464f565b60035f87815260068701602052604090205460ff166004811115610f7e57610f7e614461565b14610fd25760405162461bcd60e51b815260206004820152603160248201525f80516020614d308339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105a0565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261107791612011565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614d508339815191525f6110d183612024565b90505f806110e28360400151612a43565b91509150806111445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105a0565b5f8281526007850160205260408120805461115e906146cf565b9050118015611190575060015f83815260088601602052604090205460ff16600581111561118e5761118e614461565b145b6111ac5760405162461bcd60e51b81526004016105a090614701565b5f82815260078501602052604081206111c491614277565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614d1083398151915293929190829060ff1660048111156112d7576112d7614461565b60048111156112e8576112e8614461565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561136f5761136f614461565b148061138d575060038151600481111561138b5761138b614461565b145b6113e15760405162461bcd60e51b815260206004820152603260248201525f80516020614d30833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105a0565b5f6113ef826040015161161c565b905080608001516001600160401b03165f036114735760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105a0565b6005600160991b016001600160a01b031663ee5b48eb6114a0846040015184608001518560a00151611a6e565b6040518263ffffffff1660e01b81526004016114bc91906145a5565b6020604051808303815f875af11580156114d8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e7791906145d7565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614d50833981519152929190611544906146cf565b9050118015611576575060015f83815260088301602052604090205460ff16600581111561157457611574614461565b145b6115925760405162461bcd60e51b81526004016105a090614701565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916115cb9190600401614748565b6020604051808303815f875af11580156115e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061160b91906145d7565b505050565b5f610b70823334612be4565b6116246142ae565b5f8281525f80516020614d908339815191526020526040908190208151610100810190925280545f80516020614d50833981519152929190829060ff16600581111561167257611672614461565b600581111561168357611683614461565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611746573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261176d919081019061485d565b91509150806117d05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105a0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611813573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183791906145d7565b82511461189b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105a0565b60208201516001600160a01b0316156119115760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105a0565b5f806119208460400151612fdf565b9150915081871461198d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105a0565b9695505050505050565b5f8181525f80516020614d908339815191526020526040812060030180545f80516020614d50833981519152916001600160401b0390911690836119da83614945565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611a23815f6131b7565b50565b5f9182525f80516020614d90833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ae757611aa781600161496a565b611ab2906008614698565b5081515f90839083908110611ac957611ac961497d565b60200101906001600160f81b03191690815f1a905350600101611a93565b505f5b6004811015611b4a57611afe81600361496a565b611b09906008614698565b6001901c60f81b82611b1c836002614991565b81518110611b2c57611b2c61497d565b60200101906001600160f81b03191690815f1a905350600101611aea565b505f5b6020811015611bac57611b6181601f61496a565b611b6c906008614698565b86901c60f81b82611b7e836006614991565b81518110611b8e57611b8e61497d565b60200101906001600160f81b03191690815f1a905350600101611b4d565b505f5b6008811015611c1757611bc381600761496a565b611bce906008614698565b6001600160401b038616901c60f81b82611be9836026614991565b81518110611bf957611bf961497d565b60200101906001600160f81b03191690815f1a905350600101611baf565b505f5b6008811015611c8257611c2e81600761496a565b611c39906008614698565b6001600160401b038516901c60f81b82611c5483602e614991565b81518110611c6457611c6461497d565b60200101906001600160f81b03191690815f1a905350600101611c1a565b5090505b9392505050565b611c95613411565b611a238161345c565b611ca66142ae565b5f80516020614d508339815191525f611cbe84612024565b90505f80611ccf8360400151612a43565b915091508015611d345760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105a0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d6657611d66614461565b6005811115611d7757611d77614461565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611dfe57611dfe614461565b1480611e1c5750600182516005811115611e1a57611e1a614461565b145b611e7b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105a0565b600382516005811115611e9057611e90614461565b03611e9d57506004611ea1565b5060055b6020808301515f90815260098801909152604081205581816005811115611eca57611eca614461565b90816005811115611edd57611edd614461565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611f1157611f11614461565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611fdc57611fdc614461565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610b9d6001600160a01b038216836134c8565b60408051606080820183525f8083526020830181905292820152905f80516020614d508339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612099573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120c0919081019061485d565b91509150806121275760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105a0565b825482511461218a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105a0565b60208201516001600160a01b0316156121fd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105a0565b509392505050565b5f805f83516036146122295760405162461bcd60e51b81526004016105a0906149a4565b5f805b60028110156122785761224081600161496a565b61224b906008614698565b61ffff168682815181106122615761226161497d565b016020015160f81c901b919091179060010161222c565b5061ffff81161561229b5760405162461bcd60e51b81526004016105a0906149ed565b5f805b60048110156122f6576122b281600361496a565b6122bd906008614698565b63ffffffff16876122cf836002614991565b815181106122df576122df61497d565b016020015160f81c901b919091179060010161229e565b5063ffffffff811660031461231d5760405162461bcd60e51b81526004016105a090614a30565b5f805b60208110156123725761233481601f61496a565b61233f906008614698565b8861234b836006614991565b8151811061235b5761235b61497d565b016020015160f81c901b9190911790600101612320565b505f805b60088110156123d15761238a81600761496a565b612395906008614698565b6001600160401b0316896123aa836026614991565b815181106123ba576123ba61497d565b016020015160f81c901b9190911790600101612376565b505f805b6008811015612430576123e981600761496a565b6123f4906008614698565b6001600160401b03168a61240983602e614991565b815181106124195761241961497d565b016020015160f81c901b91909117906001016123d5565b5091989097509095509350505050565b5f8181525f80516020614d9083398151915260205260408082208151610100810190925280545f80516020614d5083398151915293929190829060ff16600581111561248e5761248e614461565b600581111561249f5761249f614461565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561252757612527614461565b146125835760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105a0565b60408101516001600160a01b0316336001600160a01b0316146125fd5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105a0565b61260a8160a00151611a19565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561264e5761264e614461565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61271a8461271481611997565b5f611a6e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906127499085906004016145a5565b6020604051808303815f875af1158015612765573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061278991906145d7565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020614d7083398151915280546001190161280f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614d10833981519152906001600160401b031661286160408601602087016143ed565b6001600160401b031610156128d05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105a0565b60038101546128e26020860186614a86565b61ffff161015801561290657506127106128ff6020860186614a86565b61ffff1611155b6129225760405162461bcd60e51b81526004016105a090614aa1565b80548310156129855760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105a0565b80600101548311156129ec5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105a0565b825f6129f782610b60565b90505f612a04888361355b565b5f81815260058601602052604090209091508790612a228282614aec565b509098975050505050505050565b60015f80516020614d7083398151915255565b5f808251602714612a665760405162461bcd60e51b81526004016105a0906149a4565b5f805b6002811015612ab557612a7d81600161496a565b612a88906008614698565b61ffff16858281518110612a9e57612a9e61497d565b016020015160f81c901b9190911790600101612a69565b5061ffff811615612ad85760405162461bcd60e51b81526004016105a0906149ed565b5f805b6004811015612b3357612aef81600361496a565b612afa906008614698565b63ffffffff1686612b0c836002614991565b81518110612b1c57612b1c61497d565b016020015160f81c901b9190911790600101612adb565b5063ffffffff8116600214612b5a5760405162461bcd60e51b81526004016105a090614a30565b5f805b6020811015612baf57612b7181601f61496a565b612b7c906008614698565b87612b88836006614991565b81518110612b9857612b9861497d565b016020015160f81c901b9190911790600101612b5d565b505f86602681518110612bc457612bc461497d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612bed6127de565b5f80516020614d108339815191525f612c0584610b60565b90505f612c118761161c565b9050600281516005811115612c2857612c28614461565b14612c875760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105a0565b612c9082613a95565b5f828260a00151612ca191906146af565b60048501546060840151919250612cc3916001600160401b0390911690614b42565b6001600160401b0316816001600160401b03161115612d425760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105a0565b612d4c8882611a26565b5f612d5689611997565b90505f8982604051602001612d8292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612dbc8d8688611a6e565b6040518263ffffffff1660e01b8152600401612dd891906145a5565b6020604051808303815f875af1158015612df4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e1891906145d7565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612ea057612ea0614461565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611c8660015f80516020614d7083398151915255565b5f808251602e146130025760405162461bcd60e51b81526004016105a0906149a4565b5f805b60028110156130515761301981600161496a565b613024906008614698565b61ffff1685828151811061303a5761303a61497d565b016020015160f81c901b9190911790600101613005565b5061ffff8116156130745760405162461bcd60e51b81526004016105a0906149ed565b5f805b60048110156130cf5761308b81600361496a565b613096906008614698565b63ffffffff16866130a8836002614991565b815181106130b8576130b861497d565b016020015160f81c901b9190911790600101613077565b5063ffffffff81166004146130f65760405162461bcd60e51b81526004016105a090614a30565b5f805b602081101561314b5761310d81601f61496a565b613118906008614698565b87613124836006614991565b815181106131345761313461497d565b016020015160f81c901b91909117906001016130f9565b505f805b60088110156131aa5761316381600761496a565b61316e906008614698565b6001600160401b031688613183836026614991565b815181106131935761319361497d565b016020015160f81c901b919091179060010161314f565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614d5083398151915291429190158061329d575060028301548151613299916001600160401b031690614991565b8210155b156132c3576001600160401b0385166060820152818152604081015160208201526132e2565b84816060018181516132d591906146af565b6001600160401b03169052505b60608101516132f2906064614b42565b602082015160028501546001600160401b03929092169161331d9190600160401b900460ff16614698565b10156133815760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105a0565b83156133aa57846001600160401b0316816040018181516133a29190614991565b9052506133c9565b846001600160401b0316816040018181516133c5919061496a565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661345a57604051631afcd79f60e31b815260040160405180910390fd5b565b613464613411565b61346d81613aa0565b611a23608082013560a083013561348a60e0850160c086016143ed565b61349b610100860160e08701614a86565b61ffff166134b161012087016101008801614b6d565b6134c361014088016101208901614b8d565b613ac1565b804710156134eb5760405163cd78605960e01b81523060048201526024016105a0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613534576040519150601f19603f3d011682016040523d82523d5f602084013e613539565b606091505b505090508061160b57604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614d508339815191524261357b60408601602087016143ed565b6001600160401b0316116135ed5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105a0565b6135fd60408501602086016143ed565b6001600160401b03166136136202a30042614991565b116136865760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105a0565b83356136de5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105a0565b83355f9081526009820160205260409020541561374e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105a0565b61375b6040850185614ba8565b90506030146137c25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105a0565b6137cb83613a95565b5f806138656040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061381091906143ed565b6001600160401b0316815260200161382b60408a018a614ba8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613d05565b5f828152600786016020526040902091935091506138838282614c35565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138b09085906004016145a5565b6020604051808303815f875af11580156138cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138f091906145d7565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561397257613972614461565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a6791908e01908e016143ed565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611a238160016131b7565b613aa8613411565b613ab06140aa565b613ab86140ba565b611a23816140c2565b613ac9613411565b5f80516020614d1083398151915283613b355760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105a0565b612710841115613b575760405162461bcd60e51b81526004016105a090614aa1565b85871115613bbf5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105a0565b5f8360ff1611613c2c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105a0565b600a60ff84161115613c9e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105a0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613d6f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105a0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613de657613da681600161496a565b613db1906008614698565b5081515f90839083908110613dc857613dc861497d565b60200101906001600160f81b03191690815f1a905350600101613d92565b505f5b6004811015613e4457613dfd81600361496a565b613e08906008614698565b505f82613e16836002614991565b81518110613e2657613e2661497d565b60200101906001600160f81b03191690815f1a905350600101613de9565b505f5b6020811015613ea15784518160208110613e6357613e6361497d565b1a60f81b82613e73836006614991565b81518110613e8357613e8361497d565b60200101906001600160f81b03191690815f1a905350600101613e47565b505f5b6020811015613f015784602001518160208110613ec357613ec361497d565b1a60f81b82613ed3836026614991565b81518110613ee357613ee361497d565b60200101906001600160f81b03191690815f1a905350600101613ea4565b505f5b6008811015613f7557613f1881600761496a565b613f23906008614698565b60ff1685604001516001600160401b0316901c60f81b82826046613f479190614991565b81518110613f5757613f5761497d565b60200101906001600160f81b03191690815f1a905350600101613f04565b505f5b6030811015613fe05784608001518181518110613f9757613f9761497d565b01602001516001600160f81b03191682613fb283604e614991565b81518110613fc257613fc261497d565b60200101906001600160f81b03191690815f1a905350600101613f78565b505f5b600881101561405257613ff781600761496a565b614002906008614698565b60608601516001600160401b0390811691161c60f81b8261402483607e614991565b815181106140345761403461497d565b60200101906001600160f81b03191690815f1a905350600101613fe3565b506002816040516140639190614cf4565b602060405180830381855afa15801561407e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906140a191906145d7565b94909350915050565b6140b2613411565b61345a61426f565b61345a613411565b6140ca613411565b80355f80516020614d5083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146141166080840160608501614b6d565b60ff1611156141835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105a0565b5f6141946080840160608501614b6d565b60ff16116141fc5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105a0565b61420c6080830160608401614b6d565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561423d60608301604084016143ed565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612a30613411565b508054614283906146cf565b5f825580601f10614292575050565b601f0160209004905f5260205f2090810190611a2391906142f2565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614306575f81556001016142f3565b5090565b8015158114611a23575f80fd5b803563ffffffff8116811461432a575f80fd5b919050565b5f805f60608486031215614341575f80fd5b8335925060208401356143538161430a565b915061436160408501614317565b90509250925092565b5f6020828403121561437a575f80fd5b5035919050565b5f6101408284031215614392575f80fd5b50919050565b5f602082840312156143a8575f80fd5b611c8682614317565b5f80604083850312156143c2575f80fd5b6143cb83614317565b946020939093013593505050565b6001600160401b0381168114611a23575f80fd5b5f602082840312156143fd575f80fd5b8135611c86816143d9565b5f80828403606081121561441a575f80fd5b83356001600160401b0381111561442f575f80fd5b840160608187031215614440575f80fd5b92506040601f1982011215614453575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061449957634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516144c160408401826001600160a01b03169052565b5060608301516144dc60608401826001600160401b03169052565b5060808301516144f760808401826001600160401b03169052565b5060a083015161451260a08401826001600160401b03169052565b5060c083015161452d60c08401826001600160401b03169052565b5060e083015161454860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156145485761454861454f565b5f5b8381101561459d578181015183820152602001614585565b50505f910152565b602081525f82518060208401526145c3816040850160208701614583565b601f01601f19169190910160400192915050565b5f602082840312156145e7575f80fd5b5051919050565b5f8261460857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610b7057610b7061454f565b6001600160401b038181168382160190808211156145485761454861454f565b600181811c908216806146e357607f821691505b60208210810361439257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461475a816146cf565b806020870152604060018084165f811461477b5760018114614797576147c4565b60ff19851660408a0152604084151560051b8a010195506147c4565b895f5260205f205f5b858110156147bb5781548b82018601529083019088016147a0565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614808576148086147d2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614836576148366147d2565b604052919050565b6001600160a01b0381168114611a23575f80fd5b805161432a8161430a565b5f806040838503121561486e575f80fd5b82516001600160401b0380821115614884575f80fd5b9084019060608287031215614897575f80fd5b61489f6147e6565b825181526020808401516148b28161483e565b828201526040840151838111156148c7575f80fd5b80850194505087601f8501126148db575f80fd5b8351838111156148ed576148ed6147d2565b6148ff601f8201601f1916830161480e565b93508084528882828701011115614914575f80fd5b61492381838601848801614583565b50826040830152819550614938818801614852565b9450505050509250929050565b5f6001600160401b038083168181036149605761496061454f565b6001019392505050565b81810381811115610b7057610b7061454f565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610b7057610b7061454f565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611a23575f80fd5b5f60208284031215614a96575f80fd5b8135611c8681614a77565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614af781614a77565b61ffff8116905081548161ffff1982161783556020840135614b18816143d9565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614b6557614b6561454f565b505092915050565b5f60208284031215614b7d575f80fd5b813560ff81168114611c86575f80fd5b5f60208284031215614b9d575f80fd5b8135611c868161483e565b5f808335601e19843603018112614bbd575f80fd5b8301803591506001600160401b03821115614bd6575f80fd5b602001915036819003821315614bea575f80fd5b9250929050565b601f82111561160b57805f5260205f20601f840160051c81016020851015614c165750805b601f840160051c820191505b81811015610e77575f8155600101614c22565b81516001600160401b03811115614c4e57614c4e6147d2565b614c6281614c5c84546146cf565b84614bf1565b602080601f831160018114614c95575f8415614c7e5750858301515b5f19600386901b1c1916600185901b178555614cec565b5f85815260208120601f198616915b82811015614cc357888601518255948401946001909101908401614ca4565b5085821015614ce057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614d05818460208701614583565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614f22380380614f2283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614dd58061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f366004614348565b61043b565b005b348015610161575f80fd5b50610154610170366004614383565b6108cc565b348015610180575f80fd5b506101bf61018f366004614383565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b5061015461021236600461439a565b610a9c565b348015610222575f80fd5b50610236610231366004614383565b610b79565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b506101546102903660046143b1565b610b8f565b3480156102a0575f80fd5b506101546102af3660046143ca565b610bba565b3480156102bf575f80fd5b506101bf6102ce366004614406565b610d8a565b3480156102de575f80fd5b506102366102ed366004614383565b610da3565b3480156102fd575f80fd5b5061015461030c366004614348565b610db7565b6101bf61031f366004614421565b610e97565b34801561032f575f80fd5b5061015461033e3660046143ca565b610ec3565b34801561034e575f80fd5b5061015461035d3660046143b1565b6110d2565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae366004614383565b61128f565b3480156103be575f80fd5b506101546103cd366004614383565b611515565b6101bf6103e0366004614383565b611629565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b50610418610413366004614383565b611635565b6040516101c9919061448e565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614d2983398151915291841561048d5761048a8285611714565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf61447a565b60048111156104d0576104d061447a565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156105575761055761447a565b146105a95760405162461bcd60e51b815260206004820152602a60248201525f80516020614d498339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461060e5760405162461bcd60e51b815260206004820152603360248201525f80516020614d498339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105a0565b5f610618846119b0565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156106655761066561447a565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61073785611635565b905082606001516001600160401b03168160a001516001600160401b0316116107ae5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105a0565b6002815160058111156107c3576107c361447a565b036107d5576107d58360600151611a32565b5f83606001518260a001516107ea919061457c565b90506107f68682611a3f565b5f6005600160991b0163ee5b48eb61080f898786611a87565b6040518263ffffffff1660e01b815260040161082b91906145be565b6020604051808303815f875af1158015610847573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086b91906145f0565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614da983398151915260205260408082208151610100810190925280545f80516020614d6983398151915293929190829060ff16600581111561091a5761091a61447a565b600581111561092b5761092b61447a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156109b0576109b061447a565b14610a155760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105a0565b6005600160991b016001600160a01b031663ee5b48eb610a3a8584608001515f611a87565b6040518263ffffffff1660e01b8152600401610a5691906145be565b6020604051808303815f875af1158015610a72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9691906145f0565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ae5575080546001600160401b03808416911610155b15610b035760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b2d83611ca6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b8964e8d4a5100083614607565b92915050565b5f610b9982611cb7565b9050610bb681606001516001600160401b0316826040015161202a565b5050565b5f80516020614d298339815191525f610bd28461203d565b90505f80610be3836040015161221e565b50915091505f610bf283611635565b9050816001600160401b031681608001516001600160401b03161015610c2a5760405162461bcd60e51b81526004016105a090614626565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c6f5760405162461bcd60e51b81526004016105a090614668565b60015f87815260068701602052604090205460ff166004811115610c9557610c9561447a565b14610cfe5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105a0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610b896001600160401b03831664e8d4a510006146b1565b5f610dad82611635565b60a0015192915050565b5f80516020614d298339815191525f610dcf85611635565b5f86815260058401602052604090205460c0820151919250610e0191620100009091046001600160401b0316906146c8565b6001600160401b0316421015610e755760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105a0565b8315610e8757610e858584611714565b505b610e9085612459565b5050505050565b5f610ea06127f7565b610eab83833461282e565b9050610b8960015f80516020614d8983398151915255565b5f80516020614d298339815191525f610edb8461203d565b90505f80610eec836040015161221e565b50915091505f610efb83611635565b9050816001600160401b031681608001516001600160401b03161015610f335760405162461bcd60e51b81526004016105a090614626565b5f8681526006860160205260409020600301546001600160401b0380841691161115610f715760405162461bcd60e51b81526004016105a090614668565b60035f87815260068701602052604090205460ff166004811115610f9757610f9761447a565b14610feb5760405162461bcd60e51b815260206004820152603160248201525f80516020614d498339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105a0565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526110909161202a565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614d698339815191525f6110ea8361203d565b90505f806110fb8360400151612a5c565b915091508061115d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105a0565b5f82815260078501602052604081208054611177906146e8565b90501180156111a9575060015f83815260088601602052604090205460ff1660058111156111a7576111a761447a565b145b6111c55760405162461bcd60e51b81526004016105a09061471a565b5f82815260078501602052604081206111dd91614290565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614d2983398151915293929190829060ff1660048111156112f0576112f061447a565b60048111156113015761130161447a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156113885761138861447a565b14806113a657506003815160048111156113a4576113a461447a565b145b6113fa5760405162461bcd60e51b815260206004820152603260248201525f80516020614d49833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105a0565b5f6114088260400151611635565b905080608001516001600160401b03165f0361148c5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105a0565b6005600160991b016001600160a01b031663ee5b48eb6114b9846040015184608001518560a00151611a87565b6040518263ffffffff1660e01b81526004016114d591906145be565b6020604051808303815f875af11580156114f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9091906145f0565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614d6983398151915292919061155d906146e8565b905011801561158f575060015f83815260088301602052604090205460ff16600581111561158d5761158d61447a565b145b6115ab5760405162461bcd60e51b81526004016105a09061471a565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916115e49190600401614761565b6020604051808303815f875af1158015611600573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162491906145f0565b505050565b5f610b89823334612bfd565b61163d6142c7565b5f8281525f80516020614da98339815191526020526040908190208151610100810190925280545f80516020614d69833981519152929190829060ff16600581111561168b5761168b61447a565b600581111561169c5761169c61447a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561175f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117869190810190614876565b91509150806117e95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105a0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561182c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061185091906145f0565b8251146118b45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105a0565b60208201516001600160a01b03161561192a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105a0565b5f806119398460400151612ff8565b915091508187146119a65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105a0565b9695505050505050565b5f8181525f80516020614da98339815191526020526040812060030180545f80516020614d69833981519152916001600160401b0390911690836119f38361495e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611a3c815f6131d0565b50565b5f9182525f80516020614da9833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611b0057611ac0816001614983565b611acb9060086146b1565b5081515f90839083908110611ae257611ae2614996565b60200101906001600160f81b03191690815f1a905350600101611aac565b505f5b6004811015611b6357611b17816003614983565b611b229060086146b1565b6001901c60f81b82611b358360026149aa565b81518110611b4557611b45614996565b60200101906001600160f81b03191690815f1a905350600101611b03565b505f5b6020811015611bc557611b7a81601f614983565b611b859060086146b1565b86901c60f81b82611b978360066149aa565b81518110611ba757611ba7614996565b60200101906001600160f81b03191690815f1a905350600101611b66565b505f5b6008811015611c3057611bdc816007614983565b611be79060086146b1565b6001600160401b038616901c60f81b82611c028360266149aa565b81518110611c1257611c12614996565b60200101906001600160f81b03191690815f1a905350600101611bc8565b505f5b6008811015611c9b57611c47816007614983565b611c529060086146b1565b6001600160401b038516901c60f81b82611c6d83602e6149aa565b81518110611c7d57611c7d614996565b60200101906001600160f81b03191690815f1a905350600101611c33565b5090505b9392505050565b611cae61342a565b611a3c81613475565b611cbf6142c7565b5f80516020614d698339815191525f611cd78461203d565b90505f80611ce88360400151612a5c565b915091508015611d4d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105a0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d7f57611d7f61447a565b6005811115611d9057611d9061447a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611e1757611e1761447a565b1480611e355750600182516005811115611e3357611e3361447a565b145b611e945760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105a0565b600382516005811115611ea957611ea961447a565b03611eb657506004611eba565b5060055b6020808301515f90815260098801909152604081205581816005811115611ee357611ee361447a565b90816005811115611ef657611ef661447a565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611f2a57611f2a61447a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ff557611ff561447a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610bb66001600160a01b038216836134e1565b60408051606080820183525f8083526020830181905292820152905f80516020614d698339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120b2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d99190810190614876565b91509150806121405760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105a0565b82548251146121a35760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105a0565b60208201516001600160a01b0316156122165760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105a0565b509392505050565b5f805f83516036146122425760405162461bcd60e51b81526004016105a0906149bd565b5f805b600281101561229157612259816001614983565b6122649060086146b1565b61ffff1686828151811061227a5761227a614996565b016020015160f81c901b9190911790600101612245565b5061ffff8116156122b45760405162461bcd60e51b81526004016105a090614a06565b5f805b600481101561230f576122cb816003614983565b6122d69060086146b1565b63ffffffff16876122e88360026149aa565b815181106122f8576122f8614996565b016020015160f81c901b91909117906001016122b7565b5063ffffffff81166003146123365760405162461bcd60e51b81526004016105a090614a49565b5f805b602081101561238b5761234d81601f614983565b6123589060086146b1565b886123648360066149aa565b8151811061237457612374614996565b016020015160f81c901b9190911790600101612339565b505f805b60088110156123ea576123a3816007614983565b6123ae9060086146b1565b6001600160401b0316896123c38360266149aa565b815181106123d3576123d3614996565b016020015160f81c901b919091179060010161238f565b505f805b600881101561244957612402816007614983565b61240d9060086146b1565b6001600160401b03168a61242283602e6149aa565b8151811061243257612432614996565b016020015160f81c901b91909117906001016123ee565b5091989097509095509350505050565b5f8181525f80516020614da983398151915260205260408082208151610100810190925280545f80516020614d6983398151915293929190829060ff1660058111156124a7576124a761447a565b60058111156124b8576124b861447a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156125405761254061447a565b1461259c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105a0565b60408101516001600160a01b0316336001600160a01b0316146126165760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105a0565b6126238160a00151611a32565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156126675761266761447a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127338461272d816119b0565b5f611a87565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906127629085906004016145be565b6020604051808303815f875af115801561277e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a291906145f0565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020614d8983398151915280546001190161282857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614d29833981519152906001600160401b031661287a6040860160208701614406565b6001600160401b031610156128e95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105a0565b60038101546128fb6020860186614a9f565b61ffff161015801561291f57506127106129186020860186614a9f565b61ffff1611155b61293b5760405162461bcd60e51b81526004016105a090614aba565b805483101561299e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105a0565b8060010154831115612a055760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105a0565b825f612a1082610b79565b90505f612a1d8883613574565b5f81815260058601602052604090209091508790612a3b8282614b05565b509098975050505050505050565b60015f80516020614d8983398151915255565b5f808251602714612a7f5760405162461bcd60e51b81526004016105a0906149bd565b5f805b6002811015612ace57612a96816001614983565b612aa19060086146b1565b61ffff16858281518110612ab757612ab7614996565b016020015160f81c901b9190911790600101612a82565b5061ffff811615612af15760405162461bcd60e51b81526004016105a090614a06565b5f805b6004811015612b4c57612b08816003614983565b612b139060086146b1565b63ffffffff1686612b258360026149aa565b81518110612b3557612b35614996565b016020015160f81c901b9190911790600101612af4565b5063ffffffff8116600214612b735760405162461bcd60e51b81526004016105a090614a49565b5f805b6020811015612bc857612b8a81601f614983565b612b959060086146b1565b87612ba18360066149aa565b81518110612bb157612bb1614996565b016020015160f81c901b9190911790600101612b76565b505f86602681518110612bdd57612bdd614996565b016020015191976001600160f81b03199092161515965090945050505050565b5f612c066127f7565b5f80516020614d298339815191525f612c1e84610b79565b90505f612c2a87611635565b9050600281516005811115612c4157612c4161447a565b14612ca05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105a0565b612ca982613aae565b5f828260a00151612cba91906146c8565b60048501546060840151919250612cdc916001600160401b0390911690614b5b565b6001600160401b0316816001600160401b03161115612d5b5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105a0565b612d658882611a3f565b5f612d6f896119b0565b90505f8982604051602001612d9b92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612dd58d8688611a87565b6040518263ffffffff1660e01b8152600401612df191906145be565b6020604051808303815f875af1158015612e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e3191906145f0565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612eb957612eb961447a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611c9f60015f80516020614d8983398151915255565b5f808251602e1461301b5760405162461bcd60e51b81526004016105a0906149bd565b5f805b600281101561306a57613032816001614983565b61303d9060086146b1565b61ffff1685828151811061305357613053614996565b016020015160f81c901b919091179060010161301e565b5061ffff81161561308d5760405162461bcd60e51b81526004016105a090614a06565b5f805b60048110156130e8576130a4816003614983565b6130af9060086146b1565b63ffffffff16866130c18360026149aa565b815181106130d1576130d1614996565b016020015160f81c901b9190911790600101613090565b5063ffffffff811660041461310f5760405162461bcd60e51b81526004016105a090614a49565b5f805b60208110156131645761312681601f614983565b6131319060086146b1565b8761313d8360066149aa565b8151811061314d5761314d614996565b016020015160f81c901b9190911790600101613112565b505f805b60088110156131c35761317c816007614983565b6131879060086146b1565b6001600160401b03168861319c8360266149aa565b815181106131ac576131ac614996565b016020015160f81c901b9190911790600101613168565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614d698339815191529142919015806132b65750600283015481516132b2916001600160401b0316906149aa565b8210155b156132dc576001600160401b0385166060820152818152604081015160208201526132fb565b84816060018181516132ee91906146c8565b6001600160401b03169052505b606081015161330b906064614b5b565b602082015160028501546001600160401b0392909216916133369190600160401b900460ff166146b1565b101561339a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105a0565b83156133c357846001600160401b0316816040018181516133bb91906149aa565b9052506133e2565b846001600160401b0316816040018181516133de9190614983565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661347357604051631afcd79f60e31b815260040160405180910390fd5b565b61347d61342a565b61348681613ab9565b611a3c608082013560a08301356134a360e0850160c08601614406565b6134b4610100860160e08701614a9f565b61ffff166134ca61012087016101008801614b86565b6134dc61014088016101208901614ba6565b613ada565b804710156135045760405163cd78605960e01b81523060048201526024016105a0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461354d576040519150601f19603f3d011682016040523d82523d5f602084013e613552565b606091505b505090508061162457604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614d69833981519152426135946040860160208701614406565b6001600160401b0316116136065760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105a0565b6136166040850160208601614406565b6001600160401b031661362c6202a300426149aa565b1161369f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105a0565b83356136f75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105a0565b83355f908152600982016020526040902054156137675760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105a0565b6137746040850185614bc1565b90506030146137db5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105a0565b6137e483613aae565b5f8061387e6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906138299190614406565b6001600160401b0316815260200161384460408a018a614bc1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613d1e565b5f8281526007860160205260409020919350915061389c8282614c4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138c99085906004016145be565b6020604051808303815f875af11580156138e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390991906145f0565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561398b5761398b61447a565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a8091908e01908e01614406565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611a3c8160016131d0565b613ac161342a565b613ac96140c3565b613ad16140d3565b611a3c816140db565b613ae261342a565b5f80516020614d2983398151915283613b4e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105a0565b612710841115613b705760405162461bcd60e51b81526004016105a090614aba565b85871115613bd85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105a0565b5f8360ff1611613c455760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105a0565b600a60ff84161115613cb75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105a0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613d885760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105a0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613dff57613dbf816001614983565b613dca9060086146b1565b5081515f90839083908110613de157613de1614996565b60200101906001600160f81b03191690815f1a905350600101613dab565b505f5b6004811015613e5d57613e16816003614983565b613e219060086146b1565b505f82613e2f8360026149aa565b81518110613e3f57613e3f614996565b60200101906001600160f81b03191690815f1a905350600101613e02565b505f5b6020811015613eba5784518160208110613e7c57613e7c614996565b1a60f81b82613e8c8360066149aa565b81518110613e9c57613e9c614996565b60200101906001600160f81b03191690815f1a905350600101613e60565b505f5b6020811015613f1a5784602001518160208110613edc57613edc614996565b1a60f81b82613eec8360266149aa565b81518110613efc57613efc614996565b60200101906001600160f81b03191690815f1a905350600101613ebd565b505f5b6008811015613f8e57613f31816007614983565b613f3c9060086146b1565b60ff1685604001516001600160401b0316901c60f81b82826046613f6091906149aa565b81518110613f7057613f70614996565b60200101906001600160f81b03191690815f1a905350600101613f1d565b505f5b6030811015613ff95784608001518181518110613fb057613fb0614996565b01602001516001600160f81b03191682613fcb83604e6149aa565b81518110613fdb57613fdb614996565b60200101906001600160f81b03191690815f1a905350600101613f91565b505f5b600881101561406b57614010816007614983565b61401b9060086146b1565b60608601516001600160401b0390811691161c60f81b8261403d83607e6149aa565b8151811061404d5761404d614996565b60200101906001600160f81b03191690815f1a905350600101613ffc565b5060028160405161407c9190614d0d565b602060405180830381855afa158015614097573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906140ba91906145f0565b94909350915050565b6140cb61342a565b613473614288565b61347361342a565b6140e361342a565b80355f80516020614d6983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461412f6080840160608501614b86565b60ff16111561419c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105a0565b5f6141ad6080840160608501614b86565b60ff16116142155760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105a0565b6142256080830160608401614b86565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556142566060830160408401614406565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612a4961342a565b50805461429c906146e8565b5f825580601f106142ab575050565b601f0160209004905f5260205f2090810190611a3c919061430b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561431f575f815560010161430c565b5090565b8015158114611a3c575f80fd5b803563ffffffff81168114614343575f80fd5b919050565b5f805f6060848603121561435a575f80fd5b83359250602084013561436c81614323565b915061437a60408501614330565b90509250925092565b5f60208284031215614393575f80fd5b5035919050565b5f61014082840312156143ab575f80fd5b50919050565b5f602082840312156143c1575f80fd5b611c9f82614330565b5f80604083850312156143db575f80fd5b6143e483614330565b946020939093013593505050565b6001600160401b0381168114611a3c575f80fd5b5f60208284031215614416575f80fd5b8135611c9f816143f2565b5f808284036060811215614433575f80fd5b83356001600160401b03811115614448575f80fd5b840160608187031215614459575f80fd5b92506040601f198201121561446c575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106144b257634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516144da60408401826001600160a01b03169052565b5060608301516144f560608401826001600160401b03169052565b50608083015161451060808401826001600160401b03169052565b5060a083015161452b60a08401826001600160401b03169052565b5060c083015161454660c08401826001600160401b03169052565b5060e083015161456160e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561456157614561614568565b5f5b838110156145b657818101518382015260200161459e565b50505f910152565b602081525f82518060208401526145dc81604085016020870161459c565b601f01601f19169190910160400192915050565b5f60208284031215614600575f80fd5b5051919050565b5f8261462157634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610b8957610b89614568565b6001600160401b0381811683821601908082111561456157614561614568565b600181811c908216806146fc57607f821691505b6020821081036143ab57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614773816146e8565b806020870152604060018084165f811461479457600181146147b0576147dd565b60ff19851660408a0152604084151560051b8a010195506147dd565b895f5260205f205f5b858110156147d45781548b82018601529083019088016147b9565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614821576148216147eb565b60405290565b604051601f8201601f191681016001600160401b038111828210171561484f5761484f6147eb565b604052919050565b6001600160a01b0381168114611a3c575f80fd5b805161434381614323565b5f8060408385031215614887575f80fd5b82516001600160401b038082111561489d575f80fd5b90840190606082870312156148b0575f80fd5b6148b86147ff565b825181526020808401516148cb81614857565b828201526040840151838111156148e0575f80fd5b80850194505087601f8501126148f4575f80fd5b835183811115614906576149066147eb565b614918601f8201601f19168301614827565b9350808452888282870101111561492d575f80fd5b61493c8183860184880161459c565b5082604083015281955061495181880161486b565b9450505050509250929050565b5f6001600160401b0380831681810361497957614979614568565b6001019392505050565b81810381811115610b8957610b89614568565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610b8957610b89614568565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611a3c575f80fd5b5f60208284031215614aaf575f80fd5b8135611c9f81614a90565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614b1081614a90565b61ffff8116905081548161ffff1982161783556020840135614b31816143f2565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614b7e57614b7e614568565b505092915050565b5f60208284031215614b96575f80fd5b813560ff81168114611c9f575f80fd5b5f60208284031215614bb6575f80fd5b8135611c9f81614857565b5f808335601e19843603018112614bd6575f80fd5b8301803591506001600160401b03821115614bef575f80fd5b602001915036819003821315614c03575f80fd5b9250929050565b601f82111561162457805f5260205f20601f840160051c81016020851015614c2f5750805b601f840160051c820191505b81811015610e90575f8155600101614c3b565b81516001600160401b03811115614c6757614c676147eb565b614c7b81614c7584546146e8565b84614c0a565b602080601f831160018114614cae575f8415614c975750858301515b5f19600386901b1c1916600185901b178555614d05565b5f85815260208120601f198616915b82811015614cdc57888601518255948401946001909101908401614cbd565b5085821015614cf957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614d1e81846020870161459c565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 47871d856..d339f6a68 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -346,10 +346,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ); uint64 nonce = _incrementAndGetNonce(validationID); - // Check that removing this delegator would not exceed the maximum churn rate. - // TODO this check won't be necessary for a delegator whose validator has already initialized ending their validation period. - _checkAndUpdateChurnTrackerRemoval(delegator.weight); - // Set the delegator status to pending removed, so that it can be properly removed in // the complete step, even if the delivered nonce is greater than the nonce used to // initialize the removal. @@ -361,6 +357,15 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = getValidator(validationID); require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); + + // Check that removing this delegator would not exceed the maximum churn rate. + // We only need to check this is the validator is still active. If the validator ends its validation + // period, the weight of all its delegators will be added to the churn tracker at that time. Ending + // a delegation whose validator has ended validating has no impact on the stake weight of the chain. + if (validator.status == ValidatorStatus.Active) { + _checkAndUpdateChurnTrackerRemoval(delegator.weight); + } + uint64 newValidatorWeight = validator.weight - delegator.weight; _setValidatorWeight(validationID, newValidatorWeight); diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 16dcf3b5a..1ddf76a69 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -418,14 +418,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 // 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 returns (uint64) { + 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 // 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 returns (uint256) { + function _weightToValue(uint64 weight) internal pure returns (uint256) { return uint256(weight) * 1e12; } } From 6ba67b61e404f1acd7452b6104cac425380c1b37 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 11:17:35 -0400 Subject: [PATCH 284/545] Fixup --- .../staking/tests/NativeTokenStakingManagerTests.t.sol | 2 +- tests/utils/staking.go | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index f32a8f4f6..80a8dfc9b 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -58,7 +58,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { // method and let the implementation in PosValidatorManagerTests do the // test, and remove the `virtual` modifier from that implementation. } - + function testZeroMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); vm.expectRevert(_formatErrorMessage("zero delegation fee")); diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 817359ccd..0c54c81ce 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -158,19 +158,12 @@ func DeployAndInitializeERC20TokenStakingManager( ChurnPeriodSeconds: DefaultChurnPeriodSeconds, MaximumChurnPercentage: DefaultMaxChurnPercentage, }, -<<<<<<< HEAD - MinimumStakeAmount: big.NewInt(0).SetUint64(1e6), - MaximumStakeAmount: big.NewInt(0).SetUint64(10e6), - MinimumStakeDuration: uint64(24 * time.Hour), - RewardCalculator: rewardCalculatorAddress, -======= MinimumStakeAmount: big.NewInt(0).SetUint64(DefaultMinStakeAmount), MaximumStakeAmount: big.NewInt(0).SetUint64(DefaultMaxStakeAmount), MinimumStakeDuration: DefaultMinStakeDurationSeconds, MinimumDelegationFeeBips: DefaultMinDelegateFeeBips, MaximumStakeMultiplier: DefaultMaxStakeMultiplier, - RewardCalculator: common.Address{}, ->>>>>>> staking-contract + RewardCalculator: rewardCalculatorAddress, }, erc20Address, ) From 56304eb85efff09f07602eca664393cf1e8d1aa8 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 11:52:02 -0400 Subject: [PATCH 285/545] Fix tests --- .../tests/PoAValidatorManagerTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 17 ++--------------- .../staking/tests/ValidatorManagerTests.t.sol | 10 +++------- 3 files changed, 6 insertions(+), 23 deletions(-) diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index 7ef076bb1..76f6157f5 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -54,7 +54,7 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { return app.initializeValidatorRegistration(input, weight); } - function _initializeEndValidation(bytes32 validationID) internal virtual override { + function _initializeEndValidation(bytes32 validationID, bool) internal virtual override { return app.initializeEndValidation(validationID); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index f0e9f81b2..cd91bf625 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -158,19 +158,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.initializeEndValidation(validationID, false, 0); } - function testInitializeEndValidation() public override { - _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - includeUptime: false - }); - } - function testInvalidUptimeWarpMessage() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -765,8 +752,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 stakeAmount ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID) internal virtual override { - return posValidatorManager.initializeEndValidation(validationID, true, 0); + function _initializeEndValidation(bytes32 validationID, bool includeUptime) internal virtual override { + return posValidatorManager.initializeEndValidation(validationID, includeUptime, 0); } function _initializeDelegatorRegistration( diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 2c4843394..180cf70f7 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -144,10 +144,6 @@ abstract contract ValidatorManagerTest is Test { }); } - function testInitializeEndValidationExcessiveChurn() public { - // TODO: implement - } - function testResendEndValidation() public virtual { bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, @@ -252,7 +248,7 @@ abstract contract ValidatorManagerTest is Test { // Second call should fail vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); - _initializeEndValidation(validationID); + _initializeEndValidation(validationID, false); } function _newNodeID() internal returns (bytes32) { @@ -380,7 +376,7 @@ abstract contract ValidatorManagerTest is Test { vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); - _initializeEndValidation(validationID); + _initializeEndValidation(validationID, includeUptime); } function _testCompleteEndValidation(bytes32 validationID) internal virtual { @@ -444,7 +440,7 @@ abstract contract ValidatorManagerTest is Test { uint64 weight ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID) internal virtual; + function _initializeEndValidation(bytes32 validationID, bool includeUptime) internal virtual; function _beforeSend(uint256 amount, address spender) internal virtual; From 08d95b8b2c4d7144b3389e7a7d1c35a78de2bbeb Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 12:18:40 -0400 Subject: [PATCH 286/545] Fix rewards calculator --- .../go/mocks/ExampleERC20/ExampleERC20.go | 2 +- .../ERC20TokenStakingManager.go | 35 +++++++++++- .../ExampleRewardCalculator.go | 28 +++++----- .../NativeTokenStakingManager.go | 35 +++++++++++- contracts/mocks/ExampleERC20.sol | 2 +- contracts/staking/ExampleRewardCalculator.sol | 5 +- contracts/staking/PoSValidatorManager.sol | 53 +++++++++++-------- .../staking/interfaces/IRewardCalculator.sol | 3 +- .../tests/ExamplesRewardCalculatorTests.t.sol | 4 +- .../tests/PoSValidatorManagerTests.t.sol | 5 +- 10 files changed, 125 insertions(+), 47 deletions(-) diff --git a/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go b/abi-bindings/go/mocks/ExampleERC20/ExampleERC20.go index f3b31c597..2f6a01a04 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: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108c08061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101a7578063a0712d68146101af578063a9059cbb146101c2578063dd62ed3e146101d5575f80fd5b806342966c681461015957806370a082311461016c57806379cc679014610194575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce5671461013557806340c10f1914610144575b5f80fd5b6100d761020d565b6040516100e4919061072c565b60405180910390f35b6101006100fb366004610793565b61029d565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b6101006101303660046107bb565b6102b6565b604051601281526020016100e4565b610157610152366004610793565b6102d9565b005b6101576101673660046107f4565b610343565b61011461017a36600461080b565b6001600160a01b03165f9081526020819052604090205490565b6101576101a2366004610793565b610350565b6100d7610365565b6101576101bd3660046107f4565b610374565b6101006101d0366004610793565b6103d5565b6101146101e336600461082b565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021c9061085c565b80601f01602080910402602001604051908101604052809291908181526020018280546102489061085c565b80156102935780601f1061026a57610100808354040283529160200191610293565b820191905f5260205f20905b81548152906001019060200180831161027657829003601f168201915b5050505050905090565b5f336102aa8185856103e2565b60019150505b92915050565b5f336102c38582856103f4565b6102ce85858561046f565b506001949350505050565b662386f26fc100008111156103355760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b61033f82826104cc565b5050565b61034d3382610500565b50565b61035b8233836103f4565b61033f8282610500565b60606004805461021c9061085c565b662386f26fc100008111156103cb5760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e7420657863656564656400604482015260640161032c565b61034d33826104cc565b5f336102aa81858561046f565b6103ef8383836001610534565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198114610469578181101561045b57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161032c565b61046984848484035f610534565b50505050565b6001600160a01b03831661049857604051634b637e8f60e11b81525f600482015260240161032c565b6001600160a01b0382166104c15760405163ec442f0560e01b81525f600482015260240161032c565b6103ef838383610606565b6001600160a01b0382166104f55760405163ec442f0560e01b81525f600482015260240161032c565b61033f5f8383610606565b6001600160a01b03821661052957604051634b637e8f60e11b81525f600482015260240161032c565b61033f825f83610606565b6001600160a01b03841661055d5760405163e602df0560e01b81525f600482015260240161032c565b6001600160a01b03831661058657604051634a1406b160e11b81525f600482015260240161032c565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561046957826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105f891815260200190565b60405180910390a350505050565b6001600160a01b038316610630578060025f8282546106259190610894565b909155506106a09050565b6001600160a01b0383165f90815260208190526040902054818110156106825760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161032c565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166106bc576002805482900390556106da565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161071f91815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b818110156107585785810183015185820160400152820161073c565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461078e575f80fd5b919050565b5f80604083850312156107a4575f80fd5b6107ad83610778565b946020939093013593505050565b5f805f606084860312156107cd575f80fd5b6107d684610778565b92506107e460208501610778565b9150604084013590509250925092565b5f60208284031215610804575f80fd5b5035919050565b5f6020828403121561081b575f80fd5b61082482610778565b9392505050565b5f806040838503121561083c575f80fd5b61084583610778565b915061085360208401610778565b90509250929050565b600181811c9082168061087057607f821691505b60208210810361088e57634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102b057634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040518060400160405280600a81526020016926b7b1b5902a37b5b2b760b11b81525060405180604001604052806004815260200163045584d560e41b815250816003908161005f919061028b565b50600461006c828261028b565b50505061008b336b204fce5e3e2502611000000061009060201b60201c565b61036f565b6001600160a01b0382166100be5760405163ec442f0560e01b81525f60048201526024015b60405180910390fd5b6100c95f83836100cd565b5050565b6001600160a01b0383166100f7578060025f8282546100ec919061034a565b909155506101679050565b6001600160a01b0383165f90815260208190526040902054818110156101495760405163391434e360e21b81526001600160a01b038516600482015260248101829052604481018390526064016100b5565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b038216610183576002805482900390556101a1565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516101e691815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061021b57607f821691505b60208210810361023957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561028657805f5260205f20601f840160051c810160208510156102645750805b601f840160051c820191505b81811015610283575f8155600101610270565b50505b505050565b81516001600160401b038111156102a4576102a46101f3565b6102b8816102b28454610207565b8461023f565b602080601f8311600181146102eb575f84156102d45750858301515b5f19600386901b1c1916600185901b178555610342565b5f85815260208120601f198616915b82811015610319578886015182559484019460019091019084016102fa565b508582101561033657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b8082018082111561036957634e487b7160e01b5f52601160045260245ffd5b92915050565b6108c28061037c5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c806342966c681161008857806395d89b411161006357806395d89b41146101a7578063a0712d68146101af578063a9059cbb146101c2578063dd62ed3e146101d5575f80fd5b806342966c681461015957806370a082311461016c57806379cc679014610194575f80fd5b806306fdde03146100cf578063095ea7b3146100ed57806318160ddd1461011057806323b872dd14610122578063313ce5671461013557806340c10f1914610144575b5f80fd5b6100d761020d565b6040516100e4919061072e565b60405180910390f35b6101006100fb366004610795565b61029d565b60405190151581526020016100e4565b6002545b6040519081526020016100e4565b6101006101303660046107bd565b6102b6565b604051601281526020016100e4565b610157610152366004610795565b6102d9565b005b6101576101673660046107f6565b610344565b61011461017a36600461080d565b6001600160a01b03165f9081526020819052604090205490565b6101576101a2366004610795565b610351565b6100d7610366565b6101576101bd3660046107f6565b610375565b6101006101d0366004610795565b6103d7565b6101146101e336600461082d565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b60606003805461021c9061085e565b80601f01602080910402602001604051908101604052809291908181526020018280546102489061085e565b80156102935780601f1061026a57610100808354040283529160200191610293565b820191905f5260205f20905b81548152906001019060200180831161027657829003601f168201915b5050505050905090565b5f336102aa8185856103e4565b60019150505b92915050565b5f336102c38582856103f6565b6102ce858585610471565b506001949350505050565b678ac7230489e800008111156103365760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e742065786365656465640060448201526064015b60405180910390fd5b61034082826104ce565b5050565b61034e3382610502565b50565b61035c8233836103f6565b6103408282610502565b60606004805461021c9061085e565b678ac7230489e800008111156103cd5760405162461bcd60e51b815260206004820152601f60248201527f4578616d706c6545524332303a206d6178206d696e7420657863656564656400604482015260640161032d565b61034e33826104ce565b5f336102aa818585610471565b6103f18383836001610536565b505050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f19811461046b578181101561045d57604051637dc7a0d960e11b81526001600160a01b0384166004820152602481018290526044810183905260640161032d565b61046b84848484035f610536565b50505050565b6001600160a01b03831661049a57604051634b637e8f60e11b81525f600482015260240161032d565b6001600160a01b0382166104c35760405163ec442f0560e01b81525f600482015260240161032d565b6103f1838383610608565b6001600160a01b0382166104f75760405163ec442f0560e01b81525f600482015260240161032d565b6103405f8383610608565b6001600160a01b03821661052b57604051634b637e8f60e11b81525f600482015260240161032d565b610340825f83610608565b6001600160a01b03841661055f5760405163e602df0560e01b81525f600482015260240161032d565b6001600160a01b03831661058857604051634a1406b160e11b81525f600482015260240161032d565b6001600160a01b038085165f908152600160209081526040808320938716835292905220829055801561046b57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516105fa91815260200190565b60405180910390a350505050565b6001600160a01b038316610632578060025f8282546106279190610896565b909155506106a29050565b6001600160a01b0383165f90815260208190526040902054818110156106845760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161032d565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166106be576002805482900390556106dc565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161072191815260200190565b60405180910390a3505050565b5f602080835283518060208501525f5b8181101561075a5785810183015185820160400152820161073e565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610790575f80fd5b919050565b5f80604083850312156107a6575f80fd5b6107af8361077a565b946020939093013593505050565b5f805f606084860312156107cf575f80fd5b6107d88461077a565b92506107e66020850161077a565b9150604084013590509250925092565b5f60208284031215610806575f80fd5b5035919050565b5f6020828403121561081d575f80fd5b6108268261077a565b9392505050565b5f806040838503121561083e575f80fd5b6108478361077a565b91506108556020840161077a565b90509250929050565b600181811c9082168061087257607f821691505b60208210810361089057634e487b7160e01b5f52602260045260245ffd5b50919050565b808201808211156102b057634e487b7160e01b5f52601160045260245ffdfea164736f6c6343000819000a", } // ExampleERC20ABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6db31cbaa..a0bb8e748 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -75,8 +75,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161553738038061553783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6153ea8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f3660046148cd565b610357565b005b610154610164366004614908565b610887565b6101a7610177366004614908565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e2366004614908565b610a57565b6040516001600160401b0390911681526020016101b1565b61015461020d366004614933565b610a6d565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c366004614971565b610b4c565b61015461024f36600461498a565b610bf0565b6101a76102623660046149c6565b610dc0565b6101e7610275366004614908565b610dd9565b6101546102883660046148cd565b610ded565b61015461029b36600461498a565b610f9b565b6101a76102ae3660046149e1565b6111d9565b6101a76102c1366004614a01565b6111ec565b6101546102d4366004614971565b611218565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d366004614908565b6113d5565b610154610320366004614908565b611662565b6101c2601481565b61034061033b366004614908565b611771565b6040516101b19190614a76565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f8051602061533e833981519152949193919290829060ff1660048111156103bf576103bf614a62565b60048111156103d0576103d0614a62565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f8515610456576104538386611850565b90505b6004848101546060840151604051636588aa7f60e01b81526001600160401b0391821693810193909352831660248301525f604483018190526064830152600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa1580156104c9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104ed9190614b50565b5f88815260098601602052604090205560028251600481111561051257610512614a62565b146105645760405162461bcd60e51b815260206004820152602a60248201525f8051602061535e8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105c95760405162461bcd60e51b815260206004820152603360248201525f8051602061535e8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161055b565b5f6105d384611aec565b600384526001600160401b0342811660a0860152811660e08501525f8981526006870160205260409020845181549293508592829060ff1916600183600481111561062057610620614a62565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106f285611771565b905083606001516001600160401b03168160a001516001600160401b0316116107695760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161055b565b60028151600581111561077e5761077e614a62565b03610790576107908460600151611b6e565b5f84606001518260a001516107a59190614b7b565b90506107b18682611b7b565b5f6005600160991b0163ee5b48eb6107ca898786611bc3565b6040518263ffffffff1660e01b81526004016107e69190614bbd565b6020604051808303815f875af1158015610802573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108269190614b50565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206153be83398151915260205260408082208151610100810190925280545f8051602061537e83398151915293929190829060ff1660058111156108d5576108d5614a62565b60058111156108e6576108e6614a62565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561096b5761096b614a62565b146109d05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161055b565b6005600160991b016001600160a01b031663ee5b48eb6109f58584608001515f611bc3565b6040518263ffffffff1660e01b8152600401610a119190614bbd565b6020604051808303815f875af1158015610a2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a519190614b50565b50505050565b5f610a6764e8d4a5100083614bef565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ab6575080546001600160401b03808416911610155b15610ad45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610aff8484611de0565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610b5682611dfe565b6040808201516001600160a01b0381165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a60205291909120549192505f8051602061533e83398151915291610baf9190612171565b604080830180516001600160a01b03165f908152600a84016020529182209190915560608301519051610beb916001600160401b0316906121de565b505050565b5f8051602061533e8339815191525f610c0884612201565b90505f80610c1983604001516123e2565b50915091505f610c2883611771565b9050816001600160401b031681608001516001600160401b03161015610c605760405162461bcd60e51b815260040161055b90614c0e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ca55760405162461bcd60e51b815260040161055b90614c50565b60015f87815260068701602052604090205460ff166004811115610ccb57610ccb614a62565b14610d345760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161055b565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a676001600160401b03831664e8d4a51000614c99565b5f610de382611771565b60a0015192915050565b5f8051602061533e8339815191525f610e0585611771565b5f86815260058401602052604090205460c0820151919250610e3791620100009091046001600160401b031690614cb0565b6001600160401b0316421015610eab5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161055b565b5f8415610ebf57610ebc8685611850565b90505b60048381015460a0840151604051636588aa7f60e01b81526001600160401b0391821693810193909352831660248301525f604483018190526064830152600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610f32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f569190614b50565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610f83908490614cd0565b90915550610f9290508661261d565b50505050505050565b5f8051602061533e8339815191525f610fb384612201565b90505f80610fc483604001516123e2565b50915091505f610fd383611771565b9050816001600160401b031681608001516001600160401b0316101561100b5760405162461bcd60e51b815260040161055b90614c0e565b5f8681526006860160205260409020600301546001600160401b03808416911611156110495760405162461bcd60e51b815260040161055b90614c50565b60035f87815260068701602052604090205460ff16600481111561106f5761106f614a62565b146110c35760405162461bcd60e51b815260206004820152603160248201525f8051602061535e8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161055b565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152611168916121de565b6111898160200151876009015f8a81526020019081526020015f2054612171565b5f878152600987016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f6111e58333846129c6565b9392505050565b5f6111f5612dc4565b611200848484612dfb565b90506111e560015f8051602061539e83398151915255565b5f8051602061537e8339815191525f61123083612201565b90505f806112418360400151613034565b91509150806112a35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161055b565b5f828152600785016020526040812080546112bd90614ce3565b90501180156112ef575060015f83815260088601602052604090205460ff1660058111156112ed576112ed614a62565b145b61130b5760405162461bcd60e51b815260040161055b90614d1b565b5f828152600785016020526040812061132391614815565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061533e83398151915293929190829060ff16600481111561143657611436614a62565b600481111561144757611447614a62565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156114ce576114ce614a62565b14806114ec57506003815160048111156114ea576114ea614a62565b145b6115405760405162461bcd60e51b815260206004820152603260248201525f8051602061535e833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161055b565b5f61154e8260400151611771565b905080608001516001600160401b03165f036115d25760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161055b565b6005600160991b016001600160a01b031663ee5b48eb6115ff846040015184608001518560a00151611bc3565b6040518263ffffffff1660e01b815260040161161b9190614bbd565b6020604051808303815f875af1158015611637573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061165b9190614b50565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061537e8339815191529291906116aa90614ce3565b90501180156116dc575060015f83815260088301602052604090205460ff1660058111156116da576116da614a62565b145b6116f85760405162461bcd60e51b815260040161055b90614d1b565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117319190600401614d62565b6020604051808303815f875af115801561174d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610beb9190614b50565b61177961484c565b5f8281525f805160206153be8339815191526020526040908190208151610100810190925280545f8051602061537e833981519152929190829060ff1660058111156117c7576117c7614a62565b60058111156117d8576117d8614a62565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561189b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118c29190810190614e63565b91509150806119255760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161055b565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611968573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061198c9190614b50565b8251146119f05760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161055b565b60208201516001600160a01b031615611a665760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161055b565b5f80611a7584604001516131d5565b91509150818714611ae25760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161055b565b9695505050505050565b5f8181525f805160206153be8339815191526020526040812060030180545f8051602061537e833981519152916001600160401b039091169083611b2f83614f4b565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611b78815f6133ad565b50565b5f9182525f805160206153be833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611c3c57611bfc816001614f70565b611c07906008614c99565b5081515f90839083908110611c1e57611c1e614f83565b60200101906001600160f81b03191690815f1a905350600101611be8565b505f5b6004811015611c9f57611c53816003614f70565b611c5e906008614c99565b6001901c60f81b82611c71836002614cd0565b81518110611c8157611c81614f83565b60200101906001600160f81b03191690815f1a905350600101611c3f565b505f5b6020811015611d0157611cb681601f614f70565b611cc1906008614c99565b86901c60f81b82611cd3836006614cd0565b81518110611ce357611ce3614f83565b60200101906001600160f81b03191690815f1a905350600101611ca2565b505f5b6008811015611d6c57611d18816007614f70565b611d23906008614c99565b6001600160401b038616901c60f81b82611d3e836026614cd0565b81518110611d4e57611d4e614f83565b60200101906001600160f81b03191690815f1a905350600101611d04565b505f5b6008811015611dd757611d83816007614f70565b611d8e906008614c99565b6001600160401b038516901c60f81b82611da983602e614cd0565b81518110611db957611db9614f83565b60200101906001600160f81b03191690815f1a905350600101611d6f565b50949350505050565b611de8613607565b611df182613652565b611dfa816136be565b5050565b611e0661484c565b5f8051602061537e8339815191525f611e1e84612201565b90505f80611e2f8360400151613034565b915091508015611e945760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161055b565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611ec657611ec6614a62565b6005811115611ed757611ed7614a62565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611f5e57611f5e614a62565b1480611f7c5750600182516005811115611f7a57611f7a614a62565b145b611fdb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161055b565b600382516005811115611ff057611ff0614a62565b03611ffd57506004612001565b5060055b6020808301515f9081526009880190915260408120558181600581111561202a5761202a614a62565b9081600581111561203d5761203d614a62565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561207157612071614a62565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561213c5761213c614a62565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061531e83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156121cc575f80fd5b505af1158015610f92573d5f803e3d5ffd5b5f8051602061531e83398151915254611dfa906001600160a01b0316828461375f565b60408051606080820183525f8083526020830181905292820152905f8051602061537e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612276573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229d9190810190614e63565b91509150806123045760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161055b565b82548251146123675760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161055b565b60208201516001600160a01b0316156123da5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161055b565b509392505050565b5f805f83516036146124065760405162461bcd60e51b815260040161055b90614f97565b5f805b60028110156124555761241d816001614f70565b612428906008614c99565b61ffff1686828151811061243e5761243e614f83565b016020015160f81c901b9190911790600101612409565b5061ffff8116156124785760405162461bcd60e51b815260040161055b90614fe0565b5f805b60048110156124d35761248f816003614f70565b61249a906008614c99565b63ffffffff16876124ac836002614cd0565b815181106124bc576124bc614f83565b016020015160f81c901b919091179060010161247b565b5063ffffffff81166003146124fa5760405162461bcd60e51b815260040161055b90615023565b5f805b602081101561254f5761251181601f614f70565b61251c906008614c99565b88612528836006614cd0565b8151811061253857612538614f83565b016020015160f81c901b91909117906001016124fd565b505f805b60088110156125ae57612567816007614f70565b612572906008614c99565b6001600160401b031689612587836026614cd0565b8151811061259757612597614f83565b016020015160f81c901b9190911790600101612553565b505f805b600881101561260d576125c6816007614f70565b6125d1906008614c99565b6001600160401b03168a6125e683602e614cd0565b815181106125f6576125f6614f83565b016020015160f81c901b91909117906001016125b2565b5091989097509095509350505050565b61262561484c565b5f8281525f805160206153be83398151915260205260408082208151610100810190925280545f8051602061537e83398151915293929190829060ff16600581111561267357612673614a62565b600581111561268457612684614a62565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561270c5761270c614a62565b146127685760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161055b565b60408101516001600160a01b0316336001600160a01b0316146127e25760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161055b565b6127ef8160a00151611b6e565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561283357612833614a62565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6128ff856128f981611aec565b5f611bc3565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061292e908590600401614bbd565b6020604051808303815f875af115801561294a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061296e9190614b50565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f6129cf612dc4565b5f8051602061533e8339815191525f6129ea6101e2856137be565b90505f6129f687611771565b9050600281516005811115612a0d57612a0d614a62565b14612a6c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161055b565b612a75826137e1565b5f828260a00151612a869190614cb0565b60048501546060840151919250612aa8916001600160401b039091169061506a565b6001600160401b0316816001600160401b03161115612b275760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161055b565b612b318882611b7b565b5f612b3b89611aec565b90505f8982604051602001612b6792919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612ba18d8688611bc3565b6040518263ffffffff1660e01b8152600401612bbd9190614bbd565b6020604051808303815f875af1158015612bd9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bfd9190614b50565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612c8557612c85614a62565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a450955050505050506111e560015f8051602061539e83398151915255565b5f8051602061539e833981519152805460011901612df557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061533e833981519152906001600160401b0316612e4760408601602087016149c6565b6001600160401b03161015612eb65760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161055b565b6003810154612ec860208601866150a4565b61ffff1610158015612eec5750612710612ee560208601866150a4565b61ffff1611155b612f085760405162461bcd60e51b815260040161055b906150bf565b8054831015612f6b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161055b565b8060010154831115612fd25760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161055b565b5f612fdc846137be565b90505f612fe882610a57565b90505f612ff588836137ec565b5f81815260058601602052604090209091508790613013828261510a565b509098975050505050505050565b60015f8051602061539e83398151915255565b5f8082516027146130575760405162461bcd60e51b815260040161055b90614f97565b5f805b60028110156130a65761306e816001614f70565b613079906008614c99565b61ffff1685828151811061308f5761308f614f83565b016020015160f81c901b919091179060010161305a565b5061ffff8116156130c95760405162461bcd60e51b815260040161055b90614fe0565b5f805b6004811015613124576130e0816003614f70565b6130eb906008614c99565b63ffffffff16866130fd836002614cd0565b8151811061310d5761310d614f83565b016020015160f81c901b91909117906001016130cc565b5063ffffffff811660021461314b5760405162461bcd60e51b815260040161055b90615023565b5f805b60208110156131a05761316281601f614f70565b61316d906008614c99565b87613179836006614cd0565b8151811061318957613189614f83565b016020015160f81c901b919091179060010161314e565b505f866026815181106131b5576131b5614f83565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146131f85760405162461bcd60e51b815260040161055b90614f97565b5f805b60028110156132475761320f816001614f70565b61321a906008614c99565b61ffff1685828151811061323057613230614f83565b016020015160f81c901b91909117906001016131fb565b5061ffff81161561326a5760405162461bcd60e51b815260040161055b90614fe0565b5f805b60048110156132c557613281816003614f70565b61328c906008614c99565b63ffffffff168661329e836002614cd0565b815181106132ae576132ae614f83565b016020015160f81c901b919091179060010161326d565b5063ffffffff81166004146132ec5760405162461bcd60e51b815260040161055b90615023565b5f805b60208110156133415761330381601f614f70565b61330e906008614c99565b8761331a836006614cd0565b8151811061332a5761332a614f83565b016020015160f81c901b91909117906001016132ef565b505f805b60088110156133a057613359816007614f70565b613364906008614c99565b6001600160401b031688613379836026614cd0565b8151811061338957613389614f83565b016020015160f81c901b9190911790600101613345565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061537e83398151915291429190158061349357506002830154815161348f916001600160401b031690614cd0565b8210155b156134b9576001600160401b0385166060820152818152604081015160208201526134d8565b84816060018181516134cb9190614cb0565b6001600160401b03169052505b60608101516134e890606461506a565b602082015160028501546001600160401b0392909216916135139190600160401b900460ff16614c99565b10156135775760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161055b565b83156135a057846001600160401b0316816040018181516135989190614cd0565b9052506135bf565b846001600160401b0316816040018181516135bb9190614f70565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661365057604051631afcd79f60e31b815260040160405180910390fd5b565b61365a613607565b61366381613d26565b611b78608082013560a083013561368060e0850160c086016149c6565b613691610100860160e087016150a4565b61ffff166136a761012087016101008801615160565b6136b961014088016101208901615180565b613d47565b6136c6613607565b5f8051602061531e8339815191526001600160a01b03821661373f5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161055b565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610beb91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f8b565b5f610a67825f8051602061531e833981519152546001600160a01b031690613fec565b611b788160016133ad565b5f5f8051602061537e8339815191524261380c60408601602087016149c6565b6001600160401b03161161387e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161055b565b61388e60408501602086016149c6565b6001600160401b03166138a46202a30042614cd0565b116139175760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161055b565b833561396f5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161055b565b83355f908152600982016020526040902054156139df5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161055b565b6139ec604085018561519b565b9050603014613a535760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161055b565b613a5c836137e1565b5f80613af66040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613aa191906149c6565b6001600160401b03168152602001613abc60408a018a61519b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061414e565b5f82815260078601602052604090209193509150613b148282615228565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b41908590600401614bbd565b6020604051808303815f875af1158015613b5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b819190614b50565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c0357613c03614a62565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cf891908e01908e016149c6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613d2e613607565b613d366144f3565b613d3e614503565b611b788161450b565b613d4f613607565b5f8051602061533e83398151915283613dbb5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161055b565b612710841115613ddd5760405162461bcd60e51b815260040161055b906150bf565b85871115613e455760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161055b565b5f8360ff1611613eb25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161055b565b600a60ff84161115613f245760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161055b565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613f9f6001600160a01b038416836146b8565b905080515f14158015613fc3575080806020019051810190613fc191906152e7565b155b15610beb57604051635274afe760e01b81526001600160a01b038416600482015260240161055b565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614032573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140569190614b50565b905061406d6001600160a01b0385163330866146c5565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156140b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d59190614b50565b905081811161413b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161055b565b6141458282614f70565b95945050505050565b5f60608260800151516030146141b85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161055b565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561422f576141ef816001614f70565b6141fa906008614c99565b5081515f9083908390811061421157614211614f83565b60200101906001600160f81b03191690815f1a9053506001016141db565b505f5b600481101561428d57614246816003614f70565b614251906008614c99565b505f8261425f836002614cd0565b8151811061426f5761426f614f83565b60200101906001600160f81b03191690815f1a905350600101614232565b505f5b60208110156142ea57845181602081106142ac576142ac614f83565b1a60f81b826142bc836006614cd0565b815181106142cc576142cc614f83565b60200101906001600160f81b03191690815f1a905350600101614290565b505f5b602081101561434a578460200151816020811061430c5761430c614f83565b1a60f81b8261431c836026614cd0565b8151811061432c5761432c614f83565b60200101906001600160f81b03191690815f1a9053506001016142ed565b505f5b60088110156143be57614361816007614f70565b61436c906008614c99565b60ff1685604001516001600160401b0316901c60f81b828260466143909190614cd0565b815181106143a0576143a0614f83565b60200101906001600160f81b03191690815f1a90535060010161434d565b505f5b603081101561442957846080015181815181106143e0576143e0614f83565b01602001516001600160f81b031916826143fb83604e614cd0565b8151811061440b5761440b614f83565b60200101906001600160f81b03191690815f1a9053506001016143c1565b505f5b600881101561449b57614440816007614f70565b61444b906008614c99565b60608601516001600160401b0390811691161c60f81b8261446d83607e614cd0565b8151811061447d5761447d614f83565b60200101906001600160f81b03191690815f1a90535060010161442c565b506002816040516144ac9190615302565b602060405180830381855afa1580156144c7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906144ea9190614b50565b94909350915050565b6144fb613607565b6136506146fe565b613650613607565b614513613607565b80355f8051602061537e83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461455f6080840160608501615160565b60ff1611156145cc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161055b565b5f6145dd6080840160608501615160565b60ff16116146455760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161055b565b6146556080830160608401615160565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561468660608301604084016149c6565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b60606111e583835f614706565b6040516001600160a01b038481166024830152838116604483015260648201839052610a519186918216906323b872dd9060840161378c565b613021613607565b60608147101561472b5760405163cd78605960e01b815230600482015260240161055b565b5f80856001600160a01b031684866040516147469190615302565b5f6040518083038185875af1925050503d805f8114614780576040519150601f19603f3d011682016040523d82523d5f602084013e614785565b606091505b5091509150611ae28683836060826147a5576147a0826147ec565b6111e5565b81511580156147bc57506001600160a01b0384163b155b156147e557604051639996b31560e01b81526001600160a01b038516600482015260240161055b565b50806111e5565b8051156147fc5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461482190614ce3565b5f825580601f10614830575050565b601f0160209004905f5260205f2090810190611b789190614890565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156148a4575f8155600101614891565b5090565b8015158114611b78575f80fd5b803563ffffffff811681146148c8575f80fd5b919050565b5f805f606084860312156148df575f80fd5b8335925060208401356148f1816148a8565b91506148ff604085016148b5565b90509250925092565b5f60208284031215614918575f80fd5b5035919050565b6001600160a01b0381168114611b78575f80fd5b5f80828403610160811215614946575f80fd5b61014080821215614955575f80fd5b84935083013590506149668161491f565b809150509250929050565b5f60208284031215614981575f80fd5b6111e5826148b5565b5f806040838503121561499b575f80fd5b6149a4836148b5565b946020939093013593505050565b6001600160401b0381168114611b78575f80fd5b5f602082840312156149d6575f80fd5b81356111e5816149b2565b5f80604083850312156149f2575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a14575f80fd5b84356001600160401b03811115614a29575f80fd5b850160608188031215614a3a575f80fd5b93506040601f1982011215614a4d575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614a9a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614ac260408401826001600160a01b03169052565b506060830151614add60608401826001600160401b03169052565b506080830151614af860808401826001600160401b03169052565b5060a0830151614b1360a08401826001600160401b03169052565b5060c0830151614b2e60c08401826001600160401b03169052565b5060e0830151614b4960e08401826001600160401b03169052565b5092915050565b5f60208284031215614b60575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614b4957614b49614b67565b5f5b83811015614bb5578181015183820152602001614b9d565b50505f910152565b602081525f8251806020840152614bdb816040850160208701614b9b565b601f01601f19169190910160400192915050565b5f82614c0957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a6757610a67614b67565b6001600160401b03818116838216019080821115614b4957614b49614b67565b80820180821115610a6757610a67614b67565b600181811c90821680614cf757607f821691505b602082108103614d1557634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614d7481614ce3565b806020870152604060018084165f8114614d955760018114614db157614dde565b60ff19851660408a0152604084151560051b8a01019550614dde565b895f5260205f205f5b85811015614dd55781548b8201860152908301908801614dba565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614e2257614e22614dec565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614e5057614e50614dec565b604052919050565b80516148c8816148a8565b5f8060408385031215614e74575f80fd5b82516001600160401b0380821115614e8a575f80fd5b9084019060608287031215614e9d575f80fd5b614ea5614e00565b82518152602080840151614eb88161491f565b82820152604084015183811115614ecd575f80fd5b80850194505087601f850112614ee1575f80fd5b835183811115614ef357614ef3614dec565b614f05601f8201601f19168301614e28565b93508084528882828701011115614f1a575f80fd5b614f2981838601848801614b9b565b50826040830152819550614f3e818801614e58565b9450505050509250929050565b5f6001600160401b03808316818103614f6657614f66614b67565b6001019392505050565b81810381811115610a6757610a67614b67565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461508d5761508d614b67565b505092915050565b61ffff81168114611b78575f80fd5b5f602082840312156150b4575f80fd5b81356111e581615095565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561511581615095565b61ffff8116905081548161ffff1982161783556020840135615136816149b2565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215615170575f80fd5b813560ff811681146111e5575f80fd5b5f60208284031215615190575f80fd5b81356111e58161491f565b5f808335601e198436030181126151b0575f80fd5b8301803591506001600160401b038211156151c9575f80fd5b6020019150368190038213156151dd575f80fd5b9250929050565b601f821115610beb57805f5260205f20601f840160051c810160208510156152095750805b601f840160051c820191505b8181101561165b575f8155600101615215565b81516001600160401b0381111561524157615241614dec565b6152558161524f8454614ce3565b846151e4565b602080601f831160018114615288575f84156152715750858301515b5f19600386901b1c1916600185901b1785556152df565b5f85815260208120601f198616915b828110156152b657888601518255948401946001909101908401615297565b50858210156152d357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156152f7575f80fd5b81516111e5816148a8565b5f8251615313818460208701614b9b565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161560c38038061560c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154bf8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a36600461494d565b61036a565b005b61015f61016f366004614988565b610894565b6101b2610182366004614988565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614988565b610a64565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149b3565b610a7a565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149f1565b610b59565b61015f61025a366004614a0a565b610bfd565b6101b261026d366004614a46565b610dcd565b6101f2610280366004614988565b610de6565b61015f61029336600461494d565b610dfa565b61015f6102a6366004614a0a565b611019565b6101b26102b9366004614a61565b611257565b6101b26102cc366004614a81565b61126a565b61015f6102df3660046149f1565b611296565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610320366004614988565b611453565b61015f610333366004614988565b6116d9565b6101cd601481565b61035361034e366004614988565b6117e8565b6040516101bc9190614af6565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615413833981519152949193919290829060ff1660048111156103d2576103d2614ae2565b60048111156103e3576103e3614ae2565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117e8565b90504260028351600481111561047757610477614ae2565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206154338339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206154338339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118c7565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614ae2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610774575f61065e8689611949565b6001600160401b03169050605060ff168460c001518461067e9190614be4565b6106889190614c04565b6001600160401b031661069c826064614c2f565b10156106ba5760405162461bcd60e51b81526004016104c090614c46565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561073e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107629190614c9b565b5f8b8152600989016020526040902055505b60028351600581111561078957610789614ae2565b0361079b5761079b8460600151611be5565b5f84606001518460a001516107b09190614be4565b90506107bc8682611bf2565b5f6005600160991b0163ee5b48eb6107d5898686611c3a565b6040518263ffffffff1660e01b81526004016107f19190614cd4565b6020604051808303815f875af115801561080d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108319190614c9b565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061549383398151915260205260408082208151610100810190925280545f8051602061545383398151915293929190829060ff1660058111156108e2576108e2614ae2565b60058111156108f3576108f3614ae2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097857610978614ae2565b146109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a028584608001515f611c3a565b6040518263ffffffff1660e01b8152600401610a1e9190614cd4565b6020604051808303815f875af1158015610a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190614c9b565b50505050565b5f610a7464e8d4a5100083614d06565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac3575080546001600160401b03808416911610155b15610ae15760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0c8484611e57565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610b6382611e75565b6040808201516001600160a01b0381165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a60205291909120549192505f8051602061541383398151915291610bbc91906121e8565b604080830180516001600160a01b03165f908152600a84016020529182209190915560608301519051610bf8916001600160401b03169061225e565b505050565b5f805160206154138339815191525f610c1584612281565b90505f80610c268360400151612462565b50915091505f610c35836117e8565b9050816001600160401b031681608001516001600160401b03161015610c6d5760405162461bcd60e51b81526004016104c090614d25565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cb25760405162461bcd60e51b81526004016104c090614d67565b60015f87815260068701602052604090205460ff166004811115610cd857610cd8614ae2565b14610d415760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a746001600160401b03831664e8d4a51000614c2f565b5f610df0826117e8565b60a0015192915050565b5f805160206154138339815191525f610e128561269d565b5f86815260058401602052604090205460c0820151919250610e4491620100009091046001600160401b031690614db0565b6001600160401b03168160e001516001600160401b03161015610ec55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315611012575f610ed68685611949565b9050605060ff168260c001518360e00151610ef19190614be4565b610efb9190614c04565b6001600160401b0316610f0f826064614c04565b6001600160401b03161015610f365760405162461bcd60e51b81526004016104c090614c46565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610fba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fde9190614c9b565b6040808401516001600160a01b03165f908152600a8601602052908120805490919061100b908490614dd0565b9091555050505b5050505050565b5f805160206154138339815191525f61103184612281565b90505f806110428360400151612462565b50915091505f611051836117e8565b9050816001600160401b031681608001516001600160401b031610156110895760405162461bcd60e51b81526004016104c090614d25565b5f8681526006860160205260409020600301546001600160401b03808416911611156110c75760405162461bcd60e51b81526004016104c090614d67565b60035f87815260068701602052604090205460ff1660048111156110ed576110ed614ae2565b146111415760405162461bcd60e51b815260206004820152603160248201525f805160206154338339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526111e69161225e565b6112078160200151876009015f8a81526020019081526020015f20546121e8565b5f878152600987016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f611263833384612a46565b9392505050565b5f611273612e44565b61127e848484612e7b565b905061126360015f8051602061547383398151915255565b5f805160206154538339815191525f6112ae83612281565b90505f806112bf83604001516130b4565b91509150806113215760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461133b90614de3565b905011801561136d575060015f83815260088601602052604090205460ff16600581111561136b5761136b614ae2565b145b6113895760405162461bcd60e51b81526004016104c090614e1b565b5f82815260078501602052604081206113a191614895565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061541383398151915293929190829060ff1660048111156114b4576114b4614ae2565b60048111156114c5576114c5614ae2565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561154c5761154c614ae2565b148061156a575060038151600481111561156857611568614ae2565b145b6115be5760405162461bcd60e51b815260206004820152603260248201525f80516020615433833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115cc82604001516117e8565b905080608001516001600160401b03165f036116505760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb61167d846040015184608001518560a00151611c3a565b6040518263ffffffff1660e01b81526004016116999190614cd4565b6020604051808303815f875af11580156116b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110129190614c9b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061545383398151915292919061172190614de3565b9050118015611753575060015f83815260088301602052604090205460ff16600581111561175157611751614ae2565b145b61176f5760405162461bcd60e51b81526004016104c090614e1b565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117a89190600401614e62565b6020604051808303815f875af11580156117c4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf89190614c9b565b6117f06148cc565b5f8281525f805160206154938339815191526020526040908190208151610100810190925280545f80516020615453833981519152929190829060ff16600581111561183e5761183e614ae2565b600581111561184f5761184f614ae2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154938339815191526020526040812060030180545f80516020615453833981519152916001600160401b03909116908361190a83614eec565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611994573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119bb9190810190614f88565b9150915080611a1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a859190614c9b565b825114611ae95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b5f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b6e8460400151613255565b91509150818714611bdb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bef815f61342d565b50565b5f9182525f80516020615493833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cb357611c73816001615070565b611c7e906008614c2f565b5081515f90839083908110611c9557611c95615083565b60200101906001600160f81b03191690815f1a905350600101611c5f565b505f5b6004811015611d1657611cca816003615070565b611cd5906008614c2f565b6001901c60f81b82611ce8836002614dd0565b81518110611cf857611cf8615083565b60200101906001600160f81b03191690815f1a905350600101611cb6565b505f5b6020811015611d7857611d2d81601f615070565b611d38906008614c2f565b86901c60f81b82611d4a836006614dd0565b81518110611d5a57611d5a615083565b60200101906001600160f81b03191690815f1a905350600101611d19565b505f5b6008811015611de357611d8f816007615070565b611d9a906008614c2f565b6001600160401b038616901c60f81b82611db5836026614dd0565b81518110611dc557611dc5615083565b60200101906001600160f81b03191690815f1a905350600101611d7b565b505f5b6008811015611e4e57611dfa816007615070565b611e05906008614c2f565b6001600160401b038516901c60f81b82611e2083602e614dd0565b81518110611e3057611e30615083565b60200101906001600160f81b03191690815f1a905350600101611de6565b50949350505050565b611e5f613687565b611e68826136d2565b611e718161373e565b5050565b611e7d6148cc565b5f805160206154538339815191525f611e9584612281565b90505f80611ea683604001516130b4565b915091508015611f0b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f3d57611f3d614ae2565b6005811115611f4e57611f4e614ae2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fd557611fd5614ae2565b1480611ff35750600182516005811115611ff157611ff1614ae2565b145b6120525760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561206757612067614ae2565b0361207457506004612078565b5060055b6020808301515f908152600988019091526040812055818160058111156120a1576120a1614ae2565b908160058111156120b4576120b4614ae2565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120e8576120e8614ae2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121b3576121b3614ae2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153f383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612243575f80fd5b505af1158015612255573d5f803e3d5ffd5b50505050505050565b5f805160206153f383398151915254611e71906001600160a01b031682846137df565b60408051606080820183525f8083526020830181905292820152905f805160206154538339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156122f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261231d9190810190614f88565b91509150806123845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123e75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b03161561245a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124865760405162461bcd60e51b81526004016104c090615097565b5f805b60028110156124d55761249d816001615070565b6124a8906008614c2f565b61ffff168682815181106124be576124be615083565b016020015160f81c901b9190911790600101612489565b5061ffff8116156124f85760405162461bcd60e51b81526004016104c0906150e0565b5f805b60048110156125535761250f816003615070565b61251a906008614c2f565b63ffffffff168761252c836002614dd0565b8151811061253c5761253c615083565b016020015160f81c901b91909117906001016124fb565b5063ffffffff811660031461257a5760405162461bcd60e51b81526004016104c090615123565b5f805b60208110156125cf5761259181601f615070565b61259c906008614c2f565b886125a8836006614dd0565b815181106125b8576125b8615083565b016020015160f81c901b919091179060010161257d565b505f805b600881101561262e576125e7816007615070565b6125f2906008614c2f565b6001600160401b031689612607836026614dd0565b8151811061261757612617615083565b016020015160f81c901b91909117906001016125d3565b505f805b600881101561268d57612646816007615070565b612651906008614c2f565b6001600160401b03168a61266683602e614dd0565b8151811061267657612676615083565b016020015160f81c901b9190911790600101612632565b5091989097509095509350505050565b6126a56148cc565b5f8281525f8051602061549383398151915260205260408082208151610100810190925280545f8051602061545383398151915293929190829060ff1660058111156126f3576126f3614ae2565b600581111561270457612704614ae2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561278c5761278c614ae2565b146127e85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b0316146128625760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61286f8160a00151611be5565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128b3576128b3614ae2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61297f85612979816118c7565b5f611c3a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129ae908590600401614cd4565b6020604051808303815f875af11580156129ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ee9190614c9b565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a4f612e44565b5f805160206154138339815191525f612a6a6101ed8561383e565b90505f612a76876117e8565b9050600281516005811115612a8d57612a8d614ae2565b14612aec5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612af582613861565b5f828260a00151612b069190614db0565b60048501546060840151919250612b28916001600160401b0390911690614c04565b6001600160401b0316816001600160401b03161115612ba75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bb18882611bf2565b5f612bbb896118c7565b90505f8982604051602001612be792919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c218d8688611c3a565b6040518263ffffffff1660e01b8152600401612c3d9190614cd4565b6020604051808303815f875af1158015612c59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c7d9190614c9b565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d0557612d05614ae2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126360015f8051602061547383398151915255565b5f80516020615473833981519152805460011901612e7557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615413833981519152906001600160401b0316612ec76040860160208701614a46565b6001600160401b03161015612f365760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f486020860186615179565b61ffff1610158015612f6c5750612710612f656020860186615179565b61ffff1611155b612f885760405162461bcd60e51b81526004016104c090615194565b8054831015612feb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b80600101548311156130525760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61305c8461383e565b90505f61306882610a64565b90505f613075888361386c565b5f8181526005860160205260409020909150879061309382826151df565b509098975050505050505050565b60015f8051602061547383398151915255565b5f8082516027146130d75760405162461bcd60e51b81526004016104c090615097565b5f805b6002811015613126576130ee816001615070565b6130f9906008614c2f565b61ffff1685828151811061310f5761310f615083565b016020015160f81c901b91909117906001016130da565b5061ffff8116156131495760405162461bcd60e51b81526004016104c0906150e0565b5f805b60048110156131a457613160816003615070565b61316b906008614c2f565b63ffffffff168661317d836002614dd0565b8151811061318d5761318d615083565b016020015160f81c901b919091179060010161314c565b5063ffffffff81166002146131cb5760405162461bcd60e51b81526004016104c090615123565b5f805b6020811015613220576131e281601f615070565b6131ed906008614c2f565b876131f9836006614dd0565b8151811061320957613209615083565b016020015160f81c901b91909117906001016131ce565b505f8660268151811061323557613235615083565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132785760405162461bcd60e51b81526004016104c090615097565b5f805b60028110156132c75761328f816001615070565b61329a906008614c2f565b61ffff168582815181106132b0576132b0615083565b016020015160f81c901b919091179060010161327b565b5061ffff8116156132ea5760405162461bcd60e51b81526004016104c0906150e0565b5f805b600481101561334557613301816003615070565b61330c906008614c2f565b63ffffffff168661331e836002614dd0565b8151811061332e5761332e615083565b016020015160f81c901b91909117906001016132ed565b5063ffffffff811660041461336c5760405162461bcd60e51b81526004016104c090615123565b5f805b60208110156133c15761338381601f615070565b61338e906008614c2f565b8761339a836006614dd0565b815181106133aa576133aa615083565b016020015160f81c901b919091179060010161336f565b505f805b6008811015613420576133d9816007615070565b6133e4906008614c2f565b6001600160401b0316886133f9836026614dd0565b8151811061340957613409615083565b016020015160f81c901b91909117906001016133c5565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061545383398151915291429190158061351357506002830154815161350f916001600160401b031690614dd0565b8210155b15613539576001600160401b038516606082015281815260408101516020820152613558565b848160600181815161354b9190614db0565b6001600160401b03169052505b6060810151613568906064614c04565b602082015160028501546001600160401b0392909216916135939190600160401b900460ff16614c2f565b10156135f75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362057846001600160401b0316816040018181516136189190614dd0565b90525061363f565b846001600160401b03168160400181815161363b9190615070565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136d057604051631afcd79f60e31b815260040160405180910390fd5b565b6136da613687565b6136e381613da6565b611bef608082013560a083013561370060e0850160c08601614a46565b613711610100860160e08701615179565b61ffff1661372761012087016101008801615235565b61373961014088016101208901615255565b613dc7565b613746613687565b5f805160206153f38339815191526001600160a01b0382166137bf5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bf891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061400b565b5f610a74825f805160206153f3833981519152546001600160a01b03169061406c565b611bef81600161342d565b5f5f805160206154538339815191524261388c6040860160208701614a46565b6001600160401b0316116138fe5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b61390e6040850160208601614a46565b6001600160401b03166139246202a30042614dd0565b116139975760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139ef5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a5f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a6c6040850185615270565b9050603014613ad35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613adc83613861565b5f80613b766040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b219190614a46565b6001600160401b03168152602001613b3c60408a018a615270565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141ce565b5f82815260078601602052604090209193509150613b9482826152fd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bc1908590600401614cd4565b6020604051808303815f875af1158015613bdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c019190614c9b565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8357613c83614ae2565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d7891908e01908e01614a46565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613dae613687565b613db6614573565b613dbe614583565b611bef8161458b565b613dcf613687565b5f8051602061541383398151915283613e3b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e5d5760405162461bcd60e51b81526004016104c090615194565b85871115613ec55760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f325760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fa45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61401f6001600160a01b03841683614738565b905080515f1415801561404357508080602001905181019061404191906153bc565b155b15610bf857604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d69190614c9b565b90506140ed6001600160a01b038516333086614745565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614131573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141559190614c9b565b90508181116141bb5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141c58282615070565b95945050505050565b5f60608260800151516030146142385760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142af5761426f816001615070565b61427a906008614c2f565b5081515f9083908390811061429157614291615083565b60200101906001600160f81b03191690815f1a90535060010161425b565b505f5b600481101561430d576142c6816003615070565b6142d1906008614c2f565b505f826142df836002614dd0565b815181106142ef576142ef615083565b60200101906001600160f81b03191690815f1a9053506001016142b2565b505f5b602081101561436a578451816020811061432c5761432c615083565b1a60f81b8261433c836006614dd0565b8151811061434c5761434c615083565b60200101906001600160f81b03191690815f1a905350600101614310565b505f5b60208110156143ca578460200151816020811061438c5761438c615083565b1a60f81b8261439c836026614dd0565b815181106143ac576143ac615083565b60200101906001600160f81b03191690815f1a90535060010161436d565b505f5b600881101561443e576143e1816007615070565b6143ec906008614c2f565b60ff1685604001516001600160401b0316901c60f81b828260466144109190614dd0565b8151811061442057614420615083565b60200101906001600160f81b03191690815f1a9053506001016143cd565b505f5b60308110156144a9578460800151818151811061446057614460615083565b01602001516001600160f81b0319168261447b83604e614dd0565b8151811061448b5761448b615083565b60200101906001600160f81b03191690815f1a905350600101614441565b505f5b600881101561451b576144c0816007615070565b6144cb906008614c2f565b60608601516001600160401b0390811691161c60f81b826144ed83607e614dd0565b815181106144fd576144fd615083565b60200101906001600160f81b03191690815f1a9053506001016144ac565b5060028160405161452c91906153d7565b602060405180830381855afa158015614547573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061456a9190614c9b565b94909350915050565b61457b613687565b6136d061477e565b6136d0613687565b614593613687565b80355f8051602061545383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145df6080840160608501615235565b60ff16111561464c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61465d6080840160608501615235565b60ff16116146c55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146d56080830160608401615235565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147066060830160408401614a46565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126383835f614786565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5e9186918216906323b872dd9060840161380c565b6130a1613687565b6060814710156147ab5760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147c691906153d7565b5f6040518083038185875af1925050503d805f8114614800576040519150601f19603f3d011682016040523d82523d5f602084013e614805565b606091505b5091509150611bdb868383606082614825576148208261486c565b611263565b815115801561483c57506001600160a01b0384163b155b1561486557604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b5080611263565b80511561487c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148a190614de3565b5f825580601f106148b0575050565b601f0160209004905f5260205f2090810190611bef9190614910565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614924575f8155600101614911565b5090565b8015158114611bef575f80fd5b803563ffffffff81168114614948575f80fd5b919050565b5f805f6060848603121561495f575f80fd5b83359250602084013561497181614928565b915061497f60408501614935565b90509250925092565b5f60208284031215614998575f80fd5b5035919050565b6001600160a01b0381168114611bef575f80fd5b5f808284036101608112156149c6575f80fd5b610140808212156149d5575f80fd5b84935083013590506149e68161499f565b809150509250929050565b5f60208284031215614a01575f80fd5b61126382614935565b5f8060408385031215614a1b575f80fd5b614a2483614935565b946020939093013593505050565b6001600160401b0381168114611bef575f80fd5b5f60208284031215614a56575f80fd5b813561126381614a32565b5f8060408385031215614a72575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a94575f80fd5b84356001600160401b03811115614aa9575f80fd5b850160608188031215614aba575f80fd5b93506040601f1982011215614acd575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b1a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4260408401826001600160a01b03169052565b506060830151614b5d60608401826001600160401b03169052565b506080830151614b7860808401826001600160401b03169052565b5060a0830151614b9360a08401826001600160401b03169052565b5060c0830151614bae60c08401826001600160401b03169052565b5060e0830151614bc960e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bc957614bc9614bd0565b6001600160401b03818116838216028082169190828114614c2757614c27614bd0565b505092915050565b8082028115828204841417610a7457610a74614bd0565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f60208284031215614cab575f80fd5b5051919050565b5f5b83811015614ccc578181015183820152602001614cb4565b50505f910152565b602081525f8251806020840152614cf2816040850160208701614cb2565b601f01601f19169190910160400192915050565b5f82614d2057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bc957614bc9614bd0565b80820180821115610a7457610a74614bd0565b600181811c90821680614df757607f821691505b602082108103614e1557634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e7481614de3565b806020870152604060018084165f8114614e955760018114614eb157614ede565b60ff19851660408a0152604084151560051b8a01019550614ede565b895f5260205f205f5b85811015614ed55781548b8201860152908301908801614eba565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614f0757614f07614bd0565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f4757614f47614f11565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f7557614f75614f11565b604052919050565b805161494881614928565b5f8060408385031215614f99575f80fd5b82516001600160401b0380821115614faf575f80fd5b9084019060608287031215614fc2575f80fd5b614fca614f25565b82518152602080840151614fdd8161499f565b82820152604084015183811115614ff2575f80fd5b80850194505087601f850112615006575f80fd5b83518381111561501857615018614f11565b61502a601f8201601f19168301614f4d565b9350808452888282870101111561503f575f80fd5b61504e81838601848801614cb2565b50826040830152819550615063818801614f7d565b9450505050509250929050565b81810381811115610a7457610a74614bd0565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bef575f80fd5b5f60208284031215615189575f80fd5b81356112638161516a565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151ea8161516a565b61ffff8116905081548161ffff198216178355602084013561520b81614a32565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215615245575f80fd5b813560ff81168114611263575f80fd5b5f60208284031215615265575f80fd5b81356112638161499f565b5f808335601e19843603018112615285575f80fd5b8301803591506001600160401b0382111561529e575f80fd5b6020019150368190038213156152b2575f80fd5b9250929050565b601f821115610bf857805f5260205f20601f840160051c810160208510156152de5750805b601f840160051c820191505b81811015611012575f81556001016152ea565b81516001600160401b0381111561531657615316614f11565b61532a816153248454614de3565b846152b9565b602080601f83116001811461535d575f84156153465750858301515b5f19600386901b1c1916600185901b1785556153b4565b5f85815260208120601f198616915b8281101561538b5788860151825594840194600190910190840161536c565b50858210156153a857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156153cc575f80fd5b815161126381614928565b5f82516153e8818460208701614cb2565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -370,6 +370,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMS return _ERC20TokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_ERC20TokenStakingManager.CallOpts) } +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ERC20TokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ERC20TokenStakingManager.CallOpts) +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ERC20TokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ERC20TokenStakingManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) diff --git a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go index a464de3c8..a1f6b6cc3 100644 --- a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go +++ b/abi-bindings/go/staking/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\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"uptime\",\"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: "0x60a0604052348015600e575f80fd5b50604051610243380380610243833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b6080516101c06100835f395f81816079015260ca01526101c05ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780636588aa7f14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f366004610125565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6103e86301e133808567ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16886100fe919061016b565b610108919061016b565b6101129190610194565b61011c9190610194565b95945050505050565b5f805f8060808587031215610138575f80fd5b84359350602085013567ffffffffffffffff81168114610156575f80fd5b93969395505050506040820135916060013590565b808202811582820484141761018e57634e487b7160e01b5f52601160045260245ffd5b92915050565b5f826101ae57634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", + 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\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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: "0x60a0604052348015600e575f80fd5b5060405161029d38038061029d833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b60805161021a6100835f395f81816079015260d3015261021a5ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780639d4ba9db14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f36600461014b565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6127106301e133806100c787876101a9565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168961010791906101d1565b61011191906101d1565b61011b91906101ee565b61012591906101ee565b9695505050505050565b803567ffffffffffffffff81168114610146575f80fd5b919050565b5f805f805f60a0868803121561015f575f80fd5b8535945061016f6020870161012f565b935061017d6040870161012f565b94979396509394606081013594506080013592915050565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156101ca576101ca610195565b5092915050565b80820281158282048414176101e8576101e8610195565b92915050565b5f8261020857634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", } // ExampleRewardCalculatorABI is the input ABI used to generate the binding from. @@ -233,12 +233,12 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINY return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) } -// CalculateReward is a free data retrieval call binding the contract method 0x6588aa7f. +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 uptime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, uptime uint64, arg2 *big.Int, arg3 *big.Int) (*big.Int, error) { +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, uptime, arg2, arg3) + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, startTime, endTime, arg3, arg4) if err != nil { return *new(*big.Int), err @@ -250,18 +250,18 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(o } -// CalculateReward is a free data retrieval call binding the contract method 0x6588aa7f. +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 uptime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, uptime uint64, arg2 *big.Int, arg3 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, uptime, arg2, arg3) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) } -// CalculateReward is a free data retrieval call binding the contract method 0x6588aa7f. +// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 uptime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, uptime uint64, arg2 *big.Int, arg3 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, uptime, arg2, arg3) +// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { + return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) } // RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index a6b88d42f..5f9e160de 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -75,8 +75,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161510638038061510683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614fb98061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f36600461452c565b61043b565b005b348015610161575f80fd5b50610154610170366004614567565b61096b565b348015610180575f80fd5b506101bf61018f366004614567565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b5061015461021236600461457e565b610b3b565b348015610222575f80fd5b50610236610231366004614567565b610c18565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b50610154610290366004614595565b610c2e565b3480156102a0575f80fd5b506101546102af3660046145ae565b610cb1565b3480156102bf575f80fd5b506101bf6102ce3660046145ea565b610e81565b3480156102de575f80fd5b506102366102ed366004614567565b610e9a565b3480156102fd575f80fd5b5061015461030c36600461452c565b610eae565b6101bf61031f366004614605565b61105c565b34801561032f575f80fd5b5061015461033e3660046145ae565b611088565b34801561034e575f80fd5b5061015461035d366004614595565b6112a5565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae366004614567565b611462565b3480156103be575f80fd5b506101546103cd366004614567565b6116ef565b6101bf6103e0366004614567565b6117fe565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b50610418610413366004614567565b61180a565b6040516101c99190614672565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f0d833981519152949193919290829060ff1660048111156104a3576104a361465e565b60048111156104b4576104b461465e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f851561053a5761053783866118e9565b90505b6004848101546060840151604051636588aa7f60e01b81526001600160401b0391821693810193909352831660248301525f604483018190526064830152600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa1580156105ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d1919061474c565b5f8881526009860160205260409020556002825160048111156105f6576105f661465e565b146106485760405162461bcd60e51b815260206004820152602a60248201525f80516020614f2d8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106ad5760405162461bcd60e51b815260206004820152603360248201525f80516020614f2d8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161063f565b5f6106b784611b85565b600384526001600160401b0342811660a0860152811660e08501525f8981526006870160205260409020845181549293508592829060ff191660018360048111156107045761070461465e565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107d68561180a565b905083606001516001600160401b03168160a001516001600160401b03161161084d5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161063f565b6002815160058111156108625761086261465e565b03610874576108748460600151611c07565b5f84606001518260a001516108899190614777565b90506108958682611c14565b5f6005600160991b0163ee5b48eb6108ae898786611c5c565b6040518263ffffffff1660e01b81526004016108ca91906147b9565b6020604051808303815f875af11580156108e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061090a919061474c565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614f8d83398151915260205260408082208151610100810190925280545f80516020614f4d83398151915293929190829060ff1660058111156109b9576109b961465e565b60058111156109ca576109ca61465e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a4f57610a4f61465e565b14610ab45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161063f565b6005600160991b016001600160a01b031663ee5b48eb610ad98584608001515f611c5c565b6040518263ffffffff1660e01b8152600401610af591906147b9565b6020604051808303815f875af1158015610b11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b35919061474c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b84575080546001600160401b03808416911610155b15610ba25760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610bcc83611e7b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c2864e8d4a51000836147eb565b92915050565b5f610c3882611e8c565b604080820180516001600160a01b039081165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020528251909116815291822091909155606082015190519192505f80516020614f0d83398151915291610cac916001600160401b031690612203565b505050565b5f80516020614f0d8339815191525f610cc984612216565b90505f80610cda83604001516123f7565b50915091505f610ce98361180a565b9050816001600160401b031681608001516001600160401b03161015610d215760405162461bcd60e51b815260040161063f9061480a565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d665760405162461bcd60e51b815260040161063f9061484c565b60015f87815260068701602052604090205460ff166004811115610d8c57610d8c61465e565b14610df55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161063f565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c286001600160401b03831664e8d4a51000614895565b5f610ea48261180a565b60a0015192915050565b5f80516020614f0d8339815191525f610ec68561180a565b5f86815260058401602052604090205460c0820151919250610ef891620100009091046001600160401b0316906148ac565b6001600160401b0316421015610f6c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161063f565b5f8415610f8057610f7d86856118e9565b90505b60048381015460a0840151604051636588aa7f60e01b81526001600160401b0391821693810193909352831660248301525f604483018190526064830152600160401b90046001600160a01b031690636588aa7f90608401602060405180830381865afa158015610ff3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611017919061474c565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110449084906148cc565b90915550611053905086612632565b50505050505050565b5f6110656129db565b611070838334612a12565b9050610c2860015f80516020614f6d83398151915255565b5f80516020614f0d8339815191525f6110a084612216565b90505f806110b183604001516123f7565b50915091505f6110c08361180a565b9050816001600160401b031681608001516001600160401b031610156110f85760405162461bcd60e51b815260040161063f9061480a565b5f8681526006860160205260409020600301546001600160401b03808416911611156111365760405162461bcd60e51b815260040161063f9061484c565b60035f87815260068701602052604090205460ff16600481111561115c5761115c61465e565b146111b05760405162461bcd60e51b815260206004820152603160248201525f80516020614f2d8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161063f565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261125591612203565b5f878152600987016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f80516020614f4d8339815191525f6112bd83612216565b90505f806112ce8360400151612c40565b91509150806113305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161063f565b5f8281526007850160205260408120805461134a906148df565b905011801561137c575060015f83815260088601602052604090205460ff16600581111561137a5761137a61465e565b145b6113985760405162461bcd60e51b815260040161063f90614911565b5f82815260078501602052604081206113b091614474565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f0d83398151915293929190829060ff1660048111156114c3576114c361465e565b60048111156114d4576114d461465e565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561155b5761155b61465e565b148061157957506003815160048111156115775761157761465e565b145b6115cd5760405162461bcd60e51b815260206004820152603260248201525f80516020614f2d833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161063f565b5f6115db826040015161180a565b905080608001516001600160401b03165f0361165f5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161063f565b6005600160991b016001600160a01b031663ee5b48eb61168c846040015184608001518560a00151611c5c565b6040518263ffffffff1660e01b81526004016116a891906147b9565b6020604051808303815f875af11580156116c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e8919061474c565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614f4d833981519152929190611737906148df565b9050118015611769575060015f83815260088301602052604090205460ff1660058111156117675761176761465e565b145b6117855760405162461bcd60e51b815260040161063f90614911565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117be9190600401614958565b6020604051808303815f875af11580156117da573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cac919061474c565b5f610c28823334612de1565b6118126144ab565b5f8281525f80516020614f8d8339815191526020526040908190208151610100810190925280545f80516020614f4d833981519152929190829060ff1660058111156118605761186061465e565b60058111156118715761187161465e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611934573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261195b9190810190614a6d565b91509150806119be5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161063f565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a25919061474c565b825114611a895760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161063f565b60208201516001600160a01b031615611aff5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161063f565b5f80611b0e84604001516131dc565b91509150818714611b7b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161063f565b9695505050505050565b5f8181525f80516020614f8d8339815191526020526040812060030180545f80516020614f4d833981519152916001600160401b039091169083611bc883614b55565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611c11815f6133b4565b50565b5f9182525f80516020614f8d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cd557611c95816001614b7a565b611ca0906008614895565b5081515f90839083908110611cb757611cb7614b8d565b60200101906001600160f81b03191690815f1a905350600101611c81565b505f5b6004811015611d3857611cec816003614b7a565b611cf7906008614895565b6001901c60f81b82611d0a8360026148cc565b81518110611d1a57611d1a614b8d565b60200101906001600160f81b03191690815f1a905350600101611cd8565b505f5b6020811015611d9a57611d4f81601f614b7a565b611d5a906008614895565b86901c60f81b82611d6c8360066148cc565b81518110611d7c57611d7c614b8d565b60200101906001600160f81b03191690815f1a905350600101611d3b565b505f5b6008811015611e0557611db1816007614b7a565b611dbc906008614895565b6001600160401b038616901c60f81b82611dd78360266148cc565b81518110611de757611de7614b8d565b60200101906001600160f81b03191690815f1a905350600101611d9d565b505f5b6008811015611e7057611e1c816007614b7a565b611e27906008614895565b6001600160401b038516901c60f81b82611e4283602e6148cc565b81518110611e5257611e52614b8d565b60200101906001600160f81b03191690815f1a905350600101611e08565b5090505b9392505050565b611e8361360e565b611c1181613659565b611e946144ab565b5f80516020614f4d8339815191525f611eac84612216565b90505f80611ebd8360400151612c40565b915091508015611f225760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161063f565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f5457611f5461465e565b6005811115611f6557611f6561465e565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fec57611fec61465e565b148061200a57506001825160058111156120085761200861465e565b145b6120695760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161063f565b60038251600581111561207e5761207e61465e565b0361208b5750600461208f565b5060055b6020808301515f908152600988019091526040812055818160058111156120b8576120b861465e565b908160058111156120cb576120cb61465e565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120ff576120ff61465e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121ca576121ca61465e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6121ff6001600160a01b038216836136c5565b60408051606080820183525f8083526020830181905292820152905f80516020614f4d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561228b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b29190810190614a6d565b91509150806123195760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161063f565b825482511461237c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161063f565b60208201516001600160a01b0316156123ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161063f565b509392505050565b5f805f835160361461241b5760405162461bcd60e51b815260040161063f90614ba1565b5f805b600281101561246a57612432816001614b7a565b61243d906008614895565b61ffff1686828151811061245357612453614b8d565b016020015160f81c901b919091179060010161241e565b5061ffff81161561248d5760405162461bcd60e51b815260040161063f90614bea565b5f805b60048110156124e8576124a4816003614b7a565b6124af906008614895565b63ffffffff16876124c18360026148cc565b815181106124d1576124d1614b8d565b016020015160f81c901b9190911790600101612490565b5063ffffffff811660031461250f5760405162461bcd60e51b815260040161063f90614c2d565b5f805b60208110156125645761252681601f614b7a565b612531906008614895565b8861253d8360066148cc565b8151811061254d5761254d614b8d565b016020015160f81c901b9190911790600101612512565b505f805b60088110156125c35761257c816007614b7a565b612587906008614895565b6001600160401b03168961259c8360266148cc565b815181106125ac576125ac614b8d565b016020015160f81c901b9190911790600101612568565b505f805b6008811015612622576125db816007614b7a565b6125e6906008614895565b6001600160401b03168a6125fb83602e6148cc565b8151811061260b5761260b614b8d565b016020015160f81c901b91909117906001016125c7565b5091989097509095509350505050565b61263a6144ab565b5f8281525f80516020614f8d83398151915260205260408082208151610100810190925280545f80516020614f4d83398151915293929190829060ff1660058111156126885761268861465e565b60058111156126995761269961465e565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127215761272161465e565b1461277d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161063f565b60408101516001600160a01b0316336001600160a01b0316146127f75760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b606482015260840161063f565b6128048160a00151611c07565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128485761284861465e565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129148561290e81611b85565b5f611c5c565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129439085906004016147b9565b6020604051808303815f875af115801561295f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612983919061474c565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614f6d833981519152805460011901612a0c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f0d833981519152906001600160401b0316612a5e60408601602087016145ea565b6001600160401b03161015612acd5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161063f565b6003810154612adf6020860186614c83565b61ffff1610158015612b035750612710612afc6020860186614c83565b61ffff1611155b612b1f5760405162461bcd60e51b815260040161063f90614c9e565b8054831015612b825760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161063f565b8060010154831115612be95760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161063f565b825f612bf482610c18565b90505f612c018883613758565b5f81815260058601602052604090209091508790612c1f8282614ce9565b509098975050505050505050565b60015f80516020614f6d83398151915255565b5f808251602714612c635760405162461bcd60e51b815260040161063f90614ba1565b5f805b6002811015612cb257612c7a816001614b7a565b612c85906008614895565b61ffff16858281518110612c9b57612c9b614b8d565b016020015160f81c901b9190911790600101612c66565b5061ffff811615612cd55760405162461bcd60e51b815260040161063f90614bea565b5f805b6004811015612d3057612cec816003614b7a565b612cf7906008614895565b63ffffffff1686612d098360026148cc565b81518110612d1957612d19614b8d565b016020015160f81c901b9190911790600101612cd8565b5063ffffffff8116600214612d575760405162461bcd60e51b815260040161063f90614c2d565b5f805b6020811015612dac57612d6e81601f614b7a565b612d79906008614895565b87612d858360066148cc565b81518110612d9557612d95614b8d565b016020015160f81c901b9190911790600101612d5a565b505f86602681518110612dc157612dc1614b8d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612dea6129db565b5f80516020614f0d8339815191525f612e0284610c18565b90505f612e0e8761180a565b9050600281516005811115612e2557612e2561465e565b14612e845760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161063f565b612e8d82613c92565b5f828260a00151612e9e91906148ac565b60048501546060840151919250612ec0916001600160401b0390911690614d3f565b6001600160401b0316816001600160401b03161115612f3f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161063f565b612f498882611c14565b5f612f5389611b85565b90505f8982604051602001612f7f92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612fb98d8688611c5c565b6040518263ffffffff1660e01b8152600401612fd591906147b9565b6020604051808303815f875af1158015612ff1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613015919061474c565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561309d5761309d61465e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611e7460015f80516020614f6d83398151915255565b5f808251602e146131ff5760405162461bcd60e51b815260040161063f90614ba1565b5f805b600281101561324e57613216816001614b7a565b613221906008614895565b61ffff1685828151811061323757613237614b8d565b016020015160f81c901b9190911790600101613202565b5061ffff8116156132715760405162461bcd60e51b815260040161063f90614bea565b5f805b60048110156132cc57613288816003614b7a565b613293906008614895565b63ffffffff16866132a58360026148cc565b815181106132b5576132b5614b8d565b016020015160f81c901b9190911790600101613274565b5063ffffffff81166004146132f35760405162461bcd60e51b815260040161063f90614c2d565b5f805b60208110156133485761330a81601f614b7a565b613315906008614895565b876133218360066148cc565b8151811061333157613331614b8d565b016020015160f81c901b91909117906001016132f6565b505f805b60088110156133a757613360816007614b7a565b61336b906008614895565b6001600160401b0316886133808360266148cc565b8151811061339057613390614b8d565b016020015160f81c901b919091179060010161334c565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614f4d83398151915291429190158061349a575060028301548151613496916001600160401b0316906148cc565b8210155b156134c0576001600160401b0385166060820152818152604081015160208201526134df565b84816060018181516134d291906148ac565b6001600160401b03169052505b60608101516134ef906064614d3f565b602082015160028501546001600160401b03929092169161351a9190600160401b900460ff16614895565b101561357e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161063f565b83156135a757846001600160401b03168160400181815161359f91906148cc565b9052506135c6565b846001600160401b0316816040018181516135c29190614b7a565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661365757604051631afcd79f60e31b815260040160405180910390fd5b565b61366161360e565b61366a81613c9d565b611c11608082013560a083013561368760e0850160c086016145ea565b613698610100860160e08701614c83565b61ffff166136ae61012087016101008801614d6a565b6136c061014088016101208901614d8a565b613cbe565b804710156136e85760405163cd78605960e01b815230600482015260240161063f565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613731576040519150601f19603f3d011682016040523d82523d5f602084013e613736565b606091505b5050905080610cac57604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614f4d8339815191524261377860408601602087016145ea565b6001600160401b0316116137ea5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161063f565b6137fa60408501602086016145ea565b6001600160401b03166138106202a300426148cc565b116138835760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161063f565b83356138db5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161063f565b83355f9081526009820160205260409020541561394b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161063f565b6139586040850185614da5565b90506030146139bf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161063f565b6139c883613c92565b5f80613a626040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a0d91906145ea565b6001600160401b03168152602001613a2860408a018a614da5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f02565b5f82815260078601602052604090209193509150613a808282614e32565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613aad9085906004016147b9565b6020604051808303815f875af1158015613ac9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613aed919061474c565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613b6f57613b6f61465e565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613c6491908e01908e016145ea565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c118160016133b4565b613ca561360e565b613cad6142a7565b613cb56142b7565b611c11816142bf565b613cc661360e565b5f80516020614f0d83398151915283613d325760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161063f565b612710841115613d545760405162461bcd60e51b815260040161063f90614c9e565b85871115613dbc5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161063f565b5f8360ff1611613e295760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161063f565b600a60ff84161115613e9b5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161063f565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613f6c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161063f565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613fe357613fa3816001614b7a565b613fae906008614895565b5081515f90839083908110613fc557613fc5614b8d565b60200101906001600160f81b03191690815f1a905350600101613f8f565b505f5b600481101561404157613ffa816003614b7a565b614005906008614895565b505f826140138360026148cc565b8151811061402357614023614b8d565b60200101906001600160f81b03191690815f1a905350600101613fe6565b505f5b602081101561409e578451816020811061406057614060614b8d565b1a60f81b826140708360066148cc565b8151811061408057614080614b8d565b60200101906001600160f81b03191690815f1a905350600101614044565b505f5b60208110156140fe57846020015181602081106140c0576140c0614b8d565b1a60f81b826140d08360266148cc565b815181106140e0576140e0614b8d565b60200101906001600160f81b03191690815f1a9053506001016140a1565b505f5b600881101561417257614115816007614b7a565b614120906008614895565b60ff1685604001516001600160401b0316901c60f81b8282604661414491906148cc565b8151811061415457614154614b8d565b60200101906001600160f81b03191690815f1a905350600101614101565b505f5b60308110156141dd578460800151818151811061419457614194614b8d565b01602001516001600160f81b031916826141af83604e6148cc565b815181106141bf576141bf614b8d565b60200101906001600160f81b03191690815f1a905350600101614175565b505f5b600881101561424f576141f4816007614b7a565b6141ff906008614895565b60608601516001600160401b0390811691161c60f81b8261422183607e6148cc565b8151811061423157614231614b8d565b60200101906001600160f81b03191690815f1a9053506001016141e0565b506002816040516142609190614ef1565b602060405180830381855afa15801561427b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061429e919061474c565b94909350915050565b6142af61360e565b61365761446c565b61365761360e565b6142c761360e565b80355f80516020614f4d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143136080840160608501614d6a565b60ff1611156143805760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161063f565b5f6143916080840160608501614d6a565b60ff16116143f95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161063f565b6144096080830160608401614d6a565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561443a60608301604084016145ea565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612c2d61360e565b508054614480906148df565b5f825580601f1061448f575050565b601f0160209004905f5260205f2090810190611c1191906144ef565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614503575f81556001016144f0565b5090565b8015158114611c11575f80fd5b803563ffffffff81168114614527575f80fd5b919050565b5f805f6060848603121561453e575f80fd5b83359250602084013561455081614507565b915061455e60408501614514565b90509250925092565b5f60208284031215614577575f80fd5b5035919050565b5f610140828403121561458f575f80fd5b50919050565b5f602082840312156145a5575f80fd5b611e7482614514565b5f80604083850312156145bf575f80fd5b6145c883614514565b946020939093013593505050565b6001600160401b0381168114611c11575f80fd5b5f602082840312156145fa575f80fd5b8135611e74816145d6565b5f808284036060811215614617575f80fd5b83356001600160401b0381111561462c575f80fd5b84016060818703121561463d575f80fd5b92506040601f1982011215614650575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061469657634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516146be60408401826001600160a01b03169052565b5060608301516146d960608401826001600160401b03169052565b5060808301516146f460808401826001600160401b03169052565b5060a083015161470f60a08401826001600160401b03169052565b5060c083015161472a60c08401826001600160401b03169052565b5060e083015161474560e08401826001600160401b03169052565b5092915050565b5f6020828403121561475c575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561474557614745614763565b5f5b838110156147b1578181015183820152602001614799565b50505f910152565b602081525f82518060208401526147d7816040850160208701614797565b601f01601f19169190910160400192915050565b5f8261480557634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610c2857610c28614763565b6001600160401b0381811683821601908082111561474557614745614763565b80820180821115610c2857610c28614763565b600181811c908216806148f357607f821691505b60208210810361458f57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461496a816148df565b806020870152604060018084165f811461498b57600181146149a7576149d4565b60ff19851660408a0152604084151560051b8a010195506149d4565b895f5260205f205f5b858110156149cb5781548b82018601529083019088016149b0565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614a1857614a186149e2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614a4657614a466149e2565b604052919050565b6001600160a01b0381168114611c11575f80fd5b805161452781614507565b5f8060408385031215614a7e575f80fd5b82516001600160401b0380821115614a94575f80fd5b9084019060608287031215614aa7575f80fd5b614aaf6149f6565b82518152602080840151614ac281614a4e565b82820152604084015183811115614ad7575f80fd5b80850194505087601f850112614aeb575f80fd5b835183811115614afd57614afd6149e2565b614b0f601f8201601f19168301614a1e565b93508084528882828701011115614b24575f80fd5b614b3381838601848801614797565b50826040830152819550614b48818801614a62565b9450505050509250929050565b5f6001600160401b03808316818103614b7057614b70614763565b6001019392505050565b81810381811115610c2857610c28614763565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c11575f80fd5b5f60208284031215614c93575f80fd5b8135611e7481614c74565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614cf481614c74565b61ffff8116905081548161ffff1982161783556020840135614d15816145d6565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614d6257614d62614763565b505092915050565b5f60208284031215614d7a575f80fd5b813560ff81168114611e74575f80fd5b5f60208284031215614d9a575f80fd5b8135611e7481614a4e565b5f808335601e19843603018112614dba575f80fd5b8301803591506001600160401b03821115614dd3575f80fd5b602001915036819003821315614de7575f80fd5b9250929050565b601f821115610cac57805f5260205f20601f840160051c81016020851015614e135750805b601f840160051c820191505b818110156116e8575f8155600101614e1f565b81516001600160401b03811115614e4b57614e4b6149e2565b614e5f81614e5984546148df565b84614dee565b602080601f831160018114614e92575f8415614e7b5750858301515b5f19600386901b1c1916600185901b178555614ee9565b5f85815260208120601f198616915b82811015614ec057888601518255948401946001909101908401614ea1565b5085821015614edd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614f02818460208701614797565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516151de3803806151de83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150918061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145af565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145ea565b610984565b34801561018b575f80fd5b506101ca61019a3660046145ea565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614601565b610b54565b34801561022d575f80fd5b5061024161023c3660046145ea565b610c31565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b366004614618565b610c47565b3480156102ab575f80fd5b5061015f6102ba366004614631565b610cca565b3480156102ca575f80fd5b506101ca6102d936600461466d565b610e9a565b3480156102e9575f80fd5b506102416102f83660046145ea565b610eb3565b348015610308575f80fd5b5061015f6103173660046145af565b610ec7565b6101ca61032a366004614688565b6110e6565b34801561033a575f80fd5b5061015f610349366004614631565b611112565b348015610359575f80fd5b5061015f610368366004614618565b61132f565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145ea565b6114ec565b3480156103dd575f80fd5b5061015f6103ec3660046145ea565b611772565b6101ca6103ff3660046145ea565b611881565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145ea565b61188d565b6040516101d491906146f5565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614fe5833981519152949193919290829060ff1660048111156104c2576104c26146e1565b60048111156104d3576104d36146e1565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f8361188d565b905042600283516004811115610567576105676146e1565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f805160206150058339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f805160206150058339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f6106288561196c565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146e1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610864575f61074e86896119ee565b6001600160401b03169050605060ff168460c001518461076e91906147e3565b6107789190614803565b6001600160401b031661078c82606461482e565b10156107aa5760405162461bcd60e51b81526004016105b090614845565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561082e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610852919061489a565b5f8b8152600989016020526040902055505b600283516005811115610879576108796146e1565b0361088b5761088b8460600151611c8a565b5f84606001518460a001516108a091906147e3565b90506108ac8682611c97565b5f6005600160991b0163ee5b48eb6108c5898686611cdf565b6040518263ffffffff1660e01b81526004016108e191906148d3565b6020604051808303815f875af11580156108fd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610921919061489a565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061506583398151915260205260408082208151610100810190925280545f8051602061502583398151915293929190829060ff1660058111156109d2576109d26146e1565b60058111156109e3576109e36146e1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6857610a686146e1565b14610acd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af28584608001515f611cdf565b6040518263ffffffff1660e01b8152600401610b0e91906148d3565b6020604051808303815f875af1158015610b2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4e919061489a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9d575080546001600160401b03808416911610155b15610bbb5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be583611efe565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4164e8d4a5100083614905565b92915050565b5f610c5182611f0f565b604080820180516001600160a01b039081165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020528251909116815291822091909155606082015190519192505f80516020614fe583398151915291610cc5916001600160401b031690612286565b505050565b5f80516020614fe58339815191525f610ce284612299565b90505f80610cf3836040015161247a565b50915091505f610d028361188d565b9050816001600160401b031681608001516001600160401b03161015610d3a5760405162461bcd60e51b81526004016105b090614924565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d7f5760405162461bcd60e51b81526004016105b090614966565b60015f87815260068701602052604090205460ff166004811115610da557610da56146e1565b14610e0e5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c416001600160401b03831664e8d4a5100061482e565b5f610ebd8261188d565b60a0015192915050565b5f80516020614fe58339815191525f610edf856126b5565b5f86815260058401602052604090205460c0820151919250610f1191620100009091046001600160401b0316906149af565b6001600160401b03168160e001516001600160401b03161015610f925760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110df575f610fa386856119ee565b9050605060ff168260c001518360e00151610fbe91906147e3565b610fc89190614803565b6001600160401b0316610fdc826064614803565b6001600160401b031610156110035760405162461bcd60e51b81526004016105b090614845565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015611087573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ab919061489a565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110d89084906149cf565b9091555050505b5050505050565b5f6110ef612a5e565b6110fa838334612a95565b9050610c4160015f8051602061504583398151915255565b5f80516020614fe58339815191525f61112a84612299565b90505f8061113b836040015161247a565b50915091505f61114a8361188d565b9050816001600160401b031681608001516001600160401b031610156111825760405162461bcd60e51b81526004016105b090614924565b5f8681526006860160205260409020600301546001600160401b03808416911611156111c05760405162461bcd60e51b81526004016105b090614966565b60035f87815260068701602052604090205460ff1660048111156111e6576111e66146e1565b1461123a5760405162461bcd60e51b815260206004820152603160248201525f805160206150058339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526112df91612286565b5f878152600987016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f805160206150258339815191525f61134783612299565b90505f806113588360400151612cc3565b91509150806113ba5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113d4906149e2565b9050118015611406575060015f83815260088601602052604090205460ff166005811115611404576114046146e1565b145b6114225760405162461bcd60e51b81526004016105b090614a14565b5f828152600785016020526040812061143a916144f7565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614fe583398151915293929190829060ff16600481111561154d5761154d6146e1565b600481111561155e5761155e6146e1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115e5576115e56146e1565b14806116035750600381516004811115611601576116016146e1565b145b6116575760405162461bcd60e51b815260206004820152603260248201525f80516020615005833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f611665826040015161188d565b905080608001516001600160401b03165f036116e95760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611716846040015184608001518560a00151611cdf565b6040518263ffffffff1660e01b815260040161173291906148d3565b6020604051808303815f875af115801561174e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110df919061489a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150258339815191529291906117ba906149e2565b90501180156117ec575060015f83815260088301602052604090205460ff1660058111156117ea576117ea6146e1565b145b6118085760405162461bcd60e51b81526004016105b090614a14565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118419190600401614a5b565b6020604051808303815f875af115801561185d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc5919061489a565b5f610c41823334612e64565b61189561452e565b5f8281525f805160206150658339815191526020526040908190208151610100810190925280545f80516020615025833981519152929190829060ff1660058111156118e3576118e36146e1565b60058111156118f4576118f46146e1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150658339815191526020526040812060030180545f80516020615025833981519152916001600160401b0390911690836119af83614ae5565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a609190810190614b95565b9150915080611ac35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2a919061489a565b825114611b8e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c045760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c13846040015161325f565b91509150818714611c805760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c94815f613437565b50565b5f9182525f80516020615065833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d5857611d18816001614c7d565b611d2390600861482e565b5081515f90839083908110611d3a57611d3a614c90565b60200101906001600160f81b03191690815f1a905350600101611d04565b505f5b6004811015611dbb57611d6f816003614c7d565b611d7a90600861482e565b6001901c60f81b82611d8d8360026149cf565b81518110611d9d57611d9d614c90565b60200101906001600160f81b03191690815f1a905350600101611d5b565b505f5b6020811015611e1d57611dd281601f614c7d565b611ddd90600861482e565b86901c60f81b82611def8360066149cf565b81518110611dff57611dff614c90565b60200101906001600160f81b03191690815f1a905350600101611dbe565b505f5b6008811015611e8857611e34816007614c7d565b611e3f90600861482e565b6001600160401b038616901c60f81b82611e5a8360266149cf565b81518110611e6a57611e6a614c90565b60200101906001600160f81b03191690815f1a905350600101611e20565b505f5b6008811015611ef357611e9f816007614c7d565b611eaa90600861482e565b6001600160401b038516901c60f81b82611ec583602e6149cf565b81518110611ed557611ed5614c90565b60200101906001600160f81b03191690815f1a905350600101611e8b565b5090505b9392505050565b611f06613691565b611c94816136dc565b611f1761452e565b5f805160206150258339815191525f611f2f84612299565b90505f80611f408360400151612cc3565b915091508015611fa55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fd757611fd76146e1565b6005811115611fe857611fe86146e1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f908251600581111561206f5761206f6146e1565b148061208d575060018251600581111561208b5761208b6146e1565b145b6120ec5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b600382516005811115612101576121016146e1565b0361210e57506004612112565b5060055b6020808301515f9081526009880190915260408120558181600581111561213b5761213b6146e1565b9081600581111561214e5761214e6146e1565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612182576121826146e1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561224d5761224d6146e1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6122826001600160a01b03821683613748565b60408051606080820183525f8083526020830181905292820152905f805160206150258339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561230e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123359190810190614b95565b915091508061239c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146123ff5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b0316156124725760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f835160361461249e5760405162461bcd60e51b81526004016105b090614ca4565b5f805b60028110156124ed576124b5816001614c7d565b6124c090600861482e565b61ffff168682815181106124d6576124d6614c90565b016020015160f81c901b91909117906001016124a1565b5061ffff8116156125105760405162461bcd60e51b81526004016105b090614ced565b5f805b600481101561256b57612527816003614c7d565b61253290600861482e565b63ffffffff16876125448360026149cf565b8151811061255457612554614c90565b016020015160f81c901b9190911790600101612513565b5063ffffffff81166003146125925760405162461bcd60e51b81526004016105b090614d30565b5f805b60208110156125e7576125a981601f614c7d565b6125b490600861482e565b886125c08360066149cf565b815181106125d0576125d0614c90565b016020015160f81c901b9190911790600101612595565b505f805b6008811015612646576125ff816007614c7d565b61260a90600861482e565b6001600160401b03168961261f8360266149cf565b8151811061262f5761262f614c90565b016020015160f81c901b91909117906001016125eb565b505f805b60088110156126a55761265e816007614c7d565b61266990600861482e565b6001600160401b03168a61267e83602e6149cf565b8151811061268e5761268e614c90565b016020015160f81c901b919091179060010161264a565b5091989097509095509350505050565b6126bd61452e565b5f8281525f8051602061506583398151915260205260408082208151610100810190925280545f8051602061502583398151915293929190829060ff16600581111561270b5761270b6146e1565b600581111561271c5761271c6146e1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a4576127a46146e1565b146128005760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b03161461287a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128878160a00151611c8a565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128cb576128cb6146e1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612997856129918161196c565b5f611cdf565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c69085906004016148d3565b6020604051808303815f875af11580156129e2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a06919061489a565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020615045833981519152805460011901612a8f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614fe5833981519152906001600160401b0316612ae1604086016020870161466d565b6001600160401b03161015612b505760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b626020860186614d86565b61ffff1610158015612b865750612710612b7f6020860186614d86565b61ffff1611155b612ba25760405162461bcd60e51b81526004016105b090614da1565b8054831015612c055760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c6c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c7782610c31565b90505f612c8488836137db565b5f81815260058601602052604090209091508790612ca28282614dec565b509098975050505050505050565b60015f8051602061504583398151915255565b5f808251602714612ce65760405162461bcd60e51b81526004016105b090614ca4565b5f805b6002811015612d3557612cfd816001614c7d565b612d0890600861482e565b61ffff16858281518110612d1e57612d1e614c90565b016020015160f81c901b9190911790600101612ce9565b5061ffff811615612d585760405162461bcd60e51b81526004016105b090614ced565b5f805b6004811015612db357612d6f816003614c7d565b612d7a90600861482e565b63ffffffff1686612d8c8360026149cf565b81518110612d9c57612d9c614c90565b016020015160f81c901b9190911790600101612d5b565b5063ffffffff8116600214612dda5760405162461bcd60e51b81526004016105b090614d30565b5f805b6020811015612e2f57612df181601f614c7d565b612dfc90600861482e565b87612e088360066149cf565b81518110612e1857612e18614c90565b016020015160f81c901b9190911790600101612ddd565b505f86602681518110612e4457612e44614c90565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e6d612a5e565b5f80516020614fe58339815191525f612e8584610c31565b90505f612e918761188d565b9050600281516005811115612ea857612ea86146e1565b14612f075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1082613d15565b5f828260a00151612f2191906149af565b60048501546060840151919250612f43916001600160401b0390911690614803565b6001600160401b0316816001600160401b03161115612fc25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fcc8882611c97565b5f612fd68961196c565b90505f898260405160200161300292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb61303c8d8688611cdf565b6040518263ffffffff1660e01b815260040161305891906148d3565b6020604051808303815f875af1158015613074573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613098919061489a565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613120576131206146e1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611ef760015f8051602061504583398151915255565b5f808251602e146132825760405162461bcd60e51b81526004016105b090614ca4565b5f805b60028110156132d157613299816001614c7d565b6132a490600861482e565b61ffff168582815181106132ba576132ba614c90565b016020015160f81c901b9190911790600101613285565b5061ffff8116156132f45760405162461bcd60e51b81526004016105b090614ced565b5f805b600481101561334f5761330b816003614c7d565b61331690600861482e565b63ffffffff16866133288360026149cf565b8151811061333857613338614c90565b016020015160f81c901b91909117906001016132f7565b5063ffffffff81166004146133765760405162461bcd60e51b81526004016105b090614d30565b5f805b60208110156133cb5761338d81601f614c7d565b61339890600861482e565b876133a48360066149cf565b815181106133b4576133b4614c90565b016020015160f81c901b9190911790600101613379565b505f805b600881101561342a576133e3816007614c7d565b6133ee90600861482e565b6001600160401b0316886134038360266149cf565b8151811061341357613413614c90565b016020015160f81c901b91909117906001016133cf565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061502583398151915291429190158061351d575060028301548151613519916001600160401b0316906149cf565b8210155b15613543576001600160401b038516606082015281815260408101516020820152613562565b848160600181815161355591906149af565b6001600160401b03169052505b6060810151613572906064614803565b602082015160028501546001600160401b03929092169161359d9190600160401b900460ff1661482e565b10156136015760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561362a57846001600160401b03168160400181815161362291906149cf565b905250613649565b846001600160401b0316816040018181516136459190614c7d565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136da57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e4613691565b6136ed81613d20565b611c94608082013560a083013561370a60e0850160c0860161466d565b61371b610100860160e08701614d86565b61ffff1661373161012087016101008801614e42565b61374361014088016101208901614e62565b613d41565b8047101561376b5760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137b4576040519150601f19603f3d011682016040523d82523d5f602084013e6137b9565b606091505b5050905080610cc557604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020615025833981519152426137fb604086016020870161466d565b6001600160401b03161161386d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b61387d604085016020860161466d565b6001600160401b03166138936202a300426149cf565b116139065760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b833561395e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139ce5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139db6040850185614e7d565b9050603014613a425760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a4b83613d15565b5f80613ae56040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a90919061466d565b6001600160401b03168152602001613aab60408a018a614e7d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f85565b5f82815260078601602052604090209193509150613b038282614f0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b309085906004016148d3565b6020604051808303815f875af1158015613b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b70919061489a565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bf257613bf26146e1565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ce791908e01908e0161466d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c94816001613437565b613d28613691565b613d3061432a565b613d3861433a565b611c9481614342565b613d49613691565b5f80516020614fe583398151915283613db55760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613dd75760405162461bcd60e51b81526004016105b090614da1565b85871115613e3f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eac5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f1e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613fef5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561406657614026816001614c7d565b61403190600861482e565b5081515f9083908390811061404857614048614c90565b60200101906001600160f81b03191690815f1a905350600101614012565b505f5b60048110156140c45761407d816003614c7d565b61408890600861482e565b505f826140968360026149cf565b815181106140a6576140a6614c90565b60200101906001600160f81b03191690815f1a905350600101614069565b505f5b602081101561412157845181602081106140e3576140e3614c90565b1a60f81b826140f38360066149cf565b8151811061410357614103614c90565b60200101906001600160f81b03191690815f1a9053506001016140c7565b505f5b6020811015614181578460200151816020811061414357614143614c90565b1a60f81b826141538360266149cf565b8151811061416357614163614c90565b60200101906001600160f81b03191690815f1a905350600101614124565b505f5b60088110156141f557614198816007614c7d565b6141a390600861482e565b60ff1685604001516001600160401b0316901c60f81b828260466141c791906149cf565b815181106141d7576141d7614c90565b60200101906001600160f81b03191690815f1a905350600101614184565b505f5b6030811015614260578460800151818151811061421757614217614c90565b01602001516001600160f81b0319168261423283604e6149cf565b8151811061424257614242614c90565b60200101906001600160f81b03191690815f1a9053506001016141f8565b505f5b60088110156142d257614277816007614c7d565b61428290600861482e565b60608601516001600160401b0390811691161c60f81b826142a483607e6149cf565b815181106142b4576142b4614c90565b60200101906001600160f81b03191690815f1a905350600101614263565b506002816040516142e39190614fc9565b602060405180830381855afa1580156142fe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614321919061489a565b94909350915050565b614332613691565b6136da6144ef565b6136da613691565b61434a613691565b80355f8051602061502583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143966080840160608501614e42565b60ff1611156144035760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f6144146080840160608501614e42565b60ff161161447c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b61448c6080830160608401614e42565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144bd606083016040840161466d565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cb0613691565b508054614503906149e2565b5f825580601f10614512575050565b601f0160209004905f5260205f2090810190611c949190614572565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614586575f8155600101614573565b5090565b8015158114611c94575f80fd5b803563ffffffff811681146145aa575f80fd5b919050565b5f805f606084860312156145c1575f80fd5b8335925060208401356145d38161458a565b91506145e160408501614597565b90509250925092565b5f602082840312156145fa575f80fd5b5035919050565b5f6101408284031215614612575f80fd5b50919050565b5f60208284031215614628575f80fd5b611ef782614597565b5f8060408385031215614642575f80fd5b61464b83614597565b946020939093013593505050565b6001600160401b0381168114611c94575f80fd5b5f6020828403121561467d575f80fd5b8135611ef781614659565b5f80828403606081121561469a575f80fd5b83356001600160401b038111156146af575f80fd5b8401606081870312156146c0575f80fd5b92506040601f19820112156146d3575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061471957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474160408401826001600160a01b03169052565b50606083015161475c60608401826001600160401b03169052565b50608083015161477760808401826001600160401b03169052565b5060a083015161479260a08401826001600160401b03169052565b5060c08301516147ad60c08401826001600160401b03169052565b5060e08301516147c860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147c8576147c86147cf565b6001600160401b03818116838216028082169190828114614826576148266147cf565b505092915050565b8082028115828204841417610c4157610c416147cf565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f602082840312156148aa575f80fd5b5051919050565b5f5b838110156148cb5781810151838201526020016148b3565b50505f910152565b602081525f82518060208401526148f18160408501602087016148b1565b601f01601f19169190910160400192915050565b5f8261491f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147c8576147c86147cf565b80820180821115610c4157610c416147cf565b600181811c908216806149f657607f821691505b60208210810361461257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a6d816149e2565b806020870152604060018084165f8114614a8e5760018114614aaa57614ad7565b60ff19851660408a0152604084151560051b8a01019550614ad7565b895f5260205f205f5b85811015614ace5781548b8201860152908301908801614ab3565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b0057614b006147cf565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b4057614b40614b0a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b6e57614b6e614b0a565b604052919050565b6001600160a01b0381168114611c94575f80fd5b80516145aa8161458a565b5f8060408385031215614ba6575f80fd5b82516001600160401b0380821115614bbc575f80fd5b9084019060608287031215614bcf575f80fd5b614bd7614b1e565b82518152602080840151614bea81614b76565b82820152604084015183811115614bff575f80fd5b80850194505087601f850112614c13575f80fd5b835183811115614c2557614c25614b0a565b614c37601f8201601f19168301614b46565b93508084528882828701011115614c4c575f80fd5b614c5b818386018488016148b1565b50826040830152819550614c70818801614b8a565b9450505050509250929050565b81810381811115610c4157610c416147cf565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c94575f80fd5b5f60208284031215614d96575f80fd5b8135611ef781614d77565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614df781614d77565b61ffff8116905081548161ffff1982161783556020840135614e1881614659565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e52575f80fd5b813560ff81168114611ef7575f80fd5b5f60208284031215614e72575f80fd5b8135611ef781614b76565b5f808335601e19843603018112614e92575f80fd5b8301803591506001600160401b03821115614eab575f80fd5b602001915036819003821315614ebf575f80fd5b9250929050565b601f821115610cc557805f5260205f20601f840160051c81016020851015614eeb5750805b601f840160051c820191505b818110156110df575f8155600101614ef7565b81516001600160401b03811115614f2357614f23614b0a565b614f3781614f3184546149e2565b84614ec6565b602080601f831160018114614f6a575f8415614f535750858301515b5f19600386901b1c1916600185901b178555614fc1565b5f85815260208120601f198616915b82811015614f9857888601518255948401946001909101908401614f79565b5085821015614fb557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614fda8184602087016148b1565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -370,6 +370,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMU return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) } +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _NativeTokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_NativeTokenStakingManager.CallOpts) +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _NativeTokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_NativeTokenStakingManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) diff --git a/contracts/mocks/ExampleERC20.sol b/contracts/mocks/ExampleERC20.sol index a17f2f49d..0e5987584 100644 --- a/contracts/mocks/ExampleERC20.sol +++ b/contracts/mocks/ExampleERC20.sol @@ -19,7 +19,7 @@ contract ExampleERC20 is ERC20Burnable, IERC20Mintable { string private constant _TOKEN_NAME = "Mock Token"; string private constant _TOKEN_SYMBOL = "EXMP"; - uint256 private constant _MAX_MINT = 1e16; + uint256 private constant _MAX_MINT = 1e19; constructor() ERC20(_TOKEN_NAME, _TOKEN_SYMBOL) { _mint(msg.sender, 1e28); diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index 752069164..39e84a194 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -21,10 +21,11 @@ contract ExampleRewardCalculator is IRewardCalculator { */ function calculateReward( uint256 stakeAmount, - uint64 uptime, + uint64 startTime, + uint64 endTime, uint256, // initialSupply uint256 // endSupply ) external view returns (uint256) { - return (stakeAmount * rewardBasisPoints * uptime) / SECONDS_IN_YEAR / 1000; + return (stakeAmount * rewardBasisPoints * (endTime - startTime)) / SECONDS_IN_YEAR / 10000; } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index ac5967aff..1282c87ad 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -68,6 +68,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint8 public constant MAXIMUM_STAKE_MULTIPLIER_LIMIT = 10; + uint8 public constant UPTIME_REWARDS_THRESHOLD_PERCENTAGE = 80; + uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; // solhint-disable ordering @@ -137,24 +139,28 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint32 messageIndex ) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + Validator memory validator = _initializeEndValidation(validationID); + // Check that minimum stake duration has passed - Validator memory validator = getValidator(validationID); require( - block.timestamp + validator.endedAt >= validator.startedAt + $._validatorRequirements[validationID].minStakeDuration, "PoSValidatorManager: minimum stake duration not met" ); - uint64 uptime; if (includeUptimeProof) { - uptime = _getUptime(validationID, messageIndex); + uint64 uptime = _getUptime(validationID, messageIndex); + require( + uptime * 100 + >= (validator.endedAt - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE, + "PoSValidatorManager: minimum uptime threshold not met" + ); + + $._pendingValidatorRewards[validator.owner] += $._rewardCalculator.calculateReward( + validator.weight, validator.startedAt, validator.endedAt, 0, 0 + ); } - - // TODO check if above 80% uptime - $._pendingValidatorRewards[validator.owner] += - $._rewardCalculator.calculateReward(validator.weight, uptime, 0, 0); - - _initializeEndValidation(validationID); } function completeEndValidation(uint32 messageIndex) external { @@ -347,13 +353,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager bytes32 validationID = $._delegatorStakes[delegationID].validationID; Delegator memory delegator = $._delegatorStakes[delegationID]; - - uint64 uptime; - if (includeUptimeProof) { - uptime = _getUptime(validationID, messageIndex); - } - $._pendingDelegatorRewards[delegationID] = - $._rewardCalculator.calculateReward(delegator.weight, uptime, 0, 0); + Validator memory validator = getValidator(validationID); + uint64 currentTime = uint64(block.timestamp); // Ensure the delegator is active require( @@ -369,13 +370,23 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // the complete step, even if the delivered nonce is greater than the nonce used to // initialize the removal. delegator.status = DelegatorStatus.PendingRemoved; - delegator.endedAt = uint64(block.timestamp); + delegator.endedAt = currentTime; delegator.endingNonce = nonce; $._delegatorStakes[delegationID] = delegator; - Validator memory validator = getValidator(validationID); - require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); + if (includeUptimeProof) { + uint256 uptime = _getUptime(validationID, messageIndex); + require( + uptime * 100 + >= (currentTime - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE, + "PoSValidatorManager: minimum uptime threshold not met" + ); + + $._pendingDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward( + delegator.weight, delegator.startedAt, delegator.endedAt, 0, 0 + ); + } // Check that removing this delegator would not exceed the maximum churn rate. // We only need to check this is the validator is still active. If the validator ends its validation @@ -400,7 +411,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validationID: validationID, nonce: nonce, validatorWeight: newValidatorWeight, - endTime: block.timestamp, + endTime: currentTime, setWeightMessageID: messageID }); } diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol index c06bf3bec..51fffb6a7 100644 --- a/contracts/staking/interfaces/IRewardCalculator.sol +++ b/contracts/staking/interfaces/IRewardCalculator.sol @@ -8,7 +8,8 @@ pragma solidity 0.8.25; interface IRewardCalculator { function calculateReward( uint256 stakeAmount, - uint64 uptime, + uint64 startTime, + uint64 endTime, uint256 initialSupply, uint256 endSupply ) external view returns (uint256); diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol index b51a699f0..22a41368c 100644 --- a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -22,8 +22,8 @@ contract ExampleRewardCalculatorTest is Test { function testRewardCalculation() public view { uint256 output = exampleRewardCalculator.calculateReward( - DEFAULT_STAKE_AMOUNT, DEFAULT_END_TIME - DEFAULT_START_TIME, 0, 0 + DEFAULT_STAKE_AMOUNT, DEFAULT_START_TIME, DEFAULT_END_TIME, 0, 0 ); - assertEq(output, 42e9); + assertEq(output, 42e8); } } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index cd91bf625..bbf60c1db 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -752,7 +752,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 stakeAmount ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID, bool includeUptime) internal virtual override { + function _initializeEndValidation( + bytes32 validationID, + bool includeUptime + ) internal virtual override { return posValidatorManager.initializeEndValidation(validationID, includeUptime, 0); } From 6fbb9ad6b08502f7aa1cb08ab72985e392185051 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Mon, 16 Sep 2024 12:31:04 -0400 Subject: [PATCH 287/545] WIP but not working at all yet --- abi-bindings/go/packer/packer_test.go | 2 + .../ERC20TokenStakingManager.go | 240 ++++++++++++++++-- .../NativeTokenStakingManager.go | 240 ++++++++++++++++-- .../PoAValidatorManager.go | 214 +++++++++++++++- .../go/staking/PoAValidatorManager/packing.go | 53 ++++ contracts/staking/ValidatorManager.sol | 2 +- scripts/abi_bindings.sh | 2 +- scripts/local/e2e_test.sh | 2 +- tests/flows/staking/poa_validator_manager.go | 57 +++++ tests/utils/staking.go | 12 +- 10 files changed, 748 insertions(+), 76 deletions(-) create mode 100644 abi-bindings/go/staking/PoAValidatorManager/packing.go diff --git a/abi-bindings/go/packer/packer_test.go b/abi-bindings/go/packer/packer_test.go index 196f64976..cdab92c62 100644 --- a/abi-bindings/go/packer/packer_test.go +++ b/abi-bindings/go/packer/packer_test.go @@ -14,6 +14,7 @@ import ( "testing" validatorsetsig "github.com/ava-labs/teleporter/abi-bindings/go/governance/ValidatorSetSig" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" teleporterregistry "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/registry/TeleporterRegistry" @@ -38,6 +39,7 @@ var packerTypes = map[string]ABIPacker{ "ValidatorSetSigMessage": &validatorsetsig.ValidatorSetSigMessage{}, "TeleporterMessage": &teleportermessenger.TeleporterMessage{}, "ProtocolRegistryEntry": &teleporterregistry.ProtocolRegistryEntry{}, + "SubnetConversionData": &poavalidatormanager.SubnetConversionData{}, } // findAllImplementers returns names of all structs that implement the ABIPacker interface diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index b239e92d6..42b6d644c 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -29,6 +29,13 @@ var ( _ = abi.ConvertType ) +// InitialValidator is an auto generated low-level Go binding around an user-defined struct. +type InitialValidator struct { + NodeID [32]byte + Weight uint64 + BlsPublicKey []byte +} + // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { BaseSettings ValidatorManagerSettings @@ -40,17 +47,21 @@ type PoSValidatorManagerSettings struct { RewardCalculator common.Address } -// PoSValidatorRequirements is an auto generated low-level Go binding around an user-defined struct. -type PoSValidatorRequirements struct { - DelegationFeeBips uint16 - MinStakeDuration uint64 +// SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. +type SubnetConversionData struct { + ConvertSubnetTxID [32]byte + BlockchainID [32]byte + ValidatorManagerAddress []byte + InitialValidators []InitialValidator } // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { - PChainBlockchainID [32]byte - SubnetID [32]byte - MaximumHourlyChurn uint8 + PChainBlockchainID [32]byte + SubnetID [32]byte + MaximumHourlyChurn uint8 + SubnetConversionData SubnetConversionData + MessageIndex uint32 } // ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. @@ -62,8 +73,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614e67380380614e6783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d1a8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c806366435abf116100a9578063a13fd29d1161006e578063a13fd29d14610292578063a3a65e48146102a5578063b771b3bc146102b8578063ba3a4b97146102de578063bee0a03f146102f1575f80fd5b806366435abf146102335780636f5f1c941461024657806376f786211461025957806398f3e2b41461026c5780639e1bc4ef1461027f575f80fd5b80632e2194d8116100ef5780632e2194d8146101b357806335455ded146101de578063467ef06f146101fa5780635297fae61461020d5780636206585614610220575f80fd5b80630118acc4146101205780630322ed98146101355780630cdd098514610148578063151d30d114610199575b5f80fd5b61013361012e3660046142c3565b610304565b005b6101336101433660046142fe565b61076e565b6101866101563660046142fe565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101a1600a81565b60405160ff9091168152602001610190565b6101c66101c13660046142fe565b61093e565b6040516001600160401b039091168152602001610190565b6101e761271081565b60405161ffff9091168152602001610190565b610133610208366004614315565b610954565b61013361021b36600461432e565b61097f565b61018661022e36600461436a565b610b4f565b6101c66102413660046142fe565b610b68565b610133610254366004614399565b610b7c565b6101336102673660046142c3565b610c60565b61013361027a36600461432e565b610d40565b61018661028d3660046143d7565b610f4f565b6101866102a03660046143f7565b610f62565b6101336102b3366004614315565b610f8e565b6102c66005600160991b0181565b6040516001600160a01b039091168152602001610190565b6101336102ec3660046142fe565b61114b565b6101336102ff3660046142fe565b6113d1565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614c6e8339815191529184156103565761035382856114e5565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561038857610388614458565b600481111561039957610399614458565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561042057610420614458565b146104725760405162461bcd60e51b815260206004820152602a60248201525f80516020614c8e8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104d75760405162461bcd60e51b815260206004820152603360248201525f80516020614c8e8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610469565b5f6104e184611781565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561052e5761052e614458565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61060085611803565b905082606001516001600160401b03168160a001516001600160401b0316116106775760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610469565b5f83606001518260a0015161068c9190614480565b905061069886826118e2565b5f6005600160991b0163ee5b48eb6106b189878661192a565b6040518263ffffffff1660e01b81526004016106cd91906144c9565b6020604051808303815f875af11580156106e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070d91906144fb565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614cee83398151915260205260408082208151610100810190925280545f80516020614cae83398151915293929190829060ff1660058111156107bc576107bc614458565b60058111156107cd576107cd614458565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561085257610852614458565b146108b75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610469565b6005600160991b016001600160a01b031663ee5b48eb6108dc8584608001515f61192a565b6040518263ffffffff1660e01b81526004016108f891906144c9565b6020604051808303815f875af1158015610914573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093891906144fb565b50505050565b5f61094e64e8d4a5100083614526565b92915050565b5f61095e82611b47565b905061097b81606001516001600160401b03168260400151611eba565b5050565b5f80516020614c6e8339815191525f61099784611ef0565b90505f806109a883604001516120d1565b50915091505f6109b783611803565b9050816001600160401b031681608001516001600160401b031610156109ef5760405162461bcd60e51b815260040161046990614539565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a345760405162461bcd60e51b81526004016104699061457b565b60015f87815260068701602052604090205460ff166004811115610a5a57610a5a614458565b14610ac35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610469565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f61094e6001600160401b03831664e8d4a510006145c4565b5f610b7282611803565b60a0015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bc5575080546001600160401b03808416911610155b15610be35760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c0e848461230c565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020614c6e8339815191525f610c7885611803565b5f86815260058401602052604090205460c0820151919250610caa91620100009091046001600160401b0316906145db565b6001600160401b0316421015610d1e5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610469565b8315610d3057610d2e85846114e5565b505b610d3985612326565b5050505050565b5f80516020614c6e8339815191525f610d5884611ef0565b90505f80610d6983604001516120d1565b50915091505f610d7883611803565b9050816001600160401b031681608001516001600160401b03161015610db05760405162461bcd60e51b815260040161046990614539565b5f8681526006860160205260409020600301546001600160401b0380841691161115610dee5760405162461bcd60e51b81526004016104699061457b565b60035f87815260068701602052604090205460ff166004811115610e1457610e14614458565b14610e685760405162461bcd60e51b815260206004820152603160248201525f80516020614c8e8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610469565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f0d91611eba565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f5b8333846126c4565b9392505050565b5f610f6b612ab9565b610f76848484612af0565b9050610f5b60015f80516020614cce83398151915255565b5f80516020614cae8339815191525f610fa683611ef0565b90505f80610fb78360400151612cd2565b91509150806110195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610469565b5f82815260058501602052604081208054611033906145fb565b9050118015611065575060015f83815260068601602052604090205460ff16600581111561106357611063614458565b145b6110815760405162461bcd60e51b815260040161046990614633565b5f82815260058501602052604081206110999161420b565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614c6e83398151915293929190829060ff1660048111156111ac576111ac614458565b60048111156111bd576111bd614458565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561124457611244614458565b1480611262575060038151600481111561126057611260614458565b145b6112b65760405162461bcd60e51b815260206004820152603260248201525f80516020614c8e833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610469565b5f6112c48260400151611803565b905080608001516001600160401b03165f036113485760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610469565b6005600160991b016001600160a01b031663ee5b48eb611375846040015184608001518560a0015161192a565b6040518263ffffffff1660e01b815260040161139191906144c9565b6020604051808303815f875af11580156113ad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d3991906144fb565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020614cae833981519152929190611419906145fb565b905011801561144b575060015f83815260068301602052604090205460ff16600581111561144957611449614458565b145b6114675760405162461bcd60e51b815260040161046990614633565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114a0919060040161467a565b6020604051808303815f875af11580156114bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e091906144fb565b505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611530573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611557919081019061477b565b91509150806115ba5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610469565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162191906144fb565b8251146116855760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610469565b60208201516001600160a01b0316156116fb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610469565b5f8061170a8460400151612e73565b915091508187146117775760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610469565b9695505050505050565b5f8181525f80516020614cee8339815191526020526040812060030180545f80516020614cae833981519152916001600160401b0390911690836117c483614863565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b61180b614242565b5f8281525f80516020614cee8339815191526020526040908190208151610100810190925280545f80516020614cae833981519152929190829060ff16600581111561185957611859614458565b600581111561186a5761186a614458565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f80516020614cee833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119a357611963816001614888565b61196e9060086145c4565b5081515f908390839081106119855761198561489b565b60200101906001600160f81b03191690815f1a90535060010161194f565b505f5b6004811015611a06576119ba816003614888565b6119c59060086145c4565b6001901c60f81b826119d88360026148af565b815181106119e8576119e861489b565b60200101906001600160f81b03191690815f1a9053506001016119a6565b505f5b6020811015611a6857611a1d81601f614888565b611a289060086145c4565b86901c60f81b82611a3a8360066148af565b81518110611a4a57611a4a61489b565b60200101906001600160f81b03191690815f1a905350600101611a09565b505f5b6008811015611ad357611a7f816007614888565b611a8a9060086145c4565b6001600160401b038616901c60f81b82611aa58360266148af565b81518110611ab557611ab561489b565b60200101906001600160f81b03191690815f1a905350600101611a6b565b505f5b6008811015611b3e57611aea816007614888565b611af59060086145c4565b6001600160401b038516901c60f81b82611b1083602e6148af565b81518110611b2057611b2061489b565b60200101906001600160f81b03191690815f1a905350600101611ad6565b50949350505050565b611b4f614242565b5f80516020614cae8339815191525f611b6784611ef0565b90505f80611b788360400151612cd2565b915091508015611bdd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610469565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611c0f57611c0f614458565b6005811115611c2057611c20614458565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ca757611ca7614458565b1480611cc55750600182516005811115611cc357611cc3614458565b145b611d245760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610469565b600382516005811115611d3957611d39614458565b03611d4657506004611d4a565b5060055b6020808301515f90815260078801909152604081205581816005811115611d7357611d73614458565b90816005811115611d8657611d86614458565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611dba57611dba614458565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611e8557611e85614458565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461097b906001600160a01b0316828461304b565b60408051606080820183525f8083526020830181905292820152905f80516020614cae8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f8c919081019061477b565b9150915080611ff35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610469565b82548251146120565760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610469565b60208201516001600160a01b0316156120c95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610469565b509392505050565b5f805f83516036146120f55760405162461bcd60e51b8152600401610469906148c2565b5f805b60028110156121445761210c816001614888565b6121179060086145c4565b61ffff1686828151811061212d5761212d61489b565b016020015160f81c901b91909117906001016120f8565b5061ffff8116156121675760405162461bcd60e51b81526004016104699061490b565b5f805b60048110156121c25761217e816003614888565b6121899060086145c4565b63ffffffff168761219b8360026148af565b815181106121ab576121ab61489b565b016020015160f81c901b919091179060010161216a565b5063ffffffff81166003146121e95760405162461bcd60e51b81526004016104699061494e565b5f805b602081101561223e5761220081601f614888565b61220b9060086145c4565b886122178360066148af565b815181106122275761222761489b565b016020015160f81c901b91909117906001016121ec565b505f805b600881101561229d57612256816007614888565b6122619060086145c4565b6001600160401b0316896122768360266148af565b815181106122865761228661489b565b016020015160f81c901b9190911790600101612242565b505f805b60088110156122fc576122b5816007614888565b6122c09060086145c4565b6001600160401b03168a6122d583602e6148af565b815181106122e5576122e561489b565b016020015160f81c901b91909117906001016122a1565b5091989097509095509350505050565b6123146130aa565b61231d826130f5565b61097b81613162565b5f8181525f80516020614cee83398151915260205260408082208151610100810190925280545f80516020614cae83398151915293929190829060ff16600581111561237457612374614458565b600581111561238557612385614458565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561240d5761240d614458565b146124695760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610469565b60408101516001600160a01b0316336001600160a01b0316146124e35760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610469565b6124f08160a00151613216565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561253457612534614458565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612600846125fa81611781565b5f61192a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061262f9085906004016144c9565b6020604051808303815f875af115801561264b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061266f91906144fb565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126cd612ab9565b5f80516020614c6e8339815191525f6126e86101c1856133b7565b90505f6126f487611803565b905060028151600581111561270b5761270b614458565b1461276a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610469565b5f828260a0015161277b91906145db565b6004850154606084015191925061279d916001600160401b0390911690614995565b6001600160401b0316816001600160401b0316111561281c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610469565b61282688826118e2565b5f61283089611781565b90505f898260405160200161285c92919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061287d85613216565b5f6005600160991b0163ee5b48eb6128968d868861192a565b6040518263ffffffff1660e01b81526004016128b291906144c9565b6020604051808303815f875af11580156128ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128f291906144fb565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561297a5761297a614458565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610f5b60015f80516020614cce83398151915255565b5f80516020614cce833981519152805460011901612aea57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614c6e833981519152906001600160401b0316612b3c604086016020870161436a565b6001600160401b03161015612bab5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610469565b6003810154612bbd60208601866149cf565b61ffff1610158015612be15750612710612bda60208601866149cf565b61ffff1611155b612bfd5760405162461bcd60e51b8152600401610469906149ea565b80548310801590612c12575080600101548311155b612c705760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610469565b5f612c7a846133b7565b90505f612c868261093e565b90505f612c9388836133ed565b5f81815260058601602052604090209091508790612cb18282614a35565b509098975050505050505050565b60015f80516020614cce83398151915255565b5f808251602714612cf55760405162461bcd60e51b8152600401610469906148c2565b5f805b6002811015612d4457612d0c816001614888565b612d179060086145c4565b61ffff16858281518110612d2d57612d2d61489b565b016020015160f81c901b9190911790600101612cf8565b5061ffff811615612d675760405162461bcd60e51b81526004016104699061490b565b5f805b6004811015612dc257612d7e816003614888565b612d899060086145c4565b63ffffffff1686612d9b8360026148af565b81518110612dab57612dab61489b565b016020015160f81c901b9190911790600101612d6a565b5063ffffffff8116600214612de95760405162461bcd60e51b81526004016104699061494e565b5f805b6020811015612e3e57612e0081601f614888565b612e0b9060086145c4565b87612e178360066148af565b81518110612e2757612e2761489b565b016020015160f81c901b9190911790600101612dec565b505f86602681518110612e5357612e5361489b565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e965760405162461bcd60e51b8152600401610469906148c2565b5f805b6002811015612ee557612ead816001614888565b612eb89060086145c4565b61ffff16858281518110612ece57612ece61489b565b016020015160f81c901b9190911790600101612e99565b5061ffff811615612f085760405162461bcd60e51b81526004016104699061490b565b5f805b6004811015612f6357612f1f816003614888565b612f2a9060086145c4565b63ffffffff1686612f3c8360026148af565b81518110612f4c57612f4c61489b565b016020015160f81c901b9190911790600101612f0b565b5063ffffffff8116600414612f8a5760405162461bcd60e51b81526004016104699061494e565b5f805b6020811015612fdf57612fa181601f614888565b612fac9060086145c4565b87612fb88360066148af565b81518110612fc857612fc861489b565b016020015160f81c901b9190911790600101612f8d565b505f805b600881101561303e57612ff7816007614888565b6130029060086145c4565b6001600160401b0316886130178360266148af565b815181106130275761302761489b565b016020015160f81c901b9190911790600101612fe3565b5090969095509350505050565b6040516001600160a01b038381166024830152604482018390526114e091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506138b7565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130f357604051631afcd79f60e31b815260040160405180910390fd5b565b6130fd6130aa565b61310681613918565b61315f6060820135608083013561312360c0850160a0860161436a565b61313360e0860160c087016149cf565b61ffff16613148610100870160e08801614a8b565b61315a61012088016101008901614aab565b613939565b50565b61316a6130aa565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131f65760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610469565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020614cae8339815191529060ff165f03613254575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061329c9083614888565b106132b8576001600160401b03841660408301528082526132d7565b83826040018181516132ca91906145db565b6001600160401b03169052505b5f8260200151836040015160646132ee9190614995565b6132f89190614ac6565b600285015490915060ff90811690821611156133735760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610469565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f61094e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613b1e565b5f5f80516020614cae8339815191524261340d604086016020870161436a565b6001600160401b0316118015613446575061342e604085016020860161436a565b6001600160401b0316613444426202a3006148af565b115b6134a85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610469565b83356135005760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610469565b83355f908152600782016020526040902054156135705760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610469565b61357d6040850185614aeb565b90506030146135e45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610469565b6135ed83613216565b5f806136876040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613632919061436a565b6001600160401b0316815260200161364d60408a018a614aeb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613c80565b5f828152600586016020526040902091935091506136a58282614b78565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906136d29085906004016144c9565b6020604051808303815f875af11580156136ee573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061371291906144fb565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff1916600183600581111561379457613794614458565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161388991908e01908e0161436a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6138cb6001600160a01b03841683614025565b905080515f141580156138ef5750808060200190518101906138ed9190614c37565b155b156114e057604051635274afe760e01b81526001600160a01b0384166004820152602401610469565b6139206130aa565b613928614032565b613930614042565b61315f8161404a565b6139416130aa565b5f80516020614c6e833981519152836139ad5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610469565b6127108411156139cf5760405162461bcd60e51b8152600401610469906149ea565b85871115613a375760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610469565b600a60ff841611801590613a4d57505f8360ff16115b613ab75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610469565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613b64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b8891906144fb565b9050613b9f6001600160a01b0385163330866140b6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613be3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0791906144fb565b9050818111613c6d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610469565b613c778282614888565b95945050505050565b5f6060826080015151603014613cea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610469565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613d6157613d21816001614888565b613d2c9060086145c4565b5081515f90839083908110613d4357613d4361489b565b60200101906001600160f81b03191690815f1a905350600101613d0d565b505f5b6004811015613dbf57613d78816003614888565b613d839060086145c4565b505f82613d918360026148af565b81518110613da157613da161489b565b60200101906001600160f81b03191690815f1a905350600101613d64565b505f5b6020811015613e1c5784518160208110613dde57613dde61489b565b1a60f81b82613dee8360066148af565b81518110613dfe57613dfe61489b565b60200101906001600160f81b03191690815f1a905350600101613dc2565b505f5b6020811015613e7c5784602001518160208110613e3e57613e3e61489b565b1a60f81b82613e4e8360266148af565b81518110613e5e57613e5e61489b565b60200101906001600160f81b03191690815f1a905350600101613e1f565b505f5b6008811015613ef057613e93816007614888565b613e9e9060086145c4565b60ff1685604001516001600160401b0316901c60f81b82826046613ec291906148af565b81518110613ed257613ed261489b565b60200101906001600160f81b03191690815f1a905350600101613e7f565b505f5b6030811015613f5b5784608001518181518110613f1257613f1261489b565b01602001516001600160f81b03191682613f2d83604e6148af565b81518110613f3d57613f3d61489b565b60200101906001600160f81b03191690815f1a905350600101613ef3565b505f5b6008811015613fcd57613f72816007614888565b613f7d9060086145c4565b60608601516001600160401b0390811691161c60f81b82613f9f83607e6148af565b81518110613faf57613faf61489b565b60200101906001600160f81b03191690815f1a905350600101613f5e565b50600281604051613fde9190614c52565b602060405180830381855afa158015613ff9573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061401c91906144fb565b94909350915050565b6060610f5b83835f6140ef565b61403a6130aa565b6130f361417e565b6130f36130aa565b6140526130aa565b80355f80516020614cae83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561409c6060830160408401614a8b565b600291909101805460ff191660ff90921691909117905550565b6040516001600160a01b0384811660248301528381166044830152606482018390526109389186918216906323b872dd90608401613078565b6060814710156141145760405163cd78605960e01b8152306004820152602401610469565b5f80856001600160a01b0316848660405161412f9190614c52565b5f6040518083038185875af1925050503d805f8114614169576040519150601f19603f3d011682016040523d82523d5f602084013e61416e565b606091505b5091509150611777868383614186565b612cbf6130aa565b60608261419b57614196826141e2565b610f5b565b81511580156141b257506001600160a01b0384163b155b156141db57604051639996b31560e01b81526001600160a01b0385166004820152602401610469565b5080610f5b565b8051156141f25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614217906145fb565b5f825580601f10614226575050565b601f0160209004905f5260205f209081019061315f9190614286565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561429a575f8155600101614287565b5090565b801515811461315f575f80fd5b803563ffffffff811681146142be575f80fd5b919050565b5f805f606084860312156142d5575f80fd5b8335925060208401356142e78161429e565b91506142f5604085016142ab565b90509250925092565b5f6020828403121561430e575f80fd5b5035919050565b5f60208284031215614325575f80fd5b610f5b826142ab565b5f806040838503121561433f575f80fd5b614348836142ab565b946020939093013593505050565b6001600160401b038116811461315f575f80fd5b5f6020828403121561437a575f80fd5b8135610f5b81614356565b6001600160a01b038116811461315f575f80fd5b5f808284036101408112156143ac575f80fd5b610120808212156143bb575f80fd5b84935083013590506143cc81614385565b809150509250929050565b5f80604083850312156143e8575f80fd5b50508035926020909101359150565b5f805f838503608081121561440a575f80fd5b84356001600160401b0381111561441f575f80fd5b850160608188031215614430575f80fd5b93506040601f1982011215614443575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144a0576144a061446c565b5092915050565b5f5b838110156144c15781810151838201526020016144a9565b50505f910152565b602081525f82518060208401526144e78160408501602087016144a7565b601f01601f19169190910160400192915050565b5f6020828403121561450b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261453457614534614512565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b808202811582820484141761094e5761094e61446c565b6001600160401b038181168382160190808211156144a0576144a061446c565b600181811c9082168061460f57607f821691505b60208210810361462d57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461468c816145fb565b806020870152604060018084165f81146146ad57600181146146c9576146f6565b60ff19851660408a0152604084151560051b8a010195506146f6565b895f5260205f205f5b858110156146ed5781548b82018601529083019088016146d2565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561473a5761473a614704565b60405290565b604051601f8201601f191681016001600160401b038111828210171561476857614768614704565b604052919050565b80516142be8161429e565b5f806040838503121561478c575f80fd5b82516001600160401b03808211156147a2575f80fd5b90840190606082870312156147b5575f80fd5b6147bd614718565b825181526020808401516147d081614385565b828201526040840151838111156147e5575f80fd5b80850194505087601f8501126147f9575f80fd5b83518381111561480b5761480b614704565b61481d601f8201601f19168301614740565b93508084528882828701011115614832575f80fd5b614841818386018488016144a7565b50826040830152819550614856818801614770565b9450505050509250929050565b5f6001600160401b0380831681810361487e5761487e61446c565b6001019392505050565b8181038181111561094e5761094e61446c565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561094e5761094e61446c565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146149b8576149b861446c565b505092915050565b61ffff8116811461315f575f80fd5b5f602082840312156149df575f80fd5b8135610f5b816149c0565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614a40816149c0565b61ffff8116905081548161ffff1982161783556020840135614a6181614356565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614a9b575f80fd5b813560ff81168114610f5b575f80fd5b5f60208284031215614abb575f80fd5b8135610f5b81614385565b5f6001600160401b0380841680614adf57614adf614512565b92169190910492915050565b5f808335601e19843603018112614b00575f80fd5b8301803591506001600160401b03821115614b19575f80fd5b602001915036819003821315614b2d575f80fd5b9250929050565b601f8211156114e057805f5260205f20601f840160051c81016020851015614b595750805b601f840160051c820191505b81811015610d39575f8155600101614b65565b81516001600160401b03811115614b9157614b91614704565b614ba581614b9f84546145fb565b84614b34565b602080601f831160018114614bd8575f8415614bc15750858301515b5f19600386901b1c1916600185901b178555614c2f565b5f85815260208120601f198616915b82811015614c0657888601518255948401946001909101908401614be7565b5085821015614c2357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614c47575f80fd5b8151610f5b8161429e565b5f8251614c638184602087016144a7565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161599838038061599883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61584b8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806366435abf116100a9578063b771b3bc1161006e578063b771b3bc146102b0578063ba3a4b97146102d6578063be768a9d146102e9578063bee0a03f146102fc578063eb0acb891461030f575f80fd5b806366435abf1461025157806376f786211461026457806398f3e2b4146102775780639e1bc4ef1461028a578063a3a65e481461029d575f80fd5b806335455ded116100ef57806335455ded146101e9578063467ef06f146102055780635297fae614610218578063561404fd1461022b578063620658561461023e575f80fd5b80630118acc41461012b5780630322ed98146101405780630cdd098514610153578063151d30d1146101a45780632e2194d8146101be575b5f80fd5b61013e610139366004614b51565b610322565b005b61013e61014e366004614b8c565b61078c565b610191610161366004614b8c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101ac600a81565b60405160ff909116815260200161019b565b6101d16101cc366004614b8c565b610945565b6040516001600160401b03909116815260200161019b565b6101f261271081565b60405161ffff909116815260200161019b565b61013e610213366004614ba3565b61095b565b61013e610226366004614bbc565b6109ae565b61013e610239366004614be4565b610b83565b61019161024c366004614c48565b611289565b6101d161025f366004614b8c565b6112a2565b61013e610272366004614b51565b6112b6565b61013e610285366004614bbc565b611397565b610191610298366004614c61565b6115c4565b61013e6102ab366004614ba3565b6115f0565b6102be6005600160991b0181565b6040516001600160a01b03909116815260200161019b565b61013e6102e4366004614b8c565b6117a8565b61013e6102f7366004614c95565b611a2e565b61013e61030a366004614b8c565b611b12565b61019161031d366004614cf8565b611c26565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061577f833981519152918415610374576103718285611c5b565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103a6576103a6614d5d565b60048111156103b7576103b7614d5d565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561043e5761043e614d5d565b146104905760405162461bcd60e51b815260206004820152602a60248201525f8051602061579f8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104f55760405162461bcd60e51b815260206004820152603360248201525f8051602061579f8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610487565b5f6104ff84611ef7565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561054c5761054c614d5d565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61061e85611f87565b905082606001516001600160401b031681608001516001600160401b0316116106955760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610487565b5f836060015182608001516106aa9190614d85565b90506106b6868261207a565b5f6005600160991b0163ee5b48eb6106cf8987866120c2565b6040518263ffffffff1660e01b81526004016106eb9190614dce565b6020604051808303815f875af1158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b9190614e00565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061581f8339815191526020526040808220815160e0810190925280545f805160206157bf83398151915293929190829060ff1660058111156107d9576107d9614d5d565b60058111156107ea576107ea614d5d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561085957610859614d5d565b146108be5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610487565b6005600160991b016001600160a01b031663ee5b48eb6108e38584606001515f6120c2565b6040518263ffffffff1660e01b81526004016108ff9190614dce565b6020604051808303815f875af115801561091b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093f9190614e00565b50505050565b5f61095564e8d4a5100083614e2b565b92915050565b5f8051602061577f8339815191525f80610974846122e1565b6040808201515f84815260058801602052919091205492945090925061093f916001600160401b03909116906001600160a01b0316612646565b5f8051602061577f8339815191525f6109c68461267c565b90505f806109d7836040015161285d565b50915091505f6109e683611f87565b9050816001600160401b031681606001516001600160401b03161015610a1e5760405162461bcd60e51b815260040161048790614e3e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a635760405162461bcd60e51b815260040161048790614e80565b60015f87815260068701602052604090205460ff166004811115610a8957610a89614d5d565b14610af25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610487565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206157bf8339815191529060ff1615610c205760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610487565b5f610c2a8361267c565b90505f610c3a8260400151612a98565b90505f85356020870135610c516040890189614ec9565b604051602001610c649493929190614f12565b60408051601f1981840301815291905280519091505f5b81811015610cf7575f610c9160608a018a614f32565b83818110610ca157610ca1614f77565b9050602002810190610cb39190614f8b565b610cbc9061503b565b80516020808301516040808501519051949550610cdc94899493016150d2565b60408051601f19818403018152919052935050600101610c7b565b5082600283604051610d099190615121565b602060405180830381855afa158015610d24573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d479190614e00565b14610dab5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610487565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e129190614e00565b876020013514610e745760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610487565b610e816040880188614ec9565b9050601414610ee55760405162461bcd60e51b815260206004820152603a60248201525f805160206157df83398151915260448201527f746f72206d616e616765722061646472657373206c656e6774680000000000006064820152608401610487565b30610ef36040890189614ec9565b610efc91615132565b60601c14610f555760405162461bcd60e51b815260206004820152603360248201525f805160206157df833981519152604482015272746f72206d616e61676572206164647265737360681b6064820152608401610487565b5f610f636060890189614f32565b905011610fc25760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b6064820152608401610487565b5f5b81811015611270575f610fda60608a018a614f32565b83818110610fea57610fea614f77565b9050602002810190610ffc9190614f8b565b6110059061503b565b604080518b3560208201529081018490529091505f9060029060600160408051601f198184030181529082905261103b91615121565b602060405180830381855afa158015611056573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110799190614e00565b82519091508061109b5760405162461bcd60e51b815260040161048790615167565b5f81815260078a016020526040902054156110c85760405162461bcd60e51b8152600401610487906151a8565b8260400151516030146110ed5760405162461bcd60e51b8152600401610487906151f0565b5f81815260078a0160209081526040808320859055805160e081018252600180825287518285015287840180516001600160401b039081168486015260608401879052905116608083015260a0820185905260c0820185905286855260068e0190935292208251815491929091839160ff199091169083600581111561117557611175614d5d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905561121f82611ef7565b5082516020808501516040516001600160401b03909116815284917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101610fc4565b5050506008909201805460ff1916600117905550505050565b5f6109556001600160401b03831664e8d4a5100061523d565b5f6112ac82611f87565b6080015192915050565b5f8051602061577f8339815191525f6112ce85611f87565b5f86815260058401602052604090205460a082015191925061130191600160b01b9091046001600160401b031690615254565b6001600160401b03164210156113755760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610487565b8315611387576113858584611c5b565b505b61139085612c0c565b5050505050565b61139f612f02565b5f8051602061577f8339815191525f6113b78461267c565b90505f806113c8836040015161285d565b50915091505f6113d783611f87565b9050816001600160401b031681606001516001600160401b0316101561140f5760405162461bcd60e51b815260040161048790614e3e565b5f8681526006860160205260409020600301546001600160401b038084169116111561144d5760405162461bcd60e51b815260040161048790614e80565b60035f87815260068701602052604090205460ff16600481111561147357611473614d5d565b146114c75760405162461bcd60e51b815260206004820152603160248201525f8051602061579f8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610487565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261156c91612646565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506115c060015f805160206157ff83398151915255565b5050565b5f6115cd612f02565b6115d8833384612f4c565b905061095560015f805160206157ff83398151915255565b5f805160206157bf8339815191525f6116088361267c565b90505f8061161983604001516133bc565b915091508061167b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610487565b5f8281526005850160205260408120805461169590615274565b90501180156116c7575060015f83815260068601602052604090205460ff1660058111156116c5576116c5614d5d565b145b6116e35760405162461bcd60e51b8152600401610487906152ac565b5f82815260058501602052604081206116fb91614ae2565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061577f83398151915293929190829060ff16600481111561180957611809614d5d565b600481111561181a5761181a614d5d565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156118a1576118a1614d5d565b14806118bf57506003815160048111156118bd576118bd614d5d565b145b6119135760405162461bcd60e51b815260206004820152603260248201525f8051602061579f833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610487565b5f6119218260400151611f87565b905080606001516001600160401b03165f036119a55760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610487565b6005600160991b016001600160a01b031663ee5b48eb6119d28460400151846060015185608001516120c2565b6040518263ffffffff1660e01b81526004016119ee9190614dce565b6020604051808303815f875af1158015611a0a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113909190614e00565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a77575080546001600160401b03808416911610155b15611a955760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611ac0848461355d565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206157bf833981519152929190611b5a90615274565b9050118015611b8c575060015f83815260068301602052604090205460ff166005811115611b8a57611b8a614d5d565b145b611ba85760405162461bcd60e51b8152600401610487906152ac565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611be191906004016152e0565b6020604051808303815f875af1158015611bfd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c219190614e00565b505050565b5f611c2f612f02565b611c3b85858585613577565b9050611c5360015f805160206157ff83398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ca6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ccd9190810190615375565b9150915080611d305760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610487565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d979190614e00565b825114611dfb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610487565b60208201516001600160a01b031615611e715760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610487565b5f80611e808460400151613795565b91509150818714611eed5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610487565b9695505050505050565b5f8181525f8051602061581f8339815191526020526040812060020180545f805160206157bf83398151915291600160401b9091046001600160401b0316906008611f4183615447565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061581f83398151915290528390208351918201909352825491925f805160206157bf83398151915292829060ff16600581111561200757612007614d5d565b600581111561201857612018614d5d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f9182525f8051602061581f833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561213b576120fb81600161546c565b61210690600861523d565b5081515f9083908390811061211d5761211d614f77565b60200101906001600160f81b03191690815f1a9053506001016120e7565b505f5b600481101561219e5761215281600361546c565b61215d90600861523d565b6001901c60f81b8261217083600261547f565b8151811061218057612180614f77565b60200101906001600160f81b03191690815f1a90535060010161213e565b505f5b6020811015612200576121b581601f61546c565b6121c090600861523d565b86901c60f81b826121d283600661547f565b815181106121e2576121e2614f77565b60200101906001600160f81b03191690815f1a9053506001016121a1565b505f5b600881101561226b5761221781600761546c565b61222290600861523d565b6001600160401b038616901c60f81b8261223d83602661547f565b8151811061224d5761224d614f77565b60200101906001600160f81b03191690815f1a905350600101612203565b505f5b60088110156122d65761228281600761546c565b61228d90600861523d565b6001600160401b038516901c60f81b826122a883602e61547f565b815181106122b8576122b8614f77565b60200101906001600160f81b03191690815f1a90535060010161226e565b5090505b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206157bf8339815191525f6123308561267c565b90505f8061234183604001516133bc565b9150915080156123a65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610487565b5f828152600685016020526040808220815160e081019092528054829060ff1660058111156123d7576123d7614d5d565b60058111156123e8576123e8614d5d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561245957612459614d5d565b1480612477575060018251600581111561247557612475614d5d565b145b6124c35760405162461bcd60e51b815260206004820152602a60248201525f805160206157df833981519152604482015269746f722073746174757360b01b6064820152608401610487565b6003825160058111156124d8576124d8614d5d565b036124e5575060046124e9565b5060055b6020808301515f9081526007880190915260408120558181600581111561251257612512614d5d565b9081600581111561252557612525614d5d565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561255957612559614d5d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561260d5761260d614d5d565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546115c0906001600160a01b0316828461396d565b60408051606080820183525f8083526020830181905292820152905f805160206157bf8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156126f1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127189190810190615375565b915091508061277f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610487565b82548251146127e25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610487565b60208201516001600160a01b0316156128555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610487565b509392505050565b5f805f83516036146128815760405162461bcd60e51b815260040161048790615492565b5f805b60028110156128d05761289881600161546c565b6128a390600861523d565b61ffff168682815181106128b9576128b9614f77565b016020015160f81c901b9190911790600101612884565b5061ffff8116156128f35760405162461bcd60e51b8152600401610487906154db565b5f805b600481101561294e5761290a81600361546c565b61291590600861523d565b63ffffffff168761292783600261547f565b8151811061293757612937614f77565b016020015160f81c901b91909117906001016128f6565b5063ffffffff81166003146129755760405162461bcd60e51b81526004016104879061551e565b5f805b60208110156129ca5761298c81601f61546c565b61299790600861523d565b886129a383600661547f565b815181106129b3576129b3614f77565b016020015160f81c901b9190911790600101612978565b505f805b6008811015612a29576129e281600761546c565b6129ed90600861523d565b6001600160401b031689612a0283602661547f565b81518110612a1257612a12614f77565b016020015160f81c901b91909117906001016129ce565b505f805b6008811015612a8857612a4181600761546c565b612a4c90600861523d565b6001600160401b03168a612a6183602e61547f565b81518110612a7157612a71614f77565b016020015160f81c901b9190911790600101612a2d565b5091989097509095509350505050565b5f8151602614612aba5760405162461bcd60e51b815260040161048790615492565b5f805b6002811015612b0957612ad181600161546c565b612adc90600861523d565b61ffff16848281518110612af257612af2614f77565b016020015160f81c901b9190911790600101612abd565b5061ffff811615612b2c5760405162461bcd60e51b8152600401610487906154db565b5f805b6004811015612b8757612b4381600361546c565b612b4e90600861523d565b63ffffffff1685612b6083600261547f565b81518110612b7057612b70614f77565b016020015160f81c901b9190911790600101612b2f565b5063ffffffff8116600514612bae5760405162461bcd60e51b81526004016104879061551e565b5f805b6020811015612c0357612bc581601f61546c565b612bd090600861523d565b86612bdc83600661547f565b81518110612bec57612bec614f77565b016020015160f81c901b9190911790600101612bb1565b50949350505050565b5f8181525f8051602061581f8339815191526020526040808220815160e0810190925280545f805160206157bf83398151915293929190829060ff166005811115612c5957612c59614d5d565b6005811115612c6a57612c6a614d5d565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612cdc57612cdc614d5d565b14612d385760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610487565b612d4581608001516139cc565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115612d8957612d89614d5d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612e3e84612e3881611ef7565b5f6120c2565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612e6d908590600401614dce565b6020604051808303815f875af1158015612e89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ead9190614e00565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f805160206157ff833981519152805460011901612f3357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206157ff83398151915255565b5f5f8051602061577f83398151915281612f686101cc85613b6d565b90505f612f7487611f87565b9050600281516005811115612f8b57612f8b614d5d565b14612fea5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610487565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b031661307d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610487565b5f82826080015161308e9190615254565b600485015460408401519192506130b0916001600160401b0390911690615565565b6001600160401b0316816001600160401b0316111561312f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610487565b613139888261207a565b5f61314389611ef7565b90505f898260405160200161316f92919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050613190856139cc565b5f6005600160991b0163ee5b48eb6131a98d86886120c2565b6040518263ffffffff1660e01b81526004016131c59190614dce565b6020604051808303815f875af11580156131e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132059190614e00565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561328d5761328d614d5d565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146133df5760405162461bcd60e51b815260040161048790615492565b5f805b600281101561342e576133f681600161546c565b61340190600861523d565b61ffff1685828151811061341757613417614f77565b016020015160f81c901b91909117906001016133e2565b5061ffff8116156134515760405162461bcd60e51b8152600401610487906154db565b5f805b60048110156134ac5761346881600361546c565b61347390600861523d565b63ffffffff168661348583600261547f565b8151811061349557613495614f77565b016020015160f81c901b9190911790600101613454565b5063ffffffff81166002146134d35760405162461bcd60e51b81526004016104879061551e565b5f805b6020811015613528576134ea81601f61546c565b6134f590600861523d565b8761350183600661547f565b8151811061351157613511614f77565b016020015160f81c901b91909117906001016134d6565b505f8660268151811061353d5761353d614f77565b016020015191976001600160f81b03199092161515965090945050505050565b613565613ba3565b61356e82613bee565b6115c081613c69565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061577f8339815191529061ffff8616108015906135c3575061271061ffff861611155b6135df5760405162461bcd60e51b815260040161048790615588565b60028101546001600160401b0390811690851610156136585760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610487565b8054831080159061366d575080600101548311155b6136cb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610487565b5f6136d584613b6d565b90505f6136e182610945565b90505f6136ee8983613d1d565b905060405180606001604052806137023390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146137b85760405162461bcd60e51b815260040161048790615492565b5f805b6002811015613807576137cf81600161546c565b6137da90600861523d565b61ffff168582815181106137f0576137f0614f77565b016020015160f81c901b91909117906001016137bb565b5061ffff81161561382a5760405162461bcd60e51b8152600401610487906154db565b5f805b60048110156138855761384181600361546c565b61384c90600861523d565b63ffffffff168661385e83600261547f565b8151811061386e5761386e614f77565b016020015160f81c901b919091179060010161382d565b5063ffffffff81166004146138ac5760405162461bcd60e51b81526004016104879061551e565b5f805b6020811015613901576138c381601f61546c565b6138ce90600861523d565b876138da83600661547f565b815181106138ea576138ea614f77565b016020015160f81c901b91909117906001016138af565b505f805b60088110156139605761391981600761546c565b61392490600861523d565b6001600160401b03168861393983602661547f565b8151811061394957613949614f77565b016020015160f81c901b9190911790600101613905565b5090969095509350505050565b6040516001600160a01b03838116602483015260448201839052611c2191859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614191565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206157bf8339815191529060ff165f03613a0a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613a52908361546c565b10613a6e576001600160401b0384166040830152808252613a8d565b8382604001818151613a809190615254565b6001600160401b03169052505b5f826020015183604001516064613aa49190615565565b613aae91906155d3565b600285015490915060ff9081169082161115613b295760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610487565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610955827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906141f2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613bec57604051631afcd79f60e31b815260040160405180910390fd5b565b613bf6613ba3565b613c08613c0382806155f8565b614354565b613c1061436d565b613c6660208201356040830135613c2d6080850160608601614c48565b613c3d60a086016080870161560c565b61ffff16613c5160c0870160a08801615625565b613c6160e0880160c08901615645565b61437d565b50565b613c71613ba3565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613cfd5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610487565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613da85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610487565b5f805160206157bf83398151915242613dc76040860160208701614c48565b6001600160401b0316118015613e005750613de86040850160208601614c48565b6001600160401b0316613dfe426202a30061547f565b115b613e625760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610487565b8335613e805760405162461bcd60e51b815260040161048790615167565b83355f90815260078201602052604090205415613eaf5760405162461bcd60e51b8152600401610487906151a8565b613ebc6040850185614ec9565b9050603014613edd5760405162461bcd60e51b8152600401610487906151f0565b613ee6836139cc565b5f80613f806040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f2b9190614c48565b6001600160401b03168152602001613f4660408a018a614ec9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614562565b5f82815260058601602052604090209193509150613f9e82826156a4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613fcb908590600401614dce565b6020604051808303815f875af1158015613fe7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061400b9190614e00565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff1916600183600581111561408357614083614d5d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614163918e01908e01614c48565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6141a56001600160a01b03841683614907565b905080515f141580156141c95750808060200190518101906141c79190615763565b155b15611c2157604051635274afe760e01b81526001600160a01b0384166004820152602401610487565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614238573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061425c9190614e00565b90506142736001600160a01b038516333086614914565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156142b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142db9190614e00565b90508181116143415760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610487565b61434b828261546c565b95945050505050565b61435c613ba3565b61436461494d565b613c6681614955565b614375613ba3565b613bec6149cb565b614385613ba3565b5f8051602061577f833981519152836143f15760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610487565b6127108411156144135760405162461bcd60e51b815260040161048790615588565b8587111561447b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610487565b600a60ff84161180159061449157505f8360ff16115b6144fb5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610487565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146145cc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610487565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156146435761460381600161546c565b61460e90600861523d565b5081515f9083908390811061462557614625614f77565b60200101906001600160f81b03191690815f1a9053506001016145ef565b505f5b60048110156146a15761465a81600361546c565b61466590600861523d565b505f8261467383600261547f565b8151811061468357614683614f77565b60200101906001600160f81b03191690815f1a905350600101614646565b505f5b60208110156146fe57845181602081106146c0576146c0614f77565b1a60f81b826146d083600661547f565b815181106146e0576146e0614f77565b60200101906001600160f81b03191690815f1a9053506001016146a4565b505f5b602081101561475e578460200151816020811061472057614720614f77565b1a60f81b8261473083602661547f565b8151811061474057614740614f77565b60200101906001600160f81b03191690815f1a905350600101614701565b505f5b60088110156147d25761477581600761546c565b61478090600861523d565b60ff1685604001516001600160401b0316901c60f81b828260466147a4919061547f565b815181106147b4576147b4614f77565b60200101906001600160f81b03191690815f1a905350600101614761565b505f5b603081101561483d57846080015181815181106147f4576147f4614f77565b01602001516001600160f81b0319168261480f83604e61547f565b8151811061481f5761481f614f77565b60200101906001600160f81b03191690815f1a9053506001016147d5565b505f5b60088110156148af5761485481600761546c565b61485f90600861523d565b60608601516001600160401b0390811691161c60f81b8261488183607e61547f565b8151811061489157614891614f77565b60200101906001600160f81b03191690815f1a905350600101614840565b506002816040516148c09190615121565b602060405180830381855afa1580156148db573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906148fe9190614e00565b94909350915050565b60606122da83835f6149d3565b6040516001600160a01b03848116602483015283811660448301526064820183905261093f9186918216906323b872dd9060840161399a565b613bec613ba3565b61495d613ba3565b80355f805160206157bf83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556149a76060830160408401615625565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612f39613ba3565b6060814710156149f85760405163cd78605960e01b8152306004820152602401610487565b5f80856001600160a01b03168486604051614a139190615121565b5f6040518083038185875af1925050503d805f8114614a4d576040519150601f19603f3d011682016040523d82523d5f602084013e614a52565b606091505b5091509150611eed868383606082614a7257614a6d82614ab9565b6122da565b8151158015614a8957506001600160a01b0384163b155b15614ab257604051639996b31560e01b81526001600160a01b0385166004820152602401610487565b50806122da565b805115614ac95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614aee90615274565b5f825580601f10614afd575050565b601f0160209004905f5260205f2090810190613c6691905b80821115614b28575f8155600101614b15565b5090565b8015158114613c66575f80fd5b803563ffffffff81168114614b4c575f80fd5b919050565b5f805f60608486031215614b63575f80fd5b833592506020840135614b7581614b2c565b9150614b8360408501614b39565b90509250925092565b5f60208284031215614b9c575f80fd5b5035919050565b5f60208284031215614bb3575f80fd5b6122da82614b39565b5f8060408385031215614bcd575f80fd5b614bd683614b39565b946020939093013593505050565b5f8060408385031215614bf5575f80fd5b82356001600160401b03811115614c0a575f80fd5b830160808186031215614c1b575f80fd5b9150614c2960208401614b39565b90509250929050565b80356001600160401b0381168114614b4c575f80fd5b5f60208284031215614c58575f80fd5b6122da82614c32565b5f8060408385031215614c72575f80fd5b50508035926020909101359150565b6001600160a01b0381168114613c66575f80fd5b5f8060408385031215614ca6575f80fd5b82356001600160401b03811115614cbb575f80fd5b830160e08186031215614ccc575f80fd5b91506020830135614cdc81614c81565b809150509250929050565b803561ffff81168114614b4c575f80fd5b5f805f8060808587031215614d0b575f80fd5b84356001600160401b03811115614d20575f80fd5b850160608188031215614d31575f80fd5b9350614d3f60208601614ce7565b9250614d4d60408601614c32565b9396929550929360600135925050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614da557614da5614d71565b5092915050565b5f5b83811015614dc6578181015183820152602001614dae565b50505f910152565b602081525f8251806020840152614dec816040850160208701614dac565b601f01601f19169190910160400192915050565b5f60208284031215614e10575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614e3957614e39614e17565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f808335601e19843603018112614ede575f80fd5b8301803591506001600160401b03821115614ef7575f80fd5b602001915036819003821315614f0b575f80fd5b9250929050565b848152836020820152818360408301375f91016040019081529392505050565b5f808335601e19843603018112614f47575f80fd5b8301803591506001600160401b03821115614f60575f80fd5b6020019150600581901b3603821315614f0b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614f9f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614fdf57614fdf614fa9565b60405290565b604051601f8201601f191681016001600160401b038111828210171561500d5761500d614fa9565b604052919050565b5f6001600160401b0382111561502d5761502d614fa9565b50601f01601f191660200190565b5f6060823603121561504b575f80fd5b615053614fbd565b823581526020615064818501614c32565b8183015260408401356001600160401b03811115615080575f80fd5b840136601f820112615090575f80fd5b80356150a361509e82615015565b614fe5565b81815236848385010111156150b6575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f85516150e3818460208a01614dac565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615113816028840160208801614dac565b016028019695505050505050565b5f8251614f9f818460208701614dac565b6bffffffffffffffffffffffff19813581811691601485101561515f5780818660140360031b1b83161692505b505092915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b808202811582820484141761095557610955614d71565b6001600160401b03818116838216019080821115614da557614da5614d71565b600181811c9082168061528857607f821691505b6020821081036152a657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201525f805160206157df8339815191526040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546152f281615274565b806020870152604060018084165f8114615313576001811461532f5761535c565b60ff19851660408a0152604084151560051b8a0101955061535c565b895f5260205f205f5b858110156153535781548b8201860152908301908801615338565b8a016040019650505b509398975050505050505050565b8051614b4c81614b2c565b5f8060408385031215615386575f80fd5b82516001600160401b038082111561539c575f80fd5b90840190606082870312156153af575f80fd5b6153b7614fbd565b825181526020808401516153ca81614c81565b828201526040840151838111156153df575f80fd5b80850194505087601f8501126153f3575f80fd5b8351925061540361509e84615015565b8381528882858701011115615416575f80fd5b61542584838301848801614dac565b8060408401525081955061543a81880161536a565b9450505050509250929050565b5f6001600160401b0380831681810361546257615462614d71565b6001019392505050565b8181038181111561095557610955614d71565b8082018082111561095557610955614d71565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461515f5761515f614d71565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b03808416806155ec576155ec614e17565b92169190910492915050565b5f8235609e19833603018112614f9f575f80fd5b5f6020828403121561561c575f80fd5b6122da82614ce7565b5f60208284031215615635575f80fd5b813560ff811681146122da575f80fd5b5f60208284031215615655575f80fd5b81356122da81614c81565b601f821115611c2157805f5260205f20601f840160051c810160208510156156855750805b601f840160051c820191505b81811015611390575f8155600101615691565b81516001600160401b038111156156bd576156bd614fa9565b6156d1816156cb8454615274565b84615660565b602080601f831160018114615704575f84156156ed5750858301515b5f19600386901b1c1916600185901b17855561575b565b5f85815260208120601f198616915b8281101561573257888601518255948401946001909101908401615713565b508582101561574f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615773575f80fd5b81516122da81614b2c56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0056616c696461746f724d616e616765723a20696e76616c69642076616c6964619b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -534,23 +545,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x6f5f1c94. +// Initialize is a paid mutator transaction binding the contract method 0xbe768a9d. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint16,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8,(bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]),uint32),uint256,uint256,uint64,uint16,uint8,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 0x6f5f1c94. +// Initialize is a paid mutator transaction binding the contract method 0xbe768a9d. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint16,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8,(bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]),uint32),uint256,uint256,uint64,uint16,uint8,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 0x6f5f1c94. +// Initialize is a paid mutator transaction binding the contract method 0xbe768a9d. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint16,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8,(bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]),uint32),uint256,uint256,uint64,uint16,uint8,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) } @@ -618,25 +629,46 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init return _ERC20TokenStakingManager.Contract.InitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xa13fd29d. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements, uint256 stakeAmount) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements, stakeAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, requirements, stakeAmount) +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xa13fd29d. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements, uint256 stakeAmount) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements, stakeAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, requirements, stakeAmount) +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorSet(&_ERC20TokenStakingManager.TransactOpts, subnetConversionData, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xa13fd29d. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements, uint256 stakeAmount) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements, stakeAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, requirements, stakeAmount) +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorSet(&_ERC20TokenStakingManager.TransactOpts, subnetConversionData, messageIndex) } // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. @@ -1358,6 +1390,160 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegato return event, nil } +// ERC20TokenStakingManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerInitialValidatorCreatedIterator struct { + Event *ERC20TokenStakingManagerInitialValidatorCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerInitialValidatorCreated struct { + ValidationID [32]byte + NodeID [32]byte + Weight *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*ERC20TokenStakingManagerInitialValidatorCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerInitialValidatorCreatedIterator{contract: _ERC20TokenStakingManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil +} + +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerInitialValidatorCreated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*ERC20TokenStakingManagerInitialValidatorCreated, error) { + event := new(ERC20TokenStakingManagerInitialValidatorCreated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // ERC20TokenStakingManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerInitializedIterator struct { Event *ERC20TokenStakingManagerInitialized // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 2e6f977e2..98bf3fa8e 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -29,6 +29,13 @@ var ( _ = abi.ConvertType ) +// InitialValidator is an auto generated low-level Go binding around an user-defined struct. +type InitialValidator struct { + NodeID [32]byte + Weight uint64 + BlsPublicKey []byte +} + // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type PoSValidatorManagerSettings struct { BaseSettings ValidatorManagerSettings @@ -40,17 +47,21 @@ type PoSValidatorManagerSettings struct { RewardCalculator common.Address } -// PoSValidatorRequirements is an auto generated low-level Go binding around an user-defined struct. -type PoSValidatorRequirements struct { - DelegationFeeBips uint16 - MinStakeDuration uint64 +// SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. +type SubnetConversionData struct { + ConvertSubnetTxID [32]byte + BlockchainID [32]byte + ValidatorManagerAddress []byte + InitialValidators []InitialValidator } // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { - PChainBlockchainID [32]byte - SubnetID [32]byte - MaximumHourlyChurn uint8 + PChainBlockchainID [32]byte + SubnetID [32]byte + MaximumHourlyChurn uint8 + SubnetConversionData SubnetConversionData + MessageIndex uint32 } // ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. @@ -62,8 +73,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614aa3380380614aa383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6149568061014d5f395ff3fe608060405260043610610110575f3560e01c806366435abf1161009d578063b771b3bc11610062578063b771b3bc14610322578063ba3a4b9714610354578063bee0a03f14610373578063c123c6db14610392578063c599e24f146103b1575f80fd5b806366435abf1461029357806376f78621146102b257806380a8ad94146102d157806398f3e2b4146102e4578063a3a65e4814610303575f80fd5b80632e2194d8116100e35780632e2194d8146101d757806335455ded1461020e578063467ef06f146102365780635297fae6146102555780636206585614610274575f80fd5b80630118acc4146101145780630322ed98146101355780630cdd098514610154578063151d30d1146101b1575b5f80fd5b34801561011f575f80fd5b5061013361012e366004613f6f565b6103c4565b005b348015610140575f80fd5b5061013361014f366004613faa565b61082e565b34801561015f575f80fd5b5061019e61016e366004613faa565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101bc575f80fd5b506101c5600a81565b60405160ff90911681526020016101a8565b3480156101e2575f80fd5b506101f66101f1366004613faa565b6109fe565b6040516001600160401b0390911681526020016101a8565b348015610219575f80fd5b5061022361271081565b60405161ffff90911681526020016101a8565b348015610241575f80fd5b50610133610250366004613fc1565b610a14565b348015610260575f80fd5b5061013361026f366004613fda565b610a3f565b34801561027f575f80fd5b5061019e61028e366004614016565b610c0f565b34801561029e575f80fd5b506101f66102ad366004613faa565b610c28565b3480156102bd575f80fd5b506101336102cc366004613f6f565b610c3c565b61019e6102df366004614031565b610d1c565b3480156102ef575f80fd5b506101336102fe366004613fda565b610d48565b34801561030e575f80fd5b5061013361031d366004613fc1565b610f57565b34801561032d575f80fd5b5061033c6005600160991b0181565b6040516001600160a01b0390911681526020016101a8565b34801561035f575f80fd5b5061013361036e366004613faa565b611114565b34801561037e575f80fd5b5061013361038d366004613faa565b61139a565b34801561039d575f80fd5b506101336103ac36600461408a565b6114ae565b61019e6103bf366004613faa565b611590565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206148aa83398151915291841561041657610413828561159c565b90505b5f868152600684016020526040808220815161010081019092528054829060ff166004811115610448576104486140a1565b6004811115610459576104596140a1565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104e0576104e06140a1565b146105325760405162461bcd60e51b815260206004820152602a60248201525f805160206148ca8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105975760405162461bcd60e51b815260206004820152603360248201525f805160206148ca8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610529565b5f6105a184611838565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105ee576105ee6140a1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106c0856118ba565b905082606001516001600160401b03168160a001516001600160401b0316116107375760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610529565b5f83606001518260a0015161074c91906140c9565b90506107588682611999565b5f6005600160991b0163ee5b48eb6107718987866119e1565b6040518263ffffffff1660e01b815260040161078d9190614112565b6020604051808303815f875af11580156107a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107cd9190614144565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061492a83398151915260205260408082208151610100810190925280545f805160206148ea83398151915293929190829060ff16600581111561087c5761087c6140a1565b600581111561088d5761088d6140a1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610912576109126140a1565b146109775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610529565b6005600160991b016001600160a01b031663ee5b48eb61099c8584608001515f6119e1565b6040518263ffffffff1660e01b81526004016109b89190614112565b6020604051808303815f875af11580156109d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109f89190614144565b50505050565b5f610a0e64e8d4a510008361416f565b92915050565b5f610a1e82611c00565b9050610a3b81606001516001600160401b03168260400151611f73565b5050565b5f805160206148aa8339815191525f610a5784611f86565b90505f80610a688360400151612167565b50915091505f610a77836118ba565b9050816001600160401b031681608001516001600160401b03161015610aaf5760405162461bcd60e51b815260040161052990614182565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610af45760405162461bcd60e51b8152600401610529906141c4565b60015f87815260068701602052604090205460ff166004811115610b1a57610b1a6140a1565b14610b835760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610529565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a0e6001600160401b03831664e8d4a5100061420d565b5f610c32826118ba565b60a0015192915050565b5f805160206148aa8339815191525f610c54856118ba565b5f86815260058401602052604090205460c0820151919250610c8691620100009091046001600160401b031690614224565b6001600160401b0316421015610cfa5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610529565b8315610d0c57610d0a858461159c565b505b610d15856123a2565b5050505050565b5f610d25612740565b610d30838334612777565b9050610a0e60015f8051602061490a83398151915255565b5f805160206148aa8339815191525f610d6084611f86565b90505f80610d718360400151612167565b50915091505f610d80836118ba565b9050816001600160401b031681608001516001600160401b03161015610db85760405162461bcd60e51b815260040161052990614182565b5f8681526006860160205260409020600301546001600160401b0380841691161115610df65760405162461bcd60e51b8152600401610529906141c4565b60035f87815260068701602052604090205460ff166004811115610e1c57610e1c6140a1565b14610e705760405162461bcd60e51b815260206004820152603160248201525f805160206148ca8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610529565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f1591611f73565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206148ea8339815191525f610f6f83611f86565b90505f80610f80836040015161294e565b9150915080610fe25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610529565b5f82815260058501602052604081208054610ffc90614244565b905011801561102e575060015f83815260068601602052604090205460ff16600581111561102c5761102c6140a1565b145b61104a5760405162461bcd60e51b815260040161052990614276565b5f828152600585016020526040812061106291613eb7565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206148aa83398151915293929190829060ff166004811115611175576111756140a1565b6004811115611186576111866140a1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561120d5761120d6140a1565b148061122b5750600381516004811115611229576112296140a1565b145b61127f5760405162461bcd60e51b815260206004820152603260248201525f805160206148ca833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610529565b5f61128d82604001516118ba565b905080608001516001600160401b03165f036113115760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610529565b6005600160991b016001600160a01b031663ee5b48eb61133e846040015184608001518560a001516119e1565b6040518263ffffffff1660e01b815260040161135a9190614112565b6020604051808303815f875af1158015611376573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d159190614144565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206148ea8339815191529291906113e290614244565b9050118015611414575060015f83815260068301602052604090205460ff166005811115611412576114126140a1565b145b6114305760405162461bcd60e51b815260040161052990614276565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161146991906004016142bd565b6020604051808303815f875af1158015611485573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114a99190614144565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806114f7575080546001600160401b03808416911610155b156115155760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561153f83612aef565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a0e823334612b03565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115e7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261160e91908101906143d2565b91509150806116715760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610529565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116d89190614144565b82511461173c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610529565b60208201516001600160a01b0316156117b25760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610529565b5f806117c18460400151612ef5565b9150915081871461182e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610529565b9695505050505050565b5f8181525f8051602061492a8339815191526020526040812060030180545f805160206148ea833981519152916001600160401b03909116908361187b836144ba565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b6118c2613eee565b5f8281525f8051602061492a8339815191526020526040908190208151610100810190925280545f805160206148ea833981519152929190829060ff166005811115611910576119106140a1565b6005811115611921576119216140a1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f9182525f8051602061492a833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a5a57611a1a8160016144df565b611a2590600861420d565b5081515f90839083908110611a3c57611a3c6144f2565b60200101906001600160f81b03191690815f1a905350600101611a06565b505f5b6004811015611abd57611a718160036144df565b611a7c90600861420d565b6001901c60f81b82611a8f836002614506565b81518110611a9f57611a9f6144f2565b60200101906001600160f81b03191690815f1a905350600101611a5d565b505f5b6020811015611b1f57611ad481601f6144df565b611adf90600861420d565b86901c60f81b82611af1836006614506565b81518110611b0157611b016144f2565b60200101906001600160f81b03191690815f1a905350600101611ac0565b505f5b6008811015611b8a57611b368160076144df565b611b4190600861420d565b6001600160401b038616901c60f81b82611b5c836026614506565b81518110611b6c57611b6c6144f2565b60200101906001600160f81b03191690815f1a905350600101611b22565b505f5b6008811015611bf557611ba18160076144df565b611bac90600861420d565b6001600160401b038516901c60f81b82611bc783602e614506565b81518110611bd757611bd76144f2565b60200101906001600160f81b03191690815f1a905350600101611b8d565b5090505b9392505050565b611c08613eee565b5f805160206148ea8339815191525f611c2084611f86565b90505f80611c31836040015161294e565b915091508015611c965760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610529565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115611cc857611cc86140a1565b6005811115611cd957611cd96140a1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d6057611d606140a1565b1480611d7e5750600182516005811115611d7c57611d7c6140a1565b145b611ddd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610529565b600382516005811115611df257611df26140a1565b03611dff57506004611e03565b5060055b6020808301515f90815260078801909152604081205581816005811115611e2c57611e2c6140a1565b90816005811115611e3f57611e3f6140a1565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115611e7357611e736140a1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f3e57611f3e6140a1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610a3b6001600160a01b038216836130cd565b60408051606080820183525f8083526020830181905292820152905f805160206148ea8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ffb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261202291908101906143d2565b91509150806120895760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610529565b82548251146120ec5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610529565b60208201516001600160a01b03161561215f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610529565b509392505050565b5f805f835160361461218b5760405162461bcd60e51b815260040161052990614519565b5f805b60028110156121da576121a28160016144df565b6121ad90600861420d565b61ffff168682815181106121c3576121c36144f2565b016020015160f81c901b919091179060010161218e565b5061ffff8116156121fd5760405162461bcd60e51b815260040161052990614562565b5f805b6004811015612258576122148160036144df565b61221f90600861420d565b63ffffffff1687612231836002614506565b81518110612241576122416144f2565b016020015160f81c901b9190911790600101612200565b5063ffffffff811660031461227f5760405162461bcd60e51b8152600401610529906145a5565b5f805b60208110156122d45761229681601f6144df565b6122a190600861420d565b886122ad836006614506565b815181106122bd576122bd6144f2565b016020015160f81c901b9190911790600101612282565b505f805b6008811015612333576122ec8160076144df565b6122f790600861420d565b6001600160401b03168961230c836026614506565b8151811061231c5761231c6144f2565b016020015160f81c901b91909117906001016122d8565b505f805b60088110156123925761234b8160076144df565b61235690600861420d565b6001600160401b03168a61236b83602e614506565b8151811061237b5761237b6144f2565b016020015160f81c901b9190911790600101612337565b5091989097509095509350505050565b5f8181525f8051602061492a83398151915260205260408082208151610100810190925280545f805160206148ea83398151915293929190829060ff1660058111156123f0576123f06140a1565b6005811115612401576124016140a1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612489576124896140a1565b146124e55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610529565b60408101516001600160a01b0316336001600160a01b03161461255f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610529565b61256c8160a00151613160565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156125b0576125b06140a1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61267c8461267681611838565b5f6119e1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126ab908590600401614112565b6020604051808303815f875af11580156126c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126eb9190614144565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8051602061490a83398151915280546001190161277157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206148aa833981519152906001600160401b03166127c36040860160208701614016565b6001600160401b031610156128325760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610529565b600381015461284460208601866145fb565b61ffff1610158015612868575061271061286160208601866145fb565b61ffff1611155b6128845760405162461bcd60e51b815260040161052990614616565b80548310801590612899575080600101548311155b6128f75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610529565b825f612902826109fe565b90505f61290f8883613301565b5f8181526005860160205260409020909150879061292d8282614661565b509098975050505050505050565b60015f8051602061490a83398151915255565b5f8082516027146129715760405162461bcd60e51b815260040161052990614519565b5f805b60028110156129c0576129888160016144df565b61299390600861420d565b61ffff168582815181106129a9576129a96144f2565b016020015160f81c901b9190911790600101612974565b5061ffff8116156129e35760405162461bcd60e51b815260040161052990614562565b5f805b6004811015612a3e576129fa8160036144df565b612a0590600861420d565b63ffffffff1686612a17836002614506565b81518110612a2757612a276144f2565b016020015160f81c901b91909117906001016129e6565b5063ffffffff8116600214612a655760405162461bcd60e51b8152600401610529906145a5565b5f805b6020811015612aba57612a7c81601f6144df565b612a8790600861420d565b87612a93836006614506565b81518110612aa357612aa36144f2565b016020015160f81c901b9190911790600101612a68565b505f86602681518110612acf57612acf6144f2565b016020015191976001600160f81b03199092161515965090945050505050565b612af76137cb565b612b0081613816565b50565b5f612b0c612740565b5f805160206148aa8339815191525f612b24846109fe565b90505f612b30876118ba565b9050600281516005811115612b4757612b476140a1565b14612ba65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610529565b5f828260a00151612bb79190614224565b60048501546060840151919250612bd9916001600160401b03909116906146b7565b6001600160401b0316816001600160401b03161115612c585760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610529565b612c628882611999565b5f612c6c89611838565b90505f8982604051602001612c9892919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050612cb985613160565b5f6005600160991b0163ee5b48eb612cd28d86886119e1565b6040518263ffffffff1660e01b8152600401612cee9190614112565b6020604051808303815f875af1158015612d0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d2e9190614144565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612db657612db66140a1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611bf960015f8051602061490a83398151915255565b5f808251602e14612f185760405162461bcd60e51b815260040161052990614519565b5f805b6002811015612f6757612f2f8160016144df565b612f3a90600861420d565b61ffff16858281518110612f5057612f506144f2565b016020015160f81c901b9190911790600101612f1b565b5061ffff811615612f8a5760405162461bcd60e51b815260040161052990614562565b5f805b6004811015612fe557612fa18160036144df565b612fac90600861420d565b63ffffffff1686612fbe836002614506565b81518110612fce57612fce6144f2565b016020015160f81c901b9190911790600101612f8d565b5063ffffffff811660041461300c5760405162461bcd60e51b8152600401610529906145a5565b5f805b60208110156130615761302381601f6144df565b61302e90600861420d565b8761303a836006614506565b8151811061304a5761304a6144f2565b016020015160f81c901b919091179060010161300f565b505f805b60088110156130c0576130798160076144df565b61308490600861420d565b6001600160401b031688613099836026614506565b815181106130a9576130a96144f2565b016020015160f81c901b9190911790600101613065565b5090969095509350505050565b804710156130f05760405163cd78605960e01b8152306004820152602401610529565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613139576040519150601f19603f3d011682016040523d82523d5f602084013e61313e565b606091505b50509050806114a957604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206148ea8339815191529060ff165f0361319e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906131e690836144df565b10613202576001600160401b0384166040830152808252613221565b83826040018181516132149190614224565b6001600160401b03169052505b5f82602001518360400151606461323891906146b7565b61324291906146e2565b600285015490915060ff90811690821611156132bd5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610529565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f5f805160206148ea833981519152426133216040860160208701614016565b6001600160401b031611801561335a57506133426040850160208601614016565b6001600160401b0316613358426202a300614506565b115b6133bc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610529565b83356134145760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610529565b83355f908152600782016020526040902054156134845760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610529565b6134916040850185614707565b90506030146134f85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610529565b61350183613160565b5f8061359b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906135469190614016565b6001600160401b0316815260200161356160408a018a614707565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613880565b5f828152600586016020526040902091935091506135b98282614794565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906135e6908590600401614112565b6020604051808303815f875af1158015613602573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136269190614144565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff191660018360058111156136a8576136a86140a1565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161379d91908e01908e01614016565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661381457604051631afcd79f60e31b815260040160405180910390fd5b565b61381e6137cb565b61382781613c25565b612b006060820135608083013561384460c0850160a08601614016565b61385460e0860160c087016145fb565b61ffff16613869610100870160e08801614853565b61387b61012088016101008901614873565b613c46565b5f60608260800151516030146138ea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610529565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613961576139218160016144df565b61392c90600861420d565b5081515f90839083908110613943576139436144f2565b60200101906001600160f81b03191690815f1a90535060010161390d565b505f5b60048110156139bf576139788160036144df565b61398390600861420d565b505f82613991836002614506565b815181106139a1576139a16144f2565b60200101906001600160f81b03191690815f1a905350600101613964565b505f5b6020811015613a1c57845181602081106139de576139de6144f2565b1a60f81b826139ee836006614506565b815181106139fe576139fe6144f2565b60200101906001600160f81b03191690815f1a9053506001016139c2565b505f5b6020811015613a7c5784602001518160208110613a3e57613a3e6144f2565b1a60f81b82613a4e836026614506565b81518110613a5e57613a5e6144f2565b60200101906001600160f81b03191690815f1a905350600101613a1f565b505f5b6008811015613af057613a938160076144df565b613a9e90600861420d565b60ff1685604001516001600160401b0316901c60f81b82826046613ac29190614506565b81518110613ad257613ad26144f2565b60200101906001600160f81b03191690815f1a905350600101613a7f565b505f5b6030811015613b5b5784608001518181518110613b1257613b126144f2565b01602001516001600160f81b03191682613b2d83604e614506565b81518110613b3d57613b3d6144f2565b60200101906001600160f81b03191690815f1a905350600101613af3565b505f5b6008811015613bcd57613b728160076144df565b613b7d90600861420d565b60608601516001600160401b0390811691161c60f81b82613b9f83607e614506565b81518110613baf57613baf6144f2565b60200101906001600160f81b03191690815f1a905350600101613b5e565b50600281604051613bde919061488e565b602060405180830381855afa158015613bf9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613c1c9190614144565b94909350915050565b613c2d6137cb565b613c35613e2b565b613c3d613e3b565b612b0081613e43565b613c4e6137cb565b5f805160206148aa83398151915283613cba5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610529565b612710841115613cdc5760405162461bcd60e51b815260040161052990614616565b85871115613d445760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610529565b600a60ff841611801590613d5a57505f8360ff16115b613dc45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610529565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b613e336137cb565b613814613eaf565b6138146137cb565b613e4b6137cb565b80355f805160206148ea83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155613e956060830160408401614853565b600291909101805460ff191660ff90921691909117905550565b61293b6137cb565b508054613ec390614244565b5f825580601f10613ed2575050565b601f0160209004905f5260205f2090810190612b009190613f32565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115613f46575f8155600101613f33565b5090565b8015158114612b00575f80fd5b803563ffffffff81168114613f6a575f80fd5b919050565b5f805f60608486031215613f81575f80fd5b833592506020840135613f9381613f4a565b9150613fa160408501613f57565b90509250925092565b5f60208284031215613fba575f80fd5b5035919050565b5f60208284031215613fd1575f80fd5b611bf982613f57565b5f8060408385031215613feb575f80fd5b613ff483613f57565b946020939093013593505050565b6001600160401b0381168114612b00575f80fd5b5f60208284031215614026575f80fd5b8135611bf981614002565b5f808284036060811215614043575f80fd5b83356001600160401b03811115614058575f80fd5b840160608187031215614069575f80fd5b92506040601f198201121561407c575f80fd5b506020830190509250929050565b5f610120828403121561409b575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156140e9576140e96140b5565b5092915050565b5f5b8381101561410a5781810151838201526020016140f2565b50505f910152565b602081525f82518060208401526141308160408501602087016140f0565b601f01601f19169190910160400192915050565b5f60208284031215614154575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f8261417d5761417d61415b565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a0e57610a0e6140b5565b6001600160401b038181168382160190808211156140e9576140e96140b5565b600181811c9082168061425857607f821691505b60208210810361409b57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546142cf81614244565b806020870152604060018084165f81146142f0576001811461430c57614339565b60ff19851660408a0152604084151560051b8a01019550614339565b895f5260205f205f5b858110156143305781548b8201860152908301908801614315565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561437d5761437d614347565b60405290565b604051601f8201601f191681016001600160401b03811182821017156143ab576143ab614347565b604052919050565b6001600160a01b0381168114612b00575f80fd5b8051613f6a81613f4a565b5f80604083850312156143e3575f80fd5b82516001600160401b03808211156143f9575f80fd5b908401906060828703121561440c575f80fd5b61441461435b565b82518152602080840151614427816143b3565b8282015260408401518381111561443c575f80fd5b80850194505087601f850112614450575f80fd5b83518381111561446257614462614347565b614474601f8201601f19168301614383565b93508084528882828701011115614489575f80fd5b614498818386018488016140f0565b508260408301528195506144ad8188016143c7565b9450505050509250929050565b5f6001600160401b038083168181036144d5576144d56140b5565b6001019392505050565b81810381811115610a0e57610a0e6140b5565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610a0e57610a0e6140b5565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114612b00575f80fd5b5f6020828403121561460b575f80fd5b8135611bf9816145ec565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561466c816145ec565b61ffff8116905081548161ffff198216178355602084013561468d81614002565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b038181168382160280821691908281146146da576146da6140b5565b505092915050565b5f6001600160401b03808416806146fb576146fb61415b565b92169190910492915050565b5f808335601e1984360301811261471c575f80fd5b8301803591506001600160401b03821115614735575f80fd5b602001915036819003821315614749575f80fd5b9250929050565b601f8211156114a957805f5260205f20601f840160051c810160208510156147755750805b601f840160051c820191505b81811015610d15575f8155600101614781565b81516001600160401b038111156147ad576147ad614347565b6147c1816147bb8454614244565b84614750565b602080601f8311600181146147f4575f84156147dd5750858301515b5f19600386901b1c1916600185901b17855561484b565b5f85815260208120601f198616915b8281101561482257888601518255948401946001909101908401614803565b508582101561483f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614863575f80fd5b813560ff81168114611bf9575f80fd5b5f60208284031215614883575f80fd5b8135611bf9816143b3565b5f825161489f8184602087016140f0565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516155e63803806155e683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154998061014d5f395ff3fe60806040526004361061011b575f3560e01c8063561404fd1161009d578063a3a65e4811610062578063a3a65e481461034c578063b771b3bc1461036b578063ba3a4b971461039d578063bee0a03f146103bc578063c599e24f146103db575f80fd5b8063561404fd146102b157806362065856146102d057806366435abf146102ef57806376f786211461030e57806398f3e2b41461032d575f80fd5b806335455ded116100e357806335455ded146102195780633d68fe291461024157806340034a9314610260578063467ef06f146102735780635297fae614610292575f80fd5b80630118acc41461011f5780630322ed98146101405780630cdd09851461015f578063151d30d1146101bc5780632e2194d8146101e2575b5f80fd5b34801561012a575f80fd5b5061013e610139366004614807565b6103ee565b005b34801561014b575f80fd5b5061013e61015a366004614842565b610858565b34801561016a575f80fd5b506101a9610179366004614842565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101c7575f80fd5b506101d0600a81565b60405160ff90911681526020016101b3565b3480156101ed575f80fd5b506102016101fc366004614842565b610a11565b6040516001600160401b0390911681526020016101b3565b348015610224575f80fd5b5061022e61271081565b60405161ffff90911681526020016101b3565b34801561024c575f80fd5b5061013e61025b366004614859565b610a27565b6101a961026e3660046148b6565b610b09565b34801561027e575f80fd5b5061013e61028d36600461490a565b610b3d565b34801561029d575f80fd5b5061013e6102ac366004614923565b610b90565b3480156102bc575f80fd5b5061013e6102cb36600461494b565b610d65565b3480156102db575f80fd5b506101a96102ea366004614999565b61146b565b3480156102fa575f80fd5b50610201610309366004614842565b611484565b348015610319575f80fd5b5061013e610328366004614807565b611498565b348015610338575f80fd5b5061013e610347366004614923565b611579565b348015610357575f80fd5b5061013e61036636600461490a565b6117a6565b348015610376575f80fd5b506103856005600160991b0181565b6040516001600160a01b0390911681526020016101b3565b3480156103a8575f80fd5b5061013e6103b7366004614842565b61195e565b3480156103c7575f80fd5b5061013e6103d6366004614842565b611be4565b6101a96103e9366004614842565b611cf8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206153cd8339815191529184156104405761043d8285611d29565b90505b5f868152600684016020526040808220815161010081019092528054829060ff166004811115610472576104726149b2565b6004811115610483576104836149b2565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561050a5761050a6149b2565b1461055c5760405162461bcd60e51b815260206004820152602a60248201525f805160206153ed8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105c15760405162461bcd60e51b815260206004820152603360248201525f805160206153ed8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610553565b5f6105cb84611fc5565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff19166001836004811115610618576106186149b2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106ea85612055565b905082606001516001600160401b031681608001516001600160401b0316116107615760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610553565b5f8360600151826080015161077691906149da565b90506107828682612148565b5f6005600160991b0163ee5b48eb61079b898786612190565b6040518263ffffffff1660e01b81526004016107b79190614a23565b6020604051808303815f875af11580156107d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f79190614a55565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061546d8339815191526020526040808220815160e0810190925280545f8051602061540d83398151915293929190829060ff1660058111156108a5576108a56149b2565b60058111156108b6576108b66149b2565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610925576109256149b2565b1461098a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610553565b6005600160991b016001600160a01b031663ee5b48eb6109af8584606001515f612190565b6040518263ffffffff1660e01b81526004016109cb9190614a23565b6020604051808303815f875af11580156109e7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0b9190614a55565b50505050565b5f610a2164e8d4a5100083614a80565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a70575080546001600160401b03808416911610155b15610a8e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ab8836123ad565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b126123c1565b610b1e848484346123f8565b9050610b3660015f8051602061544d83398151915255565b9392505050565b5f805160206153cd8339815191525f80610b568461261e565b6040808201515f848152600588016020529190912054929450909250610a0b916001600160401b03909116906001600160a01b0316612983565b5f805160206153cd8339815191525f610ba884612996565b90505f80610bb98360400151612b77565b50915091505f610bc883612055565b9050816001600160401b031681606001516001600160401b03161015610c005760405162461bcd60e51b815260040161055390614a93565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c455760405162461bcd60e51b815260040161055390614ad5565b60015f87815260068701602052604090205460ff166004811115610c6b57610c6b6149b2565b14610cd45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610553565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f8051602061540d8339815191529060ff1615610e025760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610553565b5f610e0c83612996565b90505f610e1c8260400151612db2565b90505f85356020870135610e336040890189614b1e565b604051602001610e469493929190614b67565b60408051601f1981840301815291905280519091505f5b81811015610ed9575f610e7360608a018a614b87565b83818110610e8357610e83614bcc565b9050602002810190610e959190614be0565b610e9e90614c90565b80516020808301516040808501519051949550610ebe9489949301614d27565b60408051601f19818403018152919052935050600101610e5d565b5082600283604051610eeb9190614d76565b602060405180830381855afa158015610f06573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f299190614a55565b14610f8d5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610553565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff49190614a55565b8760200135146110565760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610553565b6110636040880188614b1e565b90506014146110c75760405162461bcd60e51b815260206004820152603a60248201525f8051602061542d83398151915260448201527f746f72206d616e616765722061646472657373206c656e6774680000000000006064820152608401610553565b306110d56040890189614b1e565b6110de91614d87565b60601c146111375760405162461bcd60e51b815260206004820152603360248201525f8051602061542d833981519152604482015272746f72206d616e61676572206164647265737360681b6064820152608401610553565b5f6111456060890189614b87565b9050116111a45760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b6064820152608401610553565b5f5b81811015611452575f6111bc60608a018a614b87565b838181106111cc576111cc614bcc565b90506020028101906111de9190614be0565b6111e790614c90565b604080518b3560208201529081018490529091505f9060029060600160408051601f198184030181529082905261121d91614d76565b602060405180830381855afa158015611238573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061125b9190614a55565b82519091508061127d5760405162461bcd60e51b815260040161055390614dbc565b5f81815260078a016020526040902054156112aa5760405162461bcd60e51b815260040161055390614dfd565b8260400151516030146112cf5760405162461bcd60e51b815260040161055390614e45565b5f81815260078a0160209081526040808320859055805160e081018252600180825287518285015287840180516001600160401b039081168486015260608401879052905116608083015260a0820185905260c0820185905286855260068e0190935292208251815491929091839160ff1990911690836005811115611357576113576149b2565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905561140182611fc5565b5082516020808501516040516001600160401b03909116815284917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050506001016111a6565b5050506008909201805460ff1916600117905550505050565b5f610a216001600160401b03831664e8d4a51000614e92565b5f61148e82612055565b6080015192915050565b5f805160206153cd8339815191525f6114b085612055565b5f86815260058401602052604090205460a08201519192506114e391600160b01b9091046001600160401b031690614ea9565b6001600160401b03164210156115575760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610553565b8315611569576115678584611d29565b505b61157285612f1d565b5050505050565b6115816123c1565b5f805160206153cd8339815191525f61159984612996565b90505f806115aa8360400151612b77565b50915091505f6115b983612055565b9050816001600160401b031681606001516001600160401b031610156115f15760405162461bcd60e51b815260040161055390614a93565b5f8681526006860160205260409020600301546001600160401b038084169116111561162f5760405162461bcd60e51b815260040161055390614ad5565b60035f87815260068701602052604090205460ff166004811115611655576116556149b2565b146116a95760405162461bcd60e51b815260206004820152603160248201525f805160206153ed8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610553565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261174e91612983565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506117a260015f8051602061544d83398151915255565b5050565b5f8051602061540d8339815191525f6117be83612996565b90505f806117cf8360400151613213565b91509150806118315760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610553565b5f8281526005850160205260408120805461184b90614ec9565b905011801561187d575060015f83815260068601602052604090205460ff16600581111561187b5761187b6149b2565b145b6118995760405162461bcd60e51b815260040161055390614f01565b5f82815260058501602052604081206118b19161479d565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153cd83398151915293929190829060ff1660048111156119bf576119bf6149b2565b60048111156119d0576119d06149b2565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a5757611a576149b2565b1480611a755750600381516004811115611a7357611a736149b2565b145b611ac95760405162461bcd60e51b815260206004820152603260248201525f805160206153ed833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610553565b5f611ad78260400151612055565b905080606001516001600160401b03165f03611b5b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610553565b6005600160991b016001600160a01b031663ee5b48eb611b88846040015184606001518560800151612190565b6040518263ffffffff1660e01b8152600401611ba49190614a23565b6020604051808303815f875af1158015611bc0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115729190614a55565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061540d833981519152929190611c2c90614ec9565b9050118015611c5e575060015f83815260068301602052604090205460ff166005811115611c5c57611c5c6149b2565b145b611c7a5760405162461bcd60e51b815260040161055390614f01565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611cb39190600401614f35565b6020604051808303815f875af1158015611ccf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf39190614a55565b505050565b5f611d016123c1565b611d0c8233346133b4565b9050611d2460015f8051602061544d83398151915255565b919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d74573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d9b9190810190614fde565b9150915080611dfe5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610553565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e659190614a55565b825114611ec95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610553565b60208201516001600160a01b031615611f3f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610553565b5f80611f4e8460400151613821565b91509150818714611fbb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610553565b9695505050505050565b5f8181525f8051602061546d8339815191526020526040812060020180545f8051602061540d83398151915291600160401b9091046001600160401b031690600861200f836150b0565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061546d83398151915290528390208351918201909352825491925f8051602061540d83398151915292829060ff1660058111156120d5576120d56149b2565b60058111156120e6576120e66149b2565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f9182525f8051602061546d833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612209576121c98160016150d5565b6121d4906008614e92565b5081515f908390839081106121eb576121eb614bcc565b60200101906001600160f81b03191690815f1a9053506001016121b5565b505f5b600481101561226c576122208160036150d5565b61222b906008614e92565b6001901c60f81b8261223e8360026150e8565b8151811061224e5761224e614bcc565b60200101906001600160f81b03191690815f1a90535060010161220c565b505f5b60208110156122ce5761228381601f6150d5565b61228e906008614e92565b86901c60f81b826122a08360066150e8565b815181106122b0576122b0614bcc565b60200101906001600160f81b03191690815f1a90535060010161226f565b505f5b6008811015612339576122e58160076150d5565b6122f0906008614e92565b6001600160401b038616901c60f81b8261230b8360266150e8565b8151811061231b5761231b614bcc565b60200101906001600160f81b03191690815f1a9053506001016122d1565b505f5b60088110156123a4576123508160076150d5565b61235b906008614e92565b6001600160401b038516901c60f81b8261237683602e6150e8565b8151811061238657612386614bcc565b60200101906001600160f81b03191690815f1a90535060010161233c565b50949350505050565b6123b56139f9565b6123be81613a44565b50565b5f8051602061544d8339815191528054600119016123f257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206153cd8339815191529061ffff861610801590612444575061271061ffff861611155b6124605760405162461bcd60e51b8152600401610553906150fb565b60028101546001600160401b0390811690851610156124d95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610553565b805483108015906124ee575080600101548311155b61254c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610553565b825f61255782610a11565b90505f6125648983613abc565b905060405180606001604052806125783390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061544d83398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061540d8339815191525f61266d85612996565b90505f8061267e8360400151613213565b9150915080156126e35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610553565b5f828152600685016020526040808220815160e081019092528054829060ff166005811115612714576127146149b2565b6005811115612725576127256149b2565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612796576127966149b2565b14806127b457506001825160058111156127b2576127b26149b2565b145b6128005760405162461bcd60e51b815260206004820152602a60248201525f8051602061542d833981519152604482015269746f722073746174757360b01b6064820152608401610553565b600382516005811115612815576128156149b2565b0361282257506004612826565b5060055b6020808301515f9081526007880190915260408120558181600581111561284f5761284f6149b2565b90816005811115612862576128626149b2565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115612896576128966149b2565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561294a5761294a6149b2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6117a26001600160a01b03821683613f30565b60408051606080820183525f8083526020830181905292820152905f8051602061540d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a0b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a329190810190614fde565b9150915080612a995760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610553565b8254825114612afc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610553565b60208201516001600160a01b031615612b6f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610553565b509392505050565b5f805f8351603614612b9b5760405162461bcd60e51b815260040161055390615146565b5f805b6002811015612bea57612bb28160016150d5565b612bbd906008614e92565b61ffff16868281518110612bd357612bd3614bcc565b016020015160f81c901b9190911790600101612b9e565b5061ffff811615612c0d5760405162461bcd60e51b81526004016105539061518f565b5f805b6004811015612c6857612c248160036150d5565b612c2f906008614e92565b63ffffffff1687612c418360026150e8565b81518110612c5157612c51614bcc565b016020015160f81c901b9190911790600101612c10565b5063ffffffff8116600314612c8f5760405162461bcd60e51b8152600401610553906151d2565b5f805b6020811015612ce457612ca681601f6150d5565b612cb1906008614e92565b88612cbd8360066150e8565b81518110612ccd57612ccd614bcc565b016020015160f81c901b9190911790600101612c92565b505f805b6008811015612d4357612cfc8160076150d5565b612d07906008614e92565b6001600160401b031689612d1c8360266150e8565b81518110612d2c57612d2c614bcc565b016020015160f81c901b9190911790600101612ce8565b505f805b6008811015612da257612d5b8160076150d5565b612d66906008614e92565b6001600160401b03168a612d7b83602e6150e8565b81518110612d8b57612d8b614bcc565b016020015160f81c901b9190911790600101612d47565b5091989097509095509350505050565b5f8151602614612dd45760405162461bcd60e51b815260040161055390615146565b5f805b6002811015612e2357612deb8160016150d5565b612df6906008614e92565b61ffff16848281518110612e0c57612e0c614bcc565b016020015160f81c901b9190911790600101612dd7565b5061ffff811615612e465760405162461bcd60e51b81526004016105539061518f565b5f805b6004811015612ea157612e5d8160036150d5565b612e68906008614e92565b63ffffffff1685612e7a8360026150e8565b81518110612e8a57612e8a614bcc565b016020015160f81c901b9190911790600101612e49565b5063ffffffff8116600514612ec85760405162461bcd60e51b8152600401610553906151d2565b5f805b60208110156123a457612edf81601f6150d5565b612eea906008614e92565b86612ef68360066150e8565b81518110612f0657612f06614bcc565b016020015160f81c901b9190911790600101612ecb565b5f8181525f8051602061546d8339815191526020526040808220815160e0810190925280545f8051602061540d83398151915293929190829060ff166005811115612f6a57612f6a6149b2565b6005811115612f7b57612f7b6149b2565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612fed57612fed6149b2565b146130495760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610553565b6130568160800151613fc3565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561309a5761309a6149b2565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61314f8461314981611fc5565b5f612190565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061317e908590600401614a23565b6020604051808303815f875af115801561319a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131be9190614a55565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146132365760405162461bcd60e51b815260040161055390615146565b5f805b60028110156132855761324d8160016150d5565b613258906008614e92565b61ffff1685828151811061326e5761326e614bcc565b016020015160f81c901b9190911790600101613239565b5061ffff8116156132a85760405162461bcd60e51b81526004016105539061518f565b5f805b6004811015613303576132bf8160036150d5565b6132ca906008614e92565b63ffffffff16866132dc8360026150e8565b815181106132ec576132ec614bcc565b016020015160f81c901b91909117906001016132ab565b5063ffffffff811660021461332a5760405162461bcd60e51b8152600401610553906151d2565b5f805b602081101561337f5761334181601f6150d5565b61334c906008614e92565b876133588360066150e8565b8151811061336857613368614bcc565b016020015160f81c901b919091179060010161332d565b505f8660268151811061339457613394614bcc565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206153cd833981519152816133cd84610a11565b90505f6133d987612055565b90506002815160058111156133f0576133f06149b2565b1461344f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610553565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166134e25760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610553565b5f8282608001516134f39190614ea9565b60048501546040840151919250613515916001600160401b0390911690615219565b6001600160401b0316816001600160401b031611156135945760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610553565b61359e8882612148565b5f6135a889611fc5565b90505f89826040516020016135d492919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090506135f585613fc3565b5f6005600160991b0163ee5b48eb61360e8d8688612190565b6040518263ffffffff1660e01b815260040161362a9190614a23565b6020604051808303815f875af1158015613646573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061366a9190614a55565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156136f2576136f26149b2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e146138445760405162461bcd60e51b815260040161055390615146565b5f805b60028110156138935761385b8160016150d5565b613866906008614e92565b61ffff1685828151811061387c5761387c614bcc565b016020015160f81c901b9190911790600101613847565b5061ffff8116156138b65760405162461bcd60e51b81526004016105539061518f565b5f805b6004811015613911576138cd8160036150d5565b6138d8906008614e92565b63ffffffff16866138ea8360026150e8565b815181106138fa576138fa614bcc565b016020015160f81c901b91909117906001016138b9565b5063ffffffff81166004146139385760405162461bcd60e51b8152600401610553906151d2565b5f805b602081101561398d5761394f81601f6150d5565b61395a906008614e92565b876139668360066150e8565b8151811061397657613976614bcc565b016020015160f81c901b919091179060010161393b565b505f805b60088110156139ec576139a58160076150d5565b6139b0906008614e92565b6001600160401b0316886139c58360266150e8565b815181106139d5576139d5614bcc565b016020015160f81c901b9190911790600101613991565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a4257604051631afcd79f60e31b815260040160405180910390fd5b565b613a4c6139f9565b613a5e613a59828061523c565b614164565b613a6661417d565b6123be60208201356040830135613a836080850160608601614999565b613a9360a0860160808701615250565b61ffff16613aa760c0870160a08801615269565b613ab760e0880160c08901615289565b61418d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613b475760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610553565b5f8051602061540d83398151915242613b666040860160208701614999565b6001600160401b0316118015613b9f5750613b876040850160208601614999565b6001600160401b0316613b9d426202a3006150e8565b115b613c015760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610553565b8335613c1f5760405162461bcd60e51b815260040161055390614dbc565b83355f90815260078201602052604090205415613c4e5760405162461bcd60e51b815260040161055390614dfd565b613c5b6040850185614b1e565b9050603014613c7c5760405162461bcd60e51b815260040161055390614e45565b613c8583613fc3565b5f80613d1f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613cca9190614999565b6001600160401b03168152602001613ce560408a018a614b1e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614372565b5f82815260058601602052604090209193509150613d3d82826152e8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613d6a908590600401614a23565b6020604051808303815f875af1158015613d86573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613daa9190614a55565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115613e2257613e226149b2565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f02918e01908e01614999565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613f535760405163cd78605960e01b8152306004820152602401610553565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f9c576040519150601f19603f3d011682016040523d82523d5f602084013e613fa1565b606091505b5050905080611cf357604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061540d8339815191529060ff165f03614001575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061404990836150d5565b10614065576001600160401b0384166040830152808252614084565b83826040018181516140779190614ea9565b6001600160401b03169052505b5f82602001518360400151606461409b9190615219565b6140a591906153a7565b600285015490915060ff90811690821611156141205760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610553565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b61416c6139f9565b614174614717565b6123be8161471f565b6141856139f9565b613a42614795565b6141956139f9565b5f805160206153cd833981519152836142015760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610553565b6127108411156142235760405162461bcd60e51b8152600401610553906150fb565b8587111561428b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610553565b600a60ff8416118015906142a157505f8360ff16115b61430b5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610553565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146143dc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610553565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614453576144138160016150d5565b61441e906008614e92565b5081515f9083908390811061443557614435614bcc565b60200101906001600160f81b03191690815f1a9053506001016143ff565b505f5b60048110156144b15761446a8160036150d5565b614475906008614e92565b505f826144838360026150e8565b8151811061449357614493614bcc565b60200101906001600160f81b03191690815f1a905350600101614456565b505f5b602081101561450e57845181602081106144d0576144d0614bcc565b1a60f81b826144e08360066150e8565b815181106144f0576144f0614bcc565b60200101906001600160f81b03191690815f1a9053506001016144b4565b505f5b602081101561456e578460200151816020811061453057614530614bcc565b1a60f81b826145408360266150e8565b8151811061455057614550614bcc565b60200101906001600160f81b03191690815f1a905350600101614511565b505f5b60088110156145e2576145858160076150d5565b614590906008614e92565b60ff1685604001516001600160401b0316901c60f81b828260466145b491906150e8565b815181106145c4576145c4614bcc565b60200101906001600160f81b03191690815f1a905350600101614571565b505f5b603081101561464d578460800151818151811061460457614604614bcc565b01602001516001600160f81b0319168261461f83604e6150e8565b8151811061462f5761462f614bcc565b60200101906001600160f81b03191690815f1a9053506001016145e5565b505f5b60088110156146bf576146648160076150d5565b61466f906008614e92565b60608601516001600160401b0390811691161c60f81b8261469183607e6150e8565b815181106146a1576146a1614bcc565b60200101906001600160f81b03191690815f1a905350600101614650565b506002816040516146d09190614d76565b602060405180830381855afa1580156146eb573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061470e9190614a55565b94909350915050565b613a426139f9565b6147276139f9565b80355f8051602061540d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556147716060830160408401615269565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b61260b6139f9565b5080546147a990614ec9565b5f825580601f106147b8575050565b601f0160209004905f5260205f20908101906123be91905b808211156147e3575f81556001016147d0565b5090565b80151581146123be575f80fd5b803563ffffffff81168114611d24575f80fd5b5f805f60608486031215614819575f80fd5b83359250602084013561482b816147e7565b9150614839604085016147f4565b90509250925092565b5f60208284031215614852575f80fd5b5035919050565b5f60208284031215614869575f80fd5b81356001600160401b0381111561487e575f80fd5b820160e08185031215610b36575f80fd5b803561ffff81168114611d24575f80fd5b80356001600160401b0381168114611d24575f80fd5b5f805f606084860312156148c8575f80fd5b83356001600160401b038111156148dd575f80fd5b8401606081870312156148ee575f80fd5b92506148fc6020850161488f565b9150614839604085016148a0565b5f6020828403121561491a575f80fd5b610b36826147f4565b5f8060408385031215614934575f80fd5b61493d836147f4565b946020939093013593505050565b5f806040838503121561495c575f80fd5b82356001600160401b03811115614971575f80fd5b830160808186031215614982575f80fd5b9150614990602084016147f4565b90509250929050565b5f602082840312156149a9575f80fd5b610b36826148a0565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156149fa576149fa6149c6565b5092915050565b5f5b83811015614a1b578181015183820152602001614a03565b50505f910152565b602081525f8251806020840152614a41816040850160208701614a01565b601f01601f19169190910160400192915050565b5f60208284031215614a65575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614a8e57614a8e614a6c565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f808335601e19843603018112614b33575f80fd5b8301803591506001600160401b03821115614b4c575f80fd5b602001915036819003821315614b60575f80fd5b9250929050565b848152836020820152818360408301375f91016040019081529392505050565b5f808335601e19843603018112614b9c575f80fd5b8301803591506001600160401b03821115614bb5575f80fd5b6020019150600581901b3603821315614b60575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614bf4575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614c3457614c34614bfe565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c6257614c62614bfe565b604052919050565b5f6001600160401b03821115614c8257614c82614bfe565b50601f01601f191660200190565b5f60608236031215614ca0575f80fd5b614ca8614c12565b823581526020614cb98185016148a0565b8183015260408401356001600160401b03811115614cd5575f80fd5b840136601f820112614ce5575f80fd5b8035614cf8614cf382614c6a565b614c3a565b8181523684838501011115614d0b575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551614d38818460208a01614a01565b80830190508581526001600160401b0360c01b8560c01b1660208201528351614d68816028840160208801614a01565b016028019695505050505050565b5f8251614bf4818460208701614a01565b6bffffffffffffffffffffffff198135818116916014851015614db45780818660140360031b1b83161692505b505092915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b8082028115828204841417610a2157610a216149c6565b6001600160401b038181168382160190808211156149fa576149fa6149c6565b600181811c90821680614edd57607f821691505b602082108103614efb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201525f8051602061542d8339815191526040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614f4781614ec9565b806020870152604060018084165f8114614f685760018114614f8457614fb1565b60ff19851660408a0152604084151560051b8a01019550614fb1565b895f5260205f205f5b85811015614fa85781548b8201860152908301908801614f8d565b8a016040019650505b509398975050505050505050565b6001600160a01b03811681146123be575f80fd5b8051611d24816147e7565b5f8060408385031215614fef575f80fd5b82516001600160401b0380821115615005575f80fd5b9084019060608287031215615018575f80fd5b615020614c12565b8251815260208084015161503381614fbf565b82820152604084015183811115615048575f80fd5b80850194505087601f85011261505c575f80fd5b8351925061506c614cf384614c6a565b838152888285870101111561507f575f80fd5b61508e84838301848801614a01565b806040840152508195506150a3818801614fd3565b9450505050509250929050565b5f6001600160401b038083168181036150cb576150cb6149c6565b6001019392505050565b81810381811115610a2157610a216149c6565b80820180821115610a2157610a216149c6565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614db457614db46149c6565b5f8235609e19833603018112614bf4575f80fd5b5f60208284031215615260575f80fd5b610b368261488f565b5f60208284031215615279575f80fd5b813560ff81168114610b36575f80fd5b5f60208284031215615299575f80fd5b8135610b3681614fbf565b601f821115611cf357805f5260205f20601f840160051c810160208510156152c95750805b601f840160051c820191505b81811015611572575f81556001016152d5565b81516001600160401b0381111561530157615301614bfe565b6153158161530f8454614ec9565b846152a4565b602080601f831160018114615348575f84156153315750858301515b5f19600386901b1c1916600185901b17855561539f565b5f85815260208120601f198616915b8281101561537657888601518255948401946001909101908401615357565b508582101561539357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b03808416806153c0576153c0614a6c565b9216919091049291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0056616c696461746f724d616e616765723a20696e76616c69642076616c6964619b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -534,23 +545,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0xc123c6db. +// Initialize is a paid mutator transaction binding the contract method 0x3d68fe29. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8,(bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]),uint32),uint256,uint256,uint64,uint16,uint8,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 0xc123c6db. +// Initialize is a paid mutator transaction binding the contract method 0x3d68fe29. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8,(bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]),uint32),uint256,uint256,uint64,uint16,uint8,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 0xc123c6db. +// Initialize is a paid mutator transaction binding the contract method 0x3d68fe29. // -// Solidity: function initialize(((bytes32,bytes32,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,bytes32,uint8,(bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]),uint32),uint256,uint256,uint64,uint16,uint8,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } @@ -618,25 +629,46 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In return _NativeTokenStakingManager.Contract.InitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x80a8ad94. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, delegationFeeBips, minStakeDuration) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, requirements) +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x80a8ad94. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, requirements) +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorSet(&_NativeTokenStakingManager.TransactOpts, subnetConversionData, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x80a8ad94. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, (uint16,uint64) requirements) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, requirements PoSValidatorRequirements) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, requirements) +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorSet(&_NativeTokenStakingManager.TransactOpts, subnetConversionData, messageIndex) } // ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. @@ -1358,6 +1390,160 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelega return event, nil } +// NativeTokenStakingManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerInitialValidatorCreatedIterator struct { + Event *NativeTokenStakingManagerInitialValidatorCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerInitialValidatorCreated struct { + ValidationID [32]byte + NodeID [32]byte + Weight *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*NativeTokenStakingManagerInitialValidatorCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerInitialValidatorCreatedIterator{contract: _NativeTokenStakingManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil +} + +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerInitialValidatorCreated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*NativeTokenStakingManagerInitialValidatorCreated, error) { + event := new(NativeTokenStakingManagerInitialValidatorCreated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // NativeTokenStakingManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerInitializedIterator struct { Event *NativeTokenStakingManagerInitialized // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 1ba9f83a3..b7de9eb2c 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -29,11 +29,28 @@ var ( _ = abi.ConvertType ) +// InitialValidator is an auto generated low-level Go binding around an user-defined struct. +type InitialValidator struct { + NodeID [32]byte + Weight uint64 + BlsPublicKey []byte +} + +// SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. +type SubnetConversionData struct { + ConvertSubnetTxID [32]byte + BlockchainID [32]byte + ValidatorManagerAddress []byte + InitialValidators []InitialValidator +} + // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { - PChainBlockchainID [32]byte - SubnetID [32]byte - MaximumHourlyChurn uint8 + PChainBlockchainID [32]byte + SubnetID [32]byte + MaximumHourlyChurn uint8 + SubnetConversionData SubnetConversionData + MessageIndex uint32 } // ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. @@ -45,8 +62,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612c69380380612c6983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612b1c8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cb575f3560e01c80638da5cb5b11610088578063b771b3bc11610063578063b771b3bc146101f8578063bee0a03f14610206578063c151c0b914610219578063f2fde38b1461022c575f80fd5b80638da5cb5b1461018e57806397fb70d4146101d2578063a3a65e48146101e5575f80fd5b80630322ed98146100cf5780630cdd0985146100e4578063467ef06f1461013557806366435abf14610148578063715018a6146101735780638994ab491461017b575b5f80fd5b6100e26100dd366004612415565b61023f565b005b6101226100f2366004612415565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6100e261014336600461242c565b610414565b61015b610156366004612415565b610421565b6040516001600160401b03909116815260200161012c565b6100e2610435565b610122610189366004612487565b610448565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161012c565b6100e26101e0366004612415565b610464565b6100e26101f336600461242c565b610470565b6101ba6005600160991b0181565b6100e2610214366004612415565b61062d565b6100e26102273660046124e5565b610741565b6100e261023a36600461251b565b61084f565b5f8181525f80516020612af083398151915260205260408082208151610100810190925280545f80516020612ad083398151915293929190829060ff16600581111561028d5761028d612536565b600581111561029e5761029e612536565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561032357610323612536565b1461038d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103b28584608001515f610889565b6040518263ffffffff1660e01b81526004016103ce919061256c565b6020604051808303815f875af11580156103ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040e919061259e565b50505050565b61041d81610aa6565b5050565b5f61042b82610e19565b60a0015192915050565b61043d610ef8565b6104465f610f53565b565b5f610451610ef8565b61045b8383610fc3565b90505b92915050565b61046d8161148d565b50565b5f80516020612ad08339815191525f6104888361182b565b90505f806104998360400151611a0c565b91509150806104fb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610384565b5f82815260058501602052604081208054610515906125b5565b9050118015610547575060015f83815260068601602052604090205460ff16600581111561054557610545612536565b145b6105635760405162461bcd60e51b8152600401610384906125e7565b5f828152600585016020526040812061057b91612382565b5f8281526006850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020612ad0833981519152929190610675906125b5565b90501180156106a7575060015f83815260068301602052604090205460ff1660058111156106a5576106a5612536565b145b6106c35760405162461bcd60e51b8152600401610384906125e7565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916106fc919060040161262e565b6020604051808303815f875af1158015610718573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073c919061259e565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156107855750825b90505f826001600160401b031660011480156107a05750303b155b9050811580156107ae575080155b156107cc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156107f657845460ff60401b1916600160401b1785555b6108008787611c6b565b831561084657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610857610ef8565b6001600160a01b03811661088057604051631e4fbdf760e01b81525f6004820152602401610384565b61046d81610f53565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610902576108c28160016126e0565b6108cd9060086126f3565b5081515f908390839081106108e4576108e461270a565b60200101906001600160f81b03191690815f1a9053506001016108ae565b505f5b6004811015610965576109198160036126e0565b6109249060086126f3565b6001901c60f81b8261093783600261271e565b815181106109475761094761270a565b60200101906001600160f81b03191690815f1a905350600101610905565b505f5b60208110156109c75761097c81601f6126e0565b6109879060086126f3565b86901c60f81b8261099983600661271e565b815181106109a9576109a961270a565b60200101906001600160f81b03191690815f1a905350600101610968565b505f5b6008811015610a32576109de8160076126e0565b6109e99060086126f3565b6001600160401b038616901c60f81b82610a0483602661271e565b81518110610a1457610a1461270a565b60200101906001600160f81b03191690815f1a9053506001016109ca565b505f5b6008811015610a9d57610a498160076126e0565b610a549060086126f3565b6001600160401b038516901c60f81b82610a6f83602e61271e565b81518110610a7f57610a7f61270a565b60200101906001600160f81b03191690815f1a905350600101610a35565b50949350505050565b610aae6123b9565b5f80516020612ad08339815191525f610ac68461182b565b90505f80610ad78360400151611a0c565b915091508015610b3c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610384565b5f828152600685016020526040808220815161010081019092528054829060ff166005811115610b6e57610b6e612536565b6005811115610b7f57610b7f612536565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610c0657610c06612536565b1480610c245750600182516005811115610c2257610c22612536565b145b610c835760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610384565b600382516005811115610c9857610c98612536565b03610ca557506004610ca9565b5060055b6020808301515f90815260078801909152604081205581816005811115610cd257610cd2612536565b90816005811115610ce557610ce5612536565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115610d1957610d19612536565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610de457610de4612536565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610e216123b9565b5f8281525f80516020612af08339815191526020526040908190208151610100810190925280545f80516020612ad0833981519152929190829060ff166005811115610e6f57610e6f612536565b6005811115610e8057610e80612536565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b33610f2a7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146104465760405163118cdaa760e01b8152336004820152602401610384565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612ad083398151915242610fe36040860160208701612731565b6001600160401b031611801561101c57506110046040850160208601612731565b6001600160401b031661101a426202a30061271e565b115b61107e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610384565b83356110d65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610384565b83355f908152600782016020526040902054156111465760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610384565b611153604085018561274a565b90506030146111ba5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610384565b6111c383611c85565b5f8061125d6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906112089190612731565b6001600160401b0316815260200161122360408a018a61274a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611e26565b5f8281526005860160205260409020919350915061127b82826127de565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906112a890859060040161256c565b6020604051808303815f875af11580156112c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e8919061259e565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600688019052902081518154829060ff1916600183600581111561136a5761136a612536565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161145f91908e01908e01612731565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612af083398151915260205260408082208151610100810190925280545f80516020612ad083398151915293929190829060ff1660058111156114db576114db612536565b60058111156114ec576114ec612536565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561157457611574612536565b146115d05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610384565b60408101516001600160a01b0316336001600160a01b03161461164a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b6064820152608401610384565b6116578160a00151611c85565b60038152426001600160401b031660e08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561169b5761169b612536565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61176784611761816121cb565b5f610889565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061179690859060040161256c565b6020604051808303815f875af11580156117b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d6919061259e565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612ad08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156118a0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526118c79190810190612904565b915091508061192e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610384565b82548251146119915760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610384565b60208201516001600160a01b031615611a045760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610384565b509392505050565b5f808251602714611a715760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b6064820152608401610384565b5f805b6002811015611ac057611a888160016126e0565b611a939060086126f3565b61ffff16858281518110611aa957611aa961270a565b016020015160f81c901b9190911790600101611a74565b5061ffff811615611b1f5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b6064820152608401610384565b5f805b6004811015611b7a57611b368160036126e0565b611b419060086126f3565b63ffffffff1686611b5383600261271e565b81518110611b6357611b6361270a565b016020015160f81c901b9190911790600101611b22565b5063ffffffff8116600214611be15760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b6064820152608401610384565b5f805b6020811015611c3657611bf881601f6126e0565b611c039060086126f3565b87611c0f83600661271e565b81518110611c1f57611c1f61270a565b016020015160f81c901b9190911790600101611be4565b505f86602681518110611c4b57611c4b61270a565b016020015191976001600160f81b03199092161515965090945050505050565b611c7361224d565b611c7c82612296565b61041d816122b7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f80516020612ad08339815191529060ff165f03611cc3575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090611d0b90836126e0565b10611d27576001600160401b0384166040830152808252611d46565b8382604001818151611d3991906129ec565b6001600160401b03169052505b5f826020015183604001516064611d5d9190612a13565b611d679190612a3e565b600285015490915060ff9081169082161115611de25760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610384565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f6060826080015151603014611e905760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610384565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611f0757611ec78160016126e0565b611ed29060086126f3565b5081515f90839083908110611ee957611ee961270a565b60200101906001600160f81b03191690815f1a905350600101611eb3565b505f5b6004811015611f6557611f1e8160036126e0565b611f299060086126f3565b505f82611f3783600261271e565b81518110611f4757611f4761270a565b60200101906001600160f81b03191690815f1a905350600101611f0a565b505f5b6020811015611fc25784518160208110611f8457611f8461270a565b1a60f81b82611f9483600661271e565b81518110611fa457611fa461270a565b60200101906001600160f81b03191690815f1a905350600101611f68565b505f5b60208110156120225784602001518160208110611fe457611fe461270a565b1a60f81b82611ff483602661271e565b815181106120045761200461270a565b60200101906001600160f81b03191690815f1a905350600101611fc5565b505f5b6008811015612096576120398160076126e0565b6120449060086126f3565b60ff1685604001516001600160401b0316901c60f81b82826046612068919061271e565b815181106120785761207861270a565b60200101906001600160f81b03191690815f1a905350600101612025565b505f5b603081101561210157846080015181815181106120b8576120b861270a565b01602001516001600160f81b031916826120d383604e61271e565b815181106120e3576120e361270a565b60200101906001600160f81b03191690815f1a905350600101612099565b505f5b6008811015612173576121188160076126e0565b6121239060086126f3565b60608601516001600160401b0390811691161c60f81b8261214583607e61271e565b815181106121555761215561270a565b60200101906001600160f81b03191690815f1a905350600101612104565b506002816040516121849190612a6f565b602060405180830381855afa15801561219f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906121c2919061259e565b94909350915050565b5f8181525f80516020612af08339815191526020526040812060030180545f80516020612ad0833981519152916001600160401b03909116908361220e83612a8a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661044657604051631afcd79f60e31b815260040160405180910390fd5b61229e61224d565b6122a66122c8565b6122ae6122d8565b61046d816122e0565b6122bf61224d565b61046d8161234c565b6122d061224d565b610446612354565b61044661224d565b6122e861224d565b80355f80516020612ad083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556123326060830160408401612aaf565b600291909101805460ff191660ff90921691909117905550565b61085761224d565b61235c61224d565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50805461238e906125b5565b5f825580601f1061239d575050565b601f0160209004905f5260205f209081019061046d91906123fd565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612411575f81556001016123fe565b5090565b5f60208284031215612425575f80fd5b5035919050565b5f6020828403121561243c575f80fd5b813563ffffffff8116811461244f575f80fd5b9392505050565b5f60608284031215612466575f80fd5b50919050565b80356001600160401b0381168114612482575f80fd5b919050565b5f8060408385031215612498575f80fd5b82356001600160401b038111156124ad575f80fd5b6124b985828601612456565b9250506124c86020840161246c565b90509250929050565b6001600160a01b038116811461046d575f80fd5b5f80608083850312156124f6575f80fd5b6125008484612456565b91506060830135612510816124d1565b809150509250929050565b5f6020828403121561252b575f80fd5b813561244f816124d1565b634e487b7160e01b5f52602160045260245ffd5b5f5b8381101561256457818101518382015260200161254c565b50505f910152565b602081525f825180602084015261258a81604085016020870161254a565b601f01601f19169190910160400192915050565b5f602082840312156125ae575f80fd5b5051919050565b600181811c908216806125c957607f821691505b60208210810361246657634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612640816125b5565b806020870152604060018084165f8114612661576001811461267d576126aa565b60ff19851660408a0152604084151560051b8a010195506126aa565b895f5260205f205f5b858110156126a15781548b8201860152908301908801612686565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8181038181111561045e5761045e6126cc565b808202811582820484141761045e5761045e6126cc565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561045e5761045e6126cc565b5f60208284031215612741575f80fd5b61045b8261246c565b5f808335601e1984360301811261275f575f80fd5b8301803591506001600160401b03821115612778575f80fd5b60200191503681900382131561278c575f80fd5b9250929050565b601f82111561073c57805f5260205f20601f840160051c810160208510156127b85750805b601f840160051c820191505b818110156127d7575f81556001016127c4565b5050505050565b81516001600160401b038111156127f7576127f76126b8565b61280b8161280584546125b5565b84612793565b602080601f83116001811461283e575f84156128275750858301515b5f19600386901b1c1916600185901b178555612895565b5f85815260208120601f198616915b8281101561286c5788860151825594840194600190910190840161284d565b508582101561288957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b03811182821017156128bf576128bf6126b8565b60405290565b604051601f8201601f191681016001600160401b03811182821017156128ed576128ed6126b8565b604052919050565b80518015158114612482575f80fd5b5f8060408385031215612915575f80fd5b82516001600160401b038082111561292b575f80fd5b908401906060828703121561293e575f80fd5b61294661289d565b82518152602080840151612959816124d1565b8282015260408401518381111561296e575f80fd5b80850194505087601f850112612982575f80fd5b835183811115612994576129946126b8565b6129a6601f8201601f191683016128c5565b935080845288828287010111156129bb575f80fd5b6129ca8183860184880161254a565b508260408301528195506129df8188016128f5565b9450505050509250929050565b6001600160401b03818116838216019080821115612a0c57612a0c6126cc565b5092915050565b6001600160401b03818116838216028082169190828114612a3657612a366126cc565b505092915050565b5f6001600160401b0380841680612a6357634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f8251612a8081846020870161254a565b9190910192915050565b5f6001600160401b03808316818103612aa557612aa56126cc565b6001019392505050565b5f60208284031215612abf575f80fd5b813560ff8116811461244f575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161367638038061367683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6135298061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c80638994ab4911610088578063a3a65e4811610063578063a3a65e4814610225578063b771b3bc14610238578063bee0a03f14610246578063f2fde38b14610259575f80fd5b80638994ab49146101bb5780638da5cb5b146101ce57806397fb70d414610212575f80fd5b8063467ef06f116100c3578063467ef06f14610162578063561404fd1461017557806366435abf14610188578063715018a6146101b3575f80fd5b80630322ed98146100e95780630cb0a105146100fe5780630cdd098514610111575b5f80fd5b6100fc6100f7366004612a72565b61026c565b005b6100fc61010c366004612a9d565b61042a565b61014f61011f366004612a72565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6100fc610170366004612b07565b610538565b6100fc610183366004612b20565b610546565b61019b610196366004612a72565b610c4c565b6040516001600160401b039091168152602001610159565b6100fc610c60565b61014f6101c9366004612b84565b610c73565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610159565b6100fc610220366004612a72565b610c8f565b6100fc610233366004612b07565b610ca3565b6101fa6005600160991b0181565b6100fc610254366004612a72565b610e5b565b6100fc610267366004612bc9565b610f6a565b5f8181525f805160206134fd8339815191526020526040808220815160e0810190925280545f805160206134bd83398151915293929190829060ff1660058111156102b9576102b9612beb565b60058111156102ca576102ca612beb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561033957610339612beb565b146103a35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103c88584606001515f610fa4565b6040518263ffffffff1660e01b81526004016103e49190612c21565b6020604051808303815f875af1158015610400573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104249190612c53565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561046e5750825b90505f826001600160401b031660011480156104895750303b155b905081158015610497575080155b156104b55760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104df57845460ff60401b1916600160401b1785555b6104e987876111c1565b831561052f57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610541816111df565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206134bd8339815191529060ff16156105e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161039a565b5f6105ed83611544565b90505f6105fd8260400151611725565b90505f853560208701356106146040890189612c6a565b6040516020016106279493929190612cb3565b60408051601f1981840301815291905280519091505f5b818110156106ba575f61065460608a018a612cd3565b8381811061066457610664612d18565b90506020028101906106769190612d2c565b61067f90612ddc565b8051602080830151604080850151905194955061069f9489949301612e73565b60408051601f1981840301815291905293505060010161063e565b50826002836040516106cc9190612ec2565b602060405180830381855afa1580156106e7573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061070a9190612c53565b1461076e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161039a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d59190612c53565b8760200135146108375760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161039a565b6108446040880188612c6a565b90506014146108a85760405162461bcd60e51b815260206004820152603a60248201525f805160206134dd83398151915260448201527f746f72206d616e616765722061646472657373206c656e677468000000000000606482015260840161039a565b306108b66040890189612c6a565b6108bf91612ed3565b60601c146109185760405162461bcd60e51b815260206004820152603360248201525f805160206134dd833981519152604482015272746f72206d616e61676572206164647265737360681b606482015260840161039a565b5f6109266060890189612cd3565b9050116109855760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161039a565b5f5b81811015610c33575f61099d60608a018a612cd3565b838181106109ad576109ad612d18565b90506020028101906109bf9190612d2c565b6109c890612ddc565b604080518b3560208201529081018490529091505f9060029060600160408051601f19818403018152908290526109fe91612ec2565b602060405180830381855afa158015610a19573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a3c9190612c53565b825190915080610a5e5760405162461bcd60e51b815260040161039a90612f08565b5f81815260078a01602052604090205415610a8b5760405162461bcd60e51b815260040161039a90612f49565b826040015151603014610ab05760405162461bcd60e51b815260040161039a90612f91565b5f81815260078a0160209081526040808320859055805160e081018252600180825287518285015287840180516001600160401b039081168486015260608401879052905116608083015260a0820185905260c0820185905286855260068e0190935292208251815491929091839160ff1990911690836005811115610b3857610b38612beb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055610be282611890565b5082516020808501516040516001600160401b03909116815284917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101610987565b5050506008909201805460ff1916600117905550505050565b5f610c5682611920565b6080015192915050565b610c68611a13565b610c715f611a6e565b565b5f610c7c611a13565b610c868383611ade565b90505b92915050565b610c97611a13565b610ca081611f52565b50565b5f805160206134bd8339815191525f610cbb83611544565b90505f80610ccc8360400151612248565b9150915080610d2e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161039a565b5f82815260058501602052604081208054610d4890612fde565b9050118015610d7a575060015f83815260068601602052604090205460ff166005811115610d7857610d78612beb565b145b610d965760405162461bcd60e51b815260040161039a90613016565b5f8281526005850160205260408120610dae91612a28565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206134bd833981519152929190610ea390612fde565b9050118015610ed5575060015f83815260068301602052604090205460ff166005811115610ed357610ed3612beb565b145b610ef15760405162461bcd60e51b815260040161039a90613016565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610f2a919060040161304a565b6020604051808303815f875af1158015610f46573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105419190612c53565b610f72611a13565b6001600160a01b038116610f9b57604051631e4fbdf760e01b81525f600482015260240161039a565b610ca081611a6e565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561101d57610fdd8160016130e8565b610fe89060086130fb565b5081515f90839083908110610fff57610fff612d18565b60200101906001600160f81b03191690815f1a905350600101610fc9565b505f5b6004811015611080576110348160036130e8565b61103f9060086130fb565b6001901c60f81b82611052836002613112565b8151811061106257611062612d18565b60200101906001600160f81b03191690815f1a905350600101611020565b505f5b60208110156110e25761109781601f6130e8565b6110a29060086130fb565b86901c60f81b826110b4836006613112565b815181106110c4576110c4612d18565b60200101906001600160f81b03191690815f1a905350600101611083565b505f5b600881101561114d576110f98160076130e8565b6111049060086130fb565b6001600160401b038616901c60f81b8261111f836026613112565b8151811061112f5761112f612d18565b60200101906001600160f81b03191690815f1a9053506001016110e5565b505f5b60088110156111b8576111648160076130e8565b61116f9060086130fb565b6001600160401b038516901c60f81b8261118a83602e613112565b8151811061119a5761119a612d18565b60200101906001600160f81b03191690815f1a905350600101611150565b50949350505050565b6111c96123e9565b6111d282612432565b6111db8161244b565b5050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206134bd8339815191525f61122e85611544565b90505f8061123f8360400151612248565b9150915080156112a45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161039a565b5f828152600685016020526040808220815160e081019092528054829060ff1660058111156112d5576112d5612beb565b60058111156112e6576112e6612beb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561135757611357612beb565b1480611375575060018251600581111561137357611373612beb565b145b6113c15760405162461bcd60e51b815260206004820152602a60248201525f805160206134dd833981519152604482015269746f722073746174757360b01b606482015260840161039a565b6003825160058111156113d6576113d6612beb565b036113e3575060046113e7565b5060055b6020808301515f9081526007880190915260408120558181600581111561141057611410612beb565b9081600581111561142357611423612beb565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561145757611457612beb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561150b5761150b612beb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830181905292820152905f805160206134bd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115b9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e09190810190613134565b91509150806116475760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161039a565b82548251146116aa5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161039a565b60208201516001600160a01b03161561171d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161039a565b509392505050565b5f81516026146117475760405162461bcd60e51b815260040161039a90613206565b5f805b60028110156117965761175e8160016130e8565b6117699060086130fb565b61ffff1684828151811061177f5761177f612d18565b016020015160f81c901b919091179060010161174a565b5061ffff8116156117b95760405162461bcd60e51b815260040161039a9061324f565b5f805b6004811015611814576117d08160036130e8565b6117db9060086130fb565b63ffffffff16856117ed836002613112565b815181106117fd576117fd612d18565b016020015160f81c901b91909117906001016117bc565b5063ffffffff811660051461183b5760405162461bcd60e51b815260040161039a90613292565b5f805b60208110156111b85761185281601f6130e8565b61185d9060086130fb565b86611869836006613112565b8151811061187957611879612d18565b016020015160f81c901b919091179060010161183e565b5f8181525f805160206134fd8339815191526020526040812060020180545f805160206134bd83398151915291600160401b9091046001600160401b03169060086118da836132d9565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206134fd83398151915290528390208351918201909352825491925f805160206134bd83398151915292829060ff1660058111156119a0576119a0612beb565b60058111156119b1576119b1612beb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b33611a457f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c715760405163118cdaa760e01b815233600482015260240161039a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16611b695760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161039a565b5f805160206134bd83398151915242611b8860408601602087016132fe565b6001600160401b0316118015611bc15750611ba960408501602086016132fe565b6001600160401b0316611bbf426202a300613112565b115b611c235760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161039a565b8335611c415760405162461bcd60e51b815260040161039a90612f08565b83355f90815260078201602052604090205415611c705760405162461bcd60e51b815260040161039a90612f49565b611c7d6040850185612c6a565b9050603014611c9e5760405162461bcd60e51b815260040161039a90612f91565b611ca78361245c565b5f80611d416040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611cec91906132fe565b6001600160401b03168152602001611d0760408a018a612c6a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506125fd565b5f82815260058601602052604090209193509150611d5f8282613362565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d8c908590600401612c21565b6020604051808303815f875af1158015611da8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dcc9190612c53565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115611e4457611e44612beb565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f24918e01908e016132fe565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206134fd8339815191526020526040808220815160e0810190925280545f805160206134bd83398151915293929190829060ff166005811115611f9f57611f9f612beb565b6005811115611fb057611fb0612beb565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561202257612022612beb565b1461207e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161039a565b61208b816080015161245c565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156120cf576120cf612beb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121848461217e81611890565b5f610fa4565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906121b3908590600401612c21565b6020604051808303815f875af11580156121cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121f39190612c53565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461226b5760405162461bcd60e51b815260040161039a90613206565b5f805b60028110156122ba576122828160016130e8565b61228d9060086130fb565b61ffff168582815181106122a3576122a3612d18565b016020015160f81c901b919091179060010161226e565b5061ffff8116156122dd5760405162461bcd60e51b815260040161039a9061324f565b5f805b6004811015612338576122f48160036130e8565b6122ff9060086130fb565b63ffffffff1686612311836002613112565b8151811061232157612321612d18565b016020015160f81c901b91909117906001016122e0565b5063ffffffff811660021461235f5760405162461bcd60e51b815260040161039a90613292565b5f805b60208110156123b45761237681601f6130e8565b6123819060086130fb565b8761238d836006613112565b8151811061239d5761239d612d18565b016020015160f81c901b9190911790600101612362565b505f866026815181106123c9576123c9612d18565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c7157604051631afcd79f60e31b815260040160405180910390fd5b61243a6123e9565b6124426129a2565b610ca0816129aa565b6124536123e9565b610ca081612a20565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206134bd8339815191529060ff165f0361249a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906124e290836130e8565b106124fe576001600160401b038416604083015280825261251d565b83826040018181516125109190613421565b6001600160401b03169052505b5f8260200151836040015160646125349190613448565b61253e919061346b565b600285015490915060ff90811690821611156125b95760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161039a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f60608260800151516030146126675760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161039a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156126de5761269e8160016130e8565b6126a99060086130fb565b5081515f908390839081106126c0576126c0612d18565b60200101906001600160f81b03191690815f1a90535060010161268a565b505f5b600481101561273c576126f58160036130e8565b6127009060086130fb565b505f8261270e836002613112565b8151811061271e5761271e612d18565b60200101906001600160f81b03191690815f1a9053506001016126e1565b505f5b6020811015612799578451816020811061275b5761275b612d18565b1a60f81b8261276b836006613112565b8151811061277b5761277b612d18565b60200101906001600160f81b03191690815f1a90535060010161273f565b505f5b60208110156127f957846020015181602081106127bb576127bb612d18565b1a60f81b826127cb836026613112565b815181106127db576127db612d18565b60200101906001600160f81b03191690815f1a90535060010161279c565b505f5b600881101561286d576128108160076130e8565b61281b9060086130fb565b60ff1685604001516001600160401b0316901c60f81b8282604661283f9190613112565b8151811061284f5761284f612d18565b60200101906001600160f81b03191690815f1a9053506001016127fc565b505f5b60308110156128d8578460800151818151811061288f5761288f612d18565b01602001516001600160f81b031916826128aa83604e613112565b815181106128ba576128ba612d18565b60200101906001600160f81b03191690815f1a905350600101612870565b505f5b600881101561294a576128ef8160076130e8565b6128fa9060086130fb565b60608601516001600160401b0390811691161c60f81b8261291c83607e613112565b8151811061292c5761292c612d18565b60200101906001600160f81b03191690815f1a9053506001016128db565b5060028160405161295b9190612ec2565b602060405180830381855afa158015612976573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129999190612c53565b94909350915050565b610c716123e9565b6129b26123e9565b80355f805160206134bd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556129fc606083016040840161349c565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b610f726123e9565b508054612a3490612fde565b5f825580601f10612a43575050565b601f0160209004905f5260205f2090810190610ca091905b80821115612a6e575f8155600101612a5b565b5090565b5f60208284031215612a82575f80fd5b5035919050565b6001600160a01b0381168114610ca0575f80fd5b5f8060408385031215612aae575f80fd5b82356001600160401b03811115612ac3575f80fd5b830160a08186031215612ad4575f80fd5b91506020830135612ae481612a89565b809150509250929050565b803563ffffffff81168114612b02575f80fd5b919050565b5f60208284031215612b17575f80fd5b610c8682612aef565b5f8060408385031215612b31575f80fd5b82356001600160401b03811115612b46575f80fd5b830160808186031215612b57575f80fd5b9150612b6560208401612aef565b90509250929050565b80356001600160401b0381168114612b02575f80fd5b5f8060408385031215612b95575f80fd5b82356001600160401b03811115612baa575f80fd5b830160608186031215612bbb575f80fd5b9150612b6560208401612b6e565b5f60208284031215612bd9575f80fd5b8135612be481612a89565b9392505050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612c19578181015183820152602001612c01565b50505f910152565b602081525f8251806020840152612c3f816040850160208701612bff565b601f01601f19169190910160400192915050565b5f60208284031215612c63575f80fd5b5051919050565b5f808335601e19843603018112612c7f575f80fd5b8301803591506001600160401b03821115612c98575f80fd5b602001915036819003821315612cac575f80fd5b9250929050565b848152836020820152818360408301375f91016040019081529392505050565b5f808335601e19843603018112612ce8575f80fd5b8301803591506001600160401b03821115612d01575f80fd5b6020019150600581901b3603821315612cac575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612d40575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612d8057612d80612d4a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612dae57612dae612d4a565b604052919050565b5f6001600160401b03821115612dce57612dce612d4a565b50601f01601f191660200190565b5f60608236031215612dec575f80fd5b612df4612d5e565b823581526020612e05818501612b6e565b8183015260408401356001600160401b03811115612e21575f80fd5b840136601f820112612e31575f80fd5b8035612e44612e3f82612db6565b612d86565b8181523684838501011115612e57575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551612e84818460208a01612bff565b80830190508581526001600160401b0360c01b8560c01b1660208201528351612eb4816028840160208801612bff565b016028019695505050505050565b5f8251612d40818460208701612bff565b6bffffffffffffffffffffffff198135818116916014851015612f005780818660140360031b1b83161692505b505092915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b600181811c90821680612ff257607f821691505b60208210810361301057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201525f805160206134dd8339815191526040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461305c81612fde565b806020870152604060018084165f811461307d5760018114613099576130c6565b60ff19851660408a0152604084151560051b8a010195506130c6565b895f5260205f205f5b858110156130bd5781548b82018601529083019088016130a2565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c8957610c896130d4565b8082028115828204841417610c8957610c896130d4565b80820180821115610c8957610c896130d4565b80518015158114612b02575f80fd5b5f8060408385031215613145575f80fd5b82516001600160401b038082111561315b575f80fd5b908401906060828703121561316e575f80fd5b613176612d5e565b8251815260208084015161318981612a89565b8282015260408401518381111561319e575f80fd5b80850194505087601f8501126131b2575f80fd5b835192506131c2612e3f84612db6565b83815288828587010111156131d5575f80fd5b6131e484838301848801612bff565b806040840152508195506131f9818801613125565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b038083168181036132f4576132f46130d4565b6001019392505050565b5f6020828403121561330e575f80fd5b610c8682612b6e565b601f82111561054157805f5260205f20601f840160051c8101602085101561333c5750805b601f840160051c820191505b8181101561335b575f8155600101613348565b5050505050565b81516001600160401b0381111561337b5761337b612d4a565b61338f816133898454612fde565b84613317565b602080601f8311600181146133c2575f84156133ab5750858301515b5f19600386901b1c1916600185901b178555613419565b5f85815260208120601f198616915b828110156133f0578886015182559484019460019091019084016133d1565b508582101561340d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115613441576134416130d4565b5092915050565b6001600160401b03818116838216028082169190828114612f0057612f006130d4565b5f6001600160401b038084168061349057634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f602082840312156134ac575f80fd5b813560ff81168114612be4575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0056616c696461746f724d616e616765723a20696e76616c69642076616c696461e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -382,23 +399,23 @@ func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteValida return _PoAValidatorManager.Contract.CompleteValidatorRegistration(&_PoAValidatorManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0xc151c0b9. +// Initialize is a paid mutator transaction binding the contract method 0x0cb0a105. // -// Solidity: function initialize((bytes32,bytes32,uint8) settings, address initialOwner) returns() +// Solidity: function initialize((bytes32,bytes32,uint8,(bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]),uint32) settings, address initialOwner) returns() func (_PoAValidatorManager *PoAValidatorManagerTransactor) Initialize(opts *bind.TransactOpts, settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { return _PoAValidatorManager.contract.Transact(opts, "initialize", settings, initialOwner) } -// Initialize is a paid mutator transaction binding the contract method 0xc151c0b9. +// Initialize is a paid mutator transaction binding the contract method 0x0cb0a105. // -// Solidity: function initialize((bytes32,bytes32,uint8) settings, address initialOwner) returns() +// Solidity: function initialize((bytes32,bytes32,uint8,(bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]),uint32) settings, address initialOwner) returns() func (_PoAValidatorManager *PoAValidatorManagerSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) } -// Initialize is a paid mutator transaction binding the contract method 0xc151c0b9. +// Initialize is a paid mutator transaction binding the contract method 0x0cb0a105. // -// Solidity: function initialize((bytes32,bytes32,uint8) settings, address initialOwner) returns() +// Solidity: function initialize((bytes32,bytes32,uint8,(bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]),uint32) settings, address initialOwner) returns() func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) } @@ -445,6 +462,27 @@ func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeVali return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, registrationInput, weight) } +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorSet(&_PoAValidatorManager.TransactOpts, subnetConversionData, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x561404fd. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,bytes,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorSet(&_PoAValidatorManager.TransactOpts, subnetConversionData, messageIndex) +} + // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. // // Solidity: function renounceOwnership() returns() @@ -529,6 +567,160 @@ func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) TransferOwners return _PoAValidatorManager.Contract.TransferOwnership(&_PoAValidatorManager.TransactOpts, newOwner) } +// PoAValidatorManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitialValidatorCreatedIterator struct { + Event *PoAValidatorManagerInitialValidatorCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitialValidatorCreated struct { + ValidationID [32]byte + NodeID [32]byte + Weight *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*PoAValidatorManagerInitialValidatorCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerInitialValidatorCreatedIterator{contract: _PoAValidatorManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil +} + +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerInitialValidatorCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*PoAValidatorManagerInitialValidatorCreated, error) { + event := new(PoAValidatorManagerInitialValidatorCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // PoAValidatorManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the PoAValidatorManager contract. type PoAValidatorManagerInitializedIterator struct { Event *PoAValidatorManagerInitialized // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/staking/PoAValidatorManager/packing.go b/abi-bindings/go/staking/PoAValidatorManager/packing.go new file mode 100644 index 000000000..192b5c3d8 --- /dev/null +++ b/abi-bindings/go/staking/PoAValidatorManager/packing.go @@ -0,0 +1,53 @@ +// (c) 2024, Ava Labs, Inc. All rights reserved. +// See the file LICENSE for licensing terms. + +package poavalidatormanager + +import ( + "fmt" + + "github.com/ava-labs/subnet-evm/accounts/abi" +) + +var subnetConversionDataType abi.Type + +func init() { + var err error + subnetConversionDataType, err = abi.NewType("tuple", "struct Overloader.F", []abi.ArgumentMarshaling{ + {Name: "convertSubnetTxID", Type: "bytes32"}, + {Name: "blockchainID", Type: "bytes32"}, + {Name: "validatorManagerAddress", Type: "bytes"}, + {Name: "initialValidators", Type: "tuple[]", Components: []abi.ArgumentMarshaling{ + {Name: "nodeID", Type: "bytes32"}, + {Name: "weight", Type: "uint64"}, + {Name: "blsPublicKey", Type: "bytes"}, + }}, + }) + if err != nil { + panic(fmt.Sprintf("failed to create subnetConversionData ABI type: %v", err)) + } +} + +func (s *SubnetConversionData) Pack() ([]byte, error) { + args := abi.Arguments{ + { + Name: "subnetConversionData", + Type: subnetConversionDataType, + }, + } + return args.Pack(s) +} + +func (s *SubnetConversionData) Unpack(b []byte) error { + args := abi.Arguments{ + { + Name: "subnetConversionData", + Type: subnetConversionDataType, + }, + } + unpacked, err := args.Unpack(b) + if err != nil { + return fmt.Errorf("failed to unpack to subnetConversionData with err: %v", err) + } + return args.Copy(&s, unpacked) +} diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 95ba3bf88..d1bdee66a 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -464,7 +464,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "ValidatorManager: Invinvalidalid warp message"); + require(valid, "ValidatorManager: Invalid warp message"); require( warpMessage.sourceChainID == $._pChainBlockchainID, "ValidatorManager: invalid source chain ID" diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index 2b91a7405..8334199eb 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -52,7 +52,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 --force --extra-output-files abi bin +forge build --skip test --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 ba0b7db67..cb77922f8 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -27,7 +27,7 @@ export AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego cd $TELEPORTER_PATH if command -v forge &> /dev/null; then - forge build + forge build --skip test else echo "Forge command not found, attempting to use from $HOME" $HOME/.foundry/bin/forge build diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 1310f9835..cc0c51460 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -2,11 +2,14 @@ package staking import ( "context" + "crypto/sha256" "math/big" "time" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" + avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" + "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" "github.com/ava-labs/subnet-evm/accounts/abi/bind" poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" @@ -73,6 +76,35 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { ownerAddress, ) + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + Expect(err).Should(BeNil()) + + convertSubnetTxId := ids.GenerateTestID() + subnetConversionData := poavalidatormanager.SubnetConversionData{ + ConvertSubnetTxID: convertSubnetTxId, + BlockchainID: subnetAInfo.BlockchainID, + ValidatorManagerAddress: validatorManagerAddress.Bytes(), + InitialValidators: []poavalidatormanager.InitialValidator{ + { + NodeID: ids.GenerateTestID(), + Weight: 1, + BlsPublicKey: []byte{}, + }, + }, + } + unsignedMsg := createOffChainSubnetConversionMessage(subnetConversionData, pChainInfo, network.GetNetworkID()) + + unsignedMsgs := []avalancheWarp.UnsignedMessage{*unsignedMsg} + warpConfigWithMsg := utils.GetChainConfigWithOffChainMessages(unsignedMsgs) + chainConfigs := make(utils.ChainConfigMap) + chainConfigs.Add(subnetAInfo, warpConfigWithMsg) + + network.SetChainConfigs(chainConfigs) + // network.RestartNodes(context.Background(), network.GetAllNodeIDs()) + + _, err = validatorManager.InitializeValidatorSet(opts, subnetConversionData, 0) + Expect(err).Should(BeNil()) + var validationID ids.ID // To be used in the delisting step nodeID := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} @@ -138,3 +170,28 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { ) } } + +func createOffChainSubnetConversionMessage( + subnetConversionData poavalidatormanager.SubnetConversionData, + pChainInfo interfaces.SubnetTestInfo, + networkID uint32, +) *avalancheWarp.UnsignedMessage { + subnetConversionBytes, err := subnetConversionData.Pack() + Expect(err).Should(BeNil()) + subnetConversionID := sha256.Sum256(subnetConversionBytes) + sourceAddress := []byte{} + + payloadBytes := make([]byte, 38) + copy(payloadBytes[:6], subnetConversionID[:]) + addressedPayload, err := payload.NewAddressedCall(sourceAddress, payloadBytes) + Expect(err).Should(BeNil()) + + unsignedMessage, err := avalancheWarp.NewUnsignedMessage( + networkID, + pChainInfo.BlockchainID, + addressedPayload.Bytes(), + ) + Expect(err).Should(BeNil()) + + return unsignedMessage +} diff --git a/tests/utils/staking.go b/tests/utils/staking.go index eb2687745..45d2d532e 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -225,10 +225,8 @@ func InitializeNativeValidatorRegistration( RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), BlsPublicKey: blsPublicKey[:], }, - nativetokenstakingmanager.PoSValidatorRequirements{ - DelegationFeeBips: defaultMinDelegateFeeBips, - MinStakeDuration: defaultMinStakeDurationSeconds, - }, + defaultMinDelegateFeeBips, + defaultMinStakeDurationSeconds, ) Expect(err).Should(BeNil()) receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) @@ -269,10 +267,8 @@ func InitializeERC20ValidatorRegistration( RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), BlsPublicKey: blsPublicKey[:], }, - erc20tokenstakingmanager.PoSValidatorRequirements{ - DelegationFeeBips: defaultMinDelegateFeeBips, - MinStakeDuration: defaultMinStakeDurationSeconds, - }, + defaultMinDelegateFeeBips, + defaultMinStakeDurationSeconds, stakeAmount, ) Expect(err).Should(BeNil()) From f2c13d530640a3a5dfdb5876ad6ee0c8a06eb47b Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 12:33:50 -0400 Subject: [PATCH 288/545] Fixups --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 45 ++++++------------- 3 files changed, 16 insertions(+), 33 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index a0bb8e748..6b453d2dd 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161560c38038061560c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154bf8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a36600461494d565b61036a565b005b61015f61016f366004614988565b610894565b6101b2610182366004614988565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614988565b610a64565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149b3565b610a7a565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149f1565b610b59565b61015f61025a366004614a0a565b610bfd565b6101b261026d366004614a46565b610dcd565b6101f2610280366004614988565b610de6565b61015f61029336600461494d565b610dfa565b61015f6102a6366004614a0a565b611019565b6101b26102b9366004614a61565b611257565b6101b26102cc366004614a81565b61126a565b61015f6102df3660046149f1565b611296565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610320366004614988565b611453565b61015f610333366004614988565b6116d9565b6101cd601481565b61035361034e366004614988565b6117e8565b6040516101bc9190614af6565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615413833981519152949193919290829060ff1660048111156103d2576103d2614ae2565b60048111156103e3576103e3614ae2565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117e8565b90504260028351600481111561047757610477614ae2565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206154338339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206154338339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118c7565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614ae2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610774575f61065e8689611949565b6001600160401b03169050605060ff168460c001518461067e9190614be4565b6106889190614c04565b6001600160401b031661069c826064614c2f565b10156106ba5760405162461bcd60e51b81526004016104c090614c46565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561073e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107629190614c9b565b5f8b8152600989016020526040902055505b60028351600581111561078957610789614ae2565b0361079b5761079b8460600151611be5565b5f84606001518460a001516107b09190614be4565b90506107bc8682611bf2565b5f6005600160991b0163ee5b48eb6107d5898686611c3a565b6040518263ffffffff1660e01b81526004016107f19190614cd4565b6020604051808303815f875af115801561080d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108319190614c9b565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061549383398151915260205260408082208151610100810190925280545f8051602061545383398151915293929190829060ff1660058111156108e2576108e2614ae2565b60058111156108f3576108f3614ae2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097857610978614ae2565b146109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a028584608001515f611c3a565b6040518263ffffffff1660e01b8152600401610a1e9190614cd4565b6020604051808303815f875af1158015610a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190614c9b565b50505050565b5f610a7464e8d4a5100083614d06565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac3575080546001600160401b03808416911610155b15610ae15760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0c8484611e57565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610b6382611e75565b6040808201516001600160a01b0381165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a60205291909120549192505f8051602061541383398151915291610bbc91906121e8565b604080830180516001600160a01b03165f908152600a84016020529182209190915560608301519051610bf8916001600160401b03169061225e565b505050565b5f805160206154138339815191525f610c1584612281565b90505f80610c268360400151612462565b50915091505f610c35836117e8565b9050816001600160401b031681608001516001600160401b03161015610c6d5760405162461bcd60e51b81526004016104c090614d25565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cb25760405162461bcd60e51b81526004016104c090614d67565b60015f87815260068701602052604090205460ff166004811115610cd857610cd8614ae2565b14610d415760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a746001600160401b03831664e8d4a51000614c2f565b5f610df0826117e8565b60a0015192915050565b5f805160206154138339815191525f610e128561269d565b5f86815260058401602052604090205460c0820151919250610e4491620100009091046001600160401b031690614db0565b6001600160401b03168160e001516001600160401b03161015610ec55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315611012575f610ed68685611949565b9050605060ff168260c001518360e00151610ef19190614be4565b610efb9190614c04565b6001600160401b0316610f0f826064614c04565b6001600160401b03161015610f365760405162461bcd60e51b81526004016104c090614c46565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610fba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fde9190614c9b565b6040808401516001600160a01b03165f908152600a8601602052908120805490919061100b908490614dd0565b9091555050505b5050505050565b5f805160206154138339815191525f61103184612281565b90505f806110428360400151612462565b50915091505f611051836117e8565b9050816001600160401b031681608001516001600160401b031610156110895760405162461bcd60e51b81526004016104c090614d25565b5f8681526006860160205260409020600301546001600160401b03808416911611156110c75760405162461bcd60e51b81526004016104c090614d67565b60035f87815260068701602052604090205460ff1660048111156110ed576110ed614ae2565b146111415760405162461bcd60e51b815260206004820152603160248201525f805160206154338339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526111e69161225e565b6112078160200151876009015f8a81526020019081526020015f20546121e8565b5f878152600987016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f611263833384612a46565b9392505050565b5f611273612e44565b61127e848484612e7b565b905061126360015f8051602061547383398151915255565b5f805160206154538339815191525f6112ae83612281565b90505f806112bf83604001516130b4565b91509150806113215760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461133b90614de3565b905011801561136d575060015f83815260088601602052604090205460ff16600581111561136b5761136b614ae2565b145b6113895760405162461bcd60e51b81526004016104c090614e1b565b5f82815260078501602052604081206113a191614895565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061541383398151915293929190829060ff1660048111156114b4576114b4614ae2565b60048111156114c5576114c5614ae2565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561154c5761154c614ae2565b148061156a575060038151600481111561156857611568614ae2565b145b6115be5760405162461bcd60e51b815260206004820152603260248201525f80516020615433833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115cc82604001516117e8565b905080608001516001600160401b03165f036116505760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb61167d846040015184608001518560a00151611c3a565b6040518263ffffffff1660e01b81526004016116999190614cd4565b6020604051808303815f875af11580156116b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110129190614c9b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061545383398151915292919061172190614de3565b9050118015611753575060015f83815260088301602052604090205460ff16600581111561175157611751614ae2565b145b61176f5760405162461bcd60e51b81526004016104c090614e1b565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117a89190600401614e62565b6020604051808303815f875af11580156117c4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf89190614c9b565b6117f06148cc565b5f8281525f805160206154938339815191526020526040908190208151610100810190925280545f80516020615453833981519152929190829060ff16600581111561183e5761183e614ae2565b600581111561184f5761184f614ae2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154938339815191526020526040812060030180545f80516020615453833981519152916001600160401b03909116908361190a83614eec565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611994573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119bb9190810190614f88565b9150915080611a1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a859190614c9b565b825114611ae95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b5f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b6e8460400151613255565b91509150818714611bdb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bef815f61342d565b50565b5f9182525f80516020615493833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cb357611c73816001615070565b611c7e906008614c2f565b5081515f90839083908110611c9557611c95615083565b60200101906001600160f81b03191690815f1a905350600101611c5f565b505f5b6004811015611d1657611cca816003615070565b611cd5906008614c2f565b6001901c60f81b82611ce8836002614dd0565b81518110611cf857611cf8615083565b60200101906001600160f81b03191690815f1a905350600101611cb6565b505f5b6020811015611d7857611d2d81601f615070565b611d38906008614c2f565b86901c60f81b82611d4a836006614dd0565b81518110611d5a57611d5a615083565b60200101906001600160f81b03191690815f1a905350600101611d19565b505f5b6008811015611de357611d8f816007615070565b611d9a906008614c2f565b6001600160401b038616901c60f81b82611db5836026614dd0565b81518110611dc557611dc5615083565b60200101906001600160f81b03191690815f1a905350600101611d7b565b505f5b6008811015611e4e57611dfa816007615070565b611e05906008614c2f565b6001600160401b038516901c60f81b82611e2083602e614dd0565b81518110611e3057611e30615083565b60200101906001600160f81b03191690815f1a905350600101611de6565b50949350505050565b611e5f613687565b611e68826136d2565b611e718161373e565b5050565b611e7d6148cc565b5f805160206154538339815191525f611e9584612281565b90505f80611ea683604001516130b4565b915091508015611f0b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f3d57611f3d614ae2565b6005811115611f4e57611f4e614ae2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fd557611fd5614ae2565b1480611ff35750600182516005811115611ff157611ff1614ae2565b145b6120525760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561206757612067614ae2565b0361207457506004612078565b5060055b6020808301515f908152600988019091526040812055818160058111156120a1576120a1614ae2565b908160058111156120b4576120b4614ae2565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120e8576120e8614ae2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121b3576121b3614ae2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153f383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612243575f80fd5b505af1158015612255573d5f803e3d5ffd5b50505050505050565b5f805160206153f383398151915254611e71906001600160a01b031682846137df565b60408051606080820183525f8083526020830181905292820152905f805160206154538339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156122f6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261231d9190810190614f88565b91509150806123845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123e75760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b03161561245a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124865760405162461bcd60e51b81526004016104c090615097565b5f805b60028110156124d55761249d816001615070565b6124a8906008614c2f565b61ffff168682815181106124be576124be615083565b016020015160f81c901b9190911790600101612489565b5061ffff8116156124f85760405162461bcd60e51b81526004016104c0906150e0565b5f805b60048110156125535761250f816003615070565b61251a906008614c2f565b63ffffffff168761252c836002614dd0565b8151811061253c5761253c615083565b016020015160f81c901b91909117906001016124fb565b5063ffffffff811660031461257a5760405162461bcd60e51b81526004016104c090615123565b5f805b60208110156125cf5761259181601f615070565b61259c906008614c2f565b886125a8836006614dd0565b815181106125b8576125b8615083565b016020015160f81c901b919091179060010161257d565b505f805b600881101561262e576125e7816007615070565b6125f2906008614c2f565b6001600160401b031689612607836026614dd0565b8151811061261757612617615083565b016020015160f81c901b91909117906001016125d3565b505f805b600881101561268d57612646816007615070565b612651906008614c2f565b6001600160401b03168a61266683602e614dd0565b8151811061267657612676615083565b016020015160f81c901b9190911790600101612632565b5091989097509095509350505050565b6126a56148cc565b5f8281525f8051602061549383398151915260205260408082208151610100810190925280545f8051602061545383398151915293929190829060ff1660058111156126f3576126f3614ae2565b600581111561270457612704614ae2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561278c5761278c614ae2565b146127e85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b0316146128625760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61286f8160a00151611be5565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128b3576128b3614ae2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61297f85612979816118c7565b5f611c3a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129ae908590600401614cd4565b6020604051808303815f875af11580156129ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129ee9190614c9b565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a4f612e44565b5f805160206154138339815191525f612a6a6101ed8561383e565b90505f612a76876117e8565b9050600281516005811115612a8d57612a8d614ae2565b14612aec5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612af582613861565b5f828260a00151612b069190614db0565b60048501546060840151919250612b28916001600160401b0390911690614c04565b6001600160401b0316816001600160401b03161115612ba75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bb18882611bf2565b5f612bbb896118c7565b90505f8982604051602001612be792919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c218d8688611c3a565b6040518263ffffffff1660e01b8152600401612c3d9190614cd4565b6020604051808303815f875af1158015612c59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c7d9190614c9b565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d0557612d05614ae2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126360015f8051602061547383398151915255565b5f80516020615473833981519152805460011901612e7557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615413833981519152906001600160401b0316612ec76040860160208701614a46565b6001600160401b03161015612f365760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f486020860186615179565b61ffff1610158015612f6c5750612710612f656020860186615179565b61ffff1611155b612f885760405162461bcd60e51b81526004016104c090615194565b8054831015612feb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b80600101548311156130525760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61305c8461383e565b90505f61306882610a64565b90505f613075888361386c565b5f8181526005860160205260409020909150879061309382826151df565b509098975050505050505050565b60015f8051602061547383398151915255565b5f8082516027146130d75760405162461bcd60e51b81526004016104c090615097565b5f805b6002811015613126576130ee816001615070565b6130f9906008614c2f565b61ffff1685828151811061310f5761310f615083565b016020015160f81c901b91909117906001016130da565b5061ffff8116156131495760405162461bcd60e51b81526004016104c0906150e0565b5f805b60048110156131a457613160816003615070565b61316b906008614c2f565b63ffffffff168661317d836002614dd0565b8151811061318d5761318d615083565b016020015160f81c901b919091179060010161314c565b5063ffffffff81166002146131cb5760405162461bcd60e51b81526004016104c090615123565b5f805b6020811015613220576131e281601f615070565b6131ed906008614c2f565b876131f9836006614dd0565b8151811061320957613209615083565b016020015160f81c901b91909117906001016131ce565b505f8660268151811061323557613235615083565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132785760405162461bcd60e51b81526004016104c090615097565b5f805b60028110156132c75761328f816001615070565b61329a906008614c2f565b61ffff168582815181106132b0576132b0615083565b016020015160f81c901b919091179060010161327b565b5061ffff8116156132ea5760405162461bcd60e51b81526004016104c0906150e0565b5f805b600481101561334557613301816003615070565b61330c906008614c2f565b63ffffffff168661331e836002614dd0565b8151811061332e5761332e615083565b016020015160f81c901b91909117906001016132ed565b5063ffffffff811660041461336c5760405162461bcd60e51b81526004016104c090615123565b5f805b60208110156133c15761338381601f615070565b61338e906008614c2f565b8761339a836006614dd0565b815181106133aa576133aa615083565b016020015160f81c901b919091179060010161336f565b505f805b6008811015613420576133d9816007615070565b6133e4906008614c2f565b6001600160401b0316886133f9836026614dd0565b8151811061340957613409615083565b016020015160f81c901b91909117906001016133c5565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061545383398151915291429190158061351357506002830154815161350f916001600160401b031690614dd0565b8210155b15613539576001600160401b038516606082015281815260408101516020820152613558565b848160600181815161354b9190614db0565b6001600160401b03169052505b6060810151613568906064614c04565b602082015160028501546001600160401b0392909216916135939190600160401b900460ff16614c2f565b10156135f75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362057846001600160401b0316816040018181516136189190614dd0565b90525061363f565b846001600160401b03168160400181815161363b9190615070565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136d057604051631afcd79f60e31b815260040160405180910390fd5b565b6136da613687565b6136e381613da6565b611bef608082013560a083013561370060e0850160c08601614a46565b613711610100860160e08701615179565b61ffff1661372761012087016101008801615235565b61373961014088016101208901615255565b613dc7565b613746613687565b5f805160206153f38339815191526001600160a01b0382166137bf5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bf891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061400b565b5f610a74825f805160206153f3833981519152546001600160a01b03169061406c565b611bef81600161342d565b5f5f805160206154538339815191524261388c6040860160208701614a46565b6001600160401b0316116138fe5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b61390e6040850160208601614a46565b6001600160401b03166139246202a30042614dd0565b116139975760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139ef5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a5f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a6c6040850185615270565b9050603014613ad35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613adc83613861565b5f80613b766040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b219190614a46565b6001600160401b03168152602001613b3c60408a018a615270565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141ce565b5f82815260078601602052604090209193509150613b9482826152fd565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bc1908590600401614cd4565b6020604051808303815f875af1158015613bdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c019190614c9b565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8357613c83614ae2565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d7891908e01908e01614a46565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613dae613687565b613db6614573565b613dbe614583565b611bef8161458b565b613dcf613687565b5f8051602061541383398151915283613e3b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e5d5760405162461bcd60e51b81526004016104c090615194565b85871115613ec55760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f325760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fa45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61401f6001600160a01b03841683614738565b905080515f1415801561404357508080602001905181019061404191906153bc565b155b15610bf857604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d69190614c9b565b90506140ed6001600160a01b038516333086614745565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614131573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141559190614c9b565b90508181116141bb5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141c58282615070565b95945050505050565b5f60608260800151516030146142385760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142af5761426f816001615070565b61427a906008614c2f565b5081515f9083908390811061429157614291615083565b60200101906001600160f81b03191690815f1a90535060010161425b565b505f5b600481101561430d576142c6816003615070565b6142d1906008614c2f565b505f826142df836002614dd0565b815181106142ef576142ef615083565b60200101906001600160f81b03191690815f1a9053506001016142b2565b505f5b602081101561436a578451816020811061432c5761432c615083565b1a60f81b8261433c836006614dd0565b8151811061434c5761434c615083565b60200101906001600160f81b03191690815f1a905350600101614310565b505f5b60208110156143ca578460200151816020811061438c5761438c615083565b1a60f81b8261439c836026614dd0565b815181106143ac576143ac615083565b60200101906001600160f81b03191690815f1a90535060010161436d565b505f5b600881101561443e576143e1816007615070565b6143ec906008614c2f565b60ff1685604001516001600160401b0316901c60f81b828260466144109190614dd0565b8151811061442057614420615083565b60200101906001600160f81b03191690815f1a9053506001016143cd565b505f5b60308110156144a9578460800151818151811061446057614460615083565b01602001516001600160f81b0319168261447b83604e614dd0565b8151811061448b5761448b615083565b60200101906001600160f81b03191690815f1a905350600101614441565b505f5b600881101561451b576144c0816007615070565b6144cb906008614c2f565b60608601516001600160401b0390811691161c60f81b826144ed83607e614dd0565b815181106144fd576144fd615083565b60200101906001600160f81b03191690815f1a9053506001016144ac565b5060028160405161452c91906153d7565b602060405180830381855afa158015614547573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061456a9190614c9b565b94909350915050565b61457b613687565b6136d061477e565b6136d0613687565b614593613687565b80355f8051602061545383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145df6080840160608501615235565b60ff16111561464c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61465d6080840160608501615235565b60ff16116146c55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146d56080830160608401615235565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147066060830160408401614a46565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126383835f614786565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5e9186918216906323b872dd9060840161380c565b6130a1613687565b6060814710156147ab5760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147c691906153d7565b5f6040518083038185875af1925050503d805f8114614800576040519150601f19603f3d011682016040523d82523d5f602084013e614805565b606091505b5091509150611bdb868383606082614825576148208261486c565b611263565b815115801561483c57506001600160a01b0384163b155b1561486557604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b5080611263565b80511561487c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148a190614de3565b5f825580601f106148b0575050565b601f0160209004905f5260205f2090810190611bef9190614910565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614924575f8155600101614911565b5090565b8015158114611bef575f80fd5b803563ffffffff81168114614948575f80fd5b919050565b5f805f6060848603121561495f575f80fd5b83359250602084013561497181614928565b915061497f60408501614935565b90509250925092565b5f60208284031215614998575f80fd5b5035919050565b6001600160a01b0381168114611bef575f80fd5b5f808284036101608112156149c6575f80fd5b610140808212156149d5575f80fd5b84935083013590506149e68161499f565b809150509250929050565b5f60208284031215614a01575f80fd5b61126382614935565b5f8060408385031215614a1b575f80fd5b614a2483614935565b946020939093013593505050565b6001600160401b0381168114611bef575f80fd5b5f60208284031215614a56575f80fd5b813561126381614a32565b5f8060408385031215614a72575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a94575f80fd5b84356001600160401b03811115614aa9575f80fd5b850160608188031215614aba575f80fd5b93506040601f1982011215614acd575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b1a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4260408401826001600160a01b03169052565b506060830151614b5d60608401826001600160401b03169052565b506080830151614b7860808401826001600160401b03169052565b5060a0830151614b9360a08401826001600160401b03169052565b5060c0830151614bae60c08401826001600160401b03169052565b5060e0830151614bc960e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bc957614bc9614bd0565b6001600160401b03818116838216028082169190828114614c2757614c27614bd0565b505092915050565b8082028115828204841417610a7457610a74614bd0565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f60208284031215614cab575f80fd5b5051919050565b5f5b83811015614ccc578181015183820152602001614cb4565b50505f910152565b602081525f8251806020840152614cf2816040850160208701614cb2565b601f01601f19169190910160400192915050565b5f82614d2057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bc957614bc9614bd0565b80820180821115610a7457610a74614bd0565b600181811c90821680614df757607f821691505b602082108103614e1557634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e7481614de3565b806020870152604060018084165f8114614e955760018114614eb157614ede565b60ff19851660408a0152604084151560051b8a01019550614ede565b895f5260205f205f5b85811015614ed55781548b8201860152908301908801614eba565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614f0757614f07614bd0565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f4757614f47614f11565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f7557614f75614f11565b604052919050565b805161494881614928565b5f8060408385031215614f99575f80fd5b82516001600160401b0380821115614faf575f80fd5b9084019060608287031215614fc2575f80fd5b614fca614f25565b82518152602080840151614fdd8161499f565b82820152604084015183811115614ff2575f80fd5b80850194505087601f850112615006575f80fd5b83518381111561501857615018614f11565b61502a601f8201601f19168301614f4d565b9350808452888282870101111561503f575f80fd5b61504e81838601848801614cb2565b50826040830152819550615063818801614f7d565b9450505050509250929050565b81810381811115610a7457610a74614bd0565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bef575f80fd5b5f60208284031215615189575f80fd5b81356112638161516a565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151ea8161516a565b61ffff8116905081548161ffff198216178355602084013561520b81614a32565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215615245575f80fd5b813560ff81168114611263575f80fd5b5f60208284031215615265575f80fd5b81356112638161499f565b5f808335601e19843603018112615285575f80fd5b8301803591506001600160401b0382111561529e575f80fd5b6020019150368190038213156152b2575f80fd5b9250929050565b601f821115610bf857805f5260205f20601f840160051c810160208510156152de5750805b601f840160051c820191505b81811015611012575f81556001016152ea565b81516001600160401b0381111561531657615316614f11565b61532a816153248454614de3565b846152b9565b602080601f83116001811461535d575f84156153465750858301515b5f19600386901b1c1916600185901b1785556153b4565b5f85815260208120601f198616915b8281101561538b5788860151825594840194600190910190840161536c565b50858210156153a857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156153cc575f80fd5b815161126381614928565b5f82516153e8818460208701614cb2565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161562138038061562183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154d48061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614962565b61036a565b005b61015f61016f36600461499d565b610894565b6101b261018236600461499d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed36600461499d565b610a64565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149c8565b610a7a565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614a06565b610b59565b61015f61025a366004614a1f565b610bde565b6101b261026d366004614a5b565b610dae565b6101f261028036600461499d565b610dc7565b61015f610293366004614962565b610ddb565b61015f6102a6366004614a1f565b610ffa565b6101b26102b9366004614a76565b61126c565b6101b26102cc366004614a96565b61127f565b61015f6102df366004614a06565b6112ab565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f61032036600461499d565b611468565b61015f61033336600461499d565b6116ee565b6101cd601481565b61035361034e36600461499d565b6117fd565b6040516101bc9190614b0b565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615428833981519152949193919290829060ff1660048111156103d2576103d2614af7565b60048111156103e3576103e3614af7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117fd565b90504260028351600481111561047757610477614af7565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206154488339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206154488339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118dc565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614af7565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610774575f61065e868961195e565b6001600160401b03169050605060ff168460c001518461067e9190614bf9565b6106889190614c19565b6001600160401b031661069c826064614c44565b10156106ba5760405162461bcd60e51b81526004016104c090614c5b565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561073e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107629190614cb0565b5f8b8152600989016020526040902055505b60028351600581111561078957610789614af7565b0361079b5761079b8460600151611bfa565b5f84606001518460a001516107b09190614bf9565b90506107bc8682611c07565b5f6005600160991b0163ee5b48eb6107d5898686611c4f565b6040518263ffffffff1660e01b81526004016107f19190614ce9565b6020604051808303815f875af115801561080d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108319190614cb0565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206154a883398151915260205260408082208151610100810190925280545f8051602061546883398151915293929190829060ff1660058111156108e2576108e2614af7565b60058111156108f3576108f3614af7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097857610978614af7565b146109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a028584608001515f611c4f565b6040518263ffffffff1660e01b8152600401610a1e9190614ce9565b6020604051808303815f875af1158015610a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190614cb0565b50505050565b5f610a7464e8d4a5100083614d1b565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac3575080546001600160401b03808416911610155b15610ae15760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0c8484611e6c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206154288339815191525f610b7183611e8a565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9d916121fd565b604080820180516001600160a01b03165f908152600a85016020529182209190915560608201519051610bd9916001600160401b031690612273565b505050565b5f805160206154288339815191525f610bf684612296565b90505f80610c078360400151612477565b50915091505f610c16836117fd565b9050816001600160401b031681608001516001600160401b03161015610c4e5760405162461bcd60e51b81526004016104c090614d3a565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b81526004016104c090614d7c565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9614af7565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a746001600160401b03831664e8d4a51000614c44565b5f610dd1826117fd565b60a0015192915050565b5f805160206154288339815191525f610df3856126b2565b5f86815260058401602052604090205460c0820151919250610e2591620100009091046001600160401b031690614dc5565b6001600160401b03168160e001516001600160401b03161015610ea65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610ff3575f610eb7868561195e565b9050605060ff168260c001518360e00151610ed29190614bf9565b610edc9190614c19565b6001600160401b0316610ef0826064614c19565b6001600160401b03161015610f175760405162461bcd60e51b81526004016104c090614c5b565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610f9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbf9190614cb0565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fec908490614de5565b9091555050505b5050505050565b5f805160206154288339815191525f61101284612296565b90505f806110238360400151612477565b50915091505f611032836117fd565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106c5761106c614af7565b600481111561107d5761107d614af7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561111c5760405162461bcd60e51b81526004016104c090614d3a565b5f8781526006870160205260409020600301546001600160401b038085169116111561115a5760405162461bcd60e51b81526004016104c090614d7c565b60038151600481111561116f5761116f614af7565b146111c35760405162461bcd60e51b815260206004820152603160248201525f805160206154488339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111f991906121fd565b856009015f8881526020019081526020015f205f905561122a81606001516001600160401b03168260200151612273565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f611278833384612a5b565b9392505050565b5f611288612e59565b611293848484612e90565b905061127860015f8051602061548883398151915255565b5f805160206154688339815191525f6112c383612296565b90505f806112d483604001516130c9565b91509150806113365760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461135090614df8565b9050118015611382575060015f83815260088601602052604090205460ff16600581111561138057611380614af7565b145b61139e5760405162461bcd60e51b81526004016104c090614e30565b5f82815260078501602052604081206113b6916148aa565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061542883398151915293929190829060ff1660048111156114c9576114c9614af7565b60048111156114da576114da614af7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561156157611561614af7565b148061157f575060038151600481111561157d5761157d614af7565b145b6115d35760405162461bcd60e51b815260206004820152603260248201525f80516020615448833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115e182604001516117fd565b905080608001516001600160401b03165f036116655760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611692846040015184608001518560a00151611c4f565b6040518263ffffffff1660e01b81526004016116ae9190614ce9565b6020604051808303815f875af11580156116ca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff39190614cb0565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061546883398151915292919061173690614df8565b9050118015611768575060015f83815260088301602052604090205460ff16600581111561176657611766614af7565b145b6117845760405162461bcd60e51b81526004016104c090614e30565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117bd9190600401614e77565b6020604051808303815f875af11580156117d9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd99190614cb0565b6118056148e1565b5f8281525f805160206154a88339815191526020526040908190208151610100810190925280545f80516020615468833981519152929190829060ff16600581111561185357611853614af7565b600581111561186457611864614af7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154a88339815191526020526040812060030180545f80516020615468833981519152916001600160401b03909116908361191f83614f01565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156119a9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119d09190810190614f9d565b9150915080611a335760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9a9190614cb0565b825114611afe5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b745760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b83846040015161326a565b91509150818714611bf05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611c04815f613442565b50565b5f9182525f805160206154a8833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cc857611c88816001615085565b611c93906008614c44565b5081515f90839083908110611caa57611caa615098565b60200101906001600160f81b03191690815f1a905350600101611c74565b505f5b6004811015611d2b57611cdf816003615085565b611cea906008614c44565b6001901c60f81b82611cfd836002614de5565b81518110611d0d57611d0d615098565b60200101906001600160f81b03191690815f1a905350600101611ccb565b505f5b6020811015611d8d57611d4281601f615085565b611d4d906008614c44565b86901c60f81b82611d5f836006614de5565b81518110611d6f57611d6f615098565b60200101906001600160f81b03191690815f1a905350600101611d2e565b505f5b6008811015611df857611da4816007615085565b611daf906008614c44565b6001600160401b038616901c60f81b82611dca836026614de5565b81518110611dda57611dda615098565b60200101906001600160f81b03191690815f1a905350600101611d90565b505f5b6008811015611e6357611e0f816007615085565b611e1a906008614c44565b6001600160401b038516901c60f81b82611e3583602e614de5565b81518110611e4557611e45615098565b60200101906001600160f81b03191690815f1a905350600101611dfb565b50949350505050565b611e7461369c565b611e7d826136e7565b611e8681613753565b5050565b611e926148e1565b5f805160206154688339815191525f611eaa84612296565b90505f80611ebb83604001516130c9565b915091508015611f205760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f5257611f52614af7565b6005811115611f6357611f63614af7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fea57611fea614af7565b1480612008575060018251600581111561200657612006614af7565b145b6120675760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561207c5761207c614af7565b036120895750600461208d565b5060055b6020808301515f908152600988019091526040812055818160058111156120b6576120b6614af7565b908160058111156120c9576120c9614af7565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120fd576120fd614af7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121c8576121c8614af7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061540883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612258575f80fd5b505af115801561226a573d5f803e3d5ffd5b50505050505050565b5f8051602061540883398151915254611e86906001600160a01b031682846137f4565b60408051606080820183525f8083526020830181905292820152905f805160206154688339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561230b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123329190810190614f9d565b91509150806123995760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123fc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b03161561246f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f835160361461249b5760405162461bcd60e51b81526004016104c0906150ac565b5f805b60028110156124ea576124b2816001615085565b6124bd906008614c44565b61ffff168682815181106124d3576124d3615098565b016020015160f81c901b919091179060010161249e565b5061ffff81161561250d5760405162461bcd60e51b81526004016104c0906150f5565b5f805b600481101561256857612524816003615085565b61252f906008614c44565b63ffffffff1687612541836002614de5565b8151811061255157612551615098565b016020015160f81c901b9190911790600101612510565b5063ffffffff811660031461258f5760405162461bcd60e51b81526004016104c090615138565b5f805b60208110156125e4576125a681601f615085565b6125b1906008614c44565b886125bd836006614de5565b815181106125cd576125cd615098565b016020015160f81c901b9190911790600101612592565b505f805b6008811015612643576125fc816007615085565b612607906008614c44565b6001600160401b03168961261c836026614de5565b8151811061262c5761262c615098565b016020015160f81c901b91909117906001016125e8565b505f805b60088110156126a25761265b816007615085565b612666906008614c44565b6001600160401b03168a61267b83602e614de5565b8151811061268b5761268b615098565b016020015160f81c901b9190911790600101612647565b5091989097509095509350505050565b6126ba6148e1565b5f8281525f805160206154a883398151915260205260408082208151610100810190925280545f8051602061546883398151915293929190829060ff16600581111561270857612708614af7565b600581111561271957612719614af7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a1576127a1614af7565b146127fd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b0316146128775760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b6128848160a00151611bfa565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128c8576128c8614af7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129948561298e816118dc565b5f611c4f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c3908590600401614ce9565b6020604051808303815f875af11580156129df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a039190614cb0565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a64612e59565b5f805160206154288339815191525f612a7f6101ed85613853565b90505f612a8b876117fd565b9050600281516005811115612aa257612aa2614af7565b14612b015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b0a82613876565b5f828260a00151612b1b9190614dc5565b60048501546060840151919250612b3d916001600160401b0390911690614c19565b6001600160401b0316816001600160401b03161115612bbc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bc68882611c07565b5f612bd0896118dc565b90505f8982604051602001612bfc92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c368d8688611c4f565b6040518263ffffffff1660e01b8152600401612c529190614ce9565b6020604051808303815f875af1158015612c6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c929190614cb0565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d1a57612d1a614af7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061127860015f8051602061548883398151915255565b5f80516020615488833981519152805460011901612e8a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615428833981519152906001600160401b0316612edc6040860160208701614a5b565b6001600160401b03161015612f4b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f5d602086018661518e565b61ffff1610158015612f815750612710612f7a602086018661518e565b61ffff1611155b612f9d5760405162461bcd60e51b81526004016104c0906151a9565b80548310156130005760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b80600101548311156130675760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61307184613853565b90505f61307d82610a64565b90505f61308a8883613881565b5f818152600586016020526040902090915087906130a882826151f4565b509098975050505050505050565b60015f8051602061548883398151915255565b5f8082516027146130ec5760405162461bcd60e51b81526004016104c0906150ac565b5f805b600281101561313b57613103816001615085565b61310e906008614c44565b61ffff1685828151811061312457613124615098565b016020015160f81c901b91909117906001016130ef565b5061ffff81161561315e5760405162461bcd60e51b81526004016104c0906150f5565b5f805b60048110156131b957613175816003615085565b613180906008614c44565b63ffffffff1686613192836002614de5565b815181106131a2576131a2615098565b016020015160f81c901b9190911790600101613161565b5063ffffffff81166002146131e05760405162461bcd60e51b81526004016104c090615138565b5f805b6020811015613235576131f781601f615085565b613202906008614c44565b8761320e836006614de5565b8151811061321e5761321e615098565b016020015160f81c901b91909117906001016131e3565b505f8660268151811061324a5761324a615098565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461328d5760405162461bcd60e51b81526004016104c0906150ac565b5f805b60028110156132dc576132a4816001615085565b6132af906008614c44565b61ffff168582815181106132c5576132c5615098565b016020015160f81c901b9190911790600101613290565b5061ffff8116156132ff5760405162461bcd60e51b81526004016104c0906150f5565b5f805b600481101561335a57613316816003615085565b613321906008614c44565b63ffffffff1686613333836002614de5565b8151811061334357613343615098565b016020015160f81c901b9190911790600101613302565b5063ffffffff81166004146133815760405162461bcd60e51b81526004016104c090615138565b5f805b60208110156133d65761339881601f615085565b6133a3906008614c44565b876133af836006614de5565b815181106133bf576133bf615098565b016020015160f81c901b9190911790600101613384565b505f805b6008811015613435576133ee816007615085565b6133f9906008614c44565b6001600160401b03168861340e836026614de5565b8151811061341e5761341e615098565b016020015160f81c901b91909117906001016133da565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615468833981519152914291901580613528575060028301548151613524916001600160401b031690614de5565b8210155b1561354e576001600160401b03851660608201528181526040810151602082015261356d565b84816060018181516135609190614dc5565b6001600160401b03169052505b606081015161357d906064614c19565b602082015160028501546001600160401b0392909216916135a89190600160401b900460ff16614c44565b101561360c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561363557846001600160401b03168160400181815161362d9190614de5565b905250613654565b846001600160401b0316816040018181516136509190615085565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136e557604051631afcd79f60e31b815260040160405180910390fd5b565b6136ef61369c565b6136f881613dbb565b611c04608082013560a083013561371560e0850160c08601614a5b565b613726610100860160e0870161518e565b61ffff1661373c6101208701610100880161524a565b61374e6101408801610120890161526a565b613ddc565b61375b61369c565b5f805160206154088339815191526001600160a01b0382166137d45760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614020565b5f610a74825f80516020615408833981519152546001600160a01b031690614081565b611c04816001613442565b5f5f80516020615468833981519152426138a16040860160208701614a5b565b6001600160401b0316116139135760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139236040850160208601614a5b565b6001600160401b03166139396202a30042614de5565b116139ac5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b8335613a045760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a816040850185615285565b9050603014613ae85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613af183613876565b5f80613b8b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b369190614a5b565b6001600160401b03168152602001613b5160408a018a615285565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141e3565b5f82815260078601602052604090209193509150613ba98282615312565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bd6908590600401614ce9565b6020604051808303815f875af1158015613bf2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c169190614cb0565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c9857613c98614af7565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8d91908e01908e01614a5b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613dc361369c565b613dcb614588565b613dd3614598565b611c04816145a0565b613de461369c565b5f8051602061542883398151915283613e505760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e725760405162461bcd60e51b81526004016104c0906151a9565b85871115613eda5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f475760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fb95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6140346001600160a01b0384168361474d565b905080515f1415801561405857508080602001905181019061405691906153d1565b155b15610bd957604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140eb9190614cb0565b90506141026001600160a01b03851633308661475a565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614146573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061416a9190614cb0565b90508181116141d05760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141da8282615085565b95945050505050565b5f606082608001515160301461424d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142c457614284816001615085565b61428f906008614c44565b5081515f908390839081106142a6576142a6615098565b60200101906001600160f81b03191690815f1a905350600101614270565b505f5b6004811015614322576142db816003615085565b6142e6906008614c44565b505f826142f4836002614de5565b8151811061430457614304615098565b60200101906001600160f81b03191690815f1a9053506001016142c7565b505f5b602081101561437f578451816020811061434157614341615098565b1a60f81b82614351836006614de5565b8151811061436157614361615098565b60200101906001600160f81b03191690815f1a905350600101614325565b505f5b60208110156143df57846020015181602081106143a1576143a1615098565b1a60f81b826143b1836026614de5565b815181106143c1576143c1615098565b60200101906001600160f81b03191690815f1a905350600101614382565b505f5b6008811015614453576143f6816007615085565b614401906008614c44565b60ff1685604001516001600160401b0316901c60f81b828260466144259190614de5565b8151811061443557614435615098565b60200101906001600160f81b03191690815f1a9053506001016143e2565b505f5b60308110156144be578460800151818151811061447557614475615098565b01602001516001600160f81b0319168261449083604e614de5565b815181106144a0576144a0615098565b60200101906001600160f81b03191690815f1a905350600101614456565b505f5b6008811015614530576144d5816007615085565b6144e0906008614c44565b60608601516001600160401b0390811691161c60f81b8261450283607e614de5565b8151811061451257614512615098565b60200101906001600160f81b03191690815f1a9053506001016144c1565b5060028160405161454191906153ec565b602060405180830381855afa15801561455c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061457f9190614cb0565b94909350915050565b61459061369c565b6136e5614793565b6136e561369c565b6145a861369c565b80355f8051602061546883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145f4608084016060850161524a565b60ff1611156146615760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f614672608084016060850161524a565b60ff16116146da5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146ea608083016060840161524a565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561471b6060830160408401614a5b565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061127883835f61479b565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5e9186918216906323b872dd90608401613821565b6130b661369c565b6060814710156147c05760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147db91906153ec565b5f6040518083038185875af1925050503d805f8114614815576040519150601f19603f3d011682016040523d82523d5f602084013e61481a565b606091505b5091509150611bf086838360608261483a5761483582614881565b611278565b815115801561485157506001600160a01b0384163b155b1561487a57604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b5080611278565b8051156148915780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148b690614df8565b5f825580601f106148c5575050565b601f0160209004905f5260205f2090810190611c049190614925565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614939575f8155600101614926565b5090565b8015158114611c04575f80fd5b803563ffffffff8116811461495d575f80fd5b919050565b5f805f60608486031215614974575f80fd5b8335925060208401356149868161493d565b91506149946040850161494a565b90509250925092565b5f602082840312156149ad575f80fd5b5035919050565b6001600160a01b0381168114611c04575f80fd5b5f808284036101608112156149db575f80fd5b610140808212156149ea575f80fd5b84935083013590506149fb816149b4565b809150509250929050565b5f60208284031215614a16575f80fd5b6112788261494a565b5f8060408385031215614a30575f80fd5b614a398361494a565b946020939093013593505050565b6001600160401b0381168114611c04575f80fd5b5f60208284031215614a6b575f80fd5b813561127881614a47565b5f8060408385031215614a87575f80fd5b50508035926020909101359150565b5f805f8385036080811215614aa9575f80fd5b84356001600160401b03811115614abe575f80fd5b850160608188031215614acf575f80fd5b93506040601f1982011215614ae2575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2f57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b5760408401826001600160a01b03169052565b506060830151614b7260608401826001600160401b03169052565b506080830151614b8d60808401826001600160401b03169052565b5060a0830151614ba860a08401826001600160401b03169052565b5060c0830151614bc360c08401826001600160401b03169052565b5060e0830151614bde60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bde57614bde614be5565b6001600160401b03818116838216028082169190828114614c3c57614c3c614be5565b505092915050565b8082028115828204841417610a7457610a74614be5565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f60208284031215614cc0575f80fd5b5051919050565b5f5b83811015614ce1578181015183820152602001614cc9565b50505f910152565b602081525f8251806020840152614d07816040850160208701614cc7565b601f01601f19169190910160400192915050565b5f82614d3557634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bde57614bde614be5565b80820180821115610a7457610a74614be5565b600181811c90821680614e0c57607f821691505b602082108103614e2a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e8981614df8565b806020870152604060018084165f8114614eaa5760018114614ec657614ef3565b60ff19851660408a0152604084151560051b8a01019550614ef3565b895f5260205f205f5b85811015614eea5781548b8201860152908301908801614ecf565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614f1c57614f1c614be5565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f5c57614f5c614f26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f8a57614f8a614f26565b604052919050565b805161495d8161493d565b5f8060408385031215614fae575f80fd5b82516001600160401b0380821115614fc4575f80fd5b9084019060608287031215614fd7575f80fd5b614fdf614f3a565b82518152602080840151614ff2816149b4565b82820152604084015183811115615007575f80fd5b80850194505087601f85011261501b575f80fd5b83518381111561502d5761502d614f26565b61503f601f8201601f19168301614f62565b93508084528882828701011115615054575f80fd5b61506381838601848801614cc7565b50826040830152819550615078818801614f92565b9450505050509250929050565b81810381811115610a7457610a74614be5565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c04575f80fd5b5f6020828403121561519e575f80fd5b81356112788161517f565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151ff8161517f565b61ffff8116905081548161ffff198216178355602084013561522081614a47565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6020828403121561525a575f80fd5b813560ff81168114611278575f80fd5b5f6020828403121561527a575f80fd5b8135611278816149b4565b5f808335601e1984360301811261529a575f80fd5b8301803591506001600160401b038211156152b3575f80fd5b6020019150368190038213156152c7575f80fd5b9250929050565b601f821115610bd957805f5260205f20601f840160051c810160208510156152f35750805b601f840160051c820191505b81811015610ff3575f81556001016152ff565b81516001600160401b0381111561532b5761532b614f26565b61533f816153398454614df8565b846152ce565b602080601f831160018114615372575f841561535b5750858301515b5f19600386901b1c1916600185901b1785556153c9565b5f85815260208120601f198616915b828110156153a057888601518255948401946001909101908401615381565b50858210156153bd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156153e1575f80fd5b81516112788161493d565b5f82516153fd818460208701614cc7565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 5f9e160de..dc5a43a78 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516151de3803806151de83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150918061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145af565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145ea565b610984565b34801561018b575f80fd5b506101ca61019a3660046145ea565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614601565b610b54565b34801561022d575f80fd5b5061024161023c3660046145ea565b610c31565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b366004614618565b610c47565b3480156102ab575f80fd5b5061015f6102ba366004614631565b610cca565b3480156102ca575f80fd5b506101ca6102d936600461466d565b610e9a565b3480156102e9575f80fd5b506102416102f83660046145ea565b610eb3565b348015610308575f80fd5b5061015f6103173660046145af565b610ec7565b6101ca61032a366004614688565b6110e6565b34801561033a575f80fd5b5061015f610349366004614631565b611112565b348015610359575f80fd5b5061015f610368366004614618565b61132f565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145ea565b6114ec565b3480156103dd575f80fd5b5061015f6103ec3660046145ea565b611772565b6101ca6103ff3660046145ea565b611881565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145ea565b61188d565b6040516101d491906146f5565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614fe5833981519152949193919290829060ff1660048111156104c2576104c26146e1565b60048111156104d3576104d36146e1565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f8361188d565b905042600283516004811115610567576105676146e1565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f805160206150058339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f805160206150058339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f6106288561196c565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146e1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610864575f61074e86896119ee565b6001600160401b03169050605060ff168460c001518461076e91906147e3565b6107789190614803565b6001600160401b031661078c82606461482e565b10156107aa5760405162461bcd60e51b81526004016105b090614845565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561082e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610852919061489a565b5f8b8152600989016020526040902055505b600283516005811115610879576108796146e1565b0361088b5761088b8460600151611c8a565b5f84606001518460a001516108a091906147e3565b90506108ac8682611c97565b5f6005600160991b0163ee5b48eb6108c5898686611cdf565b6040518263ffffffff1660e01b81526004016108e191906148d3565b6020604051808303815f875af11580156108fd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610921919061489a565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061506583398151915260205260408082208151610100810190925280545f8051602061502583398151915293929190829060ff1660058111156109d2576109d26146e1565b60058111156109e3576109e36146e1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6857610a686146e1565b14610acd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af28584608001515f611cdf565b6040518263ffffffff1660e01b8152600401610b0e91906148d3565b6020604051808303815f875af1158015610b2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4e919061489a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9d575080546001600160401b03808416911610155b15610bbb5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be583611efe565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4164e8d4a5100083614905565b92915050565b5f610c5182611f0f565b604080820180516001600160a01b039081165f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0a6020528251909116815291822091909155606082015190519192505f80516020614fe583398151915291610cc5916001600160401b031690612286565b505050565b5f80516020614fe58339815191525f610ce284612299565b90505f80610cf3836040015161247a565b50915091505f610d028361188d565b9050816001600160401b031681608001516001600160401b03161015610d3a5760405162461bcd60e51b81526004016105b090614924565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d7f5760405162461bcd60e51b81526004016105b090614966565b60015f87815260068701602052604090205460ff166004811115610da557610da56146e1565b14610e0e5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c416001600160401b03831664e8d4a5100061482e565b5f610ebd8261188d565b60a0015192915050565b5f80516020614fe58339815191525f610edf856126b5565b5f86815260058401602052604090205460c0820151919250610f1191620100009091046001600160401b0316906149af565b6001600160401b03168160e001516001600160401b03161015610f925760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110df575f610fa386856119ee565b9050605060ff168260c001518360e00151610fbe91906147e3565b610fc89190614803565b6001600160401b0316610fdc826064614803565b6001600160401b031610156110035760405162461bcd60e51b81526004016105b090614845565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015611087573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ab919061489a565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110d89084906149cf565b9091555050505b5050505050565b5f6110ef612a5e565b6110fa838334612a95565b9050610c4160015f8051602061504583398151915255565b5f80516020614fe58339815191525f61112a84612299565b90505f8061113b836040015161247a565b50915091505f61114a8361188d565b9050816001600160401b031681608001516001600160401b031610156111825760405162461bcd60e51b81526004016105b090614924565b5f8681526006860160205260409020600301546001600160401b03808416911611156111c05760405162461bcd60e51b81526004016105b090614966565b60035f87815260068701602052604090205460ff1660048111156111e6576111e66146e1565b1461123a5760405162461bcd60e51b815260206004820152603160248201525f805160206150058339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526112df91612286565b5f878152600987016020526040808220829055516001600160401b0385169186918a917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050565b5f805160206150258339815191525f61134783612299565b90505f806113588360400151612cc3565b91509150806113ba5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113d4906149e2565b9050118015611406575060015f83815260088601602052604090205460ff166005811115611404576114046146e1565b145b6114225760405162461bcd60e51b81526004016105b090614a14565b5f828152600785016020526040812061143a916144f7565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614fe583398151915293929190829060ff16600481111561154d5761154d6146e1565b600481111561155e5761155e6146e1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115e5576115e56146e1565b14806116035750600381516004811115611601576116016146e1565b145b6116575760405162461bcd60e51b815260206004820152603260248201525f80516020615005833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f611665826040015161188d565b905080608001516001600160401b03165f036116e95760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611716846040015184608001518560a00151611cdf565b6040518263ffffffff1660e01b815260040161173291906148d3565b6020604051808303815f875af115801561174e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110df919061489a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150258339815191529291906117ba906149e2565b90501180156117ec575060015f83815260088301602052604090205460ff1660058111156117ea576117ea6146e1565b145b6118085760405162461bcd60e51b81526004016105b090614a14565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118419190600401614a5b565b6020604051808303815f875af115801561185d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cc5919061489a565b5f610c41823334612e64565b61189561452e565b5f8281525f805160206150658339815191526020526040908190208151610100810190925280545f80516020615025833981519152929190829060ff1660058111156118e3576118e36146e1565b60058111156118f4576118f46146e1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150658339815191526020526040812060030180545f80516020615025833981519152916001600160401b0390911690836119af83614ae5565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a609190810190614b95565b9150915080611ac35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2a919061489a565b825114611b8e5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c045760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c13846040015161325f565b91509150818714611c805760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c94815f613437565b50565b5f9182525f80516020615065833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d5857611d18816001614c7d565b611d2390600861482e565b5081515f90839083908110611d3a57611d3a614c90565b60200101906001600160f81b03191690815f1a905350600101611d04565b505f5b6004811015611dbb57611d6f816003614c7d565b611d7a90600861482e565b6001901c60f81b82611d8d8360026149cf565b81518110611d9d57611d9d614c90565b60200101906001600160f81b03191690815f1a905350600101611d5b565b505f5b6020811015611e1d57611dd281601f614c7d565b611ddd90600861482e565b86901c60f81b82611def8360066149cf565b81518110611dff57611dff614c90565b60200101906001600160f81b03191690815f1a905350600101611dbe565b505f5b6008811015611e8857611e34816007614c7d565b611e3f90600861482e565b6001600160401b038616901c60f81b82611e5a8360266149cf565b81518110611e6a57611e6a614c90565b60200101906001600160f81b03191690815f1a905350600101611e20565b505f5b6008811015611ef357611e9f816007614c7d565b611eaa90600861482e565b6001600160401b038516901c60f81b82611ec583602e6149cf565b81518110611ed557611ed5614c90565b60200101906001600160f81b03191690815f1a905350600101611e8b565b5090505b9392505050565b611f06613691565b611c94816136dc565b611f1761452e565b5f805160206150258339815191525f611f2f84612299565b90505f80611f408360400151612cc3565b915091508015611fa55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fd757611fd76146e1565b6005811115611fe857611fe86146e1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f908251600581111561206f5761206f6146e1565b148061208d575060018251600581111561208b5761208b6146e1565b145b6120ec5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b600382516005811115612101576121016146e1565b0361210e57506004612112565b5060055b6020808301515f9081526009880190915260408120558181600581111561213b5761213b6146e1565b9081600581111561214e5761214e6146e1565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612182576121826146e1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561224d5761224d6146e1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6122826001600160a01b03821683613748565b60408051606080820183525f8083526020830181905292820152905f805160206150258339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561230e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123359190810190614b95565b915091508061239c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146123ff5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b0316156124725760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f835160361461249e5760405162461bcd60e51b81526004016105b090614ca4565b5f805b60028110156124ed576124b5816001614c7d565b6124c090600861482e565b61ffff168682815181106124d6576124d6614c90565b016020015160f81c901b91909117906001016124a1565b5061ffff8116156125105760405162461bcd60e51b81526004016105b090614ced565b5f805b600481101561256b57612527816003614c7d565b61253290600861482e565b63ffffffff16876125448360026149cf565b8151811061255457612554614c90565b016020015160f81c901b9190911790600101612513565b5063ffffffff81166003146125925760405162461bcd60e51b81526004016105b090614d30565b5f805b60208110156125e7576125a981601f614c7d565b6125b490600861482e565b886125c08360066149cf565b815181106125d0576125d0614c90565b016020015160f81c901b9190911790600101612595565b505f805b6008811015612646576125ff816007614c7d565b61260a90600861482e565b6001600160401b03168961261f8360266149cf565b8151811061262f5761262f614c90565b016020015160f81c901b91909117906001016125eb565b505f805b60088110156126a55761265e816007614c7d565b61266990600861482e565b6001600160401b03168a61267e83602e6149cf565b8151811061268e5761268e614c90565b016020015160f81c901b919091179060010161264a565b5091989097509095509350505050565b6126bd61452e565b5f8281525f8051602061506583398151915260205260408082208151610100810190925280545f8051602061502583398151915293929190829060ff16600581111561270b5761270b6146e1565b600581111561271c5761271c6146e1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a4576127a46146e1565b146128005760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b03161461287a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128878160a00151611c8a565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128cb576128cb6146e1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612997856129918161196c565b5f611cdf565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c69085906004016148d3565b6020604051808303815f875af11580156129e2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a06919061489a565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020615045833981519152805460011901612a8f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614fe5833981519152906001600160401b0316612ae1604086016020870161466d565b6001600160401b03161015612b505760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b626020860186614d86565b61ffff1610158015612b865750612710612b7f6020860186614d86565b61ffff1611155b612ba25760405162461bcd60e51b81526004016105b090614da1565b8054831015612c055760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c6c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c7782610c31565b90505f612c8488836137db565b5f81815260058601602052604090209091508790612ca28282614dec565b509098975050505050505050565b60015f8051602061504583398151915255565b5f808251602714612ce65760405162461bcd60e51b81526004016105b090614ca4565b5f805b6002811015612d3557612cfd816001614c7d565b612d0890600861482e565b61ffff16858281518110612d1e57612d1e614c90565b016020015160f81c901b9190911790600101612ce9565b5061ffff811615612d585760405162461bcd60e51b81526004016105b090614ced565b5f805b6004811015612db357612d6f816003614c7d565b612d7a90600861482e565b63ffffffff1686612d8c8360026149cf565b81518110612d9c57612d9c614c90565b016020015160f81c901b9190911790600101612d5b565b5063ffffffff8116600214612dda5760405162461bcd60e51b81526004016105b090614d30565b5f805b6020811015612e2f57612df181601f614c7d565b612dfc90600861482e565b87612e088360066149cf565b81518110612e1857612e18614c90565b016020015160f81c901b9190911790600101612ddd565b505f86602681518110612e4457612e44614c90565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e6d612a5e565b5f80516020614fe58339815191525f612e8584610c31565b90505f612e918761188d565b9050600281516005811115612ea857612ea86146e1565b14612f075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1082613d15565b5f828260a00151612f2191906149af565b60048501546060840151919250612f43916001600160401b0390911690614803565b6001600160401b0316816001600160401b03161115612fc25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fcc8882611c97565b5f612fd68961196c565b90505f898260405160200161300292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb61303c8d8688611cdf565b6040518263ffffffff1660e01b815260040161305891906148d3565b6020604051808303815f875af1158015613074573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613098919061489a565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613120576131206146e1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611ef760015f8051602061504583398151915255565b5f808251602e146132825760405162461bcd60e51b81526004016105b090614ca4565b5f805b60028110156132d157613299816001614c7d565b6132a490600861482e565b61ffff168582815181106132ba576132ba614c90565b016020015160f81c901b9190911790600101613285565b5061ffff8116156132f45760405162461bcd60e51b81526004016105b090614ced565b5f805b600481101561334f5761330b816003614c7d565b61331690600861482e565b63ffffffff16866133288360026149cf565b8151811061333857613338614c90565b016020015160f81c901b91909117906001016132f7565b5063ffffffff81166004146133765760405162461bcd60e51b81526004016105b090614d30565b5f805b60208110156133cb5761338d81601f614c7d565b61339890600861482e565b876133a48360066149cf565b815181106133b4576133b4614c90565b016020015160f81c901b9190911790600101613379565b505f805b600881101561342a576133e3816007614c7d565b6133ee90600861482e565b6001600160401b0316886134038360266149cf565b8151811061341357613413614c90565b016020015160f81c901b91909117906001016133cf565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061502583398151915291429190158061351d575060028301548151613519916001600160401b0316906149cf565b8210155b15613543576001600160401b038516606082015281815260408101516020820152613562565b848160600181815161355591906149af565b6001600160401b03169052505b6060810151613572906064614803565b602082015160028501546001600160401b03929092169161359d9190600160401b900460ff1661482e565b10156136015760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561362a57846001600160401b03168160400181815161362291906149cf565b905250613649565b846001600160401b0316816040018181516136459190614c7d565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136da57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e4613691565b6136ed81613d20565b611c94608082013560a083013561370a60e0850160c0860161466d565b61371b610100860160e08701614d86565b61ffff1661373161012087016101008801614e42565b61374361014088016101208901614e62565b613d41565b8047101561376b5760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137b4576040519150601f19603f3d011682016040523d82523d5f602084013e6137b9565b606091505b5050905080610cc557604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020615025833981519152426137fb604086016020870161466d565b6001600160401b03161161386d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b61387d604085016020860161466d565b6001600160401b03166138936202a300426149cf565b116139065760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b833561395e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139ce5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139db6040850185614e7d565b9050603014613a425760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a4b83613d15565b5f80613ae56040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a90919061466d565b6001600160401b03168152602001613aab60408a018a614e7d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f85565b5f82815260078601602052604090209193509150613b038282614f0a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b309085906004016148d3565b6020604051808303815f875af1158015613b4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b70919061489a565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bf257613bf26146e1565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ce791908e01908e0161466d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c94816001613437565b613d28613691565b613d3061432a565b613d3861433a565b611c9481614342565b613d49613691565b5f80516020614fe583398151915283613db55760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613dd75760405162461bcd60e51b81526004016105b090614da1565b85871115613e3f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eac5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f1e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613fef5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561406657614026816001614c7d565b61403190600861482e565b5081515f9083908390811061404857614048614c90565b60200101906001600160f81b03191690815f1a905350600101614012565b505f5b60048110156140c45761407d816003614c7d565b61408890600861482e565b505f826140968360026149cf565b815181106140a6576140a6614c90565b60200101906001600160f81b03191690815f1a905350600101614069565b505f5b602081101561412157845181602081106140e3576140e3614c90565b1a60f81b826140f38360066149cf565b8151811061410357614103614c90565b60200101906001600160f81b03191690815f1a9053506001016140c7565b505f5b6020811015614181578460200151816020811061414357614143614c90565b1a60f81b826141538360266149cf565b8151811061416357614163614c90565b60200101906001600160f81b03191690815f1a905350600101614124565b505f5b60088110156141f557614198816007614c7d565b6141a390600861482e565b60ff1685604001516001600160401b0316901c60f81b828260466141c791906149cf565b815181106141d7576141d7614c90565b60200101906001600160f81b03191690815f1a905350600101614184565b505f5b6030811015614260578460800151818151811061421757614217614c90565b01602001516001600160f81b0319168261423283604e6149cf565b8151811061424257614242614c90565b60200101906001600160f81b03191690815f1a9053506001016141f8565b505f5b60088110156142d257614277816007614c7d565b61428290600861482e565b60608601516001600160401b0390811691161c60f81b826142a483607e6149cf565b815181106142b4576142b4614c90565b60200101906001600160f81b03191690815f1a905350600101614263565b506002816040516142e39190614fc9565b602060405180830381855afa1580156142fe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614321919061489a565b94909350915050565b614332613691565b6136da6144ef565b6136da613691565b61434a613691565b80355f8051602061502583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143966080840160608501614e42565b60ff1611156144035760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f6144146080840160608501614e42565b60ff161161447c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b61448c6080830160608401614e42565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144bd606083016040840161466d565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cb0613691565b508054614503906149e2565b5f825580601f10614512575050565b601f0160209004905f5260205f2090810190611c949190614572565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614586575f8155600101614573565b5090565b8015158114611c94575f80fd5b803563ffffffff811681146145aa575f80fd5b919050565b5f805f606084860312156145c1575f80fd5b8335925060208401356145d38161458a565b91506145e160408501614597565b90509250925092565b5f602082840312156145fa575f80fd5b5035919050565b5f6101408284031215614612575f80fd5b50919050565b5f60208284031215614628575f80fd5b611ef782614597565b5f8060408385031215614642575f80fd5b61464b83614597565b946020939093013593505050565b6001600160401b0381168114611c94575f80fd5b5f6020828403121561467d575f80fd5b8135611ef781614659565b5f80828403606081121561469a575f80fd5b83356001600160401b038111156146af575f80fd5b8401606081870312156146c0575f80fd5b92506040601f19820112156146d3575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061471957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474160408401826001600160a01b03169052565b50606083015161475c60608401826001600160401b03169052565b50608083015161477760808401826001600160401b03169052565b5060a083015161479260a08401826001600160401b03169052565b5060c08301516147ad60c08401826001600160401b03169052565b5060e08301516147c860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147c8576147c86147cf565b6001600160401b03818116838216028082169190828114614826576148266147cf565b505092915050565b8082028115828204841417610c4157610c416147cf565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f602082840312156148aa575f80fd5b5051919050565b5f5b838110156148cb5781810151838201526020016148b3565b50505f910152565b602081525f82518060208401526148f18160408501602087016148b1565b601f01601f19169190910160400192915050565b5f8261491f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147c8576147c86147cf565b80820180821115610c4157610c416147cf565b600181811c908216806149f657607f821691505b60208210810361461257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a6d816149e2565b806020870152604060018084165f8114614a8e5760018114614aaa57614ad7565b60ff19851660408a0152604084151560051b8a01019550614ad7565b895f5260205f205f5b85811015614ace5781548b8201860152908301908801614ab3565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b0057614b006147cf565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b4057614b40614b0a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b6e57614b6e614b0a565b604052919050565b6001600160a01b0381168114611c94575f80fd5b80516145aa8161458a565b5f8060408385031215614ba6575f80fd5b82516001600160401b0380821115614bbc575f80fd5b9084019060608287031215614bcf575f80fd5b614bd7614b1e565b82518152602080840151614bea81614b76565b82820152604084015183811115614bff575f80fd5b80850194505087601f850112614c13575f80fd5b835183811115614c2557614c25614b0a565b614c37601f8201601f19168301614b46565b93508084528882828701011115614c4c575f80fd5b614c5b818386018488016148b1565b50826040830152819550614c70818801614b8a565b9450505050509250929050565b81810381811115610c4157610c416147cf565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c94575f80fd5b5f60208284031215614d96575f80fd5b8135611ef781614d77565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614df781614d77565b61ffff8116905081548161ffff1982161783556020840135614e1881614659565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e52575f80fd5b813560ff81168114611ef7575f80fd5b5f60208284031215614e72575f80fd5b8135611ef781614b76565b5f808335601e19843603018112614e92575f80fd5b8301803591506001600160401b03821115614eab575f80fd5b602001915036819003821315614ebf575f80fd5b9250929050565b601f821115610cc557805f5260205f20601f840160051c81016020851015614eeb5750805b601f840160051c820191505b818110156110df575f8155600101614ef7565b81516001600160401b03811115614f2357614f23614b0a565b614f3781614f3184546149e2565b84614ec6565b602080601f831160018114614f6a575f8415614f535750858301515b5f19600386901b1c1916600185901b178555614fc1565b5f85815260208120601f198616915b82811015614f9857888601518255948401946001909101908401614f79565b5085821015614fb557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614fda8184602087016148b1565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516151f53803806151f583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150a88061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145c6565b61045a565b005b34801561016c575f80fd5b5061015f61017b366004614601565b610984565b34801561018b575f80fd5b506101ca61019a366004614601565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614618565b610b54565b34801561022d575f80fd5b5061024161023c366004614601565b610c31565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b36600461462f565b610c47565b3480156102ab575f80fd5b5061015f6102ba366004614648565b610cae565b3480156102ca575f80fd5b506101ca6102d9366004614684565b610e7e565b3480156102e9575f80fd5b506102416102f8366004614601565b610e97565b348015610308575f80fd5b5061015f6103173660046145c6565b610eab565b6101ca61032a36600461469f565b6110ca565b34801561033a575f80fd5b5061015f610349366004614648565b6110f6565b348015610359575f80fd5b5061015f61036836600461462f565b611346565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd366004614601565b611503565b3480156103dd575f80fd5b5061015f6103ec366004614601565b611789565b6101ca6103ff366004614601565b611898565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b50610437610432366004614601565b6118a4565b6040516101d4919061470c565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614ffc833981519152949193919290829060ff1660048111156104c2576104c26146f8565b60048111156104d3576104d36146f8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f836118a4565b905042600283516004811115610567576105676146f8565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f8051602061501c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f8051602061501c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f61062885611983565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146f8565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610864575f61074e8689611a05565b6001600160401b03169050605060ff168460c001518461076e91906147fa565b610778919061481a565b6001600160401b031661078c826064614845565b10156107aa5760405162461bcd60e51b81526004016105b09061485c565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561082e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085291906148b1565b5f8b8152600989016020526040902055505b600283516005811115610879576108796146f8565b0361088b5761088b8460600151611ca1565b5f84606001518460a001516108a091906147fa565b90506108ac8682611cae565b5f6005600160991b0163ee5b48eb6108c5898686611cf6565b6040518263ffffffff1660e01b81526004016108e191906148ea565b6020604051808303815f875af11580156108fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092191906148b1565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061507c83398151915260205260408082208151610100810190925280545f8051602061503c83398151915293929190829060ff1660058111156109d2576109d26146f8565b60058111156109e3576109e36146f8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6857610a686146f8565b14610acd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af28584608001515f611cf6565b6040518263ffffffff1660e01b8152600401610b0e91906148ea565b6020604051808303815f875af1158015610b2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4e91906148b1565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9d575080546001600160401b03808416911610155b15610bbb5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be583611f15565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4164e8d4a510008361491c565b92915050565b5f80516020614ffc8339815191525f610c5f83611f26565b604081810180516001600160a01b039081165f908152600a8701602052825190911681529182209190915560608201519051919250610ca9916001600160401b039091169061229d565b505050565b5f80516020614ffc8339815191525f610cc6846122b0565b90505f80610cd78360400151612491565b50915091505f610ce6836118a4565b9050816001600160401b031681608001516001600160401b03161015610d1e5760405162461bcd60e51b81526004016105b09061493b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d635760405162461bcd60e51b81526004016105b09061497d565b60015f87815260068701602052604090205460ff166004811115610d8957610d896146f8565b14610df25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c416001600160401b03831664e8d4a51000614845565b5f610ea1826118a4565b60a0015192915050565b5f80516020614ffc8339815191525f610ec3856126cc565b5f86815260058401602052604090205460c0820151919250610ef591620100009091046001600160401b0316906149c6565b6001600160401b03168160e001516001600160401b03161015610f765760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110c3575f610f878685611a05565b9050605060ff168260c001518360e00151610fa291906147fa565b610fac919061481a565b6001600160401b0316610fc082606461481a565b6001600160401b03161015610fe75760405162461bcd60e51b81526004016105b09061485c565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561106b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061108f91906148b1565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110bc9084906149e6565b9091555050505b5050505050565b5f6110d3612a75565b6110de838334612aac565b9050610c4160015f8051602061505c83398151915255565b5f80516020614ffc8339815191525f61110e846122b0565b90505f8061111f8360400151612491565b50915091505f61112e836118a4565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611168576111686146f8565b6004811115611179576111796146f8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112185760405162461bcd60e51b81526004016105b09061493b565b5f8781526006870160205260409020600301546001600160401b03808516911611156112565760405162461bcd60e51b81526004016105b09061497d565b60038151600481111561126b5761126b6146f8565b146112bf5760405162461bcd60e51b815260206004820152603160248201525f8051602061501c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff19166004179055600989018252822091909155606082015190820151611304916001600160401b03169061229d565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061503c8339815191525f61135e836122b0565b90505f8061136f8360400151612cda565b91509150806113d15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113eb906149f9565b905011801561141d575060015f83815260088601602052604090205460ff16600581111561141b5761141b6146f8565b145b6114395760405162461bcd60e51b81526004016105b090614a2b565b5f82815260078501602052604081206114519161450e565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614ffc83398151915293929190829060ff166004811115611564576115646146f8565b6004811115611575576115756146f8565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115fc576115fc6146f8565b148061161a5750600381516004811115611618576116186146f8565b145b61166e5760405162461bcd60e51b815260206004820152603260248201525f8051602061501c833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f61167c82604001516118a4565b905080608001516001600160401b03165f036117005760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb61172d846040015184608001518560a00151611cf6565b6040518263ffffffff1660e01b815260040161174991906148ea565b6020604051808303815f875af1158015611765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110c391906148b1565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061503c8339815191529291906117d1906149f9565b9050118015611803575060015f83815260088301602052604090205460ff166005811115611801576118016146f8565b145b61181f5760405162461bcd60e51b81526004016105b090614a2b565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118589190600401614a72565b6020604051808303815f875af1158015611874573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca991906148b1565b5f610c41823334612e7b565b6118ac614545565b5f8281525f8051602061507c8339815191526020526040908190208151610100810190925280545f8051602061503c833981519152929190829060ff1660058111156118fa576118fa6146f8565b600581111561190b5761190b6146f8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f8051602061507c8339815191526020526040812060030180545f8051602061503c833981519152916001600160401b0390911690836119c683614afc565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a779190810190614bac565b9150915080611ada5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4191906148b1565b825114611ba55760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c1b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c2a8460400151613276565b91509150818714611c975760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611cab815f61344e565b50565b5f9182525f8051602061507c833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d6f57611d2f816001614c94565b611d3a906008614845565b5081515f90839083908110611d5157611d51614ca7565b60200101906001600160f81b03191690815f1a905350600101611d1b565b505f5b6004811015611dd257611d86816003614c94565b611d91906008614845565b6001901c60f81b82611da48360026149e6565b81518110611db457611db4614ca7565b60200101906001600160f81b03191690815f1a905350600101611d72565b505f5b6020811015611e3457611de981601f614c94565b611df4906008614845565b86901c60f81b82611e068360066149e6565b81518110611e1657611e16614ca7565b60200101906001600160f81b03191690815f1a905350600101611dd5565b505f5b6008811015611e9f57611e4b816007614c94565b611e56906008614845565b6001600160401b038616901c60f81b82611e718360266149e6565b81518110611e8157611e81614ca7565b60200101906001600160f81b03191690815f1a905350600101611e37565b505f5b6008811015611f0a57611eb6816007614c94565b611ec1906008614845565b6001600160401b038516901c60f81b82611edc83602e6149e6565b81518110611eec57611eec614ca7565b60200101906001600160f81b03191690815f1a905350600101611ea2565b5090505b9392505050565b611f1d6136a8565b611cab816136f3565b611f2e614545565b5f8051602061503c8339815191525f611f46846122b0565b90505f80611f578360400151612cda565b915091508015611fbc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fee57611fee6146f8565b6005811115611fff57611fff6146f8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612086576120866146f8565b14806120a457506001825160058111156120a2576120a26146f8565b145b6121035760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b600382516005811115612118576121186146f8565b0361212557506004612129565b5060055b6020808301515f90815260098801909152604081205581816005811115612152576121526146f8565b90816005811115612165576121656146f8565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612199576121996146f8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115612264576122646146f8565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6122996001600160a01b0382168361375f565b60408051606080820183525f8083526020830181905292820152905f8051602061503c8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612325573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261234c9190810190614bac565b91509150806123b35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124165760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b0316156124895760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124b55760405162461bcd60e51b81526004016105b090614cbb565b5f805b6002811015612504576124cc816001614c94565b6124d7906008614845565b61ffff168682815181106124ed576124ed614ca7565b016020015160f81c901b91909117906001016124b8565b5061ffff8116156125275760405162461bcd60e51b81526004016105b090614d04565b5f805b60048110156125825761253e816003614c94565b612549906008614845565b63ffffffff168761255b8360026149e6565b8151811061256b5761256b614ca7565b016020015160f81c901b919091179060010161252a565b5063ffffffff81166003146125a95760405162461bcd60e51b81526004016105b090614d47565b5f805b60208110156125fe576125c081601f614c94565b6125cb906008614845565b886125d78360066149e6565b815181106125e7576125e7614ca7565b016020015160f81c901b91909117906001016125ac565b505f805b600881101561265d57612616816007614c94565b612621906008614845565b6001600160401b0316896126368360266149e6565b8151811061264657612646614ca7565b016020015160f81c901b9190911790600101612602565b505f805b60088110156126bc57612675816007614c94565b612680906008614845565b6001600160401b03168a61269583602e6149e6565b815181106126a5576126a5614ca7565b016020015160f81c901b9190911790600101612661565b5091989097509095509350505050565b6126d4614545565b5f8281525f8051602061507c83398151915260205260408082208151610100810190925280545f8051602061503c83398151915293929190829060ff166005811115612722576127226146f8565b6005811115612733576127336146f8565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127bb576127bb6146f8565b146128175760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b0316146128915760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b61289e8160a00151611ca1565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128e2576128e26146f8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129ae856129a881611983565b5f611cf6565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129dd9085906004016148ea565b6020604051808303815f875af11580156129f9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a1d91906148b1565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f8051602061505c833981519152805460011901612aa657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ffc833981519152906001600160401b0316612af86040860160208701614684565b6001600160401b03161015612b675760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b796020860186614d9d565b61ffff1610158015612b9d5750612710612b966020860186614d9d565b61ffff1611155b612bb95760405162461bcd60e51b81526004016105b090614db8565b8054831015612c1c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c835760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c8e82610c31565b90505f612c9b88836137f2565b5f81815260058601602052604090209091508790612cb98282614e03565b509098975050505050505050565b60015f8051602061505c83398151915255565b5f808251602714612cfd5760405162461bcd60e51b81526004016105b090614cbb565b5f805b6002811015612d4c57612d14816001614c94565b612d1f906008614845565b61ffff16858281518110612d3557612d35614ca7565b016020015160f81c901b9190911790600101612d00565b5061ffff811615612d6f5760405162461bcd60e51b81526004016105b090614d04565b5f805b6004811015612dca57612d86816003614c94565b612d91906008614845565b63ffffffff1686612da38360026149e6565b81518110612db357612db3614ca7565b016020015160f81c901b9190911790600101612d72565b5063ffffffff8116600214612df15760405162461bcd60e51b81526004016105b090614d47565b5f805b6020811015612e4657612e0881601f614c94565b612e13906008614845565b87612e1f8360066149e6565b81518110612e2f57612e2f614ca7565b016020015160f81c901b9190911790600101612df4565b505f86602681518110612e5b57612e5b614ca7565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e84612a75565b5f80516020614ffc8339815191525f612e9c84610c31565b90505f612ea8876118a4565b9050600281516005811115612ebf57612ebf6146f8565b14612f1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f2782613d2c565b5f828260a00151612f3891906149c6565b60048501546060840151919250612f5a916001600160401b039091169061481a565b6001600160401b0316816001600160401b03161115612fd95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fe38882611cae565b5f612fed89611983565b90505f898260405160200161301992919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6130538d8688611cf6565b6040518263ffffffff1660e01b815260040161306f91906148ea565b6020604051808303815f875af115801561308b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130af91906148b1565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613137576131376146f8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f0e60015f8051602061505c83398151915255565b5f808251602e146132995760405162461bcd60e51b81526004016105b090614cbb565b5f805b60028110156132e8576132b0816001614c94565b6132bb906008614845565b61ffff168582815181106132d1576132d1614ca7565b016020015160f81c901b919091179060010161329c565b5061ffff81161561330b5760405162461bcd60e51b81526004016105b090614d04565b5f805b600481101561336657613322816003614c94565b61332d906008614845565b63ffffffff168661333f8360026149e6565b8151811061334f5761334f614ca7565b016020015160f81c901b919091179060010161330e565b5063ffffffff811660041461338d5760405162461bcd60e51b81526004016105b090614d47565b5f805b60208110156133e2576133a481601f614c94565b6133af906008614845565b876133bb8360066149e6565b815181106133cb576133cb614ca7565b016020015160f81c901b9190911790600101613390565b505f805b6008811015613441576133fa816007614c94565b613405906008614845565b6001600160401b03168861341a8360266149e6565b8151811061342a5761342a614ca7565b016020015160f81c901b91909117906001016133e6565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061503c833981519152914291901580613534575060028301548151613530916001600160401b0316906149e6565b8210155b1561355a576001600160401b038516606082015281815260408101516020820152613579565b848160600181815161356c91906149c6565b6001600160401b03169052505b606081015161358990606461481a565b602082015160028501546001600160401b0392909216916135b49190600160401b900460ff16614845565b10156136185760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561364157846001600160401b03168160400181815161363991906149e6565b905250613660565b846001600160401b03168160400181815161365c9190614c94565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136f157604051631afcd79f60e31b815260040160405180910390fd5b565b6136fb6136a8565b61370481613d37565b611cab608082013560a083013561372160e0850160c08601614684565b613732610100860160e08701614d9d565b61ffff1661374861012087016101008801614e59565b61375a61014088016101208901614e79565b613d58565b804710156137825760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137cb576040519150601f19603f3d011682016040523d82523d5f602084013e6137d0565b606091505b5050905080610ca957604051630a12f52160e11b815260040160405180910390fd5b5f5f8051602061503c833981519152426138126040860160208701614684565b6001600160401b0316116138845760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b6138946040850160208601614684565b6001600160401b03166138aa6202a300426149e6565b1161391d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139755760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139e55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139f26040850185614e94565b9050603014613a595760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a6283613d2c565b5f80613afc6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613aa79190614684565b6001600160401b03168152602001613ac260408a018a614e94565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f9c565b5f82815260078601602052604090209193509150613b1a8282614f21565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b479085906004016148ea565b6020604051808303815f875af1158015613b63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b8791906148b1565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c0957613c096146f8565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cfe91908e01908e01614684565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611cab81600161344e565b613d3f6136a8565b613d47614341565b613d4f614351565b611cab81614359565b613d606136a8565b5f80516020614ffc83398151915283613dcc5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613dee5760405162461bcd60e51b81526004016105b090614db8565b85871115613e565760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613ec35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f355760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146140065760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561407d5761403d816001614c94565b614048906008614845565b5081515f9083908390811061405f5761405f614ca7565b60200101906001600160f81b03191690815f1a905350600101614029565b505f5b60048110156140db57614094816003614c94565b61409f906008614845565b505f826140ad8360026149e6565b815181106140bd576140bd614ca7565b60200101906001600160f81b03191690815f1a905350600101614080565b505f5b602081101561413857845181602081106140fa576140fa614ca7565b1a60f81b8261410a8360066149e6565b8151811061411a5761411a614ca7565b60200101906001600160f81b03191690815f1a9053506001016140de565b505f5b6020811015614198578460200151816020811061415a5761415a614ca7565b1a60f81b8261416a8360266149e6565b8151811061417a5761417a614ca7565b60200101906001600160f81b03191690815f1a90535060010161413b565b505f5b600881101561420c576141af816007614c94565b6141ba906008614845565b60ff1685604001516001600160401b0316901c60f81b828260466141de91906149e6565b815181106141ee576141ee614ca7565b60200101906001600160f81b03191690815f1a90535060010161419b565b505f5b6030811015614277578460800151818151811061422e5761422e614ca7565b01602001516001600160f81b0319168261424983604e6149e6565b8151811061425957614259614ca7565b60200101906001600160f81b03191690815f1a90535060010161420f565b505f5b60088110156142e95761428e816007614c94565b614299906008614845565b60608601516001600160401b0390811691161c60f81b826142bb83607e6149e6565b815181106142cb576142cb614ca7565b60200101906001600160f81b03191690815f1a90535060010161427a565b506002816040516142fa9190614fe0565b602060405180830381855afa158015614315573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061433891906148b1565b94909350915050565b6143496136a8565b6136f1614506565b6136f16136a8565b6143616136a8565b80355f8051602061503c83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143ad6080840160608501614e59565b60ff16111561441a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f61442b6080840160608501614e59565b60ff16116144935760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b6144a36080830160608401614e59565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144d46060830160408401614684565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cc76136a8565b50805461451a906149f9565b5f825580601f10614529575050565b601f0160209004905f5260205f2090810190611cab9190614589565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561459d575f815560010161458a565b5090565b8015158114611cab575f80fd5b803563ffffffff811681146145c1575f80fd5b919050565b5f805f606084860312156145d8575f80fd5b8335925060208401356145ea816145a1565b91506145f8604085016145ae565b90509250925092565b5f60208284031215614611575f80fd5b5035919050565b5f6101408284031215614629575f80fd5b50919050565b5f6020828403121561463f575f80fd5b611f0e826145ae565b5f8060408385031215614659575f80fd5b614662836145ae565b946020939093013593505050565b6001600160401b0381168114611cab575f80fd5b5f60208284031215614694575f80fd5b8135611f0e81614670565b5f8082840360608112156146b1575f80fd5b83356001600160401b038111156146c6575f80fd5b8401606081870312156146d7575f80fd5b92506040601f19820112156146ea575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061473057634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161475860408401826001600160a01b03169052565b50606083015161477360608401826001600160401b03169052565b50608083015161478e60808401826001600160401b03169052565b5060a08301516147a960a08401826001600160401b03169052565b5060c08301516147c460c08401826001600160401b03169052565b5060e08301516147df60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147df576147df6147e6565b6001600160401b0381811683821602808216919082811461483d5761483d6147e6565b505092915050565b8082028115828204841417610c4157610c416147e6565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f602082840312156148c1575f80fd5b5051919050565b5f5b838110156148e25781810151838201526020016148ca565b50505f910152565b602081525f82518060208401526149088160408501602087016148c8565b601f01601f19169190910160400192915050565b5f8261493657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147df576147df6147e6565b80820180821115610c4157610c416147e6565b600181811c90821680614a0d57607f821691505b60208210810361462957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a84816149f9565b806020870152604060018084165f8114614aa55760018114614ac157614aee565b60ff19851660408a0152604084151560051b8a01019550614aee565b895f5260205f205f5b85811015614ae55781548b8201860152908301908801614aca565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b1757614b176147e6565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b5757614b57614b21565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b8557614b85614b21565b604052919050565b6001600160a01b0381168114611cab575f80fd5b80516145c1816145a1565b5f8060408385031215614bbd575f80fd5b82516001600160401b0380821115614bd3575f80fd5b9084019060608287031215614be6575f80fd5b614bee614b35565b82518152602080840151614c0181614b8d565b82820152604084015183811115614c16575f80fd5b80850194505087601f850112614c2a575f80fd5b835183811115614c3c57614c3c614b21565b614c4e601f8201601f19168301614b5d565b93508084528882828701011115614c63575f80fd5b614c72818386018488016148c8565b50826040830152819550614c87818801614ba1565b9450505050509250929050565b81810381811115610c4157610c416147e6565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611cab575f80fd5b5f60208284031215614dad575f80fd5b8135611f0e81614d8e565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e0e81614d8e565b61ffff8116905081548161ffff1982161783556020840135614e2f81614670565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e69575f80fd5b813560ff81168114611f0e575f80fd5b5f60208284031215614e89575f80fd5b8135611f0e81614b8d565b5f808335601e19843603018112614ea9575f80fd5b8301803591506001600160401b03821115614ec2575f80fd5b602001915036819003821315614ed6575f80fd5b9250929050565b601f821115610ca957805f5260205f20601f840160051c81016020851015614f025750805b601f840160051c820191505b818110156110c3575f8155600101614f0e565b81516001600160401b03811115614f3a57614f3a614b21565b614f4e81614f4884546149f9565b84614edd565b602080601f831160018114614f81575f8415614f6a5750858301515b5f19600386901b1c1916600185901b178555614fd8565b5f85815260208120601f198616915b82811015614faf57888601518255948401946001909101908401614f90565b5085821015614fcc57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614ff18184602087016148c8565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 1282c87ad..be4a4cbcf 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -55,9 +55,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager /// @notice Maps the delegationID to pending end delegator messages. mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; /// @notice Maps the delegationID to its pending staking rewards. - mapping(bytes32 delegationID => uint256) _pendingDelegatorRewards; + mapping(bytes32 delegationID => uint256) _redeemableDelegatorRewards; /// @notice Maps the validator owner address to its pending staking rewards. - mapping(address validatorOwner => uint256) _pendingValidatorRewards; + mapping(address validatorOwner => uint256) _redeemableValidatorRewards; } // solhint-enable private-vars-leading-underscore @@ -157,19 +157,19 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: minimum uptime threshold not met" ); - $._pendingValidatorRewards[validator.owner] += $._rewardCalculator.calculateReward( + $._redeemableValidatorRewards[validator.owner] += $._rewardCalculator.calculateReward( validator.weight, validator.startedAt, validator.endedAt, 0, 0 ); } } function completeEndValidation(uint32 messageIndex) external { - Validator memory validator = _completeEndValidation(messageIndex); - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - _reward(validator.owner, $._pendingValidatorRewards[validator.owner]); - delete $._pendingValidatorRewards[validator.owner]; + Validator memory validator = _completeEndValidation(messageIndex); + + _reward(validator.owner, $._redeemableValidatorRewards[validator.owner]); + delete $._redeemableValidatorRewards[validator.owner]; _unlock(validator.startingWeight, validator.owner); } @@ -383,7 +383,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager "PoSValidatorManager: minimum uptime threshold not met" ); - $._pendingDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward( + $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward( delegator.weight, delegator.startedAt, delegator.endedAt, 0, 0 ); } @@ -452,6 +452,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); Validator memory validator = getValidator(validationID); + Delegator memory delegator = $._delegatorStakes[delegationID]; + // The received nonce should be no greater than the highest sent nonce. This should never // happen since the staking manager is the only entity that can trigger a weight update // on the P-Chain. @@ -470,39 +472,20 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // end delegation has been initialized, we need to make sure that this function is only // callable after that has been done. require( - $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, + delegator.status == DelegatorStatus.PendingRemoved, "PoSValidatorManager: delegation not pending added" ); // Update the delegator status $._delegatorStakes[delegationID].status = DelegatorStatus.Completed; - Delegator memory delegator = $._delegatorStakes[delegationID]; + _reward(delegator.owner, $._redeemableDelegatorRewards[delegationID]); + delete $._redeemableDelegatorRewards[delegationID]; _unlock(delegator.weight, delegator.owner); - - _reward(delegator.owner, $._pendingDelegatorRewards[delegationID]); - delete $._pendingDelegatorRewards[delegationID]; + // TODO can we remove the delegation from _delegatorStakes here? emit DelegationEnded(delegationID, validationID, nonce); } - function _checkPendingEndDelegatorMessage(bytes32 delegationID) private view { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - require( - $._pendingEndDelegatorMessages[delegationID].length > 0 - && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingRemoved, - "PoSValidatorManager: delegation removal not pending" - ); - } - - function _checkPendingRegisterDelegatorMessages(bytes32 delegationID) private view { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - require( - $._pendingRegisterDelegatorMessages[delegationID].length > 0 - && $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, - "PoSValidatorManager: delegation registration not pending" - ); - } - function _reward(address account, uint256 amount) internal virtual; } From 267d92eb8e93580495776e72068470de5a3bb6ce Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 14:03:37 -0400 Subject: [PATCH 289/545] Fixups --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../staking/ERC20TokenStakingManager.sol | 2 +- .../staking/NativeTokenStakingManager.sol | 2 +- contracts/staking/PoSValidatorManager.sol | 38 +++++++++---------- .../tests/PoSValidatorManagerTests.t.sol | 31 ++++++++------- 6 files changed, 41 insertions(+), 36 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6b453d2dd..dd3700e72 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161562138038061562183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154d48061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614962565b61036a565b005b61015f61016f36600461499d565b610894565b6101b261018236600461499d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed36600461499d565b610a64565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149c8565b610a7a565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614a06565b610b59565b61015f61025a366004614a1f565b610bde565b6101b261026d366004614a5b565b610dae565b6101f261028036600461499d565b610dc7565b61015f610293366004614962565b610ddb565b61015f6102a6366004614a1f565b610ffa565b6101b26102b9366004614a76565b61126c565b6101b26102cc366004614a96565b61127f565b61015f6102df366004614a06565b6112ab565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f61032036600461499d565b611468565b61015f61033336600461499d565b6116ee565b6101cd601481565b61035361034e36600461499d565b6117fd565b6040516101bc9190614b0b565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615428833981519152949193919290829060ff1660048111156103d2576103d2614af7565b60048111156103e3576103e3614af7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117fd565b90504260028351600481111561047757610477614af7565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206154488339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206154488339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118dc565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614af7565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610774575f61065e868961195e565b6001600160401b03169050605060ff168460c001518461067e9190614bf9565b6106889190614c19565b6001600160401b031661069c826064614c44565b10156106ba5760405162461bcd60e51b81526004016104c090614c5b565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561073e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107629190614cb0565b5f8b8152600989016020526040902055505b60028351600581111561078957610789614af7565b0361079b5761079b8460600151611bfa565b5f84606001518460a001516107b09190614bf9565b90506107bc8682611c07565b5f6005600160991b0163ee5b48eb6107d5898686611c4f565b6040518263ffffffff1660e01b81526004016107f19190614ce9565b6020604051808303815f875af115801561080d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108319190614cb0565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206154a883398151915260205260408082208151610100810190925280545f8051602061546883398151915293929190829060ff1660058111156108e2576108e2614af7565b60058111156108f3576108f3614af7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097857610978614af7565b146109dd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a028584608001515f611c4f565b6040518263ffffffff1660e01b8152600401610a1e9190614ce9565b6020604051808303815f875af1158015610a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190614cb0565b50505050565b5f610a7464e8d4a5100083614d1b565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac3575080546001600160401b03808416911610155b15610ae15760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0c8484611e6c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206154288339815191525f610b7183611e8a565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9d916121fd565b604080820180516001600160a01b03165f908152600a85016020529182209190915560608201519051610bd9916001600160401b031690612273565b505050565b5f805160206154288339815191525f610bf684612296565b90505f80610c078360400151612477565b50915091505f610c16836117fd565b9050816001600160401b031681608001516001600160401b03161015610c4e5760405162461bcd60e51b81526004016104c090614d3a565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b81526004016104c090614d7c565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9614af7565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a746001600160401b03831664e8d4a51000614c44565b5f610dd1826117fd565b60a0015192915050565b5f805160206154288339815191525f610df3856126b2565b5f86815260058401602052604090205460c0820151919250610e2591620100009091046001600160401b031690614dc5565b6001600160401b03168160e001516001600160401b03161015610ea65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610ff3575f610eb7868561195e565b9050605060ff168260c001518360e00151610ed29190614bf9565b610edc9190614c19565b6001600160401b0316610ef0826064614c19565b6001600160401b03161015610f175760405162461bcd60e51b81526004016104c090614c5b565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa158015610f9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbf9190614cb0565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fec908490614de5565b9091555050505b5050505050565b5f805160206154288339815191525f61101284612296565b90505f806110238360400151612477565b50915091505f611032836117fd565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106c5761106c614af7565b600481111561107d5761107d614af7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561111c5760405162461bcd60e51b81526004016104c090614d3a565b5f8781526006870160205260409020600301546001600160401b038085169116111561115a5760405162461bcd60e51b81526004016104c090614d7c565b60038151600481111561116f5761116f614af7565b146111c35760405162461bcd60e51b815260206004820152603160248201525f805160206154488339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111f991906121fd565b856009015f8881526020019081526020015f205f905561122a81606001516001600160401b03168260200151612273565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f611278833384612a5b565b9392505050565b5f611288612e59565b611293848484612e90565b905061127860015f8051602061548883398151915255565b5f805160206154688339815191525f6112c383612296565b90505f806112d483604001516130c9565b91509150806113365760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461135090614df8565b9050118015611382575060015f83815260088601602052604090205460ff16600581111561138057611380614af7565b145b61139e5760405162461bcd60e51b81526004016104c090614e30565b5f82815260078501602052604081206113b6916148aa565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061542883398151915293929190829060ff1660048111156114c9576114c9614af7565b60048111156114da576114da614af7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561156157611561614af7565b148061157f575060038151600481111561157d5761157d614af7565b145b6115d35760405162461bcd60e51b815260206004820152603260248201525f80516020615448833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115e182604001516117fd565b905080608001516001600160401b03165f036116655760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611692846040015184608001518560a00151611c4f565b6040518263ffffffff1660e01b81526004016116ae9190614ce9565b6020604051808303815f875af11580156116ca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff39190614cb0565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061546883398151915292919061173690614df8565b9050118015611768575060015f83815260088301602052604090205460ff16600581111561176657611766614af7565b145b6117845760405162461bcd60e51b81526004016104c090614e30565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117bd9190600401614e77565b6020604051808303815f875af11580156117d9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd99190614cb0565b6118056148e1565b5f8281525f805160206154a88339815191526020526040908190208151610100810190925280545f80516020615468833981519152929190829060ff16600581111561185357611853614af7565b600581111561186457611864614af7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154a88339815191526020526040812060030180545f80516020615468833981519152916001600160401b03909116908361191f83614f01565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156119a9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119d09190810190614f9d565b9150915080611a335760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9a9190614cb0565b825114611afe5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b745760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b83846040015161326a565b91509150818714611bf05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611c04815f613442565b50565b5f9182525f805160206154a8833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cc857611c88816001615085565b611c93906008614c44565b5081515f90839083908110611caa57611caa615098565b60200101906001600160f81b03191690815f1a905350600101611c74565b505f5b6004811015611d2b57611cdf816003615085565b611cea906008614c44565b6001901c60f81b82611cfd836002614de5565b81518110611d0d57611d0d615098565b60200101906001600160f81b03191690815f1a905350600101611ccb565b505f5b6020811015611d8d57611d4281601f615085565b611d4d906008614c44565b86901c60f81b82611d5f836006614de5565b81518110611d6f57611d6f615098565b60200101906001600160f81b03191690815f1a905350600101611d2e565b505f5b6008811015611df857611da4816007615085565b611daf906008614c44565b6001600160401b038616901c60f81b82611dca836026614de5565b81518110611dda57611dda615098565b60200101906001600160f81b03191690815f1a905350600101611d90565b505f5b6008811015611e6357611e0f816007615085565b611e1a906008614c44565b6001600160401b038516901c60f81b82611e3583602e614de5565b81518110611e4557611e45615098565b60200101906001600160f81b03191690815f1a905350600101611dfb565b50949350505050565b611e7461369c565b611e7d826136e7565b611e8681613753565b5050565b611e926148e1565b5f805160206154688339815191525f611eaa84612296565b90505f80611ebb83604001516130c9565b915091508015611f205760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f5257611f52614af7565b6005811115611f6357611f63614af7565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fea57611fea614af7565b1480612008575060018251600581111561200657612006614af7565b145b6120675760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561207c5761207c614af7565b036120895750600461208d565b5060055b6020808301515f908152600988019091526040812055818160058111156120b6576120b6614af7565b908160058111156120c9576120c9614af7565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120fd576120fd614af7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121c8576121c8614af7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061540883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612258575f80fd5b505af115801561226a573d5f803e3d5ffd5b50505050505050565b5f8051602061540883398151915254611e86906001600160a01b031682846137f4565b60408051606080820183525f8083526020830181905292820152905f805160206154688339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561230b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123329190810190614f9d565b91509150806123995760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123fc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b03161561246f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f835160361461249b5760405162461bcd60e51b81526004016104c0906150ac565b5f805b60028110156124ea576124b2816001615085565b6124bd906008614c44565b61ffff168682815181106124d3576124d3615098565b016020015160f81c901b919091179060010161249e565b5061ffff81161561250d5760405162461bcd60e51b81526004016104c0906150f5565b5f805b600481101561256857612524816003615085565b61252f906008614c44565b63ffffffff1687612541836002614de5565b8151811061255157612551615098565b016020015160f81c901b9190911790600101612510565b5063ffffffff811660031461258f5760405162461bcd60e51b81526004016104c090615138565b5f805b60208110156125e4576125a681601f615085565b6125b1906008614c44565b886125bd836006614de5565b815181106125cd576125cd615098565b016020015160f81c901b9190911790600101612592565b505f805b6008811015612643576125fc816007615085565b612607906008614c44565b6001600160401b03168961261c836026614de5565b8151811061262c5761262c615098565b016020015160f81c901b91909117906001016125e8565b505f805b60088110156126a25761265b816007615085565b612666906008614c44565b6001600160401b03168a61267b83602e614de5565b8151811061268b5761268b615098565b016020015160f81c901b9190911790600101612647565b5091989097509095509350505050565b6126ba6148e1565b5f8281525f805160206154a883398151915260205260408082208151610100810190925280545f8051602061546883398151915293929190829060ff16600581111561270857612708614af7565b600581111561271957612719614af7565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a1576127a1614af7565b146127fd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b0316146128775760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b6128848160a00151611bfa565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128c8576128c8614af7565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129948561298e816118dc565b5f611c4f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c3908590600401614ce9565b6020604051808303815f875af11580156129df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a039190614cb0565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a64612e59565b5f805160206154288339815191525f612a7f6101ed85613853565b90505f612a8b876117fd565b9050600281516005811115612aa257612aa2614af7565b14612b015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b0a82613876565b5f828260a00151612b1b9190614dc5565b60048501546060840151919250612b3d916001600160401b0390911690614c19565b6001600160401b0316816001600160401b03161115612bbc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bc68882611c07565b5f612bd0896118dc565b90505f8982604051602001612bfc92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c368d8688611c4f565b6040518263ffffffff1660e01b8152600401612c529190614ce9565b6020604051808303815f875af1158015612c6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c929190614cb0565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d1a57612d1a614af7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061127860015f8051602061548883398151915255565b5f80516020615488833981519152805460011901612e8a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615428833981519152906001600160401b0316612edc6040860160208701614a5b565b6001600160401b03161015612f4b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f5d602086018661518e565b61ffff1610158015612f815750612710612f7a602086018661518e565b61ffff1611155b612f9d5760405162461bcd60e51b81526004016104c0906151a9565b80548310156130005760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b80600101548311156130675760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61307184613853565b90505f61307d82610a64565b90505f61308a8883613881565b5f818152600586016020526040902090915087906130a882826151f4565b509098975050505050505050565b60015f8051602061548883398151915255565b5f8082516027146130ec5760405162461bcd60e51b81526004016104c0906150ac565b5f805b600281101561313b57613103816001615085565b61310e906008614c44565b61ffff1685828151811061312457613124615098565b016020015160f81c901b91909117906001016130ef565b5061ffff81161561315e5760405162461bcd60e51b81526004016104c0906150f5565b5f805b60048110156131b957613175816003615085565b613180906008614c44565b63ffffffff1686613192836002614de5565b815181106131a2576131a2615098565b016020015160f81c901b9190911790600101613161565b5063ffffffff81166002146131e05760405162461bcd60e51b81526004016104c090615138565b5f805b6020811015613235576131f781601f615085565b613202906008614c44565b8761320e836006614de5565b8151811061321e5761321e615098565b016020015160f81c901b91909117906001016131e3565b505f8660268151811061324a5761324a615098565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461328d5760405162461bcd60e51b81526004016104c0906150ac565b5f805b60028110156132dc576132a4816001615085565b6132af906008614c44565b61ffff168582815181106132c5576132c5615098565b016020015160f81c901b9190911790600101613290565b5061ffff8116156132ff5760405162461bcd60e51b81526004016104c0906150f5565b5f805b600481101561335a57613316816003615085565b613321906008614c44565b63ffffffff1686613333836002614de5565b8151811061334357613343615098565b016020015160f81c901b9190911790600101613302565b5063ffffffff81166004146133815760405162461bcd60e51b81526004016104c090615138565b5f805b60208110156133d65761339881601f615085565b6133a3906008614c44565b876133af836006614de5565b815181106133bf576133bf615098565b016020015160f81c901b9190911790600101613384565b505f805b6008811015613435576133ee816007615085565b6133f9906008614c44565b6001600160401b03168861340e836026614de5565b8151811061341e5761341e615098565b016020015160f81c901b91909117906001016133da565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615468833981519152914291901580613528575060028301548151613524916001600160401b031690614de5565b8210155b1561354e576001600160401b03851660608201528181526040810151602082015261356d565b84816060018181516135609190614dc5565b6001600160401b03169052505b606081015161357d906064614c19565b602082015160028501546001600160401b0392909216916135a89190600160401b900460ff16614c44565b101561360c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561363557846001600160401b03168160400181815161362d9190614de5565b905250613654565b846001600160401b0316816040018181516136509190615085565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136e557604051631afcd79f60e31b815260040160405180910390fd5b565b6136ef61369c565b6136f881613dbb565b611c04608082013560a083013561371560e0850160c08601614a5b565b613726610100860160e0870161518e565b61ffff1661373c6101208701610100880161524a565b61374e6101408801610120890161526a565b613ddc565b61375b61369c565b5f805160206154088339815191526001600160a01b0382166137d45760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614020565b5f610a74825f80516020615408833981519152546001600160a01b031690614081565b611c04816001613442565b5f5f80516020615468833981519152426138a16040860160208701614a5b565b6001600160401b0316116139135760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139236040850160208601614a5b565b6001600160401b03166139396202a30042614de5565b116139ac5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b8335613a045760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a745760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a816040850185615285565b9050603014613ae85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613af183613876565b5f80613b8b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b369190614a5b565b6001600160401b03168152602001613b5160408a018a615285565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141e3565b5f82815260078601602052604090209193509150613ba98282615312565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bd6908590600401614ce9565b6020604051808303815f875af1158015613bf2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c169190614cb0565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c9857613c98614af7565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8d91908e01908e01614a5b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613dc361369c565b613dcb614588565b613dd3614598565b611c04816145a0565b613de461369c565b5f8051602061542883398151915283613e505760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e725760405162461bcd60e51b81526004016104c0906151a9565b85871115613eda5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f475760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fb95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6140346001600160a01b0384168361474d565b905080515f1415801561405857508080602001905181019061405691906153d1565b155b15610bd957604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140eb9190614cb0565b90506141026001600160a01b03851633308661475a565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614146573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061416a9190614cb0565b90508181116141d05760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141da8282615085565b95945050505050565b5f606082608001515160301461424d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142c457614284816001615085565b61428f906008614c44565b5081515f908390839081106142a6576142a6615098565b60200101906001600160f81b03191690815f1a905350600101614270565b505f5b6004811015614322576142db816003615085565b6142e6906008614c44565b505f826142f4836002614de5565b8151811061430457614304615098565b60200101906001600160f81b03191690815f1a9053506001016142c7565b505f5b602081101561437f578451816020811061434157614341615098565b1a60f81b82614351836006614de5565b8151811061436157614361615098565b60200101906001600160f81b03191690815f1a905350600101614325565b505f5b60208110156143df57846020015181602081106143a1576143a1615098565b1a60f81b826143b1836026614de5565b815181106143c1576143c1615098565b60200101906001600160f81b03191690815f1a905350600101614382565b505f5b6008811015614453576143f6816007615085565b614401906008614c44565b60ff1685604001516001600160401b0316901c60f81b828260466144259190614de5565b8151811061443557614435615098565b60200101906001600160f81b03191690815f1a9053506001016143e2565b505f5b60308110156144be578460800151818151811061447557614475615098565b01602001516001600160f81b0319168261449083604e614de5565b815181106144a0576144a0615098565b60200101906001600160f81b03191690815f1a905350600101614456565b505f5b6008811015614530576144d5816007615085565b6144e0906008614c44565b60608601516001600160401b0390811691161c60f81b8261450283607e614de5565b8151811061451257614512615098565b60200101906001600160f81b03191690815f1a9053506001016144c1565b5060028160405161454191906153ec565b602060405180830381855afa15801561455c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061457f9190614cb0565b94909350915050565b61459061369c565b6136e5614793565b6136e561369c565b6145a861369c565b80355f8051602061546883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145f4608084016060850161524a565b60ff1611156146615760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f614672608084016060850161524a565b60ff16116146da5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146ea608083016060840161524a565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561471b6060830160408401614a5b565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061127883835f61479b565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5e9186918216906323b872dd90608401613821565b6130b661369c565b6060814710156147c05760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147db91906153ec565b5f6040518083038185875af1925050503d805f8114614815576040519150601f19603f3d011682016040523d82523d5f602084013e61481a565b606091505b5091509150611bf086838360608261483a5761483582614881565b611278565b815115801561485157506001600160a01b0384163b155b1561487a57604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b5080611278565b8051156148915780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148b690614df8565b5f825580601f106148c5575050565b601f0160209004905f5260205f2090810190611c049190614925565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614939575f8155600101614926565b5090565b8015158114611c04575f80fd5b803563ffffffff8116811461495d575f80fd5b919050565b5f805f60608486031215614974575f80fd5b8335925060208401356149868161493d565b91506149946040850161494a565b90509250925092565b5f602082840312156149ad575f80fd5b5035919050565b6001600160a01b0381168114611c04575f80fd5b5f808284036101608112156149db575f80fd5b610140808212156149ea575f80fd5b84935083013590506149fb816149b4565b809150509250929050565b5f60208284031215614a16575f80fd5b6112788261494a565b5f8060408385031215614a30575f80fd5b614a398361494a565b946020939093013593505050565b6001600160401b0381168114611c04575f80fd5b5f60208284031215614a6b575f80fd5b813561127881614a47565b5f8060408385031215614a87575f80fd5b50508035926020909101359150565b5f805f8385036080811215614aa9575f80fd5b84356001600160401b03811115614abe575f80fd5b850160608188031215614acf575f80fd5b93506040601f1982011215614ae2575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2f57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b5760408401826001600160a01b03169052565b506060830151614b7260608401826001600160401b03169052565b506080830151614b8d60808401826001600160401b03169052565b5060a0830151614ba860a08401826001600160401b03169052565b5060c0830151614bc360c08401826001600160401b03169052565b5060e0830151614bde60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bde57614bde614be5565b6001600160401b03818116838216028082169190828114614c3c57614c3c614be5565b505092915050565b8082028115828204841417610a7457610a74614be5565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f60208284031215614cc0575f80fd5b5051919050565b5f5b83811015614ce1578181015183820152602001614cc9565b50505f910152565b602081525f8251806020840152614d07816040850160208701614cc7565b601f01601f19169190910160400192915050565b5f82614d3557634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bde57614bde614be5565b80820180821115610a7457610a74614be5565b600181811c90821680614e0c57607f821691505b602082108103614e2a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e8981614df8565b806020870152604060018084165f8114614eaa5760018114614ec657614ef3565b60ff19851660408a0152604084151560051b8a01019550614ef3565b895f5260205f205f5b85811015614eea5781548b8201860152908301908801614ecf565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614f1c57614f1c614be5565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f5c57614f5c614f26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f8a57614f8a614f26565b604052919050565b805161495d8161493d565b5f8060408385031215614fae575f80fd5b82516001600160401b0380821115614fc4575f80fd5b9084019060608287031215614fd7575f80fd5b614fdf614f3a565b82518152602080840151614ff2816149b4565b82820152604084015183811115615007575f80fd5b80850194505087601f85011261501b575f80fd5b83518381111561502d5761502d614f26565b61503f601f8201601f19168301614f62565b93508084528882828701011115615054575f80fd5b61506381838601848801614cc7565b50826040830152819550615078818801614f92565b9450505050509250929050565b81810381811115610a7457610a74614be5565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c04575f80fd5b5f6020828403121561519e575f80fd5b81356112788161517f565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151ff8161517f565b61ffff8116905081548161ffff198216178355602084013561522081614a47565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6020828403121561525a575f80fd5b813560ff81168114611278575f80fd5b5f6020828403121561527a575f80fd5b8135611278816149b4565b5f808335601e1984360301811261529a575f80fd5b8301803591506001600160401b038211156152b3575f80fd5b6020019150368190038213156152c7575f80fd5b9250929050565b601f821115610bd957805f5260205f20601f840160051c810160208510156152f35750805b601f840160051c820191505b81811015610ff3575f81556001016152ff565b81516001600160401b0381111561532b5761532b614f26565b61533f816153398454614df8565b846152ce565b602080601f831160018114615372575f841561535b5750858301515b5f19600386901b1c1916600185901b1785556153c9565b5f85815260208120601f198616915b828110156153a057888601518255948401946001909101908401615381565b50858210156153bd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156153e1575f80fd5b81516112788161493d565b5f82516153fd818460208701614cc7565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516155be3803806155be83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154718061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614958565b61036a565b005b61015f61016f366004614993565b610892565b6101b2610182366004614993565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614993565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149be565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149fc565b610b57565b61015f61025a366004614a15565b610bdb565b6101b261026d366004614a51565b610dab565b6101f2610280366004614993565b610dc4565b61015f610293366004614958565b610dd8565b61015f6102a6366004614a15565b610ff6565b6101b26102b9366004614a6c565b611262565b6101b26102cc366004614a8c565b611275565b61015f6102df3660046149fc565b6112a1565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610320366004614993565b61145e565b61015f610333366004614993565b6116e4565b6101cd601481565b61035361034e366004614993565b6117f3565b6040516101bc9190614b01565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153c5833981519152949193919290829060ff1660048111156103d2576103d2614aed565b60048111156103e3576103e3614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117f3565b90504260028351600481111561047757610477614aed565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153e58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153e58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118d2565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614aed565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e8689611954565b6001600160401b03169050605060ff168460c001518461067e9190614bef565b6106889190614c0f565b6001600160401b031661069c826064614c3a565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dab565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c51565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614aed565b03610799576107998460600151611bf0565b5f84606001518460a001516107ae9190614bef565b90506107ba8682611bfd565b5f6005600160991b0163ee5b48eb6107d3898686611c45565b6040518263ffffffff1660e01b81526004016107ef9190614c8a565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c51565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156108e0576108e0614aed565b60058111156108f1576108f1614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614aed565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c45565b6040518263ffffffff1660e01b8152600401610a1c9190614c8a565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c51565b50505050565b5f610a7264e8d4a5100083614cbc565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e62565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153c58339815191525f610b6f83611e80565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9b916121f3565b604080820180516001600160a01b03165f908152600a850160205291822091909155516060820151610bd69190610bd190610dab565b612269565b505050565b5f805160206153c58339815191525f610bf38461228c565b90505f80610c04836040015161246d565b50915091505f610c13836117f3565b9050816001600160401b031681608001516001600160401b03161015610c4b5760405162461bcd60e51b81526004016104c090614cdb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c905760405162461bcd60e51b81526004016104c090614d1d565b60015f87815260068701602052604090205460ff166004811115610cb657610cb6614aed565b14610d1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c3a565b5f610dce826117f3565b60a0015192915050565b5f805160206153c58339815191525f610df0856126a8565b5f86815260058401602052604090205460c0820151919250610e2291620100009091046001600160401b031690614d66565b6001600160401b03168160e001516001600160401b03161015610ea35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610fef575f610eb48685611954565b9050605060ff168260c001518360e00151610ecf9190614bef565b610ed99190614c0f565b6001600160401b0316610eed826064614c0f565b6001600160401b031610610fed578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f2e8460a00151610dab565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610f96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fba9190614c51565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fe7908490614d86565b90915550505b505b5050505050565b5f805160206153c58339815191525f61100e8461228c565b90505f8061101f836040015161246d565b50915091505f61102e836117f3565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106857611068614aed565b600481111561107957611079614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111185760405162461bcd60e51b81526004016104c090614cdb565b5f8781526006870160205260409020600301546001600160401b03808516911611156111565760405162461bcd60e51b81526004016104c090614d1d565b60038151600481111561116b5761116b614aed565b146111bf5760405162461bcd60e51b815260206004820152603160248201525f805160206153e58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111f591906121f3565b856009015f8881526020019081526020015f205f90556112208160200151610bd18360600151610dab565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f61126e833384612a51565b9392505050565b5f61127e612e4f565b611289848484612e86565b905061126e60015f8051602061542583398151915255565b5f805160206154058339815191525f6112b98361228c565b90505f806112ca83604001516130bf565b915091508061132c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461134690614d99565b9050118015611378575060015f83815260088601602052604090205460ff16600581111561137657611376614aed565b145b6113945760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078501602052604081206113ac916148a0565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153c583398151915293929190829060ff1660048111156114bf576114bf614aed565b60048111156114d0576114d0614aed565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561155757611557614aed565b1480611575575060038151600481111561157357611573614aed565b145b6115c95760405162461bcd60e51b815260206004820152603260248201525f805160206153e5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115d782604001516117f3565b905080608001516001600160401b03165f0361165b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611688846040015184608001518560a00151611c45565b6040518263ffffffff1660e01b81526004016116a49190614c8a565b6020604051808303815f875af11580156116c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190614c51565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061540583398151915292919061172c90614d99565b905011801561175e575060015f83815260088301602052604090205460ff16600581111561175c5761175c614aed565b145b61177a5760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117b39190600401614e18565b6020604051808303815f875af11580156117cf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190614c51565b6117fb6148d7565b5f8281525f805160206154458339815191526020526040908190208151610100810190925280545f80516020615405833981519152929190829060ff16600581111561184957611849614aed565b600581111561185a5761185a614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154458339815191526020526040812060030180545f80516020615405833981519152916001600160401b03909116908361191583614ea2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561199f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119c69190810190614f3e565b9150915080611a295760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a909190614c51565b825114611af45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b6a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b798460400151613260565b91509150818714611be65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bfa815f613438565b50565b5f9182525f80516020615445833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cbe57611c7e816001615026565b611c89906008614c3a565b5081515f90839083908110611ca057611ca0615039565b60200101906001600160f81b03191690815f1a905350600101611c6a565b505f5b6004811015611d2157611cd5816003615026565b611ce0906008614c3a565b6001901c60f81b82611cf3836002614d86565b81518110611d0357611d03615039565b60200101906001600160f81b03191690815f1a905350600101611cc1565b505f5b6020811015611d8357611d3881601f615026565b611d43906008614c3a565b86901c60f81b82611d55836006614d86565b81518110611d6557611d65615039565b60200101906001600160f81b03191690815f1a905350600101611d24565b505f5b6008811015611dee57611d9a816007615026565b611da5906008614c3a565b6001600160401b038616901c60f81b82611dc0836026614d86565b81518110611dd057611dd0615039565b60200101906001600160f81b03191690815f1a905350600101611d86565b505f5b6008811015611e5957611e05816007615026565b611e10906008614c3a565b6001600160401b038516901c60f81b82611e2b83602e614d86565b81518110611e3b57611e3b615039565b60200101906001600160f81b03191690815f1a905350600101611df1565b50949350505050565b611e6a613692565b611e73826136dd565b611e7c81613749565b5050565b611e886148d7565b5f805160206154058339815191525f611ea08461228c565b90505f80611eb183604001516130bf565b915091508015611f165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4857611f48614aed565b6005811115611f5957611f59614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fe057611fe0614aed565b1480611ffe5750600182516005811115611ffc57611ffc614aed565b145b61205d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561207257612072614aed565b0361207f57506004612083565b5060055b6020808301515f908152600988019091526040812055818160058111156120ac576120ac614aed565b908160058111156120bf576120bf614aed565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120f3576120f3614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121be576121be614aed565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153a583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561224e575f80fd5b505af1158015612260573d5f803e3d5ffd5b50505050505050565b5f805160206153a583398151915254611e7c906001600160a01b031683836137ea565b60408051606080820183525f8083526020830181905292820152905f805160206154058339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612301573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123289190810190614f3e565b915091508061238f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b0316156124655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124915760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156124e0576124a8816001615026565b6124b3906008614c3a565b61ffff168682815181106124c9576124c9615039565b016020015160f81c901b9190911790600101612494565b5061ffff8116156125035760405162461bcd60e51b81526004016104c090615096565b5f805b600481101561255e5761251a816003615026565b612525906008614c3a565b63ffffffff1687612537836002614d86565b8151811061254757612547615039565b016020015160f81c901b9190911790600101612506565b5063ffffffff81166003146125855760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156125da5761259c81601f615026565b6125a7906008614c3a565b886125b3836006614d86565b815181106125c3576125c3615039565b016020015160f81c901b9190911790600101612588565b505f805b6008811015612639576125f2816007615026565b6125fd906008614c3a565b6001600160401b031689612612836026614d86565b8151811061262257612622615039565b016020015160f81c901b91909117906001016125de565b505f805b600881101561269857612651816007615026565b61265c906008614c3a565b6001600160401b03168a61267183602e614d86565b8151811061268157612681615039565b016020015160f81c901b919091179060010161263d565b5091989097509095509350505050565b6126b06148d7565b5f8281525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156126fe576126fe614aed565b600581111561270f5761270f614aed565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561279757612797614aed565b146127f35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b03161461286d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61287a8160a00151611bf0565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128be576128be614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61298a85612984816118d2565b5f611c45565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b9908590600401614c8a565b6020604051808303815f875af11580156129d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f99190614c51565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a5a612e4f565b5f805160206153c58339815191525f612a756101ed85613849565b90505f612a81876117f3565b9050600281516005811115612a9857612a98614aed565b14612af75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b008261386c565b5f828260a00151612b119190614d66565b60048501546060840151919250612b33916001600160401b0390911690614c0f565b6001600160401b0316816001600160401b03161115612bb25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bbc8882611bfd565b5f612bc6896118d2565b90505f8982604051602001612bf292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c2c8d8688611c45565b6040518263ffffffff1660e01b8152600401612c489190614c8a565b6020604051808303815f875af1158015612c64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c889190614c51565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d1057612d10614aed565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126e60015f8051602061542583398151915255565b5f80516020615425833981519152805460011901612e8057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153c5833981519152906001600160401b0316612ed26040860160208701614a51565b6001600160401b03161015612f415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f53602086018661512f565b61ffff1610158015612f775750612710612f70602086018661512f565b61ffff1611155b612f935760405162461bcd60e51b81526004016104c09061514a565b8054831015612ff65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b806001015483111561305d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61306784613849565b90505f61307382610a62565b90505f6130808883613877565b5f8181526005860160205260409020909150879061309e8282615195565b509098975050505050505050565b60015f8051602061542583398151915255565b5f8082516027146130e25760405162461bcd60e51b81526004016104c09061504d565b5f805b6002811015613131576130f9816001615026565b613104906008614c3a565b61ffff1685828151811061311a5761311a615039565b016020015160f81c901b91909117906001016130e5565b5061ffff8116156131545760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156131af5761316b816003615026565b613176906008614c3a565b63ffffffff1686613188836002614d86565b8151811061319857613198615039565b016020015160f81c901b9190911790600101613157565b5063ffffffff81166002146131d65760405162461bcd60e51b81526004016104c0906150d9565b5f805b602081101561322b576131ed81601f615026565b6131f8906008614c3a565b87613204836006614d86565b8151811061321457613214615039565b016020015160f81c901b91909117906001016131d9565b505f8660268151811061324057613240615039565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132835760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156132d25761329a816001615026565b6132a5906008614c3a565b61ffff168582815181106132bb576132bb615039565b016020015160f81c901b9190911790600101613286565b5061ffff8116156132f55760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156133505761330c816003615026565b613317906008614c3a565b63ffffffff1686613329836002614d86565b8151811061333957613339615039565b016020015160f81c901b91909117906001016132f8565b5063ffffffff81166004146133775760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156133cc5761338e81601f615026565b613399906008614c3a565b876133a5836006614d86565b815181106133b5576133b5615039565b016020015160f81c901b919091179060010161337a565b505f805b600881101561342b576133e4816007615026565b6133ef906008614c3a565b6001600160401b031688613404836026614d86565b8151811061341457613414615039565b016020015160f81c901b91909117906001016133d0565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061540583398151915291429190158061351e57506002830154815161351a916001600160401b031690614d86565b8210155b15613544576001600160401b038516606082015281815260408101516020820152613563565b84816060018181516135569190614d66565b6001600160401b03169052505b6060810151613573906064614c0f565b602082015160028501546001600160401b03929092169161359e9190600160401b900460ff16614c3a565b10156136025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362b57846001600160401b0316816040018181516136239190614d86565b90525061364a565b846001600160401b0316816040018181516136469190615026565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136db57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e5613692565b6136ee81613db1565b611bfa608082013560a083013561370b60e0850160c08601614a51565b61371c610100860160e0870161512f565b61ffff16613732610120870161010088016151eb565b6137446101408801610120890161520b565b613dd2565b613751613692565b5f805160206153a58339815191526001600160a01b0382166137ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614016565b5f610a72825f805160206153a5833981519152546001600160a01b031690614077565b611bfa816001613438565b5f5f80516020615405833981519152426138976040860160208701614a51565b6001600160401b0316116139095760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139196040850160208601614a51565b6001600160401b031661392f6202a30042614d86565b116139a25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139fa5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a6a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a776040850185615226565b9050603014613ade5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613ae78361386c565b5f80613b816040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b2c9190614a51565b6001600160401b03168152602001613b4760408a018a615226565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d9565b5f82815260078601602052604090209193509150613b9f82826152b3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bcc908590600401614c8a565b6020604051808303815f875af1158015613be8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0c9190614c51565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8e57613c8e614aed565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8391908e01908e01614a51565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db9613692565b613dc161457e565b613dc961458e565b611bfa81614596565b613dda613692565b5f805160206153c583398151915283613e465760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e685760405162461bcd60e51b81526004016104c09061514a565b85871115613ed05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f3d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613faf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61402a6001600160a01b03841683614743565b905080515f1415801561404e57508080602001905181019061404c919061536e565b155b15610bd657604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e19190614c51565b90506140f86001600160a01b038516333086614750565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561413c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141609190614c51565b90508181116141c65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141d08282615026565b95945050505050565b5f60608260800151516030146142435760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142ba5761427a816001615026565b614285906008614c3a565b5081515f9083908390811061429c5761429c615039565b60200101906001600160f81b03191690815f1a905350600101614266565b505f5b6004811015614318576142d1816003615026565b6142dc906008614c3a565b505f826142ea836002614d86565b815181106142fa576142fa615039565b60200101906001600160f81b03191690815f1a9053506001016142bd565b505f5b6020811015614375578451816020811061433757614337615039565b1a60f81b82614347836006614d86565b8151811061435757614357615039565b60200101906001600160f81b03191690815f1a90535060010161431b565b505f5b60208110156143d5578460200151816020811061439757614397615039565b1a60f81b826143a7836026614d86565b815181106143b7576143b7615039565b60200101906001600160f81b03191690815f1a905350600101614378565b505f5b6008811015614449576143ec816007615026565b6143f7906008614c3a565b60ff1685604001516001600160401b0316901c60f81b8282604661441b9190614d86565b8151811061442b5761442b615039565b60200101906001600160f81b03191690815f1a9053506001016143d8565b505f5b60308110156144b4578460800151818151811061446b5761446b615039565b01602001516001600160f81b0319168261448683604e614d86565b8151811061449657614496615039565b60200101906001600160f81b03191690815f1a90535060010161444c565b505f5b6008811015614526576144cb816007615026565b6144d6906008614c3a565b60608601516001600160401b0390811691161c60f81b826144f883607e614d86565b8151811061450857614508615039565b60200101906001600160f81b03191690815f1a9053506001016144b7565b506002816040516145379190615389565b602060405180830381855afa158015614552573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145759190614c51565b94909350915050565b614586613692565b6136db614789565b6136db613692565b61459e613692565b80355f8051602061540583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145ea60808401606085016151eb565b60ff1611156146575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61466860808401606085016151eb565b60ff16116146d05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146e060808301606084016151eb565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147116060830160408401614a51565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126e83835f614791565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd90608401613817565b6130ac613692565b6060814710156147b65760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147d19190615389565b5f6040518083038185875af1925050503d805f811461480b576040519150601f19603f3d011682016040523d82523d5f602084013e614810565b606091505b5091509150611be68683836060826148305761482b82614877565b61126e565b815115801561484757506001600160a01b0384163b155b1561487057604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b508061126e565b8051156148875780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148ac90614d99565b5f825580601f106148bb575050565b601f0160209004905f5260205f2090810190611bfa919061491b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561492f575f815560010161491c565b5090565b8015158114611bfa575f80fd5b803563ffffffff81168114614953575f80fd5b919050565b5f805f6060848603121561496a575f80fd5b83359250602084013561497c81614933565b915061498a60408501614940565b90509250925092565b5f602082840312156149a3575f80fd5b5035919050565b6001600160a01b0381168114611bfa575f80fd5b5f808284036101608112156149d1575f80fd5b610140808212156149e0575f80fd5b84935083013590506149f1816149aa565b809150509250929050565b5f60208284031215614a0c575f80fd5b61126e82614940565b5f8060408385031215614a26575f80fd5b614a2f83614940565b946020939093013593505050565b6001600160401b0381168114611bfa575f80fd5b5f60208284031215614a61575f80fd5b813561126e81614a3d565b5f8060408385031215614a7d575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a9f575f80fd5b84356001600160401b03811115614ab4575f80fd5b850160608188031215614ac5575f80fd5b93506040601f1982011215614ad8575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4d60408401826001600160a01b03169052565b506060830151614b6860608401826001600160401b03169052565b506080830151614b8360808401826001600160401b03169052565b5060a0830151614b9e60a08401826001600160401b03169052565b5060c0830151614bb960c08401826001600160401b03169052565b5060e0830151614bd460e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bd457614bd4614bdb565b6001600160401b03818116838216028082169190828114614c3257614c32614bdb565b505092915050565b8082028115828204841417610a7257610a72614bdb565b5f60208284031215614c61575f80fd5b5051919050565b5f5b83811015614c82578181015183820152602001614c6a565b50505f910152565b602081525f8251806020840152614ca8816040850160208701614c68565b601f01601f19169190910160400192915050565b5f82614cd657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bd457614bd4614bdb565b80820180821115610a7257610a72614bdb565b600181811c90821680614dad57607f821691505b602082108103614dcb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e2a81614d99565b806020870152604060018084165f8114614e4b5760018114614e6757614e94565b60ff19851660408a0152604084151560051b8a01019550614e94565b895f5260205f205f5b85811015614e8b5781548b8201860152908301908801614e70565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ebd57614ebd614bdb565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614efd57614efd614ec7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2b57614f2b614ec7565b604052919050565b805161495381614933565b5f8060408385031215614f4f575f80fd5b82516001600160401b0380821115614f65575f80fd5b9084019060608287031215614f78575f80fd5b614f80614edb565b82518152602080840151614f93816149aa565b82820152604084015183811115614fa8575f80fd5b80850194505087601f850112614fbc575f80fd5b835183811115614fce57614fce614ec7565b614fe0601f8201601f19168301614f03565b93508084528882828701011115614ff5575f80fd5b61500481838601848801614c68565b50826040830152819550615019818801614f33565b9450505050509250929050565b81810381811115610a7257610a72614bdb565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bfa575f80fd5b5f6020828403121561513f575f80fd5b813561126e81615120565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151a081615120565b61ffff8116905081548161ffff19821617835560208401356151c181614a3d565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151fb575f80fd5b813560ff8116811461126e575f80fd5b5f6020828403121561521b575f80fd5b813561126e816149aa565b5f808335601e1984360301811261523b575f80fd5b8301803591506001600160401b03821115615254575f80fd5b602001915036819003821315615268575f80fd5b9250929050565b601f821115610bd657805f5260205f20601f840160051c810160208510156152945750805b601f840160051c820191505b81811015610fef575f81556001016152a0565b81516001600160401b038111156152cc576152cc614ec7565b6152e0816152da8454614d99565b8461526f565b602080601f831160018114615313575f84156152fc5750858301515b5f19600386901b1c1916600185901b178555610fed565b5f85815260208120601f198616915b8281101561534157888601518255948401946001909101908401615322565b508582101561535e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561537e575f80fd5b815161126e81614933565b5f825161539a818460208701614c68565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index dc5a43a78..da75dc6ac 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516151f53803806151f583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150a88061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145c6565b61045a565b005b34801561016c575f80fd5b5061015f61017b366004614601565b610984565b34801561018b575f80fd5b506101ca61019a366004614601565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614618565b610b54565b34801561022d575f80fd5b5061024161023c366004614601565b610c31565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b36600461462f565b610c47565b3480156102ab575f80fd5b5061015f6102ba366004614648565b610cae565b3480156102ca575f80fd5b506101ca6102d9366004614684565b610e7e565b3480156102e9575f80fd5b506102416102f8366004614601565b610e97565b348015610308575f80fd5b5061015f6103173660046145c6565b610eab565b6101ca61032a36600461469f565b6110ca565b34801561033a575f80fd5b5061015f610349366004614648565b6110f6565b348015610359575f80fd5b5061015f61036836600461462f565b611346565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd366004614601565b611503565b3480156103dd575f80fd5b5061015f6103ec366004614601565b611789565b6101ca6103ff366004614601565b611898565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b50610437610432366004614601565b6118a4565b6040516101d4919061470c565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614ffc833981519152949193919290829060ff1660048111156104c2576104c26146f8565b60048111156104d3576104d36146f8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f836118a4565b905042600283516004811115610567576105676146f8565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f8051602061501c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f8051602061501c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f61062885611983565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146f8565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610864575f61074e8689611a05565b6001600160401b03169050605060ff168460c001518461076e91906147fa565b610778919061481a565b6001600160401b031661078c826064614845565b10156107aa5760405162461bcd60e51b81526004016105b09061485c565b6004878101546060870151608088015160a0890151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561082e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061085291906148b1565b5f8b8152600989016020526040902055505b600283516005811115610879576108796146f8565b0361088b5761088b8460600151611ca1565b5f84606001518460a001516108a091906147fa565b90506108ac8682611cae565b5f6005600160991b0163ee5b48eb6108c5898686611cf6565b6040518263ffffffff1660e01b81526004016108e191906148ea565b6020604051808303815f875af11580156108fd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092191906148b1565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061507c83398151915260205260408082208151610100810190925280545f8051602061503c83398151915293929190829060ff1660058111156109d2576109d26146f8565b60058111156109e3576109e36146f8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6857610a686146f8565b14610acd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af28584608001515f611cf6565b6040518263ffffffff1660e01b8152600401610b0e91906148ea565b6020604051808303815f875af1158015610b2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4e91906148b1565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9d575080546001600160401b03808416911610155b15610bbb5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be583611f15565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4164e8d4a510008361491c565b92915050565b5f80516020614ffc8339815191525f610c5f83611f26565b604081810180516001600160a01b039081165f908152600a8701602052825190911681529182209190915560608201519051919250610ca9916001600160401b039091169061229d565b505050565b5f80516020614ffc8339815191525f610cc6846122b0565b90505f80610cd78360400151612491565b50915091505f610ce6836118a4565b9050816001600160401b031681608001516001600160401b03161015610d1e5760405162461bcd60e51b81526004016105b09061493b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d635760405162461bcd60e51b81526004016105b09061497d565b60015f87815260068701602052604090205460ff166004811115610d8957610d896146f8565b14610df25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c416001600160401b03831664e8d4a51000614845565b5f610ea1826118a4565b60a0015192915050565b5f80516020614ffc8339815191525f610ec3856126cc565b5f86815260058401602052604090205460c0820151919250610ef591620100009091046001600160401b0316906149c6565b6001600160401b03168160e001516001600160401b03161015610f765760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110c3575f610f878685611a05565b9050605060ff168260c001518360e00151610fa291906147fa565b610fac919061481a565b6001600160401b0316610fc082606461481a565b6001600160401b03161015610fe75760405162461bcd60e51b81526004016105b09061485c565b60048381015460a084015160c085015160e0860151604051639d4ba9db60e01b81526001600160401b039384169581019590955290821660248501521660448301525f606483018190526084830152600160401b90046001600160a01b031690639d4ba9db9060a401602060405180830381865afa15801561106b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061108f91906148b1565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110bc9084906149e6565b9091555050505b5050505050565b5f6110d3612a75565b6110de838334612aac565b9050610c4160015f8051602061505c83398151915255565b5f80516020614ffc8339815191525f61110e846122b0565b90505f8061111f8360400151612491565b50915091505f61112e836118a4565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611168576111686146f8565b6004811115611179576111796146f8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112185760405162461bcd60e51b81526004016105b09061493b565b5f8781526006870160205260409020600301546001600160401b03808516911611156112565760405162461bcd60e51b81526004016105b09061497d565b60038151600481111561126b5761126b6146f8565b146112bf5760405162461bcd60e51b815260206004820152603160248201525f8051602061501c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff19166004179055600989018252822091909155606082015190820151611304916001600160401b03169061229d565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f8051602061503c8339815191525f61135e836122b0565b90505f8061136f8360400151612cda565b91509150806113d15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113eb906149f9565b905011801561141d575060015f83815260088601602052604090205460ff16600581111561141b5761141b6146f8565b145b6114395760405162461bcd60e51b81526004016105b090614a2b565b5f82815260078501602052604081206114519161450e565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614ffc83398151915293929190829060ff166004811115611564576115646146f8565b6004811115611575576115756146f8565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115fc576115fc6146f8565b148061161a5750600381516004811115611618576116186146f8565b145b61166e5760405162461bcd60e51b815260206004820152603260248201525f8051602061501c833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f61167c82604001516118a4565b905080608001516001600160401b03165f036117005760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb61172d846040015184608001518560a00151611cf6565b6040518263ffffffff1660e01b815260040161174991906148ea565b6020604051808303815f875af1158015611765573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110c391906148b1565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061503c8339815191529291906117d1906149f9565b9050118015611803575060015f83815260088301602052604090205460ff166005811115611801576118016146f8565b145b61181f5760405162461bcd60e51b81526004016105b090614a2b565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118589190600401614a72565b6020604051808303815f875af1158015611874573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca991906148b1565b5f610c41823334612e7b565b6118ac614545565b5f8281525f8051602061507c8339815191526020526040908190208151610100810190925280545f8051602061503c833981519152929190829060ff1660058111156118fa576118fa6146f8565b600581111561190b5761190b6146f8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f8051602061507c8339815191526020526040812060030180545f8051602061503c833981519152916001600160401b0390911690836119c683614afc565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a50573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a779190810190614bac565b9150915080611ada5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4191906148b1565b825114611ba55760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c1b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c2a8460400151613276565b91509150818714611c975760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611cab815f61344e565b50565b5f9182525f8051602061507c833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d6f57611d2f816001614c94565b611d3a906008614845565b5081515f90839083908110611d5157611d51614ca7565b60200101906001600160f81b03191690815f1a905350600101611d1b565b505f5b6004811015611dd257611d86816003614c94565b611d91906008614845565b6001901c60f81b82611da48360026149e6565b81518110611db457611db4614ca7565b60200101906001600160f81b03191690815f1a905350600101611d72565b505f5b6020811015611e3457611de981601f614c94565b611df4906008614845565b86901c60f81b82611e068360066149e6565b81518110611e1657611e16614ca7565b60200101906001600160f81b03191690815f1a905350600101611dd5565b505f5b6008811015611e9f57611e4b816007614c94565b611e56906008614845565b6001600160401b038616901c60f81b82611e718360266149e6565b81518110611e8157611e81614ca7565b60200101906001600160f81b03191690815f1a905350600101611e37565b505f5b6008811015611f0a57611eb6816007614c94565b611ec1906008614845565b6001600160401b038516901c60f81b82611edc83602e6149e6565b81518110611eec57611eec614ca7565b60200101906001600160f81b03191690815f1a905350600101611ea2565b5090505b9392505050565b611f1d6136a8565b611cab816136f3565b611f2e614545565b5f8051602061503c8339815191525f611f46846122b0565b90505f80611f578360400151612cda565b915091508015611fbc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fee57611fee6146f8565b6005811115611fff57611fff6146f8565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612086576120866146f8565b14806120a457506001825160058111156120a2576120a26146f8565b145b6121035760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b600382516005811115612118576121186146f8565b0361212557506004612129565b5060055b6020808301515f90815260098801909152604081205581816005811115612152576121526146f8565b90816005811115612165576121656146f8565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612199576121996146f8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115612264576122646146f8565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6122996001600160a01b0382168361375f565b60408051606080820183525f8083526020830181905292820152905f8051602061503c8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612325573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261234c9190810190614bac565b91509150806123b35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124165760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b0316156124895760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124b55760405162461bcd60e51b81526004016105b090614cbb565b5f805b6002811015612504576124cc816001614c94565b6124d7906008614845565b61ffff168682815181106124ed576124ed614ca7565b016020015160f81c901b91909117906001016124b8565b5061ffff8116156125275760405162461bcd60e51b81526004016105b090614d04565b5f805b60048110156125825761253e816003614c94565b612549906008614845565b63ffffffff168761255b8360026149e6565b8151811061256b5761256b614ca7565b016020015160f81c901b919091179060010161252a565b5063ffffffff81166003146125a95760405162461bcd60e51b81526004016105b090614d47565b5f805b60208110156125fe576125c081601f614c94565b6125cb906008614845565b886125d78360066149e6565b815181106125e7576125e7614ca7565b016020015160f81c901b91909117906001016125ac565b505f805b600881101561265d57612616816007614c94565b612621906008614845565b6001600160401b0316896126368360266149e6565b8151811061264657612646614ca7565b016020015160f81c901b9190911790600101612602565b505f805b60088110156126bc57612675816007614c94565b612680906008614845565b6001600160401b03168a61269583602e6149e6565b815181106126a5576126a5614ca7565b016020015160f81c901b9190911790600101612661565b5091989097509095509350505050565b6126d4614545565b5f8281525f8051602061507c83398151915260205260408082208151610100810190925280545f8051602061503c83398151915293929190829060ff166005811115612722576127226146f8565b6005811115612733576127336146f8565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127bb576127bb6146f8565b146128175760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b0316146128915760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b61289e8160a00151611ca1565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128e2576128e26146f8565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129ae856129a881611983565b5f611cf6565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129dd9085906004016148ea565b6020604051808303815f875af11580156129f9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a1d91906148b1565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f8051602061505c833981519152805460011901612aa657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ffc833981519152906001600160401b0316612af86040860160208701614684565b6001600160401b03161015612b675760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b796020860186614d9d565b61ffff1610158015612b9d5750612710612b966020860186614d9d565b61ffff1611155b612bb95760405162461bcd60e51b81526004016105b090614db8565b8054831015612c1c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c835760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c8e82610c31565b90505f612c9b88836137f2565b5f81815260058601602052604090209091508790612cb98282614e03565b509098975050505050505050565b60015f8051602061505c83398151915255565b5f808251602714612cfd5760405162461bcd60e51b81526004016105b090614cbb565b5f805b6002811015612d4c57612d14816001614c94565b612d1f906008614845565b61ffff16858281518110612d3557612d35614ca7565b016020015160f81c901b9190911790600101612d00565b5061ffff811615612d6f5760405162461bcd60e51b81526004016105b090614d04565b5f805b6004811015612dca57612d86816003614c94565b612d91906008614845565b63ffffffff1686612da38360026149e6565b81518110612db357612db3614ca7565b016020015160f81c901b9190911790600101612d72565b5063ffffffff8116600214612df15760405162461bcd60e51b81526004016105b090614d47565b5f805b6020811015612e4657612e0881601f614c94565b612e13906008614845565b87612e1f8360066149e6565b81518110612e2f57612e2f614ca7565b016020015160f81c901b9190911790600101612df4565b505f86602681518110612e5b57612e5b614ca7565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e84612a75565b5f80516020614ffc8339815191525f612e9c84610c31565b90505f612ea8876118a4565b9050600281516005811115612ebf57612ebf6146f8565b14612f1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f2782613d2c565b5f828260a00151612f3891906149c6565b60048501546060840151919250612f5a916001600160401b039091169061481a565b6001600160401b0316816001600160401b03161115612fd95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fe38882611cae565b5f612fed89611983565b90505f898260405160200161301992919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6130538d8688611cf6565b6040518263ffffffff1660e01b815260040161306f91906148ea565b6020604051808303815f875af115801561308b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130af91906148b1565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613137576131376146f8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f0e60015f8051602061505c83398151915255565b5f808251602e146132995760405162461bcd60e51b81526004016105b090614cbb565b5f805b60028110156132e8576132b0816001614c94565b6132bb906008614845565b61ffff168582815181106132d1576132d1614ca7565b016020015160f81c901b919091179060010161329c565b5061ffff81161561330b5760405162461bcd60e51b81526004016105b090614d04565b5f805b600481101561336657613322816003614c94565b61332d906008614845565b63ffffffff168661333f8360026149e6565b8151811061334f5761334f614ca7565b016020015160f81c901b919091179060010161330e565b5063ffffffff811660041461338d5760405162461bcd60e51b81526004016105b090614d47565b5f805b60208110156133e2576133a481601f614c94565b6133af906008614845565b876133bb8360066149e6565b815181106133cb576133cb614ca7565b016020015160f81c901b9190911790600101613390565b505f805b6008811015613441576133fa816007614c94565b613405906008614845565b6001600160401b03168861341a8360266149e6565b8151811061342a5761342a614ca7565b016020015160f81c901b91909117906001016133e6565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061503c833981519152914291901580613534575060028301548151613530916001600160401b0316906149e6565b8210155b1561355a576001600160401b038516606082015281815260408101516020820152613579565b848160600181815161356c91906149c6565b6001600160401b03169052505b606081015161358990606461481a565b602082015160028501546001600160401b0392909216916135b49190600160401b900460ff16614845565b10156136185760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561364157846001600160401b03168160400181815161363991906149e6565b905250613660565b846001600160401b03168160400181815161365c9190614c94565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136f157604051631afcd79f60e31b815260040160405180910390fd5b565b6136fb6136a8565b61370481613d37565b611cab608082013560a083013561372160e0850160c08601614684565b613732610100860160e08701614d9d565b61ffff1661374861012087016101008801614e59565b61375a61014088016101208901614e79565b613d58565b804710156137825760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137cb576040519150601f19603f3d011682016040523d82523d5f602084013e6137d0565b606091505b5050905080610ca957604051630a12f52160e11b815260040160405180910390fd5b5f5f8051602061503c833981519152426138126040860160208701614684565b6001600160401b0316116138845760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b6138946040850160208601614684565b6001600160401b03166138aa6202a300426149e6565b1161391d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139755760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139e55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139f26040850185614e94565b9050603014613a595760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a6283613d2c565b5f80613afc6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613aa79190614684565b6001600160401b03168152602001613ac260408a018a614e94565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f9c565b5f82815260078601602052604090209193509150613b1a8282614f21565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b479085906004016148ea565b6020604051808303815f875af1158015613b63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b8791906148b1565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c0957613c096146f8565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cfe91908e01908e01614684565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611cab81600161344e565b613d3f6136a8565b613d47614341565b613d4f614351565b611cab81614359565b613d606136a8565b5f80516020614ffc83398151915283613dcc5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613dee5760405162461bcd60e51b81526004016105b090614db8565b85871115613e565760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613ec35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f355760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146140065760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561407d5761403d816001614c94565b614048906008614845565b5081515f9083908390811061405f5761405f614ca7565b60200101906001600160f81b03191690815f1a905350600101614029565b505f5b60048110156140db57614094816003614c94565b61409f906008614845565b505f826140ad8360026149e6565b815181106140bd576140bd614ca7565b60200101906001600160f81b03191690815f1a905350600101614080565b505f5b602081101561413857845181602081106140fa576140fa614ca7565b1a60f81b8261410a8360066149e6565b8151811061411a5761411a614ca7565b60200101906001600160f81b03191690815f1a9053506001016140de565b505f5b6020811015614198578460200151816020811061415a5761415a614ca7565b1a60f81b8261416a8360266149e6565b8151811061417a5761417a614ca7565b60200101906001600160f81b03191690815f1a90535060010161413b565b505f5b600881101561420c576141af816007614c94565b6141ba906008614845565b60ff1685604001516001600160401b0316901c60f81b828260466141de91906149e6565b815181106141ee576141ee614ca7565b60200101906001600160f81b03191690815f1a90535060010161419b565b505f5b6030811015614277578460800151818151811061422e5761422e614ca7565b01602001516001600160f81b0319168261424983604e6149e6565b8151811061425957614259614ca7565b60200101906001600160f81b03191690815f1a90535060010161420f565b505f5b60088110156142e95761428e816007614c94565b614299906008614845565b60608601516001600160401b0390811691161c60f81b826142bb83607e6149e6565b815181106142cb576142cb614ca7565b60200101906001600160f81b03191690815f1a90535060010161427a565b506002816040516142fa9190614fe0565b602060405180830381855afa158015614315573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061433891906148b1565b94909350915050565b6143496136a8565b6136f1614506565b6136f16136a8565b6143616136a8565b80355f8051602061503c83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143ad6080840160608501614e59565b60ff16111561441a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f61442b6080840160608501614e59565b60ff16116144935760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b6144a36080830160608401614e59565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144d46060830160408401614684565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cc76136a8565b50805461451a906149f9565b5f825580601f10614529575050565b601f0160209004905f5260205f2090810190611cab9190614589565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561459d575f815560010161458a565b5090565b8015158114611cab575f80fd5b803563ffffffff811681146145c1575f80fd5b919050565b5f805f606084860312156145d8575f80fd5b8335925060208401356145ea816145a1565b91506145f8604085016145ae565b90509250925092565b5f60208284031215614611575f80fd5b5035919050565b5f6101408284031215614629575f80fd5b50919050565b5f6020828403121561463f575f80fd5b611f0e826145ae565b5f8060408385031215614659575f80fd5b614662836145ae565b946020939093013593505050565b6001600160401b0381168114611cab575f80fd5b5f60208284031215614694575f80fd5b8135611f0e81614670565b5f8082840360608112156146b1575f80fd5b83356001600160401b038111156146c6575f80fd5b8401606081870312156146d7575f80fd5b92506040601f19820112156146ea575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061473057634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161475860408401826001600160a01b03169052565b50606083015161477360608401826001600160401b03169052565b50608083015161478e60808401826001600160401b03169052565b5060a08301516147a960a08401826001600160401b03169052565b5060c08301516147c460c08401826001600160401b03169052565b5060e08301516147df60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147df576147df6147e6565b6001600160401b0381811683821602808216919082811461483d5761483d6147e6565b505092915050565b8082028115828204841417610c4157610c416147e6565b60208082526035908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207570746040820152741a5b59481d1a1c995cda1bdb19081b9bdd081b595d605a1b606082015260800190565b5f602082840312156148c1575f80fd5b5051919050565b5f5b838110156148e25781810151838201526020016148ca565b50505f910152565b602081525f82518060208401526149088160408501602087016148c8565b601f01601f19169190910160400192915050565b5f8261493657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147df576147df6147e6565b80820180821115610c4157610c416147e6565b600181811c90821680614a0d57607f821691505b60208210810361462957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a84816149f9565b806020870152604060018084165f8114614aa55760018114614ac157614aee565b60ff19851660408a0152604084151560051b8a01019550614aee565b895f5260205f205f5b85811015614ae55781548b8201860152908301908801614aca565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b1757614b176147e6565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b5757614b57614b21565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b8557614b85614b21565b604052919050565b6001600160a01b0381168114611cab575f80fd5b80516145c1816145a1565b5f8060408385031215614bbd575f80fd5b82516001600160401b0380821115614bd3575f80fd5b9084019060608287031215614be6575f80fd5b614bee614b35565b82518152602080840151614c0181614b8d565b82820152604084015183811115614c16575f80fd5b80850194505087601f850112614c2a575f80fd5b835183811115614c3c57614c3c614b21565b614c4e601f8201601f19168301614b5d565b93508084528882828701011115614c63575f80fd5b614c72818386018488016148c8565b50826040830152819550614c87818801614ba1565b9450505050509250929050565b81810381811115610c4157610c416147e6565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611cab575f80fd5b5f60208284031215614dad575f80fd5b8135611f0e81614d8e565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e0e81614d8e565b61ffff8116905081548161ffff1982161783556020840135614e2f81614670565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e69575f80fd5b813560ff81168114611f0e575f80fd5b5f60208284031215614e89575f80fd5b8135611f0e81614b8d565b5f808335601e19843603018112614ea9575f80fd5b8301803591506001600160401b03821115614ec2575f80fd5b602001915036819003821315614ed6575f80fd5b9250929050565b601f821115610ca957805f5260205f20601f840160051c81016020851015614f025750805b601f840160051c820191505b818110156110c3575f8155600101614f0e565b81516001600160401b03811115614f3a57614f3a614b21565b614f4e81614f4884546149f9565b84614edd565b602080601f831160018114614f81575f8415614f6a5750858301515b5f19600386901b1c1916600185901b178555614fd8565b5f85815260208120601f198616915b82811015614faf57888601518255948401946001909101908401614f90565b5085821015614fcc57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614ff18184602087016148c8565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161518f38038061518f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150428061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145b9565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145f4565b610982565b34801561018b575f80fd5b506101ca61019a3660046145f4565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d36600461460b565b610b52565b34801561022d575f80fd5b5061024161023c3660046145f4565b610c2f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b366004614622565b610c45565b3480156102ab575f80fd5b5061015f6102ba36600461463b565b610ca8565b3480156102ca575f80fd5b506101ca6102d9366004614677565b610e78565b3480156102e9575f80fd5b506102416102f83660046145f4565b610e91565b348015610308575f80fd5b5061015f6103173660046145b9565b610ea5565b6101ca61032a366004614692565b6110c3565b34801561033a575f80fd5b5061015f61034936600461463b565b6110ef565b348015610359575f80fd5b5061015f610368366004614622565b611339565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145f4565b6114f6565b3480156103dd575f80fd5b5061015f6103ec3660046145f4565b61177c565b6101ca6103ff3660046145f4565b61188b565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145f4565b611897565b6040516101d491906146ff565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f96833981519152949193919290829060ff1660048111156104c2576104c26146eb565b60048111156104d3576104d36146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f83611897565b905042600283516004811115610567576105676146eb565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f80516020614fb68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f80516020614fb68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f61062885611976565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146eb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610862575f61074e86896119f8565b6001600160401b03169050605060ff168460c001518461076e91906147ed565b610778919061480d565b6001600160401b031661078c826064614838565b10610860578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107c48760600151610e78565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561082b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084f919061484f565b5f8b81526009890160205260409020555b505b600283516005811115610877576108776146eb565b03610889576108898460600151611c94565b5f84606001518460a0015161089e91906147ed565b90506108aa8682611ca1565b5f6005600160991b0163ee5b48eb6108c3898686611ce9565b6040518263ffffffff1660e01b81526004016108df9190614888565b6020604051808303815f875af11580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f919061484f565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff1660058111156109d0576109d06146eb565b60058111156109e1576109e16146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6657610a666146eb565b14610acb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af08584608001515f611ce9565b6040518263ffffffff1660e01b8152600401610b0c9190614888565b6020604051808303815f875af1158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c919061484f565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9b575080546001600160401b03808416911610155b15610bb95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be383611f08565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c3f64e8d4a51000836148ba565b92915050565b5f80516020614f968339815191525f610c5d83611f19565b604081810180516001600160a01b039081165f908152600a87016020528251909116815291822091909155516060820151919250610ca391610c9e90610e78565b612290565b505050565b5f80516020614f968339815191525f610cc0846122a3565b90505f80610cd18360400151612484565b50915091505f610ce083611897565b9050816001600160401b031681608001516001600160401b03161015610d185760405162461bcd60e51b81526004016105b0906148d9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d5d5760405162461bcd60e51b81526004016105b09061491b565b60015f87815260068701602052604090205460ff166004811115610d8357610d836146eb565b14610dec5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c3f6001600160401b03831664e8d4a51000614838565b5f610e9b82611897565b60a0015192915050565b5f80516020614f968339815191525f610ebd856126bf565b5f86815260058401602052604090205460c0820151919250610eef91620100009091046001600160401b031690614964565b6001600160401b03168160e001516001600160401b03161015610f705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110bc575f610f8186856119f8565b9050605060ff168260c001518360e00151610f9c91906147ed565b610fa6919061480d565b6001600160401b0316610fba82606461480d565b6001600160401b0316106110ba578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610ffb8460a00151610e78565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015611063573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611087919061484f565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110b4908490614984565b90915550505b505b5050505050565b5f6110cc612a68565b6110d7838334612a9f565b9050610c3f60015f80516020614ff683398151915255565b5f80516020614f968339815191525f611107846122a3565b90505f806111188360400151612484565b50915091505f61112783611897565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611161576111616146eb565b6004811115611172576111726146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112115760405162461bcd60e51b81526004016105b0906148d9565b5f8781526006870160205260409020600301546001600160401b038085169116111561124f5760405162461bcd60e51b81526004016105b09061491b565b600381516004811115611264576112646146eb565b146112b85760405162461bcd60e51b815260206004820152603160248201525f80516020614fb68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff1916600417905560098901825282209190915581015160608201516112f79190610c9e90610e78565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614fd68339815191525f611351836122a3565b90505f806113628360400151612ccd565b91509150806113c45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113de90614997565b9050118015611410575060015f83815260088601602052604090205460ff16600581111561140e5761140e6146eb565b145b61142c5760405162461bcd60e51b81526004016105b0906149c9565b5f828152600785016020526040812061144491614501565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f9683398151915293929190829060ff166004811115611557576115576146eb565b6004811115611568576115686146eb565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115ef576115ef6146eb565b148061160d575060038151600481111561160b5761160b6146eb565b145b6116615760405162461bcd60e51b815260206004820152603260248201525f80516020614fb6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f61166f8260400151611897565b905080608001516001600160401b03165f036116f35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611720846040015184608001518560a00151611ce9565b6040518263ffffffff1660e01b815260040161173c9190614888565b6020604051808303815f875af1158015611758573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc919061484f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fd68339815191529291906117c490614997565b90501180156117f6575060015f83815260088301602052604090205460ff1660058111156117f4576117f46146eb565b145b6118125760405162461bcd60e51b81526004016105b0906149c9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161184b9190600401614a10565b6020604051808303815f875af1158015611867573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca3919061484f565b5f610c3f823334612e6e565b61189f614538565b5f8281525f805160206150168339815191526020526040908190208151610100810190925280545f80516020614fd6833981519152929190829060ff1660058111156118ed576118ed6146eb565b60058111156118fe576118fe6146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150168339815191526020526040812060030180545f80516020614fd6833981519152916001600160401b0390911690836119b983614a9a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a6a9190810190614b4a565b9150915080611acd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b34919061484f565b825114611b985760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c0e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c1d8460400151613269565b91509150818714611c8a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c9e815f613441565b50565b5f9182525f80516020615016833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d6257611d22816001614c32565b611d2d906008614838565b5081515f90839083908110611d4457611d44614c45565b60200101906001600160f81b03191690815f1a905350600101611d0e565b505f5b6004811015611dc557611d79816003614c32565b611d84906008614838565b6001901c60f81b82611d97836002614984565b81518110611da757611da7614c45565b60200101906001600160f81b03191690815f1a905350600101611d65565b505f5b6020811015611e2757611ddc81601f614c32565b611de7906008614838565b86901c60f81b82611df9836006614984565b81518110611e0957611e09614c45565b60200101906001600160f81b03191690815f1a905350600101611dc8565b505f5b6008811015611e9257611e3e816007614c32565b611e49906008614838565b6001600160401b038616901c60f81b82611e64836026614984565b81518110611e7457611e74614c45565b60200101906001600160f81b03191690815f1a905350600101611e2a565b505f5b6008811015611efd57611ea9816007614c32565b611eb4906008614838565b6001600160401b038516901c60f81b82611ecf83602e614984565b81518110611edf57611edf614c45565b60200101906001600160f81b03191690815f1a905350600101611e95565b5090505b9392505050565b611f1061369b565b611c9e816136e6565b611f21614538565b5f80516020614fd68339815191525f611f39846122a3565b90505f80611f4a8360400151612ccd565b915091508015611faf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fe157611fe16146eb565b6005811115611ff257611ff26146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612079576120796146eb565b14806120975750600182516005811115612095576120956146eb565b145b6120f65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b60038251600581111561210b5761210b6146eb565b036121185750600461211c565b5060055b6020808301515f90815260098801909152604081205581816005811115612145576121456146eb565b90816005811115612158576121586146eb565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561218c5761218c6146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115612257576122576146eb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b61228c6001600160a01b03831682613752565b60408051606080820183525f8083526020830181905292820152905f80516020614fd68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612318573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261233f9190810190614b4a565b91509150806123a65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124095760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b03161561247c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124a85760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156124f7576124bf816001614c32565b6124ca906008614838565b61ffff168682815181106124e0576124e0614c45565b016020015160f81c901b91909117906001016124ab565b5061ffff81161561251a5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561257557612531816003614c32565b61253c906008614838565b63ffffffff168761254e836002614984565b8151811061255e5761255e614c45565b016020015160f81c901b919091179060010161251d565b5063ffffffff811660031461259c5760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156125f1576125b381601f614c32565b6125be906008614838565b886125ca836006614984565b815181106125da576125da614c45565b016020015160f81c901b919091179060010161259f565b505f805b600881101561265057612609816007614c32565b612614906008614838565b6001600160401b031689612629836026614984565b8151811061263957612639614c45565b016020015160f81c901b91909117906001016125f5565b505f805b60088110156126af57612668816007614c32565b612673906008614838565b6001600160401b03168a61268883602e614984565b8151811061269857612698614c45565b016020015160f81c901b9190911790600101612654565b5091989097509095509350505050565b6126c7614538565b5f8281525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff166005811115612715576127156146eb565b6005811115612726576127266146eb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127ae576127ae6146eb565b1461280a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b0316146128845760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128918160a00151611c94565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128d5576128d56146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129a18561299b81611976565b5f611ce9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129d0908590600401614888565b6020604051808303815f875af11580156129ec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a10919061484f565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614ff6833981519152805460011901612a9957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f96833981519152906001600160401b0316612aeb6040860160208701614677565b6001600160401b03161015612b5a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b6c6020860186614d3b565b61ffff1610158015612b905750612710612b896020860186614d3b565b61ffff1611155b612bac5760405162461bcd60e51b81526004016105b090614d56565b8054831015612c0f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c765760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c8182610c2f565b90505f612c8e88836137e5565b5f81815260058601602052604090209091508790612cac8282614da1565b509098975050505050505050565b60015f80516020614ff683398151915255565b5f808251602714612cf05760405162461bcd60e51b81526004016105b090614c59565b5f805b6002811015612d3f57612d07816001614c32565b612d12906008614838565b61ffff16858281518110612d2857612d28614c45565b016020015160f81c901b9190911790600101612cf3565b5061ffff811615612d625760405162461bcd60e51b81526004016105b090614ca2565b5f805b6004811015612dbd57612d79816003614c32565b612d84906008614838565b63ffffffff1686612d96836002614984565b81518110612da657612da6614c45565b016020015160f81c901b9190911790600101612d65565b5063ffffffff8116600214612de45760405162461bcd60e51b81526004016105b090614ce5565b5f805b6020811015612e3957612dfb81601f614c32565b612e06906008614838565b87612e12836006614984565b81518110612e2257612e22614c45565b016020015160f81c901b9190911790600101612de7565b505f86602681518110612e4e57612e4e614c45565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e77612a68565b5f80516020614f968339815191525f612e8f84610c2f565b90505f612e9b87611897565b9050600281516005811115612eb257612eb26146eb565b14612f115760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1a82613d1f565b5f828260a00151612f2b9190614964565b60048501546060840151919250612f4d916001600160401b039091169061480d565b6001600160401b0316816001600160401b03161115612fcc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fd68882611ca1565b5f612fe089611976565b90505f898260405160200161300c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6130468d8688611ce9565b6040518263ffffffff1660e01b81526004016130629190614888565b6020604051808303815f875af115801561307e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a2919061484f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561312a5761312a6146eb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f0160015f80516020614ff683398151915255565b5f808251602e1461328c5760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156132db576132a3816001614c32565b6132ae906008614838565b61ffff168582815181106132c4576132c4614c45565b016020015160f81c901b919091179060010161328f565b5061ffff8116156132fe5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561335957613315816003614c32565b613320906008614838565b63ffffffff1686613332836002614984565b8151811061334257613342614c45565b016020015160f81c901b9190911790600101613301565b5063ffffffff81166004146133805760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156133d55761339781601f614c32565b6133a2906008614838565b876133ae836006614984565b815181106133be576133be614c45565b016020015160f81c901b9190911790600101613383565b505f805b6008811015613434576133ed816007614c32565b6133f8906008614838565b6001600160401b03168861340d836026614984565b8151811061341d5761341d614c45565b016020015160f81c901b91909117906001016133d9565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614fd6833981519152914291901580613527575060028301548151613523916001600160401b031690614984565b8210155b1561354d576001600160401b03851660608201528181526040810151602082015261356c565b848160600181815161355f9190614964565b6001600160401b03169052505b606081015161357c90606461480d565b602082015160028501546001600160401b0392909216916135a79190600160401b900460ff16614838565b101561360b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561363457846001600160401b03168160400181815161362c9190614984565b905250613653565b846001600160401b03168160400181815161364f9190614c32565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136e457604051631afcd79f60e31b815260040160405180910390fd5b565b6136ee61369b565b6136f781613d2a565b611c9e608082013560a083013561371460e0850160c08601614677565b613725610100860160e08701614d3b565b61ffff1661373b61012087016101008801614df7565b61374d61014088016101208901614e17565b613d4b565b804710156137755760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137be576040519150601f19603f3d011682016040523d82523d5f602084013e6137c3565b606091505b5050905080610ca357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614fd6833981519152426138056040860160208701614677565b6001600160401b0316116138775760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b6138876040850160208601614677565b6001600160401b031661389d6202a30042614984565b116139105760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139685760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139d85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139e56040850185614e32565b9050603014613a4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a5583613d1f565b5f80613aef6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a9a9190614677565b6001600160401b03168152602001613ab560408a018a614e32565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f8f565b5f82815260078601602052604090209193509150613b0d8282614ebf565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b3a908590600401614888565b6020604051808303815f875af1158015613b56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b7a919061484f565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bfc57613bfc6146eb565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cf191908e01908e01614677565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c9e816001613441565b613d3261369b565b613d3a614334565b613d42614344565b611c9e8161434c565b613d5361369b565b5f80516020614f9683398151915283613dbf5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613de15760405162461bcd60e51b81526004016105b090614d56565b85871115613e495760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eb65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613ff95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561407057614030816001614c32565b61403b906008614838565b5081515f9083908390811061405257614052614c45565b60200101906001600160f81b03191690815f1a90535060010161401c565b505f5b60048110156140ce57614087816003614c32565b614092906008614838565b505f826140a0836002614984565b815181106140b0576140b0614c45565b60200101906001600160f81b03191690815f1a905350600101614073565b505f5b602081101561412b57845181602081106140ed576140ed614c45565b1a60f81b826140fd836006614984565b8151811061410d5761410d614c45565b60200101906001600160f81b03191690815f1a9053506001016140d1565b505f5b602081101561418b578460200151816020811061414d5761414d614c45565b1a60f81b8261415d836026614984565b8151811061416d5761416d614c45565b60200101906001600160f81b03191690815f1a90535060010161412e565b505f5b60088110156141ff576141a2816007614c32565b6141ad906008614838565b60ff1685604001516001600160401b0316901c60f81b828260466141d19190614984565b815181106141e1576141e1614c45565b60200101906001600160f81b03191690815f1a90535060010161418e565b505f5b603081101561426a578460800151818151811061422157614221614c45565b01602001516001600160f81b0319168261423c83604e614984565b8151811061424c5761424c614c45565b60200101906001600160f81b03191690815f1a905350600101614202565b505f5b60088110156142dc57614281816007614c32565b61428c906008614838565b60608601516001600160401b0390811691161c60f81b826142ae83607e614984565b815181106142be576142be614c45565b60200101906001600160f81b03191690815f1a90535060010161426d565b506002816040516142ed9190614f7a565b602060405180830381855afa158015614308573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061432b919061484f565b94909350915050565b61433c61369b565b6136e46144f9565b6136e461369b565b61435461369b565b80355f80516020614fd683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143a06080840160608501614df7565b60ff16111561440d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f61441e6080840160608501614df7565b60ff16116144865760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b6144966080830160608401614df7565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144c76060830160408401614677565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cba61369b565b50805461450d90614997565b5f825580601f1061451c575050565b601f0160209004905f5260205f2090810190611c9e919061457c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614590575f815560010161457d565b5090565b8015158114611c9e575f80fd5b803563ffffffff811681146145b4575f80fd5b919050565b5f805f606084860312156145cb575f80fd5b8335925060208401356145dd81614594565b91506145eb604085016145a1565b90509250925092565b5f60208284031215614604575f80fd5b5035919050565b5f610140828403121561461c575f80fd5b50919050565b5f60208284031215614632575f80fd5b611f01826145a1565b5f806040838503121561464c575f80fd5b614655836145a1565b946020939093013593505050565b6001600160401b0381168114611c9e575f80fd5b5f60208284031215614687575f80fd5b8135611f0181614663565b5f8082840360608112156146a4575f80fd5b83356001600160401b038111156146b9575f80fd5b8401606081870312156146ca575f80fd5b92506040601f19820112156146dd575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061472357634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474b60408401826001600160a01b03169052565b50606083015161476660608401826001600160401b03169052565b50608083015161478160808401826001600160401b03169052565b5060a083015161479c60a08401826001600160401b03169052565b5060c08301516147b760c08401826001600160401b03169052565b5060e08301516147d260e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147d2576147d26147d9565b6001600160401b03818116838216028082169190828114614830576148306147d9565b505092915050565b8082028115828204841417610c3f57610c3f6147d9565b5f6020828403121561485f575f80fd5b5051919050565b5f5b83811015614880578181015183820152602001614868565b50505f910152565b602081525f82518060208401526148a6816040850160208701614866565b601f01601f19169190910160400192915050565b5f826148d457634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147d2576147d26147d9565b80820180821115610c3f57610c3f6147d9565b600181811c908216806149ab57607f821691505b60208210810361461c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a2281614997565b806020870152604060018084165f8114614a435760018114614a5f57614a8c565b60ff19851660408a0152604084151560051b8a01019550614a8c565b895f5260205f205f5b85811015614a835781548b8201860152908301908801614a68565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ab557614ab56147d9565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614af557614af5614abf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b2357614b23614abf565b604052919050565b6001600160a01b0381168114611c9e575f80fd5b80516145b481614594565b5f8060408385031215614b5b575f80fd5b82516001600160401b0380821115614b71575f80fd5b9084019060608287031215614b84575f80fd5b614b8c614ad3565b82518152602080840151614b9f81614b2b565b82820152604084015183811115614bb4575f80fd5b80850194505087601f850112614bc8575f80fd5b835183811115614bda57614bda614abf565b614bec601f8201601f19168301614afb565b93508084528882828701011115614c01575f80fd5b614c1081838601848801614866565b50826040830152819550614c25818801614b3f565b9450505050509250929050565b81810381811115610c3f57610c3f6147d9565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c9e575f80fd5b5f60208284031215614d4b575f80fd5b8135611f0181614d2c565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614dac81614d2c565b61ffff8116905081548161ffff1982161783556020840135614dcd81614663565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e07575f80fd5b813560ff81168114611f01575f80fd5b5f60208284031215614e27575f80fd5b8135611f0181614b2b565b5f808335601e19843603018112614e47575f80fd5b8301803591506001600160401b03821115614e60575f80fd5b602001915036819003821315614e74575f80fd5b9250929050565b601f821115610ca357805f5260205f20601f840160051c81016020851015614ea05750805b601f840160051c820191505b818110156110bc575f8155600101614eac565b81516001600160401b03811115614ed857614ed8614abf565b614eec81614ee68454614997565b84614e7b565b602080601f831160018114614f1f575f8415614f085750858301515b5f19600386901b1c1916600185901b1785556110ba565b5f85815260208120601f198616915b82811015614f4d57888601518255948401946001909101908401614f2e565b5085821015614f6a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614f8b818460208701614866565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index f515ef537..bc89581b7 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -119,7 +119,7 @@ contract ERC20TokenStakingManager is return _getERC20StakingManagerStorage()._token.safeTransferFrom(value); } - function _unlock(uint256 value, address to) internal virtual override { + function _unlock(address to, uint256 value) internal virtual override { _getERC20StakingManagerStorage()._token.safeTransfer(to, value); } diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 9006be448..721c80a9a 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -79,7 +79,7 @@ contract NativeTokenStakingManager is return value; } - function _unlock(uint256 value, address to) internal virtual override { + function _unlock(address to, uint256 value) internal virtual override { payable(to).sendValue(value); } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index be4a4cbcf..e85211cf1 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -151,15 +151,16 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager if (includeUptimeProof) { uint64 uptime = _getUptime(validationID, messageIndex); - require( + if ( uptime * 100 - >= (validator.endedAt - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE, - "PoSValidatorManager: minimum uptime threshold not met" - ); - - $._redeemableValidatorRewards[validator.owner] += $._rewardCalculator.calculateReward( - validator.weight, validator.startedAt, validator.endedAt, 0, 0 - ); + >= (validator.endedAt - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE + ) { + $._redeemableValidatorRewards[validator.owner] += $ + ._rewardCalculator + .calculateReward( + weightToValue(validator.weight), validator.startedAt, validator.endedAt, 0, 0 + ); + } } } @@ -171,7 +172,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _reward(validator.owner, $._redeemableValidatorRewards[validator.owner]); delete $._redeemableValidatorRewards[validator.owner]; - _unlock(validator.startingWeight, validator.owner); + _unlock(validator.owner, weightToValue(validator.startingWeight)); } function _getUptime(bytes32 validationID, uint32 messageIndex) internal view returns (uint64) { @@ -237,7 +238,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager } function _lock(uint256 value) internal virtual returns (uint256); - function _unlock(uint256 value, address to) internal virtual; + function _unlock(address to, uint256 value) internal virtual; function _initializeDelegatorRegistration( bytes32 validationID, @@ -377,15 +378,14 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager if (includeUptimeProof) { uint256 uptime = _getUptime(validationID, messageIndex); - require( + if ( uptime * 100 - >= (currentTime - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE, - "PoSValidatorManager: minimum uptime threshold not met" - ); - - $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward( - delegator.weight, delegator.startedAt, delegator.endedAt, 0, 0 - ); + >= (currentTime - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE + ) { + $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward( + weightToValue(delegator.weight), delegator.startedAt, delegator.endedAt, 0, 0 + ); + } } // Check that removing this delegator would not exceed the maximum churn rate. @@ -481,7 +481,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _reward(delegator.owner, $._redeemableDelegatorRewards[delegationID]); delete $._redeemableDelegatorRewards[delegationID]; - _unlock(delegator.weight, delegator.owner); + _unlock(delegator.owner, weightToValue(delegator.weight)); // TODO can we remove the delegation from _delegatorStakes here? emit DelegationEnded(delegationID, validationID, nonce); diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index bbf60c1db..9759d1ec4 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -23,18 +23,21 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP = DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + DEFAULT_EXPIRY; uint64 public constant DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP = - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_EXPIRY; + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); uint64 public constant DEFAULT_REWARD_RATE = uint64(10); uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint16 public constant DEFAULT_MINIMUM_DELEGATION_FEE_BIPS = 100; uint8 public constant DEFAULT_MAXIMUM_STAKE_MULTIPLIER = 4; + uint256 public constant SECONDS_IN_YEAR = 31536000; PoSValidatorManager public posValidatorManager; event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); + event GeoffEvent(uint256 num); + event DelegatorAdded( bytes32 indexed delegationID, bytes32 indexed validationID, @@ -488,8 +491,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - includeUptime: true + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); @@ -498,9 +500,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndDelegation() public virtual { - uint256 registrationDuration = 1000 * 60 * 60 * 24; // 1 day + uint256 registrationDuration = DEFAULT_MINIMUM_STAKE_DURATION; - uint256 registrationExpiry = vm.getBlockTimestamp() + registrationDuration; + uint256 registrationExpiry = + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + registrationDuration; bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, @@ -537,15 +540,16 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator = DEFAULT_DELEGATOR_ADDRESS; uint256 balanceBefore = _getStakeAssetBalance(delegator); - uint256 expectedReward = DEFAULT_DELEGATOR_WEIGHT * DEFAULT_REWARD_RATE / 365; - _expectStakeUnlock(delegator, DEFAULT_DELEGATOR_WEIGHT); + uint256 expectedReward = _weightToValue(DEFAULT_DELEGATOR_WEIGHT) * DEFAULT_REWARD_RATE + * registrationDuration / 10000 / SECONDS_IN_YEAR; + _expectStakeUnlock(delegator, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); _expectRewardIssuance(delegator, expectedReward); _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2); uint256 balanceChange = _getStakeAssetBalance(delegator) - balanceBefore; require( - balanceChange == DEFAULT_DELEGATOR_WEIGHT + expectedReward, + balanceChange == _weightToValue(DEFAULT_DELEGATOR_WEIGHT) + expectedReward, "delegator should have received their stake back and been rewarded" ); } @@ -695,9 +699,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndValidation() public virtual override { - uint256 registrationDuration = 1000 * 60 * 60 * 24; // 1 day + uint256 registrationDuration = DEFAULT_MINIMUM_STAKE_DURATION; - uint256 registrationExpiry = vm.getBlockTimestamp() + registrationDuration; + uint256 registrationExpiry = DEFAULT_REGISTRATION_TIMESTAMP + registrationDuration; bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, @@ -712,16 +716,17 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 balanceBefore = _getStakeAssetBalance(address(this)); - uint256 expectedReward = DEFAULT_WEIGHT * DEFAULT_REWARD_RATE / 365 - 1; + uint256 expectedReward = _weightToValue(DEFAULT_WEIGHT) * DEFAULT_REWARD_RATE + * registrationDuration / 10000 / SECONDS_IN_YEAR; - _expectStakeUnlock(address(this), DEFAULT_WEIGHT); + _expectStakeUnlock(address(this), _weightToValue(DEFAULT_WEIGHT)); _expectRewardIssuance(address(this), expectedReward); _testCompleteEndValidation(validationID); uint256 balanceChange = _getStakeAssetBalance(address(this)) - balanceBefore; require( - balanceChange == DEFAULT_WEIGHT + expectedReward, + balanceChange == _weightToValue(DEFAULT_WEIGHT) + expectedReward, "validator should have received their stake back and been rewarded" ); } From dabde59863de3a08f7d791326ebf738e7a7a6c8b Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 14:17:03 -0400 Subject: [PATCH 290/545] Fixups --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index dd3700e72..ff08c9695 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516155be3803806155be83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154718061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614958565b61036a565b005b61015f61016f366004614993565b610892565b6101b2610182366004614993565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614993565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149be565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149fc565b610b57565b61015f61025a366004614a15565b610bdb565b6101b261026d366004614a51565b610dab565b6101f2610280366004614993565b610dc4565b61015f610293366004614958565b610dd8565b61015f6102a6366004614a15565b610ff6565b6101b26102b9366004614a6c565b611262565b6101b26102cc366004614a8c565b611275565b61015f6102df3660046149fc565b6112a1565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610320366004614993565b61145e565b61015f610333366004614993565b6116e4565b6101cd601481565b61035361034e366004614993565b6117f3565b6040516101bc9190614b01565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153c5833981519152949193919290829060ff1660048111156103d2576103d2614aed565b60048111156103e3576103e3614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117f3565b90504260028351600481111561047757610477614aed565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153e58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153e58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118d2565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614aed565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e8689611954565b6001600160401b03169050605060ff168460c001518461067e9190614bef565b6106889190614c0f565b6001600160401b031661069c826064614c3a565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dab565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c51565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614aed565b03610799576107998460600151611bf0565b5f84606001518460a001516107ae9190614bef565b90506107ba8682611bfd565b5f6005600160991b0163ee5b48eb6107d3898686611c45565b6040518263ffffffff1660e01b81526004016107ef9190614c8a565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c51565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156108e0576108e0614aed565b60058111156108f1576108f1614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614aed565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c45565b6040518263ffffffff1660e01b8152600401610a1c9190614c8a565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c51565b50505050565b5f610a7264e8d4a5100083614cbc565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e62565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153c58339815191525f610b6f83611e80565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9b916121f3565b604080820180516001600160a01b03165f908152600a850160205291822091909155516060820151610bd69190610bd190610dab565b612269565b505050565b5f805160206153c58339815191525f610bf38461228c565b90505f80610c04836040015161246d565b50915091505f610c13836117f3565b9050816001600160401b031681608001516001600160401b03161015610c4b5760405162461bcd60e51b81526004016104c090614cdb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c905760405162461bcd60e51b81526004016104c090614d1d565b60015f87815260068701602052604090205460ff166004811115610cb657610cb6614aed565b14610d1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c3a565b5f610dce826117f3565b60a0015192915050565b5f805160206153c58339815191525f610df0856126a8565b5f86815260058401602052604090205460c0820151919250610e2291620100009091046001600160401b031690614d66565b6001600160401b03168160e001516001600160401b03161015610ea35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610fef575f610eb48685611954565b9050605060ff168260c001518360e00151610ecf9190614bef565b610ed99190614c0f565b6001600160401b0316610eed826064614c0f565b6001600160401b031610610fed578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f2e8460a00151610dab565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610f96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fba9190614c51565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fe7908490614d86565b90915550505b505b5050505050565b5f805160206153c58339815191525f61100e8461228c565b90505f8061101f836040015161246d565b50915091505f61102e836117f3565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106857611068614aed565b600481111561107957611079614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111185760405162461bcd60e51b81526004016104c090614cdb565b5f8781526006870160205260409020600301546001600160401b03808516911611156111565760405162461bcd60e51b81526004016104c090614d1d565b60038151600481111561116b5761116b614aed565b146111bf5760405162461bcd60e51b815260206004820152603160248201525f805160206153e58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111f591906121f3565b856009015f8881526020019081526020015f205f90556112208160200151610bd18360600151610dab565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f61126e833384612a51565b9392505050565b5f61127e612e4f565b611289848484612e86565b905061126e60015f8051602061542583398151915255565b5f805160206154058339815191525f6112b98361228c565b90505f806112ca83604001516130bf565b915091508061132c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461134690614d99565b9050118015611378575060015f83815260088601602052604090205460ff16600581111561137657611376614aed565b145b6113945760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078501602052604081206113ac916148a0565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153c583398151915293929190829060ff1660048111156114bf576114bf614aed565b60048111156114d0576114d0614aed565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561155757611557614aed565b1480611575575060038151600481111561157357611573614aed565b145b6115c95760405162461bcd60e51b815260206004820152603260248201525f805160206153e5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115d782604001516117f3565b905080608001516001600160401b03165f0361165b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611688846040015184608001518560a00151611c45565b6040518263ffffffff1660e01b81526004016116a49190614c8a565b6020604051808303815f875af11580156116c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190614c51565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061540583398151915292919061172c90614d99565b905011801561175e575060015f83815260088301602052604090205460ff16600581111561175c5761175c614aed565b145b61177a5760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117b39190600401614e18565b6020604051808303815f875af11580156117cf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190614c51565b6117fb6148d7565b5f8281525f805160206154458339815191526020526040908190208151610100810190925280545f80516020615405833981519152929190829060ff16600581111561184957611849614aed565b600581111561185a5761185a614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154458339815191526020526040812060030180545f80516020615405833981519152916001600160401b03909116908361191583614ea2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561199f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119c69190810190614f3e565b9150915080611a295760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a909190614c51565b825114611af45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b6a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b798460400151613260565b91509150818714611be65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bfa815f613438565b50565b5f9182525f80516020615445833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cbe57611c7e816001615026565b611c89906008614c3a565b5081515f90839083908110611ca057611ca0615039565b60200101906001600160f81b03191690815f1a905350600101611c6a565b505f5b6004811015611d2157611cd5816003615026565b611ce0906008614c3a565b6001901c60f81b82611cf3836002614d86565b81518110611d0357611d03615039565b60200101906001600160f81b03191690815f1a905350600101611cc1565b505f5b6020811015611d8357611d3881601f615026565b611d43906008614c3a565b86901c60f81b82611d55836006614d86565b81518110611d6557611d65615039565b60200101906001600160f81b03191690815f1a905350600101611d24565b505f5b6008811015611dee57611d9a816007615026565b611da5906008614c3a565b6001600160401b038616901c60f81b82611dc0836026614d86565b81518110611dd057611dd0615039565b60200101906001600160f81b03191690815f1a905350600101611d86565b505f5b6008811015611e5957611e05816007615026565b611e10906008614c3a565b6001600160401b038516901c60f81b82611e2b83602e614d86565b81518110611e3b57611e3b615039565b60200101906001600160f81b03191690815f1a905350600101611df1565b50949350505050565b611e6a613692565b611e73826136dd565b611e7c81613749565b5050565b611e886148d7565b5f805160206154058339815191525f611ea08461228c565b90505f80611eb183604001516130bf565b915091508015611f165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4857611f48614aed565b6005811115611f5957611f59614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fe057611fe0614aed565b1480611ffe5750600182516005811115611ffc57611ffc614aed565b145b61205d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561207257612072614aed565b0361207f57506004612083565b5060055b6020808301515f908152600988019091526040812055818160058111156120ac576120ac614aed565b908160058111156120bf576120bf614aed565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120f3576120f3614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121be576121be614aed565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153a583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561224e575f80fd5b505af1158015612260573d5f803e3d5ffd5b50505050505050565b5f805160206153a583398151915254611e7c906001600160a01b031683836137ea565b60408051606080820183525f8083526020830181905292820152905f805160206154058339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612301573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123289190810190614f3e565b915091508061238f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b0316156124655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124915760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156124e0576124a8816001615026565b6124b3906008614c3a565b61ffff168682815181106124c9576124c9615039565b016020015160f81c901b9190911790600101612494565b5061ffff8116156125035760405162461bcd60e51b81526004016104c090615096565b5f805b600481101561255e5761251a816003615026565b612525906008614c3a565b63ffffffff1687612537836002614d86565b8151811061254757612547615039565b016020015160f81c901b9190911790600101612506565b5063ffffffff81166003146125855760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156125da5761259c81601f615026565b6125a7906008614c3a565b886125b3836006614d86565b815181106125c3576125c3615039565b016020015160f81c901b9190911790600101612588565b505f805b6008811015612639576125f2816007615026565b6125fd906008614c3a565b6001600160401b031689612612836026614d86565b8151811061262257612622615039565b016020015160f81c901b91909117906001016125de565b505f805b600881101561269857612651816007615026565b61265c906008614c3a565b6001600160401b03168a61267183602e614d86565b8151811061268157612681615039565b016020015160f81c901b919091179060010161263d565b5091989097509095509350505050565b6126b06148d7565b5f8281525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156126fe576126fe614aed565b600581111561270f5761270f614aed565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561279757612797614aed565b146127f35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b03161461286d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61287a8160a00151611bf0565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128be576128be614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61298a85612984816118d2565b5f611c45565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b9908590600401614c8a565b6020604051808303815f875af11580156129d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f99190614c51565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a5a612e4f565b5f805160206153c58339815191525f612a756101ed85613849565b90505f612a81876117f3565b9050600281516005811115612a9857612a98614aed565b14612af75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b008261386c565b5f828260a00151612b119190614d66565b60048501546060840151919250612b33916001600160401b0390911690614c0f565b6001600160401b0316816001600160401b03161115612bb25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bbc8882611bfd565b5f612bc6896118d2565b90505f8982604051602001612bf292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c2c8d8688611c45565b6040518263ffffffff1660e01b8152600401612c489190614c8a565b6020604051808303815f875af1158015612c64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c889190614c51565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d1057612d10614aed565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126e60015f8051602061542583398151915255565b5f80516020615425833981519152805460011901612e8057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153c5833981519152906001600160401b0316612ed26040860160208701614a51565b6001600160401b03161015612f415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f53602086018661512f565b61ffff1610158015612f775750612710612f70602086018661512f565b61ffff1611155b612f935760405162461bcd60e51b81526004016104c09061514a565b8054831015612ff65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b806001015483111561305d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61306784613849565b90505f61307382610a62565b90505f6130808883613877565b5f8181526005860160205260409020909150879061309e8282615195565b509098975050505050505050565b60015f8051602061542583398151915255565b5f8082516027146130e25760405162461bcd60e51b81526004016104c09061504d565b5f805b6002811015613131576130f9816001615026565b613104906008614c3a565b61ffff1685828151811061311a5761311a615039565b016020015160f81c901b91909117906001016130e5565b5061ffff8116156131545760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156131af5761316b816003615026565b613176906008614c3a565b63ffffffff1686613188836002614d86565b8151811061319857613198615039565b016020015160f81c901b9190911790600101613157565b5063ffffffff81166002146131d65760405162461bcd60e51b81526004016104c0906150d9565b5f805b602081101561322b576131ed81601f615026565b6131f8906008614c3a565b87613204836006614d86565b8151811061321457613214615039565b016020015160f81c901b91909117906001016131d9565b505f8660268151811061324057613240615039565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132835760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156132d25761329a816001615026565b6132a5906008614c3a565b61ffff168582815181106132bb576132bb615039565b016020015160f81c901b9190911790600101613286565b5061ffff8116156132f55760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156133505761330c816003615026565b613317906008614c3a565b63ffffffff1686613329836002614d86565b8151811061333957613339615039565b016020015160f81c901b91909117906001016132f8565b5063ffffffff81166004146133775760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156133cc5761338e81601f615026565b613399906008614c3a565b876133a5836006614d86565b815181106133b5576133b5615039565b016020015160f81c901b919091179060010161337a565b505f805b600881101561342b576133e4816007615026565b6133ef906008614c3a565b6001600160401b031688613404836026614d86565b8151811061341457613414615039565b016020015160f81c901b91909117906001016133d0565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061540583398151915291429190158061351e57506002830154815161351a916001600160401b031690614d86565b8210155b15613544576001600160401b038516606082015281815260408101516020820152613563565b84816060018181516135569190614d66565b6001600160401b03169052505b6060810151613573906064614c0f565b602082015160028501546001600160401b03929092169161359e9190600160401b900460ff16614c3a565b10156136025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362b57846001600160401b0316816040018181516136239190614d86565b90525061364a565b846001600160401b0316816040018181516136469190615026565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136db57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e5613692565b6136ee81613db1565b611bfa608082013560a083013561370b60e0850160c08601614a51565b61371c610100860160e0870161512f565b61ffff16613732610120870161010088016151eb565b6137446101408801610120890161520b565b613dd2565b613751613692565b5f805160206153a58339815191526001600160a01b0382166137ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614016565b5f610a72825f805160206153a5833981519152546001600160a01b031690614077565b611bfa816001613438565b5f5f80516020615405833981519152426138976040860160208701614a51565b6001600160401b0316116139095760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139196040850160208601614a51565b6001600160401b031661392f6202a30042614d86565b116139a25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139fa5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a6a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a776040850185615226565b9050603014613ade5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613ae78361386c565b5f80613b816040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b2c9190614a51565b6001600160401b03168152602001613b4760408a018a615226565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d9565b5f82815260078601602052604090209193509150613b9f82826152b3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bcc908590600401614c8a565b6020604051808303815f875af1158015613be8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0c9190614c51565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8e57613c8e614aed565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8391908e01908e01614a51565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db9613692565b613dc161457e565b613dc961458e565b611bfa81614596565b613dda613692565b5f805160206153c583398151915283613e465760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e685760405162461bcd60e51b81526004016104c09061514a565b85871115613ed05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f3d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613faf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61402a6001600160a01b03841683614743565b905080515f1415801561404e57508080602001905181019061404c919061536e565b155b15610bd657604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e19190614c51565b90506140f86001600160a01b038516333086614750565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561413c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141609190614c51565b90508181116141c65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141d08282615026565b95945050505050565b5f60608260800151516030146142435760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142ba5761427a816001615026565b614285906008614c3a565b5081515f9083908390811061429c5761429c615039565b60200101906001600160f81b03191690815f1a905350600101614266565b505f5b6004811015614318576142d1816003615026565b6142dc906008614c3a565b505f826142ea836002614d86565b815181106142fa576142fa615039565b60200101906001600160f81b03191690815f1a9053506001016142bd565b505f5b6020811015614375578451816020811061433757614337615039565b1a60f81b82614347836006614d86565b8151811061435757614357615039565b60200101906001600160f81b03191690815f1a90535060010161431b565b505f5b60208110156143d5578460200151816020811061439757614397615039565b1a60f81b826143a7836026614d86565b815181106143b7576143b7615039565b60200101906001600160f81b03191690815f1a905350600101614378565b505f5b6008811015614449576143ec816007615026565b6143f7906008614c3a565b60ff1685604001516001600160401b0316901c60f81b8282604661441b9190614d86565b8151811061442b5761442b615039565b60200101906001600160f81b03191690815f1a9053506001016143d8565b505f5b60308110156144b4578460800151818151811061446b5761446b615039565b01602001516001600160f81b0319168261448683604e614d86565b8151811061449657614496615039565b60200101906001600160f81b03191690815f1a90535060010161444c565b505f5b6008811015614526576144cb816007615026565b6144d6906008614c3a565b60608601516001600160401b0390811691161c60f81b826144f883607e614d86565b8151811061450857614508615039565b60200101906001600160f81b03191690815f1a9053506001016144b7565b506002816040516145379190615389565b602060405180830381855afa158015614552573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145759190614c51565b94909350915050565b614586613692565b6136db614789565b6136db613692565b61459e613692565b80355f8051602061540583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145ea60808401606085016151eb565b60ff1611156146575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61466860808401606085016151eb565b60ff16116146d05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146e060808301606084016151eb565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147116060830160408401614a51565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126e83835f614791565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd90608401613817565b6130ac613692565b6060814710156147b65760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147d19190615389565b5f6040518083038185875af1925050503d805f811461480b576040519150601f19603f3d011682016040523d82523d5f602084013e614810565b606091505b5091509150611be68683836060826148305761482b82614877565b61126e565b815115801561484757506001600160a01b0384163b155b1561487057604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b508061126e565b8051156148875780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148ac90614d99565b5f825580601f106148bb575050565b601f0160209004905f5260205f2090810190611bfa919061491b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561492f575f815560010161491c565b5090565b8015158114611bfa575f80fd5b803563ffffffff81168114614953575f80fd5b919050565b5f805f6060848603121561496a575f80fd5b83359250602084013561497c81614933565b915061498a60408501614940565b90509250925092565b5f602082840312156149a3575f80fd5b5035919050565b6001600160a01b0381168114611bfa575f80fd5b5f808284036101608112156149d1575f80fd5b610140808212156149e0575f80fd5b84935083013590506149f1816149aa565b809150509250929050565b5f60208284031215614a0c575f80fd5b61126e82614940565b5f8060408385031215614a26575f80fd5b614a2f83614940565b946020939093013593505050565b6001600160401b0381168114611bfa575f80fd5b5f60208284031215614a61575f80fd5b813561126e81614a3d565b5f8060408385031215614a7d575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a9f575f80fd5b84356001600160401b03811115614ab4575f80fd5b850160608188031215614ac5575f80fd5b93506040601f1982011215614ad8575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4d60408401826001600160a01b03169052565b506060830151614b6860608401826001600160401b03169052565b506080830151614b8360808401826001600160401b03169052565b5060a0830151614b9e60a08401826001600160401b03169052565b5060c0830151614bb960c08401826001600160401b03169052565b5060e0830151614bd460e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bd457614bd4614bdb565b6001600160401b03818116838216028082169190828114614c3257614c32614bdb565b505092915050565b8082028115828204841417610a7257610a72614bdb565b5f60208284031215614c61575f80fd5b5051919050565b5f5b83811015614c82578181015183820152602001614c6a565b50505f910152565b602081525f8251806020840152614ca8816040850160208701614c68565b601f01601f19169190910160400192915050565b5f82614cd657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bd457614bd4614bdb565b80820180821115610a7257610a72614bdb565b600181811c90821680614dad57607f821691505b602082108103614dcb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e2a81614d99565b806020870152604060018084165f8114614e4b5760018114614e6757614e94565b60ff19851660408a0152604084151560051b8a01019550614e94565b895f5260205f205f5b85811015614e8b5781548b8201860152908301908801614e70565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ebd57614ebd614bdb565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614efd57614efd614ec7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2b57614f2b614ec7565b604052919050565b805161495381614933565b5f8060408385031215614f4f575f80fd5b82516001600160401b0380821115614f65575f80fd5b9084019060608287031215614f78575f80fd5b614f80614edb565b82518152602080840151614f93816149aa565b82820152604084015183811115614fa8575f80fd5b80850194505087601f850112614fbc575f80fd5b835183811115614fce57614fce614ec7565b614fe0601f8201601f19168301614f03565b93508084528882828701011115614ff5575f80fd5b61500481838601848801614c68565b50826040830152819550615019818801614f33565b9450505050509250929050565b81810381811115610a7257610a72614bdb565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bfa575f80fd5b5f6020828403121561513f575f80fd5b813561126e81615120565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151a081615120565b61ffff8116905081548161ffff19821617835560208401356151c181614a3d565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151fb575f80fd5b813560ff8116811461126e575f80fd5b5f6020828403121561521b575f80fd5b813561126e816149aa565b5f808335601e1984360301811261523b575f80fd5b8301803591506001600160401b03821115615254575f80fd5b602001915036819003821315615268575f80fd5b9250929050565b601f821115610bd657805f5260205f20601f840160051c810160208510156152945750805b601f840160051c820191505b81811015610fef575f81556001016152a0565b81516001600160401b038111156152cc576152cc614ec7565b6152e0816152da8454614d99565b8461526f565b602080601f831160018114615313575f84156152fc5750858301515b5f19600386901b1c1916600185901b178555610fed565b5f85815260208120601f198616915b8281101561534157888601518255948401946001909101908401615322565b508582101561535e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561537e575f80fd5b815161126e81614933565b5f825161539a818460208701614c68565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516155be3803806155be83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154718061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614958565b61036a565b005b61015f61016f366004614993565b610892565b6101b2610182366004614993565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614993565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149be565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149fc565b610b57565b61015f61025a366004614a15565b610bdb565b6101b261026d366004614a51565b610dab565b6101f2610280366004614993565b610dc4565b61015f610293366004614958565b610dd8565b61015f6102a6366004614a15565b610ff6565b6101b26102b9366004614a6c565b611262565b6101b26102cc366004614a8c565b611275565b61015f6102df3660046149fc565b6112a1565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610320366004614993565b61145e565b61015f610333366004614993565b6116e4565b6101cd601481565b61035361034e366004614993565b6117f3565b6040516101bc9190614b01565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153c5833981519152949193919290829060ff1660048111156103d2576103d2614aed565b60048111156103e3576103e3614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117f3565b90504260028351600481111561047757610477614aed565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153e58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153e58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118d2565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614aed565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e8689611954565b6001600160401b03169050605060ff168460c001518461067e9190614bef565b6106889190614c0f565b6001600160401b031661069c826064614c3a565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dab565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c51565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614aed565b03610799576107998460600151611bf0565b5f84606001518460a001516107ae9190614bef565b90506107ba8682611bfd565b5f6005600160991b0163ee5b48eb6107d3898686611c45565b6040518263ffffffff1660e01b81526004016107ef9190614c8a565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c51565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156108e0576108e0614aed565b60058111156108f1576108f1614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614aed565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c45565b6040518263ffffffff1660e01b8152600401610a1c9190614c8a565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c51565b50505050565b5f610a7264e8d4a5100083614cbc565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e62565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153c58339815191525f610b6f83611e80565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9b916121f3565b604080820180516001600160a01b03165f908152600a850160205291822091909155516060820151610bd69190610bd190610dab565b612269565b505050565b5f805160206153c58339815191525f610bf38461228c565b90505f80610c04836040015161246d565b50915091505f610c13836117f3565b9050816001600160401b031681608001516001600160401b03161015610c4b5760405162461bcd60e51b81526004016104c090614cdb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c905760405162461bcd60e51b81526004016104c090614d1d565b60015f87815260068701602052604090205460ff166004811115610cb657610cb6614aed565b14610d1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c3a565b5f610dce826117f3565b60a0015192915050565b5f805160206153c58339815191525f610df0856126a8565b5f86815260058401602052604090205460c0820151919250610e2291620100009091046001600160401b031690614d66565b6001600160401b03168160e001516001600160401b03161015610ea35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610fef575f610eb48685611954565b9050605060ff168260c001518360e00151610ecf9190614bef565b610ed99190614c0f565b6001600160401b0316610eed826064614c0f565b6001600160401b031610610fed578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f2e8460600151610dab565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610f96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fba9190614c51565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fe7908490614d86565b90915550505b505b5050505050565b5f805160206153c58339815191525f61100e8461228c565b90505f8061101f836040015161246d565b50915091505f61102e836117f3565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106857611068614aed565b600481111561107957611079614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111185760405162461bcd60e51b81526004016104c090614cdb565b5f8781526006870160205260409020600301546001600160401b03808516911611156111565760405162461bcd60e51b81526004016104c090614d1d565b60038151600481111561116b5761116b614aed565b146111bf5760405162461bcd60e51b815260206004820152603160248201525f805160206153e58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111f591906121f3565b856009015f8881526020019081526020015f205f90556112208160200151610bd18360600151610dab565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f61126e833384612a51565b9392505050565b5f61127e612e4f565b611289848484612e86565b905061126e60015f8051602061542583398151915255565b5f805160206154058339815191525f6112b98361228c565b90505f806112ca83604001516130bf565b915091508061132c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461134690614d99565b9050118015611378575060015f83815260088601602052604090205460ff16600581111561137657611376614aed565b145b6113945760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078501602052604081206113ac916148a0565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153c583398151915293929190829060ff1660048111156114bf576114bf614aed565b60048111156114d0576114d0614aed565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561155757611557614aed565b1480611575575060038151600481111561157357611573614aed565b145b6115c95760405162461bcd60e51b815260206004820152603260248201525f805160206153e5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115d782604001516117f3565b905080608001516001600160401b03165f0361165b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611688846040015184608001518560a00151611c45565b6040518263ffffffff1660e01b81526004016116a49190614c8a565b6020604051808303815f875af11580156116c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190614c51565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061540583398151915292919061172c90614d99565b905011801561175e575060015f83815260088301602052604090205460ff16600581111561175c5761175c614aed565b145b61177a5760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117b39190600401614e18565b6020604051808303815f875af11580156117cf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190614c51565b6117fb6148d7565b5f8281525f805160206154458339815191526020526040908190208151610100810190925280545f80516020615405833981519152929190829060ff16600581111561184957611849614aed565b600581111561185a5761185a614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154458339815191526020526040812060030180545f80516020615405833981519152916001600160401b03909116908361191583614ea2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561199f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119c69190810190614f3e565b9150915080611a295760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a909190614c51565b825114611af45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b6a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b798460400151613260565b91509150818714611be65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bfa815f613438565b50565b5f9182525f80516020615445833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cbe57611c7e816001615026565b611c89906008614c3a565b5081515f90839083908110611ca057611ca0615039565b60200101906001600160f81b03191690815f1a905350600101611c6a565b505f5b6004811015611d2157611cd5816003615026565b611ce0906008614c3a565b6001901c60f81b82611cf3836002614d86565b81518110611d0357611d03615039565b60200101906001600160f81b03191690815f1a905350600101611cc1565b505f5b6020811015611d8357611d3881601f615026565b611d43906008614c3a565b86901c60f81b82611d55836006614d86565b81518110611d6557611d65615039565b60200101906001600160f81b03191690815f1a905350600101611d24565b505f5b6008811015611dee57611d9a816007615026565b611da5906008614c3a565b6001600160401b038616901c60f81b82611dc0836026614d86565b81518110611dd057611dd0615039565b60200101906001600160f81b03191690815f1a905350600101611d86565b505f5b6008811015611e5957611e05816007615026565b611e10906008614c3a565b6001600160401b038516901c60f81b82611e2b83602e614d86565b81518110611e3b57611e3b615039565b60200101906001600160f81b03191690815f1a905350600101611df1565b50949350505050565b611e6a613692565b611e73826136dd565b611e7c81613749565b5050565b611e886148d7565b5f805160206154058339815191525f611ea08461228c565b90505f80611eb183604001516130bf565b915091508015611f165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4857611f48614aed565b6005811115611f5957611f59614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fe057611fe0614aed565b1480611ffe5750600182516005811115611ffc57611ffc614aed565b145b61205d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561207257612072614aed565b0361207f57506004612083565b5060055b6020808301515f908152600988019091526040812055818160058111156120ac576120ac614aed565b908160058111156120bf576120bf614aed565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120f3576120f3614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121be576121be614aed565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153a583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561224e575f80fd5b505af1158015612260573d5f803e3d5ffd5b50505050505050565b5f805160206153a583398151915254611e7c906001600160a01b031683836137ea565b60408051606080820183525f8083526020830181905292820152905f805160206154058339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612301573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123289190810190614f3e565b915091508061238f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b0316156124655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124915760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156124e0576124a8816001615026565b6124b3906008614c3a565b61ffff168682815181106124c9576124c9615039565b016020015160f81c901b9190911790600101612494565b5061ffff8116156125035760405162461bcd60e51b81526004016104c090615096565b5f805b600481101561255e5761251a816003615026565b612525906008614c3a565b63ffffffff1687612537836002614d86565b8151811061254757612547615039565b016020015160f81c901b9190911790600101612506565b5063ffffffff81166003146125855760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156125da5761259c81601f615026565b6125a7906008614c3a565b886125b3836006614d86565b815181106125c3576125c3615039565b016020015160f81c901b9190911790600101612588565b505f805b6008811015612639576125f2816007615026565b6125fd906008614c3a565b6001600160401b031689612612836026614d86565b8151811061262257612622615039565b016020015160f81c901b91909117906001016125de565b505f805b600881101561269857612651816007615026565b61265c906008614c3a565b6001600160401b03168a61267183602e614d86565b8151811061268157612681615039565b016020015160f81c901b919091179060010161263d565b5091989097509095509350505050565b6126b06148d7565b5f8281525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156126fe576126fe614aed565b600581111561270f5761270f614aed565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561279757612797614aed565b146127f35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b03161461286d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61287a8160a00151611bf0565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128be576128be614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61298a85612984816118d2565b5f611c45565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b9908590600401614c8a565b6020604051808303815f875af11580156129d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f99190614c51565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a5a612e4f565b5f805160206153c58339815191525f612a756101ed85613849565b90505f612a81876117f3565b9050600281516005811115612a9857612a98614aed565b14612af75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b008261386c565b5f828260a00151612b119190614d66565b60048501546060840151919250612b33916001600160401b0390911690614c0f565b6001600160401b0316816001600160401b03161115612bb25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bbc8882611bfd565b5f612bc6896118d2565b90505f8982604051602001612bf292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c2c8d8688611c45565b6040518263ffffffff1660e01b8152600401612c489190614c8a565b6020604051808303815f875af1158015612c64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c889190614c51565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d1057612d10614aed565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126e60015f8051602061542583398151915255565b5f80516020615425833981519152805460011901612e8057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153c5833981519152906001600160401b0316612ed26040860160208701614a51565b6001600160401b03161015612f415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f53602086018661512f565b61ffff1610158015612f775750612710612f70602086018661512f565b61ffff1611155b612f935760405162461bcd60e51b81526004016104c09061514a565b8054831015612ff65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b806001015483111561305d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61306784613849565b90505f61307382610a62565b90505f6130808883613877565b5f8181526005860160205260409020909150879061309e8282615195565b509098975050505050505050565b60015f8051602061542583398151915255565b5f8082516027146130e25760405162461bcd60e51b81526004016104c09061504d565b5f805b6002811015613131576130f9816001615026565b613104906008614c3a565b61ffff1685828151811061311a5761311a615039565b016020015160f81c901b91909117906001016130e5565b5061ffff8116156131545760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156131af5761316b816003615026565b613176906008614c3a565b63ffffffff1686613188836002614d86565b8151811061319857613198615039565b016020015160f81c901b9190911790600101613157565b5063ffffffff81166002146131d65760405162461bcd60e51b81526004016104c0906150d9565b5f805b602081101561322b576131ed81601f615026565b6131f8906008614c3a565b87613204836006614d86565b8151811061321457613214615039565b016020015160f81c901b91909117906001016131d9565b505f8660268151811061324057613240615039565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132835760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156132d25761329a816001615026565b6132a5906008614c3a565b61ffff168582815181106132bb576132bb615039565b016020015160f81c901b9190911790600101613286565b5061ffff8116156132f55760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156133505761330c816003615026565b613317906008614c3a565b63ffffffff1686613329836002614d86565b8151811061333957613339615039565b016020015160f81c901b91909117906001016132f8565b5063ffffffff81166004146133775760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156133cc5761338e81601f615026565b613399906008614c3a565b876133a5836006614d86565b815181106133b5576133b5615039565b016020015160f81c901b919091179060010161337a565b505f805b600881101561342b576133e4816007615026565b6133ef906008614c3a565b6001600160401b031688613404836026614d86565b8151811061341457613414615039565b016020015160f81c901b91909117906001016133d0565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061540583398151915291429190158061351e57506002830154815161351a916001600160401b031690614d86565b8210155b15613544576001600160401b038516606082015281815260408101516020820152613563565b84816060018181516135569190614d66565b6001600160401b03169052505b6060810151613573906064614c0f565b602082015160028501546001600160401b03929092169161359e9190600160401b900460ff16614c3a565b10156136025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362b57846001600160401b0316816040018181516136239190614d86565b90525061364a565b846001600160401b0316816040018181516136469190615026565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136db57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e5613692565b6136ee81613db1565b611bfa608082013560a083013561370b60e0850160c08601614a51565b61371c610100860160e0870161512f565b61ffff16613732610120870161010088016151eb565b6137446101408801610120890161520b565b613dd2565b613751613692565b5f805160206153a58339815191526001600160a01b0382166137ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614016565b5f610a72825f805160206153a5833981519152546001600160a01b031690614077565b611bfa816001613438565b5f5f80516020615405833981519152426138976040860160208701614a51565b6001600160401b0316116139095760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139196040850160208601614a51565b6001600160401b031661392f6202a30042614d86565b116139a25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139fa5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a6a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a776040850185615226565b9050603014613ade5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613ae78361386c565b5f80613b816040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b2c9190614a51565b6001600160401b03168152602001613b4760408a018a615226565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d9565b5f82815260078601602052604090209193509150613b9f82826152b3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bcc908590600401614c8a565b6020604051808303815f875af1158015613be8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0c9190614c51565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8e57613c8e614aed565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8391908e01908e01614a51565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db9613692565b613dc161457e565b613dc961458e565b611bfa81614596565b613dda613692565b5f805160206153c583398151915283613e465760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e685760405162461bcd60e51b81526004016104c09061514a565b85871115613ed05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f3d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613faf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61402a6001600160a01b03841683614743565b905080515f1415801561404e57508080602001905181019061404c919061536e565b155b15610bd657604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e19190614c51565b90506140f86001600160a01b038516333086614750565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561413c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141609190614c51565b90508181116141c65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141d08282615026565b95945050505050565b5f60608260800151516030146142435760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142ba5761427a816001615026565b614285906008614c3a565b5081515f9083908390811061429c5761429c615039565b60200101906001600160f81b03191690815f1a905350600101614266565b505f5b6004811015614318576142d1816003615026565b6142dc906008614c3a565b505f826142ea836002614d86565b815181106142fa576142fa615039565b60200101906001600160f81b03191690815f1a9053506001016142bd565b505f5b6020811015614375578451816020811061433757614337615039565b1a60f81b82614347836006614d86565b8151811061435757614357615039565b60200101906001600160f81b03191690815f1a90535060010161431b565b505f5b60208110156143d5578460200151816020811061439757614397615039565b1a60f81b826143a7836026614d86565b815181106143b7576143b7615039565b60200101906001600160f81b03191690815f1a905350600101614378565b505f5b6008811015614449576143ec816007615026565b6143f7906008614c3a565b60ff1685604001516001600160401b0316901c60f81b8282604661441b9190614d86565b8151811061442b5761442b615039565b60200101906001600160f81b03191690815f1a9053506001016143d8565b505f5b60308110156144b4578460800151818151811061446b5761446b615039565b01602001516001600160f81b0319168261448683604e614d86565b8151811061449657614496615039565b60200101906001600160f81b03191690815f1a90535060010161444c565b505f5b6008811015614526576144cb816007615026565b6144d6906008614c3a565b60608601516001600160401b0390811691161c60f81b826144f883607e614d86565b8151811061450857614508615039565b60200101906001600160f81b03191690815f1a9053506001016144b7565b506002816040516145379190615389565b602060405180830381855afa158015614552573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145759190614c51565b94909350915050565b614586613692565b6136db614789565b6136db613692565b61459e613692565b80355f8051602061540583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145ea60808401606085016151eb565b60ff1611156146575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61466860808401606085016151eb565b60ff16116146d05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146e060808301606084016151eb565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147116060830160408401614a51565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126e83835f614791565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd90608401613817565b6130ac613692565b6060814710156147b65760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147d19190615389565b5f6040518083038185875af1925050503d805f811461480b576040519150601f19603f3d011682016040523d82523d5f602084013e614810565b606091505b5091509150611be68683836060826148305761482b82614877565b61126e565b815115801561484757506001600160a01b0384163b155b1561487057604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b508061126e565b8051156148875780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148ac90614d99565b5f825580601f106148bb575050565b601f0160209004905f5260205f2090810190611bfa919061491b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561492f575f815560010161491c565b5090565b8015158114611bfa575f80fd5b803563ffffffff81168114614953575f80fd5b919050565b5f805f6060848603121561496a575f80fd5b83359250602084013561497c81614933565b915061498a60408501614940565b90509250925092565b5f602082840312156149a3575f80fd5b5035919050565b6001600160a01b0381168114611bfa575f80fd5b5f808284036101608112156149d1575f80fd5b610140808212156149e0575f80fd5b84935083013590506149f1816149aa565b809150509250929050565b5f60208284031215614a0c575f80fd5b61126e82614940565b5f8060408385031215614a26575f80fd5b614a2f83614940565b946020939093013593505050565b6001600160401b0381168114611bfa575f80fd5b5f60208284031215614a61575f80fd5b813561126e81614a3d565b5f8060408385031215614a7d575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a9f575f80fd5b84356001600160401b03811115614ab4575f80fd5b850160608188031215614ac5575f80fd5b93506040601f1982011215614ad8575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4d60408401826001600160a01b03169052565b506060830151614b6860608401826001600160401b03169052565b506080830151614b8360808401826001600160401b03169052565b5060a0830151614b9e60a08401826001600160401b03169052565b5060c0830151614bb960c08401826001600160401b03169052565b5060e0830151614bd460e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bd457614bd4614bdb565b6001600160401b03818116838216028082169190828114614c3257614c32614bdb565b505092915050565b8082028115828204841417610a7257610a72614bdb565b5f60208284031215614c61575f80fd5b5051919050565b5f5b83811015614c82578181015183820152602001614c6a565b50505f910152565b602081525f8251806020840152614ca8816040850160208701614c68565b601f01601f19169190910160400192915050565b5f82614cd657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bd457614bd4614bdb565b80820180821115610a7257610a72614bdb565b600181811c90821680614dad57607f821691505b602082108103614dcb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e2a81614d99565b806020870152604060018084165f8114614e4b5760018114614e6757614e94565b60ff19851660408a0152604084151560051b8a01019550614e94565b895f5260205f205f5b85811015614e8b5781548b8201860152908301908801614e70565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ebd57614ebd614bdb565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614efd57614efd614ec7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2b57614f2b614ec7565b604052919050565b805161495381614933565b5f8060408385031215614f4f575f80fd5b82516001600160401b0380821115614f65575f80fd5b9084019060608287031215614f78575f80fd5b614f80614edb565b82518152602080840151614f93816149aa565b82820152604084015183811115614fa8575f80fd5b80850194505087601f850112614fbc575f80fd5b835183811115614fce57614fce614ec7565b614fe0601f8201601f19168301614f03565b93508084528882828701011115614ff5575f80fd5b61500481838601848801614c68565b50826040830152819550615019818801614f33565b9450505050509250929050565b81810381811115610a7257610a72614bdb565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bfa575f80fd5b5f6020828403121561513f575f80fd5b813561126e81615120565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151a081615120565b61ffff8116905081548161ffff19821617835560208401356151c181614a3d565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151fb575f80fd5b813560ff8116811461126e575f80fd5b5f6020828403121561521b575f80fd5b813561126e816149aa565b5f808335601e1984360301811261523b575f80fd5b8301803591506001600160401b03821115615254575f80fd5b602001915036819003821315615268575f80fd5b9250929050565b601f821115610bd657805f5260205f20601f840160051c810160208510156152945750805b601f840160051c820191505b81811015610fef575f81556001016152a0565b81516001600160401b038111156152cc576152cc614ec7565b6152e0816152da8454614d99565b8461526f565b602080601f831160018114615313575f84156152fc5750858301515b5f19600386901b1c1916600185901b178555610fed565b5f85815260208120601f198616915b8281101561534157888601518255948401946001909101908401615322565b508582101561535e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561537e575f80fd5b815161126e81614933565b5f825161539a818460208701614c68565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index da75dc6ac..154a488c2 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161518f38038061518f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150428061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145b9565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145f4565b610982565b34801561018b575f80fd5b506101ca61019a3660046145f4565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d36600461460b565b610b52565b34801561022d575f80fd5b5061024161023c3660046145f4565b610c2f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b366004614622565b610c45565b3480156102ab575f80fd5b5061015f6102ba36600461463b565b610ca8565b3480156102ca575f80fd5b506101ca6102d9366004614677565b610e78565b3480156102e9575f80fd5b506102416102f83660046145f4565b610e91565b348015610308575f80fd5b5061015f6103173660046145b9565b610ea5565b6101ca61032a366004614692565b6110c3565b34801561033a575f80fd5b5061015f61034936600461463b565b6110ef565b348015610359575f80fd5b5061015f610368366004614622565b611339565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145f4565b6114f6565b3480156103dd575f80fd5b5061015f6103ec3660046145f4565b61177c565b6101ca6103ff3660046145f4565b61188b565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145f4565b611897565b6040516101d491906146ff565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f96833981519152949193919290829060ff1660048111156104c2576104c26146eb565b60048111156104d3576104d36146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f83611897565b905042600283516004811115610567576105676146eb565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f80516020614fb68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f80516020614fb68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f61062885611976565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146eb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610862575f61074e86896119f8565b6001600160401b03169050605060ff168460c001518461076e91906147ed565b610778919061480d565b6001600160401b031661078c826064614838565b10610860578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107c48760600151610e78565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561082b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084f919061484f565b5f8b81526009890160205260409020555b505b600283516005811115610877576108776146eb565b03610889576108898460600151611c94565b5f84606001518460a0015161089e91906147ed565b90506108aa8682611ca1565b5f6005600160991b0163ee5b48eb6108c3898686611ce9565b6040518263ffffffff1660e01b81526004016108df9190614888565b6020604051808303815f875af11580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f919061484f565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff1660058111156109d0576109d06146eb565b60058111156109e1576109e16146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6657610a666146eb565b14610acb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af08584608001515f611ce9565b6040518263ffffffff1660e01b8152600401610b0c9190614888565b6020604051808303815f875af1158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c919061484f565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9b575080546001600160401b03808416911610155b15610bb95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be383611f08565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c3f64e8d4a51000836148ba565b92915050565b5f80516020614f968339815191525f610c5d83611f19565b604081810180516001600160a01b039081165f908152600a87016020528251909116815291822091909155516060820151919250610ca391610c9e90610e78565b612290565b505050565b5f80516020614f968339815191525f610cc0846122a3565b90505f80610cd18360400151612484565b50915091505f610ce083611897565b9050816001600160401b031681608001516001600160401b03161015610d185760405162461bcd60e51b81526004016105b0906148d9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d5d5760405162461bcd60e51b81526004016105b09061491b565b60015f87815260068701602052604090205460ff166004811115610d8357610d836146eb565b14610dec5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c3f6001600160401b03831664e8d4a51000614838565b5f610e9b82611897565b60a0015192915050565b5f80516020614f968339815191525f610ebd856126bf565b5f86815260058401602052604090205460c0820151919250610eef91620100009091046001600160401b031690614964565b6001600160401b03168160e001516001600160401b03161015610f705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110bc575f610f8186856119f8565b9050605060ff168260c001518360e00151610f9c91906147ed565b610fa6919061480d565b6001600160401b0316610fba82606461480d565b6001600160401b0316106110ba578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610ffb8460a00151610e78565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015611063573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611087919061484f565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110b4908490614984565b90915550505b505b5050505050565b5f6110cc612a68565b6110d7838334612a9f565b9050610c3f60015f80516020614ff683398151915255565b5f80516020614f968339815191525f611107846122a3565b90505f806111188360400151612484565b50915091505f61112783611897565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611161576111616146eb565b6004811115611172576111726146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112115760405162461bcd60e51b81526004016105b0906148d9565b5f8781526006870160205260409020600301546001600160401b038085169116111561124f5760405162461bcd60e51b81526004016105b09061491b565b600381516004811115611264576112646146eb565b146112b85760405162461bcd60e51b815260206004820152603160248201525f80516020614fb68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff1916600417905560098901825282209190915581015160608201516112f79190610c9e90610e78565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614fd68339815191525f611351836122a3565b90505f806113628360400151612ccd565b91509150806113c45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113de90614997565b9050118015611410575060015f83815260088601602052604090205460ff16600581111561140e5761140e6146eb565b145b61142c5760405162461bcd60e51b81526004016105b0906149c9565b5f828152600785016020526040812061144491614501565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f9683398151915293929190829060ff166004811115611557576115576146eb565b6004811115611568576115686146eb565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115ef576115ef6146eb565b148061160d575060038151600481111561160b5761160b6146eb565b145b6116615760405162461bcd60e51b815260206004820152603260248201525f80516020614fb6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f61166f8260400151611897565b905080608001516001600160401b03165f036116f35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611720846040015184608001518560a00151611ce9565b6040518263ffffffff1660e01b815260040161173c9190614888565b6020604051808303815f875af1158015611758573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc919061484f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fd68339815191529291906117c490614997565b90501180156117f6575060015f83815260088301602052604090205460ff1660058111156117f4576117f46146eb565b145b6118125760405162461bcd60e51b81526004016105b0906149c9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161184b9190600401614a10565b6020604051808303815f875af1158015611867573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca3919061484f565b5f610c3f823334612e6e565b61189f614538565b5f8281525f805160206150168339815191526020526040908190208151610100810190925280545f80516020614fd6833981519152929190829060ff1660058111156118ed576118ed6146eb565b60058111156118fe576118fe6146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150168339815191526020526040812060030180545f80516020614fd6833981519152916001600160401b0390911690836119b983614a9a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a6a9190810190614b4a565b9150915080611acd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b34919061484f565b825114611b985760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c0e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c1d8460400151613269565b91509150818714611c8a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c9e815f613441565b50565b5f9182525f80516020615016833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d6257611d22816001614c32565b611d2d906008614838565b5081515f90839083908110611d4457611d44614c45565b60200101906001600160f81b03191690815f1a905350600101611d0e565b505f5b6004811015611dc557611d79816003614c32565b611d84906008614838565b6001901c60f81b82611d97836002614984565b81518110611da757611da7614c45565b60200101906001600160f81b03191690815f1a905350600101611d65565b505f5b6020811015611e2757611ddc81601f614c32565b611de7906008614838565b86901c60f81b82611df9836006614984565b81518110611e0957611e09614c45565b60200101906001600160f81b03191690815f1a905350600101611dc8565b505f5b6008811015611e9257611e3e816007614c32565b611e49906008614838565b6001600160401b038616901c60f81b82611e64836026614984565b81518110611e7457611e74614c45565b60200101906001600160f81b03191690815f1a905350600101611e2a565b505f5b6008811015611efd57611ea9816007614c32565b611eb4906008614838565b6001600160401b038516901c60f81b82611ecf83602e614984565b81518110611edf57611edf614c45565b60200101906001600160f81b03191690815f1a905350600101611e95565b5090505b9392505050565b611f1061369b565b611c9e816136e6565b611f21614538565b5f80516020614fd68339815191525f611f39846122a3565b90505f80611f4a8360400151612ccd565b915091508015611faf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fe157611fe16146eb565b6005811115611ff257611ff26146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612079576120796146eb565b14806120975750600182516005811115612095576120956146eb565b145b6120f65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b60038251600581111561210b5761210b6146eb565b036121185750600461211c565b5060055b6020808301515f90815260098801909152604081205581816005811115612145576121456146eb565b90816005811115612158576121586146eb565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561218c5761218c6146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115612257576122576146eb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b61228c6001600160a01b03831682613752565b60408051606080820183525f8083526020830181905292820152905f80516020614fd68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612318573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261233f9190810190614b4a565b91509150806123a65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124095760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b03161561247c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124a85760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156124f7576124bf816001614c32565b6124ca906008614838565b61ffff168682815181106124e0576124e0614c45565b016020015160f81c901b91909117906001016124ab565b5061ffff81161561251a5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561257557612531816003614c32565b61253c906008614838565b63ffffffff168761254e836002614984565b8151811061255e5761255e614c45565b016020015160f81c901b919091179060010161251d565b5063ffffffff811660031461259c5760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156125f1576125b381601f614c32565b6125be906008614838565b886125ca836006614984565b815181106125da576125da614c45565b016020015160f81c901b919091179060010161259f565b505f805b600881101561265057612609816007614c32565b612614906008614838565b6001600160401b031689612629836026614984565b8151811061263957612639614c45565b016020015160f81c901b91909117906001016125f5565b505f805b60088110156126af57612668816007614c32565b612673906008614838565b6001600160401b03168a61268883602e614984565b8151811061269857612698614c45565b016020015160f81c901b9190911790600101612654565b5091989097509095509350505050565b6126c7614538565b5f8281525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff166005811115612715576127156146eb565b6005811115612726576127266146eb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127ae576127ae6146eb565b1461280a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b0316146128845760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128918160a00151611c94565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128d5576128d56146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129a18561299b81611976565b5f611ce9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129d0908590600401614888565b6020604051808303815f875af11580156129ec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a10919061484f565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614ff6833981519152805460011901612a9957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f96833981519152906001600160401b0316612aeb6040860160208701614677565b6001600160401b03161015612b5a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b6c6020860186614d3b565b61ffff1610158015612b905750612710612b896020860186614d3b565b61ffff1611155b612bac5760405162461bcd60e51b81526004016105b090614d56565b8054831015612c0f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c765760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c8182610c2f565b90505f612c8e88836137e5565b5f81815260058601602052604090209091508790612cac8282614da1565b509098975050505050505050565b60015f80516020614ff683398151915255565b5f808251602714612cf05760405162461bcd60e51b81526004016105b090614c59565b5f805b6002811015612d3f57612d07816001614c32565b612d12906008614838565b61ffff16858281518110612d2857612d28614c45565b016020015160f81c901b9190911790600101612cf3565b5061ffff811615612d625760405162461bcd60e51b81526004016105b090614ca2565b5f805b6004811015612dbd57612d79816003614c32565b612d84906008614838565b63ffffffff1686612d96836002614984565b81518110612da657612da6614c45565b016020015160f81c901b9190911790600101612d65565b5063ffffffff8116600214612de45760405162461bcd60e51b81526004016105b090614ce5565b5f805b6020811015612e3957612dfb81601f614c32565b612e06906008614838565b87612e12836006614984565b81518110612e2257612e22614c45565b016020015160f81c901b9190911790600101612de7565b505f86602681518110612e4e57612e4e614c45565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e77612a68565b5f80516020614f968339815191525f612e8f84610c2f565b90505f612e9b87611897565b9050600281516005811115612eb257612eb26146eb565b14612f115760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1a82613d1f565b5f828260a00151612f2b9190614964565b60048501546060840151919250612f4d916001600160401b039091169061480d565b6001600160401b0316816001600160401b03161115612fcc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fd68882611ca1565b5f612fe089611976565b90505f898260405160200161300c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6130468d8688611ce9565b6040518263ffffffff1660e01b81526004016130629190614888565b6020604051808303815f875af115801561307e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a2919061484f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561312a5761312a6146eb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f0160015f80516020614ff683398151915255565b5f808251602e1461328c5760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156132db576132a3816001614c32565b6132ae906008614838565b61ffff168582815181106132c4576132c4614c45565b016020015160f81c901b919091179060010161328f565b5061ffff8116156132fe5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561335957613315816003614c32565b613320906008614838565b63ffffffff1686613332836002614984565b8151811061334257613342614c45565b016020015160f81c901b9190911790600101613301565b5063ffffffff81166004146133805760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156133d55761339781601f614c32565b6133a2906008614838565b876133ae836006614984565b815181106133be576133be614c45565b016020015160f81c901b9190911790600101613383565b505f805b6008811015613434576133ed816007614c32565b6133f8906008614838565b6001600160401b03168861340d836026614984565b8151811061341d5761341d614c45565b016020015160f81c901b91909117906001016133d9565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614fd6833981519152914291901580613527575060028301548151613523916001600160401b031690614984565b8210155b1561354d576001600160401b03851660608201528181526040810151602082015261356c565b848160600181815161355f9190614964565b6001600160401b03169052505b606081015161357c90606461480d565b602082015160028501546001600160401b0392909216916135a79190600160401b900460ff16614838565b101561360b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561363457846001600160401b03168160400181815161362c9190614984565b905250613653565b846001600160401b03168160400181815161364f9190614c32565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136e457604051631afcd79f60e31b815260040160405180910390fd5b565b6136ee61369b565b6136f781613d2a565b611c9e608082013560a083013561371460e0850160c08601614677565b613725610100860160e08701614d3b565b61ffff1661373b61012087016101008801614df7565b61374d61014088016101208901614e17565b613d4b565b804710156137755760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137be576040519150601f19603f3d011682016040523d82523d5f602084013e6137c3565b606091505b5050905080610ca357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614fd6833981519152426138056040860160208701614677565b6001600160401b0316116138775760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b6138876040850160208601614677565b6001600160401b031661389d6202a30042614984565b116139105760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139685760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139d85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139e56040850185614e32565b9050603014613a4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a5583613d1f565b5f80613aef6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a9a9190614677565b6001600160401b03168152602001613ab560408a018a614e32565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f8f565b5f82815260078601602052604090209193509150613b0d8282614ebf565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b3a908590600401614888565b6020604051808303815f875af1158015613b56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b7a919061484f565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bfc57613bfc6146eb565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cf191908e01908e01614677565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c9e816001613441565b613d3261369b565b613d3a614334565b613d42614344565b611c9e8161434c565b613d5361369b565b5f80516020614f9683398151915283613dbf5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613de15760405162461bcd60e51b81526004016105b090614d56565b85871115613e495760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eb65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613ff95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561407057614030816001614c32565b61403b906008614838565b5081515f9083908390811061405257614052614c45565b60200101906001600160f81b03191690815f1a90535060010161401c565b505f5b60048110156140ce57614087816003614c32565b614092906008614838565b505f826140a0836002614984565b815181106140b0576140b0614c45565b60200101906001600160f81b03191690815f1a905350600101614073565b505f5b602081101561412b57845181602081106140ed576140ed614c45565b1a60f81b826140fd836006614984565b8151811061410d5761410d614c45565b60200101906001600160f81b03191690815f1a9053506001016140d1565b505f5b602081101561418b578460200151816020811061414d5761414d614c45565b1a60f81b8261415d836026614984565b8151811061416d5761416d614c45565b60200101906001600160f81b03191690815f1a90535060010161412e565b505f5b60088110156141ff576141a2816007614c32565b6141ad906008614838565b60ff1685604001516001600160401b0316901c60f81b828260466141d19190614984565b815181106141e1576141e1614c45565b60200101906001600160f81b03191690815f1a90535060010161418e565b505f5b603081101561426a578460800151818151811061422157614221614c45565b01602001516001600160f81b0319168261423c83604e614984565b8151811061424c5761424c614c45565b60200101906001600160f81b03191690815f1a905350600101614202565b505f5b60088110156142dc57614281816007614c32565b61428c906008614838565b60608601516001600160401b0390811691161c60f81b826142ae83607e614984565b815181106142be576142be614c45565b60200101906001600160f81b03191690815f1a90535060010161426d565b506002816040516142ed9190614f7a565b602060405180830381855afa158015614308573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061432b919061484f565b94909350915050565b61433c61369b565b6136e46144f9565b6136e461369b565b61435461369b565b80355f80516020614fd683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143a06080840160608501614df7565b60ff16111561440d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f61441e6080840160608501614df7565b60ff16116144865760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b6144966080830160608401614df7565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144c76060830160408401614677565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cba61369b565b50805461450d90614997565b5f825580601f1061451c575050565b601f0160209004905f5260205f2090810190611c9e919061457c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614590575f815560010161457d565b5090565b8015158114611c9e575f80fd5b803563ffffffff811681146145b4575f80fd5b919050565b5f805f606084860312156145cb575f80fd5b8335925060208401356145dd81614594565b91506145eb604085016145a1565b90509250925092565b5f60208284031215614604575f80fd5b5035919050565b5f610140828403121561461c575f80fd5b50919050565b5f60208284031215614632575f80fd5b611f01826145a1565b5f806040838503121561464c575f80fd5b614655836145a1565b946020939093013593505050565b6001600160401b0381168114611c9e575f80fd5b5f60208284031215614687575f80fd5b8135611f0181614663565b5f8082840360608112156146a4575f80fd5b83356001600160401b038111156146b9575f80fd5b8401606081870312156146ca575f80fd5b92506040601f19820112156146dd575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061472357634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474b60408401826001600160a01b03169052565b50606083015161476660608401826001600160401b03169052565b50608083015161478160808401826001600160401b03169052565b5060a083015161479c60a08401826001600160401b03169052565b5060c08301516147b760c08401826001600160401b03169052565b5060e08301516147d260e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147d2576147d26147d9565b6001600160401b03818116838216028082169190828114614830576148306147d9565b505092915050565b8082028115828204841417610c3f57610c3f6147d9565b5f6020828403121561485f575f80fd5b5051919050565b5f5b83811015614880578181015183820152602001614868565b50505f910152565b602081525f82518060208401526148a6816040850160208701614866565b601f01601f19169190910160400192915050565b5f826148d457634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147d2576147d26147d9565b80820180821115610c3f57610c3f6147d9565b600181811c908216806149ab57607f821691505b60208210810361461c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a2281614997565b806020870152604060018084165f8114614a435760018114614a5f57614a8c565b60ff19851660408a0152604084151560051b8a01019550614a8c565b895f5260205f205f5b85811015614a835781548b8201860152908301908801614a68565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ab557614ab56147d9565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614af557614af5614abf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b2357614b23614abf565b604052919050565b6001600160a01b0381168114611c9e575f80fd5b80516145b481614594565b5f8060408385031215614b5b575f80fd5b82516001600160401b0380821115614b71575f80fd5b9084019060608287031215614b84575f80fd5b614b8c614ad3565b82518152602080840151614b9f81614b2b565b82820152604084015183811115614bb4575f80fd5b80850194505087601f850112614bc8575f80fd5b835183811115614bda57614bda614abf565b614bec601f8201601f19168301614afb565b93508084528882828701011115614c01575f80fd5b614c1081838601848801614866565b50826040830152819550614c25818801614b3f565b9450505050509250929050565b81810381811115610c3f57610c3f6147d9565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c9e575f80fd5b5f60208284031215614d4b575f80fd5b8135611f0181614d2c565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614dac81614d2c565b61ffff8116905081548161ffff1982161783556020840135614dcd81614663565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e07575f80fd5b813560ff81168114611f01575f80fd5b5f60208284031215614e27575f80fd5b8135611f0181614b2b565b5f808335601e19843603018112614e47575f80fd5b8301803591506001600160401b03821115614e60575f80fd5b602001915036819003821315614e74575f80fd5b9250929050565b601f821115610ca357805f5260205f20601f840160051c81016020851015614ea05750805b601f840160051c820191505b818110156110bc575f8155600101614eac565b81516001600160401b03811115614ed857614ed8614abf565b614eec81614ee68454614997565b84614e7b565b602080601f831160018114614f1f575f8415614f085750858301515b5f19600386901b1c1916600185901b1785556110ba565b5f85815260208120601f198616915b82811015614f4d57888601518255948401946001909101908401614f2e565b5085821015614f6a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614f8b818460208701614866565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161518f38038061518f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150428061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145b9565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145f4565b610982565b34801561018b575f80fd5b506101ca61019a3660046145f4565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d36600461460b565b610b52565b34801561022d575f80fd5b5061024161023c3660046145f4565b610c2f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b366004614622565b610c45565b3480156102ab575f80fd5b5061015f6102ba36600461463b565b610ca8565b3480156102ca575f80fd5b506101ca6102d9366004614677565b610e78565b3480156102e9575f80fd5b506102416102f83660046145f4565b610e91565b348015610308575f80fd5b5061015f6103173660046145b9565b610ea5565b6101ca61032a366004614692565b6110c3565b34801561033a575f80fd5b5061015f61034936600461463b565b6110ef565b348015610359575f80fd5b5061015f610368366004614622565b611339565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145f4565b6114f6565b3480156103dd575f80fd5b5061015f6103ec3660046145f4565b61177c565b6101ca6103ff3660046145f4565b61188b565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145f4565b611897565b6040516101d491906146ff565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f96833981519152949193919290829060ff1660048111156104c2576104c26146eb565b60048111156104d3576104d36146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f83611897565b905042600283516004811115610567576105676146eb565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f80516020614fb68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f80516020614fb68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f61062885611976565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146eb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610862575f61074e86896119f8565b6001600160401b03169050605060ff168460c001518461076e91906147ed565b610778919061480d565b6001600160401b031661078c826064614838565b10610860578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107c48760600151610e78565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561082b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084f919061484f565b5f8b81526009890160205260409020555b505b600283516005811115610877576108776146eb565b03610889576108898460600151611c94565b5f84606001518460a0015161089e91906147ed565b90506108aa8682611ca1565b5f6005600160991b0163ee5b48eb6108c3898686611ce9565b6040518263ffffffff1660e01b81526004016108df9190614888565b6020604051808303815f875af11580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f919061484f565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff1660058111156109d0576109d06146eb565b60058111156109e1576109e16146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6657610a666146eb565b14610acb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af08584608001515f611ce9565b6040518263ffffffff1660e01b8152600401610b0c9190614888565b6020604051808303815f875af1158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c919061484f565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9b575080546001600160401b03808416911610155b15610bb95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be383611f08565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c3f64e8d4a51000836148ba565b92915050565b5f80516020614f968339815191525f610c5d83611f19565b604081810180516001600160a01b039081165f908152600a87016020528251909116815291822091909155516060820151919250610ca391610c9e90610e78565b612290565b505050565b5f80516020614f968339815191525f610cc0846122a3565b90505f80610cd18360400151612484565b50915091505f610ce083611897565b9050816001600160401b031681608001516001600160401b03161015610d185760405162461bcd60e51b81526004016105b0906148d9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d5d5760405162461bcd60e51b81526004016105b09061491b565b60015f87815260068701602052604090205460ff166004811115610d8357610d836146eb565b14610dec5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c3f6001600160401b03831664e8d4a51000614838565b5f610e9b82611897565b60a0015192915050565b5f80516020614f968339815191525f610ebd856126bf565b5f86815260058401602052604090205460c0820151919250610eef91620100009091046001600160401b031690614964565b6001600160401b03168160e001516001600160401b03161015610f705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110bc575f610f8186856119f8565b9050605060ff168260c001518360e00151610f9c91906147ed565b610fa6919061480d565b6001600160401b0316610fba82606461480d565b6001600160401b0316106110ba578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610ffb8460600151610e78565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015611063573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611087919061484f565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110b4908490614984565b90915550505b505b5050505050565b5f6110cc612a68565b6110d7838334612a9f565b9050610c3f60015f80516020614ff683398151915255565b5f80516020614f968339815191525f611107846122a3565b90505f806111188360400151612484565b50915091505f61112783611897565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611161576111616146eb565b6004811115611172576111726146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112115760405162461bcd60e51b81526004016105b0906148d9565b5f8781526006870160205260409020600301546001600160401b038085169116111561124f5760405162461bcd60e51b81526004016105b09061491b565b600381516004811115611264576112646146eb565b146112b85760405162461bcd60e51b815260206004820152603160248201525f80516020614fb68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff1916600417905560098901825282209190915581015160608201516112f79190610c9e90610e78565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614fd68339815191525f611351836122a3565b90505f806113628360400151612ccd565b91509150806113c45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113de90614997565b9050118015611410575060015f83815260088601602052604090205460ff16600581111561140e5761140e6146eb565b145b61142c5760405162461bcd60e51b81526004016105b0906149c9565b5f828152600785016020526040812061144491614501565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f9683398151915293929190829060ff166004811115611557576115576146eb565b6004811115611568576115686146eb565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115ef576115ef6146eb565b148061160d575060038151600481111561160b5761160b6146eb565b145b6116615760405162461bcd60e51b815260206004820152603260248201525f80516020614fb6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f61166f8260400151611897565b905080608001516001600160401b03165f036116f35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611720846040015184608001518560a00151611ce9565b6040518263ffffffff1660e01b815260040161173c9190614888565b6020604051808303815f875af1158015611758573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc919061484f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fd68339815191529291906117c490614997565b90501180156117f6575060015f83815260088301602052604090205460ff1660058111156117f4576117f46146eb565b145b6118125760405162461bcd60e51b81526004016105b0906149c9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161184b9190600401614a10565b6020604051808303815f875af1158015611867573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca3919061484f565b5f610c3f823334612e6e565b61189f614538565b5f8281525f805160206150168339815191526020526040908190208151610100810190925280545f80516020614fd6833981519152929190829060ff1660058111156118ed576118ed6146eb565b60058111156118fe576118fe6146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150168339815191526020526040812060030180545f80516020614fd6833981519152916001600160401b0390911690836119b983614a9a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a6a9190810190614b4a565b9150915080611acd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b34919061484f565b825114611b985760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c0e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c1d8460400151613269565b91509150818714611c8a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c9e815f613441565b50565b5f9182525f80516020615016833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d6257611d22816001614c32565b611d2d906008614838565b5081515f90839083908110611d4457611d44614c45565b60200101906001600160f81b03191690815f1a905350600101611d0e565b505f5b6004811015611dc557611d79816003614c32565b611d84906008614838565b6001901c60f81b82611d97836002614984565b81518110611da757611da7614c45565b60200101906001600160f81b03191690815f1a905350600101611d65565b505f5b6020811015611e2757611ddc81601f614c32565b611de7906008614838565b86901c60f81b82611df9836006614984565b81518110611e0957611e09614c45565b60200101906001600160f81b03191690815f1a905350600101611dc8565b505f5b6008811015611e9257611e3e816007614c32565b611e49906008614838565b6001600160401b038616901c60f81b82611e64836026614984565b81518110611e7457611e74614c45565b60200101906001600160f81b03191690815f1a905350600101611e2a565b505f5b6008811015611efd57611ea9816007614c32565b611eb4906008614838565b6001600160401b038516901c60f81b82611ecf83602e614984565b81518110611edf57611edf614c45565b60200101906001600160f81b03191690815f1a905350600101611e95565b5090505b9392505050565b611f1061369b565b611c9e816136e6565b611f21614538565b5f80516020614fd68339815191525f611f39846122a3565b90505f80611f4a8360400151612ccd565b915091508015611faf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fe157611fe16146eb565b6005811115611ff257611ff26146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612079576120796146eb565b14806120975750600182516005811115612095576120956146eb565b145b6120f65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b60038251600581111561210b5761210b6146eb565b036121185750600461211c565b5060055b6020808301515f90815260098801909152604081205581816005811115612145576121456146eb565b90816005811115612158576121586146eb565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561218c5761218c6146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115612257576122576146eb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b61228c6001600160a01b03831682613752565b60408051606080820183525f8083526020830181905292820152905f80516020614fd68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612318573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261233f9190810190614b4a565b91509150806123a65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124095760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b03161561247c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124a85760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156124f7576124bf816001614c32565b6124ca906008614838565b61ffff168682815181106124e0576124e0614c45565b016020015160f81c901b91909117906001016124ab565b5061ffff81161561251a5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561257557612531816003614c32565b61253c906008614838565b63ffffffff168761254e836002614984565b8151811061255e5761255e614c45565b016020015160f81c901b919091179060010161251d565b5063ffffffff811660031461259c5760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156125f1576125b381601f614c32565b6125be906008614838565b886125ca836006614984565b815181106125da576125da614c45565b016020015160f81c901b919091179060010161259f565b505f805b600881101561265057612609816007614c32565b612614906008614838565b6001600160401b031689612629836026614984565b8151811061263957612639614c45565b016020015160f81c901b91909117906001016125f5565b505f805b60088110156126af57612668816007614c32565b612673906008614838565b6001600160401b03168a61268883602e614984565b8151811061269857612698614c45565b016020015160f81c901b9190911790600101612654565b5091989097509095509350505050565b6126c7614538565b5f8281525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff166005811115612715576127156146eb565b6005811115612726576127266146eb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127ae576127ae6146eb565b1461280a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b0316146128845760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128918160a00151611c94565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128d5576128d56146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129a18561299b81611976565b5f611ce9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129d0908590600401614888565b6020604051808303815f875af11580156129ec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a10919061484f565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614ff6833981519152805460011901612a9957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f96833981519152906001600160401b0316612aeb6040860160208701614677565b6001600160401b03161015612b5a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b6c6020860186614d3b565b61ffff1610158015612b905750612710612b896020860186614d3b565b61ffff1611155b612bac5760405162461bcd60e51b81526004016105b090614d56565b8054831015612c0f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c765760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c8182610c2f565b90505f612c8e88836137e5565b5f81815260058601602052604090209091508790612cac8282614da1565b509098975050505050505050565b60015f80516020614ff683398151915255565b5f808251602714612cf05760405162461bcd60e51b81526004016105b090614c59565b5f805b6002811015612d3f57612d07816001614c32565b612d12906008614838565b61ffff16858281518110612d2857612d28614c45565b016020015160f81c901b9190911790600101612cf3565b5061ffff811615612d625760405162461bcd60e51b81526004016105b090614ca2565b5f805b6004811015612dbd57612d79816003614c32565b612d84906008614838565b63ffffffff1686612d96836002614984565b81518110612da657612da6614c45565b016020015160f81c901b9190911790600101612d65565b5063ffffffff8116600214612de45760405162461bcd60e51b81526004016105b090614ce5565b5f805b6020811015612e3957612dfb81601f614c32565b612e06906008614838565b87612e12836006614984565b81518110612e2257612e22614c45565b016020015160f81c901b9190911790600101612de7565b505f86602681518110612e4e57612e4e614c45565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e77612a68565b5f80516020614f968339815191525f612e8f84610c2f565b90505f612e9b87611897565b9050600281516005811115612eb257612eb26146eb565b14612f115760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1a82613d1f565b5f828260a00151612f2b9190614964565b60048501546060840151919250612f4d916001600160401b039091169061480d565b6001600160401b0316816001600160401b03161115612fcc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fd68882611ca1565b5f612fe089611976565b90505f898260405160200161300c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6130468d8688611ce9565b6040518263ffffffff1660e01b81526004016130629190614888565b6020604051808303815f875af115801561307e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a2919061484f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561312a5761312a6146eb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f0160015f80516020614ff683398151915255565b5f808251602e1461328c5760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156132db576132a3816001614c32565b6132ae906008614838565b61ffff168582815181106132c4576132c4614c45565b016020015160f81c901b919091179060010161328f565b5061ffff8116156132fe5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561335957613315816003614c32565b613320906008614838565b63ffffffff1686613332836002614984565b8151811061334257613342614c45565b016020015160f81c901b9190911790600101613301565b5063ffffffff81166004146133805760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156133d55761339781601f614c32565b6133a2906008614838565b876133ae836006614984565b815181106133be576133be614c45565b016020015160f81c901b9190911790600101613383565b505f805b6008811015613434576133ed816007614c32565b6133f8906008614838565b6001600160401b03168861340d836026614984565b8151811061341d5761341d614c45565b016020015160f81c901b91909117906001016133d9565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614fd6833981519152914291901580613527575060028301548151613523916001600160401b031690614984565b8210155b1561354d576001600160401b03851660608201528181526040810151602082015261356c565b848160600181815161355f9190614964565b6001600160401b03169052505b606081015161357c90606461480d565b602082015160028501546001600160401b0392909216916135a79190600160401b900460ff16614838565b101561360b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561363457846001600160401b03168160400181815161362c9190614984565b905250613653565b846001600160401b03168160400181815161364f9190614c32565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136e457604051631afcd79f60e31b815260040160405180910390fd5b565b6136ee61369b565b6136f781613d2a565b611c9e608082013560a083013561371460e0850160c08601614677565b613725610100860160e08701614d3b565b61ffff1661373b61012087016101008801614df7565b61374d61014088016101208901614e17565b613d4b565b804710156137755760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137be576040519150601f19603f3d011682016040523d82523d5f602084013e6137c3565b606091505b5050905080610ca357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614fd6833981519152426138056040860160208701614677565b6001600160401b0316116138775760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b6138876040850160208601614677565b6001600160401b031661389d6202a30042614984565b116139105760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139685760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139d85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139e56040850185614e32565b9050603014613a4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a5583613d1f565b5f80613aef6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a9a9190614677565b6001600160401b03168152602001613ab560408a018a614e32565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f8f565b5f82815260078601602052604090209193509150613b0d8282614ebf565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b3a908590600401614888565b6020604051808303815f875af1158015613b56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b7a919061484f565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bfc57613bfc6146eb565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cf191908e01908e01614677565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c9e816001613441565b613d3261369b565b613d3a614334565b613d42614344565b611c9e8161434c565b613d5361369b565b5f80516020614f9683398151915283613dbf5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613de15760405162461bcd60e51b81526004016105b090614d56565b85871115613e495760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eb65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613ff95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561407057614030816001614c32565b61403b906008614838565b5081515f9083908390811061405257614052614c45565b60200101906001600160f81b03191690815f1a90535060010161401c565b505f5b60048110156140ce57614087816003614c32565b614092906008614838565b505f826140a0836002614984565b815181106140b0576140b0614c45565b60200101906001600160f81b03191690815f1a905350600101614073565b505f5b602081101561412b57845181602081106140ed576140ed614c45565b1a60f81b826140fd836006614984565b8151811061410d5761410d614c45565b60200101906001600160f81b03191690815f1a9053506001016140d1565b505f5b602081101561418b578460200151816020811061414d5761414d614c45565b1a60f81b8261415d836026614984565b8151811061416d5761416d614c45565b60200101906001600160f81b03191690815f1a90535060010161412e565b505f5b60088110156141ff576141a2816007614c32565b6141ad906008614838565b60ff1685604001516001600160401b0316901c60f81b828260466141d19190614984565b815181106141e1576141e1614c45565b60200101906001600160f81b03191690815f1a90535060010161418e565b505f5b603081101561426a578460800151818151811061422157614221614c45565b01602001516001600160f81b0319168261423c83604e614984565b8151811061424c5761424c614c45565b60200101906001600160f81b03191690815f1a905350600101614202565b505f5b60088110156142dc57614281816007614c32565b61428c906008614838565b60608601516001600160401b0390811691161c60f81b826142ae83607e614984565b815181106142be576142be614c45565b60200101906001600160f81b03191690815f1a90535060010161426d565b506002816040516142ed9190614f7a565b602060405180830381855afa158015614308573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061432b919061484f565b94909350915050565b61433c61369b565b6136e46144f9565b6136e461369b565b61435461369b565b80355f80516020614fd683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143a06080840160608501614df7565b60ff16111561440d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f61441e6080840160608501614df7565b60ff16116144865760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b6144966080830160608401614df7565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144c76060830160408401614677565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cba61369b565b50805461450d90614997565b5f825580601f1061451c575050565b601f0160209004905f5260205f2090810190611c9e919061457c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614590575f815560010161457d565b5090565b8015158114611c9e575f80fd5b803563ffffffff811681146145b4575f80fd5b919050565b5f805f606084860312156145cb575f80fd5b8335925060208401356145dd81614594565b91506145eb604085016145a1565b90509250925092565b5f60208284031215614604575f80fd5b5035919050565b5f610140828403121561461c575f80fd5b50919050565b5f60208284031215614632575f80fd5b611f01826145a1565b5f806040838503121561464c575f80fd5b614655836145a1565b946020939093013593505050565b6001600160401b0381168114611c9e575f80fd5b5f60208284031215614687575f80fd5b8135611f0181614663565b5f8082840360608112156146a4575f80fd5b83356001600160401b038111156146b9575f80fd5b8401606081870312156146ca575f80fd5b92506040601f19820112156146dd575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061472357634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474b60408401826001600160a01b03169052565b50606083015161476660608401826001600160401b03169052565b50608083015161478160808401826001600160401b03169052565b5060a083015161479c60a08401826001600160401b03169052565b5060c08301516147b760c08401826001600160401b03169052565b5060e08301516147d260e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147d2576147d26147d9565b6001600160401b03818116838216028082169190828114614830576148306147d9565b505092915050565b8082028115828204841417610c3f57610c3f6147d9565b5f6020828403121561485f575f80fd5b5051919050565b5f5b83811015614880578181015183820152602001614868565b50505f910152565b602081525f82518060208401526148a6816040850160208701614866565b601f01601f19169190910160400192915050565b5f826148d457634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147d2576147d26147d9565b80820180821115610c3f57610c3f6147d9565b600181811c908216806149ab57607f821691505b60208210810361461c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a2281614997565b806020870152604060018084165f8114614a435760018114614a5f57614a8c565b60ff19851660408a0152604084151560051b8a01019550614a8c565b895f5260205f205f5b85811015614a835781548b8201860152908301908801614a68565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ab557614ab56147d9565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614af557614af5614abf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b2357614b23614abf565b604052919050565b6001600160a01b0381168114611c9e575f80fd5b80516145b481614594565b5f8060408385031215614b5b575f80fd5b82516001600160401b0380821115614b71575f80fd5b9084019060608287031215614b84575f80fd5b614b8c614ad3565b82518152602080840151614b9f81614b2b565b82820152604084015183811115614bb4575f80fd5b80850194505087601f850112614bc8575f80fd5b835183811115614bda57614bda614abf565b614bec601f8201601f19168301614afb565b93508084528882828701011115614c01575f80fd5b614c1081838601848801614866565b50826040830152819550614c25818801614b3f565b9450505050509250929050565b81810381811115610c3f57610c3f6147d9565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c9e575f80fd5b5f60208284031215614d4b575f80fd5b8135611f0181614d2c565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614dac81614d2c565b61ffff8116905081548161ffff1982161783556020840135614dcd81614663565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e07575f80fd5b813560ff81168114611f01575f80fd5b5f60208284031215614e27575f80fd5b8135611f0181614b2b565b5f808335601e19843603018112614e47575f80fd5b8301803591506001600160401b03821115614e60575f80fd5b602001915036819003821315614e74575f80fd5b9250929050565b601f821115610ca357805f5260205f20601f840160051c81016020851015614ea05750805b601f840160051c820191505b818110156110bc575f8155600101614eac565b81516001600160401b03811115614ed857614ed8614abf565b614eec81614ee68454614997565b84614e7b565b602080601f831160018114614f1f575f8415614f085750858301515b5f19600386901b1c1916600185901b1785556110ba565b5f85815260208120601f198616915b82811015614f4d57888601518255948401946001909101908401614f2e565b5085821015614f6a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614f8b818460208701614866565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index e85211cf1..6690bd5c8 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -158,7 +158,11 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager $._redeemableValidatorRewards[validator.owner] += $ ._rewardCalculator .calculateReward( - weightToValue(validator.weight), validator.startedAt, validator.endedAt, 0, 0 + weightToValue(validator.startingWeight), + validator.startedAt, + validator.endedAt, + 0, + 0 ); } } From d480b4c7db69bfe91bbafb518872bb0b5d7bcfba Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 14:48:48 -0400 Subject: [PATCH 291/545] Fixups --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index ff08c9695..62f3f3cdf 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516155be3803806155be83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154718061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614958565b61036a565b005b61015f61016f366004614993565b610892565b6101b2610182366004614993565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614993565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149be565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149fc565b610b57565b61015f61025a366004614a15565b610bdb565b6101b261026d366004614a51565b610dab565b6101f2610280366004614993565b610dc4565b61015f610293366004614958565b610dd8565b61015f6102a6366004614a15565b610ff6565b6101b26102b9366004614a6c565b611262565b6101b26102cc366004614a8c565b611275565b61015f6102df3660046149fc565b6112a1565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610320366004614993565b61145e565b61015f610333366004614993565b6116e4565b6101cd601481565b61035361034e366004614993565b6117f3565b6040516101bc9190614b01565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153c5833981519152949193919290829060ff1660048111156103d2576103d2614aed565b60048111156103e3576103e3614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117f3565b90504260028351600481111561047757610477614aed565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153e58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153e58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118d2565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614aed565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e8689611954565b6001600160401b03169050605060ff168460c001518461067e9190614bef565b6106889190614c0f565b6001600160401b031661069c826064614c3a565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dab565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c51565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614aed565b03610799576107998460600151611bf0565b5f84606001518460a001516107ae9190614bef565b90506107ba8682611bfd565b5f6005600160991b0163ee5b48eb6107d3898686611c45565b6040518263ffffffff1660e01b81526004016107ef9190614c8a565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c51565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156108e0576108e0614aed565b60058111156108f1576108f1614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614aed565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c45565b6040518263ffffffff1660e01b8152600401610a1c9190614c8a565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c51565b50505050565b5f610a7264e8d4a5100083614cbc565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e62565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153c58339815191525f610b6f83611e80565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9b916121f3565b604080820180516001600160a01b03165f908152600a850160205291822091909155516060820151610bd69190610bd190610dab565b612269565b505050565b5f805160206153c58339815191525f610bf38461228c565b90505f80610c04836040015161246d565b50915091505f610c13836117f3565b9050816001600160401b031681608001516001600160401b03161015610c4b5760405162461bcd60e51b81526004016104c090614cdb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c905760405162461bcd60e51b81526004016104c090614d1d565b60015f87815260068701602052604090205460ff166004811115610cb657610cb6614aed565b14610d1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c3a565b5f610dce826117f3565b60a0015192915050565b5f805160206153c58339815191525f610df0856126a8565b5f86815260058401602052604090205460c0820151919250610e2291620100009091046001600160401b031690614d66565b6001600160401b03168160e001516001600160401b03161015610ea35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610fef575f610eb48685611954565b9050605060ff168260c001518360e00151610ecf9190614bef565b610ed99190614c0f565b6001600160401b0316610eed826064614c0f565b6001600160401b031610610fed578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f2e8460600151610dab565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610f96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fba9190614c51565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fe7908490614d86565b90915550505b505b5050505050565b5f805160206153c58339815191525f61100e8461228c565b90505f8061101f836040015161246d565b50915091505f61102e836117f3565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106857611068614aed565b600481111561107957611079614aed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111185760405162461bcd60e51b81526004016104c090614cdb565b5f8781526006870160205260409020600301546001600160401b03808516911611156111565760405162461bcd60e51b81526004016104c090614d1d565b60038151600481111561116b5761116b614aed565b146111bf5760405162461bcd60e51b815260206004820152603160248201525f805160206153e58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111f591906121f3565b856009015f8881526020019081526020015f205f90556112208160200151610bd18360600151610dab565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f61126e833384612a51565b9392505050565b5f61127e612e4f565b611289848484612e86565b905061126e60015f8051602061542583398151915255565b5f805160206154058339815191525f6112b98361228c565b90505f806112ca83604001516130bf565b915091508061132c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461134690614d99565b9050118015611378575060015f83815260088601602052604090205460ff16600581111561137657611376614aed565b145b6113945760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078501602052604081206113ac916148a0565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153c583398151915293929190829060ff1660048111156114bf576114bf614aed565b60048111156114d0576114d0614aed565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561155757611557614aed565b1480611575575060038151600481111561157357611573614aed565b145b6115c95760405162461bcd60e51b815260206004820152603260248201525f805160206153e5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115d782604001516117f3565b905080608001516001600160401b03165f0361165b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611688846040015184608001518560a00151611c45565b6040518263ffffffff1660e01b81526004016116a49190614c8a565b6020604051808303815f875af11580156116c0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190614c51565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061540583398151915292919061172c90614d99565b905011801561175e575060015f83815260088301602052604090205460ff16600581111561175c5761175c614aed565b145b61177a5760405162461bcd60e51b81526004016104c090614dd1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117b39190600401614e18565b6020604051808303815f875af11580156117cf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190614c51565b6117fb6148d7565b5f8281525f805160206154458339815191526020526040908190208151610100810190925280545f80516020615405833981519152929190829060ff16600581111561184957611849614aed565b600581111561185a5761185a614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154458339815191526020526040812060030180545f80516020615405833981519152916001600160401b03909116908361191583614ea2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561199f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119c69190810190614f3e565b9150915080611a295760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a909190614c51565b825114611af45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b6a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b798460400151613260565b91509150818714611be65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bfa815f613438565b50565b5f9182525f80516020615445833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cbe57611c7e816001615026565b611c89906008614c3a565b5081515f90839083908110611ca057611ca0615039565b60200101906001600160f81b03191690815f1a905350600101611c6a565b505f5b6004811015611d2157611cd5816003615026565b611ce0906008614c3a565b6001901c60f81b82611cf3836002614d86565b81518110611d0357611d03615039565b60200101906001600160f81b03191690815f1a905350600101611cc1565b505f5b6020811015611d8357611d3881601f615026565b611d43906008614c3a565b86901c60f81b82611d55836006614d86565b81518110611d6557611d65615039565b60200101906001600160f81b03191690815f1a905350600101611d24565b505f5b6008811015611dee57611d9a816007615026565b611da5906008614c3a565b6001600160401b038616901c60f81b82611dc0836026614d86565b81518110611dd057611dd0615039565b60200101906001600160f81b03191690815f1a905350600101611d86565b505f5b6008811015611e5957611e05816007615026565b611e10906008614c3a565b6001600160401b038516901c60f81b82611e2b83602e614d86565b81518110611e3b57611e3b615039565b60200101906001600160f81b03191690815f1a905350600101611df1565b50949350505050565b611e6a613692565b611e73826136dd565b611e7c81613749565b5050565b611e886148d7565b5f805160206154058339815191525f611ea08461228c565b90505f80611eb183604001516130bf565b915091508015611f165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4857611f48614aed565b6005811115611f5957611f59614aed565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fe057611fe0614aed565b1480611ffe5750600182516005811115611ffc57611ffc614aed565b145b61205d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561207257612072614aed565b0361207f57506004612083565b5060055b6020808301515f908152600988019091526040812055818160058111156120ac576120ac614aed565b908160058111156120bf576120bf614aed565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120f3576120f3614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121be576121be614aed565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153a583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561224e575f80fd5b505af1158015612260573d5f803e3d5ffd5b50505050505050565b5f805160206153a583398151915254611e7c906001600160a01b031683836137ea565b60408051606080820183525f8083526020830181905292820152905f805160206154058339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612301573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123289190810190614f3e565b915091508061238f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b0316156124655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124915760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156124e0576124a8816001615026565b6124b3906008614c3a565b61ffff168682815181106124c9576124c9615039565b016020015160f81c901b9190911790600101612494565b5061ffff8116156125035760405162461bcd60e51b81526004016104c090615096565b5f805b600481101561255e5761251a816003615026565b612525906008614c3a565b63ffffffff1687612537836002614d86565b8151811061254757612547615039565b016020015160f81c901b9190911790600101612506565b5063ffffffff81166003146125855760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156125da5761259c81601f615026565b6125a7906008614c3a565b886125b3836006614d86565b815181106125c3576125c3615039565b016020015160f81c901b9190911790600101612588565b505f805b6008811015612639576125f2816007615026565b6125fd906008614c3a565b6001600160401b031689612612836026614d86565b8151811061262257612622615039565b016020015160f81c901b91909117906001016125de565b505f805b600881101561269857612651816007615026565b61265c906008614c3a565b6001600160401b03168a61267183602e614d86565b8151811061268157612681615039565b016020015160f81c901b919091179060010161263d565b5091989097509095509350505050565b6126b06148d7565b5f8281525f8051602061544583398151915260205260408082208151610100810190925280545f8051602061540583398151915293929190829060ff1660058111156126fe576126fe614aed565b600581111561270f5761270f614aed565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561279757612797614aed565b146127f35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b03161461286d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61287a8160a00151611bf0565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128be576128be614aed565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61298a85612984816118d2565b5f611c45565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b9908590600401614c8a565b6020604051808303815f875af11580156129d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f99190614c51565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a5a612e4f565b5f805160206153c58339815191525f612a756101ed85613849565b90505f612a81876117f3565b9050600281516005811115612a9857612a98614aed565b14612af75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b008261386c565b5f828260a00151612b119190614d66565b60048501546060840151919250612b33916001600160401b0390911690614c0f565b6001600160401b0316816001600160401b03161115612bb25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bbc8882611bfd565b5f612bc6896118d2565b90505f8982604051602001612bf292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c2c8d8688611c45565b6040518263ffffffff1660e01b8152600401612c489190614c8a565b6020604051808303815f875af1158015612c64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c889190614c51565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d1057612d10614aed565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126e60015f8051602061542583398151915255565b5f80516020615425833981519152805460011901612e8057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153c5833981519152906001600160401b0316612ed26040860160208701614a51565b6001600160401b03161015612f415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f53602086018661512f565b61ffff1610158015612f775750612710612f70602086018661512f565b61ffff1611155b612f935760405162461bcd60e51b81526004016104c09061514a565b8054831015612ff65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b806001015483111561305d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61306784613849565b90505f61307382610a62565b90505f6130808883613877565b5f8181526005860160205260409020909150879061309e8282615195565b509098975050505050505050565b60015f8051602061542583398151915255565b5f8082516027146130e25760405162461bcd60e51b81526004016104c09061504d565b5f805b6002811015613131576130f9816001615026565b613104906008614c3a565b61ffff1685828151811061311a5761311a615039565b016020015160f81c901b91909117906001016130e5565b5061ffff8116156131545760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156131af5761316b816003615026565b613176906008614c3a565b63ffffffff1686613188836002614d86565b8151811061319857613198615039565b016020015160f81c901b9190911790600101613157565b5063ffffffff81166002146131d65760405162461bcd60e51b81526004016104c0906150d9565b5f805b602081101561322b576131ed81601f615026565b6131f8906008614c3a565b87613204836006614d86565b8151811061321457613214615039565b016020015160f81c901b91909117906001016131d9565b505f8660268151811061324057613240615039565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132835760405162461bcd60e51b81526004016104c09061504d565b5f805b60028110156132d25761329a816001615026565b6132a5906008614c3a565b61ffff168582815181106132bb576132bb615039565b016020015160f81c901b9190911790600101613286565b5061ffff8116156132f55760405162461bcd60e51b81526004016104c090615096565b5f805b60048110156133505761330c816003615026565b613317906008614c3a565b63ffffffff1686613329836002614d86565b8151811061333957613339615039565b016020015160f81c901b91909117906001016132f8565b5063ffffffff81166004146133775760405162461bcd60e51b81526004016104c0906150d9565b5f805b60208110156133cc5761338e81601f615026565b613399906008614c3a565b876133a5836006614d86565b815181106133b5576133b5615039565b016020015160f81c901b919091179060010161337a565b505f805b600881101561342b576133e4816007615026565b6133ef906008614c3a565b6001600160401b031688613404836026614d86565b8151811061341457613414615039565b016020015160f81c901b91909117906001016133d0565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061540583398151915291429190158061351e57506002830154815161351a916001600160401b031690614d86565b8210155b15613544576001600160401b038516606082015281815260408101516020820152613563565b84816060018181516135569190614d66565b6001600160401b03169052505b6060810151613573906064614c0f565b602082015160028501546001600160401b03929092169161359e9190600160401b900460ff16614c3a565b10156136025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362b57846001600160401b0316816040018181516136239190614d86565b90525061364a565b846001600160401b0316816040018181516136469190615026565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136db57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e5613692565b6136ee81613db1565b611bfa608082013560a083013561370b60e0850160c08601614a51565b61371c610100860160e0870161512f565b61ffff16613732610120870161010088016151eb565b6137446101408801610120890161520b565b613dd2565b613751613692565b5f805160206153a58339815191526001600160a01b0382166137ca5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614016565b5f610a72825f805160206153a5833981519152546001600160a01b031690614077565b611bfa816001613438565b5f5f80516020615405833981519152426138976040860160208701614a51565b6001600160401b0316116139095760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139196040850160208601614a51565b6001600160401b031661392f6202a30042614d86565b116139a25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139fa5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a6a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a776040850185615226565b9050603014613ade5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613ae78361386c565b5f80613b816040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b2c9190614a51565b6001600160401b03168152602001613b4760408a018a615226565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d9565b5f82815260078601602052604090209193509150613b9f82826152b3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bcc908590600401614c8a565b6020604051808303815f875af1158015613be8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0c9190614c51565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8e57613c8e614aed565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8391908e01908e01614a51565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db9613692565b613dc161457e565b613dc961458e565b611bfa81614596565b613dda613692565b5f805160206153c583398151915283613e465760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e685760405162461bcd60e51b81526004016104c09061514a565b85871115613ed05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f3d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613faf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61402a6001600160a01b03841683614743565b905080515f1415801561404e57508080602001905181019061404c919061536e565b155b15610bd657604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e19190614c51565b90506140f86001600160a01b038516333086614750565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561413c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141609190614c51565b90508181116141c65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141d08282615026565b95945050505050565b5f60608260800151516030146142435760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142ba5761427a816001615026565b614285906008614c3a565b5081515f9083908390811061429c5761429c615039565b60200101906001600160f81b03191690815f1a905350600101614266565b505f5b6004811015614318576142d1816003615026565b6142dc906008614c3a565b505f826142ea836002614d86565b815181106142fa576142fa615039565b60200101906001600160f81b03191690815f1a9053506001016142bd565b505f5b6020811015614375578451816020811061433757614337615039565b1a60f81b82614347836006614d86565b8151811061435757614357615039565b60200101906001600160f81b03191690815f1a90535060010161431b565b505f5b60208110156143d5578460200151816020811061439757614397615039565b1a60f81b826143a7836026614d86565b815181106143b7576143b7615039565b60200101906001600160f81b03191690815f1a905350600101614378565b505f5b6008811015614449576143ec816007615026565b6143f7906008614c3a565b60ff1685604001516001600160401b0316901c60f81b8282604661441b9190614d86565b8151811061442b5761442b615039565b60200101906001600160f81b03191690815f1a9053506001016143d8565b505f5b60308110156144b4578460800151818151811061446b5761446b615039565b01602001516001600160f81b0319168261448683604e614d86565b8151811061449657614496615039565b60200101906001600160f81b03191690815f1a90535060010161444c565b505f5b6008811015614526576144cb816007615026565b6144d6906008614c3a565b60608601516001600160401b0390811691161c60f81b826144f883607e614d86565b8151811061450857614508615039565b60200101906001600160f81b03191690815f1a9053506001016144b7565b506002816040516145379190615389565b602060405180830381855afa158015614552573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145759190614c51565b94909350915050565b614586613692565b6136db614789565b6136db613692565b61459e613692565b80355f8051602061540583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145ea60808401606085016151eb565b60ff1611156146575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61466860808401606085016151eb565b60ff16116146d05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146e060808301606084016151eb565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147116060830160408401614a51565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126e83835f614791565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd90608401613817565b6130ac613692565b6060814710156147b65760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147d19190615389565b5f6040518083038185875af1925050503d805f811461480b576040519150601f19603f3d011682016040523d82523d5f602084013e614810565b606091505b5091509150611be68683836060826148305761482b82614877565b61126e565b815115801561484757506001600160a01b0384163b155b1561487057604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b508061126e565b8051156148875780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148ac90614d99565b5f825580601f106148bb575050565b601f0160209004905f5260205f2090810190611bfa919061491b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561492f575f815560010161491c565b5090565b8015158114611bfa575f80fd5b803563ffffffff81168114614953575f80fd5b919050565b5f805f6060848603121561496a575f80fd5b83359250602084013561497c81614933565b915061498a60408501614940565b90509250925092565b5f602082840312156149a3575f80fd5b5035919050565b6001600160a01b0381168114611bfa575f80fd5b5f808284036101608112156149d1575f80fd5b610140808212156149e0575f80fd5b84935083013590506149f1816149aa565b809150509250929050565b5f60208284031215614a0c575f80fd5b61126e82614940565b5f8060408385031215614a26575f80fd5b614a2f83614940565b946020939093013593505050565b6001600160401b0381168114611bfa575f80fd5b5f60208284031215614a61575f80fd5b813561126e81614a3d565b5f8060408385031215614a7d575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a9f575f80fd5b84356001600160401b03811115614ab4575f80fd5b850160608188031215614ac5575f80fd5b93506040601f1982011215614ad8575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4d60408401826001600160a01b03169052565b506060830151614b6860608401826001600160401b03169052565b506080830151614b8360808401826001600160401b03169052565b5060a0830151614b9e60a08401826001600160401b03169052565b5060c0830151614bb960c08401826001600160401b03169052565b5060e0830151614bd460e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bd457614bd4614bdb565b6001600160401b03818116838216028082169190828114614c3257614c32614bdb565b505092915050565b8082028115828204841417610a7257610a72614bdb565b5f60208284031215614c61575f80fd5b5051919050565b5f5b83811015614c82578181015183820152602001614c6a565b50505f910152565b602081525f8251806020840152614ca8816040850160208701614c68565b601f01601f19169190910160400192915050565b5f82614cd657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bd457614bd4614bdb565b80820180821115610a7257610a72614bdb565b600181811c90821680614dad57607f821691505b602082108103614dcb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e2a81614d99565b806020870152604060018084165f8114614e4b5760018114614e6757614e94565b60ff19851660408a0152604084151560051b8a01019550614e94565b895f5260205f205f5b85811015614e8b5781548b8201860152908301908801614e70565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ebd57614ebd614bdb565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614efd57614efd614ec7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2b57614f2b614ec7565b604052919050565b805161495381614933565b5f8060408385031215614f4f575f80fd5b82516001600160401b0380821115614f65575f80fd5b9084019060608287031215614f78575f80fd5b614f80614edb565b82518152602080840151614f93816149aa565b82820152604084015183811115614fa8575f80fd5b80850194505087601f850112614fbc575f80fd5b835183811115614fce57614fce614ec7565b614fe0601f8201601f19168301614f03565b93508084528882828701011115614ff5575f80fd5b61500481838601848801614c68565b50826040830152819550615019818801614f33565b9450505050509250929050565b81810381811115610a7257610a72614bdb565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bfa575f80fd5b5f6020828403121561513f575f80fd5b813561126e81615120565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151a081615120565b61ffff8116905081548161ffff19821617835560208401356151c181614a3d565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151fb575f80fd5b813560ff8116811461126e575f80fd5b5f6020828403121561521b575f80fd5b813561126e816149aa565b5f808335601e1984360301811261523b575f80fd5b8301803591506001600160401b03821115615254575f80fd5b602001915036819003821315615268575f80fd5b9250929050565b601f821115610bd657805f5260205f20601f840160051c810160208510156152945750805b601f840160051c820191505b81811015610fef575f81556001016152a0565b81516001600160401b038111156152cc576152cc614ec7565b6152e0816152da8454614d99565b8461526f565b602080601f831160018114615313575f84156152fc5750858301515b5f19600386901b1c1916600185901b178555610fed565b5f85815260208120601f198616915b8281101561534157888601518255948401946001909101908401615322565b508582101561535e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561537e575f80fd5b815161126e81614933565b5f825161539a818460208701614c68565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516155b63803806155b683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154698061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614950565b61036a565b005b61015f61016f36600461498b565b610892565b6101b261018236600461498b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed36600461498b565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149b6565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149f4565b610b57565b61015f61025a366004614a0d565b610bdb565b6101b261026d366004614a49565b610dab565b6101f261028036600461498b565b610dc4565b61015f610293366004614950565b610dd8565b61015f6102a6366004614a0d565b610ff6565b6101b26102b9366004614a64565b61125a565b6101b26102cc366004614a84565b61126d565b61015f6102df3660046149f4565b611299565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f61032036600461498b565b611456565b61015f61033336600461498b565b6116dc565b6101cd601481565b61035361034e36600461498b565b6117eb565b6040516101bc9190614af9565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153bd833981519152949193919290829060ff1660048111156103d2576103d2614ae5565b60048111156103e3576103e3614ae5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117eb565b90504260028351600481111561047757610477614ae5565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153dd8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153dd8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118ca565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614ae5565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e868961194c565b6001600160401b03169050605060ff168460c001518461067e9190614be7565b6106889190614c07565b6001600160401b031661069c826064614c32565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dab565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c49565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614ae5565b03610799576107998460600151611be8565b5f84606001518460a001516107ae9190614be7565b90506107ba8682611bf5565b5f6005600160991b0163ee5b48eb6107d3898686611c3d565b6040518263ffffffff1660e01b81526004016107ef9190614c82565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c49565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061543d83398151915260205260408082208151610100810190925280545f805160206153fd83398151915293929190829060ff1660058111156108e0576108e0614ae5565b60058111156108f1576108f1614ae5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614ae5565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c3d565b6040518263ffffffff1660e01b8152600401610a1c9190614c82565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c49565b50505050565b5f610a7264e8d4a5100083614cb4565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e5a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153bd8339815191525f610b6f83611e78565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9b916121eb565b604080820180516001600160a01b03165f908152600a850160205291822091909155516060820151610bd69190610bd190610dab565b612261565b505050565b5f805160206153bd8339815191525f610bf384612284565b90505f80610c048360400151612465565b50915091505f610c13836117eb565b9050816001600160401b031681608001516001600160401b03161015610c4b5760405162461bcd60e51b81526004016104c090614cd3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c905760405162461bcd60e51b81526004016104c090614d15565b60015f87815260068701602052604090205460ff166004811115610cb657610cb6614ae5565b14610d1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c32565b5f610dce826117eb565b60a0015192915050565b5f805160206153bd8339815191525f610df0856126a0565b5f86815260058401602052604090205460c0820151919250610e2291620100009091046001600160401b031690614d5e565b6001600160401b03168160e001516001600160401b03161015610ea35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610fef575f610eb4868561194c565b9050605060ff168260c001518360e00151610ecf9190614be7565b610ed99190614c07565b6001600160401b0316610eed826064614c07565b6001600160401b031610610fed578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f2e8460600151610dab565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610f96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fba9190614c49565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fe7908490614d7e565b90915550505b505b5050505050565b5f805160206153bd8339815191525f61100e84612284565b90505f8061101f8360400151612465565b50915091505f61102e836117eb565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106857611068614ae5565b600481111561107957611079614ae5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111185760405162461bcd60e51b81526004016104c090614cd3565b826001600160401b03168160e001516001600160401b0316111561114e5760405162461bcd60e51b81526004016104c090614d15565b60038151600481111561116357611163614ae5565b146111b75760405162461bcd60e51b815260206004820152603160248201525f805160206153dd8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111ed91906121eb565b856009015f8881526020019081526020015f205f90556112188160200151610bd18360600151610dab565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f611266833384612a49565b9392505050565b5f611276612e47565b611281848484612e7e565b905061126660015f8051602061541d83398151915255565b5f805160206153fd8339815191525f6112b183612284565b90505f806112c283604001516130b7565b91509150806113245760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461133e90614d91565b9050118015611370575060015f83815260088601602052604090205460ff16600581111561136e5761136e614ae5565b145b61138c5760405162461bcd60e51b81526004016104c090614dc9565b5f82815260078501602052604081206113a491614898565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153bd83398151915293929190829060ff1660048111156114b7576114b7614ae5565b60048111156114c8576114c8614ae5565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561154f5761154f614ae5565b148061156d575060038151600481111561156b5761156b614ae5565b145b6115c15760405162461bcd60e51b815260206004820152603260248201525f805160206153dd833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115cf82604001516117eb565b905080608001516001600160401b03165f036116535760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611680846040015184608001518560a00151611c3d565b6040518263ffffffff1660e01b815260040161169c9190614c82565b6020604051808303815f875af11580156116b8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190614c49565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206153fd83398151915292919061172490614d91565b9050118015611756575060015f83815260088301602052604090205460ff16600581111561175457611754614ae5565b145b6117725760405162461bcd60e51b81526004016104c090614dc9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117ab9190600401614e10565b6020604051808303815f875af11580156117c7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190614c49565b6117f36148cf565b5f8281525f8051602061543d8339815191526020526040908190208151610100810190925280545f805160206153fd833981519152929190829060ff16600581111561184157611841614ae5565b600581111561185257611852614ae5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f8051602061543d8339815191526020526040812060030180545f805160206153fd833981519152916001600160401b03909116908361190d83614e9a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611997573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119be9190810190614f36565b9150915080611a215760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a889190614c49565b825114611aec5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b625760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b718460400151613258565b91509150818714611bde5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bf2815f613430565b50565b5f9182525f8051602061543d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cb657611c7681600161501e565b611c81906008614c32565b5081515f90839083908110611c9857611c98615031565b60200101906001600160f81b03191690815f1a905350600101611c62565b505f5b6004811015611d1957611ccd81600361501e565b611cd8906008614c32565b6001901c60f81b82611ceb836002614d7e565b81518110611cfb57611cfb615031565b60200101906001600160f81b03191690815f1a905350600101611cb9565b505f5b6020811015611d7b57611d3081601f61501e565b611d3b906008614c32565b86901c60f81b82611d4d836006614d7e565b81518110611d5d57611d5d615031565b60200101906001600160f81b03191690815f1a905350600101611d1c565b505f5b6008811015611de657611d9281600761501e565b611d9d906008614c32565b6001600160401b038616901c60f81b82611db8836026614d7e565b81518110611dc857611dc8615031565b60200101906001600160f81b03191690815f1a905350600101611d7e565b505f5b6008811015611e5157611dfd81600761501e565b611e08906008614c32565b6001600160401b038516901c60f81b82611e2383602e614d7e565b81518110611e3357611e33615031565b60200101906001600160f81b03191690815f1a905350600101611de9565b50949350505050565b611e6261368a565b611e6b826136d5565b611e7481613741565b5050565b611e806148cf565b5f805160206153fd8339815191525f611e9884612284565b90505f80611ea983604001516130b7565b915091508015611f0e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4057611f40614ae5565b6005811115611f5157611f51614ae5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fd857611fd8614ae5565b1480611ff65750600182516005811115611ff457611ff4614ae5565b145b6120555760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561206a5761206a614ae5565b036120775750600461207b565b5060055b6020808301515f908152600988019091526040812055818160058111156120a4576120a4614ae5565b908160058111156120b7576120b7614ae5565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120eb576120eb614ae5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121b6576121b6614ae5565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061539d83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612246575f80fd5b505af1158015612258573d5f803e3d5ffd5b50505050505050565b5f8051602061539d83398151915254611e74906001600160a01b031683836137e2565b60408051606080820183525f8083526020830181905292820152905f805160206153fd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156122f9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123209190810190614f36565b91509150806123875760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123ea5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b03161561245d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124895760405162461bcd60e51b81526004016104c090615045565b5f805b60028110156124d8576124a081600161501e565b6124ab906008614c32565b61ffff168682815181106124c1576124c1615031565b016020015160f81c901b919091179060010161248c565b5061ffff8116156124fb5760405162461bcd60e51b81526004016104c09061508e565b5f805b60048110156125565761251281600361501e565b61251d906008614c32565b63ffffffff168761252f836002614d7e565b8151811061253f5761253f615031565b016020015160f81c901b91909117906001016124fe565b5063ffffffff811660031461257d5760405162461bcd60e51b81526004016104c0906150d1565b5f805b60208110156125d25761259481601f61501e565b61259f906008614c32565b886125ab836006614d7e565b815181106125bb576125bb615031565b016020015160f81c901b9190911790600101612580565b505f805b6008811015612631576125ea81600761501e565b6125f5906008614c32565b6001600160401b03168961260a836026614d7e565b8151811061261a5761261a615031565b016020015160f81c901b91909117906001016125d6565b505f805b60088110156126905761264981600761501e565b612654906008614c32565b6001600160401b03168a61266983602e614d7e565b8151811061267957612679615031565b016020015160f81c901b9190911790600101612635565b5091989097509095509350505050565b6126a86148cf565b5f8281525f8051602061543d83398151915260205260408082208151610100810190925280545f805160206153fd83398151915293929190829060ff1660058111156126f6576126f6614ae5565b600581111561270757612707614ae5565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561278f5761278f614ae5565b146127eb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b0316146128655760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b6128728160a00151611be8565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128b6576128b6614ae5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129828561297c816118ca565b5f611c3d565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b1908590600401614c82565b6020604051808303815f875af11580156129cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f19190614c49565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a52612e47565b5f805160206153bd8339815191525f612a6d6101ed85613841565b90505f612a79876117eb565b9050600281516005811115612a9057612a90614ae5565b14612aef5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612af882613864565b5f828260a00151612b099190614d5e565b60048501546060840151919250612b2b916001600160401b0390911690614c07565b6001600160401b0316816001600160401b03161115612baa5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bb48882611bf5565b5f612bbe896118ca565b90505f8982604051602001612bea92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c248d8688611c3d565b6040518263ffffffff1660e01b8152600401612c409190614c82565b6020604051808303815f875af1158015612c5c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c809190614c49565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d0857612d08614ae5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126660015f8051602061541d83398151915255565b5f8051602061541d833981519152805460011901612e7857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153bd833981519152906001600160401b0316612eca6040860160208701614a49565b6001600160401b03161015612f395760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f4b6020860186615127565b61ffff1610158015612f6f5750612710612f686020860186615127565b61ffff1611155b612f8b5760405162461bcd60e51b81526004016104c090615142565b8054831015612fee5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b80600101548311156130555760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61305f84613841565b90505f61306b82610a62565b90505f613078888361386f565b5f81815260058601602052604090209091508790613096828261518d565b509098975050505050505050565b60015f8051602061541d83398151915255565b5f8082516027146130da5760405162461bcd60e51b81526004016104c090615045565b5f805b6002811015613129576130f181600161501e565b6130fc906008614c32565b61ffff1685828151811061311257613112615031565b016020015160f81c901b91909117906001016130dd565b5061ffff81161561314c5760405162461bcd60e51b81526004016104c09061508e565b5f805b60048110156131a75761316381600361501e565b61316e906008614c32565b63ffffffff1686613180836002614d7e565b8151811061319057613190615031565b016020015160f81c901b919091179060010161314f565b5063ffffffff81166002146131ce5760405162461bcd60e51b81526004016104c0906150d1565b5f805b6020811015613223576131e581601f61501e565b6131f0906008614c32565b876131fc836006614d7e565b8151811061320c5761320c615031565b016020015160f81c901b91909117906001016131d1565b505f8660268151811061323857613238615031565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461327b5760405162461bcd60e51b81526004016104c090615045565b5f805b60028110156132ca5761329281600161501e565b61329d906008614c32565b61ffff168582815181106132b3576132b3615031565b016020015160f81c901b919091179060010161327e565b5061ffff8116156132ed5760405162461bcd60e51b81526004016104c09061508e565b5f805b60048110156133485761330481600361501e565b61330f906008614c32565b63ffffffff1686613321836002614d7e565b8151811061333157613331615031565b016020015160f81c901b91909117906001016132f0565b5063ffffffff811660041461336f5760405162461bcd60e51b81526004016104c0906150d1565b5f805b60208110156133c45761338681601f61501e565b613391906008614c32565b8761339d836006614d7e565b815181106133ad576133ad615031565b016020015160f81c901b9190911790600101613372565b505f805b6008811015613423576133dc81600761501e565b6133e7906008614c32565b6001600160401b0316886133fc836026614d7e565b8151811061340c5761340c615031565b016020015160f81c901b91909117906001016133c8565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206153fd833981519152914291901580613516575060028301548151613512916001600160401b031690614d7e565b8210155b1561353c576001600160401b03851660608201528181526040810151602082015261355b565b848160600181815161354e9190614d5e565b6001600160401b03169052505b606081015161356b906064614c07565b602082015160028501546001600160401b0392909216916135969190600160401b900460ff16614c32565b10156135fa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362357846001600160401b03168160400181815161361b9190614d7e565b905250613642565b846001600160401b03168160400181815161363e919061501e565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136d357604051631afcd79f60e31b815260040160405180910390fd5b565b6136dd61368a565b6136e681613da9565b611bf2608082013560a083013561370360e0850160c08601614a49565b613714610100860160e08701615127565b61ffff1661372a610120870161010088016151e3565b61373c61014088016101208901615203565b613dca565b61374961368a565b5f8051602061539d8339815191526001600160a01b0382166137c25760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061400e565b5f610a72825f8051602061539d833981519152546001600160a01b03169061406f565b611bf2816001613430565b5f5f805160206153fd8339815191524261388f6040860160208701614a49565b6001600160401b0316116139015760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139116040850160208601614a49565b6001600160401b03166139276202a30042614d7e565b1161399a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139f25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a625760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a6f604085018561521e565b9050603014613ad65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613adf83613864565b5f80613b796040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b249190614a49565b6001600160401b03168152602001613b3f60408a018a61521e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d1565b5f82815260078601602052604090209193509150613b9782826152ab565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bc4908590600401614c82565b6020604051808303815f875af1158015613be0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c049190614c49565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8657613c86614ae5565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d7b91908e01908e01614a49565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db161368a565b613db9614576565b613dc1614586565b611bf28161458e565b613dd261368a565b5f805160206153bd83398151915283613e3e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e605760405162461bcd60e51b81526004016104c090615142565b85871115613ec85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f355760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fa75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6140226001600160a01b0384168361473b565b905080515f141580156140465750808060200190518101906140449190615366565b155b15610bd657604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d99190614c49565b90506140f06001600160a01b038516333086614748565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614134573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141589190614c49565b90508181116141be5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141c8828261501e565b95945050505050565b5f606082608001515160301461423b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142b25761427281600161501e565b61427d906008614c32565b5081515f9083908390811061429457614294615031565b60200101906001600160f81b03191690815f1a90535060010161425e565b505f5b6004811015614310576142c981600361501e565b6142d4906008614c32565b505f826142e2836002614d7e565b815181106142f2576142f2615031565b60200101906001600160f81b03191690815f1a9053506001016142b5565b505f5b602081101561436d578451816020811061432f5761432f615031565b1a60f81b8261433f836006614d7e565b8151811061434f5761434f615031565b60200101906001600160f81b03191690815f1a905350600101614313565b505f5b60208110156143cd578460200151816020811061438f5761438f615031565b1a60f81b8261439f836026614d7e565b815181106143af576143af615031565b60200101906001600160f81b03191690815f1a905350600101614370565b505f5b6008811015614441576143e481600761501e565b6143ef906008614c32565b60ff1685604001516001600160401b0316901c60f81b828260466144139190614d7e565b8151811061442357614423615031565b60200101906001600160f81b03191690815f1a9053506001016143d0565b505f5b60308110156144ac578460800151818151811061446357614463615031565b01602001516001600160f81b0319168261447e83604e614d7e565b8151811061448e5761448e615031565b60200101906001600160f81b03191690815f1a905350600101614444565b505f5b600881101561451e576144c381600761501e565b6144ce906008614c32565b60608601516001600160401b0390811691161c60f81b826144f083607e614d7e565b8151811061450057614500615031565b60200101906001600160f81b03191690815f1a9053506001016144af565b5060028160405161452f9190615381565b602060405180830381855afa15801561454a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061456d9190614c49565b94909350915050565b61457e61368a565b6136d3614781565b6136d361368a565b61459661368a565b80355f805160206153fd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145e260808401606085016151e3565b60ff16111561464f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61466060808401606085016151e3565b60ff16116146c85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146d860808301606084016151e3565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147096060830160408401614a49565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126683835f614789565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd9060840161380f565b6130a461368a565b6060814710156147ae5760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147c99190615381565b5f6040518083038185875af1925050503d805f8114614803576040519150601f19603f3d011682016040523d82523d5f602084013e614808565b606091505b5091509150611bde868383606082614828576148238261486f565b611266565b815115801561483f57506001600160a01b0384163b155b1561486857604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b5080611266565b80511561487f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148a490614d91565b5f825580601f106148b3575050565b601f0160209004905f5260205f2090810190611bf29190614913565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614927575f8155600101614914565b5090565b8015158114611bf2575f80fd5b803563ffffffff8116811461494b575f80fd5b919050565b5f805f60608486031215614962575f80fd5b8335925060208401356149748161492b565b915061498260408501614938565b90509250925092565b5f6020828403121561499b575f80fd5b5035919050565b6001600160a01b0381168114611bf2575f80fd5b5f808284036101608112156149c9575f80fd5b610140808212156149d8575f80fd5b84935083013590506149e9816149a2565b809150509250929050565b5f60208284031215614a04575f80fd5b61126682614938565b5f8060408385031215614a1e575f80fd5b614a2783614938565b946020939093013593505050565b6001600160401b0381168114611bf2575f80fd5b5f60208284031215614a59575f80fd5b813561126681614a35565b5f8060408385031215614a75575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a97575f80fd5b84356001600160401b03811115614aac575f80fd5b850160608188031215614abd575f80fd5b93506040601f1982011215614ad0575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b1d57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4560408401826001600160a01b03169052565b506060830151614b6060608401826001600160401b03169052565b506080830151614b7b60808401826001600160401b03169052565b5060a0830151614b9660a08401826001600160401b03169052565b5060c0830151614bb160c08401826001600160401b03169052565b5060e0830151614bcc60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bcc57614bcc614bd3565b6001600160401b03818116838216028082169190828114614c2a57614c2a614bd3565b505092915050565b8082028115828204841417610a7257610a72614bd3565b5f60208284031215614c59575f80fd5b5051919050565b5f5b83811015614c7a578181015183820152602001614c62565b50505f910152565b602081525f8251806020840152614ca0816040850160208701614c60565b601f01601f19169190910160400192915050565b5f82614cce57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bcc57614bcc614bd3565b80820180821115610a7257610a72614bd3565b600181811c90821680614da557607f821691505b602082108103614dc357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e2281614d91565b806020870152604060018084165f8114614e435760018114614e5f57614e8c565b60ff19851660408a0152604084151560051b8a01019550614e8c565b895f5260205f205f5b85811015614e835781548b8201860152908301908801614e68565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614eb557614eb5614bd3565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614ef557614ef5614ebf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2357614f23614ebf565b604052919050565b805161494b8161492b565b5f8060408385031215614f47575f80fd5b82516001600160401b0380821115614f5d575f80fd5b9084019060608287031215614f70575f80fd5b614f78614ed3565b82518152602080840151614f8b816149a2565b82820152604084015183811115614fa0575f80fd5b80850194505087601f850112614fb4575f80fd5b835183811115614fc657614fc6614ebf565b614fd8601f8201601f19168301614efb565b93508084528882828701011115614fed575f80fd5b614ffc81838601848801614c60565b50826040830152819550615011818801614f2b565b9450505050509250929050565b81810381811115610a7257610a72614bd3565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bf2575f80fd5b5f60208284031215615137575f80fd5b813561126681615118565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561519881615118565b61ffff8116905081548161ffff19821617835560208401356151b981614a35565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151f3575f80fd5b813560ff81168114611266575f80fd5b5f60208284031215615213575f80fd5b8135611266816149a2565b5f808335601e19843603018112615233575f80fd5b8301803591506001600160401b0382111561524c575f80fd5b602001915036819003821315615260575f80fd5b9250929050565b601f821115610bd657805f5260205f20601f840160051c8101602085101561528c5750805b601f840160051c820191505b81811015610fef575f8155600101615298565b81516001600160401b038111156152c4576152c4614ebf565b6152d8816152d28454614d91565b84615267565b602080601f83116001811461530b575f84156152f45750858301515b5f19600386901b1c1916600185901b178555610fed565b5f85815260208120601f198616915b828110156153395788860151825594840194600190910190840161531a565b508582101561535657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215615376575f80fd5b81516112668161492b565b5f8251615392818460208701614c60565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 154a488c2..253fe8781 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161518f38038061518f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150428061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145b9565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145f4565b610982565b34801561018b575f80fd5b506101ca61019a3660046145f4565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d36600461460b565b610b52565b34801561022d575f80fd5b5061024161023c3660046145f4565b610c2f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b366004614622565b610c45565b3480156102ab575f80fd5b5061015f6102ba36600461463b565b610ca8565b3480156102ca575f80fd5b506101ca6102d9366004614677565b610e78565b3480156102e9575f80fd5b506102416102f83660046145f4565b610e91565b348015610308575f80fd5b5061015f6103173660046145b9565b610ea5565b6101ca61032a366004614692565b6110c3565b34801561033a575f80fd5b5061015f61034936600461463b565b6110ef565b348015610359575f80fd5b5061015f610368366004614622565b611339565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145f4565b6114f6565b3480156103dd575f80fd5b5061015f6103ec3660046145f4565b61177c565b6101ca6103ff3660046145f4565b61188b565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145f4565b611897565b6040516101d491906146ff565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f96833981519152949193919290829060ff1660048111156104c2576104c26146eb565b60048111156104d3576104d36146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f83611897565b905042600283516004811115610567576105676146eb565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f80516020614fb68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f80516020614fb68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f61062885611976565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146eb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610862575f61074e86896119f8565b6001600160401b03169050605060ff168460c001518461076e91906147ed565b610778919061480d565b6001600160401b031661078c826064614838565b10610860578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107c48760600151610e78565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561082b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084f919061484f565b5f8b81526009890160205260409020555b505b600283516005811115610877576108776146eb565b03610889576108898460600151611c94565b5f84606001518460a0015161089e91906147ed565b90506108aa8682611ca1565b5f6005600160991b0163ee5b48eb6108c3898686611ce9565b6040518263ffffffff1660e01b81526004016108df9190614888565b6020604051808303815f875af11580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f919061484f565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff1660058111156109d0576109d06146eb565b60058111156109e1576109e16146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6657610a666146eb565b14610acb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af08584608001515f611ce9565b6040518263ffffffff1660e01b8152600401610b0c9190614888565b6020604051808303815f875af1158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c919061484f565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9b575080546001600160401b03808416911610155b15610bb95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be383611f08565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c3f64e8d4a51000836148ba565b92915050565b5f80516020614f968339815191525f610c5d83611f19565b604081810180516001600160a01b039081165f908152600a87016020528251909116815291822091909155516060820151919250610ca391610c9e90610e78565b612290565b505050565b5f80516020614f968339815191525f610cc0846122a3565b90505f80610cd18360400151612484565b50915091505f610ce083611897565b9050816001600160401b031681608001516001600160401b03161015610d185760405162461bcd60e51b81526004016105b0906148d9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d5d5760405162461bcd60e51b81526004016105b09061491b565b60015f87815260068701602052604090205460ff166004811115610d8357610d836146eb565b14610dec5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c3f6001600160401b03831664e8d4a51000614838565b5f610e9b82611897565b60a0015192915050565b5f80516020614f968339815191525f610ebd856126bf565b5f86815260058401602052604090205460c0820151919250610eef91620100009091046001600160401b031690614964565b6001600160401b03168160e001516001600160401b03161015610f705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110bc575f610f8186856119f8565b9050605060ff168260c001518360e00151610f9c91906147ed565b610fa6919061480d565b6001600160401b0316610fba82606461480d565b6001600160401b0316106110ba578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610ffb8460600151610e78565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015611063573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611087919061484f565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110b4908490614984565b90915550505b505b5050505050565b5f6110cc612a68565b6110d7838334612a9f565b9050610c3f60015f80516020614ff683398151915255565b5f80516020614f968339815191525f611107846122a3565b90505f806111188360400151612484565b50915091505f61112783611897565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611161576111616146eb565b6004811115611172576111726146eb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112115760405162461bcd60e51b81526004016105b0906148d9565b5f8781526006870160205260409020600301546001600160401b038085169116111561124f5760405162461bcd60e51b81526004016105b09061491b565b600381516004811115611264576112646146eb565b146112b85760405162461bcd60e51b815260206004820152603160248201525f80516020614fb68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff1916600417905560098901825282209190915581015160608201516112f79190610c9e90610e78565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614fd68339815191525f611351836122a3565b90505f806113628360400151612ccd565b91509150806113c45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113de90614997565b9050118015611410575060015f83815260088601602052604090205460ff16600581111561140e5761140e6146eb565b145b61142c5760405162461bcd60e51b81526004016105b0906149c9565b5f828152600785016020526040812061144491614501565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f9683398151915293929190829060ff166004811115611557576115576146eb565b6004811115611568576115686146eb565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115ef576115ef6146eb565b148061160d575060038151600481111561160b5761160b6146eb565b145b6116615760405162461bcd60e51b815260206004820152603260248201525f80516020614fb6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f61166f8260400151611897565b905080608001516001600160401b03165f036116f35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611720846040015184608001518560a00151611ce9565b6040518263ffffffff1660e01b815260040161173c9190614888565b6020604051808303815f875af1158015611758573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc919061484f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fd68339815191529291906117c490614997565b90501180156117f6575060015f83815260088301602052604090205460ff1660058111156117f4576117f46146eb565b145b6118125760405162461bcd60e51b81526004016105b0906149c9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161184b9190600401614a10565b6020604051808303815f875af1158015611867573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca3919061484f565b5f610c3f823334612e6e565b61189f614538565b5f8281525f805160206150168339815191526020526040908190208151610100810190925280545f80516020614fd6833981519152929190829060ff1660058111156118ed576118ed6146eb565b60058111156118fe576118fe6146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150168339815191526020526040812060030180545f80516020614fd6833981519152916001600160401b0390911690836119b983614a9a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a43573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a6a9190810190614b4a565b9150915080611acd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b10573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b34919061484f565b825114611b985760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c0e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c1d8460400151613269565b91509150818714611c8a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c9e815f613441565b50565b5f9182525f80516020615016833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d6257611d22816001614c32565b611d2d906008614838565b5081515f90839083908110611d4457611d44614c45565b60200101906001600160f81b03191690815f1a905350600101611d0e565b505f5b6004811015611dc557611d79816003614c32565b611d84906008614838565b6001901c60f81b82611d97836002614984565b81518110611da757611da7614c45565b60200101906001600160f81b03191690815f1a905350600101611d65565b505f5b6020811015611e2757611ddc81601f614c32565b611de7906008614838565b86901c60f81b82611df9836006614984565b81518110611e0957611e09614c45565b60200101906001600160f81b03191690815f1a905350600101611dc8565b505f5b6008811015611e9257611e3e816007614c32565b611e49906008614838565b6001600160401b038616901c60f81b82611e64836026614984565b81518110611e7457611e74614c45565b60200101906001600160f81b03191690815f1a905350600101611e2a565b505f5b6008811015611efd57611ea9816007614c32565b611eb4906008614838565b6001600160401b038516901c60f81b82611ecf83602e614984565b81518110611edf57611edf614c45565b60200101906001600160f81b03191690815f1a905350600101611e95565b5090505b9392505050565b611f1061369b565b611c9e816136e6565b611f21614538565b5f80516020614fd68339815191525f611f39846122a3565b90505f80611f4a8360400151612ccd565b915091508015611faf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fe157611fe16146eb565b6005811115611ff257611ff26146eb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612079576120796146eb565b14806120975750600182516005811115612095576120956146eb565b145b6120f65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b60038251600581111561210b5761210b6146eb565b036121185750600461211c565b5060055b6020808301515f90815260098801909152604081205581816005811115612145576121456146eb565b90816005811115612158576121586146eb565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561218c5761218c6146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115612257576122576146eb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b61228c6001600160a01b03831682613752565b60408051606080820183525f8083526020830181905292820152905f80516020614fd68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612318573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261233f9190810190614b4a565b91509150806123a65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124095760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b03161561247c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124a85760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156124f7576124bf816001614c32565b6124ca906008614838565b61ffff168682815181106124e0576124e0614c45565b016020015160f81c901b91909117906001016124ab565b5061ffff81161561251a5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561257557612531816003614c32565b61253c906008614838565b63ffffffff168761254e836002614984565b8151811061255e5761255e614c45565b016020015160f81c901b919091179060010161251d565b5063ffffffff811660031461259c5760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156125f1576125b381601f614c32565b6125be906008614838565b886125ca836006614984565b815181106125da576125da614c45565b016020015160f81c901b919091179060010161259f565b505f805b600881101561265057612609816007614c32565b612614906008614838565b6001600160401b031689612629836026614984565b8151811061263957612639614c45565b016020015160f81c901b91909117906001016125f5565b505f805b60088110156126af57612668816007614c32565b612673906008614838565b6001600160401b03168a61268883602e614984565b8151811061269857612698614c45565b016020015160f81c901b9190911790600101612654565b5091989097509095509350505050565b6126c7614538565b5f8281525f8051602061501683398151915260205260408082208151610100810190925280545f80516020614fd683398151915293929190829060ff166005811115612715576127156146eb565b6005811115612726576127266146eb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127ae576127ae6146eb565b1461280a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b0316146128845760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128918160a00151611c94565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128d5576128d56146eb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129a18561299b81611976565b5f611ce9565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129d0908590600401614888565b6020604051808303815f875af11580156129ec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a10919061484f565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614ff6833981519152805460011901612a9957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f96833981519152906001600160401b0316612aeb6040860160208701614677565b6001600160401b03161015612b5a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b6c6020860186614d3b565b61ffff1610158015612b905750612710612b896020860186614d3b565b61ffff1611155b612bac5760405162461bcd60e51b81526004016105b090614d56565b8054831015612c0f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c765760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c8182610c2f565b90505f612c8e88836137e5565b5f81815260058601602052604090209091508790612cac8282614da1565b509098975050505050505050565b60015f80516020614ff683398151915255565b5f808251602714612cf05760405162461bcd60e51b81526004016105b090614c59565b5f805b6002811015612d3f57612d07816001614c32565b612d12906008614838565b61ffff16858281518110612d2857612d28614c45565b016020015160f81c901b9190911790600101612cf3565b5061ffff811615612d625760405162461bcd60e51b81526004016105b090614ca2565b5f805b6004811015612dbd57612d79816003614c32565b612d84906008614838565b63ffffffff1686612d96836002614984565b81518110612da657612da6614c45565b016020015160f81c901b9190911790600101612d65565b5063ffffffff8116600214612de45760405162461bcd60e51b81526004016105b090614ce5565b5f805b6020811015612e3957612dfb81601f614c32565b612e06906008614838565b87612e12836006614984565b81518110612e2257612e22614c45565b016020015160f81c901b9190911790600101612de7565b505f86602681518110612e4e57612e4e614c45565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e77612a68565b5f80516020614f968339815191525f612e8f84610c2f565b90505f612e9b87611897565b9050600281516005811115612eb257612eb26146eb565b14612f115760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1a82613d1f565b5f828260a00151612f2b9190614964565b60048501546060840151919250612f4d916001600160401b039091169061480d565b6001600160401b0316816001600160401b03161115612fcc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fd68882611ca1565b5f612fe089611976565b90505f898260405160200161300c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6130468d8688611ce9565b6040518263ffffffff1660e01b81526004016130629190614888565b6020604051808303815f875af115801561307e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906130a2919061484f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561312a5761312a6146eb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f0160015f80516020614ff683398151915255565b5f808251602e1461328c5760405162461bcd60e51b81526004016105b090614c59565b5f805b60028110156132db576132a3816001614c32565b6132ae906008614838565b61ffff168582815181106132c4576132c4614c45565b016020015160f81c901b919091179060010161328f565b5061ffff8116156132fe5760405162461bcd60e51b81526004016105b090614ca2565b5f805b600481101561335957613315816003614c32565b613320906008614838565b63ffffffff1686613332836002614984565b8151811061334257613342614c45565b016020015160f81c901b9190911790600101613301565b5063ffffffff81166004146133805760405162461bcd60e51b81526004016105b090614ce5565b5f805b60208110156133d55761339781601f614c32565b6133a2906008614838565b876133ae836006614984565b815181106133be576133be614c45565b016020015160f81c901b9190911790600101613383565b505f805b6008811015613434576133ed816007614c32565b6133f8906008614838565b6001600160401b03168861340d836026614984565b8151811061341d5761341d614c45565b016020015160f81c901b91909117906001016133d9565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614fd6833981519152914291901580613527575060028301548151613523916001600160401b031690614984565b8210155b1561354d576001600160401b03851660608201528181526040810151602082015261356c565b848160600181815161355f9190614964565b6001600160401b03169052505b606081015161357c90606461480d565b602082015160028501546001600160401b0392909216916135a79190600160401b900460ff16614838565b101561360b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561363457846001600160401b03168160400181815161362c9190614984565b905250613653565b846001600160401b03168160400181815161364f9190614c32565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136e457604051631afcd79f60e31b815260040160405180910390fd5b565b6136ee61369b565b6136f781613d2a565b611c9e608082013560a083013561371460e0850160c08601614677565b613725610100860160e08701614d3b565b61ffff1661373b61012087016101008801614df7565b61374d61014088016101208901614e17565b613d4b565b804710156137755760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137be576040519150601f19603f3d011682016040523d82523d5f602084013e6137c3565b606091505b5050905080610ca357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614fd6833981519152426138056040860160208701614677565b6001600160401b0316116138775760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b6138876040850160208601614677565b6001600160401b031661389d6202a30042614984565b116139105760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139685760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139d85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139e56040850185614e32565b9050603014613a4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a5583613d1f565b5f80613aef6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a9a9190614677565b6001600160401b03168152602001613ab560408a018a614e32565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f8f565b5f82815260078601602052604090209193509150613b0d8282614ebf565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b3a908590600401614888565b6020604051808303815f875af1158015613b56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b7a919061484f565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bfc57613bfc6146eb565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613cf191908e01908e01614677565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c9e816001613441565b613d3261369b565b613d3a614334565b613d42614344565b611c9e8161434c565b613d5361369b565b5f80516020614f9683398151915283613dbf5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613de15760405162461bcd60e51b81526004016105b090614d56565b85871115613e495760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eb65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613ff95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561407057614030816001614c32565b61403b906008614838565b5081515f9083908390811061405257614052614c45565b60200101906001600160f81b03191690815f1a90535060010161401c565b505f5b60048110156140ce57614087816003614c32565b614092906008614838565b505f826140a0836002614984565b815181106140b0576140b0614c45565b60200101906001600160f81b03191690815f1a905350600101614073565b505f5b602081101561412b57845181602081106140ed576140ed614c45565b1a60f81b826140fd836006614984565b8151811061410d5761410d614c45565b60200101906001600160f81b03191690815f1a9053506001016140d1565b505f5b602081101561418b578460200151816020811061414d5761414d614c45565b1a60f81b8261415d836026614984565b8151811061416d5761416d614c45565b60200101906001600160f81b03191690815f1a90535060010161412e565b505f5b60088110156141ff576141a2816007614c32565b6141ad906008614838565b60ff1685604001516001600160401b0316901c60f81b828260466141d19190614984565b815181106141e1576141e1614c45565b60200101906001600160f81b03191690815f1a90535060010161418e565b505f5b603081101561426a578460800151818151811061422157614221614c45565b01602001516001600160f81b0319168261423c83604e614984565b8151811061424c5761424c614c45565b60200101906001600160f81b03191690815f1a905350600101614202565b505f5b60088110156142dc57614281816007614c32565b61428c906008614838565b60608601516001600160401b0390811691161c60f81b826142ae83607e614984565b815181106142be576142be614c45565b60200101906001600160f81b03191690815f1a90535060010161426d565b506002816040516142ed9190614f7a565b602060405180830381855afa158015614308573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061432b919061484f565b94909350915050565b61433c61369b565b6136e46144f9565b6136e461369b565b61435461369b565b80355f80516020614fd683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143a06080840160608501614df7565b60ff16111561440d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f61441e6080840160608501614df7565b60ff16116144865760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b6144966080830160608401614df7565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144c76060830160408401614677565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cba61369b565b50805461450d90614997565b5f825580601f1061451c575050565b601f0160209004905f5260205f2090810190611c9e919061457c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614590575f815560010161457d565b5090565b8015158114611c9e575f80fd5b803563ffffffff811681146145b4575f80fd5b919050565b5f805f606084860312156145cb575f80fd5b8335925060208401356145dd81614594565b91506145eb604085016145a1565b90509250925092565b5f60208284031215614604575f80fd5b5035919050565b5f610140828403121561461c575f80fd5b50919050565b5f60208284031215614632575f80fd5b611f01826145a1565b5f806040838503121561464c575f80fd5b614655836145a1565b946020939093013593505050565b6001600160401b0381168114611c9e575f80fd5b5f60208284031215614687575f80fd5b8135611f0181614663565b5f8082840360608112156146a4575f80fd5b83356001600160401b038111156146b9575f80fd5b8401606081870312156146ca575f80fd5b92506040601f19820112156146dd575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061472357634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474b60408401826001600160a01b03169052565b50606083015161476660608401826001600160401b03169052565b50608083015161478160808401826001600160401b03169052565b5060a083015161479c60a08401826001600160401b03169052565b5060c08301516147b760c08401826001600160401b03169052565b5060e08301516147d260e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147d2576147d26147d9565b6001600160401b03818116838216028082169190828114614830576148306147d9565b505092915050565b8082028115828204841417610c3f57610c3f6147d9565b5f6020828403121561485f575f80fd5b5051919050565b5f5b83811015614880578181015183820152602001614868565b50505f910152565b602081525f82518060208401526148a6816040850160208701614866565b601f01601f19169190910160400192915050565b5f826148d457634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147d2576147d26147d9565b80820180821115610c3f57610c3f6147d9565b600181811c908216806149ab57607f821691505b60208210810361461c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a2281614997565b806020870152604060018084165f8114614a435760018114614a5f57614a8c565b60ff19851660408a0152604084151560051b8a01019550614a8c565b895f5260205f205f5b85811015614a835781548b8201860152908301908801614a68565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ab557614ab56147d9565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614af557614af5614abf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b2357614b23614abf565b604052919050565b6001600160a01b0381168114611c9e575f80fd5b80516145b481614594565b5f8060408385031215614b5b575f80fd5b82516001600160401b0380821115614b71575f80fd5b9084019060608287031215614b84575f80fd5b614b8c614ad3565b82518152602080840151614b9f81614b2b565b82820152604084015183811115614bb4575f80fd5b80850194505087601f850112614bc8575f80fd5b835183811115614bda57614bda614abf565b614bec601f8201601f19168301614afb565b93508084528882828701011115614c01575f80fd5b614c1081838601848801614866565b50826040830152819550614c25818801614b3f565b9450505050509250929050565b81810381811115610c3f57610c3f6147d9565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c9e575f80fd5b5f60208284031215614d4b575f80fd5b8135611f0181614d2c565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614dac81614d2c565b61ffff8116905081548161ffff1982161783556020840135614dcd81614663565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614e07575f80fd5b813560ff81168114611f01575f80fd5b5f60208284031215614e27575f80fd5b8135611f0181614b2b565b5f808335601e19843603018112614e47575f80fd5b8301803591506001600160401b03821115614e60575f80fd5b602001915036819003821315614e74575f80fd5b9250929050565b601f821115610ca357805f5260205f20601f840160051c81016020851015614ea05750805b601f840160051c820191505b818110156110bc575f8155600101614eac565b81516001600160401b03811115614ed857614ed8614abf565b614eec81614ee68454614997565b84614e7b565b602080601f831160018114614f1f575f8415614f085750858301515b5f19600386901b1c1916600185901b1785556110ba565b5f85815260208120601f198616915b82811015614f4d57888601518255948401946001909101908401614f2e565b5085821015614f6a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614f8b818460208701614866565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161518738038061518783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61503a8061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145b1565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145ec565b610982565b34801561018b575f80fd5b506101ca61019a3660046145ec565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614603565b610b52565b34801561022d575f80fd5b5061024161023c3660046145ec565b610c2f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b36600461461a565b610c45565b3480156102ab575f80fd5b5061015f6102ba366004614633565b610ca8565b3480156102ca575f80fd5b506101ca6102d936600461466f565b610e78565b3480156102e9575f80fd5b506102416102f83660046145ec565b610e91565b348015610308575f80fd5b5061015f6103173660046145b1565b610ea5565b6101ca61032a36600461468a565b6110c3565b34801561033a575f80fd5b5061015f610349366004614633565b6110ef565b348015610359575f80fd5b5061015f61036836600461461a565b611331565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145ec565b6114ee565b3480156103dd575f80fd5b5061015f6103ec3660046145ec565b611774565b6101ca6103ff3660046145ec565b611883565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145ec565b61188f565b6040516101d491906146f7565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f8e833981519152949193919290829060ff1660048111156104c2576104c26146e3565b60048111156104d3576104d36146e3565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f8361188f565b905042600283516004811115610567576105676146e3565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f80516020614fae8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f80516020614fae8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f6106288561196e565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146e3565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610862575f61074e86896119f0565b6001600160401b03169050605060ff168460c001518461076e91906147e5565b6107789190614805565b6001600160401b031661078c826064614830565b10610860578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107c48760600151610e78565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561082b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084f9190614847565b5f8b81526009890160205260409020555b505b600283516005811115610877576108776146e3565b03610889576108898460600151611c8c565b5f84606001518460a0015161089e91906147e5565b90506108aa8682611c99565b5f6005600160991b0163ee5b48eb6108c3898686611ce1565b6040518263ffffffff1660e01b81526004016108df9190614880565b6020604051808303815f875af11580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f9190614847565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061500e83398151915260205260408082208151610100810190925280545f80516020614fce83398151915293929190829060ff1660058111156109d0576109d06146e3565b60058111156109e1576109e16146e3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6657610a666146e3565b14610acb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af08584608001515f611ce1565b6040518263ffffffff1660e01b8152600401610b0c9190614880565b6020604051808303815f875af1158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c9190614847565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9b575080546001600160401b03808416911610155b15610bb95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be383611f00565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c3f64e8d4a51000836148b2565b92915050565b5f80516020614f8e8339815191525f610c5d83611f11565b604081810180516001600160a01b039081165f908152600a87016020528251909116815291822091909155516060820151919250610ca391610c9e90610e78565b612288565b505050565b5f80516020614f8e8339815191525f610cc08461229b565b90505f80610cd1836040015161247c565b50915091505f610ce08361188f565b9050816001600160401b031681608001516001600160401b03161015610d185760405162461bcd60e51b81526004016105b0906148d1565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d5d5760405162461bcd60e51b81526004016105b090614913565b60015f87815260068701602052604090205460ff166004811115610d8357610d836146e3565b14610dec5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c3f6001600160401b03831664e8d4a51000614830565b5f610e9b8261188f565b60a0015192915050565b5f80516020614f8e8339815191525f610ebd856126b7565b5f86815260058401602052604090205460c0820151919250610eef91620100009091046001600160401b03169061495c565b6001600160401b03168160e001516001600160401b03161015610f705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110bc575f610f8186856119f0565b9050605060ff168260c001518360e00151610f9c91906147e5565b610fa69190614805565b6001600160401b0316610fba826064614805565b6001600160401b0316106110ba578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610ffb8460600151610e78565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015611063573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110879190614847565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110b490849061497c565b90915550505b505b5050505050565b5f6110cc612a60565b6110d7838334612a97565b9050610c3f60015f80516020614fee83398151915255565b5f80516020614f8e8339815191525f6111078461229b565b90505f80611118836040015161247c565b50915091505f6111278361188f565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611161576111616146e3565b6004811115611172576111726146e3565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112115760405162461bcd60e51b81526004016105b0906148d1565b826001600160401b03168160e001516001600160401b031611156112475760405162461bcd60e51b81526004016105b090614913565b60038151600481111561125c5761125c6146e3565b146112b05760405162461bcd60e51b815260206004820152603160248201525f80516020614fae8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff1916600417905560098901825282209190915581015160608201516112ef9190610c9e90610e78565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614fce8339815191525f6113498361229b565b90505f8061135a8360400151612cc5565b91509150806113bc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113d69061498f565b9050118015611408575060015f83815260088601602052604090205460ff166005811115611406576114066146e3565b145b6114245760405162461bcd60e51b81526004016105b0906149c1565b5f828152600785016020526040812061143c916144f9565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f8e83398151915293929190829060ff16600481111561154f5761154f6146e3565b6004811115611560576115606146e3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115e7576115e76146e3565b14806116055750600381516004811115611603576116036146e3565b145b6116595760405162461bcd60e51b815260206004820152603260248201525f80516020614fae833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f611667826040015161188f565b905080608001516001600160401b03165f036116eb5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611718846040015184608001518560a00151611ce1565b6040518263ffffffff1660e01b81526004016117349190614880565b6020604051808303815f875af1158015611750573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc9190614847565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fce8339815191529291906117bc9061498f565b90501180156117ee575060015f83815260088301602052604090205460ff1660058111156117ec576117ec6146e3565b145b61180a5760405162461bcd60e51b81526004016105b0906149c1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118439190600401614a08565b6020604051808303815f875af115801561185f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca39190614847565b5f610c3f823334612e66565b611897614530565b5f8281525f8051602061500e8339815191526020526040908190208151610100810190925280545f80516020614fce833981519152929190829060ff1660058111156118e5576118e56146e3565b60058111156118f6576118f66146e3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f8051602061500e8339815191526020526040812060030180545f80516020614fce833981519152916001600160401b0390911690836119b183614a92565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a3b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a629190810190614b42565b9150915080611ac55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2c9190614847565b825114611b905760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c065760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c158460400151613261565b91509150818714611c825760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c96815f613439565b50565b5f9182525f8051602061500e833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d5a57611d1a816001614c2a565b611d25906008614830565b5081515f90839083908110611d3c57611d3c614c3d565b60200101906001600160f81b03191690815f1a905350600101611d06565b505f5b6004811015611dbd57611d71816003614c2a565b611d7c906008614830565b6001901c60f81b82611d8f83600261497c565b81518110611d9f57611d9f614c3d565b60200101906001600160f81b03191690815f1a905350600101611d5d565b505f5b6020811015611e1f57611dd481601f614c2a565b611ddf906008614830565b86901c60f81b82611df183600661497c565b81518110611e0157611e01614c3d565b60200101906001600160f81b03191690815f1a905350600101611dc0565b505f5b6008811015611e8a57611e36816007614c2a565b611e41906008614830565b6001600160401b038616901c60f81b82611e5c83602661497c565b81518110611e6c57611e6c614c3d565b60200101906001600160f81b03191690815f1a905350600101611e22565b505f5b6008811015611ef557611ea1816007614c2a565b611eac906008614830565b6001600160401b038516901c60f81b82611ec783602e61497c565b81518110611ed757611ed7614c3d565b60200101906001600160f81b03191690815f1a905350600101611e8d565b5090505b9392505050565b611f08613693565b611c96816136de565b611f19614530565b5f80516020614fce8339815191525f611f318461229b565b90505f80611f428360400151612cc5565b915091508015611fa75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fd957611fd96146e3565b6005811115611fea57611fea6146e3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612071576120716146e3565b148061208f575060018251600581111561208d5761208d6146e3565b145b6120ee5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b600382516005811115612103576121036146e3565b0361211057506004612114565b5060055b6020808301515f9081526009880190915260408120558181600581111561213d5761213d6146e3565b90816005811115612150576121506146e3565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612184576121846146e3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561224f5761224f6146e3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6122846001600160a01b0383168261374a565b60408051606080820183525f8083526020830181905292820152905f80516020614fce8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612310573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123379190810190614b42565b915091508061239e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124015760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b0316156124745760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124a05760405162461bcd60e51b81526004016105b090614c51565b5f805b60028110156124ef576124b7816001614c2a565b6124c2906008614830565b61ffff168682815181106124d8576124d8614c3d565b016020015160f81c901b91909117906001016124a3565b5061ffff8116156125125760405162461bcd60e51b81526004016105b090614c9a565b5f805b600481101561256d57612529816003614c2a565b612534906008614830565b63ffffffff168761254683600261497c565b8151811061255657612556614c3d565b016020015160f81c901b9190911790600101612515565b5063ffffffff81166003146125945760405162461bcd60e51b81526004016105b090614cdd565b5f805b60208110156125e9576125ab81601f614c2a565b6125b6906008614830565b886125c283600661497c565b815181106125d2576125d2614c3d565b016020015160f81c901b9190911790600101612597565b505f805b600881101561264857612601816007614c2a565b61260c906008614830565b6001600160401b03168961262183602661497c565b8151811061263157612631614c3d565b016020015160f81c901b91909117906001016125ed565b505f805b60088110156126a757612660816007614c2a565b61266b906008614830565b6001600160401b03168a61268083602e61497c565b8151811061269057612690614c3d565b016020015160f81c901b919091179060010161264c565b5091989097509095509350505050565b6126bf614530565b5f8281525f8051602061500e83398151915260205260408082208151610100810190925280545f80516020614fce83398151915293929190829060ff16600581111561270d5761270d6146e3565b600581111561271e5761271e6146e3565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a6576127a66146e3565b146128025760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b03161461287c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128898160a00151611c8c565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128cd576128cd6146e3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612999856129938161196e565b5f611ce1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c8908590600401614880565b6020604051808303815f875af11580156129e4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a089190614847565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614fee833981519152805460011901612a9157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f8e833981519152906001600160401b0316612ae3604086016020870161466f565b6001600160401b03161015612b525760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b646020860186614d33565b61ffff1610158015612b885750612710612b816020860186614d33565b61ffff1611155b612ba45760405162461bcd60e51b81526004016105b090614d4e565b8054831015612c075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c6e5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c7982610c2f565b90505f612c8688836137dd565b5f81815260058601602052604090209091508790612ca48282614d99565b509098975050505050505050565b60015f80516020614fee83398151915255565b5f808251602714612ce85760405162461bcd60e51b81526004016105b090614c51565b5f805b6002811015612d3757612cff816001614c2a565b612d0a906008614830565b61ffff16858281518110612d2057612d20614c3d565b016020015160f81c901b9190911790600101612ceb565b5061ffff811615612d5a5760405162461bcd60e51b81526004016105b090614c9a565b5f805b6004811015612db557612d71816003614c2a565b612d7c906008614830565b63ffffffff1686612d8e83600261497c565b81518110612d9e57612d9e614c3d565b016020015160f81c901b9190911790600101612d5d565b5063ffffffff8116600214612ddc5760405162461bcd60e51b81526004016105b090614cdd565b5f805b6020811015612e3157612df381601f614c2a565b612dfe906008614830565b87612e0a83600661497c565b81518110612e1a57612e1a614c3d565b016020015160f81c901b9190911790600101612ddf565b505f86602681518110612e4657612e46614c3d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e6f612a60565b5f80516020614f8e8339815191525f612e8784610c2f565b90505f612e938761188f565b9050600281516005811115612eaa57612eaa6146e3565b14612f095760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1282613d17565b5f828260a00151612f23919061495c565b60048501546060840151919250612f45916001600160401b0390911690614805565b6001600160401b0316816001600160401b03161115612fc45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fce8882611c99565b5f612fd88961196e565b90505f898260405160200161300492919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb61303e8d8688611ce1565b6040518263ffffffff1660e01b815260040161305a9190614880565b6020604051808303815f875af1158015613076573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061309a9190614847565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613122576131226146e3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611ef960015f80516020614fee83398151915255565b5f808251602e146132845760405162461bcd60e51b81526004016105b090614c51565b5f805b60028110156132d35761329b816001614c2a565b6132a6906008614830565b61ffff168582815181106132bc576132bc614c3d565b016020015160f81c901b9190911790600101613287565b5061ffff8116156132f65760405162461bcd60e51b81526004016105b090614c9a565b5f805b60048110156133515761330d816003614c2a565b613318906008614830565b63ffffffff168661332a83600261497c565b8151811061333a5761333a614c3d565b016020015160f81c901b91909117906001016132f9565b5063ffffffff81166004146133785760405162461bcd60e51b81526004016105b090614cdd565b5f805b60208110156133cd5761338f81601f614c2a565b61339a906008614830565b876133a683600661497c565b815181106133b6576133b6614c3d565b016020015160f81c901b919091179060010161337b565b505f805b600881101561342c576133e5816007614c2a565b6133f0906008614830565b6001600160401b03168861340583602661497c565b8151811061341557613415614c3d565b016020015160f81c901b91909117906001016133d1565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614fce83398151915291429190158061351f57506002830154815161351b916001600160401b03169061497c565b8210155b15613545576001600160401b038516606082015281815260408101516020820152613564565b8481606001818151613557919061495c565b6001600160401b03169052505b6060810151613574906064614805565b602082015160028501546001600160401b03929092169161359f9190600160401b900460ff16614830565b10156136035760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561362c57846001600160401b031681604001818151613624919061497c565b90525061364b565b846001600160401b0316816040018181516136479190614c2a565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136dc57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e6613693565b6136ef81613d22565b611c96608082013560a083013561370c60e0850160c0860161466f565b61371d610100860160e08701614d33565b61ffff1661373361012087016101008801614def565b61374561014088016101208901614e0f565b613d43565b8047101561376d5760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137b6576040519150601f19603f3d011682016040523d82523d5f602084013e6137bb565b606091505b5050905080610ca357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614fce833981519152426137fd604086016020870161466f565b6001600160401b03161161386f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b61387f604085016020860161466f565b6001600160401b03166138956202a3004261497c565b116139085760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139605760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139d05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139dd6040850185614e2a565b9050603014613a445760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a4d83613d17565b5f80613ae76040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a92919061466f565b6001600160401b03168152602001613aad60408a018a614e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f87565b5f82815260078601602052604090209193509150613b058282614eb7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b32908590600401614880565b6020604051808303815f875af1158015613b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b729190614847565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bf457613bf46146e3565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ce991908e01908e0161466f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c96816001613439565b613d2a613693565b613d3261432c565b613d3a61433c565b611c9681614344565b613d4b613693565b5f80516020614f8e83398151915283613db75760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613dd95760405162461bcd60e51b81526004016105b090614d4e565b85871115613e415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eae5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f205760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613ff15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561406857614028816001614c2a565b614033906008614830565b5081515f9083908390811061404a5761404a614c3d565b60200101906001600160f81b03191690815f1a905350600101614014565b505f5b60048110156140c65761407f816003614c2a565b61408a906008614830565b505f8261409883600261497c565b815181106140a8576140a8614c3d565b60200101906001600160f81b03191690815f1a90535060010161406b565b505f5b602081101561412357845181602081106140e5576140e5614c3d565b1a60f81b826140f583600661497c565b8151811061410557614105614c3d565b60200101906001600160f81b03191690815f1a9053506001016140c9565b505f5b6020811015614183578460200151816020811061414557614145614c3d565b1a60f81b8261415583602661497c565b8151811061416557614165614c3d565b60200101906001600160f81b03191690815f1a905350600101614126565b505f5b60088110156141f75761419a816007614c2a565b6141a5906008614830565b60ff1685604001516001600160401b0316901c60f81b828260466141c9919061497c565b815181106141d9576141d9614c3d565b60200101906001600160f81b03191690815f1a905350600101614186565b505f5b6030811015614262578460800151818151811061421957614219614c3d565b01602001516001600160f81b0319168261423483604e61497c565b8151811061424457614244614c3d565b60200101906001600160f81b03191690815f1a9053506001016141fa565b505f5b60088110156142d457614279816007614c2a565b614284906008614830565b60608601516001600160401b0390811691161c60f81b826142a683607e61497c565b815181106142b6576142b6614c3d565b60200101906001600160f81b03191690815f1a905350600101614265565b506002816040516142e59190614f72565b602060405180830381855afa158015614300573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143239190614847565b94909350915050565b614334613693565b6136dc6144f1565b6136dc613693565b61434c613693565b80355f80516020614fce83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143986080840160608501614def565b60ff1611156144055760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f6144166080840160608501614def565b60ff161161447e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b61448e6080830160608401614def565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144bf606083016040840161466f565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cb2613693565b5080546145059061498f565b5f825580601f10614514575050565b601f0160209004905f5260205f2090810190611c969190614574565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614588575f8155600101614575565b5090565b8015158114611c96575f80fd5b803563ffffffff811681146145ac575f80fd5b919050565b5f805f606084860312156145c3575f80fd5b8335925060208401356145d58161458c565b91506145e360408501614599565b90509250925092565b5f602082840312156145fc575f80fd5b5035919050565b5f6101408284031215614614575f80fd5b50919050565b5f6020828403121561462a575f80fd5b611ef982614599565b5f8060408385031215614644575f80fd5b61464d83614599565b946020939093013593505050565b6001600160401b0381168114611c96575f80fd5b5f6020828403121561467f575f80fd5b8135611ef98161465b565b5f80828403606081121561469c575f80fd5b83356001600160401b038111156146b1575f80fd5b8401606081870312156146c2575f80fd5b92506040601f19820112156146d5575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061471b57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474360408401826001600160a01b03169052565b50606083015161475e60608401826001600160401b03169052565b50608083015161477960808401826001600160401b03169052565b5060a083015161479460a08401826001600160401b03169052565b5060c08301516147af60c08401826001600160401b03169052565b5060e08301516147ca60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147ca576147ca6147d1565b6001600160401b03818116838216028082169190828114614828576148286147d1565b505092915050565b8082028115828204841417610c3f57610c3f6147d1565b5f60208284031215614857575f80fd5b5051919050565b5f5b83811015614878578181015183820152602001614860565b50505f910152565b602081525f825180602084015261489e81604085016020870161485e565b601f01601f19169190910160400192915050565b5f826148cc57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147ca576147ca6147d1565b80820180821115610c3f57610c3f6147d1565b600181811c908216806149a357607f821691505b60208210810361461457634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a1a8161498f565b806020870152604060018084165f8114614a3b5760018114614a5757614a84565b60ff19851660408a0152604084151560051b8a01019550614a84565b895f5260205f205f5b85811015614a7b5781548b8201860152908301908801614a60565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614aad57614aad6147d1565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614aed57614aed614ab7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b1b57614b1b614ab7565b604052919050565b6001600160a01b0381168114611c96575f80fd5b80516145ac8161458c565b5f8060408385031215614b53575f80fd5b82516001600160401b0380821115614b69575f80fd5b9084019060608287031215614b7c575f80fd5b614b84614acb565b82518152602080840151614b9781614b23565b82820152604084015183811115614bac575f80fd5b80850194505087601f850112614bc0575f80fd5b835183811115614bd257614bd2614ab7565b614be4601f8201601f19168301614af3565b93508084528882828701011115614bf9575f80fd5b614c088183860184880161485e565b50826040830152819550614c1d818801614b37565b9450505050509250929050565b81810381811115610c3f57610c3f6147d1565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c96575f80fd5b5f60208284031215614d43575f80fd5b8135611ef981614d24565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614da481614d24565b61ffff8116905081548161ffff1982161783556020840135614dc58161465b565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614dff575f80fd5b813560ff81168114611ef9575f80fd5b5f60208284031215614e1f575f80fd5b8135611ef981614b23565b5f808335601e19843603018112614e3f575f80fd5b8301803591506001600160401b03821115614e58575f80fd5b602001915036819003821315614e6c575f80fd5b9250929050565b601f821115610ca357805f5260205f20601f840160051c81016020851015614e985750805b601f840160051c820191505b818110156110bc575f8155600101614ea4565b81516001600160401b03811115614ed057614ed0614ab7565b614ee481614ede845461498f565b84614e73565b602080601f831160018114614f17575f8415614f005750858301515b5f19600386901b1c1916600185901b1785556110ba565b5f85815260208120601f198616915b82811015614f4557888601518255948401946001909101908401614f26565b5085821015614f6257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614f8381846020870161485e565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 6690bd5c8..4480812a9 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -468,7 +468,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // to be used to complete delisting for an earlier delegation. This is necessary because the P-Chain // is only willing to sign the latest weight update. require( - $._delegatorStakes[delegationID].endingNonce <= nonce, + delegator.endingNonce <= nonce, "PoSValidatorManager: nonce does not match" ); From 2ecf2bff7d54a8be04405988f20a98fb88ac00e3 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 16 Sep 2024 15:13:02 -0400 Subject: [PATCH 292/545] lint --- contracts/staking/PoSValidatorManager.sol | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 4480812a9..9dca36b01 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -467,10 +467,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // a weight update using a higher nonce (which implicitly includes the delegation's weight update) // to be used to complete delisting for an earlier delegation. This is necessary because the P-Chain // is only willing to sign the latest weight update. - require( - delegator.endingNonce <= nonce, - "PoSValidatorManager: nonce does not match" - ); + require(delegator.endingNonce <= nonce, "PoSValidatorManager: nonce does not match"); // Ensure the delegator is pending removed. Since anybody can call this function once // end delegation has been initialized, we need to make sure that this function is only From e29827c5c3c9bdb9f5147c58bc178f88a4ea1f4d Mon Sep 17 00:00:00 2001 From: "F. Eugene Aumson" Date: Wed, 11 Sep 2024 18:37:03 +0000 Subject: [PATCH 293/545] Native staking rewards --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 35 ++++++++++++- .../staking/NativeTokenStakingManager.sol | 7 ++- contracts/staking/PoSValidatorManager.sol | 7 ++- .../tests/ERC20TokenStakingManagerTests.t.sol | 1 - .../NativeTokenStakingManagerTests.t.sol | 33 +++++++----- .../tests/PoSValidatorManagerTests.t.sol | 51 ++++++++++++++++--- 7 files changed, 109 insertions(+), 27 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 62f3f3cdf..6bf7209e4 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516155b63803806155b683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154698061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614950565b61036a565b005b61015f61016f36600461498b565b610892565b6101b261018236600461498b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed36600461498b565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149b6565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f6102473660046149f4565b610b57565b61015f61025a366004614a0d565b610bdb565b6101b261026d366004614a49565b610dab565b6101f261028036600461498b565b610dc4565b61015f610293366004614950565b610dd8565b61015f6102a6366004614a0d565b610ff6565b6101b26102b9366004614a64565b61125a565b6101b26102cc366004614a84565b61126d565b61015f6102df3660046149f4565b611299565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f61032036600461498b565b611456565b61015f61033336600461498b565b6116dc565b6101cd601481565b61035361034e36600461498b565b6117eb565b6040516101bc9190614af9565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153bd833981519152949193919290829060ff1660048111156103d2576103d2614ae5565b60048111156103e3576103e3614ae5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f836117eb565b90504260028351600481111561047757610477614ae5565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153dd8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153dd8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118ca565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614ae5565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e868961194c565b6001600160401b03169050605060ff168460c001518461067e9190614be7565b6106889190614c07565b6001600160401b031661069c826064614c32565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dab565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c49565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614ae5565b03610799576107998460600151611be8565b5f84606001518460a001516107ae9190614be7565b90506107ba8682611bf5565b5f6005600160991b0163ee5b48eb6107d3898686611c3d565b6040518263ffffffff1660e01b81526004016107ef9190614c82565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c49565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061543d83398151915260205260408082208151610100810190925280545f805160206153fd83398151915293929190829060ff1660058111156108e0576108e0614ae5565b60058111156108f1576108f1614ae5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614ae5565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c3d565b6040518263ffffffff1660e01b8152600401610a1c9190614c82565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c49565b50505050565b5f610a7264e8d4a5100083614cb4565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e5a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153bd8339815191525f610b6f83611e78565b6040808201516001600160a01b0381165f908152600a86016020529190912054919250610b9b916121eb565b604080820180516001600160a01b03165f908152600a850160205291822091909155516060820151610bd69190610bd190610dab565b612261565b505050565b5f805160206153bd8339815191525f610bf384612284565b90505f80610c048360400151612465565b50915091505f610c13836117eb565b9050816001600160401b031681608001516001600160401b03161015610c4b5760405162461bcd60e51b81526004016104c090614cd3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c905760405162461bcd60e51b81526004016104c090614d15565b60015f87815260068701602052604090205460ff166004811115610cb657610cb6614ae5565b14610d1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c32565b5f610dce826117eb565b60a0015192915050565b5f805160206153bd8339815191525f610df0856126a0565b5f86815260058401602052604090205460c0820151919250610e2291620100009091046001600160401b031690614d5e565b6001600160401b03168160e001516001600160401b03161015610ea35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315610fef575f610eb4868561194c565b9050605060ff168260c001518360e00151610ecf9190614be7565b610ed99190614c07565b6001600160401b0316610eed826064614c07565b6001600160401b031610610fed578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f2e8460600151610dab565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610f96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fba9190614c49565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fe7908490614d7e565b90915550505b505b5050505050565b5f805160206153bd8339815191525f61100e84612284565b90505f8061101f8360400151612465565b50915091505f61102e836117eb565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106857611068614ae5565b600481111561107957611079614ae5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111185760405162461bcd60e51b81526004016104c090614cd3565b826001600160401b03168160e001516001600160401b0316111561114e5760405162461bcd60e51b81526004016104c090614d15565b60038151600481111561116357611163614ae5565b146111b75760405162461bcd60e51b815260206004820152603160248201525f805160206153dd8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546111ed91906121eb565b856009015f8881526020019081526020015f205f90556112188160200151610bd18360600151610dab565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f611266833384612a49565b9392505050565b5f611276612e47565b611281848484612e7e565b905061126660015f8051602061541d83398151915255565b5f805160206153fd8339815191525f6112b183612284565b90505f806112c283604001516130b7565b91509150806113245760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461133e90614d91565b9050118015611370575060015f83815260088601602052604090205460ff16600581111561136e5761136e614ae5565b145b61138c5760405162461bcd60e51b81526004016104c090614dc9565b5f82815260078501602052604081206113a491614898565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153bd83398151915293929190829060ff1660048111156114b7576114b7614ae5565b60048111156114c8576114c8614ae5565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561154f5761154f614ae5565b148061156d575060038151600481111561156b5761156b614ae5565b145b6115c15760405162461bcd60e51b815260206004820152603260248201525f805160206153dd833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115cf82604001516117eb565b905080608001516001600160401b03165f036116535760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611680846040015184608001518560a00151611c3d565b6040518263ffffffff1660e01b815260040161169c9190614c82565b6020604051808303815f875af11580156116b8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fef9190614c49565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206153fd83398151915292919061172490614d91565b9050118015611756575060015f83815260088301602052604090205460ff16600581111561175457611754614ae5565b145b6117725760405162461bcd60e51b81526004016104c090614dc9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117ab9190600401614e10565b6020604051808303815f875af11580156117c7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190614c49565b6117f36148cf565b5f8281525f8051602061543d8339815191526020526040908190208151610100810190925280545f805160206153fd833981519152929190829060ff16600581111561184157611841614ae5565b600581111561185257611852614ae5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f8051602061543d8339815191526020526040812060030180545f805160206153fd833981519152916001600160401b03909116908361190d83614e9a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611997573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119be9190810190614f36565b9150915080611a215760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a889190614c49565b825114611aec5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b625760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b718460400151613258565b91509150818714611bde5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611bf2815f613430565b50565b5f9182525f8051602061543d833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cb657611c7681600161501e565b611c81906008614c32565b5081515f90839083908110611c9857611c98615031565b60200101906001600160f81b03191690815f1a905350600101611c62565b505f5b6004811015611d1957611ccd81600361501e565b611cd8906008614c32565b6001901c60f81b82611ceb836002614d7e565b81518110611cfb57611cfb615031565b60200101906001600160f81b03191690815f1a905350600101611cb9565b505f5b6020811015611d7b57611d3081601f61501e565b611d3b906008614c32565b86901c60f81b82611d4d836006614d7e565b81518110611d5d57611d5d615031565b60200101906001600160f81b03191690815f1a905350600101611d1c565b505f5b6008811015611de657611d9281600761501e565b611d9d906008614c32565b6001600160401b038616901c60f81b82611db8836026614d7e565b81518110611dc857611dc8615031565b60200101906001600160f81b03191690815f1a905350600101611d7e565b505f5b6008811015611e5157611dfd81600761501e565b611e08906008614c32565b6001600160401b038516901c60f81b82611e2383602e614d7e565b81518110611e3357611e33615031565b60200101906001600160f81b03191690815f1a905350600101611de9565b50949350505050565b611e6261368a565b611e6b826136d5565b611e7481613741565b5050565b611e806148cf565b5f805160206153fd8339815191525f611e9884612284565b90505f80611ea983604001516130b7565b915091508015611f0e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4057611f40614ae5565b6005811115611f5157611f51614ae5565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fd857611fd8614ae5565b1480611ff65750600182516005811115611ff457611ff4614ae5565b145b6120555760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561206a5761206a614ae5565b036120775750600461207b565b5060055b6020808301515f908152600988019091526040812055818160058111156120a4576120a4614ae5565b908160058111156120b7576120b7614ae5565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120eb576120eb614ae5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121b6576121b6614ae5565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f8051602061539d83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612246575f80fd5b505af1158015612258573d5f803e3d5ffd5b50505050505050565b5f8051602061539d83398151915254611e74906001600160a01b031683836137e2565b60408051606080820183525f8083526020830181905292820152905f805160206153fd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156122f9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123209190810190614f36565b91509150806123875760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146123ea5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b03161561245d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124895760405162461bcd60e51b81526004016104c090615045565b5f805b60028110156124d8576124a081600161501e565b6124ab906008614c32565b61ffff168682815181106124c1576124c1615031565b016020015160f81c901b919091179060010161248c565b5061ffff8116156124fb5760405162461bcd60e51b81526004016104c09061508e565b5f805b60048110156125565761251281600361501e565b61251d906008614c32565b63ffffffff168761252f836002614d7e565b8151811061253f5761253f615031565b016020015160f81c901b91909117906001016124fe565b5063ffffffff811660031461257d5760405162461bcd60e51b81526004016104c0906150d1565b5f805b60208110156125d25761259481601f61501e565b61259f906008614c32565b886125ab836006614d7e565b815181106125bb576125bb615031565b016020015160f81c901b9190911790600101612580565b505f805b6008811015612631576125ea81600761501e565b6125f5906008614c32565b6001600160401b03168961260a836026614d7e565b8151811061261a5761261a615031565b016020015160f81c901b91909117906001016125d6565b505f805b60088110156126905761264981600761501e565b612654906008614c32565b6001600160401b03168a61266983602e614d7e565b8151811061267957612679615031565b016020015160f81c901b9190911790600101612635565b5091989097509095509350505050565b6126a86148cf565b5f8281525f8051602061543d83398151915260205260408082208151610100810190925280545f805160206153fd83398151915293929190829060ff1660058111156126f6576126f6614ae5565b600581111561270757612707614ae5565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561278f5761278f614ae5565b146127eb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b0316146128655760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b6128728160a00151611be8565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128b6576128b6614ae5565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6129828561297c816118ca565b5f611c3d565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b1908590600401614c82565b6020604051808303815f875af11580156129cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f19190614c49565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a52612e47565b5f805160206153bd8339815191525f612a6d6101ed85613841565b90505f612a79876117eb565b9050600281516005811115612a9057612a90614ae5565b14612aef5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612af882613864565b5f828260a00151612b099190614d5e565b60048501546060840151919250612b2b916001600160401b0390911690614c07565b6001600160401b0316816001600160401b03161115612baa5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bb48882611bf5565b5f612bbe896118ca565b90505f8982604051602001612bea92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c248d8688611c3d565b6040518263ffffffff1660e01b8152600401612c409190614c82565b6020604051808303815f875af1158015612c5c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c809190614c49565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d0857612d08614ae5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126660015f8051602061541d83398151915255565b5f8051602061541d833981519152805460011901612e7857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153bd833981519152906001600160401b0316612eca6040860160208701614a49565b6001600160401b03161015612f395760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f4b6020860186615127565b61ffff1610158015612f6f5750612710612f686020860186615127565b61ffff1611155b612f8b5760405162461bcd60e51b81526004016104c090615142565b8054831015612fee5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b80600101548311156130555760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61305f84613841565b90505f61306b82610a62565b90505f613078888361386f565b5f81815260058601602052604090209091508790613096828261518d565b509098975050505050505050565b60015f8051602061541d83398151915255565b5f8082516027146130da5760405162461bcd60e51b81526004016104c090615045565b5f805b6002811015613129576130f181600161501e565b6130fc906008614c32565b61ffff1685828151811061311257613112615031565b016020015160f81c901b91909117906001016130dd565b5061ffff81161561314c5760405162461bcd60e51b81526004016104c09061508e565b5f805b60048110156131a75761316381600361501e565b61316e906008614c32565b63ffffffff1686613180836002614d7e565b8151811061319057613190615031565b016020015160f81c901b919091179060010161314f565b5063ffffffff81166002146131ce5760405162461bcd60e51b81526004016104c0906150d1565b5f805b6020811015613223576131e581601f61501e565b6131f0906008614c32565b876131fc836006614d7e565b8151811061320c5761320c615031565b016020015160f81c901b91909117906001016131d1565b505f8660268151811061323857613238615031565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e1461327b5760405162461bcd60e51b81526004016104c090615045565b5f805b60028110156132ca5761329281600161501e565b61329d906008614c32565b61ffff168582815181106132b3576132b3615031565b016020015160f81c901b919091179060010161327e565b5061ffff8116156132ed5760405162461bcd60e51b81526004016104c09061508e565b5f805b60048110156133485761330481600361501e565b61330f906008614c32565b63ffffffff1686613321836002614d7e565b8151811061333157613331615031565b016020015160f81c901b91909117906001016132f0565b5063ffffffff811660041461336f5760405162461bcd60e51b81526004016104c0906150d1565b5f805b60208110156133c45761338681601f61501e565b613391906008614c32565b8761339d836006614d7e565b815181106133ad576133ad615031565b016020015160f81c901b9190911790600101613372565b505f805b6008811015613423576133dc81600761501e565b6133e7906008614c32565b6001600160401b0316886133fc836026614d7e565b8151811061340c5761340c615031565b016020015160f81c901b91909117906001016133c8565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206153fd833981519152914291901580613516575060028301548151613512916001600160401b031690614d7e565b8210155b1561353c576001600160401b03851660608201528181526040810151602082015261355b565b848160600181815161354e9190614d5e565b6001600160401b03169052505b606081015161356b906064614c07565b602082015160028501546001600160401b0392909216916135969190600160401b900460ff16614c32565b10156135fa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561362357846001600160401b03168160400181815161361b9190614d7e565b905250613642565b846001600160401b03168160400181815161363e919061501e565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136d357604051631afcd79f60e31b815260040160405180910390fd5b565b6136dd61368a565b6136e681613da9565b611bf2608082013560a083013561370360e0850160c08601614a49565b613714610100860160e08701615127565b61ffff1661372a610120870161010088016151e3565b61373c61014088016101208901615203565b613dca565b61374961368a565b5f8051602061539d8339815191526001600160a01b0382166137c25760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bd691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061400e565b5f610a72825f8051602061539d833981519152546001600160a01b03169061406f565b611bf2816001613430565b5f5f805160206153fd8339815191524261388f6040860160208701614a49565b6001600160401b0316116139015760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139116040850160208601614a49565b6001600160401b03166139276202a30042614d7e565b1161399a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b83356139f25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a625760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a6f604085018561521e565b9050603014613ad65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613adf83613864565b5f80613b796040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b249190614a49565b6001600160401b03168152602001613b3f60408a018a61521e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d1565b5f82815260078601602052604090209193509150613b9782826152ab565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bc4908590600401614c82565b6020604051808303815f875af1158015613be0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c049190614c49565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8657613c86614ae5565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d7b91908e01908e01614a49565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db161368a565b613db9614576565b613dc1614586565b611bf28161458e565b613dd261368a565b5f805160206153bd83398151915283613e3e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e605760405162461bcd60e51b81526004016104c090615142565b85871115613ec85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f355760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fa75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6140226001600160a01b0384168361473b565b905080515f141580156140465750808060200190518101906140449190615366565b155b15610bd657604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140b5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140d99190614c49565b90506140f06001600160a01b038516333086614748565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614134573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141589190614c49565b90508181116141be5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141c8828261501e565b95945050505050565b5f606082608001515160301461423b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142b25761427281600161501e565b61427d906008614c32565b5081515f9083908390811061429457614294615031565b60200101906001600160f81b03191690815f1a90535060010161425e565b505f5b6004811015614310576142c981600361501e565b6142d4906008614c32565b505f826142e2836002614d7e565b815181106142f2576142f2615031565b60200101906001600160f81b03191690815f1a9053506001016142b5565b505f5b602081101561436d578451816020811061432f5761432f615031565b1a60f81b8261433f836006614d7e565b8151811061434f5761434f615031565b60200101906001600160f81b03191690815f1a905350600101614313565b505f5b60208110156143cd578460200151816020811061438f5761438f615031565b1a60f81b8261439f836026614d7e565b815181106143af576143af615031565b60200101906001600160f81b03191690815f1a905350600101614370565b505f5b6008811015614441576143e481600761501e565b6143ef906008614c32565b60ff1685604001516001600160401b0316901c60f81b828260466144139190614d7e565b8151811061442357614423615031565b60200101906001600160f81b03191690815f1a9053506001016143d0565b505f5b60308110156144ac578460800151818151811061446357614463615031565b01602001516001600160f81b0319168261447e83604e614d7e565b8151811061448e5761448e615031565b60200101906001600160f81b03191690815f1a905350600101614444565b505f5b600881101561451e576144c381600761501e565b6144ce906008614c32565b60608601516001600160401b0390811691161c60f81b826144f083607e614d7e565b8151811061450057614500615031565b60200101906001600160f81b03191690815f1a9053506001016144af565b5060028160405161452f9190615381565b602060405180830381855afa15801561454a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061456d9190614c49565b94909350915050565b61457e61368a565b6136d3614781565b6136d361368a565b61459661368a565b80355f805160206153fd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145e260808401606085016151e3565b60ff16111561464f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61466060808401606085016151e3565b60ff16116146c85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146d860808301606084016151e3565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147096060830160408401614a49565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126683835f614789565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd9060840161380f565b6130a461368a565b6060814710156147ae5760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147c99190615381565b5f6040518083038185875af1925050503d805f8114614803576040519150601f19603f3d011682016040523d82523d5f602084013e614808565b606091505b5091509150611bde868383606082614828576148238261486f565b611266565b815115801561483f57506001600160a01b0384163b155b1561486857604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b5080611266565b80511561487f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148a490614d91565b5f825580601f106148b3575050565b601f0160209004905f5260205f2090810190611bf29190614913565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614927575f8155600101614914565b5090565b8015158114611bf2575f80fd5b803563ffffffff8116811461494b575f80fd5b919050565b5f805f60608486031215614962575f80fd5b8335925060208401356149748161492b565b915061498260408501614938565b90509250925092565b5f6020828403121561499b575f80fd5b5035919050565b6001600160a01b0381168114611bf2575f80fd5b5f808284036101608112156149c9575f80fd5b610140808212156149d8575f80fd5b84935083013590506149e9816149a2565b809150509250929050565b5f60208284031215614a04575f80fd5b61126682614938565b5f8060408385031215614a1e575f80fd5b614a2783614938565b946020939093013593505050565b6001600160401b0381168114611bf2575f80fd5b5f60208284031215614a59575f80fd5b813561126681614a35565b5f8060408385031215614a75575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a97575f80fd5b84356001600160401b03811115614aac575f80fd5b850160608188031215614abd575f80fd5b93506040601f1982011215614ad0575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b1d57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4560408401826001600160a01b03169052565b506060830151614b6060608401826001600160401b03169052565b506080830151614b7b60808401826001600160401b03169052565b5060a0830151614b9660a08401826001600160401b03169052565b5060c0830151614bb160c08401826001600160401b03169052565b5060e0830151614bcc60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bcc57614bcc614bd3565b6001600160401b03818116838216028082169190828114614c2a57614c2a614bd3565b505092915050565b8082028115828204841417610a7257610a72614bd3565b5f60208284031215614c59575f80fd5b5051919050565b5f5b83811015614c7a578181015183820152602001614c62565b50505f910152565b602081525f8251806020840152614ca0816040850160208701614c60565b601f01601f19169190910160400192915050565b5f82614cce57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614bcc57614bcc614bd3565b80820180821115610a7257610a72614bd3565b600181811c90821680614da557607f821691505b602082108103614dc357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e2281614d91565b806020870152604060018084165f8114614e435760018114614e5f57614e8c565b60ff19851660408a0152604084151560051b8a01019550614e8c565b895f5260205f205f5b85811015614e835781548b8201860152908301908801614e68565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614eb557614eb5614bd3565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614ef557614ef5614ebf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2357614f23614ebf565b604052919050565b805161494b8161492b565b5f8060408385031215614f47575f80fd5b82516001600160401b0380821115614f5d575f80fd5b9084019060608287031215614f70575f80fd5b614f78614ed3565b82518152602080840151614f8b816149a2565b82820152604084015183811115614fa0575f80fd5b80850194505087601f850112614fb4575f80fd5b835183811115614fc657614fc6614ebf565b614fd8601f8201601f19168301614efb565b93508084528882828701011115614fed575f80fd5b614ffc81838601848801614c60565b50826040830152819550615011818801614f2b565b9450505050509250929050565b81810381811115610a7257610a72614bd3565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611bf2575f80fd5b5f60208284031215615137575f80fd5b813561126681615118565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561519881615118565b61ffff8116905081548161ffff19821617835560208401356151b981614a35565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151f3575f80fd5b813560ff81168114611266575f80fd5b5f60208284031215615213575f80fd5b8135611266816149a2565b5f808335601e19843603018112615233575f80fd5b8301803591506001600160401b0382111561524c575f80fd5b602001915036819003821315615260575f80fd5b9250929050565b601f821115610bd657805f5260205f20601f840160051c8101602085101561528c5750805b601f840160051c820191505b81811015610fef575f8155600101615298565b81516001600160401b038111156152c4576152c4614ebf565b6152d8816152d28454614d91565b84615267565b602080601f83116001811461530b575f84156152f45750858301515b5f19600386901b1c1916600185901b178555610fed565b5f85815260208120601f198616915b828110156153395788860151825594840194600190910190840161531a565b508582101561535657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215615376575f80fd5b81516112668161492b565b5f8251615392818460208701614c60565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516155ce3803806155ce83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154818061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614968565b61036a565b005b61015f61016f3660046149a3565b610892565b6101b26101823660046149a3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed3660046149a3565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149ce565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614a0c565b610b57565b61015f61025a366004614a25565b610bf3565b6101b261026d366004614a61565b610dc3565b6101f26102803660046149a3565b610ddc565b61015f610293366004614968565b610df0565b61015f6102a6366004614a25565b61100e565b6101b26102b9366004614a7c565b611272565b6101b26102cc366004614a9c565b611285565b61015f6102df366004614a0c565b6112b1565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f6103203660046149a3565b61146e565b61015f6103333660046149a3565b6116f4565b6101cd601481565b61035361034e3660046149a3565b611803565b6040516101bc9190614b11565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153d5833981519152949193919290829060ff1660048111156103d2576103d2614afd565b60048111156103e3576103e3614afd565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f83611803565b90504260028351600481111561047757610477614afd565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153f58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153f58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118e2565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614afd565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e8689611964565b6001600160401b03169050605060ff168460c001518461067e9190614bff565b6106889190614c1f565b6001600160401b031661069c826064614c4a565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dc3565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c61565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614afd565b03610799576107998460600151611c00565b5f84606001518460a001516107ae9190614bff565b90506107ba8682611c0d565b5f6005600160991b0163ee5b48eb6107d3898686611c55565b6040518263ffffffff1660e01b81526004016107ef9190614c9a565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c61565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061545583398151915260205260408082208151610100810190925280545f8051602061541583398151915293929190829060ff1660058111156108e0576108e0614afd565b60058111156108f1576108f1614afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614afd565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c55565b6040518263ffffffff1660e01b8152600401610a1c9190614c9a565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c61565b50505050565b5f610a7264e8d4a5100083614ccc565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e72565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153d58339815191525f610b6f83611e90565b9050600481516005811115610b8657610b86614afd565b03610bd4576040808201516001600160a01b0381165f908152600a85016020529190912054610bb59190612203565b6040808201516001600160a01b03165f908152600a8401602052908120555b610bee8160400151610be98360600151610dc3565b612279565b505050565b5f805160206153d58339815191525f610c0b8461229c565b90505f80610c1c836040015161247d565b50915091505f610c2b83611803565b9050816001600160401b031681608001516001600160401b03161015610c635760405162461bcd60e51b81526004016104c090614ceb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ca85760405162461bcd60e51b81526004016104c090614d2d565b60015f87815260068701602052604090205460ff166004811115610cce57610cce614afd565b14610d375760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c4a565b5f610de682611803565b60a0015192915050565b5f805160206153d58339815191525f610e08856126b8565b5f86815260058401602052604090205460c0820151919250610e3a91620100009091046001600160401b031690614d76565b6001600160401b03168160e001516001600160401b03161015610ebb5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315611007575f610ecc8685611964565b9050605060ff168260c001518360e00151610ee79190614bff565b610ef19190614c1f565b6001600160401b0316610f05826064614c1f565b6001600160401b031610611005578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f468460600151610dc3565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610fae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd29190614c61565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fff908490614d96565b90915550505b505b5050505050565b5f805160206153d58339815191525f6110268461229c565b90505f80611037836040015161247d565b50915091505f61104683611803565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561108057611080614afd565b600481111561109157611091614afd565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111305760405162461bcd60e51b81526004016104c090614ceb565b826001600160401b03168160e001516001600160401b031611156111665760405162461bcd60e51b81526004016104c090614d2d565b60038151600481111561117b5761117b614afd565b146111cf5760405162461bcd60e51b815260206004820152603160248201525f805160206153f58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546112059190612203565b856009015f8881526020019081526020015f205f90556112308160200151610be98360600151610dc3565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f61127e833384612a61565b9392505050565b5f61128e612e5f565b611299848484612e96565b905061127e60015f8051602061543583398151915255565b5f805160206154158339815191525f6112c98361229c565b90505f806112da83604001516130cf565b915091508061133c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461135690614da9565b9050118015611388575060015f83815260088601602052604090205460ff16600581111561138657611386614afd565b145b6113a45760405162461bcd60e51b81526004016104c090614de1565b5f82815260078501602052604081206113bc916148b0565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153d583398151915293929190829060ff1660048111156114cf576114cf614afd565b60048111156114e0576114e0614afd565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561156757611567614afd565b1480611585575060038151600481111561158357611583614afd565b145b6115d95760405162461bcd60e51b815260206004820152603260248201525f805160206153f5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115e78260400151611803565b905080608001516001600160401b03165f0361166b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611698846040015184608001518560a00151611c55565b6040518263ffffffff1660e01b81526004016116b49190614c9a565b6020604051808303815f875af11580156116d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110079190614c61565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061541583398151915292919061173c90614da9565b905011801561176e575060015f83815260088301602052604090205460ff16600581111561176c5761176c614afd565b145b61178a5760405162461bcd60e51b81526004016104c090614de1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117c39190600401614e28565b6020604051808303815f875af11580156117df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bee9190614c61565b61180b6148e7565b5f8281525f805160206154558339815191526020526040908190208151610100810190925280545f80516020615415833981519152929190829060ff16600581111561185957611859614afd565b600581111561186a5761186a614afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154558339815191526020526040812060030180545f80516020615415833981519152916001600160401b03909116908361192583614eb2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156119af573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119d69190810190614f4e565b9150915080611a395760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aa09190614c61565b825114611b045760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b7a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b898460400151613270565b91509150818714611bf65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611c0a815f613448565b50565b5f9182525f80516020615455833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cce57611c8e816001615036565b611c99906008614c4a565b5081515f90839083908110611cb057611cb0615049565b60200101906001600160f81b03191690815f1a905350600101611c7a565b505f5b6004811015611d3157611ce5816003615036565b611cf0906008614c4a565b6001901c60f81b82611d03836002614d96565b81518110611d1357611d13615049565b60200101906001600160f81b03191690815f1a905350600101611cd1565b505f5b6020811015611d9357611d4881601f615036565b611d53906008614c4a565b86901c60f81b82611d65836006614d96565b81518110611d7557611d75615049565b60200101906001600160f81b03191690815f1a905350600101611d34565b505f5b6008811015611dfe57611daa816007615036565b611db5906008614c4a565b6001600160401b038616901c60f81b82611dd0836026614d96565b81518110611de057611de0615049565b60200101906001600160f81b03191690815f1a905350600101611d96565b505f5b6008811015611e6957611e15816007615036565b611e20906008614c4a565b6001600160401b038516901c60f81b82611e3b83602e614d96565b81518110611e4b57611e4b615049565b60200101906001600160f81b03191690815f1a905350600101611e01565b50949350505050565b611e7a6136a2565b611e83826136ed565b611e8c81613759565b5050565b611e986148e7565b5f805160206154158339815191525f611eb08461229c565b90505f80611ec183604001516130cf565b915091508015611f265760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f5857611f58614afd565b6005811115611f6957611f69614afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ff057611ff0614afd565b148061200e575060018251600581111561200c5761200c614afd565b145b61206d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561208257612082614afd565b0361208f57506004612093565b5060055b6020808301515f908152600988019091526040812055818160058111156120bc576120bc614afd565b908160058111156120cf576120cf614afd565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561210357612103614afd565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121ce576121ce614afd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153b583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561225e575f80fd5b505af1158015612270573d5f803e3d5ffd5b50505050505050565b5f805160206153b583398151915254611e8c906001600160a01b031683836137fa565b60408051606080820183525f8083526020830181905292820152905f805160206154158339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612311573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123389190810190614f4e565b915091508061239f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146124025760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b0316156124755760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124a15760405162461bcd60e51b81526004016104c09061505d565b5f805b60028110156124f0576124b8816001615036565b6124c3906008614c4a565b61ffff168682815181106124d9576124d9615049565b016020015160f81c901b91909117906001016124a4565b5061ffff8116156125135760405162461bcd60e51b81526004016104c0906150a6565b5f805b600481101561256e5761252a816003615036565b612535906008614c4a565b63ffffffff1687612547836002614d96565b8151811061255757612557615049565b016020015160f81c901b9190911790600101612516565b5063ffffffff81166003146125955760405162461bcd60e51b81526004016104c0906150e9565b5f805b60208110156125ea576125ac81601f615036565b6125b7906008614c4a565b886125c3836006614d96565b815181106125d3576125d3615049565b016020015160f81c901b9190911790600101612598565b505f805b600881101561264957612602816007615036565b61260d906008614c4a565b6001600160401b031689612622836026614d96565b8151811061263257612632615049565b016020015160f81c901b91909117906001016125ee565b505f805b60088110156126a857612661816007615036565b61266c906008614c4a565b6001600160401b03168a61268183602e614d96565b8151811061269157612691615049565b016020015160f81c901b919091179060010161264d565b5091989097509095509350505050565b6126c06148e7565b5f8281525f8051602061545583398151915260205260408082208151610100810190925280545f8051602061541583398151915293929190829060ff16600581111561270e5761270e614afd565b600581111561271f5761271f614afd565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a7576127a7614afd565b146128035760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b03161461287d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61288a8160a00151611c00565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128ce576128ce614afd565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61299a85612994816118e2565b5f611c55565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c9908590600401614c9a565b6020604051808303815f875af11580156129e5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a099190614c61565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a6a612e5f565b5f805160206153d58339815191525f612a856101ed85613859565b90505f612a9187611803565b9050600281516005811115612aa857612aa8614afd565b14612b075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b108261387c565b5f828260a00151612b219190614d76565b60048501546060840151919250612b43916001600160401b0390911690614c1f565b6001600160401b0316816001600160401b03161115612bc25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bcc8882611c0d565b5f612bd6896118e2565b90505f8982604051602001612c0292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c3c8d8688611c55565b6040518263ffffffff1660e01b8152600401612c589190614c9a565b6020604051808303815f875af1158015612c74573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c989190614c61565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d2057612d20614afd565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061127e60015f8051602061543583398151915255565b5f80516020615435833981519152805460011901612e9057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153d5833981519152906001600160401b0316612ee26040860160208701614a61565b6001600160401b03161015612f515760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f63602086018661513f565b61ffff1610158015612f875750612710612f80602086018661513f565b61ffff1611155b612fa35760405162461bcd60e51b81526004016104c09061515a565b80548310156130065760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b806001015483111561306d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61307784613859565b90505f61308382610a62565b90505f6130908883613887565b5f818152600586016020526040902090915087906130ae82826151a5565b509098975050505050505050565b60015f8051602061543583398151915255565b5f8082516027146130f25760405162461bcd60e51b81526004016104c09061505d565b5f805b600281101561314157613109816001615036565b613114906008614c4a565b61ffff1685828151811061312a5761312a615049565b016020015160f81c901b91909117906001016130f5565b5061ffff8116156131645760405162461bcd60e51b81526004016104c0906150a6565b5f805b60048110156131bf5761317b816003615036565b613186906008614c4a565b63ffffffff1686613198836002614d96565b815181106131a8576131a8615049565b016020015160f81c901b9190911790600101613167565b5063ffffffff81166002146131e65760405162461bcd60e51b81526004016104c0906150e9565b5f805b602081101561323b576131fd81601f615036565b613208906008614c4a565b87613214836006614d96565b8151811061322457613224615049565b016020015160f81c901b91909117906001016131e9565b505f8660268151811061325057613250615049565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132935760405162461bcd60e51b81526004016104c09061505d565b5f805b60028110156132e2576132aa816001615036565b6132b5906008614c4a565b61ffff168582815181106132cb576132cb615049565b016020015160f81c901b9190911790600101613296565b5061ffff8116156133055760405162461bcd60e51b81526004016104c0906150a6565b5f805b60048110156133605761331c816003615036565b613327906008614c4a565b63ffffffff1686613339836002614d96565b8151811061334957613349615049565b016020015160f81c901b9190911790600101613308565b5063ffffffff81166004146133875760405162461bcd60e51b81526004016104c0906150e9565b5f805b60208110156133dc5761339e81601f615036565b6133a9906008614c4a565b876133b5836006614d96565b815181106133c5576133c5615049565b016020015160f81c901b919091179060010161338a565b505f805b600881101561343b576133f4816007615036565b6133ff906008614c4a565b6001600160401b031688613414836026614d96565b8151811061342457613424615049565b016020015160f81c901b91909117906001016133e0565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061541583398151915291429190158061352e57506002830154815161352a916001600160401b031690614d96565b8210155b15613554576001600160401b038516606082015281815260408101516020820152613573565b84816060018181516135669190614d76565b6001600160401b03169052505b6060810151613583906064614c1f565b602082015160028501546001600160401b0392909216916135ae9190600160401b900460ff16614c4a565b10156136125760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561363b57846001600160401b0316816040018181516136339190614d96565b90525061365a565b846001600160401b0316816040018181516136569190615036565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136eb57604051631afcd79f60e31b815260040160405180910390fd5b565b6136f56136a2565b6136fe81613dc1565b611c0a608082013560a083013561371b60e0850160c08601614a61565b61372c610100860160e0870161513f565b61ffff16613742610120870161010088016151fb565b6137546101408801610120890161521b565b613de2565b6137616136a2565b5f805160206153b58339815191526001600160a01b0382166137da5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bee91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614026565b5f610a72825f805160206153b5833981519152546001600160a01b031690614087565b611c0a816001613448565b5f5f80516020615415833981519152426138a76040860160208701614a61565b6001600160401b0316116139195760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139296040850160208601614a61565b6001600160401b031661393f6202a30042614d96565b116139b25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b8335613a0a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a7a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a876040850185615236565b9050603014613aee5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613af78361387c565b5f80613b916040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b3c9190614a61565b6001600160401b03168152602001613b5760408a018a615236565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141e9565b5f82815260078601602052604090209193509150613baf82826152c3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bdc908590600401614c9a565b6020604051808303815f875af1158015613bf8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c1c9190614c61565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c9e57613c9e614afd565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d9391908e01908e01614a61565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613dc96136a2565b613dd161458e565b613dd961459e565b611c0a816145a6565b613dea6136a2565b5f805160206153d583398151915283613e565760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e785760405162461bcd60e51b81526004016104c09061515a565b85871115613ee05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f4d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fbf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61403a6001600160a01b03841683614753565b905080515f1415801561405e57508080602001905181019061405c919061537e565b155b15610bee57604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140f19190614c61565b90506141086001600160a01b038516333086614760565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561414c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141709190614c61565b90508181116141d65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141e08282615036565b95945050505050565b5f60608260800151516030146142535760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142ca5761428a816001615036565b614295906008614c4a565b5081515f908390839081106142ac576142ac615049565b60200101906001600160f81b03191690815f1a905350600101614276565b505f5b6004811015614328576142e1816003615036565b6142ec906008614c4a565b505f826142fa836002614d96565b8151811061430a5761430a615049565b60200101906001600160f81b03191690815f1a9053506001016142cd565b505f5b6020811015614385578451816020811061434757614347615049565b1a60f81b82614357836006614d96565b8151811061436757614367615049565b60200101906001600160f81b03191690815f1a90535060010161432b565b505f5b60208110156143e557846020015181602081106143a7576143a7615049565b1a60f81b826143b7836026614d96565b815181106143c7576143c7615049565b60200101906001600160f81b03191690815f1a905350600101614388565b505f5b6008811015614459576143fc816007615036565b614407906008614c4a565b60ff1685604001516001600160401b0316901c60f81b8282604661442b9190614d96565b8151811061443b5761443b615049565b60200101906001600160f81b03191690815f1a9053506001016143e8565b505f5b60308110156144c4578460800151818151811061447b5761447b615049565b01602001516001600160f81b0319168261449683604e614d96565b815181106144a6576144a6615049565b60200101906001600160f81b03191690815f1a90535060010161445c565b505f5b6008811015614536576144db816007615036565b6144e6906008614c4a565b60608601516001600160401b0390811691161c60f81b8261450883607e614d96565b8151811061451857614518615049565b60200101906001600160f81b03191690815f1a9053506001016144c7565b506002816040516145479190615399565b602060405180830381855afa158015614562573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145859190614c61565b94909350915050565b6145966136a2565b6136eb614799565b6136eb6136a2565b6145ae6136a2565b80355f8051602061541583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145fa60808401606085016151fb565b60ff1611156146675760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61467860808401606085016151fb565b60ff16116146e05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146f060808301606084016151fb565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147216060830160408401614a61565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061127e83835f6147a1565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd90608401613827565b6130bc6136a2565b6060814710156147c65760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147e19190615399565b5f6040518083038185875af1925050503d805f811461481b576040519150601f19603f3d011682016040523d82523d5f602084013e614820565b606091505b5091509150611bf68683836060826148405761483b82614887565b61127e565b815115801561485757506001600160a01b0384163b155b1561488057604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b508061127e565b8051156148975780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148bc90614da9565b5f825580601f106148cb575050565b601f0160209004905f5260205f2090810190611c0a919061492b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561493f575f815560010161492c565b5090565b8015158114611c0a575f80fd5b803563ffffffff81168114614963575f80fd5b919050565b5f805f6060848603121561497a575f80fd5b83359250602084013561498c81614943565b915061499a60408501614950565b90509250925092565b5f602082840312156149b3575f80fd5b5035919050565b6001600160a01b0381168114611c0a575f80fd5b5f808284036101608112156149e1575f80fd5b610140808212156149f0575f80fd5b8493508301359050614a01816149ba565b809150509250929050565b5f60208284031215614a1c575f80fd5b61127e82614950565b5f8060408385031215614a36575f80fd5b614a3f83614950565b946020939093013593505050565b6001600160401b0381168114611c0a575f80fd5b5f60208284031215614a71575f80fd5b813561127e81614a4d565b5f8060408385031215614a8d575f80fd5b50508035926020909101359150565b5f805f8385036080811215614aaf575f80fd5b84356001600160401b03811115614ac4575f80fd5b850160608188031215614ad5575f80fd5b93506040601f1982011215614ae8575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b3557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b5d60408401826001600160a01b03169052565b506060830151614b7860608401826001600160401b03169052565b506080830151614b9360808401826001600160401b03169052565b5060a0830151614bae60a08401826001600160401b03169052565b5060c0830151614bc960c08401826001600160401b03169052565b5060e0830151614be460e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614be457614be4614beb565b6001600160401b03818116838216028082169190828114614c4257614c42614beb565b505092915050565b8082028115828204841417610a7257610a72614beb565b5f60208284031215614c71575f80fd5b5051919050565b5f5b83811015614c92578181015183820152602001614c7a565b50505f910152565b602081525f8251806020840152614cb8816040850160208701614c78565b601f01601f19169190910160400192915050565b5f82614ce657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614be457614be4614beb565b80820180821115610a7257610a72614beb565b600181811c90821680614dbd57607f821691505b602082108103614ddb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e3a81614da9565b806020870152604060018084165f8114614e5b5760018114614e7757614ea4565b60ff19851660408a0152604084151560051b8a01019550614ea4565b895f5260205f205f5b85811015614e9b5781548b8201860152908301908801614e80565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ecd57614ecd614beb565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f0d57614f0d614ed7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f3b57614f3b614ed7565b604052919050565b805161496381614943565b5f8060408385031215614f5f575f80fd5b82516001600160401b0380821115614f75575f80fd5b9084019060608287031215614f88575f80fd5b614f90614eeb565b82518152602080840151614fa3816149ba565b82820152604084015183811115614fb8575f80fd5b80850194505087601f850112614fcc575f80fd5b835183811115614fde57614fde614ed7565b614ff0601f8201601f19168301614f13565b93508084528882828701011115615005575f80fd5b61501481838601848801614c78565b50826040830152819550615029818801614f43565b9450505050509250929050565b81810381811115610a7257610a72614beb565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c0a575f80fd5b5f6020828403121561514f575f80fd5b813561127e81615130565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151b081615130565b61ffff8116905081548161ffff19821617835560208401356151d181614a4d565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6020828403121561520b575f80fd5b813560ff8116811461127e575f80fd5b5f6020828403121561522b575f80fd5b813561127e816149ba565b5f808335601e1984360301811261524b575f80fd5b8301803591506001600160401b03821115615264575f80fd5b602001915036819003821315615278575f80fd5b9250929050565b601f821115610bee57805f5260205f20601f840160051c810160208510156152a45750805b601f840160051c820191505b81811015611007575f81556001016152b0565b81516001600160401b038111156152dc576152dc614ed7565b6152f0816152ea8454614da9565b8461527f565b602080601f831160018114615323575f841561530c5750858301515b5f19600386901b1c1916600185901b178555611005565b5f85815260208120601f198616915b8281101561535157888601518255948401946001909101908401615332565b508582101561536e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561538e575f80fd5b815161127e81614943565b5f82516153aa818460208701614c78565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 253fe8781..2b0241b15 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -75,8 +75,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161518738038061518783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61503a8061014d5f395ff3fe60806040526004361061013c575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103b3578063bee0a03f146103d2578063c599e24f146103f1578063c974d1b614610404578063d5f20ff614610418578063df93d8de14610444575f80fd5b806376f78621146102fd57806380a8ad941461031c57806398f3e2b41461032f578063a3a65e481461034e578063afba878a1461036d578063b771b3bc14610381575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded14610259578063467ef06f146102815780635297fae6146102a057806362065856146102bf57806366435abf146102de575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a3660046145b1565b61045a565b005b34801561016c575f80fd5b5061015f61017b3660046145ec565b610982565b34801561018b575f80fd5b506101ca61019a3660046145ec565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614603565b610b52565b34801561022d575f80fd5b5061024161023c3660046145ec565b610c2f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b34801561028c575f80fd5b5061015f61029b36600461461a565b610c45565b3480156102ab575f80fd5b5061015f6102ba366004614633565b610ca8565b3480156102ca575f80fd5b506101ca6102d936600461466f565b610e78565b3480156102e9575f80fd5b506102416102f83660046145ec565b610e91565b348015610308575f80fd5b5061015f6103173660046145b1565b610ea5565b6101ca61032a36600461468a565b6110c3565b34801561033a575f80fd5b5061015f610349366004614633565b6110ef565b348015610359575f80fd5b5061015f61036836600461461a565b611331565b348015610378575f80fd5b506101f1605081565b34801561038c575f80fd5b5061039b6005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103be575f80fd5b5061015f6103cd3660046145ec565b6114ee565b3480156103dd575f80fd5b5061015f6103ec3660046145ec565b611774565b6101ca6103ff3660046145ec565b611883565b34801561040f575f80fd5b506101f1601481565b348015610423575f80fd5b506104376104323660046145ec565b61188f565b6040516101d491906146f7565b34801561044f575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020614f8e833981519152949193919290829060ff1660048111156104c2576104c26146e3565b60048111156104d3576104d36146e3565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054f8361188f565b905042600283516004811115610567576105676146e3565b146105b95760405162461bcd60e51b815260206004820152602a60248201525f80516020614fae8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461061e5760405162461bcd60e51b815260206004820152603360248201525f80516020614fae8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b0565b5f6106288561196e565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff19166001836004811115610675576106756146e3565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610862575f61074e86896119f0565b6001600160401b03169050605060ff168460c001518461076e91906147e5565b6107789190614805565b6001600160401b031661078c826064614830565b10610860578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107c48760600151610e78565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561082b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084f9190614847565b5f8b81526009890160205260409020555b505b600283516005811115610877576108776146e3565b03610889576108898460600151611c8c565b5f84606001518460a0015161089e91906147e5565b90506108aa8682611c99565b5f6005600160991b0163ee5b48eb6108c3898686611ce1565b6040518263ffffffff1660e01b81526004016108df9190614880565b6020604051808303815f875af11580156108fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091f9190614847565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061500e83398151915260205260408082208151610100810190925280545f80516020614fce83398151915293929190829060ff1660058111156109d0576109d06146e3565b60058111156109e1576109e16146e3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a6657610a666146e3565b14610acb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb610af08584608001515f611ce1565b6040518263ffffffff1660e01b8152600401610b0c9190614880565b6020604051808303815f875af1158015610b28573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4c9190614847565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b9b575080546001600160401b03808416911610155b15610bb95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be383611f00565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c3f64e8d4a51000836148b2565b92915050565b5f80516020614f8e8339815191525f610c5d83611f11565b604081810180516001600160a01b039081165f908152600a87016020528251909116815291822091909155516060820151919250610ca391610c9e90610e78565b612288565b505050565b5f80516020614f8e8339815191525f610cc08461229b565b90505f80610cd1836040015161247c565b50915091505f610ce08361188f565b9050816001600160401b031681608001516001600160401b03161015610d185760405162461bcd60e51b81526004016105b0906148d1565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d5d5760405162461bcd60e51b81526004016105b090614913565b60015f87815260068701602052604090205460ff166004811115610d8357610d836146e3565b14610dec5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c3f6001600160401b03831664e8d4a51000614830565b5f610e9b8261188f565b60a0015192915050565b5f80516020614f8e8339815191525f610ebd856126b7565b5f86815260058401602052604090205460c0820151919250610eef91620100009091046001600160401b03169061495c565b6001600160401b03168160e001516001600160401b03161015610f705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b0565b83156110bc575f610f8186856119f0565b9050605060ff168260c001518360e00151610f9c91906147e5565b610fa69190614805565b6001600160401b0316610fba826064614805565b6001600160401b0316106110ba578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610ffb8460600151610e78565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015611063573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110879190614847565b6040808401516001600160a01b03165f908152600a860160205290812080549091906110b490849061497c565b90915550505b505b5050505050565b5f6110cc612a60565b6110d7838334612a97565b9050610c3f60015f80516020614fee83398151915255565b5f80516020614f8e8339815191525f6111078461229b565b90505f80611118836040015161247c565b50915091505f6111278361188f565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611161576111616146e3565b6004811115611172576111726146e3565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112115760405162461bcd60e51b81526004016105b0906148d1565b826001600160401b03168160e001516001600160401b031611156112475760405162461bcd60e51b81526004016105b090614913565b60038151600481111561125c5761125c6146e3565b146112b05760405162461bcd60e51b815260206004820152603160248201525f80516020614fae8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b0565b5f8781526006870160209081526040808320805460ff1916600417905560098901825282209190915581015160608201516112ef9190610c9e90610e78565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614fce8339815191525f6113498361229b565b90505f8061135a8360400151612cc5565b91509150806113bc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b0565b5f828152600785016020526040812080546113d69061498f565b9050118015611408575060015f83815260088601602052604090205460ff166005811115611406576114066146e3565b145b6114245760405162461bcd60e51b81526004016105b0906149c1565b5f828152600785016020526040812061143c916144f9565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f8e83398151915293929190829060ff16600481111561154f5761154f6146e3565b6004811115611560576115606146e3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156115e7576115e76146e3565b14806116055750600381516004811115611603576116036146e3565b145b6116595760405162461bcd60e51b815260206004820152603260248201525f80516020614fae833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b0565b5f611667826040015161188f565b905080608001516001600160401b03165f036116eb5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b0565b6005600160991b016001600160a01b031663ee5b48eb611718846040015184608001518560a00151611ce1565b6040518263ffffffff1660e01b81526004016117349190614880565b6020604051808303815f875af1158015611750573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110bc9190614847565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fce8339815191529291906117bc9061498f565b90501180156117ee575060015f83815260088301602052604090205460ff1660058111156117ec576117ec6146e3565b145b61180a5760405162461bcd60e51b81526004016105b0906149c1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118439190600401614a08565b6020604051808303815f875af115801561185f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ca39190614847565b5f610c3f823334612e66565b611897614530565b5f8281525f8051602061500e8339815191526020526040908190208151610100810190925280545f80516020614fce833981519152929190829060ff1660058111156118e5576118e56146e3565b60058111156118f6576118f66146e3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f8051602061500e8339815191526020526040812060030180545f80516020614fce833981519152916001600160401b0390911690836119b183614a92565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a3b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a629190810190614b42565b9150915080611ac55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b2c9190614847565b825114611b905760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b0565b60208201516001600160a01b031615611c065760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b0565b5f80611c158460400151613261565b91509150818714611c825760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b0565b9695505050505050565b611c96815f613439565b50565b5f9182525f8051602061500e833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611d5a57611d1a816001614c2a565b611d25906008614830565b5081515f90839083908110611d3c57611d3c614c3d565b60200101906001600160f81b03191690815f1a905350600101611d06565b505f5b6004811015611dbd57611d71816003614c2a565b611d7c906008614830565b6001901c60f81b82611d8f83600261497c565b81518110611d9f57611d9f614c3d565b60200101906001600160f81b03191690815f1a905350600101611d5d565b505f5b6020811015611e1f57611dd481601f614c2a565b611ddf906008614830565b86901c60f81b82611df183600661497c565b81518110611e0157611e01614c3d565b60200101906001600160f81b03191690815f1a905350600101611dc0565b505f5b6008811015611e8a57611e36816007614c2a565b611e41906008614830565b6001600160401b038616901c60f81b82611e5c83602661497c565b81518110611e6c57611e6c614c3d565b60200101906001600160f81b03191690815f1a905350600101611e22565b505f5b6008811015611ef557611ea1816007614c2a565b611eac906008614830565b6001600160401b038516901c60f81b82611ec783602e61497c565b81518110611ed757611ed7614c3d565b60200101906001600160f81b03191690815f1a905350600101611e8d565b5090505b9392505050565b611f08613693565b611c96816136de565b611f19614530565b5f80516020614fce8339815191525f611f318461229b565b90505f80611f428360400151612cc5565b915091508015611fa75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611fd957611fd96146e3565b6005811115611fea57611fea6146e3565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115612071576120716146e3565b148061208f575060018251600581111561208d5761208d6146e3565b145b6120ee5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b0565b600382516005811115612103576121036146e3565b0361211057506004612114565b5060055b6020808301515f9081526009880190915260408120558181600581111561213d5761213d6146e3565b90816005811115612150576121506146e3565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612184576121846146e3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561224f5761224f6146e3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5050565b6122846001600160a01b0383168261374a565b60408051606080820183525f8083526020830181905292820152905f80516020614fce8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612310573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123379190810190614b42565b915091508061239e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b0565b82548251146124015760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b0565b60208201516001600160a01b0316156124745760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b0565b509392505050565b5f805f83516036146124a05760405162461bcd60e51b81526004016105b090614c51565b5f805b60028110156124ef576124b7816001614c2a565b6124c2906008614830565b61ffff168682815181106124d8576124d8614c3d565b016020015160f81c901b91909117906001016124a3565b5061ffff8116156125125760405162461bcd60e51b81526004016105b090614c9a565b5f805b600481101561256d57612529816003614c2a565b612534906008614830565b63ffffffff168761254683600261497c565b8151811061255657612556614c3d565b016020015160f81c901b9190911790600101612515565b5063ffffffff81166003146125945760405162461bcd60e51b81526004016105b090614cdd565b5f805b60208110156125e9576125ab81601f614c2a565b6125b6906008614830565b886125c283600661497c565b815181106125d2576125d2614c3d565b016020015160f81c901b9190911790600101612597565b505f805b600881101561264857612601816007614c2a565b61260c906008614830565b6001600160401b03168961262183602661497c565b8151811061263157612631614c3d565b016020015160f81c901b91909117906001016125ed565b505f805b60088110156126a757612660816007614c2a565b61266b906008614830565b6001600160401b03168a61268083602e61497c565b8151811061269057612690614c3d565b016020015160f81c901b919091179060010161264c565b5091989097509095509350505050565b6126bf614530565b5f8281525f8051602061500e83398151915260205260408082208151610100810190925280545f80516020614fce83398151915293929190829060ff16600581111561270d5761270d6146e3565b600581111561271e5761271e6146e3565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a6576127a66146e3565b146128025760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b0565b60408101516001600160a01b0316336001600160a01b03161461287c5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b0565b6128898160a00151611c8c565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128cd576128cd6146e3565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612999856129938161196e565b5f611ce1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c8908590600401614880565b6020604051808303815f875af11580156129e4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a089190614847565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f80516020614fee833981519152805460011901612a9157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f8e833981519152906001600160401b0316612ae3604086016020870161466f565b6001600160401b03161015612b525760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b0565b6003810154612b646020860186614d33565b61ffff1610158015612b885750612710612b816020860186614d33565b61ffff1611155b612ba45760405162461bcd60e51b81526004016105b090614d4e565b8054831015612c075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b0565b8060010154831115612c6e5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b0565b825f612c7982610c2f565b90505f612c8688836137dd565b5f81815260058601602052604090209091508790612ca48282614d99565b509098975050505050505050565b60015f80516020614fee83398151915255565b5f808251602714612ce85760405162461bcd60e51b81526004016105b090614c51565b5f805b6002811015612d3757612cff816001614c2a565b612d0a906008614830565b61ffff16858281518110612d2057612d20614c3d565b016020015160f81c901b9190911790600101612ceb565b5061ffff811615612d5a5760405162461bcd60e51b81526004016105b090614c9a565b5f805b6004811015612db557612d71816003614c2a565b612d7c906008614830565b63ffffffff1686612d8e83600261497c565b81518110612d9e57612d9e614c3d565b016020015160f81c901b9190911790600101612d5d565b5063ffffffff8116600214612ddc5760405162461bcd60e51b81526004016105b090614cdd565b5f805b6020811015612e3157612df381601f614c2a565b612dfe906008614830565b87612e0a83600661497c565b81518110612e1a57612e1a614c3d565b016020015160f81c901b9190911790600101612ddf565b505f86602681518110612e4657612e46614c3d565b016020015191976001600160f81b03199092161515965090945050505050565b5f612e6f612a60565b5f80516020614f8e8339815191525f612e8784610c2f565b90505f612e938761188f565b9050600281516005811115612eaa57612eaa6146e3565b14612f095760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b0565b612f1282613d17565b5f828260a00151612f23919061495c565b60048501546060840151919250612f45916001600160401b0390911690614805565b6001600160401b0316816001600160401b03161115612fc45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b0565b612fce8882611c99565b5f612fd88961196e565b90505f898260405160200161300492919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb61303e8d8688611ce1565b6040518263ffffffff1660e01b815260040161305a9190614880565b6020604051808303815f875af1158015613076573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061309a9190614847565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613122576131226146e3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611ef960015f80516020614fee83398151915255565b5f808251602e146132845760405162461bcd60e51b81526004016105b090614c51565b5f805b60028110156132d35761329b816001614c2a565b6132a6906008614830565b61ffff168582815181106132bc576132bc614c3d565b016020015160f81c901b9190911790600101613287565b5061ffff8116156132f65760405162461bcd60e51b81526004016105b090614c9a565b5f805b60048110156133515761330d816003614c2a565b613318906008614830565b63ffffffff168661332a83600261497c565b8151811061333a5761333a614c3d565b016020015160f81c901b91909117906001016132f9565b5063ffffffff81166004146133785760405162461bcd60e51b81526004016105b090614cdd565b5f805b60208110156133cd5761338f81601f614c2a565b61339a906008614830565b876133a683600661497c565b815181106133b6576133b6614c3d565b016020015160f81c901b919091179060010161337b565b505f805b600881101561342c576133e5816007614c2a565b6133f0906008614830565b6001600160401b03168861340583602661497c565b8151811061341557613415614c3d565b016020015160f81c901b91909117906001016133d1565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614fce83398151915291429190158061351f57506002830154815161351b916001600160401b03169061497c565b8210155b15613545576001600160401b038516606082015281815260408101516020820152613564565b8481606001818151613557919061495c565b6001600160401b03169052505b6060810151613574906064614805565b602082015160028501546001600160401b03929092169161359f9190600160401b900460ff16614830565b10156136035760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b0565b831561362c57846001600160401b031681604001818151613624919061497c565b90525061364b565b846001600160401b0316816040018181516136479190614c2a565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136dc57604051631afcd79f60e31b815260040160405180910390fd5b565b6136e6613693565b6136ef81613d22565b611c96608082013560a083013561370c60e0850160c0860161466f565b61371d610100860160e08701614d33565b61ffff1661373361012087016101008801614def565b61374561014088016101208901614e0f565b613d43565b8047101561376d5760405163cd78605960e01b81523060048201526024016105b0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137b6576040519150601f19603f3d011682016040523d82523d5f602084013e6137bb565b606091505b5050905080610ca357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614fce833981519152426137fd604086016020870161466f565b6001600160401b03161161386f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b0565b61387f604085016020860161466f565b6001600160401b03166138956202a3004261497c565b116139085760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b0565b83356139605760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b0565b83355f908152600982016020526040902054156139d05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b0565b6139dd6040850185614e2a565b9050603014613a445760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b0565b613a4d83613d17565b5f80613ae76040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613a92919061466f565b6001600160401b03168152602001613aad60408a018a614e2a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f87565b5f82815260078601602052604090209193509150613b058282614eb7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613b32908590600401614880565b6020604051808303815f875af1158015613b4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b729190614847565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613bf457613bf46146e3565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ce991908e01908e0161466f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611c96816001613439565b613d2a613693565b613d3261432c565b613d3a61433c565b611c9681614344565b613d4b613693565b5f80516020614f8e83398151915283613db75760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b0565b612710841115613dd95760405162461bcd60e51b81526004016105b090614d4e565b85871115613e415760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b0565b5f8360ff1611613eae5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b0565b600a60ff84161115613f205760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613ff15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561406857614028816001614c2a565b614033906008614830565b5081515f9083908390811061404a5761404a614c3d565b60200101906001600160f81b03191690815f1a905350600101614014565b505f5b60048110156140c65761407f816003614c2a565b61408a906008614830565b505f8261409883600261497c565b815181106140a8576140a8614c3d565b60200101906001600160f81b03191690815f1a90535060010161406b565b505f5b602081101561412357845181602081106140e5576140e5614c3d565b1a60f81b826140f583600661497c565b8151811061410557614105614c3d565b60200101906001600160f81b03191690815f1a9053506001016140c9565b505f5b6020811015614183578460200151816020811061414557614145614c3d565b1a60f81b8261415583602661497c565b8151811061416557614165614c3d565b60200101906001600160f81b03191690815f1a905350600101614126565b505f5b60088110156141f75761419a816007614c2a565b6141a5906008614830565b60ff1685604001516001600160401b0316901c60f81b828260466141c9919061497c565b815181106141d9576141d9614c3d565b60200101906001600160f81b03191690815f1a905350600101614186565b505f5b6030811015614262578460800151818151811061421957614219614c3d565b01602001516001600160f81b0319168261423483604e61497c565b8151811061424457614244614c3d565b60200101906001600160f81b03191690815f1a9053506001016141fa565b505f5b60088110156142d457614279816007614c2a565b614284906008614830565b60608601516001600160401b0390811691161c60f81b826142a683607e61497c565b815181106142b6576142b6614c3d565b60200101906001600160f81b03191690815f1a905350600101614265565b506002816040516142e59190614f72565b602060405180830381855afa158015614300573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143239190614847565b94909350915050565b614334613693565b6136dc6144f1565b6136dc613693565b61434c613693565b80355f80516020614fce83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143986080840160608501614def565b60ff1611156144055760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b0565b5f6144166080840160608501614def565b60ff161161447e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b0565b61448e6080830160608401614def565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556144bf606083016040840161466f565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612cb2613693565b5080546145059061498f565b5f825580601f10614514575050565b601f0160209004905f5260205f2090810190611c969190614574565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614588575f8155600101614575565b5090565b8015158114611c96575f80fd5b803563ffffffff811681146145ac575f80fd5b919050565b5f805f606084860312156145c3575f80fd5b8335925060208401356145d58161458c565b91506145e360408501614599565b90509250925092565b5f602082840312156145fc575f80fd5b5035919050565b5f6101408284031215614614575f80fd5b50919050565b5f6020828403121561462a575f80fd5b611ef982614599565b5f8060408385031215614644575f80fd5b61464d83614599565b946020939093013593505050565b6001600160401b0381168114611c96575f80fd5b5f6020828403121561467f575f80fd5b8135611ef98161465b565b5f80828403606081121561469c575f80fd5b83356001600160401b038111156146b1575f80fd5b8401606081870312156146c2575f80fd5b92506040601f19820112156146d5575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061471b57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161474360408401826001600160a01b03169052565b50606083015161475e60608401826001600160401b03169052565b50608083015161477960808401826001600160401b03169052565b5060a083015161479460a08401826001600160401b03169052565b5060c08301516147af60c08401826001600160401b03169052565b5060e08301516147ca60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147ca576147ca6147d1565b6001600160401b03818116838216028082169190828114614828576148286147d1565b505092915050565b8082028115828204841417610c3f57610c3f6147d1565b5f60208284031215614857575f80fd5b5051919050565b5f5b83811015614878578181015183820152602001614860565b50505f910152565b602081525f825180602084015261489e81604085016020870161485e565b601f01601f19169190910160400192915050565b5f826148cc57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156147ca576147ca6147d1565b80820180821115610c3f57610c3f6147d1565b600181811c908216806149a357607f821691505b60208210810361461457634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a1a8161498f565b806020870152604060018084165f8114614a3b5760018114614a5757614a84565b60ff19851660408a0152604084151560051b8a01019550614a84565b895f5260205f205f5b85811015614a7b5781548b8201860152908301908801614a60565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614aad57614aad6147d1565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614aed57614aed614ab7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b1b57614b1b614ab7565b604052919050565b6001600160a01b0381168114611c96575f80fd5b80516145ac8161458c565b5f8060408385031215614b53575f80fd5b82516001600160401b0380821115614b69575f80fd5b9084019060608287031215614b7c575f80fd5b614b84614acb565b82518152602080840151614b9781614b23565b82820152604084015183811115614bac575f80fd5b80850194505087601f850112614bc0575f80fd5b835183811115614bd257614bd2614ab7565b614be4601f8201601f19168301614af3565b93508084528882828701011115614bf9575f80fd5b614c088183860184880161485e565b50826040830152819550614c1d818801614b37565b9450505050509250929050565b81810381811115610c3f57610c3f6147d1565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c96575f80fd5b5f60208284031215614d43575f80fd5b8135611ef981614d24565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614da481614d24565b61ffff8116905081548161ffff1982161783556020840135614dc58161465b565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614dff575f80fd5b813560ff81168114611ef9575f80fd5b5f60208284031215614e1f575f80fd5b8135611ef981614b23565b5f808335601e19843603018112614e3f575f80fd5b8301803591506001600160401b03821115614e58575f80fd5b602001915036819003821315614e6c575f80fd5b9250929050565b601f821115610ca357805f5260205f20601f840160051c81016020851015614e985750805b601f840160051c820191505b818110156110bc575f8155600101614ea4565b81516001600160401b03811115614ed057614ed0614ab7565b614ee481614ede845461498f565b84614e73565b602080601f831160018114614f17575f8415614f005750858301515b5f19600386901b1c1916600185901b1785556110ba565b5f85815260208120601f198616915b82811015614f4557888601518255948401946001909101908401614f26565b5085821015614f6257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8251614f8381846020870161485e565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161526538038061526583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151188061014d5f395ff3fe608060405260043610610147575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103d8578063bee0a03f146103f7578063c599e24f14610416578063c974d1b614610429578063d5f20ff61461043d578063df93d8de14610469575f80fd5b806376f786211461033a57806380a8ad941461035957806398f3e2b41461036c578063a3a65e481461038b578063afba878a146103aa578063b771b3bc146103be575f80fd5b8063329c3e1211610104578063329c3e121461026457806335455ded14610296578063467ef06f146102be5780635297fae6146102dd57806362065856146102fc57806366435abf1461031b575f80fd5b80630118acc41461014b5780630322ed981461016c5780630cdd09851461018b578063151d30d1146101e85780631f7a9d8f1461020e5780632e2194d81461022d575b5f80fd5b348015610156575f80fd5b5061016a61016536600461468f565b61047f565b005b348015610177575f80fd5b5061016a6101863660046146ca565b6109a7565b348015610196575f80fd5b506101d56101a53660046146ca565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101f3575f80fd5b506101fc600a81565b60405160ff90911681526020016101df565b348015610219575f80fd5b5061016a6102283660046146e1565b610b77565b348015610238575f80fd5b5061024c6102473660046146ca565b610c54565b6040516001600160401b0390911681526020016101df565b34801561026f575f80fd5b5061027e6001600160991b0181565b6040516001600160a01b0390911681526020016101df565b3480156102a1575f80fd5b506102ab61271081565b60405161ffff90911681526020016101df565b3480156102c9575f80fd5b5061016a6102d83660046146f8565b610c6a565b3480156102e8575f80fd5b5061016a6102f7366004614711565b610d06565b348015610307575f80fd5b506101d561031636600461474d565b610ed6565b348015610326575f80fd5b5061024c6103353660046146ca565b610eef565b348015610345575f80fd5b5061016a61035436600461468f565b610f03565b6101d5610367366004614768565b611121565b348015610377575f80fd5b5061016a610386366004614711565b61114d565b348015610396575f80fd5b5061016a6103a53660046146f8565b6113b1565b3480156103b5575f80fd5b506101fc605081565b3480156103c9575f80fd5b5061027e6005600160991b0181565b3480156103e3575f80fd5b5061016a6103f23660046146ca565b61156e565b348015610402575f80fd5b5061016a6104113660046146ca565b6117f4565b6101d56104243660046146ca565b611903565b348015610434575f80fd5b506101fc601481565b348015610448575f80fd5b5061045c6104573660046146ca565b61190f565b6040516101df91906147d5565b348015610474575f80fd5b5061024c6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f8051602061506c833981519152949193919290829060ff1660048111156104e7576104e76147c1565b60048111156104f8576104f86147c1565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105748361190f565b90504260028351600481111561058c5761058c6147c1565b146105de5760405162461bcd60e51b815260206004820152602a60248201525f8051602061508c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106435760405162461bcd60e51b815260206004820152603360248201525f8051602061508c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d5565b5f61064d856119ee565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561069a5761069a6147c1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610887575f6107738689611a70565b6001600160401b03169050605060ff168460c001518461079391906148c3565b61079d91906148e3565b6001600160401b03166107b182606461490e565b10610885578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107e98760600151610ed6565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa158015610850573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108749190614925565b5f8b81526009890160205260409020555b505b60028351600581111561089c5761089c6147c1565b036108ae576108ae8460600151611d0c565b5f84606001518460a001516108c391906148c3565b90506108cf8682611d19565b5f6005600160991b0163ee5b48eb6108e8898686611d61565b6040518263ffffffff1660e01b8152600401610904919061495e565b6020604051808303815f875af1158015610920573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109449190614925565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206150ec83398151915260205260408082208151610100810190925280545f805160206150ac83398151915293929190829060ff1660058111156109f5576109f56147c1565b6005811115610a0657610a066147c1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a8b57610a8b6147c1565b14610af05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d5565b6005600160991b016001600160a01b031663ee5b48eb610b158584608001515f611d61565b6040518263ffffffff1660e01b8152600401610b31919061495e565b6020604051808303815f875af1158015610b4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b719190614925565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bc0575080546001600160401b03808416911610155b15610bde5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c0883611f80565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c6464e8d4a5100083614990565b92915050565b5f8051602061506c8339815191525f610c8283611f91565b9050600481516005811115610c9957610c996147c1565b03610ce7576040808201516001600160a01b0381165f908152600a85016020529190912054610cc89190612304565b6040808201516001600160a01b03165f908152600a8401602052908120555b610d018160400151610cfc8360600151610ed6565b612362565b505050565b5f8051602061506c8339815191525f610d1e84612379565b90505f80610d2f836040015161255a565b50915091505f610d3e8361190f565b9050816001600160401b031681608001516001600160401b03161015610d765760405162461bcd60e51b81526004016105d5906149af565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dbb5760405162461bcd60e51b81526004016105d5906149f1565b60015f87815260068701602052604090205460ff166004811115610de157610de16147c1565b14610e4a5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d5565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c646001600160401b03831664e8d4a5100061490e565b5f610ef98261190f565b60a0015192915050565b5f8051602061506c8339815191525f610f1b85612795565b5f86815260058401602052604090205460c0820151919250610f4d91620100009091046001600160401b031690614a3a565b6001600160401b03168160e001516001600160401b03161015610fce5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105d5565b831561111a575f610fdf8685611a70565b9050605060ff168260c001518360e00151610ffa91906148c3565b61100491906148e3565b6001600160401b03166110188260646148e3565b6001600160401b031610611118578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6110598460600151610ed6565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa1580156110c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e59190614925565b6040808401516001600160a01b03165f908152600a86016020529081208054909190611112908490614a5a565b90915550505b505b5050505050565b5f61112a612b3e565b611135838334612b75565b9050610c6460015f805160206150cc83398151915255565b5f8051602061506c8339815191525f61116584612379565b90505f80611176836040015161255a565b50915091505f6111858361190f565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156111bf576111bf6147c1565b60048111156111d0576111d06147c1565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561126f5760405162461bcd60e51b81526004016105d5906149af565b826001600160401b03168160e001516001600160401b031611156112a55760405162461bcd60e51b81526004016105d5906149f1565b6003815160048111156112ba576112ba6147c1565b1461130e5760405162461bcd60e51b815260206004820152603160248201525f8051602061508c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d5565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546113449190612304565b856009015f8881526020019081526020015f205f905561136f8160200151610cfc8360600151610ed6565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206150ac8339815191525f6113c983612379565b90505f806113da8360400151612da3565b915091508061143c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d5565b5f8281526007850160205260408120805461145690614a6d565b9050118015611488575060015f83815260088601602052604090205460ff166005811115611486576114866147c1565b145b6114a45760405162461bcd60e51b81526004016105d590614a9f565b5f82815260078501602052604081206114bc916145d7565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061506c83398151915293929190829060ff1660048111156115cf576115cf6147c1565b60048111156115e0576115e06147c1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611667576116676147c1565b14806116855750600381516004811115611683576116836147c1565b145b6116d95760405162461bcd60e51b815260206004820152603260248201525f8051602061508c833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105d5565b5f6116e7826040015161190f565b905080608001516001600160401b03165f0361176b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105d5565b6005600160991b016001600160a01b031663ee5b48eb611798846040015184608001518560a00151611d61565b6040518263ffffffff1660e01b81526004016117b4919061495e565b6020604051808303815f875af11580156117d0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a9190614925565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150ac83398151915292919061183c90614a6d565b905011801561186e575060015f83815260088301602052604090205460ff16600581111561186c5761186c6147c1565b145b61188a5760405162461bcd60e51b81526004016105d590614a9f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118c39190600401614ae6565b6020604051808303815f875af11580156118df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d019190614925565b5f610c64823334612f44565b61191761460e565b5f8281525f805160206150ec8339815191526020526040908190208151610100810190925280545f805160206150ac833981519152929190829060ff166005811115611965576119656147c1565b6005811115611976576119766147c1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150ec8339815191526020526040812060030180545f805160206150ac833981519152916001600160401b039091169083611a3183614b70565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611abb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ae29190810190614c20565b9150915080611b455760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bac9190614925565b825114611c105760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d5565b60208201516001600160a01b031615611c865760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d5565b5f80611c95846040015161333f565b91509150818714611d025760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d5565b9695505050505050565b611d16815f613517565b50565b5f9182525f805160206150ec833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611dda57611d9a816001614d08565b611da590600861490e565b5081515f90839083908110611dbc57611dbc614d1b565b60200101906001600160f81b03191690815f1a905350600101611d86565b505f5b6004811015611e3d57611df1816003614d08565b611dfc90600861490e565b6001901c60f81b82611e0f836002614a5a565b81518110611e1f57611e1f614d1b565b60200101906001600160f81b03191690815f1a905350600101611ddd565b505f5b6020811015611e9f57611e5481601f614d08565b611e5f90600861490e565b86901c60f81b82611e71836006614a5a565b81518110611e8157611e81614d1b565b60200101906001600160f81b03191690815f1a905350600101611e40565b505f5b6008811015611f0a57611eb6816007614d08565b611ec190600861490e565b6001600160401b038616901c60f81b82611edc836026614a5a565b81518110611eec57611eec614d1b565b60200101906001600160f81b03191690815f1a905350600101611ea2565b505f5b6008811015611f7557611f21816007614d08565b611f2c90600861490e565b6001600160401b038516901c60f81b82611f4783602e614a5a565b81518110611f5757611f57614d1b565b60200101906001600160f81b03191690815f1a905350600101611f0d565b5090505b9392505050565b611f88613771565b611d16816137bc565b611f9961460e565b5f805160206150ac8339815191525f611fb184612379565b90505f80611fc28360400151612da3565b9150915080156120275760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d5565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115612059576120596147c1565b600581111561206a5761206a6147c1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156120f1576120f16147c1565b148061210f575060018251600581111561210d5761210d6147c1565b145b61216e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d5565b600382516005811115612183576121836147c1565b0361219057506004612194565b5060055b6020808301515f908152600988019091526040812055818160058111156121bd576121bd6147c1565b908160058111156121d0576121d06147c1565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612204576122046147c1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156122cf576122cf6147c1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612350575f80fd5b505af1158015611118573d5f803e3d5ffd5b6123756001600160a01b03831682613828565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206150ac8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156123ee573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124159190810190614c20565b915091508061247c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d5565b82548251146124df5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d5565b60208201516001600160a01b0316156125525760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d5565b509392505050565b5f805f835160361461257e5760405162461bcd60e51b81526004016105d590614d2f565b5f805b60028110156125cd57612595816001614d08565b6125a090600861490e565b61ffff168682815181106125b6576125b6614d1b565b016020015160f81c901b9190911790600101612581565b5061ffff8116156125f05760405162461bcd60e51b81526004016105d590614d78565b5f805b600481101561264b57612607816003614d08565b61261290600861490e565b63ffffffff1687612624836002614a5a565b8151811061263457612634614d1b565b016020015160f81c901b91909117906001016125f3565b5063ffffffff81166003146126725760405162461bcd60e51b81526004016105d590614dbb565b5f805b60208110156126c75761268981601f614d08565b61269490600861490e565b886126a0836006614a5a565b815181106126b0576126b0614d1b565b016020015160f81c901b9190911790600101612675565b505f805b6008811015612726576126df816007614d08565b6126ea90600861490e565b6001600160401b0316896126ff836026614a5a565b8151811061270f5761270f614d1b565b016020015160f81c901b91909117906001016126cb565b505f805b60088110156127855761273e816007614d08565b61274990600861490e565b6001600160401b03168a61275e83602e614a5a565b8151811061276e5761276e614d1b565b016020015160f81c901b919091179060010161272a565b5091989097509095509350505050565b61279d61460e565b5f8281525f805160206150ec83398151915260205260408082208151610100810190925280545f805160206150ac83398151915293929190829060ff1660058111156127eb576127eb6147c1565b60058111156127fc576127fc6147c1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612884576128846147c1565b146128e05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d5565b60408101516001600160a01b0316336001600160a01b03161461295a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d5565b6129678160a00151611d0c565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156129ab576129ab6147c1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612a7785612a71816119ee565b5f611d61565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612aa690859060040161495e565b6020604051808303815f875af1158015612ac2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ae69190614925565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f805160206150cc833981519152805460011901612b6f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061506c833981519152906001600160401b0316612bc1604086016020870161474d565b6001600160401b03161015612c305760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105d5565b6003810154612c426020860186614e11565b61ffff1610158015612c665750612710612c5f6020860186614e11565b61ffff1611155b612c825760405162461bcd60e51b81526004016105d590614e2c565b8054831015612ce55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105d5565b8060010154831115612d4c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105d5565b825f612d5782610c54565b90505f612d6488836138bb565b5f81815260058601602052604090209091508790612d828282614e77565b509098975050505050505050565b60015f805160206150cc83398151915255565b5f808251602714612dc65760405162461bcd60e51b81526004016105d590614d2f565b5f805b6002811015612e1557612ddd816001614d08565b612de890600861490e565b61ffff16858281518110612dfe57612dfe614d1b565b016020015160f81c901b9190911790600101612dc9565b5061ffff811615612e385760405162461bcd60e51b81526004016105d590614d78565b5f805b6004811015612e9357612e4f816003614d08565b612e5a90600861490e565b63ffffffff1686612e6c836002614a5a565b81518110612e7c57612e7c614d1b565b016020015160f81c901b9190911790600101612e3b565b5063ffffffff8116600214612eba5760405162461bcd60e51b81526004016105d590614dbb565b5f805b6020811015612f0f57612ed181601f614d08565b612edc90600861490e565b87612ee8836006614a5a565b81518110612ef857612ef8614d1b565b016020015160f81c901b9190911790600101612ebd565b505f86602681518110612f2457612f24614d1b565b016020015191976001600160f81b03199092161515965090945050505050565b5f612f4d612b3e565b5f8051602061506c8339815191525f612f6584610c54565b90505f612f718761190f565b9050600281516005811115612f8857612f886147c1565b14612fe75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d5565b612ff082613df5565b5f828260a001516130019190614a3a565b60048501546060840151919250613023916001600160401b03909116906148e3565b6001600160401b0316816001600160401b031611156130a25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105d5565b6130ac8882611d19565b5f6130b6896119ee565b90505f89826040516020016130e292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb61311c8d8688611d61565b6040518263ffffffff1660e01b8152600401613138919061495e565b6020604051808303815f875af1158015613154573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131789190614925565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613200576132006147c1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f7960015f805160206150cc83398151915255565b5f808251602e146133625760405162461bcd60e51b81526004016105d590614d2f565b5f805b60028110156133b157613379816001614d08565b61338490600861490e565b61ffff1685828151811061339a5761339a614d1b565b016020015160f81c901b9190911790600101613365565b5061ffff8116156133d45760405162461bcd60e51b81526004016105d590614d78565b5f805b600481101561342f576133eb816003614d08565b6133f690600861490e565b63ffffffff1686613408836002614a5a565b8151811061341857613418614d1b565b016020015160f81c901b91909117906001016133d7565b5063ffffffff81166004146134565760405162461bcd60e51b81526004016105d590614dbb565b5f805b60208110156134ab5761346d81601f614d08565b61347890600861490e565b87613484836006614a5a565b8151811061349457613494614d1b565b016020015160f81c901b9190911790600101613459565b505f805b600881101561350a576134c3816007614d08565b6134ce90600861490e565b6001600160401b0316886134e3836026614a5a565b815181106134f3576134f3614d1b565b016020015160f81c901b91909117906001016134af565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206150ac8339815191529142919015806135fd5750600283015481516135f9916001600160401b031690614a5a565b8210155b15613623576001600160401b038516606082015281815260408101516020820152613642565b84816060018181516136359190614a3a565b6001600160401b03169052505b60608101516136529060646148e3565b602082015160028501546001600160401b03929092169161367d9190600160401b900460ff1661490e565b10156136e15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105d5565b831561370a57846001600160401b0316816040018181516137029190614a5a565b905250613729565b846001600160401b0316816040018181516137259190614d08565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166137ba57604051631afcd79f60e31b815260040160405180910390fd5b565b6137c4613771565b6137cd81613e00565b611d16608082013560a08301356137ea60e0850160c0860161474d565b6137fb610100860160e08701614e11565b61ffff1661381161012087016101008801614ecd565b61382361014088016101208901614eed565b613e21565b8047101561384b5760405163cd78605960e01b81523060048201526024016105d5565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613894576040519150601f19603f3d011682016040523d82523d5f602084013e613899565b606091505b5050905080610d0157604051630a12f52160e11b815260040160405180910390fd5b5f5f805160206150ac833981519152426138db604086016020870161474d565b6001600160401b03161161394d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105d5565b61395d604085016020860161474d565b6001600160401b03166139736202a30042614a5a565b116139e65760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105d5565b8335613a3e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d5565b83355f90815260098201602052604090205415613aae5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d5565b613abb6040850185614f08565b9050603014613b225760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d5565b613b2b83613df5565b5f80613bc56040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b70919061474d565b6001600160401b03168152602001613b8b60408a018a614f08565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614065565b5f82815260078601602052604090209193509150613be38282614f95565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613c1090859060040161495e565b6020604051808303815f875af1158015613c2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c509190614925565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613cd257613cd26147c1565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613dc791908e01908e0161474d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611d16816001613517565b613e08613771565b613e1061440a565b613e1861441a565b611d1681614422565b613e29613771565b5f8051602061506c83398151915283613e955760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105d5565b612710841115613eb75760405162461bcd60e51b81526004016105d590614e2c565b85871115613f1f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105d5565b5f8360ff1611613f8c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105d5565b600a60ff84161115613ffe5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105d5565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146140cf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561414657614106816001614d08565b61411190600861490e565b5081515f9083908390811061412857614128614d1b565b60200101906001600160f81b03191690815f1a9053506001016140f2565b505f5b60048110156141a45761415d816003614d08565b61416890600861490e565b505f82614176836002614a5a565b8151811061418657614186614d1b565b60200101906001600160f81b03191690815f1a905350600101614149565b505f5b602081101561420157845181602081106141c3576141c3614d1b565b1a60f81b826141d3836006614a5a565b815181106141e3576141e3614d1b565b60200101906001600160f81b03191690815f1a9053506001016141a7565b505f5b6020811015614261578460200151816020811061422357614223614d1b565b1a60f81b82614233836026614a5a565b8151811061424357614243614d1b565b60200101906001600160f81b03191690815f1a905350600101614204565b505f5b60088110156142d557614278816007614d08565b61428390600861490e565b60ff1685604001516001600160401b0316901c60f81b828260466142a79190614a5a565b815181106142b7576142b7614d1b565b60200101906001600160f81b03191690815f1a905350600101614264565b505f5b603081101561434057846080015181815181106142f7576142f7614d1b565b01602001516001600160f81b0319168261431283604e614a5a565b8151811061432257614322614d1b565b60200101906001600160f81b03191690815f1a9053506001016142d8565b505f5b60088110156143b257614357816007614d08565b61436290600861490e565b60608601516001600160401b0390811691161c60f81b8261438483607e614a5a565b8151811061439457614394614d1b565b60200101906001600160f81b03191690815f1a905350600101614343565b506002816040516143c39190615050565b602060405180830381855afa1580156143de573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906144019190614925565b94909350915050565b614412613771565b6137ba6145cf565b6137ba613771565b61442a613771565b80355f805160206150ac83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146144766080840160608501614ecd565b60ff1611156144e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105d5565b5f6144f46080840160608501614ecd565b60ff161161455c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105d5565b61456c6080830160608401614ecd565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561459d606083016040840161474d565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612d90613771565b5080546145e390614a6d565b5f825580601f106145f2575050565b601f0160209004905f5260205f2090810190611d169190614652565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614666575f8155600101614653565b5090565b8015158114611d16575f80fd5b803563ffffffff8116811461468a575f80fd5b919050565b5f805f606084860312156146a1575f80fd5b8335925060208401356146b38161466a565b91506146c160408501614677565b90509250925092565b5f602082840312156146da575f80fd5b5035919050565b5f61014082840312156146f2575f80fd5b50919050565b5f60208284031215614708575f80fd5b611f7982614677565b5f8060408385031215614722575f80fd5b61472b83614677565b946020939093013593505050565b6001600160401b0381168114611d16575f80fd5b5f6020828403121561475d575f80fd5b8135611f7981614739565b5f80828403606081121561477a575f80fd5b83356001600160401b0381111561478f575f80fd5b8401606081870312156147a0575f80fd5b92506040601f19820112156147b3575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106147f957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161482160408401826001600160a01b03169052565b50606083015161483c60608401826001600160401b03169052565b50608083015161485760808401826001600160401b03169052565b5060a083015161487260a08401826001600160401b03169052565b5060c083015161488d60c08401826001600160401b03169052565b5060e08301516148a860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156148a8576148a86148af565b6001600160401b03818116838216028082169190828114614906576149066148af565b505092915050565b8082028115828204841417610c6457610c646148af565b5f60208284031215614935575f80fd5b5051919050565b5f5b8381101561495657818101518382015260200161493e565b50505f910152565b602081525f825180602084015261497c81604085016020870161493c565b601f01601f19169190910160400192915050565b5f826149aa57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156148a8576148a86148af565b80820180821115610c6457610c646148af565b600181811c90821680614a8157607f821691505b6020821081036146f257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614af881614a6d565b806020870152604060018084165f8114614b195760018114614b3557614b62565b60ff19851660408a0152604084151560051b8a01019550614b62565b895f5260205f205f5b85811015614b595781548b8201860152908301908801614b3e565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b8b57614b8b6148af565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614bcb57614bcb614b95565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614bf957614bf9614b95565b604052919050565b6001600160a01b0381168114611d16575f80fd5b805161468a8161466a565b5f8060408385031215614c31575f80fd5b82516001600160401b0380821115614c47575f80fd5b9084019060608287031215614c5a575f80fd5b614c62614ba9565b82518152602080840151614c7581614c01565b82820152604084015183811115614c8a575f80fd5b80850194505087601f850112614c9e575f80fd5b835183811115614cb057614cb0614b95565b614cc2601f8201601f19168301614bd1565b93508084528882828701011115614cd7575f80fd5b614ce68183860184880161493c565b50826040830152819550614cfb818801614c15565b9450505050509250929050565b81810381811115610c6457610c646148af565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611d16575f80fd5b5f60208284031215614e21575f80fd5b8135611f7981614e02565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e8281614e02565b61ffff8116905081548161ffff1982161783556020840135614ea381614739565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614edd575f80fd5b813560ff81168114611f79575f80fd5b5f60208284031215614efd575f80fd5b8135611f7981614c01565b5f808335601e19843603018112614f1d575f80fd5b8301803591506001600160401b03821115614f36575f80fd5b602001915036819003821315614f4a575f80fd5b9250929050565b601f821115610d0157805f5260205f20601f840160051c81016020851015614f765750805b601f840160051c820191505b8181101561111a575f8155600101614f82565b81516001600160401b03811115614fae57614fae614b95565b614fc281614fbc8454614a6d565b84614f51565b602080601f831160018114614ff5575f8415614fde5750858301515b5f19600386901b1c1916600185901b178555611118565b5f85815260208120601f198616915b8281101561502357888601518255948401946001909101908401615004565b508582101561504057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f825161506181846020870161493c565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -370,6 +370,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMU return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) } +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) NATIVEMINTER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "NATIVE_MINTER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) NATIVEMINTER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) +} + +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) NATIVEMINTER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) +} + // UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. // // Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 721c80a9a..f08264082 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -6,6 +6,8 @@ pragma solidity 0.8.25; import {INativeTokenStakingManager} from "./interfaces/INativeTokenStakingManager.sol"; +import {INativeMinter} from + "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/INativeMinter.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"; @@ -24,6 +26,9 @@ contract NativeTokenStakingManager is { using Address for address payable; + INativeMinter public constant NATIVE_MINTER = + INativeMinter(0x0200000000000000000000000000000000000001); + constructor(ICMInitializable init) { if (init == ICMInitializable.Disallowed) { _disableInitializers(); @@ -85,6 +90,6 @@ contract NativeTokenStakingManager is // solhint-disable-next-line no-empty-blocks function _reward(address account, uint256 amount) internal virtual override { - // TODO: call the native minter precompile to mint `amount` for `account` + NATIVE_MINTER.mintNativeCoin(account, amount); } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 9dca36b01..33527bbe4 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -173,9 +173,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Validator memory validator = _completeEndValidation(messageIndex); - _reward(validator.owner, $._redeemableValidatorRewards[validator.owner]); - delete $._redeemableValidatorRewards[validator.owner]; + if (validator.status == ValidatorStatus.Completed) { + _reward(validator.owner, $._redeemableValidatorRewards[validator.owner]); + delete $._redeemableValidatorRewards[validator.owner]; + } + // We unlock the state whether the validation period is completed or invalidated. _unlock(validator.owner, weightToValue(validator.startingWeight)); } diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 72634d056..4a7ebdb9a 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -30,7 +30,6 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ERC20TokenStakingManager public app; IERC20Mintable public token; - ExampleRewardCalculator public rewardCalculator; function setUp() public virtual { // Construct the object under test diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 80a8dfc9b..1941b7eb3 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -18,6 +18,8 @@ import { import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; +import {INativeMinter} from + "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/INativeMinter.sol"; // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks @@ -27,6 +29,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function setUp() public virtual { // Construct the object under test app = new NativeTokenStakingManager(ICMInitializable.Allowed); + rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -40,25 +43,13 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { minimumStakeDuration: DEFAULT_MINIMUM_STAKE_DURATION, minimumDelegationFeeBips: DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, maximumStakeMultiplier: DEFAULT_MAXIMUM_STAKE_MULTIPLIER, - rewardCalculator: IRewardCalculator(new ExampleRewardCalculator(DEFAULT_REWARD_RATE)) + rewardCalculator: rewardCalculator }) ); validatorManager = app; posValidatorManager = app; } - function testCompleteEndValidation() public override { - // TODO: get native token staking rewards working, then remove this - // method and let the implementation in PosValidatorManagerTests do the - // test, and remove the `virtual` modifier from that implementation. - } - - function testCompleteEndDelegation() public override { - // TODO: get native token staking rewards working, then remove this - // method and let the implementation in PosValidatorManagerTests do the - // test, and remove the `virtual` modifier from that implementation. - } - function testZeroMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); vm.expectRevert(_formatErrorMessage("zero delegation fee")); @@ -209,7 +200,21 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { vm.expectCall(account, amount, ""); } - function _expectRewardIssuance(address account, uint256 amount) internal override {} + function _expectRewardIssuance(address account, uint256 amount) internal override { + vm.mockCall( + address(app.NATIVE_MINTER()), + abi.encodeCall(INativeMinter.mintNativeCoin, (account, amount)), + "" + ); + // empty calldata implies the receive function will be called: + vm.mockCall({ + callee: account, + msgValue: amount, + data: "", // implies receive() + returnData: "" + }); + vm.deal(account, account.balance + amount); + } function _getStakeAssetBalance(address account) internal view override returns (uint256) { return account.balance; diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 9759d1ec4..dee49c225 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -5,6 +5,7 @@ pragma solidity 0.8.25; +import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; import {PoSValidatorRequirements} from "../interfaces/IPoSValidatorManager.sol"; @@ -33,6 +34,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 public constant SECONDS_IN_YEAR = 31536000; PoSValidatorManager public posValidatorManager; + ExampleRewardCalculator public rewardCalculator; event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); @@ -499,7 +501,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validatorManager.resendEndValidatorMessage(validationID); } - function testCompleteEndDelegation() public virtual { + function testCompleteEndDelegation() public { uint256 registrationDuration = DEFAULT_MINIMUM_STAKE_DURATION; uint256 registrationExpiry = @@ -540,14 +542,31 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator = DEFAULT_DELEGATOR_ADDRESS; uint256 balanceBefore = _getStakeAssetBalance(delegator); - uint256 expectedReward = _weightToValue(DEFAULT_DELEGATOR_WEIGHT) * DEFAULT_REWARD_RATE - * registrationDuration / 10000 / SECONDS_IN_YEAR; + uint256 expectedReward = rewardCalculator.calculateReward( + _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + uint64(registrationExpiry), + 0, + 0 + ); _expectStakeUnlock(delegator, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); _expectRewardIssuance(delegator, expectedReward); - _setUpCompleteEndDelegation(validationID, delegationID, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 2); + _setUpCompleteEndDelegation({ + validationID: validationID, + delegationID: delegationID, + delegator: delegator, + delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, + expectedReward: expectedReward, + validatorWeight: DEFAULT_WEIGHT, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); - uint256 balanceChange = _getStakeAssetBalance(delegator) - balanceBefore; + uint256 balanceAfter = _getStakeAssetBalance(delegator); + vm.assertEq(balanceAfter, balanceAfter); + vm.assertEq(expectedReward, expectedReward); + uint256 balanceChange = balanceAfter - balanceBefore; require( balanceChange == _weightToValue(DEFAULT_DELEGATOR_WEIGHT) + expectedReward, "delegator should have received their stake back and been rewarded" @@ -695,7 +714,22 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) - _setUpCompleteEndDelegation(validationID, delegationID1, DEFAULT_WEIGHT, DEFAULT_WEIGHT, 4); + _setUpCompleteEndDelegation({ + validationID: validationID, + delegationID: delegationID1, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, + expectedReward: rewardCalculator.calculateReward( + DEFAULT_DELEGATOR_WEIGHT, + DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + 0, + 0 + ), + validatorWeight: DEFAULT_WEIGHT, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 4 + }); } function testCompleteEndValidation() public virtual override { @@ -863,6 +897,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _setUpCompleteEndDelegation( bytes32 validationID, bytes32 delegationID, + address delegator, + uint256 delegatorWeight, + uint256 expectedReward, uint64 validatorWeight, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -874,6 +911,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegationEnded(delegationID, validationID, expectedNonce); + _expectStakeUnlock(delegator, delegatorWeight); + _expectRewardIssuance(delegator, expectedReward); posValidatorManager.completeEndDelegation(0, delegationID); assertEq(posValidatorManager.getWeight(validationID), expectedValidatorWeight); return delegationID; From 38be7d97869050dbea15a69a8d36ba841043579e Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Mon, 16 Sep 2024 16:46:46 -0400 Subject: [PATCH 294/545] update initial validator set verification to take into account extra 4 bytes for length --- contracts/staking/ValidatorManager.sol | 76 ++++++++++--------- contracts/staking/ValidatorMessages.sol | 15 ++-- .../staking/interfaces/IValidatorManager.sol | 2 +- 3 files changed, 48 insertions(+), 45 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index cfa1bac41..6c7a6b441 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -110,56 +110,33 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); require(!$._initializedValidatorSet, "ValidatorManager: already initialized validator set"); - - WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); - // Parse the Warp message into SubnetConversionMessage - bytes32 subnetConversionID = - ValidatorMessages.unpackSubnetConversionMessage(warpMessage.payload); - - // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's subnetConversionID. - bytes memory encodedConversion = abi.encodePacked( - subnetConversionData.convertSubnetTxID, - subnetConversionData.blockchainID, - subnetConversionData.validatorManagerAddress - ); - uint256 numInitialValidators = subnetConversionData.initialValidators.length; - for (uint256 i; i < numInitialValidators; i++) { - InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; - encodedConversion = abi.encodePacked( - encodedConversion, - initialValidator.nodeID, - initialValidator.weight, - initialValidator.blsPublicKey - ); - } - require( - sha256(encodedConversion) == subnetConversionID, - "ValidatorManager: invalid subnet conversion ID" - ); require( subnetConversionData.blockchainID == WARP_MESSENGER.getBlockchainID(), "ValidatorManager: invalid blockchain ID" ); - - // TODO: might have more efficient conversion with assembly, check length of bytes require( - subnetConversionData.validatorManagerAddress.length == 20, - "ValidatorManager: invalid validator manager address length" - ); - require( - address(bytes20(subnetConversionData.validatorManagerAddress)) == address(this), + address(subnetConversionData.validatorManagerAddress) == address(this), "ValidatorManager: invalid validator manager address" ); require( subnetConversionData.initialValidators.length > 0, "ValidatorManager: no initial validators" ); + uint256 numInitialValidators = subnetConversionData.initialValidators.length; + require( + numInitialValidators < type(uint32).max, "ValidatorManager: too many initial validators" + ); - // Insert the initial validators into the storage. + // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's subnetConversionID. + bytes memory encodedConversion = abi.encodePacked( + subnetConversionData.convertSubnetTxID, + subnetConversionData.blockchainID, + uint32(20), + subnetConversionData.validatorManagerAddress, + uint32(numInitialValidators) + ); for (uint256 i; i < numInitialValidators; i++) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; - bytes32 validationID = - sha256(abi.encodePacked(subnetConversionData.convertSubnetTxID, i)); bytes32 nodeID = initialValidator.nodeID; require(nodeID != bytes32(0), "ValidatorManager: invalid node ID"); require( @@ -171,6 +148,20 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida "ValidatorManager: invalid blsPublicKey length" ); + // Continue to encode the initial validators. + encodedConversion = abi.encodePacked( + encodedConversion, + initialValidator.nodeID, + initialValidator.weight, + initialValidator.blsPublicKey + ); + + // Validation ID of the initial validators is the sha256 hash of the + // convert Subnet tx ID and the index of the initial validator. + bytes32 validationID = + sha256(abi.encodePacked(subnetConversionData.convertSubnetTxID, i)); + + // Save the initial validator as an active validator. $._activeValidators[nodeID] = validationID; $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.Active, @@ -178,7 +169,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida startingWeight: initialValidator.weight, messageNonce: 0, weight: initialValidator.weight, - startedAt: 0, // The validation period only starts once the registration is acknowledged. + startedAt: uint64(block.timestamp), endedAt: 0 }); @@ -186,6 +177,17 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida validationID, initialValidator.nodeID, initialValidator.weight ); } + + // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's subnetConversionID. + WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); + // Parse the Warp message into SubnetConversionMessage + bytes32 subnetConversionID = + ValidatorMessages.unpackSubnetConversionMessage(warpMessage.payload); + require( + sha256(encodedConversion) == subnetConversionID, + "ValidatorManager: invalid subnet conversion ID" + ); + $._initializedValidatorSet = true; } diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index 4e4f0531b..167bbc9f2 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -19,26 +19,27 @@ library ValidatorMessages { // The P-Chain uses a hardcoded codecID of 0 for all messages. uint16 internal constant CODEC_ID = 0; + // The P-Chain signs a SubnetConversion message that is used to verify for the Subnet's initial validators. + uint32 internal constant SUBNET_CONVERSION_MESSAGE_TYPE_ID = 5; + // Subnets send a RegisterSubnetValidator message to the P-Chain to register a validator. - uint32 internal constant REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID = 0; + uint32 internal constant REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID = 1; // Subnets can send a SetSubnetValidatorWeight message to the P-Chain to update a validator's weight. // The P-Chain responds with a SetSubnetValidatorWeight message acknowledging the weight update. - uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID = 1; + uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID = 2; // The P-Chain responds with a RegisterSubnetValidator message indicating whether the registration was successful // for the given validation ID. - uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 2; + uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 3; // The P-Chain responds with a SubnetValidatorWeightUpdateMessage message indicating whether the weight update was successful // for the given validation ID. - uint32 internal constant SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID = 3; + uint32 internal constant SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID = 4; // The Subnet will self-sign a ValidationUptimeMessage to be provided when a validator is initiating // the end of their validation period. - uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 4; - - uint32 internal constant SUBNET_CONVERSION_MESSAGE_TYPE_ID = 5; + uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 5; // TODO: The implementation of these packing and unpacking functions is neither tested nor optimized at all. // Full test coverage should be provided, and the implementation should be optimized for gas efficiency. diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 8bba89223..072d75b1e 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -41,7 +41,7 @@ struct ValidatorManagerSettings { struct SubnetConversionData { bytes32 convertSubnetTxID; bytes32 blockchainID; - bytes validatorManagerAddress; + address validatorManagerAddress; InitialValidator[] initialValidators; } From 28061988a0c60dffa2ebb34716da6cd6ce59a732 Mon Sep 17 00:00:00 2001 From: minghinmatthewlam Date: Mon, 16 Sep 2024 17:04:41 -0400 Subject: [PATCH 295/545] Update contracts/staking/ValidatorMessages.sol Co-authored-by: Ian Suvak Signed-off-by: minghinmatthewlam --- contracts/staking/ValidatorMessages.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index 167bbc9f2..f77343205 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -20,7 +20,7 @@ library ValidatorMessages { uint16 internal constant CODEC_ID = 0; // The P-Chain signs a SubnetConversion message that is used to verify for the Subnet's initial validators. - uint32 internal constant SUBNET_CONVERSION_MESSAGE_TYPE_ID = 5; + uint32 internal constant SUBNET_CONVERSION_MESSAGE_TYPE_ID = 0; // Subnets send a RegisterSubnetValidator message to the P-Chain to register a validator. uint32 internal constant REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID = 1; From 05cb8d7c716af95473f491d04c1f3a60e54a144e Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Mon, 16 Sep 2024 17:05:45 -0400 Subject: [PATCH 296/545] pack subnet conversion message --- contracts/staking/ValidatorMessages.sol | 22 +++++++++++++++++++ .../staking/tests/ValidatorManagerTests.t.sol | 4 ++++ 2 files changed, 26 insertions(+) diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index f77343205..21d12e90a 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -44,6 +44,28 @@ library ValidatorMessages { // TODO: The implementation of these packing and unpacking functions is neither tested nor optimized at all. // Full test coverage should be provided, and the implementation should be optimized for gas efficiency. + function packSubnetConversionMessage(bytes32 subnetConversionID) + internal + pure + returns (bytes memory) + { + bytes memory res = new bytes(38); + // Pack the codec ID + for (uint256 i; i < 2; ++i) { + res[i] = bytes1(uint8(CODEC_ID >> uint8((8 * (1 - i))))); + } + // Pack the type ID + for (uint256 i; i < 4; ++i) { + res[i + 2] = bytes1(uint8(SUBNET_CONVERSION_MESSAGE_TYPE_ID >> uint8((8 * (3 - i))))); + } + // Pack the subnetConversionID + for (uint256 i; i < 32; ++i) { + res[i + 6] = bytes1(uint8(uint256(subnetConversionID >> (8 * (31 - i))))); + } + + return res; + } + function unpackSubnetConversionMessage(bytes memory input) internal pure returns (bytes32) { require(input.length == 38, "ValidatorMessages: invalid message length"); diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index a7f242d9e..5913cb5d0 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -334,6 +334,10 @@ abstract contract ValidatorManagerTest is Test { ); } + function _mockInitializeValidatorSet() internal { + // _mockGetVerifiedWarpMessage() + } + function _initializeValidatorRegistration( ValidatorRegistrationInput memory input, uint64 weight From db1867d22a4b44788c14b21e227f4444e9e9ff32 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Mon, 16 Sep 2024 17:20:59 -0400 Subject: [PATCH 297/545] gets through signing step but fails the subnetconversion hash check --- abi-bindings/go/packer/packer_test.go | 2 - .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- .../go/staking/PoAValidatorManager/packing.go | 68 ++++++++----------- contracts/staking/ValidatorManager.sol | 2 +- contracts/staking/ValidatorMessages.sol | 14 ++-- go.mod | 2 +- go.sum | 4 ++ tests/flows/staking/poa_validator_manager.go | 63 +++++++---------- tests/utils/staking.go | 48 +++++++++++++ 11 files changed, 116 insertions(+), 93 deletions(-) diff --git a/abi-bindings/go/packer/packer_test.go b/abi-bindings/go/packer/packer_test.go index cdab92c62..196f64976 100644 --- a/abi-bindings/go/packer/packer_test.go +++ b/abi-bindings/go/packer/packer_test.go @@ -14,7 +14,6 @@ import ( "testing" validatorsetsig "github.com/ava-labs/teleporter/abi-bindings/go/governance/ValidatorSetSig" - poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" teleporterregistry "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/registry/TeleporterRegistry" @@ -39,7 +38,6 @@ var packerTypes = map[string]ABIPacker{ "ValidatorSetSigMessage": &validatorsetsig.ValidatorSetSigMessage{}, "TeleporterMessage": &teleportermessenger.TeleporterMessage{}, "ProtocolRegistryEntry": &teleporterregistry.ProtocolRegistryEntry{}, - "SubnetConversionData": &poavalidatormanager.SubnetConversionData{}, } // findAllImplementers returns names of all structs that implement the ABIPacker interface diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 42b6d644c..70b7049a0 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -74,7 +74,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161599838038061599883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61584b8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806366435abf116100a9578063b771b3bc1161006e578063b771b3bc146102b0578063ba3a4b97146102d6578063be768a9d146102e9578063bee0a03f146102fc578063eb0acb891461030f575f80fd5b806366435abf1461025157806376f786211461026457806398f3e2b4146102775780639e1bc4ef1461028a578063a3a65e481461029d575f80fd5b806335455ded116100ef57806335455ded146101e9578063467ef06f146102055780635297fae614610218578063561404fd1461022b578063620658561461023e575f80fd5b80630118acc41461012b5780630322ed98146101405780630cdd098514610153578063151d30d1146101a45780632e2194d8146101be575b5f80fd5b61013e610139366004614b51565b610322565b005b61013e61014e366004614b8c565b61078c565b610191610161366004614b8c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101ac600a81565b60405160ff909116815260200161019b565b6101d16101cc366004614b8c565b610945565b6040516001600160401b03909116815260200161019b565b6101f261271081565b60405161ffff909116815260200161019b565b61013e610213366004614ba3565b61095b565b61013e610226366004614bbc565b6109ae565b61013e610239366004614be4565b610b83565b61019161024c366004614c48565b611289565b6101d161025f366004614b8c565b6112a2565b61013e610272366004614b51565b6112b6565b61013e610285366004614bbc565b611397565b610191610298366004614c61565b6115c4565b61013e6102ab366004614ba3565b6115f0565b6102be6005600160991b0181565b6040516001600160a01b03909116815260200161019b565b61013e6102e4366004614b8c565b6117a8565b61013e6102f7366004614c95565b611a2e565b61013e61030a366004614b8c565b611b12565b61019161031d366004614cf8565b611c26565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061577f833981519152918415610374576103718285611c5b565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103a6576103a6614d5d565b60048111156103b7576103b7614d5d565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561043e5761043e614d5d565b146104905760405162461bcd60e51b815260206004820152602a60248201525f8051602061579f8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104f55760405162461bcd60e51b815260206004820152603360248201525f8051602061579f8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610487565b5f6104ff84611ef7565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561054c5761054c614d5d565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61061e85611f87565b905082606001516001600160401b031681608001516001600160401b0316116106955760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610487565b5f836060015182608001516106aa9190614d85565b90506106b6868261207a565b5f6005600160991b0163ee5b48eb6106cf8987866120c2565b6040518263ffffffff1660e01b81526004016106eb9190614dce565b6020604051808303815f875af1158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b9190614e00565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061581f8339815191526020526040808220815160e0810190925280545f805160206157bf83398151915293929190829060ff1660058111156107d9576107d9614d5d565b60058111156107ea576107ea614d5d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561085957610859614d5d565b146108be5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610487565b6005600160991b016001600160a01b031663ee5b48eb6108e38584606001515f6120c2565b6040518263ffffffff1660e01b81526004016108ff9190614dce565b6020604051808303815f875af115801561091b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093f9190614e00565b50505050565b5f61095564e8d4a5100083614e2b565b92915050565b5f8051602061577f8339815191525f80610974846122e1565b6040808201515f84815260058801602052919091205492945090925061093f916001600160401b03909116906001600160a01b0316612646565b5f8051602061577f8339815191525f6109c68461267c565b90505f806109d7836040015161285d565b50915091505f6109e683611f87565b9050816001600160401b031681606001516001600160401b03161015610a1e5760405162461bcd60e51b815260040161048790614e3e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a635760405162461bcd60e51b815260040161048790614e80565b60015f87815260068701602052604090205460ff166004811115610a8957610a89614d5d565b14610af25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610487565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206157bf8339815191529060ff1615610c205760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610487565b5f610c2a8361267c565b90505f610c3a8260400151612a98565b90505f85356020870135610c516040890189614ec9565b604051602001610c649493929190614f12565b60408051601f1981840301815291905280519091505f5b81811015610cf7575f610c9160608a018a614f32565b83818110610ca157610ca1614f77565b9050602002810190610cb39190614f8b565b610cbc9061503b565b80516020808301516040808501519051949550610cdc94899493016150d2565b60408051601f19818403018152919052935050600101610c7b565b5082600283604051610d099190615121565b602060405180830381855afa158015610d24573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d479190614e00565b14610dab5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610487565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e129190614e00565b876020013514610e745760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610487565b610e816040880188614ec9565b9050601414610ee55760405162461bcd60e51b815260206004820152603a60248201525f805160206157df83398151915260448201527f746f72206d616e616765722061646472657373206c656e6774680000000000006064820152608401610487565b30610ef36040890189614ec9565b610efc91615132565b60601c14610f555760405162461bcd60e51b815260206004820152603360248201525f805160206157df833981519152604482015272746f72206d616e61676572206164647265737360681b6064820152608401610487565b5f610f636060890189614f32565b905011610fc25760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b6064820152608401610487565b5f5b81811015611270575f610fda60608a018a614f32565b83818110610fea57610fea614f77565b9050602002810190610ffc9190614f8b565b6110059061503b565b604080518b3560208201529081018490529091505f9060029060600160408051601f198184030181529082905261103b91615121565b602060405180830381855afa158015611056573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110799190614e00565b82519091508061109b5760405162461bcd60e51b815260040161048790615167565b5f81815260078a016020526040902054156110c85760405162461bcd60e51b8152600401610487906151a8565b8260400151516030146110ed5760405162461bcd60e51b8152600401610487906151f0565b5f81815260078a0160209081526040808320859055805160e081018252600180825287518285015287840180516001600160401b039081168486015260608401879052905116608083015260a0820185905260c0820185905286855260068e0190935292208251815491929091839160ff199091169083600581111561117557611175614d5d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905561121f82611ef7565b5082516020808501516040516001600160401b03909116815284917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101610fc4565b5050506008909201805460ff1916600117905550505050565b5f6109556001600160401b03831664e8d4a5100061523d565b5f6112ac82611f87565b6080015192915050565b5f8051602061577f8339815191525f6112ce85611f87565b5f86815260058401602052604090205460a082015191925061130191600160b01b9091046001600160401b031690615254565b6001600160401b03164210156113755760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610487565b8315611387576113858584611c5b565b505b61139085612c0c565b5050505050565b61139f612f02565b5f8051602061577f8339815191525f6113b78461267c565b90505f806113c8836040015161285d565b50915091505f6113d783611f87565b9050816001600160401b031681606001516001600160401b0316101561140f5760405162461bcd60e51b815260040161048790614e3e565b5f8681526006860160205260409020600301546001600160401b038084169116111561144d5760405162461bcd60e51b815260040161048790614e80565b60035f87815260068701602052604090205460ff16600481111561147357611473614d5d565b146114c75760405162461bcd60e51b815260206004820152603160248201525f8051602061579f8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610487565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261156c91612646565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506115c060015f805160206157ff83398151915255565b5050565b5f6115cd612f02565b6115d8833384612f4c565b905061095560015f805160206157ff83398151915255565b5f805160206157bf8339815191525f6116088361267c565b90505f8061161983604001516133bc565b915091508061167b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610487565b5f8281526005850160205260408120805461169590615274565b90501180156116c7575060015f83815260068601602052604090205460ff1660058111156116c5576116c5614d5d565b145b6116e35760405162461bcd60e51b8152600401610487906152ac565b5f82815260058501602052604081206116fb91614ae2565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061577f83398151915293929190829060ff16600481111561180957611809614d5d565b600481111561181a5761181a614d5d565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156118a1576118a1614d5d565b14806118bf57506003815160048111156118bd576118bd614d5d565b145b6119135760405162461bcd60e51b815260206004820152603260248201525f8051602061579f833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610487565b5f6119218260400151611f87565b905080606001516001600160401b03165f036119a55760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610487565b6005600160991b016001600160a01b031663ee5b48eb6119d28460400151846060015185608001516120c2565b6040518263ffffffff1660e01b81526004016119ee9190614dce565b6020604051808303815f875af1158015611a0a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113909190614e00565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a77575080546001600160401b03808416911610155b15611a955760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611ac0848461355d565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206157bf833981519152929190611b5a90615274565b9050118015611b8c575060015f83815260068301602052604090205460ff166005811115611b8a57611b8a614d5d565b145b611ba85760405162461bcd60e51b8152600401610487906152ac565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611be191906004016152e0565b6020604051808303815f875af1158015611bfd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c219190614e00565b505050565b5f611c2f612f02565b611c3b85858585613577565b9050611c5360015f805160206157ff83398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ca6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ccd9190810190615375565b9150915080611d305760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610487565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d979190614e00565b825114611dfb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610487565b60208201516001600160a01b031615611e715760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610487565b5f80611e808460400151613795565b91509150818714611eed5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610487565b9695505050505050565b5f8181525f8051602061581f8339815191526020526040812060020180545f805160206157bf83398151915291600160401b9091046001600160401b0316906008611f4183615447565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061581f83398151915290528390208351918201909352825491925f805160206157bf83398151915292829060ff16600581111561200757612007614d5d565b600581111561201857612018614d5d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f9182525f8051602061581f833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561213b576120fb81600161546c565b61210690600861523d565b5081515f9083908390811061211d5761211d614f77565b60200101906001600160f81b03191690815f1a9053506001016120e7565b505f5b600481101561219e5761215281600361546c565b61215d90600861523d565b6001901c60f81b8261217083600261547f565b8151811061218057612180614f77565b60200101906001600160f81b03191690815f1a90535060010161213e565b505f5b6020811015612200576121b581601f61546c565b6121c090600861523d565b86901c60f81b826121d283600661547f565b815181106121e2576121e2614f77565b60200101906001600160f81b03191690815f1a9053506001016121a1565b505f5b600881101561226b5761221781600761546c565b61222290600861523d565b6001600160401b038616901c60f81b8261223d83602661547f565b8151811061224d5761224d614f77565b60200101906001600160f81b03191690815f1a905350600101612203565b505f5b60088110156122d65761228281600761546c565b61228d90600861523d565b6001600160401b038516901c60f81b826122a883602e61547f565b815181106122b8576122b8614f77565b60200101906001600160f81b03191690815f1a90535060010161226e565b5090505b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206157bf8339815191525f6123308561267c565b90505f8061234183604001516133bc565b9150915080156123a65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610487565b5f828152600685016020526040808220815160e081019092528054829060ff1660058111156123d7576123d7614d5d565b60058111156123e8576123e8614d5d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561245957612459614d5d565b1480612477575060018251600581111561247557612475614d5d565b145b6124c35760405162461bcd60e51b815260206004820152602a60248201525f805160206157df833981519152604482015269746f722073746174757360b01b6064820152608401610487565b6003825160058111156124d8576124d8614d5d565b036124e5575060046124e9565b5060055b6020808301515f9081526007880190915260408120558181600581111561251257612512614d5d565b9081600581111561252557612525614d5d565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561255957612559614d5d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561260d5761260d614d5d565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546115c0906001600160a01b0316828461396d565b60408051606080820183525f8083526020830181905292820152905f805160206157bf8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156126f1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127189190810190615375565b915091508061277f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610487565b82548251146127e25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610487565b60208201516001600160a01b0316156128555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610487565b509392505050565b5f805f83516036146128815760405162461bcd60e51b815260040161048790615492565b5f805b60028110156128d05761289881600161546c565b6128a390600861523d565b61ffff168682815181106128b9576128b9614f77565b016020015160f81c901b9190911790600101612884565b5061ffff8116156128f35760405162461bcd60e51b8152600401610487906154db565b5f805b600481101561294e5761290a81600361546c565b61291590600861523d565b63ffffffff168761292783600261547f565b8151811061293757612937614f77565b016020015160f81c901b91909117906001016128f6565b5063ffffffff81166003146129755760405162461bcd60e51b81526004016104879061551e565b5f805b60208110156129ca5761298c81601f61546c565b61299790600861523d565b886129a383600661547f565b815181106129b3576129b3614f77565b016020015160f81c901b9190911790600101612978565b505f805b6008811015612a29576129e281600761546c565b6129ed90600861523d565b6001600160401b031689612a0283602661547f565b81518110612a1257612a12614f77565b016020015160f81c901b91909117906001016129ce565b505f805b6008811015612a8857612a4181600761546c565b612a4c90600861523d565b6001600160401b03168a612a6183602e61547f565b81518110612a7157612a71614f77565b016020015160f81c901b9190911790600101612a2d565b5091989097509095509350505050565b5f8151602614612aba5760405162461bcd60e51b815260040161048790615492565b5f805b6002811015612b0957612ad181600161546c565b612adc90600861523d565b61ffff16848281518110612af257612af2614f77565b016020015160f81c901b9190911790600101612abd565b5061ffff811615612b2c5760405162461bcd60e51b8152600401610487906154db565b5f805b6004811015612b8757612b4381600361546c565b612b4e90600861523d565b63ffffffff1685612b6083600261547f565b81518110612b7057612b70614f77565b016020015160f81c901b9190911790600101612b2f565b5063ffffffff8116600514612bae5760405162461bcd60e51b81526004016104879061551e565b5f805b6020811015612c0357612bc581601f61546c565b612bd090600861523d565b86612bdc83600661547f565b81518110612bec57612bec614f77565b016020015160f81c901b9190911790600101612bb1565b50949350505050565b5f8181525f8051602061581f8339815191526020526040808220815160e0810190925280545f805160206157bf83398151915293929190829060ff166005811115612c5957612c59614d5d565b6005811115612c6a57612c6a614d5d565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612cdc57612cdc614d5d565b14612d385760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610487565b612d4581608001516139cc565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115612d8957612d89614d5d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612e3e84612e3881611ef7565b5f6120c2565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612e6d908590600401614dce565b6020604051808303815f875af1158015612e89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ead9190614e00565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f805160206157ff833981519152805460011901612f3357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206157ff83398151915255565b5f5f8051602061577f83398151915281612f686101cc85613b6d565b90505f612f7487611f87565b9050600281516005811115612f8b57612f8b614d5d565b14612fea5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610487565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b031661307d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610487565b5f82826080015161308e9190615254565b600485015460408401519192506130b0916001600160401b0390911690615565565b6001600160401b0316816001600160401b0316111561312f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610487565b613139888261207a565b5f61314389611ef7565b90505f898260405160200161316f92919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052805190602001209050613190856139cc565b5f6005600160991b0163ee5b48eb6131a98d86886120c2565b6040518263ffffffff1660e01b81526004016131c59190614dce565b6020604051808303815f875af11580156131e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132059190614e00565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561328d5761328d614d5d565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146133df5760405162461bcd60e51b815260040161048790615492565b5f805b600281101561342e576133f681600161546c565b61340190600861523d565b61ffff1685828151811061341757613417614f77565b016020015160f81c901b91909117906001016133e2565b5061ffff8116156134515760405162461bcd60e51b8152600401610487906154db565b5f805b60048110156134ac5761346881600361546c565b61347390600861523d565b63ffffffff168661348583600261547f565b8151811061349557613495614f77565b016020015160f81c901b9190911790600101613454565b5063ffffffff81166002146134d35760405162461bcd60e51b81526004016104879061551e565b5f805b6020811015613528576134ea81601f61546c565b6134f590600861523d565b8761350183600661547f565b8151811061351157613511614f77565b016020015160f81c901b91909117906001016134d6565b505f8660268151811061353d5761353d614f77565b016020015191976001600160f81b03199092161515965090945050505050565b613565613ba3565b61356e82613bee565b6115c081613c69565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061577f8339815191529061ffff8616108015906135c3575061271061ffff861611155b6135df5760405162461bcd60e51b815260040161048790615588565b60028101546001600160401b0390811690851610156136585760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610487565b8054831080159061366d575080600101548311155b6136cb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610487565b5f6136d584613b6d565b90505f6136e182610945565b90505f6136ee8983613d1d565b905060405180606001604052806137023390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146137b85760405162461bcd60e51b815260040161048790615492565b5f805b6002811015613807576137cf81600161546c565b6137da90600861523d565b61ffff168582815181106137f0576137f0614f77565b016020015160f81c901b91909117906001016137bb565b5061ffff81161561382a5760405162461bcd60e51b8152600401610487906154db565b5f805b60048110156138855761384181600361546c565b61384c90600861523d565b63ffffffff168661385e83600261547f565b8151811061386e5761386e614f77565b016020015160f81c901b919091179060010161382d565b5063ffffffff81166004146138ac5760405162461bcd60e51b81526004016104879061551e565b5f805b6020811015613901576138c381601f61546c565b6138ce90600861523d565b876138da83600661547f565b815181106138ea576138ea614f77565b016020015160f81c901b91909117906001016138af565b505f805b60088110156139605761391981600761546c565b61392490600861523d565b6001600160401b03168861393983602661547f565b8151811061394957613949614f77565b016020015160f81c901b9190911790600101613905565b5090969095509350505050565b6040516001600160a01b03838116602483015260448201839052611c2191859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614191565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206157bf8339815191529060ff165f03613a0a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613a52908361546c565b10613a6e576001600160401b0384166040830152808252613a8d565b8382604001818151613a809190615254565b6001600160401b03169052505b5f826020015183604001516064613aa49190615565565b613aae91906155d3565b600285015490915060ff9081169082161115613b295760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610487565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610955827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906141f2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613bec57604051631afcd79f60e31b815260040160405180910390fd5b565b613bf6613ba3565b613c08613c0382806155f8565b614354565b613c1061436d565b613c6660208201356040830135613c2d6080850160608601614c48565b613c3d60a086016080870161560c565b61ffff16613c5160c0870160a08801615625565b613c6160e0880160c08901615645565b61437d565b50565b613c71613ba3565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613cfd5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610487565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613da85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610487565b5f805160206157bf83398151915242613dc76040860160208701614c48565b6001600160401b0316118015613e005750613de86040850160208601614c48565b6001600160401b0316613dfe426202a30061547f565b115b613e625760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610487565b8335613e805760405162461bcd60e51b815260040161048790615167565b83355f90815260078201602052604090205415613eaf5760405162461bcd60e51b8152600401610487906151a8565b613ebc6040850185614ec9565b9050603014613edd5760405162461bcd60e51b8152600401610487906151f0565b613ee6836139cc565b5f80613f806040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f2b9190614c48565b6001600160401b03168152602001613f4660408a018a614ec9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614562565b5f82815260058601602052604090209193509150613f9e82826156a4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613fcb908590600401614dce565b6020604051808303815f875af1158015613fe7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061400b9190614e00565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff1916600183600581111561408357614083614d5d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614163918e01908e01614c48565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6141a56001600160a01b03841683614907565b905080515f141580156141c95750808060200190518101906141c79190615763565b155b15611c2157604051635274afe760e01b81526001600160a01b0384166004820152602401610487565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614238573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061425c9190614e00565b90506142736001600160a01b038516333086614914565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156142b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142db9190614e00565b90508181116143415760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610487565b61434b828261546c565b95945050505050565b61435c613ba3565b61436461494d565b613c6681614955565b614375613ba3565b613bec6149cb565b614385613ba3565b5f8051602061577f833981519152836143f15760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610487565b6127108411156144135760405162461bcd60e51b815260040161048790615588565b8587111561447b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610487565b600a60ff84161180159061449157505f8360ff16115b6144fb5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610487565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146145cc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610487565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156146435761460381600161546c565b61460e90600861523d565b5081515f9083908390811061462557614625614f77565b60200101906001600160f81b03191690815f1a9053506001016145ef565b505f5b60048110156146a15761465a81600361546c565b61466590600861523d565b505f8261467383600261547f565b8151811061468357614683614f77565b60200101906001600160f81b03191690815f1a905350600101614646565b505f5b60208110156146fe57845181602081106146c0576146c0614f77565b1a60f81b826146d083600661547f565b815181106146e0576146e0614f77565b60200101906001600160f81b03191690815f1a9053506001016146a4565b505f5b602081101561475e578460200151816020811061472057614720614f77565b1a60f81b8261473083602661547f565b8151811061474057614740614f77565b60200101906001600160f81b03191690815f1a905350600101614701565b505f5b60088110156147d25761477581600761546c565b61478090600861523d565b60ff1685604001516001600160401b0316901c60f81b828260466147a4919061547f565b815181106147b4576147b4614f77565b60200101906001600160f81b03191690815f1a905350600101614761565b505f5b603081101561483d57846080015181815181106147f4576147f4614f77565b01602001516001600160f81b0319168261480f83604e61547f565b8151811061481f5761481f614f77565b60200101906001600160f81b03191690815f1a9053506001016147d5565b505f5b60088110156148af5761485481600761546c565b61485f90600861523d565b60608601516001600160401b0390811691161c60f81b8261488183607e61547f565b8151811061489157614891614f77565b60200101906001600160f81b03191690815f1a905350600101614840565b506002816040516148c09190615121565b602060405180830381855afa1580156148db573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906148fe9190614e00565b94909350915050565b60606122da83835f6149d3565b6040516001600160a01b03848116602483015283811660448301526064820183905261093f9186918216906323b872dd9060840161399a565b613bec613ba3565b61495d613ba3565b80355f805160206157bf83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556149a76060830160408401615625565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612f39613ba3565b6060814710156149f85760405163cd78605960e01b8152306004820152602401610487565b5f80856001600160a01b03168486604051614a139190615121565b5f6040518083038185875af1925050503d805f8114614a4d576040519150601f19603f3d011682016040523d82523d5f602084013e614a52565b606091505b5091509150611eed868383606082614a7257614a6d82614ab9565b6122da565b8151158015614a8957506001600160a01b0384163b155b15614ab257604051639996b31560e01b81526001600160a01b0385166004820152602401610487565b50806122da565b805115614ac95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614aee90615274565b5f825580601f10614afd575050565b601f0160209004905f5260205f2090810190613c6691905b80821115614b28575f8155600101614b15565b5090565b8015158114613c66575f80fd5b803563ffffffff81168114614b4c575f80fd5b919050565b5f805f60608486031215614b63575f80fd5b833592506020840135614b7581614b2c565b9150614b8360408501614b39565b90509250925092565b5f60208284031215614b9c575f80fd5b5035919050565b5f60208284031215614bb3575f80fd5b6122da82614b39565b5f8060408385031215614bcd575f80fd5b614bd683614b39565b946020939093013593505050565b5f8060408385031215614bf5575f80fd5b82356001600160401b03811115614c0a575f80fd5b830160808186031215614c1b575f80fd5b9150614c2960208401614b39565b90509250929050565b80356001600160401b0381168114614b4c575f80fd5b5f60208284031215614c58575f80fd5b6122da82614c32565b5f8060408385031215614c72575f80fd5b50508035926020909101359150565b6001600160a01b0381168114613c66575f80fd5b5f8060408385031215614ca6575f80fd5b82356001600160401b03811115614cbb575f80fd5b830160e08186031215614ccc575f80fd5b91506020830135614cdc81614c81565b809150509250929050565b803561ffff81168114614b4c575f80fd5b5f805f8060808587031215614d0b575f80fd5b84356001600160401b03811115614d20575f80fd5b850160608188031215614d31575f80fd5b9350614d3f60208601614ce7565b9250614d4d60408601614c32565b9396929550929360600135925050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614da557614da5614d71565b5092915050565b5f5b83811015614dc6578181015183820152602001614dae565b50505f910152565b602081525f8251806020840152614dec816040850160208701614dac565b601f01601f19169190910160400192915050565b5f60208284031215614e10575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614e3957614e39614e17565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f808335601e19843603018112614ede575f80fd5b8301803591506001600160401b03821115614ef7575f80fd5b602001915036819003821315614f0b575f80fd5b9250929050565b848152836020820152818360408301375f91016040019081529392505050565b5f808335601e19843603018112614f47575f80fd5b8301803591506001600160401b03821115614f60575f80fd5b6020019150600581901b3603821315614f0b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614f9f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614fdf57614fdf614fa9565b60405290565b604051601f8201601f191681016001600160401b038111828210171561500d5761500d614fa9565b604052919050565b5f6001600160401b0382111561502d5761502d614fa9565b50601f01601f191660200190565b5f6060823603121561504b575f80fd5b615053614fbd565b823581526020615064818501614c32565b8183015260408401356001600160401b03811115615080575f80fd5b840136601f820112615090575f80fd5b80356150a361509e82615015565b614fe5565b81815236848385010111156150b6575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f85516150e3818460208a01614dac565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615113816028840160208801614dac565b016028019695505050505050565b5f8251614f9f818460208701614dac565b6bffffffffffffffffffffffff19813581811691601485101561515f5780818660140360031b1b83161692505b505092915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b808202811582820484141761095557610955614d71565b6001600160401b03818116838216019080821115614da557614da5614d71565b600181811c9082168061528857607f821691505b6020821081036152a657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201525f805160206157df8339815191526040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546152f281615274565b806020870152604060018084165f8114615313576001811461532f5761535c565b60ff19851660408a0152604084151560051b8a0101955061535c565b895f5260205f205f5b858110156153535781548b8201860152908301908801615338565b8a016040019650505b509398975050505050505050565b8051614b4c81614b2c565b5f8060408385031215615386575f80fd5b82516001600160401b038082111561539c575f80fd5b90840190606082870312156153af575f80fd5b6153b7614fbd565b825181526020808401516153ca81614c81565b828201526040840151838111156153df575f80fd5b80850194505087601f8501126153f3575f80fd5b8351925061540361509e84615015565b8381528882858701011115615416575f80fd5b61542584838301848801614dac565b8060408401525081955061543a81880161536a565b9450505050509250929050565b5f6001600160401b0380831681810361546257615462614d71565b6001019392505050565b8181038181111561095557610955614d71565b8082018082111561095557610955614d71565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461515f5761515f614d71565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b03808416806155ec576155ec614e17565b92169190910492915050565b5f8235609e19833603018112614f9f575f80fd5b5f6020828403121561561c575f80fd5b6122da82614ce7565b5f60208284031215615635575f80fd5b813560ff811681146122da575f80fd5b5f60208284031215615655575f80fd5b81356122da81614c81565b601f821115611c2157805f5260205f20601f840160051c810160208510156156855750805b601f840160051c820191505b81811015611390575f8155600101615691565b81516001600160401b038111156156bd576156bd614fa9565b6156d1816156cb8454615274565b84615660565b602080601f831160018114615704575f84156156ed5750858301515b5f19600386901b1c1916600185901b17855561575b565b5f85815260208120601f198616915b8281101561573257888601518255948401946001909101908401615713565b508582101561574f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615773575f80fd5b81516122da81614b2c56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0056616c696461746f724d616e616765723a20696e76616c69642076616c6964619b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516159b03803806159b083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6158638061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806366435abf116100a9578063b771b3bc1161006e578063b771b3bc146102b0578063ba3a4b97146102d6578063be768a9d146102e9578063bee0a03f146102fc578063eb0acb891461030f575f80fd5b806366435abf1461025157806376f786211461026457806398f3e2b4146102775780639e1bc4ef1461028a578063a3a65e481461029d575f80fd5b806335455ded116100ef57806335455ded146101e9578063467ef06f146102055780635297fae614610218578063561404fd1461022b578063620658561461023e575f80fd5b80630118acc41461012b5780630322ed98146101405780630cdd098514610153578063151d30d1146101a45780632e2194d8146101be575b5f80fd5b61013e610139366004614b69565b610322565b005b61013e61014e366004614ba4565b61078c565b610191610161366004614ba4565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101ac600a81565b60405160ff909116815260200161019b565b6101d16101cc366004614ba4565b610945565b6040516001600160401b03909116815260200161019b565b6101f261271081565b60405161ffff909116815260200161019b565b61013e610213366004614bbb565b61095b565b61013e610226366004614bd4565b6109ae565b61013e610239366004614bfc565b610b83565b61019161024c366004614c60565b611298565b6101d161025f366004614ba4565b6112b1565b61013e610272366004614b69565b6112c5565b61013e610285366004614bd4565b6113a6565b610191610298366004614c79565b6115d3565b61013e6102ab366004614bbb565b6115ff565b6102be6005600160991b0181565b6040516001600160a01b03909116815260200161019b565b61013e6102e4366004614ba4565b6117b7565b61013e6102f7366004614cad565b611a3d565b61013e61030a366004614ba4565b611b21565b61019161031d366004614d10565b611c35565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615797833981519152918415610374576103718285611c6a565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103a6576103a6614d75565b60048111156103b7576103b7614d75565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561043e5761043e614d75565b146104905760405162461bcd60e51b815260206004820152602a60248201525f805160206157b78339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146104f55760405162461bcd60e51b815260206004820152603360248201525f805160206157b78339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610487565b5f6104ff84611f06565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561054c5761054c614d75565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61061e85611f96565b905082606001516001600160401b031681608001516001600160401b0316116106955760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610487565b5f836060015182608001516106aa9190614d9d565b90506106b68682612089565b5f6005600160991b0163ee5b48eb6106cf8987866120d1565b6040518263ffffffff1660e01b81526004016106eb9190614de6565b6020604051808303815f875af1158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b9190614e18565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206158378339815191526020526040808220815160e0810190925280545f805160206157d783398151915293929190829060ff1660058111156107d9576107d9614d75565b60058111156107ea576107ea614d75565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561085957610859614d75565b146108be5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610487565b6005600160991b016001600160a01b031663ee5b48eb6108e38584606001515f6120d1565b6040518263ffffffff1660e01b81526004016108ff9190614de6565b6020604051808303815f875af115801561091b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061093f9190614e18565b50505050565b5f61095564e8d4a5100083614e43565b92915050565b5f805160206157978339815191525f80610974846122f8565b6040808201515f84815260058801602052919091205492945090925061093f916001600160401b03909116906001600160a01b031661265d565b5f805160206157978339815191525f6109c684612693565b90505f806109d7836040015161286d565b50915091505f6109e683611f96565b9050816001600160401b031681606001516001600160401b03161015610a1e5760405162461bcd60e51b815260040161048790614e56565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a635760405162461bcd60e51b815260040161048790614e98565b60015f87815260068701602052604090205460ff166004811115610a8957610a89614d75565b14610af25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610487565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206157d78339815191529060ff1615610c205760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610487565b5f610c2a83612693565b90505f610c3a8260400151612aa8565b90505f85356020870135610c516040890189614ee1565b604051602001610c649493929190614f2a565b60408051601f1981840301815291905290505f610c846060880188614f4a565b905090505f5b81811015610d06575f610ca060608a018a614f4a565b83818110610cb057610cb0614f8f565b9050602002810190610cc29190614fa3565b610ccb90615053565b80516020808301516040808501519051949550610ceb94899493016150ea565b60408051601f19818403018152919052935050600101610c8a565b5082600283604051610d189190615139565b602060405180830381855afa158015610d33573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d569190614e18565b14610dba5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610487565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dfd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e219190614e18565b876020013514610e835760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610487565b610e906040880188614ee1565b9050601414610ef45760405162461bcd60e51b815260206004820152603a60248201525f805160206157f783398151915260448201527f746f72206d616e616765722061646472657373206c656e6774680000000000006064820152608401610487565b30610f026040890189614ee1565b610f0b9161514a565b60601c14610f645760405162461bcd60e51b815260206004820152603360248201525f805160206157f7833981519152604482015272746f72206d616e61676572206164647265737360681b6064820152608401610487565b5f610f726060890189614f4a565b905011610fd15760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b6064820152608401610487565b5f5b8181101561127f575f610fe960608a018a614f4a565b83818110610ff957610ff9614f8f565b905060200281019061100b9190614fa3565b61101490615053565b604080518b3560208201529081018490529091505f9060029060600160408051601f198184030181529082905261104a91615139565b602060405180830381855afa158015611065573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110889190614e18565b8251909150806110aa5760405162461bcd60e51b81526004016104879061517f565b5f81815260078a016020526040902054156110d75760405162461bcd60e51b8152600401610487906151c0565b8260400151516030146110fc5760405162461bcd60e51b815260040161048790615208565b5f81815260078a0160209081526040808320859055805160e081018252600180825287518285015287840180516001600160401b039081168486015260608401879052905116608083015260a0820185905260c0820185905286855260068e0190935292208251815491929091839160ff199091169083600581111561118457611184614d75565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905561122e82611f06565b5082516020808501516040516001600160401b03909116815284917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101610fd3565b5050506008909201805460ff1916600117905550505050565b5f6109556001600160401b03831664e8d4a51000615255565b5f6112bb82611f96565b6080015192915050565b5f805160206157978339815191525f6112dd85611f96565b5f86815260058401602052604090205460a082015191925061131091600160b01b9091046001600160401b03169061526c565b6001600160401b03164210156113845760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610487565b8315611396576113948584611c6a565b505b61139f85612c1a565b5050505050565b6113ae612f10565b5f805160206157978339815191525f6113c684612693565b90505f806113d7836040015161286d565b50915091505f6113e683611f96565b9050816001600160401b031681606001516001600160401b0316101561141e5760405162461bcd60e51b815260040161048790614e56565b5f8681526006860160205260409020600301546001600160401b038084169116111561145c5760405162461bcd60e51b815260040161048790614e98565b60035f87815260068701602052604090205460ff16600481111561148257611482614d75565b146114d65760405162461bcd60e51b815260206004820152603160248201525f805160206157b78339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610487565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261157b9161265d565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506115cf60015f8051602061581783398151915255565b5050565b5f6115dc612f10565b6115e7833384612f5a565b905061095560015f8051602061581783398151915255565b5f805160206157d78339815191525f61161783612693565b90505f8061162883604001516133ca565b915091508061168a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610487565b5f828152600585016020526040812080546116a49061528c565b90501180156116d6575060015f83815260068601602052604090205460ff1660058111156116d4576116d4614d75565b145b6116f25760405162461bcd60e51b8152600401610487906152c4565b5f828152600585016020526040812061170a91614afa565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061579783398151915293929190829060ff16600481111561181857611818614d75565b600481111561182957611829614d75565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156118b0576118b0614d75565b14806118ce57506003815160048111156118cc576118cc614d75565b145b6119225760405162461bcd60e51b815260206004820152603260248201525f805160206157b7833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610487565b5f6119308260400151611f96565b905080606001516001600160401b03165f036119b45760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610487565b6005600160991b016001600160a01b031663ee5b48eb6119e18460400151846060015185608001516120d1565b6040518263ffffffff1660e01b81526004016119fd9190614de6565b6020604051808303815f875af1158015611a19573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061139f9190614e18565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a86575080546001600160401b03808416911610155b15611aa45760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611acf848461356b565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206157d7833981519152929190611b699061528c565b9050118015611b9b575060015f83815260068301602052604090205460ff166005811115611b9957611b99614d75565b145b611bb75760405162461bcd60e51b8152600401610487906152c4565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611bf091906004016152f8565b6020604051808303815f875af1158015611c0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c309190614e18565b505050565b5f611c3e612f10565b611c4a85858585613585565b9050611c6260015f8051602061581783398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611cb5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cdc919081019061538d565b9150915080611d3f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610487565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d82573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611da69190614e18565b825114611e0a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610487565b60208201516001600160a01b031615611e805760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610487565b5f80611e8f84604001516137a3565b91509150818714611efc5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610487565b9695505050505050565b5f8181525f805160206158378339815191526020526040812060020180545f805160206157d783398151915291600160401b9091046001600160401b0316906008611f508361545f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061583783398151915290528390208351918201909352825491925f805160206157d783398151915292829060ff16600581111561201657612016614d75565b600581111561202757612027614d75565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f9182525f80516020615837833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561214a5761210a816001615484565b612115906008615255565b5081515f9083908390811061212c5761212c614f8f565b60200101906001600160f81b03191690815f1a9053506001016120f6565b505f5b60048110156121b557612161816003615484565b61216c906008615255565b600263ffffffff16901c60f81b828260026121879190615497565b8151811061219757612197614f8f565b60200101906001600160f81b03191690815f1a90535060010161214d565b505f5b6020811015612217576121cc81601f615484565b6121d7906008615255565b86901c60f81b826121e9836006615497565b815181106121f9576121f9614f8f565b60200101906001600160f81b03191690815f1a9053506001016121b8565b505f5b60088110156122825761222e816007615484565b612239906008615255565b6001600160401b038616901c60f81b82612254836026615497565b8151811061226457612264614f8f565b60200101906001600160f81b03191690815f1a90535060010161221a565b505f5b60088110156122ed57612299816007615484565b6122a4906008615255565b6001600160401b038516901c60f81b826122bf83602e615497565b815181106122cf576122cf614f8f565b60200101906001600160f81b03191690815f1a905350600101612285565b5090505b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206157d78339815191525f61234785612693565b90505f8061235883604001516133ca565b9150915080156123bd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610487565b5f828152600685016020526040808220815160e081019092528054829060ff1660058111156123ee576123ee614d75565b60058111156123ff576123ff614d75565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561247057612470614d75565b148061248e575060018251600581111561248c5761248c614d75565b145b6124da5760405162461bcd60e51b815260206004820152602a60248201525f805160206157f7833981519152604482015269746f722073746174757360b01b6064820152608401610487565b6003825160058111156124ef576124ef614d75565b036124fc57506004612500565b5060055b6020808301515f9081526007880190915260408120558181600581111561252957612529614d75565b9081600581111561253c5761253c614d75565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561257057612570614d75565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561262457612624614d75565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546115cf906001600160a01b0316828461397b565b60408051606080820183525f8083526020830181905292820152905f805160206157d78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612708573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261272f919081019061538d565b915091508061278f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610487565b82548251146127f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610487565b60208201516001600160a01b0316156128655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610487565b509392505050565b5f805f83516036146128915760405162461bcd60e51b8152600401610487906154aa565b5f805b60028110156128e0576128a8816001615484565b6128b3906008615255565b61ffff168682815181106128c9576128c9614f8f565b016020015160f81c901b9190911790600101612894565b5061ffff8116156129035760405162461bcd60e51b8152600401610487906154f3565b5f805b600481101561295e5761291a816003615484565b612925906008615255565b63ffffffff1687612937836002615497565b8151811061294757612947614f8f565b016020015160f81c901b9190911790600101612906565b5063ffffffff81166004146129855760405162461bcd60e51b815260040161048790615536565b5f805b60208110156129da5761299c81601f615484565b6129a7906008615255565b886129b3836006615497565b815181106129c3576129c3614f8f565b016020015160f81c901b9190911790600101612988565b505f805b6008811015612a39576129f2816007615484565b6129fd906008615255565b6001600160401b031689612a12836026615497565b81518110612a2257612a22614f8f565b016020015160f81c901b91909117906001016129de565b505f805b6008811015612a9857612a51816007615484565b612a5c906008615255565b6001600160401b03168a612a7183602e615497565b81518110612a8157612a81614f8f565b016020015160f81c901b9190911790600101612a3d565b5091989097509095509350505050565b5f8151602614612aca5760405162461bcd60e51b8152600401610487906154aa565b5f805b6002811015612b1957612ae1816001615484565b612aec906008615255565b61ffff16848281518110612b0257612b02614f8f565b016020015160f81c901b9190911790600101612acd565b5061ffff811615612b3c5760405162461bcd60e51b8152600401610487906154f3565b5f805b6004811015612b9757612b53816003615484565b612b5e906008615255565b63ffffffff1685612b70836002615497565b81518110612b8057612b80614f8f565b016020015160f81c901b9190911790600101612b3f565b5063ffffffff811615612bbc5760405162461bcd60e51b815260040161048790615536565b5f805b6020811015612c1157612bd381601f615484565b612bde906008615255565b86612bea836006615497565b81518110612bfa57612bfa614f8f565b016020015160f81c901b9190911790600101612bbf565b50949350505050565b5f8181525f805160206158378339815191526020526040808220815160e0810190925280545f805160206157d783398151915293929190829060ff166005811115612c6757612c67614d75565b6005811115612c7857612c78614d75565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612cea57612cea614d75565b14612d465760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610487565b612d5381608001516139da565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115612d9757612d97614d75565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612e4c84612e4681611f06565b5f6120d1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612e7b908590600401614de6565b6020604051808303815f875af1158015612e97573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ebb9190614e18565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615817833981519152805460011901612f4157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061581783398151915255565b5f5f8051602061579783398151915281612f766101cc85613b7b565b90505f612f8287611f96565b9050600281516005811115612f9957612f99614d75565b14612ff85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610487565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b031661308b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610487565b5f82826080015161309c919061526c565b600485015460408401519192506130be916001600160401b039091169061557d565b6001600160401b0316816001600160401b0316111561313d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610487565b6131478882612089565b5f61315189611f06565b90505f898260405160200161317d92919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061319e856139da565b5f6005600160991b0163ee5b48eb6131b78d86886120d1565b6040518263ffffffff1660e01b81526004016131d39190614de6565b6020604051808303815f875af11580156131ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132139190614e18565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561329b5761329b614d75565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146133ed5760405162461bcd60e51b8152600401610487906154aa565b5f805b600281101561343c57613404816001615484565b61340f906008615255565b61ffff1685828151811061342557613425614f8f565b016020015160f81c901b91909117906001016133f0565b5061ffff81161561345f5760405162461bcd60e51b8152600401610487906154f3565b5f805b60048110156134ba57613476816003615484565b613481906008615255565b63ffffffff1686613493836002615497565b815181106134a3576134a3614f8f565b016020015160f81c901b9190911790600101613462565b5063ffffffff81166003146134e15760405162461bcd60e51b815260040161048790615536565b5f805b6020811015613536576134f881601f615484565b613503906008615255565b8761350f836006615497565b8151811061351f5761351f614f8f565b016020015160f81c901b91909117906001016134e4565b505f8660268151811061354b5761354b614f8f565b016020015191976001600160f81b03199092161515965090945050505050565b613573613bb1565b61357c82613bfc565b6115cf81613c77565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206157978339815191529061ffff8616108015906135d1575061271061ffff861611155b6135ed5760405162461bcd60e51b8152600401610487906155a0565b60028101546001600160401b0390811690851610156136665760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610487565b8054831080159061367b575080600101548311155b6136d95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610487565b5f6136e384613b7b565b90505f6136ef82610945565b90505f6136fc8983613d2b565b905060405180606001604052806137103390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146137c65760405162461bcd60e51b8152600401610487906154aa565b5f805b6002811015613815576137dd816001615484565b6137e8906008615255565b61ffff168582815181106137fe576137fe614f8f565b016020015160f81c901b91909117906001016137c9565b5061ffff8116156138385760405162461bcd60e51b8152600401610487906154f3565b5f805b60048110156138935761384f816003615484565b61385a906008615255565b63ffffffff168661386c836002615497565b8151811061387c5761387c614f8f565b016020015160f81c901b919091179060010161383b565b5063ffffffff81166005146138ba5760405162461bcd60e51b815260040161048790615536565b5f805b602081101561390f576138d181601f615484565b6138dc906008615255565b876138e8836006615497565b815181106138f8576138f8614f8f565b016020015160f81c901b91909117906001016138bd565b505f805b600881101561396e57613927816007615484565b613932906008615255565b6001600160401b031688613947836026615497565b8151811061395757613957614f8f565b016020015160f81c901b9190911790600101613913565b5090969095509350505050565b6040516001600160a01b03838116602483015260448201839052611c3091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061419f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206157d78339815191529060ff165f03613a18575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613a609083615484565b10613a7c576001600160401b0384166040830152808252613a9b565b8382604001818151613a8e919061526c565b6001600160401b03169052505b5f826020015183604001516064613ab2919061557d565b613abc91906155eb565b600285015490915060ff9081169082161115613b375760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610487565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610955827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690614200565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613bfa57604051631afcd79f60e31b815260040160405180910390fd5b565b613c04613bb1565b613c16613c118280615610565b614362565b613c1e61437b565b613c7460208201356040830135613c3b6080850160608601614c60565b613c4b60a0860160808701615624565b61ffff16613c5f60c0870160a0880161563d565b613c6f60e0880160c0890161565d565b61438b565b50565b613c7f613bb1565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613d0b5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610487565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613db65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610487565b5f805160206157d783398151915242613dd56040860160208701614c60565b6001600160401b0316118015613e0e5750613df66040850160208601614c60565b6001600160401b0316613e0c426202a300615497565b115b613e705760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610487565b8335613e8e5760405162461bcd60e51b81526004016104879061517f565b83355f90815260078201602052604090205415613ebd5760405162461bcd60e51b8152600401610487906151c0565b613eca6040850185614ee1565b9050603014613eeb5760405162461bcd60e51b815260040161048790615208565b613ef4836139da565b5f80613f8e6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f399190614c60565b6001600160401b03168152602001613f5460408a018a614ee1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614570565b5f82815260058601602052604090209193509150613fac82826156bc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613fd9908590600401614de6565b6020604051808303815f875af1158015613ff5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140199190614e18565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff1916600183600581111561409157614091614d75565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614171918e01908e01614c60565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6141b36001600160a01b0384168361491f565b905080515f141580156141d75750808060200190518101906141d5919061577b565b155b15611c3057604051635274afe760e01b81526001600160a01b0384166004820152602401610487565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614246573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061426a9190614e18565b90506142816001600160a01b03851633308661492c565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156142c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142e99190614e18565b905081811161434f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610487565b6143598282615484565b95945050505050565b61436a613bb1565b614372614965565b613c748161496d565b614383613bb1565b613bfa6149e3565b614393613bb1565b5f80516020615797833981519152836143ff5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610487565b6127108411156144215760405162461bcd60e51b8152600401610487906155a0565b858711156144895760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610487565b600a60ff84161180159061449f57505f8360ff16115b6145095760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610487565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146145da5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610487565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561465157614611816001615484565b61461c906008615255565b5081515f9083908390811061463357614633614f8f565b60200101906001600160f81b03191690815f1a9053506001016145fd565b505f5b60048110156146b957614668816003615484565b614673906008615255565b600160ff919091161c60f81b8261468b836002615497565b8151811061469b5761469b614f8f565b60200101906001600160f81b03191690815f1a905350600101614654565b505f5b602081101561471657845181602081106146d8576146d8614f8f565b1a60f81b826146e8836006615497565b815181106146f8576146f8614f8f565b60200101906001600160f81b03191690815f1a9053506001016146bc565b505f5b6020811015614776578460200151816020811061473857614738614f8f565b1a60f81b82614748836026615497565b8151811061475857614758614f8f565b60200101906001600160f81b03191690815f1a905350600101614719565b505f5b60088110156147ea5761478d816007615484565b614798906008615255565b60ff1685604001516001600160401b0316901c60f81b828260466147bc9190615497565b815181106147cc576147cc614f8f565b60200101906001600160f81b03191690815f1a905350600101614779565b505f5b6030811015614855578460800151818151811061480c5761480c614f8f565b01602001516001600160f81b0319168261482783604e615497565b8151811061483757614837614f8f565b60200101906001600160f81b03191690815f1a9053506001016147ed565b505f5b60088110156148c75761486c816007615484565b614877906008615255565b60608601516001600160401b0390811691161c60f81b8261489983607e615497565b815181106148a9576148a9614f8f565b60200101906001600160f81b03191690815f1a905350600101614858565b506002816040516148d89190615139565b602060405180830381855afa1580156148f3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906149169190614e18565b94909350915050565b60606122f183835f6149eb565b6040516001600160a01b03848116602483015283811660448301526064820183905261093f9186918216906323b872dd906084016139a8565b613bfa613bb1565b614975613bb1565b80355f805160206157d783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556149bf606083016040840161563d565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612f47613bb1565b606081471015614a105760405163cd78605960e01b8152306004820152602401610487565b5f80856001600160a01b03168486604051614a2b9190615139565b5f6040518083038185875af1925050503d805f8114614a65576040519150601f19603f3d011682016040523d82523d5f602084013e614a6a565b606091505b5091509150611efc868383606082614a8a57614a8582614ad1565b6122f1565b8151158015614aa157506001600160a01b0384163b155b15614aca57604051639996b31560e01b81526001600160a01b0385166004820152602401610487565b50806122f1565b805115614ae15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614b069061528c565b5f825580601f10614b15575050565b601f0160209004905f5260205f2090810190613c7491905b80821115614b40575f8155600101614b2d565b5090565b8015158114613c74575f80fd5b803563ffffffff81168114614b64575f80fd5b919050565b5f805f60608486031215614b7b575f80fd5b833592506020840135614b8d81614b44565b9150614b9b60408501614b51565b90509250925092565b5f60208284031215614bb4575f80fd5b5035919050565b5f60208284031215614bcb575f80fd5b6122f182614b51565b5f8060408385031215614be5575f80fd5b614bee83614b51565b946020939093013593505050565b5f8060408385031215614c0d575f80fd5b82356001600160401b03811115614c22575f80fd5b830160808186031215614c33575f80fd5b9150614c4160208401614b51565b90509250929050565b80356001600160401b0381168114614b64575f80fd5b5f60208284031215614c70575f80fd5b6122f182614c4a565b5f8060408385031215614c8a575f80fd5b50508035926020909101359150565b6001600160a01b0381168114613c74575f80fd5b5f8060408385031215614cbe575f80fd5b82356001600160401b03811115614cd3575f80fd5b830160e08186031215614ce4575f80fd5b91506020830135614cf481614c99565b809150509250929050565b803561ffff81168114614b64575f80fd5b5f805f8060808587031215614d23575f80fd5b84356001600160401b03811115614d38575f80fd5b850160608188031215614d49575f80fd5b9350614d5760208601614cff565b9250614d6560408601614c4a565b9396929550929360600135925050565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614dbd57614dbd614d89565b5092915050565b5f5b83811015614dde578181015183820152602001614dc6565b50505f910152565b602081525f8251806020840152614e04816040850160208701614dc4565b601f01601f19169190910160400192915050565b5f60208284031215614e28575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614e5157614e51614e2f565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f808335601e19843603018112614ef6575f80fd5b8301803591506001600160401b03821115614f0f575f80fd5b602001915036819003821315614f23575f80fd5b9250929050565b848152836020820152818360408301375f91016040019081529392505050565b5f808335601e19843603018112614f5f575f80fd5b8301803591506001600160401b03821115614f78575f80fd5b6020019150600581901b3603821315614f23575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614fb7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614ff757614ff7614fc1565b60405290565b604051601f8201601f191681016001600160401b038111828210171561502557615025614fc1565b604052919050565b5f6001600160401b0382111561504557615045614fc1565b50601f01601f191660200190565b5f60608236031215615063575f80fd5b61506b614fd5565b82358152602061507c818501614c4a565b8183015260408401356001600160401b03811115615098575f80fd5b840136601f8201126150a8575f80fd5b80356150bb6150b68261502d565b614ffd565b81815236848385010111156150ce575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f85516150fb818460208a01614dc4565b80830190508581526001600160401b0360c01b8560c01b166020820152835161512b816028840160208801614dc4565b016028019695505050505050565b5f8251614fb7818460208701614dc4565b6bffffffffffffffffffffffff1981358181169160148510156151775780818660140360031b1b83161692505b505092915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b808202811582820484141761095557610955614d89565b6001600160401b03818116838216019080821115614dbd57614dbd614d89565b600181811c908216806152a057607f821691505b6020821081036152be57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201525f805160206157f78339815191526040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461530a8161528c565b806020870152604060018084165f811461532b576001811461534757615374565b60ff19851660408a0152604084151560051b8a01019550615374565b895f5260205f205f5b8581101561536b5781548b8201860152908301908801615350565b8a016040019650505b509398975050505050505050565b8051614b6481614b44565b5f806040838503121561539e575f80fd5b82516001600160401b03808211156153b4575f80fd5b90840190606082870312156153c7575f80fd5b6153cf614fd5565b825181526020808401516153e281614c99565b828201526040840151838111156153f7575f80fd5b80850194505087601f85011261540b575f80fd5b8351925061541b6150b68461502d565b838152888285870101111561542e575f80fd5b61543d84838301848801614dc4565b80604084015250819550615452818801615382565b9450505050509250929050565b5f6001600160401b0380831681810361547a5761547a614d89565b6001019392505050565b8181038181111561095557610955614d89565b8082018082111561095557610955614d89565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461517757615177614d89565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038084168061560457615604614e2f565b92169190910492915050565b5f8235609e19833603018112614fb7575f80fd5b5f60208284031215615634575f80fd5b6122f182614cff565b5f6020828403121561564d575f80fd5b813560ff811681146122f1575f80fd5b5f6020828403121561566d575f80fd5b81356122f181614c99565b601f821115611c3057805f5260205f20601f840160051c8101602085101561569d5750805b601f840160051c820191505b8181101561139f575f81556001016156a9565b81516001600160401b038111156156d5576156d5614fc1565b6156e9816156e3845461528c565b84615678565b602080601f83116001811461571c575f84156157055750858301515b5f19600386901b1c1916600185901b178555615773565b5f85815260208120601f198616915b8281101561574a5788860151825594840194600190910190840161572b565b508582101561576757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561578b575f80fd5b81516122f181614b4456fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0056616c696461746f724d616e616765723a20696e76616c69642076616c6964619b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 98bf3fa8e..1369c3d7a 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -74,7 +74,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516155e63803806155e683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154998061014d5f395ff3fe60806040526004361061011b575f3560e01c8063561404fd1161009d578063a3a65e4811610062578063a3a65e481461034c578063b771b3bc1461036b578063ba3a4b971461039d578063bee0a03f146103bc578063c599e24f146103db575f80fd5b8063561404fd146102b157806362065856146102d057806366435abf146102ef57806376f786211461030e57806398f3e2b41461032d575f80fd5b806335455ded116100e357806335455ded146102195780633d68fe291461024157806340034a9314610260578063467ef06f146102735780635297fae614610292575f80fd5b80630118acc41461011f5780630322ed98146101405780630cdd09851461015f578063151d30d1146101bc5780632e2194d8146101e2575b5f80fd5b34801561012a575f80fd5b5061013e610139366004614807565b6103ee565b005b34801561014b575f80fd5b5061013e61015a366004614842565b610858565b34801561016a575f80fd5b506101a9610179366004614842565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101c7575f80fd5b506101d0600a81565b60405160ff90911681526020016101b3565b3480156101ed575f80fd5b506102016101fc366004614842565b610a11565b6040516001600160401b0390911681526020016101b3565b348015610224575f80fd5b5061022e61271081565b60405161ffff90911681526020016101b3565b34801561024c575f80fd5b5061013e61025b366004614859565b610a27565b6101a961026e3660046148b6565b610b09565b34801561027e575f80fd5b5061013e61028d36600461490a565b610b3d565b34801561029d575f80fd5b5061013e6102ac366004614923565b610b90565b3480156102bc575f80fd5b5061013e6102cb36600461494b565b610d65565b3480156102db575f80fd5b506101a96102ea366004614999565b61146b565b3480156102fa575f80fd5b50610201610309366004614842565b611484565b348015610319575f80fd5b5061013e610328366004614807565b611498565b348015610338575f80fd5b5061013e610347366004614923565b611579565b348015610357575f80fd5b5061013e61036636600461490a565b6117a6565b348015610376575f80fd5b506103856005600160991b0181565b6040516001600160a01b0390911681526020016101b3565b3480156103a8575f80fd5b5061013e6103b7366004614842565b61195e565b3480156103c7575f80fd5b5061013e6103d6366004614842565b611be4565b6101a96103e9366004614842565b611cf8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206153cd8339815191529184156104405761043d8285611d29565b90505b5f868152600684016020526040808220815161010081019092528054829060ff166004811115610472576104726149b2565b6004811115610483576104836149b2565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561050a5761050a6149b2565b1461055c5760405162461bcd60e51b815260206004820152602a60248201525f805160206153ed8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105c15760405162461bcd60e51b815260206004820152603360248201525f805160206153ed8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610553565b5f6105cb84611fc5565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff19166001836004811115610618576106186149b2565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106ea85612055565b905082606001516001600160401b031681608001516001600160401b0316116107615760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610553565b5f8360600151826080015161077691906149da565b90506107828682612148565b5f6005600160991b0163ee5b48eb61079b898786612190565b6040518263ffffffff1660e01b81526004016107b79190614a23565b6020604051808303815f875af11580156107d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f79190614a55565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061546d8339815191526020526040808220815160e0810190925280545f8051602061540d83398151915293929190829060ff1660058111156108a5576108a56149b2565b60058111156108b6576108b66149b2565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610925576109256149b2565b1461098a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610553565b6005600160991b016001600160a01b031663ee5b48eb6109af8584606001515f612190565b6040518263ffffffff1660e01b81526004016109cb9190614a23565b6020604051808303815f875af11580156109e7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0b9190614a55565b50505050565b5f610a2164e8d4a5100083614a80565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a70575080546001600160401b03808416911610155b15610a8e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ab8836123ad565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b126123c1565b610b1e848484346123f8565b9050610b3660015f8051602061544d83398151915255565b9392505050565b5f805160206153cd8339815191525f80610b568461261e565b6040808201515f848152600588016020529190912054929450909250610a0b916001600160401b03909116906001600160a01b0316612983565b5f805160206153cd8339815191525f610ba884612996565b90505f80610bb98360400151612b77565b50915091505f610bc883612055565b9050816001600160401b031681606001516001600160401b03161015610c005760405162461bcd60e51b815260040161055390614a93565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c455760405162461bcd60e51b815260040161055390614ad5565b60015f87815260068701602052604090205460ff166004811115610c6b57610c6b6149b2565b14610cd45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610553565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f8051602061540d8339815191529060ff1615610e025760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610553565b5f610e0c83612996565b90505f610e1c8260400151612db2565b90505f85356020870135610e336040890189614b1e565b604051602001610e469493929190614b67565b60408051601f1981840301815291905280519091505f5b81811015610ed9575f610e7360608a018a614b87565b83818110610e8357610e83614bcc565b9050602002810190610e959190614be0565b610e9e90614c90565b80516020808301516040808501519051949550610ebe9489949301614d27565b60408051601f19818403018152919052935050600101610e5d565b5082600283604051610eeb9190614d76565b602060405180830381855afa158015610f06573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f299190614a55565b14610f8d5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610553565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff49190614a55565b8760200135146110565760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610553565b6110636040880188614b1e565b90506014146110c75760405162461bcd60e51b815260206004820152603a60248201525f8051602061542d83398151915260448201527f746f72206d616e616765722061646472657373206c656e6774680000000000006064820152608401610553565b306110d56040890189614b1e565b6110de91614d87565b60601c146111375760405162461bcd60e51b815260206004820152603360248201525f8051602061542d833981519152604482015272746f72206d616e61676572206164647265737360681b6064820152608401610553565b5f6111456060890189614b87565b9050116111a45760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b6064820152608401610553565b5f5b81811015611452575f6111bc60608a018a614b87565b838181106111cc576111cc614bcc565b90506020028101906111de9190614be0565b6111e790614c90565b604080518b3560208201529081018490529091505f9060029060600160408051601f198184030181529082905261121d91614d76565b602060405180830381855afa158015611238573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061125b9190614a55565b82519091508061127d5760405162461bcd60e51b815260040161055390614dbc565b5f81815260078a016020526040902054156112aa5760405162461bcd60e51b815260040161055390614dfd565b8260400151516030146112cf5760405162461bcd60e51b815260040161055390614e45565b5f81815260078a0160209081526040808320859055805160e081018252600180825287518285015287840180516001600160401b039081168486015260608401879052905116608083015260a0820185905260c0820185905286855260068e0190935292208251815491929091839160ff1990911690836005811115611357576113576149b2565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905561140182611fc5565b5082516020808501516040516001600160401b03909116815284917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050506001016111a6565b5050506008909201805460ff1916600117905550505050565b5f610a216001600160401b03831664e8d4a51000614e92565b5f61148e82612055565b6080015192915050565b5f805160206153cd8339815191525f6114b085612055565b5f86815260058401602052604090205460a08201519192506114e391600160b01b9091046001600160401b031690614ea9565b6001600160401b03164210156115575760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610553565b8315611569576115678584611d29565b505b61157285612f1d565b5050505050565b6115816123c1565b5f805160206153cd8339815191525f61159984612996565b90505f806115aa8360400151612b77565b50915091505f6115b983612055565b9050816001600160401b031681606001516001600160401b031610156115f15760405162461bcd60e51b815260040161055390614a93565b5f8681526006860160205260409020600301546001600160401b038084169116111561162f5760405162461bcd60e51b815260040161055390614ad5565b60035f87815260068701602052604090205460ff166004811115611655576116556149b2565b146116a95760405162461bcd60e51b815260206004820152603160248201525f805160206153ed8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610553565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261174e91612983565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506117a260015f8051602061544d83398151915255565b5050565b5f8051602061540d8339815191525f6117be83612996565b90505f806117cf8360400151613213565b91509150806118315760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610553565b5f8281526005850160205260408120805461184b90614ec9565b905011801561187d575060015f83815260068601602052604090205460ff16600581111561187b5761187b6149b2565b145b6118995760405162461bcd60e51b815260040161055390614f01565b5f82815260058501602052604081206118b19161479d565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153cd83398151915293929190829060ff1660048111156119bf576119bf6149b2565b60048111156119d0576119d06149b2565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a5757611a576149b2565b1480611a755750600381516004811115611a7357611a736149b2565b145b611ac95760405162461bcd60e51b815260206004820152603260248201525f805160206153ed833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610553565b5f611ad78260400151612055565b905080606001516001600160401b03165f03611b5b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610553565b6005600160991b016001600160a01b031663ee5b48eb611b88846040015184606001518560800151612190565b6040518263ffffffff1660e01b8152600401611ba49190614a23565b6020604051808303815f875af1158015611bc0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115729190614a55565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061540d833981519152929190611c2c90614ec9565b9050118015611c5e575060015f83815260068301602052604090205460ff166005811115611c5c57611c5c6149b2565b145b611c7a5760405162461bcd60e51b815260040161055390614f01565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611cb39190600401614f35565b6020604051808303815f875af1158015611ccf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf39190614a55565b505050565b5f611d016123c1565b611d0c8233346133b4565b9050611d2460015f8051602061544d83398151915255565b919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d74573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d9b9190810190614fde565b9150915080611dfe5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610553565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e659190614a55565b825114611ec95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610553565b60208201516001600160a01b031615611f3f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610553565b5f80611f4e8460400151613821565b91509150818714611fbb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610553565b9695505050505050565b5f8181525f8051602061546d8339815191526020526040812060020180545f8051602061540d83398151915291600160401b9091046001600160401b031690600861200f836150b0565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061546d83398151915290528390208351918201909352825491925f8051602061540d83398151915292829060ff1660058111156120d5576120d56149b2565b60058111156120e6576120e66149b2565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f9182525f8051602061546d833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612209576121c98160016150d5565b6121d4906008614e92565b5081515f908390839081106121eb576121eb614bcc565b60200101906001600160f81b03191690815f1a9053506001016121b5565b505f5b600481101561226c576122208160036150d5565b61222b906008614e92565b6001901c60f81b8261223e8360026150e8565b8151811061224e5761224e614bcc565b60200101906001600160f81b03191690815f1a90535060010161220c565b505f5b60208110156122ce5761228381601f6150d5565b61228e906008614e92565b86901c60f81b826122a08360066150e8565b815181106122b0576122b0614bcc565b60200101906001600160f81b03191690815f1a90535060010161226f565b505f5b6008811015612339576122e58160076150d5565b6122f0906008614e92565b6001600160401b038616901c60f81b8261230b8360266150e8565b8151811061231b5761231b614bcc565b60200101906001600160f81b03191690815f1a9053506001016122d1565b505f5b60088110156123a4576123508160076150d5565b61235b906008614e92565b6001600160401b038516901c60f81b8261237683602e6150e8565b8151811061238657612386614bcc565b60200101906001600160f81b03191690815f1a90535060010161233c565b50949350505050565b6123b56139f9565b6123be81613a44565b50565b5f8051602061544d8339815191528054600119016123f257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206153cd8339815191529061ffff861610801590612444575061271061ffff861611155b6124605760405162461bcd60e51b8152600401610553906150fb565b60028101546001600160401b0390811690851610156124d95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610553565b805483108015906124ee575080600101548311155b61254c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610553565b825f61255782610a11565b90505f6125648983613abc565b905060405180606001604052806125783390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061544d83398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061540d8339815191525f61266d85612996565b90505f8061267e8360400151613213565b9150915080156126e35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610553565b5f828152600685016020526040808220815160e081019092528054829060ff166005811115612714576127146149b2565b6005811115612725576127256149b2565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612796576127966149b2565b14806127b457506001825160058111156127b2576127b26149b2565b145b6128005760405162461bcd60e51b815260206004820152602a60248201525f8051602061542d833981519152604482015269746f722073746174757360b01b6064820152608401610553565b600382516005811115612815576128156149b2565b0361282257506004612826565b5060055b6020808301515f9081526007880190915260408120558181600581111561284f5761284f6149b2565b90816005811115612862576128626149b2565b9052505f84815260068701602052604090208251815484929190829060ff19166001836005811115612896576128966149b2565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561294a5761294a6149b2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6117a26001600160a01b03821683613f30565b60408051606080820183525f8083526020830181905292820152905f8051602061540d8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a0b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a329190810190614fde565b9150915080612a995760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b6064820152608401610553565b8254825114612afc5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610553565b60208201516001600160a01b031615612b6f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610553565b509392505050565b5f805f8351603614612b9b5760405162461bcd60e51b815260040161055390615146565b5f805b6002811015612bea57612bb28160016150d5565b612bbd906008614e92565b61ffff16868281518110612bd357612bd3614bcc565b016020015160f81c901b9190911790600101612b9e565b5061ffff811615612c0d5760405162461bcd60e51b81526004016105539061518f565b5f805b6004811015612c6857612c248160036150d5565b612c2f906008614e92565b63ffffffff1687612c418360026150e8565b81518110612c5157612c51614bcc565b016020015160f81c901b9190911790600101612c10565b5063ffffffff8116600314612c8f5760405162461bcd60e51b8152600401610553906151d2565b5f805b6020811015612ce457612ca681601f6150d5565b612cb1906008614e92565b88612cbd8360066150e8565b81518110612ccd57612ccd614bcc565b016020015160f81c901b9190911790600101612c92565b505f805b6008811015612d4357612cfc8160076150d5565b612d07906008614e92565b6001600160401b031689612d1c8360266150e8565b81518110612d2c57612d2c614bcc565b016020015160f81c901b9190911790600101612ce8565b505f805b6008811015612da257612d5b8160076150d5565b612d66906008614e92565b6001600160401b03168a612d7b83602e6150e8565b81518110612d8b57612d8b614bcc565b016020015160f81c901b9190911790600101612d47565b5091989097509095509350505050565b5f8151602614612dd45760405162461bcd60e51b815260040161055390615146565b5f805b6002811015612e2357612deb8160016150d5565b612df6906008614e92565b61ffff16848281518110612e0c57612e0c614bcc565b016020015160f81c901b9190911790600101612dd7565b5061ffff811615612e465760405162461bcd60e51b81526004016105539061518f565b5f805b6004811015612ea157612e5d8160036150d5565b612e68906008614e92565b63ffffffff1685612e7a8360026150e8565b81518110612e8a57612e8a614bcc565b016020015160f81c901b9190911790600101612e49565b5063ffffffff8116600514612ec85760405162461bcd60e51b8152600401610553906151d2565b5f805b60208110156123a457612edf81601f6150d5565b612eea906008614e92565b86612ef68360066150e8565b81518110612f0657612f06614bcc565b016020015160f81c901b9190911790600101612ecb565b5f8181525f8051602061546d8339815191526020526040808220815160e0810190925280545f8051602061540d83398151915293929190829060ff166005811115612f6a57612f6a6149b2565b6005811115612f7b57612f7b6149b2565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612fed57612fed6149b2565b146130495760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610553565b6130568160800151613fc3565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561309a5761309a6149b2565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61314f8461314981611fc5565b5f612190565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061317e908590600401614a23565b6020604051808303815f875af115801561319a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131be9190614a55565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146132365760405162461bcd60e51b815260040161055390615146565b5f805b60028110156132855761324d8160016150d5565b613258906008614e92565b61ffff1685828151811061326e5761326e614bcc565b016020015160f81c901b9190911790600101613239565b5061ffff8116156132a85760405162461bcd60e51b81526004016105539061518f565b5f805b6004811015613303576132bf8160036150d5565b6132ca906008614e92565b63ffffffff16866132dc8360026150e8565b815181106132ec576132ec614bcc565b016020015160f81c901b91909117906001016132ab565b5063ffffffff811660021461332a5760405162461bcd60e51b8152600401610553906151d2565b5f805b602081101561337f5761334181601f6150d5565b61334c906008614e92565b876133588360066150e8565b8151811061336857613368614bcc565b016020015160f81c901b919091179060010161332d565b505f8660268151811061339457613394614bcc565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206153cd833981519152816133cd84610a11565b90505f6133d987612055565b90506002815160058111156133f0576133f06149b2565b1461344f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610553565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166134e25760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610553565b5f8282608001516134f39190614ea9565b60048501546040840151919250613515916001600160401b0390911690615219565b6001600160401b0316816001600160401b031611156135945760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610553565b61359e8882612148565b5f6135a889611fc5565b90505f89826040516020016135d492919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090506135f585613fc3565b5f6005600160991b0163ee5b48eb61360e8d8688612190565b6040518263ffffffff1660e01b815260040161362a9190614a23565b6020604051808303815f875af1158015613646573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061366a9190614a55565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156136f2576136f26149b2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e146138445760405162461bcd60e51b815260040161055390615146565b5f805b60028110156138935761385b8160016150d5565b613866906008614e92565b61ffff1685828151811061387c5761387c614bcc565b016020015160f81c901b9190911790600101613847565b5061ffff8116156138b65760405162461bcd60e51b81526004016105539061518f565b5f805b6004811015613911576138cd8160036150d5565b6138d8906008614e92565b63ffffffff16866138ea8360026150e8565b815181106138fa576138fa614bcc565b016020015160f81c901b91909117906001016138b9565b5063ffffffff81166004146139385760405162461bcd60e51b8152600401610553906151d2565b5f805b602081101561398d5761394f81601f6150d5565b61395a906008614e92565b876139668360066150e8565b8151811061397657613976614bcc565b016020015160f81c901b919091179060010161393b565b505f805b60088110156139ec576139a58160076150d5565b6139b0906008614e92565b6001600160401b0316886139c58360266150e8565b815181106139d5576139d5614bcc565b016020015160f81c901b9190911790600101613991565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a4257604051631afcd79f60e31b815260040160405180910390fd5b565b613a4c6139f9565b613a5e613a59828061523c565b614164565b613a6661417d565b6123be60208201356040830135613a836080850160608601614999565b613a9360a0860160808701615250565b61ffff16613aa760c0870160a08801615269565b613ab760e0880160c08901615289565b61418d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613b475760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610553565b5f8051602061540d83398151915242613b666040860160208701614999565b6001600160401b0316118015613b9f5750613b876040850160208601614999565b6001600160401b0316613b9d426202a3006150e8565b115b613c015760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610553565b8335613c1f5760405162461bcd60e51b815260040161055390614dbc565b83355f90815260078201602052604090205415613c4e5760405162461bcd60e51b815260040161055390614dfd565b613c5b6040850185614b1e565b9050603014613c7c5760405162461bcd60e51b815260040161055390614e45565b613c8583613fc3565b5f80613d1f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613cca9190614999565b6001600160401b03168152602001613ce560408a018a614b1e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614372565b5f82815260058601602052604090209193509150613d3d82826152e8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613d6a908590600401614a23565b6020604051808303815f875af1158015613d86573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613daa9190614a55565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115613e2257613e226149b2565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f02918e01908e01614999565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613f535760405163cd78605960e01b8152306004820152602401610553565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f9c576040519150601f19603f3d011682016040523d82523d5f602084013e613fa1565b606091505b5050905080611cf357604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061540d8339815191529060ff165f03614001575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061404990836150d5565b10614065576001600160401b0384166040830152808252614084565b83826040018181516140779190614ea9565b6001600160401b03169052505b5f82602001518360400151606461409b9190615219565b6140a591906153a7565b600285015490915060ff90811690821611156141205760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610553565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b61416c6139f9565b614174614717565b6123be8161471f565b6141856139f9565b613a42614795565b6141956139f9565b5f805160206153cd833981519152836142015760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610553565b6127108411156142235760405162461bcd60e51b8152600401610553906150fb565b8587111561428b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610553565b600a60ff8416118015906142a157505f8360ff16115b61430b5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610553565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146143dc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610553565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614453576144138160016150d5565b61441e906008614e92565b5081515f9083908390811061443557614435614bcc565b60200101906001600160f81b03191690815f1a9053506001016143ff565b505f5b60048110156144b15761446a8160036150d5565b614475906008614e92565b505f826144838360026150e8565b8151811061449357614493614bcc565b60200101906001600160f81b03191690815f1a905350600101614456565b505f5b602081101561450e57845181602081106144d0576144d0614bcc565b1a60f81b826144e08360066150e8565b815181106144f0576144f0614bcc565b60200101906001600160f81b03191690815f1a9053506001016144b4565b505f5b602081101561456e578460200151816020811061453057614530614bcc565b1a60f81b826145408360266150e8565b8151811061455057614550614bcc565b60200101906001600160f81b03191690815f1a905350600101614511565b505f5b60088110156145e2576145858160076150d5565b614590906008614e92565b60ff1685604001516001600160401b0316901c60f81b828260466145b491906150e8565b815181106145c4576145c4614bcc565b60200101906001600160f81b03191690815f1a905350600101614571565b505f5b603081101561464d578460800151818151811061460457614604614bcc565b01602001516001600160f81b0319168261461f83604e6150e8565b8151811061462f5761462f614bcc565b60200101906001600160f81b03191690815f1a9053506001016145e5565b505f5b60088110156146bf576146648160076150d5565b61466f906008614e92565b60608601516001600160401b0390811691161c60f81b8261469183607e6150e8565b815181106146a1576146a1614bcc565b60200101906001600160f81b03191690815f1a905350600101614650565b506002816040516146d09190614d76565b602060405180830381855afa1580156146eb573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061470e9190614a55565b94909350915050565b613a426139f9565b6147276139f9565b80355f8051602061540d83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556147716060830160408401615269565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b61260b6139f9565b5080546147a990614ec9565b5f825580601f106147b8575050565b601f0160209004905f5260205f20908101906123be91905b808211156147e3575f81556001016147d0565b5090565b80151581146123be575f80fd5b803563ffffffff81168114611d24575f80fd5b5f805f60608486031215614819575f80fd5b83359250602084013561482b816147e7565b9150614839604085016147f4565b90509250925092565b5f60208284031215614852575f80fd5b5035919050565b5f60208284031215614869575f80fd5b81356001600160401b0381111561487e575f80fd5b820160e08185031215610b36575f80fd5b803561ffff81168114611d24575f80fd5b80356001600160401b0381168114611d24575f80fd5b5f805f606084860312156148c8575f80fd5b83356001600160401b038111156148dd575f80fd5b8401606081870312156148ee575f80fd5b92506148fc6020850161488f565b9150614839604085016148a0565b5f6020828403121561491a575f80fd5b610b36826147f4565b5f8060408385031215614934575f80fd5b61493d836147f4565b946020939093013593505050565b5f806040838503121561495c575f80fd5b82356001600160401b03811115614971575f80fd5b830160808186031215614982575f80fd5b9150614990602084016147f4565b90509250929050565b5f602082840312156149a9575f80fd5b610b36826148a0565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156149fa576149fa6149c6565b5092915050565b5f5b83811015614a1b578181015183820152602001614a03565b50505f910152565b602081525f8251806020840152614a41816040850160208701614a01565b601f01601f19169190910160400192915050565b5f60208284031215614a65575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614a8e57614a8e614a6c565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f808335601e19843603018112614b33575f80fd5b8301803591506001600160401b03821115614b4c575f80fd5b602001915036819003821315614b60575f80fd5b9250929050565b848152836020820152818360408301375f91016040019081529392505050565b5f808335601e19843603018112614b9c575f80fd5b8301803591506001600160401b03821115614bb5575f80fd5b6020019150600581901b3603821315614b60575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614bf4575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614c3457614c34614bfe565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c6257614c62614bfe565b604052919050565b5f6001600160401b03821115614c8257614c82614bfe565b50601f01601f191660200190565b5f60608236031215614ca0575f80fd5b614ca8614c12565b823581526020614cb98185016148a0565b8183015260408401356001600160401b03811115614cd5575f80fd5b840136601f820112614ce5575f80fd5b8035614cf8614cf382614c6a565b614c3a565b8181523684838501011115614d0b575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551614d38818460208a01614a01565b80830190508581526001600160401b0360c01b8560c01b1660208201528351614d68816028840160208801614a01565b016028019695505050505050565b5f8251614bf4818460208701614a01565b6bffffffffffffffffffffffff198135818116916014851015614db45780818660140360031b1b83161692505b505092915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b8082028115828204841417610a2157610a216149c6565b6001600160401b038181168382160190808211156149fa576149fa6149c6565b600181811c90821680614edd57607f821691505b602082108103614efb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201525f8051602061542d8339815191526040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614f4781614ec9565b806020870152604060018084165f8114614f685760018114614f8457614fb1565b60ff19851660408a0152604084151560051b8a01019550614fb1565b895f5260205f205f5b85811015614fa85781548b8201860152908301908801614f8d565b8a016040019650505b509398975050505050505050565b6001600160a01b03811681146123be575f80fd5b8051611d24816147e7565b5f8060408385031215614fef575f80fd5b82516001600160401b0380821115615005575f80fd5b9084019060608287031215615018575f80fd5b615020614c12565b8251815260208084015161503381614fbf565b82820152604084015183811115615048575f80fd5b80850194505087601f85011261505c575f80fd5b8351925061506c614cf384614c6a565b838152888285870101111561507f575f80fd5b61508e84838301848801614a01565b806040840152508195506150a3818801614fd3565b9450505050509250929050565b5f6001600160401b038083168181036150cb576150cb6149c6565b6001019392505050565b81810381811115610a2157610a216149c6565b80820180821115610a2157610a216149c6565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614db457614db46149c6565b5f8235609e19833603018112614bf4575f80fd5b5f60208284031215615260575f80fd5b610b368261488f565b5f60208284031215615279575f80fd5b813560ff81168114610b36575f80fd5b5f60208284031215615299575f80fd5b8135610b3681614fbf565b601f821115611cf357805f5260205f20601f840160051c810160208510156152c95750805b601f840160051c820191505b81811015611572575f81556001016152d5565b81516001600160401b0381111561530157615301614bfe565b6153158161530f8454614ec9565b846152a4565b602080601f831160018114615348575f84156153315750858301515b5f19600386901b1c1916600185901b17855561539f565b5f85815260208120601f198616915b8281101561537657888601518255948401946001909101908401615357565b508582101561539357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b03808416806153c0576153c0614a6c565b9216919091049291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0056616c696461746f724d616e616765723a20696e76616c69642076616c6964619b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516155fe3803806155fe83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154b18061014d5f395ff3fe60806040526004361061011b575f3560e01c8063561404fd1161009d578063a3a65e4811610062578063a3a65e481461034c578063b771b3bc1461036b578063ba3a4b971461039d578063bee0a03f146103bc578063c599e24f146103db575f80fd5b8063561404fd146102b157806362065856146102d057806366435abf146102ef57806376f786211461030e57806398f3e2b41461032d575f80fd5b806335455ded116100e357806335455ded146102195780633d68fe291461024157806340034a9314610260578063467ef06f146102735780635297fae614610292575f80fd5b80630118acc41461011f5780630322ed98146101405780630cdd09851461015f578063151d30d1146101bc5780632e2194d8146101e2575b5f80fd5b34801561012a575f80fd5b5061013e61013936600461481f565b6103ee565b005b34801561014b575f80fd5b5061013e61015a36600461485a565b610858565b34801561016a575f80fd5b506101a961017936600461485a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101c7575f80fd5b506101d0600a81565b60405160ff90911681526020016101b3565b3480156101ed575f80fd5b506102016101fc36600461485a565b610a11565b6040516001600160401b0390911681526020016101b3565b348015610224575f80fd5b5061022e61271081565b60405161ffff90911681526020016101b3565b34801561024c575f80fd5b5061013e61025b366004614871565b610a27565b6101a961026e3660046148ce565b610b09565b34801561027e575f80fd5b5061013e61028d366004614922565b610b3d565b34801561029d575f80fd5b5061013e6102ac36600461493b565b610b90565b3480156102bc575f80fd5b5061013e6102cb366004614963565b610d65565b3480156102db575f80fd5b506101a96102ea3660046149b1565b61147a565b3480156102fa575f80fd5b5061020161030936600461485a565b611493565b348015610319575f80fd5b5061013e61032836600461481f565b6114a7565b348015610338575f80fd5b5061013e61034736600461493b565b611588565b348015610357575f80fd5b5061013e610366366004614922565b6117b5565b348015610376575f80fd5b506103856005600160991b0181565b6040516001600160a01b0390911681526020016101b3565b3480156103a8575f80fd5b5061013e6103b736600461485a565b61196d565b3480156103c7575f80fd5b5061013e6103d636600461485a565b611bf3565b6101a96103e936600461485a565b611d07565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206153e58339815191529184156104405761043d8285611d38565b90505b5f868152600684016020526040808220815161010081019092528054829060ff166004811115610472576104726149ca565b6004811115610483576104836149ca565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561050a5761050a6149ca565b1461055c5760405162461bcd60e51b815260206004820152602a60248201525f805160206154058339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105c15760405162461bcd60e51b815260206004820152603360248201525f805160206154058339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610553565b5f6105cb84611fd4565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff19166001836004811115610618576106186149ca565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106ea85612064565b905082606001516001600160401b031681608001516001600160401b0316116107615760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610553565b5f8360600151826080015161077691906149f2565b90506107828682612157565b5f6005600160991b0163ee5b48eb61079b89878661219f565b6040518263ffffffff1660e01b81526004016107b79190614a3b565b6020604051808303815f875af11580156107d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f79190614a6d565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206154858339815191526020526040808220815160e0810190925280545f8051602061542583398151915293929190829060ff1660058111156108a5576108a56149ca565b60058111156108b6576108b66149ca565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610925576109256149ca565b1461098a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610553565b6005600160991b016001600160a01b031663ee5b48eb6109af8584606001515f61219f565b6040518263ffffffff1660e01b81526004016109cb9190614a3b565b6020604051808303815f875af11580156109e7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0b9190614a6d565b50505050565b5f610a2164e8d4a5100083614a98565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a70575080546001600160401b03808416911610155b15610a8e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ab8836123c4565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b126123d8565b610b1e8484843461240f565b9050610b3660015f8051602061546583398151915255565b9392505050565b5f805160206153e58339815191525f80610b5684612635565b6040808201515f848152600588016020529190912054929450909250610a0b916001600160401b03909116906001600160a01b031661299a565b5f805160206153e58339815191525f610ba8846129ad565b90505f80610bb98360400151612b87565b50915091505f610bc883612064565b9050816001600160401b031681606001516001600160401b03161015610c005760405162461bcd60e51b815260040161055390614aab565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c455760405162461bcd60e51b815260040161055390614aed565b60015f87815260068701602052604090205460ff166004811115610c6b57610c6b6149ca565b14610cd45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610553565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206154258339815191529060ff1615610e025760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610553565b5f610e0c836129ad565b90505f610e1c8260400151612dc2565b90505f85356020870135610e336040890189614b36565b604051602001610e469493929190614b7f565b60408051601f1981840301815291905290505f610e666060880188614b9f565b905090505f5b81811015610ee8575f610e8260608a018a614b9f565b83818110610e9257610e92614be4565b9050602002810190610ea49190614bf8565b610ead90614ca8565b80516020808301516040808501519051949550610ecd9489949301614d3f565b60408051601f19818403018152919052935050600101610e6c565b5082600283604051610efa9190614d8e565b602060405180830381855afa158015610f15573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f389190614a6d565b14610f9c5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610553565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fdf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110039190614a6d565b8760200135146110655760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610553565b6110726040880188614b36565b90506014146110d65760405162461bcd60e51b815260206004820152603a60248201525f8051602061544583398151915260448201527f746f72206d616e616765722061646472657373206c656e6774680000000000006064820152608401610553565b306110e46040890189614b36565b6110ed91614d9f565b60601c146111465760405162461bcd60e51b815260206004820152603360248201525f80516020615445833981519152604482015272746f72206d616e61676572206164647265737360681b6064820152608401610553565b5f6111546060890189614b9f565b9050116111b35760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b6064820152608401610553565b5f5b81811015611461575f6111cb60608a018a614b9f565b838181106111db576111db614be4565b90506020028101906111ed9190614bf8565b6111f690614ca8565b604080518b3560208201529081018490529091505f9060029060600160408051601f198184030181529082905261122c91614d8e565b602060405180830381855afa158015611247573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061126a9190614a6d565b82519091508061128c5760405162461bcd60e51b815260040161055390614dd4565b5f81815260078a016020526040902054156112b95760405162461bcd60e51b815260040161055390614e15565b8260400151516030146112de5760405162461bcd60e51b815260040161055390614e5d565b5f81815260078a0160209081526040808320859055805160e081018252600180825287518285015287840180516001600160401b039081168486015260608401879052905116608083015260a0820185905260c0820185905286855260068e0190935292208251815491929091839160ff1990911690836005811115611366576113666149ca565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905561141082611fd4565b5082516020808501516040516001600160401b03909116815284917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050506001016111b5565b5050506008909201805460ff1916600117905550505050565b5f610a216001600160401b03831664e8d4a51000614eaa565b5f61149d82612064565b6080015192915050565b5f805160206153e58339815191525f6114bf85612064565b5f86815260058401602052604090205460a08201519192506114f291600160b01b9091046001600160401b031690614ec1565b6001600160401b03164210156115665760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610553565b8315611578576115768584611d38565b505b61158185612f2b565b5050505050565b6115906123d8565b5f805160206153e58339815191525f6115a8846129ad565b90505f806115b98360400151612b87565b50915091505f6115c883612064565b9050816001600160401b031681606001516001600160401b031610156116005760405162461bcd60e51b815260040161055390614aab565b5f8681526006860160205260409020600301546001600160401b038084169116111561163e5760405162461bcd60e51b815260040161055390614aed565b60035f87815260068701602052604090205460ff166004811115611664576116646149ca565b146116b85760405162461bcd60e51b815260206004820152603160248201525f805160206154058339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610553565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261175d9161299a565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506117b160015f8051602061546583398151915255565b5050565b5f805160206154258339815191525f6117cd836129ad565b90505f806117de8360400151613221565b91509150806118405760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610553565b5f8281526005850160205260408120805461185a90614ee1565b905011801561188c575060015f83815260068601602052604090205460ff16600581111561188a5761188a6149ca565b145b6118a85760405162461bcd60e51b815260040161055390614f19565b5f82815260058501602052604081206118c0916147b5565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153e583398151915293929190829060ff1660048111156119ce576119ce6149ca565b60048111156119df576119df6149ca565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a6657611a666149ca565b1480611a845750600381516004811115611a8257611a826149ca565b145b611ad85760405162461bcd60e51b815260206004820152603260248201525f80516020615405833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610553565b5f611ae68260400151612064565b905080606001516001600160401b03165f03611b6a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610553565b6005600160991b016001600160a01b031663ee5b48eb611b9784604001518460600151856080015161219f565b6040518263ffffffff1660e01b8152600401611bb39190614a3b565b6020604051808303815f875af1158015611bcf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115819190614a6d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020615425833981519152929190611c3b90614ee1565b9050118015611c6d575060015f83815260068301602052604090205460ff166005811115611c6b57611c6b6149ca565b145b611c895760405162461bcd60e51b815260040161055390614f19565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611cc29190600401614f4d565b6020604051808303815f875af1158015611cde573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d029190614a6d565b505050565b5f611d106123d8565b611d1b8233346133c2565b9050611d3360015f8051602061546583398151915255565b919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d83573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611daa9190810190614ff6565b9150915080611e0d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610553565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e50573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e749190614a6d565b825114611ed85760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610553565b60208201516001600160a01b031615611f4e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610553565b5f80611f5d846040015161382f565b91509150818714611fca5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610553565b9695505050505050565b5f8181525f805160206154858339815191526020526040812060020180545f8051602061542583398151915291600160401b9091046001600160401b031690600861201e836150c8565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061548583398151915290528390208351918201909352825491925f8051602061542583398151915292829060ff1660058111156120e4576120e46149ca565b60058111156120f5576120f56149ca565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f9182525f80516020615485833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612218576121d88160016150ed565b6121e3906008614eaa565b5081515f908390839081106121fa576121fa614be4565b60200101906001600160f81b03191690815f1a9053506001016121c4565b505f5b60048110156122835761222f8160036150ed565b61223a906008614eaa565b600263ffffffff16901c60f81b828260026122559190615100565b8151811061226557612265614be4565b60200101906001600160f81b03191690815f1a90535060010161221b565b505f5b60208110156122e55761229a81601f6150ed565b6122a5906008614eaa565b86901c60f81b826122b7836006615100565b815181106122c7576122c7614be4565b60200101906001600160f81b03191690815f1a905350600101612286565b505f5b6008811015612350576122fc8160076150ed565b612307906008614eaa565b6001600160401b038616901c60f81b82612322836026615100565b8151811061233257612332614be4565b60200101906001600160f81b03191690815f1a9053506001016122e8565b505f5b60088110156123bb576123678160076150ed565b612372906008614eaa565b6001600160401b038516901c60f81b8261238d83602e615100565b8151811061239d5761239d614be4565b60200101906001600160f81b03191690815f1a905350600101612353565b50949350505050565b6123cc613a07565b6123d581613a52565b50565b5f8051602061546583398151915280546001190161240957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206153e58339815191529061ffff86161080159061245b575061271061ffff861611155b6124775760405162461bcd60e51b815260040161055390615113565b60028101546001600160401b0390811690851610156124f05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610553565b80548310801590612505575080600101548311155b6125635760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b6064820152608401610553565b825f61256e82610a11565b90505f61257b8983613aca565b9050604051806060016040528061258f3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061546583398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206154258339815191525f612684856129ad565b90505f806126958360400151613221565b9150915080156126fa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610553565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561272b5761272b6149ca565b600581111561273c5761273c6149ca565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156127ad576127ad6149ca565b14806127cb57506001825160058111156127c9576127c96149ca565b145b6128175760405162461bcd60e51b815260206004820152602a60248201525f80516020615445833981519152604482015269746f722073746174757360b01b6064820152608401610553565b60038251600581111561282c5761282c6149ca565b036128395750600461283d565b5060055b6020808301515f90815260078801909152604081205581816005811115612866576128666149ca565b90816005811115612879576128796149ca565b9052505f84815260068701602052604090208251815484929190829060ff191660018360058111156128ad576128ad6149ca565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612961576129616149ca565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6117b16001600160a01b03821683613f3e565b60408051606080820183525f8083526020830181905292820152905f805160206154258339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a22573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a499190810190614ff6565b9150915080612aa95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610553565b8254825114612b0c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610553565b60208201516001600160a01b031615612b7f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610553565b509392505050565b5f805f8351603614612bab5760405162461bcd60e51b81526004016105539061515e565b5f805b6002811015612bfa57612bc28160016150ed565b612bcd906008614eaa565b61ffff16868281518110612be357612be3614be4565b016020015160f81c901b9190911790600101612bae565b5061ffff811615612c1d5760405162461bcd60e51b8152600401610553906151a7565b5f805b6004811015612c7857612c348160036150ed565b612c3f906008614eaa565b63ffffffff1687612c51836002615100565b81518110612c6157612c61614be4565b016020015160f81c901b9190911790600101612c20565b5063ffffffff8116600414612c9f5760405162461bcd60e51b8152600401610553906151ea565b5f805b6020811015612cf457612cb681601f6150ed565b612cc1906008614eaa565b88612ccd836006615100565b81518110612cdd57612cdd614be4565b016020015160f81c901b9190911790600101612ca2565b505f805b6008811015612d5357612d0c8160076150ed565b612d17906008614eaa565b6001600160401b031689612d2c836026615100565b81518110612d3c57612d3c614be4565b016020015160f81c901b9190911790600101612cf8565b505f805b6008811015612db257612d6b8160076150ed565b612d76906008614eaa565b6001600160401b03168a612d8b83602e615100565b81518110612d9b57612d9b614be4565b016020015160f81c901b9190911790600101612d57565b5091989097509095509350505050565b5f8151602614612de45760405162461bcd60e51b81526004016105539061515e565b5f805b6002811015612e3357612dfb8160016150ed565b612e06906008614eaa565b61ffff16848281518110612e1c57612e1c614be4565b016020015160f81c901b9190911790600101612de7565b5061ffff811615612e565760405162461bcd60e51b8152600401610553906151a7565b5f805b6004811015612eb157612e6d8160036150ed565b612e78906008614eaa565b63ffffffff1685612e8a836002615100565b81518110612e9a57612e9a614be4565b016020015160f81c901b9190911790600101612e59565b5063ffffffff811615612ed65760405162461bcd60e51b8152600401610553906151ea565b5f805b60208110156123bb57612eed81601f6150ed565b612ef8906008614eaa565b86612f04836006615100565b81518110612f1457612f14614be4565b016020015160f81c901b9190911790600101612ed9565b5f8181525f805160206154858339815191526020526040808220815160e0810190925280545f8051602061542583398151915293929190829060ff166005811115612f7857612f786149ca565b6005811115612f8957612f896149ca565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612ffb57612ffb6149ca565b146130575760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610553565b6130648160800151613fd1565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156130a8576130a86149ca565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61315d8461315781611fd4565b5f61219f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061318c908590600401614a3b565b6020604051808303815f875af11580156131a8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131cc9190614a6d565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146132445760405162461bcd60e51b81526004016105539061515e565b5f805b60028110156132935761325b8160016150ed565b613266906008614eaa565b61ffff1685828151811061327c5761327c614be4565b016020015160f81c901b9190911790600101613247565b5061ffff8116156132b65760405162461bcd60e51b8152600401610553906151a7565b5f805b6004811015613311576132cd8160036150ed565b6132d8906008614eaa565b63ffffffff16866132ea836002615100565b815181106132fa576132fa614be4565b016020015160f81c901b91909117906001016132b9565b5063ffffffff81166003146133385760405162461bcd60e51b8152600401610553906151ea565b5f805b602081101561338d5761334f81601f6150ed565b61335a906008614eaa565b87613366836006615100565b8151811061337657613376614be4565b016020015160f81c901b919091179060010161333b565b505f866026815181106133a2576133a2614be4565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206153e5833981519152816133db84610a11565b90505f6133e787612064565b90506002815160058111156133fe576133fe6149ca565b1461345d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610553565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166134f05760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610553565b5f8282608001516135019190614ec1565b60048501546040840151919250613523916001600160401b0390911690615231565b6001600160401b0316816001600160401b031611156135a25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610553565b6135ac8882612157565b5f6135b689611fd4565b90505f89826040516020016135e292919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061360385613fd1565b5f6005600160991b0163ee5b48eb61361c8d868861219f565b6040518263ffffffff1660e01b81526004016136389190614a3b565b6020604051808303815f875af1158015613654573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136789190614a6d565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613700576137006149ca565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e146138525760405162461bcd60e51b81526004016105539061515e565b5f805b60028110156138a1576138698160016150ed565b613874906008614eaa565b61ffff1685828151811061388a5761388a614be4565b016020015160f81c901b9190911790600101613855565b5061ffff8116156138c45760405162461bcd60e51b8152600401610553906151a7565b5f805b600481101561391f576138db8160036150ed565b6138e6906008614eaa565b63ffffffff16866138f8836002615100565b8151811061390857613908614be4565b016020015160f81c901b91909117906001016138c7565b5063ffffffff81166005146139465760405162461bcd60e51b8152600401610553906151ea565b5f805b602081101561399b5761395d81601f6150ed565b613968906008614eaa565b87613974836006615100565b8151811061398457613984614be4565b016020015160f81c901b9190911790600101613949565b505f805b60088110156139fa576139b38160076150ed565b6139be906008614eaa565b6001600160401b0316886139d3836026615100565b815181106139e3576139e3614be4565b016020015160f81c901b919091179060010161399f565b5090969095509350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a5057604051631afcd79f60e31b815260040160405180910390fd5b565b613a5a613a07565b613a6c613a678280615254565b614172565b613a7461418b565b6123d560208201356040830135613a9160808501606086016149b1565b613aa160a0860160808701615268565b61ffff16613ab560c0870160a08801615281565b613ac560e0880160c089016152a1565b61419b565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613b555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610553565b5f8051602061542583398151915242613b7460408601602087016149b1565b6001600160401b0316118015613bad5750613b9560408501602086016149b1565b6001600160401b0316613bab426202a300615100565b115b613c0f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b6064820152608401610553565b8335613c2d5760405162461bcd60e51b815260040161055390614dd4565b83355f90815260078201602052604090205415613c5c5760405162461bcd60e51b815260040161055390614e15565b613c696040850185614b36565b9050603014613c8a5760405162461bcd60e51b815260040161055390614e5d565b613c9383613fd1565b5f80613d2d6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613cd891906149b1565b6001600160401b03168152602001613cf360408a018a614b36565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614380565b5f82815260058601602052604090209193509150613d4b8282615300565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613d78908590600401614a3b565b6020604051808303815f875af1158015613d94573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613db89190614a6d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115613e3057613e306149ca565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f10918e01908e016149b1565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613f615760405163cd78605960e01b8152306004820152602401610553565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613faa576040519150601f19603f3d011682016040523d82523d5f602084013e613faf565b606091505b5050905080611d0257604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206154258339815191529060ff165f0361400f575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061405790836150ed565b10614073576001600160401b0384166040830152808252614092565b83826040018181516140859190614ec1565b6001600160401b03169052505b5f8260200151836040015160646140a99190615231565b6140b391906153bf565b600285015490915060ff908116908216111561412e5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b6064820152608401610553565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b61417a613a07565b61418261472f565b6123d581614737565b614193613a07565b613a506147ad565b6141a3613a07565b5f805160206153e58339815191528361420f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610553565b6127108411156142315760405162461bcd60e51b815260040161055390615113565b858711156142995760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610553565b600a60ff8416118015906142af57505f8360ff16115b6143195760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610553565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146143ea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610553565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614461576144218160016150ed565b61442c906008614eaa565b5081515f9083908390811061444357614443614be4565b60200101906001600160f81b03191690815f1a90535060010161440d565b505f5b60048110156144c9576144788160036150ed565b614483906008614eaa565b600160ff919091161c60f81b8261449b836002615100565b815181106144ab576144ab614be4565b60200101906001600160f81b03191690815f1a905350600101614464565b505f5b602081101561452657845181602081106144e8576144e8614be4565b1a60f81b826144f8836006615100565b8151811061450857614508614be4565b60200101906001600160f81b03191690815f1a9053506001016144cc565b505f5b6020811015614586578460200151816020811061454857614548614be4565b1a60f81b82614558836026615100565b8151811061456857614568614be4565b60200101906001600160f81b03191690815f1a905350600101614529565b505f5b60088110156145fa5761459d8160076150ed565b6145a8906008614eaa565b60ff1685604001516001600160401b0316901c60f81b828260466145cc9190615100565b815181106145dc576145dc614be4565b60200101906001600160f81b03191690815f1a905350600101614589565b505f5b6030811015614665578460800151818151811061461c5761461c614be4565b01602001516001600160f81b0319168261463783604e615100565b8151811061464757614647614be4565b60200101906001600160f81b03191690815f1a9053506001016145fd565b505f5b60088110156146d75761467c8160076150ed565b614687906008614eaa565b60608601516001600160401b0390811691161c60f81b826146a983607e615100565b815181106146b9576146b9614be4565b60200101906001600160f81b03191690815f1a905350600101614668565b506002816040516146e89190614d8e565b602060405180830381855afa158015614703573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906147269190614a6d565b94909350915050565b613a50613a07565b61473f613a07565b80355f8051602061542583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556147896060830160408401615281565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612622613a07565b5080546147c190614ee1565b5f825580601f106147d0575050565b601f0160209004905f5260205f20908101906123d591905b808211156147fb575f81556001016147e8565b5090565b80151581146123d5575f80fd5b803563ffffffff81168114611d33575f80fd5b5f805f60608486031215614831575f80fd5b833592506020840135614843816147ff565b91506148516040850161480c565b90509250925092565b5f6020828403121561486a575f80fd5b5035919050565b5f60208284031215614881575f80fd5b81356001600160401b03811115614896575f80fd5b820160e08185031215610b36575f80fd5b803561ffff81168114611d33575f80fd5b80356001600160401b0381168114611d33575f80fd5b5f805f606084860312156148e0575f80fd5b83356001600160401b038111156148f5575f80fd5b840160608187031215614906575f80fd5b9250614914602085016148a7565b9150614851604085016148b8565b5f60208284031215614932575f80fd5b610b368261480c565b5f806040838503121561494c575f80fd5b6149558361480c565b946020939093013593505050565b5f8060408385031215614974575f80fd5b82356001600160401b03811115614989575f80fd5b83016080818603121561499a575f80fd5b91506149a86020840161480c565b90509250929050565b5f602082840312156149c1575f80fd5b610b36826148b8565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614a1257614a126149de565b5092915050565b5f5b83811015614a33578181015183820152602001614a1b565b50505f910152565b602081525f8251806020840152614a59816040850160208701614a19565b601f01601f19169190910160400192915050565b5f60208284031215614a7d575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614aa657614aa6614a84565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f808335601e19843603018112614b4b575f80fd5b8301803591506001600160401b03821115614b64575f80fd5b602001915036819003821315614b78575f80fd5b9250929050565b848152836020820152818360408301375f91016040019081529392505050565b5f808335601e19843603018112614bb4575f80fd5b8301803591506001600160401b03821115614bcd575f80fd5b6020019150600581901b3603821315614b78575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614c0c575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614c4c57614c4c614c16565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c7a57614c7a614c16565b604052919050565b5f6001600160401b03821115614c9a57614c9a614c16565b50601f01601f191660200190565b5f60608236031215614cb8575f80fd5b614cc0614c2a565b823581526020614cd18185016148b8565b8183015260408401356001600160401b03811115614ced575f80fd5b840136601f820112614cfd575f80fd5b8035614d10614d0b82614c82565b614c52565b8181523684838501011115614d23575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551614d50818460208a01614a19565b80830190508581526001600160401b0360c01b8560c01b1660208201528351614d80816028840160208801614a19565b016028019695505050505050565b5f8251614c0c818460208701614a19565b6bffffffffffffffffffffffff198135818116916014851015614dcc5780818660140360031b1b83161692505b505092915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b8082028115828204841417610a2157610a216149de565b6001600160401b03818116838216019080821115614a1257614a126149de565b600181811c90821680614ef557607f821691505b602082108103614f1357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201525f805160206154458339815191526040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614f5f81614ee1565b806020870152604060018084165f8114614f805760018114614f9c57614fc9565b60ff19851660408a0152604084151560051b8a01019550614fc9565b895f5260205f205f5b85811015614fc05781548b8201860152908301908801614fa5565b8a016040019650505b509398975050505050505050565b6001600160a01b03811681146123d5575f80fd5b8051611d33816147ff565b5f8060408385031215615007575f80fd5b82516001600160401b038082111561501d575f80fd5b9084019060608287031215615030575f80fd5b615038614c2a565b8251815260208084015161504b81614fd7565b82820152604084015183811115615060575f80fd5b80850194505087601f850112615074575f80fd5b83519250615084614d0b84614c82565b8381528882858701011115615097575f80fd5b6150a684838301848801614a19565b806040840152508195506150bb818801614feb565b9450505050509250929050565b5f6001600160401b038083168181036150e3576150e36149de565b6001019392505050565b81810381811115610a2157610a216149de565b80820180821115610a2157610a216149de565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614dcc57614dcc6149de565b5f8235609e19833603018112614c0c575f80fd5b5f60208284031215615278575f80fd5b610b36826148a7565b5f60208284031215615291575f80fd5b813560ff81168114610b36575f80fd5b5f602082840312156152b1575f80fd5b8135610b3681614fd7565b601f821115611d0257805f5260205f20601f840160051c810160208510156152e15750805b601f840160051c820191505b81811015611581575f81556001016152ed565b81516001600160401b0381111561531957615319614c16565b61532d816153278454614ee1565b846152bc565b602080601f831160018114615360575f84156153495750858301515b5f19600386901b1c1916600185901b1785556153b7565b5f85815260208120601f198616915b8281101561538e5788860151825594840194600190910190840161536f565b50858210156153ab57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b03808416806153d8576153d8614a84565b9216919091049291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0056616c696461746f724d616e616765723a20696e76616c69642076616c6964619b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index b7de9eb2c..550b9febe 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -63,7 +63,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"subnetConversionData\",\"type\":\"tuple\",\"internalType\":\"structSubnetConversionData\",\"components\":[{\"name\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"bytes\",\"internalType\":\"bytes\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161367638038061367683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6135298061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c80638994ab4911610088578063a3a65e4811610063578063a3a65e4814610225578063b771b3bc14610238578063bee0a03f14610246578063f2fde38b14610259575f80fd5b80638994ab49146101bb5780638da5cb5b146101ce57806397fb70d414610212575f80fd5b8063467ef06f116100c3578063467ef06f14610162578063561404fd1461017557806366435abf14610188578063715018a6146101b3575f80fd5b80630322ed98146100e95780630cb0a105146100fe5780630cdd098514610111575b5f80fd5b6100fc6100f7366004612a72565b61026c565b005b6100fc61010c366004612a9d565b61042a565b61014f61011f366004612a72565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6100fc610170366004612b07565b610538565b6100fc610183366004612b20565b610546565b61019b610196366004612a72565b610c4c565b6040516001600160401b039091168152602001610159565b6100fc610c60565b61014f6101c9366004612b84565b610c73565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610159565b6100fc610220366004612a72565b610c8f565b6100fc610233366004612b07565b610ca3565b6101fa6005600160991b0181565b6100fc610254366004612a72565b610e5b565b6100fc610267366004612bc9565b610f6a565b5f8181525f805160206134fd8339815191526020526040808220815160e0810190925280545f805160206134bd83398151915293929190829060ff1660058111156102b9576102b9612beb565b60058111156102ca576102ca612beb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561033957610339612beb565b146103a35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103c88584606001515f610fa4565b6040518263ffffffff1660e01b81526004016103e49190612c21565b6020604051808303815f875af1158015610400573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104249190612c53565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561046e5750825b90505f826001600160401b031660011480156104895750303b155b905081158015610497575080155b156104b55760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104df57845460ff60401b1916600160401b1785555b6104e987876111c1565b831561052f57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610541816111df565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206134bd8339815191529060ff16156105e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161039a565b5f6105ed83611544565b90505f6105fd8260400151611725565b90505f853560208701356106146040890189612c6a565b6040516020016106279493929190612cb3565b60408051601f1981840301815291905280519091505f5b818110156106ba575f61065460608a018a612cd3565b8381811061066457610664612d18565b90506020028101906106769190612d2c565b61067f90612ddc565b8051602080830151604080850151905194955061069f9489949301612e73565b60408051601f1981840301815291905293505060010161063e565b50826002836040516106cc9190612ec2565b602060405180830381855afa1580156106e7573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061070a9190612c53565b1461076e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161039a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d59190612c53565b8760200135146108375760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161039a565b6108446040880188612c6a565b90506014146108a85760405162461bcd60e51b815260206004820152603a60248201525f805160206134dd83398151915260448201527f746f72206d616e616765722061646472657373206c656e677468000000000000606482015260840161039a565b306108b66040890189612c6a565b6108bf91612ed3565b60601c146109185760405162461bcd60e51b815260206004820152603360248201525f805160206134dd833981519152604482015272746f72206d616e61676572206164647265737360681b606482015260840161039a565b5f6109266060890189612cd3565b9050116109855760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161039a565b5f5b81811015610c33575f61099d60608a018a612cd3565b838181106109ad576109ad612d18565b90506020028101906109bf9190612d2c565b6109c890612ddc565b604080518b3560208201529081018490529091505f9060029060600160408051601f19818403018152908290526109fe91612ec2565b602060405180830381855afa158015610a19573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a3c9190612c53565b825190915080610a5e5760405162461bcd60e51b815260040161039a90612f08565b5f81815260078a01602052604090205415610a8b5760405162461bcd60e51b815260040161039a90612f49565b826040015151603014610ab05760405162461bcd60e51b815260040161039a90612f91565b5f81815260078a0160209081526040808320859055805160e081018252600180825287518285015287840180516001600160401b039081168486015260608401879052905116608083015260a0820185905260c0820185905286855260068e0190935292208251815491929091839160ff1990911690836005811115610b3857610b38612beb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055610be282611890565b5082516020808501516040516001600160401b03909116815284917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101610987565b5050506008909201805460ff1916600117905550505050565b5f610c5682611920565b6080015192915050565b610c68611a13565b610c715f611a6e565b565b5f610c7c611a13565b610c868383611ade565b90505b92915050565b610c97611a13565b610ca081611f52565b50565b5f805160206134bd8339815191525f610cbb83611544565b90505f80610ccc8360400151612248565b9150915080610d2e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161039a565b5f82815260058501602052604081208054610d4890612fde565b9050118015610d7a575060015f83815260068601602052604090205460ff166005811115610d7857610d78612beb565b145b610d965760405162461bcd60e51b815260040161039a90613016565b5f8281526005850160205260408120610dae91612a28565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206134bd833981519152929190610ea390612fde565b9050118015610ed5575060015f83815260068301602052604090205460ff166005811115610ed357610ed3612beb565b145b610ef15760405162461bcd60e51b815260040161039a90613016565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610f2a919060040161304a565b6020604051808303815f875af1158015610f46573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105419190612c53565b610f72611a13565b6001600160a01b038116610f9b57604051631e4fbdf760e01b81525f600482015260240161039a565b610ca081611a6e565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561101d57610fdd8160016130e8565b610fe89060086130fb565b5081515f90839083908110610fff57610fff612d18565b60200101906001600160f81b03191690815f1a905350600101610fc9565b505f5b6004811015611080576110348160036130e8565b61103f9060086130fb565b6001901c60f81b82611052836002613112565b8151811061106257611062612d18565b60200101906001600160f81b03191690815f1a905350600101611020565b505f5b60208110156110e25761109781601f6130e8565b6110a29060086130fb565b86901c60f81b826110b4836006613112565b815181106110c4576110c4612d18565b60200101906001600160f81b03191690815f1a905350600101611083565b505f5b600881101561114d576110f98160076130e8565b6111049060086130fb565b6001600160401b038616901c60f81b8261111f836026613112565b8151811061112f5761112f612d18565b60200101906001600160f81b03191690815f1a9053506001016110e5565b505f5b60088110156111b8576111648160076130e8565b61116f9060086130fb565b6001600160401b038516901c60f81b8261118a83602e613112565b8151811061119a5761119a612d18565b60200101906001600160f81b03191690815f1a905350600101611150565b50949350505050565b6111c96123e9565b6111d282612432565b6111db8161244b565b5050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206134bd8339815191525f61122e85611544565b90505f8061123f8360400151612248565b9150915080156112a45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161039a565b5f828152600685016020526040808220815160e081019092528054829060ff1660058111156112d5576112d5612beb565b60058111156112e6576112e6612beb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561135757611357612beb565b1480611375575060018251600581111561137357611373612beb565b145b6113c15760405162461bcd60e51b815260206004820152602a60248201525f805160206134dd833981519152604482015269746f722073746174757360b01b606482015260840161039a565b6003825160058111156113d6576113d6612beb565b036113e3575060046113e7565b5060055b6020808301515f9081526007880190915260408120558181600581111561141057611410612beb565b9081600581111561142357611423612beb565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561145757611457612beb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561150b5761150b612beb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830181905292820152905f805160206134bd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115b9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e09190810190613134565b91509150806116475760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b606482015260840161039a565b82548251146116aa5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161039a565b60208201516001600160a01b03161561171d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161039a565b509392505050565b5f81516026146117475760405162461bcd60e51b815260040161039a90613206565b5f805b60028110156117965761175e8160016130e8565b6117699060086130fb565b61ffff1684828151811061177f5761177f612d18565b016020015160f81c901b919091179060010161174a565b5061ffff8116156117b95760405162461bcd60e51b815260040161039a9061324f565b5f805b6004811015611814576117d08160036130e8565b6117db9060086130fb565b63ffffffff16856117ed836002613112565b815181106117fd576117fd612d18565b016020015160f81c901b91909117906001016117bc565b5063ffffffff811660051461183b5760405162461bcd60e51b815260040161039a90613292565b5f805b60208110156111b85761185281601f6130e8565b61185d9060086130fb565b86611869836006613112565b8151811061187957611879612d18565b016020015160f81c901b919091179060010161183e565b5f8181525f805160206134fd8339815191526020526040812060020180545f805160206134bd83398151915291600160401b9091046001600160401b03169060086118da836132d9565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206134fd83398151915290528390208351918201909352825491925f805160206134bd83398151915292829060ff1660058111156119a0576119a0612beb565b60058111156119b1576119b1612beb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b33611a457f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c715760405163118cdaa760e01b815233600482015260240161039a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16611b695760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161039a565b5f805160206134bd83398151915242611b8860408601602087016132fe565b6001600160401b0316118015611bc15750611ba960408501602086016132fe565b6001600160401b0316611bbf426202a300613112565b115b611c235760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161039a565b8335611c415760405162461bcd60e51b815260040161039a90612f08565b83355f90815260078201602052604090205415611c705760405162461bcd60e51b815260040161039a90612f49565b611c7d6040850185612c6a565b9050603014611c9e5760405162461bcd60e51b815260040161039a90612f91565b611ca78361245c565b5f80611d416040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611cec91906132fe565b6001600160401b03168152602001611d0760408a018a612c6a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506125fd565b5f82815260058601602052604090209193509150611d5f8282613362565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d8c908590600401612c21565b6020604051808303815f875af1158015611da8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dcc9190612c53565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115611e4457611e44612beb565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f24918e01908e016132fe565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206134fd8339815191526020526040808220815160e0810190925280545f805160206134bd83398151915293929190829060ff166005811115611f9f57611f9f612beb565b6005811115611fb057611fb0612beb565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561202257612022612beb565b1461207e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161039a565b61208b816080015161245c565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156120cf576120cf612beb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121848461217e81611890565b5f610fa4565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906121b3908590600401612c21565b6020604051808303815f875af11580156121cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121f39190612c53565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461226b5760405162461bcd60e51b815260040161039a90613206565b5f805b60028110156122ba576122828160016130e8565b61228d9060086130fb565b61ffff168582815181106122a3576122a3612d18565b016020015160f81c901b919091179060010161226e565b5061ffff8116156122dd5760405162461bcd60e51b815260040161039a9061324f565b5f805b6004811015612338576122f48160036130e8565b6122ff9060086130fb565b63ffffffff1686612311836002613112565b8151811061232157612321612d18565b016020015160f81c901b91909117906001016122e0565b5063ffffffff811660021461235f5760405162461bcd60e51b815260040161039a90613292565b5f805b60208110156123b45761237681601f6130e8565b6123819060086130fb565b8761238d836006613112565b8151811061239d5761239d612d18565b016020015160f81c901b9190911790600101612362565b505f866026815181106123c9576123c9612d18565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c7157604051631afcd79f60e31b815260040160405180910390fd5b61243a6123e9565b6124426129a2565b610ca0816129aa565b6124536123e9565b610ca081612a20565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206134bd8339815191529060ff165f0361249a575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906124e290836130e8565b106124fe576001600160401b038416604083015280825261251d565b83826040018181516125109190613421565b6001600160401b03169052505b5f8260200151836040015160646125349190613448565b61253e919061346b565b600285015490915060ff90811690821611156125b95760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161039a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f60608260800151516030146126675760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161039a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156126de5761269e8160016130e8565b6126a99060086130fb565b5081515f908390839081106126c0576126c0612d18565b60200101906001600160f81b03191690815f1a90535060010161268a565b505f5b600481101561273c576126f58160036130e8565b6127009060086130fb565b505f8261270e836002613112565b8151811061271e5761271e612d18565b60200101906001600160f81b03191690815f1a9053506001016126e1565b505f5b6020811015612799578451816020811061275b5761275b612d18565b1a60f81b8261276b836006613112565b8151811061277b5761277b612d18565b60200101906001600160f81b03191690815f1a90535060010161273f565b505f5b60208110156127f957846020015181602081106127bb576127bb612d18565b1a60f81b826127cb836026613112565b815181106127db576127db612d18565b60200101906001600160f81b03191690815f1a90535060010161279c565b505f5b600881101561286d576128108160076130e8565b61281b9060086130fb565b60ff1685604001516001600160401b0316901c60f81b8282604661283f9190613112565b8151811061284f5761284f612d18565b60200101906001600160f81b03191690815f1a9053506001016127fc565b505f5b60308110156128d8578460800151818151811061288f5761288f612d18565b01602001516001600160f81b031916826128aa83604e613112565b815181106128ba576128ba612d18565b60200101906001600160f81b03191690815f1a905350600101612870565b505f5b600881101561294a576128ef8160076130e8565b6128fa9060086130fb565b60608601516001600160401b0390811691161c60f81b8261291c83607e613112565b8151811061292c5761292c612d18565b60200101906001600160f81b03191690815f1a9053506001016128db565b5060028160405161295b9190612ec2565b602060405180830381855afa158015612976573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129999190612c53565b94909350915050565b610c716123e9565b6129b26123e9565b80355f805160206134bd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556129fc606083016040840161349c565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b610f726123e9565b508054612a3490612fde565b5f825580601f10612a43575050565b601f0160209004905f5260205f2090810190610ca091905b80821115612a6e575f8155600101612a5b565b5090565b5f60208284031215612a82575f80fd5b5035919050565b6001600160a01b0381168114610ca0575f80fd5b5f8060408385031215612aae575f80fd5b82356001600160401b03811115612ac3575f80fd5b830160a08186031215612ad4575f80fd5b91506020830135612ae481612a89565b809150509250929050565b803563ffffffff81168114612b02575f80fd5b919050565b5f60208284031215612b17575f80fd5b610c8682612aef565b5f8060408385031215612b31575f80fd5b82356001600160401b03811115612b46575f80fd5b830160808186031215612b57575f80fd5b9150612b6560208401612aef565b90509250929050565b80356001600160401b0381168114612b02575f80fd5b5f8060408385031215612b95575f80fd5b82356001600160401b03811115612baa575f80fd5b830160608186031215612bbb575f80fd5b9150612b6560208401612b6e565b5f60208284031215612bd9575f80fd5b8135612be481612a89565b9392505050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612c19578181015183820152602001612c01565b50505f910152565b602081525f8251806020840152612c3f816040850160208701612bff565b601f01601f19169190910160400192915050565b5f60208284031215612c63575f80fd5b5051919050565b5f808335601e19843603018112612c7f575f80fd5b8301803591506001600160401b03821115612c98575f80fd5b602001915036819003821315612cac575f80fd5b9250929050565b848152836020820152818360408301375f91016040019081529392505050565b5f808335601e19843603018112612ce8575f80fd5b8301803591506001600160401b03821115612d01575f80fd5b6020019150600581901b3603821315612cac575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612d40575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612d8057612d80612d4a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612dae57612dae612d4a565b604052919050565b5f6001600160401b03821115612dce57612dce612d4a565b50601f01601f191660200190565b5f60608236031215612dec575f80fd5b612df4612d5e565b823581526020612e05818501612b6e565b8183015260408401356001600160401b03811115612e21575f80fd5b840136601f820112612e31575f80fd5b8035612e44612e3f82612db6565b612d86565b8181523684838501011115612e57575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551612e84818460208a01612bff565b80830190508581526001600160401b0360c01b8560c01b1660208201528351612eb4816028840160208801612bff565b016028019695505050505050565b5f8251612d40818460208701612bff565b6bffffffffffffffffffffffff198135818116916014851015612f005780818660140360031b1b83161692505b505092915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b600181811c90821680612ff257607f821691505b60208210810361301057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201525f805160206134dd8339815191526040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461305c81612fde565b806020870152604060018084165f811461307d5760018114613099576130c6565b60ff19851660408a0152604084151560051b8a010195506130c6565b895f5260205f205f5b858110156130bd5781548b82018601529083019088016130a2565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c8957610c896130d4565b8082028115828204841417610c8957610c896130d4565b80820180821115610c8957610c896130d4565b80518015158114612b02575f80fd5b5f8060408385031215613145575f80fd5b82516001600160401b038082111561315b575f80fd5b908401906060828703121561316e575f80fd5b613176612d5e565b8251815260208084015161318981612a89565b8282015260408401518381111561319e575f80fd5b80850194505087601f8501126131b2575f80fd5b835192506131c2612e3f84612db6565b83815288828587010111156131d5575f80fd5b6131e484838301848801612bff565b806040840152508195506131f9818801613125565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b038083168181036132f4576132f46130d4565b6001019392505050565b5f6020828403121561330e575f80fd5b610c8682612b6e565b601f82111561054157805f5260205f20601f840160051c8101602085101561333c5750805b601f840160051c820191505b8181101561335b575f8155600101613348565b5050505050565b81516001600160401b0381111561337b5761337b612d4a565b61338f816133898454612fde565b84613317565b602080601f8311600181146133c2575f84156133ab5750858301515b5f19600386901b1c1916600185901b178555613419565b5f85815260208120601f198616915b828110156133f0578886015182559484019460019091019084016133d1565b508582101561340d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115613441576134416130d4565b5092915050565b6001600160401b03818116838216028082169190828114612f0057612f006130d4565b5f6001600160401b038084168061349057634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f602082840312156134ac575f80fd5b813560ff81168114612be4575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0056616c696461746f724d616e616765723a20696e76616c69642076616c696461e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161368e38038061368e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6135418061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100e5575f3560e01c80638994ab4911610088578063a3a65e4811610063578063a3a65e4814610225578063b771b3bc14610238578063bee0a03f14610246578063f2fde38b14610259575f80fd5b80638994ab49146101bb5780638da5cb5b146101ce57806397fb70d414610212575f80fd5b8063467ef06f116100c3578063467ef06f14610162578063561404fd1461017557806366435abf14610188578063715018a6146101b3575f80fd5b80630322ed98146100e95780630cb0a105146100fe5780630cdd098514610111575b5f80fd5b6100fc6100f7366004612a8a565b61026c565b005b6100fc61010c366004612ab5565b61042a565b61014f61011f366004612a8a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6100fc610170366004612b1f565b610538565b6100fc610183366004612b38565b610546565b61019b610196366004612a8a565b610c5b565b6040516001600160401b039091168152602001610159565b6100fc610c6f565b61014f6101c9366004612b9c565b610c82565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610159565b6100fc610220366004612a8a565b610c9e565b6100fc610233366004612b1f565b610cb2565b6101fa6005600160991b0181565b6100fc610254366004612a8a565b610e6a565b6100fc610267366004612be1565b610f79565b5f8181525f805160206135158339815191526020526040808220815160e0810190925280545f805160206134d583398151915293929190829060ff1660058111156102b9576102b9612c03565b60058111156102ca576102ca612c03565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561033957610339612c03565b146103a35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103c88584606001515f610fb3565b6040518263ffffffff1660e01b81526004016103e49190612c39565b6020604051808303815f875af1158015610400573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104249190612c6b565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561046e5750825b90505f826001600160401b031660011480156104895750303b155b905081158015610497575080155b156104b55760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff1916600117855583156104df57845460ff60401b1916600160401b1785555b6104e987876111d8565b831561052f57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610541816111f6565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206134d58339815191529060ff16156105e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161039a565b5f6105ed8361155b565b90505f6105fd8260400151611735565b90505f853560208701356106146040890189612c82565b6040516020016106279493929190612ccb565b60408051601f1981840301815291905290505f6106476060880188612ceb565b905090505f5b818110156106c9575f61066360608a018a612ceb565b8381811061067357610673612d30565b90506020028101906106859190612d44565b61068e90612df4565b805160208083015160408085015190519495506106ae9489949301612e8b565b60408051601f1981840301815291905293505060010161064d565b50826002836040516106db9190612eda565b602060405180830381855afa1580156106f6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107199190612c6b565b1461077d5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161039a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e49190612c6b565b8760200135146108465760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161039a565b6108536040880188612c82565b90506014146108b75760405162461bcd60e51b815260206004820152603a60248201525f805160206134f583398151915260448201527f746f72206d616e616765722061646472657373206c656e677468000000000000606482015260840161039a565b306108c56040890189612c82565b6108ce91612eeb565b60601c146109275760405162461bcd60e51b815260206004820152603360248201525f805160206134f5833981519152604482015272746f72206d616e61676572206164647265737360681b606482015260840161039a565b5f6109356060890189612ceb565b9050116109945760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161039a565b5f5b81811015610c42575f6109ac60608a018a612ceb565b838181106109bc576109bc612d30565b90506020028101906109ce9190612d44565b6109d790612df4565b604080518b3560208201529081018490529091505f9060029060600160408051601f1981840301815290829052610a0d91612eda565b602060405180830381855afa158015610a28573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a4b9190612c6b565b825190915080610a6d5760405162461bcd60e51b815260040161039a90612f20565b5f81815260078a01602052604090205415610a9a5760405162461bcd60e51b815260040161039a90612f61565b826040015151603014610abf5760405162461bcd60e51b815260040161039a90612fa9565b5f81815260078a0160209081526040808320859055805160e081018252600180825287518285015287840180516001600160401b039081168486015260608401879052905116608083015260a0820185905260c0820185905286855260068e0190935292208251815491929091839160ff1990911690836005811115610b4757610b47612c03565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055610bf18261189e565b5082516020808501516040516001600160401b03909116815284917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101610996565b5050506008909201805460ff1916600117905550505050565b5f610c658261192e565b6080015192915050565b610c77611a21565b610c805f611a7c565b565b5f610c8b611a21565b610c958383611aec565b90505b92915050565b610ca6611a21565b610caf81611f60565b50565b5f805160206134d58339815191525f610cca8361155b565b90505f80610cdb8360400151612256565b9150915080610d3d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161039a565b5f82815260058501602052604081208054610d5790612ff6565b9050118015610d89575060015f83815260068601602052604090205460ff166005811115610d8757610d87612c03565b145b610da55760405162461bcd60e51b815260040161039a9061302e565b5f8281526005850160205260408120610dbd91612a40565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206134d5833981519152929190610eb290612ff6565b9050118015610ee4575060015f83815260068301602052604090205460ff166005811115610ee257610ee2612c03565b145b610f005760405162461bcd60e51b815260040161039a9061302e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610f399190600401613062565b6020604051808303815f875af1158015610f55573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105419190612c6b565b610f81611a21565b6001600160a01b038116610faa57604051631e4fbdf760e01b81525f600482015260240161039a565b610caf81611a7c565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561102c57610fec816001613100565b610ff7906008613113565b5081515f9083908390811061100e5761100e612d30565b60200101906001600160f81b03191690815f1a905350600101610fd8565b505f5b600481101561109757611043816003613100565b61104e906008613113565b600263ffffffff16901c60f81b82826002611069919061312a565b8151811061107957611079612d30565b60200101906001600160f81b03191690815f1a90535060010161102f565b505f5b60208110156110f9576110ae81601f613100565b6110b9906008613113565b86901c60f81b826110cb83600661312a565b815181106110db576110db612d30565b60200101906001600160f81b03191690815f1a90535060010161109a565b505f5b600881101561116457611110816007613100565b61111b906008613113565b6001600160401b038616901c60f81b8261113683602661312a565b8151811061114657611146612d30565b60200101906001600160f81b03191690815f1a9053506001016110fc565b505f5b60088110156111cf5761117b816007613100565b611186906008613113565b6001600160401b038516901c60f81b826111a183602e61312a565b815181106111b1576111b1612d30565b60200101906001600160f81b03191690815f1a905350600101611167565b50949350505050565b6111e06123f7565b6111e982612440565b6111f281612459565b5050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206134d58339815191525f6112458561155b565b90505f806112568360400151612256565b9150915080156112bb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161039a565b5f828152600685016020526040808220815160e081019092528054829060ff1660058111156112ec576112ec612c03565b60058111156112fd576112fd612c03565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561136e5761136e612c03565b148061138c575060018251600581111561138a5761138a612c03565b145b6113d85760405162461bcd60e51b815260206004820152602a60248201525f805160206134f5833981519152604482015269746f722073746174757360b01b606482015260840161039a565b6003825160058111156113ed576113ed612c03565b036113fa575060046113fe565b5060055b6020808301515f9081526007880190915260408120558181600581111561142757611427612c03565b9081600581111561143a5761143a612c03565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561146e5761146e612c03565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561152257611522612c03565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830181905292820152905f805160206134d58339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115d0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115f7919081019061314c565b91509150806116575760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b606482015260840161039a565b82548251146116ba5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161039a565b60208201516001600160a01b03161561172d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161039a565b509392505050565b5f81516026146117575760405162461bcd60e51b815260040161039a9061321e565b5f805b60028110156117a65761176e816001613100565b611779906008613113565b61ffff1684828151811061178f5761178f612d30565b016020015160f81c901b919091179060010161175a565b5061ffff8116156117c95760405162461bcd60e51b815260040161039a90613267565b5f805b6004811015611824576117e0816003613100565b6117eb906008613113565b63ffffffff16856117fd83600261312a565b8151811061180d5761180d612d30565b016020015160f81c901b91909117906001016117cc565b5063ffffffff8116156118495760405162461bcd60e51b815260040161039a906132aa565b5f805b60208110156111cf5761186081601f613100565b61186b906008613113565b8661187783600661312a565b8151811061188757611887612d30565b016020015160f81c901b919091179060010161184c565b5f8181525f805160206135158339815191526020526040812060020180545f805160206134d583398151915291600160401b9091046001600160401b03169060086118e8836132f1565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061351583398151915290528390208351918201909352825491925f805160206134d583398151915292829060ff1660058111156119ae576119ae612c03565b60058111156119bf576119bf612c03565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b33611a537f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c805760405163118cdaa760e01b815233600482015260240161039a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16611b775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161039a565b5f805160206134d583398151915242611b966040860160208701613316565b6001600160401b0316118015611bcf5750611bb76040850160208601613316565b6001600160401b0316611bcd426202a30061312a565b115b611c315760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161039a565b8335611c4f5760405162461bcd60e51b815260040161039a90612f20565b83355f90815260078201602052604090205415611c7e5760405162461bcd60e51b815260040161039a90612f61565b611c8b6040850185612c82565b9050603014611cac5760405162461bcd60e51b815260040161039a90612fa9565b611cb58361246a565b5f80611d4f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611cfa9190613316565b6001600160401b03168152602001611d1560408a018a612c82565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061260b565b5f82815260058601602052604090209193509150611d6d828261337a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d9a908590600401612c39565b6020604051808303815f875af1158015611db6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dda9190612c6b565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115611e5257611e52612c03565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f32918e01908e01613316565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206135158339815191526020526040808220815160e0810190925280545f805160206134d583398151915293929190829060ff166005811115611fad57611fad612c03565b6005811115611fbe57611fbe612c03565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561203057612030612c03565b1461208c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161039a565b612099816080015161246a565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156120dd576120dd612c03565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121928461218c8161189e565b5f610fb3565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906121c1908590600401612c39565b6020604051808303815f875af11580156121dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122019190612c6b565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146122795760405162461bcd60e51b815260040161039a9061321e565b5f805b60028110156122c857612290816001613100565b61229b906008613113565b61ffff168582815181106122b1576122b1612d30565b016020015160f81c901b919091179060010161227c565b5061ffff8116156122eb5760405162461bcd60e51b815260040161039a90613267565b5f805b600481101561234657612302816003613100565b61230d906008613113565b63ffffffff168661231f83600261312a565b8151811061232f5761232f612d30565b016020015160f81c901b91909117906001016122ee565b5063ffffffff811660031461236d5760405162461bcd60e51b815260040161039a906132aa565b5f805b60208110156123c25761238481601f613100565b61238f906008613113565b8761239b83600661312a565b815181106123ab576123ab612d30565b016020015160f81c901b9190911790600101612370565b505f866026815181106123d7576123d7612d30565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c8057604051631afcd79f60e31b815260040160405180910390fd5b6124486123f7565b6124506129ba565b610caf816129c2565b6124616123f7565b610caf81612a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206134d58339815191529060ff165f036124a8575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e10906124f09083613100565b1061250c576001600160401b038416604083015280825261252b565b838260400181815161251e9190613439565b6001600160401b03169052505b5f8260200151836040015160646125429190613460565b61254c9190613483565b600285015490915060ff90811690821611156125c75760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161039a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f60608260800151516030146126755760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161039a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156126ec576126ac816001613100565b6126b7906008613113565b5081515f908390839081106126ce576126ce612d30565b60200101906001600160f81b03191690815f1a905350600101612698565b505f5b600481101561275457612703816003613100565b61270e906008613113565b600160ff919091161c60f81b8261272683600261312a565b8151811061273657612736612d30565b60200101906001600160f81b03191690815f1a9053506001016126ef565b505f5b60208110156127b1578451816020811061277357612773612d30565b1a60f81b8261278383600661312a565b8151811061279357612793612d30565b60200101906001600160f81b03191690815f1a905350600101612757565b505f5b602081101561281157846020015181602081106127d3576127d3612d30565b1a60f81b826127e383602661312a565b815181106127f3576127f3612d30565b60200101906001600160f81b03191690815f1a9053506001016127b4565b505f5b600881101561288557612828816007613100565b612833906008613113565b60ff1685604001516001600160401b0316901c60f81b82826046612857919061312a565b8151811061286757612867612d30565b60200101906001600160f81b03191690815f1a905350600101612814565b505f5b60308110156128f057846080015181815181106128a7576128a7612d30565b01602001516001600160f81b031916826128c283604e61312a565b815181106128d2576128d2612d30565b60200101906001600160f81b03191690815f1a905350600101612888565b505f5b600881101561296257612907816007613100565b612912906008613113565b60608601516001600160401b0390811691161c60f81b8261293483607e61312a565b8151811061294457612944612d30565b60200101906001600160f81b03191690815f1a9053506001016128f3565b506002816040516129739190612eda565b602060405180830381855afa15801561298e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129b19190612c6b565b94909350915050565b610c806123f7565b6129ca6123f7565b80355f805160206134d583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612a1460608301604084016134b4565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b610f816123f7565b508054612a4c90612ff6565b5f825580601f10612a5b575050565b601f0160209004905f5260205f2090810190610caf91905b80821115612a86575f8155600101612a73565b5090565b5f60208284031215612a9a575f80fd5b5035919050565b6001600160a01b0381168114610caf575f80fd5b5f8060408385031215612ac6575f80fd5b82356001600160401b03811115612adb575f80fd5b830160a08186031215612aec575f80fd5b91506020830135612afc81612aa1565b809150509250929050565b803563ffffffff81168114612b1a575f80fd5b919050565b5f60208284031215612b2f575f80fd5b610c9582612b07565b5f8060408385031215612b49575f80fd5b82356001600160401b03811115612b5e575f80fd5b830160808186031215612b6f575f80fd5b9150612b7d60208401612b07565b90509250929050565b80356001600160401b0381168114612b1a575f80fd5b5f8060408385031215612bad575f80fd5b82356001600160401b03811115612bc2575f80fd5b830160608186031215612bd3575f80fd5b9150612b7d60208401612b86565b5f60208284031215612bf1575f80fd5b8135612bfc81612aa1565b9392505050565b634e487b7160e01b5f52602160045260245ffd5b5f5b83811015612c31578181015183820152602001612c19565b50505f910152565b602081525f8251806020840152612c57816040850160208701612c17565b601f01601f19169190910160400192915050565b5f60208284031215612c7b575f80fd5b5051919050565b5f808335601e19843603018112612c97575f80fd5b8301803591506001600160401b03821115612cb0575f80fd5b602001915036819003821315612cc4575f80fd5b9250929050565b848152836020820152818360408301375f91016040019081529392505050565b5f808335601e19843603018112612d00575f80fd5b8301803591506001600160401b03821115612d19575f80fd5b6020019150600581901b3603821315612cc4575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612d58575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612d9857612d98612d62565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612dc657612dc6612d62565b604052919050565b5f6001600160401b03821115612de657612de6612d62565b50601f01601f191660200190565b5f60608236031215612e04575f80fd5b612e0c612d76565b823581526020612e1d818501612b86565b8183015260408401356001600160401b03811115612e39575f80fd5b840136601f820112612e49575f80fd5b8035612e5c612e5782612dce565b612d9e565b8181523684838501011115612e6f575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551612e9c818460208a01612c17565b80830190508581526001600160401b0360c01b8560c01b1660208201528351612ecc816028840160208801612c17565b016028019695505050505050565b5f8251612d58818460208701612c17565b6bffffffffffffffffffffffff198135818116916014851015612f185780818660140360031b1b83161692505b505092915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b600181811c9082168061300a57607f821691505b60208210810361302857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201525f805160206134f58339815191526040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461307481612ff6565b806020870152604060018084165f811461309557600181146130b1576130de565b60ff19851660408a0152604084151560051b8a010195506130de565b895f5260205f205f5b858110156130d55781548b82018601529083019088016130ba565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c9857610c986130ec565b8082028115828204841417610c9857610c986130ec565b80820180821115610c9857610c986130ec565b80518015158114612b1a575f80fd5b5f806040838503121561315d575f80fd5b82516001600160401b0380821115613173575f80fd5b9084019060608287031215613186575f80fd5b61318e612d76565b825181526020808401516131a181612aa1565b828201526040840151838111156131b6575f80fd5b80850194505087601f8501126131ca575f80fd5b835192506131da612e5784612dce565b83815288828587010111156131ed575f80fd5b6131fc84838301848801612c17565b8060408401525081955061321181880161313d565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6001600160401b0380831681810361330c5761330c6130ec565b6001019392505050565b5f60208284031215613326575f80fd5b610c9582612b86565b601f82111561054157805f5260205f20601f840160051c810160208510156133545750805b601f840160051c820191505b81811015613373575f8155600101613360565b5050505050565b81516001600160401b0381111561339357613393612d62565b6133a7816133a18454612ff6565b8461332f565b602080601f8311600181146133da575f84156133c35750858301515b5f19600386901b1c1916600185901b178555613431565b5f85815260208120601f198616915b82811015613408578886015182559484019460019091019084016133e9565b508582101561342557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115613459576134596130ec565b5092915050565b6001600160401b03818116838216028082169190828114612f1857612f186130ec565b5f6001600160401b03808416806134a857634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f602082840312156134c4575f80fd5b813560ff81168114612bfc575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0056616c696461746f724d616e616765723a20696e76616c69642076616c696461e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/packing.go b/abi-bindings/go/staking/PoAValidatorManager/packing.go index 192b5c3d8..1a4fa64ce 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/packing.go +++ b/abi-bindings/go/staking/PoAValidatorManager/packing.go @@ -3,51 +3,37 @@ package poavalidatormanager -import ( - "fmt" - - "github.com/ava-labs/subnet-evm/accounts/abi" -) - -var subnetConversionDataType abi.Type +func (s *SubnetConversionData) Pack() ([]byte, error) { + packedLen := 72 + len(s.ValidatorManagerAddress) + 88*len(s.InitialValidators) -func init() { - var err error - subnetConversionDataType, err = abi.NewType("tuple", "struct Overloader.F", []abi.ArgumentMarshaling{ - {Name: "convertSubnetTxID", Type: "bytes32"}, - {Name: "blockchainID", Type: "bytes32"}, - {Name: "validatorManagerAddress", Type: "bytes"}, - {Name: "initialValidators", Type: "tuple[]", Components: []abi.ArgumentMarshaling{ - {Name: "nodeID", Type: "bytes32"}, - {Name: "weight", Type: "uint64"}, - {Name: "blsPublicKey", Type: "bytes"}, - }}, - }) - if err != nil { - panic(fmt.Sprintf("failed to create subnetConversionData ABI type: %v", err)) + b := make([]byte, packedLen) + copy(b[0:32], s.ConvertSubnetTxID[:]) + copy(b[32:64], s.BlockchainID[:]) + lenAddress := len(s.ValidatorManagerAddress) + for i := 0; i < 4; i++ { + b[i+64] = byte(lenAddress >> uint(8*(1-i))) } -} - -func (s *SubnetConversionData) Pack() ([]byte, error) { - args := abi.Arguments{ - { - Name: "subnetConversionData", - Type: subnetConversionDataType, - }, + copy(b[68:68+lenAddress], s.ValidatorManagerAddress) + lenValidators := len(s.InitialValidators) + for i := 0; i < 4; i++ { + b[i+68+lenAddress] = byte(lenValidators >> uint8(8*(3-i))) } - return args.Pack(s) + for i, iv := range s.InitialValidators { + packedIv, err := iv.Pack() + if err != nil { + return nil, err + } + copy(b[72+lenAddress+i*88:72+lenAddress+(i+1)*88], packedIv) + } + return b, nil } -func (s *SubnetConversionData) Unpack(b []byte) error { - args := abi.Arguments{ - { - Name: "subnetConversionData", - Type: subnetConversionDataType, - }, - } - unpacked, err := args.Unpack(b) - if err != nil { - return fmt.Errorf("failed to unpack to subnetConversionData with err: %v", err) +func (iv *InitialValidator) Pack() ([]byte, error) { + b := make([]byte, 88) + copy(b[0:32], iv.NodeID[:]) + for i := 0; i < 8; i++ { + b[i+32] = byte(iv.Weight >> uint8(8*(7-i))) } - return args.Copy(&s, unpacked) + copy(b[40:88], iv.BlsPublicKey) + return b, nil } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index d1bdee66a..15ab9f1ba 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -122,7 +122,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida subnetConversionData.blockchainID, subnetConversionData.validatorManagerAddress ); - uint256 length = encodedConversion.length; + uint256 length = subnetConversionData.initialValidators.length; for (uint256 i; i < length; i++) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; encodedConversion = abi.encodePacked( diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index 4e4f0531b..9abd42346 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -19,26 +19,26 @@ library ValidatorMessages { // The P-Chain uses a hardcoded codecID of 0 for all messages. uint16 internal constant CODEC_ID = 0; + uint32 internal constant SUBNET_CONVERSION_MESSAGE_TYPE_ID = 0; + // Subnets send a RegisterSubnetValidator message to the P-Chain to register a validator. - uint32 internal constant REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID = 0; + uint32 internal constant REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID = 1; // Subnets can send a SetSubnetValidatorWeight message to the P-Chain to update a validator's weight. // The P-Chain responds with a SetSubnetValidatorWeight message acknowledging the weight update. - uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID = 1; + uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID = 2; // The P-Chain responds with a RegisterSubnetValidator message indicating whether the registration was successful // for the given validation ID. - uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 2; + uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 3; // The P-Chain responds with a SubnetValidatorWeightUpdateMessage message indicating whether the weight update was successful // for the given validation ID. - uint32 internal constant SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID = 3; + uint32 internal constant SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID = 4; // The Subnet will self-sign a ValidationUptimeMessage to be provided when a validator is initiating // the end of their validation period. - uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 4; - - uint32 internal constant SUBNET_CONVERSION_MESSAGE_TYPE_ID = 5; + uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 5; // TODO: The implementation of these packing and unpacking functions is neither tested nor optimized at all. // Full test coverage should be provided, and the implementation should be optimized for gas efficiency. diff --git a/go.mod b/go.mod index b60aa8a47..da15b08a4 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/ava-labs/teleporter go 1.22.6 require ( - github.com/ava-labs/avalanchego v1.11.11-0.20240814200552-b3b720666238 + github.com/ava-labs/avalanchego v1.11.11-0.20240916181957-b328a0503042 github.com/supranational/blst v0.3.11 // indirect ) diff --git a/go.sum b/go.sum index fd3cf5580..c85251bf5 100644 --- a/go.sum +++ b/go.sum @@ -58,6 +58,10 @@ 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-0.20240814200552-b3b720666238 h1:zxFjHBPwGo1WaNa7FLbIWgHeYk3y+ivm7RUdq4lZAW8= github.com/ava-labs/avalanchego v1.11.11-0.20240814200552-b3b720666238/go.mod h1:8pnf2At/q0LRq5dvYJYn3CkhKzZNHRd5pjARC9psu+g= +github.com/ava-labs/avalanchego v1.11.11-0.20240916162929-49fbcf01b980 h1:cWdx1WV5lQylGjz7Q+7SiuDdgmSegmT93BPSvfdkxm0= +github.com/ava-labs/avalanchego v1.11.11-0.20240916162929-49fbcf01b980/go.mod h1:8pnf2At/q0LRq5dvYJYn3CkhKzZNHRd5pjARC9psu+g= +github.com/ava-labs/avalanchego v1.11.11-0.20240916181957-b328a0503042 h1:Hk9sK9TPPXoVyIvl4rC+v1HF2M2BvjINCLtLmkbqWMo= +github.com/ava-labs/avalanchego v1.11.11-0.20240916181957-b328a0503042/go.mod h1:8pnf2At/q0LRq5dvYJYn3CkhKzZNHRd5pjARC9psu+g= github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814200841-1c435873fd12 h1:vcCa4wZTDPObQFauhjtkAqbHWty3vXQaoPJMFgptnWM= github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814200841-1c435873fd12/go.mod h1:cpfI3E4g0NsEjhJ9VHJ4xMLyOOAqqL1by0MhTIito/c= github.com/ava-labs/coreth v0.13.8-fix-genesis-upgrade h1:xWsvSGtZcGna3B2BLU2BvK3qskbcc9ZNtgC0ck91CkI= diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index cc0c51460..92ac749e4 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -8,8 +8,6 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" - avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" - "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" "github.com/ava-labs/subnet-evm/accounts/abi/bind" poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" @@ -76,9 +74,6 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { ownerAddress, ) - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) - Expect(err).Should(BeNil()) - convertSubnetTxId := ids.GenerateTestID() subnetConversionData := poavalidatormanager.SubnetConversionData{ ConvertSubnetTxID: convertSubnetTxId, @@ -92,18 +87,35 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { }, }, } - unsignedMsg := createOffChainSubnetConversionMessage(subnetConversionData, pChainInfo, network.GetNetworkID()) - unsignedMsgs := []avalancheWarp.UnsignedMessage{*unsignedMsg} - warpConfigWithMsg := utils.GetChainConfigWithOffChainMessages(unsignedMsgs) - chainConfigs := make(utils.ChainConfigMap) - chainConfigs.Add(subnetAInfo, warpConfigWithMsg) + subnetConversionDataBytes, err := subnetConversionData.Pack() + Expect(err).Should(BeNil()) + Expect(len(subnetConversionDataBytes)).Should(BeNumerically("==", 180)) + subnetConversionID := sha256.Sum256(subnetConversionDataBytes) + + subnetConversionSignedMessage := utils.ConstructSubnetConversionMessage( + subnetConversionID, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) - network.SetChainConfigs(chainConfigs) - // network.RestartNodes(context.Background(), network.GetAllNodeIDs()) + // Deliver the Warp message to the subnet + receipt := utils.InitializePoAValidatorSet( + fundedKey, + subnetAInfo, + validatorManagerAddress, + subnetConversionSignedMessage, + subnetConversionData, + ) - _, err = validatorManager.InitializeValidatorSet(opts, subnetConversionData, 0) + initialValidatorCreatedEvent, err := utils.GetEventFromLogs( + receipt.Logs, + validatorManager.ParseInitialValidatorCreated, + ) Expect(err).Should(BeNil()) + Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) var validationID ids.ID // To be used in the delisting step nodeID := ids.GenerateTestID() @@ -170,28 +182,3 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { ) } } - -func createOffChainSubnetConversionMessage( - subnetConversionData poavalidatormanager.SubnetConversionData, - pChainInfo interfaces.SubnetTestInfo, - networkID uint32, -) *avalancheWarp.UnsignedMessage { - subnetConversionBytes, err := subnetConversionData.Pack() - Expect(err).Should(BeNil()) - subnetConversionID := sha256.Sum256(subnetConversionBytes) - sourceAddress := []byte{} - - payloadBytes := make([]byte, 38) - copy(payloadBytes[:6], subnetConversionID[:]) - addressedPayload, err := payload.NewAddressedCall(sourceAddress, payloadBytes) - Expect(err).Should(BeNil()) - - unsignedMessage, err := avalancheWarp.NewUnsignedMessage( - networkID, - pChainInfo.BlockchainID, - addressedPayload.Bytes(), - ) - Expect(err).Should(BeNil()) - - return unsignedMessage -} diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 45d2d532e..af0a283ae 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -368,6 +368,26 @@ func CompletePoAValidatorRegistration( ) } +func InitializePoAValidatorSet( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + validatorManagerAddress common.Address, + subnetConversionSignedMessage *avalancheWarp.Message, + subnetConversionData poavalidatormanager.SubnetConversionData, +) *types.Receipt { + abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("initializeValidatorSet", subnetConversionData, uint32(0)) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, + sendingKey, + subnet, + validatorManagerAddress, + subnetConversionSignedMessage, + ) +} + // Calls a method that retreived a signed Warp message from the transaction's access list func CallWarpReceiver( callData []byte, @@ -1121,6 +1141,34 @@ func ConstructSubnetValidatorWeightUpdateMessage( return updateSignedMessage } +func ConstructSubnetConversionMessage( + subnetConversionID ids.ID, + subnet interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, +) *avalancheWarp.Message { + subnetConversionPayload, err := warpMessages.NewSubnetConversion(subnetConversionID) + Expect(err).Should(BeNil()) + subnetConversionAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), subnetConversionPayload.Bytes()) + Expect(err).Should(BeNil()) + subnetConversionUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( + network.GetNetworkID(), + pChainInfo.BlockchainID, + subnetConversionAddressedCall.Bytes(), + ) + Expect(err).Should(BeNil()) + + subnetConversionSignedMessage, err := signatureAggregator.CreateSignedMessage( + subnetConversionUnsignedMessage, + nil, + subnet.SubnetID, + 67, + ) + Expect(err).Should(BeNil()) + return subnetConversionSignedMessage +} + // // Warp message validiation utils // These will be replaced by the actual implementation on the P-Chain in the future From dcadbf1327beba7386dcb4cb9f19a4b5bcc10f78 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Mon, 16 Sep 2024 18:50:07 -0400 Subject: [PATCH 298/545] poa validator manager test passes --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- .../go/staking/PoAValidatorManager/PoAValidatorManager.go | 2 +- abi-bindings/go/staking/PoAValidatorManager/packing.go | 4 ++-- contracts/staking/ValidatorManager.sol | 3 +++ tests/flows/staking/poa_validator_manager.go | 5 +++-- 6 files changed, 11 insertions(+), 7 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 15853a98f..353dc3d63 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615a62380380615a6283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159158061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c806366435abf116100b4578063a3a65e4811610079578063a3a65e48146102bb578063b771b3bc146102ce578063ba3a4b97146102f4578063bee0a03f14610307578063d5f20ff61461031a578063eb0acb891461033a575f80fd5b806366435abf1461025c5780636f5f1c941461026f57806376f786211461028257806398f3e2b4146102955780639e1bc4ef146102a8575f80fd5b806335455ded116100fa57806335455ded146101f4578063467ef06f146102105780635297fae61461022357806361e2f490146102365780636206585614610249575f80fd5b80630118acc4146101365780630322ed981461014b5780630cdd09851461015e578063151d30d1146101af5780632e2194d8146101c9575b5f80fd5b610149610144366004614bee565b61034d565b005b610149610159366004614c29565b6107b7565b61019c61016c366004614c29565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101b7600a81565b60405160ff90911681526020016101a6565b6101dc6101d7366004614c29565b610970565b6040516001600160401b0390911681526020016101a6565b6101fd61271081565b60405161ffff90911681526020016101a6565b61014961021e366004614c40565b610986565b610149610231366004614c59565b6109d9565b610149610244366004614c81565b610bae565b61019c610257366004614ce5565b6112b1565b6101dc61026a366004614c29565b6112ca565b61014961027d366004614d12565b6112de565b610149610290366004614bee565b6113c2565b6101496102a3366004614c59565b6114a3565b61019c6102b6366004614d50565b6116d0565b6101496102c9366004614c40565b6116fc565b6102dc6005600160991b0181565b6040516001600160a01b0390911681526020016101a6565b610149610302366004614c29565b6118b4565b610149610315366004614c29565b611b3a565b61032d610328366004614c29565b611c4e565b6040516101a69190614d84565b61019c610348366004614e4b565b611d41565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061586983398151915291841561039f5761039c8285611d76565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103d1576103d1614d70565b60048111156103e2576103e2614d70565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561046957610469614d70565b146104bb5760405162461bcd60e51b815260206004820152602a60248201525f805160206158898339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105205760405162461bcd60e51b815260206004820152603360248201525f805160206158898339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104b2565b5f61052a84612012565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561057757610577614d70565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61064985611c4e565b905082606001516001600160401b031681608001516001600160401b0316116106c05760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104b2565b5f836060015182608001516106d59190614ec4565b90506106e186826120a2565b5f6005600160991b0163ee5b48eb6106fa8987866120ea565b6040518263ffffffff1660e01b81526004016107169190614f06565b6020604051808303815f875af1158015610732573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107569190614f38565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206158e98339815191526020526040808220815160e0810190925280545f805160206158a983398151915293929190829060ff16600581111561080457610804614d70565b600581111561081557610815614d70565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561088457610884614d70565b146108e95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb61090e8584606001515f6120ea565b6040518263ffffffff1660e01b815260040161092a9190614f06565b6020604051808303815f875af1158015610946573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096a9190614f38565b50505050565b5f61098064e8d4a5100083614f63565b92915050565b5f805160206158698339815191525f8061099f84612311565b6040808201515f84815260058801602052919091205492945090925061096a916001600160401b03909116906001600160a01b0316612689565b5f805160206158698339815191525f6109f1846126bf565b90505f80610a028360400151612899565b50915091505f610a1183611c4e565b9050816001600160401b031681606001516001600160401b03161015610a495760405162461bcd60e51b81526004016104b290614f76565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a8e5760405162461bcd60e51b81526004016104b290614fb8565b60015f87815260068701602052604090205460ff166004811115610ab457610ab4614d70565b14610b1d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206158a98339815191529060ff1615610c4b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb29190614f38565b836020013514610d145760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104b2565b30610d256060850160408601615001565b6001600160a01b031614610d975760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104b2565b5f610da5606085018561501c565b905011610e045760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104b2565b5f610e12606085018561501c565b91505063ffffffff8110610e7e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104b2565b5f843560208601356014610e986060890160408a01615001565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b828110156111c9575f610f11606088018861501c565b83818110610f2157610f21615068565b9050602002810190610f33919061507c565b610f3c9061512c565b805190915080610f5e5760405162461bcd60e51b81526004016104b2906151c3565b5f81815260078701602052604090205415610f8b5760405162461bcd60e51b81526004016104b290615204565b816040015151603014610fb05760405162461bcd60e51b81526004016104b29061524c565b83825f015183602001518460400151604051602001610fd29493929190615299565b60408051601f198184030181528282528a35602084015290820185905294505f9060029060600160408051601f1981840301815290829052611013916152e8565b602060405180830381855afa15801561102e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110519190614f38565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff191660018360058111156110dd576110dd614d70565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101610efb565b505f6111d4856126bf565b90505f6111e48260400151612ad4565b9050806002846040516111f791906152e8565b602060405180830381855afa158015611212573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112359190614f38565b146112995760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104b2565b5050506008909101805460ff19166001179055505050565b5f6109806001600160401b03831664e8d4a510006152f9565b5f6112d482611c4e565b6080015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611327575080546001600160401b03808416911610155b156113455760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556113708484612c46565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206158698339815191525f6113da85611c4e565b5f86815260058401602052604090205460a082015191925061140d91600160b01b9091046001600160401b031690615310565b6001600160401b03164210156114815760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104b2565b8315611493576114918584611d76565b505b61149c85612c60565b5050505050565b6114ab612f56565b5f805160206158698339815191525f6114c3846126bf565b90505f806114d48360400151612899565b50915091505f6114e383611c4e565b9050816001600160401b031681606001516001600160401b0316101561151b5760405162461bcd60e51b81526004016104b290614f76565b5f8681526006860160205260409020600301546001600160401b03808416911611156115595760405162461bcd60e51b81526004016104b290614fb8565b60035f87815260068701602052604090205460ff16600481111561157f5761157f614d70565b146115d35760405162461bcd60e51b815260206004820152603160248201525f805160206158898339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261167891612689565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506116cc60015f805160206158c983398151915255565b5050565b5f6116d9612f56565b6116e4833384612fa0565b905061098060015f805160206158c983398151915255565b5f805160206158a98339815191525f611714836126bf565b90505f806117258360400151613410565b91509150806117875760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104b2565b5f828152600585016020526040812080546117a190615330565b90501180156117d3575060015f83815260068601602052604090205460ff1660058111156117d1576117d1614d70565b145b6117ef5760405162461bcd60e51b81526004016104b290615368565b5f828152600585016020526040812061180791614b7f565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061586983398151915293929190829060ff16600481111561191557611915614d70565b600481111561192657611926614d70565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119ad576119ad614d70565b14806119cb57506003815160048111156119c9576119c9614d70565b145b611a1f5760405162461bcd60e51b815260206004820152603260248201525f80516020615889833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104b2565b5f611a2d8260400151611c4e565b905080606001516001600160401b03165f03611ab15760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb611ade8460400151846060015185608001516120ea565b6040518263ffffffff1660e01b8152600401611afa9190614f06565b6020604051808303815f875af1158015611b16573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149c9190614f38565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206158a9833981519152929190611b8290615330565b9050118015611bb4575060015f83815260068301602052604090205460ff166005811115611bb257611bb2614d70565b145b611bd05760405162461bcd60e51b81526004016104b290615368565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c0991906004016153af565b6020604051808303815f875af1158015611c25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c499190614f38565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206158e983398151915290528390208351918201909352825491925f805160206158a983398151915292829060ff166005811115611cce57611cce614d70565b6005811115611cdf57611cdf614d70565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611d4a612f56565b611d56858585856135b1565b9050611d6e60015f805160206158c983398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611dc1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611de89190810190615444565b9150915080611e4b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eb29190614f38565b825114611f165760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104b2565b60208201516001600160a01b031615611f8c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104b2565b5f80611f9b84604001516137cf565b915091508187146120085760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104b2565b9695505050505050565b5f8181525f805160206158e98339815191526020526040812060020180545f805160206158a983398151915291600160401b9091046001600160401b031690600861205c83615516565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f805160206158e9833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156121635761212381600161553b565b61212e9060086152f9565b5081515f9083908390811061214557612145615068565b60200101906001600160f81b03191690815f1a90535060010161210f565b505f5b60048110156121ce5761217a81600361553b565b6121859060086152f9565b600263ffffffff16901c60f81b828260026121a0919061554e565b815181106121b0576121b0615068565b60200101906001600160f81b03191690815f1a905350600101612166565b505f5b6020811015612230576121e581601f61553b565b6121f09060086152f9565b86901c60f81b8261220283600661554e565b8151811061221257612212615068565b60200101906001600160f81b03191690815f1a9053506001016121d1565b505f5b600881101561229b5761224781600761553b565b6122529060086152f9565b6001600160401b038616901c60f81b8261226d83602661554e565b8151811061227d5761227d615068565b60200101906001600160f81b03191690815f1a905350600101612233565b505f5b6008811015612306576122b281600761553b565b6122bd9060086152f9565b6001600160401b038516901c60f81b826122d883602e61554e565b815181106122e8576122e8615068565b60200101906001600160f81b03191690815f1a90535060010161229e565b5090505b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158a98339815191525f612360856126bf565b90505f806123718360400151613410565b9150915080156123d65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104b2565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561240757612407614d70565b600581111561241857612418614d70565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561248957612489614d70565b14806124a757506001825160058111156124a5576124a5614d70565b145b6125065760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104b2565b60038251600581111561251b5761251b614d70565b036125285750600461252c565b5060055b6020808301515f9081526007880190915260408120558181600581111561255557612555614d70565b9081600581111561256857612568614d70565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561259c5761259c614d70565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561265057612650614d70565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546116cc906001600160a01b031682846139a7565b60408051606080820183525f8083526020830181905292820152905f805160206158a98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612734573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261275b9190810190615444565b91509150806127bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104b2565b825482511461281e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104b2565b60208201516001600160a01b0316156128915760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104b2565b509392505050565b5f805f83516036146128bd5760405162461bcd60e51b81526004016104b290615561565b5f805b600281101561290c576128d481600161553b565b6128df9060086152f9565b61ffff168682815181106128f5576128f5615068565b016020015160f81c901b91909117906001016128c0565b5061ffff81161561292f5760405162461bcd60e51b81526004016104b2906155aa565b5f805b600481101561298a5761294681600361553b565b6129519060086152f9565b63ffffffff168761296383600261554e565b8151811061297357612973615068565b016020015160f81c901b9190911790600101612932565b5063ffffffff81166004146129b15760405162461bcd60e51b81526004016104b2906155ed565b5f805b6020811015612a06576129c881601f61553b565b6129d39060086152f9565b886129df83600661554e565b815181106129ef576129ef615068565b016020015160f81c901b91909117906001016129b4565b505f805b6008811015612a6557612a1e81600761553b565b612a299060086152f9565b6001600160401b031689612a3e83602661554e565b81518110612a4e57612a4e615068565b016020015160f81c901b9190911790600101612a0a565b505f805b6008811015612ac457612a7d81600761553b565b612a889060086152f9565b6001600160401b03168a612a9d83602e61554e565b81518110612aad57612aad615068565b016020015160f81c901b9190911790600101612a69565b5091989097509095509350505050565b5f8151602614612af65760405162461bcd60e51b81526004016104b290615561565b5f805b6002811015612b4557612b0d81600161553b565b612b189060086152f9565b61ffff16848281518110612b2e57612b2e615068565b016020015160f81c901b9190911790600101612af9565b5061ffff811615612b685760405162461bcd60e51b81526004016104b2906155aa565b5f805b6004811015612bc357612b7f81600361553b565b612b8a9060086152f9565b63ffffffff1685612b9c83600261554e565b81518110612bac57612bac615068565b016020015160f81c901b9190911790600101612b6b565b5063ffffffff811615612be85760405162461bcd60e51b81526004016104b2906155ed565b5f805b6020811015612c3d57612bff81601f61553b565b612c0a9060086152f9565b86612c1683600661554e565b81518110612c2657612c26615068565b016020015160f81c901b9190911790600101612beb565b50949350505050565b612c4e613a06565b612c5782613a51565b6116cc81613ac6565b5f8181525f805160206158e98339815191526020526040808220815160e0810190925280545f805160206158a983398151915293929190829060ff166005811115612cad57612cad614d70565b6005811115612cbe57612cbe614d70565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612d3057612d30614d70565b14612d8c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104b2565b612d998160800151613b7a565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115612ddd57612ddd614d70565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612e9284612e8c81612012565b5f6120ea565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612ec1908590600401614f06565b6020604051808303815f875af1158015612edd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f019190614f38565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f805160206158c9833981519152805460011901612f8757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206158c983398151915255565b5f5f8051602061586983398151915281612fbc6101d785613d1b565b90505f612fc887611c4e565b9050600281516005811115612fdf57612fdf614d70565b1461303e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104b2565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166130d15760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104b2565b5f8282608001516130e29190615310565b60048501546040840151919250613104916001600160401b0390911690615634565b6001600160401b0316816001600160401b031611156131835760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104b2565b61318d88826120a2565b5f61319789612012565b90505f89826040516020016131c392919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090506131e485613b7a565b5f6005600160991b0163ee5b48eb6131fd8d86886120ea565b6040518263ffffffff1660e01b81526004016132199190614f06565b6020604051808303815f875af1158015613235573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132599190614f38565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156132e1576132e1614d70565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134335760405162461bcd60e51b81526004016104b290615561565b5f805b60028110156134825761344a81600161553b565b6134559060086152f9565b61ffff1685828151811061346b5761346b615068565b016020015160f81c901b9190911790600101613436565b5061ffff8116156134a55760405162461bcd60e51b81526004016104b2906155aa565b5f805b6004811015613500576134bc81600361553b565b6134c79060086152f9565b63ffffffff16866134d983600261554e565b815181106134e9576134e9615068565b016020015160f81c901b91909117906001016134a8565b5063ffffffff81166003146135275760405162461bcd60e51b81526004016104b2906155ed565b5f805b602081101561357c5761353e81601f61553b565b6135499060086152f9565b8761355583600661554e565b8151811061356557613565615068565b016020015160f81c901b919091179060010161352a565b505f8660268151811061359157613591615068565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158698339815191529061ffff8616108015906135fd575061271061ffff861611155b6136195760405162461bcd60e51b81526004016104b29061565f565b60028101546001600160401b0390811690851610156136925760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104b2565b805483108015906136a7575080600101548311155b6137055760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104b2565b5f61370f84613d1b565b90505f61371b82610970565b90505f6137288983613d51565b9050604051806060016040528061373c3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146137f25760405162461bcd60e51b81526004016104b290615561565b5f805b60028110156138415761380981600161553b565b6138149060086152f9565b61ffff1685828151811061382a5761382a615068565b016020015160f81c901b91909117906001016137f5565b5061ffff8116156138645760405162461bcd60e51b81526004016104b2906155aa565b5f805b60048110156138bf5761387b81600361553b565b6138869060086152f9565b63ffffffff168661389883600261554e565b815181106138a8576138a8615068565b016020015160f81c901b9190911790600101613867565b5063ffffffff81166005146138e65760405162461bcd60e51b81526004016104b2906155ed565b5f805b602081101561393b576138fd81601f61553b565b6139089060086152f9565b8761391483600661554e565b8151811061392457613924615068565b016020015160f81c901b91909117906001016138e9565b505f805b600881101561399a5761395381600761553b565b61395e9060086152f9565b6001600160401b03168861397383602661554e565b8151811061398357613983615068565b016020015160f81c901b919091179060010161393f565b5090969095509350505050565b6040516001600160a01b03838116602483015260448201839052611c4991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506141c5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a4f57604051631afcd79f60e31b815260040160405180910390fd5b565b613a59613a06565b613a6281614226565b613a6a61423f565b613ac360608201356080830135613a8760c0850160a08601614ce5565b613a9760e0860160c087016156aa565b61ffff16613aac610100870160e088016156c3565b613abe61012088016101008901615001565b61424f565b50565b613ace613a06565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613b5a5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104b2565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206158a98339815191529060ff165f03613bb8575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613c00908361553b565b10613c1c576001600160401b0384166040830152808252613c3b565b8382604001818151613c2e9190615310565b6001600160401b03169052505b5f826020015183604001516064613c529190615634565b613c5c91906156e3565b600285015490915060ff9081169082161115613cd75760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104b2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610980827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690614493565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613ddc5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104b2565b5f805160206158a983398151915242613dfb6040860160208701614ce5565b6001600160401b0316118015613e345750613e1c6040850160208601614ce5565b6001600160401b0316613e32426202a30061554e565b115b613e965760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104b2565b8335613eb45760405162461bcd60e51b81526004016104b2906151c3565b83355f90815260078201602052604090205415613ee35760405162461bcd60e51b81526004016104b290615204565b613ef06040850185615708565b9050603014613f115760405162461bcd60e51b81526004016104b29061524c565b613f1a83613b7a565b5f80613fb46040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f5f9190614ce5565b6001600160401b03168152602001613f7a60408a018a615708565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506145f5565b5f82815260058601602052604090209193509150613fd2828261578e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613fff908590600401614f06565b6020604051808303815f875af115801561401b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061403f9190614f38565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff191660018360058111156140b7576140b7614d70565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614197918e01908e01614ce5565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6141d96001600160a01b038416836149a4565b905080515f141580156141fd5750808060200190518101906141fb919061584d565b155b15611c4957604051635274afe760e01b81526001600160a01b03841660048201526024016104b2565b61422e613a06565b6142366149b1565b613ac3816149b9565b614247613a06565b613a4f614a2f565b614257613a06565b5f80516020615869833981519152836142c35760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104b2565b6127108411156142e55760405162461bcd60e51b81526004016104b29061565f565b8587111561434d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104b2565b5f8360ff16116143ba5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104b2565b600a60ff8416111561442c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104b2565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156144d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144fd9190614f38565b90506145146001600160a01b038516333086614a37565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614558573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061457c9190614f38565b90508181116145e25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104b2565b6145ec828261553b565b95945050505050565b5f606082608001515160301461465f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104b2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156146d65761469681600161553b565b6146a19060086152f9565b5081515f908390839081106146b8576146b8615068565b60200101906001600160f81b03191690815f1a905350600101614682565b505f5b600481101561473e576146ed81600361553b565b6146f89060086152f9565b600160ff919091161c60f81b8261471083600261554e565b8151811061472057614720615068565b60200101906001600160f81b03191690815f1a9053506001016146d9565b505f5b602081101561479b578451816020811061475d5761475d615068565b1a60f81b8261476d83600661554e565b8151811061477d5761477d615068565b60200101906001600160f81b03191690815f1a905350600101614741565b505f5b60208110156147fb57846020015181602081106147bd576147bd615068565b1a60f81b826147cd83602661554e565b815181106147dd576147dd615068565b60200101906001600160f81b03191690815f1a90535060010161479e565b505f5b600881101561486f5761481281600761553b565b61481d9060086152f9565b60ff1685604001516001600160401b0316901c60f81b82826046614841919061554e565b8151811061485157614851615068565b60200101906001600160f81b03191690815f1a9053506001016147fe565b505f5b60308110156148da578460800151818151811061489157614891615068565b01602001516001600160f81b031916826148ac83604e61554e565b815181106148bc576148bc615068565b60200101906001600160f81b03191690815f1a905350600101614872565b505f5b600881101561494c576148f181600761553b565b6148fc9060086152f9565b60608601516001600160401b0390811691161c60f81b8261491e83607e61554e565b8151811061492e5761492e615068565b60200101906001600160f81b03191690815f1a9053506001016148dd565b5060028160405161495d91906152e8565b602060405180830381855afa158015614978573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061499b9190614f38565b94909350915050565b606061230a83835f614a70565b613a4f613a06565b6149c1613a06565b80355f805160206158a983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155614a0b60608301604084016156c3565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612f8d613a06565b6040516001600160a01b03848116602483015283811660448301526064820183905261096a9186918216906323b872dd906084016139d4565b606081471015614a955760405163cd78605960e01b81523060048201526024016104b2565b5f80856001600160a01b03168486604051614ab091906152e8565b5f6040518083038185875af1925050503d805f8114614aea576040519150601f19603f3d011682016040523d82523d5f602084013e614aef565b606091505b5091509150612008868383606082614b0f57614b0a82614b56565b61230a565b8151158015614b2657506001600160a01b0384163b155b15614b4f57604051639996b31560e01b81526001600160a01b03851660048201526024016104b2565b508061230a565b805115614b665780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614b8b90615330565b5f825580601f10614b9a575050565b601f0160209004905f5260205f2090810190613ac391905b80821115614bc5575f8155600101614bb2565b5090565b8015158114613ac3575f80fd5b803563ffffffff81168114614be9575f80fd5b919050565b5f805f60608486031215614c00575f80fd5b833592506020840135614c1281614bc9565b9150614c2060408501614bd6565b90509250925092565b5f60208284031215614c39575f80fd5b5035919050565b5f60208284031215614c50575f80fd5b61230a82614bd6565b5f8060408385031215614c6a575f80fd5b614c7383614bd6565b946020939093013593505050565b5f8060408385031215614c92575f80fd5b82356001600160401b03811115614ca7575f80fd5b830160808186031215614cb8575f80fd5b9150614cc660208401614bd6565b90509250929050565b80356001600160401b0381168114614be9575f80fd5b5f60208284031215614cf5575f80fd5b61230a82614ccf565b6001600160a01b0381168114613ac3575f80fd5b5f80828403610140811215614d25575f80fd5b61012080821215614d34575f80fd5b8493508301359050614d4581614cfe565b809150509250929050565b5f8060408385031215614d61575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614da757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614de260608401826001600160401b03169052565b506080830151614dfd60808401826001600160401b03169052565b5060a0830151614e1860a08401826001600160401b03169052565b5060c0830151614e3360c08401826001600160401b03169052565b5092915050565b803561ffff81168114614be9575f80fd5b5f805f8060808587031215614e5e575f80fd5b84356001600160401b03811115614e73575f80fd5b850160608188031215614e84575f80fd5b9350614e9260208601614e3a565b9250614ea060408601614ccf565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e3357614e33614eb0565b5f5b83811015614efe578181015183820152602001614ee6565b50505f910152565b602081525f8251806020840152614f24816040850160208701614ee4565b601f01601f19169190910160400192915050565b5f60208284031215614f48575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614f7157614f71614f4f565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615011575f80fd5b813561230a81614cfe565b5f808335601e19843603018112615031575f80fd5b8301803591506001600160401b0382111561504a575f80fd5b6020019150600581901b3603821315615061575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615090575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150d0576150d061509a565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150fe576150fe61509a565b604052919050565b5f6001600160401b0382111561511e5761511e61509a565b50601f01601f191660200190565b5f6060823603121561513c575f80fd5b6151446150ae565b823581526020615155818501614ccf565b8183015260408401356001600160401b03811115615171575f80fd5b840136601f820112615181575f80fd5b803561519461518f82615106565b6150d6565b81815236848385010111156151a7575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516152aa818460208a01614ee4565b80830190508581526001600160401b0360c01b8560c01b16602082015283516152da816028840160208801614ee4565b016028019695505050505050565b5f8251615090818460208701614ee4565b808202811582820484141761098057610980614eb0565b6001600160401b03818116838216019080821115614e3357614e33614eb0565b600181811c9082168061534457607f821691505b60208210810361536257634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546153c181615330565b806020870152604060018084165f81146153e257600181146153fe5761542b565b60ff19851660408a0152604084151560051b8a0101955061542b565b895f5260205f205f5b858110156154225781548b8201860152908301908801615407565b8a016040019650505b509398975050505050505050565b8051614be981614bc9565b5f8060408385031215615455575f80fd5b82516001600160401b038082111561546b575f80fd5b908401906060828703121561547e575f80fd5b6154866150ae565b8251815260208084015161549981614cfe565b828201526040840151838111156154ae575f80fd5b80850194505087601f8501126154c2575f80fd5b835192506154d261518f84615106565b83815288828587010111156154e5575f80fd5b6154f484838301848801614ee4565b80604084015250819550615509818801615439565b9450505050509250929050565b5f6001600160401b0380831681810361553157615531614eb0565b6001019392505050565b8181038181111561098057610980614eb0565b8082018082111561098057610980614eb0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461565757615657614eb0565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f602082840312156156ba575f80fd5b61230a82614e3a565b5f602082840312156156d3575f80fd5b813560ff8116811461230a575f80fd5b5f6001600160401b03808416806156fc576156fc614f4f565b92169190910492915050565b5f808335601e1984360301811261571d575f80fd5b8301803591506001600160401b03821115615736575f80fd5b602001915036819003821315615061575f80fd5b601f821115611c4957805f5260205f20601f840160051c8101602085101561576f5750805b601f840160051c820191505b8181101561149c575f815560010161577b565b81516001600160401b038111156157a7576157a761509a565b6157bb816157b58454615330565b8461574a565b602080601f8311600181146157ee575f84156157d75750858301515b5f19600386901b1c1916600185901b178555615845565b5f85815260208120601f198616915b8281101561581c578886015182559484019460019091019084016157fd565b508582101561583957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561585d575f80fd5b815161230a81614bc956fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615acf380380615acf83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159828061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c806366435abf116100b4578063a3a65e4811610079578063a3a65e48146102bb578063b771b3bc146102ce578063ba3a4b97146102f4578063bee0a03f14610307578063d5f20ff61461031a578063eb0acb891461033a575f80fd5b806366435abf1461025c5780636f5f1c941461026f57806376f786211461028257806398f3e2b4146102955780639e1bc4ef146102a8575f80fd5b806335455ded116100fa57806335455ded146101f4578063467ef06f146102105780635297fae61461022357806361e2f490146102365780636206585614610249575f80fd5b80630118acc4146101365780630322ed981461014b5780630cdd09851461015e578063151d30d1146101af5780632e2194d8146101c9575b5f80fd5b610149610144366004614c5b565b61034d565b005b610149610159366004614c96565b6107b7565b61019c61016c366004614c96565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101b7600a81565b60405160ff90911681526020016101a6565b6101dc6101d7366004614c96565b610970565b6040516001600160401b0390911681526020016101a6565b6101fd61271081565b60405161ffff90911681526020016101a6565b61014961021e366004614cad565b610986565b610149610231366004614cc6565b6109d9565b610149610244366004614cee565b610bae565b61019c610257366004614d52565b61131e565b6101dc61026a366004614c96565b611337565b61014961027d366004614d7f565b61134b565b610149610290366004614c5b565b61142f565b6101496102a3366004614cc6565b611510565b61019c6102b6366004614dbd565b61173d565b6101496102c9366004614cad565b611769565b6102dc6005600160991b0181565b6040516001600160a01b0390911681526020016101a6565b610149610302366004614c96565b611921565b610149610315366004614c96565b611ba7565b61032d610328366004614c96565b611cbb565b6040516101a69190614df1565b61019c610348366004614eb8565b611dae565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206158d683398151915291841561039f5761039c8285611de3565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103d1576103d1614ddd565b60048111156103e2576103e2614ddd565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561046957610469614ddd565b146104bb5760405162461bcd60e51b815260206004820152602a60248201525f805160206158f68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105205760405162461bcd60e51b815260206004820152603360248201525f805160206158f68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104b2565b5f61052a8461207f565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561057757610577614ddd565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61064985611cbb565b905082606001516001600160401b031681608001516001600160401b0316116106c05760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104b2565b5f836060015182608001516106d59190614f31565b90506106e1868261210f565b5f6005600160991b0163ee5b48eb6106fa898786612157565b6040518263ffffffff1660e01b81526004016107169190614f73565b6020604051808303815f875af1158015610732573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107569190614fa5565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206159568339815191526020526040808220815160e0810190925280545f8051602061591683398151915293929190829060ff16600581111561080457610804614ddd565b600581111561081557610815614ddd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561088457610884614ddd565b146108e95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb61090e8584606001515f612157565b6040518263ffffffff1660e01b815260040161092a9190614f73565b6020604051808303815f875af1158015610946573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096a9190614fa5565b50505050565b5f61098064e8d4a5100083614fd0565b92915050565b5f805160206158d68339815191525f8061099f8461237e565b6040808201515f84815260058801602052919091205492945090925061096a916001600160401b03909116906001600160a01b03166126f6565b5f805160206158d68339815191525f6109f18461272c565b90505f80610a028360400151612906565b50915091505f610a1183611cbb565b9050816001600160401b031681606001516001600160401b03161015610a495760405162461bcd60e51b81526004016104b290614fe3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a8e5760405162461bcd60e51b81526004016104b290615025565b60015f87815260068701602052604090205460ff166004811115610ab457610ab4614ddd565b14610b1d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206159168339815191529060ff1615610c4b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb29190614fa5565b836020013514610d145760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104b2565b30610d25606085016040860161506e565b6001600160a01b031614610d975760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104b2565b5f610da56060850185615089565b905011610e045760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104b2565b5f610e126060850185615089565b91505063ffffffff8110610e7e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104b2565b5f843560208601356014610e986060890160408a0161506e565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b828110156111c9575f610f116060880188615089565b83818110610f2157610f216150d5565b9050602002810190610f3391906150e9565b610f3c90615199565b805190915080610f5e5760405162461bcd60e51b81526004016104b290615230565b5f81815260078701602052604090205415610f8b5760405162461bcd60e51b81526004016104b290615271565b816040015151603014610fb05760405162461bcd60e51b81526004016104b2906152b9565b83825f015183602001518460400151604051602001610fd29493929190615306565b60408051601f198184030181528282528a35602084015290820185905294505f9060029060600160408051601f198184030181529082905261101391615355565b602060405180830381855afa15801561102e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110519190614fa5565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff191660018360058111156110dd576110dd614ddd565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101610efb565b505f6111d48561272c565b90505f6111e48260400151612b41565b9050825160b4146112535760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c696420656e636f64656044820152720c840c6dedceccae4e6d2dedc40d8cadccee8d606b1b60648201526084016104b2565b806002846040516112649190615355565b602060405180830381855afa15801561127f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112a29190614fa5565b146113065760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104b2565b5050506008909101805460ff19166001179055505050565b5f6109806001600160401b03831664e8d4a51000615366565b5f61134182611cbb565b6080015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611394575080546001600160401b03808416911610155b156113b25760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556113dd8484612cb3565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206158d68339815191525f61144785611cbb565b5f86815260058401602052604090205460a082015191925061147a91600160b01b9091046001600160401b03169061537d565b6001600160401b03164210156114ee5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104b2565b8315611500576114fe8584611de3565b505b61150985612ccd565b5050505050565b611518612fc3565b5f805160206158d68339815191525f6115308461272c565b90505f806115418360400151612906565b50915091505f61155083611cbb565b9050816001600160401b031681606001516001600160401b031610156115885760405162461bcd60e51b81526004016104b290614fe3565b5f8681526006860160205260409020600301546001600160401b03808416911611156115c65760405162461bcd60e51b81526004016104b290615025565b60035f87815260068701602052604090205460ff1660048111156115ec576115ec614ddd565b146116405760405162461bcd60e51b815260206004820152603160248201525f805160206158f68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526116e5916126f6565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061173960015f8051602061593683398151915255565b5050565b5f611746612fc3565b61175183338461300d565b905061098060015f8051602061593683398151915255565b5f805160206159168339815191525f6117818361272c565b90505f80611792836040015161347d565b91509150806117f45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104b2565b5f8281526005850160205260408120805461180e9061539d565b9050118015611840575060015f83815260068601602052604090205460ff16600581111561183e5761183e614ddd565b145b61185c5760405162461bcd60e51b81526004016104b2906153d5565b5f828152600585016020526040812061187491614bec565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206158d683398151915293929190829060ff16600481111561198257611982614ddd565b600481111561199357611993614ddd565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a1a57611a1a614ddd565b1480611a385750600381516004811115611a3657611a36614ddd565b145b611a8c5760405162461bcd60e51b815260206004820152603260248201525f805160206158f6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104b2565b5f611a9a8260400151611cbb565b905080606001516001600160401b03165f03611b1e5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb611b4b846040015184606001518560800151612157565b6040518263ffffffff1660e01b8152600401611b679190614f73565b6020604051808303815f875af1158015611b83573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115099190614fa5565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020615916833981519152929190611bef9061539d565b9050118015611c21575060015f83815260068301602052604090205460ff166005811115611c1f57611c1f614ddd565b145b611c3d5760405162461bcd60e51b81526004016104b2906153d5565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c76919060040161541c565b6020604051808303815f875af1158015611c92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb69190614fa5565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061595683398151915290528390208351918201909352825491925f8051602061591683398151915292829060ff166005811115611d3b57611d3b614ddd565b6005811115611d4c57611d4c614ddd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611db7612fc3565b611dc38585858561361e565b9050611ddb60015f8051602061593683398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e2e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e5591908101906154b1565b9150915080611eb85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611efb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1f9190614fa5565b825114611f835760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104b2565b60208201516001600160a01b031615611ff95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104b2565b5f80612008846040015161383c565b915091508187146120755760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104b2565b9695505050505050565b5f8181525f805160206159568339815191526020526040812060020180545f8051602061591683398151915291600160401b9091046001600160401b03169060086120c983615583565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f80516020615956833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156121d0576121908160016155a8565b61219b906008615366565b5081515f908390839081106121b2576121b26150d5565b60200101906001600160f81b03191690815f1a90535060010161217c565b505f5b600481101561223b576121e78160036155a8565b6121f2906008615366565b600263ffffffff16901c60f81b8282600261220d91906155bb565b8151811061221d5761221d6150d5565b60200101906001600160f81b03191690815f1a9053506001016121d3565b505f5b602081101561229d5761225281601f6155a8565b61225d906008615366565b86901c60f81b8261226f8360066155bb565b8151811061227f5761227f6150d5565b60200101906001600160f81b03191690815f1a90535060010161223e565b505f5b6008811015612308576122b48160076155a8565b6122bf906008615366565b6001600160401b038616901c60f81b826122da8360266155bb565b815181106122ea576122ea6150d5565b60200101906001600160f81b03191690815f1a9053506001016122a0565b505f5b60088110156123735761231f8160076155a8565b61232a906008615366565b6001600160401b038516901c60f81b8261234583602e6155bb565b81518110612355576123556150d5565b60200101906001600160f81b03191690815f1a90535060010161230b565b5090505b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206159168339815191525f6123cd8561272c565b90505f806123de836040015161347d565b9150915080156124435760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104b2565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561247457612474614ddd565b600581111561248557612485614ddd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156124f6576124f6614ddd565b1480612514575060018251600581111561251257612512614ddd565b145b6125735760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104b2565b60038251600581111561258857612588614ddd565b0361259557506004612599565b5060055b6020808301515f908152600788019091526040812055818160058111156125c2576125c2614ddd565b908160058111156125d5576125d5614ddd565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561260957612609614ddd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156126bd576126bd614ddd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054611739906001600160a01b03168284613a14565b60408051606080820183525f8083526020830181905292820152905f805160206159168339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156127a1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127c891908101906154b1565b91509150806128285760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104b2565b825482511461288b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104b2565b60208201516001600160a01b0316156128fe5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104b2565b509392505050565b5f805f835160361461292a5760405162461bcd60e51b81526004016104b2906155ce565b5f805b6002811015612979576129418160016155a8565b61294c906008615366565b61ffff16868281518110612962576129626150d5565b016020015160f81c901b919091179060010161292d565b5061ffff81161561299c5760405162461bcd60e51b81526004016104b290615617565b5f805b60048110156129f7576129b38160036155a8565b6129be906008615366565b63ffffffff16876129d08360026155bb565b815181106129e0576129e06150d5565b016020015160f81c901b919091179060010161299f565b5063ffffffff8116600414612a1e5760405162461bcd60e51b81526004016104b29061565a565b5f805b6020811015612a7357612a3581601f6155a8565b612a40906008615366565b88612a4c8360066155bb565b81518110612a5c57612a5c6150d5565b016020015160f81c901b9190911790600101612a21565b505f805b6008811015612ad257612a8b8160076155a8565b612a96906008615366565b6001600160401b031689612aab8360266155bb565b81518110612abb57612abb6150d5565b016020015160f81c901b9190911790600101612a77565b505f805b6008811015612b3157612aea8160076155a8565b612af5906008615366565b6001600160401b03168a612b0a83602e6155bb565b81518110612b1a57612b1a6150d5565b016020015160f81c901b9190911790600101612ad6565b5091989097509095509350505050565b5f8151602614612b635760405162461bcd60e51b81526004016104b2906155ce565b5f805b6002811015612bb257612b7a8160016155a8565b612b85906008615366565b61ffff16848281518110612b9b57612b9b6150d5565b016020015160f81c901b9190911790600101612b66565b5061ffff811615612bd55760405162461bcd60e51b81526004016104b290615617565b5f805b6004811015612c3057612bec8160036155a8565b612bf7906008615366565b63ffffffff1685612c098360026155bb565b81518110612c1957612c196150d5565b016020015160f81c901b9190911790600101612bd8565b5063ffffffff811615612c555760405162461bcd60e51b81526004016104b29061565a565b5f805b6020811015612caa57612c6c81601f6155a8565b612c77906008615366565b86612c838360066155bb565b81518110612c9357612c936150d5565b016020015160f81c901b9190911790600101612c58565b50949350505050565b612cbb613a73565b612cc482613abe565b61173981613b33565b5f8181525f805160206159568339815191526020526040808220815160e0810190925280545f8051602061591683398151915293929190829060ff166005811115612d1a57612d1a614ddd565b6005811115612d2b57612d2b614ddd565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612d9d57612d9d614ddd565b14612df95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104b2565b612e068160800151613be7565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115612e4a57612e4a614ddd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612eff84612ef98161207f565b5f612157565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612f2e908590600401614f73565b6020604051808303815f875af1158015612f4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f6e9190614fa5565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615936833981519152805460011901612ff457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061593683398151915255565b5f5f805160206158d6833981519152816130296101d785613d88565b90505f61303587611cbb565b905060028151600581111561304c5761304c614ddd565b146130ab5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104b2565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b031661313e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104b2565b5f82826080015161314f919061537d565b60048501546040840151919250613171916001600160401b03909116906156a1565b6001600160401b0316816001600160401b031611156131f05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104b2565b6131fa888261210f565b5f6132048961207f565b90505f898260405160200161323092919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061325185613be7565b5f6005600160991b0163ee5b48eb61326a8d8688612157565b6040518263ffffffff1660e01b81526004016132869190614f73565b6020604051808303815f875af11580156132a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132c69190614fa5565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561334e5761334e614ddd565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134a05760405162461bcd60e51b81526004016104b2906155ce565b5f805b60028110156134ef576134b78160016155a8565b6134c2906008615366565b61ffff168582815181106134d8576134d86150d5565b016020015160f81c901b91909117906001016134a3565b5061ffff8116156135125760405162461bcd60e51b81526004016104b290615617565b5f805b600481101561356d576135298160036155a8565b613534906008615366565b63ffffffff16866135468360026155bb565b81518110613556576135566150d5565b016020015160f81c901b9190911790600101613515565b5063ffffffff81166003146135945760405162461bcd60e51b81526004016104b29061565a565b5f805b60208110156135e9576135ab81601f6155a8565b6135b6906008615366565b876135c28360066155bb565b815181106135d2576135d26150d5565b016020015160f81c901b9190911790600101613597565b505f866026815181106135fe576135fe6150d5565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158d68339815191529061ffff86161080159061366a575061271061ffff861611155b6136865760405162461bcd60e51b81526004016104b2906156cc565b60028101546001600160401b0390811690851610156136ff5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104b2565b80548310801590613714575080600101548311155b6137725760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104b2565b5f61377c84613d88565b90505f61378882610970565b90505f6137958983613dbe565b905060405180606001604052806137a93390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e1461385f5760405162461bcd60e51b81526004016104b2906155ce565b5f805b60028110156138ae576138768160016155a8565b613881906008615366565b61ffff16858281518110613897576138976150d5565b016020015160f81c901b9190911790600101613862565b5061ffff8116156138d15760405162461bcd60e51b81526004016104b290615617565b5f805b600481101561392c576138e88160036155a8565b6138f3906008615366565b63ffffffff16866139058360026155bb565b81518110613915576139156150d5565b016020015160f81c901b91909117906001016138d4565b5063ffffffff81166005146139535760405162461bcd60e51b81526004016104b29061565a565b5f805b60208110156139a85761396a81601f6155a8565b613975906008615366565b876139818360066155bb565b81518110613991576139916150d5565b016020015160f81c901b9190911790600101613956565b505f805b6008811015613a07576139c08160076155a8565b6139cb906008615366565b6001600160401b0316886139e08360266155bb565b815181106139f0576139f06150d5565b016020015160f81c901b91909117906001016139ac565b5090969095509350505050565b6040516001600160a01b03838116602483015260448201839052611cb691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614232565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613abc57604051631afcd79f60e31b815260040160405180910390fd5b565b613ac6613a73565b613acf81614293565b613ad76142ac565b613b3060608201356080830135613af460c0850160a08601614d52565b613b0460e0860160c08701615717565b61ffff16613b19610100870160e08801615730565b613b2b6101208801610100890161506e565b6142bc565b50565b613b3b613a73565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613bc75760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104b2565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206159168339815191529060ff165f03613c25575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613c6d90836155a8565b10613c89576001600160401b0384166040830152808252613ca8565b8382604001818151613c9b919061537d565b6001600160401b03169052505b5f826020015183604001516064613cbf91906156a1565b613cc99190615750565b600285015490915060ff9081169082161115613d445760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104b2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610980827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690614500565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613e495760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104b2565b5f8051602061591683398151915242613e686040860160208701614d52565b6001600160401b0316118015613ea15750613e896040850160208601614d52565b6001600160401b0316613e9f426202a3006155bb565b115b613f035760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104b2565b8335613f215760405162461bcd60e51b81526004016104b290615230565b83355f90815260078201602052604090205415613f505760405162461bcd60e51b81526004016104b290615271565b613f5d6040850185615775565b9050603014613f7e5760405162461bcd60e51b81526004016104b2906152b9565b613f8783613be7565b5f806140216040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613fcc9190614d52565b6001600160401b03168152602001613fe760408a018a615775565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614662565b5f8281526005860160205260409020919350915061403f82826157fb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061406c908590600401614f73565b6020604051808303815f875af1158015614088573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140ac9190614fa5565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff1916600183600581111561412457614124614ddd565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614204918e01908e01614d52565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6142466001600160a01b03841683614a11565b905080515f1415801561426a57508080602001905181019061426891906158ba565b155b15611cb657604051635274afe760e01b81526001600160a01b03841660048201526024016104b2565b61429b613a73565b6142a3614a1e565b613b3081614a26565b6142b4613a73565b613abc614a9c565b6142c4613a73565b5f805160206158d6833981519152836143305760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104b2565b6127108411156143525760405162461bcd60e51b81526004016104b2906156cc565b858711156143ba5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104b2565b5f8360ff16116144275760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104b2565b600a60ff841611156144995760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104b2565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614546573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061456a9190614fa5565b90506145816001600160a01b038516333086614aa4565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156145c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145e99190614fa5565b905081811161464f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104b2565b61465982826155a8565b95945050505050565b5f60608260800151516030146146cc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104b2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614743576147038160016155a8565b61470e906008615366565b5081515f90839083908110614725576147256150d5565b60200101906001600160f81b03191690815f1a9053506001016146ef565b505f5b60048110156147ab5761475a8160036155a8565b614765906008615366565b600160ff919091161c60f81b8261477d8360026155bb565b8151811061478d5761478d6150d5565b60200101906001600160f81b03191690815f1a905350600101614746565b505f5b602081101561480857845181602081106147ca576147ca6150d5565b1a60f81b826147da8360066155bb565b815181106147ea576147ea6150d5565b60200101906001600160f81b03191690815f1a9053506001016147ae565b505f5b6020811015614868578460200151816020811061482a5761482a6150d5565b1a60f81b8261483a8360266155bb565b8151811061484a5761484a6150d5565b60200101906001600160f81b03191690815f1a90535060010161480b565b505f5b60088110156148dc5761487f8160076155a8565b61488a906008615366565b60ff1685604001516001600160401b0316901c60f81b828260466148ae91906155bb565b815181106148be576148be6150d5565b60200101906001600160f81b03191690815f1a90535060010161486b565b505f5b603081101561494757846080015181815181106148fe576148fe6150d5565b01602001516001600160f81b0319168261491983604e6155bb565b81518110614929576149296150d5565b60200101906001600160f81b03191690815f1a9053506001016148df565b505f5b60088110156149b95761495e8160076155a8565b614969906008615366565b60608601516001600160401b0390811691161c60f81b8261498b83607e6155bb565b8151811061499b5761499b6150d5565b60200101906001600160f81b03191690815f1a90535060010161494a565b506002816040516149ca9190615355565b602060405180830381855afa1580156149e5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a089190614fa5565b94909350915050565b606061237783835f614add565b613abc613a73565b614a2e613a73565b80355f8051602061591683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155614a786060830160408401615730565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612ffa613a73565b6040516001600160a01b03848116602483015283811660448301526064820183905261096a9186918216906323b872dd90608401613a41565b606081471015614b025760405163cd78605960e01b81523060048201526024016104b2565b5f80856001600160a01b03168486604051614b1d9190615355565b5f6040518083038185875af1925050503d805f8114614b57576040519150601f19603f3d011682016040523d82523d5f602084013e614b5c565b606091505b5091509150612075868383606082614b7c57614b7782614bc3565b612377565b8151158015614b9357506001600160a01b0384163b155b15614bbc57604051639996b31560e01b81526001600160a01b03851660048201526024016104b2565b5080612377565b805115614bd35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614bf89061539d565b5f825580601f10614c07575050565b601f0160209004905f5260205f2090810190613b3091905b80821115614c32575f8155600101614c1f565b5090565b8015158114613b30575f80fd5b803563ffffffff81168114614c56575f80fd5b919050565b5f805f60608486031215614c6d575f80fd5b833592506020840135614c7f81614c36565b9150614c8d60408501614c43565b90509250925092565b5f60208284031215614ca6575f80fd5b5035919050565b5f60208284031215614cbd575f80fd5b61237782614c43565b5f8060408385031215614cd7575f80fd5b614ce083614c43565b946020939093013593505050565b5f8060408385031215614cff575f80fd5b82356001600160401b03811115614d14575f80fd5b830160808186031215614d25575f80fd5b9150614d3360208401614c43565b90509250929050565b80356001600160401b0381168114614c56575f80fd5b5f60208284031215614d62575f80fd5b61237782614d3c565b6001600160a01b0381168114613b30575f80fd5b5f80828403610140811215614d92575f80fd5b61012080821215614da1575f80fd5b8493508301359050614db281614d6b565b809150509250929050565b5f8060408385031215614dce575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614e1457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e4f60608401826001600160401b03169052565b506080830151614e6a60808401826001600160401b03169052565b5060a0830151614e8560a08401826001600160401b03169052565b5060c0830151614ea060c08401826001600160401b03169052565b5092915050565b803561ffff81168114614c56575f80fd5b5f805f8060808587031215614ecb575f80fd5b84356001600160401b03811115614ee0575f80fd5b850160608188031215614ef1575f80fd5b9350614eff60208601614ea7565b9250614f0d60408601614d3c565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614ea057614ea0614f1d565b5f5b83811015614f6b578181015183820152602001614f53565b50505f910152565b602081525f8251806020840152614f91816040850160208701614f51565b601f01601f19169190910160400192915050565b5f60208284031215614fb5575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614fde57614fde614fbc565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f6020828403121561507e575f80fd5b813561237781614d6b565b5f808335601e1984360301811261509e575f80fd5b8301803591506001600160401b038211156150b7575f80fd5b6020019150600581901b36038213156150ce575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150fd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561513d5761513d615107565b60405290565b604051601f8201601f191681016001600160401b038111828210171561516b5761516b615107565b604052919050565b5f6001600160401b0382111561518b5761518b615107565b50601f01601f191660200190565b5f606082360312156151a9575f80fd5b6151b161511b565b8235815260206151c2818501614d3c565b8183015260408401356001600160401b038111156151de575f80fd5b840136601f8201126151ee575f80fd5b80356152016151fc82615173565b615143565b8181523684838501011115615214575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615317818460208a01614f51565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615347816028840160208801614f51565b016028019695505050505050565b5f82516150fd818460208701614f51565b808202811582820484141761098057610980614f1d565b6001600160401b03818116838216019080821115614ea057614ea0614f1d565b600181811c908216806153b157607f821691505b6020821081036153cf57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461542e8161539d565b806020870152604060018084165f811461544f576001811461546b57615498565b60ff19851660408a0152604084151560051b8a01019550615498565b895f5260205f205f5b8581101561548f5781548b8201860152908301908801615474565b8a016040019650505b509398975050505050505050565b8051614c5681614c36565b5f80604083850312156154c2575f80fd5b82516001600160401b03808211156154d8575f80fd5b90840190606082870312156154eb575f80fd5b6154f361511b565b8251815260208084015161550681614d6b565b8282015260408401518381111561551b575f80fd5b80850194505087601f85011261552f575f80fd5b8351925061553f6151fc84615173565b8381528882858701011115615552575f80fd5b61556184838301848801614f51565b806040840152508195506155768188016154a6565b9450505050509250929050565b5f6001600160401b0380831681810361559e5761559e614f1d565b6001019392505050565b8181038181111561098057610980614f1d565b8082018082111561098057610980614f1d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146156c4576156c4614f1d565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f60208284031215615727575f80fd5b61237782614ea7565b5f60208284031215615740575f80fd5b813560ff81168114612377575f80fd5b5f6001600160401b038084168061576957615769614fbc565b92169190910492915050565b5f808335601e1984360301811261578a575f80fd5b8301803591506001600160401b038211156157a3575f80fd5b6020019150368190038213156150ce575f80fd5b601f821115611cb657805f5260205f20601f840160051c810160208510156157dc5750805b601f840160051c820191505b81811015611509575f81556001016157e8565b81516001600160401b0381111561581457615814615107565b61582881615822845461539d565b846157b7565b602080601f83116001811461585b575f84156158445750858301515b5f19600386901b1c1916600185901b1785556158b2565b5f85815260208120601f198616915b828110156158895788860151825594840194600190910190840161586a565b50858210156158a657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156158ca575f80fd5b815161237781614c3656fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 9f695635f..24692cd00 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516156ab3803806156ab83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61555e8061014d5f395ff3fe608060405260043610610126575f3560e01c806362065856116100a8578063b771b3bc1161006d578063b771b3bc14610357578063ba3a4b9714610389578063bee0a03f146103a8578063c123c6db146103c7578063c599e24f146103e6578063d5f20ff6146103f9575f80fd5b806362065856146102bc57806366435abf146102db57806376f78621146102fa57806398f3e2b414610319578063a3a65e4814610338575f80fd5b806335455ded116100ee57806335455ded1461022457806340034a931461024c578063467ef06f1461025f5780635297fae61461027e57806361e2f4901461029d575f80fd5b80630118acc41461012a5780630322ed981461014b5780630cdd09851461016a578063151d30d1146101c75780632e2194d8146101ed575b5f80fd5b348015610135575f80fd5b506101496101443660046148b0565b610425565b005b348015610156575f80fd5b506101496101653660046148eb565b61088f565b348015610175575f80fd5b506101b46101843660046148eb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101d2575f80fd5b506101db600a81565b60405160ff90911681526020016101be565b3480156101f8575f80fd5b5061020c6102073660046148eb565b610a48565b6040516001600160401b0390911681526020016101be565b34801561022f575f80fd5b5061023961271081565b60405161ffff90911681526020016101be565b6101b461025a366004614929565b610a5e565b34801561026a575f80fd5b5061014961027936600461497d565b610a92565b348015610289575f80fd5b50610149610298366004614996565b610ae5565b3480156102a8575f80fd5b506101496102b73660046149be565b610cba565b3480156102c7575f80fd5b506101b46102d6366004614a0c565b6113bd565b3480156102e6575f80fd5b5061020c6102f53660046148eb565b6113d6565b348015610305575f80fd5b506101496103143660046148b0565b6113ea565b348015610324575f80fd5b50610149610333366004614996565b6114cb565b348015610343575f80fd5b5061014961035236600461497d565b6116f8565b348015610362575f80fd5b506103716005600160991b0181565b6040516001600160a01b0390911681526020016101be565b348015610394575f80fd5b506101496103a33660046148eb565b6118b0565b3480156103b3575f80fd5b506101496103c23660046148eb565b611b36565b3480156103d2575f80fd5b506101496103e1366004614a25565b611c4a565b6101b46103f43660046148eb565b611d2c565b348015610404575f80fd5b506104186104133660046148eb565b611d5d565b6040516101be9190614a50565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206154b2833981519152918415610477576104748285611e50565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104a9576104a9614a3c565b60048111156104ba576104ba614a3c565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561054157610541614a3c565b146105935760405162461bcd60e51b815260206004820152602a60248201525f805160206154d28339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105f85760405162461bcd60e51b815260206004820152603360248201525f805160206154d28339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161058a565b5f610602846120ec565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561064f5761064f614a3c565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61072185611d5d565b905082606001516001600160401b031681608001516001600160401b0316116107985760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161058a565b5f836060015182608001516107ad9190614b1a565b90506107b9868261217c565b5f6005600160991b0163ee5b48eb6107d28987866121c4565b6040518263ffffffff1660e01b81526004016107ee9190614b5c565b6020604051808303815f875af115801561080a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082e9190614b8e565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206155328339815191526020526040808220815160e0810190925280545f805160206154f283398151915293929190829060ff1660058111156108dc576108dc614a3c565b60058111156108ed576108ed614a3c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c614a3c565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6121c4565b6040518263ffffffff1660e01b8152600401610a029190614b5c565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a429190614b8e565b50505050565b5f610a5864e8d4a5100083614bb9565b92915050565b5f610a676123e9565b610a7384848434612420565b9050610a8b60015f8051602061551283398151915255565b9392505050565b5f805160206154b28339815191525f80610aab84612646565b6040808201515f848152600588016020529190912054929450909250610a42916001600160401b03909116906001600160a01b03166129be565b5f805160206154b28339815191525f610afd846129d1565b90505f80610b0e8360400151612bab565b50915091505f610b1d83611d5d565b9050816001600160401b031681606001516001600160401b03161015610b555760405162461bcd60e51b815260040161058a90614bcc565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b9a5760405162461bcd60e51b815260040161058a90614c0e565b60015f87815260068701602052604090205460ff166004811115610bc057610bc0614a3c565b14610c295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206154f28339815191529060ff1615610d575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbe9190614b8e565b836020013514610e205760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161058a565b30610e316060850160408601614c6b565b6001600160a01b031614610ea35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161058a565b5f610eb16060850185614c86565b905011610f105760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161058a565b5f610f1e6060850185614c86565b91505063ffffffff8110610f8a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b606482015260840161058a565b5f843560208601356014610fa46060890160408a01614c6b565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b828110156112d5575f61101d6060880188614c86565b8381811061102d5761102d614cd2565b905060200281019061103f9190614ce6565b61104890614d96565b80519091508061106a5760405162461bcd60e51b815260040161058a90614e2d565b5f818152600787016020526040902054156110975760405162461bcd60e51b815260040161058a90614e6e565b8160400151516030146110bc5760405162461bcd60e51b815260040161058a90614eb6565b83825f0151836020015184604001516040516020016110de9493929190614f03565b60408051601f198184030181528282528a35602084015290820185905294505f9060029060600160408051601f198184030181529082905261111f91614f52565b602060405180830381855afa15801561113a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115d9190614b8e565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff191660018360058111156111e9576111e9614a3c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101611007565b505f6112e0856129d1565b90505f6112f08260400151612de6565b9050806002846040516113039190614f52565b602060405180830381855afa15801561131e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113419190614b8e565b146113a55760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161058a565b5050506008909101805460ff19166001179055505050565b5f610a586001600160401b03831664e8d4a51000614f63565b5f6113e082611d5d565b6080015192915050565b5f805160206154b28339815191525f61140285611d5d565b5f86815260058401602052604090205460a082015191925061143591600160b01b9091046001600160401b031690614f7a565b6001600160401b03164210156114a95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161058a565b83156114bb576114b98584611e50565b505b6114c485612f4f565b5050505050565b6114d36123e9565b5f805160206154b28339815191525f6114eb846129d1565b90505f806114fc8360400151612bab565b50915091505f61150b83611d5d565b9050816001600160401b031681606001516001600160401b031610156115435760405162461bcd60e51b815260040161058a90614bcc565b5f8681526006860160205260409020600301546001600160401b03808416911611156115815760405162461bcd60e51b815260040161058a90614c0e565b60035f87815260068701602052604090205460ff1660048111156115a7576115a7614a3c565b146115fb5760405162461bcd60e51b815260206004820152603160248201525f805160206154d28339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526116a0916129be565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506116f460015f8051602061551283398151915255565b5050565b5f805160206154f28339815191525f611710836129d1565b90505f806117218360400151613245565b91509150806117835760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161058a565b5f8281526005850160205260408120805461179d90614f9a565b90501180156117cf575060015f83815260068601602052604090205460ff1660058111156117cd576117cd614a3c565b145b6117eb5760405162461bcd60e51b815260040161058a90614fcc565b5f828152600585016020526040812061180391614846565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206154b283398151915293929190829060ff16600481111561191157611911614a3c565b600481111561192257611922614a3c565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119a9576119a9614a3c565b14806119c757506003815160048111156119c5576119c5614a3c565b145b611a1b5760405162461bcd60e51b815260206004820152603260248201525f805160206154d2833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161058a565b5f611a298260400151611d5d565b905080606001516001600160401b03165f03611aad5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb611ada8460400151846060015185608001516121c4565b6040518263ffffffff1660e01b8152600401611af69190614b5c565b6020604051808303815f875af1158015611b12573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c49190614b8e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206154f2833981519152929190611b7e90614f9a565b9050118015611bb0575060015f83815260068301602052604090205460ff166005811115611bae57611bae614a3c565b145b611bcc5760405162461bcd60e51b815260040161058a90614fcc565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c059190600401615013565b6020604051808303815f875af1158015611c21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c459190614b8e565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611c93575080546001600160401b03808416911610155b15611cb15760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611cdb836133e6565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611d356123e9565b611d408233346133fa565b9050611d5860015f8051602061551283398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061553283398151915290528390208351918201909352825491925f805160206154f283398151915292829060ff166005811115611ddd57611ddd614a3c565b6005811115611dee57611dee614a3c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e9b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ec291908101906150a8565b9150915080611f255760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8c9190614b8e565b825114611ff05760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161058a565b60208201516001600160a01b0316156120665760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161058a565b5f806120758460400151613867565b915091508187146120e25760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161058a565b9695505050505050565b5f8181525f805160206155328339815191526020526040812060020180545f805160206154f283398151915291600160401b9091046001600160401b03169060086121368361517a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f80516020615532833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561223d576121fd81600161519f565b612208906008614f63565b5081515f9083908390811061221f5761221f614cd2565b60200101906001600160f81b03191690815f1a9053506001016121e9565b505f5b60048110156122a85761225481600361519f565b61225f906008614f63565b600263ffffffff16901c60f81b8282600261227a91906151b2565b8151811061228a5761228a614cd2565b60200101906001600160f81b03191690815f1a905350600101612240565b505f5b602081101561230a576122bf81601f61519f565b6122ca906008614f63565b86901c60f81b826122dc8360066151b2565b815181106122ec576122ec614cd2565b60200101906001600160f81b03191690815f1a9053506001016122ab565b505f5b60088110156123755761232181600761519f565b61232c906008614f63565b6001600160401b038616901c60f81b826123478360266151b2565b8151811061235757612357614cd2565b60200101906001600160f81b03191690815f1a90535060010161230d565b505f5b60088110156123e05761238c81600761519f565b612397906008614f63565b6001600160401b038516901c60f81b826123b283602e6151b2565b815181106123c2576123c2614cd2565b60200101906001600160f81b03191690815f1a905350600101612378565b50949350505050565b5f8051602061551283398151915280546001190161241a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206154b28339815191529061ffff86161080159061246c575061271061ffff861611155b6124885760405162461bcd60e51b815260040161058a906151c5565b60028101546001600160401b0390811690851610156125015760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161058a565b80548310801590612516575080600101548311155b6125745760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161058a565b825f61257f82610a48565b90505f61258c8983613a3f565b905060405180606001604052806125a03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061551283398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206154f28339815191525f612695856129d1565b90505f806126a68360400151613245565b91509150801561270b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161058a565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561273c5761273c614a3c565b600581111561274d5761274d614a3c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156127be576127be614a3c565b14806127dc57506001825160058111156127da576127da614a3c565b145b61283b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161058a565b60038251600581111561285057612850614a3c565b0361285d57506004612861565b5060055b6020808301515f9081526007880190915260408120558181600581111561288a5761288a614a3c565b9081600581111561289d5761289d614a3c565b9052505f84815260068701602052604090208251815484929190829060ff191660018360058111156128d1576128d1614a3c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561298557612985614a3c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6116f46001600160a01b03821683613eb3565b60408051606080820183525f8083526020830181905292820152905f805160206154f28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a46573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a6d91908101906150a8565b9150915080612acd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b606482015260840161058a565b8254825114612b305760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161058a565b60208201516001600160a01b031615612ba35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161058a565b509392505050565b5f805f8351603614612bcf5760405162461bcd60e51b815260040161058a90615210565b5f805b6002811015612c1e57612be681600161519f565b612bf1906008614f63565b61ffff16868281518110612c0757612c07614cd2565b016020015160f81c901b9190911790600101612bd2565b5061ffff811615612c415760405162461bcd60e51b815260040161058a90615259565b5f805b6004811015612c9c57612c5881600361519f565b612c63906008614f63565b63ffffffff1687612c758360026151b2565b81518110612c8557612c85614cd2565b016020015160f81c901b9190911790600101612c44565b5063ffffffff8116600414612cc35760405162461bcd60e51b815260040161058a9061529c565b5f805b6020811015612d1857612cda81601f61519f565b612ce5906008614f63565b88612cf18360066151b2565b81518110612d0157612d01614cd2565b016020015160f81c901b9190911790600101612cc6565b505f805b6008811015612d7757612d3081600761519f565b612d3b906008614f63565b6001600160401b031689612d508360266151b2565b81518110612d6057612d60614cd2565b016020015160f81c901b9190911790600101612d1c565b505f805b6008811015612dd657612d8f81600761519f565b612d9a906008614f63565b6001600160401b03168a612daf83602e6151b2565b81518110612dbf57612dbf614cd2565b016020015160f81c901b9190911790600101612d7b565b5091989097509095509350505050565b5f8151602614612e085760405162461bcd60e51b815260040161058a90615210565b5f805b6002811015612e5757612e1f81600161519f565b612e2a906008614f63565b61ffff16848281518110612e4057612e40614cd2565b016020015160f81c901b9190911790600101612e0b565b5061ffff811615612e7a5760405162461bcd60e51b815260040161058a90615259565b5f805b6004811015612ed557612e9181600361519f565b612e9c906008614f63565b63ffffffff1685612eae8360026151b2565b81518110612ebe57612ebe614cd2565b016020015160f81c901b9190911790600101612e7d565b5063ffffffff811615612efa5760405162461bcd60e51b815260040161058a9061529c565b5f805b60208110156123e057612f1181601f61519f565b612f1c906008614f63565b86612f288360066151b2565b81518110612f3857612f38614cd2565b016020015160f81c901b9190911790600101612efd565b5f8181525f805160206155328339815191526020526040808220815160e0810190925280545f805160206154f283398151915293929190829060ff166005811115612f9c57612f9c614a3c565b6005811115612fad57612fad614a3c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561301f5761301f614a3c565b1461307b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161058a565b6130888160800151613f46565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156130cc576130cc614a3c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131818461317b816120ec565b5f6121c4565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906131b0908590600401614b5c565b6020604051808303815f875af11580156131cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131f09190614b8e565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146132685760405162461bcd60e51b815260040161058a90615210565b5f805b60028110156132b75761327f81600161519f565b61328a906008614f63565b61ffff168582815181106132a0576132a0614cd2565b016020015160f81c901b919091179060010161326b565b5061ffff8116156132da5760405162461bcd60e51b815260040161058a90615259565b5f805b6004811015613335576132f181600361519f565b6132fc906008614f63565b63ffffffff168661330e8360026151b2565b8151811061331e5761331e614cd2565b016020015160f81c901b91909117906001016132dd565b5063ffffffff811660031461335c5760405162461bcd60e51b815260040161058a9061529c565b5f805b60208110156133b15761337381601f61519f565b61337e906008614f63565b8761338a8360066151b2565b8151811061339a5761339a614cd2565b016020015160f81c901b919091179060010161335f565b505f866026815181106133c6576133c6614cd2565b016020015191976001600160f81b03199092161515965090945050505050565b6133ee6140e7565b6133f781614132565b50565b5f5f805160206154b28339815191528161341384610a48565b90505f61341f87611d5d565b905060028151600581111561343657613436614a3c565b146134955760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161058a565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166135285760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161058a565b5f8282608001516135399190614f7a565b6004850154604084015191925061355b916001600160401b03909116906152e3565b6001600160401b0316816001600160401b031611156135da5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161058a565b6135e4888261217c565b5f6135ee896120ec565b90505f898260405160200161361a92919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061363b85613f46565b5f6005600160991b0163ee5b48eb6136548d86886121c4565b6040518263ffffffff1660e01b81526004016136709190614b5c565b6020604051808303815f875af115801561368c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136b09190614b8e565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561373857613738614a3c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e1461388a5760405162461bcd60e51b815260040161058a90615210565b5f805b60028110156138d9576138a181600161519f565b6138ac906008614f63565b61ffff168582815181106138c2576138c2614cd2565b016020015160f81c901b919091179060010161388d565b5061ffff8116156138fc5760405162461bcd60e51b815260040161058a90615259565b5f805b60048110156139575761391381600361519f565b61391e906008614f63565b63ffffffff16866139308360026151b2565b8151811061394057613940614cd2565b016020015160f81c901b91909117906001016138ff565b5063ffffffff811660051461397e5760405162461bcd60e51b815260040161058a9061529c565b5f805b60208110156139d35761399581601f61519f565b6139a0906008614f63565b876139ac8360066151b2565b815181106139bc576139bc614cd2565b016020015160f81c901b9190911790600101613981565b505f805b6008811015613a32576139eb81600761519f565b6139f6906008614f63565b6001600160401b031688613a0b8360266151b2565b81518110613a1b57613a1b614cd2565b016020015160f81c901b91909117906001016139d7565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613aca5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161058a565b5f805160206154f283398151915242613ae96040860160208701614a0c565b6001600160401b0316118015613b225750613b0a6040850160208601614a0c565b6001600160401b0316613b20426202a3006151b2565b115b613b845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161058a565b8335613ba25760405162461bcd60e51b815260040161058a90614e2d565b83355f90815260078201602052604090205415613bd15760405162461bcd60e51b815260040161058a90614e6e565b613bde604085018561530e565b9050603014613bff5760405162461bcd60e51b815260040161058a90614eb6565b613c0883613f46565b5f80613ca26040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613c4d9190614a0c565b6001600160401b03168152602001613c6860408a018a61530e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141a4565b5f82815260058601602052604090209193509150613cc08282615394565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613ced908590600401614b5c565b6020604051808303815f875af1158015613d09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d2d9190614b8e565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115613da557613da5614a3c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613e85918e01908e01614a0c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613ed65760405163cd78605960e01b815230600482015260240161058a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f1f576040519150601f19603f3d011682016040523d82523d5f602084013e613f24565b606091505b5050905080611c4557604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206154f28339815191529060ff165f03613f84575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613fcc908361519f565b10613fe8576001600160401b0384166040830152808252614007565b8382604001818151613ffa9190614f7a565b6001600160401b03169052505b5f82602001518360400151606461401e91906152e3565b6140289190615453565b600285015490915060ff90811690821611156140a35760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161058a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661413057604051631afcd79f60e31b815260040160405180910390fd5b565b61413a6140e7565b61414381614553565b61414b61456c565b6133f76060820135608083013561416860c0850160a08601614a0c565b61417860e0860160c08701615478565b61ffff1661418d610100870160e08801615491565b61419f61012088016101008901614c6b565b61457c565b5f606082608001515160301461420e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161058a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142855761424581600161519f565b614250906008614f63565b5081515f9083908390811061426757614267614cd2565b60200101906001600160f81b03191690815f1a905350600101614231565b505f5b60048110156142ed5761429c81600361519f565b6142a7906008614f63565b600160ff919091161c60f81b826142bf8360026151b2565b815181106142cf576142cf614cd2565b60200101906001600160f81b03191690815f1a905350600101614288565b505f5b602081101561434a578451816020811061430c5761430c614cd2565b1a60f81b8261431c8360066151b2565b8151811061432c5761432c614cd2565b60200101906001600160f81b03191690815f1a9053506001016142f0565b505f5b60208110156143aa578460200151816020811061436c5761436c614cd2565b1a60f81b8261437c8360266151b2565b8151811061438c5761438c614cd2565b60200101906001600160f81b03191690815f1a90535060010161434d565b505f5b600881101561441e576143c181600761519f565b6143cc906008614f63565b60ff1685604001516001600160401b0316901c60f81b828260466143f091906151b2565b8151811061440057614400614cd2565b60200101906001600160f81b03191690815f1a9053506001016143ad565b505f5b6030811015614489578460800151818151811061444057614440614cd2565b01602001516001600160f81b0319168261445b83604e6151b2565b8151811061446b5761446b614cd2565b60200101906001600160f81b03191690815f1a905350600101614421565b505f5b60088110156144fb576144a081600761519f565b6144ab906008614f63565b60608601516001600160401b0390811691161c60f81b826144cd83607e6151b2565b815181106144dd576144dd614cd2565b60200101906001600160f81b03191690815f1a90535060010161448c565b5060028160405161450c9190614f52565b602060405180830381855afa158015614527573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061454a9190614b8e565b94909350915050565b61455b6140e7565b6145636147c0565b6133f7816147c8565b6145746140e7565b61413061483e565b6145846140e7565b5f805160206154b2833981519152836145f05760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161058a565b6127108411156146125760405162461bcd60e51b815260040161058a906151c5565b8587111561467a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161058a565b5f8360ff16116146e75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161058a565b600a60ff841611156147595760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161058a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6141306140e7565b6147d06140e7565b80355f805160206154f283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561481a6060830160408401615491565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b6126336140e7565b50805461485290614f9a565b5f825580601f10614861575050565b601f0160209004905f5260205f20908101906133f791905b8082111561488c575f8155600101614879565b5090565b80151581146133f7575f80fd5b803563ffffffff81168114611d58575f80fd5b5f805f606084860312156148c2575f80fd5b8335925060208401356148d481614890565b91506148e26040850161489d565b90509250925092565b5f602082840312156148fb575f80fd5b5035919050565b803561ffff81168114611d58575f80fd5b80356001600160401b0381168114611d58575f80fd5b5f805f6060848603121561493b575f80fd5b83356001600160401b03811115614950575f80fd5b840160608187031215614961575f80fd5b925061496f60208501614902565b91506148e260408501614913565b5f6020828403121561498d575f80fd5b610a8b8261489d565b5f80604083850312156149a7575f80fd5b6149b08361489d565b946020939093013593505050565b5f80604083850312156149cf575f80fd5b82356001600160401b038111156149e4575f80fd5b8301608081860312156149f5575f80fd5b9150614a036020840161489d565b90509250929050565b5f60208284031215614a1c575f80fd5b610a8b82614913565b5f6101208284031215614a36575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614a7357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614aae60608401826001600160401b03169052565b506080830151614ac960808401826001600160401b03169052565b5060a0830151614ae460a08401826001600160401b03169052565b5060c0830151614aff60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614aff57614aff614b06565b5f5b83811015614b54578181015183820152602001614b3c565b50505f910152565b602081525f8251806020840152614b7a816040850160208701614b3a565b601f01601f19169190910160400192915050565b5f60208284031215614b9e575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614bc757614bc7614ba5565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b03811681146133f7575f80fd5b5f60208284031215614c7b575f80fd5b8135610a8b81614c57565b5f808335601e19843603018112614c9b575f80fd5b8301803591506001600160401b03821115614cb4575f80fd5b6020019150600581901b3603821315614ccb575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614cfa575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614d3a57614d3a614d04565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614d6857614d68614d04565b604052919050565b5f6001600160401b03821115614d8857614d88614d04565b50601f01601f191660200190565b5f60608236031215614da6575f80fd5b614dae614d18565b823581526020614dbf818501614913565b8183015260408401356001600160401b03811115614ddb575f80fd5b840136601f820112614deb575f80fd5b8035614dfe614df982614d70565b614d40565b8181523684838501011115614e11575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551614f14818460208a01614b3a565b80830190508581526001600160401b0360c01b8560c01b1660208201528351614f44816028840160208801614b3a565b016028019695505050505050565b5f8251614cfa818460208701614b3a565b8082028115828204841417610a5857610a58614b06565b6001600160401b03818116838216019080821115614aff57614aff614b06565b600181811c90821680614fae57607f821691505b602082108103614a3657634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461502581614f9a565b806020870152604060018084165f811461504657600181146150625761508f565b60ff19851660408a0152604084151560051b8a0101955061508f565b895f5260205f205f5b858110156150865781548b820186015290830190880161506b565b8a016040019650505b509398975050505050505050565b8051611d5881614890565b5f80604083850312156150b9575f80fd5b82516001600160401b03808211156150cf575f80fd5b90840190606082870312156150e2575f80fd5b6150ea614d18565b825181526020808401516150fd81614c57565b82820152604084015183811115615112575f80fd5b80850194505087601f850112615126575f80fd5b83519250615136614df984614d70565b8381528882858701011115615149575f80fd5b61515884838301848801614b3a565b8060408401525081955061516d81880161509d565b9450505050509250929050565b5f6001600160401b0380831681810361519557615195614b06565b6001019392505050565b81810381811115610a5857610a58614b06565b80820180821115610a5857610a58614b06565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461530657615306614b06565b505092915050565b5f808335601e19843603018112615323575f80fd5b8301803591506001600160401b0382111561533c575f80fd5b602001915036819003821315614ccb575f80fd5b601f821115611c4557805f5260205f20601f840160051c810160208510156153755750805b601f840160051c820191505b818110156114c4575f8155600101615381565b81516001600160401b038111156153ad576153ad614d04565b6153c1816153bb8454614f9a565b84615350565b602080601f8311600181146153f4575f84156153dd5750858301515b5f19600386901b1c1916600185901b17855561544b565b5f85815260208120601f198616915b8281101561542257888601518255948401946001909101908401615403565b508582101561543f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b038084168061546c5761546c614ba5565b92169190910492915050565b5f60208284031215615488575f80fd5b610a8b82614902565b5f602082840312156154a1575f80fd5b813560ff81168114610a8b575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161571838038061571883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6155cb8061014d5f395ff3fe608060405260043610610126575f3560e01c806362065856116100a8578063b771b3bc1161006d578063b771b3bc14610357578063ba3a4b9714610389578063bee0a03f146103a8578063c123c6db146103c7578063c599e24f146103e6578063d5f20ff6146103f9575f80fd5b806362065856146102bc57806366435abf146102db57806376f78621146102fa57806398f3e2b414610319578063a3a65e4814610338575f80fd5b806335455ded116100ee57806335455ded1461022457806340034a931461024c578063467ef06f1461025f5780635297fae61461027e57806361e2f4901461029d575f80fd5b80630118acc41461012a5780630322ed981461014b5780630cdd09851461016a578063151d30d1146101c75780632e2194d8146101ed575b5f80fd5b348015610135575f80fd5b5061014961014436600461491d565b610425565b005b348015610156575f80fd5b50610149610165366004614958565b61088f565b348015610175575f80fd5b506101b4610184366004614958565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101d2575f80fd5b506101db600a81565b60405160ff90911681526020016101be565b3480156101f8575f80fd5b5061020c610207366004614958565b610a48565b6040516001600160401b0390911681526020016101be565b34801561022f575f80fd5b5061023961271081565b60405161ffff90911681526020016101be565b6101b461025a366004614996565b610a5e565b34801561026a575f80fd5b506101496102793660046149ea565b610a92565b348015610289575f80fd5b50610149610298366004614a03565b610ae5565b3480156102a8575f80fd5b506101496102b7366004614a2b565b610cba565b3480156102c7575f80fd5b506101b46102d6366004614a79565b61142a565b3480156102e6575f80fd5b5061020c6102f5366004614958565b611443565b348015610305575f80fd5b5061014961031436600461491d565b611457565b348015610324575f80fd5b50610149610333366004614a03565b611538565b348015610343575f80fd5b506101496103523660046149ea565b611765565b348015610362575f80fd5b506103716005600160991b0181565b6040516001600160a01b0390911681526020016101be565b348015610394575f80fd5b506101496103a3366004614958565b61191d565b3480156103b3575f80fd5b506101496103c2366004614958565b611ba3565b3480156103d2575f80fd5b506101496103e1366004614a92565b611cb7565b6101b46103f4366004614958565b611d99565b348015610404575f80fd5b50610418610413366004614958565b611dca565b6040516101be9190614abd565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061551f833981519152918415610477576104748285611ebd565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104a9576104a9614aa9565b60048111156104ba576104ba614aa9565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561054157610541614aa9565b146105935760405162461bcd60e51b815260206004820152602a60248201525f8051602061553f8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105f85760405162461bcd60e51b815260206004820152603360248201525f8051602061553f8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161058a565b5f61060284612159565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561064f5761064f614aa9565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61072185611dca565b905082606001516001600160401b031681608001516001600160401b0316116107985760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161058a565b5f836060015182608001516107ad9190614b87565b90506107b986826121e9565b5f6005600160991b0163ee5b48eb6107d2898786612231565b6040518263ffffffff1660e01b81526004016107ee9190614bc9565b6020604051808303815f875af115801561080a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082e9190614bfb565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061559f8339815191526020526040808220815160e0810190925280545f8051602061555f83398151915293929190829060ff1660058111156108dc576108dc614aa9565b60058111156108ed576108ed614aa9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c614aa9565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f612231565b6040518263ffffffff1660e01b8152600401610a029190614bc9565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a429190614bfb565b50505050565b5f610a5864e8d4a5100083614c26565b92915050565b5f610a67612456565b610a738484843461248d565b9050610a8b60015f8051602061557f83398151915255565b9392505050565b5f8051602061551f8339815191525f80610aab846126b3565b6040808201515f848152600588016020529190912054929450909250610a42916001600160401b03909116906001600160a01b0316612a2b565b5f8051602061551f8339815191525f610afd84612a3e565b90505f80610b0e8360400151612c18565b50915091505f610b1d83611dca565b9050816001600160401b031681606001516001600160401b03161015610b555760405162461bcd60e51b815260040161058a90614c39565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b9a5760405162461bcd60e51b815260040161058a90614c7b565b60015f87815260068701602052604090205460ff166004811115610bc057610bc0614aa9565b14610c295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f8051602061555f8339815191529060ff1615610d575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbe9190614bfb565b836020013514610e205760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161058a565b30610e316060850160408601614cd8565b6001600160a01b031614610ea35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161058a565b5f610eb16060850185614cf3565b905011610f105760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161058a565b5f610f1e6060850185614cf3565b91505063ffffffff8110610f8a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b606482015260840161058a565b5f843560208601356014610fa46060890160408a01614cd8565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b828110156112d5575f61101d6060880188614cf3565b8381811061102d5761102d614d3f565b905060200281019061103f9190614d53565b61104890614e03565b80519091508061106a5760405162461bcd60e51b815260040161058a90614e9a565b5f818152600787016020526040902054156110975760405162461bcd60e51b815260040161058a90614edb565b8160400151516030146110bc5760405162461bcd60e51b815260040161058a90614f23565b83825f0151836020015184604001516040516020016110de9493929190614f70565b60408051601f198184030181528282528a35602084015290820185905294505f9060029060600160408051601f198184030181529082905261111f91614fbf565b602060405180830381855afa15801561113a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115d9190614bfb565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff191660018360058111156111e9576111e9614aa9565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101611007565b505f6112e085612a3e565b90505f6112f08260400151612e53565b9050825160b41461135f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c696420656e636f64656044820152720c840c6dedceccae4e6d2dedc40d8cadccee8d606b1b606482015260840161058a565b806002846040516113709190614fbf565b602060405180830381855afa15801561138b573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113ae9190614bfb565b146114125760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161058a565b5050506008909101805460ff19166001179055505050565b5f610a586001600160401b03831664e8d4a51000614fd0565b5f61144d82611dca565b6080015192915050565b5f8051602061551f8339815191525f61146f85611dca565b5f86815260058401602052604090205460a08201519192506114a291600160b01b9091046001600160401b031690614fe7565b6001600160401b03164210156115165760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161058a565b8315611528576115268584611ebd565b505b61153185612fbc565b5050505050565b611540612456565b5f8051602061551f8339815191525f61155884612a3e565b90505f806115698360400151612c18565b50915091505f61157883611dca565b9050816001600160401b031681606001516001600160401b031610156115b05760405162461bcd60e51b815260040161058a90614c39565b5f8681526006860160205260409020600301546001600160401b03808416911611156115ee5760405162461bcd60e51b815260040161058a90614c7b565b60035f87815260068701602052604090205460ff16600481111561161457611614614aa9565b146116685760405162461bcd60e51b815260206004820152603160248201525f8051602061553f8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261170d91612a2b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061176160015f8051602061557f83398151915255565b5050565b5f8051602061555f8339815191525f61177d83612a3e565b90505f8061178e83604001516132b2565b91509150806117f05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161058a565b5f8281526005850160205260408120805461180a90615007565b905011801561183c575060015f83815260068601602052604090205460ff16600581111561183a5761183a614aa9565b145b6118585760405162461bcd60e51b815260040161058a90615039565b5f8281526005850160205260408120611870916148b3565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061551f83398151915293929190829060ff16600481111561197e5761197e614aa9565b600481111561198f5761198f614aa9565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a1657611a16614aa9565b1480611a345750600381516004811115611a3257611a32614aa9565b145b611a885760405162461bcd60e51b815260206004820152603260248201525f8051602061553f833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161058a565b5f611a968260400151611dca565b905080606001516001600160401b03165f03611b1a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb611b47846040015184606001518560800151612231565b6040518263ffffffff1660e01b8152600401611b639190614bc9565b6020604051808303815f875af1158015611b7f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115319190614bfb565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061555f833981519152929190611beb90615007565b9050118015611c1d575060015f83815260068301602052604090205460ff166005811115611c1b57611c1b614aa9565b145b611c395760405162461bcd60e51b815260040161058a90615039565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c729190600401615080565b6020604051808303815f875af1158015611c8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb29190614bfb565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611d00575080546001600160401b03808416911610155b15611d1e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611d4883613453565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611da2612456565b611dad823334613467565b9050611dc560015f8051602061557f83398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061559f83398151915290528390208351918201909352825491925f8051602061555f83398151915292829060ff166005811115611e4a57611e4a614aa9565b6005811115611e5b57611e5b614aa9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f08573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f2f9190810190615115565b9150915080611f925760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff99190614bfb565b82511461205d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161058a565b60208201516001600160a01b0316156120d35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161058a565b5f806120e284604001516138d4565b9150915081871461214f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161058a565b9695505050505050565b5f8181525f8051602061559f8339815191526020526040812060020180545f8051602061555f83398151915291600160401b9091046001600160401b03169060086121a3836151e7565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f8051602061559f833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156122aa5761226a81600161520c565b612275906008614fd0565b5081515f9083908390811061228c5761228c614d3f565b60200101906001600160f81b03191690815f1a905350600101612256565b505f5b6004811015612315576122c181600361520c565b6122cc906008614fd0565b600263ffffffff16901c60f81b828260026122e7919061521f565b815181106122f7576122f7614d3f565b60200101906001600160f81b03191690815f1a9053506001016122ad565b505f5b60208110156123775761232c81601f61520c565b612337906008614fd0565b86901c60f81b8261234983600661521f565b8151811061235957612359614d3f565b60200101906001600160f81b03191690815f1a905350600101612318565b505f5b60088110156123e25761238e81600761520c565b612399906008614fd0565b6001600160401b038616901c60f81b826123b483602661521f565b815181106123c4576123c4614d3f565b60200101906001600160f81b03191690815f1a90535060010161237a565b505f5b600881101561244d576123f981600761520c565b612404906008614fd0565b6001600160401b038516901c60f81b8261241f83602e61521f565b8151811061242f5761242f614d3f565b60200101906001600160f81b03191690815f1a9053506001016123e5565b50949350505050565b5f8051602061557f83398151915280546001190161248757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061551f8339815191529061ffff8616108015906124d9575061271061ffff861611155b6124f55760405162461bcd60e51b815260040161058a90615232565b60028101546001600160401b03908116908516101561256e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161058a565b80548310801590612583575080600101548311155b6125e15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161058a565b825f6125ec82610a48565b90505f6125f98983613aac565b9050604051806060016040528061260d3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061557f83398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061555f8339815191525f61270285612a3e565b90505f8061271383604001516132b2565b9150915080156127785760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161058a565b5f828152600685016020526040808220815160e081019092528054829060ff1660058111156127a9576127a9614aa9565b60058111156127ba576127ba614aa9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561282b5761282b614aa9565b1480612849575060018251600581111561284757612847614aa9565b145b6128a85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161058a565b6003825160058111156128bd576128bd614aa9565b036128ca575060046128ce565b5060055b6020808301515f908152600788019091526040812055818160058111156128f7576128f7614aa9565b9081600581111561290a5761290a614aa9565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561293e5761293e614aa9565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156129f2576129f2614aa9565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6117616001600160a01b03821683613f20565b60408051606080820183525f8083526020830181905292820152905f8051602061555f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ab3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ada9190810190615115565b9150915080612b3a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b606482015260840161058a565b8254825114612b9d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161058a565b60208201516001600160a01b031615612c105760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161058a565b509392505050565b5f805f8351603614612c3c5760405162461bcd60e51b815260040161058a9061527d565b5f805b6002811015612c8b57612c5381600161520c565b612c5e906008614fd0565b61ffff16868281518110612c7457612c74614d3f565b016020015160f81c901b9190911790600101612c3f565b5061ffff811615612cae5760405162461bcd60e51b815260040161058a906152c6565b5f805b6004811015612d0957612cc581600361520c565b612cd0906008614fd0565b63ffffffff1687612ce283600261521f565b81518110612cf257612cf2614d3f565b016020015160f81c901b9190911790600101612cb1565b5063ffffffff8116600414612d305760405162461bcd60e51b815260040161058a90615309565b5f805b6020811015612d8557612d4781601f61520c565b612d52906008614fd0565b88612d5e83600661521f565b81518110612d6e57612d6e614d3f565b016020015160f81c901b9190911790600101612d33565b505f805b6008811015612de457612d9d81600761520c565b612da8906008614fd0565b6001600160401b031689612dbd83602661521f565b81518110612dcd57612dcd614d3f565b016020015160f81c901b9190911790600101612d89565b505f805b6008811015612e4357612dfc81600761520c565b612e07906008614fd0565b6001600160401b03168a612e1c83602e61521f565b81518110612e2c57612e2c614d3f565b016020015160f81c901b9190911790600101612de8565b5091989097509095509350505050565b5f8151602614612e755760405162461bcd60e51b815260040161058a9061527d565b5f805b6002811015612ec457612e8c81600161520c565b612e97906008614fd0565b61ffff16848281518110612ead57612ead614d3f565b016020015160f81c901b9190911790600101612e78565b5061ffff811615612ee75760405162461bcd60e51b815260040161058a906152c6565b5f805b6004811015612f4257612efe81600361520c565b612f09906008614fd0565b63ffffffff1685612f1b83600261521f565b81518110612f2b57612f2b614d3f565b016020015160f81c901b9190911790600101612eea565b5063ffffffff811615612f675760405162461bcd60e51b815260040161058a90615309565b5f805b602081101561244d57612f7e81601f61520c565b612f89906008614fd0565b86612f9583600661521f565b81518110612fa557612fa5614d3f565b016020015160f81c901b9190911790600101612f6a565b5f8181525f8051602061559f8339815191526020526040808220815160e0810190925280545f8051602061555f83398151915293929190829060ff16600581111561300957613009614aa9565b600581111561301a5761301a614aa9565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561308c5761308c614aa9565b146130e85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161058a565b6130f58160800151613fb3565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561313957613139614aa9565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131ee846131e881612159565b5f612231565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061321d908590600401614bc9565b6020604051808303815f875af1158015613239573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061325d9190614bfb565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146132d55760405162461bcd60e51b815260040161058a9061527d565b5f805b6002811015613324576132ec81600161520c565b6132f7906008614fd0565b61ffff1685828151811061330d5761330d614d3f565b016020015160f81c901b91909117906001016132d8565b5061ffff8116156133475760405162461bcd60e51b815260040161058a906152c6565b5f805b60048110156133a25761335e81600361520c565b613369906008614fd0565b63ffffffff168661337b83600261521f565b8151811061338b5761338b614d3f565b016020015160f81c901b919091179060010161334a565b5063ffffffff81166003146133c95760405162461bcd60e51b815260040161058a90615309565b5f805b602081101561341e576133e081601f61520c565b6133eb906008614fd0565b876133f783600661521f565b8151811061340757613407614d3f565b016020015160f81c901b91909117906001016133cc565b505f8660268151811061343357613433614d3f565b016020015191976001600160f81b03199092161515965090945050505050565b61345b614154565b6134648161419f565b50565b5f5f8051602061551f8339815191528161348084610a48565b90505f61348c87611dca565b90506002815160058111156134a3576134a3614aa9565b146135025760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161058a565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166135955760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161058a565b5f8282608001516135a69190614fe7565b600485015460408401519192506135c8916001600160401b0390911690615350565b6001600160401b0316816001600160401b031611156136475760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161058a565b61365188826121e9565b5f61365b89612159565b90505f898260405160200161368792919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090506136a885613fb3565b5f6005600160991b0163ee5b48eb6136c18d8688612231565b6040518263ffffffff1660e01b81526004016136dd9190614bc9565b6020604051808303815f875af11580156136f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061371d9190614bfb565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156137a5576137a5614aa9565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e146138f75760405162461bcd60e51b815260040161058a9061527d565b5f805b60028110156139465761390e81600161520c565b613919906008614fd0565b61ffff1685828151811061392f5761392f614d3f565b016020015160f81c901b91909117906001016138fa565b5061ffff8116156139695760405162461bcd60e51b815260040161058a906152c6565b5f805b60048110156139c45761398081600361520c565b61398b906008614fd0565b63ffffffff168661399d83600261521f565b815181106139ad576139ad614d3f565b016020015160f81c901b919091179060010161396c565b5063ffffffff81166005146139eb5760405162461bcd60e51b815260040161058a90615309565b5f805b6020811015613a4057613a0281601f61520c565b613a0d906008614fd0565b87613a1983600661521f565b81518110613a2957613a29614d3f565b016020015160f81c901b91909117906001016139ee565b505f805b6008811015613a9f57613a5881600761520c565b613a63906008614fd0565b6001600160401b031688613a7883602661521f565b81518110613a8857613a88614d3f565b016020015160f81c901b9190911790600101613a44565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613b375760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161058a565b5f8051602061555f83398151915242613b566040860160208701614a79565b6001600160401b0316118015613b8f5750613b776040850160208601614a79565b6001600160401b0316613b8d426202a30061521f565b115b613bf15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161058a565b8335613c0f5760405162461bcd60e51b815260040161058a90614e9a565b83355f90815260078201602052604090205415613c3e5760405162461bcd60e51b815260040161058a90614edb565b613c4b604085018561537b565b9050603014613c6c5760405162461bcd60e51b815260040161058a90614f23565b613c7583613fb3565b5f80613d0f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613cba9190614a79565b6001600160401b03168152602001613cd560408a018a61537b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614211565b5f82815260058601602052604090209193509150613d2d8282615401565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613d5a908590600401614bc9565b6020604051808303815f875af1158015613d76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d9a9190614bfb565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115613e1257613e12614aa9565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ef2918e01908e01614a79565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613f435760405163cd78605960e01b815230600482015260240161058a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f8c576040519150601f19603f3d011682016040523d82523d5f602084013e613f91565b606091505b5050905080611cb257604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061555f8339815191529060ff165f03613ff1575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090614039908361520c565b10614055576001600160401b0384166040830152808252614074565b83826040018181516140679190614fe7565b6001600160401b03169052505b5f82602001518360400151606461408b9190615350565b61409591906154c0565b600285015490915060ff90811690821611156141105760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161058a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661419d57604051631afcd79f60e31b815260040160405180910390fd5b565b6141a7614154565b6141b0816145c0565b6141b86145d9565b613464606082013560808301356141d560c0850160a08601614a79565b6141e560e0860160c087016154e5565b61ffff166141fa610100870160e088016154fe565b61420c61012088016101008901614cd8565b6145e9565b5f606082608001515160301461427b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161058a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142f2576142b281600161520c565b6142bd906008614fd0565b5081515f908390839081106142d4576142d4614d3f565b60200101906001600160f81b03191690815f1a90535060010161429e565b505f5b600481101561435a5761430981600361520c565b614314906008614fd0565b600160ff919091161c60f81b8261432c83600261521f565b8151811061433c5761433c614d3f565b60200101906001600160f81b03191690815f1a9053506001016142f5565b505f5b60208110156143b7578451816020811061437957614379614d3f565b1a60f81b8261438983600661521f565b8151811061439957614399614d3f565b60200101906001600160f81b03191690815f1a90535060010161435d565b505f5b602081101561441757846020015181602081106143d9576143d9614d3f565b1a60f81b826143e983602661521f565b815181106143f9576143f9614d3f565b60200101906001600160f81b03191690815f1a9053506001016143ba565b505f5b600881101561448b5761442e81600761520c565b614439906008614fd0565b60ff1685604001516001600160401b0316901c60f81b8282604661445d919061521f565b8151811061446d5761446d614d3f565b60200101906001600160f81b03191690815f1a90535060010161441a565b505f5b60308110156144f657846080015181815181106144ad576144ad614d3f565b01602001516001600160f81b031916826144c883604e61521f565b815181106144d8576144d8614d3f565b60200101906001600160f81b03191690815f1a90535060010161448e565b505f5b60088110156145685761450d81600761520c565b614518906008614fd0565b60608601516001600160401b0390811691161c60f81b8261453a83607e61521f565b8151811061454a5761454a614d3f565b60200101906001600160f81b03191690815f1a9053506001016144f9565b506002816040516145799190614fbf565b602060405180830381855afa158015614594573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145b79190614bfb565b94909350915050565b6145c8614154565b6145d061482d565b61346481614835565b6145e1614154565b61419d6148ab565b6145f1614154565b5f8051602061551f8339815191528361465d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161058a565b61271084111561467f5760405162461bcd60e51b815260040161058a90615232565b858711156146e75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161058a565b5f8360ff16116147545760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161058a565b600a60ff841611156147c65760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161058a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b61419d614154565b61483d614154565b80355f8051602061555f83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561488760608301604084016154fe565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b6126a0614154565b5080546148bf90615007565b5f825580601f106148ce575050565b601f0160209004905f5260205f209081019061346491905b808211156148f9575f81556001016148e6565b5090565b8015158114613464575f80fd5b803563ffffffff81168114611dc5575f80fd5b5f805f6060848603121561492f575f80fd5b833592506020840135614941816148fd565b915061494f6040850161490a565b90509250925092565b5f60208284031215614968575f80fd5b5035919050565b803561ffff81168114611dc5575f80fd5b80356001600160401b0381168114611dc5575f80fd5b5f805f606084860312156149a8575f80fd5b83356001600160401b038111156149bd575f80fd5b8401606081870312156149ce575f80fd5b92506149dc6020850161496f565b915061494f60408501614980565b5f602082840312156149fa575f80fd5b610a8b8261490a565b5f8060408385031215614a14575f80fd5b614a1d8361490a565b946020939093013593505050565b5f8060408385031215614a3c575f80fd5b82356001600160401b03811115614a51575f80fd5b830160808186031215614a62575f80fd5b9150614a706020840161490a565b90509250929050565b5f60208284031215614a89575f80fd5b610a8b82614980565b5f6101208284031215614aa3575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614ae057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614b1b60608401826001600160401b03169052565b506080830151614b3660808401826001600160401b03169052565b5060a0830151614b5160a08401826001600160401b03169052565b5060c0830151614b6c60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614b6c57614b6c614b73565b5f5b83811015614bc1578181015183820152602001614ba9565b50505f910152565b602081525f8251806020840152614be7816040850160208701614ba7565b601f01601f19169190910160400192915050565b5f60208284031215614c0b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614c3457614c34614c12565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114613464575f80fd5b5f60208284031215614ce8575f80fd5b8135610a8b81614cc4565b5f808335601e19843603018112614d08575f80fd5b8301803591506001600160401b03821115614d21575f80fd5b6020019150600581901b3603821315614d38575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614d67575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614da757614da7614d71565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614dd557614dd5614d71565b604052919050565b5f6001600160401b03821115614df557614df5614d71565b50601f01601f191660200190565b5f60608236031215614e13575f80fd5b614e1b614d85565b823581526020614e2c818501614980565b8183015260408401356001600160401b03811115614e48575f80fd5b840136601f820112614e58575f80fd5b8035614e6b614e6682614ddd565b614dad565b8181523684838501011115614e7e575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551614f81818460208a01614ba7565b80830190508581526001600160401b0360c01b8560c01b1660208201528351614fb1816028840160208801614ba7565b016028019695505050505050565b5f8251614d67818460208701614ba7565b8082028115828204841417610a5857610a58614b73565b6001600160401b03818116838216019080821115614b6c57614b6c614b73565b600181811c9082168061501b57607f821691505b602082108103614aa357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461509281615007565b806020870152604060018084165f81146150b357600181146150cf576150fc565b60ff19851660408a0152604084151560051b8a010195506150fc565b895f5260205f205f5b858110156150f35781548b82018601529083019088016150d8565b8a016040019650505b509398975050505050505050565b8051611dc5816148fd565b5f8060408385031215615126575f80fd5b82516001600160401b038082111561513c575f80fd5b908401906060828703121561514f575f80fd5b615157614d85565b8251815260208084015161516a81614cc4565b8282015260408401518381111561517f575f80fd5b80850194505087601f850112615193575f80fd5b835192506151a3614e6684614ddd565b83815288828587010111156151b6575f80fd5b6151c584838301848801614ba7565b806040840152508195506151da81880161510a565b9450505050509250929050565b5f6001600160401b0380831681810361520257615202614b73565b6001019392505050565b81810381811115610a5857610a58614b73565b80820180821115610a5857610a58614b73565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461537357615373614b73565b505092915050565b5f808335601e19843603018112615390575f80fd5b8301803591506001600160401b038211156153a9575f80fd5b602001915036819003821315614d38575f80fd5b601f821115611cb257805f5260205f20601f840160051c810160208510156153e25750805b601f840160051c820191505b81811015611531575f81556001016153ee565b81516001600160401b0381111561541a5761541a614d71565b61542e816154288454615007565b846153bd565b602080601f831160018114615461575f841561544a5750858301515b5f19600386901b1c1916600185901b1785556154b8565b5f85815260208120601f198616915b8281101561548f57888601518255948401946001909101908401615470565b50858210156154ac57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b03808416806154d9576154d9614c12565b92169190910492915050565b5f602082840312156154f5575f80fd5b610a8b8261496f565b5f6020828403121561550e575f80fd5b813560ff81168114610a8b575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 54c20863f..6602bd8c1 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -72,7 +72,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516136ff3803806136ff83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6135b28061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c80638da5cb5b11610093578063bee0a03f11610063578063bee0a03f1461023e578063c151c0b914610251578063d5f20ff614610264578063f2fde38b14610284575f80fd5b80638da5cb5b146101c657806397fb70d41461020a578063a3a65e481461021d578063b771b3bc14610230575f80fd5b806361e2f490116100ce57806361e2f4901461016d57806366435abf14610180578063715018a6146101ab5780638994ab49146101b3575f80fd5b80630322ed98146100f45780630cdd098514610109578063467ef06f1461015a575b5f80fd5b610107610102366004612ab6565b610297565b005b610147610117366004612ab6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b610107610168366004612ae5565b610455565b61010761017b366004612afe565b610463565b61019361018e366004612ab6565b610b66565b6040516001600160401b039091168152602001610151565b610107610b7a565b6101476101c1366004612b78565b610b8d565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610151565b610107610218366004612ab6565b610ba9565b61010761022b366004612ae5565b610bbd565b6101f26005600160991b0181565b61010761024c366004612ab6565b610d75565b61010761025f366004612bcd565b610e84565b610277610272366004612ab6565b610f92565b6040516101519190612c17565b610107610292366004612ccd565b611085565b5f8181525f805160206135868339815191526020526040808220815160e0810190925280545f8051602061356683398151915293929190829060ff1660058111156102e4576102e4612c03565b60058111156102f5576102f5612c03565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561036457610364612c03565b146103ce5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103f38584606001515f6110bf565b6040518263ffffffff1660e01b815260040161040f9190612d11565b6020604051808303815f875af115801561042b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044f9190612d43565b50505050565b61045e816112e4565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206135668339815191529060ff16156105005760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103c5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610543573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105679190612d43565b8360200135146105c95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103c5565b306105da6060850160408601612ccd565b6001600160a01b03161461064c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103c5565b5f61065a6060850185612d5a565b9050116106b95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103c5565b5f6106c76060850185612d5a565b91505063ffffffff81106107335760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103c5565b5f84356020860135601461074d6060890160408a01612ccd565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b82811015610a7e575f6107c66060880188612d5a565b838181106107d6576107d6612da6565b90506020028101906107e89190612dba565b6107f190612e6a565b8051909150806108135760405162461bcd60e51b81526004016103c590612f01565b5f818152600787016020526040902054156108405760405162461bcd60e51b81526004016103c590612f42565b8160400151516030146108655760405162461bcd60e51b81526004016103c590612f8a565b83825f0151836020015184604001516040516020016108879493929190612fd7565b60408051601f198184030181528282528a35602084015290820185905294505f9060029060600160408051601f19818403018152908290526108c891613026565b602060405180830381855afa1580156108e3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109069190612d43565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff1916600183600581111561099257610992612c03565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050506001016107b0565b505f610a898561165c565b90505f610a998260400151611836565b905080600284604051610aac9190613026565b602060405180830381855afa158015610ac7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aea9190612d43565b14610b4e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103c5565b5050506008909101805460ff19166001179055505050565b5f610b7082610f92565b6080015192915050565b610b8261199f565b610b8b5f6119fa565b565b5f610b9661199f565b610ba08383611a6a565b90505b92915050565b610bb161199f565b610bba81611ede565b50565b5f805160206135668339815191525f610bd58361165c565b90505f80610be683604001516121d4565b9150915080610c485760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103c5565b5f82815260058501602052604081208054610c6290613037565b9050118015610c94575060015f83815260068601602052604090205460ff166005811115610c9257610c92612c03565b145b610cb05760405162461bcd60e51b81526004016103c590613069565b5f8281526005850160205260408120610cc891612a6c565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613566833981519152929190610dbd90613037565b9050118015610def575060015f83815260068301602052604090205460ff166005811115610ded57610ded612c03565b145b610e0b5760405162461bcd60e51b81526004016103c590613069565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e4491906004016130b0565b6020604051808303815f875af1158015610e60573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045e9190612d43565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ec85750825b90505f826001600160401b03166001148015610ee35750303b155b905081158015610ef1575080155b15610f0f5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610f3957845460ff60401b1916600160401b1785555b610f438787612375565b8315610f8957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061358683398151915290528390208351918201909352825491925f8051602061356683398151915292829060ff16600581111561101257611012612c03565b600581111561102357611023612c03565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b61108d61199f565b6001600160a01b0381166110b657604051631e4fbdf760e01b81525f60048201526024016103c5565b610bba816119fa565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611138576110f881600161314e565b611103906008613161565b5081515f9083908390811061111a5761111a612da6565b60200101906001600160f81b03191690815f1a9053506001016110e4565b505f5b60048110156111a35761114f81600361314e565b61115a906008613161565b600263ffffffff16901c60f81b828260026111759190613178565b8151811061118557611185612da6565b60200101906001600160f81b03191690815f1a90535060010161113b565b505f5b6020811015611205576111ba81601f61314e565b6111c5906008613161565b86901c60f81b826111d7836006613178565b815181106111e7576111e7612da6565b60200101906001600160f81b03191690815f1a9053506001016111a6565b505f5b60088110156112705761121c81600761314e565b611227906008613161565b6001600160401b038616901c60f81b82611242836026613178565b8151811061125257611252612da6565b60200101906001600160f81b03191690815f1a905350600101611208565b505f5b60088110156112db5761128781600761314e565b611292906008613161565b6001600160401b038516901c60f81b826112ad83602e613178565b815181106112bd576112bd612da6565b60200101906001600160f81b03191690815f1a905350600101611273565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206135668339815191525f6113338561165c565b90505f8061134483604001516121d4565b9150915080156113a95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103c5565b5f828152600685016020526040808220815160e081019092528054829060ff1660058111156113da576113da612c03565b60058111156113eb576113eb612c03565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561145c5761145c612c03565b148061147a575060018251600581111561147857611478612c03565b145b6114d95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103c5565b6003825160058111156114ee576114ee612c03565b036114fb575060046114ff565b5060055b6020808301515f9081526007880190915260408120558181600581111561152857611528612c03565b9081600581111561153b5761153b612c03565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561156f5761156f612c03565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561162357611623612c03565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830181905292820152905f805160206135668339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156116d1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116f8919081019061319a565b91509150806117585760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103c5565b82548251146117bb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103c5565b60208201516001600160a01b03161561182e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103c5565b509392505050565b5f81516026146118585760405162461bcd60e51b81526004016103c59061326c565b5f805b60028110156118a75761186f81600161314e565b61187a906008613161565b61ffff1684828151811061189057611890612da6565b016020015160f81c901b919091179060010161185b565b5061ffff8116156118ca5760405162461bcd60e51b81526004016103c5906132b5565b5f805b6004811015611925576118e181600361314e565b6118ec906008613161565b63ffffffff16856118fe836002613178565b8151811061190e5761190e612da6565b016020015160f81c901b91909117906001016118cd565b5063ffffffff81161561194a5760405162461bcd60e51b81526004016103c5906132f8565b5f805b60208110156112db5761196181601f61314e565b61196c906008613161565b86611978836006613178565b8151811061198857611988612da6565b016020015160f81c901b919091179060010161194d565b336119d17f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b8b5760405163118cdaa760e01b81523360048201526024016103c5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16611af55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103c5565b5f8051602061356683398151915242611b14604086016020870161333f565b6001600160401b0316118015611b4d5750611b35604085016020860161333f565b6001600160401b0316611b4b426202a300613178565b115b611baf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103c5565b8335611bcd5760405162461bcd60e51b81526004016103c590612f01565b83355f90815260078201602052604090205415611bfc5760405162461bcd60e51b81526004016103c590612f42565b611c096040850185613358565b9050603014611c2a5760405162461bcd60e51b81526004016103c590612f8a565b611c3383612393565b5f80611ccd6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611c78919061333f565b6001600160401b03168152602001611c9360408a018a613358565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612534565b5f82815260058601602052604090209193509150611ceb82826133e5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d18908590600401612d11565b6020604051808303815f875af1158015611d34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d589190612d43565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115611dd057611dd0612c03565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611eb0918e01908e0161333f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206135868339815191526020526040808220815160e0810190925280545f8051602061356683398151915293929190829060ff166005811115611f2b57611f2b612c03565b6005811115611f3c57611f3c612c03565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611fae57611fae612c03565b1461200a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103c5565b6120178160800151612393565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561205b5761205b612c03565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121108461210a816128e3565b5f6110bf565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061213f908590600401612d11565b6020604051808303815f875af115801561215b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061217f9190612d43565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146121f75760405162461bcd60e51b81526004016103c59061326c565b5f805b60028110156122465761220e81600161314e565b612219906008613161565b61ffff1685828151811061222f5761222f612da6565b016020015160f81c901b91909117906001016121fa565b5061ffff8116156122695760405162461bcd60e51b81526004016103c5906132b5565b5f805b60048110156122c45761228081600361314e565b61228b906008613161565b63ffffffff168661229d836002613178565b815181106122ad576122ad612da6565b016020015160f81c901b919091179060010161226c565b5063ffffffff81166003146122eb5760405162461bcd60e51b81526004016103c5906132f8565b5f805b60208110156123405761230281601f61314e565b61230d906008613161565b87612319836006613178565b8151811061232957612329612da6565b016020015160f81c901b91909117906001016122ee565b505f8660268151811061235557612355612da6565b016020015191976001600160f81b03199092161515965090945050505050565b61237d612973565b612386826129bc565b61238f816129d5565b5050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206135668339815191529060ff165f036123d1575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090612419908361314e565b10612435576001600160401b0384166040830152808252612454565b838260400181815161244791906134a4565b6001600160401b03169052505b5f82602001518360400151606461246b91906134c4565b61247591906134ef565b600285015490915060ff90811690821611156124f05760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103c5565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f606082608001515160301461259e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103c5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612615576125d581600161314e565b6125e0906008613161565b5081515f908390839081106125f7576125f7612da6565b60200101906001600160f81b03191690815f1a9053506001016125c1565b505f5b600481101561267d5761262c81600361314e565b612637906008613161565b600160ff919091161c60f81b8261264f836002613178565b8151811061265f5761265f612da6565b60200101906001600160f81b03191690815f1a905350600101612618565b505f5b60208110156126da578451816020811061269c5761269c612da6565b1a60f81b826126ac836006613178565b815181106126bc576126bc612da6565b60200101906001600160f81b03191690815f1a905350600101612680565b505f5b602081101561273a57846020015181602081106126fc576126fc612da6565b1a60f81b8261270c836026613178565b8151811061271c5761271c612da6565b60200101906001600160f81b03191690815f1a9053506001016126dd565b505f5b60088110156127ae5761275181600761314e565b61275c906008613161565b60ff1685604001516001600160401b0316901c60f81b828260466127809190613178565b8151811061279057612790612da6565b60200101906001600160f81b03191690815f1a90535060010161273d565b505f5b603081101561281957846080015181815181106127d0576127d0612da6565b01602001516001600160f81b031916826127eb83604e613178565b815181106127fb576127fb612da6565b60200101906001600160f81b03191690815f1a9053506001016127b1565b505f5b600881101561288b5761283081600761314e565b61283b906008613161565b60608601516001600160401b0390811691161c60f81b8261285d83607e613178565b8151811061286d5761286d612da6565b60200101906001600160f81b03191690815f1a90535060010161281c565b5060028160405161289c9190613026565b602060405180830381855afa1580156128b7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128da9190612d43565b94909350915050565b5f8181525f805160206135868339815191526020526040812060020180545f8051602061356683398151915291600160401b9091046001600160401b031690600861292d83613520565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b8b57604051631afcd79f60e31b815260040160405180910390fd5b6129c4612973565b6129cc6129e6565b610bba816129ee565b6129dd612973565b610bba81612a64565b610b8b612973565b6129f6612973565b80355f8051602061356683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612a406060830160408401613545565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b61108d612973565b508054612a7890613037565b5f825580601f10612a87575050565b601f0160209004905f5260205f2090810190610bba91905b80821115612ab2575f8155600101612a9f565b5090565b5f60208284031215612ac6575f80fd5b5035919050565b803563ffffffff81168114612ae0575f80fd5b919050565b5f60208284031215612af5575f80fd5b610ba082612acd565b5f8060408385031215612b0f575f80fd5b82356001600160401b03811115612b24575f80fd5b830160808186031215612b35575f80fd5b9150612b4360208401612acd565b90509250929050565b5f60608284031215612b5c575f80fd5b50919050565b80356001600160401b0381168114612ae0575f80fd5b5f8060408385031215612b89575f80fd5b82356001600160401b03811115612b9e575f80fd5b612baa85828601612b4c565b925050612b4360208401612b62565b6001600160a01b0381168114610bba575f80fd5b5f8060808385031215612bde575f80fd5b612be88484612b4c565b91506060830135612bf881612bb9565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612c3a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612c7560608401826001600160401b03169052565b506080830151612c9060808401826001600160401b03169052565b5060a0830151612cab60a08401826001600160401b03169052565b5060c0830151612cc660c08401826001600160401b03169052565b5092915050565b5f60208284031215612cdd575f80fd5b8135612ce881612bb9565b9392505050565b5f5b83811015612d09578181015183820152602001612cf1565b50505f910152565b602081525f8251806020840152612d2f816040850160208701612cef565b601f01601f19169190910160400192915050565b5f60208284031215612d53575f80fd5b5051919050565b5f808335601e19843603018112612d6f575f80fd5b8301803591506001600160401b03821115612d88575f80fd5b6020019150600581901b3603821315612d9f575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612dce575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612e0e57612e0e612dd8565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e3c57612e3c612dd8565b604052919050565b5f6001600160401b03821115612e5c57612e5c612dd8565b50601f01601f191660200190565b5f60608236031215612e7a575f80fd5b612e82612dec565b823581526020612e93818501612b62565b8183015260408401356001600160401b03811115612eaf575f80fd5b840136601f820112612ebf575f80fd5b8035612ed2612ecd82612e44565b612e14565b8181523684838501011115612ee5575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551612fe8818460208a01612cef565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613018816028840160208801612cef565b016028019695505050505050565b5f8251612dce818460208701612cef565b600181811c9082168061304b57607f821691505b602082108103612b5c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546130c281613037565b806020870152604060018084165f81146130e357600181146130ff5761312c565b60ff19851660408a0152604084151560051b8a0101955061312c565b895f5260205f205f5b858110156131235781548b8201860152908301908801613108565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610ba357610ba361313a565b8082028115828204841417610ba357610ba361313a565b80820180821115610ba357610ba361313a565b80518015158114612ae0575f80fd5b5f80604083850312156131ab575f80fd5b82516001600160401b03808211156131c1575f80fd5b90840190606082870312156131d4575f80fd5b6131dc612dec565b825181526020808401516131ef81612bb9565b82820152604084015183811115613204575f80fd5b80850194505087601f850112613218575f80fd5b83519250613228612ecd84612e44565b838152888285870101111561323b575f80fd5b61324a84838301848801612cef565b8060408401525081955061325f81880161318b565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561334f575f80fd5b610ba082612b62565b5f808335601e1984360301811261336d575f80fd5b8301803591506001600160401b03821115613386575f80fd5b602001915036819003821315612d9f575f80fd5b601f82111561045e57805f5260205f20601f840160051c810160208510156133bf5750805b601f840160051c820191505b818110156133de575f81556001016133cb565b5050505050565b81516001600160401b038111156133fe576133fe612dd8565b6134128161340c8454613037565b8461339a565b602080601f831160018114613445575f841561342e5750858301515b5f19600386901b1c1916600185901b17855561349c565b5f85815260208120601f198616915b8281101561347357888601518255948401946001909101908401613454565b508582101561349057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115612cc657612cc661313a565b6001600160401b038181168382160280821691908281146134e7576134e761313a565b505092915050565b5f6001600160401b038084168061351457634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f6001600160401b0380831681810361353b5761353b61313a565b6001019392505050565b5f60208284031215613555575f80fd5b813560ff81168114612ce8575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161376c38038061376c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61361f8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c80638da5cb5b11610093578063bee0a03f11610063578063bee0a03f1461023e578063c151c0b914610251578063d5f20ff614610264578063f2fde38b14610284575f80fd5b80638da5cb5b146101c657806397fb70d41461020a578063a3a65e481461021d578063b771b3bc14610230575f80fd5b806361e2f490116100ce57806361e2f4901461016d57806366435abf14610180578063715018a6146101ab5780638994ab49146101b3575f80fd5b80630322ed98146100f45780630cdd098514610109578063467ef06f1461015a575b5f80fd5b610107610102366004612b23565b610297565b005b610147610117366004612b23565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b610107610168366004612b52565b610455565b61010761017b366004612b6b565b610463565b61019361018e366004612b23565b610bd3565b6040516001600160401b039091168152602001610151565b610107610be7565b6101476101c1366004612be5565b610bfa565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610151565b610107610218366004612b23565b610c16565b61010761022b366004612b52565b610c2a565b6101f26005600160991b0181565b61010761024c366004612b23565b610de2565b61010761025f366004612c3a565b610ef1565b610277610272366004612b23565b610fff565b6040516101519190612c84565b610107610292366004612d3a565b6110f2565b5f8181525f805160206135f38339815191526020526040808220815160e0810190925280545f805160206135d383398151915293929190829060ff1660058111156102e4576102e4612c70565b60058111156102f5576102f5612c70565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561036457610364612c70565b146103ce5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103f38584606001515f61112c565b6040518263ffffffff1660e01b815260040161040f9190612d7e565b6020604051808303815f875af115801561042b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044f9190612db0565b50505050565b61045e81611351565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206135d38339815191529060ff16156105005760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103c5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610543573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105679190612db0565b8360200135146105c95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103c5565b306105da6060850160408601612d3a565b6001600160a01b03161461064c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103c5565b5f61065a6060850185612dc7565b9050116106b95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103c5565b5f6106c76060850185612dc7565b91505063ffffffff81106107335760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103c5565b5f84356020860135601461074d6060890160408a01612d3a565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b82811015610a7e575f6107c66060880188612dc7565b838181106107d6576107d6612e13565b90506020028101906107e89190612e27565b6107f190612ed7565b8051909150806108135760405162461bcd60e51b81526004016103c590612f6e565b5f818152600787016020526040902054156108405760405162461bcd60e51b81526004016103c590612faf565b8160400151516030146108655760405162461bcd60e51b81526004016103c590612ff7565b83825f0151836020015184604001516040516020016108879493929190613044565b60408051601f198184030181528282528a35602084015290820185905294505f9060029060600160408051601f19818403018152908290526108c891613093565b602060405180830381855afa1580156108e3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109069190612db0565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff1916600183600581111561099257610992612c70565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050506001016107b0565b505f610a89856116c9565b90505f610a9982604001516118a3565b9050825160b414610b085760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c696420656e636f64656044820152720c840c6dedceccae4e6d2dedc40d8cadccee8d606b1b60648201526084016103c5565b80600284604051610b199190613093565b602060405180830381855afa158015610b34573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b579190612db0565b14610bbb5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103c5565b5050506008909101805460ff19166001179055505050565b5f610bdd82610fff565b6080015192915050565b610bef611a0c565b610bf85f611a67565b565b5f610c03611a0c565b610c0d8383611ad7565b90505b92915050565b610c1e611a0c565b610c2781611f4b565b50565b5f805160206135d38339815191525f610c42836116c9565b90505f80610c538360400151612241565b9150915080610cb55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103c5565b5f82815260058501602052604081208054610ccf906130a4565b9050118015610d01575060015f83815260068601602052604090205460ff166005811115610cff57610cff612c70565b145b610d1d5760405162461bcd60e51b81526004016103c5906130d6565b5f8281526005850160205260408120610d3591612ad9565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206135d3833981519152929190610e2a906130a4565b9050118015610e5c575060015f83815260068301602052604090205460ff166005811115610e5a57610e5a612c70565b145b610e785760405162461bcd60e51b81526004016103c5906130d6565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610eb1919060040161311d565b6020604051808303815f875af1158015610ecd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045e9190612db0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610f355750825b90505f826001600160401b03166001148015610f505750303b155b905081158015610f5e575080155b15610f7c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610fa657845460ff60401b1916600160401b1785555b610fb087876123e2565b8315610ff657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206135f383398151915290528390208351918201909352825491925f805160206135d383398151915292829060ff16600581111561107f5761107f612c70565b600581111561109057611090612c70565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6110fa611a0c565b6001600160a01b03811661112357604051631e4fbdf760e01b81525f60048201526024016103c5565b610c2781611a67565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156111a5576111658160016131bb565b6111709060086131ce565b5081515f9083908390811061118757611187612e13565b60200101906001600160f81b03191690815f1a905350600101611151565b505f5b6004811015611210576111bc8160036131bb565b6111c79060086131ce565b600263ffffffff16901c60f81b828260026111e291906131e5565b815181106111f2576111f2612e13565b60200101906001600160f81b03191690815f1a9053506001016111a8565b505f5b60208110156112725761122781601f6131bb565b6112329060086131ce565b86901c60f81b826112448360066131e5565b8151811061125457611254612e13565b60200101906001600160f81b03191690815f1a905350600101611213565b505f5b60088110156112dd576112898160076131bb565b6112949060086131ce565b6001600160401b038616901c60f81b826112af8360266131e5565b815181106112bf576112bf612e13565b60200101906001600160f81b03191690815f1a905350600101611275565b505f5b6008811015611348576112f48160076131bb565b6112ff9060086131ce565b6001600160401b038516901c60f81b8261131a83602e6131e5565b8151811061132a5761132a612e13565b60200101906001600160f81b03191690815f1a9053506001016112e0565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206135d38339815191525f6113a0856116c9565b90505f806113b18360400151612241565b9150915080156114165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103c5565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561144757611447612c70565b600581111561145857611458612c70565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156114c9576114c9612c70565b14806114e757506001825160058111156114e5576114e5612c70565b145b6115465760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103c5565b60038251600581111561155b5761155b612c70565b036115685750600461156c565b5060055b6020808301515f9081526007880190915260408120558181600581111561159557611595612c70565b908160058111156115a8576115a8612c70565b9052505f84815260068701602052604090208251815484929190829060ff191660018360058111156115dc576115dc612c70565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561169057611690612c70565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830181905292820152905f805160206135d38339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561173e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117659190810190613207565b91509150806117c55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103c5565b82548251146118285760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103c5565b60208201516001600160a01b03161561189b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103c5565b509392505050565b5f81516026146118c55760405162461bcd60e51b81526004016103c5906132d9565b5f805b6002811015611914576118dc8160016131bb565b6118e79060086131ce565b61ffff168482815181106118fd576118fd612e13565b016020015160f81c901b91909117906001016118c8565b5061ffff8116156119375760405162461bcd60e51b81526004016103c590613322565b5f805b60048110156119925761194e8160036131bb565b6119599060086131ce565b63ffffffff168561196b8360026131e5565b8151811061197b5761197b612e13565b016020015160f81c901b919091179060010161193a565b5063ffffffff8116156119b75760405162461bcd60e51b81526004016103c590613365565b5f805b6020811015611348576119ce81601f6131bb565b6119d99060086131ce565b866119e58360066131e5565b815181106119f5576119f5612e13565b016020015160f81c901b91909117906001016119ba565b33611a3e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610bf85760405163118cdaa760e01b81523360048201526024016103c5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16611b625760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103c5565b5f805160206135d383398151915242611b8160408601602087016133ac565b6001600160401b0316118015611bba5750611ba260408501602086016133ac565b6001600160401b0316611bb8426202a3006131e5565b115b611c1c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103c5565b8335611c3a5760405162461bcd60e51b81526004016103c590612f6e565b83355f90815260078201602052604090205415611c695760405162461bcd60e51b81526004016103c590612faf565b611c7660408501856133c5565b9050603014611c975760405162461bcd60e51b81526004016103c590612ff7565b611ca083612400565b5f80611d3a6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611ce591906133ac565b6001600160401b03168152602001611d0060408a018a6133c5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506125a1565b5f82815260058601602052604090209193509150611d588282613452565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d85908590600401612d7e565b6020604051808303815f875af1158015611da1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc59190612db0565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115611e3d57611e3d612c70565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f1d918e01908e016133ac565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206135f38339815191526020526040808220815160e0810190925280545f805160206135d383398151915293929190829060ff166005811115611f9857611f98612c70565b6005811115611fa957611fa9612c70565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561201b5761201b612c70565b146120775760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103c5565b6120848160800151612400565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156120c8576120c8612c70565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61217d8461217781612950565b5f61112c565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906121ac908590600401612d7e565b6020604051808303815f875af11580156121c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121ec9190612db0565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146122645760405162461bcd60e51b81526004016103c5906132d9565b5f805b60028110156122b35761227b8160016131bb565b6122869060086131ce565b61ffff1685828151811061229c5761229c612e13565b016020015160f81c901b9190911790600101612267565b5061ffff8116156122d65760405162461bcd60e51b81526004016103c590613322565b5f805b6004811015612331576122ed8160036131bb565b6122f89060086131ce565b63ffffffff168661230a8360026131e5565b8151811061231a5761231a612e13565b016020015160f81c901b91909117906001016122d9565b5063ffffffff81166003146123585760405162461bcd60e51b81526004016103c590613365565b5f805b60208110156123ad5761236f81601f6131bb565b61237a9060086131ce565b876123868360066131e5565b8151811061239657612396612e13565b016020015160f81c901b919091179060010161235b565b505f866026815181106123c2576123c2612e13565b016020015191976001600160f81b03199092161515965090945050505050565b6123ea6129e0565b6123f382612a29565b6123fc81612a42565b5050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206135d38339815191529060ff165f0361243e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061248690836131bb565b106124a2576001600160401b03841660408301528082526124c1565b83826040018181516124b49190613511565b6001600160401b03169052505b5f8260200151836040015160646124d89190613531565b6124e2919061355c565b600285015490915060ff908116908216111561255d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103c5565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f606082608001515160301461260b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103c5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612682576126428160016131bb565b61264d9060086131ce565b5081515f9083908390811061266457612664612e13565b60200101906001600160f81b03191690815f1a90535060010161262e565b505f5b60048110156126ea576126998160036131bb565b6126a49060086131ce565b600160ff919091161c60f81b826126bc8360026131e5565b815181106126cc576126cc612e13565b60200101906001600160f81b03191690815f1a905350600101612685565b505f5b6020811015612747578451816020811061270957612709612e13565b1a60f81b826127198360066131e5565b8151811061272957612729612e13565b60200101906001600160f81b03191690815f1a9053506001016126ed565b505f5b60208110156127a7578460200151816020811061276957612769612e13565b1a60f81b826127798360266131e5565b8151811061278957612789612e13565b60200101906001600160f81b03191690815f1a90535060010161274a565b505f5b600881101561281b576127be8160076131bb565b6127c99060086131ce565b60ff1685604001516001600160401b0316901c60f81b828260466127ed91906131e5565b815181106127fd576127fd612e13565b60200101906001600160f81b03191690815f1a9053506001016127aa565b505f5b6030811015612886578460800151818151811061283d5761283d612e13565b01602001516001600160f81b0319168261285883604e6131e5565b8151811061286857612868612e13565b60200101906001600160f81b03191690815f1a90535060010161281e565b505f5b60088110156128f85761289d8160076131bb565b6128a89060086131ce565b60608601516001600160401b0390811691161c60f81b826128ca83607e6131e5565b815181106128da576128da612e13565b60200101906001600160f81b03191690815f1a905350600101612889565b506002816040516129099190613093565b602060405180830381855afa158015612924573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129479190612db0565b94909350915050565b5f8181525f805160206135f38339815191526020526040812060020180545f805160206135d383398151915291600160401b9091046001600160401b031690600861299a8361358d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610bf857604051631afcd79f60e31b815260040160405180910390fd5b612a316129e0565b612a39612a53565b610c2781612a5b565b612a4a6129e0565b610c2781612ad1565b610bf86129e0565b612a636129e0565b80355f805160206135d383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612aad60608301604084016135b2565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b6110fa6129e0565b508054612ae5906130a4565b5f825580601f10612af4575050565b601f0160209004905f5260205f2090810190610c2791905b80821115612b1f575f8155600101612b0c565b5090565b5f60208284031215612b33575f80fd5b5035919050565b803563ffffffff81168114612b4d575f80fd5b919050565b5f60208284031215612b62575f80fd5b610c0d82612b3a565b5f8060408385031215612b7c575f80fd5b82356001600160401b03811115612b91575f80fd5b830160808186031215612ba2575f80fd5b9150612bb060208401612b3a565b90509250929050565b5f60608284031215612bc9575f80fd5b50919050565b80356001600160401b0381168114612b4d575f80fd5b5f8060408385031215612bf6575f80fd5b82356001600160401b03811115612c0b575f80fd5b612c1785828601612bb9565b925050612bb060208401612bcf565b6001600160a01b0381168114610c27575f80fd5b5f8060808385031215612c4b575f80fd5b612c558484612bb9565b91506060830135612c6581612c26565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612ca757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612ce260608401826001600160401b03169052565b506080830151612cfd60808401826001600160401b03169052565b5060a0830151612d1860a08401826001600160401b03169052565b5060c0830151612d3360c08401826001600160401b03169052565b5092915050565b5f60208284031215612d4a575f80fd5b8135612d5581612c26565b9392505050565b5f5b83811015612d76578181015183820152602001612d5e565b50505f910152565b602081525f8251806020840152612d9c816040850160208701612d5c565b601f01601f19169190910160400192915050565b5f60208284031215612dc0575f80fd5b5051919050565b5f808335601e19843603018112612ddc575f80fd5b8301803591506001600160401b03821115612df5575f80fd5b6020019150600581901b3603821315612e0c575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612e3b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612e7b57612e7b612e45565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612ea957612ea9612e45565b604052919050565b5f6001600160401b03821115612ec957612ec9612e45565b50601f01601f191660200190565b5f60608236031215612ee7575f80fd5b612eef612e59565b823581526020612f00818501612bcf565b8183015260408401356001600160401b03811115612f1c575f80fd5b840136601f820112612f2c575f80fd5b8035612f3f612f3a82612eb1565b612e81565b8181523684838501011115612f52575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551613055818460208a01612d5c565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613085816028840160208801612d5c565b016028019695505050505050565b5f8251612e3b818460208701612d5c565b600181811c908216806130b857607f821691505b602082108103612bc957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461312f816130a4565b806020870152604060018084165f8114613150576001811461316c57613199565b60ff19851660408a0152604084151560051b8a01019550613199565b895f5260205f205f5b858110156131905781548b8201860152908301908801613175565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c1057610c106131a7565b8082028115828204841417610c1057610c106131a7565b80820180821115610c1057610c106131a7565b80518015158114612b4d575f80fd5b5f8060408385031215613218575f80fd5b82516001600160401b038082111561322e575f80fd5b9084019060608287031215613241575f80fd5b613249612e59565b8251815260208084015161325c81612c26565b82820152604084015183811115613271575f80fd5b80850194505087601f850112613285575f80fd5b83519250613295612f3a84612eb1565b83815288828587010111156132a8575f80fd5b6132b784838301848801612d5c565b806040840152508195506132cc8188016131f8565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156133bc575f80fd5b610c0d82612bcf565b5f808335601e198436030181126133da575f80fd5b8301803591506001600160401b038211156133f3575f80fd5b602001915036819003821315612e0c575f80fd5b601f82111561045e57805f5260205f20601f840160051c8101602085101561342c5750805b601f840160051c820191505b8181101561344b575f8155600101613438565b5050505050565b81516001600160401b0381111561346b5761346b612e45565b61347f8161347984546130a4565b84613407565b602080601f8311600181146134b2575f841561349b5750858301515b5f19600386901b1c1916600185901b178555613509565b5f85815260208120601f198616915b828110156134e0578886015182559484019460019091019084016134c1565b50858210156134fd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115612d3357612d336131a7565b6001600160401b03818116838216028082169190828114613554576135546131a7565b505092915050565b5f6001600160401b038084168061358157634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f6001600160401b038083168181036135a8576135a86131a7565b6001019392505050565b5f602082840312156135c2575f80fd5b813560ff81168114612d55575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/packing.go b/abi-bindings/go/staking/PoAValidatorManager/packing.go index 1a4fa64ce..16ccdfbd6 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/packing.go +++ b/abi-bindings/go/staking/PoAValidatorManager/packing.go @@ -11,9 +11,9 @@ func (s *SubnetConversionData) Pack() ([]byte, error) { copy(b[32:64], s.BlockchainID[:]) lenAddress := len(s.ValidatorManagerAddress) for i := 0; i < 4; i++ { - b[i+64] = byte(lenAddress >> uint(8*(1-i))) + b[i+64] = byte(lenAddress >> uint8(8*(3-i))) } - copy(b[68:68+lenAddress], s.ValidatorManagerAddress) + copy(b[68:68+lenAddress], s.ValidatorManagerAddress.Bytes()) lenValidators := len(s.InitialValidators) for i := 0; i < 4; i++ { b[i+68+lenAddress] = byte(lenValidators >> uint8(8*(3-i))) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 06b84fcc1..f09e909c3 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -183,6 +183,9 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Parse the Warp message into SubnetConversionMessage bytes32 subnetConversionID = ValidatorMessages.unpackSubnetConversionMessage(warpMessage.payload); + require( + encodedConversion.length == 180, "ValidatorManager: invalid encoded conversion length" + ); require( sha256(encodedConversion) == subnetConversionID, "ValidatorManager: invalid subnet conversion ID" diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 545f6ec92..3e2efb20d 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -75,15 +75,16 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { ) convertSubnetTxId := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} subnetConversionData := poavalidatormanager.SubnetConversionData{ ConvertSubnetTxID: convertSubnetTxId, BlockchainID: subnetAInfo.BlockchainID, - ValidatorManagerAddress: validatorManagerAddress.Bytes(), + ValidatorManagerAddress: validatorManagerAddress, InitialValidators: []poavalidatormanager.InitialValidator{ { NodeID: ids.GenerateTestID(), Weight: 1, - BlsPublicKey: []byte{}, + BlsPublicKey: blsPublicKey[:], }, }, } From 9766b4e22e7b71a004af665e5a93f87b656bbced Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Mon, 16 Sep 2024 18:58:20 -0400 Subject: [PATCH 299/545] replace manual encoding with BigEndian Put methods --- .../go/staking/PoAValidatorManager/packing.go | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/abi-bindings/go/staking/PoAValidatorManager/packing.go b/abi-bindings/go/staking/PoAValidatorManager/packing.go index 16ccdfbd6..7bc650ee8 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/packing.go +++ b/abi-bindings/go/staking/PoAValidatorManager/packing.go @@ -3,27 +3,24 @@ package poavalidatormanager +import "encoding/binary" + func (s *SubnetConversionData) Pack() ([]byte, error) { packedLen := 72 + len(s.ValidatorManagerAddress) + 88*len(s.InitialValidators) b := make([]byte, packedLen) copy(b[0:32], s.ConvertSubnetTxID[:]) copy(b[32:64], s.BlockchainID[:]) - lenAddress := len(s.ValidatorManagerAddress) - for i := 0; i < 4; i++ { - b[i+64] = byte(lenAddress >> uint8(8*(3-i))) - } - copy(b[68:68+lenAddress], s.ValidatorManagerAddress.Bytes()) - lenValidators := len(s.InitialValidators) - for i := 0; i < 4; i++ { - b[i+68+lenAddress] = byte(lenValidators >> uint8(8*(3-i))) - } + // These are evm addresses and have lengths of 20 so hardcoding here + binary.BigEndian.PutUint32(b[64:68], uint32(20)) + copy(b[68:88], s.ValidatorManagerAddress.Bytes()) + binary.BigEndian.PutUint32(b[88:92], uint32(len(s.InitialValidators))) for i, iv := range s.InitialValidators { packedIv, err := iv.Pack() if err != nil { return nil, err } - copy(b[72+lenAddress+i*88:72+lenAddress+(i+1)*88], packedIv) + copy(b[92+i*88:92+(i+1)*88], packedIv) } return b, nil } @@ -31,9 +28,7 @@ func (s *SubnetConversionData) Pack() ([]byte, error) { func (iv *InitialValidator) Pack() ([]byte, error) { b := make([]byte, 88) copy(b[0:32], iv.NodeID[:]) - for i := 0; i < 8; i++ { - b[i+32] = byte(iv.Weight >> uint8(8*(7-i))) - } + binary.BigEndian.PutUint64(b[32:40], uint64(iv.Weight)) copy(b[40:88], iv.BlsPublicKey) return b, nil } From be54336426ed17fab251257cd7f6a964a9b4f60b Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Mon, 16 Sep 2024 19:39:04 -0400 Subject: [PATCH 300/545] add validationID verification --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../go/staking/PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/staking/ValidatorManager.sol | 7 ++----- tests/flows/staking/poa_validator_manager.go | 8 ++++++++ 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 353dc3d63..8b97261d6 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615acf380380615acf83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159828061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c806366435abf116100b4578063a3a65e4811610079578063a3a65e48146102bb578063b771b3bc146102ce578063ba3a4b97146102f4578063bee0a03f14610307578063d5f20ff61461031a578063eb0acb891461033a575f80fd5b806366435abf1461025c5780636f5f1c941461026f57806376f786211461028257806398f3e2b4146102955780639e1bc4ef146102a8575f80fd5b806335455ded116100fa57806335455ded146101f4578063467ef06f146102105780635297fae61461022357806361e2f490146102365780636206585614610249575f80fd5b80630118acc4146101365780630322ed981461014b5780630cdd09851461015e578063151d30d1146101af5780632e2194d8146101c9575b5f80fd5b610149610144366004614c5b565b61034d565b005b610149610159366004614c96565b6107b7565b61019c61016c366004614c96565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101b7600a81565b60405160ff90911681526020016101a6565b6101dc6101d7366004614c96565b610970565b6040516001600160401b0390911681526020016101a6565b6101fd61271081565b60405161ffff90911681526020016101a6565b61014961021e366004614cad565b610986565b610149610231366004614cc6565b6109d9565b610149610244366004614cee565b610bae565b61019c610257366004614d52565b61131e565b6101dc61026a366004614c96565b611337565b61014961027d366004614d7f565b61134b565b610149610290366004614c5b565b61142f565b6101496102a3366004614cc6565b611510565b61019c6102b6366004614dbd565b61173d565b6101496102c9366004614cad565b611769565b6102dc6005600160991b0181565b6040516001600160a01b0390911681526020016101a6565b610149610302366004614c96565b611921565b610149610315366004614c96565b611ba7565b61032d610328366004614c96565b611cbb565b6040516101a69190614df1565b61019c610348366004614eb8565b611dae565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206158d683398151915291841561039f5761039c8285611de3565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103d1576103d1614ddd565b60048111156103e2576103e2614ddd565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561046957610469614ddd565b146104bb5760405162461bcd60e51b815260206004820152602a60248201525f805160206158f68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105205760405162461bcd60e51b815260206004820152603360248201525f805160206158f68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104b2565b5f61052a8461207f565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561057757610577614ddd565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61064985611cbb565b905082606001516001600160401b031681608001516001600160401b0316116106c05760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104b2565b5f836060015182608001516106d59190614f31565b90506106e1868261210f565b5f6005600160991b0163ee5b48eb6106fa898786612157565b6040518263ffffffff1660e01b81526004016107169190614f73565b6020604051808303815f875af1158015610732573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107569190614fa5565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206159568339815191526020526040808220815160e0810190925280545f8051602061591683398151915293929190829060ff16600581111561080457610804614ddd565b600581111561081557610815614ddd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561088457610884614ddd565b146108e95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb61090e8584606001515f612157565b6040518263ffffffff1660e01b815260040161092a9190614f73565b6020604051808303815f875af1158015610946573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096a9190614fa5565b50505050565b5f61098064e8d4a5100083614fd0565b92915050565b5f805160206158d68339815191525f8061099f8461237e565b6040808201515f84815260058801602052919091205492945090925061096a916001600160401b03909116906001600160a01b03166126f6565b5f805160206158d68339815191525f6109f18461272c565b90505f80610a028360400151612906565b50915091505f610a1183611cbb565b9050816001600160401b031681606001516001600160401b03161015610a495760405162461bcd60e51b81526004016104b290614fe3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a8e5760405162461bcd60e51b81526004016104b290615025565b60015f87815260068701602052604090205460ff166004811115610ab457610ab4614ddd565b14610b1d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206159168339815191529060ff1615610c4b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb29190614fa5565b836020013514610d145760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104b2565b30610d25606085016040860161506e565b6001600160a01b031614610d975760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104b2565b5f610da56060850185615089565b905011610e045760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104b2565b5f610e126060850185615089565b91505063ffffffff8110610e7e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104b2565b5f843560208601356014610e986060890160408a0161506e565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b828110156111c9575f610f116060880188615089565b83818110610f2157610f216150d5565b9050602002810190610f3391906150e9565b610f3c90615199565b805190915080610f5e5760405162461bcd60e51b81526004016104b290615230565b5f81815260078701602052604090205415610f8b5760405162461bcd60e51b81526004016104b290615271565b816040015151603014610fb05760405162461bcd60e51b81526004016104b2906152b9565b83825f015183602001518460400151604051602001610fd29493929190615306565b60408051601f198184030181528282528a35602084015290820185905294505f9060029060600160408051601f198184030181529082905261101391615355565b602060405180830381855afa15801561102e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110519190614fa5565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff191660018360058111156110dd576110dd614ddd565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101610efb565b505f6111d48561272c565b90505f6111e48260400151612b41565b9050825160b4146112535760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c696420656e636f64656044820152720c840c6dedceccae4e6d2dedc40d8cadccee8d606b1b60648201526084016104b2565b806002846040516112649190615355565b602060405180830381855afa15801561127f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112a29190614fa5565b146113065760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104b2565b5050506008909101805460ff19166001179055505050565b5f6109806001600160401b03831664e8d4a51000615366565b5f61134182611cbb565b6080015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611394575080546001600160401b03808416911610155b156113b25760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556113dd8484612cb3565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206158d68339815191525f61144785611cbb565b5f86815260058401602052604090205460a082015191925061147a91600160b01b9091046001600160401b03169061537d565b6001600160401b03164210156114ee5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104b2565b8315611500576114fe8584611de3565b505b61150985612ccd565b5050505050565b611518612fc3565b5f805160206158d68339815191525f6115308461272c565b90505f806115418360400151612906565b50915091505f61155083611cbb565b9050816001600160401b031681606001516001600160401b031610156115885760405162461bcd60e51b81526004016104b290614fe3565b5f8681526006860160205260409020600301546001600160401b03808416911611156115c65760405162461bcd60e51b81526004016104b290615025565b60035f87815260068701602052604090205460ff1660048111156115ec576115ec614ddd565b146116405760405162461bcd60e51b815260206004820152603160248201525f805160206158f68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526116e5916126f6565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061173960015f8051602061593683398151915255565b5050565b5f611746612fc3565b61175183338461300d565b905061098060015f8051602061593683398151915255565b5f805160206159168339815191525f6117818361272c565b90505f80611792836040015161347d565b91509150806117f45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104b2565b5f8281526005850160205260408120805461180e9061539d565b9050118015611840575060015f83815260068601602052604090205460ff16600581111561183e5761183e614ddd565b145b61185c5760405162461bcd60e51b81526004016104b2906153d5565b5f828152600585016020526040812061187491614bec565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206158d683398151915293929190829060ff16600481111561198257611982614ddd565b600481111561199357611993614ddd565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a1a57611a1a614ddd565b1480611a385750600381516004811115611a3657611a36614ddd565b145b611a8c5760405162461bcd60e51b815260206004820152603260248201525f805160206158f6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104b2565b5f611a9a8260400151611cbb565b905080606001516001600160401b03165f03611b1e5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb611b4b846040015184606001518560800151612157565b6040518263ffffffff1660e01b8152600401611b679190614f73565b6020604051808303815f875af1158015611b83573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115099190614fa5565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020615916833981519152929190611bef9061539d565b9050118015611c21575060015f83815260068301602052604090205460ff166005811115611c1f57611c1f614ddd565b145b611c3d5760405162461bcd60e51b81526004016104b2906153d5565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c76919060040161541c565b6020604051808303815f875af1158015611c92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb69190614fa5565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061595683398151915290528390208351918201909352825491925f8051602061591683398151915292829060ff166005811115611d3b57611d3b614ddd565b6005811115611d4c57611d4c614ddd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611db7612fc3565b611dc38585858561361e565b9050611ddb60015f8051602061593683398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e2e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e5591908101906154b1565b9150915080611eb85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611efb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1f9190614fa5565b825114611f835760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104b2565b60208201516001600160a01b031615611ff95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104b2565b5f80612008846040015161383c565b915091508187146120755760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104b2565b9695505050505050565b5f8181525f805160206159568339815191526020526040812060020180545f8051602061591683398151915291600160401b9091046001600160401b03169060086120c983615583565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f80516020615956833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156121d0576121908160016155a8565b61219b906008615366565b5081515f908390839081106121b2576121b26150d5565b60200101906001600160f81b03191690815f1a90535060010161217c565b505f5b600481101561223b576121e78160036155a8565b6121f2906008615366565b600263ffffffff16901c60f81b8282600261220d91906155bb565b8151811061221d5761221d6150d5565b60200101906001600160f81b03191690815f1a9053506001016121d3565b505f5b602081101561229d5761225281601f6155a8565b61225d906008615366565b86901c60f81b8261226f8360066155bb565b8151811061227f5761227f6150d5565b60200101906001600160f81b03191690815f1a90535060010161223e565b505f5b6008811015612308576122b48160076155a8565b6122bf906008615366565b6001600160401b038616901c60f81b826122da8360266155bb565b815181106122ea576122ea6150d5565b60200101906001600160f81b03191690815f1a9053506001016122a0565b505f5b60088110156123735761231f8160076155a8565b61232a906008615366565b6001600160401b038516901c60f81b8261234583602e6155bb565b81518110612355576123556150d5565b60200101906001600160f81b03191690815f1a90535060010161230b565b5090505b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206159168339815191525f6123cd8561272c565b90505f806123de836040015161347d565b9150915080156124435760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104b2565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561247457612474614ddd565b600581111561248557612485614ddd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156124f6576124f6614ddd565b1480612514575060018251600581111561251257612512614ddd565b145b6125735760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104b2565b60038251600581111561258857612588614ddd565b0361259557506004612599565b5060055b6020808301515f908152600788019091526040812055818160058111156125c2576125c2614ddd565b908160058111156125d5576125d5614ddd565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561260957612609614ddd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156126bd576126bd614ddd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054611739906001600160a01b03168284613a14565b60408051606080820183525f8083526020830181905292820152905f805160206159168339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156127a1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127c891908101906154b1565b91509150806128285760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104b2565b825482511461288b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104b2565b60208201516001600160a01b0316156128fe5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104b2565b509392505050565b5f805f835160361461292a5760405162461bcd60e51b81526004016104b2906155ce565b5f805b6002811015612979576129418160016155a8565b61294c906008615366565b61ffff16868281518110612962576129626150d5565b016020015160f81c901b919091179060010161292d565b5061ffff81161561299c5760405162461bcd60e51b81526004016104b290615617565b5f805b60048110156129f7576129b38160036155a8565b6129be906008615366565b63ffffffff16876129d08360026155bb565b815181106129e0576129e06150d5565b016020015160f81c901b919091179060010161299f565b5063ffffffff8116600414612a1e5760405162461bcd60e51b81526004016104b29061565a565b5f805b6020811015612a7357612a3581601f6155a8565b612a40906008615366565b88612a4c8360066155bb565b81518110612a5c57612a5c6150d5565b016020015160f81c901b9190911790600101612a21565b505f805b6008811015612ad257612a8b8160076155a8565b612a96906008615366565b6001600160401b031689612aab8360266155bb565b81518110612abb57612abb6150d5565b016020015160f81c901b9190911790600101612a77565b505f805b6008811015612b3157612aea8160076155a8565b612af5906008615366565b6001600160401b03168a612b0a83602e6155bb565b81518110612b1a57612b1a6150d5565b016020015160f81c901b9190911790600101612ad6565b5091989097509095509350505050565b5f8151602614612b635760405162461bcd60e51b81526004016104b2906155ce565b5f805b6002811015612bb257612b7a8160016155a8565b612b85906008615366565b61ffff16848281518110612b9b57612b9b6150d5565b016020015160f81c901b9190911790600101612b66565b5061ffff811615612bd55760405162461bcd60e51b81526004016104b290615617565b5f805b6004811015612c3057612bec8160036155a8565b612bf7906008615366565b63ffffffff1685612c098360026155bb565b81518110612c1957612c196150d5565b016020015160f81c901b9190911790600101612bd8565b5063ffffffff811615612c555760405162461bcd60e51b81526004016104b29061565a565b5f805b6020811015612caa57612c6c81601f6155a8565b612c77906008615366565b86612c838360066155bb565b81518110612c9357612c936150d5565b016020015160f81c901b9190911790600101612c58565b50949350505050565b612cbb613a73565b612cc482613abe565b61173981613b33565b5f8181525f805160206159568339815191526020526040808220815160e0810190925280545f8051602061591683398151915293929190829060ff166005811115612d1a57612d1a614ddd565b6005811115612d2b57612d2b614ddd565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612d9d57612d9d614ddd565b14612df95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104b2565b612e068160800151613be7565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115612e4a57612e4a614ddd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612eff84612ef98161207f565b5f612157565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612f2e908590600401614f73565b6020604051808303815f875af1158015612f4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f6e9190614fa5565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615936833981519152805460011901612ff457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061593683398151915255565b5f5f805160206158d6833981519152816130296101d785613d88565b90505f61303587611cbb565b905060028151600581111561304c5761304c614ddd565b146130ab5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104b2565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b031661313e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104b2565b5f82826080015161314f919061537d565b60048501546040840151919250613171916001600160401b03909116906156a1565b6001600160401b0316816001600160401b031611156131f05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104b2565b6131fa888261210f565b5f6132048961207f565b90505f898260405160200161323092919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061325185613be7565b5f6005600160991b0163ee5b48eb61326a8d8688612157565b6040518263ffffffff1660e01b81526004016132869190614f73565b6020604051808303815f875af11580156132a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132c69190614fa5565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561334e5761334e614ddd565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134a05760405162461bcd60e51b81526004016104b2906155ce565b5f805b60028110156134ef576134b78160016155a8565b6134c2906008615366565b61ffff168582815181106134d8576134d86150d5565b016020015160f81c901b91909117906001016134a3565b5061ffff8116156135125760405162461bcd60e51b81526004016104b290615617565b5f805b600481101561356d576135298160036155a8565b613534906008615366565b63ffffffff16866135468360026155bb565b81518110613556576135566150d5565b016020015160f81c901b9190911790600101613515565b5063ffffffff81166003146135945760405162461bcd60e51b81526004016104b29061565a565b5f805b60208110156135e9576135ab81601f6155a8565b6135b6906008615366565b876135c28360066155bb565b815181106135d2576135d26150d5565b016020015160f81c901b9190911790600101613597565b505f866026815181106135fe576135fe6150d5565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158d68339815191529061ffff86161080159061366a575061271061ffff861611155b6136865760405162461bcd60e51b81526004016104b2906156cc565b60028101546001600160401b0390811690851610156136ff5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104b2565b80548310801590613714575080600101548311155b6137725760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104b2565b5f61377c84613d88565b90505f61378882610970565b90505f6137958983613dbe565b905060405180606001604052806137a93390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e1461385f5760405162461bcd60e51b81526004016104b2906155ce565b5f805b60028110156138ae576138768160016155a8565b613881906008615366565b61ffff16858281518110613897576138976150d5565b016020015160f81c901b9190911790600101613862565b5061ffff8116156138d15760405162461bcd60e51b81526004016104b290615617565b5f805b600481101561392c576138e88160036155a8565b6138f3906008615366565b63ffffffff16866139058360026155bb565b81518110613915576139156150d5565b016020015160f81c901b91909117906001016138d4565b5063ffffffff81166005146139535760405162461bcd60e51b81526004016104b29061565a565b5f805b60208110156139a85761396a81601f6155a8565b613975906008615366565b876139818360066155bb565b81518110613991576139916150d5565b016020015160f81c901b9190911790600101613956565b505f805b6008811015613a07576139c08160076155a8565b6139cb906008615366565b6001600160401b0316886139e08360266155bb565b815181106139f0576139f06150d5565b016020015160f81c901b91909117906001016139ac565b5090969095509350505050565b6040516001600160a01b03838116602483015260448201839052611cb691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614232565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613abc57604051631afcd79f60e31b815260040160405180910390fd5b565b613ac6613a73565b613acf81614293565b613ad76142ac565b613b3060608201356080830135613af460c0850160a08601614d52565b613b0460e0860160c08701615717565b61ffff16613b19610100870160e08801615730565b613b2b6101208801610100890161506e565b6142bc565b50565b613b3b613a73565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613bc75760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104b2565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206159168339815191529060ff165f03613c25575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613c6d90836155a8565b10613c89576001600160401b0384166040830152808252613ca8565b8382604001818151613c9b919061537d565b6001600160401b03169052505b5f826020015183604001516064613cbf91906156a1565b613cc99190615750565b600285015490915060ff9081169082161115613d445760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104b2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610980827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690614500565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613e495760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104b2565b5f8051602061591683398151915242613e686040860160208701614d52565b6001600160401b0316118015613ea15750613e896040850160208601614d52565b6001600160401b0316613e9f426202a3006155bb565b115b613f035760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104b2565b8335613f215760405162461bcd60e51b81526004016104b290615230565b83355f90815260078201602052604090205415613f505760405162461bcd60e51b81526004016104b290615271565b613f5d6040850185615775565b9050603014613f7e5760405162461bcd60e51b81526004016104b2906152b9565b613f8783613be7565b5f806140216040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613fcc9190614d52565b6001600160401b03168152602001613fe760408a018a615775565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614662565b5f8281526005860160205260409020919350915061403f82826157fb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061406c908590600401614f73565b6020604051808303815f875af1158015614088573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140ac9190614fa5565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff1916600183600581111561412457614124614ddd565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614204918e01908e01614d52565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6142466001600160a01b03841683614a11565b905080515f1415801561426a57508080602001905181019061426891906158ba565b155b15611cb657604051635274afe760e01b81526001600160a01b03841660048201526024016104b2565b61429b613a73565b6142a3614a1e565b613b3081614a26565b6142b4613a73565b613abc614a9c565b6142c4613a73565b5f805160206158d6833981519152836143305760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104b2565b6127108411156143525760405162461bcd60e51b81526004016104b2906156cc565b858711156143ba5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104b2565b5f8360ff16116144275760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104b2565b600a60ff841611156144995760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104b2565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614546573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061456a9190614fa5565b90506145816001600160a01b038516333086614aa4565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156145c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145e99190614fa5565b905081811161464f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104b2565b61465982826155a8565b95945050505050565b5f60608260800151516030146146cc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104b2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614743576147038160016155a8565b61470e906008615366565b5081515f90839083908110614725576147256150d5565b60200101906001600160f81b03191690815f1a9053506001016146ef565b505f5b60048110156147ab5761475a8160036155a8565b614765906008615366565b600160ff919091161c60f81b8261477d8360026155bb565b8151811061478d5761478d6150d5565b60200101906001600160f81b03191690815f1a905350600101614746565b505f5b602081101561480857845181602081106147ca576147ca6150d5565b1a60f81b826147da8360066155bb565b815181106147ea576147ea6150d5565b60200101906001600160f81b03191690815f1a9053506001016147ae565b505f5b6020811015614868578460200151816020811061482a5761482a6150d5565b1a60f81b8261483a8360266155bb565b8151811061484a5761484a6150d5565b60200101906001600160f81b03191690815f1a90535060010161480b565b505f5b60088110156148dc5761487f8160076155a8565b61488a906008615366565b60ff1685604001516001600160401b0316901c60f81b828260466148ae91906155bb565b815181106148be576148be6150d5565b60200101906001600160f81b03191690815f1a90535060010161486b565b505f5b603081101561494757846080015181815181106148fe576148fe6150d5565b01602001516001600160f81b0319168261491983604e6155bb565b81518110614929576149296150d5565b60200101906001600160f81b03191690815f1a9053506001016148df565b505f5b60088110156149b95761495e8160076155a8565b614969906008615366565b60608601516001600160401b0390811691161c60f81b8261498b83607e6155bb565b8151811061499b5761499b6150d5565b60200101906001600160f81b03191690815f1a90535060010161494a565b506002816040516149ca9190615355565b602060405180830381855afa1580156149e5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a089190614fa5565b94909350915050565b606061237783835f614add565b613abc613a73565b614a2e613a73565b80355f8051602061591683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155614a786060830160408401615730565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612ffa613a73565b6040516001600160a01b03848116602483015283811660448301526064820183905261096a9186918216906323b872dd90608401613a41565b606081471015614b025760405163cd78605960e01b81523060048201526024016104b2565b5f80856001600160a01b03168486604051614b1d9190615355565b5f6040518083038185875af1925050503d805f8114614b57576040519150601f19603f3d011682016040523d82523d5f602084013e614b5c565b606091505b5091509150612075868383606082614b7c57614b7782614bc3565b612377565b8151158015614b9357506001600160a01b0384163b155b15614bbc57604051639996b31560e01b81526001600160a01b03851660048201526024016104b2565b5080612377565b805115614bd35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614bf89061539d565b5f825580601f10614c07575050565b601f0160209004905f5260205f2090810190613b3091905b80821115614c32575f8155600101614c1f565b5090565b8015158114613b30575f80fd5b803563ffffffff81168114614c56575f80fd5b919050565b5f805f60608486031215614c6d575f80fd5b833592506020840135614c7f81614c36565b9150614c8d60408501614c43565b90509250925092565b5f60208284031215614ca6575f80fd5b5035919050565b5f60208284031215614cbd575f80fd5b61237782614c43565b5f8060408385031215614cd7575f80fd5b614ce083614c43565b946020939093013593505050565b5f8060408385031215614cff575f80fd5b82356001600160401b03811115614d14575f80fd5b830160808186031215614d25575f80fd5b9150614d3360208401614c43565b90509250929050565b80356001600160401b0381168114614c56575f80fd5b5f60208284031215614d62575f80fd5b61237782614d3c565b6001600160a01b0381168114613b30575f80fd5b5f80828403610140811215614d92575f80fd5b61012080821215614da1575f80fd5b8493508301359050614db281614d6b565b809150509250929050565b5f8060408385031215614dce575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614e1457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e4f60608401826001600160401b03169052565b506080830151614e6a60808401826001600160401b03169052565b5060a0830151614e8560a08401826001600160401b03169052565b5060c0830151614ea060c08401826001600160401b03169052565b5092915050565b803561ffff81168114614c56575f80fd5b5f805f8060808587031215614ecb575f80fd5b84356001600160401b03811115614ee0575f80fd5b850160608188031215614ef1575f80fd5b9350614eff60208601614ea7565b9250614f0d60408601614d3c565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614ea057614ea0614f1d565b5f5b83811015614f6b578181015183820152602001614f53565b50505f910152565b602081525f8251806020840152614f91816040850160208701614f51565b601f01601f19169190910160400192915050565b5f60208284031215614fb5575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614fde57614fde614fbc565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f6020828403121561507e575f80fd5b813561237781614d6b565b5f808335601e1984360301811261509e575f80fd5b8301803591506001600160401b038211156150b7575f80fd5b6020019150600581901b36038213156150ce575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150fd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561513d5761513d615107565b60405290565b604051601f8201601f191681016001600160401b038111828210171561516b5761516b615107565b604052919050565b5f6001600160401b0382111561518b5761518b615107565b50601f01601f191660200190565b5f606082360312156151a9575f80fd5b6151b161511b565b8235815260206151c2818501614d3c565b8183015260408401356001600160401b038111156151de575f80fd5b840136601f8201126151ee575f80fd5b80356152016151fc82615173565b615143565b8181523684838501011115615214575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615317818460208a01614f51565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615347816028840160208801614f51565b016028019695505050505050565b5f82516150fd818460208701614f51565b808202811582820484141761098057610980614f1d565b6001600160401b03818116838216019080821115614ea057614ea0614f1d565b600181811c908216806153b157607f821691505b6020821081036153cf57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461542e8161539d565b806020870152604060018084165f811461544f576001811461546b57615498565b60ff19851660408a0152604084151560051b8a01019550615498565b895f5260205f205f5b8581101561548f5781548b8201860152908301908801615474565b8a016040019650505b509398975050505050505050565b8051614c5681614c36565b5f80604083850312156154c2575f80fd5b82516001600160401b03808211156154d8575f80fd5b90840190606082870312156154eb575f80fd5b6154f361511b565b8251815260208084015161550681614d6b565b8282015260408401518381111561551b575f80fd5b80850194505087601f85011261552f575f80fd5b8351925061553f6151fc84615173565b8381528882858701011115615552575f80fd5b61556184838301848801614f51565b806040840152508195506155768188016154a6565b9450505050509250929050565b5f6001600160401b0380831681810361559e5761559e614f1d565b6001019392505050565b8181038181111561098057610980614f1d565b8082018082111561098057610980614f1d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146156c4576156c4614f1d565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f60208284031215615727575f80fd5b61237782614ea7565b5f60208284031215615740575f80fd5b813560ff81168114612377575f80fd5b5f6001600160401b038084168061576957615769614fbc565b92169190910492915050565b5f808335601e1984360301811261578a575f80fd5b8301803591506001600160401b038211156157a3575f80fd5b6020019150368190038213156150ce575f80fd5b601f821115611cb657805f5260205f20601f840160051c810160208510156157dc5750805b601f840160051c820191505b81811015611509575f81556001016157e8565b81516001600160401b0381111561581457615814615107565b61582881615822845461539d565b846157b7565b602080601f83116001811461585b575f84156158445750858301515b5f19600386901b1c1916600185901b1785556158b2565b5f85815260208120601f198616915b828110156158895788860151825594840194600190910190840161586a565b50858210156158a657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156158ca575f80fd5b815161237781614c3656fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615a8f380380615a8f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159428061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c806366435abf116100b4578063a3a65e4811610079578063a3a65e48146102bb578063b771b3bc146102ce578063ba3a4b97146102f4578063bee0a03f14610307578063d5f20ff61461031a578063eb0acb891461033a575f80fd5b806366435abf1461025c5780636f5f1c941461026f57806376f786211461028257806398f3e2b4146102955780639e1bc4ef146102a8575f80fd5b806335455ded116100fa57806335455ded146101f4578063467ef06f146102105780635297fae61461022357806361e2f490146102365780636206585614610249575f80fd5b80630118acc4146101365780630322ed981461014b5780630cdd09851461015e578063151d30d1146101af5780632e2194d8146101c9575b5f80fd5b610149610144366004614c1b565b61034d565b005b610149610159366004614c56565b6107b7565b61019c61016c366004614c56565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101b7600a81565b60405160ff90911681526020016101a6565b6101dc6101d7366004614c56565b610970565b6040516001600160401b0390911681526020016101a6565b6101fd61271081565b60405161ffff90911681526020016101a6565b61014961021e366004614c6d565b610986565b610149610231366004614c86565b6109d9565b610149610244366004614cae565b610bae565b61019c610257366004614d12565b6112de565b6101dc61026a366004614c56565b6112f7565b61014961027d366004614d3f565b61130b565b610149610290366004614c1b565b6113ef565b6101496102a3366004614c86565b6114d0565b61019c6102b6366004614d7d565b6116fd565b6101496102c9366004614c6d565b611729565b6102dc6005600160991b0181565b6040516001600160a01b0390911681526020016101a6565b610149610302366004614c56565b6118e1565b610149610315366004614c56565b611b67565b61032d610328366004614c56565b611c7b565b6040516101a69190614db1565b61019c610348366004614e78565b611d6e565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061589683398151915291841561039f5761039c8285611da3565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103d1576103d1614d9d565b60048111156103e2576103e2614d9d565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561046957610469614d9d565b146104bb5760405162461bcd60e51b815260206004820152602a60248201525f805160206158b68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105205760405162461bcd60e51b815260206004820152603360248201525f805160206158b68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104b2565b5f61052a8461203f565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561057757610577614d9d565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61064985611c7b565b905082606001516001600160401b031681608001516001600160401b0316116106c05760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104b2565b5f836060015182608001516106d59190614ef1565b90506106e186826120cf565b5f6005600160991b0163ee5b48eb6106fa898786612117565b6040518263ffffffff1660e01b81526004016107169190614f33565b6020604051808303815f875af1158015610732573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107569190614f65565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206159168339815191526020526040808220815160e0810190925280545f805160206158d683398151915293929190829060ff16600581111561080457610804614d9d565b600581111561081557610815614d9d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561088457610884614d9d565b146108e95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb61090e8584606001515f612117565b6040518263ffffffff1660e01b815260040161092a9190614f33565b6020604051808303815f875af1158015610946573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096a9190614f65565b50505050565b5f61098064e8d4a5100083614f90565b92915050565b5f805160206158968339815191525f8061099f8461233e565b6040808201515f84815260058801602052919091205492945090925061096a916001600160401b03909116906001600160a01b03166126b6565b5f805160206158968339815191525f6109f1846126ec565b90505f80610a0283604001516128c6565b50915091505f610a1183611c7b565b9050816001600160401b031681606001516001600160401b03161015610a495760405162461bcd60e51b81526004016104b290614fa3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a8e5760405162461bcd60e51b81526004016104b290614fe5565b60015f87815260068701602052604090205460ff166004811115610ab457610ab4614d9d565b14610b1d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206158d68339815191529060ff1615610c4b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb29190614f65565b836020013514610d145760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104b2565b30610d25606085016040860161502e565b6001600160a01b031614610d975760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104b2565b5f610da56060850185615049565b905011610e045760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104b2565b5f610e126060850185615049565b9150506001600160401b038110610e815760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104b2565b5f843560208601356014610e9b6060890160408a0161502e565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b82816001600160401b031610156111f6575f610f1d6060880188615049565b836001600160401b0316818110610f3657610f36615095565b9050602002810190610f4891906150a9565b610f5190615159565b805190915080610f735760405162461bcd60e51b81526004016104b2906151f0565b5f81815260078701602052604090205415610fa05760405162461bcd60e51b81526004016104b290615231565b816040015151603014610fc55760405162461bcd60e51b81526004016104b290615279565b83825f015183602001518460400151604051602001610fe794939291906152c6565b60408051808303601f190181528282528a35602084015260c086901b6001600160c01b031916838301528151602881850301815260489093019182905295505f916002916110359190615315565b602060405180830381855afa158015611050573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110739190614f65565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff191660018360058111156110ff576110ff614d9d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080806111ee90615326565b915050610efe565b505f611201856126ec565b90505f6112118260400151612b01565b9050806002846040516112249190615315565b602060405180830381855afa15801561123f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112629190614f65565b146112c65760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104b2565b5050506008909101805460ff19166001179055505050565b5f6109806001600160401b03831664e8d4a5100061534b565b5f61130182611c7b565b6080015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611354575080546001600160401b03808416911610155b156113725760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561139d8484612c73565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206158968339815191525f61140785611c7b565b5f86815260058401602052604090205460a082015191925061143a91600160b01b9091046001600160401b031690615362565b6001600160401b03164210156114ae5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104b2565b83156114c0576114be8584611da3565b505b6114c985612c8d565b5050505050565b6114d8612f83565b5f805160206158968339815191525f6114f0846126ec565b90505f8061150183604001516128c6565b50915091505f61151083611c7b565b9050816001600160401b031681606001516001600160401b031610156115485760405162461bcd60e51b81526004016104b290614fa3565b5f8681526006860160205260409020600301546001600160401b03808416911611156115865760405162461bcd60e51b81526004016104b290614fe5565b60035f87815260068701602052604090205460ff1660048111156115ac576115ac614d9d565b146116005760405162461bcd60e51b815260206004820152603160248201525f805160206158b68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526116a5916126b6565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506116f960015f805160206158f683398151915255565b5050565b5f611706612f83565b611711833384612fcd565b905061098060015f805160206158f683398151915255565b5f805160206158d68339815191525f611741836126ec565b90505f80611752836040015161343d565b91509150806117b45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104b2565b5f828152600585016020526040812080546117ce90615382565b9050118015611800575060015f83815260068601602052604090205460ff1660058111156117fe576117fe614d9d565b145b61181c5760405162461bcd60e51b81526004016104b2906153ba565b5f828152600585016020526040812061183491614bac565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061589683398151915293929190829060ff16600481111561194257611942614d9d565b600481111561195357611953614d9d565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119da576119da614d9d565b14806119f857506003815160048111156119f6576119f6614d9d565b145b611a4c5760405162461bcd60e51b815260206004820152603260248201525f805160206158b6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104b2565b5f611a5a8260400151611c7b565b905080606001516001600160401b03165f03611ade5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb611b0b846040015184606001518560800151612117565b6040518263ffffffff1660e01b8152600401611b279190614f33565b6020604051808303815f875af1158015611b43573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c99190614f65565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206158d6833981519152929190611baf90615382565b9050118015611be1575060015f83815260068301602052604090205460ff166005811115611bdf57611bdf614d9d565b145b611bfd5760405162461bcd60e51b81526004016104b2906153ba565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c369190600401615401565b6020604051808303815f875af1158015611c52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c769190614f65565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061591683398151915290528390208351918201909352825491925f805160206158d683398151915292829060ff166005811115611cfb57611cfb614d9d565b6005811115611d0c57611d0c614d9d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611d77612f83565b611d83858585856135de565b9050611d9b60015f805160206158f683398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611dee573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e159190810190615496565b9150915080611e785760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ebb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611edf9190614f65565b825114611f435760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104b2565b60208201516001600160a01b031615611fb95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104b2565b5f80611fc884604001516137fc565b915091508187146120355760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104b2565b9695505050505050565b5f8181525f805160206159168339815191526020526040812060020180545f805160206158d683398151915291600160401b9091046001600160401b031690600861208983615326565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f80516020615916833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561219057612150816001615568565b61215b90600861534b565b5081515f9083908390811061217257612172615095565b60200101906001600160f81b03191690815f1a90535060010161213c565b505f5b60048110156121fb576121a7816003615568565b6121b290600861534b565b600263ffffffff16901c60f81b828260026121cd919061557b565b815181106121dd576121dd615095565b60200101906001600160f81b03191690815f1a905350600101612193565b505f5b602081101561225d5761221281601f615568565b61221d90600861534b565b86901c60f81b8261222f83600661557b565b8151811061223f5761223f615095565b60200101906001600160f81b03191690815f1a9053506001016121fe565b505f5b60088110156122c857612274816007615568565b61227f90600861534b565b6001600160401b038616901c60f81b8261229a83602661557b565b815181106122aa576122aa615095565b60200101906001600160f81b03191690815f1a905350600101612260565b505f5b6008811015612333576122df816007615568565b6122ea90600861534b565b6001600160401b038516901c60f81b8261230583602e61557b565b8151811061231557612315615095565b60200101906001600160f81b03191690815f1a9053506001016122cb565b5090505b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158d68339815191525f61238d856126ec565b90505f8061239e836040015161343d565b9150915080156124035760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104b2565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561243457612434614d9d565b600581111561244557612445614d9d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156124b6576124b6614d9d565b14806124d457506001825160058111156124d2576124d2614d9d565b145b6125335760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104b2565b60038251600581111561254857612548614d9d565b0361255557506004612559565b5060055b6020808301515f9081526007880190915260408120558181600581111561258257612582614d9d565b9081600581111561259557612595614d9d565b9052505f84815260068701602052604090208251815484929190829060ff191660018360058111156125c9576125c9614d9d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561267d5761267d614d9d565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546116f9906001600160a01b031682846139d4565b60408051606080820183525f8083526020830181905292820152905f805160206158d68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612761573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127889190810190615496565b91509150806127e85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104b2565b825482511461284b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104b2565b60208201516001600160a01b0316156128be5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104b2565b509392505050565b5f805f83516036146128ea5760405162461bcd60e51b81526004016104b29061558e565b5f805b600281101561293957612901816001615568565b61290c90600861534b565b61ffff1686828151811061292257612922615095565b016020015160f81c901b91909117906001016128ed565b5061ffff81161561295c5760405162461bcd60e51b81526004016104b2906155d7565b5f805b60048110156129b757612973816003615568565b61297e90600861534b565b63ffffffff168761299083600261557b565b815181106129a0576129a0615095565b016020015160f81c901b919091179060010161295f565b5063ffffffff81166004146129de5760405162461bcd60e51b81526004016104b29061561a565b5f805b6020811015612a33576129f581601f615568565b612a0090600861534b565b88612a0c83600661557b565b81518110612a1c57612a1c615095565b016020015160f81c901b91909117906001016129e1565b505f805b6008811015612a9257612a4b816007615568565b612a5690600861534b565b6001600160401b031689612a6b83602661557b565b81518110612a7b57612a7b615095565b016020015160f81c901b9190911790600101612a37565b505f805b6008811015612af157612aaa816007615568565b612ab590600861534b565b6001600160401b03168a612aca83602e61557b565b81518110612ada57612ada615095565b016020015160f81c901b9190911790600101612a96565b5091989097509095509350505050565b5f8151602614612b235760405162461bcd60e51b81526004016104b29061558e565b5f805b6002811015612b7257612b3a816001615568565b612b4590600861534b565b61ffff16848281518110612b5b57612b5b615095565b016020015160f81c901b9190911790600101612b26565b5061ffff811615612b955760405162461bcd60e51b81526004016104b2906155d7565b5f805b6004811015612bf057612bac816003615568565b612bb790600861534b565b63ffffffff1685612bc983600261557b565b81518110612bd957612bd9615095565b016020015160f81c901b9190911790600101612b98565b5063ffffffff811615612c155760405162461bcd60e51b81526004016104b29061561a565b5f805b6020811015612c6a57612c2c81601f615568565b612c3790600861534b565b86612c4383600661557b565b81518110612c5357612c53615095565b016020015160f81c901b9190911790600101612c18565b50949350505050565b612c7b613a33565b612c8482613a7e565b6116f981613af3565b5f8181525f805160206159168339815191526020526040808220815160e0810190925280545f805160206158d683398151915293929190829060ff166005811115612cda57612cda614d9d565b6005811115612ceb57612ceb614d9d565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612d5d57612d5d614d9d565b14612db95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104b2565b612dc68160800151613ba7565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115612e0a57612e0a614d9d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612ebf84612eb98161203f565b5f612117565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612eee908590600401614f33565b6020604051808303815f875af1158015612f0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2e9190614f65565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f805160206158f6833981519152805460011901612fb457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206158f683398151915255565b5f5f8051602061589683398151915281612fe96101d785613d48565b90505f612ff587611c7b565b905060028151600581111561300c5761300c614d9d565b1461306b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104b2565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166130fe5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104b2565b5f82826080015161310f9190615362565b60048501546040840151919250613131916001600160401b0390911690615661565b6001600160401b0316816001600160401b031611156131b05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104b2565b6131ba88826120cf565b5f6131c48961203f565b90505f89826040516020016131f092919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061321185613ba7565b5f6005600160991b0163ee5b48eb61322a8d8688612117565b6040518263ffffffff1660e01b81526004016132469190614f33565b6020604051808303815f875af1158015613262573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132869190614f65565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561330e5761330e614d9d565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134605760405162461bcd60e51b81526004016104b29061558e565b5f805b60028110156134af57613477816001615568565b61348290600861534b565b61ffff1685828151811061349857613498615095565b016020015160f81c901b9190911790600101613463565b5061ffff8116156134d25760405162461bcd60e51b81526004016104b2906155d7565b5f805b600481101561352d576134e9816003615568565b6134f490600861534b565b63ffffffff168661350683600261557b565b8151811061351657613516615095565b016020015160f81c901b91909117906001016134d5565b5063ffffffff81166003146135545760405162461bcd60e51b81526004016104b29061561a565b5f805b60208110156135a95761356b81601f615568565b61357690600861534b565b8761358283600661557b565b8151811061359257613592615095565b016020015160f81c901b9190911790600101613557565b505f866026815181106135be576135be615095565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158968339815191529061ffff86161080159061362a575061271061ffff861611155b6136465760405162461bcd60e51b81526004016104b29061568c565b60028101546001600160401b0390811690851610156136bf5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104b2565b805483108015906136d4575080600101548311155b6137325760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104b2565b5f61373c84613d48565b90505f61374882610970565b90505f6137558983613d7e565b905060405180606001604052806137693390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e1461381f5760405162461bcd60e51b81526004016104b29061558e565b5f805b600281101561386e57613836816001615568565b61384190600861534b565b61ffff1685828151811061385757613857615095565b016020015160f81c901b9190911790600101613822565b5061ffff8116156138915760405162461bcd60e51b81526004016104b2906155d7565b5f805b60048110156138ec576138a8816003615568565b6138b390600861534b565b63ffffffff16866138c583600261557b565b815181106138d5576138d5615095565b016020015160f81c901b9190911790600101613894565b5063ffffffff81166005146139135760405162461bcd60e51b81526004016104b29061561a565b5f805b60208110156139685761392a81601f615568565b61393590600861534b565b8761394183600661557b565b8151811061395157613951615095565b016020015160f81c901b9190911790600101613916565b505f805b60088110156139c757613980816007615568565b61398b90600861534b565b6001600160401b0316886139a083602661557b565b815181106139b0576139b0615095565b016020015160f81c901b919091179060010161396c565b5090969095509350505050565b6040516001600160a01b03838116602483015260448201839052611c7691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506141f2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a7c57604051631afcd79f60e31b815260040160405180910390fd5b565b613a86613a33565b613a8f81614253565b613a9761426c565b613af060608201356080830135613ab460c0850160a08601614d12565b613ac460e0860160c087016156d7565b61ffff16613ad9610100870160e088016156f0565b613aeb6101208801610100890161502e565b61427c565b50565b613afb613a33565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613b875760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104b2565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206158d68339815191529060ff165f03613be5575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613c2d9083615568565b10613c49576001600160401b0384166040830152808252613c68565b8382604001818151613c5b9190615362565b6001600160401b03169052505b5f826020015183604001516064613c7f9190615661565b613c899190615710565b600285015490915060ff9081169082161115613d045760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104b2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610980827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906144c0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613e095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104b2565b5f805160206158d683398151915242613e286040860160208701614d12565b6001600160401b0316118015613e615750613e496040850160208601614d12565b6001600160401b0316613e5f426202a30061557b565b115b613ec35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104b2565b8335613ee15760405162461bcd60e51b81526004016104b2906151f0565b83355f90815260078201602052604090205415613f105760405162461bcd60e51b81526004016104b290615231565b613f1d6040850185615735565b9050603014613f3e5760405162461bcd60e51b81526004016104b290615279565b613f4783613ba7565b5f80613fe16040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f8c9190614d12565b6001600160401b03168152602001613fa760408a018a615735565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614622565b5f82815260058601602052604090209193509150613fff82826157bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061402c908590600401614f33565b6020604051808303815f875af1158015614048573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061406c9190614f65565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff191660018360058111156140e4576140e4614d9d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916141c4918e01908e01614d12565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6142066001600160a01b038416836149d1565b905080515f1415801561422a575080806020019051810190614228919061587a565b155b15611c7657604051635274afe760e01b81526001600160a01b03841660048201526024016104b2565b61425b613a33565b6142636149de565b613af0816149e6565b614274613a33565b613a7c614a5c565b614284613a33565b5f80516020615896833981519152836142f05760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104b2565b6127108411156143125760405162461bcd60e51b81526004016104b29061568c565b8587111561437a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104b2565b5f8360ff16116143e75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104b2565b600a60ff841611156144595760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104b2565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614506573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061452a9190614f65565b90506145416001600160a01b038516333086614a64565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614585573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a99190614f65565b905081811161460f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104b2565b6146198282615568565b95945050505050565b5f606082608001515160301461468c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104b2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614703576146c3816001615568565b6146ce90600861534b565b5081515f908390839081106146e5576146e5615095565b60200101906001600160f81b03191690815f1a9053506001016146af565b505f5b600481101561476b5761471a816003615568565b61472590600861534b565b600160ff919091161c60f81b8261473d83600261557b565b8151811061474d5761474d615095565b60200101906001600160f81b03191690815f1a905350600101614706565b505f5b60208110156147c8578451816020811061478a5761478a615095565b1a60f81b8261479a83600661557b565b815181106147aa576147aa615095565b60200101906001600160f81b03191690815f1a90535060010161476e565b505f5b602081101561482857846020015181602081106147ea576147ea615095565b1a60f81b826147fa83602661557b565b8151811061480a5761480a615095565b60200101906001600160f81b03191690815f1a9053506001016147cb565b505f5b600881101561489c5761483f816007615568565b61484a90600861534b565b60ff1685604001516001600160401b0316901c60f81b8282604661486e919061557b565b8151811061487e5761487e615095565b60200101906001600160f81b03191690815f1a90535060010161482b565b505f5b603081101561490757846080015181815181106148be576148be615095565b01602001516001600160f81b031916826148d983604e61557b565b815181106148e9576148e9615095565b60200101906001600160f81b03191690815f1a90535060010161489f565b505f5b60088110156149795761491e816007615568565b61492990600861534b565b60608601516001600160401b0390811691161c60f81b8261494b83607e61557b565b8151811061495b5761495b615095565b60200101906001600160f81b03191690815f1a90535060010161490a565b5060028160405161498a9190615315565b602060405180830381855afa1580156149a5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906149c89190614f65565b94909350915050565b606061233783835f614a9d565b613a7c613a33565b6149ee613a33565b80355f805160206158d683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155614a3860608301604084016156f0565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612fba613a33565b6040516001600160a01b03848116602483015283811660448301526064820183905261096a9186918216906323b872dd90608401613a01565b606081471015614ac25760405163cd78605960e01b81523060048201526024016104b2565b5f80856001600160a01b03168486604051614add9190615315565b5f6040518083038185875af1925050503d805f8114614b17576040519150601f19603f3d011682016040523d82523d5f602084013e614b1c565b606091505b5091509150612035868383606082614b3c57614b3782614b83565b612337565b8151158015614b5357506001600160a01b0384163b155b15614b7c57604051639996b31560e01b81526001600160a01b03851660048201526024016104b2565b5080612337565b805115614b935780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614bb890615382565b5f825580601f10614bc7575050565b601f0160209004905f5260205f2090810190613af091905b80821115614bf2575f8155600101614bdf565b5090565b8015158114613af0575f80fd5b803563ffffffff81168114614c16575f80fd5b919050565b5f805f60608486031215614c2d575f80fd5b833592506020840135614c3f81614bf6565b9150614c4d60408501614c03565b90509250925092565b5f60208284031215614c66575f80fd5b5035919050565b5f60208284031215614c7d575f80fd5b61233782614c03565b5f8060408385031215614c97575f80fd5b614ca083614c03565b946020939093013593505050565b5f8060408385031215614cbf575f80fd5b82356001600160401b03811115614cd4575f80fd5b830160808186031215614ce5575f80fd5b9150614cf360208401614c03565b90509250929050565b80356001600160401b0381168114614c16575f80fd5b5f60208284031215614d22575f80fd5b61233782614cfc565b6001600160a01b0381168114613af0575f80fd5b5f80828403610140811215614d52575f80fd5b61012080821215614d61575f80fd5b8493508301359050614d7281614d2b565b809150509250929050565b5f8060408385031215614d8e575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614dd457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e0f60608401826001600160401b03169052565b506080830151614e2a60808401826001600160401b03169052565b5060a0830151614e4560a08401826001600160401b03169052565b5060c0830151614e6060c08401826001600160401b03169052565b5092915050565b803561ffff81168114614c16575f80fd5b5f805f8060808587031215614e8b575f80fd5b84356001600160401b03811115614ea0575f80fd5b850160608188031215614eb1575f80fd5b9350614ebf60208601614e67565b9250614ecd60408601614cfc565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e6057614e60614edd565b5f5b83811015614f2b578181015183820152602001614f13565b50505f910152565b602081525f8251806020840152614f51816040850160208701614f11565b601f01601f19169190910160400192915050565b5f60208284031215614f75575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614f9e57614f9e614f7c565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f6020828403121561503e575f80fd5b813561233781614d2b565b5f808335601e1984360301811261505e575f80fd5b8301803591506001600160401b03821115615077575f80fd5b6020019150600581901b360382131561508e575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150bd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150fd576150fd6150c7565b60405290565b604051601f8201601f191681016001600160401b038111828210171561512b5761512b6150c7565b604052919050565b5f6001600160401b0382111561514b5761514b6150c7565b50601f01601f191660200190565b5f60608236031215615169575f80fd5b6151716150db565b823581526020615182818501614cfc565b8183015260408401356001600160401b0381111561519e575f80fd5b840136601f8201126151ae575f80fd5b80356151c16151bc82615133565b615103565b81815236848385010111156151d4575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516152d7818460208a01614f11565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615307816028840160208801614f11565b016028019695505050505050565b5f82516150bd818460208701614f11565b5f6001600160401b0380831681810361534157615341614edd565b6001019392505050565b808202811582820484141761098057610980614edd565b6001600160401b03818116838216019080821115614e6057614e60614edd565b600181811c9082168061539657607f821691505b6020821081036153b457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461541381615382565b806020870152604060018084165f811461543457600181146154505761547d565b60ff19851660408a0152604084151560051b8a0101955061547d565b895f5260205f205f5b858110156154745781548b8201860152908301908801615459565b8a016040019650505b509398975050505050505050565b8051614c1681614bf6565b5f80604083850312156154a7575f80fd5b82516001600160401b03808211156154bd575f80fd5b90840190606082870312156154d0575f80fd5b6154d86150db565b825181526020808401516154eb81614d2b565b82820152604084015183811115615500575f80fd5b80850194505087601f850112615514575f80fd5b835192506155246151bc84615133565b8381528882858701011115615537575f80fd5b61554684838301848801614f11565b8060408401525081955061555b81880161548b565b9450505050509250929050565b8181038181111561098057610980614edd565b8082018082111561098057610980614edd565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461568457615684614edd565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f602082840312156156e7575f80fd5b61233782614e67565b5f60208284031215615700575f80fd5b813560ff81168114612337575f80fd5b5f6001600160401b038084168061572957615729614f7c565b92169190910492915050565b5f808335601e1984360301811261574a575f80fd5b8301803591506001600160401b03821115615763575f80fd5b60200191503681900382131561508e575f80fd5b601f821115611c7657805f5260205f20601f840160051c8101602085101561579c5750805b601f840160051c820191505b818110156114c9575f81556001016157a8565b81516001600160401b038111156157d4576157d46150c7565b6157e8816157e28454615382565b84615777565b602080601f83116001811461581b575f84156158045750858301515b5f19600386901b1c1916600185901b178555615872565b5f85815260208120601f198616915b828110156158495788860151825594840194600190910190840161582a565b508582101561586657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561588a575f80fd5b815161233781614bf656fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 24692cd00..f9d548206 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161571838038061571883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6155cb8061014d5f395ff3fe608060405260043610610126575f3560e01c806362065856116100a8578063b771b3bc1161006d578063b771b3bc14610357578063ba3a4b9714610389578063bee0a03f146103a8578063c123c6db146103c7578063c599e24f146103e6578063d5f20ff6146103f9575f80fd5b806362065856146102bc57806366435abf146102db57806376f78621146102fa57806398f3e2b414610319578063a3a65e4814610338575f80fd5b806335455ded116100ee57806335455ded1461022457806340034a931461024c578063467ef06f1461025f5780635297fae61461027e57806361e2f4901461029d575f80fd5b80630118acc41461012a5780630322ed981461014b5780630cdd09851461016a578063151d30d1146101c75780632e2194d8146101ed575b5f80fd5b348015610135575f80fd5b5061014961014436600461491d565b610425565b005b348015610156575f80fd5b50610149610165366004614958565b61088f565b348015610175575f80fd5b506101b4610184366004614958565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101d2575f80fd5b506101db600a81565b60405160ff90911681526020016101be565b3480156101f8575f80fd5b5061020c610207366004614958565b610a48565b6040516001600160401b0390911681526020016101be565b34801561022f575f80fd5b5061023961271081565b60405161ffff90911681526020016101be565b6101b461025a366004614996565b610a5e565b34801561026a575f80fd5b506101496102793660046149ea565b610a92565b348015610289575f80fd5b50610149610298366004614a03565b610ae5565b3480156102a8575f80fd5b506101496102b7366004614a2b565b610cba565b3480156102c7575f80fd5b506101b46102d6366004614a79565b61142a565b3480156102e6575f80fd5b5061020c6102f5366004614958565b611443565b348015610305575f80fd5b5061014961031436600461491d565b611457565b348015610324575f80fd5b50610149610333366004614a03565b611538565b348015610343575f80fd5b506101496103523660046149ea565b611765565b348015610362575f80fd5b506103716005600160991b0181565b6040516001600160a01b0390911681526020016101be565b348015610394575f80fd5b506101496103a3366004614958565b61191d565b3480156103b3575f80fd5b506101496103c2366004614958565b611ba3565b3480156103d2575f80fd5b506101496103e1366004614a92565b611cb7565b6101b46103f4366004614958565b611d99565b348015610404575f80fd5b50610418610413366004614958565b611dca565b6040516101be9190614abd565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061551f833981519152918415610477576104748285611ebd565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104a9576104a9614aa9565b60048111156104ba576104ba614aa9565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561054157610541614aa9565b146105935760405162461bcd60e51b815260206004820152602a60248201525f8051602061553f8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105f85760405162461bcd60e51b815260206004820152603360248201525f8051602061553f8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161058a565b5f61060284612159565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561064f5761064f614aa9565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61072185611dca565b905082606001516001600160401b031681608001516001600160401b0316116107985760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161058a565b5f836060015182608001516107ad9190614b87565b90506107b986826121e9565b5f6005600160991b0163ee5b48eb6107d2898786612231565b6040518263ffffffff1660e01b81526004016107ee9190614bc9565b6020604051808303815f875af115801561080a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082e9190614bfb565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061559f8339815191526020526040808220815160e0810190925280545f8051602061555f83398151915293929190829060ff1660058111156108dc576108dc614aa9565b60058111156108ed576108ed614aa9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c614aa9565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f612231565b6040518263ffffffff1660e01b8152600401610a029190614bc9565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a429190614bfb565b50505050565b5f610a5864e8d4a5100083614c26565b92915050565b5f610a67612456565b610a738484843461248d565b9050610a8b60015f8051602061557f83398151915255565b9392505050565b5f8051602061551f8339815191525f80610aab846126b3565b6040808201515f848152600588016020529190912054929450909250610a42916001600160401b03909116906001600160a01b0316612a2b565b5f8051602061551f8339815191525f610afd84612a3e565b90505f80610b0e8360400151612c18565b50915091505f610b1d83611dca565b9050816001600160401b031681606001516001600160401b03161015610b555760405162461bcd60e51b815260040161058a90614c39565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b9a5760405162461bcd60e51b815260040161058a90614c7b565b60015f87815260068701602052604090205460ff166004811115610bc057610bc0614aa9565b14610c295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f8051602061555f8339815191529060ff1615610d575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbe9190614bfb565b836020013514610e205760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161058a565b30610e316060850160408601614cd8565b6001600160a01b031614610ea35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161058a565b5f610eb16060850185614cf3565b905011610f105760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161058a565b5f610f1e6060850185614cf3565b91505063ffffffff8110610f8a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b606482015260840161058a565b5f843560208601356014610fa46060890160408a01614cd8565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b828110156112d5575f61101d6060880188614cf3565b8381811061102d5761102d614d3f565b905060200281019061103f9190614d53565b61104890614e03565b80519091508061106a5760405162461bcd60e51b815260040161058a90614e9a565b5f818152600787016020526040902054156110975760405162461bcd60e51b815260040161058a90614edb565b8160400151516030146110bc5760405162461bcd60e51b815260040161058a90614f23565b83825f0151836020015184604001516040516020016110de9493929190614f70565b60408051601f198184030181528282528a35602084015290820185905294505f9060029060600160408051601f198184030181529082905261111f91614fbf565b602060405180830381855afa15801561113a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115d9190614bfb565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff191660018360058111156111e9576111e9614aa9565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050600101611007565b505f6112e085612a3e565b90505f6112f08260400151612e53565b9050825160b41461135f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c696420656e636f64656044820152720c840c6dedceccae4e6d2dedc40d8cadccee8d606b1b606482015260840161058a565b806002846040516113709190614fbf565b602060405180830381855afa15801561138b573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113ae9190614bfb565b146114125760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161058a565b5050506008909101805460ff19166001179055505050565b5f610a586001600160401b03831664e8d4a51000614fd0565b5f61144d82611dca565b6080015192915050565b5f8051602061551f8339815191525f61146f85611dca565b5f86815260058401602052604090205460a08201519192506114a291600160b01b9091046001600160401b031690614fe7565b6001600160401b03164210156115165760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161058a565b8315611528576115268584611ebd565b505b61153185612fbc565b5050505050565b611540612456565b5f8051602061551f8339815191525f61155884612a3e565b90505f806115698360400151612c18565b50915091505f61157883611dca565b9050816001600160401b031681606001516001600160401b031610156115b05760405162461bcd60e51b815260040161058a90614c39565b5f8681526006860160205260409020600301546001600160401b03808416911611156115ee5760405162461bcd60e51b815260040161058a90614c7b565b60035f87815260068701602052604090205460ff16600481111561161457611614614aa9565b146116685760405162461bcd60e51b815260206004820152603160248201525f8051602061553f8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261170d91612a2b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061176160015f8051602061557f83398151915255565b5050565b5f8051602061555f8339815191525f61177d83612a3e565b90505f8061178e83604001516132b2565b91509150806117f05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161058a565b5f8281526005850160205260408120805461180a90615007565b905011801561183c575060015f83815260068601602052604090205460ff16600581111561183a5761183a614aa9565b145b6118585760405162461bcd60e51b815260040161058a90615039565b5f8281526005850160205260408120611870916148b3565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061551f83398151915293929190829060ff16600481111561197e5761197e614aa9565b600481111561198f5761198f614aa9565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a1657611a16614aa9565b1480611a345750600381516004811115611a3257611a32614aa9565b145b611a885760405162461bcd60e51b815260206004820152603260248201525f8051602061553f833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161058a565b5f611a968260400151611dca565b905080606001516001600160401b03165f03611b1a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb611b47846040015184606001518560800151612231565b6040518263ffffffff1660e01b8152600401611b639190614bc9565b6020604051808303815f875af1158015611b7f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115319190614bfb565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061555f833981519152929190611beb90615007565b9050118015611c1d575060015f83815260068301602052604090205460ff166005811115611c1b57611c1b614aa9565b145b611c395760405162461bcd60e51b815260040161058a90615039565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c729190600401615080565b6020604051808303815f875af1158015611c8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cb29190614bfb565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611d00575080546001600160401b03808416911610155b15611d1e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611d4883613453565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611da2612456565b611dad823334613467565b9050611dc560015f8051602061557f83398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061559f83398151915290528390208351918201909352825491925f8051602061555f83398151915292829060ff166005811115611e4a57611e4a614aa9565b6005811115611e5b57611e5b614aa9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f08573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f2f9190810190615115565b9150915080611f925760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff99190614bfb565b82511461205d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161058a565b60208201516001600160a01b0316156120d35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161058a565b5f806120e284604001516138d4565b9150915081871461214f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161058a565b9695505050505050565b5f8181525f8051602061559f8339815191526020526040812060020180545f8051602061555f83398151915291600160401b9091046001600160401b03169060086121a3836151e7565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f8051602061559f833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156122aa5761226a81600161520c565b612275906008614fd0565b5081515f9083908390811061228c5761228c614d3f565b60200101906001600160f81b03191690815f1a905350600101612256565b505f5b6004811015612315576122c181600361520c565b6122cc906008614fd0565b600263ffffffff16901c60f81b828260026122e7919061521f565b815181106122f7576122f7614d3f565b60200101906001600160f81b03191690815f1a9053506001016122ad565b505f5b60208110156123775761232c81601f61520c565b612337906008614fd0565b86901c60f81b8261234983600661521f565b8151811061235957612359614d3f565b60200101906001600160f81b03191690815f1a905350600101612318565b505f5b60088110156123e25761238e81600761520c565b612399906008614fd0565b6001600160401b038616901c60f81b826123b483602661521f565b815181106123c4576123c4614d3f565b60200101906001600160f81b03191690815f1a90535060010161237a565b505f5b600881101561244d576123f981600761520c565b612404906008614fd0565b6001600160401b038516901c60f81b8261241f83602e61521f565b8151811061242f5761242f614d3f565b60200101906001600160f81b03191690815f1a9053506001016123e5565b50949350505050565b5f8051602061557f83398151915280546001190161248757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061551f8339815191529061ffff8616108015906124d9575061271061ffff861611155b6124f55760405162461bcd60e51b815260040161058a90615232565b60028101546001600160401b03908116908516101561256e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161058a565b80548310801590612583575080600101548311155b6125e15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161058a565b825f6125ec82610a48565b90505f6125f98983613aac565b9050604051806060016040528061260d3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061557f83398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061555f8339815191525f61270285612a3e565b90505f8061271383604001516132b2565b9150915080156127785760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161058a565b5f828152600685016020526040808220815160e081019092528054829060ff1660058111156127a9576127a9614aa9565b60058111156127ba576127ba614aa9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561282b5761282b614aa9565b1480612849575060018251600581111561284757612847614aa9565b145b6128a85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161058a565b6003825160058111156128bd576128bd614aa9565b036128ca575060046128ce565b5060055b6020808301515f908152600788019091526040812055818160058111156128f7576128f7614aa9565b9081600581111561290a5761290a614aa9565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561293e5761293e614aa9565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156129f2576129f2614aa9565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6117616001600160a01b03821683613f20565b60408051606080820183525f8083526020830181905292820152905f8051602061555f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ab3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ada9190810190615115565b9150915080612b3a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b606482015260840161058a565b8254825114612b9d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161058a565b60208201516001600160a01b031615612c105760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161058a565b509392505050565b5f805f8351603614612c3c5760405162461bcd60e51b815260040161058a9061527d565b5f805b6002811015612c8b57612c5381600161520c565b612c5e906008614fd0565b61ffff16868281518110612c7457612c74614d3f565b016020015160f81c901b9190911790600101612c3f565b5061ffff811615612cae5760405162461bcd60e51b815260040161058a906152c6565b5f805b6004811015612d0957612cc581600361520c565b612cd0906008614fd0565b63ffffffff1687612ce283600261521f565b81518110612cf257612cf2614d3f565b016020015160f81c901b9190911790600101612cb1565b5063ffffffff8116600414612d305760405162461bcd60e51b815260040161058a90615309565b5f805b6020811015612d8557612d4781601f61520c565b612d52906008614fd0565b88612d5e83600661521f565b81518110612d6e57612d6e614d3f565b016020015160f81c901b9190911790600101612d33565b505f805b6008811015612de457612d9d81600761520c565b612da8906008614fd0565b6001600160401b031689612dbd83602661521f565b81518110612dcd57612dcd614d3f565b016020015160f81c901b9190911790600101612d89565b505f805b6008811015612e4357612dfc81600761520c565b612e07906008614fd0565b6001600160401b03168a612e1c83602e61521f565b81518110612e2c57612e2c614d3f565b016020015160f81c901b9190911790600101612de8565b5091989097509095509350505050565b5f8151602614612e755760405162461bcd60e51b815260040161058a9061527d565b5f805b6002811015612ec457612e8c81600161520c565b612e97906008614fd0565b61ffff16848281518110612ead57612ead614d3f565b016020015160f81c901b9190911790600101612e78565b5061ffff811615612ee75760405162461bcd60e51b815260040161058a906152c6565b5f805b6004811015612f4257612efe81600361520c565b612f09906008614fd0565b63ffffffff1685612f1b83600261521f565b81518110612f2b57612f2b614d3f565b016020015160f81c901b9190911790600101612eea565b5063ffffffff811615612f675760405162461bcd60e51b815260040161058a90615309565b5f805b602081101561244d57612f7e81601f61520c565b612f89906008614fd0565b86612f9583600661521f565b81518110612fa557612fa5614d3f565b016020015160f81c901b9190911790600101612f6a565b5f8181525f8051602061559f8339815191526020526040808220815160e0810190925280545f8051602061555f83398151915293929190829060ff16600581111561300957613009614aa9565b600581111561301a5761301a614aa9565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561308c5761308c614aa9565b146130e85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161058a565b6130f58160800151613fb3565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561313957613139614aa9565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131ee846131e881612159565b5f612231565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061321d908590600401614bc9565b6020604051808303815f875af1158015613239573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061325d9190614bfb565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146132d55760405162461bcd60e51b815260040161058a9061527d565b5f805b6002811015613324576132ec81600161520c565b6132f7906008614fd0565b61ffff1685828151811061330d5761330d614d3f565b016020015160f81c901b91909117906001016132d8565b5061ffff8116156133475760405162461bcd60e51b815260040161058a906152c6565b5f805b60048110156133a25761335e81600361520c565b613369906008614fd0565b63ffffffff168661337b83600261521f565b8151811061338b5761338b614d3f565b016020015160f81c901b919091179060010161334a565b5063ffffffff81166003146133c95760405162461bcd60e51b815260040161058a90615309565b5f805b602081101561341e576133e081601f61520c565b6133eb906008614fd0565b876133f783600661521f565b8151811061340757613407614d3f565b016020015160f81c901b91909117906001016133cc565b505f8660268151811061343357613433614d3f565b016020015191976001600160f81b03199092161515965090945050505050565b61345b614154565b6134648161419f565b50565b5f5f8051602061551f8339815191528161348084610a48565b90505f61348c87611dca565b90506002815160058111156134a3576134a3614aa9565b146135025760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161058a565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166135955760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161058a565b5f8282608001516135a69190614fe7565b600485015460408401519192506135c8916001600160401b0390911690615350565b6001600160401b0316816001600160401b031611156136475760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161058a565b61365188826121e9565b5f61365b89612159565b90505f898260405160200161368792919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090506136a885613fb3565b5f6005600160991b0163ee5b48eb6136c18d8688612231565b6040518263ffffffff1660e01b81526004016136dd9190614bc9565b6020604051808303815f875af11580156136f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061371d9190614bfb565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156137a5576137a5614aa9565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e146138f75760405162461bcd60e51b815260040161058a9061527d565b5f805b60028110156139465761390e81600161520c565b613919906008614fd0565b61ffff1685828151811061392f5761392f614d3f565b016020015160f81c901b91909117906001016138fa565b5061ffff8116156139695760405162461bcd60e51b815260040161058a906152c6565b5f805b60048110156139c45761398081600361520c565b61398b906008614fd0565b63ffffffff168661399d83600261521f565b815181106139ad576139ad614d3f565b016020015160f81c901b919091179060010161396c565b5063ffffffff81166005146139eb5760405162461bcd60e51b815260040161058a90615309565b5f805b6020811015613a4057613a0281601f61520c565b613a0d906008614fd0565b87613a1983600661521f565b81518110613a2957613a29614d3f565b016020015160f81c901b91909117906001016139ee565b505f805b6008811015613a9f57613a5881600761520c565b613a63906008614fd0565b6001600160401b031688613a7883602661521f565b81518110613a8857613a88614d3f565b016020015160f81c901b9190911790600101613a44565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613b375760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161058a565b5f8051602061555f83398151915242613b566040860160208701614a79565b6001600160401b0316118015613b8f5750613b776040850160208601614a79565b6001600160401b0316613b8d426202a30061521f565b115b613bf15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161058a565b8335613c0f5760405162461bcd60e51b815260040161058a90614e9a565b83355f90815260078201602052604090205415613c3e5760405162461bcd60e51b815260040161058a90614edb565b613c4b604085018561537b565b9050603014613c6c5760405162461bcd60e51b815260040161058a90614f23565b613c7583613fb3565b5f80613d0f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613cba9190614a79565b6001600160401b03168152602001613cd560408a018a61537b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614211565b5f82815260058601602052604090209193509150613d2d8282615401565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613d5a908590600401614bc9565b6020604051808303815f875af1158015613d76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d9a9190614bfb565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115613e1257613e12614aa9565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ef2918e01908e01614a79565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613f435760405163cd78605960e01b815230600482015260240161058a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f8c576040519150601f19603f3d011682016040523d82523d5f602084013e613f91565b606091505b5050905080611cb257604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061555f8339815191529060ff165f03613ff1575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090614039908361520c565b10614055576001600160401b0384166040830152808252614074565b83826040018181516140679190614fe7565b6001600160401b03169052505b5f82602001518360400151606461408b9190615350565b61409591906154c0565b600285015490915060ff90811690821611156141105760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161058a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661419d57604051631afcd79f60e31b815260040160405180910390fd5b565b6141a7614154565b6141b0816145c0565b6141b86145d9565b613464606082013560808301356141d560c0850160a08601614a79565b6141e560e0860160c087016154e5565b61ffff166141fa610100870160e088016154fe565b61420c61012088016101008901614cd8565b6145e9565b5f606082608001515160301461427b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161058a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142f2576142b281600161520c565b6142bd906008614fd0565b5081515f908390839081106142d4576142d4614d3f565b60200101906001600160f81b03191690815f1a90535060010161429e565b505f5b600481101561435a5761430981600361520c565b614314906008614fd0565b600160ff919091161c60f81b8261432c83600261521f565b8151811061433c5761433c614d3f565b60200101906001600160f81b03191690815f1a9053506001016142f5565b505f5b60208110156143b7578451816020811061437957614379614d3f565b1a60f81b8261438983600661521f565b8151811061439957614399614d3f565b60200101906001600160f81b03191690815f1a90535060010161435d565b505f5b602081101561441757846020015181602081106143d9576143d9614d3f565b1a60f81b826143e983602661521f565b815181106143f9576143f9614d3f565b60200101906001600160f81b03191690815f1a9053506001016143ba565b505f5b600881101561448b5761442e81600761520c565b614439906008614fd0565b60ff1685604001516001600160401b0316901c60f81b8282604661445d919061521f565b8151811061446d5761446d614d3f565b60200101906001600160f81b03191690815f1a90535060010161441a565b505f5b60308110156144f657846080015181815181106144ad576144ad614d3f565b01602001516001600160f81b031916826144c883604e61521f565b815181106144d8576144d8614d3f565b60200101906001600160f81b03191690815f1a90535060010161448e565b505f5b60088110156145685761450d81600761520c565b614518906008614fd0565b60608601516001600160401b0390811691161c60f81b8261453a83607e61521f565b8151811061454a5761454a614d3f565b60200101906001600160f81b03191690815f1a9053506001016144f9565b506002816040516145799190614fbf565b602060405180830381855afa158015614594573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145b79190614bfb565b94909350915050565b6145c8614154565b6145d061482d565b61346481614835565b6145e1614154565b61419d6148ab565b6145f1614154565b5f8051602061551f8339815191528361465d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161058a565b61271084111561467f5760405162461bcd60e51b815260040161058a90615232565b858711156146e75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161058a565b5f8360ff16116147545760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161058a565b600a60ff841611156147c65760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161058a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b61419d614154565b61483d614154565b80355f8051602061555f83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561488760608301604084016154fe565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b6126a0614154565b5080546148bf90615007565b5f825580601f106148ce575050565b601f0160209004905f5260205f209081019061346491905b808211156148f9575f81556001016148e6565b5090565b8015158114613464575f80fd5b803563ffffffff81168114611dc5575f80fd5b5f805f6060848603121561492f575f80fd5b833592506020840135614941816148fd565b915061494f6040850161490a565b90509250925092565b5f60208284031215614968575f80fd5b5035919050565b803561ffff81168114611dc5575f80fd5b80356001600160401b0381168114611dc5575f80fd5b5f805f606084860312156149a8575f80fd5b83356001600160401b038111156149bd575f80fd5b8401606081870312156149ce575f80fd5b92506149dc6020850161496f565b915061494f60408501614980565b5f602082840312156149fa575f80fd5b610a8b8261490a565b5f8060408385031215614a14575f80fd5b614a1d8361490a565b946020939093013593505050565b5f8060408385031215614a3c575f80fd5b82356001600160401b03811115614a51575f80fd5b830160808186031215614a62575f80fd5b9150614a706020840161490a565b90509250929050565b5f60208284031215614a89575f80fd5b610a8b82614980565b5f6101208284031215614aa3575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614ae057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614b1b60608401826001600160401b03169052565b506080830151614b3660808401826001600160401b03169052565b5060a0830151614b5160a08401826001600160401b03169052565b5060c0830151614b6c60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614b6c57614b6c614b73565b5f5b83811015614bc1578181015183820152602001614ba9565b50505f910152565b602081525f8251806020840152614be7816040850160208701614ba7565b601f01601f19169190910160400192915050565b5f60208284031215614c0b575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614c3457614c34614c12565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114613464575f80fd5b5f60208284031215614ce8575f80fd5b8135610a8b81614cc4565b5f808335601e19843603018112614d08575f80fd5b8301803591506001600160401b03821115614d21575f80fd5b6020019150600581901b3603821315614d38575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614d67575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614da757614da7614d71565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614dd557614dd5614d71565b604052919050565b5f6001600160401b03821115614df557614df5614d71565b50601f01601f191660200190565b5f60608236031215614e13575f80fd5b614e1b614d85565b823581526020614e2c818501614980565b8183015260408401356001600160401b03811115614e48575f80fd5b840136601f820112614e58575f80fd5b8035614e6b614e6682614ddd565b614dad565b8181523684838501011115614e7e575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551614f81818460208a01614ba7565b80830190508581526001600160401b0360c01b8560c01b1660208201528351614fb1816028840160208801614ba7565b016028019695505050505050565b5f8251614d67818460208701614ba7565b8082028115828204841417610a5857610a58614b73565b6001600160401b03818116838216019080821115614b6c57614b6c614b73565b600181811c9082168061501b57607f821691505b602082108103614aa357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461509281615007565b806020870152604060018084165f81146150b357600181146150cf576150fc565b60ff19851660408a0152604084151560051b8a010195506150fc565b895f5260205f205f5b858110156150f35781548b82018601529083019088016150d8565b8a016040019650505b509398975050505050505050565b8051611dc5816148fd565b5f8060408385031215615126575f80fd5b82516001600160401b038082111561513c575f80fd5b908401906060828703121561514f575f80fd5b615157614d85565b8251815260208084015161516a81614cc4565b8282015260408401518381111561517f575f80fd5b80850194505087601f850112615193575f80fd5b835192506151a3614e6684614ddd565b83815288828587010111156151b6575f80fd5b6151c584838301848801614ba7565b806040840152508195506151da81880161510a565b9450505050509250929050565b5f6001600160401b0380831681810361520257615202614b73565b6001019392505050565b81810381811115610a5857610a58614b73565b80820180821115610a5857610a58614b73565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461537357615373614b73565b505092915050565b5f808335601e19843603018112615390575f80fd5b8301803591506001600160401b038211156153a9575f80fd5b602001915036819003821315614d38575f80fd5b601f821115611cb257805f5260205f20601f840160051c810160208510156153e25750805b601f840160051c820191505b81811015611531575f81556001016153ee565b81516001600160401b0381111561541a5761541a614d71565b61542e816154288454615007565b846153bd565b602080601f831160018114615461575f841561544a5750858301515b5f19600386901b1c1916600185901b1785556154b8565b5f85815260208120601f198616915b8281101561548f57888601518255948401946001909101908401615470565b50858210156154ac57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b03808416806154d9576154d9614c12565b92169190910492915050565b5f602082840312156154f5575f80fd5b610a8b8261496f565b5f6020828403121561550e575f80fd5b813560ff81168114610a8b575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516156d83803806156d883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61558b8061014d5f395ff3fe608060405260043610610126575f3560e01c806362065856116100a8578063b771b3bc1161006d578063b771b3bc14610357578063ba3a4b9714610389578063bee0a03f146103a8578063c123c6db146103c7578063c599e24f146103e6578063d5f20ff6146103f9575f80fd5b806362065856146102bc57806366435abf146102db57806376f78621146102fa57806398f3e2b414610319578063a3a65e4814610338575f80fd5b806335455ded116100ee57806335455ded1461022457806340034a931461024c578063467ef06f1461025f5780635297fae61461027e57806361e2f4901461029d575f80fd5b80630118acc41461012a5780630322ed981461014b5780630cdd09851461016a578063151d30d1146101c75780632e2194d8146101ed575b5f80fd5b348015610135575f80fd5b506101496101443660046148dd565b610425565b005b348015610156575f80fd5b50610149610165366004614918565b61088f565b348015610175575f80fd5b506101b4610184366004614918565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101d2575f80fd5b506101db600a81565b60405160ff90911681526020016101be565b3480156101f8575f80fd5b5061020c610207366004614918565b610a48565b6040516001600160401b0390911681526020016101be565b34801561022f575f80fd5b5061023961271081565b60405161ffff90911681526020016101be565b6101b461025a366004614956565b610a5e565b34801561026a575f80fd5b506101496102793660046149aa565b610a92565b348015610289575f80fd5b506101496102983660046149c3565b610ae5565b3480156102a8575f80fd5b506101496102b73660046149eb565b610cba565b3480156102c7575f80fd5b506101b46102d6366004614a39565b6113ea565b3480156102e6575f80fd5b5061020c6102f5366004614918565b611403565b348015610305575f80fd5b506101496103143660046148dd565b611417565b348015610324575f80fd5b506101496103333660046149c3565b6114f8565b348015610343575f80fd5b506101496103523660046149aa565b611725565b348015610362575f80fd5b506103716005600160991b0181565b6040516001600160a01b0390911681526020016101be565b348015610394575f80fd5b506101496103a3366004614918565b6118dd565b3480156103b3575f80fd5b506101496103c2366004614918565b611b63565b3480156103d2575f80fd5b506101496103e1366004614a52565b611c77565b6101b46103f4366004614918565b611d59565b348015610404575f80fd5b50610418610413366004614918565b611d8a565b6040516101be9190614a7d565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206154df833981519152918415610477576104748285611e7d565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104a9576104a9614a69565b60048111156104ba576104ba614a69565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561054157610541614a69565b146105935760405162461bcd60e51b815260206004820152602a60248201525f805160206154ff8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105f85760405162461bcd60e51b815260206004820152603360248201525f805160206154ff8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161058a565b5f61060284612119565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561064f5761064f614a69565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61072185611d8a565b905082606001516001600160401b031681608001516001600160401b0316116107985760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161058a565b5f836060015182608001516107ad9190614b47565b90506107b986826121a9565b5f6005600160991b0163ee5b48eb6107d28987866121f1565b6040518263ffffffff1660e01b81526004016107ee9190614b89565b6020604051808303815f875af115801561080a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082e9190614bbb565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061555f8339815191526020526040808220815160e0810190925280545f8051602061551f83398151915293929190829060ff1660058111156108dc576108dc614a69565b60058111156108ed576108ed614a69565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c614a69565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6121f1565b6040518263ffffffff1660e01b8152600401610a029190614b89565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a429190614bbb565b50505050565b5f610a5864e8d4a5100083614be6565b92915050565b5f610a67612416565b610a738484843461244d565b9050610a8b60015f8051602061553f83398151915255565b9392505050565b5f805160206154df8339815191525f80610aab84612673565b6040808201515f848152600588016020529190912054929450909250610a42916001600160401b03909116906001600160a01b03166129eb565b5f805160206154df8339815191525f610afd846129fe565b90505f80610b0e8360400151612bd8565b50915091505f610b1d83611d8a565b9050816001600160401b031681606001516001600160401b03161015610b555760405162461bcd60e51b815260040161058a90614bf9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b9a5760405162461bcd60e51b815260040161058a90614c3b565b60015f87815260068701602052604090205460ff166004811115610bc057610bc0614a69565b14610c295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f8051602061551f8339815191529060ff1615610d575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbe9190614bbb565b836020013514610e205760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161058a565b30610e316060850160408601614c98565b6001600160a01b031614610ea35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161058a565b5f610eb16060850185614cb3565b905011610f105760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161058a565b5f610f1e6060850185614cb3565b9150506001600160401b038110610f8d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b606482015260840161058a565b5f843560208601356014610fa76060890160408a01614c98565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b82816001600160401b03161015611302575f6110296060880188614cb3565b836001600160401b031681811061104257611042614cff565b90506020028101906110549190614d13565b61105d90614dc3565b80519091508061107f5760405162461bcd60e51b815260040161058a90614e5a565b5f818152600787016020526040902054156110ac5760405162461bcd60e51b815260040161058a90614e9b565b8160400151516030146110d15760405162461bcd60e51b815260040161058a90614ee3565b83825f0151836020015184604001516040516020016110f39493929190614f30565b60408051808303601f190181528282528a35602084015260c086901b6001600160c01b031916838301528151602881850301815260489093019182905295505f916002916111419190614f7f565b602060405180830381855afa15801561115c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117f9190614bbb565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff1916600183600581111561120b5761120b614a69565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080806112fa90614f90565b91505061100a565b505f61130d856129fe565b90505f61131d8260400151612e13565b9050806002846040516113309190614f7f565b602060405180830381855afa15801561134b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136e9190614bbb565b146113d25760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161058a565b5050506008909101805460ff19166001179055505050565b5f610a586001600160401b03831664e8d4a51000614fb5565b5f61140d82611d8a565b6080015192915050565b5f805160206154df8339815191525f61142f85611d8a565b5f86815260058401602052604090205460a082015191925061146291600160b01b9091046001600160401b031690614fcc565b6001600160401b03164210156114d65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161058a565b83156114e8576114e68584611e7d565b505b6114f185612f7c565b5050505050565b611500612416565b5f805160206154df8339815191525f611518846129fe565b90505f806115298360400151612bd8565b50915091505f61153883611d8a565b9050816001600160401b031681606001516001600160401b031610156115705760405162461bcd60e51b815260040161058a90614bf9565b5f8681526006860160205260409020600301546001600160401b03808416911611156115ae5760405162461bcd60e51b815260040161058a90614c3b565b60035f87815260068701602052604090205460ff1660048111156115d4576115d4614a69565b146116285760405162461bcd60e51b815260206004820152603160248201525f805160206154ff8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526116cd916129eb565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061172160015f8051602061553f83398151915255565b5050565b5f8051602061551f8339815191525f61173d836129fe565b90505f8061174e8360400151613272565b91509150806117b05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161058a565b5f828152600585016020526040812080546117ca90614fec565b90501180156117fc575060015f83815260068601602052604090205460ff1660058111156117fa576117fa614a69565b145b6118185760405162461bcd60e51b815260040161058a9061501e565b5f828152600585016020526040812061183091614873565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206154df83398151915293929190829060ff16600481111561193e5761193e614a69565b600481111561194f5761194f614a69565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119d6576119d6614a69565b14806119f457506003815160048111156119f2576119f2614a69565b145b611a485760405162461bcd60e51b815260206004820152603260248201525f805160206154ff833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161058a565b5f611a568260400151611d8a565b905080606001516001600160401b03165f03611ada5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb611b078460400151846060015185608001516121f1565b6040518263ffffffff1660e01b8152600401611b239190614b89565b6020604051808303815f875af1158015611b3f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f19190614bbb565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061551f833981519152929190611bab90614fec565b9050118015611bdd575060015f83815260068301602052604090205460ff166005811115611bdb57611bdb614a69565b145b611bf95760405162461bcd60e51b815260040161058a9061501e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c329190600401615065565b6020604051808303815f875af1158015611c4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c729190614bbb565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611cc0575080546001600160401b03808416911610155b15611cde5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611d0883613413565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611d62612416565b611d6d823334613427565b9050611d8560015f8051602061553f83398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061555f83398151915290528390208351918201909352825491925f8051602061551f83398151915292829060ff166005811115611e0a57611e0a614a69565b6005811115611e1b57611e1b614a69565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ec8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611eef91908101906150fa565b9150915080611f525760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fb99190614bbb565b82511461201d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161058a565b60208201516001600160a01b0316156120935760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161058a565b5f806120a28460400151613894565b9150915081871461210f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161058a565b9695505050505050565b5f8181525f8051602061555f8339815191526020526040812060020180545f8051602061551f83398151915291600160401b9091046001600160401b031690600861216383614f90565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f8051602061555f833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561226a5761222a8160016151cc565b612235906008614fb5565b5081515f9083908390811061224c5761224c614cff565b60200101906001600160f81b03191690815f1a905350600101612216565b505f5b60048110156122d5576122818160036151cc565b61228c906008614fb5565b600263ffffffff16901c60f81b828260026122a791906151df565b815181106122b7576122b7614cff565b60200101906001600160f81b03191690815f1a90535060010161226d565b505f5b6020811015612337576122ec81601f6151cc565b6122f7906008614fb5565b86901c60f81b826123098360066151df565b8151811061231957612319614cff565b60200101906001600160f81b03191690815f1a9053506001016122d8565b505f5b60088110156123a25761234e8160076151cc565b612359906008614fb5565b6001600160401b038616901c60f81b826123748360266151df565b8151811061238457612384614cff565b60200101906001600160f81b03191690815f1a90535060010161233a565b505f5b600881101561240d576123b98160076151cc565b6123c4906008614fb5565b6001600160401b038516901c60f81b826123df83602e6151df565b815181106123ef576123ef614cff565b60200101906001600160f81b03191690815f1a9053506001016123a5565b50949350505050565b5f8051602061553f83398151915280546001190161244757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206154df8339815191529061ffff861610801590612499575061271061ffff861611155b6124b55760405162461bcd60e51b815260040161058a906151f2565b60028101546001600160401b03908116908516101561252e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161058a565b80548310801590612543575080600101548311155b6125a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161058a565b825f6125ac82610a48565b90505f6125b98983613a6c565b905060405180606001604052806125cd3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061553f83398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061551f8339815191525f6126c2856129fe565b90505f806126d38360400151613272565b9150915080156127385760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161058a565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561276957612769614a69565b600581111561277a5761277a614a69565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156127eb576127eb614a69565b1480612809575060018251600581111561280757612807614a69565b145b6128685760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161058a565b60038251600581111561287d5761287d614a69565b0361288a5750600461288e565b5060055b6020808301515f908152600788019091526040812055818160058111156128b7576128b7614a69565b908160058111156128ca576128ca614a69565b9052505f84815260068701602052604090208251815484929190829060ff191660018360058111156128fe576128fe614a69565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156129b2576129b2614a69565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6117216001600160a01b03821683613ee0565b60408051606080820183525f8083526020830181905292820152905f8051602061551f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a73573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a9a91908101906150fa565b9150915080612afa5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b606482015260840161058a565b8254825114612b5d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161058a565b60208201516001600160a01b031615612bd05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161058a565b509392505050565b5f805f8351603614612bfc5760405162461bcd60e51b815260040161058a9061523d565b5f805b6002811015612c4b57612c138160016151cc565b612c1e906008614fb5565b61ffff16868281518110612c3457612c34614cff565b016020015160f81c901b9190911790600101612bff565b5061ffff811615612c6e5760405162461bcd60e51b815260040161058a90615286565b5f805b6004811015612cc957612c858160036151cc565b612c90906008614fb5565b63ffffffff1687612ca28360026151df565b81518110612cb257612cb2614cff565b016020015160f81c901b9190911790600101612c71565b5063ffffffff8116600414612cf05760405162461bcd60e51b815260040161058a906152c9565b5f805b6020811015612d4557612d0781601f6151cc565b612d12906008614fb5565b88612d1e8360066151df565b81518110612d2e57612d2e614cff565b016020015160f81c901b9190911790600101612cf3565b505f805b6008811015612da457612d5d8160076151cc565b612d68906008614fb5565b6001600160401b031689612d7d8360266151df565b81518110612d8d57612d8d614cff565b016020015160f81c901b9190911790600101612d49565b505f805b6008811015612e0357612dbc8160076151cc565b612dc7906008614fb5565b6001600160401b03168a612ddc83602e6151df565b81518110612dec57612dec614cff565b016020015160f81c901b9190911790600101612da8565b5091989097509095509350505050565b5f8151602614612e355760405162461bcd60e51b815260040161058a9061523d565b5f805b6002811015612e8457612e4c8160016151cc565b612e57906008614fb5565b61ffff16848281518110612e6d57612e6d614cff565b016020015160f81c901b9190911790600101612e38565b5061ffff811615612ea75760405162461bcd60e51b815260040161058a90615286565b5f805b6004811015612f0257612ebe8160036151cc565b612ec9906008614fb5565b63ffffffff1685612edb8360026151df565b81518110612eeb57612eeb614cff565b016020015160f81c901b9190911790600101612eaa565b5063ffffffff811615612f275760405162461bcd60e51b815260040161058a906152c9565b5f805b602081101561240d57612f3e81601f6151cc565b612f49906008614fb5565b86612f558360066151df565b81518110612f6557612f65614cff565b016020015160f81c901b9190911790600101612f2a565b5f8181525f8051602061555f8339815191526020526040808220815160e0810190925280545f8051602061551f83398151915293929190829060ff166005811115612fc957612fc9614a69565b6005811115612fda57612fda614a69565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561304c5761304c614a69565b146130a85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161058a565b6130b58160800151613f73565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156130f9576130f9614a69565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131ae846131a881612119565b5f6121f1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906131dd908590600401614b89565b6020604051808303815f875af11580156131f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061321d9190614bbb565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146132955760405162461bcd60e51b815260040161058a9061523d565b5f805b60028110156132e4576132ac8160016151cc565b6132b7906008614fb5565b61ffff168582815181106132cd576132cd614cff565b016020015160f81c901b9190911790600101613298565b5061ffff8116156133075760405162461bcd60e51b815260040161058a90615286565b5f805b60048110156133625761331e8160036151cc565b613329906008614fb5565b63ffffffff168661333b8360026151df565b8151811061334b5761334b614cff565b016020015160f81c901b919091179060010161330a565b5063ffffffff81166003146133895760405162461bcd60e51b815260040161058a906152c9565b5f805b60208110156133de576133a081601f6151cc565b6133ab906008614fb5565b876133b78360066151df565b815181106133c7576133c7614cff565b016020015160f81c901b919091179060010161338c565b505f866026815181106133f3576133f3614cff565b016020015191976001600160f81b03199092161515965090945050505050565b61341b614114565b6134248161415f565b50565b5f5f805160206154df8339815191528161344084610a48565b90505f61344c87611d8a565b905060028151600581111561346357613463614a69565b146134c25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161058a565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166135555760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161058a565b5f8282608001516135669190614fcc565b60048501546040840151919250613588916001600160401b0390911690615310565b6001600160401b0316816001600160401b031611156136075760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161058a565b61361188826121a9565b5f61361b89612119565b90505f898260405160200161364792919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061366885613f73565b5f6005600160991b0163ee5b48eb6136818d86886121f1565b6040518263ffffffff1660e01b815260040161369d9190614b89565b6020604051808303815f875af11580156136b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136dd9190614bbb565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561376557613765614a69565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e146138b75760405162461bcd60e51b815260040161058a9061523d565b5f805b6002811015613906576138ce8160016151cc565b6138d9906008614fb5565b61ffff168582815181106138ef576138ef614cff565b016020015160f81c901b91909117906001016138ba565b5061ffff8116156139295760405162461bcd60e51b815260040161058a90615286565b5f805b6004811015613984576139408160036151cc565b61394b906008614fb5565b63ffffffff168661395d8360026151df565b8151811061396d5761396d614cff565b016020015160f81c901b919091179060010161392c565b5063ffffffff81166005146139ab5760405162461bcd60e51b815260040161058a906152c9565b5f805b6020811015613a00576139c281601f6151cc565b6139cd906008614fb5565b876139d98360066151df565b815181106139e9576139e9614cff565b016020015160f81c901b91909117906001016139ae565b505f805b6008811015613a5f57613a188160076151cc565b613a23906008614fb5565b6001600160401b031688613a388360266151df565b81518110613a4857613a48614cff565b016020015160f81c901b9190911790600101613a04565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613af75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161058a565b5f8051602061551f83398151915242613b166040860160208701614a39565b6001600160401b0316118015613b4f5750613b376040850160208601614a39565b6001600160401b0316613b4d426202a3006151df565b115b613bb15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161058a565b8335613bcf5760405162461bcd60e51b815260040161058a90614e5a565b83355f90815260078201602052604090205415613bfe5760405162461bcd60e51b815260040161058a90614e9b565b613c0b604085018561533b565b9050603014613c2c5760405162461bcd60e51b815260040161058a90614ee3565b613c3583613f73565b5f80613ccf6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613c7a9190614a39565b6001600160401b03168152602001613c9560408a018a61533b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d1565b5f82815260058601602052604090209193509150613ced82826153c1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613d1a908590600401614b89565b6020604051808303815f875af1158015613d36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d5a9190614bbb565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115613dd257613dd2614a69565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613eb2918e01908e01614a39565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613f035760405163cd78605960e01b815230600482015260240161058a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f4c576040519150601f19603f3d011682016040523d82523d5f602084013e613f51565b606091505b5050905080611c7257604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061551f8339815191529060ff165f03613fb1575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613ff990836151cc565b10614015576001600160401b0384166040830152808252614034565b83826040018181516140279190614fcc565b6001600160401b03169052505b5f82602001518360400151606461404b9190615310565b6140559190615480565b600285015490915060ff90811690821611156140d05760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161058a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661415d57604051631afcd79f60e31b815260040160405180910390fd5b565b614167614114565b61417081614580565b614178614599565b6134246060820135608083013561419560c0850160a08601614a39565b6141a560e0860160c087016154a5565b61ffff166141ba610100870160e088016154be565b6141cc61012088016101008901614c98565b6145a9565b5f606082608001515160301461423b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161058a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142b2576142728160016151cc565b61427d906008614fb5565b5081515f9083908390811061429457614294614cff565b60200101906001600160f81b03191690815f1a90535060010161425e565b505f5b600481101561431a576142c98160036151cc565b6142d4906008614fb5565b600160ff919091161c60f81b826142ec8360026151df565b815181106142fc576142fc614cff565b60200101906001600160f81b03191690815f1a9053506001016142b5565b505f5b6020811015614377578451816020811061433957614339614cff565b1a60f81b826143498360066151df565b8151811061435957614359614cff565b60200101906001600160f81b03191690815f1a90535060010161431d565b505f5b60208110156143d7578460200151816020811061439957614399614cff565b1a60f81b826143a98360266151df565b815181106143b9576143b9614cff565b60200101906001600160f81b03191690815f1a90535060010161437a565b505f5b600881101561444b576143ee8160076151cc565b6143f9906008614fb5565b60ff1685604001516001600160401b0316901c60f81b8282604661441d91906151df565b8151811061442d5761442d614cff565b60200101906001600160f81b03191690815f1a9053506001016143da565b505f5b60308110156144b6578460800151818151811061446d5761446d614cff565b01602001516001600160f81b0319168261448883604e6151df565b8151811061449857614498614cff565b60200101906001600160f81b03191690815f1a90535060010161444e565b505f5b6008811015614528576144cd8160076151cc565b6144d8906008614fb5565b60608601516001600160401b0390811691161c60f81b826144fa83607e6151df565b8151811061450a5761450a614cff565b60200101906001600160f81b03191690815f1a9053506001016144b9565b506002816040516145399190614f7f565b602060405180830381855afa158015614554573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145779190614bbb565b94909350915050565b614588614114565b6145906147ed565b613424816147f5565b6145a1614114565b61415d61486b565b6145b1614114565b5f805160206154df8339815191528361461d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161058a565b61271084111561463f5760405162461bcd60e51b815260040161058a906151f2565b858711156146a75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161058a565b5f8360ff16116147145760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161058a565b600a60ff841611156147865760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161058a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b61415d614114565b6147fd614114565b80355f8051602061551f83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561484760608301604084016154be565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612660614114565b50805461487f90614fec565b5f825580601f1061488e575050565b601f0160209004905f5260205f209081019061342491905b808211156148b9575f81556001016148a6565b5090565b8015158114613424575f80fd5b803563ffffffff81168114611d85575f80fd5b5f805f606084860312156148ef575f80fd5b833592506020840135614901816148bd565b915061490f604085016148ca565b90509250925092565b5f60208284031215614928575f80fd5b5035919050565b803561ffff81168114611d85575f80fd5b80356001600160401b0381168114611d85575f80fd5b5f805f60608486031215614968575f80fd5b83356001600160401b0381111561497d575f80fd5b84016060818703121561498e575f80fd5b925061499c6020850161492f565b915061490f60408501614940565b5f602082840312156149ba575f80fd5b610a8b826148ca565b5f80604083850312156149d4575f80fd5b6149dd836148ca565b946020939093013593505050565b5f80604083850312156149fc575f80fd5b82356001600160401b03811115614a11575f80fd5b830160808186031215614a22575f80fd5b9150614a30602084016148ca565b90509250929050565b5f60208284031215614a49575f80fd5b610a8b82614940565b5f6101208284031215614a63575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614aa057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614adb60608401826001600160401b03169052565b506080830151614af660808401826001600160401b03169052565b5060a0830151614b1160a08401826001600160401b03169052565b5060c0830151614b2c60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614b2c57614b2c614b33565b5f5b83811015614b81578181015183820152602001614b69565b50505f910152565b602081525f8251806020840152614ba7816040850160208701614b67565b601f01601f19169190910160400192915050565b5f60208284031215614bcb575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614bf457614bf4614bd2565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114613424575f80fd5b5f60208284031215614ca8575f80fd5b8135610a8b81614c84565b5f808335601e19843603018112614cc8575f80fd5b8301803591506001600160401b03821115614ce1575f80fd5b6020019150600581901b3603821315614cf8575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614d27575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614d6757614d67614d31565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614d9557614d95614d31565b604052919050565b5f6001600160401b03821115614db557614db5614d31565b50601f01601f191660200190565b5f60608236031215614dd3575f80fd5b614ddb614d45565b823581526020614dec818501614940565b8183015260408401356001600160401b03811115614e08575f80fd5b840136601f820112614e18575f80fd5b8035614e2b614e2682614d9d565b614d6d565b8181523684838501011115614e3e575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551614f41818460208a01614b67565b80830190508581526001600160401b0360c01b8560c01b1660208201528351614f71816028840160208801614b67565b016028019695505050505050565b5f8251614d27818460208701614b67565b5f6001600160401b03808316818103614fab57614fab614b33565b6001019392505050565b8082028115828204841417610a5857610a58614b33565b6001600160401b03818116838216019080821115614b2c57614b2c614b33565b600181811c9082168061500057607f821691505b602082108103614a6357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461507781614fec565b806020870152604060018084165f811461509857600181146150b4576150e1565b60ff19851660408a0152604084151560051b8a010195506150e1565b895f5260205f205f5b858110156150d85781548b82018601529083019088016150bd565b8a016040019650505b509398975050505050505050565b8051611d85816148bd565b5f806040838503121561510b575f80fd5b82516001600160401b0380821115615121575f80fd5b9084019060608287031215615134575f80fd5b61513c614d45565b8251815260208084015161514f81614c84565b82820152604084015183811115615164575f80fd5b80850194505087601f850112615178575f80fd5b83519250615188614e2684614d9d565b838152888285870101111561519b575f80fd5b6151aa84838301848801614b67565b806040840152508195506151bf8188016150ef565b9450505050509250929050565b81810381811115610a5857610a58614b33565b80820180821115610a5857610a58614b33565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461533357615333614b33565b505092915050565b5f808335601e19843603018112615350575f80fd5b8301803591506001600160401b03821115615369575f80fd5b602001915036819003821315614cf8575f80fd5b601f821115611c7257805f5260205f20601f840160051c810160208510156153a25750805b601f840160051c820191505b818110156114f1575f81556001016153ae565b81516001600160401b038111156153da576153da614d31565b6153ee816153e88454614fec565b8461537d565b602080601f831160018114615421575f841561540a5750858301515b5f19600386901b1c1916600185901b178555615478565b5f85815260208120601f198616915b8281101561544f57888601518255948401946001909101908401615430565b508582101561546c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b038084168061549957615499614bd2565b92169190910492915050565b5f602082840312156154b5575f80fd5b610a8b8261492f565b5f602082840312156154ce575f80fd5b813560ff81168114610a8b575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 6602bd8c1..74b6332a7 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -72,7 +72,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161376c38038061376c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61361f8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c80638da5cb5b11610093578063bee0a03f11610063578063bee0a03f1461023e578063c151c0b914610251578063d5f20ff614610264578063f2fde38b14610284575f80fd5b80638da5cb5b146101c657806397fb70d41461020a578063a3a65e481461021d578063b771b3bc14610230575f80fd5b806361e2f490116100ce57806361e2f4901461016d57806366435abf14610180578063715018a6146101ab5780638994ab49146101b3575f80fd5b80630322ed98146100f45780630cdd098514610109578063467ef06f1461015a575b5f80fd5b610107610102366004612b23565b610297565b005b610147610117366004612b23565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b610107610168366004612b52565b610455565b61010761017b366004612b6b565b610463565b61019361018e366004612b23565b610bd3565b6040516001600160401b039091168152602001610151565b610107610be7565b6101476101c1366004612be5565b610bfa565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610151565b610107610218366004612b23565b610c16565b61010761022b366004612b52565b610c2a565b6101f26005600160991b0181565b61010761024c366004612b23565b610de2565b61010761025f366004612c3a565b610ef1565b610277610272366004612b23565b610fff565b6040516101519190612c84565b610107610292366004612d3a565b6110f2565b5f8181525f805160206135f38339815191526020526040808220815160e0810190925280545f805160206135d383398151915293929190829060ff1660058111156102e4576102e4612c70565b60058111156102f5576102f5612c70565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561036457610364612c70565b146103ce5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103f38584606001515f61112c565b6040518263ffffffff1660e01b815260040161040f9190612d7e565b6020604051808303815f875af115801561042b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044f9190612db0565b50505050565b61045e81611351565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206135d38339815191529060ff16156105005760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103c5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610543573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105679190612db0565b8360200135146105c95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103c5565b306105da6060850160408601612d3a565b6001600160a01b03161461064c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103c5565b5f61065a6060850185612dc7565b9050116106b95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103c5565b5f6106c76060850185612dc7565b91505063ffffffff81106107335760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103c5565b5f84356020860135601461074d6060890160408a01612d3a565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b82811015610a7e575f6107c66060880188612dc7565b838181106107d6576107d6612e13565b90506020028101906107e89190612e27565b6107f190612ed7565b8051909150806108135760405162461bcd60e51b81526004016103c590612f6e565b5f818152600787016020526040902054156108405760405162461bcd60e51b81526004016103c590612faf565b8160400151516030146108655760405162461bcd60e51b81526004016103c590612ff7565b83825f0151836020015184604001516040516020016108879493929190613044565b60408051601f198184030181528282528a35602084015290820185905294505f9060029060600160408051601f19818403018152908290526108c891613093565b602060405180830381855afa1580156108e3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109069190612db0565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff1916600183600581111561099257610992612c70565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050506001016107b0565b505f610a89856116c9565b90505f610a9982604001516118a3565b9050825160b414610b085760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c696420656e636f64656044820152720c840c6dedceccae4e6d2dedc40d8cadccee8d606b1b60648201526084016103c5565b80600284604051610b199190613093565b602060405180830381855afa158015610b34573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b579190612db0565b14610bbb5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103c5565b5050506008909101805460ff19166001179055505050565b5f610bdd82610fff565b6080015192915050565b610bef611a0c565b610bf85f611a67565b565b5f610c03611a0c565b610c0d8383611ad7565b90505b92915050565b610c1e611a0c565b610c2781611f4b565b50565b5f805160206135d38339815191525f610c42836116c9565b90505f80610c538360400151612241565b9150915080610cb55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103c5565b5f82815260058501602052604081208054610ccf906130a4565b9050118015610d01575060015f83815260068601602052604090205460ff166005811115610cff57610cff612c70565b145b610d1d5760405162461bcd60e51b81526004016103c5906130d6565b5f8281526005850160205260408120610d3591612ad9565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206135d3833981519152929190610e2a906130a4565b9050118015610e5c575060015f83815260068301602052604090205460ff166005811115610e5a57610e5a612c70565b145b610e785760405162461bcd60e51b81526004016103c5906130d6565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610eb1919060040161311d565b6020604051808303815f875af1158015610ecd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045e9190612db0565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610f355750825b90505f826001600160401b03166001148015610f505750303b155b905081158015610f5e575080155b15610f7c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610fa657845460ff60401b1916600160401b1785555b610fb087876123e2565b8315610ff657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206135f383398151915290528390208351918201909352825491925f805160206135d383398151915292829060ff16600581111561107f5761107f612c70565b600581111561109057611090612c70565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6110fa611a0c565b6001600160a01b03811661112357604051631e4fbdf760e01b81525f60048201526024016103c5565b610c2781611a67565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156111a5576111658160016131bb565b6111709060086131ce565b5081515f9083908390811061118757611187612e13565b60200101906001600160f81b03191690815f1a905350600101611151565b505f5b6004811015611210576111bc8160036131bb565b6111c79060086131ce565b600263ffffffff16901c60f81b828260026111e291906131e5565b815181106111f2576111f2612e13565b60200101906001600160f81b03191690815f1a9053506001016111a8565b505f5b60208110156112725761122781601f6131bb565b6112329060086131ce565b86901c60f81b826112448360066131e5565b8151811061125457611254612e13565b60200101906001600160f81b03191690815f1a905350600101611213565b505f5b60088110156112dd576112898160076131bb565b6112949060086131ce565b6001600160401b038616901c60f81b826112af8360266131e5565b815181106112bf576112bf612e13565b60200101906001600160f81b03191690815f1a905350600101611275565b505f5b6008811015611348576112f48160076131bb565b6112ff9060086131ce565b6001600160401b038516901c60f81b8261131a83602e6131e5565b8151811061132a5761132a612e13565b60200101906001600160f81b03191690815f1a9053506001016112e0565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206135d38339815191525f6113a0856116c9565b90505f806113b18360400151612241565b9150915080156114165760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103c5565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561144757611447612c70565b600581111561145857611458612c70565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156114c9576114c9612c70565b14806114e757506001825160058111156114e5576114e5612c70565b145b6115465760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103c5565b60038251600581111561155b5761155b612c70565b036115685750600461156c565b5060055b6020808301515f9081526007880190915260408120558181600581111561159557611595612c70565b908160058111156115a8576115a8612c70565b9052505f84815260068701602052604090208251815484929190829060ff191660018360058111156115dc576115dc612c70565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561169057611690612c70565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830181905292820152905f805160206135d38339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561173e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117659190810190613207565b91509150806117c55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103c5565b82548251146118285760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103c5565b60208201516001600160a01b03161561189b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103c5565b509392505050565b5f81516026146118c55760405162461bcd60e51b81526004016103c5906132d9565b5f805b6002811015611914576118dc8160016131bb565b6118e79060086131ce565b61ffff168482815181106118fd576118fd612e13565b016020015160f81c901b91909117906001016118c8565b5061ffff8116156119375760405162461bcd60e51b81526004016103c590613322565b5f805b60048110156119925761194e8160036131bb565b6119599060086131ce565b63ffffffff168561196b8360026131e5565b8151811061197b5761197b612e13565b016020015160f81c901b919091179060010161193a565b5063ffffffff8116156119b75760405162461bcd60e51b81526004016103c590613365565b5f805b6020811015611348576119ce81601f6131bb565b6119d99060086131ce565b866119e58360066131e5565b815181106119f5576119f5612e13565b016020015160f81c901b91909117906001016119ba565b33611a3e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610bf85760405163118cdaa760e01b81523360048201526024016103c5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16611b625760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103c5565b5f805160206135d383398151915242611b8160408601602087016133ac565b6001600160401b0316118015611bba5750611ba260408501602086016133ac565b6001600160401b0316611bb8426202a3006131e5565b115b611c1c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103c5565b8335611c3a5760405162461bcd60e51b81526004016103c590612f6e565b83355f90815260078201602052604090205415611c695760405162461bcd60e51b81526004016103c590612faf565b611c7660408501856133c5565b9050603014611c975760405162461bcd60e51b81526004016103c590612ff7565b611ca083612400565b5f80611d3a6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611ce591906133ac565b6001600160401b03168152602001611d0060408a018a6133c5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506125a1565b5f82815260058601602052604090209193509150611d588282613452565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d85908590600401612d7e565b6020604051808303815f875af1158015611da1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc59190612db0565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115611e3d57611e3d612c70565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f1d918e01908e016133ac565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206135f38339815191526020526040808220815160e0810190925280545f805160206135d383398151915293929190829060ff166005811115611f9857611f98612c70565b6005811115611fa957611fa9612c70565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561201b5761201b612c70565b146120775760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103c5565b6120848160800151612400565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156120c8576120c8612c70565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61217d8461217781612950565b5f61112c565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906121ac908590600401612d7e565b6020604051808303815f875af11580156121c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121ec9190612db0565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146122645760405162461bcd60e51b81526004016103c5906132d9565b5f805b60028110156122b35761227b8160016131bb565b6122869060086131ce565b61ffff1685828151811061229c5761229c612e13565b016020015160f81c901b9190911790600101612267565b5061ffff8116156122d65760405162461bcd60e51b81526004016103c590613322565b5f805b6004811015612331576122ed8160036131bb565b6122f89060086131ce565b63ffffffff168661230a8360026131e5565b8151811061231a5761231a612e13565b016020015160f81c901b91909117906001016122d9565b5063ffffffff81166003146123585760405162461bcd60e51b81526004016103c590613365565b5f805b60208110156123ad5761236f81601f6131bb565b61237a9060086131ce565b876123868360066131e5565b8151811061239657612396612e13565b016020015160f81c901b919091179060010161235b565b505f866026815181106123c2576123c2612e13565b016020015191976001600160f81b03199092161515965090945050505050565b6123ea6129e0565b6123f382612a29565b6123fc81612a42565b5050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206135d38339815191529060ff165f0361243e575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061248690836131bb565b106124a2576001600160401b03841660408301528082526124c1565b83826040018181516124b49190613511565b6001600160401b03169052505b5f8260200151836040015160646124d89190613531565b6124e2919061355c565b600285015490915060ff908116908216111561255d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103c5565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f606082608001515160301461260b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103c5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612682576126428160016131bb565b61264d9060086131ce565b5081515f9083908390811061266457612664612e13565b60200101906001600160f81b03191690815f1a90535060010161262e565b505f5b60048110156126ea576126998160036131bb565b6126a49060086131ce565b600160ff919091161c60f81b826126bc8360026131e5565b815181106126cc576126cc612e13565b60200101906001600160f81b03191690815f1a905350600101612685565b505f5b6020811015612747578451816020811061270957612709612e13565b1a60f81b826127198360066131e5565b8151811061272957612729612e13565b60200101906001600160f81b03191690815f1a9053506001016126ed565b505f5b60208110156127a7578460200151816020811061276957612769612e13565b1a60f81b826127798360266131e5565b8151811061278957612789612e13565b60200101906001600160f81b03191690815f1a90535060010161274a565b505f5b600881101561281b576127be8160076131bb565b6127c99060086131ce565b60ff1685604001516001600160401b0316901c60f81b828260466127ed91906131e5565b815181106127fd576127fd612e13565b60200101906001600160f81b03191690815f1a9053506001016127aa565b505f5b6030811015612886578460800151818151811061283d5761283d612e13565b01602001516001600160f81b0319168261285883604e6131e5565b8151811061286857612868612e13565b60200101906001600160f81b03191690815f1a90535060010161281e565b505f5b60088110156128f85761289d8160076131bb565b6128a89060086131ce565b60608601516001600160401b0390811691161c60f81b826128ca83607e6131e5565b815181106128da576128da612e13565b60200101906001600160f81b03191690815f1a905350600101612889565b506002816040516129099190613093565b602060405180830381855afa158015612924573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129479190612db0565b94909350915050565b5f8181525f805160206135f38339815191526020526040812060020180545f805160206135d383398151915291600160401b9091046001600160401b031690600861299a8361358d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610bf857604051631afcd79f60e31b815260040160405180910390fd5b612a316129e0565b612a39612a53565b610c2781612a5b565b612a4a6129e0565b610c2781612ad1565b610bf86129e0565b612a636129e0565b80355f805160206135d383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612aad60608301604084016135b2565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b6110fa6129e0565b508054612ae5906130a4565b5f825580601f10612af4575050565b601f0160209004905f5260205f2090810190610c2791905b80821115612b1f575f8155600101612b0c565b5090565b5f60208284031215612b33575f80fd5b5035919050565b803563ffffffff81168114612b4d575f80fd5b919050565b5f60208284031215612b62575f80fd5b610c0d82612b3a565b5f8060408385031215612b7c575f80fd5b82356001600160401b03811115612b91575f80fd5b830160808186031215612ba2575f80fd5b9150612bb060208401612b3a565b90509250929050565b5f60608284031215612bc9575f80fd5b50919050565b80356001600160401b0381168114612b4d575f80fd5b5f8060408385031215612bf6575f80fd5b82356001600160401b03811115612c0b575f80fd5b612c1785828601612bb9565b925050612bb060208401612bcf565b6001600160a01b0381168114610c27575f80fd5b5f8060808385031215612c4b575f80fd5b612c558484612bb9565b91506060830135612c6581612c26565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612ca757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612ce260608401826001600160401b03169052565b506080830151612cfd60808401826001600160401b03169052565b5060a0830151612d1860a08401826001600160401b03169052565b5060c0830151612d3360c08401826001600160401b03169052565b5092915050565b5f60208284031215612d4a575f80fd5b8135612d5581612c26565b9392505050565b5f5b83811015612d76578181015183820152602001612d5e565b50505f910152565b602081525f8251806020840152612d9c816040850160208701612d5c565b601f01601f19169190910160400192915050565b5f60208284031215612dc0575f80fd5b5051919050565b5f808335601e19843603018112612ddc575f80fd5b8301803591506001600160401b03821115612df5575f80fd5b6020019150600581901b3603821315612e0c575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612e3b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612e7b57612e7b612e45565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612ea957612ea9612e45565b604052919050565b5f6001600160401b03821115612ec957612ec9612e45565b50601f01601f191660200190565b5f60608236031215612ee7575f80fd5b612eef612e59565b823581526020612f00818501612bcf565b8183015260408401356001600160401b03811115612f1c575f80fd5b840136601f820112612f2c575f80fd5b8035612f3f612f3a82612eb1565b612e81565b8181523684838501011115612f52575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551613055818460208a01612d5c565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613085816028840160208801612d5c565b016028019695505050505050565b5f8251612e3b818460208701612d5c565b600181811c908216806130b857607f821691505b602082108103612bc957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461312f816130a4565b806020870152604060018084165f8114613150576001811461316c57613199565b60ff19851660408a0152604084151560051b8a01019550613199565b895f5260205f205f5b858110156131905781548b8201860152908301908801613175565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610c1057610c106131a7565b8082028115828204841417610c1057610c106131a7565b80820180821115610c1057610c106131a7565b80518015158114612b4d575f80fd5b5f8060408385031215613218575f80fd5b82516001600160401b038082111561322e575f80fd5b9084019060608287031215613241575f80fd5b613249612e59565b8251815260208084015161325c81612c26565b82820152604084015183811115613271575f80fd5b80850194505087601f850112613285575f80fd5b83519250613295612f3a84612eb1565b83815288828587010111156132a8575f80fd5b6132b784838301848801612d5c565b806040840152508195506132cc8188016131f8565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156133bc575f80fd5b610c0d82612bcf565b5f808335601e198436030181126133da575f80fd5b8301803591506001600160401b038211156133f3575f80fd5b602001915036819003821315612e0c575f80fd5b601f82111561045e57805f5260205f20601f840160051c8101602085101561342c5750805b601f840160051c820191505b8181101561344b575f8155600101613438565b5050505050565b81516001600160401b0381111561346b5761346b612e45565b61347f8161347984546130a4565b84613407565b602080601f8311600181146134b2575f841561349b5750858301515b5f19600386901b1c1916600185901b178555613509565b5f85815260208120601f198616915b828110156134e0578886015182559484019460019091019084016134c1565b50858210156134fd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115612d3357612d336131a7565b6001600160401b03818116838216028082169190828114613554576135546131a7565b505092915050565b5f6001600160401b038084168061358157634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f6001600160401b038083168181036135a8576135a86131a7565b6001019392505050565b5f602082840312156135c2575f80fd5b813560ff81168114612d55575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161372c38038061372c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6135df8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c80638da5cb5b11610093578063bee0a03f11610063578063bee0a03f1461023e578063c151c0b914610251578063d5f20ff614610264578063f2fde38b14610284575f80fd5b80638da5cb5b146101c657806397fb70d41461020a578063a3a65e481461021d578063b771b3bc14610230575f80fd5b806361e2f490116100ce57806361e2f4901461016d57806366435abf14610180578063715018a6146101ab5780638994ab49146101b3575f80fd5b80630322ed98146100f45780630cdd098514610109578063467ef06f1461015a575b5f80fd5b610107610102366004612ae3565b610297565b005b610147610117366004612ae3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b610107610168366004612b12565b610455565b61010761017b366004612b2b565b610463565b61019361018e366004612ae3565b610b93565b6040516001600160401b039091168152602001610151565b610107610ba7565b6101476101c1366004612ba5565b610bba565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610151565b610107610218366004612ae3565b610bd6565b61010761022b366004612b12565b610bea565b6101f26005600160991b0181565b61010761024c366004612ae3565b610da2565b61010761025f366004612bfa565b610eb1565b610277610272366004612ae3565b610fbf565b6040516101519190612c44565b610107610292366004612cfa565b6110b2565b5f8181525f805160206135b38339815191526020526040808220815160e0810190925280545f8051602061359383398151915293929190829060ff1660058111156102e4576102e4612c30565b60058111156102f5576102f5612c30565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561036457610364612c30565b146103ce5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103f38584606001515f6110ec565b6040518263ffffffff1660e01b815260040161040f9190612d3e565b6020604051808303815f875af115801561042b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044f9190612d70565b50505050565b61045e81611311565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206135938339815191529060ff16156105005760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103c5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610543573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105679190612d70565b8360200135146105c95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103c5565b306105da6060850160408601612cfa565b6001600160a01b03161461064c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103c5565b5f61065a6060850185612d87565b9050116106b95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103c5565b5f6106c76060850185612d87565b9150506001600160401b0381106107365760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103c5565b5f8435602086013560146107506060890160408a01612cfa565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b82816001600160401b03161015610aab575f6107d26060880188612d87565b836001600160401b03168181106107eb576107eb612dd3565b90506020028101906107fd9190612de7565b61080690612e97565b8051909150806108285760405162461bcd60e51b81526004016103c590612f2e565b5f818152600787016020526040902054156108555760405162461bcd60e51b81526004016103c590612f6f565b81604001515160301461087a5760405162461bcd60e51b81526004016103c590612fb7565b83825f01518360200151846040015160405160200161089c9493929190613004565b60408051808303601f190181528282528a35602084015260c086901b6001600160c01b031916838301528151602881850301815260489093019182905295505f916002916108ea9190613053565b602060405180830381855afa158015610905573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109289190612d70565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff191660018360058111156109b4576109b4612c30565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080610aa390613078565b9150506107b3565b505f610ab685611689565b90505f610ac68260400151611863565b905080600284604051610ad99190613053565b602060405180830381855afa158015610af4573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b179190612d70565b14610b7b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103c5565b5050506008909101805460ff19166001179055505050565b5f610b9d82610fbf565b6080015192915050565b610baf6119cc565b610bb85f611a27565b565b5f610bc36119cc565b610bcd8383611a97565b90505b92915050565b610bde6119cc565b610be781611f0b565b50565b5f805160206135938339815191525f610c0283611689565b90505f80610c138360400151612201565b9150915080610c755760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103c5565b5f82815260058501602052604081208054610c8f9061309d565b9050118015610cc1575060015f83815260068601602052604090205460ff166005811115610cbf57610cbf612c30565b145b610cdd5760405162461bcd60e51b81526004016103c5906130cf565b5f8281526005850160205260408120610cf591612a99565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613593833981519152929190610dea9061309d565b9050118015610e1c575060015f83815260068301602052604090205460ff166005811115610e1a57610e1a612c30565b145b610e385760405162461bcd60e51b81526004016103c5906130cf565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e719190600401613116565b6020604051808303815f875af1158015610e8d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045e9190612d70565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ef55750825b90505f826001600160401b03166001148015610f105750303b155b905081158015610f1e575080155b15610f3c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610f6657845460ff60401b1916600160401b1785555b610f7087876123a2565b8315610fb657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206135b383398151915290528390208351918201909352825491925f8051602061359383398151915292829060ff16600581111561103f5761103f612c30565b600581111561105057611050612c30565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6110ba6119cc565b6001600160a01b0381166110e357604051631e4fbdf760e01b81525f60048201526024016103c5565b610be781611a27565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611165576111258160016131a0565b6111309060086131b3565b5081515f9083908390811061114757611147612dd3565b60200101906001600160f81b03191690815f1a905350600101611111565b505f5b60048110156111d05761117c8160036131a0565b6111879060086131b3565b600263ffffffff16901c60f81b828260026111a291906131ca565b815181106111b2576111b2612dd3565b60200101906001600160f81b03191690815f1a905350600101611168565b505f5b6020811015611232576111e781601f6131a0565b6111f29060086131b3565b86901c60f81b826112048360066131ca565b8151811061121457611214612dd3565b60200101906001600160f81b03191690815f1a9053506001016111d3565b505f5b600881101561129d576112498160076131a0565b6112549060086131b3565b6001600160401b038616901c60f81b8261126f8360266131ca565b8151811061127f5761127f612dd3565b60200101906001600160f81b03191690815f1a905350600101611235565b505f5b6008811015611308576112b48160076131a0565b6112bf9060086131b3565b6001600160401b038516901c60f81b826112da83602e6131ca565b815181106112ea576112ea612dd3565b60200101906001600160f81b03191690815f1a9053506001016112a0565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206135938339815191525f61136085611689565b90505f806113718360400151612201565b9150915080156113d65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103c5565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561140757611407612c30565b600581111561141857611418612c30565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561148957611489612c30565b14806114a757506001825160058111156114a5576114a5612c30565b145b6115065760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103c5565b60038251600581111561151b5761151b612c30565b036115285750600461152c565b5060055b6020808301515f9081526007880190915260408120558181600581111561155557611555612c30565b9081600581111561156857611568612c30565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561159c5761159c612c30565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561165057611650612c30565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830181905292820152905f805160206135938339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156116fe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261172591908101906131ec565b91509150806117855760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103c5565b82548251146117e85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103c5565b60208201516001600160a01b03161561185b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103c5565b509392505050565b5f81516026146118855760405162461bcd60e51b81526004016103c5906132be565b5f805b60028110156118d45761189c8160016131a0565b6118a79060086131b3565b61ffff168482815181106118bd576118bd612dd3565b016020015160f81c901b9190911790600101611888565b5061ffff8116156118f75760405162461bcd60e51b81526004016103c590613307565b5f805b60048110156119525761190e8160036131a0565b6119199060086131b3565b63ffffffff168561192b8360026131ca565b8151811061193b5761193b612dd3565b016020015160f81c901b91909117906001016118fa565b5063ffffffff8116156119775760405162461bcd60e51b81526004016103c59061334a565b5f805b60208110156113085761198e81601f6131a0565b6119999060086131b3565b866119a58360066131ca565b815181106119b5576119b5612dd3565b016020015160f81c901b919091179060010161197a565b336119fe7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610bb85760405163118cdaa760e01b81523360048201526024016103c5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16611b225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103c5565b5f8051602061359383398151915242611b416040860160208701613391565b6001600160401b0316118015611b7a5750611b626040850160208601613391565b6001600160401b0316611b78426202a3006131ca565b115b611bdc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103c5565b8335611bfa5760405162461bcd60e51b81526004016103c590612f2e565b83355f90815260078201602052604090205415611c295760405162461bcd60e51b81526004016103c590612f6f565b611c3660408501856133aa565b9050603014611c575760405162461bcd60e51b81526004016103c590612fb7565b611c60836123c0565b5f80611cfa6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611ca59190613391565b6001600160401b03168152602001611cc060408a018a6133aa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612561565b5f82815260058601602052604090209193509150611d188282613437565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d45908590600401612d3e565b6020604051808303815f875af1158015611d61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d859190612d70565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115611dfd57611dfd612c30565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611edd918e01908e01613391565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206135b38339815191526020526040808220815160e0810190925280545f8051602061359383398151915293929190829060ff166005811115611f5857611f58612c30565b6005811115611f6957611f69612c30565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611fdb57611fdb612c30565b146120375760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103c5565b61204481608001516123c0565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561208857612088612c30565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61213d8461213781612910565b5f6110ec565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061216c908590600401612d3e565b6020604051808303815f875af1158015612188573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121ac9190612d70565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146122245760405162461bcd60e51b81526004016103c5906132be565b5f805b60028110156122735761223b8160016131a0565b6122469060086131b3565b61ffff1685828151811061225c5761225c612dd3565b016020015160f81c901b9190911790600101612227565b5061ffff8116156122965760405162461bcd60e51b81526004016103c590613307565b5f805b60048110156122f1576122ad8160036131a0565b6122b89060086131b3565b63ffffffff16866122ca8360026131ca565b815181106122da576122da612dd3565b016020015160f81c901b9190911790600101612299565b5063ffffffff81166003146123185760405162461bcd60e51b81526004016103c59061334a565b5f805b602081101561236d5761232f81601f6131a0565b61233a9060086131b3565b876123468360066131ca565b8151811061235657612356612dd3565b016020015160f81c901b919091179060010161231b565b505f8660268151811061238257612382612dd3565b016020015191976001600160f81b03199092161515965090945050505050565b6123aa6129a0565b6123b3826129e9565b6123bc81612a02565b5050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206135938339815191529060ff165f036123fe575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061244690836131a0565b10612462576001600160401b0384166040830152808252612481565b838260400181815161247491906134f6565b6001600160401b03169052505b5f8260200151836040015160646124989190613516565b6124a29190613541565b600285015490915060ff908116908216111561251d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103c5565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f60608260800151516030146125cb5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103c5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612642576126028160016131a0565b61260d9060086131b3565b5081515f9083908390811061262457612624612dd3565b60200101906001600160f81b03191690815f1a9053506001016125ee565b505f5b60048110156126aa576126598160036131a0565b6126649060086131b3565b600160ff919091161c60f81b8261267c8360026131ca565b8151811061268c5761268c612dd3565b60200101906001600160f81b03191690815f1a905350600101612645565b505f5b602081101561270757845181602081106126c9576126c9612dd3565b1a60f81b826126d98360066131ca565b815181106126e9576126e9612dd3565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b6020811015612767578460200151816020811061272957612729612dd3565b1a60f81b826127398360266131ca565b8151811061274957612749612dd3565b60200101906001600160f81b03191690815f1a90535060010161270a565b505f5b60088110156127db5761277e8160076131a0565b6127899060086131b3565b60ff1685604001516001600160401b0316901c60f81b828260466127ad91906131ca565b815181106127bd576127bd612dd3565b60200101906001600160f81b03191690815f1a90535060010161276a565b505f5b603081101561284657846080015181815181106127fd576127fd612dd3565b01602001516001600160f81b0319168261281883604e6131ca565b8151811061282857612828612dd3565b60200101906001600160f81b03191690815f1a9053506001016127de565b505f5b60088110156128b85761285d8160076131a0565b6128689060086131b3565b60608601516001600160401b0390811691161c60f81b8261288a83607e6131ca565b8151811061289a5761289a612dd3565b60200101906001600160f81b03191690815f1a905350600101612849565b506002816040516128c99190613053565b602060405180830381855afa1580156128e4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129079190612d70565b94909350915050565b5f8181525f805160206135b38339815191526020526040812060020180545f8051602061359383398151915291600160401b9091046001600160401b031690600861295a83613078565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610bb857604051631afcd79f60e31b815260040160405180910390fd5b6129f16129a0565b6129f9612a13565b610be781612a1b565b612a0a6129a0565b610be781612a91565b610bb86129a0565b612a236129a0565b80355f8051602061359383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612a6d6060830160408401613572565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b6110ba6129a0565b508054612aa59061309d565b5f825580601f10612ab4575050565b601f0160209004905f5260205f2090810190610be791905b80821115612adf575f8155600101612acc565b5090565b5f60208284031215612af3575f80fd5b5035919050565b803563ffffffff81168114612b0d575f80fd5b919050565b5f60208284031215612b22575f80fd5b610bcd82612afa565b5f8060408385031215612b3c575f80fd5b82356001600160401b03811115612b51575f80fd5b830160808186031215612b62575f80fd5b9150612b7060208401612afa565b90509250929050565b5f60608284031215612b89575f80fd5b50919050565b80356001600160401b0381168114612b0d575f80fd5b5f8060408385031215612bb6575f80fd5b82356001600160401b03811115612bcb575f80fd5b612bd785828601612b79565b925050612b7060208401612b8f565b6001600160a01b0381168114610be7575f80fd5b5f8060808385031215612c0b575f80fd5b612c158484612b79565b91506060830135612c2581612be6565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612c6757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612ca260608401826001600160401b03169052565b506080830151612cbd60808401826001600160401b03169052565b5060a0830151612cd860a08401826001600160401b03169052565b5060c0830151612cf360c08401826001600160401b03169052565b5092915050565b5f60208284031215612d0a575f80fd5b8135612d1581612be6565b9392505050565b5f5b83811015612d36578181015183820152602001612d1e565b50505f910152565b602081525f8251806020840152612d5c816040850160208701612d1c565b601f01601f19169190910160400192915050565b5f60208284031215612d80575f80fd5b5051919050565b5f808335601e19843603018112612d9c575f80fd5b8301803591506001600160401b03821115612db5575f80fd5b6020019150600581901b3603821315612dcc575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612dfb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612e3b57612e3b612e05565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e6957612e69612e05565b604052919050565b5f6001600160401b03821115612e8957612e89612e05565b50601f01601f191660200190565b5f60608236031215612ea7575f80fd5b612eaf612e19565b823581526020612ec0818501612b8f565b8183015260408401356001600160401b03811115612edc575f80fd5b840136601f820112612eec575f80fd5b8035612eff612efa82612e71565b612e41565b8181523684838501011115612f12575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551613015818460208a01612d1c565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613045816028840160208801612d1c565b016028019695505050505050565b5f8251612dfb818460208701612d1c565b634e487b7160e01b5f52601160045260245ffd5b5f6001600160401b0380831681810361309357613093613064565b6001019392505050565b600181811c908216806130b157607f821691505b602082108103612b8957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546131288161309d565b806020870152604060018084165f8114613149576001811461316557613192565b60ff19851660408a0152604084151560051b8a01019550613192565b895f5260205f205f5b858110156131895781548b820186015290830190880161316e565b8a016040019650505b509398975050505050505050565b81810381811115610bd057610bd0613064565b8082028115828204841417610bd057610bd0613064565b80820180821115610bd057610bd0613064565b80518015158114612b0d575f80fd5b5f80604083850312156131fd575f80fd5b82516001600160401b0380821115613213575f80fd5b9084019060608287031215613226575f80fd5b61322e612e19565b8251815260208084015161324181612be6565b82820152604084015183811115613256575f80fd5b80850194505087601f85011261326a575f80fd5b8351925061327a612efa84612e71565b838152888285870101111561328d575f80fd5b61329c84838301848801612d1c565b806040840152508195506132b18188016131dd565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156133a1575f80fd5b610bcd82612b8f565b5f808335601e198436030181126133bf575f80fd5b8301803591506001600160401b038211156133d8575f80fd5b602001915036819003821315612dcc575f80fd5b601f82111561045e57805f5260205f20601f840160051c810160208510156134115750805b601f840160051c820191505b81811015613430575f815560010161341d565b5050505050565b81516001600160401b0381111561345057613450612e05565b6134648161345e845461309d565b846133ec565b602080601f831160018114613497575f84156134805750858301515b5f19600386901b1c1916600185901b1785556134ee565b5f85815260208120601f198616915b828110156134c5578886015182559484019460019091019084016134a6565b50858210156134e257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115612cf357612cf3613064565b6001600160401b0381811683821602808216919082811461353957613539613064565b505092915050565b5f6001600160401b038084168061356657634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f60208284031215613582575f80fd5b813560ff81168114612d15575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index f09e909c3..50199321f 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -124,7 +124,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ); uint256 numInitialValidators = subnetConversionData.initialValidators.length; require( - numInitialValidators < type(uint32).max, "ValidatorManager: too many initial validators" + numInitialValidators < type(uint64).max, "ValidatorManager: too many initial validators" ); // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's subnetConversionID. @@ -135,7 +135,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida subnetConversionData.validatorManagerAddress, uint32(numInitialValidators) ); - for (uint256 i; i < numInitialValidators; i++) { + for (uint64 i; i < numInitialValidators; i++) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; bytes32 nodeID = initialValidator.nodeID; require(nodeID != bytes32(0), "ValidatorManager: invalid node ID"); @@ -183,9 +183,6 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Parse the Warp message into SubnetConversionMessage bytes32 subnetConversionID = ValidatorMessages.unpackSubnetConversionMessage(warpMessage.payload); - require( - encodedConversion.length == 180, "ValidatorManager: invalid encoded conversion length" - ); require( sha256(encodedConversion) == subnetConversionID, "ValidatorManager: invalid subnet conversion ID" diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 3e2efb20d..57f13e705 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -3,6 +3,7 @@ package staking import ( "context" "crypto/sha256" + "encoding/binary" "math/big" "time" @@ -88,6 +89,12 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { }, }, } + // expected ValidationID for a node is SHA256 of concatenation of convertSubnetTxID and + // it's index in the initial validators list + expectedValidationIDPreHash := make([]byte, 40) + copy(expectedValidationIDPreHash[0:32], convertSubnetTxId[:]) + binary.BigEndian.PutUint64(expectedValidationIDPreHash[32:40], 0) + expectedValidationID := sha256.Sum256(expectedValidationIDPreHash) subnetConversionDataBytes, err := subnetConversionData.Pack() Expect(err).Should(BeNil()) @@ -117,6 +124,7 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) + Expect(initialValidatorCreatedEvent.ValidationID).Should(Equal(expectedValidationID)) var validationID ids.ID // To be used in the delisting step weight := uint64(1) From 809630196eaac0b45748767af03f6a6df019e72b Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Tue, 17 Sep 2024 02:00:24 -0400 Subject: [PATCH 301/545] minor cleanup --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- contracts/staking/ValidatorManager.sol | 4 +- tests/flows/staking/poa_validator_manager.go | 7 +- tests/utils/staking.go | 114 ++++++++++++++++++ 6 files changed, 123 insertions(+), 8 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 8b97261d6..ae80c3787 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615a8f380380615a8f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159428061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c806366435abf116100b4578063a3a65e4811610079578063a3a65e48146102bb578063b771b3bc146102ce578063ba3a4b97146102f4578063bee0a03f14610307578063d5f20ff61461031a578063eb0acb891461033a575f80fd5b806366435abf1461025c5780636f5f1c941461026f57806376f786211461028257806398f3e2b4146102955780639e1bc4ef146102a8575f80fd5b806335455ded116100fa57806335455ded146101f4578063467ef06f146102105780635297fae61461022357806361e2f490146102365780636206585614610249575f80fd5b80630118acc4146101365780630322ed981461014b5780630cdd09851461015e578063151d30d1146101af5780632e2194d8146101c9575b5f80fd5b610149610144366004614c1b565b61034d565b005b610149610159366004614c56565b6107b7565b61019c61016c366004614c56565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101b7600a81565b60405160ff90911681526020016101a6565b6101dc6101d7366004614c56565b610970565b6040516001600160401b0390911681526020016101a6565b6101fd61271081565b60405161ffff90911681526020016101a6565b61014961021e366004614c6d565b610986565b610149610231366004614c86565b6109d9565b610149610244366004614cae565b610bae565b61019c610257366004614d12565b6112de565b6101dc61026a366004614c56565b6112f7565b61014961027d366004614d3f565b61130b565b610149610290366004614c1b565b6113ef565b6101496102a3366004614c86565b6114d0565b61019c6102b6366004614d7d565b6116fd565b6101496102c9366004614c6d565b611729565b6102dc6005600160991b0181565b6040516001600160a01b0390911681526020016101a6565b610149610302366004614c56565b6118e1565b610149610315366004614c56565b611b67565b61032d610328366004614c56565b611c7b565b6040516101a69190614db1565b61019c610348366004614e78565b611d6e565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061589683398151915291841561039f5761039c8285611da3565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103d1576103d1614d9d565b60048111156103e2576103e2614d9d565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561046957610469614d9d565b146104bb5760405162461bcd60e51b815260206004820152602a60248201525f805160206158b68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105205760405162461bcd60e51b815260206004820152603360248201525f805160206158b68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104b2565b5f61052a8461203f565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561057757610577614d9d565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61064985611c7b565b905082606001516001600160401b031681608001516001600160401b0316116106c05760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104b2565b5f836060015182608001516106d59190614ef1565b90506106e186826120cf565b5f6005600160991b0163ee5b48eb6106fa898786612117565b6040518263ffffffff1660e01b81526004016107169190614f33565b6020604051808303815f875af1158015610732573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107569190614f65565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206159168339815191526020526040808220815160e0810190925280545f805160206158d683398151915293929190829060ff16600581111561080457610804614d9d565b600581111561081557610815614d9d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561088457610884614d9d565b146108e95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb61090e8584606001515f612117565b6040518263ffffffff1660e01b815260040161092a9190614f33565b6020604051808303815f875af1158015610946573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096a9190614f65565b50505050565b5f61098064e8d4a5100083614f90565b92915050565b5f805160206158968339815191525f8061099f8461233e565b6040808201515f84815260058801602052919091205492945090925061096a916001600160401b03909116906001600160a01b03166126b6565b5f805160206158968339815191525f6109f1846126ec565b90505f80610a0283604001516128c6565b50915091505f610a1183611c7b565b9050816001600160401b031681606001516001600160401b03161015610a495760405162461bcd60e51b81526004016104b290614fa3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a8e5760405162461bcd60e51b81526004016104b290614fe5565b60015f87815260068701602052604090205460ff166004811115610ab457610ab4614d9d565b14610b1d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206158d68339815191529060ff1615610c4b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb29190614f65565b836020013514610d145760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104b2565b30610d25606085016040860161502e565b6001600160a01b031614610d975760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104b2565b5f610da56060850185615049565b905011610e045760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104b2565b5f610e126060850185615049565b9150506001600160401b038110610e815760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104b2565b5f843560208601356014610e9b6060890160408a0161502e565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b82816001600160401b031610156111f6575f610f1d6060880188615049565b836001600160401b0316818110610f3657610f36615095565b9050602002810190610f4891906150a9565b610f5190615159565b805190915080610f735760405162461bcd60e51b81526004016104b2906151f0565b5f81815260078701602052604090205415610fa05760405162461bcd60e51b81526004016104b290615231565b816040015151603014610fc55760405162461bcd60e51b81526004016104b290615279565b83825f015183602001518460400151604051602001610fe794939291906152c6565b60408051808303601f190181528282528a35602084015260c086901b6001600160c01b031916838301528151602881850301815260489093019182905295505f916002916110359190615315565b602060405180830381855afa158015611050573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110739190614f65565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff191660018360058111156110ff576110ff614d9d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080806111ee90615326565b915050610efe565b505f611201856126ec565b90505f6112118260400151612b01565b9050806002846040516112249190615315565b602060405180830381855afa15801561123f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112629190614f65565b146112c65760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104b2565b5050506008909101805460ff19166001179055505050565b5f6109806001600160401b03831664e8d4a5100061534b565b5f61130182611c7b565b6080015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611354575080546001600160401b03808416911610155b156113725760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561139d8484612c73565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206158968339815191525f61140785611c7b565b5f86815260058401602052604090205460a082015191925061143a91600160b01b9091046001600160401b031690615362565b6001600160401b03164210156114ae5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104b2565b83156114c0576114be8584611da3565b505b6114c985612c8d565b5050505050565b6114d8612f83565b5f805160206158968339815191525f6114f0846126ec565b90505f8061150183604001516128c6565b50915091505f61151083611c7b565b9050816001600160401b031681606001516001600160401b031610156115485760405162461bcd60e51b81526004016104b290614fa3565b5f8681526006860160205260409020600301546001600160401b03808416911611156115865760405162461bcd60e51b81526004016104b290614fe5565b60035f87815260068701602052604090205460ff1660048111156115ac576115ac614d9d565b146116005760405162461bcd60e51b815260206004820152603160248201525f805160206158b68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526116a5916126b6565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506116f960015f805160206158f683398151915255565b5050565b5f611706612f83565b611711833384612fcd565b905061098060015f805160206158f683398151915255565b5f805160206158d68339815191525f611741836126ec565b90505f80611752836040015161343d565b91509150806117b45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104b2565b5f828152600585016020526040812080546117ce90615382565b9050118015611800575060015f83815260068601602052604090205460ff1660058111156117fe576117fe614d9d565b145b61181c5760405162461bcd60e51b81526004016104b2906153ba565b5f828152600585016020526040812061183491614bac565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061589683398151915293929190829060ff16600481111561194257611942614d9d565b600481111561195357611953614d9d565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119da576119da614d9d565b14806119f857506003815160048111156119f6576119f6614d9d565b145b611a4c5760405162461bcd60e51b815260206004820152603260248201525f805160206158b6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104b2565b5f611a5a8260400151611c7b565b905080606001516001600160401b03165f03611ade5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb611b0b846040015184606001518560800151612117565b6040518263ffffffff1660e01b8152600401611b279190614f33565b6020604051808303815f875af1158015611b43573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c99190614f65565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206158d6833981519152929190611baf90615382565b9050118015611be1575060015f83815260068301602052604090205460ff166005811115611bdf57611bdf614d9d565b145b611bfd5760405162461bcd60e51b81526004016104b2906153ba565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c369190600401615401565b6020604051808303815f875af1158015611c52573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c769190614f65565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061591683398151915290528390208351918201909352825491925f805160206158d683398151915292829060ff166005811115611cfb57611cfb614d9d565b6005811115611d0c57611d0c614d9d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611d77612f83565b611d83858585856135de565b9050611d9b60015f805160206158f683398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611dee573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e159190810190615496565b9150915080611e785760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ebb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611edf9190614f65565b825114611f435760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104b2565b60208201516001600160a01b031615611fb95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104b2565b5f80611fc884604001516137fc565b915091508187146120355760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104b2565b9695505050505050565b5f8181525f805160206159168339815191526020526040812060020180545f805160206158d683398151915291600160401b9091046001600160401b031690600861208983615326565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f80516020615916833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561219057612150816001615568565b61215b90600861534b565b5081515f9083908390811061217257612172615095565b60200101906001600160f81b03191690815f1a90535060010161213c565b505f5b60048110156121fb576121a7816003615568565b6121b290600861534b565b600263ffffffff16901c60f81b828260026121cd919061557b565b815181106121dd576121dd615095565b60200101906001600160f81b03191690815f1a905350600101612193565b505f5b602081101561225d5761221281601f615568565b61221d90600861534b565b86901c60f81b8261222f83600661557b565b8151811061223f5761223f615095565b60200101906001600160f81b03191690815f1a9053506001016121fe565b505f5b60088110156122c857612274816007615568565b61227f90600861534b565b6001600160401b038616901c60f81b8261229a83602661557b565b815181106122aa576122aa615095565b60200101906001600160f81b03191690815f1a905350600101612260565b505f5b6008811015612333576122df816007615568565b6122ea90600861534b565b6001600160401b038516901c60f81b8261230583602e61557b565b8151811061231557612315615095565b60200101906001600160f81b03191690815f1a9053506001016122cb565b5090505b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158d68339815191525f61238d856126ec565b90505f8061239e836040015161343d565b9150915080156124035760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104b2565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561243457612434614d9d565b600581111561244557612445614d9d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156124b6576124b6614d9d565b14806124d457506001825160058111156124d2576124d2614d9d565b145b6125335760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104b2565b60038251600581111561254857612548614d9d565b0361255557506004612559565b5060055b6020808301515f9081526007880190915260408120558181600581111561258257612582614d9d565b9081600581111561259557612595614d9d565b9052505f84815260068701602052604090208251815484929190829060ff191660018360058111156125c9576125c9614d9d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561267d5761267d614d9d565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546116f9906001600160a01b031682846139d4565b60408051606080820183525f8083526020830181905292820152905f805160206158d68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612761573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127889190810190615496565b91509150806127e85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104b2565b825482511461284b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104b2565b60208201516001600160a01b0316156128be5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104b2565b509392505050565b5f805f83516036146128ea5760405162461bcd60e51b81526004016104b29061558e565b5f805b600281101561293957612901816001615568565b61290c90600861534b565b61ffff1686828151811061292257612922615095565b016020015160f81c901b91909117906001016128ed565b5061ffff81161561295c5760405162461bcd60e51b81526004016104b2906155d7565b5f805b60048110156129b757612973816003615568565b61297e90600861534b565b63ffffffff168761299083600261557b565b815181106129a0576129a0615095565b016020015160f81c901b919091179060010161295f565b5063ffffffff81166004146129de5760405162461bcd60e51b81526004016104b29061561a565b5f805b6020811015612a33576129f581601f615568565b612a0090600861534b565b88612a0c83600661557b565b81518110612a1c57612a1c615095565b016020015160f81c901b91909117906001016129e1565b505f805b6008811015612a9257612a4b816007615568565b612a5690600861534b565b6001600160401b031689612a6b83602661557b565b81518110612a7b57612a7b615095565b016020015160f81c901b9190911790600101612a37565b505f805b6008811015612af157612aaa816007615568565b612ab590600861534b565b6001600160401b03168a612aca83602e61557b565b81518110612ada57612ada615095565b016020015160f81c901b9190911790600101612a96565b5091989097509095509350505050565b5f8151602614612b235760405162461bcd60e51b81526004016104b29061558e565b5f805b6002811015612b7257612b3a816001615568565b612b4590600861534b565b61ffff16848281518110612b5b57612b5b615095565b016020015160f81c901b9190911790600101612b26565b5061ffff811615612b955760405162461bcd60e51b81526004016104b2906155d7565b5f805b6004811015612bf057612bac816003615568565b612bb790600861534b565b63ffffffff1685612bc983600261557b565b81518110612bd957612bd9615095565b016020015160f81c901b9190911790600101612b98565b5063ffffffff811615612c155760405162461bcd60e51b81526004016104b29061561a565b5f805b6020811015612c6a57612c2c81601f615568565b612c3790600861534b565b86612c4383600661557b565b81518110612c5357612c53615095565b016020015160f81c901b9190911790600101612c18565b50949350505050565b612c7b613a33565b612c8482613a7e565b6116f981613af3565b5f8181525f805160206159168339815191526020526040808220815160e0810190925280545f805160206158d683398151915293929190829060ff166005811115612cda57612cda614d9d565b6005811115612ceb57612ceb614d9d565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612d5d57612d5d614d9d565b14612db95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104b2565b612dc68160800151613ba7565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115612e0a57612e0a614d9d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612ebf84612eb98161203f565b5f612117565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612eee908590600401614f33565b6020604051808303815f875af1158015612f0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2e9190614f65565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f805160206158f6833981519152805460011901612fb457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206158f683398151915255565b5f5f8051602061589683398151915281612fe96101d785613d48565b90505f612ff587611c7b565b905060028151600581111561300c5761300c614d9d565b1461306b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104b2565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166130fe5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104b2565b5f82826080015161310f9190615362565b60048501546040840151919250613131916001600160401b0390911690615661565b6001600160401b0316816001600160401b031611156131b05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104b2565b6131ba88826120cf565b5f6131c48961203f565b90505f89826040516020016131f092919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061321185613ba7565b5f6005600160991b0163ee5b48eb61322a8d8688612117565b6040518263ffffffff1660e01b81526004016132469190614f33565b6020604051808303815f875af1158015613262573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132869190614f65565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561330e5761330e614d9d565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134605760405162461bcd60e51b81526004016104b29061558e565b5f805b60028110156134af57613477816001615568565b61348290600861534b565b61ffff1685828151811061349857613498615095565b016020015160f81c901b9190911790600101613463565b5061ffff8116156134d25760405162461bcd60e51b81526004016104b2906155d7565b5f805b600481101561352d576134e9816003615568565b6134f490600861534b565b63ffffffff168661350683600261557b565b8151811061351657613516615095565b016020015160f81c901b91909117906001016134d5565b5063ffffffff81166003146135545760405162461bcd60e51b81526004016104b29061561a565b5f805b60208110156135a95761356b81601f615568565b61357690600861534b565b8761358283600661557b565b8151811061359257613592615095565b016020015160f81c901b9190911790600101613557565b505f866026815181106135be576135be615095565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158968339815191529061ffff86161080159061362a575061271061ffff861611155b6136465760405162461bcd60e51b81526004016104b29061568c565b60028101546001600160401b0390811690851610156136bf5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104b2565b805483108015906136d4575080600101548311155b6137325760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104b2565b5f61373c84613d48565b90505f61374882610970565b90505f6137558983613d7e565b905060405180606001604052806137693390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e1461381f5760405162461bcd60e51b81526004016104b29061558e565b5f805b600281101561386e57613836816001615568565b61384190600861534b565b61ffff1685828151811061385757613857615095565b016020015160f81c901b9190911790600101613822565b5061ffff8116156138915760405162461bcd60e51b81526004016104b2906155d7565b5f805b60048110156138ec576138a8816003615568565b6138b390600861534b565b63ffffffff16866138c583600261557b565b815181106138d5576138d5615095565b016020015160f81c901b9190911790600101613894565b5063ffffffff81166005146139135760405162461bcd60e51b81526004016104b29061561a565b5f805b60208110156139685761392a81601f615568565b61393590600861534b565b8761394183600661557b565b8151811061395157613951615095565b016020015160f81c901b9190911790600101613916565b505f805b60088110156139c757613980816007615568565b61398b90600861534b565b6001600160401b0316886139a083602661557b565b815181106139b0576139b0615095565b016020015160f81c901b919091179060010161396c565b5090969095509350505050565b6040516001600160a01b03838116602483015260448201839052611c7691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506141f2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a7c57604051631afcd79f60e31b815260040160405180910390fd5b565b613a86613a33565b613a8f81614253565b613a9761426c565b613af060608201356080830135613ab460c0850160a08601614d12565b613ac460e0860160c087016156d7565b61ffff16613ad9610100870160e088016156f0565b613aeb6101208801610100890161502e565b61427c565b50565b613afb613a33565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613b875760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104b2565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206158d68339815191529060ff165f03613be5575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613c2d9083615568565b10613c49576001600160401b0384166040830152808252613c68565b8382604001818151613c5b9190615362565b6001600160401b03169052505b5f826020015183604001516064613c7f9190615661565b613c899190615710565b600285015490915060ff9081169082161115613d045760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104b2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610980827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906144c0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613e095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104b2565b5f805160206158d683398151915242613e286040860160208701614d12565b6001600160401b0316118015613e615750613e496040850160208601614d12565b6001600160401b0316613e5f426202a30061557b565b115b613ec35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104b2565b8335613ee15760405162461bcd60e51b81526004016104b2906151f0565b83355f90815260078201602052604090205415613f105760405162461bcd60e51b81526004016104b290615231565b613f1d6040850185615735565b9050603014613f3e5760405162461bcd60e51b81526004016104b290615279565b613f4783613ba7565b5f80613fe16040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f8c9190614d12565b6001600160401b03168152602001613fa760408a018a615735565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614622565b5f82815260058601602052604090209193509150613fff82826157bb565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061402c908590600401614f33565b6020604051808303815f875af1158015614048573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061406c9190614f65565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff191660018360058111156140e4576140e4614d9d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916141c4918e01908e01614d12565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6142066001600160a01b038416836149d1565b905080515f1415801561422a575080806020019051810190614228919061587a565b155b15611c7657604051635274afe760e01b81526001600160a01b03841660048201526024016104b2565b61425b613a33565b6142636149de565b613af0816149e6565b614274613a33565b613a7c614a5c565b614284613a33565b5f80516020615896833981519152836142f05760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104b2565b6127108411156143125760405162461bcd60e51b81526004016104b29061568c565b8587111561437a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104b2565b5f8360ff16116143e75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104b2565b600a60ff841611156144595760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104b2565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614506573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061452a9190614f65565b90506145416001600160a01b038516333086614a64565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614585573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a99190614f65565b905081811161460f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104b2565b6146198282615568565b95945050505050565b5f606082608001515160301461468c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104b2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614703576146c3816001615568565b6146ce90600861534b565b5081515f908390839081106146e5576146e5615095565b60200101906001600160f81b03191690815f1a9053506001016146af565b505f5b600481101561476b5761471a816003615568565b61472590600861534b565b600160ff919091161c60f81b8261473d83600261557b565b8151811061474d5761474d615095565b60200101906001600160f81b03191690815f1a905350600101614706565b505f5b60208110156147c8578451816020811061478a5761478a615095565b1a60f81b8261479a83600661557b565b815181106147aa576147aa615095565b60200101906001600160f81b03191690815f1a90535060010161476e565b505f5b602081101561482857846020015181602081106147ea576147ea615095565b1a60f81b826147fa83602661557b565b8151811061480a5761480a615095565b60200101906001600160f81b03191690815f1a9053506001016147cb565b505f5b600881101561489c5761483f816007615568565b61484a90600861534b565b60ff1685604001516001600160401b0316901c60f81b8282604661486e919061557b565b8151811061487e5761487e615095565b60200101906001600160f81b03191690815f1a90535060010161482b565b505f5b603081101561490757846080015181815181106148be576148be615095565b01602001516001600160f81b031916826148d983604e61557b565b815181106148e9576148e9615095565b60200101906001600160f81b03191690815f1a90535060010161489f565b505f5b60088110156149795761491e816007615568565b61492990600861534b565b60608601516001600160401b0390811691161c60f81b8261494b83607e61557b565b8151811061495b5761495b615095565b60200101906001600160f81b03191690815f1a90535060010161490a565b5060028160405161498a9190615315565b602060405180830381855afa1580156149a5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906149c89190614f65565b94909350915050565b606061233783835f614a9d565b613a7c613a33565b6149ee613a33565b80355f805160206158d683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155614a3860608301604084016156f0565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612fba613a33565b6040516001600160a01b03848116602483015283811660448301526064820183905261096a9186918216906323b872dd90608401613a01565b606081471015614ac25760405163cd78605960e01b81523060048201526024016104b2565b5f80856001600160a01b03168486604051614add9190615315565b5f6040518083038185875af1925050503d805f8114614b17576040519150601f19603f3d011682016040523d82523d5f602084013e614b1c565b606091505b5091509150612035868383606082614b3c57614b3782614b83565b612337565b8151158015614b5357506001600160a01b0384163b155b15614b7c57604051639996b31560e01b81526001600160a01b03851660048201526024016104b2565b5080612337565b805115614b935780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614bb890615382565b5f825580601f10614bc7575050565b601f0160209004905f5260205f2090810190613af091905b80821115614bf2575f8155600101614bdf565b5090565b8015158114613af0575f80fd5b803563ffffffff81168114614c16575f80fd5b919050565b5f805f60608486031215614c2d575f80fd5b833592506020840135614c3f81614bf6565b9150614c4d60408501614c03565b90509250925092565b5f60208284031215614c66575f80fd5b5035919050565b5f60208284031215614c7d575f80fd5b61233782614c03565b5f8060408385031215614c97575f80fd5b614ca083614c03565b946020939093013593505050565b5f8060408385031215614cbf575f80fd5b82356001600160401b03811115614cd4575f80fd5b830160808186031215614ce5575f80fd5b9150614cf360208401614c03565b90509250929050565b80356001600160401b0381168114614c16575f80fd5b5f60208284031215614d22575f80fd5b61233782614cfc565b6001600160a01b0381168114613af0575f80fd5b5f80828403610140811215614d52575f80fd5b61012080821215614d61575f80fd5b8493508301359050614d7281614d2b565b809150509250929050565b5f8060408385031215614d8e575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614dd457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e0f60608401826001600160401b03169052565b506080830151614e2a60808401826001600160401b03169052565b5060a0830151614e4560a08401826001600160401b03169052565b5060c0830151614e6060c08401826001600160401b03169052565b5092915050565b803561ffff81168114614c16575f80fd5b5f805f8060808587031215614e8b575f80fd5b84356001600160401b03811115614ea0575f80fd5b850160608188031215614eb1575f80fd5b9350614ebf60208601614e67565b9250614ecd60408601614cfc565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e6057614e60614edd565b5f5b83811015614f2b578181015183820152602001614f13565b50505f910152565b602081525f8251806020840152614f51816040850160208701614f11565b601f01601f19169190910160400192915050565b5f60208284031215614f75575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614f9e57614f9e614f7c565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f6020828403121561503e575f80fd5b813561233781614d2b565b5f808335601e1984360301811261505e575f80fd5b8301803591506001600160401b03821115615077575f80fd5b6020019150600581901b360382131561508e575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150bd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150fd576150fd6150c7565b60405290565b604051601f8201601f191681016001600160401b038111828210171561512b5761512b6150c7565b604052919050565b5f6001600160401b0382111561514b5761514b6150c7565b50601f01601f191660200190565b5f60608236031215615169575f80fd5b6151716150db565b823581526020615182818501614cfc565b8183015260408401356001600160401b0381111561519e575f80fd5b840136601f8201126151ae575f80fd5b80356151c16151bc82615133565b615103565b81815236848385010111156151d4575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516152d7818460208a01614f11565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615307816028840160208801614f11565b016028019695505050505050565b5f82516150bd818460208701614f11565b5f6001600160401b0380831681810361534157615341614edd565b6001019392505050565b808202811582820484141761098057610980614edd565b6001600160401b03818116838216019080821115614e6057614e60614edd565b600181811c9082168061539657607f821691505b6020821081036153b457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461541381615382565b806020870152604060018084165f811461543457600181146154505761547d565b60ff19851660408a0152604084151560051b8a0101955061547d565b895f5260205f205f5b858110156154745781548b8201860152908301908801615459565b8a016040019650505b509398975050505050505050565b8051614c1681614bf6565b5f80604083850312156154a7575f80fd5b82516001600160401b03808211156154bd575f80fd5b90840190606082870312156154d0575f80fd5b6154d86150db565b825181526020808401516154eb81614d2b565b82820152604084015183811115615500575f80fd5b80850194505087601f850112615514575f80fd5b835192506155246151bc84615133565b8381528882858701011115615537575f80fd5b61554684838301848801614f11565b8060408401525081955061555b81880161548b565b9450505050509250929050565b8181038181111561098057610980614edd565b8082018082111561098057610980614edd565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461568457615684614edd565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f602082840312156156e7575f80fd5b61233782614e67565b5f60208284031215615700575f80fd5b813560ff81168114612337575f80fd5b5f6001600160401b038084168061572957615729614f7c565b92169190910492915050565b5f808335601e1984360301811261574a575f80fd5b8301803591506001600160401b03821115615763575f80fd5b60200191503681900382131561508e575f80fd5b601f821115611c7657805f5260205f20601f840160051c8101602085101561579c5750805b601f840160051c820191505b818110156114c9575f81556001016157a8565b81516001600160401b038111156157d4576157d46150c7565b6157e8816157e28454615382565b84615777565b602080601f83116001811461581b575f84156158045750858301515b5f19600386901b1c1916600185901b178555615872565b5f85815260208120601f198616915b828110156158495788860151825594840194600190910190840161582a565b508582101561586657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561588a575f80fd5b815161233781614bf656fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615a9e380380615a9e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159518061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c806366435abf116100b4578063a3a65e4811610079578063a3a65e48146102bb578063b771b3bc146102ce578063ba3a4b97146102f4578063bee0a03f14610307578063d5f20ff61461031a578063eb0acb891461033a575f80fd5b806366435abf1461025c5780636f5f1c941461026f57806376f786211461028257806398f3e2b4146102955780639e1bc4ef146102a8575f80fd5b806335455ded116100fa57806335455ded146101f4578063467ef06f146102105780635297fae61461022357806361e2f490146102365780636206585614610249575f80fd5b80630118acc4146101365780630322ed981461014b5780630cdd09851461015e578063151d30d1146101af5780632e2194d8146101c9575b5f80fd5b610149610144366004614c12565b61034d565b005b610149610159366004614c4d565b6107b7565b61019c61016c366004614c4d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b6101b7600a81565b60405160ff90911681526020016101a6565b6101dc6101d7366004614c4d565b610970565b6040516001600160401b0390911681526020016101a6565b6101fd61271081565b60405161ffff90911681526020016101a6565b61014961021e366004614c64565b610986565b610149610231366004614c7d565b6109d9565b610149610244366004614ca5565b610bae565b61019c610257366004614d09565b6112d5565b6101dc61026a366004614c4d565b6112ee565b61014961027d366004614d36565b611302565b610149610290366004614c12565b6113e6565b6101496102a3366004614c7d565b6114c7565b61019c6102b6366004614d74565b6116f4565b6101496102c9366004614c64565b611720565b6102dc6005600160991b0181565b6040516001600160a01b0390911681526020016101a6565b610149610302366004614c4d565b6118d8565b610149610315366004614c4d565b611b5e565b61032d610328366004614c4d565b611c72565b6040516101a69190614da8565b61019c610348366004614e6f565b611d65565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206158a583398151915291841561039f5761039c8285611d9a565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103d1576103d1614d94565b60048111156103e2576103e2614d94565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561046957610469614d94565b146104bb5760405162461bcd60e51b815260206004820152602a60248201525f805160206158c58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105205760405162461bcd60e51b815260206004820152603360248201525f805160206158c58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104b2565b5f61052a84612036565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561057757610577614d94565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61064985611c72565b905082606001516001600160401b031681608001516001600160401b0316116106c05760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104b2565b5f836060015182608001516106d59190614ee8565b90506106e186826120c6565b5f6005600160991b0163ee5b48eb6106fa89878661210e565b6040518263ffffffff1660e01b81526004016107169190614f2a565b6020604051808303815f875af1158015610732573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107569190614f5c565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206159258339815191526020526040808220815160e0810190925280545f805160206158e583398151915293929190829060ff16600581111561080457610804614d94565b600581111561081557610815614d94565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561088457610884614d94565b146108e95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb61090e8584606001515f61210e565b6040518263ffffffff1660e01b815260040161092a9190614f2a565b6020604051808303815f875af1158015610946573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096a9190614f5c565b50505050565b5f61098064e8d4a5100083614f87565b92915050565b5f805160206158a58339815191525f8061099f84612335565b6040808201515f84815260058801602052919091205492945090925061096a916001600160401b03909116906001600160a01b03166126ad565b5f805160206158a58339815191525f6109f1846126e3565b90505f80610a0283604001516128bd565b50915091505f610a1183611c72565b9050816001600160401b031681606001516001600160401b03161015610a495760405162461bcd60e51b81526004016104b290614f9a565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a8e5760405162461bcd60e51b81526004016104b290614fdc565b60015f87815260068701602052604090205460ff166004811115610ab457610ab4614d94565b14610b1d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206158e58339815191529060ff1615610c4b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c8e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cb29190614f5c565b836020013514610d145760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104b2565b30610d256060850160408601615025565b6001600160a01b031614610d975760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104b2565b5f610da56060850185615040565b905011610e045760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104b2565b5f610e126060850185615040565b91505063ffffffff8110610e7e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104b2565b5f843560208601356014610e986060890160408a01615025565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b828163ffffffff1610156111ed575f610f176060880188615040565b8363ffffffff16818110610f2d57610f2d61508c565b9050602002810190610f3f91906150a0565b610f4890615150565b805190915080610f6a5760405162461bcd60e51b81526004016104b2906151e7565b5f81815260078701602052604090205415610f975760405162461bcd60e51b81526004016104b290615228565b816040015151603014610fbc5760405162461bcd60e51b81526004016104b290615270565b83825f015183602001518460400151604051602001610fde94939291906152bd565b60408051808303601f190181528282528a35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905295505f9160029161102c919061530c565b602060405180830381855afa158015611047573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061106a9190614f5c565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff191660018360058111156110f6576110f6614d94565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080806111e59061531d565b915050610efb565b505f6111f8856126e3565b90505f6112088260400151612af8565b90508060028460405161121b919061530c565b602060405180830381855afa158015611236573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112599190614f5c565b146112bd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104b2565b5050506008909101805460ff19166001179055505050565b5f6109806001600160401b03831664e8d4a5100061533f565b5f6112f882611c72565b6080015192915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061134b575080546001600160401b03808416911610155b156113695760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556113948484612c6a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206158a58339815191525f6113fe85611c72565b5f86815260058401602052604090205460a082015191925061143191600160b01b9091046001600160401b031690615356565b6001600160401b03164210156114a55760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104b2565b83156114b7576114b58584611d9a565b505b6114c085612c84565b5050505050565b6114cf612f7a565b5f805160206158a58339815191525f6114e7846126e3565b90505f806114f883604001516128bd565b50915091505f61150783611c72565b9050816001600160401b031681606001516001600160401b0316101561153f5760405162461bcd60e51b81526004016104b290614f9a565b5f8681526006860160205260409020600301546001600160401b038084169116111561157d5760405162461bcd60e51b81526004016104b290614fdc565b60035f87815260068701602052604090205460ff1660048111156115a3576115a3614d94565b146115f75760405162461bcd60e51b815260206004820152603160248201525f805160206158c58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104b2565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261169c916126ad565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506116f060015f8051602061590583398151915255565b5050565b5f6116fd612f7a565b611708833384612fc4565b905061098060015f8051602061590583398151915255565b5f805160206158e58339815191525f611738836126e3565b90505f806117498360400151613434565b91509150806117ab5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104b2565b5f828152600585016020526040812080546117c590615376565b90501180156117f7575060015f83815260068601602052604090205460ff1660058111156117f5576117f5614d94565b145b6118135760405162461bcd60e51b81526004016104b2906153ae565b5f828152600585016020526040812061182b91614ba3565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206158a583398151915293929190829060ff16600481111561193957611939614d94565b600481111561194a5761194a614d94565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119d1576119d1614d94565b14806119ef57506003815160048111156119ed576119ed614d94565b145b611a435760405162461bcd60e51b815260206004820152603260248201525f805160206158c5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104b2565b5f611a518260400151611c72565b905080606001516001600160401b03165f03611ad55760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104b2565b6005600160991b016001600160a01b031663ee5b48eb611b0284604001518460600151856080015161210e565b6040518263ffffffff1660e01b8152600401611b1e9190614f2a565b6020604051808303815f875af1158015611b3a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c09190614f5c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206158e5833981519152929190611ba690615376565b9050118015611bd8575060015f83815260068301602052604090205460ff166005811115611bd657611bd6614d94565b145b611bf45760405162461bcd60e51b81526004016104b2906153ae565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c2d91906004016153f5565b6020604051808303815f875af1158015611c49573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6d9190614f5c565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061592583398151915290528390208351918201909352825491925f805160206158e583398151915292829060ff166005811115611cf257611cf2614d94565b6005811115611d0357611d03614d94565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611d6e612f7a565b611d7a858585856135d5565b9050611d9260015f8051602061590583398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611de5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e0c919081019061548a565b9150915080611e6f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104b2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611eb2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed69190614f5c565b825114611f3a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104b2565b60208201516001600160a01b031615611fb05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104b2565b5f80611fbf84604001516137f3565b9150915081871461202c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104b2565b9695505050505050565b5f8181525f805160206159258339815191526020526040812060020180545f805160206158e583398151915291600160401b9091046001600160401b03169060086120808361555c565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f80516020615925833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561218757612147816001615577565b61215290600861533f565b5081515f908390839081106121695761216961508c565b60200101906001600160f81b03191690815f1a905350600101612133565b505f5b60048110156121f25761219e816003615577565b6121a990600861533f565b600263ffffffff16901c60f81b828260026121c4919061558a565b815181106121d4576121d461508c565b60200101906001600160f81b03191690815f1a90535060010161218a565b505f5b60208110156122545761220981601f615577565b61221490600861533f565b86901c60f81b8261222683600661558a565b815181106122365761223661508c565b60200101906001600160f81b03191690815f1a9053506001016121f5565b505f5b60088110156122bf5761226b816007615577565b61227690600861533f565b6001600160401b038616901c60f81b8261229183602661558a565b815181106122a1576122a161508c565b60200101906001600160f81b03191690815f1a905350600101612257565b505f5b600881101561232a576122d6816007615577565b6122e190600861533f565b6001600160401b038516901c60f81b826122fc83602e61558a565b8151811061230c5761230c61508c565b60200101906001600160f81b03191690815f1a9053506001016122c2565b5090505b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158e58339815191525f612384856126e3565b90505f806123958360400151613434565b9150915080156123fa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104b2565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561242b5761242b614d94565b600581111561243c5761243c614d94565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156124ad576124ad614d94565b14806124cb57506001825160058111156124c9576124c9614d94565b145b61252a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104b2565b60038251600581111561253f5761253f614d94565b0361254c57506004612550565b5060055b6020808301515f9081526007880190915260408120558181600581111561257957612579614d94565b9081600581111561258c5761258c614d94565b9052505f84815260068701602052604090208251815484929190829060ff191660018360058111156125c0576125c0614d94565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561267457612674614d94565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546116f0906001600160a01b031682846139cb565b60408051606080820183525f8083526020830181905292820152905f805160206158e58339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612758573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261277f919081019061548a565b91509150806127df5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104b2565b82548251146128425760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104b2565b60208201516001600160a01b0316156128b55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104b2565b509392505050565b5f805f83516036146128e15760405162461bcd60e51b81526004016104b29061559d565b5f805b6002811015612930576128f8816001615577565b61290390600861533f565b61ffff168682815181106129195761291961508c565b016020015160f81c901b91909117906001016128e4565b5061ffff8116156129535760405162461bcd60e51b81526004016104b2906155e6565b5f805b60048110156129ae5761296a816003615577565b61297590600861533f565b63ffffffff168761298783600261558a565b815181106129975761299761508c565b016020015160f81c901b9190911790600101612956565b5063ffffffff81166004146129d55760405162461bcd60e51b81526004016104b290615629565b5f805b6020811015612a2a576129ec81601f615577565b6129f790600861533f565b88612a0383600661558a565b81518110612a1357612a1361508c565b016020015160f81c901b91909117906001016129d8565b505f805b6008811015612a8957612a42816007615577565b612a4d90600861533f565b6001600160401b031689612a6283602661558a565b81518110612a7257612a7261508c565b016020015160f81c901b9190911790600101612a2e565b505f805b6008811015612ae857612aa1816007615577565b612aac90600861533f565b6001600160401b03168a612ac183602e61558a565b81518110612ad157612ad161508c565b016020015160f81c901b9190911790600101612a8d565b5091989097509095509350505050565b5f8151602614612b1a5760405162461bcd60e51b81526004016104b29061559d565b5f805b6002811015612b6957612b31816001615577565b612b3c90600861533f565b61ffff16848281518110612b5257612b5261508c565b016020015160f81c901b9190911790600101612b1d565b5061ffff811615612b8c5760405162461bcd60e51b81526004016104b2906155e6565b5f805b6004811015612be757612ba3816003615577565b612bae90600861533f565b63ffffffff1685612bc083600261558a565b81518110612bd057612bd061508c565b016020015160f81c901b9190911790600101612b8f565b5063ffffffff811615612c0c5760405162461bcd60e51b81526004016104b290615629565b5f805b6020811015612c6157612c2381601f615577565b612c2e90600861533f565b86612c3a83600661558a565b81518110612c4a57612c4a61508c565b016020015160f81c901b9190911790600101612c0f565b50949350505050565b612c72613a2a565b612c7b82613a75565b6116f081613aea565b5f8181525f805160206159258339815191526020526040808220815160e0810190925280545f805160206158e583398151915293929190829060ff166005811115612cd157612cd1614d94565b6005811115612ce257612ce2614d94565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612d5457612d54614d94565b14612db05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104b2565b612dbd8160800151613b9e565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff19166001836005811115612e0157612e01614d94565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612eb684612eb081612036565b5f61210e565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612ee5908590600401614f2a565b6020604051808303815f875af1158015612f01573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f259190614f5c565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615905833981519152805460011901612fab57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061590583398151915255565b5f5f805160206158a583398151915281612fe06101d785613d3f565b90505f612fec87611c72565b905060028151600581111561300357613003614d94565b146130625760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104b2565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166130f55760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104b2565b5f8282608001516131069190615356565b60048501546040840151919250613128916001600160401b0390911690615670565b6001600160401b0316816001600160401b031611156131a75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104b2565b6131b188826120c6565b5f6131bb89612036565b90505f89826040516020016131e792919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061320885613b9e565b5f6005600160991b0163ee5b48eb6132218d868861210e565b6040518263ffffffff1660e01b815260040161323d9190614f2a565b6020604051808303815f875af1158015613259573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061327d9190614f5c565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561330557613305614d94565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134575760405162461bcd60e51b81526004016104b29061559d565b5f805b60028110156134a65761346e816001615577565b61347990600861533f565b61ffff1685828151811061348f5761348f61508c565b016020015160f81c901b919091179060010161345a565b5061ffff8116156134c95760405162461bcd60e51b81526004016104b2906155e6565b5f805b6004811015613524576134e0816003615577565b6134eb90600861533f565b63ffffffff16866134fd83600261558a565b8151811061350d5761350d61508c565b016020015160f81c901b91909117906001016134cc565b5063ffffffff811660031461354b5760405162461bcd60e51b81526004016104b290615629565b5f805b60208110156135a05761356281601f615577565b61356d90600861533f565b8761357983600661558a565b815181106135895761358961508c565b016020015160f81c901b919091179060010161354e565b505f866026815181106135b5576135b561508c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158a58339815191529061ffff861610801590613621575061271061ffff861611155b61363d5760405162461bcd60e51b81526004016104b29061569b565b60028101546001600160401b0390811690851610156136b65760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104b2565b805483108015906136cb575080600101548311155b6137295760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b60648201526084016104b2565b5f61373384613d3f565b90505f61373f82610970565b90505f61374c8983613d75565b905060405180606001604052806137603390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146138165760405162461bcd60e51b81526004016104b29061559d565b5f805b60028110156138655761382d816001615577565b61383890600861533f565b61ffff1685828151811061384e5761384e61508c565b016020015160f81c901b9190911790600101613819565b5061ffff8116156138885760405162461bcd60e51b81526004016104b2906155e6565b5f805b60048110156138e35761389f816003615577565b6138aa90600861533f565b63ffffffff16866138bc83600261558a565b815181106138cc576138cc61508c565b016020015160f81c901b919091179060010161388b565b5063ffffffff811660051461390a5760405162461bcd60e51b81526004016104b290615629565b5f805b602081101561395f5761392181601f615577565b61392c90600861533f565b8761393883600661558a565b815181106139485761394861508c565b016020015160f81c901b919091179060010161390d565b505f805b60088110156139be57613977816007615577565b61398290600861533f565b6001600160401b03168861399783602661558a565b815181106139a7576139a761508c565b016020015160f81c901b9190911790600101613963565b5090969095509350505050565b6040516001600160a01b03838116602483015260448201839052611c6d91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506141e9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a7357604051631afcd79f60e31b815260040160405180910390fd5b565b613a7d613a2a565b613a868161424a565b613a8e614263565b613ae760608201356080830135613aab60c0850160a08601614d09565b613abb60e0860160c087016156e6565b61ffff16613ad0610100870160e088016156ff565b613ae261012088016101008901615025565b614273565b50565b613af2613a2a565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613b7e5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104b2565b80546001600160a01b0319166001600160a01b0392909216919091179055565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206158e58339815191529060ff165f03613bdc575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613c249083615577565b10613c40576001600160401b0384166040830152808252613c5f565b8382604001818151613c529190615356565b6001600160401b03169052505b5f826020015183604001516064613c769190615670565b613c80919061571f565b600285015490915060ff9081169082161115613cfb5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016104b2565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f610980827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906144b7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613e005760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104b2565b5f805160206158e583398151915242613e1f6040860160208701614d09565b6001600160401b0316118015613e585750613e406040850160208601614d09565b6001600160401b0316613e56426202a30061558a565b115b613eba5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016104b2565b8335613ed85760405162461bcd60e51b81526004016104b2906151e7565b83355f90815260078201602052604090205415613f075760405162461bcd60e51b81526004016104b290615228565b613f146040850185615744565b9050603014613f355760405162461bcd60e51b81526004016104b290615270565b613f3e83613b9e565b5f80613fd86040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f839190614d09565b6001600160401b03168152602001613f9e60408a018a615744565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614619565b5f82815260058601602052604090209193509150613ff682826157ca565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614023908590600401614f2a565b6020604051808303815f875af115801561403f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140639190614f5c565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff191660018360058111156140db576140db614d94565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916141bb918e01908e01614d09565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f6141fd6001600160a01b038416836149c8565b905080515f1415801561422157508080602001905181019061421f9190615889565b155b15611c6d57604051635274afe760e01b81526001600160a01b03841660048201526024016104b2565b614252613a2a565b61425a6149d5565b613ae7816149dd565b61426b613a2a565b613a73614a53565b61427b613a2a565b5f805160206158a5833981519152836142e75760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104b2565b6127108411156143095760405162461bcd60e51b81526004016104b29061569b565b858711156143715760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104b2565b5f8360ff16116143de5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104b2565b600a60ff841611156144505760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104b2565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156144fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145219190614f5c565b90506145386001600160a01b038516333086614a5b565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561457c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a09190614f5c565b90508181116146065760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104b2565b6146108282615577565b95945050505050565b5f60608260800151516030146146835760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104b2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156146fa576146ba816001615577565b6146c590600861533f565b5081515f908390839081106146dc576146dc61508c565b60200101906001600160f81b03191690815f1a9053506001016146a6565b505f5b600481101561476257614711816003615577565b61471c90600861533f565b600160ff919091161c60f81b8261473483600261558a565b815181106147445761474461508c565b60200101906001600160f81b03191690815f1a9053506001016146fd565b505f5b60208110156147bf57845181602081106147815761478161508c565b1a60f81b8261479183600661558a565b815181106147a1576147a161508c565b60200101906001600160f81b03191690815f1a905350600101614765565b505f5b602081101561481f57846020015181602081106147e1576147e161508c565b1a60f81b826147f183602661558a565b815181106148015761480161508c565b60200101906001600160f81b03191690815f1a9053506001016147c2565b505f5b600881101561489357614836816007615577565b61484190600861533f565b60ff1685604001516001600160401b0316901c60f81b82826046614865919061558a565b815181106148755761487561508c565b60200101906001600160f81b03191690815f1a905350600101614822565b505f5b60308110156148fe57846080015181815181106148b5576148b561508c565b01602001516001600160f81b031916826148d083604e61558a565b815181106148e0576148e061508c565b60200101906001600160f81b03191690815f1a905350600101614896565b505f5b600881101561497057614915816007615577565b61492090600861533f565b60608601516001600160401b0390811691161c60f81b8261494283607e61558a565b815181106149525761495261508c565b60200101906001600160f81b03191690815f1a905350600101614901565b50600281604051614981919061530c565b602060405180830381855afa15801561499c573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906149bf9190614f5c565b94909350915050565b606061232e83835f614a94565b613a73613a2a565b6149e5613a2a565b80355f805160206158e583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155614a2f60608301604084016156ff565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612fb1613a2a565b6040516001600160a01b03848116602483015283811660448301526064820183905261096a9186918216906323b872dd906084016139f8565b606081471015614ab95760405163cd78605960e01b81523060048201526024016104b2565b5f80856001600160a01b03168486604051614ad4919061530c565b5f6040518083038185875af1925050503d805f8114614b0e576040519150601f19603f3d011682016040523d82523d5f602084013e614b13565b606091505b509150915061202c868383606082614b3357614b2e82614b7a565b61232e565b8151158015614b4a57506001600160a01b0384163b155b15614b7357604051639996b31560e01b81526001600160a01b03851660048201526024016104b2565b508061232e565b805115614b8a5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614baf90615376565b5f825580601f10614bbe575050565b601f0160209004905f5260205f2090810190613ae791905b80821115614be9575f8155600101614bd6565b5090565b8015158114613ae7575f80fd5b803563ffffffff81168114614c0d575f80fd5b919050565b5f805f60608486031215614c24575f80fd5b833592506020840135614c3681614bed565b9150614c4460408501614bfa565b90509250925092565b5f60208284031215614c5d575f80fd5b5035919050565b5f60208284031215614c74575f80fd5b61232e82614bfa565b5f8060408385031215614c8e575f80fd5b614c9783614bfa565b946020939093013593505050565b5f8060408385031215614cb6575f80fd5b82356001600160401b03811115614ccb575f80fd5b830160808186031215614cdc575f80fd5b9150614cea60208401614bfa565b90509250929050565b80356001600160401b0381168114614c0d575f80fd5b5f60208284031215614d19575f80fd5b61232e82614cf3565b6001600160a01b0381168114613ae7575f80fd5b5f80828403610140811215614d49575f80fd5b61012080821215614d58575f80fd5b8493508301359050614d6981614d22565b809150509250929050565b5f8060408385031215614d85575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614dcb57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e0660608401826001600160401b03169052565b506080830151614e2160808401826001600160401b03169052565b5060a0830151614e3c60a08401826001600160401b03169052565b5060c0830151614e5760c08401826001600160401b03169052565b5092915050565b803561ffff81168114614c0d575f80fd5b5f805f8060808587031215614e82575f80fd5b84356001600160401b03811115614e97575f80fd5b850160608188031215614ea8575f80fd5b9350614eb660208601614e5e565b9250614ec460408601614cf3565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e5757614e57614ed4565b5f5b83811015614f22578181015183820152602001614f0a565b50505f910152565b602081525f8251806020840152614f48816040850160208701614f08565b601f01601f19169190910160400192915050565b5f60208284031215614f6c575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614f9557614f95614f73565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615035575f80fd5b813561232e81614d22565b5f808335601e19843603018112615055575f80fd5b8301803591506001600160401b0382111561506e575f80fd5b6020019150600581901b3603821315615085575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150b4575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150f4576150f46150be565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615122576151226150be565b604052919050565b5f6001600160401b03821115615142576151426150be565b50601f01601f191660200190565b5f60608236031215615160575f80fd5b6151686150d2565b823581526020615179818501614cf3565b8183015260408401356001600160401b03811115615195575f80fd5b840136601f8201126151a5575f80fd5b80356151b86151b38261512a565b6150fa565b81815236848385010111156151cb575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516152ce818460208a01614f08565b80830190508581526001600160401b0360c01b8560c01b16602082015283516152fe816028840160208801614f08565b016028019695505050505050565b5f82516150b4818460208701614f08565b5f63ffffffff80831681810361533557615335614ed4565b6001019392505050565b808202811582820484141761098057610980614ed4565b6001600160401b03818116838216019080821115614e5757614e57614ed4565b600181811c9082168061538a57607f821691505b6020821081036153a857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461540781615376565b806020870152604060018084165f8114615428576001811461544457615471565b60ff19851660408a0152604084151560051b8a01019550615471565b895f5260205f205f5b858110156154685781548b820186015290830190880161544d565b8a016040019650505b509398975050505050505050565b8051614c0d81614bed565b5f806040838503121561549b575f80fd5b82516001600160401b03808211156154b1575f80fd5b90840190606082870312156154c4575f80fd5b6154cc6150d2565b825181526020808401516154df81614d22565b828201526040840151838111156154f4575f80fd5b80850194505087601f850112615508575f80fd5b835192506155186151b38461512a565b838152888285870101111561552b575f80fd5b61553a84838301848801614f08565b8060408401525081955061554f81880161547f565b9450505050509250929050565b5f6001600160401b0380831681810361533557615335614ed4565b8181038181111561098057610980614ed4565b8082018082111561098057610980614ed4565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461569357615693614ed4565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f602082840312156156f6575f80fd5b61232e82614e5e565b5f6020828403121561570f575f80fd5b813560ff8116811461232e575f80fd5b5f6001600160401b038084168061573857615738614f73565b92169190910492915050565b5f808335601e19843603018112615759575f80fd5b8301803591506001600160401b03821115615772575f80fd5b602001915036819003821315615085575f80fd5b601f821115611c6d57805f5260205f20601f840160051c810160208510156157ab5750805b601f840160051c820191505b818110156114c0575f81556001016157b7565b81516001600160401b038111156157e3576157e36150be565b6157f7816157f18454615376565b84615786565b602080601f83116001811461582a575f84156158135750858301515b5f19600386901b1c1916600185901b178555615881565b5f85815260208120601f198616915b8281101561585857888601518255948401946001909101908401615839565b508582101561587557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615899575f80fd5b815161232e81614bed56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index f9d548206..94e7f73a4 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"MAXIMUM_DELEGATION_FEE_BIPS\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint16\",\"internalType\":\"uint16\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"MAXIMUM_STAKE_MULTIPLIER_LIMIT\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516156d83803806156d883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61558b8061014d5f395ff3fe608060405260043610610126575f3560e01c806362065856116100a8578063b771b3bc1161006d578063b771b3bc14610357578063ba3a4b9714610389578063bee0a03f146103a8578063c123c6db146103c7578063c599e24f146103e6578063d5f20ff6146103f9575f80fd5b806362065856146102bc57806366435abf146102db57806376f78621146102fa57806398f3e2b414610319578063a3a65e4814610338575f80fd5b806335455ded116100ee57806335455ded1461022457806340034a931461024c578063467ef06f1461025f5780635297fae61461027e57806361e2f4901461029d575f80fd5b80630118acc41461012a5780630322ed981461014b5780630cdd09851461016a578063151d30d1146101c75780632e2194d8146101ed575b5f80fd5b348015610135575f80fd5b506101496101443660046148dd565b610425565b005b348015610156575f80fd5b50610149610165366004614918565b61088f565b348015610175575f80fd5b506101b4610184366004614918565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101d2575f80fd5b506101db600a81565b60405160ff90911681526020016101be565b3480156101f8575f80fd5b5061020c610207366004614918565b610a48565b6040516001600160401b0390911681526020016101be565b34801561022f575f80fd5b5061023961271081565b60405161ffff90911681526020016101be565b6101b461025a366004614956565b610a5e565b34801561026a575f80fd5b506101496102793660046149aa565b610a92565b348015610289575f80fd5b506101496102983660046149c3565b610ae5565b3480156102a8575f80fd5b506101496102b73660046149eb565b610cba565b3480156102c7575f80fd5b506101b46102d6366004614a39565b6113ea565b3480156102e6575f80fd5b5061020c6102f5366004614918565b611403565b348015610305575f80fd5b506101496103143660046148dd565b611417565b348015610324575f80fd5b506101496103333660046149c3565b6114f8565b348015610343575f80fd5b506101496103523660046149aa565b611725565b348015610362575f80fd5b506103716005600160991b0181565b6040516001600160a01b0390911681526020016101be565b348015610394575f80fd5b506101496103a3366004614918565b6118dd565b3480156103b3575f80fd5b506101496103c2366004614918565b611b63565b3480156103d2575f80fd5b506101496103e1366004614a52565b611c77565b6101b46103f4366004614918565b611d59565b348015610404575f80fd5b50610418610413366004614918565b611d8a565b6040516101be9190614a7d565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206154df833981519152918415610477576104748285611e7d565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104a9576104a9614a69565b60048111156104ba576104ba614a69565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561054157610541614a69565b146105935760405162461bcd60e51b815260206004820152602a60248201525f805160206154ff8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105f85760405162461bcd60e51b815260206004820152603360248201525f805160206154ff8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161058a565b5f61060284612119565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561064f5761064f614a69565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61072185611d8a565b905082606001516001600160401b031681608001516001600160401b0316116107985760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161058a565b5f836060015182608001516107ad9190614b47565b90506107b986826121a9565b5f6005600160991b0163ee5b48eb6107d28987866121f1565b6040518263ffffffff1660e01b81526004016107ee9190614b89565b6020604051808303815f875af115801561080a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082e9190614bbb565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061555f8339815191526020526040808220815160e0810190925280545f8051602061551f83398151915293929190829060ff1660058111156108dc576108dc614a69565b60058111156108ed576108ed614a69565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c614a69565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6121f1565b6040518263ffffffff1660e01b8152600401610a029190614b89565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a429190614bbb565b50505050565b5f610a5864e8d4a5100083614be6565b92915050565b5f610a67612416565b610a738484843461244d565b9050610a8b60015f8051602061553f83398151915255565b9392505050565b5f805160206154df8339815191525f80610aab84612673565b6040808201515f848152600588016020529190912054929450909250610a42916001600160401b03909116906001600160a01b03166129eb565b5f805160206154df8339815191525f610afd846129fe565b90505f80610b0e8360400151612bd8565b50915091505f610b1d83611d8a565b9050816001600160401b031681606001516001600160401b03161015610b555760405162461bcd60e51b815260040161058a90614bf9565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b9a5760405162461bcd60e51b815260040161058a90614c3b565b60015f87815260068701602052604090205460ff166004811115610bc057610bc0614a69565b14610c295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f8051602061551f8339815191529060ff1615610d575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbe9190614bbb565b836020013514610e205760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161058a565b30610e316060850160408601614c98565b6001600160a01b031614610ea35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161058a565b5f610eb16060850185614cb3565b905011610f105760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161058a565b5f610f1e6060850185614cb3565b9150506001600160401b038110610f8d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b606482015260840161058a565b5f843560208601356014610fa76060890160408a01614c98565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b82816001600160401b03161015611302575f6110296060880188614cb3565b836001600160401b031681811061104257611042614cff565b90506020028101906110549190614d13565b61105d90614dc3565b80519091508061107f5760405162461bcd60e51b815260040161058a90614e5a565b5f818152600787016020526040902054156110ac5760405162461bcd60e51b815260040161058a90614e9b565b8160400151516030146110d15760405162461bcd60e51b815260040161058a90614ee3565b83825f0151836020015184604001516040516020016110f39493929190614f30565b60408051808303601f190181528282528a35602084015260c086901b6001600160c01b031916838301528151602881850301815260489093019182905295505f916002916111419190614f7f565b602060405180830381855afa15801561115c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061117f9190614bbb565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff1916600183600581111561120b5761120b614a69565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080806112fa90614f90565b91505061100a565b505f61130d856129fe565b90505f61131d8260400151612e13565b9050806002846040516113309190614f7f565b602060405180830381855afa15801561134b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136e9190614bbb565b146113d25760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161058a565b5050506008909101805460ff19166001179055505050565b5f610a586001600160401b03831664e8d4a51000614fb5565b5f61140d82611d8a565b6080015192915050565b5f805160206154df8339815191525f61142f85611d8a565b5f86815260058401602052604090205460a082015191925061146291600160b01b9091046001600160401b031690614fcc565b6001600160401b03164210156114d65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161058a565b83156114e8576114e68584611e7d565b505b6114f185612f7c565b5050505050565b611500612416565b5f805160206154df8339815191525f611518846129fe565b90505f806115298360400151612bd8565b50915091505f61153883611d8a565b9050816001600160401b031681606001516001600160401b031610156115705760405162461bcd60e51b815260040161058a90614bf9565b5f8681526006860160205260409020600301546001600160401b03808416911611156115ae5760405162461bcd60e51b815260040161058a90614c3b565b60035f87815260068701602052604090205460ff1660048111156115d4576115d4614a69565b146116285760405162461bcd60e51b815260206004820152603160248201525f805160206154ff8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526116cd916129eb565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061172160015f8051602061553f83398151915255565b5050565b5f8051602061551f8339815191525f61173d836129fe565b90505f8061174e8360400151613272565b91509150806117b05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161058a565b5f828152600585016020526040812080546117ca90614fec565b90501180156117fc575060015f83815260068601602052604090205460ff1660058111156117fa576117fa614a69565b145b6118185760405162461bcd60e51b815260040161058a9061501e565b5f828152600585016020526040812061183091614873565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206154df83398151915293929190829060ff16600481111561193e5761193e614a69565b600481111561194f5761194f614a69565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119d6576119d6614a69565b14806119f457506003815160048111156119f2576119f2614a69565b145b611a485760405162461bcd60e51b815260206004820152603260248201525f805160206154ff833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161058a565b5f611a568260400151611d8a565b905080606001516001600160401b03165f03611ada5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb611b078460400151846060015185608001516121f1565b6040518263ffffffff1660e01b8152600401611b239190614b89565b6020604051808303815f875af1158015611b3f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114f19190614bbb565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061551f833981519152929190611bab90614fec565b9050118015611bdd575060015f83815260068301602052604090205460ff166005811115611bdb57611bdb614a69565b145b611bf95760405162461bcd60e51b815260040161058a9061501e565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c329190600401615065565b6020604051808303815f875af1158015611c4e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c729190614bbb565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611cc0575080546001600160401b03808416911610155b15611cde5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611d0883613413565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611d62612416565b611d6d823334613427565b9050611d8560015f8051602061553f83398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061555f83398151915290528390208351918201909352825491925f8051602061551f83398151915292829060ff166005811115611e0a57611e0a614a69565b6005811115611e1b57611e1b614a69565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ec8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611eef91908101906150fa565b9150915080611f525760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fb99190614bbb565b82511461201d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161058a565b60208201516001600160a01b0316156120935760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161058a565b5f806120a28460400151613894565b9150915081871461210f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161058a565b9695505050505050565b5f8181525f8051602061555f8339815191526020526040812060020180545f8051602061551f83398151915291600160401b9091046001600160401b031690600861216383614f90565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f8051602061555f833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561226a5761222a8160016151cc565b612235906008614fb5565b5081515f9083908390811061224c5761224c614cff565b60200101906001600160f81b03191690815f1a905350600101612216565b505f5b60048110156122d5576122818160036151cc565b61228c906008614fb5565b600263ffffffff16901c60f81b828260026122a791906151df565b815181106122b7576122b7614cff565b60200101906001600160f81b03191690815f1a90535060010161226d565b505f5b6020811015612337576122ec81601f6151cc565b6122f7906008614fb5565b86901c60f81b826123098360066151df565b8151811061231957612319614cff565b60200101906001600160f81b03191690815f1a9053506001016122d8565b505f5b60088110156123a25761234e8160076151cc565b612359906008614fb5565b6001600160401b038616901c60f81b826123748360266151df565b8151811061238457612384614cff565b60200101906001600160f81b03191690815f1a90535060010161233a565b505f5b600881101561240d576123b98160076151cc565b6123c4906008614fb5565b6001600160401b038516901c60f81b826123df83602e6151df565b815181106123ef576123ef614cff565b60200101906001600160f81b03191690815f1a9053506001016123a5565b50949350505050565b5f8051602061553f83398151915280546001190161244757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206154df8339815191529061ffff861610801590612499575061271061ffff861611155b6124b55760405162461bcd60e51b815260040161058a906151f2565b60028101546001600160401b03908116908516101561252e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161058a565b80548310801590612543575080600101548311155b6125a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161058a565b825f6125ac82610a48565b90505f6125b98983613a6c565b905060405180606001604052806125cd3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061553f83398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061551f8339815191525f6126c2856129fe565b90505f806126d38360400151613272565b9150915080156127385760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161058a565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561276957612769614a69565b600581111561277a5761277a614a69565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156127eb576127eb614a69565b1480612809575060018251600581111561280757612807614a69565b145b6128685760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161058a565b60038251600581111561287d5761287d614a69565b0361288a5750600461288e565b5060055b6020808301515f908152600788019091526040812055818160058111156128b7576128b7614a69565b908160058111156128ca576128ca614a69565b9052505f84815260068701602052604090208251815484929190829060ff191660018360058111156128fe576128fe614a69565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156129b2576129b2614a69565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6117216001600160a01b03821683613ee0565b60408051606080820183525f8083526020830181905292820152905f8051602061551f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a73573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a9a91908101906150fa565b9150915080612afa5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b606482015260840161058a565b8254825114612b5d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161058a565b60208201516001600160a01b031615612bd05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161058a565b509392505050565b5f805f8351603614612bfc5760405162461bcd60e51b815260040161058a9061523d565b5f805b6002811015612c4b57612c138160016151cc565b612c1e906008614fb5565b61ffff16868281518110612c3457612c34614cff565b016020015160f81c901b9190911790600101612bff565b5061ffff811615612c6e5760405162461bcd60e51b815260040161058a90615286565b5f805b6004811015612cc957612c858160036151cc565b612c90906008614fb5565b63ffffffff1687612ca28360026151df565b81518110612cb257612cb2614cff565b016020015160f81c901b9190911790600101612c71565b5063ffffffff8116600414612cf05760405162461bcd60e51b815260040161058a906152c9565b5f805b6020811015612d4557612d0781601f6151cc565b612d12906008614fb5565b88612d1e8360066151df565b81518110612d2e57612d2e614cff565b016020015160f81c901b9190911790600101612cf3565b505f805b6008811015612da457612d5d8160076151cc565b612d68906008614fb5565b6001600160401b031689612d7d8360266151df565b81518110612d8d57612d8d614cff565b016020015160f81c901b9190911790600101612d49565b505f805b6008811015612e0357612dbc8160076151cc565b612dc7906008614fb5565b6001600160401b03168a612ddc83602e6151df565b81518110612dec57612dec614cff565b016020015160f81c901b9190911790600101612da8565b5091989097509095509350505050565b5f8151602614612e355760405162461bcd60e51b815260040161058a9061523d565b5f805b6002811015612e8457612e4c8160016151cc565b612e57906008614fb5565b61ffff16848281518110612e6d57612e6d614cff565b016020015160f81c901b9190911790600101612e38565b5061ffff811615612ea75760405162461bcd60e51b815260040161058a90615286565b5f805b6004811015612f0257612ebe8160036151cc565b612ec9906008614fb5565b63ffffffff1685612edb8360026151df565b81518110612eeb57612eeb614cff565b016020015160f81c901b9190911790600101612eaa565b5063ffffffff811615612f275760405162461bcd60e51b815260040161058a906152c9565b5f805b602081101561240d57612f3e81601f6151cc565b612f49906008614fb5565b86612f558360066151df565b81518110612f6557612f65614cff565b016020015160f81c901b9190911790600101612f2a565b5f8181525f8051602061555f8339815191526020526040808220815160e0810190925280545f8051602061551f83398151915293929190829060ff166005811115612fc957612fc9614a69565b6005811115612fda57612fda614a69565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561304c5761304c614a69565b146130a85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161058a565b6130b58160800151613f73565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156130f9576130f9614a69565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131ae846131a881612119565b5f6121f1565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906131dd908590600401614b89565b6020604051808303815f875af11580156131f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061321d9190614bbb565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146132955760405162461bcd60e51b815260040161058a9061523d565b5f805b60028110156132e4576132ac8160016151cc565b6132b7906008614fb5565b61ffff168582815181106132cd576132cd614cff565b016020015160f81c901b9190911790600101613298565b5061ffff8116156133075760405162461bcd60e51b815260040161058a90615286565b5f805b60048110156133625761331e8160036151cc565b613329906008614fb5565b63ffffffff168661333b8360026151df565b8151811061334b5761334b614cff565b016020015160f81c901b919091179060010161330a565b5063ffffffff81166003146133895760405162461bcd60e51b815260040161058a906152c9565b5f805b60208110156133de576133a081601f6151cc565b6133ab906008614fb5565b876133b78360066151df565b815181106133c7576133c7614cff565b016020015160f81c901b919091179060010161338c565b505f866026815181106133f3576133f3614cff565b016020015191976001600160f81b03199092161515965090945050505050565b61341b614114565b6134248161415f565b50565b5f5f805160206154df8339815191528161344084610a48565b90505f61344c87611d8a565b905060028151600581111561346357613463614a69565b146134c25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161058a565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166135555760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161058a565b5f8282608001516135669190614fcc565b60048501546040840151919250613588916001600160401b0390911690615310565b6001600160401b0316816001600160401b031611156136075760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161058a565b61361188826121a9565b5f61361b89612119565b90505f898260405160200161364792919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061366885613f73565b5f6005600160991b0163ee5b48eb6136818d86886121f1565b6040518263ffffffff1660e01b815260040161369d9190614b89565b6020604051808303815f875af11580156136b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136dd9190614bbb565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561376557613765614a69565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e146138b75760405162461bcd60e51b815260040161058a9061523d565b5f805b6002811015613906576138ce8160016151cc565b6138d9906008614fb5565b61ffff168582815181106138ef576138ef614cff565b016020015160f81c901b91909117906001016138ba565b5061ffff8116156139295760405162461bcd60e51b815260040161058a90615286565b5f805b6004811015613984576139408160036151cc565b61394b906008614fb5565b63ffffffff168661395d8360026151df565b8151811061396d5761396d614cff565b016020015160f81c901b919091179060010161392c565b5063ffffffff81166005146139ab5760405162461bcd60e51b815260040161058a906152c9565b5f805b6020811015613a00576139c281601f6151cc565b6139cd906008614fb5565b876139d98360066151df565b815181106139e9576139e9614cff565b016020015160f81c901b91909117906001016139ae565b505f805b6008811015613a5f57613a188160076151cc565b613a23906008614fb5565b6001600160401b031688613a388360266151df565b81518110613a4857613a48614cff565b016020015160f81c901b9190911790600101613a04565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613af75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161058a565b5f8051602061551f83398151915242613b166040860160208701614a39565b6001600160401b0316118015613b4f5750613b376040850160208601614a39565b6001600160401b0316613b4d426202a3006151df565b115b613bb15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161058a565b8335613bcf5760405162461bcd60e51b815260040161058a90614e5a565b83355f90815260078201602052604090205415613bfe5760405162461bcd60e51b815260040161058a90614e9b565b613c0b604085018561533b565b9050603014613c2c5760405162461bcd60e51b815260040161058a90614ee3565b613c3583613f73565b5f80613ccf6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613c7a9190614a39565b6001600160401b03168152602001613c9560408a018a61533b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d1565b5f82815260058601602052604090209193509150613ced82826153c1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613d1a908590600401614b89565b6020604051808303815f875af1158015613d36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d5a9190614bbb565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115613dd257613dd2614a69565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613eb2918e01908e01614a39565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613f035760405163cd78605960e01b815230600482015260240161058a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f4c576040519150601f19603f3d011682016040523d82523d5f602084013e613f51565b606091505b5050905080611c7257604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061551f8339815191529060ff165f03613fb1575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613ff990836151cc565b10614015576001600160401b0384166040830152808252614034565b83826040018181516140279190614fcc565b6001600160401b03169052505b5f82602001518360400151606461404b9190615310565b6140559190615480565b600285015490915060ff90811690821611156140d05760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161058a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661415d57604051631afcd79f60e31b815260040160405180910390fd5b565b614167614114565b61417081614580565b614178614599565b6134246060820135608083013561419560c0850160a08601614a39565b6141a560e0860160c087016154a5565b61ffff166141ba610100870160e088016154be565b6141cc61012088016101008901614c98565b6145a9565b5f606082608001515160301461423b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161058a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142b2576142728160016151cc565b61427d906008614fb5565b5081515f9083908390811061429457614294614cff565b60200101906001600160f81b03191690815f1a90535060010161425e565b505f5b600481101561431a576142c98160036151cc565b6142d4906008614fb5565b600160ff919091161c60f81b826142ec8360026151df565b815181106142fc576142fc614cff565b60200101906001600160f81b03191690815f1a9053506001016142b5565b505f5b6020811015614377578451816020811061433957614339614cff565b1a60f81b826143498360066151df565b8151811061435957614359614cff565b60200101906001600160f81b03191690815f1a90535060010161431d565b505f5b60208110156143d7578460200151816020811061439957614399614cff565b1a60f81b826143a98360266151df565b815181106143b9576143b9614cff565b60200101906001600160f81b03191690815f1a90535060010161437a565b505f5b600881101561444b576143ee8160076151cc565b6143f9906008614fb5565b60ff1685604001516001600160401b0316901c60f81b8282604661441d91906151df565b8151811061442d5761442d614cff565b60200101906001600160f81b03191690815f1a9053506001016143da565b505f5b60308110156144b6578460800151818151811061446d5761446d614cff565b01602001516001600160f81b0319168261448883604e6151df565b8151811061449857614498614cff565b60200101906001600160f81b03191690815f1a90535060010161444e565b505f5b6008811015614528576144cd8160076151cc565b6144d8906008614fb5565b60608601516001600160401b0390811691161c60f81b826144fa83607e6151df565b8151811061450a5761450a614cff565b60200101906001600160f81b03191690815f1a9053506001016144b9565b506002816040516145399190614f7f565b602060405180830381855afa158015614554573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145779190614bbb565b94909350915050565b614588614114565b6145906147ed565b613424816147f5565b6145a1614114565b61415d61486b565b6145b1614114565b5f805160206154df8339815191528361461d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161058a565b61271084111561463f5760405162461bcd60e51b815260040161058a906151f2565b858711156146a75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161058a565b5f8360ff16116147145760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161058a565b600a60ff841611156147865760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161058a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b61415d614114565b6147fd614114565b80355f8051602061551f83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561484760608301604084016154be565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b612660614114565b50805461487f90614fec565b5f825580601f1061488e575050565b601f0160209004905f5260205f209081019061342491905b808211156148b9575f81556001016148a6565b5090565b8015158114613424575f80fd5b803563ffffffff81168114611d85575f80fd5b5f805f606084860312156148ef575f80fd5b833592506020840135614901816148bd565b915061490f604085016148ca565b90509250925092565b5f60208284031215614928575f80fd5b5035919050565b803561ffff81168114611d85575f80fd5b80356001600160401b0381168114611d85575f80fd5b5f805f60608486031215614968575f80fd5b83356001600160401b0381111561497d575f80fd5b84016060818703121561498e575f80fd5b925061499c6020850161492f565b915061490f60408501614940565b5f602082840312156149ba575f80fd5b610a8b826148ca565b5f80604083850312156149d4575f80fd5b6149dd836148ca565b946020939093013593505050565b5f80604083850312156149fc575f80fd5b82356001600160401b03811115614a11575f80fd5b830160808186031215614a22575f80fd5b9150614a30602084016148ca565b90509250929050565b5f60208284031215614a49575f80fd5b610a8b82614940565b5f6101208284031215614a63575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614aa057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614adb60608401826001600160401b03169052565b506080830151614af660808401826001600160401b03169052565b5060a0830151614b1160a08401826001600160401b03169052565b5060c0830151614b2c60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614b2c57614b2c614b33565b5f5b83811015614b81578181015183820152602001614b69565b50505f910152565b602081525f8251806020840152614ba7816040850160208701614b67565b601f01601f19169190910160400192915050565b5f60208284031215614bcb575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614bf457614bf4614bd2565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114613424575f80fd5b5f60208284031215614ca8575f80fd5b8135610a8b81614c84565b5f808335601e19843603018112614cc8575f80fd5b8301803591506001600160401b03821115614ce1575f80fd5b6020019150600581901b3603821315614cf8575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614d27575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614d6757614d67614d31565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614d9557614d95614d31565b604052919050565b5f6001600160401b03821115614db557614db5614d31565b50601f01601f191660200190565b5f60608236031215614dd3575f80fd5b614ddb614d45565b823581526020614dec818501614940565b8183015260408401356001600160401b03811115614e08575f80fd5b840136601f820112614e18575f80fd5b8035614e2b614e2682614d9d565b614d6d565b8181523684838501011115614e3e575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551614f41818460208a01614b67565b80830190508581526001600160401b0360c01b8560c01b1660208201528351614f71816028840160208801614b67565b016028019695505050505050565b5f8251614d27818460208701614b67565b5f6001600160401b03808316818103614fab57614fab614b33565b6001019392505050565b8082028115828204841417610a5857610a58614b33565b6001600160401b03818116838216019080821115614b2c57614b2c614b33565b600181811c9082168061500057607f821691505b602082108103614a6357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461507781614fec565b806020870152604060018084165f811461509857600181146150b4576150e1565b60ff19851660408a0152604084151560051b8a010195506150e1565b895f5260205f205f5b858110156150d85781548b82018601529083019088016150bd565b8a016040019650505b509398975050505050505050565b8051611d85816148bd565b5f806040838503121561510b575f80fd5b82516001600160401b0380821115615121575f80fd5b9084019060608287031215615134575f80fd5b61513c614d45565b8251815260208084015161514f81614c84565b82820152604084015183811115615164575f80fd5b80850194505087601f850112615178575f80fd5b83519250615188614e2684614d9d565b838152888285870101111561519b575f80fd5b6151aa84838301848801614b67565b806040840152508195506151bf8188016150ef565b9450505050509250929050565b81810381811115610a5857610a58614b33565b80820180821115610a5857610a58614b33565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461533357615333614b33565b505092915050565b5f808335601e19843603018112615350575f80fd5b8301803591506001600160401b03821115615369575f80fd5b602001915036819003821315614cf8575f80fd5b601f821115611c7257805f5260205f20601f840160051c810160208510156153a25750805b601f840160051c820191505b818110156114f1575f81556001016153ae565b81516001600160401b038111156153da576153da614d31565b6153ee816153e88454614fec565b8461537d565b602080601f831160018114615421575f841561540a5750858301515b5f19600386901b1c1916600185901b178555615478565b5f85815260208120601f198616915b8281101561544f57888601518255948401946001909101908401615430565b508582101561546c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b038084168061549957615499614bd2565b92169190910492915050565b5f602082840312156154b5575f80fd5b610a8b8261492f565b5f602082840312156154ce575f80fd5b813560ff81168114610a8b575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516156e73803806156e783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61559a8061014d5f395ff3fe608060405260043610610126575f3560e01c806362065856116100a8578063b771b3bc1161006d578063b771b3bc14610357578063ba3a4b9714610389578063bee0a03f146103a8578063c123c6db146103c7578063c599e24f146103e6578063d5f20ff6146103f9575f80fd5b806362065856146102bc57806366435abf146102db57806376f78621146102fa57806398f3e2b414610319578063a3a65e4814610338575f80fd5b806335455ded116100ee57806335455ded1461022457806340034a931461024c578063467ef06f1461025f5780635297fae61461027e57806361e2f4901461029d575f80fd5b80630118acc41461012a5780630322ed981461014b5780630cdd09851461016a578063151d30d1146101c75780632e2194d8146101ed575b5f80fd5b348015610135575f80fd5b506101496101443660046148d4565b610425565b005b348015610156575f80fd5b5061014961016536600461490f565b61088f565b348015610175575f80fd5b506101b461018436600461490f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b3480156101d2575f80fd5b506101db600a81565b60405160ff90911681526020016101be565b3480156101f8575f80fd5b5061020c61020736600461490f565b610a48565b6040516001600160401b0390911681526020016101be565b34801561022f575f80fd5b5061023961271081565b60405161ffff90911681526020016101be565b6101b461025a36600461494d565b610a5e565b34801561026a575f80fd5b506101496102793660046149a1565b610a92565b348015610289575f80fd5b506101496102983660046149ba565b610ae5565b3480156102a8575f80fd5b506101496102b73660046149e2565b610cba565b3480156102c7575f80fd5b506101b46102d6366004614a30565b6113e1565b3480156102e6575f80fd5b5061020c6102f536600461490f565b6113fa565b348015610305575f80fd5b506101496103143660046148d4565b61140e565b348015610324575f80fd5b506101496103333660046149ba565b6114ef565b348015610343575f80fd5b506101496103523660046149a1565b61171c565b348015610362575f80fd5b506103716005600160991b0181565b6040516001600160a01b0390911681526020016101be565b348015610394575f80fd5b506101496103a336600461490f565b6118d4565b3480156103b3575f80fd5b506101496103c236600461490f565b611b5a565b3480156103d2575f80fd5b506101496103e1366004614a49565b611c6e565b6101b46103f436600461490f565b611d50565b348015610404575f80fd5b5061041861041336600461490f565b611d81565b6040516101be9190614a74565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206154ee833981519152918415610477576104748285611e74565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104a9576104a9614a60565b60048111156104ba576104ba614a60565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561054157610541614a60565b146105935760405162461bcd60e51b815260206004820152602a60248201525f8051602061550e8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105f85760405162461bcd60e51b815260206004820152603360248201525f8051602061550e8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161058a565b5f61060284612110565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561064f5761064f614a60565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61072185611d81565b905082606001516001600160401b031681608001516001600160401b0316116107985760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161058a565b5f836060015182608001516107ad9190614b3e565b90506107b986826121a0565b5f6005600160991b0163ee5b48eb6107d28987866121e8565b6040518263ffffffff1660e01b81526004016107ee9190614b80565b6020604051808303815f875af115801561080a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082e9190614bb2565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061556e8339815191526020526040808220815160e0810190925280545f8051602061552e83398151915293929190829060ff1660058111156108dc576108dc614a60565b60058111156108ed576108ed614a60565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c614a60565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6121e8565b6040518263ffffffff1660e01b8152600401610a029190614b80565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a429190614bb2565b50505050565b5f610a5864e8d4a5100083614bdd565b92915050565b5f610a6761240d565b610a7384848434612444565b9050610a8b60015f8051602061554e83398151915255565b9392505050565b5f805160206154ee8339815191525f80610aab8461266a565b6040808201515f848152600588016020529190912054929450909250610a42916001600160401b03909116906001600160a01b03166129e2565b5f805160206154ee8339815191525f610afd846129f5565b90505f80610b0e8360400151612bcf565b50915091505f610b1d83611d81565b9050816001600160401b031681606001516001600160401b03161015610b555760405162461bcd60e51b815260040161058a90614bf0565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b9a5760405162461bcd60e51b815260040161058a90614c32565b60015f87815260068701602052604090205460ff166004811115610bc057610bc0614a60565b14610c295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f8051602061552e8339815191529060ff1615610d575760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbe9190614bb2565b836020013514610e205760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161058a565b30610e316060850160408601614c8f565b6001600160a01b031614610ea35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161058a565b5f610eb16060850185614caa565b905011610f105760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161058a565b5f610f1e6060850185614caa565b91505063ffffffff8110610f8a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b606482015260840161058a565b5f843560208601356014610fa46060890160408a01614c8f565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b828163ffffffff1610156112f9575f6110236060880188614caa565b8363ffffffff1681811061103957611039614cf6565b905060200281019061104b9190614d0a565b61105490614dba565b8051909150806110765760405162461bcd60e51b815260040161058a90614e51565b5f818152600787016020526040902054156110a35760405162461bcd60e51b815260040161058a90614e92565b8160400151516030146110c85760405162461bcd60e51b815260040161058a90614eda565b83825f0151836020015184604001516040516020016110ea9493929190614f27565b60408051808303601f190181528282528a35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905295505f916002916111389190614f76565b602060405180830381855afa158015611153573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111769190614bb2565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff1916600183600581111561120257611202614a60565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080806112f190614f87565b915050611007565b505f611304856129f5565b90505f6113148260400151612e0a565b9050806002846040516113279190614f76565b602060405180830381855afa158015611342573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113659190614bb2565b146113c95760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161058a565b5050506008909101805460ff19166001179055505050565b5f610a586001600160401b03831664e8d4a51000614fa9565b5f61140482611d81565b6080015192915050565b5f805160206154ee8339815191525f61142685611d81565b5f86815260058401602052604090205460a082015191925061145991600160b01b9091046001600160401b031690614fc0565b6001600160401b03164210156114cd5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161058a565b83156114df576114dd8584611e74565b505b6114e885612f73565b5050505050565b6114f761240d565b5f805160206154ee8339815191525f61150f846129f5565b90505f806115208360400151612bcf565b50915091505f61152f83611d81565b9050816001600160401b031681606001516001600160401b031610156115675760405162461bcd60e51b815260040161058a90614bf0565b5f8681526006860160205260409020600301546001600160401b03808416911611156115a55760405162461bcd60e51b815260040161058a90614c32565b60035f87815260068701602052604090205460ff1660048111156115cb576115cb614a60565b1461161f5760405162461bcd60e51b815260206004820152603160248201525f8051602061550e8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161058a565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526116c4916129e2565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061171860015f8051602061554e83398151915255565b5050565b5f8051602061552e8339815191525f611734836129f5565b90505f806117458360400151613269565b91509150806117a75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161058a565b5f828152600585016020526040812080546117c190614fe0565b90501180156117f3575060015f83815260068601602052604090205460ff1660058111156117f1576117f1614a60565b145b61180f5760405162461bcd60e51b815260040161058a90615012565b5f82815260058501602052604081206118279161486a565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206154ee83398151915293929190829060ff16600481111561193557611935614a60565b600481111561194657611946614a60565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119cd576119cd614a60565b14806119eb57506003815160048111156119e9576119e9614a60565b145b611a3f5760405162461bcd60e51b815260206004820152603260248201525f8051602061550e833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161058a565b5f611a4d8260400151611d81565b905080606001516001600160401b03165f03611ad15760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161058a565b6005600160991b016001600160a01b031663ee5b48eb611afe8460400151846060015185608001516121e8565b6040518263ffffffff1660e01b8152600401611b1a9190614b80565b6020604051808303815f875af1158015611b36573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114e89190614bb2565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f8051602061552e833981519152929190611ba290614fe0565b9050118015611bd4575060015f83815260068301602052604090205460ff166005811115611bd257611bd2614a60565b145b611bf05760405162461bcd60e51b815260040161058a90615012565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c299190600401615059565b6020604051808303815f875af1158015611c45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c699190614bb2565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611cb7575080546001600160401b03808416911610155b15611cd55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611cff8361340a565b805468ff0000000000000000191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f611d5961240d565b611d6482333461341e565b9050611d7c60015f8051602061554e83398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061556e83398151915290528390208351918201909352825491925f8051602061552e83398151915292829060ff166005811115611e0157611e01614a60565b6005811115611e1257611e12614a60565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ebf573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ee691908101906150ee565b9150915080611f495760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161058a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fb09190614bb2565b8251146120145760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161058a565b60208201516001600160a01b03161561208a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161058a565b5f80612099846040015161388b565b915091508187146121065760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161058a565b9695505050505050565b5f8181525f8051602061556e8339815191526020526040812060020180545f8051602061552e83398151915291600160401b9091046001600160401b031690600861215a836151c0565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b5f9182525f8051602061556e833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612261576122218160016151db565b61222c906008614fa9565b5081515f9083908390811061224357612243614cf6565b60200101906001600160f81b03191690815f1a90535060010161220d565b505f5b60048110156122cc576122788160036151db565b612283906008614fa9565b600263ffffffff16901c60f81b8282600261229e91906151ee565b815181106122ae576122ae614cf6565b60200101906001600160f81b03191690815f1a905350600101612264565b505f5b602081101561232e576122e381601f6151db565b6122ee906008614fa9565b86901c60f81b826123008360066151ee565b8151811061231057612310614cf6565b60200101906001600160f81b03191690815f1a9053506001016122cf565b505f5b6008811015612399576123458160076151db565b612350906008614fa9565b6001600160401b038616901c60f81b8261236b8360266151ee565b8151811061237b5761237b614cf6565b60200101906001600160f81b03191690815f1a905350600101612331565b505f5b6008811015612404576123b08160076151db565b6123bb906008614fa9565b6001600160401b038516901c60f81b826123d683602e6151ee565b815181106123e6576123e6614cf6565b60200101906001600160f81b03191690815f1a90535060010161239c565b50949350505050565b5f8051602061554e83398151915280546001190161243e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206154ee8339815191529061ffff861610801590612490575061271061ffff861611155b6124ac5760405162461bcd60e51b815260040161058a90615201565b60028101546001600160401b0390811690851610156125255760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161058a565b8054831080159061253a575080600101548311155b6125985760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207374616044820152681ad948185b5bdd5b9d60ba1b606482015260840161058a565b825f6125a382610a48565b90505f6125b08983613a63565b905060405180606001604052806125c43390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061554e83398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061552e8339815191525f6126b9856129f5565b90505f806126ca8360400151613269565b91509150801561272f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161058a565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561276057612760614a60565b600581111561277157612771614a60565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156127e2576127e2614a60565b148061280057506001825160058111156127fe576127fe614a60565b145b61285f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161058a565b60038251600581111561287457612874614a60565b0361288157506004612885565b5060055b6020808301515f908152600788019091526040812055818160058111156128ae576128ae614a60565b908160058111156128c1576128c1614a60565b9052505f84815260068701602052604090208251815484929190829060ff191660018360058111156128f5576128f5614a60565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156129a9576129a9614a60565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6117186001600160a01b03821683613ed7565b60408051606080820183525f8083526020830181905292820152905f8051602061552e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a6a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a9191908101906150ee565b9150915080612af15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b606482015260840161058a565b8254825114612b545760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161058a565b60208201516001600160a01b031615612bc75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161058a565b509392505050565b5f805f8351603614612bf35760405162461bcd60e51b815260040161058a9061524c565b5f805b6002811015612c4257612c0a8160016151db565b612c15906008614fa9565b61ffff16868281518110612c2b57612c2b614cf6565b016020015160f81c901b9190911790600101612bf6565b5061ffff811615612c655760405162461bcd60e51b815260040161058a90615295565b5f805b6004811015612cc057612c7c8160036151db565b612c87906008614fa9565b63ffffffff1687612c998360026151ee565b81518110612ca957612ca9614cf6565b016020015160f81c901b9190911790600101612c68565b5063ffffffff8116600414612ce75760405162461bcd60e51b815260040161058a906152d8565b5f805b6020811015612d3c57612cfe81601f6151db565b612d09906008614fa9565b88612d158360066151ee565b81518110612d2557612d25614cf6565b016020015160f81c901b9190911790600101612cea565b505f805b6008811015612d9b57612d548160076151db565b612d5f906008614fa9565b6001600160401b031689612d748360266151ee565b81518110612d8457612d84614cf6565b016020015160f81c901b9190911790600101612d40565b505f805b6008811015612dfa57612db38160076151db565b612dbe906008614fa9565b6001600160401b03168a612dd383602e6151ee565b81518110612de357612de3614cf6565b016020015160f81c901b9190911790600101612d9f565b5091989097509095509350505050565b5f8151602614612e2c5760405162461bcd60e51b815260040161058a9061524c565b5f805b6002811015612e7b57612e438160016151db565b612e4e906008614fa9565b61ffff16848281518110612e6457612e64614cf6565b016020015160f81c901b9190911790600101612e2f565b5061ffff811615612e9e5760405162461bcd60e51b815260040161058a90615295565b5f805b6004811015612ef957612eb58160036151db565b612ec0906008614fa9565b63ffffffff1685612ed28360026151ee565b81518110612ee257612ee2614cf6565b016020015160f81c901b9190911790600101612ea1565b5063ffffffff811615612f1e5760405162461bcd60e51b815260040161058a906152d8565b5f805b602081101561240457612f3581601f6151db565b612f40906008614fa9565b86612f4c8360066151ee565b81518110612f5c57612f5c614cf6565b016020015160f81c901b9190911790600101612f21565b5f8181525f8051602061556e8339815191526020526040808220815160e0810190925280545f8051602061552e83398151915293929190829060ff166005811115612fc057612fc0614a60565b6005811115612fd157612fd1614a60565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561304357613043614a60565b1461309f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161058a565b6130ac8160800151613f6a565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff191660018360058111156130f0576130f0614a60565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131a58461319f81612110565b5f6121e8565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906131d4908590600401614b80565b6020604051808303815f875af11580156131f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132149190614bb2565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461328c5760405162461bcd60e51b815260040161058a9061524c565b5f805b60028110156132db576132a38160016151db565b6132ae906008614fa9565b61ffff168582815181106132c4576132c4614cf6565b016020015160f81c901b919091179060010161328f565b5061ffff8116156132fe5760405162461bcd60e51b815260040161058a90615295565b5f805b6004811015613359576133158160036151db565b613320906008614fa9565b63ffffffff16866133328360026151ee565b8151811061334257613342614cf6565b016020015160f81c901b9190911790600101613301565b5063ffffffff81166003146133805760405162461bcd60e51b815260040161058a906152d8565b5f805b60208110156133d55761339781601f6151db565b6133a2906008614fa9565b876133ae8360066151ee565b815181106133be576133be614cf6565b016020015160f81c901b9190911790600101613383565b505f866026815181106133ea576133ea614cf6565b016020015191976001600160f81b03199092161515965090945050505050565b61341261410b565b61341b81614156565b50565b5f5f805160206154ee8339815191528161343784610a48565b90505f61344387611d81565b905060028151600581111561345a5761345a614a60565b146134b95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161058a565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b031661354c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161058a565b5f82826080015161355d9190614fc0565b6004850154604084015191925061357f916001600160401b039091169061531f565b6001600160401b0316816001600160401b031611156135fe5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161058a565b61360888826121a0565b5f61361289612110565b90505f898260405160200161363e92919091825260c01b6001600160c01b031916602082015260280190565b60405160208183030381529060405280519060200120905061365f85613f6a565b5f6005600160991b0163ee5b48eb6136788d86886121e8565b6040518263ffffffff1660e01b81526004016136949190614b80565b6020604051808303815f875af11580156136b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136d49190614bb2565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561375c5761375c614a60565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e146138ae5760405162461bcd60e51b815260040161058a9061524c565b5f805b60028110156138fd576138c58160016151db565b6138d0906008614fa9565b61ffff168582815181106138e6576138e6614cf6565b016020015160f81c901b91909117906001016138b1565b5061ffff8116156139205760405162461bcd60e51b815260040161058a90615295565b5f805b600481101561397b576139378160036151db565b613942906008614fa9565b63ffffffff16866139548360026151ee565b8151811061396457613964614cf6565b016020015160f81c901b9190911790600101613923565b5063ffffffff81166005146139a25760405162461bcd60e51b815260040161058a906152d8565b5f805b60208110156139f7576139b981601f6151db565b6139c4906008614fa9565b876139d08360066151ee565b815181106139e0576139e0614cf6565b016020015160f81c901b91909117906001016139a5565b505f805b6008811015613a5657613a0f8160076151db565b613a1a906008614fa9565b6001600160401b031688613a2f8360266151ee565b81518110613a3f57613a3f614cf6565b016020015160f81c901b91909117906001016139fb565b5090969095509350505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16613aee5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161058a565b5f8051602061552e83398151915242613b0d6040860160208701614a30565b6001600160401b0316118015613b465750613b2e6040850160208601614a30565b6001600160401b0316613b44426202a3006151ee565b115b613ba85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b606482015260840161058a565b8335613bc65760405162461bcd60e51b815260040161058a90614e51565b83355f90815260078201602052604090205415613bf55760405162461bcd60e51b815260040161058a90614e92565b613c02604085018561534a565b9050603014613c235760405162461bcd60e51b815260040161058a90614eda565b613c2c83613f6a565b5f80613cc66040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613c719190614a30565b6001600160401b03168152602001613c8c60408a018a61534a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141c8565b5f82815260058601602052604090209193509150613ce482826153d0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613d11908590600401614b80565b6020604051808303815f875af1158015613d2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d519190614bb2565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115613dc957613dc9614a60565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ea9918e01908e01614a30565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613efa5760405163cd78605960e01b815230600482015260240161058a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f43576040519150601f19603f3d011682016040523d82523d5f602084013e613f48565b606091505b5050905080611c6957604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f8051602061552e8339815191529060ff165f03613fa8575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e1090613ff090836151db565b1061400c576001600160401b038416604083015280825261402b565b838260400181815161401e9190614fc0565b6001600160401b03169052505b5f826020015183604001516064614042919061531f565b61404c919061548f565b600285015490915060ff90811690821611156140c75760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b606482015260840161058a565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661415457604051631afcd79f60e31b815260040160405180910390fd5b565b61415e61410b565b61416781614577565b61416f614590565b61341b6060820135608083013561418c60c0850160a08601614a30565b61419c60e0860160c087016154b4565b61ffff166141b1610100870160e088016154cd565b6141c361012088016101008901614c8f565b6145a0565b5f60608260800151516030146142325760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161058a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142a9576142698160016151db565b614274906008614fa9565b5081515f9083908390811061428b5761428b614cf6565b60200101906001600160f81b03191690815f1a905350600101614255565b505f5b6004811015614311576142c08160036151db565b6142cb906008614fa9565b600160ff919091161c60f81b826142e38360026151ee565b815181106142f3576142f3614cf6565b60200101906001600160f81b03191690815f1a9053506001016142ac565b505f5b602081101561436e578451816020811061433057614330614cf6565b1a60f81b826143408360066151ee565b8151811061435057614350614cf6565b60200101906001600160f81b03191690815f1a905350600101614314565b505f5b60208110156143ce578460200151816020811061439057614390614cf6565b1a60f81b826143a08360266151ee565b815181106143b0576143b0614cf6565b60200101906001600160f81b03191690815f1a905350600101614371565b505f5b6008811015614442576143e58160076151db565b6143f0906008614fa9565b60ff1685604001516001600160401b0316901c60f81b8282604661441491906151ee565b8151811061442457614424614cf6565b60200101906001600160f81b03191690815f1a9053506001016143d1565b505f5b60308110156144ad578460800151818151811061446457614464614cf6565b01602001516001600160f81b0319168261447f83604e6151ee565b8151811061448f5761448f614cf6565b60200101906001600160f81b03191690815f1a905350600101614445565b505f5b600881101561451f576144c48160076151db565b6144cf906008614fa9565b60608601516001600160401b0390811691161c60f81b826144f183607e6151ee565b8151811061450157614501614cf6565b60200101906001600160f81b03191690815f1a9053506001016144b0565b506002816040516145309190614f76565b602060405180830381855afa15801561454b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061456e9190614bb2565b94909350915050565b61457f61410b565b6145876147e4565b61341b816147ec565b61459861410b565b614154614862565b6145a861410b565b5f805160206154ee833981519152836146145760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161058a565b6127108411156146365760405162461bcd60e51b815260040161058a90615201565b8587111561469e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161058a565b5f8360ff161161470b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161058a565b600a60ff8416111561477d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161058a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b61415461410b565b6147f461410b565b80355f8051602061552e83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015561483e60608301604084016154cd565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b61265761410b565b50805461487690614fe0565b5f825580601f10614885575050565b601f0160209004905f5260205f209081019061341b91905b808211156148b0575f815560010161489d565b5090565b801515811461341b575f80fd5b803563ffffffff81168114611d7c575f80fd5b5f805f606084860312156148e6575f80fd5b8335925060208401356148f8816148b4565b9150614906604085016148c1565b90509250925092565b5f6020828403121561491f575f80fd5b5035919050565b803561ffff81168114611d7c575f80fd5b80356001600160401b0381168114611d7c575f80fd5b5f805f6060848603121561495f575f80fd5b83356001600160401b03811115614974575f80fd5b840160608187031215614985575f80fd5b925061499360208501614926565b915061490660408501614937565b5f602082840312156149b1575f80fd5b610a8b826148c1565b5f80604083850312156149cb575f80fd5b6149d4836148c1565b946020939093013593505050565b5f80604083850312156149f3575f80fd5b82356001600160401b03811115614a08575f80fd5b830160808186031215614a19575f80fd5b9150614a27602084016148c1565b90509250929050565b5f60208284031215614a40575f80fd5b610a8b82614937565b5f6101208284031215614a5a575f80fd5b50919050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614a9757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614ad260608401826001600160401b03169052565b506080830151614aed60808401826001600160401b03169052565b5060a0830151614b0860a08401826001600160401b03169052565b5060c0830151614b2360c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614b2357614b23614b2a565b5f5b83811015614b78578181015183820152602001614b60565b50505f910152565b602081525f8251806020840152614b9e816040850160208701614b5e565b601f01601f19169190910160400192915050565b5f60208284031215614bc2575f80fd5b5051919050565b634e487b7160e01b5f52601260045260245ffd5b5f82614beb57614beb614bc9565b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461341b575f80fd5b5f60208284031215614c9f575f80fd5b8135610a8b81614c7b565b5f808335601e19843603018112614cbf575f80fd5b8301803591506001600160401b03821115614cd8575f80fd5b6020019150600581901b3603821315614cef575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614d1e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614d5e57614d5e614d28565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614d8c57614d8c614d28565b604052919050565b5f6001600160401b03821115614dac57614dac614d28565b50601f01601f191660200190565b5f60608236031215614dca575f80fd5b614dd2614d3c565b823581526020614de3818501614937565b8183015260408401356001600160401b03811115614dff575f80fd5b840136601f820112614e0f575f80fd5b8035614e22614e1d82614d94565b614d64565b8181523684838501011115614e35575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551614f38818460208a01614b5e565b80830190508581526001600160401b0360c01b8560c01b1660208201528351614f68816028840160208801614b5e565b016028019695505050505050565b5f8251614d1e818460208701614b5e565b5f63ffffffff808316818103614f9f57614f9f614b2a565b6001019392505050565b8082028115828204841417610a5857610a58614b2a565b6001600160401b03818116838216019080821115614b2357614b23614b2a565b600181811c90821680614ff457607f821691505b602082108103614a5a57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461506b81614fe0565b806020870152604060018084165f811461508c57600181146150a8576150d5565b60ff19851660408a0152604084151560051b8a010195506150d5565b895f5260205f205f5b858110156150cc5781548b82018601529083019088016150b1565b8a016040019650505b509398975050505050505050565b8051611d7c816148b4565b5f80604083850312156150ff575f80fd5b82516001600160401b0380821115615115575f80fd5b9084019060608287031215615128575f80fd5b615130614d3c565b8251815260208084015161514381614c7b565b82820152604084015183811115615158575f80fd5b80850194505087601f85011261516c575f80fd5b8351925061517c614e1d84614d94565b838152888285870101111561518f575f80fd5b61519e84838301848801614b5e565b806040840152508195506151b38188016150e3565b9450505050509250929050565b5f6001600160401b03808316818103614f9f57614f9f614b2a565b81810381811115610a5857610a58614b2a565b80820180821115610a5857610a58614b2a565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461534257615342614b2a565b505092915050565b5f808335601e1984360301811261535f575f80fd5b8301803591506001600160401b03821115615378575f80fd5b602001915036819003821315614cef575f80fd5b601f821115611c6957805f5260205f20601f840160051c810160208510156153b15750805b601f840160051c820191505b818110156114e8575f81556001016153bd565b81516001600160401b038111156153e9576153e9614d28565b6153fd816153f78454614fe0565b8461538c565b602080601f831160018114615430575f84156154195750858301515b5f19600386901b1c1916600185901b178555615487565b5f85815260208120601f198616915b8281101561545e5788860151825594840194600190910190840161543f565b508582101561547b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b03808416806154a8576154a8614bc9565b92169190910492915050565b5f602082840312156154c4575f80fd5b610a8b82614926565b5f602082840312156154dd575f80fd5b813560ff81168114610a8b575f80fdfe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 74b6332a7..7e5f3ec03 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -72,7 +72,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"subnetID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"maximumHourlyChurn\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161372c38038061372c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6135df8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c80638da5cb5b11610093578063bee0a03f11610063578063bee0a03f1461023e578063c151c0b914610251578063d5f20ff614610264578063f2fde38b14610284575f80fd5b80638da5cb5b146101c657806397fb70d41461020a578063a3a65e481461021d578063b771b3bc14610230575f80fd5b806361e2f490116100ce57806361e2f4901461016d57806366435abf14610180578063715018a6146101ab5780638994ab49146101b3575f80fd5b80630322ed98146100f45780630cdd098514610109578063467ef06f1461015a575b5f80fd5b610107610102366004612ae3565b610297565b005b610147610117366004612ae3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b610107610168366004612b12565b610455565b61010761017b366004612b2b565b610463565b61019361018e366004612ae3565b610b93565b6040516001600160401b039091168152602001610151565b610107610ba7565b6101476101c1366004612ba5565b610bba565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610151565b610107610218366004612ae3565b610bd6565b61010761022b366004612b12565b610bea565b6101f26005600160991b0181565b61010761024c366004612ae3565b610da2565b61010761025f366004612bfa565b610eb1565b610277610272366004612ae3565b610fbf565b6040516101519190612c44565b610107610292366004612cfa565b6110b2565b5f8181525f805160206135b38339815191526020526040808220815160e0810190925280545f8051602061359383398151915293929190829060ff1660058111156102e4576102e4612c30565b60058111156102f5576102f5612c30565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561036457610364612c30565b146103ce5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103f38584606001515f6110ec565b6040518263ffffffff1660e01b815260040161040f9190612d3e565b6020604051808303815f875af115801561042b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044f9190612d70565b50505050565b61045e81611311565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206135938339815191529060ff16156105005760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103c5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610543573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105679190612d70565b8360200135146105c95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103c5565b306105da6060850160408601612cfa565b6001600160a01b03161461064c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103c5565b5f61065a6060850185612d87565b9050116106b95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103c5565b5f6106c76060850185612d87565b9150506001600160401b0381106107365760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103c5565b5f8435602086013560146107506060890160408a01612cfa565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b82816001600160401b03161015610aab575f6107d26060880188612d87565b836001600160401b03168181106107eb576107eb612dd3565b90506020028101906107fd9190612de7565b61080690612e97565b8051909150806108285760405162461bcd60e51b81526004016103c590612f2e565b5f818152600787016020526040902054156108555760405162461bcd60e51b81526004016103c590612f6f565b81604001515160301461087a5760405162461bcd60e51b81526004016103c590612fb7565b83825f01518360200151846040015160405160200161089c9493929190613004565b60408051808303601f190181528282528a35602084015260c086901b6001600160c01b031916838301528151602881850301815260489093019182905295505f916002916108ea9190613053565b602060405180830381855afa158015610905573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109289190612d70565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff191660018360058111156109b4576109b4612c30565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080610aa390613078565b9150506107b3565b505f610ab685611689565b90505f610ac68260400151611863565b905080600284604051610ad99190613053565b602060405180830381855afa158015610af4573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b179190612d70565b14610b7b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103c5565b5050506008909101805460ff19166001179055505050565b5f610b9d82610fbf565b6080015192915050565b610baf6119cc565b610bb85f611a27565b565b5f610bc36119cc565b610bcd8383611a97565b90505b92915050565b610bde6119cc565b610be781611f0b565b50565b5f805160206135938339815191525f610c0283611689565b90505f80610c138360400151612201565b9150915080610c755760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103c5565b5f82815260058501602052604081208054610c8f9061309d565b9050118015610cc1575060015f83815260068601602052604090205460ff166005811115610cbf57610cbf612c30565b145b610cdd5760405162461bcd60e51b81526004016103c5906130cf565b5f8281526005850160205260408120610cf591612a99565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f80516020613593833981519152929190610dea9061309d565b9050118015610e1c575060015f83815260068301602052604090205460ff166005811115610e1a57610e1a612c30565b145b610e385760405162461bcd60e51b81526004016103c5906130cf565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e719190600401613116565b6020604051808303815f875af1158015610e8d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045e9190612d70565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ef55750825b90505f826001600160401b03166001148015610f105750303b155b905081158015610f1e575080155b15610f3c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610f6657845460ff60401b1916600160401b1785555b610f7087876123a2565b8315610fb657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206135b383398151915290528390208351918201909352825491925f8051602061359383398151915292829060ff16600581111561103f5761103f612c30565b600581111561105057611050612c30565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6110ba6119cc565b6001600160a01b0381166110e357604051631e4fbdf760e01b81525f60048201526024016103c5565b610be781611a27565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611165576111258160016131a0565b6111309060086131b3565b5081515f9083908390811061114757611147612dd3565b60200101906001600160f81b03191690815f1a905350600101611111565b505f5b60048110156111d05761117c8160036131a0565b6111879060086131b3565b600263ffffffff16901c60f81b828260026111a291906131ca565b815181106111b2576111b2612dd3565b60200101906001600160f81b03191690815f1a905350600101611168565b505f5b6020811015611232576111e781601f6131a0565b6111f29060086131b3565b86901c60f81b826112048360066131ca565b8151811061121457611214612dd3565b60200101906001600160f81b03191690815f1a9053506001016111d3565b505f5b600881101561129d576112498160076131a0565b6112549060086131b3565b6001600160401b038616901c60f81b8261126f8360266131ca565b8151811061127f5761127f612dd3565b60200101906001600160f81b03191690815f1a905350600101611235565b505f5b6008811015611308576112b48160076131a0565b6112bf9060086131b3565b6001600160401b038516901c60f81b826112da83602e6131ca565b815181106112ea576112ea612dd3565b60200101906001600160f81b03191690815f1a9053506001016112a0565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206135938339815191525f61136085611689565b90505f806113718360400151612201565b9150915080156113d65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103c5565b5f828152600685016020526040808220815160e081019092528054829060ff16600581111561140757611407612c30565b600581111561141857611418612c30565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561148957611489612c30565b14806114a757506001825160058111156114a5576114a5612c30565b145b6115065760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103c5565b60038251600581111561151b5761151b612c30565b036115285750600461152c565b5060055b6020808301515f9081526007880190915260408120558181600581111561155557611555612c30565b9081600581111561156857611568612c30565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561159c5761159c612c30565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561165057611650612c30565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830181905292820152905f805160206135938339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156116fe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261172591908101906131ec565b91509150806117855760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103c5565b82548251146117e85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103c5565b60208201516001600160a01b03161561185b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103c5565b509392505050565b5f81516026146118855760405162461bcd60e51b81526004016103c5906132be565b5f805b60028110156118d45761189c8160016131a0565b6118a79060086131b3565b61ffff168482815181106118bd576118bd612dd3565b016020015160f81c901b9190911790600101611888565b5061ffff8116156118f75760405162461bcd60e51b81526004016103c590613307565b5f805b60048110156119525761190e8160036131a0565b6119199060086131b3565b63ffffffff168561192b8360026131ca565b8151811061193b5761193b612dd3565b016020015160f81c901b91909117906001016118fa565b5063ffffffff8116156119775760405162461bcd60e51b81526004016103c59061334a565b5f805b60208110156113085761198e81601f6131a0565b6119999060086131b3565b866119a58360066131ca565b815181106119b5576119b5612dd3565b016020015160f81c901b919091179060010161197a565b336119fe7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610bb85760405163118cdaa760e01b81523360048201526024016103c5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16611b225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103c5565b5f8051602061359383398151915242611b416040860160208701613391565b6001600160401b0316118015611b7a5750611b626040850160208601613391565b6001600160401b0316611b78426202a3006131ca565b115b611bdc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103c5565b8335611bfa5760405162461bcd60e51b81526004016103c590612f2e565b83355f90815260078201602052604090205415611c295760405162461bcd60e51b81526004016103c590612f6f565b611c3660408501856133aa565b9050603014611c575760405162461bcd60e51b81526004016103c590612fb7565b611c60836123c0565b5f80611cfa6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611ca59190613391565b6001600160401b03168152602001611cc060408a018a6133aa565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612561565b5f82815260058601602052604090209193509150611d188282613437565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d45908590600401612d3e565b6020604051808303815f875af1158015611d61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d859190612d70565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115611dfd57611dfd612c30565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611edd918e01908e01613391565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206135b38339815191526020526040808220815160e0810190925280545f8051602061359383398151915293929190829060ff166005811115611f5857611f58612c30565b6005811115611f6957611f69612c30565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611fdb57611fdb612c30565b146120375760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103c5565b61204481608001516123c0565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561208857612088612c30565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61213d8461213781612910565b5f6110ec565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061216c908590600401612d3e565b6020604051808303815f875af1158015612188573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121ac9190612d70565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146122245760405162461bcd60e51b81526004016103c5906132be565b5f805b60028110156122735761223b8160016131a0565b6122469060086131b3565b61ffff1685828151811061225c5761225c612dd3565b016020015160f81c901b9190911790600101612227565b5061ffff8116156122965760405162461bcd60e51b81526004016103c590613307565b5f805b60048110156122f1576122ad8160036131a0565b6122b89060086131b3565b63ffffffff16866122ca8360026131ca565b815181106122da576122da612dd3565b016020015160f81c901b9190911790600101612299565b5063ffffffff81166003146123185760405162461bcd60e51b81526004016103c59061334a565b5f805b602081101561236d5761232f81601f6131a0565b61233a9060086131b3565b876123468360066131ca565b8151811061235657612356612dd3565b016020015160f81c901b919091179060010161231b565b505f8660268151811061238257612382612dd3565b016020015191976001600160f81b03199092161515965090945050505050565b6123aa6129a0565b6123b3826129e9565b6123bc81612a02565b5050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206135938339815191529060ff165f036123fe575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061244690836131a0565b10612462576001600160401b0384166040830152808252612481565b838260400181815161247491906134f6565b6001600160401b03169052505b5f8260200151836040015160646124989190613516565b6124a29190613541565b600285015490915060ff908116908216111561251d5760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103c5565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f60608260800151516030146125cb5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103c5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612642576126028160016131a0565b61260d9060086131b3565b5081515f9083908390811061262457612624612dd3565b60200101906001600160f81b03191690815f1a9053506001016125ee565b505f5b60048110156126aa576126598160036131a0565b6126649060086131b3565b600160ff919091161c60f81b8261267c8360026131ca565b8151811061268c5761268c612dd3565b60200101906001600160f81b03191690815f1a905350600101612645565b505f5b602081101561270757845181602081106126c9576126c9612dd3565b1a60f81b826126d98360066131ca565b815181106126e9576126e9612dd3565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b6020811015612767578460200151816020811061272957612729612dd3565b1a60f81b826127398360266131ca565b8151811061274957612749612dd3565b60200101906001600160f81b03191690815f1a90535060010161270a565b505f5b60088110156127db5761277e8160076131a0565b6127899060086131b3565b60ff1685604001516001600160401b0316901c60f81b828260466127ad91906131ca565b815181106127bd576127bd612dd3565b60200101906001600160f81b03191690815f1a90535060010161276a565b505f5b603081101561284657846080015181815181106127fd576127fd612dd3565b01602001516001600160f81b0319168261281883604e6131ca565b8151811061282857612828612dd3565b60200101906001600160f81b03191690815f1a9053506001016127de565b505f5b60088110156128b85761285d8160076131a0565b6128689060086131b3565b60608601516001600160401b0390811691161c60f81b8261288a83607e6131ca565b8151811061289a5761289a612dd3565b60200101906001600160f81b03191690815f1a905350600101612849565b506002816040516128c99190613053565b602060405180830381855afa1580156128e4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129079190612d70565b94909350915050565b5f8181525f805160206135b38339815191526020526040812060020180545f8051602061359383398151915291600160401b9091046001600160401b031690600861295a83613078565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610bb857604051631afcd79f60e31b815260040160405180910390fd5b6129f16129a0565b6129f9612a13565b610be781612a1b565b612a0a6129a0565b610be781612a91565b610bb86129a0565b612a236129a0565b80355f8051602061359383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612a6d6060830160408401613572565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b6110ba6129a0565b508054612aa59061309d565b5f825580601f10612ab4575050565b601f0160209004905f5260205f2090810190610be791905b80821115612adf575f8155600101612acc565b5090565b5f60208284031215612af3575f80fd5b5035919050565b803563ffffffff81168114612b0d575f80fd5b919050565b5f60208284031215612b22575f80fd5b610bcd82612afa565b5f8060408385031215612b3c575f80fd5b82356001600160401b03811115612b51575f80fd5b830160808186031215612b62575f80fd5b9150612b7060208401612afa565b90509250929050565b5f60608284031215612b89575f80fd5b50919050565b80356001600160401b0381168114612b0d575f80fd5b5f8060408385031215612bb6575f80fd5b82356001600160401b03811115612bcb575f80fd5b612bd785828601612b79565b925050612b7060208401612b8f565b6001600160a01b0381168114610be7575f80fd5b5f8060808385031215612c0b575f80fd5b612c158484612b79565b91506060830135612c2581612be6565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612c6757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612ca260608401826001600160401b03169052565b506080830151612cbd60808401826001600160401b03169052565b5060a0830151612cd860a08401826001600160401b03169052565b5060c0830151612cf360c08401826001600160401b03169052565b5092915050565b5f60208284031215612d0a575f80fd5b8135612d1581612be6565b9392505050565b5f5b83811015612d36578181015183820152602001612d1e565b50505f910152565b602081525f8251806020840152612d5c816040850160208701612d1c565b601f01601f19169190910160400192915050565b5f60208284031215612d80575f80fd5b5051919050565b5f808335601e19843603018112612d9c575f80fd5b8301803591506001600160401b03821115612db5575f80fd5b6020019150600581901b3603821315612dcc575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612dfb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612e3b57612e3b612e05565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e6957612e69612e05565b604052919050565b5f6001600160401b03821115612e8957612e89612e05565b50601f01601f191660200190565b5f60608236031215612ea7575f80fd5b612eaf612e19565b823581526020612ec0818501612b8f565b8183015260408401356001600160401b03811115612edc575f80fd5b840136601f820112612eec575f80fd5b8035612eff612efa82612e71565b612e41565b8181523684838501011115612f12575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551613015818460208a01612d1c565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613045816028840160208801612d1c565b016028019695505050505050565b5f8251612dfb818460208701612d1c565b634e487b7160e01b5f52601160045260245ffd5b5f6001600160401b0380831681810361309357613093613064565b6001019392505050565b600181811c908216806130b157607f821691505b602082108103612b8957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546131288161309d565b806020870152604060018084165f8114613149576001811461316557613192565b60ff19851660408a0152604084151560051b8a01019550613192565b895f5260205f205f5b858110156131895781548b820186015290830190880161316e565b8a016040019650505b509398975050505050505050565b81810381811115610bd057610bd0613064565b8082028115828204841417610bd057610bd0613064565b80820180821115610bd057610bd0613064565b80518015158114612b0d575f80fd5b5f80604083850312156131fd575f80fd5b82516001600160401b0380821115613213575f80fd5b9084019060608287031215613226575f80fd5b61322e612e19565b8251815260208084015161324181612be6565b82820152604084015183811115613256575f80fd5b80850194505087601f85011261326a575f80fd5b8351925061327a612efa84612e71565b838152888285870101111561328d575f80fd5b61329c84838301848801612d1c565b806040840152508195506132b18188016131dd565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156133a1575f80fd5b610bcd82612b8f565b5f808335601e198436030181126133bf575f80fd5b8301803591506001600160401b038211156133d8575f80fd5b602001915036819003821315612dcc575f80fd5b601f82111561045e57805f5260205f20601f840160051c810160208510156134115750805b601f840160051c820191505b81811015613430575f815560010161341d565b5050505050565b81516001600160401b0381111561345057613450612e05565b6134648161345e845461309d565b846133ec565b602080601f831160018114613497575f84156134805750858301515b5f19600386901b1c1916600185901b1785556134ee565b5f85815260208120601f198616915b828110156134c5578886015182559484019460019091019084016134a6565b50858210156134e257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115612cf357612cf3613064565b6001600160401b0381811683821602808216919082811461353957613539613064565b505092915050565b5f6001600160401b038084168061356657634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f60208284031215613582575f80fd5b813560ff81168114612d15575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161373b38038061373b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6135ee8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c80638da5cb5b11610093578063bee0a03f11610063578063bee0a03f1461023e578063c151c0b914610251578063d5f20ff614610264578063f2fde38b14610284575f80fd5b80638da5cb5b146101c657806397fb70d41461020a578063a3a65e481461021d578063b771b3bc14610230575f80fd5b806361e2f490116100ce57806361e2f4901461016d57806366435abf14610180578063715018a6146101ab5780638994ab49146101b3575f80fd5b80630322ed98146100f45780630cdd098514610109578063467ef06f1461015a575b5f80fd5b610107610102366004612ada565b610297565b005b610147610117366004612ada565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07602052604090205490565b6040519081526020015b60405180910390f35b610107610168366004612b09565b610455565b61010761017b366004612b22565b610463565b61019361018e366004612ada565b610b8a565b6040516001600160401b039091168152602001610151565b610107610b9e565b6101476101c1366004612b9c565b610bb1565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610151565b610107610218366004612ada565b610bcd565b61010761022b366004612b09565b610be1565b6101f26005600160991b0181565b61010761024c366004612ada565b610d99565b61010761025f366004612bf1565b610ea8565b610277610272366004612ada565b610fb6565b6040516101519190612c3b565b610107610292366004612cf1565b6110a9565b5f8181525f805160206135c28339815191526020526040808220815160e0810190925280545f805160206135a283398151915293929190829060ff1660058111156102e4576102e4612c27565b60058111156102f5576102f5612c27565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561036457610364612c27565b146103ce5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6103f38584606001515f6110e3565b6040518263ffffffff1660e01b815260040161040f9190612d35565b6020604051808303815f875af115801561042b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061044f9190612d67565b50505050565b61045e81611308565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f805160206135a28339815191529060ff16156105005760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103c5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610543573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105679190612d67565b8360200135146105c95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103c5565b306105da6060850160408601612cf1565b6001600160a01b03161461064c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103c5565b5f61065a6060850185612d7e565b9050116106b95760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103c5565b5f6106c76060850185612d7e565b91505063ffffffff81106107335760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103c5565b5f84356020860135601461074d6060890160408a01612cf1565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f5b828163ffffffff161015610aa2575f6107cc6060880188612d7e565b8363ffffffff168181106107e2576107e2612dca565b90506020028101906107f49190612dde565b6107fd90612e8e565b80519091508061081f5760405162461bcd60e51b81526004016103c590612f25565b5f8181526007870160205260409020541561084c5760405162461bcd60e51b81526004016103c590612f66565b8160400151516030146108715760405162461bcd60e51b81526004016103c590612fae565b83825f0151836020015184604001516040516020016108939493929190612ffb565b60408051808303601f190181528282528a35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905295505f916002916108e1919061304a565b602060405180830381855afa1580156108fc573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061091f9190612d67565b5f8381526007890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260068c01909252909120815181549394509192909190829060ff191660018360058111156109ab576109ab612c27565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff191693851693909317909255855186820151925192909316825283917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080610a9a9061306f565b9150506107b0565b505f610aad85611680565b90505f610abd826040015161185a565b905080600284604051610ad0919061304a565b602060405180830381855afa158015610aeb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b0e9190612d67565b14610b725760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103c5565b5050506008909101805460ff19166001179055505050565b5f610b9482610fb6565b6080015192915050565b610ba66119c3565b610baf5f611a1e565b565b5f610bba6119c3565b610bc48383611a8e565b90505b92915050565b610bd56119c3565b610bde81611f02565b50565b5f805160206135a28339815191525f610bf983611680565b90505f80610c0a83604001516121f8565b9150915080610c6c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103c5565b5f82815260058501602052604081208054610c8690613091565b9050118015610cb8575060015f83815260068601602052604090205460ff166005811115610cb657610cb6612c27565b145b610cd45760405162461bcd60e51b81526004016103c5906130c3565b5f8281526005850160205260408120610cec91612a90565b5f8281526006850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260078b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb056020526040812080545f805160206135a2833981519152929190610de190613091565b9050118015610e13575060015f83815260068301602052604090205460ff166005811115610e1157610e11612c27565b145b610e2f5760405162461bcd60e51b81526004016103c5906130c3565b5f82815260058201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e68919060040161310a565b6020604051808303815f875af1158015610e84573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061045e9190612d67565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610eec5750825b90505f826001600160401b03166001148015610f075750303b155b905081158015610f15575080155b15610f335760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610f5d57845460ff60401b1916600160401b1785555b610f678787612399565b8315610fad57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206135c283398151915290528390208351918201909352825491925f805160206135a283398151915292829060ff16600581111561103657611036612c27565b600581111561104757611047612c27565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6110b16119c3565b6001600160a01b0381166110da57604051631e4fbdf760e01b81525f60048201526024016103c5565b610bde81611a1e565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561115c5761111c816001613194565b6111279060086131a7565b5081515f9083908390811061113e5761113e612dca565b60200101906001600160f81b03191690815f1a905350600101611108565b505f5b60048110156111c757611173816003613194565b61117e9060086131a7565b600263ffffffff16901c60f81b8282600261119991906131be565b815181106111a9576111a9612dca565b60200101906001600160f81b03191690815f1a90535060010161115f565b505f5b6020811015611229576111de81601f613194565b6111e99060086131a7565b86901c60f81b826111fb8360066131be565b8151811061120b5761120b612dca565b60200101906001600160f81b03191690815f1a9053506001016111ca565b505f5b600881101561129457611240816007613194565b61124b9060086131a7565b6001600160401b038616901c60f81b826112668360266131be565b8151811061127657611276612dca565b60200101906001600160f81b03191690815f1a90535060010161122c565b505f5b60088110156112ff576112ab816007613194565b6112b69060086131a7565b6001600160401b038516901c60f81b826112d183602e6131be565b815181106112e1576112e1612dca565b60200101906001600160f81b03191690815f1a905350600101611297565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206135a28339815191525f61135785611680565b90505f8061136883604001516121f8565b9150915080156113cd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103c5565b5f828152600685016020526040808220815160e081019092528054829060ff1660058111156113fe576113fe612c27565b600581111561140f5761140f612c27565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561148057611480612c27565b148061149e575060018251600581111561149c5761149c612c27565b145b6114fd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103c5565b60038251600581111561151257611512612c27565b0361151f57506004611523565b5060055b6020808301515f9081526007880190915260408120558181600581111561154c5761154c612c27565b9081600581111561155f5761155f612c27565b9052505f84815260068701602052604090208251815484929190829060ff1916600183600581111561159357611593612c27565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561164757611647612c27565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830181905292820152905f805160206135a28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156116f5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261171c91908101906131e0565b915091508061177c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103c5565b82548251146117df5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103c5565b60208201516001600160a01b0316156118525760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103c5565b509392505050565b5f815160261461187c5760405162461bcd60e51b81526004016103c5906132b2565b5f805b60028110156118cb57611893816001613194565b61189e9060086131a7565b61ffff168482815181106118b4576118b4612dca565b016020015160f81c901b919091179060010161187f565b5061ffff8116156118ee5760405162461bcd60e51b81526004016103c5906132fb565b5f805b600481101561194957611905816003613194565b6119109060086131a7565b63ffffffff16856119228360026131be565b8151811061193257611932612dca565b016020015160f81c901b91909117906001016118f1565b5063ffffffff81161561196e5760405162461bcd60e51b81526004016103c59061333e565b5f805b60208110156112ff5761198581601f613194565b6119909060086131a7565b8661199c8360066131be565b815181106119ac576119ac612dca565b016020015160f81c901b9190911790600101611971565b336119f57f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610baf5760405163118cdaa760e01b81523360048201526024016103c5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08545f9060ff16611b195760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103c5565b5f805160206135a283398151915242611b386040860160208701613385565b6001600160401b0316118015611b715750611b596040850160208601613385565b6001600160401b0316611b6f426202a3006131be565b115b611bd35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c69642072656769737460448201526c726174696f6e2065787069727960981b60648201526084016103c5565b8335611bf15760405162461bcd60e51b81526004016103c590612f25565b83355f90815260078201602052604090205415611c205760405162461bcd60e51b81526004016103c590612f66565b611c2d604085018561339e565b9050603014611c4e5760405162461bcd60e51b81526004016103c590612fae565b611c57836123b7565b5f80611cf16040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611c9c9190613385565b6001600160401b03168152602001611cb760408a018a61339e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612558565b5f82815260058601602052604090209193509150611d0f828261342b565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d3c908590600401612d35565b6020604051808303815f875af1158015611d58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d7c9190612d67565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600688019091522081518154829060ff19166001836005811115611df457611df4612c27565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611ed4918e01908e01613385565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206135c28339815191526020526040808220815160e0810190925280545f805160206135a283398151915293929190829060ff166005811115611f4f57611f4f612c27565b6005811115611f6057611f60612c27565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611fd257611fd2612c27565b1461202e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103c5565b61203b81608001516123b7565b60038152426001600160401b031660c08201525f83815260068301602052604090208151815483929190829060ff1916600183600581111561207f5761207f612c27565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121348461212e81612907565b5f6110e3565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612163908590600401612d35565b6020604051808303815f875af115801561217f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121a39190612d67565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80825160271461221b5760405162461bcd60e51b81526004016103c5906132b2565b5f805b600281101561226a57612232816001613194565b61223d9060086131a7565b61ffff1685828151811061225357612253612dca565b016020015160f81c901b919091179060010161221e565b5061ffff81161561228d5760405162461bcd60e51b81526004016103c5906132fb565b5f805b60048110156122e8576122a4816003613194565b6122af9060086131a7565b63ffffffff16866122c18360026131be565b815181106122d1576122d1612dca565b016020015160f81c901b9190911790600101612290565b5063ffffffff811660031461230f5760405162461bcd60e51b81526004016103c59061333e565b5f805b60208110156123645761232681601f613194565b6123319060086131a7565b8761233d8360066131be565b8151811061234d5761234d612dca565b016020015160f81c901b9190911790600101612312565b505f8660268151811061237957612379612dca565b016020015191976001600160f81b03199092161515965090945050505050565b6123a1612997565b6123aa826129e0565b6123b3816129f9565b5050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb02545f805160206135a28339815191529060ff165f036123f5575050565b60408051606081018252600383015480825260048401546001600160401b038082166020850152600160401b9091041692820192909252904290610e109061243d9083613194565b10612459576001600160401b0384166040830152808252612478565b838260400181815161246b91906134ea565b6001600160401b03169052505b5f82602001518360400151606461248f919061350a565b6124999190613535565b600285015490915060ff90811690821611156125145760405162461bcd60e51b815260206004820152603460248201527f56616c696461746f724d616e616765723a206d6178696d756d20686f75726c796044820152730818da1d5c9b881c985d1948195e18d95959195960621b60648201526084016103c5565b5050805160038301556020810151600490920180546040909201516001600160401b03908116600160401b026001600160801b031990931693169290921717905550565b5f60608260800151516030146125c25760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103c5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612639576125f9816001613194565b6126049060086131a7565b5081515f9083908390811061261b5761261b612dca565b60200101906001600160f81b03191690815f1a9053506001016125e5565b505f5b60048110156126a157612650816003613194565b61265b9060086131a7565b600160ff919091161c60f81b826126738360026131be565b8151811061268357612683612dca565b60200101906001600160f81b03191690815f1a90535060010161263c565b505f5b60208110156126fe57845181602081106126c0576126c0612dca565b1a60f81b826126d08360066131be565b815181106126e0576126e0612dca565b60200101906001600160f81b03191690815f1a9053506001016126a4565b505f5b602081101561275e578460200151816020811061272057612720612dca565b1a60f81b826127308360266131be565b8151811061274057612740612dca565b60200101906001600160f81b03191690815f1a905350600101612701565b505f5b60088110156127d257612775816007613194565b6127809060086131a7565b60ff1685604001516001600160401b0316901c60f81b828260466127a491906131be565b815181106127b4576127b4612dca565b60200101906001600160f81b03191690815f1a905350600101612761565b505f5b603081101561283d57846080015181815181106127f4576127f4612dca565b01602001516001600160f81b0319168261280f83604e6131be565b8151811061281f5761281f612dca565b60200101906001600160f81b03191690815f1a9053506001016127d5565b505f5b60088110156128af57612854816007613194565b61285f9060086131a7565b60608601516001600160401b0390811691161c60f81b8261288183607e6131be565b8151811061289157612891612dca565b60200101906001600160f81b03191690815f1a905350600101612840565b506002816040516128c0919061304a565b602060405180830381855afa1580156128db573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128fe9190612d67565b94909350915050565b5f8181525f805160206135c28339815191526020526040812060020180545f805160206135a283398151915291600160401b9091046001600160401b031690600861295183613566565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260069290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610baf57604051631afcd79f60e31b815260040160405180910390fd5b6129e8612997565b6129f0612a0a565b610bde81612a12565b612a01612997565b610bde81612a88565b610baf612997565b612a1a612997565b80355f805160206135a283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155612a646060830160408401613581565b60028201805460ff9290921660ff1992831617905560089091018054909116905550565b6110b1612997565b508054612a9c90613091565b5f825580601f10612aab575050565b601f0160209004905f5260205f2090810190610bde91905b80821115612ad6575f8155600101612ac3565b5090565b5f60208284031215612aea575f80fd5b5035919050565b803563ffffffff81168114612b04575f80fd5b919050565b5f60208284031215612b19575f80fd5b610bc482612af1565b5f8060408385031215612b33575f80fd5b82356001600160401b03811115612b48575f80fd5b830160808186031215612b59575f80fd5b9150612b6760208401612af1565b90509250929050565b5f60608284031215612b80575f80fd5b50919050565b80356001600160401b0381168114612b04575f80fd5b5f8060408385031215612bad575f80fd5b82356001600160401b03811115612bc2575f80fd5b612bce85828601612b70565b925050612b6760208401612b86565b6001600160a01b0381168114610bde575f80fd5b5f8060808385031215612c02575f80fd5b612c0c8484612b70565b91506060830135612c1c81612bdd565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612c5e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612c9960608401826001600160401b03169052565b506080830151612cb460808401826001600160401b03169052565b5060a0830151612ccf60a08401826001600160401b03169052565b5060c0830151612cea60c08401826001600160401b03169052565b5092915050565b5f60208284031215612d01575f80fd5b8135612d0c81612bdd565b9392505050565b5f5b83811015612d2d578181015183820152602001612d15565b50505f910152565b602081525f8251806020840152612d53816040850160208701612d13565b601f01601f19169190910160400192915050565b5f60208284031215612d77575f80fd5b5051919050565b5f808335601e19843603018112612d93575f80fd5b8301803591506001600160401b03821115612dac575f80fd5b6020019150600581901b3603821315612dc3575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612df2575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612e3257612e32612dfc565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612e6057612e60612dfc565b604052919050565b5f6001600160401b03821115612e8057612e80612dfc565b50601f01601f191660200190565b5f60608236031215612e9e575f80fd5b612ea6612e10565b823581526020612eb7818501612b86565b8183015260408401356001600160401b03811115612ed3575f80fd5b840136601f820112612ee3575f80fd5b8035612ef6612ef182612e68565b612e38565b8181523684838501011115612f09575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f855161300c818460208a01612d13565b80830190508581526001600160401b0360c01b8560c01b166020820152835161303c816028840160208801612d13565b016028019695505050505050565b5f8251612df2818460208701612d13565b634e487b7160e01b5f52601160045260245ffd5b5f63ffffffff8083168181036130875761308761305b565b6001019392505050565b600181811c908216806130a557607f821691505b602082108103612b8057634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461311c81613091565b806020870152604060018084165f811461313d576001811461315957613186565b60ff19851660408a0152604084151560051b8a01019550613186565b895f5260205f205f5b8581101561317d5781548b8201860152908301908801613162565b8a016040019650505b509398975050505050505050565b81810381811115610bc757610bc761305b565b8082028115828204841417610bc757610bc761305b565b80820180821115610bc757610bc761305b565b80518015158114612b04575f80fd5b5f80604083850312156131f1575f80fd5b82516001600160401b0380821115613207575f80fd5b908401906060828703121561321a575f80fd5b613222612e10565b8251815260208084015161323581612bdd565b8282015260408401518381111561324a575f80fd5b80850194505087601f85011261325e575f80fd5b8351925061326e612ef184612e68565b8381528882858701011115613281575f80fd5b61329084838301848801612d13565b806040840152508195506132a58188016131d1565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f60208284031215613395575f80fd5b610bc482612b86565b5f808335601e198436030181126133b3575f80fd5b8301803591506001600160401b038211156133cc575f80fd5b602001915036819003821315612dc3575f80fd5b601f82111561045e57805f5260205f20601f840160051c810160208510156134055750805b601f840160051c820191505b81811015613424575f8155600101613411565b5050505050565b81516001600160401b0381111561344457613444612dfc565b613458816134528454613091565b846133e0565b602080601f83116001811461348b575f84156134745750858301515b5f19600386901b1c1916600185901b1785556134e2565b5f85815260208120601f198616915b828110156134b95788860151825594840194600190910190840161349a565b50858210156134d657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03818116838216019080821115612cea57612cea61305b565b6001600160401b0381811683821602808216919082811461352d5761352d61305b565b505092915050565b5f6001600160401b038084168061355a57634e487b7160e01b5f52601260045260245ffd5b92169190910492915050565b5f6001600160401b038083168181036130875761308761305b565b5f60208284031215613591575f80fd5b813560ff81168114612d0c575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 50199321f..7dd43b6d6 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -124,7 +124,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ); uint256 numInitialValidators = subnetConversionData.initialValidators.length; require( - numInitialValidators < type(uint64).max, "ValidatorManager: too many initial validators" + numInitialValidators < type(uint32).max, "ValidatorManager: too many initial validators" ); // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's subnetConversionID. @@ -135,7 +135,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida subnetConversionData.validatorManagerAddress, uint32(numInitialValidators) ); - for (uint64 i; i < numInitialValidators; i++) { + for (uint32 i; i < numInitialValidators; i++) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; bytes32 nodeID = initialValidator.nodeID; require(nodeID != bytes32(0), "ValidatorManager: invalid node ID"); diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index 57f13e705..f338c58dc 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -91,12 +91,13 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { } // expected ValidationID for a node is SHA256 of concatenation of convertSubnetTxID and // it's index in the initial validators list - expectedValidationIDPreHash := make([]byte, 40) + expectedValidationIDPreHash := make([]byte, 36) copy(expectedValidationIDPreHash[0:32], convertSubnetTxId[:]) - binary.BigEndian.PutUint64(expectedValidationIDPreHash[32:40], 0) + binary.BigEndian.PutUint32(expectedValidationIDPreHash[32:36], 0) expectedValidationID := sha256.Sum256(expectedValidationIDPreHash) - subnetConversionDataBytes, err := subnetConversionData.Pack() + subnetConversionDataBytes, err := utils.PackSubnetConversionData(subnetConversionData) + // subnetConversionDataBytes, err := subnetConversionData.Pack() Expect(err).Should(BeNil()) Expect(len(subnetConversionDataBytes)).Should(BeNumerically("==", 180)) subnetConversionID := sha256.Sum256(subnetConversionDataBytes) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 797b9ccfd..94d5cc638 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -3,7 +3,10 @@ package utils import ( "context" "crypto/ecdsa" + "encoding/binary" + "fmt" "math/big" + "reflect" "time" "github.com/ava-labs/avalanchego/ids" @@ -32,6 +35,8 @@ const ( DefaultMinStakeAmount uint64 = 1e18 DefaultMaxStakeAmount uint64 = 10e18 DefaultMaxStakeMultiplier uint8 = 4 + + initialValidatorPackedLen = 88 ) // @@ -1251,3 +1256,112 @@ func WaitMinStakeDuration( big.NewInt(10), ) } + +// PackSubnetConversionData defines a packing function that works +// over any struct instance of SubnetConversionData since the abi-bindings +// process generates one for each of the different contracts. +func PackSubnetConversionData(data interface{}) ([]byte, error) { + v := reflect.ValueOf(data) + if v.Kind() != reflect.Struct { + return nil, fmt.Errorf("expected struct, got %s", v.Kind()) + } + // Define required fields and their expected types + requiredFields := map[string]reflect.Type{ + "ConvertSubnetTxID": reflect.TypeOf([32]byte{}), + "BlockchainID": reflect.TypeOf([32]byte{}), + "ValidatorManagerAddress": reflect.TypeOf(common.Address{}), + // InitialValidators is a slice of structs and handled separately + "InitialValidators": reflect.TypeOf([]struct{}{}), + } + // Check for required fields and types + for fieldName, expectedType := range requiredFields { + field := v.FieldByName(fieldName) + + if !field.IsValid() { + return nil, fmt.Errorf("field %s is missing", fieldName) + } + // Allow flexible types for InitialValidators by checking it contains structs + if fieldName == "InitialValidators" { + if field.Kind() != reflect.Slice || field.Type().Elem().Kind() != reflect.Struct { + return nil, fmt.Errorf("field %s has incorrect type: expected a slice of structs", fieldName) + } + } else { + if field.Type() != expectedType { + return nil, fmt.Errorf("field %s has incorrect type: expected %s, got %s", fieldName, expectedType, field.Type()) + } + } + } + + convertSubnetTxID := v.FieldByName("ConvertSubnetTxID").Interface().([32]byte) + blockchainID := v.FieldByName("BlockchainID").Interface().([32]byte) + validatorManagerAddress := v.FieldByName("ValidatorManagerAddress").Interface().(common.Address) + initialValidators := v.FieldByName("InitialValidators") + + packedLen := 92 + initialValidatorPackedLen*initialValidators.Len() + b := make([]byte, packedLen) + copy(b[0:32], convertSubnetTxID[:]) + copy(b[32:64], blockchainID[:]) + // These are evm addresses and have lengths of 20 so hardcoding here + binary.BigEndian.PutUint32(b[64:68], uint32(20)) + copy(b[68:88], validatorManagerAddress.Bytes()) + binary.BigEndian.PutUint32(b[88:92], uint32(initialValidators.Len())) + // Pack each InitialValidator struct + for i := 0; i < initialValidators.Len(); i++ { + iv := initialValidators.Index(i).Interface() + ivPacked, err := PackInitialValidator(iv) + if err != nil { + return nil, fmt.Errorf("failed to pack InitialValidator: %w", err) + } + if len(ivPacked) != initialValidatorPackedLen { + return nil, fmt.Errorf("expected packed InitialValidator to be %d bytes, got %d", initialValidatorPackedLen, len(ivPacked)) + } + copy(b[92+i*initialValidatorPackedLen:92+(i+1)*initialValidatorPackedLen], ivPacked) + } + return b, nil + +} + +// PackInitialValidator defines a packing function that works +// over any struct instance of InitialValidator since the abi-bindings +// process generates one for each of the different contracts. +func PackInitialValidator(iv interface{}) ([]byte, error) { + v := reflect.ValueOf(iv) + + // Ensure the passed interface is a struct + if v.Kind() != reflect.Struct { + return nil, fmt.Errorf("expected a struct, got %s", v.Kind()) + } + + // Define required fields and their expected types + requiredFields := map[string]reflect.Type{ + "NodeID": reflect.TypeOf([32]byte{}), + "Weight": reflect.TypeOf(uint64(0)), + "BlsPublicKey": reflect.TypeOf([]byte{}), + } + + // Check for required fields and types + for fieldName, expectedType := range requiredFields { + field := v.FieldByName(fieldName) + + if !field.IsValid() { + return nil, fmt.Errorf("field %s is missing", fieldName) + } + + if field.Type() != expectedType { + return nil, fmt.Errorf("field %s has incorrect type: expected %s, got %s", fieldName, expectedType, field.Type()) + } + } + + // At this point, we know the struct has all required fields with correct types + // Use reflection to retrieve field values and perform canonical packing + nodeID := v.FieldByName("NodeID").Interface().([32]byte) + weight := v.FieldByName("Weight").Interface().(uint64) + blsPublicKey := v.FieldByName("BlsPublicKey").Interface().([]byte) + + // Placeholder: Replace this with the actual packing logic + b := make([]byte, initialValidatorPackedLen) + copy(b[0:32], nodeID[:]) + binary.BigEndian.PutUint64(b[32:40], uint64(weight)) + copy(b[40:88], blsPublicKey) + return b, nil +} From 695aaff7fe080bff21e798986550b397576d4f0f Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Tue, 17 Sep 2024 03:08:04 -0400 Subject: [PATCH 302/545] move subnetConversion functions to helpers in utils --- .../go/staking/PoAValidatorManager/packing.go | 34 ---- tests/flows/staking/poa_to_pos.go | 11 ++ tests/flows/staking/poa_validator_manager.go | 54 +----- tests/utils/staking.go | 170 +++++++++++++++--- 4 files changed, 166 insertions(+), 103 deletions(-) delete mode 100644 abi-bindings/go/staking/PoAValidatorManager/packing.go diff --git a/abi-bindings/go/staking/PoAValidatorManager/packing.go b/abi-bindings/go/staking/PoAValidatorManager/packing.go deleted file mode 100644 index 7bc650ee8..000000000 --- a/abi-bindings/go/staking/PoAValidatorManager/packing.go +++ /dev/null @@ -1,34 +0,0 @@ -// (c) 2024, Ava Labs, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -package poavalidatormanager - -import "encoding/binary" - -func (s *SubnetConversionData) Pack() ([]byte, error) { - packedLen := 72 + len(s.ValidatorManagerAddress) + 88*len(s.InitialValidators) - - b := make([]byte, packedLen) - copy(b[0:32], s.ConvertSubnetTxID[:]) - copy(b[32:64], s.BlockchainID[:]) - // These are evm addresses and have lengths of 20 so hardcoding here - binary.BigEndian.PutUint32(b[64:68], uint32(20)) - copy(b[68:88], s.ValidatorManagerAddress.Bytes()) - binary.BigEndian.PutUint32(b[88:92], uint32(len(s.InitialValidators))) - for i, iv := range s.InitialValidators { - packedIv, err := iv.Pack() - if err != nil { - return nil, err - } - copy(b[92+i*88:92+(i+1)*88], packedIv) - } - return b, nil -} - -func (iv *InitialValidator) Pack() ([]byte, error) { - b := make([]byte, 88) - copy(b[0:32], iv.NodeID[:]) - binary.BigEndian.PutUint64(b[32:40], uint64(iv.Weight)) - copy(b[40:88], iv.BlsPublicKey) - return b, nil -} diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index 983b74559..2a48ac605 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -98,6 +98,17 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) + _ = utils.InitializePoAValidatorSet( + ctx, + fundedKey, + subnetAInfo, + pChainInfo, + poaValidatorManager, + proxyAddress, + network, + signatureAggregator, + ) + // Register a validator poaWeight := uint64(1) poaValidationID := utils.InitializeAndCompletePoAValidatorRegistration( diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index f338c58dc..ddaa09238 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -2,8 +2,6 @@ package staking import ( "context" - "crypto/sha256" - "encoding/binary" "math/big" "time" @@ -74,59 +72,17 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { pChainInfo, ownerAddress, ) - - convertSubnetTxId := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} - subnetConversionData := poavalidatormanager.SubnetConversionData{ - ConvertSubnetTxID: convertSubnetTxId, - BlockchainID: subnetAInfo.BlockchainID, - ValidatorManagerAddress: validatorManagerAddress, - InitialValidators: []poavalidatormanager.InitialValidator{ - { - NodeID: ids.GenerateTestID(), - Weight: 1, - BlsPublicKey: blsPublicKey[:], - }, - }, - } - // expected ValidationID for a node is SHA256 of concatenation of convertSubnetTxID and - // it's index in the initial validators list - expectedValidationIDPreHash := make([]byte, 36) - copy(expectedValidationIDPreHash[0:32], convertSubnetTxId[:]) - binary.BigEndian.PutUint32(expectedValidationIDPreHash[32:36], 0) - expectedValidationID := sha256.Sum256(expectedValidationIDPreHash) - - subnetConversionDataBytes, err := utils.PackSubnetConversionData(subnetConversionData) - // subnetConversionDataBytes, err := subnetConversionData.Pack() - Expect(err).Should(BeNil()) - Expect(len(subnetConversionDataBytes)).Should(BeNumerically("==", 180)) - subnetConversionID := sha256.Sum256(subnetConversionDataBytes) - - subnetConversionSignedMessage := utils.ConstructSubnetConversionMessage( - subnetConversionID, + _ = utils.InitializePoAValidatorSet( + ctx, + fundedKey, subnetAInfo, pChainInfo, + validatorManager, + validatorManagerAddress, network, signatureAggregator, ) - // Deliver the Warp message to the subnet - receipt := utils.InitializePoAValidatorSet( - fundedKey, - subnetAInfo, - validatorManagerAddress, - subnetConversionSignedMessage, - subnetConversionData, - ) - - initialValidatorCreatedEvent, err := utils.GetEventFromLogs( - receipt.Logs, - validatorManager.ParseInitialValidatorCreated, - ) - Expect(err).Should(BeNil()) - Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) - Expect(initialValidatorCreatedEvent.ValidationID).Should(Equal(expectedValidationID)) - var validationID ids.ID // To be used in the delisting step weight := uint64(1) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 94d5cc638..8e8915083 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -3,6 +3,7 @@ package utils import ( "context" "crypto/ecdsa" + "crypto/sha256" "encoding/binary" "fmt" "math/big" @@ -210,6 +211,148 @@ func DeployAndInitializePoAValidatorManager( return validatorManagerAddress, validatorManager } +// +// Validator Set Initialization utils +// + +func InitializeNativeTokenValidatorSet( + ctx context.Context, + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + validatorManagerAddress common.Address, +) { + +} + +func InitializeERC20TokenValidatorSet( + ctx context.Context, + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + validatorManagerAddress common.Address, +) { + +} + +func InitializePoAValidatorSet( + ctx context.Context, + sendingKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + validatorManager *poavalidatormanager.PoAValidatorManager, + validatorManagerAddress common.Address, + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, +) ids.ID { + + convertSubnetTxId := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} + subnetConversionData := poavalidatormanager.SubnetConversionData{ + ConvertSubnetTxID: convertSubnetTxId, + BlockchainID: subnetInfo.BlockchainID, + ValidatorManagerAddress: validatorManagerAddress, + InitialValidators: []poavalidatormanager.InitialValidator{ + { + NodeID: ids.GenerateTestID(), + Weight: 1, + BlsPublicKey: blsPublicKey[:], + }, + }, + } + + subnetConversionDataBytes, err := PackSubnetConversionData(subnetConversionData) + Expect(err).Should(BeNil()) + subnetConversionID := sha256.Sum256(subnetConversionDataBytes) + subnetConversionSignedMessage := ConstructSubnetConversionMessage( + subnetConversionID, + subnetInfo, + pChainInfo, + network, + signatureAggregator, + ) + // Deliver the Warp message to the subnet + receipt := DeliverPoASubnetConversion( + sendingKey, + subnetInfo, + validatorManagerAddress, + subnetConversionSignedMessage, + subnetConversionData, + ) + initialValidatorCreatedEvent, err := GetEventFromLogs( + receipt.Logs, + validatorManager.ParseInitialValidatorCreated, + ) + Expect(err).Should(BeNil()) + Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) + + expectedValidationID := CalculateSubnetConversionValidationId(convertSubnetTxId, 0) + emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) + Expect(emittedValidationID).Should(Equal(expectedValidationID)) + + return emittedValidationID +} + +func DeliverNativeTokenSubnetConversion( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + validatorManagerAddress common.Address, + subnetConversionSignedMessage *avalancheWarp.Message, + subnetConversionData nativetokenstakingmanager.SubnetConversionData, +) *types.Receipt { + abi, err := nativetokenstakingmanager.NativeTokenStakingManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("initializeValidatorSet", subnetConversionData, uint32(0)) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, + sendingKey, + subnet, + validatorManagerAddress, + subnetConversionSignedMessage, + ) +} + +func DeliverERC20TokenSubnetConversion( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + validatorManagerAddress common.Address, + subnetConversionSignedMessage *avalancheWarp.Message, + subnetConversionData erc20tokenstakingmanager.SubnetConversionData, +) *types.Receipt { + abi, err := erc20tokenstakingmanager.ERC20TokenStakingManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("initializeValidatorSet", subnetConversionData, uint32(0)) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, + sendingKey, + subnet, + validatorManagerAddress, + subnetConversionSignedMessage, + ) +} + +func DeliverPoASubnetConversion( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + validatorManagerAddress common.Address, + subnetConversionSignedMessage *avalancheWarp.Message, + subnetConversionData poavalidatormanager.SubnetConversionData, +) *types.Receipt { + abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() + Expect(err).Should(BeNil()) + callData, err := abi.Pack("initializeValidatorSet", subnetConversionData, uint32(0)) + Expect(err).Should(BeNil()) + return CallWarpReceiver( + callData, + sendingKey, + subnet, + validatorManagerAddress, + subnetConversionSignedMessage, + ) +} + // // Function call utils // @@ -376,26 +519,6 @@ func CompletePoAValidatorRegistration( ) } -func InitializePoAValidatorSet( - sendingKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, - validatorManagerAddress common.Address, - subnetConversionSignedMessage *avalancheWarp.Message, - subnetConversionData poavalidatormanager.SubnetConversionData, -) *types.Receipt { - abi, err := poavalidatormanager.PoAValidatorManagerMetaData.GetAbi() - Expect(err).Should(BeNil()) - callData, err := abi.Pack("initializeValidatorSet", subnetConversionData, uint32(0)) - Expect(err).Should(BeNil()) - return CallWarpReceiver( - callData, - sendingKey, - subnet, - validatorManagerAddress, - subnetConversionSignedMessage, - ) -} - // Calls a method that retreived a signed Warp message from the transaction's access list func CallWarpReceiver( callData []byte, @@ -1257,6 +1380,13 @@ func WaitMinStakeDuration( ) } +func CalculateSubnetConversionValidationId(convertSubnetTxID ids.ID, validatorIdx uint32) ids.ID { + preImage := make([]byte, 36) + copy(preImage[0:32], convertSubnetTxID[:]) + binary.BigEndian.PutUint32(preImage[32:36], validatorIdx) + return sha256.Sum256(preImage) +} + // PackSubnetConversionData defines a packing function that works // over any struct instance of SubnetConversionData since the abi-bindings // process generates one for each of the different contracts. From 57256e0433bace96e638e7f07122e688cf1c5e15 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 17 Sep 2024 10:30:15 -0400 Subject: [PATCH 303/545] mock initialize validator set --- .../tests/ERC20TokenStakingManagerTests.t.sol | 3 +++ .../NativeTokenStakingManagerTests.t.sol | 3 +++ .../tests/PoAValidatorManagerTests.t.sol | 5 ++++ .../staking/tests/ValidatorManagerTests.t.sol | 25 +++++++++++++++++-- 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index c2d3e8366..b319c686d 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -51,6 +51,9 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ); validatorManager = app; posValidatorManager = app; + _mockGetBlockchainID(); + _mockInitializeValidatorSet(); + app.initializeValidatorSet(_defaultSubnetConversionData(), 0); } function testZeroMinimumDelegationFee() public { diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 1f7105af6..27e33b474 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -43,6 +43,9 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { ); validatorManager = app; posValidatorManager = app; + _mockGetBlockchainID(); + _mockInitializeValidatorSet(); + app.initializeValidatorSet(_defaultSubnetConversionData(), 0); } function testZeroMinimumDelegationFee() public { diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index 595783c59..1ddeba842 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -31,8 +31,13 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { address(this) ); validatorManager = app; + _mockGetBlockchainID(); + _mockInitializeValidatorSet(); + app.initializeValidatorSet(_defaultSubnetConversionData(), 0); } + function testInitializeValidatorSet() public {} + function testInvalidOwnerRegistration() public { vm.prank(vm.addr(1)); vm.expectRevert( diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 5913cb5d0..b075ebe7f 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -6,7 +6,7 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; -import {ValidatorManager} from "../ValidatorManager.sol"; +import {ValidatorManager, SubnetConversionData, InitialValidator} from "../ValidatorManager.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; import {ValidatorStatus, ValidatorRegistrationInput} from "../interfaces/IValidatorManager.sol"; import { @@ -23,6 +23,8 @@ abstract contract ValidatorManagerTest is Test { bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes32 public constant DEFAULT_NODE_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); + bytes32 public constant DEFAULT_INTIIAL_VALIDATOR_NODE_ID = + bytes32(hex"2345678123456781234567812345678123456781234567812345678123456781"); bytes public constant DEFAULT_BLS_PUBLIC_KEY = bytes( hex"123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); @@ -335,7 +337,26 @@ abstract contract ValidatorManagerTest is Test { } function _mockInitializeValidatorSet() internal { - // _mockGetVerifiedWarpMessage() + bytes32 subnetConversionID = + bytes32(hex"a5835c1f2884fdac0e619a4976b0f50632c75fec523f438a646b371f46464eb9"); + _mockGetVerifiedWarpMessage( + ValidatorMessages.packSubnetConversionMessage(subnetConversionID), true + ); + } + + function _defaultSubnetConversionData() internal view returns (SubnetConversionData memory) { + InitialValidator[] memory initialValidators = new InitialValidator[](1); + initialValidators[0] = InitialValidator({ + nodeID: DEFAULT_INTIIAL_VALIDATOR_NODE_ID, + weight: DEFAULT_WEIGHT, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); + return SubnetConversionData({ + convertSubnetTxID: bytes32(0), + blockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, + validatorManagerAddress: address(validatorManager), + initialValidators: initialValidators + }); } function _initializeValidatorRegistration( From 5551db9515093d6a40ce66a0d9b93de16879daf7 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 17 Sep 2024 11:43:57 -0400 Subject: [PATCH 304/545] lint fixes --- contracts/staking/ERC20TokenStakingManager.sol | 5 +---- .../staking/NativeTokenStakingManager.sol | 5 +---- contracts/staking/ValidatorManager.sol | 4 ---- .../interfaces/IERC20TokenStakingManager.sol | 2 +- .../interfaces/INativeTokenStakingManager.sol | 2 +- .../staking/interfaces/IValidatorManager.sol | 2 -- .../tests/ERC20TokenStakingManagerTests.t.sol | 5 +---- .../tests/NativeTokenStakingManagerTests.t.sol | 5 +---- .../tests/PoAValidatorManagerTests.t.sol | 2 -- .../tests/PoSValidatorManagerTests.t.sol | 1 - .../staking/tests/ValidatorManagerTests.t.sol | 18 +++++++++--------- 11 files changed, 15 insertions(+), 36 deletions(-) diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/staking/ERC20TokenStakingManager.sol index e0f37c17e..ba72b68bd 100644 --- a/contracts/staking/ERC20TokenStakingManager.sol +++ b/contracts/staking/ERC20TokenStakingManager.sol @@ -13,10 +13,7 @@ import {SafeERC20TransferFrom} from "@utilities/SafeERC20TransferFrom.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, - PoSValidatorRequirements -} from "./interfaces/IPoSValidatorManager.sol"; +import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; import {ValidatorRegistrationInput} from "./interfaces/IValidatorManager.sol"; contract ERC20TokenStakingManager is diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index 5449ccd7e..ea0324160 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -11,10 +11,7 @@ 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, - PoSValidatorRequirements -} from "./interfaces/IPoSValidatorManager.sol"; +import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; import {ValidatorRegistrationInput} from "./interfaces/IValidatorManager.sol"; contract NativeTokenStakingManager is diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 26e7cff47..f40078c2c 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -105,10 +105,6 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ); $._maximumChurnPercentage = settings.maximumChurnPercentage; $._churnPeriodSeconds = settings.churnPeriodSeconds; - - // TODO Remove - this is a hack to get a starting total weight before - // adding an initial validator set is implemented. - $._churnTracker.totalWeight = 1e10; $._initializedValidatorSet = false; } diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/staking/interfaces/IERC20TokenStakingManager.sol index 680d81ce4..88a903d14 100644 --- a/contracts/staking/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/staking/interfaces/IERC20TokenStakingManager.sol @@ -6,7 +6,7 @@ pragma solidity 0.8.25; import {ValidatorRegistrationInput} from "./IValidatorManager.sol"; -import {IPoSValidatorManager, PoSValidatorRequirements} from "./IPoSValidatorManager.sol"; +import {IPoSValidatorManager} from "./IPoSValidatorManager.sol"; interface IERC20TokenStakingManager is IPoSValidatorManager { /** diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/staking/interfaces/INativeTokenStakingManager.sol index 4729acf0b..f46d6e649 100644 --- a/contracts/staking/interfaces/INativeTokenStakingManager.sol +++ b/contracts/staking/interfaces/INativeTokenStakingManager.sol @@ -6,7 +6,7 @@ pragma solidity 0.8.25; import {ValidatorRegistrationInput} from "./IValidatorManager.sol"; -import {IPoSValidatorManager, PoSValidatorRequirements} from "./IPoSValidatorManager.sol"; +import {IPoSValidatorManager} from "./IPoSValidatorManager.sol"; interface INativeTokenStakingManager is IPoSValidatorManager { /** diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index ff1d70398..59f8ef91c 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -3,8 +3,6 @@ // SPDX-License-Identifier: Ecosystem -import {EnumerableSet} from "@openzeppelin/contracts@5.0.2/utils/structs/EnumerableSet.sol"; - pragma solidity 0.8.25; enum ValidatorStatus { diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index a96720a72..9db5522c1 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -11,10 +11,7 @@ import { ValidatorManagerSettings, ValidatorRegistrationInput } from "../interfaces/IValidatorManager.sol"; -import { - PoSValidatorManagerSettings, - PoSValidatorRequirements -} from "../interfaces/IPoSValidatorManager.sol"; +import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {ExampleERC20} from "@mocks/ExampleERC20.sol"; diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 4967d5fff..2cf4243a7 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -11,10 +11,7 @@ import { ValidatorManagerSettings, ValidatorRegistrationInput } from "../interfaces/IValidatorManager.sol"; -import { - PoSValidatorManagerSettings, - PoSValidatorRequirements -} from "../interfaces/IPoSValidatorManager.sol"; +import {PoSValidatorManagerSettings} from "../interfaces/IPoSValidatorManager.sol"; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index ad719aaf5..ac924187d 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -37,8 +37,6 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { app.initializeValidatorSet(_defaultSubnetConversionData(), 0); } - function testInitializeValidatorSet() public {} - function testInvalidOwnerRegistration() public { vm.prank(vm.addr(1)); vm.expectRevert( diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 9a8c614f2..69364c70e 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -7,7 +7,6 @@ pragma solidity 0.8.25; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; -import {PoSValidatorRequirements} from "../interfaces/IPoSValidatorManager.sol"; import { WarpMessage, IWarpMessenger diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index fce830c6e..9a0fe3647 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -416,6 +416,15 @@ abstract contract ValidatorManagerTest is Test { ); } + function _initializeValidatorRegistration( + ValidatorRegistrationInput memory input, + uint64 weight + ) internal virtual returns (bytes32); + + function _initializeEndValidation(bytes32 validationID) internal virtual; + + function _beforeSend(uint256 amount, address spender) internal virtual; + function _defaultSubnetConversionData() internal view returns (SubnetConversionData memory) { InitialValidator[] memory initialValidators = new InitialValidator[](1); initialValidators[0] = InitialValidator({ @@ -431,15 +440,6 @@ abstract contract ValidatorManagerTest is Test { }); } - function _initializeValidatorRegistration( - ValidatorRegistrationInput memory input, - uint64 weight - ) internal virtual returns (bytes32); - - function _initializeEndValidation(bytes32 validationID) internal virtual; - - function _beforeSend(uint256 amount, address spender) internal virtual; - // 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 dac8d50e8c5ad8b7e841145e8e65d8340284bd39 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Tue, 17 Sep 2024 11:55:44 -0400 Subject: [PATCH 305/545] Update other tests and go mod tidy --- .../tests/PoSValidatorManagerTests.t.sol | 7 +- go.sum | 4 - tests/flows/staking/erc20_delegation.go | 14 ++- tests/flows/staking/erc20_token_staking.go | 14 ++- tests/flows/staking/native_delegation.go | 14 ++- tests/flows/staking/native_token_staking.go | 14 ++- tests/utils/staking.go | 102 +++++++++++++++++- 7 files changed, 156 insertions(+), 13 deletions(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 7d03d3096..213c45c5a 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -136,7 +136,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); vm.expectRevert(_formatErrorMessage("invalid stake amount")); - _initializeValidatorRegistration(registrationInput, DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MAXIMUM_STAKE + 1); + _initializeValidatorRegistration( + registrationInput, + DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_MINIMUM_STAKE_DURATION, + DEFAULT_MAXIMUM_STAKE + 1 + ); } function testInvalidInitializeEndTime() public { diff --git a/go.sum b/go.sum index c85251bf5..e3aceb38b 100644 --- a/go.sum +++ b/go.sum @@ -56,10 +56,6 @@ 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-0.20240814200552-b3b720666238 h1:zxFjHBPwGo1WaNa7FLbIWgHeYk3y+ivm7RUdq4lZAW8= -github.com/ava-labs/avalanchego v1.11.11-0.20240814200552-b3b720666238/go.mod h1:8pnf2At/q0LRq5dvYJYn3CkhKzZNHRd5pjARC9psu+g= -github.com/ava-labs/avalanchego v1.11.11-0.20240916162929-49fbcf01b980 h1:cWdx1WV5lQylGjz7Q+7SiuDdgmSegmT93BPSvfdkxm0= -github.com/ava-labs/avalanchego v1.11.11-0.20240916162929-49fbcf01b980/go.mod h1:8pnf2At/q0LRq5dvYJYn3CkhKzZNHRd5pjARC9psu+g= github.com/ava-labs/avalanchego v1.11.11-0.20240916181957-b328a0503042 h1:Hk9sK9TPPXoVyIvl4rC+v1HF2M2BvjINCLtLmkbqWMo= github.com/ava-labs/avalanchego v1.11.11-0.20240916181957-b328a0503042/go.mod h1:8pnf2At/q0LRq5dvYJYn3CkhKzZNHRd5pjARC9psu+g= github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814200841-1c435873fd12 h1:vcCa4wZTDPObQFauhjtkAqbHWty3vXQaoPJMFgptnWM= diff --git a/tests/flows/staking/erc20_delegation.go b/tests/flows/staking/erc20_delegation.go index 87bd34e6e..471ab39af 100644 --- a/tests/flows/staking/erc20_delegation.go +++ b/tests/flows/staking/erc20_delegation.go @@ -36,15 +36,27 @@ func ERC20Delegation(network interfaces.LocalNetwork) { ids.Empty, // Primary network subnet ID }, ) + ctx := context.Background() // Deploy the staking manager contract stakingManagerAddress, stakingManager, _, erc20 := utils.DeployAndInitializeERC20TokenStakingManager( - context.Background(), + ctx, fundedKey, subnetAInfo, pChainInfo, ) + _ = utils.InitializeERC20TokenValidatorSet( + ctx, + fundedKey, + subnetAInfo, + pChainInfo, + stakingManager, + stakingManagerAddress, + network, + signatureAggregator, + ) + // // Register a validator // diff --git a/tests/flows/staking/erc20_token_staking.go b/tests/flows/staking/erc20_token_staking.go index 7c3fd4e07..a62fdfc0f 100644 --- a/tests/flows/staking/erc20_token_staking.go +++ b/tests/flows/staking/erc20_token_staking.go @@ -41,15 +41,27 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { ids.Empty, // Primary network subnet ID }, ) + ctx := context.Background() // Deploy the staking manager contract stakingManagerAddress, stakingManager, _, erc20 := utils.DeployAndInitializeERC20TokenStakingManager( - context.Background(), + ctx, fundedKey, subnetAInfo, pChainInfo, ) + _ = utils.InitializeERC20TokenValidatorSet( + ctx, + fundedKey, + subnetAInfo, + pChainInfo, + stakingManager, + stakingManagerAddress, + network, + signatureAggregator, + ) + // // Register a validator // diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go index 3de9608f0..9e7d17498 100644 --- a/tests/flows/staking/native_delegation.go +++ b/tests/flows/staking/native_delegation.go @@ -36,15 +36,27 @@ func NativeDelegation(network interfaces.LocalNetwork) { ids.Empty, // Primary network subnet ID }, ) + ctx := context.Background() // Deploy the staking manager contract stakingManagerAddress, stakingManager := utils.DeployAndInitializeNativeTokenStakingManager( - context.Background(), + ctx, fundedKey, subnetAInfo, pChainInfo, ) + _ = utils.InitializeNativeTokenValidatorSet( + ctx, + fundedKey, + subnetAInfo, + pChainInfo, + stakingManager, + stakingManagerAddress, + network, + signatureAggregator, + ) + // // Register a validator // diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index 77ac8b6c3..c57fe136c 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -41,15 +41,27 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { ids.Empty, // Primary network subnet ID }, ) + ctx := context.Background() // Deploy the staking manager contract stakingManagerContractAddress, stakingManager := utils.DeployAndInitializeNativeTokenStakingManager( - context.Background(), + ctx, fundedKey, subnetAInfo, pChainInfo, ) + _ = utils.InitializeNativeTokenValidatorSet( + ctx, + fundedKey, + subnetAInfo, + pChainInfo, + stakingManager, + stakingManagerContractAddress, + network, + signatureAggregator, + ) + // // Register a validator // diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 8e8915083..fd471098e 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -218,20 +218,114 @@ func DeployAndInitializePoAValidatorManager( func InitializeNativeTokenValidatorSet( ctx context.Context, sendingKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + subnetInfo interfaces.SubnetTestInfo, pChainInfo interfaces.SubnetTestInfo, + validatorManager *nativetokenstakingmanager.NativeTokenStakingManager, validatorManagerAddress common.Address, -) { + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, +) ids.ID { + convertSubnetTxId := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} + subnetConversionData := nativetokenstakingmanager.SubnetConversionData{ + ConvertSubnetTxID: convertSubnetTxId, + BlockchainID: subnetInfo.BlockchainID, + ValidatorManagerAddress: validatorManagerAddress, + InitialValidators: []nativetokenstakingmanager.InitialValidator{ + { + NodeID: ids.GenerateTestID(), + Weight: 1, + BlsPublicKey: blsPublicKey[:], + }, + }, + } + subnetConversionDataBytes, err := PackSubnetConversionData(subnetConversionData) + Expect(err).Should(BeNil()) + subnetConversionID := sha256.Sum256(subnetConversionDataBytes) + subnetConversionSignedMessage := ConstructSubnetConversionMessage( + subnetConversionID, + subnetInfo, + pChainInfo, + network, + signatureAggregator, + ) + // Deliver the Warp message to the subnet + receipt := DeliverNativeTokenSubnetConversion( + sendingKey, + subnetInfo, + validatorManagerAddress, + subnetConversionSignedMessage, + subnetConversionData, + ) + initialValidatorCreatedEvent, err := GetEventFromLogs( + receipt.Logs, + validatorManager.ParseInitialValidatorCreated, + ) + Expect(err).Should(BeNil()) + Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) + + expectedValidationID := CalculateSubnetConversionValidationId(convertSubnetTxId, 0) + emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) + Expect(emittedValidationID).Should(Equal(expectedValidationID)) + + return emittedValidationID } func InitializeERC20TokenValidatorSet( ctx context.Context, sendingKey *ecdsa.PrivateKey, - subnet interfaces.SubnetTestInfo, + subnetInfo interfaces.SubnetTestInfo, pChainInfo interfaces.SubnetTestInfo, + validatorManager *erc20tokenstakingmanager.ERC20TokenStakingManager, validatorManagerAddress common.Address, -) { + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, +) ids.ID { + convertSubnetTxId := ids.GenerateTestID() + blsPublicKey := [bls.PublicKeyLen]byte{} + subnetConversionData := erc20tokenstakingmanager.SubnetConversionData{ + ConvertSubnetTxID: convertSubnetTxId, + BlockchainID: subnetInfo.BlockchainID, + ValidatorManagerAddress: validatorManagerAddress, + InitialValidators: []erc20tokenstakingmanager.InitialValidator{ + { + NodeID: ids.GenerateTestID(), + Weight: 1, + BlsPublicKey: blsPublicKey[:], + }, + }, + } + subnetConversionDataBytes, err := PackSubnetConversionData(subnetConversionData) + Expect(err).Should(BeNil()) + subnetConversionID := sha256.Sum256(subnetConversionDataBytes) + subnetConversionSignedMessage := ConstructSubnetConversionMessage( + subnetConversionID, + subnetInfo, + pChainInfo, + network, + signatureAggregator, + ) + // Deliver the Warp message to the subnet + receipt := DeliverERC20TokenSubnetConversion( + sendingKey, + subnetInfo, + validatorManagerAddress, + subnetConversionSignedMessage, + subnetConversionData, + ) + initialValidatorCreatedEvent, err := GetEventFromLogs( + receipt.Logs, + validatorManager.ParseInitialValidatorCreated, + ) + Expect(err).Should(BeNil()) + Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) + + expectedValidationID := CalculateSubnetConversionValidationId(convertSubnetTxId, 0) + emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) + Expect(emittedValidationID).Should(Equal(expectedValidationID)) + + return emittedValidationID } From 19f4998a0661763f3b0f5d54ed6f5f434d094fb4 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Tue, 17 Sep 2024 12:05:36 -0400 Subject: [PATCH 306/545] lint --- tests/utils/staking.go | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 69eddb307..726a5989c 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -274,7 +274,6 @@ func InitializeNativeTokenValidatorSet( Expect(emittedValidationID).Should(Equal(expectedValidationID)) return emittedValidationID - } func InitializeERC20TokenValidatorSet( @@ -331,7 +330,6 @@ func InitializeERC20TokenValidatorSet( Expect(emittedValidationID).Should(Equal(expectedValidationID)) return emittedValidationID - } func InitializePoAValidatorSet( @@ -344,7 +342,6 @@ func InitializePoAValidatorSet( network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, ) ids.ID { - convertSubnetTxId := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} subnetConversionData := poavalidatormanager.SubnetConversionData{ @@ -1392,7 +1389,10 @@ func ConstructSubnetConversionMessage( ) *avalancheWarp.Message { subnetConversionPayload, err := warpMessages.NewSubnetConversion(subnetConversionID) Expect(err).Should(BeNil()) - subnetConversionAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), subnetConversionPayload.Bytes()) + subnetConversionAddressedCall, err := warpPayload.NewAddressedCall( + common.Address{}.Bytes(), + subnetConversionPayload.Bytes(), + ) Expect(err).Should(BeNil()) subnetConversionUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( network.GetNetworkID(), @@ -1542,12 +1542,15 @@ func PackSubnetConversionData(data interface{}) ([]byte, error) { return nil, fmt.Errorf("failed to pack InitialValidator: %w", err) } if len(ivPacked) != initialValidatorPackedLen { - return nil, fmt.Errorf("expected packed InitialValidator to be %d bytes, got %d", initialValidatorPackedLen, len(ivPacked)) + return nil, fmt.Errorf( + "expected packed InitialValidator to be %d bytes, got %d", + initialValidatorPackedLen, + len(ivPacked), + ) } copy(b[92+i*initialValidatorPackedLen:92+(i+1)*initialValidatorPackedLen], ivPacked) } return b, nil - } // PackInitialValidator defines a packing function that works @@ -1590,7 +1593,7 @@ func PackInitialValidator(iv interface{}) ([]byte, error) { // Placeholder: Replace this with the actual packing logic b := make([]byte, initialValidatorPackedLen) copy(b[0:32], nodeID[:]) - binary.BigEndian.PutUint64(b[32:40], uint64(weight)) + binary.BigEndian.PutUint64(b[32:40], weight) copy(b[40:88], blsPublicKey) return b, nil } From 4fb66c932f618b76cef3cc689e362362e897602d Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 17 Sep 2024 12:06:45 -0400 Subject: [PATCH 307/545] update test to fix churn tracking --- contracts/staking/ValidatorManager.sol | 5 +++++ contracts/staking/tests/ValidatorManagerTests.t.sol | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index f40078c2c..76866fd03 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -150,6 +150,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida subnetConversionData.validatorManagerAddress, uint32(numInitialValidators) ); + + uint256 totalWeight; for (uint256 i; i < numInitialValidators; i++) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; bytes32 nodeID = initialValidator.nodeID; @@ -177,6 +179,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida sha256(abi.encodePacked(subnetConversionData.convertSubnetTxID, i)); // Save the initial validator as an active validator. + $._activeValidators[nodeID] = validationID; $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.Active, @@ -187,11 +190,13 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida startedAt: uint64(block.timestamp), endedAt: 0 }); + totalWeight += initialValidator.weight; emit InitialValidatorCreated( validationID, initialValidator.nodeID, initialValidator.weight ); } + $._churnTracker.totalWeight = totalWeight; // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's subnetConversionID. WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 9a0fe3647..54662f1b5 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -30,9 +30,12 @@ abstract contract ValidatorManagerTest is Test { ); bytes32 public constant DEFAULT_SOURCE_BLOCKCHAIN_ID = bytes32(hex"abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd"); + bytes32 public constant DEFAULT_SUBNET_CONVERSION_TX_ID = + bytes32(hex"1fa884c03c55ff866c210963db9100dd14964615da464c6b9871854374bb6026"); address public constant WARP_PRECOMPILE_ADDRESS = 0x0200000000000000000000000000000000000005; uint64 public constant DEFAULT_WEIGHT = 1e6; + uint64 public constant DEFAULT_INITIAL_VALIDATOR_WEIGHT = DEFAULT_WEIGHT * 1e4; uint256 public constant DEFAULT_MINIMUM_STAKE_AMOUNT = 20e12; uint256 public constant DEFAULT_MAXIMUM_STAKE_AMOUNT = 1e22; uint64 public constant DEFAULT_CHURN_PERIOD = 1 hours; @@ -409,10 +412,8 @@ abstract contract ValidatorManagerTest is Test { } function _mockInitializeValidatorSet() internal { - bytes32 subnetConversionID = - bytes32(hex"a5835c1f2884fdac0e619a4976b0f50632c75fec523f438a646b371f46464eb9"); _mockGetVerifiedWarpMessage( - ValidatorMessages.packSubnetConversionMessage(subnetConversionID), true + ValidatorMessages.packSubnetConversionMessage(DEFAULT_SUBNET_CONVERSION_TX_ID), true ); } @@ -429,7 +430,7 @@ abstract contract ValidatorManagerTest is Test { InitialValidator[] memory initialValidators = new InitialValidator[](1); initialValidators[0] = InitialValidator({ nodeID: DEFAULT_INTIIAL_VALIDATOR_NODE_ID, - weight: DEFAULT_WEIGHT, + weight: DEFAULT_INITIAL_VALIDATOR_WEIGHT, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); return SubnetConversionData({ From 410fef4886df9352bf4dcb80711eb186438cb18c Mon Sep 17 00:00:00 2001 From: minghinmatthewlam Date: Tue, 17 Sep 2024 12:10:58 -0400 Subject: [PATCH 308/545] Update contracts/staking/interfaces/IValidatorManager.sol Co-authored-by: Michael Kaplan <55204436+michaelkaplan13@users.noreply.github.com> Signed-off-by: minghinmatthewlam --- contracts/staking/interfaces/IValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 59f8ef91c..78be44d0b 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -121,7 +121,7 @@ interface IValidatorManager { * @notice Verifies and sets the initial validator set for the chain through a P-Chain * SubnetConversionMessage. * @param subnetConversionData The subnet conversion message data used to recompute and verify against the subnetConversionID. - * @param messsageIndex The storage slot index that contains the SubnetConversionMessage Warp message. + * @param messsageIndex The index that contains the SubnetConversionMessage Warp message in the transaction. */ function initializeValidatorSet( SubnetConversionData calldata subnetConversionData, From 766ebdf036e010cadb36b49e081d9ee2db8fd0af Mon Sep 17 00:00:00 2001 From: minghinmatthewlam Date: Tue, 17 Sep 2024 12:11:16 -0400 Subject: [PATCH 309/545] Update contracts/staking/ValidatorManager.sol Co-authored-by: Michael Kaplan <55204436+michaelkaplan13@users.noreply.github.com> Signed-off-by: minghinmatthewlam --- contracts/staking/ValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 76866fd03..af0311773 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -152,7 +152,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ); uint256 totalWeight; - for (uint256 i; i < numInitialValidators; i++) { + for (uint256 i; i < numInitialValidators; ++i) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; bytes32 nodeID = initialValidator.nodeID; require(nodeID != bytes32(0), "ValidatorManager: invalid node ID"); From 05e2cfd2282c27f0134a9970ede4cc4c9efd7bbd Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 17 Sep 2024 12:14:28 -0400 Subject: [PATCH 310/545] fix comment --- contracts/staking/ValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index af0311773..1841d841e 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -397,7 +397,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida * 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 + * @return The Validator instance representing the completed validation period and the corresponding validation ID. */ function _completeEndValidation(uint32 messageIndex) internal From f03a1f1585f20623dbb3c188823d0b7ccc7530fa Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Tue, 17 Sep 2024 12:50:55 -0400 Subject: [PATCH 311/545] make weight configurable for poa --- tests/flows/staking/poa_to_pos.go | 1 + tests/flows/staking/poa_validator_manager.go | 1 + tests/utils/staking.go | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index cb8bf6c87..e469bb7ab 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -108,6 +108,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { proxyAddress, network, signatureAggregator, + 20, ) // Register a validator diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index ddaa09238..fd31fa53d 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -81,6 +81,7 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { validatorManagerAddress, network, signatureAggregator, + 5, ) var validationID ids.ID // To be used in the delisting step diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 726a5989c..347838314 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -341,6 +341,7 @@ func InitializePoAValidatorSet( validatorManagerAddress common.Address, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, + initialValidatorWeight uint64, ) ids.ID { convertSubnetTxId := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} @@ -351,7 +352,7 @@ func InitializePoAValidatorSet( InitialValidators: []poavalidatormanager.InitialValidator{ { NodeID: ids.GenerateTestID(), - Weight: 1, + Weight: initialValidatorWeight, BlsPublicKey: blsPublicKey[:], }, }, @@ -381,6 +382,7 @@ func InitializePoAValidatorSet( ) Expect(err).Should(BeNil()) Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) + Expect(initialValidatorCreatedEvent.Weight).Should(Equal(initialValidatorWeight)) expectedValidationID := CalculateSubnetConversionValidationId(convertSubnetTxId, 0) emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) From 2fd77835726a3e4099f0bc34011e5cd513620905 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Tue, 17 Sep 2024 13:20:34 -0400 Subject: [PATCH 312/545] fix churn --- tests/flows/staking/erc20_delegation.go | 1 + tests/flows/staking/erc20_token_staking.go | 1 + tests/flows/staking/native_delegation.go | 1 + tests/flows/staking/native_token_staking.go | 1 + tests/utils/staking.go | 10 +++++++--- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/tests/flows/staking/erc20_delegation.go b/tests/flows/staking/erc20_delegation.go index 471ab39af..4dd2cdc5e 100644 --- a/tests/flows/staking/erc20_delegation.go +++ b/tests/flows/staking/erc20_delegation.go @@ -55,6 +55,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { stakingManagerAddress, network, signatureAggregator, + utils.DefaultMinStakeAmount*10, ) // diff --git a/tests/flows/staking/erc20_token_staking.go b/tests/flows/staking/erc20_token_staking.go index a62fdfc0f..a6c3f9b72 100644 --- a/tests/flows/staking/erc20_token_staking.go +++ b/tests/flows/staking/erc20_token_staking.go @@ -60,6 +60,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakingManagerAddress, network, signatureAggregator, + utils.DefaultMinStakeAmount*10, ) // diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go index 9e7d17498..d8b7676e4 100644 --- a/tests/flows/staking/native_delegation.go +++ b/tests/flows/staking/native_delegation.go @@ -55,6 +55,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { stakingManagerAddress, network, signatureAggregator, + utils.DefaultMinStakeAmount*10, ) // diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index c57fe136c..80e668cb2 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -60,6 +60,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { stakingManagerContractAddress, network, signatureAggregator, + utils.DefaultMinStakeAmount*10, ) // diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 347838314..745a9664f 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -229,6 +229,7 @@ func InitializeNativeTokenValidatorSet( validatorManagerAddress common.Address, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, + initialValidatorWeight uint64, ) ids.ID { convertSubnetTxId := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} @@ -239,7 +240,7 @@ func InitializeNativeTokenValidatorSet( InitialValidators: []nativetokenstakingmanager.InitialValidator{ { NodeID: ids.GenerateTestID(), - Weight: 1, + Weight: initialValidatorWeight, BlsPublicKey: blsPublicKey[:], }, }, @@ -268,6 +269,7 @@ func InitializeNativeTokenValidatorSet( ) Expect(err).Should(BeNil()) Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) + Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(initialValidatorWeight))) expectedValidationID := CalculateSubnetConversionValidationId(convertSubnetTxId, 0) emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) @@ -285,6 +287,7 @@ func InitializeERC20TokenValidatorSet( validatorManagerAddress common.Address, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, + initialValidatorWeight uint64, ) ids.ID { convertSubnetTxId := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} @@ -295,7 +298,7 @@ func InitializeERC20TokenValidatorSet( InitialValidators: []erc20tokenstakingmanager.InitialValidator{ { NodeID: ids.GenerateTestID(), - Weight: 1, + Weight: initialValidatorWeight, BlsPublicKey: blsPublicKey[:], }, }, @@ -324,6 +327,7 @@ func InitializeERC20TokenValidatorSet( ) Expect(err).Should(BeNil()) Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) + Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(initialValidatorWeight))) expectedValidationID := CalculateSubnetConversionValidationId(convertSubnetTxId, 0) emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) @@ -382,7 +386,7 @@ func InitializePoAValidatorSet( ) Expect(err).Should(BeNil()) Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) - Expect(initialValidatorCreatedEvent.Weight).Should(Equal(initialValidatorWeight)) + Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(initialValidatorWeight))) expectedValidationID := CalculateSubnetConversionValidationId(convertSubnetTxId, 0) emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) From f1dcd6bd7d4341028721fac3e469da31490014c2 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Tue, 17 Sep 2024 14:05:10 -0400 Subject: [PATCH 313/545] fix initialized validator set after migration --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- .../go/staking/PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/staking/ValidatorManager.sol | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index a4e4aa5bb..336c1740e 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615db6380380615db683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c698061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806366435abf116100bf578063ba3a4b9711610079578063ba3a4b971461030a578063bee0a03f1461031d578063c974d1b614610330578063d5f20ff614610338578063df93d8de14610358578063eb0acb8914610362575f80fd5b806366435abf1461028557806376f786211461029857806398f3e2b4146102ab5780639e1bc4ef146102be578063a3a65e48146102d1578063b771b3bc146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c57806361e2f4901461025f5780636206585614610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614f57565b610375565b005b61015f61016f366004614f92565b610806565b6101b2610182366004614f92565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614f92565b6109bf565b6040516001600160401b0390911681526020016101bc565b61015f610218366004614fbd565b6109d5565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614ffb565b610ab4565b61015f61025a366004615014565b610b07565b61015f61026d36600461503c565b610cdc565b6101b26102803660046150a0565b611428565b6101f2610293366004614f92565b611441565b61015f6102a6366004614f57565b611455565b61015f6102b9366004615014565b611536565b6101b26102cc3660046150b9565b611763565b61015f6102df366004614ffb565b61178f565b6102f26005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610318366004614f92565b611947565b61015f61032b366004614f92565b611bcd565b6101cd601481565b61034b610346366004614f92565b611ce1565b6040516101bc91906150ed565b6101f26202a30081565b6101b26103703660046151b4565b611dd4565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615bbd8339815191529184156103c7576103c48285611e09565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103f9576103f96150d9565b600481111561040a5761040a6150d9565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610491576104916150d9565b146104e35760405162461bcd60e51b815260206004820152602a60248201525f80516020615bdd8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105485760405162461bcd60e51b815260206004820152603360248201525f80516020615bdd8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104da565b5f610552846120a5565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561059f5761059f6150d9565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61067185611ce1565b905082606001516001600160401b031681608001516001600160401b0316116106e85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104da565b6002815160058111156106fd576106fd6150d9565b0361070f5761070f8360600151612135565b5f83606001518260800151610724919061522d565b90506107308682612142565b5f6005600160991b0163ee5b48eb61074989878661218a565b6040518263ffffffff1660e01b8152600401610765919061526f565b6020604051808303815f875af1158015610781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a591906152a1565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020615c3d8339815191526020526040808220815160e0810190925280545f80516020615bfd83398151915293929190829060ff166005811115610853576108536150d9565b6005811115610864576108646150d9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108d3576108d36150d9565b146109385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb61095d8584606001515f61218a565b6040518263ffffffff1660e01b8152600401610979919061526f565b6020604051808303815f875af1158015610995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b991906152a1565b50505050565b5f6109cf64e8d4a51000836152b8565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a1e575080546001600160401b03808416911610155b15610a3c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6784846123b1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615bbd8339815191525f80610acd846123cb565b6040808201515f8481526005880160205291909120549294509092506109b9916001600160401b03909116906001600160a01b0316612743565b5f80516020615bbd8339815191525f610b1f84612779565b90505f80610b308360400151612953565b50915091505f610b3f83611ce1565b9050816001600160401b031681606001516001600160401b03161015610b775760405162461bcd60e51b81526004016104da906152d7565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bbc5760405162461bcd60e51b81526004016104da90615319565b60015f87815260068701602052604090205460ff166004811115610be257610be26150d9565b14610c4b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bfd8339815191529060ff1615610d795760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de091906152a1565b836020013514610e425760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104da565b30610e536060850160408601615362565b6001600160a01b031614610ec55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104da565b5f610ed3606085018561537d565b905011610f325760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104da565b5f610f40606085018561537d565b91505063ffffffff8110610fac5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104da565b5f843560208601356014610fc66060890160408a01615362565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611338575f611046606089018961537d565b8363ffffffff1681811061105c5761105c6153c9565b905060200281019061106e91906153dd565b6110779061548d565b8051909150806110995760405162461bcd60e51b81526004016104da90615524565b5f818152600988016020526040902054156110c65760405162461bcd60e51b81526004016104da90615565565b8160400151516030146110eb5760405162461bcd60e51b81526004016104da906155ad565b84825f01518360200151846040015160405160200161110d94939291906155fa565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161115b9190615649565b602060405180830381855afa158015611176573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061119991906152a1565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115611225576112256150d9565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112d891168661565a565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080806113309061566d565b91505061102a565b50600584018190555f61134a86612779565b90505f61135a8260400151612b8e565b90508060028560405161136d9190615649565b602060405180830381855afa158015611388573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113ab91906152a1565b1461140f5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104da565b505050600a909201805460ff1916600117905550505050565b5f6109cf6001600160401b03831664e8d4a5100061568f565b5f61144b82611ce1565b6080015192915050565b5f80516020615bbd8339815191525f61146d85611ce1565b5f86815260058401602052604090205460a08201519192506114a091600160b01b9091046001600160401b0316906156a6565b6001600160401b03164210156115145760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104da565b8315611526576115248584611e09565b505b61152f85612d00565b5050505050565b61153e612ff6565b5f80516020615bbd8339815191525f61155684612779565b90505f806115678360400151612953565b50915091505f61157683611ce1565b9050816001600160401b031681606001516001600160401b031610156115ae5760405162461bcd60e51b81526004016104da906152d7565b5f8681526006860160205260409020600301546001600160401b03808416911611156115ec5760405162461bcd60e51b81526004016104da90615319565b60035f87815260068701602052604090205460ff166004811115611612576116126150d9565b146116665760405162461bcd60e51b815260206004820152603160248201525f80516020615bdd8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261170b91612743565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061175f60015f80516020615c1d83398151915255565b5050565b5f61176c612ff6565b611777833384613040565b90506109cf60015f80516020615c1d83398151915255565b5f80516020615bfd8339815191525f6117a783612779565b90505f806117b883604001516134b9565b915091508061181a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104da565b5f82815260078501602052604081208054611834906156c6565b9050118015611866575060015f83815260088601602052604090205460ff166005811115611864576118646150d9565b145b6118825760405162461bcd60e51b81526004016104da906156fe565b5f828152600785016020526040812061189a91614ee8565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bbd83398151915293929190829060ff1660048111156119a8576119a86150d9565b60048111156119b9576119b96150d9565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a4057611a406150d9565b1480611a5e5750600381516004811115611a5c57611a5c6150d9565b145b611ab25760405162461bcd60e51b815260206004820152603260248201525f80516020615bdd833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104da565b5f611ac08260400151611ce1565b905080606001516001600160401b03165f03611b445760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb611b7184604001518460600151856080015161218a565b6040518263ffffffff1660e01b8152600401611b8d919061526f565b6020604051808303815f875af1158015611ba9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152f91906152a1565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bfd833981519152929190611c15906156c6565b9050118015611c47575060015f83815260088301602052604090205460ff166005811115611c4557611c456150d9565b145b611c635760405162461bcd60e51b81526004016104da906156fe565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c9c9190600401615745565b6020604051808303815f875af1158015611cb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cdc91906152a1565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020615c3d83398151915290528390208351918201909352825491925f80516020615bfd83398151915292829060ff166005811115611d6157611d616150d9565b6005811115611d7257611d726150d9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611ddd612ff6565b611de98585858561365a565b9050611e0160015f80516020615c1d83398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e54573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e7b91908101906157da565b9150915080611ede5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f4591906152a1565b825114611fa95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104da565b60208201516001600160a01b03161561201f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104da565b5f8061202e84604001516138cf565b9150915081871461209b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104da565b9695505050505050565b5f8181525f80516020615c3d8339815191526020526040812060020180545f80516020615bfd83398151915291600160401b9091046001600160401b03169060086120ef836158ac565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b61213f815f613aa7565b50565b5f9182525f80516020615c3d833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612203576121c38160016158c7565b6121ce90600861568f565b5081515f908390839081106121e5576121e56153c9565b60200101906001600160f81b03191690815f1a9053506001016121af565b505f5b600481101561226e5761221a8160036158c7565b61222590600861568f565b600263ffffffff16901c60f81b82826002612240919061565a565b81518110612250576122506153c9565b60200101906001600160f81b03191690815f1a905350600101612206565b505f5b60208110156122d05761228581601f6158c7565b61229090600861568f565b86901c60f81b826122a283600661565a565b815181106122b2576122b26153c9565b60200101906001600160f81b03191690815f1a905350600101612271565b505f5b600881101561233b576122e78160076158c7565b6122f290600861568f565b6001600160401b038616901c60f81b8261230d83602661565a565b8151811061231d5761231d6153c9565b60200101906001600160f81b03191690815f1a9053506001016122d3565b505f5b60088110156123a6576123528160076158c7565b61235d90600861568f565b6001600160401b038516901c60f81b8261237883602e61565a565b81518110612388576123886153c9565b60200101906001600160f81b03191690815f1a90535060010161233e565b5090505b9392505050565b6123b9613d01565b6123c282613d4c565b61175f81613dc0565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f80516020615bfd8339815191525f61241a85612779565b90505f8061242b83604001516134b9565b9150915080156124905760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104da565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156124c1576124c16150d9565b60058111156124d2576124d26150d9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612543576125436150d9565b1480612561575060018251600581111561255f5761255f6150d9565b145b6125c05760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104da565b6003825160058111156125d5576125d56150d9565b036125e2575060046125e6565b5060055b6020808301515f9081526009880190915260408120558181600581111561260f5761260f6150d9565b90816005811115612622576126226150d9565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612656576126566150d9565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561270a5761270a6150d9565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461175f906001600160a01b03168284613e74565b60408051606080820183525f8083526020830181905292820152905f80516020615bfd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156127ee573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261281591908101906157da565b91509150806128755760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104da565b82548251146128d85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104da565b60208201516001600160a01b03161561294b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104da565b509392505050565b5f805f83516036146129775760405162461bcd60e51b81526004016104da906158da565b5f805b60028110156129c65761298e8160016158c7565b61299990600861568f565b61ffff168682815181106129af576129af6153c9565b016020015160f81c901b919091179060010161297a565b5061ffff8116156129e95760405162461bcd60e51b81526004016104da90615923565b5f805b6004811015612a4457612a008160036158c7565b612a0b90600861568f565b63ffffffff1687612a1d83600261565a565b81518110612a2d57612a2d6153c9565b016020015160f81c901b91909117906001016129ec565b5063ffffffff8116600414612a6b5760405162461bcd60e51b81526004016104da90615966565b5f805b6020811015612ac057612a8281601f6158c7565b612a8d90600861568f565b88612a9983600661565a565b81518110612aa957612aa96153c9565b016020015160f81c901b9190911790600101612a6e565b505f805b6008811015612b1f57612ad88160076158c7565b612ae390600861568f565b6001600160401b031689612af883602661565a565b81518110612b0857612b086153c9565b016020015160f81c901b9190911790600101612ac4565b505f805b6008811015612b7e57612b378160076158c7565b612b4290600861568f565b6001600160401b03168a612b5783602e61565a565b81518110612b6757612b676153c9565b016020015160f81c901b9190911790600101612b23565b5091989097509095509350505050565b5f8151602614612bb05760405162461bcd60e51b81526004016104da906158da565b5f805b6002811015612bff57612bc78160016158c7565b612bd290600861568f565b61ffff16848281518110612be857612be86153c9565b016020015160f81c901b9190911790600101612bb3565b5061ffff811615612c225760405162461bcd60e51b81526004016104da90615923565b5f805b6004811015612c7d57612c398160036158c7565b612c4490600861568f565b63ffffffff1685612c5683600261565a565b81518110612c6657612c666153c9565b016020015160f81c901b9190911790600101612c25565b5063ffffffff811615612ca25760405162461bcd60e51b81526004016104da90615966565b5f805b6020811015612cf757612cb981601f6158c7565b612cc490600861568f565b86612cd083600661565a565b81518110612ce057612ce06153c9565b016020015160f81c901b9190911790600101612ca5565b50949350505050565b5f8181525f80516020615c3d8339815191526020526040808220815160e0810190925280545f80516020615bfd83398151915293929190829060ff166005811115612d4d57612d4d6150d9565b6005811115612d5e57612d5e6150d9565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612dd057612dd06150d9565b14612e2c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104da565b612e398160800151612135565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff19166001836005811115612e7d57612e7d6150d9565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612f3284612f2c816120a5565b5f61218a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612f6190859060040161526f565b6020604051808303815f875af1158015612f7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa191906152a1565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615c1d83398151915280546001190161302757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615c1d83398151915255565b5f5f80516020615bbd8339815191528161305c6101ed85613ed3565b90505f61306887611ce1565b905060028151600581111561307f5761307f6150d9565b146130de5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166131715760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104da565b61317a82613f09565b5f82826080015161318b91906156a6565b600485015460408401519192506131ad916001600160401b03909116906159ad565b6001600160401b0316816001600160401b0316111561322c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104da565b6132368882612142565b5f613240896120a5565b90505f898260405160200161326c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6132a68d868861218a565b6040518263ffffffff1660e01b81526004016132c2919061526f565b6020604051808303815f875af11580156132de573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061330291906152a1565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561338a5761338a6150d9565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134dc5760405162461bcd60e51b81526004016104da906158da565b5f805b600281101561352b576134f38160016158c7565b6134fe90600861568f565b61ffff16858281518110613514576135146153c9565b016020015160f81c901b91909117906001016134df565b5061ffff81161561354e5760405162461bcd60e51b81526004016104da90615923565b5f805b60048110156135a9576135658160036158c7565b61357090600861568f565b63ffffffff168661358283600261565a565b81518110613592576135926153c9565b016020015160f81c901b9190911790600101613551565b5063ffffffff81166003146135d05760405162461bcd60e51b81526004016104da90615966565b5f805b6020811015613625576135e781601f6158c7565b6135f290600861568f565b876135fe83600661565a565b8151811061360e5761360e6153c9565b016020015160f81c901b91909117906001016135d3565b505f8660268151811061363a5761363a6153c9565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bbd8339815191529061ffff8616108015906136a6575061271061ffff861611155b6136c25760405162461bcd60e51b81526004016104da906159d8565b60028101546001600160401b03908116908516101561373b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104da565b805483101561379e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104da565b80600101548311156138055760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104da565b5f61380f84613ed3565b90505f61381b826109bf565b90505f6138288983613f14565b9050604051806060016040528061383c3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146138f25760405162461bcd60e51b81526004016104da906158da565b5f805b6002811015613941576139098160016158c7565b61391490600861568f565b61ffff1685828151811061392a5761392a6153c9565b016020015160f81c901b91909117906001016138f5565b5061ffff8116156139645760405162461bcd60e51b81526004016104da90615923565b5f805b60048110156139bf5761397b8160036158c7565b61398690600861568f565b63ffffffff168661399883600261565a565b815181106139a8576139a86153c9565b016020015160f81c901b9190911790600101613967565b5063ffffffff81166005146139e65760405162461bcd60e51b81526004016104da90615966565b5f805b6020811015613a3b576139fd81601f6158c7565b613a0890600861568f565b87613a1483600661565a565b81518110613a2457613a246153c9565b016020015160f81c901b91909117906001016139e9565b505f805b6008811015613a9a57613a538160076158c7565b613a5e90600861568f565b6001600160401b031688613a7383602661565a565b81518110613a8357613a836153c9565b016020015160f81c901b9190911790600101613a3f565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615bfd833981519152914291901580613b8d575060028301548151613b89916001600160401b03169061565a565b8210155b15613bb3576001600160401b038516606082015281815260408101516020820152613bd2565b8481606001818151613bc591906156a6565b6001600160401b03169052505b6060810151613be29060646159ad565b602082015160028501546001600160401b039290921691613c0d9190600160401b900460ff1661568f565b1015613c715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104da565b8315613c9a57846001600160401b031681604001818151613c92919061565a565b905250613cb9565b846001600160401b031681604001818151613cb591906158c7565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d4a57604051631afcd79f60e31b815260040160405180910390fd5b565b613d54613d01565b613d5d816143f8565b613d65614411565b61213f608082013560a0830135613d8260e0850160c086016150a0565b613d93610100860160e08701615a23565b61ffff16613da961012087016101008801615a3c565b613dbb61014088016101208901615362565b614421565b613dc8613d01565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613e545760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611cdc91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614665565b5f6109cf827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906146c6565b61213f816001613aa7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613f9f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104da565b5f80516020615bfd83398151915242613fbe60408601602087016150a0565b6001600160401b0316116140305760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104da565b61404060408501602086016150a0565b6001600160401b03166140566202a3004261565a565b116140c95760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104da565b83356140e75760405162461bcd60e51b81526004016104da90615524565b83355f908152600982016020526040902054156141165760405162461bcd60e51b81526004016104da90615565565b6141236040850185615a5c565b90506030146141445760405162461bcd60e51b81526004016104da906155ad565b61414d83613f09565b5f806141e76040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061419291906150a0565b6001600160401b031681526020016141ad60408a018a615a5c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614828565b5f828152600786016020526040902091935091506142058282615ae2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061423290859060040161526f565b6020604051808303815f875af115801561424e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061427291906152a1565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156142ea576142ea6150d9565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916143ca918e01908e016150a0565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614400613d01565b614408614bd7565b61213f81614bdf565b614419613d01565b613d4a614d8b565b614429613d01565b5f80516020615bbd833981519152836144955760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104da565b6127108411156144b75760405162461bcd60e51b81526004016104da906159d8565b8587111561451f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104da565b5f8360ff161161458c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104da565b600a60ff841611156145fe5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104da565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6146796001600160a01b03841683614d93565b905080515f1415801561469d57508080602001905181019061469b9190615ba1565b155b15611cdc57604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561470c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061473091906152a1565b90506147476001600160a01b038516333086614da0565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561478b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147af91906152a1565b90508181116148155760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b61481f82826158c7565b95945050505050565b5f60608260800151516030146148925760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104da565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614909576148c98160016158c7565b6148d490600861568f565b5081515f908390839081106148eb576148eb6153c9565b60200101906001600160f81b03191690815f1a9053506001016148b5565b505f5b6004811015614971576149208160036158c7565b61492b90600861568f565b600160ff919091161c60f81b8261494383600261565a565b81518110614953576149536153c9565b60200101906001600160f81b03191690815f1a90535060010161490c565b505f5b60208110156149ce5784518160208110614990576149906153c9565b1a60f81b826149a083600661565a565b815181106149b0576149b06153c9565b60200101906001600160f81b03191690815f1a905350600101614974565b505f5b6020811015614a2e57846020015181602081106149f0576149f06153c9565b1a60f81b82614a0083602661565a565b81518110614a1057614a106153c9565b60200101906001600160f81b03191690815f1a9053506001016149d1565b505f5b6008811015614aa257614a458160076158c7565b614a5090600861568f565b60ff1685604001516001600160401b0316901c60f81b82826046614a74919061565a565b81518110614a8457614a846153c9565b60200101906001600160f81b03191690815f1a905350600101614a31565b505f5b6030811015614b0d5784608001518181518110614ac457614ac46153c9565b01602001516001600160f81b03191682614adf83604e61565a565b81518110614aef57614aef6153c9565b60200101906001600160f81b03191690815f1a905350600101614aa5565b505f5b6008811015614b7f57614b248160076158c7565b614b2f90600861568f565b60608601516001600160401b0390811691161c60f81b82614b5183607e61565a565b81518110614b6157614b616153c9565b60200101906001600160f81b03191690815f1a905350600101614b10565b50600281604051614b909190615649565b602060405180830381855afa158015614bab573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bce91906152a1565b94909350915050565b613d4a613d01565b614be7613d01565b80355f80516020615bfd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c336080840160608501615a3c565b60ff161115614ca05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104da565b5f614cb16080840160608501615a3c565b60ff1611614d195760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104da565b614d296080830160608401615a3c565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d5a60608301604084016150a0565b60028201805467ffffffffffffffff19166001600160401b0392909216919091179055600a01805460ff1916905550565b61302d613d01565b60606123aa83835f614dd9565b6040516001600160a01b0384811660248301528381166044830152606482018390526109b99186918216906323b872dd90608401613ea1565b606081471015614dfe5760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614e199190615649565b5f6040518083038185875af1925050503d805f8114614e53576040519150601f19603f3d011682016040523d82523d5f602084013e614e58565b606091505b509150915061209b868383606082614e7857614e7382614ebf565b6123aa565b8151158015614e8f57506001600160a01b0384163b155b15614eb857604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b50806123aa565b805115614ecf5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ef4906156c6565b5f825580601f10614f03575050565b601f0160209004905f5260205f209081019061213f91905b80821115614f2e575f8155600101614f1b565b5090565b801515811461213f575f80fd5b803563ffffffff81168114614f52575f80fd5b919050565b5f805f60608486031215614f69575f80fd5b833592506020840135614f7b81614f32565b9150614f8960408501614f3f565b90509250925092565b5f60208284031215614fa2575f80fd5b5035919050565b6001600160a01b038116811461213f575f80fd5b5f80828403610160811215614fd0575f80fd5b61014080821215614fdf575f80fd5b8493508301359050614ff081614fa9565b809150509250929050565b5f6020828403121561500b575f80fd5b6123aa82614f3f565b5f8060408385031215615025575f80fd5b61502e83614f3f565b946020939093013593505050565b5f806040838503121561504d575f80fd5b82356001600160401b03811115615062575f80fd5b830160808186031215615073575f80fd5b915061508160208401614f3f565b90509250929050565b80356001600160401b0381168114614f52575f80fd5b5f602082840312156150b0575f80fd5b6123aa8261508a565b5f80604083850312156150ca575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061511057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161514b60608401826001600160401b03169052565b50608083015161516660808401826001600160401b03169052565b5060a083015161518160a08401826001600160401b03169052565b5060c083015161519c60c08401826001600160401b03169052565b5092915050565b803561ffff81168114614f52575f80fd5b5f805f80608085870312156151c7575f80fd5b84356001600160401b038111156151dc575f80fd5b8501606081880312156151ed575f80fd5b93506151fb602086016151a3565b92506152096040860161508a565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561519c5761519c615219565b5f5b8381101561526757818101518382015260200161524f565b50505f910152565b602081525f825180602084015261528d81604085016020870161524d565b601f01601f19169190910160400192915050565b5f602082840312156152b1575f80fd5b5051919050565b5f826152d257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615372575f80fd5b81356123aa81614fa9565b5f808335601e19843603018112615392575f80fd5b8301803591506001600160401b038211156153ab575f80fd5b6020019150600581901b36038213156153c2575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126153f1575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615431576154316153fb565b60405290565b604051601f8201601f191681016001600160401b038111828210171561545f5761545f6153fb565b604052919050565b5f6001600160401b0382111561547f5761547f6153fb565b50601f01601f191660200190565b5f6060823603121561549d575f80fd5b6154a561540f565b8235815260206154b681850161508a565b8183015260408401356001600160401b038111156154d2575f80fd5b840136601f8201126154e2575f80fd5b80356154f56154f082615467565b615437565b8181523684838501011115615508575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f855161560b818460208a0161524d565b80830190508581526001600160401b0360c01b8560c01b166020820152835161563b81602884016020880161524d565b016028019695505050505050565b5f82516153f181846020870161524d565b808201808211156109cf576109cf615219565b5f63ffffffff80831681810361568557615685615219565b6001019392505050565b80820281158282048414176109cf576109cf615219565b6001600160401b0381811683821601908082111561519c5761519c615219565b600181811c908216806156da57607f821691505b6020821081036156f857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615757816156c6565b806020870152604060018084165f81146157785760018114615794576157c1565b60ff19851660408a0152604084151560051b8a010195506157c1565b895f5260205f205f5b858110156157b85781548b820186015290830190880161579d565b8a016040019650505b509398975050505050505050565b8051614f5281614f32565b5f80604083850312156157eb575f80fd5b82516001600160401b0380821115615801575f80fd5b9084019060608287031215615814575f80fd5b61581c61540f565b8251815260208084015161582f81614fa9565b82820152604084015183811115615844575f80fd5b80850194505087601f850112615858575f80fd5b835192506158686154f084615467565b838152888285870101111561587b575f80fd5b61588a8483830184880161524d565b8060408401525081955061589f8188016157cf565b9450505050509250929050565b5f6001600160401b0380831681810361568557615685615219565b818103818111156109cf576109cf615219565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159d0576159d0615219565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f60208284031215615a33575f80fd5b6123aa826151a3565b5f60208284031215615a4c575f80fd5b813560ff811681146123aa575f80fd5b5f808335601e19843603018112615a71575f80fd5b8301803591506001600160401b03821115615a8a575f80fd5b6020019150368190038213156153c2575f80fd5b601f821115611cdc57805f5260205f20601f840160051c81016020851015615ac35750805b601f840160051c820191505b8181101561152f575f8155600101615acf565b81516001600160401b03811115615afb57615afb6153fb565b615b0f81615b0984546156c6565b84615a9e565b602080601f831160018114615b42575f8415615b2b5750858301515b5f19600386901b1c1916600185901b178555615b99565b5f85815260208120601f198616915b82811015615b7057888601518255948401946001909101908401615b51565b5085821015615b8d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615bb1575f80fd5b81516123aa81614f3256fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615dac380380615dac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c5f8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806366435abf116100bf578063ba3a4b9711610079578063ba3a4b971461030a578063bee0a03f1461031d578063c974d1b614610330578063d5f20ff614610338578063df93d8de14610358578063eb0acb8914610362575f80fd5b806366435abf1461028557806376f786211461029857806398f3e2b4146102ab5780639e1bc4ef146102be578063a3a65e48146102d1578063b771b3bc146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c57806361e2f4901461025f5780636206585614610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614f4d565b610375565b005b61015f61016f366004614f88565b610806565b6101b2610182366004614f88565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614f88565b6109bf565b6040516001600160401b0390911681526020016101bc565b61015f610218366004614fb3565b6109d5565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614ff1565b610ab4565b61015f61025a36600461500a565b610b07565b61015f61026d366004615032565b610cdc565b6101b2610280366004615096565b611428565b6101f2610293366004614f88565b611441565b61015f6102a6366004614f4d565b611455565b61015f6102b936600461500a565b611536565b6101b26102cc3660046150af565b611763565b61015f6102df366004614ff1565b61178f565b6102f26005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610318366004614f88565b611947565b61015f61032b366004614f88565b611bcd565b6101cd601481565b61034b610346366004614f88565b611ce1565b6040516101bc91906150e3565b6101f26202a30081565b6101b26103703660046151aa565b611dd4565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615bb38339815191529184156103c7576103c48285611e09565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103f9576103f96150cf565b600481111561040a5761040a6150cf565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610491576104916150cf565b146104e35760405162461bcd60e51b815260206004820152602a60248201525f80516020615bd38339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105485760405162461bcd60e51b815260206004820152603360248201525f80516020615bd38339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104da565b5f610552846120a5565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561059f5761059f6150cf565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61067185611ce1565b905082606001516001600160401b031681608001516001600160401b0316116106e85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104da565b6002815160058111156106fd576106fd6150cf565b0361070f5761070f8360600151612135565b5f836060015182608001516107249190615223565b90506107308682612142565b5f6005600160991b0163ee5b48eb61074989878661218a565b6040518263ffffffff1660e01b81526004016107659190615265565b6020604051808303815f875af1158015610781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a59190615297565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020615c338339815191526020526040808220815160e0810190925280545f80516020615bf383398151915293929190829060ff166005811115610853576108536150cf565b6005811115610864576108646150cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108d3576108d36150cf565b146109385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb61095d8584606001515f61218a565b6040518263ffffffff1660e01b81526004016109799190615265565b6020604051808303815f875af1158015610995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b99190615297565b50505050565b5f6109cf64e8d4a51000836152ae565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a1e575080546001600160401b03808416911610155b15610a3c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6784846123b1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615bb38339815191525f80610acd846123cb565b6040808201515f8481526005880160205291909120549294509092506109b9916001600160401b03909116906001600160a01b0316612743565b5f80516020615bb38339815191525f610b1f84612779565b90505f80610b308360400151612953565b50915091505f610b3f83611ce1565b9050816001600160401b031681606001516001600160401b03161015610b775760405162461bcd60e51b81526004016104da906152cd565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bbc5760405162461bcd60e51b81526004016104da9061530f565b60015f87815260068701602052604090205460ff166004811115610be257610be26150cf565b14610c4b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bf38339815191529060ff1615610d795760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de09190615297565b836020013514610e425760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104da565b30610e536060850160408601615358565b6001600160a01b031614610ec55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104da565b5f610ed36060850185615373565b905011610f325760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104da565b5f610f406060850185615373565b91505063ffffffff8110610fac5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104da565b5f843560208601356014610fc66060890160408a01615358565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611338575f6110466060890189615373565b8363ffffffff1681811061105c5761105c6153bf565b905060200281019061106e91906153d3565b61107790615483565b8051909150806110995760405162461bcd60e51b81526004016104da9061551a565b5f818152600988016020526040902054156110c65760405162461bcd60e51b81526004016104da9061555b565b8160400151516030146110eb5760405162461bcd60e51b81526004016104da906155a3565b84825f01518360200151846040015160405160200161110d94939291906155f0565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161115b919061563f565b602060405180830381855afa158015611176573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111999190615297565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115611225576112256150cf565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112d8911686615650565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050808061133090615663565b91505061102a565b50600584018190555f61134a86612779565b90505f61135a8260400151612b8e565b90508060028560405161136d919061563f565b602060405180830381855afa158015611388573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113ab9190615297565b1461140f5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104da565b505050600a909201805460ff1916600117905550505050565b5f6109cf6001600160401b03831664e8d4a51000615685565b5f61144b82611ce1565b6080015192915050565b5f80516020615bb38339815191525f61146d85611ce1565b5f86815260058401602052604090205460a08201519192506114a091600160b01b9091046001600160401b03169061569c565b6001600160401b03164210156115145760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104da565b8315611526576115248584611e09565b505b61152f85612d00565b5050505050565b61153e612ff6565b5f80516020615bb38339815191525f61155684612779565b90505f806115678360400151612953565b50915091505f61157683611ce1565b9050816001600160401b031681606001516001600160401b031610156115ae5760405162461bcd60e51b81526004016104da906152cd565b5f8681526006860160205260409020600301546001600160401b03808416911611156115ec5760405162461bcd60e51b81526004016104da9061530f565b60035f87815260068701602052604090205460ff166004811115611612576116126150cf565b146116665760405162461bcd60e51b815260206004820152603160248201525f80516020615bd38339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261170b91612743565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061175f60015f80516020615c1383398151915255565b5050565b5f61176c612ff6565b611777833384613040565b90506109cf60015f80516020615c1383398151915255565b5f80516020615bf38339815191525f6117a783612779565b90505f806117b883604001516134b9565b915091508061181a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104da565b5f82815260078501602052604081208054611834906156bc565b9050118015611866575060015f83815260088601602052604090205460ff166005811115611864576118646150cf565b145b6118825760405162461bcd60e51b81526004016104da906156f4565b5f828152600785016020526040812061189a91614ede565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bb383398151915293929190829060ff1660048111156119a8576119a86150cf565b60048111156119b9576119b96150cf565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a4057611a406150cf565b1480611a5e5750600381516004811115611a5c57611a5c6150cf565b145b611ab25760405162461bcd60e51b815260206004820152603260248201525f80516020615bd3833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104da565b5f611ac08260400151611ce1565b905080606001516001600160401b03165f03611b445760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb611b7184604001518460600151856080015161218a565b6040518263ffffffff1660e01b8152600401611b8d9190615265565b6020604051808303815f875af1158015611ba9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152f9190615297565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bf3833981519152929190611c15906156bc565b9050118015611c47575060015f83815260088301602052604090205460ff166005811115611c4557611c456150cf565b145b611c635760405162461bcd60e51b81526004016104da906156f4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c9c919060040161573b565b6020604051808303815f875af1158015611cb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cdc9190615297565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020615c3383398151915290528390208351918201909352825491925f80516020615bf383398151915292829060ff166005811115611d6157611d616150cf565b6005811115611d7257611d726150cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611ddd612ff6565b611de98585858561365a565b9050611e0160015f80516020615c1383398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e54573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e7b91908101906157d0565b9150915080611ede5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f459190615297565b825114611fa95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104da565b60208201516001600160a01b03161561201f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104da565b5f8061202e84604001516138cf565b9150915081871461209b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104da565b9695505050505050565b5f8181525f80516020615c338339815191526020526040812060020180545f80516020615bf383398151915291600160401b9091046001600160401b03169060086120ef836158a2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b61213f815f613aa7565b50565b5f9182525f80516020615c33833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612203576121c38160016158bd565b6121ce906008615685565b5081515f908390839081106121e5576121e56153bf565b60200101906001600160f81b03191690815f1a9053506001016121af565b505f5b600481101561226e5761221a8160036158bd565b612225906008615685565b600263ffffffff16901c60f81b828260026122409190615650565b81518110612250576122506153bf565b60200101906001600160f81b03191690815f1a905350600101612206565b505f5b60208110156122d05761228581601f6158bd565b612290906008615685565b86901c60f81b826122a2836006615650565b815181106122b2576122b26153bf565b60200101906001600160f81b03191690815f1a905350600101612271565b505f5b600881101561233b576122e78160076158bd565b6122f2906008615685565b6001600160401b038616901c60f81b8261230d836026615650565b8151811061231d5761231d6153bf565b60200101906001600160f81b03191690815f1a9053506001016122d3565b505f5b60088110156123a6576123528160076158bd565b61235d906008615685565b6001600160401b038516901c60f81b8261237883602e615650565b81518110612388576123886153bf565b60200101906001600160f81b03191690815f1a90535060010161233e565b5090505b9392505050565b6123b9613d01565b6123c282613d4c565b61175f81613dc0565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f80516020615bf38339815191525f61241a85612779565b90505f8061242b83604001516134b9565b9150915080156124905760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104da565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156124c1576124c16150cf565b60058111156124d2576124d26150cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612543576125436150cf565b1480612561575060018251600581111561255f5761255f6150cf565b145b6125c05760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104da565b6003825160058111156125d5576125d56150cf565b036125e2575060046125e6565b5060055b6020808301515f9081526009880190915260408120558181600581111561260f5761260f6150cf565b90816005811115612622576126226150cf565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612656576126566150cf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561270a5761270a6150cf565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461175f906001600160a01b03168284613e74565b60408051606080820183525f8083526020830181905292820152905f80516020615bf38339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156127ee573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261281591908101906157d0565b91509150806128755760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104da565b82548251146128d85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104da565b60208201516001600160a01b03161561294b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104da565b509392505050565b5f805f83516036146129775760405162461bcd60e51b81526004016104da906158d0565b5f805b60028110156129c65761298e8160016158bd565b612999906008615685565b61ffff168682815181106129af576129af6153bf565b016020015160f81c901b919091179060010161297a565b5061ffff8116156129e95760405162461bcd60e51b81526004016104da90615919565b5f805b6004811015612a4457612a008160036158bd565b612a0b906008615685565b63ffffffff1687612a1d836002615650565b81518110612a2d57612a2d6153bf565b016020015160f81c901b91909117906001016129ec565b5063ffffffff8116600414612a6b5760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015612ac057612a8281601f6158bd565b612a8d906008615685565b88612a99836006615650565b81518110612aa957612aa96153bf565b016020015160f81c901b9190911790600101612a6e565b505f805b6008811015612b1f57612ad88160076158bd565b612ae3906008615685565b6001600160401b031689612af8836026615650565b81518110612b0857612b086153bf565b016020015160f81c901b9190911790600101612ac4565b505f805b6008811015612b7e57612b378160076158bd565b612b42906008615685565b6001600160401b03168a612b5783602e615650565b81518110612b6757612b676153bf565b016020015160f81c901b9190911790600101612b23565b5091989097509095509350505050565b5f8151602614612bb05760405162461bcd60e51b81526004016104da906158d0565b5f805b6002811015612bff57612bc78160016158bd565b612bd2906008615685565b61ffff16848281518110612be857612be86153bf565b016020015160f81c901b9190911790600101612bb3565b5061ffff811615612c225760405162461bcd60e51b81526004016104da90615919565b5f805b6004811015612c7d57612c398160036158bd565b612c44906008615685565b63ffffffff1685612c56836002615650565b81518110612c6657612c666153bf565b016020015160f81c901b9190911790600101612c25565b5063ffffffff811615612ca25760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015612cf757612cb981601f6158bd565b612cc4906008615685565b86612cd0836006615650565b81518110612ce057612ce06153bf565b016020015160f81c901b9190911790600101612ca5565b50949350505050565b5f8181525f80516020615c338339815191526020526040808220815160e0810190925280545f80516020615bf383398151915293929190829060ff166005811115612d4d57612d4d6150cf565b6005811115612d5e57612d5e6150cf565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612dd057612dd06150cf565b14612e2c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104da565b612e398160800151612135565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff19166001836005811115612e7d57612e7d6150cf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612f3284612f2c816120a5565b5f61218a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612f61908590600401615265565b6020604051808303815f875af1158015612f7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa19190615297565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615c1383398151915280546001190161302757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615c1383398151915255565b5f5f80516020615bb38339815191528161305c6101ed85613ed3565b90505f61306887611ce1565b905060028151600581111561307f5761307f6150cf565b146130de5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166131715760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104da565b61317a82613f09565b5f82826080015161318b919061569c565b600485015460408401519192506131ad916001600160401b03909116906159a3565b6001600160401b0316816001600160401b0316111561322c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104da565b6132368882612142565b5f613240896120a5565b90505f898260405160200161326c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6132a68d868861218a565b6040518263ffffffff1660e01b81526004016132c29190615265565b6020604051808303815f875af11580156132de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133029190615297565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561338a5761338a6150cf565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134dc5760405162461bcd60e51b81526004016104da906158d0565b5f805b600281101561352b576134f38160016158bd565b6134fe906008615685565b61ffff16858281518110613514576135146153bf565b016020015160f81c901b91909117906001016134df565b5061ffff81161561354e5760405162461bcd60e51b81526004016104da90615919565b5f805b60048110156135a9576135658160036158bd565b613570906008615685565b63ffffffff1686613582836002615650565b81518110613592576135926153bf565b016020015160f81c901b9190911790600101613551565b5063ffffffff81166003146135d05760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015613625576135e781601f6158bd565b6135f2906008615685565b876135fe836006615650565b8151811061360e5761360e6153bf565b016020015160f81c901b91909117906001016135d3565b505f8660268151811061363a5761363a6153bf565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bb38339815191529061ffff8616108015906136a6575061271061ffff861611155b6136c25760405162461bcd60e51b81526004016104da906159ce565b60028101546001600160401b03908116908516101561373b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104da565b805483101561379e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104da565b80600101548311156138055760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104da565b5f61380f84613ed3565b90505f61381b826109bf565b90505f6138288983613f14565b9050604051806060016040528061383c3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146138f25760405162461bcd60e51b81526004016104da906158d0565b5f805b6002811015613941576139098160016158bd565b613914906008615685565b61ffff1685828151811061392a5761392a6153bf565b016020015160f81c901b91909117906001016138f5565b5061ffff8116156139645760405162461bcd60e51b81526004016104da90615919565b5f805b60048110156139bf5761397b8160036158bd565b613986906008615685565b63ffffffff1686613998836002615650565b815181106139a8576139a86153bf565b016020015160f81c901b9190911790600101613967565b5063ffffffff81166005146139e65760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015613a3b576139fd81601f6158bd565b613a08906008615685565b87613a14836006615650565b81518110613a2457613a246153bf565b016020015160f81c901b91909117906001016139e9565b505f805b6008811015613a9a57613a538160076158bd565b613a5e906008615685565b6001600160401b031688613a73836026615650565b81518110613a8357613a836153bf565b016020015160f81c901b9190911790600101613a3f565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615bf3833981519152914291901580613b8d575060028301548151613b89916001600160401b031690615650565b8210155b15613bb3576001600160401b038516606082015281815260408101516020820152613bd2565b8481606001818151613bc5919061569c565b6001600160401b03169052505b6060810151613be29060646159a3565b602082015160028501546001600160401b039290921691613c0d9190600160401b900460ff16615685565b1015613c715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104da565b8315613c9a57846001600160401b031681604001818151613c929190615650565b905250613cb9565b846001600160401b031681604001818151613cb591906158bd565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d4a57604051631afcd79f60e31b815260040160405180910390fd5b565b613d54613d01565b613d5d816143f8565b613d65614411565b61213f608082013560a0830135613d8260e0850160c08601615096565b613d93610100860160e08701615a19565b61ffff16613da961012087016101008801615a32565b613dbb61014088016101208901615358565b614421565b613dc8613d01565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613e545760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611cdc91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614665565b5f6109cf827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906146c6565b61213f816001613aa7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613f9f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104da565b5f80516020615bf383398151915242613fbe6040860160208701615096565b6001600160401b0316116140305760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104da565b6140406040850160208601615096565b6001600160401b03166140566202a30042615650565b116140c95760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104da565b83356140e75760405162461bcd60e51b81526004016104da9061551a565b83355f908152600982016020526040902054156141165760405162461bcd60e51b81526004016104da9061555b565b6141236040850185615a52565b90506030146141445760405162461bcd60e51b81526004016104da906155a3565b61414d83613f09565b5f806141e76040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906141929190615096565b6001600160401b031681526020016141ad60408a018a615a52565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614828565b5f828152600786016020526040902091935091506142058282615ad8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614232908590600401615265565b6020604051808303815f875af115801561424e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142729190615297565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156142ea576142ea6150cf565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916143ca918e01908e01615096565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614400613d01565b614408614bd7565b61213f81614bdf565b614419613d01565b613d4a614d81565b614429613d01565b5f80516020615bb3833981519152836144955760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104da565b6127108411156144b75760405162461bcd60e51b81526004016104da906159ce565b8587111561451f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104da565b5f8360ff161161458c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104da565b600a60ff841611156145fe5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104da565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6146796001600160a01b03841683614d89565b905080515f1415801561469d57508080602001905181019061469b9190615b97565b155b15611cdc57604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561470c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147309190615297565b90506147476001600160a01b038516333086614d96565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561478b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147af9190615297565b90508181116148155760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b61481f82826158bd565b95945050505050565b5f60608260800151516030146148925760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104da565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614909576148c98160016158bd565b6148d4906008615685565b5081515f908390839081106148eb576148eb6153bf565b60200101906001600160f81b03191690815f1a9053506001016148b5565b505f5b6004811015614971576149208160036158bd565b61492b906008615685565b600160ff919091161c60f81b82614943836002615650565b81518110614953576149536153bf565b60200101906001600160f81b03191690815f1a90535060010161490c565b505f5b60208110156149ce5784518160208110614990576149906153bf565b1a60f81b826149a0836006615650565b815181106149b0576149b06153bf565b60200101906001600160f81b03191690815f1a905350600101614974565b505f5b6020811015614a2e57846020015181602081106149f0576149f06153bf565b1a60f81b82614a00836026615650565b81518110614a1057614a106153bf565b60200101906001600160f81b03191690815f1a9053506001016149d1565b505f5b6008811015614aa257614a458160076158bd565b614a50906008615685565b60ff1685604001516001600160401b0316901c60f81b82826046614a749190615650565b81518110614a8457614a846153bf565b60200101906001600160f81b03191690815f1a905350600101614a31565b505f5b6030811015614b0d5784608001518181518110614ac457614ac46153bf565b01602001516001600160f81b03191682614adf83604e615650565b81518110614aef57614aef6153bf565b60200101906001600160f81b03191690815f1a905350600101614aa5565b505f5b6008811015614b7f57614b248160076158bd565b614b2f906008615685565b60608601516001600160401b0390811691161c60f81b82614b5183607e615650565b81518110614b6157614b616153bf565b60200101906001600160f81b03191690815f1a905350600101614b10565b50600281604051614b90919061563f565b602060405180830381855afa158015614bab573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bce9190615297565b94909350915050565b613d4a613d01565b614be7613d01565b80355f80516020615bf383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c336080840160608501615a32565b60ff161115614ca05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104da565b5f614cb16080840160608501615a32565b60ff1611614d195760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104da565b614d296080830160608401615a32565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d5a6060830160408401615096565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61302d613d01565b60606123aa83835f614dcf565b6040516001600160a01b0384811660248301528381166044830152606482018390526109b99186918216906323b872dd90608401613ea1565b606081471015614df45760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614e0f919061563f565b5f6040518083038185875af1925050503d805f8114614e49576040519150601f19603f3d011682016040523d82523d5f602084013e614e4e565b606091505b509150915061209b868383606082614e6e57614e6982614eb5565b6123aa565b8151158015614e8557506001600160a01b0384163b155b15614eae57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b50806123aa565b805115614ec55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614eea906156bc565b5f825580601f10614ef9575050565b601f0160209004905f5260205f209081019061213f91905b80821115614f24575f8155600101614f11565b5090565b801515811461213f575f80fd5b803563ffffffff81168114614f48575f80fd5b919050565b5f805f60608486031215614f5f575f80fd5b833592506020840135614f7181614f28565b9150614f7f60408501614f35565b90509250925092565b5f60208284031215614f98575f80fd5b5035919050565b6001600160a01b038116811461213f575f80fd5b5f80828403610160811215614fc6575f80fd5b61014080821215614fd5575f80fd5b8493508301359050614fe681614f9f565b809150509250929050565b5f60208284031215615001575f80fd5b6123aa82614f35565b5f806040838503121561501b575f80fd5b61502483614f35565b946020939093013593505050565b5f8060408385031215615043575f80fd5b82356001600160401b03811115615058575f80fd5b830160808186031215615069575f80fd5b915061507760208401614f35565b90509250929050565b80356001600160401b0381168114614f48575f80fd5b5f602082840312156150a6575f80fd5b6123aa82615080565b5f80604083850312156150c0575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061510657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161514160608401826001600160401b03169052565b50608083015161515c60808401826001600160401b03169052565b5060a083015161517760a08401826001600160401b03169052565b5060c083015161519260c08401826001600160401b03169052565b5092915050565b803561ffff81168114614f48575f80fd5b5f805f80608085870312156151bd575f80fd5b84356001600160401b038111156151d2575f80fd5b8501606081880312156151e3575f80fd5b93506151f160208601615199565b92506151ff60408601615080565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156151925761519261520f565b5f5b8381101561525d578181015183820152602001615245565b50505f910152565b602081525f8251806020840152615283816040850160208701615243565b601f01601f19169190910160400192915050565b5f602082840312156152a7575f80fd5b5051919050565b5f826152c857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615368575f80fd5b81356123aa81614f9f565b5f808335601e19843603018112615388575f80fd5b8301803591506001600160401b038211156153a1575f80fd5b6020019150600581901b36038213156153b8575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126153e7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615427576154276153f1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615455576154556153f1565b604052919050565b5f6001600160401b03821115615475576154756153f1565b50601f01601f191660200190565b5f60608236031215615493575f80fd5b61549b615405565b8235815260206154ac818501615080565b8183015260408401356001600160401b038111156154c8575f80fd5b840136601f8201126154d8575f80fd5b80356154eb6154e68261545d565b61542d565b81815236848385010111156154fe575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615601818460208a01615243565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615631816028840160208801615243565b016028019695505050505050565b5f82516153e7818460208701615243565b808201808211156109cf576109cf61520f565b5f63ffffffff80831681810361567b5761567b61520f565b6001019392505050565b80820281158282048414176109cf576109cf61520f565b6001600160401b038181168382160190808211156151925761519261520f565b600181811c908216806156d057607f821691505b6020821081036156ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461574d816156bc565b806020870152604060018084165f811461576e576001811461578a576157b7565b60ff19851660408a0152604084151560051b8a010195506157b7565b895f5260205f205f5b858110156157ae5781548b8201860152908301908801615793565b8a016040019650505b509398975050505050505050565b8051614f4881614f28565b5f80604083850312156157e1575f80fd5b82516001600160401b03808211156157f7575f80fd5b908401906060828703121561580a575f80fd5b615812615405565b8251815260208084015161582581614f9f565b8282015260408401518381111561583a575f80fd5b80850194505087601f85011261584e575f80fd5b8351925061585e6154e68461545d565b8381528882858701011115615871575f80fd5b61588084838301848801615243565b806040840152508195506158958188016157c5565b9450505050509250929050565b5f6001600160401b0380831681810361567b5761567b61520f565b818103818111156109cf576109cf61520f565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159c6576159c661520f565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f60208284031215615a29575f80fd5b6123aa82615199565b5f60208284031215615a42575f80fd5b813560ff811681146123aa575f80fd5b5f808335601e19843603018112615a67575f80fd5b8301803591506001600160401b03821115615a80575f80fd5b6020019150368190038213156153b8575f80fd5b601f821115611cdc57805f5260205f20601f840160051c81016020851015615ab95750805b601f840160051c820191505b8181101561152f575f8155600101615ac5565b81516001600160401b03811115615af157615af16153f1565b615b0581615aff84546156bc565b84615a94565b602080601f831160018114615b38575f8415615b215750858301515b5f19600386901b1c1916600185901b178555615b8f565b5f85815260208120601f198616915b82811015615b6657888601518255948401946001909101908401615b47565b5085821015615b8357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ba7575f80fd5b81516123aa81614f2856fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 0862fa0d2..94f16f49d 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615a17380380615a1783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6158ca8061014d5f395ff3fe60806040526004361061013c575f3560e01c806362065856116100b3578063ba3a4b971161006d578063ba3a4b97146103be578063bee0a03f146103dd578063c599e24f146103fc578063c974d1b61461040f578063d5f20ff614610423578063df93d8de1461044f575f80fd5b806362065856146102f157806366435abf1461031057806376f786211461032f57806398f3e2b41461034e578063a3a65e481461036d578063b771b3bc1461038c575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded1461025957806340034a9314610281578063467ef06f146102945780635297fae6146102b357806361e2f490146102d2575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a366004614c31565b610465565b005b34801561016c575f80fd5b5061015f61017b366004614c6c565b6108f6565b34801561018b575f80fd5b506101ca61019a366004614c6c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614c83565b610aaf565b34801561022d575f80fd5b5061024161023c366004614c6c565b610b8c565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b6101ca61028f366004614cc1565b610ba2565b34801561029f575f80fd5b5061015f6102ae366004614d15565b610bd6565b3480156102be575f80fd5b5061015f6102cd366004614d2e565b610c29565b3480156102dd575f80fd5b5061015f6102ec366004614d56565b610dfe565b3480156102fc575f80fd5b506101ca61030b366004614da4565b61154a565b34801561031b575f80fd5b5061024161032a366004614c6c565b611563565b34801561033a575f80fd5b5061015f610349366004614c31565b611577565b348015610359575f80fd5b5061015f610368366004614d2e565b611658565b348015610378575f80fd5b5061015f610387366004614d15565b611885565b348015610397575f80fd5b506103a66005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103c9575f80fd5b5061015f6103d8366004614c6c565b611a3d565b3480156103e8575f80fd5b5061015f6103f7366004614c6c565b611cc3565b6101ca61040a366004614c6c565b611dd7565b34801561041a575f80fd5b506101f1601481565b34801561042e575f80fd5b5061044261043d366004614c6c565b611e08565b6040516101d49190614dd1565b34801561045a575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061581e8339815191529184156104b7576104b48285611efb565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104e9576104e9614dbd565b60048111156104fa576104fa614dbd565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058157610581614dbd565b146105d35760405162461bcd60e51b815260206004820152602a60248201525f8051602061583e8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106385760405162461bcd60e51b815260206004820152603360248201525f8051602061583e8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ca565b5f61064284612197565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561068f5761068f614dbd565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076185611e08565b905082606001516001600160401b031681608001516001600160401b0316116107d85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105ca565b6002815160058111156107ed576107ed614dbd565b036107ff576107ff8360600151612227565b5f836060015182608001516108149190614e9b565b90506108208682612234565b5f6005600160991b0163ee5b48eb61083989878661227c565b6040518263ffffffff1660e01b81526004016108559190614edd565b6020604051808303815f875af1158015610871573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108959190614f0f565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061589e8339815191526020526040808220815160e0810190925280545f8051602061585e83398151915293929190829060ff16600581111561094357610943614dbd565b600581111561095457610954614dbd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109c3576109c3614dbd565b14610a285760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb610a4d8584606001515f61227c565b6040518263ffffffff1660e01b8152600401610a699190614edd565b6020604051808303815f875af1158015610a85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa99190614f0f565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610af8575080546001600160401b03808416911610155b15610b165760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b40836124a1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b9c64e8d4a5100083614f26565b92915050565b5f610bab6124b2565b610bb7848484346124e9565b9050610bcf60015f8051602061587e83398151915255565b9392505050565b5f8051602061581e8339815191525f80610bef84612766565b6040808201515f848152600588016020529190912054929450909250610aa9916001600160401b03909116906001600160a01b0316612ade565b5f8051602061581e8339815191525f610c4184612af1565b90505f80610c528360400151612ccb565b50915091505f610c6183611e08565b9050816001600160401b031681606001516001600160401b03161015610c995760405162461bcd60e51b81526004016105ca90614f45565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cde5760405162461bcd60e51b81526004016105ca90614f87565b60015f87815260068701602052604090205460ff166004811115610d0457610d04614dbd565b14610d6d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f8051602061585e8339815191529060ff1615610e9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ede573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f029190614f0f565b836020013514610f645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016105ca565b30610f756060850160408601614fe4565b6001600160a01b031614610fe75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016105ca565b5f610ff56060850185614fff565b9050116110545760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016105ca565b5f6110626060850185614fff565b91505063ffffffff81106110ce5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016105ca565b5f8435602086013560146110e86060890160408a01614fe4565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561145a575f6111686060890189614fff565b8363ffffffff1681811061117e5761117e61504b565b9050602002810190611190919061505f565b6111999061510f565b8051909150806111bb5760405162461bcd60e51b81526004016105ca906151a6565b5f818152600988016020526040902054156111e85760405162461bcd60e51b81526004016105ca906151e7565b81604001515160301461120d5760405162461bcd60e51b81526004016105ca9061522f565b84825f01518360200151846040015160405160200161122f949392919061527c565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161127d91906152cb565b602060405180830381855afa158015611298573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112bb9190614f0f565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561134757611347614dbd565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113fa9116866152dc565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080611452906152ef565b91505061114c565b50600584018190555f61146c86612af1565b90505f61147c8260400151612f06565b90508060028560405161148f91906152cb565b602060405180830381855afa1580156114aa573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114cd9190614f0f565b146115315760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016105ca565b505050600a909201805460ff1916600117905550505050565b5f610b9c6001600160401b03831664e8d4a51000615311565b5f61156d82611e08565b6080015192915050565b5f8051602061581e8339815191525f61158f85611e08565b5f86815260058401602052604090205460a08201519192506115c291600160b01b9091046001600160401b031690615328565b6001600160401b03164210156116365760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ca565b8315611648576116468584611efb565b505b6116518561306f565b5050505050565b6116606124b2565b5f8051602061581e8339815191525f61167884612af1565b90505f806116898360400151612ccb565b50915091505f61169883611e08565b9050816001600160401b031681606001516001600160401b031610156116d05760405162461bcd60e51b81526004016105ca90614f45565b5f8681526006860160205260409020600301546001600160401b038084169116111561170e5760405162461bcd60e51b81526004016105ca90614f87565b60035f87815260068701602052604090205460ff16600481111561173457611734614dbd565b146117885760405162461bcd60e51b815260206004820152603160248201525f8051602061583e8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261182d91612ade565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061188160015f8051602061587e83398151915255565b5050565b5f8051602061585e8339815191525f61189d83612af1565b90505f806118ae8360400151613365565b91509150806119105760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ca565b5f8281526007850160205260408120805461192a90615348565b905011801561195c575060015f83815260088601602052604090205460ff16600581111561195a5761195a614dbd565b145b6119785760405162461bcd60e51b81526004016105ca9061537a565b5f828152600785016020526040812061199091614bc7565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061581e83398151915293929190829060ff166004811115611a9e57611a9e614dbd565b6004811115611aaf57611aaf614dbd565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b3657611b36614dbd565b1480611b545750600381516004811115611b5257611b52614dbd565b145b611ba85760405162461bcd60e51b815260206004820152603260248201525f8051602061583e833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ca565b5f611bb68260400151611e08565b905080606001516001600160401b03165f03611c3a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb611c6784604001518460600151856080015161227c565b6040518263ffffffff1660e01b8152600401611c839190614edd565b6020604051808303815f875af1158015611c9f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116519190614f0f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061585e833981519152929190611d0b90615348565b9050118015611d3d575060015f83815260088301602052604090205460ff166005811115611d3b57611d3b614dbd565b145b611d595760405162461bcd60e51b81526004016105ca9061537a565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d9291906004016153c1565b6020604051808303815f875af1158015611dae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd29190614f0f565b505050565b5f611de06124b2565b611deb823334613506565b9050611e0360015f8051602061587e83398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061589e83398151915290528390208351918201909352825491925f8051602061585e83398151915292829060ff166005811115611e8857611e88614dbd565b6005811115611e9957611e99614dbd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f46573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f6d9190810190615456565b9150915080611fd05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612013573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120379190614f0f565b82511461209b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ca565b60208201516001600160a01b0316156121115760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ca565b5f80612120846040015161397c565b9150915081871461218d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ca565b9695505050505050565b5f8181525f8051602061589e8339815191526020526040812060020180545f8051602061585e83398151915291600160401b9091046001600160401b03169060086121e183615528565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b612231815f613b54565b50565b5f9182525f8051602061589e833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156122f5576122b5816001615543565b6122c0906008615311565b5081515f908390839081106122d7576122d761504b565b60200101906001600160f81b03191690815f1a9053506001016122a1565b505f5b60048110156123605761230c816003615543565b612317906008615311565b600263ffffffff16901c60f81b8282600261233291906152dc565b815181106123425761234261504b565b60200101906001600160f81b03191690815f1a9053506001016122f8565b505f5b60208110156123c25761237781601f615543565b612382906008615311565b86901c60f81b826123948360066152dc565b815181106123a4576123a461504b565b60200101906001600160f81b03191690815f1a905350600101612363565b505f5b600881101561242d576123d9816007615543565b6123e4906008615311565b6001600160401b038616901c60f81b826123ff8360266152dc565b8151811061240f5761240f61504b565b60200101906001600160f81b03191690815f1a9053506001016123c5565b505f5b600881101561249857612444816007615543565b61244f906008615311565b6001600160401b038516901c60f81b8261246a83602e6152dc565b8151811061247a5761247a61504b565b60200101906001600160f81b03191690815f1a905350600101612430565b50949350505050565b6124a9613dae565b61223181613df9565b5f8051602061587e8339815191528054600119016124e357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061581e8339815191529061ffff861610801590612535575061271061ffff861611155b6125515760405162461bcd60e51b81526004016105ca90615556565b60028101546001600160401b0390811690851610156125ca5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ca565b805483101561262d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ca565b80600101548311156126945760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ca565b825f61269f82610b8c565b90505f6126ac8983613e6d565b905060405180606001604052806126c03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061587e83398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061585e8339815191525f6127b585612af1565b90505f806127c68360400151613365565b91509150801561282b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ca565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561285c5761285c614dbd565b600581111561286d5761286d614dbd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156128de576128de614dbd565b14806128fc57506001825160058111156128fa576128fa614dbd565b145b61295b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ca565b60038251600581111561297057612970614dbd565b0361297d57506004612981565b5060055b6020808301515f908152600988019091526040812055818160058111156129aa576129aa614dbd565b908160058111156129bd576129bd614dbd565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156129f1576129f1614dbd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612aa557612aa5614dbd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6118816001600160a01b03821683614351565b60408051606080820183525f8083526020830181905292820152905f8051602061585e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612b66573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612b8d9190810190615456565b9150915080612bed5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016105ca565b8254825114612c505760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ca565b60208201516001600160a01b031615612cc35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ca565b509392505050565b5f805f8351603614612cef5760405162461bcd60e51b81526004016105ca906155a1565b5f805b6002811015612d3e57612d06816001615543565b612d11906008615311565b61ffff16868281518110612d2757612d2761504b565b016020015160f81c901b9190911790600101612cf2565b5061ffff811615612d615760405162461bcd60e51b81526004016105ca906155ea565b5f805b6004811015612dbc57612d78816003615543565b612d83906008615311565b63ffffffff1687612d958360026152dc565b81518110612da557612da561504b565b016020015160f81c901b9190911790600101612d64565b5063ffffffff8116600414612de35760405162461bcd60e51b81526004016105ca9061562d565b5f805b6020811015612e3857612dfa81601f615543565b612e05906008615311565b88612e118360066152dc565b81518110612e2157612e2161504b565b016020015160f81c901b9190911790600101612de6565b505f805b6008811015612e9757612e50816007615543565b612e5b906008615311565b6001600160401b031689612e708360266152dc565b81518110612e8057612e8061504b565b016020015160f81c901b9190911790600101612e3c565b505f805b6008811015612ef657612eaf816007615543565b612eba906008615311565b6001600160401b03168a612ecf83602e6152dc565b81518110612edf57612edf61504b565b016020015160f81c901b9190911790600101612e9b565b5091989097509095509350505050565b5f8151602614612f285760405162461bcd60e51b81526004016105ca906155a1565b5f805b6002811015612f7757612f3f816001615543565b612f4a906008615311565b61ffff16848281518110612f6057612f6061504b565b016020015160f81c901b9190911790600101612f2b565b5061ffff811615612f9a5760405162461bcd60e51b81526004016105ca906155ea565b5f805b6004811015612ff557612fb1816003615543565b612fbc906008615311565b63ffffffff1685612fce8360026152dc565b81518110612fde57612fde61504b565b016020015160f81c901b9190911790600101612f9d565b5063ffffffff81161561301a5760405162461bcd60e51b81526004016105ca9061562d565b5f805b60208110156124985761303181601f615543565b61303c906008615311565b866130488360066152dc565b815181106130585761305861504b565b016020015160f81c901b919091179060010161301d565b5f8181525f8051602061589e8339815191526020526040808220815160e0810190925280545f8051602061585e83398151915293929190829060ff1660058111156130bc576130bc614dbd565b60058111156130cd576130cd614dbd565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561313f5761313f614dbd565b1461319b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ca565b6131a88160800151612227565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156131ec576131ec614dbd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132a18461329b81612197565b5f61227c565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906132d0908590600401614edd565b6020604051808303815f875af11580156132ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133109190614f0f565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146133885760405162461bcd60e51b81526004016105ca906155a1565b5f805b60028110156133d75761339f816001615543565b6133aa906008615311565b61ffff168582815181106133c0576133c061504b565b016020015160f81c901b919091179060010161338b565b5061ffff8116156133fa5760405162461bcd60e51b81526004016105ca906155ea565b5f805b600481101561345557613411816003615543565b61341c906008615311565b63ffffffff168661342e8360026152dc565b8151811061343e5761343e61504b565b016020015160f81c901b91909117906001016133fd565b5063ffffffff811660031461347c5760405162461bcd60e51b81526004016105ca9061562d565b5f805b60208110156134d15761349381601f615543565b61349e906008615311565b876134aa8360066152dc565b815181106134ba576134ba61504b565b016020015160f81c901b919091179060010161347f565b505f866026815181106134e6576134e661504b565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f8051602061581e8339815191528161351f84610b8c565b90505f61352b87611e08565b905060028151600581111561354257613542614dbd565b146135a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ca565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166136345760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016105ca565b61363d826143e4565b5f82826080015161364e9190615328565b60048501546040840151919250613670916001600160401b0390911690615674565b6001600160401b0316816001600160401b031611156136ef5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ca565b6136f98882612234565b5f61370389612197565b90505f898260405160200161372f92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6137698d868861227c565b6040518263ffffffff1660e01b81526004016137859190614edd565b6020604051808303815f875af11580156137a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c59190614f0f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561384d5761384d614dbd565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e1461399f5760405162461bcd60e51b81526004016105ca906155a1565b5f805b60028110156139ee576139b6816001615543565b6139c1906008615311565b61ffff168582815181106139d7576139d761504b565b016020015160f81c901b91909117906001016139a2565b5061ffff811615613a115760405162461bcd60e51b81526004016105ca906155ea565b5f805b6004811015613a6c57613a28816003615543565b613a33906008615311565b63ffffffff1686613a458360026152dc565b81518110613a5557613a5561504b565b016020015160f81c901b9190911790600101613a14565b5063ffffffff8116600514613a935760405162461bcd60e51b81526004016105ca9061562d565b5f805b6020811015613ae857613aaa81601f615543565b613ab5906008615311565b87613ac18360066152dc565b81518110613ad157613ad161504b565b016020015160f81c901b9190911790600101613a96565b505f805b6008811015613b4757613b00816007615543565b613b0b906008615311565b6001600160401b031688613b208360266152dc565b81518110613b3057613b3061504b565b016020015160f81c901b9190911790600101613aec565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061585e833981519152914291901580613c3a575060028301548151613c36916001600160401b0316906152dc565b8210155b15613c60576001600160401b038516606082015281815260408101516020820152613c7f565b8481606001818151613c729190615328565b6001600160401b03169052505b6060810151613c8f906064615674565b602082015160028501546001600160401b039290921691613cba9190600160401b900460ff16615311565b1015613d1e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ca565b8315613d4757846001600160401b031681604001818151613d3f91906152dc565b905250613d66565b846001600160401b031681604001818151613d629190615543565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613df757604051631afcd79f60e31b815260040160405180910390fd5b565b613e01613dae565b613e0a816143ef565b613e12614408565b612231608082013560a0830135613e2f60e0850160c08601614da4565b613e40610100860160e0870161569f565b61ffff16613e56610120870161010088016156b8565b613e6861014088016101208901614fe4565b614418565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613ef85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016105ca565b5f8051602061585e83398151915242613f176040860160208701614da4565b6001600160401b031611613f895760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ca565b613f996040850160208601614da4565b6001600160401b0316613faf6202a300426152dc565b116140225760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ca565b83356140405760405162461bcd60e51b81526004016105ca906151a6565b83355f9081526009820160205260409020541561406f5760405162461bcd60e51b81526004016105ca906151e7565b61407c60408501856156d8565b905060301461409d5760405162461bcd60e51b81526004016105ca9061522f565b6140a6836143e4565b5f806141406040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906140eb9190614da4565b6001600160401b0316815260200161410660408a018a6156d8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061465c565b5f8281526007860160205260409020919350915061415e828261575e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061418b908590600401614edd565b6020604051808303815f875af11580156141a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141cb9190614f0f565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561424357614243614dbd565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614323918e01908e01614da4565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156143745760405163cd78605960e01b81523060048201526024016105ca565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146143bd576040519150601f19603f3d011682016040523d82523d5f602084013e6143c2565b606091505b5050905080611dd257604051630a12f52160e11b815260040160405180910390fd5b612231816001613b54565b6143f7613dae565b6143ff614a0b565b61223181614a13565b614410613dae565b613df7614bbf565b614420613dae565b5f8051602061581e8339815191528361448c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ca565b6127108411156144ae5760405162461bcd60e51b81526004016105ca90615556565b858711156145165760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ca565b5f8360ff16116145835760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ca565b600a60ff841611156145f55760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ca565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146146c65760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ca565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561473d576146fd816001615543565b614708906008615311565b5081515f9083908390811061471f5761471f61504b565b60200101906001600160f81b03191690815f1a9053506001016146e9565b505f5b60048110156147a557614754816003615543565b61475f906008615311565b600160ff919091161c60f81b826147778360026152dc565b815181106147875761478761504b565b60200101906001600160f81b03191690815f1a905350600101614740565b505f5b602081101561480257845181602081106147c4576147c461504b565b1a60f81b826147d48360066152dc565b815181106147e4576147e461504b565b60200101906001600160f81b03191690815f1a9053506001016147a8565b505f5b602081101561486257846020015181602081106148245761482461504b565b1a60f81b826148348360266152dc565b815181106148445761484461504b565b60200101906001600160f81b03191690815f1a905350600101614805565b505f5b60088110156148d657614879816007615543565b614884906008615311565b60ff1685604001516001600160401b0316901c60f81b828260466148a891906152dc565b815181106148b8576148b861504b565b60200101906001600160f81b03191690815f1a905350600101614865565b505f5b603081101561494157846080015181815181106148f8576148f861504b565b01602001516001600160f81b0319168261491383604e6152dc565b815181106149235761492361504b565b60200101906001600160f81b03191690815f1a9053506001016148d9565b505f5b60088110156149b357614958816007615543565b614963906008615311565b60608601516001600160401b0390811691161c60f81b8261498583607e6152dc565b815181106149955761499561504b565b60200101906001600160f81b03191690815f1a905350600101614944565b506002816040516149c491906152cb565b602060405180830381855afa1580156149df573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a029190614f0f565b94909350915050565b613df7613dae565b614a1b613dae565b80355f8051602061585e83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614a6760808401606085016156b8565b60ff161115614ad45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ca565b5f614ae560808401606085016156b8565b60ff1611614b4d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ca565b614b5d60808301606084016156b8565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614b8e6060830160408401614da4565b60028201805467ffffffffffffffff19166001600160401b0392909216919091179055600a01805460ff1916905550565b612753613dae565b508054614bd390615348565b5f825580601f10614be2575050565b601f0160209004905f5260205f209081019061223191905b80821115614c0d575f8155600101614bfa565b5090565b8015158114612231575f80fd5b803563ffffffff81168114611e03575f80fd5b5f805f60608486031215614c43575f80fd5b833592506020840135614c5581614c11565b9150614c6360408501614c1e565b90509250925092565b5f60208284031215614c7c575f80fd5b5035919050565b5f6101408284031215614c94575f80fd5b50919050565b803561ffff81168114611e03575f80fd5b80356001600160401b0381168114611e03575f80fd5b5f805f60608486031215614cd3575f80fd5b83356001600160401b03811115614ce8575f80fd5b840160608187031215614cf9575f80fd5b9250614d0760208501614c9a565b9150614c6360408501614cab565b5f60208284031215614d25575f80fd5b610bcf82614c1e565b5f8060408385031215614d3f575f80fd5b614d4883614c1e565b946020939093013593505050565b5f8060408385031215614d67575f80fd5b82356001600160401b03811115614d7c575f80fd5b830160808186031215614d8d575f80fd5b9150614d9b60208401614c1e565b90509250929050565b5f60208284031215614db4575f80fd5b610bcf82614cab565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614df457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e2f60608401826001600160401b03169052565b506080830151614e4a60808401826001600160401b03169052565b5060a0830151614e6560a08401826001600160401b03169052565b5060c0830151614e8060c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e8057614e80614e87565b5f5b83811015614ed5578181015183820152602001614ebd565b50505f910152565b602081525f8251806020840152614efb816040850160208701614ebb565b601f01601f19169190910160400192915050565b5f60208284031215614f1f575f80fd5b5051919050565b5f82614f4057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612231575f80fd5b5f60208284031215614ff4575f80fd5b8135610bcf81614fd0565b5f808335601e19843603018112615014575f80fd5b8301803591506001600160401b0382111561502d575f80fd5b6020019150600581901b3603821315615044575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615073575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150b3576150b361507d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150e1576150e161507d565b604052919050565b5f6001600160401b038211156151015761510161507d565b50601f01601f191660200190565b5f6060823603121561511f575f80fd5b615127615091565b823581526020615138818501614cab565b8183015260408401356001600160401b03811115615154575f80fd5b840136601f820112615164575f80fd5b8035615177615172826150e9565b6150b9565b818152368483850101111561518a575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f855161528d818460208a01614ebb565b80830190508581526001600160401b0360c01b8560c01b16602082015283516152bd816028840160208801614ebb565b016028019695505050505050565b5f8251615073818460208701614ebb565b80820180821115610b9c57610b9c614e87565b5f63ffffffff80831681810361530757615307614e87565b6001019392505050565b8082028115828204841417610b9c57610b9c614e87565b6001600160401b03818116838216019080821115614e8057614e80614e87565b600181811c9082168061535c57607f821691505b602082108103614c9457634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546153d381615348565b806020870152604060018084165f81146153f457600181146154105761543d565b60ff19851660408a0152604084151560051b8a0101955061543d565b895f5260205f205f5b858110156154345781548b8201860152908301908801615419565b8a016040019650505b509398975050505050505050565b8051611e0381614c11565b5f8060408385031215615467575f80fd5b82516001600160401b038082111561547d575f80fd5b9084019060608287031215615490575f80fd5b615498615091565b825181526020808401516154ab81614fd0565b828201526040840151838111156154c0575f80fd5b80850194505087601f8501126154d4575f80fd5b835192506154e4615172846150e9565b83815288828587010111156154f7575f80fd5b61550684838301848801614ebb565b8060408401525081955061551b81880161544b565b9450505050509250929050565b5f6001600160401b0380831681810361530757615307614e87565b81810381811115610b9c57610b9c614e87565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461569757615697614e87565b505092915050565b5f602082840312156156af575f80fd5b610bcf82614c9a565b5f602082840312156156c8575f80fd5b813560ff81168114610bcf575f80fd5b5f808335601e198436030181126156ed575f80fd5b8301803591506001600160401b03821115615706575f80fd5b602001915036819003821315615044575f80fd5b601f821115611dd257805f5260205f20601f840160051c8101602085101561573f5750805b601f840160051c820191505b81811015611651575f815560010161574b565b81516001600160401b038111156157775761577761507d565b61578b816157858454615348565b8461571a565b602080601f8311600181146157be575f84156157a75750858301515b5f19600386901b1c1916600185901b178555615815565b5f85815260208120601f198616915b828110156157ec578886015182559484019460019091019084016157cd565b508582101561580957878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615a0d380380615a0d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6158c08061014d5f395ff3fe60806040526004361061013c575f3560e01c806362065856116100b3578063ba3a4b971161006d578063ba3a4b97146103be578063bee0a03f146103dd578063c599e24f146103fc578063c974d1b61461040f578063d5f20ff614610423578063df93d8de1461044f575f80fd5b806362065856146102f157806366435abf1461031057806376f786211461032f57806398f3e2b41461034e578063a3a65e481461036d578063b771b3bc1461038c575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded1461025957806340034a9314610281578063467ef06f146102945780635297fae6146102b357806361e2f490146102d2575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a366004614c27565b610465565b005b34801561016c575f80fd5b5061015f61017b366004614c62565b6108f6565b34801561018b575f80fd5b506101ca61019a366004614c62565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614c79565b610aaf565b34801561022d575f80fd5b5061024161023c366004614c62565b610b8c565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b6101ca61028f366004614cb7565b610ba2565b34801561029f575f80fd5b5061015f6102ae366004614d0b565b610bd6565b3480156102be575f80fd5b5061015f6102cd366004614d24565b610c29565b3480156102dd575f80fd5b5061015f6102ec366004614d4c565b610dfe565b3480156102fc575f80fd5b506101ca61030b366004614d9a565b61154a565b34801561031b575f80fd5b5061024161032a366004614c62565b611563565b34801561033a575f80fd5b5061015f610349366004614c27565b611577565b348015610359575f80fd5b5061015f610368366004614d24565b611658565b348015610378575f80fd5b5061015f610387366004614d0b565b611885565b348015610397575f80fd5b506103a66005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103c9575f80fd5b5061015f6103d8366004614c62565b611a3d565b3480156103e8575f80fd5b5061015f6103f7366004614c62565b611cc3565b6101ca61040a366004614c62565b611dd7565b34801561041a575f80fd5b506101f1601481565b34801561042e575f80fd5b5061044261043d366004614c62565b611e08565b6040516101d49190614dc7565b34801561045a575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206158148339815191529184156104b7576104b48285611efb565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104e9576104e9614db3565b60048111156104fa576104fa614db3565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058157610581614db3565b146105d35760405162461bcd60e51b815260206004820152602a60248201525f805160206158348339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106385760405162461bcd60e51b815260206004820152603360248201525f805160206158348339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ca565b5f61064284612197565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561068f5761068f614db3565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076185611e08565b905082606001516001600160401b031681608001516001600160401b0316116107d85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105ca565b6002815160058111156107ed576107ed614db3565b036107ff576107ff8360600151612227565b5f836060015182608001516108149190614e91565b90506108208682612234565b5f6005600160991b0163ee5b48eb61083989878661227c565b6040518263ffffffff1660e01b81526004016108559190614ed3565b6020604051808303815f875af1158015610871573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108959190614f05565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206158948339815191526020526040808220815160e0810190925280545f8051602061585483398151915293929190829060ff16600581111561094357610943614db3565b600581111561095457610954614db3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109c3576109c3614db3565b14610a285760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb610a4d8584606001515f61227c565b6040518263ffffffff1660e01b8152600401610a699190614ed3565b6020604051808303815f875af1158015610a85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa99190614f05565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610af8575080546001600160401b03808416911610155b15610b165760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b40836124a1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b9c64e8d4a5100083614f1c565b92915050565b5f610bab6124b2565b610bb7848484346124e9565b9050610bcf60015f8051602061587483398151915255565b9392505050565b5f805160206158148339815191525f80610bef84612766565b6040808201515f848152600588016020529190912054929450909250610aa9916001600160401b03909116906001600160a01b0316612ade565b5f805160206158148339815191525f610c4184612af1565b90505f80610c528360400151612ccb565b50915091505f610c6183611e08565b9050816001600160401b031681606001516001600160401b03161015610c995760405162461bcd60e51b81526004016105ca90614f3b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cde5760405162461bcd60e51b81526004016105ca90614f7d565b60015f87815260068701602052604090205460ff166004811115610d0457610d04614db3565b14610d6d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206158548339815191529060ff1615610e9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ede573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f029190614f05565b836020013514610f645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016105ca565b30610f756060850160408601614fda565b6001600160a01b031614610fe75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016105ca565b5f610ff56060850185614ff5565b9050116110545760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016105ca565b5f6110626060850185614ff5565b91505063ffffffff81106110ce5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016105ca565b5f8435602086013560146110e86060890160408a01614fda565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561145a575f6111686060890189614ff5565b8363ffffffff1681811061117e5761117e615041565b90506020028101906111909190615055565b61119990615105565b8051909150806111bb5760405162461bcd60e51b81526004016105ca9061519c565b5f818152600988016020526040902054156111e85760405162461bcd60e51b81526004016105ca906151dd565b81604001515160301461120d5760405162461bcd60e51b81526004016105ca90615225565b84825f01518360200151846040015160405160200161122f9493929190615272565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161127d91906152c1565b602060405180830381855afa158015611298573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112bb9190614f05565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561134757611347614db3565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113fa9116866152d2565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080611452906152e5565b91505061114c565b50600584018190555f61146c86612af1565b90505f61147c8260400151612f06565b90508060028560405161148f91906152c1565b602060405180830381855afa1580156114aa573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114cd9190614f05565b146115315760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016105ca565b505050600a909201805460ff1916600117905550505050565b5f610b9c6001600160401b03831664e8d4a51000615307565b5f61156d82611e08565b6080015192915050565b5f805160206158148339815191525f61158f85611e08565b5f86815260058401602052604090205460a08201519192506115c291600160b01b9091046001600160401b03169061531e565b6001600160401b03164210156116365760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ca565b8315611648576116468584611efb565b505b6116518561306f565b5050505050565b6116606124b2565b5f805160206158148339815191525f61167884612af1565b90505f806116898360400151612ccb565b50915091505f61169883611e08565b9050816001600160401b031681606001516001600160401b031610156116d05760405162461bcd60e51b81526004016105ca90614f3b565b5f8681526006860160205260409020600301546001600160401b038084169116111561170e5760405162461bcd60e51b81526004016105ca90614f7d565b60035f87815260068701602052604090205460ff16600481111561173457611734614db3565b146117885760405162461bcd60e51b815260206004820152603160248201525f805160206158348339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261182d91612ade565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061188160015f8051602061587483398151915255565b5050565b5f805160206158548339815191525f61189d83612af1565b90505f806118ae8360400151613365565b91509150806119105760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ca565b5f8281526007850160205260408120805461192a9061533e565b905011801561195c575060015f83815260088601602052604090205460ff16600581111561195a5761195a614db3565b145b6119785760405162461bcd60e51b81526004016105ca90615370565b5f828152600785016020526040812061199091614bbd565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061581483398151915293929190829060ff166004811115611a9e57611a9e614db3565b6004811115611aaf57611aaf614db3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b3657611b36614db3565b1480611b545750600381516004811115611b5257611b52614db3565b145b611ba85760405162461bcd60e51b815260206004820152603260248201525f80516020615834833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ca565b5f611bb68260400151611e08565b905080606001516001600160401b03165f03611c3a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb611c6784604001518460600151856080015161227c565b6040518263ffffffff1660e01b8152600401611c839190614ed3565b6020604051808303815f875af1158015611c9f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116519190614f05565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615854833981519152929190611d0b9061533e565b9050118015611d3d575060015f83815260088301602052604090205460ff166005811115611d3b57611d3b614db3565b145b611d595760405162461bcd60e51b81526004016105ca90615370565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d9291906004016153b7565b6020604051808303815f875af1158015611dae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd29190614f05565b505050565b5f611de06124b2565b611deb823334613506565b9050611e0360015f8051602061587483398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061589483398151915290528390208351918201909352825491925f8051602061585483398151915292829060ff166005811115611e8857611e88614db3565b6005811115611e9957611e99614db3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f46573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f6d919081019061544c565b9150915080611fd05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612013573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120379190614f05565b82511461209b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ca565b60208201516001600160a01b0316156121115760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ca565b5f80612120846040015161397c565b9150915081871461218d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ca565b9695505050505050565b5f8181525f805160206158948339815191526020526040812060020180545f8051602061585483398151915291600160401b9091046001600160401b03169060086121e18361551e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b612231815f613b54565b50565b5f9182525f80516020615894833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156122f5576122b5816001615539565b6122c0906008615307565b5081515f908390839081106122d7576122d7615041565b60200101906001600160f81b03191690815f1a9053506001016122a1565b505f5b60048110156123605761230c816003615539565b612317906008615307565b600263ffffffff16901c60f81b8282600261233291906152d2565b8151811061234257612342615041565b60200101906001600160f81b03191690815f1a9053506001016122f8565b505f5b60208110156123c25761237781601f615539565b612382906008615307565b86901c60f81b826123948360066152d2565b815181106123a4576123a4615041565b60200101906001600160f81b03191690815f1a905350600101612363565b505f5b600881101561242d576123d9816007615539565b6123e4906008615307565b6001600160401b038616901c60f81b826123ff8360266152d2565b8151811061240f5761240f615041565b60200101906001600160f81b03191690815f1a9053506001016123c5565b505f5b600881101561249857612444816007615539565b61244f906008615307565b6001600160401b038516901c60f81b8261246a83602e6152d2565b8151811061247a5761247a615041565b60200101906001600160f81b03191690815f1a905350600101612430565b50949350505050565b6124a9613dae565b61223181613df9565b5f805160206158748339815191528054600119016124e357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158148339815191529061ffff861610801590612535575061271061ffff861611155b6125515760405162461bcd60e51b81526004016105ca9061554c565b60028101546001600160401b0390811690851610156125ca5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ca565b805483101561262d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ca565b80600101548311156126945760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ca565b825f61269f82610b8c565b90505f6126ac8983613e6d565b905060405180606001604052806126c03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061587483398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158548339815191525f6127b585612af1565b90505f806127c68360400151613365565b91509150801561282b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ca565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561285c5761285c614db3565b600581111561286d5761286d614db3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156128de576128de614db3565b14806128fc57506001825160058111156128fa576128fa614db3565b145b61295b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ca565b60038251600581111561297057612970614db3565b0361297d57506004612981565b5060055b6020808301515f908152600988019091526040812055818160058111156129aa576129aa614db3565b908160058111156129bd576129bd614db3565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156129f1576129f1614db3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612aa557612aa5614db3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6118816001600160a01b03821683614351565b60408051606080820183525f8083526020830181905292820152905f805160206158548339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612b66573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612b8d919081019061544c565b9150915080612bed5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016105ca565b8254825114612c505760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ca565b60208201516001600160a01b031615612cc35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ca565b509392505050565b5f805f8351603614612cef5760405162461bcd60e51b81526004016105ca90615597565b5f805b6002811015612d3e57612d06816001615539565b612d11906008615307565b61ffff16868281518110612d2757612d27615041565b016020015160f81c901b9190911790600101612cf2565b5061ffff811615612d615760405162461bcd60e51b81526004016105ca906155e0565b5f805b6004811015612dbc57612d78816003615539565b612d83906008615307565b63ffffffff1687612d958360026152d2565b81518110612da557612da5615041565b016020015160f81c901b9190911790600101612d64565b5063ffffffff8116600414612de35760405162461bcd60e51b81526004016105ca90615623565b5f805b6020811015612e3857612dfa81601f615539565b612e05906008615307565b88612e118360066152d2565b81518110612e2157612e21615041565b016020015160f81c901b9190911790600101612de6565b505f805b6008811015612e9757612e50816007615539565b612e5b906008615307565b6001600160401b031689612e708360266152d2565b81518110612e8057612e80615041565b016020015160f81c901b9190911790600101612e3c565b505f805b6008811015612ef657612eaf816007615539565b612eba906008615307565b6001600160401b03168a612ecf83602e6152d2565b81518110612edf57612edf615041565b016020015160f81c901b9190911790600101612e9b565b5091989097509095509350505050565b5f8151602614612f285760405162461bcd60e51b81526004016105ca90615597565b5f805b6002811015612f7757612f3f816001615539565b612f4a906008615307565b61ffff16848281518110612f6057612f60615041565b016020015160f81c901b9190911790600101612f2b565b5061ffff811615612f9a5760405162461bcd60e51b81526004016105ca906155e0565b5f805b6004811015612ff557612fb1816003615539565b612fbc906008615307565b63ffffffff1685612fce8360026152d2565b81518110612fde57612fde615041565b016020015160f81c901b9190911790600101612f9d565b5063ffffffff81161561301a5760405162461bcd60e51b81526004016105ca90615623565b5f805b60208110156124985761303181601f615539565b61303c906008615307565b866130488360066152d2565b8151811061305857613058615041565b016020015160f81c901b919091179060010161301d565b5f8181525f805160206158948339815191526020526040808220815160e0810190925280545f8051602061585483398151915293929190829060ff1660058111156130bc576130bc614db3565b60058111156130cd576130cd614db3565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561313f5761313f614db3565b1461319b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ca565b6131a88160800151612227565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156131ec576131ec614db3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132a18461329b81612197565b5f61227c565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906132d0908590600401614ed3565b6020604051808303815f875af11580156132ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133109190614f05565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146133885760405162461bcd60e51b81526004016105ca90615597565b5f805b60028110156133d75761339f816001615539565b6133aa906008615307565b61ffff168582815181106133c0576133c0615041565b016020015160f81c901b919091179060010161338b565b5061ffff8116156133fa5760405162461bcd60e51b81526004016105ca906155e0565b5f805b600481101561345557613411816003615539565b61341c906008615307565b63ffffffff168661342e8360026152d2565b8151811061343e5761343e615041565b016020015160f81c901b91909117906001016133fd565b5063ffffffff811660031461347c5760405162461bcd60e51b81526004016105ca90615623565b5f805b60208110156134d15761349381601f615539565b61349e906008615307565b876134aa8360066152d2565b815181106134ba576134ba615041565b016020015160f81c901b919091179060010161347f565b505f866026815181106134e6576134e6615041565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206158148339815191528161351f84610b8c565b90505f61352b87611e08565b905060028151600581111561354257613542614db3565b146135a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ca565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166136345760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016105ca565b61363d826143e4565b5f82826080015161364e919061531e565b60048501546040840151919250613670916001600160401b039091169061566a565b6001600160401b0316816001600160401b031611156136ef5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ca565b6136f98882612234565b5f61370389612197565b90505f898260405160200161372f92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6137698d868861227c565b6040518263ffffffff1660e01b81526004016137859190614ed3565b6020604051808303815f875af11580156137a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c59190614f05565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561384d5761384d614db3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e1461399f5760405162461bcd60e51b81526004016105ca90615597565b5f805b60028110156139ee576139b6816001615539565b6139c1906008615307565b61ffff168582815181106139d7576139d7615041565b016020015160f81c901b91909117906001016139a2565b5061ffff811615613a115760405162461bcd60e51b81526004016105ca906155e0565b5f805b6004811015613a6c57613a28816003615539565b613a33906008615307565b63ffffffff1686613a458360026152d2565b81518110613a5557613a55615041565b016020015160f81c901b9190911790600101613a14565b5063ffffffff8116600514613a935760405162461bcd60e51b81526004016105ca90615623565b5f805b6020811015613ae857613aaa81601f615539565b613ab5906008615307565b87613ac18360066152d2565b81518110613ad157613ad1615041565b016020015160f81c901b9190911790600101613a96565b505f805b6008811015613b4757613b00816007615539565b613b0b906008615307565b6001600160401b031688613b208360266152d2565b81518110613b3057613b30615041565b016020015160f81c901b9190911790600101613aec565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615854833981519152914291901580613c3a575060028301548151613c36916001600160401b0316906152d2565b8210155b15613c60576001600160401b038516606082015281815260408101516020820152613c7f565b8481606001818151613c72919061531e565b6001600160401b03169052505b6060810151613c8f90606461566a565b602082015160028501546001600160401b039290921691613cba9190600160401b900460ff16615307565b1015613d1e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ca565b8315613d4757846001600160401b031681604001818151613d3f91906152d2565b905250613d66565b846001600160401b031681604001818151613d629190615539565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613df757604051631afcd79f60e31b815260040160405180910390fd5b565b613e01613dae565b613e0a816143ef565b613e12614408565b612231608082013560a0830135613e2f60e0850160c08601614d9a565b613e40610100860160e08701615695565b61ffff16613e56610120870161010088016156ae565b613e6861014088016101208901614fda565b614418565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613ef85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016105ca565b5f8051602061585483398151915242613f176040860160208701614d9a565b6001600160401b031611613f895760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ca565b613f996040850160208601614d9a565b6001600160401b0316613faf6202a300426152d2565b116140225760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ca565b83356140405760405162461bcd60e51b81526004016105ca9061519c565b83355f9081526009820160205260409020541561406f5760405162461bcd60e51b81526004016105ca906151dd565b61407c60408501856156ce565b905060301461409d5760405162461bcd60e51b81526004016105ca90615225565b6140a6836143e4565b5f806141406040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906140eb9190614d9a565b6001600160401b0316815260200161410660408a018a6156ce565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061465c565b5f8281526007860160205260409020919350915061415e8282615754565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061418b908590600401614ed3565b6020604051808303815f875af11580156141a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141cb9190614f05565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561424357614243614db3565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614323918e01908e01614d9a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156143745760405163cd78605960e01b81523060048201526024016105ca565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146143bd576040519150601f19603f3d011682016040523d82523d5f602084013e6143c2565b606091505b5050905080611dd257604051630a12f52160e11b815260040160405180910390fd5b612231816001613b54565b6143f7613dae565b6143ff614a0b565b61223181614a13565b614410613dae565b613df7614bb5565b614420613dae565b5f805160206158148339815191528361448c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ca565b6127108411156144ae5760405162461bcd60e51b81526004016105ca9061554c565b858711156145165760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ca565b5f8360ff16116145835760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ca565b600a60ff841611156145f55760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ca565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146146c65760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ca565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561473d576146fd816001615539565b614708906008615307565b5081515f9083908390811061471f5761471f615041565b60200101906001600160f81b03191690815f1a9053506001016146e9565b505f5b60048110156147a557614754816003615539565b61475f906008615307565b600160ff919091161c60f81b826147778360026152d2565b8151811061478757614787615041565b60200101906001600160f81b03191690815f1a905350600101614740565b505f5b602081101561480257845181602081106147c4576147c4615041565b1a60f81b826147d48360066152d2565b815181106147e4576147e4615041565b60200101906001600160f81b03191690815f1a9053506001016147a8565b505f5b6020811015614862578460200151816020811061482457614824615041565b1a60f81b826148348360266152d2565b8151811061484457614844615041565b60200101906001600160f81b03191690815f1a905350600101614805565b505f5b60088110156148d657614879816007615539565b614884906008615307565b60ff1685604001516001600160401b0316901c60f81b828260466148a891906152d2565b815181106148b8576148b8615041565b60200101906001600160f81b03191690815f1a905350600101614865565b505f5b603081101561494157846080015181815181106148f8576148f8615041565b01602001516001600160f81b0319168261491383604e6152d2565b8151811061492357614923615041565b60200101906001600160f81b03191690815f1a9053506001016148d9565b505f5b60088110156149b357614958816007615539565b614963906008615307565b60608601516001600160401b0390811691161c60f81b8261498583607e6152d2565b8151811061499557614995615041565b60200101906001600160f81b03191690815f1a905350600101614944565b506002816040516149c491906152c1565b602060405180830381855afa1580156149df573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a029190614f05565b94909350915050565b613df7613dae565b614a1b613dae565b80355f8051602061585483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614a6760808401606085016156ae565b60ff161115614ad45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ca565b5f614ae560808401606085016156ae565b60ff1611614b4d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ca565b614b5d60808301606084016156ae565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614b8e6060830160408401614d9a565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612753613dae565b508054614bc99061533e565b5f825580601f10614bd8575050565b601f0160209004905f5260205f209081019061223191905b80821115614c03575f8155600101614bf0565b5090565b8015158114612231575f80fd5b803563ffffffff81168114611e03575f80fd5b5f805f60608486031215614c39575f80fd5b833592506020840135614c4b81614c07565b9150614c5960408501614c14565b90509250925092565b5f60208284031215614c72575f80fd5b5035919050565b5f6101408284031215614c8a575f80fd5b50919050565b803561ffff81168114611e03575f80fd5b80356001600160401b0381168114611e03575f80fd5b5f805f60608486031215614cc9575f80fd5b83356001600160401b03811115614cde575f80fd5b840160608187031215614cef575f80fd5b9250614cfd60208501614c90565b9150614c5960408501614ca1565b5f60208284031215614d1b575f80fd5b610bcf82614c14565b5f8060408385031215614d35575f80fd5b614d3e83614c14565b946020939093013593505050565b5f8060408385031215614d5d575f80fd5b82356001600160401b03811115614d72575f80fd5b830160808186031215614d83575f80fd5b9150614d9160208401614c14565b90509250929050565b5f60208284031215614daa575f80fd5b610bcf82614ca1565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614dea57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e2560608401826001600160401b03169052565b506080830151614e4060808401826001600160401b03169052565b5060a0830151614e5b60a08401826001600160401b03169052565b5060c0830151614e7660c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e7657614e76614e7d565b5f5b83811015614ecb578181015183820152602001614eb3565b50505f910152565b602081525f8251806020840152614ef1816040850160208701614eb1565b601f01601f19169190910160400192915050565b5f60208284031215614f15575f80fd5b5051919050565b5f82614f3657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612231575f80fd5b5f60208284031215614fea575f80fd5b8135610bcf81614fc6565b5f808335601e1984360301811261500a575f80fd5b8301803591506001600160401b03821115615023575f80fd5b6020019150600581901b360382131561503a575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615069575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150a9576150a9615073565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150d7576150d7615073565b604052919050565b5f6001600160401b038211156150f7576150f7615073565b50601f01601f191660200190565b5f60608236031215615115575f80fd5b61511d615087565b82358152602061512e818501614ca1565b8183015260408401356001600160401b0381111561514a575f80fd5b840136601f82011261515a575f80fd5b803561516d615168826150df565b6150af565b8181523684838501011115615180575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615283818460208a01614eb1565b80830190508581526001600160401b0360c01b8560c01b16602082015283516152b3816028840160208801614eb1565b016028019695505050505050565b5f8251615069818460208701614eb1565b80820180821115610b9c57610b9c614e7d565b5f63ffffffff8083168181036152fd576152fd614e7d565b6001019392505050565b8082028115828204841417610b9c57610b9c614e7d565b6001600160401b03818116838216019080821115614e7657614e76614e7d565b600181811c9082168061535257607f821691505b602082108103614c8a57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546153c98161533e565b806020870152604060018084165f81146153ea576001811461540657615433565b60ff19851660408a0152604084151560051b8a01019550615433565b895f5260205f205f5b8581101561542a5781548b820186015290830190880161540f565b8a016040019650505b509398975050505050505050565b8051611e0381614c07565b5f806040838503121561545d575f80fd5b82516001600160401b0380821115615473575f80fd5b9084019060608287031215615486575f80fd5b61548e615087565b825181526020808401516154a181614fc6565b828201526040840151838111156154b6575f80fd5b80850194505087601f8501126154ca575f80fd5b835192506154da615168846150df565b83815288828587010111156154ed575f80fd5b6154fc84838301848801614eb1565b80604084015250819550615511818801615441565b9450505050509250929050565b5f6001600160401b038083168181036152fd576152fd614e7d565b81810381811115610b9c57610b9c614e7d565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461568d5761568d614e7d565b505092915050565b5f602082840312156156a5575f80fd5b610bcf82614c90565b5f602082840312156156be575f80fd5b813560ff81168114610bcf575f80fd5b5f808335601e198436030181126156e3575f80fd5b8301803591506001600160401b038211156156fc575f80fd5b60200191503681900382131561503a575f80fd5b601f821115611dd257805f5260205f20601f840160051c810160208510156157355750805b601f840160051c820191505b81811015611651575f8155600101615741565b81516001600160401b0381111561576d5761576d615073565b6157818161577b845461533e565b84615710565b602080601f8311600181146157b4575f841561579d5750858301515b5f19600386901b1c1916600185901b17855561580b565b5f85815260208120601f198616915b828110156157e2578886015182559484019460019091019084016157c3565b50858210156157ff57878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 35bfa3b07..a4628fa89 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -73,7 +73,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516139dd3803806139dd83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138908061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80638da5cb5b1161009e578063bee0a03f1161006e578063bee0a03f14610267578063c974d1b61461027a578063d5f20ff614610294578063df93d8de146102b4578063f2fde38b146102be575f80fd5b80638da5cb5b146101ef57806397fb70d414610233578063a3a65e4814610246578063b771b3bc14610259575f80fd5b806361e2f490116100d957806361e2f4901461019657806366435abf146101a9578063715018a6146101d45780638994ab49146101dc575f80fd5b80630322ed981461010a5780630cdd09851461011f578063467ef06f14610170578063580a400614610183575b5f80fd5b61011d610118366004612dad565b6102d1565b005b61015d61012d366004612dad565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011d61017e366004612ddc565b61048f565b61011d610191366004612e1f565b61049d565b61011d6101a4366004612e55565b6105ab565b6101bc6101b7366004612dad565b610cf7565b6040516001600160401b039091168152602001610167565b61011d610d0b565b61015d6101ea366004612eb5565b610d1e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610167565b61011d610241366004612dad565b610d3a565b61011d610254366004612ddc565b610d4e565b61021b6005600160991b0181565b61011d610275366004612dad565b610f06565b610282601481565b60405160ff9091168152602001610167565b6102a76102a2366004612dad565b611015565b6040516101679190612f0e565b6101bc6202a30081565b61011d6102cc366004612fc4565b611108565b5f8181525f805160206138648339815191526020526040808220815160e0810190925280545f8051602061384483398151915293929190829060ff16600581111561031e5761031e612efa565b600581111561032f5761032f612efa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561039e5761039e612efa565b146104085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042d8584606001515f611142565b6040518263ffffffff1660e01b81526004016104499190613008565b6020604051808303815f875af1158015610465573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610489919061303a565b50505050565b61049881611367565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104e15750825b90505f826001600160401b031660011480156104fc5750303b155b90508115801561050a575080155b156105285760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561055257845460ff60401b1916600160401b1785555b61055c87876116df565b83156105a257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206138448339815191529060ff16156106485760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103ff565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af919061303a565b8360200135146107115760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103ff565b306107226060850160408601612fc4565b6001600160a01b0316146107945760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103ff565b5f6107a26060850185613051565b9050116108015760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103ff565b5f61080f6060850185613051565b91505063ffffffff811061087b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103ff565b5f8435602086013560146108956060890160408a01612fc4565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610c07575f6109156060890189613051565b8363ffffffff1681811061092b5761092b61309d565b905060200281019061093d91906130b1565b61094690613161565b8051909150806109685760405162461bcd60e51b81526004016103ff906131f8565b5f818152600988016020526040902054156109955760405162461bcd60e51b81526004016103ff90613239565b8160400151516030146109ba5760405162461bcd60e51b81526004016103ff90613281565b84825f0151836020015184604001516040516020016109dc94939291906132ce565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610a2a919061331d565b602060405180830381855afa158015610a45573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a68919061303a565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610af457610af4612efa565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610ba7911686613342565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080610bff90613355565b9150506108f9565b50600584018190555f610c19866116fd565b90505f610c2982604001516118d7565b905080600285604051610c3c919061331d565b602060405180830381855afa158015610c57573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c7a919061303a565b14610cde5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103ff565b505050600a909201805460ff1916600117905550505050565b5f610d0182611015565b6080015192915050565b610d13611a40565b610d1c5f611a9b565b565b5f610d27611a40565b610d318383611b0b565b90505b92915050565b610d42611a40565b610d4b81611fef565b50565b5f805160206138448339815191525f610d66836116fd565b90505f80610d7783604001516122e5565b9150915080610dd95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103ff565b5f82815260078501602052604081208054610df390613377565b9050118015610e25575060015f83815260088601602052604090205460ff166005811115610e2357610e23612efa565b145b610e415760405162461bcd60e51b81526004016103ff906133a9565b5f8281526007850160205260408120610e5991612d63565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020613844833981519152929190610f4e90613377565b9050118015610f80575060015f83815260088301602052604090205460ff166005811115610f7e57610f7e612efa565b145b610f9c5760405162461bcd60e51b81526004016103ff906133a9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610fd591906004016133f0565b6020604051808303815f875af1158015610ff1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610498919061303a565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061386483398151915290528390208351918201909352825491925f8051602061384483398151915292829060ff16600581111561109557611095612efa565b60058111156110a6576110a6612efa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611110611a40565b6001600160a01b03811661113957604051631e4fbdf760e01b81525f60048201526024016103ff565b610d4b81611a9b565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156111bb5761117b81600161347a565b61118690600861348d565b5081515f9083908390811061119d5761119d61309d565b60200101906001600160f81b03191690815f1a905350600101611167565b505f5b6004811015611226576111d281600361347a565b6111dd90600861348d565b600263ffffffff16901c60f81b828260026111f89190613342565b815181106112085761120861309d565b60200101906001600160f81b03191690815f1a9053506001016111be565b505f5b60208110156112885761123d81601f61347a565b61124890600861348d565b86901c60f81b8261125a836006613342565b8151811061126a5761126a61309d565b60200101906001600160f81b03191690815f1a905350600101611229565b505f5b60088110156112f35761129f81600761347a565b6112aa90600861348d565b6001600160401b038616901c60f81b826112c5836026613342565b815181106112d5576112d561309d565b60200101906001600160f81b03191690815f1a90535060010161128b565b505f5b600881101561135e5761130a81600761347a565b61131590600861348d565b6001600160401b038516901c60f81b8261133083602e613342565b815181106113405761134061309d565b60200101906001600160f81b03191690815f1a9053506001016112f6565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206138448339815191525f6113b6856116fd565b90505f806113c783604001516122e5565b91509150801561142c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103ff565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561145d5761145d612efa565b600581111561146e5761146e612efa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156114df576114df612efa565b14806114fd57506001825160058111156114fb576114fb612efa565b145b61155c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103ff565b60038251600581111561157157611571612efa565b0361157e57506004611582565b5060055b6020808301515f908152600988019091526040812055818160058111156115ab576115ab612efa565b908160058111156115be576115be612efa565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156115f2576115f2612efa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156116a6576116a6612efa565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6116e7612486565b6116f0826124cf565b6116f9816124e8565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206138448339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611772573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261179991908101906134b3565b91509150806117f95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103ff565b825482511461185c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103ff565b60208201516001600160a01b0316156118cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103ff565b509392505050565b5f81516026146118f95760405162461bcd60e51b81526004016103ff90613585565b5f805b60028110156119485761191081600161347a565b61191b90600861348d565b61ffff168482815181106119315761193161309d565b016020015160f81c901b91909117906001016118fc565b5061ffff81161561196b5760405162461bcd60e51b81526004016103ff906135ce565b5f805b60048110156119c65761198281600361347a565b61198d90600861348d565b63ffffffff168561199f836002613342565b815181106119af576119af61309d565b016020015160f81c901b919091179060010161196e565b5063ffffffff8116156119eb5760405162461bcd60e51b81526004016103ff90613611565b5f805b602081101561135e57611a0281601f61347a565b611a0d90600861348d565b86611a19836006613342565b81518110611a2957611a2961309d565b016020015160f81c901b91909117906001016119ee565b33611a727f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d1c5760405163118cdaa760e01b81523360048201526024016103ff565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611b965760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103ff565b5f8051602061384483398151915242611bb56040860160208701613658565b6001600160401b031611611c275760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103ff565b611c376040850160208601613658565b6001600160401b0316611c4d6202a30042613342565b11611cc05760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103ff565b8335611cde5760405162461bcd60e51b81526004016103ff906131f8565b83355f90815260098201602052604090205415611d0d5760405162461bcd60e51b81526004016103ff90613239565b611d1a6040850185613671565b9050603014611d3b5760405162461bcd60e51b81526004016103ff90613281565b611d44836124f9565b5f80611dde6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611d899190613658565b6001600160401b03168152602001611da460408a018a613671565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612504565b5f82815260078601602052604090209193509150611dfc82826136fe565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e29908590600401613008565b6020604051808303815f875af1158015611e45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e69919061303a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611ee157611ee1612efa565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611fc1918e01908e01613658565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206138648339815191526020526040808220815160e0810190925280545f8051602061384483398151915293929190829060ff16600581111561203c5761203c612efa565b600581111561204d5761204d612efa565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156120bf576120bf612efa565b1461211b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103ff565b61212881608001516128b3565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561216c5761216c612efa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6122218461221b816128bd565b5f611142565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612250908590600401613008565b6020604051808303815f875af115801561226c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612290919061303a565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146123085760405162461bcd60e51b81526004016103ff90613585565b5f805b60028110156123575761231f81600161347a565b61232a90600861348d565b61ffff168582815181106123405761234061309d565b016020015160f81c901b919091179060010161230b565b5061ffff81161561237a5760405162461bcd60e51b81526004016103ff906135ce565b5f805b60048110156123d55761239181600361347a565b61239c90600861348d565b63ffffffff16866123ae836002613342565b815181106123be576123be61309d565b016020015160f81c901b919091179060010161237d565b5063ffffffff81166003146123fc5760405162461bcd60e51b81526004016103ff90613611565b5f805b60208110156124515761241381601f61347a565b61241e90600861348d565b8761242a836006613342565b8151811061243a5761243a61309d565b016020015160f81c901b91909117906001016123ff565b505f866026815181106124665761246661309d565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d1c57604051631afcd79f60e31b815260040160405180910390fd5b6124d7612486565b6124df61294d565b610d4b81612955565b6124f0612486565b610d4b81612b01565b610d4b816001612b09565b5f606082608001515160301461256e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103ff565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156125e5576125a581600161347a565b6125b090600861348d565b5081515f908390839081106125c7576125c761309d565b60200101906001600160f81b03191690815f1a905350600101612591565b505f5b600481101561264d576125fc81600361347a565b61260790600861348d565b600160ff919091161c60f81b8261261f836002613342565b8151811061262f5761262f61309d565b60200101906001600160f81b03191690815f1a9053506001016125e8565b505f5b60208110156126aa578451816020811061266c5761266c61309d565b1a60f81b8261267c836006613342565b8151811061268c5761268c61309d565b60200101906001600160f81b03191690815f1a905350600101612650565b505f5b602081101561270a57846020015181602081106126cc576126cc61309d565b1a60f81b826126dc836026613342565b815181106126ec576126ec61309d565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b600881101561277e5761272181600761347a565b61272c90600861348d565b60ff1685604001516001600160401b0316901c60f81b828260466127509190613342565b815181106127605761276061309d565b60200101906001600160f81b03191690815f1a90535060010161270d565b505f5b60308110156127e957846080015181815181106127a0576127a061309d565b01602001516001600160f81b031916826127bb83604e613342565b815181106127cb576127cb61309d565b60200101906001600160f81b03191690815f1a905350600101612781565b505f5b600881101561285b5761280081600761347a565b61280b90600861348d565b60608601516001600160401b0390811691161c60f81b8261282d83607e613342565b8151811061283d5761283d61309d565b60200101906001600160f81b03191690815f1a9053506001016127ec565b5060028160405161286c919061331d565b602060405180830381855afa158015612887573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128aa919061303a565b94909350915050565b610d4b815f612b09565b5f8181525f805160206138648339815191526020526040812060020180545f8051602061384483398151915291600160401b9091046001600160401b0316906008612907836137bd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b610d1c612486565b61295d612486565b80355f8051602061384483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146129a960808401606085016137d8565b60ff161115612a165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103ff565b5f612a2760808401606085016137d8565b60ff1611612a8f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103ff565b612a9f60808301606084016137d8565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612ad06060830160408401613658565b60028201805467ffffffffffffffff19166001600160401b0392909216919091179055600a01805460ff1916905550565b611110612486565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020613844833981519152914291901580612bef575060028301548151612beb916001600160401b031690613342565b8210155b15612c15576001600160401b038516606082015281815260408101516020820152612c34565b8481606001818151612c2791906137f8565b6001600160401b03169052505b6060810151612c44906064613818565b602082015160028501546001600160401b039290921691612c6f9190600160401b900460ff1661348d565b1015612cd35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103ff565b8315612cfc57846001600160401b031681604001818151612cf49190613342565b905250612d1b565b846001600160401b031681604001818151612d17919061347a565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b508054612d6f90613377565b5f825580601f10612d7e575050565b601f0160209004905f5260205f2090810190610d4b91905b80821115612da9575f8155600101612d96565b5090565b5f60208284031215612dbd575f80fd5b5035919050565b803563ffffffff81168114612dd7575f80fd5b919050565b5f60208284031215612dec575f80fd5b610d3182612dc4565b5f60808284031215612e05575f80fd5b50919050565b6001600160a01b0381168114610d4b575f80fd5b5f8060a08385031215612e30575f80fd5b612e3a8484612df5565b91506080830135612e4a81612e0b565b809150509250929050565b5f8060408385031215612e66575f80fd5b82356001600160401b03811115612e7b575f80fd5b612e8785828601612df5565b925050612e9660208401612dc4565b90509250929050565b80356001600160401b0381168114612dd7575f80fd5b5f8060408385031215612ec6575f80fd5b82356001600160401b03811115612edb575f80fd5b830160608186031215612eec575f80fd5b9150612e9660208401612e9f565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f3157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f6c60608401826001600160401b03169052565b506080830151612f8760808401826001600160401b03169052565b5060a0830151612fa260a08401826001600160401b03169052565b5060c0830151612fbd60c08401826001600160401b03169052565b5092915050565b5f60208284031215612fd4575f80fd5b8135612fdf81612e0b565b9392505050565b5f5b83811015613000578181015183820152602001612fe8565b50505f910152565b602081525f8251806020840152613026816040850160208701612fe6565b601f01601f19169190910160400192915050565b5f6020828403121561304a575f80fd5b5051919050565b5f808335601e19843603018112613066575f80fd5b8301803591506001600160401b0382111561307f575f80fd5b6020019150600581901b3603821315613096575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130c5575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613105576131056130cf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613133576131336130cf565b604052919050565b5f6001600160401b03821115613153576131536130cf565b50601f01601f191660200190565b5f60608236031215613171575f80fd5b6131796130e3565b82358152602061318a818501612e9f565b8183015260408401356001600160401b038111156131a6575f80fd5b840136601f8201126131b6575f80fd5b80356131c96131c48261313b565b61310b565b81815236848385010111156131dc575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516132df818460208a01612fe6565b80830190508581526001600160401b0360c01b8560c01b166020820152835161330f816028840160208801612fe6565b016028019695505050505050565b5f82516130c5818460208701612fe6565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d3457610d3461332e565b5f63ffffffff80831681810361336d5761336d61332e565b6001019392505050565b600181811c9082168061338b57607f821691505b602082108103612e0557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461340281613377565b806020870152604060018084165f8114613423576001811461343f5761346c565b60ff19851660408a0152604084151560051b8a0101955061346c565b895f5260205f205f5b858110156134635781548b8201860152908301908801613448565b8a016040019650505b509398975050505050505050565b81810381811115610d3457610d3461332e565b8082028115828204841417610d3457610d3461332e565b80518015158114612dd7575f80fd5b5f80604083850312156134c4575f80fd5b82516001600160401b03808211156134da575f80fd5b90840190606082870312156134ed575f80fd5b6134f56130e3565b8251815260208084015161350881612e0b565b8282015260408401518381111561351d575f80fd5b80850194505087601f850112613531575f80fd5b835192506135416131c48461313b565b8381528882858701011115613554575f80fd5b61356384838301848801612fe6565b806040840152508195506135788188016134a4565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f60208284031215613668575f80fd5b610d3182612e9f565b5f808335601e19843603018112613686575f80fd5b8301803591506001600160401b0382111561369f575f80fd5b602001915036819003821315613096575f80fd5b601f82111561049857805f5260205f20601f840160051c810160208510156136d85750805b601f840160051c820191505b818110156136f7575f81556001016136e4565b5050505050565b81516001600160401b03811115613717576137176130cf565b61372b816137258454613377565b846136b3565b602080601f83116001811461375e575f84156137475750858301515b5f19600386901b1c1916600185901b1785556137b5565b5f85815260208120601f198616915b8281101561378c5788860151825594840194600190910190840161376d565b50858210156137a957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b0380831681810361336d5761336d61332e565b5f602082840312156137e8575f80fd5b813560ff81168114612fdf575f80fd5b6001600160401b03818116838216019080821115612fbd57612fbd61332e565b6001600160401b0381811683821602808216919082811461383b5761383b61332e565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516139d33803806139d383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138868061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80638da5cb5b1161009e578063bee0a03f1161006e578063bee0a03f14610267578063c974d1b61461027a578063d5f20ff614610294578063df93d8de146102b4578063f2fde38b146102be575f80fd5b80638da5cb5b146101ef57806397fb70d414610233578063a3a65e4814610246578063b771b3bc14610259575f80fd5b806361e2f490116100d957806361e2f4901461019657806366435abf146101a9578063715018a6146101d45780638994ab49146101dc575f80fd5b80630322ed981461010a5780630cdd09851461011f578063467ef06f14610170578063580a400614610183575b5f80fd5b61011d610118366004612da3565b6102d1565b005b61015d61012d366004612da3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011d61017e366004612dd2565b61048f565b61011d610191366004612e15565b61049d565b61011d6101a4366004612e4b565b6105ab565b6101bc6101b7366004612da3565b610cf7565b6040516001600160401b039091168152602001610167565b61011d610d0b565b61015d6101ea366004612eab565b610d1e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610167565b61011d610241366004612da3565b610d3a565b61011d610254366004612dd2565b610d4e565b61021b6005600160991b0181565b61011d610275366004612da3565b610f06565b610282601481565b60405160ff9091168152602001610167565b6102a76102a2366004612da3565b611015565b6040516101679190612f04565b6101bc6202a30081565b61011d6102cc366004612fba565b611108565b5f8181525f8051602061385a8339815191526020526040808220815160e0810190925280545f8051602061383a83398151915293929190829060ff16600581111561031e5761031e612ef0565b600581111561032f5761032f612ef0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561039e5761039e612ef0565b146104085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042d8584606001515f611142565b6040518263ffffffff1660e01b81526004016104499190612ffe565b6020604051808303815f875af1158015610465573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104899190613030565b50505050565b61049881611367565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104e15750825b90505f826001600160401b031660011480156104fc5750303b155b90508115801561050a575080155b156105285760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561055257845460ff60401b1916600160401b1785555b61055c87876116df565b83156105a257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f8051602061383a8339815191529060ff16156106485760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103ff565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af9190613030565b8360200135146107115760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103ff565b306107226060850160408601612fba565b6001600160a01b0316146107945760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103ff565b5f6107a26060850185613047565b9050116108015760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103ff565b5f61080f6060850185613047565b91505063ffffffff811061087b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103ff565b5f8435602086013560146108956060890160408a01612fba565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610c07575f6109156060890189613047565b8363ffffffff1681811061092b5761092b613093565b905060200281019061093d91906130a7565b61094690613157565b8051909150806109685760405162461bcd60e51b81526004016103ff906131ee565b5f818152600988016020526040902054156109955760405162461bcd60e51b81526004016103ff9061322f565b8160400151516030146109ba5760405162461bcd60e51b81526004016103ff90613277565b84825f0151836020015184604001516040516020016109dc94939291906132c4565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610a2a9190613313565b602060405180830381855afa158015610a45573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a689190613030565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610af457610af4612ef0565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610ba7911686613338565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080610bff9061334b565b9150506108f9565b50600584018190555f610c19866116fd565b90505f610c2982604001516118d7565b905080600285604051610c3c9190613313565b602060405180830381855afa158015610c57573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c7a9190613030565b14610cde5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103ff565b505050600a909201805460ff1916600117905550505050565b5f610d0182611015565b6080015192915050565b610d13611a40565b610d1c5f611a9b565b565b5f610d27611a40565b610d318383611b0b565b90505b92915050565b610d42611a40565b610d4b81611fef565b50565b5f8051602061383a8339815191525f610d66836116fd565b90505f80610d7783604001516122e5565b9150915080610dd95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103ff565b5f82815260078501602052604081208054610df39061336d565b9050118015610e25575060015f83815260088601602052604090205460ff166005811115610e2357610e23612ef0565b145b610e415760405162461bcd60e51b81526004016103ff9061339f565b5f8281526007850160205260408120610e5991612d59565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061383a833981519152929190610f4e9061336d565b9050118015610f80575060015f83815260088301602052604090205460ff166005811115610f7e57610f7e612ef0565b145b610f9c5760405162461bcd60e51b81526004016103ff9061339f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610fd591906004016133e6565b6020604051808303815f875af1158015610ff1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104989190613030565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061385a83398151915290528390208351918201909352825491925f8051602061383a83398151915292829060ff16600581111561109557611095612ef0565b60058111156110a6576110a6612ef0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611110611a40565b6001600160a01b03811661113957604051631e4fbdf760e01b81525f60048201526024016103ff565b610d4b81611a9b565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156111bb5761117b816001613470565b611186906008613483565b5081515f9083908390811061119d5761119d613093565b60200101906001600160f81b03191690815f1a905350600101611167565b505f5b6004811015611226576111d2816003613470565b6111dd906008613483565b600263ffffffff16901c60f81b828260026111f89190613338565b8151811061120857611208613093565b60200101906001600160f81b03191690815f1a9053506001016111be565b505f5b60208110156112885761123d81601f613470565b611248906008613483565b86901c60f81b8261125a836006613338565b8151811061126a5761126a613093565b60200101906001600160f81b03191690815f1a905350600101611229565b505f5b60088110156112f35761129f816007613470565b6112aa906008613483565b6001600160401b038616901c60f81b826112c5836026613338565b815181106112d5576112d5613093565b60200101906001600160f81b03191690815f1a90535060010161128b565b505f5b600881101561135e5761130a816007613470565b611315906008613483565b6001600160401b038516901c60f81b8261133083602e613338565b8151811061134057611340613093565b60200101906001600160f81b03191690815f1a9053506001016112f6565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061383a8339815191525f6113b6856116fd565b90505f806113c783604001516122e5565b91509150801561142c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103ff565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561145d5761145d612ef0565b600581111561146e5761146e612ef0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156114df576114df612ef0565b14806114fd57506001825160058111156114fb576114fb612ef0565b145b61155c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103ff565b60038251600581111561157157611571612ef0565b0361157e57506004611582565b5060055b6020808301515f908152600988019091526040812055818160058111156115ab576115ab612ef0565b908160058111156115be576115be612ef0565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156115f2576115f2612ef0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156116a6576116a6612ef0565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6116e7612486565b6116f0826124cf565b6116f9816124e8565b5050565b60408051606080820183525f8083526020830181905292820152905f8051602061383a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611772573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261179991908101906134a9565b91509150806117f95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103ff565b825482511461185c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103ff565b60208201516001600160a01b0316156118cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103ff565b509392505050565b5f81516026146118f95760405162461bcd60e51b81526004016103ff9061357b565b5f805b600281101561194857611910816001613470565b61191b906008613483565b61ffff1684828151811061193157611931613093565b016020015160f81c901b91909117906001016118fc565b5061ffff81161561196b5760405162461bcd60e51b81526004016103ff906135c4565b5f805b60048110156119c657611982816003613470565b61198d906008613483565b63ffffffff168561199f836002613338565b815181106119af576119af613093565b016020015160f81c901b919091179060010161196e565b5063ffffffff8116156119eb5760405162461bcd60e51b81526004016103ff90613607565b5f805b602081101561135e57611a0281601f613470565b611a0d906008613483565b86611a19836006613338565b81518110611a2957611a29613093565b016020015160f81c901b91909117906001016119ee565b33611a727f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d1c5760405163118cdaa760e01b81523360048201526024016103ff565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611b965760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103ff565b5f8051602061383a83398151915242611bb5604086016020870161364e565b6001600160401b031611611c275760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103ff565b611c37604085016020860161364e565b6001600160401b0316611c4d6202a30042613338565b11611cc05760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103ff565b8335611cde5760405162461bcd60e51b81526004016103ff906131ee565b83355f90815260098201602052604090205415611d0d5760405162461bcd60e51b81526004016103ff9061322f565b611d1a6040850185613667565b9050603014611d3b5760405162461bcd60e51b81526004016103ff90613277565b611d44836124f9565b5f80611dde6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611d89919061364e565b6001600160401b03168152602001611da460408a018a613667565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612504565b5f82815260078601602052604090209193509150611dfc82826136f4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e29908590600401612ffe565b6020604051808303815f875af1158015611e45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e699190613030565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611ee157611ee1612ef0565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611fc1918e01908e0161364e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f8051602061385a8339815191526020526040808220815160e0810190925280545f8051602061383a83398151915293929190829060ff16600581111561203c5761203c612ef0565b600581111561204d5761204d612ef0565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156120bf576120bf612ef0565b1461211b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103ff565b61212881608001516128b3565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561216c5761216c612ef0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6122218461221b816128bd565b5f611142565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612250908590600401612ffe565b6020604051808303815f875af115801561226c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122909190613030565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146123085760405162461bcd60e51b81526004016103ff9061357b565b5f805b60028110156123575761231f816001613470565b61232a906008613483565b61ffff1685828151811061234057612340613093565b016020015160f81c901b919091179060010161230b565b5061ffff81161561237a5760405162461bcd60e51b81526004016103ff906135c4565b5f805b60048110156123d557612391816003613470565b61239c906008613483565b63ffffffff16866123ae836002613338565b815181106123be576123be613093565b016020015160f81c901b919091179060010161237d565b5063ffffffff81166003146123fc5760405162461bcd60e51b81526004016103ff90613607565b5f805b60208110156124515761241381601f613470565b61241e906008613483565b8761242a836006613338565b8151811061243a5761243a613093565b016020015160f81c901b91909117906001016123ff565b505f8660268151811061246657612466613093565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d1c57604051631afcd79f60e31b815260040160405180910390fd5b6124d7612486565b6124df61294d565b610d4b81612955565b6124f0612486565b610d4b81612af7565b610d4b816001612aff565b5f606082608001515160301461256e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103ff565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156125e5576125a5816001613470565b6125b0906008613483565b5081515f908390839081106125c7576125c7613093565b60200101906001600160f81b03191690815f1a905350600101612591565b505f5b600481101561264d576125fc816003613470565b612607906008613483565b600160ff919091161c60f81b8261261f836002613338565b8151811061262f5761262f613093565b60200101906001600160f81b03191690815f1a9053506001016125e8565b505f5b60208110156126aa578451816020811061266c5761266c613093565b1a60f81b8261267c836006613338565b8151811061268c5761268c613093565b60200101906001600160f81b03191690815f1a905350600101612650565b505f5b602081101561270a57846020015181602081106126cc576126cc613093565b1a60f81b826126dc836026613338565b815181106126ec576126ec613093565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b600881101561277e57612721816007613470565b61272c906008613483565b60ff1685604001516001600160401b0316901c60f81b828260466127509190613338565b8151811061276057612760613093565b60200101906001600160f81b03191690815f1a90535060010161270d565b505f5b60308110156127e957846080015181815181106127a0576127a0613093565b01602001516001600160f81b031916826127bb83604e613338565b815181106127cb576127cb613093565b60200101906001600160f81b03191690815f1a905350600101612781565b505f5b600881101561285b57612800816007613470565b61280b906008613483565b60608601516001600160401b0390811691161c60f81b8261282d83607e613338565b8151811061283d5761283d613093565b60200101906001600160f81b03191690815f1a9053506001016127ec565b5060028160405161286c9190613313565b602060405180830381855afa158015612887573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128aa9190613030565b94909350915050565b610d4b815f612aff565b5f8181525f8051602061385a8339815191526020526040812060020180545f8051602061383a83398151915291600160401b9091046001600160401b0316906008612907836137b3565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b610d1c612486565b61295d612486565b80355f8051602061383a83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146129a960808401606085016137ce565b60ff161115612a165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103ff565b5f612a2760808401606085016137ce565b60ff1611612a8f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103ff565b612a9f60808301606084016137ce565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612ad0606083016040840161364e565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b611110612486565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061383a833981519152914291901580612be5575060028301548151612be1916001600160401b031690613338565b8210155b15612c0b576001600160401b038516606082015281815260408101516020820152612c2a565b8481606001818151612c1d91906137ee565b6001600160401b03169052505b6060810151612c3a90606461380e565b602082015160028501546001600160401b039290921691612c659190600160401b900460ff16613483565b1015612cc95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103ff565b8315612cf257846001600160401b031681604001818151612cea9190613338565b905250612d11565b846001600160401b031681604001818151612d0d9190613470565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b508054612d659061336d565b5f825580601f10612d74575050565b601f0160209004905f5260205f2090810190610d4b91905b80821115612d9f575f8155600101612d8c565b5090565b5f60208284031215612db3575f80fd5b5035919050565b803563ffffffff81168114612dcd575f80fd5b919050565b5f60208284031215612de2575f80fd5b610d3182612dba565b5f60808284031215612dfb575f80fd5b50919050565b6001600160a01b0381168114610d4b575f80fd5b5f8060a08385031215612e26575f80fd5b612e308484612deb565b91506080830135612e4081612e01565b809150509250929050565b5f8060408385031215612e5c575f80fd5b82356001600160401b03811115612e71575f80fd5b612e7d85828601612deb565b925050612e8c60208401612dba565b90509250929050565b80356001600160401b0381168114612dcd575f80fd5b5f8060408385031215612ebc575f80fd5b82356001600160401b03811115612ed1575f80fd5b830160608186031215612ee2575f80fd5b9150612e8c60208401612e95565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f2757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f6260608401826001600160401b03169052565b506080830151612f7d60808401826001600160401b03169052565b5060a0830151612f9860a08401826001600160401b03169052565b5060c0830151612fb360c08401826001600160401b03169052565b5092915050565b5f60208284031215612fca575f80fd5b8135612fd581612e01565b9392505050565b5f5b83811015612ff6578181015183820152602001612fde565b50505f910152565b602081525f825180602084015261301c816040850160208701612fdc565b601f01601f19169190910160400192915050565b5f60208284031215613040575f80fd5b5051919050565b5f808335601e1984360301811261305c575f80fd5b8301803591506001600160401b03821115613075575f80fd5b6020019150600581901b360382131561308c575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130bb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130fb576130fb6130c5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613129576131296130c5565b604052919050565b5f6001600160401b03821115613149576131496130c5565b50601f01601f191660200190565b5f60608236031215613167575f80fd5b61316f6130d9565b823581526020613180818501612e95565b8183015260408401356001600160401b0381111561319c575f80fd5b840136601f8201126131ac575f80fd5b80356131bf6131ba82613131565b613101565b81815236848385010111156131d2575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516132d5818460208a01612fdc565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613305816028840160208801612fdc565b016028019695505050505050565b5f82516130bb818460208701612fdc565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d3457610d34613324565b5f63ffffffff80831681810361336357613363613324565b6001019392505050565b600181811c9082168061338157607f821691505b602082108103612dfb57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546133f88161336d565b806020870152604060018084165f8114613419576001811461343557613462565b60ff19851660408a0152604084151560051b8a01019550613462565b895f5260205f205f5b858110156134595781548b820186015290830190880161343e565b8a016040019650505b509398975050505050505050565b81810381811115610d3457610d34613324565b8082028115828204841417610d3457610d34613324565b80518015158114612dcd575f80fd5b5f80604083850312156134ba575f80fd5b82516001600160401b03808211156134d0575f80fd5b90840190606082870312156134e3575f80fd5b6134eb6130d9565b825181526020808401516134fe81612e01565b82820152604084015183811115613513575f80fd5b80850194505087601f850112613527575f80fd5b835192506135376131ba84613131565b838152888285870101111561354a575f80fd5b61355984838301848801612fdc565b8060408401525081955061356e81880161349a565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561365e575f80fd5b610d3182612e95565b5f808335601e1984360301811261367c575f80fd5b8301803591506001600160401b03821115613695575f80fd5b60200191503681900382131561308c575f80fd5b601f82111561049857805f5260205f20601f840160051c810160208510156136ce5750805b601f840160051c820191505b818110156136ed575f81556001016136da565b5050505050565b81516001600160401b0381111561370d5761370d6130c5565b6137218161371b845461336d565b846136a9565b602080601f831160018114613754575f841561373d5750858301515b5f19600386901b1c1916600185901b1785556137ab565b5f85815260208120601f198616915b8281101561378257888601518255948401946001909101908401613763565b508582101561379f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b0380831681810361336357613363613324565b5f602082840312156137de575f80fd5b813560ff81168114612fd5575f80fd5b6001600160401b03818116838216019080821115612fb357612fb3613324565b6001600160401b0381811683821602808216919082811461383157613831613324565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index eec31de9f..d3999179c 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -105,7 +105,6 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ); $._maximumChurnPercentage = settings.maximumChurnPercentage; $._churnPeriodSeconds = settings.churnPeriodSeconds; - $._initializedValidatorSet = false; } modifier initializedValidatorSet() { From 7e6cbd5b48346a8cb2340c4315f71f6dd6a2e101 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Tue, 17 Sep 2024 14:32:42 -0400 Subject: [PATCH 314/545] poa->pos testing fix --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/staking/ValidatorManager.sol | 2 +- tests/flows/staking/poa_to_pos.go | 13 ++----------- tests/utils/staking.go | 1 - 6 files changed, 6 insertions(+), 16 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 336c1740e..78f438eb6 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615dac380380615dac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c5f8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806366435abf116100bf578063ba3a4b9711610079578063ba3a4b971461030a578063bee0a03f1461031d578063c974d1b614610330578063d5f20ff614610338578063df93d8de14610358578063eb0acb8914610362575f80fd5b806366435abf1461028557806376f786211461029857806398f3e2b4146102ab5780639e1bc4ef146102be578063a3a65e48146102d1578063b771b3bc146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c57806361e2f4901461025f5780636206585614610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614f4d565b610375565b005b61015f61016f366004614f88565b610806565b6101b2610182366004614f88565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614f88565b6109bf565b6040516001600160401b0390911681526020016101bc565b61015f610218366004614fb3565b6109d5565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614ff1565b610ab4565b61015f61025a36600461500a565b610b07565b61015f61026d366004615032565b610cdc565b6101b2610280366004615096565b611428565b6101f2610293366004614f88565b611441565b61015f6102a6366004614f4d565b611455565b61015f6102b936600461500a565b611536565b6101b26102cc3660046150af565b611763565b61015f6102df366004614ff1565b61178f565b6102f26005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610318366004614f88565b611947565b61015f61032b366004614f88565b611bcd565b6101cd601481565b61034b610346366004614f88565b611ce1565b6040516101bc91906150e3565b6101f26202a30081565b6101b26103703660046151aa565b611dd4565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615bb38339815191529184156103c7576103c48285611e09565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103f9576103f96150cf565b600481111561040a5761040a6150cf565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610491576104916150cf565b146104e35760405162461bcd60e51b815260206004820152602a60248201525f80516020615bd38339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105485760405162461bcd60e51b815260206004820152603360248201525f80516020615bd38339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104da565b5f610552846120a5565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561059f5761059f6150cf565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61067185611ce1565b905082606001516001600160401b031681608001516001600160401b0316116106e85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104da565b6002815160058111156106fd576106fd6150cf565b0361070f5761070f8360600151612135565b5f836060015182608001516107249190615223565b90506107308682612142565b5f6005600160991b0163ee5b48eb61074989878661218a565b6040518263ffffffff1660e01b81526004016107659190615265565b6020604051808303815f875af1158015610781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a59190615297565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020615c338339815191526020526040808220815160e0810190925280545f80516020615bf383398151915293929190829060ff166005811115610853576108536150cf565b6005811115610864576108646150cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108d3576108d36150cf565b146109385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb61095d8584606001515f61218a565b6040518263ffffffff1660e01b81526004016109799190615265565b6020604051808303815f875af1158015610995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b99190615297565b50505050565b5f6109cf64e8d4a51000836152ae565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a1e575080546001600160401b03808416911610155b15610a3c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6784846123b1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615bb38339815191525f80610acd846123cb565b6040808201515f8481526005880160205291909120549294509092506109b9916001600160401b03909116906001600160a01b0316612743565b5f80516020615bb38339815191525f610b1f84612779565b90505f80610b308360400151612953565b50915091505f610b3f83611ce1565b9050816001600160401b031681606001516001600160401b03161015610b775760405162461bcd60e51b81526004016104da906152cd565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bbc5760405162461bcd60e51b81526004016104da9061530f565b60015f87815260068701602052604090205460ff166004811115610be257610be26150cf565b14610c4b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bf38339815191529060ff1615610d795760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de09190615297565b836020013514610e425760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104da565b30610e536060850160408601615358565b6001600160a01b031614610ec55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104da565b5f610ed36060850185615373565b905011610f325760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104da565b5f610f406060850185615373565b91505063ffffffff8110610fac5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104da565b5f843560208601356014610fc66060890160408a01615358565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611338575f6110466060890189615373565b8363ffffffff1681811061105c5761105c6153bf565b905060200281019061106e91906153d3565b61107790615483565b8051909150806110995760405162461bcd60e51b81526004016104da9061551a565b5f818152600988016020526040902054156110c65760405162461bcd60e51b81526004016104da9061555b565b8160400151516030146110eb5760405162461bcd60e51b81526004016104da906155a3565b84825f01518360200151846040015160405160200161110d94939291906155f0565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161115b919061563f565b602060405180830381855afa158015611176573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111999190615297565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115611225576112256150cf565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112d8911686615650565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050808061133090615663565b91505061102a565b50600584018190555f61134a86612779565b90505f61135a8260400151612b8e565b90508060028560405161136d919061563f565b602060405180830381855afa158015611388573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113ab9190615297565b1461140f5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104da565b505050600a909201805460ff1916600117905550505050565b5f6109cf6001600160401b03831664e8d4a51000615685565b5f61144b82611ce1565b6080015192915050565b5f80516020615bb38339815191525f61146d85611ce1565b5f86815260058401602052604090205460a08201519192506114a091600160b01b9091046001600160401b03169061569c565b6001600160401b03164210156115145760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104da565b8315611526576115248584611e09565b505b61152f85612d00565b5050505050565b61153e612ff6565b5f80516020615bb38339815191525f61155684612779565b90505f806115678360400151612953565b50915091505f61157683611ce1565b9050816001600160401b031681606001516001600160401b031610156115ae5760405162461bcd60e51b81526004016104da906152cd565b5f8681526006860160205260409020600301546001600160401b03808416911611156115ec5760405162461bcd60e51b81526004016104da9061530f565b60035f87815260068701602052604090205460ff166004811115611612576116126150cf565b146116665760405162461bcd60e51b815260206004820152603160248201525f80516020615bd38339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261170b91612743565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061175f60015f80516020615c1383398151915255565b5050565b5f61176c612ff6565b611777833384613040565b90506109cf60015f80516020615c1383398151915255565b5f80516020615bf38339815191525f6117a783612779565b90505f806117b883604001516134b9565b915091508061181a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104da565b5f82815260078501602052604081208054611834906156bc565b9050118015611866575060015f83815260088601602052604090205460ff166005811115611864576118646150cf565b145b6118825760405162461bcd60e51b81526004016104da906156f4565b5f828152600785016020526040812061189a91614ede565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bb383398151915293929190829060ff1660048111156119a8576119a86150cf565b60048111156119b9576119b96150cf565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a4057611a406150cf565b1480611a5e5750600381516004811115611a5c57611a5c6150cf565b145b611ab25760405162461bcd60e51b815260206004820152603260248201525f80516020615bd3833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104da565b5f611ac08260400151611ce1565b905080606001516001600160401b03165f03611b445760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb611b7184604001518460600151856080015161218a565b6040518263ffffffff1660e01b8152600401611b8d9190615265565b6020604051808303815f875af1158015611ba9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152f9190615297565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bf3833981519152929190611c15906156bc565b9050118015611c47575060015f83815260088301602052604090205460ff166005811115611c4557611c456150cf565b145b611c635760405162461bcd60e51b81526004016104da906156f4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c9c919060040161573b565b6020604051808303815f875af1158015611cb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cdc9190615297565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020615c3383398151915290528390208351918201909352825491925f80516020615bf383398151915292829060ff166005811115611d6157611d616150cf565b6005811115611d7257611d726150cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611ddd612ff6565b611de98585858561365a565b9050611e0160015f80516020615c1383398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e54573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e7b91908101906157d0565b9150915080611ede5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f459190615297565b825114611fa95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104da565b60208201516001600160a01b03161561201f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104da565b5f8061202e84604001516138cf565b9150915081871461209b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104da565b9695505050505050565b5f8181525f80516020615c338339815191526020526040812060020180545f80516020615bf383398151915291600160401b9091046001600160401b03169060086120ef836158a2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b61213f815f613aa7565b50565b5f9182525f80516020615c33833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612203576121c38160016158bd565b6121ce906008615685565b5081515f908390839081106121e5576121e56153bf565b60200101906001600160f81b03191690815f1a9053506001016121af565b505f5b600481101561226e5761221a8160036158bd565b612225906008615685565b600263ffffffff16901c60f81b828260026122409190615650565b81518110612250576122506153bf565b60200101906001600160f81b03191690815f1a905350600101612206565b505f5b60208110156122d05761228581601f6158bd565b612290906008615685565b86901c60f81b826122a2836006615650565b815181106122b2576122b26153bf565b60200101906001600160f81b03191690815f1a905350600101612271565b505f5b600881101561233b576122e78160076158bd565b6122f2906008615685565b6001600160401b038616901c60f81b8261230d836026615650565b8151811061231d5761231d6153bf565b60200101906001600160f81b03191690815f1a9053506001016122d3565b505f5b60088110156123a6576123528160076158bd565b61235d906008615685565b6001600160401b038516901c60f81b8261237883602e615650565b81518110612388576123886153bf565b60200101906001600160f81b03191690815f1a90535060010161233e565b5090505b9392505050565b6123b9613d01565b6123c282613d4c565b61175f81613dc0565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f80516020615bf38339815191525f61241a85612779565b90505f8061242b83604001516134b9565b9150915080156124905760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104da565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156124c1576124c16150cf565b60058111156124d2576124d26150cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612543576125436150cf565b1480612561575060018251600581111561255f5761255f6150cf565b145b6125c05760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104da565b6003825160058111156125d5576125d56150cf565b036125e2575060046125e6565b5060055b6020808301515f9081526009880190915260408120558181600581111561260f5761260f6150cf565b90816005811115612622576126226150cf565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612656576126566150cf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561270a5761270a6150cf565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461175f906001600160a01b03168284613e74565b60408051606080820183525f8083526020830181905292820152905f80516020615bf38339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156127ee573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261281591908101906157d0565b91509150806128755760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104da565b82548251146128d85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104da565b60208201516001600160a01b03161561294b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104da565b509392505050565b5f805f83516036146129775760405162461bcd60e51b81526004016104da906158d0565b5f805b60028110156129c65761298e8160016158bd565b612999906008615685565b61ffff168682815181106129af576129af6153bf565b016020015160f81c901b919091179060010161297a565b5061ffff8116156129e95760405162461bcd60e51b81526004016104da90615919565b5f805b6004811015612a4457612a008160036158bd565b612a0b906008615685565b63ffffffff1687612a1d836002615650565b81518110612a2d57612a2d6153bf565b016020015160f81c901b91909117906001016129ec565b5063ffffffff8116600414612a6b5760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015612ac057612a8281601f6158bd565b612a8d906008615685565b88612a99836006615650565b81518110612aa957612aa96153bf565b016020015160f81c901b9190911790600101612a6e565b505f805b6008811015612b1f57612ad88160076158bd565b612ae3906008615685565b6001600160401b031689612af8836026615650565b81518110612b0857612b086153bf565b016020015160f81c901b9190911790600101612ac4565b505f805b6008811015612b7e57612b378160076158bd565b612b42906008615685565b6001600160401b03168a612b5783602e615650565b81518110612b6757612b676153bf565b016020015160f81c901b9190911790600101612b23565b5091989097509095509350505050565b5f8151602614612bb05760405162461bcd60e51b81526004016104da906158d0565b5f805b6002811015612bff57612bc78160016158bd565b612bd2906008615685565b61ffff16848281518110612be857612be86153bf565b016020015160f81c901b9190911790600101612bb3565b5061ffff811615612c225760405162461bcd60e51b81526004016104da90615919565b5f805b6004811015612c7d57612c398160036158bd565b612c44906008615685565b63ffffffff1685612c56836002615650565b81518110612c6657612c666153bf565b016020015160f81c901b9190911790600101612c25565b5063ffffffff811615612ca25760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015612cf757612cb981601f6158bd565b612cc4906008615685565b86612cd0836006615650565b81518110612ce057612ce06153bf565b016020015160f81c901b9190911790600101612ca5565b50949350505050565b5f8181525f80516020615c338339815191526020526040808220815160e0810190925280545f80516020615bf383398151915293929190829060ff166005811115612d4d57612d4d6150cf565b6005811115612d5e57612d5e6150cf565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612dd057612dd06150cf565b14612e2c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104da565b612e398160800151612135565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff19166001836005811115612e7d57612e7d6150cf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612f3284612f2c816120a5565b5f61218a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612f61908590600401615265565b6020604051808303815f875af1158015612f7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa19190615297565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615c1383398151915280546001190161302757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615c1383398151915255565b5f5f80516020615bb38339815191528161305c6101ed85613ed3565b90505f61306887611ce1565b905060028151600581111561307f5761307f6150cf565b146130de5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166131715760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104da565b61317a82613f09565b5f82826080015161318b919061569c565b600485015460408401519192506131ad916001600160401b03909116906159a3565b6001600160401b0316816001600160401b0316111561322c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104da565b6132368882612142565b5f613240896120a5565b90505f898260405160200161326c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6132a68d868861218a565b6040518263ffffffff1660e01b81526004016132c29190615265565b6020604051808303815f875af11580156132de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133029190615297565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561338a5761338a6150cf565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134dc5760405162461bcd60e51b81526004016104da906158d0565b5f805b600281101561352b576134f38160016158bd565b6134fe906008615685565b61ffff16858281518110613514576135146153bf565b016020015160f81c901b91909117906001016134df565b5061ffff81161561354e5760405162461bcd60e51b81526004016104da90615919565b5f805b60048110156135a9576135658160036158bd565b613570906008615685565b63ffffffff1686613582836002615650565b81518110613592576135926153bf565b016020015160f81c901b9190911790600101613551565b5063ffffffff81166003146135d05760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015613625576135e781601f6158bd565b6135f2906008615685565b876135fe836006615650565b8151811061360e5761360e6153bf565b016020015160f81c901b91909117906001016135d3565b505f8660268151811061363a5761363a6153bf565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bb38339815191529061ffff8616108015906136a6575061271061ffff861611155b6136c25760405162461bcd60e51b81526004016104da906159ce565b60028101546001600160401b03908116908516101561373b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104da565b805483101561379e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104da565b80600101548311156138055760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104da565b5f61380f84613ed3565b90505f61381b826109bf565b90505f6138288983613f14565b9050604051806060016040528061383c3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146138f25760405162461bcd60e51b81526004016104da906158d0565b5f805b6002811015613941576139098160016158bd565b613914906008615685565b61ffff1685828151811061392a5761392a6153bf565b016020015160f81c901b91909117906001016138f5565b5061ffff8116156139645760405162461bcd60e51b81526004016104da90615919565b5f805b60048110156139bf5761397b8160036158bd565b613986906008615685565b63ffffffff1686613998836002615650565b815181106139a8576139a86153bf565b016020015160f81c901b9190911790600101613967565b5063ffffffff81166005146139e65760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015613a3b576139fd81601f6158bd565b613a08906008615685565b87613a14836006615650565b81518110613a2457613a246153bf565b016020015160f81c901b91909117906001016139e9565b505f805b6008811015613a9a57613a538160076158bd565b613a5e906008615685565b6001600160401b031688613a73836026615650565b81518110613a8357613a836153bf565b016020015160f81c901b9190911790600101613a3f565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615bf3833981519152914291901580613b8d575060028301548151613b89916001600160401b031690615650565b8210155b15613bb3576001600160401b038516606082015281815260408101516020820152613bd2565b8481606001818151613bc5919061569c565b6001600160401b03169052505b6060810151613be29060646159a3565b602082015160028501546001600160401b039290921691613c0d9190600160401b900460ff16615685565b1015613c715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104da565b8315613c9a57846001600160401b031681604001818151613c929190615650565b905250613cb9565b846001600160401b031681604001818151613cb591906158bd565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d4a57604051631afcd79f60e31b815260040160405180910390fd5b565b613d54613d01565b613d5d816143f8565b613d65614411565b61213f608082013560a0830135613d8260e0850160c08601615096565b613d93610100860160e08701615a19565b61ffff16613da961012087016101008801615a32565b613dbb61014088016101208901615358565b614421565b613dc8613d01565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613e545760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611cdc91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614665565b5f6109cf827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906146c6565b61213f816001613aa7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613f9f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104da565b5f80516020615bf383398151915242613fbe6040860160208701615096565b6001600160401b0316116140305760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104da565b6140406040850160208601615096565b6001600160401b03166140566202a30042615650565b116140c95760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104da565b83356140e75760405162461bcd60e51b81526004016104da9061551a565b83355f908152600982016020526040902054156141165760405162461bcd60e51b81526004016104da9061555b565b6141236040850185615a52565b90506030146141445760405162461bcd60e51b81526004016104da906155a3565b61414d83613f09565b5f806141e76040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906141929190615096565b6001600160401b031681526020016141ad60408a018a615a52565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614828565b5f828152600786016020526040902091935091506142058282615ad8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614232908590600401615265565b6020604051808303815f875af115801561424e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142729190615297565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156142ea576142ea6150cf565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916143ca918e01908e01615096565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614400613d01565b614408614bd7565b61213f81614bdf565b614419613d01565b613d4a614d81565b614429613d01565b5f80516020615bb3833981519152836144955760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104da565b6127108411156144b75760405162461bcd60e51b81526004016104da906159ce565b8587111561451f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104da565b5f8360ff161161458c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104da565b600a60ff841611156145fe5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104da565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6146796001600160a01b03841683614d89565b905080515f1415801561469d57508080602001905181019061469b9190615b97565b155b15611cdc57604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561470c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147309190615297565b90506147476001600160a01b038516333086614d96565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561478b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147af9190615297565b90508181116148155760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b61481f82826158bd565b95945050505050565b5f60608260800151516030146148925760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104da565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614909576148c98160016158bd565b6148d4906008615685565b5081515f908390839081106148eb576148eb6153bf565b60200101906001600160f81b03191690815f1a9053506001016148b5565b505f5b6004811015614971576149208160036158bd565b61492b906008615685565b600160ff919091161c60f81b82614943836002615650565b81518110614953576149536153bf565b60200101906001600160f81b03191690815f1a90535060010161490c565b505f5b60208110156149ce5784518160208110614990576149906153bf565b1a60f81b826149a0836006615650565b815181106149b0576149b06153bf565b60200101906001600160f81b03191690815f1a905350600101614974565b505f5b6020811015614a2e57846020015181602081106149f0576149f06153bf565b1a60f81b82614a00836026615650565b81518110614a1057614a106153bf565b60200101906001600160f81b03191690815f1a9053506001016149d1565b505f5b6008811015614aa257614a458160076158bd565b614a50906008615685565b60ff1685604001516001600160401b0316901c60f81b82826046614a749190615650565b81518110614a8457614a846153bf565b60200101906001600160f81b03191690815f1a905350600101614a31565b505f5b6030811015614b0d5784608001518181518110614ac457614ac46153bf565b01602001516001600160f81b03191682614adf83604e615650565b81518110614aef57614aef6153bf565b60200101906001600160f81b03191690815f1a905350600101614aa5565b505f5b6008811015614b7f57614b248160076158bd565b614b2f906008615685565b60608601516001600160401b0390811691161c60f81b82614b5183607e615650565b81518110614b6157614b616153bf565b60200101906001600160f81b03191690815f1a905350600101614b10565b50600281604051614b90919061563f565b602060405180830381855afa158015614bab573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bce9190615297565b94909350915050565b613d4a613d01565b614be7613d01565b80355f80516020615bf383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c336080840160608501615a32565b60ff161115614ca05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104da565b5f614cb16080840160608501615a32565b60ff1611614d195760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104da565b614d296080830160608401615a32565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d5a6060830160408401615096565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61302d613d01565b60606123aa83835f614dcf565b6040516001600160a01b0384811660248301528381166044830152606482018390526109b99186918216906323b872dd90608401613ea1565b606081471015614df45760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614e0f919061563f565b5f6040518083038185875af1925050503d805f8114614e49576040519150601f19603f3d011682016040523d82523d5f602084013e614e4e565b606091505b509150915061209b868383606082614e6e57614e6982614eb5565b6123aa565b8151158015614e8557506001600160a01b0384163b155b15614eae57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b50806123aa565b805115614ec55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614eea906156bc565b5f825580601f10614ef9575050565b601f0160209004905f5260205f209081019061213f91905b80821115614f24575f8155600101614f11565b5090565b801515811461213f575f80fd5b803563ffffffff81168114614f48575f80fd5b919050565b5f805f60608486031215614f5f575f80fd5b833592506020840135614f7181614f28565b9150614f7f60408501614f35565b90509250925092565b5f60208284031215614f98575f80fd5b5035919050565b6001600160a01b038116811461213f575f80fd5b5f80828403610160811215614fc6575f80fd5b61014080821215614fd5575f80fd5b8493508301359050614fe681614f9f565b809150509250929050565b5f60208284031215615001575f80fd5b6123aa82614f35565b5f806040838503121561501b575f80fd5b61502483614f35565b946020939093013593505050565b5f8060408385031215615043575f80fd5b82356001600160401b03811115615058575f80fd5b830160808186031215615069575f80fd5b915061507760208401614f35565b90509250929050565b80356001600160401b0381168114614f48575f80fd5b5f602082840312156150a6575f80fd5b6123aa82615080565b5f80604083850312156150c0575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061510657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161514160608401826001600160401b03169052565b50608083015161515c60808401826001600160401b03169052565b5060a083015161517760a08401826001600160401b03169052565b5060c083015161519260c08401826001600160401b03169052565b5092915050565b803561ffff81168114614f48575f80fd5b5f805f80608085870312156151bd575f80fd5b84356001600160401b038111156151d2575f80fd5b8501606081880312156151e3575f80fd5b93506151f160208601615199565b92506151ff60408601615080565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156151925761519261520f565b5f5b8381101561525d578181015183820152602001615245565b50505f910152565b602081525f8251806020840152615283816040850160208701615243565b601f01601f19169190910160400192915050565b5f602082840312156152a7575f80fd5b5051919050565b5f826152c857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615368575f80fd5b81356123aa81614f9f565b5f808335601e19843603018112615388575f80fd5b8301803591506001600160401b038211156153a1575f80fd5b6020019150600581901b36038213156153b8575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126153e7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615427576154276153f1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615455576154556153f1565b604052919050565b5f6001600160401b03821115615475576154756153f1565b50601f01601f191660200190565b5f60608236031215615493575f80fd5b61549b615405565b8235815260206154ac818501615080565b8183015260408401356001600160401b038111156154c8575f80fd5b840136601f8201126154d8575f80fd5b80356154eb6154e68261545d565b61542d565b81815236848385010111156154fe575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615601818460208a01615243565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615631816028840160208801615243565b016028019695505050505050565b5f82516153e7818460208701615243565b808201808211156109cf576109cf61520f565b5f63ffffffff80831681810361567b5761567b61520f565b6001019392505050565b80820281158282048414176109cf576109cf61520f565b6001600160401b038181168382160190808211156151925761519261520f565b600181811c908216806156d057607f821691505b6020821081036156ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461574d816156bc565b806020870152604060018084165f811461576e576001811461578a576157b7565b60ff19851660408a0152604084151560051b8a010195506157b7565b895f5260205f205f5b858110156157ae5781548b8201860152908301908801615793565b8a016040019650505b509398975050505050505050565b8051614f4881614f28565b5f80604083850312156157e1575f80fd5b82516001600160401b03808211156157f7575f80fd5b908401906060828703121561580a575f80fd5b615812615405565b8251815260208084015161582581614f9f565b8282015260408401518381111561583a575f80fd5b80850194505087601f85011261584e575f80fd5b8351925061585e6154e68461545d565b8381528882858701011115615871575f80fd5b61588084838301848801615243565b806040840152508195506158958188016157c5565b9450505050509250929050565b5f6001600160401b0380831681810361567b5761567b61520f565b818103818111156109cf576109cf61520f565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159c6576159c661520f565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f60208284031215615a29575f80fd5b6123aa82615199565b5f60208284031215615a42575f80fd5b813560ff811681146123aa575f80fd5b5f808335601e19843603018112615a67575f80fd5b8301803591506001600160401b03821115615a80575f80fd5b6020019150368190038213156153b8575f80fd5b601f821115611cdc57805f5260205f20601f840160051c81016020851015615ab95750805b601f840160051c820191505b8181101561152f575f8155600101615ac5565b81516001600160401b03811115615af157615af16153f1565b615b0581615aff84546156bc565b84615a94565b602080601f831160018114615b38575f8415615b215750858301515b5f19600386901b1c1916600185901b178555615b8f565b5f85815260208120601f198616915b82811015615b6657888601518255948401946001909101908401615b47565b5085821015615b8357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ba7575f80fd5b81516123aa81614f2856fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615dac380380615dac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c5f8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806366435abf116100bf578063ba3a4b9711610079578063ba3a4b971461030a578063bee0a03f1461031d578063c974d1b614610330578063d5f20ff614610338578063df93d8de14610358578063eb0acb8914610362575f80fd5b806366435abf1461028557806376f786211461029857806398f3e2b4146102ab5780639e1bc4ef146102be578063a3a65e48146102d1578063b771b3bc146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c57806361e2f4901461025f5780636206585614610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614f4d565b610375565b005b61015f61016f366004614f88565b610806565b6101b2610182366004614f88565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614f88565b6109bf565b6040516001600160401b0390911681526020016101bc565b61015f610218366004614fb3565b6109d5565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614ff1565b610ab4565b61015f61025a36600461500a565b610b07565b61015f61026d366004615032565b610cdc565b6101b2610280366004615096565b611428565b6101f2610293366004614f88565b611441565b61015f6102a6366004614f4d565b611455565b61015f6102b936600461500a565b611536565b6101b26102cc3660046150af565b611763565b61015f6102df366004614ff1565b61178f565b6102f26005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610318366004614f88565b611947565b61015f61032b366004614f88565b611bcd565b6101cd601481565b61034b610346366004614f88565b611ce1565b6040516101bc91906150e3565b6101f26202a30081565b6101b26103703660046151aa565b611dd4565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615bb38339815191529184156103c7576103c48285611e09565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103f9576103f96150cf565b600481111561040a5761040a6150cf565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610491576104916150cf565b146104e35760405162461bcd60e51b815260206004820152602a60248201525f80516020615bd38339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105485760405162461bcd60e51b815260206004820152603360248201525f80516020615bd38339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104da565b5f610552846120a5565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561059f5761059f6150cf565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61067185611ce1565b905082606001516001600160401b031681608001516001600160401b0316116106e85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104da565b6002815160058111156106fd576106fd6150cf565b0361070f5761070f8360600151612135565b5f836060015182608001516107249190615223565b90506107308682612142565b5f6005600160991b0163ee5b48eb61074989878661218a565b6040518263ffffffff1660e01b81526004016107659190615265565b6020604051808303815f875af1158015610781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a59190615297565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020615c338339815191526020526040808220815160e0810190925280545f80516020615bf383398151915293929190829060ff166005811115610853576108536150cf565b6005811115610864576108646150cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108d3576108d36150cf565b146109385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb61095d8584606001515f61218a565b6040518263ffffffff1660e01b81526004016109799190615265565b6020604051808303815f875af1158015610995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b99190615297565b50505050565b5f6109cf64e8d4a51000836152ae565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a1e575080546001600160401b03808416911610155b15610a3c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6784846123b1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615bb38339815191525f80610acd846123cb565b6040808201515f8481526005880160205291909120549294509092506109b9916001600160401b03909116906001600160a01b0316612743565b5f80516020615bb38339815191525f610b1f84612779565b90505f80610b308360400151612953565b50915091505f610b3f83611ce1565b9050816001600160401b031681606001516001600160401b03161015610b775760405162461bcd60e51b81526004016104da906152cd565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bbc5760405162461bcd60e51b81526004016104da9061530f565b60015f87815260068701602052604090205460ff166004811115610be257610be26150cf565b14610c4b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bf38339815191529060ff1615610d795760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de09190615297565b836020013514610e425760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104da565b30610e536060850160408601615358565b6001600160a01b031614610ec55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104da565b5f610ed36060850185615373565b905011610f325760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104da565b5f610f406060850185615373565b91505063ffffffff8110610fac5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104da565b5f843560208601356014610fc66060890160408a01615358565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611338575f6110466060890189615373565b8363ffffffff1681811061105c5761105c6153bf565b905060200281019061106e91906153d3565b61107790615483565b8051909150806110995760405162461bcd60e51b81526004016104da9061551a565b5f818152600988016020526040902054156110c65760405162461bcd60e51b81526004016104da9061555b565b8160400151516030146110eb5760405162461bcd60e51b81526004016104da906155a3565b84825f01518360200151846040015160405160200161110d94939291906155f0565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161115b919061563f565b602060405180830381855afa158015611176573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111999190615297565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115611225576112256150cf565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112d8911686615650565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050808061133090615663565b91505061102a565b50600584018190555f61134a86612779565b90505f61135a8260400151612b8e565b90508060028560405161136d919061563f565b602060405180830381855afa158015611388573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113ab9190615297565b1461140f5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104da565b505050600a909201805460ff1916600117905550505050565b5f6109cf6001600160401b03831664e8d4a51000615685565b5f61144b82611ce1565b6080015192915050565b5f80516020615bb38339815191525f61146d85611ce1565b5f86815260058401602052604090205460a08201519192506114a091600160b01b9091046001600160401b03169061569c565b6001600160401b03164210156115145760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104da565b8315611526576115248584611e09565b505b61152f85612d00565b5050505050565b61153e612ff6565b5f80516020615bb38339815191525f61155684612779565b90505f806115678360400151612953565b50915091505f61157683611ce1565b9050816001600160401b031681606001516001600160401b031610156115ae5760405162461bcd60e51b81526004016104da906152cd565b5f8681526006860160205260409020600301546001600160401b03808416911611156115ec5760405162461bcd60e51b81526004016104da9061530f565b60035f87815260068701602052604090205460ff166004811115611612576116126150cf565b146116665760405162461bcd60e51b815260206004820152603160248201525f80516020615bd38339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261170b91612743565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061175f60015f80516020615c1383398151915255565b5050565b5f61176c612ff6565b611777833384613040565b90506109cf60015f80516020615c1383398151915255565b5f80516020615bf38339815191525f6117a783612779565b90505f806117b883604001516134b9565b915091508061181a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104da565b5f82815260078501602052604081208054611834906156bc565b9050118015611866575060015f83815260088601602052604090205460ff166005811115611864576118646150cf565b145b6118825760405162461bcd60e51b81526004016104da906156f4565b5f828152600785016020526040812061189a91614ede565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bb383398151915293929190829060ff1660048111156119a8576119a86150cf565b60048111156119b9576119b96150cf565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a4057611a406150cf565b1480611a5e5750600381516004811115611a5c57611a5c6150cf565b145b611ab25760405162461bcd60e51b815260206004820152603260248201525f80516020615bd3833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104da565b5f611ac08260400151611ce1565b905080606001516001600160401b03165f03611b445760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb611b7184604001518460600151856080015161218a565b6040518263ffffffff1660e01b8152600401611b8d9190615265565b6020604051808303815f875af1158015611ba9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152f9190615297565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bf3833981519152929190611c15906156bc565b9050118015611c47575060015f83815260088301602052604090205460ff166005811115611c4557611c456150cf565b145b611c635760405162461bcd60e51b81526004016104da906156f4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c9c919060040161573b565b6020604051808303815f875af1158015611cb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cdc9190615297565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020615c3383398151915290528390208351918201909352825491925f80516020615bf383398151915292829060ff166005811115611d6157611d616150cf565b6005811115611d7257611d726150cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611ddd612ff6565b611de98585858561365a565b9050611e0160015f80516020615c1383398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e54573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e7b91908101906157d0565b9150915080611ede5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f459190615297565b825114611fa95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104da565b60208201516001600160a01b03161561201f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104da565b5f8061202e84604001516138cf565b9150915081871461209b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104da565b9695505050505050565b5f8181525f80516020615c338339815191526020526040812060020180545f80516020615bf383398151915291600160401b9091046001600160401b03169060086120ef836158a2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b61213f815f613aa7565b50565b5f9182525f80516020615c33833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612203576121c38160016158bd565b6121ce906008615685565b5081515f908390839081106121e5576121e56153bf565b60200101906001600160f81b03191690815f1a9053506001016121af565b505f5b600481101561226e5761221a8160036158bd565b612225906008615685565b600263ffffffff16901c60f81b828260026122409190615650565b81518110612250576122506153bf565b60200101906001600160f81b03191690815f1a905350600101612206565b505f5b60208110156122d05761228581601f6158bd565b612290906008615685565b86901c60f81b826122a2836006615650565b815181106122b2576122b26153bf565b60200101906001600160f81b03191690815f1a905350600101612271565b505f5b600881101561233b576122e78160076158bd565b6122f2906008615685565b6001600160401b038616901c60f81b8261230d836026615650565b8151811061231d5761231d6153bf565b60200101906001600160f81b03191690815f1a9053506001016122d3565b505f5b60088110156123a6576123528160076158bd565b61235d906008615685565b6001600160401b038516901c60f81b8261237883602e615650565b81518110612388576123886153bf565b60200101906001600160f81b03191690815f1a90535060010161233e565b5090505b9392505050565b6123b9613d01565b6123c282613d4c565b61175f81613dc0565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f80516020615bf38339815191525f61241a85612779565b90505f8061242b83604001516134b9565b9150915080156124905760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104da565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156124c1576124c16150cf565b60058111156124d2576124d26150cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612543576125436150cf565b1480612561575060018251600581111561255f5761255f6150cf565b145b6125c05760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104da565b6003825160058111156125d5576125d56150cf565b036125e2575060046125e6565b5060055b6020808301515f9081526009880190915260408120558181600581111561260f5761260f6150cf565b90816005811115612622576126226150cf565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612656576126566150cf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561270a5761270a6150cf565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461175f906001600160a01b03168284613e74565b60408051606080820183525f8083526020830181905292820152905f80516020615bf38339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156127ee573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261281591908101906157d0565b91509150806128755760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104da565b82548251146128d85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104da565b60208201516001600160a01b03161561294b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104da565b509392505050565b5f805f83516036146129775760405162461bcd60e51b81526004016104da906158d0565b5f805b60028110156129c65761298e8160016158bd565b612999906008615685565b61ffff168682815181106129af576129af6153bf565b016020015160f81c901b919091179060010161297a565b5061ffff8116156129e95760405162461bcd60e51b81526004016104da90615919565b5f805b6004811015612a4457612a008160036158bd565b612a0b906008615685565b63ffffffff1687612a1d836002615650565b81518110612a2d57612a2d6153bf565b016020015160f81c901b91909117906001016129ec565b5063ffffffff8116600414612a6b5760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015612ac057612a8281601f6158bd565b612a8d906008615685565b88612a99836006615650565b81518110612aa957612aa96153bf565b016020015160f81c901b9190911790600101612a6e565b505f805b6008811015612b1f57612ad88160076158bd565b612ae3906008615685565b6001600160401b031689612af8836026615650565b81518110612b0857612b086153bf565b016020015160f81c901b9190911790600101612ac4565b505f805b6008811015612b7e57612b378160076158bd565b612b42906008615685565b6001600160401b03168a612b5783602e615650565b81518110612b6757612b676153bf565b016020015160f81c901b9190911790600101612b23565b5091989097509095509350505050565b5f8151602614612bb05760405162461bcd60e51b81526004016104da906158d0565b5f805b6002811015612bff57612bc78160016158bd565b612bd2906008615685565b61ffff16848281518110612be857612be86153bf565b016020015160f81c901b9190911790600101612bb3565b5061ffff811615612c225760405162461bcd60e51b81526004016104da90615919565b5f805b6004811015612c7d57612c398160036158bd565b612c44906008615685565b63ffffffff1685612c56836002615650565b81518110612c6657612c666153bf565b016020015160f81c901b9190911790600101612c25565b5063ffffffff811615612ca25760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015612cf757612cb981601f6158bd565b612cc4906008615685565b86612cd0836006615650565b81518110612ce057612ce06153bf565b016020015160f81c901b9190911790600101612ca5565b50949350505050565b5f8181525f80516020615c338339815191526020526040808220815160e0810190925280545f80516020615bf383398151915293929190829060ff166005811115612d4d57612d4d6150cf565b6005811115612d5e57612d5e6150cf565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612dd057612dd06150cf565b14612e2c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104da565b612e398160800151612135565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff19166001836005811115612e7d57612e7d6150cf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612f3284612f2c816120a5565b5f61218a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612f61908590600401615265565b6020604051808303815f875af1158015612f7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa19190615297565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615c1383398151915280546001190161302757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615c1383398151915255565b5f5f80516020615bb38339815191528161305c6101ed85613ed3565b90505f61306887611ce1565b905060028151600581111561307f5761307f6150cf565b146130de5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166131715760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104da565b61317a82613f09565b5f82826080015161318b919061569c565b600485015460408401519192506131ad916001600160401b03909116906159a3565b6001600160401b0316816001600160401b0316111561322c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104da565b6132368882612142565b5f613240896120a5565b90505f898260405160200161326c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6132a68d868861218a565b6040518263ffffffff1660e01b81526004016132c29190615265565b6020604051808303815f875af11580156132de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133029190615297565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561338a5761338a6150cf565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134dc5760405162461bcd60e51b81526004016104da906158d0565b5f805b600281101561352b576134f38160016158bd565b6134fe906008615685565b61ffff16858281518110613514576135146153bf565b016020015160f81c901b91909117906001016134df565b5061ffff81161561354e5760405162461bcd60e51b81526004016104da90615919565b5f805b60048110156135a9576135658160036158bd565b613570906008615685565b63ffffffff1686613582836002615650565b81518110613592576135926153bf565b016020015160f81c901b9190911790600101613551565b5063ffffffff81166003146135d05760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015613625576135e781601f6158bd565b6135f2906008615685565b876135fe836006615650565b8151811061360e5761360e6153bf565b016020015160f81c901b91909117906001016135d3565b505f8660268151811061363a5761363a6153bf565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bb38339815191529061ffff8616108015906136a6575061271061ffff861611155b6136c25760405162461bcd60e51b81526004016104da906159ce565b60028101546001600160401b03908116908516101561373b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104da565b805483101561379e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104da565b80600101548311156138055760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104da565b5f61380f84613ed3565b90505f61381b826109bf565b90505f6138288983613f14565b9050604051806060016040528061383c3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146138f25760405162461bcd60e51b81526004016104da906158d0565b5f805b6002811015613941576139098160016158bd565b613914906008615685565b61ffff1685828151811061392a5761392a6153bf565b016020015160f81c901b91909117906001016138f5565b5061ffff8116156139645760405162461bcd60e51b81526004016104da90615919565b5f805b60048110156139bf5761397b8160036158bd565b613986906008615685565b63ffffffff1686613998836002615650565b815181106139a8576139a86153bf565b016020015160f81c901b9190911790600101613967565b5063ffffffff81166005146139e65760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015613a3b576139fd81601f6158bd565b613a08906008615685565b87613a14836006615650565b81518110613a2457613a246153bf565b016020015160f81c901b91909117906001016139e9565b505f805b6008811015613a9a57613a538160076158bd565b613a5e906008615685565b6001600160401b031688613a73836026615650565b81518110613a8357613a836153bf565b016020015160f81c901b9190911790600101613a3f565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615bf3833981519152914291901580613b8d575060028301548151613b89916001600160401b031690615650565b8210155b15613bb3576001600160401b038516606082015281815260408101516020820152613bd2565b8481606001818151613bc5919061569c565b6001600160401b03169052505b6060810151613be29060646159a3565b602082015160028501546001600160401b039290921691613c0d9190600160401b900460ff16615685565b1015613c715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104da565b8315613c9a57846001600160401b031681604001818151613c929190615650565b905250613cb9565b846001600160401b031681604001818151613cb591906158bd565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d4a57604051631afcd79f60e31b815260040160405180910390fd5b565b613d54613d01565b613d5d816143f8565b613d65614411565b61213f608082013560a0830135613d8260e0850160c08601615096565b613d93610100860160e08701615a19565b61ffff16613da961012087016101008801615a32565b613dbb61014088016101208901615358565b614421565b613dc8613d01565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613e545760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611cdc91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614665565b5f6109cf827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906146c6565b61213f816001613aa7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613f9f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104da565b5f80516020615bf383398151915242613fbe6040860160208701615096565b6001600160401b0316116140305760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104da565b6140406040850160208601615096565b6001600160401b03166140566202a30042615650565b116140c95760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104da565b83356140e75760405162461bcd60e51b81526004016104da9061551a565b83355f908152600982016020526040902054156141165760405162461bcd60e51b81526004016104da9061555b565b6141236040850185615a52565b90506030146141445760405162461bcd60e51b81526004016104da906155a3565b61414d83613f09565b5f806141e76040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906141929190615096565b6001600160401b031681526020016141ad60408a018a615a52565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614828565b5f828152600786016020526040902091935091506142058282615ad8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614232908590600401615265565b6020604051808303815f875af115801561424e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142729190615297565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156142ea576142ea6150cf565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916143ca918e01908e01615096565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614400613d01565b614408614bd7565b61213f81614bdf565b614419613d01565b613d4a614d81565b614429613d01565b5f80516020615bb3833981519152836144955760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104da565b6127108411156144b75760405162461bcd60e51b81526004016104da906159ce565b8587111561451f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104da565b5f8360ff161161458c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104da565b600a60ff841611156145fe5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104da565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6146796001600160a01b03841683614d89565b905080515f1415801561469d57508080602001905181019061469b9190615b97565b155b15611cdc57604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561470c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147309190615297565b90506147476001600160a01b038516333086614d96565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561478b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147af9190615297565b90508181116148155760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b61481f82826158bd565b95945050505050565b5f60608260800151516030146148925760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104da565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614909576148c98160016158bd565b6148d4906008615685565b5081515f908390839081106148eb576148eb6153bf565b60200101906001600160f81b03191690815f1a9053506001016148b5565b505f5b6004811015614971576149208160036158bd565b61492b906008615685565b600160ff919091161c60f81b82614943836002615650565b81518110614953576149536153bf565b60200101906001600160f81b03191690815f1a90535060010161490c565b505f5b60208110156149ce5784518160208110614990576149906153bf565b1a60f81b826149a0836006615650565b815181106149b0576149b06153bf565b60200101906001600160f81b03191690815f1a905350600101614974565b505f5b6020811015614a2e57846020015181602081106149f0576149f06153bf565b1a60f81b82614a00836026615650565b81518110614a1057614a106153bf565b60200101906001600160f81b03191690815f1a9053506001016149d1565b505f5b6008811015614aa257614a458160076158bd565b614a50906008615685565b60ff1685604001516001600160401b0316901c60f81b82826046614a749190615650565b81518110614a8457614a846153bf565b60200101906001600160f81b03191690815f1a905350600101614a31565b505f5b6030811015614b0d5784608001518181518110614ac457614ac46153bf565b01602001516001600160f81b03191682614adf83604e615650565b81518110614aef57614aef6153bf565b60200101906001600160f81b03191690815f1a905350600101614aa5565b505f5b6008811015614b7f57614b248160076158bd565b614b2f906008615685565b60608601516001600160401b0390811691161c60f81b82614b5183607e615650565b81518110614b6157614b616153bf565b60200101906001600160f81b03191690815f1a905350600101614b10565b50600281604051614b90919061563f565b602060405180830381855afa158015614bab573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bce9190615297565b94909350915050565b613d4a613d01565b614be7613d01565b80355f80516020615bf383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c336080840160608501615a32565b60ff161115614ca05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104da565b5f614cb16080840160608501615a32565b60ff1611614d195760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104da565b614d296080830160608401615a32565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d5a6060830160408401615096565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61302d613d01565b60606123aa83835f614dcf565b6040516001600160a01b0384811660248301528381166044830152606482018390526109b99186918216906323b872dd90608401613ea1565b606081471015614df45760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614e0f919061563f565b5f6040518083038185875af1925050503d805f8114614e49576040519150601f19603f3d011682016040523d82523d5f602084013e614e4e565b606091505b509150915061209b868383606082614e6e57614e6982614eb5565b6123aa565b8151158015614e8557506001600160a01b0384163b155b15614eae57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b50806123aa565b805115614ec55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614eea906156bc565b5f825580601f10614ef9575050565b601f0160209004905f5260205f209081019061213f91905b80821115614f24575f8155600101614f11565b5090565b801515811461213f575f80fd5b803563ffffffff81168114614f48575f80fd5b919050565b5f805f60608486031215614f5f575f80fd5b833592506020840135614f7181614f28565b9150614f7f60408501614f35565b90509250925092565b5f60208284031215614f98575f80fd5b5035919050565b6001600160a01b038116811461213f575f80fd5b5f80828403610160811215614fc6575f80fd5b61014080821215614fd5575f80fd5b8493508301359050614fe681614f9f565b809150509250929050565b5f60208284031215615001575f80fd5b6123aa82614f35565b5f806040838503121561501b575f80fd5b61502483614f35565b946020939093013593505050565b5f8060408385031215615043575f80fd5b82356001600160401b03811115615058575f80fd5b830160808186031215615069575f80fd5b915061507760208401614f35565b90509250929050565b80356001600160401b0381168114614f48575f80fd5b5f602082840312156150a6575f80fd5b6123aa82615080565b5f80604083850312156150c0575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061510657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161514160608401826001600160401b03169052565b50608083015161515c60808401826001600160401b03169052565b5060a083015161517760a08401826001600160401b03169052565b5060c083015161519260c08401826001600160401b03169052565b5092915050565b803561ffff81168114614f48575f80fd5b5f805f80608085870312156151bd575f80fd5b84356001600160401b038111156151d2575f80fd5b8501606081880312156151e3575f80fd5b93506151f160208601615199565b92506151ff60408601615080565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156151925761519261520f565b5f5b8381101561525d578181015183820152602001615245565b50505f910152565b602081525f8251806020840152615283816040850160208701615243565b601f01601f19169190910160400192915050565b5f602082840312156152a7575f80fd5b5051919050565b5f826152c857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615368575f80fd5b81356123aa81614f9f565b5f808335601e19843603018112615388575f80fd5b8301803591506001600160401b038211156153a1575f80fd5b6020019150600581901b36038213156153b8575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126153e7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615427576154276153f1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615455576154556153f1565b604052919050565b5f6001600160401b03821115615475576154756153f1565b50601f01601f191660200190565b5f60608236031215615493575f80fd5b61549b615405565b8235815260206154ac818501615080565b8183015260408401356001600160401b038111156154c8575f80fd5b840136601f8201126154d8575f80fd5b80356154eb6154e68261545d565b61542d565b81815236848385010111156154fe575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615601818460208a01615243565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615631816028840160208801615243565b016028019695505050505050565b5f82516153e7818460208701615243565b808201808211156109cf576109cf61520f565b5f63ffffffff80831681810361567b5761567b61520f565b6001019392505050565b80820281158282048414176109cf576109cf61520f565b6001600160401b038181168382160190808211156151925761519261520f565b600181811c908216806156d057607f821691505b6020821081036156ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461574d816156bc565b806020870152604060018084165f811461576e576001811461578a576157b7565b60ff19851660408a0152604084151560051b8a010195506157b7565b895f5260205f205f5b858110156157ae5781548b8201860152908301908801615793565b8a016040019650505b509398975050505050505050565b8051614f4881614f28565b5f80604083850312156157e1575f80fd5b82516001600160401b03808211156157f7575f80fd5b908401906060828703121561580a575f80fd5b615812615405565b8251815260208084015161582581614f9f565b8282015260408401518381111561583a575f80fd5b80850194505087601f85011261584e575f80fd5b8351925061585e6154e68461545d565b8381528882858701011115615871575f80fd5b61588084838301848801615243565b806040840152508195506158958188016157c5565b9450505050509250929050565b5f6001600160401b0380831681810361567b5761567b61520f565b818103818111156109cf576109cf61520f565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159c6576159c661520f565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f60208284031215615a29575f80fd5b6123aa82615199565b5f60208284031215615a42575f80fd5b813560ff811681146123aa575f80fd5b5f808335601e19843603018112615a67575f80fd5b8301803591506001600160401b03821115615a80575f80fd5b6020019150368190038213156153b8575f80fd5b601f821115611cdc57805f5260205f20601f840160051c81016020851015615ab95750805b601f840160051c820191505b8181101561152f575f8155600101615ac5565b81516001600160401b03811115615af157615af16153f1565b615b0581615aff84546156bc565b84615a94565b602080601f831160018114615b38575f8415615b215750858301515b5f19600386901b1c1916600185901b178555615b8f565b5f85815260208120601f198616915b82811015615b6657888601518255948401946001909101908401615b47565b5085821015615b8357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ba7575f80fd5b81516123aa81614f2856fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 94f16f49d..4f4e637d3 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615a0d380380615a0d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6158c08061014d5f395ff3fe60806040526004361061013c575f3560e01c806362065856116100b3578063ba3a4b971161006d578063ba3a4b97146103be578063bee0a03f146103dd578063c599e24f146103fc578063c974d1b61461040f578063d5f20ff614610423578063df93d8de1461044f575f80fd5b806362065856146102f157806366435abf1461031057806376f786211461032f57806398f3e2b41461034e578063a3a65e481461036d578063b771b3bc1461038c575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded1461025957806340034a9314610281578063467ef06f146102945780635297fae6146102b357806361e2f490146102d2575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a366004614c27565b610465565b005b34801561016c575f80fd5b5061015f61017b366004614c62565b6108f6565b34801561018b575f80fd5b506101ca61019a366004614c62565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614c79565b610aaf565b34801561022d575f80fd5b5061024161023c366004614c62565b610b8c565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b6101ca61028f366004614cb7565b610ba2565b34801561029f575f80fd5b5061015f6102ae366004614d0b565b610bd6565b3480156102be575f80fd5b5061015f6102cd366004614d24565b610c29565b3480156102dd575f80fd5b5061015f6102ec366004614d4c565b610dfe565b3480156102fc575f80fd5b506101ca61030b366004614d9a565b61154a565b34801561031b575f80fd5b5061024161032a366004614c62565b611563565b34801561033a575f80fd5b5061015f610349366004614c27565b611577565b348015610359575f80fd5b5061015f610368366004614d24565b611658565b348015610378575f80fd5b5061015f610387366004614d0b565b611885565b348015610397575f80fd5b506103a66005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103c9575f80fd5b5061015f6103d8366004614c62565b611a3d565b3480156103e8575f80fd5b5061015f6103f7366004614c62565b611cc3565b6101ca61040a366004614c62565b611dd7565b34801561041a575f80fd5b506101f1601481565b34801561042e575f80fd5b5061044261043d366004614c62565b611e08565b6040516101d49190614dc7565b34801561045a575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206158148339815191529184156104b7576104b48285611efb565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104e9576104e9614db3565b60048111156104fa576104fa614db3565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058157610581614db3565b146105d35760405162461bcd60e51b815260206004820152602a60248201525f805160206158348339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106385760405162461bcd60e51b815260206004820152603360248201525f805160206158348339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ca565b5f61064284612197565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561068f5761068f614db3565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076185611e08565b905082606001516001600160401b031681608001516001600160401b0316116107d85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105ca565b6002815160058111156107ed576107ed614db3565b036107ff576107ff8360600151612227565b5f836060015182608001516108149190614e91565b90506108208682612234565b5f6005600160991b0163ee5b48eb61083989878661227c565b6040518263ffffffff1660e01b81526004016108559190614ed3565b6020604051808303815f875af1158015610871573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108959190614f05565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206158948339815191526020526040808220815160e0810190925280545f8051602061585483398151915293929190829060ff16600581111561094357610943614db3565b600581111561095457610954614db3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109c3576109c3614db3565b14610a285760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb610a4d8584606001515f61227c565b6040518263ffffffff1660e01b8152600401610a699190614ed3565b6020604051808303815f875af1158015610a85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa99190614f05565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610af8575080546001600160401b03808416911610155b15610b165760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b40836124a1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b9c64e8d4a5100083614f1c565b92915050565b5f610bab6124b2565b610bb7848484346124e9565b9050610bcf60015f8051602061587483398151915255565b9392505050565b5f805160206158148339815191525f80610bef84612766565b6040808201515f848152600588016020529190912054929450909250610aa9916001600160401b03909116906001600160a01b0316612ade565b5f805160206158148339815191525f610c4184612af1565b90505f80610c528360400151612ccb565b50915091505f610c6183611e08565b9050816001600160401b031681606001516001600160401b03161015610c995760405162461bcd60e51b81526004016105ca90614f3b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cde5760405162461bcd60e51b81526004016105ca90614f7d565b60015f87815260068701602052604090205460ff166004811115610d0457610d04614db3565b14610d6d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206158548339815191529060ff1615610e9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ede573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f029190614f05565b836020013514610f645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016105ca565b30610f756060850160408601614fda565b6001600160a01b031614610fe75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016105ca565b5f610ff56060850185614ff5565b9050116110545760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016105ca565b5f6110626060850185614ff5565b91505063ffffffff81106110ce5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016105ca565b5f8435602086013560146110e86060890160408a01614fda565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561145a575f6111686060890189614ff5565b8363ffffffff1681811061117e5761117e615041565b90506020028101906111909190615055565b61119990615105565b8051909150806111bb5760405162461bcd60e51b81526004016105ca9061519c565b5f818152600988016020526040902054156111e85760405162461bcd60e51b81526004016105ca906151dd565b81604001515160301461120d5760405162461bcd60e51b81526004016105ca90615225565b84825f01518360200151846040015160405160200161122f9493929190615272565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161127d91906152c1565b602060405180830381855afa158015611298573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112bb9190614f05565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561134757611347614db3565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113fa9116866152d2565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080611452906152e5565b91505061114c565b50600584018190555f61146c86612af1565b90505f61147c8260400151612f06565b90508060028560405161148f91906152c1565b602060405180830381855afa1580156114aa573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114cd9190614f05565b146115315760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016105ca565b505050600a909201805460ff1916600117905550505050565b5f610b9c6001600160401b03831664e8d4a51000615307565b5f61156d82611e08565b6080015192915050565b5f805160206158148339815191525f61158f85611e08565b5f86815260058401602052604090205460a08201519192506115c291600160b01b9091046001600160401b03169061531e565b6001600160401b03164210156116365760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ca565b8315611648576116468584611efb565b505b6116518561306f565b5050505050565b6116606124b2565b5f805160206158148339815191525f61167884612af1565b90505f806116898360400151612ccb565b50915091505f61169883611e08565b9050816001600160401b031681606001516001600160401b031610156116d05760405162461bcd60e51b81526004016105ca90614f3b565b5f8681526006860160205260409020600301546001600160401b038084169116111561170e5760405162461bcd60e51b81526004016105ca90614f7d565b60035f87815260068701602052604090205460ff16600481111561173457611734614db3565b146117885760405162461bcd60e51b815260206004820152603160248201525f805160206158348339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261182d91612ade565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061188160015f8051602061587483398151915255565b5050565b5f805160206158548339815191525f61189d83612af1565b90505f806118ae8360400151613365565b91509150806119105760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ca565b5f8281526007850160205260408120805461192a9061533e565b905011801561195c575060015f83815260088601602052604090205460ff16600581111561195a5761195a614db3565b145b6119785760405162461bcd60e51b81526004016105ca90615370565b5f828152600785016020526040812061199091614bbd565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061581483398151915293929190829060ff166004811115611a9e57611a9e614db3565b6004811115611aaf57611aaf614db3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b3657611b36614db3565b1480611b545750600381516004811115611b5257611b52614db3565b145b611ba85760405162461bcd60e51b815260206004820152603260248201525f80516020615834833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ca565b5f611bb68260400151611e08565b905080606001516001600160401b03165f03611c3a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb611c6784604001518460600151856080015161227c565b6040518263ffffffff1660e01b8152600401611c839190614ed3565b6020604051808303815f875af1158015611c9f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116519190614f05565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615854833981519152929190611d0b9061533e565b9050118015611d3d575060015f83815260088301602052604090205460ff166005811115611d3b57611d3b614db3565b145b611d595760405162461bcd60e51b81526004016105ca90615370565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d9291906004016153b7565b6020604051808303815f875af1158015611dae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd29190614f05565b505050565b5f611de06124b2565b611deb823334613506565b9050611e0360015f8051602061587483398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061589483398151915290528390208351918201909352825491925f8051602061585483398151915292829060ff166005811115611e8857611e88614db3565b6005811115611e9957611e99614db3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f46573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f6d919081019061544c565b9150915080611fd05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612013573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120379190614f05565b82511461209b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ca565b60208201516001600160a01b0316156121115760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ca565b5f80612120846040015161397c565b9150915081871461218d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ca565b9695505050505050565b5f8181525f805160206158948339815191526020526040812060020180545f8051602061585483398151915291600160401b9091046001600160401b03169060086121e18361551e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b612231815f613b54565b50565b5f9182525f80516020615894833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156122f5576122b5816001615539565b6122c0906008615307565b5081515f908390839081106122d7576122d7615041565b60200101906001600160f81b03191690815f1a9053506001016122a1565b505f5b60048110156123605761230c816003615539565b612317906008615307565b600263ffffffff16901c60f81b8282600261233291906152d2565b8151811061234257612342615041565b60200101906001600160f81b03191690815f1a9053506001016122f8565b505f5b60208110156123c25761237781601f615539565b612382906008615307565b86901c60f81b826123948360066152d2565b815181106123a4576123a4615041565b60200101906001600160f81b03191690815f1a905350600101612363565b505f5b600881101561242d576123d9816007615539565b6123e4906008615307565b6001600160401b038616901c60f81b826123ff8360266152d2565b8151811061240f5761240f615041565b60200101906001600160f81b03191690815f1a9053506001016123c5565b505f5b600881101561249857612444816007615539565b61244f906008615307565b6001600160401b038516901c60f81b8261246a83602e6152d2565b8151811061247a5761247a615041565b60200101906001600160f81b03191690815f1a905350600101612430565b50949350505050565b6124a9613dae565b61223181613df9565b5f805160206158748339815191528054600119016124e357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158148339815191529061ffff861610801590612535575061271061ffff861611155b6125515760405162461bcd60e51b81526004016105ca9061554c565b60028101546001600160401b0390811690851610156125ca5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ca565b805483101561262d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ca565b80600101548311156126945760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ca565b825f61269f82610b8c565b90505f6126ac8983613e6d565b905060405180606001604052806126c03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061587483398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158548339815191525f6127b585612af1565b90505f806127c68360400151613365565b91509150801561282b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ca565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561285c5761285c614db3565b600581111561286d5761286d614db3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156128de576128de614db3565b14806128fc57506001825160058111156128fa576128fa614db3565b145b61295b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ca565b60038251600581111561297057612970614db3565b0361297d57506004612981565b5060055b6020808301515f908152600988019091526040812055818160058111156129aa576129aa614db3565b908160058111156129bd576129bd614db3565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156129f1576129f1614db3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612aa557612aa5614db3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6118816001600160a01b03821683614351565b60408051606080820183525f8083526020830181905292820152905f805160206158548339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612b66573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612b8d919081019061544c565b9150915080612bed5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016105ca565b8254825114612c505760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ca565b60208201516001600160a01b031615612cc35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ca565b509392505050565b5f805f8351603614612cef5760405162461bcd60e51b81526004016105ca90615597565b5f805b6002811015612d3e57612d06816001615539565b612d11906008615307565b61ffff16868281518110612d2757612d27615041565b016020015160f81c901b9190911790600101612cf2565b5061ffff811615612d615760405162461bcd60e51b81526004016105ca906155e0565b5f805b6004811015612dbc57612d78816003615539565b612d83906008615307565b63ffffffff1687612d958360026152d2565b81518110612da557612da5615041565b016020015160f81c901b9190911790600101612d64565b5063ffffffff8116600414612de35760405162461bcd60e51b81526004016105ca90615623565b5f805b6020811015612e3857612dfa81601f615539565b612e05906008615307565b88612e118360066152d2565b81518110612e2157612e21615041565b016020015160f81c901b9190911790600101612de6565b505f805b6008811015612e9757612e50816007615539565b612e5b906008615307565b6001600160401b031689612e708360266152d2565b81518110612e8057612e80615041565b016020015160f81c901b9190911790600101612e3c565b505f805b6008811015612ef657612eaf816007615539565b612eba906008615307565b6001600160401b03168a612ecf83602e6152d2565b81518110612edf57612edf615041565b016020015160f81c901b9190911790600101612e9b565b5091989097509095509350505050565b5f8151602614612f285760405162461bcd60e51b81526004016105ca90615597565b5f805b6002811015612f7757612f3f816001615539565b612f4a906008615307565b61ffff16848281518110612f6057612f60615041565b016020015160f81c901b9190911790600101612f2b565b5061ffff811615612f9a5760405162461bcd60e51b81526004016105ca906155e0565b5f805b6004811015612ff557612fb1816003615539565b612fbc906008615307565b63ffffffff1685612fce8360026152d2565b81518110612fde57612fde615041565b016020015160f81c901b9190911790600101612f9d565b5063ffffffff81161561301a5760405162461bcd60e51b81526004016105ca90615623565b5f805b60208110156124985761303181601f615539565b61303c906008615307565b866130488360066152d2565b8151811061305857613058615041565b016020015160f81c901b919091179060010161301d565b5f8181525f805160206158948339815191526020526040808220815160e0810190925280545f8051602061585483398151915293929190829060ff1660058111156130bc576130bc614db3565b60058111156130cd576130cd614db3565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561313f5761313f614db3565b1461319b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ca565b6131a88160800151612227565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156131ec576131ec614db3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132a18461329b81612197565b5f61227c565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906132d0908590600401614ed3565b6020604051808303815f875af11580156132ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133109190614f05565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146133885760405162461bcd60e51b81526004016105ca90615597565b5f805b60028110156133d75761339f816001615539565b6133aa906008615307565b61ffff168582815181106133c0576133c0615041565b016020015160f81c901b919091179060010161338b565b5061ffff8116156133fa5760405162461bcd60e51b81526004016105ca906155e0565b5f805b600481101561345557613411816003615539565b61341c906008615307565b63ffffffff168661342e8360026152d2565b8151811061343e5761343e615041565b016020015160f81c901b91909117906001016133fd565b5063ffffffff811660031461347c5760405162461bcd60e51b81526004016105ca90615623565b5f805b60208110156134d15761349381601f615539565b61349e906008615307565b876134aa8360066152d2565b815181106134ba576134ba615041565b016020015160f81c901b919091179060010161347f565b505f866026815181106134e6576134e6615041565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206158148339815191528161351f84610b8c565b90505f61352b87611e08565b905060028151600581111561354257613542614db3565b146135a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ca565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166136345760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016105ca565b61363d826143e4565b5f82826080015161364e919061531e565b60048501546040840151919250613670916001600160401b039091169061566a565b6001600160401b0316816001600160401b031611156136ef5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ca565b6136f98882612234565b5f61370389612197565b90505f898260405160200161372f92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6137698d868861227c565b6040518263ffffffff1660e01b81526004016137859190614ed3565b6020604051808303815f875af11580156137a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c59190614f05565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561384d5761384d614db3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e1461399f5760405162461bcd60e51b81526004016105ca90615597565b5f805b60028110156139ee576139b6816001615539565b6139c1906008615307565b61ffff168582815181106139d7576139d7615041565b016020015160f81c901b91909117906001016139a2565b5061ffff811615613a115760405162461bcd60e51b81526004016105ca906155e0565b5f805b6004811015613a6c57613a28816003615539565b613a33906008615307565b63ffffffff1686613a458360026152d2565b81518110613a5557613a55615041565b016020015160f81c901b9190911790600101613a14565b5063ffffffff8116600514613a935760405162461bcd60e51b81526004016105ca90615623565b5f805b6020811015613ae857613aaa81601f615539565b613ab5906008615307565b87613ac18360066152d2565b81518110613ad157613ad1615041565b016020015160f81c901b9190911790600101613a96565b505f805b6008811015613b4757613b00816007615539565b613b0b906008615307565b6001600160401b031688613b208360266152d2565b81518110613b3057613b30615041565b016020015160f81c901b9190911790600101613aec565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615854833981519152914291901580613c3a575060028301548151613c36916001600160401b0316906152d2565b8210155b15613c60576001600160401b038516606082015281815260408101516020820152613c7f565b8481606001818151613c72919061531e565b6001600160401b03169052505b6060810151613c8f90606461566a565b602082015160028501546001600160401b039290921691613cba9190600160401b900460ff16615307565b1015613d1e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ca565b8315613d4757846001600160401b031681604001818151613d3f91906152d2565b905250613d66565b846001600160401b031681604001818151613d629190615539565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613df757604051631afcd79f60e31b815260040160405180910390fd5b565b613e01613dae565b613e0a816143ef565b613e12614408565b612231608082013560a0830135613e2f60e0850160c08601614d9a565b613e40610100860160e08701615695565b61ffff16613e56610120870161010088016156ae565b613e6861014088016101208901614fda565b614418565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613ef85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016105ca565b5f8051602061585483398151915242613f176040860160208701614d9a565b6001600160401b031611613f895760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ca565b613f996040850160208601614d9a565b6001600160401b0316613faf6202a300426152d2565b116140225760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ca565b83356140405760405162461bcd60e51b81526004016105ca9061519c565b83355f9081526009820160205260409020541561406f5760405162461bcd60e51b81526004016105ca906151dd565b61407c60408501856156ce565b905060301461409d5760405162461bcd60e51b81526004016105ca90615225565b6140a6836143e4565b5f806141406040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906140eb9190614d9a565b6001600160401b0316815260200161410660408a018a6156ce565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061465c565b5f8281526007860160205260409020919350915061415e8282615754565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061418b908590600401614ed3565b6020604051808303815f875af11580156141a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141cb9190614f05565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561424357614243614db3565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614323918e01908e01614d9a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156143745760405163cd78605960e01b81523060048201526024016105ca565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146143bd576040519150601f19603f3d011682016040523d82523d5f602084013e6143c2565b606091505b5050905080611dd257604051630a12f52160e11b815260040160405180910390fd5b612231816001613b54565b6143f7613dae565b6143ff614a0b565b61223181614a13565b614410613dae565b613df7614bb5565b614420613dae565b5f805160206158148339815191528361448c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ca565b6127108411156144ae5760405162461bcd60e51b81526004016105ca9061554c565b858711156145165760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ca565b5f8360ff16116145835760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ca565b600a60ff841611156145f55760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ca565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146146c65760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ca565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561473d576146fd816001615539565b614708906008615307565b5081515f9083908390811061471f5761471f615041565b60200101906001600160f81b03191690815f1a9053506001016146e9565b505f5b60048110156147a557614754816003615539565b61475f906008615307565b600160ff919091161c60f81b826147778360026152d2565b8151811061478757614787615041565b60200101906001600160f81b03191690815f1a905350600101614740565b505f5b602081101561480257845181602081106147c4576147c4615041565b1a60f81b826147d48360066152d2565b815181106147e4576147e4615041565b60200101906001600160f81b03191690815f1a9053506001016147a8565b505f5b6020811015614862578460200151816020811061482457614824615041565b1a60f81b826148348360266152d2565b8151811061484457614844615041565b60200101906001600160f81b03191690815f1a905350600101614805565b505f5b60088110156148d657614879816007615539565b614884906008615307565b60ff1685604001516001600160401b0316901c60f81b828260466148a891906152d2565b815181106148b8576148b8615041565b60200101906001600160f81b03191690815f1a905350600101614865565b505f5b603081101561494157846080015181815181106148f8576148f8615041565b01602001516001600160f81b0319168261491383604e6152d2565b8151811061492357614923615041565b60200101906001600160f81b03191690815f1a9053506001016148d9565b505f5b60088110156149b357614958816007615539565b614963906008615307565b60608601516001600160401b0390811691161c60f81b8261498583607e6152d2565b8151811061499557614995615041565b60200101906001600160f81b03191690815f1a905350600101614944565b506002816040516149c491906152c1565b602060405180830381855afa1580156149df573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a029190614f05565b94909350915050565b613df7613dae565b614a1b613dae565b80355f8051602061585483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614a6760808401606085016156ae565b60ff161115614ad45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ca565b5f614ae560808401606085016156ae565b60ff1611614b4d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ca565b614b5d60808301606084016156ae565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614b8e6060830160408401614d9a565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612753613dae565b508054614bc99061533e565b5f825580601f10614bd8575050565b601f0160209004905f5260205f209081019061223191905b80821115614c03575f8155600101614bf0565b5090565b8015158114612231575f80fd5b803563ffffffff81168114611e03575f80fd5b5f805f60608486031215614c39575f80fd5b833592506020840135614c4b81614c07565b9150614c5960408501614c14565b90509250925092565b5f60208284031215614c72575f80fd5b5035919050565b5f6101408284031215614c8a575f80fd5b50919050565b803561ffff81168114611e03575f80fd5b80356001600160401b0381168114611e03575f80fd5b5f805f60608486031215614cc9575f80fd5b83356001600160401b03811115614cde575f80fd5b840160608187031215614cef575f80fd5b9250614cfd60208501614c90565b9150614c5960408501614ca1565b5f60208284031215614d1b575f80fd5b610bcf82614c14565b5f8060408385031215614d35575f80fd5b614d3e83614c14565b946020939093013593505050565b5f8060408385031215614d5d575f80fd5b82356001600160401b03811115614d72575f80fd5b830160808186031215614d83575f80fd5b9150614d9160208401614c14565b90509250929050565b5f60208284031215614daa575f80fd5b610bcf82614ca1565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614dea57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e2560608401826001600160401b03169052565b506080830151614e4060808401826001600160401b03169052565b5060a0830151614e5b60a08401826001600160401b03169052565b5060c0830151614e7660c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e7657614e76614e7d565b5f5b83811015614ecb578181015183820152602001614eb3565b50505f910152565b602081525f8251806020840152614ef1816040850160208701614eb1565b601f01601f19169190910160400192915050565b5f60208284031215614f15575f80fd5b5051919050565b5f82614f3657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612231575f80fd5b5f60208284031215614fea575f80fd5b8135610bcf81614fc6565b5f808335601e1984360301811261500a575f80fd5b8301803591506001600160401b03821115615023575f80fd5b6020019150600581901b360382131561503a575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615069575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150a9576150a9615073565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150d7576150d7615073565b604052919050565b5f6001600160401b038211156150f7576150f7615073565b50601f01601f191660200190565b5f60608236031215615115575f80fd5b61511d615087565b82358152602061512e818501614ca1565b8183015260408401356001600160401b0381111561514a575f80fd5b840136601f82011261515a575f80fd5b803561516d615168826150df565b6150af565b8181523684838501011115615180575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615283818460208a01614eb1565b80830190508581526001600160401b0360c01b8560c01b16602082015283516152b3816028840160208801614eb1565b016028019695505050505050565b5f8251615069818460208701614eb1565b80820180821115610b9c57610b9c614e7d565b5f63ffffffff8083168181036152fd576152fd614e7d565b6001019392505050565b8082028115828204841417610b9c57610b9c614e7d565b6001600160401b03818116838216019080821115614e7657614e76614e7d565b600181811c9082168061535257607f821691505b602082108103614c8a57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546153c98161533e565b806020870152604060018084165f81146153ea576001811461540657615433565b60ff19851660408a0152604084151560051b8a01019550615433565b895f5260205f205f5b8581101561542a5781548b820186015290830190880161540f565b8a016040019650505b509398975050505050505050565b8051611e0381614c07565b5f806040838503121561545d575f80fd5b82516001600160401b0380821115615473575f80fd5b9084019060608287031215615486575f80fd5b61548e615087565b825181526020808401516154a181614fc6565b828201526040840151838111156154b6575f80fd5b80850194505087601f8501126154ca575f80fd5b835192506154da615168846150df565b83815288828587010111156154ed575f80fd5b6154fc84838301848801614eb1565b80604084015250819550615511818801615441565b9450505050509250929050565b5f6001600160401b038083168181036152fd576152fd614e7d565b81810381811115610b9c57610b9c614e7d565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461568d5761568d614e7d565b505092915050565b5f602082840312156156a5575f80fd5b610bcf82614c90565b5f602082840312156156be575f80fd5b813560ff81168114610bcf575f80fd5b5f808335601e198436030181126156e3575f80fd5b8301803591506001600160401b038211156156fc575f80fd5b60200191503681900382131561503a575f80fd5b601f821115611dd257805f5260205f20601f840160051c810160208510156157355750805b601f840160051c820191505b81811015611651575f8155600101615741565b81516001600160401b0381111561576d5761576d615073565b6157818161577b845461533e565b84615710565b602080601f8311600181146157b4575f841561579d5750858301515b5f19600386901b1c1916600185901b17855561580b565b5f85815260208120601f198616915b828110156157e2578886015182559484019460019091019084016157c3565b50858210156157ff57878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615a0d380380615a0d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6158c08061014d5f395ff3fe60806040526004361061013c575f3560e01c806362065856116100b3578063ba3a4b971161006d578063ba3a4b97146103be578063bee0a03f146103dd578063c599e24f146103fc578063c974d1b61461040f578063d5f20ff614610423578063df93d8de1461044f575f80fd5b806362065856146102f157806366435abf1461031057806376f786211461032f57806398f3e2b41461034e578063a3a65e481461036d578063b771b3bc1461038c575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded1461025957806340034a9314610281578063467ef06f146102945780635297fae6146102b357806361e2f490146102d2575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a366004614c27565b610465565b005b34801561016c575f80fd5b5061015f61017b366004614c62565b6108f6565b34801561018b575f80fd5b506101ca61019a366004614c62565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614c79565b610aaf565b34801561022d575f80fd5b5061024161023c366004614c62565b610b8c565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b6101ca61028f366004614cb7565b610ba2565b34801561029f575f80fd5b5061015f6102ae366004614d0b565b610bd6565b3480156102be575f80fd5b5061015f6102cd366004614d24565b610c29565b3480156102dd575f80fd5b5061015f6102ec366004614d4c565b610dfe565b3480156102fc575f80fd5b506101ca61030b366004614d9a565b61154a565b34801561031b575f80fd5b5061024161032a366004614c62565b611563565b34801561033a575f80fd5b5061015f610349366004614c27565b611577565b348015610359575f80fd5b5061015f610368366004614d24565b611658565b348015610378575f80fd5b5061015f610387366004614d0b565b611885565b348015610397575f80fd5b506103a66005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103c9575f80fd5b5061015f6103d8366004614c62565b611a3d565b3480156103e8575f80fd5b5061015f6103f7366004614c62565b611cc3565b6101ca61040a366004614c62565b611dd7565b34801561041a575f80fd5b506101f1601481565b34801561042e575f80fd5b5061044261043d366004614c62565b611e08565b6040516101d49190614dc7565b34801561045a575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206158148339815191529184156104b7576104b48285611efb565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104e9576104e9614db3565b60048111156104fa576104fa614db3565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058157610581614db3565b146105d35760405162461bcd60e51b815260206004820152602a60248201525f805160206158348339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106385760405162461bcd60e51b815260206004820152603360248201525f805160206158348339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ca565b5f61064284612197565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561068f5761068f614db3565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076185611e08565b905082606001516001600160401b031681608001516001600160401b0316116107d85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105ca565b6002815160058111156107ed576107ed614db3565b036107ff576107ff8360600151612227565b5f836060015182608001516108149190614e91565b90506108208682612234565b5f6005600160991b0163ee5b48eb61083989878661227c565b6040518263ffffffff1660e01b81526004016108559190614ed3565b6020604051808303815f875af1158015610871573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108959190614f05565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206158948339815191526020526040808220815160e0810190925280545f8051602061585483398151915293929190829060ff16600581111561094357610943614db3565b600581111561095457610954614db3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109c3576109c3614db3565b14610a285760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb610a4d8584606001515f61227c565b6040518263ffffffff1660e01b8152600401610a699190614ed3565b6020604051808303815f875af1158015610a85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa99190614f05565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610af8575080546001600160401b03808416911610155b15610b165760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b40836124a1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b9c64e8d4a5100083614f1c565b92915050565b5f610bab6124b2565b610bb7848484346124e9565b9050610bcf60015f8051602061587483398151915255565b9392505050565b5f805160206158148339815191525f80610bef84612766565b6040808201515f848152600588016020529190912054929450909250610aa9916001600160401b03909116906001600160a01b0316612ade565b5f805160206158148339815191525f610c4184612af1565b90505f80610c528360400151612ccb565b50915091505f610c6183611e08565b9050816001600160401b031681606001516001600160401b03161015610c995760405162461bcd60e51b81526004016105ca90614f3b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cde5760405162461bcd60e51b81526004016105ca90614f7d565b60015f87815260068701602052604090205460ff166004811115610d0457610d04614db3565b14610d6d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206158548339815191529060ff1615610e9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ede573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f029190614f05565b836020013514610f645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016105ca565b30610f756060850160408601614fda565b6001600160a01b031614610fe75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016105ca565b5f610ff56060850185614ff5565b9050116110545760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016105ca565b5f6110626060850185614ff5565b91505063ffffffff81106110ce5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016105ca565b5f8435602086013560146110e86060890160408a01614fda565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561145a575f6111686060890189614ff5565b8363ffffffff1681811061117e5761117e615041565b90506020028101906111909190615055565b61119990615105565b8051909150806111bb5760405162461bcd60e51b81526004016105ca9061519c565b5f818152600988016020526040902054156111e85760405162461bcd60e51b81526004016105ca906151dd565b81604001515160301461120d5760405162461bcd60e51b81526004016105ca90615225565b84825f01518360200151846040015160405160200161122f9493929190615272565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161127d91906152c1565b602060405180830381855afa158015611298573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112bb9190614f05565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561134757611347614db3565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113fa9116866152d2565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080611452906152e5565b91505061114c565b50600584018190555f61146c86612af1565b90505f61147c8260400151612f06565b90508060028560405161148f91906152c1565b602060405180830381855afa1580156114aa573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114cd9190614f05565b146115315760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016105ca565b505050600a909201805460ff1916600117905550505050565b5f610b9c6001600160401b03831664e8d4a51000615307565b5f61156d82611e08565b6080015192915050565b5f805160206158148339815191525f61158f85611e08565b5f86815260058401602052604090205460a08201519192506115c291600160b01b9091046001600160401b03169061531e565b6001600160401b03164210156116365760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ca565b8315611648576116468584611efb565b505b6116518561306f565b5050505050565b6116606124b2565b5f805160206158148339815191525f61167884612af1565b90505f806116898360400151612ccb565b50915091505f61169883611e08565b9050816001600160401b031681606001516001600160401b031610156116d05760405162461bcd60e51b81526004016105ca90614f3b565b5f8681526006860160205260409020600301546001600160401b038084169116111561170e5760405162461bcd60e51b81526004016105ca90614f7d565b60035f87815260068701602052604090205460ff16600481111561173457611734614db3565b146117885760405162461bcd60e51b815260206004820152603160248201525f805160206158348339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261182d91612ade565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061188160015f8051602061587483398151915255565b5050565b5f805160206158548339815191525f61189d83612af1565b90505f806118ae8360400151613365565b91509150806119105760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ca565b5f8281526007850160205260408120805461192a9061533e565b905011801561195c575060015f83815260088601602052604090205460ff16600581111561195a5761195a614db3565b145b6119785760405162461bcd60e51b81526004016105ca90615370565b5f828152600785016020526040812061199091614bbd565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061581483398151915293929190829060ff166004811115611a9e57611a9e614db3565b6004811115611aaf57611aaf614db3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b3657611b36614db3565b1480611b545750600381516004811115611b5257611b52614db3565b145b611ba85760405162461bcd60e51b815260206004820152603260248201525f80516020615834833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ca565b5f611bb68260400151611e08565b905080606001516001600160401b03165f03611c3a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb611c6784604001518460600151856080015161227c565b6040518263ffffffff1660e01b8152600401611c839190614ed3565b6020604051808303815f875af1158015611c9f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116519190614f05565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615854833981519152929190611d0b9061533e565b9050118015611d3d575060015f83815260088301602052604090205460ff166005811115611d3b57611d3b614db3565b145b611d595760405162461bcd60e51b81526004016105ca90615370565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d9291906004016153b7565b6020604051808303815f875af1158015611dae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd29190614f05565b505050565b5f611de06124b2565b611deb823334613506565b9050611e0360015f8051602061587483398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061589483398151915290528390208351918201909352825491925f8051602061585483398151915292829060ff166005811115611e8857611e88614db3565b6005811115611e9957611e99614db3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f46573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f6d919081019061544c565b9150915080611fd05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612013573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120379190614f05565b82511461209b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ca565b60208201516001600160a01b0316156121115760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ca565b5f80612120846040015161397c565b9150915081871461218d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ca565b9695505050505050565b5f8181525f805160206158948339815191526020526040812060020180545f8051602061585483398151915291600160401b9091046001600160401b03169060086121e18361551e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b612231815f613b54565b50565b5f9182525f80516020615894833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156122f5576122b5816001615539565b6122c0906008615307565b5081515f908390839081106122d7576122d7615041565b60200101906001600160f81b03191690815f1a9053506001016122a1565b505f5b60048110156123605761230c816003615539565b612317906008615307565b600263ffffffff16901c60f81b8282600261233291906152d2565b8151811061234257612342615041565b60200101906001600160f81b03191690815f1a9053506001016122f8565b505f5b60208110156123c25761237781601f615539565b612382906008615307565b86901c60f81b826123948360066152d2565b815181106123a4576123a4615041565b60200101906001600160f81b03191690815f1a905350600101612363565b505f5b600881101561242d576123d9816007615539565b6123e4906008615307565b6001600160401b038616901c60f81b826123ff8360266152d2565b8151811061240f5761240f615041565b60200101906001600160f81b03191690815f1a9053506001016123c5565b505f5b600881101561249857612444816007615539565b61244f906008615307565b6001600160401b038516901c60f81b8261246a83602e6152d2565b8151811061247a5761247a615041565b60200101906001600160f81b03191690815f1a905350600101612430565b50949350505050565b6124a9613dae565b61223181613df9565b5f805160206158748339815191528054600119016124e357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158148339815191529061ffff861610801590612535575061271061ffff861611155b6125515760405162461bcd60e51b81526004016105ca9061554c565b60028101546001600160401b0390811690851610156125ca5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ca565b805483101561262d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ca565b80600101548311156126945760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ca565b825f61269f82610b8c565b90505f6126ac8983613e6d565b905060405180606001604052806126c03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061587483398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158548339815191525f6127b585612af1565b90505f806127c68360400151613365565b91509150801561282b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ca565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561285c5761285c614db3565b600581111561286d5761286d614db3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156128de576128de614db3565b14806128fc57506001825160058111156128fa576128fa614db3565b145b61295b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ca565b60038251600581111561297057612970614db3565b0361297d57506004612981565b5060055b6020808301515f908152600988019091526040812055818160058111156129aa576129aa614db3565b908160058111156129bd576129bd614db3565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156129f1576129f1614db3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612aa557612aa5614db3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6118816001600160a01b03821683614351565b60408051606080820183525f8083526020830181905292820152905f805160206158548339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612b66573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612b8d919081019061544c565b9150915080612bed5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016105ca565b8254825114612c505760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ca565b60208201516001600160a01b031615612cc35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ca565b509392505050565b5f805f8351603614612cef5760405162461bcd60e51b81526004016105ca90615597565b5f805b6002811015612d3e57612d06816001615539565b612d11906008615307565b61ffff16868281518110612d2757612d27615041565b016020015160f81c901b9190911790600101612cf2565b5061ffff811615612d615760405162461bcd60e51b81526004016105ca906155e0565b5f805b6004811015612dbc57612d78816003615539565b612d83906008615307565b63ffffffff1687612d958360026152d2565b81518110612da557612da5615041565b016020015160f81c901b9190911790600101612d64565b5063ffffffff8116600414612de35760405162461bcd60e51b81526004016105ca90615623565b5f805b6020811015612e3857612dfa81601f615539565b612e05906008615307565b88612e118360066152d2565b81518110612e2157612e21615041565b016020015160f81c901b9190911790600101612de6565b505f805b6008811015612e9757612e50816007615539565b612e5b906008615307565b6001600160401b031689612e708360266152d2565b81518110612e8057612e80615041565b016020015160f81c901b9190911790600101612e3c565b505f805b6008811015612ef657612eaf816007615539565b612eba906008615307565b6001600160401b03168a612ecf83602e6152d2565b81518110612edf57612edf615041565b016020015160f81c901b9190911790600101612e9b565b5091989097509095509350505050565b5f8151602614612f285760405162461bcd60e51b81526004016105ca90615597565b5f805b6002811015612f7757612f3f816001615539565b612f4a906008615307565b61ffff16848281518110612f6057612f60615041565b016020015160f81c901b9190911790600101612f2b565b5061ffff811615612f9a5760405162461bcd60e51b81526004016105ca906155e0565b5f805b6004811015612ff557612fb1816003615539565b612fbc906008615307565b63ffffffff1685612fce8360026152d2565b81518110612fde57612fde615041565b016020015160f81c901b9190911790600101612f9d565b5063ffffffff81161561301a5760405162461bcd60e51b81526004016105ca90615623565b5f805b60208110156124985761303181601f615539565b61303c906008615307565b866130488360066152d2565b8151811061305857613058615041565b016020015160f81c901b919091179060010161301d565b5f8181525f805160206158948339815191526020526040808220815160e0810190925280545f8051602061585483398151915293929190829060ff1660058111156130bc576130bc614db3565b60058111156130cd576130cd614db3565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561313f5761313f614db3565b1461319b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ca565b6131a88160800151612227565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156131ec576131ec614db3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132a18461329b81612197565b5f61227c565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906132d0908590600401614ed3565b6020604051808303815f875af11580156132ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133109190614f05565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146133885760405162461bcd60e51b81526004016105ca90615597565b5f805b60028110156133d75761339f816001615539565b6133aa906008615307565b61ffff168582815181106133c0576133c0615041565b016020015160f81c901b919091179060010161338b565b5061ffff8116156133fa5760405162461bcd60e51b81526004016105ca906155e0565b5f805b600481101561345557613411816003615539565b61341c906008615307565b63ffffffff168661342e8360026152d2565b8151811061343e5761343e615041565b016020015160f81c901b91909117906001016133fd565b5063ffffffff811660031461347c5760405162461bcd60e51b81526004016105ca90615623565b5f805b60208110156134d15761349381601f615539565b61349e906008615307565b876134aa8360066152d2565b815181106134ba576134ba615041565b016020015160f81c901b919091179060010161347f565b505f866026815181106134e6576134e6615041565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206158148339815191528161351f84610b8c565b90505f61352b87611e08565b905060028151600581111561354257613542614db3565b146135a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ca565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166136345760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016105ca565b61363d826143e4565b5f82826080015161364e919061531e565b60048501546040840151919250613670916001600160401b039091169061566a565b6001600160401b0316816001600160401b031611156136ef5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ca565b6136f98882612234565b5f61370389612197565b90505f898260405160200161372f92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6137698d868861227c565b6040518263ffffffff1660e01b81526004016137859190614ed3565b6020604051808303815f875af11580156137a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c59190614f05565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561384d5761384d614db3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e1461399f5760405162461bcd60e51b81526004016105ca90615597565b5f805b60028110156139ee576139b6816001615539565b6139c1906008615307565b61ffff168582815181106139d7576139d7615041565b016020015160f81c901b91909117906001016139a2565b5061ffff811615613a115760405162461bcd60e51b81526004016105ca906155e0565b5f805b6004811015613a6c57613a28816003615539565b613a33906008615307565b63ffffffff1686613a458360026152d2565b81518110613a5557613a55615041565b016020015160f81c901b9190911790600101613a14565b5063ffffffff8116600514613a935760405162461bcd60e51b81526004016105ca90615623565b5f805b6020811015613ae857613aaa81601f615539565b613ab5906008615307565b87613ac18360066152d2565b81518110613ad157613ad1615041565b016020015160f81c901b9190911790600101613a96565b505f805b6008811015613b4757613b00816007615539565b613b0b906008615307565b6001600160401b031688613b208360266152d2565b81518110613b3057613b30615041565b016020015160f81c901b9190911790600101613aec565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615854833981519152914291901580613c3a575060028301548151613c36916001600160401b0316906152d2565b8210155b15613c60576001600160401b038516606082015281815260408101516020820152613c7f565b8481606001818151613c72919061531e565b6001600160401b03169052505b6060810151613c8f90606461566a565b602082015160028501546001600160401b039290921691613cba9190600160401b900460ff16615307565b1015613d1e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ca565b8315613d4757846001600160401b031681604001818151613d3f91906152d2565b905250613d66565b846001600160401b031681604001818151613d629190615539565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613df757604051631afcd79f60e31b815260040160405180910390fd5b565b613e01613dae565b613e0a816143ef565b613e12614408565b612231608082013560a0830135613e2f60e0850160c08601614d9a565b613e40610100860160e08701615695565b61ffff16613e56610120870161010088016156ae565b613e6861014088016101208901614fda565b614418565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613ef85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016105ca565b5f8051602061585483398151915242613f176040860160208701614d9a565b6001600160401b031611613f895760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ca565b613f996040850160208601614d9a565b6001600160401b0316613faf6202a300426152d2565b116140225760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ca565b83356140405760405162461bcd60e51b81526004016105ca9061519c565b83355f9081526009820160205260409020541561406f5760405162461bcd60e51b81526004016105ca906151dd565b61407c60408501856156ce565b905060301461409d5760405162461bcd60e51b81526004016105ca90615225565b6140a6836143e4565b5f806141406040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906140eb9190614d9a565b6001600160401b0316815260200161410660408a018a6156ce565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061465c565b5f8281526007860160205260409020919350915061415e8282615754565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061418b908590600401614ed3565b6020604051808303815f875af11580156141a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141cb9190614f05565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561424357614243614db3565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614323918e01908e01614d9a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156143745760405163cd78605960e01b81523060048201526024016105ca565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146143bd576040519150601f19603f3d011682016040523d82523d5f602084013e6143c2565b606091505b5050905080611dd257604051630a12f52160e11b815260040160405180910390fd5b612231816001613b54565b6143f7613dae565b6143ff614a0b565b61223181614a13565b614410613dae565b613df7614bb5565b614420613dae565b5f805160206158148339815191528361448c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ca565b6127108411156144ae5760405162461bcd60e51b81526004016105ca9061554c565b858711156145165760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ca565b5f8360ff16116145835760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ca565b600a60ff841611156145f55760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ca565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146146c65760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ca565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561473d576146fd816001615539565b614708906008615307565b5081515f9083908390811061471f5761471f615041565b60200101906001600160f81b03191690815f1a9053506001016146e9565b505f5b60048110156147a557614754816003615539565b61475f906008615307565b600160ff919091161c60f81b826147778360026152d2565b8151811061478757614787615041565b60200101906001600160f81b03191690815f1a905350600101614740565b505f5b602081101561480257845181602081106147c4576147c4615041565b1a60f81b826147d48360066152d2565b815181106147e4576147e4615041565b60200101906001600160f81b03191690815f1a9053506001016147a8565b505f5b6020811015614862578460200151816020811061482457614824615041565b1a60f81b826148348360266152d2565b8151811061484457614844615041565b60200101906001600160f81b03191690815f1a905350600101614805565b505f5b60088110156148d657614879816007615539565b614884906008615307565b60ff1685604001516001600160401b0316901c60f81b828260466148a891906152d2565b815181106148b8576148b8615041565b60200101906001600160f81b03191690815f1a905350600101614865565b505f5b603081101561494157846080015181815181106148f8576148f8615041565b01602001516001600160f81b0319168261491383604e6152d2565b8151811061492357614923615041565b60200101906001600160f81b03191690815f1a9053506001016148d9565b505f5b60088110156149b357614958816007615539565b614963906008615307565b60608601516001600160401b0390811691161c60f81b8261498583607e6152d2565b8151811061499557614995615041565b60200101906001600160f81b03191690815f1a905350600101614944565b506002816040516149c491906152c1565b602060405180830381855afa1580156149df573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a029190614f05565b94909350915050565b613df7613dae565b614a1b613dae565b80355f8051602061585483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614a6760808401606085016156ae565b60ff161115614ad45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ca565b5f614ae560808401606085016156ae565b60ff1611614b4d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ca565b614b5d60808301606084016156ae565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614b8e6060830160408401614d9a565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612753613dae565b508054614bc99061533e565b5f825580601f10614bd8575050565b601f0160209004905f5260205f209081019061223191905b80821115614c03575f8155600101614bf0565b5090565b8015158114612231575f80fd5b803563ffffffff81168114611e03575f80fd5b5f805f60608486031215614c39575f80fd5b833592506020840135614c4b81614c07565b9150614c5960408501614c14565b90509250925092565b5f60208284031215614c72575f80fd5b5035919050565b5f6101408284031215614c8a575f80fd5b50919050565b803561ffff81168114611e03575f80fd5b80356001600160401b0381168114611e03575f80fd5b5f805f60608486031215614cc9575f80fd5b83356001600160401b03811115614cde575f80fd5b840160608187031215614cef575f80fd5b9250614cfd60208501614c90565b9150614c5960408501614ca1565b5f60208284031215614d1b575f80fd5b610bcf82614c14565b5f8060408385031215614d35575f80fd5b614d3e83614c14565b946020939093013593505050565b5f8060408385031215614d5d575f80fd5b82356001600160401b03811115614d72575f80fd5b830160808186031215614d83575f80fd5b9150614d9160208401614c14565b90509250929050565b5f60208284031215614daa575f80fd5b610bcf82614ca1565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614dea57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e2560608401826001600160401b03169052565b506080830151614e4060808401826001600160401b03169052565b5060a0830151614e5b60a08401826001600160401b03169052565b5060c0830151614e7660c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e7657614e76614e7d565b5f5b83811015614ecb578181015183820152602001614eb3565b50505f910152565b602081525f8251806020840152614ef1816040850160208701614eb1565b601f01601f19169190910160400192915050565b5f60208284031215614f15575f80fd5b5051919050565b5f82614f3657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612231575f80fd5b5f60208284031215614fea575f80fd5b8135610bcf81614fc6565b5f808335601e1984360301811261500a575f80fd5b8301803591506001600160401b03821115615023575f80fd5b6020019150600581901b360382131561503a575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615069575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150a9576150a9615073565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150d7576150d7615073565b604052919050565b5f6001600160401b038211156150f7576150f7615073565b50601f01601f191660200190565b5f60608236031215615115575f80fd5b61511d615087565b82358152602061512e818501614ca1565b8183015260408401356001600160401b0381111561514a575f80fd5b840136601f82011261515a575f80fd5b803561516d615168826150df565b6150af565b8181523684838501011115615180575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615283818460208a01614eb1565b80830190508581526001600160401b0360c01b8560c01b16602082015283516152b3816028840160208801614eb1565b016028019695505050505050565b5f8251615069818460208701614eb1565b80820180821115610b9c57610b9c614e7d565b5f63ffffffff8083168181036152fd576152fd614e7d565b6001019392505050565b8082028115828204841417610b9c57610b9c614e7d565b6001600160401b03818116838216019080821115614e7657614e76614e7d565b600181811c9082168061535257607f821691505b602082108103614c8a57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546153c98161533e565b806020870152604060018084165f81146153ea576001811461540657615433565b60ff19851660408a0152604084151560051b8a01019550615433565b895f5260205f205f5b8581101561542a5781548b820186015290830190880161540f565b8a016040019650505b509398975050505050505050565b8051611e0381614c07565b5f806040838503121561545d575f80fd5b82516001600160401b0380821115615473575f80fd5b9084019060608287031215615486575f80fd5b61548e615087565b825181526020808401516154a181614fc6565b828201526040840151838111156154b6575f80fd5b80850194505087601f8501126154ca575f80fd5b835192506154da615168846150df565b83815288828587010111156154ed575f80fd5b6154fc84838301848801614eb1565b80604084015250819550615511818801615441565b9450505050509250929050565b5f6001600160401b038083168181036152fd576152fd614e7d565b81810381811115610b9c57610b9c614e7d565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461568d5761568d614e7d565b505092915050565b5f602082840312156156a5575f80fd5b610bcf82614c90565b5f602082840312156156be575f80fd5b813560ff81168114610bcf575f80fd5b5f808335601e198436030181126156e3575f80fd5b8301803591506001600160401b038211156156fc575f80fd5b60200191503681900382131561503a575f80fd5b601f821115611dd257805f5260205f20601f840160051c810160208510156157355750805b601f840160051c820191505b81811015611651575f8155600101615741565b81516001600160401b0381111561576d5761576d615073565b6157818161577b845461533e565b84615710565b602080601f8311600181146157b4575f841561579d5750858301515b5f19600386901b1c1916600185901b17855561580b565b5f85815260208120601f198616915b828110156157e2578886015182559484019460019091019084016157c3565b50858210156157ff57878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index a4628fa89..a3ddb9933 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -73,7 +73,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516139d33803806139d383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138868061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80638da5cb5b1161009e578063bee0a03f1161006e578063bee0a03f14610267578063c974d1b61461027a578063d5f20ff614610294578063df93d8de146102b4578063f2fde38b146102be575f80fd5b80638da5cb5b146101ef57806397fb70d414610233578063a3a65e4814610246578063b771b3bc14610259575f80fd5b806361e2f490116100d957806361e2f4901461019657806366435abf146101a9578063715018a6146101d45780638994ab49146101dc575f80fd5b80630322ed981461010a5780630cdd09851461011f578063467ef06f14610170578063580a400614610183575b5f80fd5b61011d610118366004612da3565b6102d1565b005b61015d61012d366004612da3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011d61017e366004612dd2565b61048f565b61011d610191366004612e15565b61049d565b61011d6101a4366004612e4b565b6105ab565b6101bc6101b7366004612da3565b610cf7565b6040516001600160401b039091168152602001610167565b61011d610d0b565b61015d6101ea366004612eab565b610d1e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610167565b61011d610241366004612da3565b610d3a565b61011d610254366004612dd2565b610d4e565b61021b6005600160991b0181565b61011d610275366004612da3565b610f06565b610282601481565b60405160ff9091168152602001610167565b6102a76102a2366004612da3565b611015565b6040516101679190612f04565b6101bc6202a30081565b61011d6102cc366004612fba565b611108565b5f8181525f8051602061385a8339815191526020526040808220815160e0810190925280545f8051602061383a83398151915293929190829060ff16600581111561031e5761031e612ef0565b600581111561032f5761032f612ef0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561039e5761039e612ef0565b146104085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042d8584606001515f611142565b6040518263ffffffff1660e01b81526004016104499190612ffe565b6020604051808303815f875af1158015610465573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104899190613030565b50505050565b61049881611367565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104e15750825b90505f826001600160401b031660011480156104fc5750303b155b90508115801561050a575080155b156105285760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561055257845460ff60401b1916600160401b1785555b61055c87876116df565b83156105a257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f8051602061383a8339815191529060ff16156106485760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103ff565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af9190613030565b8360200135146107115760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103ff565b306107226060850160408601612fba565b6001600160a01b0316146107945760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103ff565b5f6107a26060850185613047565b9050116108015760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103ff565b5f61080f6060850185613047565b91505063ffffffff811061087b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103ff565b5f8435602086013560146108956060890160408a01612fba565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610c07575f6109156060890189613047565b8363ffffffff1681811061092b5761092b613093565b905060200281019061093d91906130a7565b61094690613157565b8051909150806109685760405162461bcd60e51b81526004016103ff906131ee565b5f818152600988016020526040902054156109955760405162461bcd60e51b81526004016103ff9061322f565b8160400151516030146109ba5760405162461bcd60e51b81526004016103ff90613277565b84825f0151836020015184604001516040516020016109dc94939291906132c4565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610a2a9190613313565b602060405180830381855afa158015610a45573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a689190613030565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610af457610af4612ef0565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610ba7911686613338565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080610bff9061334b565b9150506108f9565b50600584018190555f610c19866116fd565b90505f610c2982604001516118d7565b905080600285604051610c3c9190613313565b602060405180830381855afa158015610c57573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c7a9190613030565b14610cde5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103ff565b505050600a909201805460ff1916600117905550505050565b5f610d0182611015565b6080015192915050565b610d13611a40565b610d1c5f611a9b565b565b5f610d27611a40565b610d318383611b0b565b90505b92915050565b610d42611a40565b610d4b81611fef565b50565b5f8051602061383a8339815191525f610d66836116fd565b90505f80610d7783604001516122e5565b9150915080610dd95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103ff565b5f82815260078501602052604081208054610df39061336d565b9050118015610e25575060015f83815260088601602052604090205460ff166005811115610e2357610e23612ef0565b145b610e415760405162461bcd60e51b81526004016103ff9061339f565b5f8281526007850160205260408120610e5991612d59565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061383a833981519152929190610f4e9061336d565b9050118015610f80575060015f83815260088301602052604090205460ff166005811115610f7e57610f7e612ef0565b145b610f9c5760405162461bcd60e51b81526004016103ff9061339f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610fd591906004016133e6565b6020604051808303815f875af1158015610ff1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104989190613030565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061385a83398151915290528390208351918201909352825491925f8051602061383a83398151915292829060ff16600581111561109557611095612ef0565b60058111156110a6576110a6612ef0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611110611a40565b6001600160a01b03811661113957604051631e4fbdf760e01b81525f60048201526024016103ff565b610d4b81611a9b565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156111bb5761117b816001613470565b611186906008613483565b5081515f9083908390811061119d5761119d613093565b60200101906001600160f81b03191690815f1a905350600101611167565b505f5b6004811015611226576111d2816003613470565b6111dd906008613483565b600263ffffffff16901c60f81b828260026111f89190613338565b8151811061120857611208613093565b60200101906001600160f81b03191690815f1a9053506001016111be565b505f5b60208110156112885761123d81601f613470565b611248906008613483565b86901c60f81b8261125a836006613338565b8151811061126a5761126a613093565b60200101906001600160f81b03191690815f1a905350600101611229565b505f5b60088110156112f35761129f816007613470565b6112aa906008613483565b6001600160401b038616901c60f81b826112c5836026613338565b815181106112d5576112d5613093565b60200101906001600160f81b03191690815f1a90535060010161128b565b505f5b600881101561135e5761130a816007613470565b611315906008613483565b6001600160401b038516901c60f81b8261133083602e613338565b8151811061134057611340613093565b60200101906001600160f81b03191690815f1a9053506001016112f6565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061383a8339815191525f6113b6856116fd565b90505f806113c783604001516122e5565b91509150801561142c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103ff565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561145d5761145d612ef0565b600581111561146e5761146e612ef0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156114df576114df612ef0565b14806114fd57506001825160058111156114fb576114fb612ef0565b145b61155c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103ff565b60038251600581111561157157611571612ef0565b0361157e57506004611582565b5060055b6020808301515f908152600988019091526040812055818160058111156115ab576115ab612ef0565b908160058111156115be576115be612ef0565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156115f2576115f2612ef0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156116a6576116a6612ef0565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6116e7612486565b6116f0826124cf565b6116f9816124e8565b5050565b60408051606080820183525f8083526020830181905292820152905f8051602061383a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611772573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261179991908101906134a9565b91509150806117f95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20496e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103ff565b825482511461185c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103ff565b60208201516001600160a01b0316156118cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103ff565b509392505050565b5f81516026146118f95760405162461bcd60e51b81526004016103ff9061357b565b5f805b600281101561194857611910816001613470565b61191b906008613483565b61ffff1684828151811061193157611931613093565b016020015160f81c901b91909117906001016118fc565b5061ffff81161561196b5760405162461bcd60e51b81526004016103ff906135c4565b5f805b60048110156119c657611982816003613470565b61198d906008613483565b63ffffffff168561199f836002613338565b815181106119af576119af613093565b016020015160f81c901b919091179060010161196e565b5063ffffffff8116156119eb5760405162461bcd60e51b81526004016103ff90613607565b5f805b602081101561135e57611a0281601f613470565b611a0d906008613483565b86611a19836006613338565b81518110611a2957611a29613093565b016020015160f81c901b91909117906001016119ee565b33611a727f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d1c5760405163118cdaa760e01b81523360048201526024016103ff565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611b965760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103ff565b5f8051602061383a83398151915242611bb5604086016020870161364e565b6001600160401b031611611c275760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103ff565b611c37604085016020860161364e565b6001600160401b0316611c4d6202a30042613338565b11611cc05760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103ff565b8335611cde5760405162461bcd60e51b81526004016103ff906131ee565b83355f90815260098201602052604090205415611d0d5760405162461bcd60e51b81526004016103ff9061322f565b611d1a6040850185613667565b9050603014611d3b5760405162461bcd60e51b81526004016103ff90613277565b611d44836124f9565b5f80611dde6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611d89919061364e565b6001600160401b03168152602001611da460408a018a613667565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612504565b5f82815260078601602052604090209193509150611dfc82826136f4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e29908590600401612ffe565b6020604051808303815f875af1158015611e45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e699190613030565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611ee157611ee1612ef0565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611fc1918e01908e0161364e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f8051602061385a8339815191526020526040808220815160e0810190925280545f8051602061383a83398151915293929190829060ff16600581111561203c5761203c612ef0565b600581111561204d5761204d612ef0565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156120bf576120bf612ef0565b1461211b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103ff565b61212881608001516128b3565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561216c5761216c612ef0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6122218461221b816128bd565b5f611142565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612250908590600401612ffe565b6020604051808303815f875af115801561226c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122909190613030565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146123085760405162461bcd60e51b81526004016103ff9061357b565b5f805b60028110156123575761231f816001613470565b61232a906008613483565b61ffff1685828151811061234057612340613093565b016020015160f81c901b919091179060010161230b565b5061ffff81161561237a5760405162461bcd60e51b81526004016103ff906135c4565b5f805b60048110156123d557612391816003613470565b61239c906008613483565b63ffffffff16866123ae836002613338565b815181106123be576123be613093565b016020015160f81c901b919091179060010161237d565b5063ffffffff81166003146123fc5760405162461bcd60e51b81526004016103ff90613607565b5f805b60208110156124515761241381601f613470565b61241e906008613483565b8761242a836006613338565b8151811061243a5761243a613093565b016020015160f81c901b91909117906001016123ff565b505f8660268151811061246657612466613093565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d1c57604051631afcd79f60e31b815260040160405180910390fd5b6124d7612486565b6124df61294d565b610d4b81612955565b6124f0612486565b610d4b81612af7565b610d4b816001612aff565b5f606082608001515160301461256e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103ff565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156125e5576125a5816001613470565b6125b0906008613483565b5081515f908390839081106125c7576125c7613093565b60200101906001600160f81b03191690815f1a905350600101612591565b505f5b600481101561264d576125fc816003613470565b612607906008613483565b600160ff919091161c60f81b8261261f836002613338565b8151811061262f5761262f613093565b60200101906001600160f81b03191690815f1a9053506001016125e8565b505f5b60208110156126aa578451816020811061266c5761266c613093565b1a60f81b8261267c836006613338565b8151811061268c5761268c613093565b60200101906001600160f81b03191690815f1a905350600101612650565b505f5b602081101561270a57846020015181602081106126cc576126cc613093565b1a60f81b826126dc836026613338565b815181106126ec576126ec613093565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b600881101561277e57612721816007613470565b61272c906008613483565b60ff1685604001516001600160401b0316901c60f81b828260466127509190613338565b8151811061276057612760613093565b60200101906001600160f81b03191690815f1a90535060010161270d565b505f5b60308110156127e957846080015181815181106127a0576127a0613093565b01602001516001600160f81b031916826127bb83604e613338565b815181106127cb576127cb613093565b60200101906001600160f81b03191690815f1a905350600101612781565b505f5b600881101561285b57612800816007613470565b61280b906008613483565b60608601516001600160401b0390811691161c60f81b8261282d83607e613338565b8151811061283d5761283d613093565b60200101906001600160f81b03191690815f1a9053506001016127ec565b5060028160405161286c9190613313565b602060405180830381855afa158015612887573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128aa9190613030565b94909350915050565b610d4b815f612aff565b5f8181525f8051602061385a8339815191526020526040812060020180545f8051602061383a83398151915291600160401b9091046001600160401b0316906008612907836137b3565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b610d1c612486565b61295d612486565b80355f8051602061383a83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146129a960808401606085016137ce565b60ff161115612a165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103ff565b5f612a2760808401606085016137ce565b60ff1611612a8f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103ff565b612a9f60808301606084016137ce565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612ad0606083016040840161364e565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b611110612486565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061383a833981519152914291901580612be5575060028301548151612be1916001600160401b031690613338565b8210155b15612c0b576001600160401b038516606082015281815260408101516020820152612c2a565b8481606001818151612c1d91906137ee565b6001600160401b03169052505b6060810151612c3a90606461380e565b602082015160028501546001600160401b039290921691612c659190600160401b900460ff16613483565b1015612cc95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103ff565b8315612cf257846001600160401b031681604001818151612cea9190613338565b905250612d11565b846001600160401b031681604001818151612d0d9190613470565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b508054612d659061336d565b5f825580601f10612d74575050565b601f0160209004905f5260205f2090810190610d4b91905b80821115612d9f575f8155600101612d8c565b5090565b5f60208284031215612db3575f80fd5b5035919050565b803563ffffffff81168114612dcd575f80fd5b919050565b5f60208284031215612de2575f80fd5b610d3182612dba565b5f60808284031215612dfb575f80fd5b50919050565b6001600160a01b0381168114610d4b575f80fd5b5f8060a08385031215612e26575f80fd5b612e308484612deb565b91506080830135612e4081612e01565b809150509250929050565b5f8060408385031215612e5c575f80fd5b82356001600160401b03811115612e71575f80fd5b612e7d85828601612deb565b925050612e8c60208401612dba565b90509250929050565b80356001600160401b0381168114612dcd575f80fd5b5f8060408385031215612ebc575f80fd5b82356001600160401b03811115612ed1575f80fd5b830160608186031215612ee2575f80fd5b9150612e8c60208401612e95565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f2757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f6260608401826001600160401b03169052565b506080830151612f7d60808401826001600160401b03169052565b5060a0830151612f9860a08401826001600160401b03169052565b5060c0830151612fb360c08401826001600160401b03169052565b5092915050565b5f60208284031215612fca575f80fd5b8135612fd581612e01565b9392505050565b5f5b83811015612ff6578181015183820152602001612fde565b50505f910152565b602081525f825180602084015261301c816040850160208701612fdc565b601f01601f19169190910160400192915050565b5f60208284031215613040575f80fd5b5051919050565b5f808335601e1984360301811261305c575f80fd5b8301803591506001600160401b03821115613075575f80fd5b6020019150600581901b360382131561308c575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130bb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130fb576130fb6130c5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613129576131296130c5565b604052919050565b5f6001600160401b03821115613149576131496130c5565b50601f01601f191660200190565b5f60608236031215613167575f80fd5b61316f6130d9565b823581526020613180818501612e95565b8183015260408401356001600160401b0381111561319c575f80fd5b840136601f8201126131ac575f80fd5b80356131bf6131ba82613131565b613101565b81815236848385010111156131d2575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516132d5818460208a01612fdc565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613305816028840160208801612fdc565b016028019695505050505050565b5f82516130bb818460208701612fdc565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d3457610d34613324565b5f63ffffffff80831681810361336357613363613324565b6001019392505050565b600181811c9082168061338157607f821691505b602082108103612dfb57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546133f88161336d565b806020870152604060018084165f8114613419576001811461343557613462565b60ff19851660408a0152604084151560051b8a01019550613462565b895f5260205f205f5b858110156134595781548b820186015290830190880161343e565b8a016040019650505b509398975050505050505050565b81810381811115610d3457610d34613324565b8082028115828204841417610d3457610d34613324565b80518015158114612dcd575f80fd5b5f80604083850312156134ba575f80fd5b82516001600160401b03808211156134d0575f80fd5b90840190606082870312156134e3575f80fd5b6134eb6130d9565b825181526020808401516134fe81612e01565b82820152604084015183811115613513575f80fd5b80850194505087601f850112613527575f80fd5b835192506135376131ba84613131565b838152888285870101111561354a575f80fd5b61355984838301848801612fdc565b8060408401525081955061356e81880161349a565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561365e575f80fd5b610d3182612e95565b5f808335601e1984360301811261367c575f80fd5b8301803591506001600160401b03821115613695575f80fd5b60200191503681900382131561308c575f80fd5b601f82111561049857805f5260205f20601f840160051c810160208510156136ce5750805b601f840160051c820191505b818110156136ed575f81556001016136da565b5050505050565b81516001600160401b0381111561370d5761370d6130c5565b6137218161371b845461336d565b846136a9565b602080601f831160018114613754575f841561373d5750858301515b5f19600386901b1c1916600185901b1785556137ab565b5f85815260208120601f198616915b8281101561378257888601518255948401946001909101908401613763565b508582101561379f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b0380831681810361336357613363613324565b5f602082840312156137de575f80fd5b813560ff81168114612fd5575f80fd5b6001600160401b03818116838216019080821115612fb357612fb3613324565b6001600160401b0381811683821602808216919082811461383157613831613324565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516139d33803806139d383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138868061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80638da5cb5b1161009e578063bee0a03f1161006e578063bee0a03f14610267578063c974d1b61461027a578063d5f20ff614610294578063df93d8de146102b4578063f2fde38b146102be575f80fd5b80638da5cb5b146101ef57806397fb70d414610233578063a3a65e4814610246578063b771b3bc14610259575f80fd5b806361e2f490116100d957806361e2f4901461019657806366435abf146101a9578063715018a6146101d45780638994ab49146101dc575f80fd5b80630322ed981461010a5780630cdd09851461011f578063467ef06f14610170578063580a400614610183575b5f80fd5b61011d610118366004612da3565b6102d1565b005b61015d61012d366004612da3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011d61017e366004612dd2565b61048f565b61011d610191366004612e15565b61049d565b61011d6101a4366004612e4b565b6105ab565b6101bc6101b7366004612da3565b610cf7565b6040516001600160401b039091168152602001610167565b61011d610d0b565b61015d6101ea366004612eab565b610d1e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610167565b61011d610241366004612da3565b610d3a565b61011d610254366004612dd2565b610d4e565b61021b6005600160991b0181565b61011d610275366004612da3565b610f06565b610282601481565b60405160ff9091168152602001610167565b6102a76102a2366004612da3565b611015565b6040516101679190612f04565b6101bc6202a30081565b61011d6102cc366004612fba565b611108565b5f8181525f8051602061385a8339815191526020526040808220815160e0810190925280545f8051602061383a83398151915293929190829060ff16600581111561031e5761031e612ef0565b600581111561032f5761032f612ef0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561039e5761039e612ef0565b146104085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042d8584606001515f611142565b6040518263ffffffff1660e01b81526004016104499190612ffe565b6020604051808303815f875af1158015610465573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104899190613030565b50505050565b61049881611367565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104e15750825b90505f826001600160401b031660011480156104fc5750303b155b90508115801561050a575080155b156105285760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561055257845460ff60401b1916600160401b1785555b61055c87876116df565b83156105a257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f8051602061383a8339815191529060ff16156106485760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103ff565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af9190613030565b8360200135146107115760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103ff565b306107226060850160408601612fba565b6001600160a01b0316146107945760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103ff565b5f6107a26060850185613047565b9050116108015760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103ff565b5f61080f6060850185613047565b91505063ffffffff811061087b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103ff565b5f8435602086013560146108956060890160408a01612fba565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610c07575f6109156060890189613047565b8363ffffffff1681811061092b5761092b613093565b905060200281019061093d91906130a7565b61094690613157565b8051909150806109685760405162461bcd60e51b81526004016103ff906131ee565b5f818152600988016020526040902054156109955760405162461bcd60e51b81526004016103ff9061322f565b8160400151516030146109ba5760405162461bcd60e51b81526004016103ff90613277565b84825f0151836020015184604001516040516020016109dc94939291906132c4565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610a2a9190613313565b602060405180830381855afa158015610a45573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a689190613030565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610af457610af4612ef0565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610ba7911686613338565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080610bff9061334b565b9150506108f9565b50600584018190555f610c19866116fd565b90505f610c2982604001516118d7565b905080600285604051610c3c9190613313565b602060405180830381855afa158015610c57573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c7a9190613030565b14610cde5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103ff565b505050600a909201805460ff1916600117905550505050565b5f610d0182611015565b6080015192915050565b610d13611a40565b610d1c5f611a9b565b565b5f610d27611a40565b610d318383611b0b565b90505b92915050565b610d42611a40565b610d4b81611fef565b50565b5f8051602061383a8339815191525f610d66836116fd565b90505f80610d7783604001516122e5565b9150915080610dd95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103ff565b5f82815260078501602052604081208054610df39061336d565b9050118015610e25575060015f83815260088601602052604090205460ff166005811115610e2357610e23612ef0565b145b610e415760405162461bcd60e51b81526004016103ff9061339f565b5f8281526007850160205260408120610e5991612d59565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061383a833981519152929190610f4e9061336d565b9050118015610f80575060015f83815260088301602052604090205460ff166005811115610f7e57610f7e612ef0565b145b610f9c5760405162461bcd60e51b81526004016103ff9061339f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610fd591906004016133e6565b6020604051808303815f875af1158015610ff1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104989190613030565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061385a83398151915290528390208351918201909352825491925f8051602061383a83398151915292829060ff16600581111561109557611095612ef0565b60058111156110a6576110a6612ef0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611110611a40565b6001600160a01b03811661113957604051631e4fbdf760e01b81525f60048201526024016103ff565b610d4b81611a9b565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156111bb5761117b816001613470565b611186906008613483565b5081515f9083908390811061119d5761119d613093565b60200101906001600160f81b03191690815f1a905350600101611167565b505f5b6004811015611226576111d2816003613470565b6111dd906008613483565b600263ffffffff16901c60f81b828260026111f89190613338565b8151811061120857611208613093565b60200101906001600160f81b03191690815f1a9053506001016111be565b505f5b60208110156112885761123d81601f613470565b611248906008613483565b86901c60f81b8261125a836006613338565b8151811061126a5761126a613093565b60200101906001600160f81b03191690815f1a905350600101611229565b505f5b60088110156112f35761129f816007613470565b6112aa906008613483565b6001600160401b038616901c60f81b826112c5836026613338565b815181106112d5576112d5613093565b60200101906001600160f81b03191690815f1a90535060010161128b565b505f5b600881101561135e5761130a816007613470565b611315906008613483565b6001600160401b038516901c60f81b8261133083602e613338565b8151811061134057611340613093565b60200101906001600160f81b03191690815f1a9053506001016112f6565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061383a8339815191525f6113b6856116fd565b90505f806113c783604001516122e5565b91509150801561142c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103ff565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561145d5761145d612ef0565b600581111561146e5761146e612ef0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156114df576114df612ef0565b14806114fd57506001825160058111156114fb576114fb612ef0565b145b61155c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103ff565b60038251600581111561157157611571612ef0565b0361157e57506004611582565b5060055b6020808301515f908152600988019091526040812055818160058111156115ab576115ab612ef0565b908160058111156115be576115be612ef0565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156115f2576115f2612ef0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156116a6576116a6612ef0565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6116e7612486565b6116f0826124cf565b6116f9816124e8565b5050565b60408051606080820183525f8083526020830181905292820152905f8051602061383a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611772573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261179991908101906134a9565b91509150806117f95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103ff565b825482511461185c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103ff565b60208201516001600160a01b0316156118cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103ff565b509392505050565b5f81516026146118f95760405162461bcd60e51b81526004016103ff9061357b565b5f805b600281101561194857611910816001613470565b61191b906008613483565b61ffff1684828151811061193157611931613093565b016020015160f81c901b91909117906001016118fc565b5061ffff81161561196b5760405162461bcd60e51b81526004016103ff906135c4565b5f805b60048110156119c657611982816003613470565b61198d906008613483565b63ffffffff168561199f836002613338565b815181106119af576119af613093565b016020015160f81c901b919091179060010161196e565b5063ffffffff8116156119eb5760405162461bcd60e51b81526004016103ff90613607565b5f805b602081101561135e57611a0281601f613470565b611a0d906008613483565b86611a19836006613338565b81518110611a2957611a29613093565b016020015160f81c901b91909117906001016119ee565b33611a727f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d1c5760405163118cdaa760e01b81523360048201526024016103ff565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611b965760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103ff565b5f8051602061383a83398151915242611bb5604086016020870161364e565b6001600160401b031611611c275760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103ff565b611c37604085016020860161364e565b6001600160401b0316611c4d6202a30042613338565b11611cc05760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103ff565b8335611cde5760405162461bcd60e51b81526004016103ff906131ee565b83355f90815260098201602052604090205415611d0d5760405162461bcd60e51b81526004016103ff9061322f565b611d1a6040850185613667565b9050603014611d3b5760405162461bcd60e51b81526004016103ff90613277565b611d44836124f9565b5f80611dde6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611d89919061364e565b6001600160401b03168152602001611da460408a018a613667565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612504565b5f82815260078601602052604090209193509150611dfc82826136f4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e29908590600401612ffe565b6020604051808303815f875af1158015611e45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e699190613030565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611ee157611ee1612ef0565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611fc1918e01908e0161364e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f8051602061385a8339815191526020526040808220815160e0810190925280545f8051602061383a83398151915293929190829060ff16600581111561203c5761203c612ef0565b600581111561204d5761204d612ef0565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156120bf576120bf612ef0565b1461211b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103ff565b61212881608001516128b3565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561216c5761216c612ef0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6122218461221b816128bd565b5f611142565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612250908590600401612ffe565b6020604051808303815f875af115801561226c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122909190613030565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146123085760405162461bcd60e51b81526004016103ff9061357b565b5f805b60028110156123575761231f816001613470565b61232a906008613483565b61ffff1685828151811061234057612340613093565b016020015160f81c901b919091179060010161230b565b5061ffff81161561237a5760405162461bcd60e51b81526004016103ff906135c4565b5f805b60048110156123d557612391816003613470565b61239c906008613483565b63ffffffff16866123ae836002613338565b815181106123be576123be613093565b016020015160f81c901b919091179060010161237d565b5063ffffffff81166003146123fc5760405162461bcd60e51b81526004016103ff90613607565b5f805b60208110156124515761241381601f613470565b61241e906008613483565b8761242a836006613338565b8151811061243a5761243a613093565b016020015160f81c901b91909117906001016123ff565b505f8660268151811061246657612466613093565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d1c57604051631afcd79f60e31b815260040160405180910390fd5b6124d7612486565b6124df61294d565b610d4b81612955565b6124f0612486565b610d4b81612af7565b610d4b816001612aff565b5f606082608001515160301461256e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103ff565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156125e5576125a5816001613470565b6125b0906008613483565b5081515f908390839081106125c7576125c7613093565b60200101906001600160f81b03191690815f1a905350600101612591565b505f5b600481101561264d576125fc816003613470565b612607906008613483565b600160ff919091161c60f81b8261261f836002613338565b8151811061262f5761262f613093565b60200101906001600160f81b03191690815f1a9053506001016125e8565b505f5b60208110156126aa578451816020811061266c5761266c613093565b1a60f81b8261267c836006613338565b8151811061268c5761268c613093565b60200101906001600160f81b03191690815f1a905350600101612650565b505f5b602081101561270a57846020015181602081106126cc576126cc613093565b1a60f81b826126dc836026613338565b815181106126ec576126ec613093565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b600881101561277e57612721816007613470565b61272c906008613483565b60ff1685604001516001600160401b0316901c60f81b828260466127509190613338565b8151811061276057612760613093565b60200101906001600160f81b03191690815f1a90535060010161270d565b505f5b60308110156127e957846080015181815181106127a0576127a0613093565b01602001516001600160f81b031916826127bb83604e613338565b815181106127cb576127cb613093565b60200101906001600160f81b03191690815f1a905350600101612781565b505f5b600881101561285b57612800816007613470565b61280b906008613483565b60608601516001600160401b0390811691161c60f81b8261282d83607e613338565b8151811061283d5761283d613093565b60200101906001600160f81b03191690815f1a9053506001016127ec565b5060028160405161286c9190613313565b602060405180830381855afa158015612887573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128aa9190613030565b94909350915050565b610d4b815f612aff565b5f8181525f8051602061385a8339815191526020526040812060020180545f8051602061383a83398151915291600160401b9091046001600160401b0316906008612907836137b3565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b610d1c612486565b61295d612486565b80355f8051602061383a83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146129a960808401606085016137ce565b60ff161115612a165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103ff565b5f612a2760808401606085016137ce565b60ff1611612a8f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103ff565b612a9f60808301606084016137ce565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612ad0606083016040840161364e565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b611110612486565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061383a833981519152914291901580612be5575060028301548151612be1916001600160401b031690613338565b8210155b15612c0b576001600160401b038516606082015281815260408101516020820152612c2a565b8481606001818151612c1d91906137ee565b6001600160401b03169052505b6060810151612c3a90606461380e565b602082015160028501546001600160401b039290921691612c659190600160401b900460ff16613483565b1015612cc95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103ff565b8315612cf257846001600160401b031681604001818151612cea9190613338565b905250612d11565b846001600160401b031681604001818151612d0d9190613470565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b508054612d659061336d565b5f825580601f10612d74575050565b601f0160209004905f5260205f2090810190610d4b91905b80821115612d9f575f8155600101612d8c565b5090565b5f60208284031215612db3575f80fd5b5035919050565b803563ffffffff81168114612dcd575f80fd5b919050565b5f60208284031215612de2575f80fd5b610d3182612dba565b5f60808284031215612dfb575f80fd5b50919050565b6001600160a01b0381168114610d4b575f80fd5b5f8060a08385031215612e26575f80fd5b612e308484612deb565b91506080830135612e4081612e01565b809150509250929050565b5f8060408385031215612e5c575f80fd5b82356001600160401b03811115612e71575f80fd5b612e7d85828601612deb565b925050612e8c60208401612dba565b90509250929050565b80356001600160401b0381168114612dcd575f80fd5b5f8060408385031215612ebc575f80fd5b82356001600160401b03811115612ed1575f80fd5b830160608186031215612ee2575f80fd5b9150612e8c60208401612e95565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f2757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f6260608401826001600160401b03169052565b506080830151612f7d60808401826001600160401b03169052565b5060a0830151612f9860a08401826001600160401b03169052565b5060c0830151612fb360c08401826001600160401b03169052565b5092915050565b5f60208284031215612fca575f80fd5b8135612fd581612e01565b9392505050565b5f5b83811015612ff6578181015183820152602001612fde565b50505f910152565b602081525f825180602084015261301c816040850160208701612fdc565b601f01601f19169190910160400192915050565b5f60208284031215613040575f80fd5b5051919050565b5f808335601e1984360301811261305c575f80fd5b8301803591506001600160401b03821115613075575f80fd5b6020019150600581901b360382131561308c575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130bb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130fb576130fb6130c5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613129576131296130c5565b604052919050565b5f6001600160401b03821115613149576131496130c5565b50601f01601f191660200190565b5f60608236031215613167575f80fd5b61316f6130d9565b823581526020613180818501612e95565b8183015260408401356001600160401b0381111561319c575f80fd5b840136601f8201126131ac575f80fd5b80356131bf6131ba82613131565b613101565b81815236848385010111156131d2575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516132d5818460208a01612fdc565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613305816028840160208801612fdc565b016028019695505050505050565b5f82516130bb818460208701612fdc565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d3457610d34613324565b5f63ffffffff80831681810361336357613363613324565b6001019392505050565b600181811c9082168061338157607f821691505b602082108103612dfb57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546133f88161336d565b806020870152604060018084165f8114613419576001811461343557613462565b60ff19851660408a0152604084151560051b8a01019550613462565b895f5260205f205f5b858110156134595781548b820186015290830190880161343e565b8a016040019650505b509398975050505050505050565b81810381811115610d3457610d34613324565b8082028115828204841417610d3457610d34613324565b80518015158114612dcd575f80fd5b5f80604083850312156134ba575f80fd5b82516001600160401b03808211156134d0575f80fd5b90840190606082870312156134e3575f80fd5b6134eb6130d9565b825181526020808401516134fe81612e01565b82820152604084015183811115613513575f80fd5b80850194505087601f850112613527575f80fd5b835192506135376131ba84613131565b838152888285870101111561354a575f80fd5b61355984838301848801612fdc565b8060408401525081955061356e81880161349a565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561365e575f80fd5b610d3182612e95565b5f808335601e1984360301811261367c575f80fd5b8301803591506001600160401b03821115613695575f80fd5b60200191503681900382131561308c575f80fd5b601f82111561049857805f5260205f20601f840160051c810160208510156136ce5750805b601f840160051c820191505b818110156136ed575f81556001016136da565b5050505050565b81516001600160401b0381111561370d5761370d6130c5565b6137218161371b845461336d565b846136a9565b602080601f831160018114613754575f841561373d5750858301515b5f19600386901b1c1916600185901b1785556137ab565b5f85815260208120601f198616915b8281101561378257888601518255948401946001909101908401613763565b508582101561379f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b0380831681810361336357613363613324565b5f602082840312156137de575f80fd5b813560ff81168114612fd5575f80fd5b6001600160401b03818116838216019080821115612fb357612fb3613324565b6001600160401b0381811683821602808216919082811461383157613831613324565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index d3999179c..b4d11e6d1 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -462,7 +462,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "ValidatorManager: Invalid warp message"); + require(valid, "ValidatorManager: invalid warp message"); require( warpMessage.sourceChainID == $._pChainBlockchainID, "ValidatorManager: invalid source chain ID" diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index e469bb7ab..ff5e4647f 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -108,7 +108,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { proxyAddress, network, signatureAggregator, - 20, + utils.DefaultMinStakeAmount*10, ) // Register a validator @@ -197,16 +197,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { stakeAmount, ) - // Attempt to delist previous PoA validator with wrong owner and check that it fails - _, err = posValidatorManager.InitializeEndValidation( - opts, - poaValidationID, - false, - 0, - ) - Expect(err).ShouldNot(BeNil()) - - // Delist the previous PoA validator properly + // Delist the previous PoA validator utils.InitializeAndCompleteEndNativeValidation( network, signatureAggregator, diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 745a9664f..b56c7a2db 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -1596,7 +1596,6 @@ func PackInitialValidator(iv interface{}) ([]byte, error) { weight := v.FieldByName("Weight").Interface().(uint64) blsPublicKey := v.FieldByName("BlsPublicKey").Interface().([]byte) - // Placeholder: Replace this with the actual packing logic b := make([]byte, initialValidatorPackedLen) copy(b[0:32], nodeID[:]) binary.BigEndian.PutUint64(b[32:40], weight) From a247eebf72afb6cc71220609008c6c455b3129dc Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Tue, 17 Sep 2024 14:45:14 -0400 Subject: [PATCH 315/545] pre-increment fix --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- .../go/staking/PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/staking/ValidatorManager.sol | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 78f438eb6..201667a13 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615dac380380615dac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c5f8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806366435abf116100bf578063ba3a4b9711610079578063ba3a4b971461030a578063bee0a03f1461031d578063c974d1b614610330578063d5f20ff614610338578063df93d8de14610358578063eb0acb8914610362575f80fd5b806366435abf1461028557806376f786211461029857806398f3e2b4146102ab5780639e1bc4ef146102be578063a3a65e48146102d1578063b771b3bc146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c57806361e2f4901461025f5780636206585614610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614f4d565b610375565b005b61015f61016f366004614f88565b610806565b6101b2610182366004614f88565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614f88565b6109bf565b6040516001600160401b0390911681526020016101bc565b61015f610218366004614fb3565b6109d5565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614ff1565b610ab4565b61015f61025a36600461500a565b610b07565b61015f61026d366004615032565b610cdc565b6101b2610280366004615096565b611428565b6101f2610293366004614f88565b611441565b61015f6102a6366004614f4d565b611455565b61015f6102b936600461500a565b611536565b6101b26102cc3660046150af565b611763565b61015f6102df366004614ff1565b61178f565b6102f26005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610318366004614f88565b611947565b61015f61032b366004614f88565b611bcd565b6101cd601481565b61034b610346366004614f88565b611ce1565b6040516101bc91906150e3565b6101f26202a30081565b6101b26103703660046151aa565b611dd4565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615bb38339815191529184156103c7576103c48285611e09565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103f9576103f96150cf565b600481111561040a5761040a6150cf565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610491576104916150cf565b146104e35760405162461bcd60e51b815260206004820152602a60248201525f80516020615bd38339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105485760405162461bcd60e51b815260206004820152603360248201525f80516020615bd38339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104da565b5f610552846120a5565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561059f5761059f6150cf565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61067185611ce1565b905082606001516001600160401b031681608001516001600160401b0316116106e85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104da565b6002815160058111156106fd576106fd6150cf565b0361070f5761070f8360600151612135565b5f836060015182608001516107249190615223565b90506107308682612142565b5f6005600160991b0163ee5b48eb61074989878661218a565b6040518263ffffffff1660e01b81526004016107659190615265565b6020604051808303815f875af1158015610781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a59190615297565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020615c338339815191526020526040808220815160e0810190925280545f80516020615bf383398151915293929190829060ff166005811115610853576108536150cf565b6005811115610864576108646150cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108d3576108d36150cf565b146109385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb61095d8584606001515f61218a565b6040518263ffffffff1660e01b81526004016109799190615265565b6020604051808303815f875af1158015610995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b99190615297565b50505050565b5f6109cf64e8d4a51000836152ae565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a1e575080546001600160401b03808416911610155b15610a3c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6784846123b1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615bb38339815191525f80610acd846123cb565b6040808201515f8481526005880160205291909120549294509092506109b9916001600160401b03909116906001600160a01b0316612743565b5f80516020615bb38339815191525f610b1f84612779565b90505f80610b308360400151612953565b50915091505f610b3f83611ce1565b9050816001600160401b031681606001516001600160401b03161015610b775760405162461bcd60e51b81526004016104da906152cd565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bbc5760405162461bcd60e51b81526004016104da9061530f565b60015f87815260068701602052604090205460ff166004811115610be257610be26150cf565b14610c4b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bf38339815191529060ff1615610d795760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de09190615297565b836020013514610e425760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104da565b30610e536060850160408601615358565b6001600160a01b031614610ec55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104da565b5f610ed36060850185615373565b905011610f325760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104da565b5f610f406060850185615373565b91505063ffffffff8110610fac5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104da565b5f843560208601356014610fc66060890160408a01615358565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611338575f6110466060890189615373565b8363ffffffff1681811061105c5761105c6153bf565b905060200281019061106e91906153d3565b61107790615483565b8051909150806110995760405162461bcd60e51b81526004016104da9061551a565b5f818152600988016020526040902054156110c65760405162461bcd60e51b81526004016104da9061555b565b8160400151516030146110eb5760405162461bcd60e51b81526004016104da906155a3565b84825f01518360200151846040015160405160200161110d94939291906155f0565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161115b919061563f565b602060405180830381855afa158015611176573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111999190615297565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115611225576112256150cf565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112d8911686615650565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050808061133090615663565b91505061102a565b50600584018190555f61134a86612779565b90505f61135a8260400151612b8e565b90508060028560405161136d919061563f565b602060405180830381855afa158015611388573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113ab9190615297565b1461140f5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104da565b505050600a909201805460ff1916600117905550505050565b5f6109cf6001600160401b03831664e8d4a51000615685565b5f61144b82611ce1565b6080015192915050565b5f80516020615bb38339815191525f61146d85611ce1565b5f86815260058401602052604090205460a08201519192506114a091600160b01b9091046001600160401b03169061569c565b6001600160401b03164210156115145760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104da565b8315611526576115248584611e09565b505b61152f85612d00565b5050505050565b61153e612ff6565b5f80516020615bb38339815191525f61155684612779565b90505f806115678360400151612953565b50915091505f61157683611ce1565b9050816001600160401b031681606001516001600160401b031610156115ae5760405162461bcd60e51b81526004016104da906152cd565b5f8681526006860160205260409020600301546001600160401b03808416911611156115ec5760405162461bcd60e51b81526004016104da9061530f565b60035f87815260068701602052604090205460ff166004811115611612576116126150cf565b146116665760405162461bcd60e51b815260206004820152603160248201525f80516020615bd38339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261170b91612743565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061175f60015f80516020615c1383398151915255565b5050565b5f61176c612ff6565b611777833384613040565b90506109cf60015f80516020615c1383398151915255565b5f80516020615bf38339815191525f6117a783612779565b90505f806117b883604001516134b9565b915091508061181a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104da565b5f82815260078501602052604081208054611834906156bc565b9050118015611866575060015f83815260088601602052604090205460ff166005811115611864576118646150cf565b145b6118825760405162461bcd60e51b81526004016104da906156f4565b5f828152600785016020526040812061189a91614ede565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bb383398151915293929190829060ff1660048111156119a8576119a86150cf565b60048111156119b9576119b96150cf565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a4057611a406150cf565b1480611a5e5750600381516004811115611a5c57611a5c6150cf565b145b611ab25760405162461bcd60e51b815260206004820152603260248201525f80516020615bd3833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104da565b5f611ac08260400151611ce1565b905080606001516001600160401b03165f03611b445760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb611b7184604001518460600151856080015161218a565b6040518263ffffffff1660e01b8152600401611b8d9190615265565b6020604051808303815f875af1158015611ba9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152f9190615297565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bf3833981519152929190611c15906156bc565b9050118015611c47575060015f83815260088301602052604090205460ff166005811115611c4557611c456150cf565b145b611c635760405162461bcd60e51b81526004016104da906156f4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c9c919060040161573b565b6020604051808303815f875af1158015611cb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cdc9190615297565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020615c3383398151915290528390208351918201909352825491925f80516020615bf383398151915292829060ff166005811115611d6157611d616150cf565b6005811115611d7257611d726150cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611ddd612ff6565b611de98585858561365a565b9050611e0160015f80516020615c1383398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e54573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e7b91908101906157d0565b9150915080611ede5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f459190615297565b825114611fa95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104da565b60208201516001600160a01b03161561201f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104da565b5f8061202e84604001516138cf565b9150915081871461209b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104da565b9695505050505050565b5f8181525f80516020615c338339815191526020526040812060020180545f80516020615bf383398151915291600160401b9091046001600160401b03169060086120ef836158a2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b61213f815f613aa7565b50565b5f9182525f80516020615c33833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612203576121c38160016158bd565b6121ce906008615685565b5081515f908390839081106121e5576121e56153bf565b60200101906001600160f81b03191690815f1a9053506001016121af565b505f5b600481101561226e5761221a8160036158bd565b612225906008615685565b600263ffffffff16901c60f81b828260026122409190615650565b81518110612250576122506153bf565b60200101906001600160f81b03191690815f1a905350600101612206565b505f5b60208110156122d05761228581601f6158bd565b612290906008615685565b86901c60f81b826122a2836006615650565b815181106122b2576122b26153bf565b60200101906001600160f81b03191690815f1a905350600101612271565b505f5b600881101561233b576122e78160076158bd565b6122f2906008615685565b6001600160401b038616901c60f81b8261230d836026615650565b8151811061231d5761231d6153bf565b60200101906001600160f81b03191690815f1a9053506001016122d3565b505f5b60088110156123a6576123528160076158bd565b61235d906008615685565b6001600160401b038516901c60f81b8261237883602e615650565b81518110612388576123886153bf565b60200101906001600160f81b03191690815f1a90535060010161233e565b5090505b9392505050565b6123b9613d01565b6123c282613d4c565b61175f81613dc0565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f80516020615bf38339815191525f61241a85612779565b90505f8061242b83604001516134b9565b9150915080156124905760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104da565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156124c1576124c16150cf565b60058111156124d2576124d26150cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612543576125436150cf565b1480612561575060018251600581111561255f5761255f6150cf565b145b6125c05760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104da565b6003825160058111156125d5576125d56150cf565b036125e2575060046125e6565b5060055b6020808301515f9081526009880190915260408120558181600581111561260f5761260f6150cf565b90816005811115612622576126226150cf565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612656576126566150cf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561270a5761270a6150cf565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461175f906001600160a01b03168284613e74565b60408051606080820183525f8083526020830181905292820152905f80516020615bf38339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156127ee573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261281591908101906157d0565b91509150806128755760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104da565b82548251146128d85760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104da565b60208201516001600160a01b03161561294b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104da565b509392505050565b5f805f83516036146129775760405162461bcd60e51b81526004016104da906158d0565b5f805b60028110156129c65761298e8160016158bd565b612999906008615685565b61ffff168682815181106129af576129af6153bf565b016020015160f81c901b919091179060010161297a565b5061ffff8116156129e95760405162461bcd60e51b81526004016104da90615919565b5f805b6004811015612a4457612a008160036158bd565b612a0b906008615685565b63ffffffff1687612a1d836002615650565b81518110612a2d57612a2d6153bf565b016020015160f81c901b91909117906001016129ec565b5063ffffffff8116600414612a6b5760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015612ac057612a8281601f6158bd565b612a8d906008615685565b88612a99836006615650565b81518110612aa957612aa96153bf565b016020015160f81c901b9190911790600101612a6e565b505f805b6008811015612b1f57612ad88160076158bd565b612ae3906008615685565b6001600160401b031689612af8836026615650565b81518110612b0857612b086153bf565b016020015160f81c901b9190911790600101612ac4565b505f805b6008811015612b7e57612b378160076158bd565b612b42906008615685565b6001600160401b03168a612b5783602e615650565b81518110612b6757612b676153bf565b016020015160f81c901b9190911790600101612b23565b5091989097509095509350505050565b5f8151602614612bb05760405162461bcd60e51b81526004016104da906158d0565b5f805b6002811015612bff57612bc78160016158bd565b612bd2906008615685565b61ffff16848281518110612be857612be86153bf565b016020015160f81c901b9190911790600101612bb3565b5061ffff811615612c225760405162461bcd60e51b81526004016104da90615919565b5f805b6004811015612c7d57612c398160036158bd565b612c44906008615685565b63ffffffff1685612c56836002615650565b81518110612c6657612c666153bf565b016020015160f81c901b9190911790600101612c25565b5063ffffffff811615612ca25760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015612cf757612cb981601f6158bd565b612cc4906008615685565b86612cd0836006615650565b81518110612ce057612ce06153bf565b016020015160f81c901b9190911790600101612ca5565b50949350505050565b5f8181525f80516020615c338339815191526020526040808220815160e0810190925280545f80516020615bf383398151915293929190829060ff166005811115612d4d57612d4d6150cf565b6005811115612d5e57612d5e6150cf565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612dd057612dd06150cf565b14612e2c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104da565b612e398160800151612135565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff19166001836005811115612e7d57612e7d6150cf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612f3284612f2c816120a5565b5f61218a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612f61908590600401615265565b6020604051808303815f875af1158015612f7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fa19190615297565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615c1383398151915280546001190161302757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615c1383398151915255565b5f5f80516020615bb38339815191528161305c6101ed85613ed3565b90505f61306887611ce1565b905060028151600581111561307f5761307f6150cf565b146130de5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166131715760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104da565b61317a82613f09565b5f82826080015161318b919061569c565b600485015460408401519192506131ad916001600160401b03909116906159a3565b6001600160401b0316816001600160401b0316111561322c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104da565b6132368882612142565b5f613240896120a5565b90505f898260405160200161326c92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6132a68d868861218a565b6040518263ffffffff1660e01b81526004016132c29190615265565b6020604051808303815f875af11580156132de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133029190615297565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561338a5761338a6150cf565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134dc5760405162461bcd60e51b81526004016104da906158d0565b5f805b600281101561352b576134f38160016158bd565b6134fe906008615685565b61ffff16858281518110613514576135146153bf565b016020015160f81c901b91909117906001016134df565b5061ffff81161561354e5760405162461bcd60e51b81526004016104da90615919565b5f805b60048110156135a9576135658160036158bd565b613570906008615685565b63ffffffff1686613582836002615650565b81518110613592576135926153bf565b016020015160f81c901b9190911790600101613551565b5063ffffffff81166003146135d05760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015613625576135e781601f6158bd565b6135f2906008615685565b876135fe836006615650565b8151811061360e5761360e6153bf565b016020015160f81c901b91909117906001016135d3565b505f8660268151811061363a5761363a6153bf565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bb38339815191529061ffff8616108015906136a6575061271061ffff861611155b6136c25760405162461bcd60e51b81526004016104da906159ce565b60028101546001600160401b03908116908516101561373b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104da565b805483101561379e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104da565b80600101548311156138055760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104da565b5f61380f84613ed3565b90505f61381b826109bf565b90505f6138288983613f14565b9050604051806060016040528061383c3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146138f25760405162461bcd60e51b81526004016104da906158d0565b5f805b6002811015613941576139098160016158bd565b613914906008615685565b61ffff1685828151811061392a5761392a6153bf565b016020015160f81c901b91909117906001016138f5565b5061ffff8116156139645760405162461bcd60e51b81526004016104da90615919565b5f805b60048110156139bf5761397b8160036158bd565b613986906008615685565b63ffffffff1686613998836002615650565b815181106139a8576139a86153bf565b016020015160f81c901b9190911790600101613967565b5063ffffffff81166005146139e65760405162461bcd60e51b81526004016104da9061595c565b5f805b6020811015613a3b576139fd81601f6158bd565b613a08906008615685565b87613a14836006615650565b81518110613a2457613a246153bf565b016020015160f81c901b91909117906001016139e9565b505f805b6008811015613a9a57613a538160076158bd565b613a5e906008615685565b6001600160401b031688613a73836026615650565b81518110613a8357613a836153bf565b016020015160f81c901b9190911790600101613a3f565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615bf3833981519152914291901580613b8d575060028301548151613b89916001600160401b031690615650565b8210155b15613bb3576001600160401b038516606082015281815260408101516020820152613bd2565b8481606001818151613bc5919061569c565b6001600160401b03169052505b6060810151613be29060646159a3565b602082015160028501546001600160401b039290921691613c0d9190600160401b900460ff16615685565b1015613c715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104da565b8315613c9a57846001600160401b031681604001818151613c929190615650565b905250613cb9565b846001600160401b031681604001818151613cb591906158bd565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d4a57604051631afcd79f60e31b815260040160405180910390fd5b565b613d54613d01565b613d5d816143f8565b613d65614411565b61213f608082013560a0830135613d8260e0850160c08601615096565b613d93610100860160e08701615a19565b61ffff16613da961012087016101008801615a32565b613dbb61014088016101208901615358565b614421565b613dc8613d01565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613e545760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611cdc91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614665565b5f6109cf827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906146c6565b61213f816001613aa7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613f9f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104da565b5f80516020615bf383398151915242613fbe6040860160208701615096565b6001600160401b0316116140305760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104da565b6140406040850160208601615096565b6001600160401b03166140566202a30042615650565b116140c95760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104da565b83356140e75760405162461bcd60e51b81526004016104da9061551a565b83355f908152600982016020526040902054156141165760405162461bcd60e51b81526004016104da9061555b565b6141236040850185615a52565b90506030146141445760405162461bcd60e51b81526004016104da906155a3565b61414d83613f09565b5f806141e76040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906141929190615096565b6001600160401b031681526020016141ad60408a018a615a52565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614828565b5f828152600786016020526040902091935091506142058282615ad8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614232908590600401615265565b6020604051808303815f875af115801561424e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142729190615297565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156142ea576142ea6150cf565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916143ca918e01908e01615096565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614400613d01565b614408614bd7565b61213f81614bdf565b614419613d01565b613d4a614d81565b614429613d01565b5f80516020615bb3833981519152836144955760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104da565b6127108411156144b75760405162461bcd60e51b81526004016104da906159ce565b8587111561451f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104da565b5f8360ff161161458c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104da565b600a60ff841611156145fe5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104da565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6146796001600160a01b03841683614d89565b905080515f1415801561469d57508080602001905181019061469b9190615b97565b155b15611cdc57604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561470c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147309190615297565b90506147476001600160a01b038516333086614d96565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561478b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147af9190615297565b90508181116148155760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b61481f82826158bd565b95945050505050565b5f60608260800151516030146148925760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104da565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614909576148c98160016158bd565b6148d4906008615685565b5081515f908390839081106148eb576148eb6153bf565b60200101906001600160f81b03191690815f1a9053506001016148b5565b505f5b6004811015614971576149208160036158bd565b61492b906008615685565b600160ff919091161c60f81b82614943836002615650565b81518110614953576149536153bf565b60200101906001600160f81b03191690815f1a90535060010161490c565b505f5b60208110156149ce5784518160208110614990576149906153bf565b1a60f81b826149a0836006615650565b815181106149b0576149b06153bf565b60200101906001600160f81b03191690815f1a905350600101614974565b505f5b6020811015614a2e57846020015181602081106149f0576149f06153bf565b1a60f81b82614a00836026615650565b81518110614a1057614a106153bf565b60200101906001600160f81b03191690815f1a9053506001016149d1565b505f5b6008811015614aa257614a458160076158bd565b614a50906008615685565b60ff1685604001516001600160401b0316901c60f81b82826046614a749190615650565b81518110614a8457614a846153bf565b60200101906001600160f81b03191690815f1a905350600101614a31565b505f5b6030811015614b0d5784608001518181518110614ac457614ac46153bf565b01602001516001600160f81b03191682614adf83604e615650565b81518110614aef57614aef6153bf565b60200101906001600160f81b03191690815f1a905350600101614aa5565b505f5b6008811015614b7f57614b248160076158bd565b614b2f906008615685565b60608601516001600160401b0390811691161c60f81b82614b5183607e615650565b81518110614b6157614b616153bf565b60200101906001600160f81b03191690815f1a905350600101614b10565b50600281604051614b90919061563f565b602060405180830381855afa158015614bab573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bce9190615297565b94909350915050565b613d4a613d01565b614be7613d01565b80355f80516020615bf383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c336080840160608501615a32565b60ff161115614ca05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104da565b5f614cb16080840160608501615a32565b60ff1611614d195760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104da565b614d296080830160608401615a32565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d5a6060830160408401615096565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61302d613d01565b60606123aa83835f614dcf565b6040516001600160a01b0384811660248301528381166044830152606482018390526109b99186918216906323b872dd90608401613ea1565b606081471015614df45760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614e0f919061563f565b5f6040518083038185875af1925050503d805f8114614e49576040519150601f19603f3d011682016040523d82523d5f602084013e614e4e565b606091505b509150915061209b868383606082614e6e57614e6982614eb5565b6123aa565b8151158015614e8557506001600160a01b0384163b155b15614eae57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b50806123aa565b805115614ec55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614eea906156bc565b5f825580601f10614ef9575050565b601f0160209004905f5260205f209081019061213f91905b80821115614f24575f8155600101614f11565b5090565b801515811461213f575f80fd5b803563ffffffff81168114614f48575f80fd5b919050565b5f805f60608486031215614f5f575f80fd5b833592506020840135614f7181614f28565b9150614f7f60408501614f35565b90509250925092565b5f60208284031215614f98575f80fd5b5035919050565b6001600160a01b038116811461213f575f80fd5b5f80828403610160811215614fc6575f80fd5b61014080821215614fd5575f80fd5b8493508301359050614fe681614f9f565b809150509250929050565b5f60208284031215615001575f80fd5b6123aa82614f35565b5f806040838503121561501b575f80fd5b61502483614f35565b946020939093013593505050565b5f8060408385031215615043575f80fd5b82356001600160401b03811115615058575f80fd5b830160808186031215615069575f80fd5b915061507760208401614f35565b90509250929050565b80356001600160401b0381168114614f48575f80fd5b5f602082840312156150a6575f80fd5b6123aa82615080565b5f80604083850312156150c0575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061510657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161514160608401826001600160401b03169052565b50608083015161515c60808401826001600160401b03169052565b5060a083015161517760a08401826001600160401b03169052565b5060c083015161519260c08401826001600160401b03169052565b5092915050565b803561ffff81168114614f48575f80fd5b5f805f80608085870312156151bd575f80fd5b84356001600160401b038111156151d2575f80fd5b8501606081880312156151e3575f80fd5b93506151f160208601615199565b92506151ff60408601615080565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156151925761519261520f565b5f5b8381101561525d578181015183820152602001615245565b50505f910152565b602081525f8251806020840152615283816040850160208701615243565b601f01601f19169190910160400192915050565b5f602082840312156152a7575f80fd5b5051919050565b5f826152c857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615368575f80fd5b81356123aa81614f9f565b5f808335601e19843603018112615388575f80fd5b8301803591506001600160401b038211156153a1575f80fd5b6020019150600581901b36038213156153b8575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126153e7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615427576154276153f1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615455576154556153f1565b604052919050565b5f6001600160401b03821115615475576154756153f1565b50601f01601f191660200190565b5f60608236031215615493575f80fd5b61549b615405565b8235815260206154ac818501615080565b8183015260408401356001600160401b038111156154c8575f80fd5b840136601f8201126154d8575f80fd5b80356154eb6154e68261545d565b61542d565b81815236848385010111156154fe575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615601818460208a01615243565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615631816028840160208801615243565b016028019695505050505050565b5f82516153e7818460208701615243565b808201808211156109cf576109cf61520f565b5f63ffffffff80831681810361567b5761567b61520f565b6001019392505050565b80820281158282048414176109cf576109cf61520f565b6001600160401b038181168382160190808211156151925761519261520f565b600181811c908216806156d057607f821691505b6020821081036156ee57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461574d816156bc565b806020870152604060018084165f811461576e576001811461578a576157b7565b60ff19851660408a0152604084151560051b8a010195506157b7565b895f5260205f205f5b858110156157ae5781548b8201860152908301908801615793565b8a016040019650505b509398975050505050505050565b8051614f4881614f28565b5f80604083850312156157e1575f80fd5b82516001600160401b03808211156157f7575f80fd5b908401906060828703121561580a575f80fd5b615812615405565b8251815260208084015161582581614f9f565b8282015260408401518381111561583a575f80fd5b80850194505087601f85011261584e575f80fd5b8351925061585e6154e68461545d565b8381528882858701011115615871575f80fd5b61588084838301848801615243565b806040840152508195506158958188016157c5565b9450505050509250929050565b5f6001600160401b0380831681810361567b5761567b61520f565b818103818111156109cf576109cf61520f565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159c6576159c661520f565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f60208284031215615a29575f80fd5b6123aa82615199565b5f60208284031215615a42575f80fd5b813560ff811681146123aa575f80fd5b5f808335601e19843603018112615a67575f80fd5b8301803591506001600160401b03821115615a80575f80fd5b6020019150368190038213156153b8575f80fd5b601f821115611cdc57805f5260205f20601f840160051c81016020851015615ab95750805b601f840160051c820191505b8181101561152f575f8155600101615ac5565b81516001600160401b03811115615af157615af16153f1565b615b0581615aff84546156bc565b84615a94565b602080601f831160018114615b38575f8415615b215750858301515b5f19600386901b1c1916600185901b178555615b8f565b5f85815260208120601f198616915b82811015615b6657888601518255948401946001909101908401615b47565b5085821015615b8357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ba7575f80fd5b81516123aa81614f2856fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615daa380380615daa83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c5d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806366435abf116100bf578063ba3a4b9711610079578063ba3a4b971461030a578063bee0a03f1461031d578063c974d1b614610330578063d5f20ff614610338578063df93d8de14610358578063eb0acb8914610362575f80fd5b806366435abf1461028557806376f786211461029857806398f3e2b4146102ab5780639e1bc4ef146102be578063a3a65e48146102d1578063b771b3bc146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c57806361e2f4901461025f5780636206585614610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614f4b565b610375565b005b61015f61016f366004614f86565b610806565b6101b2610182366004614f86565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614f86565b6109bf565b6040516001600160401b0390911681526020016101bc565b61015f610218366004614fb1565b6109d5565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614fef565b610ab4565b61015f61025a366004615008565b610b07565b61015f61026d366004615030565b610cdc565b6101b2610280366004615094565b611426565b6101f2610293366004614f86565b61143f565b61015f6102a6366004614f4b565b611453565b61015f6102b9366004615008565b611534565b6101b26102cc3660046150ad565b611761565b61015f6102df366004614fef565b61178d565b6102f26005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610318366004614f86565b611945565b61015f61032b366004614f86565b611bcb565b6101cd601481565b61034b610346366004614f86565b611cdf565b6040516101bc91906150e1565b6101f26202a30081565b6101b26103703660046151a8565b611dd2565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615bb18339815191529184156103c7576103c48285611e07565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103f9576103f96150cd565b600481111561040a5761040a6150cd565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610491576104916150cd565b146104e35760405162461bcd60e51b815260206004820152602a60248201525f80516020615bd18339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105485760405162461bcd60e51b815260206004820152603360248201525f80516020615bd18339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104da565b5f610552846120a3565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561059f5761059f6150cd565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61067185611cdf565b905082606001516001600160401b031681608001516001600160401b0316116106e85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104da565b6002815160058111156106fd576106fd6150cd565b0361070f5761070f8360600151612133565b5f836060015182608001516107249190615221565b90506107308682612140565b5f6005600160991b0163ee5b48eb610749898786612188565b6040518263ffffffff1660e01b81526004016107659190615263565b6020604051808303815f875af1158015610781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a59190615295565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020615c318339815191526020526040808220815160e0810190925280545f80516020615bf183398151915293929190829060ff166005811115610853576108536150cd565b6005811115610864576108646150cd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108d3576108d36150cd565b146109385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb61095d8584606001515f612188565b6040518263ffffffff1660e01b81526004016109799190615263565b6020604051808303815f875af1158015610995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b99190615295565b50505050565b5f6109cf64e8d4a51000836152ac565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a1e575080546001600160401b03808416911610155b15610a3c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6784846123af565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615bb18339815191525f80610acd846123c9565b6040808201515f8481526005880160205291909120549294509092506109b9916001600160401b03909116906001600160a01b0316612741565b5f80516020615bb18339815191525f610b1f84612777565b90505f80610b308360400151612951565b50915091505f610b3f83611cdf565b9050816001600160401b031681606001516001600160401b03161015610b775760405162461bcd60e51b81526004016104da906152cb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bbc5760405162461bcd60e51b81526004016104da9061530d565b60015f87815260068701602052604090205460ff166004811115610be257610be26150cd565b14610c4b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bf18339815191529060ff1615610d795760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de09190615295565b836020013514610e425760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104da565b30610e536060850160408601615356565b6001600160a01b031614610ec55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104da565b5f610ed36060850185615371565b905011610f325760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104da565b5f610f406060850185615371565b91505063ffffffff8110610fac5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104da565b5f843560208601356014610fc66060890160408a01615356565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611336575f6110466060890189615371565b8363ffffffff1681811061105c5761105c6153bd565b905060200281019061106e91906153d1565b61107790615481565b8051909150806110995760405162461bcd60e51b81526004016104da90615518565b5f818152600988016020526040902054156110c65760405162461bcd60e51b81526004016104da90615559565b8160400151516030146110eb5760405162461bcd60e51b81526004016104da906155a1565b84825f01518360200151846040015160405160200161110d94939291906155ee565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161115b919061563d565b602060405180830381855afa158015611176573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111999190615295565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115611225576112256150cd565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112d891168661564e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061132f90615661565b905061102a565b50600584018190555f61134886612777565b90505f6113588260400151612b8c565b90508060028560405161136b919061563d565b602060405180830381855afa158015611386573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113a99190615295565b1461140d5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104da565b505050600a909201805460ff1916600117905550505050565b5f6109cf6001600160401b03831664e8d4a51000615683565b5f61144982611cdf565b6080015192915050565b5f80516020615bb18339815191525f61146b85611cdf565b5f86815260058401602052604090205460a082015191925061149e91600160b01b9091046001600160401b03169061569a565b6001600160401b03164210156115125760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104da565b8315611524576115228584611e07565b505b61152d85612cfe565b5050505050565b61153c612ff4565b5f80516020615bb18339815191525f61155484612777565b90505f806115658360400151612951565b50915091505f61157483611cdf565b9050816001600160401b031681606001516001600160401b031610156115ac5760405162461bcd60e51b81526004016104da906152cb565b5f8681526006860160205260409020600301546001600160401b03808416911611156115ea5760405162461bcd60e51b81526004016104da9061530d565b60035f87815260068701602052604090205460ff166004811115611610576116106150cd565b146116645760405162461bcd60e51b815260206004820152603160248201525f80516020615bd18339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261170991612741565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061175d60015f80516020615c1183398151915255565b5050565b5f61176a612ff4565b61177583338461303e565b90506109cf60015f80516020615c1183398151915255565b5f80516020615bf18339815191525f6117a583612777565b90505f806117b683604001516134b7565b91509150806118185760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104da565b5f82815260078501602052604081208054611832906156ba565b9050118015611864575060015f83815260088601602052604090205460ff166005811115611862576118626150cd565b145b6118805760405162461bcd60e51b81526004016104da906156f2565b5f828152600785016020526040812061189891614edc565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bb183398151915293929190829060ff1660048111156119a6576119a66150cd565b60048111156119b7576119b76150cd565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a3e57611a3e6150cd565b1480611a5c5750600381516004811115611a5a57611a5a6150cd565b145b611ab05760405162461bcd60e51b815260206004820152603260248201525f80516020615bd1833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104da565b5f611abe8260400151611cdf565b905080606001516001600160401b03165f03611b425760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb611b6f846040015184606001518560800151612188565b6040518263ffffffff1660e01b8152600401611b8b9190615263565b6020604051808303815f875af1158015611ba7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152d9190615295565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bf1833981519152929190611c13906156ba565b9050118015611c45575060015f83815260088301602052604090205460ff166005811115611c4357611c436150cd565b145b611c615760405162461bcd60e51b81526004016104da906156f2565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c9a9190600401615739565b6020604051808303815f875af1158015611cb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cda9190615295565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020615c3183398151915290528390208351918201909352825491925f80516020615bf183398151915292829060ff166005811115611d5f57611d5f6150cd565b6005811115611d7057611d706150cd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611ddb612ff4565b611de785858585613658565b9050611dff60015f80516020615c1183398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e52573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e7991908101906157ce565b9150915080611edc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f439190615295565b825114611fa75760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104da565b60208201516001600160a01b03161561201d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104da565b5f8061202c84604001516138cd565b915091508187146120995760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104da565b9695505050505050565b5f8181525f80516020615c318339815191526020526040812060020180545f80516020615bf183398151915291600160401b9091046001600160401b03169060086120ed836158a0565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b61213d815f613aa5565b50565b5f9182525f80516020615c31833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612201576121c18160016158bb565b6121cc906008615683565b5081515f908390839081106121e3576121e36153bd565b60200101906001600160f81b03191690815f1a9053506001016121ad565b505f5b600481101561226c576122188160036158bb565b612223906008615683565b600263ffffffff16901c60f81b8282600261223e919061564e565b8151811061224e5761224e6153bd565b60200101906001600160f81b03191690815f1a905350600101612204565b505f5b60208110156122ce5761228381601f6158bb565b61228e906008615683565b86901c60f81b826122a083600661564e565b815181106122b0576122b06153bd565b60200101906001600160f81b03191690815f1a90535060010161226f565b505f5b6008811015612339576122e58160076158bb565b6122f0906008615683565b6001600160401b038616901c60f81b8261230b83602661564e565b8151811061231b5761231b6153bd565b60200101906001600160f81b03191690815f1a9053506001016122d1565b505f5b60088110156123a4576123508160076158bb565b61235b906008615683565b6001600160401b038516901c60f81b8261237683602e61564e565b81518110612386576123866153bd565b60200101906001600160f81b03191690815f1a90535060010161233c565b5090505b9392505050565b6123b7613cff565b6123c082613d4a565b61175d81613dbe565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f80516020615bf18339815191525f61241885612777565b90505f8061242983604001516134b7565b91509150801561248e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104da565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156124bf576124bf6150cd565b60058111156124d0576124d06150cd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612541576125416150cd565b148061255f575060018251600581111561255d5761255d6150cd565b145b6125be5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104da565b6003825160058111156125d3576125d36150cd565b036125e0575060046125e4565b5060055b6020808301515f9081526009880190915260408120558181600581111561260d5761260d6150cd565b90816005811115612620576126206150cd565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612654576126546150cd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612708576127086150cd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461175d906001600160a01b03168284613e72565b60408051606080820183525f8083526020830181905292820152905f80516020615bf18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156127ec573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261281391908101906157ce565b91509150806128735760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104da565b82548251146128d65760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104da565b60208201516001600160a01b0316156129495760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104da565b509392505050565b5f805f83516036146129755760405162461bcd60e51b81526004016104da906158ce565b5f805b60028110156129c45761298c8160016158bb565b612997906008615683565b61ffff168682815181106129ad576129ad6153bd565b016020015160f81c901b9190911790600101612978565b5061ffff8116156129e75760405162461bcd60e51b81526004016104da90615917565b5f805b6004811015612a42576129fe8160036158bb565b612a09906008615683565b63ffffffff1687612a1b83600261564e565b81518110612a2b57612a2b6153bd565b016020015160f81c901b91909117906001016129ea565b5063ffffffff8116600414612a695760405162461bcd60e51b81526004016104da9061595a565b5f805b6020811015612abe57612a8081601f6158bb565b612a8b906008615683565b88612a9783600661564e565b81518110612aa757612aa76153bd565b016020015160f81c901b9190911790600101612a6c565b505f805b6008811015612b1d57612ad68160076158bb565b612ae1906008615683565b6001600160401b031689612af683602661564e565b81518110612b0657612b066153bd565b016020015160f81c901b9190911790600101612ac2565b505f805b6008811015612b7c57612b358160076158bb565b612b40906008615683565b6001600160401b03168a612b5583602e61564e565b81518110612b6557612b656153bd565b016020015160f81c901b9190911790600101612b21565b5091989097509095509350505050565b5f8151602614612bae5760405162461bcd60e51b81526004016104da906158ce565b5f805b6002811015612bfd57612bc58160016158bb565b612bd0906008615683565b61ffff16848281518110612be657612be66153bd565b016020015160f81c901b9190911790600101612bb1565b5061ffff811615612c205760405162461bcd60e51b81526004016104da90615917565b5f805b6004811015612c7b57612c378160036158bb565b612c42906008615683565b63ffffffff1685612c5483600261564e565b81518110612c6457612c646153bd565b016020015160f81c901b9190911790600101612c23565b5063ffffffff811615612ca05760405162461bcd60e51b81526004016104da9061595a565b5f805b6020811015612cf557612cb781601f6158bb565b612cc2906008615683565b86612cce83600661564e565b81518110612cde57612cde6153bd565b016020015160f81c901b9190911790600101612ca3565b50949350505050565b5f8181525f80516020615c318339815191526020526040808220815160e0810190925280545f80516020615bf183398151915293929190829060ff166005811115612d4b57612d4b6150cd565b6005811115612d5c57612d5c6150cd565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612dce57612dce6150cd565b14612e2a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104da565b612e378160800151612133565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff19166001836005811115612e7b57612e7b6150cd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612f3084612f2a816120a3565b5f612188565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612f5f908590600401615263565b6020604051808303815f875af1158015612f7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f9f9190615295565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615c1183398151915280546001190161302557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615c1183398151915255565b5f5f80516020615bb18339815191528161305a6101ed85613ed1565b90505f61306687611cdf565b905060028151600581111561307d5761307d6150cd565b146130dc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b031661316f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104da565b61317882613f07565b5f828260800151613189919061569a565b600485015460408401519192506131ab916001600160401b03909116906159a1565b6001600160401b0316816001600160401b0316111561322a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104da565b6132348882612140565b5f61323e896120a3565b90505f898260405160200161326a92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6132a48d8688612188565b6040518263ffffffff1660e01b81526004016132c09190615263565b6020604051808303815f875af11580156132dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133009190615295565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613388576133886150cd565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134da5760405162461bcd60e51b81526004016104da906158ce565b5f805b6002811015613529576134f18160016158bb565b6134fc906008615683565b61ffff16858281518110613512576135126153bd565b016020015160f81c901b91909117906001016134dd565b5061ffff81161561354c5760405162461bcd60e51b81526004016104da90615917565b5f805b60048110156135a7576135638160036158bb565b61356e906008615683565b63ffffffff168661358083600261564e565b81518110613590576135906153bd565b016020015160f81c901b919091179060010161354f565b5063ffffffff81166003146135ce5760405162461bcd60e51b81526004016104da9061595a565b5f805b6020811015613623576135e581601f6158bb565b6135f0906008615683565b876135fc83600661564e565b8151811061360c5761360c6153bd565b016020015160f81c901b91909117906001016135d1565b505f86602681518110613638576136386153bd565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bb18339815191529061ffff8616108015906136a4575061271061ffff861611155b6136c05760405162461bcd60e51b81526004016104da906159cc565b60028101546001600160401b0390811690851610156137395760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104da565b805483101561379c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104da565b80600101548311156138035760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104da565b5f61380d84613ed1565b90505f613819826109bf565b90505f6138268983613f12565b9050604051806060016040528061383a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146138f05760405162461bcd60e51b81526004016104da906158ce565b5f805b600281101561393f576139078160016158bb565b613912906008615683565b61ffff16858281518110613928576139286153bd565b016020015160f81c901b91909117906001016138f3565b5061ffff8116156139625760405162461bcd60e51b81526004016104da90615917565b5f805b60048110156139bd576139798160036158bb565b613984906008615683565b63ffffffff168661399683600261564e565b815181106139a6576139a66153bd565b016020015160f81c901b9190911790600101613965565b5063ffffffff81166005146139e45760405162461bcd60e51b81526004016104da9061595a565b5f805b6020811015613a39576139fb81601f6158bb565b613a06906008615683565b87613a1283600661564e565b81518110613a2257613a226153bd565b016020015160f81c901b91909117906001016139e7565b505f805b6008811015613a9857613a518160076158bb565b613a5c906008615683565b6001600160401b031688613a7183602661564e565b81518110613a8157613a816153bd565b016020015160f81c901b9190911790600101613a3d565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615bf1833981519152914291901580613b8b575060028301548151613b87916001600160401b03169061564e565b8210155b15613bb1576001600160401b038516606082015281815260408101516020820152613bd0565b8481606001818151613bc3919061569a565b6001600160401b03169052505b6060810151613be09060646159a1565b602082015160028501546001600160401b039290921691613c0b9190600160401b900460ff16615683565b1015613c6f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104da565b8315613c9857846001600160401b031681604001818151613c90919061564e565b905250613cb7565b846001600160401b031681604001818151613cb391906158bb565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d4857604051631afcd79f60e31b815260040160405180910390fd5b565b613d52613cff565b613d5b816143f6565b613d6361440f565b61213d608082013560a0830135613d8060e0850160c08601615094565b613d91610100860160e08701615a17565b61ffff16613da761012087016101008801615a30565b613db961014088016101208901615356565b61441f565b613dc6613cff565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613e525760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611cda91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614663565b5f6109cf827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906146c4565b61213d816001613aa5565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613f9d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104da565b5f80516020615bf183398151915242613fbc6040860160208701615094565b6001600160401b03161161402e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104da565b61403e6040850160208601615094565b6001600160401b03166140546202a3004261564e565b116140c75760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104da565b83356140e55760405162461bcd60e51b81526004016104da90615518565b83355f908152600982016020526040902054156141145760405162461bcd60e51b81526004016104da90615559565b6141216040850185615a50565b90506030146141425760405162461bcd60e51b81526004016104da906155a1565b61414b83613f07565b5f806141e56040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906141909190615094565b6001600160401b031681526020016141ab60408a018a615a50565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614826565b5f828152600786016020526040902091935091506142038282615ad6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614230908590600401615263565b6020604051808303815f875af115801561424c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142709190615295565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156142e8576142e86150cd565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916143c8918e01908e01615094565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6143fe613cff565b614406614bd5565b61213d81614bdd565b614417613cff565b613d48614d7f565b614427613cff565b5f80516020615bb1833981519152836144935760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104da565b6127108411156144b55760405162461bcd60e51b81526004016104da906159cc565b8587111561451d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104da565b5f8360ff161161458a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104da565b600a60ff841611156145fc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104da565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6146776001600160a01b03841683614d87565b905080515f1415801561469b5750808060200190518101906146999190615b95565b155b15611cda57604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561470a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061472e9190615295565b90506147456001600160a01b038516333086614d94565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614789573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147ad9190615295565b90508181116148135760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b61481d82826158bb565b95945050505050565b5f60608260800151516030146148905760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104da565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614907576148c78160016158bb565b6148d2906008615683565b5081515f908390839081106148e9576148e96153bd565b60200101906001600160f81b03191690815f1a9053506001016148b3565b505f5b600481101561496f5761491e8160036158bb565b614929906008615683565b600160ff919091161c60f81b8261494183600261564e565b81518110614951576149516153bd565b60200101906001600160f81b03191690815f1a90535060010161490a565b505f5b60208110156149cc578451816020811061498e5761498e6153bd565b1a60f81b8261499e83600661564e565b815181106149ae576149ae6153bd565b60200101906001600160f81b03191690815f1a905350600101614972565b505f5b6020811015614a2c57846020015181602081106149ee576149ee6153bd565b1a60f81b826149fe83602661564e565b81518110614a0e57614a0e6153bd565b60200101906001600160f81b03191690815f1a9053506001016149cf565b505f5b6008811015614aa057614a438160076158bb565b614a4e906008615683565b60ff1685604001516001600160401b0316901c60f81b82826046614a72919061564e565b81518110614a8257614a826153bd565b60200101906001600160f81b03191690815f1a905350600101614a2f565b505f5b6030811015614b0b5784608001518181518110614ac257614ac26153bd565b01602001516001600160f81b03191682614add83604e61564e565b81518110614aed57614aed6153bd565b60200101906001600160f81b03191690815f1a905350600101614aa3565b505f5b6008811015614b7d57614b228160076158bb565b614b2d906008615683565b60608601516001600160401b0390811691161c60f81b82614b4f83607e61564e565b81518110614b5f57614b5f6153bd565b60200101906001600160f81b03191690815f1a905350600101614b0e565b50600281604051614b8e919061563d565b602060405180830381855afa158015614ba9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bcc9190615295565b94909350915050565b613d48613cff565b614be5613cff565b80355f80516020615bf183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c316080840160608501615a30565b60ff161115614c9e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104da565b5f614caf6080840160608501615a30565b60ff1611614d175760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104da565b614d276080830160608401615a30565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d586060830160408401615094565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61302b613cff565b60606123a883835f614dcd565b6040516001600160a01b0384811660248301528381166044830152606482018390526109b99186918216906323b872dd90608401613e9f565b606081471015614df25760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614e0d919061563d565b5f6040518083038185875af1925050503d805f8114614e47576040519150601f19603f3d011682016040523d82523d5f602084013e614e4c565b606091505b5091509150612099868383606082614e6c57614e6782614eb3565b6123a8565b8151158015614e8357506001600160a01b0384163b155b15614eac57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b50806123a8565b805115614ec35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ee8906156ba565b5f825580601f10614ef7575050565b601f0160209004905f5260205f209081019061213d91905b80821115614f22575f8155600101614f0f565b5090565b801515811461213d575f80fd5b803563ffffffff81168114614f46575f80fd5b919050565b5f805f60608486031215614f5d575f80fd5b833592506020840135614f6f81614f26565b9150614f7d60408501614f33565b90509250925092565b5f60208284031215614f96575f80fd5b5035919050565b6001600160a01b038116811461213d575f80fd5b5f80828403610160811215614fc4575f80fd5b61014080821215614fd3575f80fd5b8493508301359050614fe481614f9d565b809150509250929050565b5f60208284031215614fff575f80fd5b6123a882614f33565b5f8060408385031215615019575f80fd5b61502283614f33565b946020939093013593505050565b5f8060408385031215615041575f80fd5b82356001600160401b03811115615056575f80fd5b830160808186031215615067575f80fd5b915061507560208401614f33565b90509250929050565b80356001600160401b0381168114614f46575f80fd5b5f602082840312156150a4575f80fd5b6123a88261507e565b5f80604083850312156150be575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061510457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161513f60608401826001600160401b03169052565b50608083015161515a60808401826001600160401b03169052565b5060a083015161517560a08401826001600160401b03169052565b5060c083015161519060c08401826001600160401b03169052565b5092915050565b803561ffff81168114614f46575f80fd5b5f805f80608085870312156151bb575f80fd5b84356001600160401b038111156151d0575f80fd5b8501606081880312156151e1575f80fd5b93506151ef60208601615197565b92506151fd6040860161507e565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156151905761519061520d565b5f5b8381101561525b578181015183820152602001615243565b50505f910152565b602081525f8251806020840152615281816040850160208701615241565b601f01601f19169190910160400192915050565b5f602082840312156152a5575f80fd5b5051919050565b5f826152c657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615366575f80fd5b81356123a881614f9d565b5f808335601e19843603018112615386575f80fd5b8301803591506001600160401b0382111561539f575f80fd5b6020019150600581901b36038213156153b6575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126153e5575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615425576154256153ef565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615453576154536153ef565b604052919050565b5f6001600160401b03821115615473576154736153ef565b50601f01601f191660200190565b5f60608236031215615491575f80fd5b615499615403565b8235815260206154aa81850161507e565b8183015260408401356001600160401b038111156154c6575f80fd5b840136601f8201126154d6575f80fd5b80356154e96154e48261545b565b61542b565b81815236848385010111156154fc575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516155ff818460208a01615241565b80830190508581526001600160401b0360c01b8560c01b166020820152835161562f816028840160208801615241565b016028019695505050505050565b5f82516153e5818460208701615241565b808201808211156109cf576109cf61520d565b5f63ffffffff8083168181036156795761567961520d565b6001019392505050565b80820281158282048414176109cf576109cf61520d565b6001600160401b038181168382160190808211156151905761519061520d565b600181811c908216806156ce57607f821691505b6020821081036156ec57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461574b816156ba565b806020870152604060018084165f811461576c5760018114615788576157b5565b60ff19851660408a0152604084151560051b8a010195506157b5565b895f5260205f205f5b858110156157ac5781548b8201860152908301908801615791565b8a016040019650505b509398975050505050505050565b8051614f4681614f26565b5f80604083850312156157df575f80fd5b82516001600160401b03808211156157f5575f80fd5b9084019060608287031215615808575f80fd5b615810615403565b8251815260208084015161582381614f9d565b82820152604084015183811115615838575f80fd5b80850194505087601f85011261584c575f80fd5b8351925061585c6154e48461545b565b838152888285870101111561586f575f80fd5b61587e84838301848801615241565b806040840152508195506158938188016157c3565b9450505050509250929050565b5f6001600160401b038083168181036156795761567961520d565b818103818111156109cf576109cf61520d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159c4576159c461520d565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f60208284031215615a27575f80fd5b6123a882615197565b5f60208284031215615a40575f80fd5b813560ff811681146123a8575f80fd5b5f808335601e19843603018112615a65575f80fd5b8301803591506001600160401b03821115615a7e575f80fd5b6020019150368190038213156153b6575f80fd5b601f821115611cda57805f5260205f20601f840160051c81016020851015615ab75750805b601f840160051c820191505b8181101561152d575f8155600101615ac3565b81516001600160401b03811115615aef57615aef6153ef565b615b0381615afd84546156ba565b84615a92565b602080601f831160018114615b36575f8415615b1f5750858301515b5f19600386901b1c1916600185901b178555615b8d565b5f85815260208120601f198616915b82811015615b6457888601518255948401946001909101908401615b45565b5085821015615b8157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ba5575f80fd5b81516123a881614f2656fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 4f4e637d3..5bf1c011d 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615a0d380380615a0d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6158c08061014d5f395ff3fe60806040526004361061013c575f3560e01c806362065856116100b3578063ba3a4b971161006d578063ba3a4b97146103be578063bee0a03f146103dd578063c599e24f146103fc578063c974d1b61461040f578063d5f20ff614610423578063df93d8de1461044f575f80fd5b806362065856146102f157806366435abf1461031057806376f786211461032f57806398f3e2b41461034e578063a3a65e481461036d578063b771b3bc1461038c575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded1461025957806340034a9314610281578063467ef06f146102945780635297fae6146102b357806361e2f490146102d2575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a366004614c27565b610465565b005b34801561016c575f80fd5b5061015f61017b366004614c62565b6108f6565b34801561018b575f80fd5b506101ca61019a366004614c62565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614c79565b610aaf565b34801561022d575f80fd5b5061024161023c366004614c62565b610b8c565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b6101ca61028f366004614cb7565b610ba2565b34801561029f575f80fd5b5061015f6102ae366004614d0b565b610bd6565b3480156102be575f80fd5b5061015f6102cd366004614d24565b610c29565b3480156102dd575f80fd5b5061015f6102ec366004614d4c565b610dfe565b3480156102fc575f80fd5b506101ca61030b366004614d9a565b61154a565b34801561031b575f80fd5b5061024161032a366004614c62565b611563565b34801561033a575f80fd5b5061015f610349366004614c27565b611577565b348015610359575f80fd5b5061015f610368366004614d24565b611658565b348015610378575f80fd5b5061015f610387366004614d0b565b611885565b348015610397575f80fd5b506103a66005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103c9575f80fd5b5061015f6103d8366004614c62565b611a3d565b3480156103e8575f80fd5b5061015f6103f7366004614c62565b611cc3565b6101ca61040a366004614c62565b611dd7565b34801561041a575f80fd5b506101f1601481565b34801561042e575f80fd5b5061044261043d366004614c62565b611e08565b6040516101d49190614dc7565b34801561045a575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206158148339815191529184156104b7576104b48285611efb565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104e9576104e9614db3565b60048111156104fa576104fa614db3565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058157610581614db3565b146105d35760405162461bcd60e51b815260206004820152602a60248201525f805160206158348339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106385760405162461bcd60e51b815260206004820152603360248201525f805160206158348339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ca565b5f61064284612197565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561068f5761068f614db3565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076185611e08565b905082606001516001600160401b031681608001516001600160401b0316116107d85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105ca565b6002815160058111156107ed576107ed614db3565b036107ff576107ff8360600151612227565b5f836060015182608001516108149190614e91565b90506108208682612234565b5f6005600160991b0163ee5b48eb61083989878661227c565b6040518263ffffffff1660e01b81526004016108559190614ed3565b6020604051808303815f875af1158015610871573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108959190614f05565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206158948339815191526020526040808220815160e0810190925280545f8051602061585483398151915293929190829060ff16600581111561094357610943614db3565b600581111561095457610954614db3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109c3576109c3614db3565b14610a285760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb610a4d8584606001515f61227c565b6040518263ffffffff1660e01b8152600401610a699190614ed3565b6020604051808303815f875af1158015610a85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa99190614f05565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610af8575080546001600160401b03808416911610155b15610b165760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b40836124a1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b9c64e8d4a5100083614f1c565b92915050565b5f610bab6124b2565b610bb7848484346124e9565b9050610bcf60015f8051602061587483398151915255565b9392505050565b5f805160206158148339815191525f80610bef84612766565b6040808201515f848152600588016020529190912054929450909250610aa9916001600160401b03909116906001600160a01b0316612ade565b5f805160206158148339815191525f610c4184612af1565b90505f80610c528360400151612ccb565b50915091505f610c6183611e08565b9050816001600160401b031681606001516001600160401b03161015610c995760405162461bcd60e51b81526004016105ca90614f3b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cde5760405162461bcd60e51b81526004016105ca90614f7d565b60015f87815260068701602052604090205460ff166004811115610d0457610d04614db3565b14610d6d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206158548339815191529060ff1615610e9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ede573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f029190614f05565b836020013514610f645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016105ca565b30610f756060850160408601614fda565b6001600160a01b031614610fe75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016105ca565b5f610ff56060850185614ff5565b9050116110545760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016105ca565b5f6110626060850185614ff5565b91505063ffffffff81106110ce5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016105ca565b5f8435602086013560146110e86060890160408a01614fda565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561145a575f6111686060890189614ff5565b8363ffffffff1681811061117e5761117e615041565b90506020028101906111909190615055565b61119990615105565b8051909150806111bb5760405162461bcd60e51b81526004016105ca9061519c565b5f818152600988016020526040902054156111e85760405162461bcd60e51b81526004016105ca906151dd565b81604001515160301461120d5760405162461bcd60e51b81526004016105ca90615225565b84825f01518360200151846040015160405160200161122f9493929190615272565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161127d91906152c1565b602060405180830381855afa158015611298573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112bb9190614f05565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561134757611347614db3565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113fa9116866152d2565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080611452906152e5565b91505061114c565b50600584018190555f61146c86612af1565b90505f61147c8260400151612f06565b90508060028560405161148f91906152c1565b602060405180830381855afa1580156114aa573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114cd9190614f05565b146115315760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016105ca565b505050600a909201805460ff1916600117905550505050565b5f610b9c6001600160401b03831664e8d4a51000615307565b5f61156d82611e08565b6080015192915050565b5f805160206158148339815191525f61158f85611e08565b5f86815260058401602052604090205460a08201519192506115c291600160b01b9091046001600160401b03169061531e565b6001600160401b03164210156116365760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ca565b8315611648576116468584611efb565b505b6116518561306f565b5050505050565b6116606124b2565b5f805160206158148339815191525f61167884612af1565b90505f806116898360400151612ccb565b50915091505f61169883611e08565b9050816001600160401b031681606001516001600160401b031610156116d05760405162461bcd60e51b81526004016105ca90614f3b565b5f8681526006860160205260409020600301546001600160401b038084169116111561170e5760405162461bcd60e51b81526004016105ca90614f7d565b60035f87815260068701602052604090205460ff16600481111561173457611734614db3565b146117885760405162461bcd60e51b815260206004820152603160248201525f805160206158348339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261182d91612ade565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061188160015f8051602061587483398151915255565b5050565b5f805160206158548339815191525f61189d83612af1565b90505f806118ae8360400151613365565b91509150806119105760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ca565b5f8281526007850160205260408120805461192a9061533e565b905011801561195c575060015f83815260088601602052604090205460ff16600581111561195a5761195a614db3565b145b6119785760405162461bcd60e51b81526004016105ca90615370565b5f828152600785016020526040812061199091614bbd565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061581483398151915293929190829060ff166004811115611a9e57611a9e614db3565b6004811115611aaf57611aaf614db3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b3657611b36614db3565b1480611b545750600381516004811115611b5257611b52614db3565b145b611ba85760405162461bcd60e51b815260206004820152603260248201525f80516020615834833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ca565b5f611bb68260400151611e08565b905080606001516001600160401b03165f03611c3a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb611c6784604001518460600151856080015161227c565b6040518263ffffffff1660e01b8152600401611c839190614ed3565b6020604051808303815f875af1158015611c9f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116519190614f05565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615854833981519152929190611d0b9061533e565b9050118015611d3d575060015f83815260088301602052604090205460ff166005811115611d3b57611d3b614db3565b145b611d595760405162461bcd60e51b81526004016105ca90615370565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d9291906004016153b7565b6020604051808303815f875af1158015611dae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd29190614f05565b505050565b5f611de06124b2565b611deb823334613506565b9050611e0360015f8051602061587483398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061589483398151915290528390208351918201909352825491925f8051602061585483398151915292829060ff166005811115611e8857611e88614db3565b6005811115611e9957611e99614db3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f46573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f6d919081019061544c565b9150915080611fd05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612013573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120379190614f05565b82511461209b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ca565b60208201516001600160a01b0316156121115760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ca565b5f80612120846040015161397c565b9150915081871461218d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ca565b9695505050505050565b5f8181525f805160206158948339815191526020526040812060020180545f8051602061585483398151915291600160401b9091046001600160401b03169060086121e18361551e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b612231815f613b54565b50565b5f9182525f80516020615894833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156122f5576122b5816001615539565b6122c0906008615307565b5081515f908390839081106122d7576122d7615041565b60200101906001600160f81b03191690815f1a9053506001016122a1565b505f5b60048110156123605761230c816003615539565b612317906008615307565b600263ffffffff16901c60f81b8282600261233291906152d2565b8151811061234257612342615041565b60200101906001600160f81b03191690815f1a9053506001016122f8565b505f5b60208110156123c25761237781601f615539565b612382906008615307565b86901c60f81b826123948360066152d2565b815181106123a4576123a4615041565b60200101906001600160f81b03191690815f1a905350600101612363565b505f5b600881101561242d576123d9816007615539565b6123e4906008615307565b6001600160401b038616901c60f81b826123ff8360266152d2565b8151811061240f5761240f615041565b60200101906001600160f81b03191690815f1a9053506001016123c5565b505f5b600881101561249857612444816007615539565b61244f906008615307565b6001600160401b038516901c60f81b8261246a83602e6152d2565b8151811061247a5761247a615041565b60200101906001600160f81b03191690815f1a905350600101612430565b50949350505050565b6124a9613dae565b61223181613df9565b5f805160206158748339815191528054600119016124e357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158148339815191529061ffff861610801590612535575061271061ffff861611155b6125515760405162461bcd60e51b81526004016105ca9061554c565b60028101546001600160401b0390811690851610156125ca5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ca565b805483101561262d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ca565b80600101548311156126945760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ca565b825f61269f82610b8c565b90505f6126ac8983613e6d565b905060405180606001604052806126c03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061587483398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158548339815191525f6127b585612af1565b90505f806127c68360400151613365565b91509150801561282b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ca565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561285c5761285c614db3565b600581111561286d5761286d614db3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156128de576128de614db3565b14806128fc57506001825160058111156128fa576128fa614db3565b145b61295b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ca565b60038251600581111561297057612970614db3565b0361297d57506004612981565b5060055b6020808301515f908152600988019091526040812055818160058111156129aa576129aa614db3565b908160058111156129bd576129bd614db3565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156129f1576129f1614db3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612aa557612aa5614db3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6118816001600160a01b03821683614351565b60408051606080820183525f8083526020830181905292820152905f805160206158548339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612b66573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612b8d919081019061544c565b9150915080612bed5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016105ca565b8254825114612c505760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ca565b60208201516001600160a01b031615612cc35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ca565b509392505050565b5f805f8351603614612cef5760405162461bcd60e51b81526004016105ca90615597565b5f805b6002811015612d3e57612d06816001615539565b612d11906008615307565b61ffff16868281518110612d2757612d27615041565b016020015160f81c901b9190911790600101612cf2565b5061ffff811615612d615760405162461bcd60e51b81526004016105ca906155e0565b5f805b6004811015612dbc57612d78816003615539565b612d83906008615307565b63ffffffff1687612d958360026152d2565b81518110612da557612da5615041565b016020015160f81c901b9190911790600101612d64565b5063ffffffff8116600414612de35760405162461bcd60e51b81526004016105ca90615623565b5f805b6020811015612e3857612dfa81601f615539565b612e05906008615307565b88612e118360066152d2565b81518110612e2157612e21615041565b016020015160f81c901b9190911790600101612de6565b505f805b6008811015612e9757612e50816007615539565b612e5b906008615307565b6001600160401b031689612e708360266152d2565b81518110612e8057612e80615041565b016020015160f81c901b9190911790600101612e3c565b505f805b6008811015612ef657612eaf816007615539565b612eba906008615307565b6001600160401b03168a612ecf83602e6152d2565b81518110612edf57612edf615041565b016020015160f81c901b9190911790600101612e9b565b5091989097509095509350505050565b5f8151602614612f285760405162461bcd60e51b81526004016105ca90615597565b5f805b6002811015612f7757612f3f816001615539565b612f4a906008615307565b61ffff16848281518110612f6057612f60615041565b016020015160f81c901b9190911790600101612f2b565b5061ffff811615612f9a5760405162461bcd60e51b81526004016105ca906155e0565b5f805b6004811015612ff557612fb1816003615539565b612fbc906008615307565b63ffffffff1685612fce8360026152d2565b81518110612fde57612fde615041565b016020015160f81c901b9190911790600101612f9d565b5063ffffffff81161561301a5760405162461bcd60e51b81526004016105ca90615623565b5f805b60208110156124985761303181601f615539565b61303c906008615307565b866130488360066152d2565b8151811061305857613058615041565b016020015160f81c901b919091179060010161301d565b5f8181525f805160206158948339815191526020526040808220815160e0810190925280545f8051602061585483398151915293929190829060ff1660058111156130bc576130bc614db3565b60058111156130cd576130cd614db3565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561313f5761313f614db3565b1461319b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ca565b6131a88160800151612227565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156131ec576131ec614db3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132a18461329b81612197565b5f61227c565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906132d0908590600401614ed3565b6020604051808303815f875af11580156132ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133109190614f05565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146133885760405162461bcd60e51b81526004016105ca90615597565b5f805b60028110156133d75761339f816001615539565b6133aa906008615307565b61ffff168582815181106133c0576133c0615041565b016020015160f81c901b919091179060010161338b565b5061ffff8116156133fa5760405162461bcd60e51b81526004016105ca906155e0565b5f805b600481101561345557613411816003615539565b61341c906008615307565b63ffffffff168661342e8360026152d2565b8151811061343e5761343e615041565b016020015160f81c901b91909117906001016133fd565b5063ffffffff811660031461347c5760405162461bcd60e51b81526004016105ca90615623565b5f805b60208110156134d15761349381601f615539565b61349e906008615307565b876134aa8360066152d2565b815181106134ba576134ba615041565b016020015160f81c901b919091179060010161347f565b505f866026815181106134e6576134e6615041565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206158148339815191528161351f84610b8c565b90505f61352b87611e08565b905060028151600581111561354257613542614db3565b146135a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ca565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166136345760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016105ca565b61363d826143e4565b5f82826080015161364e919061531e565b60048501546040840151919250613670916001600160401b039091169061566a565b6001600160401b0316816001600160401b031611156136ef5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ca565b6136f98882612234565b5f61370389612197565b90505f898260405160200161372f92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6137698d868861227c565b6040518263ffffffff1660e01b81526004016137859190614ed3565b6020604051808303815f875af11580156137a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c59190614f05565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561384d5761384d614db3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e1461399f5760405162461bcd60e51b81526004016105ca90615597565b5f805b60028110156139ee576139b6816001615539565b6139c1906008615307565b61ffff168582815181106139d7576139d7615041565b016020015160f81c901b91909117906001016139a2565b5061ffff811615613a115760405162461bcd60e51b81526004016105ca906155e0565b5f805b6004811015613a6c57613a28816003615539565b613a33906008615307565b63ffffffff1686613a458360026152d2565b81518110613a5557613a55615041565b016020015160f81c901b9190911790600101613a14565b5063ffffffff8116600514613a935760405162461bcd60e51b81526004016105ca90615623565b5f805b6020811015613ae857613aaa81601f615539565b613ab5906008615307565b87613ac18360066152d2565b81518110613ad157613ad1615041565b016020015160f81c901b9190911790600101613a96565b505f805b6008811015613b4757613b00816007615539565b613b0b906008615307565b6001600160401b031688613b208360266152d2565b81518110613b3057613b30615041565b016020015160f81c901b9190911790600101613aec565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615854833981519152914291901580613c3a575060028301548151613c36916001600160401b0316906152d2565b8210155b15613c60576001600160401b038516606082015281815260408101516020820152613c7f565b8481606001818151613c72919061531e565b6001600160401b03169052505b6060810151613c8f90606461566a565b602082015160028501546001600160401b039290921691613cba9190600160401b900460ff16615307565b1015613d1e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ca565b8315613d4757846001600160401b031681604001818151613d3f91906152d2565b905250613d66565b846001600160401b031681604001818151613d629190615539565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613df757604051631afcd79f60e31b815260040160405180910390fd5b565b613e01613dae565b613e0a816143ef565b613e12614408565b612231608082013560a0830135613e2f60e0850160c08601614d9a565b613e40610100860160e08701615695565b61ffff16613e56610120870161010088016156ae565b613e6861014088016101208901614fda565b614418565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613ef85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016105ca565b5f8051602061585483398151915242613f176040860160208701614d9a565b6001600160401b031611613f895760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ca565b613f996040850160208601614d9a565b6001600160401b0316613faf6202a300426152d2565b116140225760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ca565b83356140405760405162461bcd60e51b81526004016105ca9061519c565b83355f9081526009820160205260409020541561406f5760405162461bcd60e51b81526004016105ca906151dd565b61407c60408501856156ce565b905060301461409d5760405162461bcd60e51b81526004016105ca90615225565b6140a6836143e4565b5f806141406040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906140eb9190614d9a565b6001600160401b0316815260200161410660408a018a6156ce565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061465c565b5f8281526007860160205260409020919350915061415e8282615754565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061418b908590600401614ed3565b6020604051808303815f875af11580156141a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141cb9190614f05565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561424357614243614db3565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614323918e01908e01614d9a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156143745760405163cd78605960e01b81523060048201526024016105ca565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146143bd576040519150601f19603f3d011682016040523d82523d5f602084013e6143c2565b606091505b5050905080611dd257604051630a12f52160e11b815260040160405180910390fd5b612231816001613b54565b6143f7613dae565b6143ff614a0b565b61223181614a13565b614410613dae565b613df7614bb5565b614420613dae565b5f805160206158148339815191528361448c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ca565b6127108411156144ae5760405162461bcd60e51b81526004016105ca9061554c565b858711156145165760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ca565b5f8360ff16116145835760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ca565b600a60ff841611156145f55760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ca565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146146c65760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ca565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561473d576146fd816001615539565b614708906008615307565b5081515f9083908390811061471f5761471f615041565b60200101906001600160f81b03191690815f1a9053506001016146e9565b505f5b60048110156147a557614754816003615539565b61475f906008615307565b600160ff919091161c60f81b826147778360026152d2565b8151811061478757614787615041565b60200101906001600160f81b03191690815f1a905350600101614740565b505f5b602081101561480257845181602081106147c4576147c4615041565b1a60f81b826147d48360066152d2565b815181106147e4576147e4615041565b60200101906001600160f81b03191690815f1a9053506001016147a8565b505f5b6020811015614862578460200151816020811061482457614824615041565b1a60f81b826148348360266152d2565b8151811061484457614844615041565b60200101906001600160f81b03191690815f1a905350600101614805565b505f5b60088110156148d657614879816007615539565b614884906008615307565b60ff1685604001516001600160401b0316901c60f81b828260466148a891906152d2565b815181106148b8576148b8615041565b60200101906001600160f81b03191690815f1a905350600101614865565b505f5b603081101561494157846080015181815181106148f8576148f8615041565b01602001516001600160f81b0319168261491383604e6152d2565b8151811061492357614923615041565b60200101906001600160f81b03191690815f1a9053506001016148d9565b505f5b60088110156149b357614958816007615539565b614963906008615307565b60608601516001600160401b0390811691161c60f81b8261498583607e6152d2565b8151811061499557614995615041565b60200101906001600160f81b03191690815f1a905350600101614944565b506002816040516149c491906152c1565b602060405180830381855afa1580156149df573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a029190614f05565b94909350915050565b613df7613dae565b614a1b613dae565b80355f8051602061585483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614a6760808401606085016156ae565b60ff161115614ad45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ca565b5f614ae560808401606085016156ae565b60ff1611614b4d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ca565b614b5d60808301606084016156ae565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614b8e6060830160408401614d9a565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612753613dae565b508054614bc99061533e565b5f825580601f10614bd8575050565b601f0160209004905f5260205f209081019061223191905b80821115614c03575f8155600101614bf0565b5090565b8015158114612231575f80fd5b803563ffffffff81168114611e03575f80fd5b5f805f60608486031215614c39575f80fd5b833592506020840135614c4b81614c07565b9150614c5960408501614c14565b90509250925092565b5f60208284031215614c72575f80fd5b5035919050565b5f6101408284031215614c8a575f80fd5b50919050565b803561ffff81168114611e03575f80fd5b80356001600160401b0381168114611e03575f80fd5b5f805f60608486031215614cc9575f80fd5b83356001600160401b03811115614cde575f80fd5b840160608187031215614cef575f80fd5b9250614cfd60208501614c90565b9150614c5960408501614ca1565b5f60208284031215614d1b575f80fd5b610bcf82614c14565b5f8060408385031215614d35575f80fd5b614d3e83614c14565b946020939093013593505050565b5f8060408385031215614d5d575f80fd5b82356001600160401b03811115614d72575f80fd5b830160808186031215614d83575f80fd5b9150614d9160208401614c14565b90509250929050565b5f60208284031215614daa575f80fd5b610bcf82614ca1565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614dea57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e2560608401826001600160401b03169052565b506080830151614e4060808401826001600160401b03169052565b5060a0830151614e5b60a08401826001600160401b03169052565b5060c0830151614e7660c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e7657614e76614e7d565b5f5b83811015614ecb578181015183820152602001614eb3565b50505f910152565b602081525f8251806020840152614ef1816040850160208701614eb1565b601f01601f19169190910160400192915050565b5f60208284031215614f15575f80fd5b5051919050565b5f82614f3657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612231575f80fd5b5f60208284031215614fea575f80fd5b8135610bcf81614fc6565b5f808335601e1984360301811261500a575f80fd5b8301803591506001600160401b03821115615023575f80fd5b6020019150600581901b360382131561503a575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615069575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150a9576150a9615073565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150d7576150d7615073565b604052919050565b5f6001600160401b038211156150f7576150f7615073565b50601f01601f191660200190565b5f60608236031215615115575f80fd5b61511d615087565b82358152602061512e818501614ca1565b8183015260408401356001600160401b0381111561514a575f80fd5b840136601f82011261515a575f80fd5b803561516d615168826150df565b6150af565b8181523684838501011115615180575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615283818460208a01614eb1565b80830190508581526001600160401b0360c01b8560c01b16602082015283516152b3816028840160208801614eb1565b016028019695505050505050565b5f8251615069818460208701614eb1565b80820180821115610b9c57610b9c614e7d565b5f63ffffffff8083168181036152fd576152fd614e7d565b6001019392505050565b8082028115828204841417610b9c57610b9c614e7d565b6001600160401b03818116838216019080821115614e7657614e76614e7d565b600181811c9082168061535257607f821691505b602082108103614c8a57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546153c98161533e565b806020870152604060018084165f81146153ea576001811461540657615433565b60ff19851660408a0152604084151560051b8a01019550615433565b895f5260205f205f5b8581101561542a5781548b820186015290830190880161540f565b8a016040019650505b509398975050505050505050565b8051611e0381614c07565b5f806040838503121561545d575f80fd5b82516001600160401b0380821115615473575f80fd5b9084019060608287031215615486575f80fd5b61548e615087565b825181526020808401516154a181614fc6565b828201526040840151838111156154b6575f80fd5b80850194505087601f8501126154ca575f80fd5b835192506154da615168846150df565b83815288828587010111156154ed575f80fd5b6154fc84838301848801614eb1565b80604084015250819550615511818801615441565b9450505050509250929050565b5f6001600160401b038083168181036152fd576152fd614e7d565b81810381811115610b9c57610b9c614e7d565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461568d5761568d614e7d565b505092915050565b5f602082840312156156a5575f80fd5b610bcf82614c90565b5f602082840312156156be575f80fd5b813560ff81168114610bcf575f80fd5b5f808335601e198436030181126156e3575f80fd5b8301803591506001600160401b038211156156fc575f80fd5b60200191503681900382131561503a575f80fd5b601f821115611dd257805f5260205f20601f840160051c810160208510156157355750805b601f840160051c820191505b81811015611651575f8155600101615741565b81516001600160401b0381111561576d5761576d615073565b6157818161577b845461533e565b84615710565b602080601f8311600181146157b4575f841561579d5750858301515b5f19600386901b1c1916600185901b17855561580b565b5f85815260208120601f198616915b828110156157e2578886015182559484019460019091019084016157c3565b50858210156157ff57878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615a0b380380615a0b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6158be8061014d5f395ff3fe60806040526004361061013c575f3560e01c806362065856116100b3578063ba3a4b971161006d578063ba3a4b97146103be578063bee0a03f146103dd578063c599e24f146103fc578063c974d1b61461040f578063d5f20ff614610423578063df93d8de1461044f575f80fd5b806362065856146102f157806366435abf1461031057806376f786211461032f57806398f3e2b41461034e578063a3a65e481461036d578063b771b3bc1461038c575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded1461025957806340034a9314610281578063467ef06f146102945780635297fae6146102b357806361e2f490146102d2575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a366004614c25565b610465565b005b34801561016c575f80fd5b5061015f61017b366004614c60565b6108f6565b34801561018b575f80fd5b506101ca61019a366004614c60565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614c77565b610aaf565b34801561022d575f80fd5b5061024161023c366004614c60565b610b8c565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b6101ca61028f366004614cb5565b610ba2565b34801561029f575f80fd5b5061015f6102ae366004614d09565b610bd6565b3480156102be575f80fd5b5061015f6102cd366004614d22565b610c29565b3480156102dd575f80fd5b5061015f6102ec366004614d4a565b610dfe565b3480156102fc575f80fd5b506101ca61030b366004614d98565b611548565b34801561031b575f80fd5b5061024161032a366004614c60565b611561565b34801561033a575f80fd5b5061015f610349366004614c25565b611575565b348015610359575f80fd5b5061015f610368366004614d22565b611656565b348015610378575f80fd5b5061015f610387366004614d09565b611883565b348015610397575f80fd5b506103a66005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103c9575f80fd5b5061015f6103d8366004614c60565b611a3b565b3480156103e8575f80fd5b5061015f6103f7366004614c60565b611cc1565b6101ca61040a366004614c60565b611dd5565b34801561041a575f80fd5b506101f1601481565b34801561042e575f80fd5b5061044261043d366004614c60565b611e06565b6040516101d49190614dc5565b34801561045a575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206158128339815191529184156104b7576104b48285611ef9565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104e9576104e9614db1565b60048111156104fa576104fa614db1565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058157610581614db1565b146105d35760405162461bcd60e51b815260206004820152602a60248201525f805160206158328339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106385760405162461bcd60e51b815260206004820152603360248201525f805160206158328339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ca565b5f61064284612195565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561068f5761068f614db1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076185611e06565b905082606001516001600160401b031681608001516001600160401b0316116107d85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105ca565b6002815160058111156107ed576107ed614db1565b036107ff576107ff8360600151612225565b5f836060015182608001516108149190614e8f565b90506108208682612232565b5f6005600160991b0163ee5b48eb61083989878661227a565b6040518263ffffffff1660e01b81526004016108559190614ed1565b6020604051808303815f875af1158015610871573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108959190614f03565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206158928339815191526020526040808220815160e0810190925280545f8051602061585283398151915293929190829060ff16600581111561094357610943614db1565b600581111561095457610954614db1565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109c3576109c3614db1565b14610a285760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb610a4d8584606001515f61227a565b6040518263ffffffff1660e01b8152600401610a699190614ed1565b6020604051808303815f875af1158015610a85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa99190614f03565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610af8575080546001600160401b03808416911610155b15610b165760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b408361249f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b9c64e8d4a5100083614f1a565b92915050565b5f610bab6124b0565b610bb7848484346124e7565b9050610bcf60015f8051602061587283398151915255565b9392505050565b5f805160206158128339815191525f80610bef84612764565b6040808201515f848152600588016020529190912054929450909250610aa9916001600160401b03909116906001600160a01b0316612adc565b5f805160206158128339815191525f610c4184612aef565b90505f80610c528360400151612cc9565b50915091505f610c6183611e06565b9050816001600160401b031681606001516001600160401b03161015610c995760405162461bcd60e51b81526004016105ca90614f39565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cde5760405162461bcd60e51b81526004016105ca90614f7b565b60015f87815260068701602052604090205460ff166004811115610d0457610d04614db1565b14610d6d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206158528339815191529060ff1615610e9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ede573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f029190614f03565b836020013514610f645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016105ca565b30610f756060850160408601614fd8565b6001600160a01b031614610fe75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016105ca565b5f610ff56060850185614ff3565b9050116110545760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016105ca565b5f6110626060850185614ff3565b91505063ffffffff81106110ce5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016105ca565b5f8435602086013560146110e86060890160408a01614fd8565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611458575f6111686060890189614ff3565b8363ffffffff1681811061117e5761117e61503f565b90506020028101906111909190615053565b61119990615103565b8051909150806111bb5760405162461bcd60e51b81526004016105ca9061519a565b5f818152600988016020526040902054156111e85760405162461bcd60e51b81526004016105ca906151db565b81604001515160301461120d5760405162461bcd60e51b81526004016105ca90615223565b84825f01518360200151846040015160405160200161122f9493929190615270565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161127d91906152bf565b602060405180830381855afa158015611298573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112bb9190614f03565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561134757611347614db1565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113fa9116866152d0565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611451906152e3565b905061114c565b50600584018190555f61146a86612aef565b90505f61147a8260400151612f04565b90508060028560405161148d91906152bf565b602060405180830381855afa1580156114a8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114cb9190614f03565b1461152f5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016105ca565b505050600a909201805460ff1916600117905550505050565b5f610b9c6001600160401b03831664e8d4a51000615305565b5f61156b82611e06565b6080015192915050565b5f805160206158128339815191525f61158d85611e06565b5f86815260058401602052604090205460a08201519192506115c091600160b01b9091046001600160401b03169061531c565b6001600160401b03164210156116345760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ca565b8315611646576116448584611ef9565b505b61164f8561306d565b5050505050565b61165e6124b0565b5f805160206158128339815191525f61167684612aef565b90505f806116878360400151612cc9565b50915091505f61169683611e06565b9050816001600160401b031681606001516001600160401b031610156116ce5760405162461bcd60e51b81526004016105ca90614f39565b5f8681526006860160205260409020600301546001600160401b038084169116111561170c5760405162461bcd60e51b81526004016105ca90614f7b565b60035f87815260068701602052604090205460ff16600481111561173257611732614db1565b146117865760405162461bcd60e51b815260206004820152603160248201525f805160206158328339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261182b91612adc565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061187f60015f8051602061587283398151915255565b5050565b5f805160206158528339815191525f61189b83612aef565b90505f806118ac8360400151613363565b915091508061190e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ca565b5f828152600785016020526040812080546119289061533c565b905011801561195a575060015f83815260088601602052604090205460ff16600581111561195857611958614db1565b145b6119765760405162461bcd60e51b81526004016105ca9061536e565b5f828152600785016020526040812061198e91614bbb565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061581283398151915293929190829060ff166004811115611a9c57611a9c614db1565b6004811115611aad57611aad614db1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b3457611b34614db1565b1480611b525750600381516004811115611b5057611b50614db1565b145b611ba65760405162461bcd60e51b815260206004820152603260248201525f80516020615832833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ca565b5f611bb48260400151611e06565b905080606001516001600160401b03165f03611c385760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb611c6584604001518460600151856080015161227a565b6040518263ffffffff1660e01b8152600401611c819190614ed1565b6020604051808303815f875af1158015611c9d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061164f9190614f03565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615852833981519152929190611d099061533c565b9050118015611d3b575060015f83815260088301602052604090205460ff166005811115611d3957611d39614db1565b145b611d575760405162461bcd60e51b81526004016105ca9061536e565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d9091906004016153b5565b6020604051808303815f875af1158015611dac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd09190614f03565b505050565b5f611dde6124b0565b611de9823334613504565b9050611e0160015f8051602061587283398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061589283398151915290528390208351918201909352825491925f8051602061585283398151915292829060ff166005811115611e8657611e86614db1565b6005811115611e9757611e97614db1565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f44573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f6b919081019061544a565b9150915080611fce5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612011573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120359190614f03565b8251146120995760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ca565b60208201516001600160a01b03161561210f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ca565b5f8061211e846040015161397a565b9150915081871461218b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ca565b9695505050505050565b5f8181525f805160206158928339815191526020526040812060020180545f8051602061585283398151915291600160401b9091046001600160401b03169060086121df8361551c565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b61222f815f613b52565b50565b5f9182525f80516020615892833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156122f3576122b3816001615537565b6122be906008615305565b5081515f908390839081106122d5576122d561503f565b60200101906001600160f81b03191690815f1a90535060010161229f565b505f5b600481101561235e5761230a816003615537565b612315906008615305565b600263ffffffff16901c60f81b8282600261233091906152d0565b815181106123405761234061503f565b60200101906001600160f81b03191690815f1a9053506001016122f6565b505f5b60208110156123c05761237581601f615537565b612380906008615305565b86901c60f81b826123928360066152d0565b815181106123a2576123a261503f565b60200101906001600160f81b03191690815f1a905350600101612361565b505f5b600881101561242b576123d7816007615537565b6123e2906008615305565b6001600160401b038616901c60f81b826123fd8360266152d0565b8151811061240d5761240d61503f565b60200101906001600160f81b03191690815f1a9053506001016123c3565b505f5b600881101561249657612442816007615537565b61244d906008615305565b6001600160401b038516901c60f81b8261246883602e6152d0565b815181106124785761247861503f565b60200101906001600160f81b03191690815f1a90535060010161242e565b50949350505050565b6124a7613dac565b61222f81613df7565b5f805160206158728339815191528054600119016124e157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158128339815191529061ffff861610801590612533575061271061ffff861611155b61254f5760405162461bcd60e51b81526004016105ca9061554a565b60028101546001600160401b0390811690851610156125c85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ca565b805483101561262b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ca565b80600101548311156126925760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ca565b825f61269d82610b8c565b90505f6126aa8983613e6b565b905060405180606001604052806126be3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061587283398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158528339815191525f6127b385612aef565b90505f806127c48360400151613363565b9150915080156128295760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ca565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561285a5761285a614db1565b600581111561286b5761286b614db1565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156128dc576128dc614db1565b14806128fa57506001825160058111156128f8576128f8614db1565b145b6129595760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ca565b60038251600581111561296e5761296e614db1565b0361297b5750600461297f565b5060055b6020808301515f908152600988019091526040812055818160058111156129a8576129a8614db1565b908160058111156129bb576129bb614db1565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156129ef576129ef614db1565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612aa357612aa3614db1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b61187f6001600160a01b0382168361434f565b60408051606080820183525f8083526020830181905292820152905f805160206158528339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612b64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612b8b919081019061544a565b9150915080612beb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016105ca565b8254825114612c4e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ca565b60208201516001600160a01b031615612cc15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ca565b509392505050565b5f805f8351603614612ced5760405162461bcd60e51b81526004016105ca90615595565b5f805b6002811015612d3c57612d04816001615537565b612d0f906008615305565b61ffff16868281518110612d2557612d2561503f565b016020015160f81c901b9190911790600101612cf0565b5061ffff811615612d5f5760405162461bcd60e51b81526004016105ca906155de565b5f805b6004811015612dba57612d76816003615537565b612d81906008615305565b63ffffffff1687612d938360026152d0565b81518110612da357612da361503f565b016020015160f81c901b9190911790600101612d62565b5063ffffffff8116600414612de15760405162461bcd60e51b81526004016105ca90615621565b5f805b6020811015612e3657612df881601f615537565b612e03906008615305565b88612e0f8360066152d0565b81518110612e1f57612e1f61503f565b016020015160f81c901b9190911790600101612de4565b505f805b6008811015612e9557612e4e816007615537565b612e59906008615305565b6001600160401b031689612e6e8360266152d0565b81518110612e7e57612e7e61503f565b016020015160f81c901b9190911790600101612e3a565b505f805b6008811015612ef457612ead816007615537565b612eb8906008615305565b6001600160401b03168a612ecd83602e6152d0565b81518110612edd57612edd61503f565b016020015160f81c901b9190911790600101612e99565b5091989097509095509350505050565b5f8151602614612f265760405162461bcd60e51b81526004016105ca90615595565b5f805b6002811015612f7557612f3d816001615537565b612f48906008615305565b61ffff16848281518110612f5e57612f5e61503f565b016020015160f81c901b9190911790600101612f29565b5061ffff811615612f985760405162461bcd60e51b81526004016105ca906155de565b5f805b6004811015612ff357612faf816003615537565b612fba906008615305565b63ffffffff1685612fcc8360026152d0565b81518110612fdc57612fdc61503f565b016020015160f81c901b9190911790600101612f9b565b5063ffffffff8116156130185760405162461bcd60e51b81526004016105ca90615621565b5f805b60208110156124965761302f81601f615537565b61303a906008615305565b866130468360066152d0565b815181106130565761305661503f565b016020015160f81c901b919091179060010161301b565b5f8181525f805160206158928339815191526020526040808220815160e0810190925280545f8051602061585283398151915293929190829060ff1660058111156130ba576130ba614db1565b60058111156130cb576130cb614db1565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561313d5761313d614db1565b146131995760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ca565b6131a68160800151612225565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156131ea576131ea614db1565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61329f8461329981612195565b5f61227a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906132ce908590600401614ed1565b6020604051808303815f875af11580156132ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061330e9190614f03565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146133865760405162461bcd60e51b81526004016105ca90615595565b5f805b60028110156133d55761339d816001615537565b6133a8906008615305565b61ffff168582815181106133be576133be61503f565b016020015160f81c901b9190911790600101613389565b5061ffff8116156133f85760405162461bcd60e51b81526004016105ca906155de565b5f805b60048110156134535761340f816003615537565b61341a906008615305565b63ffffffff168661342c8360026152d0565b8151811061343c5761343c61503f565b016020015160f81c901b91909117906001016133fb565b5063ffffffff811660031461347a5760405162461bcd60e51b81526004016105ca90615621565b5f805b60208110156134cf5761349181601f615537565b61349c906008615305565b876134a88360066152d0565b815181106134b8576134b861503f565b016020015160f81c901b919091179060010161347d565b505f866026815181106134e4576134e461503f565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206158128339815191528161351d84610b8c565b90505f61352987611e06565b905060028151600581111561354057613540614db1565b1461359f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ca565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166136325760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016105ca565b61363b826143e2565b5f82826080015161364c919061531c565b6004850154604084015191925061366e916001600160401b0390911690615668565b6001600160401b0316816001600160401b031611156136ed5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ca565b6136f78882612232565b5f61370189612195565b90505f898260405160200161372d92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6137678d868861227a565b6040518263ffffffff1660e01b81526004016137839190614ed1565b6020604051808303815f875af115801561379f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c39190614f03565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561384b5761384b614db1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e1461399d5760405162461bcd60e51b81526004016105ca90615595565b5f805b60028110156139ec576139b4816001615537565b6139bf906008615305565b61ffff168582815181106139d5576139d561503f565b016020015160f81c901b91909117906001016139a0565b5061ffff811615613a0f5760405162461bcd60e51b81526004016105ca906155de565b5f805b6004811015613a6a57613a26816003615537565b613a31906008615305565b63ffffffff1686613a438360026152d0565b81518110613a5357613a5361503f565b016020015160f81c901b9190911790600101613a12565b5063ffffffff8116600514613a915760405162461bcd60e51b81526004016105ca90615621565b5f805b6020811015613ae657613aa881601f615537565b613ab3906008615305565b87613abf8360066152d0565b81518110613acf57613acf61503f565b016020015160f81c901b9190911790600101613a94565b505f805b6008811015613b4557613afe816007615537565b613b09906008615305565b6001600160401b031688613b1e8360266152d0565b81518110613b2e57613b2e61503f565b016020015160f81c901b9190911790600101613aea565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615852833981519152914291901580613c38575060028301548151613c34916001600160401b0316906152d0565b8210155b15613c5e576001600160401b038516606082015281815260408101516020820152613c7d565b8481606001818151613c70919061531c565b6001600160401b03169052505b6060810151613c8d906064615668565b602082015160028501546001600160401b039290921691613cb89190600160401b900460ff16615305565b1015613d1c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ca565b8315613d4557846001600160401b031681604001818151613d3d91906152d0565b905250613d64565b846001600160401b031681604001818151613d609190615537565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613df557604051631afcd79f60e31b815260040160405180910390fd5b565b613dff613dac565b613e08816143ed565b613e10614406565b61222f608082013560a0830135613e2d60e0850160c08601614d98565b613e3e610100860160e08701615693565b61ffff16613e54610120870161010088016156ac565b613e6661014088016101208901614fd8565b614416565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613ef65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016105ca565b5f8051602061585283398151915242613f156040860160208701614d98565b6001600160401b031611613f875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ca565b613f976040850160208601614d98565b6001600160401b0316613fad6202a300426152d0565b116140205760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ca565b833561403e5760405162461bcd60e51b81526004016105ca9061519a565b83355f9081526009820160205260409020541561406d5760405162461bcd60e51b81526004016105ca906151db565b61407a60408501856156cc565b905060301461409b5760405162461bcd60e51b81526004016105ca90615223565b6140a4836143e2565b5f8061413e6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906140e99190614d98565b6001600160401b0316815260200161410460408a018a6156cc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061465a565b5f8281526007860160205260409020919350915061415c8282615752565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614189908590600401614ed1565b6020604051808303815f875af11580156141a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141c99190614f03565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561424157614241614db1565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614321918e01908e01614d98565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156143725760405163cd78605960e01b81523060048201526024016105ca565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146143bb576040519150601f19603f3d011682016040523d82523d5f602084013e6143c0565b606091505b5050905080611dd057604051630a12f52160e11b815260040160405180910390fd5b61222f816001613b52565b6143f5613dac565b6143fd614a09565b61222f81614a11565b61440e613dac565b613df5614bb3565b61441e613dac565b5f805160206158128339815191528361448a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ca565b6127108411156144ac5760405162461bcd60e51b81526004016105ca9061554a565b858711156145145760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ca565b5f8360ff16116145815760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ca565b600a60ff841611156145f35760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ca565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146146c45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ca565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561473b576146fb816001615537565b614706906008615305565b5081515f9083908390811061471d5761471d61503f565b60200101906001600160f81b03191690815f1a9053506001016146e7565b505f5b60048110156147a357614752816003615537565b61475d906008615305565b600160ff919091161c60f81b826147758360026152d0565b815181106147855761478561503f565b60200101906001600160f81b03191690815f1a90535060010161473e565b505f5b602081101561480057845181602081106147c2576147c261503f565b1a60f81b826147d28360066152d0565b815181106147e2576147e261503f565b60200101906001600160f81b03191690815f1a9053506001016147a6565b505f5b602081101561486057846020015181602081106148225761482261503f565b1a60f81b826148328360266152d0565b815181106148425761484261503f565b60200101906001600160f81b03191690815f1a905350600101614803565b505f5b60088110156148d457614877816007615537565b614882906008615305565b60ff1685604001516001600160401b0316901c60f81b828260466148a691906152d0565b815181106148b6576148b661503f565b60200101906001600160f81b03191690815f1a905350600101614863565b505f5b603081101561493f57846080015181815181106148f6576148f661503f565b01602001516001600160f81b0319168261491183604e6152d0565b815181106149215761492161503f565b60200101906001600160f81b03191690815f1a9053506001016148d7565b505f5b60088110156149b157614956816007615537565b614961906008615305565b60608601516001600160401b0390811691161c60f81b8261498383607e6152d0565b815181106149935761499361503f565b60200101906001600160f81b03191690815f1a905350600101614942565b506002816040516149c291906152bf565b602060405180830381855afa1580156149dd573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a009190614f03565b94909350915050565b613df5613dac565b614a19613dac565b80355f8051602061585283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614a6560808401606085016156ac565b60ff161115614ad25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ca565b5f614ae360808401606085016156ac565b60ff1611614b4b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ca565b614b5b60808301606084016156ac565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614b8c6060830160408401614d98565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612751613dac565b508054614bc79061533c565b5f825580601f10614bd6575050565b601f0160209004905f5260205f209081019061222f91905b80821115614c01575f8155600101614bee565b5090565b801515811461222f575f80fd5b803563ffffffff81168114611e01575f80fd5b5f805f60608486031215614c37575f80fd5b833592506020840135614c4981614c05565b9150614c5760408501614c12565b90509250925092565b5f60208284031215614c70575f80fd5b5035919050565b5f6101408284031215614c88575f80fd5b50919050565b803561ffff81168114611e01575f80fd5b80356001600160401b0381168114611e01575f80fd5b5f805f60608486031215614cc7575f80fd5b83356001600160401b03811115614cdc575f80fd5b840160608187031215614ced575f80fd5b9250614cfb60208501614c8e565b9150614c5760408501614c9f565b5f60208284031215614d19575f80fd5b610bcf82614c12565b5f8060408385031215614d33575f80fd5b614d3c83614c12565b946020939093013593505050565b5f8060408385031215614d5b575f80fd5b82356001600160401b03811115614d70575f80fd5b830160808186031215614d81575f80fd5b9150614d8f60208401614c12565b90509250929050565b5f60208284031215614da8575f80fd5b610bcf82614c9f565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614de857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e2360608401826001600160401b03169052565b506080830151614e3e60808401826001600160401b03169052565b5060a0830151614e5960a08401826001600160401b03169052565b5060c0830151614e7460c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e7457614e74614e7b565b5f5b83811015614ec9578181015183820152602001614eb1565b50505f910152565b602081525f8251806020840152614eef816040850160208701614eaf565b601f01601f19169190910160400192915050565b5f60208284031215614f13575f80fd5b5051919050565b5f82614f3457634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461222f575f80fd5b5f60208284031215614fe8575f80fd5b8135610bcf81614fc4565b5f808335601e19843603018112615008575f80fd5b8301803591506001600160401b03821115615021575f80fd5b6020019150600581901b3603821315615038575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615067575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150a7576150a7615071565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150d5576150d5615071565b604052919050565b5f6001600160401b038211156150f5576150f5615071565b50601f01601f191660200190565b5f60608236031215615113575f80fd5b61511b615085565b82358152602061512c818501614c9f565b8183015260408401356001600160401b03811115615148575f80fd5b840136601f820112615158575f80fd5b803561516b615166826150dd565b6150ad565b818152368483850101111561517e575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615281818460208a01614eaf565b80830190508581526001600160401b0360c01b8560c01b16602082015283516152b1816028840160208801614eaf565b016028019695505050505050565b5f8251615067818460208701614eaf565b80820180821115610b9c57610b9c614e7b565b5f63ffffffff8083168181036152fb576152fb614e7b565b6001019392505050565b8082028115828204841417610b9c57610b9c614e7b565b6001600160401b03818116838216019080821115614e7457614e74614e7b565b600181811c9082168061535057607f821691505b602082108103614c8857634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546153c78161533c565b806020870152604060018084165f81146153e8576001811461540457615431565b60ff19851660408a0152604084151560051b8a01019550615431565b895f5260205f205f5b858110156154285781548b820186015290830190880161540d565b8a016040019650505b509398975050505050505050565b8051611e0181614c05565b5f806040838503121561545b575f80fd5b82516001600160401b0380821115615471575f80fd5b9084019060608287031215615484575f80fd5b61548c615085565b8251815260208084015161549f81614fc4565b828201526040840151838111156154b4575f80fd5b80850194505087601f8501126154c8575f80fd5b835192506154d8615166846150dd565b83815288828587010111156154eb575f80fd5b6154fa84838301848801614eaf565b8060408401525081955061550f81880161543f565b9450505050509250929050565b5f6001600160401b038083168181036152fb576152fb614e7b565b81810381811115610b9c57610b9c614e7b565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461568b5761568b614e7b565b505092915050565b5f602082840312156156a3575f80fd5b610bcf82614c8e565b5f602082840312156156bc575f80fd5b813560ff81168114610bcf575f80fd5b5f808335601e198436030181126156e1575f80fd5b8301803591506001600160401b038211156156fa575f80fd5b602001915036819003821315615038575f80fd5b601f821115611dd057805f5260205f20601f840160051c810160208510156157335750805b601f840160051c820191505b8181101561164f575f815560010161573f565b81516001600160401b0381111561576b5761576b615071565b61577f81615779845461533c565b8461570e565b602080601f8311600181146157b2575f841561579b5750858301515b5f19600386901b1c1916600185901b178555615809565b5f85815260208120601f198616915b828110156157e0578886015182559484019460019091019084016157c1565b50858210156157fd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index a3ddb9933..d645fc38f 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -73,7 +73,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516139d33803806139d383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138868061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80638da5cb5b1161009e578063bee0a03f1161006e578063bee0a03f14610267578063c974d1b61461027a578063d5f20ff614610294578063df93d8de146102b4578063f2fde38b146102be575f80fd5b80638da5cb5b146101ef57806397fb70d414610233578063a3a65e4814610246578063b771b3bc14610259575f80fd5b806361e2f490116100d957806361e2f4901461019657806366435abf146101a9578063715018a6146101d45780638994ab49146101dc575f80fd5b80630322ed981461010a5780630cdd09851461011f578063467ef06f14610170578063580a400614610183575b5f80fd5b61011d610118366004612da3565b6102d1565b005b61015d61012d366004612da3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011d61017e366004612dd2565b61048f565b61011d610191366004612e15565b61049d565b61011d6101a4366004612e4b565b6105ab565b6101bc6101b7366004612da3565b610cf7565b6040516001600160401b039091168152602001610167565b61011d610d0b565b61015d6101ea366004612eab565b610d1e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610167565b61011d610241366004612da3565b610d3a565b61011d610254366004612dd2565b610d4e565b61021b6005600160991b0181565b61011d610275366004612da3565b610f06565b610282601481565b60405160ff9091168152602001610167565b6102a76102a2366004612da3565b611015565b6040516101679190612f04565b6101bc6202a30081565b61011d6102cc366004612fba565b611108565b5f8181525f8051602061385a8339815191526020526040808220815160e0810190925280545f8051602061383a83398151915293929190829060ff16600581111561031e5761031e612ef0565b600581111561032f5761032f612ef0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561039e5761039e612ef0565b146104085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042d8584606001515f611142565b6040518263ffffffff1660e01b81526004016104499190612ffe565b6020604051808303815f875af1158015610465573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104899190613030565b50505050565b61049881611367565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104e15750825b90505f826001600160401b031660011480156104fc5750303b155b90508115801561050a575080155b156105285760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561055257845460ff60401b1916600160401b1785555b61055c87876116df565b83156105a257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f8051602061383a8339815191529060ff16156106485760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103ff565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af9190613030565b8360200135146107115760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103ff565b306107226060850160408601612fba565b6001600160a01b0316146107945760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103ff565b5f6107a26060850185613047565b9050116108015760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103ff565b5f61080f6060850185613047565b91505063ffffffff811061087b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103ff565b5f8435602086013560146108956060890160408a01612fba565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610c07575f6109156060890189613047565b8363ffffffff1681811061092b5761092b613093565b905060200281019061093d91906130a7565b61094690613157565b8051909150806109685760405162461bcd60e51b81526004016103ff906131ee565b5f818152600988016020526040902054156109955760405162461bcd60e51b81526004016103ff9061322f565b8160400151516030146109ba5760405162461bcd60e51b81526004016103ff90613277565b84825f0151836020015184604001516040516020016109dc94939291906132c4565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610a2a9190613313565b602060405180830381855afa158015610a45573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a689190613030565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610af457610af4612ef0565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610ba7911686613338565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508080610bff9061334b565b9150506108f9565b50600584018190555f610c19866116fd565b90505f610c2982604001516118d7565b905080600285604051610c3c9190613313565b602060405180830381855afa158015610c57573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c7a9190613030565b14610cde5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103ff565b505050600a909201805460ff1916600117905550505050565b5f610d0182611015565b6080015192915050565b610d13611a40565b610d1c5f611a9b565b565b5f610d27611a40565b610d318383611b0b565b90505b92915050565b610d42611a40565b610d4b81611fef565b50565b5f8051602061383a8339815191525f610d66836116fd565b90505f80610d7783604001516122e5565b9150915080610dd95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103ff565b5f82815260078501602052604081208054610df39061336d565b9050118015610e25575060015f83815260088601602052604090205460ff166005811115610e2357610e23612ef0565b145b610e415760405162461bcd60e51b81526004016103ff9061339f565b5f8281526007850160205260408120610e5991612d59565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061383a833981519152929190610f4e9061336d565b9050118015610f80575060015f83815260088301602052604090205460ff166005811115610f7e57610f7e612ef0565b145b610f9c5760405162461bcd60e51b81526004016103ff9061339f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610fd591906004016133e6565b6020604051808303815f875af1158015610ff1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104989190613030565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061385a83398151915290528390208351918201909352825491925f8051602061383a83398151915292829060ff16600581111561109557611095612ef0565b60058111156110a6576110a6612ef0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611110611a40565b6001600160a01b03811661113957604051631e4fbdf760e01b81525f60048201526024016103ff565b610d4b81611a9b565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156111bb5761117b816001613470565b611186906008613483565b5081515f9083908390811061119d5761119d613093565b60200101906001600160f81b03191690815f1a905350600101611167565b505f5b6004811015611226576111d2816003613470565b6111dd906008613483565b600263ffffffff16901c60f81b828260026111f89190613338565b8151811061120857611208613093565b60200101906001600160f81b03191690815f1a9053506001016111be565b505f5b60208110156112885761123d81601f613470565b611248906008613483565b86901c60f81b8261125a836006613338565b8151811061126a5761126a613093565b60200101906001600160f81b03191690815f1a905350600101611229565b505f5b60088110156112f35761129f816007613470565b6112aa906008613483565b6001600160401b038616901c60f81b826112c5836026613338565b815181106112d5576112d5613093565b60200101906001600160f81b03191690815f1a90535060010161128b565b505f5b600881101561135e5761130a816007613470565b611315906008613483565b6001600160401b038516901c60f81b8261133083602e613338565b8151811061134057611340613093565b60200101906001600160f81b03191690815f1a9053506001016112f6565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061383a8339815191525f6113b6856116fd565b90505f806113c783604001516122e5565b91509150801561142c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103ff565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561145d5761145d612ef0565b600581111561146e5761146e612ef0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156114df576114df612ef0565b14806114fd57506001825160058111156114fb576114fb612ef0565b145b61155c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103ff565b60038251600581111561157157611571612ef0565b0361157e57506004611582565b5060055b6020808301515f908152600988019091526040812055818160058111156115ab576115ab612ef0565b908160058111156115be576115be612ef0565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156115f2576115f2612ef0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156116a6576116a6612ef0565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6116e7612486565b6116f0826124cf565b6116f9816124e8565b5050565b60408051606080820183525f8083526020830181905292820152905f8051602061383a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611772573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261179991908101906134a9565b91509150806117f95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103ff565b825482511461185c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103ff565b60208201516001600160a01b0316156118cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103ff565b509392505050565b5f81516026146118f95760405162461bcd60e51b81526004016103ff9061357b565b5f805b600281101561194857611910816001613470565b61191b906008613483565b61ffff1684828151811061193157611931613093565b016020015160f81c901b91909117906001016118fc565b5061ffff81161561196b5760405162461bcd60e51b81526004016103ff906135c4565b5f805b60048110156119c657611982816003613470565b61198d906008613483565b63ffffffff168561199f836002613338565b815181106119af576119af613093565b016020015160f81c901b919091179060010161196e565b5063ffffffff8116156119eb5760405162461bcd60e51b81526004016103ff90613607565b5f805b602081101561135e57611a0281601f613470565b611a0d906008613483565b86611a19836006613338565b81518110611a2957611a29613093565b016020015160f81c901b91909117906001016119ee565b33611a727f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d1c5760405163118cdaa760e01b81523360048201526024016103ff565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611b965760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103ff565b5f8051602061383a83398151915242611bb5604086016020870161364e565b6001600160401b031611611c275760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103ff565b611c37604085016020860161364e565b6001600160401b0316611c4d6202a30042613338565b11611cc05760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103ff565b8335611cde5760405162461bcd60e51b81526004016103ff906131ee565b83355f90815260098201602052604090205415611d0d5760405162461bcd60e51b81526004016103ff9061322f565b611d1a6040850185613667565b9050603014611d3b5760405162461bcd60e51b81526004016103ff90613277565b611d44836124f9565b5f80611dde6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611d89919061364e565b6001600160401b03168152602001611da460408a018a613667565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612504565b5f82815260078601602052604090209193509150611dfc82826136f4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e29908590600401612ffe565b6020604051808303815f875af1158015611e45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e699190613030565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611ee157611ee1612ef0565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611fc1918e01908e0161364e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f8051602061385a8339815191526020526040808220815160e0810190925280545f8051602061383a83398151915293929190829060ff16600581111561203c5761203c612ef0565b600581111561204d5761204d612ef0565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156120bf576120bf612ef0565b1461211b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103ff565b61212881608001516128b3565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561216c5761216c612ef0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6122218461221b816128bd565b5f611142565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612250908590600401612ffe565b6020604051808303815f875af115801561226c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122909190613030565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146123085760405162461bcd60e51b81526004016103ff9061357b565b5f805b60028110156123575761231f816001613470565b61232a906008613483565b61ffff1685828151811061234057612340613093565b016020015160f81c901b919091179060010161230b565b5061ffff81161561237a5760405162461bcd60e51b81526004016103ff906135c4565b5f805b60048110156123d557612391816003613470565b61239c906008613483565b63ffffffff16866123ae836002613338565b815181106123be576123be613093565b016020015160f81c901b919091179060010161237d565b5063ffffffff81166003146123fc5760405162461bcd60e51b81526004016103ff90613607565b5f805b60208110156124515761241381601f613470565b61241e906008613483565b8761242a836006613338565b8151811061243a5761243a613093565b016020015160f81c901b91909117906001016123ff565b505f8660268151811061246657612466613093565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d1c57604051631afcd79f60e31b815260040160405180910390fd5b6124d7612486565b6124df61294d565b610d4b81612955565b6124f0612486565b610d4b81612af7565b610d4b816001612aff565b5f606082608001515160301461256e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103ff565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156125e5576125a5816001613470565b6125b0906008613483565b5081515f908390839081106125c7576125c7613093565b60200101906001600160f81b03191690815f1a905350600101612591565b505f5b600481101561264d576125fc816003613470565b612607906008613483565b600160ff919091161c60f81b8261261f836002613338565b8151811061262f5761262f613093565b60200101906001600160f81b03191690815f1a9053506001016125e8565b505f5b60208110156126aa578451816020811061266c5761266c613093565b1a60f81b8261267c836006613338565b8151811061268c5761268c613093565b60200101906001600160f81b03191690815f1a905350600101612650565b505f5b602081101561270a57846020015181602081106126cc576126cc613093565b1a60f81b826126dc836026613338565b815181106126ec576126ec613093565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b600881101561277e57612721816007613470565b61272c906008613483565b60ff1685604001516001600160401b0316901c60f81b828260466127509190613338565b8151811061276057612760613093565b60200101906001600160f81b03191690815f1a90535060010161270d565b505f5b60308110156127e957846080015181815181106127a0576127a0613093565b01602001516001600160f81b031916826127bb83604e613338565b815181106127cb576127cb613093565b60200101906001600160f81b03191690815f1a905350600101612781565b505f5b600881101561285b57612800816007613470565b61280b906008613483565b60608601516001600160401b0390811691161c60f81b8261282d83607e613338565b8151811061283d5761283d613093565b60200101906001600160f81b03191690815f1a9053506001016127ec565b5060028160405161286c9190613313565b602060405180830381855afa158015612887573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128aa9190613030565b94909350915050565b610d4b815f612aff565b5f8181525f8051602061385a8339815191526020526040812060020180545f8051602061383a83398151915291600160401b9091046001600160401b0316906008612907836137b3565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b610d1c612486565b61295d612486565b80355f8051602061383a83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146129a960808401606085016137ce565b60ff161115612a165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103ff565b5f612a2760808401606085016137ce565b60ff1611612a8f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103ff565b612a9f60808301606084016137ce565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612ad0606083016040840161364e565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b611110612486565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061383a833981519152914291901580612be5575060028301548151612be1916001600160401b031690613338565b8210155b15612c0b576001600160401b038516606082015281815260408101516020820152612c2a565b8481606001818151612c1d91906137ee565b6001600160401b03169052505b6060810151612c3a90606461380e565b602082015160028501546001600160401b039290921691612c659190600160401b900460ff16613483565b1015612cc95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103ff565b8315612cf257846001600160401b031681604001818151612cea9190613338565b905250612d11565b846001600160401b031681604001818151612d0d9190613470565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b508054612d659061336d565b5f825580601f10612d74575050565b601f0160209004905f5260205f2090810190610d4b91905b80821115612d9f575f8155600101612d8c565b5090565b5f60208284031215612db3575f80fd5b5035919050565b803563ffffffff81168114612dcd575f80fd5b919050565b5f60208284031215612de2575f80fd5b610d3182612dba565b5f60808284031215612dfb575f80fd5b50919050565b6001600160a01b0381168114610d4b575f80fd5b5f8060a08385031215612e26575f80fd5b612e308484612deb565b91506080830135612e4081612e01565b809150509250929050565b5f8060408385031215612e5c575f80fd5b82356001600160401b03811115612e71575f80fd5b612e7d85828601612deb565b925050612e8c60208401612dba565b90509250929050565b80356001600160401b0381168114612dcd575f80fd5b5f8060408385031215612ebc575f80fd5b82356001600160401b03811115612ed1575f80fd5b830160608186031215612ee2575f80fd5b9150612e8c60208401612e95565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f2757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f6260608401826001600160401b03169052565b506080830151612f7d60808401826001600160401b03169052565b5060a0830151612f9860a08401826001600160401b03169052565b5060c0830151612fb360c08401826001600160401b03169052565b5092915050565b5f60208284031215612fca575f80fd5b8135612fd581612e01565b9392505050565b5f5b83811015612ff6578181015183820152602001612fde565b50505f910152565b602081525f825180602084015261301c816040850160208701612fdc565b601f01601f19169190910160400192915050565b5f60208284031215613040575f80fd5b5051919050565b5f808335601e1984360301811261305c575f80fd5b8301803591506001600160401b03821115613075575f80fd5b6020019150600581901b360382131561308c575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130bb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130fb576130fb6130c5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613129576131296130c5565b604052919050565b5f6001600160401b03821115613149576131496130c5565b50601f01601f191660200190565b5f60608236031215613167575f80fd5b61316f6130d9565b823581526020613180818501612e95565b8183015260408401356001600160401b0381111561319c575f80fd5b840136601f8201126131ac575f80fd5b80356131bf6131ba82613131565b613101565b81815236848385010111156131d2575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516132d5818460208a01612fdc565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613305816028840160208801612fdc565b016028019695505050505050565b5f82516130bb818460208701612fdc565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d3457610d34613324565b5f63ffffffff80831681810361336357613363613324565b6001019392505050565b600181811c9082168061338157607f821691505b602082108103612dfb57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546133f88161336d565b806020870152604060018084165f8114613419576001811461343557613462565b60ff19851660408a0152604084151560051b8a01019550613462565b895f5260205f205f5b858110156134595781548b820186015290830190880161343e565b8a016040019650505b509398975050505050505050565b81810381811115610d3457610d34613324565b8082028115828204841417610d3457610d34613324565b80518015158114612dcd575f80fd5b5f80604083850312156134ba575f80fd5b82516001600160401b03808211156134d0575f80fd5b90840190606082870312156134e3575f80fd5b6134eb6130d9565b825181526020808401516134fe81612e01565b82820152604084015183811115613513575f80fd5b80850194505087601f850112613527575f80fd5b835192506135376131ba84613131565b838152888285870101111561354a575f80fd5b61355984838301848801612fdc565b8060408401525081955061356e81880161349a565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561365e575f80fd5b610d3182612e95565b5f808335601e1984360301811261367c575f80fd5b8301803591506001600160401b03821115613695575f80fd5b60200191503681900382131561308c575f80fd5b601f82111561049857805f5260205f20601f840160051c810160208510156136ce5750805b601f840160051c820191505b818110156136ed575f81556001016136da565b5050505050565b81516001600160401b0381111561370d5761370d6130c5565b6137218161371b845461336d565b846136a9565b602080601f831160018114613754575f841561373d5750858301515b5f19600386901b1c1916600185901b1785556137ab565b5f85815260208120601f198616915b8281101561378257888601518255948401946001909101908401613763565b508582101561379f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b0380831681810361336357613363613324565b5f602082840312156137de575f80fd5b813560ff81168114612fd5575f80fd5b6001600160401b03818116838216019080821115612fb357612fb3613324565b6001600160401b0381811683821602808216919082811461383157613831613324565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516139d13803806139d183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138848061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80638da5cb5b1161009e578063bee0a03f1161006e578063bee0a03f14610267578063c974d1b61461027a578063d5f20ff614610294578063df93d8de146102b4578063f2fde38b146102be575f80fd5b80638da5cb5b146101ef57806397fb70d414610233578063a3a65e4814610246578063b771b3bc14610259575f80fd5b806361e2f490116100d957806361e2f4901461019657806366435abf146101a9578063715018a6146101d45780638994ab49146101dc575f80fd5b80630322ed981461010a5780630cdd09851461011f578063467ef06f14610170578063580a400614610183575b5f80fd5b61011d610118366004612da1565b6102d1565b005b61015d61012d366004612da1565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011d61017e366004612dd0565b61048f565b61011d610191366004612e13565b61049d565b61011d6101a4366004612e49565b6105ab565b6101bc6101b7366004612da1565b610cf5565b6040516001600160401b039091168152602001610167565b61011d610d09565b61015d6101ea366004612ea9565b610d1c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610167565b61011d610241366004612da1565b610d38565b61011d610254366004612dd0565b610d4c565b61021b6005600160991b0181565b61011d610275366004612da1565b610f04565b610282601481565b60405160ff9091168152602001610167565b6102a76102a2366004612da1565b611013565b6040516101679190612f02565b6101bc6202a30081565b61011d6102cc366004612fb8565b611106565b5f8181525f805160206138588339815191526020526040808220815160e0810190925280545f8051602061383883398151915293929190829060ff16600581111561031e5761031e612eee565b600581111561032f5761032f612eee565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561039e5761039e612eee565b146104085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042d8584606001515f611140565b6040518263ffffffff1660e01b81526004016104499190612ffc565b6020604051808303815f875af1158015610465573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610489919061302e565b50505050565b61049881611365565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104e15750825b90505f826001600160401b031660011480156104fc5750303b155b90508115801561050a575080155b156105285760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561055257845460ff60401b1916600160401b1785555b61055c87876116dd565b83156105a257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206138388339815191529060ff16156106485760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103ff565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af919061302e565b8360200135146107115760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103ff565b306107226060850160408601612fb8565b6001600160a01b0316146107945760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103ff565b5f6107a26060850185613045565b9050116108015760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103ff565b5f61080f6060850185613045565b91505063ffffffff811061087b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103ff565b5f8435602086013560146108956060890160408a01612fb8565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610c05575f6109156060890189613045565b8363ffffffff1681811061092b5761092b613091565b905060200281019061093d91906130a5565b61094690613155565b8051909150806109685760405162461bcd60e51b81526004016103ff906131ec565b5f818152600988016020526040902054156109955760405162461bcd60e51b81526004016103ff9061322d565b8160400151516030146109ba5760405162461bcd60e51b81526004016103ff90613275565b84825f0151836020015184604001516040516020016109dc94939291906132c2565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610a2a9190613311565b602060405180830381855afa158015610a45573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a68919061302e565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610af457610af4612eee565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610ba7911686613336565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610bfe90613349565b90506108f9565b50600584018190555f610c17866116fb565b90505f610c2782604001516118d5565b905080600285604051610c3a9190613311565b602060405180830381855afa158015610c55573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c78919061302e565b14610cdc5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103ff565b505050600a909201805460ff1916600117905550505050565b5f610cff82611013565b6080015192915050565b610d11611a3e565b610d1a5f611a99565b565b5f610d25611a3e565b610d2f8383611b09565b90505b92915050565b610d40611a3e565b610d4981611fed565b50565b5f805160206138388339815191525f610d64836116fb565b90505f80610d7583604001516122e3565b9150915080610dd75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103ff565b5f82815260078501602052604081208054610df19061336b565b9050118015610e23575060015f83815260088601602052604090205460ff166005811115610e2157610e21612eee565b145b610e3f5760405162461bcd60e51b81526004016103ff9061339d565b5f8281526007850160205260408120610e5791612d57565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020613838833981519152929190610f4c9061336b565b9050118015610f7e575060015f83815260088301602052604090205460ff166005811115610f7c57610f7c612eee565b145b610f9a5760405162461bcd60e51b81526004016103ff9061339d565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610fd391906004016133e4565b6020604051808303815f875af1158015610fef573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610498919061302e565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061385883398151915290528390208351918201909352825491925f8051602061383883398151915292829060ff16600581111561109357611093612eee565b60058111156110a4576110a4612eee565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b61110e611a3e565b6001600160a01b03811661113757604051631e4fbdf760e01b81525f60048201526024016103ff565b610d4981611a99565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156111b95761117981600161346e565b611184906008613481565b5081515f9083908390811061119b5761119b613091565b60200101906001600160f81b03191690815f1a905350600101611165565b505f5b6004811015611224576111d081600361346e565b6111db906008613481565b600263ffffffff16901c60f81b828260026111f69190613336565b8151811061120657611206613091565b60200101906001600160f81b03191690815f1a9053506001016111bc565b505f5b60208110156112865761123b81601f61346e565b611246906008613481565b86901c60f81b82611258836006613336565b8151811061126857611268613091565b60200101906001600160f81b03191690815f1a905350600101611227565b505f5b60088110156112f15761129d81600761346e565b6112a8906008613481565b6001600160401b038616901c60f81b826112c3836026613336565b815181106112d3576112d3613091565b60200101906001600160f81b03191690815f1a905350600101611289565b505f5b600881101561135c5761130881600761346e565b611313906008613481565b6001600160401b038516901c60f81b8261132e83602e613336565b8151811061133e5761133e613091565b60200101906001600160f81b03191690815f1a9053506001016112f4565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206138388339815191525f6113b4856116fb565b90505f806113c583604001516122e3565b91509150801561142a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103ff565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561145b5761145b612eee565b600581111561146c5761146c612eee565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156114dd576114dd612eee565b14806114fb57506001825160058111156114f9576114f9612eee565b145b61155a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103ff565b60038251600581111561156f5761156f612eee565b0361157c57506004611580565b5060055b6020808301515f908152600988019091526040812055818160058111156115a9576115a9612eee565b908160058111156115bc576115bc612eee565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156115f0576115f0612eee565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156116a4576116a4612eee565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6116e5612484565b6116ee826124cd565b6116f7816124e6565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206138388339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611770573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261179791908101906134a7565b91509150806117f75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103ff565b825482511461185a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103ff565b60208201516001600160a01b0316156118cd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103ff565b509392505050565b5f81516026146118f75760405162461bcd60e51b81526004016103ff90613579565b5f805b60028110156119465761190e81600161346e565b611919906008613481565b61ffff1684828151811061192f5761192f613091565b016020015160f81c901b91909117906001016118fa565b5061ffff8116156119695760405162461bcd60e51b81526004016103ff906135c2565b5f805b60048110156119c45761198081600361346e565b61198b906008613481565b63ffffffff168561199d836002613336565b815181106119ad576119ad613091565b016020015160f81c901b919091179060010161196c565b5063ffffffff8116156119e95760405162461bcd60e51b81526004016103ff90613605565b5f805b602081101561135c57611a0081601f61346e565b611a0b906008613481565b86611a17836006613336565b81518110611a2757611a27613091565b016020015160f81c901b91909117906001016119ec565b33611a707f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d1a5760405163118cdaa760e01b81523360048201526024016103ff565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611b945760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103ff565b5f8051602061383883398151915242611bb3604086016020870161364c565b6001600160401b031611611c255760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103ff565b611c35604085016020860161364c565b6001600160401b0316611c4b6202a30042613336565b11611cbe5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103ff565b8335611cdc5760405162461bcd60e51b81526004016103ff906131ec565b83355f90815260098201602052604090205415611d0b5760405162461bcd60e51b81526004016103ff9061322d565b611d186040850185613665565b9050603014611d395760405162461bcd60e51b81526004016103ff90613275565b611d42836124f7565b5f80611ddc6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611d87919061364c565b6001600160401b03168152602001611da260408a018a613665565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612502565b5f82815260078601602052604090209193509150611dfa82826136f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e27908590600401612ffc565b6020604051808303815f875af1158015611e43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e67919061302e565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611edf57611edf612eee565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611fbf918e01908e0161364c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206138588339815191526020526040808220815160e0810190925280545f8051602061383883398151915293929190829060ff16600581111561203a5761203a612eee565b600581111561204b5761204b612eee565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156120bd576120bd612eee565b146121195760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103ff565b61212681608001516128b1565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561216a5761216a612eee565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61221f84612219816128bb565b5f611140565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061224e908590600401612ffc565b6020604051808303815f875af115801561226a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228e919061302e565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146123065760405162461bcd60e51b81526004016103ff90613579565b5f805b60028110156123555761231d81600161346e565b612328906008613481565b61ffff1685828151811061233e5761233e613091565b016020015160f81c901b9190911790600101612309565b5061ffff8116156123785760405162461bcd60e51b81526004016103ff906135c2565b5f805b60048110156123d35761238f81600361346e565b61239a906008613481565b63ffffffff16866123ac836002613336565b815181106123bc576123bc613091565b016020015160f81c901b919091179060010161237b565b5063ffffffff81166003146123fa5760405162461bcd60e51b81526004016103ff90613605565b5f805b602081101561244f5761241181601f61346e565b61241c906008613481565b87612428836006613336565b8151811061243857612438613091565b016020015160f81c901b91909117906001016123fd565b505f8660268151811061246457612464613091565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d1a57604051631afcd79f60e31b815260040160405180910390fd5b6124d5612484565b6124dd61294b565b610d4981612953565b6124ee612484565b610d4981612af5565b610d49816001612afd565b5f606082608001515160301461256c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103ff565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156125e3576125a381600161346e565b6125ae906008613481565b5081515f908390839081106125c5576125c5613091565b60200101906001600160f81b03191690815f1a90535060010161258f565b505f5b600481101561264b576125fa81600361346e565b612605906008613481565b600160ff919091161c60f81b8261261d836002613336565b8151811061262d5761262d613091565b60200101906001600160f81b03191690815f1a9053506001016125e6565b505f5b60208110156126a8578451816020811061266a5761266a613091565b1a60f81b8261267a836006613336565b8151811061268a5761268a613091565b60200101906001600160f81b03191690815f1a90535060010161264e565b505f5b602081101561270857846020015181602081106126ca576126ca613091565b1a60f81b826126da836026613336565b815181106126ea576126ea613091565b60200101906001600160f81b03191690815f1a9053506001016126ab565b505f5b600881101561277c5761271f81600761346e565b61272a906008613481565b60ff1685604001516001600160401b0316901c60f81b8282604661274e9190613336565b8151811061275e5761275e613091565b60200101906001600160f81b03191690815f1a90535060010161270b565b505f5b60308110156127e7578460800151818151811061279e5761279e613091565b01602001516001600160f81b031916826127b983604e613336565b815181106127c9576127c9613091565b60200101906001600160f81b03191690815f1a90535060010161277f565b505f5b6008811015612859576127fe81600761346e565b612809906008613481565b60608601516001600160401b0390811691161c60f81b8261282b83607e613336565b8151811061283b5761283b613091565b60200101906001600160f81b03191690815f1a9053506001016127ea565b5060028160405161286a9190613311565b602060405180830381855afa158015612885573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128a8919061302e565b94909350915050565b610d49815f612afd565b5f8181525f805160206138588339815191526020526040812060020180545f8051602061383883398151915291600160401b9091046001600160401b0316906008612905836137b1565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b610d1a612484565b61295b612484565b80355f8051602061383883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146129a760808401606085016137cc565b60ff161115612a145760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103ff565b5f612a2560808401606085016137cc565b60ff1611612a8d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103ff565b612a9d60808301606084016137cc565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612ace606083016040840161364c565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61110e612484565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020613838833981519152914291901580612be3575060028301548151612bdf916001600160401b031690613336565b8210155b15612c09576001600160401b038516606082015281815260408101516020820152612c28565b8481606001818151612c1b91906137ec565b6001600160401b03169052505b6060810151612c3890606461380c565b602082015160028501546001600160401b039290921691612c639190600160401b900460ff16613481565b1015612cc75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103ff565b8315612cf057846001600160401b031681604001818151612ce89190613336565b905250612d0f565b846001600160401b031681604001818151612d0b919061346e565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b508054612d639061336b565b5f825580601f10612d72575050565b601f0160209004905f5260205f2090810190610d4991905b80821115612d9d575f8155600101612d8a565b5090565b5f60208284031215612db1575f80fd5b5035919050565b803563ffffffff81168114612dcb575f80fd5b919050565b5f60208284031215612de0575f80fd5b610d2f82612db8565b5f60808284031215612df9575f80fd5b50919050565b6001600160a01b0381168114610d49575f80fd5b5f8060a08385031215612e24575f80fd5b612e2e8484612de9565b91506080830135612e3e81612dff565b809150509250929050565b5f8060408385031215612e5a575f80fd5b82356001600160401b03811115612e6f575f80fd5b612e7b85828601612de9565b925050612e8a60208401612db8565b90509250929050565b80356001600160401b0381168114612dcb575f80fd5b5f8060408385031215612eba575f80fd5b82356001600160401b03811115612ecf575f80fd5b830160608186031215612ee0575f80fd5b9150612e8a60208401612e93565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f2557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f6060608401826001600160401b03169052565b506080830151612f7b60808401826001600160401b03169052565b5060a0830151612f9660a08401826001600160401b03169052565b5060c0830151612fb160c08401826001600160401b03169052565b5092915050565b5f60208284031215612fc8575f80fd5b8135612fd381612dff565b9392505050565b5f5b83811015612ff4578181015183820152602001612fdc565b50505f910152565b602081525f825180602084015261301a816040850160208701612fda565b601f01601f19169190910160400192915050565b5f6020828403121561303e575f80fd5b5051919050565b5f808335601e1984360301811261305a575f80fd5b8301803591506001600160401b03821115613073575f80fd5b6020019150600581901b360382131561308a575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130b9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130f9576130f96130c3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613127576131276130c3565b604052919050565b5f6001600160401b03821115613147576131476130c3565b50601f01601f191660200190565b5f60608236031215613165575f80fd5b61316d6130d7565b82358152602061317e818501612e93565b8183015260408401356001600160401b0381111561319a575f80fd5b840136601f8201126131aa575f80fd5b80356131bd6131b88261312f565b6130ff565b81815236848385010111156131d0575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516132d3818460208a01612fda565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613303816028840160208801612fda565b016028019695505050505050565b5f82516130b9818460208701612fda565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d3257610d32613322565b5f63ffffffff80831681810361336157613361613322565b6001019392505050565b600181811c9082168061337f57607f821691505b602082108103612df957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546133f68161336b565b806020870152604060018084165f8114613417576001811461343357613460565b60ff19851660408a0152604084151560051b8a01019550613460565b895f5260205f205f5b858110156134575781548b820186015290830190880161343c565b8a016040019650505b509398975050505050505050565b81810381811115610d3257610d32613322565b8082028115828204841417610d3257610d32613322565b80518015158114612dcb575f80fd5b5f80604083850312156134b8575f80fd5b82516001600160401b03808211156134ce575f80fd5b90840190606082870312156134e1575f80fd5b6134e96130d7565b825181526020808401516134fc81612dff565b82820152604084015183811115613511575f80fd5b80850194505087601f850112613525575f80fd5b835192506135356131b88461312f565b8381528882858701011115613548575f80fd5b61355784838301848801612fda565b8060408401525081955061356c818801613498565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561365c575f80fd5b610d2f82612e93565b5f808335601e1984360301811261367a575f80fd5b8301803591506001600160401b03821115613693575f80fd5b60200191503681900382131561308a575f80fd5b601f82111561049857805f5260205f20601f840160051c810160208510156136cc5750805b601f840160051c820191505b818110156136eb575f81556001016136d8565b5050505050565b81516001600160401b0381111561370b5761370b6130c3565b61371f81613719845461336b565b846136a7565b602080601f831160018114613752575f841561373b5750858301515b5f19600386901b1c1916600185901b1785556137a9565b5f85815260208120601f198616915b8281101561378057888601518255948401946001909101908401613761565b508582101561379d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b0380831681810361336157613361613322565b5f602082840312156137dc575f80fd5b813560ff81168114612fd3575f80fd5b6001600160401b03818116838216019080821115612fb157612fb1613322565b6001600160401b0381811683821602808216919082811461382f5761382f613322565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index b4d11e6d1..858c91f4d 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -150,7 +150,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida uint32(numInitialValidators) ); uint256 totalWeight; - for (uint32 i; i < numInitialValidators; i++) { + for (uint32 i; i < numInitialValidators; ++i) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; bytes32 nodeID = initialValidator.nodeID; require(nodeID != bytes32(0), "ValidatorManager: invalid node ID"); From 15d9fbdbc7c431bab41875a66f242e1ee82e4f53 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 17 Sep 2024 16:58:24 -0400 Subject: [PATCH 316/545] Account for validation ending before delegation --- .../ERC20TokenStakingManager.go | 198 +++++++++++++++--- .../NativeTokenStakingManager.go | 198 +++++++++++++++--- contracts/staking/PoSValidatorManager.sol | 55 ++--- .../interfaces/IPoSValidatorManager.sol | 16 +- .../tests/PoSValidatorManagerTests.t.sol | 17 +- 5 files changed, 396 insertions(+), 88 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 11cd94930..3c3f566f2 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -75,8 +75,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516152bd3803806152bd83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151708061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f366004614673565b610357565b005b6101546101643660046146ae565b6107e8565b6101a76101773660046146ae565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e23660046146ae565b6109b8565b6040516001600160401b0390911681526020016101b1565b61015461020d3660046146d9565b6109ce565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c366004614717565b610aad565b61015461024f366004614730565b610ad8565b6101a761026236600461476c565b610ca8565b6101e76102753660046146ae565b610cc1565b610154610288366004614673565b610cd5565b61015461029b366004614730565b610db5565b6101a76102ae366004614787565b610fc4565b6101a76102c13660046147a7565b610fd7565b6101546102d4366004614717565b611003565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d3660046146ae565b6111c0565b6101546103203660046146ae565b611446565b6101c2601481565b61034061033b3660046146ae565b61155a565b6040516101b1919061481c565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206150c48339815191529184156103a9576103a68285611639565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db614808565b60048111156103ec576103ec614808565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561047357610473614808565b146104c55760405162461bcd60e51b815260206004820152602a60248201525f805160206150e48339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461052a5760405162461bcd60e51b815260206004820152603360248201525f805160206150e48339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104bc565b5f610534846118d5565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561058157610581614808565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106538561155a565b905082606001516001600160401b03168160a001516001600160401b0316116106ca5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104bc565b6002815160058111156106df576106df614808565b036106f1576106f18360600151611957565b5f83606001518260a00151610706919061490a565b90506107128682611964565b5f6005600160991b0163ee5b48eb61072b8987866119ac565b6040518263ffffffff1660e01b8152600401610747919061494c565b6020604051808303815f875af1158015610763573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610787919061497e565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061514483398151915260205260408082208151610100810190925280545f8051602061510483398151915293929190829060ff16600581111561083657610836614808565b600581111561084757610847614808565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108cc576108cc614808565b146109315760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104bc565b6005600160991b016001600160a01b031663ee5b48eb6109568584608001515f6119ac565b6040518263ffffffff1660e01b8152600401610972919061494c565b6020604051808303815f875af115801561098e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b2919061497e565b50505050565b5f6109c864e8d4a5100083614995565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a17575080546001600160401b03808416911610155b15610a355760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a608484611bc9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610ab782611be3565b9050610ad481606001516001600160401b03168260400151611f56565b5050565b5f805160206150c48339815191525f610af084611f8c565b90505f80610b01836040015161216d565b50915091505f610b108361155a565b9050816001600160401b031681608001516001600160401b03161015610b485760405162461bcd60e51b81526004016104bc906149b4565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b8d5760405162461bcd60e51b81526004016104bc906149f6565b60015f87815260068701602052604090205460ff166004811115610bb357610bb3614808565b14610c1c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104bc565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109c86001600160401b03831664e8d4a51000614a3f565b5f610ccb8261155a565b60a0015192915050565b5f805160206150c48339815191525f610ced8561155a565b5f86815260058401602052604090205460c0820151919250610d1f91620100009091046001600160401b031690614a56565b6001600160401b0316421015610d935760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104bc565b8315610da557610da38584611639565b505b610dae856123a8565b5050505050565b5f805160206150c48339815191525f610dcd84611f8c565b90505f80610dde836040015161216d565b50915091505f610ded8361155a565b9050816001600160401b031681608001516001600160401b03161015610e255760405162461bcd60e51b81526004016104bc906149b4565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e635760405162461bcd60e51b81526004016104bc906149f6565b60035f87815260068701602052604090205460ff166004811115610e8957610e89614808565b14610edd5760405162461bcd60e51b815260206004820152603160248201525f805160206150e48339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104bc565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610f8291611f56565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610fd0833384612746565b9392505050565b5f610fe0612b44565b610feb848484612b7b565b9050610fd060015f8051602061512483398151915255565b5f805160206151048339815191525f61101b83611f8c565b90505f8061102c8360400151612db4565b915091508061108e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104bc565b5f828152600785016020526040812080546110a890614a76565b90501180156110da575060015f83815260088601602052604090205460ff1660058111156110d8576110d8614808565b145b6110f65760405162461bcd60e51b81526004016104bc90614aae565b5f828152600785016020526040812061110e916145bb565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206150c483398151915293929190829060ff16600481111561122157611221614808565b600481111561123257611232614808565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112b9576112b9614808565b14806112d757506003815160048111156112d5576112d5614808565b145b61132b5760405162461bcd60e51b815260206004820152603260248201525f805160206150e4833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104bc565b5f611339826040015161155a565b905080608001516001600160401b03165f036113bd5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104bc565b6005600160991b016001600160a01b031663ee5b48eb6113ea846040015184608001518560a001516119ac565b6040518263ffffffff1660e01b8152600401611406919061494c565b6020604051808303815f875af1158015611422573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dae919061497e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061510483398151915292919061148e90614a76565b90501180156114c0575060015f83815260088301602052604090205460ff1660058111156114be576114be614808565b145b6114dc5760405162461bcd60e51b81526004016104bc90614aae565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916115159190600401614af5565b6020604051808303815f875af1158015611531573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611555919061497e565b505050565b6115626145f2565b5f8281525f805160206151448339815191526020526040908190208151610100810190925280545f80516020615104833981519152929190829060ff1660058111156115b0576115b0614808565b60058111156115c1576115c1614808565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611684573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116ab9190810190614bf6565b915091508061170e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104bc565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611751573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611775919061497e565b8251146117d95760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104bc565b60208201516001600160a01b03161561184f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104bc565b5f8061185e8460400151612f55565b915091508187146118cb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104bc565b9695505050505050565b5f8181525f805160206151448339815191526020526040812060030180545f80516020615104833981519152916001600160401b03909116908361191883614cde565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611961815f61312d565b50565b5f9182525f80516020615144833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a25576119e5816001614d03565b6119f0906008614a3f565b5081515f90839083908110611a0757611a07614d16565b60200101906001600160f81b03191690815f1a9053506001016119d1565b505f5b6004811015611a8857611a3c816003614d03565b611a47906008614a3f565b6001901c60f81b82611a5a836002614d2a565b81518110611a6a57611a6a614d16565b60200101906001600160f81b03191690815f1a905350600101611a28565b505f5b6020811015611aea57611a9f81601f614d03565b611aaa906008614a3f565b86901c60f81b82611abc836006614d2a565b81518110611acc57611acc614d16565b60200101906001600160f81b03191690815f1a905350600101611a8b565b505f5b6008811015611b5557611b01816007614d03565b611b0c906008614a3f565b6001600160401b038616901c60f81b82611b27836026614d2a565b81518110611b3757611b37614d16565b60200101906001600160f81b03191690815f1a905350600101611aed565b505f5b6008811015611bc057611b6c816007614d03565b611b77906008614a3f565b6001600160401b038516901c60f81b82611b9283602e614d2a565b81518110611ba257611ba2614d16565b60200101906001600160f81b03191690815f1a905350600101611b58565b50949350505050565b611bd1613387565b611bda826133d2565b610ad48161343e565b611beb6145f2565b5f805160206151048339815191525f611c0384611f8c565b90505f80611c148360400151612db4565b915091508015611c795760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104bc565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611cab57611cab614808565b6005811115611cbc57611cbc614808565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d4357611d43614808565b1480611d615750600182516005811115611d5f57611d5f614808565b145b611dc05760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104bc565b600382516005811115611dd557611dd5614808565b03611de257506004611de6565b5060055b6020808301515f90815260098801909152604081205581816005811115611e0f57611e0f614808565b90816005811115611e2257611e22614808565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611e5657611e56614808565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f2157611f21614808565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610ad4906001600160a01b031682846134f2565b60408051606080820183525f8083526020830181905292820152905f805160206151048339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612001573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120289190810190614bf6565b915091508061208f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104bc565b82548251146120f25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104bc565b60208201516001600160a01b0316156121655760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104bc565b509392505050565b5f805f83516036146121915760405162461bcd60e51b81526004016104bc90614d3d565b5f805b60028110156121e0576121a8816001614d03565b6121b3906008614a3f565b61ffff168682815181106121c9576121c9614d16565b016020015160f81c901b9190911790600101612194565b5061ffff8116156122035760405162461bcd60e51b81526004016104bc90614d86565b5f805b600481101561225e5761221a816003614d03565b612225906008614a3f565b63ffffffff1687612237836002614d2a565b8151811061224757612247614d16565b016020015160f81c901b9190911790600101612206565b5063ffffffff81166003146122855760405162461bcd60e51b81526004016104bc90614dc9565b5f805b60208110156122da5761229c81601f614d03565b6122a7906008614a3f565b886122b3836006614d2a565b815181106122c3576122c3614d16565b016020015160f81c901b9190911790600101612288565b505f805b6008811015612339576122f2816007614d03565b6122fd906008614a3f565b6001600160401b031689612312836026614d2a565b8151811061232257612322614d16565b016020015160f81c901b91909117906001016122de565b505f805b600881101561239857612351816007614d03565b61235c906008614a3f565b6001600160401b03168a61237183602e614d2a565b8151811061238157612381614d16565b016020015160f81c901b919091179060010161233d565b5091989097509095509350505050565b5f8181525f8051602061514483398151915260205260408082208151610100810190925280545f8051602061510483398151915293929190829060ff1660058111156123f6576123f6614808565b600581111561240757612407614808565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561248f5761248f614808565b146124eb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104bc565b60408101516001600160a01b0316336001600160a01b0316146125655760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104bc565b6125728160a00151611957565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156125b6576125b6614808565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126828461267c816118d5565b5f6119ac565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126b190859060040161494c565b6020604051808303815f875af11580156126cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126f1919061497e565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61274f612b44565b5f805160206150c48339815191525f61276a6101e285613551565b90505f6127768761155a565b905060028151600581111561278d5761278d614808565b146127ec5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104bc565b6127f582613587565b5f828260a001516128069190614a56565b60048501546060840151919250612828916001600160401b0390911690614e10565b6001600160401b0316816001600160401b031611156128a75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104bc565b6128b18882611964565b5f6128bb896118d5565b90505f89826040516020016128e792919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6129218d86886119ac565b6040518263ffffffff1660e01b815260040161293d919061494c565b6020604051808303815f875af1158015612959573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061297d919061497e565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612a0557612a05614808565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610fd060015f8051602061512483398151915255565b5f80516020615124833981519152805460011901612b7557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206150c4833981519152906001600160401b0316612bc7604086016020870161476c565b6001600160401b03161015612c365760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104bc565b6003810154612c486020860186614e4a565b61ffff1610158015612c6c5750612710612c656020860186614e4a565b61ffff1611155b612c885760405162461bcd60e51b81526004016104bc90614e65565b8054831015612ceb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104bc565b8060010154831115612d525760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104bc565b5f612d5c84613551565b90505f612d68826109b8565b90505f612d758883613592565b5f81815260058601602052604090209091508790612d938282614eb0565b509098975050505050505050565b60015f8051602061512483398151915255565b5f808251602714612dd75760405162461bcd60e51b81526004016104bc90614d3d565b5f805b6002811015612e2657612dee816001614d03565b612df9906008614a3f565b61ffff16858281518110612e0f57612e0f614d16565b016020015160f81c901b9190911790600101612dda565b5061ffff811615612e495760405162461bcd60e51b81526004016104bc90614d86565b5f805b6004811015612ea457612e60816003614d03565b612e6b906008614a3f565b63ffffffff1686612e7d836002614d2a565b81518110612e8d57612e8d614d16565b016020015160f81c901b9190911790600101612e4c565b5063ffffffff8116600214612ecb5760405162461bcd60e51b81526004016104bc90614dc9565b5f805b6020811015612f2057612ee281601f614d03565b612eed906008614a3f565b87612ef9836006614d2a565b81518110612f0957612f09614d16565b016020015160f81c901b9190911790600101612ece565b505f86602681518110612f3557612f35614d16565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612f785760405162461bcd60e51b81526004016104bc90614d3d565b5f805b6002811015612fc757612f8f816001614d03565b612f9a906008614a3f565b61ffff16858281518110612fb057612fb0614d16565b016020015160f81c901b9190911790600101612f7b565b5061ffff811615612fea5760405162461bcd60e51b81526004016104bc90614d86565b5f805b600481101561304557613001816003614d03565b61300c906008614a3f565b63ffffffff168661301e836002614d2a565b8151811061302e5761302e614d16565b016020015160f81c901b9190911790600101612fed565b5063ffffffff811660041461306c5760405162461bcd60e51b81526004016104bc90614dc9565b5f805b60208110156130c15761308381601f614d03565b61308e906008614a3f565b8761309a836006614d2a565b815181106130aa576130aa614d16565b016020015160f81c901b919091179060010161306f565b505f805b6008811015613120576130d9816007614d03565b6130e4906008614a3f565b6001600160401b0316886130f9836026614d2a565b8151811061310957613109614d16565b016020015160f81c901b91909117906001016130c5565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061510483398151915291429190158061321357506002830154815161320f916001600160401b031690614d2a565b8210155b15613239576001600160401b038516606082015281815260408101516020820152613258565b848160600181815161324b9190614a56565b6001600160401b03169052505b6060810151613268906064614e10565b602082015160028501546001600160401b0392909216916132939190600160401b900460ff16614a3f565b10156132f75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104bc565b831561332057846001600160401b0316816040018181516133189190614d2a565b90525061333f565b846001600160401b03168160400181815161333b9190614d03565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166133d057604051631afcd79f60e31b815260040160405180910390fd5b565b6133da613387565b6133e381613acc565b611961608082013560a083013561340060e0850160c0860161476c565b613411610100860160e08701614e4a565b61ffff1661342761012087016101008801614f06565b61343961014088016101208901614f26565b613aed565b613446613387565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166134d25760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104bc565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261155591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613d31565b5f6109c8827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613d92565b61196181600161312d565b5f5f80516020615104833981519152426135b2604086016020870161476c565b6001600160401b0316116136245760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104bc565b613634604085016020860161476c565b6001600160401b031661364a6202a30042614d2a565b116136bd5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104bc565b83356137155760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104bc565b83355f908152600982016020526040902054156137855760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104bc565b6137926040850185614f41565b90506030146137f95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104bc565b61380283613587565b5f8061389c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613847919061476c565b6001600160401b0316815260200161386260408a018a614f41565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613ef4565b5f828152600786016020526040902091935091506138ba8282614fce565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138e790859060040161494c565b6020604051808303815f875af1158015613903573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613927919061497e565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff191660018360058111156139a9576139a9614808565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a9e91908e01908e0161476c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613ad4613387565b613adc614299565b613ae46142a9565b611961816142b1565b613af5613387565b5f805160206150c483398151915283613b615760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104bc565b612710841115613b835760405162461bcd60e51b81526004016104bc90614e65565b85871115613beb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104bc565b5f8360ff1611613c585760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104bc565b600a60ff84161115613cca5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104bc565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613d456001600160a01b0384168361445e565b905080515f14158015613d69575080806020019051810190613d67919061508d565b155b1561155557604051635274afe760e01b81526001600160a01b03841660048201526024016104bc565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613dd8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dfc919061497e565b9050613e136001600160a01b03851633308661446b565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613e57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e7b919061497e565b9050818111613ee15760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104bc565b613eeb8282614d03565b95945050505050565b5f6060826080015151603014613f5e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104bc565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613fd557613f95816001614d03565b613fa0906008614a3f565b5081515f90839083908110613fb757613fb7614d16565b60200101906001600160f81b03191690815f1a905350600101613f81565b505f5b600481101561403357613fec816003614d03565b613ff7906008614a3f565b505f82614005836002614d2a565b8151811061401557614015614d16565b60200101906001600160f81b03191690815f1a905350600101613fd8565b505f5b6020811015614090578451816020811061405257614052614d16565b1a60f81b82614062836006614d2a565b8151811061407257614072614d16565b60200101906001600160f81b03191690815f1a905350600101614036565b505f5b60208110156140f057846020015181602081106140b2576140b2614d16565b1a60f81b826140c2836026614d2a565b815181106140d2576140d2614d16565b60200101906001600160f81b03191690815f1a905350600101614093565b505f5b600881101561416457614107816007614d03565b614112906008614a3f565b60ff1685604001516001600160401b0316901c60f81b828260466141369190614d2a565b8151811061414657614146614d16565b60200101906001600160f81b03191690815f1a9053506001016140f3565b505f5b60308110156141cf578460800151818151811061418657614186614d16565b01602001516001600160f81b031916826141a183604e614d2a565b815181106141b1576141b1614d16565b60200101906001600160f81b03191690815f1a905350600101614167565b505f5b6008811015614241576141e6816007614d03565b6141f1906008614a3f565b60608601516001600160401b0390811691161c60f81b8261421383607e614d2a565b8151811061422357614223614d16565b60200101906001600160f81b03191690815f1a9053506001016141d2565b5060028160405161425291906150a8565b602060405180830381855afa15801561426d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614290919061497e565b94909350915050565b6142a1613387565b6133d06144a4565b6133d0613387565b6142b9613387565b80355f8051602061510483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143056080840160608501614f06565b60ff1611156143725760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104bc565b5f6143836080840160608501614f06565b60ff16116143eb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104bc565b6143fb6080830160608401614f06565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561442c606083016040840161476c565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610fd083835f6144ac565b6040516001600160a01b0384811660248301528381166044830152606482018390526109b29186918216906323b872dd9060840161351f565b612da1613387565b6060814710156144d15760405163cd78605960e01b81523060048201526024016104bc565b5f80856001600160a01b031684866040516144ec91906150a8565b5f6040518083038185875af1925050503d805f8114614526576040519150601f19603f3d011682016040523d82523d5f602084013e61452b565b606091505b50915091506118cb86838360608261454b5761454682614592565b610fd0565b815115801561456257506001600160a01b0384163b155b1561458b57604051639996b31560e01b81526001600160a01b03851660048201526024016104bc565b5080610fd0565b8051156145a25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546145c790614a76565b5f825580601f106145d6575050565b601f0160209004905f5260205f20908101906119619190614636565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561464a575f8155600101614637565b5090565b8015158114611961575f80fd5b803563ffffffff8116811461466e575f80fd5b919050565b5f805f60608486031215614685575f80fd5b8335925060208401356146978161464e565b91506146a56040850161465b565b90509250925092565b5f602082840312156146be575f80fd5b5035919050565b6001600160a01b0381168114611961575f80fd5b5f808284036101608112156146ec575f80fd5b610140808212156146fb575f80fd5b849350830135905061470c816146c5565b809150509250929050565b5f60208284031215614727575f80fd5b610fd08261465b565b5f8060408385031215614741575f80fd5b61474a8361465b565b946020939093013593505050565b6001600160401b0381168114611961575f80fd5b5f6020828403121561477c575f80fd5b8135610fd081614758565b5f8060408385031215614798575f80fd5b50508035926020909101359150565b5f805f83850360808112156147ba575f80fd5b84356001600160401b038111156147cf575f80fd5b8501606081880312156147e0575f80fd5b93506040601f19820112156147f3575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061484057634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161486860408401826001600160a01b03169052565b50606083015161488360608401826001600160401b03169052565b50608083015161489e60808401826001600160401b03169052565b5060a08301516148b960a08401826001600160401b03169052565b5060c08301516148d460c08401826001600160401b03169052565b5060e08301516148ef60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156148ef576148ef6148f6565b5f5b8381101561494457818101518382015260200161492c565b50505f910152565b602081525f825180602084015261496a81604085016020870161492a565b601f01601f19169190910160400192915050565b5f6020828403121561498e575f80fd5b5051919050565b5f826149af57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109c8576109c86148f6565b6001600160401b038181168382160190808211156148ef576148ef6148f6565b600181811c90821680614a8a57607f821691505b602082108103614aa857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614b0781614a76565b806020870152604060018084165f8114614b285760018114614b4457614b71565b60ff19851660408a0152604084151560051b8a01019550614b71565b895f5260205f205f5b85811015614b685781548b8201860152908301908801614b4d565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614bb557614bb5614b7f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614be357614be3614b7f565b604052919050565b805161466e8161464e565b5f8060408385031215614c07575f80fd5b82516001600160401b0380821115614c1d575f80fd5b9084019060608287031215614c30575f80fd5b614c38614b93565b82518152602080840151614c4b816146c5565b82820152604084015183811115614c60575f80fd5b80850194505087601f850112614c74575f80fd5b835183811115614c8657614c86614b7f565b614c98601f8201601f19168301614bbb565b93508084528882828701011115614cad575f80fd5b614cbc8183860184880161492a565b50826040830152819550614cd1818801614beb565b9450505050509250929050565b5f6001600160401b03808316818103614cf957614cf96148f6565b6001019392505050565b818103818111156109c8576109c86148f6565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109c8576109c86148f6565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614e3357614e336148f6565b505092915050565b61ffff81168114611961575f80fd5b5f60208284031215614e5a575f80fd5b8135610fd081614e3b565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614ebb81614e3b565b61ffff8116905081548161ffff1982161783556020840135614edc81614758565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614f16575f80fd5b813560ff81168114610fd0575f80fd5b5f60208284031215614f36575f80fd5b8135610fd0816146c5565b5f808335601e19843603018112614f56575f80fd5b8301803591506001600160401b03821115614f6f575f80fd5b602001915036819003821315614f83575f80fd5b9250929050565b601f82111561155557805f5260205f20601f840160051c81016020851015614faf5750805b601f840160051c820191505b81811015610dae575f8155600101614fbb565b81516001600160401b03811115614fe757614fe7614b7f565b614ffb81614ff58454614a76565b84614f8a565b602080601f83116001811461502e575f84156150175750858301515b5f19600386901b1c1916600185901b178555615085565b5f85815260208120601f198616915b8281101561505c5788860151825594840194600190910190840161503d565b508582101561507957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561509d575f80fd5b8151610fd08161464e565b5f82516150b981846020870161492a565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516152dc3803806152dc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61518f8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f366004614692565b610357565b005b6101546101643660046146cd565b610807565b6101a76101773660046146cd565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e23660046146cd565b6109d7565b6040516001600160401b0390911681526020016101b1565b61015461020d3660046146f8565b6109ed565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c366004614736565b610acc565b61015461024f36600461474f565b610af7565b6101a761026236600461478b565b610cc7565b6101e76102753660046146cd565b610ce0565b610154610288366004614692565b610cf4565b61015461029b36600461474f565b610dd4565b6101a76102ae3660046147a6565b610fe3565b6101a76102c13660046147c6565b610ff6565b6101546102d4366004614736565b611022565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d3660046146cd565b6111df565b6101546103203660046146cd565b611465565b6101c2601481565b61034061033b3660046146cd565b611579565b6040516101b1919061483b565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206150e38339815191529184156103a9576103a68285611658565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db614827565b60048111156103ec576103ec614827565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61046884611579565b905060028251600481111561047f5761047f614827565b146104d15760405162461bcd60e51b815260206004820152602a60248201525f805160206151038339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105365760405162461bcd60e51b815260206004820152603360248201525f805160206151038339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c8565b600382528051600290600581111561055057610550614827565b0361068d5761056282606001516118f4565b61056b84611901565b6001600160401b0390811660e0840152421660a0808401919091526060830151908201515f9161059a91614929565b90506105a68582611983565b5f6005600160991b016001600160a01b031663ee5b48eb6105cc888760e00151866119cb565b6040518263ffffffff1660e01b81526004016105e8919061496b565b6020604051808303815f875af1158015610604573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610628919061499d565b90508360e001516001600160401b0316867f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df848460405161067e9291906001600160401b03929092168252602082015260400190565b60405180910390a350506106b0565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156106e1576106e1614827565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916107f5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061516383398151915260205260408082208151610100810190925280545f8051602061512383398151915293929190829060ff16600581111561085557610855614827565b600581111561086657610866614827565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108eb576108eb614827565b146109505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb6109758584608001515f6119cb565b6040518263ffffffff1660e01b8152600401610991919061496b565b6020604051808303815f875af11580156109ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d1919061499d565b50505050565b5f6109e764e8d4a51000836149b4565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a36575080546001600160401b03808416911610155b15610a545760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a7f8484611be8565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610ad682611c02565b9050610af381606001516001600160401b03168260400151611f75565b5050565b5f805160206150e38339815191525f610b0f84611fab565b90505f80610b20836040015161218c565b50915091505f610b2f83611579565b9050816001600160401b031681608001516001600160401b03161015610b675760405162461bcd60e51b81526004016104c8906149d3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bac5760405162461bcd60e51b81526004016104c890614a15565b60015f87815260068701602052604090205460ff166004811115610bd257610bd2614827565b14610c3b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109e76001600160401b03831664e8d4a51000614a5e565b5f610cea82611579565b60a0015192915050565b5f805160206150e38339815191525f610d0c85611579565b5f86815260058401602052604090205460c0820151919250610d3e91620100009091046001600160401b031690614a75565b6001600160401b0316421015610db25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c8565b8315610dc457610dc28584611658565b505b610dcd856123c7565b5050505050565b5f805160206150e38339815191525f610dec84611fab565b90505f80610dfd836040015161218c565b50915091505f610e0c83611579565b9050816001600160401b031681608001516001600160401b03161015610e445760405162461bcd60e51b81526004016104c8906149d3565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e825760405162461bcd60e51b81526004016104c890614a15565b60035f87815260068701602052604090205460ff166004811115610ea857610ea8614827565b14610efc5760405162461bcd60e51b815260206004820152603160248201525f805160206151038339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610fa191611f75565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610fef833384612765565b9392505050565b5f610fff612b63565b61100a848484612b9a565b9050610fef60015f8051602061514383398151915255565b5f805160206151238339815191525f61103a83611fab565b90505f8061104b8360400151612dd3565b91509150806110ad5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c8565b5f828152600785016020526040812080546110c790614a95565b90501180156110f9575060015f83815260088601602052604090205460ff1660058111156110f7576110f7614827565b145b6111155760405162461bcd60e51b81526004016104c890614acd565b5f828152600785016020526040812061112d916145da565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206150e383398151915293929190829060ff16600481111561124057611240614827565b600481111561125157611251614827565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112d8576112d8614827565b14806112f657506003815160048111156112f4576112f4614827565b145b61134a5760405162461bcd60e51b815260206004820152603260248201525f80516020615103833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c8565b5f6113588260400151611579565b905080608001516001600160401b03165f036113dc5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb611409846040015184608001518560a001516119cb565b6040518263ffffffff1660e01b8152600401611425919061496b565b6020604051808303815f875af1158015611441573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dcd919061499d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206151238339815191529291906114ad90614a95565b90501180156114df575060015f83815260088301602052604090205460ff1660058111156114dd576114dd614827565b145b6114fb5760405162461bcd60e51b81526004016104c890614acd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916115349190600401614b14565b6020604051808303815f875af1158015611550573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611574919061499d565b505050565b611581614611565b5f8281525f805160206151638339815191526020526040908190208151610100810190925280545f80516020615123833981519152929190829060ff1660058111156115cf576115cf614827565b60058111156115e0576115e0614827565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156116a3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116ca9190810190614c15565b915091508061172d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611770573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611794919061499d565b8251146117f85760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c8565b60208201516001600160a01b03161561186e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c8565b5f8061187d8460400151612f74565b915091508187146118ea5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c8565b9695505050505050565b6118fe815f61314c565b50565b5f8181525f805160206151638339815191526020526040812060030180545f80516020615123833981519152916001600160401b03909116908361194483614cfd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b5f9182525f80516020615163833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a4457611a04816001614d22565b611a0f906008614a5e565b5081515f90839083908110611a2657611a26614d35565b60200101906001600160f81b03191690815f1a9053506001016119f0565b505f5b6004811015611aa757611a5b816003614d22565b611a66906008614a5e565b6001901c60f81b82611a79836002614d49565b81518110611a8957611a89614d35565b60200101906001600160f81b03191690815f1a905350600101611a47565b505f5b6020811015611b0957611abe81601f614d22565b611ac9906008614a5e565b86901c60f81b82611adb836006614d49565b81518110611aeb57611aeb614d35565b60200101906001600160f81b03191690815f1a905350600101611aaa565b505f5b6008811015611b7457611b20816007614d22565b611b2b906008614a5e565b6001600160401b038616901c60f81b82611b46836026614d49565b81518110611b5657611b56614d35565b60200101906001600160f81b03191690815f1a905350600101611b0c565b505f5b6008811015611bdf57611b8b816007614d22565b611b96906008614a5e565b6001600160401b038516901c60f81b82611bb183602e614d49565b81518110611bc157611bc1614d35565b60200101906001600160f81b03191690815f1a905350600101611b77565b50949350505050565b611bf06133a6565b611bf9826133f1565b610af38161345d565b611c0a614611565b5f805160206151238339815191525f611c2284611fab565b90505f80611c338360400151612dd3565b915091508015611c985760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611cca57611cca614827565b6005811115611cdb57611cdb614827565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d6257611d62614827565b1480611d805750600182516005811115611d7e57611d7e614827565b145b611ddf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c8565b600382516005811115611df457611df4614827565b03611e0157506004611e05565b5060055b6020808301515f90815260098801909152604081205581816005811115611e2e57611e2e614827565b90816005811115611e4157611e41614827565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611e7557611e75614827565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f4057611f40614827565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610af3906001600160a01b03168284613511565b60408051606080820183525f8083526020830181905292820152905f805160206151238339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612020573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120479190810190614c15565b91509150806120ae5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c8565b82548251146121115760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c8565b60208201516001600160a01b0316156121845760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c8565b509392505050565b5f805f83516036146121b05760405162461bcd60e51b81526004016104c890614d5c565b5f805b60028110156121ff576121c7816001614d22565b6121d2906008614a5e565b61ffff168682815181106121e8576121e8614d35565b016020015160f81c901b91909117906001016121b3565b5061ffff8116156122225760405162461bcd60e51b81526004016104c890614da5565b5f805b600481101561227d57612239816003614d22565b612244906008614a5e565b63ffffffff1687612256836002614d49565b8151811061226657612266614d35565b016020015160f81c901b9190911790600101612225565b5063ffffffff81166003146122a45760405162461bcd60e51b81526004016104c890614de8565b5f805b60208110156122f9576122bb81601f614d22565b6122c6906008614a5e565b886122d2836006614d49565b815181106122e2576122e2614d35565b016020015160f81c901b91909117906001016122a7565b505f805b600881101561235857612311816007614d22565b61231c906008614a5e565b6001600160401b031689612331836026614d49565b8151811061234157612341614d35565b016020015160f81c901b91909117906001016122fd565b505f805b60088110156123b757612370816007614d22565b61237b906008614a5e565b6001600160401b03168a61239083602e614d49565b815181106123a0576123a0614d35565b016020015160f81c901b919091179060010161235c565b5091989097509095509350505050565b5f8181525f8051602061516383398151915260205260408082208151610100810190925280545f8051602061512383398151915293929190829060ff16600581111561241557612415614827565b600581111561242657612426614827565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124ae576124ae614827565b1461250a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c8565b60408101516001600160a01b0316336001600160a01b0316146125845760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c8565b6125918160a001516118f4565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156125d5576125d5614827565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126a18461269b81611901565b5f6119cb565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126d090859060040161496b565b6020604051808303815f875af11580156126ec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612710919061499d565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61276e612b63565b5f805160206150e38339815191525f6127896101e285613570565b90505f61279587611579565b90506002815160058111156127ac576127ac614827565b1461280b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c8565b612814826135a6565b5f828260a001516128259190614a75565b60048501546060840151919250612847916001600160401b0390911690614e2f565b6001600160401b0316816001600160401b031611156128c65760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c8565b6128d08882611983565b5f6128da89611901565b90505f898260405160200161290692919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6129408d86886119cb565b6040518263ffffffff1660e01b815260040161295c919061496b565b6020604051808303815f875af1158015612978573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299c919061499d565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612a2457612a24614827565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610fef60015f8051602061514383398151915255565b5f80516020615143833981519152805460011901612b9457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206150e3833981519152906001600160401b0316612be6604086016020870161478b565b6001600160401b03161015612c555760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c8565b6003810154612c676020860186614e69565b61ffff1610158015612c8b5750612710612c846020860186614e69565b61ffff1611155b612ca75760405162461bcd60e51b81526004016104c890614e84565b8054831015612d0a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c8565b8060010154831115612d715760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c8565b5f612d7b84613570565b90505f612d87826109d7565b90505f612d9488836135b1565b5f81815260058601602052604090209091508790612db28282614ecf565b509098975050505050505050565b60015f8051602061514383398151915255565b5f808251602714612df65760405162461bcd60e51b81526004016104c890614d5c565b5f805b6002811015612e4557612e0d816001614d22565b612e18906008614a5e565b61ffff16858281518110612e2e57612e2e614d35565b016020015160f81c901b9190911790600101612df9565b5061ffff811615612e685760405162461bcd60e51b81526004016104c890614da5565b5f805b6004811015612ec357612e7f816003614d22565b612e8a906008614a5e565b63ffffffff1686612e9c836002614d49565b81518110612eac57612eac614d35565b016020015160f81c901b9190911790600101612e6b565b5063ffffffff8116600214612eea5760405162461bcd60e51b81526004016104c890614de8565b5f805b6020811015612f3f57612f0181601f614d22565b612f0c906008614a5e565b87612f18836006614d49565b81518110612f2857612f28614d35565b016020015160f81c901b9190911790600101612eed565b505f86602681518110612f5457612f54614d35565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612f975760405162461bcd60e51b81526004016104c890614d5c565b5f805b6002811015612fe657612fae816001614d22565b612fb9906008614a5e565b61ffff16858281518110612fcf57612fcf614d35565b016020015160f81c901b9190911790600101612f9a565b5061ffff8116156130095760405162461bcd60e51b81526004016104c890614da5565b5f805b600481101561306457613020816003614d22565b61302b906008614a5e565b63ffffffff168661303d836002614d49565b8151811061304d5761304d614d35565b016020015160f81c901b919091179060010161300c565b5063ffffffff811660041461308b5760405162461bcd60e51b81526004016104c890614de8565b5f805b60208110156130e0576130a281601f614d22565b6130ad906008614a5e565b876130b9836006614d49565b815181106130c9576130c9614d35565b016020015160f81c901b919091179060010161308e565b505f805b600881101561313f576130f8816007614d22565b613103906008614a5e565b6001600160401b031688613118836026614d49565b8151811061312857613128614d35565b016020015160f81c901b91909117906001016130e4565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061512383398151915291429190158061323257506002830154815161322e916001600160401b031690614d49565b8210155b15613258576001600160401b038516606082015281815260408101516020820152613277565b848160600181815161326a9190614a75565b6001600160401b03169052505b6060810151613287906064614e2f565b602082015160028501546001600160401b0392909216916132b29190600160401b900460ff16614a5e565b10156133165760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c8565b831561333f57846001600160401b0316816040018181516133379190614d49565b90525061335e565b846001600160401b03168160400181815161335a9190614d22565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166133ef57604051631afcd79f60e31b815260040160405180910390fd5b565b6133f96133a6565b61340281613aeb565b6118fe608082013560a083013561341f60e0850160c0860161478b565b613430610100860160e08701614e69565b61ffff1661344661012087016101008801614f25565b61345861014088016101208901614f45565b613b0c565b6134656133a6565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166134f15760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261157491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613d50565b5f6109e7827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613db1565b6118fe81600161314c565b5f5f80516020615123833981519152426135d1604086016020870161478b565b6001600160401b0316116136435760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c8565b613653604085016020860161478b565b6001600160401b03166136696202a30042614d49565b116136dc5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c8565b83356137345760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c8565b83355f908152600982016020526040902054156137a45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c8565b6137b16040850185614f60565b90506030146138185760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c8565b613821836135a6565b5f806138bb6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613866919061478b565b6001600160401b0316815260200161388160408a018a614f60565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f13565b5f828152600786016020526040902091935091506138d98282614fed565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061390690859060040161496b565b6020604051808303815f875af1158015613922573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613946919061499d565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff191660018360058111156139c8576139c8614827565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613abd91908e01908e0161478b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613af36133a6565b613afb6142b8565b613b036142c8565b6118fe816142d0565b613b146133a6565b5f805160206150e383398151915283613b805760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c8565b612710841115613ba25760405162461bcd60e51b81526004016104c890614e84565b85871115613c0a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c8565b5f8360ff1611613c775760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c8565b600a60ff84161115613ce95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c8565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613d646001600160a01b0384168361447d565b905080515f14158015613d88575080806020019051810190613d8691906150ac565b155b1561157457604051635274afe760e01b81526001600160a01b03841660048201526024016104c8565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613df7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e1b919061499d565b9050613e326001600160a01b03851633308661448a565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613e76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e9a919061499d565b9050818111613f005760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c8565b613f0a8282614d22565b95945050505050565b5f6060826080015151603014613f7d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613ff457613fb4816001614d22565b613fbf906008614a5e565b5081515f90839083908110613fd657613fd6614d35565b60200101906001600160f81b03191690815f1a905350600101613fa0565b505f5b60048110156140525761400b816003614d22565b614016906008614a5e565b505f82614024836002614d49565b8151811061403457614034614d35565b60200101906001600160f81b03191690815f1a905350600101613ff7565b505f5b60208110156140af578451816020811061407157614071614d35565b1a60f81b82614081836006614d49565b8151811061409157614091614d35565b60200101906001600160f81b03191690815f1a905350600101614055565b505f5b602081101561410f57846020015181602081106140d1576140d1614d35565b1a60f81b826140e1836026614d49565b815181106140f1576140f1614d35565b60200101906001600160f81b03191690815f1a9053506001016140b2565b505f5b600881101561418357614126816007614d22565b614131906008614a5e565b60ff1685604001516001600160401b0316901c60f81b828260466141559190614d49565b8151811061416557614165614d35565b60200101906001600160f81b03191690815f1a905350600101614112565b505f5b60308110156141ee57846080015181815181106141a5576141a5614d35565b01602001516001600160f81b031916826141c083604e614d49565b815181106141d0576141d0614d35565b60200101906001600160f81b03191690815f1a905350600101614186565b505f5b600881101561426057614205816007614d22565b614210906008614a5e565b60608601516001600160401b0390811691161c60f81b8261423283607e614d49565b8151811061424257614242614d35565b60200101906001600160f81b03191690815f1a9053506001016141f1565b5060028160405161427191906150c7565b602060405180830381855afa15801561428c573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142af919061499d565b94909350915050565b6142c06133a6565b6133ef6144c3565b6133ef6133a6565b6142d86133a6565b80355f8051602061512383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143246080840160608501614f25565b60ff1611156143915760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c8565b5f6143a26080840160608501614f25565b60ff161161440a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c8565b61441a6080830160608401614f25565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561444b606083016040840161478b565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610fef83835f6144cb565b6040516001600160a01b0384811660248301528381166044830152606482018390526109d19186918216906323b872dd9060840161353e565b612dc06133a6565b6060814710156144f05760405163cd78605960e01b81523060048201526024016104c8565b5f80856001600160a01b0316848660405161450b91906150c7565b5f6040518083038185875af1925050503d805f8114614545576040519150601f19603f3d011682016040523d82523d5f602084013e61454a565b606091505b50915091506118ea86838360608261456a57614565826145b1565b610fef565b815115801561458157506001600160a01b0384163b155b156145aa57604051639996b31560e01b81526001600160a01b03851660048201526024016104c8565b5080610fef565b8051156145c15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546145e690614a95565b5f825580601f106145f5575050565b601f0160209004905f5260205f20908101906118fe9190614655565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614669575f8155600101614656565b5090565b80151581146118fe575f80fd5b803563ffffffff8116811461468d575f80fd5b919050565b5f805f606084860312156146a4575f80fd5b8335925060208401356146b68161466d565b91506146c46040850161467a565b90509250925092565b5f602082840312156146dd575f80fd5b5035919050565b6001600160a01b03811681146118fe575f80fd5b5f8082840361016081121561470b575f80fd5b6101408082121561471a575f80fd5b849350830135905061472b816146e4565b809150509250929050565b5f60208284031215614746575f80fd5b610fef8261467a565b5f8060408385031215614760575f80fd5b6147698361467a565b946020939093013593505050565b6001600160401b03811681146118fe575f80fd5b5f6020828403121561479b575f80fd5b8135610fef81614777565b5f80604083850312156147b7575f80fd5b50508035926020909101359150565b5f805f83850360808112156147d9575f80fd5b84356001600160401b038111156147ee575f80fd5b8501606081880312156147ff575f80fd5b93506040601f1982011215614812575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061485f57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161488760408401826001600160a01b03169052565b5060608301516148a260608401826001600160401b03169052565b5060808301516148bd60808401826001600160401b03169052565b5060a08301516148d860a08401826001600160401b03169052565b5060c08301516148f360c08401826001600160401b03169052565b5060e083015161490e60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561490e5761490e614915565b5f5b8381101561496357818101518382015260200161494b565b50505f910152565b602081525f8251806020840152614989816040850160208701614949565b601f01601f19169190910160400192915050565b5f602082840312156149ad575f80fd5b5051919050565b5f826149ce57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109e7576109e7614915565b6001600160401b0381811683821601908082111561490e5761490e614915565b600181811c90821680614aa957607f821691505b602082108103614ac757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614b2681614a95565b806020870152604060018084165f8114614b475760018114614b6357614b90565b60ff19851660408a0152604084151560051b8a01019550614b90565b895f5260205f205f5b85811015614b875781548b8201860152908301908801614b6c565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614bd457614bd4614b9e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c0257614c02614b9e565b604052919050565b805161468d8161466d565b5f8060408385031215614c26575f80fd5b82516001600160401b0380821115614c3c575f80fd5b9084019060608287031215614c4f575f80fd5b614c57614bb2565b82518152602080840151614c6a816146e4565b82820152604084015183811115614c7f575f80fd5b80850194505087601f850112614c93575f80fd5b835183811115614ca557614ca5614b9e565b614cb7601f8201601f19168301614bda565b93508084528882828701011115614ccc575f80fd5b614cdb81838601848801614949565b50826040830152819550614cf0818801614c0a565b9450505050509250929050565b5f6001600160401b03808316818103614d1857614d18614915565b6001019392505050565b818103818111156109e7576109e7614915565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109e7576109e7614915565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614e5257614e52614915565b505092915050565b61ffff811681146118fe575f80fd5b5f60208284031215614e79575f80fd5b8135610fef81614e5a565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614eda81614e5a565b61ffff8116905081548161ffff1982161783556020840135614efb81614777565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614f35575f80fd5b813560ff81168114610fef575f80fd5b5f60208284031215614f55575f80fd5b8135610fef816146e4565b5f808335601e19843603018112614f75575f80fd5b8301803591506001600160401b03821115614f8e575f80fd5b602001915036819003821315614fa2575f80fd5b9250929050565b601f82111561157457805f5260205f20601f840160051c81016020851015614fce5750805b601f840160051c820191505b81811015610dcd575f8155600101614fda565b81516001600160401b0381111561500657615006614b9e565b61501a816150148454614a95565b84614fa9565b602080601f83116001811461504d575f84156150365750858301515b5f19600386901b1c1916600185901b1785556150a4565b5f85815260208120601f198616915b8281101561507b5788860151825594840194600190910190840161505c565b508582101561509857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156150bc575f80fd5b8151610fef8161466d565b5f82516150d8818460208701614949565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1368,19 +1368,16 @@ func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Close() e // ERC20TokenStakingManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegatorRemovalInitialized struct { - DelegationID [32]byte - ValidationID [32]byte - Nonce uint64 - ValidatorWeight uint64 - EndTime *big.Int - SetWeightMessageID [32]byte - Raw types.Log // Blockchain specific contextual infos + DelegationID [32]byte + ValidationID [32]byte + EndTime *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { @@ -1390,22 +1387,18 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { @@ -1415,12 +1408,8 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) if err != nil { return nil, err } @@ -1452,9 +1441,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerDelegatorRemovalInitialized, error) { event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { @@ -2215,3 +2204,158 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidato event.Raw = log return event, nil } + +// ERC20TokenStakingManagerValidatorWeightUpdateIterator is returned from FilterValidatorWeightUpdate and is used to iterate over the raw logs and unpacked data for ValidatorWeightUpdate events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidatorWeightUpdateIterator struct { + Event *ERC20TokenStakingManagerValidatorWeightUpdate // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerValidatorWeightUpdateIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerValidatorWeightUpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerValidatorWeightUpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerValidatorWeightUpdate represents a ValidatorWeightUpdate event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidatorWeightUpdate struct { + ValidationID [32]byte + Nonce uint64 + ValidatorWeight uint64 + SetWeightMessageID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerValidatorWeightUpdateIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerValidatorWeightUpdateIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidatorWeightUpdate", logs: logs, sub: sub}, nil +} + +// WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerValidatorWeightUpdate) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*ERC20TokenStakingManagerValidatorWeightUpdate, error) { + event := new(ERC20TokenStakingManagerValidatorWeightUpdate) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index dba7a22cc..b10c1df9f 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -75,8 +75,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614f22380380614f2283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614dd58061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f366004614348565b61043b565b005b348015610161575f80fd5b50610154610170366004614383565b6108cc565b348015610180575f80fd5b506101bf61018f366004614383565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b5061015461021236600461439a565b610a9c565b348015610222575f80fd5b50610236610231366004614383565b610b79565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b506101546102903660046143b1565b610b8f565b3480156102a0575f80fd5b506101546102af3660046143ca565b610bba565b3480156102bf575f80fd5b506101bf6102ce366004614406565b610d8a565b3480156102de575f80fd5b506102366102ed366004614383565b610da3565b3480156102fd575f80fd5b5061015461030c366004614348565b610db7565b6101bf61031f366004614421565b610e97565b34801561032f575f80fd5b5061015461033e3660046143ca565b610ec3565b34801561034e575f80fd5b5061015461035d3660046143b1565b6110d2565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae366004614383565b61128f565b3480156103be575f80fd5b506101546103cd366004614383565b611515565b6101bf6103e0366004614383565b611629565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b50610418610413366004614383565b611635565b6040516101c9919061448e565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614d2983398151915291841561048d5761048a8285611714565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf61447a565b60048111156104d0576104d061447a565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156105575761055761447a565b146105a95760405162461bcd60e51b815260206004820152602a60248201525f80516020614d498339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461060e5760405162461bcd60e51b815260206004820152603360248201525f80516020614d498339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105a0565b5f610618846119b0565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156106655761066561447a565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61073785611635565b905082606001516001600160401b03168160a001516001600160401b0316116107ae5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105a0565b6002815160058111156107c3576107c361447a565b036107d5576107d58360600151611a32565b5f83606001518260a001516107ea919061457c565b90506107f68682611a3f565b5f6005600160991b0163ee5b48eb61080f898786611a87565b6040518263ffffffff1660e01b815260040161082b91906145be565b6020604051808303815f875af1158015610847573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086b91906145f0565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020614da983398151915260205260408082208151610100810190925280545f80516020614d6983398151915293929190829060ff16600581111561091a5761091a61447a565b600581111561092b5761092b61447a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156109b0576109b061447a565b14610a155760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105a0565b6005600160991b016001600160a01b031663ee5b48eb610a3a8584608001515f611a87565b6040518263ffffffff1660e01b8152600401610a5691906145be565b6020604051808303815f875af1158015610a72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9691906145f0565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ae5575080546001600160401b03808416911610155b15610b035760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b2d83611ca6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b8964e8d4a5100083614607565b92915050565b5f610b9982611cb7565b9050610bb681606001516001600160401b0316826040015161202a565b5050565b5f80516020614d298339815191525f610bd28461203d565b90505f80610be3836040015161221e565b50915091505f610bf283611635565b9050816001600160401b031681608001516001600160401b03161015610c2a5760405162461bcd60e51b81526004016105a090614626565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c6f5760405162461bcd60e51b81526004016105a090614668565b60015f87815260068701602052604090205460ff166004811115610c9557610c9561447a565b14610cfe5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105a0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610b896001600160401b03831664e8d4a510006146b1565b5f610dad82611635565b60a0015192915050565b5f80516020614d298339815191525f610dcf85611635565b5f86815260058401602052604090205460c0820151919250610e0191620100009091046001600160401b0316906146c8565b6001600160401b0316421015610e755760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105a0565b8315610e8757610e858584611714565b505b610e9085612459565b5050505050565b5f610ea06127f7565b610eab83833461282e565b9050610b8960015f80516020614d8983398151915255565b5f80516020614d298339815191525f610edb8461203d565b90505f80610eec836040015161221e565b50915091505f610efb83611635565b9050816001600160401b031681608001516001600160401b03161015610f335760405162461bcd60e51b81526004016105a090614626565b5f8681526006860160205260409020600301546001600160401b0380841691161115610f715760405162461bcd60e51b81526004016105a090614668565b60035f87815260068701602052604090205460ff166004811115610f9757610f9761447a565b14610feb5760405162461bcd60e51b815260206004820152603160248201525f80516020614d498339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105a0565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526110909161202a565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614d698339815191525f6110ea8361203d565b90505f806110fb8360400151612a5c565b915091508061115d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105a0565b5f82815260078501602052604081208054611177906146e8565b90501180156111a9575060015f83815260088601602052604090205460ff1660058111156111a7576111a761447a565b145b6111c55760405162461bcd60e51b81526004016105a09061471a565b5f82815260078501602052604081206111dd91614290565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614d2983398151915293929190829060ff1660048111156112f0576112f061447a565b60048111156113015761130161447a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156113885761138861447a565b14806113a657506003815160048111156113a4576113a461447a565b145b6113fa5760405162461bcd60e51b815260206004820152603260248201525f80516020614d49833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105a0565b5f6114088260400151611635565b905080608001516001600160401b03165f0361148c5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105a0565b6005600160991b016001600160a01b031663ee5b48eb6114b9846040015184608001518560a00151611a87565b6040518263ffffffff1660e01b81526004016114d591906145be565b6020604051808303815f875af11580156114f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9091906145f0565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614d6983398151915292919061155d906146e8565b905011801561158f575060015f83815260088301602052604090205460ff16600581111561158d5761158d61447a565b145b6115ab5760405162461bcd60e51b81526004016105a09061471a565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916115e49190600401614761565b6020604051808303815f875af1158015611600573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162491906145f0565b505050565b5f610b89823334612bfd565b61163d6142c7565b5f8281525f80516020614da98339815191526020526040908190208151610100810190925280545f80516020614d69833981519152929190829060ff16600581111561168b5761168b61447a565b600581111561169c5761169c61447a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561175f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117869190810190614876565b91509150806117e95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105a0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561182c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061185091906145f0565b8251146118b45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105a0565b60208201516001600160a01b03161561192a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105a0565b5f806119398460400151612ff8565b915091508187146119a65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105a0565b9695505050505050565b5f8181525f80516020614da98339815191526020526040812060030180545f80516020614d69833981519152916001600160401b0390911690836119f38361495e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b611a3c815f6131d0565b50565b5f9182525f80516020614da9833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611b0057611ac0816001614983565b611acb9060086146b1565b5081515f90839083908110611ae257611ae2614996565b60200101906001600160f81b03191690815f1a905350600101611aac565b505f5b6004811015611b6357611b17816003614983565b611b229060086146b1565b6001901c60f81b82611b358360026149aa565b81518110611b4557611b45614996565b60200101906001600160f81b03191690815f1a905350600101611b03565b505f5b6020811015611bc557611b7a81601f614983565b611b859060086146b1565b86901c60f81b82611b978360066149aa565b81518110611ba757611ba7614996565b60200101906001600160f81b03191690815f1a905350600101611b66565b505f5b6008811015611c3057611bdc816007614983565b611be79060086146b1565b6001600160401b038616901c60f81b82611c028360266149aa565b81518110611c1257611c12614996565b60200101906001600160f81b03191690815f1a905350600101611bc8565b505f5b6008811015611c9b57611c47816007614983565b611c529060086146b1565b6001600160401b038516901c60f81b82611c6d83602e6149aa565b81518110611c7d57611c7d614996565b60200101906001600160f81b03191690815f1a905350600101611c33565b5090505b9392505050565b611cae61342a565b611a3c81613475565b611cbf6142c7565b5f80516020614d698339815191525f611cd78461203d565b90505f80611ce88360400151612a5c565b915091508015611d4d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105a0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d7f57611d7f61447a565b6005811115611d9057611d9061447a565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611e1757611e1761447a565b1480611e355750600182516005811115611e3357611e3361447a565b145b611e945760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105a0565b600382516005811115611ea957611ea961447a565b03611eb657506004611eba565b5060055b6020808301515f90815260098801909152604081205581816005811115611ee357611ee361447a565b90816005811115611ef657611ef661447a565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611f2a57611f2a61447a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ff557611ff561447a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610bb66001600160a01b038216836134e1565b60408051606080820183525f8083526020830181905292820152905f80516020614d698339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120b2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d99190810190614876565b91509150806121405760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105a0565b82548251146121a35760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105a0565b60208201516001600160a01b0316156122165760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105a0565b509392505050565b5f805f83516036146122425760405162461bcd60e51b81526004016105a0906149bd565b5f805b600281101561229157612259816001614983565b6122649060086146b1565b61ffff1686828151811061227a5761227a614996565b016020015160f81c901b9190911790600101612245565b5061ffff8116156122b45760405162461bcd60e51b81526004016105a090614a06565b5f805b600481101561230f576122cb816003614983565b6122d69060086146b1565b63ffffffff16876122e88360026149aa565b815181106122f8576122f8614996565b016020015160f81c901b91909117906001016122b7565b5063ffffffff81166003146123365760405162461bcd60e51b81526004016105a090614a49565b5f805b602081101561238b5761234d81601f614983565b6123589060086146b1565b886123648360066149aa565b8151811061237457612374614996565b016020015160f81c901b9190911790600101612339565b505f805b60088110156123ea576123a3816007614983565b6123ae9060086146b1565b6001600160401b0316896123c38360266149aa565b815181106123d3576123d3614996565b016020015160f81c901b919091179060010161238f565b505f805b600881101561244957612402816007614983565b61240d9060086146b1565b6001600160401b03168a61242283602e6149aa565b8151811061243257612432614996565b016020015160f81c901b91909117906001016123ee565b5091989097509095509350505050565b5f8181525f80516020614da983398151915260205260408082208151610100810190925280545f80516020614d6983398151915293929190829060ff1660058111156124a7576124a761447a565b60058111156124b8576124b861447a565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156125405761254061447a565b1461259c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105a0565b60408101516001600160a01b0316336001600160a01b0316146126165760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105a0565b6126238160a00151611a32565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156126675761266761447a565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127338461272d816119b0565b5f611a87565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906127629085906004016145be565b6020604051808303815f875af115801561277e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127a291906145f0565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020614d8983398151915280546001190161282857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614d29833981519152906001600160401b031661287a6040860160208701614406565b6001600160401b031610156128e95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105a0565b60038101546128fb6020860186614a9f565b61ffff161015801561291f57506127106129186020860186614a9f565b61ffff1611155b61293b5760405162461bcd60e51b81526004016105a090614aba565b805483101561299e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105a0565b8060010154831115612a055760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105a0565b825f612a1082610b79565b90505f612a1d8883613574565b5f81815260058601602052604090209091508790612a3b8282614b05565b509098975050505050505050565b60015f80516020614d8983398151915255565b5f808251602714612a7f5760405162461bcd60e51b81526004016105a0906149bd565b5f805b6002811015612ace57612a96816001614983565b612aa19060086146b1565b61ffff16858281518110612ab757612ab7614996565b016020015160f81c901b9190911790600101612a82565b5061ffff811615612af15760405162461bcd60e51b81526004016105a090614a06565b5f805b6004811015612b4c57612b08816003614983565b612b139060086146b1565b63ffffffff1686612b258360026149aa565b81518110612b3557612b35614996565b016020015160f81c901b9190911790600101612af4565b5063ffffffff8116600214612b735760405162461bcd60e51b81526004016105a090614a49565b5f805b6020811015612bc857612b8a81601f614983565b612b959060086146b1565b87612ba18360066149aa565b81518110612bb157612bb1614996565b016020015160f81c901b9190911790600101612b76565b505f86602681518110612bdd57612bdd614996565b016020015191976001600160f81b03199092161515965090945050505050565b5f612c066127f7565b5f80516020614d298339815191525f612c1e84610b79565b90505f612c2a87611635565b9050600281516005811115612c4157612c4161447a565b14612ca05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105a0565b612ca982613aae565b5f828260a00151612cba91906146c8565b60048501546060840151919250612cdc916001600160401b0390911690614b5b565b6001600160401b0316816001600160401b03161115612d5b5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105a0565b612d658882611a3f565b5f612d6f896119b0565b90505f8982604051602001612d9b92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612dd58d8688611a87565b6040518263ffffffff1660e01b8152600401612df191906145be565b6020604051808303815f875af1158015612e0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e3191906145f0565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612eb957612eb961447a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611c9f60015f80516020614d8983398151915255565b5f808251602e1461301b5760405162461bcd60e51b81526004016105a0906149bd565b5f805b600281101561306a57613032816001614983565b61303d9060086146b1565b61ffff1685828151811061305357613053614996565b016020015160f81c901b919091179060010161301e565b5061ffff81161561308d5760405162461bcd60e51b81526004016105a090614a06565b5f805b60048110156130e8576130a4816003614983565b6130af9060086146b1565b63ffffffff16866130c18360026149aa565b815181106130d1576130d1614996565b016020015160f81c901b9190911790600101613090565b5063ffffffff811660041461310f5760405162461bcd60e51b81526004016105a090614a49565b5f805b60208110156131645761312681601f614983565b6131319060086146b1565b8761313d8360066149aa565b8151811061314d5761314d614996565b016020015160f81c901b9190911790600101613112565b505f805b60088110156131c35761317c816007614983565b6131879060086146b1565b6001600160401b03168861319c8360266149aa565b815181106131ac576131ac614996565b016020015160f81c901b9190911790600101613168565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614d698339815191529142919015806132b65750600283015481516132b2916001600160401b0316906149aa565b8210155b156132dc576001600160401b0385166060820152818152604081015160208201526132fb565b84816060018181516132ee91906146c8565b6001600160401b03169052505b606081015161330b906064614b5b565b602082015160028501546001600160401b0392909216916133369190600160401b900460ff166146b1565b101561339a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105a0565b83156133c357846001600160401b0316816040018181516133bb91906149aa565b9052506133e2565b846001600160401b0316816040018181516133de9190614983565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661347357604051631afcd79f60e31b815260040160405180910390fd5b565b61347d61342a565b61348681613ab9565b611a3c608082013560a08301356134a360e0850160c08601614406565b6134b4610100860160e08701614a9f565b61ffff166134ca61012087016101008801614b86565b6134dc61014088016101208901614ba6565b613ada565b804710156135045760405163cd78605960e01b81523060048201526024016105a0565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461354d576040519150601f19603f3d011682016040523d82523d5f602084013e613552565b606091505b505090508061162457604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614d69833981519152426135946040860160208701614406565b6001600160401b0316116136065760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105a0565b6136166040850160208601614406565b6001600160401b031661362c6202a300426149aa565b1161369f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105a0565b83356136f75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105a0565b83355f908152600982016020526040902054156137675760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105a0565b6137746040850185614bc1565b90506030146137db5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105a0565b6137e483613aae565b5f8061387e6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906138299190614406565b6001600160401b0316815260200161384460408a018a614bc1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613d1e565b5f8281526007860160205260409020919350915061389c8282614c4e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138c99085906004016145be565b6020604051808303815f875af11580156138e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390991906145f0565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561398b5761398b61447a565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a8091908e01908e01614406565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611a3c8160016131d0565b613ac161342a565b613ac96140c3565b613ad16140d3565b611a3c816140db565b613ae261342a565b5f80516020614d2983398151915283613b4e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105a0565b612710841115613b705760405162461bcd60e51b81526004016105a090614aba565b85871115613bd85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105a0565b5f8360ff1611613c455760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105a0565b600a60ff84161115613cb75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105a0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613d885760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105a0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613dff57613dbf816001614983565b613dca9060086146b1565b5081515f90839083908110613de157613de1614996565b60200101906001600160f81b03191690815f1a905350600101613dab565b505f5b6004811015613e5d57613e16816003614983565b613e219060086146b1565b505f82613e2f8360026149aa565b81518110613e3f57613e3f614996565b60200101906001600160f81b03191690815f1a905350600101613e02565b505f5b6020811015613eba5784518160208110613e7c57613e7c614996565b1a60f81b82613e8c8360066149aa565b81518110613e9c57613e9c614996565b60200101906001600160f81b03191690815f1a905350600101613e60565b505f5b6020811015613f1a5784602001518160208110613edc57613edc614996565b1a60f81b82613eec8360266149aa565b81518110613efc57613efc614996565b60200101906001600160f81b03191690815f1a905350600101613ebd565b505f5b6008811015613f8e57613f31816007614983565b613f3c9060086146b1565b60ff1685604001516001600160401b0316901c60f81b82826046613f6091906149aa565b81518110613f7057613f70614996565b60200101906001600160f81b03191690815f1a905350600101613f1d565b505f5b6030811015613ff95784608001518181518110613fb057613fb0614996565b01602001516001600160f81b03191682613fcb83604e6149aa565b81518110613fdb57613fdb614996565b60200101906001600160f81b03191690815f1a905350600101613f91565b505f5b600881101561406b57614010816007614983565b61401b9060086146b1565b60608601516001600160401b0390811691161c60f81b8261403d83607e6149aa565b8151811061404d5761404d614996565b60200101906001600160f81b03191690815f1a905350600101613ffc565b5060028160405161407c9190614d0d565b602060405180830381855afa158015614097573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906140ba91906145f0565b94909350915050565b6140cb61342a565b613473614288565b61347361342a565b6140e361342a565b80355f80516020614d6983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461412f6080840160608501614b86565b60ff16111561419c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105a0565b5f6141ad6080840160608501614b86565b60ff16116142155760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105a0565b6142256080830160608401614b86565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556142566060830160408401614406565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612a4961342a565b50805461429c906146e8565b5f825580601f106142ab575050565b601f0160209004905f5260205f2090810190611a3c919061430b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561431f575f815560010161430c565b5090565b8015158114611a3c575f80fd5b803563ffffffff81168114614343575f80fd5b919050565b5f805f6060848603121561435a575f80fd5b83359250602084013561436c81614323565b915061437a60408501614330565b90509250925092565b5f60208284031215614393575f80fd5b5035919050565b5f61014082840312156143ab575f80fd5b50919050565b5f602082840312156143c1575f80fd5b611c9f82614330565b5f80604083850312156143db575f80fd5b6143e483614330565b946020939093013593505050565b6001600160401b0381168114611a3c575f80fd5b5f60208284031215614416575f80fd5b8135611c9f816143f2565b5f808284036060811215614433575f80fd5b83356001600160401b03811115614448575f80fd5b840160608187031215614459575f80fd5b92506040601f198201121561446c575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106144b257634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516144da60408401826001600160a01b03169052565b5060608301516144f560608401826001600160401b03169052565b50608083015161451060808401826001600160401b03169052565b5060a083015161452b60a08401826001600160401b03169052565b5060c083015161454660c08401826001600160401b03169052565b5060e083015161456160e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561456157614561614568565b5f5b838110156145b657818101518382015260200161459e565b50505f910152565b602081525f82518060208401526145dc81604085016020870161459c565b601f01601f19169190910160400192915050565b5f60208284031215614600575f80fd5b5051919050565b5f8261462157634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610b8957610b89614568565b6001600160401b0381811683821601908082111561456157614561614568565b600181811c908216806146fc57607f821691505b6020821081036143ab57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614773816146e8565b806020870152604060018084165f811461479457600181146147b0576147dd565b60ff19851660408a0152604084151560051b8a010195506147dd565b895f5260205f205f5b858110156147d45781548b82018601529083019088016147b9565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614821576148216147eb565b60405290565b604051601f8201601f191681016001600160401b038111828210171561484f5761484f6147eb565b604052919050565b6001600160a01b0381168114611a3c575f80fd5b805161434381614323565b5f8060408385031215614887575f80fd5b82516001600160401b038082111561489d575f80fd5b90840190606082870312156148b0575f80fd5b6148b86147ff565b825181526020808401516148cb81614857565b828201526040840151838111156148e0575f80fd5b80850194505087601f8501126148f4575f80fd5b835183811115614906576149066147eb565b614918601f8201601f19168301614827565b9350808452888282870101111561492d575f80fd5b61493c8183860184880161459c565b5082604083015281955061495181880161486b565b9450505050509250929050565b5f6001600160401b0380831681810361497957614979614568565b6001019392505050565b81810381811115610b8957610b89614568565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610b8957610b89614568565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611a3c575f80fd5b5f60208284031215614aaf575f80fd5b8135611c9f81614a90565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614b1081614a90565b61ffff8116905081548161ffff1982161783556020840135614b31816143f2565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614b7e57614b7e614568565b505092915050565b5f60208284031215614b96575f80fd5b813560ff81168114611c9f575f80fd5b5f60208284031215614bb6575f80fd5b8135611c9f81614857565b5f808335601e19843603018112614bd6575f80fd5b8301803591506001600160401b03821115614bef575f80fd5b602001915036819003821315614c03575f80fd5b9250929050565b601f82111561162457805f5260205f20601f840160051c81016020851015614c2f5750805b601f840160051c820191505b81811015610e90575f8155600101614c3b565b81516001600160401b03811115614c6757614c676147eb565b614c7b81614c7584546146e8565b84614c0a565b602080601f831160018114614cae575f8415614c975750858301515b5f19600386901b1c1916600185901b178555614d05565b5f85815260208120601f198616915b82811015614cdc57888601518255948401946001909101908401614cbd565b5085821015614cf957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614d1e81846020870161459c565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614f41380380614f4183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614df48061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f366004614367565b61043b565b005b348015610161575f80fd5b506101546101703660046143a2565b6108eb565b348015610180575f80fd5b506101bf61018f3660046143a2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b506101546102123660046143b9565b610abb565b348015610222575f80fd5b506102366102313660046143a2565b610b98565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b506101546102903660046143d0565b610bae565b3480156102a0575f80fd5b506101546102af3660046143e9565b610bd9565b3480156102bf575f80fd5b506101bf6102ce366004614425565b610da9565b3480156102de575f80fd5b506102366102ed3660046143a2565b610dc2565b3480156102fd575f80fd5b5061015461030c366004614367565b610dd6565b6101bf61031f366004614440565b610eb6565b34801561032f575f80fd5b5061015461033e3660046143e9565b610ee2565b34801561034e575f80fd5b5061015461035d3660046143d0565b6110f1565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae3660046143a2565b6112ae565b3480156103be575f80fd5b506101546103cd3660046143a2565b611534565b6101bf6103e03660046143a2565b611648565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b506104186104133660046143a2565b611654565b6040516101c991906144ad565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614d4883398151915291841561048d5761048a8285611733565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf614499565b60048111156104d0576104d0614499565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054c84611654565b905060028251600481111561056357610563614499565b146105b55760405162461bcd60e51b815260206004820152602a60248201525f80516020614d688339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b0316331461061a5760405162461bcd60e51b815260206004820152603360248201525f80516020614d688339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ac565b600382528051600290600581111561063457610634614499565b036107715761064682606001516119cf565b61064f846119dc565b6001600160401b0390811660e0840152421660a0808401919091526060830151908201515f9161067e9161459b565b905061068a8582611a5e565b5f6005600160991b016001600160a01b031663ee5b48eb6106b0888760e0015186611aa6565b6040518263ffffffff1660e01b81526004016106cc91906145dd565b6020604051808303815f875af11580156106e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070c919061460f565b90508360e001516001600160401b0316867f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df84846040516107629291906001600160401b03929092168252602082015260400190565b60405180910390a35050610794565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156107c5576107c5614499565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916108d9916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614dc883398151915260205260408082208151610100810190925280545f80516020614d8883398151915293929190829060ff16600581111561093957610939614499565b600581111561094a5761094a614499565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156109cf576109cf614499565b14610a345760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb610a598584608001515f611aa6565b6040518263ffffffff1660e01b8152600401610a7591906145dd565b6020604051808303815f875af1158015610a91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab5919061460f565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b04575080546001600160401b03808416911610155b15610b225760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b4c83611cc5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610ba864e8d4a5100083614626565b92915050565b5f610bb882611cd6565b9050610bd581606001516001600160401b03168260400151612049565b5050565b5f80516020614d488339815191525f610bf18461205c565b90505f80610c02836040015161223d565b50915091505f610c1183611654565b9050816001600160401b031681608001516001600160401b03161015610c495760405162461bcd60e51b81526004016105ac90614645565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c8e5760405162461bcd60e51b81526004016105ac90614687565b60015f87815260068701602052604090205460ff166004811115610cb457610cb4614499565b14610d1d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ba86001600160401b03831664e8d4a510006146d0565b5f610dcc82611654565b60a0015192915050565b5f80516020614d488339815191525f610dee85611654565b5f86815260058401602052604090205460c0820151919250610e2091620100009091046001600160401b0316906146e7565b6001600160401b0316421015610e945760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ac565b8315610ea657610ea48584611733565b505b610eaf85612478565b5050505050565b5f610ebf612816565b610eca83833461284d565b9050610ba860015f80516020614da883398151915255565b5f80516020614d488339815191525f610efa8461205c565b90505f80610f0b836040015161223d565b50915091505f610f1a83611654565b9050816001600160401b031681608001516001600160401b03161015610f525760405162461bcd60e51b81526004016105ac90614645565b5f8681526006860160205260409020600301546001600160401b0380841691161115610f905760405162461bcd60e51b81526004016105ac90614687565b60035f87815260068701602052604090205460ff166004811115610fb657610fb6614499565b1461100a5760405162461bcd60e51b815260206004820152603160248201525f80516020614d688339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526110af91612049565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614d888339815191525f6111098361205c565b90505f8061111a8360400151612a7b565b915091508061117c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ac565b5f8281526007850160205260408120805461119690614707565b90501180156111c8575060015f83815260088601602052604090205460ff1660058111156111c6576111c6614499565b145b6111e45760405162461bcd60e51b81526004016105ac90614739565b5f82815260078501602052604081206111fc916142af565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614d4883398151915293929190829060ff16600481111561130f5761130f614499565b600481111561132057611320614499565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156113a7576113a7614499565b14806113c557506003815160048111156113c3576113c3614499565b145b6114195760405162461bcd60e51b815260206004820152603260248201525f80516020614d68833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ac565b5f6114278260400151611654565b905080608001516001600160401b03165f036114ab5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6114d8846040015184608001518560a00151611aa6565b6040518263ffffffff1660e01b81526004016114f491906145dd565b6020604051808303815f875af1158015611510573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eaf919061460f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614d8883398151915292919061157c90614707565b90501180156115ae575060015f83815260088301602052604090205460ff1660058111156115ac576115ac614499565b145b6115ca5760405162461bcd60e51b81526004016105ac90614739565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916116039190600401614780565b6020604051808303815f875af115801561161f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611643919061460f565b505050565b5f610ba8823334612c1c565b61165c6142e6565b5f8281525f80516020614dc88339815191526020526040908190208151610100810190925280545f80516020614d88833981519152929190829060ff1660058111156116aa576116aa614499565b60058111156116bb576116bb614499565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561177e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117a59190810190614895565b91509150806118085760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ac565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561184b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061186f919061460f565b8251146118d35760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ac565b60208201516001600160a01b0316156119495760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ac565b5f806119588460400151613017565b915091508187146119c55760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ac565b9695505050505050565b6119d9815f6131ef565b50565b5f8181525f80516020614dc88339815191526020526040812060030180545f80516020614d88833981519152916001600160401b039091169083611a1f8361497d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b5f9182525f80516020614dc8833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611b1f57611adf8160016149a2565b611aea9060086146d0565b5081515f90839083908110611b0157611b016149b5565b60200101906001600160f81b03191690815f1a905350600101611acb565b505f5b6004811015611b8257611b368160036149a2565b611b419060086146d0565b6001901c60f81b82611b548360026149c9565b81518110611b6457611b646149b5565b60200101906001600160f81b03191690815f1a905350600101611b22565b505f5b6020811015611be457611b9981601f6149a2565b611ba49060086146d0565b86901c60f81b82611bb68360066149c9565b81518110611bc657611bc66149b5565b60200101906001600160f81b03191690815f1a905350600101611b85565b505f5b6008811015611c4f57611bfb8160076149a2565b611c069060086146d0565b6001600160401b038616901c60f81b82611c218360266149c9565b81518110611c3157611c316149b5565b60200101906001600160f81b03191690815f1a905350600101611be7565b505f5b6008811015611cba57611c668160076149a2565b611c719060086146d0565b6001600160401b038516901c60f81b82611c8c83602e6149c9565b81518110611c9c57611c9c6149b5565b60200101906001600160f81b03191690815f1a905350600101611c52565b5090505b9392505050565b611ccd613449565b6119d981613494565b611cde6142e6565b5f80516020614d888339815191525f611cf68461205c565b90505f80611d078360400151612a7b565b915091508015611d6c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ac565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d9e57611d9e614499565b6005811115611daf57611daf614499565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611e3657611e36614499565b1480611e545750600182516005811115611e5257611e52614499565b145b611eb35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ac565b600382516005811115611ec857611ec8614499565b03611ed557506004611ed9565b5060055b6020808301515f90815260098801909152604081205581816005811115611f0257611f02614499565b90816005811115611f1557611f15614499565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611f4957611f49614499565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561201457612014614499565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610bd56001600160a01b03821683613500565b60408051606080820183525f8083526020830181905292820152905f80516020614d888339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120d1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120f89190810190614895565b915091508061215f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105ac565b82548251146121c25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ac565b60208201516001600160a01b0316156122355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ac565b509392505050565b5f805f83516036146122615760405162461bcd60e51b81526004016105ac906149dc565b5f805b60028110156122b0576122788160016149a2565b6122839060086146d0565b61ffff16868281518110612299576122996149b5565b016020015160f81c901b9190911790600101612264565b5061ffff8116156122d35760405162461bcd60e51b81526004016105ac90614a25565b5f805b600481101561232e576122ea8160036149a2565b6122f59060086146d0565b63ffffffff16876123078360026149c9565b81518110612317576123176149b5565b016020015160f81c901b91909117906001016122d6565b5063ffffffff81166003146123555760405162461bcd60e51b81526004016105ac90614a68565b5f805b60208110156123aa5761236c81601f6149a2565b6123779060086146d0565b886123838360066149c9565b81518110612393576123936149b5565b016020015160f81c901b9190911790600101612358565b505f805b6008811015612409576123c28160076149a2565b6123cd9060086146d0565b6001600160401b0316896123e28360266149c9565b815181106123f2576123f26149b5565b016020015160f81c901b91909117906001016123ae565b505f805b6008811015612468576124218160076149a2565b61242c9060086146d0565b6001600160401b03168a61244183602e6149c9565b81518110612451576124516149b5565b016020015160f81c901b919091179060010161240d565b5091989097509095509350505050565b5f8181525f80516020614dc883398151915260205260408082208151610100810190925280545f80516020614d8883398151915293929190829060ff1660058111156124c6576124c6614499565b60058111156124d7576124d7614499565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561255f5761255f614499565b146125bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ac565b60408101516001600160a01b0316336001600160a01b0316146126355760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105ac565b6126428160a001516119cf565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561268657612686614499565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127528461274c816119dc565b5f611aa6565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906127819085906004016145dd565b6020604051808303815f875af115801561279d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127c1919061460f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020614da883398151915280546001190161284757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614d48833981519152906001600160401b03166128996040860160208701614425565b6001600160401b031610156129085760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ac565b600381015461291a6020860186614abe565b61ffff161015801561293e57506127106129376020860186614abe565b61ffff1611155b61295a5760405162461bcd60e51b81526004016105ac90614ad9565b80548310156129bd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ac565b8060010154831115612a245760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ac565b825f612a2f82610b98565b90505f612a3c8883613593565b5f81815260058601602052604090209091508790612a5a8282614b24565b509098975050505050505050565b60015f80516020614da883398151915255565b5f808251602714612a9e5760405162461bcd60e51b81526004016105ac906149dc565b5f805b6002811015612aed57612ab58160016149a2565b612ac09060086146d0565b61ffff16858281518110612ad657612ad66149b5565b016020015160f81c901b9190911790600101612aa1565b5061ffff811615612b105760405162461bcd60e51b81526004016105ac90614a25565b5f805b6004811015612b6b57612b278160036149a2565b612b329060086146d0565b63ffffffff1686612b448360026149c9565b81518110612b5457612b546149b5565b016020015160f81c901b9190911790600101612b13565b5063ffffffff8116600214612b925760405162461bcd60e51b81526004016105ac90614a68565b5f805b6020811015612be757612ba981601f6149a2565b612bb49060086146d0565b87612bc08360066149c9565b81518110612bd057612bd06149b5565b016020015160f81c901b9190911790600101612b95565b505f86602681518110612bfc57612bfc6149b5565b016020015191976001600160f81b03199092161515965090945050505050565b5f612c25612816565b5f80516020614d488339815191525f612c3d84610b98565b90505f612c4987611654565b9050600281516005811115612c6057612c60614499565b14612cbf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ac565b612cc882613acd565b5f828260a00151612cd991906146e7565b60048501546060840151919250612cfb916001600160401b0390911690614b7a565b6001600160401b0316816001600160401b03161115612d7a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ac565b612d848882611a5e565b5f612d8e896119dc565b90505f8982604051602001612dba92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612df48d8688611aa6565b6040518263ffffffff1660e01b8152600401612e1091906145dd565b6020604051808303815f875af1158015612e2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e50919061460f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612ed857612ed8614499565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611cbe60015f80516020614da883398151915255565b5f808251602e1461303a5760405162461bcd60e51b81526004016105ac906149dc565b5f805b6002811015613089576130518160016149a2565b61305c9060086146d0565b61ffff16858281518110613072576130726149b5565b016020015160f81c901b919091179060010161303d565b5061ffff8116156130ac5760405162461bcd60e51b81526004016105ac90614a25565b5f805b6004811015613107576130c38160036149a2565b6130ce9060086146d0565b63ffffffff16866130e08360026149c9565b815181106130f0576130f06149b5565b016020015160f81c901b91909117906001016130af565b5063ffffffff811660041461312e5760405162461bcd60e51b81526004016105ac90614a68565b5f805b60208110156131835761314581601f6149a2565b6131509060086146d0565b8761315c8360066149c9565b8151811061316c5761316c6149b5565b016020015160f81c901b9190911790600101613131565b505f805b60088110156131e25761319b8160076149a2565b6131a69060086146d0565b6001600160401b0316886131bb8360266149c9565b815181106131cb576131cb6149b5565b016020015160f81c901b9190911790600101613187565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614d888339815191529142919015806132d55750600283015481516132d1916001600160401b0316906149c9565b8210155b156132fb576001600160401b03851660608201528181526040810151602082015261331a565b848160600181815161330d91906146e7565b6001600160401b03169052505b606081015161332a906064614b7a565b602082015160028501546001600160401b0392909216916133559190600160401b900460ff166146d0565b10156133b95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ac565b83156133e257846001600160401b0316816040018181516133da91906149c9565b905250613401565b846001600160401b0316816040018181516133fd91906149a2565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661349257604051631afcd79f60e31b815260040160405180910390fd5b565b61349c613449565b6134a581613ad8565b6119d9608082013560a08301356134c260e0850160c08601614425565b6134d3610100860160e08701614abe565b61ffff166134e961012087016101008801614ba5565b6134fb61014088016101208901614bc5565b613af9565b804710156135235760405163cd78605960e01b81523060048201526024016105ac565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461356c576040519150601f19603f3d011682016040523d82523d5f602084013e613571565b606091505b505090508061164357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614d88833981519152426135b36040860160208701614425565b6001600160401b0316116136255760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ac565b6136356040850160208601614425565b6001600160401b031661364b6202a300426149c9565b116136be5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ac565b83356137165760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105ac565b83355f908152600982016020526040902054156137865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105ac565b6137936040850185614be0565b90506030146137fa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105ac565b61380383613acd565b5f8061389d6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906138489190614425565b6001600160401b0316815260200161386360408a018a614be0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613d3d565b5f828152600786016020526040902091935091506138bb8282614c6d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138e89085906004016145dd565b6020604051808303815f875af1158015613904573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613928919061460f565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff191660018360058111156139aa576139aa614499565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a9f91908e01908e01614425565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6119d98160016131ef565b613ae0613449565b613ae86140e2565b613af06140f2565b6119d9816140fa565b613b01613449565b5f80516020614d4883398151915283613b6d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ac565b612710841115613b8f5760405162461bcd60e51b81526004016105ac90614ad9565b85871115613bf75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ac565b5f8360ff1611613c645760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ac565b600a60ff84161115613cd65760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ac565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613da75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ac565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613e1e57613dde8160016149a2565b613de99060086146d0565b5081515f90839083908110613e0057613e006149b5565b60200101906001600160f81b03191690815f1a905350600101613dca565b505f5b6004811015613e7c57613e358160036149a2565b613e409060086146d0565b505f82613e4e8360026149c9565b81518110613e5e57613e5e6149b5565b60200101906001600160f81b03191690815f1a905350600101613e21565b505f5b6020811015613ed95784518160208110613e9b57613e9b6149b5565b1a60f81b82613eab8360066149c9565b81518110613ebb57613ebb6149b5565b60200101906001600160f81b03191690815f1a905350600101613e7f565b505f5b6020811015613f395784602001518160208110613efb57613efb6149b5565b1a60f81b82613f0b8360266149c9565b81518110613f1b57613f1b6149b5565b60200101906001600160f81b03191690815f1a905350600101613edc565b505f5b6008811015613fad57613f508160076149a2565b613f5b9060086146d0565b60ff1685604001516001600160401b0316901c60f81b82826046613f7f91906149c9565b81518110613f8f57613f8f6149b5565b60200101906001600160f81b03191690815f1a905350600101613f3c565b505f5b60308110156140185784608001518181518110613fcf57613fcf6149b5565b01602001516001600160f81b03191682613fea83604e6149c9565b81518110613ffa57613ffa6149b5565b60200101906001600160f81b03191690815f1a905350600101613fb0565b505f5b600881101561408a5761402f8160076149a2565b61403a9060086146d0565b60608601516001600160401b0390811691161c60f81b8261405c83607e6149c9565b8151811061406c5761406c6149b5565b60200101906001600160f81b03191690815f1a90535060010161401b565b5060028160405161409b9190614d2c565b602060405180830381855afa1580156140b6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906140d9919061460f565b94909350915050565b6140ea613449565b6134926142a7565b613492613449565b614102613449565b80355f80516020614d8883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461414e6080840160608501614ba5565b60ff1611156141bb5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ac565b5f6141cc6080840160608501614ba5565b60ff16116142345760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ac565b6142446080830160608401614ba5565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556142756060830160408401614425565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612a68613449565b5080546142bb90614707565b5f825580601f106142ca575050565b601f0160209004905f5260205f20908101906119d9919061432a565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561433e575f815560010161432b565b5090565b80151581146119d9575f80fd5b803563ffffffff81168114614362575f80fd5b919050565b5f805f60608486031215614379575f80fd5b83359250602084013561438b81614342565b91506143996040850161434f565b90509250925092565b5f602082840312156143b2575f80fd5b5035919050565b5f61014082840312156143ca575f80fd5b50919050565b5f602082840312156143e0575f80fd5b611cbe8261434f565b5f80604083850312156143fa575f80fd5b6144038361434f565b946020939093013593505050565b6001600160401b03811681146119d9575f80fd5b5f60208284031215614435575f80fd5b8135611cbe81614411565b5f808284036060811215614452575f80fd5b83356001600160401b03811115614467575f80fd5b840160608187031215614478575f80fd5b92506040601f198201121561448b575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106144d157634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516144f960408401826001600160a01b03169052565b50606083015161451460608401826001600160401b03169052565b50608083015161452f60808401826001600160401b03169052565b5060a083015161454a60a08401826001600160401b03169052565b5060c083015161456560c08401826001600160401b03169052565b5060e083015161458060e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561458057614580614587565b5f5b838110156145d55781810151838201526020016145bd565b50505f910152565b602081525f82518060208401526145fb8160408501602087016145bb565b601f01601f19169190910160400192915050565b5f6020828403121561461f575f80fd5b5051919050565b5f8261464057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ba857610ba8614587565b6001600160401b0381811683821601908082111561458057614580614587565b600181811c9082168061471b57607f821691505b6020821081036143ca57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461479281614707565b806020870152604060018084165f81146147b357600181146147cf576147fc565b60ff19851660408a0152604084151560051b8a010195506147fc565b895f5260205f205f5b858110156147f35781548b82018601529083019088016147d8565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156148405761484061480a565b60405290565b604051601f8201601f191681016001600160401b038111828210171561486e5761486e61480a565b604052919050565b6001600160a01b03811681146119d9575f80fd5b805161436281614342565b5f80604083850312156148a6575f80fd5b82516001600160401b03808211156148bc575f80fd5b90840190606082870312156148cf575f80fd5b6148d761481e565b825181526020808401516148ea81614876565b828201526040840151838111156148ff575f80fd5b80850194505087601f850112614913575f80fd5b8351838111156149255761492561480a565b614937601f8201601f19168301614846565b9350808452888282870101111561494c575f80fd5b61495b818386018488016145bb565b5082604083015281955061497081880161488a565b9450505050509250929050565b5f6001600160401b0380831681810361499857614998614587565b6001019392505050565b81810381811115610ba857610ba8614587565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ba857610ba8614587565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff811681146119d9575f80fd5b5f60208284031215614ace575f80fd5b8135611cbe81614aaf565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614b2f81614aaf565b61ffff8116905081548161ffff1982161783556020840135614b5081614411565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614b9d57614b9d614587565b505092915050565b5f60208284031215614bb5575f80fd5b813560ff81168114611cbe575f80fd5b5f60208284031215614bd5575f80fd5b8135611cbe81614876565b5f808335601e19843603018112614bf5575f80fd5b8301803591506001600160401b03821115614c0e575f80fd5b602001915036819003821315614c22575f80fd5b9250929050565b601f82111561164357805f5260205f20601f840160051c81016020851015614c4e5750805b601f840160051c820191505b81811015610eaf575f8155600101614c5a565b81516001600160401b03811115614c8657614c8661480a565b614c9a81614c948454614707565b84614c29565b602080601f831160018114614ccd575f8415614cb65750858301515b5f19600386901b1c1916600185901b178555614d24565b5f85815260208120601f198616915b82811015614cfb57888601518255948401946001909101908401614cdc565b5085821015614d1857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614d3d8184602087016145bb565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1368,19 +1368,16 @@ func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Close() // NativeTokenStakingManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegatorRemovalInitialized struct { - DelegationID [32]byte - ValidationID [32]byte - Nonce uint64 - ValidatorWeight uint64 - EndTime *big.Int - SetWeightMessageID [32]byte - Raw types.Log // Blockchain specific contextual infos + DelegationID [32]byte + ValidationID [32]byte + EndTime *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { @@ -1390,22 +1387,18 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { @@ -1415,12 +1408,8 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) if err != nil { return nil, err } @@ -1452,9 +1441,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, uint256 endTime, bytes32 setWeightMessageID) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerDelegatorRemovalInitialized, error) { event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { @@ -2215,3 +2204,158 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValida event.Raw = log return event, nil } + +// NativeTokenStakingManagerValidatorWeightUpdateIterator is returned from FilterValidatorWeightUpdate and is used to iterate over the raw logs and unpacked data for ValidatorWeightUpdate events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidatorWeightUpdateIterator struct { + Event *NativeTokenStakingManagerValidatorWeightUpdate // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerValidatorWeightUpdateIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerValidatorWeightUpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerValidatorWeightUpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerValidatorWeightUpdate represents a ValidatorWeightUpdate event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidatorWeightUpdate struct { + ValidationID [32]byte + Nonce uint64 + ValidatorWeight uint64 + SetWeightMessageID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerValidatorWeightUpdateIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerValidatorWeightUpdateIterator{contract: _NativeTokenStakingManager.contract, event: "ValidatorWeightUpdate", logs: logs, sub: sub}, nil +} + +// WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerValidatorWeightUpdate) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*NativeTokenStakingManagerValidatorWeightUpdate, error) { + event := new(NativeTokenStakingManagerValidatorWeightUpdate) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index d339f6a68..4a8d8d41d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -337,6 +337,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // Ensure the delegator is active Delegator memory delegator = $._delegatorStakes[delegationID]; + Validator memory validator = getValidator(validationID); require( delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegation not active" ); @@ -344,45 +345,49 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager require( delegator.owner == _msgSender(), "PoSValidatorManager: delegation not owned by sender" ); - uint64 nonce = _incrementAndGetNonce(validationID); // Set the delegator status to pending removed, so that it can be properly removed in // the complete step, even if the delivered nonce is greater than the nonce used to // initialize the removal. delegator.status = DelegatorStatus.PendingRemoved; - delegator.endedAt = uint64(block.timestamp); - delegator.endingNonce = nonce; - - $._delegatorStakes[delegationID] = delegator; - - Validator memory validator = getValidator(validationID); - require(validator.weight > delegator.weight, "PoSValidatorManager: Invalid weight"); - // Check that removing this delegator would not exceed the maximum churn rate. - // We only need to check this is the validator is still active. If the validator ends its validation - // period, the weight of all its delegators will be added to the churn tracker at that time. Ending - // a delegation whose validator has ended validating has no impact on the stake weight of the chain. if (validator.status == ValidatorStatus.Active) { + // Check that removing this delegator would not exceed the maximum churn rate. + // We only need to check this is the validator is still active. If the validator ends its validation + // period, the weight of all its delegators will be added to the churn tracker at that time. Ending + // a delegation whose validator has ended validating has no impact on the stake weight of the chain. _checkAndUpdateChurnTrackerRemoval(delegator.weight); - } - uint64 newValidatorWeight = validator.weight - delegator.weight; - _setValidatorWeight(validationID, newValidatorWeight); + delegator.endingNonce = _incrementAndGetNonce(validationID); + delegator.endedAt = uint64(block.timestamp); + + uint64 newValidatorWeight = validator.weight - delegator.weight; + _setValidatorWeight(validationID, newValidatorWeight); + + // Submit the message to the Warp precompile. + bytes32 messageID = WARP_MESSENGER.sendWarpMessage( + ValidatorMessages.packSetSubnetValidatorWeightMessage( + validationID, delegator.endingNonce, newValidatorWeight + ) + ); + + emit ValidatorWeightUpdate({ + validationID: validationID, + nonce: delegator.endingNonce, + validatorWeight: newValidatorWeight, + setWeightMessageID: messageID + }); + } else { + delegator.endingNonce = validator.messageNonce; + delegator.endedAt = validator.endedAt; + } - // Submit the message to the Warp precompile. - bytes32 messageID = WARP_MESSENGER.sendWarpMessage( - ValidatorMessages.packSetSubnetValidatorWeightMessage( - validationID, nonce, newValidatorWeight - ) - ); + $._delegatorStakes[delegationID] = delegator; emit DelegatorRemovalInitialized({ delegationID: delegationID, validationID: validationID, - nonce: nonce, - validatorWeight: newValidatorWeight, - endTime: block.timestamp, - setWeightMessageID: messageID + endTime: delegator.endedAt }); } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 849326023..d2b990c06 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -67,6 +67,7 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when a delegator registration is completed * @param delegationID The ID of the delegation + * @param validationID The ID of the validation period * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain * @param startTime The time at which the registration was completed */ @@ -80,17 +81,24 @@ 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 endTime The time at which the removal was initiated + */ + event DelegatorRemovalInitialized( + bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime + ); + + /** + * @notice Event emitted when delegator removal is initiated + * @param validationID The ID of the validation period * @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 endTime The time at which the removal was initiated * @param setWeightMessageID The ID of the Warp message that updates the validator's weight on the P-Chain */ - event DelegatorRemovalInitialized( - bytes32 indexed delegationID, + event ValidatorWeightUpdate( bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, - uint256 endTime, bytes32 setWeightMessageID ); diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 69eec67db..5c5c57e1b 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -52,11 +52,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); event DelegatorRemovalInitialized( - bytes32 indexed delegationID, + bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime + ); + + event ValidatorWeightUpdate( bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, - uint256 endTime, bytes32 setWeightMessageID ); @@ -791,14 +793,19 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegatorRemovalInitialized({ - delegationID: delegationID, + emit ValidatorWeightUpdate({ validationID: validationID, nonce: expectedNonce, validatorWeight: expectedValidatorWeight, - endTime: endDelegationTimestamp, setWeightMessageID: bytes32(0) }); + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit DelegatorRemovalInitialized({ + delegationID: delegationID, + validationID: validationID, + endTime: endDelegationTimestamp + }); + vm.prank(delegatorAddress); posValidatorManager.initializeEndDelegation(delegationID, false, 0); return delegationID; From 44d8097d003373460d65c7dddaff7a43beceede3 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 10:01:03 -0400 Subject: [PATCH 317/545] Updates and fixes --- .../ERC20TokenStakingManager.go | 35 +--- .../ExampleRewardCalculator.go | 59 +++++-- .../NativeTokenStakingManager.go | 35 +--- .../PoAValidatorManager.go | 2 +- contracts/staking/ExampleRewardCalculator.sol | 20 ++- contracts/staking/PoSValidatorManager.sol | 77 +++++---- contracts/staking/ValidatorManager.sol | 9 +- .../staking/interfaces/IRewardCalculator.sol | 6 +- .../tests/ExamplesRewardCalculatorTests.t.sol | 29 +++- .../NativeTokenStakingManagerTests.t.sol | 1 + .../tests/PoSValidatorManagerTests.t.sol | 161 +++++++++++------- .../staking/tests/ValidatorManagerTests.t.sol | 24 ++- 12 files changed, 252 insertions(+), 206 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6bf7209e4..205e65aa2 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -75,8 +75,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516155ce3803806155ce83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154818061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806376f78621116100bf578063b771b3bc11610079578063b771b3bc146102ec578063ba3a4b9714610312578063bee0a03f14610325578063c974d1b614610338578063d5f20ff614610340578063df93d8de14610360575f80fd5b806376f786211461028557806398f3e2b4146102985780639e1bc4ef146102ab578063a13fd29d146102be578063a3a65e48146102d1578063afba878a146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c578063620658561461025f57806366435abf14610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614968565b61036a565b005b61015f61016f3660046149a3565b610892565b6101b26101823660046149a3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed3660046149a3565b610a62565b6040516001600160401b0390911681526020016101bc565b61015f6102183660046149ce565b610a78565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614a0c565b610b57565b61015f61025a366004614a25565b610bf3565b6101b261026d366004614a61565b610dc3565b6101f26102803660046149a3565b610ddc565b61015f610293366004614968565b610df0565b61015f6102a6366004614a25565b61100e565b6101b26102b9366004614a7c565b611272565b6101b26102cc366004614a9c565b611285565b61015f6102df366004614a0c565b6112b1565b6101cd605081565b6102fa6005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f6103203660046149a3565b61146e565b61015f6103333660046149a3565b6116f4565b6101cd601481565b61035361034e3660046149a3565b611803565b6040516101bc9190614b11565b6101f26202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153d5833981519152949193919290829060ff1660048111156103d2576103d2614afd565b60048111156103e3576103e3614afd565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61045f83611803565b90504260028351600481111561047757610477614afd565b146104c95760405162461bcd60e51b815260206004820152602a60248201525f805160206153f58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461052e5760405162461bcd60e51b815260206004820152603360248201525f805160206153f58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c0565b5f610538856118e2565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561058557610585614afd565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610772575f61065e8689611964565b6001600160401b03169050605060ff168460c001518461067e9190614bff565b6106889190614c1f565b6001600160401b031661069c826064614c4a565b10610770578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6106d48760600151610dc3565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa15801561073b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075f9190614c61565b5f8b81526009890160205260409020555b505b60028351600581111561078757610787614afd565b03610799576107998460600151611c00565b5f84606001518460a001516107ae9190614bff565b90506107ba8682611c0d565b5f6005600160991b0163ee5b48eb6107d3898686611c55565b6040518263ffffffff1660e01b81526004016107ef9190614c9a565b6020604051808303815f875af115801561080b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082f9190614c61565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f8051602061545583398151915260205260408082208151610100810190925280545f8051602061541583398151915293929190829060ff1660058111156108e0576108e0614afd565b60058111156108f1576108f1614afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561097657610976614afd565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb610a008584608001515f611c55565b6040518263ffffffff1660e01b8152600401610a1c9190614c9a565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614c61565b50505050565b5f610a7264e8d4a5100083614ccc565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ac1575080546001600160401b03808416911610155b15610adf5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b0a8484611e72565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153d58339815191525f610b6f83611e90565b9050600481516005811115610b8657610b86614afd565b03610bd4576040808201516001600160a01b0381165f908152600a85016020529190912054610bb59190612203565b6040808201516001600160a01b03165f908152600a8401602052908120555b610bee8160400151610be98360600151610dc3565b612279565b505050565b5f805160206153d58339815191525f610c0b8461229c565b90505f80610c1c836040015161247d565b50915091505f610c2b83611803565b9050816001600160401b031681608001516001600160401b03161015610c635760405162461bcd60e51b81526004016104c090614ceb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ca85760405162461bcd60e51b81526004016104c090614d2d565b60015f87815260068701602052604090205460ff166004811115610cce57610cce614afd565b14610d375760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c0565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a726001600160401b03831664e8d4a51000614c4a565b5f610de682611803565b60a0015192915050565b5f805160206153d58339815191525f610e08856126b8565b5f86815260058401602052604090205460c0820151919250610e3a91620100009091046001600160401b031690614d76565b6001600160401b03168160e001516001600160401b03161015610ebb5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c0565b8315611007575f610ecc8685611964565b9050605060ff168260c001518360e00151610ee79190614bff565b610ef19190614c1f565b6001600160401b0316610f05826064614c1f565b6001600160401b031610611005578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db610f468460600151610dc3565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa158015610fae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fd29190614c61565b6040808401516001600160a01b03165f908152600a86016020529081208054909190610fff908490614d96565b90915550505b505b5050505050565b5f805160206153d58339815191525f6110268461229c565b90505f80611037836040015161247d565b50915091505f61104683611803565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561108057611080614afd565b600481111561109157611091614afd565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111305760405162461bcd60e51b81526004016104c090614ceb565b826001600160401b03168160e001516001600160401b031611156111665760405162461bcd60e51b81526004016104c090614d2d565b60038151600481111561117b5761117b614afd565b146111cf5760405162461bcd60e51b815260206004820152603160248201525f805160206153f58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c0565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546112059190612203565b856009015f8881526020019081526020015f205f90556112308160200151610be98360600151610dc3565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f61127e833384612a61565b9392505050565b5f61128e612e5f565b611299848484612e96565b905061127e60015f8051602061543583398151915255565b5f805160206154158339815191525f6112c98361229c565b90505f806112da83604001516130cf565b915091508061133c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c0565b5f8281526007850160205260408120805461135690614da9565b9050118015611388575060015f83815260088601602052604090205460ff16600581111561138657611386614afd565b145b6113a45760405162461bcd60e51b81526004016104c090614de1565b5f82815260078501602052604081206113bc916148b0565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153d583398151915293929190829060ff1660048111156114cf576114cf614afd565b60048111156114e0576114e0614afd565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561156757611567614afd565b1480611585575060038151600481111561158357611583614afd565b145b6115d95760405162461bcd60e51b815260206004820152603260248201525f805160206153f5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c0565b5f6115e78260400151611803565b905080608001516001600160401b03165f0361166b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c0565b6005600160991b016001600160a01b031663ee5b48eb611698846040015184608001518560a00151611c55565b6040518263ffffffff1660e01b81526004016116b49190614c9a565b6020604051808303815f875af11580156116d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110079190614c61565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061541583398151915292919061173c90614da9565b905011801561176e575060015f83815260088301602052604090205460ff16600581111561176c5761176c614afd565b145b61178a5760405162461bcd60e51b81526004016104c090614de1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117c39190600401614e28565b6020604051808303815f875af11580156117df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bee9190614c61565b61180b6148e7565b5f8281525f805160206154558339815191526020526040908190208151610100810190925280545f80516020615415833981519152929190829060ff16600581111561185957611859614afd565b600581111561186a5761186a614afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154558339815191526020526040812060030180545f80516020615415833981519152916001600160401b03909116908361192583614eb2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156119af573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119d69190810190614f4e565b9150915080611a395760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c0565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a7c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aa09190614c61565b825114611b045760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c0565b60208201516001600160a01b031615611b7a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c0565b5f80611b898460400151613270565b91509150818714611bf65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c0565b9695505050505050565b611c0a815f613448565b50565b5f9182525f80516020615455833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cce57611c8e816001615036565b611c99906008614c4a565b5081515f90839083908110611cb057611cb0615049565b60200101906001600160f81b03191690815f1a905350600101611c7a565b505f5b6004811015611d3157611ce5816003615036565b611cf0906008614c4a565b6001901c60f81b82611d03836002614d96565b81518110611d1357611d13615049565b60200101906001600160f81b03191690815f1a905350600101611cd1565b505f5b6020811015611d9357611d4881601f615036565b611d53906008614c4a565b86901c60f81b82611d65836006614d96565b81518110611d7557611d75615049565b60200101906001600160f81b03191690815f1a905350600101611d34565b505f5b6008811015611dfe57611daa816007615036565b611db5906008614c4a565b6001600160401b038616901c60f81b82611dd0836026614d96565b81518110611de057611de0615049565b60200101906001600160f81b03191690815f1a905350600101611d96565b505f5b6008811015611e6957611e15816007615036565b611e20906008614c4a565b6001600160401b038516901c60f81b82611e3b83602e614d96565b81518110611e4b57611e4b615049565b60200101906001600160f81b03191690815f1a905350600101611e01565b50949350505050565b611e7a6136a2565b611e83826136ed565b611e8c81613759565b5050565b611e986148e7565b5f805160206154158339815191525f611eb08461229c565b90505f80611ec183604001516130cf565b915091508015611f265760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c0565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f5857611f58614afd565b6005811115611f6957611f69614afd565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ff057611ff0614afd565b148061200e575060018251600581111561200c5761200c614afd565b145b61206d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c0565b60038251600581111561208257612082614afd565b0361208f57506004612093565b5060055b6020808301515f908152600988019091526040812055818160058111156120bc576120bc614afd565b908160058111156120cf576120cf614afd565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561210357612103614afd565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121ce576121ce614afd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b5f5f805160206153b583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561225e575f80fd5b505af1158015612270573d5f803e3d5ffd5b50505050505050565b5f805160206153b583398151915254611e8c906001600160a01b031683836137fa565b60408051606080820183525f8083526020830181905292820152905f805160206154158339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612311573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123389190810190614f4e565b915091508061239f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c0565b82548251146124025760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c0565b60208201516001600160a01b0316156124755760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c0565b509392505050565b5f805f83516036146124a15760405162461bcd60e51b81526004016104c09061505d565b5f805b60028110156124f0576124b8816001615036565b6124c3906008614c4a565b61ffff168682815181106124d9576124d9615049565b016020015160f81c901b91909117906001016124a4565b5061ffff8116156125135760405162461bcd60e51b81526004016104c0906150a6565b5f805b600481101561256e5761252a816003615036565b612535906008614c4a565b63ffffffff1687612547836002614d96565b8151811061255757612557615049565b016020015160f81c901b9190911790600101612516565b5063ffffffff81166003146125955760405162461bcd60e51b81526004016104c0906150e9565b5f805b60208110156125ea576125ac81601f615036565b6125b7906008614c4a565b886125c3836006614d96565b815181106125d3576125d3615049565b016020015160f81c901b9190911790600101612598565b505f805b600881101561264957612602816007615036565b61260d906008614c4a565b6001600160401b031689612622836026614d96565b8151811061263257612632615049565b016020015160f81c901b91909117906001016125ee565b505f805b60088110156126a857612661816007615036565b61266c906008614c4a565b6001600160401b03168a61268183602e614d96565b8151811061269157612691615049565b016020015160f81c901b919091179060010161264d565b5091989097509095509350505050565b6126c06148e7565b5f8281525f8051602061545583398151915260205260408082208151610100810190925280545f8051602061541583398151915293929190829060ff16600581111561270e5761270e614afd565b600581111561271f5761271f614afd565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156127a7576127a7614afd565b146128035760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c0565b60408101516001600160a01b0316336001600160a01b03161461287d5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c0565b61288a8160a00151611c00565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128ce576128ce614afd565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61299a85612994816118e2565b5f611c55565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129c9908590600401614c9a565b6020604051808303815f875af11580156129e5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a099190614c61565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a6a612e5f565b5f805160206153d58339815191525f612a856101ed85613859565b90505f612a9187611803565b9050600281516005811115612aa857612aa8614afd565b14612b075760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c0565b612b108261387c565b5f828260a00151612b219190614d76565b60048501546060840151919250612b43916001600160401b0390911690614c1f565b6001600160401b0316816001600160401b03161115612bc25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c0565b612bcc8882611c0d565b5f612bd6896118e2565b90505f8982604051602001612c0292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c3c8d8688611c55565b6040518263ffffffff1660e01b8152600401612c589190614c9a565b6020604051808303815f875af1158015612c74573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c989190614c61565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d2057612d20614afd565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061127e60015f8051602061543583398151915255565b5f80516020615435833981519152805460011901612e9057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153d5833981519152906001600160401b0316612ee26040860160208701614a61565b6001600160401b03161015612f515760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c0565b6003810154612f63602086018661513f565b61ffff1610158015612f875750612710612f80602086018661513f565b61ffff1611155b612fa35760405162461bcd60e51b81526004016104c09061515a565b80548310156130065760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c0565b806001015483111561306d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c0565b5f61307784613859565b90505f61308382610a62565b90505f6130908883613887565b5f818152600586016020526040902090915087906130ae82826151a5565b509098975050505050505050565b60015f8051602061543583398151915255565b5f8082516027146130f25760405162461bcd60e51b81526004016104c09061505d565b5f805b600281101561314157613109816001615036565b613114906008614c4a565b61ffff1685828151811061312a5761312a615049565b016020015160f81c901b91909117906001016130f5565b5061ffff8116156131645760405162461bcd60e51b81526004016104c0906150a6565b5f805b60048110156131bf5761317b816003615036565b613186906008614c4a565b63ffffffff1686613198836002614d96565b815181106131a8576131a8615049565b016020015160f81c901b9190911790600101613167565b5063ffffffff81166002146131e65760405162461bcd60e51b81526004016104c0906150e9565b5f805b602081101561323b576131fd81601f615036565b613208906008614c4a565b87613214836006614d96565b8151811061322457613224615049565b016020015160f81c901b91909117906001016131e9565b505f8660268151811061325057613250615049565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132935760405162461bcd60e51b81526004016104c09061505d565b5f805b60028110156132e2576132aa816001615036565b6132b5906008614c4a565b61ffff168582815181106132cb576132cb615049565b016020015160f81c901b9190911790600101613296565b5061ffff8116156133055760405162461bcd60e51b81526004016104c0906150a6565b5f805b60048110156133605761331c816003615036565b613327906008614c4a565b63ffffffff1686613339836002614d96565b8151811061334957613349615049565b016020015160f81c901b9190911790600101613308565b5063ffffffff81166004146133875760405162461bcd60e51b81526004016104c0906150e9565b5f805b60208110156133dc5761339e81601f615036565b6133a9906008614c4a565b876133b5836006614d96565b815181106133c5576133c5615049565b016020015160f81c901b919091179060010161338a565b505f805b600881101561343b576133f4816007615036565b6133ff906008614c4a565b6001600160401b031688613414836026614d96565b8151811061342457613424615049565b016020015160f81c901b91909117906001016133e0565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061541583398151915291429190158061352e57506002830154815161352a916001600160401b031690614d96565b8210155b15613554576001600160401b038516606082015281815260408101516020820152613573565b84816060018181516135669190614d76565b6001600160401b03169052505b6060810151613583906064614c1f565b602082015160028501546001600160401b0392909216916135ae9190600160401b900460ff16614c4a565b10156136125760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c0565b831561363b57846001600160401b0316816040018181516136339190614d96565b90525061365a565b846001600160401b0316816040018181516136569190615036565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136eb57604051631afcd79f60e31b815260040160405180910390fd5b565b6136f56136a2565b6136fe81613dc1565b611c0a608082013560a083013561371b60e0850160c08601614a61565b61372c610100860160e0870161513f565b61ffff16613742610120870161010088016151fb565b6137546101408801610120890161521b565b613de2565b6137616136a2565b5f805160206153b58339815191526001600160a01b0382166137da5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c0565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610bee91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614026565b5f610a72825f805160206153b5833981519152546001600160a01b031690614087565b611c0a816001613448565b5f5f80516020615415833981519152426138a76040860160208701614a61565b6001600160401b0316116139195760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c0565b6139296040850160208601614a61565b6001600160401b031661393f6202a30042614d96565b116139b25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c0565b8335613a0a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c0565b83355f90815260098201602052604090205415613a7a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c0565b613a876040850185615236565b9050603014613aee5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c0565b613af78361387c565b5f80613b916040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b3c9190614a61565b6001600160401b03168152602001613b5760408a018a615236565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141e9565b5f82815260078601602052604090209193509150613baf82826152c3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bdc908590600401614c9a565b6020604051808303815f875af1158015613bf8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c1c9190614c61565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c9e57613c9e614afd565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d9391908e01908e01614a61565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613dc96136a2565b613dd161458e565b613dd961459e565b611c0a816145a6565b613dea6136a2565b5f805160206153d583398151915283613e565760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c0565b612710841115613e785760405162461bcd60e51b81526004016104c09061515a565b85871115613ee05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c0565b5f8360ff1611613f4d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c0565b600a60ff84161115613fbf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c0565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61403a6001600160a01b03841683614753565b905080515f1415801561405e57508080602001905181019061405c919061537e565b155b15610bee57604051635274afe760e01b81526001600160a01b03841660048201526024016104c0565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140f19190614c61565b90506141086001600160a01b038516333086614760565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561414c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141709190614c61565b90508181116141d65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c0565b6141e08282615036565b95945050505050565b5f60608260800151516030146142535760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c0565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142ca5761428a816001615036565b614295906008614c4a565b5081515f908390839081106142ac576142ac615049565b60200101906001600160f81b03191690815f1a905350600101614276565b505f5b6004811015614328576142e1816003615036565b6142ec906008614c4a565b505f826142fa836002614d96565b8151811061430a5761430a615049565b60200101906001600160f81b03191690815f1a9053506001016142cd565b505f5b6020811015614385578451816020811061434757614347615049565b1a60f81b82614357836006614d96565b8151811061436757614367615049565b60200101906001600160f81b03191690815f1a90535060010161432b565b505f5b60208110156143e557846020015181602081106143a7576143a7615049565b1a60f81b826143b7836026614d96565b815181106143c7576143c7615049565b60200101906001600160f81b03191690815f1a905350600101614388565b505f5b6008811015614459576143fc816007615036565b614407906008614c4a565b60ff1685604001516001600160401b0316901c60f81b8282604661442b9190614d96565b8151811061443b5761443b615049565b60200101906001600160f81b03191690815f1a9053506001016143e8565b505f5b60308110156144c4578460800151818151811061447b5761447b615049565b01602001516001600160f81b0319168261449683604e614d96565b815181106144a6576144a6615049565b60200101906001600160f81b03191690815f1a90535060010161445c565b505f5b6008811015614536576144db816007615036565b6144e6906008614c4a565b60608601516001600160401b0390811691161c60f81b8261450883607e614d96565b8151811061451857614518615049565b60200101906001600160f81b03191690815f1a9053506001016144c7565b506002816040516145479190615399565b602060405180830381855afa158015614562573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145859190614c61565b94909350915050565b6145966136a2565b6136eb614799565b6136eb6136a2565b6145ae6136a2565b80355f8051602061541583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145fa60808401606085016151fb565b60ff1611156146675760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c0565b5f61467860808401606085016151fb565b60ff16116146e05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c0565b6146f060808301606084016151fb565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556147216060830160408401614a61565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061127e83835f6147a1565b6040516001600160a01b038481166024830152838116604483015260648201839052610a5c9186918216906323b872dd90608401613827565b6130bc6136a2565b6060814710156147c65760405163cd78605960e01b81523060048201526024016104c0565b5f80856001600160a01b031684866040516147e19190615399565b5f6040518083038185875af1925050503d805f811461481b576040519150601f19603f3d011682016040523d82523d5f602084013e614820565b606091505b5091509150611bf68683836060826148405761483b82614887565b61127e565b815115801561485757506001600160a01b0384163b155b1561488057604051639996b31560e01b81526001600160a01b03851660048201526024016104c0565b508061127e565b8051156148975780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148bc90614da9565b5f825580601f106148cb575050565b601f0160209004905f5260205f2090810190611c0a919061492b565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561493f575f815560010161492c565b5090565b8015158114611c0a575f80fd5b803563ffffffff81168114614963575f80fd5b919050565b5f805f6060848603121561497a575f80fd5b83359250602084013561498c81614943565b915061499a60408501614950565b90509250925092565b5f602082840312156149b3575f80fd5b5035919050565b6001600160a01b0381168114611c0a575f80fd5b5f808284036101608112156149e1575f80fd5b610140808212156149f0575f80fd5b8493508301359050614a01816149ba565b809150509250929050565b5f60208284031215614a1c575f80fd5b61127e82614950565b5f8060408385031215614a36575f80fd5b614a3f83614950565b946020939093013593505050565b6001600160401b0381168114611c0a575f80fd5b5f60208284031215614a71575f80fd5b813561127e81614a4d565b5f8060408385031215614a8d575f80fd5b50508035926020909101359150565b5f805f8385036080811215614aaf575f80fd5b84356001600160401b03811115614ac4575f80fd5b850160608188031215614ad5575f80fd5b93506040601f1982011215614ae8575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b3557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b5d60408401826001600160a01b03169052565b506060830151614b7860608401826001600160401b03169052565b506080830151614b9360808401826001600160401b03169052565b5060a0830151614bae60a08401826001600160401b03169052565b5060c0830151614bc960c08401826001600160401b03169052565b5060e0830151614be460e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614be457614be4614beb565b6001600160401b03818116838216028082169190828114614c4257614c42614beb565b505092915050565b8082028115828204841417610a7257610a72614beb565b5f60208284031215614c71575f80fd5b5051919050565b5f5b83811015614c92578181015183820152602001614c7a565b50505f910152565b602081525f8251806020840152614cb8816040850160208701614c78565b601f01601f19169190910160400192915050565b5f82614ce657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b03818116838216019080821115614be457614be4614beb565b80820180821115610a7257610a72614beb565b600181811c90821680614dbd57607f821691505b602082108103614ddb57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614e3a81614da9565b806020870152604060018084165f8114614e5b5760018114614e7757614ea4565b60ff19851660408a0152604084151560051b8a01019550614ea4565b895f5260205f205f5b85811015614e9b5781548b8201860152908301908801614e80565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614ecd57614ecd614beb565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f0d57614f0d614ed7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f3b57614f3b614ed7565b604052919050565b805161496381614943565b5f8060408385031215614f5f575f80fd5b82516001600160401b0380821115614f75575f80fd5b9084019060608287031215614f88575f80fd5b614f90614eeb565b82518152602080840151614fa3816149ba565b82820152604084015183811115614fb8575f80fd5b80850194505087601f850112614fcc575f80fd5b835183811115614fde57614fde614ed7565b614ff0601f8201601f19168301614f13565b93508084528882828701011115615005575f80fd5b61501481838601848801614c78565b50826040830152819550615029818801614f43565b9450505050509250929050565b81810381811115610a7257610a72614beb565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c0a575f80fd5b5f6020828403121561514f575f80fd5b813561127e81615130565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356151b081615130565b61ffff8116905081548161ffff19821617835560208401356151d181614a4d565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6020828403121561520b575f80fd5b813560ff8116811461127e575f80fd5b5f6020828403121561522b575f80fd5b813561127e816149ba565b5f808335601e1984360301811261524b575f80fd5b8301803591506001600160401b03821115615264575f80fd5b602001915036819003821315615278575f80fd5b9250929050565b601f821115610bee57805f5260205f20601f840160051c810160208510156152a45750805b601f840160051c820191505b81811015611007575f81556001016152b0565b81516001600160401b038111156152dc576152dc614ed7565b6152f0816152ea8454614da9565b8461527f565b602080601f831160018114615323575f841561530c5750858301515b5f19600386901b1c1916600185901b178555611005565b5f85815260208120601f198616915b8281101561535157888601518255948401946001909101908401615332565b508582101561536e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561538e575f80fd5b815161127e81614943565b5f82516153aa818460208701614c78565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516155c03803806155c083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154738061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f366004614956565b610357565b005b610154610164366004614991565b6108a9565b6101a7610177366004614991565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e2366004614991565b610a79565b6040516001600160401b0390911681526020016101b1565b61015461020d3660046149bc565b610a8f565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c3660046149fa565b610b6e565b61015461024f366004614a13565b610bfc565b6101a7610262366004614a4f565b610dcc565b6101e7610275366004614991565b610de5565b610154610288366004614956565b610df9565b61015461029b366004614a13565b610ff3565b6101a76102ae366004614a6a565b611257565b6101a76102c1366004614a8a565b61126a565b6101546102d43660046149fa565b611296565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d366004614991565b611453565b610154610320366004614991565b6116d9565b6101c2601481565b61034061033b366004614991565b6117ed565b6040516101b19190614aff565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206153c7833981519152949193919290829060ff1660048111156103bf576103bf614aeb565b60048111156103d0576103d0614aeb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61044c836117ed565b90504260028351600481111561046457610464614aeb565b146104b65760405162461bcd60e51b815260206004820152602a60248201525f805160206153e78339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461051b5760405162461bcd60e51b815260206004820152603360248201525f805160206153e78339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104ad565b5f610525856118cc565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561057257610572614aeb565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003918201805467ffffffffffffffff191691909316179091555f908451600581111561065057610650614aeb565b148061066e575060048451600581111561066c5761066c614aeb565b145b1561069257505f8581526009870160205260409020546001600160401b03166106a5565b88156106a5576106a2868961194e565b90505b8660040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106d88760600151610dcc565b60c0870151608089015160a08a01516040516001600160e01b031960e087901b16815260048101949094526001600160401b039283166024850152908216604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610754573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107789190614bd9565b5f8b815260078901602052604090205560028451600581111561079d5761079d614aeb565b036107af576107af8560600151611bea565b5f85606001518560a001516107c49190614c04565b90506107d08782611bf7565b5f6005600160991b0163ee5b48eb6107e98a8786611c3f565b6040518263ffffffff1660e01b81526004016108059190614c46565b6020604051808303815f875af1158015610821573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108459190614bd9565b604080516001600160401b038581168252888116602083015291810183905291925085169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181525f8051602061544783398151915260205260408082208151610100810190925280545f8051602061540783398151915293929190829060ff1660058111156108f7576108f7614aeb565b600581111561090857610908614aeb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561098d5761098d614aeb565b146109f25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104ad565b6005600160991b016001600160a01b031663ee5b48eb610a178584608001515f611c3f565b6040518263ffffffff1660e01b8152600401610a339190614c46565b6020604051808303815f875af1158015610a4f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a739190614bd9565b50505050565b5f610a8964e8d4a5100083614c78565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ad8575080546001600160401b03808416911610155b15610af65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b218484611e5c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206153c78339815191525f80610b8784611e7a565b604082015191935091506001600160a01b0316610ba45750505050565b600482516005811115610bb957610bb9614aeb565b03610be2575f8181526008840160205260408082208054929055830151610be090826121f1565b505b610a738260400151610bf78460600151610dcc565b612267565b5f805160206153c78339815191525f610c148461228a565b90505f80610c25836040015161246b565b50915091505f610c34836117ed565b9050816001600160401b031681608001516001600160401b03161015610c6c5760405162461bcd60e51b81526004016104ad90614c97565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cb15760405162461bcd60e51b81526004016104ad90614cd9565b60015f87815260068701602052604090205460ff166004811115610cd757610cd7614aeb565b14610d405760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104ad565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610a896001600160401b03831664e8d4a51000614d22565b5f610def826117ed565b60a0015192915050565b5f805160206153c78339815191525f610e11856126a6565b5f86815260058401602052604090205460c0820151919250610e4391620100009091046001600160401b031690614d39565b6001600160401b03168160e001516001600160401b03161015610ec45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104ad565b8315610fec575f610ed5868561194e565b5f8781526009850160205260409020805467ffffffffffffffff19166001600160401b03831617905560048401546060840151919250600160401b90046001600160a01b03169063778c06b590610f2b90610dcc565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820181905260448201529181166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610fa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc69190614bd9565b5f87815260088501602052604081208054909190610fe5908490614d59565b9091555050505b5050505050565b5f805160206153c78339815191525f61100b8461228a565b90505f8061101c836040015161246b565b50915091505f61102b836117ed565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561106557611065614aeb565b600481111561107657611076614aeb565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156111155760405162461bcd60e51b81526004016104ad90614c97565b826001600160401b03168160e001516001600160401b0316111561114b5760405162461bcd60e51b81526004016104ad90614cd9565b60038151600481111561116057611160614aeb565b146111b45760405162461bcd60e51b815260206004820152603160248201525f805160206153e78339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104ad565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a01909252909120546111ea91906121f1565b856007015f8881526020019081526020015f205f90556112158160200151610bf78360600151610dcc565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f611263833384612a4f565b9392505050565b5f611273612e4d565b61127e848484612e84565b905061126360015f8051602061542783398151915255565b5f805160206154078339815191525f6112ae8361228a565b90505f806112bf83604001516130bd565b91509150806113215760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104ad565b5f8281526007850160205260408120805461133b90614d6c565b905011801561136d575060015f83815260088601602052604090205460ff16600581111561136b5761136b614aeb565b145b6113895760405162461bcd60e51b81526004016104ad90614da4565b5f82815260078501602052604081206113a19161489e565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206153c783398151915293929190829060ff1660048111156114b4576114b4614aeb565b60048111156114c5576114c5614aeb565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561154c5761154c614aeb565b148061156a575060038151600481111561156857611568614aeb565b145b6115be5760405162461bcd60e51b815260206004820152603260248201525f805160206153e7833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104ad565b5f6115cc82604001516117ed565b905080608001516001600160401b03165f036116505760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104ad565b6005600160991b016001600160a01b031663ee5b48eb61167d846040015184608001518560a00151611c3f565b6040518263ffffffff1660e01b81526004016116999190614c46565b6020604051808303815f875af11580156116b5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fec9190614bd9565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061540783398151915292919061172190614d6c565b9050118015611753575060015f83815260088301602052604090205460ff16600581111561175157611751614aeb565b145b61176f5760405162461bcd60e51b81526004016104ad90614da4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117a89190600401614deb565b6020604051808303815f875af11580156117c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117e89190614bd9565b505050565b6117f56148d5565b5f8281525f805160206154478339815191526020526040908190208151610100810190925280545f80516020615407833981519152929190829060ff16600581111561184357611843614aeb565b600581111561185457611854614aeb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206154478339815191526020526040812060030180545f80516020615407833981519152916001600160401b03909116908361190f83614e75565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611999573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119c09190810190614f11565b9150915080611a235760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104ad565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8a9190614bd9565b825114611aee5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104ad565b60208201516001600160a01b031615611b645760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104ad565b5f80611b73846040015161325e565b91509150818714611be05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104ad565b9695505050505050565b611bf4815f613436565b50565b5f9182525f80516020615447833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611cb857611c78816001614ff9565b611c83906008614d22565b5081515f90839083908110611c9a57611c9a61500c565b60200101906001600160f81b03191690815f1a905350600101611c64565b505f5b6004811015611d1b57611ccf816003614ff9565b611cda906008614d22565b6001901c60f81b82611ced836002614d59565b81518110611cfd57611cfd61500c565b60200101906001600160f81b03191690815f1a905350600101611cbb565b505f5b6020811015611d7d57611d3281601f614ff9565b611d3d906008614d22565b86901c60f81b82611d4f836006614d59565b81518110611d5f57611d5f61500c565b60200101906001600160f81b03191690815f1a905350600101611d1e565b505f5b6008811015611de857611d94816007614ff9565b611d9f906008614d22565b6001600160401b038616901c60f81b82611dba836026614d59565b81518110611dca57611dca61500c565b60200101906001600160f81b03191690815f1a905350600101611d80565b505f5b6008811015611e5357611dff816007614ff9565b611e0a906008614d22565b6001600160401b038516901c60f81b82611e2583602e614d59565b81518110611e3557611e3561500c565b60200101906001600160f81b03191690815f1a905350600101611deb565b50949350505050565b611e64613690565b611e6d826136db565b611e7681613747565b5050565b611e826148d5565b5f5f8051602061540783398151915281611e9b8561228a565b90505f80611eac83604001516130bd565b915091508015611f115760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104ad565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611f4357611f43614aeb565b6005811115611f5457611f54614aeb565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611fdb57611fdb614aeb565b1480611ff95750600182516005811115611ff757611ff7614aeb565b145b6120585760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104ad565b60038251600581111561206d5761206d614aeb565b0361207a5750600461207e565b5060055b6020808301515f908152600988019091526040812055818160058111156120a7576120a7614aeb565b908160058111156120ba576120ba614aeb565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156120ee576120ee614aeb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156121b9576121b9614aeb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509791965090945050505050565b5f5f805160206153a783398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561224c575f80fd5b505af115801561225e573d5f803e3d5ffd5b50505050505050565b5f805160206153a783398151915254611e76906001600160a01b031683836137e8565b60408051606080820183525f8083526020830181905292820152905f805160206154078339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156122ff573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123269190810190614f11565b915091508061238d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104ad565b82548251146123f05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104ad565b60208201516001600160a01b0316156124635760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104ad565b509392505050565b5f805f835160361461248f5760405162461bcd60e51b81526004016104ad90615020565b5f805b60028110156124de576124a6816001614ff9565b6124b1906008614d22565b61ffff168682815181106124c7576124c761500c565b016020015160f81c901b9190911790600101612492565b5061ffff8116156125015760405162461bcd60e51b81526004016104ad90615069565b5f805b600481101561255c57612518816003614ff9565b612523906008614d22565b63ffffffff1687612535836002614d59565b815181106125455761254561500c565b016020015160f81c901b9190911790600101612504565b5063ffffffff81166003146125835760405162461bcd60e51b81526004016104ad906150ac565b5f805b60208110156125d85761259a81601f614ff9565b6125a5906008614d22565b886125b1836006614d59565b815181106125c1576125c161500c565b016020015160f81c901b9190911790600101612586565b505f805b6008811015612637576125f0816007614ff9565b6125fb906008614d22565b6001600160401b031689612610836026614d59565b815181106126205761262061500c565b016020015160f81c901b91909117906001016125dc565b505f805b60088110156126965761264f816007614ff9565b61265a906008614d22565b6001600160401b03168a61266f83602e614d59565b8151811061267f5761267f61500c565b016020015160f81c901b919091179060010161263b565b5091989097509095509350505050565b6126ae6148d5565b5f8281525f8051602061544783398151915260205260408082208151610100810190925280545f8051602061540783398151915293929190829060ff1660058111156126fc576126fc614aeb565b600581111561270d5761270d614aeb565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561279557612795614aeb565b146127f15760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104ad565b60408101516001600160a01b0316336001600160a01b03161461286b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104ad565b6128788160a00151611bea565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156128bc576128bc614aeb565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61298885612982816118cc565b5f611c3f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906129b7908590600401614c46565b6020604051808303815f875af11580156129d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129f79190614bd9565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f612a58612e4d565b5f805160206153c78339815191525f612a736101e285613847565b90505f612a7f876117ed565b9050600281516005811115612a9657612a96614aeb565b14612af55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104ad565b612afe8261386a565b5f828260a00151612b0f9190614d39565b60048501546060840151919250612b31916001600160401b03909116906150f3565b6001600160401b0316816001600160401b03161115612bb05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104ad565b612bba8882611bf7565b5f612bc4896118cc565b90505f8982604051602001612bf092919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612c2a8d8688611c3f565b6040518263ffffffff1660e01b8152600401612c469190614c46565b6020604051808303815f875af1158015612c62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c869190614bd9565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612d0e57612d0e614aeb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509550505050505061126360015f8051602061542783398151915255565b5f80516020615427833981519152805460011901612e7e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153c7833981519152906001600160401b0316612ed06040860160208701614a4f565b6001600160401b03161015612f3f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104ad565b6003810154612f51602086018661512d565b61ffff1610158015612f755750612710612f6e602086018661512d565b61ffff1611155b612f915760405162461bcd60e51b81526004016104ad90615148565b8054831015612ff45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104ad565b806001015483111561305b5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104ad565b5f61306584613847565b90505f61307182610a79565b90505f61307e8883613875565b5f8181526005860160205260409020909150879061309c8282615193565b509098975050505050505050565b60015f8051602061542783398151915255565b5f8082516027146130e05760405162461bcd60e51b81526004016104ad90615020565b5f805b600281101561312f576130f7816001614ff9565b613102906008614d22565b61ffff168582815181106131185761311861500c565b016020015160f81c901b91909117906001016130e3565b5061ffff8116156131525760405162461bcd60e51b81526004016104ad90615069565b5f805b60048110156131ad57613169816003614ff9565b613174906008614d22565b63ffffffff1686613186836002614d59565b815181106131965761319661500c565b016020015160f81c901b9190911790600101613155565b5063ffffffff81166002146131d45760405162461bcd60e51b81526004016104ad906150ac565b5f805b6020811015613229576131eb81601f614ff9565b6131f6906008614d22565b87613202836006614d59565b815181106132125761321261500c565b016020015160f81c901b91909117906001016131d7565b505f8660268151811061323e5761323e61500c565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e146132815760405162461bcd60e51b81526004016104ad90615020565b5f805b60028110156132d057613298816001614ff9565b6132a3906008614d22565b61ffff168582815181106132b9576132b961500c565b016020015160f81c901b9190911790600101613284565b5061ffff8116156132f35760405162461bcd60e51b81526004016104ad90615069565b5f805b600481101561334e5761330a816003614ff9565b613315906008614d22565b63ffffffff1686613327836002614d59565b815181106133375761333761500c565b016020015160f81c901b91909117906001016132f6565b5063ffffffff81166004146133755760405162461bcd60e51b81526004016104ad906150ac565b5f805b60208110156133ca5761338c81601f614ff9565b613397906008614d22565b876133a3836006614d59565b815181106133b3576133b361500c565b016020015160f81c901b9190911790600101613378565b505f805b6008811015613429576133e2816007614ff9565b6133ed906008614d22565b6001600160401b031688613402836026614d59565b815181106134125761341261500c565b016020015160f81c901b91909117906001016133ce565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061540783398151915291429190158061351c575060028301548151613518916001600160401b031690614d59565b8210155b15613542576001600160401b038516606082015281815260408101516020820152613561565b84816060018181516135549190614d39565b6001600160401b03169052505b60608101516135719060646150f3565b602082015160028501546001600160401b03929092169161359c9190600160401b900460ff16614d22565b10156136005760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104ad565b831561362957846001600160401b0316816040018181516136219190614d59565b905250613648565b846001600160401b0316816040018181516136449190614ff9565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136d957604051631afcd79f60e31b815260040160405180910390fd5b565b6136e3613690565b6136ec81613daf565b611bf4608082013560a083013561370960e0850160c08601614a4f565b61371a610100860160e0870161512d565b61ffff16613730610120870161010088016151e9565b61374261014088016101208901615209565b613dd0565b61374f613690565b5f805160206153a78339815191526001600160a01b0382166137c85760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104ad565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b038381166024830152604482018390526117e891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614014565b5f610a89825f805160206153a7833981519152546001600160a01b031690614075565b611bf4816001613436565b5f5f80516020615407833981519152426138956040860160208701614a4f565b6001600160401b0316116139075760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104ad565b6139176040850160208601614a4f565b6001600160401b031661392d6202a30042614d59565b116139a05760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104ad565b83356139f85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104ad565b83355f90815260098201602052604090205415613a685760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104ad565b613a756040850185615224565b9050603014613adc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104ad565b613ae58361386a565b5f80613b7f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b2a9190614a4f565b6001600160401b03168152602001613b4560408a018a615224565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141d7565b5f82815260078601602052604090209193509150613b9d82826152b1565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bca908590600401614c46565b6020604051808303815f875af1158015613be6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c0a9190614bd9565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613c8c57613c8c614aeb565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d8191908e01908e01614a4f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613db7613690565b613dbf61457c565b613dc761458c565b611bf481614594565b613dd8613690565b5f805160206153c783398151915283613e445760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104ad565b612710841115613e665760405162461bcd60e51b81526004016104ad90615148565b85871115613ece5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104ad565b5f8360ff1611613f3b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104ad565b600a60ff84161115613fad5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104ad565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6140286001600160a01b03841683614741565b905080515f1415801561404c57508080602001905181019061404a9190615370565b155b156117e857604051635274afe760e01b81526001600160a01b03841660048201526024016104ad565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140df9190614bd9565b90506140f66001600160a01b03851633308661474e565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561413a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061415e9190614bd9565b90508181116141c45760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104ad565b6141ce8282614ff9565b95945050505050565b5f60608260800151516030146142415760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104ad565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156142b857614278816001614ff9565b614283906008614d22565b5081515f9083908390811061429a5761429a61500c565b60200101906001600160f81b03191690815f1a905350600101614264565b505f5b6004811015614316576142cf816003614ff9565b6142da906008614d22565b505f826142e8836002614d59565b815181106142f8576142f861500c565b60200101906001600160f81b03191690815f1a9053506001016142bb565b505f5b602081101561437357845181602081106143355761433561500c565b1a60f81b82614345836006614d59565b815181106143555761435561500c565b60200101906001600160f81b03191690815f1a905350600101614319565b505f5b60208110156143d357846020015181602081106143955761439561500c565b1a60f81b826143a5836026614d59565b815181106143b5576143b561500c565b60200101906001600160f81b03191690815f1a905350600101614376565b505f5b6008811015614447576143ea816007614ff9565b6143f5906008614d22565b60ff1685604001516001600160401b0316901c60f81b828260466144199190614d59565b815181106144295761442961500c565b60200101906001600160f81b03191690815f1a9053506001016143d6565b505f5b60308110156144b257846080015181815181106144695761446961500c565b01602001516001600160f81b0319168261448483604e614d59565b815181106144945761449461500c565b60200101906001600160f81b03191690815f1a90535060010161444a565b505f5b6008811015614524576144c9816007614ff9565b6144d4906008614d22565b60608601516001600160401b0390811691161c60f81b826144f683607e614d59565b815181106145065761450661500c565b60200101906001600160f81b03191690815f1a9053506001016144b5565b50600281604051614535919061538b565b602060405180830381855afa158015614550573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145739190614bd9565b94909350915050565b614584613690565b6136d9614787565b6136d9613690565b61459c613690565b80355f8051602061540783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146145e860808401606085016151e9565b60ff1611156146555760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104ad565b5f61466660808401606085016151e9565b60ff16116146ce5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104ad565b6146de60808301606084016151e9565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561470f6060830160408401614a4f565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b606061126383835f61478f565b6040516001600160a01b038481166024830152838116604483015260648201839052610a739186918216906323b872dd90608401613815565b6130aa613690565b6060814710156147b45760405163cd78605960e01b81523060048201526024016104ad565b5f80856001600160a01b031684866040516147cf919061538b565b5f6040518083038185875af1925050503d805f8114614809576040519150601f19603f3d011682016040523d82523d5f602084013e61480e565b606091505b5091509150611be086838360608261482e5761482982614875565b611263565b815115801561484557506001600160a01b0384163b155b1561486e57604051639996b31560e01b81526001600160a01b03851660048201526024016104ad565b5080611263565b8051156148855780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546148aa90614d6c565b5f825580601f106148b9575050565b601f0160209004905f5260205f2090810190611bf49190614919565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561492d575f815560010161491a565b5090565b8015158114611bf4575f80fd5b803563ffffffff81168114614951575f80fd5b919050565b5f805f60608486031215614968575f80fd5b83359250602084013561497a81614931565b91506149886040850161493e565b90509250925092565b5f602082840312156149a1575f80fd5b5035919050565b6001600160a01b0381168114611bf4575f80fd5b5f808284036101608112156149cf575f80fd5b610140808212156149de575f80fd5b84935083013590506149ef816149a8565b809150509250929050565b5f60208284031215614a0a575f80fd5b6112638261493e565b5f8060408385031215614a24575f80fd5b614a2d8361493e565b946020939093013593505050565b6001600160401b0381168114611bf4575f80fd5b5f60208284031215614a5f575f80fd5b813561126381614a3b565b5f8060408385031215614a7b575f80fd5b50508035926020909101359150565b5f805f8385036080811215614a9d575f80fd5b84356001600160401b03811115614ab2575f80fd5b850160608188031215614ac3575f80fd5b93506040601f1982011215614ad6575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b815161010082019060068110614b2357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526040830151614b4b60408401826001600160a01b03169052565b506060830151614b6660608401826001600160401b03169052565b506080830151614b8160808401826001600160401b03169052565b5060a0830151614b9c60a08401826001600160401b03169052565b5060c0830151614bb760c08401826001600160401b03169052565b5060e0830151614bd260e08401826001600160401b03169052565b5092915050565b5f60208284031215614be9575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614bd257614bd2614bf0565b5f5b83811015614c3e578181015183820152602001614c26565b50505f910152565b602081525f8251806020840152614c64816040850160208701614c24565b601f01601f19169190910160400192915050565b5f82614c9257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610a8957610a89614bf0565b6001600160401b03818116838216019080821115614bd257614bd2614bf0565b80820180821115610a8957610a89614bf0565b600181811c90821680614d8057607f821691505b602082108103614d9e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614dfd81614d6c565b806020870152604060018084165f8114614e1e5760018114614e3a57614e67565b60ff19851660408a0152604084151560051b8a01019550614e67565b895f5260205f205f5b85811015614e5e5781548b8201860152908301908801614e43565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614e9057614e90614bf0565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614ed057614ed0614e9a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614efe57614efe614e9a565b604052919050565b805161495181614931565b5f8060408385031215614f22575f80fd5b82516001600160401b0380821115614f38575f80fd5b9084019060608287031215614f4b575f80fd5b614f53614eae565b82518152602080840151614f66816149a8565b82820152604084015183811115614f7b575f80fd5b80850194505087601f850112614f8f575f80fd5b835183811115614fa157614fa1614e9a565b614fb3601f8201601f19168301614ed6565b93508084528882828701011115614fc8575f80fd5b614fd781838601848801614c24565b50826040830152819550614fec818801614f06565b9450505050509250929050565b81810381811115610a8957610a89614bf0565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461511657615116614bf0565b505092915050565b61ffff81168114611bf4575f80fd5b5f6020828403121561513d575f80fd5b81356112638161511e565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561519e8161511e565b61ffff8116905081548161ffff19821617835560208401356151bf81614a3b565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f602082840312156151f9575f80fd5b813560ff81168114611263575f80fd5b5f60208284031215615219575f80fd5b8135611263816149a8565b5f808335601e19843603018112615239575f80fd5b8301803591506001600160401b03821115615252575f80fd5b602001915036819003821315615266575f80fd5b9250929050565b601f8211156117e857805f5260205f20601f840160051c810160208510156152925750805b601f840160051c820191505b81811015610fec575f815560010161529e565b81516001600160401b038111156152ca576152ca614e9a565b6152de816152d88454614d6c565b8461526d565b602080601f831160018114615311575f84156152fa5750858301515b5f19600386901b1c1916600185901b178555615368565b5f85815260208120601f198616915b8281101561533f57888601518255948401946001909101908401615320565b508582101561535c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615380575f80fd5b815161126381614931565b5f825161539c818460208701614c24565b919091019291505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -370,37 +370,6 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMS return _ERC20TokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_ERC20TokenStakingManager.CallOpts) } -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { - return _ERC20TokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ERC20TokenStakingManager.CallOpts) -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { - return _ERC20TokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ERC20TokenStakingManager.CallOpts) -} - // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) diff --git a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go index a1f6b6cc3..d343cda87 100644 --- a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go +++ b/abi-bindings/go/staking/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\":\"calculateReward\",\"inputs\":[{\"name\":\"stakeAmount\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"startTime\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"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: "0x60a0604052348015600e575f80fd5b5060405161029d38038061029d833981016040819052602b91603b565b6001600160401b03166080526066565b5f60208284031215604a575f80fd5b81516001600160401b0381168114605f575f80fd5b9392505050565b60805161021a6100835f395f81816079015260d3015261021a5ff3fe608060405234801561000f575f80fd5b506004361061003f575f3560e01c80635dcc9391146100435780639d4ba9db14610061578063bb65b24214610074575b5f80fd5b61004e6301e1338081565b6040519081526020015b60405180910390f35b61004e61006f36600461014b565b6100b4565b61009b7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610058565b5f6127106301e133806100c787876101a9565b67ffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168961010791906101d1565b61011191906101d1565b61011b91906101ee565b61012591906101ee565b9695505050505050565b803567ffffffffffffffff81168114610146575f80fd5b919050565b5f805f805f60a0868803121561015f575f80fd5b8535945061016f6020870161012f565b935061017d6040870161012f565b94979396509394606081013594506080013592915050565b634e487b7160e01b5f52601160045260245ffd5b67ffffffffffffffff8281168282160390808211156101ca576101ca610195565b5092915050565b80820281158282048414176101e8576101e8610195565b92915050565b5f8261020857634e487b7160e01b5f52601260045260245ffd5b50049056fea164736f6c6343000819000a", + 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", } // ExampleRewardCalculatorABI is the input ABI used to generate the binding from. @@ -233,12 +233,43 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINY return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) } -// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(opts *bind.CallOpts, stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, startTime, endTime, arg3, arg4) + err := _ExampleRewardCalculator.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) +} + +// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. +// +// 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) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) if err != nil { return *new(*big.Int), err @@ -250,18 +281,18 @@ func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) CalculateReward(o } -// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +// 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) } -// CalculateReward is a free data retrieval call binding the contract method 0x9d4ba9db. +// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. // -// Solidity: function calculateReward(uint256 stakeAmount, uint64 startTime, uint64 endTime, uint256 , uint256 ) view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) CalculateReward(stakeAmount *big.Int, startTime uint64, endTime uint64, arg3 *big.Int, arg4 *big.Int) (*big.Int, error) { - return _ExampleRewardCalculator.Contract.CalculateReward(&_ExampleRewardCalculator.CallOpts, stakeAmount, startTime, endTime, arg3, arg4) +// 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) } // RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 2b0241b15..4486a3542 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -75,8 +75,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\":\"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\":\"UPTIME_REWARDS_THRESHOLD_PERCENTAGE\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint8\",\"internalType\":\"uint8\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161526538038061526583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151188061014d5f395ff3fe608060405260043610610147575f3560e01c806376f78621116100b3578063ba3a4b971161006d578063ba3a4b97146103d8578063bee0a03f146103f7578063c599e24f14610416578063c974d1b614610429578063d5f20ff61461043d578063df93d8de14610469575f80fd5b806376f786211461033a57806380a8ad941461035957806398f3e2b41461036c578063a3a65e481461038b578063afba878a146103aa578063b771b3bc146103be575f80fd5b8063329c3e1211610104578063329c3e121461026457806335455ded14610296578063467ef06f146102be5780635297fae6146102dd57806362065856146102fc57806366435abf1461031b575f80fd5b80630118acc41461014b5780630322ed981461016c5780630cdd09851461018b578063151d30d1146101e85780631f7a9d8f1461020e5780632e2194d81461022d575b5f80fd5b348015610156575f80fd5b5061016a61016536600461468f565b61047f565b005b348015610177575f80fd5b5061016a6101863660046146ca565b6109a7565b348015610196575f80fd5b506101d56101a53660046146ca565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101f3575f80fd5b506101fc600a81565b60405160ff90911681526020016101df565b348015610219575f80fd5b5061016a6102283660046146e1565b610b77565b348015610238575f80fd5b5061024c6102473660046146ca565b610c54565b6040516001600160401b0390911681526020016101df565b34801561026f575f80fd5b5061027e6001600160991b0181565b6040516001600160a01b0390911681526020016101df565b3480156102a1575f80fd5b506102ab61271081565b60405161ffff90911681526020016101df565b3480156102c9575f80fd5b5061016a6102d83660046146f8565b610c6a565b3480156102e8575f80fd5b5061016a6102f7366004614711565b610d06565b348015610307575f80fd5b506101d561031636600461474d565b610ed6565b348015610326575f80fd5b5061024c6103353660046146ca565b610eef565b348015610345575f80fd5b5061016a61035436600461468f565b610f03565b6101d5610367366004614768565b611121565b348015610377575f80fd5b5061016a610386366004614711565b61114d565b348015610396575f80fd5b5061016a6103a53660046146f8565b6113b1565b3480156103b5575f80fd5b506101fc605081565b3480156103c9575f80fd5b5061027e6005600160991b0181565b3480156103e3575f80fd5b5061016a6103f23660046146ca565b61156e565b348015610402575f80fd5b5061016a6104113660046146ca565b6117f4565b6101d56104243660046146ca565b611903565b348015610434575f80fd5b506101fc601481565b348015610448575f80fd5b5061045c6104573660046146ca565b61190f565b6040516101df91906147d5565b348015610474575f80fd5b5061024c6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f8051602061506c833981519152949193919290829060ff1660048111156104e7576104e76147c1565b60048111156104f8576104f86147c1565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105748361190f565b90504260028351600481111561058c5761058c6147c1565b146105de5760405162461bcd60e51b815260206004820152602a60248201525f8051602061508c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106435760405162461bcd60e51b815260206004820152603360248201525f8051602061508c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105d5565b5f61064d856119ee565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561069a5761069a6147c1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790558715610887575f6107738689611a70565b6001600160401b03169050605060ff168460c001518461079391906148c3565b61079d91906148e3565b6001600160401b03166107b182606461490e565b10610885578660040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6107e98760600151610ed6565b608088015160a08901516040516001600160e01b031960e086901b16815260048101939093526001600160401b0391821660248401521660448201525f60648201819052608482015260a401602060405180830381865afa158015610850573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108749190614925565b5f8b81526009890160205260409020555b505b60028351600581111561089c5761089c6147c1565b036108ae576108ae8460600151611d0c565b5f84606001518460a001516108c391906148c3565b90506108cf8682611d19565b5f6005600160991b0163ee5b48eb6108e8898686611d61565b6040518263ffffffff1660e01b8152600401610904919061495e565b6020604051808303815f875af1158015610920573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109449190614925565b604080516001600160401b038581168252878116602083015291810183905291925084169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206150ec83398151915260205260408082208151610100810190925280545f805160206150ac83398151915293929190829060ff1660058111156109f5576109f56147c1565b6005811115610a0657610a066147c1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a8b57610a8b6147c1565b14610af05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105d5565b6005600160991b016001600160a01b031663ee5b48eb610b158584608001515f611d61565b6040518263ffffffff1660e01b8152600401610b31919061495e565b6020604051808303815f875af1158015610b4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b719190614925565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bc0575080546001600160401b03808416911610155b15610bde5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c0883611f80565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c6464e8d4a5100083614990565b92915050565b5f8051602061506c8339815191525f610c8283611f91565b9050600481516005811115610c9957610c996147c1565b03610ce7576040808201516001600160a01b0381165f908152600a85016020529190912054610cc89190612304565b6040808201516001600160a01b03165f908152600a8401602052908120555b610d018160400151610cfc8360600151610ed6565b612362565b505050565b5f8051602061506c8339815191525f610d1e84612379565b90505f80610d2f836040015161255a565b50915091505f610d3e8361190f565b9050816001600160401b031681608001516001600160401b03161015610d765760405162461bcd60e51b81526004016105d5906149af565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dbb5760405162461bcd60e51b81526004016105d5906149f1565b60015f87815260068701602052604090205460ff166004811115610de157610de16147c1565b14610e4a5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105d5565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c646001600160401b03831664e8d4a5100061490e565b5f610ef98261190f565b60a0015192915050565b5f8051602061506c8339815191525f610f1b85612795565b5f86815260058401602052604090205460c0820151919250610f4d91620100009091046001600160401b031690614a3a565b6001600160401b03168160e001516001600160401b03161015610fce5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105d5565b831561111a575f610fdf8685611a70565b9050605060ff168260c001518360e00151610ffa91906148c3565b61100491906148e3565b6001600160401b03166110188260646148e3565b6001600160401b031610611118578260040160089054906101000a90046001600160a01b03166001600160a01b0316639d4ba9db6110598460600151610ed6565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820152911660448201525f60648201819052608482015260a401602060405180830381865afa1580156110c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e59190614925565b6040808401516001600160a01b03165f908152600a86016020529081208054909190611112908490614a5a565b90915550505b505b5050505050565b5f61112a612b3e565b611135838334612b75565b9050610c6460015f805160206150cc83398151915255565b5f8051602061506c8339815191525f61116584612379565b90505f80611176836040015161255a565b50915091505f6111858361190f565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156111bf576111bf6147c1565b60048111156111d0576111d06147c1565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561126f5760405162461bcd60e51b81526004016105d5906149af565b826001600160401b03168160e001516001600160401b031611156112a55760405162461bcd60e51b81526004016105d5906149f1565b6003815160048111156112ba576112ba6147c1565b1461130e5760405162461bcd60e51b815260206004820152603160248201525f8051602061508c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105d5565b5f8781526006870160209081526040808320805460ff191660041790558382015160098a01909252909120546113449190612304565b856009015f8881526020019081526020015f205f905561136f8160200151610cfc8360600151610ed6565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206150ac8339815191525f6113c983612379565b90505f806113da8360400151612da3565b915091508061143c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105d5565b5f8281526007850160205260408120805461145690614a6d565b9050118015611488575060015f83815260088601602052604090205460ff166005811115611486576114866147c1565b145b6114a45760405162461bcd60e51b81526004016105d590614a9f565b5f82815260078501602052604081206114bc916145d7565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061506c83398151915293929190829060ff1660048111156115cf576115cf6147c1565b60048111156115e0576115e06147c1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611667576116676147c1565b14806116855750600381516004811115611683576116836147c1565b145b6116d95760405162461bcd60e51b815260206004820152603260248201525f8051602061508c833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105d5565b5f6116e7826040015161190f565b905080608001516001600160401b03165f0361176b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105d5565b6005600160991b016001600160a01b031663ee5b48eb611798846040015184608001518560a00151611d61565b6040518263ffffffff1660e01b81526004016117b4919061495e565b6020604051808303815f875af11580156117d0573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a9190614925565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150ac83398151915292919061183c90614a6d565b905011801561186e575060015f83815260088301602052604090205460ff16600581111561186c5761186c6147c1565b145b61188a5760405162461bcd60e51b81526004016105d590614a9f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118c39190600401614ae6565b6020604051808303815f875af11580156118df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d019190614925565b5f610c64823334612f44565b61191761460e565b5f8281525f805160206150ec8339815191526020526040908190208151610100810190925280545f805160206150ac833981519152929190829060ff166005811115611965576119656147c1565b6005811115611976576119766147c1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150ec8339815191526020526040812060030180545f805160206150ac833981519152916001600160401b039091169083611a3183614b70565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611abb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ae29190810190614c20565b9150915080611b455760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105d5565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bac9190614925565b825114611c105760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105d5565b60208201516001600160a01b031615611c865760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105d5565b5f80611c95846040015161333f565b91509150818714611d025760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105d5565b9695505050505050565b611d16815f613517565b50565b5f9182525f805160206150ec833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611dda57611d9a816001614d08565b611da590600861490e565b5081515f90839083908110611dbc57611dbc614d1b565b60200101906001600160f81b03191690815f1a905350600101611d86565b505f5b6004811015611e3d57611df1816003614d08565b611dfc90600861490e565b6001901c60f81b82611e0f836002614a5a565b81518110611e1f57611e1f614d1b565b60200101906001600160f81b03191690815f1a905350600101611ddd565b505f5b6020811015611e9f57611e5481601f614d08565b611e5f90600861490e565b86901c60f81b82611e71836006614a5a565b81518110611e8157611e81614d1b565b60200101906001600160f81b03191690815f1a905350600101611e40565b505f5b6008811015611f0a57611eb6816007614d08565b611ec190600861490e565b6001600160401b038616901c60f81b82611edc836026614a5a565b81518110611eec57611eec614d1b565b60200101906001600160f81b03191690815f1a905350600101611ea2565b505f5b6008811015611f7557611f21816007614d08565b611f2c90600861490e565b6001600160401b038516901c60f81b82611f4783602e614a5a565b81518110611f5757611f57614d1b565b60200101906001600160f81b03191690815f1a905350600101611f0d565b5090505b9392505050565b611f88613771565b611d16816137bc565b611f9961460e565b5f805160206150ac8339815191525f611fb184612379565b90505f80611fc28360400151612da3565b9150915080156120275760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105d5565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115612059576120596147c1565b600581111561206a5761206a6147c1565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156120f1576120f16147c1565b148061210f575060018251600581111561210d5761210d6147c1565b145b61216e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105d5565b600382516005811115612183576121836147c1565b0361219057506004612194565b5060055b6020808301515f908152600988019091526040812055818160058111156121bd576121bd6147c1565b908160058111156121d0576121d06147c1565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612204576122046147c1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156122cf576122cf6147c1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612350575f80fd5b505af1158015611118573d5f803e3d5ffd5b6123756001600160a01b03831682613828565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206150ac8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156123ee573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124159190810190614c20565b915091508061247c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105d5565b82548251146124df5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105d5565b60208201516001600160a01b0316156125525760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105d5565b509392505050565b5f805f835160361461257e5760405162461bcd60e51b81526004016105d590614d2f565b5f805b60028110156125cd57612595816001614d08565b6125a090600861490e565b61ffff168682815181106125b6576125b6614d1b565b016020015160f81c901b9190911790600101612581565b5061ffff8116156125f05760405162461bcd60e51b81526004016105d590614d78565b5f805b600481101561264b57612607816003614d08565b61261290600861490e565b63ffffffff1687612624836002614a5a565b8151811061263457612634614d1b565b016020015160f81c901b91909117906001016125f3565b5063ffffffff81166003146126725760405162461bcd60e51b81526004016105d590614dbb565b5f805b60208110156126c75761268981601f614d08565b61269490600861490e565b886126a0836006614a5a565b815181106126b0576126b0614d1b565b016020015160f81c901b9190911790600101612675565b505f805b6008811015612726576126df816007614d08565b6126ea90600861490e565b6001600160401b0316896126ff836026614a5a565b8151811061270f5761270f614d1b565b016020015160f81c901b91909117906001016126cb565b505f805b60088110156127855761273e816007614d08565b61274990600861490e565b6001600160401b03168a61275e83602e614a5a565b8151811061276e5761276e614d1b565b016020015160f81c901b919091179060010161272a565b5091989097509095509350505050565b61279d61460e565b5f8281525f805160206150ec83398151915260205260408082208151610100810190925280545f805160206150ac83398151915293929190829060ff1660058111156127eb576127eb6147c1565b60058111156127fc576127fc6147c1565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612884576128846147c1565b146128e05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105d5565b60408101516001600160a01b0316336001600160a01b03161461295a5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105d5565b6129678160a00151611d0c565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156129ab576129ab6147c1565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612a7785612a71816119ee565b5f611d61565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612aa690859060040161495e565b6020604051808303815f875af1158015612ac2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ae69190614925565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f805160206150cc833981519152805460011901612b6f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061506c833981519152906001600160401b0316612bc1604086016020870161474d565b6001600160401b03161015612c305760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105d5565b6003810154612c426020860186614e11565b61ffff1610158015612c665750612710612c5f6020860186614e11565b61ffff1611155b612c825760405162461bcd60e51b81526004016105d590614e2c565b8054831015612ce55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105d5565b8060010154831115612d4c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105d5565b825f612d5782610c54565b90505f612d6488836138bb565b5f81815260058601602052604090209091508790612d828282614e77565b509098975050505050505050565b60015f805160206150cc83398151915255565b5f808251602714612dc65760405162461bcd60e51b81526004016105d590614d2f565b5f805b6002811015612e1557612ddd816001614d08565b612de890600861490e565b61ffff16858281518110612dfe57612dfe614d1b565b016020015160f81c901b9190911790600101612dc9565b5061ffff811615612e385760405162461bcd60e51b81526004016105d590614d78565b5f805b6004811015612e9357612e4f816003614d08565b612e5a90600861490e565b63ffffffff1686612e6c836002614a5a565b81518110612e7c57612e7c614d1b565b016020015160f81c901b9190911790600101612e3b565b5063ffffffff8116600214612eba5760405162461bcd60e51b81526004016105d590614dbb565b5f805b6020811015612f0f57612ed181601f614d08565b612edc90600861490e565b87612ee8836006614a5a565b81518110612ef857612ef8614d1b565b016020015160f81c901b9190911790600101612ebd565b505f86602681518110612f2457612f24614d1b565b016020015191976001600160f81b03199092161515965090945050505050565b5f612f4d612b3e565b5f8051602061506c8339815191525f612f6584610c54565b90505f612f718761190f565b9050600281516005811115612f8857612f886147c1565b14612fe75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105d5565b612ff082613df5565b5f828260a001516130019190614a3a565b60048501546060840151919250613023916001600160401b03909116906148e3565b6001600160401b0316816001600160401b031611156130a25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105d5565b6130ac8882611d19565b5f6130b6896119ee565b90505f89826040516020016130e292919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb61311c8d8688611d61565b6040518263ffffffff1660e01b8152600401613138919061495e565b6020604051808303815f875af1158015613154573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131789190614925565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613200576132006147c1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f7960015f805160206150cc83398151915255565b5f808251602e146133625760405162461bcd60e51b81526004016105d590614d2f565b5f805b60028110156133b157613379816001614d08565b61338490600861490e565b61ffff1685828151811061339a5761339a614d1b565b016020015160f81c901b9190911790600101613365565b5061ffff8116156133d45760405162461bcd60e51b81526004016105d590614d78565b5f805b600481101561342f576133eb816003614d08565b6133f690600861490e565b63ffffffff1686613408836002614a5a565b8151811061341857613418614d1b565b016020015160f81c901b91909117906001016133d7565b5063ffffffff81166004146134565760405162461bcd60e51b81526004016105d590614dbb565b5f805b60208110156134ab5761346d81601f614d08565b61347890600861490e565b87613484836006614a5a565b8151811061349457613494614d1b565b016020015160f81c901b9190911790600101613459565b505f805b600881101561350a576134c3816007614d08565b6134ce90600861490e565b6001600160401b0316886134e3836026614a5a565b815181106134f3576134f3614d1b565b016020015160f81c901b91909117906001016134af565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206150ac8339815191529142919015806135fd5750600283015481516135f9916001600160401b031690614a5a565b8210155b15613623576001600160401b038516606082015281815260408101516020820152613642565b84816060018181516136359190614a3a565b6001600160401b03169052505b60608101516136529060646148e3565b602082015160028501546001600160401b03929092169161367d9190600160401b900460ff1661490e565b10156136e15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105d5565b831561370a57846001600160401b0316816040018181516137029190614a5a565b905250613729565b846001600160401b0316816040018181516137259190614d08565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166137ba57604051631afcd79f60e31b815260040160405180910390fd5b565b6137c4613771565b6137cd81613e00565b611d16608082013560a08301356137ea60e0850160c0860161474d565b6137fb610100860160e08701614e11565b61ffff1661381161012087016101008801614ecd565b61382361014088016101208901614eed565b613e21565b8047101561384b5760405163cd78605960e01b81523060048201526024016105d5565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613894576040519150601f19603f3d011682016040523d82523d5f602084013e613899565b606091505b5050905080610d0157604051630a12f52160e11b815260040160405180910390fd5b5f5f805160206150ac833981519152426138db604086016020870161474d565b6001600160401b03161161394d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105d5565b61395d604085016020860161474d565b6001600160401b03166139736202a30042614a5a565b116139e65760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105d5565b8335613a3e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105d5565b83355f90815260098201602052604090205415613aae5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105d5565b613abb6040850185614f08565b9050603014613b225760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105d5565b613b2b83613df5565b5f80613bc56040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b70919061474d565b6001600160401b03168152602001613b8b60408a018a614f08565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614065565b5f82815260078601602052604090209193509150613be38282614f95565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613c1090859060040161495e565b6020604051808303815f875af1158015613c2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c509190614925565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613cd257613cd26147c1565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613dc791908e01908e0161474d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611d16816001613517565b613e08613771565b613e1061440a565b613e1861441a565b611d1681614422565b613e29613771565b5f8051602061506c83398151915283613e955760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105d5565b612710841115613eb75760405162461bcd60e51b81526004016105d590614e2c565b85871115613f1f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105d5565b5f8360ff1611613f8c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105d5565b600a60ff84161115613ffe5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105d5565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146140cf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105d5565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561414657614106816001614d08565b61411190600861490e565b5081515f9083908390811061412857614128614d1b565b60200101906001600160f81b03191690815f1a9053506001016140f2565b505f5b60048110156141a45761415d816003614d08565b61416890600861490e565b505f82614176836002614a5a565b8151811061418657614186614d1b565b60200101906001600160f81b03191690815f1a905350600101614149565b505f5b602081101561420157845181602081106141c3576141c3614d1b565b1a60f81b826141d3836006614a5a565b815181106141e3576141e3614d1b565b60200101906001600160f81b03191690815f1a9053506001016141a7565b505f5b6020811015614261578460200151816020811061422357614223614d1b565b1a60f81b82614233836026614a5a565b8151811061424357614243614d1b565b60200101906001600160f81b03191690815f1a905350600101614204565b505f5b60088110156142d557614278816007614d08565b61428390600861490e565b60ff1685604001516001600160401b0316901c60f81b828260466142a79190614a5a565b815181106142b7576142b7614d1b565b60200101906001600160f81b03191690815f1a905350600101614264565b505f5b603081101561434057846080015181815181106142f7576142f7614d1b565b01602001516001600160f81b0319168261431283604e614a5a565b8151811061432257614322614d1b565b60200101906001600160f81b03191690815f1a9053506001016142d8565b505f5b60088110156143b257614357816007614d08565b61436290600861490e565b60608601516001600160401b0390811691161c60f81b8261438483607e614a5a565b8151811061439457614394614d1b565b60200101906001600160f81b03191690815f1a905350600101614343565b506002816040516143c39190615050565b602060405180830381855afa1580156143de573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906144019190614925565b94909350915050565b614412613771565b6137ba6145cf565b6137ba613771565b61442a613771565b80355f805160206150ac83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146144766080840160608501614ecd565b60ff1611156144e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105d5565b5f6144f46080840160608501614ecd565b60ff161161455c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105d5565b61456c6080830160608401614ecd565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561459d606083016040840161474d565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612d90613771565b5080546145e390614a6d565b5f825580601f106145f2575050565b601f0160209004905f5260205f2090810190611d169190614652565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614666575f8155600101614653565b5090565b8015158114611d16575f80fd5b803563ffffffff8116811461468a575f80fd5b919050565b5f805f606084860312156146a1575f80fd5b8335925060208401356146b38161466a565b91506146c160408501614677565b90509250925092565b5f602082840312156146da575f80fd5b5035919050565b5f61014082840312156146f2575f80fd5b50919050565b5f60208284031215614708575f80fd5b611f7982614677565b5f8060408385031215614722575f80fd5b61472b83614677565b946020939093013593505050565b6001600160401b0381168114611d16575f80fd5b5f6020828403121561475d575f80fd5b8135611f7981614739565b5f80828403606081121561477a575f80fd5b83356001600160401b0381111561478f575f80fd5b8401606081870312156147a0575f80fd5b92506040601f19820112156147b3575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106147f957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161482160408401826001600160a01b03169052565b50606083015161483c60608401826001600160401b03169052565b50608083015161485760808401826001600160401b03169052565b5060a083015161487260a08401826001600160401b03169052565b5060c083015161488d60c08401826001600160401b03169052565b5060e08301516148a860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156148a8576148a86148af565b6001600160401b03818116838216028082169190828114614906576149066148af565b505092915050565b8082028115828204841417610c6457610c646148af565b5f60208284031215614935575f80fd5b5051919050565b5f5b8381101561495657818101518382015260200161493e565b50505f910152565b602081525f825180602084015261497c81604085016020870161493c565b601f01601f19169190910160400192915050565b5f826149aa57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160401b038181168382160190808211156148a8576148a86148af565b80820180821115610c6457610c646148af565b600181811c90821680614a8157607f821691505b6020821081036146f257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614af881614a6d565b806020870152604060018084165f8114614b195760018114614b3557614b62565b60ff19851660408a0152604084151560051b8a01019550614b62565b895f5260205f205f5b85811015614b595781548b8201860152908301908801614b3e565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b8b57614b8b6148af565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614bcb57614bcb614b95565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614bf957614bf9614b95565b604052919050565b6001600160a01b0381168114611d16575f80fd5b805161468a8161466a565b5f8060408385031215614c31575f80fd5b82516001600160401b0380821115614c47575f80fd5b9084019060608287031215614c5a575f80fd5b614c62614ba9565b82518152602080840151614c7581614c01565b82820152604084015183811115614c8a575f80fd5b80850194505087601f850112614c9e575f80fd5b835183811115614cb057614cb0614b95565b614cc2601f8201601f19168301614bd1565b93508084528882828701011115614cd7575f80fd5b614ce68183860184880161493c565b50826040830152819550614cfb818801614c15565b9450505050509250929050565b81810381811115610c6457610c646148af565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611d16575f80fd5b5f60208284031215614e21575f80fd5b8135611f7981614e02565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e8281614e02565b61ffff8116905081548161ffff1982161783556020840135614ea381614739565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614edd575f80fd5b813560ff81168114611f79575f80fd5b5f60208284031215614efd575f80fd5b8135611f7981614c01565b5f808335601e19843603018112614f1d575f80fd5b8301803591506001600160401b03821115614f36575f80fd5b602001915036819003821315614f4a575f80fd5b9250929050565b601f821115610d0157805f5260205f20601f840160051c81016020851015614f765750805b601f840160051c820191505b8181101561111a575f8155600101614f82565b81516001600160401b03811115614fae57614fae614b95565b614fc281614fbc8454614a6d565b84614f51565b602080601f831160018114614ff5575f8415614fde5750858301515b5f19600386901b1c1916600185901b178555611118565b5f85815260208120601f198616915b8281101561502357888601518255948401946001909101908401615004565b508582101561504057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f825161506181846020870161493c565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161524f38038061524f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151028061014d5f395ff3fe60806040526004361061013c575f3560e01c806366435abf116100b3578063ba3a4b971161006d578063ba3a4b97146103b9578063bee0a03f146103d8578063c599e24f146103f7578063c974d1b61461040a578063d5f20ff61461041e578063df93d8de1461044a575f80fd5b806366435abf1461031057806376f786211461032f57806380a8ad941461034e57806398f3e2b414610361578063a3a65e4814610380578063b771b3bc1461039f575f80fd5b80632e2194d8116101045780632e2194d814610222578063329c3e121461025957806335455ded1461028b578063467ef06f146102b35780635297fae6146102d257806362065856146102f1575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a366004614679565b610460565b005b34801561016c575f80fd5b5061015f61017b3660046146b4565b6109b2565b34801561018b575f80fd5b506101ca61019a3660046146b4565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d3660046146cb565b610b82565b34801561022d575f80fd5b5061024161023c3660046146b4565b610c5f565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b506102736001600160991b0181565b6040516001600160a01b0390911681526020016101d4565b348015610296575f80fd5b506102a061271081565b60405161ffff90911681526020016101d4565b3480156102be575f80fd5b5061015f6102cd3660046146e2565b610c75565b3480156102dd575f80fd5b5061015f6102ec3660046146fb565b610d03565b3480156102fc575f80fd5b506101ca61030b366004614737565b610ed3565b34801561031b575f80fd5b5061024161032a3660046146b4565b610eec565b34801561033a575f80fd5b5061015f610349366004614679565b610f00565b6101ca61035c366004614752565b6110fa565b34801561036c575f80fd5b5061015f61037b3660046146fb565b611126565b34801561038b575f80fd5b5061015f61039a3660046146e2565b61138a565b3480156103aa575f80fd5b506102736005600160991b0181565b3480156103c4575f80fd5b5061015f6103d33660046146b4565b611547565b3480156103e3575f80fd5b5061015f6103f23660046146b4565b6117cd565b6101ca6104053660046146b4565b6118e1565b348015610415575f80fd5b506101f1601481565b348015610429575f80fd5b5061043d6104383660046146b4565b6118ed565b6040516101d491906147bf565b348015610455575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615056833981519152949193919290829060ff1660048111156104c8576104c86147ab565b60048111156104d9576104d96147ab565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f610555836118ed565b90504260028351600481111561056d5761056d6147ab565b146105bf5760405162461bcd60e51b815260206004820152602a60248201525f805160206150768339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106245760405162461bcd60e51b815260206004820152603360248201525f805160206150768339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105b6565b5f61062e856119cc565b600385526001600160401b0383811660a0870152811660e08601525f8a81526006880160205260409020855181549293508692829060ff1916600183600481111561067b5761067b6147ab565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003918201805467ffffffffffffffff191691909316179091555f9084516005811115610759576107596147ab565b14806107775750600484516005811115610775576107756147ab565b145b1561079b57505f8581526009870160205260409020546001600160401b03166107ae565b88156107ae576107ab8689611a4e565b90505b8660040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107e18760600151610ed3565b60c0870151608089015160a08a01516040516001600160e01b031960e087901b16815260048101949094526001600160401b039283166024850152908216604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561085d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108819190614899565b5f8b81526007890160205260409020556002845160058111156108a6576108a66147ab565b036108b8576108b88560600151611cea565b5f85606001518560a001516108cd91906148c4565b90506108d98782611cf7565b5f6005600160991b0163ee5b48eb6108f28a8786611d3f565b6040518263ffffffff1660e01b815260040161090e9190614906565b6020604051808303815f875af115801561092a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094e9190614899565b604080516001600160401b038581168252888116602083015291810183905291925085169089908e907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a4505050505050505050505050565b5f8181525f805160206150d683398151915260205260408082208151610100810190925280545f8051602061509683398151915293929190829060ff166005811115610a0057610a006147ab565b6005811115610a1157610a116147ab565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e09091015290915081516005811115610a9657610a966147ab565b14610afb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105b6565b6005600160991b016001600160a01b031663ee5b48eb610b208584608001515f611d3f565b6040518263ffffffff1660e01b8152600401610b3c9190614906565b6020604051808303815f875af1158015610b58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b7c9190614899565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bcb575080546001600160401b03808416911610155b15610be95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c1383611f5e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c6f64e8d4a5100083614938565b92915050565b5f805160206150568339815191525f80610c8e84611f6f565b604082015191935091506001600160a01b0316610cab5750505050565b600482516005811115610cc057610cc06147ab565b03610ce9575f8181526008840160205260408082208054929055830151610ce790826122e6565b505b610b7c8260400151610cfe8460600151610ed3565b61234c565b5f805160206150568339815191525f610d1b84612363565b90505f80610d2c8360400151612544565b50915091505f610d3b836118ed565b9050816001600160401b031681608001516001600160401b03161015610d735760405162461bcd60e51b81526004016105b690614957565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610db85760405162461bcd60e51b81526004016105b690614999565b60015f87815260068701602052604090205460ff166004811115610dde57610dde6147ab565b14610e475760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105b6565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610c6f6001600160401b03831664e8d4a510006149e2565b5f610ef6826118ed565b60a0015192915050565b5f805160206150568339815191525f610f188561277f565b5f86815260058401602052604090205460c0820151919250610f4a91620100009091046001600160401b0316906149f9565b6001600160401b03168160e001516001600160401b03161015610fcb5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105b6565b83156110f3575f610fdc8685611a4e565b5f8781526009850160205260409020805467ffffffffffffffff19166001600160401b03831617905560048401546060840151919250600160401b90046001600160a01b03169063778c06b59061103290610ed3565b60c085015160e0808701516040519185901b6001600160e01b031916825260048201939093526001600160401b039182166024820181905260448201529181166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156110a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110cd9190614899565b5f878152600885016020526040812080549091906110ec908490614a19565b9091555050505b5050505050565b5f611103612b28565b61110e838334612b5f565b9050610c6f60015f805160206150b683398151915255565b5f805160206150568339815191525f61113e84612363565b90505f8061114f8360400151612544565b50915091505f61115e836118ed565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611198576111986147ab565b60048111156111a9576111a96147ab565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b82048116608080850191909152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156112485760405162461bcd60e51b81526004016105b690614957565b826001600160401b03168160e001516001600160401b0316111561127e5760405162461bcd60e51b81526004016105b690614999565b600381516004811115611293576112936147ab565b146112e75760405162461bcd60e51b815260206004820152603160248201525f805160206150768339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105b6565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a019092529091205461131d91906122e6565b856007015f8881526020019081526020015f205f90556113488160200151610cfe8360600151610ed3565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f805160206150968339815191525f6113a283612363565b90505f806113b38360400151612d8d565b91509150806114155760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105b6565b5f8281526007850160205260408120805461142f90614a2c565b9050118015611461575060015f83815260088601602052604090205460ff16600581111561145f5761145f6147ab565b145b61147d5760405162461bcd60e51b81526004016105b690614a5e565b5f8281526007850160205260408120611495916145c1565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061505683398151915293929190829060ff1660048111156115a8576115a86147ab565b60048111156115b9576115b96147ab565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611640576116406147ab565b148061165e575060038151600481111561165c5761165c6147ab565b145b6116b25760405162461bcd60e51b815260206004820152603260248201525f80516020615076833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105b6565b5f6116c082604001516118ed565b905080608001516001600160401b03165f036117445760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105b6565b6005600160991b016001600160a01b031663ee5b48eb611771846040015184608001518560a00151611d3f565b6040518263ffffffff1660e01b815260040161178d9190614906565b6020604051808303815f875af11580156117a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110f39190614899565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061509683398151915292919061181590614a2c565b9050118015611847575060015f83815260088301602052604090205460ff166005811115611845576118456147ab565b145b6118635760405162461bcd60e51b81526004016105b690614a5e565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161189c9190600401614aa5565b6020604051808303815f875af11580156118b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dc9190614899565b505050565b5f610c6f823334612f2e565b6118f56145f8565b5f8281525f805160206150d68339815191526020526040908190208151610100810190925280545f80516020615096833981519152929190829060ff166005811115611943576119436147ab565b6005811115611954576119546147ab565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b5f8181525f805160206150d68339815191526020526040812060030180545f80516020615096833981519152916001600160401b039091169083611a0f83614b2f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611a99573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ac09190810190614bdf565b9150915080611b235760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105b6565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b8a9190614899565b825114611bee5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105b6565b60208201516001600160a01b031615611c645760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105b6565b5f80611c738460400151613329565b91509150818714611ce05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105b6565b9695505050505050565b611cf4815f613501565b50565b5f9182525f805160206150d6833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611db857611d78816001614cc7565b611d839060086149e2565b5081515f90839083908110611d9a57611d9a614cda565b60200101906001600160f81b03191690815f1a905350600101611d64565b505f5b6004811015611e1b57611dcf816003614cc7565b611dda9060086149e2565b6001901c60f81b82611ded836002614a19565b81518110611dfd57611dfd614cda565b60200101906001600160f81b03191690815f1a905350600101611dbb565b505f5b6020811015611e7d57611e3281601f614cc7565b611e3d9060086149e2565b86901c60f81b82611e4f836006614a19565b81518110611e5f57611e5f614cda565b60200101906001600160f81b03191690815f1a905350600101611e1e565b505f5b6008811015611ee857611e94816007614cc7565b611e9f9060086149e2565b6001600160401b038616901c60f81b82611eba836026614a19565b81518110611eca57611eca614cda565b60200101906001600160f81b03191690815f1a905350600101611e80565b505f5b6008811015611f5357611eff816007614cc7565b611f0a9060086149e2565b6001600160401b038516901c60f81b82611f2583602e614a19565b81518110611f3557611f35614cda565b60200101906001600160f81b03191690815f1a905350600101611eeb565b5090505b9392505050565b611f6661375b565b611cf4816137a6565b611f776145f8565b5f5f8051602061509683398151915281611f9085612363565b90505f80611fa18360400151612d8d565b9150915080156120065760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105b6565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115612038576120386147ab565b6005811115612049576120496147ab565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f90825160058111156120d0576120d06147ab565b14806120ee57506001825160058111156120ec576120ec6147ab565b145b61214d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105b6565b600382516005811115612162576121626147ab565b0361216f57506004612173565b5060055b6020808301515f9081526009880190915260408120558181600581111561219c5761219c6147ab565b908160058111156121af576121af6147ab565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156121e3576121e36147ab565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b03199093169590941694909417179290921617919091179055815160058111156122ae576122ae6147ab565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509791965090945050505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612332575f80fd5b505af1158015612344573d5f803e3d5ffd5b505050505050565b61235f6001600160a01b03831682613812565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206150968339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156123d8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123ff9190810190614bdf565b91509150806124665760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105b6565b82548251146124c95760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105b6565b60208201516001600160a01b03161561253c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105b6565b509392505050565b5f805f83516036146125685760405162461bcd60e51b81526004016105b690614cee565b5f805b60028110156125b75761257f816001614cc7565b61258a9060086149e2565b61ffff168682815181106125a0576125a0614cda565b016020015160f81c901b919091179060010161256b565b5061ffff8116156125da5760405162461bcd60e51b81526004016105b690614d37565b5f805b6004811015612635576125f1816003614cc7565b6125fc9060086149e2565b63ffffffff168761260e836002614a19565b8151811061261e5761261e614cda565b016020015160f81c901b91909117906001016125dd565b5063ffffffff811660031461265c5760405162461bcd60e51b81526004016105b690614d7a565b5f805b60208110156126b15761267381601f614cc7565b61267e9060086149e2565b8861268a836006614a19565b8151811061269a5761269a614cda565b016020015160f81c901b919091179060010161265f565b505f805b6008811015612710576126c9816007614cc7565b6126d49060086149e2565b6001600160401b0316896126e9836026614a19565b815181106126f9576126f9614cda565b016020015160f81c901b91909117906001016126b5565b505f805b600881101561276f57612728816007614cc7565b6127339060086149e2565b6001600160401b03168a61274883602e614a19565b8151811061275857612758614cda565b016020015160f81c901b9190911790600101612714565b5091989097509095509350505050565b6127876145f8565b5f8281525f805160206150d683398151915260205260408082208151610100810190925280545f8051602061509683398151915293929190829060ff1660058111156127d5576127d56147ab565b60058111156127e6576127e66147ab565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561286e5761286e6147ab565b146128ca5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105b6565b60408101516001600160a01b0316336001600160a01b0316146129445760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105b6565b6129518160a00151611cea565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff19166001836005811115612995576129956147ab565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f612a6185612a5b816119cc565b5f611d3f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612a90908590600401614906565b6020604051808303815f875af1158015612aac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ad09190614899565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b5f805160206150b6833981519152805460011901612b5957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615056833981519152906001600160401b0316612bab6040860160208701614737565b6001600160401b03161015612c1a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105b6565b6003810154612c2c6020860186614dd0565b61ffff1610158015612c505750612710612c496020860186614dd0565b61ffff1611155b612c6c5760405162461bcd60e51b81526004016105b690614deb565b8054831015612ccf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105b6565b8060010154831115612d365760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105b6565b825f612d4182610c5f565b90505f612d4e88836138a5565b5f81815260058601602052604090209091508790612d6c8282614e36565b509098975050505050505050565b60015f805160206150b683398151915255565b5f808251602714612db05760405162461bcd60e51b81526004016105b690614cee565b5f805b6002811015612dff57612dc7816001614cc7565b612dd29060086149e2565b61ffff16858281518110612de857612de8614cda565b016020015160f81c901b9190911790600101612db3565b5061ffff811615612e225760405162461bcd60e51b81526004016105b690614d37565b5f805b6004811015612e7d57612e39816003614cc7565b612e449060086149e2565b63ffffffff1686612e56836002614a19565b81518110612e6657612e66614cda565b016020015160f81c901b9190911790600101612e25565b5063ffffffff8116600214612ea45760405162461bcd60e51b81526004016105b690614d7a565b5f805b6020811015612ef957612ebb81601f614cc7565b612ec69060086149e2565b87612ed2836006614a19565b81518110612ee257612ee2614cda565b016020015160f81c901b9190911790600101612ea7565b505f86602681518110612f0e57612f0e614cda565b016020015191976001600160f81b03199092161515965090945050505050565b5f612f37612b28565b5f805160206150568339815191525f612f4f84610c5f565b90505f612f5b876118ed565b9050600281516005811115612f7257612f726147ab565b14612fd15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105b6565b612fda82613ddf565b5f828260a00151612feb91906149f9565b6004850154606084015191925061300d916001600160401b0390911690614e8c565b6001600160401b0316816001600160401b0316111561308c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105b6565b6130968882611cf7565b5f6130a0896119cc565b90505f89826040516020016130cc92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6131068d8688611d3f565b6040518263ffffffff1660e01b81526004016131229190614906565b6020604051808303815f875af115801561313e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906131629190614899565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156131ea576131ea6147ab565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611f5760015f805160206150b683398151915255565b5f808251602e1461334c5760405162461bcd60e51b81526004016105b690614cee565b5f805b600281101561339b57613363816001614cc7565b61336e9060086149e2565b61ffff1685828151811061338457613384614cda565b016020015160f81c901b919091179060010161334f565b5061ffff8116156133be5760405162461bcd60e51b81526004016105b690614d37565b5f805b6004811015613419576133d5816003614cc7565b6133e09060086149e2565b63ffffffff16866133f2836002614a19565b8151811061340257613402614cda565b016020015160f81c901b91909117906001016133c1565b5063ffffffff81166004146134405760405162461bcd60e51b81526004016105b690614d7a565b5f805b60208110156134955761345781601f614cc7565b6134629060086149e2565b8761346e836006614a19565b8151811061347e5761347e614cda565b016020015160f81c901b9190911790600101613443565b505f805b60088110156134f4576134ad816007614cc7565b6134b89060086149e2565b6001600160401b0316886134cd836026614a19565b815181106134dd576134dd614cda565b016020015160f81c901b9190911790600101613499565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206150968339815191529142919015806135e75750600283015481516135e3916001600160401b031690614a19565b8210155b1561360d576001600160401b03851660608201528181526040810151602082015261362c565b848160600181815161361f91906149f9565b6001600160401b03169052505b606081015161363c906064614e8c565b602082015160028501546001600160401b0392909216916136679190600160401b900460ff166149e2565b10156136cb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105b6565b83156136f457846001600160401b0316816040018181516136ec9190614a19565b905250613713565b846001600160401b03168160400181815161370f9190614cc7565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166137a457604051631afcd79f60e31b815260040160405180910390fd5b565b6137ae61375b565b6137b781613dea565b611cf4608082013560a08301356137d460e0850160c08601614737565b6137e5610100860160e08701614dd0565b61ffff166137fb61012087016101008801614eb7565b61380d61014088016101208901614ed7565b613e0b565b804710156138355760405163cd78605960e01b81523060048201526024016105b6565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461387e576040519150601f19603f3d011682016040523d82523d5f602084013e613883565b606091505b50509050806118dc57604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020615096833981519152426138c56040860160208701614737565b6001600160401b0316116139375760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105b6565b6139476040850160208601614737565b6001600160401b031661395d6202a30042614a19565b116139d05760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105b6565b8335613a285760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105b6565b83355f90815260098201602052604090205415613a985760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105b6565b613aa56040850185614ef2565b9050603014613b0c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105b6565b613b1583613ddf565b5f80613baf6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b5a9190614737565b6001600160401b03168152602001613b7560408a018a614ef2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061404f565b5f82815260078601602052604090209193509150613bcd8282614f7f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613bfa908590600401614906565b6020604051808303815f875af1158015613c16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613c3a9190614899565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613cbc57613cbc6147ab565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613db191908e01908e01614737565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611cf4816001613501565b613df261375b565b613dfa6143f4565b613e02614404565b611cf48161440c565b613e1361375b565b5f8051602061505683398151915283613e7f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105b6565b612710841115613ea15760405162461bcd60e51b81526004016105b690614deb565b85871115613f095760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105b6565b5f8360ff1611613f765760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105b6565b600a60ff84161115613fe85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105b6565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146140b95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105b6565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614130576140f0816001614cc7565b6140fb9060086149e2565b5081515f9083908390811061411257614112614cda565b60200101906001600160f81b03191690815f1a9053506001016140dc565b505f5b600481101561418e57614147816003614cc7565b6141529060086149e2565b505f82614160836002614a19565b8151811061417057614170614cda565b60200101906001600160f81b03191690815f1a905350600101614133565b505f5b60208110156141eb57845181602081106141ad576141ad614cda565b1a60f81b826141bd836006614a19565b815181106141cd576141cd614cda565b60200101906001600160f81b03191690815f1a905350600101614191565b505f5b602081101561424b578460200151816020811061420d5761420d614cda565b1a60f81b8261421d836026614a19565b8151811061422d5761422d614cda565b60200101906001600160f81b03191690815f1a9053506001016141ee565b505f5b60088110156142bf57614262816007614cc7565b61426d9060086149e2565b60ff1685604001516001600160401b0316901c60f81b828260466142919190614a19565b815181106142a1576142a1614cda565b60200101906001600160f81b03191690815f1a90535060010161424e565b505f5b603081101561432a57846080015181815181106142e1576142e1614cda565b01602001516001600160f81b031916826142fc83604e614a19565b8151811061430c5761430c614cda565b60200101906001600160f81b03191690815f1a9053506001016142c2565b505f5b600881101561439c57614341816007614cc7565b61434c9060086149e2565b60608601516001600160401b0390811691161c60f81b8261436e83607e614a19565b8151811061437e5761437e614cda565b60200101906001600160f81b03191690815f1a90535060010161432d565b506002816040516143ad919061503a565b602060405180830381855afa1580156143c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143eb9190614899565b94909350915050565b6143fc61375b565b6137a46145b9565b6137a461375b565b61441461375b565b80355f8051602061509683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146144606080840160608501614eb7565b60ff1611156144cd5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105b6565b5f6144de6080840160608501614eb7565b60ff16116145465760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105b6565b6145566080830160608401614eb7565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556145876060830160408401614737565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612d7a61375b565b5080546145cd90614a2c565b5f825580601f106145dc575050565b601f0160209004905f5260205f2090810190611cf4919061463c565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614650575f815560010161463d565b5090565b8015158114611cf4575f80fd5b803563ffffffff81168114614674575f80fd5b919050565b5f805f6060848603121561468b575f80fd5b83359250602084013561469d81614654565b91506146ab60408501614661565b90509250925092565b5f602082840312156146c4575f80fd5b5035919050565b5f61014082840312156146dc575f80fd5b50919050565b5f602082840312156146f2575f80fd5b611f5782614661565b5f806040838503121561470c575f80fd5b61471583614661565b946020939093013593505050565b6001600160401b0381168114611cf4575f80fd5b5f60208284031215614747575f80fd5b8135611f5781614723565b5f808284036060811215614764575f80fd5b83356001600160401b03811115614779575f80fd5b84016060818703121561478a575f80fd5b92506040601f198201121561479d575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106147e357634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161480b60408401826001600160a01b03169052565b50606083015161482660608401826001600160401b03169052565b50608083015161484160808401826001600160401b03169052565b5060a083015161485c60a08401826001600160401b03169052565b5060c083015161487760c08401826001600160401b03169052565b5060e083015161489260e08401826001600160401b03169052565b5092915050565b5f602082840312156148a9575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614892576148926148b0565b5f5b838110156148fe5781810151838201526020016148e6565b50505f910152565b602081525f82518060208401526149248160408501602087016148e4565b601f01601f19169190910160400192915050565b5f8261495257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610c6f57610c6f6148b0565b6001600160401b03818116838216019080821115614892576148926148b0565b80820180821115610c6f57610c6f6148b0565b600181811c90821680614a4057607f821691505b6020821081036146dc57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614ab781614a2c565b806020870152604060018084165f8114614ad85760018114614af457614b21565b60ff19851660408a0152604084151560051b8a01019550614b21565b895f5260205f205f5b85811015614b185781548b8201860152908301908801614afd565b8a016040019650505b509398975050505050505050565b5f6001600160401b03808316818103614b4a57614b4a6148b0565b6001019392505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b8a57614b8a614b54565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614bb857614bb8614b54565b604052919050565b6001600160a01b0381168114611cf4575f80fd5b805161467481614654565b5f8060408385031215614bf0575f80fd5b82516001600160401b0380821115614c06575f80fd5b9084019060608287031215614c19575f80fd5b614c21614b68565b82518152602080840151614c3481614bc0565b82820152604084015183811115614c49575f80fd5b80850194505087601f850112614c5d575f80fd5b835183811115614c6f57614c6f614b54565b614c81601f8201601f19168301614b90565b93508084528882828701011115614c96575f80fd5b614ca5818386018488016148e4565b50826040830152819550614cba818801614bd4565b9450505050509250929050565b81810381811115610c6f57610c6f6148b0565b634e487b7160e01b5f52603260045260245ffd5b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611cf4575f80fd5b5f60208284031215614de0575f80fd5b8135611f5781614dc1565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e4181614dc1565b61ffff8116905081548161ffff1982161783556020840135614e6281614723565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614eaf57614eaf6148b0565b505092915050565b5f60208284031215614ec7575f80fd5b813560ff81168114611f57575f80fd5b5f60208284031215614ee7575f80fd5b8135611f5781614bc0565b5f808335601e19843603018112614f07575f80fd5b8301803591506001600160401b03821115614f20575f80fd5b602001915036819003821315614f34575f80fd5b9250929050565b601f8211156118dc57805f5260205f20601f840160051c81016020851015614f605750805b601f840160051c820191505b818110156110f3575f8155600101614f6c565b81516001600160401b03811115614f9857614f98614b54565b614fac81614fa68454614a2c565b84614f3b565b602080601f831160018114614fdf575f8415614fc85750858301515b5f19600386901b1c1916600185901b178555612344565b5f85815260208120601f198616915b8281101561500d57888601518255948401946001909101908401614fee565b508582101561502a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f825161504b8184602087016148e4565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -401,37 +401,6 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) NATIVE return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) } -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { - return _NativeTokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_NativeTokenStakingManager.CallOpts) -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { - return _NativeTokenStakingManager.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_NativeTokenStakingManager.CallOpts) -} - // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 72ba36594..f5b19ac3c 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -59,7 +59,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161300338038061300383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612eb68061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c806397fb70d411610093578063c974d1b611610063578063c974d1b61461025c578063d5f20ff614610276578063df93d8de14610296578063f2fde38b146102a0575f80fd5b806397fb70d414610215578063a3a65e4814610228578063b771b3bc1461023b578063bee0a03f14610249575f80fd5b806366435abf116100ce57806366435abf1461018b578063715018a6146101b65780638994ab49146101be5780638da5cb5b146101d1575f80fd5b80630322ed98146100ff5780630cdd098514610114578063467ef06f14610165578063580a400614610178575b5f80fd5b61011261010d366004612713565b6102b3565b005b610152610122366004612713565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011261017336600461272a565b610488565b610112610186366004612768565b610495565b61019e610199366004612713565b6105a3565b6040516001600160401b03909116815260200161015c565b6101126105b7565b6101526101cc3660046127bf565b6105ca565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b610112610223366004612713565b6105e6565b61011261023636600461272a565b6105ef565b6101fd6005600160991b0181565b610112610257366004612713565b6107ac565b610264601481565b60405160ff909116815260200161015c565b610289610284366004612713565b6108c0565b60405161015c9190612821565b61019e6202a30081565b6101126102ae3660046128fb565b61099f565b5f8181525f80516020612e8a83398151915260205260408082208151610100810190925280545f80516020612e6a83398151915293929190829060ff1660058111156103015761030161280d565b60058111156103125761031261280d565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156103975761039761280d565b146104015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104268584608001515f6109dc565b6040518263ffffffff1660e01b81526004016104429190612938565b6020604051808303815f875af115801561045e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610482919061296a565b50505050565b61049181610bf9565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104d95750825b90505f826001600160401b031660011480156104f45750303b155b905081158015610502575080155b156105205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561054a57845460ff60401b1916600160401b1785555b6105548787610f6c565b831561059a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105ad826108c0565b60a0015192915050565b6105bf610f86565b6105c85f610fe1565b565b5f6105d3610f86565b6105dd8383611051565b90505b92915050565b6104918161158b565b5f80516020612e6a8339815191525f61060783611934565b90505f806106188360400151611b15565b915091508061067a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f8565b5f8281526007850160205260408120805461069490612981565b90501180156106c6575060015f83815260088601602052604090205460ff1660058111156106c4576106c461280d565b145b6106e25760405162461bcd60e51b81526004016103f8906129b9565b5f82815260078501602052604081206106fa91612680565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612e6a8339815191529291906107f490612981565b9050118015610826575060015f83815260088301602052604090205460ff1660058111156108245761082461280d565b145b6108425760405162461bcd60e51b81526004016103f8906129b9565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087b9190600401612a00565b6020604051808303815f875af1158015610897573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108bb919061296a565b505050565b6108c86126b7565b5f8281525f80516020612e8a8339815191526020526040908190208151610100810190925280545f80516020612e6a833981519152929190829060ff1660058111156109165761091661280d565b60058111156109275761092761280d565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6109a7610f86565b6001600160a01b0381166109d057604051631e4fbdf760e01b81525f60048201526024016103f8565b6109d981610fe1565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a5557610a15816001612ab2565b610a20906008612ac5565b5081515f90839083908110610a3757610a37612adc565b60200101906001600160f81b03191690815f1a905350600101610a01565b505f5b6004811015610ab857610a6c816003612ab2565b610a77906008612ac5565b6001901c60f81b82610a8a836002612af0565b81518110610a9a57610a9a612adc565b60200101906001600160f81b03191690815f1a905350600101610a58565b505f5b6020811015610b1a57610acf81601f612ab2565b610ada906008612ac5565b86901c60f81b82610aec836006612af0565b81518110610afc57610afc612adc565b60200101906001600160f81b03191690815f1a905350600101610abb565b505f5b6008811015610b8557610b31816007612ab2565b610b3c906008612ac5565b6001600160401b038616901c60f81b82610b57836026612af0565b81518110610b6757610b67612adc565b60200101906001600160f81b03191690815f1a905350600101610b1d565b505f5b6008811015610bf057610b9c816007612ab2565b610ba7906008612ac5565b6001600160401b038516901c60f81b82610bc283602e612af0565b81518110610bd257610bd2612adc565b60200101906001600160f81b03191690815f1a905350600101610b88565b50949350505050565b610c016126b7565b5f80516020612e6a8339815191525f610c1984611934565b90505f80610c2a8360400151611b15565b915091508015610c8f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610cc157610cc161280d565b6005811115610cd257610cd261280d565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d5957610d5961280d565b1480610d775750600182516005811115610d7557610d7561280d565b145b610dd65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103f8565b600382516005811115610deb57610deb61280d565b03610df857506004610dfc565b5060055b6020808301515f90815260098801909152604081205581816005811115610e2557610e2561280d565b90816005811115610e3857610e3861280d565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610e6c57610e6c61280d565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610f3757610f3761280d565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610f74611d74565b610f7d82611dbd565b61049181611dde565b33610fb87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c85760405163118cdaa760e01b81523360048201526024016103f8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612e6a833981519152426110716040860160208701612b03565b6001600160401b0316116110e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103f8565b6110f36040850160208601612b03565b6001600160401b03166111096202a30042612af0565b1161117c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103f8565b83356111d45760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f8565b83355f908152600982016020526040902054156112445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f8565b6112516040850185612b1c565b90506030146112b85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f8565b6112c183611def565b5f8061135b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906113069190612b03565b6001600160401b0316815260200161132160408a018a612b1c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611dfa565b5f828152600786016020526040902091935091506113798282612bb0565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113a6908590600401612938565b6020604051808303815f875af11580156113c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e6919061296a565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff191660018360058111156114685761146861280d565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161155d91908e01908e01612b03565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6115936126b7565b5f8281525f80516020612e8a83398151915260205260408082208151610100810190925280545f80516020612e6a83398151915293929190829060ff1660058111156115e1576115e161280d565b60058111156115f2576115f261280d565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561167a5761167a61280d565b146116d65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f8565b60408101516001600160a01b0316336001600160a01b0316146117505760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103f8565b61175d8160a0015161219f565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156117a1576117a161280d565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61186d85611867816121a9565b5f6109dc565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061189c908590600401612938565b6020604051808303815f875af11580156118b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dc919061296a565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b60408051606080820183525f8083526020830181905292820152905f80516020612e6a8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156119a9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119d09190810190612cd6565b9150915080611a375760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f8565b8254825114611a9a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103f8565b60208201516001600160a01b031615611b0d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103f8565b509392505050565b5f808251602714611b7a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103f8565b5f805b6002811015611bc957611b91816001612ab2565b611b9c906008612ac5565b61ffff16858281518110611bb257611bb2612adc565b016020015160f81c901b9190911790600101611b7d565b5061ffff811615611c285760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103f8565b5f805b6004811015611c8357611c3f816003612ab2565b611c4a906008612ac5565b63ffffffff1686611c5c836002612af0565b81518110611c6c57611c6c612adc565b016020015160f81c901b9190911790600101611c2b565b5063ffffffff8116600214611cea5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103f8565b5f805b6020811015611d3f57611d0181601f612ab2565b611d0c906008612ac5565b87611d18836006612af0565b81518110611d2857611d28612adc565b016020015160f81c901b9190911790600101611ced565b505f86602681518110611d5457611d54612adc565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c857604051631afcd79f60e31b815260040160405180910390fd5b611dc5611d74565b611dcd61222b565b611dd561223b565b6109d981612243565b611de6611d74565b6109d9816123f0565b6109d98160016123f8565b5f6060826080015151603014611e645760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611edb57611e9b816001612ab2565b611ea6906008612ac5565b5081515f90839083908110611ebd57611ebd612adc565b60200101906001600160f81b03191690815f1a905350600101611e87565b505f5b6004811015611f3957611ef2816003612ab2565b611efd906008612ac5565b505f82611f0b836002612af0565b81518110611f1b57611f1b612adc565b60200101906001600160f81b03191690815f1a905350600101611ede565b505f5b6020811015611f965784518160208110611f5857611f58612adc565b1a60f81b82611f68836006612af0565b81518110611f7857611f78612adc565b60200101906001600160f81b03191690815f1a905350600101611f3c565b505f5b6020811015611ff65784602001518160208110611fb857611fb8612adc565b1a60f81b82611fc8836026612af0565b81518110611fd857611fd8612adc565b60200101906001600160f81b03191690815f1a905350600101611f99565b505f5b600881101561206a5761200d816007612ab2565b612018906008612ac5565b60ff1685604001516001600160401b0316901c60f81b8282604661203c9190612af0565b8151811061204c5761204c612adc565b60200101906001600160f81b03191690815f1a905350600101611ff9565b505f5b60308110156120d5578460800151818151811061208c5761208c612adc565b01602001516001600160f81b031916826120a783604e612af0565b815181106120b7576120b7612adc565b60200101906001600160f81b03191690815f1a90535060010161206d565b505f5b6008811015612147576120ec816007612ab2565b6120f7906008612ac5565b60608601516001600160401b0390811691161c60f81b8261211983607e612af0565b8151811061212957612129612adc565b60200101906001600160f81b03191690815f1a9053506001016120d8565b506002816040516121589190612dbe565b602060405180830381855afa158015612173573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612196919061296a565b94909350915050565b6109d9815f6123f8565b5f8181525f80516020612e8a8339815191526020526040812060030180545f80516020612e6a833981519152916001600160401b0390911690836121ec83612dd9565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b612233611d74565b6105c8612652565b6105c8611d74565b61224b611d74565b80355f80516020612e6a83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146122976080840160608501612dfe565b60ff1611156123045760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103f8565b5f6123156080840160608501612dfe565b60ff161161237d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103f8565b61238d6080830160608401612dfe565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556123be6060830160408401612b03565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6109a7611d74565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020612e6a8339815191529142919015806124de5750600283015481516124da916001600160401b031690612af0565b8210155b15612504576001600160401b038516606082015281815260408101516020820152612523565b84816060018181516125169190612e1e565b6001600160401b03169052505b6060810151612533906064612e3e565b602082015160028501546001600160401b03929092169161255e9190600160401b900460ff16612ac5565b10156125c25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103f8565b83156125eb57846001600160401b0316816040018181516125e39190612af0565b90525061260a565b846001600160401b0316816040018181516126069190612ab2565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b61265a611d74565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50805461268c90612981565b5f825580601f1061269b575050565b601f0160209004905f5260205f20908101906109d991906126fb565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561270f575f81556001016126fc565b5090565b5f60208284031215612723575f80fd5b5035919050565b5f6020828403121561273a575f80fd5b813563ffffffff8116811461274d575f80fd5b9392505050565b6001600160a01b03811681146109d9575f80fd5b5f8082840360a081121561277a575f80fd5b6080811215612787575f80fd5b50829150608083013561279981612754565b809150509250929050565b80356001600160401b03811681146127ba575f80fd5b919050565b5f80604083850312156127d0575f80fd5b82356001600160401b038111156127e5575f80fd5b8301606081860312156127f6575f80fd5b9150612804602084016127a4565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061284557634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161286d60408401826001600160a01b03169052565b50606083015161288860608401826001600160401b03169052565b5060808301516128a360808401826001600160401b03169052565b5060a08301516128be60a08401826001600160401b03169052565b5060c08301516128d960c08401826001600160401b03169052565b5060e08301516128f460e08401826001600160401b03169052565b5092915050565b5f6020828403121561290b575f80fd5b813561274d81612754565b5f5b83811015612930578181015183820152602001612918565b50505f910152565b602081525f8251806020840152612956816040850160208701612916565b601f01601f19169190910160400192915050565b5f6020828403121561297a575f80fd5b5051919050565b600181811c9082168061299557607f821691505b6020821081036129b357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612a1281612981565b806020870152604060018084165f8114612a335760018114612a4f57612a7c565b60ff19851660408a0152604084151560051b8a01019550612a7c565b895f5260205f205f5b85811015612a735781548b8201860152908301908801612a58565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105e0576105e0612a9e565b80820281158282048414176105e0576105e0612a9e565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105e0576105e0612a9e565b5f60208284031215612b13575f80fd5b6105dd826127a4565b5f808335601e19843603018112612b31575f80fd5b8301803591506001600160401b03821115612b4a575f80fd5b602001915036819003821315612b5e575f80fd5b9250929050565b601f8211156108bb57805f5260205f20601f840160051c81016020851015612b8a5750805b601f840160051c820191505b81811015612ba9575f8155600101612b96565b5050505050565b81516001600160401b03811115612bc957612bc9612a8a565b612bdd81612bd78454612981565b84612b65565b602080601f831160018114612c10575f8415612bf95750858301515b5f19600386901b1c1916600185901b178555612c67565b5f85815260208120601f198616915b82811015612c3e57888601518255948401946001909101908401612c1f565b5085821015612c5b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b0381118282101715612c9157612c91612a8a565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612cbf57612cbf612a8a565b604052919050565b805180151581146127ba575f80fd5b5f8060408385031215612ce7575f80fd5b82516001600160401b0380821115612cfd575f80fd5b9084019060608287031215612d10575f80fd5b612d18612c6f565b82518152602080840151612d2b81612754565b82820152604084015183811115612d40575f80fd5b80850194505087601f850112612d54575f80fd5b835183811115612d6657612d66612a8a565b612d78601f8201601f19168301612c97565b93508084528882828701011115612d8d575f80fd5b612d9c81838601848801612916565b50826040830152819550612db1818801612cc7565b9450505050509250929050565b5f8251612dcf818460208701612916565b9190910192915050565b5f6001600160401b03808316818103612df457612df4612a9e565b6001019392505050565b5f60208284031215612e0e575f80fd5b813560ff8116811461274d575f80fd5b6001600160401b038181168382160190808211156128f4576128f4612a9e565b6001600160401b03818116838216028082169190828114612e6157612e61612a9e565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161300738038061300783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612eba8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c806397fb70d411610093578063c974d1b611610063578063c974d1b61461025c578063d5f20ff614610276578063df93d8de14610296578063f2fde38b146102a0575f80fd5b806397fb70d414610215578063a3a65e4814610228578063b771b3bc1461023b578063bee0a03f14610249575f80fd5b806366435abf116100ce57806366435abf1461018b578063715018a6146101b65780638994ab49146101be5780638da5cb5b146101d1575f80fd5b80630322ed98146100ff5780630cdd098514610114578063467ef06f14610165578063580a400614610178575b5f80fd5b61011261010d366004612717565b6102b3565b005b610152610122366004612717565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011261017336600461272e565b610488565b61011261018636600461276c565b610496565b61019e610199366004612717565b6105a4565b6040516001600160401b03909116815260200161015c565b6101126105b8565b6101526101cc3660046127c3565b6105cb565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b610112610223366004612717565b6105e7565b61011261023636600461272e565b6105f4565b6101fd6005600160991b0181565b610112610257366004612717565b6107b1565b610264601481565b60405160ff909116815260200161015c565b610289610284366004612717565b6108c0565b60405161015c9190612825565b61019e6202a30081565b6101126102ae3660046128ff565b61099f565b5f8181525f80516020612e8e83398151915260205260408082208151610100810190925280545f80516020612e6e83398151915293929190829060ff16600581111561030157610301612811565b600581111561031257610312612811565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561039757610397612811565b146104015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104268584608001515f6109dc565b6040518263ffffffff1660e01b8152600401610442919061293c565b6020604051808303815f875af115801561045e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610482919061296e565b50505050565b61049181610bf9565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104da5750825b90505f826001600160401b031660011480156104f55750303b155b905081158015610503575080155b156105215760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561054b57845460ff60401b1916600160401b1785555b6105558787610f70565b831561059b57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105ae826108c0565b60a0015192915050565b6105c0610f8a565b6105c95f610fe5565b565b5f6105d4610f8a565b6105de8383611055565b90505b92915050565b6105f08161158f565b5050565b5f80516020612e6e8339815191525f61060c83611938565b90505f8061061d8360400151611b19565b915091508061067f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f8565b5f8281526007850160205260408120805461069990612985565b90501180156106cb575060015f83815260088601602052604090205460ff1660058111156106c9576106c9612811565b145b6106e75760405162461bcd60e51b81526004016103f8906129bd565b5f82815260078501602052604081206106ff91612684565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612e6e8339815191529291906107f990612985565b905011801561082b575060015f83815260088301602052604090205460ff16600581111561082957610829612811565b145b6108475760405162461bcd60e51b81526004016103f8906129bd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916108809190600401612a04565b6020604051808303815f875af115801561089c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610491919061296e565b6108c86126bb565b5f8281525f80516020612e8e8339815191526020526040908190208151610100810190925280545f80516020612e6e833981519152929190829060ff16600581111561091657610916612811565b600581111561092757610927612811565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6109a7610f8a565b6001600160a01b0381166109d057604051631e4fbdf760e01b81525f60048201526024016103f8565b6109d981610fe5565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a5557610a15816001612ab6565b610a20906008612ac9565b5081515f90839083908110610a3757610a37612ae0565b60200101906001600160f81b03191690815f1a905350600101610a01565b505f5b6004811015610ab857610a6c816003612ab6565b610a77906008612ac9565b6001901c60f81b82610a8a836002612af4565b81518110610a9a57610a9a612ae0565b60200101906001600160f81b03191690815f1a905350600101610a58565b505f5b6020811015610b1a57610acf81601f612ab6565b610ada906008612ac9565b86901c60f81b82610aec836006612af4565b81518110610afc57610afc612ae0565b60200101906001600160f81b03191690815f1a905350600101610abb565b505f5b6008811015610b8557610b31816007612ab6565b610b3c906008612ac9565b6001600160401b038616901c60f81b82610b57836026612af4565b81518110610b6757610b67612ae0565b60200101906001600160f81b03191690815f1a905350600101610b1d565b505f5b6008811015610bf057610b9c816007612ab6565b610ba7906008612ac9565b6001600160401b038516901c60f81b82610bc283602e612af4565b81518110610bd257610bd2612ae0565b60200101906001600160f81b03191690815f1a905350600101610b88565b50949350505050565b610c016126bb565b5f5f80516020612e6e83398151915281610c1a85611938565b90505f80610c2b8360400151611b19565b915091508015610c905760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610cc257610cc2612811565b6005811115610cd357610cd3612811565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d5a57610d5a612811565b1480610d785750600182516005811115610d7657610d76612811565b145b610dd75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103f8565b600382516005811115610dec57610dec612811565b03610df957506004610dfd565b5060055b6020808301515f90815260098801909152604081205581816005811115610e2657610e26612811565b90816005811115610e3957610e39612811565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610e6d57610e6d612811565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610f3857610f38612811565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509791965090945050505050565b610f78611d78565b610f8182611dc1565b6105f081611de2565b33610fbc7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c95760405163118cdaa760e01b81523360048201526024016103f8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612e6e833981519152426110756040860160208701612b07565b6001600160401b0316116110e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103f8565b6110f76040850160208601612b07565b6001600160401b031661110d6202a30042612af4565b116111805760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103f8565b83356111d85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f8565b83355f908152600982016020526040902054156112485760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f8565b6112556040850185612b20565b90506030146112bc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f8565b6112c583611df3565b5f8061135f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061130a9190612b07565b6001600160401b0316815260200161132560408a018a612b20565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611dfe565b5f8281526007860160205260409020919350915061137d8282612bb4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113aa90859060040161293c565b6020604051808303815f875af11580156113c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ea919061296e565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561146c5761146c612811565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161156191908e01908e01612b07565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6115976126bb565b5f8281525f80516020612e8e83398151915260205260408082208151610100810190925280545f80516020612e6e83398151915293929190829060ff1660058111156115e5576115e5612811565b60058111156115f6576115f6612811565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561167e5761167e612811565b146116da5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f8565b60408101516001600160a01b0316336001600160a01b0316146117545760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103f8565b6117618160a001516121a3565b60038152426001600160401b031660e08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156117a5576117a5612811565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6118718561186b816121ad565b5f6109dc565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906118a090859060040161293c565b6020604051808303815f875af11580156118bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118e0919061296e565b60a0840151604080516001600160401b039092168252426020830152919250829188917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35090949350505050565b60408051606080820183525f8083526020830181905292820152905f80516020612e6e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156119ad573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119d49190810190612cda565b9150915080611a3b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f8565b8254825114611a9e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103f8565b60208201516001600160a01b031615611b115760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103f8565b509392505050565b5f808251602714611b7e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103f8565b5f805b6002811015611bcd57611b95816001612ab6565b611ba0906008612ac9565b61ffff16858281518110611bb657611bb6612ae0565b016020015160f81c901b9190911790600101611b81565b5061ffff811615611c2c5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103f8565b5f805b6004811015611c8757611c43816003612ab6565b611c4e906008612ac9565b63ffffffff1686611c60836002612af4565b81518110611c7057611c70612ae0565b016020015160f81c901b9190911790600101611c2f565b5063ffffffff8116600214611cee5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103f8565b5f805b6020811015611d4357611d0581601f612ab6565b611d10906008612ac9565b87611d1c836006612af4565b81518110611d2c57611d2c612ae0565b016020015160f81c901b9190911790600101611cf1565b505f86602681518110611d5857611d58612ae0565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c957604051631afcd79f60e31b815260040160405180910390fd5b611dc9611d78565b611dd161222f565b611dd961223f565b6109d981612247565b611dea611d78565b6109d9816123f4565b6109d98160016123fc565b5f6060826080015151603014611e685760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611edf57611e9f816001612ab6565b611eaa906008612ac9565b5081515f90839083908110611ec157611ec1612ae0565b60200101906001600160f81b03191690815f1a905350600101611e8b565b505f5b6004811015611f3d57611ef6816003612ab6565b611f01906008612ac9565b505f82611f0f836002612af4565b81518110611f1f57611f1f612ae0565b60200101906001600160f81b03191690815f1a905350600101611ee2565b505f5b6020811015611f9a5784518160208110611f5c57611f5c612ae0565b1a60f81b82611f6c836006612af4565b81518110611f7c57611f7c612ae0565b60200101906001600160f81b03191690815f1a905350600101611f40565b505f5b6020811015611ffa5784602001518160208110611fbc57611fbc612ae0565b1a60f81b82611fcc836026612af4565b81518110611fdc57611fdc612ae0565b60200101906001600160f81b03191690815f1a905350600101611f9d565b505f5b600881101561206e57612011816007612ab6565b61201c906008612ac9565b60ff1685604001516001600160401b0316901c60f81b828260466120409190612af4565b8151811061205057612050612ae0565b60200101906001600160f81b03191690815f1a905350600101611ffd565b505f5b60308110156120d9578460800151818151811061209057612090612ae0565b01602001516001600160f81b031916826120ab83604e612af4565b815181106120bb576120bb612ae0565b60200101906001600160f81b03191690815f1a905350600101612071565b505f5b600881101561214b576120f0816007612ab6565b6120fb906008612ac9565b60608601516001600160401b0390811691161c60f81b8261211d83607e612af4565b8151811061212d5761212d612ae0565b60200101906001600160f81b03191690815f1a9053506001016120dc565b5060028160405161215c9190612dc2565b602060405180830381855afa158015612177573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061219a919061296e565b94909350915050565b6109d9815f6123fc565b5f8181525f80516020612e8e8339815191526020526040812060030180545f80516020612e6e833981519152916001600160401b0390911690836121f083612ddd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b612237611d78565b6105c9612656565b6105c9611d78565b61224f611d78565b80355f80516020612e6e83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461229b6080840160608501612e02565b60ff1611156123085760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103f8565b5f6123196080840160608501612e02565b60ff16116123815760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103f8565b6123916080830160608401612e02565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556123c26060830160408401612b07565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6109a7611d78565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020612e6e8339815191529142919015806124e25750600283015481516124de916001600160401b031690612af4565b8210155b15612508576001600160401b038516606082015281815260408101516020820152612527565b848160600181815161251a9190612e22565b6001600160401b03169052505b6060810151612537906064612e42565b602082015160028501546001600160401b0392909216916125629190600160401b900460ff16612ac9565b10156125c65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103f8565b83156125ef57846001600160401b0316816040018181516125e79190612af4565b90525061260e565b846001600160401b03168160400181815161260a9190612ab6565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b61265e611d78565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50805461269090612985565b5f825580601f1061269f575050565b601f0160209004905f5260205f20908101906109d991906126ff565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612713575f8155600101612700565b5090565b5f60208284031215612727575f80fd5b5035919050565b5f6020828403121561273e575f80fd5b813563ffffffff81168114612751575f80fd5b9392505050565b6001600160a01b03811681146109d9575f80fd5b5f8082840360a081121561277e575f80fd5b608081121561278b575f80fd5b50829150608083013561279d81612758565b809150509250929050565b80356001600160401b03811681146127be575f80fd5b919050565b5f80604083850312156127d4575f80fd5b82356001600160401b038111156127e9575f80fd5b8301606081860312156127fa575f80fd5b9150612808602084016127a8565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061284957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161287160408401826001600160a01b03169052565b50606083015161288c60608401826001600160401b03169052565b5060808301516128a760808401826001600160401b03169052565b5060a08301516128c260a08401826001600160401b03169052565b5060c08301516128dd60c08401826001600160401b03169052565b5060e08301516128f860e08401826001600160401b03169052565b5092915050565b5f6020828403121561290f575f80fd5b813561275181612758565b5f5b8381101561293457818101518382015260200161291c565b50505f910152565b602081525f825180602084015261295a81604085016020870161291a565b601f01601f19169190910160400192915050565b5f6020828403121561297e575f80fd5b5051919050565b600181811c9082168061299957607f821691505b6020821081036129b757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612a1681612985565b806020870152604060018084165f8114612a375760018114612a5357612a80565b60ff19851660408a0152604084151560051b8a01019550612a80565b895f5260205f205f5b85811015612a775781548b8201860152908301908801612a5c565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105e1576105e1612aa2565b80820281158282048414176105e1576105e1612aa2565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105e1576105e1612aa2565b5f60208284031215612b17575f80fd5b6105de826127a8565b5f808335601e19843603018112612b35575f80fd5b8301803591506001600160401b03821115612b4e575f80fd5b602001915036819003821315612b62575f80fd5b9250929050565b601f82111561049157805f5260205f20601f840160051c81016020851015612b8e5750805b601f840160051c820191505b81811015612bad575f8155600101612b9a565b5050505050565b81516001600160401b03811115612bcd57612bcd612a8e565b612be181612bdb8454612985565b84612b69565b602080601f831160018114612c14575f8415612bfd5750858301515b5f19600386901b1c1916600185901b178555612c6b565b5f85815260208120601f198616915b82811015612c4257888601518255948401946001909101908401612c23565b5085821015612c5f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b0381118282101715612c9557612c95612a8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612cc357612cc3612a8e565b604052919050565b805180151581146127be575f80fd5b5f8060408385031215612ceb575f80fd5b82516001600160401b0380821115612d01575f80fd5b9084019060608287031215612d14575f80fd5b612d1c612c73565b82518152602080840151612d2f81612758565b82820152604084015183811115612d44575f80fd5b80850194505087601f850112612d58575f80fd5b835183811115612d6a57612d6a612a8e565b612d7c601f8201601f19168301612c9b565b93508084528882828701011115612d91575f80fd5b612da08183860184880161291a565b50826040830152819550612db5818801612ccb565b9450505050509250929050565b5f8251612dd381846020870161291a565b9190910192915050565b5f6001600160401b03808316818103612df857612df8612aa2565b6001019392505050565b5f60208284031215612e12575f80fd5b813560ff81168114612751575f80fd5b6001600160401b038181168382160190808211156128f8576128f8612aa2565b6001600160401b03818116838216028082169190828114612e6557612e65612aa2565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/staking/ExampleRewardCalculator.sol index 39e84a194..79740d61a 100644 --- a/contracts/staking/ExampleRewardCalculator.sol +++ b/contracts/staking/ExampleRewardCalculator.sol @@ -10,6 +10,8 @@ import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; contract ExampleRewardCalculator is IRewardCalculator { uint256 public constant SECONDS_IN_YEAR = 31536000; + uint8 public constant UPTIME_REWARDS_THRESHOLD_PERCENTAGE = 80; + uint64 public immutable rewardBasisPoints; constructor(uint64 rewardBasisPoints_) { @@ -21,11 +23,23 @@ contract ExampleRewardCalculator is IRewardCalculator { */ function calculateReward( uint256 stakeAmount, - uint64 startTime, - uint64 endTime, + uint64 validatorStartTime, + uint64 stakingStartTime, + uint64 stakingEndTime, + uint64 uptimeSeconds, uint256, // initialSupply uint256 // endSupply ) external view returns (uint256) { - return (stakeAmount * rewardBasisPoints * (endTime - startTime)) / SECONDS_IN_YEAR / 10000; + // Equivalent to uptimeSeconds/(validator.endedAt - validator.startedAt) < UPTIME_REWARDS_THRESHOLD_PERCENTAGE/100 + // Rearranged to prevent integer division truncation. + if ( + uptimeSeconds * 100 + < (stakingEndTime - validatorStartTime) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE + ) { + return 0; + } + + return (stakeAmount * rewardBasisPoints * (stakingEndTime - stakingStartTime)) + / SECONDS_IN_YEAR / 10000; } } diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 33527bbe4..66a4c5bec 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -50,14 +50,12 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager mapping(bytes32 validationID => PoSValidatorRequirements) _validatorRequirements; /// @notice Maps the delegationID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; - /// @notice Maps the delegationID to pending register delegator messages. - mapping(bytes32 delegationID => bytes) _pendingRegisterDelegatorMessages; - /// @notice Maps the delegationID to pending end delegator messages. - mapping(bytes32 delegationID => bytes) _pendingEndDelegatorMessages; /// @notice Maps the delegationID to its pending staking rewards. mapping(bytes32 delegationID => uint256) _redeemableDelegatorRewards; /// @notice Maps the validator owner address to its pending staking rewards. - mapping(address validatorOwner => uint256) _redeemableValidatorRewards; + mapping(bytes32 validationID => uint256) _redeemableValidatorRewards; + /// @notice Saves the uptime of a pending completed or completed validation period so that delegators can collect rewards. + mapping(bytes32 validationID => uint64) _completedValidationUptimeSeconds; } // solhint-enable private-vars-leading-underscore @@ -68,8 +66,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager uint8 public constant MAXIMUM_STAKE_MULTIPLIER_LIMIT = 10; - uint8 public constant UPTIME_REWARDS_THRESHOLD_PERCENTAGE = 80; - uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; // solhint-disable ordering @@ -150,32 +146,35 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ); if (includeUptimeProof) { - uint64 uptime = _getUptime(validationID, messageIndex); - if ( - uptime * 100 - >= (validator.endedAt - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE - ) { - $._redeemableValidatorRewards[validator.owner] += $ - ._rewardCalculator - .calculateReward( - weightToValue(validator.startingWeight), - validator.startedAt, - validator.endedAt, - 0, - 0 - ); - } + uint64 uptimeSeconds = _getUptime(validationID, messageIndex); + $._completedValidationUptimeSeconds[validationID] = uptimeSeconds; + + $._redeemableValidatorRewards[validationID] += $._rewardCalculator.calculateReward({ + stakeAmount: weightToValue(validator.startingWeight), + validatorStartTime: validator.startedAt, + stakingStartTime: validator.startedAt, + stakingEndTime: validator.endedAt, + uptimeSeconds: uptimeSeconds, + initialSupply: 0, + endSupply: 0 + }); } } function completeEndValidation(uint32 messageIndex) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - Validator memory validator = _completeEndValidation(messageIndex); + (Validator memory validator, bytes32 validationID) = _completeEndValidation(messageIndex); + + // PoA or initial validator case + if (validator.owner == address(0)) { + return; + } if (validator.status == ValidatorStatus.Completed) { - _reward(validator.owner, $._redeemableValidatorRewards[validator.owner]); - delete $._redeemableValidatorRewards[validator.owner]; + uint256 rewards = $._redeemableValidatorRewards[validationID]; + delete $._redeemableValidatorRewards[validationID]; + _reward(validator.owner, rewards); } // We unlock the state whether the validation period is completed or invalidated. @@ -383,18 +382,26 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager $._delegatorStakes[delegationID] = delegator; - if (includeUptimeProof) { - uint256 uptime = _getUptime(validationID, messageIndex); - if ( - uptime * 100 - >= (currentTime - validator.startedAt) * UPTIME_REWARDS_THRESHOLD_PERCENTAGE - ) { - $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward( - weightToValue(delegator.weight), delegator.startedAt, delegator.endedAt, 0, 0 - ); - } + uint64 validatorUptimeSeconds; + if ( + validator.status == ValidatorStatus.PendingRemoved + || validator.status == ValidatorStatus.Completed + ) { + validatorUptimeSeconds = $._completedValidationUptimeSeconds[validationID]; + } else if (includeUptimeProof) { + validatorUptimeSeconds = _getUptime(validationID, messageIndex); } + $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward({ + stakeAmount: weightToValue(delegator.weight), + validatorStartTime: validator.startedAt, + stakingStartTime: delegator.startedAt, + stakingEndTime: delegator.endedAt, + uptimeSeconds: validatorUptimeSeconds, + initialSupply: 0, + endSupply: 0 + }); + // Check that removing this delegator would not exceed the maximum churn rate. // We only need to check this is the validator is still active. If the validator ends its validation // period, the weight of all its delegators will be added to the churn tracker at that time. Ending diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 80eedca85..6b6bfcab7 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -306,7 +306,10 @@ abstract contract ValidatorManager is * {registrationExpiry} being reached. * @return The Validator instance representing the completed validation period */ - function _completeEndValidation(uint32 messageIndex) internal returns (Validator memory) { + function _completeEndValidation(uint32 messageIndex) + internal + returns (Validator memory, bytes32) + { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Get the Warp message. @@ -339,12 +342,10 @@ abstract contract ValidatorManager is validator.status = endStatus; $._validationPeriods[validationID] = validator; - // TODO: Unlock the stake. - // Emit event. emit ValidationPeriodEnded(validationID, validator.status); - return validator; + return (validator, validationID); } /** diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/staking/interfaces/IRewardCalculator.sol index 51fffb6a7..b7f9a35c4 100644 --- a/contracts/staking/interfaces/IRewardCalculator.sol +++ b/contracts/staking/interfaces/IRewardCalculator.sol @@ -8,8 +8,10 @@ pragma solidity 0.8.25; interface IRewardCalculator { function calculateReward( uint256 stakeAmount, - uint64 startTime, - uint64 endTime, + uint64 validatorStartTime, + uint64 stakingStartTime, + uint64 stakingEndTime, + uint64 uptimeSeconds, uint256 initialSupply, uint256 endSupply ) external view returns (uint256); diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol index 22a41368c..87b18020c 100644 --- a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol +++ b/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol @@ -7,13 +7,15 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; +import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; contract ExampleRewardCalculatorTest is Test { - ExampleRewardCalculator public exampleRewardCalculator; + IRewardCalculator public exampleRewardCalculator; uint256 public constant DEFAULT_STAKE_AMOUNT = 1e12; uint64 public constant DEFAULT_START_TIME = 1000; uint64 public constant DEFAULT_END_TIME = 31537000; // a year + 1000 seonds + uint64 public constant DEFAULT_UPTIME = (DEFAULT_END_TIME - DEFAULT_START_TIME) * 80 / 100; uint64 public constant DEFAULT_REWARD_BASIS_POINTS = 42; function setUp() public { @@ -21,9 +23,28 @@ contract ExampleRewardCalculatorTest is Test { } function testRewardCalculation() public view { - uint256 output = exampleRewardCalculator.calculateReward( - DEFAULT_STAKE_AMOUNT, DEFAULT_START_TIME, DEFAULT_END_TIME, 0, 0 - ); + uint256 output = exampleRewardCalculator.calculateReward({ + stakeAmount: DEFAULT_STAKE_AMOUNT, + validatorStartTime: DEFAULT_START_TIME, + stakingStartTime: DEFAULT_START_TIME, + stakingEndTime: DEFAULT_END_TIME, + uptimeSeconds: DEFAULT_UPTIME, + initialSupply: 0, + endSupply: 0 + }); assertEq(output, 42e8); } + + function testInsufficientUptime() public view { + uint256 output = exampleRewardCalculator.calculateReward({ + stakeAmount: DEFAULT_STAKE_AMOUNT, + validatorStartTime: DEFAULT_START_TIME, + stakingStartTime: DEFAULT_START_TIME, + stakingEndTime: DEFAULT_END_TIME, + uptimeSeconds: DEFAULT_UPTIME - 1, + initialSupply: 0, + endSupply: 0 + }); + assertEq(output, 0); + } } diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 1941b7eb3..53d76c22b 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -213,6 +213,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { data: "", // implies receive() returnData: "" }); + // Because we don vm.deal(account, account.balance + amount); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index dee49c225..225ecb4c3 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -5,7 +5,7 @@ pragma solidity 0.8.25; -import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; +import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; import {PoSValidatorRequirements} from "../interfaces/IPoSValidatorManager.sol"; @@ -14,7 +14,7 @@ import { IWarpMessenger } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; -import {ValidatorRegistrationInput} from "../interfaces/IValidatorManager.sol"; +import {ValidatorRegistrationInput, ValidatorStatus} from "../interfaces/IValidatorManager.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_UPTIME = uint64(100); @@ -27,6 +27,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; address public constant DEFAULT_DELEGATOR_ADDRESS = address(0x1234123412341234123412341234123412341234); + address public constant DEFAULT_VALIDATOR_OWNER_ADDRESS = + address(0x2345234523452345234523452345234523452345); uint64 public constant DEFAULT_REWARD_RATE = uint64(10); uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; uint16 public constant DEFAULT_MINIMUM_DELEGATION_FEE_BIPS = 100; @@ -34,7 +36,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 public constant SECONDS_IN_YEAR = 31536000; PoSValidatorManager public posValidatorManager; - ExampleRewardCalculator public rewardCalculator; + IRewardCalculator public rewardCalculator; event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); @@ -493,7 +495,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true }); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); @@ -502,18 +505,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndDelegation() public { - uint256 registrationDuration = DEFAULT_MINIMUM_STAKE_DURATION; - - uint256 registrationExpiry = - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + registrationDuration; - bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, - registrationExpiry: uint64(registrationExpiry), + registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: uint64(registrationExpiry) + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, @@ -530,47 +528,38 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); + uint64 delgationEndTime = + DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; _setUpInitializeEndDelegation({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - endDelegationTimestamp: uint64(registrationExpiry), + endDelegationTimestamp: delgationEndTime, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 }); - address delegator = DEFAULT_DELEGATOR_ADDRESS; - uint256 balanceBefore = _getStakeAssetBalance(delegator); - uint256 expectedReward = rewardCalculator.calculateReward( - _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - uint64(registrationExpiry), - 0, - 0 - ); - _expectStakeUnlock(delegator, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); - _expectRewardIssuance(delegator, expectedReward); + uint256 expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + stakingEndTime: delgationEndTime, + uptimeSeconds: delgationEndTime - DEFAULT_REGISTRATION_TIMESTAMP, + initialSupply: 0, + endSupply: 0 + }); _setUpCompleteEndDelegation({ validationID: validationID, delegationID: delegationID, - delegator: delegator, + delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, expectedReward: expectedReward, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 }); - - uint256 balanceAfter = _getStakeAssetBalance(delegator); - vm.assertEq(balanceAfter, balanceAfter); - vm.assertEq(expectedReward, expectedReward); - uint256 balanceChange = balanceAfter - balanceBefore; - require( - balanceChange == _weightToValue(DEFAULT_DELEGATOR_WEIGHT) + expectedReward, - "delegator should have received their stake back and been rewarded" - ); } function testCompleteEndDelegationWrongNonce() public { @@ -698,7 +687,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator1, delegationID: delegationID1, - startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + startDelegationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 3 @@ -707,7 +696,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID: validationID, delegatorAddress: delegator2, delegationID: delegationID2, - startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + startDelegationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 @@ -719,13 +708,15 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegationID: delegationID1, delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedReward: rewardCalculator.calculateReward( - DEFAULT_DELEGATOR_WEIGHT, - DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - 0, - 0 - ), + expectedReward: rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + 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 + }), validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 @@ -733,36 +724,46 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndValidation() public virtual override { - uint256 registrationDuration = DEFAULT_MINIMUM_STAKE_DURATION; - - uint256 registrationExpiry = DEFAULT_REGISTRATION_TIMESTAMP + registrationDuration; - bytes32 validationID = _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, weight: DEFAULT_WEIGHT, - registrationExpiry: uint64(registrationExpiry), + registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: uint64(registrationExpiry), + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, includeUptime: true }); - uint256 balanceBefore = _getStakeAssetBalance(address(this)); - - uint256 expectedReward = _weightToValue(DEFAULT_WEIGHT) * DEFAULT_REWARD_RATE - * registrationDuration / 10000 / SECONDS_IN_YEAR; - - _expectStakeUnlock(address(this), _weightToValue(DEFAULT_WEIGHT)); - _expectRewardIssuance(address(this), expectedReward); + uint256 expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_WEIGHT), + validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingStartTime: DEFAULT_REGISTRATION_TIMESTAMP, + stakingEndTime: DEFAULT_COMPLETION_TIMESTAMP, + uptimeSeconds: DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, + initialSupply: 0, + endSupply: 0 + }); - _testCompleteEndValidation(validationID); + _setUpCompleteEndValidation({ + validationID: validationID, + validatorOwner: address(this), + expectedReward: expectedReward, + validatorWeight: DEFAULT_WEIGHT + }); + } - uint256 balanceChange = _getStakeAssetBalance(address(this)) - balanceBefore; - require( - balanceChange == _weightToValue(DEFAULT_WEIGHT) + expectedReward, - "validator should have received their stake back and been rewarded" - ); + function testInitializeEndValidation() public virtual override { + _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true + }); } function testValueToWeight() public view { @@ -894,11 +895,37 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { return delegationID; } + function _setUpCompleteEndValidation( + bytes32 validationID, + address validatorOwner, + uint256 expectedReward, + uint64 validatorWeight + ) internal { + bytes memory subnetValidatorRegistrationMessage = + ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); + + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); + uint256 balanceBefore = _getStakeAssetBalance(validatorOwner); + + _expectStakeUnlock(validatorOwner, _weightToValue(validatorWeight)); + _expectRewardIssuance(validatorOwner, expectedReward); + + posValidatorManager.completeEndValidation(0); + + assertEq( + _getStakeAssetBalance(validatorOwner), + balanceBefore + _weightToValue(validatorWeight) + expectedReward + ); + } + function _setUpCompleteEndDelegation( bytes32 validationID, bytes32 delegationID, address delegator, - uint256 delegatorWeight, + uint64 delegatorWeight, uint256 expectedReward, uint64 validatorWeight, uint64 expectedValidatorWeight, @@ -911,10 +938,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegationEnded(delegationID, validationID, expectedNonce); - _expectStakeUnlock(delegator, delegatorWeight); + uint256 balanceBefore = _getStakeAssetBalance(delegator); + + _expectStakeUnlock(delegator, _weightToValue(delegatorWeight)); _expectRewardIssuance(delegator, expectedReward); + posValidatorManager.completeEndDelegation(0, delegationID); + assertEq(posValidatorManager.getWeight(validationID), expectedValidatorWeight); + assertEq( + _getStakeAssetBalance(delegator), + balanceBefore + _weightToValue(delegatorWeight) + expectedReward + ); return delegationID; } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 180cf70f7..1f5bbc3c1 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -170,7 +170,15 @@ abstract contract ValidatorManagerTest is Test { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); - _testCompleteEndValidation(validationID); + bytes memory subnetValidatorRegistrationMessage = + ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); + + _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); + + validatorManager.completeEndValidation(0); } function testCompleteInvalidatedValidation() public { @@ -368,7 +376,7 @@ abstract contract ValidatorManagerTest is Test { _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); if (includeUptime) { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, registrationExpiry - registrationTimestamp + validationID, completionTimestamp - registrationTimestamp ); _mockGetVerifiedWarpMessage(uptimeMsg, true); _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); @@ -379,18 +387,6 @@ abstract contract ValidatorManagerTest is Test { _initializeEndValidation(validationID, includeUptime); } - function _testCompleteEndValidation(bytes32 validationID) internal virtual { - bytes memory subnetValidatorRegistrationMessage = - ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); - - _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); - - vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); - - validatorManager.completeEndValidation(0); - } - function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { vm.mockCall( WARP_PRECOMPILE_ADDRESS, From 9abff90c8cd494efc6a68e6cf36d8c531e7467ac Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 10:13:05 -0400 Subject: [PATCH 318/545] Move weight update to validatormanager --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 34 +++---------------- contracts/staking/ValidatorManager.sol | 22 +++++++++++- .../interfaces/IPoSValidatorManager.sol | 14 -------- .../staking/interfaces/IValidatorManager.sol | 14 ++++++++ 6 files changed, 42 insertions(+), 46 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 3c3f566f2..901f2f996 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516152dc3803806152dc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61518f8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f366004614692565b610357565b005b6101546101643660046146cd565b610807565b6101a76101773660046146cd565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e23660046146cd565b6109d7565b6040516001600160401b0390911681526020016101b1565b61015461020d3660046146f8565b6109ed565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c366004614736565b610acc565b61015461024f36600461474f565b610af7565b6101a761026236600461478b565b610cc7565b6101e76102753660046146cd565b610ce0565b610154610288366004614692565b610cf4565b61015461029b36600461474f565b610dd4565b6101a76102ae3660046147a6565b610fe3565b6101a76102c13660046147c6565b610ff6565b6101546102d4366004614736565b611022565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d3660046146cd565b6111df565b6101546103203660046146cd565b611465565b6101c2601481565b61034061033b3660046146cd565b611579565b6040516101b1919061483b565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206150e38339815191529184156103a9576103a68285611658565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db614827565b60048111156103ec576103ec614827565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61046884611579565b905060028251600481111561047f5761047f614827565b146104d15760405162461bcd60e51b815260206004820152602a60248201525f805160206151038339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105365760405162461bcd60e51b815260206004820152603360248201525f805160206151038339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c8565b600382528051600290600581111561055057610550614827565b0361068d5761056282606001516118f4565b61056b84611901565b6001600160401b0390811660e0840152421660a0808401919091526060830151908201515f9161059a91614929565b90506105a68582611983565b5f6005600160991b016001600160a01b031663ee5b48eb6105cc888760e00151866119cb565b6040518263ffffffff1660e01b81526004016105e8919061496b565b6020604051808303815f875af1158015610604573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610628919061499d565b90508360e001516001600160401b0316867f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df848460405161067e9291906001600160401b03929092168252602082015260400190565b60405180910390a350506106b0565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156106e1576106e1614827565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916107f5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061516383398151915260205260408082208151610100810190925280545f8051602061512383398151915293929190829060ff16600581111561085557610855614827565b600581111561086657610866614827565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108eb576108eb614827565b146109505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb6109758584608001515f6119cb565b6040518263ffffffff1660e01b8152600401610991919061496b565b6020604051808303815f875af11580156109ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d1919061499d565b50505050565b5f6109e764e8d4a51000836149b4565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a36575080546001600160401b03808416911610155b15610a545760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a7f8484611be8565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f610ad682611c02565b9050610af381606001516001600160401b03168260400151611f75565b5050565b5f805160206150e38339815191525f610b0f84611fab565b90505f80610b20836040015161218c565b50915091505f610b2f83611579565b9050816001600160401b031681608001516001600160401b03161015610b675760405162461bcd60e51b81526004016104c8906149d3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bac5760405162461bcd60e51b81526004016104c890614a15565b60015f87815260068701602052604090205460ff166004811115610bd257610bd2614827565b14610c3b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6109e76001600160401b03831664e8d4a51000614a5e565b5f610cea82611579565b60a0015192915050565b5f805160206150e38339815191525f610d0c85611579565b5f86815260058401602052604090205460c0820151919250610d3e91620100009091046001600160401b031690614a75565b6001600160401b0316421015610db25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c8565b8315610dc457610dc28584611658565b505b610dcd856123c7565b5050505050565b5f805160206150e38339815191525f610dec84611fab565b90505f80610dfd836040015161218c565b50915091505f610e0c83611579565b9050816001600160401b031681608001516001600160401b03161015610e445760405162461bcd60e51b81526004016104c8906149d3565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e825760405162461bcd60e51b81526004016104c890614a15565b60035f87815260068701602052604090205460ff166004811115610ea857610ea8614827565b14610efc5760405162461bcd60e51b815260206004820152603160248201525f805160206151038339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610fa191611f75565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610fef833384612765565b9392505050565b5f610fff612b63565b61100a848484612b9a565b9050610fef60015f8051602061514383398151915255565b5f805160206151238339815191525f61103a83611fab565b90505f8061104b8360400151612dd3565b91509150806110ad5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c8565b5f828152600785016020526040812080546110c790614a95565b90501180156110f9575060015f83815260088601602052604090205460ff1660058111156110f7576110f7614827565b145b6111155760405162461bcd60e51b81526004016104c890614acd565b5f828152600785016020526040812061112d916145da565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206150e383398151915293929190829060ff16600481111561124057611240614827565b600481111561125157611251614827565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112d8576112d8614827565b14806112f657506003815160048111156112f4576112f4614827565b145b61134a5760405162461bcd60e51b815260206004820152603260248201525f80516020615103833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c8565b5f6113588260400151611579565b905080608001516001600160401b03165f036113dc5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb611409846040015184608001518560a001516119cb565b6040518263ffffffff1660e01b8152600401611425919061496b565b6020604051808303815f875af1158015611441573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dcd919061499d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206151238339815191529291906114ad90614a95565b90501180156114df575060015f83815260088301602052604090205460ff1660058111156114dd576114dd614827565b145b6114fb5760405162461bcd60e51b81526004016104c890614acd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916115349190600401614b14565b6020604051808303815f875af1158015611550573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611574919061499d565b505050565b611581614611565b5f8281525f805160206151638339815191526020526040908190208151610100810190925280545f80516020615123833981519152929190829060ff1660058111156115cf576115cf614827565b60058111156115e0576115e0614827565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156116a3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116ca9190810190614c15565b915091508061172d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611770573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611794919061499d565b8251146117f85760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c8565b60208201516001600160a01b03161561186e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c8565b5f8061187d8460400151612f74565b915091508187146118ea5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c8565b9695505050505050565b6118fe815f61314c565b50565b5f8181525f805160206151638339815191526020526040812060030180545f80516020615123833981519152916001600160401b03909116908361194483614cfd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b5f9182525f80516020615163833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a4457611a04816001614d22565b611a0f906008614a5e565b5081515f90839083908110611a2657611a26614d35565b60200101906001600160f81b03191690815f1a9053506001016119f0565b505f5b6004811015611aa757611a5b816003614d22565b611a66906008614a5e565b6001901c60f81b82611a79836002614d49565b81518110611a8957611a89614d35565b60200101906001600160f81b03191690815f1a905350600101611a47565b505f5b6020811015611b0957611abe81601f614d22565b611ac9906008614a5e565b86901c60f81b82611adb836006614d49565b81518110611aeb57611aeb614d35565b60200101906001600160f81b03191690815f1a905350600101611aaa565b505f5b6008811015611b7457611b20816007614d22565b611b2b906008614a5e565b6001600160401b038616901c60f81b82611b46836026614d49565b81518110611b5657611b56614d35565b60200101906001600160f81b03191690815f1a905350600101611b0c565b505f5b6008811015611bdf57611b8b816007614d22565b611b96906008614a5e565b6001600160401b038516901c60f81b82611bb183602e614d49565b81518110611bc157611bc1614d35565b60200101906001600160f81b03191690815f1a905350600101611b77565b50949350505050565b611bf06133a6565b611bf9826133f1565b610af38161345d565b611c0a614611565b5f805160206151238339815191525f611c2284611fab565b90505f80611c338360400151612dd3565b915091508015611c985760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611cca57611cca614827565b6005811115611cdb57611cdb614827565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d6257611d62614827565b1480611d805750600182516005811115611d7e57611d7e614827565b145b611ddf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c8565b600382516005811115611df457611df4614827565b03611e0157506004611e05565b5060055b6020808301515f90815260098801909152604081205581816005811115611e2e57611e2e614827565b90816005811115611e4157611e41614827565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611e7557611e75614827565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f4057611f40614827565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610af3906001600160a01b03168284613511565b60408051606080820183525f8083526020830181905292820152905f805160206151238339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612020573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120479190810190614c15565b91509150806120ae5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c8565b82548251146121115760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c8565b60208201516001600160a01b0316156121845760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c8565b509392505050565b5f805f83516036146121b05760405162461bcd60e51b81526004016104c890614d5c565b5f805b60028110156121ff576121c7816001614d22565b6121d2906008614a5e565b61ffff168682815181106121e8576121e8614d35565b016020015160f81c901b91909117906001016121b3565b5061ffff8116156122225760405162461bcd60e51b81526004016104c890614da5565b5f805b600481101561227d57612239816003614d22565b612244906008614a5e565b63ffffffff1687612256836002614d49565b8151811061226657612266614d35565b016020015160f81c901b9190911790600101612225565b5063ffffffff81166003146122a45760405162461bcd60e51b81526004016104c890614de8565b5f805b60208110156122f9576122bb81601f614d22565b6122c6906008614a5e565b886122d2836006614d49565b815181106122e2576122e2614d35565b016020015160f81c901b91909117906001016122a7565b505f805b600881101561235857612311816007614d22565b61231c906008614a5e565b6001600160401b031689612331836026614d49565b8151811061234157612341614d35565b016020015160f81c901b91909117906001016122fd565b505f805b60088110156123b757612370816007614d22565b61237b906008614a5e565b6001600160401b03168a61239083602e614d49565b815181106123a0576123a0614d35565b016020015160f81c901b919091179060010161235c565b5091989097509095509350505050565b5f8181525f8051602061516383398151915260205260408082208151610100810190925280545f8051602061512383398151915293929190829060ff16600581111561241557612415614827565b600581111561242657612426614827565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124ae576124ae614827565b1461250a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c8565b60408101516001600160a01b0316336001600160a01b0316146125845760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c8565b6125918160a001516118f4565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156125d5576125d5614827565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126a18461269b81611901565b5f6119cb565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126d090859060040161496b565b6020604051808303815f875af11580156126ec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612710919061499d565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f61276e612b63565b5f805160206150e38339815191525f6127896101e285613570565b90505f61279587611579565b90506002815160058111156127ac576127ac614827565b1461280b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c8565b612814826135a6565b5f828260a001516128259190614a75565b60048501546060840151919250612847916001600160401b0390911690614e2f565b6001600160401b0316816001600160401b031611156128c65760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c8565b6128d08882611983565b5f6128da89611901565b90505f898260405160200161290692919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6129408d86886119cb565b6040518263ffffffff1660e01b815260040161295c919061496b565b6020604051808303815f875af1158015612978573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299c919061499d565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612a2457612a24614827565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050610fef60015f8051602061514383398151915255565b5f80516020615143833981519152805460011901612b9457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206150e3833981519152906001600160401b0316612be6604086016020870161478b565b6001600160401b03161015612c555760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c8565b6003810154612c676020860186614e69565b61ffff1610158015612c8b5750612710612c846020860186614e69565b61ffff1611155b612ca75760405162461bcd60e51b81526004016104c890614e84565b8054831015612d0a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c8565b8060010154831115612d715760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c8565b5f612d7b84613570565b90505f612d87826109d7565b90505f612d9488836135b1565b5f81815260058601602052604090209091508790612db28282614ecf565b509098975050505050505050565b60015f8051602061514383398151915255565b5f808251602714612df65760405162461bcd60e51b81526004016104c890614d5c565b5f805b6002811015612e4557612e0d816001614d22565b612e18906008614a5e565b61ffff16858281518110612e2e57612e2e614d35565b016020015160f81c901b9190911790600101612df9565b5061ffff811615612e685760405162461bcd60e51b81526004016104c890614da5565b5f805b6004811015612ec357612e7f816003614d22565b612e8a906008614a5e565b63ffffffff1686612e9c836002614d49565b81518110612eac57612eac614d35565b016020015160f81c901b9190911790600101612e6b565b5063ffffffff8116600214612eea5760405162461bcd60e51b81526004016104c890614de8565b5f805b6020811015612f3f57612f0181601f614d22565b612f0c906008614a5e565b87612f18836006614d49565b81518110612f2857612f28614d35565b016020015160f81c901b9190911790600101612eed565b505f86602681518110612f5457612f54614d35565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612f975760405162461bcd60e51b81526004016104c890614d5c565b5f805b6002811015612fe657612fae816001614d22565b612fb9906008614a5e565b61ffff16858281518110612fcf57612fcf614d35565b016020015160f81c901b9190911790600101612f9a565b5061ffff8116156130095760405162461bcd60e51b81526004016104c890614da5565b5f805b600481101561306457613020816003614d22565b61302b906008614a5e565b63ffffffff168661303d836002614d49565b8151811061304d5761304d614d35565b016020015160f81c901b919091179060010161300c565b5063ffffffff811660041461308b5760405162461bcd60e51b81526004016104c890614de8565b5f805b60208110156130e0576130a281601f614d22565b6130ad906008614a5e565b876130b9836006614d49565b815181106130c9576130c9614d35565b016020015160f81c901b919091179060010161308e565b505f805b600881101561313f576130f8816007614d22565b613103906008614a5e565b6001600160401b031688613118836026614d49565b8151811061312857613128614d35565b016020015160f81c901b91909117906001016130e4565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061512383398151915291429190158061323257506002830154815161322e916001600160401b031690614d49565b8210155b15613258576001600160401b038516606082015281815260408101516020820152613277565b848160600181815161326a9190614a75565b6001600160401b03169052505b6060810151613287906064614e2f565b602082015160028501546001600160401b0392909216916132b29190600160401b900460ff16614a5e565b10156133165760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c8565b831561333f57846001600160401b0316816040018181516133379190614d49565b90525061335e565b846001600160401b03168160400181815161335a9190614d22565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166133ef57604051631afcd79f60e31b815260040160405180910390fd5b565b6133f96133a6565b61340281613aeb565b6118fe608082013560a083013561341f60e0850160c0860161478b565b613430610100860160e08701614e69565b61ffff1661344661012087016101008801614f25565b61345861014088016101208901614f45565b613b0c565b6134656133a6565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166134f15760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261157491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613d50565b5f6109e7827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613db1565b6118fe81600161314c565b5f5f80516020615123833981519152426135d1604086016020870161478b565b6001600160401b0316116136435760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c8565b613653604085016020860161478b565b6001600160401b03166136696202a30042614d49565b116136dc5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c8565b83356137345760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c8565b83355f908152600982016020526040902054156137a45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c8565b6137b16040850185614f60565b90506030146138185760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c8565b613821836135a6565b5f806138bb6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613866919061478b565b6001600160401b0316815260200161388160408a018a614f60565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f13565b5f828152600786016020526040902091935091506138d98282614fed565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061390690859060040161496b565b6020604051808303815f875af1158015613922573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613946919061499d565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff191660018360058111156139c8576139c8614827565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613abd91908e01908e0161478b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613af36133a6565b613afb6142b8565b613b036142c8565b6118fe816142d0565b613b146133a6565b5f805160206150e383398151915283613b805760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c8565b612710841115613ba25760405162461bcd60e51b81526004016104c890614e84565b85871115613c0a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c8565b5f8360ff1611613c775760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c8565b600a60ff84161115613ce95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c8565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613d646001600160a01b0384168361447d565b905080515f14158015613d88575080806020019051810190613d8691906150ac565b155b1561157457604051635274afe760e01b81526001600160a01b03841660048201526024016104c8565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613df7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e1b919061499d565b9050613e326001600160a01b03851633308661448a565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613e76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e9a919061499d565b9050818111613f005760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c8565b613f0a8282614d22565b95945050505050565b5f6060826080015151603014613f7d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613ff457613fb4816001614d22565b613fbf906008614a5e565b5081515f90839083908110613fd657613fd6614d35565b60200101906001600160f81b03191690815f1a905350600101613fa0565b505f5b60048110156140525761400b816003614d22565b614016906008614a5e565b505f82614024836002614d49565b8151811061403457614034614d35565b60200101906001600160f81b03191690815f1a905350600101613ff7565b505f5b60208110156140af578451816020811061407157614071614d35565b1a60f81b82614081836006614d49565b8151811061409157614091614d35565b60200101906001600160f81b03191690815f1a905350600101614055565b505f5b602081101561410f57846020015181602081106140d1576140d1614d35565b1a60f81b826140e1836026614d49565b815181106140f1576140f1614d35565b60200101906001600160f81b03191690815f1a9053506001016140b2565b505f5b600881101561418357614126816007614d22565b614131906008614a5e565b60ff1685604001516001600160401b0316901c60f81b828260466141559190614d49565b8151811061416557614165614d35565b60200101906001600160f81b03191690815f1a905350600101614112565b505f5b60308110156141ee57846080015181815181106141a5576141a5614d35565b01602001516001600160f81b031916826141c083604e614d49565b815181106141d0576141d0614d35565b60200101906001600160f81b03191690815f1a905350600101614186565b505f5b600881101561426057614205816007614d22565b614210906008614a5e565b60608601516001600160401b0390811691161c60f81b8261423283607e614d49565b8151811061424257614242614d35565b60200101906001600160f81b03191690815f1a9053506001016141f1565b5060028160405161427191906150c7565b602060405180830381855afa15801561428c573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142af919061499d565b94909350915050565b6142c06133a6565b6133ef6144c3565b6133ef6133a6565b6142d86133a6565b80355f8051602061512383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146143246080840160608501614f25565b60ff1611156143915760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c8565b5f6143a26080840160608501614f25565b60ff161161440a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c8565b61441a6080830160608401614f25565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561444b606083016040840161478b565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610fef83835f6144cb565b6040516001600160a01b0384811660248301528381166044830152606482018390526109d19186918216906323b872dd9060840161353e565b612dc06133a6565b6060814710156144f05760405163cd78605960e01b81523060048201526024016104c8565b5f80856001600160a01b0316848660405161450b91906150c7565b5f6040518083038185875af1925050503d805f8114614545576040519150601f19603f3d011682016040523d82523d5f602084013e61454a565b606091505b50915091506118ea86838360608261456a57614565826145b1565b610fef565b815115801561458157506001600160a01b0384163b155b156145aa57604051639996b31560e01b81526001600160a01b03851660048201526024016104c8565b5080610fef565b8051156145c15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546145e690614a95565b5f825580601f106145f5575050565b601f0160209004905f5260205f20908101906118fe9190614655565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614669575f8155600101614656565b5090565b80151581146118fe575f80fd5b803563ffffffff8116811461468d575f80fd5b919050565b5f805f606084860312156146a4575f80fd5b8335925060208401356146b68161466d565b91506146c46040850161467a565b90509250925092565b5f602082840312156146dd575f80fd5b5035919050565b6001600160a01b03811681146118fe575f80fd5b5f8082840361016081121561470b575f80fd5b6101408082121561471a575f80fd5b849350830135905061472b816146e4565b809150509250929050565b5f60208284031215614746575f80fd5b610fef8261467a565b5f8060408385031215614760575f80fd5b6147698361467a565b946020939093013593505050565b6001600160401b03811681146118fe575f80fd5b5f6020828403121561479b575f80fd5b8135610fef81614777565b5f80604083850312156147b7575f80fd5b50508035926020909101359150565b5f805f83850360808112156147d9575f80fd5b84356001600160401b038111156147ee575f80fd5b8501606081880312156147ff575f80fd5b93506040601f1982011215614812575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061485f57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161488760408401826001600160a01b03169052565b5060608301516148a260608401826001600160401b03169052565b5060808301516148bd60808401826001600160401b03169052565b5060a08301516148d860a08401826001600160401b03169052565b5060c08301516148f360c08401826001600160401b03169052565b5060e083015161490e60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561490e5761490e614915565b5f5b8381101561496357818101518382015260200161494b565b50505f910152565b602081525f8251806020840152614989816040850160208701614949565b601f01601f19169190910160400192915050565b5f602082840312156149ad575f80fd5b5051919050565b5f826149ce57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176109e7576109e7614915565b6001600160401b0381811683821601908082111561490e5761490e614915565b600181811c90821680614aa957607f821691505b602082108103614ac757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614b2681614a95565b806020870152604060018084165f8114614b475760018114614b6357614b90565b60ff19851660408a0152604084151560051b8a01019550614b90565b895f5260205f205f5b85811015614b875781548b8201860152908301908801614b6c565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614bd457614bd4614b9e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c0257614c02614b9e565b604052919050565b805161468d8161466d565b5f8060408385031215614c26575f80fd5b82516001600160401b0380821115614c3c575f80fd5b9084019060608287031215614c4f575f80fd5b614c57614bb2565b82518152602080840151614c6a816146e4565b82820152604084015183811115614c7f575f80fd5b80850194505087601f850112614c93575f80fd5b835183811115614ca557614ca5614b9e565b614cb7601f8201601f19168301614bda565b93508084528882828701011115614ccc575f80fd5b614cdb81838601848801614949565b50826040830152819550614cf0818801614c0a565b9450505050509250929050565b5f6001600160401b03808316818103614d1857614d18614915565b6001019392505050565b818103818111156109e7576109e7614915565b634e487b7160e01b5f52603260045260245ffd5b808201808211156109e7576109e7614915565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614e5257614e52614915565b505092915050565b61ffff811681146118fe575f80fd5b5f60208284031215614e79575f80fd5b8135610fef81614e5a565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614eda81614e5a565b61ffff8116905081548161ffff1982161783556020840135614efb81614777565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f60208284031215614f35575f80fd5b813560ff81168114610fef575f80fd5b5f60208284031215614f55575f80fd5b8135610fef816146e4565b5f808335601e19843603018112614f75575f80fd5b8301803591506001600160401b03821115614f8e575f80fd5b602001915036819003821315614fa2575f80fd5b9250929050565b601f82111561157457805f5260205f20601f840160051c81016020851015614fce5750805b601f840160051c820191505b81811015610dcd575f8155600101614fda565b81516001600160401b0381111561500657615006614b9e565b61501a816150148454614a95565b84614fa9565b602080601f83116001811461504d575f84156150365750858301515b5f19600386901b1c1916600185901b1785556150a4565b5f85815260208120601f198616915b8281101561507b5788860151825594840194600190910190840161505c565b508582101561509857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156150bc575f80fd5b8151610fef8161466d565b5f82516150d8818460208701614949565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161524238038061524283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150f58061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f3660046145ff565b610357565b005b61015461016436600461463a565b61071b565b6101a761017736600461463a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e236600461463a565b6108eb565b6040516001600160401b0390911681526020016101b1565b61015461020d366004614665565b610901565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c3660046146a3565b6109e0565b61015461024f3660046146bc565b610a0b565b6101a76102623660046146f8565b610bdb565b6101e761027536600461463a565b610bf4565b6101546102883660046145ff565b610c08565b61015461029b3660046146bc565b610ce8565b6101a76102ae366004614713565b610ef7565b6101a76102c1366004614733565b610f0a565b6101546102d43660046146a3565b610f36565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d36600461463a565b6110f3565b61015461032036600461463a565b611379565b6101c2601481565b61034061033b36600461463a565b61148d565b6040516101b191906147a8565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206150498339815191529184156103a9576103a6828561156c565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db614794565b60048111156103ec576103ec614794565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104688461148d565b905060028251600481111561047f5761047f614794565b146104d15760405162461bcd60e51b815260206004820152602a60248201525f805160206150698339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105365760405162461bcd60e51b815260206004820152603360248201525f805160206150698339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c8565b600382528051600290600581111561055057610550614794565b036105a1576105628260600151611808565b5f82606001518260a001516105779190614896565b90506105838582611815565b506001600160401b0390811660e0850152421660a0840152506105c4565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156105f5576105f5614794565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610709916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206150c983398151915260205260408082208151610100810190925280545f8051602061508983398151915293929190829060ff16600581111561076957610769614794565b600581111561077a5761077a614794565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156107ff576107ff614794565b146108645760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb6108898584608001515f61193f565b6040518263ffffffff1660e01b81526004016108a591906148d8565b6020604051808303815f875af11580156108c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108e5919061490a565b50505050565b5f6108fb64e8d4a5100083614921565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061094a575080546001600160401b03808416911610155b156109685760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109938484611b5c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109ea82611b76565b9050610a0781606001516001600160401b03168260400151611ee9565b5050565b5f805160206150498339815191525f610a2384611f1f565b90505f80610a348360400151612100565b50915091505f610a438361148d565b9050816001600160401b031681608001516001600160401b03161015610a7b5760405162461bcd60e51b81526004016104c890614940565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ac05760405162461bcd60e51b81526004016104c890614982565b60015f87815260068701602052604090205460ff166004811115610ae657610ae6614794565b14610b4f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6108fb6001600160401b03831664e8d4a510006149cb565b5f610bfe8261148d565b60a0015192915050565b5f805160206150498339815191525f610c208561148d565b5f86815260058401602052604090205460c0820151919250610c5291620100009091046001600160401b0316906149e2565b6001600160401b0316421015610cc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c8565b8315610cd857610cd6858461156c565b505b610ce18561233b565b5050505050565b5f805160206150498339815191525f610d0084611f1f565b90505f80610d118360400151612100565b50915091505f610d208361148d565b9050816001600160401b031681608001516001600160401b03161015610d585760405162461bcd60e51b81526004016104c890614940565b5f8681526006860160205260409020600301546001600160401b0380841691161115610d965760405162461bcd60e51b81526004016104c890614982565b60035f87815260068701602052604090205460ff166004811115610dbc57610dbc614794565b14610e105760405162461bcd60e51b815260206004820152603160248201525f805160206150698339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610eb591611ee9565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f038333846126d9565b9392505050565b5f610f13612a4e565b610f1e848484612a85565b9050610f0360015f805160206150a983398151915255565b5f805160206150898339815191525f610f4e83611f1f565b90505f80610f5f8360400151612cbe565b9150915080610fc15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c8565b5f82815260078501602052604081208054610fdb90614a02565b905011801561100d575060015f83815260088601602052604090205460ff16600581111561100b5761100b614794565b145b6110295760405162461bcd60e51b81526004016104c890614a3a565b5f828152600785016020526040812061104191614547565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061504983398151915293929190829060ff16600481111561115457611154614794565b600481111561116557611165614794565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156111ec576111ec614794565b148061120a575060038151600481111561120857611208614794565b145b61125e5760405162461bcd60e51b815260206004820152603260248201525f80516020615069833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c8565b5f61126c826040015161148d565b905080608001516001600160401b03165f036112f05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb61131d846040015184608001518560a0015161193f565b6040518263ffffffff1660e01b815260040161133991906148d8565b6020604051808303815f875af1158015611355573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce1919061490a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150898339815191529291906113c190614a02565b90501180156113f3575060015f83815260088301602052604090205460ff1660058111156113f1576113f1614794565b145b61140f5760405162461bcd60e51b81526004016104c890614a3a565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114489190600401614a81565b6020604051808303815f875af1158015611464573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611488919061490a565b505050565b61149561457e565b5f8281525f805160206150c98339815191526020526040908190208151610100810190925280545f80516020615089833981519152929190829060ff1660058111156114e3576114e3614794565b60058111156114f4576114f4614794565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115b7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115de9190810190614b82565b91509150806116415760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611684573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116a8919061490a565b82511461170c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c8565b60208201516001600160a01b0316156117825760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c8565b5f806117918460400151612e5f565b915091508187146117fe5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c8565b9695505050505050565b611812815f613037565b50565b5f805f61182185613291565b5f8681525f805160206150c983398151915260205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038916021790559091505f80516020615089833981519152906005600160991b0163ee5b48eb61188a89868a61193f565b6040518263ffffffff1660e01b81526004016118a691906148d8565b6020604051808303815f875af11580156118c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118e6919061490a565b604080516001600160401b0389811682526020820184905282519394508616928a927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3919350909150505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119b857611978816001614c6a565b6119839060086149cb565b5081515f9083908390811061199a5761199a614c7d565b60200101906001600160f81b03191690815f1a905350600101611964565b505f5b6004811015611a1b576119cf816003614c6a565b6119da9060086149cb565b6001901c60f81b826119ed836002614c91565b815181106119fd576119fd614c7d565b60200101906001600160f81b03191690815f1a9053506001016119bb565b505f5b6020811015611a7d57611a3281601f614c6a565b611a3d9060086149cb565b86901c60f81b82611a4f836006614c91565b81518110611a5f57611a5f614c7d565b60200101906001600160f81b03191690815f1a905350600101611a1e565b505f5b6008811015611ae857611a94816007614c6a565b611a9f9060086149cb565b6001600160401b038616901c60f81b82611aba836026614c91565b81518110611aca57611aca614c7d565b60200101906001600160f81b03191690815f1a905350600101611a80565b505f5b6008811015611b5357611aff816007614c6a565b611b0a9060086149cb565b6001600160401b038516901c60f81b82611b2583602e614c91565b81518110611b3557611b35614c7d565b60200101906001600160f81b03191690815f1a905350600101611aeb565b50949350505050565b611b64613313565b611b6d8261335e565b610a07816133ca565b611b7e61457e565b5f805160206150898339815191525f611b9684611f1f565b90505f80611ba78360400151612cbe565b915091508015611c0c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611c3e57611c3e614794565b6005811115611c4f57611c4f614794565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611cd657611cd6614794565b1480611cf45750600182516005811115611cf257611cf2614794565b145b611d535760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c8565b600382516005811115611d6857611d68614794565b03611d7557506004611d79565b5060055b6020808301515f90815260098801909152604081205581816005811115611da257611da2614794565b90816005811115611db557611db5614794565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611de957611de9614794565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611eb457611eb4614794565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a07906001600160a01b0316828461347e565b60408051606080820183525f8083526020830181905292820152905f805160206150898339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f94573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fbb9190810190614b82565b91509150806120225760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c8565b82548251146120855760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c8565b60208201516001600160a01b0316156120f85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c8565b509392505050565b5f805f83516036146121245760405162461bcd60e51b81526004016104c890614ca4565b5f805b60028110156121735761213b816001614c6a565b6121469060086149cb565b61ffff1686828151811061215c5761215c614c7d565b016020015160f81c901b9190911790600101612127565b5061ffff8116156121965760405162461bcd60e51b81526004016104c890614ced565b5f805b60048110156121f1576121ad816003614c6a565b6121b89060086149cb565b63ffffffff16876121ca836002614c91565b815181106121da576121da614c7d565b016020015160f81c901b9190911790600101612199565b5063ffffffff81166003146122185760405162461bcd60e51b81526004016104c890614d30565b5f805b602081101561226d5761222f81601f614c6a565b61223a9060086149cb565b88612246836006614c91565b8151811061225657612256614c7d565b016020015160f81c901b919091179060010161221b565b505f805b60088110156122cc57612285816007614c6a565b6122909060086149cb565b6001600160401b0316896122a5836026614c91565b815181106122b5576122b5614c7d565b016020015160f81c901b9190911790600101612271565b505f805b600881101561232b576122e4816007614c6a565b6122ef9060086149cb565b6001600160401b03168a61230483602e614c91565b8151811061231457612314614c7d565b016020015160f81c901b91909117906001016122d0565b5091989097509095509350505050565b5f8181525f805160206150c983398151915260205260408082208151610100810190925280545f8051602061508983398151915293929190829060ff16600581111561238957612389614794565b600581111561239a5761239a614794565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561242257612422614794565b1461247e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c8565b60408101516001600160a01b0316336001600160a01b0316146124f85760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c8565b6125058160a00151611808565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561254957612549614794565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126158461260f81613291565b5f61193f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126449085906004016148d8565b6020604051808303815f875af1158015612660573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612684919061490a565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126e2612a4e565b5f805160206150498339815191525f6126fd6101e2856134dd565b90505f6127098761148d565b905060028151600581111561272057612720614794565b1461277f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c8565b61278882613513565b5f828260a0015161279991906149e2565b600485015460608401519192506127bb916001600160401b0390911690614d77565b6001600160401b0316816001600160401b0316111561283a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c8565b5f806128468a84611815565b915091505f8a8360405160200161287492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561290f5761290f614794565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050610f0360015f805160206150a983398151915255565b5f805160206150a9833981519152805460011901612a7f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615049833981519152906001600160401b0316612ad160408601602087016146f8565b6001600160401b03161015612b405760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c8565b6003810154612b526020860186614db1565b61ffff1610158015612b765750612710612b6f6020860186614db1565b61ffff1611155b612b925760405162461bcd60e51b81526004016104c890614dcc565b8054831015612bf55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c8565b8060010154831115612c5c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c8565b5f612c66846134dd565b90505f612c72826108eb565b90505f612c7f888361351e565b5f81815260058601602052604090209091508790612c9d8282614e17565b509098975050505050505050565b60015f805160206150a983398151915255565b5f808251602714612ce15760405162461bcd60e51b81526004016104c890614ca4565b5f805b6002811015612d3057612cf8816001614c6a565b612d039060086149cb565b61ffff16858281518110612d1957612d19614c7d565b016020015160f81c901b9190911790600101612ce4565b5061ffff811615612d535760405162461bcd60e51b81526004016104c890614ced565b5f805b6004811015612dae57612d6a816003614c6a565b612d759060086149cb565b63ffffffff1686612d87836002614c91565b81518110612d9757612d97614c7d565b016020015160f81c901b9190911790600101612d56565b5063ffffffff8116600214612dd55760405162461bcd60e51b81526004016104c890614d30565b5f805b6020811015612e2a57612dec81601f614c6a565b612df79060086149cb565b87612e03836006614c91565b81518110612e1357612e13614c7d565b016020015160f81c901b9190911790600101612dd8565b505f86602681518110612e3f57612e3f614c7d565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e825760405162461bcd60e51b81526004016104c890614ca4565b5f805b6002811015612ed157612e99816001614c6a565b612ea49060086149cb565b61ffff16858281518110612eba57612eba614c7d565b016020015160f81c901b9190911790600101612e85565b5061ffff811615612ef45760405162461bcd60e51b81526004016104c890614ced565b5f805b6004811015612f4f57612f0b816003614c6a565b612f169060086149cb565b63ffffffff1686612f28836002614c91565b81518110612f3857612f38614c7d565b016020015160f81c901b9190911790600101612ef7565b5063ffffffff8116600414612f765760405162461bcd60e51b81526004016104c890614d30565b5f805b6020811015612fcb57612f8d81601f614c6a565b612f989060086149cb565b87612fa4836006614c91565b81518110612fb457612fb4614c7d565b016020015160f81c901b9190911790600101612f79565b505f805b600881101561302a57612fe3816007614c6a565b612fee9060086149cb565b6001600160401b031688613003836026614c91565b8151811061301357613013614c7d565b016020015160f81c901b9190911790600101612fcf565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061508983398151915291429190158061311d575060028301548151613119916001600160401b031690614c91565b8210155b15613143576001600160401b038516606082015281815260408101516020820152613162565b848160600181815161315591906149e2565b6001600160401b03169052505b6060810151613172906064614d77565b602082015160028501546001600160401b03929092169161319d9190600160401b900460ff166149cb565b10156132015760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c8565b831561322a57846001600160401b0316816040018181516132229190614c91565b905250613249565b846001600160401b0316816040018181516132459190614c6a565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b5f8181525f805160206150c98339815191526020526040812060030180545f80516020615089833981519152916001600160401b0390911690836132d483614e6d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661335c57604051631afcd79f60e31b815260040160405180910390fd5b565b613366613313565b61336f81613a58565b611812608082013560a083013561338c60e0850160c086016146f8565b61339d610100860160e08701614db1565b61ffff166133b361012087016101008801614e92565b6133c561014088016101208901614eb2565b613a79565b6133d2613313565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661345e5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261148891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613cbd565b5f6108fb827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613d1e565b611812816001613037565b5f5f805160206150898339815191524261353e60408601602087016146f8565b6001600160401b0316116135b05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c8565b6135c060408501602086016146f8565b6001600160401b03166135d66202a30042614c91565b116136495760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c8565b83356136a15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c8565b83355f908152600982016020526040902054156137115760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c8565b61371e6040850185614ecd565b90506030146137855760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c8565b61378e83613513565b5f806138286040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906137d391906146f8565b6001600160401b031681526020016137ee60408a018a614ecd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613e80565b5f828152600786016020526040902091935091506138468282614f53565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138739085906004016148d8565b6020604051808303815f875af115801561388f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138b3919061490a565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561393557613935614794565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a2a91908e01908e016146f8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613a60613313565b613a68614225565b613a70614235565b6118128161423d565b613a81613313565b5f8051602061504983398151915283613aed5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c8565b612710841115613b0f5760405162461bcd60e51b81526004016104c890614dcc565b85871115613b775760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c8565b5f8360ff1611613be45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c8565b600a60ff84161115613c565760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c8565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613cd16001600160a01b038416836143ea565b905080515f14158015613cf5575080806020019051810190613cf39190615012565b155b1561148857604051635274afe760e01b81526001600160a01b03841660048201526024016104c8565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613d64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d88919061490a565b9050613d9f6001600160a01b0385163330866143f7565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613de3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e07919061490a565b9050818111613e6d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c8565b613e778282614c6a565b95945050505050565b5f6060826080015151603014613eea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613f6157613f21816001614c6a565b613f2c9060086149cb565b5081515f90839083908110613f4357613f43614c7d565b60200101906001600160f81b03191690815f1a905350600101613f0d565b505f5b6004811015613fbf57613f78816003614c6a565b613f839060086149cb565b505f82613f91836002614c91565b81518110613fa157613fa1614c7d565b60200101906001600160f81b03191690815f1a905350600101613f64565b505f5b602081101561401c5784518160208110613fde57613fde614c7d565b1a60f81b82613fee836006614c91565b81518110613ffe57613ffe614c7d565b60200101906001600160f81b03191690815f1a905350600101613fc2565b505f5b602081101561407c578460200151816020811061403e5761403e614c7d565b1a60f81b8261404e836026614c91565b8151811061405e5761405e614c7d565b60200101906001600160f81b03191690815f1a90535060010161401f565b505f5b60088110156140f057614093816007614c6a565b61409e9060086149cb565b60ff1685604001516001600160401b0316901c60f81b828260466140c29190614c91565b815181106140d2576140d2614c7d565b60200101906001600160f81b03191690815f1a90535060010161407f565b505f5b603081101561415b578460800151818151811061411257614112614c7d565b01602001516001600160f81b0319168261412d83604e614c91565b8151811061413d5761413d614c7d565b60200101906001600160f81b03191690815f1a9053506001016140f3565b505f5b60088110156141cd57614172816007614c6a565b61417d9060086149cb565b60608601516001600160401b0390811691161c60f81b8261419f83607e614c91565b815181106141af576141af614c7d565b60200101906001600160f81b03191690815f1a90535060010161415e565b506002816040516141de919061502d565b602060405180830381855afa1580156141f9573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061421c919061490a565b94909350915050565b61422d613313565b61335c614430565b61335c613313565b614245613313565b80355f8051602061508983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146142916080840160608501614e92565b60ff1611156142fe5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c8565b5f61430f6080840160608501614e92565b60ff16116143775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c8565b6143876080830160608401614e92565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556143b860608301604084016146f8565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610f0383835f614438565b6040516001600160a01b0384811660248301528381166044830152606482018390526108e59186918216906323b872dd906084016134ab565b612cab613313565b60608147101561445d5760405163cd78605960e01b81523060048201526024016104c8565b5f80856001600160a01b03168486604051614478919061502d565b5f6040518083038185875af1925050503d805f81146144b2576040519150601f19603f3d011682016040523d82523d5f602084013e6144b7565b606091505b50915091506117fe8683836060826144d7576144d28261451e565b610f03565b81511580156144ee57506001600160a01b0384163b155b1561451757604051639996b31560e01b81526001600160a01b03851660048201526024016104c8565b5080610f03565b80511561452e5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461455390614a02565b5f825580601f10614562575050565b601f0160209004905f5260205f209081019061181291906145c2565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156145d6575f81556001016145c3565b5090565b8015158114611812575f80fd5b803563ffffffff811681146145fa575f80fd5b919050565b5f805f60608486031215614611575f80fd5b833592506020840135614623816145da565b9150614631604085016145e7565b90509250925092565b5f6020828403121561464a575f80fd5b5035919050565b6001600160a01b0381168114611812575f80fd5b5f80828403610160811215614678575f80fd5b61014080821215614687575f80fd5b849350830135905061469881614651565b809150509250929050565b5f602082840312156146b3575f80fd5b610f03826145e7565b5f80604083850312156146cd575f80fd5b6146d6836145e7565b946020939093013593505050565b6001600160401b0381168114611812575f80fd5b5f60208284031215614708575f80fd5b8135610f03816146e4565b5f8060408385031215614724575f80fd5b50508035926020909101359150565b5f805f8385036080811215614746575f80fd5b84356001600160401b0381111561475b575f80fd5b85016060818803121561476c575f80fd5b93506040601f198201121561477f575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106147cc57634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516147f460408401826001600160a01b03169052565b50606083015161480f60608401826001600160401b03169052565b50608083015161482a60808401826001600160401b03169052565b5060a083015161484560a08401826001600160401b03169052565b5060c083015161486060c08401826001600160401b03169052565b5060e083015161487b60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561487b5761487b614882565b5f5b838110156148d05781810151838201526020016148b8565b50505f910152565b602081525f82518060208401526148f68160408501602087016148b6565b601f01601f19169190910160400192915050565b5f6020828403121561491a575f80fd5b5051919050565b5f8261493b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176108fb576108fb614882565b6001600160401b0381811683821601908082111561487b5761487b614882565b600181811c90821680614a1657607f821691505b602082108103614a3457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a9381614a02565b806020870152604060018084165f8114614ab45760018114614ad057614afd565b60ff19851660408a0152604084151560051b8a01019550614afd565b895f5260205f205f5b85811015614af45781548b8201860152908301908801614ad9565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b4157614b41614b0b565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b6f57614b6f614b0b565b604052919050565b80516145fa816145da565b5f8060408385031215614b93575f80fd5b82516001600160401b0380821115614ba9575f80fd5b9084019060608287031215614bbc575f80fd5b614bc4614b1f565b82518152602080840151614bd781614651565b82820152604084015183811115614bec575f80fd5b80850194505087601f850112614c00575f80fd5b835183811115614c1257614c12614b0b565b614c24601f8201601f19168301614b47565b93508084528882828701011115614c39575f80fd5b614c48818386018488016148b6565b50826040830152819550614c5d818801614b77565b9450505050509250929050565b818103818111156108fb576108fb614882565b634e487b7160e01b5f52603260045260245ffd5b808201808211156108fb576108fb614882565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614d9a57614d9a614882565b505092915050565b61ffff81168114611812575f80fd5b5f60208284031215614dc1575f80fd5b8135610f0381614da2565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e2281614da2565b61ffff8116905081548161ffff1982161783556020840135614e43816146e4565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6001600160401b03808316818103614e8857614e88614882565b6001019392505050565b5f60208284031215614ea2575f80fd5b813560ff81168114610f03575f80fd5b5f60208284031215614ec2575f80fd5b8135610f0381614651565b5f808335601e19843603018112614ee2575f80fd5b8301803591506001600160401b03821115614efb575f80fd5b602001915036819003821315611938575f80fd5b601f82111561148857805f5260205f20601f840160051c81016020851015614f345750805b601f840160051c820191505b81811015610ce1575f8155600101614f40565b81516001600160401b03811115614f6c57614f6c614b0b565b614f8081614f7a8454614a02565b84614f0f565b602080601f831160018114614fb3575f8415614f9c5750858301515b5f19600386901b1c1916600185901b17855561500a565b5f85815260208120601f198616915b82811015614fe157888601518255948401946001909101908401614fc2565b5085821015614ffe57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615022575f80fd5b8151610f03816145da565b5f825161503e8184602087016148b6565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index b10c1df9f..bb8f45551 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614f41380380614f4183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614df48061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f366004614367565b61043b565b005b348015610161575f80fd5b506101546101703660046143a2565b6108eb565b348015610180575f80fd5b506101bf61018f3660046143a2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b506101546102123660046143b9565b610abb565b348015610222575f80fd5b506102366102313660046143a2565b610b98565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b506101546102903660046143d0565b610bae565b3480156102a0575f80fd5b506101546102af3660046143e9565b610bd9565b3480156102bf575f80fd5b506101bf6102ce366004614425565b610da9565b3480156102de575f80fd5b506102366102ed3660046143a2565b610dc2565b3480156102fd575f80fd5b5061015461030c366004614367565b610dd6565b6101bf61031f366004614440565b610eb6565b34801561032f575f80fd5b5061015461033e3660046143e9565b610ee2565b34801561034e575f80fd5b5061015461035d3660046143d0565b6110f1565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae3660046143a2565b6112ae565b3480156103be575f80fd5b506101546103cd3660046143a2565b611534565b6101bf6103e03660046143a2565b611648565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b506104186104133660046143a2565b611654565b6040516101c991906144ad565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614d4883398151915291841561048d5761048a8285611733565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf614499565b60048111156104d0576104d0614499565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054c84611654565b905060028251600481111561056357610563614499565b146105b55760405162461bcd60e51b815260206004820152602a60248201525f80516020614d688339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b0316331461061a5760405162461bcd60e51b815260206004820152603360248201525f80516020614d688339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ac565b600382528051600290600581111561063457610634614499565b036107715761064682606001516119cf565b61064f846119dc565b6001600160401b0390811660e0840152421660a0808401919091526060830151908201515f9161067e9161459b565b905061068a8582611a5e565b5f6005600160991b016001600160a01b031663ee5b48eb6106b0888760e0015186611aa6565b6040518263ffffffff1660e01b81526004016106cc91906145dd565b6020604051808303815f875af11580156106e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061070c919061460f565b90508360e001516001600160401b0316867f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df84846040516107629291906001600160401b03929092168252602082015260400190565b60405180910390a35050610794565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156107c5576107c5614499565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916108d9916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614dc883398151915260205260408082208151610100810190925280545f80516020614d8883398151915293929190829060ff16600581111561093957610939614499565b600581111561094a5761094a614499565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156109cf576109cf614499565b14610a345760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb610a598584608001515f611aa6565b6040518263ffffffff1660e01b8152600401610a7591906145dd565b6020604051808303815f875af1158015610a91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab5919061460f565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b04575080546001600160401b03808416911610155b15610b225760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b4c83611cc5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610ba864e8d4a5100083614626565b92915050565b5f610bb882611cd6565b9050610bd581606001516001600160401b03168260400151612049565b5050565b5f80516020614d488339815191525f610bf18461205c565b90505f80610c02836040015161223d565b50915091505f610c1183611654565b9050816001600160401b031681608001516001600160401b03161015610c495760405162461bcd60e51b81526004016105ac90614645565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c8e5760405162461bcd60e51b81526004016105ac90614687565b60015f87815260068701602052604090205460ff166004811115610cb457610cb4614499565b14610d1d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610ba86001600160401b03831664e8d4a510006146d0565b5f610dcc82611654565b60a0015192915050565b5f80516020614d488339815191525f610dee85611654565b5f86815260058401602052604090205460c0820151919250610e2091620100009091046001600160401b0316906146e7565b6001600160401b0316421015610e945760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ac565b8315610ea657610ea48584611733565b505b610eaf85612478565b5050505050565b5f610ebf612816565b610eca83833461284d565b9050610ba860015f80516020614da883398151915255565b5f80516020614d488339815191525f610efa8461205c565b90505f80610f0b836040015161223d565b50915091505f610f1a83611654565b9050816001600160401b031681608001516001600160401b03161015610f525760405162461bcd60e51b81526004016105ac90614645565b5f8681526006860160205260409020600301546001600160401b0380841691161115610f905760405162461bcd60e51b81526004016105ac90614687565b60035f87815260068701602052604090205460ff166004811115610fb657610fb6614499565b1461100a5760405162461bcd60e51b815260206004820152603160248201525f80516020614d688339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526110af91612049565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614d888339815191525f6111098361205c565b90505f8061111a8360400151612a7b565b915091508061117c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ac565b5f8281526007850160205260408120805461119690614707565b90501180156111c8575060015f83815260088601602052604090205460ff1660058111156111c6576111c6614499565b145b6111e45760405162461bcd60e51b81526004016105ac90614739565b5f82815260078501602052604081206111fc916142af565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614d4883398151915293929190829060ff16600481111561130f5761130f614499565b600481111561132057611320614499565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156113a7576113a7614499565b14806113c557506003815160048111156113c3576113c3614499565b145b6114195760405162461bcd60e51b815260206004820152603260248201525f80516020614d68833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ac565b5f6114278260400151611654565b905080608001516001600160401b03165f036114ab5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6114d8846040015184608001518560a00151611aa6565b6040518263ffffffff1660e01b81526004016114f491906145dd565b6020604051808303815f875af1158015611510573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eaf919061460f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614d8883398151915292919061157c90614707565b90501180156115ae575060015f83815260088301602052604090205460ff1660058111156115ac576115ac614499565b145b6115ca5760405162461bcd60e51b81526004016105ac90614739565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916116039190600401614780565b6020604051808303815f875af115801561161f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611643919061460f565b505050565b5f610ba8823334612c1c565b61165c6142e6565b5f8281525f80516020614dc88339815191526020526040908190208151610100810190925280545f80516020614d88833981519152929190829060ff1660058111156116aa576116aa614499565b60058111156116bb576116bb614499565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561177e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117a59190810190614895565b91509150806118085760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ac565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561184b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061186f919061460f565b8251146118d35760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ac565b60208201516001600160a01b0316156119495760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ac565b5f806119588460400151613017565b915091508187146119c55760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ac565b9695505050505050565b6119d9815f6131ef565b50565b5f8181525f80516020614dc88339815191526020526040812060030180545f80516020614d88833981519152916001600160401b039091169083611a1f8361497d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b5f9182525f80516020614dc8833981519152602052604090912060030180546001600160401b03909216600160401b0267ffffffffffffffff60401b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611b1f57611adf8160016149a2565b611aea9060086146d0565b5081515f90839083908110611b0157611b016149b5565b60200101906001600160f81b03191690815f1a905350600101611acb565b505f5b6004811015611b8257611b368160036149a2565b611b419060086146d0565b6001901c60f81b82611b548360026149c9565b81518110611b6457611b646149b5565b60200101906001600160f81b03191690815f1a905350600101611b22565b505f5b6020811015611be457611b9981601f6149a2565b611ba49060086146d0565b86901c60f81b82611bb68360066149c9565b81518110611bc657611bc66149b5565b60200101906001600160f81b03191690815f1a905350600101611b85565b505f5b6008811015611c4f57611bfb8160076149a2565b611c069060086146d0565b6001600160401b038616901c60f81b82611c218360266149c9565b81518110611c3157611c316149b5565b60200101906001600160f81b03191690815f1a905350600101611be7565b505f5b6008811015611cba57611c668160076149a2565b611c719060086146d0565b6001600160401b038516901c60f81b82611c8c83602e6149c9565b81518110611c9c57611c9c6149b5565b60200101906001600160f81b03191690815f1a905350600101611c52565b5090505b9392505050565b611ccd613449565b6119d981613494565b611cde6142e6565b5f80516020614d888339815191525f611cf68461205c565b90505f80611d078360400151612a7b565b915091508015611d6c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ac565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d9e57611d9e614499565b6005811115611daf57611daf614499565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611e3657611e36614499565b1480611e545750600182516005811115611e5257611e52614499565b145b611eb35760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ac565b600382516005811115611ec857611ec8614499565b03611ed557506004611ed9565b5060055b6020808301515f90815260098801909152604081205581816005811115611f0257611f02614499565b90816005811115611f1557611f15614499565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611f4957611f49614499565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790558151600581111561201457612014614499565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610bd56001600160a01b03821683613500565b60408051606080820183525f8083526020830181905292820152905f80516020614d888339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156120d1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120f89190810190614895565b915091508061215f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105ac565b82548251146121c25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ac565b60208201516001600160a01b0316156122355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ac565b509392505050565b5f805f83516036146122615760405162461bcd60e51b81526004016105ac906149dc565b5f805b60028110156122b0576122788160016149a2565b6122839060086146d0565b61ffff16868281518110612299576122996149b5565b016020015160f81c901b9190911790600101612264565b5061ffff8116156122d35760405162461bcd60e51b81526004016105ac90614a25565b5f805b600481101561232e576122ea8160036149a2565b6122f59060086146d0565b63ffffffff16876123078360026149c9565b81518110612317576123176149b5565b016020015160f81c901b91909117906001016122d6565b5063ffffffff81166003146123555760405162461bcd60e51b81526004016105ac90614a68565b5f805b60208110156123aa5761236c81601f6149a2565b6123779060086146d0565b886123838360066149c9565b81518110612393576123936149b5565b016020015160f81c901b9190911790600101612358565b505f805b6008811015612409576123c28160076149a2565b6123cd9060086146d0565b6001600160401b0316896123e28360266149c9565b815181106123f2576123f26149b5565b016020015160f81c901b91909117906001016123ae565b505f805b6008811015612468576124218160076149a2565b61242c9060086146d0565b6001600160401b03168a61244183602e6149c9565b81518110612451576124516149b5565b016020015160f81c901b919091179060010161240d565b5091989097509095509350505050565b5f8181525f80516020614dc883398151915260205260408082208151610100810190925280545f80516020614d8883398151915293929190829060ff1660058111156124c6576124c6614499565b60058111156124d7576124d7614499565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561255f5761255f614499565b146125bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ac565b60408101516001600160a01b0316336001600160a01b0316146126355760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105ac565b6126428160a001516119cf565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561268657612686614499565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6127528461274c816119dc565b5f611aa6565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906127819085906004016145dd565b6020604051808303815f875af115801561279d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127c1919061460f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020614da883398151915280546001190161284757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614d48833981519152906001600160401b03166128996040860160208701614425565b6001600160401b031610156129085760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ac565b600381015461291a6020860186614abe565b61ffff161015801561293e57506127106129376020860186614abe565b61ffff1611155b61295a5760405162461bcd60e51b81526004016105ac90614ad9565b80548310156129bd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ac565b8060010154831115612a245760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ac565b825f612a2f82610b98565b90505f612a3c8883613593565b5f81815260058601602052604090209091508790612a5a8282614b24565b509098975050505050505050565b60015f80516020614da883398151915255565b5f808251602714612a9e5760405162461bcd60e51b81526004016105ac906149dc565b5f805b6002811015612aed57612ab58160016149a2565b612ac09060086146d0565b61ffff16858281518110612ad657612ad66149b5565b016020015160f81c901b9190911790600101612aa1565b5061ffff811615612b105760405162461bcd60e51b81526004016105ac90614a25565b5f805b6004811015612b6b57612b278160036149a2565b612b329060086146d0565b63ffffffff1686612b448360026149c9565b81518110612b5457612b546149b5565b016020015160f81c901b9190911790600101612b13565b5063ffffffff8116600214612b925760405162461bcd60e51b81526004016105ac90614a68565b5f805b6020811015612be757612ba981601f6149a2565b612bb49060086146d0565b87612bc08360066149c9565b81518110612bd057612bd06149b5565b016020015160f81c901b9190911790600101612b95565b505f86602681518110612bfc57612bfc6149b5565b016020015191976001600160f81b03199092161515965090945050505050565b5f612c25612816565b5f80516020614d488339815191525f612c3d84610b98565b90505f612c4987611654565b9050600281516005811115612c6057612c60614499565b14612cbf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ac565b612cc882613acd565b5f828260a00151612cd991906146e7565b60048501546060840151919250612cfb916001600160401b0390911690614b7a565b6001600160401b0316816001600160401b03161115612d7a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ac565b612d848882611a5e565b5f612d8e896119dc565b90505f8982604051602001612dba92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb612df48d8688611aa6565b6040518263ffffffff1660e01b8152600401612e1091906145dd565b6020604051808303815f875af1158015612e2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e50919061460f565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115612ed857612ed8614499565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a45095505050505050611cbe60015f80516020614da883398151915255565b5f808251602e1461303a5760405162461bcd60e51b81526004016105ac906149dc565b5f805b6002811015613089576130518160016149a2565b61305c9060086146d0565b61ffff16858281518110613072576130726149b5565b016020015160f81c901b919091179060010161303d565b5061ffff8116156130ac5760405162461bcd60e51b81526004016105ac90614a25565b5f805b6004811015613107576130c38160036149a2565b6130ce9060086146d0565b63ffffffff16866130e08360026149c9565b815181106130f0576130f06149b5565b016020015160f81c901b91909117906001016130af565b5063ffffffff811660041461312e5760405162461bcd60e51b81526004016105ac90614a68565b5f805b60208110156131835761314581601f6149a2565b6131509060086146d0565b8761315c8360066149c9565b8151811061316c5761316c6149b5565b016020015160f81c901b9190911790600101613131565b505f805b60088110156131e25761319b8160076149a2565b6131a69060086146d0565b6001600160401b0316886131bb8360266149c9565b815181106131cb576131cb6149b5565b016020015160f81c901b9190911790600101613187565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614d888339815191529142919015806132d55750600283015481516132d1916001600160401b0316906149c9565b8210155b156132fb576001600160401b03851660608201528181526040810151602082015261331a565b848160600181815161330d91906146e7565b6001600160401b03169052505b606081015161332a906064614b7a565b602082015160028501546001600160401b0392909216916133559190600160401b900460ff166146d0565b10156133b95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ac565b83156133e257846001600160401b0316816040018181516133da91906149c9565b905250613401565b846001600160401b0316816040018181516133fd91906149a2565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661349257604051631afcd79f60e31b815260040160405180910390fd5b565b61349c613449565b6134a581613ad8565b6119d9608082013560a08301356134c260e0850160c08601614425565b6134d3610100860160e08701614abe565b61ffff166134e961012087016101008801614ba5565b6134fb61014088016101208901614bc5565b613af9565b804710156135235760405163cd78605960e01b81523060048201526024016105ac565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461356c576040519150601f19603f3d011682016040523d82523d5f602084013e613571565b606091505b505090508061164357604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614d88833981519152426135b36040860160208701614425565b6001600160401b0316116136255760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ac565b6136356040850160208601614425565b6001600160401b031661364b6202a300426149c9565b116136be5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ac565b83356137165760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105ac565b83355f908152600982016020526040902054156137865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105ac565b6137936040850185614be0565b90506030146137fa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105ac565b61380383613acd565b5f8061389d6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906138489190614425565b6001600160401b0316815260200161386360408a018a614be0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613d3d565b5f828152600786016020526040902091935091506138bb8282614c6d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138e89085906004016145dd565b6020604051808303815f875af1158015613904573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613928919061460f565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff191660018360058111156139aa576139aa614499565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a9f91908e01908e01614425565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6119d98160016131ef565b613ae0613449565b613ae86140e2565b613af06140f2565b6119d9816140fa565b613b01613449565b5f80516020614d4883398151915283613b6d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ac565b612710841115613b8f5760405162461bcd60e51b81526004016105ac90614ad9565b85871115613bf75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ac565b5f8360ff1611613c645760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ac565b600a60ff84161115613cd65760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ac565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613da75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ac565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613e1e57613dde8160016149a2565b613de99060086146d0565b5081515f90839083908110613e0057613e006149b5565b60200101906001600160f81b03191690815f1a905350600101613dca565b505f5b6004811015613e7c57613e358160036149a2565b613e409060086146d0565b505f82613e4e8360026149c9565b81518110613e5e57613e5e6149b5565b60200101906001600160f81b03191690815f1a905350600101613e21565b505f5b6020811015613ed95784518160208110613e9b57613e9b6149b5565b1a60f81b82613eab8360066149c9565b81518110613ebb57613ebb6149b5565b60200101906001600160f81b03191690815f1a905350600101613e7f565b505f5b6020811015613f395784602001518160208110613efb57613efb6149b5565b1a60f81b82613f0b8360266149c9565b81518110613f1b57613f1b6149b5565b60200101906001600160f81b03191690815f1a905350600101613edc565b505f5b6008811015613fad57613f508160076149a2565b613f5b9060086146d0565b60ff1685604001516001600160401b0316901c60f81b82826046613f7f91906149c9565b81518110613f8f57613f8f6149b5565b60200101906001600160f81b03191690815f1a905350600101613f3c565b505f5b60308110156140185784608001518181518110613fcf57613fcf6149b5565b01602001516001600160f81b03191682613fea83604e6149c9565b81518110613ffa57613ffa6149b5565b60200101906001600160f81b03191690815f1a905350600101613fb0565b505f5b600881101561408a5761402f8160076149a2565b61403a9060086146d0565b60608601516001600160401b0390811691161c60f81b8261405c83607e6149c9565b8151811061406c5761406c6149b5565b60200101906001600160f81b03191690815f1a90535060010161401b565b5060028160405161409b9190614d2c565b602060405180830381855afa1580156140b6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906140d9919061460f565b94909350915050565b6140ea613449565b6134926142a7565b613492613449565b614102613449565b80355f80516020614d8883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461414e6080840160608501614ba5565b60ff1611156141bb5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ac565b5f6141cc6080840160608501614ba5565b60ff16116142345760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ac565b6142446080830160608401614ba5565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556142756060830160408401614425565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612a68613449565b5080546142bb90614707565b5f825580601f106142ca575050565b601f0160209004905f5260205f20908101906119d9919061432a565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561433e575f815560010161432b565b5090565b80151581146119d9575f80fd5b803563ffffffff81168114614362575f80fd5b919050565b5f805f60608486031215614379575f80fd5b83359250602084013561438b81614342565b91506143996040850161434f565b90509250925092565b5f602082840312156143b2575f80fd5b5035919050565b5f61014082840312156143ca575f80fd5b50919050565b5f602082840312156143e0575f80fd5b611cbe8261434f565b5f80604083850312156143fa575f80fd5b6144038361434f565b946020939093013593505050565b6001600160401b03811681146119d9575f80fd5b5f60208284031215614435575f80fd5b8135611cbe81614411565b5f808284036060811215614452575f80fd5b83356001600160401b03811115614467575f80fd5b840160608187031215614478575f80fd5b92506040601f198201121561448b575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106144d157634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516144f960408401826001600160a01b03169052565b50606083015161451460608401826001600160401b03169052565b50608083015161452f60808401826001600160401b03169052565b5060a083015161454a60a08401826001600160401b03169052565b5060c083015161456560c08401826001600160401b03169052565b5060e083015161458060e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561458057614580614587565b5f5b838110156145d55781810151838201526020016145bd565b50505f910152565b602081525f82518060208401526145fb8160408501602087016145bb565b601f01601f19169190910160400192915050565b5f6020828403121561461f575f80fd5b5051919050565b5f8261464057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610ba857610ba8614587565b6001600160401b0381811683821601908082111561458057614580614587565b600181811c9082168061471b57607f821691505b6020821081036143ca57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461479281614707565b806020870152604060018084165f81146147b357600181146147cf576147fc565b60ff19851660408a0152604084151560051b8a010195506147fc565b895f5260205f205f5b858110156147f35781548b82018601529083019088016147d8565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156148405761484061480a565b60405290565b604051601f8201601f191681016001600160401b038111828210171561486e5761486e61480a565b604052919050565b6001600160a01b03811681146119d9575f80fd5b805161436281614342565b5f80604083850312156148a6575f80fd5b82516001600160401b03808211156148bc575f80fd5b90840190606082870312156148cf575f80fd5b6148d761481e565b825181526020808401516148ea81614876565b828201526040840151838111156148ff575f80fd5b80850194505087601f850112614913575f80fd5b8351838111156149255761492561480a565b614937601f8201601f19168301614846565b9350808452888282870101111561494c575f80fd5b61495b818386018488016145bb565b5082604083015281955061497081880161488a565b9450505050509250929050565b5f6001600160401b0380831681810361499857614998614587565b6001019392505050565b81810381811115610ba857610ba8614587565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610ba857610ba8614587565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff811681146119d9575f80fd5b5f60208284031215614ace575f80fd5b8135611cbe81614aaf565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614b2f81614aaf565b61ffff8116905081548161ffff1982161783556020840135614b5081614411565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614b9d57614b9d614587565b505092915050565b5f60208284031215614bb5575f80fd5b813560ff81168114611cbe575f80fd5b5f60208284031215614bd5575f80fd5b8135611cbe81614876565b5f808335601e19843603018112614bf5575f80fd5b8301803591506001600160401b03821115614c0e575f80fd5b602001915036819003821315614c22575f80fd5b9250929050565b601f82111561164357805f5260205f20601f840160051c81016020851015614c4e5750805b601f840160051c820191505b81811015610eaf575f8155600101614c5a565b81516001600160401b03811115614c8657614c8661480a565b614c9a81614c948454614707565b84614c29565b602080601f831160018114614ccd575f8415614cb65750858301515b5f19600386901b1c1916600185901b178555614d24565b5f85815260208120601f198616915b82811015614cfb57888601518255948401946001909101908401614cdc565b5085821015614d1857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614d3d8184602087016145bb565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614ea7380380614ea783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d5a8061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f3660046142d4565b61043b565b005b348015610161575f80fd5b5061015461017036600461430f565b6107ff565b348015610180575f80fd5b506101bf61018f36600461430f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b50610154610212366004614326565b6109cf565b348015610222575f80fd5b5061023661023136600461430f565b610aac565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b5061015461029036600461433d565b610ac2565b3480156102a0575f80fd5b506101546102af366004614356565b610aed565b3480156102bf575f80fd5b506101bf6102ce366004614392565b610cbd565b3480156102de575f80fd5b506102366102ed36600461430f565b610cd6565b3480156102fd575f80fd5b5061015461030c3660046142d4565b610cea565b6101bf61031f3660046143ad565b610dca565b34801561032f575f80fd5b5061015461033e366004614356565b610df6565b34801561034e575f80fd5b5061015461035d36600461433d565b611005565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae36600461430f565b6111c2565b3480156103be575f80fd5b506101546103cd36600461430f565b611448565b6101bf6103e036600461430f565b61155c565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b5061041861041336600461430f565b611568565b6040516101c9919061441a565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614cae83398151915291841561048d5761048a8285611647565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf614406565b60048111156104d0576104d0614406565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054c84611568565b905060028251600481111561056357610563614406565b146105b55760405162461bcd60e51b815260206004820152602a60248201525f80516020614cce8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b0316331461061a5760405162461bcd60e51b815260206004820152603360248201525f80516020614cce8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ac565b600382528051600290600581111561063457610634614406565b036106855761064682606001516118e3565b5f82606001518260a0015161065b9190614508565b905061066785826118f0565b506001600160401b0390811660e0850152421660a0840152506106a8565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156106d9576106d9614406565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916107ed916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614d2e83398151915260205260408082208151610100810190925280545f80516020614cee83398151915293929190829060ff16600581111561084d5761084d614406565b600581111561085e5761085e614406565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108e3576108e3614406565b146109485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb61096d8584608001515f611a1a565b6040518263ffffffff1660e01b8152600401610989919061454a565b6020604051808303815f875af11580156109a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c9919061457c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a18575080546001600160401b03808416911610155b15610a365760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6083611c39565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610abc64e8d4a5100083614593565b92915050565b5f610acc82611c4a565b9050610ae981606001516001600160401b03168260400151611fbd565b5050565b5f80516020614cae8339815191525f610b0584611fd0565b90505f80610b1683604001516121b1565b50915091505f610b2583611568565b9050816001600160401b031681608001516001600160401b03161015610b5d5760405162461bcd60e51b81526004016105ac906145b2565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ba25760405162461bcd60e51b81526004016105ac906145f4565b60015f87815260068701602052604090205460ff166004811115610bc857610bc8614406565b14610c315760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610abc6001600160401b03831664e8d4a5100061463d565b5f610ce082611568565b60a0015192915050565b5f80516020614cae8339815191525f610d0285611568565b5f86815260058401602052604090205460c0820151919250610d3491620100009091046001600160401b031690614654565b6001600160401b0316421015610da85760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ac565b8315610dba57610db88584611647565b505b610dc3856123ec565b5050505050565b5f610dd361278a565b610dde8383346127c1565b9050610abc60015f80516020614d0e83398151915255565b5f80516020614cae8339815191525f610e0e84611fd0565b90505f80610e1f83604001516121b1565b50915091505f610e2e83611568565b9050816001600160401b031681608001516001600160401b03161015610e665760405162461bcd60e51b81526004016105ac906145b2565b5f8681526006860160205260409020600301546001600160401b0380841691161115610ea45760405162461bcd60e51b81526004016105ac906145f4565b60035f87815260068701602052604090205460ff166004811115610eca57610eca614406565b14610f1e5760405162461bcd60e51b815260206004820152603160248201525f80516020614cce8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610fc391611fbd565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614cee8339815191525f61101d83611fd0565b90505f8061102e83604001516129ef565b91509150806110905760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ac565b5f828152600785016020526040812080546110aa90614674565b90501180156110dc575060015f83815260088601602052604090205460ff1660058111156110da576110da614406565b145b6110f85760405162461bcd60e51b81526004016105ac906146a6565b5f82815260078501602052604081206111109161421c565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614cae83398151915293929190829060ff16600481111561122357611223614406565b600481111561123457611234614406565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112bb576112bb614406565b14806112d957506003815160048111156112d7576112d7614406565b145b61132d5760405162461bcd60e51b815260206004820152603260248201525f80516020614cce833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ac565b5f61133b8260400151611568565b905080608001516001600160401b03165f036113bf5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6113ec846040015184608001518560a00151611a1a565b6040518263ffffffff1660e01b8152600401611408919061454a565b6020604051808303815f875af1158015611424573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc3919061457c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614cee83398151915292919061149090614674565b90501180156114c2575060015f83815260088301602052604090205460ff1660058111156114c0576114c0614406565b145b6114de5760405162461bcd60e51b81526004016105ac906146a6565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161151791906004016146ed565b6020604051808303815f875af1158015611533573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611557919061457c565b505050565b5f610abc823334612b90565b611570614253565b5f8281525f80516020614d2e8339815191526020526040908190208151610100810190925280545f80516020614cee833981519152929190829060ff1660058111156115be576115be614406565b60058111156115cf576115cf614406565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611692573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116b99190810190614802565b915091508061171c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ac565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561175f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611783919061457c565b8251146117e75760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ac565b60208201516001600160a01b03161561185d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ac565b5f8061186c8460400151612f02565b915091508187146118d95760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ac565b9695505050505050565b6118ed815f6130da565b50565b5f805f6118fc85613334565b5f8681525f80516020614d2e83398151915260205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038916021790559091505f80516020614cee833981519152906005600160991b0163ee5b48eb61196589868a611a1a565b6040518263ffffffff1660e01b8152600401611981919061454a565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c1919061457c565b604080516001600160401b0389811682526020820184905282519394508616928a927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3919350909150505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a9357611a538160016148ea565b611a5e90600861463d565b5081515f90839083908110611a7557611a756148fd565b60200101906001600160f81b03191690815f1a905350600101611a3f565b505f5b6004811015611af657611aaa8160036148ea565b611ab590600861463d565b6001901c60f81b82611ac8836002614911565b81518110611ad857611ad86148fd565b60200101906001600160f81b03191690815f1a905350600101611a96565b505f5b6020811015611b5857611b0d81601f6148ea565b611b1890600861463d565b86901c60f81b82611b2a836006614911565b81518110611b3a57611b3a6148fd565b60200101906001600160f81b03191690815f1a905350600101611af9565b505f5b6008811015611bc357611b6f8160076148ea565b611b7a90600861463d565b6001600160401b038616901c60f81b82611b95836026614911565b81518110611ba557611ba56148fd565b60200101906001600160f81b03191690815f1a905350600101611b5b565b505f5b6008811015611c2e57611bda8160076148ea565b611be590600861463d565b6001600160401b038516901c60f81b82611c0083602e614911565b81518110611c1057611c106148fd565b60200101906001600160f81b03191690815f1a905350600101611bc6565b5090505b9392505050565b611c416133b6565b6118ed81613401565b611c52614253565b5f80516020614cee8339815191525f611c6a84611fd0565b90505f80611c7b83604001516129ef565b915091508015611ce05760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ac565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d1257611d12614406565b6005811115611d2357611d23614406565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611daa57611daa614406565b1480611dc85750600182516005811115611dc657611dc6614406565b145b611e275760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ac565b600382516005811115611e3c57611e3c614406565b03611e4957506004611e4d565b5060055b6020808301515f90815260098801909152604081205581816005811115611e7657611e76614406565b90816005811115611e8957611e89614406565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611ebd57611ebd614406565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f8857611f88614406565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610ae96001600160a01b0382168361346d565b60408051606080820183525f8083526020830181905292820152905f80516020614cee8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612045573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261206c9190810190614802565b91509150806120d35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105ac565b82548251146121365760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ac565b60208201516001600160a01b0316156121a95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ac565b509392505050565b5f805f83516036146121d55760405162461bcd60e51b81526004016105ac90614924565b5f805b6002811015612224576121ec8160016148ea565b6121f790600861463d565b61ffff1686828151811061220d5761220d6148fd565b016020015160f81c901b91909117906001016121d8565b5061ffff8116156122475760405162461bcd60e51b81526004016105ac9061496d565b5f805b60048110156122a25761225e8160036148ea565b61226990600861463d565b63ffffffff168761227b836002614911565b8151811061228b5761228b6148fd565b016020015160f81c901b919091179060010161224a565b5063ffffffff81166003146122c95760405162461bcd60e51b81526004016105ac906149b0565b5f805b602081101561231e576122e081601f6148ea565b6122eb90600861463d565b886122f7836006614911565b81518110612307576123076148fd565b016020015160f81c901b91909117906001016122cc565b505f805b600881101561237d576123368160076148ea565b61234190600861463d565b6001600160401b031689612356836026614911565b81518110612366576123666148fd565b016020015160f81c901b9190911790600101612322565b505f805b60088110156123dc576123958160076148ea565b6123a090600861463d565b6001600160401b03168a6123b583602e614911565b815181106123c5576123c56148fd565b016020015160f81c901b9190911790600101612381565b5091989097509095509350505050565b5f8181525f80516020614d2e83398151915260205260408082208151610100810190925280545f80516020614cee83398151915293929190829060ff16600581111561243a5761243a614406565b600581111561244b5761244b614406565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124d3576124d3614406565b1461252f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ac565b60408101516001600160a01b0316336001600160a01b0316146125a95760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105ac565b6125b68160a001516118e3565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156125fa576125fa614406565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126c6846126c081613334565b5f611a1a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126f590859060040161454a565b6020604051808303815f875af1158015612711573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612735919061457c565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020614d0e8339815191528054600119016127bb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614cae833981519152906001600160401b031661280d6040860160208701614392565b6001600160401b0316101561287c5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ac565b600381015461288e6020860186614a06565b61ffff16101580156128b257506127106128ab6020860186614a06565b61ffff1611155b6128ce5760405162461bcd60e51b81526004016105ac90614a21565b80548310156129315760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ac565b80600101548311156129985760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ac565b825f6129a382610aac565b90505f6129b08883613500565b5f818152600586016020526040902090915087906129ce8282614a6c565b509098975050505050505050565b60015f80516020614d0e83398151915255565b5f808251602714612a125760405162461bcd60e51b81526004016105ac90614924565b5f805b6002811015612a6157612a298160016148ea565b612a3490600861463d565b61ffff16858281518110612a4a57612a4a6148fd565b016020015160f81c901b9190911790600101612a15565b5061ffff811615612a845760405162461bcd60e51b81526004016105ac9061496d565b5f805b6004811015612adf57612a9b8160036148ea565b612aa690600861463d565b63ffffffff1686612ab8836002614911565b81518110612ac857612ac86148fd565b016020015160f81c901b9190911790600101612a87565b5063ffffffff8116600214612b065760405162461bcd60e51b81526004016105ac906149b0565b5f805b6020811015612b5b57612b1d81601f6148ea565b612b2890600861463d565b87612b34836006614911565b81518110612b4457612b446148fd565b016020015160f81c901b9190911790600101612b09565b505f86602681518110612b7057612b706148fd565b016020015191976001600160f81b03199092161515965090945050505050565b5f612b9961278a565b5f80516020614cae8339815191525f612bb184610aac565b90505f612bbd87611568565b9050600281516005811115612bd457612bd4614406565b14612c335760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ac565b612c3c82613a3a565b5f828260a00151612c4d9190614654565b60048501546060840151919250612c6f916001600160401b0390911690614ac2565b6001600160401b0316816001600160401b03161115612cee5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ac565b5f80612cfa8a846118f0565b915091505f8a83604051602001612d2892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115612dc357612dc3614406565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050611c3260015f80516020614d0e83398151915255565b5f808251602e14612f255760405162461bcd60e51b81526004016105ac90614924565b5f805b6002811015612f7457612f3c8160016148ea565b612f4790600861463d565b61ffff16858281518110612f5d57612f5d6148fd565b016020015160f81c901b9190911790600101612f28565b5061ffff811615612f975760405162461bcd60e51b81526004016105ac9061496d565b5f805b6004811015612ff257612fae8160036148ea565b612fb990600861463d565b63ffffffff1686612fcb836002614911565b81518110612fdb57612fdb6148fd565b016020015160f81c901b9190911790600101612f9a565b5063ffffffff81166004146130195760405162461bcd60e51b81526004016105ac906149b0565b5f805b602081101561306e5761303081601f6148ea565b61303b90600861463d565b87613047836006614911565b81518110613057576130576148fd565b016020015160f81c901b919091179060010161301c565b505f805b60088110156130cd576130868160076148ea565b61309190600861463d565b6001600160401b0316886130a6836026614911565b815181106130b6576130b66148fd565b016020015160f81c901b9190911790600101613072565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614cee8339815191529142919015806131c05750600283015481516131bc916001600160401b031690614911565b8210155b156131e6576001600160401b038516606082015281815260408101516020820152613205565b84816060018181516131f89190614654565b6001600160401b03169052505b6060810151613215906064614ac2565b602082015160028501546001600160401b0392909216916132409190600160401b900460ff1661463d565b10156132a45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ac565b83156132cd57846001600160401b0316816040018181516132c59190614911565b9052506132ec565b846001600160401b0316816040018181516132e891906148ea565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b5f8181525f80516020614d2e8339815191526020526040812060030180545f80516020614cee833981519152916001600160401b03909116908361337783614aed565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166133ff57604051631afcd79f60e31b815260040160405180910390fd5b565b6134096133b6565b61341281613a45565b6118ed608082013560a083013561342f60e0850160c08601614392565b613440610100860160e08701614a06565b61ffff1661345661012087016101008801614b12565b61346861014088016101208901614b32565b613a66565b804710156134905760405163cd78605960e01b81523060048201526024016105ac565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146134d9576040519150601f19603f3d011682016040523d82523d5f602084013e6134de565b606091505b505090508061155757604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614cee833981519152426135206040860160208701614392565b6001600160401b0316116135925760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ac565b6135a26040850160208601614392565b6001600160401b03166135b86202a30042614911565b1161362b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ac565b83356136835760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105ac565b83355f908152600982016020526040902054156136f35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105ac565b6137006040850185614b4d565b90506030146137675760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105ac565b61377083613a3a565b5f8061380a6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906137b59190614392565b6001600160401b031681526020016137d060408a018a614b4d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613caa565b5f828152600786016020526040902091935091506138288282614bd3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061385590859060040161454a565b6020604051808303815f875af1158015613871573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613895919061457c565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561391757613917614406565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a0c91908e01908e01614392565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6118ed8160016130da565b613a4d6133b6565b613a5561404f565b613a5d61405f565b6118ed81614067565b613a6e6133b6565b5f80516020614cae83398151915283613ada5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ac565b612710841115613afc5760405162461bcd60e51b81526004016105ac90614a21565b85871115613b645760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ac565b5f8360ff1611613bd15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ac565b600a60ff84161115613c435760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ac565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613d145760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ac565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613d8b57613d4b8160016148ea565b613d5690600861463d565b5081515f90839083908110613d6d57613d6d6148fd565b60200101906001600160f81b03191690815f1a905350600101613d37565b505f5b6004811015613de957613da28160036148ea565b613dad90600861463d565b505f82613dbb836002614911565b81518110613dcb57613dcb6148fd565b60200101906001600160f81b03191690815f1a905350600101613d8e565b505f5b6020811015613e465784518160208110613e0857613e086148fd565b1a60f81b82613e18836006614911565b81518110613e2857613e286148fd565b60200101906001600160f81b03191690815f1a905350600101613dec565b505f5b6020811015613ea65784602001518160208110613e6857613e686148fd565b1a60f81b82613e78836026614911565b81518110613e8857613e886148fd565b60200101906001600160f81b03191690815f1a905350600101613e49565b505f5b6008811015613f1a57613ebd8160076148ea565b613ec890600861463d565b60ff1685604001516001600160401b0316901c60f81b82826046613eec9190614911565b81518110613efc57613efc6148fd565b60200101906001600160f81b03191690815f1a905350600101613ea9565b505f5b6030811015613f855784608001518181518110613f3c57613f3c6148fd565b01602001516001600160f81b03191682613f5783604e614911565b81518110613f6757613f676148fd565b60200101906001600160f81b03191690815f1a905350600101613f1d565b505f5b6008811015613ff757613f9c8160076148ea565b613fa790600861463d565b60608601516001600160401b0390811691161c60f81b82613fc983607e614911565b81518110613fd957613fd96148fd565b60200101906001600160f81b03191690815f1a905350600101613f88565b506002816040516140089190614c92565b602060405180830381855afa158015614023573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614046919061457c565b94909350915050565b6140576133b6565b6133ff614214565b6133ff6133b6565b61406f6133b6565b80355f80516020614cee83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146140bb6080840160608501614b12565b60ff1611156141285760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ac565b5f6141396080840160608501614b12565b60ff16116141a15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ac565b6141b16080830160608401614b12565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556141e26060830160408401614392565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6129dc6133b6565b50805461422890614674565b5f825580601f10614237575050565b601f0160209004905f5260205f20908101906118ed9190614297565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156142ab575f8155600101614298565b5090565b80151581146118ed575f80fd5b803563ffffffff811681146142cf575f80fd5b919050565b5f805f606084860312156142e6575f80fd5b8335925060208401356142f8816142af565b9150614306604085016142bc565b90509250925092565b5f6020828403121561431f575f80fd5b5035919050565b5f6101408284031215614337575f80fd5b50919050565b5f6020828403121561434d575f80fd5b611c32826142bc565b5f8060408385031215614367575f80fd5b614370836142bc565b946020939093013593505050565b6001600160401b03811681146118ed575f80fd5b5f602082840312156143a2575f80fd5b8135611c328161437e565b5f8082840360608112156143bf575f80fd5b83356001600160401b038111156143d4575f80fd5b8401606081870312156143e5575f80fd5b92506040601f19820112156143f8575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061443e57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161446660408401826001600160a01b03169052565b50606083015161448160608401826001600160401b03169052565b50608083015161449c60808401826001600160401b03169052565b5060a08301516144b760a08401826001600160401b03169052565b5060c08301516144d260c08401826001600160401b03169052565b5060e08301516144ed60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144ed576144ed6144f4565b5f5b8381101561454257818101518382015260200161452a565b50505f910152565b602081525f8251806020840152614568816040850160208701614528565b601f01601f19169190910160400192915050565b5f6020828403121561458c575f80fd5b5051919050565b5f826145ad57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610abc57610abc6144f4565b6001600160401b038181168382160190808211156144ed576144ed6144f4565b600181811c9082168061468857607f821691505b60208210810361433757634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546146ff81614674565b806020870152604060018084165f8114614720576001811461473c57614769565b60ff19851660408a0152604084151560051b8a01019550614769565b895f5260205f205f5b858110156147605781548b8201860152908301908801614745565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156147ad576147ad614777565b60405290565b604051601f8201601f191681016001600160401b03811182821017156147db576147db614777565b604052919050565b6001600160a01b03811681146118ed575f80fd5b80516142cf816142af565b5f8060408385031215614813575f80fd5b82516001600160401b0380821115614829575f80fd5b908401906060828703121561483c575f80fd5b61484461478b565b82518152602080840151614857816147e3565b8282015260408401518381111561486c575f80fd5b80850194505087601f850112614880575f80fd5b83518381111561489257614892614777565b6148a4601f8201601f191683016147b3565b935080845288828287010111156148b9575f80fd5b6148c881838601848801614528565b508260408301528195506148dd8188016147f7565b9450505050509250929050565b81810381811115610abc57610abc6144f4565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610abc57610abc6144f4565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff811681146118ed575f80fd5b5f60208284031215614a16575f80fd5b8135611c32816149f7565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614a77816149f7565b61ffff8116905081548161ffff1982161783556020840135614a988161437e565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614ae557614ae56144f4565b505092915050565b5f6001600160401b03808316818103614b0857614b086144f4565b6001019392505050565b5f60208284031215614b22575f80fd5b813560ff81168114611c32575f80fd5b5f60208284031215614b42575f80fd5b8135611c32816147e3565b5f808335601e19843603018112614b62575f80fd5b8301803591506001600160401b03821115614b7b575f80fd5b602001915036819003821315611a13575f80fd5b601f82111561155757805f5260205f20601f840160051c81016020851015614bb45750805b601f840160051c820191505b81811015610dc3575f8155600101614bc0565b81516001600160401b03811115614bec57614bec614777565b614c0081614bfa8454614674565b84614b8f565b602080601f831160018114614c33575f8415614c1c5750858301515b5f19600386901b1c1916600185901b178555614c8a565b5f85815260208120601f198616915b82811015614c6157888601518255948401946001909101908401614c42565b5085821015614c7e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614ca3818460208701614528565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 4a8d8d41d..b1af8b3cd 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -238,19 +238,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager newValidatorWeight <= validator.startingWeight * $._maximumStakeMultiplier, "PoSValidatorManager: maximum validator weight reached" ); - _setValidatorWeight(validationID, newValidatorWeight); - // Construct the delegation ID. This is guaranteed to be unique since it is - // constructed using a new nonce. - uint64 nonce = _incrementAndGetNonce(validationID); - bytes32 delegationID = keccak256(abi.encodePacked(validationID, nonce)); + (uint64 nonce, bytes32 messageID) = _setValidatorWeight(validationID, newValidatorWeight); - // Submit the message to the Warp precompile. - bytes32 messageID = WARP_MESSENGER.sendWarpMessage( - ValidatorMessages.packSetSubnetValidatorWeightMessage( - validationID, nonce, newValidatorWeight - ) - ); + bytes32 delegationID = keccak256(abi.encodePacked(validationID, nonce)); // Store the delegation information. Set the delegator status to pending added, // so that it can be properly started in the complete step, even if the delivered @@ -358,25 +349,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // a delegation whose validator has ended validating has no impact on the stake weight of the chain. _checkAndUpdateChurnTrackerRemoval(delegator.weight); - delegator.endingNonce = _incrementAndGetNonce(validationID); - delegator.endedAt = uint64(block.timestamp); - uint64 newValidatorWeight = validator.weight - delegator.weight; - _setValidatorWeight(validationID, newValidatorWeight); - - // Submit the message to the Warp precompile. - bytes32 messageID = WARP_MESSENGER.sendWarpMessage( - ValidatorMessages.packSetSubnetValidatorWeightMessage( - validationID, delegator.endingNonce, newValidatorWeight - ) - ); - - emit ValidatorWeightUpdate({ - validationID: validationID, - nonce: delegator.endingNonce, - validatorWeight: newValidatorWeight, - setWeightMessageID: messageID - }); + (delegator.endingNonce,) = _setValidatorWeight(validationID, newValidatorWeight); + + delegator.endedAt = uint64(block.timestamp); } else { delegator.endingNonce = validator.messageNonce; delegator.endedAt = validator.endedAt; diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 66cf64b92..ddc40eb1c 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -12,6 +12,7 @@ import { ValidatorStatus, Validator, ValidatorChurnPeriod, + ValidatorWeightUpdate, ValidatorRegistrationInput } from "./interfaces/IValidatorManager.sol"; import { @@ -375,9 +376,28 @@ abstract contract ValidatorManager is return warpMessage; } - function _setValidatorWeight(bytes32 validationID, uint64 weight) internal { + function _setValidatorWeight( + bytes32 validationID, + uint64 weight + ) internal returns (uint64, bytes32) { + uint64 nonce = _incrementAndGetNonce(validationID); + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); $._validationPeriods[validationID].weight = weight; + + // Submit the message to the Warp precompile. + bytes32 messageID = WARP_MESSENGER.sendWarpMessage( + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, nonce, weight) + ); + + emit ValidatorWeightUpdate({ + validationID: validationID, + nonce: nonce, + validatorWeight: weight, + setWeightMessageID: messageID + }); + + return (nonce, messageID); } /** diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index d2b990c06..f829f0702 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -88,20 +88,6 @@ interface IPoSValidatorManager is IValidatorManager { bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime ); - /** - * @notice Event emitted when delegator removal is initiated - * @param validationID The ID of the validation period - * @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 - */ - event ValidatorWeightUpdate( - bytes32 indexed validationID, - uint64 indexed nonce, - uint64 validatorWeight, - bytes32 setWeightMessageID - ); - /** * @notice Event emitted when delegator removal is completed * @param delegationID The ID of the delegation diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 3bff36d2f..9fed03f1f 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -32,6 +32,20 @@ struct ValidatorChurnPeriod { uint64 churnAmount; } +/** + * @notice Event emitted when delegator removal is initiated + * @param validationID The ID of the validation period + * @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 + */ +event ValidatorWeightUpdate( + bytes32 indexed validationID, + uint64 indexed nonce, + uint64 validatorWeight, + bytes32 setWeightMessageID +); + struct ValidatorManagerSettings { bytes32 pChainBlockchainID; bytes32 subnetID; From d0ba99e580d22c613a664b1ff764aac58bc730bb Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 10:27:38 -0400 Subject: [PATCH 319/545] Move weight update to validatormanager --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 159 +++++++++++++++++- contracts/staking/PoSValidatorManager.sol | 9 - contracts/staking/ValidatorManager.sol | 28 +-- 5 files changed, 174 insertions(+), 26 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 901f2f996..2be814453 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161524238038061524283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150f58061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f3660046145ff565b610357565b005b61015461016436600461463a565b61071b565b6101a761017736600461463a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e236600461463a565b6108eb565b6040516001600160401b0390911681526020016101b1565b61015461020d366004614665565b610901565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c3660046146a3565b6109e0565b61015461024f3660046146bc565b610a0b565b6101a76102623660046146f8565b610bdb565b6101e761027536600461463a565b610bf4565b6101546102883660046145ff565b610c08565b61015461029b3660046146bc565b610ce8565b6101a76102ae366004614713565b610ef7565b6101a76102c1366004614733565b610f0a565b6101546102d43660046146a3565b610f36565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d36600461463a565b6110f3565b61015461032036600461463a565b611379565b6101c2601481565b61034061033b36600461463a565b61148d565b6040516101b191906147a8565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206150498339815191529184156103a9576103a6828561156c565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db614794565b60048111156103ec576103ec614794565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104688461148d565b905060028251600481111561047f5761047f614794565b146104d15760405162461bcd60e51b815260206004820152602a60248201525f805160206150698339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105365760405162461bcd60e51b815260206004820152603360248201525f805160206150698339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c8565b600382528051600290600581111561055057610550614794565b036105a1576105628260600151611808565b5f82606001518260a001516105779190614896565b90506105838582611815565b506001600160401b0390811660e0850152421660a0840152506105c4565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156105f5576105f5614794565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610709916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206150c983398151915260205260408082208151610100810190925280545f8051602061508983398151915293929190829060ff16600581111561076957610769614794565b600581111561077a5761077a614794565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156107ff576107ff614794565b146108645760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb6108898584608001515f61193f565b6040518263ffffffff1660e01b81526004016108a591906148d8565b6020604051808303815f875af11580156108c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108e5919061490a565b50505050565b5f6108fb64e8d4a5100083614921565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061094a575080546001600160401b03808416911610155b156109685760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109938484611b5c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109ea82611b76565b9050610a0781606001516001600160401b03168260400151611ee9565b5050565b5f805160206150498339815191525f610a2384611f1f565b90505f80610a348360400151612100565b50915091505f610a438361148d565b9050816001600160401b031681608001516001600160401b03161015610a7b5760405162461bcd60e51b81526004016104c890614940565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ac05760405162461bcd60e51b81526004016104c890614982565b60015f87815260068701602052604090205460ff166004811115610ae657610ae6614794565b14610b4f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6108fb6001600160401b03831664e8d4a510006149cb565b5f610bfe8261148d565b60a0015192915050565b5f805160206150498339815191525f610c208561148d565b5f86815260058401602052604090205460c0820151919250610c5291620100009091046001600160401b0316906149e2565b6001600160401b0316421015610cc65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c8565b8315610cd857610cd6858461156c565b505b610ce18561233b565b5050505050565b5f805160206150498339815191525f610d0084611f1f565b90505f80610d118360400151612100565b50915091505f610d208361148d565b9050816001600160401b031681608001516001600160401b03161015610d585760405162461bcd60e51b81526004016104c890614940565b5f8681526006860160205260409020600301546001600160401b0380841691161115610d965760405162461bcd60e51b81526004016104c890614982565b60035f87815260068701602052604090205460ff166004811115610dbc57610dbc614794565b14610e105760405162461bcd60e51b815260206004820152603160248201525f805160206150698339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610eb591611ee9565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610f038333846126d9565b9392505050565b5f610f13612a4e565b610f1e848484612a85565b9050610f0360015f805160206150a983398151915255565b5f805160206150898339815191525f610f4e83611f1f565b90505f80610f5f8360400151612cbe565b9150915080610fc15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c8565b5f82815260078501602052604081208054610fdb90614a02565b905011801561100d575060015f83815260088601602052604090205460ff16600581111561100b5761100b614794565b145b6110295760405162461bcd60e51b81526004016104c890614a3a565b5f828152600785016020526040812061104191614547565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061504983398151915293929190829060ff16600481111561115457611154614794565b600481111561116557611165614794565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156111ec576111ec614794565b148061120a575060038151600481111561120857611208614794565b145b61125e5760405162461bcd60e51b815260206004820152603260248201525f80516020615069833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c8565b5f61126c826040015161148d565b905080608001516001600160401b03165f036112f05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb61131d846040015184608001518560a0015161193f565b6040518263ffffffff1660e01b815260040161133991906148d8565b6020604051808303815f875af1158015611355573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce1919061490a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150898339815191529291906113c190614a02565b90501180156113f3575060015f83815260088301602052604090205460ff1660058111156113f1576113f1614794565b145b61140f5760405162461bcd60e51b81526004016104c890614a3a565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916114489190600401614a81565b6020604051808303815f875af1158015611464573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611488919061490a565b505050565b61149561457e565b5f8281525f805160206150c98339815191526020526040908190208151610100810190925280545f80516020615089833981519152929190829060ff1660058111156114e3576114e3614794565b60058111156114f4576114f4614794565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115b7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115de9190810190614b82565b91509150806116415760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611684573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116a8919061490a565b82511461170c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c8565b60208201516001600160a01b0316156117825760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c8565b5f806117918460400151612e5f565b915091508187146117fe5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c8565b9695505050505050565b611812815f613037565b50565b5f805f61182185613291565b5f8681525f805160206150c983398151915260205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038916021790559091505f80516020615089833981519152906005600160991b0163ee5b48eb61188a89868a61193f565b6040518263ffffffff1660e01b81526004016118a691906148d8565b6020604051808303815f875af11580156118c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118e6919061490a565b604080516001600160401b0389811682526020820184905282519394508616928a927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3919350909150505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119b857611978816001614c6a565b6119839060086149cb565b5081515f9083908390811061199a5761199a614c7d565b60200101906001600160f81b03191690815f1a905350600101611964565b505f5b6004811015611a1b576119cf816003614c6a565b6119da9060086149cb565b6001901c60f81b826119ed836002614c91565b815181106119fd576119fd614c7d565b60200101906001600160f81b03191690815f1a9053506001016119bb565b505f5b6020811015611a7d57611a3281601f614c6a565b611a3d9060086149cb565b86901c60f81b82611a4f836006614c91565b81518110611a5f57611a5f614c7d565b60200101906001600160f81b03191690815f1a905350600101611a1e565b505f5b6008811015611ae857611a94816007614c6a565b611a9f9060086149cb565b6001600160401b038616901c60f81b82611aba836026614c91565b81518110611aca57611aca614c7d565b60200101906001600160f81b03191690815f1a905350600101611a80565b505f5b6008811015611b5357611aff816007614c6a565b611b0a9060086149cb565b6001600160401b038516901c60f81b82611b2583602e614c91565b81518110611b3557611b35614c7d565b60200101906001600160f81b03191690815f1a905350600101611aeb565b50949350505050565b611b64613313565b611b6d8261335e565b610a07816133ca565b611b7e61457e565b5f805160206150898339815191525f611b9684611f1f565b90505f80611ba78360400151612cbe565b915091508015611c0c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611c3e57611c3e614794565b6005811115611c4f57611c4f614794565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611cd657611cd6614794565b1480611cf45750600182516005811115611cf257611cf2614794565b145b611d535760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c8565b600382516005811115611d6857611d68614794565b03611d7557506004611d79565b5060055b6020808301515f90815260098801909152604081205581816005811115611da257611da2614794565b90816005811115611db557611db5614794565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611de957611de9614794565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611eb457611eb4614794565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054610a07906001600160a01b0316828461347e565b60408051606080820183525f8083526020830181905292820152905f805160206150898339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f94573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fbb9190810190614b82565b91509150806120225760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c8565b82548251146120855760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c8565b60208201516001600160a01b0316156120f85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c8565b509392505050565b5f805f83516036146121245760405162461bcd60e51b81526004016104c890614ca4565b5f805b60028110156121735761213b816001614c6a565b6121469060086149cb565b61ffff1686828151811061215c5761215c614c7d565b016020015160f81c901b9190911790600101612127565b5061ffff8116156121965760405162461bcd60e51b81526004016104c890614ced565b5f805b60048110156121f1576121ad816003614c6a565b6121b89060086149cb565b63ffffffff16876121ca836002614c91565b815181106121da576121da614c7d565b016020015160f81c901b9190911790600101612199565b5063ffffffff81166003146122185760405162461bcd60e51b81526004016104c890614d30565b5f805b602081101561226d5761222f81601f614c6a565b61223a9060086149cb565b88612246836006614c91565b8151811061225657612256614c7d565b016020015160f81c901b919091179060010161221b565b505f805b60088110156122cc57612285816007614c6a565b6122909060086149cb565b6001600160401b0316896122a5836026614c91565b815181106122b5576122b5614c7d565b016020015160f81c901b9190911790600101612271565b505f805b600881101561232b576122e4816007614c6a565b6122ef9060086149cb565b6001600160401b03168a61230483602e614c91565b8151811061231457612314614c7d565b016020015160f81c901b91909117906001016122d0565b5091989097509095509350505050565b5f8181525f805160206150c983398151915260205260408082208151610100810190925280545f8051602061508983398151915293929190829060ff16600581111561238957612389614794565b600581111561239a5761239a614794565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561242257612422614794565b1461247e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c8565b60408101516001600160a01b0316336001600160a01b0316146124f85760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c8565b6125058160a00151611808565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561254957612549614794565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126158461260f81613291565b5f61193f565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126449085906004016148d8565b6020604051808303815f875af1158015612660573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612684919061490a565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f6126e2612a4e565b5f805160206150498339815191525f6126fd6101e2856134dd565b90505f6127098761148d565b905060028151600581111561272057612720614794565b1461277f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c8565b61278882613513565b5f828260a0015161279991906149e2565b600485015460608401519192506127bb916001600160401b0390911690614d77565b6001600160401b0316816001600160401b0316111561283a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c8565b5f806128468a84611815565b915091505f8a8360405160200161287492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561290f5761290f614794565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050610f0360015f805160206150a983398151915255565b5f805160206150a9833981519152805460011901612a7f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615049833981519152906001600160401b0316612ad160408601602087016146f8565b6001600160401b03161015612b405760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c8565b6003810154612b526020860186614db1565b61ffff1610158015612b765750612710612b6f6020860186614db1565b61ffff1611155b612b925760405162461bcd60e51b81526004016104c890614dcc565b8054831015612bf55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c8565b8060010154831115612c5c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c8565b5f612c66846134dd565b90505f612c72826108eb565b90505f612c7f888361351e565b5f81815260058601602052604090209091508790612c9d8282614e17565b509098975050505050505050565b60015f805160206150a983398151915255565b5f808251602714612ce15760405162461bcd60e51b81526004016104c890614ca4565b5f805b6002811015612d3057612cf8816001614c6a565b612d039060086149cb565b61ffff16858281518110612d1957612d19614c7d565b016020015160f81c901b9190911790600101612ce4565b5061ffff811615612d535760405162461bcd60e51b81526004016104c890614ced565b5f805b6004811015612dae57612d6a816003614c6a565b612d759060086149cb565b63ffffffff1686612d87836002614c91565b81518110612d9757612d97614c7d565b016020015160f81c901b9190911790600101612d56565b5063ffffffff8116600214612dd55760405162461bcd60e51b81526004016104c890614d30565b5f805b6020811015612e2a57612dec81601f614c6a565b612df79060086149cb565b87612e03836006614c91565b81518110612e1357612e13614c7d565b016020015160f81c901b9190911790600101612dd8565b505f86602681518110612e3f57612e3f614c7d565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e825760405162461bcd60e51b81526004016104c890614ca4565b5f805b6002811015612ed157612e99816001614c6a565b612ea49060086149cb565b61ffff16858281518110612eba57612eba614c7d565b016020015160f81c901b9190911790600101612e85565b5061ffff811615612ef45760405162461bcd60e51b81526004016104c890614ced565b5f805b6004811015612f4f57612f0b816003614c6a565b612f169060086149cb565b63ffffffff1686612f28836002614c91565b81518110612f3857612f38614c7d565b016020015160f81c901b9190911790600101612ef7565b5063ffffffff8116600414612f765760405162461bcd60e51b81526004016104c890614d30565b5f805b6020811015612fcb57612f8d81601f614c6a565b612f989060086149cb565b87612fa4836006614c91565b81518110612fb457612fb4614c7d565b016020015160f81c901b9190911790600101612f79565b505f805b600881101561302a57612fe3816007614c6a565b612fee9060086149cb565b6001600160401b031688613003836026614c91565b8151811061301357613013614c7d565b016020015160f81c901b9190911790600101612fcf565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061508983398151915291429190158061311d575060028301548151613119916001600160401b031690614c91565b8210155b15613143576001600160401b038516606082015281815260408101516020820152613162565b848160600181815161315591906149e2565b6001600160401b03169052505b6060810151613172906064614d77565b602082015160028501546001600160401b03929092169161319d9190600160401b900460ff166149cb565b10156132015760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c8565b831561322a57846001600160401b0316816040018181516132229190614c91565b905250613249565b846001600160401b0316816040018181516132459190614c6a565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b5f8181525f805160206150c98339815191526020526040812060030180545f80516020615089833981519152916001600160401b0390911690836132d483614e6d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661335c57604051631afcd79f60e31b815260040160405180910390fd5b565b613366613313565b61336f81613a58565b611812608082013560a083013561338c60e0850160c086016146f8565b61339d610100860160e08701614db1565b61ffff166133b361012087016101008801614e92565b6133c561014088016101208901614eb2565b613a79565b6133d2613313565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661345e5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261148891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613cbd565b5f6108fb827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613d1e565b611812816001613037565b5f5f805160206150898339815191524261353e60408601602087016146f8565b6001600160401b0316116135b05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c8565b6135c060408501602086016146f8565b6001600160401b03166135d66202a30042614c91565b116136495760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c8565b83356136a15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c8565b83355f908152600982016020526040902054156137115760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c8565b61371e6040850185614ecd565b90506030146137855760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c8565b61378e83613513565b5f806138286040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906137d391906146f8565b6001600160401b031681526020016137ee60408a018a614ecd565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613e80565b5f828152600786016020526040902091935091506138468282614f53565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906138739085906004016148d8565b6020604051808303815f875af115801561388f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138b3919061490a565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561393557613935614794565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a2a91908e01908e016146f8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b613a60613313565b613a68614225565b613a70614235565b6118128161423d565b613a81613313565b5f8051602061504983398151915283613aed5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c8565b612710841115613b0f5760405162461bcd60e51b81526004016104c890614dcc565b85871115613b775760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c8565b5f8360ff1611613be45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c8565b600a60ff84161115613c565760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c8565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613cd16001600160a01b038416836143ea565b905080515f14158015613cf5575080806020019051810190613cf39190615012565b155b1561148857604051635274afe760e01b81526001600160a01b03841660048201526024016104c8565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613d64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d88919061490a565b9050613d9f6001600160a01b0385163330866143f7565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613de3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e07919061490a565b9050818111613e6d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c8565b613e778282614c6a565b95945050505050565b5f6060826080015151603014613eea5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613f6157613f21816001614c6a565b613f2c9060086149cb565b5081515f90839083908110613f4357613f43614c7d565b60200101906001600160f81b03191690815f1a905350600101613f0d565b505f5b6004811015613fbf57613f78816003614c6a565b613f839060086149cb565b505f82613f91836002614c91565b81518110613fa157613fa1614c7d565b60200101906001600160f81b03191690815f1a905350600101613f64565b505f5b602081101561401c5784518160208110613fde57613fde614c7d565b1a60f81b82613fee836006614c91565b81518110613ffe57613ffe614c7d565b60200101906001600160f81b03191690815f1a905350600101613fc2565b505f5b602081101561407c578460200151816020811061403e5761403e614c7d565b1a60f81b8261404e836026614c91565b8151811061405e5761405e614c7d565b60200101906001600160f81b03191690815f1a90535060010161401f565b505f5b60088110156140f057614093816007614c6a565b61409e9060086149cb565b60ff1685604001516001600160401b0316901c60f81b828260466140c29190614c91565b815181106140d2576140d2614c7d565b60200101906001600160f81b03191690815f1a90535060010161407f565b505f5b603081101561415b578460800151818151811061411257614112614c7d565b01602001516001600160f81b0319168261412d83604e614c91565b8151811061413d5761413d614c7d565b60200101906001600160f81b03191690815f1a9053506001016140f3565b505f5b60088110156141cd57614172816007614c6a565b61417d9060086149cb565b60608601516001600160401b0390811691161c60f81b8261419f83607e614c91565b815181106141af576141af614c7d565b60200101906001600160f81b03191690815f1a90535060010161415e565b506002816040516141de919061502d565b602060405180830381855afa1580156141f9573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061421c919061490a565b94909350915050565b61422d613313565b61335c614430565b61335c613313565b614245613313565b80355f8051602061508983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146142916080840160608501614e92565b60ff1611156142fe5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c8565b5f61430f6080840160608501614e92565b60ff16116143775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c8565b6143876080830160608401614e92565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556143b860608301604084016146f8565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610f0383835f614438565b6040516001600160a01b0384811660248301528381166044830152606482018390526108e59186918216906323b872dd906084016134ab565b612cab613313565b60608147101561445d5760405163cd78605960e01b81523060048201526024016104c8565b5f80856001600160a01b03168486604051614478919061502d565b5f6040518083038185875af1925050503d805f81146144b2576040519150601f19603f3d011682016040523d82523d5f602084013e6144b7565b606091505b50915091506117fe8683836060826144d7576144d28261451e565b610f03565b81511580156144ee57506001600160a01b0384163b155b1561451757604051639996b31560e01b81526001600160a01b03851660048201526024016104c8565b5080610f03565b80511561452e5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461455390614a02565b5f825580601f10614562575050565b601f0160209004905f5260205f209081019061181291906145c2565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156145d6575f81556001016145c3565b5090565b8015158114611812575f80fd5b803563ffffffff811681146145fa575f80fd5b919050565b5f805f60608486031215614611575f80fd5b833592506020840135614623816145da565b9150614631604085016145e7565b90509250925092565b5f6020828403121561464a575f80fd5b5035919050565b6001600160a01b0381168114611812575f80fd5b5f80828403610160811215614678575f80fd5b61014080821215614687575f80fd5b849350830135905061469881614651565b809150509250929050565b5f602082840312156146b3575f80fd5b610f03826145e7565b5f80604083850312156146cd575f80fd5b6146d6836145e7565b946020939093013593505050565b6001600160401b0381168114611812575f80fd5b5f60208284031215614708575f80fd5b8135610f03816146e4565b5f8060408385031215614724575f80fd5b50508035926020909101359150565b5f805f8385036080811215614746575f80fd5b84356001600160401b0381111561475b575f80fd5b85016060818803121561476c575f80fd5b93506040601f198201121561477f575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106147cc57634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516147f460408401826001600160a01b03169052565b50606083015161480f60608401826001600160401b03169052565b50608083015161482a60808401826001600160401b03169052565b5060a083015161484560a08401826001600160401b03169052565b5060c083015161486060c08401826001600160401b03169052565b5060e083015161487b60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561487b5761487b614882565b5f5b838110156148d05781810151838201526020016148b8565b50505f910152565b602081525f82518060208401526148f68160408501602087016148b6565b601f01601f19169190910160400192915050565b5f6020828403121561491a575f80fd5b5051919050565b5f8261493b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176108fb576108fb614882565b6001600160401b0381811683821601908082111561487b5761487b614882565b600181811c90821680614a1657607f821691505b602082108103614a3457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a9381614a02565b806020870152604060018084165f8114614ab45760018114614ad057614afd565b60ff19851660408a0152604084151560051b8a01019550614afd565b895f5260205f205f5b85811015614af45781548b8201860152908301908801614ad9565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b4157614b41614b0b565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b6f57614b6f614b0b565b604052919050565b80516145fa816145da565b5f8060408385031215614b93575f80fd5b82516001600160401b0380821115614ba9575f80fd5b9084019060608287031215614bbc575f80fd5b614bc4614b1f565b82518152602080840151614bd781614651565b82820152604084015183811115614bec575f80fd5b80850194505087601f850112614c00575f80fd5b835183811115614c1257614c12614b0b565b614c24601f8201601f19168301614b47565b93508084528882828701011115614c39575f80fd5b614c48818386018488016148b6565b50826040830152819550614c5d818801614b77565b9450505050509250929050565b818103818111156108fb576108fb614882565b634e487b7160e01b5f52603260045260245ffd5b808201808211156108fb576108fb614882565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614d9a57614d9a614882565b505092915050565b61ffff81168114611812575f80fd5b5f60208284031215614dc1575f80fd5b8135610f0381614da2565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614e2281614da2565b61ffff8116905081548161ffff1982161783556020840135614e43816146e4565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6001600160401b03808316818103614e8857614e88614882565b6001019392505050565b5f60208284031215614ea2575f80fd5b813560ff81168114610f03575f80fd5b5f60208284031215614ec2575f80fd5b8135610f0381614651565b5f808335601e19843603018112614ee2575f80fd5b8301803591506001600160401b03821115614efb575f80fd5b602001915036819003821315611938575f80fd5b601f82111561148857805f5260205f20601f840160051c81016020851015614f345750805b601f840160051c820191505b81811015610ce1575f8155600101614f40565b81516001600160401b03811115614f6c57614f6c614b0b565b614f8081614f7a8454614a02565b84614f0f565b602080601f831160018114614fb3575f8415614f9c5750858301515b5f19600386901b1c1916600185901b17855561500a565b5f85815260208120601f198616915b82811015614fe157888601518255948401946001909101908401614fc2565b5085821015614ffe57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615022575f80fd5b8151610f03816145da565b5f825161503e8184602087016148b6565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516151fe3803806151fe83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150b18061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f3660046145bb565b610357565b005b6101546101643660046145f6565b61070e565b6101a76101773660046145f6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e23660046145f6565b6108de565b6040516001600160401b0390911681526020016101b1565b61015461020d366004614621565b6108f4565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c36600461465f565b6109d3565b61015461024f366004614678565b6109fe565b6101a76102623660046146b4565b610bce565b6101e76102753660046145f6565b610be7565b6101546102883660046145bb565b610bfb565b61015461029b366004614678565b610cdb565b6101a76102ae3660046146cf565b610eea565b6101a76102c13660046146ef565b610efd565b6101546102d436600461465f565b610f29565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d3660046145f6565b6110e6565b6101546103203660046145f6565b61136c565b6101c2601481565b61034061033b3660046145f6565b611480565b6040516101b19190614764565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206150058339815191529184156103a9576103a6828561155f565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db614750565b60048111156103ec576103ec614750565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61046884611480565b905060028251600481111561047f5761047f614750565b146104d15760405162461bcd60e51b815260206004820152602a60248201525f805160206150258339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105365760405162461bcd60e51b815260206004820152603360248201525f805160206150258339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c8565b600382528051600290600581111561055057610550614750565b03610594575f82606001518260a0015161056a9190614852565b905061057685826117fb565b506001600160401b0390811660e0850152421660a0840152506105b7565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156105e8576105e8614750565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916106fc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061508583398151915260205260408082208151610100810190925280545f8051602061504583398151915293929190829060ff16600581111561075c5761075c614750565b600581111561076d5761076d614750565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156107f2576107f2614750565b146108575760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb61087c8584608001515f61197c565b6040518263ffffffff1660e01b81526004016108989190614894565b6020604051808303815f875af11580156108b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108d891906148c6565b50505050565b5f6108ee64e8d4a51000836148dd565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061093d575080546001600160401b03808416911610155b1561095b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109868484611b99565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109dd82611bb3565b90506109fa81606001516001600160401b03168260400151611f26565b5050565b5f805160206150058339815191525f610a1684611f5c565b90505f80610a27836040015161213d565b50915091505f610a3683611480565b9050816001600160401b031681608001516001600160401b03161015610a6e5760405162461bcd60e51b81526004016104c8906148fc565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ab35760405162461bcd60e51b81526004016104c89061493e565b60015f87815260068701602052604090205460ff166004811115610ad957610ad9614750565b14610b425760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6108ee6001600160401b03831664e8d4a51000614987565b5f610bf182611480565b60a0015192915050565b5f805160206150058339815191525f610c1385611480565b5f86815260058401602052604090205460c0820151919250610c4591620100009091046001600160401b03169061499e565b6001600160401b0316421015610cb95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c8565b8315610ccb57610cc9858461155f565b505b610cd485612378565b5050505050565b5f805160206150058339815191525f610cf384611f5c565b90505f80610d04836040015161213d565b50915091505f610d1383611480565b9050816001600160401b031681608001516001600160401b03161015610d4b5760405162461bcd60e51b81526004016104c8906148fc565b5f8681526006860160205260409020600301546001600160401b0380841691161115610d895760405162461bcd60e51b81526004016104c89061493e565b60035f87815260068701602052604090205460ff166004811115610daf57610daf614750565b14610e035760405162461bcd60e51b815260206004820152603160248201525f805160206150258339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610ea891611f26565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610ef6833384612691565b9392505050565b5f610f066129fd565b610f11848484612a34565b9050610ef660015f8051602061506583398151915255565b5f805160206150458339815191525f610f4183611f5c565b90505f80610f528360400151612c6d565b9150915080610fb45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c8565b5f82815260078501602052604081208054610fce906149be565b9050118015611000575060015f83815260088601602052604090205460ff166005811115610ffe57610ffe614750565b145b61101c5760405162461bcd60e51b81526004016104c8906149f6565b5f828152600785016020526040812061103491614503565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061500583398151915293929190829060ff16600481111561114757611147614750565b600481111561115857611158614750565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156111df576111df614750565b14806111fd57506003815160048111156111fb576111fb614750565b145b6112515760405162461bcd60e51b815260206004820152603260248201525f80516020615025833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c8565b5f61125f8260400151611480565b905080608001516001600160401b03165f036112e35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb611310846040015184608001518560a0015161197c565b6040518263ffffffff1660e01b815260040161132c9190614894565b6020604051808303815f875af1158015611348573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd491906148c6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150458339815191529291906113b4906149be565b90501180156113e6575060015f83815260088301602052604090205460ff1660058111156113e4576113e4614750565b145b6114025760405162461bcd60e51b81526004016104c8906149f6565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161143b9190600401614a3d565b6020604051808303815f875af1158015611457573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147b91906148c6565b505050565b61148861453a565b5f8281525f805160206150858339815191526020526040908190208151610100810190925280545f80516020615045833981519152929190829060ff1660058111156114d6576114d6614750565b60058111156114e7576114e7614750565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115d19190810190614b3e565b91509150806116345760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169b91906148c6565b8251146116ff5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c8565b60208201516001600160a01b0316156117755760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c8565b5f806117848460400151612e0e565b915091508187146117f15760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c8565b9695505050505050565b5f8281525f80516020615085833981519152602052604081206003015481905f8051602061504583398151915290600160401b90046001600160401b03908116908516811161185b576118566118518287614852565b612fe6565b61186d565b61186d6118688683614852565b612ff4565b5f61187787612ffe565b5f8881526008850160205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6118c78a858b61197c565b6040518263ffffffff1660e01b81526004016118e39190614894565b6020604051808303815f875af11580156118ff573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061192391906148c6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119f5576119b5816001614c26565b6119c0906008614987565b5081515f908390839081106119d7576119d7614c39565b60200101906001600160f81b03191690815f1a9053506001016119a1565b505f5b6004811015611a5857611a0c816003614c26565b611a17906008614987565b6001901c60f81b82611a2a836002614c4d565b81518110611a3a57611a3a614c39565b60200101906001600160f81b03191690815f1a9053506001016119f8565b505f5b6020811015611aba57611a6f81601f614c26565b611a7a906008614987565b86901c60f81b82611a8c836006614c4d565b81518110611a9c57611a9c614c39565b60200101906001600160f81b03191690815f1a905350600101611a5b565b505f5b6008811015611b2557611ad1816007614c26565b611adc906008614987565b6001600160401b038616901c60f81b82611af7836026614c4d565b81518110611b0757611b07614c39565b60200101906001600160f81b03191690815f1a905350600101611abd565b505f5b6008811015611b9057611b3c816007614c26565b611b47906008614987565b6001600160401b038516901c60f81b82611b6283602e614c4d565b81518110611b7257611b72614c39565b60200101906001600160f81b03191690815f1a905350600101611b28565b50949350505050565b611ba1613080565b611baa826130cb565b6109fa81613137565b611bbb61453a565b5f805160206150458339815191525f611bd384611f5c565b90505f80611be48360400151612c6d565b915091508015611c495760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611c7b57611c7b614750565b6005811115611c8c57611c8c614750565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d1357611d13614750565b1480611d315750600182516005811115611d2f57611d2f614750565b145b611d905760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c8565b600382516005811115611da557611da5614750565b03611db257506004611db6565b5060055b6020808301515f90815260098801909152604081205581816005811115611ddf57611ddf614750565b90816005811115611df257611df2614750565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611e2657611e26614750565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ef157611ef1614750565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546109fa906001600160a01b031682846131eb565b60408051606080820183525f8083526020830181905292820152905f805160206150458339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fd1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ff89190810190614b3e565b915091508061205f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c8565b82548251146120c25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c8565b60208201516001600160a01b0316156121355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c8565b509392505050565b5f805f83516036146121615760405162461bcd60e51b81526004016104c890614c60565b5f805b60028110156121b057612178816001614c26565b612183906008614987565b61ffff1686828151811061219957612199614c39565b016020015160f81c901b9190911790600101612164565b5061ffff8116156121d35760405162461bcd60e51b81526004016104c890614ca9565b5f805b600481101561222e576121ea816003614c26565b6121f5906008614987565b63ffffffff1687612207836002614c4d565b8151811061221757612217614c39565b016020015160f81c901b91909117906001016121d6565b5063ffffffff81166003146122555760405162461bcd60e51b81526004016104c890614cec565b5f805b60208110156122aa5761226c81601f614c26565b612277906008614987565b88612283836006614c4d565b8151811061229357612293614c39565b016020015160f81c901b9190911790600101612258565b505f805b6008811015612309576122c2816007614c26565b6122cd906008614987565b6001600160401b0316896122e2836026614c4d565b815181106122f2576122f2614c39565b016020015160f81c901b91909117906001016122ae565b505f805b600881101561236857612321816007614c26565b61232c906008614987565b6001600160401b03168a61234183602e614c4d565b8151811061235157612351614c39565b016020015160f81c901b919091179060010161230d565b5091989097509095509350505050565b5f8181525f8051602061508583398151915260205260408082208151610100810190925280545f8051602061504583398151915293929190829060ff1660058111156123c6576123c6614750565b60058111156123d7576123d7614750565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561245f5761245f614750565b146124bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c8565b60408101516001600160a01b0316336001600160a01b0316146125355760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c8565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561257957612579614750565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61263c84826117fb565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f61269a6129fd565b5f805160206150058339815191525f6126b56101e28561324a565b90505f6126c187611480565b90506002815160058111156126d8576126d8614750565b146127375760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c8565b5f828260a00151612748919061499e565b6004850154606084015191925061276a916001600160401b0390911690614d33565b6001600160401b0316816001600160401b031611156127e95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c8565b5f806127f58a846117fb565b915091505f8a8360405160200161282392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156128be576128be614750565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050610ef660015f8051602061506583398151915255565b5f80516020615065833981519152805460011901612a2e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615005833981519152906001600160401b0316612a8060408601602087016146b4565b6001600160401b03161015612aef5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c8565b6003810154612b016020860186614d6d565b61ffff1610158015612b255750612710612b1e6020860186614d6d565b61ffff1611155b612b415760405162461bcd60e51b81526004016104c890614d88565b8054831015612ba45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c8565b8060010154831115612c0b5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c8565b5f612c158461324a565b90505f612c21826108de565b90505f612c2e8883613280565b5f81815260058601602052604090209091508790612c4c8282614dd3565b509098975050505050505050565b60015f8051602061506583398151915255565b5f808251602714612c905760405162461bcd60e51b81526004016104c890614c60565b5f805b6002811015612cdf57612ca7816001614c26565b612cb2906008614987565b61ffff16858281518110612cc857612cc8614c39565b016020015160f81c901b9190911790600101612c93565b5061ffff811615612d025760405162461bcd60e51b81526004016104c890614ca9565b5f805b6004811015612d5d57612d19816003614c26565b612d24906008614987565b63ffffffff1686612d36836002614c4d565b81518110612d4657612d46614c39565b016020015160f81c901b9190911790600101612d05565b5063ffffffff8116600214612d845760405162461bcd60e51b81526004016104c890614cec565b5f805b6020811015612dd957612d9b81601f614c26565b612da6906008614987565b87612db2836006614c4d565b81518110612dc257612dc2614c39565b016020015160f81c901b9190911790600101612d87565b505f86602681518110612dee57612dee614c39565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e315760405162461bcd60e51b81526004016104c890614c60565b5f805b6002811015612e8057612e48816001614c26565b612e53906008614987565b61ffff16858281518110612e6957612e69614c39565b016020015160f81c901b9190911790600101612e34565b5061ffff811615612ea35760405162461bcd60e51b81526004016104c890614ca9565b5f805b6004811015612efe57612eba816003614c26565b612ec5906008614987565b63ffffffff1686612ed7836002614c4d565b81518110612ee757612ee7614c39565b016020015160f81c901b9190911790600101612ea6565b5063ffffffff8116600414612f255760405162461bcd60e51b81526004016104c890614cec565b5f805b6020811015612f7a57612f3c81601f614c26565b612f47906008614987565b87612f53836006614c4d565b81518110612f6357612f63614c39565b016020015160f81c901b9190911790600101612f28565b505f805b6008811015612fd957612f92816007614c26565b612f9d906008614987565b6001600160401b031688612fb2836026614c4d565b81518110612fc257612fc2614c39565b016020015160f81c901b9190911790600101612f7e565b5090969095509350505050565b612ff18160016137ba565b50565b612ff1815f6137ba565b5f8181525f805160206150858339815191526020526040812060030180545f80516020615045833981519152916001600160401b03909116908361304183614e29565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130c957604051631afcd79f60e31b815260040160405180910390fd5b565b6130d3613080565b6130dc81613a14565b612ff1608082013560a08301356130f960e0850160c086016146b4565b61310a610100860160e08701614d6d565b61ffff1661312061012087016101008801614e4e565b61313261014088016101208901614e6e565b613a35565b61313f613080565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131cb5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261147b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613c79565b5f6108ee827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613cda565b5f5f80516020615045833981519152426132a060408601602087016146b4565b6001600160401b0316116133125760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c8565b61332260408501602086016146b4565b6001600160401b03166133386202a30042614c4d565b116133ab5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c8565b83356134035760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c8565b83355f908152600982016020526040902054156134735760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c8565b6134806040850185614e89565b90506030146134e75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c8565b6134f083612fe6565b5f8061358a6040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061353591906146b4565b6001600160401b0316815260200161355060408a018a614e89565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613e3c565b5f828152600786016020526040902091935091506135a88282614f0f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906135d5908590600401614894565b6020604051808303815f875af11580156135f1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061361591906148c6565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561369757613697614750565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161378c91908e01908e016146b4565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206150458339815191529142919015806138a057506002830154815161389c916001600160401b031690614c4d565b8210155b156138c6576001600160401b0385166060820152818152604081015160208201526138e5565b84816060018181516138d8919061499e565b6001600160401b03169052505b60608101516138f5906064614d33565b602082015160028501546001600160401b0392909216916139209190600160401b900460ff16614987565b10156139845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c8565b83156139ad57846001600160401b0316816040018181516139a59190614c4d565b9052506139cc565b846001600160401b0316816040018181516139c89190614c26565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b613a1c613080565b613a246141e1565b613a2c6141f1565b612ff1816141f9565b613a3d613080565b5f8051602061500583398151915283613aa95760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c8565b612710841115613acb5760405162461bcd60e51b81526004016104c890614d88565b85871115613b335760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c8565b5f8360ff1611613ba05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c8565b600a60ff84161115613c125760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c8565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613c8d6001600160a01b038416836143a6565b905080515f14158015613cb1575080806020019051810190613caf9190614fce565b155b1561147b57604051635274afe760e01b81526001600160a01b03841660048201526024016104c8565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613d20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d4491906148c6565b9050613d5b6001600160a01b0385163330866143b3565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613d9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dc391906148c6565b9050818111613e295760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c8565b613e338282614c26565b95945050505050565b5f6060826080015151603014613ea65760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613f1d57613edd816001614c26565b613ee8906008614987565b5081515f90839083908110613eff57613eff614c39565b60200101906001600160f81b03191690815f1a905350600101613ec9565b505f5b6004811015613f7b57613f34816003614c26565b613f3f906008614987565b505f82613f4d836002614c4d565b81518110613f5d57613f5d614c39565b60200101906001600160f81b03191690815f1a905350600101613f20565b505f5b6020811015613fd85784518160208110613f9a57613f9a614c39565b1a60f81b82613faa836006614c4d565b81518110613fba57613fba614c39565b60200101906001600160f81b03191690815f1a905350600101613f7e565b505f5b60208110156140385784602001518160208110613ffa57613ffa614c39565b1a60f81b8261400a836026614c4d565b8151811061401a5761401a614c39565b60200101906001600160f81b03191690815f1a905350600101613fdb565b505f5b60088110156140ac5761404f816007614c26565b61405a906008614987565b60ff1685604001516001600160401b0316901c60f81b8282604661407e9190614c4d565b8151811061408e5761408e614c39565b60200101906001600160f81b03191690815f1a90535060010161403b565b505f5b603081101561411757846080015181815181106140ce576140ce614c39565b01602001516001600160f81b031916826140e983604e614c4d565b815181106140f9576140f9614c39565b60200101906001600160f81b03191690815f1a9053506001016140af565b505f5b60088110156141895761412e816007614c26565b614139906008614987565b60608601516001600160401b0390811691161c60f81b8261415b83607e614c4d565b8151811061416b5761416b614c39565b60200101906001600160f81b03191690815f1a90535060010161411a565b5060028160405161419a9190614fe9565b602060405180830381855afa1580156141b5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906141d891906148c6565b94909350915050565b6141e9613080565b6130c96143ec565b6130c9613080565b614201613080565b80355f8051602061504583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461424d6080840160608501614e4e565b60ff1611156142ba5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c8565b5f6142cb6080840160608501614e4e565b60ff16116143335760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c8565b6143436080830160608401614e4e565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561437460608301604084016146b4565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610ef683835f6143f4565b6040516001600160a01b0384811660248301528381166044830152606482018390526108d89186918216906323b872dd90608401613218565b612c5a613080565b6060814710156144195760405163cd78605960e01b81523060048201526024016104c8565b5f80856001600160a01b031684866040516144349190614fe9565b5f6040518083038185875af1925050503d805f811461446e576040519150601f19603f3d011682016040523d82523d5f602084013e614473565b606091505b50915091506117f18683836060826144935761448e826144da565b610ef6565b81511580156144aa57506001600160a01b0384163b155b156144d357604051639996b31560e01b81526001600160a01b03851660048201526024016104c8565b5080610ef6565b8051156144ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461450f906149be565b5f825580601f1061451e575050565b601f0160209004905f5260205f2090810190612ff1919061457e565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614592575f815560010161457f565b5090565b8015158114612ff1575f80fd5b803563ffffffff811681146145b6575f80fd5b919050565b5f805f606084860312156145cd575f80fd5b8335925060208401356145df81614596565b91506145ed604085016145a3565b90509250925092565b5f60208284031215614606575f80fd5b5035919050565b6001600160a01b0381168114612ff1575f80fd5b5f80828403610160811215614634575f80fd5b61014080821215614643575f80fd5b84935083013590506146548161460d565b809150509250929050565b5f6020828403121561466f575f80fd5b610ef6826145a3565b5f8060408385031215614689575f80fd5b614692836145a3565b946020939093013593505050565b6001600160401b0381168114612ff1575f80fd5b5f602082840312156146c4575f80fd5b8135610ef6816146a0565b5f80604083850312156146e0575f80fd5b50508035926020909101359150565b5f805f8385036080811215614702575f80fd5b84356001600160401b03811115614717575f80fd5b850160608188031215614728575f80fd5b93506040601f198201121561473b575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061478857634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516147b060408401826001600160a01b03169052565b5060608301516147cb60608401826001600160401b03169052565b5060808301516147e660808401826001600160401b03169052565b5060a083015161480160a08401826001600160401b03169052565b5060c083015161481c60c08401826001600160401b03169052565b5060e083015161483760e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156148375761483761483e565b5f5b8381101561488c578181015183820152602001614874565b50505f910152565b602081525f82518060208401526148b2816040850160208701614872565b601f01601f19169190910160400192915050565b5f602082840312156148d6575f80fd5b5051919050565b5f826148f757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176108ee576108ee61483e565b6001600160401b038181168382160190808211156148375761483761483e565b600181811c908216806149d257607f821691505b6020821081036149f057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a4f816149be565b806020870152604060018084165f8114614a705760018114614a8c57614ab9565b60ff19851660408a0152604084151560051b8a01019550614ab9565b895f5260205f205f5b85811015614ab05781548b8201860152908301908801614a95565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614afd57614afd614ac7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b2b57614b2b614ac7565b604052919050565b80516145b681614596565b5f8060408385031215614b4f575f80fd5b82516001600160401b0380821115614b65575f80fd5b9084019060608287031215614b78575f80fd5b614b80614adb565b82518152602080840151614b938161460d565b82820152604084015183811115614ba8575f80fd5b80850194505087601f850112614bbc575f80fd5b835183811115614bce57614bce614ac7565b614be0601f8201601f19168301614b03565b93508084528882828701011115614bf5575f80fd5b614c0481838601848801614872565b50826040830152819550614c19818801614b33565b9450505050509250929050565b818103818111156108ee576108ee61483e565b634e487b7160e01b5f52603260045260245ffd5b808201808211156108ee576108ee61483e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614d5657614d5661483e565b505092915050565b61ffff81168114612ff1575f80fd5b5f60208284031215614d7d575f80fd5b8135610ef681614d5e565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614dde81614d5e565b61ffff8116905081548161ffff1982161783556020840135614dff816146a0565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6001600160401b03808316818103614e4457614e4461483e565b6001019392505050565b5f60208284031215614e5e575f80fd5b813560ff81168114610ef6575f80fd5b5f60208284031215614e7e575f80fd5b8135610ef68161460d565b5f808335601e19843603018112614e9e575f80fd5b8301803591506001600160401b03821115614eb7575f80fd5b602001915036819003821315611975575f80fd5b601f82111561147b57805f5260205f20601f840160051c81016020851015614ef05750805b601f840160051c820191505b81811015610cd4575f8155600101614efc565b81516001600160401b03811115614f2857614f28614ac7565b614f3c81614f3684546149be565b84614ecb565b602080601f831160018114614f6f575f8415614f585750858301515b5f19600386901b1c1916600185901b178555614fc6565b5f85815260208120601f198616915b82811015614f9d57888601518255948401946001909101908401614f7e565b5085821015614fba57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614fde575f80fd5b8151610ef681614596565b5f8251614ffa818460208701614872565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index bb8f45551..4546803b5 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614ea7380380614ea783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d5a8061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f3660046142d4565b61043b565b005b348015610161575f80fd5b5061015461017036600461430f565b6107ff565b348015610180575f80fd5b506101bf61018f36600461430f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b50610154610212366004614326565b6109cf565b348015610222575f80fd5b5061023661023136600461430f565b610aac565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b5061015461029036600461433d565b610ac2565b3480156102a0575f80fd5b506101546102af366004614356565b610aed565b3480156102bf575f80fd5b506101bf6102ce366004614392565b610cbd565b3480156102de575f80fd5b506102366102ed36600461430f565b610cd6565b3480156102fd575f80fd5b5061015461030c3660046142d4565b610cea565b6101bf61031f3660046143ad565b610dca565b34801561032f575f80fd5b5061015461033e366004614356565b610df6565b34801561034e575f80fd5b5061015461035d36600461433d565b611005565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae36600461430f565b6111c2565b3480156103be575f80fd5b506101546103cd36600461430f565b611448565b6101bf6103e036600461430f565b61155c565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b5061041861041336600461430f565b611568565b6040516101c9919061441a565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614cae83398151915291841561048d5761048a8285611647565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf614406565b60048111156104d0576104d0614406565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054c84611568565b905060028251600481111561056357610563614406565b146105b55760405162461bcd60e51b815260206004820152602a60248201525f80516020614cce8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b0316331461061a5760405162461bcd60e51b815260206004820152603360248201525f80516020614cce8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ac565b600382528051600290600581111561063457610634614406565b036106855761064682606001516118e3565b5f82606001518260a0015161065b9190614508565b905061066785826118f0565b506001600160401b0390811660e0850152421660a0840152506106a8565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156106d9576106d9614406565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916107ed916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614d2e83398151915260205260408082208151610100810190925280545f80516020614cee83398151915293929190829060ff16600581111561084d5761084d614406565b600581111561085e5761085e614406565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108e3576108e3614406565b146109485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb61096d8584608001515f611a1a565b6040518263ffffffff1660e01b8152600401610989919061454a565b6020604051808303815f875af11580156109a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109c9919061457c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a18575080546001600160401b03808416911610155b15610a365760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6083611c39565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610abc64e8d4a5100083614593565b92915050565b5f610acc82611c4a565b9050610ae981606001516001600160401b03168260400151611fbd565b5050565b5f80516020614cae8339815191525f610b0584611fd0565b90505f80610b1683604001516121b1565b50915091505f610b2583611568565b9050816001600160401b031681608001516001600160401b03161015610b5d5760405162461bcd60e51b81526004016105ac906145b2565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ba25760405162461bcd60e51b81526004016105ac906145f4565b60015f87815260068701602052604090205460ff166004811115610bc857610bc8614406565b14610c315760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610abc6001600160401b03831664e8d4a5100061463d565b5f610ce082611568565b60a0015192915050565b5f80516020614cae8339815191525f610d0285611568565b5f86815260058401602052604090205460c0820151919250610d3491620100009091046001600160401b031690614654565b6001600160401b0316421015610da85760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ac565b8315610dba57610db88584611647565b505b610dc3856123ec565b5050505050565b5f610dd361278a565b610dde8383346127c1565b9050610abc60015f80516020614d0e83398151915255565b5f80516020614cae8339815191525f610e0e84611fd0565b90505f80610e1f83604001516121b1565b50915091505f610e2e83611568565b9050816001600160401b031681608001516001600160401b03161015610e665760405162461bcd60e51b81526004016105ac906145b2565b5f8681526006860160205260409020600301546001600160401b0380841691161115610ea45760405162461bcd60e51b81526004016105ac906145f4565b60035f87815260068701602052604090205460ff166004811115610eca57610eca614406565b14610f1e5760405162461bcd60e51b815260206004820152603160248201525f80516020614cce8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610fc391611fbd565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614cee8339815191525f61101d83611fd0565b90505f8061102e83604001516129ef565b91509150806110905760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ac565b5f828152600785016020526040812080546110aa90614674565b90501180156110dc575060015f83815260088601602052604090205460ff1660058111156110da576110da614406565b145b6110f85760405162461bcd60e51b81526004016105ac906146a6565b5f82815260078501602052604081206111109161421c565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614cae83398151915293929190829060ff16600481111561122357611223614406565b600481111561123457611234614406565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112bb576112bb614406565b14806112d957506003815160048111156112d7576112d7614406565b145b61132d5760405162461bcd60e51b815260206004820152603260248201525f80516020614cce833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ac565b5f61133b8260400151611568565b905080608001516001600160401b03165f036113bf5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6113ec846040015184608001518560a00151611a1a565b6040518263ffffffff1660e01b8152600401611408919061454a565b6020604051808303815f875af1158015611424573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc3919061457c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614cee83398151915292919061149090614674565b90501180156114c2575060015f83815260088301602052604090205460ff1660058111156114c0576114c0614406565b145b6114de5760405162461bcd60e51b81526004016105ac906146a6565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161151791906004016146ed565b6020604051808303815f875af1158015611533573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611557919061457c565b505050565b5f610abc823334612b90565b611570614253565b5f8281525f80516020614d2e8339815191526020526040908190208151610100810190925280545f80516020614cee833981519152929190829060ff1660058111156115be576115be614406565b60058111156115cf576115cf614406565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611692573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116b99190810190614802565b915091508061171c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ac565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561175f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611783919061457c565b8251146117e75760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ac565b60208201516001600160a01b03161561185d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ac565b5f8061186c8460400151612f02565b915091508187146118d95760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ac565b9695505050505050565b6118ed815f6130da565b50565b5f805f6118fc85613334565b5f8681525f80516020614d2e83398151915260205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038916021790559091505f80516020614cee833981519152906005600160991b0163ee5b48eb61196589868a611a1a565b6040518263ffffffff1660e01b8152600401611981919061454a565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119c1919061457c565b604080516001600160401b0389811682526020820184905282519394508616928a927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3919350909150505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611a9357611a538160016148ea565b611a5e90600861463d565b5081515f90839083908110611a7557611a756148fd565b60200101906001600160f81b03191690815f1a905350600101611a3f565b505f5b6004811015611af657611aaa8160036148ea565b611ab590600861463d565b6001901c60f81b82611ac8836002614911565b81518110611ad857611ad86148fd565b60200101906001600160f81b03191690815f1a905350600101611a96565b505f5b6020811015611b5857611b0d81601f6148ea565b611b1890600861463d565b86901c60f81b82611b2a836006614911565b81518110611b3a57611b3a6148fd565b60200101906001600160f81b03191690815f1a905350600101611af9565b505f5b6008811015611bc357611b6f8160076148ea565b611b7a90600861463d565b6001600160401b038616901c60f81b82611b95836026614911565b81518110611ba557611ba56148fd565b60200101906001600160f81b03191690815f1a905350600101611b5b565b505f5b6008811015611c2e57611bda8160076148ea565b611be590600861463d565b6001600160401b038516901c60f81b82611c0083602e614911565b81518110611c1057611c106148fd565b60200101906001600160f81b03191690815f1a905350600101611bc6565b5090505b9392505050565b611c416133b6565b6118ed81613401565b611c52614253565b5f80516020614cee8339815191525f611c6a84611fd0565b90505f80611c7b83604001516129ef565b915091508015611ce05760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ac565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d1257611d12614406565b6005811115611d2357611d23614406565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611daa57611daa614406565b1480611dc85750600182516005811115611dc657611dc6614406565b145b611e275760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ac565b600382516005811115611e3c57611e3c614406565b03611e4957506004611e4d565b5060055b6020808301515f90815260098801909152604081205581816005811115611e7657611e76614406565b90816005811115611e8957611e89614406565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611ebd57611ebd614406565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f8857611f88614406565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610ae96001600160a01b0382168361346d565b60408051606080820183525f8083526020830181905292820152905f80516020614cee8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612045573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261206c9190810190614802565b91509150806120d35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105ac565b82548251146121365760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ac565b60208201516001600160a01b0316156121a95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ac565b509392505050565b5f805f83516036146121d55760405162461bcd60e51b81526004016105ac90614924565b5f805b6002811015612224576121ec8160016148ea565b6121f790600861463d565b61ffff1686828151811061220d5761220d6148fd565b016020015160f81c901b91909117906001016121d8565b5061ffff8116156122475760405162461bcd60e51b81526004016105ac9061496d565b5f805b60048110156122a25761225e8160036148ea565b61226990600861463d565b63ffffffff168761227b836002614911565b8151811061228b5761228b6148fd565b016020015160f81c901b919091179060010161224a565b5063ffffffff81166003146122c95760405162461bcd60e51b81526004016105ac906149b0565b5f805b602081101561231e576122e081601f6148ea565b6122eb90600861463d565b886122f7836006614911565b81518110612307576123076148fd565b016020015160f81c901b91909117906001016122cc565b505f805b600881101561237d576123368160076148ea565b61234190600861463d565b6001600160401b031689612356836026614911565b81518110612366576123666148fd565b016020015160f81c901b9190911790600101612322565b505f805b60088110156123dc576123958160076148ea565b6123a090600861463d565b6001600160401b03168a6123b583602e614911565b815181106123c5576123c56148fd565b016020015160f81c901b9190911790600101612381565b5091989097509095509350505050565b5f8181525f80516020614d2e83398151915260205260408082208151610100810190925280545f80516020614cee83398151915293929190829060ff16600581111561243a5761243a614406565b600581111561244b5761244b614406565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124d3576124d3614406565b1461252f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ac565b60408101516001600160a01b0316336001600160a01b0316146125a95760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105ac565b6125b68160a001516118e3565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156125fa576125fa614406565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126c6846126c081613334565b5f611a1a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906126f590859060040161454a565b6020604051808303815f875af1158015612711573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612735919061457c565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020614d0e8339815191528054600119016127bb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614cae833981519152906001600160401b031661280d6040860160208701614392565b6001600160401b0316101561287c5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ac565b600381015461288e6020860186614a06565b61ffff16101580156128b257506127106128ab6020860186614a06565b61ffff1611155b6128ce5760405162461bcd60e51b81526004016105ac90614a21565b80548310156129315760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ac565b80600101548311156129985760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ac565b825f6129a382610aac565b90505f6129b08883613500565b5f818152600586016020526040902090915087906129ce8282614a6c565b509098975050505050505050565b60015f80516020614d0e83398151915255565b5f808251602714612a125760405162461bcd60e51b81526004016105ac90614924565b5f805b6002811015612a6157612a298160016148ea565b612a3490600861463d565b61ffff16858281518110612a4a57612a4a6148fd565b016020015160f81c901b9190911790600101612a15565b5061ffff811615612a845760405162461bcd60e51b81526004016105ac9061496d565b5f805b6004811015612adf57612a9b8160036148ea565b612aa690600861463d565b63ffffffff1686612ab8836002614911565b81518110612ac857612ac86148fd565b016020015160f81c901b9190911790600101612a87565b5063ffffffff8116600214612b065760405162461bcd60e51b81526004016105ac906149b0565b5f805b6020811015612b5b57612b1d81601f6148ea565b612b2890600861463d565b87612b34836006614911565b81518110612b4457612b446148fd565b016020015160f81c901b9190911790600101612b09565b505f86602681518110612b7057612b706148fd565b016020015191976001600160f81b03199092161515965090945050505050565b5f612b9961278a565b5f80516020614cae8339815191525f612bb184610aac565b90505f612bbd87611568565b9050600281516005811115612bd457612bd4614406565b14612c335760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ac565b612c3c82613a3a565b5f828260a00151612c4d9190614654565b60048501546060840151919250612c6f916001600160401b0390911690614ac2565b6001600160401b0316816001600160401b03161115612cee5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ac565b5f80612cfa8a846118f0565b915091505f8a83604051602001612d2892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115612dc357612dc3614406565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050611c3260015f80516020614d0e83398151915255565b5f808251602e14612f255760405162461bcd60e51b81526004016105ac90614924565b5f805b6002811015612f7457612f3c8160016148ea565b612f4790600861463d565b61ffff16858281518110612f5d57612f5d6148fd565b016020015160f81c901b9190911790600101612f28565b5061ffff811615612f975760405162461bcd60e51b81526004016105ac9061496d565b5f805b6004811015612ff257612fae8160036148ea565b612fb990600861463d565b63ffffffff1686612fcb836002614911565b81518110612fdb57612fdb6148fd565b016020015160f81c901b9190911790600101612f9a565b5063ffffffff81166004146130195760405162461bcd60e51b81526004016105ac906149b0565b5f805b602081101561306e5761303081601f6148ea565b61303b90600861463d565b87613047836006614911565b81518110613057576130576148fd565b016020015160f81c901b919091179060010161301c565b505f805b60088110156130cd576130868160076148ea565b61309190600861463d565b6001600160401b0316886130a6836026614911565b815181106130b6576130b66148fd565b016020015160f81c901b9190911790600101613072565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614cee8339815191529142919015806131c05750600283015481516131bc916001600160401b031690614911565b8210155b156131e6576001600160401b038516606082015281815260408101516020820152613205565b84816060018181516131f89190614654565b6001600160401b03169052505b6060810151613215906064614ac2565b602082015160028501546001600160401b0392909216916132409190600160401b900460ff1661463d565b10156132a45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ac565b83156132cd57846001600160401b0316816040018181516132c59190614911565b9052506132ec565b846001600160401b0316816040018181516132e891906148ea565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b5f8181525f80516020614d2e8339815191526020526040812060030180545f80516020614cee833981519152916001600160401b03909116908361337783614aed565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166133ff57604051631afcd79f60e31b815260040160405180910390fd5b565b6134096133b6565b61341281613a45565b6118ed608082013560a083013561342f60e0850160c08601614392565b613440610100860160e08701614a06565b61ffff1661345661012087016101008801614b12565b61346861014088016101208901614b32565b613a66565b804710156134905760405163cd78605960e01b81523060048201526024016105ac565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146134d9576040519150601f19603f3d011682016040523d82523d5f602084013e6134de565b606091505b505090508061155757604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614cee833981519152426135206040860160208701614392565b6001600160401b0316116135925760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ac565b6135a26040850160208601614392565b6001600160401b03166135b86202a30042614911565b1161362b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ac565b83356136835760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105ac565b83355f908152600982016020526040902054156136f35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105ac565b6137006040850185614b4d565b90506030146137675760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105ac565b61377083613a3a565b5f8061380a6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906137b59190614392565b6001600160401b031681526020016137d060408a018a614b4d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613caa565b5f828152600786016020526040902091935091506138288282614bd3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061385590859060040161454a565b6020604051808303815f875af1158015613871573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613895919061457c565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561391757613917614406565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613a0c91908e01908e01614392565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6118ed8160016130da565b613a4d6133b6565b613a5561404f565b613a5d61405f565b6118ed81614067565b613a6e6133b6565b5f80516020614cae83398151915283613ada5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ac565b612710841115613afc5760405162461bcd60e51b81526004016105ac90614a21565b85871115613b645760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ac565b5f8360ff1611613bd15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ac565b600a60ff84161115613c435760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ac565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613d145760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ac565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613d8b57613d4b8160016148ea565b613d5690600861463d565b5081515f90839083908110613d6d57613d6d6148fd565b60200101906001600160f81b03191690815f1a905350600101613d37565b505f5b6004811015613de957613da28160036148ea565b613dad90600861463d565b505f82613dbb836002614911565b81518110613dcb57613dcb6148fd565b60200101906001600160f81b03191690815f1a905350600101613d8e565b505f5b6020811015613e465784518160208110613e0857613e086148fd565b1a60f81b82613e18836006614911565b81518110613e2857613e286148fd565b60200101906001600160f81b03191690815f1a905350600101613dec565b505f5b6020811015613ea65784602001518160208110613e6857613e686148fd565b1a60f81b82613e78836026614911565b81518110613e8857613e886148fd565b60200101906001600160f81b03191690815f1a905350600101613e49565b505f5b6008811015613f1a57613ebd8160076148ea565b613ec890600861463d565b60ff1685604001516001600160401b0316901c60f81b82826046613eec9190614911565b81518110613efc57613efc6148fd565b60200101906001600160f81b03191690815f1a905350600101613ea9565b505f5b6030811015613f855784608001518181518110613f3c57613f3c6148fd565b01602001516001600160f81b03191682613f5783604e614911565b81518110613f6757613f676148fd565b60200101906001600160f81b03191690815f1a905350600101613f1d565b505f5b6008811015613ff757613f9c8160076148ea565b613fa790600861463d565b60608601516001600160401b0390811691161c60f81b82613fc983607e614911565b81518110613fd957613fd96148fd565b60200101906001600160f81b03191690815f1a905350600101613f88565b506002816040516140089190614c92565b602060405180830381855afa158015614023573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614046919061457c565b94909350915050565b6140576133b6565b6133ff614214565b6133ff6133b6565b61406f6133b6565b80355f80516020614cee83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146140bb6080840160608501614b12565b60ff1611156141285760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ac565b5f6141396080840160608501614b12565b60ff16116141a15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ac565b6141b16080830160608401614b12565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556141e26060830160408401614392565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6129dc6133b6565b50805461422890614674565b5f825580601f10614237575050565b601f0160209004905f5260205f20908101906118ed9190614297565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156142ab575f8155600101614298565b5090565b80151581146118ed575f80fd5b803563ffffffff811681146142cf575f80fd5b919050565b5f805f606084860312156142e6575f80fd5b8335925060208401356142f8816142af565b9150614306604085016142bc565b90509250925092565b5f6020828403121561431f575f80fd5b5035919050565b5f6101408284031215614337575f80fd5b50919050565b5f6020828403121561434d575f80fd5b611c32826142bc565b5f8060408385031215614367575f80fd5b614370836142bc565b946020939093013593505050565b6001600160401b03811681146118ed575f80fd5b5f602082840312156143a2575f80fd5b8135611c328161437e565b5f8082840360608112156143bf575f80fd5b83356001600160401b038111156143d4575f80fd5b8401606081870312156143e5575f80fd5b92506040601f19820112156143f8575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061443e57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161446660408401826001600160a01b03169052565b50606083015161448160608401826001600160401b03169052565b50608083015161449c60808401826001600160401b03169052565b5060a08301516144b760a08401826001600160401b03169052565b5060c08301516144d260c08401826001600160401b03169052565b5060e08301516144ed60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144ed576144ed6144f4565b5f5b8381101561454257818101518382015260200161452a565b50505f910152565b602081525f8251806020840152614568816040850160208701614528565b601f01601f19169190910160400192915050565b5f6020828403121561458c575f80fd5b5051919050565b5f826145ad57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610abc57610abc6144f4565b6001600160401b038181168382160190808211156144ed576144ed6144f4565b600181811c9082168061468857607f821691505b60208210810361433757634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546146ff81614674565b806020870152604060018084165f8114614720576001811461473c57614769565b60ff19851660408a0152604084151560051b8a01019550614769565b895f5260205f205f5b858110156147605781548b8201860152908301908801614745565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156147ad576147ad614777565b60405290565b604051601f8201601f191681016001600160401b03811182821017156147db576147db614777565b604052919050565b6001600160a01b03811681146118ed575f80fd5b80516142cf816142af565b5f8060408385031215614813575f80fd5b82516001600160401b0380821115614829575f80fd5b908401906060828703121561483c575f80fd5b61484461478b565b82518152602080840151614857816147e3565b8282015260408401518381111561486c575f80fd5b80850194505087601f850112614880575f80fd5b83518381111561489257614892614777565b6148a4601f8201601f191683016147b3565b935080845288828287010111156148b9575f80fd5b6148c881838601848801614528565b508260408301528195506148dd8188016147f7565b9450505050509250929050565b81810381811115610abc57610abc6144f4565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610abc57610abc6144f4565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff811681146118ed575f80fd5b5f60208284031215614a16575f80fd5b8135611c32816149f7565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614a77816149f7565b61ffff8116905081548161ffff1982161783556020840135614a988161437e565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614ae557614ae56144f4565b505092915050565b5f6001600160401b03808316818103614b0857614b086144f4565b6001019392505050565b5f60208284031215614b22575f80fd5b813560ff81168114611c32575f80fd5b5f60208284031215614b42575f80fd5b8135611c32816147e3565b5f808335601e19843603018112614b62575f80fd5b8301803591506001600160401b03821115614b7b575f80fd5b602001915036819003821315611a13575f80fd5b601f82111561155757805f5260205f20601f840160051c81016020851015614bb45750805b601f840160051c820191505b81811015610dc3575f8155600101614bc0565b81516001600160401b03811115614bec57614bec614777565b614c0081614bfa8454614674565b84614b8f565b602080601f831160018114614c33575f8415614c1c5750858301515b5f19600386901b1c1916600185901b178555614c8a565b5f85815260208120601f198616915b82811015614c6157888601518255948401946001909101908401614c42565b5085821015614c7e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614ca3818460208701614528565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614e63380380614e6383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d168061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f366004614290565b61043b565b005b348015610161575f80fd5b506101546101703660046142cb565b6107f2565b348015610180575f80fd5b506101bf61018f3660046142cb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b506101546102123660046142e2565b6109c2565b348015610222575f80fd5b506102366102313660046142cb565b610a9f565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b506101546102903660046142f9565b610ab5565b3480156102a0575f80fd5b506101546102af366004614312565b610ae0565b3480156102bf575f80fd5b506101bf6102ce36600461434e565b610cb0565b3480156102de575f80fd5b506102366102ed3660046142cb565b610cc9565b3480156102fd575f80fd5b5061015461030c366004614290565b610cdd565b6101bf61031f366004614369565b610dbd565b34801561032f575f80fd5b5061015461033e366004614312565b610de9565b34801561034e575f80fd5b5061015461035d3660046142f9565b610ff8565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae3660046142cb565b6111b5565b3480156103be575f80fd5b506101546103cd3660046142cb565b61143b565b6101bf6103e03660046142cb565b61154f565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b506104186104133660046142cb565b61155b565b6040516101c991906143d6565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614c6a83398151915291841561048d5761048a828561163a565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf6143c2565b60048111156104d0576104d06143c2565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054c8461155b565b9050600282516004811115610563576105636143c2565b146105b55760405162461bcd60e51b815260206004820152602a60248201525f80516020614c8a8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b0316331461061a5760405162461bcd60e51b815260206004820152603360248201525f80516020614c8a8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ac565b6003825280516002906005811115610634576106346143c2565b03610678575f82606001518260a0015161064e91906144c4565b905061065a85826118d6565b506001600160401b0390811660e0850152421660a08401525061069b565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156106cc576106cc6143c2565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916107e0916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614cea83398151915260205260408082208151610100810190925280545f80516020614caa83398151915293929190829060ff166005811115610840576108406143c2565b6005811115610851576108516143c2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108d6576108d66143c2565b1461093b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6109608584608001515f611a57565b6040518263ffffffff1660e01b815260040161097c9190614506565b6020604051808303815f875af1158015610998573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bc9190614538565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a0b575080546001600160401b03808416911610155b15610a295760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5383611c76565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610aaf64e8d4a510008361454f565b92915050565b5f610abf82611c8a565b9050610adc81606001516001600160401b03168260400151611ffd565b5050565b5f80516020614c6a8339815191525f610af884612010565b90505f80610b0983604001516121f1565b50915091505f610b188361155b565b9050816001600160401b031681608001516001600160401b03161015610b505760405162461bcd60e51b81526004016105ac9061456e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b955760405162461bcd60e51b81526004016105ac906145b0565b60015f87815260068701602052604090205460ff166004811115610bbb57610bbb6143c2565b14610c245760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610aaf6001600160401b03831664e8d4a510006145f9565b5f610cd38261155b565b60a0015192915050565b5f80516020614c6a8339815191525f610cf58561155b565b5f86815260058401602052604090205460c0820151919250610d2791620100009091046001600160401b031690614610565b6001600160401b0316421015610d9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ac565b8315610dad57610dab858461163a565b505b610db68561242c565b5050505050565b5f610dc6612745565b610dd183833461277c565b9050610aaf60015f80516020614cca83398151915255565b5f80516020614c6a8339815191525f610e0184612010565b90505f80610e1283604001516121f1565b50915091505f610e218361155b565b9050816001600160401b031681608001516001600160401b03161015610e595760405162461bcd60e51b81526004016105ac9061456e565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e975760405162461bcd60e51b81526004016105ac906145b0565b60035f87815260068701602052604090205460ff166004811115610ebd57610ebd6143c2565b14610f115760405162461bcd60e51b815260206004820152603160248201525f80516020614c8a8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610fb691611ffd565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614caa8339815191525f61101083612010565b90505f8061102183604001516129aa565b91509150806110835760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ac565b5f8281526007850160205260408120805461109d90614630565b90501180156110cf575060015f83815260088601602052604090205460ff1660058111156110cd576110cd6143c2565b145b6110eb5760405162461bcd60e51b81526004016105ac90614662565b5f8281526007850160205260408120611103916141d8565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614c6a83398151915293929190829060ff166004811115611216576112166143c2565b6004811115611227576112276143c2565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112ae576112ae6143c2565b14806112cc57506003815160048111156112ca576112ca6143c2565b145b6113205760405162461bcd60e51b815260206004820152603260248201525f80516020614c8a833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ac565b5f61132e826040015161155b565b905080608001516001600160401b03165f036113b25760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6113df846040015184608001518560a00151611a57565b6040518263ffffffff1660e01b81526004016113fb9190614506565b6020604051808303815f875af1158015611417573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db69190614538565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614caa83398151915292919061148390614630565b90501180156114b5575060015f83815260088301602052604090205460ff1660058111156114b3576114b36143c2565b145b6114d15760405162461bcd60e51b81526004016105ac90614662565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161150a91906004016146a9565b6020604051808303815f875af1158015611526573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154a9190614538565b505050565b5f610aaf823334612b4b565b61156361420f565b5f8281525f80516020614cea8339815191526020526040908190208151610100810190925280545f80516020614caa833981519152929190829060ff1660058111156115b1576115b16143c2565b60058111156115c2576115c26143c2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611685573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116ac91908101906147be565b915091508061170f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ac565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611752573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117769190614538565b8251146117da5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ac565b60208201516001600160a01b0316156118505760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ac565b5f8061185f8460400151612eb4565b915091508187146118cc5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ac565b9695505050505050565b5f8281525f80516020614cea833981519152602052604081206003015481905f80516020614caa83398151915290600160401b90046001600160401b0390811690851681116119365761193161192c82876144c4565b61308c565b611948565b61194861194386836144c4565b613097565b5f611952876130a1565b5f8881526008850160205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6119a28a858b611a57565b6040518263ffffffff1660e01b81526004016119be9190614506565b6020604051808303815f875af11580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe9190614538565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ad057611a908160016148a6565b611a9b9060086145f9565b5081515f90839083908110611ab257611ab26148b9565b60200101906001600160f81b03191690815f1a905350600101611a7c565b505f5b6004811015611b3357611ae78160036148a6565b611af29060086145f9565b6001901c60f81b82611b058360026148cd565b81518110611b1557611b156148b9565b60200101906001600160f81b03191690815f1a905350600101611ad3565b505f5b6020811015611b9557611b4a81601f6148a6565b611b559060086145f9565b86901c60f81b82611b678360066148cd565b81518110611b7757611b776148b9565b60200101906001600160f81b03191690815f1a905350600101611b36565b505f5b6008811015611c0057611bac8160076148a6565b611bb79060086145f9565b6001600160401b038616901c60f81b82611bd28360266148cd565b81518110611be257611be26148b9565b60200101906001600160f81b03191690815f1a905350600101611b98565b505f5b6008811015611c6b57611c178160076148a6565b611c229060086145f9565b6001600160401b038516901c60f81b82611c3d83602e6148cd565b81518110611c4d57611c4d6148b9565b60200101906001600160f81b03191690815f1a905350600101611c03565b5090505b9392505050565b611c7e613123565b611c878161316e565b50565b611c9261420f565b5f80516020614caa8339815191525f611caa84612010565b90505f80611cbb83604001516129aa565b915091508015611d205760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ac565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d5257611d526143c2565b6005811115611d6357611d636143c2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611dea57611dea6143c2565b1480611e085750600182516005811115611e0657611e066143c2565b145b611e675760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ac565b600382516005811115611e7c57611e7c6143c2565b03611e8957506004611e8d565b5060055b6020808301515f90815260098801909152604081205581816005811115611eb657611eb66143c2565b90816005811115611ec957611ec96143c2565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611efd57611efd6143c2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611fc857611fc86143c2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610adc6001600160a01b038216836131da565b60408051606080820183525f8083526020830181905292820152905f80516020614caa8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612085573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120ac91908101906147be565b91509150806121135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105ac565b82548251146121765760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ac565b60208201516001600160a01b0316156121e95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ac565b509392505050565b5f805f83516036146122155760405162461bcd60e51b81526004016105ac906148e0565b5f805b60028110156122645761222c8160016148a6565b6122379060086145f9565b61ffff1686828151811061224d5761224d6148b9565b016020015160f81c901b9190911790600101612218565b5061ffff8116156122875760405162461bcd60e51b81526004016105ac90614929565b5f805b60048110156122e25761229e8160036148a6565b6122a99060086145f9565b63ffffffff16876122bb8360026148cd565b815181106122cb576122cb6148b9565b016020015160f81c901b919091179060010161228a565b5063ffffffff81166003146123095760405162461bcd60e51b81526004016105ac9061496c565b5f805b602081101561235e5761232081601f6148a6565b61232b9060086145f9565b886123378360066148cd565b81518110612347576123476148b9565b016020015160f81c901b919091179060010161230c565b505f805b60088110156123bd576123768160076148a6565b6123819060086145f9565b6001600160401b0316896123968360266148cd565b815181106123a6576123a66148b9565b016020015160f81c901b9190911790600101612362565b505f805b600881101561241c576123d58160076148a6565b6123e09060086145f9565b6001600160401b03168a6123f583602e6148cd565b81518110612405576124056148b9565b016020015160f81c901b91909117906001016123c1565b5091989097509095509350505050565b5f8181525f80516020614cea83398151915260205260408082208151610100810190925280545f80516020614caa83398151915293929190829060ff16600581111561247a5761247a6143c2565b600581111561248b5761248b6143c2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612513576125136143c2565b1461256f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ac565b60408101516001600160a01b0316336001600160a01b0316146125e95760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105ac565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561262d5761262d6143c2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126f084826118d6565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f80516020614cca83398151915280546001190161277657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614c6a833981519152906001600160401b03166127c8604086016020870161434e565b6001600160401b031610156128375760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ac565b600381015461284960208601866149c2565b61ffff161015801561286d575061271061286660208601866149c2565b61ffff1611155b6128895760405162461bcd60e51b81526004016105ac906149dd565b80548310156128ec5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ac565b80600101548311156129535760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ac565b825f61295e82610a9f565b90505f61296b888361326d565b5f818152600586016020526040902090915087906129898282614a28565b509098975050505050505050565b60015f80516020614cca83398151915255565b5f8082516027146129cd5760405162461bcd60e51b81526004016105ac906148e0565b5f805b6002811015612a1c576129e48160016148a6565b6129ef9060086145f9565b61ffff16858281518110612a0557612a056148b9565b016020015160f81c901b91909117906001016129d0565b5061ffff811615612a3f5760405162461bcd60e51b81526004016105ac90614929565b5f805b6004811015612a9a57612a568160036148a6565b612a619060086145f9565b63ffffffff1686612a738360026148cd565b81518110612a8357612a836148b9565b016020015160f81c901b9190911790600101612a42565b5063ffffffff8116600214612ac15760405162461bcd60e51b81526004016105ac9061496c565b5f805b6020811015612b1657612ad881601f6148a6565b612ae39060086145f9565b87612aef8360066148cd565b81518110612aff57612aff6148b9565b016020015160f81c901b9190911790600101612ac4565b505f86602681518110612b2b57612b2b6148b9565b016020015191976001600160f81b03199092161515965090945050505050565b5f612b54612745565b5f80516020614c6a8339815191525f612b6c84610a9f565b90505f612b788761155b565b9050600281516005811115612b8f57612b8f6143c2565b14612bee5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ac565b5f828260a00151612bff9190614610565b60048501546060840151919250612c21916001600160401b0390911690614a7e565b6001600160401b0316816001600160401b03161115612ca05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ac565b5f80612cac8a846118d6565b915091505f8a83604051602001612cda92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115612d7557612d756143c2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050611c6f60015f80516020614cca83398151915255565b5f808251602e14612ed75760405162461bcd60e51b81526004016105ac906148e0565b5f805b6002811015612f2657612eee8160016148a6565b612ef99060086145f9565b61ffff16858281518110612f0f57612f0f6148b9565b016020015160f81c901b9190911790600101612eda565b5061ffff811615612f495760405162461bcd60e51b81526004016105ac90614929565b5f805b6004811015612fa457612f608160036148a6565b612f6b9060086145f9565b63ffffffff1686612f7d8360026148cd565b81518110612f8d57612f8d6148b9565b016020015160f81c901b9190911790600101612f4c565b5063ffffffff8116600414612fcb5760405162461bcd60e51b81526004016105ac9061496c565b5f805b602081101561302057612fe281601f6148a6565b612fed9060086145f9565b87612ff98360066148cd565b81518110613009576130096148b9565b016020015160f81c901b9190911790600101612fce565b505f805b600881101561307f576130388160076148a6565b6130439060086145f9565b6001600160401b0316886130588360266148cd565b81518110613068576130686148b9565b016020015160f81c901b9190911790600101613024565b5090969095509350505050565b611c878160016137a7565b611c87815f6137a7565b5f8181525f80516020614cea8339815191526020526040812060030180545f80516020614caa833981519152916001600160401b0390911690836130e483614aa9565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661316c57604051631afcd79f60e31b815260040160405180910390fd5b565b613176613123565b61317f81613a01565b611c87608082013560a083013561319c60e0850160c0860161434e565b6131ad610100860160e087016149c2565b61ffff166131c361012087016101008801614ace565b6131d561014088016101208901614aee565b613a22565b804710156131fd5760405163cd78605960e01b81523060048201526024016105ac565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613246576040519150601f19603f3d011682016040523d82523d5f602084013e61324b565b606091505b505090508061154a57604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614caa8339815191524261328d604086016020870161434e565b6001600160401b0316116132ff5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ac565b61330f604085016020860161434e565b6001600160401b03166133256202a300426148cd565b116133985760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ac565b83356133f05760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105ac565b83355f908152600982016020526040902054156134605760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105ac565b61346d6040850185614b09565b90506030146134d45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105ac565b6134dd8361308c565b5f806135776040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613522919061434e565b6001600160401b0316815260200161353d60408a018a614b09565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613c66565b5f828152600786016020526040902091935091506135958282614b8f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906135c2908590600401614506565b6020604051808303815f875af11580156135de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136029190614538565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613684576136846143c2565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161377991908e01908e0161434e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614caa83398151915291429190158061388d575060028301548151613889916001600160401b0316906148cd565b8210155b156138b3576001600160401b0385166060820152818152604081015160208201526138d2565b84816060018181516138c59190614610565b6001600160401b03169052505b60608101516138e2906064614a7e565b602082015160028501546001600160401b03929092169161390d9190600160401b900460ff166145f9565b10156139715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ac565b831561399a57846001600160401b03168160400181815161399291906148cd565b9052506139b9565b846001600160401b0316816040018181516139b591906148a6565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b613a09613123565b613a1161400b565b613a1961401b565b611c8781614023565b613a2a613123565b5f80516020614c6a83398151915283613a965760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ac565b612710841115613ab85760405162461bcd60e51b81526004016105ac906149dd565b85871115613b205760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ac565b5f8360ff1611613b8d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ac565b600a60ff84161115613bff5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ac565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613cd05760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ac565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613d4757613d078160016148a6565b613d129060086145f9565b5081515f90839083908110613d2957613d296148b9565b60200101906001600160f81b03191690815f1a905350600101613cf3565b505f5b6004811015613da557613d5e8160036148a6565b613d699060086145f9565b505f82613d778360026148cd565b81518110613d8757613d876148b9565b60200101906001600160f81b03191690815f1a905350600101613d4a565b505f5b6020811015613e025784518160208110613dc457613dc46148b9565b1a60f81b82613dd48360066148cd565b81518110613de457613de46148b9565b60200101906001600160f81b03191690815f1a905350600101613da8565b505f5b6020811015613e625784602001518160208110613e2457613e246148b9565b1a60f81b82613e348360266148cd565b81518110613e4457613e446148b9565b60200101906001600160f81b03191690815f1a905350600101613e05565b505f5b6008811015613ed657613e798160076148a6565b613e849060086145f9565b60ff1685604001516001600160401b0316901c60f81b82826046613ea891906148cd565b81518110613eb857613eb86148b9565b60200101906001600160f81b03191690815f1a905350600101613e65565b505f5b6030811015613f415784608001518181518110613ef857613ef86148b9565b01602001516001600160f81b03191682613f1383604e6148cd565b81518110613f2357613f236148b9565b60200101906001600160f81b03191690815f1a905350600101613ed9565b505f5b6008811015613fb357613f588160076148a6565b613f639060086145f9565b60608601516001600160401b0390811691161c60f81b82613f8583607e6148cd565b81518110613f9557613f956148b9565b60200101906001600160f81b03191690815f1a905350600101613f44565b50600281604051613fc49190614c4e565b602060405180830381855afa158015613fdf573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906140029190614538565b94909350915050565b614013613123565b61316c6141d0565b61316c613123565b61402b613123565b80355f80516020614caa83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146140776080840160608501614ace565b60ff1611156140e45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ac565b5f6140f56080840160608501614ace565b60ff161161415d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ac565b61416d6080830160608401614ace565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561419e606083016040840161434e565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612997613123565b5080546141e490614630565b5f825580601f106141f3575050565b601f0160209004905f5260205f2090810190611c879190614253565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614267575f8155600101614254565b5090565b8015158114611c87575f80fd5b803563ffffffff8116811461428b575f80fd5b919050565b5f805f606084860312156142a2575f80fd5b8335925060208401356142b48161426b565b91506142c260408501614278565b90509250925092565b5f602082840312156142db575f80fd5b5035919050565b5f61014082840312156142f3575f80fd5b50919050565b5f60208284031215614309575f80fd5b611c6f82614278565b5f8060408385031215614323575f80fd5b61432c83614278565b946020939093013593505050565b6001600160401b0381168114611c87575f80fd5b5f6020828403121561435e575f80fd5b8135611c6f8161433a565b5f80828403606081121561437b575f80fd5b83356001600160401b03811115614390575f80fd5b8401606081870312156143a1575f80fd5b92506040601f19820112156143b4575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106143fa57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161442260408401826001600160a01b03169052565b50606083015161443d60608401826001600160401b03169052565b50608083015161445860808401826001600160401b03169052565b5060a083015161447360a08401826001600160401b03169052565b5060c083015161448e60c08401826001600160401b03169052565b5060e08301516144a960e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144a9576144a96144b0565b5f5b838110156144fe5781810151838201526020016144e6565b50505f910152565b602081525f82518060208401526145248160408501602087016144e4565b601f01601f19169190910160400192915050565b5f60208284031215614548575f80fd5b5051919050565b5f8261456957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610aaf57610aaf6144b0565b6001600160401b038181168382160190808211156144a9576144a96144b0565b600181811c9082168061464457607f821691505b6020821081036142f357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546146bb81614630565b806020870152604060018084165f81146146dc57600181146146f857614725565b60ff19851660408a0152604084151560051b8a01019550614725565b895f5260205f205f5b8581101561471c5781548b8201860152908301908801614701565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561476957614769614733565b60405290565b604051601f8201601f191681016001600160401b038111828210171561479757614797614733565b604052919050565b6001600160a01b0381168114611c87575f80fd5b805161428b8161426b565b5f80604083850312156147cf575f80fd5b82516001600160401b03808211156147e5575f80fd5b90840190606082870312156147f8575f80fd5b614800614747565b825181526020808401516148138161479f565b82820152604084015183811115614828575f80fd5b80850194505087601f85011261483c575f80fd5b83518381111561484e5761484e614733565b614860601f8201601f1916830161476f565b93508084528882828701011115614875575f80fd5b614884818386018488016144e4565b508260408301528195506148998188016147b3565b9450505050509250929050565b81810381811115610aaf57610aaf6144b0565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610aaf57610aaf6144b0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c87575f80fd5b5f602082840312156149d2575f80fd5b8135611c6f816149b3565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614a33816149b3565b61ffff8116905081548161ffff1982161783556020840135614a548161433a565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614aa157614aa16144b0565b505092915050565b5f6001600160401b03808316818103614ac457614ac46144b0565b6001019392505050565b5f60208284031215614ade575f80fd5b813560ff81168114611c6f575f80fd5b5f60208284031215614afe575f80fd5b8135611c6f8161479f565b5f808335601e19843603018112614b1e575f80fd5b8301803591506001600160401b03821115614b37575f80fd5b602001915036819003821315611a50575f80fd5b601f82111561154a57805f5260205f20601f840160051c81016020851015614b705750805b601f840160051c820191505b81811015610db6575f8155600101614b7c565b81516001600160401b03811115614ba857614ba8614733565b614bbc81614bb68454614630565b84614b4b565b602080601f831160018114614bef575f8415614bd85750858301515b5f19600386901b1c1916600185901b178555614c46565b5f85815260208120601f198616915b82811015614c1d57888601518255948401946001909101908401614bfe565b5085821015614c3a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614c5f8184602087016144e4565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index e8db2a7e7..c41d13a02 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -58,8 +58,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612ff8380380612ff883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612eab8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c806397fb70d411610093578063c974d1b611610063578063c974d1b61461025c578063d5f20ff614610276578063df93d8de14610296578063f2fde38b146102a0575f80fd5b806397fb70d414610215578063a3a65e4814610228578063b771b3bc1461023b578063bee0a03f14610249575f80fd5b806366435abf116100ce57806366435abf1461018b578063715018a6146101b65780638994ab49146101be5780638da5cb5b146101d1575f80fd5b80630322ed98146100ff5780630cdd098514610114578063467ef06f14610165578063580a400614610178575b5f80fd5b61011261010d366004612708565b6102b3565b005b610152610122366004612708565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011261017336600461271f565b610488565b61011261018636600461275d565b610495565b61019e610199366004612708565b6105a3565b6040516001600160401b03909116815260200161015c565b6101126105b7565b6101526101cc3660046127b4565b6105ca565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b610112610223366004612708565b6105e6565b61011261023636600461271f565b6105f2565b6101fd6005600160991b0181565b610112610257366004612708565b6107af565b610264601481565b60405160ff909116815260200161015c565b610289610284366004612708565b6108c3565b60405161015c9190612816565b61019e6202a30081565b6101126102ae3660046128f0565b6109a2565b5f8181525f80516020612e7f83398151915260205260408082208151610100810190925280545f80516020612e5f83398151915293929190829060ff16600581111561030157610301612802565b600581111561031257610312612802565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561039757610397612802565b146104015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104268584608001515f6109dc565b6040518263ffffffff1660e01b8152600401610442919061292d565b6020604051808303815f875af115801561045e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610482919061295f565b50505050565b61049181610bf9565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104d95750825b90505f826001600160401b031660011480156104f45750303b155b905081158015610502575080155b156105205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561054a57845460ff60401b1916600160401b1785555b6105548787610f6c565b831561059a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105ad826108c3565b60a0015192915050565b6105bf610f86565b6105c85f610fe1565b565b5f6105d3610f86565b6105dd8383611051565b90505b92915050565b6105ef8161158b565b50565b5f80516020612e5f8339815191525f61060a83611929565b90505f8061061b8360400151611b0a565b915091508061067d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f8565b5f8281526007850160205260408120805461069790612976565b90501180156106c9575060015f83815260088601602052604090205460ff1660058111156106c7576106c7612802565b145b6106e55760405162461bcd60e51b81526004016103f8906129ae565b5f82815260078501602052604081206106fd91612675565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612e5f8339815191529291906107f790612976565b9050118015610829575060015f83815260088301602052604090205460ff16600581111561082757610827612802565b145b6108455760405162461bcd60e51b81526004016103f8906129ae565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087e91906004016129f5565b6020604051808303815f875af115801561089a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108be919061295f565b505050565b6108cb6126ac565b5f8281525f80516020612e7f8339815191526020526040908190208151610100810190925280545f80516020612e5f833981519152929190829060ff16600581111561091957610919612802565b600581111561092a5761092a612802565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6109aa610f86565b6001600160a01b0381166109d357604051631e4fbdf760e01b81525f60048201526024016103f8565b6105ef81610fe1565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a5557610a15816001612aa7565b610a20906008612aba565b5081515f90839083908110610a3757610a37612ad1565b60200101906001600160f81b03191690815f1a905350600101610a01565b505f5b6004811015610ab857610a6c816003612aa7565b610a77906008612aba565b6001901c60f81b82610a8a836002612ae5565b81518110610a9a57610a9a612ad1565b60200101906001600160f81b03191690815f1a905350600101610a58565b505f5b6020811015610b1a57610acf81601f612aa7565b610ada906008612aba565b86901c60f81b82610aec836006612ae5565b81518110610afc57610afc612ad1565b60200101906001600160f81b03191690815f1a905350600101610abb565b505f5b6008811015610b8557610b31816007612aa7565b610b3c906008612aba565b6001600160401b038616901c60f81b82610b57836026612ae5565b81518110610b6757610b67612ad1565b60200101906001600160f81b03191690815f1a905350600101610b1d565b505f5b6008811015610bf057610b9c816007612aa7565b610ba7906008612aba565b6001600160401b038516901c60f81b82610bc283602e612ae5565b81518110610bd257610bd2612ad1565b60200101906001600160f81b03191690815f1a905350600101610b88565b50949350505050565b610c016126ac565b5f80516020612e5f8339815191525f610c1984611929565b90505f80610c2a8360400151611b0a565b915091508015610c8f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610cc157610cc1612802565b6005811115610cd257610cd2612802565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d5957610d59612802565b1480610d775750600182516005811115610d7557610d75612802565b145b610dd65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103f8565b600382516005811115610deb57610deb612802565b03610df857506004610dfc565b5060055b6020808301515f90815260098801909152604081205581816005811115610e2557610e25612802565b90816005811115610e3857610e38612802565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610e6c57610e6c612802565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610f3757610f37612802565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610f74611d69565b610f7d82611db2565b61049181611dd3565b33610fb87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c85760405163118cdaa760e01b81523360048201526024016103f8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612e5f833981519152426110716040860160208701612af8565b6001600160401b0316116110e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103f8565b6110f36040850160208601612af8565b6001600160401b03166111096202a30042612ae5565b1161117c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103f8565b83356111d45760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f8565b83355f908152600982016020526040902054156112445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f8565b6112516040850185612b11565b90506030146112b85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f8565b6112c183611de4565b5f8061135b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906113069190612af8565b6001600160401b0316815260200161132160408a018a612b11565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611def565b5f828152600786016020526040902091935091506113798282612ba5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113a690859060040161292d565b6020604051808303815f875af11580156113c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e6919061295f565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561146857611468612802565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161155d91908e01908e01612af8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612e7f83398151915260205260408082208151610100810190925280545f80516020612e5f83398151915293929190829060ff1660058111156115d9576115d9612802565b60058111156115ea576115ea612802565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561167257611672612802565b146116ce5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f8565b60408101516001600160a01b0316336001600160a01b0316146117485760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103f8565b6117558160a00151612194565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561179957611799612802565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6118658461185f8161219e565b5f6109dc565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061189490859060040161292d565b6020604051808303815f875af11580156118b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118d4919061295f565b60a0840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b60408051606080820183525f8083526020830181905292820152905f80516020612e5f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561199e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119c59190810190612ccb565b9150915080611a2c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f8565b8254825114611a8f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103f8565b60208201516001600160a01b031615611b025760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103f8565b509392505050565b5f808251602714611b6f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103f8565b5f805b6002811015611bbe57611b86816001612aa7565b611b91906008612aba565b61ffff16858281518110611ba757611ba7612ad1565b016020015160f81c901b9190911790600101611b72565b5061ffff811615611c1d5760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103f8565b5f805b6004811015611c7857611c34816003612aa7565b611c3f906008612aba565b63ffffffff1686611c51836002612ae5565b81518110611c6157611c61612ad1565b016020015160f81c901b9190911790600101611c20565b5063ffffffff8116600214611cdf5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103f8565b5f805b6020811015611d3457611cf681601f612aa7565b611d01906008612aba565b87611d0d836006612ae5565b81518110611d1d57611d1d612ad1565b016020015160f81c901b9190911790600101611ce2565b505f86602681518110611d4957611d49612ad1565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c857604051631afcd79f60e31b815260040160405180910390fd5b611dba611d69565b611dc2612220565b611dca612230565b6105ef81612238565b611ddb611d69565b6105ef816123e5565b6105ef8160016123ed565b5f6060826080015151603014611e595760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611ed057611e90816001612aa7565b611e9b906008612aba565b5081515f90839083908110611eb257611eb2612ad1565b60200101906001600160f81b03191690815f1a905350600101611e7c565b505f5b6004811015611f2e57611ee7816003612aa7565b611ef2906008612aba565b505f82611f00836002612ae5565b81518110611f1057611f10612ad1565b60200101906001600160f81b03191690815f1a905350600101611ed3565b505f5b6020811015611f8b5784518160208110611f4d57611f4d612ad1565b1a60f81b82611f5d836006612ae5565b81518110611f6d57611f6d612ad1565b60200101906001600160f81b03191690815f1a905350600101611f31565b505f5b6020811015611feb5784602001518160208110611fad57611fad612ad1565b1a60f81b82611fbd836026612ae5565b81518110611fcd57611fcd612ad1565b60200101906001600160f81b03191690815f1a905350600101611f8e565b505f5b600881101561205f57612002816007612aa7565b61200d906008612aba565b60ff1685604001516001600160401b0316901c60f81b828260466120319190612ae5565b8151811061204157612041612ad1565b60200101906001600160f81b03191690815f1a905350600101611fee565b505f5b60308110156120ca578460800151818151811061208157612081612ad1565b01602001516001600160f81b0319168261209c83604e612ae5565b815181106120ac576120ac612ad1565b60200101906001600160f81b03191690815f1a905350600101612062565b505f5b600881101561213c576120e1816007612aa7565b6120ec906008612aba565b60608601516001600160401b0390811691161c60f81b8261210e83607e612ae5565b8151811061211e5761211e612ad1565b60200101906001600160f81b03191690815f1a9053506001016120cd565b5060028160405161214d9190612db3565b602060405180830381855afa158015612168573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061218b919061295f565b94909350915050565b6105ef815f6123ed565b5f8181525f80516020612e7f8339815191526020526040812060030180545f80516020612e5f833981519152916001600160401b0390911690836121e183612dce565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b612228611d69565b6105c8612647565b6105c8611d69565b612240611d69565b80355f80516020612e5f83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461228c6080840160608501612df3565b60ff1611156122f95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103f8565b5f61230a6080840160608501612df3565b60ff16116123725760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103f8565b6123826080830160608401612df3565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556123b36060830160408401612af8565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6109aa611d69565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020612e5f8339815191529142919015806124d35750600283015481516124cf916001600160401b031690612ae5565b8210155b156124f9576001600160401b038516606082015281815260408101516020820152612518565b848160600181815161250b9190612e13565b6001600160401b03169052505b6060810151612528906064612e33565b602082015160028501546001600160401b0392909216916125539190600160401b900460ff16612aba565b10156125b75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103f8565b83156125e057846001600160401b0316816040018181516125d89190612ae5565b9052506125ff565b846001600160401b0316816040018181516125fb9190612aa7565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b61264f611d69565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50805461268190612976565b5f825580601f10612690575050565b601f0160209004905f5260205f20908101906105ef91906126f0565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612704575f81556001016126f1565b5090565b5f60208284031215612718575f80fd5b5035919050565b5f6020828403121561272f575f80fd5b813563ffffffff81168114612742575f80fd5b9392505050565b6001600160a01b03811681146105ef575f80fd5b5f8082840360a081121561276f575f80fd5b608081121561277c575f80fd5b50829150608083013561278e81612749565b809150509250929050565b80356001600160401b03811681146127af575f80fd5b919050565b5f80604083850312156127c5575f80fd5b82356001600160401b038111156127da575f80fd5b8301606081860312156127eb575f80fd5b91506127f960208401612799565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061283a57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161286260408401826001600160a01b03169052565b50606083015161287d60608401826001600160401b03169052565b50608083015161289860808401826001600160401b03169052565b5060a08301516128b360a08401826001600160401b03169052565b5060c08301516128ce60c08401826001600160401b03169052565b5060e08301516128e960e08401826001600160401b03169052565b5092915050565b5f60208284031215612900575f80fd5b813561274281612749565b5f5b8381101561292557818101518382015260200161290d565b50505f910152565b602081525f825180602084015261294b81604085016020870161290b565b601f01601f19169190910160400192915050565b5f6020828403121561296f575f80fd5b5051919050565b600181811c9082168061298a57607f821691505b6020821081036129a857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612a0781612976565b806020870152604060018084165f8114612a285760018114612a4457612a71565b60ff19851660408a0152604084151560051b8a01019550612a71565b895f5260205f205f5b85811015612a685781548b8201860152908301908801612a4d565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105e0576105e0612a93565b80820281158282048414176105e0576105e0612a93565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105e0576105e0612a93565b5f60208284031215612b08575f80fd5b6105dd82612799565b5f808335601e19843603018112612b26575f80fd5b8301803591506001600160401b03821115612b3f575f80fd5b602001915036819003821315612b53575f80fd5b9250929050565b601f8211156108be57805f5260205f20601f840160051c81016020851015612b7f5750805b601f840160051c820191505b81811015612b9e575f8155600101612b8b565b5050505050565b81516001600160401b03811115612bbe57612bbe612a7f565b612bd281612bcc8454612976565b84612b5a565b602080601f831160018114612c05575f8415612bee5750858301515b5f19600386901b1c1916600185901b178555612c5c565b5f85815260208120601f198616915b82811015612c3357888601518255948401946001909101908401612c14565b5085821015612c5057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b0381118282101715612c8657612c86612a7f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612cb457612cb4612a7f565b604052919050565b805180151581146127af575f80fd5b5f8060408385031215612cdc575f80fd5b82516001600160401b0380821115612cf2575f80fd5b9084019060608287031215612d05575f80fd5b612d0d612c64565b82518152602080840151612d2081612749565b82820152604084015183811115612d35575f80fd5b80850194505087601f850112612d49575f80fd5b835183811115612d5b57612d5b612a7f565b612d6d601f8201601f19168301612c8c565b93508084528882828701011115612d82575f80fd5b612d918183860184880161290b565b50826040830152819550612da6818801612cbc565b9450505050509250929050565b5f8251612dc481846020870161290b565b9190910192915050565b5f6001600160401b03808316818103612de957612de9612a93565b6001019392505050565b5f60208284031215612e03575f80fd5b813560ff81168114612742575f80fd5b6001600160401b038181168382160190808211156128e9576128e9612a93565b6001600160401b03818116838216028082169190828114612e5657612e56612a93565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + ABI: "[{\"type\":\"constructor\",\"inputs\":[{\"name\":\"init\",\"type\":\"uint8\",\"internalType\":\"enumICMInitializable\"}],\"stateMutability\":\"nonpayable\"},{\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161311238038061311283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612fc58061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c806397fb70d411610093578063c974d1b611610063578063c974d1b61461025c578063d5f20ff614610276578063df93d8de14610296578063f2fde38b146102a0575f80fd5b806397fb70d414610215578063a3a65e4814610228578063b771b3bc1461023b578063bee0a03f14610249575f80fd5b806366435abf116100ce57806366435abf1461018b578063715018a6146101b65780638994ab49146101be5780638da5cb5b146101d1575f80fd5b80630322ed98146100ff5780630cdd098514610114578063467ef06f14610165578063580a400614610178575b5f80fd5b61011261010d366004612809565b6102b3565b005b610152610122366004612809565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610112610173366004612820565b610488565b61011261018636600461285e565b610495565b61019e610199366004612809565b6105a3565b6040516001600160401b03909116815260200161015c565b6101126105b7565b6101526101cc3660046128b5565b6105ca565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b610112610223366004612809565b6105e6565b610112610236366004612820565b6105f2565b6101fd6005600160991b0181565b610112610257366004612809565b6107af565b610264601481565b60405160ff909116815260200161015c565b610289610284366004612809565b6108c3565b60405161015c9190612917565b61019e6202a30081565b6101126102ae3660046129f1565b6109a2565b5f8181525f80516020612f9983398151915260205260408082208151610100810190925280545f80516020612f7983398151915293929190829060ff16600581111561030157610301612903565b600581111561031257610312612903565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561039757610397612903565b146104015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104268584608001515f6109dc565b6040518263ffffffff1660e01b81526004016104429190612a2e565b6020604051808303815f875af115801561045e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104829190612a60565b50505050565b61049181610bf9565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104d95750825b90505f826001600160401b031660011480156104f45750303b155b905081158015610502575080155b156105205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561054a57845460ff60401b1916600160401b1785555b6105548787610f6c565b831561059a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105ad826108c3565b60a0015192915050565b6105bf610f86565b6105c85f610fe1565b565b5f6105d3610f86565b6105dd8383611051565b90505b92915050565b6105ef8161158b565b50565b5f80516020612f798339815191525f61060a836118a4565b90505f8061061b8360400151611a85565b915091508061067d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f8565b5f8281526007850160205260408120805461069790612a77565b90501180156106c9575060015f83815260088601602052604090205460ff1660058111156106c7576106c7612903565b145b6106e55760405162461bcd60e51b81526004016103f890612aaf565b5f82815260078501602052604081206106fd91612776565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612f798339815191529291906107f790612a77565b9050118015610829575060015f83815260088301602052604090205460ff16600581111561082757610827612903565b145b6108455760405162461bcd60e51b81526004016103f890612aaf565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087e9190600401612af6565b6020604051808303815f875af115801561089a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108be9190612a60565b505050565b6108cb6127ad565b5f8281525f80516020612f998339815191526020526040908190208151610100810190925280545f80516020612f79833981519152929190829060ff16600581111561091957610919612903565b600581111561092a5761092a612903565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6109aa610f86565b6001600160a01b0381166109d357604051631e4fbdf760e01b81525f60048201526024016103f8565b6105ef81610fe1565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a5557610a15816001612ba8565b610a20906008612bbb565b5081515f90839083908110610a3757610a37612bd2565b60200101906001600160f81b03191690815f1a905350600101610a01565b505f5b6004811015610ab857610a6c816003612ba8565b610a77906008612bbb565b6001901c60f81b82610a8a836002612be6565b81518110610a9a57610a9a612bd2565b60200101906001600160f81b03191690815f1a905350600101610a58565b505f5b6020811015610b1a57610acf81601f612ba8565b610ada906008612bbb565b86901c60f81b82610aec836006612be6565b81518110610afc57610afc612bd2565b60200101906001600160f81b03191690815f1a905350600101610abb565b505f5b6008811015610b8557610b31816007612ba8565b610b3c906008612bbb565b6001600160401b038616901c60f81b82610b57836026612be6565b81518110610b6757610b67612bd2565b60200101906001600160f81b03191690815f1a905350600101610b1d565b505f5b6008811015610bf057610b9c816007612ba8565b610ba7906008612bbb565b6001600160401b038516901c60f81b82610bc283602e612be6565b81518110610bd257610bd2612bd2565b60200101906001600160f81b03191690815f1a905350600101610b88565b50949350505050565b610c016127ad565b5f80516020612f798339815191525f610c19846118a4565b90505f80610c2a8360400151611a85565b915091508015610c8f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610cc157610cc1612903565b6005811115610cd257610cd2612903565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d5957610d59612903565b1480610d775750600182516005811115610d7557610d75612903565b145b610dd65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103f8565b600382516005811115610deb57610deb612903565b03610df857506004610dfc565b5060055b6020808301515f90815260098801909152604081205581816005811115610e2557610e25612903565b90816005811115610e3857610e38612903565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610e6c57610e6c612903565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610f3757610f37612903565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610f74611ce4565b610f7d82611d2d565b61049181611d4e565b33610fb87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c85760405163118cdaa760e01b81523360048201526024016103f8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612f79833981519152426110716040860160208701612bf9565b6001600160401b0316116110e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103f8565b6110f36040850160208601612bf9565b6001600160401b03166111096202a30042612be6565b1161117c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103f8565b83356111d45760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f8565b83355f908152600982016020526040902054156112445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f8565b6112516040850185612c12565b90506030146112b85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f8565b6112c183611d5f565b5f8061135b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906113069190612bf9565b6001600160401b0316815260200161132160408a018a612c12565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611d6a565b5f828152600786016020526040902091935091506113798282612c9f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113a6908590600401612a2e565b6020604051808303815f875af11580156113c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e69190612a60565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561146857611468612903565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161155d91908e01908e01612bf9565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612f9983398151915260205260408082208151610100810190925280545f80516020612f7983398151915293929190829060ff1660058111156115d9576115d9612903565b60058111156115ea576115ea612903565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561167257611672612903565b146116ce5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f8565b60408101516001600160a01b0316336001600160a01b0316146117485760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103f8565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561178c5761178c612903565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61184f848261210f565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b60408051606080820183525f8083526020830181905292820152905f80516020612f798339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611919573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119409190810190612dc5565b91509150806119a75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f8565b8254825114611a0a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103f8565b60208201516001600160a01b031615611a7d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103f8565b509392505050565b5f808251602714611aea5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103f8565b5f805b6002811015611b3957611b01816001612ba8565b611b0c906008612bbb565b61ffff16858281518110611b2257611b22612bd2565b016020015160f81c901b9190911790600101611aed565b5061ffff811615611b985760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103f8565b5f805b6004811015611bf357611baf816003612ba8565b611bba906008612bbb565b63ffffffff1686611bcc836002612be6565b81518110611bdc57611bdc612bd2565b016020015160f81c901b9190911790600101611b9b565b5063ffffffff8116600214611c5a5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103f8565b5f805b6020811015611caf57611c7181601f612ba8565b611c7c906008612bbb565b87611c88836006612be6565b81518110611c9857611c98612bd2565b016020015160f81c901b9190911790600101611c5d565b505f86602681518110611cc457611cc4612bd2565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c857604051631afcd79f60e31b815260040160405180910390fd5b611d35611ce4565b611d3d612295565b611d456122a5565b6105ef816122ad565b611d56611ce4565b6105ef8161245a565b6105ef816001612462565b5f6060826080015151603014611dd45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e4b57611e0b816001612ba8565b611e16906008612bbb565b5081515f90839083908110611e2d57611e2d612bd2565b60200101906001600160f81b03191690815f1a905350600101611df7565b505f5b6004811015611ea957611e62816003612ba8565b611e6d906008612bbb565b505f82611e7b836002612be6565b81518110611e8b57611e8b612bd2565b60200101906001600160f81b03191690815f1a905350600101611e4e565b505f5b6020811015611f065784518160208110611ec857611ec8612bd2565b1a60f81b82611ed8836006612be6565b81518110611ee857611ee8612bd2565b60200101906001600160f81b03191690815f1a905350600101611eac565b505f5b6020811015611f665784602001518160208110611f2857611f28612bd2565b1a60f81b82611f38836026612be6565b81518110611f4857611f48612bd2565b60200101906001600160f81b03191690815f1a905350600101611f09565b505f5b6008811015611fda57611f7d816007612ba8565b611f88906008612bbb565b60ff1685604001516001600160401b0316901c60f81b82826046611fac9190612be6565b81518110611fbc57611fbc612bd2565b60200101906001600160f81b03191690815f1a905350600101611f69565b505f5b60308110156120455784608001518181518110611ffc57611ffc612bd2565b01602001516001600160f81b0319168261201783604e612be6565b8151811061202757612027612bd2565b60200101906001600160f81b03191690815f1a905350600101611fdd565b505f5b60088110156120b75761205c816007612ba8565b612067906008612bbb565b60608601516001600160401b0390811691161c60f81b8261208983607e612be6565b8151811061209957612099612bd2565b60200101906001600160f81b03191690815f1a905350600101612048565b506002816040516120c89190612ead565b602060405180830381855afa1580156120e3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906121069190612a60565b94909350915050565b5f8281525f80516020612f99833981519152602052604081206003015481905f80516020612f7983398151915290600160401b90046001600160401b03908116908516811161216f5761216a6121658287612ec8565b611d5f565b612181565b61218161217c8683612ec8565b6126bc565b5f61218b876126c6565b5f888152600885016020526040812060030180546fffffffffffffffff00000000000000001916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6121e08a858b6109dc565b6040518263ffffffff1660e01b81526004016121fc9190612a2e565b6020604051808303815f875af1158015612218573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223c9190612a60565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b61229d611ce4565b6105c8612748565b6105c8611ce4565b6122b5611ce4565b80355f80516020612f7983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146123016080840160608501612ee8565b60ff16111561236e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103f8565b5f61237f6080840160608501612ee8565b60ff16116123e75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103f8565b6123f76080830160608401612ee8565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556124286060830160408401612bf9565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6109aa611ce4565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020612f79833981519152914291901580612548575060028301548151612544916001600160401b031690612be6565b8210155b1561256e576001600160401b03851660608201528181526040810151602082015261258d565b84816060018181516125809190612f08565b6001600160401b03169052505b606081015161259d906064612f28565b602082015160028501546001600160401b0392909216916125c89190600160401b900460ff16612bbb565b101561262c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103f8565b831561265557846001600160401b03168160400181815161264d9190612be6565b905250612674565b846001600160401b0316816040018181516126709190612ba8565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b6105ef815f612462565b5f8181525f80516020612f998339815191526020526040812060030180545f80516020612f79833981519152916001600160401b03909116908361270983612f53565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b612750611ce4565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50805461278290612a77565b5f825580601f10612791575050565b601f0160209004905f5260205f20908101906105ef91906127f1565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612805575f81556001016127f2565b5090565b5f60208284031215612819575f80fd5b5035919050565b5f60208284031215612830575f80fd5b813563ffffffff81168114612843575f80fd5b9392505050565b6001600160a01b03811681146105ef575f80fd5b5f8082840360a0811215612870575f80fd5b608081121561287d575f80fd5b50829150608083013561288f8161284a565b809150509250929050565b80356001600160401b03811681146128b0575f80fd5b919050565b5f80604083850312156128c6575f80fd5b82356001600160401b038111156128db575f80fd5b8301606081860312156128ec575f80fd5b91506128fa6020840161289a565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061293b57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161296360408401826001600160a01b03169052565b50606083015161297e60608401826001600160401b03169052565b50608083015161299960808401826001600160401b03169052565b5060a08301516129b460a08401826001600160401b03169052565b5060c08301516129cf60c08401826001600160401b03169052565b5060e08301516129ea60e08401826001600160401b03169052565b5092915050565b5f60208284031215612a01575f80fd5b81356128438161284a565b5f5b83811015612a26578181015183820152602001612a0e565b50505f910152565b602081525f8251806020840152612a4c816040850160208701612a0c565b601f01601f19169190910160400192915050565b5f60208284031215612a70575f80fd5b5051919050565b600181811c90821680612a8b57607f821691505b602082108103612aa957634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612b0881612a77565b806020870152604060018084165f8114612b295760018114612b4557612b72565b60ff19851660408a0152604084151560051b8a01019550612b72565b895f5260205f205f5b85811015612b695781548b8201860152908301908801612b4e565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105e0576105e0612b94565b80820281158282048414176105e0576105e0612b94565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105e0576105e0612b94565b5f60208284031215612c09575f80fd5b6105dd8261289a565b5f808335601e19843603018112612c27575f80fd5b8301803591506001600160401b03821115612c40575f80fd5b60200191503681900382131561228e575f80fd5b601f8211156108be57805f5260205f20601f840160051c81016020851015612c795750805b601f840160051c820191505b81811015612c98575f8155600101612c85565b5050505050565b81516001600160401b03811115612cb857612cb8612b80565b612ccc81612cc68454612a77565b84612c54565b602080601f831160018114612cff575f8415612ce85750858301515b5f19600386901b1c1916600185901b178555612d56565b5f85815260208120601f198616915b82811015612d2d57888601518255948401946001909101908401612d0e565b5085821015612d4a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b0381118282101715612d8057612d80612b80565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612dae57612dae612b80565b604052919050565b805180151581146128b0575f80fd5b5f8060408385031215612dd6575f80fd5b82516001600160401b0380821115612dec575f80fd5b9084019060608287031215612dff575f80fd5b612e07612d5e565b82518152602080840151612e1a8161284a565b82820152604084015183811115612e2f575f80fd5b80850194505087601f850112612e43575f80fd5b835183811115612e5557612e55612b80565b612e67601f8201601f19168301612d86565b93508084528882828701011115612e7c575f80fd5b612e8b81838601848801612a0c565b50826040830152819550612ea0818801612db6565b9450505050509250929050565b5f8251612ebe818460208701612a0c565b9190910192915050565b6001600160401b038281168282160390808211156129ea576129ea612b94565b5f60208284031215612ef8575f80fd5b813560ff81168114612843575f80fd5b6001600160401b038181168382160190808211156129ea576129ea612b94565b6001600160401b03818116838216028082169190828114612f4b57612f4b612b94565b505092915050565b5f6001600160401b03808316818103612f6e57612f6e612b94565b600101939250505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -1539,3 +1539,158 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorRemovalIn event.Raw = log return event, nil } + +// PoAValidatorManagerValidatorWeightUpdateIterator is returned from FilterValidatorWeightUpdate and is used to iterate over the raw logs and unpacked data for ValidatorWeightUpdate events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidatorWeightUpdateIterator struct { + Event *PoAValidatorManagerValidatorWeightUpdate // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidatorWeightUpdate represents a ValidatorWeightUpdate event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidatorWeightUpdate struct { + ValidationID [32]byte + Nonce uint64 + ValidatorWeight uint64 + SetWeightMessageID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*PoAValidatorManagerValidatorWeightUpdateIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidatorWeightUpdateIterator{contract: _PoAValidatorManager.contract, event: "ValidatorWeightUpdate", logs: logs, sub: sub}, nil +} + +// WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidatorWeightUpdate) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*PoAValidatorManagerValidatorWeightUpdate, error) { + event := new(PoAValidatorManagerValidatorWeightUpdate) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index b1af8b3cd..2478dca6d 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -229,9 +229,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validator.status == ValidatorStatus.Active, "PoSValidatorManager: validator not active" ); - // Check that adding this delegator would not exceed the maximum churn rate. - _checkAndUpdateChurnTrackerAddition(weight); - // Update the validator weight uint64 newValidatorWeight = validator.weight + weight; require( @@ -343,12 +340,6 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager delegator.status = DelegatorStatus.PendingRemoved; if (validator.status == ValidatorStatus.Active) { - // Check that removing this delegator would not exceed the maximum churn rate. - // We only need to check this is the validator is still active. If the validator ends its validation - // period, the weight of all its delegators will be added to the churn tracker at that time. Ending - // a delegation whose validator has ended validating has no impact on the stake weight of the chain. - _checkAndUpdateChurnTrackerRemoval(delegator.weight); - uint64 newValidatorWeight = validator.weight - delegator.weight; (delegator.endingNonce,) = _setValidatorWeight(validationID, newValidatorWeight); diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index ddc40eb1c..be5ca7392 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -247,9 +247,6 @@ abstract contract ValidatorManager is ); require(_msgSender() == validator.owner, "ValidatorManager: sender not validator owner"); - // Check that removing this delegator would not exceed the maximum churn rate. - _checkAndUpdateChurnTrackerRemoval(validator.weight); - // Update the validator status to pending removal. // They are not removed from the active validators mapping until the P-Chain acknowledges the removal. validator.status = ValidatorStatus.PendingRemoved; @@ -262,11 +259,7 @@ abstract contract ValidatorManager is // TODO: Optimize storage writes here (probably don't need to write the whole value). $._validationPeriods[validationID] = validator; - // Submit the message to the Warp precompile. - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, _incrementAndGetNonce(validationID), 0); - - bytes32 messageID = WARP_MESSENGER.sendWarpMessage(setValidatorWeightPayload); + (, bytes32 messageID) = _setValidatorWeight(validationID, 0); // Emit the event to signal the start of the validator removal process. emit ValidatorRemovalInitialized(validationID, messageID, validator.weight, block.timestamp); @@ -378,22 +371,31 @@ abstract contract ValidatorManager is function _setValidatorWeight( bytes32 validationID, - uint64 weight + uint64 newWeight ) internal returns (uint64, bytes32) { + ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + uint64 validatorWeight = $._validationPeriods[validationID].weight; + + // Check that removing this delegator would not exceed the maximum churn rate. + if (newWeight >= validatorWeight) { + _checkAndUpdateChurnTrackerAddition(newWeight - validatorWeight); + } else { + _checkAndUpdateChurnTrackerRemoval(validatorWeight - newWeight); + } + uint64 nonce = _incrementAndGetNonce(validationID); - ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - $._validationPeriods[validationID].weight = weight; + $._validationPeriods[validationID].weight = newWeight; // Submit the message to the Warp precompile. bytes32 messageID = WARP_MESSENGER.sendWarpMessage( - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, nonce, weight) + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, nonce, newWeight) ); emit ValidatorWeightUpdate({ validationID: validationID, nonce: nonce, - validatorWeight: weight, + validatorWeight: newWeight, setWeightMessageID: messageID }); From 2faa0af5ee6c40eaf4d0fcf438b5a9eccf1c1092 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 10:33:59 -0400 Subject: [PATCH 320/545] Simplify churn tracking --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- contracts/staking/ValidatorManager.sol | 43 ++++++------------- 4 files changed, 17 insertions(+), 32 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 2be814453..a63c24f7a 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516151fe3803806151fe83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150b18061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f3660046145bb565b610357565b005b6101546101643660046145f6565b61070e565b6101a76101773660046145f6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e23660046145f6565b6108de565b6040516001600160401b0390911681526020016101b1565b61015461020d366004614621565b6108f4565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c36600461465f565b6109d3565b61015461024f366004614678565b6109fe565b6101a76102623660046146b4565b610bce565b6101e76102753660046145f6565b610be7565b6101546102883660046145bb565b610bfb565b61015461029b366004614678565b610cdb565b6101a76102ae3660046146cf565b610eea565b6101a76102c13660046146ef565b610efd565b6101546102d436600461465f565b610f29565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d3660046145f6565b6110e6565b6101546103203660046145f6565b61136c565b6101c2601481565b61034061033b3660046145f6565b611480565b6040516101b19190614764565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206150058339815191529184156103a9576103a6828561155f565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db614750565b60048111156103ec576103ec614750565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61046884611480565b905060028251600481111561047f5761047f614750565b146104d15760405162461bcd60e51b815260206004820152602a60248201525f805160206150258339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105365760405162461bcd60e51b815260206004820152603360248201525f805160206150258339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c8565b600382528051600290600581111561055057610550614750565b03610594575f82606001518260a0015161056a9190614852565b905061057685826117fb565b506001600160401b0390811660e0850152421660a0840152506105b7565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156105e8576105e8614750565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916106fc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061508583398151915260205260408082208151610100810190925280545f8051602061504583398151915293929190829060ff16600581111561075c5761075c614750565b600581111561076d5761076d614750565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156107f2576107f2614750565b146108575760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb61087c8584608001515f61197c565b6040518263ffffffff1660e01b81526004016108989190614894565b6020604051808303815f875af11580156108b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108d891906148c6565b50505050565b5f6108ee64e8d4a51000836148dd565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061093d575080546001600160401b03808416911610155b1561095b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109868484611b99565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109dd82611bb3565b90506109fa81606001516001600160401b03168260400151611f26565b5050565b5f805160206150058339815191525f610a1684611f5c565b90505f80610a27836040015161213d565b50915091505f610a3683611480565b9050816001600160401b031681608001516001600160401b03161015610a6e5760405162461bcd60e51b81526004016104c8906148fc565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ab35760405162461bcd60e51b81526004016104c89061493e565b60015f87815260068701602052604090205460ff166004811115610ad957610ad9614750565b14610b425760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6108ee6001600160401b03831664e8d4a51000614987565b5f610bf182611480565b60a0015192915050565b5f805160206150058339815191525f610c1385611480565b5f86815260058401602052604090205460c0820151919250610c4591620100009091046001600160401b03169061499e565b6001600160401b0316421015610cb95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c8565b8315610ccb57610cc9858461155f565b505b610cd485612378565b5050505050565b5f805160206150058339815191525f610cf384611f5c565b90505f80610d04836040015161213d565b50915091505f610d1383611480565b9050816001600160401b031681608001516001600160401b03161015610d4b5760405162461bcd60e51b81526004016104c8906148fc565b5f8681526006860160205260409020600301546001600160401b0380841691161115610d895760405162461bcd60e51b81526004016104c89061493e565b60035f87815260068701602052604090205460ff166004811115610daf57610daf614750565b14610e035760405162461bcd60e51b815260206004820152603160248201525f805160206150258339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610ea891611f26565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610ef6833384612691565b9392505050565b5f610f066129fd565b610f11848484612a34565b9050610ef660015f8051602061506583398151915255565b5f805160206150458339815191525f610f4183611f5c565b90505f80610f528360400151612c6d565b9150915080610fb45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c8565b5f82815260078501602052604081208054610fce906149be565b9050118015611000575060015f83815260088601602052604090205460ff166005811115610ffe57610ffe614750565b145b61101c5760405162461bcd60e51b81526004016104c8906149f6565b5f828152600785016020526040812061103491614503565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061500583398151915293929190829060ff16600481111561114757611147614750565b600481111561115857611158614750565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156111df576111df614750565b14806111fd57506003815160048111156111fb576111fb614750565b145b6112515760405162461bcd60e51b815260206004820152603260248201525f80516020615025833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c8565b5f61125f8260400151611480565b905080608001516001600160401b03165f036112e35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb611310846040015184608001518560a0015161197c565b6040518263ffffffff1660e01b815260040161132c9190614894565b6020604051808303815f875af1158015611348573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd491906148c6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206150458339815191529291906113b4906149be565b90501180156113e6575060015f83815260088301602052604090205460ff1660058111156113e4576113e4614750565b145b6114025760405162461bcd60e51b81526004016104c8906149f6565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161143b9190600401614a3d565b6020604051808303815f875af1158015611457573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147b91906148c6565b505050565b61148861453a565b5f8281525f805160206150858339815191526020526040908190208151610100810190925280545f80516020615045833981519152929190829060ff1660058111156114d6576114d6614750565b60058111156114e7576114e7614750565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115d19190810190614b3e565b91509150806116345760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169b91906148c6565b8251146116ff5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c8565b60208201516001600160a01b0316156117755760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c8565b5f806117848460400151612e0e565b915091508187146117f15760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c8565b9695505050505050565b5f8281525f80516020615085833981519152602052604081206003015481905f8051602061504583398151915290600160401b90046001600160401b03908116908516811161185b576118566118518287614852565b612fe6565b61186d565b61186d6118688683614852565b612ff4565b5f61187787612ffe565b5f8881526008850160205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6118c78a858b61197c565b6040518263ffffffff1660e01b81526004016118e39190614894565b6020604051808303815f875af11580156118ff573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061192391906148c6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119f5576119b5816001614c26565b6119c0906008614987565b5081515f908390839081106119d7576119d7614c39565b60200101906001600160f81b03191690815f1a9053506001016119a1565b505f5b6004811015611a5857611a0c816003614c26565b611a17906008614987565b6001901c60f81b82611a2a836002614c4d565b81518110611a3a57611a3a614c39565b60200101906001600160f81b03191690815f1a9053506001016119f8565b505f5b6020811015611aba57611a6f81601f614c26565b611a7a906008614987565b86901c60f81b82611a8c836006614c4d565b81518110611a9c57611a9c614c39565b60200101906001600160f81b03191690815f1a905350600101611a5b565b505f5b6008811015611b2557611ad1816007614c26565b611adc906008614987565b6001600160401b038616901c60f81b82611af7836026614c4d565b81518110611b0757611b07614c39565b60200101906001600160f81b03191690815f1a905350600101611abd565b505f5b6008811015611b9057611b3c816007614c26565b611b47906008614987565b6001600160401b038516901c60f81b82611b6283602e614c4d565b81518110611b7257611b72614c39565b60200101906001600160f81b03191690815f1a905350600101611b28565b50949350505050565b611ba1613080565b611baa826130cb565b6109fa81613137565b611bbb61453a565b5f805160206150458339815191525f611bd384611f5c565b90505f80611be48360400151612c6d565b915091508015611c495760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611c7b57611c7b614750565b6005811115611c8c57611c8c614750565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611d1357611d13614750565b1480611d315750600182516005811115611d2f57611d2f614750565b145b611d905760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c8565b600382516005811115611da557611da5614750565b03611db257506004611db6565b5060055b6020808301515f90815260098801909152604081205581816005811115611ddf57611ddf614750565b90816005811115611df257611df2614750565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611e2657611e26614750565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ef157611ef1614750565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546109fa906001600160a01b031682846131eb565b60408051606080820183525f8083526020830181905292820152905f805160206150458339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fd1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ff89190810190614b3e565b915091508061205f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c8565b82548251146120c25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c8565b60208201516001600160a01b0316156121355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c8565b509392505050565b5f805f83516036146121615760405162461bcd60e51b81526004016104c890614c60565b5f805b60028110156121b057612178816001614c26565b612183906008614987565b61ffff1686828151811061219957612199614c39565b016020015160f81c901b9190911790600101612164565b5061ffff8116156121d35760405162461bcd60e51b81526004016104c890614ca9565b5f805b600481101561222e576121ea816003614c26565b6121f5906008614987565b63ffffffff1687612207836002614c4d565b8151811061221757612217614c39565b016020015160f81c901b91909117906001016121d6565b5063ffffffff81166003146122555760405162461bcd60e51b81526004016104c890614cec565b5f805b60208110156122aa5761226c81601f614c26565b612277906008614987565b88612283836006614c4d565b8151811061229357612293614c39565b016020015160f81c901b9190911790600101612258565b505f805b6008811015612309576122c2816007614c26565b6122cd906008614987565b6001600160401b0316896122e2836026614c4d565b815181106122f2576122f2614c39565b016020015160f81c901b91909117906001016122ae565b505f805b600881101561236857612321816007614c26565b61232c906008614987565b6001600160401b03168a61234183602e614c4d565b8151811061235157612351614c39565b016020015160f81c901b919091179060010161230d565b5091989097509095509350505050565b5f8181525f8051602061508583398151915260205260408082208151610100810190925280545f8051602061504583398151915293929190829060ff1660058111156123c6576123c6614750565b60058111156123d7576123d7614750565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561245f5761245f614750565b146124bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c8565b60408101516001600160a01b0316336001600160a01b0316146125355760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c8565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561257957612579614750565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61263c84826117fb565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f61269a6129fd565b5f805160206150058339815191525f6126b56101e28561324a565b90505f6126c187611480565b90506002815160058111156126d8576126d8614750565b146127375760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c8565b5f828260a00151612748919061499e565b6004850154606084015191925061276a916001600160401b0390911690614d33565b6001600160401b0316816001600160401b031611156127e95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c8565b5f806127f58a846117fb565b915091505f8a8360405160200161282392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156128be576128be614750565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050610ef660015f8051602061506583398151915255565b5f80516020615065833981519152805460011901612a2e57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615005833981519152906001600160401b0316612a8060408601602087016146b4565b6001600160401b03161015612aef5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c8565b6003810154612b016020860186614d6d565b61ffff1610158015612b255750612710612b1e6020860186614d6d565b61ffff1611155b612b415760405162461bcd60e51b81526004016104c890614d88565b8054831015612ba45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c8565b8060010154831115612c0b5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c8565b5f612c158461324a565b90505f612c21826108de565b90505f612c2e8883613280565b5f81815260058601602052604090209091508790612c4c8282614dd3565b509098975050505050505050565b60015f8051602061506583398151915255565b5f808251602714612c905760405162461bcd60e51b81526004016104c890614c60565b5f805b6002811015612cdf57612ca7816001614c26565b612cb2906008614987565b61ffff16858281518110612cc857612cc8614c39565b016020015160f81c901b9190911790600101612c93565b5061ffff811615612d025760405162461bcd60e51b81526004016104c890614ca9565b5f805b6004811015612d5d57612d19816003614c26565b612d24906008614987565b63ffffffff1686612d36836002614c4d565b81518110612d4657612d46614c39565b016020015160f81c901b9190911790600101612d05565b5063ffffffff8116600214612d845760405162461bcd60e51b81526004016104c890614cec565b5f805b6020811015612dd957612d9b81601f614c26565b612da6906008614987565b87612db2836006614c4d565b81518110612dc257612dc2614c39565b016020015160f81c901b9190911790600101612d87565b505f86602681518110612dee57612dee614c39565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e315760405162461bcd60e51b81526004016104c890614c60565b5f805b6002811015612e8057612e48816001614c26565b612e53906008614987565b61ffff16858281518110612e6957612e69614c39565b016020015160f81c901b9190911790600101612e34565b5061ffff811615612ea35760405162461bcd60e51b81526004016104c890614ca9565b5f805b6004811015612efe57612eba816003614c26565b612ec5906008614987565b63ffffffff1686612ed7836002614c4d565b81518110612ee757612ee7614c39565b016020015160f81c901b9190911790600101612ea6565b5063ffffffff8116600414612f255760405162461bcd60e51b81526004016104c890614cec565b5f805b6020811015612f7a57612f3c81601f614c26565b612f47906008614987565b87612f53836006614c4d565b81518110612f6357612f63614c39565b016020015160f81c901b9190911790600101612f28565b505f805b6008811015612fd957612f92816007614c26565b612f9d906008614987565b6001600160401b031688612fb2836026614c4d565b81518110612fc257612fc2614c39565b016020015160f81c901b9190911790600101612f7e565b5090969095509350505050565b612ff18160016137ba565b50565b612ff1815f6137ba565b5f8181525f805160206150858339815191526020526040812060030180545f80516020615045833981519152916001600160401b03909116908361304183614e29565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166130c957604051631afcd79f60e31b815260040160405180910390fd5b565b6130d3613080565b6130dc81613a14565b612ff1608082013560a08301356130f960e0850160c086016146b4565b61310a610100860160e08701614d6d565b61ffff1661312061012087016101008801614e4e565b61313261014088016101208901614e6e565b613a35565b61313f613080565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166131cb5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261147b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613c79565b5f6108ee827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613cda565b5f5f80516020615045833981519152426132a060408601602087016146b4565b6001600160401b0316116133125760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c8565b61332260408501602086016146b4565b6001600160401b03166133386202a30042614c4d565b116133ab5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c8565b83356134035760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c8565b83355f908152600982016020526040902054156134735760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c8565b6134806040850185614e89565b90506030146134e75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c8565b6134f083612fe6565b5f8061358a6040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061353591906146b4565b6001600160401b0316815260200161355060408a018a614e89565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613e3c565b5f828152600786016020526040902091935091506135a88282614f0f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906135d5908590600401614894565b6020604051808303815f875af11580156135f1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061361591906148c6565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561369757613697614750565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161378c91908e01908e016146b4565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206150458339815191529142919015806138a057506002830154815161389c916001600160401b031690614c4d565b8210155b156138c6576001600160401b0385166060820152818152604081015160208201526138e5565b84816060018181516138d8919061499e565b6001600160401b03169052505b60608101516138f5906064614d33565b602082015160028501546001600160401b0392909216916139209190600160401b900460ff16614987565b10156139845760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c8565b83156139ad57846001600160401b0316816040018181516139a59190614c4d565b9052506139cc565b846001600160401b0316816040018181516139c89190614c26565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b613a1c613080565b613a246141e1565b613a2c6141f1565b612ff1816141f9565b613a3d613080565b5f8051602061500583398151915283613aa95760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c8565b612710841115613acb5760405162461bcd60e51b81526004016104c890614d88565b85871115613b335760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c8565b5f8360ff1611613ba05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c8565b600a60ff84161115613c125760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c8565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613c8d6001600160a01b038416836143a6565b905080515f14158015613cb1575080806020019051810190613caf9190614fce565b155b1561147b57604051635274afe760e01b81526001600160a01b03841660048201526024016104c8565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613d20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d4491906148c6565b9050613d5b6001600160a01b0385163330866143b3565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613d9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dc391906148c6565b9050818111613e295760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c8565b613e338282614c26565b95945050505050565b5f6060826080015151603014613ea65760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613f1d57613edd816001614c26565b613ee8906008614987565b5081515f90839083908110613eff57613eff614c39565b60200101906001600160f81b03191690815f1a905350600101613ec9565b505f5b6004811015613f7b57613f34816003614c26565b613f3f906008614987565b505f82613f4d836002614c4d565b81518110613f5d57613f5d614c39565b60200101906001600160f81b03191690815f1a905350600101613f20565b505f5b6020811015613fd85784518160208110613f9a57613f9a614c39565b1a60f81b82613faa836006614c4d565b81518110613fba57613fba614c39565b60200101906001600160f81b03191690815f1a905350600101613f7e565b505f5b60208110156140385784602001518160208110613ffa57613ffa614c39565b1a60f81b8261400a836026614c4d565b8151811061401a5761401a614c39565b60200101906001600160f81b03191690815f1a905350600101613fdb565b505f5b60088110156140ac5761404f816007614c26565b61405a906008614987565b60ff1685604001516001600160401b0316901c60f81b8282604661407e9190614c4d565b8151811061408e5761408e614c39565b60200101906001600160f81b03191690815f1a90535060010161403b565b505f5b603081101561411757846080015181815181106140ce576140ce614c39565b01602001516001600160f81b031916826140e983604e614c4d565b815181106140f9576140f9614c39565b60200101906001600160f81b03191690815f1a9053506001016140af565b505f5b60088110156141895761412e816007614c26565b614139906008614987565b60608601516001600160401b0390811691161c60f81b8261415b83607e614c4d565b8151811061416b5761416b614c39565b60200101906001600160f81b03191690815f1a90535060010161411a565b5060028160405161419a9190614fe9565b602060405180830381855afa1580156141b5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906141d891906148c6565b94909350915050565b6141e9613080565b6130c96143ec565b6130c9613080565b614201613080565b80355f8051602061504583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461424d6080840160608501614e4e565b60ff1611156142ba5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c8565b5f6142cb6080840160608501614e4e565b60ff16116143335760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c8565b6143436080830160608401614e4e565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561437460608301604084016146b4565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610ef683835f6143f4565b6040516001600160a01b0384811660248301528381166044830152606482018390526108d89186918216906323b872dd90608401613218565b612c5a613080565b6060814710156144195760405163cd78605960e01b81523060048201526024016104c8565b5f80856001600160a01b031684866040516144349190614fe9565b5f6040518083038185875af1925050503d805f811461446e576040519150601f19603f3d011682016040523d82523d5f602084013e614473565b606091505b50915091506117f18683836060826144935761448e826144da565b610ef6565b81511580156144aa57506001600160a01b0384163b155b156144d357604051639996b31560e01b81526001600160a01b03851660048201526024016104c8565b5080610ef6565b8051156144ea5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461450f906149be565b5f825580601f1061451e575050565b601f0160209004905f5260205f2090810190612ff1919061457e565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614592575f815560010161457f565b5090565b8015158114612ff1575f80fd5b803563ffffffff811681146145b6575f80fd5b919050565b5f805f606084860312156145cd575f80fd5b8335925060208401356145df81614596565b91506145ed604085016145a3565b90509250925092565b5f60208284031215614606575f80fd5b5035919050565b6001600160a01b0381168114612ff1575f80fd5b5f80828403610160811215614634575f80fd5b61014080821215614643575f80fd5b84935083013590506146548161460d565b809150509250929050565b5f6020828403121561466f575f80fd5b610ef6826145a3565b5f8060408385031215614689575f80fd5b614692836145a3565b946020939093013593505050565b6001600160401b0381168114612ff1575f80fd5b5f602082840312156146c4575f80fd5b8135610ef6816146a0565b5f80604083850312156146e0575f80fd5b50508035926020909101359150565b5f805f8385036080811215614702575f80fd5b84356001600160401b03811115614717575f80fd5b850160608188031215614728575f80fd5b93506040601f198201121561473b575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061478857634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516147b060408401826001600160a01b03169052565b5060608301516147cb60608401826001600160401b03169052565b5060808301516147e660808401826001600160401b03169052565b5060a083015161480160a08401826001600160401b03169052565b5060c083015161481c60c08401826001600160401b03169052565b5060e083015161483760e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156148375761483761483e565b5f5b8381101561488c578181015183820152602001614874565b50505f910152565b602081525f82518060208401526148b2816040850160208701614872565b601f01601f19169190910160400192915050565b5f602082840312156148d6575f80fd5b5051919050565b5f826148f757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176108ee576108ee61483e565b6001600160401b038181168382160190808211156148375761483761483e565b600181811c908216806149d257607f821691505b6020821081036149f057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614a4f816149be565b806020870152604060018084165f8114614a705760018114614a8c57614ab9565b60ff19851660408a0152604084151560051b8a01019550614ab9565b895f5260205f205f5b85811015614ab05781548b8201860152908301908801614a95565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614afd57614afd614ac7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b2b57614b2b614ac7565b604052919050565b80516145b681614596565b5f8060408385031215614b4f575f80fd5b82516001600160401b0380821115614b65575f80fd5b9084019060608287031215614b78575f80fd5b614b80614adb565b82518152602080840151614b938161460d565b82820152604084015183811115614ba8575f80fd5b80850194505087601f850112614bbc575f80fd5b835183811115614bce57614bce614ac7565b614be0601f8201601f19168301614b03565b93508084528882828701011115614bf5575f80fd5b614c0481838601848801614872565b50826040830152819550614c19818801614b33565b9450505050509250929050565b818103818111156108ee576108ee61483e565b634e487b7160e01b5f52603260045260245ffd5b808201808211156108ee576108ee61483e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614d5657614d5661483e565b505092915050565b61ffff81168114612ff1575f80fd5b5f60208284031215614d7d575f80fd5b8135610ef681614d5e565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614dde81614d5e565b61ffff8116905081548161ffff1982161783556020840135614dff816146a0565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6001600160401b03808316818103614e4457614e4461483e565b6001019392505050565b5f60208284031215614e5e575f80fd5b813560ff81168114610ef6575f80fd5b5f60208284031215614e7e575f80fd5b8135610ef68161460d565b5f808335601e19843603018112614e9e575f80fd5b8301803591506001600160401b03821115614eb7575f80fd5b602001915036819003821315611975575f80fd5b601f82111561147b57805f5260205f20601f840160051c81016020851015614ef05750805b601f840160051c820191505b81811015610cd4575f8155600101614efc565b81516001600160401b03811115614f2857614f28614ac7565b614f3c81614f3684546149be565b84614ecb565b602080601f831160018114614f6f575f8415614f585750858301515b5f19600386901b1c1916600185901b178555614fc6565b5f85815260208120601f198616915b82811015614f9d57888601518255948401946001909101908401614f7e565b5085821015614fba57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614fde575f80fd5b8151610ef681614596565b5f8251614ffa818460208701614872565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161515d38038061515d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150108061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f36600461451a565b610357565b005b610154610164366004614555565b61070e565b6101a7610177366004614555565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e2366004614555565b6108de565b6040516001600160401b0390911681526020016101b1565b61015461020d366004614580565b6108f4565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c3660046145be565b6109d3565b61015461024f3660046145d7565b6109fe565b6101a7610262366004614613565b610bce565b6101e7610275366004614555565b610be7565b61015461028836600461451a565b610bfb565b61015461029b3660046145d7565b610cdb565b6101a76102ae36600461462e565b610eea565b6101a76102c136600461464e565b610efd565b6101546102d43660046145be565b610f29565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d366004614555565b6110e6565b610154610320366004614555565b61136c565b6101c2601481565b61034061033b366004614555565b611480565b6040516101b191906146c3565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614f648339815191529184156103a9576103a6828561155f565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db6146af565b60048111156103ec576103ec6146af565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61046884611480565b905060028251600481111561047f5761047f6146af565b146104d15760405162461bcd60e51b815260206004820152602a60248201525f80516020614f848339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105365760405162461bcd60e51b815260206004820152603360248201525f80516020614f848339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c8565b6003825280516002906005811115610550576105506146af565b03610594575f82606001518260a0015161056a91906147b1565b905061057685826117fb565b506001600160401b0390811660e0850152421660a0840152506105b7565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156105e8576105e86146af565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916106fc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614fe483398151915260205260408082208151610100810190925280545f80516020614fa483398151915293929190829060ff16600581111561075c5761075c6146af565b600581111561076d5761076d6146af565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156107f2576107f26146af565b146108575760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb61087c8584608001515f611952565b6040518263ffffffff1660e01b815260040161089891906147f3565b6020604051808303815f875af11580156108b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108d89190614825565b50505050565b5f6108ee64e8d4a510008361483c565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061093d575080546001600160401b03808416911610155b1561095b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109868484611b6f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109dd82611b89565b90506109fa81606001516001600160401b03168260400151611efc565b5050565b5f80516020614f648339815191525f610a1684611f32565b90505f80610a278360400151612113565b50915091505f610a3683611480565b9050816001600160401b031681608001516001600160401b03161015610a6e5760405162461bcd60e51b81526004016104c89061485b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ab35760405162461bcd60e51b81526004016104c89061489d565b60015f87815260068701602052604090205460ff166004811115610ad957610ad96146af565b14610b425760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6108ee6001600160401b03831664e8d4a510006148e6565b5f610bf182611480565b60a0015192915050565b5f80516020614f648339815191525f610c1385611480565b5f86815260058401602052604090205460c0820151919250610c4591620100009091046001600160401b0316906148fd565b6001600160401b0316421015610cb95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c8565b8315610ccb57610cc9858461155f565b505b610cd48561234e565b5050505050565b5f80516020614f648339815191525f610cf384611f32565b90505f80610d048360400151612113565b50915091505f610d1383611480565b9050816001600160401b031681608001516001600160401b03161015610d4b5760405162461bcd60e51b81526004016104c89061485b565b5f8681526006860160205260409020600301546001600160401b0380841691161115610d895760405162461bcd60e51b81526004016104c89061489d565b60035f87815260068701602052604090205460ff166004811115610daf57610daf6146af565b14610e035760405162461bcd60e51b815260206004820152603160248201525f80516020614f848339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610ea891611efc565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610ef6833384612667565b9392505050565b5f610f066129d3565b610f11848484612a0a565b9050610ef660015f80516020614fc483398151915255565b5f80516020614fa48339815191525f610f4183611f32565b90505f80610f528360400151612c43565b9150915080610fb45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c8565b5f82815260078501602052604081208054610fce9061491d565b9050118015611000575060015f83815260088601602052604090205460ff166005811115610ffe57610ffe6146af565b145b61101c5760405162461bcd60e51b81526004016104c890614955565b5f828152600785016020526040812061103491614462565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f6483398151915293929190829060ff166004811115611147576111476146af565b6004811115611158576111586146af565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156111df576111df6146af565b14806111fd57506003815160048111156111fb576111fb6146af565b145b6112515760405162461bcd60e51b815260206004820152603260248201525f80516020614f84833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c8565b5f61125f8260400151611480565b905080608001516001600160401b03165f036112e35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb611310846040015184608001518560a00151611952565b6040518263ffffffff1660e01b815260040161132c91906147f3565b6020604051808303815f875af1158015611348573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd49190614825565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fa48339815191529291906113b49061491d565b90501180156113e6575060015f83815260088301602052604090205460ff1660058111156113e4576113e46146af565b145b6114025760405162461bcd60e51b81526004016104c890614955565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161143b919060040161499c565b6020604051808303815f875af1158015611457573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147b9190614825565b505050565b611488614499565b5f8281525f80516020614fe48339815191526020526040908190208151610100810190925280545f80516020614fa4833981519152929190829060ff1660058111156114d6576114d66146af565b60058111156114e7576114e76146af565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115d19190810190614a9d565b91509150806116345760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169b9190614825565b8251146116ff5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c8565b60208201516001600160a01b0316156117755760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c8565b5f806117848460400151612de4565b915091508187146117f15760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c8565b9695505050505050565b5f8281525f80516020614fe4833981519152602052604081206003015481905f80516020614fa483398151915290600160401b90046001600160401b03166118438582612fbc565b5f61184d876131b3565b5f8881526008850160205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61189d8a858b611952565b6040518263ffffffff1660e01b81526004016118b991906147f3565b6020604051808303815f875af11580156118d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f99190614825565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119cb5761198b816001614b85565b6119969060086148e6565b5081515f908390839081106119ad576119ad614b98565b60200101906001600160f81b03191690815f1a905350600101611977565b505f5b6004811015611a2e576119e2816003614b85565b6119ed9060086148e6565b6001901c60f81b82611a00836002614bac565b81518110611a1057611a10614b98565b60200101906001600160f81b03191690815f1a9053506001016119ce565b505f5b6020811015611a9057611a4581601f614b85565b611a509060086148e6565b86901c60f81b82611a62836006614bac565b81518110611a7257611a72614b98565b60200101906001600160f81b03191690815f1a905350600101611a31565b505f5b6008811015611afb57611aa7816007614b85565b611ab29060086148e6565b6001600160401b038616901c60f81b82611acd836026614bac565b81518110611add57611add614b98565b60200101906001600160f81b03191690815f1a905350600101611a93565b505f5b6008811015611b6657611b12816007614b85565b611b1d9060086148e6565b6001600160401b038516901c60f81b82611b3883602e614bac565b81518110611b4857611b48614b98565b60200101906001600160f81b03191690815f1a905350600101611afe565b50949350505050565b611b77613235565b611b8082613280565b6109fa816132ef565b611b91614499565b5f80516020614fa48339815191525f611ba984611f32565b90505f80611bba8360400151612c43565b915091508015611c1f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611c5157611c516146af565b6005811115611c6257611c626146af565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ce957611ce96146af565b1480611d075750600182516005811115611d0557611d056146af565b145b611d665760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c8565b600382516005811115611d7b57611d7b6146af565b03611d8857506004611d8c565b5060055b6020808301515f90815260098801909152604081205581816005811115611db557611db56146af565b90816005811115611dc857611dc86146af565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611dfc57611dfc6146af565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ec757611ec76146af565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546109fa906001600160a01b031682846133a3565b60408051606080820183525f8083526020830181905292820152905f80516020614fa48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fa7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fce9190810190614a9d565b91509150806120355760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c8565b82548251146120985760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c8565b60208201516001600160a01b03161561210b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c8565b509392505050565b5f805f83516036146121375760405162461bcd60e51b81526004016104c890614bbf565b5f805b60028110156121865761214e816001614b85565b6121599060086148e6565b61ffff1686828151811061216f5761216f614b98565b016020015160f81c901b919091179060010161213a565b5061ffff8116156121a95760405162461bcd60e51b81526004016104c890614c08565b5f805b6004811015612204576121c0816003614b85565b6121cb9060086148e6565b63ffffffff16876121dd836002614bac565b815181106121ed576121ed614b98565b016020015160f81c901b91909117906001016121ac565b5063ffffffff811660031461222b5760405162461bcd60e51b81526004016104c890614c4b565b5f805b60208110156122805761224281601f614b85565b61224d9060086148e6565b88612259836006614bac565b8151811061226957612269614b98565b016020015160f81c901b919091179060010161222e565b505f805b60088110156122df57612298816007614b85565b6122a39060086148e6565b6001600160401b0316896122b8836026614bac565b815181106122c8576122c8614b98565b016020015160f81c901b9190911790600101612284565b505f805b600881101561233e576122f7816007614b85565b6123029060086148e6565b6001600160401b03168a61231783602e614bac565b8151811061232757612327614b98565b016020015160f81c901b91909117906001016122e3565b5091989097509095509350505050565b5f8181525f80516020614fe483398151915260205260408082208151610100810190925280545f80516020614fa483398151915293929190829060ff16600581111561239c5761239c6146af565b60058111156123ad576123ad6146af565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612435576124356146af565b146124915760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c8565b60408101516001600160a01b0316336001600160a01b03161461250b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c8565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561254f5761254f6146af565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61261284826117fb565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f6126706129d3565b5f80516020614f648339815191525f61268b6101e285613402565b90505f61269787611480565b90506002815160058111156126ae576126ae6146af565b1461270d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c8565b5f828260a0015161271e91906148fd565b60048501546060840151919250612740916001600160401b0390911690614c92565b6001600160401b0316816001600160401b031611156127bf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c8565b5f806127cb8a846117fb565b915091505f8a836040516020016127f992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115612894576128946146af565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050610ef660015f80516020614fc483398151915255565b5f80516020614fc4833981519152805460011901612a0457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f64833981519152906001600160401b0316612a566040860160208701614613565b6001600160401b03161015612ac55760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c8565b6003810154612ad76020860186614ccc565b61ffff1610158015612afb5750612710612af46020860186614ccc565b61ffff1611155b612b175760405162461bcd60e51b81526004016104c890614ce7565b8054831015612b7a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c8565b8060010154831115612be15760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c8565b5f612beb84613402565b90505f612bf7826108de565b90505f612c048883613438565b5f81815260058601602052604090209091508790612c228282614d32565b509098975050505050505050565b60015f80516020614fc483398151915255565b5f808251602714612c665760405162461bcd60e51b81526004016104c890614bbf565b5f805b6002811015612cb557612c7d816001614b85565b612c889060086148e6565b61ffff16858281518110612c9e57612c9e614b98565b016020015160f81c901b9190911790600101612c69565b5061ffff811615612cd85760405162461bcd60e51b81526004016104c890614c08565b5f805b6004811015612d3357612cef816003614b85565b612cfa9060086148e6565b63ffffffff1686612d0c836002614bac565b81518110612d1c57612d1c614b98565b016020015160f81c901b9190911790600101612cdb565b5063ffffffff8116600214612d5a5760405162461bcd60e51b81526004016104c890614c4b565b5f805b6020811015612daf57612d7181601f614b85565b612d7c9060086148e6565b87612d88836006614bac565b81518110612d9857612d98614b98565b016020015160f81c901b9190911790600101612d5d565b505f86602681518110612dc457612dc4614b98565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e075760405162461bcd60e51b81526004016104c890614bbf565b5f805b6002811015612e5657612e1e816001614b85565b612e299060086148e6565b61ffff16858281518110612e3f57612e3f614b98565b016020015160f81c901b9190911790600101612e0a565b5061ffff811615612e795760405162461bcd60e51b81526004016104c890614c08565b5f805b6004811015612ed457612e90816003614b85565b612e9b9060086148e6565b63ffffffff1686612ead836002614bac565b81518110612ebd57612ebd614b98565b016020015160f81c901b9190911790600101612e7c565b5063ffffffff8116600414612efb5760405162461bcd60e51b81526004016104c890614c4b565b5f805b6020811015612f5057612f1281601f614b85565b612f1d9060086148e6565b87612f29836006614bac565b81518110612f3957612f39614b98565b016020015160f81c901b9190911790600101612efe565b505f805b6008811015612faf57612f68816007614b85565b612f739060086148e6565b6001600160401b031688612f88836026614bac565b81518110612f9857612f98614b98565b016020015160f81c901b9190911790600101612f54565b5090969095509350505050565b5f80516020614fa48339815191525f6001600160401b038084169085161115612ff057612fe983856147b1565b9050612ffd565b612ffa84846147b1565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b031660608201524291158061305f57506002840154815161305b916001600160401b031690614bac565b8210155b15613085576001600160401b0383166060820152818152604081015160208201526130a4565b828160600181815161309791906148fd565b6001600160401b03169052505b60608101516130b4906064614c92565b602082015160028601546001600160401b0392909216916130df9190600160401b900460ff166148e6565b10156131435760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c8565b61314d85876147b1565b6001600160401b0316816040018181516131679190614bac565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614fe48339815191526020526040812060030180545f80516020614fa4833981519152916001600160401b0390911690836131f683614d88565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661327e57604051631afcd79f60e31b815260040160405180910390fd5b565b613288613235565b61329181613973565b6132ec608082013560a08301356132ae60e0850160c08601614613565b6132bf610100860160e08701614ccc565b61ffff166132d561012087016101008801614dad565b6132e761014088016101208901614dcd565b613994565b50565b6132f7613235565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166133835760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261147b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613bd8565b5f6108ee827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613c39565b5f5f80516020614fa4833981519152426134586040860160208701614613565b6001600160401b0316116134ca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c8565b6134da6040850160208601614613565b6001600160401b03166134f06202a30042614bac565b116135635760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c8565b83356135bb5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c8565b83355f9081526009820160205260409020541561362b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c8565b6136386040850185614de8565b905060301461369f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c8565b6136a9835f612fbc565b5f806137436040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906136ee9190614613565b6001600160401b0316815260200161370960408a018a614de8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613d9b565b5f828152600786016020526040902091935091506137618282614e6e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061378e9085906004016147f3565b6020604051808303815f875af11580156137aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137ce9190614825565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613850576138506146af565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161394591908e01908e01614613565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61397b613235565b613983614140565b61398b614150565b6132ec81614158565b61399c613235565b5f80516020614f6483398151915283613a085760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c8565b612710841115613a2a5760405162461bcd60e51b81526004016104c890614ce7565b85871115613a925760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c8565b5f8360ff1611613aff5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c8565b600a60ff84161115613b715760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c8565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613bec6001600160a01b03841683614305565b905080515f14158015613c10575080806020019051810190613c0e9190614f2d565b155b1561147b57604051635274afe760e01b81526001600160a01b03841660048201526024016104c8565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613c7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ca39190614825565b9050613cba6001600160a01b038516333086614312565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613cfe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d229190614825565b9050818111613d885760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c8565b613d928282614b85565b95945050505050565b5f6060826080015151603014613e055760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613e7c57613e3c816001614b85565b613e479060086148e6565b5081515f90839083908110613e5e57613e5e614b98565b60200101906001600160f81b03191690815f1a905350600101613e28565b505f5b6004811015613eda57613e93816003614b85565b613e9e9060086148e6565b505f82613eac836002614bac565b81518110613ebc57613ebc614b98565b60200101906001600160f81b03191690815f1a905350600101613e7f565b505f5b6020811015613f375784518160208110613ef957613ef9614b98565b1a60f81b82613f09836006614bac565b81518110613f1957613f19614b98565b60200101906001600160f81b03191690815f1a905350600101613edd565b505f5b6020811015613f975784602001518160208110613f5957613f59614b98565b1a60f81b82613f69836026614bac565b81518110613f7957613f79614b98565b60200101906001600160f81b03191690815f1a905350600101613f3a565b505f5b600881101561400b57613fae816007614b85565b613fb99060086148e6565b60ff1685604001516001600160401b0316901c60f81b82826046613fdd9190614bac565b81518110613fed57613fed614b98565b60200101906001600160f81b03191690815f1a905350600101613f9a565b505f5b6030811015614076578460800151818151811061402d5761402d614b98565b01602001516001600160f81b0319168261404883604e614bac565b8151811061405857614058614b98565b60200101906001600160f81b03191690815f1a90535060010161400e565b505f5b60088110156140e85761408d816007614b85565b6140989060086148e6565b60608601516001600160401b0390811691161c60f81b826140ba83607e614bac565b815181106140ca576140ca614b98565b60200101906001600160f81b03191690815f1a905350600101614079565b506002816040516140f99190614f48565b602060405180830381855afa158015614114573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906141379190614825565b94909350915050565b614148613235565b61327e61434b565b61327e613235565b614160613235565b80355f80516020614fa483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146141ac6080840160608501614dad565b60ff1611156142195760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c8565b5f61422a6080840160608501614dad565b60ff16116142925760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c8565b6142a26080830160608401614dad565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556142d36060830160408401614613565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610ef683835f614353565b6040516001600160a01b0384811660248301528381166044830152606482018390526108d89186918216906323b872dd906084016133d0565b612c30613235565b6060814710156143785760405163cd78605960e01b81523060048201526024016104c8565b5f80856001600160a01b031684866040516143939190614f48565b5f6040518083038185875af1925050503d805f81146143cd576040519150601f19603f3d011682016040523d82523d5f602084013e6143d2565b606091505b50915091506117f18683836060826143f2576143ed82614439565b610ef6565b815115801561440957506001600160a01b0384163b155b1561443257604051639996b31560e01b81526001600160a01b03851660048201526024016104c8565b5080610ef6565b8051156144495780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461446e9061491d565b5f825580601f1061447d575050565b601f0160209004905f5260205f20908101906132ec91906144dd565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156144f1575f81556001016144de565b5090565b80151581146132ec575f80fd5b803563ffffffff81168114614515575f80fd5b919050565b5f805f6060848603121561452c575f80fd5b83359250602084013561453e816144f5565b915061454c60408501614502565b90509250925092565b5f60208284031215614565575f80fd5b5035919050565b6001600160a01b03811681146132ec575f80fd5b5f80828403610160811215614593575f80fd5b610140808212156145a2575f80fd5b84935083013590506145b38161456c565b809150509250929050565b5f602082840312156145ce575f80fd5b610ef682614502565b5f80604083850312156145e8575f80fd5b6145f183614502565b946020939093013593505050565b6001600160401b03811681146132ec575f80fd5b5f60208284031215614623575f80fd5b8135610ef6816145ff565b5f806040838503121561463f575f80fd5b50508035926020909101359150565b5f805f8385036080811215614661575f80fd5b84356001600160401b03811115614676575f80fd5b850160608188031215614687575f80fd5b93506040601f198201121561469a575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106146e757634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161470f60408401826001600160a01b03169052565b50606083015161472a60608401826001600160401b03169052565b50608083015161474560808401826001600160401b03169052565b5060a083015161476060a08401826001600160401b03169052565b5060c083015161477b60c08401826001600160401b03169052565b5060e083015161479660e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147965761479661479d565b5f5b838110156147eb5781810151838201526020016147d3565b50505f910152565b602081525f82518060208401526148118160408501602087016147d1565b601f01601f19169190910160400192915050565b5f60208284031215614835575f80fd5b5051919050565b5f8261485657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176108ee576108ee61479d565b6001600160401b038181168382160190808211156147965761479661479d565b600181811c9082168061493157607f821691505b60208210810361494f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546149ae8161491d565b806020870152604060018084165f81146149cf57600181146149eb57614a18565b60ff19851660408a0152604084151560051b8a01019550614a18565b895f5260205f205f5b85811015614a0f5781548b82018601529083019088016149f4565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614a5c57614a5c614a26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614a8a57614a8a614a26565b604052919050565b8051614515816144f5565b5f8060408385031215614aae575f80fd5b82516001600160401b0380821115614ac4575f80fd5b9084019060608287031215614ad7575f80fd5b614adf614a3a565b82518152602080840151614af28161456c565b82820152604084015183811115614b07575f80fd5b80850194505087601f850112614b1b575f80fd5b835183811115614b2d57614b2d614a26565b614b3f601f8201601f19168301614a62565b93508084528882828701011115614b54575f80fd5b614b63818386018488016147d1565b50826040830152819550614b78818801614a92565b9450505050509250929050565b818103818111156108ee576108ee61479d565b634e487b7160e01b5f52603260045260245ffd5b808201808211156108ee576108ee61479d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614cb557614cb561479d565b505092915050565b61ffff811681146132ec575f80fd5b5f60208284031215614cdc575f80fd5b8135610ef681614cbd565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614d3d81614cbd565b61ffff8116905081548161ffff1982161783556020840135614d5e816145ff565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6001600160401b03808316818103614da357614da361479d565b6001019392505050565b5f60208284031215614dbd575f80fd5b813560ff81168114610ef6575f80fd5b5f60208284031215614ddd575f80fd5b8135610ef68161456c565b5f808335601e19843603018112614dfd575f80fd5b8301803591506001600160401b03821115614e16575f80fd5b60200191503681900382131561194b575f80fd5b601f82111561147b57805f5260205f20601f840160051c81016020851015614e4f5750805b601f840160051c820191505b81811015610cd4575f8155600101614e5b565b81516001600160401b03811115614e8757614e87614a26565b614e9b81614e95845461491d565b84614e2a565b602080601f831160018114614ece575f8415614eb75750858301515b5f19600386901b1c1916600185901b178555614f25565b5f85815260208120601f198616915b82811015614efc57888601518255948401946001909101908401614edd565b5085821015614f1957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614f3d575f80fd5b8151610ef6816144f5565b5f8251614f598184602087016147d1565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 4546803b5..a96ea774a 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614e63380380614e6383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d168061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f366004614290565b61043b565b005b348015610161575f80fd5b506101546101703660046142cb565b6107f2565b348015610180575f80fd5b506101bf61018f3660046142cb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b506101546102123660046142e2565b6109c2565b348015610222575f80fd5b506102366102313660046142cb565b610a9f565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b506101546102903660046142f9565b610ab5565b3480156102a0575f80fd5b506101546102af366004614312565b610ae0565b3480156102bf575f80fd5b506101bf6102ce36600461434e565b610cb0565b3480156102de575f80fd5b506102366102ed3660046142cb565b610cc9565b3480156102fd575f80fd5b5061015461030c366004614290565b610cdd565b6101bf61031f366004614369565b610dbd565b34801561032f575f80fd5b5061015461033e366004614312565b610de9565b34801561034e575f80fd5b5061015461035d3660046142f9565b610ff8565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae3660046142cb565b6111b5565b3480156103be575f80fd5b506101546103cd3660046142cb565b61143b565b6101bf6103e03660046142cb565b61154f565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b506104186104133660046142cb565b61155b565b6040516101c991906143d6565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614c6a83398151915291841561048d5761048a828561163a565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf6143c2565b60048111156104d0576104d06143c2565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054c8461155b565b9050600282516004811115610563576105636143c2565b146105b55760405162461bcd60e51b815260206004820152602a60248201525f80516020614c8a8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b0316331461061a5760405162461bcd60e51b815260206004820152603360248201525f80516020614c8a8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ac565b6003825280516002906005811115610634576106346143c2565b03610678575f82606001518260a0015161064e91906144c4565b905061065a85826118d6565b506001600160401b0390811660e0850152421660a08401525061069b565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156106cc576106cc6143c2565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916107e0916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614cea83398151915260205260408082208151610100810190925280545f80516020614caa83398151915293929190829060ff166005811115610840576108406143c2565b6005811115610851576108516143c2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108d6576108d66143c2565b1461093b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6109608584608001515f611a57565b6040518263ffffffff1660e01b815260040161097c9190614506565b6020604051808303815f875af1158015610998573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bc9190614538565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a0b575080546001600160401b03808416911610155b15610a295760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5383611c76565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610aaf64e8d4a510008361454f565b92915050565b5f610abf82611c8a565b9050610adc81606001516001600160401b03168260400151611ffd565b5050565b5f80516020614c6a8339815191525f610af884612010565b90505f80610b0983604001516121f1565b50915091505f610b188361155b565b9050816001600160401b031681608001516001600160401b03161015610b505760405162461bcd60e51b81526004016105ac9061456e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b955760405162461bcd60e51b81526004016105ac906145b0565b60015f87815260068701602052604090205460ff166004811115610bbb57610bbb6143c2565b14610c245760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610aaf6001600160401b03831664e8d4a510006145f9565b5f610cd38261155b565b60a0015192915050565b5f80516020614c6a8339815191525f610cf58561155b565b5f86815260058401602052604090205460c0820151919250610d2791620100009091046001600160401b031690614610565b6001600160401b0316421015610d9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ac565b8315610dad57610dab858461163a565b505b610db68561242c565b5050505050565b5f610dc6612745565b610dd183833461277c565b9050610aaf60015f80516020614cca83398151915255565b5f80516020614c6a8339815191525f610e0184612010565b90505f80610e1283604001516121f1565b50915091505f610e218361155b565b9050816001600160401b031681608001516001600160401b03161015610e595760405162461bcd60e51b81526004016105ac9061456e565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e975760405162461bcd60e51b81526004016105ac906145b0565b60035f87815260068701602052604090205460ff166004811115610ebd57610ebd6143c2565b14610f115760405162461bcd60e51b815260206004820152603160248201525f80516020614c8a8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610fb691611ffd565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614caa8339815191525f61101083612010565b90505f8061102183604001516129aa565b91509150806110835760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ac565b5f8281526007850160205260408120805461109d90614630565b90501180156110cf575060015f83815260088601602052604090205460ff1660058111156110cd576110cd6143c2565b145b6110eb5760405162461bcd60e51b81526004016105ac90614662565b5f8281526007850160205260408120611103916141d8565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614c6a83398151915293929190829060ff166004811115611216576112166143c2565b6004811115611227576112276143c2565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112ae576112ae6143c2565b14806112cc57506003815160048111156112ca576112ca6143c2565b145b6113205760405162461bcd60e51b815260206004820152603260248201525f80516020614c8a833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ac565b5f61132e826040015161155b565b905080608001516001600160401b03165f036113b25760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6113df846040015184608001518560a00151611a57565b6040518263ffffffff1660e01b81526004016113fb9190614506565b6020604051808303815f875af1158015611417573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db69190614538565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614caa83398151915292919061148390614630565b90501180156114b5575060015f83815260088301602052604090205460ff1660058111156114b3576114b36143c2565b145b6114d15760405162461bcd60e51b81526004016105ac90614662565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161150a91906004016146a9565b6020604051808303815f875af1158015611526573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154a9190614538565b505050565b5f610aaf823334612b4b565b61156361420f565b5f8281525f80516020614cea8339815191526020526040908190208151610100810190925280545f80516020614caa833981519152929190829060ff1660058111156115b1576115b16143c2565b60058111156115c2576115c26143c2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611685573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116ac91908101906147be565b915091508061170f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ac565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611752573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117769190614538565b8251146117da5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ac565b60208201516001600160a01b0316156118505760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ac565b5f8061185f8460400151612eb4565b915091508187146118cc5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ac565b9695505050505050565b5f8281525f80516020614cea833981519152602052604081206003015481905f80516020614caa83398151915290600160401b90046001600160401b0390811690851681116119365761193161192c82876144c4565b61308c565b611948565b61194861194386836144c4565b613097565b5f611952876130a1565b5f8881526008850160205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6119a28a858b611a57565b6040518263ffffffff1660e01b81526004016119be9190614506565b6020604051808303815f875af11580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe9190614538565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611ad057611a908160016148a6565b611a9b9060086145f9565b5081515f90839083908110611ab257611ab26148b9565b60200101906001600160f81b03191690815f1a905350600101611a7c565b505f5b6004811015611b3357611ae78160036148a6565b611af29060086145f9565b6001901c60f81b82611b058360026148cd565b81518110611b1557611b156148b9565b60200101906001600160f81b03191690815f1a905350600101611ad3565b505f5b6020811015611b9557611b4a81601f6148a6565b611b559060086145f9565b86901c60f81b82611b678360066148cd565b81518110611b7757611b776148b9565b60200101906001600160f81b03191690815f1a905350600101611b36565b505f5b6008811015611c0057611bac8160076148a6565b611bb79060086145f9565b6001600160401b038616901c60f81b82611bd28360266148cd565b81518110611be257611be26148b9565b60200101906001600160f81b03191690815f1a905350600101611b98565b505f5b6008811015611c6b57611c178160076148a6565b611c229060086145f9565b6001600160401b038516901c60f81b82611c3d83602e6148cd565b81518110611c4d57611c4d6148b9565b60200101906001600160f81b03191690815f1a905350600101611c03565b5090505b9392505050565b611c7e613123565b611c878161316e565b50565b611c9261420f565b5f80516020614caa8339815191525f611caa84612010565b90505f80611cbb83604001516129aa565b915091508015611d205760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ac565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d5257611d526143c2565b6005811115611d6357611d636143c2565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611dea57611dea6143c2565b1480611e085750600182516005811115611e0657611e066143c2565b145b611e675760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ac565b600382516005811115611e7c57611e7c6143c2565b03611e8957506004611e8d565b5060055b6020808301515f90815260098801909152604081205581816005811115611eb657611eb66143c2565b90816005811115611ec957611ec96143c2565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611efd57611efd6143c2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611fc857611fc86143c2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610adc6001600160a01b038216836131da565b60408051606080820183525f8083526020830181905292820152905f80516020614caa8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612085573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120ac91908101906147be565b91509150806121135760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105ac565b82548251146121765760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ac565b60208201516001600160a01b0316156121e95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ac565b509392505050565b5f805f83516036146122155760405162461bcd60e51b81526004016105ac906148e0565b5f805b60028110156122645761222c8160016148a6565b6122379060086145f9565b61ffff1686828151811061224d5761224d6148b9565b016020015160f81c901b9190911790600101612218565b5061ffff8116156122875760405162461bcd60e51b81526004016105ac90614929565b5f805b60048110156122e25761229e8160036148a6565b6122a99060086145f9565b63ffffffff16876122bb8360026148cd565b815181106122cb576122cb6148b9565b016020015160f81c901b919091179060010161228a565b5063ffffffff81166003146123095760405162461bcd60e51b81526004016105ac9061496c565b5f805b602081101561235e5761232081601f6148a6565b61232b9060086145f9565b886123378360066148cd565b81518110612347576123476148b9565b016020015160f81c901b919091179060010161230c565b505f805b60088110156123bd576123768160076148a6565b6123819060086145f9565b6001600160401b0316896123968360266148cd565b815181106123a6576123a66148b9565b016020015160f81c901b9190911790600101612362565b505f805b600881101561241c576123d58160076148a6565b6123e09060086145f9565b6001600160401b03168a6123f583602e6148cd565b81518110612405576124056148b9565b016020015160f81c901b91909117906001016123c1565b5091989097509095509350505050565b5f8181525f80516020614cea83398151915260205260408082208151610100810190925280545f80516020614caa83398151915293929190829060ff16600581111561247a5761247a6143c2565b600581111561248b5761248b6143c2565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612513576125136143c2565b1461256f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ac565b60408101516001600160a01b0316336001600160a01b0316146125e95760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105ac565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561262d5761262d6143c2565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126f084826118d6565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f80516020614cca83398151915280546001190161277657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614c6a833981519152906001600160401b03166127c8604086016020870161434e565b6001600160401b031610156128375760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ac565b600381015461284960208601866149c2565b61ffff161015801561286d575061271061286660208601866149c2565b61ffff1611155b6128895760405162461bcd60e51b81526004016105ac906149dd565b80548310156128ec5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ac565b80600101548311156129535760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ac565b825f61295e82610a9f565b90505f61296b888361326d565b5f818152600586016020526040902090915087906129898282614a28565b509098975050505050505050565b60015f80516020614cca83398151915255565b5f8082516027146129cd5760405162461bcd60e51b81526004016105ac906148e0565b5f805b6002811015612a1c576129e48160016148a6565b6129ef9060086145f9565b61ffff16858281518110612a0557612a056148b9565b016020015160f81c901b91909117906001016129d0565b5061ffff811615612a3f5760405162461bcd60e51b81526004016105ac90614929565b5f805b6004811015612a9a57612a568160036148a6565b612a619060086145f9565b63ffffffff1686612a738360026148cd565b81518110612a8357612a836148b9565b016020015160f81c901b9190911790600101612a42565b5063ffffffff8116600214612ac15760405162461bcd60e51b81526004016105ac9061496c565b5f805b6020811015612b1657612ad881601f6148a6565b612ae39060086145f9565b87612aef8360066148cd565b81518110612aff57612aff6148b9565b016020015160f81c901b9190911790600101612ac4565b505f86602681518110612b2b57612b2b6148b9565b016020015191976001600160f81b03199092161515965090945050505050565b5f612b54612745565b5f80516020614c6a8339815191525f612b6c84610a9f565b90505f612b788761155b565b9050600281516005811115612b8f57612b8f6143c2565b14612bee5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ac565b5f828260a00151612bff9190614610565b60048501546060840151919250612c21916001600160401b0390911690614a7e565b6001600160401b0316816001600160401b03161115612ca05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ac565b5f80612cac8a846118d6565b915091505f8a83604051602001612cda92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115612d7557612d756143c2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050611c6f60015f80516020614cca83398151915255565b5f808251602e14612ed75760405162461bcd60e51b81526004016105ac906148e0565b5f805b6002811015612f2657612eee8160016148a6565b612ef99060086145f9565b61ffff16858281518110612f0f57612f0f6148b9565b016020015160f81c901b9190911790600101612eda565b5061ffff811615612f495760405162461bcd60e51b81526004016105ac90614929565b5f805b6004811015612fa457612f608160036148a6565b612f6b9060086145f9565b63ffffffff1686612f7d8360026148cd565b81518110612f8d57612f8d6148b9565b016020015160f81c901b9190911790600101612f4c565b5063ffffffff8116600414612fcb5760405162461bcd60e51b81526004016105ac9061496c565b5f805b602081101561302057612fe281601f6148a6565b612fed9060086145f9565b87612ff98360066148cd565b81518110613009576130096148b9565b016020015160f81c901b9190911790600101612fce565b505f805b600881101561307f576130388160076148a6565b6130439060086145f9565b6001600160401b0316886130588360266148cd565b81518110613068576130686148b9565b016020015160f81c901b9190911790600101613024565b5090969095509350505050565b611c878160016137a7565b611c87815f6137a7565b5f8181525f80516020614cea8339815191526020526040812060030180545f80516020614caa833981519152916001600160401b0390911690836130e483614aa9565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661316c57604051631afcd79f60e31b815260040160405180910390fd5b565b613176613123565b61317f81613a01565b611c87608082013560a083013561319c60e0850160c0860161434e565b6131ad610100860160e087016149c2565b61ffff166131c361012087016101008801614ace565b6131d561014088016101208901614aee565b613a22565b804710156131fd5760405163cd78605960e01b81523060048201526024016105ac565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613246576040519150601f19603f3d011682016040523d82523d5f602084013e61324b565b606091505b505090508061154a57604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614caa8339815191524261328d604086016020870161434e565b6001600160401b0316116132ff5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ac565b61330f604085016020860161434e565b6001600160401b03166133256202a300426148cd565b116133985760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ac565b83356133f05760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105ac565b83355f908152600982016020526040902054156134605760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105ac565b61346d6040850185614b09565b90506030146134d45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105ac565b6134dd8361308c565b5f806135776040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613522919061434e565b6001600160401b0316815260200161353d60408a018a614b09565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613c66565b5f828152600786016020526040902091935091506135958282614b8f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906135c2908590600401614506565b6020604051808303815f875af11580156135de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136029190614538565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613684576136846143c2565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161377991908e01908e0161434e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020614caa83398151915291429190158061388d575060028301548151613889916001600160401b0316906148cd565b8210155b156138b3576001600160401b0385166060820152818152604081015160208201526138d2565b84816060018181516138c59190614610565b6001600160401b03169052505b60608101516138e2906064614a7e565b602082015160028501546001600160401b03929092169161390d9190600160401b900460ff166145f9565b10156139715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ac565b831561399a57846001600160401b03168160400181815161399291906148cd565b9052506139b9565b846001600160401b0316816040018181516139b591906148a6565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b613a09613123565b613a1161400b565b613a1961401b565b611c8781614023565b613a2a613123565b5f80516020614c6a83398151915283613a965760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ac565b612710841115613ab85760405162461bcd60e51b81526004016105ac906149dd565b85871115613b205760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ac565b5f8360ff1611613b8d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ac565b600a60ff84161115613bff5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ac565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613cd05760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ac565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613d4757613d078160016148a6565b613d129060086145f9565b5081515f90839083908110613d2957613d296148b9565b60200101906001600160f81b03191690815f1a905350600101613cf3565b505f5b6004811015613da557613d5e8160036148a6565b613d699060086145f9565b505f82613d778360026148cd565b81518110613d8757613d876148b9565b60200101906001600160f81b03191690815f1a905350600101613d4a565b505f5b6020811015613e025784518160208110613dc457613dc46148b9565b1a60f81b82613dd48360066148cd565b81518110613de457613de46148b9565b60200101906001600160f81b03191690815f1a905350600101613da8565b505f5b6020811015613e625784602001518160208110613e2457613e246148b9565b1a60f81b82613e348360266148cd565b81518110613e4457613e446148b9565b60200101906001600160f81b03191690815f1a905350600101613e05565b505f5b6008811015613ed657613e798160076148a6565b613e849060086145f9565b60ff1685604001516001600160401b0316901c60f81b82826046613ea891906148cd565b81518110613eb857613eb86148b9565b60200101906001600160f81b03191690815f1a905350600101613e65565b505f5b6030811015613f415784608001518181518110613ef857613ef86148b9565b01602001516001600160f81b03191682613f1383604e6148cd565b81518110613f2357613f236148b9565b60200101906001600160f81b03191690815f1a905350600101613ed9565b505f5b6008811015613fb357613f588160076148a6565b613f639060086145f9565b60608601516001600160401b0390811691161c60f81b82613f8583607e6148cd565b81518110613f9557613f956148b9565b60200101906001600160f81b03191690815f1a905350600101613f44565b50600281604051613fc49190614c4e565b602060405180830381855afa158015613fdf573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906140029190614538565b94909350915050565b614013613123565b61316c6141d0565b61316c613123565b61402b613123565b80355f80516020614caa83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146140776080840160608501614ace565b60ff1611156140e45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ac565b5f6140f56080840160608501614ace565b60ff161161415d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ac565b61416d6080830160608401614ace565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561419e606083016040840161434e565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b612997613123565b5080546141e490614630565b5f825580601f106141f3575050565b601f0160209004905f5260205f2090810190611c879190614253565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614267575f8155600101614254565b5090565b8015158114611c87575f80fd5b803563ffffffff8116811461428b575f80fd5b919050565b5f805f606084860312156142a2575f80fd5b8335925060208401356142b48161426b565b91506142c260408501614278565b90509250925092565b5f602082840312156142db575f80fd5b5035919050565b5f61014082840312156142f3575f80fd5b50919050565b5f60208284031215614309575f80fd5b611c6f82614278565b5f8060408385031215614323575f80fd5b61432c83614278565b946020939093013593505050565b6001600160401b0381168114611c87575f80fd5b5f6020828403121561435e575f80fd5b8135611c6f8161433a565b5f80828403606081121561437b575f80fd5b83356001600160401b03811115614390575f80fd5b8401606081870312156143a1575f80fd5b92506040601f19820112156143b4575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106143fa57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161442260408401826001600160a01b03169052565b50606083015161443d60608401826001600160401b03169052565b50608083015161445860808401826001600160401b03169052565b5060a083015161447360a08401826001600160401b03169052565b5060c083015161448e60c08401826001600160401b03169052565b5060e08301516144a960e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144a9576144a96144b0565b5f5b838110156144fe5781810151838201526020016144e6565b50505f910152565b602081525f82518060208401526145248160408501602087016144e4565b601f01601f19169190910160400192915050565b5f60208284031215614548575f80fd5b5051919050565b5f8261456957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610aaf57610aaf6144b0565b6001600160401b038181168382160190808211156144a9576144a96144b0565b600181811c9082168061464457607f821691505b6020821081036142f357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546146bb81614630565b806020870152604060018084165f81146146dc57600181146146f857614725565b60ff19851660408a0152604084151560051b8a01019550614725565b895f5260205f205f5b8581101561471c5781548b8201860152908301908801614701565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561476957614769614733565b60405290565b604051601f8201601f191681016001600160401b038111828210171561479757614797614733565b604052919050565b6001600160a01b0381168114611c87575f80fd5b805161428b8161426b565b5f80604083850312156147cf575f80fd5b82516001600160401b03808211156147e5575f80fd5b90840190606082870312156147f8575f80fd5b614800614747565b825181526020808401516148138161479f565b82820152604084015183811115614828575f80fd5b80850194505087601f85011261483c575f80fd5b83518381111561484e5761484e614733565b614860601f8201601f1916830161476f565b93508084528882828701011115614875575f80fd5b614884818386018488016144e4565b508260408301528195506148998188016147b3565b9450505050509250929050565b81810381811115610aaf57610aaf6144b0565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610aaf57610aaf6144b0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c87575f80fd5b5f602082840312156149d2575f80fd5b8135611c6f816149b3565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614a33816149b3565b61ffff8116905081548161ffff1982161783556020840135614a548161433a565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614aa157614aa16144b0565b505092915050565b5f6001600160401b03808316818103614ac457614ac46144b0565b6001019392505050565b5f60208284031215614ade575f80fd5b813560ff81168114611c6f575f80fd5b5f60208284031215614afe575f80fd5b8135611c6f8161479f565b5f808335601e19843603018112614b1e575f80fd5b8301803591506001600160401b03821115614b37575f80fd5b602001915036819003821315611a50575f80fd5b601f82111561154a57805f5260205f20601f840160051c81016020851015614b705750805b601f840160051c820191505b81811015610db6575f8155600101614b7c565b81516001600160401b03811115614ba857614ba8614733565b614bbc81614bb68454614630565b84614b4b565b602080601f831160018114614bef575f8415614bd85750858301515b5f19600386901b1c1916600185901b178555614c46565b5f85815260208120601f198616915b82811015614c1d57888601518255948401946001909101908401614bfe565b5085821015614c3a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614c5f8184602087016144e4565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614dc2380380614dc283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614c758061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f3660046141ef565b61043b565b005b348015610161575f80fd5b5061015461017036600461422a565b6107f2565b348015610180575f80fd5b506101bf61018f36600461422a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b50610154610212366004614241565b6109c2565b348015610222575f80fd5b5061023661023136600461422a565b610a9f565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b50610154610290366004614258565b610ab5565b3480156102a0575f80fd5b506101546102af366004614271565b610ae0565b3480156102bf575f80fd5b506101bf6102ce3660046142ad565b610cb0565b3480156102de575f80fd5b506102366102ed36600461422a565b610cc9565b3480156102fd575f80fd5b5061015461030c3660046141ef565b610cdd565b6101bf61031f3660046142c8565b610dbd565b34801561032f575f80fd5b5061015461033e366004614271565b610de9565b34801561034e575f80fd5b5061015461035d366004614258565b610ff8565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae36600461422a565b6111b5565b3480156103be575f80fd5b506101546103cd36600461422a565b61143b565b6101bf6103e036600461422a565b61154f565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b5061041861041336600461422a565b61155b565b6040516101c99190614335565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614bc983398151915291841561048d5761048a828561163a565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf614321565b60048111156104d0576104d0614321565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054c8461155b565b905060028251600481111561056357610563614321565b146105b55760405162461bcd60e51b815260206004820152602a60248201525f80516020614be98339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b0316331461061a5760405162461bcd60e51b815260206004820152603360248201525f80516020614be98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ac565b600382528051600290600581111561063457610634614321565b03610678575f82606001518260a0015161064e9190614423565b905061065a85826118d6565b506001600160401b0390811660e0850152421660a08401525061069b565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156106cc576106cc614321565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916107e0916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614c4983398151915260205260408082208151610100810190925280545f80516020614c0983398151915293929190829060ff16600581111561084057610840614321565b600581111561085157610851614321565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108d6576108d6614321565b1461093b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6109608584608001515f611a2d565b6040518263ffffffff1660e01b815260040161097c9190614465565b6020604051808303815f875af1158015610998573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bc9190614497565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a0b575080546001600160401b03808416911610155b15610a295760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5383611c4c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610aaf64e8d4a51000836144ae565b92915050565b5f610abf82611c60565b9050610adc81606001516001600160401b03168260400151611fd3565b5050565b5f80516020614bc98339815191525f610af884611fe6565b90505f80610b0983604001516121c7565b50915091505f610b188361155b565b9050816001600160401b031681608001516001600160401b03161015610b505760405162461bcd60e51b81526004016105ac906144cd565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b955760405162461bcd60e51b81526004016105ac9061450f565b60015f87815260068701602052604090205460ff166004811115610bbb57610bbb614321565b14610c245760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610aaf6001600160401b03831664e8d4a51000614558565b5f610cd38261155b565b60a0015192915050565b5f80516020614bc98339815191525f610cf58561155b565b5f86815260058401602052604090205460c0820151919250610d2791620100009091046001600160401b03169061456f565b6001600160401b0316421015610d9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ac565b8315610dad57610dab858461163a565b505b610db685612402565b5050505050565b5f610dc661271b565b610dd1838334612752565b9050610aaf60015f80516020614c2983398151915255565b5f80516020614bc98339815191525f610e0184611fe6565b90505f80610e1283604001516121c7565b50915091505f610e218361155b565b9050816001600160401b031681608001516001600160401b03161015610e595760405162461bcd60e51b81526004016105ac906144cd565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e975760405162461bcd60e51b81526004016105ac9061450f565b60035f87815260068701602052604090205460ff166004811115610ebd57610ebd614321565b14610f115760405162461bcd60e51b815260206004820152603160248201525f80516020614be98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610fb691611fd3565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614c098339815191525f61101083611fe6565b90505f806110218360400151612980565b91509150806110835760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ac565b5f8281526007850160205260408120805461109d9061458f565b90501180156110cf575060015f83815260088601602052604090205460ff1660058111156110cd576110cd614321565b145b6110eb5760405162461bcd60e51b81526004016105ac906145c1565b5f828152600785016020526040812061110391614137565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614bc983398151915293929190829060ff16600481111561121657611216614321565b600481111561122757611227614321565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112ae576112ae614321565b14806112cc57506003815160048111156112ca576112ca614321565b145b6113205760405162461bcd60e51b815260206004820152603260248201525f80516020614be9833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ac565b5f61132e826040015161155b565b905080608001516001600160401b03165f036113b25760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6113df846040015184608001518560a00151611a2d565b6040518263ffffffff1660e01b81526004016113fb9190614465565b6020604051808303815f875af1158015611417573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db69190614497565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614c098339815191529291906114839061458f565b90501180156114b5575060015f83815260088301602052604090205460ff1660058111156114b3576114b3614321565b145b6114d15760405162461bcd60e51b81526004016105ac906145c1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161150a9190600401614608565b6020604051808303815f875af1158015611526573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154a9190614497565b505050565b5f610aaf823334612b21565b61156361416e565b5f8281525f80516020614c498339815191526020526040908190208151610100810190925280545f80516020614c09833981519152929190829060ff1660058111156115b1576115b1614321565b60058111156115c2576115c2614321565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611685573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116ac919081019061471d565b915091508061170f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ac565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611752573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117769190614497565b8251146117da5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ac565b60208201516001600160a01b0316156118505760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ac565b5f8061185f8460400151612e8a565b915091508187146118cc5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ac565b9695505050505050565b5f8281525f80516020614c49833981519152602052604081206003015481905f80516020614c0983398151915290600160401b90046001600160401b031661191e8582613062565b5f61192887613259565b5f8881526008850160205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6119788a858b611a2d565b6040518263ffffffff1660e01b81526004016119949190614465565b6020604051808303815f875af11580156119b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d49190614497565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611aa657611a66816001614805565b611a71906008614558565b5081515f90839083908110611a8857611a88614818565b60200101906001600160f81b03191690815f1a905350600101611a52565b505f5b6004811015611b0957611abd816003614805565b611ac8906008614558565b6001901c60f81b82611adb83600261482c565b81518110611aeb57611aeb614818565b60200101906001600160f81b03191690815f1a905350600101611aa9565b505f5b6020811015611b6b57611b2081601f614805565b611b2b906008614558565b86901c60f81b82611b3d83600661482c565b81518110611b4d57611b4d614818565b60200101906001600160f81b03191690815f1a905350600101611b0c565b505f5b6008811015611bd657611b82816007614805565b611b8d906008614558565b6001600160401b038616901c60f81b82611ba883602661482c565b81518110611bb857611bb8614818565b60200101906001600160f81b03191690815f1a905350600101611b6e565b505f5b6008811015611c4157611bed816007614805565b611bf8906008614558565b6001600160401b038516901c60f81b82611c1383602e61482c565b81518110611c2357611c23614818565b60200101906001600160f81b03191690815f1a905350600101611bd9565b5090505b9392505050565b611c546132db565b611c5d81613326565b50565b611c6861416e565b5f80516020614c098339815191525f611c8084611fe6565b90505f80611c918360400151612980565b915091508015611cf65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ac565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d2857611d28614321565b6005811115611d3957611d39614321565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611dc057611dc0614321565b1480611dde5750600182516005811115611ddc57611ddc614321565b145b611e3d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ac565b600382516005811115611e5257611e52614321565b03611e5f57506004611e63565b5060055b6020808301515f90815260098801909152604081205581816005811115611e8c57611e8c614321565b90816005811115611e9f57611e9f614321565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611ed357611ed3614321565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f9e57611f9e614321565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610adc6001600160a01b03821683613392565b60408051606080820183525f8083526020830181905292820152905f80516020614c098339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561205b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612082919081019061471d565b91509150806120e95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105ac565b825482511461214c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ac565b60208201516001600160a01b0316156121bf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ac565b509392505050565b5f805f83516036146121eb5760405162461bcd60e51b81526004016105ac9061483f565b5f805b600281101561223a57612202816001614805565b61220d906008614558565b61ffff1686828151811061222357612223614818565b016020015160f81c901b91909117906001016121ee565b5061ffff81161561225d5760405162461bcd60e51b81526004016105ac90614888565b5f805b60048110156122b857612274816003614805565b61227f906008614558565b63ffffffff168761229183600261482c565b815181106122a1576122a1614818565b016020015160f81c901b9190911790600101612260565b5063ffffffff81166003146122df5760405162461bcd60e51b81526004016105ac906148cb565b5f805b6020811015612334576122f681601f614805565b612301906008614558565b8861230d83600661482c565b8151811061231d5761231d614818565b016020015160f81c901b91909117906001016122e2565b505f805b60088110156123935761234c816007614805565b612357906008614558565b6001600160401b03168961236c83602661482c565b8151811061237c5761237c614818565b016020015160f81c901b9190911790600101612338565b505f805b60088110156123f2576123ab816007614805565b6123b6906008614558565b6001600160401b03168a6123cb83602e61482c565b815181106123db576123db614818565b016020015160f81c901b9190911790600101612397565b5091989097509095509350505050565b5f8181525f80516020614c4983398151915260205260408082208151610100810190925280545f80516020614c0983398151915293929190829060ff16600581111561245057612450614321565b600581111561246157612461614321565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124e9576124e9614321565b146125455760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ac565b60408101516001600160a01b0316336001600160a01b0316146125bf5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105ac565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561260357612603614321565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126c684826118d6565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f80516020614c2983398151915280546001190161274c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614bc9833981519152906001600160401b031661279e60408601602087016142ad565b6001600160401b0316101561280d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ac565b600381015461281f6020860186614921565b61ffff1610158015612843575061271061283c6020860186614921565b61ffff1611155b61285f5760405162461bcd60e51b81526004016105ac9061493c565b80548310156128c25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ac565b80600101548311156129295760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ac565b825f61293482610a9f565b90505f6129418883613425565b5f8181526005860160205260409020909150879061295f8282614987565b509098975050505050505050565b60015f80516020614c2983398151915255565b5f8082516027146129a35760405162461bcd60e51b81526004016105ac9061483f565b5f805b60028110156129f2576129ba816001614805565b6129c5906008614558565b61ffff168582815181106129db576129db614818565b016020015160f81c901b91909117906001016129a6565b5061ffff811615612a155760405162461bcd60e51b81526004016105ac90614888565b5f805b6004811015612a7057612a2c816003614805565b612a37906008614558565b63ffffffff1686612a4983600261482c565b81518110612a5957612a59614818565b016020015160f81c901b9190911790600101612a18565b5063ffffffff8116600214612a975760405162461bcd60e51b81526004016105ac906148cb565b5f805b6020811015612aec57612aae81601f614805565b612ab9906008614558565b87612ac583600661482c565b81518110612ad557612ad5614818565b016020015160f81c901b9190911790600101612a9a565b505f86602681518110612b0157612b01614818565b016020015191976001600160f81b03199092161515965090945050505050565b5f612b2a61271b565b5f80516020614bc98339815191525f612b4284610a9f565b90505f612b4e8761155b565b9050600281516005811115612b6557612b65614321565b14612bc45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ac565b5f828260a00151612bd5919061456f565b60048501546060840151919250612bf7916001600160401b03909116906149dd565b6001600160401b0316816001600160401b03161115612c765760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ac565b5f80612c828a846118d6565b915091505f8a83604051602001612cb092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115612d4b57612d4b614321565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050611c4560015f80516020614c2983398151915255565b5f808251602e14612ead5760405162461bcd60e51b81526004016105ac9061483f565b5f805b6002811015612efc57612ec4816001614805565b612ecf906008614558565b61ffff16858281518110612ee557612ee5614818565b016020015160f81c901b9190911790600101612eb0565b5061ffff811615612f1f5760405162461bcd60e51b81526004016105ac90614888565b5f805b6004811015612f7a57612f36816003614805565b612f41906008614558565b63ffffffff1686612f5383600261482c565b81518110612f6357612f63614818565b016020015160f81c901b9190911790600101612f22565b5063ffffffff8116600414612fa15760405162461bcd60e51b81526004016105ac906148cb565b5f805b6020811015612ff657612fb881601f614805565b612fc3906008614558565b87612fcf83600661482c565b81518110612fdf57612fdf614818565b016020015160f81c901b9190911790600101612fa4565b505f805b60088110156130555761300e816007614805565b613019906008614558565b6001600160401b03168861302e83602661482c565b8151811061303e5761303e614818565b016020015160f81c901b9190911790600101612ffa565b5090969095509350505050565b5f80516020614c098339815191525f6001600160401b0380841690851611156130965761308f8385614423565b90506130a3565b6130a08484614423565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613105575060028401548151613101916001600160401b03169061482c565b8210155b1561312b576001600160401b03831660608201528181526040810151602082015261314a565b828160600181815161313d919061456f565b6001600160401b03169052505b606081015161315a9060646149dd565b602082015160028601546001600160401b0392909216916131859190600160401b900460ff16614558565b10156131e95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ac565b6131f38587614423565b6001600160401b03168160400181815161320d919061482c565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614c498339815191526020526040812060030180545f80516020614c09833981519152916001600160401b03909116908361329c83614a08565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661332457604051631afcd79f60e31b815260040160405180910390fd5b565b61332e6132db565b61333781613960565b611c5d608082013560a083013561335460e0850160c086016142ad565b613365610100860160e08701614921565b61ffff1661337b61012087016101008801614a2d565b61338d61014088016101208901614a4d565b613981565b804710156133b55760405163cd78605960e01b81523060048201526024016105ac565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146133fe576040519150601f19603f3d011682016040523d82523d5f602084013e613403565b606091505b505090508061154a57604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614c098339815191524261344560408601602087016142ad565b6001600160401b0316116134b75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ac565b6134c760408501602086016142ad565b6001600160401b03166134dd6202a3004261482c565b116135505760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ac565b83356135a85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105ac565b83355f908152600982016020526040902054156136185760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105ac565b6136256040850185614a68565b905060301461368c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105ac565b613696835f613062565b5f806137306040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906136db91906142ad565b6001600160401b031681526020016136f660408a018a614a68565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613bc5565b5f8281526007860160205260409020919350915061374e8282614aee565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061377b908590600401614465565b6020604051808303815f875af1158015613797573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137bb9190614497565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561383d5761383d614321565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161393291908e01908e016142ad565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6139686132db565b613970613f6a565b613978613f7a565b611c5d81613f82565b6139896132db565b5f80516020614bc9833981519152836139f55760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ac565b612710841115613a175760405162461bcd60e51b81526004016105ac9061493c565b85871115613a7f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ac565b5f8360ff1611613aec5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ac565b600a60ff84161115613b5e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ac565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613c2f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ac565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613ca657613c66816001614805565b613c71906008614558565b5081515f90839083908110613c8857613c88614818565b60200101906001600160f81b03191690815f1a905350600101613c52565b505f5b6004811015613d0457613cbd816003614805565b613cc8906008614558565b505f82613cd683600261482c565b81518110613ce657613ce6614818565b60200101906001600160f81b03191690815f1a905350600101613ca9565b505f5b6020811015613d615784518160208110613d2357613d23614818565b1a60f81b82613d3383600661482c565b81518110613d4357613d43614818565b60200101906001600160f81b03191690815f1a905350600101613d07565b505f5b6020811015613dc15784602001518160208110613d8357613d83614818565b1a60f81b82613d9383602661482c565b81518110613da357613da3614818565b60200101906001600160f81b03191690815f1a905350600101613d64565b505f5b6008811015613e3557613dd8816007614805565b613de3906008614558565b60ff1685604001516001600160401b0316901c60f81b82826046613e07919061482c565b81518110613e1757613e17614818565b60200101906001600160f81b03191690815f1a905350600101613dc4565b505f5b6030811015613ea05784608001518181518110613e5757613e57614818565b01602001516001600160f81b03191682613e7283604e61482c565b81518110613e8257613e82614818565b60200101906001600160f81b03191690815f1a905350600101613e38565b505f5b6008811015613f1257613eb7816007614805565b613ec2906008614558565b60608601516001600160401b0390811691161c60f81b82613ee483607e61482c565b81518110613ef457613ef4614818565b60200101906001600160f81b03191690815f1a905350600101613ea3565b50600281604051613f239190614bad565b602060405180830381855afa158015613f3e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613f619190614497565b94909350915050565b613f726132db565b61332461412f565b6133246132db565b613f8a6132db565b80355f80516020614c0983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613fd66080840160608501614a2d565b60ff1611156140435760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ac565b5f6140546080840160608501614a2d565b60ff16116140bc5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ac565b6140cc6080830160608401614a2d565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556140fd60608301604084016142ad565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b61296d6132db565b5080546141439061458f565b5f825580601f10614152575050565b601f0160209004905f5260205f2090810190611c5d91906141b2565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156141c6575f81556001016141b3565b5090565b8015158114611c5d575f80fd5b803563ffffffff811681146141ea575f80fd5b919050565b5f805f60608486031215614201575f80fd5b833592506020840135614213816141ca565b9150614221604085016141d7565b90509250925092565b5f6020828403121561423a575f80fd5b5035919050565b5f6101408284031215614252575f80fd5b50919050565b5f60208284031215614268575f80fd5b611c45826141d7565b5f8060408385031215614282575f80fd5b61428b836141d7565b946020939093013593505050565b6001600160401b0381168114611c5d575f80fd5b5f602082840312156142bd575f80fd5b8135611c4581614299565b5f8082840360608112156142da575f80fd5b83356001600160401b038111156142ef575f80fd5b840160608187031215614300575f80fd5b92506040601f1982011215614313575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061435957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161438160408401826001600160a01b03169052565b50606083015161439c60608401826001600160401b03169052565b5060808301516143b760808401826001600160401b03169052565b5060a08301516143d260a08401826001600160401b03169052565b5060c08301516143ed60c08401826001600160401b03169052565b5060e083015161440860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144085761440861440f565b5f5b8381101561445d578181015183820152602001614445565b50505f910152565b602081525f8251806020840152614483816040850160208701614443565b601f01601f19169190910160400192915050565b5f602082840312156144a7575f80fd5b5051919050565b5f826144c857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610aaf57610aaf61440f565b6001600160401b038181168382160190808211156144085761440861440f565b600181811c908216806145a357607f821691505b60208210810361425257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461461a8161458f565b806020870152604060018084165f811461463b576001811461465757614684565b60ff19851660408a0152604084151560051b8a01019550614684565b895f5260205f205f5b8581101561467b5781548b8201860152908301908801614660565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156146c8576146c8614692565b60405290565b604051601f8201601f191681016001600160401b03811182821017156146f6576146f6614692565b604052919050565b6001600160a01b0381168114611c5d575f80fd5b80516141ea816141ca565b5f806040838503121561472e575f80fd5b82516001600160401b0380821115614744575f80fd5b9084019060608287031215614757575f80fd5b61475f6146a6565b82518152602080840151614772816146fe565b82820152604084015183811115614787575f80fd5b80850194505087601f85011261479b575f80fd5b8351838111156147ad576147ad614692565b6147bf601f8201601f191683016146ce565b935080845288828287010111156147d4575f80fd5b6147e381838601848801614443565b508260408301528195506147f8818801614712565b9450505050509250929050565b81810381811115610aaf57610aaf61440f565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610aaf57610aaf61440f565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c5d575f80fd5b5f60208284031215614931575f80fd5b8135611c4581614912565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561499281614912565b61ffff8116905081548161ffff19821617835560208401356149b381614299565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614a0057614a0061440f565b505092915050565b5f6001600160401b03808316818103614a2357614a2361440f565b6001019392505050565b5f60208284031215614a3d575f80fd5b813560ff81168114611c45575f80fd5b5f60208284031215614a5d575f80fd5b8135611c45816146fe565b5f808335601e19843603018112614a7d575f80fd5b8301803591506001600160401b03821115614a96575f80fd5b602001915036819003821315611a26575f80fd5b601f82111561154a57805f5260205f20601f840160051c81016020851015614acf5750805b601f840160051c820191505b81811015610db6575f8155600101614adb565b81516001600160401b03811115614b0757614b07614692565b614b1b81614b15845461458f565b84614aaa565b602080601f831160018114614b4e575f8415614b375750858301515b5f19600386901b1c1916600185901b178555614ba5565b5f85815260208120601f198616915b82811015614b7c57888601518255948401946001909101908401614b5d565b5085821015614b9957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614bbe818460208701614443565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index c41d13a02..c53386f49 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -59,7 +59,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161311238038061311283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612fc58061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c806397fb70d411610093578063c974d1b611610063578063c974d1b61461025c578063d5f20ff614610276578063df93d8de14610296578063f2fde38b146102a0575f80fd5b806397fb70d414610215578063a3a65e4814610228578063b771b3bc1461023b578063bee0a03f14610249575f80fd5b806366435abf116100ce57806366435abf1461018b578063715018a6146101b65780638994ab49146101be5780638da5cb5b146101d1575f80fd5b80630322ed98146100ff5780630cdd098514610114578063467ef06f14610165578063580a400614610178575b5f80fd5b61011261010d366004612809565b6102b3565b005b610152610122366004612809565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610112610173366004612820565b610488565b61011261018636600461285e565b610495565b61019e610199366004612809565b6105a3565b6040516001600160401b03909116815260200161015c565b6101126105b7565b6101526101cc3660046128b5565b6105ca565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b610112610223366004612809565b6105e6565b610112610236366004612820565b6105f2565b6101fd6005600160991b0181565b610112610257366004612809565b6107af565b610264601481565b60405160ff909116815260200161015c565b610289610284366004612809565b6108c3565b60405161015c9190612917565b61019e6202a30081565b6101126102ae3660046129f1565b6109a2565b5f8181525f80516020612f9983398151915260205260408082208151610100810190925280545f80516020612f7983398151915293929190829060ff16600581111561030157610301612903565b600581111561031257610312612903565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561039757610397612903565b146104015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104268584608001515f6109dc565b6040518263ffffffff1660e01b81526004016104429190612a2e565b6020604051808303815f875af115801561045e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104829190612a60565b50505050565b61049181610bf9565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104d95750825b90505f826001600160401b031660011480156104f45750303b155b905081158015610502575080155b156105205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561054a57845460ff60401b1916600160401b1785555b6105548787610f6c565b831561059a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105ad826108c3565b60a0015192915050565b6105bf610f86565b6105c85f610fe1565b565b5f6105d3610f86565b6105dd8383611051565b90505b92915050565b6105ef8161158b565b50565b5f80516020612f798339815191525f61060a836118a4565b90505f8061061b8360400151611a85565b915091508061067d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f8565b5f8281526007850160205260408120805461069790612a77565b90501180156106c9575060015f83815260088601602052604090205460ff1660058111156106c7576106c7612903565b145b6106e55760405162461bcd60e51b81526004016103f890612aaf565b5f82815260078501602052604081206106fd91612776565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612f798339815191529291906107f790612a77565b9050118015610829575060015f83815260088301602052604090205460ff16600581111561082757610827612903565b145b6108455760405162461bcd60e51b81526004016103f890612aaf565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087e9190600401612af6565b6020604051808303815f875af115801561089a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108be9190612a60565b505050565b6108cb6127ad565b5f8281525f80516020612f998339815191526020526040908190208151610100810190925280545f80516020612f79833981519152929190829060ff16600581111561091957610919612903565b600581111561092a5761092a612903565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6109aa610f86565b6001600160a01b0381166109d357604051631e4fbdf760e01b81525f60048201526024016103f8565b6105ef81610fe1565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a5557610a15816001612ba8565b610a20906008612bbb565b5081515f90839083908110610a3757610a37612bd2565b60200101906001600160f81b03191690815f1a905350600101610a01565b505f5b6004811015610ab857610a6c816003612ba8565b610a77906008612bbb565b6001901c60f81b82610a8a836002612be6565b81518110610a9a57610a9a612bd2565b60200101906001600160f81b03191690815f1a905350600101610a58565b505f5b6020811015610b1a57610acf81601f612ba8565b610ada906008612bbb565b86901c60f81b82610aec836006612be6565b81518110610afc57610afc612bd2565b60200101906001600160f81b03191690815f1a905350600101610abb565b505f5b6008811015610b8557610b31816007612ba8565b610b3c906008612bbb565b6001600160401b038616901c60f81b82610b57836026612be6565b81518110610b6757610b67612bd2565b60200101906001600160f81b03191690815f1a905350600101610b1d565b505f5b6008811015610bf057610b9c816007612ba8565b610ba7906008612bbb565b6001600160401b038516901c60f81b82610bc283602e612be6565b81518110610bd257610bd2612bd2565b60200101906001600160f81b03191690815f1a905350600101610b88565b50949350505050565b610c016127ad565b5f80516020612f798339815191525f610c19846118a4565b90505f80610c2a8360400151611a85565b915091508015610c8f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610cc157610cc1612903565b6005811115610cd257610cd2612903565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d5957610d59612903565b1480610d775750600182516005811115610d7557610d75612903565b145b610dd65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103f8565b600382516005811115610deb57610deb612903565b03610df857506004610dfc565b5060055b6020808301515f90815260098801909152604081205581816005811115610e2557610e25612903565b90816005811115610e3857610e38612903565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610e6c57610e6c612903565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610f3757610f37612903565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610f74611ce4565b610f7d82611d2d565b61049181611d4e565b33610fb87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c85760405163118cdaa760e01b81523360048201526024016103f8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612f79833981519152426110716040860160208701612bf9565b6001600160401b0316116110e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103f8565b6110f36040850160208601612bf9565b6001600160401b03166111096202a30042612be6565b1161117c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103f8565b83356111d45760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f8565b83355f908152600982016020526040902054156112445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f8565b6112516040850185612c12565b90506030146112b85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f8565b6112c183611d5f565b5f8061135b6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906113069190612bf9565b6001600160401b0316815260200161132160408a018a612c12565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611d6a565b5f828152600786016020526040902091935091506113798282612c9f565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113a6908590600401612a2e565b6020604051808303815f875af11580156113c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e69190612a60565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561146857611468612903565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161155d91908e01908e01612bf9565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612f9983398151915260205260408082208151610100810190925280545f80516020612f7983398151915293929190829060ff1660058111156115d9576115d9612903565b60058111156115ea576115ea612903565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561167257611672612903565b146116ce5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f8565b60408101516001600160a01b0316336001600160a01b0316146117485760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103f8565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561178c5761178c612903565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61184f848261210f565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b60408051606080820183525f8083526020830181905292820152905f80516020612f798339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611919573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119409190810190612dc5565b91509150806119a75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f8565b8254825114611a0a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103f8565b60208201516001600160a01b031615611a7d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103f8565b509392505050565b5f808251602714611aea5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103f8565b5f805b6002811015611b3957611b01816001612ba8565b611b0c906008612bbb565b61ffff16858281518110611b2257611b22612bd2565b016020015160f81c901b9190911790600101611aed565b5061ffff811615611b985760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103f8565b5f805b6004811015611bf357611baf816003612ba8565b611bba906008612bbb565b63ffffffff1686611bcc836002612be6565b81518110611bdc57611bdc612bd2565b016020015160f81c901b9190911790600101611b9b565b5063ffffffff8116600214611c5a5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103f8565b5f805b6020811015611caf57611c7181601f612ba8565b611c7c906008612bbb565b87611c88836006612be6565b81518110611c9857611c98612bd2565b016020015160f81c901b9190911790600101611c5d565b505f86602681518110611cc457611cc4612bd2565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c857604051631afcd79f60e31b815260040160405180910390fd5b611d35611ce4565b611d3d612295565b611d456122a5565b6105ef816122ad565b611d56611ce4565b6105ef8161245a565b6105ef816001612462565b5f6060826080015151603014611dd45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015611e4b57611e0b816001612ba8565b611e16906008612bbb565b5081515f90839083908110611e2d57611e2d612bd2565b60200101906001600160f81b03191690815f1a905350600101611df7565b505f5b6004811015611ea957611e62816003612ba8565b611e6d906008612bbb565b505f82611e7b836002612be6565b81518110611e8b57611e8b612bd2565b60200101906001600160f81b03191690815f1a905350600101611e4e565b505f5b6020811015611f065784518160208110611ec857611ec8612bd2565b1a60f81b82611ed8836006612be6565b81518110611ee857611ee8612bd2565b60200101906001600160f81b03191690815f1a905350600101611eac565b505f5b6020811015611f665784602001518160208110611f2857611f28612bd2565b1a60f81b82611f38836026612be6565b81518110611f4857611f48612bd2565b60200101906001600160f81b03191690815f1a905350600101611f09565b505f5b6008811015611fda57611f7d816007612ba8565b611f88906008612bbb565b60ff1685604001516001600160401b0316901c60f81b82826046611fac9190612be6565b81518110611fbc57611fbc612bd2565b60200101906001600160f81b03191690815f1a905350600101611f69565b505f5b60308110156120455784608001518181518110611ffc57611ffc612bd2565b01602001516001600160f81b0319168261201783604e612be6565b8151811061202757612027612bd2565b60200101906001600160f81b03191690815f1a905350600101611fdd565b505f5b60088110156120b75761205c816007612ba8565b612067906008612bbb565b60608601516001600160401b0390811691161c60f81b8261208983607e612be6565b8151811061209957612099612bd2565b60200101906001600160f81b03191690815f1a905350600101612048565b506002816040516120c89190612ead565b602060405180830381855afa1580156120e3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906121069190612a60565b94909350915050565b5f8281525f80516020612f99833981519152602052604081206003015481905f80516020612f7983398151915290600160401b90046001600160401b03908116908516811161216f5761216a6121658287612ec8565b611d5f565b612181565b61218161217c8683612ec8565b6126bc565b5f61218b876126c6565b5f888152600885016020526040812060030180546fffffffffffffffff00000000000000001916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6121e08a858b6109dc565b6040518263ffffffff1660e01b81526004016121fc9190612a2e565b6020604051808303815f875af1158015612218573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223c9190612a60565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b61229d611ce4565b6105c8612748565b6105c8611ce4565b6122b5611ce4565b80355f80516020612f7983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146123016080840160608501612ee8565b60ff16111561236e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103f8565b5f61237f6080840160608501612ee8565b60ff16116123e75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103f8565b6123f76080830160608401612ee8565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556124286060830160408401612bf9565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6109aa611ce4565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020612f79833981519152914291901580612548575060028301548151612544916001600160401b031690612be6565b8210155b1561256e576001600160401b03851660608201528181526040810151602082015261258d565b84816060018181516125809190612f08565b6001600160401b03169052505b606081015161259d906064612f28565b602082015160028501546001600160401b0392909216916125c89190600160401b900460ff16612bbb565b101561262c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103f8565b831561265557846001600160401b03168160400181815161264d9190612be6565b905250612674565b846001600160401b0316816040018181516126709190612ba8565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b6105ef815f612462565b5f8181525f80516020612f998339815191526020526040812060030180545f80516020612f79833981519152916001600160401b03909116908361270983612f53565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b612750611ce4565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b50805461278290612a77565b5f825580601f10612791575050565b601f0160209004905f5260205f20908101906105ef91906127f1565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612805575f81556001016127f2565b5090565b5f60208284031215612819575f80fd5b5035919050565b5f60208284031215612830575f80fd5b813563ffffffff81168114612843575f80fd5b9392505050565b6001600160a01b03811681146105ef575f80fd5b5f8082840360a0811215612870575f80fd5b608081121561287d575f80fd5b50829150608083013561288f8161284a565b809150509250929050565b80356001600160401b03811681146128b0575f80fd5b919050565b5f80604083850312156128c6575f80fd5b82356001600160401b038111156128db575f80fd5b8301606081860312156128ec575f80fd5b91506128fa6020840161289a565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061293b57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161296360408401826001600160a01b03169052565b50606083015161297e60608401826001600160401b03169052565b50608083015161299960808401826001600160401b03169052565b5060a08301516129b460a08401826001600160401b03169052565b5060c08301516129cf60c08401826001600160401b03169052565b5060e08301516129ea60e08401826001600160401b03169052565b5092915050565b5f60208284031215612a01575f80fd5b81356128438161284a565b5f5b83811015612a26578181015183820152602001612a0e565b50505f910152565b602081525f8251806020840152612a4c816040850160208701612a0c565b601f01601f19169190910160400192915050565b5f60208284031215612a70575f80fd5b5051919050565b600181811c90821680612a8b57607f821691505b602082108103612aa957634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612b0881612a77565b806020870152604060018084165f8114612b295760018114612b4557612b72565b60ff19851660408a0152604084151560051b8a01019550612b72565b895f5260205f205f5b85811015612b695781548b8201860152908301908801612b4e565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105e0576105e0612b94565b80820281158282048414176105e0576105e0612b94565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105e0576105e0612b94565b5f60208284031215612c09575f80fd5b6105dd8261289a565b5f808335601e19843603018112612c27575f80fd5b8301803591506001600160401b03821115612c40575f80fd5b60200191503681900382131561228e575f80fd5b601f8211156108be57805f5260205f20601f840160051c81016020851015612c795750805b601f840160051c820191505b81811015612c98575f8155600101612c85565b5050505050565b81516001600160401b03811115612cb857612cb8612b80565b612ccc81612cc68454612a77565b84612c54565b602080601f831160018114612cff575f8415612ce85750858301515b5f19600386901b1c1916600185901b178555612d56565b5f85815260208120601f198616915b82811015612d2d57888601518255948401946001909101908401612d0e565b5085821015612d4a57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b0381118282101715612d8057612d80612b80565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612dae57612dae612b80565b604052919050565b805180151581146128b0575f80fd5b5f8060408385031215612dd6575f80fd5b82516001600160401b0380821115612dec575f80fd5b9084019060608287031215612dff575f80fd5b612e07612d5e565b82518152602080840151612e1a8161284a565b82820152604084015183811115612e2f575f80fd5b80850194505087601f850112612e43575f80fd5b835183811115612e5557612e55612b80565b612e67601f8201601f19168301612d86565b93508084528882828701011115612e7c575f80fd5b612e8b81838601848801612a0c565b50826040830152819550612ea0818801612db6565b9450505050509250929050565b5f8251612ebe818460208701612a0c565b9190910192915050565b6001600160401b038281168282160390808211156129ea576129ea612b94565b5f60208284031215612ef8575f80fd5b813560ff81168114612843575f80fd5b6001600160401b038181168382160190808211156129ea576129ea612b94565b6001600160401b03818116838216028082169190828114612f4b57612f4b612b94565b505092915050565b5f6001600160401b03808316818103612f6e57612f6e612b94565b600101939250505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161307138038061307183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612f248061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c806397fb70d411610093578063c974d1b611610063578063c974d1b61461025c578063d5f20ff614610276578063df93d8de14610296578063f2fde38b146102a0575f80fd5b806397fb70d414610215578063a3a65e4814610228578063b771b3bc1461023b578063bee0a03f14610249575f80fd5b806366435abf116100ce57806366435abf1461018b578063715018a6146101b65780638994ab49146101be5780638da5cb5b146101d1575f80fd5b80630322ed98146100ff5780630cdd098514610114578063467ef06f14610165578063580a400614610178575b5f80fd5b61011261010d366004612768565b6102b3565b005b610152610122366004612768565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011261017336600461277f565b610488565b6101126101863660046127bd565b610495565b61019e610199366004612768565b6105a3565b6040516001600160401b03909116815260200161015c565b6101126105b7565b6101526101cc366004612814565b6105ca565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b610112610223366004612768565b6105e6565b61011261023636600461277f565b6105f2565b6101fd6005600160991b0181565b610112610257366004612768565b6107af565b610264601481565b60405160ff909116815260200161015c565b610289610284366004612768565b6108c3565b60405161015c9190612876565b61019e6202a30081565b6101126102ae366004612950565b6109a2565b5f8181525f80516020612ef883398151915260205260408082208151610100810190925280545f80516020612ed883398151915293929190829060ff16600581111561030157610301612862565b600581111561031257610312612862565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561039757610397612862565b146104015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104268584608001515f6109dc565b6040518263ffffffff1660e01b8152600401610442919061298d565b6020604051808303815f875af115801561045e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048291906129bf565b50505050565b61049181610bf9565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104d95750825b90505f826001600160401b031660011480156104f45750303b155b905081158015610502575080155b156105205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561054a57845460ff60401b1916600160401b1785555b6105548787610f6c565b831561059a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105ad826108c3565b60a0015192915050565b6105bf610f86565b6105c85f610fe1565b565b5f6105d3610f86565b6105dd8383611051565b90505b92915050565b6105ef8161158c565b50565b5f80516020612ed88339815191525f61060a836118a5565b90505f8061061b8360400151611a86565b915091508061067d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f8565b5f82815260078501602052604081208054610697906129d6565b90501180156106c9575060015f83815260088601602052604090205460ff1660058111156106c7576106c7612862565b145b6106e55760405162461bcd60e51b81526004016103f890612a0e565b5f82815260078501602052604081206106fd916126d5565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612ed88339815191529291906107f7906129d6565b9050118015610829575060015f83815260088301602052604090205460ff16600581111561082757610827612862565b145b6108455760405162461bcd60e51b81526004016103f890612a0e565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087e9190600401612a55565b6020604051808303815f875af115801561089a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108be91906129bf565b505050565b6108cb61270c565b5f8281525f80516020612ef88339815191526020526040908190208151610100810190925280545f80516020612ed8833981519152929190829060ff16600581111561091957610919612862565b600581111561092a5761092a612862565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6109aa610f86565b6001600160a01b0381166109d357604051631e4fbdf760e01b81525f60048201526024016103f8565b6105ef81610fe1565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a5557610a15816001612b07565b610a20906008612b1a565b5081515f90839083908110610a3757610a37612b31565b60200101906001600160f81b03191690815f1a905350600101610a01565b505f5b6004811015610ab857610a6c816003612b07565b610a77906008612b1a565b6001901c60f81b82610a8a836002612b45565b81518110610a9a57610a9a612b31565b60200101906001600160f81b03191690815f1a905350600101610a58565b505f5b6020811015610b1a57610acf81601f612b07565b610ada906008612b1a565b86901c60f81b82610aec836006612b45565b81518110610afc57610afc612b31565b60200101906001600160f81b03191690815f1a905350600101610abb565b505f5b6008811015610b8557610b31816007612b07565b610b3c906008612b1a565b6001600160401b038616901c60f81b82610b57836026612b45565b81518110610b6757610b67612b31565b60200101906001600160f81b03191690815f1a905350600101610b1d565b505f5b6008811015610bf057610b9c816007612b07565b610ba7906008612b1a565b6001600160401b038516901c60f81b82610bc283602e612b45565b81518110610bd257610bd2612b31565b60200101906001600160f81b03191690815f1a905350600101610b88565b50949350505050565b610c0161270c565b5f80516020612ed88339815191525f610c19846118a5565b90505f80610c2a8360400151611a86565b915091508015610c8f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610cc157610cc1612862565b6005811115610cd257610cd2612862565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d5957610d59612862565b1480610d775750600182516005811115610d7557610d75612862565b145b610dd65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103f8565b600382516005811115610deb57610deb612862565b03610df857506004610dfc565b5060055b6020808301515f90815260098801909152604081205581816005811115610e2557610e25612862565b90816005811115610e3857610e38612862565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610e6c57610e6c612862565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610f3757610f37612862565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610f74611ce5565b610f7d82611d2e565b61049181611d4f565b33610fb87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c85760405163118cdaa760e01b81523360048201526024016103f8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612ed8833981519152426110716040860160208701612b58565b6001600160401b0316116110e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103f8565b6110f36040850160208601612b58565b6001600160401b03166111096202a30042612b45565b1161117c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103f8565b83356111d45760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f8565b83355f908152600982016020526040902054156112445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f8565b6112516040850185612b71565b90506030146112b85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f8565b6112c2835f611d60565b5f8061135c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906113079190612b58565b6001600160401b0316815260200161132260408a018a612b71565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611f57565b5f8281526007860160205260409020919350915061137a8282612bfe565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113a790859060040161298d565b6020604051808303815f875af11580156113c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e791906129bf565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561146957611469612862565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161155e91908e01908e01612b58565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612ef883398151915260205260408082208151610100810190925280545f80516020612ed883398151915293929190829060ff1660058111156115da576115da612862565b60058111156115eb576115eb612862565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561167357611673612862565b146116cf5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f8565b60408101516001600160a01b0316336001600160a01b0316146117495760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103f8565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561178d5761178d612862565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61185084826122fc565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b60408051606080820183525f8083526020830181905292820152905f80516020612ed88339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561191a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119419190810190612d24565b91509150806119a85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f8565b8254825114611a0b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103f8565b60208201516001600160a01b031615611a7e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103f8565b509392505050565b5f808251602714611aeb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103f8565b5f805b6002811015611b3a57611b02816001612b07565b611b0d906008612b1a565b61ffff16858281518110611b2357611b23612b31565b016020015160f81c901b9190911790600101611aee565b5061ffff811615611b995760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103f8565b5f805b6004811015611bf457611bb0816003612b07565b611bbb906008612b1a565b63ffffffff1686611bcd836002612b45565b81518110611bdd57611bdd612b31565b016020015160f81c901b9190911790600101611b9c565b5063ffffffff8116600214611c5b5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103f8565b5f805b6020811015611cb057611c7281601f612b07565b611c7d906008612b1a565b87611c89836006612b45565b81518110611c9957611c99612b31565b016020015160f81c901b9190911790600101611c5e565b505f86602681518110611cc557611cc5612b31565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c857604051631afcd79f60e31b815260040160405180910390fd5b611d36611ce5565b611d3e612458565b611d46612468565b6105ef81612470565b611d57611ce5565b6105ef8161261d565b5f80516020612ed88339815191525f6001600160401b038084169085161115611d9457611d8d8385612e0c565b9050611da1565b611d9e8484612e0c565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580611e03575060028401548151611dff916001600160401b031690612b45565b8210155b15611e29576001600160401b038316606082015281815260408101516020820152611e48565b8281606001818151611e3b9190612e2c565b6001600160401b03169052505b6060810151611e58906064612e4c565b602082015160028601546001600160401b039290921691611e839190600160401b900460ff16612b1a565b1015611ee75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103f8565b611ef18587612e0c565b6001600160401b031681604001818151611f0b9190612b45565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f6060826080015151603014611fc15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561203857611ff8816001612b07565b612003906008612b1a565b5081515f9083908390811061201a5761201a612b31565b60200101906001600160f81b03191690815f1a905350600101611fe4565b505f5b60048110156120965761204f816003612b07565b61205a906008612b1a565b505f82612068836002612b45565b8151811061207857612078612b31565b60200101906001600160f81b03191690815f1a90535060010161203b565b505f5b60208110156120f357845181602081106120b5576120b5612b31565b1a60f81b826120c5836006612b45565b815181106120d5576120d5612b31565b60200101906001600160f81b03191690815f1a905350600101612099565b505f5b6020811015612153578460200151816020811061211557612115612b31565b1a60f81b82612125836026612b45565b8151811061213557612135612b31565b60200101906001600160f81b03191690815f1a9053506001016120f6565b505f5b60088110156121c75761216a816007612b07565b612175906008612b1a565b60ff1685604001516001600160401b0316901c60f81b828260466121999190612b45565b815181106121a9576121a9612b31565b60200101906001600160f81b03191690815f1a905350600101612156565b505f5b603081101561223257846080015181815181106121e9576121e9612b31565b01602001516001600160f81b0319168261220483604e612b45565b8151811061221457612214612b31565b60200101906001600160f81b03191690815f1a9053506001016121ca565b505f5b60088110156122a457612249816007612b07565b612254906008612b1a565b60608601516001600160401b0390811691161c60f81b8261227683607e612b45565b8151811061228657612286612b31565b60200101906001600160f81b03191690815f1a905350600101612235565b506002816040516122b59190612e77565b602060405180830381855afa1580156122d0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906122f391906129bf565b94909350915050565b5f8281525f80516020612ef8833981519152602052604081206003015481905f80516020612ed883398151915290600160401b90046001600160401b03166123448582611d60565b5f61234e87612625565b5f888152600885016020526040812060030180546fffffffffffffffff00000000000000001916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123a38a858b6109dc565b6040518263ffffffff1660e01b81526004016123bf919061298d565b6020604051808303815f875af11580156123db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ff91906129bf565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b612460611ce5565b6105c86126a7565b6105c8611ce5565b612478611ce5565b80355f80516020612ed883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146124c46080840160608501612e92565b60ff1611156125315760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103f8565b5f6125426080840160608501612e92565b60ff16116125aa5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103f8565b6125ba6080830160608401612e92565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556125eb6060830160408401612b58565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6109aa611ce5565b5f8181525f80516020612ef88339815191526020526040812060030180545f80516020612ed8833981519152916001600160401b03909116908361266883612eb2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6126af611ce5565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5080546126e1906129d6565b5f825580601f106126f0575050565b601f0160209004905f5260205f20908101906105ef9190612750565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612764575f8155600101612751565b5090565b5f60208284031215612778575f80fd5b5035919050565b5f6020828403121561278f575f80fd5b813563ffffffff811681146127a2575f80fd5b9392505050565b6001600160a01b03811681146105ef575f80fd5b5f8082840360a08112156127cf575f80fd5b60808112156127dc575f80fd5b5082915060808301356127ee816127a9565b809150509250929050565b80356001600160401b038116811461280f575f80fd5b919050565b5f8060408385031215612825575f80fd5b82356001600160401b0381111561283a575f80fd5b83016060818603121561284b575f80fd5b9150612859602084016127f9565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061289a57634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516128c260408401826001600160a01b03169052565b5060608301516128dd60608401826001600160401b03169052565b5060808301516128f860808401826001600160401b03169052565b5060a083015161291360a08401826001600160401b03169052565b5060c083015161292e60c08401826001600160401b03169052565b5060e083015161294960e08401826001600160401b03169052565b5092915050565b5f60208284031215612960575f80fd5b81356127a2816127a9565b5f5b8381101561298557818101518382015260200161296d565b50505f910152565b602081525f82518060208401526129ab81604085016020870161296b565b601f01601f19169190910160400192915050565b5f602082840312156129cf575f80fd5b5051919050565b600181811c908216806129ea57607f821691505b602082108103612a0857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612a67816129d6565b806020870152604060018084165f8114612a885760018114612aa457612ad1565b60ff19851660408a0152604084151560051b8a01019550612ad1565b895f5260205f205f5b85811015612ac85781548b8201860152908301908801612aad565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105e0576105e0612af3565b80820281158282048414176105e0576105e0612af3565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105e0576105e0612af3565b5f60208284031215612b68575f80fd5b6105dd826127f9565b5f808335601e19843603018112612b86575f80fd5b8301803591506001600160401b03821115612b9f575f80fd5b602001915036819003821315612451575f80fd5b601f8211156108be57805f5260205f20601f840160051c81016020851015612bd85750805b601f840160051c820191505b81811015612bf7575f8155600101612be4565b5050505050565b81516001600160401b03811115612c1757612c17612adf565b612c2b81612c2584546129d6565b84612bb3565b602080601f831160018114612c5e575f8415612c475750858301515b5f19600386901b1c1916600185901b178555612cb5565b5f85815260208120601f198616915b82811015612c8c57888601518255948401946001909101908401612c6d565b5085821015612ca957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b0381118282101715612cdf57612cdf612adf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612d0d57612d0d612adf565b604052919050565b8051801515811461280f575f80fd5b5f8060408385031215612d35575f80fd5b82516001600160401b0380821115612d4b575f80fd5b9084019060608287031215612d5e575f80fd5b612d66612cbd565b82518152602080840151612d79816127a9565b82820152604084015183811115612d8e575f80fd5b80850194505087601f850112612da2575f80fd5b835183811115612db457612db4612adf565b612dc6601f8201601f19168301612ce5565b93508084528882828701011115612ddb575f80fd5b612dea8183860184880161296b565b50826040830152819550612dff818801612d15565b9450505050509250929050565b6001600160401b0382811682821603908082111561294957612949612af3565b6001600160401b0381811683821601908082111561294957612949612af3565b6001600160401b03818116838216028082169190828114612e6f57612e6f612af3565b505092915050565b5f8251612e8881846020870161296b565b9190910192915050565b5f60208284031215612ea2575f80fd5b813560ff811681146127a2575f80fd5b5f6001600160401b03808316818103612ecd57612ecd612af3565b600101939250505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index be5ca7392..bd4b5373b 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -144,7 +144,7 @@ abstract contract ValidatorManager is require(input.blsPublicKey.length == 48, "ValidatorManager: invalid blsPublicKey length"); // Check that adding this validator would not exceed the maximum churn rate. - _checkAndUpdateChurnTrackerAddition(weight); + _checkAndUpdateChurnTracker(weight, 0); (bytes32 validationID, bytes memory registerSubnetValidatorMessage) = ValidatorMessages .packRegisterSubnetValidatorMessage( @@ -376,12 +376,8 @@ abstract contract ValidatorManager is ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); uint64 validatorWeight = $._validationPeriods[validationID].weight; - // Check that removing this delegator would not exceed the maximum churn rate. - if (newWeight >= validatorWeight) { - _checkAndUpdateChurnTrackerAddition(newWeight - validatorWeight); - } else { - _checkAndUpdateChurnTrackerRemoval(validatorWeight - newWeight); - } + // Check that changing the validator weight would not exceed the maximum churn rate. + _checkAndUpdateChurnTracker(newWeight, validatorWeight); uint64 nonce = _incrementAndGetNonce(validationID); @@ -402,28 +398,21 @@ abstract contract ValidatorManager is return (nonce, messageID); } - /** - * @dev Helper function to check if the stake amount to be added exceeds churn thresholds. - */ - function _checkAndUpdateChurnTrackerAddition(uint64 weight) internal { - _checkAndUpdateChurnTracker(weight, true); - } - - /** - * @dev Helper function to check if the stake amount to be removed exceeds churn thresholds. - */ - function _checkAndUpdateChurnTrackerRemoval(uint64 weight) internal { - _checkAndUpdateChurnTracker(weight, false); - } - /** * @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 * not exceeded, the function will update the churn tracker with the new weight. */ - function _checkAndUpdateChurnTracker(uint64 weight, bool addition) private { + function _checkAndUpdateChurnTracker(uint64 newWeight, uint64 oldWeight) private { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); + uint64 weightChange; + if (newWeight > oldWeight) { + weightChange = newWeight - oldWeight; + } else { + weightChange = oldWeight - newWeight; + } + uint256 currentTime = block.timestamp; ValidatorChurnPeriod memory churnTracker = $._churnTracker; @@ -431,12 +420,12 @@ abstract contract ValidatorManager is churnTracker.startedAt == 0 || currentTime >= churnTracker.startedAt + $._churnPeriodSeconds ) { - churnTracker.churnAmount = weight; + churnTracker.churnAmount = weightChange; churnTracker.startedAt = currentTime; churnTracker.initialWeight = churnTracker.totalWeight; } else { // Churn is always additive whether the weight is being added or removed. - churnTracker.churnAmount += weight; + churnTracker.churnAmount += weightChange; } require( @@ -445,11 +434,7 @@ abstract contract ValidatorManager is "ValidatorManager: maximum churn rate exceeded" ); - if (addition) { - churnTracker.totalWeight += weight; - } else { - churnTracker.totalWeight -= weight; - } + churnTracker.totalWeight += newWeight - oldWeight; $._churnTracker = churnTracker; } From eed92e4f0cd97e9393e5e303cce60a14f9d369b2 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 10:36:12 -0400 Subject: [PATCH 321/545] Simplify churn tracking --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- .../go/staking/PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/staking/ValidatorManager.sol | 4 +++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index a63c24f7a..ebb7f3201 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"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\":\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161515d38038061515d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150108061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f36600461451a565b610357565b005b610154610164366004614555565b61070e565b6101a7610177366004614555565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e2366004614555565b6108de565b6040516001600160401b0390911681526020016101b1565b61015461020d366004614580565b6108f4565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c3660046145be565b6109d3565b61015461024f3660046145d7565b6109fe565b6101a7610262366004614613565b610bce565b6101e7610275366004614555565b610be7565b61015461028836600461451a565b610bfb565b61015461029b3660046145d7565b610cdb565b6101a76102ae36600461462e565b610eea565b6101a76102c136600461464e565b610efd565b6101546102d43660046145be565b610f29565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d366004614555565b6110e6565b610154610320366004614555565b61136c565b6101c2601481565b61034061033b366004614555565b611480565b6040516101b191906146c3565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614f648339815191529184156103a9576103a6828561155f565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db6146af565b60048111156103ec576103ec6146af565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61046884611480565b905060028251600481111561047f5761047f6146af565b146104d15760405162461bcd60e51b815260206004820152602a60248201525f80516020614f848339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105365760405162461bcd60e51b815260206004820152603360248201525f80516020614f848339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c8565b6003825280516002906005811115610550576105506146af565b03610594575f82606001518260a0015161056a91906147b1565b905061057685826117fb565b506001600160401b0390811660e0850152421660a0840152506105b7565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156105e8576105e86146af565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916106fc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614fe483398151915260205260408082208151610100810190925280545f80516020614fa483398151915293929190829060ff16600581111561075c5761075c6146af565b600581111561076d5761076d6146af565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156107f2576107f26146af565b146108575760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb61087c8584608001515f611952565b6040518263ffffffff1660e01b815260040161089891906147f3565b6020604051808303815f875af11580156108b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108d89190614825565b50505050565b5f6108ee64e8d4a510008361483c565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061093d575080546001600160401b03808416911610155b1561095b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109868484611b6f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109dd82611b89565b90506109fa81606001516001600160401b03168260400151611efc565b5050565b5f80516020614f648339815191525f610a1684611f32565b90505f80610a278360400151612113565b50915091505f610a3683611480565b9050816001600160401b031681608001516001600160401b03161015610a6e5760405162461bcd60e51b81526004016104c89061485b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ab35760405162461bcd60e51b81526004016104c89061489d565b60015f87815260068701602052604090205460ff166004811115610ad957610ad96146af565b14610b425760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6108ee6001600160401b03831664e8d4a510006148e6565b5f610bf182611480565b60a0015192915050565b5f80516020614f648339815191525f610c1385611480565b5f86815260058401602052604090205460c0820151919250610c4591620100009091046001600160401b0316906148fd565b6001600160401b0316421015610cb95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c8565b8315610ccb57610cc9858461155f565b505b610cd48561234e565b5050505050565b5f80516020614f648339815191525f610cf384611f32565b90505f80610d048360400151612113565b50915091505f610d1383611480565b9050816001600160401b031681608001516001600160401b03161015610d4b5760405162461bcd60e51b81526004016104c89061485b565b5f8681526006860160205260409020600301546001600160401b0380841691161115610d895760405162461bcd60e51b81526004016104c89061489d565b60035f87815260068701602052604090205460ff166004811115610daf57610daf6146af565b14610e035760405162461bcd60e51b815260206004820152603160248201525f80516020614f848339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610ea891611efc565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610ef6833384612667565b9392505050565b5f610f066129d3565b610f11848484612a0a565b9050610ef660015f80516020614fc483398151915255565b5f80516020614fa48339815191525f610f4183611f32565b90505f80610f528360400151612c43565b9150915080610fb45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c8565b5f82815260078501602052604081208054610fce9061491d565b9050118015611000575060015f83815260088601602052604090205460ff166005811115610ffe57610ffe6146af565b145b61101c5760405162461bcd60e51b81526004016104c890614955565b5f828152600785016020526040812061103491614462565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f6483398151915293929190829060ff166004811115611147576111476146af565b6004811115611158576111586146af565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156111df576111df6146af565b14806111fd57506003815160048111156111fb576111fb6146af565b145b6112515760405162461bcd60e51b815260206004820152603260248201525f80516020614f84833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c8565b5f61125f8260400151611480565b905080608001516001600160401b03165f036112e35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb611310846040015184608001518560a00151611952565b6040518263ffffffff1660e01b815260040161132c91906147f3565b6020604051808303815f875af1158015611348573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd49190614825565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fa48339815191529291906113b49061491d565b90501180156113e6575060015f83815260088301602052604090205460ff1660058111156113e4576113e46146af565b145b6114025760405162461bcd60e51b81526004016104c890614955565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161143b919060040161499c565b6020604051808303815f875af1158015611457573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147b9190614825565b505050565b611488614499565b5f8281525f80516020614fe48339815191526020526040908190208151610100810190925280545f80516020614fa4833981519152929190829060ff1660058111156114d6576114d66146af565b60058111156114e7576114e76146af565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115d19190810190614a9d565b91509150806116345760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169b9190614825565b8251146116ff5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c8565b60208201516001600160a01b0316156117755760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c8565b5f806117848460400151612de4565b915091508187146117f15760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c8565b9695505050505050565b5f8281525f80516020614fe4833981519152602052604081206003015481905f80516020614fa483398151915290600160401b90046001600160401b03166118438582612fbc565b5f61184d876131b3565b5f8881526008850160205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61189d8a858b611952565b6040518263ffffffff1660e01b81526004016118b991906147f3565b6020604051808303815f875af11580156118d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f99190614825565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119cb5761198b816001614b85565b6119969060086148e6565b5081515f908390839081106119ad576119ad614b98565b60200101906001600160f81b03191690815f1a905350600101611977565b505f5b6004811015611a2e576119e2816003614b85565b6119ed9060086148e6565b6001901c60f81b82611a00836002614bac565b81518110611a1057611a10614b98565b60200101906001600160f81b03191690815f1a9053506001016119ce565b505f5b6020811015611a9057611a4581601f614b85565b611a509060086148e6565b86901c60f81b82611a62836006614bac565b81518110611a7257611a72614b98565b60200101906001600160f81b03191690815f1a905350600101611a31565b505f5b6008811015611afb57611aa7816007614b85565b611ab29060086148e6565b6001600160401b038616901c60f81b82611acd836026614bac565b81518110611add57611add614b98565b60200101906001600160f81b03191690815f1a905350600101611a93565b505f5b6008811015611b6657611b12816007614b85565b611b1d9060086148e6565b6001600160401b038516901c60f81b82611b3883602e614bac565b81518110611b4857611b48614b98565b60200101906001600160f81b03191690815f1a905350600101611afe565b50949350505050565b611b77613235565b611b8082613280565b6109fa816132ef565b611b91614499565b5f80516020614fa48339815191525f611ba984611f32565b90505f80611bba8360400151612c43565b915091508015611c1f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611c5157611c516146af565b6005811115611c6257611c626146af565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ce957611ce96146af565b1480611d075750600182516005811115611d0557611d056146af565b145b611d665760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c8565b600382516005811115611d7b57611d7b6146af565b03611d8857506004611d8c565b5060055b6020808301515f90815260098801909152604081205581816005811115611db557611db56146af565b90816005811115611dc857611dc86146af565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611dfc57611dfc6146af565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ec757611ec76146af565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546109fa906001600160a01b031682846133a3565b60408051606080820183525f8083526020830181905292820152905f80516020614fa48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fa7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fce9190810190614a9d565b91509150806120355760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c8565b82548251146120985760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c8565b60208201516001600160a01b03161561210b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c8565b509392505050565b5f805f83516036146121375760405162461bcd60e51b81526004016104c890614bbf565b5f805b60028110156121865761214e816001614b85565b6121599060086148e6565b61ffff1686828151811061216f5761216f614b98565b016020015160f81c901b919091179060010161213a565b5061ffff8116156121a95760405162461bcd60e51b81526004016104c890614c08565b5f805b6004811015612204576121c0816003614b85565b6121cb9060086148e6565b63ffffffff16876121dd836002614bac565b815181106121ed576121ed614b98565b016020015160f81c901b91909117906001016121ac565b5063ffffffff811660031461222b5760405162461bcd60e51b81526004016104c890614c4b565b5f805b60208110156122805761224281601f614b85565b61224d9060086148e6565b88612259836006614bac565b8151811061226957612269614b98565b016020015160f81c901b919091179060010161222e565b505f805b60088110156122df57612298816007614b85565b6122a39060086148e6565b6001600160401b0316896122b8836026614bac565b815181106122c8576122c8614b98565b016020015160f81c901b9190911790600101612284565b505f805b600881101561233e576122f7816007614b85565b6123029060086148e6565b6001600160401b03168a61231783602e614bac565b8151811061232757612327614b98565b016020015160f81c901b91909117906001016122e3565b5091989097509095509350505050565b5f8181525f80516020614fe483398151915260205260408082208151610100810190925280545f80516020614fa483398151915293929190829060ff16600581111561239c5761239c6146af565b60058111156123ad576123ad6146af565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612435576124356146af565b146124915760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c8565b60408101516001600160a01b0316336001600160a01b03161461250b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c8565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561254f5761254f6146af565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61261284826117fb565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f6126706129d3565b5f80516020614f648339815191525f61268b6101e285613402565b90505f61269787611480565b90506002815160058111156126ae576126ae6146af565b1461270d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c8565b5f828260a0015161271e91906148fd565b60048501546060840151919250612740916001600160401b0390911690614c92565b6001600160401b0316816001600160401b031611156127bf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c8565b5f806127cb8a846117fb565b915091505f8a836040516020016127f992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115612894576128946146af565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050610ef660015f80516020614fc483398151915255565b5f80516020614fc4833981519152805460011901612a0457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f64833981519152906001600160401b0316612a566040860160208701614613565b6001600160401b03161015612ac55760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c8565b6003810154612ad76020860186614ccc565b61ffff1610158015612afb5750612710612af46020860186614ccc565b61ffff1611155b612b175760405162461bcd60e51b81526004016104c890614ce7565b8054831015612b7a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c8565b8060010154831115612be15760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c8565b5f612beb84613402565b90505f612bf7826108de565b90505f612c048883613438565b5f81815260058601602052604090209091508790612c228282614d32565b509098975050505050505050565b60015f80516020614fc483398151915255565b5f808251602714612c665760405162461bcd60e51b81526004016104c890614bbf565b5f805b6002811015612cb557612c7d816001614b85565b612c889060086148e6565b61ffff16858281518110612c9e57612c9e614b98565b016020015160f81c901b9190911790600101612c69565b5061ffff811615612cd85760405162461bcd60e51b81526004016104c890614c08565b5f805b6004811015612d3357612cef816003614b85565b612cfa9060086148e6565b63ffffffff1686612d0c836002614bac565b81518110612d1c57612d1c614b98565b016020015160f81c901b9190911790600101612cdb565b5063ffffffff8116600214612d5a5760405162461bcd60e51b81526004016104c890614c4b565b5f805b6020811015612daf57612d7181601f614b85565b612d7c9060086148e6565b87612d88836006614bac565b81518110612d9857612d98614b98565b016020015160f81c901b9190911790600101612d5d565b505f86602681518110612dc457612dc4614b98565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e075760405162461bcd60e51b81526004016104c890614bbf565b5f805b6002811015612e5657612e1e816001614b85565b612e299060086148e6565b61ffff16858281518110612e3f57612e3f614b98565b016020015160f81c901b9190911790600101612e0a565b5061ffff811615612e795760405162461bcd60e51b81526004016104c890614c08565b5f805b6004811015612ed457612e90816003614b85565b612e9b9060086148e6565b63ffffffff1686612ead836002614bac565b81518110612ebd57612ebd614b98565b016020015160f81c901b9190911790600101612e7c565b5063ffffffff8116600414612efb5760405162461bcd60e51b81526004016104c890614c4b565b5f805b6020811015612f5057612f1281601f614b85565b612f1d9060086148e6565b87612f29836006614bac565b81518110612f3957612f39614b98565b016020015160f81c901b9190911790600101612efe565b505f805b6008811015612faf57612f68816007614b85565b612f739060086148e6565b6001600160401b031688612f88836026614bac565b81518110612f9857612f98614b98565b016020015160f81c901b9190911790600101612f54565b5090969095509350505050565b5f80516020614fa48339815191525f6001600160401b038084169085161115612ff057612fe983856147b1565b9050612ffd565b612ffa84846147b1565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b031660608201524291158061305f57506002840154815161305b916001600160401b031690614bac565b8210155b15613085576001600160401b0383166060820152818152604081015160208201526130a4565b828160600181815161309791906148fd565b6001600160401b03169052505b60608101516130b4906064614c92565b602082015160028601546001600160401b0392909216916130df9190600160401b900460ff166148e6565b10156131435760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c8565b61314d85876147b1565b6001600160401b0316816040018181516131679190614bac565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614fe48339815191526020526040812060030180545f80516020614fa4833981519152916001600160401b0390911690836131f683614d88565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661327e57604051631afcd79f60e31b815260040160405180910390fd5b565b613288613235565b61329181613973565b6132ec608082013560a08301356132ae60e0850160c08601614613565b6132bf610100860160e08701614ccc565b61ffff166132d561012087016101008801614dad565b6132e761014088016101208901614dcd565b613994565b50565b6132f7613235565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166133835760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261147b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613bd8565b5f6108ee827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613c39565b5f5f80516020614fa4833981519152426134586040860160208701614613565b6001600160401b0316116134ca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c8565b6134da6040850160208601614613565b6001600160401b03166134f06202a30042614bac565b116135635760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c8565b83356135bb5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c8565b83355f9081526009820160205260409020541561362b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c8565b6136386040850185614de8565b905060301461369f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c8565b6136a9835f612fbc565b5f806137436040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906136ee9190614613565b6001600160401b0316815260200161370960408a018a614de8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613d9b565b5f828152600786016020526040902091935091506137618282614e6e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061378e9085906004016147f3565b6020604051808303815f875af11580156137aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137ce9190614825565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613850576138506146af565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161394591908e01908e01614613565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61397b613235565b613983614140565b61398b614150565b6132ec81614158565b61399c613235565b5f80516020614f6483398151915283613a085760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c8565b612710841115613a2a5760405162461bcd60e51b81526004016104c890614ce7565b85871115613a925760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c8565b5f8360ff1611613aff5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c8565b600a60ff84161115613b715760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c8565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613bec6001600160a01b03841683614305565b905080515f14158015613c10575080806020019051810190613c0e9190614f2d565b155b1561147b57604051635274afe760e01b81526001600160a01b03841660048201526024016104c8565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613c7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ca39190614825565b9050613cba6001600160a01b038516333086614312565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613cfe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d229190614825565b9050818111613d885760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c8565b613d928282614b85565b95945050505050565b5f6060826080015151603014613e055760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613e7c57613e3c816001614b85565b613e479060086148e6565b5081515f90839083908110613e5e57613e5e614b98565b60200101906001600160f81b03191690815f1a905350600101613e28565b505f5b6004811015613eda57613e93816003614b85565b613e9e9060086148e6565b505f82613eac836002614bac565b81518110613ebc57613ebc614b98565b60200101906001600160f81b03191690815f1a905350600101613e7f565b505f5b6020811015613f375784518160208110613ef957613ef9614b98565b1a60f81b82613f09836006614bac565b81518110613f1957613f19614b98565b60200101906001600160f81b03191690815f1a905350600101613edd565b505f5b6020811015613f975784602001518160208110613f5957613f59614b98565b1a60f81b82613f69836026614bac565b81518110613f7957613f79614b98565b60200101906001600160f81b03191690815f1a905350600101613f3a565b505f5b600881101561400b57613fae816007614b85565b613fb99060086148e6565b60ff1685604001516001600160401b0316901c60f81b82826046613fdd9190614bac565b81518110613fed57613fed614b98565b60200101906001600160f81b03191690815f1a905350600101613f9a565b505f5b6030811015614076578460800151818151811061402d5761402d614b98565b01602001516001600160f81b0319168261404883604e614bac565b8151811061405857614058614b98565b60200101906001600160f81b03191690815f1a90535060010161400e565b505f5b60088110156140e85761408d816007614b85565b6140989060086148e6565b60608601516001600160401b0390811691161c60f81b826140ba83607e614bac565b815181106140ca576140ca614b98565b60200101906001600160f81b03191690815f1a905350600101614079565b506002816040516140f99190614f48565b602060405180830381855afa158015614114573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906141379190614825565b94909350915050565b614148613235565b61327e61434b565b61327e613235565b614160613235565b80355f80516020614fa483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146141ac6080840160608501614dad565b60ff1611156142195760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c8565b5f61422a6080840160608501614dad565b60ff16116142925760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c8565b6142a26080830160608401614dad565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556142d36060830160408401614613565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610ef683835f614353565b6040516001600160a01b0384811660248301528381166044830152606482018390526108d89186918216906323b872dd906084016133d0565b612c30613235565b6060814710156143785760405163cd78605960e01b81523060048201526024016104c8565b5f80856001600160a01b031684866040516143939190614f48565b5f6040518083038185875af1925050503d805f81146143cd576040519150601f19603f3d011682016040523d82523d5f602084013e6143d2565b606091505b50915091506117f18683836060826143f2576143ed82614439565b610ef6565b815115801561440957506001600160a01b0384163b155b1561443257604051639996b31560e01b81526001600160a01b03851660048201526024016104c8565b5080610ef6565b8051156144495780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461446e9061491d565b5f825580601f1061447d575050565b601f0160209004905f5260205f20908101906132ec91906144dd565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156144f1575f81556001016144de565b5090565b80151581146132ec575f80fd5b803563ffffffff81168114614515575f80fd5b919050565b5f805f6060848603121561452c575f80fd5b83359250602084013561453e816144f5565b915061454c60408501614502565b90509250925092565b5f60208284031215614565575f80fd5b5035919050565b6001600160a01b03811681146132ec575f80fd5b5f80828403610160811215614593575f80fd5b610140808212156145a2575f80fd5b84935083013590506145b38161456c565b809150509250929050565b5f602082840312156145ce575f80fd5b610ef682614502565b5f80604083850312156145e8575f80fd5b6145f183614502565b946020939093013593505050565b6001600160401b03811681146132ec575f80fd5b5f60208284031215614623575f80fd5b8135610ef6816145ff565b5f806040838503121561463f575f80fd5b50508035926020909101359150565b5f805f8385036080811215614661575f80fd5b84356001600160401b03811115614676575f80fd5b850160608188031215614687575f80fd5b93506040601f198201121561469a575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106146e757634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161470f60408401826001600160a01b03169052565b50606083015161472a60608401826001600160401b03169052565b50608083015161474560808401826001600160401b03169052565b5060a083015161476060a08401826001600160401b03169052565b5060c083015161477b60c08401826001600160401b03169052565b5060e083015161479660e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147965761479661479d565b5f5b838110156147eb5781810151838201526020016147d3565b50505f910152565b602081525f82518060208401526148118160408501602087016147d1565b601f01601f19169190910160400192915050565b5f60208284031215614835575f80fd5b5051919050565b5f8261485657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176108ee576108ee61479d565b6001600160401b038181168382160190808211156147965761479661479d565b600181811c9082168061493157607f821691505b60208210810361494f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546149ae8161491d565b806020870152604060018084165f81146149cf57600181146149eb57614a18565b60ff19851660408a0152604084151560051b8a01019550614a18565b895f5260205f205f5b85811015614a0f5781548b82018601529083019088016149f4565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614a5c57614a5c614a26565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614a8a57614a8a614a26565b604052919050565b8051614515816144f5565b5f8060408385031215614aae575f80fd5b82516001600160401b0380821115614ac4575f80fd5b9084019060608287031215614ad7575f80fd5b614adf614a3a565b82518152602080840151614af28161456c565b82820152604084015183811115614b07575f80fd5b80850194505087601f850112614b1b575f80fd5b835183811115614b2d57614b2d614a26565b614b3f601f8201601f19168301614a62565b93508084528882828701011115614b54575f80fd5b614b63818386018488016147d1565b50826040830152819550614b78818801614a92565b9450505050509250929050565b818103818111156108ee576108ee61479d565b634e487b7160e01b5f52603260045260245ffd5b808201808211156108ee576108ee61479d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614cb557614cb561479d565b505092915050565b61ffff811681146132ec575f80fd5b5f60208284031215614cdc575f80fd5b8135610ef681614cbd565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614d3d81614cbd565b61ffff8116905081548161ffff1982161783556020840135614d5e816145ff565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6001600160401b03808316818103614da357614da361479d565b6001019392505050565b5f60208284031215614dbd575f80fd5b813560ff81168114610ef6575f80fd5b5f60208284031215614ddd575f80fd5b8135610ef68161456c565b5f808335601e19843603018112614dfd575f80fd5b8301803591506001600160401b03821115614e16575f80fd5b60200191503681900382131561194b575f80fd5b601f82111561147b57805f5260205f20601f840160051c81016020851015614e4f5750805b601f840160051c820191505b81811015610cd4575f8155600101614e5b565b81516001600160401b03811115614e8757614e87614a26565b614e9b81614e95845461491d565b84614e2a565b602080601f831160018114614ece575f8415614eb75750858301515b5f19600386901b1c1916600185901b178555614f25565b5f85815260208120601f198616915b82811015614efc57888601518255948401946001909101908401614edd565b5085821015614f1957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614f3d575f80fd5b8151610ef6816144f5565b5f8251614f598184602087016147d1565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161517438038061517483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150278061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061013d575f3560e01c806376f78621116100b4578063b771b3bc11610079578063b771b3bc146102d9578063ba3a4b97146102ff578063bee0a03f14610312578063c974d1b614610325578063d5f20ff61461032d578063df93d8de1461034d575f80fd5b806376f786211461027a57806398f3e2b41461028d5780639e1bc4ef146102a0578063a13fd29d146102b3578063a3a65e48146102c6575f80fd5b8063330a0a3a11610105578063330a0a3a146101ff57806335455ded14610212578063467ef06f1461022e5780635297fae614610241578063620658561461025457806366435abf14610267575f80fd5b80630118acc4146101415780630322ed98146101565780630cdd098514610169578063151d30d1146101ba5780632e2194d8146101d4575b5f80fd5b61015461014f366004614531565b610357565b005b61015461016436600461456c565b61070e565b6101a761017736600461456c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101c2600a81565b60405160ff90911681526020016101b1565b6101e76101e236600461456c565b6108de565b6040516001600160401b0390911681526020016101b1565b61015461020d366004614597565b6108f4565b61021b61271081565b60405161ffff90911681526020016101b1565b61015461023c3660046145d5565b6109d3565b61015461024f3660046145ee565b6109fe565b6101a761026236600461462a565b610bce565b6101e761027536600461456c565b610be7565b610154610288366004614531565b610bfb565b61015461029b3660046145ee565b610cdb565b6101a76102ae366004614645565b610eea565b6101a76102c1366004614665565b610efd565b6101546102d43660046145d5565b610f29565b6102e76005600160991b0181565b6040516001600160a01b0390911681526020016101b1565b61015461030d36600461456c565b6110e6565b61015461032036600461456c565b61136c565b6101c2601481565b61034061033b36600461456c565b611480565b6040516101b191906146da565b6101e76202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614f7b8339815191529184156103a9576103a6828561155f565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103db576103db6146c6565b60048111156103ec576103ec6146c6565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61046884611480565b905060028251600481111561047f5761047f6146c6565b146104d15760405162461bcd60e51b815260206004820152602a60248201525f80516020614f9b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105365760405162461bcd60e51b815260206004820152603360248201525f80516020614f9b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104c8565b6003825280516002906005811115610550576105506146c6565b03610594575f82606001518260a0015161056a91906147c8565b905061057685826117fb565b506001600160401b0390811660e0850152421660a0840152506105b7565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156105e8576105e86146c6565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916106fc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614ffb83398151915260205260408082208151610100810190925280545f80516020614fbb83398151915293929190829060ff16600581111561075c5761075c6146c6565b600581111561076d5761076d6146c6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156107f2576107f26146c6565b146108575760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb61087c8584608001515f611952565b6040518263ffffffff1660e01b8152600401610898919061480a565b6020604051808303815f875af11580156108b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108d8919061483c565b50505050565b5f6108ee64e8d4a5100083614853565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061093d575080546001600160401b03808416911610155b1561095b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109868484611b6f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f6109dd82611b89565b90506109fa81606001516001600160401b03168260400151611efc565b5050565b5f80516020614f7b8339815191525f610a1684611f32565b90505f80610a278360400151612113565b50915091505f610a3683611480565b9050816001600160401b031681608001516001600160401b03161015610a6e5760405162461bcd60e51b81526004016104c890614872565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610ab35760405162461bcd60e51b81526004016104c8906148b4565b60015f87815260068701602052604090205460ff166004811115610ad957610ad96146c6565b14610b425760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f6108ee6001600160401b03831664e8d4a510006148fd565b5f610bf182611480565b60a0015192915050565b5f80516020614f7b8339815191525f610c1385611480565b5f86815260058401602052604090205460c0820151919250610c4591620100009091046001600160401b031690614914565b6001600160401b0316421015610cb95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104c8565b8315610ccb57610cc9858461155f565b505b610cd48561234e565b5050505050565b5f80516020614f7b8339815191525f610cf384611f32565b90505f80610d048360400151612113565b50915091505f610d1383611480565b9050816001600160401b031681608001516001600160401b03161015610d4b5760405162461bcd60e51b81526004016104c890614872565b5f8681526006860160205260409020600301546001600160401b0380841691161115610d895760405162461bcd60e51b81526004016104c8906148b4565b60035f87815260068701602052604090205460ff166004811115610daf57610daf6146c6565b14610e035760405162461bcd60e51b815260206004820152603160248201525f80516020614f9b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104c8565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610ea891611efc565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f610ef6833384612667565b9392505050565b5f610f066129d3565b610f11848484612a0a565b9050610ef660015f80516020614fdb83398151915255565b5f80516020614fbb8339815191525f610f4183611f32565b90505f80610f528360400151612c43565b9150915080610fb45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104c8565b5f82815260078501602052604081208054610fce90614934565b9050118015611000575060015f83815260088601602052604090205460ff166005811115610ffe57610ffe6146c6565b145b61101c5760405162461bcd60e51b81526004016104c89061496c565b5f828152600785016020526040812061103491614479565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614f7b83398151915293929190829060ff166004811115611147576111476146c6565b6004811115611158576111586146c6565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156111df576111df6146c6565b14806111fd57506003815160048111156111fb576111fb6146c6565b145b6112515760405162461bcd60e51b815260206004820152603260248201525f80516020614f9b833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104c8565b5f61125f8260400151611480565b905080608001516001600160401b03165f036112e35760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104c8565b6005600160991b016001600160a01b031663ee5b48eb611310846040015184608001518560a00151611952565b6040518263ffffffff1660e01b815260040161132c919061480a565b6020604051808303815f875af1158015611348573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cd4919061483c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614fbb8339815191529291906113b490614934565b90501180156113e6575060015f83815260088301602052604090205460ff1660058111156113e4576113e46146c6565b145b6114025760405162461bcd60e51b81526004016104c89061496c565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161143b91906004016149b3565b6020604051808303815f875af1158015611457573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147b919061483c565b505050565b6114886144b0565b5f8281525f80516020614ffb8339815191526020526040908190208151610100810190925280545f80516020614fbb833981519152929190829060ff1660058111156114d6576114d66146c6565b60058111156114e7576114e76146c6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156115aa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115d19190810190614ab4565b91509150806116345760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104c8565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169b919061483c565b8251146116ff5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104c8565b60208201516001600160a01b0316156117755760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104c8565b5f806117848460400151612de4565b915091508187146117f15760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104c8565b9695505050505050565b5f8281525f80516020614ffb833981519152602052604081206003015481905f80516020614fbb83398151915290600160401b90046001600160401b03166118438582612fbc565b5f61184d876131ca565b5f8881526008850160205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61189d8a858b611952565b6040518263ffffffff1660e01b81526004016118b9919061480a565b6020604051808303815f875af11580156118d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f9919061483c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156119cb5761198b816001614b9c565b6119969060086148fd565b5081515f908390839081106119ad576119ad614baf565b60200101906001600160f81b03191690815f1a905350600101611977565b505f5b6004811015611a2e576119e2816003614b9c565b6119ed9060086148fd565b6001901c60f81b82611a00836002614bc3565b81518110611a1057611a10614baf565b60200101906001600160f81b03191690815f1a9053506001016119ce565b505f5b6020811015611a9057611a4581601f614b9c565b611a509060086148fd565b86901c60f81b82611a62836006614bc3565b81518110611a7257611a72614baf565b60200101906001600160f81b03191690815f1a905350600101611a31565b505f5b6008811015611afb57611aa7816007614b9c565b611ab29060086148fd565b6001600160401b038616901c60f81b82611acd836026614bc3565b81518110611add57611add614baf565b60200101906001600160f81b03191690815f1a905350600101611a93565b505f5b6008811015611b6657611b12816007614b9c565b611b1d9060086148fd565b6001600160401b038516901c60f81b82611b3883602e614bc3565b81518110611b4857611b48614baf565b60200101906001600160f81b03191690815f1a905350600101611afe565b50949350505050565b611b7761324c565b611b8082613297565b6109fa81613306565b611b916144b0565b5f80516020614fbb8339815191525f611ba984611f32565b90505f80611bba8360400151612c43565b915091508015611c1f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104c8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611c5157611c516146c6565b6005811115611c6257611c626146c6565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611ce957611ce96146c6565b1480611d075750600182516005811115611d0557611d056146c6565b145b611d665760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104c8565b600382516005811115611d7b57611d7b6146c6565b03611d8857506004611d8c565b5060055b6020808301515f90815260098801909152604081205581816005811115611db557611db56146c6565b90816005811115611dc857611dc86146c6565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611dfc57611dfc6146c6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611ec757611ec76146c6565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546109fa906001600160a01b031682846133ba565b60408051606080820183525f8083526020830181905292820152905f80516020614fbb8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611fa7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fce9190810190614ab4565b91509150806120355760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016104c8565b82548251146120985760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104c8565b60208201516001600160a01b03161561210b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104c8565b509392505050565b5f805f83516036146121375760405162461bcd60e51b81526004016104c890614bd6565b5f805b60028110156121865761214e816001614b9c565b6121599060086148fd565b61ffff1686828151811061216f5761216f614baf565b016020015160f81c901b919091179060010161213a565b5061ffff8116156121a95760405162461bcd60e51b81526004016104c890614c1f565b5f805b6004811015612204576121c0816003614b9c565b6121cb9060086148fd565b63ffffffff16876121dd836002614bc3565b815181106121ed576121ed614baf565b016020015160f81c901b91909117906001016121ac565b5063ffffffff811660031461222b5760405162461bcd60e51b81526004016104c890614c62565b5f805b60208110156122805761224281601f614b9c565b61224d9060086148fd565b88612259836006614bc3565b8151811061226957612269614baf565b016020015160f81c901b919091179060010161222e565b505f805b60088110156122df57612298816007614b9c565b6122a39060086148fd565b6001600160401b0316896122b8836026614bc3565b815181106122c8576122c8614baf565b016020015160f81c901b9190911790600101612284565b505f805b600881101561233e576122f7816007614b9c565b6123029060086148fd565b6001600160401b03168a61231783602e614bc3565b8151811061232757612327614baf565b016020015160f81c901b91909117906001016122e3565b5091989097509095509350505050565b5f8181525f80516020614ffb83398151915260205260408082208151610100810190925280545f80516020614fbb83398151915293929190829060ff16600581111561239c5761239c6146c6565b60058111156123ad576123ad6146c6565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e09091015290915081516005811115612435576124356146c6565b146124915760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104c8565b60408101516001600160a01b0316336001600160a01b03161461250b5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016104c8565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561254f5761254f6146c6565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61261284826117fb565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f6126706129d3565b5f80516020614f7b8339815191525f61268b6101e285613419565b90505f61269787611480565b90506002815160058111156126ae576126ae6146c6565b1461270d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104c8565b5f828260a0015161271e9190614914565b60048501546060840151919250612740916001600160401b0390911690614ca9565b6001600160401b0316816001600160401b031611156127bf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104c8565b5f806127cb8a846117fb565b915091505f8a836040516020016127f992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115612894576128946146c6565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050610ef660015f80516020614fdb83398151915255565b5f80516020614fdb833981519152805460011901612a0457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f7b833981519152906001600160401b0316612a56604086016020870161462a565b6001600160401b03161015612ac55760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104c8565b6003810154612ad76020860186614ce3565b61ffff1610158015612afb5750612710612af46020860186614ce3565b61ffff1611155b612b175760405162461bcd60e51b81526004016104c890614cfe565b8054831015612b7a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104c8565b8060010154831115612be15760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104c8565b5f612beb84613419565b90505f612bf7826108de565b90505f612c04888361344f565b5f81815260058601602052604090209091508790612c228282614d49565b509098975050505050505050565b60015f80516020614fdb83398151915255565b5f808251602714612c665760405162461bcd60e51b81526004016104c890614bd6565b5f805b6002811015612cb557612c7d816001614b9c565b612c889060086148fd565b61ffff16858281518110612c9e57612c9e614baf565b016020015160f81c901b9190911790600101612c69565b5061ffff811615612cd85760405162461bcd60e51b81526004016104c890614c1f565b5f805b6004811015612d3357612cef816003614b9c565b612cfa9060086148fd565b63ffffffff1686612d0c836002614bc3565b81518110612d1c57612d1c614baf565b016020015160f81c901b9190911790600101612cdb565b5063ffffffff8116600214612d5a5760405162461bcd60e51b81526004016104c890614c62565b5f805b6020811015612daf57612d7181601f614b9c565b612d7c9060086148fd565b87612d88836006614bc3565b81518110612d9857612d98614baf565b016020015160f81c901b9190911790600101612d5d565b505f86602681518110612dc457612dc4614baf565b016020015191976001600160f81b03199092161515965090945050505050565b5f808251602e14612e075760405162461bcd60e51b81526004016104c890614bd6565b5f805b6002811015612e5657612e1e816001614b9c565b612e299060086148fd565b61ffff16858281518110612e3f57612e3f614baf565b016020015160f81c901b9190911790600101612e0a565b5061ffff811615612e795760405162461bcd60e51b81526004016104c890614c1f565b5f805b6004811015612ed457612e90816003614b9c565b612e9b9060086148fd565b63ffffffff1686612ead836002614bc3565b81518110612ebd57612ebd614baf565b016020015160f81c901b9190911790600101612e7c565b5063ffffffff8116600414612efb5760405162461bcd60e51b81526004016104c890614c62565b5f805b6020811015612f5057612f1281601f614b9c565b612f1d9060086148fd565b87612f29836006614bc3565b81518110612f3957612f39614baf565b016020015160f81c901b9190911790600101612efe565b505f805b6008811015612faf57612f68816007614b9c565b612f739060086148fd565b6001600160401b031688612f88836026614bc3565b81518110612f9857612f98614baf565b016020015160f81c901b9190911790600101612f54565b5090969095509350505050565b5f80516020614fbb8339815191525f6001600160401b038084169085161115612ff057612fe983856147c8565b9050612ffd565b612ffa84846147c8565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b031660608201524291158061305f57506002840154815161305b916001600160401b031690614bc3565b8210155b15613085576001600160401b0383166060820152818152604081015160208201526130a4565b82816060018181516130979190614914565b6001600160401b03169052505b60608101516130b4906064614ca9565b602082015160028601546001600160401b0392909216916130df9190600160401b900460ff166148fd565b10156131435760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104c8565b856001600160401b03168160400181815161315e9190614bc3565b9052506040810180516001600160401b038716919061317e908390614b9c565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614ffb8339815191526020526040812060030180545f80516020614fbb833981519152916001600160401b03909116908361320d83614d9f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661329557604051631afcd79f60e31b815260040160405180910390fd5b565b61329f61324c565b6132a88161398a565b613303608082013560a08301356132c560e0850160c0860161462a565b6132d6610100860160e08701614ce3565b61ffff166132ec61012087016101008801614dc4565b6132fe61014088016101208901614de4565b6139ab565b50565b61330e61324c565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b03821661339a5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104c8565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b0383811660248301526044820183905261147b91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613bef565b5f6108ee827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690613c50565b5f5f80516020614fbb8339815191524261346f604086016020870161462a565b6001600160401b0316116134e15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104c8565b6134f1604085016020860161462a565b6001600160401b03166135076202a30042614bc3565b1161357a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104c8565b83356135d25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016104c8565b83355f908152600982016020526040902054156136425760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016104c8565b61364f6040850185614dff565b90506030146136b65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016104c8565b6136c0835f612fbc565b5f8061375a6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613705919061462a565b6001600160401b0316815260200161372060408a018a614dff565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613db2565b5f828152600786016020526040902091935091506137788282614e85565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906137a590859060040161480a565b6020604051808303815f875af11580156137c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137e5919061483c565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff19166001836005811115613867576138676146c6565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161395c91908e01908e0161462a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61399261324c565b61399a614157565b6139a2614167565b6133038161416f565b6139b361324c565b5f80516020614f7b83398151915283613a1f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104c8565b612710841115613a415760405162461bcd60e51b81526004016104c890614cfe565b85871115613aa95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104c8565b5f8360ff1611613b165760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104c8565b600a60ff84161115613b885760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104c8565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f613c036001600160a01b0384168361431c565b905080515f14158015613c27575080806020019051810190613c259190614f44565b155b1561147b57604051635274afe760e01b81526001600160a01b03841660048201526024016104c8565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613c96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cba919061483c565b9050613cd16001600160a01b038516333086614329565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613d15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d39919061483c565b9050818111613d9f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104c8565b613da98282614b9c565b95945050505050565b5f6060826080015151603014613e1c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104c8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613e9357613e53816001614b9c565b613e5e9060086148fd565b5081515f90839083908110613e7557613e75614baf565b60200101906001600160f81b03191690815f1a905350600101613e3f565b505f5b6004811015613ef157613eaa816003614b9c565b613eb59060086148fd565b505f82613ec3836002614bc3565b81518110613ed357613ed3614baf565b60200101906001600160f81b03191690815f1a905350600101613e96565b505f5b6020811015613f4e5784518160208110613f1057613f10614baf565b1a60f81b82613f20836006614bc3565b81518110613f3057613f30614baf565b60200101906001600160f81b03191690815f1a905350600101613ef4565b505f5b6020811015613fae5784602001518160208110613f7057613f70614baf565b1a60f81b82613f80836026614bc3565b81518110613f9057613f90614baf565b60200101906001600160f81b03191690815f1a905350600101613f51565b505f5b600881101561402257613fc5816007614b9c565b613fd09060086148fd565b60ff1685604001516001600160401b0316901c60f81b82826046613ff49190614bc3565b8151811061400457614004614baf565b60200101906001600160f81b03191690815f1a905350600101613fb1565b505f5b603081101561408d578460800151818151811061404457614044614baf565b01602001516001600160f81b0319168261405f83604e614bc3565b8151811061406f5761406f614baf565b60200101906001600160f81b03191690815f1a905350600101614025565b505f5b60088110156140ff576140a4816007614b9c565b6140af9060086148fd565b60608601516001600160401b0390811691161c60f81b826140d183607e614bc3565b815181106140e1576140e1614baf565b60200101906001600160f81b03191690815f1a905350600101614090565b506002816040516141109190614f5f565b602060405180830381855afa15801561412b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061414e919061483c565b94909350915050565b61415f61324c565b613295614362565b61329561324c565b61417761324c565b80355f80516020614fbb83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146141c36080840160608501614dc4565b60ff1611156142305760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104c8565b5f6142416080840160608501614dc4565b60ff16116142a95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104c8565b6142b96080830160608401614dc4565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556142ea606083016040840161462a565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6060610ef683835f61436a565b6040516001600160a01b0384811660248301528381166044830152606482018390526108d89186918216906323b872dd906084016133e7565b612c3061324c565b60608147101561438f5760405163cd78605960e01b81523060048201526024016104c8565b5f80856001600160a01b031684866040516143aa9190614f5f565b5f6040518083038185875af1925050503d805f81146143e4576040519150601f19603f3d011682016040523d82523d5f602084013e6143e9565b606091505b50915091506117f18683836060826144095761440482614450565b610ef6565b815115801561442057506001600160a01b0384163b155b1561444957604051639996b31560e01b81526001600160a01b03851660048201526024016104c8565b5080610ef6565b8051156144605780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461448590614934565b5f825580601f10614494575050565b601f0160209004905f5260205f209081019061330391906144f4565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115614508575f81556001016144f5565b5090565b8015158114613303575f80fd5b803563ffffffff8116811461452c575f80fd5b919050565b5f805f60608486031215614543575f80fd5b8335925060208401356145558161450c565b915061456360408501614519565b90509250925092565b5f6020828403121561457c575f80fd5b5035919050565b6001600160a01b0381168114613303575f80fd5b5f808284036101608112156145aa575f80fd5b610140808212156145b9575f80fd5b84935083013590506145ca81614583565b809150509250929050565b5f602082840312156145e5575f80fd5b610ef682614519565b5f80604083850312156145ff575f80fd5b61460883614519565b946020939093013593505050565b6001600160401b0381168114613303575f80fd5b5f6020828403121561463a575f80fd5b8135610ef681614616565b5f8060408385031215614656575f80fd5b50508035926020909101359150565b5f805f8385036080811215614678575f80fd5b84356001600160401b0381111561468d575f80fd5b85016060818803121561469e575f80fd5b93506040601f19820112156146b1575f80fd5b50602084019150606084013590509250925092565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106146fe57634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161472660408401826001600160a01b03169052565b50606083015161474160608401826001600160401b03169052565b50608083015161475c60808401826001600160401b03169052565b5060a083015161477760a08401826001600160401b03169052565b5060c083015161479260c08401826001600160401b03169052565b5060e08301516147ad60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156147ad576147ad6147b4565b5f5b838110156148025781810151838201526020016147ea565b50505f910152565b602081525f82518060208401526148288160408501602087016147e8565b601f01601f19169190910160400192915050565b5f6020828403121561484c575f80fd5b5051919050565b5f8261486d57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b80820281158282048414176108ee576108ee6147b4565b6001600160401b038181168382160190808211156147ad576147ad6147b4565b600181811c9082168061494857607f821691505b60208210810361496657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546149c581614934565b806020870152604060018084165f81146149e65760018114614a0257614a2f565b60ff19851660408a0152604084151560051b8a01019550614a2f565b895f5260205f205f5b85811015614a265781548b8201860152908301908801614a0b565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614a7357614a73614a3d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614aa157614aa1614a3d565b604052919050565b805161452c8161450c565b5f8060408385031215614ac5575f80fd5b82516001600160401b0380821115614adb575f80fd5b9084019060608287031215614aee575f80fd5b614af6614a51565b82518152602080840151614b0981614583565b82820152604084015183811115614b1e575f80fd5b80850194505087601f850112614b32575f80fd5b835183811115614b4457614b44614a3d565b614b56601f8201601f19168301614a79565b93508084528882828701011115614b6b575f80fd5b614b7a818386018488016147e8565b50826040830152819550614b8f818801614aa9565b9450505050509250929050565b818103818111156108ee576108ee6147b4565b634e487b7160e01b5f52603260045260245ffd5b808201808211156108ee576108ee6147b4565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614ccc57614ccc6147b4565b505092915050565b61ffff81168114613303575f80fd5b5f60208284031215614cf3575f80fd5b8135610ef681614cd4565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b8135614d5481614cd4565b61ffff8116905081548161ffff1982161783556020840135614d7581614616565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b5f6001600160401b03808316818103614dba57614dba6147b4565b6001019392505050565b5f60208284031215614dd4575f80fd5b813560ff81168114610ef6575f80fd5b5f60208284031215614df4575f80fd5b8135610ef681614583565b5f808335601e19843603018112614e14575f80fd5b8301803591506001600160401b03821115614e2d575f80fd5b60200191503681900382131561194b575f80fd5b601f82111561147b57805f5260205f20601f840160051c81016020851015614e665750805b601f840160051c820191505b81811015610cd4575f8155600101614e72565b81516001600160401b03811115614e9e57614e9e614a3d565b614eb281614eac8454614934565b84614e41565b602080601f831160018114614ee5575f8415614ece5750858301515b5f19600386901b1c1916600185901b178555614f3c565b5f85815260208120601f198616915b82811015614f1357888601518255948401946001909101908401614ef4565b5085821015614f3057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614f54575f80fd5b8151610ef68161450c565b5f8251614f708184602087016147e8565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index a96ea774a..cccb0de7e 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -76,7 +76,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"requirements\",\"type\":\"tuple\",\"internalType\":\"structPoSValidatorRequirements\",\"components\":[{\"name\":\"delegationFeeBips\",\"type\":\"uint16\",\"internalType\":\"uint16\"},{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"payable\"},{\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614dc2380380614dc283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614c758061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f3660046141ef565b61043b565b005b348015610161575f80fd5b5061015461017036600461422a565b6107f2565b348015610180575f80fd5b506101bf61018f36600461422a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b50610154610212366004614241565b6109c2565b348015610222575f80fd5b5061023661023136600461422a565b610a9f565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b50610154610290366004614258565b610ab5565b3480156102a0575f80fd5b506101546102af366004614271565b610ae0565b3480156102bf575f80fd5b506101bf6102ce3660046142ad565b610cb0565b3480156102de575f80fd5b506102366102ed36600461422a565b610cc9565b3480156102fd575f80fd5b5061015461030c3660046141ef565b610cdd565b6101bf61031f3660046142c8565b610dbd565b34801561032f575f80fd5b5061015461033e366004614271565b610de9565b34801561034e575f80fd5b5061015461035d366004614258565b610ff8565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae36600461422a565b6111b5565b3480156103be575f80fd5b506101546103cd36600461422a565b61143b565b6101bf6103e036600461422a565b61154f565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b5061041861041336600461422a565b61155b565b6040516101c99190614335565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614bc983398151915291841561048d5761048a828561163a565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf614321565b60048111156104d0576104d0614321565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054c8461155b565b905060028251600481111561056357610563614321565b146105b55760405162461bcd60e51b815260206004820152602a60248201525f80516020614be98339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b0316331461061a5760405162461bcd60e51b815260206004820152603360248201525f80516020614be98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ac565b600382528051600290600581111561063457610634614321565b03610678575f82606001518260a0015161064e9190614423565b905061065a85826118d6565b506001600160401b0390811660e0850152421660a08401525061069b565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156106cc576106cc614321565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916107e0916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614c4983398151915260205260408082208151610100810190925280545f80516020614c0983398151915293929190829060ff16600581111561084057610840614321565b600581111561085157610851614321565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108d6576108d6614321565b1461093b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6109608584608001515f611a2d565b6040518263ffffffff1660e01b815260040161097c9190614465565b6020604051808303815f875af1158015610998573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bc9190614497565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a0b575080546001600160401b03808416911610155b15610a295760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5383611c4c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610aaf64e8d4a51000836144ae565b92915050565b5f610abf82611c60565b9050610adc81606001516001600160401b03168260400151611fd3565b5050565b5f80516020614bc98339815191525f610af884611fe6565b90505f80610b0983604001516121c7565b50915091505f610b188361155b565b9050816001600160401b031681608001516001600160401b03161015610b505760405162461bcd60e51b81526004016105ac906144cd565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b955760405162461bcd60e51b81526004016105ac9061450f565b60015f87815260068701602052604090205460ff166004811115610bbb57610bbb614321565b14610c245760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610aaf6001600160401b03831664e8d4a51000614558565b5f610cd38261155b565b60a0015192915050565b5f80516020614bc98339815191525f610cf58561155b565b5f86815260058401602052604090205460c0820151919250610d2791620100009091046001600160401b03169061456f565b6001600160401b0316421015610d9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ac565b8315610dad57610dab858461163a565b505b610db685612402565b5050505050565b5f610dc661271b565b610dd1838334612752565b9050610aaf60015f80516020614c2983398151915255565b5f80516020614bc98339815191525f610e0184611fe6565b90505f80610e1283604001516121c7565b50915091505f610e218361155b565b9050816001600160401b031681608001516001600160401b03161015610e595760405162461bcd60e51b81526004016105ac906144cd565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e975760405162461bcd60e51b81526004016105ac9061450f565b60035f87815260068701602052604090205460ff166004811115610ebd57610ebd614321565b14610f115760405162461bcd60e51b815260206004820152603160248201525f80516020614be98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610fb691611fd3565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614c098339815191525f61101083611fe6565b90505f806110218360400151612980565b91509150806110835760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ac565b5f8281526007850160205260408120805461109d9061458f565b90501180156110cf575060015f83815260088601602052604090205460ff1660058111156110cd576110cd614321565b145b6110eb5760405162461bcd60e51b81526004016105ac906145c1565b5f828152600785016020526040812061110391614137565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614bc983398151915293929190829060ff16600481111561121657611216614321565b600481111561122757611227614321565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112ae576112ae614321565b14806112cc57506003815160048111156112ca576112ca614321565b145b6113205760405162461bcd60e51b815260206004820152603260248201525f80516020614be9833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ac565b5f61132e826040015161155b565b905080608001516001600160401b03165f036113b25760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6113df846040015184608001518560a00151611a2d565b6040518263ffffffff1660e01b81526004016113fb9190614465565b6020604051808303815f875af1158015611417573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db69190614497565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614c098339815191529291906114839061458f565b90501180156114b5575060015f83815260088301602052604090205460ff1660058111156114b3576114b3614321565b145b6114d15760405162461bcd60e51b81526004016105ac906145c1565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161150a9190600401614608565b6020604051808303815f875af1158015611526573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154a9190614497565b505050565b5f610aaf823334612b21565b61156361416e565b5f8281525f80516020614c498339815191526020526040908190208151610100810190925280545f80516020614c09833981519152929190829060ff1660058111156115b1576115b1614321565b60058111156115c2576115c2614321565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611685573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116ac919081019061471d565b915091508061170f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ac565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611752573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117769190614497565b8251146117da5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ac565b60208201516001600160a01b0316156118505760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ac565b5f8061185f8460400151612e8a565b915091508187146118cc5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ac565b9695505050505050565b5f8281525f80516020614c49833981519152602052604081206003015481905f80516020614c0983398151915290600160401b90046001600160401b031661191e8582613062565b5f61192887613259565b5f8881526008850160205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6119788a858b611a2d565b6040518263ffffffff1660e01b81526004016119949190614465565b6020604051808303815f875af11580156119b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d49190614497565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611aa657611a66816001614805565b611a71906008614558565b5081515f90839083908110611a8857611a88614818565b60200101906001600160f81b03191690815f1a905350600101611a52565b505f5b6004811015611b0957611abd816003614805565b611ac8906008614558565b6001901c60f81b82611adb83600261482c565b81518110611aeb57611aeb614818565b60200101906001600160f81b03191690815f1a905350600101611aa9565b505f5b6020811015611b6b57611b2081601f614805565b611b2b906008614558565b86901c60f81b82611b3d83600661482c565b81518110611b4d57611b4d614818565b60200101906001600160f81b03191690815f1a905350600101611b0c565b505f5b6008811015611bd657611b82816007614805565b611b8d906008614558565b6001600160401b038616901c60f81b82611ba883602661482c565b81518110611bb857611bb8614818565b60200101906001600160f81b03191690815f1a905350600101611b6e565b505f5b6008811015611c4157611bed816007614805565b611bf8906008614558565b6001600160401b038516901c60f81b82611c1383602e61482c565b81518110611c2357611c23614818565b60200101906001600160f81b03191690815f1a905350600101611bd9565b5090505b9392505050565b611c546132db565b611c5d81613326565b50565b611c6861416e565b5f80516020614c098339815191525f611c8084611fe6565b90505f80611c918360400151612980565b915091508015611cf65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ac565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d2857611d28614321565b6005811115611d3957611d39614321565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611dc057611dc0614321565b1480611dde5750600182516005811115611ddc57611ddc614321565b145b611e3d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ac565b600382516005811115611e5257611e52614321565b03611e5f57506004611e63565b5060055b6020808301515f90815260098801909152604081205581816005811115611e8c57611e8c614321565b90816005811115611e9f57611e9f614321565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611ed357611ed3614321565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f9e57611f9e614321565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610adc6001600160a01b03821683613392565b60408051606080820183525f8083526020830181905292820152905f80516020614c098339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561205b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612082919081019061471d565b91509150806120e95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105ac565b825482511461214c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ac565b60208201516001600160a01b0316156121bf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ac565b509392505050565b5f805f83516036146121eb5760405162461bcd60e51b81526004016105ac9061483f565b5f805b600281101561223a57612202816001614805565b61220d906008614558565b61ffff1686828151811061222357612223614818565b016020015160f81c901b91909117906001016121ee565b5061ffff81161561225d5760405162461bcd60e51b81526004016105ac90614888565b5f805b60048110156122b857612274816003614805565b61227f906008614558565b63ffffffff168761229183600261482c565b815181106122a1576122a1614818565b016020015160f81c901b9190911790600101612260565b5063ffffffff81166003146122df5760405162461bcd60e51b81526004016105ac906148cb565b5f805b6020811015612334576122f681601f614805565b612301906008614558565b8861230d83600661482c565b8151811061231d5761231d614818565b016020015160f81c901b91909117906001016122e2565b505f805b60088110156123935761234c816007614805565b612357906008614558565b6001600160401b03168961236c83602661482c565b8151811061237c5761237c614818565b016020015160f81c901b9190911790600101612338565b505f805b60088110156123f2576123ab816007614805565b6123b6906008614558565b6001600160401b03168a6123cb83602e61482c565b815181106123db576123db614818565b016020015160f81c901b9190911790600101612397565b5091989097509095509350505050565b5f8181525f80516020614c4983398151915260205260408082208151610100810190925280545f80516020614c0983398151915293929190829060ff16600581111561245057612450614321565b600581111561246157612461614321565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124e9576124e9614321565b146125455760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ac565b60408101516001600160a01b0316336001600160a01b0316146125bf5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105ac565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561260357612603614321565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126c684826118d6565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f80516020614c2983398151915280546001190161274c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614bc9833981519152906001600160401b031661279e60408601602087016142ad565b6001600160401b0316101561280d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ac565b600381015461281f6020860186614921565b61ffff1610158015612843575061271061283c6020860186614921565b61ffff1611155b61285f5760405162461bcd60e51b81526004016105ac9061493c565b80548310156128c25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ac565b80600101548311156129295760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ac565b825f61293482610a9f565b90505f6129418883613425565b5f8181526005860160205260409020909150879061295f8282614987565b509098975050505050505050565b60015f80516020614c2983398151915255565b5f8082516027146129a35760405162461bcd60e51b81526004016105ac9061483f565b5f805b60028110156129f2576129ba816001614805565b6129c5906008614558565b61ffff168582815181106129db576129db614818565b016020015160f81c901b91909117906001016129a6565b5061ffff811615612a155760405162461bcd60e51b81526004016105ac90614888565b5f805b6004811015612a7057612a2c816003614805565b612a37906008614558565b63ffffffff1686612a4983600261482c565b81518110612a5957612a59614818565b016020015160f81c901b9190911790600101612a18565b5063ffffffff8116600214612a975760405162461bcd60e51b81526004016105ac906148cb565b5f805b6020811015612aec57612aae81601f614805565b612ab9906008614558565b87612ac583600661482c565b81518110612ad557612ad5614818565b016020015160f81c901b9190911790600101612a9a565b505f86602681518110612b0157612b01614818565b016020015191976001600160f81b03199092161515965090945050505050565b5f612b2a61271b565b5f80516020614bc98339815191525f612b4284610a9f565b90505f612b4e8761155b565b9050600281516005811115612b6557612b65614321565b14612bc45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ac565b5f828260a00151612bd5919061456f565b60048501546060840151919250612bf7916001600160401b03909116906149dd565b6001600160401b0316816001600160401b03161115612c765760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ac565b5f80612c828a846118d6565b915091505f8a83604051602001612cb092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115612d4b57612d4b614321565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050611c4560015f80516020614c2983398151915255565b5f808251602e14612ead5760405162461bcd60e51b81526004016105ac9061483f565b5f805b6002811015612efc57612ec4816001614805565b612ecf906008614558565b61ffff16858281518110612ee557612ee5614818565b016020015160f81c901b9190911790600101612eb0565b5061ffff811615612f1f5760405162461bcd60e51b81526004016105ac90614888565b5f805b6004811015612f7a57612f36816003614805565b612f41906008614558565b63ffffffff1686612f5383600261482c565b81518110612f6357612f63614818565b016020015160f81c901b9190911790600101612f22565b5063ffffffff8116600414612fa15760405162461bcd60e51b81526004016105ac906148cb565b5f805b6020811015612ff657612fb881601f614805565b612fc3906008614558565b87612fcf83600661482c565b81518110612fdf57612fdf614818565b016020015160f81c901b9190911790600101612fa4565b505f805b60088110156130555761300e816007614805565b613019906008614558565b6001600160401b03168861302e83602661482c565b8151811061303e5761303e614818565b016020015160f81c901b9190911790600101612ffa565b5090969095509350505050565b5f80516020614c098339815191525f6001600160401b0380841690851611156130965761308f8385614423565b90506130a3565b6130a08484614423565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613105575060028401548151613101916001600160401b03169061482c565b8210155b1561312b576001600160401b03831660608201528181526040810151602082015261314a565b828160600181815161313d919061456f565b6001600160401b03169052505b606081015161315a9060646149dd565b602082015160028601546001600160401b0392909216916131859190600160401b900460ff16614558565b10156131e95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ac565b6131f38587614423565b6001600160401b03168160400181815161320d919061482c565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614c498339815191526020526040812060030180545f80516020614c09833981519152916001600160401b03909116908361329c83614a08565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661332457604051631afcd79f60e31b815260040160405180910390fd5b565b61332e6132db565b61333781613960565b611c5d608082013560a083013561335460e0850160c086016142ad565b613365610100860160e08701614921565b61ffff1661337b61012087016101008801614a2d565b61338d61014088016101208901614a4d565b613981565b804710156133b55760405163cd78605960e01b81523060048201526024016105ac565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146133fe576040519150601f19603f3d011682016040523d82523d5f602084013e613403565b606091505b505090508061154a57604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614c098339815191524261344560408601602087016142ad565b6001600160401b0316116134b75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ac565b6134c760408501602086016142ad565b6001600160401b03166134dd6202a3004261482c565b116135505760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ac565b83356135a85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105ac565b83355f908152600982016020526040902054156136185760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105ac565b6136256040850185614a68565b905060301461368c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105ac565b613696835f613062565b5f806137306040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906136db91906142ad565b6001600160401b031681526020016136f660408a018a614a68565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613bc5565b5f8281526007860160205260409020919350915061374e8282614aee565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061377b908590600401614465565b6020604051808303815f875af1158015613797573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137bb9190614497565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561383d5761383d614321565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161393291908e01908e016142ad565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6139686132db565b613970613f6a565b613978613f7a565b611c5d81613f82565b6139896132db565b5f80516020614bc9833981519152836139f55760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ac565b612710841115613a175760405162461bcd60e51b81526004016105ac9061493c565b85871115613a7f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ac565b5f8360ff1611613aec5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ac565b600a60ff84161115613b5e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ac565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613c2f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ac565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613ca657613c66816001614805565b613c71906008614558565b5081515f90839083908110613c8857613c88614818565b60200101906001600160f81b03191690815f1a905350600101613c52565b505f5b6004811015613d0457613cbd816003614805565b613cc8906008614558565b505f82613cd683600261482c565b81518110613ce657613ce6614818565b60200101906001600160f81b03191690815f1a905350600101613ca9565b505f5b6020811015613d615784518160208110613d2357613d23614818565b1a60f81b82613d3383600661482c565b81518110613d4357613d43614818565b60200101906001600160f81b03191690815f1a905350600101613d07565b505f5b6020811015613dc15784602001518160208110613d8357613d83614818565b1a60f81b82613d9383602661482c565b81518110613da357613da3614818565b60200101906001600160f81b03191690815f1a905350600101613d64565b505f5b6008811015613e3557613dd8816007614805565b613de3906008614558565b60ff1685604001516001600160401b0316901c60f81b82826046613e07919061482c565b81518110613e1757613e17614818565b60200101906001600160f81b03191690815f1a905350600101613dc4565b505f5b6030811015613ea05784608001518181518110613e5757613e57614818565b01602001516001600160f81b03191682613e7283604e61482c565b81518110613e8257613e82614818565b60200101906001600160f81b03191690815f1a905350600101613e38565b505f5b6008811015613f1257613eb7816007614805565b613ec2906008614558565b60608601516001600160401b0390811691161c60f81b82613ee483607e61482c565b81518110613ef457613ef4614818565b60200101906001600160f81b03191690815f1a905350600101613ea3565b50600281604051613f239190614bad565b602060405180830381855afa158015613f3e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613f619190614497565b94909350915050565b613f726132db565b61332461412f565b6133246132db565b613f8a6132db565b80355f80516020614c0983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613fd66080840160608501614a2d565b60ff1611156140435760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ac565b5f6140546080840160608501614a2d565b60ff16116140bc5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ac565b6140cc6080830160608401614a2d565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556140fd60608301604084016142ad565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b61296d6132db565b5080546141439061458f565b5f825580601f10614152575050565b601f0160209004905f5260205f2090810190611c5d91906141b2565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156141c6575f81556001016141b3565b5090565b8015158114611c5d575f80fd5b803563ffffffff811681146141ea575f80fd5b919050565b5f805f60608486031215614201575f80fd5b833592506020840135614213816141ca565b9150614221604085016141d7565b90509250925092565b5f6020828403121561423a575f80fd5b5035919050565b5f6101408284031215614252575f80fd5b50919050565b5f60208284031215614268575f80fd5b611c45826141d7565b5f8060408385031215614282575f80fd5b61428b836141d7565b946020939093013593505050565b6001600160401b0381168114611c5d575f80fd5b5f602082840312156142bd575f80fd5b8135611c4581614299565b5f8082840360608112156142da575f80fd5b83356001600160401b038111156142ef575f80fd5b840160608187031215614300575f80fd5b92506040601f1982011215614313575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061435957634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161438160408401826001600160a01b03169052565b50606083015161439c60608401826001600160401b03169052565b5060808301516143b760808401826001600160401b03169052565b5060a08301516143d260a08401826001600160401b03169052565b5060c08301516143ed60c08401826001600160401b03169052565b5060e083015161440860e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156144085761440861440f565b5f5b8381101561445d578181015183820152602001614445565b50505f910152565b602081525f8251806020840152614483816040850160208701614443565b601f01601f19169190910160400192915050565b5f602082840312156144a7575f80fd5b5051919050565b5f826144c857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610aaf57610aaf61440f565b6001600160401b038181168382160190808211156144085761440861440f565b600181811c908216806145a357607f821691505b60208210810361425257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461461a8161458f565b806020870152604060018084165f811461463b576001811461465757614684565b60ff19851660408a0152604084151560051b8a01019550614684565b895f5260205f205f5b8581101561467b5781548b8201860152908301908801614660565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156146c8576146c8614692565b60405290565b604051601f8201601f191681016001600160401b03811182821017156146f6576146f6614692565b604052919050565b6001600160a01b0381168114611c5d575f80fd5b80516141ea816141ca565b5f806040838503121561472e575f80fd5b82516001600160401b0380821115614744575f80fd5b9084019060608287031215614757575f80fd5b61475f6146a6565b82518152602080840151614772816146fe565b82820152604084015183811115614787575f80fd5b80850194505087601f85011261479b575f80fd5b8351838111156147ad576147ad614692565b6147bf601f8201601f191683016146ce565b935080845288828287010111156147d4575f80fd5b6147e381838601848801614443565b508260408301528195506147f8818801614712565b9450505050509250929050565b81810381811115610aaf57610aaf61440f565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610aaf57610aaf61440f565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c5d575f80fd5b5f60208284031215614931575f80fd5b8135611c4581614912565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b813561499281614912565b61ffff8116905081548161ffff19821617835560208401356149b381614299565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614a0057614a0061440f565b505092915050565b5f6001600160401b03808316818103614a2357614a2361440f565b6001019392505050565b5f60208284031215614a3d575f80fd5b813560ff81168114611c45575f80fd5b5f60208284031215614a5d575f80fd5b8135611c45816146fe565b5f808335601e19843603018112614a7d575f80fd5b8301803591506001600160401b03821115614a96575f80fd5b602001915036819003821315611a26575f80fd5b601f82111561154a57805f5260205f20601f840160051c81016020851015614acf5750805b601f840160051c820191505b81811015610db6575f8155600101614adb565b81516001600160401b03811115614b0757614b07614692565b614b1b81614b15845461458f565b84614aaa565b602080601f831160018114614b4e575f8415614b375750858301515b5f19600386901b1c1916600185901b178555614ba5565b5f85815260208120601f198616915b82811015614b7c57888601518255948401946001909101908401614b5d565b5085821015614b9957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614bbe818460208701614443565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614dd9380380614dd983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614c8c8061014d5f395ff3fe608060405260043610610131575f3560e01c806376f78621116100a8578063ba3a4b971161006d578063ba3a4b9714610394578063bee0a03f146103b3578063c599e24f146103d2578063c974d1b6146103e5578063d5f20ff6146103f9578063df93d8de14610425575f80fd5b806376f78621146102f257806380a8ad941461031157806398f3e2b414610324578063a3a65e4814610343578063b771b3bc14610362575f80fd5b80632e2194d8116100f95780632e2194d81461021757806335455ded1461024e578063467ef06f146102765780635297fae61461029557806362065856146102b457806366435abf146102d3575f80fd5b80630118acc4146101355780630322ed98146101565780630cdd098514610175578063151d30d1146101d25780631f7a9d8f146101f8575b5f80fd5b348015610140575f80fd5b5061015461014f366004614206565b61043b565b005b348015610161575f80fd5b50610154610170366004614241565b6107f2565b348015610180575f80fd5b506101bf61018f366004614241565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101dd575f80fd5b506101e6600a81565b60405160ff90911681526020016101c9565b348015610203575f80fd5b50610154610212366004614258565b6109c2565b348015610222575f80fd5b50610236610231366004614241565b610a9f565b6040516001600160401b0390911681526020016101c9565b348015610259575f80fd5b5061026361271081565b60405161ffff90911681526020016101c9565b348015610281575f80fd5b5061015461029036600461426f565b610ab5565b3480156102a0575f80fd5b506101546102af366004614288565b610ae0565b3480156102bf575f80fd5b506101bf6102ce3660046142c4565b610cb0565b3480156102de575f80fd5b506102366102ed366004614241565b610cc9565b3480156102fd575f80fd5b5061015461030c366004614206565b610cdd565b6101bf61031f3660046142df565b610dbd565b34801561032f575f80fd5b5061015461033e366004614288565b610de9565b34801561034e575f80fd5b5061015461035d36600461426f565b610ff8565b34801561036d575f80fd5b5061037c6005600160991b0181565b6040516001600160a01b0390911681526020016101c9565b34801561039f575f80fd5b506101546103ae366004614241565b6111b5565b3480156103be575f80fd5b506101546103cd366004614241565b61143b565b6101bf6103e0366004614241565b61154f565b3480156103f0575f80fd5b506101e6601481565b348015610404575f80fd5b50610418610413366004614241565b61155b565b6040516101c9919061434c565b348015610430575f80fd5b506102366202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020614be083398151915291841561048d5761048a828561163a565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104bf576104bf614338565b60048111156104d0576104d0614338565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61054c8461155b565b905060028251600481111561056357610563614338565b146105b55760405162461bcd60e51b815260206004820152602a60248201525f80516020614c008339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b0316331461061a5760405162461bcd60e51b815260206004820152603360248201525f80516020614c008339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ac565b600382528051600290600581111561063457610634614338565b03610678575f82606001518260a0015161064e919061443a565b905061065a85826118d6565b506001600160401b0390811660e0850152421660a08401525061069b565b60808101516001600160401b0390811660e0808501919091528201511660a08301525b5f88815260068601602052604090208251815484929190829060ff191660018360048111156106cc576106cc614338565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916107e0916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614c6083398151915260205260408082208151610100810190925280545f80516020614c2083398151915293929190829060ff16600581111561084057610840614338565b600581111561085157610851614338565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e090910152909150815160058111156108d6576108d6614338565b1461093b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6109608584608001515f611a2d565b6040518263ffffffff1660e01b815260040161097c919061447c565b6020604051808303815f875af1158015610998573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109bc91906144ae565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a0b575080546001600160401b03808416911610155b15610a295760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a5383611c4c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610aaf64e8d4a51000836144c5565b92915050565b5f610abf82611c60565b9050610adc81606001516001600160401b03168260400151611fd3565b5050565b5f80516020614be08339815191525f610af884611fe6565b90505f80610b0983604001516121c7565b50915091505f610b188361155b565b9050816001600160401b031681608001516001600160401b03161015610b505760405162461bcd60e51b81526004016105ac906144e4565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b955760405162461bcd60e51b81526004016105ac90614526565b60015f87815260068701602052604090205460ff166004811115610bbb57610bbb614338565b14610c245760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b0267ffffffffffffffff60401b19909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b5f610aaf6001600160401b03831664e8d4a5100061456f565b5f610cd38261155b565b60a0015192915050565b5f80516020614be08339815191525f610cf58561155b565b5f86815260058401602052604090205460c0820151919250610d2791620100009091046001600160401b031690614586565b6001600160401b0316421015610d9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ac565b8315610dad57610dab858461163a565b505b610db685612402565b5050505050565b5f610dc661271b565b610dd1838334612752565b9050610aaf60015f80516020614c4083398151915255565b5f80516020614be08339815191525f610e0184611fe6565b90505f80610e1283604001516121c7565b50915091505f610e218361155b565b9050816001600160401b031681608001516001600160401b03161015610e595760405162461bcd60e51b81526004016105ac906144e4565b5f8681526006860160205260409020600301546001600160401b0380841691161115610e975760405162461bcd60e51b81526004016105ac90614526565b60035f87815260068701602052604090205460ff166004811115610ebd57610ebd614338565b14610f115760405162461bcd60e51b815260206004820152603160248201525f80516020614c008339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ac565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e0840152610fb691611fd3565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050565b5f80516020614c208339815191525f61101083611fe6565b90505f806110218360400151612980565b91509150806110835760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ac565b5f8281526007850160205260408120805461109d906145a6565b90501180156110cf575060015f83815260088601602052604090205460ff1660058111156110cd576110cd614338565b145b6110eb5760405162461bcd60e51b81526004016105ac906145d8565b5f82815260078501602052604081206111039161414e565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614be083398151915293929190829060ff16600481111561121657611216614338565b600481111561122757611227614338565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156112ae576112ae614338565b14806112cc57506003815160048111156112ca576112ca614338565b145b6113205760405162461bcd60e51b815260206004820152603260248201525f80516020614c00833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ac565b5f61132e826040015161155b565b905080608001516001600160401b03165f036113b25760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ac565b6005600160991b016001600160a01b031663ee5b48eb6113df846040015184608001518560a00151611a2d565b6040518263ffffffff1660e01b81526004016113fb919061447c565b6020604051808303815f875af1158015611417573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db691906144ae565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020614c20833981519152929190611483906145a6565b90501180156114b5575060015f83815260088301602052604090205460ff1660058111156114b3576114b3614338565b145b6114d15760405162461bcd60e51b81526004016105ac906145d8565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161150a919060040161461f565b6020604051808303815f875af1158015611526573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061154a91906144ae565b505050565b5f610aaf823334612b21565b611563614185565b5f8281525f80516020614c608339815191526020526040908190208151610100810190925280545f80516020614c20833981519152929190829060ff1660058111156115b1576115b1614338565b60058111156115c2576115c2614338565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611685573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116ac9190810190614734565b915091508061170f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ac565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611752573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061177691906144ae565b8251146117da5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ac565b60208201516001600160a01b0316156118505760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ac565b5f8061185f8460400151612e8a565b915091508187146118cc5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ac565b9695505050505050565b5f8281525f80516020614c60833981519152602052604081206003015481905f80516020614c2083398151915290600160401b90046001600160401b031661191e8582613062565b5f61192887613270565b5f8881526008850160205260408120600301805467ffffffffffffffff60401b1916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6119788a858b611a2d565b6040518263ffffffff1660e01b8152600401611994919061447c565b6020604051808303815f875af11580156119b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d491906144ae565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015611aa657611a6681600161481c565b611a7190600861456f565b5081515f90839083908110611a8857611a8861482f565b60200101906001600160f81b03191690815f1a905350600101611a52565b505f5b6004811015611b0957611abd81600361481c565b611ac890600861456f565b6001901c60f81b82611adb836002614843565b81518110611aeb57611aeb61482f565b60200101906001600160f81b03191690815f1a905350600101611aa9565b505f5b6020811015611b6b57611b2081601f61481c565b611b2b90600861456f565b86901c60f81b82611b3d836006614843565b81518110611b4d57611b4d61482f565b60200101906001600160f81b03191690815f1a905350600101611b0c565b505f5b6008811015611bd657611b8281600761481c565b611b8d90600861456f565b6001600160401b038616901c60f81b82611ba8836026614843565b81518110611bb857611bb861482f565b60200101906001600160f81b03191690815f1a905350600101611b6e565b505f5b6008811015611c4157611bed81600761481c565b611bf890600861456f565b6001600160401b038516901c60f81b82611c1383602e614843565b81518110611c2357611c2361482f565b60200101906001600160f81b03191690815f1a905350600101611bd9565b5090505b9392505050565b611c546132f2565b611c5d8161333d565b50565b611c68614185565b5f80516020614c208339815191525f611c8084611fe6565b90505f80611c918360400151612980565b915091508015611cf65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ac565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115611d2857611d28614338565b6005811115611d3957611d39614338565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115611dc057611dc0614338565b1480611dde5750600182516005811115611ddc57611ddc614338565b145b611e3d5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ac565b600382516005811115611e5257611e52614338565b03611e5f57506004611e63565b5060055b6020808301515f90815260098801909152604081205581816005811115611e8c57611e8c614338565b90816005811115611e9f57611e9f614338565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115611ed357611ed3614338565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115611f9e57611f9e614338565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610adc6001600160a01b038216836133a9565b60408051606080820183525f8083526020830181905292820152905f80516020614c208339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561205b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120829190810190614734565b91509150806120e95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016105ac565b825482511461214c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ac565b60208201516001600160a01b0316156121bf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ac565b509392505050565b5f805f83516036146121eb5760405162461bcd60e51b81526004016105ac90614856565b5f805b600281101561223a5761220281600161481c565b61220d90600861456f565b61ffff168682815181106122235761222361482f565b016020015160f81c901b91909117906001016121ee565b5061ffff81161561225d5760405162461bcd60e51b81526004016105ac9061489f565b5f805b60048110156122b85761227481600361481c565b61227f90600861456f565b63ffffffff1687612291836002614843565b815181106122a1576122a161482f565b016020015160f81c901b9190911790600101612260565b5063ffffffff81166003146122df5760405162461bcd60e51b81526004016105ac906148e2565b5f805b6020811015612334576122f681601f61481c565b61230190600861456f565b8861230d836006614843565b8151811061231d5761231d61482f565b016020015160f81c901b91909117906001016122e2565b505f805b60088110156123935761234c81600761481c565b61235790600861456f565b6001600160401b03168961236c836026614843565b8151811061237c5761237c61482f565b016020015160f81c901b9190911790600101612338565b505f805b60088110156123f2576123ab81600761481c565b6123b690600861456f565b6001600160401b03168a6123cb83602e614843565b815181106123db576123db61482f565b016020015160f81c901b9190911790600101612397565b5091989097509095509350505050565b5f8181525f80516020614c6083398151915260205260408082208151610100810190925280545f80516020614c2083398151915293929190829060ff16600581111561245057612450614338565b600581111561246157612461614338565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e090910152909150815160058111156124e9576124e9614338565b146125455760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ac565b60408101516001600160a01b0316336001600160a01b0316146125bf5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016105ac565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561260357612603614338565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6126c684826118d6565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f80516020614c4083398151915280546001190161274c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614be0833981519152906001600160401b031661279e60408601602087016142c4565b6001600160401b0316101561280d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ac565b600381015461281f6020860186614938565b61ffff1610158015612843575061271061283c6020860186614938565b61ffff1611155b61285f5760405162461bcd60e51b81526004016105ac90614953565b80548310156128c25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ac565b80600101548311156129295760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ac565b825f61293482610a9f565b90505f612941888361343c565b5f8181526005860160205260409020909150879061295f828261499e565b509098975050505050505050565b60015f80516020614c4083398151915255565b5f8082516027146129a35760405162461bcd60e51b81526004016105ac90614856565b5f805b60028110156129f2576129ba81600161481c565b6129c590600861456f565b61ffff168582815181106129db576129db61482f565b016020015160f81c901b91909117906001016129a6565b5061ffff811615612a155760405162461bcd60e51b81526004016105ac9061489f565b5f805b6004811015612a7057612a2c81600361481c565b612a3790600861456f565b63ffffffff1686612a49836002614843565b81518110612a5957612a5961482f565b016020015160f81c901b9190911790600101612a18565b5063ffffffff8116600214612a975760405162461bcd60e51b81526004016105ac906148e2565b5f805b6020811015612aec57612aae81601f61481c565b612ab990600861456f565b87612ac5836006614843565b81518110612ad557612ad561482f565b016020015160f81c901b9190911790600101612a9a565b505f86602681518110612b0157612b0161482f565b016020015191976001600160f81b03199092161515965090945050505050565b5f612b2a61271b565b5f80516020614be08339815191525f612b4284610a9f565b90505f612b4e8761155b565b9050600281516005811115612b6557612b65614338565b14612bc45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ac565b5f828260a00151612bd59190614586565b60048501546060840151919250612bf7916001600160401b03909116906149f4565b6001600160401b0316816001600160401b03161115612c765760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ac565b5f80612c828a846118d6565b915091505f8a83604051602001612cb092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115612d4b57612d4b614338565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49650505050505050611c4560015f80516020614c4083398151915255565b5f808251602e14612ead5760405162461bcd60e51b81526004016105ac90614856565b5f805b6002811015612efc57612ec481600161481c565b612ecf90600861456f565b61ffff16858281518110612ee557612ee561482f565b016020015160f81c901b9190911790600101612eb0565b5061ffff811615612f1f5760405162461bcd60e51b81526004016105ac9061489f565b5f805b6004811015612f7a57612f3681600361481c565b612f4190600861456f565b63ffffffff1686612f53836002614843565b81518110612f6357612f6361482f565b016020015160f81c901b9190911790600101612f22565b5063ffffffff8116600414612fa15760405162461bcd60e51b81526004016105ac906148e2565b5f805b6020811015612ff657612fb881601f61481c565b612fc390600861456f565b87612fcf836006614843565b81518110612fdf57612fdf61482f565b016020015160f81c901b9190911790600101612fa4565b505f805b60088110156130555761300e81600761481c565b61301990600861456f565b6001600160401b03168861302e836026614843565b8151811061303e5761303e61482f565b016020015160f81c901b9190911790600101612ffa565b5090969095509350505050565b5f80516020614c208339815191525f6001600160401b0380841690851611156130965761308f838561443a565b90506130a3565b6130a0848461443a565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613105575060028401548151613101916001600160401b031690614843565b8210155b1561312b576001600160401b03831660608201528181526040810151602082015261314a565b828160600181815161313d9190614586565b6001600160401b03169052505b606081015161315a9060646149f4565b602082015160028601546001600160401b0392909216916131859190600160401b900460ff1661456f565b10156131e95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ac565b856001600160401b0316816040018181516132049190614843565b9052506040810180516001600160401b038716919061322490839061481c565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614c608339815191526020526040812060030180545f80516020614c20833981519152916001600160401b0390911690836132b383614a1f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661333b57604051631afcd79f60e31b815260040160405180910390fd5b565b6133456132f2565b61334e81613977565b611c5d608082013560a083013561336b60e0850160c086016142c4565b61337c610100860160e08701614938565b61ffff1661339261012087016101008801614a44565b6133a461014088016101208901614a64565b613998565b804710156133cc5760405163cd78605960e01b81523060048201526024016105ac565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613415576040519150601f19603f3d011682016040523d82523d5f602084013e61341a565b606091505b505090508061154a57604051630a12f52160e11b815260040160405180910390fd5b5f5f80516020614c208339815191524261345c60408601602087016142c4565b6001600160401b0316116134ce5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ac565b6134de60408501602086016142c4565b6001600160401b03166134f46202a30042614843565b116135675760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ac565b83356135bf5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016105ac565b83355f9081526009820160205260409020541561362f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016105ac565b61363c6040850185614a7f565b90506030146136a35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016105ac565b6136ad835f613062565b5f806137476040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906136f291906142c4565b6001600160401b0316815260200161370d60408a018a614a7f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613bdc565b5f828152600786016020526040902091935091506137658282614b05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061379290859060040161447c565b6020604051808303815f875af11580156137ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137d291906144ae565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561385457613854614338565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161394991908e01908e016142c4565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61397f6132f2565b613987613f81565b61398f613f91565b611c5d81613f99565b6139a06132f2565b5f80516020614be083398151915283613a0c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ac565b612710841115613a2e5760405162461bcd60e51b81526004016105ac90614953565b85871115613a965760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ac565b5f8360ff1611613b035760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ac565b600a60ff84161115613b755760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ac565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613c465760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ac565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613cbd57613c7d81600161481c565b613c8890600861456f565b5081515f90839083908110613c9f57613c9f61482f565b60200101906001600160f81b03191690815f1a905350600101613c69565b505f5b6004811015613d1b57613cd481600361481c565b613cdf90600861456f565b505f82613ced836002614843565b81518110613cfd57613cfd61482f565b60200101906001600160f81b03191690815f1a905350600101613cc0565b505f5b6020811015613d785784518160208110613d3a57613d3a61482f565b1a60f81b82613d4a836006614843565b81518110613d5a57613d5a61482f565b60200101906001600160f81b03191690815f1a905350600101613d1e565b505f5b6020811015613dd85784602001518160208110613d9a57613d9a61482f565b1a60f81b82613daa836026614843565b81518110613dba57613dba61482f565b60200101906001600160f81b03191690815f1a905350600101613d7b565b505f5b6008811015613e4c57613def81600761481c565b613dfa90600861456f565b60ff1685604001516001600160401b0316901c60f81b82826046613e1e9190614843565b81518110613e2e57613e2e61482f565b60200101906001600160f81b03191690815f1a905350600101613ddb565b505f5b6030811015613eb75784608001518181518110613e6e57613e6e61482f565b01602001516001600160f81b03191682613e8983604e614843565b81518110613e9957613e9961482f565b60200101906001600160f81b03191690815f1a905350600101613e4f565b505f5b6008811015613f2957613ece81600761481c565b613ed990600861456f565b60608601516001600160401b0390811691161c60f81b82613efb83607e614843565b81518110613f0b57613f0b61482f565b60200101906001600160f81b03191690815f1a905350600101613eba565b50600281604051613f3a9190614bc4565b602060405180830381855afa158015613f55573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190613f7891906144ae565b94909350915050565b613f896132f2565b61333b614146565b61333b6132f2565b613fa16132f2565b80355f80516020614c2083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014613fed6080840160608501614a44565b60ff16111561405a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ac565b5f61406b6080840160608501614a44565b60ff16116140d35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ac565b6140e36080830160608401614a44565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561411460608301604084016142c4565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b61296d6132f2565b50805461415a906145a6565b5f825580601f10614169575050565b601f0160209004905f5260205f2090810190611c5d91906141c9565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b808211156141dd575f81556001016141ca565b5090565b8015158114611c5d575f80fd5b803563ffffffff81168114614201575f80fd5b919050565b5f805f60608486031215614218575f80fd5b83359250602084013561422a816141e1565b9150614238604085016141ee565b90509250925092565b5f60208284031215614251575f80fd5b5035919050565b5f6101408284031215614269575f80fd5b50919050565b5f6020828403121561427f575f80fd5b611c45826141ee565b5f8060408385031215614299575f80fd5b6142a2836141ee565b946020939093013593505050565b6001600160401b0381168114611c5d575f80fd5b5f602082840312156142d4575f80fd5b8135611c45816142b0565b5f8082840360608112156142f1575f80fd5b83356001600160401b03811115614306575f80fd5b840160608187031215614317575f80fd5b92506040601f198201121561432a575f80fd5b506020830190509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061437057634e487b7160e01b5f52602160045260245ffd5b8083525060208301516020830152604083015161439860408401826001600160a01b03169052565b5060608301516143b360608401826001600160401b03169052565b5060808301516143ce60808401826001600160401b03169052565b5060a08301516143e960a08401826001600160401b03169052565b5060c083015161440460c08401826001600160401b03169052565b5060e083015161441f60e08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561441f5761441f614426565b5f5b8381101561447457818101518382015260200161445c565b50505f910152565b602081525f825180602084015261449a81604085016020870161445a565b601f01601f19169190910160400192915050565b5f602082840312156144be575f80fd5b5051919050565b5f826144df57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b8082028115828204841417610aaf57610aaf614426565b6001600160401b0381811683821601908082111561441f5761441f614426565b600181811c908216806145ba57607f821691505b60208210810361426957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454614631816145a6565b806020870152604060018084165f8114614652576001811461466e5761469b565b60ff19851660408a0152604084151560051b8a0101955061469b565b895f5260205f205f5b858110156146925781548b8201860152908301908801614677565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156146df576146df6146a9565b60405290565b604051601f8201601f191681016001600160401b038111828210171561470d5761470d6146a9565b604052919050565b6001600160a01b0381168114611c5d575f80fd5b8051614201816141e1565b5f8060408385031215614745575f80fd5b82516001600160401b038082111561475b575f80fd5b908401906060828703121561476e575f80fd5b6147766146bd565b8251815260208084015161478981614715565b8282015260408401518381111561479e575f80fd5b80850194505087601f8501126147b2575f80fd5b8351838111156147c4576147c46146a9565b6147d6601f8201601f191683016146e5565b935080845288828287010111156147eb575f80fd5b6147fa8183860184880161445a565b5082604083015281955061480f818801614729565b9450505050509250929050565b81810381811115610aaf57610aaf614426565b634e487b7160e01b5f52603260045260245ffd5b80820180821115610aaf57610aaf614426565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b61ffff81168114611c5d575f80fd5b5f60208284031215614948575f80fd5b8135611c4581614929565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b81356149a981614929565b61ffff8116905081548161ffff19821617835560208401356149ca816142b0565b69ffffffffffffffff00008160101b168369ffffffffffffffffffff198416171784555050505050565b6001600160401b03818116838216028082169190828114614a1757614a17614426565b505092915050565b5f6001600160401b03808316818103614a3a57614a3a614426565b6001019392505050565b5f60208284031215614a54575f80fd5b813560ff81168114611c45575f80fd5b5f60208284031215614a74575f80fd5b8135611c4581614715565b5f808335601e19843603018112614a94575f80fd5b8301803591506001600160401b03821115614aad575f80fd5b602001915036819003821315611a26575f80fd5b601f82111561154a57805f5260205f20601f840160051c81016020851015614ae65750805b601f840160051c820191505b81811015610db6575f8155600101614af2565b81516001600160401b03811115614b1e57614b1e6146a9565b614b3281614b2c84546145a6565b84614ac1565b602080601f831160018114614b65575f8415614b4e5750858301515b5f19600386901b1c1916600185901b178555614bbc565b5f85815260208120601f198616915b82811015614b9357888601518255948401946001909101908401614b74565b5085821015614bb057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f8251614bd581846020870161445a565b919091019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index c53386f49..2ffadd0cf 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -59,7 +59,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"}],\"outputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161307138038061307183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612f248061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c806397fb70d411610093578063c974d1b611610063578063c974d1b61461025c578063d5f20ff614610276578063df93d8de14610296578063f2fde38b146102a0575f80fd5b806397fb70d414610215578063a3a65e4814610228578063b771b3bc1461023b578063bee0a03f14610249575f80fd5b806366435abf116100ce57806366435abf1461018b578063715018a6146101b65780638994ab49146101be5780638da5cb5b146101d1575f80fd5b80630322ed98146100ff5780630cdd098514610114578063467ef06f14610165578063580a400614610178575b5f80fd5b61011261010d366004612768565b6102b3565b005b610152610122366004612768565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011261017336600461277f565b610488565b6101126101863660046127bd565b610495565b61019e610199366004612768565b6105a3565b6040516001600160401b03909116815260200161015c565b6101126105b7565b6101526101cc366004612814565b6105ca565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b610112610223366004612768565b6105e6565b61011261023636600461277f565b6105f2565b6101fd6005600160991b0181565b610112610257366004612768565b6107af565b610264601481565b60405160ff909116815260200161015c565b610289610284366004612768565b6108c3565b60405161015c9190612876565b61019e6202a30081565b6101126102ae366004612950565b6109a2565b5f8181525f80516020612ef883398151915260205260408082208151610100810190925280545f80516020612ed883398151915293929190829060ff16600581111561030157610301612862565b600581111561031257610312612862565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561039757610397612862565b146104015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104268584608001515f6109dc565b6040518263ffffffff1660e01b8152600401610442919061298d565b6020604051808303815f875af115801561045e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048291906129bf565b50505050565b61049181610bf9565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104d95750825b90505f826001600160401b031660011480156104f45750303b155b905081158015610502575080155b156105205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561054a57845460ff60401b1916600160401b1785555b6105548787610f6c565b831561059a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105ad826108c3565b60a0015192915050565b6105bf610f86565b6105c85f610fe1565b565b5f6105d3610f86565b6105dd8383611051565b90505b92915050565b6105ef8161158c565b50565b5f80516020612ed88339815191525f61060a836118a5565b90505f8061061b8360400151611a86565b915091508061067d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f8565b5f82815260078501602052604081208054610697906129d6565b90501180156106c9575060015f83815260088601602052604090205460ff1660058111156106c7576106c7612862565b145b6106e55760405162461bcd60e51b81526004016103f890612a0e565b5f82815260078501602052604081206106fd916126d5565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612ed88339815191529291906107f7906129d6565b9050118015610829575060015f83815260088301602052604090205460ff16600581111561082757610827612862565b145b6108455760405162461bcd60e51b81526004016103f890612a0e565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087e9190600401612a55565b6020604051808303815f875af115801561089a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108be91906129bf565b505050565b6108cb61270c565b5f8281525f80516020612ef88339815191526020526040908190208151610100810190925280545f80516020612ed8833981519152929190829060ff16600581111561091957610919612862565b600581111561092a5761092a612862565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6109aa610f86565b6001600160a01b0381166109d357604051631e4fbdf760e01b81525f60048201526024016103f8565b6105ef81610fe1565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a5557610a15816001612b07565b610a20906008612b1a565b5081515f90839083908110610a3757610a37612b31565b60200101906001600160f81b03191690815f1a905350600101610a01565b505f5b6004811015610ab857610a6c816003612b07565b610a77906008612b1a565b6001901c60f81b82610a8a836002612b45565b81518110610a9a57610a9a612b31565b60200101906001600160f81b03191690815f1a905350600101610a58565b505f5b6020811015610b1a57610acf81601f612b07565b610ada906008612b1a565b86901c60f81b82610aec836006612b45565b81518110610afc57610afc612b31565b60200101906001600160f81b03191690815f1a905350600101610abb565b505f5b6008811015610b8557610b31816007612b07565b610b3c906008612b1a565b6001600160401b038616901c60f81b82610b57836026612b45565b81518110610b6757610b67612b31565b60200101906001600160f81b03191690815f1a905350600101610b1d565b505f5b6008811015610bf057610b9c816007612b07565b610ba7906008612b1a565b6001600160401b038516901c60f81b82610bc283602e612b45565b81518110610bd257610bd2612b31565b60200101906001600160f81b03191690815f1a905350600101610b88565b50949350505050565b610c0161270c565b5f80516020612ed88339815191525f610c19846118a5565b90505f80610c2a8360400151611a86565b915091508015610c8f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610cc157610cc1612862565b6005811115610cd257610cd2612862565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d5957610d59612862565b1480610d775750600182516005811115610d7557610d75612862565b145b610dd65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103f8565b600382516005811115610deb57610deb612862565b03610df857506004610dfc565b5060055b6020808301515f90815260098801909152604081205581816005811115610e2557610e25612862565b90816005811115610e3857610e38612862565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610e6c57610e6c612862565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610f3757610f37612862565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610f74611ce5565b610f7d82611d2e565b61049181611d4f565b33610fb87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c85760405163118cdaa760e01b81523360048201526024016103f8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612ed8833981519152426110716040860160208701612b58565b6001600160401b0316116110e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103f8565b6110f36040850160208601612b58565b6001600160401b03166111096202a30042612b45565b1161117c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103f8565b83356111d45760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f8565b83355f908152600982016020526040902054156112445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f8565b6112516040850185612b71565b90506030146112b85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f8565b6112c2835f611d60565b5f8061135c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906113079190612b58565b6001600160401b0316815260200161132260408a018a612b71565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611f57565b5f8281526007860160205260409020919350915061137a8282612bfe565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113a790859060040161298d565b6020604051808303815f875af11580156113c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e791906129bf565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561146957611469612862565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161155e91908e01908e01612b58565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612ef883398151915260205260408082208151610100810190925280545f80516020612ed883398151915293929190829060ff1660058111156115da576115da612862565b60058111156115eb576115eb612862565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561167357611673612862565b146116cf5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f8565b60408101516001600160a01b0316336001600160a01b0316146117495760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103f8565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561178d5761178d612862565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f61185084826122fc565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b60408051606080820183525f8083526020830181905292820152905f80516020612ed88339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561191a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119419190810190612d24565b91509150806119a85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f8565b8254825114611a0b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103f8565b60208201516001600160a01b031615611a7e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103f8565b509392505050565b5f808251602714611aeb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103f8565b5f805b6002811015611b3a57611b02816001612b07565b611b0d906008612b1a565b61ffff16858281518110611b2357611b23612b31565b016020015160f81c901b9190911790600101611aee565b5061ffff811615611b995760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103f8565b5f805b6004811015611bf457611bb0816003612b07565b611bbb906008612b1a565b63ffffffff1686611bcd836002612b45565b81518110611bdd57611bdd612b31565b016020015160f81c901b9190911790600101611b9c565b5063ffffffff8116600214611c5b5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103f8565b5f805b6020811015611cb057611c7281601f612b07565b611c7d906008612b1a565b87611c89836006612b45565b81518110611c9957611c99612b31565b016020015160f81c901b9190911790600101611c5e565b505f86602681518110611cc557611cc5612b31565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c857604051631afcd79f60e31b815260040160405180910390fd5b611d36611ce5565b611d3e612458565b611d46612468565b6105ef81612470565b611d57611ce5565b6105ef8161261d565b5f80516020612ed88339815191525f6001600160401b038084169085161115611d9457611d8d8385612e0c565b9050611da1565b611d9e8484612e0c565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580611e03575060028401548151611dff916001600160401b031690612b45565b8210155b15611e29576001600160401b038316606082015281815260408101516020820152611e48565b8281606001818151611e3b9190612e2c565b6001600160401b03169052505b6060810151611e58906064612e4c565b602082015160028601546001600160401b039290921691611e839190600160401b900460ff16612b1a565b1015611ee75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103f8565b611ef18587612e0c565b6001600160401b031681604001818151611f0b9190612b45565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f6060826080015151603014611fc15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561203857611ff8816001612b07565b612003906008612b1a565b5081515f9083908390811061201a5761201a612b31565b60200101906001600160f81b03191690815f1a905350600101611fe4565b505f5b60048110156120965761204f816003612b07565b61205a906008612b1a565b505f82612068836002612b45565b8151811061207857612078612b31565b60200101906001600160f81b03191690815f1a90535060010161203b565b505f5b60208110156120f357845181602081106120b5576120b5612b31565b1a60f81b826120c5836006612b45565b815181106120d5576120d5612b31565b60200101906001600160f81b03191690815f1a905350600101612099565b505f5b6020811015612153578460200151816020811061211557612115612b31565b1a60f81b82612125836026612b45565b8151811061213557612135612b31565b60200101906001600160f81b03191690815f1a9053506001016120f6565b505f5b60088110156121c75761216a816007612b07565b612175906008612b1a565b60ff1685604001516001600160401b0316901c60f81b828260466121999190612b45565b815181106121a9576121a9612b31565b60200101906001600160f81b03191690815f1a905350600101612156565b505f5b603081101561223257846080015181815181106121e9576121e9612b31565b01602001516001600160f81b0319168261220483604e612b45565b8151811061221457612214612b31565b60200101906001600160f81b03191690815f1a9053506001016121ca565b505f5b60088110156122a457612249816007612b07565b612254906008612b1a565b60608601516001600160401b0390811691161c60f81b8261227683607e612b45565b8151811061228657612286612b31565b60200101906001600160f81b03191690815f1a905350600101612235565b506002816040516122b59190612e77565b602060405180830381855afa1580156122d0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906122f391906129bf565b94909350915050565b5f8281525f80516020612ef8833981519152602052604081206003015481905f80516020612ed883398151915290600160401b90046001600160401b03166123448582611d60565b5f61234e87612625565b5f888152600885016020526040812060030180546fffffffffffffffff00000000000000001916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123a38a858b6109dc565b6040518263ffffffff1660e01b81526004016123bf919061298d565b6020604051808303815f875af11580156123db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ff91906129bf565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b612460611ce5565b6105c86126a7565b6105c8611ce5565b612478611ce5565b80355f80516020612ed883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146124c46080840160608501612e92565b60ff1611156125315760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103f8565b5f6125426080840160608501612e92565b60ff16116125aa5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103f8565b6125ba6080830160608401612e92565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556125eb6060830160408401612b58565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6109aa611ce5565b5f8181525f80516020612ef88339815191526020526040812060030180545f80516020612ed8833981519152916001600160401b03909116908361266883612eb2565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6126af611ce5565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5080546126e1906129d6565b5f825580601f106126f0575050565b601f0160209004905f5260205f20908101906105ef9190612750565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b80821115612764575f8155600101612751565b5090565b5f60208284031215612778575f80fd5b5035919050565b5f6020828403121561278f575f80fd5b813563ffffffff811681146127a2575f80fd5b9392505050565b6001600160a01b03811681146105ef575f80fd5b5f8082840360a08112156127cf575f80fd5b60808112156127dc575f80fd5b5082915060808301356127ee816127a9565b809150509250929050565b80356001600160401b038116811461280f575f80fd5b919050565b5f8060408385031215612825575f80fd5b82356001600160401b0381111561283a575f80fd5b83016060818603121561284b575f80fd5b9150612859602084016127f9565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b81516101008201906006811061289a57634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516128c260408401826001600160a01b03169052565b5060608301516128dd60608401826001600160401b03169052565b5060808301516128f860808401826001600160401b03169052565b5060a083015161291360a08401826001600160401b03169052565b5060c083015161292e60c08401826001600160401b03169052565b5060e083015161294960e08401826001600160401b03169052565b5092915050565b5f60208284031215612960575f80fd5b81356127a2816127a9565b5f5b8381101561298557818101518382015260200161296d565b50505f910152565b602081525f82518060208401526129ab81604085016020870161296b565b601f01601f19169190910160400192915050565b5f602082840312156129cf575f80fd5b5051919050565b600181811c908216806129ea57607f821691505b602082108103612a0857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612a67816129d6565b806020870152604060018084165f8114612a885760018114612aa457612ad1565b60ff19851660408a0152604084151560051b8a01019550612ad1565b895f5260205f205f5b85811015612ac85781548b8201860152908301908801612aad565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105e0576105e0612af3565b80820281158282048414176105e0576105e0612af3565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105e0576105e0612af3565b5f60208284031215612b68575f80fd5b6105dd826127f9565b5f808335601e19843603018112612b86575f80fd5b8301803591506001600160401b03821115612b9f575f80fd5b602001915036819003821315612451575f80fd5b601f8211156108be57805f5260205f20601f840160051c81016020851015612bd85750805b601f840160051c820191505b81811015612bf7575f8155600101612be4565b5050505050565b81516001600160401b03811115612c1757612c17612adf565b612c2b81612c2584546129d6565b84612bb3565b602080601f831160018114612c5e575f8415612c475750858301515b5f19600386901b1c1916600185901b178555612cb5565b5f85815260208120601f198616915b82811015612c8c57888601518255948401946001909101908401612c6d565b5085821015612ca957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b0381118282101715612cdf57612cdf612adf565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612d0d57612d0d612adf565b604052919050565b8051801515811461280f575f80fd5b5f8060408385031215612d35575f80fd5b82516001600160401b0380821115612d4b575f80fd5b9084019060608287031215612d5e575f80fd5b612d66612cbd565b82518152602080840151612d79816127a9565b82820152604084015183811115612d8e575f80fd5b80850194505087601f850112612da2575f80fd5b835183811115612db457612db4612adf565b612dc6601f8201601f19168301612ce5565b93508084528882828701011115612ddb575f80fd5b612dea8183860184880161296b565b50826040830152819550612dff818801612d15565b9450505050509250929050565b6001600160401b0382811682821603908082111561294957612949612af3565b6001600160401b0381811683821601908082111561294957612949612af3565b6001600160401b03818116838216028082169190828114612e6f57612e6f612af3565b505092915050565b5f8251612e8881846020870161296b565b9190910192915050565b5f60208284031215612ea2575f80fd5b813560ff811681146127a2575f80fd5b5f6001600160401b03808316818103612ecd57612ecd612af3565b600101939250505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161308838038061308883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612f3b8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106100fb575f3560e01c806397fb70d411610093578063c974d1b611610063578063c974d1b61461025c578063d5f20ff614610276578063df93d8de14610296578063f2fde38b146102a0575f80fd5b806397fb70d414610215578063a3a65e4814610228578063b771b3bc1461023b578063bee0a03f14610249575f80fd5b806366435abf116100ce57806366435abf1461018b578063715018a6146101b65780638994ab49146101be5780638da5cb5b146101d1575f80fd5b80630322ed98146100ff5780630cdd098514610114578063467ef06f14610165578063580a400614610178575b5f80fd5b61011261010d36600461277f565b6102b3565b005b61015261012236600461277f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610112610173366004612796565b610488565b6101126101863660046127d4565b610495565b61019e61019936600461277f565b6105a3565b6040516001600160401b03909116815260200161015c565b6101126105b7565b6101526101cc36600461282b565b6105ca565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161015c565b61011261022336600461277f565b6105e6565b610112610236366004612796565b6105f2565b6101fd6005600160991b0181565b61011261025736600461277f565b6107af565b610264601481565b60405160ff909116815260200161015c565b61028961028436600461277f565b6108c3565b60405161015c919061288d565b61019e6202a30081565b6101126102ae366004612967565b6109a2565b5f8181525f80516020612f0f83398151915260205260408082208151610100810190925280545f80516020612eef83398151915293929190829060ff16600581111561030157610301612879565b600581111561031257610312612879565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091508151600581111561039757610397612879565b146104015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104268584608001515f6109dc565b6040518263ffffffff1660e01b815260040161044291906129a4565b6020604051808303815f875af115801561045e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048291906129d6565b50505050565b61049181610bf9565b5050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104d95750825b90505f826001600160401b031660011480156104f45750303b155b905081158015610502575080155b156105205760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561054a57845460ff60401b1916600160401b1785555b6105548787610f6c565b831561059a57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b5f6105ad826108c3565b60a0015192915050565b6105bf610f86565b6105c85f610fe1565b565b5f6105d3610f86565b6105dd8383611051565b90505b92915050565b6105ef8161158c565b50565b5f80516020612eef8339815191525f61060a836118a5565b90505f8061061b8360400151611a86565b915091508061067d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103f8565b5f82815260078501602052604081208054610697906129ed565b90501180156106c9575060015f83815260088601602052604090205460ff1660058111156106c7576106c7612879565b145b6106e55760405162461bcd60e51b81526004016103f890612a25565b5f82815260078501602052604081206106fd916126ec565b5f8281526008850160208181526040808420805460ff191660021781556003810180546001600160401b0342818116600160801b0267ffffffffffffffff60801b19909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160401b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020612eef8339815191529291906107f7906129ed565b9050118015610829575060015f83815260088301602052604090205460ff16600581111561082757610827612879565b145b6108455760405162461bcd60e51b81526004016103f890612a25565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161087e9190600401612a6c565b6020604051808303815f875af115801561089a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108be91906129d6565b505050565b6108cb612723565b5f8281525f80516020612f0f8339815191526020526040908190208151610100810190925280545f80516020612eef833981519152929190829060ff16600581111561091957610919612879565b600581111561092a5761092a612879565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003909201548083166080830152600160401b8104831660a0830152600160801b8104831660c0830152600160c01b900490911660e0909101529392505050565b6109aa610f86565b6001600160a01b0381166109d357604051631e4fbdf760e01b81525f60048201526024016103f8565b6105ef81610fe1565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610a5557610a15816001612b1e565b610a20906008612b31565b5081515f90839083908110610a3757610a37612b48565b60200101906001600160f81b03191690815f1a905350600101610a01565b505f5b6004811015610ab857610a6c816003612b1e565b610a77906008612b31565b6001901c60f81b82610a8a836002612b5c565b81518110610a9a57610a9a612b48565b60200101906001600160f81b03191690815f1a905350600101610a58565b505f5b6020811015610b1a57610acf81601f612b1e565b610ada906008612b31565b86901c60f81b82610aec836006612b5c565b81518110610afc57610afc612b48565b60200101906001600160f81b03191690815f1a905350600101610abb565b505f5b6008811015610b8557610b31816007612b1e565b610b3c906008612b31565b6001600160401b038616901c60f81b82610b57836026612b5c565b81518110610b6757610b67612b48565b60200101906001600160f81b03191690815f1a905350600101610b1d565b505f5b6008811015610bf057610b9c816007612b1e565b610ba7906008612b31565b6001600160401b038516901c60f81b82610bc283602e612b5c565b81518110610bd257610bd2612b48565b60200101906001600160f81b03191690815f1a905350600101610b88565b50949350505050565b610c01612723565b5f80516020612eef8339815191525f610c19846118a5565b90505f80610c2a8360400151611a86565b915091508015610c8f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103f8565b5f828152600885016020526040808220815161010081019092528054829060ff166005811115610cc157610cc1612879565b6005811115610cd257610cd2612879565b81526001820154602082015260028201546001600160a01b03811660408301526001600160401b03600160a01b909104811660608301526003928301548082166080840152600160401b8104821660a0840152600160801b8104821660c0840152600160c01b90041660e0909101529091505f9082516005811115610d5957610d59612879565b1480610d775750600182516005811115610d7557610d75612879565b145b610dd65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103f8565b600382516005811115610deb57610deb612879565b03610df857506004610dfc565b5060055b6020808301515f90815260098801909152604081205581816005811115610e2557610e25612879565b90816005811115610e3857610e38612879565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115610e6c57610e6c612879565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b0319909316959094169490941717929092161791909117905581516005811115610f3757610f37612879565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3509695505050505050565b610f74611ce5565b610f7d82611d2e565b61049181611d4f565b33610fb87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146105c85760405163118cdaa760e01b81523360048201526024016103f8565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f5f80516020612eef833981519152426110716040860160208701612b6f565b6001600160401b0316116110e35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103f8565b6110f36040850160208601612b6f565b6001600160401b03166111096202a30042612b5c565b1161117c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103f8565b83356111d45760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016103f8565b83355f908152600982016020526040902054156112445760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016103f8565b6112516040850185612b88565b90506030146112b85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016103f8565b6112c2835f611d60565b5f8061135c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906113079190612b6f565b6001600160401b0316815260200161132260408a018a612b88565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611f6e565b5f8281526007860160205260409020919350915061137a8282612c15565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906113a79085906004016129a4565b6020604051808303815f875af11580156113c3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e791906129d6565b604080516101008101825260018152893560208201529192508101336001600160a01b031681526001600160401b03881660208083018290525f604080850182905260608501939093526080840181905260a0909301839052868352600888019052902081518154829060ff1916600183600581111561146957611469612879565b0217905550602082810151600183015560408084015160028401805460608701516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808501516003909401805460a087015160c088015160e0909801518416600160c01b026001600160c01b03988516600160801b02989098166001600160801b03918516600160401b026001600160801b0319909316979094169690961717949094161793909317909155829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161155e91908e01908e01612b6f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f80516020612f0f83398151915260205260408082208151610100810190925280545f80516020612eef83398151915293929190829060ff1660058111156115da576115da612879565b60058111156115eb576115eb612879565b8152600182015460208201526002808301546001600160a01b03811660408401526001600160401b03600160a01b909104811660608401526003909301548084166080840152600160401b8104841660a0840152600160801b8104841660c0840152600160c01b900490921660e0909101529091508151600581111561167357611673612879565b146116cf5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103f8565b60408101516001600160a01b0316336001600160a01b0316146117495760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a2073656e646572206e6f742076616c60448201526b34b230ba37b91037bbb732b960a11b60648201526084016103f8565b60038152426001600160401b031660e08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561178d5761178d612879565b021790555060208201516001820155604082015160028201805460608501516001600160401b03908116600160a01b026001600160e01b03199092166001600160a01b039094169390931717905560808301516003909201805460a085015160c086015160e0909601518416600160c01b026001600160c01b03968516600160801b02969096166001600160801b03918516600160401b026001600160801b031990931695909416949094171792909216179190911790555f6118508482612313565b60a0840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b60408051606080820183525f8083526020830181905292820152905f80516020612eef8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561191a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526119419190810190612d3b565b91509150806119a85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20496e76696e76616c6964616c696460448201526c2077617270206d65737361676560981b60648201526084016103f8565b8254825114611a0b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103f8565b60208201516001600160a01b031615611a7e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103f8565b509392505050565b5f808251602714611aeb5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152680ceca40d8cadccee8d60bb1b60648201526084016103f8565b5f805b6002811015611b3a57611b02816001612b1e565b611b0d906008612b31565b61ffff16858281518110611b2357611b23612b48565b016020015160f81c901b9190911790600101611aee565b5061ffff811615611b995760405162461bcd60e51b815260206004820152602360248201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360448201526208125160ea1b60648201526084016103f8565b5f805b6004811015611bf457611bb0816003612b1e565b611bbb906008612b31565b63ffffffff1686611bcd836002612b5c565b81518110611bdd57611bdd612b48565b016020015160f81c901b9190911790600101611b9c565b5063ffffffff8116600214611c5b5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616044820152666765207479706560c81b60648201526084016103f8565b5f805b6020811015611cb057611c7281601f612b1e565b611c7d906008612b31565b87611c89836006612b5c565b81518110611c9957611c99612b48565b016020015160f81c901b9190911790600101611c5e565b505f86602681518110611cc557611cc5612b48565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166105c857604051631afcd79f60e31b815260040160405180910390fd5b611d36611ce5565b611d3e61246f565b611d4661247f565b6105ef81612487565b611d57611ce5565b6105ef81612634565b5f80516020612eef8339815191525f6001600160401b038084169085161115611d9457611d8d8385612e23565b9050611da1565b611d9e8484612e23565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580611e03575060028401548151611dff916001600160401b031690612b5c565b8210155b15611e29576001600160401b038316606082015281815260408101516020820152611e48565b8281606001818151611e3b9190612e43565b6001600160401b03169052505b6060810151611e58906064612e63565b602082015160028601546001600160401b039290921691611e839190600160401b900460ff16612b31565b1015611ee75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103f8565b856001600160401b031681604001818151611f029190612b5c565b9052506040810180516001600160401b0387169190611f22908390612b1e565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f6060826080015151603014611fd85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103f8565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561204f5761200f816001612b1e565b61201a906008612b31565b5081515f9083908390811061203157612031612b48565b60200101906001600160f81b03191690815f1a905350600101611ffb565b505f5b60048110156120ad57612066816003612b1e565b612071906008612b31565b505f8261207f836002612b5c565b8151811061208f5761208f612b48565b60200101906001600160f81b03191690815f1a905350600101612052565b505f5b602081101561210a57845181602081106120cc576120cc612b48565b1a60f81b826120dc836006612b5c565b815181106120ec576120ec612b48565b60200101906001600160f81b03191690815f1a9053506001016120b0565b505f5b602081101561216a578460200151816020811061212c5761212c612b48565b1a60f81b8261213c836026612b5c565b8151811061214c5761214c612b48565b60200101906001600160f81b03191690815f1a90535060010161210d565b505f5b60088110156121de57612181816007612b1e565b61218c906008612b31565b60ff1685604001516001600160401b0316901c60f81b828260466121b09190612b5c565b815181106121c0576121c0612b48565b60200101906001600160f81b03191690815f1a90535060010161216d565b505f5b6030811015612249578460800151818151811061220057612200612b48565b01602001516001600160f81b0319168261221b83604e612b5c565b8151811061222b5761222b612b48565b60200101906001600160f81b03191690815f1a9053506001016121e1565b505f5b60088110156122bb57612260816007612b1e565b61226b906008612b31565b60608601516001600160401b0390811691161c60f81b8261228d83607e612b5c565b8151811061229d5761229d612b48565b60200101906001600160f81b03191690815f1a90535060010161224c565b506002816040516122cc9190612e8e565b602060405180830381855afa1580156122e7573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061230a91906129d6565b94909350915050565b5f8281525f80516020612f0f833981519152602052604081206003015481905f80516020612eef83398151915290600160401b90046001600160401b031661235b8582611d60565b5f6123658761263c565b5f888152600885016020526040812060030180546fffffffffffffffff00000000000000001916600160401b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123ba8a858b6109dc565b6040518263ffffffff1660e01b81526004016123d691906129a4565b6020604051808303815f875af11580156123f2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061241691906129d6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b612477611ce5565b6105c86126be565b6105c8611ce5565b61248f611ce5565b80355f80516020612eef83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146124db6080840160608501612ea9565b60ff1611156125485760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103f8565b5f6125596080840160608501612ea9565b60ff16116125c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103f8565b6125d16080830160608401612ea9565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556126026060830160408401612b6f565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556402540be40060059091015550565b6109aa611ce5565b5f8181525f80516020612f0f8339815191526020526040812060030180545f80516020612eef833981519152916001600160401b03909116908361267f83612ec9565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060030154909116919050565b6126c6611ce5565b60017f9b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f0055565b5080546126f8906129ed565b5f825580601f10612707575050565b601f0160209004905f5260205f20908101906105ef9190612767565b604080516101008101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c0820181905260e09091015290565b5b8082111561277b575f8155600101612768565b5090565b5f6020828403121561278f575f80fd5b5035919050565b5f602082840312156127a6575f80fd5b813563ffffffff811681146127b9575f80fd5b9392505050565b6001600160a01b03811681146105ef575f80fd5b5f8082840360a08112156127e6575f80fd5b60808112156127f3575f80fd5b508291506080830135612805816127c0565b809150509250929050565b80356001600160401b0381168114612826575f80fd5b919050565b5f806040838503121561283c575f80fd5b82356001600160401b03811115612851575f80fd5b830160608186031215612862575f80fd5b915061287060208401612810565b90509250929050565b634e487b7160e01b5f52602160045260245ffd5b8151610100820190600681106128b157634e487b7160e01b5f52602160045260245ffd5b808352506020830151602083015260408301516128d960408401826001600160a01b03169052565b5060608301516128f460608401826001600160401b03169052565b50608083015161290f60808401826001600160401b03169052565b5060a083015161292a60a08401826001600160401b03169052565b5060c083015161294560c08401826001600160401b03169052565b5060e083015161296060e08401826001600160401b03169052565b5092915050565b5f60208284031215612977575f80fd5b81356127b9816127c0565b5f5b8381101561299c578181015183820152602001612984565b50505f910152565b602081525f82518060208401526129c2816040850160208701612982565b601f01601f19169190910160400192915050565b5f602082840312156129e6575f80fd5b5051919050565b600181811c90821680612a0157607f821691505b602082108103612a1f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454612a7e816129ed565b806020870152604060018084165f8114612a9f5760018114612abb57612ae8565b60ff19851660408a0152604084151560051b8a01019550612ae8565b895f5260205f205f5b85811015612adf5781548b8201860152908301908801612ac4565b8a016040019650505b509398975050505050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b818103818111156105e0576105e0612b0a565b80820281158282048414176105e0576105e0612b0a565b634e487b7160e01b5f52603260045260245ffd5b808201808211156105e0576105e0612b0a565b5f60208284031215612b7f575f80fd5b6105dd82612810565b5f808335601e19843603018112612b9d575f80fd5b8301803591506001600160401b03821115612bb6575f80fd5b602001915036819003821315612468575f80fd5b601f8211156108be57805f5260205f20601f840160051c81016020851015612bef5750805b601f840160051c820191505b81811015612c0e575f8155600101612bfb565b5050505050565b81516001600160401b03811115612c2e57612c2e612af6565b612c4281612c3c84546129ed565b84612bca565b602080601f831160018114612c75575f8415612c5e5750858301515b5f19600386901b1c1916600185901b178555612ccc565b5f85815260208120601f198616915b82811015612ca357888601518255948401946001909101908401612c84565b5085821015612cc057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b604051606081016001600160401b0381118282101715612cf657612cf6612af6565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612d2457612d24612af6565b604052919050565b80518015158114612826575f80fd5b5f8060408385031215612d4c575f80fd5b82516001600160401b0380821115612d62575f80fd5b9084019060608287031215612d75575f80fd5b612d7d612cd4565b82518152602080840151612d90816127c0565b82820152604084015183811115612da5575f80fd5b80850194505087601f850112612db9575f80fd5b835183811115612dcb57612dcb612af6565b612ddd601f8201601f19168301612cfc565b93508084528882828701011115612df2575f80fd5b612e0181838601848801612982565b50826040830152819550612e16818801612d2c565b9450505050509250929050565b6001600160401b0382811682821603908082111561296057612960612b0a565b6001600160401b0381811683821601908082111561296057612960612b0a565b6001600160401b03818116838216028082169190828114612e8657612e86612b0a565b505092915050565b5f8251612e9f818460208701612982565b9190910192915050565b5f60208284031215612eb9575f80fd5b813560ff811681146127b9575f80fd5b5f6001600160401b03808316818103612ee457612ee4612b0a565b600101939250505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index bd4b5373b..ae1ae3e9a 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -434,7 +434,9 @@ abstract contract ValidatorManager is "ValidatorManager: maximum churn rate exceeded" ); - churnTracker.totalWeight += newWeight - oldWeight; + // Two separate calculations because we're using uints and (newWeight - oldWeight) could underflow. + churnTracker.totalWeight += newWeight; + churnTracker.totalWeight -= oldWeight; $._churnTracker = churnTracker; } From 901908551184ae73a734fc8374fed50e2c32072d Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 10:41:09 -0400 Subject: [PATCH 322/545] Remove unneccessary comment --- contracts/staking/NativeTokenStakingManager.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/staking/NativeTokenStakingManager.sol index f08264082..b00581c66 100644 --- a/contracts/staking/NativeTokenStakingManager.sol +++ b/contracts/staking/NativeTokenStakingManager.sol @@ -88,7 +88,6 @@ contract NativeTokenStakingManager is payable(to).sendValue(value); } - // solhint-disable-next-line no-empty-blocks function _reward(address account, uint256 amount) internal virtual override { NATIVE_MINTER.mintNativeCoin(account, amount); } From 2109a68c08976192a1ae5fd0f11a86962c5ee961 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 10:51:31 -0400 Subject: [PATCH 323/545] Add comments --- contracts/staking/PoSValidatorManager.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 66a4c5bec..f40f2021b 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -146,7 +146,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager ); if (includeUptimeProof) { + // Uptime proofs include the absolute number of seconds the validator has been active. uint64 uptimeSeconds = _getUptime(validationID, messageIndex); + // Save this value for use by this validator's delegators. $._completedValidationUptimeSeconds[validationID] = uptimeSeconds; $._redeemableValidatorRewards[validationID] += $._rewardCalculator.calculateReward({ @@ -387,8 +389,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager validator.status == ValidatorStatus.PendingRemoved || validator.status == ValidatorStatus.Completed ) { + // If the validation period has already ended, we have saved the uptime. validatorUptimeSeconds = $._completedValidationUptimeSeconds[validationID]; } else if (includeUptimeProof) { + // Uptime proofs include the absolute number of seconds the validator has been active. validatorUptimeSeconds = _getUptime(validationID, messageIndex); } From 0eb93c60f47ccd959d9f4b745191fc90cbcb4704 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 13:01:15 -0400 Subject: [PATCH 324/545] rename newWeight and oldWeight --- contracts/staking/ValidatorManager.sol | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index ae1ae3e9a..e31e55ec3 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -403,14 +403,17 @@ abstract contract ValidatorManager is * rate for the past churn period. If the churn rate is exceeded, the function will revert. If the churn rate is * not exceeded, the function will update the churn tracker with the new weight. */ - function _checkAndUpdateChurnTracker(uint64 newWeight, uint64 oldWeight) private { + function _checkAndUpdateChurnTracker( + uint64 newValidatorWeight, + uint64 oldValidatorWeight + ) private { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); uint64 weightChange; - if (newWeight > oldWeight) { - weightChange = newWeight - oldWeight; + if (newValidatorWeight > oldValidatorWeight) { + weightChange = newValidatorWeight - oldValidatorWeight; } else { - weightChange = oldWeight - newWeight; + weightChange = oldValidatorWeight - newValidatorWeight; } uint256 currentTime = block.timestamp; @@ -434,9 +437,9 @@ abstract contract ValidatorManager is "ValidatorManager: maximum churn rate exceeded" ); - // Two separate calculations because we're using uints and (newWeight - oldWeight) could underflow. - churnTracker.totalWeight += newWeight; - churnTracker.totalWeight -= oldWeight; + // Two separate calculations because we're using uints and (newValidatorWeight - oldValidatorWeight) could underflow. + churnTracker.totalWeight += newValidatorWeight; + churnTracker.totalWeight -= oldValidatorWeight; $._churnTracker = churnTracker; } From 8d2969a72844d0074b190fd4784d66b901c0ca8f Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 13:16:49 -0400 Subject: [PATCH 325/545] Update contracts/staking/PoSValidatorManager.sol Co-authored-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Signed-off-by: Geoff Stuart --- contracts/staking/PoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 4deeb75f6..04026a464 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -168,7 +168,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager (Validator memory validator, bytes32 validationID) = _completeEndValidation(messageIndex); - // PoA or initial validator case + // Return now if this was originally a PoA validator that was later migrated to this PoS manager if (validator.owner == address(0)) { return; } From b465fba85ef1373e49e768863e380dbbc4d8660c Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 13:17:03 -0400 Subject: [PATCH 326/545] Update contracts/staking/PoSValidatorManager.sol Co-authored-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Signed-off-by: Geoff Stuart --- contracts/staking/PoSValidatorManager.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 04026a464..51e6d62d8 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -378,6 +378,8 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager delegator.endedAt = uint64(block.timestamp); } else { // If the validation period has already ended, we have saved the uptime. + // Further, it is impossible to retrieve an uptime proof for an already ended validation, + // so there's no need to check any uptime proof provided in this function call. validatorUptimeSeconds = $._completedValidationUptimeSeconds[validationID]; delegator.endingNonce = validator.messageNonce; From c215b3ca0021f87206d61d542ffbf5b69e373835 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 13:17:49 -0400 Subject: [PATCH 327/545] Update contracts/staking/PoSValidatorManager.sol Co-authored-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Signed-off-by: Geoff Stuart --- contracts/staking/PoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 51e6d62d8..9040e3684 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -179,7 +179,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager _reward(validator.owner, rewards); } - // We unlock the state whether the validation period is completed or invalidated. + // We unlock the stake whether the validation period is completed or invalidated. _unlock(validator.owner, weightToValue(validator.startingWeight)); } From d9ae361b06eba6f795369976638b2f1d2f452bb1 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 13:33:09 -0400 Subject: [PATCH 328/545] fix comment --- contracts/staking/tests/NativeTokenStakingManagerTests.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 53d76c22b..e4a95a23f 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -213,7 +213,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { data: "", // implies receive() returnData: "" }); - // Because we don + // Units tests don't have access to the native minter precompile, so use vm.deal instead. vm.deal(account, account.balance + amount); } From fbeb9c5f61f46f22acf12d63e765b4f59d0cc5c7 Mon Sep 17 00:00:00 2001 From: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:57:13 -0500 Subject: [PATCH 329/545] Update contracts/staking/ValidatorMessages.sol Signed-off-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> --- contracts/staking/ValidatorMessages.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index 21d12e90a..c1a52b33d 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -19,7 +19,7 @@ library ValidatorMessages { // The P-Chain uses a hardcoded codecID of 0 for all messages. uint16 internal constant CODEC_ID = 0; - // The P-Chain signs a SubnetConversion message that is used to verify for the Subnet's initial validators. + // The P-Chain signs a SubnetConversion message that is used to verify the Subnet's initial validators. uint32 internal constant SUBNET_CONVERSION_MESSAGE_TYPE_ID = 0; // Subnets send a RegisterSubnetValidator message to the P-Chain to register a validator. From fb872a7775d17b655f7531662259d9749a18fc13 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 14:02:30 -0400 Subject: [PATCH 330/545] fix comment --- contracts/staking/interfaces/IValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 9fed03f1f..a45e3735b 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -33,7 +33,7 @@ struct ValidatorChurnPeriod { } /** - * @notice Event emitted when delegator removal is initiated + * @notice Event emitted when validator weight is updated. * @param validationID The ID of the validation period * @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 b943edc034427123597a18cf707237d5e90623df Mon Sep 17 00:00:00 2001 From: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Date: Wed, 18 Sep 2024 13:03:37 -0500 Subject: [PATCH 331/545] Update contracts/staking/interfaces/IValidatorManager.sol Signed-off-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> --- contracts/staking/interfaces/IValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 78be44d0b..87eee1f99 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -121,7 +121,7 @@ interface IValidatorManager { * @notice Verifies and sets the initial validator set for the chain through a P-Chain * SubnetConversionMessage. * @param subnetConversionData The subnet conversion message data used to recompute and verify against the subnetConversionID. - * @param messsageIndex The index that contains the SubnetConversionMessage Warp message in the transaction. + * @param messsageIndex The index that contains the SubnetConversionMessage Warp message containing the subnetConversionID to be verified against the provided {subnetConversionData} */ function initializeValidatorSet( SubnetConversionData calldata subnetConversionData, From 8e25aa2a7b6e36b0f7b4cddf069ae7112d8cd8af Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 14:06:20 -0400 Subject: [PATCH 332/545] review fixes --- contracts/staking/PoSValidatorManager.sol | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 2478dca6d..956700265 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -323,9 +323,10 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager // TODO: Calculate the delegator's reward, but do not unlock it - // Ensure the delegator is active Delegator memory delegator = $._delegatorStakes[delegationID]; Validator memory validator = getValidator(validationID); + + // Ensure the delegator is active require( delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegation not active" ); @@ -345,6 +346,9 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager delegator.endedAt = uint64(block.timestamp); } else { + // If the validation period has already ended, there won't be any uptime message able to be + // provided in the call to initializeEndDelegation, and the uptime submitted when the validator + // was ended should be used to calculate the delegators rewards. delegator.endingNonce = validator.messageNonce; delegator.endedAt = validator.endedAt; } From 9bbfde259f884748474a332914268920221d66fa Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 14:11:38 -0400 Subject: [PATCH 333/545] review fixes --- contracts/staking/interfaces/IERC20Mintable.sol | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/contracts/staking/interfaces/IERC20Mintable.sol b/contracts/staking/interfaces/IERC20Mintable.sol index fd28ad6b1..855647257 100644 --- a/contracts/staking/interfaces/IERC20Mintable.sol +++ b/contracts/staking/interfaces/IERC20Mintable.sol @@ -7,6 +7,13 @@ pragma solidity 0.8.25; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; + interface IERC20Mintable is IERC20 { + /** + * @notice Mint tokens to the specified address. + * @param account The address to mint tokens to. + * @param amount How many tokens to mint. + * @dev This function should have appropriate user controls to ensure that only the staking contract can mint. + */ function mint(address account, uint256 amount) external; } From be8d43447b71ef391b69a2c290139a3e4a2795d9 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 14:15:38 -0400 Subject: [PATCH 334/545] lint --- contracts/staking/PoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 956700265..d383824ba 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -325,7 +325,7 @@ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager Delegator memory delegator = $._delegatorStakes[delegationID]; Validator memory validator = getValidator(validationID); - + // Ensure the delegator is active require( delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegation not active" From ebe122e6b3b87637b2821537c216a1dcfe9a10bc Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 14:21:02 -0400 Subject: [PATCH 335/545] lint --- contracts/staking/interfaces/IERC20Mintable.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/staking/interfaces/IERC20Mintable.sol b/contracts/staking/interfaces/IERC20Mintable.sol index 855647257..dd2225ceb 100644 --- a/contracts/staking/interfaces/IERC20Mintable.sol +++ b/contracts/staking/interfaces/IERC20Mintable.sol @@ -7,7 +7,6 @@ pragma solidity 0.8.25; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; - interface IERC20Mintable is IERC20 { /** * @notice Mint tokens to the specified address. From 32d2b9e386486e1b896bce371333ffeb286b24a6 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 18 Sep 2024 13:21:51 -0500 Subject: [PATCH 336/545] minor feedback --- .../ERC20TokenStakingManager.go | 74 +++++++++++++++++-- .../NativeTokenStakingManager.go | 74 +++++++++++++++++-- .../PoAValidatorManager.go | 74 +++++++++++++++++-- contracts/staking/ValidatorManager.sol | 17 +++-- contracts/staking/ValidatorMessages.sol | 23 ++++++ .../staking/interfaces/IValidatorManager.sol | 2 +- .../staking/tests/ValidatorManagerTests.t.sol | 2 +- 7 files changed, 241 insertions(+), 25 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 201667a13..eab52363c 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -49,10 +49,10 @@ type PoSValidatorManagerSettings struct { // SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. type SubnetConversionData struct { - ConvertSubnetTxID [32]byte - BlockchainID [32]byte - ValidatorManagerAddress common.Address - InitialValidators []InitialValidator + ConvertSubnetTxID [32]byte + ValidatorManagerBlockchainID [32]byte + ValidatorManagerAddress common.Address + InitialValidators []InitialValidator } // Validator is an auto generated low-level Go binding around an user-defined struct. @@ -83,8 +83,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615daa380380615daa83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c5d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806366435abf116100bf578063ba3a4b9711610079578063ba3a4b971461030a578063bee0a03f1461031d578063c974d1b614610330578063d5f20ff614610338578063df93d8de14610358578063eb0acb8914610362575f80fd5b806366435abf1461028557806376f786211461029857806398f3e2b4146102ab5780639e1bc4ef146102be578063a3a65e48146102d1578063b771b3bc146102e4575f80fd5b8063330a0a3a11610110578063330a0a3a1461020a57806335455ded1461021d578063467ef06f146102395780635297fae61461024c57806361e2f4901461025f5780636206585614610272575f80fd5b80630118acc41461014c5780630322ed98146101615780630cdd098514610174578063151d30d1146101c55780632e2194d8146101df575b5f80fd5b61015f61015a366004614f4b565b610375565b005b61015f61016f366004614f86565b610806565b6101b2610182366004614f86565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101cd600a81565b60405160ff90911681526020016101bc565b6101f26101ed366004614f86565b6109bf565b6040516001600160401b0390911681526020016101bc565b61015f610218366004614fb1565b6109d5565b61022661271081565b60405161ffff90911681526020016101bc565b61015f610247366004614fef565b610ab4565b61015f61025a366004615008565b610b07565b61015f61026d366004615030565b610cdc565b6101b2610280366004615094565b611426565b6101f2610293366004614f86565b61143f565b61015f6102a6366004614f4b565b611453565b61015f6102b9366004615008565b611534565b6101b26102cc3660046150ad565b611761565b61015f6102df366004614fef565b61178d565b6102f26005600160991b0181565b6040516001600160a01b0390911681526020016101bc565b61015f610318366004614f86565b611945565b61015f61032b366004614f86565b611bcb565b6101cd601481565b61034b610346366004614f86565b611cdf565b6040516101bc91906150e1565b6101f26202a30081565b6101b26103703660046151a8565b611dd2565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615bb18339815191529184156103c7576103c48285611e07565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156103f9576103f96150cd565b600481111561040a5761040a6150cd565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115610491576104916150cd565b146104e35760405162461bcd60e51b815260206004820152602a60248201525f80516020615bd18339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105485760405162461bcd60e51b815260206004820152603360248201525f80516020615bd18339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016104da565b5f610552846120a3565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561059f5761059f6150cd565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61067185611cdf565b905082606001516001600160401b031681608001516001600160401b0316116106e85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016104da565b6002815160058111156106fd576106fd6150cd565b0361070f5761070f8360600151612133565b5f836060015182608001516107249190615221565b90506107308682612140565b5f6005600160991b0163ee5b48eb610749898786612188565b6040518263ffffffff1660e01b81526004016107659190615263565b6020604051808303815f875af1158015610781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a59190615295565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020615c318339815191526020526040808220815160e0810190925280545f80516020615bf183398151915293929190829060ff166005811115610853576108536150cd565b6005811115610864576108646150cd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108d3576108d36150cd565b146109385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb61095d8584606001515f612188565b6040518263ffffffff1660e01b81526004016109799190615263565b6020604051808303815f875af1158015610995573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b99190615295565b50505050565b5f6109cf64e8d4a51000836152ac565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a1e575080546001600160401b03808416911610155b15610a3c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a6784846123af565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615bb18339815191525f80610acd846123c9565b6040808201515f8481526005880160205291909120549294509092506109b9916001600160401b03909116906001600160a01b0316612741565b5f80516020615bb18339815191525f610b1f84612777565b90505f80610b308360400151612951565b50915091505f610b3f83611cdf565b9050816001600160401b031681606001516001600160401b03161015610b775760405162461bcd60e51b81526004016104da906152cb565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bbc5760405162461bcd60e51b81526004016104da9061530d565b60015f87815260068701602052604090205460ff166004811115610be257610be26150cd565b14610c4b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bf18339815191529060ff1615610d795760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dbc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610de09190615295565b836020013514610e425760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016104da565b30610e536060850160408601615356565b6001600160a01b031614610ec55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016104da565b5f610ed36060850185615371565b905011610f325760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016104da565b5f610f406060850185615371565b91505063ffffffff8110610fac5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016104da565b5f843560208601356014610fc66060890160408a01615356565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611336575f6110466060890189615371565b8363ffffffff1681811061105c5761105c6153bd565b905060200281019061106e91906153d1565b61107790615481565b8051909150806110995760405162461bcd60e51b81526004016104da90615518565b5f818152600988016020526040902054156110c65760405162461bcd60e51b81526004016104da90615559565b8160400151516030146110eb5760405162461bcd60e51b81526004016104da906155a1565b84825f01518360200151846040015160405160200161110d94939291906155ee565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161115b919061563d565b602060405180830381855afa158015611176573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111999190615295565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115611225576112256150cd565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112d891168661564e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061132f90615661565b905061102a565b50600584018190555f61134886612777565b90505f6113588260400151612b8c565b90508060028560405161136b919061563d565b602060405180830381855afa158015611386573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113a99190615295565b1461140d5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016104da565b505050600a909201805460ff1916600117905550505050565b5f6109cf6001600160401b03831664e8d4a51000615683565b5f61144982611cdf565b6080015192915050565b5f80516020615bb18339815191525f61146b85611cdf565b5f86815260058401602052604090205460a082015191925061149e91600160b01b9091046001600160401b03169061569a565b6001600160401b03164210156115125760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016104da565b8315611524576115228584611e07565b505b61152d85612cfe565b5050505050565b61153c612ff4565b5f80516020615bb18339815191525f61155484612777565b90505f806115658360400151612951565b50915091505f61157483611cdf565b9050816001600160401b031681606001516001600160401b031610156115ac5760405162461bcd60e51b81526004016104da906152cb565b5f8681526006860160205260409020600301546001600160401b03808416911611156115ea5760405162461bcd60e51b81526004016104da9061530d565b60035f87815260068701602052604090205460ff166004811115611610576116106150cd565b146116645760405162461bcd60e51b815260206004820152603160248201525f80516020615bd18339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016104da565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261170991612741565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061175d60015f80516020615c1183398151915255565b5050565b5f61176a612ff4565b61177583338461303e565b90506109cf60015f80516020615c1183398151915255565b5f80516020615bf18339815191525f6117a583612777565b90505f806117b683604001516134b7565b91509150806118185760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016104da565b5f82815260078501602052604081208054611832906156ba565b9050118015611864575060015f83815260088601602052604090205460ff166005811115611862576118626150cd565b145b6118805760405162461bcd60e51b81526004016104da906156f2565b5f828152600785016020526040812061189891614edc565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bb183398151915293929190829060ff1660048111156119a6576119a66150cd565b60048111156119b7576119b76150cd565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a3e57611a3e6150cd565b1480611a5c5750600381516004811115611a5a57611a5a6150cd565b145b611ab05760405162461bcd60e51b815260206004820152603260248201525f80516020615bd1833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016104da565b5f611abe8260400151611cdf565b905080606001516001600160401b03165f03611b425760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016104da565b6005600160991b016001600160a01b031663ee5b48eb611b6f846040015184606001518560800151612188565b6040518263ffffffff1660e01b8152600401611b8b9190615263565b6020604051808303815f875af1158015611ba7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152d9190615295565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bf1833981519152929190611c13906156ba565b9050118015611c45575060015f83815260088301602052604090205460ff166005811115611c4357611c436150cd565b145b611c615760405162461bcd60e51b81526004016104da906156f2565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c9a9190600401615739565b6020604051808303815f875af1158015611cb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cda9190615295565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020615c3183398151915290528390208351918201909352825491925f80516020615bf183398151915292829060ff166005811115611d5f57611d5f6150cd565b6005811115611d7057611d706150cd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611ddb612ff4565b611de785858585613658565b9050611dff60015f80516020615c1183398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e52573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e7991908101906157ce565b9150915080611edc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016104da565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f439190615295565b825114611fa75760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016104da565b60208201516001600160a01b03161561201d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016104da565b5f8061202c84604001516138cd565b915091508187146120995760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016104da565b9695505050505050565b5f8181525f80516020615c318339815191526020526040812060020180545f80516020615bf183398151915291600160401b9091046001600160401b03169060086120ed836158a0565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b61213d815f613aa5565b50565b5f9182525f80516020615c31833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612201576121c18160016158bb565b6121cc906008615683565b5081515f908390839081106121e3576121e36153bd565b60200101906001600160f81b03191690815f1a9053506001016121ad565b505f5b600481101561226c576122188160036158bb565b612223906008615683565b600263ffffffff16901c60f81b8282600261223e919061564e565b8151811061224e5761224e6153bd565b60200101906001600160f81b03191690815f1a905350600101612204565b505f5b60208110156122ce5761228381601f6158bb565b61228e906008615683565b86901c60f81b826122a083600661564e565b815181106122b0576122b06153bd565b60200101906001600160f81b03191690815f1a90535060010161226f565b505f5b6008811015612339576122e58160076158bb565b6122f0906008615683565b6001600160401b038616901c60f81b8261230b83602661564e565b8151811061231b5761231b6153bd565b60200101906001600160f81b03191690815f1a9053506001016122d1565b505f5b60088110156123a4576123508160076158bb565b61235b906008615683565b6001600160401b038516901c60f81b8261237683602e61564e565b81518110612386576123866153bd565b60200101906001600160f81b03191690815f1a90535060010161233c565b5090505b9392505050565b6123b7613cff565b6123c082613d4a565b61175d81613dbe565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f80516020615bf18339815191525f61241885612777565b90505f8061242983604001516134b7565b91509150801561248e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016104da565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156124bf576124bf6150cd565b60058111156124d0576124d06150cd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612541576125416150cd565b148061255f575060018251600581111561255d5761255d6150cd565b145b6125be5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016104da565b6003825160058111156125d3576125d36150cd565b036125e0575060046125e4565b5060055b6020808301515f9081526009880190915260408120558181600581111561260d5761260d6150cd565b90816005811115612620576126206150cd565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612654576126546150cd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612708576127086150cd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab005461175d906001600160a01b03168284613e72565b60408051606080820183525f8083526020830181905292820152905f80516020615bf18339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156127ec573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261281391908101906157ce565b91509150806128735760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016104da565b82548251146128d65760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016104da565b60208201516001600160a01b0316156129495760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016104da565b509392505050565b5f805f83516036146129755760405162461bcd60e51b81526004016104da906158ce565b5f805b60028110156129c45761298c8160016158bb565b612997906008615683565b61ffff168682815181106129ad576129ad6153bd565b016020015160f81c901b9190911790600101612978565b5061ffff8116156129e75760405162461bcd60e51b81526004016104da90615917565b5f805b6004811015612a42576129fe8160036158bb565b612a09906008615683565b63ffffffff1687612a1b83600261564e565b81518110612a2b57612a2b6153bd565b016020015160f81c901b91909117906001016129ea565b5063ffffffff8116600414612a695760405162461bcd60e51b81526004016104da9061595a565b5f805b6020811015612abe57612a8081601f6158bb565b612a8b906008615683565b88612a9783600661564e565b81518110612aa757612aa76153bd565b016020015160f81c901b9190911790600101612a6c565b505f805b6008811015612b1d57612ad68160076158bb565b612ae1906008615683565b6001600160401b031689612af683602661564e565b81518110612b0657612b066153bd565b016020015160f81c901b9190911790600101612ac2565b505f805b6008811015612b7c57612b358160076158bb565b612b40906008615683565b6001600160401b03168a612b5583602e61564e565b81518110612b6557612b656153bd565b016020015160f81c901b9190911790600101612b21565b5091989097509095509350505050565b5f8151602614612bae5760405162461bcd60e51b81526004016104da906158ce565b5f805b6002811015612bfd57612bc58160016158bb565b612bd0906008615683565b61ffff16848281518110612be657612be66153bd565b016020015160f81c901b9190911790600101612bb1565b5061ffff811615612c205760405162461bcd60e51b81526004016104da90615917565b5f805b6004811015612c7b57612c378160036158bb565b612c42906008615683565b63ffffffff1685612c5483600261564e565b81518110612c6457612c646153bd565b016020015160f81c901b9190911790600101612c23565b5063ffffffff811615612ca05760405162461bcd60e51b81526004016104da9061595a565b5f805b6020811015612cf557612cb781601f6158bb565b612cc2906008615683565b86612cce83600661564e565b81518110612cde57612cde6153bd565b016020015160f81c901b9190911790600101612ca3565b50949350505050565b5f8181525f80516020615c318339815191526020526040808220815160e0810190925280545f80516020615bf183398151915293929190829060ff166005811115612d4b57612d4b6150cd565b6005811115612d5c57612d5c6150cd565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612dce57612dce6150cd565b14612e2a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016104da565b612e378160800151612133565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff19166001836005811115612e7b57612e7b6150cd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612f3084612f2a816120a3565b5f612188565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612f5f908590600401615263565b6020604051808303815f875af1158015612f7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f9f9190615295565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615c1183398151915280546001190161302557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615c1183398151915255565b5f5f80516020615bb18339815191528161305a6101ed85613ed1565b90505f61306687611cdf565b905060028151600581111561307d5761307d6150cd565b146130dc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016104da565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b031661316f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016104da565b61317882613f07565b5f828260800151613189919061569a565b600485015460408401519192506131ab916001600160401b03909116906159a1565b6001600160401b0316816001600160401b0316111561322a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016104da565b6132348882612140565b5f61323e896120a3565b90505f898260405160200161326a92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6132a48d8688612188565b6040518263ffffffff1660e01b81526004016132c09190615263565b6020604051808303815f875af11580156132dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133009190615295565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff19166001836004811115613388576133886150cd565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146134da5760405162461bcd60e51b81526004016104da906158ce565b5f805b6002811015613529576134f18160016158bb565b6134fc906008615683565b61ffff16858281518110613512576135126153bd565b016020015160f81c901b91909117906001016134dd565b5061ffff81161561354c5760405162461bcd60e51b81526004016104da90615917565b5f805b60048110156135a7576135638160036158bb565b61356e906008615683565b63ffffffff168661358083600261564e565b81518110613590576135906153bd565b016020015160f81c901b919091179060010161354f565b5063ffffffff81166003146135ce5760405162461bcd60e51b81526004016104da9061595a565b5f805b6020811015613623576135e581601f6158bb565b6135f0906008615683565b876135fc83600661564e565b8151811061360c5761360c6153bd565b016020015160f81c901b91909117906001016135d1565b505f86602681518110613638576136386153bd565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bb18339815191529061ffff8616108015906136a4575061271061ffff861611155b6136c05760405162461bcd60e51b81526004016104da906159cc565b60028101546001600160401b0390811690851610156137395760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016104da565b805483101561379c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016104da565b80600101548311156138035760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016104da565b5f61380d84613ed1565b90505f613819826109bf565b90505f6138268983613f12565b9050604051806060016040528061383a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146138f05760405162461bcd60e51b81526004016104da906158ce565b5f805b600281101561393f576139078160016158bb565b613912906008615683565b61ffff16858281518110613928576139286153bd565b016020015160f81c901b91909117906001016138f3565b5061ffff8116156139625760405162461bcd60e51b81526004016104da90615917565b5f805b60048110156139bd576139798160036158bb565b613984906008615683565b63ffffffff168661399683600261564e565b815181106139a6576139a66153bd565b016020015160f81c901b9190911790600101613965565b5063ffffffff81166005146139e45760405162461bcd60e51b81526004016104da9061595a565b5f805b6020811015613a39576139fb81601f6158bb565b613a06906008615683565b87613a1283600661564e565b81518110613a2257613a226153bd565b016020015160f81c901b91909117906001016139e7565b505f805b6008811015613a9857613a518160076158bb565b613a5c906008615683565b6001600160401b031688613a7183602661564e565b81518110613a8157613a816153bd565b016020015160f81c901b9190911790600101613a3d565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615bf1833981519152914291901580613b8b575060028301548151613b87916001600160401b03169061564e565b8210155b15613bb1576001600160401b038516606082015281815260408101516020820152613bd0565b8481606001818151613bc3919061569a565b6001600160401b03169052505b6060810151613be09060646159a1565b602082015160028501546001600160401b039290921691613c0b9190600160401b900460ff16615683565b1015613c6f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016104da565b8315613c9857846001600160401b031681604001818151613c90919061564e565b905250613cb7565b846001600160401b031681604001818151613cb391906158bb565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d4857604051631afcd79f60e31b815260040160405180910390fd5b565b613d52613cff565b613d5b816143f6565b613d6361440f565b61213d608082013560a0830135613d8060e0850160c08601615094565b613d91610100860160e08701615a17565b61ffff16613da761012087016101008801615a30565b613db961014088016101208901615356565b61441f565b613dc6613cff565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613e525760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b60648201526084016104da565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611cda91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614663565b5f6109cf827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906146c4565b61213d816001613aa5565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613f9d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016104da565b5f80516020615bf183398151915242613fbc6040860160208701615094565b6001600160401b03161161402e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016104da565b61403e6040850160208601615094565b6001600160401b03166140546202a3004261564e565b116140c75760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016104da565b83356140e55760405162461bcd60e51b81526004016104da90615518565b83355f908152600982016020526040902054156141145760405162461bcd60e51b81526004016104da90615559565b6141216040850185615a50565b90506030146141425760405162461bcd60e51b81526004016104da906155a1565b61414b83613f07565b5f806141e56040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906141909190615094565b6001600160401b031681526020016141ab60408a018a615a50565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614826565b5f828152600786016020526040902091935091506142038282615ad6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614230908590600401615263565b6020604051808303815f875af115801561424c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142709190615295565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156142e8576142e86150cd565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916143c8918e01908e01615094565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6143fe613cff565b614406614bd5565b61213d81614bdd565b614417613cff565b613d48614d7f565b614427613cff565b5f80516020615bb1833981519152836144935760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016104da565b6127108411156144b55760405162461bcd60e51b81526004016104da906159cc565b8587111561451d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016104da565b5f8360ff161161458a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016104da565b600a60ff841611156145fc5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016104da565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6146776001600160a01b03841683614d87565b905080515f1415801561469b5750808060200190518101906146999190615b95565b155b15611cda57604051635274afe760e01b81526001600160a01b03841660048201526024016104da565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561470a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061472e9190615295565b90506147456001600160a01b038516333086614d94565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614789573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147ad9190615295565b90508181116148135760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104da565b61481d82826158bb565b95945050505050565b5f60608260800151516030146148905760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016104da565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614907576148c78160016158bb565b6148d2906008615683565b5081515f908390839081106148e9576148e96153bd565b60200101906001600160f81b03191690815f1a9053506001016148b3565b505f5b600481101561496f5761491e8160036158bb565b614929906008615683565b600160ff919091161c60f81b8261494183600261564e565b81518110614951576149516153bd565b60200101906001600160f81b03191690815f1a90535060010161490a565b505f5b60208110156149cc578451816020811061498e5761498e6153bd565b1a60f81b8261499e83600661564e565b815181106149ae576149ae6153bd565b60200101906001600160f81b03191690815f1a905350600101614972565b505f5b6020811015614a2c57846020015181602081106149ee576149ee6153bd565b1a60f81b826149fe83602661564e565b81518110614a0e57614a0e6153bd565b60200101906001600160f81b03191690815f1a9053506001016149cf565b505f5b6008811015614aa057614a438160076158bb565b614a4e906008615683565b60ff1685604001516001600160401b0316901c60f81b82826046614a72919061564e565b81518110614a8257614a826153bd565b60200101906001600160f81b03191690815f1a905350600101614a2f565b505f5b6030811015614b0b5784608001518181518110614ac257614ac26153bd565b01602001516001600160f81b03191682614add83604e61564e565b81518110614aed57614aed6153bd565b60200101906001600160f81b03191690815f1a905350600101614aa3565b505f5b6008811015614b7d57614b228160076158bb565b614b2d906008615683565b60608601516001600160401b0390811691161c60f81b82614b4f83607e61564e565b81518110614b5f57614b5f6153bd565b60200101906001600160f81b03191690815f1a905350600101614b0e565b50600281604051614b8e919061563d565b602060405180830381855afa158015614ba9573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bcc9190615295565b94909350915050565b613d48613cff565b614be5613cff565b80355f80516020615bf183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c316080840160608501615a30565b60ff161115614c9e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016104da565b5f614caf6080840160608501615a30565b60ff1611614d175760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016104da565b614d276080830160608401615a30565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d586060830160408401615094565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61302b613cff565b60606123a883835f614dcd565b6040516001600160a01b0384811660248301528381166044830152606482018390526109b99186918216906323b872dd90608401613e9f565b606081471015614df25760405163cd78605960e01b81523060048201526024016104da565b5f80856001600160a01b03168486604051614e0d919061563d565b5f6040518083038185875af1925050503d805f8114614e47576040519150601f19603f3d011682016040523d82523d5f602084013e614e4c565b606091505b5091509150612099868383606082614e6c57614e6782614eb3565b6123a8565b8151158015614e8357506001600160a01b0384163b155b15614eac57604051639996b31560e01b81526001600160a01b03851660048201526024016104da565b50806123a8565b805115614ec35780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ee8906156ba565b5f825580601f10614ef7575050565b601f0160209004905f5260205f209081019061213d91905b80821115614f22575f8155600101614f0f565b5090565b801515811461213d575f80fd5b803563ffffffff81168114614f46575f80fd5b919050565b5f805f60608486031215614f5d575f80fd5b833592506020840135614f6f81614f26565b9150614f7d60408501614f33565b90509250925092565b5f60208284031215614f96575f80fd5b5035919050565b6001600160a01b038116811461213d575f80fd5b5f80828403610160811215614fc4575f80fd5b61014080821215614fd3575f80fd5b8493508301359050614fe481614f9d565b809150509250929050565b5f60208284031215614fff575f80fd5b6123a882614f33565b5f8060408385031215615019575f80fd5b61502283614f33565b946020939093013593505050565b5f8060408385031215615041575f80fd5b82356001600160401b03811115615056575f80fd5b830160808186031215615067575f80fd5b915061507560208401614f33565b90509250929050565b80356001600160401b0381168114614f46575f80fd5b5f602082840312156150a4575f80fd5b6123a88261507e565b5f80604083850312156150be575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061510457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161513f60608401826001600160401b03169052565b50608083015161515a60808401826001600160401b03169052565b5060a083015161517560a08401826001600160401b03169052565b5060c083015161519060c08401826001600160401b03169052565b5092915050565b803561ffff81168114614f46575f80fd5b5f805f80608085870312156151bb575f80fd5b84356001600160401b038111156151d0575f80fd5b8501606081880312156151e1575f80fd5b93506151ef60208601615197565b92506151fd6040860161507e565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156151905761519061520d565b5f5b8381101561525b578181015183820152602001615243565b50505f910152565b602081525f8251806020840152615281816040850160208701615241565b601f01601f19169190910160400192915050565b5f602082840312156152a5575f80fd5b5051919050565b5f826152c657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615366575f80fd5b81356123a881614f9d565b5f808335601e19843603018112615386575f80fd5b8301803591506001600160401b0382111561539f575f80fd5b6020019150600581901b36038213156153b6575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126153e5575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615425576154256153ef565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615453576154536153ef565b604052919050565b5f6001600160401b03821115615473576154736153ef565b50601f01601f191660200190565b5f60608236031215615491575f80fd5b615499615403565b8235815260206154aa81850161507e565b8183015260408401356001600160401b038111156154c6575f80fd5b840136601f8201126154d6575f80fd5b80356154e96154e48261545b565b61542b565b81815236848385010111156154fc575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516155ff818460208a01615241565b80830190508581526001600160401b0360c01b8560c01b166020820152835161562f816028840160208801615241565b016028019695505050505050565b5f82516153e5818460208701615241565b808201808211156109cf576109cf61520d565b5f63ffffffff8083168181036156795761567961520d565b6001019392505050565b80820281158282048414176109cf576109cf61520d565b6001600160401b038181168382160190808211156151905761519061520d565b600181811c908216806156ce57607f821691505b6020821081036156ec57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461574b816156ba565b806020870152604060018084165f811461576c5760018114615788576157b5565b60ff19851660408a0152604084151560051b8a010195506157b5565b895f5260205f205f5b858110156157ac5781548b8201860152908301908801615791565b8a016040019650505b509398975050505050505050565b8051614f4681614f26565b5f80604083850312156157df575f80fd5b82516001600160401b03808211156157f5575f80fd5b9084019060608287031215615808575f80fd5b615810615403565b8251815260208084015161582381614f9d565b82820152604084015183811115615838575f80fd5b80850194505087601f85011261584c575f80fd5b8351925061585c6154e48461545b565b838152888285870101111561586f575f80fd5b61587e84838301848801615241565b806040840152508195506158938188016157c3565b9450505050509250929050565b5f6001600160401b038083168181036156795761567961520d565b818103818111156109cf576109cf61520d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159c4576159c461520d565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f60208284031215615a27575f80fd5b6123a882615197565b5f60208284031215615a40575f80fd5b813560ff811681146123a8575f80fd5b5f808335601e19843603018112615a65575f80fd5b8301803591506001600160401b03821115615a7e575f80fd5b6020019150368190038213156153b6575f80fd5b601f821115611cda57805f5260205f20601f840160051c81016020851015615ab75750805b601f840160051c820191505b8181101561152d575f8155600101615ac3565b81516001600160401b03811115615aef57615aef6153ef565b615b0381615afd84546156ba565b84615a92565b602080601f831160018114615b36575f8415615b1f5750858301515b5f19600386901b1c1916600185901b178555615b8d565b5f85815260208120601f198616915b82811015615b6457888601518255948401946001909101908401615b45565b5085821015615b8157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ba5575f80fd5b81516123a881614f2656fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615df4380380615df483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615ca78061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f366004614f95565b6103bf565b005b610184610194366004614fd0565b610850565b6101d76101a7366004614fd0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b610217610212366004614fd0565b610a09565b6040516001600160401b0390911681526020016101e1565b61018461023d366004614ffb565b610a1f565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c366004615039565b610afe565b61018461027f366004615052565b610b51565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af36600461507a565b610d26565b6101d76102c23660046150de565b611470565b6102176102d5366004614fd0565b611489565b6101846102e8366004614f95565b61149d565b6101f2603081565b610184610303366004615052565b61157e565b6101d76103163660046150f7565b6117ab565b610184610329366004615039565b6117d7565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b610184610362366004614fd0565b61198f565b610184610375366004614fd0565b611c15565b6101f2601481565b610395610390366004614fd0565b611d29565b6040516101e1919061512b565b6102176202a30081565b6101d76103ba3660046151f2565b611e1c565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615bfb8339815191529184156104115761040e8285611e51565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561044357610443615117565b600481111561045457610454615117565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104db576104db615117565b1461052d5760405162461bcd60e51b815260206004820152602a60248201525f80516020615c1b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105925760405162461bcd60e51b815260206004820152603360248201525f80516020615c1b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610524565b5f61059c846120ed565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105e9576105e9615117565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106bb85611d29565b905082606001516001600160401b031681608001516001600160401b0316116107325760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610524565b60028151600581111561074757610747615117565b0361075957610759836060015161217d565b5f8360600151826080015161076e919061526b565b905061077a868261218a565b5f6005600160991b0163ee5b48eb6107938987866121d2565b6040518263ffffffff1660e01b81526004016107af91906152ad565b6020604051808303815f875af11580156107cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ef91906152df565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020615c7b8339815191526020526040808220815160e0810190925280545f80516020615c3b83398151915293929190829060ff16600581111561089d5761089d615117565b60058111156108ae576108ae615117565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561091d5761091d615117565b146109825760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610524565b6005600160991b016001600160a01b031663ee5b48eb6109a78584606001515f6121d2565b6040518263ffffffff1660e01b81526004016109c391906152ad565b6020604051808303815f875af11580156109df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0391906152df565b50505050565b5f610a1964e8d4a51000836152f6565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a68575080546001600160401b03808416911610155b15610a865760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ab184846123f9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615bfb8339815191525f80610b1784612413565b6040808201515f848152600588016020529190912054929450909250610a03916001600160401b03909116906001600160a01b031661278b565b5f80516020615bfb8339815191525f610b69846127c1565b90505f80610b7a836040015161299b565b50915091505f610b8983611d29565b9050816001600160401b031681606001516001600160401b03161015610bc15760405162461bcd60e51b815260040161052490615315565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c065760405162461bcd60e51b815260040161052490615357565b60015f87815260068701602052604090205460ff166004811115610c2c57610c2c615117565b14610c955760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610524565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615c3b8339815191529060ff1615610dc35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610524565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2a91906152df565b836020013514610e8c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610524565b30610e9d60608501604086016153a0565b6001600160a01b031614610f0f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610524565b5f610f1d60608501856153bb565b905011610f7c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b6064820152608401610524565b5f610f8a60608501856153bb565b91505063ffffffff8110610ff65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b6064820152608401610524565b5f8435602086013560146110106060890160408a016153a0565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611380575f61109060608901896153bb565b8363ffffffff168181106110a6576110a6615407565b90506020028101906110b8919061541b565b6110c1906154cb565b8051909150806110e35760405162461bcd60e51b815260040161052490615562565b5f818152600988016020526040902054156111105760405162461bcd60e51b8152600401610524906155a3565b6040820151516030146111355760405162461bcd60e51b8152600401610524906155eb565b84825f0151836020015184604001516040516020016111579493929190615638565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916111a59190615687565b602060405180830381855afa1580156111c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111e391906152df565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561126f5761126f615117565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611322911686615698565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611379906156ab565b9050611074565b50600584018190555f611392866127c1565b90505f6113a28260400151612bd6565b9050806002856040516113b59190615687565b602060405180830381855afa1580156113d0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113f391906152df565b146114575760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610524565b505050600a909201805460ff1916600117905550505050565b5f610a196001600160401b03831664e8d4a510006156cd565b5f61149382611d29565b6080015192915050565b5f80516020615bfb8339815191525f6114b585611d29565b5f86815260058401602052604090205460a08201519192506114e891600160b01b9091046001600160401b0316906156e4565b6001600160401b031642101561155c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610524565b831561156e5761156c8584611e51565b505b61157785612d48565b5050505050565b61158661303e565b5f80516020615bfb8339815191525f61159e846127c1565b90505f806115af836040015161299b565b50915091505f6115be83611d29565b9050816001600160401b031681606001516001600160401b031610156115f65760405162461bcd60e51b815260040161052490615315565b5f8681526006860160205260409020600301546001600160401b03808416911611156116345760405162461bcd60e51b815260040161052490615357565b60035f87815260068701602052604090205460ff16600481111561165a5761165a615117565b146116ae5760405162461bcd60e51b815260206004820152603160248201525f80516020615c1b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610524565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526117539161278b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506117a760015f80516020615c5b83398151915255565b5050565b5f6117b461303e565b6117bf833384613088565b9050610a1960015f80516020615c5b83398151915255565b5f80516020615c3b8339815191525f6117ef836127c1565b90505f806118008360400151613501565b91509150806118625760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610524565b5f8281526007850160205260408120805461187c90615704565b90501180156118ae575060015f83815260088601602052604090205460ff1660058111156118ac576118ac615117565b145b6118ca5760405162461bcd60e51b81526004016105249061573c565b5f82815260078501602052604081206118e291614f26565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bfb83398151915293929190829060ff1660048111156119f0576119f0615117565b6004811115611a0157611a01615117565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a8857611a88615117565b1480611aa65750600381516004811115611aa457611aa4615117565b145b611afa5760405162461bcd60e51b815260206004820152603260248201525f80516020615c1b833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610524565b5f611b088260400151611d29565b905080606001516001600160401b03165f03611b8c5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610524565b6005600160991b016001600160a01b031663ee5b48eb611bb98460400151846060015185608001516121d2565b6040518263ffffffff1660e01b8152600401611bd591906152ad565b6020604051808303815f875af1158015611bf1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157791906152df565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615c3b833981519152929190611c5d90615704565b9050118015611c8f575060015f83815260088301602052604090205460ff166005811115611c8d57611c8d615117565b145b611cab5760405162461bcd60e51b81526004016105249061573c565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ce49190600401615783565b6020604051808303815f875af1158015611d00573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d2491906152df565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020615c7b83398151915290528390208351918201909352825491925f80516020615c3b83398151915292829060ff166005811115611da957611da9615117565b6005811115611dba57611dba615117565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611e2561303e565b611e31858585856136a2565b9050611e4960015f80516020615c5b83398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e9c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ec39190810190615818565b9150915080611f265760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610524565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8d91906152df565b825114611ff15760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610524565b60208201516001600160a01b0316156120675760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610524565b5f806120768460400151613917565b915091508187146120e35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610524565b9695505050505050565b5f8181525f80516020615c7b8339815191526020526040812060020180545f80516020615c3b83398151915291600160401b9091046001600160401b0316906008612137836158ea565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b612187815f613aef565b50565b5f9182525f80516020615c7b833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561224b5761220b816001615905565b6122169060086156cd565b5081515f9083908390811061222d5761222d615407565b60200101906001600160f81b03191690815f1a9053506001016121f7565b505f5b60048110156122b657612262816003615905565b61226d9060086156cd565b600263ffffffff16901c60f81b828260026122889190615698565b8151811061229857612298615407565b60200101906001600160f81b03191690815f1a90535060010161224e565b505f5b6020811015612318576122cd81601f615905565b6122d89060086156cd565b86901c60f81b826122ea836006615698565b815181106122fa576122fa615407565b60200101906001600160f81b03191690815f1a9053506001016122b9565b505f5b60088110156123835761232f816007615905565b61233a9060086156cd565b6001600160401b038616901c60f81b82612355836026615698565b8151811061236557612365615407565b60200101906001600160f81b03191690815f1a90535060010161231b565b505f5b60088110156123ee5761239a816007615905565b6123a59060086156cd565b6001600160401b038516901c60f81b826123c083602e615698565b815181106123d0576123d0615407565b60200101906001600160f81b03191690815f1a905350600101612386565b5090505b9392505050565b612401613d49565b61240a82613d94565b6117a781613e08565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f80516020615c3b8339815191525f612462856127c1565b90505f806124738360400151613501565b9150915080156124d85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610524565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561250957612509615117565b600581111561251a5761251a615117565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561258b5761258b615117565b14806125a957506001825160058111156125a7576125a7615117565b145b6126085760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610524565b60038251600581111561261d5761261d615117565b0361262a5750600461262e565b5060055b6020808301515f9081526009880190915260408120558181600581111561265757612657615117565b9081600581111561266a5761266a615117565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561269e5761269e615117565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561275257612752615117565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546117a7906001600160a01b03168284613ebc565b60408051606080820183525f8083526020830181905292820152905f80516020615c3b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612836573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261285d9190810190615818565b91509150806128bd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610524565b82548251146129205760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610524565b60208201516001600160a01b0316156129935760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610524565b509392505050565b5f805f83516036146129bf5760405162461bcd60e51b815260040161052490615918565b5f805b6002811015612a0e576129d6816001615905565b6129e19060086156cd565b61ffff168682815181106129f7576129f7615407565b016020015160f81c901b91909117906001016129c2565b5061ffff811615612a315760405162461bcd60e51b815260040161052490615961565b5f805b6004811015612a8c57612a48816003615905565b612a539060086156cd565b63ffffffff1687612a65836002615698565b81518110612a7557612a75615407565b016020015160f81c901b9190911790600101612a34565b5063ffffffff8116600414612ab35760405162461bcd60e51b8152600401610524906159a4565b5f805b6020811015612b0857612aca81601f615905565b612ad59060086156cd565b88612ae1836006615698565b81518110612af157612af1615407565b016020015160f81c901b9190911790600101612ab6565b505f805b6008811015612b6757612b20816007615905565b612b2b9060086156cd565b6001600160401b031689612b40836026615698565b81518110612b5057612b50615407565b016020015160f81c901b9190911790600101612b0c565b505f805b6008811015612bc657612b7f816007615905565b612b8a9060086156cd565b6001600160401b03168a612b9f83602e615698565b81518110612baf57612baf615407565b016020015160f81c901b9190911790600101612b6b565b5091989097509095509350505050565b5f8151602614612bf85760405162461bcd60e51b815260040161052490615918565b5f805b6002811015612c4757612c0f816001615905565b612c1a9060086156cd565b61ffff16848281518110612c3057612c30615407565b016020015160f81c901b9190911790600101612bfb565b5061ffff811615612c6a5760405162461bcd60e51b815260040161052490615961565b5f805b6004811015612cc557612c81816003615905565b612c8c9060086156cd565b63ffffffff1685612c9e836002615698565b81518110612cae57612cae615407565b016020015160f81c901b9190911790600101612c6d565b5063ffffffff811615612cea5760405162461bcd60e51b8152600401610524906159a4565b5f805b6020811015612d3f57612d0181601f615905565b612d0c9060086156cd565b86612d18836006615698565b81518110612d2857612d28615407565b016020015160f81c901b9190911790600101612ced565b50949350505050565b5f8181525f80516020615c7b8339815191526020526040808220815160e0810190925280545f80516020615c3b83398151915293929190829060ff166005811115612d9557612d95615117565b6005811115612da657612da6615117565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612e1857612e18615117565b14612e745760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610524565b612e81816080015161217d565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff19166001836005811115612ec557612ec5615117565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612f7a84612f74816120ed565b5f6121d2565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612fa99085906004016152ad565b6020604051808303815f875af1158015612fc5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fe991906152df565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615c5b83398151915280546001190161306f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615c5b83398151915255565b5f5f80516020615bfb833981519152816130a461021285613f1b565b90505f6130b087611d29565b90506002815160058111156130c7576130c7615117565b146131265760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610524565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166131b95760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610524565b6131c282613f51565b5f8282608001516131d391906156e4565b600485015460408401519192506131f5916001600160401b03909116906159eb565b6001600160401b0316816001600160401b031611156132745760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610524565b61327e888261218a565b5f613288896120ed565b90505f89826040516020016132b492919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6132ee8d86886121d2565b6040518263ffffffff1660e01b815260040161330a91906152ad565b6020604051808303815f875af1158015613326573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334a91906152df565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156133d2576133d2615117565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146135245760405162461bcd60e51b815260040161052490615918565b5f805b60028110156135735761353b816001615905565b6135469060086156cd565b61ffff1685828151811061355c5761355c615407565b016020015160f81c901b9190911790600101613527565b5061ffff8116156135965760405162461bcd60e51b815260040161052490615961565b5f805b60048110156135f1576135ad816003615905565b6135b89060086156cd565b63ffffffff16866135ca836002615698565b815181106135da576135da615407565b016020015160f81c901b9190911790600101613599565b5063ffffffff81166003146136185760405162461bcd60e51b8152600401610524906159a4565b5f805b602081101561366d5761362f81601f615905565b61363a9060086156cd565b87613646836006615698565b8151811061365657613656615407565b016020015160f81c901b919091179060010161361b565b505f8660268151811061368257613682615407565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bfb8339815191529061ffff8616108015906136ee575061271061ffff861611155b61370a5760405162461bcd60e51b815260040161052490615a16565b60028101546001600160401b0390811690851610156137835760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610524565b80548310156137e65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610524565b806001015483111561384d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610524565b5f61385784613f1b565b90505f61386382610a09565b90505f6138708983613f5c565b905060405180606001604052806138843390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e1461393a5760405162461bcd60e51b815260040161052490615918565b5f805b600281101561398957613951816001615905565b61395c9060086156cd565b61ffff1685828151811061397257613972615407565b016020015160f81c901b919091179060010161393d565b5061ffff8116156139ac5760405162461bcd60e51b815260040161052490615961565b5f805b6004811015613a07576139c3816003615905565b6139ce9060086156cd565b63ffffffff16866139e0836002615698565b815181106139f0576139f0615407565b016020015160f81c901b91909117906001016139af565b5063ffffffff8116600514613a2e5760405162461bcd60e51b8152600401610524906159a4565b5f805b6020811015613a8357613a4581601f615905565b613a509060086156cd565b87613a5c836006615698565b81518110613a6c57613a6c615407565b016020015160f81c901b9190911790600101613a31565b505f805b6008811015613ae257613a9b816007615905565b613aa69060086156cd565b6001600160401b031688613abb836026615698565b81518110613acb57613acb615407565b016020015160f81c901b9190911790600101613a87565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615c3b833981519152914291901580613bd5575060028301548151613bd1916001600160401b031690615698565b8210155b15613bfb576001600160401b038516606082015281815260408101516020820152613c1a565b8481606001818151613c0d91906156e4565b6001600160401b03169052505b6060810151613c2a9060646159eb565b602082015160028501546001600160401b039290921691613c559190600160401b900460ff166156cd565b1015613cb95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610524565b8315613ce257846001600160401b031681604001818151613cda9190615698565b905250613d01565b846001600160401b031681604001818151613cfd9190615905565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d9257604051631afcd79f60e31b815260040160405180910390fd5b565b613d9c613d49565b613da581614440565b613dad614459565b612187608082013560a0830135613dca60e0850160c086016150de565b613ddb610100860160e08701615a61565b61ffff16613df161012087016101008801615a7a565b613e03610140880161012089016153a0565b614469565b613e10613d49565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613e9c5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610524565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611d2491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146ad565b5f610a19827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061470e565b612187816001613aef565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613fe75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610524565b5f80516020615c3b8339815191524261400660408601602087016150de565b6001600160401b0316116140785760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610524565b61408860408501602086016150de565b6001600160401b031661409e6202a30042615698565b116141115760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610524565b833561412f5760405162461bcd60e51b815260040161052490615562565b83355f9081526009820160205260409020541561415e5760405162461bcd60e51b8152600401610524906155a3565b603061416d6040860186615a9a565b90501461418c5760405162461bcd60e51b8152600401610524906155eb565b61419583613f51565b5f8061422f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906141da91906150de565b6001600160401b031681526020016141f560408a018a615a9a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614870565b5f8281526007860160205260409020919350915061424d8282615b20565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061427a9085906004016152ad565b6020604051808303815f875af1158015614296573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142ba91906152df565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561433257614332615117565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614412918e01908e016150de565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614448613d49565b614450614c1f565b61218781614c27565b614461613d49565b613d92614dc9565b614471613d49565b5f80516020615bfb833981519152836144dd5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610524565b6127108411156144ff5760405162461bcd60e51b815260040161052490615a16565b858711156145675760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610524565b5f8360ff16116145d45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610524565b600a60ff841611156146465760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610524565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6146c16001600160a01b03841683614dd1565b905080515f141580156146e55750808060200190518101906146e39190615bdf565b155b15611d2457604051635274afe760e01b81526001600160a01b0384166004820152602401610524565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614754573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061477891906152df565b905061478f6001600160a01b038516333086614dde565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156147d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147f791906152df565b905081811161485d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610524565b6148678282615905565b95945050505050565b5f60608260800151516030146148da5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610524565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561495157614911816001615905565b61491c9060086156cd565b5081515f9083908390811061493357614933615407565b60200101906001600160f81b03191690815f1a9053506001016148fd565b505f5b60048110156149b957614968816003615905565b6149739060086156cd565b600160ff919091161c60f81b8261498b836002615698565b8151811061499b5761499b615407565b60200101906001600160f81b03191690815f1a905350600101614954565b505f5b6020811015614a1657845181602081106149d8576149d8615407565b1a60f81b826149e8836006615698565b815181106149f8576149f8615407565b60200101906001600160f81b03191690815f1a9053506001016149bc565b505f5b6020811015614a765784602001518160208110614a3857614a38615407565b1a60f81b82614a48836026615698565b81518110614a5857614a58615407565b60200101906001600160f81b03191690815f1a905350600101614a19565b505f5b6008811015614aea57614a8d816007615905565b614a989060086156cd565b60ff1685604001516001600160401b0316901c60f81b82826046614abc9190615698565b81518110614acc57614acc615407565b60200101906001600160f81b03191690815f1a905350600101614a79565b505f5b6030811015614b555784608001518181518110614b0c57614b0c615407565b01602001516001600160f81b03191682614b2783604e615698565b81518110614b3757614b37615407565b60200101906001600160f81b03191690815f1a905350600101614aed565b505f5b6008811015614bc757614b6c816007615905565b614b779060086156cd565b60608601516001600160401b0390811691161c60f81b82614b9983607e615698565b81518110614ba957614ba9615407565b60200101906001600160f81b03191690815f1a905350600101614b58565b50600281604051614bd89190615687565b602060405180830381855afa158015614bf3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c1691906152df565b94909350915050565b613d92613d49565b614c2f613d49565b80355f80516020615c3b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c7b6080840160608501615a7a565b60ff161115614ce85760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610524565b5f614cf96080840160608501615a7a565b60ff1611614d615760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610524565b614d716080830160608401615a7a565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614da260608301604084016150de565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613075613d49565b60606123f283835f614e17565b6040516001600160a01b038481166024830152838116604483015260648201839052610a039186918216906323b872dd90608401613ee9565b606081471015614e3c5760405163cd78605960e01b8152306004820152602401610524565b5f80856001600160a01b03168486604051614e579190615687565b5f6040518083038185875af1925050503d805f8114614e91576040519150601f19603f3d011682016040523d82523d5f602084013e614e96565b606091505b50915091506120e3868383606082614eb657614eb182614efd565b6123f2565b8151158015614ecd57506001600160a01b0384163b155b15614ef657604051639996b31560e01b81526001600160a01b0385166004820152602401610524565b50806123f2565b805115614f0d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614f3290615704565b5f825580601f10614f41575050565b601f0160209004905f5260205f209081019061218791905b80821115614f6c575f8155600101614f59565b5090565b8015158114612187575f80fd5b803563ffffffff81168114614f90575f80fd5b919050565b5f805f60608486031215614fa7575f80fd5b833592506020840135614fb981614f70565b9150614fc760408501614f7d565b90509250925092565b5f60208284031215614fe0575f80fd5b5035919050565b6001600160a01b0381168114612187575f80fd5b5f8082840361016081121561500e575f80fd5b6101408082121561501d575f80fd5b849350830135905061502e81614fe7565b809150509250929050565b5f60208284031215615049575f80fd5b6123f282614f7d565b5f8060408385031215615063575f80fd5b61506c83614f7d565b946020939093013593505050565b5f806040838503121561508b575f80fd5b82356001600160401b038111156150a0575f80fd5b8301608081860312156150b1575f80fd5b91506150bf60208401614f7d565b90509250929050565b80356001600160401b0381168114614f90575f80fd5b5f602082840312156150ee575f80fd5b6123f2826150c8565b5f8060408385031215615108575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061514e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161518960608401826001600160401b03169052565b5060808301516151a460808401826001600160401b03169052565b5060a08301516151bf60a08401826001600160401b03169052565b5060c08301516151da60c08401826001600160401b03169052565b5092915050565b803561ffff81168114614f90575f80fd5b5f805f8060808587031215615205575f80fd5b84356001600160401b0381111561521a575f80fd5b85016060818803121561522b575f80fd5b9350615239602086016151e1565b9250615247604086016150c8565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156151da576151da615257565b5f5b838110156152a557818101518382015260200161528d565b50505f910152565b602081525f82518060208401526152cb81604085016020870161528b565b601f01601f19169190910160400192915050565b5f602082840312156152ef575f80fd5b5051919050565b5f8261531057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156153b0575f80fd5b81356123f281614fe7565b5f808335601e198436030181126153d0575f80fd5b8301803591506001600160401b038211156153e9575f80fd5b6020019150600581901b3603821315615400575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261542f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561546f5761546f615439565b60405290565b604051601f8201601f191681016001600160401b038111828210171561549d5761549d615439565b604052919050565b5f6001600160401b038211156154bd576154bd615439565b50601f01601f191660200190565b5f606082360312156154db575f80fd5b6154e361544d565b8235815260206154f48185016150c8565b8183015260408401356001600160401b03811115615510575f80fd5b840136601f820112615520575f80fd5b803561553361552e826154a5565b615475565b8181523684838501011115615546575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615649818460208a0161528b565b80830190508581526001600160401b0360c01b8560c01b166020820152835161567981602884016020880161528b565b016028019695505050505050565b5f825161542f81846020870161528b565b80820180821115610a1957610a19615257565b5f63ffffffff8083168181036156c3576156c3615257565b6001019392505050565b8082028115828204841417610a1957610a19615257565b6001600160401b038181168382160190808211156151da576151da615257565b600181811c9082168061571857607f821691505b60208210810361573657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461579581615704565b806020870152604060018084165f81146157b657600181146157d2576157ff565b60ff19851660408a0152604084151560051b8a010195506157ff565b895f5260205f205f5b858110156157f65781548b82018601529083019088016157db565b8a016040019650505b509398975050505050505050565b8051614f9081614f70565b5f8060408385031215615829575f80fd5b82516001600160401b038082111561583f575f80fd5b9084019060608287031215615852575f80fd5b61585a61544d565b8251815260208084015161586d81614fe7565b82820152604084015183811115615882575f80fd5b80850194505087601f850112615896575f80fd5b835192506158a661552e846154a5565b83815288828587010111156158b9575f80fd5b6158c88483830184880161528b565b806040840152508195506158dd81880161580d565b9450505050509250929050565b5f6001600160401b038083168181036156c3576156c3615257565b81810381811115610a1957610a19615257565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0e57615a0e615257565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f60208284031215615a71575f80fd5b6123f2826151e1565b5f60208284031215615a8a575f80fd5b813560ff811681146123f2575f80fd5b5f808335601e19843603018112615aaf575f80fd5b8301803591506001600160401b03821115615ac8575f80fd5b602001915036819003821315615400575f80fd5b601f821115611d2457805f5260205f20601f840160051c81016020851015615b015750805b601f840160051c820191505b81811015611577575f8155600101615b0d565b81516001600160401b03811115615b3957615b39615439565b615b4d81615b478454615704565b84615adc565b602080601f831160018114615b80575f8415615b695750858301515b5f19600386901b1c1916600185901b178555615bd7565b5f85815260208120601f198616915b82811015615bae57888601518255948401946001909101908401615b8f565b5085821015615bcb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615bef575f80fd5b81516123f281614f7056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -254,6 +254,68 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorRaw) Transact return _ERC20TokenStakingManager.Contract.contract.Transact(opts, method, params...) } +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) ADDRESSLENGTH(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "ADDRESS_LENGTH") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ADDRESSLENGTH() (uint32, error) { + return _ERC20TokenStakingManager.Contract.ADDRESSLENGTH(&_ERC20TokenStakingManager.CallOpts) +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) ADDRESSLENGTH() (uint32, error) { + return _ERC20TokenStakingManager.Contract.ADDRESSLENGTH(&_ERC20TokenStakingManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) BLSPUBLICKEYLENGTH(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "BLS_PUBLIC_KEY_LENGTH") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _ERC20TokenStakingManager.Contract.BLSPUBLICKEYLENGTH(&_ERC20TokenStakingManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _ERC20TokenStakingManager.Contract.BLSPUBLICKEYLENGTH(&_ERC20TokenStakingManager.CallOpts) +} + // MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. // // Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 5bf1c011d..98d4512e4 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -49,10 +49,10 @@ type PoSValidatorManagerSettings struct { // SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. type SubnetConversionData struct { - ConvertSubnetTxID [32]byte - BlockchainID [32]byte - ValidatorManagerAddress common.Address - InitialValidators []InitialValidator + ConvertSubnetTxID [32]byte + ValidatorManagerBlockchainID [32]byte + ValidatorManagerAddress common.Address + InitialValidators []InitialValidator } // Validator is an auto generated low-level Go binding around an user-defined struct. @@ -83,8 +83,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615a0b380380615a0b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6158be8061014d5f395ff3fe60806040526004361061013c575f3560e01c806362065856116100b3578063ba3a4b971161006d578063ba3a4b97146103be578063bee0a03f146103dd578063c599e24f146103fc578063c974d1b61461040f578063d5f20ff614610423578063df93d8de1461044f575f80fd5b806362065856146102f157806366435abf1461031057806376f786211461032f57806398f3e2b41461034e578063a3a65e481461036d578063b771b3bc1461038c575f80fd5b80632e2194d8116101045780632e2194d81461022257806335455ded1461025957806340034a9314610281578063467ef06f146102945780635297fae6146102b357806361e2f490146102d2575f80fd5b80630118acc4146101405780630322ed98146101615780630cdd098514610180578063151d30d1146101dd5780631f7a9d8f14610203575b5f80fd5b34801561014b575f80fd5b5061015f61015a366004614c25565b610465565b005b34801561016c575f80fd5b5061015f61017b366004614c60565b6108f6565b34801561018b575f80fd5b506101ca61019a366004614c60565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b3480156101e8575f80fd5b506101f1600a81565b60405160ff90911681526020016101d4565b34801561020e575f80fd5b5061015f61021d366004614c77565b610aaf565b34801561022d575f80fd5b5061024161023c366004614c60565b610b8c565b6040516001600160401b0390911681526020016101d4565b348015610264575f80fd5b5061026e61271081565b60405161ffff90911681526020016101d4565b6101ca61028f366004614cb5565b610ba2565b34801561029f575f80fd5b5061015f6102ae366004614d09565b610bd6565b3480156102be575f80fd5b5061015f6102cd366004614d22565b610c29565b3480156102dd575f80fd5b5061015f6102ec366004614d4a565b610dfe565b3480156102fc575f80fd5b506101ca61030b366004614d98565b611548565b34801561031b575f80fd5b5061024161032a366004614c60565b611561565b34801561033a575f80fd5b5061015f610349366004614c25565b611575565b348015610359575f80fd5b5061015f610368366004614d22565b611656565b348015610378575f80fd5b5061015f610387366004614d09565b611883565b348015610397575f80fd5b506103a66005600160991b0181565b6040516001600160a01b0390911681526020016101d4565b3480156103c9575f80fd5b5061015f6103d8366004614c60565b611a3b565b3480156103e8575f80fd5b5061015f6103f7366004614c60565b611cc1565b6101ca61040a366004614c60565b611dd5565b34801561041a575f80fd5b506101f1601481565b34801561042e575f80fd5b5061044261043d366004614c60565b611e06565b6040516101d49190614dc5565b34801561045a575f80fd5b506102416202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206158128339815191529184156104b7576104b48285611ef9565b90505b5f868152600684016020526040808220815161010081019092528054829060ff1660048111156104e9576104e9614db1565b60048111156104fa576104fa614db1565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561058157610581614db1565b146105d35760405162461bcd60e51b815260206004820152602a60248201525f805160206158328339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146106385760405162461bcd60e51b815260206004820152603360248201525f805160206158328339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016105ca565b5f61064284612195565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff1916600183600481111561068f5761068f614db1565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f61076185611e06565b905082606001516001600160401b031681608001516001600160401b0316116107d85760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b60648201526084016105ca565b6002815160058111156107ed576107ed614db1565b036107ff576107ff8360600151612225565b5f836060015182608001516108149190614e8f565b90506108208682612232565b5f6005600160991b0163ee5b48eb61083989878661227a565b6040518263ffffffff1660e01b81526004016108559190614ed1565b6020604051808303815f875af1158015610871573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108959190614f03565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206158928339815191526020526040808220815160e0810190925280545f8051602061585283398151915293929190829060ff16600581111561094357610943614db1565b600581111561095457610954614db1565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109c3576109c3614db1565b14610a285760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb610a4d8584606001515f61227a565b6040518263ffffffff1660e01b8152600401610a699190614ed1565b6020604051808303815f875af1158015610a85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aa99190614f03565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610af8575080546001600160401b03808416911610155b15610b165760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b408361249f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b9c64e8d4a5100083614f1a565b92915050565b5f610bab6124b0565b610bb7848484346124e7565b9050610bcf60015f8051602061587283398151915255565b9392505050565b5f805160206158128339815191525f80610bef84612764565b6040808201515f848152600588016020529190912054929450909250610aa9916001600160401b03909116906001600160a01b0316612adc565b5f805160206158128339815191525f610c4184612aef565b90505f80610c528360400151612cc9565b50915091505f610c6183611e06565b9050816001600160401b031681606001516001600160401b03161015610c995760405162461bcd60e51b81526004016105ca90614f39565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610cde5760405162461bcd60e51b81526004016105ca90614f7b565b60015f87815260068701602052604090205460ff166004811115610d0457610d04614db1565b14610d6d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206158528339815191529060ff1615610e9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ede573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f029190614f03565b836020013514610f645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016105ca565b30610f756060850160408601614fd8565b6001600160a01b031614610fe75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016105ca565b5f610ff56060850185614ff3565b9050116110545760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016105ca565b5f6110626060850185614ff3565b91505063ffffffff81106110ce5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016105ca565b5f8435602086013560146110e86060890160408a01614fd8565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611458575f6111686060890189614ff3565b8363ffffffff1681811061117e5761117e61503f565b90506020028101906111909190615053565b61119990615103565b8051909150806111bb5760405162461bcd60e51b81526004016105ca9061519a565b5f818152600988016020526040902054156111e85760405162461bcd60e51b81526004016105ca906151db565b81604001515160301461120d5760405162461bcd60e51b81526004016105ca90615223565b84825f01518360200151846040015160405160200161122f9493929190615270565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161127d91906152bf565b602060405180830381855afa158015611298573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112bb9190614f03565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561134757611347614db1565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113fa9116866152d0565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611451906152e3565b905061114c565b50600584018190555f61146a86612aef565b90505f61147a8260400151612f04565b90508060028560405161148d91906152bf565b602060405180830381855afa1580156114a8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114cb9190614f03565b1461152f5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016105ca565b505050600a909201805460ff1916600117905550505050565b5f610b9c6001600160401b03831664e8d4a51000615305565b5f61156b82611e06565b6080015192915050565b5f805160206158128339815191525f61158d85611e06565b5f86815260058401602052604090205460a08201519192506115c091600160b01b9091046001600160401b03169061531c565b6001600160401b03164210156116345760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016105ca565b8315611646576116448584611ef9565b505b61164f8561306d565b5050505050565b61165e6124b0565b5f805160206158128339815191525f61167684612aef565b90505f806116878360400151612cc9565b50915091505f61169683611e06565b9050816001600160401b031681606001516001600160401b031610156116ce5760405162461bcd60e51b81526004016105ca90614f39565b5f8681526006860160205260409020600301546001600160401b038084169116111561170c5760405162461bcd60e51b81526004016105ca90614f7b565b60035f87815260068701602052604090205460ff16600481111561173257611732614db1565b146117865760405162461bcd60e51b815260206004820152603160248201525f805160206158328339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016105ca565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261182b91612adc565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061187f60015f8051602061587283398151915255565b5050565b5f805160206158528339815191525f61189b83612aef565b90505f806118ac8360400151613363565b915091508061190e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016105ca565b5f828152600785016020526040812080546119289061533c565b905011801561195a575060015f83815260088601602052604090205460ff16600581111561195857611958614db1565b145b6119765760405162461bcd60e51b81526004016105ca9061536e565b5f828152600785016020526040812061198e91614bbb565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061581283398151915293929190829060ff166004811115611a9c57611a9c614db1565b6004811115611aad57611aad614db1565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b3457611b34614db1565b1480611b525750600381516004811115611b5057611b50614db1565b145b611ba65760405162461bcd60e51b815260206004820152603260248201525f80516020615832833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016105ca565b5f611bb48260400151611e06565b905080606001516001600160401b03165f03611c385760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016105ca565b6005600160991b016001600160a01b031663ee5b48eb611c6584604001518460600151856080015161227a565b6040518263ffffffff1660e01b8152600401611c819190614ed1565b6020604051808303815f875af1158015611c9d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061164f9190614f03565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615852833981519152929190611d099061533c565b9050118015611d3b575060015f83815260088301602052604090205460ff166005811115611d3957611d39614db1565b145b611d575760405162461bcd60e51b81526004016105ca9061536e565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d9091906004016153b5565b6020604051808303815f875af1158015611dac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd09190614f03565b505050565b5f611dde6124b0565b611de9823334613504565b9050611e0160015f8051602061587283398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061589283398151915290528390208351918201909352825491925f8051602061585283398151915292829060ff166005811115611e8657611e86614db1565b6005811115611e9757611e97614db1565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f44573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f6b919081019061544a565b9150915080611fce5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016105ca565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612011573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120359190614f03565b8251146120995760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016105ca565b60208201516001600160a01b03161561210f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016105ca565b5f8061211e846040015161397a565b9150915081871461218b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016105ca565b9695505050505050565b5f8181525f805160206158928339815191526020526040812060020180545f8051602061585283398151915291600160401b9091046001600160401b03169060086121df8361551c565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b61222f815f613b52565b50565b5f9182525f80516020615892833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156122f3576122b3816001615537565b6122be906008615305565b5081515f908390839081106122d5576122d561503f565b60200101906001600160f81b03191690815f1a90535060010161229f565b505f5b600481101561235e5761230a816003615537565b612315906008615305565b600263ffffffff16901c60f81b8282600261233091906152d0565b815181106123405761234061503f565b60200101906001600160f81b03191690815f1a9053506001016122f6565b505f5b60208110156123c05761237581601f615537565b612380906008615305565b86901c60f81b826123928360066152d0565b815181106123a2576123a261503f565b60200101906001600160f81b03191690815f1a905350600101612361565b505f5b600881101561242b576123d7816007615537565b6123e2906008615305565b6001600160401b038616901c60f81b826123fd8360266152d0565b8151811061240d5761240d61503f565b60200101906001600160f81b03191690815f1a9053506001016123c3565b505f5b600881101561249657612442816007615537565b61244d906008615305565b6001600160401b038516901c60f81b8261246883602e6152d0565b815181106124785761247861503f565b60200101906001600160f81b03191690815f1a90535060010161242e565b50949350505050565b6124a7613dac565b61222f81613df7565b5f805160206158728339815191528054600119016124e157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158128339815191529061ffff861610801590612533575061271061ffff861611155b61254f5760405162461bcd60e51b81526004016105ca9061554a565b60028101546001600160401b0390811690851610156125c85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016105ca565b805483101561262b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016105ca565b80600101548311156126925760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016105ca565b825f61269d82610b8c565b90505f6126aa8983613e6b565b905060405180606001604052806126be3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061587283398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158528339815191525f6127b385612aef565b90505f806127c48360400151613363565b9150915080156128295760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016105ca565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561285a5761285a614db1565b600581111561286b5761286b614db1565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156128dc576128dc614db1565b14806128fa57506001825160058111156128f8576128f8614db1565b145b6129595760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016105ca565b60038251600581111561296e5761296e614db1565b0361297b5750600461297f565b5060055b6020808301515f908152600988019091526040812055818160058111156129a8576129a8614db1565b908160058111156129bb576129bb614db1565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156129ef576129ef614db1565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612aa357612aa3614db1565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b61187f6001600160a01b0382168361434f565b60408051606080820183525f8083526020830181905292820152905f805160206158528339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612b64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612b8b919081019061544a565b9150915080612beb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016105ca565b8254825114612c4e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016105ca565b60208201516001600160a01b031615612cc15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016105ca565b509392505050565b5f805f8351603614612ced5760405162461bcd60e51b81526004016105ca90615595565b5f805b6002811015612d3c57612d04816001615537565b612d0f906008615305565b61ffff16868281518110612d2557612d2561503f565b016020015160f81c901b9190911790600101612cf0565b5061ffff811615612d5f5760405162461bcd60e51b81526004016105ca906155de565b5f805b6004811015612dba57612d76816003615537565b612d81906008615305565b63ffffffff1687612d938360026152d0565b81518110612da357612da361503f565b016020015160f81c901b9190911790600101612d62565b5063ffffffff8116600414612de15760405162461bcd60e51b81526004016105ca90615621565b5f805b6020811015612e3657612df881601f615537565b612e03906008615305565b88612e0f8360066152d0565b81518110612e1f57612e1f61503f565b016020015160f81c901b9190911790600101612de4565b505f805b6008811015612e9557612e4e816007615537565b612e59906008615305565b6001600160401b031689612e6e8360266152d0565b81518110612e7e57612e7e61503f565b016020015160f81c901b9190911790600101612e3a565b505f805b6008811015612ef457612ead816007615537565b612eb8906008615305565b6001600160401b03168a612ecd83602e6152d0565b81518110612edd57612edd61503f565b016020015160f81c901b9190911790600101612e99565b5091989097509095509350505050565b5f8151602614612f265760405162461bcd60e51b81526004016105ca90615595565b5f805b6002811015612f7557612f3d816001615537565b612f48906008615305565b61ffff16848281518110612f5e57612f5e61503f565b016020015160f81c901b9190911790600101612f29565b5061ffff811615612f985760405162461bcd60e51b81526004016105ca906155de565b5f805b6004811015612ff357612faf816003615537565b612fba906008615305565b63ffffffff1685612fcc8360026152d0565b81518110612fdc57612fdc61503f565b016020015160f81c901b9190911790600101612f9b565b5063ffffffff8116156130185760405162461bcd60e51b81526004016105ca90615621565b5f805b60208110156124965761302f81601f615537565b61303a906008615305565b866130468360066152d0565b815181106130565761305661503f565b016020015160f81c901b919091179060010161301b565b5f8181525f805160206158928339815191526020526040808220815160e0810190925280545f8051602061585283398151915293929190829060ff1660058111156130ba576130ba614db1565b60058111156130cb576130cb614db1565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561313d5761313d614db1565b146131995760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016105ca565b6131a68160800151612225565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156131ea576131ea614db1565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61329f8461329981612195565b5f61227a565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906132ce908590600401614ed1565b6020604051808303815f875af11580156132ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061330e9190614f03565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146133865760405162461bcd60e51b81526004016105ca90615595565b5f805b60028110156133d55761339d816001615537565b6133a8906008615305565b61ffff168582815181106133be576133be61503f565b016020015160f81c901b9190911790600101613389565b5061ffff8116156133f85760405162461bcd60e51b81526004016105ca906155de565b5f805b60048110156134535761340f816003615537565b61341a906008615305565b63ffffffff168661342c8360026152d0565b8151811061343c5761343c61503f565b016020015160f81c901b91909117906001016133fb565b5063ffffffff811660031461347a5760405162461bcd60e51b81526004016105ca90615621565b5f805b60208110156134cf5761349181601f615537565b61349c906008615305565b876134a88360066152d0565b815181106134b8576134b861503f565b016020015160f81c901b919091179060010161347d565b505f866026815181106134e4576134e461503f565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206158128339815191528161351d84610b8c565b90505f61352987611e06565b905060028151600581111561354057613540614db1565b1461359f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016105ca565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166136325760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016105ca565b61363b826143e2565b5f82826080015161364c919061531c565b6004850154604084015191925061366e916001600160401b0390911690615668565b6001600160401b0316816001600160401b031611156136ed5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016105ca565b6136f78882612232565b5f61370189612195565b90505f898260405160200161372d92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6137678d868861227a565b6040518263ffffffff1660e01b81526004016137839190614ed1565b6020604051808303815f875af115801561379f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c39190614f03565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561384b5761384b614db1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e1461399d5760405162461bcd60e51b81526004016105ca90615595565b5f805b60028110156139ec576139b4816001615537565b6139bf906008615305565b61ffff168582815181106139d5576139d561503f565b016020015160f81c901b91909117906001016139a0565b5061ffff811615613a0f5760405162461bcd60e51b81526004016105ca906155de565b5f805b6004811015613a6a57613a26816003615537565b613a31906008615305565b63ffffffff1686613a438360026152d0565b81518110613a5357613a5361503f565b016020015160f81c901b9190911790600101613a12565b5063ffffffff8116600514613a915760405162461bcd60e51b81526004016105ca90615621565b5f805b6020811015613ae657613aa881601f615537565b613ab3906008615305565b87613abf8360066152d0565b81518110613acf57613acf61503f565b016020015160f81c901b9190911790600101613a94565b505f805b6008811015613b4557613afe816007615537565b613b09906008615305565b6001600160401b031688613b1e8360266152d0565b81518110613b2e57613b2e61503f565b016020015160f81c901b9190911790600101613aea565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615852833981519152914291901580613c38575060028301548151613c34916001600160401b0316906152d0565b8210155b15613c5e576001600160401b038516606082015281815260408101516020820152613c7d565b8481606001818151613c70919061531c565b6001600160401b03169052505b6060810151613c8d906064615668565b602082015160028501546001600160401b039290921691613cb89190600160401b900460ff16615305565b1015613d1c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016105ca565b8315613d4557846001600160401b031681604001818151613d3d91906152d0565b905250613d64565b846001600160401b031681604001818151613d609190615537565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613df557604051631afcd79f60e31b815260040160405180910390fd5b565b613dff613dac565b613e08816143ed565b613e10614406565b61222f608082013560a0830135613e2d60e0850160c08601614d98565b613e3e610100860160e08701615693565b61ffff16613e54610120870161010088016156ac565b613e6661014088016101208901614fd8565b614416565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613ef65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016105ca565b5f8051602061585283398151915242613f156040860160208701614d98565b6001600160401b031611613f875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016105ca565b613f976040850160208601614d98565b6001600160401b0316613fad6202a300426152d0565b116140205760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016105ca565b833561403e5760405162461bcd60e51b81526004016105ca9061519a565b83355f9081526009820160205260409020541561406d5760405162461bcd60e51b81526004016105ca906151db565b61407a60408501856156cc565b905060301461409b5760405162461bcd60e51b81526004016105ca90615223565b6140a4836143e2565b5f8061413e6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906140e99190614d98565b6001600160401b0316815260200161410460408a018a6156cc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061465a565b5f8281526007860160205260409020919350915061415c8282615752565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614189908590600401614ed1565b6020604051808303815f875af11580156141a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141c99190614f03565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561424157614241614db1565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614321918e01908e01614d98565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156143725760405163cd78605960e01b81523060048201526024016105ca565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146143bb576040519150601f19603f3d011682016040523d82523d5f602084013e6143c0565b606091505b5050905080611dd057604051630a12f52160e11b815260040160405180910390fd5b61222f816001613b52565b6143f5613dac565b6143fd614a09565b61222f81614a11565b61440e613dac565b613df5614bb3565b61441e613dac565b5f805160206158128339815191528361448a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016105ca565b6127108411156144ac5760405162461bcd60e51b81526004016105ca9061554a565b858711156145145760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016105ca565b5f8360ff16116145815760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016105ca565b600a60ff841611156145f35760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016105ca565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146146c45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016105ca565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561473b576146fb816001615537565b614706906008615305565b5081515f9083908390811061471d5761471d61503f565b60200101906001600160f81b03191690815f1a9053506001016146e7565b505f5b60048110156147a357614752816003615537565b61475d906008615305565b600160ff919091161c60f81b826147758360026152d0565b815181106147855761478561503f565b60200101906001600160f81b03191690815f1a90535060010161473e565b505f5b602081101561480057845181602081106147c2576147c261503f565b1a60f81b826147d28360066152d0565b815181106147e2576147e261503f565b60200101906001600160f81b03191690815f1a9053506001016147a6565b505f5b602081101561486057846020015181602081106148225761482261503f565b1a60f81b826148328360266152d0565b815181106148425761484261503f565b60200101906001600160f81b03191690815f1a905350600101614803565b505f5b60088110156148d457614877816007615537565b614882906008615305565b60ff1685604001516001600160401b0316901c60f81b828260466148a691906152d0565b815181106148b6576148b661503f565b60200101906001600160f81b03191690815f1a905350600101614863565b505f5b603081101561493f57846080015181815181106148f6576148f661503f565b01602001516001600160f81b0319168261491183604e6152d0565b815181106149215761492161503f565b60200101906001600160f81b03191690815f1a9053506001016148d7565b505f5b60088110156149b157614956816007615537565b614961906008615305565b60608601516001600160401b0390811691161c60f81b8261498383607e6152d0565b815181106149935761499361503f565b60200101906001600160f81b03191690815f1a905350600101614942565b506002816040516149c291906152bf565b602060405180830381855afa1580156149dd573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a009190614f03565b94909350915050565b613df5613dac565b614a19613dac565b80355f8051602061585283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614a6560808401606085016156ac565b60ff161115614ad25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016105ca565b5f614ae360808401606085016156ac565b60ff1611614b4b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016105ca565b614b5b60808301606084016156ac565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614b8c6060830160408401614d98565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612751613dac565b508054614bc79061533c565b5f825580601f10614bd6575050565b601f0160209004905f5260205f209081019061222f91905b80821115614c01575f8155600101614bee565b5090565b801515811461222f575f80fd5b803563ffffffff81168114611e01575f80fd5b5f805f60608486031215614c37575f80fd5b833592506020840135614c4981614c05565b9150614c5760408501614c12565b90509250925092565b5f60208284031215614c70575f80fd5b5035919050565b5f6101408284031215614c88575f80fd5b50919050565b803561ffff81168114611e01575f80fd5b80356001600160401b0381168114611e01575f80fd5b5f805f60608486031215614cc7575f80fd5b83356001600160401b03811115614cdc575f80fd5b840160608187031215614ced575f80fd5b9250614cfb60208501614c8e565b9150614c5760408501614c9f565b5f60208284031215614d19575f80fd5b610bcf82614c12565b5f8060408385031215614d33575f80fd5b614d3c83614c12565b946020939093013593505050565b5f8060408385031215614d5b575f80fd5b82356001600160401b03811115614d70575f80fd5b830160808186031215614d81575f80fd5b9150614d8f60208401614c12565b90509250929050565b5f60208284031215614da8575f80fd5b610bcf82614c9f565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614de857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e2360608401826001600160401b03169052565b506080830151614e3e60808401826001600160401b03169052565b5060a0830151614e5960a08401826001600160401b03169052565b5060c0830151614e7460c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e7457614e74614e7b565b5f5b83811015614ec9578181015183820152602001614eb1565b50505f910152565b602081525f8251806020840152614eef816040850160208701614eaf565b601f01601f19169190910160400192915050565b5f60208284031215614f13575f80fd5b5051919050565b5f82614f3457634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461222f575f80fd5b5f60208284031215614fe8575f80fd5b8135610bcf81614fc4565b5f808335601e19843603018112615008575f80fd5b8301803591506001600160401b03821115615021575f80fd5b6020019150600581901b3603821315615038575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615067575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150a7576150a7615071565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150d5576150d5615071565b604052919050565b5f6001600160401b038211156150f5576150f5615071565b50601f01601f191660200190565b5f60608236031215615113575f80fd5b61511b615085565b82358152602061512c818501614c9f565b8183015260408401356001600160401b03811115615148575f80fd5b840136601f820112615158575f80fd5b803561516b615166826150dd565b6150ad565b818152368483850101111561517e575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615281818460208a01614eaf565b80830190508581526001600160401b0360c01b8560c01b16602082015283516152b1816028840160208801614eaf565b016028019695505050505050565b5f8251615067818460208701614eaf565b80820180821115610b9c57610b9c614e7b565b5f63ffffffff8083168181036152fb576152fb614e7b565b6001019392505050565b8082028115828204841417610b9c57610b9c614e7b565b6001600160401b03818116838216019080821115614e7457614e74614e7b565b600181811c9082168061535057607f821691505b602082108103614c8857634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546153c78161533c565b806020870152604060018084165f81146153e8576001811461540457615431565b60ff19851660408a0152604084151560051b8a01019550615431565b895f5260205f205f5b858110156154285781548b820186015290830190880161540d565b8a016040019650505b509398975050505050505050565b8051611e0181614c05565b5f806040838503121561545b575f80fd5b82516001600160401b0380821115615471575f80fd5b9084019060608287031215615484575f80fd5b61548c615085565b8251815260208084015161549f81614fc4565b828201526040840151838111156154b4575f80fd5b80850194505087601f8501126154c8575f80fd5b835192506154d8615166846150dd565b83815288828587010111156154eb575f80fd5b6154fa84838301848801614eaf565b8060408401525081955061550f81880161543f565b9450505050509250929050565b5f6001600160401b038083168181036152fb576152fb614e7b565b81810381811115610b9c57610b9c614e7b565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461568b5761568b614e7b565b505092915050565b5f602082840312156156a3575f80fd5b610bcf82614c8e565b5f602082840312156156bc575f80fd5b813560ff81168114610bcf575f80fd5b5f808335601e198436030181126156e1575f80fd5b8301803591506001600160401b038211156156fa575f80fd5b602001915036819003821315615038575f80fd5b601f821115611dd057805f5260205f20601f840160051c810160208510156157335750805b601f840160051c820191505b8181101561164f575f815560010161573f565b81516001600160401b0381111561576b5761576b615071565b61577f81615779845461533c565b8461570e565b602080601f8311600181146157b2575f841561579b5750858301515b5f19600386901b1c1916600185901b178555615809565b5f85815260208120601f198616915b828110156157e0578886015182559484019460019091019084016157c1565b50858210156157fd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615a6d380380615a6d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159208061014d5f395ff3fe608060405260043610610161575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f1461045e578063c974d1b614610471578063d5f20ff614610485578063df93d8de146104b1575f80fd5b8063b771b3bc146103ee578063ba3a4b9714610420578063bee0a03f1461043f575f80fd5b8063620658561461033f57806366435abf1461035e57806376f786211461037d5780638280a25a1461039c57806398f3e2b4146103b0578063a3a65e48146103cf575f80fd5b806335455ded1161011e57806335455ded1461027e57806340034a93146102a6578063467ef06f146102b95780635297fae6146102d857806360305d62146102f757806361e2f49014610320575f80fd5b80630118acc4146101655780630322ed98146101865780630cdd0985146101a5578063151d30d1146102025780631f7a9d8f146102285780632e2194d814610247575b5f80fd5b348015610170575f80fd5b5061018461017f366004614c87565b6104c7565b005b348015610191575f80fd5b506101846101a0366004614cc2565b610958565b3480156101b0575f80fd5b506101ef6101bf366004614cc2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b34801561020d575f80fd5b50610216600a81565b60405160ff90911681526020016101f9565b348015610233575f80fd5b50610184610242366004614cd9565b610b11565b348015610252575f80fd5b50610266610261366004614cc2565b610bee565b6040516001600160401b0390911681526020016101f9565b348015610289575f80fd5b5061029361271081565b60405161ffff90911681526020016101f9565b6101ef6102b4366004614d17565b610c04565b3480156102c4575f80fd5b506101846102d3366004614d6b565b610c38565b3480156102e3575f80fd5b506101846102f2366004614d84565b610c8b565b348015610302575f80fd5b5061030b601481565b60405163ffffffff90911681526020016101f9565b34801561032b575f80fd5b5061018461033a366004614dac565b610e60565b34801561034a575f80fd5b506101ef610359366004614dfa565b6115aa565b348015610369575f80fd5b50610266610378366004614cc2565b6115c3565b348015610388575f80fd5b50610184610397366004614c87565b6115d7565b3480156103a7575f80fd5b50610216603081565b3480156103bb575f80fd5b506101846103ca366004614d84565b6116b8565b3480156103da575f80fd5b506101846103e9366004614d6b565b6118e5565b3480156103f9575f80fd5b506104086005600160991b0181565b6040516001600160a01b0390911681526020016101f9565b34801561042b575f80fd5b5061018461043a366004614cc2565b611a9d565b34801561044a575f80fd5b50610184610459366004614cc2565b611d23565b6101ef61046c366004614cc2565b611e37565b34801561047c575f80fd5b50610216601481565b348015610490575f80fd5b506104a461049f366004614cc2565b611e68565b6040516101f99190614e27565b3480156104bc575f80fd5b506102666202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615874833981519152918415610519576105168285611f5b565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561054b5761054b614e13565b600481111561055c5761055c614e13565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156105e3576105e3614e13565b146106355760405162461bcd60e51b815260206004820152602a60248201525f805160206158948339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461069a5760405162461bcd60e51b815260206004820152603360248201525f805160206158948339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161062c565b5f6106a4846121f7565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156106f1576106f1614e13565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107c385611e68565b905082606001516001600160401b031681608001516001600160401b03161161083a5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161062c565b60028151600581111561084f5761084f614e13565b03610861576108618360600151612287565b5f836060015182608001516108769190614ef1565b90506108828682612294565b5f6005600160991b0163ee5b48eb61089b8987866122dc565b6040518263ffffffff1660e01b81526004016108b79190614f33565b6020604051808303815f875af11580156108d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108f79190614f65565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206158f48339815191526020526040808220815160e0810190925280545f805160206158b483398151915293929190829060ff1660058111156109a5576109a5614e13565b60058111156109b6576109b6614e13565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a2557610a25614e13565b14610a8a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161062c565b6005600160991b016001600160a01b031663ee5b48eb610aaf8584606001515f6122dc565b6040518263ffffffff1660e01b8152600401610acb9190614f33565b6020604051808303815f875af1158015610ae7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b0b9190614f65565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b5a575080546001600160401b03808416911610155b15610b785760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ba283612501565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610bfe64e8d4a5100083614f7c565b92915050565b5f610c0d612512565b610c1984848434612549565b9050610c3160015f805160206158d483398151915255565b9392505050565b5f805160206158748339815191525f80610c51846127c6565b6040808201515f848152600588016020529190912054929450909250610b0b916001600160401b03909116906001600160a01b0316612b3e565b5f805160206158748339815191525f610ca384612b51565b90505f80610cb48360400151612d2b565b50915091505f610cc383611e68565b9050816001600160401b031681606001516001600160401b03161015610cfb5760405162461bcd60e51b815260040161062c90614f9b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d405760405162461bcd60e51b815260040161062c90614fdd565b60015f87815260068701602052604090205460ff166004811115610d6657610d66614e13565b14610dcf5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161062c565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206158b48339815191529060ff1615610efd5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161062c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f649190614f65565b836020013514610fc65760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161062c565b30610fd7606085016040860161503a565b6001600160a01b0316146110495760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161062c565b5f6110576060850185615055565b9050116110b65760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161062c565b5f6110c46060850185615055565b91505063ffffffff81106111305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b606482015260840161062c565b5f84356020860135601461114a6060890160408a0161503a565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156114ba575f6111ca6060890189615055565b8363ffffffff168181106111e0576111e06150a1565b90506020028101906111f291906150b5565b6111fb90615165565b80519091508061121d5760405162461bcd60e51b815260040161062c906151fc565b5f8181526009880160205260409020541561124a5760405162461bcd60e51b815260040161062c9061523d565b60408201515160301461126f5760405162461bcd60e51b815260040161062c90615285565b84825f01518360200151846040015160405160200161129194939291906152d2565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112df9190615321565b602060405180830381855afa1580156112fa573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061131d9190614f65565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113a9576113a9614e13565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161145c911686615332565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114b390615345565b90506111ae565b50600584018190555f6114cc86612b51565b90505f6114dc8260400151612f66565b9050806002856040516114ef9190615321565b602060405180830381855afa15801561150a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061152d9190614f65565b146115915760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161062c565b505050600a909201805460ff1916600117905550505050565b5f610bfe6001600160401b03831664e8d4a51000615367565b5f6115cd82611e68565b6080015192915050565b5f805160206158748339815191525f6115ef85611e68565b5f86815260058401602052604090205460a082015191925061162291600160b01b9091046001600160401b03169061537e565b6001600160401b03164210156116965760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161062c565b83156116a8576116a68584611f5b565b505b6116b1856130cf565b5050505050565b6116c0612512565b5f805160206158748339815191525f6116d884612b51565b90505f806116e98360400151612d2b565b50915091505f6116f883611e68565b9050816001600160401b031681606001516001600160401b031610156117305760405162461bcd60e51b815260040161062c90614f9b565b5f8681526006860160205260409020600301546001600160401b038084169116111561176e5760405162461bcd60e51b815260040161062c90614fdd565b60035f87815260068701602052604090205460ff16600481111561179457611794614e13565b146117e85760405162461bcd60e51b815260206004820152603160248201525f805160206158948339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161062c565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261188d91612b3e565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506118e160015f805160206158d483398151915255565b5050565b5f805160206158b48339815191525f6118fd83612b51565b90505f8061190e83604001516133c5565b91509150806119705760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161062c565b5f8281526007850160205260408120805461198a9061539e565b90501180156119bc575060015f83815260088601602052604090205460ff1660058111156119ba576119ba614e13565b145b6119d85760405162461bcd60e51b815260040161062c906153d0565b5f82815260078501602052604081206119f091614c1d565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061587483398151915293929190829060ff166004811115611afe57611afe614e13565b6004811115611b0f57611b0f614e13565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b9657611b96614e13565b1480611bb45750600381516004811115611bb257611bb2614e13565b145b611c085760405162461bcd60e51b815260206004820152603260248201525f80516020615894833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161062c565b5f611c168260400151611e68565b905080606001516001600160401b03165f03611c9a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161062c565b6005600160991b016001600160a01b031663ee5b48eb611cc78460400151846060015185608001516122dc565b6040518263ffffffff1660e01b8152600401611ce39190614f33565b6020604051808303815f875af1158015611cff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b19190614f65565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206158b4833981519152929190611d6b9061539e565b9050118015611d9d575060015f83815260088301602052604090205460ff166005811115611d9b57611d9b614e13565b145b611db95760405162461bcd60e51b815260040161062c906153d0565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611df29190600401615417565b6020604051808303815f875af1158015611e0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e329190614f65565b505050565b5f611e40612512565b611e4b823334613566565b9050611e6360015f805160206158d483398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206158f483398151915290528390208351918201909352825491925f805160206158b483398151915292829060ff166005811115611ee857611ee8614e13565b6005811115611ef957611ef9614e13565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611fa6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fcd91908101906154ac565b91509150806120305760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161062c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612073573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120979190614f65565b8251146120fb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161062c565b60208201516001600160a01b0316156121715760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161062c565b5f8061218084604001516139dc565b915091508187146121ed5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161062c565b9695505050505050565b5f8181525f805160206158f48339815191526020526040812060020180545f805160206158b483398151915291600160401b9091046001600160401b03169060086122418361557e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b612291815f613bb4565b50565b5f9182525f805160206158f4833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561235557612315816001615599565b612320906008615367565b5081515f90839083908110612337576123376150a1565b60200101906001600160f81b03191690815f1a905350600101612301565b505f5b60048110156123c05761236c816003615599565b612377906008615367565b600263ffffffff16901c60f81b828260026123929190615332565b815181106123a2576123a26150a1565b60200101906001600160f81b03191690815f1a905350600101612358565b505f5b6020811015612422576123d781601f615599565b6123e2906008615367565b86901c60f81b826123f4836006615332565b81518110612404576124046150a1565b60200101906001600160f81b03191690815f1a9053506001016123c3565b505f5b600881101561248d57612439816007615599565b612444906008615367565b6001600160401b038616901c60f81b8261245f836026615332565b8151811061246f5761246f6150a1565b60200101906001600160f81b03191690815f1a905350600101612425565b505f5b60088110156124f8576124a4816007615599565b6124af906008615367565b6001600160401b038516901c60f81b826124ca83602e615332565b815181106124da576124da6150a1565b60200101906001600160f81b03191690815f1a905350600101612490565b50949350505050565b612509613e0e565b61229181613e59565b5f805160206158d483398151915280546001190161254357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158748339815191529061ffff861610801590612595575061271061ffff861611155b6125b15760405162461bcd60e51b815260040161062c906155ac565b60028101546001600160401b03908116908516101561262a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161062c565b805483101561268d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161062c565b80600101548311156126f45760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161062c565b825f6126ff82610bee565b90505f61270c8983613ecd565b905060405180606001604052806127203390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f805160206158d483398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158b48339815191525f61281585612b51565b90505f8061282683604001516133c5565b91509150801561288b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161062c565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156128bc576128bc614e13565b60058111156128cd576128cd614e13565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561293e5761293e614e13565b148061295c575060018251600581111561295a5761295a614e13565b145b6129bb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161062c565b6003825160058111156129d0576129d0614e13565b036129dd575060046129e1565b5060055b6020808301515f90815260098801909152604081205581816005811115612a0a57612a0a614e13565b90816005811115612a1d57612a1d614e13565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612a5157612a51614e13565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612b0557612b05614e13565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6118e16001600160a01b038216836143b1565b60408051606080820183525f8083526020830181905292820152905f805160206158b48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bc6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bed91908101906154ac565b9150915080612c4d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161062c565b8254825114612cb05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161062c565b60208201516001600160a01b031615612d235760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161062c565b509392505050565b5f805f8351603614612d4f5760405162461bcd60e51b815260040161062c906155f7565b5f805b6002811015612d9e57612d66816001615599565b612d71906008615367565b61ffff16868281518110612d8757612d876150a1565b016020015160f81c901b9190911790600101612d52565b5061ffff811615612dc15760405162461bcd60e51b815260040161062c90615640565b5f805b6004811015612e1c57612dd8816003615599565b612de3906008615367565b63ffffffff1687612df5836002615332565b81518110612e0557612e056150a1565b016020015160f81c901b9190911790600101612dc4565b5063ffffffff8116600414612e435760405162461bcd60e51b815260040161062c90615683565b5f805b6020811015612e9857612e5a81601f615599565b612e65906008615367565b88612e71836006615332565b81518110612e8157612e816150a1565b016020015160f81c901b9190911790600101612e46565b505f805b6008811015612ef757612eb0816007615599565b612ebb906008615367565b6001600160401b031689612ed0836026615332565b81518110612ee057612ee06150a1565b016020015160f81c901b9190911790600101612e9c565b505f805b6008811015612f5657612f0f816007615599565b612f1a906008615367565b6001600160401b03168a612f2f83602e615332565b81518110612f3f57612f3f6150a1565b016020015160f81c901b9190911790600101612efb565b5091989097509095509350505050565b5f8151602614612f885760405162461bcd60e51b815260040161062c906155f7565b5f805b6002811015612fd757612f9f816001615599565b612faa906008615367565b61ffff16848281518110612fc057612fc06150a1565b016020015160f81c901b9190911790600101612f8b565b5061ffff811615612ffa5760405162461bcd60e51b815260040161062c90615640565b5f805b600481101561305557613011816003615599565b61301c906008615367565b63ffffffff168561302e836002615332565b8151811061303e5761303e6150a1565b016020015160f81c901b9190911790600101612ffd565b5063ffffffff81161561307a5760405162461bcd60e51b815260040161062c90615683565b5f805b60208110156124f85761309181601f615599565b61309c906008615367565b866130a8836006615332565b815181106130b8576130b86150a1565b016020015160f81c901b919091179060010161307d565b5f8181525f805160206158f48339815191526020526040808220815160e0810190925280545f805160206158b483398151915293929190829060ff16600581111561311c5761311c614e13565b600581111561312d5761312d614e13565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561319f5761319f614e13565b146131fb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161062c565b6132088160800151612287565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561324c5761324c614e13565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613301846132fb816121f7565b5f6122dc565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90613330908590600401614f33565b6020604051808303815f875af115801561334c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133709190614f65565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146133e85760405162461bcd60e51b815260040161062c906155f7565b5f805b6002811015613437576133ff816001615599565b61340a906008615367565b61ffff16858281518110613420576134206150a1565b016020015160f81c901b91909117906001016133eb565b5061ffff81161561345a5760405162461bcd60e51b815260040161062c90615640565b5f805b60048110156134b557613471816003615599565b61347c906008615367565b63ffffffff168661348e836002615332565b8151811061349e5761349e6150a1565b016020015160f81c901b919091179060010161345d565b5063ffffffff81166003146134dc5760405162461bcd60e51b815260040161062c90615683565b5f805b6020811015613531576134f381601f615599565b6134fe906008615367565b8761350a836006615332565b8151811061351a5761351a6150a1565b016020015160f81c901b91909117906001016134df565b505f86602681518110613546576135466150a1565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206158748339815191528161357f84610bee565b90505f61358b87611e68565b90506002815160058111156135a2576135a2614e13565b146136015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161062c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166136945760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161062c565b61369d82614444565b5f8282608001516136ae919061537e565b600485015460408401519192506136d0916001600160401b03909116906156ca565b6001600160401b0316816001600160401b0316111561374f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161062c565b6137598882612294565b5f613763896121f7565b90505f898260405160200161378f92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6137c98d86886122dc565b6040518263ffffffff1660e01b81526004016137e59190614f33565b6020604051808303815f875af1158015613801573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138259190614f65565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156138ad576138ad614e13565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e146139ff5760405162461bcd60e51b815260040161062c906155f7565b5f805b6002811015613a4e57613a16816001615599565b613a21906008615367565b61ffff16858281518110613a3757613a376150a1565b016020015160f81c901b9190911790600101613a02565b5061ffff811615613a715760405162461bcd60e51b815260040161062c90615640565b5f805b6004811015613acc57613a88816003615599565b613a93906008615367565b63ffffffff1686613aa5836002615332565b81518110613ab557613ab56150a1565b016020015160f81c901b9190911790600101613a74565b5063ffffffff8116600514613af35760405162461bcd60e51b815260040161062c90615683565b5f805b6020811015613b4857613b0a81601f615599565b613b15906008615367565b87613b21836006615332565b81518110613b3157613b316150a1565b016020015160f81c901b9190911790600101613af6565b505f805b6008811015613ba757613b60816007615599565b613b6b906008615367565b6001600160401b031688613b80836026615332565b81518110613b9057613b906150a1565b016020015160f81c901b9190911790600101613b4c565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206158b4833981519152914291901580613c9a575060028301548151613c96916001600160401b031690615332565b8210155b15613cc0576001600160401b038516606082015281815260408101516020820152613cdf565b8481606001818151613cd2919061537e565b6001600160401b03169052505b6060810151613cef9060646156ca565b602082015160028501546001600160401b039290921691613d1a9190600160401b900460ff16615367565b1015613d7e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161062c565b8315613da757846001600160401b031681604001818151613d9f9190615332565b905250613dc6565b846001600160401b031681604001818151613dc29190615599565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e5757604051631afcd79f60e31b815260040160405180910390fd5b565b613e61613e0e565b613e6a8161444f565b613e72614468565b612291608082013560a0830135613e8f60e0850160c08601614dfa565b613ea0610100860160e087016156f5565b61ffff16613eb66101208701610100880161570e565b613ec86101408801610120890161503a565b614478565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613f585760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161062c565b5f805160206158b483398151915242613f776040860160208701614dfa565b6001600160401b031611613fe95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161062c565b613ff96040850160208601614dfa565b6001600160401b031661400f6202a30042615332565b116140825760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161062c565b83356140a05760405162461bcd60e51b815260040161062c906151fc565b83355f908152600982016020526040902054156140cf5760405162461bcd60e51b815260040161062c9061523d565b60306140de604086018661572e565b9050146140fd5760405162461bcd60e51b815260040161062c90615285565b61410683614444565b5f806141a06040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061414b9190614dfa565b6001600160401b0316815260200161416660408a018a61572e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506146bc565b5f828152600786016020526040902091935091506141be82826157b4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141eb908590600401614f33565b6020604051808303815f875af1158015614207573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061422b9190614f65565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156142a3576142a3614e13565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614383918e01908e01614dfa565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156143d45760405163cd78605960e01b815230600482015260240161062c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461441d576040519150601f19603f3d011682016040523d82523d5f602084013e614422565b606091505b5050905080611e3257604051630a12f52160e11b815260040160405180910390fd5b612291816001613bb4565b614457613e0e565b61445f614a6b565b61229181614a73565b614470613e0e565b613e57614c15565b614480613e0e565b5f80516020615874833981519152836144ec5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161062c565b61271084111561450e5760405162461bcd60e51b815260040161062c906155ac565b858711156145765760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161062c565b5f8360ff16116145e35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161062c565b600a60ff841611156146555760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161062c565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146147265760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161062c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561479d5761475d816001615599565b614768906008615367565b5081515f9083908390811061477f5761477f6150a1565b60200101906001600160f81b03191690815f1a905350600101614749565b505f5b6004811015614805576147b4816003615599565b6147bf906008615367565b600160ff919091161c60f81b826147d7836002615332565b815181106147e7576147e76150a1565b60200101906001600160f81b03191690815f1a9053506001016147a0565b505f5b60208110156148625784518160208110614824576148246150a1565b1a60f81b82614834836006615332565b81518110614844576148446150a1565b60200101906001600160f81b03191690815f1a905350600101614808565b505f5b60208110156148c25784602001518160208110614884576148846150a1565b1a60f81b82614894836026615332565b815181106148a4576148a46150a1565b60200101906001600160f81b03191690815f1a905350600101614865565b505f5b6008811015614936576148d9816007615599565b6148e4906008615367565b60ff1685604001516001600160401b0316901c60f81b828260466149089190615332565b81518110614918576149186150a1565b60200101906001600160f81b03191690815f1a9053506001016148c5565b505f5b60308110156149a15784608001518181518110614958576149586150a1565b01602001516001600160f81b0319168261497383604e615332565b81518110614983576149836150a1565b60200101906001600160f81b03191690815f1a905350600101614939565b505f5b6008811015614a13576149b8816007615599565b6149c3906008615367565b60608601516001600160401b0390811691161c60f81b826149e583607e615332565b815181106149f5576149f56150a1565b60200101906001600160f81b03191690815f1a9053506001016149a4565b50600281604051614a249190615321565b602060405180830381855afa158015614a3f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a629190614f65565b94909350915050565b613e57613e0e565b614a7b613e0e565b80355f805160206158b483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614ac7608084016060850161570e565b60ff161115614b345760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161062c565b5f614b45608084016060850161570e565b60ff1611614bad5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161062c565b614bbd608083016060840161570e565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614bee6060830160408401614dfa565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6127b3613e0e565b508054614c299061539e565b5f825580601f10614c38575050565b601f0160209004905f5260205f209081019061229191905b80821115614c63575f8155600101614c50565b5090565b8015158114612291575f80fd5b803563ffffffff81168114611e63575f80fd5b5f805f60608486031215614c99575f80fd5b833592506020840135614cab81614c67565b9150614cb960408501614c74565b90509250925092565b5f60208284031215614cd2575f80fd5b5035919050565b5f6101408284031215614cea575f80fd5b50919050565b803561ffff81168114611e63575f80fd5b80356001600160401b0381168114611e63575f80fd5b5f805f60608486031215614d29575f80fd5b83356001600160401b03811115614d3e575f80fd5b840160608187031215614d4f575f80fd5b9250614d5d60208501614cf0565b9150614cb960408501614d01565b5f60208284031215614d7b575f80fd5b610c3182614c74565b5f8060408385031215614d95575f80fd5b614d9e83614c74565b946020939093013593505050565b5f8060408385031215614dbd575f80fd5b82356001600160401b03811115614dd2575f80fd5b830160808186031215614de3575f80fd5b9150614df160208401614c74565b90509250929050565b5f60208284031215614e0a575f80fd5b610c3182614d01565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614e4a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e8560608401826001600160401b03169052565b506080830151614ea060808401826001600160401b03169052565b5060a0830151614ebb60a08401826001600160401b03169052565b5060c0830151614ed660c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614ed657614ed6614edd565b5f5b83811015614f2b578181015183820152602001614f13565b50505f910152565b602081525f8251806020840152614f51816040850160208701614f11565b601f01601f19169190910160400192915050565b5f60208284031215614f75575f80fd5b5051919050565b5f82614f9657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612291575f80fd5b5f6020828403121561504a575f80fd5b8135610c3181615026565b5f808335601e1984360301811261506a575f80fd5b8301803591506001600160401b03821115615083575f80fd5b6020019150600581901b360382131561509a575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150c9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615109576151096150d3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615137576151376150d3565b604052919050565b5f6001600160401b03821115615157576151576150d3565b50601f01601f191660200190565b5f60608236031215615175575f80fd5b61517d6150e7565b82358152602061518e818501614d01565b8183015260408401356001600160401b038111156151aa575f80fd5b840136601f8201126151ba575f80fd5b80356151cd6151c88261513f565b61510f565b81815236848385010111156151e0575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516152e3818460208a01614f11565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615313816028840160208801614f11565b016028019695505050505050565b5f82516150c9818460208701614f11565b80820180821115610bfe57610bfe614edd565b5f63ffffffff80831681810361535d5761535d614edd565b6001019392505050565b8082028115828204841417610bfe57610bfe614edd565b6001600160401b03818116838216019080821115614ed657614ed6614edd565b600181811c908216806153b257607f821691505b602082108103614cea57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546154298161539e565b806020870152604060018084165f811461544a576001811461546657615493565b60ff19851660408a0152604084151560051b8a01019550615493565b895f5260205f205f5b8581101561548a5781548b820186015290830190880161546f565b8a016040019650505b509398975050505050505050565b8051611e6381614c67565b5f80604083850312156154bd575f80fd5b82516001600160401b03808211156154d3575f80fd5b90840190606082870312156154e6575f80fd5b6154ee6150e7565b8251815260208084015161550181615026565b82820152604084015183811115615516575f80fd5b80850194505087601f85011261552a575f80fd5b8351925061553a6151c88461513f565b838152888285870101111561554d575f80fd5b61555c84838301848801614f11565b806040840152508195506155718188016154a1565b9450505050509250929050565b5f6001600160401b0380831681810361535d5761535d614edd565b81810381811115610bfe57610bfe614edd565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146156ed576156ed614edd565b505092915050565b5f60208284031215615705575f80fd5b610c3182614cf0565b5f6020828403121561571e575f80fd5b813560ff81168114610c31575f80fd5b5f808335601e19843603018112615743575f80fd5b8301803591506001600160401b0382111561575c575f80fd5b60200191503681900382131561509a575f80fd5b601f821115611e3257805f5260205f20601f840160051c810160208510156157955750805b601f840160051c820191505b818110156116b1575f81556001016157a1565b81516001600160401b038111156157cd576157cd6150d3565b6157e1816157db845461539e565b84615770565b602080601f831160018114615814575f84156157fd5750858301515b5f19600386901b1c1916600185901b17855561586b565b5f85815260208120601f198616915b8281101561584257888601518255948401946001909101908401615823565b508582101561585f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -254,6 +254,68 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorRaw) Transa return _NativeTokenStakingManager.Contract.contract.Transact(opts, method, params...) } +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) ADDRESSLENGTH(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "ADDRESS_LENGTH") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ADDRESSLENGTH() (uint32, error) { + return _NativeTokenStakingManager.Contract.ADDRESSLENGTH(&_NativeTokenStakingManager.CallOpts) +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) ADDRESSLENGTH() (uint32, error) { + return _NativeTokenStakingManager.Contract.ADDRESSLENGTH(&_NativeTokenStakingManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) BLSPUBLICKEYLENGTH(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "BLS_PUBLIC_KEY_LENGTH") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _NativeTokenStakingManager.Contract.BLSPUBLICKEYLENGTH(&_NativeTokenStakingManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _NativeTokenStakingManager.Contract.BLSPUBLICKEYLENGTH(&_NativeTokenStakingManager.CallOpts) +} + // MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. // // Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index d645fc38f..9819f3b30 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -38,10 +38,10 @@ type InitialValidator struct { // SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. type SubnetConversionData struct { - ConvertSubnetTxID [32]byte - BlockchainID [32]byte - ValidatorManagerAddress common.Address - InitialValidators []InitialValidator + ConvertSubnetTxID [32]byte + ValidatorManagerBlockchainID [32]byte + ValidatorManagerAddress common.Address + InitialValidators []InitialValidator } // Validator is an auto generated low-level Go binding around an user-defined struct. @@ -72,8 +72,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"blockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"validatorManagerAddress\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"initialValidators\",\"type\":\"tuple[]\",\"internalType\":\"structInitialValidator[]\",\"components\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516139d13803806139d183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138848061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610106575f3560e01c80638da5cb5b1161009e578063bee0a03f1161006e578063bee0a03f14610267578063c974d1b61461027a578063d5f20ff614610294578063df93d8de146102b4578063f2fde38b146102be575f80fd5b80638da5cb5b146101ef57806397fb70d414610233578063a3a65e4814610246578063b771b3bc14610259575f80fd5b806361e2f490116100d957806361e2f4901461019657806366435abf146101a9578063715018a6146101d45780638994ab49146101dc575f80fd5b80630322ed981461010a5780630cdd09851461011f578063467ef06f14610170578063580a400614610183575b5f80fd5b61011d610118366004612da1565b6102d1565b005b61015d61012d366004612da1565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61011d61017e366004612dd0565b61048f565b61011d610191366004612e13565b61049d565b61011d6101a4366004612e49565b6105ab565b6101bc6101b7366004612da1565b610cf5565b6040516001600160401b039091168152602001610167565b61011d610d09565b61015d6101ea366004612ea9565b610d1c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610167565b61011d610241366004612da1565b610d38565b61011d610254366004612dd0565b610d4c565b61021b6005600160991b0181565b61011d610275366004612da1565b610f04565b610282601481565b60405160ff9091168152602001610167565b6102a76102a2366004612da1565b611013565b6040516101679190612f02565b6101bc6202a30081565b61011d6102cc366004612fb8565b611106565b5f8181525f805160206138588339815191526020526040808220815160e0810190925280545f8051602061383883398151915293929190829060ff16600581111561031e5761031e612eee565b600581111561032f5761032f612eee565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561039e5761039e612eee565b146104085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042d8584606001515f611140565b6040518263ffffffff1660e01b81526004016104499190612ffc565b6020604051808303815f875af1158015610465573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610489919061302e565b50505050565b61049881611365565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156104e15750825b90505f826001600160401b031660011480156104fc5750303b155b90508115801561050a575080155b156105285760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561055257845460ff60401b1916600160401b1785555b61055c87876116dd565b83156105a257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206138388339815191529060ff16156106485760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016103ff565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561068b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106af919061302e565b8360200135146107115760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016103ff565b306107226060850160408601612fb8565b6001600160a01b0316146107945760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016103ff565b5f6107a26060850185613045565b9050116108015760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b60648201526084016103ff565b5f61080f6060850185613045565b91505063ffffffff811061087b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b60648201526084016103ff565b5f8435602086013560146108956060890160408a01612fb8565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610c05575f6109156060890189613045565b8363ffffffff1681811061092b5761092b613091565b905060200281019061093d91906130a5565b61094690613155565b8051909150806109685760405162461bcd60e51b81526004016103ff906131ec565b5f818152600988016020526040902054156109955760405162461bcd60e51b81526004016103ff9061322d565b8160400151516030146109ba5760405162461bcd60e51b81526004016103ff90613275565b84825f0151836020015184604001516040516020016109dc94939291906132c2565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610a2a9190613311565b602060405180830381855afa158015610a45573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a68919061302e565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610af457610af4612eee565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610ba7911686613336565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610bfe90613349565b90506108f9565b50600584018190555f610c17866116fb565b90505f610c2782604001516118d5565b905080600285604051610c3a9190613311565b602060405180830381855afa158015610c55573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c78919061302e565b14610cdc5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016103ff565b505050600a909201805460ff1916600117905550505050565b5f610cff82611013565b6080015192915050565b610d11611a3e565b610d1a5f611a99565b565b5f610d25611a3e565b610d2f8383611b09565b90505b92915050565b610d40611a3e565b610d4981611fed565b50565b5f805160206138388339815191525f610d64836116fb565b90505f80610d7583604001516122e3565b9150915080610dd75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016103ff565b5f82815260078501602052604081208054610df19061336b565b9050118015610e23575060015f83815260088601602052604090205460ff166005811115610e2157610e21612eee565b145b610e3f5760405162461bcd60e51b81526004016103ff9061339d565b5f8281526007850160205260408120610e5791612d57565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020613838833981519152929190610f4c9061336b565b9050118015610f7e575060015f83815260088301602052604090205460ff166005811115610f7c57610f7c612eee565b145b610f9a5760405162461bcd60e51b81526004016103ff9061339d565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610fd391906004016133e4565b6020604051808303815f875af1158015610fef573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610498919061302e565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061385883398151915290528390208351918201909352825491925f8051602061383883398151915292829060ff16600581111561109357611093612eee565b60058111156110a4576110a4612eee565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b61110e611a3e565b6001600160a01b03811661113757604051631e4fbdf760e01b81525f60048201526024016103ff565b610d4981611a99565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156111b95761117981600161346e565b611184906008613481565b5081515f9083908390811061119b5761119b613091565b60200101906001600160f81b03191690815f1a905350600101611165565b505f5b6004811015611224576111d081600361346e565b6111db906008613481565b600263ffffffff16901c60f81b828260026111f69190613336565b8151811061120657611206613091565b60200101906001600160f81b03191690815f1a9053506001016111bc565b505f5b60208110156112865761123b81601f61346e565b611246906008613481565b86901c60f81b82611258836006613336565b8151811061126857611268613091565b60200101906001600160f81b03191690815f1a905350600101611227565b505f5b60088110156112f15761129d81600761346e565b6112a8906008613481565b6001600160401b038616901c60f81b826112c3836026613336565b815181106112d3576112d3613091565b60200101906001600160f81b03191690815f1a905350600101611289565b505f5b600881101561135c5761130881600761346e565b611313906008613481565b6001600160401b038516901c60f81b8261132e83602e613336565b8151811061133e5761133e613091565b60200101906001600160f81b03191690815f1a9053506001016112f4565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206138388339815191525f6113b4856116fb565b90505f806113c583604001516122e3565b91509150801561142a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016103ff565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561145b5761145b612eee565b600581111561146c5761146c612eee565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156114dd576114dd612eee565b14806114fb57506001825160058111156114f9576114f9612eee565b145b61155a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016103ff565b60038251600581111561156f5761156f612eee565b0361157c57506004611580565b5060055b6020808301515f908152600988019091526040812055818160058111156115a9576115a9612eee565b908160058111156115bc576115bc612eee565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156115f0576115f0612eee565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156116a4576116a4612eee565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6116e5612484565b6116ee826124cd565b6116f7816124e6565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206138388339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611770573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261179791908101906134a7565b91509150806117f75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016103ff565b825482511461185a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016103ff565b60208201516001600160a01b0316156118cd5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016103ff565b509392505050565b5f81516026146118f75760405162461bcd60e51b81526004016103ff90613579565b5f805b60028110156119465761190e81600161346e565b611919906008613481565b61ffff1684828151811061192f5761192f613091565b016020015160f81c901b91909117906001016118fa565b5061ffff8116156119695760405162461bcd60e51b81526004016103ff906135c2565b5f805b60048110156119c45761198081600361346e565b61198b906008613481565b63ffffffff168561199d836002613336565b815181106119ad576119ad613091565b016020015160f81c901b919091179060010161196c565b5063ffffffff8116156119e95760405162461bcd60e51b81526004016103ff90613605565b5f805b602081101561135c57611a0081601f61346e565b611a0b906008613481565b86611a17836006613336565b81518110611a2757611a27613091565b016020015160f81c901b91909117906001016119ec565b33611a707f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d1a5760405163118cdaa760e01b81523360048201526024016103ff565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611b945760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016103ff565b5f8051602061383883398151915242611bb3604086016020870161364c565b6001600160401b031611611c255760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016103ff565b611c35604085016020860161364c565b6001600160401b0316611c4b6202a30042613336565b11611cbe5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016103ff565b8335611cdc5760405162461bcd60e51b81526004016103ff906131ec565b83355f90815260098201602052604090205415611d0b5760405162461bcd60e51b81526004016103ff9061322d565b611d186040850185613665565b9050603014611d395760405162461bcd60e51b81526004016103ff90613275565b611d42836124f7565b5f80611ddc6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611d87919061364c565b6001600160401b03168152602001611da260408a018a613665565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612502565b5f82815260078601602052604090209193509150611dfa82826136f2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e27908590600401612ffc565b6020604051808303815f875af1158015611e43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e67919061302e565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611edf57611edf612eee565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611fbf918e01908e0161364c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206138588339815191526020526040808220815160e0810190925280545f8051602061383883398151915293929190829060ff16600581111561203a5761203a612eee565b600581111561204b5761204b612eee565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156120bd576120bd612eee565b146121195760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016103ff565b61212681608001516128b1565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561216a5761216a612eee565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61221f84612219816128bb565b5f611140565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061224e908590600401612ffc565b6020604051808303815f875af115801561226a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228e919061302e565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146123065760405162461bcd60e51b81526004016103ff90613579565b5f805b60028110156123555761231d81600161346e565b612328906008613481565b61ffff1685828151811061233e5761233e613091565b016020015160f81c901b9190911790600101612309565b5061ffff8116156123785760405162461bcd60e51b81526004016103ff906135c2565b5f805b60048110156123d35761238f81600361346e565b61239a906008613481565b63ffffffff16866123ac836002613336565b815181106123bc576123bc613091565b016020015160f81c901b919091179060010161237b565b5063ffffffff81166003146123fa5760405162461bcd60e51b81526004016103ff90613605565b5f805b602081101561244f5761241181601f61346e565b61241c906008613481565b87612428836006613336565b8151811061243857612438613091565b016020015160f81c901b91909117906001016123fd565b505f8660268151811061246457612464613091565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d1a57604051631afcd79f60e31b815260040160405180910390fd5b6124d5612484565b6124dd61294b565b610d4981612953565b6124ee612484565b610d4981612af5565b610d49816001612afd565b5f606082608001515160301461256c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016103ff565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156125e3576125a381600161346e565b6125ae906008613481565b5081515f908390839081106125c5576125c5613091565b60200101906001600160f81b03191690815f1a90535060010161258f565b505f5b600481101561264b576125fa81600361346e565b612605906008613481565b600160ff919091161c60f81b8261261d836002613336565b8151811061262d5761262d613091565b60200101906001600160f81b03191690815f1a9053506001016125e6565b505f5b60208110156126a8578451816020811061266a5761266a613091565b1a60f81b8261267a836006613336565b8151811061268a5761268a613091565b60200101906001600160f81b03191690815f1a90535060010161264e565b505f5b602081101561270857846020015181602081106126ca576126ca613091565b1a60f81b826126da836026613336565b815181106126ea576126ea613091565b60200101906001600160f81b03191690815f1a9053506001016126ab565b505f5b600881101561277c5761271f81600761346e565b61272a906008613481565b60ff1685604001516001600160401b0316901c60f81b8282604661274e9190613336565b8151811061275e5761275e613091565b60200101906001600160f81b03191690815f1a90535060010161270b565b505f5b60308110156127e7578460800151818151811061279e5761279e613091565b01602001516001600160f81b031916826127b983604e613336565b815181106127c9576127c9613091565b60200101906001600160f81b03191690815f1a90535060010161277f565b505f5b6008811015612859576127fe81600761346e565b612809906008613481565b60608601516001600160401b0390811691161c60f81b8261282b83607e613336565b8151811061283b5761283b613091565b60200101906001600160f81b03191690815f1a9053506001016127ea565b5060028160405161286a9190613311565b602060405180830381855afa158015612885573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128a8919061302e565b94909350915050565b610d49815f612afd565b5f8181525f805160206138588339815191526020526040812060020180545f8051602061383883398151915291600160401b9091046001600160401b0316906008612905836137b1565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b610d1a612484565b61295b612484565b80355f8051602061383883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146129a760808401606085016137cc565b60ff161115612a145760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016103ff565b5f612a2560808401606085016137cc565b60ff1611612a8d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016103ff565b612a9d60808301606084016137cc565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612ace606083016040840161364c565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61110e612484565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020613838833981519152914291901580612be3575060028301548151612bdf916001600160401b031690613336565b8210155b15612c09576001600160401b038516606082015281815260408101516020820152612c28565b8481606001818151612c1b91906137ec565b6001600160401b03169052505b6060810151612c3890606461380c565b602082015160028501546001600160401b039290921691612c639190600160401b900460ff16613481565b1015612cc75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016103ff565b8315612cf057846001600160401b031681604001818151612ce89190613336565b905250612d0f565b846001600160401b031681604001818151612d0b919061346e565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b508054612d639061336b565b5f825580601f10612d72575050565b601f0160209004905f5260205f2090810190610d4991905b80821115612d9d575f8155600101612d8a565b5090565b5f60208284031215612db1575f80fd5b5035919050565b803563ffffffff81168114612dcb575f80fd5b919050565b5f60208284031215612de0575f80fd5b610d2f82612db8565b5f60808284031215612df9575f80fd5b50919050565b6001600160a01b0381168114610d49575f80fd5b5f8060a08385031215612e24575f80fd5b612e2e8484612de9565b91506080830135612e3e81612dff565b809150509250929050565b5f8060408385031215612e5a575f80fd5b82356001600160401b03811115612e6f575f80fd5b612e7b85828601612de9565b925050612e8a60208401612db8565b90509250929050565b80356001600160401b0381168114612dcb575f80fd5b5f8060408385031215612eba575f80fd5b82356001600160401b03811115612ecf575f80fd5b830160608186031215612ee0575f80fd5b9150612e8a60208401612e93565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f2557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f6060608401826001600160401b03169052565b506080830151612f7b60808401826001600160401b03169052565b5060a0830151612f9660a08401826001600160401b03169052565b5060c0830151612fb160c08401826001600160401b03169052565b5092915050565b5f60208284031215612fc8575f80fd5b8135612fd381612dff565b9392505050565b5f5b83811015612ff4578181015183820152602001612fdc565b50505f910152565b602081525f825180602084015261301a816040850160208701612fda565b601f01601f19169190910160400192915050565b5f6020828403121561303e575f80fd5b5051919050565b5f808335601e1984360301811261305a575f80fd5b8301803591506001600160401b03821115613073575f80fd5b6020019150600581901b360382131561308a575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130b9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130f9576130f96130c3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613127576131276130c3565b604052919050565b5f6001600160401b03821115613147576131476130c3565b50601f01601f191660200190565b5f60608236031215613165575f80fd5b61316d6130d7565b82358152602061317e818501612e93565b8183015260408401356001600160401b0381111561319a575f80fd5b840136601f8201126131aa575f80fd5b80356131bd6131b88261312f565b6130ff565b81815236848385010111156131d0575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516132d3818460208a01612fda565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613303816028840160208801612fda565b016028019695505050505050565b5f82516130b9818460208701612fda565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d3257610d32613322565b5f63ffffffff80831681810361336157613361613322565b6001019392505050565b600181811c9082168061337f57607f821691505b602082108103612df957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546133f68161336b565b806020870152604060018084165f8114613417576001811461343357613460565b60ff19851660408a0152604084151560051b8a01019550613460565b895f5260205f205f5b858110156134575781548b820186015290830190880161343c565b8a016040019650505b509398975050505050505050565b81810381811115610d3257610d32613322565b8082028115828204841417610d3257610d32613322565b80518015158114612dcb575f80fd5b5f80604083850312156134b8575f80fd5b82516001600160401b03808211156134ce575f80fd5b90840190606082870312156134e1575f80fd5b6134e96130d7565b825181526020808401516134fc81612dff565b82820152604084015183811115613511575f80fd5b80850194505087601f850112613525575f80fd5b835192506135356131b88461312f565b8381528882858701011115613548575f80fd5b61355784838301848801612fda565b8060408401525081955061356c818801613498565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561365c575f80fd5b610d2f82612e93565b5f808335601e1984360301811261367a575f80fd5b8301803591506001600160401b03821115613693575f80fd5b60200191503681900382131561308a575f80fd5b601f82111561049857805f5260205f20601f840160051c810160208510156136cc5750805b601f840160051c820191505b818110156136eb575f81556001016136d8565b5050505050565b81516001600160401b0381111561370b5761370b6130c3565b61371f81613719845461336b565b846136a7565b602080601f831160018114613752575f841561373b5750858301515b5f19600386901b1c1916600185901b1785556137a9565b5f85815260208120601f198616915b8281101561378057888601518255948401946001909101908401613761565b508582101561379d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b0380831681810361336157613361613322565b5f602082840312156137dc575f80fd5b813560ff81168114612fd3575f80fd5b6001600160401b03818116838216019080821115612fb157612fb1613322565b6001600160401b0381811683821602808216919082811461382f5761382f613322565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051613a0c380380613a0c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138bf8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e366004612ddc565b61030c565b005b610173610143366004612ddc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610133610194366004612e0b565b6104ca565b6101336101a7366004612e4e565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004612e84565b6105e6565b6101ef6101ea366004612ddc565b610d30565b6040516001600160401b03909116815260200161017d565b610133610d44565b610217603081565b60405160ff909116815260200161017d565b610173610237366004612ee4565b610d57565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e366004612ddc565b610d73565b6101336102a1366004612e0b565b610d87565b6102686005600160991b0181565b6101336102c2366004612ddc565b610f3f565b610217601481565b6102e26102dd366004612ddc565b61104e565b60405161017d9190612f3d565b6101ef6202a30081565b610133610307366004612ff3565b611141565b5f8181525f805160206138938339815191526020526040808220815160e0810190925280545f8051602061387383398151915293929190829060ff16600581111561035957610359612f29565b600581111561036a5761036a612f29565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d9612f29565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f61117b565b6040518263ffffffff1660e01b81526004016104849190613037565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c49190613069565b50505050565b6104d3816113a0565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b6105978787611718565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206138738339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea9190613069565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d6060850160408601612ff3565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd6060850185613080565b90501161083c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161043a565b5f61084a6060850185613080565b91505063ffffffff81106108b65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b606482015260840161043a565b5f8435602086013560146108d06060890160408a01612ff3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610c40575f6109506060890189613080565b8363ffffffff16818110610966576109666130cc565b905060200281019061097891906130e0565b61098190613190565b8051909150806109a35760405162461bcd60e51b815260040161043a90613227565b5f818152600988016020526040902054156109d05760405162461bcd60e51b815260040161043a90613268565b6040820151516030146109f55760405162461bcd60e51b815260040161043a906132b0565b84825f015183602001518460400151604051602001610a1794939291906132fd565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610a65919061334c565b602060405180830381855afa158015610a80573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aa39190613069565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610b2f57610b2f612f29565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610be2911686613371565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610c3990613384565b9050610934565b50600584018190555f610c5286611736565b90505f610c628260400151611910565b905080600285604051610c75919061334c565b602060405180830381855afa158015610c90573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cb39190613069565b14610d175760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610d3a8261104e565b6080015192915050565b610d4c611a79565b610d555f611ad4565b565b5f610d60611a79565b610d6a8383611b44565b90505b92915050565b610d7b611a79565b610d8481612028565b50565b5f805160206138738339815191525f610d9f83611736565b90505f80610db0836040015161231e565b9150915080610e125760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610e2c906133a6565b9050118015610e5e575060015f83815260088601602052604090205460ff166005811115610e5c57610e5c612f29565b145b610e7a5760405162461bcd60e51b815260040161043a906133d8565b5f8281526007850160205260408120610e9291612d92565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020613873833981519152929190610f87906133a6565b9050118015610fb9575060015f83815260088301602052604090205460ff166005811115610fb757610fb7612f29565b145b610fd55760405162461bcd60e51b815260040161043a906133d8565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161100e919060040161341f565b6020604051808303815f875af115801561102a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d39190613069565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061389383398151915290528390208351918201909352825491925f8051602061387383398151915292829060ff1660058111156110ce576110ce612f29565b60058111156110df576110df612f29565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611149611a79565b6001600160a01b03811661117257604051631e4fbdf760e01b81525f600482015260240161043a565b610d8481611ad4565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156111f4576111b48160016134a9565b6111bf9060086134bc565b5081515f908390839081106111d6576111d66130cc565b60200101906001600160f81b03191690815f1a9053506001016111a0565b505f5b600481101561125f5761120b8160036134a9565b6112169060086134bc565b600263ffffffff16901c60f81b828260026112319190613371565b81518110611241576112416130cc565b60200101906001600160f81b03191690815f1a9053506001016111f7565b505f5b60208110156112c15761127681601f6134a9565b6112819060086134bc565b86901c60f81b82611293836006613371565b815181106112a3576112a36130cc565b60200101906001600160f81b03191690815f1a905350600101611262565b505f5b600881101561132c576112d88160076134a9565b6112e39060086134bc565b6001600160401b038616901c60f81b826112fe836026613371565b8151811061130e5761130e6130cc565b60200101906001600160f81b03191690815f1a9053506001016112c4565b505f5b6008811015611397576113438160076134a9565b61134e9060086134bc565b6001600160401b038516901c60f81b8261136983602e613371565b81518110611379576113796130cc565b60200101906001600160f81b03191690815f1a90535060010161132f565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206138738339815191525f6113ef85611736565b90505f80611400836040015161231e565b9150915080156114655760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561149657611496612f29565b60058111156114a7576114a7612f29565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561151857611518612f29565b1480611536575060018251600581111561153457611534612f29565b145b6115955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b6003825160058111156115aa576115aa612f29565b036115b7575060046115bb565b5060055b6020808301515f908152600988019091526040812055818160058111156115e4576115e4612f29565b908160058111156115f7576115f7612f29565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561162b5761162b612f29565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156116df576116df612f29565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6117206124bf565b61172982612508565b61173281612521565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206138738339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156117ab573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117d291908101906134e2565b91509150806118325760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b82548251146118955760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b0316156119085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f81516026146119325760405162461bcd60e51b815260040161043a906135b4565b5f805b6002811015611981576119498160016134a9565b6119549060086134bc565b61ffff1684828151811061196a5761196a6130cc565b016020015160f81c901b9190911790600101611935565b5061ffff8116156119a45760405162461bcd60e51b815260040161043a906135fd565b5f805b60048110156119ff576119bb8160036134a9565b6119c69060086134bc565b63ffffffff16856119d8836002613371565b815181106119e8576119e86130cc565b016020015160f81c901b91909117906001016119a7565b5063ffffffff811615611a245760405162461bcd60e51b815260040161043a90613640565b5f805b602081101561139757611a3b81601f6134a9565b611a469060086134bc565b86611a52836006613371565b81518110611a6257611a626130cc565b016020015160f81c901b9190911790600101611a27565b33611aab7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d555760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611bcf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f8051602061387383398151915242611bee6040860160208701613687565b6001600160401b031611611c605760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611c706040850160208601613687565b6001600160401b0316611c866202a30042613371565b11611cf95760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611d175760405162461bcd60e51b815260040161043a90613227565b83355f90815260098201602052604090205415611d465760405162461bcd60e51b815260040161043a90613268565b6030611d5560408601866136a0565b905014611d745760405162461bcd60e51b815260040161043a906132b0565b611d7d83612532565b5f80611e176040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611dc29190613687565b6001600160401b03168152602001611ddd60408a018a6136a0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061253d565b5f82815260078601602052604090209193509150611e35828261372d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e62908590600401613037565b6020604051808303815f875af1158015611e7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea29190613069565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611f1a57611f1a612f29565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611ffa918e01908e01613687565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206138938339815191526020526040808220815160e0810190925280545f8051602061387383398151915293929190829060ff16600581111561207557612075612f29565b600581111561208657612086612f29565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156120f8576120f8612f29565b146121545760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b61216181608001516128ec565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156121a5576121a5612f29565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61225a84612254816128f6565b5f61117b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612289908590600401613037565b6020604051808303815f875af11580156122a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c99190613069565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146123415760405162461bcd60e51b815260040161043a906135b4565b5f805b6002811015612390576123588160016134a9565b6123639060086134bc565b61ffff16858281518110612379576123796130cc565b016020015160f81c901b9190911790600101612344565b5061ffff8116156123b35760405162461bcd60e51b815260040161043a906135fd565b5f805b600481101561240e576123ca8160036134a9565b6123d59060086134bc565b63ffffffff16866123e7836002613371565b815181106123f7576123f76130cc565b016020015160f81c901b91909117906001016123b6565b5063ffffffff81166003146124355760405162461bcd60e51b815260040161043a90613640565b5f805b602081101561248a5761244c81601f6134a9565b6124579060086134bc565b87612463836006613371565b81518110612473576124736130cc565b016020015160f81c901b9190911790600101612438565b505f8660268151811061249f5761249f6130cc565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d5557604051631afcd79f60e31b815260040160405180910390fd5b6125106124bf565b612518612986565b610d848161298e565b6125296124bf565b610d8481612b30565b610d84816001612b38565b5f60608260800151516030146125a75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561261e576125de8160016134a9565b6125e99060086134bc565b5081515f90839083908110612600576126006130cc565b60200101906001600160f81b03191690815f1a9053506001016125ca565b505f5b6004811015612686576126358160036134a9565b6126409060086134bc565b600160ff919091161c60f81b82612658836002613371565b81518110612668576126686130cc565b60200101906001600160f81b03191690815f1a905350600101612621565b505f5b60208110156126e357845181602081106126a5576126a56130cc565b1a60f81b826126b5836006613371565b815181106126c5576126c56130cc565b60200101906001600160f81b03191690815f1a905350600101612689565b505f5b60208110156127435784602001518160208110612705576127056130cc565b1a60f81b82612715836026613371565b81518110612725576127256130cc565b60200101906001600160f81b03191690815f1a9053506001016126e6565b505f5b60088110156127b75761275a8160076134a9565b6127659060086134bc565b60ff1685604001516001600160401b0316901c60f81b828260466127899190613371565b81518110612799576127996130cc565b60200101906001600160f81b03191690815f1a905350600101612746565b505f5b603081101561282257846080015181815181106127d9576127d96130cc565b01602001516001600160f81b031916826127f483604e613371565b81518110612804576128046130cc565b60200101906001600160f81b03191690815f1a9053506001016127ba565b505f5b6008811015612894576128398160076134a9565b6128449060086134bc565b60608601516001600160401b0390811691161c60f81b8261286683607e613371565b81518110612876576128766130cc565b60200101906001600160f81b03191690815f1a905350600101612825565b506002816040516128a5919061334c565b602060405180830381855afa1580156128c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128e39190613069565b94909350915050565b610d84815f612b38565b5f8181525f805160206138938339815191526020526040812060020180545f8051602061387383398151915291600160401b9091046001600160401b0316906008612940836137ec565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b610d556124bf565b6129966124bf565b80355f8051602061387383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146129e26080840160608501613807565b60ff161115612a4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f612a606080840160608501613807565b60ff1611612ac85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b612ad86080830160608401613807565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612b096060830160408401613687565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6111496124bf565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020613873833981519152914291901580612c1e575060028301548151612c1a916001600160401b031690613371565b8210155b15612c44576001600160401b038516606082015281815260408101516020820152612c63565b8481606001818151612c569190613827565b6001600160401b03169052505b6060810151612c73906064613847565b602082015160028501546001600160401b039290921691612c9e9190600160401b900460ff166134bc565b1015612d025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b8315612d2b57846001600160401b031681604001818151612d239190613371565b905250612d4a565b846001600160401b031681604001818151612d4691906134a9565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b508054612d9e906133a6565b5f825580601f10612dad575050565b601f0160209004905f5260205f2090810190610d8491905b80821115612dd8575f8155600101612dc5565b5090565b5f60208284031215612dec575f80fd5b5035919050565b803563ffffffff81168114612e06575f80fd5b919050565b5f60208284031215612e1b575f80fd5b610d6a82612df3565b5f60808284031215612e34575f80fd5b50919050565b6001600160a01b0381168114610d84575f80fd5b5f8060a08385031215612e5f575f80fd5b612e698484612e24565b91506080830135612e7981612e3a565b809150509250929050565b5f8060408385031215612e95575f80fd5b82356001600160401b03811115612eaa575f80fd5b612eb685828601612e24565b925050612ec560208401612df3565b90509250929050565b80356001600160401b0381168114612e06575f80fd5b5f8060408385031215612ef5575f80fd5b82356001600160401b03811115612f0a575f80fd5b830160608186031215612f1b575f80fd5b9150612ec560208401612ece565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f6057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f9b60608401826001600160401b03169052565b506080830151612fb660808401826001600160401b03169052565b5060a0830151612fd160a08401826001600160401b03169052565b5060c0830151612fec60c08401826001600160401b03169052565b5092915050565b5f60208284031215613003575f80fd5b813561300e81612e3a565b9392505050565b5f5b8381101561302f578181015183820152602001613017565b50505f910152565b602081525f8251806020840152613055816040850160208701613015565b601f01601f19169190910160400192915050565b5f60208284031215613079575f80fd5b5051919050565b5f808335601e19843603018112613095575f80fd5b8301803591506001600160401b038211156130ae575f80fd5b6020019150600581901b36038213156130c5575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130f4575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613134576131346130fe565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613162576131626130fe565b604052919050565b5f6001600160401b03821115613182576131826130fe565b50601f01601f191660200190565b5f606082360312156131a0575f80fd5b6131a8613112565b8235815260206131b9818501612ece565b8183015260408401356001600160401b038111156131d5575f80fd5b840136601f8201126131e5575f80fd5b80356131f86131f38261316a565b61313a565b818152368483850101111561320b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f855161330e818460208a01613015565b80830190508581526001600160401b0360c01b8560c01b166020820152835161333e816028840160208801613015565b016028019695505050505050565b5f82516130f4818460208701613015565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d6d57610d6d61335d565b5f63ffffffff80831681810361339c5761339c61335d565b6001019392505050565b600181811c908216806133ba57607f821691505b602082108103612e3457634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613431816133a6565b806020870152604060018084165f8114613452576001811461346e5761349b565b60ff19851660408a0152604084151560051b8a0101955061349b565b895f5260205f205f5b858110156134925781548b8201860152908301908801613477565b8a016040019650505b509398975050505050505050565b81810381811115610d6d57610d6d61335d565b8082028115828204841417610d6d57610d6d61335d565b80518015158114612e06575f80fd5b5f80604083850312156134f3575f80fd5b82516001600160401b0380821115613509575f80fd5b908401906060828703121561351c575f80fd5b613524613112565b8251815260208084015161353781612e3a565b8282015260408401518381111561354c575f80fd5b80850194505087601f850112613560575f80fd5b835192506135706131f38461316a565b8381528882858701011115613583575f80fd5b61359284838301848801613015565b806040840152508195506135a78188016134d3565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f60208284031215613697575f80fd5b610d6a82612ece565b5f808335601e198436030181126136b5575f80fd5b8301803591506001600160401b038211156136ce575f80fd5b6020019150368190038213156130c5575f80fd5b601f8211156104d357805f5260205f20601f840160051c810160208510156137075750805b601f840160051c820191505b81811015613726575f8155600101613713565b5050505050565b81516001600160401b03811115613746576137466130fe565b61375a8161375484546133a6565b846136e2565b602080601f83116001811461378d575f84156137765750858301515b5f19600386901b1c1916600185901b1785556137e4565b5f85815260208120601f198616915b828110156137bb5788860151825594840194600190910190840161379c565b50858210156137d857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b0380831681810361339c5761339c61335d565b5f60208284031215613817575f80fd5b813560ff8116811461300e575f80fd5b6001600160401b03818116838216019080821115612fec57612fec61335d565b6001600160401b0381811683821602808216919082811461386a5761386a61335d565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -243,6 +243,68 @@ func (_PoAValidatorManager *PoAValidatorManagerTransactorRaw) Transact(opts *bin return _PoAValidatorManager.Contract.contract.Transact(opts, method, params...) } +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_PoAValidatorManager *PoAValidatorManagerCaller) ADDRESSLENGTH(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "ADDRESS_LENGTH") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_PoAValidatorManager *PoAValidatorManagerSession) ADDRESSLENGTH() (uint32, error) { + return _PoAValidatorManager.Contract.ADDRESSLENGTH(&_PoAValidatorManager.CallOpts) +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) ADDRESSLENGTH() (uint32, error) { + return _PoAValidatorManager.Contract.ADDRESSLENGTH(&_PoAValidatorManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerCaller) BLSPUBLICKEYLENGTH(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "BLS_PUBLIC_KEY_LENGTH") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _PoAValidatorManager.Contract.BLSPUBLICKEYLENGTH(&_PoAValidatorManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _PoAValidatorManager.Contract.BLSPUBLICKEYLENGTH(&_PoAValidatorManager.CallOpts) +} + // MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. // // Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 858c91f4d..844c26cc2 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -59,6 +59,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida uint8 public constant MAXIMUM_CHURN_PERCENTAGE_LIMIT = 20; uint64 public constant MAXIMUM_REGISTRATION_EXPIRY_LENGTH = 2 days; + uint32 public constant ADDRESS_LENGTH = 20; // This is only used as a packed uint32 + uint8 public constant BLS_PUBLIC_KEY_LENGTH = 48; // solhint-disable ordering function _getValidatorManagerStorage() @@ -125,7 +127,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); require(!$._initializedValidatorSet, "ValidatorManager: already initialized validator set"); require( - subnetConversionData.blockchainID == WARP_MESSENGER.getBlockchainID(), + subnetConversionData.validatorManagerBlockchainID == WARP_MESSENGER.getBlockchainID(), "ValidatorManager: invalid blockchain ID" ); require( @@ -144,8 +146,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's subnetConversionID. bytes memory encodedConversion = abi.encodePacked( subnetConversionData.convertSubnetTxID, - subnetConversionData.blockchainID, - uint32(20), + subnetConversionData.validatorManagerBlockchainID, + ADDRESS_LENGTH, subnetConversionData.validatorManagerAddress, uint32(numInitialValidators) ); @@ -159,7 +161,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida "ValidatorManager: node ID already active" ); require( - initialValidator.blsPublicKey.length == 48, + initialValidator.blsPublicKey.length == BLS_PUBLIC_KEY_LENGTH, "ValidatorManager: invalid blsPublicKey length" ); @@ -211,6 +213,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida /** * @notice Begins the validator registration process, and sets the initial weight for the validator. + * This is the only method related to validator registration and removal that needs the initializedValidatorSet + * modifier. All others are guarded by checking the validator status changes initialized in this function. * @param input The inputs for a validator registration. * @param weight The weight of the validator being registered. */ @@ -235,7 +239,10 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida $._activeValidators[input.nodeID] == bytes32(0), "ValidatorManager: node ID already active" ); - require(input.blsPublicKey.length == 48, "ValidatorManager: invalid blsPublicKey length"); + require( + input.blsPublicKey.length == BLS_PUBLIC_KEY_LENGTH, + "ValidatorManager: invalid blsPublicKey length" + ); // Check that adding this validator would not exceed the maximum churn rate. _checkAndUpdateChurnTrackerAddition(weight); diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index 21d12e90a..fb0836ef2 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -44,6 +44,22 @@ library ValidatorMessages { // TODO: The implementation of these packing and unpacking functions is neither tested nor optimized at all. // Full test coverage should be provided, and the implementation should be optimized for gas efficiency. + /** + * @notice Packs a SubnetConversionMessage message into a byte array. + * The message format specification is: + * +--------------------+----------+----------+ + * | codecID : uint16 | 2 bytes | + * +--------------------+----------+----------+ + * | typeID : uint32 | 4 bytes | + * +--------------------+----------+----------+ + * | subnetConversionID : [32]byte | 32 bytes | + * +--------------------+----------+----------+ + * | 38 bytes | + * +----------+ + * + * @param subnetConversionID The subnet conversion ID to pack into the message. + * @return The packed message. + */ function packSubnetConversionMessage(bytes32 subnetConversionID) internal pure @@ -66,6 +82,13 @@ library ValidatorMessages { return res; } + /** + * @notice Unpacks a byte array as a SubnetConversionMessage message. + * 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. + */ function unpackSubnetConversionMessage(bytes memory input) internal pure returns (bytes32) { require(input.length == 38, "ValidatorMessages: invalid message length"); diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 78be44d0b..8ce265f63 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -40,7 +40,7 @@ struct ValidatorManagerSettings { struct SubnetConversionData { bytes32 convertSubnetTxID; - bytes32 blockchainID; + bytes32 validatorManagerBlockchainID; address validatorManagerAddress; InitialValidator[] initialValidators; } diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 54662f1b5..22cc80c35 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -435,7 +435,7 @@ abstract contract ValidatorManagerTest is Test { }); return SubnetConversionData({ convertSubnetTxID: bytes32(0), - blockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, + validatorManagerBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, validatorManagerAddress: address(validatorManager), initialValidators: initialValidators }); From 260b8a10dca8d27bef00e8159a8d07d3d7b0210a Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 18 Sep 2024 13:27:39 -0500 Subject: [PATCH 337/545] remove subnetConversionData validity checks --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager/PoAValidatorManager.go | 2 +- contracts/staking/ValidatorManager.sol | 15 +++------------ 4 files changed, 6 insertions(+), 15 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index eab52363c..4bd72567b 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615df4380380615df483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615ca78061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f366004614f95565b6103bf565b005b610184610194366004614fd0565b610850565b6101d76101a7366004614fd0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b610217610212366004614fd0565b610a09565b6040516001600160401b0390911681526020016101e1565b61018461023d366004614ffb565b610a1f565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c366004615039565b610afe565b61018461027f366004615052565b610b51565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af36600461507a565b610d26565b6101d76102c23660046150de565b611470565b6102176102d5366004614fd0565b611489565b6101846102e8366004614f95565b61149d565b6101f2603081565b610184610303366004615052565b61157e565b6101d76103163660046150f7565b6117ab565b610184610329366004615039565b6117d7565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b610184610362366004614fd0565b61198f565b610184610375366004614fd0565b611c15565b6101f2601481565b610395610390366004614fd0565b611d29565b6040516101e1919061512b565b6102176202a30081565b6101d76103ba3660046151f2565b611e1c565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615bfb8339815191529184156104115761040e8285611e51565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561044357610443615117565b600481111561045457610454615117565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104db576104db615117565b1461052d5760405162461bcd60e51b815260206004820152602a60248201525f80516020615c1b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105925760405162461bcd60e51b815260206004820152603360248201525f80516020615c1b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610524565b5f61059c846120ed565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105e9576105e9615117565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106bb85611d29565b905082606001516001600160401b031681608001516001600160401b0316116107325760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610524565b60028151600581111561074757610747615117565b0361075957610759836060015161217d565b5f8360600151826080015161076e919061526b565b905061077a868261218a565b5f6005600160991b0163ee5b48eb6107938987866121d2565b6040518263ffffffff1660e01b81526004016107af91906152ad565b6020604051808303815f875af11580156107cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ef91906152df565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020615c7b8339815191526020526040808220815160e0810190925280545f80516020615c3b83398151915293929190829060ff16600581111561089d5761089d615117565b60058111156108ae576108ae615117565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561091d5761091d615117565b146109825760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610524565b6005600160991b016001600160a01b031663ee5b48eb6109a78584606001515f6121d2565b6040518263ffffffff1660e01b81526004016109c391906152ad565b6020604051808303815f875af11580156109df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0391906152df565b50505050565b5f610a1964e8d4a51000836152f6565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a68575080546001600160401b03808416911610155b15610a865760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ab184846123f9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615bfb8339815191525f80610b1784612413565b6040808201515f848152600588016020529190912054929450909250610a03916001600160401b03909116906001600160a01b031661278b565b5f80516020615bfb8339815191525f610b69846127c1565b90505f80610b7a836040015161299b565b50915091505f610b8983611d29565b9050816001600160401b031681606001516001600160401b03161015610bc15760405162461bcd60e51b815260040161052490615315565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c065760405162461bcd60e51b815260040161052490615357565b60015f87815260068701602052604090205460ff166004811115610c2c57610c2c615117565b14610c955760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610524565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615c3b8339815191529060ff1615610dc35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610524565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2a91906152df565b836020013514610e8c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610524565b30610e9d60608501604086016153a0565b6001600160a01b031614610f0f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610524565b5f610f1d60608501856153bb565b905011610f7c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b6064820152608401610524565b5f610f8a60608501856153bb565b91505063ffffffff8110610ff65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b6064820152608401610524565b5f8435602086013560146110106060890160408a016153a0565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611380575f61109060608901896153bb565b8363ffffffff168181106110a6576110a6615407565b90506020028101906110b8919061541b565b6110c1906154cb565b8051909150806110e35760405162461bcd60e51b815260040161052490615562565b5f818152600988016020526040902054156111105760405162461bcd60e51b8152600401610524906155a3565b6040820151516030146111355760405162461bcd60e51b8152600401610524906155eb565b84825f0151836020015184604001516040516020016111579493929190615638565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916111a59190615687565b602060405180830381855afa1580156111c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111e391906152df565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561126f5761126f615117565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611322911686615698565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611379906156ab565b9050611074565b50600584018190555f611392866127c1565b90505f6113a28260400151612bd6565b9050806002856040516113b59190615687565b602060405180830381855afa1580156113d0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113f391906152df565b146114575760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610524565b505050600a909201805460ff1916600117905550505050565b5f610a196001600160401b03831664e8d4a510006156cd565b5f61149382611d29565b6080015192915050565b5f80516020615bfb8339815191525f6114b585611d29565b5f86815260058401602052604090205460a08201519192506114e891600160b01b9091046001600160401b0316906156e4565b6001600160401b031642101561155c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610524565b831561156e5761156c8584611e51565b505b61157785612d48565b5050505050565b61158661303e565b5f80516020615bfb8339815191525f61159e846127c1565b90505f806115af836040015161299b565b50915091505f6115be83611d29565b9050816001600160401b031681606001516001600160401b031610156115f65760405162461bcd60e51b815260040161052490615315565b5f8681526006860160205260409020600301546001600160401b03808416911611156116345760405162461bcd60e51b815260040161052490615357565b60035f87815260068701602052604090205460ff16600481111561165a5761165a615117565b146116ae5760405162461bcd60e51b815260206004820152603160248201525f80516020615c1b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610524565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526117539161278b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506117a760015f80516020615c5b83398151915255565b5050565b5f6117b461303e565b6117bf833384613088565b9050610a1960015f80516020615c5b83398151915255565b5f80516020615c3b8339815191525f6117ef836127c1565b90505f806118008360400151613501565b91509150806118625760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610524565b5f8281526007850160205260408120805461187c90615704565b90501180156118ae575060015f83815260088601602052604090205460ff1660058111156118ac576118ac615117565b145b6118ca5760405162461bcd60e51b81526004016105249061573c565b5f82815260078501602052604081206118e291614f26565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bfb83398151915293929190829060ff1660048111156119f0576119f0615117565b6004811115611a0157611a01615117565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a8857611a88615117565b1480611aa65750600381516004811115611aa457611aa4615117565b145b611afa5760405162461bcd60e51b815260206004820152603260248201525f80516020615c1b833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610524565b5f611b088260400151611d29565b905080606001516001600160401b03165f03611b8c5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610524565b6005600160991b016001600160a01b031663ee5b48eb611bb98460400151846060015185608001516121d2565b6040518263ffffffff1660e01b8152600401611bd591906152ad565b6020604051808303815f875af1158015611bf1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061157791906152df565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615c3b833981519152929190611c5d90615704565b9050118015611c8f575060015f83815260088301602052604090205460ff166005811115611c8d57611c8d615117565b145b611cab5760405162461bcd60e51b81526004016105249061573c565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ce49190600401615783565b6020604051808303815f875af1158015611d00573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d2491906152df565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020615c7b83398151915290528390208351918201909352825491925f80516020615c3b83398151915292829060ff166005811115611da957611da9615117565b6005811115611dba57611dba615117565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611e2561303e565b611e31858585856136a2565b9050611e4960015f80516020615c5b83398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e9c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ec39190810190615818565b9150915080611f265760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610524565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8d91906152df565b825114611ff15760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610524565b60208201516001600160a01b0316156120675760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610524565b5f806120768460400151613917565b915091508187146120e35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610524565b9695505050505050565b5f8181525f80516020615c7b8339815191526020526040812060020180545f80516020615c3b83398151915291600160401b9091046001600160401b0316906008612137836158ea565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b612187815f613aef565b50565b5f9182525f80516020615c7b833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561224b5761220b816001615905565b6122169060086156cd565b5081515f9083908390811061222d5761222d615407565b60200101906001600160f81b03191690815f1a9053506001016121f7565b505f5b60048110156122b657612262816003615905565b61226d9060086156cd565b600263ffffffff16901c60f81b828260026122889190615698565b8151811061229857612298615407565b60200101906001600160f81b03191690815f1a90535060010161224e565b505f5b6020811015612318576122cd81601f615905565b6122d89060086156cd565b86901c60f81b826122ea836006615698565b815181106122fa576122fa615407565b60200101906001600160f81b03191690815f1a9053506001016122b9565b505f5b60088110156123835761232f816007615905565b61233a9060086156cd565b6001600160401b038616901c60f81b82612355836026615698565b8151811061236557612365615407565b60200101906001600160f81b03191690815f1a90535060010161231b565b505f5b60088110156123ee5761239a816007615905565b6123a59060086156cd565b6001600160401b038516901c60f81b826123c083602e615698565b815181106123d0576123d0615407565b60200101906001600160f81b03191690815f1a905350600101612386565b5090505b9392505050565b612401613d49565b61240a82613d94565b6117a781613e08565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f80516020615c3b8339815191525f612462856127c1565b90505f806124738360400151613501565b9150915080156124d85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610524565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561250957612509615117565b600581111561251a5761251a615117565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561258b5761258b615117565b14806125a957506001825160058111156125a7576125a7615117565b145b6126085760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610524565b60038251600581111561261d5761261d615117565b0361262a5750600461262e565b5060055b6020808301515f9081526009880190915260408120558181600581111561265757612657615117565b9081600581111561266a5761266a615117565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561269e5761269e615117565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561275257612752615117565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546117a7906001600160a01b03168284613ebc565b60408051606080820183525f8083526020830181905292820152905f80516020615c3b8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612836573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261285d9190810190615818565b91509150806128bd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610524565b82548251146129205760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610524565b60208201516001600160a01b0316156129935760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610524565b509392505050565b5f805f83516036146129bf5760405162461bcd60e51b815260040161052490615918565b5f805b6002811015612a0e576129d6816001615905565b6129e19060086156cd565b61ffff168682815181106129f7576129f7615407565b016020015160f81c901b91909117906001016129c2565b5061ffff811615612a315760405162461bcd60e51b815260040161052490615961565b5f805b6004811015612a8c57612a48816003615905565b612a539060086156cd565b63ffffffff1687612a65836002615698565b81518110612a7557612a75615407565b016020015160f81c901b9190911790600101612a34565b5063ffffffff8116600414612ab35760405162461bcd60e51b8152600401610524906159a4565b5f805b6020811015612b0857612aca81601f615905565b612ad59060086156cd565b88612ae1836006615698565b81518110612af157612af1615407565b016020015160f81c901b9190911790600101612ab6565b505f805b6008811015612b6757612b20816007615905565b612b2b9060086156cd565b6001600160401b031689612b40836026615698565b81518110612b5057612b50615407565b016020015160f81c901b9190911790600101612b0c565b505f805b6008811015612bc657612b7f816007615905565b612b8a9060086156cd565b6001600160401b03168a612b9f83602e615698565b81518110612baf57612baf615407565b016020015160f81c901b9190911790600101612b6b565b5091989097509095509350505050565b5f8151602614612bf85760405162461bcd60e51b815260040161052490615918565b5f805b6002811015612c4757612c0f816001615905565b612c1a9060086156cd565b61ffff16848281518110612c3057612c30615407565b016020015160f81c901b9190911790600101612bfb565b5061ffff811615612c6a5760405162461bcd60e51b815260040161052490615961565b5f805b6004811015612cc557612c81816003615905565b612c8c9060086156cd565b63ffffffff1685612c9e836002615698565b81518110612cae57612cae615407565b016020015160f81c901b9190911790600101612c6d565b5063ffffffff811615612cea5760405162461bcd60e51b8152600401610524906159a4565b5f805b6020811015612d3f57612d0181601f615905565b612d0c9060086156cd565b86612d18836006615698565b81518110612d2857612d28615407565b016020015160f81c901b9190911790600101612ced565b50949350505050565b5f8181525f80516020615c7b8339815191526020526040808220815160e0810190925280545f80516020615c3b83398151915293929190829060ff166005811115612d9557612d95615117565b6005811115612da657612da6615117565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612e1857612e18615117565b14612e745760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610524565b612e81816080015161217d565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff19166001836005811115612ec557612ec5615117565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612f7a84612f74816120ed565b5f6121d2565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612fa99085906004016152ad565b6020604051808303815f875af1158015612fc5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fe991906152df565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615c5b83398151915280546001190161306f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615c5b83398151915255565b5f5f80516020615bfb833981519152816130a461021285613f1b565b90505f6130b087611d29565b90506002815160058111156130c7576130c7615117565b146131265760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610524565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166131b95760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610524565b6131c282613f51565b5f8282608001516131d391906156e4565b600485015460408401519192506131f5916001600160401b03909116906159eb565b6001600160401b0316816001600160401b031611156132745760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610524565b61327e888261218a565b5f613288896120ed565b90505f89826040516020016132b492919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6132ee8d86886121d2565b6040518263ffffffff1660e01b815260040161330a91906152ad565b6020604051808303815f875af1158015613326573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061334a91906152df565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156133d2576133d2615117565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f8082516027146135245760405162461bcd60e51b815260040161052490615918565b5f805b60028110156135735761353b816001615905565b6135469060086156cd565b61ffff1685828151811061355c5761355c615407565b016020015160f81c901b9190911790600101613527565b5061ffff8116156135965760405162461bcd60e51b815260040161052490615961565b5f805b60048110156135f1576135ad816003615905565b6135b89060086156cd565b63ffffffff16866135ca836002615698565b815181106135da576135da615407565b016020015160f81c901b9190911790600101613599565b5063ffffffff81166003146136185760405162461bcd60e51b8152600401610524906159a4565b5f805b602081101561366d5761362f81601f615905565b61363a9060086156cd565b87613646836006615698565b8151811061365657613656615407565b016020015160f81c901b919091179060010161361b565b505f8660268151811061368257613682615407565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bfb8339815191529061ffff8616108015906136ee575061271061ffff861611155b61370a5760405162461bcd60e51b815260040161052490615a16565b60028101546001600160401b0390811690851610156137835760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610524565b80548310156137e65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610524565b806001015483111561384d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610524565b5f61385784613f1b565b90505f61386382610a09565b90505f6138708983613f5c565b905060405180606001604052806138843390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e1461393a5760405162461bcd60e51b815260040161052490615918565b5f805b600281101561398957613951816001615905565b61395c9060086156cd565b61ffff1685828151811061397257613972615407565b016020015160f81c901b919091179060010161393d565b5061ffff8116156139ac5760405162461bcd60e51b815260040161052490615961565b5f805b6004811015613a07576139c3816003615905565b6139ce9060086156cd565b63ffffffff16866139e0836002615698565b815181106139f0576139f0615407565b016020015160f81c901b91909117906001016139af565b5063ffffffff8116600514613a2e5760405162461bcd60e51b8152600401610524906159a4565b5f805b6020811015613a8357613a4581601f615905565b613a509060086156cd565b87613a5c836006615698565b81518110613a6c57613a6c615407565b016020015160f81c901b9190911790600101613a31565b505f805b6008811015613ae257613a9b816007615905565b613aa69060086156cd565b6001600160401b031688613abb836026615698565b81518110613acb57613acb615407565b016020015160f81c901b9190911790600101613a87565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615c3b833981519152914291901580613bd5575060028301548151613bd1916001600160401b031690615698565b8210155b15613bfb576001600160401b038516606082015281815260408101516020820152613c1a565b8481606001818151613c0d91906156e4565b6001600160401b03169052505b6060810151613c2a9060646159eb565b602082015160028501546001600160401b039290921691613c559190600160401b900460ff166156cd565b1015613cb95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610524565b8315613ce257846001600160401b031681604001818151613cda9190615698565b905250613d01565b846001600160401b031681604001818151613cfd9190615905565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d9257604051631afcd79f60e31b815260040160405180910390fd5b565b613d9c613d49565b613da581614440565b613dad614459565b612187608082013560a0830135613dca60e0850160c086016150de565b613ddb610100860160e08701615a61565b61ffff16613df161012087016101008801615a7a565b613e03610140880161012089016153a0565b614469565b613e10613d49565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613e9c5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610524565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611d2491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146ad565b5f610a19827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b03169061470e565b612187816001613aef565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613fe75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610524565b5f80516020615c3b8339815191524261400660408601602087016150de565b6001600160401b0316116140785760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610524565b61408860408501602086016150de565b6001600160401b031661409e6202a30042615698565b116141115760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610524565b833561412f5760405162461bcd60e51b815260040161052490615562565b83355f9081526009820160205260409020541561415e5760405162461bcd60e51b8152600401610524906155a3565b603061416d6040860186615a9a565b90501461418c5760405162461bcd60e51b8152600401610524906155eb565b61419583613f51565b5f8061422f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906141da91906150de565b6001600160401b031681526020016141f560408a018a615a9a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614870565b5f8281526007860160205260409020919350915061424d8282615b20565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061427a9085906004016152ad565b6020604051808303815f875af1158015614296573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142ba91906152df565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561433257614332615117565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614412918e01908e016150de565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614448613d49565b614450614c1f565b61218781614c27565b614461613d49565b613d92614dc9565b614471613d49565b5f80516020615bfb833981519152836144dd5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610524565b6127108411156144ff5760405162461bcd60e51b815260040161052490615a16565b858711156145675760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610524565b5f8360ff16116145d45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610524565b600a60ff841611156146465760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610524565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6146c16001600160a01b03841683614dd1565b905080515f141580156146e55750808060200190518101906146e39190615bdf565b155b15611d2457604051635274afe760e01b81526001600160a01b0384166004820152602401610524565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614754573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061477891906152df565b905061478f6001600160a01b038516333086614dde565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156147d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147f791906152df565b905081811161485d5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610524565b6148678282615905565b95945050505050565b5f60608260800151516030146148da5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610524565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561495157614911816001615905565b61491c9060086156cd565b5081515f9083908390811061493357614933615407565b60200101906001600160f81b03191690815f1a9053506001016148fd565b505f5b60048110156149b957614968816003615905565b6149739060086156cd565b600160ff919091161c60f81b8261498b836002615698565b8151811061499b5761499b615407565b60200101906001600160f81b03191690815f1a905350600101614954565b505f5b6020811015614a1657845181602081106149d8576149d8615407565b1a60f81b826149e8836006615698565b815181106149f8576149f8615407565b60200101906001600160f81b03191690815f1a9053506001016149bc565b505f5b6020811015614a765784602001518160208110614a3857614a38615407565b1a60f81b82614a48836026615698565b81518110614a5857614a58615407565b60200101906001600160f81b03191690815f1a905350600101614a19565b505f5b6008811015614aea57614a8d816007615905565b614a989060086156cd565b60ff1685604001516001600160401b0316901c60f81b82826046614abc9190615698565b81518110614acc57614acc615407565b60200101906001600160f81b03191690815f1a905350600101614a79565b505f5b6030811015614b555784608001518181518110614b0c57614b0c615407565b01602001516001600160f81b03191682614b2783604e615698565b81518110614b3757614b37615407565b60200101906001600160f81b03191690815f1a905350600101614aed565b505f5b6008811015614bc757614b6c816007615905565b614b779060086156cd565b60608601516001600160401b0390811691161c60f81b82614b9983607e615698565b81518110614ba957614ba9615407565b60200101906001600160f81b03191690815f1a905350600101614b58565b50600281604051614bd89190615687565b602060405180830381855afa158015614bf3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c1691906152df565b94909350915050565b613d92613d49565b614c2f613d49565b80355f80516020615c3b83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c7b6080840160608501615a7a565b60ff161115614ce85760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610524565b5f614cf96080840160608501615a7a565b60ff1611614d615760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610524565b614d716080830160608401615a7a565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614da260608301604084016150de565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613075613d49565b60606123f283835f614e17565b6040516001600160a01b038481166024830152838116604483015260648201839052610a039186918216906323b872dd90608401613ee9565b606081471015614e3c5760405163cd78605960e01b8152306004820152602401610524565b5f80856001600160a01b03168486604051614e579190615687565b5f6040518083038185875af1925050503d805f8114614e91576040519150601f19603f3d011682016040523d82523d5f602084013e614e96565b606091505b50915091506120e3868383606082614eb657614eb182614efd565b6123f2565b8151158015614ecd57506001600160a01b0384163b155b15614ef657604051639996b31560e01b81526001600160a01b0385166004820152602401610524565b50806123f2565b805115614f0d5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614f3290615704565b5f825580601f10614f41575050565b601f0160209004905f5260205f209081019061218791905b80821115614f6c575f8155600101614f59565b5090565b8015158114612187575f80fd5b803563ffffffff81168114614f90575f80fd5b919050565b5f805f60608486031215614fa7575f80fd5b833592506020840135614fb981614f70565b9150614fc760408501614f7d565b90509250925092565b5f60208284031215614fe0575f80fd5b5035919050565b6001600160a01b0381168114612187575f80fd5b5f8082840361016081121561500e575f80fd5b6101408082121561501d575f80fd5b849350830135905061502e81614fe7565b809150509250929050565b5f60208284031215615049575f80fd5b6123f282614f7d565b5f8060408385031215615063575f80fd5b61506c83614f7d565b946020939093013593505050565b5f806040838503121561508b575f80fd5b82356001600160401b038111156150a0575f80fd5b8301608081860312156150b1575f80fd5b91506150bf60208401614f7d565b90509250929050565b80356001600160401b0381168114614f90575f80fd5b5f602082840312156150ee575f80fd5b6123f2826150c8565b5f8060408385031215615108575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061514e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161518960608401826001600160401b03169052565b5060808301516151a460808401826001600160401b03169052565b5060a08301516151bf60a08401826001600160401b03169052565b5060c08301516151da60c08401826001600160401b03169052565b5092915050565b803561ffff81168114614f90575f80fd5b5f805f8060808587031215615205575f80fd5b84356001600160401b0381111561521a575f80fd5b85016060818803121561522b575f80fd5b9350615239602086016151e1565b9250615247604086016150c8565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156151da576151da615257565b5f5b838110156152a557818101518382015260200161528d565b50505f910152565b602081525f82518060208401526152cb81604085016020870161528b565b601f01601f19169190910160400192915050565b5f602082840312156152ef575f80fd5b5051919050565b5f8261531057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156153b0575f80fd5b81356123f281614fe7565b5f808335601e198436030181126153d0575f80fd5b8301803591506001600160401b038211156153e9575f80fd5b6020019150600581901b3603821315615400575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261542f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561546f5761546f615439565b60405290565b604051601f8201601f191681016001600160401b038111828210171561549d5761549d615439565b604052919050565b5f6001600160401b038211156154bd576154bd615439565b50601f01601f191660200190565b5f606082360312156154db575f80fd5b6154e361544d565b8235815260206154f48185016150c8565b8183015260408401356001600160401b03811115615510575f80fd5b840136601f820112615520575f80fd5b803561553361552e826154a5565b615475565b8181523684838501011115615546575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f8551615649818460208a0161528b565b80830190508581526001600160401b0360c01b8560c01b166020820152835161567981602884016020880161528b565b016028019695505050505050565b5f825161542f81846020870161528b565b80820180821115610a1957610a19615257565b5f63ffffffff8083168181036156c3576156c3615257565b6001019392505050565b8082028115828204841417610a1957610a19615257565b6001600160401b038181168382160190808211156151da576151da615257565b600181811c9082168061571857607f821691505b60208210810361573657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461579581615704565b806020870152604060018084165f81146157b657600181146157d2576157ff565b60ff19851660408a0152604084151560051b8a010195506157ff565b895f5260205f205f5b858110156157f65781548b82018601529083019088016157db565b8a016040019650505b509398975050505050505050565b8051614f9081614f70565b5f8060408385031215615829575f80fd5b82516001600160401b038082111561583f575f80fd5b9084019060608287031215615852575f80fd5b61585a61544d565b8251815260208084015161586d81614fe7565b82820152604084015183811115615882575f80fd5b80850194505087601f850112615896575f80fd5b835192506158a661552e846154a5565b83815288828587010111156158b9575f80fd5b6158c88483830184880161528b565b806040840152508195506158dd81880161580d565b9450505050509250929050565b5f6001600160401b038083168181036156c3576156c3615257565b81810381811115610a1957610a19615257565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0e57615a0e615257565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f60208284031215615a71575f80fd5b6123f2826151e1565b5f60208284031215615a8a575f80fd5b813560ff811681146123f2575f80fd5b5f808335601e19843603018112615aaf575f80fd5b8301803591506001600160401b03821115615ac8575f80fd5b602001915036819003821315615400575f80fd5b601f821115611d2457805f5260205f20601f840160051c81016020851015615b015750805b601f840160051c820191505b81811015611577575f8155600101615b0d565b81516001600160401b03811115615b3957615b39615439565b615b4d81615b478454615704565b84615adc565b602080601f831160018114615b80575f8415615b695750858301515b5f19600386901b1c1916600185901b178555615bd7565b5f85815260208120601f198616915b82811015615bae57888601518255948401946001909101908401615b8f565b5085821015615bcb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615bef575f80fd5b81516123f281614f7056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615cd0380380615cd083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615b838061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f366004614eff565b6103bf565b005b610184610194366004614f3a565b610850565b6101d76101a7366004614f3a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b610217610212366004614f3a565b610a09565b6040516001600160401b0390911681526020016101e1565b61018461023d366004614f65565b610a1f565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c366004614fa3565b610afe565b61018461027f366004614fbc565b610b51565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af366004614fe4565b610d26565b6101d76102c2366004615048565b61135a565b6102176102d5366004614f3a565b611373565b6101846102e8366004614eff565b611387565b6101f2603081565b610184610303366004614fbc565b611468565b6101d7610316366004615061565b611695565b610184610329366004614fa3565b6116c1565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b610184610362366004614f3a565b611879565b610184610375366004614f3a565b611aff565b6101f2601481565b610395610390366004614f3a565b611c13565b6040516101e19190615095565b6102176202a30081565b6101d76103ba36600461515c565b611d06565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615ad78339815191529184156104115761040e8285611d3b565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561044357610443615081565b600481111561045457610454615081565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156104db576104db615081565b1461052d5760405162461bcd60e51b815260206004820152602a60248201525f80516020615af78339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b031633146105925760405162461bcd60e51b815260206004820152603360248201525f80516020615af78339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610524565b5f61059c84611fd7565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156105e9576105e9615081565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6106bb85611c13565b905082606001516001600160401b031681608001516001600160401b0316116107325760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b6064820152608401610524565b60028151600581111561074757610747615081565b03610759576107598360600151612067565b5f8360600151826080015161076e91906151d5565b905061077a8682612074565b5f6005600160991b0163ee5b48eb6107938987866120bc565b6040518263ffffffff1660e01b81526004016107af9190615217565b6020604051808303815f875af11580156107cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107ef9190615249565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f80516020615b578339815191526020526040808220815160e0810190925280545f80516020615b1783398151915293929190829060ff16600581111561089d5761089d615081565b60058111156108ae576108ae615081565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561091d5761091d615081565b146109825760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610524565b6005600160991b016001600160a01b031663ee5b48eb6109a78584606001515f6120bc565b6040518263ffffffff1660e01b81526004016109c39190615217565b6020604051808303815f875af11580156109df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a039190615249565b50505050565b5f610a1964e8d4a5100083615260565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a68575080546001600160401b03808416911610155b15610a865760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ab184846122e3565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ad78339815191525f80610b17846122fd565b6040808201515f848152600588016020529190912054929450909250610a03916001600160401b03909116906001600160a01b0316612675565b5f80516020615ad78339815191525f610b69846126ab565b90505f80610b7a8360400151612885565b50915091505f610b8983611c13565b9050816001600160401b031681606001516001600160401b03161015610bc15760405162461bcd60e51b81526004016105249061527f565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c065760405162461bcd60e51b8152600401610524906152c1565b60015f87815260068701602052604090205460ff166004811115610c2c57610c2c615081565b14610c955760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610524565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615b178339815191529060ff1615610dc35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610524565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e06573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e2a9190615249565b836020013514610e8c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610524565b30610e9d606085016040860161530a565b6001600160a01b031614610f0f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610524565b5f610f1d6060850185615325565b91505f9050843560208601356014610f3b6060890160408a0161530a565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561126a575f610fbb6060890189615325565b8363ffffffff16818110610fd157610fd1615371565b9050602002810190610fe39190615385565b610fec90615435565b80515f818152600989016020526040902054919250901561101f5760405162461bcd60e51b8152600401610524906154cc565b84825f0151836020015184604001516040516020016110419493929190615514565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161108f9190615563565b602060405180830381855afa1580156110aa573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110cd9190615249565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561115957611159615081565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161120c911686615574565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061126390615587565b9050610f9f565b50600584018190555f61127c866126ab565b90505f61128c8260400151612ac0565b90508060028560405161129f9190615563565b602060405180830381855afa1580156112ba573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112dd9190615249565b146113415760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610524565b505050600a909201805460ff1916600117905550505050565b5f610a196001600160401b03831664e8d4a510006155a9565b5f61137d82611c13565b6080015192915050565b5f80516020615ad78339815191525f61139f85611c13565b5f86815260058401602052604090205460a08201519192506113d291600160b01b9091046001600160401b0316906155c0565b6001600160401b03164210156114465760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610524565b8315611458576114568584611d3b565b505b61146185612c32565b5050505050565b611470612f28565b5f80516020615ad78339815191525f611488846126ab565b90505f806114998360400151612885565b50915091505f6114a883611c13565b9050816001600160401b031681606001516001600160401b031610156114e05760405162461bcd60e51b81526004016105249061527f565b5f8681526006860160205260409020600301546001600160401b038084169116111561151e5760405162461bcd60e51b8152600401610524906152c1565b60035f87815260068701602052604090205460ff16600481111561154457611544615081565b146115985760405162461bcd60e51b815260206004820152603160248201525f80516020615af78339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610524565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261163d91612675565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061169160015f80516020615b3783398151915255565b5050565b5f61169e612f28565b6116a9833384612f72565b9050610a1960015f80516020615b3783398151915255565b5f80516020615b178339815191525f6116d9836126ab565b90505f806116ea83604001516133eb565b915091508061174c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610524565b5f82815260078501602052604081208054611766906155e0565b9050118015611798575060015f83815260088601602052604090205460ff16600581111561179657611796615081565b145b6117b45760405162461bcd60e51b815260040161052490615618565b5f82815260078501602052604081206117cc91614e90565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ad783398151915293929190829060ff1660048111156118da576118da615081565b60048111156118eb576118eb615081565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561197257611972615081565b1480611990575060038151600481111561198e5761198e615081565b145b6119e45760405162461bcd60e51b815260206004820152603260248201525f80516020615af7833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610524565b5f6119f28260400151611c13565b905080606001516001600160401b03165f03611a765760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610524565b6005600160991b016001600160a01b031663ee5b48eb611aa38460400151846060015185608001516120bc565b6040518263ffffffff1660e01b8152600401611abf9190615217565b6020604051808303815f875af1158015611adb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114619190615249565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615b17833981519152929190611b47906155e0565b9050118015611b79575060015f83815260088301602052604090205460ff166005811115611b7757611b77615081565b145b611b955760405162461bcd60e51b815260040161052490615618565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611bce919060040161565f565b6020604051808303815f875af1158015611bea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c0e9190615249565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020615b5783398151915290528390208351918201909352825491925f80516020615b1783398151915292829060ff166005811115611c9357611c93615081565b6005811115611ca457611ca4615081565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611d0f612f28565b611d1b8585858561358c565b9050611d3360015f80516020615b3783398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d86573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611dad91908101906156f4565b9150915080611e105760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610524565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e53573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e779190615249565b825114611edb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610524565b60208201516001600160a01b031615611f515760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610524565b5f80611f608460400151613801565b91509150818714611fcd5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610524565b9695505050505050565b5f8181525f80516020615b578339815191526020526040812060020180545f80516020615b1783398151915291600160401b9091046001600160401b0316906008612021836157c6565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b612071815f6139d9565b50565b5f9182525f80516020615b57833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612135576120f58160016157e1565b6121009060086155a9565b5081515f9083908390811061211757612117615371565b60200101906001600160f81b03191690815f1a9053506001016120e1565b505f5b60048110156121a05761214c8160036157e1565b6121579060086155a9565b600263ffffffff16901c60f81b828260026121729190615574565b8151811061218257612182615371565b60200101906001600160f81b03191690815f1a905350600101612138565b505f5b6020811015612202576121b781601f6157e1565b6121c29060086155a9565b86901c60f81b826121d4836006615574565b815181106121e4576121e4615371565b60200101906001600160f81b03191690815f1a9053506001016121a3565b505f5b600881101561226d576122198160076157e1565b6122249060086155a9565b6001600160401b038616901c60f81b8261223f836026615574565b8151811061224f5761224f615371565b60200101906001600160f81b03191690815f1a905350600101612205565b505f5b60088110156122d8576122848160076157e1565b61228f9060086155a9565b6001600160401b038516901c60f81b826122aa83602e615574565b815181106122ba576122ba615371565b60200101906001600160f81b03191690815f1a905350600101612270565b5090505b9392505050565b6122eb613c33565b6122f482613c7e565b61169181613cf2565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f80516020615b178339815191525f61234c856126ab565b90505f8061235d83604001516133eb565b9150915080156123c25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610524565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156123f3576123f3615081565b600581111561240457612404615081565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561247557612475615081565b1480612493575060018251600581111561249157612491615081565b145b6124f25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610524565b60038251600581111561250757612507615081565b0361251457506004612518565b5060055b6020808301515f9081526009880190915260408120558181600581111561254157612541615081565b9081600581111561255457612554615081565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561258857612588615081565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561263c5761263c615081565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab0054611691906001600160a01b03168284613da6565b60408051606080820183525f8083526020830181905292820152905f80516020615b178339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612720573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261274791908101906156f4565b91509150806127a75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610524565b825482511461280a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610524565b60208201516001600160a01b03161561287d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610524565b509392505050565b5f805f83516036146128a95760405162461bcd60e51b8152600401610524906157f4565b5f805b60028110156128f8576128c08160016157e1565b6128cb9060086155a9565b61ffff168682815181106128e1576128e1615371565b016020015160f81c901b91909117906001016128ac565b5061ffff81161561291b5760405162461bcd60e51b81526004016105249061583d565b5f805b6004811015612976576129328160036157e1565b61293d9060086155a9565b63ffffffff168761294f836002615574565b8151811061295f5761295f615371565b016020015160f81c901b919091179060010161291e565b5063ffffffff811660041461299d5760405162461bcd60e51b815260040161052490615880565b5f805b60208110156129f2576129b481601f6157e1565b6129bf9060086155a9565b886129cb836006615574565b815181106129db576129db615371565b016020015160f81c901b91909117906001016129a0565b505f805b6008811015612a5157612a0a8160076157e1565b612a159060086155a9565b6001600160401b031689612a2a836026615574565b81518110612a3a57612a3a615371565b016020015160f81c901b91909117906001016129f6565b505f805b6008811015612ab057612a698160076157e1565b612a749060086155a9565b6001600160401b03168a612a8983602e615574565b81518110612a9957612a99615371565b016020015160f81c901b9190911790600101612a55565b5091989097509095509350505050565b5f8151602614612ae25760405162461bcd60e51b8152600401610524906157f4565b5f805b6002811015612b3157612af98160016157e1565b612b049060086155a9565b61ffff16848281518110612b1a57612b1a615371565b016020015160f81c901b9190911790600101612ae5565b5061ffff811615612b545760405162461bcd60e51b81526004016105249061583d565b5f805b6004811015612baf57612b6b8160036157e1565b612b769060086155a9565b63ffffffff1685612b88836002615574565b81518110612b9857612b98615371565b016020015160f81c901b9190911790600101612b57565b5063ffffffff811615612bd45760405162461bcd60e51b815260040161052490615880565b5f805b6020811015612c2957612beb81601f6157e1565b612bf69060086155a9565b86612c02836006615574565b81518110612c1257612c12615371565b016020015160f81c901b9190911790600101612bd7565b50949350505050565b5f8181525f80516020615b578339815191526020526040808220815160e0810190925280545f80516020615b1783398151915293929190829060ff166005811115612c7f57612c7f615081565b6005811115612c9057612c90615081565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612d0257612d02615081565b14612d5e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610524565b612d6b8160800151612067565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff19166001836005811115612daf57612daf615081565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612e6484612e5e81611fd7565b5f6120bc565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612e93908590600401615217565b6020604051808303815f875af1158015612eaf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ed39190615249565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f80516020615b37833981519152805460011901612f5957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615b3783398151915255565b5f5f80516020615ad783398151915281612f8e61021285613e05565b90505f612f9a87611c13565b9050600281516005811115612fb157612fb1615081565b146130105760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610524565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166130a35760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610524565b6130ac82613e3b565b5f8282608001516130bd91906155c0565b600485015460408401519192506130df916001600160401b03909116906158c7565b6001600160401b0316816001600160401b0316111561315e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610524565b6131688882612074565b5f61317289611fd7565b90505f898260405160200161319e92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6131d88d86886120bc565b6040518263ffffffff1660e01b81526004016131f49190615217565b6020604051808303815f875af1158015613210573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132349190615249565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156132bc576132bc615081565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f80825160271461340e5760405162461bcd60e51b8152600401610524906157f4565b5f805b600281101561345d576134258160016157e1565b6134309060086155a9565b61ffff1685828151811061344657613446615371565b016020015160f81c901b9190911790600101613411565b5061ffff8116156134805760405162461bcd60e51b81526004016105249061583d565b5f805b60048110156134db576134978160036157e1565b6134a29060086155a9565b63ffffffff16866134b4836002615574565b815181106134c4576134c4615371565b016020015160f81c901b9190911790600101613483565b5063ffffffff81166003146135025760405162461bcd60e51b815260040161052490615880565b5f805b60208110156135575761351981601f6157e1565b6135249060086155a9565b87613530836006615574565b8151811061354057613540615371565b016020015160f81c901b9190911790600101613505565b505f8660268151811061356c5761356c615371565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ad78339815191529061ffff8616108015906135d8575061271061ffff861611155b6135f45760405162461bcd60e51b8152600401610524906158f2565b60028101546001600160401b03908116908516101561366d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610524565b80548310156136d05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610524565b80600101548311156137375760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610524565b5f61374184613e05565b90505f61374d82610a09565b90505f61375a8983613e46565b9050604051806060016040528061376e3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146138245760405162461bcd60e51b8152600401610524906157f4565b5f805b60028110156138735761383b8160016157e1565b6138469060086155a9565b61ffff1685828151811061385c5761385c615371565b016020015160f81c901b9190911790600101613827565b5061ffff8116156138965760405162461bcd60e51b81526004016105249061583d565b5f805b60048110156138f1576138ad8160036157e1565b6138b89060086155a9565b63ffffffff16866138ca836002615574565b815181106138da576138da615371565b016020015160f81c901b9190911790600101613899565b5063ffffffff81166005146139185760405162461bcd60e51b815260040161052490615880565b5f805b602081101561396d5761392f81601f6157e1565b61393a9060086155a9565b87613946836006615574565b8151811061395657613956615371565b016020015160f81c901b919091179060010161391b565b505f805b60088110156139cc576139858160076157e1565b6139909060086155a9565b6001600160401b0316886139a5836026615574565b815181106139b5576139b5615371565b016020015160f81c901b9190911790600101613971565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615b17833981519152914291901580613abf575060028301548151613abb916001600160401b031690615574565b8210155b15613ae5576001600160401b038516606082015281815260408101516020820152613b04565b8481606001818151613af791906155c0565b6001600160401b03169052505b6060810151613b149060646158c7565b602082015160028501546001600160401b039290921691613b3f9190600160401b900460ff166155a9565b1015613ba35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610524565b8315613bcc57846001600160401b031681604001818151613bc49190615574565b905250613beb565b846001600160401b031681604001818151613be791906157e1565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c7c57604051631afcd79f60e31b815260040160405180910390fd5b565b613c86613c33565b613c8f816143aa565b613c976143c3565b612071608082013560a0830135613cb460e0850160c08601615048565b613cc5610100860160e0870161593d565b61ffff16613cdb61012087016101008801615956565b613ced6101408801610120890161530a565b6143d3565b613cfa613c33565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613d865760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610524565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611c0e91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614617565b5f610a19827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690614678565b6120718160016139d9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613ed15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610524565b5f80516020615b1783398151915242613ef06040860160208701615048565b6001600160401b031611613f625760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610524565b613f726040850160208601615048565b6001600160401b0316613f886202a30042615574565b11613ffb5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610524565b83356140535760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610524565b83355f908152600982016020526040902054156140825760405162461bcd60e51b8152600401610524906154cc565b60306140916040860186615976565b9050146140f65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610524565b6140ff83613e3b565b5f806141996040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906141449190615048565b6001600160401b0316815260200161415f60408a018a615976565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506147da565b5f828152600786016020526040902091935091506141b782826159fc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141e4908590600401615217565b6020604051808303815f875af1158015614200573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142249190615249565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561429c5761429c615081565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161437c918e01908e01615048565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6143b2613c33565b6143ba614b89565b61207181614b91565b6143cb613c33565b613c7c614d33565b6143db613c33565b5f80516020615ad7833981519152836144475760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610524565b6127108411156144695760405162461bcd60e51b8152600401610524906158f2565b858711156144d15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610524565b5f8360ff161161453e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610524565b600a60ff841611156145b05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610524565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61462b6001600160a01b03841683614d3b565b905080515f1415801561464f57508080602001905181019061464d9190615abb565b155b15611c0e57604051635274afe760e01b81526001600160a01b0384166004820152602401610524565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156146be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146e29190615249565b90506146f96001600160a01b038516333086614d48565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561473d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147619190615249565b90508181116147c75760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610524565b6147d182826157e1565b95945050505050565b5f60608260800151516030146148445760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610524565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156148bb5761487b8160016157e1565b6148869060086155a9565b5081515f9083908390811061489d5761489d615371565b60200101906001600160f81b03191690815f1a905350600101614867565b505f5b6004811015614923576148d28160036157e1565b6148dd9060086155a9565b600160ff919091161c60f81b826148f5836002615574565b8151811061490557614905615371565b60200101906001600160f81b03191690815f1a9053506001016148be565b505f5b6020811015614980578451816020811061494257614942615371565b1a60f81b82614952836006615574565b8151811061496257614962615371565b60200101906001600160f81b03191690815f1a905350600101614926565b505f5b60208110156149e057846020015181602081106149a2576149a2615371565b1a60f81b826149b2836026615574565b815181106149c2576149c2615371565b60200101906001600160f81b03191690815f1a905350600101614983565b505f5b6008811015614a54576149f78160076157e1565b614a029060086155a9565b60ff1685604001516001600160401b0316901c60f81b82826046614a269190615574565b81518110614a3657614a36615371565b60200101906001600160f81b03191690815f1a9053506001016149e3565b505f5b6030811015614abf5784608001518181518110614a7657614a76615371565b01602001516001600160f81b03191682614a9183604e615574565b81518110614aa157614aa1615371565b60200101906001600160f81b03191690815f1a905350600101614a57565b505f5b6008811015614b3157614ad68160076157e1565b614ae19060086155a9565b60608601516001600160401b0390811691161c60f81b82614b0383607e615574565b81518110614b1357614b13615371565b60200101906001600160f81b03191690815f1a905350600101614ac2565b50600281604051614b429190615563565b602060405180830381855afa158015614b5d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614b809190615249565b94909350915050565b613c7c613c33565b614b99613c33565b80355f80516020615b1783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614be56080840160608501615956565b60ff161115614c525760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610524565b5f614c636080840160608501615956565b60ff1611614ccb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610524565b614cdb6080830160608401615956565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d0c6060830160408401615048565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612f5f613c33565b60606122dc83835f614d81565b6040516001600160a01b038481166024830152838116604483015260648201839052610a039186918216906323b872dd90608401613dd3565b606081471015614da65760405163cd78605960e01b8152306004820152602401610524565b5f80856001600160a01b03168486604051614dc19190615563565b5f6040518083038185875af1925050503d805f8114614dfb576040519150601f19603f3d011682016040523d82523d5f602084013e614e00565b606091505b5091509150611fcd868383606082614e2057614e1b82614e67565b6122dc565b8151158015614e3757506001600160a01b0384163b155b15614e6057604051639996b31560e01b81526001600160a01b0385166004820152602401610524565b50806122dc565b805115614e775780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614e9c906155e0565b5f825580601f10614eab575050565b601f0160209004905f5260205f209081019061207191905b80821115614ed6575f8155600101614ec3565b5090565b8015158114612071575f80fd5b803563ffffffff81168114614efa575f80fd5b919050565b5f805f60608486031215614f11575f80fd5b833592506020840135614f2381614eda565b9150614f3160408501614ee7565b90509250925092565b5f60208284031215614f4a575f80fd5b5035919050565b6001600160a01b0381168114612071575f80fd5b5f80828403610160811215614f78575f80fd5b61014080821215614f87575f80fd5b8493508301359050614f9881614f51565b809150509250929050565b5f60208284031215614fb3575f80fd5b6122dc82614ee7565b5f8060408385031215614fcd575f80fd5b614fd683614ee7565b946020939093013593505050565b5f8060408385031215614ff5575f80fd5b82356001600160401b0381111561500a575f80fd5b83016080818603121561501b575f80fd5b915061502960208401614ee7565b90509250929050565b80356001600160401b0381168114614efa575f80fd5b5f60208284031215615058575f80fd5b6122dc82615032565b5f8060408385031215615072575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106150b857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516150f360608401826001600160401b03169052565b50608083015161510e60808401826001600160401b03169052565b5060a083015161512960a08401826001600160401b03169052565b5060c083015161514460c08401826001600160401b03169052565b5092915050565b803561ffff81168114614efa575f80fd5b5f805f806080858703121561516f575f80fd5b84356001600160401b03811115615184575f80fd5b850160608188031215615195575f80fd5b93506151a36020860161514b565b92506151b160408601615032565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115615144576151446151c1565b5f5b8381101561520f5781810151838201526020016151f7565b50505f910152565b602081525f82518060208401526152358160408501602087016151f5565b601f01601f19169190910160400192915050565b5f60208284031215615259575f80fd5b5051919050565b5f8261527a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f6020828403121561531a575f80fd5b81356122dc81614f51565b5f808335601e1984360301811261533a575f80fd5b8301803591506001600160401b03821115615353575f80fd5b6020019150600581901b360382131561536a575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615399575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156153d9576153d96153a3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615407576154076153a3565b604052919050565b5f6001600160401b03821115615427576154276153a3565b50601f01601f191660200190565b5f60608236031215615445575f80fd5b61544d6153b7565b82358152602061545e818501615032565b8183015260408401356001600160401b0381111561547a575f80fd5b840136601f82011261548a575f80fd5b803561549d6154988261540f565b6153df565b81815236848385010111156154b0575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615525818460208a016151f5565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155558160288401602088016151f5565b016028019695505050505050565b5f82516153998184602087016151f5565b80820180821115610a1957610a196151c1565b5f63ffffffff80831681810361559f5761559f6151c1565b6001019392505050565b8082028115828204841417610a1957610a196151c1565b6001600160401b03818116838216019080821115615144576151446151c1565b600181811c908216806155f457607f821691505b60208210810361561257634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615671816155e0565b806020870152604060018084165f811461569257600181146156ae576156db565b60ff19851660408a0152604084151560051b8a010195506156db565b895f5260205f205f5b858110156156d25781548b82018601529083019088016156b7565b8a016040019650505b509398975050505050505050565b8051614efa81614eda565b5f8060408385031215615705575f80fd5b82516001600160401b038082111561571b575f80fd5b908401906060828703121561572e575f80fd5b6157366153b7565b8251815260208084015161574981614f51565b8282015260408401518381111561575e575f80fd5b80850194505087601f850112615772575f80fd5b835192506157826154988461540f565b8381528882858701011115615795575f80fd5b6157a4848383018488016151f5565b806040840152508195506157b98188016156e9565b9450505050509250929050565b5f6001600160401b0380831681810361559f5761559f6151c1565b81810381811115610a1957610a196151c1565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146158ea576158ea6151c1565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6020828403121561594d575f80fd5b6122dc8261514b565b5f60208284031215615966575f80fd5b813560ff811681146122dc575f80fd5b5f808335601e1984360301811261598b575f80fd5b8301803591506001600160401b038211156159a4575f80fd5b60200191503681900382131561536a575f80fd5b601f821115611c0e57805f5260205f20601f840160051c810160208510156159dd5750805b601f840160051c820191505b81811015611461575f81556001016159e9565b81516001600160401b03811115615a1557615a156153a3565b615a2981615a2384546155e0565b846159b8565b602080601f831160018114615a5c575f8415615a455750858301515b5f19600386901b1c1916600185901b178555615ab3565b5f85815260208120601f198616915b82811015615a8a57888601518255948401946001909101908401615a6b565b5085821015615aa757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615acb575f80fd5b81516122dc81614eda56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 98d4512e4..23fe2ae10 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"name\":\"validatorWeight\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"setWeightMessageID\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615a6d380380615a6d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159208061014d5f395ff3fe608060405260043610610161575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f1461045e578063c974d1b614610471578063d5f20ff614610485578063df93d8de146104b1575f80fd5b8063b771b3bc146103ee578063ba3a4b9714610420578063bee0a03f1461043f575f80fd5b8063620658561461033f57806366435abf1461035e57806376f786211461037d5780638280a25a1461039c57806398f3e2b4146103b0578063a3a65e48146103cf575f80fd5b806335455ded1161011e57806335455ded1461027e57806340034a93146102a6578063467ef06f146102b95780635297fae6146102d857806360305d62146102f757806361e2f49014610320575f80fd5b80630118acc4146101655780630322ed98146101865780630cdd0985146101a5578063151d30d1146102025780631f7a9d8f146102285780632e2194d814610247575b5f80fd5b348015610170575f80fd5b5061018461017f366004614c87565b6104c7565b005b348015610191575f80fd5b506101846101a0366004614cc2565b610958565b3480156101b0575f80fd5b506101ef6101bf366004614cc2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b34801561020d575f80fd5b50610216600a81565b60405160ff90911681526020016101f9565b348015610233575f80fd5b50610184610242366004614cd9565b610b11565b348015610252575f80fd5b50610266610261366004614cc2565b610bee565b6040516001600160401b0390911681526020016101f9565b348015610289575f80fd5b5061029361271081565b60405161ffff90911681526020016101f9565b6101ef6102b4366004614d17565b610c04565b3480156102c4575f80fd5b506101846102d3366004614d6b565b610c38565b3480156102e3575f80fd5b506101846102f2366004614d84565b610c8b565b348015610302575f80fd5b5061030b601481565b60405163ffffffff90911681526020016101f9565b34801561032b575f80fd5b5061018461033a366004614dac565b610e60565b34801561034a575f80fd5b506101ef610359366004614dfa565b6115aa565b348015610369575f80fd5b50610266610378366004614cc2565b6115c3565b348015610388575f80fd5b50610184610397366004614c87565b6115d7565b3480156103a7575f80fd5b50610216603081565b3480156103bb575f80fd5b506101846103ca366004614d84565b6116b8565b3480156103da575f80fd5b506101846103e9366004614d6b565b6118e5565b3480156103f9575f80fd5b506104086005600160991b0181565b6040516001600160a01b0390911681526020016101f9565b34801561042b575f80fd5b5061018461043a366004614cc2565b611a9d565b34801561044a575f80fd5b50610184610459366004614cc2565b611d23565b6101ef61046c366004614cc2565b611e37565b34801561047c575f80fd5b50610216601481565b348015610490575f80fd5b506104a461049f366004614cc2565b611e68565b6040516101f99190614e27565b3480156104bc575f80fd5b506102666202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615874833981519152918415610519576105168285611f5b565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561054b5761054b614e13565b600481111561055c5761055c614e13565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156105e3576105e3614e13565b146106355760405162461bcd60e51b815260206004820152602a60248201525f805160206158948339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461069a5760405162461bcd60e51b815260206004820152603360248201525f805160206158948339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161062c565b5f6106a4846121f7565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156106f1576106f1614e13565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107c385611e68565b905082606001516001600160401b031681608001516001600160401b03161161083a5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161062c565b60028151600581111561084f5761084f614e13565b03610861576108618360600151612287565b5f836060015182608001516108769190614ef1565b90506108828682612294565b5f6005600160991b0163ee5b48eb61089b8987866122dc565b6040518263ffffffff1660e01b81526004016108b79190614f33565b6020604051808303815f875af11580156108d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108f79190614f65565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206158f48339815191526020526040808220815160e0810190925280545f805160206158b483398151915293929190829060ff1660058111156109a5576109a5614e13565b60058111156109b6576109b6614e13565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a2557610a25614e13565b14610a8a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161062c565b6005600160991b016001600160a01b031663ee5b48eb610aaf8584606001515f6122dc565b6040518263ffffffff1660e01b8152600401610acb9190614f33565b6020604051808303815f875af1158015610ae7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b0b9190614f65565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b5a575080546001600160401b03808416911610155b15610b785760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ba283612501565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610bfe64e8d4a5100083614f7c565b92915050565b5f610c0d612512565b610c1984848434612549565b9050610c3160015f805160206158d483398151915255565b9392505050565b5f805160206158748339815191525f80610c51846127c6565b6040808201515f848152600588016020529190912054929450909250610b0b916001600160401b03909116906001600160a01b0316612b3e565b5f805160206158748339815191525f610ca384612b51565b90505f80610cb48360400151612d2b565b50915091505f610cc383611e68565b9050816001600160401b031681606001516001600160401b03161015610cfb5760405162461bcd60e51b815260040161062c90614f9b565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d405760405162461bcd60e51b815260040161062c90614fdd565b60015f87815260068701602052604090205460ff166004811115610d6657610d66614e13565b14610dcf5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161062c565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206158b48339815191529060ff1615610efd5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161062c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f649190614f65565b836020013514610fc65760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161062c565b30610fd7606085016040860161503a565b6001600160a01b0316146110495760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161062c565b5f6110576060850185615055565b9050116110b65760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161062c565b5f6110c46060850185615055565b91505063ffffffff81106111305760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b606482015260840161062c565b5f84356020860135601461114a6060890160408a0161503a565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156114ba575f6111ca6060890189615055565b8363ffffffff168181106111e0576111e06150a1565b90506020028101906111f291906150b5565b6111fb90615165565b80519091508061121d5760405162461bcd60e51b815260040161062c906151fc565b5f8181526009880160205260409020541561124a5760405162461bcd60e51b815260040161062c9061523d565b60408201515160301461126f5760405162461bcd60e51b815260040161062c90615285565b84825f01518360200151846040015160405160200161129194939291906152d2565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112df9190615321565b602060405180830381855afa1580156112fa573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061131d9190614f65565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113a9576113a9614e13565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161145c911686615332565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114b390615345565b90506111ae565b50600584018190555f6114cc86612b51565b90505f6114dc8260400151612f66565b9050806002856040516114ef9190615321565b602060405180830381855afa15801561150a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061152d9190614f65565b146115915760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161062c565b505050600a909201805460ff1916600117905550505050565b5f610bfe6001600160401b03831664e8d4a51000615367565b5f6115cd82611e68565b6080015192915050565b5f805160206158748339815191525f6115ef85611e68565b5f86815260058401602052604090205460a082015191925061162291600160b01b9091046001600160401b03169061537e565b6001600160401b03164210156116965760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161062c565b83156116a8576116a68584611f5b565b505b6116b1856130cf565b5050505050565b6116c0612512565b5f805160206158748339815191525f6116d884612b51565b90505f806116e98360400151612d2b565b50915091505f6116f883611e68565b9050816001600160401b031681606001516001600160401b031610156117305760405162461bcd60e51b815260040161062c90614f9b565b5f8681526006860160205260409020600301546001600160401b038084169116111561176e5760405162461bcd60e51b815260040161062c90614fdd565b60035f87815260068701602052604090205460ff16600481111561179457611794614e13565b146117e85760405162461bcd60e51b815260206004820152603160248201525f805160206158948339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161062c565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261188d91612b3e565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506118e160015f805160206158d483398151915255565b5050565b5f805160206158b48339815191525f6118fd83612b51565b90505f8061190e83604001516133c5565b91509150806119705760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161062c565b5f8281526007850160205260408120805461198a9061539e565b90501180156119bc575060015f83815260088601602052604090205460ff1660058111156119ba576119ba614e13565b145b6119d85760405162461bcd60e51b815260040161062c906153d0565b5f82815260078501602052604081206119f091614c1d565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061587483398151915293929190829060ff166004811115611afe57611afe614e13565b6004811115611b0f57611b0f614e13565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b9657611b96614e13565b1480611bb45750600381516004811115611bb257611bb2614e13565b145b611c085760405162461bcd60e51b815260206004820152603260248201525f80516020615894833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161062c565b5f611c168260400151611e68565b905080606001516001600160401b03165f03611c9a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161062c565b6005600160991b016001600160a01b031663ee5b48eb611cc78460400151846060015185608001516122dc565b6040518263ffffffff1660e01b8152600401611ce39190614f33565b6020604051808303815f875af1158015611cff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116b19190614f65565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206158b4833981519152929190611d6b9061539e565b9050118015611d9d575060015f83815260088301602052604090205460ff166005811115611d9b57611d9b614e13565b145b611db95760405162461bcd60e51b815260040161062c906153d0565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611df29190600401615417565b6020604051808303815f875af1158015611e0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e329190614f65565b505050565b5f611e40612512565b611e4b823334613566565b9050611e6360015f805160206158d483398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206158f483398151915290528390208351918201909352825491925f805160206158b483398151915292829060ff166005811115611ee857611ee8614e13565b6005811115611ef957611ef9614e13565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611fa6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611fcd91908101906154ac565b91509150806120305760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161062c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612073573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120979190614f65565b8251146120fb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161062c565b60208201516001600160a01b0316156121715760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161062c565b5f8061218084604001516139dc565b915091508187146121ed5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161062c565b9695505050505050565b5f8181525f805160206158f48339815191526020526040812060020180545f805160206158b483398151915291600160401b9091046001600160401b03169060086122418361557e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b612291815f613bb4565b50565b5f9182525f805160206158f4833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561235557612315816001615599565b612320906008615367565b5081515f90839083908110612337576123376150a1565b60200101906001600160f81b03191690815f1a905350600101612301565b505f5b60048110156123c05761236c816003615599565b612377906008615367565b600263ffffffff16901c60f81b828260026123929190615332565b815181106123a2576123a26150a1565b60200101906001600160f81b03191690815f1a905350600101612358565b505f5b6020811015612422576123d781601f615599565b6123e2906008615367565b86901c60f81b826123f4836006615332565b81518110612404576124046150a1565b60200101906001600160f81b03191690815f1a9053506001016123c3565b505f5b600881101561248d57612439816007615599565b612444906008615367565b6001600160401b038616901c60f81b8261245f836026615332565b8151811061246f5761246f6150a1565b60200101906001600160f81b03191690815f1a905350600101612425565b505f5b60088110156124f8576124a4816007615599565b6124af906008615367565b6001600160401b038516901c60f81b826124ca83602e615332565b815181106124da576124da6150a1565b60200101906001600160f81b03191690815f1a905350600101612490565b50949350505050565b612509613e0e565b61229181613e59565b5f805160206158d483398151915280546001190161254357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206158748339815191529061ffff861610801590612595575061271061ffff861611155b6125b15760405162461bcd60e51b815260040161062c906155ac565b60028101546001600160401b03908116908516101561262a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161062c565b805483101561268d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161062c565b80600101548311156126f45760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161062c565b825f6126ff82610bee565b90505f61270c8983613ecd565b905060405180606001604052806127203390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f805160206158d483398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206158b48339815191525f61281585612b51565b90505f8061282683604001516133c5565b91509150801561288b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161062c565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156128bc576128bc614e13565b60058111156128cd576128cd614e13565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561293e5761293e614e13565b148061295c575060018251600581111561295a5761295a614e13565b145b6129bb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161062c565b6003825160058111156129d0576129d0614e13565b036129dd575060046129e1565b5060055b6020808301515f90815260098801909152604081205581816005811115612a0a57612a0a614e13565b90816005811115612a1d57612a1d614e13565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612a5157612a51614e13565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612b0557612b05614e13565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6118e16001600160a01b038216836143b1565b60408051606080820183525f8083526020830181905292820152905f805160206158b48339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bc6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bed91908101906154ac565b9150915080612c4d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161062c565b8254825114612cb05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161062c565b60208201516001600160a01b031615612d235760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161062c565b509392505050565b5f805f8351603614612d4f5760405162461bcd60e51b815260040161062c906155f7565b5f805b6002811015612d9e57612d66816001615599565b612d71906008615367565b61ffff16868281518110612d8757612d876150a1565b016020015160f81c901b9190911790600101612d52565b5061ffff811615612dc15760405162461bcd60e51b815260040161062c90615640565b5f805b6004811015612e1c57612dd8816003615599565b612de3906008615367565b63ffffffff1687612df5836002615332565b81518110612e0557612e056150a1565b016020015160f81c901b9190911790600101612dc4565b5063ffffffff8116600414612e435760405162461bcd60e51b815260040161062c90615683565b5f805b6020811015612e9857612e5a81601f615599565b612e65906008615367565b88612e71836006615332565b81518110612e8157612e816150a1565b016020015160f81c901b9190911790600101612e46565b505f805b6008811015612ef757612eb0816007615599565b612ebb906008615367565b6001600160401b031689612ed0836026615332565b81518110612ee057612ee06150a1565b016020015160f81c901b9190911790600101612e9c565b505f805b6008811015612f5657612f0f816007615599565b612f1a906008615367565b6001600160401b03168a612f2f83602e615332565b81518110612f3f57612f3f6150a1565b016020015160f81c901b9190911790600101612efb565b5091989097509095509350505050565b5f8151602614612f885760405162461bcd60e51b815260040161062c906155f7565b5f805b6002811015612fd757612f9f816001615599565b612faa906008615367565b61ffff16848281518110612fc057612fc06150a1565b016020015160f81c901b9190911790600101612f8b565b5061ffff811615612ffa5760405162461bcd60e51b815260040161062c90615640565b5f805b600481101561305557613011816003615599565b61301c906008615367565b63ffffffff168561302e836002615332565b8151811061303e5761303e6150a1565b016020015160f81c901b9190911790600101612ffd565b5063ffffffff81161561307a5760405162461bcd60e51b815260040161062c90615683565b5f805b60208110156124f85761309181601f615599565b61309c906008615367565b866130a8836006615332565b815181106130b8576130b86150a1565b016020015160f81c901b919091179060010161307d565b5f8181525f805160206158f48339815191526020526040808220815160e0810190925280545f805160206158b483398151915293929190829060ff16600581111561311c5761311c614e13565b600581111561312d5761312d614e13565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561319f5761319f614e13565b146131fb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161062c565b6132088160800151612287565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561324c5761324c614e13565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613301846132fb816121f7565b5f6122dc565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90613330908590600401614f33565b6020604051808303815f875af115801561334c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133709190614f65565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146133e85760405162461bcd60e51b815260040161062c906155f7565b5f805b6002811015613437576133ff816001615599565b61340a906008615367565b61ffff16858281518110613420576134206150a1565b016020015160f81c901b91909117906001016133eb565b5061ffff81161561345a5760405162461bcd60e51b815260040161062c90615640565b5f805b60048110156134b557613471816003615599565b61347c906008615367565b63ffffffff168661348e836002615332565b8151811061349e5761349e6150a1565b016020015160f81c901b919091179060010161345d565b5063ffffffff81166003146134dc5760405162461bcd60e51b815260040161062c90615683565b5f805b6020811015613531576134f381601f615599565b6134fe906008615367565b8761350a836006615332565b8151811061351a5761351a6150a1565b016020015160f81c901b91909117906001016134df565b505f86602681518110613546576135466150a1565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206158748339815191528161357f84610bee565b90505f61358b87611e68565b90506002815160058111156135a2576135a2614e13565b146136015760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161062c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b03166136945760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161062c565b61369d82614444565b5f8282608001516136ae919061537e565b600485015460408401519192506136d0916001600160401b03909116906156ca565b6001600160401b0316816001600160401b0316111561374f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161062c565b6137598882612294565b5f613763896121f7565b90505f898260405160200161378f92919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6137c98d86886122dc565b6040518263ffffffff1660e01b81526004016137e59190614f33565b6020604051808303815f875af1158015613801573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138259190614f65565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff191660018360048111156138ad576138ad614e13565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e146139ff5760405162461bcd60e51b815260040161062c906155f7565b5f805b6002811015613a4e57613a16816001615599565b613a21906008615367565b61ffff16858281518110613a3757613a376150a1565b016020015160f81c901b9190911790600101613a02565b5061ffff811615613a715760405162461bcd60e51b815260040161062c90615640565b5f805b6004811015613acc57613a88816003615599565b613a93906008615367565b63ffffffff1686613aa5836002615332565b81518110613ab557613ab56150a1565b016020015160f81c901b9190911790600101613a74565b5063ffffffff8116600514613af35760405162461bcd60e51b815260040161062c90615683565b5f805b6020811015613b4857613b0a81601f615599565b613b15906008615367565b87613b21836006615332565b81518110613b3157613b316150a1565b016020015160f81c901b9190911790600101613af6565b505f805b6008811015613ba757613b60816007615599565b613b6b906008615367565b6001600160401b031688613b80836026615332565b81518110613b9057613b906150a1565b016020015160f81c901b9190911790600101613b4c565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f805160206158b4833981519152914291901580613c9a575060028301548151613c96916001600160401b031690615332565b8210155b15613cc0576001600160401b038516606082015281815260408101516020820152613cdf565b8481606001818151613cd2919061537e565b6001600160401b03169052505b6060810151613cef9060646156ca565b602082015160028501546001600160401b039290921691613d1a9190600160401b900460ff16615367565b1015613d7e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161062c565b8315613da757846001600160401b031681604001818151613d9f9190615332565b905250613dc6565b846001600160401b031681604001818151613dc29190615599565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e5757604051631afcd79f60e31b815260040160405180910390fd5b565b613e61613e0e565b613e6a8161444f565b613e72614468565b612291608082013560a0830135613e8f60e0850160c08601614dfa565b613ea0610100860160e087016156f5565b61ffff16613eb66101208701610100880161570e565b613ec86101408801610120890161503a565b614478565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613f585760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161062c565b5f805160206158b483398151915242613f776040860160208701614dfa565b6001600160401b031611613fe95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161062c565b613ff96040850160208601614dfa565b6001600160401b031661400f6202a30042615332565b116140825760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161062c565b83356140a05760405162461bcd60e51b815260040161062c906151fc565b83355f908152600982016020526040902054156140cf5760405162461bcd60e51b815260040161062c9061523d565b60306140de604086018661572e565b9050146140fd5760405162461bcd60e51b815260040161062c90615285565b61410683614444565b5f806141a06040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061414b9190614dfa565b6001600160401b0316815260200161416660408a018a61572e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506146bc565b5f828152600786016020526040902091935091506141be82826157b4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906141eb908590600401614f33565b6020604051808303815f875af1158015614207573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061422b9190614f65565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156142a3576142a3614e13565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614383918e01908e01614dfa565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156143d45760405163cd78605960e01b815230600482015260240161062c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461441d576040519150601f19603f3d011682016040523d82523d5f602084013e614422565b606091505b5050905080611e3257604051630a12f52160e11b815260040160405180910390fd5b612291816001613bb4565b614457613e0e565b61445f614a6b565b61229181614a73565b614470613e0e565b613e57614c15565b614480613e0e565b5f80516020615874833981519152836144ec5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161062c565b61271084111561450e5760405162461bcd60e51b815260040161062c906155ac565b858711156145765760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161062c565b5f8360ff16116145e35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161062c565b600a60ff841611156146555760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161062c565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146147265760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161062c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561479d5761475d816001615599565b614768906008615367565b5081515f9083908390811061477f5761477f6150a1565b60200101906001600160f81b03191690815f1a905350600101614749565b505f5b6004811015614805576147b4816003615599565b6147bf906008615367565b600160ff919091161c60f81b826147d7836002615332565b815181106147e7576147e76150a1565b60200101906001600160f81b03191690815f1a9053506001016147a0565b505f5b60208110156148625784518160208110614824576148246150a1565b1a60f81b82614834836006615332565b81518110614844576148446150a1565b60200101906001600160f81b03191690815f1a905350600101614808565b505f5b60208110156148c25784602001518160208110614884576148846150a1565b1a60f81b82614894836026615332565b815181106148a4576148a46150a1565b60200101906001600160f81b03191690815f1a905350600101614865565b505f5b6008811015614936576148d9816007615599565b6148e4906008615367565b60ff1685604001516001600160401b0316901c60f81b828260466149089190615332565b81518110614918576149186150a1565b60200101906001600160f81b03191690815f1a9053506001016148c5565b505f5b60308110156149a15784608001518181518110614958576149586150a1565b01602001516001600160f81b0319168261497383604e615332565b81518110614983576149836150a1565b60200101906001600160f81b03191690815f1a905350600101614939565b505f5b6008811015614a13576149b8816007615599565b6149c3906008615367565b60608601516001600160401b0390811691161c60f81b826149e583607e615332565b815181106149f5576149f56150a1565b60200101906001600160f81b03191690815f1a9053506001016149a4565b50600281604051614a249190615321565b602060405180830381855afa158015614a3f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a629190614f65565b94909350915050565b613e57613e0e565b614a7b613e0e565b80355f805160206158b483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614ac7608084016060850161570e565b60ff161115614b345760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161062c565b5f614b45608084016060850161570e565b60ff1611614bad5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161062c565b614bbd608083016060840161570e565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614bee6060830160408401614dfa565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6127b3613e0e565b508054614c299061539e565b5f825580601f10614c38575050565b601f0160209004905f5260205f209081019061229191905b80821115614c63575f8155600101614c50565b5090565b8015158114612291575f80fd5b803563ffffffff81168114611e63575f80fd5b5f805f60608486031215614c99575f80fd5b833592506020840135614cab81614c67565b9150614cb960408501614c74565b90509250925092565b5f60208284031215614cd2575f80fd5b5035919050565b5f6101408284031215614cea575f80fd5b50919050565b803561ffff81168114611e63575f80fd5b80356001600160401b0381168114611e63575f80fd5b5f805f60608486031215614d29575f80fd5b83356001600160401b03811115614d3e575f80fd5b840160608187031215614d4f575f80fd5b9250614d5d60208501614cf0565b9150614cb960408501614d01565b5f60208284031215614d7b575f80fd5b610c3182614c74565b5f8060408385031215614d95575f80fd5b614d9e83614c74565b946020939093013593505050565b5f8060408385031215614dbd575f80fd5b82356001600160401b03811115614dd2575f80fd5b830160808186031215614de3575f80fd5b9150614df160208401614c74565b90509250929050565b5f60208284031215614e0a575f80fd5b610c3182614d01565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614e4a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e8560608401826001600160401b03169052565b506080830151614ea060808401826001600160401b03169052565b5060a0830151614ebb60a08401826001600160401b03169052565b5060c0830151614ed660c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614ed657614ed6614edd565b5f5b83811015614f2b578181015183820152602001614f13565b50505f910152565b602081525f8251806020840152614f51816040850160208701614f11565b601f01601f19169190910160400192915050565b5f60208284031215614f75575f80fd5b5051919050565b5f82614f9657634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612291575f80fd5b5f6020828403121561504a575f80fd5b8135610c3181615026565b5f808335601e1984360301811261506a575f80fd5b8301803591506001600160401b03821115615083575f80fd5b6020019150600581901b360382131561509a575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150c9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615109576151096150d3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615137576151376150d3565b604052919050565b5f6001600160401b03821115615157576151576150d3565b50601f01601f191660200190565b5f60608236031215615175575f80fd5b61517d6150e7565b82358152602061518e818501614d01565b8183015260408401356001600160401b038111156151aa575f80fd5b840136601f8201126151ba575f80fd5b80356151cd6151c88261513f565b61510f565b81815236848385010111156151e0575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f85516152e3818460208a01614f11565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615313816028840160208801614f11565b016028019695505050505050565b5f82516150c9818460208701614f11565b80820180821115610bfe57610bfe614edd565b5f63ffffffff80831681810361535d5761535d614edd565b6001019392505050565b8082028115828204841417610bfe57610bfe614edd565b6001600160401b03818116838216019080821115614ed657614ed6614edd565b600181811c908216806153b257607f821691505b602082108103614cea57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546154298161539e565b806020870152604060018084165f811461544a576001811461546657615493565b60ff19851660408a0152604084151560051b8a01019550615493565b895f5260205f205f5b8581101561548a5781548b820186015290830190880161546f565b8a016040019650505b509398975050505050505050565b8051611e6381614c67565b5f80604083850312156154bd575f80fd5b82516001600160401b03808211156154d3575f80fd5b90840190606082870312156154e6575f80fd5b6154ee6150e7565b8251815260208084015161550181615026565b82820152604084015183811115615516575f80fd5b80850194505087601f85011261552a575f80fd5b8351925061553a6151c88461513f565b838152888285870101111561554d575f80fd5b61555c84838301848801614f11565b806040840152508195506155718188016154a1565b9450505050509250929050565b5f6001600160401b0380831681810361535d5761535d614edd565b81810381811115610bfe57610bfe614edd565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146156ed576156ed614edd565b505092915050565b5f60208284031215615705575f80fd5b610c3182614cf0565b5f6020828403121561571e575f80fd5b813560ff81168114610c31575f80fd5b5f808335601e19843603018112615743575f80fd5b8301803591506001600160401b0382111561575c575f80fd5b60200191503681900382131561509a575f80fd5b601f821115611e3257805f5260205f20601f840160051c810160208510156157955750805b601f840160051c820191505b818110156116b1575f81556001016157a1565b81516001600160401b038111156157cd576157cd6150d3565b6157e1816157db845461539e565b84615770565b602080601f831160018114615814575f84156157fd5750858301515b5f19600386901b1c1916600185901b17855561586b565b5f85815260208120601f198616915b8281101561584257888601518255948401946001909101908401615823565b508582101561585f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161594938038061594983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6157fc8061014d5f395ff3fe608060405260043610610161575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f1461045e578063c974d1b614610471578063d5f20ff614610485578063df93d8de146104b1575f80fd5b8063b771b3bc146103ee578063ba3a4b9714610420578063bee0a03f1461043f575f80fd5b8063620658561461033f57806366435abf1461035e57806376f786211461037d5780638280a25a1461039c57806398f3e2b4146103b0578063a3a65e48146103cf575f80fd5b806335455ded1161011e57806335455ded1461027e57806340034a93146102a6578063467ef06f146102b95780635297fae6146102d857806360305d62146102f757806361e2f49014610320575f80fd5b80630118acc4146101655780630322ed98146101865780630cdd0985146101a5578063151d30d1146102025780631f7a9d8f146102285780632e2194d814610247575b5f80fd5b348015610170575f80fd5b5061018461017f366004614bf1565b6104c7565b005b348015610191575f80fd5b506101846101a0366004614c2c565b610958565b3480156101b0575f80fd5b506101ef6101bf366004614c2c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b34801561020d575f80fd5b50610216600a81565b60405160ff90911681526020016101f9565b348015610233575f80fd5b50610184610242366004614c43565b610b11565b348015610252575f80fd5b50610266610261366004614c2c565b610bee565b6040516001600160401b0390911681526020016101f9565b348015610289575f80fd5b5061029361271081565b60405161ffff90911681526020016101f9565b6101ef6102b4366004614c81565b610c04565b3480156102c4575f80fd5b506101846102d3366004614cd5565b610c38565b3480156102e3575f80fd5b506101846102f2366004614cee565b610c8b565b348015610302575f80fd5b5061030b601481565b60405163ffffffff90911681526020016101f9565b34801561032b575f80fd5b5061018461033a366004614d16565b610e60565b34801561034a575f80fd5b506101ef610359366004614d64565b611494565b348015610369575f80fd5b50610266610378366004614c2c565b6114ad565b348015610388575f80fd5b50610184610397366004614bf1565b6114c1565b3480156103a7575f80fd5b50610216603081565b3480156103bb575f80fd5b506101846103ca366004614cee565b6115a2565b3480156103da575f80fd5b506101846103e9366004614cd5565b6117cf565b3480156103f9575f80fd5b506104086005600160991b0181565b6040516001600160a01b0390911681526020016101f9565b34801561042b575f80fd5b5061018461043a366004614c2c565b611987565b34801561044a575f80fd5b50610184610459366004614c2c565b611c0d565b6101ef61046c366004614c2c565b611d21565b34801561047c575f80fd5b50610216601481565b348015610490575f80fd5b506104a461049f366004614c2c565b611d52565b6040516101f99190614d91565b3480156104bc575f80fd5b506102666202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615750833981519152918415610519576105168285611e45565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561054b5761054b614d7d565b600481111561055c5761055c614d7d565b8152815461010090046001600160a01b03166020820152600182015460408201526002808301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156105e3576105e3614d7d565b146106355760405162461bcd60e51b815260206004820152602a60248201525f805160206157708339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208101516001600160a01b0316331461069a5760405162461bcd60e51b815260206004820152603360248201525f805160206157708339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161062c565b5f6106a4846120e1565b600383526001600160401b0342811660a0850152811660e08401525f8981526006870160205260409020835181549293508492829060ff191660018360048111156106f1576106f1614d7d565b021790555060208201518154610100600160a81b0319166101006001600160a01b0390921691909102178155604082015160018201556060820151600282018054608085015160a086015160c08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560e0909201516003909101805467ffffffffffffffff1916919092161790555f6107c385611d52565b905082606001516001600160401b031681608001516001600160401b03161161083a5760405162461bcd60e51b815260206004820152602360248201527f506f5356616c696461746f724d616e616765723a20496e76616c69642077656960448201526219da1d60ea1b606482015260840161062c565b60028151600581111561084f5761084f614d7d565b03610861576108618360600151612171565b5f836060015182608001516108769190614e5b565b9050610882868261217e565b5f6005600160991b0163ee5b48eb61089b8987866121c6565b6040518263ffffffff1660e01b81526004016108b79190614e9d565b6020604051808303815f875af11580156108d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108f79190614ecf565b604080516001600160401b03858116825242602083015291810183905291925085169088908d907f5318ab4d7cdf77056db2db5b539a08fe7d1a63d6885ecee8236a0dbda2843b4e9060600160405180910390a45050505050505050505050565b5f8181525f805160206157d08339815191526020526040808220815160e0810190925280545f8051602061579083398151915293929190829060ff1660058111156109a5576109a5614d7d565b60058111156109b6576109b6614d7d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a2557610a25614d7d565b14610a8a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161062c565b6005600160991b016001600160a01b031663ee5b48eb610aaf8584606001515f6121c6565b6040518263ffffffff1660e01b8152600401610acb9190614e9d565b6020604051808303815f875af1158015610ae7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b0b9190614ecf565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b5a575080546001600160401b03808416911610155b15610b785760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ba2836123eb565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610bfe64e8d4a5100083614ee6565b92915050565b5f610c0d6123fc565b610c1984848434612433565b9050610c3160015f805160206157b083398151915255565b9392505050565b5f805160206157508339815191525f80610c51846126b0565b6040808201515f848152600588016020529190912054929450909250610b0b916001600160401b03909116906001600160a01b0316612a28565b5f805160206157508339815191525f610ca384612a3b565b90505f80610cb48360400151612c15565b50915091505f610cc383611d52565b9050816001600160401b031681606001516001600160401b03161015610cfb5760405162461bcd60e51b815260040161062c90614f05565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610d405760405162461bcd60e51b815260040161062c90614f47565b60015f87815260068701602052604090205460ff166004811115610d6657610d66614d7d565b14610dcf5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161062c565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206157908339815191529060ff1615610efd5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161062c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f649190614ecf565b836020013514610fc65760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161062c565b30610fd76060850160408601614fa4565b6001600160a01b0316146110495760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161062c565b5f6110576060850185614fbf565b91505f90508435602086013560146110756060890160408a01614fa4565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156113a4575f6110f56060890189614fbf565b8363ffffffff1681811061110b5761110b61500b565b905060200281019061111d919061501f565b611126906150cf565b80515f81815260098901602052604090205491925090156111595760405162461bcd60e51b815260040161062c90615166565b84825f01518360200151846040015160405160200161117b94939291906151ae565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916111c991906151fd565b602060405180830381855afa1580156111e4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112079190614ecf565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561129357611293614d7d565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161134691168661520e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061139d90615221565b90506110d9565b50600584018190555f6113b686612a3b565b90505f6113c68260400151612e50565b9050806002856040516113d991906151fd565b602060405180830381855afa1580156113f4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114179190614ecf565b1461147b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161062c565b505050600a909201805460ff1916600117905550505050565b5f610bfe6001600160401b03831664e8d4a51000615243565b5f6114b782611d52565b6080015192915050565b5f805160206157508339815191525f6114d985611d52565b5f86815260058401602052604090205460a082015191925061150c91600160b01b9091046001600160401b03169061525a565b6001600160401b03164210156115805760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161062c565b8315611592576115908584611e45565b505b61159b85612fb9565b5050505050565b6115aa6123fc565b5f805160206157508339815191525f6115c284612a3b565b90505f806115d38360400151612c15565b50915091505f6115e283611d52565b9050816001600160401b031681606001516001600160401b0316101561161a5760405162461bcd60e51b815260040161062c90614f05565b5f8681526006860160205260409020600301546001600160401b03808416911611156116585760405162461bcd60e51b815260040161062c90614f47565b60035f87815260068701602052604090205460ff16600481111561167e5761167e614d7d565b146116d25760405162461bcd60e51b815260206004820152603160248201525f805160206157708339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161062c565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261177791612a28565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506117cb60015f805160206157b083398151915255565b5050565b5f805160206157908339815191525f6117e783612a3b565b90505f806117f883604001516132af565b915091508061185a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161062c565b5f828152600785016020526040812080546118749061527a565b90501180156118a6575060015f83815260088601602052604090205460ff1660058111156118a4576118a4614d7d565b145b6118c25760405162461bcd60e51b815260040161062c906152ac565b5f82815260078501602052604081206118da91614b87565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061575083398151915293929190829060ff1660048111156119e8576119e8614d7d565b60048111156119f9576119f9614d7d565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611a8057611a80614d7d565b1480611a9e5750600381516004811115611a9c57611a9c614d7d565b145b611af25760405162461bcd60e51b815260206004820152603260248201525f80516020615770833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161062c565b5f611b008260400151611d52565b905080606001516001600160401b03165f03611b845760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161062c565b6005600160991b016001600160a01b031663ee5b48eb611bb18460400151846060015185608001516121c6565b6040518263ffffffff1660e01b8152600401611bcd9190614e9d565b6020604051808303815f875af1158015611be9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159b9190614ecf565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615790833981519152929190611c559061527a565b9050118015611c87575060015f83815260088301602052604090205460ff166005811115611c8557611c85614d7d565b145b611ca35760405162461bcd60e51b815260040161062c906152ac565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611cdc91906004016152f3565b6020604051808303815f875af1158015611cf8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1c9190614ecf565b505050565b5f611d2a6123fc565b611d35823334613450565b9050611d4d60015f805160206157b083398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206157d083398151915290528390208351918201909352825491925f8051602061579083398151915292829060ff166005811115611dd257611dd2614d7d565b6005811115611de357611de3614d7d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e90573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611eb79190810190615388565b9150915080611f1a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161062c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f819190614ecf565b825114611fe55760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161062c565b60208201516001600160a01b03161561205b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161062c565b5f8061206a84604001516138c6565b915091508187146120d75760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161062c565b9695505050505050565b5f8181525f805160206157d08339815191526020526040812060020180545f8051602061579083398151915291600160401b9091046001600160401b031690600861212b8361545a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b61217b815f613a9e565b50565b5f9182525f805160206157d0833981519152602052604090912060020180546001600160401b03909216600160801b0267ffffffffffffffff60801b19909216919091179055565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561223f576121ff816001615475565b61220a906008615243565b5081515f908390839081106122215761222161500b565b60200101906001600160f81b03191690815f1a9053506001016121eb565b505f5b60048110156122aa57612256816003615475565b612261906008615243565b600263ffffffff16901c60f81b8282600261227c919061520e565b8151811061228c5761228c61500b565b60200101906001600160f81b03191690815f1a905350600101612242565b505f5b602081101561230c576122c181601f615475565b6122cc906008615243565b86901c60f81b826122de83600661520e565b815181106122ee576122ee61500b565b60200101906001600160f81b03191690815f1a9053506001016122ad565b505f5b600881101561237757612323816007615475565b61232e906008615243565b6001600160401b038616901c60f81b8261234983602661520e565b815181106123595761235961500b565b60200101906001600160f81b03191690815f1a90535060010161230f565b505f5b60088110156123e25761238e816007615475565b612399906008615243565b6001600160401b038516901c60f81b826123b483602e61520e565b815181106123c4576123c461500b565b60200101906001600160f81b03191690815f1a90535060010161237a565b50949350505050565b6123f3613cf8565b61217b81613d43565b5f805160206157b083398151915280546001190161242d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206157508339815191529061ffff86161080159061247f575061271061ffff861611155b61249b5760405162461bcd60e51b815260040161062c90615488565b60028101546001600160401b0390811690851610156125145760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161062c565b80548310156125775760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161062c565b80600101548311156125de5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161062c565b825f6125e982610bee565b90505f6125f68983613db7565b9050604051806060016040528061260a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f805160206157b083398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206157908339815191525f6126ff85612a3b565b90505f8061271083604001516132af565b9150915080156127755760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161062c565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127a6576127a6614d7d565b60058111156127b7576127b7614d7d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561282857612828614d7d565b1480612846575060018251600581111561284457612844614d7d565b145b6128a55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161062c565b6003825160058111156128ba576128ba614d7d565b036128c7575060046128cb565b5060055b6020808301515f908152600988019091526040812055818160058111156128f4576128f4614d7d565b9081600581111561290757612907614d7d565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561293b5761293b614d7d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156129ef576129ef614d7d565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6117cb6001600160a01b0382168361431b565b60408051606080820183525f8083526020830181905292820152905f805160206157908339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ab0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ad79190810190615388565b9150915080612b375760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161062c565b8254825114612b9a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161062c565b60208201516001600160a01b031615612c0d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161062c565b509392505050565b5f805f8351603614612c395760405162461bcd60e51b815260040161062c906154d3565b5f805b6002811015612c8857612c50816001615475565b612c5b906008615243565b61ffff16868281518110612c7157612c7161500b565b016020015160f81c901b9190911790600101612c3c565b5061ffff811615612cab5760405162461bcd60e51b815260040161062c9061551c565b5f805b6004811015612d0657612cc2816003615475565b612ccd906008615243565b63ffffffff1687612cdf83600261520e565b81518110612cef57612cef61500b565b016020015160f81c901b9190911790600101612cae565b5063ffffffff8116600414612d2d5760405162461bcd60e51b815260040161062c9061555f565b5f805b6020811015612d8257612d4481601f615475565b612d4f906008615243565b88612d5b83600661520e565b81518110612d6b57612d6b61500b565b016020015160f81c901b9190911790600101612d30565b505f805b6008811015612de157612d9a816007615475565b612da5906008615243565b6001600160401b031689612dba83602661520e565b81518110612dca57612dca61500b565b016020015160f81c901b9190911790600101612d86565b505f805b6008811015612e4057612df9816007615475565b612e04906008615243565b6001600160401b03168a612e1983602e61520e565b81518110612e2957612e2961500b565b016020015160f81c901b9190911790600101612de5565b5091989097509095509350505050565b5f8151602614612e725760405162461bcd60e51b815260040161062c906154d3565b5f805b6002811015612ec157612e89816001615475565b612e94906008615243565b61ffff16848281518110612eaa57612eaa61500b565b016020015160f81c901b9190911790600101612e75565b5061ffff811615612ee45760405162461bcd60e51b815260040161062c9061551c565b5f805b6004811015612f3f57612efb816003615475565b612f06906008615243565b63ffffffff1685612f1883600261520e565b81518110612f2857612f2861500b565b016020015160f81c901b9190911790600101612ee7565b5063ffffffff811615612f645760405162461bcd60e51b815260040161062c9061555f565b5f805b60208110156123e257612f7b81601f615475565b612f86906008615243565b86612f9283600661520e565b81518110612fa257612fa261500b565b016020015160f81c901b9190911790600101612f67565b5f8181525f805160206157d08339815191526020526040808220815160e0810190925280545f8051602061579083398151915293929190829060ff16600581111561300657613006614d7d565b600581111561301757613017614d7d565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561308957613089614d7d565b146130e55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161062c565b6130f28160800151612171565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561313657613136614d7d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131eb846131e5816120e1565b5f6121c6565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb9061321a908590600401614e9d565b6020604051808303815f875af1158015613236573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061325a9190614ecf565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146132d25760405162461bcd60e51b815260040161062c906154d3565b5f805b6002811015613321576132e9816001615475565b6132f4906008615243565b61ffff1685828151811061330a5761330a61500b565b016020015160f81c901b91909117906001016132d5565b5061ffff8116156133445760405162461bcd60e51b815260040161062c9061551c565b5f805b600481101561339f5761335b816003615475565b613366906008615243565b63ffffffff168661337883600261520e565b815181106133885761338861500b565b016020015160f81c901b9190911790600101613347565b5063ffffffff81166003146133c65760405162461bcd60e51b815260040161062c9061555f565b5f805b602081101561341b576133dd81601f615475565b6133e8906008615243565b876133f483600661520e565b815181106134045761340461500b565b016020015160f81c901b91909117906001016133c9565b505f866026815181106134305761343061500b565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206157508339815191528161346984610bee565b90505f61347587611d52565b905060028151600581111561348c5761348c614d7d565b146134eb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161062c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b031661357e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161062c565b613587826143ae565b5f828260800151613598919061525a565b600485015460408401519192506135ba916001600160401b03909116906155a6565b6001600160401b0316816001600160401b031611156136395760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161062c565b613643888261217e565b5f61364d896120e1565b90505f898260405160200161367992919091825260c01b6001600160c01b031916602082015260280190565b6040516020818303038152906040528051906020012090505f6005600160991b016001600160a01b031663ee5b48eb6136b38d86886121c6565b6040518263ffffffff1660e01b81526004016136cf9190614e9d565b6020604051808303815f875af11580156136eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061370f9190614ecf565b60408051610100810190915290915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905285835260068b01909152902081518154829060ff1916600183600481111561379757613797614d7d565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101849052908c16918d9185917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a4509998505050505050505050565b5f808251602e146138e95760405162461bcd60e51b815260040161062c906154d3565b5f805b600281101561393857613900816001615475565b61390b906008615243565b61ffff168582815181106139215761392161500b565b016020015160f81c901b91909117906001016138ec565b5061ffff81161561395b5760405162461bcd60e51b815260040161062c9061551c565b5f805b60048110156139b657613972816003615475565b61397d906008615243565b63ffffffff168661398f83600261520e565b8151811061399f5761399f61500b565b016020015160f81c901b919091179060010161395e565b5063ffffffff81166005146139dd5760405162461bcd60e51b815260040161062c9061555f565b5f805b6020811015613a32576139f481601f615475565b6139ff906008615243565b87613a0b83600661520e565b81518110613a1b57613a1b61500b565b016020015160f81c901b91909117906001016139e0565b505f805b6008811015613a9157613a4a816007615475565b613a55906008615243565b6001600160401b031688613a6a83602661520e565b81518110613a7a57613a7a61500b565b016020015160f81c901b9190911790600101613a36565b5090969095509350505050565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020615790833981519152914291901580613b84575060028301548151613b80916001600160401b03169061520e565b8210155b15613baa576001600160401b038516606082015281815260408101516020820152613bc9565b8481606001818151613bbc919061525a565b6001600160401b03169052505b6060810151613bd99060646155a6565b602082015160028501546001600160401b039290921691613c049190600160401b900460ff16615243565b1015613c685760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161062c565b8315613c9157846001600160401b031681604001818151613c89919061520e565b905250613cb0565b846001600160401b031681604001818151613cac9190615475565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d4157604051631afcd79f60e31b815260040160405180910390fd5b565b613d4b613cf8565b613d54816143b9565b613d5c6143d2565b61217b608082013560a0830135613d7960e0850160c08601614d64565b613d8a610100860160e087016155d1565b61ffff16613da0610120870161010088016155ea565b613db261014088016101208901614fa4565b6143e2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613e425760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161062c565b5f8051602061579083398151915242613e616040860160208701614d64565b6001600160401b031611613ed35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161062c565b613ee36040850160208601614d64565b6001600160401b0316613ef96202a3004261520e565b11613f6c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161062c565b8335613fc45760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161062c565b83355f90815260098201602052604090205415613ff35760405162461bcd60e51b815260040161062c90615166565b6030614002604086018661560a565b9050146140675760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161062c565b614070836143ae565b5f8061410a6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906140b59190614d64565b6001600160401b031681526020016140d060408a018a61560a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614626565b5f828152600786016020526040902091935091506141288282615690565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614155908590600401614e9d565b6020604051808303815f875af1158015614171573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141959190614ecf565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561420d5761420d614d7d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916142ed918e01908e01614d64565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561433e5760405163cd78605960e01b815230600482015260240161062c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614387576040519150601f19603f3d011682016040523d82523d5f602084013e61438c565b606091505b5050905080611d1c57604051630a12f52160e11b815260040160405180910390fd5b61217b816001613a9e565b6143c1613cf8565b6143c96149d5565b61217b816149dd565b6143da613cf8565b613d41614b7f565b6143ea613cf8565b5f80516020615750833981519152836144565760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161062c565b6127108411156144785760405162461bcd60e51b815260040161062c90615488565b858711156144e05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161062c565b5f8360ff161161454d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161062c565b600a60ff841611156145bf5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161062c565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146146905760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161062c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614707576146c7816001615475565b6146d2906008615243565b5081515f908390839081106146e9576146e961500b565b60200101906001600160f81b03191690815f1a9053506001016146b3565b505f5b600481101561476f5761471e816003615475565b614729906008615243565b600160ff919091161c60f81b8261474183600261520e565b815181106147515761475161500b565b60200101906001600160f81b03191690815f1a90535060010161470a565b505f5b60208110156147cc578451816020811061478e5761478e61500b565b1a60f81b8261479e83600661520e565b815181106147ae576147ae61500b565b60200101906001600160f81b03191690815f1a905350600101614772565b505f5b602081101561482c57846020015181602081106147ee576147ee61500b565b1a60f81b826147fe83602661520e565b8151811061480e5761480e61500b565b60200101906001600160f81b03191690815f1a9053506001016147cf565b505f5b60088110156148a057614843816007615475565b61484e906008615243565b60ff1685604001516001600160401b0316901c60f81b82826046614872919061520e565b815181106148825761488261500b565b60200101906001600160f81b03191690815f1a90535060010161482f565b505f5b603081101561490b57846080015181815181106148c2576148c261500b565b01602001516001600160f81b031916826148dd83604e61520e565b815181106148ed576148ed61500b565b60200101906001600160f81b03191690815f1a9053506001016148a3565b505f5b600881101561497d57614922816007615475565b61492d906008615243565b60608601516001600160401b0390811691161c60f81b8261494f83607e61520e565b8151811061495f5761495f61500b565b60200101906001600160f81b03191690815f1a90535060010161490e565b5060028160405161498e91906151fd565b602060405180830381855afa1580156149a9573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906149cc9190614ecf565b94909350915050565b613d41613cf8565b6149e5613cf8565b80355f8051602061579083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614a3160808401606085016155ea565b60ff161115614a9e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161062c565b5f614aaf60808401606085016155ea565b60ff1611614b175760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161062c565b614b2760808301606084016155ea565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614b586060830160408401614d64565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61269d613cf8565b508054614b939061527a565b5f825580601f10614ba2575050565b601f0160209004905f5260205f209081019061217b91905b80821115614bcd575f8155600101614bba565b5090565b801515811461217b575f80fd5b803563ffffffff81168114611d4d575f80fd5b5f805f60608486031215614c03575f80fd5b833592506020840135614c1581614bd1565b9150614c2360408501614bde565b90509250925092565b5f60208284031215614c3c575f80fd5b5035919050565b5f6101408284031215614c54575f80fd5b50919050565b803561ffff81168114611d4d575f80fd5b80356001600160401b0381168114611d4d575f80fd5b5f805f60608486031215614c93575f80fd5b83356001600160401b03811115614ca8575f80fd5b840160608187031215614cb9575f80fd5b9250614cc760208501614c5a565b9150614c2360408501614c6b565b5f60208284031215614ce5575f80fd5b610c3182614bde565b5f8060408385031215614cff575f80fd5b614d0883614bde565b946020939093013593505050565b5f8060408385031215614d27575f80fd5b82356001600160401b03811115614d3c575f80fd5b830160808186031215614d4d575f80fd5b9150614d5b60208401614bde565b90509250929050565b5f60208284031215614d74575f80fd5b610c3182614c6b565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614db457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614def60608401826001600160401b03169052565b506080830151614e0a60808401826001600160401b03169052565b5060a0830151614e2560a08401826001600160401b03169052565b5060c0830151614e4060c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614e4057614e40614e47565b5f5b83811015614e95578181015183820152602001614e7d565b50505f910152565b602081525f8251806020840152614ebb816040850160208701614e7b565b601f01601f19169190910160400192915050565b5f60208284031215614edf575f80fd5b5051919050565b5f82614f0057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461217b575f80fd5b5f60208284031215614fb4575f80fd5b8135610c3181614f90565b5f808335601e19843603018112614fd4575f80fd5b8301803591506001600160401b03821115614fed575f80fd5b6020019150600581901b3603821315615004575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615033575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150735761507361503d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150a1576150a161503d565b604052919050565b5f6001600160401b038211156150c1576150c161503d565b50601f01601f191660200190565b5f606082360312156150df575f80fd5b6150e7615051565b8235815260206150f8818501614c6b565b8183015260408401356001600160401b03811115615114575f80fd5b840136601f820112615124575f80fd5b8035615137615132826150a9565b615079565b818152368483850101111561514a575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516151bf818460208a01614e7b565b80830190508581526001600160401b0360c01b8560c01b16602082015283516151ef816028840160208801614e7b565b016028019695505050505050565b5f8251615033818460208701614e7b565b80820180821115610bfe57610bfe614e47565b5f63ffffffff80831681810361523957615239614e47565b6001019392505050565b8082028115828204841417610bfe57610bfe614e47565b6001600160401b03818116838216019080821115614e4057614e40614e47565b600181811c9082168061528e57607f821691505b602082108103614c5457634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546153058161527a565b806020870152604060018084165f811461532657600181146153425761536f565b60ff19851660408a0152604084151560051b8a0101955061536f565b895f5260205f205f5b858110156153665781548b820186015290830190880161534b565b8a016040019650505b509398975050505050505050565b8051611d4d81614bd1565b5f8060408385031215615399575f80fd5b82516001600160401b03808211156153af575f80fd5b90840190606082870312156153c2575f80fd5b6153ca615051565b825181526020808401516153dd81614f90565b828201526040840151838111156153f2575f80fd5b80850194505087601f850112615406575f80fd5b83519250615416615132846150a9565b8381528882858701011115615429575f80fd5b61543884838301848801614e7b565b8060408401525081955061544d81880161537d565b9450505050509250929050565b5f6001600160401b0380831681810361523957615239614e47565b81810381811115610bfe57610bfe614e47565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146155c9576155c9614e47565b505092915050565b5f602082840312156155e1575f80fd5b610c3182614c5a565b5f602082840312156155fa575f80fd5b813560ff81168114610c31575f80fd5b5f808335601e1984360301811261561f575f80fd5b8301803591506001600160401b03821115615638575f80fd5b602001915036819003821315615004575f80fd5b601f821115611d1c57805f5260205f20601f840160051c810160208510156156715750805b601f840160051c820191505b8181101561159b575f815560010161567d565b81516001600160401b038111156156a9576156a961503d565b6156bd816156b7845461527a565b8461564c565b602080601f8311600181146156f0575f84156156d95750858301515b5f19600386901b1c1916600185901b178555615747565b5f85815260208120601f198616915b8281101561571e578886015182559484019460019091019084016156ff565b508582101561573b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 9819f3b30..c03897038 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -73,7 +73,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051613a0c380380613a0c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138bf8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e366004612ddc565b61030c565b005b610173610143366004612ddc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610133610194366004612e0b565b6104ca565b6101336101a7366004612e4e565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004612e84565b6105e6565b6101ef6101ea366004612ddc565b610d30565b6040516001600160401b03909116815260200161017d565b610133610d44565b610217603081565b60405160ff909116815260200161017d565b610173610237366004612ee4565b610d57565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e366004612ddc565b610d73565b6101336102a1366004612e0b565b610d87565b6102686005600160991b0181565b6101336102c2366004612ddc565b610f3f565b610217601481565b6102e26102dd366004612ddc565b61104e565b60405161017d9190612f3d565b6101ef6202a30081565b610133610307366004612ff3565b611141565b5f8181525f805160206138938339815191526020526040808220815160e0810190925280545f8051602061387383398151915293929190829060ff16600581111561035957610359612f29565b600581111561036a5761036a612f29565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d9612f29565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f61117b565b6040518263ffffffff1660e01b81526004016104849190613037565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c49190613069565b50505050565b6104d3816113a0565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b6105978787611718565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206138738339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea9190613069565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d6060850160408601612ff3565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd6060850185613080565b90501161083c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a206e6f20696e697469616c2076616c604482015266696461746f727360c81b606482015260840161043a565b5f61084a6060850185613080565b91505063ffffffff81106108b65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20746f6f206d616e7920696e69746960448201526c616c2076616c696461746f727360981b606482015260840161043a565b5f8435602086013560146108d06060890160408a01612ff3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610c40575f6109506060890189613080565b8363ffffffff16818110610966576109666130cc565b905060200281019061097891906130e0565b61098190613190565b8051909150806109a35760405162461bcd60e51b815260040161043a90613227565b5f818152600988016020526040902054156109d05760405162461bcd60e51b815260040161043a90613268565b6040820151516030146109f55760405162461bcd60e51b815260040161043a906132b0565b84825f015183602001518460400151604051602001610a1794939291906132fd565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610a65919061334c565b602060405180830381855afa158015610a80573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aa39190613069565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610b2f57610b2f612f29565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610be2911686613371565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610c3990613384565b9050610934565b50600584018190555f610c5286611736565b90505f610c628260400151611910565b905080600285604051610c75919061334c565b602060405180830381855afa158015610c90573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cb39190613069565b14610d175760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610d3a8261104e565b6080015192915050565b610d4c611a79565b610d555f611ad4565b565b5f610d60611a79565b610d6a8383611b44565b90505b92915050565b610d7b611a79565b610d8481612028565b50565b5f805160206138738339815191525f610d9f83611736565b90505f80610db0836040015161231e565b9150915080610e125760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610e2c906133a6565b9050118015610e5e575060015f83815260088601602052604090205460ff166005811115610e5c57610e5c612f29565b145b610e7a5760405162461bcd60e51b815260040161043a906133d8565b5f8281526007850160205260408120610e9291612d92565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020613873833981519152929190610f87906133a6565b9050118015610fb9575060015f83815260088301602052604090205460ff166005811115610fb757610fb7612f29565b145b610fd55760405162461bcd60e51b815260040161043a906133d8565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161100e919060040161341f565b6020604051808303815f875af115801561102a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d39190613069565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061389383398151915290528390208351918201909352825491925f8051602061387383398151915292829060ff1660058111156110ce576110ce612f29565b60058111156110df576110df612f29565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611149611a79565b6001600160a01b03811661117257604051631e4fbdf760e01b81525f600482015260240161043a565b610d8481611ad4565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156111f4576111b48160016134a9565b6111bf9060086134bc565b5081515f908390839081106111d6576111d66130cc565b60200101906001600160f81b03191690815f1a9053506001016111a0565b505f5b600481101561125f5761120b8160036134a9565b6112169060086134bc565b600263ffffffff16901c60f81b828260026112319190613371565b81518110611241576112416130cc565b60200101906001600160f81b03191690815f1a9053506001016111f7565b505f5b60208110156112c15761127681601f6134a9565b6112819060086134bc565b86901c60f81b82611293836006613371565b815181106112a3576112a36130cc565b60200101906001600160f81b03191690815f1a905350600101611262565b505f5b600881101561132c576112d88160076134a9565b6112e39060086134bc565b6001600160401b038616901c60f81b826112fe836026613371565b8151811061130e5761130e6130cc565b60200101906001600160f81b03191690815f1a9053506001016112c4565b505f5b6008811015611397576113438160076134a9565b61134e9060086134bc565b6001600160401b038516901c60f81b8261136983602e613371565b81518110611379576113796130cc565b60200101906001600160f81b03191690815f1a90535060010161132f565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206138738339815191525f6113ef85611736565b90505f80611400836040015161231e565b9150915080156114655760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561149657611496612f29565b60058111156114a7576114a7612f29565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561151857611518612f29565b1480611536575060018251600581111561153457611534612f29565b145b6115955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b6003825160058111156115aa576115aa612f29565b036115b7575060046115bb565b5060055b6020808301515f908152600988019091526040812055818160058111156115e4576115e4612f29565b908160058111156115f7576115f7612f29565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561162b5761162b612f29565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156116df576116df612f29565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6117206124bf565b61172982612508565b61173281612521565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206138738339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156117ab573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526117d291908101906134e2565b91509150806118325760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b82548251146118955760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b0316156119085760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f81516026146119325760405162461bcd60e51b815260040161043a906135b4565b5f805b6002811015611981576119498160016134a9565b6119549060086134bc565b61ffff1684828151811061196a5761196a6130cc565b016020015160f81c901b9190911790600101611935565b5061ffff8116156119a45760405162461bcd60e51b815260040161043a906135fd565b5f805b60048110156119ff576119bb8160036134a9565b6119c69060086134bc565b63ffffffff16856119d8836002613371565b815181106119e8576119e86130cc565b016020015160f81c901b91909117906001016119a7565b5063ffffffff811615611a245760405162461bcd60e51b815260040161043a90613640565b5f805b602081101561139757611a3b81601f6134a9565b611a469060086134bc565b86611a52836006613371565b81518110611a6257611a626130cc565b016020015160f81c901b9190911790600101611a27565b33611aab7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610d555760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611bcf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f8051602061387383398151915242611bee6040860160208701613687565b6001600160401b031611611c605760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611c706040850160208601613687565b6001600160401b0316611c866202a30042613371565b11611cf95760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611d175760405162461bcd60e51b815260040161043a90613227565b83355f90815260098201602052604090205415611d465760405162461bcd60e51b815260040161043a90613268565b6030611d5560408601866136a0565b905014611d745760405162461bcd60e51b815260040161043a906132b0565b611d7d83612532565b5f80611e176040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611dc29190613687565b6001600160401b03168152602001611ddd60408a018a6136a0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061253d565b5f82815260078601602052604090209193509150611e35828261372d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611e62908590600401613037565b6020604051808303815f875af1158015611e7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea29190613069565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611f1a57611f1a612f29565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611ffa918e01908e01613687565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206138938339815191526020526040808220815160e0810190925280545f8051602061387383398151915293929190829060ff16600581111561207557612075612f29565b600581111561208657612086612f29565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156120f8576120f8612f29565b146121545760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b61216181608001516128ec565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156121a5576121a5612f29565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61225a84612254816128f6565b5f61117b565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb90612289908590600401613037565b6020604051808303815f875af11580156122a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c99190613069565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146123415760405162461bcd60e51b815260040161043a906135b4565b5f805b6002811015612390576123588160016134a9565b6123639060086134bc565b61ffff16858281518110612379576123796130cc565b016020015160f81c901b9190911790600101612344565b5061ffff8116156123b35760405162461bcd60e51b815260040161043a906135fd565b5f805b600481101561240e576123ca8160036134a9565b6123d59060086134bc565b63ffffffff16866123e7836002613371565b815181106123f7576123f76130cc565b016020015160f81c901b91909117906001016123b6565b5063ffffffff81166003146124355760405162461bcd60e51b815260040161043a90613640565b5f805b602081101561248a5761244c81601f6134a9565b6124579060086134bc565b87612463836006613371565b81518110612473576124736130cc565b016020015160f81c901b9190911790600101612438565b505f8660268151811061249f5761249f6130cc565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610d5557604051631afcd79f60e31b815260040160405180910390fd5b6125106124bf565b612518612986565b610d848161298e565b6125296124bf565b610d8481612b30565b610d84816001612b38565b5f60608260800151516030146125a75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561261e576125de8160016134a9565b6125e99060086134bc565b5081515f90839083908110612600576126006130cc565b60200101906001600160f81b03191690815f1a9053506001016125ca565b505f5b6004811015612686576126358160036134a9565b6126409060086134bc565b600160ff919091161c60f81b82612658836002613371565b81518110612668576126686130cc565b60200101906001600160f81b03191690815f1a905350600101612621565b505f5b60208110156126e357845181602081106126a5576126a56130cc565b1a60f81b826126b5836006613371565b815181106126c5576126c56130cc565b60200101906001600160f81b03191690815f1a905350600101612689565b505f5b60208110156127435784602001518160208110612705576127056130cc565b1a60f81b82612715836026613371565b81518110612725576127256130cc565b60200101906001600160f81b03191690815f1a9053506001016126e6565b505f5b60088110156127b75761275a8160076134a9565b6127659060086134bc565b60ff1685604001516001600160401b0316901c60f81b828260466127899190613371565b81518110612799576127996130cc565b60200101906001600160f81b03191690815f1a905350600101612746565b505f5b603081101561282257846080015181815181106127d9576127d96130cc565b01602001516001600160f81b031916826127f483604e613371565b81518110612804576128046130cc565b60200101906001600160f81b03191690815f1a9053506001016127ba565b505f5b6008811015612894576128398160076134a9565b6128449060086134bc565b60608601516001600160401b0390811691161c60f81b8261286683607e613371565b81518110612876576128766130cc565b60200101906001600160f81b03191690815f1a905350600101612825565b506002816040516128a5919061334c565b602060405180830381855afa1580156128c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128e39190613069565b94909350915050565b610d84815f612b38565b5f8181525f805160206138938339815191526020526040812060020180545f8051602061387383398151915291600160401b9091046001600160401b0316906008612940836137ec565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b610d556124bf565b6129966124bf565b80355f8051602061387383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146129e26080840160608501613807565b60ff161115612a4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f612a606080840160608501613807565b60ff1611612ac85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b612ad86080830160608401613807565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612b096060830160408401613687565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6111496124bf565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f80516020613873833981519152914291901580612c1e575060028301548151612c1a916001600160401b031690613371565b8210155b15612c44576001600160401b038516606082015281815260408101516020820152612c63565b8481606001818151612c569190613827565b6001600160401b03169052505b6060810151612c73906064613847565b602082015160028501546001600160401b039290921691612c9e9190600160401b900460ff166134bc565b1015612d025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b8315612d2b57846001600160401b031681604001818151612d239190613371565b905250612d4a565b846001600160401b031681604001818151612d4691906134a9565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b508054612d9e906133a6565b5f825580601f10612dad575050565b601f0160209004905f5260205f2090810190610d8491905b80821115612dd8575f8155600101612dc5565b5090565b5f60208284031215612dec575f80fd5b5035919050565b803563ffffffff81168114612e06575f80fd5b919050565b5f60208284031215612e1b575f80fd5b610d6a82612df3565b5f60808284031215612e34575f80fd5b50919050565b6001600160a01b0381168114610d84575f80fd5b5f8060a08385031215612e5f575f80fd5b612e698484612e24565b91506080830135612e7981612e3a565b809150509250929050565b5f8060408385031215612e95575f80fd5b82356001600160401b03811115612eaa575f80fd5b612eb685828601612e24565b925050612ec560208401612df3565b90509250929050565b80356001600160401b0381168114612e06575f80fd5b5f8060408385031215612ef5575f80fd5b82356001600160401b03811115612f0a575f80fd5b830160608186031215612f1b575f80fd5b9150612ec560208401612ece565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f6057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f9b60608401826001600160401b03169052565b506080830151612fb660808401826001600160401b03169052565b5060a0830151612fd160a08401826001600160401b03169052565b5060c0830151612fec60c08401826001600160401b03169052565b5092915050565b5f60208284031215613003575f80fd5b813561300e81612e3a565b9392505050565b5f5b8381101561302f578181015183820152602001613017565b50505f910152565b602081525f8251806020840152613055816040850160208701613015565b601f01601f19169190910160400192915050565b5f60208284031215613079575f80fd5b5051919050565b5f808335601e19843603018112613095575f80fd5b8301803591506001600160401b038211156130ae575f80fd5b6020019150600581901b36038213156130c5575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130f4575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613134576131346130fe565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613162576131626130fe565b604052919050565b5f6001600160401b03821115613182576131826130fe565b50601f01601f191660200190565b5f606082360312156131a0575f80fd5b6131a8613112565b8235815260206131b9818501612ece565b8183015260408401356001600160401b038111156131d5575f80fd5b840136601f8201126131e5575f80fd5b80356131f86131f38261316a565b61313a565b818152368483850101111561320b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526021908201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496040820152601160fa1b606082015260800190565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b6020808252602d908201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260408201526c0d8d2c696caf240d8cadccee8d609b1b606082015260800190565b5f855161330e818460208a01613015565b80830190508581526001600160401b0360c01b8560c01b166020820152835161333e816028840160208801613015565b016028019695505050505050565b5f82516130f4818460208701613015565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d6d57610d6d61335d565b5f63ffffffff80831681810361339c5761339c61335d565b6001019392505050565b600181811c908216806133ba57607f821691505b602082108103612e3457634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613431816133a6565b806020870152604060018084165f8114613452576001811461346e5761349b565b60ff19851660408a0152604084151560051b8a0101955061349b565b895f5260205f205f5b858110156134925781548b8201860152908301908801613477565b8a016040019650505b509398975050505050505050565b81810381811115610d6d57610d6d61335d565b8082028115828204841417610d6d57610d6d61335d565b80518015158114612e06575f80fd5b5f80604083850312156134f3575f80fd5b82516001600160401b0380821115613509575f80fd5b908401906060828703121561351c575f80fd5b613524613112565b8251815260208084015161353781612e3a565b8282015260408401518381111561354c575f80fd5b80850194505087601f850112613560575f80fd5b835192506135706131f38461316a565b8381528882858701011115613583575f80fd5b61359284838301848801613015565b806040840152508195506135a78188016134d3565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f60208284031215613697575f80fd5b610d6a82612ece565b5f808335601e198436030181126136b5575f80fd5b8301803591506001600160401b038211156136ce575f80fd5b6020019150368190038213156130c5575f80fd5b601f8211156104d357805f5260205f20601f840160051c810160208510156137075750805b601f840160051c820191505b81811015613726575f8155600101613713565b5050505050565b81516001600160401b03811115613746576137466130fe565b61375a8161375484546133a6565b846136e2565b602080601f83116001811461378d575f84156137765750858301515b5f19600386901b1c1916600185901b1785556137e4565b5f85815260208120601f198616915b828110156137bb5788860151825594840194600190910190840161379c565b50858210156137d857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b0380831681810361339c5761339c61335d565b5f60208284031215613817575f80fd5b813560ff8116811461300e575f80fd5b6001600160401b03818116838216019080821115612fec57612fec61335d565b6001600160401b0381811683821602808216919082811461386a5761386a61335d565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516138e83803806138e883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61379b8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e366004612d46565b61030c565b005b610173610143366004612d46565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610133610194366004612d75565b6104ca565b6101336101a7366004612db8565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004612dee565b6105e6565b6101ef6101ea366004612d46565b610c1a565b6040516001600160401b03909116815260200161017d565b610133610c2e565b610217603081565b60405160ff909116815260200161017d565b610173610237366004612e4e565b610c41565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e366004612d46565b610c5d565b6101336102a1366004612d75565b610c71565b6102686005600160991b0181565b6101336102c2366004612d46565b610e29565b610217601481565b6102e26102dd366004612d46565b610f38565b60405161017d9190612ea7565b6101ef6202a30081565b610133610307366004612f5d565b61102b565b5f8181525f8051602061376f8339815191526020526040808220815160e0810190925280545f8051602061374f83398151915293929190829060ff16600581111561035957610359612e93565b600581111561036a5761036a612e93565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d9612e93565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f611065565b6040518263ffffffff1660e01b81526004016104849190612fa1565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c49190612fd3565b50505050565b6104d38161128a565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b6105978787611602565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f8051602061374f8339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea9190612fd3565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d6060850160408601612f5d565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd6060850185612fea565b91505f90508435602086013560146107fb6060890160408a01612f5d565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610b2a575f61087b6060890189612fea565b8363ffffffff1681811061089157610891613036565b90506020028101906108a3919061304a565b6108ac906130fa565b80515f81815260098901602052604090205491925090156108df5760405162461bcd60e51b815260040161043a90613191565b84825f01518360200151846040015160405160200161090194939291906131d9565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161094f9190613228565b602060405180830381855afa15801561096a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061098d9190612fd3565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610a1957610a19612e93565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610acc91168661324d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610b2390613260565b905061085f565b50600584018190555f610b3c86611620565b90505f610b4c82604001516117fa565b905080600285604051610b5f9190613228565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190612fd3565b14610c015760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610c2482610f38565b6080015192915050565b610c36611963565b610c3f5f6119be565b565b5f610c4a611963565b610c548383611a2e565b90505b92915050565b610c65611963565b610c6e81611f92565b50565b5f8051602061374f8339815191525f610c8983611620565b90505f80610c9a8360400151612288565b9150915080610cfc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610d1690613282565b9050118015610d48575060015f83815260088601602052604090205460ff166005811115610d4657610d46612e93565b145b610d645760405162461bcd60e51b815260040161043a906132b4565b5f8281526007850160205260408120610d7c91612cfc565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061374f833981519152929190610e7190613282565b9050118015610ea3575060015f83815260088301602052604090205460ff166005811115610ea157610ea1612e93565b145b610ebf5760405162461bcd60e51b815260040161043a906132b4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610ef891906004016132fb565b6020604051808303815f875af1158015610f14573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d39190612fd3565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061376f83398151915290528390208351918201909352825491925f8051602061374f83398151915292829060ff166005811115610fb857610fb8612e93565b6005811115610fc957610fc9612e93565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611033611963565b6001600160a01b03811661105c57604051631e4fbdf760e01b81525f600482015260240161043a565b610c6e816119be565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110de5761109e816001613385565b6110a9906008613398565b5081515f908390839081106110c0576110c0613036565b60200101906001600160f81b03191690815f1a90535060010161108a565b505f5b6004811015611149576110f5816003613385565b611100906008613398565b600263ffffffff16901c60f81b8282600261111b919061324d565b8151811061112b5761112b613036565b60200101906001600160f81b03191690815f1a9053506001016110e1565b505f5b60208110156111ab5761116081601f613385565b61116b906008613398565b86901c60f81b8261117d83600661324d565b8151811061118d5761118d613036565b60200101906001600160f81b03191690815f1a90535060010161114c565b505f5b6008811015611216576111c2816007613385565b6111cd906008613398565b6001600160401b038616901c60f81b826111e883602661324d565b815181106111f8576111f8613036565b60200101906001600160f81b03191690815f1a9053506001016111ae565b505f5b60088110156112815761122d816007613385565b611238906008613398565b6001600160401b038516901c60f81b8261125383602e61324d565b8151811061126357611263613036565b60200101906001600160f81b03191690815f1a905350600101611219565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061374f8339815191525f6112d985611620565b90505f806112ea8360400151612288565b91509150801561134f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561138057611380612e93565b600581111561139157611391612e93565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561140257611402612e93565b1480611420575060018251600581111561141e5761141e612e93565b145b61147f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b60038251600581111561149457611494612e93565b036114a1575060046114a5565b5060055b6020808301515f908152600988019091526040812055818160058111156114ce576114ce612e93565b908160058111156114e1576114e1612e93565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561151557611515612e93565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156115c9576115c9612e93565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b61160a612429565b61161382612472565b61161c8161248b565b5050565b60408051606080820183525f8083526020830181905292820152905f8051602061374f8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611695573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116bc91908101906133be565b915091508061171c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b825482511461177f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b0316156117f25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f815160261461181c5760405162461bcd60e51b815260040161043a90613490565b5f805b600281101561186b57611833816001613385565b61183e906008613398565b61ffff1684828151811061185457611854613036565b016020015160f81c901b919091179060010161181f565b5061ffff81161561188e5760405162461bcd60e51b815260040161043a906134d9565b5f805b60048110156118e9576118a5816003613385565b6118b0906008613398565b63ffffffff16856118c283600261324d565b815181106118d2576118d2613036565b016020015160f81c901b9190911790600101611891565b5063ffffffff81161561190e5760405162461bcd60e51b815260040161043a9061351c565b5f805b60208110156112815761192581601f613385565b611930906008613398565b8661193c83600661324d565b8151811061194c5761194c613036565b016020015160f81c901b9190911790600101611911565b336119957f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c3f5760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611ab95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f8051602061374f83398151915242611ad86040860160208701613563565b6001600160401b031611611b4a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611b5a6040850160208601613563565b6001600160401b0316611b706202a3004261324d565b11611be35760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611c3b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043a565b83355f90815260098201602052604090205415611c6a5760405162461bcd60e51b815260040161043a90613191565b6030611c79604086018661357c565b905014611cde5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043a565b611ce78361249c565b5f80611d816040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611d2c9190613563565b6001600160401b03168152602001611d4760408a018a61357c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506124a7565b5f82815260078601602052604090209193509150611d9f8282613609565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611dcc908590600401612fa1565b6020604051808303815f875af1158015611de8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0c9190612fd3565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611e8457611e84612e93565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f64918e01908e01613563565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f8051602061376f8339815191526020526040808220815160e0810190925280545f8051602061374f83398151915293929190829060ff166005811115611fdf57611fdf612e93565b6005811115611ff057611ff0612e93565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561206257612062612e93565b146120be5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b6120cb8160800151612856565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561210f5761210f612e93565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121c4846121be81612860565b5f611065565b60405163ee5b48eb60e01b81529091505f906005600160991b019063ee5b48eb906121f3908590600401612fa1565b6020604051808303815f875af115801561220f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122339190612fd3565b6080840151604080516001600160401b039092168252426020830152919250829187917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a35050505050565b5f8082516027146122ab5760405162461bcd60e51b815260040161043a90613490565b5f805b60028110156122fa576122c2816001613385565b6122cd906008613398565b61ffff168582815181106122e3576122e3613036565b016020015160f81c901b91909117906001016122ae565b5061ffff81161561231d5760405162461bcd60e51b815260040161043a906134d9565b5f805b600481101561237857612334816003613385565b61233f906008613398565b63ffffffff168661235183600261324d565b8151811061236157612361613036565b016020015160f81c901b9190911790600101612320565b5063ffffffff811660031461239f5760405162461bcd60e51b815260040161043a9061351c565b5f805b60208110156123f4576123b681601f613385565b6123c1906008613398565b876123cd83600661324d565b815181106123dd576123dd613036565b016020015160f81c901b91909117906001016123a2565b505f8660268151811061240957612409613036565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c3f57604051631afcd79f60e31b815260040160405180910390fd5b61247a612429565b6124826128f0565b610c6e816128f8565b612493612429565b610c6e81612a9a565b610c6e816001612aa2565b5f60608260800151516030146125115760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561258857612548816001613385565b612553906008613398565b5081515f9083908390811061256a5761256a613036565b60200101906001600160f81b03191690815f1a905350600101612534565b505f5b60048110156125f05761259f816003613385565b6125aa906008613398565b600160ff919091161c60f81b826125c283600261324d565b815181106125d2576125d2613036565b60200101906001600160f81b03191690815f1a90535060010161258b565b505f5b602081101561264d578451816020811061260f5761260f613036565b1a60f81b8261261f83600661324d565b8151811061262f5761262f613036565b60200101906001600160f81b03191690815f1a9053506001016125f3565b505f5b60208110156126ad578460200151816020811061266f5761266f613036565b1a60f81b8261267f83602661324d565b8151811061268f5761268f613036565b60200101906001600160f81b03191690815f1a905350600101612650565b505f5b6008811015612721576126c4816007613385565b6126cf906008613398565b60ff1685604001516001600160401b0316901c60f81b828260466126f3919061324d565b8151811061270357612703613036565b60200101906001600160f81b03191690815f1a9053506001016126b0565b505f5b603081101561278c578460800151818151811061274357612743613036565b01602001516001600160f81b0319168261275e83604e61324d565b8151811061276e5761276e613036565b60200101906001600160f81b03191690815f1a905350600101612724565b505f5b60088110156127fe576127a3816007613385565b6127ae906008613398565b60608601516001600160401b0390811691161c60f81b826127d083607e61324d565b815181106127e0576127e0613036565b60200101906001600160f81b03191690815f1a90535060010161278f565b5060028160405161280f9190613228565b602060405180830381855afa15801561282a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061284d9190612fd3565b94909350915050565b610c6e815f612aa2565b5f8181525f8051602061376f8339815191526020526040812060020180545f8051602061374f83398151915291600160401b9091046001600160401b03169060086128aa836136c8565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b610c3f612429565b612900612429565b80355f8051602061374f83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461294c60808401606085016136e3565b60ff1611156129b95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f6129ca60808401606085016136e3565b60ff1611612a325760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b612a4260808301606084016136e3565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612a736060830160408401613563565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b611033612429565b604080516080810182527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb03548082527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb045460208301527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0554928201929092527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb06546001600160401b031660608201525f8051602061374f833981519152914291901580612b88575060028301548151612b84916001600160401b03169061324d565b8210155b15612bae576001600160401b038516606082015281815260408101516020820152612bcd565b8481606001818151612bc09190613703565b6001600160401b03169052505b6060810151612bdd906064613723565b602082015160028501546001600160401b039290921691612c089190600160401b900460ff16613398565b1015612c6c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b8315612c9557846001600160401b031681604001818151612c8d919061324d565b905250612cb4565b846001600160401b031681604001818151612cb09190613385565b9052505b805160038401556020810151600484015560408101516005840155606001516006909201805467ffffffffffffffff19166001600160401b0390931692909217909155505050565b508054612d0890613282565b5f825580601f10612d17575050565b601f0160209004905f5260205f2090810190610c6e91905b80821115612d42575f8155600101612d2f565b5090565b5f60208284031215612d56575f80fd5b5035919050565b803563ffffffff81168114612d70575f80fd5b919050565b5f60208284031215612d85575f80fd5b610c5482612d5d565b5f60808284031215612d9e575f80fd5b50919050565b6001600160a01b0381168114610c6e575f80fd5b5f8060a08385031215612dc9575f80fd5b612dd38484612d8e565b91506080830135612de381612da4565b809150509250929050565b5f8060408385031215612dff575f80fd5b82356001600160401b03811115612e14575f80fd5b612e2085828601612d8e565b925050612e2f60208401612d5d565b90509250929050565b80356001600160401b0381168114612d70575f80fd5b5f8060408385031215612e5f575f80fd5b82356001600160401b03811115612e74575f80fd5b830160608186031215612e85575f80fd5b9150612e2f60208401612e38565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612eca57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f0560608401826001600160401b03169052565b506080830151612f2060808401826001600160401b03169052565b5060a0830151612f3b60a08401826001600160401b03169052565b5060c0830151612f5660c08401826001600160401b03169052565b5092915050565b5f60208284031215612f6d575f80fd5b8135612f7881612da4565b9392505050565b5f5b83811015612f99578181015183820152602001612f81565b50505f910152565b602081525f8251806020840152612fbf816040850160208701612f7f565b601f01601f19169190910160400192915050565b5f60208284031215612fe3575f80fd5b5051919050565b5f808335601e19843603018112612fff575f80fd5b8301803591506001600160401b03821115613018575f80fd5b6020019150600581901b360382131561302f575f80fd5b9250929050565b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261305e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561309e5761309e613068565b60405290565b604051601f8201601f191681016001600160401b03811182821017156130cc576130cc613068565b604052919050565b5f6001600160401b038211156130ec576130ec613068565b50601f01601f191660200190565b5f6060823603121561310a575f80fd5b61311261307c565b823581526020613123818501612e38565b8183015260408401356001600160401b0381111561313f575f80fd5b840136601f82011261314f575f80fd5b803561316261315d826130d4565b6130a4565b8181523684838501011115613175575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516131ea818460208a01612f7f565b80830190508581526001600160401b0360c01b8560c01b166020820152835161321a816028840160208801612f7f565b016028019695505050505050565b5f825161305e818460208701612f7f565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c5757610c57613239565b5f63ffffffff80831681810361327857613278613239565b6001019392505050565b600181811c9082168061329657607f821691505b602082108103612d9e57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461330d81613282565b806020870152604060018084165f811461332e576001811461334a57613377565b60ff19851660408a0152604084151560051b8a01019550613377565b895f5260205f205f5b8581101561336e5781548b8201860152908301908801613353565b8a016040019650505b509398975050505050505050565b81810381811115610c5757610c57613239565b8082028115828204841417610c5757610c57613239565b80518015158114612d70575f80fd5b5f80604083850312156133cf575f80fd5b82516001600160401b03808211156133e5575f80fd5b90840190606082870312156133f8575f80fd5b61340061307c565b8251815260208084015161341381612da4565b82820152604084015183811115613428575f80fd5b80850194505087601f85011261343c575f80fd5b8351925061344c61315d846130d4565b838152888285870101111561345f575f80fd5b61346e84838301848801612f7f565b806040840152508195506134838188016133af565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f60208284031215613573575f80fd5b610c5482612e38565b5f808335601e19843603018112613591575f80fd5b8301803591506001600160401b038211156135aa575f80fd5b60200191503681900382131561302f575f80fd5b601f8211156104d357805f5260205f20601f840160051c810160208510156135e35750805b601f840160051c820191505b81811015613602575f81556001016135ef565b5050505050565b81516001600160401b0381111561362257613622613068565b613636816136308454613282565b846135be565b602080601f831160018114613669575f84156136525750858301515b5f19600386901b1c1916600185901b1785556136c0565b5f85815260208120601f198616915b8281101561369757888601518255948401946001909101908401613678565b50858210156136b457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6001600160401b0380831681810361327857613278613239565b5f602082840312156136f3575f80fd5b813560ff81168114612f78575f80fd5b6001600160401b03818116838216019080821115612f5657612f56613239565b6001600160401b0381811683821602808216919082811461374657613746613239565b50509291505056fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 844c26cc2..14935e17b 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -126,6 +126,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); require(!$._initializedValidatorSet, "ValidatorManager: already initialized validator set"); + // Check that the blockchainID and validator manager address in the subnetConversionData correspond to this contract. + // Other validation checks are done by the P-Chain when converting the subnet, so are not required here. require( subnetConversionData.validatorManagerBlockchainID == WARP_MESSENGER.getBlockchainID(), "ValidatorManager: invalid blockchain ID" @@ -134,14 +136,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida address(subnetConversionData.validatorManagerAddress) == address(this), "ValidatorManager: invalid validator manager address" ); - require( - subnetConversionData.initialValidators.length > 0, - "ValidatorManager: no initial validators" - ); + uint256 numInitialValidators = subnetConversionData.initialValidators.length; - require( - numInitialValidators < type(uint32).max, "ValidatorManager: too many initial validators" - ); // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's subnetConversionID. bytes memory encodedConversion = abi.encodePacked( @@ -155,15 +151,10 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida for (uint32 i; i < numInitialValidators; ++i) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; bytes32 nodeID = initialValidator.nodeID; - require(nodeID != bytes32(0), "ValidatorManager: invalid node ID"); require( $._activeValidators[nodeID] == bytes32(0), "ValidatorManager: node ID already active" ); - require( - initialValidator.blsPublicKey.length == BLS_PUBLIC_KEY_LENGTH, - "ValidatorManager: invalid blsPublicKey length" - ); // Continue to encode the initial validators. encodedConversion = abi.encodePacked( From 90e33add8bd47de605dc05ccb0a080ec672e0b89 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 18 Sep 2024 13:36:09 -0500 Subject: [PATCH 338/545] build fix --- tests/utils/staking.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index b56c7a2db..341167f7f 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -234,9 +234,9 @@ func InitializeNativeTokenValidatorSet( convertSubnetTxId := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} subnetConversionData := nativetokenstakingmanager.SubnetConversionData{ - ConvertSubnetTxID: convertSubnetTxId, - BlockchainID: subnetInfo.BlockchainID, - ValidatorManagerAddress: validatorManagerAddress, + ConvertSubnetTxID: convertSubnetTxId, + ValidatorManagerBlockchainID: subnetInfo.BlockchainID, + ValidatorManagerAddress: validatorManagerAddress, InitialValidators: []nativetokenstakingmanager.InitialValidator{ { NodeID: ids.GenerateTestID(), @@ -292,9 +292,9 @@ func InitializeERC20TokenValidatorSet( convertSubnetTxId := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} subnetConversionData := erc20tokenstakingmanager.SubnetConversionData{ - ConvertSubnetTxID: convertSubnetTxId, - BlockchainID: subnetInfo.BlockchainID, - ValidatorManagerAddress: validatorManagerAddress, + ConvertSubnetTxID: convertSubnetTxId, + ValidatorManagerBlockchainID: subnetInfo.BlockchainID, + ValidatorManagerAddress: validatorManagerAddress, InitialValidators: []erc20tokenstakingmanager.InitialValidator{ { NodeID: ids.GenerateTestID(), @@ -350,9 +350,9 @@ func InitializePoAValidatorSet( convertSubnetTxId := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} subnetConversionData := poavalidatormanager.SubnetConversionData{ - ConvertSubnetTxID: convertSubnetTxId, - BlockchainID: subnetInfo.BlockchainID, - ValidatorManagerAddress: validatorManagerAddress, + ConvertSubnetTxID: convertSubnetTxId, + ValidatorManagerBlockchainID: subnetInfo.BlockchainID, + ValidatorManagerAddress: validatorManagerAddress, InitialValidators: []poavalidatormanager.InitialValidator{ { NodeID: ids.GenerateTestID(), From 6623df07c759a3ca11cca7ca032c49a878188f89 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 18 Sep 2024 13:48:08 -0500 Subject: [PATCH 339/545] fix packing --- tests/utils/staking.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 341167f7f..bcc9f2cf5 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -1502,9 +1502,9 @@ func PackSubnetConversionData(data interface{}) ([]byte, error) { } // Define required fields and their expected types requiredFields := map[string]reflect.Type{ - "ConvertSubnetTxID": reflect.TypeOf([32]byte{}), - "BlockchainID": reflect.TypeOf([32]byte{}), - "ValidatorManagerAddress": reflect.TypeOf(common.Address{}), + "ConvertSubnetTxID": reflect.TypeOf([32]byte{}), + "ValidatorManagerBlockchainID": reflect.TypeOf([32]byte{}), + "ValidatorManagerAddress": reflect.TypeOf(common.Address{}), // InitialValidators is a slice of structs and handled separately "InitialValidators": reflect.TypeOf([]struct{}{}), } @@ -1528,14 +1528,14 @@ func PackSubnetConversionData(data interface{}) ([]byte, error) { } convertSubnetTxID := v.FieldByName("ConvertSubnetTxID").Interface().([32]byte) - blockchainID := v.FieldByName("BlockchainID").Interface().([32]byte) + validatorManagerBlockchainID := v.FieldByName("ValidatorManagerBlockchainID").Interface().([32]byte) validatorManagerAddress := v.FieldByName("ValidatorManagerAddress").Interface().(common.Address) initialValidators := v.FieldByName("InitialValidators") packedLen := 92 + initialValidatorPackedLen*initialValidators.Len() b := make([]byte, packedLen) copy(b[0:32], convertSubnetTxID[:]) - copy(b[32:64], blockchainID[:]) + copy(b[32:64], validatorManagerBlockchainID[:]) // These are evm addresses and have lengths of 20 so hardcoding here binary.BigEndian.PutUint32(b[64:68], uint32(20)) copy(b[68:88], validatorManagerAddress.Bytes()) From 56fae8b64ec3766a43d15d377f4ee4cbeedde681 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Wed, 18 Sep 2024 16:13:04 -0400 Subject: [PATCH 340/545] rename staking folder to validatorManager --- .../ERC20TokenStakingManager.go | 2606 ++++++++++++++++ .../ExampleRewardCalculator.go | 327 ++ .../NativeTokenStakingManager.go | 2637 +++++++++++++++++ .../PoAValidatorManager.go | 1947 ++++++++++++ contracts/mocks/ExampleERC20.sol | 2 +- .../ERC20TokenStakingManager.sol | 0 .../ExampleRewardCalculator.sol | 0 .../NativeTokenStakingManager.sol | 0 .../PoAValidatorManager.sol | 0 .../PoSValidatorManager.sol | 0 .../{staking => validatorManager}/README.md | 0 .../ValidatorManager.sol | 0 .../ValidatorMessages.sol | 0 .../interfaces/IERC20Mintable.sol | 0 .../interfaces/IERC20TokenStakingManager.sol | 0 .../interfaces/INativeTokenStakingManager.sol | 0 .../interfaces/IPoAValidatorManager.sol | 0 .../interfaces/IPoSValidatorManager.sol | 0 .../interfaces/IRewardCalculator.sol | 0 .../interfaces/IValidatorManager.sol | 0 .../tests/ERC20TokenStakingManagerTests.t.sol | 0 .../tests/ExamplesRewardCalculatorTests.t.sol | 0 .../NativeTokenStakingManagerTests.t.sol | 0 .../tests/PoAValidatorManagerTests.t.sol | 0 .../tests/PoSValidatorManagerTests.t.sol | 0 .../tests/ValidatorManagerTests.t.sol | 0 .../tests/ValidatorMessagesTests.t.sol | 0 27 files changed, 7518 insertions(+), 1 deletion(-) create mode 100644 abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go create mode 100644 abi-bindings/go/validatorManager/ExampleRewardCalculator/ExampleRewardCalculator.go create mode 100644 abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go create mode 100644 abi-bindings/go/validatorManager/PoAValidatorManager/PoAValidatorManager.go rename contracts/{staking => validatorManager}/ERC20TokenStakingManager.sol (100%) rename contracts/{staking => validatorManager}/ExampleRewardCalculator.sol (100%) rename contracts/{staking => validatorManager}/NativeTokenStakingManager.sol (100%) rename contracts/{staking => validatorManager}/PoAValidatorManager.sol (100%) rename contracts/{staking => validatorManager}/PoSValidatorManager.sol (100%) rename contracts/{staking => validatorManager}/README.md (100%) rename contracts/{staking => validatorManager}/ValidatorManager.sol (100%) rename contracts/{staking => validatorManager}/ValidatorMessages.sol (100%) rename contracts/{staking => validatorManager}/interfaces/IERC20Mintable.sol (100%) rename contracts/{staking => validatorManager}/interfaces/IERC20TokenStakingManager.sol (100%) rename contracts/{staking => validatorManager}/interfaces/INativeTokenStakingManager.sol (100%) rename contracts/{staking => validatorManager}/interfaces/IPoAValidatorManager.sol (100%) rename contracts/{staking => validatorManager}/interfaces/IPoSValidatorManager.sol (100%) rename contracts/{staking => validatorManager}/interfaces/IRewardCalculator.sol (100%) rename contracts/{staking => validatorManager}/interfaces/IValidatorManager.sol (100%) rename contracts/{staking => validatorManager}/tests/ERC20TokenStakingManagerTests.t.sol (100%) rename contracts/{staking => validatorManager}/tests/ExamplesRewardCalculatorTests.t.sol (100%) rename contracts/{staking => validatorManager}/tests/NativeTokenStakingManagerTests.t.sol (100%) rename contracts/{staking => validatorManager}/tests/PoAValidatorManagerTests.t.sol (100%) rename contracts/{staking => validatorManager}/tests/PoSValidatorManagerTests.t.sol (100%) rename contracts/{staking => validatorManager}/tests/ValidatorManagerTests.t.sol (100%) rename contracts/{staking => validatorManager}/tests/ValidatorMessagesTests.t.sol (100%) diff --git a/abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go new file mode 100644 index 000000000..7c508d3ba --- /dev/null +++ b/abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -0,0 +1,2606 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package erc20tokenstakingmanager + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// InitialValidator is an auto generated low-level Go binding around an user-defined struct. +type InitialValidator struct { + NodeID [32]byte + Weight uint64 + BlsPublicKey []byte +} + +// PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type PoSValidatorManagerSettings struct { + BaseSettings ValidatorManagerSettings + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + MinimumStakeDuration uint64 + MinimumDelegationFeeBips uint16 + MaximumStakeMultiplier uint8 + RewardCalculator common.Address +} + +// SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. +type SubnetConversionData struct { + ConvertSubnetTxID [32]byte + ValidatorManagerBlockchainID [32]byte + ValidatorManagerAddress common.Address + InitialValidators []InitialValidator +} + +// Validator is an auto generated low-level Go binding around an user-defined struct. +type Validator struct { + Status uint8 + NodeID [32]byte + StartingWeight uint64 + MessageNonce uint64 + Weight uint64 + StartedAt uint64 + EndedAt uint64 +} + +// ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type ValidatorManagerSettings struct { + PChainBlockchainID [32]byte + SubnetID [32]byte + ChurnPeriodSeconds uint64 + MaximumChurnPercentage uint8 +} + +// ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. +type ValidatorRegistrationInput struct { + NodeID [32]byte + RegistrationExpiry uint64 + BlsPublicKey []byte +} + +// 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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615e8b380380615e8b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d3e8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f3660046150a1565b6103bf565b005b6101846101943660046150dc565b610862565b6101d76101a73660046150dc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b6102176102123660046150dc565b610a1b565b6040516001600160401b0390911681526020016101e1565b61018461023d366004615107565b610a31565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c366004615145565b610b10565b61018461027f36600461515e565b610bb0565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af366004615186565b610d85565b6101d76102c23660046151ea565b6113b9565b6102176102d53660046150dc565b6113d2565b6101846102e83660046150a1565b6113e6565b6101f2603081565b61018461030336600461515e565b6115e0565b6101d7610316366004615203565b611862565b610184610329366004615145565b61188e565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b6101846103623660046150dc565b611a46565b6101846103753660046150dc565b611ccc565b6101f2601481565b6103956103903660046150dc565b611de0565b6040516101e19190615237565b6102176202a30081565b6101d76103ba3660046152fe565b611ea8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615c92833981519152949193919290829060ff16600481111561042757610427615223565b600481111561043857610438615223565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104b483611de0565b90506002825160048111156104cb576104cb615223565b1461051d5760405162461bcd60e51b815260206004820152602a60248201525f80516020615cb28339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105825760405162461bcd60e51b815260206004820152603360248201525f80516020615cb28339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610514565b6003825280515f90600290600581111561059e5761059e615223565b036105f55786156105b6576105b38487611edd565b90505b5f836060015183608001516105cb9190615377565b90506105d78582612179565b506001600160401b0390811660e0860152421660a085015250610629565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561065c85606001516113b9565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fd9190615397565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561073c5761073c615223565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610850916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615d128339815191526020526040808220815160e0810190925280545f80516020615cd283398151915293929190829060ff1660058111156108af576108af615223565b60058111156108c0576108c0615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561092f5761092f615223565b146109945760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb6109b98584606001515f6122d0565b6040518263ffffffff1660e01b81526004016109d591906153d0565b6020604051808303815f875af11580156109f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a159190615397565b50505050565b5f610a2b64e8d4a5100083615402565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a7a575080546001600160401b03808416911610155b15610a985760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ac384846124f7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615c928339815191525f80610b2984612511565b91509150610b368261285b565b610b405750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b6e57610b6e615223565b03610b93575f83815260088501602052604081208054919055610b918282612896565b505b610ba981610ba484604001516113b9565b61290c565b5050505050565b5f80516020615c928339815191525f610bc88461292f565b90505f80610bd98360400151612b09565b50915091505f610be883611de0565b9050816001600160401b031681606001516001600160401b03161015610c205760405162461bcd60e51b815260040161051490615421565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c655760405162461bcd60e51b815260040161051490615463565b60015f87815260068701602052604090205460ff166004811115610c8b57610c8b615223565b14610cf45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610514565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615cd28339815191529060ff1615610e225760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e899190615397565b836020013514610eeb5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610514565b30610efc60608501604086016154ac565b6001600160a01b031614610f6e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610514565b5f610f7c60608501856154c7565b91505f9050843560208601356014610f9a6060890160408a016154ac565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112c9575f61101a60608901896154c7565b8363ffffffff168181106110305761103061550c565b90506020028101906110429190615520565b61104b906155d0565b80515f818152600989016020526040902054919250901561107e5760405162461bcd60e51b815260040161051490615667565b84825f0151836020015184604001516040516020016110a094939291906156af565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110ee91906156fe565b602060405180830381855afa158015611109573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061112c9190615397565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111b8576111b8615223565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161126b91168661570f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112c290615722565b9050610ffe565b50600584018190555f6112db8661292f565b90505f6112eb8260400151612d44565b9050806002856040516112fe91906156fe565b602060405180830381855afa158015611319573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133c9190615397565b146113a05760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610514565b505050600a909201805460ff1916600117905550505050565b5f610a2b6001600160401b03831664e8d4a51000615744565b5f6113dc82611de0565b6080015192915050565b5f80516020615c928339815191525f6113fe85612eb6565b5f86815260058401602052604090205460a082015191925061143191600160b01b9091046001600160401b03169061575b565b6001600160401b03168160c001516001600160401b031610156114b25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610514565b8315610ba9575f6114c38685611edd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061151a906113b9565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611590573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b49190615397565b5f878152600885016020526040812080549091906115d390849061570f565b9091555050505050505050565b6115e8613131565b5f80516020615c928339815191525f6116008461292f565b90505f806116118360400151612b09565b50915091505f61162083611de0565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561165a5761165a615223565b600481111561166b5761166b615223565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561170a5760405162461bcd60e51b815260040161051490615421565b826001600160401b03168160e001516001600160401b031611156117405760405162461bcd60e51b815260040161051490615463565b60038151600481111561175557611755615223565b146117a95760405162461bcd60e51b815260206004820152603160248201525f80516020615cb28339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610514565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a01909252909120546117df9190612896565b856007015f8881526020019081526020015f205f905561180a8160200151610ba483606001516113b9565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061185e60015f80516020615cf283398151915255565b5050565b5f61186b613131565b61187683338461317b565b9050610a2b60015f80516020615cf283398151915255565b5f80516020615cd28339815191525f6118a68361292f565b90505f806118b78360400151613535565b91509150806119195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610514565b5f828152600785016020526040812080546119339061577b565b9050118015611965575060015f83815260088601602052604090205460ff16600581111561196357611963615223565b145b6119815760405162461bcd60e51b8152600401610514906157b3565b5f828152600785016020526040812061199991614ff1565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615c9283398151915293929190829060ff166004811115611aa757611aa7615223565b6004811115611ab857611ab8615223565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b3f57611b3f615223565b1480611b5d5750600381516004811115611b5b57611b5b615223565b145b611bb15760405162461bcd60e51b815260206004820152603260248201525f80516020615cb2833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610514565b5f611bbf8260400151611de0565b905080606001516001600160401b03165f03611c435760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb611c708460400151846060015185608001516122d0565b6040518263ffffffff1660e01b8152600401611c8c91906153d0565b6020604051808303815f875af1158015611ca8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba99190615397565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615cd2833981519152929190611d149061577b565b9050118015611d46575060015f83815260088301602052604090205460ff166005811115611d4457611d44615223565b145b611d625760405162461bcd60e51b8152600401610514906157b3565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d9b91906004016157fa565b6020604051808303815f875af1158015611db7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ddb9190615397565b505050565b611de8615028565b5f8281525f80516020615d12833981519152602052604090819020815160e0810190925280545f80516020615cd2833981519152929190829060ff166005811115611e3557611e35615223565b6005811115611e4657611e46615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611eb1613131565b611ebd858585856136d6565b9050611ed560015f80516020615cf283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f28573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f4f919081019061588f565b9150915080611fb25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ff5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120199190615397565b82511461207d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610514565b60208201516001600160a01b0316156120f35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610514565b5f80612102846040015161394b565b9150915081871461216f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610514565b9695505050505050565b5f8281525f80516020615d12833981519152602052604081206002015481905f80516020615cd283398151915290600160801b90046001600160401b03166121c18582613b23565b5f6121cb87613d31565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61221b8a858b6122d0565b6040518263ffffffff1660e01b815260040161223791906153d0565b6020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190615397565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561234957612309816001615961565b612314906008615744565b5081515f9083908390811061232b5761232b61550c565b60200101906001600160f81b03191690815f1a9053506001016122f5565b505f5b60048110156123b457612360816003615961565b61236b906008615744565b600263ffffffff16901c60f81b82826002612386919061570f565b815181106123965761239661550c565b60200101906001600160f81b03191690815f1a90535060010161234c565b505f5b6020811015612416576123cb81601f615961565b6123d6906008615744565b86901c60f81b826123e883600661570f565b815181106123f8576123f861550c565b60200101906001600160f81b03191690815f1a9053506001016123b7565b505f5b60088110156124815761242d816007615961565b612438906008615744565b6001600160401b038616901c60f81b8261245383602661570f565b815181106124635761246361550c565b60200101906001600160f81b03191690815f1a905350600101612419565b505f5b60088110156124ec57612498816007615961565b6124a3906008615744565b6001600160401b038516901c60f81b826124be83602e61570f565b815181106124ce576124ce61550c565b60200101906001600160f81b03191690815f1a905350600101612484565b5090505b9392505050565b6124ff613dc1565b61250882613e0c565b61185e81613e83565b5f61251a615028565b5f80516020615cd28339815191525f6125328561292f565b90505f806125438360400151613535565b9150915080156125a85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610514565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156125d9576125d9615223565b60058111156125ea576125ea615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561265b5761265b615223565b1480612679575060018251600581111561267757612677615223565b145b6126d85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610514565b6003825160058111156126ed576126ed615223565b036126fa575060046126fe565b5060055b6020808301515f9081526009880190915260408120558181600581111561272757612727615223565b9081600581111561273a5761273a615223565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561276e5761276e615223565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561282257612822615223565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615c7283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156128f1575f80fd5b505af1158015612903573d5f803e3d5ffd5b50505050505050565b5f80516020615c728339815191525461185e906001600160a01b03168383613f24565b60408051606080820183525f8083526020830181905292820152905f80516020615cd28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156129a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129cb919081019061588f565b9150915080612a2b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610514565b8254825114612a8e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610514565b60208201516001600160a01b031615612b015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610514565b509392505050565b5f805f8351603614612b2d5760405162461bcd60e51b815260040161051490615974565b5f805b6002811015612b7c57612b44816001615961565b612b4f906008615744565b61ffff16868281518110612b6557612b6561550c565b016020015160f81c901b9190911790600101612b30565b5061ffff811615612b9f5760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015612bfa57612bb6816003615961565b612bc1906008615744565b63ffffffff1687612bd383600261570f565b81518110612be357612be361550c565b016020015160f81c901b9190911790600101612ba2565b5063ffffffff8116600414612c215760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015612c7657612c3881601f615961565b612c43906008615744565b88612c4f83600661570f565b81518110612c5f57612c5f61550c565b016020015160f81c901b9190911790600101612c24565b505f805b6008811015612cd557612c8e816007615961565b612c99906008615744565b6001600160401b031689612cae83602661570f565b81518110612cbe57612cbe61550c565b016020015160f81c901b9190911790600101612c7a565b505f805b6008811015612d3457612ced816007615961565b612cf8906008615744565b6001600160401b03168a612d0d83602e61570f565b81518110612d1d57612d1d61550c565b016020015160f81c901b9190911790600101612cd9565b5091989097509095509350505050565b5f8151602614612d665760405162461bcd60e51b815260040161051490615974565b5f805b6002811015612db557612d7d816001615961565b612d88906008615744565b61ffff16848281518110612d9e57612d9e61550c565b016020015160f81c901b9190911790600101612d69565b5061ffff811615612dd85760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015612e3357612def816003615961565b612dfa906008615744565b63ffffffff1685612e0c83600261570f565b81518110612e1c57612e1c61550c565b016020015160f81c901b9190911790600101612ddb565b5063ffffffff811615612e585760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015612ead57612e6f81601f615961565b612e7a906008615744565b86612e8683600661570f565b81518110612e9657612e9661550c565b016020015160f81c901b9190911790600101612e5b565b50949350505050565b612ebe615028565b5f8281525f80516020615d128339815191526020526040808220815160e0810190925280545f80516020615cd283398151915293929190829060ff166005811115612f0b57612f0b615223565b6005811115612f1c57612f1c615223565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612f8e57612f8e615223565b14612fea5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610514565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561302e5761302e615223565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130da8582612179565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615cf283398151915280546001190161316257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615cf283398151915255565b5f5f80516020615c928339815191528161319761021285613f83565b90505f6131a387611de0565b90506131ae8761285b565b61320b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610514565b60028151600581111561322057613220615223565b1461327f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610514565b5f828260800151613290919061575b565b600485015460408401519192506132b2916001600160401b0390911690615a47565b6001600160401b0316816001600160401b031611156133315760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610514565b5f8061333d8a84612179565b915091505f8a8360405160200161336b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561340657613406615223565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146135585760405162461bcd60e51b815260040161051490615974565b5f805b60028110156135a75761356f816001615961565b61357a906008615744565b61ffff168582815181106135905761359061550c565b016020015160f81c901b919091179060010161355b565b5061ffff8116156135ca5760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015613625576135e1816003615961565b6135ec906008615744565b63ffffffff16866135fe83600261570f565b8151811061360e5761360e61550c565b016020015160f81c901b91909117906001016135cd565b5063ffffffff811660031461364c5760405162461bcd60e51b815260040161051490615a00565b5f805b60208110156136a15761366381601f615961565b61366e906008615744565b8761367a83600661570f565b8151811061368a5761368a61550c565b016020015160f81c901b919091179060010161364f565b505f866026815181106136b6576136b661550c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615c928339815191529061ffff861610801590613722575061271061ffff861611155b61373e5760405162461bcd60e51b815260040161051490615a72565b60028101546001600160401b0390811690851610156137b75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610514565b805483101561381a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610514565b80600101548311156138815760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610514565b5f61388b84613f83565b90505f61389782610a1b565b90505f6138a48983613fa6565b905060405180606001604052806138b83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e1461396e5760405162461bcd60e51b815260040161051490615974565b5f805b60028110156139bd57613985816001615961565b613990906008615744565b61ffff168582815181106139a6576139a661550c565b016020015160f81c901b9190911790600101613971565b5061ffff8116156139e05760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015613a3b576139f7816003615961565b613a02906008615744565b63ffffffff1686613a1483600261570f565b81518110613a2457613a2461550c565b016020015160f81c901b91909117906001016139e3565b5063ffffffff8116600514613a625760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015613ab757613a7981601f615961565b613a84906008615744565b87613a9083600661570f565b81518110613aa057613aa061550c565b016020015160f81c901b9190911790600101613a65565b505f805b6008811015613b1657613acf816007615961565b613ada906008615744565b6001600160401b031688613aef83602661570f565b81518110613aff57613aff61550c565b016020015160f81c901b9190911790600101613abb565b5090969095509350505050565b5f80516020615cd28339815191525f6001600160401b038084169085161115613b5757613b508385615377565b9050613b64565b613b618484615377565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613bc6575060028401548151613bc2916001600160401b03169061570f565b8210155b15613bec576001600160401b038316606082015281815260408101516020820152613c0b565b8281606001818151613bfe919061575b565b6001600160401b03169052505b6060810151613c1b906064615a47565b602082015160028601546001600160401b039290921691613c469190600160401b900460ff16615744565b1015613caa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610514565b856001600160401b031681604001818151613cc5919061570f565b9052506040810180516001600160401b0387169190613ce5908390615961565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d128339815191526020526040812060020180545f80516020615cd283398151915291600160401b9091046001600160401b0316906008613d7b83615abd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e0a57604051631afcd79f60e31b815260040160405180910390fd5b565b613e14613dc1565b613e1d8161450b565b613e25614524565b613e80608082013560a0830135613e4260e0850160c086016151ea565b613e53610100860160e08701615ad8565b61ffff16613e6961012087016101008801615af1565b613e7b610140880161012089016154ac565b614534565b50565b613e8b613dc1565b5f80516020615c728339815191526001600160a01b038216613f045760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610514565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ddb91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614778565b5f610a2b825f80516020615c72833981519152546001600160a01b0316906147d9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140315760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610514565b5f80516020615cd28339815191524261405060408601602087016151ea565b6001600160401b0316116140c25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610514565b6140d260408501602086016151ea565b6001600160401b03166140e86202a3004261570f565b1161415b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610514565b83356141b35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610514565b83355f908152600982016020526040902054156141e25760405162461bcd60e51b815260040161051490615667565b60306141f16040860186615b11565b9050146142565760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610514565b614260835f613b23565b5f806142fa6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906142a591906151ea565b6001600160401b031681526020016142c060408a018a615b11565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061493b565b5f828152600786016020526040902091935091506143188282615b97565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143459085906004016153d0565b6020604051808303815f875af1158015614361573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143859190615397565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156143fd576143fd615223565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916144dd918e01908e016151ea565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614513613dc1565b61451b614cea565b613e8081614cf2565b61452c613dc1565b613e0a614e94565b61453c613dc1565b5f80516020615c92833981519152836145a85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610514565b6127108411156145ca5760405162461bcd60e51b815260040161051490615a72565b858711156146325760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610514565b5f8360ff161161469f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610514565b600a60ff841611156147115760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610514565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61478c6001600160a01b03841683614e9c565b905080515f141580156147b05750808060200190518101906147ae9190615c56565b155b15611ddb57604051635274afe760e01b81526001600160a01b0384166004820152602401610514565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561481f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148439190615397565b905061485a6001600160a01b038516333086614ea9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561489e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148c29190615397565b90508181116149285760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610514565b6149328282615961565b95945050505050565b5f60608260800151516030146149a55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610514565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614a1c576149dc816001615961565b6149e7906008615744565b5081515f908390839081106149fe576149fe61550c565b60200101906001600160f81b03191690815f1a9053506001016149c8565b505f5b6004811015614a8457614a33816003615961565b614a3e906008615744565b600160ff919091161c60f81b82614a5683600261570f565b81518110614a6657614a6661550c565b60200101906001600160f81b03191690815f1a905350600101614a1f565b505f5b6020811015614ae15784518160208110614aa357614aa361550c565b1a60f81b82614ab383600661570f565b81518110614ac357614ac361550c565b60200101906001600160f81b03191690815f1a905350600101614a87565b505f5b6020811015614b415784602001518160208110614b0357614b0361550c565b1a60f81b82614b1383602661570f565b81518110614b2357614b2361550c565b60200101906001600160f81b03191690815f1a905350600101614ae4565b505f5b6008811015614bb557614b58816007615961565b614b63906008615744565b60ff1685604001516001600160401b0316901c60f81b82826046614b87919061570f565b81518110614b9757614b9761550c565b60200101906001600160f81b03191690815f1a905350600101614b44565b505f5b6030811015614c205784608001518181518110614bd757614bd761550c565b01602001516001600160f81b03191682614bf283604e61570f565b81518110614c0257614c0261550c565b60200101906001600160f81b03191690815f1a905350600101614bb8565b505f5b6008811015614c9257614c37816007615961565b614c42906008615744565b60608601516001600160401b0390811691161c60f81b82614c6483607e61570f565b81518110614c7457614c7461550c565b60200101906001600160f81b03191690815f1a905350600101614c23565b50600281604051614ca391906156fe565b602060405180830381855afa158015614cbe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ce19190615397565b94909350915050565b613e0a613dc1565b614cfa613dc1565b80355f80516020615cd283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614d466080840160608501615af1565b60ff161115614db35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610514565b5f614dc46080840160608501615af1565b60ff1611614e2c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610514565b614e3c6080830160608401615af1565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614e6d60608301604084016151ea565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613168613dc1565b60606124f083835f614ee2565b6040516001600160a01b038481166024830152838116604483015260648201839052610a159186918216906323b872dd90608401613f51565b606081471015614f075760405163cd78605960e01b8152306004820152602401610514565b5f80856001600160a01b03168486604051614f2291906156fe565b5f6040518083038185875af1925050503d805f8114614f5c576040519150601f19603f3d011682016040523d82523d5f602084013e614f61565b606091505b509150915061216f868383606082614f8157614f7c82614fc8565b6124f0565b8151158015614f9857506001600160a01b0384163b155b15614fc157604051639996b31560e01b81526001600160a01b0385166004820152602401610514565b50806124f0565b805115614fd85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ffd9061577b565b5f825580601f1061500c575050565b601f0160209004905f5260205f2090810190613e809190615064565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615078575f8155600101615065565b5090565b8015158114613e80575f80fd5b803563ffffffff8116811461509c575f80fd5b919050565b5f805f606084860312156150b3575f80fd5b8335925060208401356150c58161507c565b91506150d360408501615089565b90509250925092565b5f602082840312156150ec575f80fd5b5035919050565b6001600160a01b0381168114613e80575f80fd5b5f8082840361016081121561511a575f80fd5b61014080821215615129575f80fd5b849350830135905061513a816150f3565b809150509250929050565b5f60208284031215615155575f80fd5b6124f082615089565b5f806040838503121561516f575f80fd5b61517883615089565b946020939093013593505050565b5f8060408385031215615197575f80fd5b82356001600160401b038111156151ac575f80fd5b8301608081860312156151bd575f80fd5b91506151cb60208401615089565b90509250929050565b80356001600160401b038116811461509c575f80fd5b5f602082840312156151fa575f80fd5b6124f0826151d4565b5f8060408385031215615214575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061525a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161529560608401826001600160401b03169052565b5060808301516152b060808401826001600160401b03169052565b5060a08301516152cb60a08401826001600160401b03169052565b5060c08301516152e660c08401826001600160401b03169052565b5092915050565b803561ffff8116811461509c575f80fd5b5f805f8060808587031215615311575f80fd5b84356001600160401b03811115615326575f80fd5b850160608188031215615337575f80fd5b9350615345602086016152ed565b9250615353604086016151d4565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156152e6576152e6615363565b5f602082840312156153a7575f80fd5b5051919050565b5f5b838110156153c85781810151838201526020016153b0565b50505f910152565b602081525f82518060208401526153ee8160408501602087016153ae565b601f01601f19169190910160400192915050565b5f8261541c57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156154bc575f80fd5b81356124f0816150f3565b5f808335601e198436030181126154dc575f80fd5b8301803591506001600160401b038211156154f5575f80fd5b6020019150600581901b36038213156122c9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615534575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156155745761557461553e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156155a2576155a261553e565b604052919050565b5f6001600160401b038211156155c2576155c261553e565b50601f01601f191660200190565b5f606082360312156155e0575f80fd5b6155e8615552565b8235815260206155f98185016151d4565b8183015260408401356001600160401b03811115615615575f80fd5b840136601f820112615625575f80fd5b8035615638615633826155aa565b61557a565b818152368483850101111561564b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516156c0818460208a016153ae565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156f08160288401602088016153ae565b016028019695505050505050565b5f82516155348184602087016153ae565b80820180821115610a2b57610a2b615363565b5f63ffffffff80831681810361573a5761573a615363565b6001019392505050565b8082028115828204841417610a2b57610a2b615363565b6001600160401b038181168382160190808211156152e6576152e6615363565b600181811c9082168061578f57607f821691505b6020821081036157ad57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461580c8161577b565b806020870152604060018084165f811461582d576001811461584957615876565b60ff19851660408a0152604084151560051b8a01019550615876565b895f5260205f205f5b8581101561586d5781548b8201860152908301908801615852565b8a016040019650505b509398975050505050505050565b805161509c8161507c565b5f80604083850312156158a0575f80fd5b82516001600160401b03808211156158b6575f80fd5b90840190606082870312156158c9575f80fd5b6158d1615552565b825181526020808401516158e4816150f3565b828201526040840151838111156158f9575f80fd5b80850194505087601f85011261590d575f80fd5b8351925061591d615633846155aa565b8381528882858701011115615930575f80fd5b61593f848383018488016153ae565b80604084015250819550615954818801615884565b9450505050509250929050565b81810381811115610a2b57610a2b615363565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a6a57615a6a615363565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361573a5761573a615363565b5f60208284031215615ae8575f80fd5b6124f0826152ed565b5f60208284031215615b01575f80fd5b813560ff811681146124f0575f80fd5b5f808335601e19843603018112615b26575f80fd5b8301803591506001600160401b03821115615b3f575f80fd5b6020019150368190038213156122c9575f80fd5b601f821115611ddb57805f5260205f20601f840160051c81016020851015615b785750805b601f840160051c820191505b81811015610ba9575f8155600101615b84565b81516001600160401b03811115615bb057615bb061553e565b615bc481615bbe845461577b565b84615b53565b602080601f831160018114615bf7575f8415615be05750858301515b5f19600386901b1c1916600185901b178555615c4e565b5f85815260208120601f198616915b82811015615c2557888601518255948401946001909101908401615c06565b5085821015615c4257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615c66575f80fd5b81516124f08161507c56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", +} + +// ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use ERC20TokenStakingManagerMetaData.ABI instead. +var ERC20TokenStakingManagerABI = ERC20TokenStakingManagerMetaData.ABI + +// ERC20TokenStakingManagerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ERC20TokenStakingManagerMetaData.Bin instead. +var ERC20TokenStakingManagerBin = ERC20TokenStakingManagerMetaData.Bin + +// DeployERC20TokenStakingManager deploys a new Ethereum contract, binding an instance of ERC20TokenStakingManager to it. +func DeployERC20TokenStakingManager(auth *bind.TransactOpts, backend bind.ContractBackend, init uint8) (common.Address, *types.Transaction, *ERC20TokenStakingManager, error) { + parsed, err := ERC20TokenStakingManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ERC20TokenStakingManagerBin), backend, init) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ERC20TokenStakingManager{ERC20TokenStakingManagerCaller: ERC20TokenStakingManagerCaller{contract: contract}, ERC20TokenStakingManagerTransactor: ERC20TokenStakingManagerTransactor{contract: contract}, ERC20TokenStakingManagerFilterer: ERC20TokenStakingManagerFilterer{contract: contract}}, nil +} + +// ERC20TokenStakingManager is an auto generated Go binding around an Ethereum contract. +type ERC20TokenStakingManager struct { + ERC20TokenStakingManagerCaller // Read-only binding to the contract + ERC20TokenStakingManagerTransactor // Write-only binding to the contract + ERC20TokenStakingManagerFilterer // Log filterer for contract events +} + +// ERC20TokenStakingManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type ERC20TokenStakingManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ERC20TokenStakingManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ERC20TokenStakingManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ERC20TokenStakingManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ERC20TokenStakingManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ERC20TokenStakingManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ERC20TokenStakingManagerSession struct { + Contract *ERC20TokenStakingManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ERC20TokenStakingManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ERC20TokenStakingManagerCallerSession struct { + Contract *ERC20TokenStakingManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ERC20TokenStakingManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ERC20TokenStakingManagerTransactorSession struct { + Contract *ERC20TokenStakingManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ERC20TokenStakingManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type ERC20TokenStakingManagerRaw struct { + Contract *ERC20TokenStakingManager // Generic contract binding to access the raw methods on +} + +// ERC20TokenStakingManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ERC20TokenStakingManagerCallerRaw struct { + Contract *ERC20TokenStakingManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// ERC20TokenStakingManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ERC20TokenStakingManagerTransactorRaw struct { + Contract *ERC20TokenStakingManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewERC20TokenStakingManager creates a new instance of ERC20TokenStakingManager, bound to a specific deployed contract. +func NewERC20TokenStakingManager(address common.Address, backend bind.ContractBackend) (*ERC20TokenStakingManager, error) { + contract, err := bindERC20TokenStakingManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManager{ERC20TokenStakingManagerCaller: ERC20TokenStakingManagerCaller{contract: contract}, ERC20TokenStakingManagerTransactor: ERC20TokenStakingManagerTransactor{contract: contract}, ERC20TokenStakingManagerFilterer: ERC20TokenStakingManagerFilterer{contract: contract}}, nil +} + +// NewERC20TokenStakingManagerCaller creates a new read-only instance of ERC20TokenStakingManager, bound to a specific deployed contract. +func NewERC20TokenStakingManagerCaller(address common.Address, caller bind.ContractCaller) (*ERC20TokenStakingManagerCaller, error) { + contract, err := bindERC20TokenStakingManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerCaller{contract: contract}, nil +} + +// NewERC20TokenStakingManagerTransactor creates a new write-only instance of ERC20TokenStakingManager, bound to a specific deployed contract. +func NewERC20TokenStakingManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*ERC20TokenStakingManagerTransactor, error) { + contract, err := bindERC20TokenStakingManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerTransactor{contract: contract}, nil +} + +// NewERC20TokenStakingManagerFilterer creates a new log filterer instance of ERC20TokenStakingManager, bound to a specific deployed contract. +func NewERC20TokenStakingManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*ERC20TokenStakingManagerFilterer, error) { + contract, err := bindERC20TokenStakingManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerFilterer{contract: contract}, nil +} + +// bindERC20TokenStakingManager binds a generic wrapper to an already deployed contract. +func bindERC20TokenStakingManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ERC20TokenStakingManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ERC20TokenStakingManager.Contract.ERC20TokenStakingManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ERC20TokenStakingManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ERC20TokenStakingManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ERC20TokenStakingManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.contract.Transact(opts, method, params...) +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) ADDRESSLENGTH(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "ADDRESS_LENGTH") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ADDRESSLENGTH() (uint32, error) { + return _ERC20TokenStakingManager.Contract.ADDRESSLENGTH(&_ERC20TokenStakingManager.CallOpts) +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) ADDRESSLENGTH() (uint32, error) { + return _ERC20TokenStakingManager.Contract.ADDRESSLENGTH(&_ERC20TokenStakingManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) BLSPUBLICKEYLENGTH(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "BLS_PUBLIC_KEY_LENGTH") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _ERC20TokenStakingManager.Contract.BLSPUBLICKEYLENGTH(&_ERC20TokenStakingManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _ERC20TokenStakingManager.Contract.BLSPUBLICKEYLENGTH(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMCHURNPERCENTAGELIMIT(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_CHURN_PERCENTAGE_LIMIT") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMDELEGATIONFEEBIPS(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_DELEGATION_FEE_BIPS") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMDELEGATIONFEEBIPS() (uint16, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMDELEGATIONFEEBIPS() (uint16, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMREGISTRATIONEXPIRYLENGTH(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_REGISTRATION_EXPIRY_LENGTH") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. +// +// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMSTAKEMULTIPLIERLIMIT(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_STAKE_MULTIPLIER_LIMIT") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. +// +// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMSTAKEMULTIPLIERLIMIT() (uint8, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_ERC20TokenStakingManager.CallOpts) +} + +// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. +// +// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMSTAKEMULTIPLIERLIMIT() (uint8, error) { + return _ERC20TokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_ERC20TokenStakingManager.CallOpts) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) WARPMESSENGER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "WARP_MESSENGER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) WARPMESSENGER() (common.Address, error) { + return _ERC20TokenStakingManager.Contract.WARPMESSENGER(&_ERC20TokenStakingManager.CallOpts) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WARPMESSENGER() (common.Address, error) { + return _ERC20TokenStakingManager.Contract.WARPMESSENGER(&_ERC20TokenStakingManager.CallOpts) +} + +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. +// +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) ActiveValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "activeValidators", nodeID) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. +// +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { + return _ERC20TokenStakingManager.Contract.ActiveValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) +} + +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. +// +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { + return _ERC20TokenStakingManager.Contract.ActiveValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "getValidator", validationID) + + if err != nil { + return *new(Validator), err + } + + out0 := *abi.ConvertType(out[0], new(Validator)).(*Validator) + + return out0, err + +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _ERC20TokenStakingManager.Contract.GetValidator(&_ERC20TokenStakingManager.CallOpts, validationID) +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _ERC20TokenStakingManager.Contract.GetValidator(&_ERC20TokenStakingManager.CallOpts, validationID) +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetWeight(opts *bind.CallOpts, validationID [32]byte) (uint64, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "getWeight", validationID) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) GetWeight(validationID [32]byte) (uint64, error) { + return _ERC20TokenStakingManager.Contract.GetWeight(&_ERC20TokenStakingManager.CallOpts, validationID) +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) GetWeight(validationID [32]byte) (uint64, error) { + return _ERC20TokenStakingManager.Contract.GetWeight(&_ERC20TokenStakingManager.CallOpts, validationID) +} + +// ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. +// +// Solidity: function valueToWeight(uint256 value) pure 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) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. +// +// Solidity: function valueToWeight(uint256 value) pure 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) +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) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) WeightToValue(opts *bind.CallOpts, weight uint64) (*big.Int, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "weightToValue", weight) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// WeightToValue is a free data retrieval call binding the contract method 0x62065856. +// +// Solidity: function weightToValue(uint64 weight) pure 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) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WeightToValue(weight uint64) (*big.Int, error) { + return _ERC20TokenStakingManager.Contract.WeightToValue(&_ERC20TokenStakingManager.CallOpts, weight) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. +// +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegationID) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. +// +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. +// +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. +// +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegationID) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. +// +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. +// +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndValidation", messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndValidation(&_ERC20TokenStakingManager.TransactOpts, messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteEndValidation(&_ERC20TokenStakingManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteValidatorRegistration(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "completeValidatorRegistration", messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) +} + +// Initialize is a paid mutator transaction binding the contract method 0x330a0a3a. +// +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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 0x330a0a3a. +// +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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 0x330a0a3a. +// +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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) +} + +// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. +// +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeDelegatorRegistration", validationID, delegationAmount) +} + +// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. +// +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeDelegatorRegistration(validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegationAmount) +} + +// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. +// +// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeDelegatorRegistration(validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegationAmount) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. +// +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeEndDelegation", delegationID, includeUptimeProof, messageIndex) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. +// +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. +// +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeEndValidation", validationID, includeUptimeProof, messageIndex) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorSet(&_ERC20TokenStakingManager.TransactOpts, subnetConversionData, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.InitializeValidatorSet(&_ERC20TokenStakingManager.TransactOpts, subnetConversionData, messageIndex) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendEndValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "resendEndValidatorMessage", validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendEndValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendEndValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendRegisterValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "resendRegisterValidatorMessage", validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendRegisterValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendRegisterValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendUpdateDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "resendUpdateDelegation", delegationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendUpdateDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ResendUpdateDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) +} + +// ERC20TokenStakingManagerDelegationEndedIterator is returned from FilterDelegationEnded and is used to iterate over the raw logs and unpacked data for DelegationEnded events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegationEndedIterator struct { + Event *ERC20TokenStakingManagerDelegationEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerDelegationEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegationEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegationEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerDelegationEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerDelegationEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegationEnded struct { + DelegationID [32]byte + ValidationID [32]byte + Nonce uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerDelegationEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil +} + +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerDelegationEnded) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { + event := new(ERC20TokenStakingManagerDelegationEnded) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerDelegatorAddedIterator is returned from FilterDelegatorAdded and is used to iterate over the raw logs and unpacked data for DelegatorAdded events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegatorAddedIterator struct { + Event *ERC20TokenStakingManagerDelegatorAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegatorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegatorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerDelegatorAdded represents a DelegatorAdded event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegatorAdded struct { + DelegationID [32]byte + ValidationID [32]byte + DelegatorAddress common.Address + Nonce uint64 + ValidatorWeight uint64 + DelegatorWeight uint64 + SetWeightMessageID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. +// +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (*ERC20TokenStakingManagerDelegatorAddedIterator, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerDelegatorAddedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil +} + +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. +// +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorAdded, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (event.Subscription, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerDelegatorAdded) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegatorAdded is a log parse operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. +// +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*ERC20TokenStakingManagerDelegatorAdded, error) { + event := new(ERC20TokenStakingManagerDelegatorAdded) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerDelegatorRegisteredIterator is returned from FilterDelegatorRegistered and is used to iterate over the raw logs and unpacked data for DelegatorRegistered events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegatorRegisteredIterator struct { + Event *ERC20TokenStakingManagerDelegatorRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegatorRegistered struct { + DelegationID [32]byte + ValidationID [32]byte + Nonce uint64 + StartTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. +// +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerDelegatorRegisteredIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil +} + +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. +// +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerDelegatorRegistered) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. +// +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*ERC20TokenStakingManagerDelegatorRegistered, error) { + event := new(ERC20TokenStakingManagerDelegatorRegistered) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerDelegatorRemovalInitializedIterator is returned from FilterDelegatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for DelegatorRemovalInitialized events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegatorRemovalInitializedIterator struct { + Event *ERC20TokenStakingManagerDelegatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerDelegatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerDelegatorRemovalInitialized struct { + DelegationID [32]byte + ValidationID [32]byte + EndTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerDelegatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerDelegatorRemovalInitialized, error) { + event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerInitialValidatorCreatedIterator struct { + Event *ERC20TokenStakingManagerInitialValidatorCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerInitialValidatorCreated struct { + ValidationID [32]byte + NodeID [32]byte + Weight *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*ERC20TokenStakingManagerInitialValidatorCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerInitialValidatorCreatedIterator{contract: _ERC20TokenStakingManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil +} + +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerInitialValidatorCreated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*ERC20TokenStakingManagerInitialValidatorCreated, error) { + event := new(ERC20TokenStakingManagerInitialValidatorCreated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerInitializedIterator struct { + Event *ERC20TokenStakingManagerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerInitialized represents a Initialized event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*ERC20TokenStakingManagerInitializedIterator, error) { + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerInitialized) (event.Subscription, error) { + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerInitialized) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseInitialized(log types.Log) (*ERC20TokenStakingManagerInitialized, error) { + event := new(ERC20TokenStakingManagerInitialized) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationPeriodCreatedIterator struct { + Event *ERC20TokenStakingManagerValidationPeriodCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerValidationPeriodCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerValidationPeriodCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerValidationPeriodCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationPeriodCreated struct { + ValidationID [32]byte + NodeID [32]byte + RegisterValidationMessageID [32]byte + Weight *big.Int + RegistrationExpiry uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerValidationPeriodCreatedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerValidationPeriodCreated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*ERC20TokenStakingManagerValidationPeriodCreated, error) { + event := new(ERC20TokenStakingManagerValidationPeriodCreated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerValidationPeriodEndedIterator is returned from FilterValidationPeriodEnded and is used to iterate over the raw logs and unpacked data for ValidationPeriodEnded events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationPeriodEndedIterator struct { + Event *ERC20TokenStakingManagerValidationPeriodEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerValidationPeriodEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerValidationPeriodEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerValidationPeriodEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationPeriodEnded struct { + ValidationID [32]byte + Status uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte, status []uint8) (*ERC20TokenStakingManagerValidationPeriodEndedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerValidationPeriodEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodEnded, validationID [][32]byte, status []uint8) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerValidationPeriodEnded) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*ERC20TokenStakingManagerValidationPeriodEnded, error) { + event := new(ERC20TokenStakingManagerValidationPeriodEnded) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerValidationPeriodRegisteredIterator is returned from FilterValidationPeriodRegistered and is used to iterate over the raw logs and unpacked data for ValidationPeriodRegistered events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationPeriodRegisteredIterator struct { + Event *ERC20TokenStakingManagerValidationPeriodRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerValidationPeriodRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerValidationPeriodRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerValidationPeriodRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidationPeriodRegistered struct { + ValidationID [32]byte + Weight *big.Int + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodRegisteredIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerValidationPeriodRegisteredIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerValidationPeriodRegistered) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*ERC20TokenStakingManagerValidationPeriodRegistered, error) { + event := new(ERC20TokenStakingManagerValidationPeriodRegistered) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidatorRemovalInitializedIterator struct { + Event *ERC20TokenStakingManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerValidatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerValidatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerValidatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerValidatorRemovalInitialized represents a ValidatorRemovalInitialized event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidatorRemovalInitialized struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + Weight *big.Int + EndTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*ERC20TokenStakingManagerValidatorRemovalInitializedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerValidatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerValidatorRemovalInitialized) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerValidatorRemovalInitialized, error) { + event := new(ERC20TokenStakingManagerValidatorRemovalInitialized) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// ERC20TokenStakingManagerValidatorWeightUpdateIterator is returned from FilterValidatorWeightUpdate and is used to iterate over the raw logs and unpacked data for ValidatorWeightUpdate events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidatorWeightUpdateIterator struct { + Event *ERC20TokenStakingManagerValidatorWeightUpdate // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerValidatorWeightUpdateIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerValidatorWeightUpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerValidatorWeightUpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerValidatorWeightUpdate represents a ValidatorWeightUpdate event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerValidatorWeightUpdate struct { + ValidationID [32]byte + Nonce uint64 + ValidatorWeight uint64 + SetWeightMessageID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerValidatorWeightUpdateIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerValidatorWeightUpdateIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidatorWeightUpdate", logs: logs, sub: sub}, nil +} + +// WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerValidatorWeightUpdate) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*ERC20TokenStakingManagerValidatorWeightUpdate, error) { + event := new(ERC20TokenStakingManagerValidatorWeightUpdate) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/abi-bindings/go/validatorManager/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/validatorManager/ExampleRewardCalculator/ExampleRewardCalculator.go new file mode 100644 index 000000000..d343cda87 --- /dev/null +++ b/abi-bindings/go/validatorManager/ExampleRewardCalculator/ExampleRewardCalculator.go @@ -0,0 +1,327 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package examplerewardcalculator + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// 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", +} + +// ExampleRewardCalculatorABI is the input ABI used to generate the binding from. +// Deprecated: Use ExampleRewardCalculatorMetaData.ABI instead. +var ExampleRewardCalculatorABI = ExampleRewardCalculatorMetaData.ABI + +// ExampleRewardCalculatorBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use ExampleRewardCalculatorMetaData.Bin instead. +var ExampleRewardCalculatorBin = ExampleRewardCalculatorMetaData.Bin + +// DeployExampleRewardCalculator deploys a new Ethereum contract, binding an instance of ExampleRewardCalculator to it. +func DeployExampleRewardCalculator(auth *bind.TransactOpts, backend bind.ContractBackend, rewardBasisPoints_ uint64) (common.Address, *types.Transaction, *ExampleRewardCalculator, error) { + parsed, err := ExampleRewardCalculatorMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ExampleRewardCalculatorBin), backend, rewardBasisPoints_) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &ExampleRewardCalculator{ExampleRewardCalculatorCaller: ExampleRewardCalculatorCaller{contract: contract}, ExampleRewardCalculatorTransactor: ExampleRewardCalculatorTransactor{contract: contract}, ExampleRewardCalculatorFilterer: ExampleRewardCalculatorFilterer{contract: contract}}, nil +} + +// ExampleRewardCalculator is an auto generated Go binding around an Ethereum contract. +type ExampleRewardCalculator struct { + ExampleRewardCalculatorCaller // Read-only binding to the contract + ExampleRewardCalculatorTransactor // Write-only binding to the contract + ExampleRewardCalculatorFilterer // Log filterer for contract events +} + +// ExampleRewardCalculatorCaller is an auto generated read-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorTransactor is an auto generated write-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type ExampleRewardCalculatorFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// ExampleRewardCalculatorSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type ExampleRewardCalculatorSession struct { + Contract *ExampleRewardCalculator // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ExampleRewardCalculatorCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type ExampleRewardCalculatorCallerSession struct { + Contract *ExampleRewardCalculatorCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// ExampleRewardCalculatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type ExampleRewardCalculatorTransactorSession struct { + Contract *ExampleRewardCalculatorTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// ExampleRewardCalculatorRaw is an auto generated low-level Go binding around an Ethereum contract. +type ExampleRewardCalculatorRaw struct { + Contract *ExampleRewardCalculator // Generic contract binding to access the raw methods on +} + +// ExampleRewardCalculatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorCallerRaw struct { + Contract *ExampleRewardCalculatorCaller // Generic read-only contract binding to access the raw methods on +} + +// ExampleRewardCalculatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type ExampleRewardCalculatorTransactorRaw struct { + Contract *ExampleRewardCalculatorTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewExampleRewardCalculator creates a new instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculator(address common.Address, backend bind.ContractBackend) (*ExampleRewardCalculator, error) { + contract, err := bindExampleRewardCalculator(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &ExampleRewardCalculator{ExampleRewardCalculatorCaller: ExampleRewardCalculatorCaller{contract: contract}, ExampleRewardCalculatorTransactor: ExampleRewardCalculatorTransactor{contract: contract}, ExampleRewardCalculatorFilterer: ExampleRewardCalculatorFilterer{contract: contract}}, nil +} + +// NewExampleRewardCalculatorCaller creates a new read-only instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorCaller(address common.Address, caller bind.ContractCaller) (*ExampleRewardCalculatorCaller, error) { + contract, err := bindExampleRewardCalculator(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorCaller{contract: contract}, nil +} + +// NewExampleRewardCalculatorTransactor creates a new write-only instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorTransactor(address common.Address, transactor bind.ContractTransactor) (*ExampleRewardCalculatorTransactor, error) { + contract, err := bindExampleRewardCalculator(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorTransactor{contract: contract}, nil +} + +// NewExampleRewardCalculatorFilterer creates a new log filterer instance of ExampleRewardCalculator, bound to a specific deployed contract. +func NewExampleRewardCalculatorFilterer(address common.Address, filterer bind.ContractFilterer) (*ExampleRewardCalculatorFilterer, error) { + contract, err := bindExampleRewardCalculator(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &ExampleRewardCalculatorFilterer{contract: contract}, nil +} + +// bindExampleRewardCalculator binds a generic wrapper to an already deployed contract. +func bindExampleRewardCalculator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := ExampleRewardCalculatorMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _ExampleRewardCalculator.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _ExampleRewardCalculator.Contract.contract.Transact(opts, method, params...) +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) SECONDSINYEAR(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "SECONDS_IN_YEAR") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) SECONDSINYEAR() (*big.Int, error) { + return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) +} + +// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. +// +// Solidity: function SECONDS_IN_YEAR() view returns(uint256) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINYEAR() (*big.Int, error) { + return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) +} + +// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. +// +// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { + return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) +} + +// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. +// +// 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) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. +// +// 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) +} + +// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. +// +// 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) +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) RewardBasisPoints(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _ExampleRewardCalculator.contract.Call(opts, &out, "rewardBasisPoints") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) RewardBasisPoints() (uint64, error) { + return _ExampleRewardCalculator.Contract.RewardBasisPoints(&_ExampleRewardCalculator.CallOpts) +} + +// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. +// +// Solidity: function rewardBasisPoints() view returns(uint64) +func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) RewardBasisPoints() (uint64, error) { + return _ExampleRewardCalculator.Contract.RewardBasisPoints(&_ExampleRewardCalculator.CallOpts) +} diff --git a/abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go new file mode 100644 index 000000000..9cf250ac3 --- /dev/null +++ b/abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -0,0 +1,2637 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package nativetokenstakingmanager + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// InitialValidator is an auto generated low-level Go binding around an user-defined struct. +type InitialValidator struct { + NodeID [32]byte + Weight uint64 + BlsPublicKey []byte +} + +// PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type PoSValidatorManagerSettings struct { + BaseSettings ValidatorManagerSettings + MinimumStakeAmount *big.Int + MaximumStakeAmount *big.Int + MinimumStakeDuration uint64 + MinimumDelegationFeeBips uint16 + MaximumStakeMultiplier uint8 + RewardCalculator common.Address +} + +// SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. +type SubnetConversionData struct { + ConvertSubnetTxID [32]byte + ValidatorManagerBlockchainID [32]byte + ValidatorManagerAddress common.Address + InitialValidators []InitialValidator +} + +// Validator is an auto generated low-level Go binding around an user-defined struct. +type Validator struct { + Status uint8 + NodeID [32]byte + StartingWeight uint64 + MessageNonce uint64 + Weight uint64 + StartedAt uint64 + EndedAt uint64 +} + +// ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type ValidatorManagerSettings struct { + PChainBlockchainID [32]byte + SubnetID [32]byte + ChurnPeriodSeconds uint64 + MaximumChurnPercentage uint8 +} + +// ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. +type ValidatorRegistrationInput struct { + NodeID [32]byte + RegistrationExpiry uint64 + BlsPublicKey []byte +} + +// 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615b3d380380615b3d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159f08061014d5f395ff3fe60806040526004361061017b575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f14610492578063c974d1b6146104a5578063d5f20ff6146104b9578063df93d8de146104e5575f80fd5b8063b771b3bc1461043a578063ba3a4b9714610454578063bee0a03f14610473575f80fd5b8063620658561461038b57806366435abf146103aa57806376f78621146103c95780638280a25a146103e857806398f3e2b4146103fc578063a3a65e481461041b575f80fd5b8063329c3e1211610138578063467ef06f11610113578063467ef06f146103055780635297fae61461032457806360305d621461034357806361e2f4901461036c575f80fd5b8063329c3e121461029857806335455ded146102ca57806340034a93146102f2575f80fd5b80630118acc41461017f5780630322ed98146101a05780630cdd0985146101bf578063151d30d11461021c5780631f7a9d8f146102425780632e2194d814610261575b5f80fd5b34801561018a575f80fd5b5061019e610199366004614df0565b6104fb565b005b3480156101ab575f80fd5b5061019e6101ba366004614e2b565b61099e565b3480156101ca575f80fd5b506102096101d9366004614e2b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610227575f80fd5b50610230600a81565b60405160ff9091168152602001610213565b34801561024d575f80fd5b5061019e61025c366004614e42565b610b57565b34801561026c575f80fd5b5061028061027b366004614e2b565b610c34565b6040516001600160401b039091168152602001610213565b3480156102a3575f80fd5b506102b26001600160991b0181565b6040516001600160a01b039091168152602001610213565b3480156102d5575f80fd5b506102df61271081565b60405161ffff9091168152602001610213565b610209610300366004614e80565b610c4a565b348015610310575f80fd5b5061019e61031f366004614ed4565b610c7e565b34801561032f575f80fd5b5061019e61033e366004614eed565b610d1e565b34801561034e575f80fd5b50610357601481565b60405163ffffffff9091168152602001610213565b348015610377575f80fd5b5061019e610386366004614f15565b610ef3565b348015610396575f80fd5b506102096103a5366004614f63565b611527565b3480156103b5575f80fd5b506102806103c4366004614e2b565b611540565b3480156103d4575f80fd5b5061019e6103e3366004614df0565b611554565b3480156103f3575f80fd5b50610230603081565b348015610407575f80fd5b5061019e610416366004614eed565b61174e565b348015610426575f80fd5b5061019e610435366004614ed4565b6119d0565b348015610445575f80fd5b506102b26005600160991b0181565b34801561045f575f80fd5b5061019e61046e366004614e2b565b611b88565b34801561047e575f80fd5b5061019e61048d366004614e2b565b611e0e565b6102096104a0366004614e2b565b611f22565b3480156104b0575f80fd5b50610230601481565b3480156104c4575f80fd5b506104d86104d3366004614e2b565b611f53565b6040516102139190614f90565b3480156104f0575f80fd5b506102806202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615944833981519152949193919290829060ff16600481111561056357610563614f7c565b600481111561057457610574614f7c565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105f083611f53565b905060028251600481111561060757610607614f7c565b146106595760405162461bcd60e51b815260206004820152602a60248201525f805160206159648339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106be5760405162461bcd60e51b815260206004820152603360248201525f805160206159648339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610650565b6003825280515f9060029060058111156106da576106da614f7c565b036107315786156106f2576106ef848761201b565b90505b5f83606001518360800151610707919061505a565b905061071385826122b7565b506001600160401b0390811660e0860152421660a085015250610765565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107988560600151611527565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610815573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610839919061507a565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561087857610878614f7c565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161098c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206159c48339815191526020526040808220815160e0810190925280545f8051602061598483398151915293929190829060ff1660058111156109eb576109eb614f7c565b60058111156109fc576109fc614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a6b57610a6b614f7c565b14610ad05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb610af58584606001515f61240e565b6040518263ffffffff1660e01b8152600401610b1191906150b3565b6020604051808303815f875af1158015610b2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b51919061507a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ba0575080546001600160401b03808416911610155b15610bbe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be883612633565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4464e8d4a51000836150e5565b92915050565b5f610c53612647565b610c5f8484843461267e565b9050610c7760015f805160206159a483398151915255565b9392505050565b5f805160206159448339815191525f80610c97846128fb565b91509150610ca482612c45565b610cae5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610cdc57610cdc614f7c565b03610d01575f83815260088501602052604081208054919055610cff8282612c80565b505b610d1781610d128460400151611527565b612ce6565b5050505050565b5f805160206159448339815191525f610d3684612cf9565b90505f80610d478360400151612ed3565b50915091505f610d5683611f53565b9050816001600160401b031681606001516001600160401b03161015610d8e5760405162461bcd60e51b815260040161065090615104565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dd35760405162461bcd60e51b815260040161065090615146565b60015f87815260068701602052604090205460ff166004811115610df957610df9614f7c565b14610e625760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610650565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206159848339815191529060ff1615610f905760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff7919061507a565b8360200135146110595760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610650565b3061106a60608501604086016151a3565b6001600160a01b0316146110dc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610650565b5f6110ea60608501856151be565b91505f90508435602086013560146111086060890160408a016151a3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611437575f61118860608901896151be565b8363ffffffff1681811061119e5761119e615203565b90506020028101906111b09190615217565b6111b9906152c7565b80515f81815260098901602052604090205491925090156111ec5760405162461bcd60e51b81526004016106509061535e565b84825f01518360200151846040015160405160200161120e94939291906153a6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161125c91906153f5565b602060405180830381855afa158015611277573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061129a919061507a565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561132657611326614f7c565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113d9911686615406565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061143090615419565b905061116c565b50600584018190555f61144986612cf9565b90505f611459826040015161310e565b90508060028560405161146c91906153f5565b602060405180830381855afa158015611487573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114aa919061507a565b1461150e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610650565b505050600a909201805460ff1916600117905550505050565b5f610c446001600160401b03831664e8d4a5100061543b565b5f61154a82611f53565b6080015192915050565b5f805160206159448339815191525f61156c85613277565b5f86815260058401602052604090205460a082015191925061159f91600160b01b9091046001600160401b031690615452565b6001600160401b03168160c001516001600160401b031610156116205760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610650565b8315610d17575f611631868561201b565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061168890611527565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156116fe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611722919061507a565b5f87815260088501602052604081208054909190611741908490615406565b9091555050505050505050565b611756612647565b5f805160206159448339815191525f61176e84612cf9565b90505f8061177f8360400151612ed3565b50915091505f61178e83611f53565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117c8576117c8614f7c565b60048111156117d9576117d9614f7c565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156118785760405162461bcd60e51b815260040161065090615104565b826001600160401b03168160e001516001600160401b031611156118ae5760405162461bcd60e51b815260040161065090615146565b6003815160048111156118c3576118c3614f7c565b146119175760405162461bcd60e51b815260206004820152603160248201525f805160206159648339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610650565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a019092529091205461194d9190612c80565b856007015f8881526020019081526020015f205f90556119788160200151610d128360600151611527565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506119cc60015f805160206159a483398151915255565b5050565b5f805160206159848339815191525f6119e883612cf9565b90505f806119f983604001516134f2565b9150915080611a5b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610650565b5f82815260078501602052604081208054611a7590615472565b9050118015611aa7575060015f83815260088601602052604090205460ff166005811115611aa557611aa5614f7c565b145b611ac35760405162461bcd60e51b8152600401610650906154a4565b5f8281526007850160205260408120611adb91614d45565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061594483398151915293929190829060ff166004811115611be957611be9614f7c565b6004811115611bfa57611bfa614f7c565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611c8157611c81614f7c565b1480611c9f5750600381516004811115611c9d57611c9d614f7c565b145b611cf35760405162461bcd60e51b815260206004820152603260248201525f80516020615964833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610650565b5f611d018260400151611f53565b905080606001516001600160401b03165f03611d855760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb611db284604001518460600151856080015161240e565b6040518263ffffffff1660e01b8152600401611dce91906150b3565b6020604051808303815f875af1158015611dea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d17919061507a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615984833981519152929190611e5690615472565b9050118015611e88575060015f83815260088301602052604090205460ff166005811115611e8657611e86614f7c565b145b611ea45760405162461bcd60e51b8152600401610650906154a4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611edd91906004016154eb565b6020604051808303815f875af1158015611ef9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1d919061507a565b505050565b5f611f2b612647565b611f36823334613693565b9050611f4e60015f805160206159a483398151915255565b919050565b611f5b614d7c565b5f8281525f805160206159c4833981519152602052604090819020815160e0810190925280545f80516020615984833981519152929190829060ff166005811115611fa857611fa8614f7c565b6005811115611fb957611fb9614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612066573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208d9190810190615580565b91509150806120f05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612133573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612157919061507a565b8251146121bb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610650565b60208201516001600160a01b0316156122315760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610650565b5f806122408460400151613a4a565b915091508187146122ad5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610650565b9695505050505050565b5f8281525f805160206159c4833981519152602052604081206002015481905f8051602061598483398151915290600160801b90046001600160401b03166122ff8582613c22565b5f61230987613e30565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123598a858b61240e565b6040518263ffffffff1660e01b815260040161237591906150b3565b6020604051808303815f875af1158015612391573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123b5919061507a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561248757612447816001615652565b61245290600861543b565b5081515f9083908390811061246957612469615203565b60200101906001600160f81b03191690815f1a905350600101612433565b505f5b60048110156124f25761249e816003615652565b6124a990600861543b565b600263ffffffff16901c60f81b828260026124c49190615406565b815181106124d4576124d4615203565b60200101906001600160f81b03191690815f1a90535060010161248a565b505f5b60208110156125545761250981601f615652565b61251490600861543b565b86901c60f81b82612526836006615406565b8151811061253657612536615203565b60200101906001600160f81b03191690815f1a9053506001016124f5565b505f5b60088110156125bf5761256b816007615652565b61257690600861543b565b6001600160401b038616901c60f81b82612591836026615406565b815181106125a1576125a1615203565b60200101906001600160f81b03191690815f1a905350600101612557565b505f5b600881101561262a576125d6816007615652565b6125e190600861543b565b6001600160401b038516901c60f81b826125fc83602e615406565b8151811061260c5761260c615203565b60200101906001600160f81b03191690815f1a9053506001016125c2565b50949350505050565b61263b613ec0565b61264481613f0b565b50565b5f805160206159a483398151915280546001190161267857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206159448339815191529061ffff8616108015906126ca575061271061ffff861611155b6126e65760405162461bcd60e51b815260040161065090615665565b60028101546001600160401b03908116908516101561275f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610650565b80548310156127c25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610650565b80600101548311156128295760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610650565b825f61283482610c34565b90505f6128418983613f7f565b905060405180606001604052806128553390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f805160206159a483398151915255565b5f612904614d7c565b5f805160206159848339815191525f61291c85612cf9565b90505f8061292d83604001516134f2565b9150915080156129925760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610650565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156129c3576129c3614f7c565b60058111156129d4576129d4614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612a4557612a45614f7c565b1480612a635750600182516005811115612a6157612a61614f7c565b145b612ac25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610650565b600382516005811115612ad757612ad7614f7c565b03612ae457506004612ae8565b5060055b6020808301515f90815260098801909152604081205581816005811115612b1157612b11614f7c565b90816005811115612b2457612b24614f7c565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612b5857612b58614f7c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612c0c57612c0c614f7c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ccc575f80fd5b505af1158015612cde573d5f803e3d5ffd5b505050505050565b6119cc6001600160a01b038316826144e4565b60408051606080820183525f8083526020830181905292820152905f805160206159848339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612d6e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612d959190810190615580565b9150915080612df55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610650565b8254825114612e585760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610650565b60208201516001600160a01b031615612ecb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610650565b509392505050565b5f805f8351603614612ef75760405162461bcd60e51b8152600401610650906156b0565b5f805b6002811015612f4657612f0e816001615652565b612f1990600861543b565b61ffff16868281518110612f2f57612f2f615203565b016020015160f81c901b9190911790600101612efa565b5061ffff811615612f695760405162461bcd60e51b8152600401610650906156f9565b5f805b6004811015612fc457612f80816003615652565b612f8b90600861543b565b63ffffffff1687612f9d836002615406565b81518110612fad57612fad615203565b016020015160f81c901b9190911790600101612f6c565b5063ffffffff8116600414612feb5760405162461bcd60e51b81526004016106509061573c565b5f805b60208110156130405761300281601f615652565b61300d90600861543b565b88613019836006615406565b8151811061302957613029615203565b016020015160f81c901b9190911790600101612fee565b505f805b600881101561309f57613058816007615652565b61306390600861543b565b6001600160401b031689613078836026615406565b8151811061308857613088615203565b016020015160f81c901b9190911790600101613044565b505f805b60088110156130fe576130b7816007615652565b6130c290600861543b565b6001600160401b03168a6130d783602e615406565b815181106130e7576130e7615203565b016020015160f81c901b91909117906001016130a3565b5091989097509095509350505050565b5f81516026146131305760405162461bcd60e51b8152600401610650906156b0565b5f805b600281101561317f57613147816001615652565b61315290600861543b565b61ffff1684828151811061316857613168615203565b016020015160f81c901b9190911790600101613133565b5061ffff8116156131a25760405162461bcd60e51b8152600401610650906156f9565b5f805b60048110156131fd576131b9816003615652565b6131c490600861543b565b63ffffffff16856131d6836002615406565b815181106131e6576131e6615203565b016020015160f81c901b91909117906001016131a5565b5063ffffffff8116156132225760405162461bcd60e51b81526004016106509061573c565b5f805b602081101561262a5761323981601f615652565b61324490600861543b565b86613250836006615406565b8151811061326057613260615203565b016020015160f81c901b9190911790600101613225565b61327f614d7c565b5f8281525f805160206159c48339815191526020526040808220815160e0810190925280545f8051602061598483398151915293929190829060ff1660058111156132cc576132cc614f7c565b60058111156132dd576132dd614f7c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561334f5761334f614f7c565b146133ab5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610650565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156133ef576133ef614f7c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61349b85826122b7565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146135155760405162461bcd60e51b8152600401610650906156b0565b5f805b60028110156135645761352c816001615652565b61353790600861543b565b61ffff1685828151811061354d5761354d615203565b016020015160f81c901b9190911790600101613518565b5061ffff8116156135875760405162461bcd60e51b8152600401610650906156f9565b5f805b60048110156135e25761359e816003615652565b6135a990600861543b565b63ffffffff16866135bb836002615406565b815181106135cb576135cb615203565b016020015160f81c901b919091179060010161358a565b5063ffffffff81166003146136095760405162461bcd60e51b81526004016106509061573c565b5f805b602081101561365e5761362081601f615652565b61362b90600861543b565b87613637836006615406565b8151811061364757613647615203565b016020015160f81c901b919091179060010161360c565b505f8660268151811061367357613673615203565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615944833981519152816136ac84610c34565b90505f6136b887611f53565b90506136c387612c45565b6137205760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610650565b60028151600581111561373557613735614f7c565b146137945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610650565b5f8282608001516137a59190615452565b600485015460408401519192506137c7916001600160401b0390911690615783565b6001600160401b0316816001600160401b031611156138465760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610650565b5f806138528a846122b7565b915091505f8a8360405160200161388092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561391b5761391b614f7c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613a6d5760405162461bcd60e51b8152600401610650906156b0565b5f805b6002811015613abc57613a84816001615652565b613a8f90600861543b565b61ffff16858281518110613aa557613aa5615203565b016020015160f81c901b9190911790600101613a70565b5061ffff811615613adf5760405162461bcd60e51b8152600401610650906156f9565b5f805b6004811015613b3a57613af6816003615652565b613b0190600861543b565b63ffffffff1686613b13836002615406565b81518110613b2357613b23615203565b016020015160f81c901b9190911790600101613ae2565b5063ffffffff8116600514613b615760405162461bcd60e51b81526004016106509061573c565b5f805b6020811015613bb657613b7881601f615652565b613b8390600861543b565b87613b8f836006615406565b81518110613b9f57613b9f615203565b016020015160f81c901b9190911790600101613b64565b505f805b6008811015613c1557613bce816007615652565b613bd990600861543b565b6001600160401b031688613bee836026615406565b81518110613bfe57613bfe615203565b016020015160f81c901b9190911790600101613bba565b5090969095509350505050565b5f805160206159848339815191525f6001600160401b038084169085161115613c5657613c4f838561505a565b9050613c63565b613c60848461505a565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613cc5575060028401548151613cc1916001600160401b031690615406565b8210155b15613ceb576001600160401b038316606082015281815260408101516020820152613d0a565b8281606001818151613cfd9190615452565b6001600160401b03169052505b6060810151613d1a906064615783565b602082015160028601546001600160401b039290921691613d459190600160401b900460ff1661543b565b1015613da95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610650565b856001600160401b031681604001818151613dc49190615406565b9052506040810180516001600160401b0387169190613de4908390615652565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206159c48339815191526020526040812060020180545f8051602061598483398151915291600160401b9091046001600160401b0316906008613e7a836157ae565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f0957604051631afcd79f60e31b815260040160405180910390fd5b565b613f13613ec0565b613f1c81614577565b613f24614590565b612644608082013560a0830135613f4160e0850160c08601614f63565b613f52610100860160e087016157c9565b61ffff16613f68610120870161010088016157e2565b613f7a610140880161012089016151a3565b6145a0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661400a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610650565b5f80516020615984833981519152426140296040860160208701614f63565b6001600160401b03161161409b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610650565b6140ab6040850160208601614f63565b6001600160401b03166140c16202a30042615406565b116141345760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610650565b833561418c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610650565b83355f908152600982016020526040902054156141bb5760405162461bcd60e51b81526004016106509061535e565b60306141ca6040860186615802565b90501461422f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610650565b614239835f613c22565b5f806142d36040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061427e9190614f63565b6001600160401b0316815260200161429960408a018a615802565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506147e4565b5f828152600786016020526040902091935091506142f18282615888565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061431e9085906004016150b3565b6020604051808303815f875af115801561433a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061435e919061507a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156143d6576143d6614f7c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916144b6918e01908e01614f63565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145075760405163cd78605960e01b8152306004820152602401610650565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614550576040519150601f19603f3d011682016040523d82523d5f602084013e614555565b606091505b5050905080611f1d57604051630a12f52160e11b815260040160405180910390fd5b61457f613ec0565b614587614b93565b61264481614b9b565b614598613ec0565b613f09614d3d565b6145a8613ec0565b5f80516020615944833981519152836146145760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610650565b6127108411156146365760405162461bcd60e51b815260040161065090615665565b8587111561469e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610650565b5f8360ff161161470b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610650565b600a60ff8416111561477d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610650565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461484e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610650565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156148c557614885816001615652565b61489090600861543b565b5081515f908390839081106148a7576148a7615203565b60200101906001600160f81b03191690815f1a905350600101614871565b505f5b600481101561492d576148dc816003615652565b6148e790600861543b565b600160ff919091161c60f81b826148ff836002615406565b8151811061490f5761490f615203565b60200101906001600160f81b03191690815f1a9053506001016148c8565b505f5b602081101561498a578451816020811061494c5761494c615203565b1a60f81b8261495c836006615406565b8151811061496c5761496c615203565b60200101906001600160f81b03191690815f1a905350600101614930565b505f5b60208110156149ea57846020015181602081106149ac576149ac615203565b1a60f81b826149bc836026615406565b815181106149cc576149cc615203565b60200101906001600160f81b03191690815f1a90535060010161498d565b505f5b6008811015614a5e57614a01816007615652565b614a0c90600861543b565b60ff1685604001516001600160401b0316901c60f81b82826046614a309190615406565b81518110614a4057614a40615203565b60200101906001600160f81b03191690815f1a9053506001016149ed565b505f5b6030811015614ac95784608001518181518110614a8057614a80615203565b01602001516001600160f81b03191682614a9b83604e615406565b81518110614aab57614aab615203565b60200101906001600160f81b03191690815f1a905350600101614a61565b505f5b6008811015614b3b57614ae0816007615652565b614aeb90600861543b565b60608601516001600160401b0390811691161c60f81b82614b0d83607e615406565b81518110614b1d57614b1d615203565b60200101906001600160f81b03191690815f1a905350600101614acc565b50600281604051614b4c91906153f5565b602060405180830381855afa158015614b67573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614b8a919061507a565b94909350915050565b613f09613ec0565b614ba3613ec0565b80355f8051602061598483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614bef60808401606085016157e2565b60ff161115614c5c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610650565b5f614c6d60808401606085016157e2565b60ff1611614cd55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610650565b614ce560808301606084016157e2565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d166060830160408401614f63565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6128e8613ec0565b508054614d5190615472565b5f825580601f10614d60575050565b601f0160209004905f5260205f20908101906126449190614db8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614dcc575f8155600101614db9565b5090565b8015158114612644575f80fd5b803563ffffffff81168114611f4e575f80fd5b5f805f60608486031215614e02575f80fd5b833592506020840135614e1481614dd0565b9150614e2260408501614ddd565b90509250925092565b5f60208284031215614e3b575f80fd5b5035919050565b5f6101408284031215614e53575f80fd5b50919050565b803561ffff81168114611f4e575f80fd5b80356001600160401b0381168114611f4e575f80fd5b5f805f60608486031215614e92575f80fd5b83356001600160401b03811115614ea7575f80fd5b840160608187031215614eb8575f80fd5b9250614ec660208501614e59565b9150614e2260408501614e6a565b5f60208284031215614ee4575f80fd5b610c7782614ddd565b5f8060408385031215614efe575f80fd5b614f0783614ddd565b946020939093013593505050565b5f8060408385031215614f26575f80fd5b82356001600160401b03811115614f3b575f80fd5b830160808186031215614f4c575f80fd5b9150614f5a60208401614ddd565b90509250929050565b5f60208284031215614f73575f80fd5b610c7782614e6a565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614fb357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614fee60608401826001600160401b03169052565b50608083015161500960808401826001600160401b03169052565b5060a083015161502460a08401826001600160401b03169052565b5060c083015161503f60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561503f5761503f615046565b5f6020828403121561508a575f80fd5b5051919050565b5f5b838110156150ab578181015183820152602001615093565b50505f910152565b602081525f82518060208401526150d1816040850160208701615091565b601f01601f19169190910160400192915050565b5f826150ff57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612644575f80fd5b5f602082840312156151b3575f80fd5b8135610c778161518f565b5f808335601e198436030181126151d3575f80fd5b8301803591506001600160401b038211156151ec575f80fd5b6020019150600581901b3603821315612407575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261522b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561526b5761526b615235565b60405290565b604051601f8201601f191681016001600160401b038111828210171561529957615299615235565b604052919050565b5f6001600160401b038211156152b9576152b9615235565b50601f01601f191660200190565b5f606082360312156152d7575f80fd5b6152df615249565b8235815260206152f0818501614e6a565b8183015260408401356001600160401b0381111561530c575f80fd5b840136601f82011261531c575f80fd5b803561532f61532a826152a1565b615271565b8181523684838501011115615342575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516153b7818460208a01615091565b80830190508581526001600160401b0360c01b8560c01b16602082015283516153e7816028840160208801615091565b016028019695505050505050565b5f825161522b818460208701615091565b80820180821115610c4457610c44615046565b5f63ffffffff80831681810361543157615431615046565b6001019392505050565b8082028115828204841417610c4457610c44615046565b6001600160401b0381811683821601908082111561503f5761503f615046565b600181811c9082168061548657607f821691505b602082108103614e5357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546154fd81615472565b806020870152604060018084165f811461551e576001811461553a57615567565b60ff19851660408a0152604084151560051b8a01019550615567565b895f5260205f205f5b8581101561555e5781548b8201860152908301908801615543565b8a016040019650505b509398975050505050505050565b8051611f4e81614dd0565b5f8060408385031215615591575f80fd5b82516001600160401b03808211156155a7575f80fd5b90840190606082870312156155ba575f80fd5b6155c2615249565b825181526020808401516155d58161518f565b828201526040840151838111156155ea575f80fd5b80850194505087601f8501126155fe575f80fd5b8351925061560e61532a846152a1565b8381528882858701011115615621575f80fd5b61563084838301848801615091565b80604084015250819550615645818801615575565b9450505050509250929050565b81810381811115610c4457610c44615046565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146157a6576157a6615046565b505092915050565b5f6001600160401b0380831681810361543157615431615046565b5f602082840312156157d9575f80fd5b610c7782614e59565b5f602082840312156157f2575f80fd5b813560ff81168114610c77575f80fd5b5f808335601e19843603018112615817575f80fd5b8301803591506001600160401b03821115615830575f80fd5b602001915036819003821315612407575f80fd5b601f821115611f1d57805f5260205f20601f840160051c810160208510156158695750805b601f840160051c820191505b81811015610d17575f8155600101615875565b81516001600160401b038111156158a1576158a1615235565b6158b5816158af8454615472565b84615844565b602080601f8311600181146158e8575f84156158d15750858301515b5f19600386901b1c1916600185901b178555612cde565b5f85815260208120601f198616915b82811015615916578886015182559484019460019091019084016158f7565b508582101561593357878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", +} + +// NativeTokenStakingManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use NativeTokenStakingManagerMetaData.ABI instead. +var NativeTokenStakingManagerABI = NativeTokenStakingManagerMetaData.ABI + +// NativeTokenStakingManagerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use NativeTokenStakingManagerMetaData.Bin instead. +var NativeTokenStakingManagerBin = NativeTokenStakingManagerMetaData.Bin + +// DeployNativeTokenStakingManager deploys a new Ethereum contract, binding an instance of NativeTokenStakingManager to it. +func DeployNativeTokenStakingManager(auth *bind.TransactOpts, backend bind.ContractBackend, init uint8) (common.Address, *types.Transaction, *NativeTokenStakingManager, error) { + parsed, err := NativeTokenStakingManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(NativeTokenStakingManagerBin), backend, init) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &NativeTokenStakingManager{NativeTokenStakingManagerCaller: NativeTokenStakingManagerCaller{contract: contract}, NativeTokenStakingManagerTransactor: NativeTokenStakingManagerTransactor{contract: contract}, NativeTokenStakingManagerFilterer: NativeTokenStakingManagerFilterer{contract: contract}}, nil +} + +// NativeTokenStakingManager is an auto generated Go binding around an Ethereum contract. +type NativeTokenStakingManager struct { + NativeTokenStakingManagerCaller // Read-only binding to the contract + NativeTokenStakingManagerTransactor // Write-only binding to the contract + NativeTokenStakingManagerFilterer // Log filterer for contract events +} + +// NativeTokenStakingManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type NativeTokenStakingManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// NativeTokenStakingManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type NativeTokenStakingManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// NativeTokenStakingManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type NativeTokenStakingManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// NativeTokenStakingManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type NativeTokenStakingManagerSession struct { + Contract *NativeTokenStakingManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// NativeTokenStakingManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type NativeTokenStakingManagerCallerSession struct { + Contract *NativeTokenStakingManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// NativeTokenStakingManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type NativeTokenStakingManagerTransactorSession struct { + Contract *NativeTokenStakingManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// NativeTokenStakingManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type NativeTokenStakingManagerRaw struct { + Contract *NativeTokenStakingManager // Generic contract binding to access the raw methods on +} + +// NativeTokenStakingManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type NativeTokenStakingManagerCallerRaw struct { + Contract *NativeTokenStakingManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// NativeTokenStakingManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type NativeTokenStakingManagerTransactorRaw struct { + Contract *NativeTokenStakingManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewNativeTokenStakingManager creates a new instance of NativeTokenStakingManager, bound to a specific deployed contract. +func NewNativeTokenStakingManager(address common.Address, backend bind.ContractBackend) (*NativeTokenStakingManager, error) { + contract, err := bindNativeTokenStakingManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &NativeTokenStakingManager{NativeTokenStakingManagerCaller: NativeTokenStakingManagerCaller{contract: contract}, NativeTokenStakingManagerTransactor: NativeTokenStakingManagerTransactor{contract: contract}, NativeTokenStakingManagerFilterer: NativeTokenStakingManagerFilterer{contract: contract}}, nil +} + +// NewNativeTokenStakingManagerCaller creates a new read-only instance of NativeTokenStakingManager, bound to a specific deployed contract. +func NewNativeTokenStakingManagerCaller(address common.Address, caller bind.ContractCaller) (*NativeTokenStakingManagerCaller, error) { + contract, err := bindNativeTokenStakingManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerCaller{contract: contract}, nil +} + +// NewNativeTokenStakingManagerTransactor creates a new write-only instance of NativeTokenStakingManager, bound to a specific deployed contract. +func NewNativeTokenStakingManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*NativeTokenStakingManagerTransactor, error) { + contract, err := bindNativeTokenStakingManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerTransactor{contract: contract}, nil +} + +// NewNativeTokenStakingManagerFilterer creates a new log filterer instance of NativeTokenStakingManager, bound to a specific deployed contract. +func NewNativeTokenStakingManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*NativeTokenStakingManagerFilterer, error) { + contract, err := bindNativeTokenStakingManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerFilterer{contract: contract}, nil +} + +// bindNativeTokenStakingManager binds a generic wrapper to an already deployed contract. +func bindNativeTokenStakingManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := NativeTokenStakingManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_NativeTokenStakingManager *NativeTokenStakingManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _NativeTokenStakingManager.Contract.NativeTokenStakingManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_NativeTokenStakingManager *NativeTokenStakingManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.NativeTokenStakingManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_NativeTokenStakingManager *NativeTokenStakingManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.NativeTokenStakingManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _NativeTokenStakingManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.contract.Transact(opts, method, params...) +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) ADDRESSLENGTH(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "ADDRESS_LENGTH") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ADDRESSLENGTH() (uint32, error) { + return _NativeTokenStakingManager.Contract.ADDRESSLENGTH(&_NativeTokenStakingManager.CallOpts) +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) ADDRESSLENGTH() (uint32, error) { + return _NativeTokenStakingManager.Contract.ADDRESSLENGTH(&_NativeTokenStakingManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) BLSPUBLICKEYLENGTH(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "BLS_PUBLIC_KEY_LENGTH") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _NativeTokenStakingManager.Contract.BLSPUBLICKEYLENGTH(&_NativeTokenStakingManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _NativeTokenStakingManager.Contract.BLSPUBLICKEYLENGTH(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMCHURNPERCENTAGELIMIT(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_CHURN_PERCENTAGE_LIMIT") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMDELEGATIONFEEBIPS(opts *bind.CallOpts) (uint16, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_DELEGATION_FEE_BIPS") + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMDELEGATIONFEEBIPS() (uint16, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. +// +// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMDELEGATIONFEEBIPS() (uint16, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMREGISTRATIONEXPIRYLENGTH(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_REGISTRATION_EXPIRY_LENGTH") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. +// +// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMSTAKEMULTIPLIERLIMIT(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_STAKE_MULTIPLIER_LIMIT") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. +// +// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMSTAKEMULTIPLIERLIMIT() (uint8, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) +} + +// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. +// +// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMSTAKEMULTIPLIERLIMIT() (uint8, error) { + return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) +} + +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) NATIVEMINTER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "NATIVE_MINTER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) NATIVEMINTER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) +} + +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) NATIVEMINTER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) WARPMESSENGER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "WARP_MESSENGER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) WARPMESSENGER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.WARPMESSENGER(&_NativeTokenStakingManager.CallOpts) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) WARPMESSENGER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.WARPMESSENGER(&_NativeTokenStakingManager.CallOpts) +} + +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. +// +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) ActiveValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "activeValidators", nodeID) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. +// +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { + return _NativeTokenStakingManager.Contract.ActiveValidators(&_NativeTokenStakingManager.CallOpts, nodeID) +} + +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. +// +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { + return _NativeTokenStakingManager.Contract.ActiveValidators(&_NativeTokenStakingManager.CallOpts, nodeID) +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "getValidator", validationID) + + if err != nil { + return *new(Validator), err + } + + out0 := *abi.ConvertType(out[0], new(Validator)).(*Validator) + + return out0, err + +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _NativeTokenStakingManager.Contract.GetValidator(&_NativeTokenStakingManager.CallOpts, validationID) +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _NativeTokenStakingManager.Contract.GetValidator(&_NativeTokenStakingManager.CallOpts, validationID) +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetWeight(opts *bind.CallOpts, validationID [32]byte) (uint64, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "getWeight", validationID) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) GetWeight(validationID [32]byte) (uint64, error) { + return _NativeTokenStakingManager.Contract.GetWeight(&_NativeTokenStakingManager.CallOpts, validationID) +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) GetWeight(validationID [32]byte) (uint64, error) { + return _NativeTokenStakingManager.Contract.GetWeight(&_NativeTokenStakingManager.CallOpts, validationID) +} + +// ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. +// +// Solidity: function valueToWeight(uint256 value) pure 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) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. +// +// Solidity: function valueToWeight(uint256 value) pure 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) +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) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) WeightToValue(opts *bind.CallOpts, weight uint64) (*big.Int, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "weightToValue", weight) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// WeightToValue is a free data retrieval call binding the contract method 0x62065856. +// +// Solidity: function weightToValue(uint64 weight) pure 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) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) WeightToValue(weight uint64) (*big.Int, error) { + return _NativeTokenStakingManager.Contract.WeightToValue(&_NativeTokenStakingManager.CallOpts, weight) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. +// +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegationID) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. +// +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) +} + +// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. +// +// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. +// +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegationID) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. +// +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) +} + +// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. +// +// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeEndValidation", messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndValidation(&_NativeTokenStakingManager.TransactOpts, messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteEndValidation(&_NativeTokenStakingManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteValidatorRegistration(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "completeValidatorRegistration", messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) +} + +// Initialize is a paid mutator transaction binding the contract method 0x1f7a9d8f. +// +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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 0x1f7a9d8f. +// +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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 0x1f7a9d8f. +// +// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) +} + +// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. +// +// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeDelegatorRegistration", validationID) +} + +// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. +// +// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeDelegatorRegistration(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. +// +// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeDelegatorRegistration(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. +// +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeEndDelegation", delegationID, includeUptimeProof, messageIndex) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. +// +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) +} + +// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. +// +// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeEndValidation", validationID, includeUptimeProof, messageIndex) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. +// +// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, delegationFeeBips, minStakeDuration) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorSet(&_NativeTokenStakingManager.TransactOpts, subnetConversionData, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.InitializeValidatorSet(&_NativeTokenStakingManager.TransactOpts, subnetConversionData, messageIndex) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendEndValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "resendEndValidatorMessage", validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendEndValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendEndValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendRegisterValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "resendRegisterValidatorMessage", validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendRegisterValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendRegisterValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendUpdateDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "resendUpdateDelegation", delegationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendUpdateDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) +} + +// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. +// +// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ResendUpdateDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) +} + +// NativeTokenStakingManagerDelegationEndedIterator is returned from FilterDelegationEnded and is used to iterate over the raw logs and unpacked data for DelegationEnded events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegationEndedIterator struct { + Event *NativeTokenStakingManagerDelegationEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerDelegationEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegationEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegationEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerDelegationEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerDelegationEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegationEnded struct { + DelegationID [32]byte + ValidationID [32]byte + Nonce uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerDelegationEndedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil +} + +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerDelegationEnded) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { + event := new(NativeTokenStakingManagerDelegationEnded) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerDelegatorAddedIterator is returned from FilterDelegatorAdded and is used to iterate over the raw logs and unpacked data for DelegatorAdded events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegatorAddedIterator struct { + Event *NativeTokenStakingManagerDelegatorAdded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerDelegatorAddedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegatorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegatorAdded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerDelegatorAddedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerDelegatorAddedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerDelegatorAdded represents a DelegatorAdded event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegatorAdded struct { + DelegationID [32]byte + ValidationID [32]byte + DelegatorAddress common.Address + Nonce uint64 + ValidatorWeight uint64 + DelegatorWeight uint64 + SetWeightMessageID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. +// +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (*NativeTokenStakingManagerDelegatorAddedIterator, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerDelegatorAddedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil +} + +// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. +// +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorAdded, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (event.Subscription, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var delegatorAddressRule []interface{} + for _, delegatorAddressItem := range delegatorAddress { + delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerDelegatorAdded) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegatorAdded is a log parse operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. +// +// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*NativeTokenStakingManagerDelegatorAdded, error) { + event := new(NativeTokenStakingManagerDelegatorAdded) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerDelegatorRegisteredIterator is returned from FilterDelegatorRegistered and is used to iterate over the raw logs and unpacked data for DelegatorRegistered events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegatorRegisteredIterator struct { + Event *NativeTokenStakingManagerDelegatorRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegatorRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegatorRegistered struct { + DelegationID [32]byte + ValidationID [32]byte + Nonce uint64 + StartTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. +// +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerDelegatorRegisteredIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil +} + +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. +// +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerDelegatorRegistered) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. +// +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*NativeTokenStakingManagerDelegatorRegistered, error) { + event := new(NativeTokenStakingManagerDelegatorRegistered) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerDelegatorRemovalInitializedIterator is returned from FilterDelegatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for DelegatorRemovalInitialized events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegatorRemovalInitializedIterator struct { + Event *NativeTokenStakingManagerDelegatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerDelegatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerDelegatorRemovalInitialized struct { + DelegationID [32]byte + ValidationID [32]byte + EndTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerDelegatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { + + var delegationIDRule []interface{} + for _, delegationIDItem := range delegationID { + delegationIDRule = append(delegationIDRule, delegationIDItem) + } + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. +// +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerDelegatorRemovalInitialized, error) { + event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerInitialValidatorCreatedIterator struct { + Event *NativeTokenStakingManagerInitialValidatorCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerInitialValidatorCreated struct { + ValidationID [32]byte + NodeID [32]byte + Weight *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*NativeTokenStakingManagerInitialValidatorCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerInitialValidatorCreatedIterator{contract: _NativeTokenStakingManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil +} + +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerInitialValidatorCreated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*NativeTokenStakingManagerInitialValidatorCreated, error) { + event := new(NativeTokenStakingManagerInitialValidatorCreated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerInitializedIterator struct { + Event *NativeTokenStakingManagerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerInitialized represents a Initialized event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*NativeTokenStakingManagerInitializedIterator, error) { + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerInitialized) (event.Subscription, error) { + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerInitialized) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseInitialized(log types.Log) (*NativeTokenStakingManagerInitialized, error) { + event := new(NativeTokenStakingManagerInitialized) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationPeriodCreatedIterator struct { + Event *NativeTokenStakingManagerValidationPeriodCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerValidationPeriodCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerValidationPeriodCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerValidationPeriodCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationPeriodCreated struct { + ValidationID [32]byte + NodeID [32]byte + RegisterValidationMessageID [32]byte + Weight *big.Int + RegistrationExpiry uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (*NativeTokenStakingManagerValidationPeriodCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerValidationPeriodCreatedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerValidationPeriodCreated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*NativeTokenStakingManagerValidationPeriodCreated, error) { + event := new(NativeTokenStakingManagerValidationPeriodCreated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerValidationPeriodEndedIterator is returned from FilterValidationPeriodEnded and is used to iterate over the raw logs and unpacked data for ValidationPeriodEnded events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationPeriodEndedIterator struct { + Event *NativeTokenStakingManagerValidationPeriodEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerValidationPeriodEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerValidationPeriodEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerValidationPeriodEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationPeriodEnded struct { + ValidationID [32]byte + Status uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte, status []uint8) (*NativeTokenStakingManagerValidationPeriodEndedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerValidationPeriodEndedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodEnded, validationID [][32]byte, status []uint8) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerValidationPeriodEnded) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*NativeTokenStakingManagerValidationPeriodEnded, error) { + event := new(NativeTokenStakingManagerValidationPeriodEnded) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerValidationPeriodRegisteredIterator is returned from FilterValidationPeriodRegistered and is used to iterate over the raw logs and unpacked data for ValidationPeriodRegistered events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationPeriodRegisteredIterator struct { + Event *NativeTokenStakingManagerValidationPeriodRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerValidationPeriodRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerValidationPeriodRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerValidationPeriodRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidationPeriodRegistered struct { + ValidationID [32]byte + Weight *big.Int + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*NativeTokenStakingManagerValidationPeriodRegisteredIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerValidationPeriodRegisteredIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerValidationPeriodRegistered) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*NativeTokenStakingManagerValidationPeriodRegistered, error) { + event := new(NativeTokenStakingManagerValidationPeriodRegistered) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidatorRemovalInitializedIterator struct { + Event *NativeTokenStakingManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerValidatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerValidatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerValidatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerValidatorRemovalInitialized represents a ValidatorRemovalInitialized event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidatorRemovalInitialized struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + Weight *big.Int + EndTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*NativeTokenStakingManagerValidatorRemovalInitializedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerValidatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerValidatorRemovalInitialized) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerValidatorRemovalInitialized, error) { + event := new(NativeTokenStakingManagerValidatorRemovalInitialized) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// NativeTokenStakingManagerValidatorWeightUpdateIterator is returned from FilterValidatorWeightUpdate and is used to iterate over the raw logs and unpacked data for ValidatorWeightUpdate events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidatorWeightUpdateIterator struct { + Event *NativeTokenStakingManagerValidatorWeightUpdate // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerValidatorWeightUpdateIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerValidatorWeightUpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerValidatorWeightUpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerValidatorWeightUpdate represents a ValidatorWeightUpdate event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerValidatorWeightUpdate struct { + ValidationID [32]byte + Nonce uint64 + ValidatorWeight uint64 + SetWeightMessageID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerValidatorWeightUpdateIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerValidatorWeightUpdateIterator{contract: _NativeTokenStakingManager.contract, event: "ValidatorWeightUpdate", logs: logs, sub: sub}, nil +} + +// WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerValidatorWeightUpdate) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*NativeTokenStakingManagerValidatorWeightUpdate, error) { + event := new(NativeTokenStakingManagerValidatorWeightUpdate) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/abi-bindings/go/validatorManager/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/validatorManager/PoAValidatorManager/PoAValidatorManager.go new file mode 100644 index 000000000..2dbe9c8fa --- /dev/null +++ b/abi-bindings/go/validatorManager/PoAValidatorManager/PoAValidatorManager.go @@ -0,0 +1,1947 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package poavalidatormanager + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// InitialValidator is an auto generated low-level Go binding around an user-defined struct. +type InitialValidator struct { + NodeID [32]byte + Weight uint64 + BlsPublicKey []byte +} + +// SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. +type SubnetConversionData struct { + ConvertSubnetTxID [32]byte + ValidatorManagerBlockchainID [32]byte + ValidatorManagerAddress common.Address + InitialValidators []InitialValidator +} + +// Validator is an auto generated low-level Go binding around an user-defined struct. +type Validator struct { + Status uint8 + NodeID [32]byte + StartingWeight uint64 + MessageNonce uint64 + Weight uint64 + StartedAt uint64 + EndedAt uint64 +} + +// ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. +type ValidatorManagerSettings struct { + PChainBlockchainID [32]byte + SubnetID [32]byte + ChurnPeriodSeconds uint64 + MaximumChurnPercentage uint8 +} + +// ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. +type ValidatorRegistrationInput struct { + NodeID [32]byte + RegistrationExpiry uint64 + BlsPublicKey []byte +} + +// 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161396538038061396583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138188061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e366004612daa565b61030c565b005b610173610143366004612daa565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610133610194366004612dd9565b6104ca565b6101336101a7366004612e1c565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004612e52565b6105e6565b6101ef6101ea366004612daa565b610c1a565b6040516001600160401b03909116815260200161017d565b610133610c2e565b610217603081565b60405160ff909116815260200161017d565b610173610237366004612eb2565b610c41565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e366004612daa565b610c5d565b6101336102a1366004612dd9565b610c72565b6102686005600160991b0181565b6101336102c2366004612daa565b610e2a565b610217601481565b6102e26102dd366004612daa565b610f39565b60405161017d9190612f0b565b6101ef6202a30081565b610133610307366004612fc1565b611001565b5f8181525f805160206137ec8339815191526020526040808220815160e0810190925280545f805160206137cc83398151915293929190829060ff16600581111561035957610359612ef7565b600581111561036a5761036a612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d9612ef7565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f61103e565b6040518263ffffffff1660e01b81526004016104849190613005565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c49190613037565b50505050565b6104d381611263565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b61059787876115ad565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206137cc8339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea9190613037565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d6060850160408601612fc1565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd606085018561304e565b91505f90508435602086013560146107fb6060890160408a01612fc1565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610b2a575f61087b606089018961304e565b8363ffffffff1681811061089157610891613093565b90506020028101906108a391906130a7565b6108ac90613157565b80515f81815260098901602052604090205491925090156108df5760405162461bcd60e51b815260040161043a906131ee565b84825f0151836020015184604001516040516020016109019493929190613236565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161094f9190613285565b602060405180830381855afa15801561096a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061098d9190613037565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610a1957610a19612ef7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610acc9116866132aa565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610b23906132bd565b905061085f565b50600584018190555f610b3c866115c7565b90505f610b4c82604001516117a1565b905080600285604051610b5f9190613285565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190613037565b14610c015760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610c2482610f39565b6080015192915050565b610c3661190a565b610c3f5f611965565b565b5f610c4a61190a565b610c5483836119d5565b90505b92915050565b610c6561190a565b610c6e81611f3a565b5050565b5f805160206137cc8339815191525f610c8a836115c7565b90505f80610c9b83604001516121b5565b9150915080610cfd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610d17906132df565b9050118015610d49575060015f83815260088601602052604090205460ff166005811115610d4757610d47612ef7565b145b610d655760405162461bcd60e51b815260040161043a90613311565b5f8281526007850160205260408120610d7d91612d1f565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206137cc833981519152929190610e72906132df565b9050118015610ea4575060015f83815260088301602052604090205460ff166005811115610ea257610ea2612ef7565b145b610ec05760405162461bcd60e51b815260040161043a90613311565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610ef99190600401613358565b6020604051808303815f875af1158015610f15573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d39190613037565b610f41612d56565b5f8281525f805160206137ec833981519152602052604090819020815160e0810190925280545f805160206137cc833981519152929190829060ff166005811115610f8e57610f8e612ef7565b6005811115610f9f57610f9f612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b61100961190a565b6001600160a01b03811661103257604051631e4fbdf760e01b81525f600482015260240161043a565b61103b81611965565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110b7576110778160016133e2565b6110829060086133f5565b5081515f9083908390811061109957611099613093565b60200101906001600160f81b03191690815f1a905350600101611063565b505f5b6004811015611122576110ce8160036133e2565b6110d99060086133f5565b600263ffffffff16901c60f81b828260026110f491906132aa565b8151811061110457611104613093565b60200101906001600160f81b03191690815f1a9053506001016110ba565b505f5b60208110156111845761113981601f6133e2565b6111449060086133f5565b86901c60f81b826111568360066132aa565b8151811061116657611166613093565b60200101906001600160f81b03191690815f1a905350600101611125565b505f5b60088110156111ef5761119b8160076133e2565b6111a69060086133f5565b6001600160401b038616901c60f81b826111c18360266132aa565b815181106111d1576111d1613093565b60200101906001600160f81b03191690815f1a905350600101611187565b505f5b600881101561125a576112068160076133e2565b6112119060086133f5565b6001600160401b038516901c60f81b8261122c83602e6132aa565b8151811061123c5761123c613093565b60200101906001600160f81b03191690815f1a9053506001016111f2565b50949350505050565b5f61126c612d56565b5f805160206137cc8339815191525f611284856115c7565b90505f8061129583604001516121b5565b9150915080156112fa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561132b5761132b612ef7565b600581111561133c5761133c612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156113ad576113ad612ef7565b14806113cb57506001825160058111156113c9576113c9612ef7565b145b61142a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b60038251600581111561143f5761143f612ef7565b0361144c57506004611450565b5060055b6020808301515f9081526009880190915260408120558181600581111561147957611479612ef7565b9081600581111561148c5761148c612ef7565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156114c0576114c0612ef7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561157457611574612ef7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6115b5612356565b6115be8261239f565b610c6e816123b8565b60408051606080820183525f8083526020830181905292820152905f805160206137cc8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561163c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611663919081019061341b565b91509150806116c35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b82548251146117265760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b0316156117995760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f81516026146117c35760405162461bcd60e51b815260040161043a906134ed565b5f805b6002811015611812576117da8160016133e2565b6117e59060086133f5565b61ffff168482815181106117fb576117fb613093565b016020015160f81c901b91909117906001016117c6565b5061ffff8116156118355760405162461bcd60e51b815260040161043a90613536565b5f805b60048110156118905761184c8160036133e2565b6118579060086133f5565b63ffffffff16856118698360026132aa565b8151811061187957611879613093565b016020015160f81c901b9190911790600101611838565b5063ffffffff8116156118b55760405162461bcd60e51b815260040161043a90613579565b5f805b602081101561125a576118cc81601f6133e2565b6118d79060086133f5565b866118e38360066132aa565b815181106118f3576118f3613093565b016020015160f81c901b91909117906001016118b8565b3361193c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c3f5760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611a605760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f805160206137cc83398151915242611a7f60408601602087016135c0565b6001600160401b031611611af15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611b0160408501602086016135c0565b6001600160401b0316611b176202a300426132aa565b11611b8a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611be25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043a565b83355f90815260098201602052604090205415611c115760405162461bcd60e51b815260040161043a906131ee565b6030611c2060408601866135d9565b905014611c855760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043a565b611c8f835f6123c9565b5f80611d296040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611cd491906135c0565b6001600160401b03168152602001611cef60408a018a6135d9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506125d7565b5f82815260078601602052604090209193509150611d478282613666565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d74908590600401613005565b6020604051808303815f875af1158015611d90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db49190613037565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611e2c57611e2c612ef7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f0c918e01908e016135c0565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611f42612d56565b5f8281525f805160206137ec8339815191526020526040808220815160e0810190925280545f805160206137cc83398151915293929190829060ff166005811115611f8f57611f8f612ef7565b6005811115611fa057611fa0612ef7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561201257612012612ef7565b1461206e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156120b2576120b2612ef7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61215e8582612986565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146121d85760405162461bcd60e51b815260040161043a906134ed565b5f805b6002811015612227576121ef8160016133e2565b6121fa9060086133f5565b61ffff1685828151811061221057612210613093565b016020015160f81c901b91909117906001016121db565b5061ffff81161561224a5760405162461bcd60e51b815260040161043a90613536565b5f805b60048110156122a5576122618160036133e2565b61226c9060086133f5565b63ffffffff168661227e8360026132aa565b8151811061228e5761228e613093565b016020015160f81c901b919091179060010161224d565b5063ffffffff81166003146122cc5760405162461bcd60e51b815260040161043a90613579565b5f805b6020811015612321576122e381601f6133e2565b6122ee9060086133f5565b876122fa8360066132aa565b8151811061230a5761230a613093565b016020015160f81c901b91909117906001016122cf565b505f8660268151811061233657612336613093565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c3f57604051631afcd79f60e31b815260040160405180910390fd5b6123a7612356565b6123af612add565b61103b81612ae5565b6123c0612356565b61103b81612c87565b5f805160206137cc8339815191525f6001600160401b0380841690851611156123fd576123f68385613725565b905061240a565b6124078484613725565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b031660608201524291158061246c575060028401548151612468916001600160401b0316906132aa565b8210155b15612492576001600160401b0383166060820152818152604081015160208201526124b1565b82816060018181516124a49190613745565b6001600160401b03169052505b60608101516124c1906064613765565b602082015160028601546001600160401b0392909216916124ec9190600160401b900460ff166133f5565b10156125505760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b856001600160401b03168160400181815161256b91906132aa565b9052506040810180516001600160401b038716919061258b9083906133e2565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146126415760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156126b8576126788160016133e2565b6126839060086133f5565b5081515f9083908390811061269a5761269a613093565b60200101906001600160f81b03191690815f1a905350600101612664565b505f5b6004811015612720576126cf8160036133e2565b6126da9060086133f5565b600160ff919091161c60f81b826126f28360026132aa565b8151811061270257612702613093565b60200101906001600160f81b03191690815f1a9053506001016126bb565b505f5b602081101561277d578451816020811061273f5761273f613093565b1a60f81b8261274f8360066132aa565b8151811061275f5761275f613093565b60200101906001600160f81b03191690815f1a905350600101612723565b505f5b60208110156127dd578460200151816020811061279f5761279f613093565b1a60f81b826127af8360266132aa565b815181106127bf576127bf613093565b60200101906001600160f81b03191690815f1a905350600101612780565b505f5b6008811015612851576127f48160076133e2565b6127ff9060086133f5565b60ff1685604001516001600160401b0316901c60f81b8282604661282391906132aa565b8151811061283357612833613093565b60200101906001600160f81b03191690815f1a9053506001016127e0565b505f5b60308110156128bc578460800151818151811061287357612873613093565b01602001516001600160f81b0319168261288e83604e6132aa565b8151811061289e5761289e613093565b60200101906001600160f81b03191690815f1a905350600101612854565b505f5b600881101561292e576128d38160076133e2565b6128de9060086133f5565b60608601516001600160401b0390811691161c60f81b8261290083607e6132aa565b8151811061291057612910613093565b60200101906001600160f81b03191690815f1a9053506001016128bf565b5060028160405161293f9190613285565b602060405180830381855afa15801561295a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061297d9190613037565b94909350915050565b5f8281525f805160206137ec833981519152602052604081206002015481905f805160206137cc83398151915290600160801b90046001600160401b03166129ce85826123c9565b5f6129d887612c8f565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb612a288a858b61103e565b6040518263ffffffff1660e01b8152600401612a449190613005565b6020604051808303815f875af1158015612a60573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a849190613037565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b610c3f612356565b612aed612356565b80355f805160206137cc83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014612b396080840160608501613790565b60ff161115612ba65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f612bb76080840160608501613790565b60ff1611612c1f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b612c2f6080830160608401613790565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612c6060608301604084016135c0565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b611009612356565b5f8181525f805160206137ec8339815191526020526040812060020180545f805160206137cc83398151915291600160401b9091046001600160401b0316906008612cd9836137b0565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b508054612d2b906132df565b5f825580601f10612d3a575050565b601f0160209004905f5260205f209081019061103b9190612d92565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612da6575f8155600101612d93565b5090565b5f60208284031215612dba575f80fd5b5035919050565b803563ffffffff81168114612dd4575f80fd5b919050565b5f60208284031215612de9575f80fd5b610c5482612dc1565b5f60808284031215612e02575f80fd5b50919050565b6001600160a01b038116811461103b575f80fd5b5f8060a08385031215612e2d575f80fd5b612e378484612df2565b91506080830135612e4781612e08565b809150509250929050565b5f8060408385031215612e63575f80fd5b82356001600160401b03811115612e78575f80fd5b612e8485828601612df2565b925050612e9360208401612dc1565b90509250929050565b80356001600160401b0381168114612dd4575f80fd5b5f8060408385031215612ec3575f80fd5b82356001600160401b03811115612ed8575f80fd5b830160608186031215612ee9575f80fd5b9150612e9360208401612e9c565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f2e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f6960608401826001600160401b03169052565b506080830151612f8460808401826001600160401b03169052565b5060a0830151612f9f60a08401826001600160401b03169052565b5060c0830151612fba60c08401826001600160401b03169052565b5092915050565b5f60208284031215612fd1575f80fd5b8135612fdc81612e08565b9392505050565b5f5b83811015612ffd578181015183820152602001612fe5565b50505f910152565b602081525f8251806020840152613023816040850160208701612fe3565b601f01601f19169190910160400192915050565b5f60208284031215613047575f80fd5b5051919050565b5f808335601e19843603018112613063575f80fd5b8301803591506001600160401b0382111561307c575f80fd5b6020019150600581901b3603821315612ad6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130bb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130fb576130fb6130c5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613129576131296130c5565b604052919050565b5f6001600160401b03821115613149576131496130c5565b50601f01601f191660200190565b5f60608236031215613167575f80fd5b61316f6130d9565b823581526020613180818501612e9c565b8183015260408401356001600160401b0381111561319c575f80fd5b840136601f8201126131ac575f80fd5b80356131bf6131ba82613131565b613101565b81815236848385010111156131d2575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551613247818460208a01612fe3565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613277816028840160208801612fe3565b016028019695505050505050565b5f82516130bb818460208701612fe3565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c5757610c57613296565b5f63ffffffff8083168181036132d5576132d5613296565b6001019392505050565b600181811c908216806132f357607f821691505b602082108103612e0257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461336a816132df565b806020870152604060018084165f811461338b57600181146133a7576133d4565b60ff19851660408a0152604084151560051b8a010195506133d4565b895f5260205f205f5b858110156133cb5781548b82018601529083019088016133b0565b8a016040019650505b509398975050505050505050565b81810381811115610c5757610c57613296565b8082028115828204841417610c5757610c57613296565b80518015158114612dd4575f80fd5b5f806040838503121561342c575f80fd5b82516001600160401b0380821115613442575f80fd5b9084019060608287031215613455575f80fd5b61345d6130d9565b8251815260208084015161347081612e08565b82820152604084015183811115613485575f80fd5b80850194505087601f850112613499575f80fd5b835192506134a96131ba84613131565b83815288828587010111156134bc575f80fd5b6134cb84838301848801612fe3565b806040840152508195506134e081880161340c565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156135d0575f80fd5b610c5482612e9c565b5f808335601e198436030181126135ee575f80fd5b8301803591506001600160401b03821115613607575f80fd5b602001915036819003821315612ad6575f80fd5b601f8211156104d357805f5260205f20601f840160051c810160208510156136405750805b601f840160051c820191505b8181101561365f575f815560010161364c565b5050505050565b81516001600160401b0381111561367f5761367f6130c5565b6136938161368d84546132df565b8461361b565b602080601f8311600181146136c6575f84156136af5750858301515b5f19600386901b1c1916600185901b17855561371d565b5f85815260208120601f198616915b828110156136f4578886015182559484019460019091019084016136d5565b508582101561371157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03828116828216039080821115612fba57612fba613296565b6001600160401b03818116838216019080821115612fba57612fba613296565b6001600160401b0381811683821602808216919082811461378857613788613296565b505092915050565b5f602082840312156137a0575f80fd5b813560ff81168114612fdc575f80fd5b5f6001600160401b038083168181036132d5576132d561329656fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", +} + +// PoAValidatorManagerABI is the input ABI used to generate the binding from. +// Deprecated: Use PoAValidatorManagerMetaData.ABI instead. +var PoAValidatorManagerABI = PoAValidatorManagerMetaData.ABI + +// PoAValidatorManagerBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use PoAValidatorManagerMetaData.Bin instead. +var PoAValidatorManagerBin = PoAValidatorManagerMetaData.Bin + +// DeployPoAValidatorManager deploys a new Ethereum contract, binding an instance of PoAValidatorManager to it. +func DeployPoAValidatorManager(auth *bind.TransactOpts, backend bind.ContractBackend, init uint8) (common.Address, *types.Transaction, *PoAValidatorManager, error) { + parsed, err := PoAValidatorManagerMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PoAValidatorManagerBin), backend, init) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &PoAValidatorManager{PoAValidatorManagerCaller: PoAValidatorManagerCaller{contract: contract}, PoAValidatorManagerTransactor: PoAValidatorManagerTransactor{contract: contract}, PoAValidatorManagerFilterer: PoAValidatorManagerFilterer{contract: contract}}, nil +} + +// PoAValidatorManager is an auto generated Go binding around an Ethereum contract. +type PoAValidatorManager struct { + PoAValidatorManagerCaller // Read-only binding to the contract + PoAValidatorManagerTransactor // Write-only binding to the contract + PoAValidatorManagerFilterer // Log filterer for contract events +} + +// PoAValidatorManagerCaller is an auto generated read-only Go binding around an Ethereum contract. +type PoAValidatorManagerCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PoAValidatorManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. +type PoAValidatorManagerTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PoAValidatorManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type PoAValidatorManagerFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// PoAValidatorManagerSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type PoAValidatorManagerSession struct { + Contract *PoAValidatorManager // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// PoAValidatorManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type PoAValidatorManagerCallerSession struct { + Contract *PoAValidatorManagerCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// PoAValidatorManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type PoAValidatorManagerTransactorSession struct { + Contract *PoAValidatorManagerTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// PoAValidatorManagerRaw is an auto generated low-level Go binding around an Ethereum contract. +type PoAValidatorManagerRaw struct { + Contract *PoAValidatorManager // Generic contract binding to access the raw methods on +} + +// PoAValidatorManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type PoAValidatorManagerCallerRaw struct { + Contract *PoAValidatorManagerCaller // Generic read-only contract binding to access the raw methods on +} + +// PoAValidatorManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type PoAValidatorManagerTransactorRaw struct { + Contract *PoAValidatorManagerTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewPoAValidatorManager creates a new instance of PoAValidatorManager, bound to a specific deployed contract. +func NewPoAValidatorManager(address common.Address, backend bind.ContractBackend) (*PoAValidatorManager, error) { + contract, err := bindPoAValidatorManager(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &PoAValidatorManager{PoAValidatorManagerCaller: PoAValidatorManagerCaller{contract: contract}, PoAValidatorManagerTransactor: PoAValidatorManagerTransactor{contract: contract}, PoAValidatorManagerFilterer: PoAValidatorManagerFilterer{contract: contract}}, nil +} + +// NewPoAValidatorManagerCaller creates a new read-only instance of PoAValidatorManager, bound to a specific deployed contract. +func NewPoAValidatorManagerCaller(address common.Address, caller bind.ContractCaller) (*PoAValidatorManagerCaller, error) { + contract, err := bindPoAValidatorManager(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &PoAValidatorManagerCaller{contract: contract}, nil +} + +// NewPoAValidatorManagerTransactor creates a new write-only instance of PoAValidatorManager, bound to a specific deployed contract. +func NewPoAValidatorManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*PoAValidatorManagerTransactor, error) { + contract, err := bindPoAValidatorManager(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &PoAValidatorManagerTransactor{contract: contract}, nil +} + +// NewPoAValidatorManagerFilterer creates a new log filterer instance of PoAValidatorManager, bound to a specific deployed contract. +func NewPoAValidatorManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*PoAValidatorManagerFilterer, error) { + contract, err := bindPoAValidatorManager(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &PoAValidatorManagerFilterer{contract: contract}, nil +} + +// bindPoAValidatorManager binds a generic wrapper to an already deployed contract. +func bindPoAValidatorManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := PoAValidatorManagerMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_PoAValidatorManager *PoAValidatorManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _PoAValidatorManager.Contract.PoAValidatorManagerCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_PoAValidatorManager *PoAValidatorManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.PoAValidatorManagerTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_PoAValidatorManager *PoAValidatorManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.PoAValidatorManagerTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_PoAValidatorManager *PoAValidatorManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _PoAValidatorManager.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_PoAValidatorManager *PoAValidatorManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_PoAValidatorManager *PoAValidatorManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.contract.Transact(opts, method, params...) +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_PoAValidatorManager *PoAValidatorManagerCaller) ADDRESSLENGTH(opts *bind.CallOpts) (uint32, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "ADDRESS_LENGTH") + + if err != nil { + return *new(uint32), err + } + + out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) + + return out0, err + +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_PoAValidatorManager *PoAValidatorManagerSession) ADDRESSLENGTH() (uint32, error) { + return _PoAValidatorManager.Contract.ADDRESSLENGTH(&_PoAValidatorManager.CallOpts) +} + +// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. +// +// Solidity: function ADDRESS_LENGTH() view returns(uint32) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) ADDRESSLENGTH() (uint32, error) { + return _PoAValidatorManager.Contract.ADDRESSLENGTH(&_PoAValidatorManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerCaller) BLSPUBLICKEYLENGTH(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "BLS_PUBLIC_KEY_LENGTH") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _PoAValidatorManager.Contract.BLSPUBLICKEYLENGTH(&_PoAValidatorManager.CallOpts) +} + +// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. +// +// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) BLSPUBLICKEYLENGTH() (uint8, error) { + return _PoAValidatorManager.Contract.BLSPUBLICKEYLENGTH(&_PoAValidatorManager.CallOpts) +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerCaller) MAXIMUMCHURNPERCENTAGELIMIT(opts *bind.CallOpts) (uint8, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "MAXIMUM_CHURN_PERCENTAGE_LIMIT") + + if err != nil { + return *new(uint8), err + } + + out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) + + return out0, err + +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _PoAValidatorManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_PoAValidatorManager.CallOpts) +} + +// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. +// +// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { + return _PoAValidatorManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_PoAValidatorManager.CallOpts) +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerCaller) MAXIMUMREGISTRATIONEXPIRYLENGTH(opts *bind.CallOpts) (uint64, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "MAXIMUM_REGISTRATION_EXPIRY_LENGTH") + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _PoAValidatorManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_PoAValidatorManager.CallOpts) +} + +// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. +// +// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { + return _PoAValidatorManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_PoAValidatorManager.CallOpts) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerCaller) WARPMESSENGER(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "WARP_MESSENGER") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerSession) WARPMESSENGER() (common.Address, error) { + return _PoAValidatorManager.Contract.WARPMESSENGER(&_PoAValidatorManager.CallOpts) +} + +// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. +// +// Solidity: function WARP_MESSENGER() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) WARPMESSENGER() (common.Address, error) { + return _PoAValidatorManager.Contract.WARPMESSENGER(&_PoAValidatorManager.CallOpts) +} + +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. +// +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCaller) ActiveValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "activeValidators", nodeID) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. +// +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { + return _PoAValidatorManager.Contract.ActiveValidators(&_PoAValidatorManager.CallOpts, nodeID) +} + +// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. +// +// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { + return _PoAValidatorManager.Contract.ActiveValidators(&_PoAValidatorManager.CallOpts, nodeID) +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +func (_PoAValidatorManager *PoAValidatorManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "getValidator", validationID) + + if err != nil { + return *new(Validator), err + } + + out0 := *abi.ConvertType(out[0], new(Validator)).(*Validator) + + return out0, err + +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +func (_PoAValidatorManager *PoAValidatorManagerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _PoAValidatorManager.Contract.GetValidator(&_PoAValidatorManager.CallOpts, validationID) +} + +// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. +// +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { + return _PoAValidatorManager.Contract.GetValidator(&_PoAValidatorManager.CallOpts, validationID) +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerCaller) GetWeight(opts *bind.CallOpts, validationID [32]byte) (uint64, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "getWeight", validationID) + + if err != nil { + return *new(uint64), err + } + + out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) + + return out0, err + +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerSession) GetWeight(validationID [32]byte) (uint64, error) { + return _PoAValidatorManager.Contract.GetWeight(&_PoAValidatorManager.CallOpts, validationID) +} + +// GetWeight is a free data retrieval call binding the contract method 0x66435abf. +// +// Solidity: function getWeight(bytes32 validationID) view returns(uint64) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) GetWeight(validationID [32]byte) (uint64, error) { + return _PoAValidatorManager.Contract.GetWeight(&_PoAValidatorManager.CallOpts, validationID) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerSession) Owner() (common.Address, error) { + return _PoAValidatorManager.Contract.Owner(&_PoAValidatorManager.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) Owner() (common.Address, error) { + return _PoAValidatorManager.Contract.Owner(&_PoAValidatorManager.CallOpts) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "completeEndValidation", messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteEndValidation(&_PoAValidatorManager.TransactOpts, messageIndex) +} + +// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. +// +// Solidity: function completeEndValidation(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteEndValidation(&_PoAValidatorManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) CompleteValidatorRegistration(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "completeValidatorRegistration", messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteValidatorRegistration(&_PoAValidatorManager.TransactOpts, messageIndex) +} + +// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. +// +// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.CompleteValidatorRegistration(&_PoAValidatorManager.TransactOpts, messageIndex) +} + +// Initialize is a paid mutator transaction binding the contract method 0x580a4006. +// +// Solidity: function initialize((bytes32,bytes32,uint64,uint8) settings, address initialOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) Initialize(opts *bind.TransactOpts, settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initialize", settings, initialOwner) +} + +// Initialize is a paid mutator transaction binding the contract method 0x580a4006. +// +// Solidity: function initialize((bytes32,bytes32,uint64,uint8) settings, address initialOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) +} + +// Initialize is a paid mutator transaction binding the contract method 0x580a4006. +// +// Solidity: function initialize((bytes32,bytes32,uint64,uint8) settings, address initialOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x97fb70d4. +// +// Solidity: function initializeEndValidation(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initializeEndValidation", validationID) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x97fb70d4. +// +// Solidity: function initializeEndValidation(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeEndValidation(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeEndValidation(&_PoAValidatorManager.TransactOpts, validationID) +} + +// InitializeEndValidation is a paid mutator transaction binding the contract method 0x97fb70d4. +// +// Solidity: function initializeEndValidation(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeEndValidation(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeEndValidation(&_PoAValidatorManager.TransactOpts, validationID) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8994ab49. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint64 weight) returns(bytes32 validationID) +func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, weight) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8994ab49. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint64 weight) returns(bytes32 validationID) +func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, registrationInput, weight) +} + +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8994ab49. +// +// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint64 weight) returns(bytes32 validationID) +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, registrationInput, weight) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorSet(&_PoAValidatorManager.TransactOpts, subnetConversionData, messageIndex) +} + +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.InitializeValidatorSet(&_PoAValidatorManager.TransactOpts, subnetConversionData, messageIndex) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) RenounceOwnership() (*types.Transaction, error) { + return _PoAValidatorManager.Contract.RenounceOwnership(&_PoAValidatorManager.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _PoAValidatorManager.Contract.RenounceOwnership(&_PoAValidatorManager.TransactOpts) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) ResendEndValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "resendEndValidatorMessage", validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.ResendEndValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) +} + +// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. +// +// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.ResendEndValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) ResendRegisterValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "resendRegisterValidatorMessage", validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.ResendRegisterValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) +} + +// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. +// +// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.ResendRegisterValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.TransferOwnership(&_PoAValidatorManager.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _PoAValidatorManager.Contract.TransferOwnership(&_PoAValidatorManager.TransactOpts, newOwner) +} + +// PoAValidatorManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitialValidatorCreatedIterator struct { + Event *PoAValidatorManagerInitialValidatorCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialValidatorCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitialValidatorCreated struct { + ValidationID [32]byte + NodeID [32]byte + Weight *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*PoAValidatorManagerInitialValidatorCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerInitialValidatorCreatedIterator{contract: _PoAValidatorManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil +} + +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerInitialValidatorCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*PoAValidatorManagerInitialValidatorCreated, error) { + event := new(PoAValidatorManagerInitialValidatorCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitializedIterator struct { + Event *PoAValidatorManagerInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerInitialized represents a Initialized event raised by the PoAValidatorManager contract. +type PoAValidatorManagerInitialized struct { + Version uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*PoAValidatorManagerInitializedIterator, error) { + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &PoAValidatorManagerInitializedIterator{contract: _PoAValidatorManager.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerInitialized) (event.Subscription, error) { + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerInitialized) + if err := _PoAValidatorManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. +// +// Solidity: event Initialized(uint64 version) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseInitialized(log types.Log) (*PoAValidatorManagerInitialized, error) { + event := new(PoAValidatorManagerInitialized) + if err := _PoAValidatorManager.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the PoAValidatorManager contract. +type PoAValidatorManagerOwnershipTransferredIterator struct { + Event *PoAValidatorManagerOwnershipTransferred // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerOwnershipTransferredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerOwnershipTransferred represents a OwnershipTransferred event raised by the PoAValidatorManager contract. +type PoAValidatorManagerOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*PoAValidatorManagerOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerOwnershipTransferredIterator{contract: _PoAValidatorManager.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerOwnershipTransferred) + if err := _PoAValidatorManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseOwnershipTransferred(log types.Log) (*PoAValidatorManagerOwnershipTransferred, error) { + event := new(PoAValidatorManagerOwnershipTransferred) + if err := _PoAValidatorManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodCreatedIterator struct { + Event *PoAValidatorManagerValidationPeriodCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodCreated struct { + ValidationID [32]byte + NodeID [32]byte + RegisterValidationMessageID [32]byte + Weight *big.Int + RegistrationExpiry uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (*PoAValidatorManagerValidationPeriodCreatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidationPeriodCreatedIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nodeIDRule []interface{} + for _, nodeIDItem := range nodeID { + nodeIDRule = append(nodeIDRule, nodeIDItem) + } + var registerValidationMessageIDRule []interface{} + for _, registerValidationMessageIDItem := range registerValidationMessageID { + registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidationPeriodCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*PoAValidatorManagerValidationPeriodCreated, error) { + event := new(PoAValidatorManagerValidationPeriodCreated) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidationPeriodEndedIterator is returned from FilterValidationPeriodEnded and is used to iterate over the raw logs and unpacked data for ValidationPeriodEnded events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodEndedIterator struct { + Event *PoAValidatorManagerValidationPeriodEnded // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidationPeriodEndedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodEnded) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidationPeriodEndedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidationPeriodEndedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodEnded struct { + ValidationID [32]byte + Status uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte, status []uint8) (*PoAValidatorManagerValidationPeriodEndedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidationPeriodEndedIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodEnded, validationID [][32]byte, status []uint8) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var statusRule []interface{} + for _, statusItem := range status { + statusRule = append(statusRule, statusItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidationPeriodEnded) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. +// +// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*PoAValidatorManagerValidationPeriodEnded, error) { + event := new(PoAValidatorManagerValidationPeriodEnded) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidationPeriodRegisteredIterator is returned from FilterValidationPeriodRegistered and is used to iterate over the raw logs and unpacked data for ValidationPeriodRegistered events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodRegisteredIterator struct { + Event *PoAValidatorManagerValidationPeriodRegistered // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidationPeriodRegistered) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidationPeriodRegistered struct { + ValidationID [32]byte + Weight *big.Int + Timestamp *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*PoAValidatorManagerValidationPeriodRegisteredIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidationPeriodRegisteredIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil +} + +// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodRegistered", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidationPeriodRegistered) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. +// +// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*PoAValidatorManagerValidationPeriodRegistered, error) { + event := new(PoAValidatorManagerValidationPeriodRegistered) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidatorRemovalInitializedIterator struct { + Event *PoAValidatorManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidatorRemovalInitialized) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidatorRemovalInitialized represents a ValidatorRemovalInitialized event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidatorRemovalInitialized struct { + ValidationID [32]byte + SetWeightMessageID [32]byte + Weight *big.Int + EndTime *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*PoAValidatorManagerValidatorRemovalInitializedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidatorRemovalInitializedIterator{contract: _PoAValidatorManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil +} + +// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var setWeightMessageIDRule []interface{} + for _, setWeightMessageIDItem := range setWeightMessageID { + setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidatorRemovalInitialized) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. +// +// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*PoAValidatorManagerValidatorRemovalInitialized, error) { + event := new(PoAValidatorManagerValidatorRemovalInitialized) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// PoAValidatorManagerValidatorWeightUpdateIterator is returned from FilterValidatorWeightUpdate and is used to iterate over the raw logs and unpacked data for ValidatorWeightUpdate events raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidatorWeightUpdateIterator struct { + Event *PoAValidatorManagerValidatorWeightUpdate // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(PoAValidatorManagerValidatorWeightUpdate) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// PoAValidatorManagerValidatorWeightUpdate represents a ValidatorWeightUpdate event raised by the PoAValidatorManager contract. +type PoAValidatorManagerValidatorWeightUpdate struct { + ValidationID [32]byte + Nonce uint64 + ValidatorWeight uint64 + SetWeightMessageID [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*PoAValidatorManagerValidatorWeightUpdateIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return &PoAValidatorManagerValidatorWeightUpdateIterator{contract: _PoAValidatorManager.contract, event: "ValidatorWeightUpdate", logs: logs, sub: sub}, nil +} + +// WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + var nonceRule []interface{} + for _, nonceItem := range nonce { + nonceRule = append(nonceRule, nonceItem) + } + + logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(PoAValidatorManagerValidatorWeightUpdate) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. +// +// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*PoAValidatorManagerValidatorWeightUpdate, error) { + event := new(PoAValidatorManagerValidatorWeightUpdate) + if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/contracts/mocks/ExampleERC20.sol b/contracts/mocks/ExampleERC20.sol index 0e5987584..1c318c486 100644 --- a/contracts/mocks/ExampleERC20.sol +++ b/contracts/mocks/ExampleERC20.sol @@ -13,7 +13,7 @@ import { ERC20Burnable, ERC20 } from "@openzeppelin/contracts@5.0.2/token/ERC20/extensions/ERC20Burnable.sol"; -import {IERC20Mintable} from "../staking/interfaces/IERC20Mintable.sol"; +import {IERC20Mintable} from "../validatorManager/interfaces/IERC20Mintable.sol"; contract ExampleERC20 is ERC20Burnable, IERC20Mintable { string private constant _TOKEN_NAME = "Mock Token"; diff --git a/contracts/staking/ERC20TokenStakingManager.sol b/contracts/validatorManager/ERC20TokenStakingManager.sol similarity index 100% rename from contracts/staking/ERC20TokenStakingManager.sol rename to contracts/validatorManager/ERC20TokenStakingManager.sol diff --git a/contracts/staking/ExampleRewardCalculator.sol b/contracts/validatorManager/ExampleRewardCalculator.sol similarity index 100% rename from contracts/staking/ExampleRewardCalculator.sol rename to contracts/validatorManager/ExampleRewardCalculator.sol diff --git a/contracts/staking/NativeTokenStakingManager.sol b/contracts/validatorManager/NativeTokenStakingManager.sol similarity index 100% rename from contracts/staking/NativeTokenStakingManager.sol rename to contracts/validatorManager/NativeTokenStakingManager.sol diff --git a/contracts/staking/PoAValidatorManager.sol b/contracts/validatorManager/PoAValidatorManager.sol similarity index 100% rename from contracts/staking/PoAValidatorManager.sol rename to contracts/validatorManager/PoAValidatorManager.sol diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/validatorManager/PoSValidatorManager.sol similarity index 100% rename from contracts/staking/PoSValidatorManager.sol rename to contracts/validatorManager/PoSValidatorManager.sol diff --git a/contracts/staking/README.md b/contracts/validatorManager/README.md similarity index 100% rename from contracts/staking/README.md rename to contracts/validatorManager/README.md diff --git a/contracts/staking/ValidatorManager.sol b/contracts/validatorManager/ValidatorManager.sol similarity index 100% rename from contracts/staking/ValidatorManager.sol rename to contracts/validatorManager/ValidatorManager.sol diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/validatorManager/ValidatorMessages.sol similarity index 100% rename from contracts/staking/ValidatorMessages.sol rename to contracts/validatorManager/ValidatorMessages.sol diff --git a/contracts/staking/interfaces/IERC20Mintable.sol b/contracts/validatorManager/interfaces/IERC20Mintable.sol similarity index 100% rename from contracts/staking/interfaces/IERC20Mintable.sol rename to contracts/validatorManager/interfaces/IERC20Mintable.sol diff --git a/contracts/staking/interfaces/IERC20TokenStakingManager.sol b/contracts/validatorManager/interfaces/IERC20TokenStakingManager.sol similarity index 100% rename from contracts/staking/interfaces/IERC20TokenStakingManager.sol rename to contracts/validatorManager/interfaces/IERC20TokenStakingManager.sol diff --git a/contracts/staking/interfaces/INativeTokenStakingManager.sol b/contracts/validatorManager/interfaces/INativeTokenStakingManager.sol similarity index 100% rename from contracts/staking/interfaces/INativeTokenStakingManager.sol rename to contracts/validatorManager/interfaces/INativeTokenStakingManager.sol diff --git a/contracts/staking/interfaces/IPoAValidatorManager.sol b/contracts/validatorManager/interfaces/IPoAValidatorManager.sol similarity index 100% rename from contracts/staking/interfaces/IPoAValidatorManager.sol rename to contracts/validatorManager/interfaces/IPoAValidatorManager.sol diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/validatorManager/interfaces/IPoSValidatorManager.sol similarity index 100% rename from contracts/staking/interfaces/IPoSValidatorManager.sol rename to contracts/validatorManager/interfaces/IPoSValidatorManager.sol diff --git a/contracts/staking/interfaces/IRewardCalculator.sol b/contracts/validatorManager/interfaces/IRewardCalculator.sol similarity index 100% rename from contracts/staking/interfaces/IRewardCalculator.sol rename to contracts/validatorManager/interfaces/IRewardCalculator.sol diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/validatorManager/interfaces/IValidatorManager.sol similarity index 100% rename from contracts/staking/interfaces/IValidatorManager.sol rename to contracts/validatorManager/interfaces/IValidatorManager.sol diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validatorManager/tests/ERC20TokenStakingManagerTests.t.sol similarity index 100% rename from contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol rename to contracts/validatorManager/tests/ERC20TokenStakingManagerTests.t.sol diff --git a/contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/validatorManager/tests/ExamplesRewardCalculatorTests.t.sol similarity index 100% rename from contracts/staking/tests/ExamplesRewardCalculatorTests.t.sol rename to contracts/validatorManager/tests/ExamplesRewardCalculatorTests.t.sol diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validatorManager/tests/NativeTokenStakingManagerTests.t.sol similarity index 100% rename from contracts/staking/tests/NativeTokenStakingManagerTests.t.sol rename to contracts/validatorManager/tests/NativeTokenStakingManagerTests.t.sol diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol similarity index 100% rename from contracts/staking/tests/PoAValidatorManagerTests.t.sol rename to contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol similarity index 100% rename from contracts/staking/tests/PoSValidatorManagerTests.t.sol rename to contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/validatorManager/tests/ValidatorManagerTests.t.sol similarity index 100% rename from contracts/staking/tests/ValidatorManagerTests.t.sol rename to contracts/validatorManager/tests/ValidatorManagerTests.t.sol diff --git a/contracts/staking/tests/ValidatorMessagesTests.t.sol b/contracts/validatorManager/tests/ValidatorMessagesTests.t.sol similarity index 100% rename from contracts/staking/tests/ValidatorMessagesTests.t.sol rename to contracts/validatorManager/tests/ValidatorMessagesTests.t.sol From fcaf32cc13e0ef60b29a263cd0802986975ad1b1 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Wed, 18 Sep 2024 16:14:34 -0400 Subject: [PATCH 341/545] remove staking abi-bindings --- .../ERC20TokenStakingManager.go | 2606 ---------------- .../ExampleRewardCalculator.go | 327 -- .../NativeTokenStakingManager.go | 2637 ----------------- .../PoAValidatorManager.go | 1947 ------------ 4 files changed, 7517 deletions(-) delete mode 100644 abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go delete mode 100644 abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go delete mode 100644 abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go delete mode 100644 abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go deleted file mode 100644 index 7c508d3ba..000000000 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ /dev/null @@ -1,2606 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package erc20tokenstakingmanager - -import ( - "errors" - "math/big" - "strings" - - "github.com/ava-labs/subnet-evm/accounts/abi" - "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/subnet-evm/core/types" - "github.com/ava-labs/subnet-evm/interfaces" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = interfaces.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// InitialValidator is an auto generated low-level Go binding around an user-defined struct. -type InitialValidator struct { - NodeID [32]byte - Weight uint64 - BlsPublicKey []byte -} - -// PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. -type PoSValidatorManagerSettings struct { - BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int - MinimumStakeDuration uint64 - MinimumDelegationFeeBips uint16 - MaximumStakeMultiplier uint8 - RewardCalculator common.Address -} - -// SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. -type SubnetConversionData struct { - ConvertSubnetTxID [32]byte - ValidatorManagerBlockchainID [32]byte - ValidatorManagerAddress common.Address - InitialValidators []InitialValidator -} - -// Validator is an auto generated low-level Go binding around an user-defined struct. -type Validator struct { - Status uint8 - NodeID [32]byte - StartingWeight uint64 - MessageNonce uint64 - Weight uint64 - StartedAt uint64 - EndedAt uint64 -} - -// ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. -type ValidatorManagerSettings struct { - PChainBlockchainID [32]byte - SubnetID [32]byte - ChurnPeriodSeconds uint64 - MaximumChurnPercentage uint8 -} - -// ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. -type ValidatorRegistrationInput struct { - NodeID [32]byte - RegistrationExpiry uint64 - BlsPublicKey []byte -} - -// 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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615e8b380380615e8b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d3e8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f3660046150a1565b6103bf565b005b6101846101943660046150dc565b610862565b6101d76101a73660046150dc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b6102176102123660046150dc565b610a1b565b6040516001600160401b0390911681526020016101e1565b61018461023d366004615107565b610a31565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c366004615145565b610b10565b61018461027f36600461515e565b610bb0565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af366004615186565b610d85565b6101d76102c23660046151ea565b6113b9565b6102176102d53660046150dc565b6113d2565b6101846102e83660046150a1565b6113e6565b6101f2603081565b61018461030336600461515e565b6115e0565b6101d7610316366004615203565b611862565b610184610329366004615145565b61188e565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b6101846103623660046150dc565b611a46565b6101846103753660046150dc565b611ccc565b6101f2601481565b6103956103903660046150dc565b611de0565b6040516101e19190615237565b6102176202a30081565b6101d76103ba3660046152fe565b611ea8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615c92833981519152949193919290829060ff16600481111561042757610427615223565b600481111561043857610438615223565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104b483611de0565b90506002825160048111156104cb576104cb615223565b1461051d5760405162461bcd60e51b815260206004820152602a60248201525f80516020615cb28339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105825760405162461bcd60e51b815260206004820152603360248201525f80516020615cb28339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610514565b6003825280515f90600290600581111561059e5761059e615223565b036105f55786156105b6576105b38487611edd565b90505b5f836060015183608001516105cb9190615377565b90506105d78582612179565b506001600160401b0390811660e0860152421660a085015250610629565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561065c85606001516113b9565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fd9190615397565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561073c5761073c615223565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610850916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615d128339815191526020526040808220815160e0810190925280545f80516020615cd283398151915293929190829060ff1660058111156108af576108af615223565b60058111156108c0576108c0615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561092f5761092f615223565b146109945760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb6109b98584606001515f6122d0565b6040518263ffffffff1660e01b81526004016109d591906153d0565b6020604051808303815f875af11580156109f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a159190615397565b50505050565b5f610a2b64e8d4a5100083615402565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a7a575080546001600160401b03808416911610155b15610a985760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ac384846124f7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615c928339815191525f80610b2984612511565b91509150610b368261285b565b610b405750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b6e57610b6e615223565b03610b93575f83815260088501602052604081208054919055610b918282612896565b505b610ba981610ba484604001516113b9565b61290c565b5050505050565b5f80516020615c928339815191525f610bc88461292f565b90505f80610bd98360400151612b09565b50915091505f610be883611de0565b9050816001600160401b031681606001516001600160401b03161015610c205760405162461bcd60e51b815260040161051490615421565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c655760405162461bcd60e51b815260040161051490615463565b60015f87815260068701602052604090205460ff166004811115610c8b57610c8b615223565b14610cf45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610514565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615cd28339815191529060ff1615610e225760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e899190615397565b836020013514610eeb5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610514565b30610efc60608501604086016154ac565b6001600160a01b031614610f6e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610514565b5f610f7c60608501856154c7565b91505f9050843560208601356014610f9a6060890160408a016154ac565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112c9575f61101a60608901896154c7565b8363ffffffff168181106110305761103061550c565b90506020028101906110429190615520565b61104b906155d0565b80515f818152600989016020526040902054919250901561107e5760405162461bcd60e51b815260040161051490615667565b84825f0151836020015184604001516040516020016110a094939291906156af565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110ee91906156fe565b602060405180830381855afa158015611109573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061112c9190615397565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111b8576111b8615223565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161126b91168661570f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112c290615722565b9050610ffe565b50600584018190555f6112db8661292f565b90505f6112eb8260400151612d44565b9050806002856040516112fe91906156fe565b602060405180830381855afa158015611319573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133c9190615397565b146113a05760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610514565b505050600a909201805460ff1916600117905550505050565b5f610a2b6001600160401b03831664e8d4a51000615744565b5f6113dc82611de0565b6080015192915050565b5f80516020615c928339815191525f6113fe85612eb6565b5f86815260058401602052604090205460a082015191925061143191600160b01b9091046001600160401b03169061575b565b6001600160401b03168160c001516001600160401b031610156114b25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610514565b8315610ba9575f6114c38685611edd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061151a906113b9565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611590573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b49190615397565b5f878152600885016020526040812080549091906115d390849061570f565b9091555050505050505050565b6115e8613131565b5f80516020615c928339815191525f6116008461292f565b90505f806116118360400151612b09565b50915091505f61162083611de0565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561165a5761165a615223565b600481111561166b5761166b615223565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561170a5760405162461bcd60e51b815260040161051490615421565b826001600160401b03168160e001516001600160401b031611156117405760405162461bcd60e51b815260040161051490615463565b60038151600481111561175557611755615223565b146117a95760405162461bcd60e51b815260206004820152603160248201525f80516020615cb28339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610514565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a01909252909120546117df9190612896565b856007015f8881526020019081526020015f205f905561180a8160200151610ba483606001516113b9565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061185e60015f80516020615cf283398151915255565b5050565b5f61186b613131565b61187683338461317b565b9050610a2b60015f80516020615cf283398151915255565b5f80516020615cd28339815191525f6118a68361292f565b90505f806118b78360400151613535565b91509150806119195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610514565b5f828152600785016020526040812080546119339061577b565b9050118015611965575060015f83815260088601602052604090205460ff16600581111561196357611963615223565b145b6119815760405162461bcd60e51b8152600401610514906157b3565b5f828152600785016020526040812061199991614ff1565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615c9283398151915293929190829060ff166004811115611aa757611aa7615223565b6004811115611ab857611ab8615223565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b3f57611b3f615223565b1480611b5d5750600381516004811115611b5b57611b5b615223565b145b611bb15760405162461bcd60e51b815260206004820152603260248201525f80516020615cb2833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610514565b5f611bbf8260400151611de0565b905080606001516001600160401b03165f03611c435760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb611c708460400151846060015185608001516122d0565b6040518263ffffffff1660e01b8152600401611c8c91906153d0565b6020604051808303815f875af1158015611ca8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba99190615397565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615cd2833981519152929190611d149061577b565b9050118015611d46575060015f83815260088301602052604090205460ff166005811115611d4457611d44615223565b145b611d625760405162461bcd60e51b8152600401610514906157b3565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d9b91906004016157fa565b6020604051808303815f875af1158015611db7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ddb9190615397565b505050565b611de8615028565b5f8281525f80516020615d12833981519152602052604090819020815160e0810190925280545f80516020615cd2833981519152929190829060ff166005811115611e3557611e35615223565b6005811115611e4657611e46615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611eb1613131565b611ebd858585856136d6565b9050611ed560015f80516020615cf283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f28573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f4f919081019061588f565b9150915080611fb25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ff5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120199190615397565b82511461207d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610514565b60208201516001600160a01b0316156120f35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610514565b5f80612102846040015161394b565b9150915081871461216f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610514565b9695505050505050565b5f8281525f80516020615d12833981519152602052604081206002015481905f80516020615cd283398151915290600160801b90046001600160401b03166121c18582613b23565b5f6121cb87613d31565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61221b8a858b6122d0565b6040518263ffffffff1660e01b815260040161223791906153d0565b6020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190615397565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561234957612309816001615961565b612314906008615744565b5081515f9083908390811061232b5761232b61550c565b60200101906001600160f81b03191690815f1a9053506001016122f5565b505f5b60048110156123b457612360816003615961565b61236b906008615744565b600263ffffffff16901c60f81b82826002612386919061570f565b815181106123965761239661550c565b60200101906001600160f81b03191690815f1a90535060010161234c565b505f5b6020811015612416576123cb81601f615961565b6123d6906008615744565b86901c60f81b826123e883600661570f565b815181106123f8576123f861550c565b60200101906001600160f81b03191690815f1a9053506001016123b7565b505f5b60088110156124815761242d816007615961565b612438906008615744565b6001600160401b038616901c60f81b8261245383602661570f565b815181106124635761246361550c565b60200101906001600160f81b03191690815f1a905350600101612419565b505f5b60088110156124ec57612498816007615961565b6124a3906008615744565b6001600160401b038516901c60f81b826124be83602e61570f565b815181106124ce576124ce61550c565b60200101906001600160f81b03191690815f1a905350600101612484565b5090505b9392505050565b6124ff613dc1565b61250882613e0c565b61185e81613e83565b5f61251a615028565b5f80516020615cd28339815191525f6125328561292f565b90505f806125438360400151613535565b9150915080156125a85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610514565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156125d9576125d9615223565b60058111156125ea576125ea615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561265b5761265b615223565b1480612679575060018251600581111561267757612677615223565b145b6126d85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610514565b6003825160058111156126ed576126ed615223565b036126fa575060046126fe565b5060055b6020808301515f9081526009880190915260408120558181600581111561272757612727615223565b9081600581111561273a5761273a615223565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561276e5761276e615223565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561282257612822615223565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615c7283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156128f1575f80fd5b505af1158015612903573d5f803e3d5ffd5b50505050505050565b5f80516020615c728339815191525461185e906001600160a01b03168383613f24565b60408051606080820183525f8083526020830181905292820152905f80516020615cd28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156129a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129cb919081019061588f565b9150915080612a2b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610514565b8254825114612a8e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610514565b60208201516001600160a01b031615612b015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610514565b509392505050565b5f805f8351603614612b2d5760405162461bcd60e51b815260040161051490615974565b5f805b6002811015612b7c57612b44816001615961565b612b4f906008615744565b61ffff16868281518110612b6557612b6561550c565b016020015160f81c901b9190911790600101612b30565b5061ffff811615612b9f5760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015612bfa57612bb6816003615961565b612bc1906008615744565b63ffffffff1687612bd383600261570f565b81518110612be357612be361550c565b016020015160f81c901b9190911790600101612ba2565b5063ffffffff8116600414612c215760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015612c7657612c3881601f615961565b612c43906008615744565b88612c4f83600661570f565b81518110612c5f57612c5f61550c565b016020015160f81c901b9190911790600101612c24565b505f805b6008811015612cd557612c8e816007615961565b612c99906008615744565b6001600160401b031689612cae83602661570f565b81518110612cbe57612cbe61550c565b016020015160f81c901b9190911790600101612c7a565b505f805b6008811015612d3457612ced816007615961565b612cf8906008615744565b6001600160401b03168a612d0d83602e61570f565b81518110612d1d57612d1d61550c565b016020015160f81c901b9190911790600101612cd9565b5091989097509095509350505050565b5f8151602614612d665760405162461bcd60e51b815260040161051490615974565b5f805b6002811015612db557612d7d816001615961565b612d88906008615744565b61ffff16848281518110612d9e57612d9e61550c565b016020015160f81c901b9190911790600101612d69565b5061ffff811615612dd85760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015612e3357612def816003615961565b612dfa906008615744565b63ffffffff1685612e0c83600261570f565b81518110612e1c57612e1c61550c565b016020015160f81c901b9190911790600101612ddb565b5063ffffffff811615612e585760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015612ead57612e6f81601f615961565b612e7a906008615744565b86612e8683600661570f565b81518110612e9657612e9661550c565b016020015160f81c901b9190911790600101612e5b565b50949350505050565b612ebe615028565b5f8281525f80516020615d128339815191526020526040808220815160e0810190925280545f80516020615cd283398151915293929190829060ff166005811115612f0b57612f0b615223565b6005811115612f1c57612f1c615223565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612f8e57612f8e615223565b14612fea5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610514565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561302e5761302e615223565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130da8582612179565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615cf283398151915280546001190161316257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615cf283398151915255565b5f5f80516020615c928339815191528161319761021285613f83565b90505f6131a387611de0565b90506131ae8761285b565b61320b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610514565b60028151600581111561322057613220615223565b1461327f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610514565b5f828260800151613290919061575b565b600485015460408401519192506132b2916001600160401b0390911690615a47565b6001600160401b0316816001600160401b031611156133315760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610514565b5f8061333d8a84612179565b915091505f8a8360405160200161336b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561340657613406615223565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146135585760405162461bcd60e51b815260040161051490615974565b5f805b60028110156135a75761356f816001615961565b61357a906008615744565b61ffff168582815181106135905761359061550c565b016020015160f81c901b919091179060010161355b565b5061ffff8116156135ca5760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015613625576135e1816003615961565b6135ec906008615744565b63ffffffff16866135fe83600261570f565b8151811061360e5761360e61550c565b016020015160f81c901b91909117906001016135cd565b5063ffffffff811660031461364c5760405162461bcd60e51b815260040161051490615a00565b5f805b60208110156136a15761366381601f615961565b61366e906008615744565b8761367a83600661570f565b8151811061368a5761368a61550c565b016020015160f81c901b919091179060010161364f565b505f866026815181106136b6576136b661550c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615c928339815191529061ffff861610801590613722575061271061ffff861611155b61373e5760405162461bcd60e51b815260040161051490615a72565b60028101546001600160401b0390811690851610156137b75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610514565b805483101561381a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610514565b80600101548311156138815760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610514565b5f61388b84613f83565b90505f61389782610a1b565b90505f6138a48983613fa6565b905060405180606001604052806138b83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e1461396e5760405162461bcd60e51b815260040161051490615974565b5f805b60028110156139bd57613985816001615961565b613990906008615744565b61ffff168582815181106139a6576139a661550c565b016020015160f81c901b9190911790600101613971565b5061ffff8116156139e05760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015613a3b576139f7816003615961565b613a02906008615744565b63ffffffff1686613a1483600261570f565b81518110613a2457613a2461550c565b016020015160f81c901b91909117906001016139e3565b5063ffffffff8116600514613a625760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015613ab757613a7981601f615961565b613a84906008615744565b87613a9083600661570f565b81518110613aa057613aa061550c565b016020015160f81c901b9190911790600101613a65565b505f805b6008811015613b1657613acf816007615961565b613ada906008615744565b6001600160401b031688613aef83602661570f565b81518110613aff57613aff61550c565b016020015160f81c901b9190911790600101613abb565b5090969095509350505050565b5f80516020615cd28339815191525f6001600160401b038084169085161115613b5757613b508385615377565b9050613b64565b613b618484615377565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613bc6575060028401548151613bc2916001600160401b03169061570f565b8210155b15613bec576001600160401b038316606082015281815260408101516020820152613c0b565b8281606001818151613bfe919061575b565b6001600160401b03169052505b6060810151613c1b906064615a47565b602082015160028601546001600160401b039290921691613c469190600160401b900460ff16615744565b1015613caa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610514565b856001600160401b031681604001818151613cc5919061570f565b9052506040810180516001600160401b0387169190613ce5908390615961565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d128339815191526020526040812060020180545f80516020615cd283398151915291600160401b9091046001600160401b0316906008613d7b83615abd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e0a57604051631afcd79f60e31b815260040160405180910390fd5b565b613e14613dc1565b613e1d8161450b565b613e25614524565b613e80608082013560a0830135613e4260e0850160c086016151ea565b613e53610100860160e08701615ad8565b61ffff16613e6961012087016101008801615af1565b613e7b610140880161012089016154ac565b614534565b50565b613e8b613dc1565b5f80516020615c728339815191526001600160a01b038216613f045760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610514565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ddb91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614778565b5f610a2b825f80516020615c72833981519152546001600160a01b0316906147d9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140315760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610514565b5f80516020615cd28339815191524261405060408601602087016151ea565b6001600160401b0316116140c25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610514565b6140d260408501602086016151ea565b6001600160401b03166140e86202a3004261570f565b1161415b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610514565b83356141b35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610514565b83355f908152600982016020526040902054156141e25760405162461bcd60e51b815260040161051490615667565b60306141f16040860186615b11565b9050146142565760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610514565b614260835f613b23565b5f806142fa6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906142a591906151ea565b6001600160401b031681526020016142c060408a018a615b11565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061493b565b5f828152600786016020526040902091935091506143188282615b97565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143459085906004016153d0565b6020604051808303815f875af1158015614361573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143859190615397565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156143fd576143fd615223565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916144dd918e01908e016151ea565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614513613dc1565b61451b614cea565b613e8081614cf2565b61452c613dc1565b613e0a614e94565b61453c613dc1565b5f80516020615c92833981519152836145a85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610514565b6127108411156145ca5760405162461bcd60e51b815260040161051490615a72565b858711156146325760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610514565b5f8360ff161161469f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610514565b600a60ff841611156147115760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610514565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61478c6001600160a01b03841683614e9c565b905080515f141580156147b05750808060200190518101906147ae9190615c56565b155b15611ddb57604051635274afe760e01b81526001600160a01b0384166004820152602401610514565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561481f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148439190615397565b905061485a6001600160a01b038516333086614ea9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561489e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148c29190615397565b90508181116149285760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610514565b6149328282615961565b95945050505050565b5f60608260800151516030146149a55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610514565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614a1c576149dc816001615961565b6149e7906008615744565b5081515f908390839081106149fe576149fe61550c565b60200101906001600160f81b03191690815f1a9053506001016149c8565b505f5b6004811015614a8457614a33816003615961565b614a3e906008615744565b600160ff919091161c60f81b82614a5683600261570f565b81518110614a6657614a6661550c565b60200101906001600160f81b03191690815f1a905350600101614a1f565b505f5b6020811015614ae15784518160208110614aa357614aa361550c565b1a60f81b82614ab383600661570f565b81518110614ac357614ac361550c565b60200101906001600160f81b03191690815f1a905350600101614a87565b505f5b6020811015614b415784602001518160208110614b0357614b0361550c565b1a60f81b82614b1383602661570f565b81518110614b2357614b2361550c565b60200101906001600160f81b03191690815f1a905350600101614ae4565b505f5b6008811015614bb557614b58816007615961565b614b63906008615744565b60ff1685604001516001600160401b0316901c60f81b82826046614b87919061570f565b81518110614b9757614b9761550c565b60200101906001600160f81b03191690815f1a905350600101614b44565b505f5b6030811015614c205784608001518181518110614bd757614bd761550c565b01602001516001600160f81b03191682614bf283604e61570f565b81518110614c0257614c0261550c565b60200101906001600160f81b03191690815f1a905350600101614bb8565b505f5b6008811015614c9257614c37816007615961565b614c42906008615744565b60608601516001600160401b0390811691161c60f81b82614c6483607e61570f565b81518110614c7457614c7461550c565b60200101906001600160f81b03191690815f1a905350600101614c23565b50600281604051614ca391906156fe565b602060405180830381855afa158015614cbe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ce19190615397565b94909350915050565b613e0a613dc1565b614cfa613dc1565b80355f80516020615cd283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614d466080840160608501615af1565b60ff161115614db35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610514565b5f614dc46080840160608501615af1565b60ff1611614e2c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610514565b614e3c6080830160608401615af1565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614e6d60608301604084016151ea565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613168613dc1565b60606124f083835f614ee2565b6040516001600160a01b038481166024830152838116604483015260648201839052610a159186918216906323b872dd90608401613f51565b606081471015614f075760405163cd78605960e01b8152306004820152602401610514565b5f80856001600160a01b03168486604051614f2291906156fe565b5f6040518083038185875af1925050503d805f8114614f5c576040519150601f19603f3d011682016040523d82523d5f602084013e614f61565b606091505b509150915061216f868383606082614f8157614f7c82614fc8565b6124f0565b8151158015614f9857506001600160a01b0384163b155b15614fc157604051639996b31560e01b81526001600160a01b0385166004820152602401610514565b50806124f0565b805115614fd85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ffd9061577b565b5f825580601f1061500c575050565b601f0160209004905f5260205f2090810190613e809190615064565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615078575f8155600101615065565b5090565b8015158114613e80575f80fd5b803563ffffffff8116811461509c575f80fd5b919050565b5f805f606084860312156150b3575f80fd5b8335925060208401356150c58161507c565b91506150d360408501615089565b90509250925092565b5f602082840312156150ec575f80fd5b5035919050565b6001600160a01b0381168114613e80575f80fd5b5f8082840361016081121561511a575f80fd5b61014080821215615129575f80fd5b849350830135905061513a816150f3565b809150509250929050565b5f60208284031215615155575f80fd5b6124f082615089565b5f806040838503121561516f575f80fd5b61517883615089565b946020939093013593505050565b5f8060408385031215615197575f80fd5b82356001600160401b038111156151ac575f80fd5b8301608081860312156151bd575f80fd5b91506151cb60208401615089565b90509250929050565b80356001600160401b038116811461509c575f80fd5b5f602082840312156151fa575f80fd5b6124f0826151d4565b5f8060408385031215615214575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061525a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161529560608401826001600160401b03169052565b5060808301516152b060808401826001600160401b03169052565b5060a08301516152cb60a08401826001600160401b03169052565b5060c08301516152e660c08401826001600160401b03169052565b5092915050565b803561ffff8116811461509c575f80fd5b5f805f8060808587031215615311575f80fd5b84356001600160401b03811115615326575f80fd5b850160608188031215615337575f80fd5b9350615345602086016152ed565b9250615353604086016151d4565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156152e6576152e6615363565b5f602082840312156153a7575f80fd5b5051919050565b5f5b838110156153c85781810151838201526020016153b0565b50505f910152565b602081525f82518060208401526153ee8160408501602087016153ae565b601f01601f19169190910160400192915050565b5f8261541c57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156154bc575f80fd5b81356124f0816150f3565b5f808335601e198436030181126154dc575f80fd5b8301803591506001600160401b038211156154f5575f80fd5b6020019150600581901b36038213156122c9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615534575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156155745761557461553e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156155a2576155a261553e565b604052919050565b5f6001600160401b038211156155c2576155c261553e565b50601f01601f191660200190565b5f606082360312156155e0575f80fd5b6155e8615552565b8235815260206155f98185016151d4565b8183015260408401356001600160401b03811115615615575f80fd5b840136601f820112615625575f80fd5b8035615638615633826155aa565b61557a565b818152368483850101111561564b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516156c0818460208a016153ae565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156f08160288401602088016153ae565b016028019695505050505050565b5f82516155348184602087016153ae565b80820180821115610a2b57610a2b615363565b5f63ffffffff80831681810361573a5761573a615363565b6001019392505050565b8082028115828204841417610a2b57610a2b615363565b6001600160401b038181168382160190808211156152e6576152e6615363565b600181811c9082168061578f57607f821691505b6020821081036157ad57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461580c8161577b565b806020870152604060018084165f811461582d576001811461584957615876565b60ff19851660408a0152604084151560051b8a01019550615876565b895f5260205f205f5b8581101561586d5781548b8201860152908301908801615852565b8a016040019650505b509398975050505050505050565b805161509c8161507c565b5f80604083850312156158a0575f80fd5b82516001600160401b03808211156158b6575f80fd5b90840190606082870312156158c9575f80fd5b6158d1615552565b825181526020808401516158e4816150f3565b828201526040840151838111156158f9575f80fd5b80850194505087601f85011261590d575f80fd5b8351925061591d615633846155aa565b8381528882858701011115615930575f80fd5b61593f848383018488016153ae565b80604084015250819550615954818801615884565b9450505050509250929050565b81810381811115610a2b57610a2b615363565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a6a57615a6a615363565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361573a5761573a615363565b5f60208284031215615ae8575f80fd5b6124f0826152ed565b5f60208284031215615b01575f80fd5b813560ff811681146124f0575f80fd5b5f808335601e19843603018112615b26575f80fd5b8301803591506001600160401b03821115615b3f575f80fd5b6020019150368190038213156122c9575f80fd5b601f821115611ddb57805f5260205f20601f840160051c81016020851015615b785750805b601f840160051c820191505b81811015610ba9575f8155600101615b84565b81516001600160401b03811115615bb057615bb061553e565b615bc481615bbe845461577b565b84615b53565b602080601f831160018114615bf7575f8415615be05750858301515b5f19600386901b1c1916600185901b178555615c4e565b5f85815260208120601f198616915b82811015615c2557888601518255948401946001909101908401615c06565b5085821015615c4257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615c66575f80fd5b81516124f08161507c56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", -} - -// ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. -// Deprecated: Use ERC20TokenStakingManagerMetaData.ABI instead. -var ERC20TokenStakingManagerABI = ERC20TokenStakingManagerMetaData.ABI - -// ERC20TokenStakingManagerBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use ERC20TokenStakingManagerMetaData.Bin instead. -var ERC20TokenStakingManagerBin = ERC20TokenStakingManagerMetaData.Bin - -// DeployERC20TokenStakingManager deploys a new Ethereum contract, binding an instance of ERC20TokenStakingManager to it. -func DeployERC20TokenStakingManager(auth *bind.TransactOpts, backend bind.ContractBackend, init uint8) (common.Address, *types.Transaction, *ERC20TokenStakingManager, error) { - parsed, err := ERC20TokenStakingManagerMetaData.GetAbi() - if err != nil { - return common.Address{}, nil, nil, err - } - if parsed == nil { - return common.Address{}, nil, nil, errors.New("GetABI returned nil") - } - - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ERC20TokenStakingManagerBin), backend, init) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &ERC20TokenStakingManager{ERC20TokenStakingManagerCaller: ERC20TokenStakingManagerCaller{contract: contract}, ERC20TokenStakingManagerTransactor: ERC20TokenStakingManagerTransactor{contract: contract}, ERC20TokenStakingManagerFilterer: ERC20TokenStakingManagerFilterer{contract: contract}}, nil -} - -// ERC20TokenStakingManager is an auto generated Go binding around an Ethereum contract. -type ERC20TokenStakingManager struct { - ERC20TokenStakingManagerCaller // Read-only binding to the contract - ERC20TokenStakingManagerTransactor // Write-only binding to the contract - ERC20TokenStakingManagerFilterer // Log filterer for contract events -} - -// ERC20TokenStakingManagerCaller is an auto generated read-only Go binding around an Ethereum contract. -type ERC20TokenStakingManagerCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ERC20TokenStakingManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. -type ERC20TokenStakingManagerTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ERC20TokenStakingManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type ERC20TokenStakingManagerFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ERC20TokenStakingManagerSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type ERC20TokenStakingManagerSession struct { - Contract *ERC20TokenStakingManager // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ERC20TokenStakingManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type ERC20TokenStakingManagerCallerSession struct { - Contract *ERC20TokenStakingManagerCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// ERC20TokenStakingManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type ERC20TokenStakingManagerTransactorSession struct { - Contract *ERC20TokenStakingManagerTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ERC20TokenStakingManagerRaw is an auto generated low-level Go binding around an Ethereum contract. -type ERC20TokenStakingManagerRaw struct { - Contract *ERC20TokenStakingManager // Generic contract binding to access the raw methods on -} - -// ERC20TokenStakingManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type ERC20TokenStakingManagerCallerRaw struct { - Contract *ERC20TokenStakingManagerCaller // Generic read-only contract binding to access the raw methods on -} - -// ERC20TokenStakingManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type ERC20TokenStakingManagerTransactorRaw struct { - Contract *ERC20TokenStakingManagerTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewERC20TokenStakingManager creates a new instance of ERC20TokenStakingManager, bound to a specific deployed contract. -func NewERC20TokenStakingManager(address common.Address, backend bind.ContractBackend) (*ERC20TokenStakingManager, error) { - contract, err := bindERC20TokenStakingManager(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManager{ERC20TokenStakingManagerCaller: ERC20TokenStakingManagerCaller{contract: contract}, ERC20TokenStakingManagerTransactor: ERC20TokenStakingManagerTransactor{contract: contract}, ERC20TokenStakingManagerFilterer: ERC20TokenStakingManagerFilterer{contract: contract}}, nil -} - -// NewERC20TokenStakingManagerCaller creates a new read-only instance of ERC20TokenStakingManager, bound to a specific deployed contract. -func NewERC20TokenStakingManagerCaller(address common.Address, caller bind.ContractCaller) (*ERC20TokenStakingManagerCaller, error) { - contract, err := bindERC20TokenStakingManager(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerCaller{contract: contract}, nil -} - -// NewERC20TokenStakingManagerTransactor creates a new write-only instance of ERC20TokenStakingManager, bound to a specific deployed contract. -func NewERC20TokenStakingManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*ERC20TokenStakingManagerTransactor, error) { - contract, err := bindERC20TokenStakingManager(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerTransactor{contract: contract}, nil -} - -// NewERC20TokenStakingManagerFilterer creates a new log filterer instance of ERC20TokenStakingManager, bound to a specific deployed contract. -func NewERC20TokenStakingManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*ERC20TokenStakingManagerFilterer, error) { - contract, err := bindERC20TokenStakingManager(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerFilterer{contract: contract}, nil -} - -// bindERC20TokenStakingManager binds a generic wrapper to an already deployed contract. -func bindERC20TokenStakingManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := ERC20TokenStakingManagerMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _ERC20TokenStakingManager.Contract.ERC20TokenStakingManagerCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ERC20TokenStakingManagerTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ERC20TokenStakingManagerTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _ERC20TokenStakingManager.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.contract.Transact(opts, method, params...) -} - -// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. -// -// Solidity: function ADDRESS_LENGTH() view returns(uint32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) ADDRESSLENGTH(opts *bind.CallOpts) (uint32, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "ADDRESS_LENGTH") - - if err != nil { - return *new(uint32), err - } - - out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) - - return out0, err - -} - -// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. -// -// Solidity: function ADDRESS_LENGTH() view returns(uint32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ADDRESSLENGTH() (uint32, error) { - return _ERC20TokenStakingManager.Contract.ADDRESSLENGTH(&_ERC20TokenStakingManager.CallOpts) -} - -// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. -// -// Solidity: function ADDRESS_LENGTH() view returns(uint32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) ADDRESSLENGTH() (uint32, error) { - return _ERC20TokenStakingManager.Contract.ADDRESSLENGTH(&_ERC20TokenStakingManager.CallOpts) -} - -// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. -// -// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) BLSPUBLICKEYLENGTH(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "BLS_PUBLIC_KEY_LENGTH") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. -// -// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) BLSPUBLICKEYLENGTH() (uint8, error) { - return _ERC20TokenStakingManager.Contract.BLSPUBLICKEYLENGTH(&_ERC20TokenStakingManager.CallOpts) -} - -// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. -// -// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) BLSPUBLICKEYLENGTH() (uint8, error) { - return _ERC20TokenStakingManager.Contract.BLSPUBLICKEYLENGTH(&_ERC20TokenStakingManager.CallOpts) -} - -// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. -// -// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMCHURNPERCENTAGELIMIT(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_CHURN_PERCENTAGE_LIMIT") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. -// -// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { - return _ERC20TokenStakingManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_ERC20TokenStakingManager.CallOpts) -} - -// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. -// -// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { - return _ERC20TokenStakingManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_ERC20TokenStakingManager.CallOpts) -} - -// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. -// -// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMDELEGATIONFEEBIPS(opts *bind.CallOpts) (uint16, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_DELEGATION_FEE_BIPS") - - if err != nil { - return *new(uint16), err - } - - out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) - - return out0, err - -} - -// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. -// -// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMDELEGATIONFEEBIPS() (uint16, error) { - return _ERC20TokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_ERC20TokenStakingManager.CallOpts) -} - -// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. -// -// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMDELEGATIONFEEBIPS() (uint16, error) { - return _ERC20TokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_ERC20TokenStakingManager.CallOpts) -} - -// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. -// -// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMREGISTRATIONEXPIRYLENGTH(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_REGISTRATION_EXPIRY_LENGTH") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. -// -// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { - return _ERC20TokenStakingManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_ERC20TokenStakingManager.CallOpts) -} - -// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. -// -// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { - return _ERC20TokenStakingManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_ERC20TokenStakingManager.CallOpts) -} - -// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. -// -// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) MAXIMUMSTAKEMULTIPLIERLIMIT(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "MAXIMUM_STAKE_MULTIPLIER_LIMIT") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. -// -// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) MAXIMUMSTAKEMULTIPLIERLIMIT() (uint8, error) { - return _ERC20TokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_ERC20TokenStakingManager.CallOpts) -} - -// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. -// -// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMSTAKEMULTIPLIERLIMIT() (uint8, error) { - return _ERC20TokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_ERC20TokenStakingManager.CallOpts) -} - -// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. -// -// Solidity: function WARP_MESSENGER() view returns(address) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) WARPMESSENGER(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "WARP_MESSENGER") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. -// -// Solidity: function WARP_MESSENGER() view returns(address) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) WARPMESSENGER() (common.Address, error) { - return _ERC20TokenStakingManager.Contract.WARPMESSENGER(&_ERC20TokenStakingManager.CallOpts) -} - -// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. -// -// Solidity: function WARP_MESSENGER() view returns(address) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WARPMESSENGER() (common.Address, error) { - return _ERC20TokenStakingManager.Contract.WARPMESSENGER(&_ERC20TokenStakingManager.CallOpts) -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) ActiveValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "activeValidators", nodeID) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { - return _ERC20TokenStakingManager.Contract.ActiveValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { - return _ERC20TokenStakingManager.Contract.ActiveValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) -} - -// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. -// -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "getValidator", validationID) - - if err != nil { - return *new(Validator), err - } - - out0 := *abi.ConvertType(out[0], new(Validator)).(*Validator) - - return out0, err - -} - -// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. -// -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) GetValidator(validationID [32]byte) (Validator, error) { - return _ERC20TokenStakingManager.Contract.GetValidator(&_ERC20TokenStakingManager.CallOpts, validationID) -} - -// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. -// -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { - return _ERC20TokenStakingManager.Contract.GetValidator(&_ERC20TokenStakingManager.CallOpts, validationID) -} - -// GetWeight is a free data retrieval call binding the contract method 0x66435abf. -// -// Solidity: function getWeight(bytes32 validationID) view returns(uint64) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetWeight(opts *bind.CallOpts, validationID [32]byte) (uint64, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "getWeight", validationID) - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// GetWeight is a free data retrieval call binding the contract method 0x66435abf. -// -// Solidity: function getWeight(bytes32 validationID) view returns(uint64) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) GetWeight(validationID [32]byte) (uint64, error) { - return _ERC20TokenStakingManager.Contract.GetWeight(&_ERC20TokenStakingManager.CallOpts, validationID) -} - -// GetWeight is a free data retrieval call binding the contract method 0x66435abf. -// -// Solidity: function getWeight(bytes32 validationID) view returns(uint64) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) GetWeight(validationID [32]byte) (uint64, error) { - return _ERC20TokenStakingManager.Contract.GetWeight(&_ERC20TokenStakingManager.CallOpts, validationID) -} - -// ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. -// -// Solidity: function valueToWeight(uint256 value) pure 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) - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. -// -// Solidity: function valueToWeight(uint256 value) pure 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) -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) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) WeightToValue(opts *bind.CallOpts, weight uint64) (*big.Int, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "weightToValue", weight) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// WeightToValue is a free data retrieval call binding the contract method 0x62065856. -// -// Solidity: function weightToValue(uint64 weight) pure 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) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WeightToValue(weight uint64) (*big.Int, error) { - return _ERC20TokenStakingManager.Contract.WeightToValue(&_ERC20TokenStakingManager.CallOpts, weight) -} - -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. -// -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegationID) -} - -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. -// -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) -} - -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. -// -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) -} - -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. -// -// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegationID) -} - -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. -// -// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) -} - -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. -// -// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteEndDelegation(&_ERC20TokenStakingManager.TransactOpts, messageIndex, delegationID) -} - -// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. -// -// Solidity: function completeEndValidation(uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "completeEndValidation", messageIndex) -} - -// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. -// -// Solidity: function completeEndValidation(uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteEndValidation(&_ERC20TokenStakingManager.TransactOpts, messageIndex) -} - -// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. -// -// Solidity: function completeEndValidation(uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteEndValidation(&_ERC20TokenStakingManager.TransactOpts, messageIndex) -} - -// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. -// -// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) CompleteValidatorRegistration(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "completeValidatorRegistration", messageIndex) -} - -// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. -// -// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) -} - -// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. -// -// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) -} - -// Initialize is a paid mutator transaction binding the contract method 0x330a0a3a. -// -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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 0x330a0a3a. -// -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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 0x330a0a3a. -// -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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) -} - -// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. -// -// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeDelegatorRegistration", validationID, delegationAmount) -} - -// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. -// -// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeDelegatorRegistration(validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegationAmount) -} - -// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0x9e1bc4ef. -// -// Solidity: function initializeDelegatorRegistration(bytes32 validationID, uint256 delegationAmount) returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeDelegatorRegistration(validationID [32]byte, delegationAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeDelegatorRegistration(&_ERC20TokenStakingManager.TransactOpts, validationID, delegationAmount) -} - -// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. -// -// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeEndDelegation", delegationID, includeUptimeProof, messageIndex) -} - -// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. -// -// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) -} - -// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. -// -// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) -} - -// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. -// -// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeEndValidation", validationID, includeUptimeProof, messageIndex) -} - -// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. -// -// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) -} - -// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. -// -// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) -} - -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. -// -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) -} - -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. -// -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) -} - -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. -// -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) -} - -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. -// -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) -} - -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. -// -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorSet(&_ERC20TokenStakingManager.TransactOpts, subnetConversionData, messageIndex) -} - -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. -// -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.InitializeValidatorSet(&_ERC20TokenStakingManager.TransactOpts, subnetConversionData, messageIndex) -} - -// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. -// -// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendEndValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "resendEndValidatorMessage", validationID) -} - -// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. -// -// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendEndValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) -} - -// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. -// -// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendEndValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) -} - -// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. -// -// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendRegisterValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "resendRegisterValidatorMessage", validationID) -} - -// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. -// -// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendRegisterValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) -} - -// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. -// -// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendRegisterValidatorMessage(&_ERC20TokenStakingManager.TransactOpts, validationID) -} - -// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. -// -// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ResendUpdateDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "resendUpdateDelegation", delegationID) -} - -// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. -// -// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendUpdateDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) -} - -// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. -// -// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.ResendUpdateDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) -} - -// ERC20TokenStakingManagerDelegationEndedIterator is returned from FilterDelegationEnded and is used to iterate over the raw logs and unpacked data for DelegationEnded events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerDelegationEndedIterator struct { - Event *ERC20TokenStakingManagerDelegationEnded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerDelegationEndedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerDelegationEnded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerDelegationEnded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerDelegationEndedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerDelegationEndedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerDelegationEnded struct { - DelegationID [32]byte - ValidationID [32]byte - Nonce uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. -// -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerDelegationEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil -} - -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. -// -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerDelegationEnded) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. -// -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { - event := new(ERC20TokenStakingManagerDelegationEnded) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ERC20TokenStakingManagerDelegatorAddedIterator is returned from FilterDelegatorAdded and is used to iterate over the raw logs and unpacked data for DelegatorAdded events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerDelegatorAddedIterator struct { - Event *ERC20TokenStakingManagerDelegatorAdded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerDelegatorAdded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerDelegatorAdded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerDelegatorAddedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerDelegatorAdded represents a DelegatorAdded event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerDelegatorAdded struct { - DelegationID [32]byte - ValidationID [32]byte - DelegatorAddress common.Address - Nonce uint64 - ValidatorWeight uint64 - DelegatorWeight uint64 - SetWeightMessageID [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. -// -// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (*ERC20TokenStakingManagerDelegatorAddedIterator, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var delegatorAddressRule []interface{} - for _, delegatorAddressItem := range delegatorAddress { - delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerDelegatorAddedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil -} - -// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. -// -// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorAdded, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (event.Subscription, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var delegatorAddressRule []interface{} - for _, delegatorAddressItem := range delegatorAddress { - delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerDelegatorAdded) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDelegatorAdded is a log parse operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. -// -// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*ERC20TokenStakingManagerDelegatorAdded, error) { - event := new(ERC20TokenStakingManagerDelegatorAdded) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ERC20TokenStakingManagerDelegatorRegisteredIterator is returned from FilterDelegatorRegistered and is used to iterate over the raw logs and unpacked data for DelegatorRegistered events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerDelegatorRegisteredIterator struct { - Event *ERC20TokenStakingManagerDelegatorRegistered // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerDelegatorRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerDelegatorRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerDelegatorRegistered struct { - DelegationID [32]byte - ValidationID [32]byte - Nonce uint64 - StartTime *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. -// -// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerDelegatorRegisteredIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil -} - -// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. -// -// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerDelegatorRegistered) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. -// -// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*ERC20TokenStakingManagerDelegatorRegistered, error) { - event := new(ERC20TokenStakingManagerDelegatorRegistered) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ERC20TokenStakingManagerDelegatorRemovalInitializedIterator is returned from FilterDelegatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for DelegatorRemovalInitialized events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerDelegatorRemovalInitializedIterator struct { - Event *ERC20TokenStakingManagerDelegatorRemovalInitialized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerDelegatorRemovalInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerDelegatorRemovalInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerDelegatorRemovalInitialized struct { - DelegationID [32]byte - ValidationID [32]byte - EndTime *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. -// -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerDelegatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil -} - -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. -// -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. -// -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerDelegatorRemovalInitialized, error) { - event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ERC20TokenStakingManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerInitialValidatorCreatedIterator struct { - Event *ERC20TokenStakingManagerInitialValidatorCreated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerInitialValidatorCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerInitialValidatorCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerInitialValidatorCreated struct { - ValidationID [32]byte - NodeID [32]byte - Weight *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. -// -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*ERC20TokenStakingManagerInitialValidatorCreatedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nodeIDRule []interface{} - for _, nodeIDItem := range nodeID { - nodeIDRule = append(nodeIDRule, nodeIDItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerInitialValidatorCreatedIterator{contract: _ERC20TokenStakingManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil -} - -// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. -// -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nodeIDRule []interface{} - for _, nodeIDItem := range nodeID { - nodeIDRule = append(nodeIDRule, nodeIDItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerInitialValidatorCreated) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. -// -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*ERC20TokenStakingManagerInitialValidatorCreated, error) { - event := new(ERC20TokenStakingManagerInitialValidatorCreated) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ERC20TokenStakingManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerInitializedIterator struct { - Event *ERC20TokenStakingManagerInitialized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerInitializedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerInitialized represents a Initialized event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerInitialized struct { - Version uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. -// -// Solidity: event Initialized(uint64 version) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*ERC20TokenStakingManagerInitializedIterator, error) { - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "Initialized", logs: logs, sub: sub}, nil -} - -// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. -// -// Solidity: event Initialized(uint64 version) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerInitialized) (event.Subscription, error) { - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerInitialized) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "Initialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. -// -// Solidity: event Initialized(uint64 version) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseInitialized(log types.Log) (*ERC20TokenStakingManagerInitialized, error) { - event := new(ERC20TokenStakingManagerInitialized) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "Initialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ERC20TokenStakingManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerValidationPeriodCreatedIterator struct { - Event *ERC20TokenStakingManagerValidationPeriodCreated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerValidationPeriodCreatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerValidationPeriodCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerValidationPeriodCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerValidationPeriodCreatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerValidationPeriodCreatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerValidationPeriodCreated struct { - ValidationID [32]byte - NodeID [32]byte - RegisterValidationMessageID [32]byte - Weight *big.Int - RegistrationExpiry uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. -// -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodCreatedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nodeIDRule []interface{} - for _, nodeIDItem := range nodeID { - nodeIDRule = append(nodeIDRule, nodeIDItem) - } - var registerValidationMessageIDRule []interface{} - for _, registerValidationMessageIDItem := range registerValidationMessageID { - registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerValidationPeriodCreatedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil -} - -// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. -// -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nodeIDRule []interface{} - for _, nodeIDItem := range nodeID { - nodeIDRule = append(nodeIDRule, nodeIDItem) - } - var registerValidationMessageIDRule []interface{} - for _, registerValidationMessageIDItem := range registerValidationMessageID { - registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerValidationPeriodCreated) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidationPeriodCreated is a log parse operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. -// -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*ERC20TokenStakingManagerValidationPeriodCreated, error) { - event := new(ERC20TokenStakingManagerValidationPeriodCreated) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ERC20TokenStakingManagerValidationPeriodEndedIterator is returned from FilterValidationPeriodEnded and is used to iterate over the raw logs and unpacked data for ValidationPeriodEnded events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerValidationPeriodEndedIterator struct { - Event *ERC20TokenStakingManagerValidationPeriodEnded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerValidationPeriodEndedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerValidationPeriodEnded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerValidationPeriodEnded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerValidationPeriodEndedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerValidationPeriodEndedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerValidationPeriodEnded struct { - ValidationID [32]byte - Status uint8 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. -// -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte, status []uint8) (*ERC20TokenStakingManagerValidationPeriodEndedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var statusRule []interface{} - for _, statusItem := range status { - statusRule = append(statusRule, statusItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerValidationPeriodEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil -} - -// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. -// -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodEnded, validationID [][32]byte, status []uint8) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var statusRule []interface{} - for _, statusItem := range status { - statusRule = append(statusRule, statusItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerValidationPeriodEnded) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. -// -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*ERC20TokenStakingManagerValidationPeriodEnded, error) { - event := new(ERC20TokenStakingManagerValidationPeriodEnded) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ERC20TokenStakingManagerValidationPeriodRegisteredIterator is returned from FilterValidationPeriodRegistered and is used to iterate over the raw logs and unpacked data for ValidationPeriodRegistered events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerValidationPeriodRegisteredIterator struct { - Event *ERC20TokenStakingManagerValidationPeriodRegistered // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerValidationPeriodRegisteredIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerValidationPeriodRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerValidationPeriodRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerValidationPeriodRegisteredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerValidationPeriodRegisteredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerValidationPeriodRegistered struct { - ValidationID [32]byte - Weight *big.Int - Timestamp *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. -// -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodRegisteredIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodRegistered", validationIDRule) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerValidationPeriodRegisteredIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil -} - -// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. -// -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodRegistered", validationIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerValidationPeriodRegistered) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. -// -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*ERC20TokenStakingManagerValidationPeriodRegistered, error) { - event := new(ERC20TokenStakingManagerValidationPeriodRegistered) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ERC20TokenStakingManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerValidatorRemovalInitializedIterator struct { - Event *ERC20TokenStakingManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerValidatorRemovalInitializedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerValidatorRemovalInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerValidatorRemovalInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerValidatorRemovalInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerValidatorRemovalInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerValidatorRemovalInitialized represents a ValidatorRemovalInitialized event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerValidatorRemovalInitialized struct { - ValidationID [32]byte - SetWeightMessageID [32]byte - Weight *big.Int - EndTime *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. -// -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*ERC20TokenStakingManagerValidatorRemovalInitializedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerValidatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil -} - -// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. -// -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerValidatorRemovalInitialized) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. -// -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerValidatorRemovalInitialized, error) { - event := new(ERC20TokenStakingManagerValidatorRemovalInitialized) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// ERC20TokenStakingManagerValidatorWeightUpdateIterator is returned from FilterValidatorWeightUpdate and is used to iterate over the raw logs and unpacked data for ValidatorWeightUpdate events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerValidatorWeightUpdateIterator struct { - Event *ERC20TokenStakingManagerValidatorWeightUpdate // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerValidatorWeightUpdateIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerValidatorWeightUpdate) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerValidatorWeightUpdate) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerValidatorWeightUpdateIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerValidatorWeightUpdateIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerValidatorWeightUpdate represents a ValidatorWeightUpdate event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerValidatorWeightUpdate struct { - ValidationID [32]byte - Nonce uint64 - ValidatorWeight uint64 - SetWeightMessageID [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. -// -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerValidatorWeightUpdateIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerValidatorWeightUpdateIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidatorWeightUpdate", logs: logs, sub: sub}, nil -} - -// WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. -// -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerValidatorWeightUpdate) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. -// -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*ERC20TokenStakingManagerValidatorWeightUpdate, error) { - event := new(ERC20TokenStakingManagerValidatorWeightUpdate) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go deleted file mode 100644 index d343cda87..000000000 --- a/abi-bindings/go/staking/ExampleRewardCalculator/ExampleRewardCalculator.go +++ /dev/null @@ -1,327 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package examplerewardcalculator - -import ( - "errors" - "math/big" - "strings" - - "github.com/ava-labs/subnet-evm/accounts/abi" - "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/subnet-evm/core/types" - "github.com/ava-labs/subnet-evm/interfaces" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = interfaces.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// 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", -} - -// ExampleRewardCalculatorABI is the input ABI used to generate the binding from. -// Deprecated: Use ExampleRewardCalculatorMetaData.ABI instead. -var ExampleRewardCalculatorABI = ExampleRewardCalculatorMetaData.ABI - -// ExampleRewardCalculatorBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use ExampleRewardCalculatorMetaData.Bin instead. -var ExampleRewardCalculatorBin = ExampleRewardCalculatorMetaData.Bin - -// DeployExampleRewardCalculator deploys a new Ethereum contract, binding an instance of ExampleRewardCalculator to it. -func DeployExampleRewardCalculator(auth *bind.TransactOpts, backend bind.ContractBackend, rewardBasisPoints_ uint64) (common.Address, *types.Transaction, *ExampleRewardCalculator, error) { - parsed, err := ExampleRewardCalculatorMetaData.GetAbi() - if err != nil { - return common.Address{}, nil, nil, err - } - if parsed == nil { - return common.Address{}, nil, nil, errors.New("GetABI returned nil") - } - - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(ExampleRewardCalculatorBin), backend, rewardBasisPoints_) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &ExampleRewardCalculator{ExampleRewardCalculatorCaller: ExampleRewardCalculatorCaller{contract: contract}, ExampleRewardCalculatorTransactor: ExampleRewardCalculatorTransactor{contract: contract}, ExampleRewardCalculatorFilterer: ExampleRewardCalculatorFilterer{contract: contract}}, nil -} - -// ExampleRewardCalculator is an auto generated Go binding around an Ethereum contract. -type ExampleRewardCalculator struct { - ExampleRewardCalculatorCaller // Read-only binding to the contract - ExampleRewardCalculatorTransactor // Write-only binding to the contract - ExampleRewardCalculatorFilterer // Log filterer for contract events -} - -// ExampleRewardCalculatorCaller is an auto generated read-only Go binding around an Ethereum contract. -type ExampleRewardCalculatorCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ExampleRewardCalculatorTransactor is an auto generated write-only Go binding around an Ethereum contract. -type ExampleRewardCalculatorTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ExampleRewardCalculatorFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type ExampleRewardCalculatorFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// ExampleRewardCalculatorSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type ExampleRewardCalculatorSession struct { - Contract *ExampleRewardCalculator // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ExampleRewardCalculatorCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type ExampleRewardCalculatorCallerSession struct { - Contract *ExampleRewardCalculatorCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// ExampleRewardCalculatorTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type ExampleRewardCalculatorTransactorSession struct { - Contract *ExampleRewardCalculatorTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// ExampleRewardCalculatorRaw is an auto generated low-level Go binding around an Ethereum contract. -type ExampleRewardCalculatorRaw struct { - Contract *ExampleRewardCalculator // Generic contract binding to access the raw methods on -} - -// ExampleRewardCalculatorCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type ExampleRewardCalculatorCallerRaw struct { - Contract *ExampleRewardCalculatorCaller // Generic read-only contract binding to access the raw methods on -} - -// ExampleRewardCalculatorTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type ExampleRewardCalculatorTransactorRaw struct { - Contract *ExampleRewardCalculatorTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewExampleRewardCalculator creates a new instance of ExampleRewardCalculator, bound to a specific deployed contract. -func NewExampleRewardCalculator(address common.Address, backend bind.ContractBackend) (*ExampleRewardCalculator, error) { - contract, err := bindExampleRewardCalculator(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &ExampleRewardCalculator{ExampleRewardCalculatorCaller: ExampleRewardCalculatorCaller{contract: contract}, ExampleRewardCalculatorTransactor: ExampleRewardCalculatorTransactor{contract: contract}, ExampleRewardCalculatorFilterer: ExampleRewardCalculatorFilterer{contract: contract}}, nil -} - -// NewExampleRewardCalculatorCaller creates a new read-only instance of ExampleRewardCalculator, bound to a specific deployed contract. -func NewExampleRewardCalculatorCaller(address common.Address, caller bind.ContractCaller) (*ExampleRewardCalculatorCaller, error) { - contract, err := bindExampleRewardCalculator(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &ExampleRewardCalculatorCaller{contract: contract}, nil -} - -// NewExampleRewardCalculatorTransactor creates a new write-only instance of ExampleRewardCalculator, bound to a specific deployed contract. -func NewExampleRewardCalculatorTransactor(address common.Address, transactor bind.ContractTransactor) (*ExampleRewardCalculatorTransactor, error) { - contract, err := bindExampleRewardCalculator(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &ExampleRewardCalculatorTransactor{contract: contract}, nil -} - -// NewExampleRewardCalculatorFilterer creates a new log filterer instance of ExampleRewardCalculator, bound to a specific deployed contract. -func NewExampleRewardCalculatorFilterer(address common.Address, filterer bind.ContractFilterer) (*ExampleRewardCalculatorFilterer, error) { - contract, err := bindExampleRewardCalculator(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &ExampleRewardCalculatorFilterer{contract: contract}, nil -} - -// bindExampleRewardCalculator binds a generic wrapper to an already deployed contract. -func bindExampleRewardCalculator(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := ExampleRewardCalculatorMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_ExampleRewardCalculator *ExampleRewardCalculatorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ExampleRewardCalculator.Contract.ExampleRewardCalculatorTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _ExampleRewardCalculator.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _ExampleRewardCalculator.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_ExampleRewardCalculator *ExampleRewardCalculatorTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _ExampleRewardCalculator.Contract.contract.Transact(opts, method, params...) -} - -// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. -// -// Solidity: function SECONDS_IN_YEAR() view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) SECONDSINYEAR(opts *bind.CallOpts) (*big.Int, error) { - var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "SECONDS_IN_YEAR") - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. -// -// Solidity: function SECONDS_IN_YEAR() view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) SECONDSINYEAR() (*big.Int, error) { - return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) -} - -// SECONDSINYEAR is a free data retrieval call binding the contract method 0x5dcc9391. -// -// Solidity: function SECONDS_IN_YEAR() view returns(uint256) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) SECONDSINYEAR() (*big.Int, error) { - return _ExampleRewardCalculator.Contract.SECONDSINYEAR(&_ExampleRewardCalculator.CallOpts) -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) UPTIMEREWARDSTHRESHOLDPERCENTAGE(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "UPTIME_REWARDS_THRESHOLD_PERCENTAGE") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { - return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) -} - -// UPTIMEREWARDSTHRESHOLDPERCENTAGE is a free data retrieval call binding the contract method 0xafba878a. -// -// Solidity: function UPTIME_REWARDS_THRESHOLD_PERCENTAGE() view returns(uint8) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) UPTIMEREWARDSTHRESHOLDPERCENTAGE() (uint8, error) { - return _ExampleRewardCalculator.Contract.UPTIMEREWARDSTHRESHOLDPERCENTAGE(&_ExampleRewardCalculator.CallOpts) -} - -// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. -// -// 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) { - var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "calculateReward", stakeAmount, validatorStartTime, stakingStartTime, stakingEndTime, uptimeSeconds, arg5, arg6) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. -// -// 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) -} - -// CalculateReward is a free data retrieval call binding the contract method 0x778c06b5. -// -// 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) -} - -// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. -// -// Solidity: function rewardBasisPoints() view returns(uint64) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCaller) RewardBasisPoints(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _ExampleRewardCalculator.contract.Call(opts, &out, "rewardBasisPoints") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. -// -// Solidity: function rewardBasisPoints() view returns(uint64) -func (_ExampleRewardCalculator *ExampleRewardCalculatorSession) RewardBasisPoints() (uint64, error) { - return _ExampleRewardCalculator.Contract.RewardBasisPoints(&_ExampleRewardCalculator.CallOpts) -} - -// RewardBasisPoints is a free data retrieval call binding the contract method 0xbb65b242. -// -// Solidity: function rewardBasisPoints() view returns(uint64) -func (_ExampleRewardCalculator *ExampleRewardCalculatorCallerSession) RewardBasisPoints() (uint64, error) { - return _ExampleRewardCalculator.Contract.RewardBasisPoints(&_ExampleRewardCalculator.CallOpts) -} diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go deleted file mode 100644 index 9cf250ac3..000000000 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ /dev/null @@ -1,2637 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package nativetokenstakingmanager - -import ( - "errors" - "math/big" - "strings" - - "github.com/ava-labs/subnet-evm/accounts/abi" - "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/subnet-evm/core/types" - "github.com/ava-labs/subnet-evm/interfaces" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = interfaces.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// InitialValidator is an auto generated low-level Go binding around an user-defined struct. -type InitialValidator struct { - NodeID [32]byte - Weight uint64 - BlsPublicKey []byte -} - -// PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. -type PoSValidatorManagerSettings struct { - BaseSettings ValidatorManagerSettings - MinimumStakeAmount *big.Int - MaximumStakeAmount *big.Int - MinimumStakeDuration uint64 - MinimumDelegationFeeBips uint16 - MaximumStakeMultiplier uint8 - RewardCalculator common.Address -} - -// SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. -type SubnetConversionData struct { - ConvertSubnetTxID [32]byte - ValidatorManagerBlockchainID [32]byte - ValidatorManagerAddress common.Address - InitialValidators []InitialValidator -} - -// Validator is an auto generated low-level Go binding around an user-defined struct. -type Validator struct { - Status uint8 - NodeID [32]byte - StartingWeight uint64 - MessageNonce uint64 - Weight uint64 - StartedAt uint64 - EndedAt uint64 -} - -// ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. -type ValidatorManagerSettings struct { - PChainBlockchainID [32]byte - SubnetID [32]byte - ChurnPeriodSeconds uint64 - MaximumChurnPercentage uint8 -} - -// ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. -type ValidatorRegistrationInput struct { - NodeID [32]byte - RegistrationExpiry uint64 - BlsPublicKey []byte -} - -// 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615b3d380380615b3d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159f08061014d5f395ff3fe60806040526004361061017b575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f14610492578063c974d1b6146104a5578063d5f20ff6146104b9578063df93d8de146104e5575f80fd5b8063b771b3bc1461043a578063ba3a4b9714610454578063bee0a03f14610473575f80fd5b8063620658561461038b57806366435abf146103aa57806376f78621146103c95780638280a25a146103e857806398f3e2b4146103fc578063a3a65e481461041b575f80fd5b8063329c3e1211610138578063467ef06f11610113578063467ef06f146103055780635297fae61461032457806360305d621461034357806361e2f4901461036c575f80fd5b8063329c3e121461029857806335455ded146102ca57806340034a93146102f2575f80fd5b80630118acc41461017f5780630322ed98146101a05780630cdd0985146101bf578063151d30d11461021c5780631f7a9d8f146102425780632e2194d814610261575b5f80fd5b34801561018a575f80fd5b5061019e610199366004614df0565b6104fb565b005b3480156101ab575f80fd5b5061019e6101ba366004614e2b565b61099e565b3480156101ca575f80fd5b506102096101d9366004614e2b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610227575f80fd5b50610230600a81565b60405160ff9091168152602001610213565b34801561024d575f80fd5b5061019e61025c366004614e42565b610b57565b34801561026c575f80fd5b5061028061027b366004614e2b565b610c34565b6040516001600160401b039091168152602001610213565b3480156102a3575f80fd5b506102b26001600160991b0181565b6040516001600160a01b039091168152602001610213565b3480156102d5575f80fd5b506102df61271081565b60405161ffff9091168152602001610213565b610209610300366004614e80565b610c4a565b348015610310575f80fd5b5061019e61031f366004614ed4565b610c7e565b34801561032f575f80fd5b5061019e61033e366004614eed565b610d1e565b34801561034e575f80fd5b50610357601481565b60405163ffffffff9091168152602001610213565b348015610377575f80fd5b5061019e610386366004614f15565b610ef3565b348015610396575f80fd5b506102096103a5366004614f63565b611527565b3480156103b5575f80fd5b506102806103c4366004614e2b565b611540565b3480156103d4575f80fd5b5061019e6103e3366004614df0565b611554565b3480156103f3575f80fd5b50610230603081565b348015610407575f80fd5b5061019e610416366004614eed565b61174e565b348015610426575f80fd5b5061019e610435366004614ed4565b6119d0565b348015610445575f80fd5b506102b26005600160991b0181565b34801561045f575f80fd5b5061019e61046e366004614e2b565b611b88565b34801561047e575f80fd5b5061019e61048d366004614e2b565b611e0e565b6102096104a0366004614e2b565b611f22565b3480156104b0575f80fd5b50610230601481565b3480156104c4575f80fd5b506104d86104d3366004614e2b565b611f53565b6040516102139190614f90565b3480156104f0575f80fd5b506102806202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615944833981519152949193919290829060ff16600481111561056357610563614f7c565b600481111561057457610574614f7c565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105f083611f53565b905060028251600481111561060757610607614f7c565b146106595760405162461bcd60e51b815260206004820152602a60248201525f805160206159648339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106be5760405162461bcd60e51b815260206004820152603360248201525f805160206159648339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610650565b6003825280515f9060029060058111156106da576106da614f7c565b036107315786156106f2576106ef848761201b565b90505b5f83606001518360800151610707919061505a565b905061071385826122b7565b506001600160401b0390811660e0860152421660a085015250610765565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107988560600151611527565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610815573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610839919061507a565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561087857610878614f7c565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161098c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206159c48339815191526020526040808220815160e0810190925280545f8051602061598483398151915293929190829060ff1660058111156109eb576109eb614f7c565b60058111156109fc576109fc614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a6b57610a6b614f7c565b14610ad05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb610af58584606001515f61240e565b6040518263ffffffff1660e01b8152600401610b1191906150b3565b6020604051808303815f875af1158015610b2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b51919061507a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ba0575080546001600160401b03808416911610155b15610bbe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be883612633565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4464e8d4a51000836150e5565b92915050565b5f610c53612647565b610c5f8484843461267e565b9050610c7760015f805160206159a483398151915255565b9392505050565b5f805160206159448339815191525f80610c97846128fb565b91509150610ca482612c45565b610cae5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610cdc57610cdc614f7c565b03610d01575f83815260088501602052604081208054919055610cff8282612c80565b505b610d1781610d128460400151611527565b612ce6565b5050505050565b5f805160206159448339815191525f610d3684612cf9565b90505f80610d478360400151612ed3565b50915091505f610d5683611f53565b9050816001600160401b031681606001516001600160401b03161015610d8e5760405162461bcd60e51b815260040161065090615104565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dd35760405162461bcd60e51b815260040161065090615146565b60015f87815260068701602052604090205460ff166004811115610df957610df9614f7c565b14610e625760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610650565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206159848339815191529060ff1615610f905760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff7919061507a565b8360200135146110595760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610650565b3061106a60608501604086016151a3565b6001600160a01b0316146110dc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610650565b5f6110ea60608501856151be565b91505f90508435602086013560146111086060890160408a016151a3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611437575f61118860608901896151be565b8363ffffffff1681811061119e5761119e615203565b90506020028101906111b09190615217565b6111b9906152c7565b80515f81815260098901602052604090205491925090156111ec5760405162461bcd60e51b81526004016106509061535e565b84825f01518360200151846040015160405160200161120e94939291906153a6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161125c91906153f5565b602060405180830381855afa158015611277573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061129a919061507a565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561132657611326614f7c565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113d9911686615406565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061143090615419565b905061116c565b50600584018190555f61144986612cf9565b90505f611459826040015161310e565b90508060028560405161146c91906153f5565b602060405180830381855afa158015611487573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114aa919061507a565b1461150e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610650565b505050600a909201805460ff1916600117905550505050565b5f610c446001600160401b03831664e8d4a5100061543b565b5f61154a82611f53565b6080015192915050565b5f805160206159448339815191525f61156c85613277565b5f86815260058401602052604090205460a082015191925061159f91600160b01b9091046001600160401b031690615452565b6001600160401b03168160c001516001600160401b031610156116205760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610650565b8315610d17575f611631868561201b565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061168890611527565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156116fe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611722919061507a565b5f87815260088501602052604081208054909190611741908490615406565b9091555050505050505050565b611756612647565b5f805160206159448339815191525f61176e84612cf9565b90505f8061177f8360400151612ed3565b50915091505f61178e83611f53565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117c8576117c8614f7c565b60048111156117d9576117d9614f7c565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156118785760405162461bcd60e51b815260040161065090615104565b826001600160401b03168160e001516001600160401b031611156118ae5760405162461bcd60e51b815260040161065090615146565b6003815160048111156118c3576118c3614f7c565b146119175760405162461bcd60e51b815260206004820152603160248201525f805160206159648339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610650565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a019092529091205461194d9190612c80565b856007015f8881526020019081526020015f205f90556119788160200151610d128360600151611527565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506119cc60015f805160206159a483398151915255565b5050565b5f805160206159848339815191525f6119e883612cf9565b90505f806119f983604001516134f2565b9150915080611a5b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610650565b5f82815260078501602052604081208054611a7590615472565b9050118015611aa7575060015f83815260088601602052604090205460ff166005811115611aa557611aa5614f7c565b145b611ac35760405162461bcd60e51b8152600401610650906154a4565b5f8281526007850160205260408120611adb91614d45565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061594483398151915293929190829060ff166004811115611be957611be9614f7c565b6004811115611bfa57611bfa614f7c565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611c8157611c81614f7c565b1480611c9f5750600381516004811115611c9d57611c9d614f7c565b145b611cf35760405162461bcd60e51b815260206004820152603260248201525f80516020615964833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610650565b5f611d018260400151611f53565b905080606001516001600160401b03165f03611d855760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb611db284604001518460600151856080015161240e565b6040518263ffffffff1660e01b8152600401611dce91906150b3565b6020604051808303815f875af1158015611dea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d17919061507a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615984833981519152929190611e5690615472565b9050118015611e88575060015f83815260088301602052604090205460ff166005811115611e8657611e86614f7c565b145b611ea45760405162461bcd60e51b8152600401610650906154a4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611edd91906004016154eb565b6020604051808303815f875af1158015611ef9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1d919061507a565b505050565b5f611f2b612647565b611f36823334613693565b9050611f4e60015f805160206159a483398151915255565b919050565b611f5b614d7c565b5f8281525f805160206159c4833981519152602052604090819020815160e0810190925280545f80516020615984833981519152929190829060ff166005811115611fa857611fa8614f7c565b6005811115611fb957611fb9614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612066573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208d9190810190615580565b91509150806120f05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612133573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612157919061507a565b8251146121bb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610650565b60208201516001600160a01b0316156122315760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610650565b5f806122408460400151613a4a565b915091508187146122ad5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610650565b9695505050505050565b5f8281525f805160206159c4833981519152602052604081206002015481905f8051602061598483398151915290600160801b90046001600160401b03166122ff8582613c22565b5f61230987613e30565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123598a858b61240e565b6040518263ffffffff1660e01b815260040161237591906150b3565b6020604051808303815f875af1158015612391573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123b5919061507a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561248757612447816001615652565b61245290600861543b565b5081515f9083908390811061246957612469615203565b60200101906001600160f81b03191690815f1a905350600101612433565b505f5b60048110156124f25761249e816003615652565b6124a990600861543b565b600263ffffffff16901c60f81b828260026124c49190615406565b815181106124d4576124d4615203565b60200101906001600160f81b03191690815f1a90535060010161248a565b505f5b60208110156125545761250981601f615652565b61251490600861543b565b86901c60f81b82612526836006615406565b8151811061253657612536615203565b60200101906001600160f81b03191690815f1a9053506001016124f5565b505f5b60088110156125bf5761256b816007615652565b61257690600861543b565b6001600160401b038616901c60f81b82612591836026615406565b815181106125a1576125a1615203565b60200101906001600160f81b03191690815f1a905350600101612557565b505f5b600881101561262a576125d6816007615652565b6125e190600861543b565b6001600160401b038516901c60f81b826125fc83602e615406565b8151811061260c5761260c615203565b60200101906001600160f81b03191690815f1a9053506001016125c2565b50949350505050565b61263b613ec0565b61264481613f0b565b50565b5f805160206159a483398151915280546001190161267857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206159448339815191529061ffff8616108015906126ca575061271061ffff861611155b6126e65760405162461bcd60e51b815260040161065090615665565b60028101546001600160401b03908116908516101561275f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610650565b80548310156127c25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610650565b80600101548311156128295760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610650565b825f61283482610c34565b90505f6128418983613f7f565b905060405180606001604052806128553390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f805160206159a483398151915255565b5f612904614d7c565b5f805160206159848339815191525f61291c85612cf9565b90505f8061292d83604001516134f2565b9150915080156129925760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610650565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156129c3576129c3614f7c565b60058111156129d4576129d4614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612a4557612a45614f7c565b1480612a635750600182516005811115612a6157612a61614f7c565b145b612ac25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610650565b600382516005811115612ad757612ad7614f7c565b03612ae457506004612ae8565b5060055b6020808301515f90815260098801909152604081205581816005811115612b1157612b11614f7c565b90816005811115612b2457612b24614f7c565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612b5857612b58614f7c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612c0c57612c0c614f7c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ccc575f80fd5b505af1158015612cde573d5f803e3d5ffd5b505050505050565b6119cc6001600160a01b038316826144e4565b60408051606080820183525f8083526020830181905292820152905f805160206159848339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612d6e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612d959190810190615580565b9150915080612df55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610650565b8254825114612e585760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610650565b60208201516001600160a01b031615612ecb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610650565b509392505050565b5f805f8351603614612ef75760405162461bcd60e51b8152600401610650906156b0565b5f805b6002811015612f4657612f0e816001615652565b612f1990600861543b565b61ffff16868281518110612f2f57612f2f615203565b016020015160f81c901b9190911790600101612efa565b5061ffff811615612f695760405162461bcd60e51b8152600401610650906156f9565b5f805b6004811015612fc457612f80816003615652565b612f8b90600861543b565b63ffffffff1687612f9d836002615406565b81518110612fad57612fad615203565b016020015160f81c901b9190911790600101612f6c565b5063ffffffff8116600414612feb5760405162461bcd60e51b81526004016106509061573c565b5f805b60208110156130405761300281601f615652565b61300d90600861543b565b88613019836006615406565b8151811061302957613029615203565b016020015160f81c901b9190911790600101612fee565b505f805b600881101561309f57613058816007615652565b61306390600861543b565b6001600160401b031689613078836026615406565b8151811061308857613088615203565b016020015160f81c901b9190911790600101613044565b505f805b60088110156130fe576130b7816007615652565b6130c290600861543b565b6001600160401b03168a6130d783602e615406565b815181106130e7576130e7615203565b016020015160f81c901b91909117906001016130a3565b5091989097509095509350505050565b5f81516026146131305760405162461bcd60e51b8152600401610650906156b0565b5f805b600281101561317f57613147816001615652565b61315290600861543b565b61ffff1684828151811061316857613168615203565b016020015160f81c901b9190911790600101613133565b5061ffff8116156131a25760405162461bcd60e51b8152600401610650906156f9565b5f805b60048110156131fd576131b9816003615652565b6131c490600861543b565b63ffffffff16856131d6836002615406565b815181106131e6576131e6615203565b016020015160f81c901b91909117906001016131a5565b5063ffffffff8116156132225760405162461bcd60e51b81526004016106509061573c565b5f805b602081101561262a5761323981601f615652565b61324490600861543b565b86613250836006615406565b8151811061326057613260615203565b016020015160f81c901b9190911790600101613225565b61327f614d7c565b5f8281525f805160206159c48339815191526020526040808220815160e0810190925280545f8051602061598483398151915293929190829060ff1660058111156132cc576132cc614f7c565b60058111156132dd576132dd614f7c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561334f5761334f614f7c565b146133ab5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610650565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156133ef576133ef614f7c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61349b85826122b7565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146135155760405162461bcd60e51b8152600401610650906156b0565b5f805b60028110156135645761352c816001615652565b61353790600861543b565b61ffff1685828151811061354d5761354d615203565b016020015160f81c901b9190911790600101613518565b5061ffff8116156135875760405162461bcd60e51b8152600401610650906156f9565b5f805b60048110156135e25761359e816003615652565b6135a990600861543b565b63ffffffff16866135bb836002615406565b815181106135cb576135cb615203565b016020015160f81c901b919091179060010161358a565b5063ffffffff81166003146136095760405162461bcd60e51b81526004016106509061573c565b5f805b602081101561365e5761362081601f615652565b61362b90600861543b565b87613637836006615406565b8151811061364757613647615203565b016020015160f81c901b919091179060010161360c565b505f8660268151811061367357613673615203565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615944833981519152816136ac84610c34565b90505f6136b887611f53565b90506136c387612c45565b6137205760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610650565b60028151600581111561373557613735614f7c565b146137945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610650565b5f8282608001516137a59190615452565b600485015460408401519192506137c7916001600160401b0390911690615783565b6001600160401b0316816001600160401b031611156138465760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610650565b5f806138528a846122b7565b915091505f8a8360405160200161388092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561391b5761391b614f7c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613a6d5760405162461bcd60e51b8152600401610650906156b0565b5f805b6002811015613abc57613a84816001615652565b613a8f90600861543b565b61ffff16858281518110613aa557613aa5615203565b016020015160f81c901b9190911790600101613a70565b5061ffff811615613adf5760405162461bcd60e51b8152600401610650906156f9565b5f805b6004811015613b3a57613af6816003615652565b613b0190600861543b565b63ffffffff1686613b13836002615406565b81518110613b2357613b23615203565b016020015160f81c901b9190911790600101613ae2565b5063ffffffff8116600514613b615760405162461bcd60e51b81526004016106509061573c565b5f805b6020811015613bb657613b7881601f615652565b613b8390600861543b565b87613b8f836006615406565b81518110613b9f57613b9f615203565b016020015160f81c901b9190911790600101613b64565b505f805b6008811015613c1557613bce816007615652565b613bd990600861543b565b6001600160401b031688613bee836026615406565b81518110613bfe57613bfe615203565b016020015160f81c901b9190911790600101613bba565b5090969095509350505050565b5f805160206159848339815191525f6001600160401b038084169085161115613c5657613c4f838561505a565b9050613c63565b613c60848461505a565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613cc5575060028401548151613cc1916001600160401b031690615406565b8210155b15613ceb576001600160401b038316606082015281815260408101516020820152613d0a565b8281606001818151613cfd9190615452565b6001600160401b03169052505b6060810151613d1a906064615783565b602082015160028601546001600160401b039290921691613d459190600160401b900460ff1661543b565b1015613da95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610650565b856001600160401b031681604001818151613dc49190615406565b9052506040810180516001600160401b0387169190613de4908390615652565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206159c48339815191526020526040812060020180545f8051602061598483398151915291600160401b9091046001600160401b0316906008613e7a836157ae565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f0957604051631afcd79f60e31b815260040160405180910390fd5b565b613f13613ec0565b613f1c81614577565b613f24614590565b612644608082013560a0830135613f4160e0850160c08601614f63565b613f52610100860160e087016157c9565b61ffff16613f68610120870161010088016157e2565b613f7a610140880161012089016151a3565b6145a0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661400a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610650565b5f80516020615984833981519152426140296040860160208701614f63565b6001600160401b03161161409b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610650565b6140ab6040850160208601614f63565b6001600160401b03166140c16202a30042615406565b116141345760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610650565b833561418c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610650565b83355f908152600982016020526040902054156141bb5760405162461bcd60e51b81526004016106509061535e565b60306141ca6040860186615802565b90501461422f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610650565b614239835f613c22565b5f806142d36040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061427e9190614f63565b6001600160401b0316815260200161429960408a018a615802565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506147e4565b5f828152600786016020526040902091935091506142f18282615888565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061431e9085906004016150b3565b6020604051808303815f875af115801561433a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061435e919061507a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156143d6576143d6614f7c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916144b6918e01908e01614f63565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145075760405163cd78605960e01b8152306004820152602401610650565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614550576040519150601f19603f3d011682016040523d82523d5f602084013e614555565b606091505b5050905080611f1d57604051630a12f52160e11b815260040160405180910390fd5b61457f613ec0565b614587614b93565b61264481614b9b565b614598613ec0565b613f09614d3d565b6145a8613ec0565b5f80516020615944833981519152836146145760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610650565b6127108411156146365760405162461bcd60e51b815260040161065090615665565b8587111561469e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610650565b5f8360ff161161470b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610650565b600a60ff8416111561477d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610650565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461484e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610650565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156148c557614885816001615652565b61489090600861543b565b5081515f908390839081106148a7576148a7615203565b60200101906001600160f81b03191690815f1a905350600101614871565b505f5b600481101561492d576148dc816003615652565b6148e790600861543b565b600160ff919091161c60f81b826148ff836002615406565b8151811061490f5761490f615203565b60200101906001600160f81b03191690815f1a9053506001016148c8565b505f5b602081101561498a578451816020811061494c5761494c615203565b1a60f81b8261495c836006615406565b8151811061496c5761496c615203565b60200101906001600160f81b03191690815f1a905350600101614930565b505f5b60208110156149ea57846020015181602081106149ac576149ac615203565b1a60f81b826149bc836026615406565b815181106149cc576149cc615203565b60200101906001600160f81b03191690815f1a90535060010161498d565b505f5b6008811015614a5e57614a01816007615652565b614a0c90600861543b565b60ff1685604001516001600160401b0316901c60f81b82826046614a309190615406565b81518110614a4057614a40615203565b60200101906001600160f81b03191690815f1a9053506001016149ed565b505f5b6030811015614ac95784608001518181518110614a8057614a80615203565b01602001516001600160f81b03191682614a9b83604e615406565b81518110614aab57614aab615203565b60200101906001600160f81b03191690815f1a905350600101614a61565b505f5b6008811015614b3b57614ae0816007615652565b614aeb90600861543b565b60608601516001600160401b0390811691161c60f81b82614b0d83607e615406565b81518110614b1d57614b1d615203565b60200101906001600160f81b03191690815f1a905350600101614acc565b50600281604051614b4c91906153f5565b602060405180830381855afa158015614b67573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614b8a919061507a565b94909350915050565b613f09613ec0565b614ba3613ec0565b80355f8051602061598483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614bef60808401606085016157e2565b60ff161115614c5c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610650565b5f614c6d60808401606085016157e2565b60ff1611614cd55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610650565b614ce560808301606084016157e2565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d166060830160408401614f63565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6128e8613ec0565b508054614d5190615472565b5f825580601f10614d60575050565b601f0160209004905f5260205f20908101906126449190614db8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614dcc575f8155600101614db9565b5090565b8015158114612644575f80fd5b803563ffffffff81168114611f4e575f80fd5b5f805f60608486031215614e02575f80fd5b833592506020840135614e1481614dd0565b9150614e2260408501614ddd565b90509250925092565b5f60208284031215614e3b575f80fd5b5035919050565b5f6101408284031215614e53575f80fd5b50919050565b803561ffff81168114611f4e575f80fd5b80356001600160401b0381168114611f4e575f80fd5b5f805f60608486031215614e92575f80fd5b83356001600160401b03811115614ea7575f80fd5b840160608187031215614eb8575f80fd5b9250614ec660208501614e59565b9150614e2260408501614e6a565b5f60208284031215614ee4575f80fd5b610c7782614ddd565b5f8060408385031215614efe575f80fd5b614f0783614ddd565b946020939093013593505050565b5f8060408385031215614f26575f80fd5b82356001600160401b03811115614f3b575f80fd5b830160808186031215614f4c575f80fd5b9150614f5a60208401614ddd565b90509250929050565b5f60208284031215614f73575f80fd5b610c7782614e6a565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614fb357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614fee60608401826001600160401b03169052565b50608083015161500960808401826001600160401b03169052565b5060a083015161502460a08401826001600160401b03169052565b5060c083015161503f60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561503f5761503f615046565b5f6020828403121561508a575f80fd5b5051919050565b5f5b838110156150ab578181015183820152602001615093565b50505f910152565b602081525f82518060208401526150d1816040850160208701615091565b601f01601f19169190910160400192915050565b5f826150ff57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612644575f80fd5b5f602082840312156151b3575f80fd5b8135610c778161518f565b5f808335601e198436030181126151d3575f80fd5b8301803591506001600160401b038211156151ec575f80fd5b6020019150600581901b3603821315612407575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261522b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561526b5761526b615235565b60405290565b604051601f8201601f191681016001600160401b038111828210171561529957615299615235565b604052919050565b5f6001600160401b038211156152b9576152b9615235565b50601f01601f191660200190565b5f606082360312156152d7575f80fd5b6152df615249565b8235815260206152f0818501614e6a565b8183015260408401356001600160401b0381111561530c575f80fd5b840136601f82011261531c575f80fd5b803561532f61532a826152a1565b615271565b8181523684838501011115615342575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516153b7818460208a01615091565b80830190508581526001600160401b0360c01b8560c01b16602082015283516153e7816028840160208801615091565b016028019695505050505050565b5f825161522b818460208701615091565b80820180821115610c4457610c44615046565b5f63ffffffff80831681810361543157615431615046565b6001019392505050565b8082028115828204841417610c4457610c44615046565b6001600160401b0381811683821601908082111561503f5761503f615046565b600181811c9082168061548657607f821691505b602082108103614e5357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546154fd81615472565b806020870152604060018084165f811461551e576001811461553a57615567565b60ff19851660408a0152604084151560051b8a01019550615567565b895f5260205f205f5b8581101561555e5781548b8201860152908301908801615543565b8a016040019650505b509398975050505050505050565b8051611f4e81614dd0565b5f8060408385031215615591575f80fd5b82516001600160401b03808211156155a7575f80fd5b90840190606082870312156155ba575f80fd5b6155c2615249565b825181526020808401516155d58161518f565b828201526040840151838111156155ea575f80fd5b80850194505087601f8501126155fe575f80fd5b8351925061560e61532a846152a1565b8381528882858701011115615621575f80fd5b61563084838301848801615091565b80604084015250819550615645818801615575565b9450505050509250929050565b81810381811115610c4457610c44615046565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146157a6576157a6615046565b505092915050565b5f6001600160401b0380831681810361543157615431615046565b5f602082840312156157d9575f80fd5b610c7782614e59565b5f602082840312156157f2575f80fd5b813560ff81168114610c77575f80fd5b5f808335601e19843603018112615817575f80fd5b8301803591506001600160401b03821115615830575f80fd5b602001915036819003821315612407575f80fd5b601f821115611f1d57805f5260205f20601f840160051c810160208510156158695750805b601f840160051c820191505b81811015610d17575f8155600101615875565b81516001600160401b038111156158a1576158a1615235565b6158b5816158af8454615472565b84615844565b602080601f8311600181146158e8575f84156158d15750858301515b5f19600386901b1c1916600185901b178555612cde565b5f85815260208120601f198616915b82811015615916578886015182559484019460019091019084016158f7565b508582101561593357878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", -} - -// NativeTokenStakingManagerABI is the input ABI used to generate the binding from. -// Deprecated: Use NativeTokenStakingManagerMetaData.ABI instead. -var NativeTokenStakingManagerABI = NativeTokenStakingManagerMetaData.ABI - -// NativeTokenStakingManagerBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use NativeTokenStakingManagerMetaData.Bin instead. -var NativeTokenStakingManagerBin = NativeTokenStakingManagerMetaData.Bin - -// DeployNativeTokenStakingManager deploys a new Ethereum contract, binding an instance of NativeTokenStakingManager to it. -func DeployNativeTokenStakingManager(auth *bind.TransactOpts, backend bind.ContractBackend, init uint8) (common.Address, *types.Transaction, *NativeTokenStakingManager, error) { - parsed, err := NativeTokenStakingManagerMetaData.GetAbi() - if err != nil { - return common.Address{}, nil, nil, err - } - if parsed == nil { - return common.Address{}, nil, nil, errors.New("GetABI returned nil") - } - - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(NativeTokenStakingManagerBin), backend, init) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &NativeTokenStakingManager{NativeTokenStakingManagerCaller: NativeTokenStakingManagerCaller{contract: contract}, NativeTokenStakingManagerTransactor: NativeTokenStakingManagerTransactor{contract: contract}, NativeTokenStakingManagerFilterer: NativeTokenStakingManagerFilterer{contract: contract}}, nil -} - -// NativeTokenStakingManager is an auto generated Go binding around an Ethereum contract. -type NativeTokenStakingManager struct { - NativeTokenStakingManagerCaller // Read-only binding to the contract - NativeTokenStakingManagerTransactor // Write-only binding to the contract - NativeTokenStakingManagerFilterer // Log filterer for contract events -} - -// NativeTokenStakingManagerCaller is an auto generated read-only Go binding around an Ethereum contract. -type NativeTokenStakingManagerCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// NativeTokenStakingManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. -type NativeTokenStakingManagerTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// NativeTokenStakingManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type NativeTokenStakingManagerFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// NativeTokenStakingManagerSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type NativeTokenStakingManagerSession struct { - Contract *NativeTokenStakingManager // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// NativeTokenStakingManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type NativeTokenStakingManagerCallerSession struct { - Contract *NativeTokenStakingManagerCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// NativeTokenStakingManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type NativeTokenStakingManagerTransactorSession struct { - Contract *NativeTokenStakingManagerTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// NativeTokenStakingManagerRaw is an auto generated low-level Go binding around an Ethereum contract. -type NativeTokenStakingManagerRaw struct { - Contract *NativeTokenStakingManager // Generic contract binding to access the raw methods on -} - -// NativeTokenStakingManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type NativeTokenStakingManagerCallerRaw struct { - Contract *NativeTokenStakingManagerCaller // Generic read-only contract binding to access the raw methods on -} - -// NativeTokenStakingManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type NativeTokenStakingManagerTransactorRaw struct { - Contract *NativeTokenStakingManagerTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewNativeTokenStakingManager creates a new instance of NativeTokenStakingManager, bound to a specific deployed contract. -func NewNativeTokenStakingManager(address common.Address, backend bind.ContractBackend) (*NativeTokenStakingManager, error) { - contract, err := bindNativeTokenStakingManager(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &NativeTokenStakingManager{NativeTokenStakingManagerCaller: NativeTokenStakingManagerCaller{contract: contract}, NativeTokenStakingManagerTransactor: NativeTokenStakingManagerTransactor{contract: contract}, NativeTokenStakingManagerFilterer: NativeTokenStakingManagerFilterer{contract: contract}}, nil -} - -// NewNativeTokenStakingManagerCaller creates a new read-only instance of NativeTokenStakingManager, bound to a specific deployed contract. -func NewNativeTokenStakingManagerCaller(address common.Address, caller bind.ContractCaller) (*NativeTokenStakingManagerCaller, error) { - contract, err := bindNativeTokenStakingManager(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerCaller{contract: contract}, nil -} - -// NewNativeTokenStakingManagerTransactor creates a new write-only instance of NativeTokenStakingManager, bound to a specific deployed contract. -func NewNativeTokenStakingManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*NativeTokenStakingManagerTransactor, error) { - contract, err := bindNativeTokenStakingManager(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerTransactor{contract: contract}, nil -} - -// NewNativeTokenStakingManagerFilterer creates a new log filterer instance of NativeTokenStakingManager, bound to a specific deployed contract. -func NewNativeTokenStakingManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*NativeTokenStakingManagerFilterer, error) { - contract, err := bindNativeTokenStakingManager(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerFilterer{contract: contract}, nil -} - -// bindNativeTokenStakingManager binds a generic wrapper to an already deployed contract. -func bindNativeTokenStakingManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := NativeTokenStakingManagerMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_NativeTokenStakingManager *NativeTokenStakingManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _NativeTokenStakingManager.Contract.NativeTokenStakingManagerCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_NativeTokenStakingManager *NativeTokenStakingManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.NativeTokenStakingManagerTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_NativeTokenStakingManager *NativeTokenStakingManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.NativeTokenStakingManagerTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _NativeTokenStakingManager.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.contract.Transact(opts, method, params...) -} - -// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. -// -// Solidity: function ADDRESS_LENGTH() view returns(uint32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) ADDRESSLENGTH(opts *bind.CallOpts) (uint32, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "ADDRESS_LENGTH") - - if err != nil { - return *new(uint32), err - } - - out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) - - return out0, err - -} - -// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. -// -// Solidity: function ADDRESS_LENGTH() view returns(uint32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ADDRESSLENGTH() (uint32, error) { - return _NativeTokenStakingManager.Contract.ADDRESSLENGTH(&_NativeTokenStakingManager.CallOpts) -} - -// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. -// -// Solidity: function ADDRESS_LENGTH() view returns(uint32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) ADDRESSLENGTH() (uint32, error) { - return _NativeTokenStakingManager.Contract.ADDRESSLENGTH(&_NativeTokenStakingManager.CallOpts) -} - -// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. -// -// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) BLSPUBLICKEYLENGTH(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "BLS_PUBLIC_KEY_LENGTH") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. -// -// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) BLSPUBLICKEYLENGTH() (uint8, error) { - return _NativeTokenStakingManager.Contract.BLSPUBLICKEYLENGTH(&_NativeTokenStakingManager.CallOpts) -} - -// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. -// -// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) BLSPUBLICKEYLENGTH() (uint8, error) { - return _NativeTokenStakingManager.Contract.BLSPUBLICKEYLENGTH(&_NativeTokenStakingManager.CallOpts) -} - -// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. -// -// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMCHURNPERCENTAGELIMIT(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_CHURN_PERCENTAGE_LIMIT") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. -// -// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { - return _NativeTokenStakingManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_NativeTokenStakingManager.CallOpts) -} - -// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. -// -// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { - return _NativeTokenStakingManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_NativeTokenStakingManager.CallOpts) -} - -// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. -// -// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMDELEGATIONFEEBIPS(opts *bind.CallOpts) (uint16, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_DELEGATION_FEE_BIPS") - - if err != nil { - return *new(uint16), err - } - - out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) - - return out0, err - -} - -// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. -// -// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMDELEGATIONFEEBIPS() (uint16, error) { - return _NativeTokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_NativeTokenStakingManager.CallOpts) -} - -// MAXIMUMDELEGATIONFEEBIPS is a free data retrieval call binding the contract method 0x35455ded. -// -// Solidity: function MAXIMUM_DELEGATION_FEE_BIPS() view returns(uint16) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMDELEGATIONFEEBIPS() (uint16, error) { - return _NativeTokenStakingManager.Contract.MAXIMUMDELEGATIONFEEBIPS(&_NativeTokenStakingManager.CallOpts) -} - -// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. -// -// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMREGISTRATIONEXPIRYLENGTH(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_REGISTRATION_EXPIRY_LENGTH") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. -// -// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { - return _NativeTokenStakingManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_NativeTokenStakingManager.CallOpts) -} - -// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. -// -// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { - return _NativeTokenStakingManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_NativeTokenStakingManager.CallOpts) -} - -// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. -// -// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) MAXIMUMSTAKEMULTIPLIERLIMIT(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "MAXIMUM_STAKE_MULTIPLIER_LIMIT") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. -// -// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) MAXIMUMSTAKEMULTIPLIERLIMIT() (uint8, error) { - return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) -} - -// MAXIMUMSTAKEMULTIPLIERLIMIT is a free data retrieval call binding the contract method 0x151d30d1. -// -// Solidity: function MAXIMUM_STAKE_MULTIPLIER_LIMIT() view returns(uint8) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMUMSTAKEMULTIPLIERLIMIT() (uint8, error) { - return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) -} - -// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. -// -// Solidity: function NATIVE_MINTER() view returns(address) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) NATIVEMINTER(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "NATIVE_MINTER") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. -// -// Solidity: function NATIVE_MINTER() view returns(address) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) NATIVEMINTER() (common.Address, error) { - return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) -} - -// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. -// -// Solidity: function NATIVE_MINTER() view returns(address) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) NATIVEMINTER() (common.Address, error) { - return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) -} - -// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. -// -// Solidity: function WARP_MESSENGER() view returns(address) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) WARPMESSENGER(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "WARP_MESSENGER") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. -// -// Solidity: function WARP_MESSENGER() view returns(address) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) WARPMESSENGER() (common.Address, error) { - return _NativeTokenStakingManager.Contract.WARPMESSENGER(&_NativeTokenStakingManager.CallOpts) -} - -// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. -// -// Solidity: function WARP_MESSENGER() view returns(address) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) WARPMESSENGER() (common.Address, error) { - return _NativeTokenStakingManager.Contract.WARPMESSENGER(&_NativeTokenStakingManager.CallOpts) -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) ActiveValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "activeValidators", nodeID) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { - return _NativeTokenStakingManager.Contract.ActiveValidators(&_NativeTokenStakingManager.CallOpts, nodeID) -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { - return _NativeTokenStakingManager.Contract.ActiveValidators(&_NativeTokenStakingManager.CallOpts, nodeID) -} - -// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. -// -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "getValidator", validationID) - - if err != nil { - return *new(Validator), err - } - - out0 := *abi.ConvertType(out[0], new(Validator)).(*Validator) - - return out0, err - -} - -// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. -// -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) GetValidator(validationID [32]byte) (Validator, error) { - return _NativeTokenStakingManager.Contract.GetValidator(&_NativeTokenStakingManager.CallOpts, validationID) -} - -// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. -// -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { - return _NativeTokenStakingManager.Contract.GetValidator(&_NativeTokenStakingManager.CallOpts, validationID) -} - -// GetWeight is a free data retrieval call binding the contract method 0x66435abf. -// -// Solidity: function getWeight(bytes32 validationID) view returns(uint64) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetWeight(opts *bind.CallOpts, validationID [32]byte) (uint64, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "getWeight", validationID) - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// GetWeight is a free data retrieval call binding the contract method 0x66435abf. -// -// Solidity: function getWeight(bytes32 validationID) view returns(uint64) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) GetWeight(validationID [32]byte) (uint64, error) { - return _NativeTokenStakingManager.Contract.GetWeight(&_NativeTokenStakingManager.CallOpts, validationID) -} - -// GetWeight is a free data retrieval call binding the contract method 0x66435abf. -// -// Solidity: function getWeight(bytes32 validationID) view returns(uint64) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) GetWeight(validationID [32]byte) (uint64, error) { - return _NativeTokenStakingManager.Contract.GetWeight(&_NativeTokenStakingManager.CallOpts, validationID) -} - -// ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. -// -// Solidity: function valueToWeight(uint256 value) pure 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) - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. -// -// Solidity: function valueToWeight(uint256 value) pure 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) -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) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) WeightToValue(opts *bind.CallOpts, weight uint64) (*big.Int, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "weightToValue", weight) - - if err != nil { - return *new(*big.Int), err - } - - out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) - - return out0, err - -} - -// WeightToValue is a free data retrieval call binding the contract method 0x62065856. -// -// Solidity: function weightToValue(uint64 weight) pure 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) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) WeightToValue(weight uint64) (*big.Int, error) { - return _NativeTokenStakingManager.Contract.WeightToValue(&_NativeTokenStakingManager.CallOpts, weight) -} - -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. -// -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteDelegatorRegistration(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "completeDelegatorRegistration", messageIndex, delegationID) -} - -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. -// -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) -} - -// CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. -// -// Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteDelegatorRegistration(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) -} - -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. -// -// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndDelegation(opts *bind.TransactOpts, messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "completeEndDelegation", messageIndex, delegationID) -} - -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. -// -// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) -} - -// CompleteEndDelegation is a paid mutator transaction binding the contract method 0x98f3e2b4. -// -// Solidity: function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndDelegation(messageIndex uint32, delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteEndDelegation(&_NativeTokenStakingManager.TransactOpts, messageIndex, delegationID) -} - -// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. -// -// Solidity: function completeEndValidation(uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "completeEndValidation", messageIndex) -} - -// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. -// -// Solidity: function completeEndValidation(uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteEndValidation(&_NativeTokenStakingManager.TransactOpts, messageIndex) -} - -// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. -// -// Solidity: function completeEndValidation(uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteEndValidation(&_NativeTokenStakingManager.TransactOpts, messageIndex) -} - -// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. -// -// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) CompleteValidatorRegistration(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "completeValidatorRegistration", messageIndex) -} - -// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. -// -// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) -} - -// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. -// -// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) -} - -// Initialize is a paid mutator transaction binding the contract method 0x1f7a9d8f. -// -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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 0x1f7a9d8f. -// -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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 0x1f7a9d8f. -// -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) -} - -// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. -// -// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeDelegatorRegistration(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeDelegatorRegistration", validationID) -} - -// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. -// -// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeDelegatorRegistration(validationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID) -} - -// InitializeDelegatorRegistration is a paid mutator transaction binding the contract method 0xc599e24f. -// -// Solidity: function initializeDelegatorRegistration(bytes32 validationID) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeDelegatorRegistration(validationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeDelegatorRegistration(&_NativeTokenStakingManager.TransactOpts, validationID) -} - -// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. -// -// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeEndDelegation", delegationID, includeUptimeProof, messageIndex) -} - -// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. -// -// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) -} - -// InitializeEndDelegation is a paid mutator transaction binding the contract method 0x0118acc4. -// -// Solidity: function initializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) -} - -// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. -// -// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeEndValidation", validationID, includeUptimeProof, messageIndex) -} - -// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. -// -// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) -} - -// InitializeEndValidation is a paid mutator transaction binding the contract method 0x76f78621. -// -// Solidity: function initializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) -} - -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. -// -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, delegationFeeBips, minStakeDuration) -} - -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. -// -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration) -} - -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. -// -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration) -} - -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. -// -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) -} - -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. -// -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorSet(&_NativeTokenStakingManager.TransactOpts, subnetConversionData, messageIndex) -} - -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. -// -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.InitializeValidatorSet(&_NativeTokenStakingManager.TransactOpts, subnetConversionData, messageIndex) -} - -// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. -// -// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendEndValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "resendEndValidatorMessage", validationID) -} - -// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. -// -// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendEndValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) -} - -// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. -// -// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendEndValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) -} - -// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. -// -// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendRegisterValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "resendRegisterValidatorMessage", validationID) -} - -// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. -// -// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendRegisterValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) -} - -// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. -// -// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendRegisterValidatorMessage(&_NativeTokenStakingManager.TransactOpts, validationID) -} - -// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. -// -// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ResendUpdateDelegation(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "resendUpdateDelegation", delegationID) -} - -// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. -// -// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendUpdateDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) -} - -// ResendUpdateDelegation is a paid mutator transaction binding the contract method 0xba3a4b97. -// -// Solidity: function resendUpdateDelegation(bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ResendUpdateDelegation(delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.ResendUpdateDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) -} - -// NativeTokenStakingManagerDelegationEndedIterator is returned from FilterDelegationEnded and is used to iterate over the raw logs and unpacked data for DelegationEnded events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerDelegationEndedIterator struct { - Event *NativeTokenStakingManagerDelegationEnded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerDelegationEndedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerDelegationEnded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerDelegationEnded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerDelegationEndedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerDelegationEndedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerDelegationEnded represents a DelegationEnded event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerDelegationEnded struct { - DelegationID [32]byte - ValidationID [32]byte - Nonce uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. -// -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerDelegationEndedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil -} - -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. -// -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerDelegationEnded) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. -// -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { - event := new(NativeTokenStakingManagerDelegationEnded) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// NativeTokenStakingManagerDelegatorAddedIterator is returned from FilterDelegatorAdded and is used to iterate over the raw logs and unpacked data for DelegatorAdded events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerDelegatorAddedIterator struct { - Event *NativeTokenStakingManagerDelegatorAdded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerDelegatorAddedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerDelegatorAdded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerDelegatorAdded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerDelegatorAddedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerDelegatorAddedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerDelegatorAdded represents a DelegatorAdded event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerDelegatorAdded struct { - DelegationID [32]byte - ValidationID [32]byte - DelegatorAddress common.Address - Nonce uint64 - ValidatorWeight uint64 - DelegatorWeight uint64 - SetWeightMessageID [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDelegatorAdded is a free log retrieval operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. -// -// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorAdded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (*NativeTokenStakingManagerDelegatorAddedIterator, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var delegatorAddressRule []interface{} - for _, delegatorAddressItem := range delegatorAddress { - delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerDelegatorAddedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorAdded", logs: logs, sub: sub}, nil -} - -// WatchDelegatorAdded is a free log subscription operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. -// -// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorAdded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorAdded, delegationID [][32]byte, validationID [][32]byte, delegatorAddress []common.Address) (event.Subscription, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var delegatorAddressRule []interface{} - for _, delegatorAddressItem := range delegatorAddress { - delegatorAddressRule = append(delegatorAddressRule, delegatorAddressItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorAdded", delegationIDRule, validationIDRule, delegatorAddressRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerDelegatorAdded) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDelegatorAdded is a log parse operation binding the contract event 0xb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426. -// -// Solidity: event DelegatorAdded(bytes32 indexed delegationID, bytes32 indexed validationID, address indexed delegatorAddress, uint64 nonce, uint64 validatorWeight, uint64 delegatorWeight, bytes32 setWeightMessageID) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorAdded(log types.Log) (*NativeTokenStakingManagerDelegatorAdded, error) { - event := new(NativeTokenStakingManagerDelegatorAdded) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorAdded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// NativeTokenStakingManagerDelegatorRegisteredIterator is returned from FilterDelegatorRegistered and is used to iterate over the raw logs and unpacked data for DelegatorRegistered events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerDelegatorRegisteredIterator struct { - Event *NativeTokenStakingManagerDelegatorRegistered // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerDelegatorRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerDelegatorRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerDelegatorRegistered represents a DelegatorRegistered event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerDelegatorRegistered struct { - DelegationID [32]byte - ValidationID [32]byte - Nonce uint64 - StartTime *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. -// -// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerDelegatorRegisteredIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil -} - -// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. -// -// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerDelegatorRegistered) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. -// -// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*NativeTokenStakingManagerDelegatorRegistered, error) { - event := new(NativeTokenStakingManagerDelegatorRegistered) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// NativeTokenStakingManagerDelegatorRemovalInitializedIterator is returned from FilterDelegatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for DelegatorRemovalInitialized events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerDelegatorRemovalInitializedIterator struct { - Event *NativeTokenStakingManagerDelegatorRemovalInitialized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerDelegatorRemovalInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerDelegatorRemovalInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerDelegatorRemovalInitialized represents a DelegatorRemovalInitialized event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerDelegatorRemovalInitialized struct { - DelegationID [32]byte - ValidationID [32]byte - EndTime *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. -// -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerDelegatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil -} - -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. -// -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { - - var delegationIDRule []interface{} - for _, delegationIDItem := range delegationID { - delegationIDRule = append(delegationIDRule, delegationIDItem) - } - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRemovalInitialized", delegationIDRule, validationIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. -// -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerDelegatorRemovalInitialized, error) { - event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// NativeTokenStakingManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerInitialValidatorCreatedIterator struct { - Event *NativeTokenStakingManagerInitialValidatorCreated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerInitialValidatorCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerInitialValidatorCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerInitialValidatorCreated struct { - ValidationID [32]byte - NodeID [32]byte - Weight *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. -// -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*NativeTokenStakingManagerInitialValidatorCreatedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nodeIDRule []interface{} - for _, nodeIDItem := range nodeID { - nodeIDRule = append(nodeIDRule, nodeIDItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerInitialValidatorCreatedIterator{contract: _NativeTokenStakingManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil -} - -// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. -// -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nodeIDRule []interface{} - for _, nodeIDItem := range nodeID { - nodeIDRule = append(nodeIDRule, nodeIDItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerInitialValidatorCreated) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. -// -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*NativeTokenStakingManagerInitialValidatorCreated, error) { - event := new(NativeTokenStakingManagerInitialValidatorCreated) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// NativeTokenStakingManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerInitializedIterator struct { - Event *NativeTokenStakingManagerInitialized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerInitializedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerInitialized represents a Initialized event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerInitialized struct { - Version uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. -// -// Solidity: event Initialized(uint64 version) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*NativeTokenStakingManagerInitializedIterator, error) { - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "Initialized", logs: logs, sub: sub}, nil -} - -// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. -// -// Solidity: event Initialized(uint64 version) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerInitialized) (event.Subscription, error) { - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerInitialized) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "Initialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. -// -// Solidity: event Initialized(uint64 version) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseInitialized(log types.Log) (*NativeTokenStakingManagerInitialized, error) { - event := new(NativeTokenStakingManagerInitialized) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "Initialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// NativeTokenStakingManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerValidationPeriodCreatedIterator struct { - Event *NativeTokenStakingManagerValidationPeriodCreated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerValidationPeriodCreatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerValidationPeriodCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerValidationPeriodCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerValidationPeriodCreatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerValidationPeriodCreatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerValidationPeriodCreated struct { - ValidationID [32]byte - NodeID [32]byte - RegisterValidationMessageID [32]byte - Weight *big.Int - RegistrationExpiry uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. -// -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (*NativeTokenStakingManagerValidationPeriodCreatedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nodeIDRule []interface{} - for _, nodeIDItem := range nodeID { - nodeIDRule = append(nodeIDRule, nodeIDItem) - } - var registerValidationMessageIDRule []interface{} - for _, registerValidationMessageIDItem := range registerValidationMessageID { - registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerValidationPeriodCreatedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil -} - -// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. -// -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nodeIDRule []interface{} - for _, nodeIDItem := range nodeID { - nodeIDRule = append(nodeIDRule, nodeIDItem) - } - var registerValidationMessageIDRule []interface{} - for _, registerValidationMessageIDItem := range registerValidationMessageID { - registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerValidationPeriodCreated) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidationPeriodCreated is a log parse operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. -// -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*NativeTokenStakingManagerValidationPeriodCreated, error) { - event := new(NativeTokenStakingManagerValidationPeriodCreated) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// NativeTokenStakingManagerValidationPeriodEndedIterator is returned from FilterValidationPeriodEnded and is used to iterate over the raw logs and unpacked data for ValidationPeriodEnded events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerValidationPeriodEndedIterator struct { - Event *NativeTokenStakingManagerValidationPeriodEnded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerValidationPeriodEndedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerValidationPeriodEnded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerValidationPeriodEnded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerValidationPeriodEndedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerValidationPeriodEndedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerValidationPeriodEnded struct { - ValidationID [32]byte - Status uint8 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. -// -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte, status []uint8) (*NativeTokenStakingManagerValidationPeriodEndedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var statusRule []interface{} - for _, statusItem := range status { - statusRule = append(statusRule, statusItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerValidationPeriodEndedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil -} - -// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. -// -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodEnded, validationID [][32]byte, status []uint8) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var statusRule []interface{} - for _, statusItem := range status { - statusRule = append(statusRule, statusItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerValidationPeriodEnded) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. -// -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*NativeTokenStakingManagerValidationPeriodEnded, error) { - event := new(NativeTokenStakingManagerValidationPeriodEnded) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// NativeTokenStakingManagerValidationPeriodRegisteredIterator is returned from FilterValidationPeriodRegistered and is used to iterate over the raw logs and unpacked data for ValidationPeriodRegistered events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerValidationPeriodRegisteredIterator struct { - Event *NativeTokenStakingManagerValidationPeriodRegistered // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerValidationPeriodRegisteredIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerValidationPeriodRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerValidationPeriodRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerValidationPeriodRegisteredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerValidationPeriodRegisteredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerValidationPeriodRegistered struct { - ValidationID [32]byte - Weight *big.Int - Timestamp *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. -// -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*NativeTokenStakingManagerValidationPeriodRegisteredIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidationPeriodRegistered", validationIDRule) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerValidationPeriodRegisteredIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil -} - -// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. -// -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidationPeriodRegistered", validationIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerValidationPeriodRegistered) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. -// -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*NativeTokenStakingManagerValidationPeriodRegistered, error) { - event := new(NativeTokenStakingManagerValidationPeriodRegistered) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// NativeTokenStakingManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerValidatorRemovalInitializedIterator struct { - Event *NativeTokenStakingManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerValidatorRemovalInitializedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerValidatorRemovalInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerValidatorRemovalInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerValidatorRemovalInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerValidatorRemovalInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerValidatorRemovalInitialized represents a ValidatorRemovalInitialized event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerValidatorRemovalInitialized struct { - ValidationID [32]byte - SetWeightMessageID [32]byte - Weight *big.Int - EndTime *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. -// -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*NativeTokenStakingManagerValidatorRemovalInitializedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerValidatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil -} - -// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. -// -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerValidatorRemovalInitialized) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. -// -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerValidatorRemovalInitialized, error) { - event := new(NativeTokenStakingManagerValidatorRemovalInitialized) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// NativeTokenStakingManagerValidatorWeightUpdateIterator is returned from FilterValidatorWeightUpdate and is used to iterate over the raw logs and unpacked data for ValidatorWeightUpdate events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerValidatorWeightUpdateIterator struct { - Event *NativeTokenStakingManagerValidatorWeightUpdate // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerValidatorWeightUpdateIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerValidatorWeightUpdate) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerValidatorWeightUpdate) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerValidatorWeightUpdateIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerValidatorWeightUpdateIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerValidatorWeightUpdate represents a ValidatorWeightUpdate event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerValidatorWeightUpdate struct { - ValidationID [32]byte - Nonce uint64 - ValidatorWeight uint64 - SetWeightMessageID [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. -// -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerValidatorWeightUpdateIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerValidatorWeightUpdateIterator{contract: _NativeTokenStakingManager.contract, event: "ValidatorWeightUpdate", logs: logs, sub: sub}, nil -} - -// WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. -// -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerValidatorWeightUpdate) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. -// -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*NativeTokenStakingManagerValidatorWeightUpdate, error) { - event := new(NativeTokenStakingManagerValidatorWeightUpdate) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go deleted file mode 100644 index 2dbe9c8fa..000000000 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ /dev/null @@ -1,1947 +0,0 @@ -// Code generated - DO NOT EDIT. -// This file is a generated binding and any manual changes will be lost. - -package poavalidatormanager - -import ( - "errors" - "math/big" - "strings" - - "github.com/ava-labs/subnet-evm/accounts/abi" - "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/subnet-evm/core/types" - "github.com/ava-labs/subnet-evm/interfaces" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/event" -) - -// Reference imports to suppress errors if they are not otherwise used. -var ( - _ = errors.New - _ = big.NewInt - _ = strings.NewReader - _ = interfaces.NotFound - _ = bind.Bind - _ = common.Big1 - _ = types.BloomLookup - _ = event.NewSubscription - _ = abi.ConvertType -) - -// InitialValidator is an auto generated low-level Go binding around an user-defined struct. -type InitialValidator struct { - NodeID [32]byte - Weight uint64 - BlsPublicKey []byte -} - -// SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. -type SubnetConversionData struct { - ConvertSubnetTxID [32]byte - ValidatorManagerBlockchainID [32]byte - ValidatorManagerAddress common.Address - InitialValidators []InitialValidator -} - -// Validator is an auto generated low-level Go binding around an user-defined struct. -type Validator struct { - Status uint8 - NodeID [32]byte - StartingWeight uint64 - MessageNonce uint64 - Weight uint64 - StartedAt uint64 - EndedAt uint64 -} - -// ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. -type ValidatorManagerSettings struct { - PChainBlockchainID [32]byte - SubnetID [32]byte - ChurnPeriodSeconds uint64 - MaximumChurnPercentage uint8 -} - -// ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. -type ValidatorRegistrationInput struct { - NodeID [32]byte - RegistrationExpiry uint64 - BlsPublicKey []byte -} - -// 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161396538038061396583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138188061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e366004612daa565b61030c565b005b610173610143366004612daa565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610133610194366004612dd9565b6104ca565b6101336101a7366004612e1c565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004612e52565b6105e6565b6101ef6101ea366004612daa565b610c1a565b6040516001600160401b03909116815260200161017d565b610133610c2e565b610217603081565b60405160ff909116815260200161017d565b610173610237366004612eb2565b610c41565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e366004612daa565b610c5d565b6101336102a1366004612dd9565b610c72565b6102686005600160991b0181565b6101336102c2366004612daa565b610e2a565b610217601481565b6102e26102dd366004612daa565b610f39565b60405161017d9190612f0b565b6101ef6202a30081565b610133610307366004612fc1565b611001565b5f8181525f805160206137ec8339815191526020526040808220815160e0810190925280545f805160206137cc83398151915293929190829060ff16600581111561035957610359612ef7565b600581111561036a5761036a612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d9612ef7565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f61103e565b6040518263ffffffff1660e01b81526004016104849190613005565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c49190613037565b50505050565b6104d381611263565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b61059787876115ad565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206137cc8339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea9190613037565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d6060850160408601612fc1565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd606085018561304e565b91505f90508435602086013560146107fb6060890160408a01612fc1565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610b2a575f61087b606089018961304e565b8363ffffffff1681811061089157610891613093565b90506020028101906108a391906130a7565b6108ac90613157565b80515f81815260098901602052604090205491925090156108df5760405162461bcd60e51b815260040161043a906131ee565b84825f0151836020015184604001516040516020016109019493929190613236565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161094f9190613285565b602060405180830381855afa15801561096a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061098d9190613037565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610a1957610a19612ef7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610acc9116866132aa565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610b23906132bd565b905061085f565b50600584018190555f610b3c866115c7565b90505f610b4c82604001516117a1565b905080600285604051610b5f9190613285565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190613037565b14610c015760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610c2482610f39565b6080015192915050565b610c3661190a565b610c3f5f611965565b565b5f610c4a61190a565b610c5483836119d5565b90505b92915050565b610c6561190a565b610c6e81611f3a565b5050565b5f805160206137cc8339815191525f610c8a836115c7565b90505f80610c9b83604001516121b5565b9150915080610cfd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610d17906132df565b9050118015610d49575060015f83815260088601602052604090205460ff166005811115610d4757610d47612ef7565b145b610d655760405162461bcd60e51b815260040161043a90613311565b5f8281526007850160205260408120610d7d91612d1f565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206137cc833981519152929190610e72906132df565b9050118015610ea4575060015f83815260088301602052604090205460ff166005811115610ea257610ea2612ef7565b145b610ec05760405162461bcd60e51b815260040161043a90613311565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610ef99190600401613358565b6020604051808303815f875af1158015610f15573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d39190613037565b610f41612d56565b5f8281525f805160206137ec833981519152602052604090819020815160e0810190925280545f805160206137cc833981519152929190829060ff166005811115610f8e57610f8e612ef7565b6005811115610f9f57610f9f612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b61100961190a565b6001600160a01b03811661103257604051631e4fbdf760e01b81525f600482015260240161043a565b61103b81611965565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110b7576110778160016133e2565b6110829060086133f5565b5081515f9083908390811061109957611099613093565b60200101906001600160f81b03191690815f1a905350600101611063565b505f5b6004811015611122576110ce8160036133e2565b6110d99060086133f5565b600263ffffffff16901c60f81b828260026110f491906132aa565b8151811061110457611104613093565b60200101906001600160f81b03191690815f1a9053506001016110ba565b505f5b60208110156111845761113981601f6133e2565b6111449060086133f5565b86901c60f81b826111568360066132aa565b8151811061116657611166613093565b60200101906001600160f81b03191690815f1a905350600101611125565b505f5b60088110156111ef5761119b8160076133e2565b6111a69060086133f5565b6001600160401b038616901c60f81b826111c18360266132aa565b815181106111d1576111d1613093565b60200101906001600160f81b03191690815f1a905350600101611187565b505f5b600881101561125a576112068160076133e2565b6112119060086133f5565b6001600160401b038516901c60f81b8261122c83602e6132aa565b8151811061123c5761123c613093565b60200101906001600160f81b03191690815f1a9053506001016111f2565b50949350505050565b5f61126c612d56565b5f805160206137cc8339815191525f611284856115c7565b90505f8061129583604001516121b5565b9150915080156112fa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561132b5761132b612ef7565b600581111561133c5761133c612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156113ad576113ad612ef7565b14806113cb57506001825160058111156113c9576113c9612ef7565b145b61142a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b60038251600581111561143f5761143f612ef7565b0361144c57506004611450565b5060055b6020808301515f9081526009880190915260408120558181600581111561147957611479612ef7565b9081600581111561148c5761148c612ef7565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156114c0576114c0612ef7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561157457611574612ef7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6115b5612356565b6115be8261239f565b610c6e816123b8565b60408051606080820183525f8083526020830181905292820152905f805160206137cc8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561163c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611663919081019061341b565b91509150806116c35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b82548251146117265760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b0316156117995760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f81516026146117c35760405162461bcd60e51b815260040161043a906134ed565b5f805b6002811015611812576117da8160016133e2565b6117e59060086133f5565b61ffff168482815181106117fb576117fb613093565b016020015160f81c901b91909117906001016117c6565b5061ffff8116156118355760405162461bcd60e51b815260040161043a90613536565b5f805b60048110156118905761184c8160036133e2565b6118579060086133f5565b63ffffffff16856118698360026132aa565b8151811061187957611879613093565b016020015160f81c901b9190911790600101611838565b5063ffffffff8116156118b55760405162461bcd60e51b815260040161043a90613579565b5f805b602081101561125a576118cc81601f6133e2565b6118d79060086133f5565b866118e38360066132aa565b815181106118f3576118f3613093565b016020015160f81c901b91909117906001016118b8565b3361193c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c3f5760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611a605760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f805160206137cc83398151915242611a7f60408601602087016135c0565b6001600160401b031611611af15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611b0160408501602086016135c0565b6001600160401b0316611b176202a300426132aa565b11611b8a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611be25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043a565b83355f90815260098201602052604090205415611c115760405162461bcd60e51b815260040161043a906131ee565b6030611c2060408601866135d9565b905014611c855760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043a565b611c8f835f6123c9565b5f80611d296040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611cd491906135c0565b6001600160401b03168152602001611cef60408a018a6135d9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506125d7565b5f82815260078601602052604090209193509150611d478282613666565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d74908590600401613005565b6020604051808303815f875af1158015611d90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db49190613037565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611e2c57611e2c612ef7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f0c918e01908e016135c0565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611f42612d56565b5f8281525f805160206137ec8339815191526020526040808220815160e0810190925280545f805160206137cc83398151915293929190829060ff166005811115611f8f57611f8f612ef7565b6005811115611fa057611fa0612ef7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561201257612012612ef7565b1461206e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156120b2576120b2612ef7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61215e8582612986565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146121d85760405162461bcd60e51b815260040161043a906134ed565b5f805b6002811015612227576121ef8160016133e2565b6121fa9060086133f5565b61ffff1685828151811061221057612210613093565b016020015160f81c901b91909117906001016121db565b5061ffff81161561224a5760405162461bcd60e51b815260040161043a90613536565b5f805b60048110156122a5576122618160036133e2565b61226c9060086133f5565b63ffffffff168661227e8360026132aa565b8151811061228e5761228e613093565b016020015160f81c901b919091179060010161224d565b5063ffffffff81166003146122cc5760405162461bcd60e51b815260040161043a90613579565b5f805b6020811015612321576122e381601f6133e2565b6122ee9060086133f5565b876122fa8360066132aa565b8151811061230a5761230a613093565b016020015160f81c901b91909117906001016122cf565b505f8660268151811061233657612336613093565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c3f57604051631afcd79f60e31b815260040160405180910390fd5b6123a7612356565b6123af612add565b61103b81612ae5565b6123c0612356565b61103b81612c87565b5f805160206137cc8339815191525f6001600160401b0380841690851611156123fd576123f68385613725565b905061240a565b6124078484613725565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b031660608201524291158061246c575060028401548151612468916001600160401b0316906132aa565b8210155b15612492576001600160401b0383166060820152818152604081015160208201526124b1565b82816060018181516124a49190613745565b6001600160401b03169052505b60608101516124c1906064613765565b602082015160028601546001600160401b0392909216916124ec9190600160401b900460ff166133f5565b10156125505760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b856001600160401b03168160400181815161256b91906132aa565b9052506040810180516001600160401b038716919061258b9083906133e2565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146126415760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156126b8576126788160016133e2565b6126839060086133f5565b5081515f9083908390811061269a5761269a613093565b60200101906001600160f81b03191690815f1a905350600101612664565b505f5b6004811015612720576126cf8160036133e2565b6126da9060086133f5565b600160ff919091161c60f81b826126f28360026132aa565b8151811061270257612702613093565b60200101906001600160f81b03191690815f1a9053506001016126bb565b505f5b602081101561277d578451816020811061273f5761273f613093565b1a60f81b8261274f8360066132aa565b8151811061275f5761275f613093565b60200101906001600160f81b03191690815f1a905350600101612723565b505f5b60208110156127dd578460200151816020811061279f5761279f613093565b1a60f81b826127af8360266132aa565b815181106127bf576127bf613093565b60200101906001600160f81b03191690815f1a905350600101612780565b505f5b6008811015612851576127f48160076133e2565b6127ff9060086133f5565b60ff1685604001516001600160401b0316901c60f81b8282604661282391906132aa565b8151811061283357612833613093565b60200101906001600160f81b03191690815f1a9053506001016127e0565b505f5b60308110156128bc578460800151818151811061287357612873613093565b01602001516001600160f81b0319168261288e83604e6132aa565b8151811061289e5761289e613093565b60200101906001600160f81b03191690815f1a905350600101612854565b505f5b600881101561292e576128d38160076133e2565b6128de9060086133f5565b60608601516001600160401b0390811691161c60f81b8261290083607e6132aa565b8151811061291057612910613093565b60200101906001600160f81b03191690815f1a9053506001016128bf565b5060028160405161293f9190613285565b602060405180830381855afa15801561295a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061297d9190613037565b94909350915050565b5f8281525f805160206137ec833981519152602052604081206002015481905f805160206137cc83398151915290600160801b90046001600160401b03166129ce85826123c9565b5f6129d887612c8f565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb612a288a858b61103e565b6040518263ffffffff1660e01b8152600401612a449190613005565b6020604051808303815f875af1158015612a60573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a849190613037565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b610c3f612356565b612aed612356565b80355f805160206137cc83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014612b396080840160608501613790565b60ff161115612ba65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f612bb76080840160608501613790565b60ff1611612c1f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b612c2f6080830160608401613790565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612c6060608301604084016135c0565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b611009612356565b5f8181525f805160206137ec8339815191526020526040812060020180545f805160206137cc83398151915291600160401b9091046001600160401b0316906008612cd9836137b0565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b508054612d2b906132df565b5f825580601f10612d3a575050565b601f0160209004905f5260205f209081019061103b9190612d92565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612da6575f8155600101612d93565b5090565b5f60208284031215612dba575f80fd5b5035919050565b803563ffffffff81168114612dd4575f80fd5b919050565b5f60208284031215612de9575f80fd5b610c5482612dc1565b5f60808284031215612e02575f80fd5b50919050565b6001600160a01b038116811461103b575f80fd5b5f8060a08385031215612e2d575f80fd5b612e378484612df2565b91506080830135612e4781612e08565b809150509250929050565b5f8060408385031215612e63575f80fd5b82356001600160401b03811115612e78575f80fd5b612e8485828601612df2565b925050612e9360208401612dc1565b90509250929050565b80356001600160401b0381168114612dd4575f80fd5b5f8060408385031215612ec3575f80fd5b82356001600160401b03811115612ed8575f80fd5b830160608186031215612ee9575f80fd5b9150612e9360208401612e9c565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f2e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f6960608401826001600160401b03169052565b506080830151612f8460808401826001600160401b03169052565b5060a0830151612f9f60a08401826001600160401b03169052565b5060c0830151612fba60c08401826001600160401b03169052565b5092915050565b5f60208284031215612fd1575f80fd5b8135612fdc81612e08565b9392505050565b5f5b83811015612ffd578181015183820152602001612fe5565b50505f910152565b602081525f8251806020840152613023816040850160208701612fe3565b601f01601f19169190910160400192915050565b5f60208284031215613047575f80fd5b5051919050565b5f808335601e19843603018112613063575f80fd5b8301803591506001600160401b0382111561307c575f80fd5b6020019150600581901b3603821315612ad6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130bb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130fb576130fb6130c5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613129576131296130c5565b604052919050565b5f6001600160401b03821115613149576131496130c5565b50601f01601f191660200190565b5f60608236031215613167575f80fd5b61316f6130d9565b823581526020613180818501612e9c565b8183015260408401356001600160401b0381111561319c575f80fd5b840136601f8201126131ac575f80fd5b80356131bf6131ba82613131565b613101565b81815236848385010111156131d2575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551613247818460208a01612fe3565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613277816028840160208801612fe3565b016028019695505050505050565b5f82516130bb818460208701612fe3565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c5757610c57613296565b5f63ffffffff8083168181036132d5576132d5613296565b6001019392505050565b600181811c908216806132f357607f821691505b602082108103612e0257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461336a816132df565b806020870152604060018084165f811461338b57600181146133a7576133d4565b60ff19851660408a0152604084151560051b8a010195506133d4565b895f5260205f205f5b858110156133cb5781548b82018601529083019088016133b0565b8a016040019650505b509398975050505050505050565b81810381811115610c5757610c57613296565b8082028115828204841417610c5757610c57613296565b80518015158114612dd4575f80fd5b5f806040838503121561342c575f80fd5b82516001600160401b0380821115613442575f80fd5b9084019060608287031215613455575f80fd5b61345d6130d9565b8251815260208084015161347081612e08565b82820152604084015183811115613485575f80fd5b80850194505087601f850112613499575f80fd5b835192506134a96131ba84613131565b83815288828587010111156134bc575f80fd5b6134cb84838301848801612fe3565b806040840152508195506134e081880161340c565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156135d0575f80fd5b610c5482612e9c565b5f808335601e198436030181126135ee575f80fd5b8301803591506001600160401b03821115613607575f80fd5b602001915036819003821315612ad6575f80fd5b601f8211156104d357805f5260205f20601f840160051c810160208510156136405750805b601f840160051c820191505b8181101561365f575f815560010161364c565b5050505050565b81516001600160401b0381111561367f5761367f6130c5565b6136938161368d84546132df565b8461361b565b602080601f8311600181146136c6575f84156136af5750858301515b5f19600386901b1c1916600185901b17855561371d565b5f85815260208120601f198616915b828110156136f4578886015182559484019460019091019084016136d5565b508582101561371157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03828116828216039080821115612fba57612fba613296565b6001600160401b03818116838216019080821115612fba57612fba613296565b6001600160401b0381811683821602808216919082811461378857613788613296565b505092915050565b5f602082840312156137a0575f80fd5b813560ff81168114612fdc575f80fd5b5f6001600160401b038083168181036132d5576132d561329656fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", -} - -// PoAValidatorManagerABI is the input ABI used to generate the binding from. -// Deprecated: Use PoAValidatorManagerMetaData.ABI instead. -var PoAValidatorManagerABI = PoAValidatorManagerMetaData.ABI - -// PoAValidatorManagerBin is the compiled bytecode used for deploying new contracts. -// Deprecated: Use PoAValidatorManagerMetaData.Bin instead. -var PoAValidatorManagerBin = PoAValidatorManagerMetaData.Bin - -// DeployPoAValidatorManager deploys a new Ethereum contract, binding an instance of PoAValidatorManager to it. -func DeployPoAValidatorManager(auth *bind.TransactOpts, backend bind.ContractBackend, init uint8) (common.Address, *types.Transaction, *PoAValidatorManager, error) { - parsed, err := PoAValidatorManagerMetaData.GetAbi() - if err != nil { - return common.Address{}, nil, nil, err - } - if parsed == nil { - return common.Address{}, nil, nil, errors.New("GetABI returned nil") - } - - address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(PoAValidatorManagerBin), backend, init) - if err != nil { - return common.Address{}, nil, nil, err - } - return address, tx, &PoAValidatorManager{PoAValidatorManagerCaller: PoAValidatorManagerCaller{contract: contract}, PoAValidatorManagerTransactor: PoAValidatorManagerTransactor{contract: contract}, PoAValidatorManagerFilterer: PoAValidatorManagerFilterer{contract: contract}}, nil -} - -// PoAValidatorManager is an auto generated Go binding around an Ethereum contract. -type PoAValidatorManager struct { - PoAValidatorManagerCaller // Read-only binding to the contract - PoAValidatorManagerTransactor // Write-only binding to the contract - PoAValidatorManagerFilterer // Log filterer for contract events -} - -// PoAValidatorManagerCaller is an auto generated read-only Go binding around an Ethereum contract. -type PoAValidatorManagerCaller struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PoAValidatorManagerTransactor is an auto generated write-only Go binding around an Ethereum contract. -type PoAValidatorManagerTransactor struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PoAValidatorManagerFilterer is an auto generated log filtering Go binding around an Ethereum contract events. -type PoAValidatorManagerFilterer struct { - contract *bind.BoundContract // Generic contract wrapper for the low level calls -} - -// PoAValidatorManagerSession is an auto generated Go binding around an Ethereum contract, -// with pre-set call and transact options. -type PoAValidatorManagerSession struct { - Contract *PoAValidatorManager // Generic contract binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// PoAValidatorManagerCallerSession is an auto generated read-only Go binding around an Ethereum contract, -// with pre-set call options. -type PoAValidatorManagerCallerSession struct { - Contract *PoAValidatorManagerCaller // Generic contract caller binding to set the session for - CallOpts bind.CallOpts // Call options to use throughout this session -} - -// PoAValidatorManagerTransactorSession is an auto generated write-only Go binding around an Ethereum contract, -// with pre-set transact options. -type PoAValidatorManagerTransactorSession struct { - Contract *PoAValidatorManagerTransactor // Generic contract transactor binding to set the session for - TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session -} - -// PoAValidatorManagerRaw is an auto generated low-level Go binding around an Ethereum contract. -type PoAValidatorManagerRaw struct { - Contract *PoAValidatorManager // Generic contract binding to access the raw methods on -} - -// PoAValidatorManagerCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. -type PoAValidatorManagerCallerRaw struct { - Contract *PoAValidatorManagerCaller // Generic read-only contract binding to access the raw methods on -} - -// PoAValidatorManagerTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. -type PoAValidatorManagerTransactorRaw struct { - Contract *PoAValidatorManagerTransactor // Generic write-only contract binding to access the raw methods on -} - -// NewPoAValidatorManager creates a new instance of PoAValidatorManager, bound to a specific deployed contract. -func NewPoAValidatorManager(address common.Address, backend bind.ContractBackend) (*PoAValidatorManager, error) { - contract, err := bindPoAValidatorManager(address, backend, backend, backend) - if err != nil { - return nil, err - } - return &PoAValidatorManager{PoAValidatorManagerCaller: PoAValidatorManagerCaller{contract: contract}, PoAValidatorManagerTransactor: PoAValidatorManagerTransactor{contract: contract}, PoAValidatorManagerFilterer: PoAValidatorManagerFilterer{contract: contract}}, nil -} - -// NewPoAValidatorManagerCaller creates a new read-only instance of PoAValidatorManager, bound to a specific deployed contract. -func NewPoAValidatorManagerCaller(address common.Address, caller bind.ContractCaller) (*PoAValidatorManagerCaller, error) { - contract, err := bindPoAValidatorManager(address, caller, nil, nil) - if err != nil { - return nil, err - } - return &PoAValidatorManagerCaller{contract: contract}, nil -} - -// NewPoAValidatorManagerTransactor creates a new write-only instance of PoAValidatorManager, bound to a specific deployed contract. -func NewPoAValidatorManagerTransactor(address common.Address, transactor bind.ContractTransactor) (*PoAValidatorManagerTransactor, error) { - contract, err := bindPoAValidatorManager(address, nil, transactor, nil) - if err != nil { - return nil, err - } - return &PoAValidatorManagerTransactor{contract: contract}, nil -} - -// NewPoAValidatorManagerFilterer creates a new log filterer instance of PoAValidatorManager, bound to a specific deployed contract. -func NewPoAValidatorManagerFilterer(address common.Address, filterer bind.ContractFilterer) (*PoAValidatorManagerFilterer, error) { - contract, err := bindPoAValidatorManager(address, nil, nil, filterer) - if err != nil { - return nil, err - } - return &PoAValidatorManagerFilterer{contract: contract}, nil -} - -// bindPoAValidatorManager binds a generic wrapper to an already deployed contract. -func bindPoAValidatorManager(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { - parsed, err := PoAValidatorManagerMetaData.GetAbi() - if err != nil { - return nil, err - } - return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_PoAValidatorManager *PoAValidatorManagerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _PoAValidatorManager.Contract.PoAValidatorManagerCaller.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_PoAValidatorManager *PoAValidatorManagerRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.PoAValidatorManagerTransactor.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_PoAValidatorManager *PoAValidatorManagerRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.PoAValidatorManagerTransactor.contract.Transact(opts, method, params...) -} - -// Call invokes the (constant) contract method with params as input values and -// sets the output to result. The result type might be a single field for simple -// returns, a slice of interfaces for anonymous returns and a struct for named -// returns. -func (_PoAValidatorManager *PoAValidatorManagerCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { - return _PoAValidatorManager.Contract.contract.Call(opts, result, method, params...) -} - -// Transfer initiates a plain transaction to move funds to the contract, calling -// its default method if one is available. -func (_PoAValidatorManager *PoAValidatorManagerTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.contract.Transfer(opts) -} - -// Transact invokes the (paid) contract method with params as input values. -func (_PoAValidatorManager *PoAValidatorManagerTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.contract.Transact(opts, method, params...) -} - -// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. -// -// Solidity: function ADDRESS_LENGTH() view returns(uint32) -func (_PoAValidatorManager *PoAValidatorManagerCaller) ADDRESSLENGTH(opts *bind.CallOpts) (uint32, error) { - var out []interface{} - err := _PoAValidatorManager.contract.Call(opts, &out, "ADDRESS_LENGTH") - - if err != nil { - return *new(uint32), err - } - - out0 := *abi.ConvertType(out[0], new(uint32)).(*uint32) - - return out0, err - -} - -// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. -// -// Solidity: function ADDRESS_LENGTH() view returns(uint32) -func (_PoAValidatorManager *PoAValidatorManagerSession) ADDRESSLENGTH() (uint32, error) { - return _PoAValidatorManager.Contract.ADDRESSLENGTH(&_PoAValidatorManager.CallOpts) -} - -// ADDRESSLENGTH is a free data retrieval call binding the contract method 0x60305d62. -// -// Solidity: function ADDRESS_LENGTH() view returns(uint32) -func (_PoAValidatorManager *PoAValidatorManagerCallerSession) ADDRESSLENGTH() (uint32, error) { - return _PoAValidatorManager.Contract.ADDRESSLENGTH(&_PoAValidatorManager.CallOpts) -} - -// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. -// -// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) -func (_PoAValidatorManager *PoAValidatorManagerCaller) BLSPUBLICKEYLENGTH(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _PoAValidatorManager.contract.Call(opts, &out, "BLS_PUBLIC_KEY_LENGTH") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. -// -// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) -func (_PoAValidatorManager *PoAValidatorManagerSession) BLSPUBLICKEYLENGTH() (uint8, error) { - return _PoAValidatorManager.Contract.BLSPUBLICKEYLENGTH(&_PoAValidatorManager.CallOpts) -} - -// BLSPUBLICKEYLENGTH is a free data retrieval call binding the contract method 0x8280a25a. -// -// Solidity: function BLS_PUBLIC_KEY_LENGTH() view returns(uint8) -func (_PoAValidatorManager *PoAValidatorManagerCallerSession) BLSPUBLICKEYLENGTH() (uint8, error) { - return _PoAValidatorManager.Contract.BLSPUBLICKEYLENGTH(&_PoAValidatorManager.CallOpts) -} - -// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. -// -// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) -func (_PoAValidatorManager *PoAValidatorManagerCaller) MAXIMUMCHURNPERCENTAGELIMIT(opts *bind.CallOpts) (uint8, error) { - var out []interface{} - err := _PoAValidatorManager.contract.Call(opts, &out, "MAXIMUM_CHURN_PERCENTAGE_LIMIT") - - if err != nil { - return *new(uint8), err - } - - out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8) - - return out0, err - -} - -// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. -// -// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) -func (_PoAValidatorManager *PoAValidatorManagerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { - return _PoAValidatorManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_PoAValidatorManager.CallOpts) -} - -// MAXIMUMCHURNPERCENTAGELIMIT is a free data retrieval call binding the contract method 0xc974d1b6. -// -// Solidity: function MAXIMUM_CHURN_PERCENTAGE_LIMIT() view returns(uint8) -func (_PoAValidatorManager *PoAValidatorManagerCallerSession) MAXIMUMCHURNPERCENTAGELIMIT() (uint8, error) { - return _PoAValidatorManager.Contract.MAXIMUMCHURNPERCENTAGELIMIT(&_PoAValidatorManager.CallOpts) -} - -// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. -// -// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) -func (_PoAValidatorManager *PoAValidatorManagerCaller) MAXIMUMREGISTRATIONEXPIRYLENGTH(opts *bind.CallOpts) (uint64, error) { - var out []interface{} - err := _PoAValidatorManager.contract.Call(opts, &out, "MAXIMUM_REGISTRATION_EXPIRY_LENGTH") - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. -// -// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) -func (_PoAValidatorManager *PoAValidatorManagerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { - return _PoAValidatorManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_PoAValidatorManager.CallOpts) -} - -// MAXIMUMREGISTRATIONEXPIRYLENGTH is a free data retrieval call binding the contract method 0xdf93d8de. -// -// Solidity: function MAXIMUM_REGISTRATION_EXPIRY_LENGTH() view returns(uint64) -func (_PoAValidatorManager *PoAValidatorManagerCallerSession) MAXIMUMREGISTRATIONEXPIRYLENGTH() (uint64, error) { - return _PoAValidatorManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_PoAValidatorManager.CallOpts) -} - -// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. -// -// Solidity: function WARP_MESSENGER() view returns(address) -func (_PoAValidatorManager *PoAValidatorManagerCaller) WARPMESSENGER(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _PoAValidatorManager.contract.Call(opts, &out, "WARP_MESSENGER") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. -// -// Solidity: function WARP_MESSENGER() view returns(address) -func (_PoAValidatorManager *PoAValidatorManagerSession) WARPMESSENGER() (common.Address, error) { - return _PoAValidatorManager.Contract.WARPMESSENGER(&_PoAValidatorManager.CallOpts) -} - -// WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. -// -// Solidity: function WARP_MESSENGER() view returns(address) -func (_PoAValidatorManager *PoAValidatorManagerCallerSession) WARPMESSENGER() (common.Address, error) { - return _PoAValidatorManager.Contract.WARPMESSENGER(&_PoAValidatorManager.CallOpts) -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_PoAValidatorManager *PoAValidatorManagerCaller) ActiveValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { - var out []interface{} - err := _PoAValidatorManager.contract.Call(opts, &out, "activeValidators", nodeID) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_PoAValidatorManager *PoAValidatorManagerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { - return _PoAValidatorManager.Contract.ActiveValidators(&_PoAValidatorManager.CallOpts, nodeID) -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_PoAValidatorManager *PoAValidatorManagerCallerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { - return _PoAValidatorManager.Contract.ActiveValidators(&_PoAValidatorManager.CallOpts, nodeID) -} - -// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. -// -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) -func (_PoAValidatorManager *PoAValidatorManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { - var out []interface{} - err := _PoAValidatorManager.contract.Call(opts, &out, "getValidator", validationID) - - if err != nil { - return *new(Validator), err - } - - out0 := *abi.ConvertType(out[0], new(Validator)).(*Validator) - - return out0, err - -} - -// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. -// -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) -func (_PoAValidatorManager *PoAValidatorManagerSession) GetValidator(validationID [32]byte) (Validator, error) { - return _PoAValidatorManager.Contract.GetValidator(&_PoAValidatorManager.CallOpts, validationID) -} - -// GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. -// -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) -func (_PoAValidatorManager *PoAValidatorManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { - return _PoAValidatorManager.Contract.GetValidator(&_PoAValidatorManager.CallOpts, validationID) -} - -// GetWeight is a free data retrieval call binding the contract method 0x66435abf. -// -// Solidity: function getWeight(bytes32 validationID) view returns(uint64) -func (_PoAValidatorManager *PoAValidatorManagerCaller) GetWeight(opts *bind.CallOpts, validationID [32]byte) (uint64, error) { - var out []interface{} - err := _PoAValidatorManager.contract.Call(opts, &out, "getWeight", validationID) - - if err != nil { - return *new(uint64), err - } - - out0 := *abi.ConvertType(out[0], new(uint64)).(*uint64) - - return out0, err - -} - -// GetWeight is a free data retrieval call binding the contract method 0x66435abf. -// -// Solidity: function getWeight(bytes32 validationID) view returns(uint64) -func (_PoAValidatorManager *PoAValidatorManagerSession) GetWeight(validationID [32]byte) (uint64, error) { - return _PoAValidatorManager.Contract.GetWeight(&_PoAValidatorManager.CallOpts, validationID) -} - -// GetWeight is a free data retrieval call binding the contract method 0x66435abf. -// -// Solidity: function getWeight(bytes32 validationID) view returns(uint64) -func (_PoAValidatorManager *PoAValidatorManagerCallerSession) GetWeight(validationID [32]byte) (uint64, error) { - return _PoAValidatorManager.Contract.GetWeight(&_PoAValidatorManager.CallOpts, validationID) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_PoAValidatorManager *PoAValidatorManagerCaller) Owner(opts *bind.CallOpts) (common.Address, error) { - var out []interface{} - err := _PoAValidatorManager.contract.Call(opts, &out, "owner") - - if err != nil { - return *new(common.Address), err - } - - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) - - return out0, err - -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_PoAValidatorManager *PoAValidatorManagerSession) Owner() (common.Address, error) { - return _PoAValidatorManager.Contract.Owner(&_PoAValidatorManager.CallOpts) -} - -// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. -// -// Solidity: function owner() view returns(address) -func (_PoAValidatorManager *PoAValidatorManagerCallerSession) Owner() (common.Address, error) { - return _PoAValidatorManager.Contract.Owner(&_PoAValidatorManager.CallOpts) -} - -// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. -// -// Solidity: function completeEndValidation(uint32 messageIndex) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactor) CompleteEndValidation(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { - return _PoAValidatorManager.contract.Transact(opts, "completeEndValidation", messageIndex) -} - -// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. -// -// Solidity: function completeEndValidation(uint32 messageIndex) returns() -func (_PoAValidatorManager *PoAValidatorManagerSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.CompleteEndValidation(&_PoAValidatorManager.TransactOpts, messageIndex) -} - -// CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. -// -// Solidity: function completeEndValidation(uint32 messageIndex) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteEndValidation(messageIndex uint32) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.CompleteEndValidation(&_PoAValidatorManager.TransactOpts, messageIndex) -} - -// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. -// -// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactor) CompleteValidatorRegistration(opts *bind.TransactOpts, messageIndex uint32) (*types.Transaction, error) { - return _PoAValidatorManager.contract.Transact(opts, "completeValidatorRegistration", messageIndex) -} - -// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. -// -// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() -func (_PoAValidatorManager *PoAValidatorManagerSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.CompleteValidatorRegistration(&_PoAValidatorManager.TransactOpts, messageIndex) -} - -// CompleteValidatorRegistration is a paid mutator transaction binding the contract method 0xa3a65e48. -// -// Solidity: function completeValidatorRegistration(uint32 messageIndex) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteValidatorRegistration(messageIndex uint32) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.CompleteValidatorRegistration(&_PoAValidatorManager.TransactOpts, messageIndex) -} - -// Initialize is a paid mutator transaction binding the contract method 0x580a4006. -// -// Solidity: function initialize((bytes32,bytes32,uint64,uint8) settings, address initialOwner) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactor) Initialize(opts *bind.TransactOpts, settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { - return _PoAValidatorManager.contract.Transact(opts, "initialize", settings, initialOwner) -} - -// Initialize is a paid mutator transaction binding the contract method 0x580a4006. -// -// Solidity: function initialize((bytes32,bytes32,uint64,uint8) settings, address initialOwner) returns() -func (_PoAValidatorManager *PoAValidatorManagerSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) -} - -// Initialize is a paid mutator transaction binding the contract method 0x580a4006. -// -// Solidity: function initialize((bytes32,bytes32,uint64,uint8) settings, address initialOwner) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) -} - -// InitializeEndValidation is a paid mutator transaction binding the contract method 0x97fb70d4. -// -// Solidity: function initializeEndValidation(bytes32 validationID) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { - return _PoAValidatorManager.contract.Transact(opts, "initializeEndValidation", validationID) -} - -// InitializeEndValidation is a paid mutator transaction binding the contract method 0x97fb70d4. -// -// Solidity: function initializeEndValidation(bytes32 validationID) returns() -func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeEndValidation(validationID [32]byte) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.InitializeEndValidation(&_PoAValidatorManager.TransactOpts, validationID) -} - -// InitializeEndValidation is a paid mutator transaction binding the contract method 0x97fb70d4. -// -// Solidity: function initializeEndValidation(bytes32 validationID) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeEndValidation(validationID [32]byte) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.InitializeEndValidation(&_PoAValidatorManager.TransactOpts, validationID) -} - -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8994ab49. -// -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint64 weight) returns(bytes32 validationID) -func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { - return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, weight) -} - -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8994ab49. -// -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint64 weight) returns(bytes32 validationID) -func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, registrationInput, weight) -} - -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8994ab49. -// -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint64 weight) returns(bytes32 validationID) -func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, registrationInput, weight) -} - -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. -// -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { - return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) -} - -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. -// -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() -func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.InitializeValidatorSet(&_PoAValidatorManager.TransactOpts, subnetConversionData, messageIndex) -} - -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. -// -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.InitializeValidatorSet(&_PoAValidatorManager.TransactOpts, subnetConversionData, messageIndex) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { - return _PoAValidatorManager.contract.Transact(opts, "renounceOwnership") -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_PoAValidatorManager *PoAValidatorManagerSession) RenounceOwnership() (*types.Transaction, error) { - return _PoAValidatorManager.Contract.RenounceOwnership(&_PoAValidatorManager.TransactOpts) -} - -// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. -// -// Solidity: function renounceOwnership() returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) RenounceOwnership() (*types.Transaction, error) { - return _PoAValidatorManager.Contract.RenounceOwnership(&_PoAValidatorManager.TransactOpts) -} - -// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. -// -// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactor) ResendEndValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { - return _PoAValidatorManager.contract.Transact(opts, "resendEndValidatorMessage", validationID) -} - -// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. -// -// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() -func (_PoAValidatorManager *PoAValidatorManagerSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.ResendEndValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) -} - -// ResendEndValidatorMessage is a paid mutator transaction binding the contract method 0x0322ed98. -// -// Solidity: function resendEndValidatorMessage(bytes32 validationID) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) ResendEndValidatorMessage(validationID [32]byte) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.ResendEndValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) -} - -// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. -// -// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactor) ResendRegisterValidatorMessage(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { - return _PoAValidatorManager.contract.Transact(opts, "resendRegisterValidatorMessage", validationID) -} - -// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. -// -// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() -func (_PoAValidatorManager *PoAValidatorManagerSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.ResendRegisterValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) -} - -// ResendRegisterValidatorMessage is a paid mutator transaction binding the contract method 0xbee0a03f. -// -// Solidity: function resendRegisterValidatorMessage(bytes32 validationID) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) ResendRegisterValidatorMessage(validationID [32]byte) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.ResendRegisterValidatorMessage(&_PoAValidatorManager.TransactOpts, validationID) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { - return _PoAValidatorManager.contract.Transact(opts, "transferOwnership", newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_PoAValidatorManager *PoAValidatorManagerSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.TransferOwnership(&_PoAValidatorManager.TransactOpts, newOwner) -} - -// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. -// -// Solidity: function transferOwnership(address newOwner) returns() -func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { - return _PoAValidatorManager.Contract.TransferOwnership(&_PoAValidatorManager.TransactOpts, newOwner) -} - -// PoAValidatorManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the PoAValidatorManager contract. -type PoAValidatorManagerInitialValidatorCreatedIterator struct { - Event *PoAValidatorManagerInitialValidatorCreated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerInitialValidatorCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerInitialValidatorCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PoAValidatorManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the PoAValidatorManager contract. -type PoAValidatorManagerInitialValidatorCreated struct { - ValidationID [32]byte - NodeID [32]byte - Weight *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. -// -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*PoAValidatorManagerInitialValidatorCreatedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nodeIDRule []interface{} - for _, nodeIDItem := range nodeID { - nodeIDRule = append(nodeIDRule, nodeIDItem) - } - - logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) - if err != nil { - return nil, err - } - return &PoAValidatorManagerInitialValidatorCreatedIterator{contract: _PoAValidatorManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil -} - -// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. -// -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nodeIDRule []interface{} - for _, nodeIDItem := range nodeID { - nodeIDRule = append(nodeIDRule, nodeIDItem) - } - - logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "InitialValidatorCreated", validationIDRule, nodeIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PoAValidatorManagerInitialValidatorCreated) - if err := _PoAValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. -// -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*PoAValidatorManagerInitialValidatorCreated, error) { - event := new(PoAValidatorManagerInitialValidatorCreated) - if err := _PoAValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// PoAValidatorManagerInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the PoAValidatorManager contract. -type PoAValidatorManagerInitializedIterator struct { - Event *PoAValidatorManagerInitialized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PoAValidatorManagerInitializedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *PoAValidatorManagerInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PoAValidatorManagerInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PoAValidatorManagerInitialized represents a Initialized event raised by the PoAValidatorManager contract. -type PoAValidatorManagerInitialized struct { - Version uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. -// -// Solidity: event Initialized(uint64 version) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialized(opts *bind.FilterOpts) (*PoAValidatorManagerInitializedIterator, error) { - - logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return &PoAValidatorManagerInitializedIterator{contract: _PoAValidatorManager.contract, event: "Initialized", logs: logs, sub: sub}, nil -} - -// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. -// -// Solidity: event Initialized(uint64 version) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerInitialized) (event.Subscription, error) { - - logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "Initialized") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PoAValidatorManagerInitialized) - if err := _PoAValidatorManager.contract.UnpackLog(event, "Initialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2. -// -// Solidity: event Initialized(uint64 version) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseInitialized(log types.Log) (*PoAValidatorManagerInitialized, error) { - event := new(PoAValidatorManagerInitialized) - if err := _PoAValidatorManager.contract.UnpackLog(event, "Initialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// PoAValidatorManagerOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the PoAValidatorManager contract. -type PoAValidatorManagerOwnershipTransferredIterator struct { - Event *PoAValidatorManagerOwnershipTransferred // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PoAValidatorManagerOwnershipTransferredIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerOwnershipTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerOwnershipTransferred) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *PoAValidatorManagerOwnershipTransferredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PoAValidatorManagerOwnershipTransferredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PoAValidatorManagerOwnershipTransferred represents a OwnershipTransferred event raised by the PoAValidatorManager contract. -type PoAValidatorManagerOwnershipTransferred struct { - PreviousOwner common.Address - NewOwner common.Address - Raw types.Log // Blockchain specific contextual infos -} - -// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*PoAValidatorManagerOwnershipTransferredIterator, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return &PoAValidatorManagerOwnershipTransferredIterator{contract: _PoAValidatorManager.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil -} - -// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { - - var previousOwnerRule []interface{} - for _, previousOwnerItem := range previousOwner { - previousOwnerRule = append(previousOwnerRule, previousOwnerItem) - } - var newOwnerRule []interface{} - for _, newOwnerItem := range newOwner { - newOwnerRule = append(newOwnerRule, newOwnerItem) - } - - logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PoAValidatorManagerOwnershipTransferred) - if err := _PoAValidatorManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. -// -// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseOwnershipTransferred(log types.Log) (*PoAValidatorManagerOwnershipTransferred, error) { - event := new(PoAValidatorManagerOwnershipTransferred) - if err := _PoAValidatorManager.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// PoAValidatorManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the PoAValidatorManager contract. -type PoAValidatorManagerValidationPeriodCreatedIterator struct { - Event *PoAValidatorManagerValidationPeriodCreated // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerValidationPeriodCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerValidationPeriodCreated) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PoAValidatorManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the PoAValidatorManager contract. -type PoAValidatorManagerValidationPeriodCreated struct { - ValidationID [32]byte - NodeID [32]byte - RegisterValidationMessageID [32]byte - Weight *big.Int - RegistrationExpiry uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. -// -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (*PoAValidatorManagerValidationPeriodCreatedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nodeIDRule []interface{} - for _, nodeIDItem := range nodeID { - nodeIDRule = append(nodeIDRule, nodeIDItem) - } - var registerValidationMessageIDRule []interface{} - for _, registerValidationMessageIDItem := range registerValidationMessageID { - registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) - } - - logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) - if err != nil { - return nil, err - } - return &PoAValidatorManagerValidationPeriodCreatedIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil -} - -// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. -// -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nodeIDRule []interface{} - for _, nodeIDItem := range nodeID { - nodeIDRule = append(nodeIDRule, nodeIDItem) - } - var registerValidationMessageIDRule []interface{} - for _, registerValidationMessageIDItem := range registerValidationMessageID { - registerValidationMessageIDRule = append(registerValidationMessageIDRule, registerValidationMessageIDItem) - } - - logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodCreated", validationIDRule, nodeIDRule, registerValidationMessageIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PoAValidatorManagerValidationPeriodCreated) - if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidationPeriodCreated is a log parse operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. -// -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*PoAValidatorManagerValidationPeriodCreated, error) { - event := new(PoAValidatorManagerValidationPeriodCreated) - if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// PoAValidatorManagerValidationPeriodEndedIterator is returned from FilterValidationPeriodEnded and is used to iterate over the raw logs and unpacked data for ValidationPeriodEnded events raised by the PoAValidatorManager contract. -type PoAValidatorManagerValidationPeriodEndedIterator struct { - Event *PoAValidatorManagerValidationPeriodEnded // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PoAValidatorManagerValidationPeriodEndedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerValidationPeriodEnded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerValidationPeriodEnded) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *PoAValidatorManagerValidationPeriodEndedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PoAValidatorManagerValidationPeriodEndedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PoAValidatorManagerValidationPeriodEnded represents a ValidationPeriodEnded event raised by the PoAValidatorManager contract. -type PoAValidatorManagerValidationPeriodEnded struct { - ValidationID [32]byte - Status uint8 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidationPeriodEnded is a free log retrieval operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. -// -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodEnded(opts *bind.FilterOpts, validationID [][32]byte, status []uint8) (*PoAValidatorManagerValidationPeriodEndedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var statusRule []interface{} - for _, statusItem := range status { - statusRule = append(statusRule, statusItem) - } - - logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) - if err != nil { - return nil, err - } - return &PoAValidatorManagerValidationPeriodEndedIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodEnded", logs: logs, sub: sub}, nil -} - -// WatchValidationPeriodEnded is a free log subscription operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. -// -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodEnded(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodEnded, validationID [][32]byte, status []uint8) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var statusRule []interface{} - for _, statusItem := range status { - statusRule = append(statusRule, statusItem) - } - - logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodEnded", validationIDRule, statusRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PoAValidatorManagerValidationPeriodEnded) - if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidationPeriodEnded is a log parse operation binding the contract event 0x1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16. -// -// Solidity: event ValidationPeriodEnded(bytes32 indexed validationID, uint8 indexed status) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodEnded(log types.Log) (*PoAValidatorManagerValidationPeriodEnded, error) { - event := new(PoAValidatorManagerValidationPeriodEnded) - if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodEnded", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// PoAValidatorManagerValidationPeriodRegisteredIterator is returned from FilterValidationPeriodRegistered and is used to iterate over the raw logs and unpacked data for ValidationPeriodRegistered events raised by the PoAValidatorManager contract. -type PoAValidatorManagerValidationPeriodRegisteredIterator struct { - Event *PoAValidatorManagerValidationPeriodRegistered // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerValidationPeriodRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerValidationPeriodRegistered) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PoAValidatorManagerValidationPeriodRegisteredIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PoAValidatorManagerValidationPeriodRegistered represents a ValidationPeriodRegistered event raised by the PoAValidatorManager contract. -type PoAValidatorManagerValidationPeriodRegistered struct { - ValidationID [32]byte - Weight *big.Int - Timestamp *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidationPeriodRegistered is a free log retrieval operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. -// -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodRegistered(opts *bind.FilterOpts, validationID [][32]byte) (*PoAValidatorManagerValidationPeriodRegisteredIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidationPeriodRegistered", validationIDRule) - if err != nil { - return nil, err - } - return &PoAValidatorManagerValidationPeriodRegisteredIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodRegistered", logs: logs, sub: sub}, nil -} - -// WatchValidationPeriodRegistered is a free log subscription operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. -// -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodRegistered(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodRegistered, validationID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - - logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidationPeriodRegistered", validationIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PoAValidatorManagerValidationPeriodRegistered) - if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidationPeriodRegistered is a log parse operation binding the contract event 0xf8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568. -// -// Solidity: event ValidationPeriodRegistered(bytes32 indexed validationID, uint256 weight, uint256 timestamp) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodRegistered(log types.Log) (*PoAValidatorManagerValidationPeriodRegistered, error) { - event := new(PoAValidatorManagerValidationPeriodRegistered) - if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodRegistered", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// PoAValidatorManagerValidatorRemovalInitializedIterator is returned from FilterValidatorRemovalInitialized and is used to iterate over the raw logs and unpacked data for ValidatorRemovalInitialized events raised by the PoAValidatorManager contract. -type PoAValidatorManagerValidatorRemovalInitializedIterator struct { - Event *PoAValidatorManagerValidatorRemovalInitialized // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerValidatorRemovalInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerValidatorRemovalInitialized) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PoAValidatorManagerValidatorRemovalInitializedIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PoAValidatorManagerValidatorRemovalInitialized represents a ValidatorRemovalInitialized event raised by the PoAValidatorManager contract. -type PoAValidatorManagerValidatorRemovalInitialized struct { - ValidationID [32]byte - SetWeightMessageID [32]byte - Weight *big.Int - EndTime *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidatorRemovalInitialized is a free log retrieval operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. -// -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorRemovalInitialized(opts *bind.FilterOpts, validationID [][32]byte, setWeightMessageID [][32]byte) (*PoAValidatorManagerValidatorRemovalInitializedIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - - logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) - if err != nil { - return nil, err - } - return &PoAValidatorManagerValidatorRemovalInitializedIterator{contract: _PoAValidatorManager.contract, event: "ValidatorRemovalInitialized", logs: logs, sub: sub}, nil -} - -// WatchValidatorRemovalInitialized is a free log subscription operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. -// -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidatorRemovalInitialized, validationID [][32]byte, setWeightMessageID [][32]byte) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var setWeightMessageIDRule []interface{} - for _, setWeightMessageIDItem := range setWeightMessageID { - setWeightMessageIDRule = append(setWeightMessageIDRule, setWeightMessageIDItem) - } - - logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidatorRemovalInitialized", validationIDRule, setWeightMessageIDRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PoAValidatorManagerValidatorRemovalInitialized) - if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidatorRemovalInitialized is a log parse operation binding the contract event 0x13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67. -// -// Solidity: event ValidatorRemovalInitialized(bytes32 indexed validationID, bytes32 indexed setWeightMessageID, uint256 weight, uint256 endTime) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorRemovalInitialized(log types.Log) (*PoAValidatorManagerValidatorRemovalInitialized, error) { - event := new(PoAValidatorManagerValidatorRemovalInitialized) - if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorRemovalInitialized", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - -// PoAValidatorManagerValidatorWeightUpdateIterator is returned from FilterValidatorWeightUpdate and is used to iterate over the raw logs and unpacked data for ValidatorWeightUpdate events raised by the PoAValidatorManager contract. -type PoAValidatorManagerValidatorWeightUpdateIterator struct { - Event *PoAValidatorManagerValidatorWeightUpdate // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerValidatorWeightUpdate) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(PoAValidatorManagerValidatorWeightUpdate) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *PoAValidatorManagerValidatorWeightUpdateIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// PoAValidatorManagerValidatorWeightUpdate represents a ValidatorWeightUpdate event raised by the PoAValidatorManager contract. -type PoAValidatorManagerValidatorWeightUpdate struct { - ValidationID [32]byte - Nonce uint64 - ValidatorWeight uint64 - SetWeightMessageID [32]byte - Raw types.Log // Blockchain specific contextual infos -} - -// FilterValidatorWeightUpdate is a free log retrieval operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. -// -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidatorWeightUpdate(opts *bind.FilterOpts, validationID [][32]byte, nonce []uint64) (*PoAValidatorManagerValidatorWeightUpdateIterator, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _PoAValidatorManager.contract.FilterLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return &PoAValidatorManagerValidatorWeightUpdateIterator{contract: _PoAValidatorManager.contract, event: "ValidatorWeightUpdate", logs: logs, sub: sub}, nil -} - -// WatchValidatorWeightUpdate is a free log subscription operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. -// -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidatorWeightUpdate(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidatorWeightUpdate, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { - - var validationIDRule []interface{} - for _, validationIDItem := range validationID { - validationIDRule = append(validationIDRule, validationIDItem) - } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _PoAValidatorManager.contract.WatchLogs(opts, "ValidatorWeightUpdate", validationIDRule, nonceRule) - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(PoAValidatorManagerValidatorWeightUpdate) - if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseValidatorWeightUpdate is a log parse operation binding the contract event 0x07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df. -// -// Solidity: event ValidatorWeightUpdate(bytes32 indexed validationID, uint64 indexed nonce, uint64 validatorWeight, bytes32 setWeightMessageID) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidatorWeightUpdate(log types.Log) (*PoAValidatorManagerValidatorWeightUpdate, error) { - event := new(PoAValidatorManagerValidatorWeightUpdate) - if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidatorWeightUpdate", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} From 44807c99163e18856e36d838c4a149f1e7ae31f6 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Wed, 18 Sep 2024 16:17:59 -0400 Subject: [PATCH 342/545] update imports --- tests/flows/staking/poa_to_pos.go | 4 ++-- tests/flows/staking/poa_validator_manager.go | 2 +- tests/utils/staking.go | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index b8daa4a6e..23bd72ba5 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -6,8 +6,8 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" - poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" + nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/NativeTokenStakingManager" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/crypto" diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/staking/poa_validator_manager.go index fd31fa53d..6a51ea077 100644 --- a/tests/flows/staking/poa_validator_manager.go +++ b/tests/flows/staking/poa_validator_manager.go @@ -8,7 +8,7 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/crypto" diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 1c26f63c1..b215c822c 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -21,10 +21,10 @@ import ( "github.com/ava-labs/subnet-evm/precompile/contracts/warp" predicateutils "github.com/ava-labs/subnet-evm/predicate" exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" - erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/ERC20TokenStakingManager" - examplerewardcalculator "github.com/ava-labs/teleporter/abi-bindings/go/staking/ExampleRewardCalculator" - nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/NativeTokenStakingManager" - poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/staking/PoAValidatorManager" + erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/ERC20TokenStakingManager" + examplerewardcalculator "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/ExampleRewardCalculator" + nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/NativeTokenStakingManager" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ethereum/go-ethereum/common" From 13e210b97c629d855315c68d6e3b2df585c3c662 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 17:02:28 -0400 Subject: [PATCH 343/545] Review fixes --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 22 ++++++++++++++----- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 7c508d3ba..ead1c87ba 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615e8b380380615e8b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d3e8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f3660046150a1565b6103bf565b005b6101846101943660046150dc565b610862565b6101d76101a73660046150dc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b6102176102123660046150dc565b610a1b565b6040516001600160401b0390911681526020016101e1565b61018461023d366004615107565b610a31565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c366004615145565b610b10565b61018461027f36600461515e565b610bb0565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af366004615186565b610d85565b6101d76102c23660046151ea565b6113b9565b6102176102d53660046150dc565b6113d2565b6101846102e83660046150a1565b6113e6565b6101f2603081565b61018461030336600461515e565b6115e0565b6101d7610316366004615203565b611862565b610184610329366004615145565b61188e565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b6101846103623660046150dc565b611a46565b6101846103753660046150dc565b611ccc565b6101f2601481565b6103956103903660046150dc565b611de0565b6040516101e19190615237565b6102176202a30081565b6101d76103ba3660046152fe565b611ea8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615c92833981519152949193919290829060ff16600481111561042757610427615223565b600481111561043857610438615223565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104b483611de0565b90506002825160048111156104cb576104cb615223565b1461051d5760405162461bcd60e51b815260206004820152602a60248201525f80516020615cb28339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105825760405162461bcd60e51b815260206004820152603360248201525f80516020615cb28339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610514565b6003825280515f90600290600581111561059e5761059e615223565b036105f55786156105b6576105b38487611edd565b90505b5f836060015183608001516105cb9190615377565b90506105d78582612179565b506001600160401b0390811660e0860152421660a085015250610629565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561065c85606001516113b9565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fd9190615397565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561073c5761073c615223565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610850916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615d128339815191526020526040808220815160e0810190925280545f80516020615cd283398151915293929190829060ff1660058111156108af576108af615223565b60058111156108c0576108c0615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561092f5761092f615223565b146109945760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb6109b98584606001515f6122d0565b6040518263ffffffff1660e01b81526004016109d591906153d0565b6020604051808303815f875af11580156109f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a159190615397565b50505050565b5f610a2b64e8d4a5100083615402565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a7a575080546001600160401b03808416911610155b15610a985760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ac384846124f7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615c928339815191525f80610b2984612511565b91509150610b368261285b565b610b405750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b6e57610b6e615223565b03610b93575f83815260088501602052604081208054919055610b918282612896565b505b610ba981610ba484604001516113b9565b61290c565b5050505050565b5f80516020615c928339815191525f610bc88461292f565b90505f80610bd98360400151612b09565b50915091505f610be883611de0565b9050816001600160401b031681606001516001600160401b03161015610c205760405162461bcd60e51b815260040161051490615421565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c655760405162461bcd60e51b815260040161051490615463565b60015f87815260068701602052604090205460ff166004811115610c8b57610c8b615223565b14610cf45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610514565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615cd28339815191529060ff1615610e225760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e899190615397565b836020013514610eeb5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610514565b30610efc60608501604086016154ac565b6001600160a01b031614610f6e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610514565b5f610f7c60608501856154c7565b91505f9050843560208601356014610f9a6060890160408a016154ac565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112c9575f61101a60608901896154c7565b8363ffffffff168181106110305761103061550c565b90506020028101906110429190615520565b61104b906155d0565b80515f818152600989016020526040902054919250901561107e5760405162461bcd60e51b815260040161051490615667565b84825f0151836020015184604001516040516020016110a094939291906156af565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110ee91906156fe565b602060405180830381855afa158015611109573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061112c9190615397565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111b8576111b8615223565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161126b91168661570f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112c290615722565b9050610ffe565b50600584018190555f6112db8661292f565b90505f6112eb8260400151612d44565b9050806002856040516112fe91906156fe565b602060405180830381855afa158015611319573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133c9190615397565b146113a05760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610514565b505050600a909201805460ff1916600117905550505050565b5f610a2b6001600160401b03831664e8d4a51000615744565b5f6113dc82611de0565b6080015192915050565b5f80516020615c928339815191525f6113fe85612eb6565b5f86815260058401602052604090205460a082015191925061143191600160b01b9091046001600160401b03169061575b565b6001600160401b03168160c001516001600160401b031610156114b25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610514565b8315610ba9575f6114c38685611edd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061151a906113b9565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611590573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b49190615397565b5f878152600885016020526040812080549091906115d390849061570f565b9091555050505050505050565b6115e8613131565b5f80516020615c928339815191525f6116008461292f565b90505f806116118360400151612b09565b50915091505f61162083611de0565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561165a5761165a615223565b600481111561166b5761166b615223565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561170a5760405162461bcd60e51b815260040161051490615421565b826001600160401b03168160e001516001600160401b031611156117405760405162461bcd60e51b815260040161051490615463565b60038151600481111561175557611755615223565b146117a95760405162461bcd60e51b815260206004820152603160248201525f80516020615cb28339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610514565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a01909252909120546117df9190612896565b856007015f8881526020019081526020015f205f905561180a8160200151610ba483606001516113b9565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061185e60015f80516020615cf283398151915255565b5050565b5f61186b613131565b61187683338461317b565b9050610a2b60015f80516020615cf283398151915255565b5f80516020615cd28339815191525f6118a68361292f565b90505f806118b78360400151613535565b91509150806119195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610514565b5f828152600785016020526040812080546119339061577b565b9050118015611965575060015f83815260088601602052604090205460ff16600581111561196357611963615223565b145b6119815760405162461bcd60e51b8152600401610514906157b3565b5f828152600785016020526040812061199991614ff1565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615c9283398151915293929190829060ff166004811115611aa757611aa7615223565b6004811115611ab857611ab8615223565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b3f57611b3f615223565b1480611b5d5750600381516004811115611b5b57611b5b615223565b145b611bb15760405162461bcd60e51b815260206004820152603260248201525f80516020615cb2833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610514565b5f611bbf8260400151611de0565b905080606001516001600160401b03165f03611c435760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb611c708460400151846060015185608001516122d0565b6040518263ffffffff1660e01b8152600401611c8c91906153d0565b6020604051808303815f875af1158015611ca8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba99190615397565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615cd2833981519152929190611d149061577b565b9050118015611d46575060015f83815260088301602052604090205460ff166005811115611d4457611d44615223565b145b611d625760405162461bcd60e51b8152600401610514906157b3565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d9b91906004016157fa565b6020604051808303815f875af1158015611db7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ddb9190615397565b505050565b611de8615028565b5f8281525f80516020615d12833981519152602052604090819020815160e0810190925280545f80516020615cd2833981519152929190829060ff166005811115611e3557611e35615223565b6005811115611e4657611e46615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611eb1613131565b611ebd858585856136d6565b9050611ed560015f80516020615cf283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f28573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f4f919081019061588f565b9150915080611fb25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ff5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120199190615397565b82511461207d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610514565b60208201516001600160a01b0316156120f35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610514565b5f80612102846040015161394b565b9150915081871461216f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610514565b9695505050505050565b5f8281525f80516020615d12833981519152602052604081206002015481905f80516020615cd283398151915290600160801b90046001600160401b03166121c18582613b23565b5f6121cb87613d31565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61221b8a858b6122d0565b6040518263ffffffff1660e01b815260040161223791906153d0565b6020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190615397565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561234957612309816001615961565b612314906008615744565b5081515f9083908390811061232b5761232b61550c565b60200101906001600160f81b03191690815f1a9053506001016122f5565b505f5b60048110156123b457612360816003615961565b61236b906008615744565b600263ffffffff16901c60f81b82826002612386919061570f565b815181106123965761239661550c565b60200101906001600160f81b03191690815f1a90535060010161234c565b505f5b6020811015612416576123cb81601f615961565b6123d6906008615744565b86901c60f81b826123e883600661570f565b815181106123f8576123f861550c565b60200101906001600160f81b03191690815f1a9053506001016123b7565b505f5b60088110156124815761242d816007615961565b612438906008615744565b6001600160401b038616901c60f81b8261245383602661570f565b815181106124635761246361550c565b60200101906001600160f81b03191690815f1a905350600101612419565b505f5b60088110156124ec57612498816007615961565b6124a3906008615744565b6001600160401b038516901c60f81b826124be83602e61570f565b815181106124ce576124ce61550c565b60200101906001600160f81b03191690815f1a905350600101612484565b5090505b9392505050565b6124ff613dc1565b61250882613e0c565b61185e81613e83565b5f61251a615028565b5f80516020615cd28339815191525f6125328561292f565b90505f806125438360400151613535565b9150915080156125a85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610514565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156125d9576125d9615223565b60058111156125ea576125ea615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561265b5761265b615223565b1480612679575060018251600581111561267757612677615223565b145b6126d85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610514565b6003825160058111156126ed576126ed615223565b036126fa575060046126fe565b5060055b6020808301515f9081526009880190915260408120558181600581111561272757612727615223565b9081600581111561273a5761273a615223565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561276e5761276e615223565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561282257612822615223565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615c7283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156128f1575f80fd5b505af1158015612903573d5f803e3d5ffd5b50505050505050565b5f80516020615c728339815191525461185e906001600160a01b03168383613f24565b60408051606080820183525f8083526020830181905292820152905f80516020615cd28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156129a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129cb919081019061588f565b9150915080612a2b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610514565b8254825114612a8e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610514565b60208201516001600160a01b031615612b015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610514565b509392505050565b5f805f8351603614612b2d5760405162461bcd60e51b815260040161051490615974565b5f805b6002811015612b7c57612b44816001615961565b612b4f906008615744565b61ffff16868281518110612b6557612b6561550c565b016020015160f81c901b9190911790600101612b30565b5061ffff811615612b9f5760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015612bfa57612bb6816003615961565b612bc1906008615744565b63ffffffff1687612bd383600261570f565b81518110612be357612be361550c565b016020015160f81c901b9190911790600101612ba2565b5063ffffffff8116600414612c215760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015612c7657612c3881601f615961565b612c43906008615744565b88612c4f83600661570f565b81518110612c5f57612c5f61550c565b016020015160f81c901b9190911790600101612c24565b505f805b6008811015612cd557612c8e816007615961565b612c99906008615744565b6001600160401b031689612cae83602661570f565b81518110612cbe57612cbe61550c565b016020015160f81c901b9190911790600101612c7a565b505f805b6008811015612d3457612ced816007615961565b612cf8906008615744565b6001600160401b03168a612d0d83602e61570f565b81518110612d1d57612d1d61550c565b016020015160f81c901b9190911790600101612cd9565b5091989097509095509350505050565b5f8151602614612d665760405162461bcd60e51b815260040161051490615974565b5f805b6002811015612db557612d7d816001615961565b612d88906008615744565b61ffff16848281518110612d9e57612d9e61550c565b016020015160f81c901b9190911790600101612d69565b5061ffff811615612dd85760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015612e3357612def816003615961565b612dfa906008615744565b63ffffffff1685612e0c83600261570f565b81518110612e1c57612e1c61550c565b016020015160f81c901b9190911790600101612ddb565b5063ffffffff811615612e585760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015612ead57612e6f81601f615961565b612e7a906008615744565b86612e8683600661570f565b81518110612e9657612e9661550c565b016020015160f81c901b9190911790600101612e5b565b50949350505050565b612ebe615028565b5f8281525f80516020615d128339815191526020526040808220815160e0810190925280545f80516020615cd283398151915293929190829060ff166005811115612f0b57612f0b615223565b6005811115612f1c57612f1c615223565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612f8e57612f8e615223565b14612fea5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610514565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561302e5761302e615223565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130da8582612179565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615cf283398151915280546001190161316257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615cf283398151915255565b5f5f80516020615c928339815191528161319761021285613f83565b90505f6131a387611de0565b90506131ae8761285b565b61320b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610514565b60028151600581111561322057613220615223565b1461327f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610514565b5f828260800151613290919061575b565b600485015460408401519192506132b2916001600160401b0390911690615a47565b6001600160401b0316816001600160401b031611156133315760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610514565b5f8061333d8a84612179565b915091505f8a8360405160200161336b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561340657613406615223565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146135585760405162461bcd60e51b815260040161051490615974565b5f805b60028110156135a75761356f816001615961565b61357a906008615744565b61ffff168582815181106135905761359061550c565b016020015160f81c901b919091179060010161355b565b5061ffff8116156135ca5760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015613625576135e1816003615961565b6135ec906008615744565b63ffffffff16866135fe83600261570f565b8151811061360e5761360e61550c565b016020015160f81c901b91909117906001016135cd565b5063ffffffff811660031461364c5760405162461bcd60e51b815260040161051490615a00565b5f805b60208110156136a15761366381601f615961565b61366e906008615744565b8761367a83600661570f565b8151811061368a5761368a61550c565b016020015160f81c901b919091179060010161364f565b505f866026815181106136b6576136b661550c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615c928339815191529061ffff861610801590613722575061271061ffff861611155b61373e5760405162461bcd60e51b815260040161051490615a72565b60028101546001600160401b0390811690851610156137b75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610514565b805483101561381a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610514565b80600101548311156138815760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610514565b5f61388b84613f83565b90505f61389782610a1b565b90505f6138a48983613fa6565b905060405180606001604052806138b83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e1461396e5760405162461bcd60e51b815260040161051490615974565b5f805b60028110156139bd57613985816001615961565b613990906008615744565b61ffff168582815181106139a6576139a661550c565b016020015160f81c901b9190911790600101613971565b5061ffff8116156139e05760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015613a3b576139f7816003615961565b613a02906008615744565b63ffffffff1686613a1483600261570f565b81518110613a2457613a2461550c565b016020015160f81c901b91909117906001016139e3565b5063ffffffff8116600514613a625760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015613ab757613a7981601f615961565b613a84906008615744565b87613a9083600661570f565b81518110613aa057613aa061550c565b016020015160f81c901b9190911790600101613a65565b505f805b6008811015613b1657613acf816007615961565b613ada906008615744565b6001600160401b031688613aef83602661570f565b81518110613aff57613aff61550c565b016020015160f81c901b9190911790600101613abb565b5090969095509350505050565b5f80516020615cd28339815191525f6001600160401b038084169085161115613b5757613b508385615377565b9050613b64565b613b618484615377565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613bc6575060028401548151613bc2916001600160401b03169061570f565b8210155b15613bec576001600160401b038316606082015281815260408101516020820152613c0b565b8281606001818151613bfe919061575b565b6001600160401b03169052505b6060810151613c1b906064615a47565b602082015160028601546001600160401b039290921691613c469190600160401b900460ff16615744565b1015613caa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610514565b856001600160401b031681604001818151613cc5919061570f565b9052506040810180516001600160401b0387169190613ce5908390615961565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d128339815191526020526040812060020180545f80516020615cd283398151915291600160401b9091046001600160401b0316906008613d7b83615abd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e0a57604051631afcd79f60e31b815260040160405180910390fd5b565b613e14613dc1565b613e1d8161450b565b613e25614524565b613e80608082013560a0830135613e4260e0850160c086016151ea565b613e53610100860160e08701615ad8565b61ffff16613e6961012087016101008801615af1565b613e7b610140880161012089016154ac565b614534565b50565b613e8b613dc1565b5f80516020615c728339815191526001600160a01b038216613f045760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610514565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ddb91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614778565b5f610a2b825f80516020615c72833981519152546001600160a01b0316906147d9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140315760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610514565b5f80516020615cd28339815191524261405060408601602087016151ea565b6001600160401b0316116140c25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610514565b6140d260408501602086016151ea565b6001600160401b03166140e86202a3004261570f565b1161415b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610514565b83356141b35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610514565b83355f908152600982016020526040902054156141e25760405162461bcd60e51b815260040161051490615667565b60306141f16040860186615b11565b9050146142565760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610514565b614260835f613b23565b5f806142fa6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906142a591906151ea565b6001600160401b031681526020016142c060408a018a615b11565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061493b565b5f828152600786016020526040902091935091506143188282615b97565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143459085906004016153d0565b6020604051808303815f875af1158015614361573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143859190615397565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156143fd576143fd615223565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916144dd918e01908e016151ea565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614513613dc1565b61451b614cea565b613e8081614cf2565b61452c613dc1565b613e0a614e94565b61453c613dc1565b5f80516020615c92833981519152836145a85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610514565b6127108411156145ca5760405162461bcd60e51b815260040161051490615a72565b858711156146325760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610514565b5f8360ff161161469f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610514565b600a60ff841611156147115760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610514565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61478c6001600160a01b03841683614e9c565b905080515f141580156147b05750808060200190518101906147ae9190615c56565b155b15611ddb57604051635274afe760e01b81526001600160a01b0384166004820152602401610514565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561481f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148439190615397565b905061485a6001600160a01b038516333086614ea9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561489e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148c29190615397565b90508181116149285760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610514565b6149328282615961565b95945050505050565b5f60608260800151516030146149a55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610514565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614a1c576149dc816001615961565b6149e7906008615744565b5081515f908390839081106149fe576149fe61550c565b60200101906001600160f81b03191690815f1a9053506001016149c8565b505f5b6004811015614a8457614a33816003615961565b614a3e906008615744565b600160ff919091161c60f81b82614a5683600261570f565b81518110614a6657614a6661550c565b60200101906001600160f81b03191690815f1a905350600101614a1f565b505f5b6020811015614ae15784518160208110614aa357614aa361550c565b1a60f81b82614ab383600661570f565b81518110614ac357614ac361550c565b60200101906001600160f81b03191690815f1a905350600101614a87565b505f5b6020811015614b415784602001518160208110614b0357614b0361550c565b1a60f81b82614b1383602661570f565b81518110614b2357614b2361550c565b60200101906001600160f81b03191690815f1a905350600101614ae4565b505f5b6008811015614bb557614b58816007615961565b614b63906008615744565b60ff1685604001516001600160401b0316901c60f81b82826046614b87919061570f565b81518110614b9757614b9761550c565b60200101906001600160f81b03191690815f1a905350600101614b44565b505f5b6030811015614c205784608001518181518110614bd757614bd761550c565b01602001516001600160f81b03191682614bf283604e61570f565b81518110614c0257614c0261550c565b60200101906001600160f81b03191690815f1a905350600101614bb8565b505f5b6008811015614c9257614c37816007615961565b614c42906008615744565b60608601516001600160401b0390811691161c60f81b82614c6483607e61570f565b81518110614c7457614c7461550c565b60200101906001600160f81b03191690815f1a905350600101614c23565b50600281604051614ca391906156fe565b602060405180830381855afa158015614cbe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ce19190615397565b94909350915050565b613e0a613dc1565b614cfa613dc1565b80355f80516020615cd283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614d466080840160608501615af1565b60ff161115614db35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610514565b5f614dc46080840160608501615af1565b60ff1611614e2c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610514565b614e3c6080830160608401615af1565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614e6d60608301604084016151ea565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613168613dc1565b60606124f083835f614ee2565b6040516001600160a01b038481166024830152838116604483015260648201839052610a159186918216906323b872dd90608401613f51565b606081471015614f075760405163cd78605960e01b8152306004820152602401610514565b5f80856001600160a01b03168486604051614f2291906156fe565b5f6040518083038185875af1925050503d805f8114614f5c576040519150601f19603f3d011682016040523d82523d5f602084013e614f61565b606091505b509150915061216f868383606082614f8157614f7c82614fc8565b6124f0565b8151158015614f9857506001600160a01b0384163b155b15614fc157604051639996b31560e01b81526001600160a01b0385166004820152602401610514565b50806124f0565b805115614fd85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ffd9061577b565b5f825580601f1061500c575050565b601f0160209004905f5260205f2090810190613e809190615064565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615078575f8155600101615065565b5090565b8015158114613e80575f80fd5b803563ffffffff8116811461509c575f80fd5b919050565b5f805f606084860312156150b3575f80fd5b8335925060208401356150c58161507c565b91506150d360408501615089565b90509250925092565b5f602082840312156150ec575f80fd5b5035919050565b6001600160a01b0381168114613e80575f80fd5b5f8082840361016081121561511a575f80fd5b61014080821215615129575f80fd5b849350830135905061513a816150f3565b809150509250929050565b5f60208284031215615155575f80fd5b6124f082615089565b5f806040838503121561516f575f80fd5b61517883615089565b946020939093013593505050565b5f8060408385031215615197575f80fd5b82356001600160401b038111156151ac575f80fd5b8301608081860312156151bd575f80fd5b91506151cb60208401615089565b90509250929050565b80356001600160401b038116811461509c575f80fd5b5f602082840312156151fa575f80fd5b6124f0826151d4565b5f8060408385031215615214575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061525a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161529560608401826001600160401b03169052565b5060808301516152b060808401826001600160401b03169052565b5060a08301516152cb60a08401826001600160401b03169052565b5060c08301516152e660c08401826001600160401b03169052565b5092915050565b803561ffff8116811461509c575f80fd5b5f805f8060808587031215615311575f80fd5b84356001600160401b03811115615326575f80fd5b850160608188031215615337575f80fd5b9350615345602086016152ed565b9250615353604086016151d4565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156152e6576152e6615363565b5f602082840312156153a7575f80fd5b5051919050565b5f5b838110156153c85781810151838201526020016153b0565b50505f910152565b602081525f82518060208401526153ee8160408501602087016153ae565b601f01601f19169190910160400192915050565b5f8261541c57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156154bc575f80fd5b81356124f0816150f3565b5f808335601e198436030181126154dc575f80fd5b8301803591506001600160401b038211156154f5575f80fd5b6020019150600581901b36038213156122c9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615534575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156155745761557461553e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156155a2576155a261553e565b604052919050565b5f6001600160401b038211156155c2576155c261553e565b50601f01601f191660200190565b5f606082360312156155e0575f80fd5b6155e8615552565b8235815260206155f98185016151d4565b8183015260408401356001600160401b03811115615615575f80fd5b840136601f820112615625575f80fd5b8035615638615633826155aa565b61557a565b818152368483850101111561564b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516156c0818460208a016153ae565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156f08160288401602088016153ae565b016028019695505050505050565b5f82516155348184602087016153ae565b80820180821115610a2b57610a2b615363565b5f63ffffffff80831681810361573a5761573a615363565b6001019392505050565b8082028115828204841417610a2b57610a2b615363565b6001600160401b038181168382160190808211156152e6576152e6615363565b600181811c9082168061578f57607f821691505b6020821081036157ad57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461580c8161577b565b806020870152604060018084165f811461582d576001811461584957615876565b60ff19851660408a0152604084151560051b8a01019550615876565b895f5260205f205f5b8581101561586d5781548b8201860152908301908801615852565b8a016040019650505b509398975050505050505050565b805161509c8161507c565b5f80604083850312156158a0575f80fd5b82516001600160401b03808211156158b6575f80fd5b90840190606082870312156158c9575f80fd5b6158d1615552565b825181526020808401516158e4816150f3565b828201526040840151838111156158f9575f80fd5b80850194505087601f85011261590d575f80fd5b8351925061591d615633846155aa565b8381528882858701011115615930575f80fd5b61593f848383018488016153ae565b80604084015250819550615954818801615884565b9450505050509250929050565b81810381811115610a2b57610a2b615363565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a6a57615a6a615363565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361573a5761573a615363565b5f60208284031215615ae8575f80fd5b6124f0826152ed565b5f60208284031215615b01575f80fd5b813560ff811681146124f0575f80fd5b5f808335601e19843603018112615b26575f80fd5b8301803591506001600160401b03821115615b3f575f80fd5b6020019150368190038213156122c9575f80fd5b601f821115611ddb57805f5260205f20601f840160051c81016020851015615b785750805b601f840160051c820191505b81811015610ba9575f8155600101615b84565b81516001600160401b03811115615bb057615bb061553e565b615bc481615bbe845461577b565b84615b53565b602080601f831160018114615bf7575f8415615be05750858301515b5f19600386901b1c1916600185901b178555615c4e565b5f85815260208120601f198616915b82811015615c2557888601518255948401946001909101908401615c06565b5085821015615c4257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615c66575f80fd5b81516124f08161507c56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615f2d380380615f2d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615de08061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f366004615143565b6103bf565b005b61018461019436600461517e565b610862565b6101d76101a736600461517e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b61021761021236600461517e565b610a1b565b6040516001600160401b0390911681526020016101e1565b61018461023d3660046151a9565b610a31565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c3660046151e7565b610b10565b61018461027f366004615200565b610bb0565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af366004615228565b610d85565b6101d76102c236600461528c565b6113b9565b6102176102d536600461517e565b6113d2565b6101846102e8366004615143565b6113e6565b6101f2603081565b610184610303366004615200565b6115f2565b6101d76103163660046152a5565b611904565b6101846103293660046151e7565b611930565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b61018461036236600461517e565b611ae8565b61018461037536600461517e565b611d6e565b6101f2601481565b61039561039036600461517e565b611e82565b6040516101e191906152d9565b6102176202a30081565b6101d76103ba3660046153a0565b611f4a565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615d34833981519152949193919290829060ff166004811115610427576104276152c5565b6004811115610438576104386152c5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104b483611e82565b90506002825160048111156104cb576104cb6152c5565b1461051d5760405162461bcd60e51b815260206004820152602a60248201525f80516020615d548339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105825760405162461bcd60e51b815260206004820152603360248201525f80516020615d548339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610514565b6003825280515f90600290600581111561059e5761059e6152c5565b036105f55786156105b6576105b38487611f7f565b90505b5f836060015183608001516105cb9190615419565b90506105d7858261221b565b506001600160401b0390811660e0860152421660a085015250610629565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561065c85606001516113b9565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fd9190615439565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561073c5761073c6152c5565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610850916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615db48339815191526020526040808220815160e0810190925280545f80516020615d7483398151915293929190829060ff1660058111156108af576108af6152c5565b60058111156108c0576108c06152c5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561092f5761092f6152c5565b146109945760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb6109b98584606001515f612372565b6040518263ffffffff1660e01b81526004016109d59190615472565b6020604051808303815f875af11580156109f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a159190615439565b50505050565b5f610a2b64e8d4a51000836154a4565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a7a575080546001600160401b03808416911610155b15610a985760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ac38484612599565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615d348339815191525f80610b29846125b3565b91509150610b36826128fd565b610b405750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b6e57610b6e6152c5565b03610b93575f83815260088501602052604081208054919055610b918282612938565b505b610ba981610ba484604001516113b9565b6129ae565b5050505050565b5f80516020615d348339815191525f610bc8846129d1565b90505f80610bd98360400151612bab565b50915091505f610be883611e82565b9050816001600160401b031681606001516001600160401b03161015610c205760405162461bcd60e51b8152600401610514906154c3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c655760405162461bcd60e51b815260040161051490615505565b60015f87815260068701602052604090205460ff166004811115610c8b57610c8b6152c5565b14610cf45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610514565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615d748339815191529060ff1615610e225760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e899190615439565b836020013514610eeb5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610514565b30610efc606085016040860161554e565b6001600160a01b031614610f6e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610514565b5f610f7c6060850185615569565b91505f9050843560208601356014610f9a6060890160408a0161554e565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112c9575f61101a6060890189615569565b8363ffffffff16818110611030576110306155ae565b905060200281019061104291906155c2565b61104b90615672565b80515f818152600989016020526040902054919250901561107e5760405162461bcd60e51b815260040161051490615709565b84825f0151836020015184604001516040516020016110a09493929190615751565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110ee91906157a0565b602060405180830381855afa158015611109573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061112c9190615439565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111b8576111b86152c5565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161126b9116866157b1565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112c2906157c4565b9050610ffe565b50600584018190555f6112db866129d1565b90505f6112eb8260400151612de6565b9050806002856040516112fe91906157a0565b602060405180830381855afa158015611319573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133c9190615439565b146113a05760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610514565b505050600a909201805460ff1916600117905550505050565b5f610a2b6001600160401b03831664e8d4a510006157e6565b5f6113dc82611e82565b6080015192915050565b5f80516020615d348339815191525f6113fe85612f58565b9050611409856128fd565b611414575050505050565b5f85815260058301602052604090205460a082015161144391600160b01b90046001600160401b0316906157fd565b6001600160401b03168160c001516001600160401b031610156114c45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610514565b8315610ba9575f6114d58685611f7f565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061152c906113b9565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156115a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c69190615439565b5f878152600885016020526040812080549091906115e59084906157b1565b9091555050505050505050565b6115fa6131d3565b5f80516020615d348339815191525f611612846129d1565b90505f806116238360400151612bab565b50915091505f61163283611e82565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561166c5761166c6152c5565b600481111561167d5761167d6152c5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561171c5760405162461bcd60e51b8152600401610514906154c3565b826001600160401b03168160e001516001600160401b031611156117525760405162461bcd60e51b815260040161051490615505565b600381516004811115611767576117676152c5565b146117bb5760405162461bcd60e51b815260206004820152603160248201525f80516020615d548339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610514565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a01909252822054909190612710906118119061ffff600160a01b90910416846157e6565b61181b91906154a4565b905080886008015f8881526020019081526020015f205f82825461183f91906157b1565b9091555050602083015161185c90611857838561581d565b612938565b6118718360200151610ba485606001516113b9565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a4505050505050505061190060015f80516020615d9483398151915255565b5050565b5f61190d6131d3565b61191883338461321d565b9050610a2b60015f80516020615d9483398151915255565b5f80516020615d748339815191525f611948836129d1565b90505f8061195983604001516135d7565b91509150806119bb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610514565b5f828152600785016020526040812080546119d590615830565b9050118015611a07575060015f83815260088601602052604090205460ff166005811115611a0557611a056152c5565b145b611a235760405162461bcd60e51b815260040161051490615868565b5f8281526007850160205260408120611a3b91615093565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615d3483398151915293929190829060ff166004811115611b4957611b496152c5565b6004811115611b5a57611b5a6152c5565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611be157611be16152c5565b1480611bff5750600381516004811115611bfd57611bfd6152c5565b145b611c535760405162461bcd60e51b815260206004820152603260248201525f80516020615d54833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610514565b5f611c618260400151611e82565b905080606001516001600160401b03165f03611ce55760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb611d12846040015184606001518560800151612372565b6040518263ffffffff1660e01b8152600401611d2e9190615472565b6020604051808303815f875af1158015611d4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba99190615439565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615d74833981519152929190611db690615830565b9050118015611de8575060015f83815260088301602052604090205460ff166005811115611de657611de66152c5565b145b611e045760405162461bcd60e51b815260040161051490615868565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611e3d91906004016158af565b6020604051808303815f875af1158015611e59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e7d9190615439565b505050565b611e8a6150ca565b5f8281525f80516020615db4833981519152602052604090819020815160e0810190925280545f80516020615d74833981519152929190829060ff166005811115611ed757611ed76152c5565b6005811115611ee857611ee86152c5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611f536131d3565b611f5f85858585613778565b9050611f7760015f80516020615d9483398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611fca573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ff19190810190615944565b91509150806120545760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612097573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120bb9190615439565b82511461211f5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610514565b60208201516001600160a01b0316156121955760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610514565b5f806121a484604001516139ed565b915091508187146122115760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610514565b9695505050505050565b5f8281525f80516020615db4833981519152602052604081206002015481905f80516020615d7483398151915290600160801b90046001600160401b03166122638582613bc5565b5f61226d87613dd3565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6122bd8a858b612372565b6040518263ffffffff1660e01b81526004016122d99190615472565b6020604051808303815f875af11580156122f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123199190615439565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156123eb576123ab81600161581d565b6123b69060086157e6565b5081515f908390839081106123cd576123cd6155ae565b60200101906001600160f81b03191690815f1a905350600101612397565b505f5b60048110156124565761240281600361581d565b61240d9060086157e6565b600263ffffffff16901c60f81b8282600261242891906157b1565b81518110612438576124386155ae565b60200101906001600160f81b03191690815f1a9053506001016123ee565b505f5b60208110156124b85761246d81601f61581d565b6124789060086157e6565b86901c60f81b8261248a8360066157b1565b8151811061249a5761249a6155ae565b60200101906001600160f81b03191690815f1a905350600101612459565b505f5b6008811015612523576124cf81600761581d565b6124da9060086157e6565b6001600160401b038616901c60f81b826124f58360266157b1565b81518110612505576125056155ae565b60200101906001600160f81b03191690815f1a9053506001016124bb565b505f5b600881101561258e5761253a81600761581d565b6125459060086157e6565b6001600160401b038516901c60f81b8261256083602e6157b1565b81518110612570576125706155ae565b60200101906001600160f81b03191690815f1a905350600101612526565b5090505b9392505050565b6125a1613e63565b6125aa82613eae565b61190081613f25565b5f6125bc6150ca565b5f80516020615d748339815191525f6125d4856129d1565b90505f806125e583604001516135d7565b91509150801561264a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610514565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561267b5761267b6152c5565b600581111561268c5761268c6152c5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156126fd576126fd6152c5565b148061271b5750600182516005811115612719576127196152c5565b145b61277a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610514565b60038251600581111561278f5761278f6152c5565b0361279c575060046127a0565b5060055b6020808301515f908152600988019091526040812055818160058111156127c9576127c96152c5565b908160058111156127dc576127dc6152c5565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612810576128106152c5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156128c4576128c46152c5565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615d1483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612993575f80fd5b505af11580156129a5573d5f803e3d5ffd5b50505050505050565b5f80516020615d1483398151915254611900906001600160a01b03168383613fc6565b60408051606080820183525f8083526020830181905292820152905f80516020615d748339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a46573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a6d9190810190615944565b9150915080612acd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610514565b8254825114612b305760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610514565b60208201516001600160a01b031615612ba35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610514565b509392505050565b5f805f8351603614612bcf5760405162461bcd60e51b815260040161051490615a16565b5f805b6002811015612c1e57612be681600161581d565b612bf19060086157e6565b61ffff16868281518110612c0757612c076155ae565b016020015160f81c901b9190911790600101612bd2565b5061ffff811615612c415760405162461bcd60e51b815260040161051490615a5f565b5f805b6004811015612c9c57612c5881600361581d565b612c639060086157e6565b63ffffffff1687612c758360026157b1565b81518110612c8557612c856155ae565b016020015160f81c901b9190911790600101612c44565b5063ffffffff8116600414612cc35760405162461bcd60e51b815260040161051490615aa2565b5f805b6020811015612d1857612cda81601f61581d565b612ce59060086157e6565b88612cf18360066157b1565b81518110612d0157612d016155ae565b016020015160f81c901b9190911790600101612cc6565b505f805b6008811015612d7757612d3081600761581d565b612d3b9060086157e6565b6001600160401b031689612d508360266157b1565b81518110612d6057612d606155ae565b016020015160f81c901b9190911790600101612d1c565b505f805b6008811015612dd657612d8f81600761581d565b612d9a9060086157e6565b6001600160401b03168a612daf83602e6157b1565b81518110612dbf57612dbf6155ae565b016020015160f81c901b9190911790600101612d7b565b5091989097509095509350505050565b5f8151602614612e085760405162461bcd60e51b815260040161051490615a16565b5f805b6002811015612e5757612e1f81600161581d565b612e2a9060086157e6565b61ffff16848281518110612e4057612e406155ae565b016020015160f81c901b9190911790600101612e0b565b5061ffff811615612e7a5760405162461bcd60e51b815260040161051490615a5f565b5f805b6004811015612ed557612e9181600361581d565b612e9c9060086157e6565b63ffffffff1685612eae8360026157b1565b81518110612ebe57612ebe6155ae565b016020015160f81c901b9190911790600101612e7d565b5063ffffffff811615612efa5760405162461bcd60e51b815260040161051490615aa2565b5f805b6020811015612f4f57612f1181601f61581d565b612f1c9060086157e6565b86612f288360066157b1565b81518110612f3857612f386155ae565b016020015160f81c901b9190911790600101612efd565b50949350505050565b612f606150ca565b5f8281525f80516020615db48339815191526020526040808220815160e0810190925280545f80516020615d7483398151915293929190829060ff166005811115612fad57612fad6152c5565b6005811115612fbe57612fbe6152c5565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613030576130306152c5565b1461308c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610514565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156130d0576130d06152c5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61317c858261221b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615d9483398151915280546001190161320457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615d9483398151915255565b5f5f80516020615d348339815191528161323961021285614025565b90505f61324587611e82565b9050613250876128fd565b6132ad5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610514565b6002815160058111156132c2576132c26152c5565b146133215760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610514565b5f82826080015161333291906157fd565b60048501546040840151919250613354916001600160401b0390911690615ae9565b6001600160401b0316816001600160401b031611156133d35760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610514565b5f806133df8a8461221b565b915091505f8a8360405160200161340d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156134a8576134a86152c5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146135fa5760405162461bcd60e51b815260040161051490615a16565b5f805b60028110156136495761361181600161581d565b61361c9060086157e6565b61ffff16858281518110613632576136326155ae565b016020015160f81c901b91909117906001016135fd565b5061ffff81161561366c5760405162461bcd60e51b815260040161051490615a5f565b5f805b60048110156136c75761368381600361581d565b61368e9060086157e6565b63ffffffff16866136a08360026157b1565b815181106136b0576136b06155ae565b016020015160f81c901b919091179060010161366f565b5063ffffffff81166003146136ee5760405162461bcd60e51b815260040161051490615aa2565b5f805b60208110156137435761370581601f61581d565b6137109060086157e6565b8761371c8360066157b1565b8151811061372c5761372c6155ae565b016020015160f81c901b91909117906001016136f1565b505f86602681518110613758576137586155ae565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615d348339815191529061ffff8616108015906137c4575061271061ffff861611155b6137e05760405162461bcd60e51b815260040161051490615b14565b60028101546001600160401b0390811690851610156138595760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610514565b80548310156138bc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610514565b80600101548311156139235760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610514565b5f61392d84614025565b90505f61393982610a1b565b90505f6139468983614048565b9050604051806060016040528061395a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613a105760405162461bcd60e51b815260040161051490615a16565b5f805b6002811015613a5f57613a2781600161581d565b613a329060086157e6565b61ffff16858281518110613a4857613a486155ae565b016020015160f81c901b9190911790600101613a13565b5061ffff811615613a825760405162461bcd60e51b815260040161051490615a5f565b5f805b6004811015613add57613a9981600361581d565b613aa49060086157e6565b63ffffffff1686613ab68360026157b1565b81518110613ac657613ac66155ae565b016020015160f81c901b9190911790600101613a85565b5063ffffffff8116600514613b045760405162461bcd60e51b815260040161051490615aa2565b5f805b6020811015613b5957613b1b81601f61581d565b613b269060086157e6565b87613b328360066157b1565b81518110613b4257613b426155ae565b016020015160f81c901b9190911790600101613b07565b505f805b6008811015613bb857613b7181600761581d565b613b7c9060086157e6565b6001600160401b031688613b918360266157b1565b81518110613ba157613ba16155ae565b016020015160f81c901b9190911790600101613b5d565b5090969095509350505050565b5f80516020615d748339815191525f6001600160401b038084169085161115613bf957613bf28385615419565b9050613c06565b613c038484615419565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613c68575060028401548151613c64916001600160401b0316906157b1565b8210155b15613c8e576001600160401b038316606082015281815260408101516020820152613cad565b8281606001818151613ca091906157fd565b6001600160401b03169052505b6060810151613cbd906064615ae9565b602082015160028601546001600160401b039290921691613ce89190600160401b900460ff166157e6565b1015613d4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610514565b856001600160401b031681604001818151613d6791906157b1565b9052506040810180516001600160401b0387169190613d8790839061581d565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615db48339815191526020526040812060020180545f80516020615d7483398151915291600160401b9091046001600160401b0316906008613e1d83615b5f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613eac57604051631afcd79f60e31b815260040160405180910390fd5b565b613eb6613e63565b613ebf816145ad565b613ec76145c6565b613f22608082013560a0830135613ee460e0850160c0860161528c565b613ef5610100860160e08701615b7a565b61ffff16613f0b61012087016101008801615b93565b613f1d6101408801610120890161554e565b6145d6565b50565b613f2d613e63565b5f80516020615d148339815191526001600160a01b038216613fa65760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610514565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611e7d91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061481a565b5f610a2b825f80516020615d14833981519152546001600160a01b03169061487b565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140d35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610514565b5f80516020615d74833981519152426140f2604086016020870161528c565b6001600160401b0316116141645760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610514565b614174604085016020860161528c565b6001600160401b031661418a6202a300426157b1565b116141fd5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610514565b83356142555760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610514565b83355f908152600982016020526040902054156142845760405162461bcd60e51b815260040161051490615709565b60306142936040860186615bb3565b9050146142f85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610514565b614302835f613bc5565b5f8061439c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614347919061528c565b6001600160401b0316815260200161436260408a018a615bb3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149dd565b5f828152600786016020526040902091935091506143ba8282615c39565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143e7908590600401615472565b6020604051808303815f875af1158015614403573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144279190615439565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561449f5761449f6152c5565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161457f918e01908e0161528c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6145b5613e63565b6145bd614d8c565b613f2281614d94565b6145ce613e63565b613eac614f36565b6145de613e63565b5f80516020615d348339815191528361464a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610514565b61271084111561466c5760405162461bcd60e51b815260040161051490615b14565b858711156146d45760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610514565b5f8360ff16116147415760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610514565b600a60ff841611156147b35760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610514565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61482e6001600160a01b03841683614f3e565b905080515f141580156148525750808060200190518101906148509190615cf8565b155b15611e7d57604051635274afe760e01b81526001600160a01b0384166004820152602401610514565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156148c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148e59190615439565b90506148fc6001600160a01b038516333086614f4b565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614940573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149649190615439565b90508181116149ca5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610514565b6149d4828261581d565b95945050505050565b5f6060826080015151603014614a475760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610514565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614abe57614a7e81600161581d565b614a899060086157e6565b5081515f90839083908110614aa057614aa06155ae565b60200101906001600160f81b03191690815f1a905350600101614a6a565b505f5b6004811015614b2657614ad581600361581d565b614ae09060086157e6565b600160ff919091161c60f81b82614af88360026157b1565b81518110614b0857614b086155ae565b60200101906001600160f81b03191690815f1a905350600101614ac1565b505f5b6020811015614b835784518160208110614b4557614b456155ae565b1a60f81b82614b558360066157b1565b81518110614b6557614b656155ae565b60200101906001600160f81b03191690815f1a905350600101614b29565b505f5b6020811015614be35784602001518160208110614ba557614ba56155ae565b1a60f81b82614bb58360266157b1565b81518110614bc557614bc56155ae565b60200101906001600160f81b03191690815f1a905350600101614b86565b505f5b6008811015614c5757614bfa81600761581d565b614c059060086157e6565b60ff1685604001516001600160401b0316901c60f81b82826046614c2991906157b1565b81518110614c3957614c396155ae565b60200101906001600160f81b03191690815f1a905350600101614be6565b505f5b6030811015614cc25784608001518181518110614c7957614c796155ae565b01602001516001600160f81b03191682614c9483604e6157b1565b81518110614ca457614ca46155ae565b60200101906001600160f81b03191690815f1a905350600101614c5a565b505f5b6008811015614d3457614cd981600761581d565b614ce49060086157e6565b60608601516001600160401b0390811691161c60f81b82614d0683607e6157b1565b81518110614d1657614d166155ae565b60200101906001600160f81b03191690815f1a905350600101614cc5565b50600281604051614d4591906157a0565b602060405180830381855afa158015614d60573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d839190615439565b94909350915050565b613eac613e63565b614d9c613e63565b80355f80516020615d7483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614de86080840160608501615b93565b60ff161115614e555760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610514565b5f614e666080840160608501615b93565b60ff1611614ece5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610514565b614ede6080830160608401615b93565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f0f606083016040840161528c565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61320a613e63565b606061259283835f614f84565b6040516001600160a01b038481166024830152838116604483015260648201839052610a159186918216906323b872dd90608401613ff3565b606081471015614fa95760405163cd78605960e01b8152306004820152602401610514565b5f80856001600160a01b03168486604051614fc491906157a0565b5f6040518083038185875af1925050503d805f8114614ffe576040519150601f19603f3d011682016040523d82523d5f602084013e615003565b606091505b50915091506122118683836060826150235761501e8261506a565b612592565b815115801561503a57506001600160a01b0384163b155b1561506357604051639996b31560e01b81526001600160a01b0385166004820152602401610514565b5080612592565b80511561507a5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461509f90615830565b5f825580601f106150ae575050565b601f0160209004905f5260205f2090810190613f229190615106565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561511a575f8155600101615107565b5090565b8015158114613f22575f80fd5b803563ffffffff8116811461513e575f80fd5b919050565b5f805f60608486031215615155575f80fd5b8335925060208401356151678161511e565b91506151756040850161512b565b90509250925092565b5f6020828403121561518e575f80fd5b5035919050565b6001600160a01b0381168114613f22575f80fd5b5f808284036101608112156151bc575f80fd5b610140808212156151cb575f80fd5b84935083013590506151dc81615195565b809150509250929050565b5f602082840312156151f7575f80fd5b6125928261512b565b5f8060408385031215615211575f80fd5b61521a8361512b565b946020939093013593505050565b5f8060408385031215615239575f80fd5b82356001600160401b0381111561524e575f80fd5b83016080818603121561525f575f80fd5b915061526d6020840161512b565b90509250929050565b80356001600160401b038116811461513e575f80fd5b5f6020828403121561529c575f80fd5b61259282615276565b5f80604083850312156152b6575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106152fc57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161533760608401826001600160401b03169052565b50608083015161535260808401826001600160401b03169052565b5060a083015161536d60a08401826001600160401b03169052565b5060c083015161538860c08401826001600160401b03169052565b5092915050565b803561ffff8116811461513e575f80fd5b5f805f80608085870312156153b3575f80fd5b84356001600160401b038111156153c8575f80fd5b8501606081880312156153d9575f80fd5b93506153e76020860161538f565b92506153f560408601615276565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561538857615388615405565b5f60208284031215615449575f80fd5b5051919050565b5f5b8381101561546a578181015183820152602001615452565b50505f910152565b602081525f8251806020840152615490816040850160208701615450565b601f01601f19169190910160400192915050565b5f826154be57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f6020828403121561555e575f80fd5b813561259281615195565b5f808335601e1984360301811261557e575f80fd5b8301803591506001600160401b03821115615597575f80fd5b6020019150600581901b360382131561236b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155d6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615616576156166155e0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615644576156446155e0565b604052919050565b5f6001600160401b03821115615664576156646155e0565b50601f01601f191660200190565b5f60608236031215615682575f80fd5b61568a6155f4565b82358152602061569b818501615276565b8183015260408401356001600160401b038111156156b7575f80fd5b840136601f8201126156c7575f80fd5b80356156da6156d58261564c565b61561c565b81815236848385010111156156ed575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615762818460208a01615450565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615792816028840160208801615450565b016028019695505050505050565b5f82516155d6818460208701615450565b80820180821115610a2b57610a2b615405565b5f63ffffffff8083168181036157dc576157dc615405565b6001019392505050565b8082028115828204841417610a2b57610a2b615405565b6001600160401b0381811683821601908082111561538857615388615405565b81810381811115610a2b57610a2b615405565b600181811c9082168061584457607f821691505b60208210810361586257634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546158c181615830565b806020870152604060018084165f81146158e257600181146158fe5761592b565b60ff19851660408a0152604084151560051b8a0101955061592b565b895f5260205f205f5b858110156159225781548b8201860152908301908801615907565b8a016040019650505b509398975050505050505050565b805161513e8161511e565b5f8060408385031215615955575f80fd5b82516001600160401b038082111561596b575f80fd5b908401906060828703121561597e575f80fd5b6159866155f4565b8251815260208084015161599981615195565b828201526040840151838111156159ae575f80fd5b80850194505087601f8501126159c2575f80fd5b835192506159d26156d58461564c565b83815288828587010111156159e5575f80fd5b6159f484838301848801615450565b80604084015250819550615a09818801615939565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615b0c57615b0c615405565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036157dc576157dc615405565b5f60208284031215615b8a575f80fd5b6125928261538f565b5f60208284031215615ba3575f80fd5b813560ff81168114612592575f80fd5b5f808335601e19843603018112615bc8575f80fd5b8301803591506001600160401b03821115615be1575f80fd5b60200191503681900382131561236b575f80fd5b601f821115611e7d57805f5260205f20601f840160051c81016020851015615c1a5750805b601f840160051c820191505b81811015610ba9575f8155600101615c26565b81516001600160401b03811115615c5257615c526155e0565b615c6681615c608454615830565b84615bf5565b602080601f831160018114615c99575f8415615c825750858301515b5f19600386901b1c1916600185901b178555615cf0565b5f85815260208120601f198616915b82811015615cc757888601518255948401946001909101908401615ca8565b5085821015615ce457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615d08575f80fd5b81516125928161511e56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 9cf250ac3..ce232b703 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615b3d380380615b3d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159f08061014d5f395ff3fe60806040526004361061017b575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f14610492578063c974d1b6146104a5578063d5f20ff6146104b9578063df93d8de146104e5575f80fd5b8063b771b3bc1461043a578063ba3a4b9714610454578063bee0a03f14610473575f80fd5b8063620658561461038b57806366435abf146103aa57806376f78621146103c95780638280a25a146103e857806398f3e2b4146103fc578063a3a65e481461041b575f80fd5b8063329c3e1211610138578063467ef06f11610113578063467ef06f146103055780635297fae61461032457806360305d621461034357806361e2f4901461036c575f80fd5b8063329c3e121461029857806335455ded146102ca57806340034a93146102f2575f80fd5b80630118acc41461017f5780630322ed98146101a05780630cdd0985146101bf578063151d30d11461021c5780631f7a9d8f146102425780632e2194d814610261575b5f80fd5b34801561018a575f80fd5b5061019e610199366004614df0565b6104fb565b005b3480156101ab575f80fd5b5061019e6101ba366004614e2b565b61099e565b3480156101ca575f80fd5b506102096101d9366004614e2b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610227575f80fd5b50610230600a81565b60405160ff9091168152602001610213565b34801561024d575f80fd5b5061019e61025c366004614e42565b610b57565b34801561026c575f80fd5b5061028061027b366004614e2b565b610c34565b6040516001600160401b039091168152602001610213565b3480156102a3575f80fd5b506102b26001600160991b0181565b6040516001600160a01b039091168152602001610213565b3480156102d5575f80fd5b506102df61271081565b60405161ffff9091168152602001610213565b610209610300366004614e80565b610c4a565b348015610310575f80fd5b5061019e61031f366004614ed4565b610c7e565b34801561032f575f80fd5b5061019e61033e366004614eed565b610d1e565b34801561034e575f80fd5b50610357601481565b60405163ffffffff9091168152602001610213565b348015610377575f80fd5b5061019e610386366004614f15565b610ef3565b348015610396575f80fd5b506102096103a5366004614f63565b611527565b3480156103b5575f80fd5b506102806103c4366004614e2b565b611540565b3480156103d4575f80fd5b5061019e6103e3366004614df0565b611554565b3480156103f3575f80fd5b50610230603081565b348015610407575f80fd5b5061019e610416366004614eed565b61174e565b348015610426575f80fd5b5061019e610435366004614ed4565b6119d0565b348015610445575f80fd5b506102b26005600160991b0181565b34801561045f575f80fd5b5061019e61046e366004614e2b565b611b88565b34801561047e575f80fd5b5061019e61048d366004614e2b565b611e0e565b6102096104a0366004614e2b565b611f22565b3480156104b0575f80fd5b50610230601481565b3480156104c4575f80fd5b506104d86104d3366004614e2b565b611f53565b6040516102139190614f90565b3480156104f0575f80fd5b506102806202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615944833981519152949193919290829060ff16600481111561056357610563614f7c565b600481111561057457610574614f7c565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105f083611f53565b905060028251600481111561060757610607614f7c565b146106595760405162461bcd60e51b815260206004820152602a60248201525f805160206159648339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106be5760405162461bcd60e51b815260206004820152603360248201525f805160206159648339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610650565b6003825280515f9060029060058111156106da576106da614f7c565b036107315786156106f2576106ef848761201b565b90505b5f83606001518360800151610707919061505a565b905061071385826122b7565b506001600160401b0390811660e0860152421660a085015250610765565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107988560600151611527565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610815573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610839919061507a565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561087857610878614f7c565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161098c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206159c48339815191526020526040808220815160e0810190925280545f8051602061598483398151915293929190829060ff1660058111156109eb576109eb614f7c565b60058111156109fc576109fc614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a6b57610a6b614f7c565b14610ad05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb610af58584606001515f61240e565b6040518263ffffffff1660e01b8152600401610b1191906150b3565b6020604051808303815f875af1158015610b2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b51919061507a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ba0575080546001600160401b03808416911610155b15610bbe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be883612633565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4464e8d4a51000836150e5565b92915050565b5f610c53612647565b610c5f8484843461267e565b9050610c7760015f805160206159a483398151915255565b9392505050565b5f805160206159448339815191525f80610c97846128fb565b91509150610ca482612c45565b610cae5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610cdc57610cdc614f7c565b03610d01575f83815260088501602052604081208054919055610cff8282612c80565b505b610d1781610d128460400151611527565b612ce6565b5050505050565b5f805160206159448339815191525f610d3684612cf9565b90505f80610d478360400151612ed3565b50915091505f610d5683611f53565b9050816001600160401b031681606001516001600160401b03161015610d8e5760405162461bcd60e51b815260040161065090615104565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dd35760405162461bcd60e51b815260040161065090615146565b60015f87815260068701602052604090205460ff166004811115610df957610df9614f7c565b14610e625760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610650565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206159848339815191529060ff1615610f905760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff7919061507a565b8360200135146110595760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610650565b3061106a60608501604086016151a3565b6001600160a01b0316146110dc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610650565b5f6110ea60608501856151be565b91505f90508435602086013560146111086060890160408a016151a3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611437575f61118860608901896151be565b8363ffffffff1681811061119e5761119e615203565b90506020028101906111b09190615217565b6111b9906152c7565b80515f81815260098901602052604090205491925090156111ec5760405162461bcd60e51b81526004016106509061535e565b84825f01518360200151846040015160405160200161120e94939291906153a6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161125c91906153f5565b602060405180830381855afa158015611277573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061129a919061507a565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561132657611326614f7c565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113d9911686615406565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061143090615419565b905061116c565b50600584018190555f61144986612cf9565b90505f611459826040015161310e565b90508060028560405161146c91906153f5565b602060405180830381855afa158015611487573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114aa919061507a565b1461150e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610650565b505050600a909201805460ff1916600117905550505050565b5f610c446001600160401b03831664e8d4a5100061543b565b5f61154a82611f53565b6080015192915050565b5f805160206159448339815191525f61156c85613277565b5f86815260058401602052604090205460a082015191925061159f91600160b01b9091046001600160401b031690615452565b6001600160401b03168160c001516001600160401b031610156116205760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610650565b8315610d17575f611631868561201b565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061168890611527565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156116fe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611722919061507a565b5f87815260088501602052604081208054909190611741908490615406565b9091555050505050505050565b611756612647565b5f805160206159448339815191525f61176e84612cf9565b90505f8061177f8360400151612ed3565b50915091505f61178e83611f53565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117c8576117c8614f7c565b60048111156117d9576117d9614f7c565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156118785760405162461bcd60e51b815260040161065090615104565b826001600160401b03168160e001516001600160401b031611156118ae5760405162461bcd60e51b815260040161065090615146565b6003815160048111156118c3576118c3614f7c565b146119175760405162461bcd60e51b815260206004820152603160248201525f805160206159648339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610650565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a019092529091205461194d9190612c80565b856007015f8881526020019081526020015f205f90556119788160200151610d128360600151611527565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506119cc60015f805160206159a483398151915255565b5050565b5f805160206159848339815191525f6119e883612cf9565b90505f806119f983604001516134f2565b9150915080611a5b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610650565b5f82815260078501602052604081208054611a7590615472565b9050118015611aa7575060015f83815260088601602052604090205460ff166005811115611aa557611aa5614f7c565b145b611ac35760405162461bcd60e51b8152600401610650906154a4565b5f8281526007850160205260408120611adb91614d45565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061594483398151915293929190829060ff166004811115611be957611be9614f7c565b6004811115611bfa57611bfa614f7c565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611c8157611c81614f7c565b1480611c9f5750600381516004811115611c9d57611c9d614f7c565b145b611cf35760405162461bcd60e51b815260206004820152603260248201525f80516020615964833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610650565b5f611d018260400151611f53565b905080606001516001600160401b03165f03611d855760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb611db284604001518460600151856080015161240e565b6040518263ffffffff1660e01b8152600401611dce91906150b3565b6020604051808303815f875af1158015611dea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d17919061507a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615984833981519152929190611e5690615472565b9050118015611e88575060015f83815260088301602052604090205460ff166005811115611e8657611e86614f7c565b145b611ea45760405162461bcd60e51b8152600401610650906154a4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611edd91906004016154eb565b6020604051808303815f875af1158015611ef9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1d919061507a565b505050565b5f611f2b612647565b611f36823334613693565b9050611f4e60015f805160206159a483398151915255565b919050565b611f5b614d7c565b5f8281525f805160206159c4833981519152602052604090819020815160e0810190925280545f80516020615984833981519152929190829060ff166005811115611fa857611fa8614f7c565b6005811115611fb957611fb9614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612066573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208d9190810190615580565b91509150806120f05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612133573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612157919061507a565b8251146121bb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610650565b60208201516001600160a01b0316156122315760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610650565b5f806122408460400151613a4a565b915091508187146122ad5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610650565b9695505050505050565b5f8281525f805160206159c4833981519152602052604081206002015481905f8051602061598483398151915290600160801b90046001600160401b03166122ff8582613c22565b5f61230987613e30565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123598a858b61240e565b6040518263ffffffff1660e01b815260040161237591906150b3565b6020604051808303815f875af1158015612391573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123b5919061507a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561248757612447816001615652565b61245290600861543b565b5081515f9083908390811061246957612469615203565b60200101906001600160f81b03191690815f1a905350600101612433565b505f5b60048110156124f25761249e816003615652565b6124a990600861543b565b600263ffffffff16901c60f81b828260026124c49190615406565b815181106124d4576124d4615203565b60200101906001600160f81b03191690815f1a90535060010161248a565b505f5b60208110156125545761250981601f615652565b61251490600861543b565b86901c60f81b82612526836006615406565b8151811061253657612536615203565b60200101906001600160f81b03191690815f1a9053506001016124f5565b505f5b60088110156125bf5761256b816007615652565b61257690600861543b565b6001600160401b038616901c60f81b82612591836026615406565b815181106125a1576125a1615203565b60200101906001600160f81b03191690815f1a905350600101612557565b505f5b600881101561262a576125d6816007615652565b6125e190600861543b565b6001600160401b038516901c60f81b826125fc83602e615406565b8151811061260c5761260c615203565b60200101906001600160f81b03191690815f1a9053506001016125c2565b50949350505050565b61263b613ec0565b61264481613f0b565b50565b5f805160206159a483398151915280546001190161267857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206159448339815191529061ffff8616108015906126ca575061271061ffff861611155b6126e65760405162461bcd60e51b815260040161065090615665565b60028101546001600160401b03908116908516101561275f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610650565b80548310156127c25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610650565b80600101548311156128295760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610650565b825f61283482610c34565b90505f6128418983613f7f565b905060405180606001604052806128553390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f805160206159a483398151915255565b5f612904614d7c565b5f805160206159848339815191525f61291c85612cf9565b90505f8061292d83604001516134f2565b9150915080156129925760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610650565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156129c3576129c3614f7c565b60058111156129d4576129d4614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612a4557612a45614f7c565b1480612a635750600182516005811115612a6157612a61614f7c565b145b612ac25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610650565b600382516005811115612ad757612ad7614f7c565b03612ae457506004612ae8565b5060055b6020808301515f90815260098801909152604081205581816005811115612b1157612b11614f7c565b90816005811115612b2457612b24614f7c565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612b5857612b58614f7c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612c0c57612c0c614f7c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ccc575f80fd5b505af1158015612cde573d5f803e3d5ffd5b505050505050565b6119cc6001600160a01b038316826144e4565b60408051606080820183525f8083526020830181905292820152905f805160206159848339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612d6e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612d959190810190615580565b9150915080612df55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610650565b8254825114612e585760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610650565b60208201516001600160a01b031615612ecb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610650565b509392505050565b5f805f8351603614612ef75760405162461bcd60e51b8152600401610650906156b0565b5f805b6002811015612f4657612f0e816001615652565b612f1990600861543b565b61ffff16868281518110612f2f57612f2f615203565b016020015160f81c901b9190911790600101612efa565b5061ffff811615612f695760405162461bcd60e51b8152600401610650906156f9565b5f805b6004811015612fc457612f80816003615652565b612f8b90600861543b565b63ffffffff1687612f9d836002615406565b81518110612fad57612fad615203565b016020015160f81c901b9190911790600101612f6c565b5063ffffffff8116600414612feb5760405162461bcd60e51b81526004016106509061573c565b5f805b60208110156130405761300281601f615652565b61300d90600861543b565b88613019836006615406565b8151811061302957613029615203565b016020015160f81c901b9190911790600101612fee565b505f805b600881101561309f57613058816007615652565b61306390600861543b565b6001600160401b031689613078836026615406565b8151811061308857613088615203565b016020015160f81c901b9190911790600101613044565b505f805b60088110156130fe576130b7816007615652565b6130c290600861543b565b6001600160401b03168a6130d783602e615406565b815181106130e7576130e7615203565b016020015160f81c901b91909117906001016130a3565b5091989097509095509350505050565b5f81516026146131305760405162461bcd60e51b8152600401610650906156b0565b5f805b600281101561317f57613147816001615652565b61315290600861543b565b61ffff1684828151811061316857613168615203565b016020015160f81c901b9190911790600101613133565b5061ffff8116156131a25760405162461bcd60e51b8152600401610650906156f9565b5f805b60048110156131fd576131b9816003615652565b6131c490600861543b565b63ffffffff16856131d6836002615406565b815181106131e6576131e6615203565b016020015160f81c901b91909117906001016131a5565b5063ffffffff8116156132225760405162461bcd60e51b81526004016106509061573c565b5f805b602081101561262a5761323981601f615652565b61324490600861543b565b86613250836006615406565b8151811061326057613260615203565b016020015160f81c901b9190911790600101613225565b61327f614d7c565b5f8281525f805160206159c48339815191526020526040808220815160e0810190925280545f8051602061598483398151915293929190829060ff1660058111156132cc576132cc614f7c565b60058111156132dd576132dd614f7c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561334f5761334f614f7c565b146133ab5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610650565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156133ef576133ef614f7c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61349b85826122b7565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146135155760405162461bcd60e51b8152600401610650906156b0565b5f805b60028110156135645761352c816001615652565b61353790600861543b565b61ffff1685828151811061354d5761354d615203565b016020015160f81c901b9190911790600101613518565b5061ffff8116156135875760405162461bcd60e51b8152600401610650906156f9565b5f805b60048110156135e25761359e816003615652565b6135a990600861543b565b63ffffffff16866135bb836002615406565b815181106135cb576135cb615203565b016020015160f81c901b919091179060010161358a565b5063ffffffff81166003146136095760405162461bcd60e51b81526004016106509061573c565b5f805b602081101561365e5761362081601f615652565b61362b90600861543b565b87613637836006615406565b8151811061364757613647615203565b016020015160f81c901b919091179060010161360c565b505f8660268151811061367357613673615203565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615944833981519152816136ac84610c34565b90505f6136b887611f53565b90506136c387612c45565b6137205760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610650565b60028151600581111561373557613735614f7c565b146137945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610650565b5f8282608001516137a59190615452565b600485015460408401519192506137c7916001600160401b0390911690615783565b6001600160401b0316816001600160401b031611156138465760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610650565b5f806138528a846122b7565b915091505f8a8360405160200161388092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561391b5761391b614f7c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613a6d5760405162461bcd60e51b8152600401610650906156b0565b5f805b6002811015613abc57613a84816001615652565b613a8f90600861543b565b61ffff16858281518110613aa557613aa5615203565b016020015160f81c901b9190911790600101613a70565b5061ffff811615613adf5760405162461bcd60e51b8152600401610650906156f9565b5f805b6004811015613b3a57613af6816003615652565b613b0190600861543b565b63ffffffff1686613b13836002615406565b81518110613b2357613b23615203565b016020015160f81c901b9190911790600101613ae2565b5063ffffffff8116600514613b615760405162461bcd60e51b81526004016106509061573c565b5f805b6020811015613bb657613b7881601f615652565b613b8390600861543b565b87613b8f836006615406565b81518110613b9f57613b9f615203565b016020015160f81c901b9190911790600101613b64565b505f805b6008811015613c1557613bce816007615652565b613bd990600861543b565b6001600160401b031688613bee836026615406565b81518110613bfe57613bfe615203565b016020015160f81c901b9190911790600101613bba565b5090969095509350505050565b5f805160206159848339815191525f6001600160401b038084169085161115613c5657613c4f838561505a565b9050613c63565b613c60848461505a565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613cc5575060028401548151613cc1916001600160401b031690615406565b8210155b15613ceb576001600160401b038316606082015281815260408101516020820152613d0a565b8281606001818151613cfd9190615452565b6001600160401b03169052505b6060810151613d1a906064615783565b602082015160028601546001600160401b039290921691613d459190600160401b900460ff1661543b565b1015613da95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610650565b856001600160401b031681604001818151613dc49190615406565b9052506040810180516001600160401b0387169190613de4908390615652565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206159c48339815191526020526040812060020180545f8051602061598483398151915291600160401b9091046001600160401b0316906008613e7a836157ae565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f0957604051631afcd79f60e31b815260040160405180910390fd5b565b613f13613ec0565b613f1c81614577565b613f24614590565b612644608082013560a0830135613f4160e0850160c08601614f63565b613f52610100860160e087016157c9565b61ffff16613f68610120870161010088016157e2565b613f7a610140880161012089016151a3565b6145a0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661400a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610650565b5f80516020615984833981519152426140296040860160208701614f63565b6001600160401b03161161409b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610650565b6140ab6040850160208601614f63565b6001600160401b03166140c16202a30042615406565b116141345760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610650565b833561418c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610650565b83355f908152600982016020526040902054156141bb5760405162461bcd60e51b81526004016106509061535e565b60306141ca6040860186615802565b90501461422f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610650565b614239835f613c22565b5f806142d36040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061427e9190614f63565b6001600160401b0316815260200161429960408a018a615802565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506147e4565b5f828152600786016020526040902091935091506142f18282615888565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061431e9085906004016150b3565b6020604051808303815f875af115801561433a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061435e919061507a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156143d6576143d6614f7c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916144b6918e01908e01614f63565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145075760405163cd78605960e01b8152306004820152602401610650565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614550576040519150601f19603f3d011682016040523d82523d5f602084013e614555565b606091505b5050905080611f1d57604051630a12f52160e11b815260040160405180910390fd5b61457f613ec0565b614587614b93565b61264481614b9b565b614598613ec0565b613f09614d3d565b6145a8613ec0565b5f80516020615944833981519152836146145760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610650565b6127108411156146365760405162461bcd60e51b815260040161065090615665565b8587111561469e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610650565b5f8360ff161161470b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610650565b600a60ff8416111561477d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610650565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461484e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610650565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156148c557614885816001615652565b61489090600861543b565b5081515f908390839081106148a7576148a7615203565b60200101906001600160f81b03191690815f1a905350600101614871565b505f5b600481101561492d576148dc816003615652565b6148e790600861543b565b600160ff919091161c60f81b826148ff836002615406565b8151811061490f5761490f615203565b60200101906001600160f81b03191690815f1a9053506001016148c8565b505f5b602081101561498a578451816020811061494c5761494c615203565b1a60f81b8261495c836006615406565b8151811061496c5761496c615203565b60200101906001600160f81b03191690815f1a905350600101614930565b505f5b60208110156149ea57846020015181602081106149ac576149ac615203565b1a60f81b826149bc836026615406565b815181106149cc576149cc615203565b60200101906001600160f81b03191690815f1a90535060010161498d565b505f5b6008811015614a5e57614a01816007615652565b614a0c90600861543b565b60ff1685604001516001600160401b0316901c60f81b82826046614a309190615406565b81518110614a4057614a40615203565b60200101906001600160f81b03191690815f1a9053506001016149ed565b505f5b6030811015614ac95784608001518181518110614a8057614a80615203565b01602001516001600160f81b03191682614a9b83604e615406565b81518110614aab57614aab615203565b60200101906001600160f81b03191690815f1a905350600101614a61565b505f5b6008811015614b3b57614ae0816007615652565b614aeb90600861543b565b60608601516001600160401b0390811691161c60f81b82614b0d83607e615406565b81518110614b1d57614b1d615203565b60200101906001600160f81b03191690815f1a905350600101614acc565b50600281604051614b4c91906153f5565b602060405180830381855afa158015614b67573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614b8a919061507a565b94909350915050565b613f09613ec0565b614ba3613ec0565b80355f8051602061598483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614bef60808401606085016157e2565b60ff161115614c5c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610650565b5f614c6d60808401606085016157e2565b60ff1611614cd55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610650565b614ce560808301606084016157e2565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d166060830160408401614f63565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6128e8613ec0565b508054614d5190615472565b5f825580601f10614d60575050565b601f0160209004905f5260205f20908101906126449190614db8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614dcc575f8155600101614db9565b5090565b8015158114612644575f80fd5b803563ffffffff81168114611f4e575f80fd5b5f805f60608486031215614e02575f80fd5b833592506020840135614e1481614dd0565b9150614e2260408501614ddd565b90509250925092565b5f60208284031215614e3b575f80fd5b5035919050565b5f6101408284031215614e53575f80fd5b50919050565b803561ffff81168114611f4e575f80fd5b80356001600160401b0381168114611f4e575f80fd5b5f805f60608486031215614e92575f80fd5b83356001600160401b03811115614ea7575f80fd5b840160608187031215614eb8575f80fd5b9250614ec660208501614e59565b9150614e2260408501614e6a565b5f60208284031215614ee4575f80fd5b610c7782614ddd565b5f8060408385031215614efe575f80fd5b614f0783614ddd565b946020939093013593505050565b5f8060408385031215614f26575f80fd5b82356001600160401b03811115614f3b575f80fd5b830160808186031215614f4c575f80fd5b9150614f5a60208401614ddd565b90509250929050565b5f60208284031215614f73575f80fd5b610c7782614e6a565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614fb357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614fee60608401826001600160401b03169052565b50608083015161500960808401826001600160401b03169052565b5060a083015161502460a08401826001600160401b03169052565b5060c083015161503f60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561503f5761503f615046565b5f6020828403121561508a575f80fd5b5051919050565b5f5b838110156150ab578181015183820152602001615093565b50505f910152565b602081525f82518060208401526150d1816040850160208701615091565b601f01601f19169190910160400192915050565b5f826150ff57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612644575f80fd5b5f602082840312156151b3575f80fd5b8135610c778161518f565b5f808335601e198436030181126151d3575f80fd5b8301803591506001600160401b038211156151ec575f80fd5b6020019150600581901b3603821315612407575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261522b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561526b5761526b615235565b60405290565b604051601f8201601f191681016001600160401b038111828210171561529957615299615235565b604052919050565b5f6001600160401b038211156152b9576152b9615235565b50601f01601f191660200190565b5f606082360312156152d7575f80fd5b6152df615249565b8235815260206152f0818501614e6a565b8183015260408401356001600160401b0381111561530c575f80fd5b840136601f82011261531c575f80fd5b803561532f61532a826152a1565b615271565b8181523684838501011115615342575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516153b7818460208a01615091565b80830190508581526001600160401b0360c01b8560c01b16602082015283516153e7816028840160208801615091565b016028019695505050505050565b5f825161522b818460208701615091565b80820180821115610c4457610c44615046565b5f63ffffffff80831681810361543157615431615046565b6001019392505050565b8082028115828204841417610c4457610c44615046565b6001600160401b0381811683821601908082111561503f5761503f615046565b600181811c9082168061548657607f821691505b602082108103614e5357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546154fd81615472565b806020870152604060018084165f811461551e576001811461553a57615567565b60ff19851660408a0152604084151560051b8a01019550615567565b895f5260205f205f5b8581101561555e5781548b8201860152908301908801615543565b8a016040019650505b509398975050505050505050565b8051611f4e81614dd0565b5f8060408385031215615591575f80fd5b82516001600160401b03808211156155a7575f80fd5b90840190606082870312156155ba575f80fd5b6155c2615249565b825181526020808401516155d58161518f565b828201526040840151838111156155ea575f80fd5b80850194505087601f8501126155fe575f80fd5b8351925061560e61532a846152a1565b8381528882858701011115615621575f80fd5b61563084838301848801615091565b80604084015250819550615645818801615575565b9450505050509250929050565b81810381811115610c4457610c44615046565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146157a6576157a6615046565b505092915050565b5f6001600160401b0380831681810361543157615431615046565b5f602082840312156157d9575f80fd5b610c7782614e59565b5f602082840312156157f2575f80fd5b813560ff81168114610c77575f80fd5b5f808335601e19843603018112615817575f80fd5b8301803591506001600160401b03821115615830575f80fd5b602001915036819003821315612407575f80fd5b601f821115611f1d57805f5260205f20601f840160051c810160208510156158695750805b601f840160051c820191505b81811015610d17575f8155600101615875565b81516001600160401b038111156158a1576158a1615235565b6158b5816158af8454615472565b84615844565b602080601f8311600181146158e8575f84156158d15750858301515b5f19600386901b1c1916600185901b178555612cde565b5f85815260208120601f198616915b82811015615916578886015182559484019460019091019084016158f7565b508582101561593357878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615bdf380380615bdf83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615a928061014d5f395ff3fe60806040526004361061017b575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f14610492578063c974d1b6146104a5578063d5f20ff6146104b9578063df93d8de146104e5575f80fd5b8063b771b3bc1461043a578063ba3a4b9714610454578063bee0a03f14610473575f80fd5b8063620658561461038b57806366435abf146103aa57806376f78621146103c95780638280a25a146103e857806398f3e2b4146103fc578063a3a65e481461041b575f80fd5b8063329c3e1211610138578063467ef06f11610113578063467ef06f146103055780635297fae61461032457806360305d621461034357806361e2f4901461036c575f80fd5b8063329c3e121461029857806335455ded146102ca57806340034a93146102f2575f80fd5b80630118acc41461017f5780630322ed98146101a05780630cdd0985146101bf578063151d30d11461021c5780631f7a9d8f146102425780632e2194d814610261575b5f80fd5b34801561018a575f80fd5b5061019e610199366004614e92565b6104fb565b005b3480156101ab575f80fd5b5061019e6101ba366004614ecd565b61099e565b3480156101ca575f80fd5b506102096101d9366004614ecd565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610227575f80fd5b50610230600a81565b60405160ff9091168152602001610213565b34801561024d575f80fd5b5061019e61025c366004614ee4565b610b57565b34801561026c575f80fd5b5061028061027b366004614ecd565b610c34565b6040516001600160401b039091168152602001610213565b3480156102a3575f80fd5b506102b26001600160991b0181565b6040516001600160a01b039091168152602001610213565b3480156102d5575f80fd5b506102df61271081565b60405161ffff9091168152602001610213565b610209610300366004614f22565b610c4a565b348015610310575f80fd5b5061019e61031f366004614f76565b610c7e565b34801561032f575f80fd5b5061019e61033e366004614f8f565b610d1e565b34801561034e575f80fd5b50610357601481565b60405163ffffffff9091168152602001610213565b348015610377575f80fd5b5061019e610386366004614fb7565b610ef3565b348015610396575f80fd5b506102096103a5366004615005565b611527565b3480156103b5575f80fd5b506102806103c4366004614ecd565b611540565b3480156103d4575f80fd5b5061019e6103e3366004614e92565b611554565b3480156103f3575f80fd5b50610230603081565b348015610407575f80fd5b5061019e610416366004614f8f565b611760565b348015610426575f80fd5b5061019e610435366004614f76565b611a72565b348015610445575f80fd5b506102b26005600160991b0181565b34801561045f575f80fd5b5061019e61046e366004614ecd565b611c2a565b34801561047e575f80fd5b5061019e61048d366004614ecd565b611eb0565b6102096104a0366004614ecd565b611fc4565b3480156104b0575f80fd5b50610230601481565b3480156104c4575f80fd5b506104d86104d3366004614ecd565b611ff5565b6040516102139190615032565b3480156104f0575f80fd5b506102806202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206159e6833981519152949193919290829060ff1660048111156105635761056361501e565b60048111156105745761057461501e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105f083611ff5565b90506002825160048111156106075761060761501e565b146106595760405162461bcd60e51b815260206004820152602a60248201525f80516020615a068339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106be5760405162461bcd60e51b815260206004820152603360248201525f80516020615a068339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610650565b6003825280515f9060029060058111156106da576106da61501e565b036107315786156106f2576106ef84876120bd565b90505b5f8360600151836080015161070791906150fc565b90506107138582612359565b506001600160401b0390811660e0860152421660a085015250610765565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107988560600151611527565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610815573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610839919061511c565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108785761087861501e565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161098c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615a668339815191526020526040808220815160e0810190925280545f80516020615a2683398151915293929190829060ff1660058111156109eb576109eb61501e565b60058111156109fc576109fc61501e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a6b57610a6b61501e565b14610ad05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb610af58584606001515f6124b0565b6040518263ffffffff1660e01b8152600401610b119190615155565b6020604051808303815f875af1158015610b2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b51919061511c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ba0575080546001600160401b03808416911610155b15610bbe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be8836126d5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4464e8d4a5100083615187565b92915050565b5f610c536126e9565b610c5f84848434612720565b9050610c7760015f80516020615a4683398151915255565b9392505050565b5f805160206159e68339815191525f80610c978461299d565b91509150610ca482612ce7565b610cae5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610cdc57610cdc61501e565b03610d01575f83815260088501602052604081208054919055610cff8282612d22565b505b610d1781610d128460400151611527565b612d88565b5050505050565b5f805160206159e68339815191525f610d3684612d9b565b90505f80610d478360400151612f75565b50915091505f610d5683611ff5565b9050816001600160401b031681606001516001600160401b03161015610d8e5760405162461bcd60e51b8152600401610650906151a6565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dd35760405162461bcd60e51b8152600401610650906151e8565b60015f87815260068701602052604090205460ff166004811115610df957610df961501e565b14610e625760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610650565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615a268339815191529060ff1615610f905760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff7919061511c565b8360200135146110595760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610650565b3061106a6060850160408601615245565b6001600160a01b0316146110dc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610650565b5f6110ea6060850185615260565b91505f90508435602086013560146111086060890160408a01615245565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611437575f6111886060890189615260565b8363ffffffff1681811061119e5761119e6152a5565b90506020028101906111b091906152b9565b6111b990615369565b80515f81815260098901602052604090205491925090156111ec5760405162461bcd60e51b815260040161065090615400565b84825f01518360200151846040015160405160200161120e9493929190615448565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161125c9190615497565b602060405180830381855afa158015611277573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061129a919061511c565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113265761132661501e565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113d99116866154a8565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611430906154bb565b905061116c565b50600584018190555f61144986612d9b565b90505f61145982604001516131b0565b90508060028560405161146c9190615497565b602060405180830381855afa158015611487573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114aa919061511c565b1461150e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610650565b505050600a909201805460ff1916600117905550505050565b5f610c446001600160401b03831664e8d4a510006154dd565b5f61154a82611ff5565b6080015192915050565b5f805160206159e68339815191525f61156c85613319565b905061157785612ce7565b611582575050505050565b5f85815260058301602052604090205460a08201516115b191600160b01b90046001600160401b0316906154f4565b6001600160401b03168160c001516001600160401b031610156116325760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610650565b8315610d17575f61164386856120bd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061169a90611527565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611710573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611734919061511c565b5f878152600885016020526040812080549091906117539084906154a8565b9091555050505050505050565b6117686126e9565b5f805160206159e68339815191525f61178084612d9b565b90505f806117918360400151612f75565b50915091505f6117a083611ff5565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117da576117da61501e565b60048111156117eb576117eb61501e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561188a5760405162461bcd60e51b8152600401610650906151a6565b826001600160401b03168160e001516001600160401b031611156118c05760405162461bcd60e51b8152600401610650906151e8565b6003815160048111156118d5576118d561501e565b146119295760405162461bcd60e51b815260206004820152603160248201525f80516020615a068339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610650565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a019092528220549091906127109061197f9061ffff600160a01b90910416846154dd565b6119899190615187565b905080886008015f8881526020019081526020015f205f8282546119ad91906154a8565b909155505060208301516119ca906119c58385615514565b612d22565b6119df8360200151610d128560600151611527565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050611a6e60015f80516020615a4683398151915255565b5050565b5f80516020615a268339815191525f611a8a83612d9b565b90505f80611a9b8360400151613594565b9150915080611afd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610650565b5f82815260078501602052604081208054611b1790615527565b9050118015611b49575060015f83815260088601602052604090205460ff166005811115611b4757611b4761501e565b145b611b655760405162461bcd60e51b815260040161065090615559565b5f8281526007850160205260408120611b7d91614de7565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206159e683398151915293929190829060ff166004811115611c8b57611c8b61501e565b6004811115611c9c57611c9c61501e565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d2357611d2361501e565b1480611d415750600381516004811115611d3f57611d3f61501e565b145b611d955760405162461bcd60e51b815260206004820152603260248201525f80516020615a06833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610650565b5f611da38260400151611ff5565b905080606001516001600160401b03165f03611e275760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb611e548460400151846060015185608001516124b0565b6040518263ffffffff1660e01b8152600401611e709190615155565b6020604051808303815f875af1158015611e8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d17919061511c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615a26833981519152929190611ef890615527565b9050118015611f2a575060015f83815260088301602052604090205460ff166005811115611f2857611f2861501e565b145b611f465760405162461bcd60e51b815260040161065090615559565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f7f91906004016155a0565b6020604051808303815f875af1158015611f9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fbf919061511c565b505050565b5f611fcd6126e9565b611fd8823334613735565b9050611ff060015f80516020615a4683398151915255565b919050565b611ffd614e1e565b5f8281525f80516020615a66833981519152602052604090819020815160e0810190925280545f80516020615a26833981519152929190829060ff16600581111561204a5761204a61501e565b600581111561205b5761205b61501e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612108573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261212f9190810190615635565b91509150806121925760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121f9919061511c565b82511461225d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610650565b60208201516001600160a01b0316156122d35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610650565b5f806122e28460400151613aec565b9150915081871461234f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610650565b9695505050505050565b5f8281525f80516020615a66833981519152602052604081206002015481905f80516020615a2683398151915290600160801b90046001600160401b03166123a18582613cc4565b5f6123ab87613ed2565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123fb8a858b6124b0565b6040518263ffffffff1660e01b81526004016124179190615155565b6020604051808303815f875af1158015612433573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612457919061511c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612529576124e9816001615514565b6124f49060086154dd565b5081515f9083908390811061250b5761250b6152a5565b60200101906001600160f81b03191690815f1a9053506001016124d5565b505f5b600481101561259457612540816003615514565b61254b9060086154dd565b600263ffffffff16901c60f81b8282600261256691906154a8565b81518110612576576125766152a5565b60200101906001600160f81b03191690815f1a90535060010161252c565b505f5b60208110156125f6576125ab81601f615514565b6125b69060086154dd565b86901c60f81b826125c88360066154a8565b815181106125d8576125d86152a5565b60200101906001600160f81b03191690815f1a905350600101612597565b505f5b60088110156126615761260d816007615514565b6126189060086154dd565b6001600160401b038616901c60f81b826126338360266154a8565b81518110612643576126436152a5565b60200101906001600160f81b03191690815f1a9053506001016125f9565b505f5b60088110156126cc57612678816007615514565b6126839060086154dd565b6001600160401b038516901c60f81b8261269e83602e6154a8565b815181106126ae576126ae6152a5565b60200101906001600160f81b03191690815f1a905350600101612664565b50949350505050565b6126dd613f62565b6126e681613fad565b50565b5f80516020615a4683398151915280546001190161271a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206159e68339815191529061ffff86161080159061276c575061271061ffff861611155b6127885760405162461bcd60e51b815260040161065090615707565b60028101546001600160401b0390811690851610156128015760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610650565b80548310156128645760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610650565b80600101548311156128cb5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610650565b825f6128d682610c34565b90505f6128e38983614021565b905060405180606001604052806128f73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615a4683398151915255565b5f6129a6614e1e565b5f80516020615a268339815191525f6129be85612d9b565b90505f806129cf8360400151613594565b915091508015612a345760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610650565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612a6557612a6561501e565b6005811115612a7657612a7661501e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612ae757612ae761501e565b1480612b055750600182516005811115612b0357612b0361501e565b145b612b645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610650565b600382516005811115612b7957612b7961501e565b03612b8657506004612b8a565b5060055b6020808301515f90815260098801909152604081205581816005811115612bb357612bb361501e565b90816005811115612bc657612bc661501e565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612bfa57612bfa61501e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612cae57612cae61501e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612d6e575f80fd5b505af1158015612d80573d5f803e3d5ffd5b505050505050565b611a6e6001600160a01b03831682614586565b60408051606080820183525f8083526020830181905292820152905f80516020615a268339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612e10573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612e379190810190615635565b9150915080612e975760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610650565b8254825114612efa5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610650565b60208201516001600160a01b031615612f6d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610650565b509392505050565b5f805f8351603614612f995760405162461bcd60e51b815260040161065090615752565b5f805b6002811015612fe857612fb0816001615514565b612fbb9060086154dd565b61ffff16868281518110612fd157612fd16152a5565b016020015160f81c901b9190911790600101612f9c565b5061ffff81161561300b5760405162461bcd60e51b81526004016106509061579b565b5f805b600481101561306657613022816003615514565b61302d9060086154dd565b63ffffffff168761303f8360026154a8565b8151811061304f5761304f6152a5565b016020015160f81c901b919091179060010161300e565b5063ffffffff811660041461308d5760405162461bcd60e51b8152600401610650906157de565b5f805b60208110156130e2576130a481601f615514565b6130af9060086154dd565b886130bb8360066154a8565b815181106130cb576130cb6152a5565b016020015160f81c901b9190911790600101613090565b505f805b6008811015613141576130fa816007615514565b6131059060086154dd565b6001600160401b03168961311a8360266154a8565b8151811061312a5761312a6152a5565b016020015160f81c901b91909117906001016130e6565b505f805b60088110156131a057613159816007615514565b6131649060086154dd565b6001600160401b03168a61317983602e6154a8565b81518110613189576131896152a5565b016020015160f81c901b9190911790600101613145565b5091989097509095509350505050565b5f81516026146131d25760405162461bcd60e51b815260040161065090615752565b5f805b6002811015613221576131e9816001615514565b6131f49060086154dd565b61ffff1684828151811061320a5761320a6152a5565b016020015160f81c901b91909117906001016131d5565b5061ffff8116156132445760405162461bcd60e51b81526004016106509061579b565b5f805b600481101561329f5761325b816003615514565b6132669060086154dd565b63ffffffff16856132788360026154a8565b81518110613288576132886152a5565b016020015160f81c901b9190911790600101613247565b5063ffffffff8116156132c45760405162461bcd60e51b8152600401610650906157de565b5f805b60208110156126cc576132db81601f615514565b6132e69060086154dd565b866132f28360066154a8565b81518110613302576133026152a5565b016020015160f81c901b91909117906001016132c7565b613321614e1e565b5f8281525f80516020615a668339815191526020526040808220815160e0810190925280545f80516020615a2683398151915293929190829060ff16600581111561336e5761336e61501e565b600581111561337f5761337f61501e565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156133f1576133f161501e565b1461344d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610650565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156134915761349161501e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61353d8582612359565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146135b75760405162461bcd60e51b815260040161065090615752565b5f805b6002811015613606576135ce816001615514565b6135d99060086154dd565b61ffff168582815181106135ef576135ef6152a5565b016020015160f81c901b91909117906001016135ba565b5061ffff8116156136295760405162461bcd60e51b81526004016106509061579b565b5f805b600481101561368457613640816003615514565b61364b9060086154dd565b63ffffffff168661365d8360026154a8565b8151811061366d5761366d6152a5565b016020015160f81c901b919091179060010161362c565b5063ffffffff81166003146136ab5760405162461bcd60e51b8152600401610650906157de565b5f805b6020811015613700576136c281601f615514565b6136cd9060086154dd565b876136d98360066154a8565b815181106136e9576136e96152a5565b016020015160f81c901b91909117906001016136ae565b505f86602681518110613715576137156152a5565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206159e68339815191528161374e84610c34565b90505f61375a87611ff5565b905061376587612ce7565b6137c25760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610650565b6002815160058111156137d7576137d761501e565b146138365760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610650565b5f82826080015161384791906154f4565b60048501546040840151919250613869916001600160401b0390911690615825565b6001600160401b0316816001600160401b031611156138e85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610650565b5f806138f48a84612359565b915091505f8a8360405160200161392292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156139bd576139bd61501e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613b0f5760405162461bcd60e51b815260040161065090615752565b5f805b6002811015613b5e57613b26816001615514565b613b319060086154dd565b61ffff16858281518110613b4757613b476152a5565b016020015160f81c901b9190911790600101613b12565b5061ffff811615613b815760405162461bcd60e51b81526004016106509061579b565b5f805b6004811015613bdc57613b98816003615514565b613ba39060086154dd565b63ffffffff1686613bb58360026154a8565b81518110613bc557613bc56152a5565b016020015160f81c901b9190911790600101613b84565b5063ffffffff8116600514613c035760405162461bcd60e51b8152600401610650906157de565b5f805b6020811015613c5857613c1a81601f615514565b613c259060086154dd565b87613c318360066154a8565b81518110613c4157613c416152a5565b016020015160f81c901b9190911790600101613c06565b505f805b6008811015613cb757613c70816007615514565b613c7b9060086154dd565b6001600160401b031688613c908360266154a8565b81518110613ca057613ca06152a5565b016020015160f81c901b9190911790600101613c5c565b5090969095509350505050565b5f80516020615a268339815191525f6001600160401b038084169085161115613cf857613cf183856150fc565b9050613d05565b613d0284846150fc565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613d67575060028401548151613d63916001600160401b0316906154a8565b8210155b15613d8d576001600160401b038316606082015281815260408101516020820152613dac565b8281606001818151613d9f91906154f4565b6001600160401b03169052505b6060810151613dbc906064615825565b602082015160028601546001600160401b039290921691613de79190600160401b900460ff166154dd565b1015613e4b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610650565b856001600160401b031681604001818151613e6691906154a8565b9052506040810180516001600160401b0387169190613e86908390615514565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615a668339815191526020526040812060020180545f80516020615a2683398151915291600160401b9091046001600160401b0316906008613f1c83615850565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613fab57604051631afcd79f60e31b815260040160405180910390fd5b565b613fb5613f62565b613fbe81614619565b613fc6614632565b6126e6608082013560a0830135613fe360e0850160c08601615005565b613ff4610100860160e0870161586b565b61ffff1661400a61012087016101008801615884565b61401c61014088016101208901615245565b614642565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140ac5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610650565b5f80516020615a26833981519152426140cb6040860160208701615005565b6001600160401b03161161413d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610650565b61414d6040850160208601615005565b6001600160401b03166141636202a300426154a8565b116141d65760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610650565b833561422e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610650565b83355f9081526009820160205260409020541561425d5760405162461bcd60e51b815260040161065090615400565b603061426c60408601866158a4565b9050146142d15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610650565b6142db835f613cc4565b5f806143756040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906143209190615005565b6001600160401b0316815260200161433b60408a018a6158a4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614886565b5f82815260078601602052604090209193509150614393828261592a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143c0908590600401615155565b6020604051808303815f875af11580156143dc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614400919061511c565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156144785761447861501e565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614558918e01908e01615005565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145a95760405163cd78605960e01b8152306004820152602401610650565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146145f2576040519150601f19603f3d011682016040523d82523d5f602084013e6145f7565b606091505b5050905080611fbf57604051630a12f52160e11b815260040160405180910390fd5b614621613f62565b614629614c35565b6126e681614c3d565b61463a613f62565b613fab614ddf565b61464a613f62565b5f805160206159e6833981519152836146b65760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610650565b6127108411156146d85760405162461bcd60e51b815260040161065090615707565b858711156147405760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610650565b5f8360ff16116147ad5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610650565b600a60ff8416111561481f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610650565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146148f05760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610650565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561496757614927816001615514565b6149329060086154dd565b5081515f90839083908110614949576149496152a5565b60200101906001600160f81b03191690815f1a905350600101614913565b505f5b60048110156149cf5761497e816003615514565b6149899060086154dd565b600160ff919091161c60f81b826149a18360026154a8565b815181106149b1576149b16152a5565b60200101906001600160f81b03191690815f1a90535060010161496a565b505f5b6020811015614a2c57845181602081106149ee576149ee6152a5565b1a60f81b826149fe8360066154a8565b81518110614a0e57614a0e6152a5565b60200101906001600160f81b03191690815f1a9053506001016149d2565b505f5b6020811015614a8c5784602001518160208110614a4e57614a4e6152a5565b1a60f81b82614a5e8360266154a8565b81518110614a6e57614a6e6152a5565b60200101906001600160f81b03191690815f1a905350600101614a2f565b505f5b6008811015614b0057614aa3816007615514565b614aae9060086154dd565b60ff1685604001516001600160401b0316901c60f81b82826046614ad291906154a8565b81518110614ae257614ae26152a5565b60200101906001600160f81b03191690815f1a905350600101614a8f565b505f5b6030811015614b6b5784608001518181518110614b2257614b226152a5565b01602001516001600160f81b03191682614b3d83604e6154a8565b81518110614b4d57614b4d6152a5565b60200101906001600160f81b03191690815f1a905350600101614b03565b505f5b6008811015614bdd57614b82816007615514565b614b8d9060086154dd565b60608601516001600160401b0390811691161c60f81b82614baf83607e6154a8565b81518110614bbf57614bbf6152a5565b60200101906001600160f81b03191690815f1a905350600101614b6e565b50600281604051614bee9190615497565b602060405180830381855afa158015614c09573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c2c919061511c565b94909350915050565b613fab613f62565b614c45613f62565b80355f80516020615a2683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c916080840160608501615884565b60ff161115614cfe5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610650565b5f614d0f6080840160608501615884565b60ff1611614d775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610650565b614d876080830160608401615884565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614db86060830160408401615005565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61298a613f62565b508054614df390615527565b5f825580601f10614e02575050565b601f0160209004905f5260205f20908101906126e69190614e5a565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614e6e575f8155600101614e5b565b5090565b80151581146126e6575f80fd5b803563ffffffff81168114611ff0575f80fd5b5f805f60608486031215614ea4575f80fd5b833592506020840135614eb681614e72565b9150614ec460408501614e7f565b90509250925092565b5f60208284031215614edd575f80fd5b5035919050565b5f6101408284031215614ef5575f80fd5b50919050565b803561ffff81168114611ff0575f80fd5b80356001600160401b0381168114611ff0575f80fd5b5f805f60608486031215614f34575f80fd5b83356001600160401b03811115614f49575f80fd5b840160608187031215614f5a575f80fd5b9250614f6860208501614efb565b9150614ec460408501614f0c565b5f60208284031215614f86575f80fd5b610c7782614e7f565b5f8060408385031215614fa0575f80fd5b614fa983614e7f565b946020939093013593505050565b5f8060408385031215614fc8575f80fd5b82356001600160401b03811115614fdd575f80fd5b830160808186031215614fee575f80fd5b9150614ffc60208401614e7f565b90509250929050565b5f60208284031215615015575f80fd5b610c7782614f0c565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061505557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161509060608401826001600160401b03169052565b5060808301516150ab60808401826001600160401b03169052565b5060a08301516150c660a08401826001600160401b03169052565b5060c08301516150e160c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156150e1576150e16150e8565b5f6020828403121561512c575f80fd5b5051919050565b5f5b8381101561514d578181015183820152602001615135565b50505f910152565b602081525f8251806020840152615173816040850160208701615133565b601f01601f19169190910160400192915050565b5f826151a157634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b03811681146126e6575f80fd5b5f60208284031215615255575f80fd5b8135610c7781615231565b5f808335601e19843603018112615275575f80fd5b8301803591506001600160401b0382111561528e575f80fd5b6020019150600581901b36038213156124a9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126152cd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561530d5761530d6152d7565b60405290565b604051601f8201601f191681016001600160401b038111828210171561533b5761533b6152d7565b604052919050565b5f6001600160401b0382111561535b5761535b6152d7565b50601f01601f191660200190565b5f60608236031215615379575f80fd5b6153816152eb565b823581526020615392818501614f0c565b8183015260408401356001600160401b038111156153ae575f80fd5b840136601f8201126153be575f80fd5b80356153d16153cc82615343565b615313565b81815236848385010111156153e4575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615459818460208a01615133565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615489816028840160208801615133565b016028019695505050505050565b5f82516152cd818460208701615133565b80820180821115610c4457610c446150e8565b5f63ffffffff8083168181036154d3576154d36150e8565b6001019392505050565b8082028115828204841417610c4457610c446150e8565b6001600160401b038181168382160190808211156150e1576150e16150e8565b81810381811115610c4457610c446150e8565b600181811c9082168061553b57607f821691505b602082108103614ef557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546155b281615527565b806020870152604060018084165f81146155d357600181146155ef5761561c565b60ff19851660408a0152604084151560051b8a0101955061561c565b895f5260205f205f5b858110156156135781548b82018601529083019088016155f8565b8a016040019650505b509398975050505050505050565b8051611ff081614e72565b5f8060408385031215615646575f80fd5b82516001600160401b038082111561565c575f80fd5b908401906060828703121561566f575f80fd5b6156776152eb565b8251815260208084015161568a81615231565b8282015260408401518381111561569f575f80fd5b80850194505087601f8501126156b3575f80fd5b835192506156c36153cc84615343565b83815288828587010111156156d6575f80fd5b6156e584838301848801615133565b806040840152508195506156fa81880161562a565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615848576158486150e8565b505092915050565b5f6001600160401b038083168181036154d3576154d36150e8565b5f6020828403121561587b575f80fd5b610c7782614efb565b5f60208284031215615894575f80fd5b813560ff81168114610c77575f80fd5b5f808335601e198436030181126158b9575f80fd5b8301803591506001600160401b038211156158d2575f80fd5b6020019150368190038213156124a9575f80fd5b601f821115611fbf57805f5260205f20601f840160051c8101602085101561590b5750805b601f840160051c820191505b81811015610d17575f8155600101615917565b81516001600160401b03811115615943576159436152d7565b615957816159518454615527565b846158e6565b602080601f83116001811461598a575f84156159735750858301515b5f19600386901b1c1916600185901b178555612d80565b5f85815260208120601f198616915b828110156159b857888601518255948401946001909101908401615999565b50858210156159d557878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index e52abcb67..352e18632 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -54,11 +54,11 @@ abstract contract PoSValidatorManager is IRewardCalculator _rewardCalculator; /// @notice Maps the validation ID to its requirements. mapping(bytes32 validationID => PoSValidatorRequirements) _validatorRequirements; - /// @notice Maps the delegationID to the delegator information. + /// @notice Maps the delegation ID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; - /// @notice Maps the delegationID to its pending staking rewards. + /// @notice Maps the delegation ID to its pending staking rewards. mapping(bytes32 delegationID => uint256) _redeemableDelegatorRewards; - /// @notice Maps the validator owner address to its pending staking rewards. + /// @notice Maps the validation ID to its pending staking rewards. mapping(bytes32 validationID => uint256) _redeemableValidatorRewards; /// @notice Saves the uptime of a pending completed or completed validation period so that delegators can collect rewards. mapping(bytes32 validationID => uint64) _completedValidationUptimeSeconds; @@ -145,7 +145,11 @@ abstract contract PoSValidatorManager is Validator memory validator = _initializeEndValidation(validationID); - // Check that minimum stake duration has passed + if (!_isPoSValidator(validationID)) { + return; + } + + // Check that minimum stake duration has passed. require( validator.endedAt >= validator.startedAt + $._validatorRequirements[validationID].minStakeDuration, @@ -483,10 +487,16 @@ abstract contract PoSValidatorManager is // Update the delegator status $._delegatorStakes[delegationID].status = DelegatorStatus.Completed; - _reward(delegator.owner, $._redeemableDelegatorRewards[delegationID]); + uint256 rewards = $._redeemableDelegatorRewards[delegationID]; delete $._redeemableDelegatorRewards[delegationID]; + + uint256 validatorFees = + rewards * $._validatorRequirements[validationID].delegationFeeBips / 10000; + $._redeemableValidatorRewards[validationID] += validatorFees; + + _reward(delegator.owner, rewards - validatorFees); _unlock(delegator.owner, weightToValue(delegator.weight)); - // TODO can we remove the delegation from _delegatorStakes here? + delete $._delegatorStakes[delegationID]; emit DelegationEnded(delegationID, validationID, nonce); } From 061c125c4d524fa3e1bee37649dc36c7485df504 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 17:08:30 -0400 Subject: [PATCH 344/545] Review fixes --- contracts/staking/PoSValidatorManager.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 352e18632..7787dcb9c 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -185,6 +185,7 @@ abstract contract PoSValidatorManager is } address owner = $._validatorRequirements[validationID].owner; + // The validator can either be Completed or Invalidated here. We only grant rewards for Completed. if (validator.status == ValidatorStatus.Completed) { uint256 rewards = $._redeemableValidatorRewards[validationID]; delete $._redeemableValidatorRewards[validationID]; From 37168199fb6a60fd6ce6107e9ca25664eebd9629 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Wed, 18 Sep 2024 17:15:51 -0400 Subject: [PATCH 345/545] rename more files --- tests/flows/{staking => validatorManager}/erc20_delegation.go | 0 tests/flows/{staking => validatorManager}/erc20_token_staking.go | 0 tests/flows/{staking => validatorManager}/native_delegation.go | 0 tests/flows/{staking => validatorManager}/native_token_staking.go | 0 tests/flows/{staking => validatorManager}/poa_to_pos.go | 0 .../flows/{staking => validatorManager}/poa_validator_manager.go | 0 tests/utils/{staking.go => validator_manager.go} | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename tests/flows/{staking => validatorManager}/erc20_delegation.go (100%) rename tests/flows/{staking => validatorManager}/erc20_token_staking.go (100%) rename tests/flows/{staking => validatorManager}/native_delegation.go (100%) rename tests/flows/{staking => validatorManager}/native_token_staking.go (100%) rename tests/flows/{staking => validatorManager}/poa_to_pos.go (100%) rename tests/flows/{staking => validatorManager}/poa_validator_manager.go (100%) rename tests/utils/{staking.go => validator_manager.go} (100%) diff --git a/tests/flows/staking/erc20_delegation.go b/tests/flows/validatorManager/erc20_delegation.go similarity index 100% rename from tests/flows/staking/erc20_delegation.go rename to tests/flows/validatorManager/erc20_delegation.go diff --git a/tests/flows/staking/erc20_token_staking.go b/tests/flows/validatorManager/erc20_token_staking.go similarity index 100% rename from tests/flows/staking/erc20_token_staking.go rename to tests/flows/validatorManager/erc20_token_staking.go diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/validatorManager/native_delegation.go similarity index 100% rename from tests/flows/staking/native_delegation.go rename to tests/flows/validatorManager/native_delegation.go diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/validatorManager/native_token_staking.go similarity index 100% rename from tests/flows/staking/native_token_staking.go rename to tests/flows/validatorManager/native_token_staking.go diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/validatorManager/poa_to_pos.go similarity index 100% rename from tests/flows/staking/poa_to_pos.go rename to tests/flows/validatorManager/poa_to_pos.go diff --git a/tests/flows/staking/poa_validator_manager.go b/tests/flows/validatorManager/poa_validator_manager.go similarity index 100% rename from tests/flows/staking/poa_validator_manager.go rename to tests/flows/validatorManager/poa_validator_manager.go diff --git a/tests/utils/staking.go b/tests/utils/validator_manager.go similarity index 100% rename from tests/utils/staking.go rename to tests/utils/validator_manager.go From 19e28b3582a8e5db989c041947b5f247cbad2f2e Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 17:34:25 -0400 Subject: [PATCH 346/545] Fix unit tests --- .../tests/ERC20TokenStakingManagerTests.t.sol | 20 +-------- .../NativeTokenStakingManagerTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 41 +++++++++++-------- 3 files changed, 26 insertions(+), 37 deletions(-) diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index bc23cf689..ebad4feae 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -175,23 +175,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { uint256 stakeAmount = _weightToValue(DEFAULT_WEIGHT); vm.expectRevert(_formatErrorMessage("invalid min stake duration")); app.initializeValidatorRegistration( - input, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, - DEFAULT_MINIMUM_STAKE_DURATION - 1, - stakeAmount - ); - } - - function testInvalidValidatorDelegationFee() public { - ValidatorRegistrationInput memory input = - ValidatorRegistrationInput(DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY); - uint256 stakeAmount = _weightToValue(DEFAULT_WEIGHT); - vm.expectRevert(_formatErrorMessage("invalid delegation fee")); - app.initializeValidatorRegistration( - input, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1, - DEFAULT_MINIMUM_STAKE_DURATION, - stakeAmount + input, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION - 1, stakeAmount ); } @@ -212,7 +196,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration( input, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, _weightToValue(weight) ); diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index bde948c8f..c607e0f01 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -174,7 +174,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { uint64 weight ) internal virtual override returns (bytes32) { return app.initializeValidatorRegistration{value: _weightToValue(weight)}( - input, DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION + input, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION ); } diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 1ea6d1b0e..7b8ee3778 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -31,6 +31,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_REWARD_RATE = uint64(10); uint64 public constant DEFAULT_MINIMUM_STAKE_DURATION = 24 hours; 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 SECONDS_IN_YEAR = 31536000; @@ -74,10 +75,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); function testDelegationFeeBipsTooLow() public { - // ValidatorRegistrationInput calldata registrationInput, - // uint16 delegationFeeBips, - // uint64 minStakeDuration, - // uint256 stakeAmount ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, @@ -117,7 +114,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectRevert(_formatErrorMessage("invalid min stake duration")); _initializeValidatorRegistration( registrationInput, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION - 1, DEFAULT_MINIMUM_STAKE_AMOUNT ); @@ -132,7 +129,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectRevert(_formatErrorMessage("stake amount too low")); _initializeValidatorRegistration( registrationInput, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MINIMUM_STAKE_AMOUNT - 1 ); @@ -147,7 +144,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectRevert(_formatErrorMessage("stake amount too high")); _initializeValidatorRegistration( registrationInput, - DEFAULT_MINIMUM_DELEGATION_FEE_BIPS, + DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION, DEFAULT_MAXIMUM_STAKE_AMOUNT + 1 ); @@ -541,7 +538,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedNonce: 2 }); - uint256 expectedReward = rewardCalculator.calculateReward({ + uint256 expectedTotalReward = rewardCalculator.calculateReward({ stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, @@ -551,12 +548,15 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endSupply: 0 }); + uint256 expectedValidatorReward = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorReward; + _setUpCompleteEndDelegation({ validationID: validationID, delegationID: delegationID, delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedReward: expectedReward, + expectedReward: expectedDelegatorReward, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -703,21 +703,26 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedNonce: 4 }); + uint256 expectedTotalReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + 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 + }); + + uint256 expectedValidatorReward = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorReward; + // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) _setUpCompleteEndDelegation({ validationID: validationID, delegationID: delegationID1, delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedReward: rewardCalculator.calculateReward({ - stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), - 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 - }), + expectedReward: expectedDelegatorReward, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 From d5e5e26ec9ca8e82f25f4d524df10559c3d2d467 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 17:21:04 -0400 Subject: [PATCH 347/545] Function for withdrawing delegation fees --- .../ERC20TokenStakingManager.go | 25 +++++++++++++++++-- .../NativeTokenStakingManager.go | 25 +++++++++++++++++-- contracts/staking/PoSValidatorManager.sol | 19 ++++++++++++++ .../interfaces/IPoSValidatorManager.sol | 7 ++++++ 4 files changed, 72 insertions(+), 4 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index ead1c87ba..0d3ffc0ee 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,8 +83,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615f2d380380615f2d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615de08061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f366004615143565b6103bf565b005b61018461019436600461517e565b610862565b6101d76101a736600461517e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b61021761021236600461517e565b610a1b565b6040516001600160401b0390911681526020016101e1565b61018461023d3660046151a9565b610a31565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c3660046151e7565b610b10565b61018461027f366004615200565b610bb0565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af366004615228565b610d85565b6101d76102c236600461528c565b6113b9565b6102176102d536600461517e565b6113d2565b6101846102e8366004615143565b6113e6565b6101f2603081565b610184610303366004615200565b6115f2565b6101d76103163660046152a5565b611904565b6101846103293660046151e7565b611930565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b61018461036236600461517e565b611ae8565b61018461037536600461517e565b611d6e565b6101f2601481565b61039561039036600461517e565b611e82565b6040516101e191906152d9565b6102176202a30081565b6101d76103ba3660046153a0565b611f4a565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615d34833981519152949193919290829060ff166004811115610427576104276152c5565b6004811115610438576104386152c5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104b483611e82565b90506002825160048111156104cb576104cb6152c5565b1461051d5760405162461bcd60e51b815260206004820152602a60248201525f80516020615d548339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105825760405162461bcd60e51b815260206004820152603360248201525f80516020615d548339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610514565b6003825280515f90600290600581111561059e5761059e6152c5565b036105f55786156105b6576105b38487611f7f565b90505b5f836060015183608001516105cb9190615419565b90506105d7858261221b565b506001600160401b0390811660e0860152421660a085015250610629565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561065c85606001516113b9565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fd9190615439565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561073c5761073c6152c5565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610850916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615db48339815191526020526040808220815160e0810190925280545f80516020615d7483398151915293929190829060ff1660058111156108af576108af6152c5565b60058111156108c0576108c06152c5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561092f5761092f6152c5565b146109945760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb6109b98584606001515f612372565b6040518263ffffffff1660e01b81526004016109d59190615472565b6020604051808303815f875af11580156109f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a159190615439565b50505050565b5f610a2b64e8d4a51000836154a4565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a7a575080546001600160401b03808416911610155b15610a985760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ac38484612599565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615d348339815191525f80610b29846125b3565b91509150610b36826128fd565b610b405750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b6e57610b6e6152c5565b03610b93575f83815260088501602052604081208054919055610b918282612938565b505b610ba981610ba484604001516113b9565b6129ae565b5050505050565b5f80516020615d348339815191525f610bc8846129d1565b90505f80610bd98360400151612bab565b50915091505f610be883611e82565b9050816001600160401b031681606001516001600160401b03161015610c205760405162461bcd60e51b8152600401610514906154c3565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c655760405162461bcd60e51b815260040161051490615505565b60015f87815260068701602052604090205460ff166004811115610c8b57610c8b6152c5565b14610cf45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610514565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615d748339815191529060ff1615610e225760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e899190615439565b836020013514610eeb5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610514565b30610efc606085016040860161554e565b6001600160a01b031614610f6e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610514565b5f610f7c6060850185615569565b91505f9050843560208601356014610f9a6060890160408a0161554e565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112c9575f61101a6060890189615569565b8363ffffffff16818110611030576110306155ae565b905060200281019061104291906155c2565b61104b90615672565b80515f818152600989016020526040902054919250901561107e5760405162461bcd60e51b815260040161051490615709565b84825f0151836020015184604001516040516020016110a09493929190615751565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110ee91906157a0565b602060405180830381855afa158015611109573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061112c9190615439565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111b8576111b86152c5565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161126b9116866157b1565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112c2906157c4565b9050610ffe565b50600584018190555f6112db866129d1565b90505f6112eb8260400151612de6565b9050806002856040516112fe91906157a0565b602060405180830381855afa158015611319573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133c9190615439565b146113a05760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610514565b505050600a909201805460ff1916600117905550505050565b5f610a2b6001600160401b03831664e8d4a510006157e6565b5f6113dc82611e82565b6080015192915050565b5f80516020615d348339815191525f6113fe85612f58565b9050611409856128fd565b611414575050505050565b5f85815260058301602052604090205460a082015161144391600160b01b90046001600160401b0316906157fd565b6001600160401b03168160c001516001600160401b031610156114c45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610514565b8315610ba9575f6114d58685611f7f565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061152c906113b9565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156115a2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115c69190615439565b5f878152600885016020526040812080549091906115e59084906157b1565b9091555050505050505050565b6115fa6131d3565b5f80516020615d348339815191525f611612846129d1565b90505f806116238360400151612bab565b50915091505f61163283611e82565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561166c5761166c6152c5565b600481111561167d5761167d6152c5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561171c5760405162461bcd60e51b8152600401610514906154c3565b826001600160401b03168160e001516001600160401b031611156117525760405162461bcd60e51b815260040161051490615505565b600381516004811115611767576117676152c5565b146117bb5760405162461bcd60e51b815260206004820152603160248201525f80516020615d548339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610514565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a01909252822054909190612710906118119061ffff600160a01b90910416846157e6565b61181b91906154a4565b905080886008015f8881526020019081526020015f205f82825461183f91906157b1565b9091555050602083015161185c90611857838561581d565b612938565b6118718360200151610ba485606001516113b9565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a4505050505050505061190060015f80516020615d9483398151915255565b5050565b5f61190d6131d3565b61191883338461321d565b9050610a2b60015f80516020615d9483398151915255565b5f80516020615d748339815191525f611948836129d1565b90505f8061195983604001516135d7565b91509150806119bb5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610514565b5f828152600785016020526040812080546119d590615830565b9050118015611a07575060015f83815260088601602052604090205460ff166005811115611a0557611a056152c5565b145b611a235760405162461bcd60e51b815260040161051490615868565b5f8281526007850160205260408120611a3b91615093565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615d3483398151915293929190829060ff166004811115611b4957611b496152c5565b6004811115611b5a57611b5a6152c5565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611be157611be16152c5565b1480611bff5750600381516004811115611bfd57611bfd6152c5565b145b611c535760405162461bcd60e51b815260206004820152603260248201525f80516020615d54833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610514565b5f611c618260400151611e82565b905080606001516001600160401b03165f03611ce55760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb611d12846040015184606001518560800151612372565b6040518263ffffffff1660e01b8152600401611d2e9190615472565b6020604051808303815f875af1158015611d4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba99190615439565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615d74833981519152929190611db690615830565b9050118015611de8575060015f83815260088301602052604090205460ff166005811115611de657611de66152c5565b145b611e045760405162461bcd60e51b815260040161051490615868565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611e3d91906004016158af565b6020604051808303815f875af1158015611e59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e7d9190615439565b505050565b611e8a6150ca565b5f8281525f80516020615db4833981519152602052604090819020815160e0810190925280545f80516020615d74833981519152929190829060ff166005811115611ed757611ed76152c5565b6005811115611ee857611ee86152c5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611f536131d3565b611f5f85858585613778565b9050611f7760015f80516020615d9483398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611fca573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ff19190810190615944565b91509150806120545760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612097573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120bb9190615439565b82511461211f5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610514565b60208201516001600160a01b0316156121955760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610514565b5f806121a484604001516139ed565b915091508187146122115760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610514565b9695505050505050565b5f8281525f80516020615db4833981519152602052604081206002015481905f80516020615d7483398151915290600160801b90046001600160401b03166122638582613bc5565b5f61226d87613dd3565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6122bd8a858b612372565b6040518263ffffffff1660e01b81526004016122d99190615472565b6020604051808303815f875af11580156122f5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123199190615439565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156123eb576123ab81600161581d565b6123b69060086157e6565b5081515f908390839081106123cd576123cd6155ae565b60200101906001600160f81b03191690815f1a905350600101612397565b505f5b60048110156124565761240281600361581d565b61240d9060086157e6565b600263ffffffff16901c60f81b8282600261242891906157b1565b81518110612438576124386155ae565b60200101906001600160f81b03191690815f1a9053506001016123ee565b505f5b60208110156124b85761246d81601f61581d565b6124789060086157e6565b86901c60f81b8261248a8360066157b1565b8151811061249a5761249a6155ae565b60200101906001600160f81b03191690815f1a905350600101612459565b505f5b6008811015612523576124cf81600761581d565b6124da9060086157e6565b6001600160401b038616901c60f81b826124f58360266157b1565b81518110612505576125056155ae565b60200101906001600160f81b03191690815f1a9053506001016124bb565b505f5b600881101561258e5761253a81600761581d565b6125459060086157e6565b6001600160401b038516901c60f81b8261256083602e6157b1565b81518110612570576125706155ae565b60200101906001600160f81b03191690815f1a905350600101612526565b5090505b9392505050565b6125a1613e63565b6125aa82613eae565b61190081613f25565b5f6125bc6150ca565b5f80516020615d748339815191525f6125d4856129d1565b90505f806125e583604001516135d7565b91509150801561264a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610514565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561267b5761267b6152c5565b600581111561268c5761268c6152c5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156126fd576126fd6152c5565b148061271b5750600182516005811115612719576127196152c5565b145b61277a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610514565b60038251600581111561278f5761278f6152c5565b0361279c575060046127a0565b5060055b6020808301515f908152600988019091526040812055818160058111156127c9576127c96152c5565b908160058111156127dc576127dc6152c5565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612810576128106152c5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156128c4576128c46152c5565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615d1483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612993575f80fd5b505af11580156129a5573d5f803e3d5ffd5b50505050505050565b5f80516020615d1483398151915254611900906001600160a01b03168383613fc6565b60408051606080820183525f8083526020830181905292820152905f80516020615d748339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a46573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a6d9190810190615944565b9150915080612acd5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610514565b8254825114612b305760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610514565b60208201516001600160a01b031615612ba35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610514565b509392505050565b5f805f8351603614612bcf5760405162461bcd60e51b815260040161051490615a16565b5f805b6002811015612c1e57612be681600161581d565b612bf19060086157e6565b61ffff16868281518110612c0757612c076155ae565b016020015160f81c901b9190911790600101612bd2565b5061ffff811615612c415760405162461bcd60e51b815260040161051490615a5f565b5f805b6004811015612c9c57612c5881600361581d565b612c639060086157e6565b63ffffffff1687612c758360026157b1565b81518110612c8557612c856155ae565b016020015160f81c901b9190911790600101612c44565b5063ffffffff8116600414612cc35760405162461bcd60e51b815260040161051490615aa2565b5f805b6020811015612d1857612cda81601f61581d565b612ce59060086157e6565b88612cf18360066157b1565b81518110612d0157612d016155ae565b016020015160f81c901b9190911790600101612cc6565b505f805b6008811015612d7757612d3081600761581d565b612d3b9060086157e6565b6001600160401b031689612d508360266157b1565b81518110612d6057612d606155ae565b016020015160f81c901b9190911790600101612d1c565b505f805b6008811015612dd657612d8f81600761581d565b612d9a9060086157e6565b6001600160401b03168a612daf83602e6157b1565b81518110612dbf57612dbf6155ae565b016020015160f81c901b9190911790600101612d7b565b5091989097509095509350505050565b5f8151602614612e085760405162461bcd60e51b815260040161051490615a16565b5f805b6002811015612e5757612e1f81600161581d565b612e2a9060086157e6565b61ffff16848281518110612e4057612e406155ae565b016020015160f81c901b9190911790600101612e0b565b5061ffff811615612e7a5760405162461bcd60e51b815260040161051490615a5f565b5f805b6004811015612ed557612e9181600361581d565b612e9c9060086157e6565b63ffffffff1685612eae8360026157b1565b81518110612ebe57612ebe6155ae565b016020015160f81c901b9190911790600101612e7d565b5063ffffffff811615612efa5760405162461bcd60e51b815260040161051490615aa2565b5f805b6020811015612f4f57612f1181601f61581d565b612f1c9060086157e6565b86612f288360066157b1565b81518110612f3857612f386155ae565b016020015160f81c901b9190911790600101612efd565b50949350505050565b612f606150ca565b5f8281525f80516020615db48339815191526020526040808220815160e0810190925280545f80516020615d7483398151915293929190829060ff166005811115612fad57612fad6152c5565b6005811115612fbe57612fbe6152c5565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613030576130306152c5565b1461308c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610514565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156130d0576130d06152c5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61317c858261221b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615d9483398151915280546001190161320457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615d9483398151915255565b5f5f80516020615d348339815191528161323961021285614025565b90505f61324587611e82565b9050613250876128fd565b6132ad5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610514565b6002815160058111156132c2576132c26152c5565b146133215760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610514565b5f82826080015161333291906157fd565b60048501546040840151919250613354916001600160401b0390911690615ae9565b6001600160401b0316816001600160401b031611156133d35760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610514565b5f806133df8a8461221b565b915091505f8a8360405160200161340d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156134a8576134a86152c5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146135fa5760405162461bcd60e51b815260040161051490615a16565b5f805b60028110156136495761361181600161581d565b61361c9060086157e6565b61ffff16858281518110613632576136326155ae565b016020015160f81c901b91909117906001016135fd565b5061ffff81161561366c5760405162461bcd60e51b815260040161051490615a5f565b5f805b60048110156136c75761368381600361581d565b61368e9060086157e6565b63ffffffff16866136a08360026157b1565b815181106136b0576136b06155ae565b016020015160f81c901b919091179060010161366f565b5063ffffffff81166003146136ee5760405162461bcd60e51b815260040161051490615aa2565b5f805b60208110156137435761370581601f61581d565b6137109060086157e6565b8761371c8360066157b1565b8151811061372c5761372c6155ae565b016020015160f81c901b91909117906001016136f1565b505f86602681518110613758576137586155ae565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615d348339815191529061ffff8616108015906137c4575061271061ffff861611155b6137e05760405162461bcd60e51b815260040161051490615b14565b60028101546001600160401b0390811690851610156138595760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610514565b80548310156138bc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610514565b80600101548311156139235760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610514565b5f61392d84614025565b90505f61393982610a1b565b90505f6139468983614048565b9050604051806060016040528061395a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613a105760405162461bcd60e51b815260040161051490615a16565b5f805b6002811015613a5f57613a2781600161581d565b613a329060086157e6565b61ffff16858281518110613a4857613a486155ae565b016020015160f81c901b9190911790600101613a13565b5061ffff811615613a825760405162461bcd60e51b815260040161051490615a5f565b5f805b6004811015613add57613a9981600361581d565b613aa49060086157e6565b63ffffffff1686613ab68360026157b1565b81518110613ac657613ac66155ae565b016020015160f81c901b9190911790600101613a85565b5063ffffffff8116600514613b045760405162461bcd60e51b815260040161051490615aa2565b5f805b6020811015613b5957613b1b81601f61581d565b613b269060086157e6565b87613b328360066157b1565b81518110613b4257613b426155ae565b016020015160f81c901b9190911790600101613b07565b505f805b6008811015613bb857613b7181600761581d565b613b7c9060086157e6565b6001600160401b031688613b918360266157b1565b81518110613ba157613ba16155ae565b016020015160f81c901b9190911790600101613b5d565b5090969095509350505050565b5f80516020615d748339815191525f6001600160401b038084169085161115613bf957613bf28385615419565b9050613c06565b613c038484615419565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613c68575060028401548151613c64916001600160401b0316906157b1565b8210155b15613c8e576001600160401b038316606082015281815260408101516020820152613cad565b8281606001818151613ca091906157fd565b6001600160401b03169052505b6060810151613cbd906064615ae9565b602082015160028601546001600160401b039290921691613ce89190600160401b900460ff166157e6565b1015613d4c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610514565b856001600160401b031681604001818151613d6791906157b1565b9052506040810180516001600160401b0387169190613d8790839061581d565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615db48339815191526020526040812060020180545f80516020615d7483398151915291600160401b9091046001600160401b0316906008613e1d83615b5f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613eac57604051631afcd79f60e31b815260040160405180910390fd5b565b613eb6613e63565b613ebf816145ad565b613ec76145c6565b613f22608082013560a0830135613ee460e0850160c0860161528c565b613ef5610100860160e08701615b7a565b61ffff16613f0b61012087016101008801615b93565b613f1d6101408801610120890161554e565b6145d6565b50565b613f2d613e63565b5f80516020615d148339815191526001600160a01b038216613fa65760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610514565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611e7d91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061481a565b5f610a2b825f80516020615d14833981519152546001600160a01b03169061487b565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140d35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610514565b5f80516020615d74833981519152426140f2604086016020870161528c565b6001600160401b0316116141645760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610514565b614174604085016020860161528c565b6001600160401b031661418a6202a300426157b1565b116141fd5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610514565b83356142555760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610514565b83355f908152600982016020526040902054156142845760405162461bcd60e51b815260040161051490615709565b60306142936040860186615bb3565b9050146142f85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610514565b614302835f613bc5565b5f8061439c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614347919061528c565b6001600160401b0316815260200161436260408a018a615bb3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149dd565b5f828152600786016020526040902091935091506143ba8282615c39565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143e7908590600401615472565b6020604051808303815f875af1158015614403573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144279190615439565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561449f5761449f6152c5565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161457f918e01908e0161528c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6145b5613e63565b6145bd614d8c565b613f2281614d94565b6145ce613e63565b613eac614f36565b6145de613e63565b5f80516020615d348339815191528361464a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610514565b61271084111561466c5760405162461bcd60e51b815260040161051490615b14565b858711156146d45760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610514565b5f8360ff16116147415760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610514565b600a60ff841611156147b35760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610514565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61482e6001600160a01b03841683614f3e565b905080515f141580156148525750808060200190518101906148509190615cf8565b155b15611e7d57604051635274afe760e01b81526001600160a01b0384166004820152602401610514565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156148c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148e59190615439565b90506148fc6001600160a01b038516333086614f4b565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614940573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149649190615439565b90508181116149ca5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610514565b6149d4828261581d565b95945050505050565b5f6060826080015151603014614a475760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610514565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614abe57614a7e81600161581d565b614a899060086157e6565b5081515f90839083908110614aa057614aa06155ae565b60200101906001600160f81b03191690815f1a905350600101614a6a565b505f5b6004811015614b2657614ad581600361581d565b614ae09060086157e6565b600160ff919091161c60f81b82614af88360026157b1565b81518110614b0857614b086155ae565b60200101906001600160f81b03191690815f1a905350600101614ac1565b505f5b6020811015614b835784518160208110614b4557614b456155ae565b1a60f81b82614b558360066157b1565b81518110614b6557614b656155ae565b60200101906001600160f81b03191690815f1a905350600101614b29565b505f5b6020811015614be35784602001518160208110614ba557614ba56155ae565b1a60f81b82614bb58360266157b1565b81518110614bc557614bc56155ae565b60200101906001600160f81b03191690815f1a905350600101614b86565b505f5b6008811015614c5757614bfa81600761581d565b614c059060086157e6565b60ff1685604001516001600160401b0316901c60f81b82826046614c2991906157b1565b81518110614c3957614c396155ae565b60200101906001600160f81b03191690815f1a905350600101614be6565b505f5b6030811015614cc25784608001518181518110614c7957614c796155ae565b01602001516001600160f81b03191682614c9483604e6157b1565b81518110614ca457614ca46155ae565b60200101906001600160f81b03191690815f1a905350600101614c5a565b505f5b6008811015614d3457614cd981600761581d565b614ce49060086157e6565b60608601516001600160401b0390811691161c60f81b82614d0683607e6157b1565b81518110614d1657614d166155ae565b60200101906001600160f81b03191690815f1a905350600101614cc5565b50600281604051614d4591906157a0565b602060405180830381855afa158015614d60573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d839190615439565b94909350915050565b613eac613e63565b614d9c613e63565b80355f80516020615d7483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614de86080840160608501615b93565b60ff161115614e555760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610514565b5f614e666080840160608501615b93565b60ff1611614ece5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610514565b614ede6080830160608401615b93565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f0f606083016040840161528c565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61320a613e63565b606061259283835f614f84565b6040516001600160a01b038481166024830152838116604483015260648201839052610a159186918216906323b872dd90608401613ff3565b606081471015614fa95760405163cd78605960e01b8152306004820152602401610514565b5f80856001600160a01b03168486604051614fc491906157a0565b5f6040518083038185875af1925050503d805f8114614ffe576040519150601f19603f3d011682016040523d82523d5f602084013e615003565b606091505b50915091506122118683836060826150235761501e8261506a565b612592565b815115801561503a57506001600160a01b0384163b155b1561506357604051639996b31560e01b81526001600160a01b0385166004820152602401610514565b5080612592565b80511561507a5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461509f90615830565b5f825580601f106150ae575050565b601f0160209004905f5260205f2090810190613f229190615106565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561511a575f8155600101615107565b5090565b8015158114613f22575f80fd5b803563ffffffff8116811461513e575f80fd5b919050565b5f805f60608486031215615155575f80fd5b8335925060208401356151678161511e565b91506151756040850161512b565b90509250925092565b5f6020828403121561518e575f80fd5b5035919050565b6001600160a01b0381168114613f22575f80fd5b5f808284036101608112156151bc575f80fd5b610140808212156151cb575f80fd5b84935083013590506151dc81615195565b809150509250929050565b5f602082840312156151f7575f80fd5b6125928261512b565b5f8060408385031215615211575f80fd5b61521a8361512b565b946020939093013593505050565b5f8060408385031215615239575f80fd5b82356001600160401b0381111561524e575f80fd5b83016080818603121561525f575f80fd5b915061526d6020840161512b565b90509250929050565b80356001600160401b038116811461513e575f80fd5b5f6020828403121561529c575f80fd5b61259282615276565b5f80604083850312156152b6575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106152fc57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161533760608401826001600160401b03169052565b50608083015161535260808401826001600160401b03169052565b5060a083015161536d60a08401826001600160401b03169052565b5060c083015161538860c08401826001600160401b03169052565b5092915050565b803561ffff8116811461513e575f80fd5b5f805f80608085870312156153b3575f80fd5b84356001600160401b038111156153c8575f80fd5b8501606081880312156153d9575f80fd5b93506153e76020860161538f565b92506153f560408601615276565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561538857615388615405565b5f60208284031215615449575f80fd5b5051919050565b5f5b8381101561546a578181015183820152602001615452565b50505f910152565b602081525f8251806020840152615490816040850160208701615450565b601f01601f19169190910160400192915050565b5f826154be57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f6020828403121561555e575f80fd5b813561259281615195565b5f808335601e1984360301811261557e575f80fd5b8301803591506001600160401b03821115615597575f80fd5b6020019150600581901b360382131561236b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155d6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615616576156166155e0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615644576156446155e0565b604052919050565b5f6001600160401b03821115615664576156646155e0565b50601f01601f191660200190565b5f60608236031215615682575f80fd5b61568a6155f4565b82358152602061569b818501615276565b8183015260408401356001600160401b038111156156b7575f80fd5b840136601f8201126156c7575f80fd5b80356156da6156d58261564c565b61561c565b81815236848385010111156156ed575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615762818460208a01615450565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615792816028840160208801615450565b016028019695505050505050565b5f82516155d6818460208701615450565b80820180821115610a2b57610a2b615405565b5f63ffffffff8083168181036157dc576157dc615405565b6001019392505050565b8082028115828204841417610a2b57610a2b615405565b6001600160401b0381811683821601908082111561538857615388615405565b81810381811115610a2b57610a2b615405565b600181811c9082168061584457607f821691505b60208210810361586257634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546158c181615830565b806020870152604060018084165f81146158e257600181146158fe5761592b565b60ff19851660408a0152604084151560051b8a0101955061592b565b895f5260205f205f5b858110156159225781548b8201860152908301908801615907565b8a016040019650505b509398975050505050505050565b805161513e8161511e565b5f8060408385031215615955575f80fd5b82516001600160401b038082111561596b575f80fd5b908401906060828703121561597e575f80fd5b6159866155f4565b8251815260208084015161599981615195565b828201526040840151838111156159ae575f80fd5b80850194505087601f8501126159c2575f80fd5b835192506159d26156d58461564c565b83815288828587010111156159e5575f80fd5b6159f484838301848801615450565b80604084015250819550615a09818801615939565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615b0c57615b0c615405565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036157dc576157dc615405565b5f60208284031215615b8a575f80fd5b6125928261538f565b5f60208284031215615ba3575f80fd5b813560ff81168114612592575f80fd5b5f808335601e19843603018112615bc8575f80fd5b8301803591506001600160401b03821115615be1575f80fd5b60200191503681900382131561236b575f80fd5b601f821115611e7d57805f5260205f20601f840160051c81016020851015615c1a5750805b601f840160051c820191505b81811015610ba9575f8155600101615c26565b81516001600160401b03811115615c5257615c526155e0565b615c6681615c608454615830565b84615bf5565b602080601f831160018114615c99575f8415615c825750858301515b5f19600386901b1c1916600185901b178555615cf0565b5f85815260208120601f198616915b82811015615cc757888601518255948401946001909101908401615ca8565b5085821015615ce457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615d08575f80fd5b81516125928161511e56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516160ab3803806160ab83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f5e8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152c1565b6103ec565b005b61019e6101ae3660046152fc565b61088f565b6101f16101c13660046152fc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152fc565b610a48565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615327565b610a5e565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615365565b610b3d565b61019e61029936600461537e565b610bdd565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c93660046153a6565b610db2565b6101f16102dc36600461540a565b6113e6565b6102316102ef3660046152fc565b6113ff565b61019e6103023660046152c1565b611413565b61020c603081565b61019e61031d3660046152fc565b61161f565b61019e61033036600461537e565b611770565b6101f1610343366004615423565b611a82565b61019e610356366004615365565b611aae565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152fc565b611c66565b61019e6103a23660046152fc565b611eec565b61020c601481565b6103c26103bd3660046152fc565b612000565b6040516101fb9190615457565b6102316202a30081565b6101f16103e736600461551e565b6120c8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615eb2833981519152949193919290829060ff16600481111561045457610454615443565b600481111561046557610465615443565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104e183612000565b90506002825160048111156104f8576104f8615443565b1461054a5760405162461bcd60e51b815260206004820152602a60248201525f80516020615ed28339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105af5760405162461bcd60e51b815260206004820152603360248201525f80516020615ed28339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610541565b6003825280515f9060029060058111156105cb576105cb615443565b036106225786156105e3576105e084876120fd565b90505b5f836060015183608001516105f89190615597565b90506106048582612399565b506001600160401b0390811660e0860152421660a085015250610656565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068985606001516113e6565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072a91906155b7565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561076957610769615443565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087d916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f328339815191526020526040808220815160e0810190925280545f80516020615ef283398151915293929190829060ff1660058111156108dc576108dc615443565b60058111156108ed576108ed615443565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c615443565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6124f0565b6040518263ffffffff1660e01b8152600401610a0291906155f0565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4291906155b7565b50505050565b5f610a5864e8d4a5100083615622565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa7575080546001600160401b03808416911610155b15610ac55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af08484612717565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615eb28339815191525f80610b5684612731565b91509150610b6382612a7b565b610b6d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9b57610b9b615443565b03610bc0575f83815260088501602052604081208054919055610bbe8282612ab6565b505b610bd681610bd184604001516113e6565b612b2c565b5050505050565b5f80516020615eb28339815191525f610bf584612b4f565b90505f80610c068360400151612d29565b50915091505f610c1583612000565b9050816001600160401b031681606001516001600160401b03161015610c4d5760405162461bcd60e51b815260040161054190615641565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c925760405162461bcd60e51b815260040161054190615683565b60015f87815260068701602052604090205460ff166004811115610cb857610cb8615443565b14610d215760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610541565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ef28339815191529060ff1615610e4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb691906155b7565b836020013514610f185760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610541565b30610f2960608501604086016156cc565b6001600160a01b031614610f9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610541565b5f610fa960608501856156e7565b91505f9050843560208601356014610fc76060890160408a016156cc565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f6575f61104760608901896156e7565b8363ffffffff1681811061105d5761105d61572c565b905060200281019061106f9190615740565b611078906157f0565b80515f81815260098901602052604090205491925090156110ab5760405162461bcd60e51b815260040161054190615887565b84825f0151836020015184604001516040516020016110cd94939291906158cf565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111b919061591e565b602060405180830381855afa158015611136573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115991906155b7565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e5576111e5615443565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129891168661592f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ef90615942565b905061102b565b50600584018190555f61130886612b4f565b90505f6113188260400151612f64565b90508060028560405161132b919061591e565b602060405180830381855afa158015611346573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136991906155b7565b146113cd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610541565b505050600a909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a51000615964565b5f61140982612000565b6080015192915050565b5f80516020615eb28339815191525f61142b856130d6565b905061143685612a7b565b611441575050505050565b5f85815260058301602052604090205460a082015161147091600160b01b90046001600160401b03169061597b565b6001600160401b03168160c001516001600160401b031610156114f15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610541565b8315610bd6575f61150286856120fd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611559906113e6565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f391906155b7565b5f8781526008850160205260408120805490919061161290849061592f565b9091555050505050505050565b5f80516020615eb28339815191525f61163783612000565b905060048151600581111561164e5761164e615443565b146116b85760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610541565b5f8381526005830160205260409020546001600160a01b0316331461173a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610541565b5f83815260088301602090815260408083208054908490556005860190925290912054610a42906001600160a01b031682612ab6565b611778613351565b5f80516020615eb28339815191525f61179084612b4f565b90505f806117a18360400151612d29565b50915091505f6117b083612000565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117ea576117ea615443565b60048111156117fb576117fb615443565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561189a5760405162461bcd60e51b815260040161054190615641565b826001600160401b03168160e001516001600160401b031611156118d05760405162461bcd60e51b815260040161054190615683565b6003815160048111156118e5576118e5615443565b146119395760405162461bcd60e51b815260206004820152603160248201525f80516020615ed28339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610541565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a019092528220549091906127109061198f9061ffff600160a01b9091041684615964565b6119999190615622565b905080886008015f8881526020019081526020015f205f8282546119bd919061592f565b909155505060208301516119da906119d5838561599b565b612ab6565b6119ef8360200151610bd185606001516113e6565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050611a7e60015f80516020615f1283398151915255565b5050565b5f611a8b613351565b611a9683338461339b565b9050610a5860015f80516020615f1283398151915255565b5f80516020615ef28339815191525f611ac683612b4f565b90505f80611ad78360400151613755565b9150915080611b395760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610541565b5f82815260078501602052604081208054611b53906159ae565b9050118015611b85575060015f83815260088601602052604090205460ff166005811115611b8357611b83615443565b145b611ba15760405162461bcd60e51b8152600401610541906159e6565b5f8281526007850160205260408120611bb991615211565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615eb283398151915293929190829060ff166004811115611cc757611cc7615443565b6004811115611cd857611cd8615443565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5f57611d5f615443565b1480611d7d5750600381516004811115611d7b57611d7b615443565b145b611dd15760405162461bcd60e51b815260206004820152603260248201525f80516020615ed2833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610541565b5f611ddf8260400151612000565b905080606001516001600160401b03165f03611e635760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb611e908460400151846060015185608001516124f0565b6040518263ffffffff1660e01b8152600401611eac91906155f0565b6020604051808303815f875af1158015611ec8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd691906155b7565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ef2833981519152929190611f34906159ae565b9050118015611f66575060015f83815260088301602052604090205460ff166005811115611f6457611f64615443565b145b611f825760405162461bcd60e51b8152600401610541906159e6565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fbb9190600401615a2d565b6020604051808303815f875af1158015611fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffb91906155b7565b505050565b612008615248565b5f8281525f80516020615f32833981519152602052604090819020815160e0810190925280545f80516020615ef2833981519152929190829060ff16600581111561205557612055615443565b600581111561206657612066615443565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120d1613351565b6120dd858585856138f6565b90506120f560015f80516020615f1283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612148573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261216f9190810190615ac2565b91509150806121d25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612215573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223991906155b7565b82511461229d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610541565b60208201516001600160a01b0316156123135760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610541565b5f806123228460400151613b6b565b9150915081871461238f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610541565b9695505050505050565b5f8281525f80516020615f32833981519152602052604081206002015481905f80516020615ef283398151915290600160801b90046001600160401b03166123e18582613d43565b5f6123eb87613f51565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61243b8a858b6124f0565b6040518263ffffffff1660e01b815260040161245791906155f0565b6020604051808303815f875af1158015612473573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249791906155b7565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156125695761252981600161599b565b612534906008615964565b5081515f9083908390811061254b5761254b61572c565b60200101906001600160f81b03191690815f1a905350600101612515565b505f5b60048110156125d45761258081600361599b565b61258b906008615964565b600263ffffffff16901c60f81b828260026125a6919061592f565b815181106125b6576125b661572c565b60200101906001600160f81b03191690815f1a90535060010161256c565b505f5b6020811015612636576125eb81601f61599b565b6125f6906008615964565b86901c60f81b8261260883600661592f565b815181106126185761261861572c565b60200101906001600160f81b03191690815f1a9053506001016125d7565b505f5b60088110156126a15761264d81600761599b565b612658906008615964565b6001600160401b038616901c60f81b8261267383602661592f565b815181106126835761268361572c565b60200101906001600160f81b03191690815f1a905350600101612639565b505f5b600881101561270c576126b881600761599b565b6126c3906008615964565b6001600160401b038516901c60f81b826126de83602e61592f565b815181106126ee576126ee61572c565b60200101906001600160f81b03191690815f1a9053506001016126a4565b5090505b9392505050565b61271f613fe1565b6127288261402c565b611a7e816140a3565b5f61273a615248565b5f80516020615ef28339815191525f61275285612b4f565b90505f806127638360400151613755565b9150915080156127c85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610541565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f9576127f9615443565b600581111561280a5761280a615443565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561287b5761287b615443565b1480612899575060018251600581111561289757612897615443565b145b6128f85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610541565b60038251600581111561290d5761290d615443565b0361291a5750600461291e565b5060055b6020808301515f9081526009880190915260408120558181600581111561294757612947615443565b9081600581111561295a5761295a615443565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561298e5761298e615443565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a4257612a42615443565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615e9283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b11575f80fd5b505af1158015612b23573d5f803e3d5ffd5b50505050505050565b5f80516020615e9283398151915254611a7e906001600160a01b03168383614144565b60408051606080820183525f8083526020830181905292820152905f80516020615ef28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bc4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612beb9190810190615ac2565b9150915080612c4b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610541565b8254825114612cae5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610541565b60208201516001600160a01b031615612d215760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610541565b509392505050565b5f805f8351603614612d4d5760405162461bcd60e51b815260040161054190615b94565b5f805b6002811015612d9c57612d6481600161599b565b612d6f906008615964565b61ffff16868281518110612d8557612d8561572c565b016020015160f81c901b9190911790600101612d50565b5061ffff811615612dbf5760405162461bcd60e51b815260040161054190615bdd565b5f805b6004811015612e1a57612dd681600361599b565b612de1906008615964565b63ffffffff1687612df383600261592f565b81518110612e0357612e0361572c565b016020015160f81c901b9190911790600101612dc2565b5063ffffffff8116600414612e415760405162461bcd60e51b815260040161054190615c20565b5f805b6020811015612e9657612e5881601f61599b565b612e63906008615964565b88612e6f83600661592f565b81518110612e7f57612e7f61572c565b016020015160f81c901b9190911790600101612e44565b505f805b6008811015612ef557612eae81600761599b565b612eb9906008615964565b6001600160401b031689612ece83602661592f565b81518110612ede57612ede61572c565b016020015160f81c901b9190911790600101612e9a565b505f805b6008811015612f5457612f0d81600761599b565b612f18906008615964565b6001600160401b03168a612f2d83602e61592f565b81518110612f3d57612f3d61572c565b016020015160f81c901b9190911790600101612ef9565b5091989097509095509350505050565b5f8151602614612f865760405162461bcd60e51b815260040161054190615b94565b5f805b6002811015612fd557612f9d81600161599b565b612fa8906008615964565b61ffff16848281518110612fbe57612fbe61572c565b016020015160f81c901b9190911790600101612f89565b5061ffff811615612ff85760405162461bcd60e51b815260040161054190615bdd565b5f805b60048110156130535761300f81600361599b565b61301a906008615964565b63ffffffff168561302c83600261592f565b8151811061303c5761303c61572c565b016020015160f81c901b9190911790600101612ffb565b5063ffffffff8116156130785760405162461bcd60e51b815260040161054190615c20565b5f805b60208110156130cd5761308f81601f61599b565b61309a906008615964565b866130a683600661592f565b815181106130b6576130b661572c565b016020015160f81c901b919091179060010161307b565b50949350505050565b6130de615248565b5f8281525f80516020615f328339815191526020526040808220815160e0810190925280545f80516020615ef283398151915293929190829060ff16600581111561312b5761312b615443565b600581111561313c5761313c615443565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131ae576131ae615443565b1461320a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610541565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561324e5761324e615443565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132fa8582612399565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f1283398151915280546001190161338257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f1283398151915255565b5f5f80516020615eb2833981519152816133b761022c856141a3565b90505f6133c387612000565b90506133ce87612a7b565b61342b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610541565b60028151600581111561344057613440615443565b1461349f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610541565b5f8282608001516134b0919061597b565b600485015460408401519192506134d2916001600160401b0390911690615c67565b6001600160401b0316816001600160401b031611156135515760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610541565b5f8061355d8a84612399565b915091505f8a8360405160200161358b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561362657613626615443565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137785760405162461bcd60e51b815260040161054190615b94565b5f805b60028110156137c75761378f81600161599b565b61379a906008615964565b61ffff168582815181106137b0576137b061572c565b016020015160f81c901b919091179060010161377b565b5061ffff8116156137ea5760405162461bcd60e51b815260040161054190615bdd565b5f805b60048110156138455761380181600361599b565b61380c906008615964565b63ffffffff168661381e83600261592f565b8151811061382e5761382e61572c565b016020015160f81c901b91909117906001016137ed565b5063ffffffff811660031461386c5760405162461bcd60e51b815260040161054190615c20565b5f805b60208110156138c15761388381601f61599b565b61388e906008615964565b8761389a83600661592f565b815181106138aa576138aa61572c565b016020015160f81c901b919091179060010161386f565b505f866026815181106138d6576138d661572c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615eb28339815191529061ffff861610801590613942575061271061ffff861611155b61395e5760405162461bcd60e51b815260040161054190615c92565b60028101546001600160401b0390811690851610156139d75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610541565b8054831015613a3a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610541565b8060010154831115613aa15760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610541565b5f613aab846141a3565b90505f613ab782610a48565b90505f613ac489836141c6565b90506040518060600160405280613ad83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b8e5760405162461bcd60e51b815260040161054190615b94565b5f805b6002811015613bdd57613ba581600161599b565b613bb0906008615964565b61ffff16858281518110613bc657613bc661572c565b016020015160f81c901b9190911790600101613b91565b5061ffff811615613c005760405162461bcd60e51b815260040161054190615bdd565b5f805b6004811015613c5b57613c1781600361599b565b613c22906008615964565b63ffffffff1686613c3483600261592f565b81518110613c4457613c4461572c565b016020015160f81c901b9190911790600101613c03565b5063ffffffff8116600514613c825760405162461bcd60e51b815260040161054190615c20565b5f805b6020811015613cd757613c9981601f61599b565b613ca4906008615964565b87613cb083600661592f565b81518110613cc057613cc061572c565b016020015160f81c901b9190911790600101613c85565b505f805b6008811015613d3657613cef81600761599b565b613cfa906008615964565b6001600160401b031688613d0f83602661592f565b81518110613d1f57613d1f61572c565b016020015160f81c901b9190911790600101613cdb565b5090969095509350505050565b5f80516020615ef28339815191525f6001600160401b038084169085161115613d7757613d708385615597565b9050613d84565b613d818484615597565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613de6575060028401548151613de2916001600160401b03169061592f565b8210155b15613e0c576001600160401b038316606082015281815260408101516020820152613e2b565b8281606001818151613e1e919061597b565b6001600160401b03169052505b6060810151613e3b906064615c67565b602082015160028601546001600160401b039290921691613e669190600160401b900460ff16615964565b1015613eca5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610541565b856001600160401b031681604001818151613ee5919061592f565b9052506040810180516001600160401b0387169190613f0590839061599b565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f328339815191526020526040812060020180545f80516020615ef283398151915291600160401b9091046001600160401b0316906008613f9b83615cdd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402a57604051631afcd79f60e31b815260040160405180910390fd5b565b614034613fe1565b61403d8161472b565b614045614744565b6140a0608082013560a083013561406260e0850160c0860161540a565b614073610100860160e08701615cf8565b61ffff1661408961012087016101008801615d11565b61409b610140880161012089016156cc565b614754565b50565b6140ab613fe1565b5f80516020615e928339815191526001600160a01b0382166141245760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610541565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ffb91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614998565b5f610a58825f80516020615e92833981519152546001600160a01b0316906149f9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142515760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610541565b5f80516020615ef283398151915242614270604086016020870161540a565b6001600160401b0316116142e25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610541565b6142f2604085016020860161540a565b6001600160401b03166143086202a3004261592f565b1161437b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610541565b83356143d35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610541565b83355f908152600982016020526040902054156144025760405162461bcd60e51b815260040161054190615887565b60306144116040860186615d31565b9050146144765760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610541565b614480835f613d43565b5f8061451a6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144c5919061540a565b6001600160401b031681526020016144e060408a018a615d31565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b5b565b5f828152600786016020526040902091935091506145388282615db7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145659085906004016155f0565b6020604051808303815f875af1158015614581573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a591906155b7565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561461d5761461d615443565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146fd918e01908e0161540a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614733613fe1565b61473b614f0a565b6140a081614f12565b61474c613fe1565b61402a6150b4565b61475c613fe1565b5f80516020615eb2833981519152836147c85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610541565b6127108411156147ea5760405162461bcd60e51b815260040161054190615c92565b858711156148525760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610541565b5f8360ff16116148bf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610541565b600a60ff841611156149315760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610541565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149ac6001600160a01b038416836150bc565b905080515f141580156149d05750808060200190518101906149ce9190615e76565b155b15611ffb57604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a3f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a6391906155b7565b9050614a7a6001600160a01b0385163330866150c9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614abe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ae291906155b7565b9050818111614b485760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610541565b614b52828261599b565b95945050505050565b5f6060826080015151603014614bc55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610541565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3c57614bfc81600161599b565b614c07906008615964565b5081515f90839083908110614c1e57614c1e61572c565b60200101906001600160f81b03191690815f1a905350600101614be8565b505f5b6004811015614ca457614c5381600361599b565b614c5e906008615964565b600160ff919091161c60f81b82614c7683600261592f565b81518110614c8657614c8661572c565b60200101906001600160f81b03191690815f1a905350600101614c3f565b505f5b6020811015614d015784518160208110614cc357614cc361572c565b1a60f81b82614cd383600661592f565b81518110614ce357614ce361572c565b60200101906001600160f81b03191690815f1a905350600101614ca7565b505f5b6020811015614d615784602001518160208110614d2357614d2361572c565b1a60f81b82614d3383602661592f565b81518110614d4357614d4361572c565b60200101906001600160f81b03191690815f1a905350600101614d04565b505f5b6008811015614dd557614d7881600761599b565b614d83906008615964565b60ff1685604001516001600160401b0316901c60f81b82826046614da7919061592f565b81518110614db757614db761572c565b60200101906001600160f81b03191690815f1a905350600101614d64565b505f5b6030811015614e405784608001518181518110614df757614df761572c565b01602001516001600160f81b03191682614e1283604e61592f565b81518110614e2257614e2261572c565b60200101906001600160f81b03191690815f1a905350600101614dd8565b505f5b6008811015614eb257614e5781600761599b565b614e62906008615964565b60608601516001600160401b0390811691161c60f81b82614e8483607e61592f565b81518110614e9457614e9461572c565b60200101906001600160f81b03191690815f1a905350600101614e43565b50600281604051614ec3919061591e565b602060405180830381855afa158015614ede573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f0191906155b7565b94909350915050565b61402a613fe1565b614f1a613fe1565b80355f80516020615ef283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f666080840160608501615d11565b60ff161115614fd35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610541565b5f614fe46080840160608501615d11565b60ff161161504c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610541565b61505c6080830160608401615d11565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561508d606083016040840161540a565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613388613fe1565b606061271083835f615102565b6040516001600160a01b038481166024830152838116604483015260648201839052610a429186918216906323b872dd90608401614171565b6060814710156151275760405163cd78605960e01b8152306004820152602401610541565b5f80856001600160a01b03168486604051615142919061591e565b5f6040518083038185875af1925050503d805f811461517c576040519150601f19603f3d011682016040523d82523d5f602084013e615181565b606091505b509150915061238f8683836060826151a15761519c826151e8565b612710565b81511580156151b857506001600160a01b0384163b155b156151e157604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b5080612710565b8051156151f85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461521d906159ae565b5f825580601f1061522c575050565b601f0160209004905f5260205f20908101906140a09190615284565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615298575f8155600101615285565b5090565b80151581146140a0575f80fd5b803563ffffffff811681146152bc575f80fd5b919050565b5f805f606084860312156152d3575f80fd5b8335925060208401356152e58161529c565b91506152f3604085016152a9565b90509250925092565b5f6020828403121561530c575f80fd5b5035919050565b6001600160a01b03811681146140a0575f80fd5b5f8082840361016081121561533a575f80fd5b61014080821215615349575f80fd5b849350830135905061535a81615313565b809150509250929050565b5f60208284031215615375575f80fd5b612710826152a9565b5f806040838503121561538f575f80fd5b615398836152a9565b946020939093013593505050565b5f80604083850312156153b7575f80fd5b82356001600160401b038111156153cc575f80fd5b8301608081860312156153dd575f80fd5b91506153eb602084016152a9565b90509250929050565b80356001600160401b03811681146152bc575f80fd5b5f6020828403121561541a575f80fd5b612710826153f4565b5f8060408385031215615434575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154b560608401826001600160401b03169052565b5060808301516154d060808401826001600160401b03169052565b5060a08301516154eb60a08401826001600160401b03169052565b5060c083015161550660c08401826001600160401b03169052565b5092915050565b803561ffff811681146152bc575f80fd5b5f805f8060808587031215615531575f80fd5b84356001600160401b03811115615546575f80fd5b850160608188031215615557575f80fd5b93506155656020860161550d565b9250615573604086016153f4565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561550657615506615583565b5f602082840312156155c7575f80fd5b5051919050565b5f5b838110156155e85781810151838201526020016155d0565b50505f910152565b602081525f825180602084015261560e8160408501602087016155ce565b601f01601f19169190910160400192915050565b5f8261563c57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156dc575f80fd5b813561271081615313565b5f808335601e198436030181126156fc575f80fd5b8301803591506001600160401b03821115615715575f80fd5b6020019150600581901b36038213156124e9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615754575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157945761579461575e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157c2576157c261575e565b604052919050565b5f6001600160401b038211156157e2576157e261575e565b50601f01601f191660200190565b5f60608236031215615800575f80fd5b615808615772565b8235815260206158198185016153f4565b8183015260408401356001600160401b03811115615835575f80fd5b840136601f820112615845575f80fd5b8035615858615853826157ca565b61579a565b818152368483850101111561586b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158e0818460208a016155ce565b80830190508581526001600160401b0360c01b8560c01b16602082015283516159108160288401602088016155ce565b016028019695505050505050565b5f82516157548184602087016155ce565b80820180821115610a5857610a58615583565b5f63ffffffff80831681810361595a5761595a615583565b6001019392505050565b8082028115828204841417610a5857610a58615583565b6001600160401b0381811683821601908082111561550657615506615583565b81810381811115610a5857610a58615583565b600181811c908216806159c257607f821691505b6020821081036159e057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a3f816159ae565b806020870152604060018084165f8114615a605760018114615a7c57615aa9565b60ff19851660408a0152604084151560051b8a01019550615aa9565b895f5260205f205f5b85811015615aa05781548b8201860152908301908801615a85565b8a016040019650505b509398975050505050505050565b80516152bc8161529c565b5f8060408385031215615ad3575f80fd5b82516001600160401b0380821115615ae9575f80fd5b9084019060608287031215615afc575f80fd5b615b04615772565b82518152602080840151615b1781615313565b82820152604084015183811115615b2c575f80fd5b80850194505087601f850112615b40575f80fd5b83519250615b50615853846157ca565b8381528882858701011115615b63575f80fd5b615b72848383018488016155ce565b80604084015250819550615b87818801615ab7565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615c8a57615c8a615583565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361595a5761595a615583565b5f60208284031215615d08575f80fd5b6127108261550d565b5f60208284031215615d21575f80fd5b813560ff81168114612710575f80fd5b5f808335601e19843603018112615d46575f80fd5b8301803591506001600160401b03821115615d5f575f80fd5b6020019150368190038213156124e9575f80fd5b601f821115611ffb57805f5260205f20601f840160051c81016020851015615d985750805b601f840160051c820191505b81811015610bd6575f8155600101615da4565b81516001600160401b03811115615dd057615dd061575e565b615de481615dde84546159ae565b84615d73565b602080601f831160018114615e17575f8415615e005750858301515b5f19600386901b1c1916600185901b178555615e6e565b5f85815260208120601f198616915b82811015615e4557888601518255948401946001909101908401615e26565b5085821015615e6257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e86575f80fd5b81516127108161529c56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -626,6 +626,27 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WeightTo return _ERC20TokenStakingManager.Contract.WeightToValue(&_ERC20TokenStakingManager.CallOpts, weight) } +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ClaimDelegationFees(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "claimDelegationFees", validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ClaimDelegationFees(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ClaimDelegationFees(&_ERC20TokenStakingManager.TransactOpts, validationID) +} + // CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // // Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index ce232b703..aa630ebfe 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,8 +83,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615bdf380380615bdf83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615a928061014d5f395ff3fe60806040526004361061017b575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f14610492578063c974d1b6146104a5578063d5f20ff6146104b9578063df93d8de146104e5575f80fd5b8063b771b3bc1461043a578063ba3a4b9714610454578063bee0a03f14610473575f80fd5b8063620658561461038b57806366435abf146103aa57806376f78621146103c95780638280a25a146103e857806398f3e2b4146103fc578063a3a65e481461041b575f80fd5b8063329c3e1211610138578063467ef06f11610113578063467ef06f146103055780635297fae61461032457806360305d621461034357806361e2f4901461036c575f80fd5b8063329c3e121461029857806335455ded146102ca57806340034a93146102f2575f80fd5b80630118acc41461017f5780630322ed98146101a05780630cdd0985146101bf578063151d30d11461021c5780631f7a9d8f146102425780632e2194d814610261575b5f80fd5b34801561018a575f80fd5b5061019e610199366004614e92565b6104fb565b005b3480156101ab575f80fd5b5061019e6101ba366004614ecd565b61099e565b3480156101ca575f80fd5b506102096101d9366004614ecd565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610227575f80fd5b50610230600a81565b60405160ff9091168152602001610213565b34801561024d575f80fd5b5061019e61025c366004614ee4565b610b57565b34801561026c575f80fd5b5061028061027b366004614ecd565b610c34565b6040516001600160401b039091168152602001610213565b3480156102a3575f80fd5b506102b26001600160991b0181565b6040516001600160a01b039091168152602001610213565b3480156102d5575f80fd5b506102df61271081565b60405161ffff9091168152602001610213565b610209610300366004614f22565b610c4a565b348015610310575f80fd5b5061019e61031f366004614f76565b610c7e565b34801561032f575f80fd5b5061019e61033e366004614f8f565b610d1e565b34801561034e575f80fd5b50610357601481565b60405163ffffffff9091168152602001610213565b348015610377575f80fd5b5061019e610386366004614fb7565b610ef3565b348015610396575f80fd5b506102096103a5366004615005565b611527565b3480156103b5575f80fd5b506102806103c4366004614ecd565b611540565b3480156103d4575f80fd5b5061019e6103e3366004614e92565b611554565b3480156103f3575f80fd5b50610230603081565b348015610407575f80fd5b5061019e610416366004614f8f565b611760565b348015610426575f80fd5b5061019e610435366004614f76565b611a72565b348015610445575f80fd5b506102b26005600160991b0181565b34801561045f575f80fd5b5061019e61046e366004614ecd565b611c2a565b34801561047e575f80fd5b5061019e61048d366004614ecd565b611eb0565b6102096104a0366004614ecd565b611fc4565b3480156104b0575f80fd5b50610230601481565b3480156104c4575f80fd5b506104d86104d3366004614ecd565b611ff5565b6040516102139190615032565b3480156104f0575f80fd5b506102806202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f805160206159e6833981519152949193919290829060ff1660048111156105635761056361501e565b60048111156105745761057461501e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105f083611ff5565b90506002825160048111156106075761060761501e565b146106595760405162461bcd60e51b815260206004820152602a60248201525f80516020615a068339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106be5760405162461bcd60e51b815260206004820152603360248201525f80516020615a068339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610650565b6003825280515f9060029060058111156106da576106da61501e565b036107315786156106f2576106ef84876120bd565b90505b5f8360600151836080015161070791906150fc565b90506107138582612359565b506001600160401b0390811660e0860152421660a085015250610765565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107988560600151611527565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610815573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610839919061511c565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108785761087861501e565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161098c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615a668339815191526020526040808220815160e0810190925280545f80516020615a2683398151915293929190829060ff1660058111156109eb576109eb61501e565b60058111156109fc576109fc61501e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a6b57610a6b61501e565b14610ad05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb610af58584606001515f6124b0565b6040518263ffffffff1660e01b8152600401610b119190615155565b6020604051808303815f875af1158015610b2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b51919061511c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ba0575080546001600160401b03808416911610155b15610bbe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be8836126d5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4464e8d4a5100083615187565b92915050565b5f610c536126e9565b610c5f84848434612720565b9050610c7760015f80516020615a4683398151915255565b9392505050565b5f805160206159e68339815191525f80610c978461299d565b91509150610ca482612ce7565b610cae5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610cdc57610cdc61501e565b03610d01575f83815260088501602052604081208054919055610cff8282612d22565b505b610d1781610d128460400151611527565b612d88565b5050505050565b5f805160206159e68339815191525f610d3684612d9b565b90505f80610d478360400151612f75565b50915091505f610d5683611ff5565b9050816001600160401b031681606001516001600160401b03161015610d8e5760405162461bcd60e51b8152600401610650906151a6565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dd35760405162461bcd60e51b8152600401610650906151e8565b60015f87815260068701602052604090205460ff166004811115610df957610df961501e565b14610e625760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610650565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615a268339815191529060ff1615610f905760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff7919061511c565b8360200135146110595760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610650565b3061106a6060850160408601615245565b6001600160a01b0316146110dc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610650565b5f6110ea6060850185615260565b91505f90508435602086013560146111086060890160408a01615245565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611437575f6111886060890189615260565b8363ffffffff1681811061119e5761119e6152a5565b90506020028101906111b091906152b9565b6111b990615369565b80515f81815260098901602052604090205491925090156111ec5760405162461bcd60e51b815260040161065090615400565b84825f01518360200151846040015160405160200161120e9493929190615448565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161125c9190615497565b602060405180830381855afa158015611277573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061129a919061511c565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113265761132661501e565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113d99116866154a8565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611430906154bb565b905061116c565b50600584018190555f61144986612d9b565b90505f61145982604001516131b0565b90508060028560405161146c9190615497565b602060405180830381855afa158015611487573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114aa919061511c565b1461150e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610650565b505050600a909201805460ff1916600117905550505050565b5f610c446001600160401b03831664e8d4a510006154dd565b5f61154a82611ff5565b6080015192915050565b5f805160206159e68339815191525f61156c85613319565b905061157785612ce7565b611582575050505050565b5f85815260058301602052604090205460a08201516115b191600160b01b90046001600160401b0316906154f4565b6001600160401b03168160c001516001600160401b031610156116325760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610650565b8315610d17575f61164386856120bd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061169a90611527565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611710573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611734919061511c565b5f878152600885016020526040812080549091906117539084906154a8565b9091555050505050505050565b6117686126e9565b5f805160206159e68339815191525f61178084612d9b565b90505f806117918360400151612f75565b50915091505f6117a083611ff5565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117da576117da61501e565b60048111156117eb576117eb61501e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561188a5760405162461bcd60e51b8152600401610650906151a6565b826001600160401b03168160e001516001600160401b031611156118c05760405162461bcd60e51b8152600401610650906151e8565b6003815160048111156118d5576118d561501e565b146119295760405162461bcd60e51b815260206004820152603160248201525f80516020615a068339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610650565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a019092528220549091906127109061197f9061ffff600160a01b90910416846154dd565b6119899190615187565b905080886008015f8881526020019081526020015f205f8282546119ad91906154a8565b909155505060208301516119ca906119c58385615514565b612d22565b6119df8360200151610d128560600151611527565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050611a6e60015f80516020615a4683398151915255565b5050565b5f80516020615a268339815191525f611a8a83612d9b565b90505f80611a9b8360400151613594565b9150915080611afd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610650565b5f82815260078501602052604081208054611b1790615527565b9050118015611b49575060015f83815260088601602052604090205460ff166005811115611b4757611b4761501e565b145b611b655760405162461bcd60e51b815260040161065090615559565b5f8281526007850160205260408120611b7d91614de7565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206159e683398151915293929190829060ff166004811115611c8b57611c8b61501e565b6004811115611c9c57611c9c61501e565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d2357611d2361501e565b1480611d415750600381516004811115611d3f57611d3f61501e565b145b611d955760405162461bcd60e51b815260206004820152603260248201525f80516020615a06833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610650565b5f611da38260400151611ff5565b905080606001516001600160401b03165f03611e275760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb611e548460400151846060015185608001516124b0565b6040518263ffffffff1660e01b8152600401611e709190615155565b6020604051808303815f875af1158015611e8c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d17919061511c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615a26833981519152929190611ef890615527565b9050118015611f2a575060015f83815260088301602052604090205460ff166005811115611f2857611f2861501e565b145b611f465760405162461bcd60e51b815260040161065090615559565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f7f91906004016155a0565b6020604051808303815f875af1158015611f9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fbf919061511c565b505050565b5f611fcd6126e9565b611fd8823334613735565b9050611ff060015f80516020615a4683398151915255565b919050565b611ffd614e1e565b5f8281525f80516020615a66833981519152602052604090819020815160e0810190925280545f80516020615a26833981519152929190829060ff16600581111561204a5761204a61501e565b600581111561205b5761205b61501e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612108573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261212f9190810190615635565b91509150806121925760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121f9919061511c565b82511461225d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610650565b60208201516001600160a01b0316156122d35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610650565b5f806122e28460400151613aec565b9150915081871461234f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610650565b9695505050505050565b5f8281525f80516020615a66833981519152602052604081206002015481905f80516020615a2683398151915290600160801b90046001600160401b03166123a18582613cc4565b5f6123ab87613ed2565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123fb8a858b6124b0565b6040518263ffffffff1660e01b81526004016124179190615155565b6020604051808303815f875af1158015612433573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612457919061511c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612529576124e9816001615514565b6124f49060086154dd565b5081515f9083908390811061250b5761250b6152a5565b60200101906001600160f81b03191690815f1a9053506001016124d5565b505f5b600481101561259457612540816003615514565b61254b9060086154dd565b600263ffffffff16901c60f81b8282600261256691906154a8565b81518110612576576125766152a5565b60200101906001600160f81b03191690815f1a90535060010161252c565b505f5b60208110156125f6576125ab81601f615514565b6125b69060086154dd565b86901c60f81b826125c88360066154a8565b815181106125d8576125d86152a5565b60200101906001600160f81b03191690815f1a905350600101612597565b505f5b60088110156126615761260d816007615514565b6126189060086154dd565b6001600160401b038616901c60f81b826126338360266154a8565b81518110612643576126436152a5565b60200101906001600160f81b03191690815f1a9053506001016125f9565b505f5b60088110156126cc57612678816007615514565b6126839060086154dd565b6001600160401b038516901c60f81b8261269e83602e6154a8565b815181106126ae576126ae6152a5565b60200101906001600160f81b03191690815f1a905350600101612664565b50949350505050565b6126dd613f62565b6126e681613fad565b50565b5f80516020615a4683398151915280546001190161271a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206159e68339815191529061ffff86161080159061276c575061271061ffff861611155b6127885760405162461bcd60e51b815260040161065090615707565b60028101546001600160401b0390811690851610156128015760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610650565b80548310156128645760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610650565b80600101548311156128cb5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610650565b825f6128d682610c34565b90505f6128e38983614021565b905060405180606001604052806128f73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615a4683398151915255565b5f6129a6614e1e565b5f80516020615a268339815191525f6129be85612d9b565b90505f806129cf8360400151613594565b915091508015612a345760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610650565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612a6557612a6561501e565b6005811115612a7657612a7661501e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612ae757612ae761501e565b1480612b055750600182516005811115612b0357612b0361501e565b145b612b645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610650565b600382516005811115612b7957612b7961501e565b03612b8657506004612b8a565b5060055b6020808301515f90815260098801909152604081205581816005811115612bb357612bb361501e565b90816005811115612bc657612bc661501e565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612bfa57612bfa61501e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612cae57612cae61501e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612d6e575f80fd5b505af1158015612d80573d5f803e3d5ffd5b505050505050565b611a6e6001600160a01b03831682614586565b60408051606080820183525f8083526020830181905292820152905f80516020615a268339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612e10573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612e379190810190615635565b9150915080612e975760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610650565b8254825114612efa5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610650565b60208201516001600160a01b031615612f6d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610650565b509392505050565b5f805f8351603614612f995760405162461bcd60e51b815260040161065090615752565b5f805b6002811015612fe857612fb0816001615514565b612fbb9060086154dd565b61ffff16868281518110612fd157612fd16152a5565b016020015160f81c901b9190911790600101612f9c565b5061ffff81161561300b5760405162461bcd60e51b81526004016106509061579b565b5f805b600481101561306657613022816003615514565b61302d9060086154dd565b63ffffffff168761303f8360026154a8565b8151811061304f5761304f6152a5565b016020015160f81c901b919091179060010161300e565b5063ffffffff811660041461308d5760405162461bcd60e51b8152600401610650906157de565b5f805b60208110156130e2576130a481601f615514565b6130af9060086154dd565b886130bb8360066154a8565b815181106130cb576130cb6152a5565b016020015160f81c901b9190911790600101613090565b505f805b6008811015613141576130fa816007615514565b6131059060086154dd565b6001600160401b03168961311a8360266154a8565b8151811061312a5761312a6152a5565b016020015160f81c901b91909117906001016130e6565b505f805b60088110156131a057613159816007615514565b6131649060086154dd565b6001600160401b03168a61317983602e6154a8565b81518110613189576131896152a5565b016020015160f81c901b9190911790600101613145565b5091989097509095509350505050565b5f81516026146131d25760405162461bcd60e51b815260040161065090615752565b5f805b6002811015613221576131e9816001615514565b6131f49060086154dd565b61ffff1684828151811061320a5761320a6152a5565b016020015160f81c901b91909117906001016131d5565b5061ffff8116156132445760405162461bcd60e51b81526004016106509061579b565b5f805b600481101561329f5761325b816003615514565b6132669060086154dd565b63ffffffff16856132788360026154a8565b81518110613288576132886152a5565b016020015160f81c901b9190911790600101613247565b5063ffffffff8116156132c45760405162461bcd60e51b8152600401610650906157de565b5f805b60208110156126cc576132db81601f615514565b6132e69060086154dd565b866132f28360066154a8565b81518110613302576133026152a5565b016020015160f81c901b91909117906001016132c7565b613321614e1e565b5f8281525f80516020615a668339815191526020526040808220815160e0810190925280545f80516020615a2683398151915293929190829060ff16600581111561336e5761336e61501e565b600581111561337f5761337f61501e565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156133f1576133f161501e565b1461344d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610650565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156134915761349161501e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61353d8582612359565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146135b75760405162461bcd60e51b815260040161065090615752565b5f805b6002811015613606576135ce816001615514565b6135d99060086154dd565b61ffff168582815181106135ef576135ef6152a5565b016020015160f81c901b91909117906001016135ba565b5061ffff8116156136295760405162461bcd60e51b81526004016106509061579b565b5f805b600481101561368457613640816003615514565b61364b9060086154dd565b63ffffffff168661365d8360026154a8565b8151811061366d5761366d6152a5565b016020015160f81c901b919091179060010161362c565b5063ffffffff81166003146136ab5760405162461bcd60e51b8152600401610650906157de565b5f805b6020811015613700576136c281601f615514565b6136cd9060086154dd565b876136d98360066154a8565b815181106136e9576136e96152a5565b016020015160f81c901b91909117906001016136ae565b505f86602681518110613715576137156152a5565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206159e68339815191528161374e84610c34565b90505f61375a87611ff5565b905061376587612ce7565b6137c25760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610650565b6002815160058111156137d7576137d761501e565b146138365760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610650565b5f82826080015161384791906154f4565b60048501546040840151919250613869916001600160401b0390911690615825565b6001600160401b0316816001600160401b031611156138e85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610650565b5f806138f48a84612359565b915091505f8a8360405160200161392292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156139bd576139bd61501e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613b0f5760405162461bcd60e51b815260040161065090615752565b5f805b6002811015613b5e57613b26816001615514565b613b319060086154dd565b61ffff16858281518110613b4757613b476152a5565b016020015160f81c901b9190911790600101613b12565b5061ffff811615613b815760405162461bcd60e51b81526004016106509061579b565b5f805b6004811015613bdc57613b98816003615514565b613ba39060086154dd565b63ffffffff1686613bb58360026154a8565b81518110613bc557613bc56152a5565b016020015160f81c901b9190911790600101613b84565b5063ffffffff8116600514613c035760405162461bcd60e51b8152600401610650906157de565b5f805b6020811015613c5857613c1a81601f615514565b613c259060086154dd565b87613c318360066154a8565b81518110613c4157613c416152a5565b016020015160f81c901b9190911790600101613c06565b505f805b6008811015613cb757613c70816007615514565b613c7b9060086154dd565b6001600160401b031688613c908360266154a8565b81518110613ca057613ca06152a5565b016020015160f81c901b9190911790600101613c5c565b5090969095509350505050565b5f80516020615a268339815191525f6001600160401b038084169085161115613cf857613cf183856150fc565b9050613d05565b613d0284846150fc565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613d67575060028401548151613d63916001600160401b0316906154a8565b8210155b15613d8d576001600160401b038316606082015281815260408101516020820152613dac565b8281606001818151613d9f91906154f4565b6001600160401b03169052505b6060810151613dbc906064615825565b602082015160028601546001600160401b039290921691613de79190600160401b900460ff166154dd565b1015613e4b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610650565b856001600160401b031681604001818151613e6691906154a8565b9052506040810180516001600160401b0387169190613e86908390615514565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615a668339815191526020526040812060020180545f80516020615a2683398151915291600160401b9091046001600160401b0316906008613f1c83615850565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613fab57604051631afcd79f60e31b815260040160405180910390fd5b565b613fb5613f62565b613fbe81614619565b613fc6614632565b6126e6608082013560a0830135613fe360e0850160c08601615005565b613ff4610100860160e0870161586b565b61ffff1661400a61012087016101008801615884565b61401c61014088016101208901615245565b614642565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140ac5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610650565b5f80516020615a26833981519152426140cb6040860160208701615005565b6001600160401b03161161413d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610650565b61414d6040850160208601615005565b6001600160401b03166141636202a300426154a8565b116141d65760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610650565b833561422e5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610650565b83355f9081526009820160205260409020541561425d5760405162461bcd60e51b815260040161065090615400565b603061426c60408601866158a4565b9050146142d15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610650565b6142db835f613cc4565b5f806143756040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906143209190615005565b6001600160401b0316815260200161433b60408a018a6158a4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614886565b5f82815260078601602052604090209193509150614393828261592a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143c0908590600401615155565b6020604051808303815f875af11580156143dc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614400919061511c565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156144785761447861501e565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614558918e01908e01615005565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145a95760405163cd78605960e01b8152306004820152602401610650565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146145f2576040519150601f19603f3d011682016040523d82523d5f602084013e6145f7565b606091505b5050905080611fbf57604051630a12f52160e11b815260040160405180910390fd5b614621613f62565b614629614c35565b6126e681614c3d565b61463a613f62565b613fab614ddf565b61464a613f62565b5f805160206159e6833981519152836146b65760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610650565b6127108411156146d85760405162461bcd60e51b815260040161065090615707565b858711156147405760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610650565b5f8360ff16116147ad5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610650565b600a60ff8416111561481f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610650565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146148f05760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610650565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561496757614927816001615514565b6149329060086154dd565b5081515f90839083908110614949576149496152a5565b60200101906001600160f81b03191690815f1a905350600101614913565b505f5b60048110156149cf5761497e816003615514565b6149899060086154dd565b600160ff919091161c60f81b826149a18360026154a8565b815181106149b1576149b16152a5565b60200101906001600160f81b03191690815f1a90535060010161496a565b505f5b6020811015614a2c57845181602081106149ee576149ee6152a5565b1a60f81b826149fe8360066154a8565b81518110614a0e57614a0e6152a5565b60200101906001600160f81b03191690815f1a9053506001016149d2565b505f5b6020811015614a8c5784602001518160208110614a4e57614a4e6152a5565b1a60f81b82614a5e8360266154a8565b81518110614a6e57614a6e6152a5565b60200101906001600160f81b03191690815f1a905350600101614a2f565b505f5b6008811015614b0057614aa3816007615514565b614aae9060086154dd565b60ff1685604001516001600160401b0316901c60f81b82826046614ad291906154a8565b81518110614ae257614ae26152a5565b60200101906001600160f81b03191690815f1a905350600101614a8f565b505f5b6030811015614b6b5784608001518181518110614b2257614b226152a5565b01602001516001600160f81b03191682614b3d83604e6154a8565b81518110614b4d57614b4d6152a5565b60200101906001600160f81b03191690815f1a905350600101614b03565b505f5b6008811015614bdd57614b82816007615514565b614b8d9060086154dd565b60608601516001600160401b0390811691161c60f81b82614baf83607e6154a8565b81518110614bbf57614bbf6152a5565b60200101906001600160f81b03191690815f1a905350600101614b6e565b50600281604051614bee9190615497565b602060405180830381855afa158015614c09573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c2c919061511c565b94909350915050565b613fab613f62565b614c45613f62565b80355f80516020615a2683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614c916080840160608501615884565b60ff161115614cfe5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610650565b5f614d0f6080840160608501615884565b60ff1611614d775760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610650565b614d876080830160608401615884565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614db86060830160408401615005565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61298a613f62565b508054614df390615527565b5f825580601f10614e02575050565b601f0160209004905f5260205f20908101906126e69190614e5a565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614e6e575f8155600101614e5b565b5090565b80151581146126e6575f80fd5b803563ffffffff81168114611ff0575f80fd5b5f805f60608486031215614ea4575f80fd5b833592506020840135614eb681614e72565b9150614ec460408501614e7f565b90509250925092565b5f60208284031215614edd575f80fd5b5035919050565b5f6101408284031215614ef5575f80fd5b50919050565b803561ffff81168114611ff0575f80fd5b80356001600160401b0381168114611ff0575f80fd5b5f805f60608486031215614f34575f80fd5b83356001600160401b03811115614f49575f80fd5b840160608187031215614f5a575f80fd5b9250614f6860208501614efb565b9150614ec460408501614f0c565b5f60208284031215614f86575f80fd5b610c7782614e7f565b5f8060408385031215614fa0575f80fd5b614fa983614e7f565b946020939093013593505050565b5f8060408385031215614fc8575f80fd5b82356001600160401b03811115614fdd575f80fd5b830160808186031215614fee575f80fd5b9150614ffc60208401614e7f565b90509250929050565b5f60208284031215615015575f80fd5b610c7782614f0c565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061505557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161509060608401826001600160401b03169052565b5060808301516150ab60808401826001600160401b03169052565b5060a08301516150c660a08401826001600160401b03169052565b5060c08301516150e160c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156150e1576150e16150e8565b5f6020828403121561512c575f80fd5b5051919050565b5f5b8381101561514d578181015183820152602001615135565b50505f910152565b602081525f8251806020840152615173816040850160208701615133565b601f01601f19169190910160400192915050565b5f826151a157634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b03811681146126e6575f80fd5b5f60208284031215615255575f80fd5b8135610c7781615231565b5f808335601e19843603018112615275575f80fd5b8301803591506001600160401b0382111561528e575f80fd5b6020019150600581901b36038213156124a9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126152cd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561530d5761530d6152d7565b60405290565b604051601f8201601f191681016001600160401b038111828210171561533b5761533b6152d7565b604052919050565b5f6001600160401b0382111561535b5761535b6152d7565b50601f01601f191660200190565b5f60608236031215615379575f80fd5b6153816152eb565b823581526020615392818501614f0c565b8183015260408401356001600160401b038111156153ae575f80fd5b840136601f8201126153be575f80fd5b80356153d16153cc82615343565b615313565b81815236848385010111156153e4575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615459818460208a01615133565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615489816028840160208801615133565b016028019695505050505050565b5f82516152cd818460208701615133565b80820180821115610c4457610c446150e8565b5f63ffffffff8083168181036154d3576154d36150e8565b6001019392505050565b8082028115828204841417610c4457610c446150e8565b6001600160401b038181168382160190808211156150e1576150e16150e8565b81810381811115610c4457610c446150e8565b600181811c9082168061553b57607f821691505b602082108103614ef557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546155b281615527565b806020870152604060018084165f81146155d357600181146155ef5761561c565b60ff19851660408a0152604084151560051b8a0101955061561c565b895f5260205f205f5b858110156156135781548b82018601529083019088016155f8565b8a016040019650505b509398975050505050505050565b8051611ff081614e72565b5f8060408385031215615646575f80fd5b82516001600160401b038082111561565c575f80fd5b908401906060828703121561566f575f80fd5b6156776152eb565b8251815260208084015161568a81615231565b8282015260408401518381111561569f575f80fd5b80850194505087601f8501126156b3575f80fd5b835192506156c36153cc84615343565b83815288828587010111156156d6575f80fd5b6156e584838301848801615133565b806040840152508195506156fa81880161562a565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615848576158486150e8565b505092915050565b5f6001600160401b038083168181036154d3576154d36150e8565b5f6020828403121561587b575f80fd5b610c7782614efb565b5f60208284031215615894575f80fd5b813560ff81168114610c77575f80fd5b5f808335601e198436030181126158b9575f80fd5b8301803591506001600160401b038211156158d2575f80fd5b6020019150368190038213156124a9575f80fd5b601f821115611fbf57805f5260205f20601f840160051c8101602085101561590b5750805b601f840160051c820191505b81811015610d17575f8155600101615917565b81516001600160401b03811115615943576159436152d7565b615957816159518454615527565b846158e6565b602080601f83116001811461598a575f84156159735750858301515b5f19600386901b1c1916600185901b178555612d80565b5f85815260208120601f198616915b828110156159b857888601518255948401946001909101908401615999565b50858210156159d557878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615d69380380615d6983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c1c8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b336600461501c565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615057565b6109d7565b3480156101e4575f80fd5b506102236101f3366004615057565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461506e565b610b90565b348015610286575f80fd5b5061029a610295366004615057565b610c6d565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150ac565b610c83565b34801561032a575f80fd5b506101b8610339366004615100565b610cb7565b348015610349575f80fd5b506101b8610358366004615119565b610d57565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615141565b610f2c565b3480156103b0575f80fd5b506102236103bf36600461518f565b611560565b3480156103cf575f80fd5b5061029a6103de366004615057565b611579565b3480156103ee575f80fd5b506101b86103fd36600461501c565b61158d565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615057565b611799565b348015610440575f80fd5b506101b861044f366004615119565b6118ea565b34801561045f575f80fd5b506101b861046e366004615100565b611bfc565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615057565b611db4565b3480156104b7575f80fd5b506101b86104c6366004615057565b61203a565b6102236104d9366004615057565b61214e565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615057565b61217f565b60405161022d91906151bc565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615b70833981519152949193919290829060ff16600481111561059c5761059c6151a8565b60048111156105ad576105ad6151a8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6106298361217f565b9050600282516004811115610640576106406151a8565b146106925760405162461bcd60e51b815260206004820152602a60248201525f80516020615b908339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106f75760405162461bcd60e51b815260206004820152603360248201525f80516020615b908339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610689565b6003825280515f906002906005811115610713576107136151a8565b0361076a57861561072b576107288487612247565b90505b5f836060015183608001516107409190615286565b905061074c85826124e3565b506001600160401b0390811660e0860152421660a08501525061079e565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d18560600151611560565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087291906152a6565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108b1576108b16151a8565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615bf08339815191526020526040808220815160e0810190925280545f80516020615bb083398151915293929190829060ff166005811115610a2457610a246151a8565b6005811115610a3557610a356151a8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa457610aa46151a8565b14610b095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb610b2e8584606001515f61263a565b6040518263ffffffff1660e01b8152600401610b4a91906152df565b6020604051808303815f875af1158015610b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8a91906152a6565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bd9575080546001600160401b03808416911610155b15610bf75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c218361285f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7d64e8d4a5100083615311565b92915050565b5f610c8c612873565b610c98848484346128aa565b9050610cb060015f80516020615bd083398151915255565b9392505050565b5f80516020615b708339815191525f80610cd084612b27565b91509150610cdd82612e71565b610ce75750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1557610d156151a8565b03610d3a575f83815260088501602052604081208054919055610d388282612eac565b505b610d5081610d4b8460400151611560565b612f12565b5050505050565b5f80516020615b708339815191525f610d6f84612f25565b90505f80610d8083604001516130ff565b50915091505f610d8f8361217f565b9050816001600160401b031681606001516001600160401b03161015610dc75760405162461bcd60e51b815260040161068990615330565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0c5760405162461bcd60e51b815260040161068990615372565b60015f87815260068701602052604090205460ff166004811115610e3257610e326151a8565b14610e9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610689565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bb08339815191529060ff1615610fc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103091906152a6565b8360200135146110925760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610689565b306110a360608501604086016153cf565b6001600160a01b0316146111155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610689565b5f61112360608501856153ea565b91505f90508435602086013560146111416060890160408a016153cf565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611470575f6111c160608901896153ea565b8363ffffffff168181106111d7576111d761542f565b90506020028101906111e99190615443565b6111f2906154f3565b80515f81815260098901602052604090205491925090156112255760405162461bcd60e51b81526004016106899061558a565b84825f01518360200151846040015160405160200161124794939291906155d2565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112959190615621565b602060405180830381855afa1580156112b0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d391906152a6565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561135f5761135f6151a8565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611412911686615632565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146990615645565b90506111a5565b50600584018190555f61148286612f25565b90505f611492826040015161333a565b9050806002856040516114a59190615621565b602060405180830381855afa1580156114c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e391906152a6565b146115475760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610689565b505050600a909201805460ff1916600117905550505050565b5f610c7d6001600160401b03831664e8d4a51000615667565b5f6115838261217f565b6080015192915050565b5f80516020615b708339815191525f6115a5856134a3565b90506115b085612e71565b6115bb575050505050565b5f85815260058301602052604090205460a08201516115ea91600160b01b90046001600160401b03169061567e565b6001600160401b03168160c001516001600160401b0316101561166b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610689565b8315610d50575f61167c8685612247565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906116d390611560565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611749573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176d91906152a6565b5f8781526008850160205260408120805490919061178c908490615632565b9091555050505050505050565b5f80516020615b708339815191525f6117b18361217f565b90506004815160058111156117c8576117c86151a8565b146118325760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610689565b5f8381526005830160205260409020546001600160a01b031633146118b45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610689565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8a906001600160a01b031682612eac565b6118f2612873565b5f80516020615b708339815191525f61190a84612f25565b90505f8061191b83604001516130ff565b50915091505f61192a8361217f565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611964576119646151a8565b6004811115611975576119756151a8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e09092019190915284015191925084811691161015611a145760405162461bcd60e51b815260040161068990615330565b826001600160401b03168160e001516001600160401b03161115611a4a5760405162461bcd60e51b815260040161068990615372565b600381516004811115611a5f57611a5f6151a8565b14611ab35760405162461bcd60e51b815260206004820152603160248201525f80516020615b908339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610689565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a0190925282205490919061271090611b099061ffff600160a01b9091041684615667565b611b139190615311565b905080886008015f8881526020019081526020015f205f828254611b379190615632565b90915550506020830151611b5490611b4f838561569e565b612eac565b611b698360200151610d4b8560600151611560565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050611bf860015f80516020615bd083398151915255565b5050565b5f80516020615bb08339815191525f611c1483612f25565b90505f80611c25836040015161371e565b9150915080611c875760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610689565b5f82815260078501602052604081208054611ca1906156b1565b9050118015611cd3575060015f83815260088601602052604090205460ff166005811115611cd157611cd16151a8565b145b611cef5760405162461bcd60e51b8152600401610689906156e3565b5f8281526007850160205260408120611d0791614f71565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b7083398151915293929190829060ff166004811115611e1557611e156151a8565b6004811115611e2657611e266151a8565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ead57611ead6151a8565b1480611ecb5750600381516004811115611ec957611ec96151a8565b145b611f1f5760405162461bcd60e51b815260206004820152603260248201525f80516020615b90833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610689565b5f611f2d826040015161217f565b905080606001516001600160401b03165f03611fb15760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb611fde84604001518460600151856080015161263a565b6040518263ffffffff1660e01b8152600401611ffa91906152df565b6020604051808303815f875af1158015612016573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5091906152a6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bb0833981519152929190612082906156b1565b90501180156120b4575060015f83815260088301602052604090205460ff1660058111156120b2576120b26151a8565b145b6120d05760405162461bcd60e51b8152600401610689906156e3565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612109919060040161572a565b6020604051808303815f875af1158015612125573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214991906152a6565b505050565b5f612157612873565b6121628233346138bf565b905061217a60015f80516020615bd083398151915255565b919050565b612187614fa8565b5f8281525f80516020615bf0833981519152602052604090819020815160e0810190925280545f80516020615bb0833981519152929190829060ff1660058111156121d4576121d46151a8565b60058111156121e5576121e56151a8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612292573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b991908101906157bf565b915091508061231c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561235f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238391906152a6565b8251146123e75760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610689565b60208201516001600160a01b03161561245d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610689565b5f8061246c8460400151613c76565b915091508187146124d95760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610689565b9695505050505050565b5f8281525f80516020615bf0833981519152602052604081206002015481905f80516020615bb083398151915290600160801b90046001600160401b031661252b8582613e4e565b5f6125358761405c565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125858a858b61263a565b6040518263ffffffff1660e01b81526004016125a191906152df565b6020604051808303815f875af11580156125bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125e191906152a6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126b35761267381600161569e565b61267e906008615667565b5081515f908390839081106126955761269561542f565b60200101906001600160f81b03191690815f1a90535060010161265f565b505f5b600481101561271e576126ca81600361569e565b6126d5906008615667565b600263ffffffff16901c60f81b828260026126f09190615632565b815181106127005761270061542f565b60200101906001600160f81b03191690815f1a9053506001016126b6565b505f5b60208110156127805761273581601f61569e565b612740906008615667565b86901c60f81b82612752836006615632565b815181106127625761276261542f565b60200101906001600160f81b03191690815f1a905350600101612721565b505f5b60088110156127eb5761279781600761569e565b6127a2906008615667565b6001600160401b038616901c60f81b826127bd836026615632565b815181106127cd576127cd61542f565b60200101906001600160f81b03191690815f1a905350600101612783565b505f5b60088110156128565761280281600761569e565b61280d906008615667565b6001600160401b038516901c60f81b8261282883602e615632565b815181106128385761283861542f565b60200101906001600160f81b03191690815f1a9053506001016127ee565b50949350505050565b6128676140ec565b61287081614137565b50565b5f80516020615bd08339815191528054600119016128a457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b708339815191529061ffff8616108015906128f6575061271061ffff861611155b6129125760405162461bcd60e51b815260040161068990615891565b60028101546001600160401b03908116908516101561298b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610689565b80548310156129ee5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610689565b8060010154831115612a555760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610689565b825f612a6082610c6d565b90505f612a6d89836141ab565b90506040518060600160405280612a813390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bd083398151915255565b5f612b30614fa8565b5f80516020615bb08339815191525f612b4885612f25565b90505f80612b59836040015161371e565b915091508015612bbe5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610689565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bef57612bef6151a8565b6005811115612c0057612c006151a8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c7157612c716151a8565b1480612c8f5750600182516005811115612c8d57612c8d6151a8565b145b612cee5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610689565b600382516005811115612d0357612d036151a8565b03612d1057506004612d14565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3d57612d3d6151a8565b90816005811115612d5057612d506151a8565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d8457612d846151a8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e3857612e386151a8565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ef8575f80fd5b505af1158015612f0a573d5f803e3d5ffd5b505050505050565b611bf86001600160a01b03831682614710565b60408051606080820183525f8083526020830181905292820152905f80516020615bb08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f9a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fc191908101906157bf565b91509150806130215760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610689565b82548251146130845760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610689565b60208201516001600160a01b0316156130f75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610689565b509392505050565b5f805f83516036146131235760405162461bcd60e51b8152600401610689906158dc565b5f805b60028110156131725761313a81600161569e565b613145906008615667565b61ffff1686828151811061315b5761315b61542f565b016020015160f81c901b9190911790600101613126565b5061ffff8116156131955760405162461bcd60e51b815260040161068990615925565b5f805b60048110156131f0576131ac81600361569e565b6131b7906008615667565b63ffffffff16876131c9836002615632565b815181106131d9576131d961542f565b016020015160f81c901b9190911790600101613198565b5063ffffffff81166004146132175760405162461bcd60e51b815260040161068990615968565b5f805b602081101561326c5761322e81601f61569e565b613239906008615667565b88613245836006615632565b815181106132555761325561542f565b016020015160f81c901b919091179060010161321a565b505f805b60088110156132cb5761328481600761569e565b61328f906008615667565b6001600160401b0316896132a4836026615632565b815181106132b4576132b461542f565b016020015160f81c901b9190911790600101613270565b505f805b600881101561332a576132e381600761569e565b6132ee906008615667565b6001600160401b03168a61330383602e615632565b815181106133135761331361542f565b016020015160f81c901b91909117906001016132cf565b5091989097509095509350505050565b5f815160261461335c5760405162461bcd60e51b8152600401610689906158dc565b5f805b60028110156133ab5761337381600161569e565b61337e906008615667565b61ffff168482815181106133945761339461542f565b016020015160f81c901b919091179060010161335f565b5061ffff8116156133ce5760405162461bcd60e51b815260040161068990615925565b5f805b6004811015613429576133e581600361569e565b6133f0906008615667565b63ffffffff1685613402836002615632565b815181106134125761341261542f565b016020015160f81c901b91909117906001016133d1565b5063ffffffff81161561344e5760405162461bcd60e51b815260040161068990615968565b5f805b60208110156128565761346581601f61569e565b613470906008615667565b8661347c836006615632565b8151811061348c5761348c61542f565b016020015160f81c901b9190911790600101613451565b6134ab614fa8565b5f8281525f80516020615bf08339815191526020526040808220815160e0810190925280545f80516020615bb083398151915293929190829060ff1660058111156134f8576134f86151a8565b6005811115613509576135096151a8565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561357b5761357b6151a8565b146135d75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610689565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561361b5761361b6151a8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136c785826124e3565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137415760405162461bcd60e51b8152600401610689906158dc565b5f805b60028110156137905761375881600161569e565b613763906008615667565b61ffff168582815181106137795761377961542f565b016020015160f81c901b9190911790600101613744565b5061ffff8116156137b35760405162461bcd60e51b815260040161068990615925565b5f805b600481101561380e576137ca81600361569e565b6137d5906008615667565b63ffffffff16866137e7836002615632565b815181106137f7576137f761542f565b016020015160f81c901b91909117906001016137b6565b5063ffffffff81166003146138355760405162461bcd60e51b815260040161068990615968565b5f805b602081101561388a5761384c81601f61569e565b613857906008615667565b87613863836006615632565b815181106138735761387361542f565b016020015160f81c901b9190911790600101613838565b505f8660268151811061389f5761389f61542f565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b70833981519152816138d884610c6d565b90505f6138e48761217f565b90506138ef87612e71565b61394c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610689565b600281516005811115613961576139616151a8565b146139c05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610689565b5f8282608001516139d1919061567e565b600485015460408401519192506139f3916001600160401b03909116906159af565b6001600160401b0316816001600160401b03161115613a725760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610689565b5f80613a7e8a846124e3565b915091505f8a83604051602001613aac92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b4757613b476151a8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c995760405162461bcd60e51b8152600401610689906158dc565b5f805b6002811015613ce857613cb081600161569e565b613cbb906008615667565b61ffff16858281518110613cd157613cd161542f565b016020015160f81c901b9190911790600101613c9c565b5061ffff811615613d0b5760405162461bcd60e51b815260040161068990615925565b5f805b6004811015613d6657613d2281600361569e565b613d2d906008615667565b63ffffffff1686613d3f836002615632565b81518110613d4f57613d4f61542f565b016020015160f81c901b9190911790600101613d0e565b5063ffffffff8116600514613d8d5760405162461bcd60e51b815260040161068990615968565b5f805b6020811015613de257613da481601f61569e565b613daf906008615667565b87613dbb836006615632565b81518110613dcb57613dcb61542f565b016020015160f81c901b9190911790600101613d90565b505f805b6008811015613e4157613dfa81600761569e565b613e05906008615667565b6001600160401b031688613e1a836026615632565b81518110613e2a57613e2a61542f565b016020015160f81c901b9190911790600101613de6565b5090969095509350505050565b5f80516020615bb08339815191525f6001600160401b038084169085161115613e8257613e7b8385615286565b9050613e8f565b613e8c8484615286565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ef1575060028401548151613eed916001600160401b031690615632565b8210155b15613f17576001600160401b038316606082015281815260408101516020820152613f36565b8281606001818151613f29919061567e565b6001600160401b03169052505b6060810151613f469060646159af565b602082015160028601546001600160401b039290921691613f719190600160401b900460ff16615667565b1015613fd55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610689565b856001600160401b031681604001818151613ff09190615632565b9052506040810180516001600160401b038716919061401090839061569e565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615bf08339815191526020526040812060020180545f80516020615bb083398151915291600160401b9091046001600160401b03169060086140a6836159da565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661413557604051631afcd79f60e31b815260040160405180910390fd5b565b61413f6140ec565b614148816147a3565b6141506147bc565b612870608082013560a083013561416d60e0850160c0860161518f565b61417e610100860160e087016159f5565b61ffff1661419461012087016101008801615a0e565b6141a6610140880161012089016153cf565b6147cc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142365760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610689565b5f80516020615bb083398151915242614255604086016020870161518f565b6001600160401b0316116142c75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610689565b6142d7604085016020860161518f565b6001600160401b03166142ed6202a30042615632565b116143605760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610689565b83356143b85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610689565b83355f908152600982016020526040902054156143e75760405162461bcd60e51b81526004016106899061558a565b60306143f66040860186615a2e565b90501461445b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610689565b614465835f613e4e565b5f806144ff6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144aa919061518f565b6001600160401b031681526020016144c560408a018a615a2e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a10565b5f8281526007860160205260409020919350915061451d8282615ab4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061454a9085906004016152df565b6020604051808303815f875af1158015614566573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061458a91906152a6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614602576146026151a8565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e2918e01908e0161518f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147335760405163cd78605960e01b8152306004820152602401610689565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461477c576040519150601f19603f3d011682016040523d82523d5f602084013e614781565b606091505b505090508061214957604051630a12f52160e11b815260040160405180910390fd5b6147ab6140ec565b6147b3614dbf565b61287081614dc7565b6147c46140ec565b614135614f69565b6147d46140ec565b5f80516020615b70833981519152836148405760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610689565b6127108411156148625760405162461bcd60e51b815260040161068990615891565b858711156148ca5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610689565b5f8360ff16116149375760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610689565b600a60ff841611156149a95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610689565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a7a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610689565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614af157614ab181600161569e565b614abc906008615667565b5081515f90839083908110614ad357614ad361542f565b60200101906001600160f81b03191690815f1a905350600101614a9d565b505f5b6004811015614b5957614b0881600361569e565b614b13906008615667565b600160ff919091161c60f81b82614b2b836002615632565b81518110614b3b57614b3b61542f565b60200101906001600160f81b03191690815f1a905350600101614af4565b505f5b6020811015614bb65784518160208110614b7857614b7861542f565b1a60f81b82614b88836006615632565b81518110614b9857614b9861542f565b60200101906001600160f81b03191690815f1a905350600101614b5c565b505f5b6020811015614c165784602001518160208110614bd857614bd861542f565b1a60f81b82614be8836026615632565b81518110614bf857614bf861542f565b60200101906001600160f81b03191690815f1a905350600101614bb9565b505f5b6008811015614c8a57614c2d81600761569e565b614c38906008615667565b60ff1685604001516001600160401b0316901c60f81b82826046614c5c9190615632565b81518110614c6c57614c6c61542f565b60200101906001600160f81b03191690815f1a905350600101614c19565b505f5b6030811015614cf55784608001518181518110614cac57614cac61542f565b01602001516001600160f81b03191682614cc783604e615632565b81518110614cd757614cd761542f565b60200101906001600160f81b03191690815f1a905350600101614c8d565b505f5b6008811015614d6757614d0c81600761569e565b614d17906008615667565b60608601516001600160401b0390811691161c60f81b82614d3983607e615632565b81518110614d4957614d4961542f565b60200101906001600160f81b03191690815f1a905350600101614cf8565b50600281604051614d789190615621565b602060405180830381855afa158015614d93573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614db691906152a6565b94909350915050565b6141356140ec565b614dcf6140ec565b80355f80516020615bb083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e1b6080840160608501615a0e565b60ff161115614e885760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610689565b5f614e996080840160608501615a0e565b60ff1611614f015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610689565b614f116080830160608401615a0e565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f42606083016040840161518f565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b146140ec565b508054614f7d906156b1565b5f825580601f10614f8c575050565b601f0160209004905f5260205f20908101906128709190614fe4565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614ff8575f8155600101614fe5565b5090565b8015158114612870575f80fd5b803563ffffffff8116811461217a575f80fd5b5f805f6060848603121561502e575f80fd5b83359250602084013561504081614ffc565b915061504e60408501615009565b90509250925092565b5f60208284031215615067575f80fd5b5035919050565b5f610140828403121561507f575f80fd5b50919050565b803561ffff8116811461217a575f80fd5b80356001600160401b038116811461217a575f80fd5b5f805f606084860312156150be575f80fd5b83356001600160401b038111156150d3575f80fd5b8401606081870312156150e4575f80fd5b92506150f260208501615085565b915061504e60408501615096565b5f60208284031215615110575f80fd5b610cb082615009565b5f806040838503121561512a575f80fd5b61513383615009565b946020939093013593505050565b5f8060408385031215615152575f80fd5b82356001600160401b03811115615167575f80fd5b830160808186031215615178575f80fd5b915061518660208401615009565b90509250929050565b5f6020828403121561519f575f80fd5b610cb082615096565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151df57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521a60608401826001600160401b03169052565b50608083015161523560808401826001600160401b03169052565b5060a083015161525060a08401826001600160401b03169052565b5060c083015161526b60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526b5761526b615272565b5f602082840312156152b6575f80fd5b5051919050565b5f5b838110156152d75781810151838201526020016152bf565b50505f910152565b602081525f82518060208401526152fd8160408501602087016152bd565b601f01601f19169190910160400192915050565b5f8261532b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612870575f80fd5b5f602082840312156153df575f80fd5b8135610cb0816153bb565b5f808335601e198436030181126153ff575f80fd5b8301803591506001600160401b03821115615418575f80fd5b6020019150600581901b3603821315612633575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615457575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561549757615497615461565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154c5576154c5615461565b604052919050565b5f6001600160401b038211156154e5576154e5615461565b50601f01601f191660200190565b5f60608236031215615503575f80fd5b61550b615475565b82358152602061551c818501615096565b8183015260408401356001600160401b03811115615538575f80fd5b840136601f820112615548575f80fd5b803561555b615556826154cd565b61549d565b818152368483850101111561556e575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155e3818460208a016152bd565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156138160288401602088016152bd565b016028019695505050505050565b5f82516154578184602087016152bd565b80820180821115610c7d57610c7d615272565b5f63ffffffff80831681810361565d5761565d615272565b6001019392505050565b8082028115828204841417610c7d57610c7d615272565b6001600160401b0381811683821601908082111561526b5761526b615272565b81810381811115610c7d57610c7d615272565b600181811c908216806156c557607f821691505b60208210810361507f57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461573c816156b1565b806020870152604060018084165f811461575d5760018114615779576157a6565b60ff19851660408a0152604084151560051b8a010195506157a6565b895f5260205f205f5b8581101561579d5781548b8201860152908301908801615782565b8a016040019650505b509398975050505050505050565b805161217a81614ffc565b5f80604083850312156157d0575f80fd5b82516001600160401b03808211156157e6575f80fd5b90840190606082870312156157f9575f80fd5b615801615475565b82518152602080840151615814816153bb565b82820152604084015183811115615829575f80fd5b80850194505087601f85011261583d575f80fd5b8351925061584d615556846154cd565b8381528882858701011115615860575f80fd5b61586f848383018488016152bd565b806040840152508195506158848188016157b4565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159d2576159d2615272565b505092915050565b5f6001600160401b0380831681810361565d5761565d615272565b5f60208284031215615a05575f80fd5b610cb082615085565b5f60208284031215615a1e575f80fd5b813560ff81168114610cb0575f80fd5b5f808335601e19843603018112615a43575f80fd5b8301803591506001600160401b03821115615a5c575f80fd5b602001915036819003821315612633575f80fd5b601f82111561214957805f5260205f20601f840160051c81016020851015615a955750805b601f840160051c820191505b81811015610d50575f8155600101615aa1565b81516001600160401b03811115615acd57615acd615461565b615ae181615adb84546156b1565b84615a70565b602080601f831160018114615b14575f8415615afd5750858301515b5f19600386901b1c1916600185901b178555612f0a565b5f85815260208120601f198616915b82811015615b4257888601518255948401946001909101908401615b23565b5085821015615b5f57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -657,6 +657,27 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) Weight return _NativeTokenStakingManager.Contract.WeightToValue(&_NativeTokenStakingManager.CallOpts, weight) } +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ClaimDelegationFees(opts *bind.TransactOpts, validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "claimDelegationFees", validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ClaimDelegationFees(&_NativeTokenStakingManager.TransactOpts, validationID) +} + +// ClaimDelegationFees is a paid mutator transaction binding the contract method 0x93e24598. +// +// Solidity: function claimDelegationFees(bytes32 validationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ClaimDelegationFees(validationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ClaimDelegationFees(&_NativeTokenStakingManager.TransactOpts, validationID) +} + // CompleteDelegatorRegistration is a paid mutator transaction binding the contract method 0x5297fae6. // // Solidity: function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) returns() diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 7787dcb9c..748f854ad 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -136,6 +136,25 @@ abstract contract PoSValidatorManager is $._rewardCalculator = rewardCalculator; } + function claimDelegationFees(bytes32 validationID) external { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + Validator memory validator = getValidator(validationID); + + require( + validator.status == ValidatorStatus.Completed, + "PoSValidatorManager: validation period not completed" + ); + require( + $._validatorRequirements[validationID].owner == _msgSender(), + "PoSValidatorManager: validator not owned by sender" + ); + + uint256 rewards = $._redeemableValidatorRewards[validationID]; + delete $._redeemableValidatorRewards[validationID]; + _reward($._validatorRequirements[validationID].owner, rewards); + } + function initializeEndValidation( bytes32 validationID, bool includeUptimeProof, diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 6929d8f06..4b8aadcee 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -163,4 +163,11 @@ interface IPoSValidatorManager is IValidatorManager { * @param delegationID The ID of the delegation being removed. */ function completeEndDelegation(uint32 messageIndex, bytes32 delegationID) external; + + /** + * @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. + */ + function claimDelegationFees(bytes32 validationID) external; } From 25e8de5736e2f545c7b26823744f763665257eb5 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 18 Sep 2024 16:43:04 -0500 Subject: [PATCH 348/545] require uptime; split safe and unsafe functions --- .../validatorManager/PoSValidatorManager.sol | 64 ++++++++++++++----- .../interfaces/IPoSValidatorManager.sol | 27 +++++--- .../tests/PoAValidatorManagerTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 24 +++---- .../tests/ValidatorManagerTests.t.sol | 41 +++--------- 5 files changed, 85 insertions(+), 73 deletions(-) diff --git a/contracts/validatorManager/PoSValidatorManager.sol b/contracts/validatorManager/PoSValidatorManager.sol index e52abcb67..cd7f1fdeb 100644 --- a/contracts/validatorManager/PoSValidatorManager.sol +++ b/contracts/validatorManager/PoSValidatorManager.sol @@ -138,7 +138,6 @@ abstract contract PoSValidatorManager is function initializeEndValidation( bytes32 validationID, - bool includeUptimeProof, uint32 messageIndex ) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); @@ -152,22 +151,53 @@ abstract contract PoSValidatorManager is "PoSValidatorManager: minimum stake duration not met" ); - if (includeUptimeProof) { - // Uptime proofs include the absolute number of seconds the validator has been active. - uint64 uptimeSeconds = _getUptime(validationID, messageIndex); - // Save this value for use by this validator's delegators. - $._completedValidationUptimeSeconds[validationID] = uptimeSeconds; - - $._redeemableValidatorRewards[validationID] += $._rewardCalculator.calculateReward({ - stakeAmount: weightToValue(validator.startingWeight), - validatorStartTime: validator.startedAt, - stakingStartTime: validator.startedAt, - stakingEndTime: validator.endedAt, - uptimeSeconds: uptimeSeconds, - initialSupply: 0, - endSupply: 0 - }); - } + // Uptime proofs include the absolute number of seconds the validator has been active. + uint64 uptimeSeconds = _getUptime(validationID, messageIndex); + // Save this value for use by this validator's delegators. + $._completedValidationUptimeSeconds[validationID] = uptimeSeconds; + + uint256 reward = $._rewardCalculator.calculateReward({ + stakeAmount: weightToValue(validator.startingWeight), + validatorStartTime: validator.startedAt, + stakingStartTime: validator.startedAt, + stakingEndTime: validator.endedAt, + uptimeSeconds: uptimeSeconds, + initialSupply: 0, + endSupply: 0 + }); + require(reward > 0, "PoSValidatorManager: validation ineligble for rewards"); + $._redeemableValidatorRewards[validationID] += reward; + } + + function forceInitializeEndValidation( + bytes32 validationID, + uint32 messageIndex + ) external { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + Validator memory validator = _initializeEndValidation(validationID); + + // Check that minimum stake duration has passed + require( + validator.endedAt + >= validator.startedAt + $._validatorRequirements[validationID].minStakeDuration, + "PoSValidatorManager: minimum stake duration not met" + ); + + // Uptime proofs include the absolute number of seconds the validator has been active. + uint64 uptimeSeconds = _getUptime(validationID, messageIndex); + // Save this value for use by this validator's delegators. + $._completedValidationUptimeSeconds[validationID] = uptimeSeconds; + + $._redeemableValidatorRewards[validationID] += $._rewardCalculator.calculateReward({ + stakeAmount: weightToValue(validator.startingWeight), + validatorStartTime: validator.startedAt, + stakingStartTime: validator.startedAt, + stakingEndTime: validator.endedAt, + uptimeSeconds: uptimeSeconds, + initialSupply: 0, + endSupply: 0 + }); } function completeEndValidation(uint32 messageIndex) external { diff --git a/contracts/validatorManager/interfaces/IPoSValidatorManager.sol b/contracts/validatorManager/interfaces/IPoSValidatorManager.sol index 6929d8f06..ba02690b3 100644 --- a/contracts/validatorManager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validatorManager/interfaces/IPoSValidatorManager.sol @@ -99,21 +99,30 @@ interface IPoSValidatorManager 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 includeUptimeProof Whether or not an uptime proof is provided for the validation period. - * If no uptime proof is provided, the validation uptime will be assumed to be 0. - * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the - * uptime proof. + * @notice Begins the process of ending an active validation period, and reverts if the validation period is not eligible + * 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. + * @param validationID The ID of the validation period being ended. + * @param messageIndex The index of the Warp message to be received providing the uptime proof. Reverts if the uptime + * is not eligible for rewards. */ function initializeEndValidation( bytes32 validationID, - bool includeUptimeProof, uint32 messageIndex ) external; + /** + * @notice Begins the process of ending an active validation period, but does not revert if the provided uptime proof + * is not sufficient to collect uptime-based rewards. This function is used to exit the validator set when rewards are + * not 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. + * @param validationID The ID of the validation period being ended. + * @param messageIndex The index of the Warp message to be received providing the uptime proof. + */ + function forceInitializeEndValidation(bytes32 validationID, uint32 messageIndex) external; + /** * @notice Completes the delegator registration process by returning 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. diff --git a/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol b/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol index 38b9fe90e..ac924187d 100644 --- a/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol @@ -57,7 +57,7 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { return app.initializeValidatorRegistration(input, weight); } - function _initializeEndValidation(bytes32 validationID, bool) internal virtual override { + function _initializeEndValidation(bytes32 validationID) internal virtual override { return app.initializeEndValidation(validationID); } diff --git a/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol b/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol index 1ea6d1b0e..6d1e640b5 100644 --- a/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol @@ -163,7 +163,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); vm.expectRevert(_formatErrorMessage("minimum stake duration not met")); - posValidatorManager.initializeEndValidation(validationID, false, 0); + posValidatorManager.initializeEndValidation(validationID, 0); } function testInvalidUptimeWarpMessage() public { @@ -178,7 +178,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(new bytes(0), false); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid warp message")); - posValidatorManager.initializeEndValidation(validationID, true, 0); + posValidatorManager.initializeEndValidation(validationID, 0); } function testInvalidUptimeChainID() public { @@ -195,7 +195,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetBlockchainID(); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid source chain ID")); - posValidatorManager.initializeEndValidation(validationID, true, 0); + posValidatorManager.initializeEndValidation(validationID, 0); } function testInvalidUptimeSenderAddress() public { @@ -227,7 +227,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid origin sender address")); - posValidatorManager.initializeEndValidation(validationID, true, 0); + posValidatorManager.initializeEndValidation(validationID, 0); } function testInvalidUptimeValidationID() public { @@ -259,7 +259,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid uptime validation ID")); - posValidatorManager.initializeEndValidation(validationID, true, 0); + posValidatorManager.initializeEndValidation(validationID, 0); } function testInitializeDelegatorRegistration() public { @@ -496,8 +496,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - includeUptime: true + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); @@ -732,8 +731,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - includeUptime: true + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); uint256 expectedReward = rewardCalculator.calculateReward({ @@ -762,8 +760,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - includeUptime: true + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP }); } @@ -795,10 +792,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ) internal virtual returns (bytes32); function _initializeEndValidation( - bytes32 validationID, - bool includeUptime + bytes32 validationID ) internal virtual override { - return posValidatorManager.initializeEndValidation(validationID, includeUptime, 0); + return posValidatorManager.initializeEndValidation(validationID, 0); } function _initializeDelegatorRegistration( diff --git a/contracts/validatorManager/tests/ValidatorManagerTests.t.sol b/contracts/validatorManager/tests/ValidatorManagerTests.t.sol index f9885b1e3..ff76f6801 100644 --- a/contracts/validatorManager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validatorManager/tests/ValidatorManagerTests.t.sol @@ -261,7 +261,7 @@ abstract contract ValidatorManagerTest is Test { // Second call should fail vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); - _initializeEndValidation(validationID, false); + _initializeEndValidation(validationID); } function _newNodeID() internal returns (bytes32) { @@ -343,28 +343,6 @@ abstract contract ValidatorManagerTest is Test { bytes memory blsPublicKey, uint64 registrationTimestamp, uint64 completionTimestamp - ) internal returns (bytes32 validationID) { - return _setUpInitializeEndValidation({ - nodeID: nodeID, - subnetID: subnetID, - weight: weight, - registrationExpiry: registrationExpiry, - blsPublicKey: blsPublicKey, - registrationTimestamp: registrationTimestamp, - completionTimestamp: completionTimestamp, - includeUptime: false - }); - } - - function _setUpInitializeEndValidation( - bytes32 nodeID, - bytes32 subnetID, - uint64 weight, - uint64 registrationExpiry, - bytes memory blsPublicKey, - uint64 registrationTimestamp, - uint64 completionTimestamp, - bool includeUptime ) internal returns (bytes32 validationID) { validationID = _setUpCompleteValidatorRegistration({ nodeID: nodeID, @@ -379,17 +357,16 @@ abstract contract ValidatorManagerTest is Test { bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - if (includeUptime) { - bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, completionTimestamp - registrationTimestamp - ); - _mockGetVerifiedWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); - } + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, completionTimestamp - registrationTimestamp + ); + _mockGetVerifiedWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); + vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); - _initializeEndValidation(validationID, includeUptime); + _initializeEndValidation(validationID); } function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { @@ -447,7 +424,7 @@ abstract contract ValidatorManagerTest is Test { uint64 weight ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID, bool includeUptime) internal virtual; + function _initializeEndValidation(bytes32 validationID) internal virtual; function _beforeSend(uint256 amount, address spender) internal virtual; From 622e6a8abdc312195ed24be53ddc7d5ce6662889 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Wed, 18 Sep 2024 17:47:49 -0400 Subject: [PATCH 349/545] validatorManager -> validator-manager --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 0 .../ExampleRewardCalculator/ExampleRewardCalculator.go | 0 .../NativeTokenStakingManager/NativeTokenStakingManager.go | 0 .../PoAValidatorManager/PoAValidatorManager.go | 0 contracts/mocks/ExampleERC20.sol | 2 +- .../ERC20TokenStakingManager.sol | 0 .../ExampleRewardCalculator.sol | 0 .../NativeTokenStakingManager.sol | 0 .../PoAValidatorManager.sol | 0 .../PoSValidatorManager.sol | 0 contracts/{validatorManager => validator-manager}/README.md | 0 .../ValidatorManager.sol | 0 .../ValidatorMessages.sol | 0 .../interfaces/IERC20Mintable.sol | 0 .../interfaces/IERC20TokenStakingManager.sol | 0 .../interfaces/INativeTokenStakingManager.sol | 0 .../interfaces/IPoAValidatorManager.sol | 0 .../interfaces/IPoSValidatorManager.sol | 0 .../interfaces/IRewardCalculator.sol | 0 .../interfaces/IValidatorManager.sol | 0 .../tests/ERC20TokenStakingManagerTests.t.sol | 0 .../tests/ExamplesRewardCalculatorTests.t.sol | 0 .../tests/NativeTokenStakingManagerTests.t.sol | 0 .../tests/PoAValidatorManagerTests.t.sol | 0 .../tests/PoSValidatorManagerTests.t.sol | 0 .../tests/ValidatorManagerTests.t.sol | 0 .../tests/ValidatorMessagesTests.t.sol | 0 .../{validatorManager => validator-manager}/erc20_delegation.go | 0 .../erc20_token_staking.go | 0 .../native_delegation.go | 0 .../native_token_staking.go | 0 .../flows/{validatorManager => validator-manager}/poa_to_pos.go | 0 .../poa_validator_manager.go | 0 33 files changed, 1 insertion(+), 1 deletion(-) rename abi-bindings/go/{validatorManager => validator-manager}/ERC20TokenStakingManager/ERC20TokenStakingManager.go (100%) rename abi-bindings/go/{validatorManager => validator-manager}/ExampleRewardCalculator/ExampleRewardCalculator.go (100%) rename abi-bindings/go/{validatorManager => validator-manager}/NativeTokenStakingManager/NativeTokenStakingManager.go (100%) rename abi-bindings/go/{validatorManager => validator-manager}/PoAValidatorManager/PoAValidatorManager.go (100%) rename contracts/{validatorManager => validator-manager}/ERC20TokenStakingManager.sol (100%) rename contracts/{validatorManager => validator-manager}/ExampleRewardCalculator.sol (100%) rename contracts/{validatorManager => validator-manager}/NativeTokenStakingManager.sol (100%) rename contracts/{validatorManager => validator-manager}/PoAValidatorManager.sol (100%) rename contracts/{validatorManager => validator-manager}/PoSValidatorManager.sol (100%) rename contracts/{validatorManager => validator-manager}/README.md (100%) rename contracts/{validatorManager => validator-manager}/ValidatorManager.sol (100%) rename contracts/{validatorManager => validator-manager}/ValidatorMessages.sol (100%) rename contracts/{validatorManager => validator-manager}/interfaces/IERC20Mintable.sol (100%) rename contracts/{validatorManager => validator-manager}/interfaces/IERC20TokenStakingManager.sol (100%) rename contracts/{validatorManager => validator-manager}/interfaces/INativeTokenStakingManager.sol (100%) rename contracts/{validatorManager => validator-manager}/interfaces/IPoAValidatorManager.sol (100%) rename contracts/{validatorManager => validator-manager}/interfaces/IPoSValidatorManager.sol (100%) rename contracts/{validatorManager => validator-manager}/interfaces/IRewardCalculator.sol (100%) rename contracts/{validatorManager => validator-manager}/interfaces/IValidatorManager.sol (100%) rename contracts/{validatorManager => validator-manager}/tests/ERC20TokenStakingManagerTests.t.sol (100%) rename contracts/{validatorManager => validator-manager}/tests/ExamplesRewardCalculatorTests.t.sol (100%) rename contracts/{validatorManager => validator-manager}/tests/NativeTokenStakingManagerTests.t.sol (100%) rename contracts/{validatorManager => validator-manager}/tests/PoAValidatorManagerTests.t.sol (100%) rename contracts/{validatorManager => validator-manager}/tests/PoSValidatorManagerTests.t.sol (100%) rename contracts/{validatorManager => validator-manager}/tests/ValidatorManagerTests.t.sol (100%) rename contracts/{validatorManager => validator-manager}/tests/ValidatorMessagesTests.t.sol (100%) rename tests/flows/{validatorManager => validator-manager}/erc20_delegation.go (100%) rename tests/flows/{validatorManager => validator-manager}/erc20_token_staking.go (100%) rename tests/flows/{validatorManager => validator-manager}/native_delegation.go (100%) rename tests/flows/{validatorManager => validator-manager}/native_token_staking.go (100%) rename tests/flows/{validatorManager => validator-manager}/poa_to_pos.go (100%) rename tests/flows/{validatorManager => validator-manager}/poa_validator_manager.go (100%) diff --git a/abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go similarity index 100% rename from abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go rename to abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go diff --git a/abi-bindings/go/validatorManager/ExampleRewardCalculator/ExampleRewardCalculator.go b/abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go similarity index 100% rename from abi-bindings/go/validatorManager/ExampleRewardCalculator/ExampleRewardCalculator.go rename to abi-bindings/go/validator-manager/ExampleRewardCalculator/ExampleRewardCalculator.go diff --git a/abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go similarity index 100% rename from abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go rename to abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go diff --git a/abi-bindings/go/validatorManager/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go similarity index 100% rename from abi-bindings/go/validatorManager/PoAValidatorManager/PoAValidatorManager.go rename to abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go diff --git a/contracts/mocks/ExampleERC20.sol b/contracts/mocks/ExampleERC20.sol index 1c318c486..d7d348702 100644 --- a/contracts/mocks/ExampleERC20.sol +++ b/contracts/mocks/ExampleERC20.sol @@ -13,7 +13,7 @@ import { ERC20Burnable, ERC20 } from "@openzeppelin/contracts@5.0.2/token/ERC20/extensions/ERC20Burnable.sol"; -import {IERC20Mintable} from "../validatorManager/interfaces/IERC20Mintable.sol"; +import {IERC20Mintable} from "../validator-manager/interfaces/IERC20Mintable.sol"; contract ExampleERC20 is ERC20Burnable, IERC20Mintable { string private constant _TOKEN_NAME = "Mock Token"; diff --git a/contracts/validatorManager/ERC20TokenStakingManager.sol b/contracts/validator-manager/ERC20TokenStakingManager.sol similarity index 100% rename from contracts/validatorManager/ERC20TokenStakingManager.sol rename to contracts/validator-manager/ERC20TokenStakingManager.sol diff --git a/contracts/validatorManager/ExampleRewardCalculator.sol b/contracts/validator-manager/ExampleRewardCalculator.sol similarity index 100% rename from contracts/validatorManager/ExampleRewardCalculator.sol rename to contracts/validator-manager/ExampleRewardCalculator.sol diff --git a/contracts/validatorManager/NativeTokenStakingManager.sol b/contracts/validator-manager/NativeTokenStakingManager.sol similarity index 100% rename from contracts/validatorManager/NativeTokenStakingManager.sol rename to contracts/validator-manager/NativeTokenStakingManager.sol diff --git a/contracts/validatorManager/PoAValidatorManager.sol b/contracts/validator-manager/PoAValidatorManager.sol similarity index 100% rename from contracts/validatorManager/PoAValidatorManager.sol rename to contracts/validator-manager/PoAValidatorManager.sol diff --git a/contracts/validatorManager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol similarity index 100% rename from contracts/validatorManager/PoSValidatorManager.sol rename to contracts/validator-manager/PoSValidatorManager.sol diff --git a/contracts/validatorManager/README.md b/contracts/validator-manager/README.md similarity index 100% rename from contracts/validatorManager/README.md rename to contracts/validator-manager/README.md diff --git a/contracts/validatorManager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol similarity index 100% rename from contracts/validatorManager/ValidatorManager.sol rename to contracts/validator-manager/ValidatorManager.sol diff --git a/contracts/validatorManager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol similarity index 100% rename from contracts/validatorManager/ValidatorMessages.sol rename to contracts/validator-manager/ValidatorMessages.sol diff --git a/contracts/validatorManager/interfaces/IERC20Mintable.sol b/contracts/validator-manager/interfaces/IERC20Mintable.sol similarity index 100% rename from contracts/validatorManager/interfaces/IERC20Mintable.sol rename to contracts/validator-manager/interfaces/IERC20Mintable.sol diff --git a/contracts/validatorManager/interfaces/IERC20TokenStakingManager.sol b/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol similarity index 100% rename from contracts/validatorManager/interfaces/IERC20TokenStakingManager.sol rename to contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol diff --git a/contracts/validatorManager/interfaces/INativeTokenStakingManager.sol b/contracts/validator-manager/interfaces/INativeTokenStakingManager.sol similarity index 100% rename from contracts/validatorManager/interfaces/INativeTokenStakingManager.sol rename to contracts/validator-manager/interfaces/INativeTokenStakingManager.sol diff --git a/contracts/validatorManager/interfaces/IPoAValidatorManager.sol b/contracts/validator-manager/interfaces/IPoAValidatorManager.sol similarity index 100% rename from contracts/validatorManager/interfaces/IPoAValidatorManager.sol rename to contracts/validator-manager/interfaces/IPoAValidatorManager.sol diff --git a/contracts/validatorManager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol similarity index 100% rename from contracts/validatorManager/interfaces/IPoSValidatorManager.sol rename to contracts/validator-manager/interfaces/IPoSValidatorManager.sol diff --git a/contracts/validatorManager/interfaces/IRewardCalculator.sol b/contracts/validator-manager/interfaces/IRewardCalculator.sol similarity index 100% rename from contracts/validatorManager/interfaces/IRewardCalculator.sol rename to contracts/validator-manager/interfaces/IRewardCalculator.sol diff --git a/contracts/validatorManager/interfaces/IValidatorManager.sol b/contracts/validator-manager/interfaces/IValidatorManager.sol similarity index 100% rename from contracts/validatorManager/interfaces/IValidatorManager.sol rename to contracts/validator-manager/interfaces/IValidatorManager.sol diff --git a/contracts/validatorManager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol similarity index 100% rename from contracts/validatorManager/tests/ERC20TokenStakingManagerTests.t.sol rename to contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol diff --git a/contracts/validatorManager/tests/ExamplesRewardCalculatorTests.t.sol b/contracts/validator-manager/tests/ExamplesRewardCalculatorTests.t.sol similarity index 100% rename from contracts/validatorManager/tests/ExamplesRewardCalculatorTests.t.sol rename to contracts/validator-manager/tests/ExamplesRewardCalculatorTests.t.sol diff --git a/contracts/validatorManager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol similarity index 100% rename from contracts/validatorManager/tests/NativeTokenStakingManagerTests.t.sol rename to contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol diff --git a/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol similarity index 100% rename from contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol rename to contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol diff --git a/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol similarity index 100% rename from contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol rename to contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol diff --git a/contracts/validatorManager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol similarity index 100% rename from contracts/validatorManager/tests/ValidatorManagerTests.t.sol rename to contracts/validator-manager/tests/ValidatorManagerTests.t.sol diff --git a/contracts/validatorManager/tests/ValidatorMessagesTests.t.sol b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol similarity index 100% rename from contracts/validatorManager/tests/ValidatorMessagesTests.t.sol rename to contracts/validator-manager/tests/ValidatorMessagesTests.t.sol diff --git a/tests/flows/validatorManager/erc20_delegation.go b/tests/flows/validator-manager/erc20_delegation.go similarity index 100% rename from tests/flows/validatorManager/erc20_delegation.go rename to tests/flows/validator-manager/erc20_delegation.go diff --git a/tests/flows/validatorManager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go similarity index 100% rename from tests/flows/validatorManager/erc20_token_staking.go rename to tests/flows/validator-manager/erc20_token_staking.go diff --git a/tests/flows/validatorManager/native_delegation.go b/tests/flows/validator-manager/native_delegation.go similarity index 100% rename from tests/flows/validatorManager/native_delegation.go rename to tests/flows/validator-manager/native_delegation.go diff --git a/tests/flows/validatorManager/native_token_staking.go b/tests/flows/validator-manager/native_token_staking.go similarity index 100% rename from tests/flows/validatorManager/native_token_staking.go rename to tests/flows/validator-manager/native_token_staking.go diff --git a/tests/flows/validatorManager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go similarity index 100% rename from tests/flows/validatorManager/poa_to_pos.go rename to tests/flows/validator-manager/poa_to_pos.go diff --git a/tests/flows/validatorManager/poa_validator_manager.go b/tests/flows/validator-manager/poa_validator_manager.go similarity index 100% rename from tests/flows/validatorManager/poa_validator_manager.go rename to tests/flows/validator-manager/poa_validator_manager.go From c9b1556bec67a1887569b182eb4f9a4f58dfda59 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Sep 2024 18:27:44 -0400 Subject: [PATCH 350/545] Hook up native minter precompile to PoS tests --- .../go/INativeMinter/INativeMinter.go | 634 ++++++++++++++++++ scripts/abi_bindings.sh | 9 + tests/flows/staking/native_delegation.go | 2 + tests/flows/staking/native_token_staking.go | 2 + tests/flows/staking/poa_to_pos.go | 2 + tests/utils/chain.go | 13 + tests/utils/warp-genesis-template.json | 3 +- 7 files changed, 664 insertions(+), 1 deletion(-) create mode 100644 abi-bindings/go/INativeMinter/INativeMinter.go diff --git a/abi-bindings/go/INativeMinter/INativeMinter.go b/abi-bindings/go/INativeMinter/INativeMinter.go new file mode 100644 index 000000000..308b401a0 --- /dev/null +++ b/abi-bindings/go/INativeMinter/INativeMinter.go @@ -0,0 +1,634 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package inativeminter + +import ( + "errors" + "math/big" + "strings" + + "github.com/ava-labs/subnet-evm/accounts/abi" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" + "github.com/ava-labs/subnet-evm/core/types" + "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = interfaces.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// INativeMinterMetaData contains all meta data concerning the INativeMinter contract. +var INativeMinterMetaData = &bind.MetaData{ + ABI: "[{\"type\":\"function\",\"name\":\"mintNativeCoin\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"readAllowList\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[{\"name\":\"role\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"setAdmin\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setEnabled\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setManager\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"setNone\",\"inputs\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"event\",\"name\":\"NativeCoinMinted\",\"inputs\":[{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"recipient\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"amount\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"RoleSet\",\"inputs\":[{\"name\":\"role\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"account\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"sender\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"oldRole\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false}]", +} + +// INativeMinterABI is the input ABI used to generate the binding from. +// Deprecated: Use INativeMinterMetaData.ABI instead. +var INativeMinterABI = INativeMinterMetaData.ABI + +// INativeMinter is an auto generated Go binding around an Ethereum contract. +type INativeMinter struct { + INativeMinterCaller // Read-only binding to the contract + INativeMinterTransactor // Write-only binding to the contract + INativeMinterFilterer // Log filterer for contract events +} + +// INativeMinterCaller is an auto generated read-only Go binding around an Ethereum contract. +type INativeMinterCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// INativeMinterTransactor is an auto generated write-only Go binding around an Ethereum contract. +type INativeMinterTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// INativeMinterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type INativeMinterFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// INativeMinterSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type INativeMinterSession struct { + Contract *INativeMinter // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// INativeMinterCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type INativeMinterCallerSession struct { + Contract *INativeMinterCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// INativeMinterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type INativeMinterTransactorSession struct { + Contract *INativeMinterTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// INativeMinterRaw is an auto generated low-level Go binding around an Ethereum contract. +type INativeMinterRaw struct { + Contract *INativeMinter // Generic contract binding to access the raw methods on +} + +// INativeMinterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type INativeMinterCallerRaw struct { + Contract *INativeMinterCaller // Generic read-only contract binding to access the raw methods on +} + +// INativeMinterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type INativeMinterTransactorRaw struct { + Contract *INativeMinterTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewINativeMinter creates a new instance of INativeMinter, bound to a specific deployed contract. +func NewINativeMinter(address common.Address, backend bind.ContractBackend) (*INativeMinter, error) { + contract, err := bindINativeMinter(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &INativeMinter{INativeMinterCaller: INativeMinterCaller{contract: contract}, INativeMinterTransactor: INativeMinterTransactor{contract: contract}, INativeMinterFilterer: INativeMinterFilterer{contract: contract}}, nil +} + +// NewINativeMinterCaller creates a new read-only instance of INativeMinter, bound to a specific deployed contract. +func NewINativeMinterCaller(address common.Address, caller bind.ContractCaller) (*INativeMinterCaller, error) { + contract, err := bindINativeMinter(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &INativeMinterCaller{contract: contract}, nil +} + +// NewINativeMinterTransactor creates a new write-only instance of INativeMinter, bound to a specific deployed contract. +func NewINativeMinterTransactor(address common.Address, transactor bind.ContractTransactor) (*INativeMinterTransactor, error) { + contract, err := bindINativeMinter(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &INativeMinterTransactor{contract: contract}, nil +} + +// NewINativeMinterFilterer creates a new log filterer instance of INativeMinter, bound to a specific deployed contract. +func NewINativeMinterFilterer(address common.Address, filterer bind.ContractFilterer) (*INativeMinterFilterer, error) { + contract, err := bindINativeMinter(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &INativeMinterFilterer{contract: contract}, nil +} + +// bindINativeMinter binds a generic wrapper to an already deployed contract. +func bindINativeMinter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := INativeMinterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_INativeMinter *INativeMinterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _INativeMinter.Contract.INativeMinterCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_INativeMinter *INativeMinterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _INativeMinter.Contract.INativeMinterTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_INativeMinter *INativeMinterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _INativeMinter.Contract.INativeMinterTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_INativeMinter *INativeMinterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _INativeMinter.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_INativeMinter *INativeMinterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _INativeMinter.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_INativeMinter *INativeMinterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _INativeMinter.Contract.contract.Transact(opts, method, params...) +} + +// ReadAllowList is a free data retrieval call binding the contract method 0xeb54dae1. +// +// Solidity: function readAllowList(address addr) view returns(uint256 role) +func (_INativeMinter *INativeMinterCaller) ReadAllowList(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + var out []interface{} + err := _INativeMinter.contract.Call(opts, &out, "readAllowList", addr) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ReadAllowList is a free data retrieval call binding the contract method 0xeb54dae1. +// +// Solidity: function readAllowList(address addr) view returns(uint256 role) +func (_INativeMinter *INativeMinterSession) ReadAllowList(addr common.Address) (*big.Int, error) { + return _INativeMinter.Contract.ReadAllowList(&_INativeMinter.CallOpts, addr) +} + +// ReadAllowList is a free data retrieval call binding the contract method 0xeb54dae1. +// +// Solidity: function readAllowList(address addr) view returns(uint256 role) +func (_INativeMinter *INativeMinterCallerSession) ReadAllowList(addr common.Address) (*big.Int, error) { + return _INativeMinter.Contract.ReadAllowList(&_INativeMinter.CallOpts, addr) +} + +// MintNativeCoin is a paid mutator transaction binding the contract method 0x4f5aaaba. +// +// Solidity: function mintNativeCoin(address addr, uint256 amount) returns() +func (_INativeMinter *INativeMinterTransactor) MintNativeCoin(opts *bind.TransactOpts, addr common.Address, amount *big.Int) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "mintNativeCoin", addr, amount) +} + +// MintNativeCoin is a paid mutator transaction binding the contract method 0x4f5aaaba. +// +// Solidity: function mintNativeCoin(address addr, uint256 amount) returns() +func (_INativeMinter *INativeMinterSession) MintNativeCoin(addr common.Address, amount *big.Int) (*types.Transaction, error) { + return _INativeMinter.Contract.MintNativeCoin(&_INativeMinter.TransactOpts, addr, amount) +} + +// MintNativeCoin is a paid mutator transaction binding the contract method 0x4f5aaaba. +// +// Solidity: function mintNativeCoin(address addr, uint256 amount) returns() +func (_INativeMinter *INativeMinterTransactorSession) MintNativeCoin(addr common.Address, amount *big.Int) (*types.Transaction, error) { + return _INativeMinter.Contract.MintNativeCoin(&_INativeMinter.TransactOpts, addr, amount) +} + +// SetAdmin is a paid mutator transaction binding the contract method 0x704b6c02. +// +// Solidity: function setAdmin(address addr) returns() +func (_INativeMinter *INativeMinterTransactor) SetAdmin(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "setAdmin", addr) +} + +// SetAdmin is a paid mutator transaction binding the contract method 0x704b6c02. +// +// Solidity: function setAdmin(address addr) returns() +func (_INativeMinter *INativeMinterSession) SetAdmin(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetAdmin(&_INativeMinter.TransactOpts, addr) +} + +// SetAdmin is a paid mutator transaction binding the contract method 0x704b6c02. +// +// Solidity: function setAdmin(address addr) returns() +func (_INativeMinter *INativeMinterTransactorSession) SetAdmin(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetAdmin(&_INativeMinter.TransactOpts, addr) +} + +// SetEnabled is a paid mutator transaction binding the contract method 0x0aaf7043. +// +// Solidity: function setEnabled(address addr) returns() +func (_INativeMinter *INativeMinterTransactor) SetEnabled(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "setEnabled", addr) +} + +// SetEnabled is a paid mutator transaction binding the contract method 0x0aaf7043. +// +// Solidity: function setEnabled(address addr) returns() +func (_INativeMinter *INativeMinterSession) SetEnabled(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetEnabled(&_INativeMinter.TransactOpts, addr) +} + +// SetEnabled is a paid mutator transaction binding the contract method 0x0aaf7043. +// +// Solidity: function setEnabled(address addr) returns() +func (_INativeMinter *INativeMinterTransactorSession) SetEnabled(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetEnabled(&_INativeMinter.TransactOpts, addr) +} + +// SetManager is a paid mutator transaction binding the contract method 0xd0ebdbe7. +// +// Solidity: function setManager(address addr) returns() +func (_INativeMinter *INativeMinterTransactor) SetManager(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "setManager", addr) +} + +// SetManager is a paid mutator transaction binding the contract method 0xd0ebdbe7. +// +// Solidity: function setManager(address addr) returns() +func (_INativeMinter *INativeMinterSession) SetManager(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetManager(&_INativeMinter.TransactOpts, addr) +} + +// SetManager is a paid mutator transaction binding the contract method 0xd0ebdbe7. +// +// Solidity: function setManager(address addr) returns() +func (_INativeMinter *INativeMinterTransactorSession) SetManager(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetManager(&_INativeMinter.TransactOpts, addr) +} + +// SetNone is a paid mutator transaction binding the contract method 0x8c6bfb3b. +// +// Solidity: function setNone(address addr) returns() +func (_INativeMinter *INativeMinterTransactor) SetNone(opts *bind.TransactOpts, addr common.Address) (*types.Transaction, error) { + return _INativeMinter.contract.Transact(opts, "setNone", addr) +} + +// SetNone is a paid mutator transaction binding the contract method 0x8c6bfb3b. +// +// Solidity: function setNone(address addr) returns() +func (_INativeMinter *INativeMinterSession) SetNone(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetNone(&_INativeMinter.TransactOpts, addr) +} + +// SetNone is a paid mutator transaction binding the contract method 0x8c6bfb3b. +// +// Solidity: function setNone(address addr) returns() +func (_INativeMinter *INativeMinterTransactorSession) SetNone(addr common.Address) (*types.Transaction, error) { + return _INativeMinter.Contract.SetNone(&_INativeMinter.TransactOpts, addr) +} + +// INativeMinterNativeCoinMintedIterator is returned from FilterNativeCoinMinted and is used to iterate over the raw logs and unpacked data for NativeCoinMinted events raised by the INativeMinter contract. +type INativeMinterNativeCoinMintedIterator struct { + Event *INativeMinterNativeCoinMinted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *INativeMinterNativeCoinMintedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(INativeMinterNativeCoinMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(INativeMinterNativeCoinMinted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *INativeMinterNativeCoinMintedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *INativeMinterNativeCoinMintedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// INativeMinterNativeCoinMinted represents a NativeCoinMinted event raised by the INativeMinter contract. +type INativeMinterNativeCoinMinted struct { + Sender common.Address + Recipient common.Address + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterNativeCoinMinted is a free log retrieval operation binding the contract event 0x400cd392f3d56fd10bb1dbd5839fdda8298208ddaa97b368faa053e1850930ee. +// +// Solidity: event NativeCoinMinted(address indexed sender, address indexed recipient, uint256 amount) +func (_INativeMinter *INativeMinterFilterer) FilterNativeCoinMinted(opts *bind.FilterOpts, sender []common.Address, recipient []common.Address) (*INativeMinterNativeCoinMintedIterator, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _INativeMinter.contract.FilterLogs(opts, "NativeCoinMinted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return &INativeMinterNativeCoinMintedIterator{contract: _INativeMinter.contract, event: "NativeCoinMinted", logs: logs, sub: sub}, nil +} + +// WatchNativeCoinMinted is a free log subscription operation binding the contract event 0x400cd392f3d56fd10bb1dbd5839fdda8298208ddaa97b368faa053e1850930ee. +// +// Solidity: event NativeCoinMinted(address indexed sender, address indexed recipient, uint256 amount) +func (_INativeMinter *INativeMinterFilterer) WatchNativeCoinMinted(opts *bind.WatchOpts, sink chan<- *INativeMinterNativeCoinMinted, sender []common.Address, recipient []common.Address) (event.Subscription, error) { + + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + var recipientRule []interface{} + for _, recipientItem := range recipient { + recipientRule = append(recipientRule, recipientItem) + } + + logs, sub, err := _INativeMinter.contract.WatchLogs(opts, "NativeCoinMinted", senderRule, recipientRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(INativeMinterNativeCoinMinted) + if err := _INativeMinter.contract.UnpackLog(event, "NativeCoinMinted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseNativeCoinMinted is a log parse operation binding the contract event 0x400cd392f3d56fd10bb1dbd5839fdda8298208ddaa97b368faa053e1850930ee. +// +// Solidity: event NativeCoinMinted(address indexed sender, address indexed recipient, uint256 amount) +func (_INativeMinter *INativeMinterFilterer) ParseNativeCoinMinted(log types.Log) (*INativeMinterNativeCoinMinted, error) { + event := new(INativeMinterNativeCoinMinted) + if err := _INativeMinter.contract.UnpackLog(event, "NativeCoinMinted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// INativeMinterRoleSetIterator is returned from FilterRoleSet and is used to iterate over the raw logs and unpacked data for RoleSet events raised by the INativeMinter contract. +type INativeMinterRoleSetIterator struct { + Event *INativeMinterRoleSet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *INativeMinterRoleSetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(INativeMinterRoleSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(INativeMinterRoleSet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *INativeMinterRoleSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *INativeMinterRoleSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// INativeMinterRoleSet represents a RoleSet event raised by the INativeMinter contract. +type INativeMinterRoleSet struct { + Role *big.Int + Account common.Address + Sender common.Address + OldRole *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRoleSet is a free log retrieval operation binding the contract event 0xcdb7ea01f00a414d78757bdb0f6391664ba3fedf987eed280927c1e7d695be3e. +// +// Solidity: event RoleSet(uint256 indexed role, address indexed account, address indexed sender, uint256 oldRole) +func (_INativeMinter *INativeMinterFilterer) FilterRoleSet(opts *bind.FilterOpts, role []*big.Int, account []common.Address, sender []common.Address) (*INativeMinterRoleSetIterator, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _INativeMinter.contract.FilterLogs(opts, "RoleSet", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return &INativeMinterRoleSetIterator{contract: _INativeMinter.contract, event: "RoleSet", logs: logs, sub: sub}, nil +} + +// WatchRoleSet is a free log subscription operation binding the contract event 0xcdb7ea01f00a414d78757bdb0f6391664ba3fedf987eed280927c1e7d695be3e. +// +// Solidity: event RoleSet(uint256 indexed role, address indexed account, address indexed sender, uint256 oldRole) +func (_INativeMinter *INativeMinterFilterer) WatchRoleSet(opts *bind.WatchOpts, sink chan<- *INativeMinterRoleSet, role []*big.Int, account []common.Address, sender []common.Address) (event.Subscription, error) { + + var roleRule []interface{} + for _, roleItem := range role { + roleRule = append(roleRule, roleItem) + } + var accountRule []interface{} + for _, accountItem := range account { + accountRule = append(accountRule, accountItem) + } + var senderRule []interface{} + for _, senderItem := range sender { + senderRule = append(senderRule, senderItem) + } + + logs, sub, err := _INativeMinter.contract.WatchLogs(opts, "RoleSet", roleRule, accountRule, senderRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(INativeMinterRoleSet) + if err := _INativeMinter.contract.UnpackLog(event, "RoleSet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRoleSet is a log parse operation binding the contract event 0xcdb7ea01f00a414d78757bdb0f6391664ba3fedf987eed280927c1e7d695be3e. +// +// Solidity: event RoleSet(uint256 indexed role, address indexed account, address indexed sender, uint256 oldRole) +func (_INativeMinter *INativeMinterFilterer) ParseRoleSet(log types.Log) (*INativeMinterRoleSet, error) { + event := new(INativeMinterRoleSet) + if err := _INativeMinter.contract.UnpackLog(event, "RoleSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/scripts/abi_bindings.sh b/scripts/abi_bindings.sh index 55a9b08df..b93d76422 100755 --- a/scripts/abi_bindings.sh +++ b/scripts/abi_bindings.sh @@ -20,6 +20,8 @@ DEFAULT_CONTRACT_LIST="TeleporterMessenger TeleporterRegistry ExampleERC20 Examp PROXY_LIST="TransparentUpgradeableProxy ProxyAdmin" +SUBNET_EVM_LIST="INativeMinter" + CONTRACT_LIST= HELP= while [ $# -gt 0 ]; do @@ -103,4 +105,11 @@ forge build --skip test --force --extra-output-files abi bin --contracts lib/ope cd $TELEPORTER_PATH/lib/openzeppelin-contracts/contracts/proxy/transparent generate_bindings "${contract_names[@]}" +contract_names=($SUBNET_EVM_LIST) +cd $TELEPORTER_PATH/ +forge build --skip test --force --extra-output-files abi bin --contracts lib/subnet-evm/contracts/contracts/interfaces + +cd $TELEPORTER_PATH/lib/subnet-evm/contracts/contracts/interfaces +generate_bindings "${contract_names[@]}" + exit 0 diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go index d8b7676e4..3c4d6b3fd 100644 --- a/tests/flows/staking/native_delegation.go +++ b/tests/flows/staking/native_delegation.go @@ -46,6 +46,8 @@ func NativeDelegation(network interfaces.LocalNetwork) { pChainInfo, ) + utils.AddNativeMinterAdmin(subnetAInfo, fundedKey, stakingManagerAddress) + _ = utils.InitializeNativeTokenValidatorSet( ctx, fundedKey, diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index 80e668cb2..d47972c20 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -51,6 +51,8 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { pChainInfo, ) + utils.AddNativeMinterAdmin(subnetAInfo, fundedKey, stakingManagerContractAddress) + _ = utils.InitializeNativeTokenValidatorSet( ctx, fundedKey, diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index b8daa4a6e..db9026389 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -152,6 +152,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) + utils.AddNativeMinterAdmin(subnetAInfo, fundedKey, proxyAddress) + rewardCalculatorAddress, _ := utils.DeployExampleRewardCalculator( ctx, fundedKey, diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 07872d456..cf2a3da56 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -24,10 +24,13 @@ import ( "github.com/ava-labs/awm-relayer/peers" "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" sigAggConfig "github.com/ava-labs/awm-relayer/signature-aggregator/config" + "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/eth/tracers" "github.com/ava-labs/subnet-evm/ethclient" subnetEvmInterfaces "github.com/ava-labs/subnet-evm/interfaces" + "github.com/ava-labs/subnet-evm/precompile/contracts/nativeminter" + nativeMinter "github.com/ava-labs/teleporter/abi-bindings/go/INativeMinter" "github.com/ava-labs/teleporter/tests/interfaces" gasUtils "github.com/ava-labs/teleporter/utils/gas-utils" "github.com/ethereum/go-ethereum/common" @@ -562,3 +565,13 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu messageCreator, ) } + +// Funded key must have admin access to set new admin. +func AddNativeMinterAdmin(subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey, address common.Address) { + nativeMinterPrecompile, err := nativeMinter.NewINativeMinter(nativeminter.ContractAddress, subnet.RPCClient) + Expect(err).Should(BeNil()) + + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnet.EVMChainID) + nativeMinterPrecompile.SetAdmin(opts, address) + Expect(err).Should(BeNil()) +} diff --git a/tests/utils/warp-genesis-template.json b/tests/utils/warp-genesis-template.json index 9d221136e..5dab415be 100644 --- a/tests/utils/warp-genesis-template.json +++ b/tests/utils/warp-genesis-template.json @@ -28,7 +28,8 @@ "blockTimestamp": 0, "adminAddresses": [ "0xAcB633F5B00099c7ec187eB00156c5cd9D854b5B", - "0x3405506b3711859c5070949ed9b700c7ba7bf750" + "0x3405506b3711859c5070949ed9b700c7ba7bf750", + "0x8db97C7cEcE249c2b98bDC0226Cc4C2A57BF52FC" ] } }, From bc7ddc72f50bec83423bd26e61ae29ee61b2d38d Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Wed, 18 Sep 2024 19:20:39 -0400 Subject: [PATCH 351/545] wait for success in AddNativeMinterAdmin --- tests/flows/staking/native_delegation.go | 2 +- tests/flows/staking/native_token_staking.go | 2 +- tests/flows/staking/poa_to_pos.go | 2 +- tests/utils/chain.go | 7 +++++-- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/tests/flows/staking/native_delegation.go b/tests/flows/staking/native_delegation.go index 3c4d6b3fd..cda020dcc 100644 --- a/tests/flows/staking/native_delegation.go +++ b/tests/flows/staking/native_delegation.go @@ -46,7 +46,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { pChainInfo, ) - utils.AddNativeMinterAdmin(subnetAInfo, fundedKey, stakingManagerAddress) + utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, stakingManagerAddress) _ = utils.InitializeNativeTokenValidatorSet( ctx, diff --git a/tests/flows/staking/native_token_staking.go b/tests/flows/staking/native_token_staking.go index d47972c20..9a0974e61 100644 --- a/tests/flows/staking/native_token_staking.go +++ b/tests/flows/staking/native_token_staking.go @@ -51,7 +51,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { pChainInfo, ) - utils.AddNativeMinterAdmin(subnetAInfo, fundedKey, stakingManagerContractAddress) + utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, stakingManagerContractAddress) _ = utils.InitializeNativeTokenValidatorSet( ctx, diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index db9026389..e69b51b7c 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -152,7 +152,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) - utils.AddNativeMinterAdmin(subnetAInfo, fundedKey, proxyAddress) + utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, proxyAddress) rewardCalculatorAddress, _ := utils.DeployExampleRewardCalculator( ctx, diff --git a/tests/utils/chain.go b/tests/utils/chain.go index cf2a3da56..747050683 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -567,11 +567,14 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu } // Funded key must have admin access to set new admin. -func AddNativeMinterAdmin(subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey, address common.Address) { +func AddNativeMinterAdmin(ctx context.Context, subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey, address common.Address) { nativeMinterPrecompile, err := nativeMinter.NewINativeMinter(nativeminter.ContractAddress, subnet.RPCClient) Expect(err).Should(BeNil()) opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnet.EVMChainID) - nativeMinterPrecompile.SetAdmin(opts, address) Expect(err).Should(BeNil()) + tx, err := nativeMinterPrecompile.SetAdmin(opts, address) + Expect(err).Should(BeNil()) + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + } From 9e80079bb8961746ffa9d37cff87ada2a66c0e7d Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Wed, 18 Sep 2024 19:25:00 -0400 Subject: [PATCH 352/545] lint --- tests/utils/chain.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 747050683..ac75d4d02 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -567,7 +567,12 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu } // Funded key must have admin access to set new admin. -func AddNativeMinterAdmin(ctx context.Context, subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey, address common.Address) { +func AddNativeMinterAdmin( + ctx context.Context, + subnet interfaces.SubnetTestInfo, + fundedKey *ecdsa.PrivateKey, + address common.Address, +) { nativeMinterPrecompile, err := nativeMinter.NewINativeMinter(nativeminter.ContractAddress, subnet.RPCClient) Expect(err).Should(BeNil()) @@ -576,5 +581,4 @@ func AddNativeMinterAdmin(ctx context.Context, subnet interfaces.SubnetTestInfo, tx, err := nativeMinterPrecompile.SetAdmin(opts, address) Expect(err).Should(BeNil()) WaitForTransactionSuccess(ctx, subnet, tx.Hash()) - } From 4733df18b6c76887977813fe96278131266fc600 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 19 Sep 2024 07:30:11 -0500 Subject: [PATCH 353/545] store latest uptime --- .../ERC20TokenStakingManager.go | 191 +++++++++++++++++- .../NativeTokenStakingManager.go | 191 +++++++++++++++++- .../validatorManager/PoSValidatorManager.sol | 50 ++++- .../interfaces/IPoSValidatorManager.sol | 33 ++- .../tests/PoAValidatorManagerTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 33 ++- .../tests/ValidatorManagerTests.t.sol | 42 +++- 7 files changed, 502 insertions(+), 40 deletions(-) diff --git a/abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 7c508d3ba..901cd5bac 100644 --- a/abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,8 +83,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615e8b380380615e8b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d3e8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f3660046150a1565b6103bf565b005b6101846101943660046150dc565b610862565b6101d76101a73660046150dc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b6102176102123660046150dc565b610a1b565b6040516001600160401b0390911681526020016101e1565b61018461023d366004615107565b610a31565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c366004615145565b610b10565b61018461027f36600461515e565b610bb0565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af366004615186565b610d85565b6101d76102c23660046151ea565b6113b9565b6102176102d53660046150dc565b6113d2565b6101846102e83660046150a1565b6113e6565b6101f2603081565b61018461030336600461515e565b6115e0565b6101d7610316366004615203565b611862565b610184610329366004615145565b61188e565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b6101846103623660046150dc565b611a46565b6101846103753660046150dc565b611ccc565b6101f2601481565b6103956103903660046150dc565b611de0565b6040516101e19190615237565b6102176202a30081565b6101d76103ba3660046152fe565b611ea8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615c92833981519152949193919290829060ff16600481111561042757610427615223565b600481111561043857610438615223565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104b483611de0565b90506002825160048111156104cb576104cb615223565b1461051d5760405162461bcd60e51b815260206004820152602a60248201525f80516020615cb28339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105825760405162461bcd60e51b815260206004820152603360248201525f80516020615cb28339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610514565b6003825280515f90600290600581111561059e5761059e615223565b036105f55786156105b6576105b38487611edd565b90505b5f836060015183608001516105cb9190615377565b90506105d78582612179565b506001600160401b0390811660e0860152421660a085015250610629565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561065c85606001516113b9565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106fd9190615397565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561073c5761073c615223565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610850916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615d128339815191526020526040808220815160e0810190925280545f80516020615cd283398151915293929190829060ff1660058111156108af576108af615223565b60058111156108c0576108c0615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561092f5761092f615223565b146109945760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb6109b98584606001515f6122d0565b6040518263ffffffff1660e01b81526004016109d591906153d0565b6020604051808303815f875af11580156109f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a159190615397565b50505050565b5f610a2b64e8d4a5100083615402565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a7a575080546001600160401b03808416911610155b15610a985760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ac384846124f7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615c928339815191525f80610b2984612511565b91509150610b368261285b565b610b405750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b6e57610b6e615223565b03610b93575f83815260088501602052604081208054919055610b918282612896565b505b610ba981610ba484604001516113b9565b61290c565b5050505050565b5f80516020615c928339815191525f610bc88461292f565b90505f80610bd98360400151612b09565b50915091505f610be883611de0565b9050816001600160401b031681606001516001600160401b03161015610c205760405162461bcd60e51b815260040161051490615421565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c655760405162461bcd60e51b815260040161051490615463565b60015f87815260068701602052604090205460ff166004811115610c8b57610c8b615223565b14610cf45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610514565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615cd28339815191529060ff1615610e225760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e65573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e899190615397565b836020013514610eeb5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610514565b30610efc60608501604086016154ac565b6001600160a01b031614610f6e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610514565b5f610f7c60608501856154c7565b91505f9050843560208601356014610f9a6060890160408a016154ac565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112c9575f61101a60608901896154c7565b8363ffffffff168181106110305761103061550c565b90506020028101906110429190615520565b61104b906155d0565b80515f818152600989016020526040902054919250901561107e5760405162461bcd60e51b815260040161051490615667565b84825f0151836020015184604001516040516020016110a094939291906156af565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110ee91906156fe565b602060405180830381855afa158015611109573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061112c9190615397565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111b8576111b8615223565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161126b91168661570f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112c290615722565b9050610ffe565b50600584018190555f6112db8661292f565b90505f6112eb8260400151612d44565b9050806002856040516112fe91906156fe565b602060405180830381855afa158015611319573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133c9190615397565b146113a05760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610514565b505050600a909201805460ff1916600117905550505050565b5f610a2b6001600160401b03831664e8d4a51000615744565b5f6113dc82611de0565b6080015192915050565b5f80516020615c928339815191525f6113fe85612eb6565b5f86815260058401602052604090205460a082015191925061143191600160b01b9091046001600160401b03169061575b565b6001600160401b03168160c001516001600160401b031610156114b25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610514565b8315610ba9575f6114c38685611edd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061151a906113b9565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611590573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b49190615397565b5f878152600885016020526040812080549091906115d390849061570f565b9091555050505050505050565b6115e8613131565b5f80516020615c928339815191525f6116008461292f565b90505f806116118360400151612b09565b50915091505f61162083611de0565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561165a5761165a615223565b600481111561166b5761166b615223565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561170a5760405162461bcd60e51b815260040161051490615421565b826001600160401b03168160e001516001600160401b031611156117405760405162461bcd60e51b815260040161051490615463565b60038151600481111561175557611755615223565b146117a95760405162461bcd60e51b815260206004820152603160248201525f80516020615cb28339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610514565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a01909252909120546117df9190612896565b856007015f8881526020019081526020015f205f905561180a8160200151610ba483606001516113b9565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061185e60015f80516020615cf283398151915255565b5050565b5f61186b613131565b61187683338461317b565b9050610a2b60015f80516020615cf283398151915255565b5f80516020615cd28339815191525f6118a68361292f565b90505f806118b78360400151613535565b91509150806119195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610514565b5f828152600785016020526040812080546119339061577b565b9050118015611965575060015f83815260088601602052604090205460ff16600581111561196357611963615223565b145b6119815760405162461bcd60e51b8152600401610514906157b3565b5f828152600785016020526040812061199991614ff1565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615c9283398151915293929190829060ff166004811115611aa757611aa7615223565b6004811115611ab857611ab8615223565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b3f57611b3f615223565b1480611b5d5750600381516004811115611b5b57611b5b615223565b145b611bb15760405162461bcd60e51b815260206004820152603260248201525f80516020615cb2833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610514565b5f611bbf8260400151611de0565b905080606001516001600160401b03165f03611c435760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610514565b6005600160991b016001600160a01b031663ee5b48eb611c708460400151846060015185608001516122d0565b6040518263ffffffff1660e01b8152600401611c8c91906153d0565b6020604051808303815f875af1158015611ca8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba99190615397565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615cd2833981519152929190611d149061577b565b9050118015611d46575060015f83815260088301602052604090205460ff166005811115611d4457611d44615223565b145b611d625760405162461bcd60e51b8152600401610514906157b3565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d9b91906004016157fa565b6020604051808303815f875af1158015611db7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ddb9190615397565b505050565b611de8615028565b5f8281525f80516020615d12833981519152602052604090819020815160e0810190925280545f80516020615cd2833981519152929190829060ff166005811115611e3557611e35615223565b6005811115611e4657611e46615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611eb1613131565b611ebd858585856136d6565b9050611ed560015f80516020615cf283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f28573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f4f919081019061588f565b9150915080611fb25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610514565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ff5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120199190615397565b82511461207d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610514565b60208201516001600160a01b0316156120f35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610514565b5f80612102846040015161394b565b9150915081871461216f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610514565b9695505050505050565b5f8281525f80516020615d12833981519152602052604081206002015481905f80516020615cd283398151915290600160801b90046001600160401b03166121c18582613b23565b5f6121cb87613d31565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61221b8a858b6122d0565b6040518263ffffffff1660e01b815260040161223791906153d0565b6020604051808303815f875af1158015612253573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122779190615397565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561234957612309816001615961565b612314906008615744565b5081515f9083908390811061232b5761232b61550c565b60200101906001600160f81b03191690815f1a9053506001016122f5565b505f5b60048110156123b457612360816003615961565b61236b906008615744565b600263ffffffff16901c60f81b82826002612386919061570f565b815181106123965761239661550c565b60200101906001600160f81b03191690815f1a90535060010161234c565b505f5b6020811015612416576123cb81601f615961565b6123d6906008615744565b86901c60f81b826123e883600661570f565b815181106123f8576123f861550c565b60200101906001600160f81b03191690815f1a9053506001016123b7565b505f5b60088110156124815761242d816007615961565b612438906008615744565b6001600160401b038616901c60f81b8261245383602661570f565b815181106124635761246361550c565b60200101906001600160f81b03191690815f1a905350600101612419565b505f5b60088110156124ec57612498816007615961565b6124a3906008615744565b6001600160401b038516901c60f81b826124be83602e61570f565b815181106124ce576124ce61550c565b60200101906001600160f81b03191690815f1a905350600101612484565b5090505b9392505050565b6124ff613dc1565b61250882613e0c565b61185e81613e83565b5f61251a615028565b5f80516020615cd28339815191525f6125328561292f565b90505f806125438360400151613535565b9150915080156125a85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610514565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156125d9576125d9615223565b60058111156125ea576125ea615223565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561265b5761265b615223565b1480612679575060018251600581111561267757612677615223565b145b6126d85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610514565b6003825160058111156126ed576126ed615223565b036126fa575060046126fe565b5060055b6020808301515f9081526009880190915260408120558181600581111561272757612727615223565b9081600581111561273a5761273a615223565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561276e5761276e615223565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561282257612822615223565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615c7283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156128f1575f80fd5b505af1158015612903573d5f803e3d5ffd5b50505050505050565b5f80516020615c728339815191525461185e906001600160a01b03168383613f24565b60408051606080820183525f8083526020830181905292820152905f80516020615cd28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156129a4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129cb919081019061588f565b9150915080612a2b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610514565b8254825114612a8e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610514565b60208201516001600160a01b031615612b015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610514565b509392505050565b5f805f8351603614612b2d5760405162461bcd60e51b815260040161051490615974565b5f805b6002811015612b7c57612b44816001615961565b612b4f906008615744565b61ffff16868281518110612b6557612b6561550c565b016020015160f81c901b9190911790600101612b30565b5061ffff811615612b9f5760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015612bfa57612bb6816003615961565b612bc1906008615744565b63ffffffff1687612bd383600261570f565b81518110612be357612be361550c565b016020015160f81c901b9190911790600101612ba2565b5063ffffffff8116600414612c215760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015612c7657612c3881601f615961565b612c43906008615744565b88612c4f83600661570f565b81518110612c5f57612c5f61550c565b016020015160f81c901b9190911790600101612c24565b505f805b6008811015612cd557612c8e816007615961565b612c99906008615744565b6001600160401b031689612cae83602661570f565b81518110612cbe57612cbe61550c565b016020015160f81c901b9190911790600101612c7a565b505f805b6008811015612d3457612ced816007615961565b612cf8906008615744565b6001600160401b03168a612d0d83602e61570f565b81518110612d1d57612d1d61550c565b016020015160f81c901b9190911790600101612cd9565b5091989097509095509350505050565b5f8151602614612d665760405162461bcd60e51b815260040161051490615974565b5f805b6002811015612db557612d7d816001615961565b612d88906008615744565b61ffff16848281518110612d9e57612d9e61550c565b016020015160f81c901b9190911790600101612d69565b5061ffff811615612dd85760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015612e3357612def816003615961565b612dfa906008615744565b63ffffffff1685612e0c83600261570f565b81518110612e1c57612e1c61550c565b016020015160f81c901b9190911790600101612ddb565b5063ffffffff811615612e585760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015612ead57612e6f81601f615961565b612e7a906008615744565b86612e8683600661570f565b81518110612e9657612e9661550c565b016020015160f81c901b9190911790600101612e5b565b50949350505050565b612ebe615028565b5f8281525f80516020615d128339815191526020526040808220815160e0810190925280545f80516020615cd283398151915293929190829060ff166005811115612f0b57612f0b615223565b6005811115612f1c57612f1c615223565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612f8e57612f8e615223565b14612fea5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610514565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561302e5761302e615223565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130da8582612179565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615cf283398151915280546001190161316257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615cf283398151915255565b5f5f80516020615c928339815191528161319761021285613f83565b90505f6131a387611de0565b90506131ae8761285b565b61320b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610514565b60028151600581111561322057613220615223565b1461327f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610514565b5f828260800151613290919061575b565b600485015460408401519192506132b2916001600160401b0390911690615a47565b6001600160401b0316816001600160401b031611156133315760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610514565b5f8061333d8a84612179565b915091505f8a8360405160200161336b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561340657613406615223565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146135585760405162461bcd60e51b815260040161051490615974565b5f805b60028110156135a75761356f816001615961565b61357a906008615744565b61ffff168582815181106135905761359061550c565b016020015160f81c901b919091179060010161355b565b5061ffff8116156135ca5760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015613625576135e1816003615961565b6135ec906008615744565b63ffffffff16866135fe83600261570f565b8151811061360e5761360e61550c565b016020015160f81c901b91909117906001016135cd565b5063ffffffff811660031461364c5760405162461bcd60e51b815260040161051490615a00565b5f805b60208110156136a15761366381601f615961565b61366e906008615744565b8761367a83600661570f565b8151811061368a5761368a61550c565b016020015160f81c901b919091179060010161364f565b505f866026815181106136b6576136b661550c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615c928339815191529061ffff861610801590613722575061271061ffff861611155b61373e5760405162461bcd60e51b815260040161051490615a72565b60028101546001600160401b0390811690851610156137b75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610514565b805483101561381a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610514565b80600101548311156138815760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610514565b5f61388b84613f83565b90505f61389782610a1b565b90505f6138a48983613fa6565b905060405180606001604052806138b83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e1461396e5760405162461bcd60e51b815260040161051490615974565b5f805b60028110156139bd57613985816001615961565b613990906008615744565b61ffff168582815181106139a6576139a661550c565b016020015160f81c901b9190911790600101613971565b5061ffff8116156139e05760405162461bcd60e51b8152600401610514906159bd565b5f805b6004811015613a3b576139f7816003615961565b613a02906008615744565b63ffffffff1686613a1483600261570f565b81518110613a2457613a2461550c565b016020015160f81c901b91909117906001016139e3565b5063ffffffff8116600514613a625760405162461bcd60e51b815260040161051490615a00565b5f805b6020811015613ab757613a7981601f615961565b613a84906008615744565b87613a9083600661570f565b81518110613aa057613aa061550c565b016020015160f81c901b9190911790600101613a65565b505f805b6008811015613b1657613acf816007615961565b613ada906008615744565b6001600160401b031688613aef83602661570f565b81518110613aff57613aff61550c565b016020015160f81c901b9190911790600101613abb565b5090969095509350505050565b5f80516020615cd28339815191525f6001600160401b038084169085161115613b5757613b508385615377565b9050613b64565b613b618484615377565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613bc6575060028401548151613bc2916001600160401b03169061570f565b8210155b15613bec576001600160401b038316606082015281815260408101516020820152613c0b565b8281606001818151613bfe919061575b565b6001600160401b03169052505b6060810151613c1b906064615a47565b602082015160028601546001600160401b039290921691613c469190600160401b900460ff16615744565b1015613caa5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610514565b856001600160401b031681604001818151613cc5919061570f565b9052506040810180516001600160401b0387169190613ce5908390615961565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d128339815191526020526040812060020180545f80516020615cd283398151915291600160401b9091046001600160401b0316906008613d7b83615abd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e0a57604051631afcd79f60e31b815260040160405180910390fd5b565b613e14613dc1565b613e1d8161450b565b613e25614524565b613e80608082013560a0830135613e4260e0850160c086016151ea565b613e53610100860160e08701615ad8565b61ffff16613e6961012087016101008801615af1565b613e7b610140880161012089016154ac565b614534565b50565b613e8b613dc1565b5f80516020615c728339815191526001600160a01b038216613f045760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610514565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ddb91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614778565b5f610a2b825f80516020615c72833981519152546001600160a01b0316906147d9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166140315760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610514565b5f80516020615cd28339815191524261405060408601602087016151ea565b6001600160401b0316116140c25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610514565b6140d260408501602086016151ea565b6001600160401b03166140e86202a3004261570f565b1161415b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610514565b83356141b35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610514565b83355f908152600982016020526040902054156141e25760405162461bcd60e51b815260040161051490615667565b60306141f16040860186615b11565b9050146142565760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610514565b614260835f613b23565b5f806142fa6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906142a591906151ea565b6001600160401b031681526020016142c060408a018a615b11565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061493b565b5f828152600786016020526040902091935091506143188282615b97565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906143459085906004016153d0565b6020604051808303815f875af1158015614361573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143859190615397565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156143fd576143fd615223565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916144dd918e01908e016151ea565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614513613dc1565b61451b614cea565b613e8081614cf2565b61452c613dc1565b613e0a614e94565b61453c613dc1565b5f80516020615c92833981519152836145a85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610514565b6127108411156145ca5760405162461bcd60e51b815260040161051490615a72565b858711156146325760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610514565b5f8360ff161161469f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610514565b600a60ff841611156147115760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610514565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61478c6001600160a01b03841683614e9c565b905080515f141580156147b05750808060200190518101906147ae9190615c56565b155b15611ddb57604051635274afe760e01b81526001600160a01b0384166004820152602401610514565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561481f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148439190615397565b905061485a6001600160a01b038516333086614ea9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561489e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148c29190615397565b90508181116149285760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610514565b6149328282615961565b95945050505050565b5f60608260800151516030146149a55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610514565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614a1c576149dc816001615961565b6149e7906008615744565b5081515f908390839081106149fe576149fe61550c565b60200101906001600160f81b03191690815f1a9053506001016149c8565b505f5b6004811015614a8457614a33816003615961565b614a3e906008615744565b600160ff919091161c60f81b82614a5683600261570f565b81518110614a6657614a6661550c565b60200101906001600160f81b03191690815f1a905350600101614a1f565b505f5b6020811015614ae15784518160208110614aa357614aa361550c565b1a60f81b82614ab383600661570f565b81518110614ac357614ac361550c565b60200101906001600160f81b03191690815f1a905350600101614a87565b505f5b6020811015614b415784602001518160208110614b0357614b0361550c565b1a60f81b82614b1383602661570f565b81518110614b2357614b2361550c565b60200101906001600160f81b03191690815f1a905350600101614ae4565b505f5b6008811015614bb557614b58816007615961565b614b63906008615744565b60ff1685604001516001600160401b0316901c60f81b82826046614b87919061570f565b81518110614b9757614b9761550c565b60200101906001600160f81b03191690815f1a905350600101614b44565b505f5b6030811015614c205784608001518181518110614bd757614bd761550c565b01602001516001600160f81b03191682614bf283604e61570f565b81518110614c0257614c0261550c565b60200101906001600160f81b03191690815f1a905350600101614bb8565b505f5b6008811015614c9257614c37816007615961565b614c42906008615744565b60608601516001600160401b0390811691161c60f81b82614c6483607e61570f565b81518110614c7457614c7461550c565b60200101906001600160f81b03191690815f1a905350600101614c23565b50600281604051614ca391906156fe565b602060405180830381855afa158015614cbe573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ce19190615397565b94909350915050565b613e0a613dc1565b614cfa613dc1565b80355f80516020615cd283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614d466080840160608501615af1565b60ff161115614db35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610514565b5f614dc46080840160608501615af1565b60ff1611614e2c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610514565b614e3c6080830160608401615af1565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614e6d60608301604084016151ea565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613168613dc1565b60606124f083835f614ee2565b6040516001600160a01b038481166024830152838116604483015260648201839052610a159186918216906323b872dd90608401613f51565b606081471015614f075760405163cd78605960e01b8152306004820152602401610514565b5f80856001600160a01b03168486604051614f2291906156fe565b5f6040518083038185875af1925050503d805f8114614f5c576040519150601f19603f3d011682016040523d82523d5f602084013e614f61565b606091505b509150915061216f868383606082614f8157614f7c82614fc8565b6124f0565b8151158015614f9857506001600160a01b0384163b155b15614fc157604051639996b31560e01b81526001600160a01b0385166004820152602401610514565b50806124f0565b805115614fd85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ffd9061577b565b5f825580601f1061500c575050565b601f0160209004905f5260205f2090810190613e809190615064565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615078575f8155600101615065565b5090565b8015158114613e80575f80fd5b803563ffffffff8116811461509c575f80fd5b919050565b5f805f606084860312156150b3575f80fd5b8335925060208401356150c58161507c565b91506150d360408501615089565b90509250925092565b5f602082840312156150ec575f80fd5b5035919050565b6001600160a01b0381168114613e80575f80fd5b5f8082840361016081121561511a575f80fd5b61014080821215615129575f80fd5b849350830135905061513a816150f3565b809150509250929050565b5f60208284031215615155575f80fd5b6124f082615089565b5f806040838503121561516f575f80fd5b61517883615089565b946020939093013593505050565b5f8060408385031215615197575f80fd5b82356001600160401b038111156151ac575f80fd5b8301608081860312156151bd575f80fd5b91506151cb60208401615089565b90509250929050565b80356001600160401b038116811461509c575f80fd5b5f602082840312156151fa575f80fd5b6124f0826151d4565b5f8060408385031215615214575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061525a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161529560608401826001600160401b03169052565b5060808301516152b060808401826001600160401b03169052565b5060a08301516152cb60a08401826001600160401b03169052565b5060c08301516152e660c08401826001600160401b03169052565b5092915050565b803561ffff8116811461509c575f80fd5b5f805f8060808587031215615311575f80fd5b84356001600160401b03811115615326575f80fd5b850160608188031215615337575f80fd5b9350615345602086016152ed565b9250615353604086016151d4565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156152e6576152e6615363565b5f602082840312156153a7575f80fd5b5051919050565b5f5b838110156153c85781810151838201526020016153b0565b50505f910152565b602081525f82518060208401526153ee8160408501602087016153ae565b601f01601f19169190910160400192915050565b5f8261541c57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156154bc575f80fd5b81356124f0816150f3565b5f808335601e198436030181126154dc575f80fd5b8301803591506001600160401b038211156154f5575f80fd5b6020019150600581901b36038213156122c9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615534575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156155745761557461553e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156155a2576155a261553e565b604052919050565b5f6001600160401b038211156155c2576155c261553e565b50601f01601f191660200190565b5f606082360312156155e0575f80fd5b6155e8615552565b8235815260206155f98185016151d4565b8183015260408401356001600160401b03811115615615575f80fd5b840136601f820112615625575f80fd5b8035615638615633826155aa565b61557a565b818152368483850101111561564b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516156c0818460208a016153ae565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156f08160288401602088016153ae565b016028019695505050505050565b5f82516155348184602087016153ae565b80820180821115610a2b57610a2b615363565b5f63ffffffff80831681810361573a5761573a615363565b6001019392505050565b8082028115828204841417610a2b57610a2b615363565b6001600160401b038181168382160190808211156152e6576152e6615363565b600181811c9082168061578f57607f821691505b6020821081036157ad57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461580c8161577b565b806020870152604060018084165f811461582d576001811461584957615876565b60ff19851660408a0152604084151560051b8a01019550615876565b895f5260205f205f5b8581101561586d5781548b8201860152908301908801615852565b8a016040019650505b509398975050505050505050565b805161509c8161507c565b5f80604083850312156158a0575f80fd5b82516001600160401b03808211156158b6575f80fd5b90840190606082870312156158c9575f80fd5b6158d1615552565b825181526020808401516158e4816150f3565b828201526040840151838111156158f9575f80fd5b80850194505087601f85011261590d575f80fd5b8351925061591d615633846155aa565b8381528882858701011115615930575f80fd5b61593f848383018488016153ae565b80604084015250819550615954818801615884565b9450505050509250929050565b81810381811115610a2b57610a2b615363565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a6a57615a6a615363565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361573a5761573a615363565b5f60208284031215615ae8575f80fd5b6124f0826152ed565b5f60208284031215615b01575f80fd5b813560ff811681146124f0575f80fd5b5f808335601e19843603018112615b26575f80fd5b8301803591506001600160401b03821115615b3f575f80fd5b6020019150368190038213156122c9575f80fd5b601f821115611ddb57805f5260205f20601f840160051c81016020851015615b785750805b601f840160051c820191505b81811015610ba9575f8155600101615b84565b81516001600160401b03811115615bb057615bb061553e565b615bc481615bbe845461577b565b84615b53565b602080601f831160018114615bf7575f8415615be05750858301515b5f19600386901b1c1916600185901b178555615c4e565b5f85815260208120601f198616915b82811015615c2557888601518255948401946001909101908401615c06565b5085821015615c4257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615c66575f80fd5b81516124f08161507c56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161622138038061622183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6160d48061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c806362065856116100f3578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103d4578063d5f20ff6146103dc578063df93d8de146103fc578063eb0acb8914610406575f80fd5b8063b771b3bc14610388578063ba3a4b97146103ae578063bee0a03f146103c1575f80fd5b80638280a25a116100ce5780638280a25a1461034757806398f3e2b41461034f5780639e1bc4ef14610362578063a3a65e4814610375575f80fd5b8063620658561461030e57806366435abf1461032157806376f7862114610334575f80fd5b8063330a0a3a1161015e578063467ef06f11610139578063467ef06f146102b85780635297fae6146102cb57806360305d62146102de57806361e2f490146102fb575f80fd5b8063330a0a3a1461027657806335455ded146102895780633a1cfff6146102a5575f80fd5b80630118acc4146101a55780630322ed98146101ba5780630cdd0985146101cd578063151d30d11461021e57806325e1c776146102385780632e2194d81461024b575b5f80fd5b6101b86101b33660046152f4565b610419565b005b6101b86101c836600461532f565b61088e565b61020b6101db36600461532f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610226600a81565b60405160ff9091168152602001610215565b6101b8610246366004615346565b610a47565b61025e61025936600461532f565b610ab5565b6040516001600160401b039091168152602001610215565b6101b8610284366004615384565b610acb565b61029261271081565b60405161ffff9091168152602001610215565b6101b86102b33660046152f4565b610baa565b6101b86102c63660046153c2565b610d2f565b6101b86102d93660046153db565b610dcf565b6102e6601481565b60405163ffffffff9091168152602001610215565b6101b8610309366004615403565b610fa4565b61020b61031c36600461545e565b6115d8565b61025e61032f36600461532f565b6115f1565b6101b86103423660046152f4565b611605565b610226603081565b6101b861035d3660046153db565b6117f3565b61020b610370366004615477565b611a75565b6101b86103833660046153c2565b611aa1565b6103966005600160991b0181565b6040516001600160a01b039091168152602001610215565b6101b86103bc36600461532f565b611c59565b6101b86103cf36600461532f565b611edf565b610226601481565b6103ef6103ea36600461532f565b611fee565b60405161021591906154ab565b61025e6202a30081565b61020b610414366004615572565b6120b6565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020616028833981519152949193919290829060ff16600481111561048157610481615497565b600481111561049257610492615497565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61050e83611fee565b905060028251600481111561052557610525615497565b146105775760405162461bcd60e51b815260206004820152602a60248201525f805160206160488339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105dc5760405162461bcd60e51b815260206004820152603360248201525f805160206160488339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161056e565b6003825280515f9060029060058111156105f8576105f8615497565b0361064f5786156106105761060d84876120eb565b90505b5f8360600151836080015161062591906155eb565b90506106318582612440565b506001600160401b0390811660e0860152421660a085015250610683565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106b685606001516115d8565b8460a0015186608001518760a00151865f806040518863ffffffff1660e01b81526004016106ea979695949392919061560b565b602060405180830381865afa158015610705573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107299190615649565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561076857610768615497565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206160a88339815191526020526040808220815160e0810190925280545f8051602061606883398151915293929190829060ff1660058111156108db576108db615497565b60058111156108ec576108ec615497565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095b5761095b615497565b146109c05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161056e565b6005600160991b016001600160a01b031663ee5b48eb6109e58584606001515f612597565b6040518263ffffffff1660e01b8152600401610a019190615682565b6020604051808303815f875af1158015610a1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a419190615649565b50505050565b610a50826127be565b610a6c5760405162461bcd60e51b815260040161056e906156b4565b6002610a7783611fee565b516005811115610a8957610a89615497565b14610aa65760405162461bcd60e51b815260040161056e906156fc565b610ab082826120eb565b505050565b5f610ac564e8d4a5100083615745565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b14575080546001600160401b03808416911610155b15610b325760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b5d84846127f9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206160288339815191525f610bc285612813565b5f86815260058401602052604090205460a0820151919250610bf591600160b01b9091046001600160401b031690615764565b6001600160401b03168160c001516001600160401b03161015610c2a5760405162461bcd60e51b815260040161056e90615784565b5f8415610c4257610c3b86856120eb565b9050610c5d565b505f8581526009830160205260409020546001600160401b03165b8260040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5610c9084604001516115d8565b60a085015160c08601516040516001600160e01b031960e086901b168152610cc4939291829188905f90819060040161560b565b602060405180830381865afa158015610cdf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d039190615649565b5f87815260088501602052604081208054909190610d229084906157d7565b9091555050505050505050565b5f805160206160288339815191525f80610d4884612a8e565b91509150610d55826127be565b610d5f5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d8d57610d8d615497565b03610db2575f83815260088501602052604081208054919055610db08282612dd8565b505b610dc881610dc384604001516115d8565b612e4e565b5050505050565b5f805160206160288339815191525f610de784612e71565b90505f80610df8836040015161304b565b50915091505f610e0783611fee565b9050816001600160401b031681606001516001600160401b03161015610e3f5760405162461bcd60e51b815260040161056e906157ea565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e845760405162461bcd60e51b815260040161056e9061582c565b60015f87815260068701602052604090205460ff166004811115610eaa57610eaa615497565b14610f135760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161056e565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206160688339815191529060ff16156110415760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161056e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611084573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a89190615649565b83602001351461110a5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161056e565b3061111b6060850160408601615875565b6001600160a01b03161461118d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161056e565b5f61119b6060850185615890565b91505f90508435602086013560146111b96060890160408a01615875565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156114e8575f6112396060890189615890565b8363ffffffff1681811061124f5761124f6158d5565b905060200281019061126191906158e9565b61126a90615999565b80515f818152600989016020526040902054919250901561129d5760405162461bcd60e51b815260040161056e90615a30565b84825f0151836020015184604001516040516020016112bf9493929190615a78565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161130d9190615ac7565b602060405180830381855afa158015611328573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061134b9190615649565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113d7576113d7615497565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161148a9116866157d7565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114e190615ad8565b905061121d565b50600584018190555f6114fa86612e71565b90505f61150a8260400151613286565b90508060028560405161151d9190615ac7565b602060405180830381855afa158015611538573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061155b9190615649565b146115bf5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161056e565b505050600a909201805460ff1916600117905550505050565b5f610ac56001600160401b03831664e8d4a51000615afa565b5f6115fb82611fee565b6080015192915050565b5f805160206160288339815191525f61161d85612813565b5f86815260058401602052604090205460a082015191925061165091600160b01b9091046001600160401b031690615764565b6001600160401b03168160c001516001600160401b031610156116855760405162461bcd60e51b815260040161056e90615784565b5f841561169d5761169686856120eb565b90506116b8565b505f8581526009830160205260409020546001600160401b03165b600483015460408301515f91600160401b90046001600160a01b03169063778c06b5906116e4906115d8565b60a086015160c08701516040516001600160e01b031960e086901b168152611718939291829189905f90819060040161560b565b602060405180830381865afa158015611733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117579190615649565b90505f81116117c65760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e20604482015274696e656c6967626c6520666f72207265776172647360581b606482015260840161056e565b5f878152600885016020526040812080548392906117e59084906157d7565b909155505050505050505050565b6117fb6133f8565b5f805160206160288339815191525f61181384612e71565b90505f80611824836040015161304b565b50915091505f61183383611fee565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561186d5761186d615497565b600481111561187e5761187e615497565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561191d5760405162461bcd60e51b815260040161056e906157ea565b826001600160401b03168160e001516001600160401b031611156119535760405162461bcd60e51b815260040161056e9061582c565b60038151600481111561196857611968615497565b146119bc5760405162461bcd60e51b815260206004820152603160248201525f805160206160488339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161056e565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a01909252909120546119f29190612dd8565b856007015f8881526020019081526020015f205f9055611a1d8160200151610dc383606001516115d8565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050611a7160015f8051602061608883398151915255565b5050565b5f611a7e6133f8565b611a89833384613442565b9050610ac560015f8051602061608883398151915255565b5f805160206160688339815191525f611ab983612e71565b90505f80611aca8360400151613779565b9150915080611b2c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161056e565b5f82815260078501602052604081208054611b4690615b11565b9050118015611b78575060015f83815260088601602052604090205460ff166005811115611b7657611b76615497565b145b611b945760405162461bcd60e51b815260040161056e90615b49565b5f8281526007850160205260408120611bac91615244565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061602883398151915293929190829060ff166004811115611cba57611cba615497565b6004811115611ccb57611ccb615497565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5257611d52615497565b1480611d705750600381516004811115611d6e57611d6e615497565b145b611dc45760405162461bcd60e51b815260206004820152603260248201525f80516020616048833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161056e565b5f611dd28260400151611fee565b905080606001516001600160401b03165f03611e565760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161056e565b6005600160991b016001600160a01b031663ee5b48eb611e83846040015184606001518560800151612597565b6040518263ffffffff1660e01b8152600401611e9f9190615682565b6020604051808303815f875af1158015611ebb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc89190615649565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020616068833981519152929190611f2790615b11565b9050118015611f59575060015f83815260088301602052604090205460ff166005811115611f5757611f57615497565b145b611f755760405162461bcd60e51b815260040161056e90615b49565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fae9190600401615b90565b6020604051808303815f875af1158015611fca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190615649565b611ff661527b565b5f8281525f805160206160a8833981519152602052604090819020815160e0810190925280545f80516020616068833981519152929190829060ff16600581111561204357612043615497565b600581111561205457612054615497565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120bf6133f8565b6120cb8585858561391a565b90506120e360015f8051602061608883398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612136573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261215d9190810190615c25565b91509150806121c05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161056e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122279190615649565b82511461228b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161056e565b60208201516001600160a01b0316156123015760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161056e565b5f806123108460400151613b8f565b9150915081871461237d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161056e565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0960205260409020545f80516020616028833981519152906001600160401b0390811690831611156123f7575f8881526009820160205260409020805467ffffffffffffffff19166001600160401b0384161790555b6040516001600160401b038316815288907fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d04359060200160405180910390a2509695505050505050565b5f8281525f805160206160a8833981519152602052604081206002015481905f8051602061606883398151915290600160801b90046001600160401b03166124888582613d67565b5f61249287613f75565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124e28a858b612597565b6040518263ffffffff1660e01b81526004016124fe9190615682565b6020604051808303815f875af115801561251a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253e9190615649565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612610576125d0816001615cf7565b6125db906008615afa565b5081515f908390839081106125f2576125f26158d5565b60200101906001600160f81b03191690815f1a9053506001016125bc565b505f5b600481101561267b57612627816003615cf7565b612632906008615afa565b600263ffffffff16901c60f81b8282600261264d91906157d7565b8151811061265d5761265d6158d5565b60200101906001600160f81b03191690815f1a905350600101612613565b505f5b60208110156126dd5761269281601f615cf7565b61269d906008615afa565b86901c60f81b826126af8360066157d7565b815181106126bf576126bf6158d5565b60200101906001600160f81b03191690815f1a90535060010161267e565b505f5b6008811015612748576126f4816007615cf7565b6126ff906008615afa565b6001600160401b038616901c60f81b8261271a8360266157d7565b8151811061272a5761272a6158d5565b60200101906001600160f81b03191690815f1a9053506001016126e0565b505f5b60088110156127b35761275f816007615cf7565b61276a906008615afa565b6001600160401b038516901c60f81b8261278583602e6157d7565b81518110612795576127956158d5565b60200101906001600160f81b03191690815f1a90535060010161274b565b5090505b9392505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b612801614005565b61280a82614050565b611a71816140c7565b61281b61527b565b5f8281525f805160206160a88339815191526020526040808220815160e0810190925280545f8051602061606883398151915293929190829060ff16600581111561286857612868615497565b600581111561287957612879615497565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156128eb576128eb615497565b146129475760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161056e565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561298b5761298b615497565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612a378582612440565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f612a9761527b565b5f805160206160688339815191525f612aaf85612e71565b90505f80612ac08360400151613779565b915091508015612b255760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161056e565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612b5657612b56615497565b6005811115612b6757612b67615497565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612bd857612bd8615497565b1480612bf65750600182516005811115612bf457612bf4615497565b145b612c555760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161056e565b600382516005811115612c6a57612c6a615497565b03612c7757506004612c7b565b5060055b6020808301515f90815260098801909152604081205581816005811115612ca457612ca4615497565b90816005811115612cb757612cb7615497565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612ceb57612ceb615497565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612d9f57612d9f615497565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f5f8051602061600883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612e33575f80fd5b505af1158015612e45573d5f803e3d5ffd5b50505050505050565b5f8051602061600883398151915254611a71906001600160a01b03168383614168565b60408051606080820183525f8083526020830181905292820152905f805160206160688339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ee6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f0d9190810190615c25565b9150915080612f6d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161056e565b8254825114612fd05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161056e565b60208201516001600160a01b0316156130435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161056e565b509392505050565b5f805f835160361461306f5760405162461bcd60e51b815260040161056e90615d0a565b5f805b60028110156130be57613086816001615cf7565b613091906008615afa565b61ffff168682815181106130a7576130a76158d5565b016020015160f81c901b9190911790600101613072565b5061ffff8116156130e15760405162461bcd60e51b815260040161056e90615d53565b5f805b600481101561313c576130f8816003615cf7565b613103906008615afa565b63ffffffff16876131158360026157d7565b81518110613125576131256158d5565b016020015160f81c901b91909117906001016130e4565b5063ffffffff81166004146131635760405162461bcd60e51b815260040161056e90615d96565b5f805b60208110156131b85761317a81601f615cf7565b613185906008615afa565b886131918360066157d7565b815181106131a1576131a16158d5565b016020015160f81c901b9190911790600101613166565b505f805b6008811015613217576131d0816007615cf7565b6131db906008615afa565b6001600160401b0316896131f08360266157d7565b81518110613200576132006158d5565b016020015160f81c901b91909117906001016131bc565b505f805b60088110156132765761322f816007615cf7565b61323a906008615afa565b6001600160401b03168a61324f83602e6157d7565b8151811061325f5761325f6158d5565b016020015160f81c901b919091179060010161321b565b5091989097509095509350505050565b5f81516026146132a85760405162461bcd60e51b815260040161056e90615d0a565b5f805b60028110156132f7576132bf816001615cf7565b6132ca906008615afa565b61ffff168482815181106132e0576132e06158d5565b016020015160f81c901b91909117906001016132ab565b5061ffff81161561331a5760405162461bcd60e51b815260040161056e90615d53565b5f805b600481101561337557613331816003615cf7565b61333c906008615afa565b63ffffffff168561334e8360026157d7565b8151811061335e5761335e6158d5565b016020015160f81c901b919091179060010161331d565b5063ffffffff81161561339a5760405162461bcd60e51b815260040161056e90615d96565b5f805b60208110156133ef576133b181601f615cf7565b6133bc906008615afa565b866133c88360066157d7565b815181106133d8576133d86158d5565b016020015160f81c901b919091179060010161339d565b50949350505050565b5f8051602061608883398151915280546001190161342957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061608883398151915255565b5f5f805160206160288339815191528161345e610259856141c7565b90505f61346a87611fee565b9050613475876127be565b6134915760405162461bcd60e51b815260040161056e906156b4565b6002815160058111156134a6576134a6615497565b146134c35760405162461bcd60e51b815260040161056e906156fc565b5f8282608001516134d49190615764565b600485015460408401519192506134f6916001600160401b0390911690615ddd565b6001600160401b0316816001600160401b031611156135755760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161056e565b5f806135818a84612440565b915091505f8a836040516020016135af92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561364a5761364a615497565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461379c5760405162461bcd60e51b815260040161056e90615d0a565b5f805b60028110156137eb576137b3816001615cf7565b6137be906008615afa565b61ffff168582815181106137d4576137d46158d5565b016020015160f81c901b919091179060010161379f565b5061ffff81161561380e5760405162461bcd60e51b815260040161056e90615d53565b5f805b600481101561386957613825816003615cf7565b613830906008615afa565b63ffffffff16866138428360026157d7565b81518110613852576138526158d5565b016020015160f81c901b9190911790600101613811565b5063ffffffff81166003146138905760405162461bcd60e51b815260040161056e90615d96565b5f805b60208110156138e5576138a781601f615cf7565b6138b2906008615afa565b876138be8360066157d7565b815181106138ce576138ce6158d5565b016020015160f81c901b9190911790600101613893565b505f866026815181106138fa576138fa6158d5565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206160288339815191529061ffff861610801590613966575061271061ffff861611155b6139825760405162461bcd60e51b815260040161056e90615e08565b60028101546001600160401b0390811690851610156139fb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161056e565b8054831015613a5e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161056e565b8060010154831115613ac55760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161056e565b5f613acf846141c7565b90505f613adb82610ab5565b90505f613ae889836141ea565b90506040518060600160405280613afc3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613bb25760405162461bcd60e51b815260040161056e90615d0a565b5f805b6002811015613c0157613bc9816001615cf7565b613bd4906008615afa565b61ffff16858281518110613bea57613bea6158d5565b016020015160f81c901b9190911790600101613bb5565b5061ffff811615613c245760405162461bcd60e51b815260040161056e90615d53565b5f805b6004811015613c7f57613c3b816003615cf7565b613c46906008615afa565b63ffffffff1686613c588360026157d7565b81518110613c6857613c686158d5565b016020015160f81c901b9190911790600101613c27565b5063ffffffff8116600514613ca65760405162461bcd60e51b815260040161056e90615d96565b5f805b6020811015613cfb57613cbd81601f615cf7565b613cc8906008615afa565b87613cd48360066157d7565b81518110613ce457613ce46158d5565b016020015160f81c901b9190911790600101613ca9565b505f805b6008811015613d5a57613d13816007615cf7565b613d1e906008615afa565b6001600160401b031688613d338360266157d7565b81518110613d4357613d436158d5565b016020015160f81c901b9190911790600101613cff565b5090969095509350505050565b5f805160206160688339815191525f6001600160401b038084169085161115613d9b57613d9483856155eb565b9050613da8565b613da584846155eb565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613e0a575060028401548151613e06916001600160401b0316906157d7565b8210155b15613e30576001600160401b038316606082015281815260408101516020820152613e4f565b8281606001818151613e429190615764565b6001600160401b03169052505b6060810151613e5f906064615ddd565b602082015160028601546001600160401b039290921691613e8a9190600160401b900460ff16615afa565b1015613eee5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161056e565b856001600160401b031681604001818151613f0991906157d7565b9052506040810180516001600160401b0387169190613f29908390615cf7565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206160a88339815191526020526040812060020180545f8051602061606883398151915291600160401b9091046001600160401b0316906008613fbf83615e53565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661404e57604051631afcd79f60e31b815260040160405180910390fd5b565b614058614005565b6140618161474f565b614069614768565b6140c4608082013560a083013561408660e0850160c0860161545e565b614097610100860160e08701615e6e565b61ffff166140ad61012087016101008801615e87565b6140bf61014088016101208901615875565b614778565b50565b6140cf614005565b5f805160206160088339815191526001600160a01b0382166141485760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161056e565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610ab091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506149bc565b5f610ac5825f80516020616008833981519152546001600160a01b031690614a1d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142755760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161056e565b5f8051602061606883398151915242614294604086016020870161545e565b6001600160401b0316116143065760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161056e565b614316604085016020860161545e565b6001600160401b031661432c6202a300426157d7565b1161439f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161056e565b83356143f75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161056e565b83355f908152600982016020526040902054156144265760405162461bcd60e51b815260040161056e90615a30565b60306144356040860186615ea7565b90501461449a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161056e565b6144a4835f613d67565b5f8061453e6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144e9919061545e565b6001600160401b0316815260200161450460408a018a615ea7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b7f565b5f8281526007860160205260409020919350915061455c8282615f2d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614589908590600401615682565b6020604051808303815f875af11580156145a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145c99190615649565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561464157614641615497565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614721918e01908e0161545e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614757614005565b61475f614f2e565b6140c481614f36565b614770614005565b61404e6150d8565b614780614005565b5f80516020616028833981519152836147ec5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161056e565b61271084111561480e5760405162461bcd60e51b815260040161056e90615e08565b858711156148765760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161056e565b5f8360ff16116148e35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161056e565b600a60ff841611156149555760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161056e565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149d06001600160a01b038416836150e0565b905080515f141580156149f45750808060200190518101906149f29190615fec565b155b15610ab057604051635274afe760e01b81526001600160a01b038416600482015260240161056e565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a879190615649565b9050614a9e6001600160a01b0385163330866150ed565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614ae2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b069190615649565b9050818111614b6c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161056e565b614b768282615cf7565b95945050505050565b5f6060826080015151603014614be95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161056e565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c6057614c20816001615cf7565b614c2b906008615afa565b5081515f90839083908110614c4257614c426158d5565b60200101906001600160f81b03191690815f1a905350600101614c0c565b505f5b6004811015614cc857614c77816003615cf7565b614c82906008615afa565b600160ff919091161c60f81b82614c9a8360026157d7565b81518110614caa57614caa6158d5565b60200101906001600160f81b03191690815f1a905350600101614c63565b505f5b6020811015614d255784518160208110614ce757614ce76158d5565b1a60f81b82614cf78360066157d7565b81518110614d0757614d076158d5565b60200101906001600160f81b03191690815f1a905350600101614ccb565b505f5b6020811015614d855784602001518160208110614d4757614d476158d5565b1a60f81b82614d578360266157d7565b81518110614d6757614d676158d5565b60200101906001600160f81b03191690815f1a905350600101614d28565b505f5b6008811015614df957614d9c816007615cf7565b614da7906008615afa565b60ff1685604001516001600160401b0316901c60f81b82826046614dcb91906157d7565b81518110614ddb57614ddb6158d5565b60200101906001600160f81b03191690815f1a905350600101614d88565b505f5b6030811015614e645784608001518181518110614e1b57614e1b6158d5565b01602001516001600160f81b03191682614e3683604e6157d7565b81518110614e4657614e466158d5565b60200101906001600160f81b03191690815f1a905350600101614dfc565b505f5b6008811015614ed657614e7b816007615cf7565b614e86906008615afa565b60608601516001600160401b0390811691161c60f81b82614ea883607e6157d7565b81518110614eb857614eb86158d5565b60200101906001600160f81b03191690815f1a905350600101614e67565b50600281604051614ee79190615ac7565b602060405180830381855afa158015614f02573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f259190615649565b94909350915050565b61404e614005565b614f3e614005565b80355f8051602061606883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f8a6080840160608501615e87565b60ff161115614ff75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161056e565b5f6150086080840160608501615e87565b60ff16116150705760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161056e565b6150806080830160608401615e87565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556150b1606083016040840161545e565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61342f614005565b60606127b783835f615126565b6040516001600160a01b038481166024830152838116604483015260648201839052610a419186918216906323b872dd90608401614195565b60608147101561514b5760405163cd78605960e01b815230600482015260240161056e565b5f80856001600160a01b031684866040516151669190615ac7565b5f6040518083038185875af1925050503d805f81146151a0576040519150601f19603f3d011682016040523d82523d5f602084013e6151a5565b606091505b50915091506151b58683836151bf565b9695505050505050565b6060826151d4576151cf8261521b565b6127b7565b81511580156151eb57506001600160a01b0384163b155b1561521457604051639996b31560e01b81526001600160a01b038516600482015260240161056e565b50806127b7565b80511561522b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461525090615b11565b5f825580601f1061525f575050565b601f0160209004905f5260205f20908101906140c491906152b7565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156152cb575f81556001016152b8565b5090565b80151581146140c4575f80fd5b803563ffffffff811681146152ef575f80fd5b919050565b5f805f60608486031215615306575f80fd5b833592506020840135615318816152cf565b9150615326604085016152dc565b90509250925092565b5f6020828403121561533f575f80fd5b5035919050565b5f8060408385031215615357575f80fd5b82359150615367602084016152dc565b90509250929050565b6001600160a01b03811681146140c4575f80fd5b5f80828403610160811215615397575f80fd5b610140808212156153a6575f80fd5b84935083013590506153b781615370565b809150509250929050565b5f602082840312156153d2575f80fd5b6127b7826152dc565b5f80604083850312156153ec575f80fd5b6153f5836152dc565b946020939093013593505050565b5f8060408385031215615414575f80fd5b82356001600160401b03811115615429575f80fd5b83016080818603121561543a575f80fd5b9150615367602084016152dc565b80356001600160401b03811681146152ef575f80fd5b5f6020828403121561546e575f80fd5b6127b782615448565b5f8060408385031215615488575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106154ce57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161550960608401826001600160401b03169052565b50608083015161552460808401826001600160401b03169052565b5060a083015161553f60a08401826001600160401b03169052565b5060c083015161555a60c08401826001600160401b03169052565b5092915050565b803561ffff811681146152ef575f80fd5b5f805f8060808587031215615585575f80fd5b84356001600160401b0381111561559a575f80fd5b8501606081880312156155ab575f80fd5b93506155b960208601615561565b92506155c760408601615448565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561555a5761555a6155d7565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615659575f80fd5b5051919050565b5f5b8381101561567a578181015183820152602001615662565b50505f910152565b602081525f82518060208401526156a0816040850160208701615660565b601f01601f19169190910160400192915050565b60208082526028908201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660408201526730b634b230ba37b960c11b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6040820152686f742061637469766560b81b606082015260800190565b5f8261575f57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160401b0381811683821601908082111561555a5761555a6155d7565b60208082526033908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616040820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606082015260800190565b80820180821115610ac557610ac56155d7565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615885575f80fd5b81356127b781615370565b5f808335601e198436030181126158a5575f80fd5b8301803591506001600160401b038211156158be575f80fd5b6020019150600581901b3603821315612590575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126158fd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561593d5761593d615907565b60405290565b604051601f8201601f191681016001600160401b038111828210171561596b5761596b615907565b604052919050565b5f6001600160401b0382111561598b5761598b615907565b50601f01601f191660200190565b5f606082360312156159a9575f80fd5b6159b161591b565b8235815260206159c2818501615448565b8183015260408401356001600160401b038111156159de575f80fd5b840136601f8201126159ee575f80fd5b8035615a016159fc82615973565b615943565b8181523684838501011115615a14575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615a89818460208a01615660565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615ab9816028840160208801615660565b016028019695505050505050565b5f82516158fd818460208701615660565b5f63ffffffff808316818103615af057615af06155d7565b6001019392505050565b8082028115828204841417610ac557610ac56155d7565b600181811c90821680615b2557607f821691505b602082108103615b4357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615ba281615b11565b806020870152604060018084165f8114615bc35760018114615bdf57615c0c565b60ff19851660408a0152604084151560051b8a01019550615c0c565b895f5260205f205f5b85811015615c035781548b8201860152908301908801615be8565b8a016040019650505b509398975050505050505050565b80516152ef816152cf565b5f8060408385031215615c36575f80fd5b82516001600160401b0380821115615c4c575f80fd5b9084019060608287031215615c5f575f80fd5b615c6761591b565b82518152602080840151615c7a81615370565b82820152604084015183811115615c8f575f80fd5b80850194505087601f850112615ca3575f80fd5b83519250615cb36159fc84615973565b8381528882858701011115615cc6575f80fd5b615cd584838301848801615660565b80604084015250819550615cea818801615c1a565b9450505050509250929050565b81810381811115610ac557610ac56155d7565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615e0057615e006155d7565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b03808316818103615af057615af06155d7565b5f60208284031215615e7e575f80fd5b6127b782615561565b5f60208284031215615e97575f80fd5b813560ff811681146127b7575f80fd5b5f808335601e19843603018112615ebc575f80fd5b8301803591506001600160401b03821115615ed5575f80fd5b602001915036819003821315612590575f80fd5b601f821115610ab057805f5260205f20601f840160051c81016020851015615f0e5750805b601f840160051c820191505b81811015610dc8575f8155600101615f1a565b81516001600160401b03811115615f4657615f46615907565b615f5a81615f548454615b11565b84615ee9565b602080601f831160018114615f8d575f8415615f765750858301515b5f19600386901b1c1916600185901b178555615fe4565b5f85815260208120601f198616915b82811015615fbb57888601518255948401946001909101908401615f9c565b5085821015615fd857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ffc575f80fd5b81516127b7816152cf56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -710,6 +710,27 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } +// ForceInitializeEndValidation is a paid mutator transaction binding the contract method 0x3a1cfff6. +// +// Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ForceInitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "forceInitializeEndValidation", validationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndValidation is a paid mutator transaction binding the contract method 0x3a1cfff6. +// +// Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ForceInitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ForceInitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndValidation is a paid mutator transaction binding the contract method 0x3a1cfff6. +// +// Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ForceInitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ForceInitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + // Initialize is a paid mutator transaction binding the contract method 0x330a0a3a. // // Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings, address token) returns() @@ -899,6 +920,27 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Rese return _ERC20TokenStakingManager.Contract.ResendUpdateDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID) } +// SubmitUptimeProof is a paid mutator transaction binding the contract method 0x25e1c776. +// +// Solidity: function submitUptimeProof(bytes32 validationID, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) SubmitUptimeProof(opts *bind.TransactOpts, validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "submitUptimeProof", validationID, messageIndex) +} + +// SubmitUptimeProof is a paid mutator transaction binding the contract method 0x25e1c776. +// +// Solidity: function submitUptimeProof(bytes32 validationID, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) SubmitUptimeProof(validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.SubmitUptimeProof(&_ERC20TokenStakingManager.TransactOpts, validationID, messageIndex) +} + +// SubmitUptimeProof is a paid mutator transaction binding the contract method 0x25e1c776. +// +// Solidity: function submitUptimeProof(bytes32 validationID, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) SubmitUptimeProof(validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.SubmitUptimeProof(&_ERC20TokenStakingManager.TransactOpts, validationID, messageIndex) +} + // ERC20TokenStakingManagerDelegationEndedIterator is returned from FilterDelegationEnded and is used to iterate over the raw logs and unpacked data for DelegationEnded events raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerDelegationEndedIterator struct { Event *ERC20TokenStakingManagerDelegationEnded // Event containing the contract specifics and raw log @@ -1832,6 +1874,151 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseInitiali return event, nil } +// ERC20TokenStakingManagerUptimeUpdatedIterator is returned from FilterUptimeUpdated and is used to iterate over the raw logs and unpacked data for UptimeUpdated events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerUptimeUpdatedIterator struct { + Event *ERC20TokenStakingManagerUptimeUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerUptimeUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerUptimeUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerUptimeUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerUptimeUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerUptimeUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerUptimeUpdated represents a UptimeUpdated event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerUptimeUpdated struct { + ValidationID [32]byte + Uptime uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUptimeUpdated is a free log retrieval operation binding the contract event 0xec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435. +// +// Solidity: event UptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterUptimeUpdated(opts *bind.FilterOpts, validationID [][32]byte) (*ERC20TokenStakingManagerUptimeUpdatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "UptimeUpdated", validationIDRule) + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerUptimeUpdatedIterator{contract: _ERC20TokenStakingManager.contract, event: "UptimeUpdated", logs: logs, sub: sub}, nil +} + +// WatchUptimeUpdated is a free log subscription operation binding the contract event 0xec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435. +// +// Solidity: event UptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchUptimeUpdated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerUptimeUpdated, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "UptimeUpdated", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerUptimeUpdated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "UptimeUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUptimeUpdated is a log parse operation binding the contract event 0xec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435. +// +// Solidity: event UptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseUptimeUpdated(log types.Log) (*ERC20TokenStakingManagerUptimeUpdated, error) { + event := new(ERC20TokenStakingManagerUptimeUpdated) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "UptimeUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // ERC20TokenStakingManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerValidationPeriodCreatedIterator struct { Event *ERC20TokenStakingManagerValidationPeriodCreated // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go index 9cf250ac3..91ecf9442 100644 --- a/abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,8 +83,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615b3d380380615b3d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159f08061014d5f395ff3fe60806040526004361061017b575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f14610492578063c974d1b6146104a5578063d5f20ff6146104b9578063df93d8de146104e5575f80fd5b8063b771b3bc1461043a578063ba3a4b9714610454578063bee0a03f14610473575f80fd5b8063620658561461038b57806366435abf146103aa57806376f78621146103c95780638280a25a146103e857806398f3e2b4146103fc578063a3a65e481461041b575f80fd5b8063329c3e1211610138578063467ef06f11610113578063467ef06f146103055780635297fae61461032457806360305d621461034357806361e2f4901461036c575f80fd5b8063329c3e121461029857806335455ded146102ca57806340034a93146102f2575f80fd5b80630118acc41461017f5780630322ed98146101a05780630cdd0985146101bf578063151d30d11461021c5780631f7a9d8f146102425780632e2194d814610261575b5f80fd5b34801561018a575f80fd5b5061019e610199366004614df0565b6104fb565b005b3480156101ab575f80fd5b5061019e6101ba366004614e2b565b61099e565b3480156101ca575f80fd5b506102096101d9366004614e2b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610227575f80fd5b50610230600a81565b60405160ff9091168152602001610213565b34801561024d575f80fd5b5061019e61025c366004614e42565b610b57565b34801561026c575f80fd5b5061028061027b366004614e2b565b610c34565b6040516001600160401b039091168152602001610213565b3480156102a3575f80fd5b506102b26001600160991b0181565b6040516001600160a01b039091168152602001610213565b3480156102d5575f80fd5b506102df61271081565b60405161ffff9091168152602001610213565b610209610300366004614e80565b610c4a565b348015610310575f80fd5b5061019e61031f366004614ed4565b610c7e565b34801561032f575f80fd5b5061019e61033e366004614eed565b610d1e565b34801561034e575f80fd5b50610357601481565b60405163ffffffff9091168152602001610213565b348015610377575f80fd5b5061019e610386366004614f15565b610ef3565b348015610396575f80fd5b506102096103a5366004614f63565b611527565b3480156103b5575f80fd5b506102806103c4366004614e2b565b611540565b3480156103d4575f80fd5b5061019e6103e3366004614df0565b611554565b3480156103f3575f80fd5b50610230603081565b348015610407575f80fd5b5061019e610416366004614eed565b61174e565b348015610426575f80fd5b5061019e610435366004614ed4565b6119d0565b348015610445575f80fd5b506102b26005600160991b0181565b34801561045f575f80fd5b5061019e61046e366004614e2b565b611b88565b34801561047e575f80fd5b5061019e61048d366004614e2b565b611e0e565b6102096104a0366004614e2b565b611f22565b3480156104b0575f80fd5b50610230601481565b3480156104c4575f80fd5b506104d86104d3366004614e2b565b611f53565b6040516102139190614f90565b3480156104f0575f80fd5b506102806202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615944833981519152949193919290829060ff16600481111561056357610563614f7c565b600481111561057457610574614f7c565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105f083611f53565b905060028251600481111561060757610607614f7c565b146106595760405162461bcd60e51b815260206004820152602a60248201525f805160206159648339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106be5760405162461bcd60e51b815260206004820152603360248201525f805160206159648339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610650565b6003825280515f9060029060058111156106da576106da614f7c565b036107315786156106f2576106ef848761201b565b90505b5f83606001518360800151610707919061505a565b905061071385826122b7565b506001600160401b0390811660e0860152421660a085015250610765565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107988560600151611527565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610815573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610839919061507a565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561087857610878614f7c565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161098c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206159c48339815191526020526040808220815160e0810190925280545f8051602061598483398151915293929190829060ff1660058111156109eb576109eb614f7c565b60058111156109fc576109fc614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a6b57610a6b614f7c565b14610ad05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb610af58584606001515f61240e565b6040518263ffffffff1660e01b8152600401610b1191906150b3565b6020604051808303815f875af1158015610b2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b51919061507a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610ba0575080546001600160401b03808416911610155b15610bbe5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610be883612633565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c4464e8d4a51000836150e5565b92915050565b5f610c53612647565b610c5f8484843461267e565b9050610c7760015f805160206159a483398151915255565b9392505050565b5f805160206159448339815191525f80610c97846128fb565b91509150610ca482612c45565b610cae5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610cdc57610cdc614f7c565b03610d01575f83815260088501602052604081208054919055610cff8282612c80565b505b610d1781610d128460400151611527565b612ce6565b5050505050565b5f805160206159448339815191525f610d3684612cf9565b90505f80610d478360400151612ed3565b50915091505f610d5683611f53565b9050816001600160401b031681606001516001600160401b03161015610d8e5760405162461bcd60e51b815260040161065090615104565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610dd35760405162461bcd60e51b815260040161065090615146565b60015f87815260068701602052604090205460ff166004811115610df957610df9614f7c565b14610e625760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610650565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206159848339815191529060ff1615610f905760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ff7919061507a565b8360200135146110595760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610650565b3061106a60608501604086016151a3565b6001600160a01b0316146110dc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610650565b5f6110ea60608501856151be565b91505f90508435602086013560146111086060890160408a016151a3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611437575f61118860608901896151be565b8363ffffffff1681811061119e5761119e615203565b90506020028101906111b09190615217565b6111b9906152c7565b80515f81815260098901602052604090205491925090156111ec5760405162461bcd60e51b81526004016106509061535e565b84825f01518360200151846040015160405160200161120e94939291906153a6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161125c91906153f5565b602060405180830381855afa158015611277573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061129a919061507a565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561132657611326614f7c565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113d9911686615406565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061143090615419565b905061116c565b50600584018190555f61144986612cf9565b90505f611459826040015161310e565b90508060028560405161146c91906153f5565b602060405180830381855afa158015611487573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114aa919061507a565b1461150e5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610650565b505050600a909201805460ff1916600117905550505050565b5f610c446001600160401b03831664e8d4a5100061543b565b5f61154a82611f53565b6080015192915050565b5f805160206159448339815191525f61156c85613277565b5f86815260058401602052604090205460a082015191925061159f91600160b01b9091046001600160401b031690615452565b6001600160401b03168160c001516001600160401b031610156116205760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610650565b8315610d17575f611631868561201b565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061168890611527565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156116fe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611722919061507a565b5f87815260088501602052604081208054909190611741908490615406565b9091555050505050505050565b611756612647565b5f805160206159448339815191525f61176e84612cf9565b90505f8061177f8360400151612ed3565b50915091505f61178e83611f53565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117c8576117c8614f7c565b60048111156117d9576117d9614f7c565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e090920191909152840151919250848116911610156118785760405162461bcd60e51b815260040161065090615104565b826001600160401b03168160e001516001600160401b031611156118ae5760405162461bcd60e51b815260040161065090615146565b6003815160048111156118c3576118c3614f7c565b146119175760405162461bcd60e51b815260206004820152603160248201525f805160206159648339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610650565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a019092529091205461194d9190612c80565b856007015f8881526020019081526020015f205f90556119788160200151610d128360600151611527565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506119cc60015f805160206159a483398151915255565b5050565b5f805160206159848339815191525f6119e883612cf9565b90505f806119f983604001516134f2565b9150915080611a5b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610650565b5f82815260078501602052604081208054611a7590615472565b9050118015611aa7575060015f83815260088601602052604090205460ff166005811115611aa557611aa5614f7c565b145b611ac35760405162461bcd60e51b8152600401610650906154a4565b5f8281526007850160205260408120611adb91614d45565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061594483398151915293929190829060ff166004811115611be957611be9614f7c565b6004811115611bfa57611bfa614f7c565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611c8157611c81614f7c565b1480611c9f5750600381516004811115611c9d57611c9d614f7c565b145b611cf35760405162461bcd60e51b815260206004820152603260248201525f80516020615964833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610650565b5f611d018260400151611f53565b905080606001516001600160401b03165f03611d855760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610650565b6005600160991b016001600160a01b031663ee5b48eb611db284604001518460600151856080015161240e565b6040518263ffffffff1660e01b8152600401611dce91906150b3565b6020604051808303815f875af1158015611dea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d17919061507a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615984833981519152929190611e5690615472565b9050118015611e88575060015f83815260088301602052604090205460ff166005811115611e8657611e86614f7c565b145b611ea45760405162461bcd60e51b8152600401610650906154a4565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611edd91906004016154eb565b6020604051808303815f875af1158015611ef9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1d919061507a565b505050565b5f611f2b612647565b611f36823334613693565b9050611f4e60015f805160206159a483398151915255565b919050565b611f5b614d7c565b5f8281525f805160206159c4833981519152602052604090819020815160e0810190925280545f80516020615984833981519152929190829060ff166005811115611fa857611fa8614f7c565b6005811115611fb957611fb9614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612066573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208d9190810190615580565b91509150806120f05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610650565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612133573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612157919061507a565b8251146121bb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610650565b60208201516001600160a01b0316156122315760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610650565b5f806122408460400151613a4a565b915091508187146122ad5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610650565b9695505050505050565b5f8281525f805160206159c4833981519152602052604081206002015481905f8051602061598483398151915290600160801b90046001600160401b03166122ff8582613c22565b5f61230987613e30565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123598a858b61240e565b6040518263ffffffff1660e01b815260040161237591906150b3565b6020604051808303815f875af1158015612391573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123b5919061507a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561248757612447816001615652565b61245290600861543b565b5081515f9083908390811061246957612469615203565b60200101906001600160f81b03191690815f1a905350600101612433565b505f5b60048110156124f25761249e816003615652565b6124a990600861543b565b600263ffffffff16901c60f81b828260026124c49190615406565b815181106124d4576124d4615203565b60200101906001600160f81b03191690815f1a90535060010161248a565b505f5b60208110156125545761250981601f615652565b61251490600861543b565b86901c60f81b82612526836006615406565b8151811061253657612536615203565b60200101906001600160f81b03191690815f1a9053506001016124f5565b505f5b60088110156125bf5761256b816007615652565b61257690600861543b565b6001600160401b038616901c60f81b82612591836026615406565b815181106125a1576125a1615203565b60200101906001600160f81b03191690815f1a905350600101612557565b505f5b600881101561262a576125d6816007615652565b6125e190600861543b565b6001600160401b038516901c60f81b826125fc83602e615406565b8151811061260c5761260c615203565b60200101906001600160f81b03191690815f1a9053506001016125c2565b50949350505050565b61263b613ec0565b61264481613f0b565b50565b5f805160206159a483398151915280546001190161267857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206159448339815191529061ffff8616108015906126ca575061271061ffff861611155b6126e65760405162461bcd60e51b815260040161065090615665565b60028101546001600160401b03908116908516101561275f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610650565b80548310156127c25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610650565b80600101548311156128295760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610650565b825f61283482610c34565b90505f6128418983613f7f565b905060405180606001604052806128553390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f805160206159a483398151915255565b5f612904614d7c565b5f805160206159848339815191525f61291c85612cf9565b90505f8061292d83604001516134f2565b9150915080156129925760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610650565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156129c3576129c3614f7c565b60058111156129d4576129d4614f7c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612a4557612a45614f7c565b1480612a635750600182516005811115612a6157612a61614f7c565b145b612ac25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610650565b600382516005811115612ad757612ad7614f7c565b03612ae457506004612ae8565b5060055b6020808301515f90815260098801909152604081205581816005811115612b1157612b11614f7c565b90816005811115612b2457612b24614f7c565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612b5857612b58614f7c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612c0c57612c0c614f7c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ccc575f80fd5b505af1158015612cde573d5f803e3d5ffd5b505050505050565b6119cc6001600160a01b038316826144e4565b60408051606080820183525f8083526020830181905292820152905f805160206159848339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612d6e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612d959190810190615580565b9150915080612df55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610650565b8254825114612e585760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610650565b60208201516001600160a01b031615612ecb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610650565b509392505050565b5f805f8351603614612ef75760405162461bcd60e51b8152600401610650906156b0565b5f805b6002811015612f4657612f0e816001615652565b612f1990600861543b565b61ffff16868281518110612f2f57612f2f615203565b016020015160f81c901b9190911790600101612efa565b5061ffff811615612f695760405162461bcd60e51b8152600401610650906156f9565b5f805b6004811015612fc457612f80816003615652565b612f8b90600861543b565b63ffffffff1687612f9d836002615406565b81518110612fad57612fad615203565b016020015160f81c901b9190911790600101612f6c565b5063ffffffff8116600414612feb5760405162461bcd60e51b81526004016106509061573c565b5f805b60208110156130405761300281601f615652565b61300d90600861543b565b88613019836006615406565b8151811061302957613029615203565b016020015160f81c901b9190911790600101612fee565b505f805b600881101561309f57613058816007615652565b61306390600861543b565b6001600160401b031689613078836026615406565b8151811061308857613088615203565b016020015160f81c901b9190911790600101613044565b505f805b60088110156130fe576130b7816007615652565b6130c290600861543b565b6001600160401b03168a6130d783602e615406565b815181106130e7576130e7615203565b016020015160f81c901b91909117906001016130a3565b5091989097509095509350505050565b5f81516026146131305760405162461bcd60e51b8152600401610650906156b0565b5f805b600281101561317f57613147816001615652565b61315290600861543b565b61ffff1684828151811061316857613168615203565b016020015160f81c901b9190911790600101613133565b5061ffff8116156131a25760405162461bcd60e51b8152600401610650906156f9565b5f805b60048110156131fd576131b9816003615652565b6131c490600861543b565b63ffffffff16856131d6836002615406565b815181106131e6576131e6615203565b016020015160f81c901b91909117906001016131a5565b5063ffffffff8116156132225760405162461bcd60e51b81526004016106509061573c565b5f805b602081101561262a5761323981601f615652565b61324490600861543b565b86613250836006615406565b8151811061326057613260615203565b016020015160f81c901b9190911790600101613225565b61327f614d7c565b5f8281525f805160206159c48339815191526020526040808220815160e0810190925280545f8051602061598483398151915293929190829060ff1660058111156132cc576132cc614f7c565b60058111156132dd576132dd614f7c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561334f5761334f614f7c565b146133ab5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610650565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156133ef576133ef614f7c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61349b85826122b7565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146135155760405162461bcd60e51b8152600401610650906156b0565b5f805b60028110156135645761352c816001615652565b61353790600861543b565b61ffff1685828151811061354d5761354d615203565b016020015160f81c901b9190911790600101613518565b5061ffff8116156135875760405162461bcd60e51b8152600401610650906156f9565b5f805b60048110156135e25761359e816003615652565b6135a990600861543b565b63ffffffff16866135bb836002615406565b815181106135cb576135cb615203565b016020015160f81c901b919091179060010161358a565b5063ffffffff81166003146136095760405162461bcd60e51b81526004016106509061573c565b5f805b602081101561365e5761362081601f615652565b61362b90600861543b565b87613637836006615406565b8151811061364757613647615203565b016020015160f81c901b919091179060010161360c565b505f8660268151811061367357613673615203565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615944833981519152816136ac84610c34565b90505f6136b887611f53565b90506136c387612c45565b6137205760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610650565b60028151600581111561373557613735614f7c565b146137945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610650565b5f8282608001516137a59190615452565b600485015460408401519192506137c7916001600160401b0390911690615783565b6001600160401b0316816001600160401b031611156138465760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610650565b5f806138528a846122b7565b915091505f8a8360405160200161388092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561391b5761391b614f7c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613a6d5760405162461bcd60e51b8152600401610650906156b0565b5f805b6002811015613abc57613a84816001615652565b613a8f90600861543b565b61ffff16858281518110613aa557613aa5615203565b016020015160f81c901b9190911790600101613a70565b5061ffff811615613adf5760405162461bcd60e51b8152600401610650906156f9565b5f805b6004811015613b3a57613af6816003615652565b613b0190600861543b565b63ffffffff1686613b13836002615406565b81518110613b2357613b23615203565b016020015160f81c901b9190911790600101613ae2565b5063ffffffff8116600514613b615760405162461bcd60e51b81526004016106509061573c565b5f805b6020811015613bb657613b7881601f615652565b613b8390600861543b565b87613b8f836006615406565b81518110613b9f57613b9f615203565b016020015160f81c901b9190911790600101613b64565b505f805b6008811015613c1557613bce816007615652565b613bd990600861543b565b6001600160401b031688613bee836026615406565b81518110613bfe57613bfe615203565b016020015160f81c901b9190911790600101613bba565b5090969095509350505050565b5f805160206159848339815191525f6001600160401b038084169085161115613c5657613c4f838561505a565b9050613c63565b613c60848461505a565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613cc5575060028401548151613cc1916001600160401b031690615406565b8210155b15613ceb576001600160401b038316606082015281815260408101516020820152613d0a565b8281606001818151613cfd9190615452565b6001600160401b03169052505b6060810151613d1a906064615783565b602082015160028601546001600160401b039290921691613d459190600160401b900460ff1661543b565b1015613da95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610650565b856001600160401b031681604001818151613dc49190615406565b9052506040810180516001600160401b0387169190613de4908390615652565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206159c48339815191526020526040812060020180545f8051602061598483398151915291600160401b9091046001600160401b0316906008613e7a836157ae565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f0957604051631afcd79f60e31b815260040160405180910390fd5b565b613f13613ec0565b613f1c81614577565b613f24614590565b612644608082013560a0830135613f4160e0850160c08601614f63565b613f52610100860160e087016157c9565b61ffff16613f68610120870161010088016157e2565b613f7a610140880161012089016151a3565b6145a0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661400a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610650565b5f80516020615984833981519152426140296040860160208701614f63565b6001600160401b03161161409b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610650565b6140ab6040850160208601614f63565b6001600160401b03166140c16202a30042615406565b116141345760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610650565b833561418c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610650565b83355f908152600982016020526040902054156141bb5760405162461bcd60e51b81526004016106509061535e565b60306141ca6040860186615802565b90501461422f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610650565b614239835f613c22565b5f806142d36040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061427e9190614f63565b6001600160401b0316815260200161429960408a018a615802565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506147e4565b5f828152600786016020526040902091935091506142f18282615888565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061431e9085906004016150b3565b6020604051808303815f875af115801561433a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061435e919061507a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156143d6576143d6614f7c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916144b6918e01908e01614f63565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145075760405163cd78605960e01b8152306004820152602401610650565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614550576040519150601f19603f3d011682016040523d82523d5f602084013e614555565b606091505b5050905080611f1d57604051630a12f52160e11b815260040160405180910390fd5b61457f613ec0565b614587614b93565b61264481614b9b565b614598613ec0565b613f09614d3d565b6145a8613ec0565b5f80516020615944833981519152836146145760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610650565b6127108411156146365760405162461bcd60e51b815260040161065090615665565b8587111561469e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610650565b5f8360ff161161470b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610650565b600a60ff8416111561477d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610650565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461484e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610650565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156148c557614885816001615652565b61489090600861543b565b5081515f908390839081106148a7576148a7615203565b60200101906001600160f81b03191690815f1a905350600101614871565b505f5b600481101561492d576148dc816003615652565b6148e790600861543b565b600160ff919091161c60f81b826148ff836002615406565b8151811061490f5761490f615203565b60200101906001600160f81b03191690815f1a9053506001016148c8565b505f5b602081101561498a578451816020811061494c5761494c615203565b1a60f81b8261495c836006615406565b8151811061496c5761496c615203565b60200101906001600160f81b03191690815f1a905350600101614930565b505f5b60208110156149ea57846020015181602081106149ac576149ac615203565b1a60f81b826149bc836026615406565b815181106149cc576149cc615203565b60200101906001600160f81b03191690815f1a90535060010161498d565b505f5b6008811015614a5e57614a01816007615652565b614a0c90600861543b565b60ff1685604001516001600160401b0316901c60f81b82826046614a309190615406565b81518110614a4057614a40615203565b60200101906001600160f81b03191690815f1a9053506001016149ed565b505f5b6030811015614ac95784608001518181518110614a8057614a80615203565b01602001516001600160f81b03191682614a9b83604e615406565b81518110614aab57614aab615203565b60200101906001600160f81b03191690815f1a905350600101614a61565b505f5b6008811015614b3b57614ae0816007615652565b614aeb90600861543b565b60608601516001600160401b0390811691161c60f81b82614b0d83607e615406565b81518110614b1d57614b1d615203565b60200101906001600160f81b03191690815f1a905350600101614acc565b50600281604051614b4c91906153f5565b602060405180830381855afa158015614b67573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614b8a919061507a565b94909350915050565b613f09613ec0565b614ba3613ec0565b80355f8051602061598483398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614bef60808401606085016157e2565b60ff161115614c5c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610650565b5f614c6d60808401606085016157e2565b60ff1611614cd55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610650565b614ce560808301606084016157e2565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614d166060830160408401614f63565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6128e8613ec0565b508054614d5190615472565b5f825580601f10614d60575050565b601f0160209004905f5260205f20908101906126449190614db8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614dcc575f8155600101614db9565b5090565b8015158114612644575f80fd5b803563ffffffff81168114611f4e575f80fd5b5f805f60608486031215614e02575f80fd5b833592506020840135614e1481614dd0565b9150614e2260408501614ddd565b90509250925092565b5f60208284031215614e3b575f80fd5b5035919050565b5f6101408284031215614e53575f80fd5b50919050565b803561ffff81168114611f4e575f80fd5b80356001600160401b0381168114611f4e575f80fd5b5f805f60608486031215614e92575f80fd5b83356001600160401b03811115614ea7575f80fd5b840160608187031215614eb8575f80fd5b9250614ec660208501614e59565b9150614e2260408501614e6a565b5f60208284031215614ee4575f80fd5b610c7782614ddd565b5f8060408385031215614efe575f80fd5b614f0783614ddd565b946020939093013593505050565b5f8060408385031215614f26575f80fd5b82356001600160401b03811115614f3b575f80fd5b830160808186031215614f4c575f80fd5b9150614f5a60208401614ddd565b90509250929050565b5f60208284031215614f73575f80fd5b610c7782614e6a565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614fb357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614fee60608401826001600160401b03169052565b50608083015161500960808401826001600160401b03169052565b5060a083015161502460a08401826001600160401b03169052565b5060c083015161503f60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561503f5761503f615046565b5f6020828403121561508a575f80fd5b5051919050565b5f5b838110156150ab578181015183820152602001615093565b50505f910152565b602081525f82518060208401526150d1816040850160208701615091565b601f01601f19169190910160400192915050565b5f826150ff57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612644575f80fd5b5f602082840312156151b3575f80fd5b8135610c778161518f565b5f808335601e198436030181126151d3575f80fd5b8301803591506001600160401b038211156151ec575f80fd5b6020019150600581901b3603821315612407575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261522b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561526b5761526b615235565b60405290565b604051601f8201601f191681016001600160401b038111828210171561529957615299615235565b604052919050565b5f6001600160401b038211156152b9576152b9615235565b50601f01601f191660200190565b5f606082360312156152d7575f80fd5b6152df615249565b8235815260206152f0818501614e6a565b8183015260408401356001600160401b0381111561530c575f80fd5b840136601f82011261531c575f80fd5b803561532f61532a826152a1565b615271565b8181523684838501011115615342575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516153b7818460208a01615091565b80830190508581526001600160401b0360c01b8560c01b16602082015283516153e7816028840160208801615091565b016028019695505050505050565b5f825161522b818460208701615091565b80820180821115610c4457610c44615046565b5f63ffffffff80831681810361543157615431615046565b6001019392505050565b8082028115828204841417610c4457610c44615046565b6001600160401b0381811683821601908082111561503f5761503f615046565b600181811c9082168061548657607f821691505b602082108103614e5357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546154fd81615472565b806020870152604060018084165f811461551e576001811461553a57615567565b60ff19851660408a0152604084151560051b8a01019550615567565b895f5260205f205f5b8581101561555e5781548b8201860152908301908801615543565b8a016040019650505b509398975050505050505050565b8051611f4e81614dd0565b5f8060408385031215615591575f80fd5b82516001600160401b03808211156155a7575f80fd5b90840190606082870312156155ba575f80fd5b6155c2615249565b825181526020808401516155d58161518f565b828201526040840151838111156155ea575f80fd5b80850194505087601f8501126155fe575f80fd5b8351925061560e61532a846152a1565b8381528882858701011115615621575f80fd5b61563084838301848801615091565b80604084015250819550615645818801615575565b9450505050509250929050565b81810381811115610c4457610c44615046565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146157a6576157a6615046565b505092915050565b5f6001600160401b0380831681810361543157615431615046565b5f602082840312156157d9575f80fd5b610c7782614e59565b5f602082840312156157f2575f80fd5b813560ff81168114610c77575f80fd5b5f808335601e19843603018112615817575f80fd5b8301803591506001600160401b03821115615830575f80fd5b602001915036819003821315612407575f80fd5b601f821115611f1d57805f5260205f20601f840160051c810160208510156158695750805b601f840160051c820191505b81811015610d17575f8155600101615875565b81516001600160401b038111156158a1576158a1615235565b6158b5816158af8454615472565b84615844565b602080601f8311600181146158e8575f84156158d15750858301515b5f19600386901b1c1916600185901b178555612cde565b5f85815260208120601f198616915b82811015615916578886015182559484019460019091019084016158f7565b508582101561593357878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615edc380380615edc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d8f8061014d5f395ff3fe6080604052600436106101af575f3560e01c806361e2f490116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f14610504578063c974d1b614610517578063d5f20ff61461052b578063df93d8de14610557575f80fd5b8063b771b3bc146104ac578063ba3a4b97146104c6578063bee0a03f146104e5575f80fd5b806376f78621116100c257806376f786211461043b5780638280a25a1461045a57806398f3e2b41461046e578063a3a65e481461048d575f80fd5b806361e2f490146103de57806362065856146103fd57806366435abf1461041c575f80fd5b8063329c3e121161015257806340034a931161012d57806340034a9314610364578063467ef06f146103775780635297fae61461039657806360305d62146103b5575f80fd5b8063329c3e12146102eb57806335455ded1461031d5780633a1cfff614610345575f80fd5b8063151d30d11161018d578063151d30d1146102505780631f7a9d8f1461027657806325e1c776146102955780632e2194d8146102b4575f80fd5b80630118acc4146101b35780630322ed98146101d45780630cdd0985146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd36600461504c565b61056d565b005b3480156101df575f80fd5b506101d26101ee366004615087565b6109e2565b3480156101fe575f80fd5b5061023d61020d366004615087565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b34801561025b575f80fd5b50610264600a81565b60405160ff9091168152602001610247565b348015610281575f80fd5b506101d261029036600461509e565b610b9b565b3480156102a0575f80fd5b506101d26102af3660046150b5565b610c78565b3480156102bf575f80fd5b506102d36102ce366004615087565b610ce6565b6040516001600160401b039091168152602001610247565b3480156102f6575f80fd5b506103056001600160991b0181565b6040516001600160a01b039091168152602001610247565b348015610328575f80fd5b5061033261271081565b60405161ffff9091168152602001610247565b348015610350575f80fd5b506101d261035f36600461504c565b610cfc565b61023d610372366004615106565b610e81565b348015610382575f80fd5b506101d261039136600461515a565b610eb5565b3480156103a1575f80fd5b506101d26103b0366004615173565b610f55565b3480156103c0575f80fd5b506103c9601481565b60405163ffffffff9091168152602001610247565b3480156103e9575f80fd5b506101d26103f836600461519b565b61112a565b348015610408575f80fd5b5061023d6104173660046151e0565b61175e565b348015610427575f80fd5b506102d3610436366004615087565b611777565b348015610446575f80fd5b506101d261045536600461504c565b61178b565b348015610465575f80fd5b50610264603081565b348015610479575f80fd5b506101d2610488366004615173565b611979565b348015610498575f80fd5b506101d26104a736600461515a565b611bfb565b3480156104b7575f80fd5b506103056005600160991b0181565b3480156104d1575f80fd5b506101d26104e0366004615087565b611db3565b3480156104f0575f80fd5b506101d26104ff366004615087565b612039565b61023d610512366004615087565b612148565b348015610522575f80fd5b50610264601481565b348015610536575f80fd5b5061054a610545366004615087565b612179565b604051610247919061520d565b348015610562575f80fd5b506102d36202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615ce3833981519152949193919290829060ff1660048111156105d5576105d56151f9565b60048111156105e6576105e66151f9565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61066283612179565b9050600282516004811115610679576106796151f9565b146106cb5760405162461bcd60e51b815260206004820152602a60248201525f80516020615d038339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146107305760405162461bcd60e51b815260206004820152603360248201525f80516020615d038339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106c2565b6003825280515f90600290600581111561074c5761074c6151f9565b036107a3578615610764576107618487612241565b90505b5f8360600151836080015161077991906152d7565b90506107858582612596565b506001600160401b0390811660e0860152421660a0850152506107d7565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561080a856060015161175e565b8460a0015186608001518760a00151865f806040518863ffffffff1660e01b815260040161083e97969594939291906152f7565b602060405180830381865afa158015610859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087d9190615335565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108bc576108bc6151f9565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109d0916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615d638339815191526020526040808220815160e0810190925280545f80516020615d2383398151915293929190829060ff166005811115610a2f57610a2f6151f9565b6005811115610a4057610a406151f9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aaf57610aaf6151f9565b14610b145760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106c2565b6005600160991b016001600160a01b031663ee5b48eb610b398584606001515f6126ed565b6040518263ffffffff1660e01b8152600401610b55919061536e565b6020604051808303815f875af1158015610b71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b959190615335565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610be4575080546001600160401b03808416911610155b15610c025760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c2c83612912565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610c8182612926565b610c9d5760405162461bcd60e51b81526004016106c2906153a0565b6002610ca883612179565b516005811115610cba57610cba6151f9565b14610cd75760405162461bcd60e51b81526004016106c2906153e8565b610ce18282612241565b505050565b5f610cf664e8d4a5100083615431565b92915050565b5f80516020615ce38339815191525f610d1485612961565b5f86815260058401602052604090205460a0820151919250610d4791600160b01b9091046001600160401b031690615450565b6001600160401b03168160c001516001600160401b03161015610d7c5760405162461bcd60e51b81526004016106c290615470565b5f8415610d9457610d8d8685612241565b9050610daf565b505f8581526009830160205260409020546001600160401b03165b8260040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5610de2846040015161175e565b60a085015160c08601516040516001600160e01b031960e086901b168152610e16939291829188905f9081906004016152f7565b602060405180830381865afa158015610e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e559190615335565b5f87815260088501602052604081208054909190610e749084906154c3565b9091555050505050505050565b5f610e8a612bdc565b610e9684848434612c13565b9050610eae60015f80516020615d4383398151915255565b9392505050565b5f80516020615ce38339815191525f80610ece84612e90565b91509150610edb82612926565b610ee55750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610f1357610f136151f9565b03610f38575f83815260088501602052604081208054919055610f3682826131da565b505b610f4e81610f49846040015161175e565b613240565b5050505050565b5f80516020615ce38339815191525f610f6d84613253565b90505f80610f7e836040015161342d565b50915091505f610f8d83612179565b9050816001600160401b031681606001516001600160401b03161015610fc55760405162461bcd60e51b81526004016106c2906154d6565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b90920416111561100a5760405162461bcd60e51b81526004016106c290615518565b60015f87815260068701602052604090205460ff166004811115611030576110306151f9565b146110995760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106c2565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615d238339815191529060ff16156111c75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106c2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122e9190615335565b8360200135146112905760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106c2565b306112a16060850160408601615575565b6001600160a01b0316146113135760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106c2565b5f6113216060850185615590565b91505f905084356020860135601461133f6060890160408a01615575565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561166e575f6113bf6060890189615590565b8363ffffffff168181106113d5576113d56155d5565b90506020028101906113e791906155e9565b6113f090615699565b80515f81815260098901602052604090205491925090156114235760405162461bcd60e51b81526004016106c290615730565b84825f0151836020015184604001516040516020016114459493929190615778565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161149391906157c7565b602060405180830381855afa1580156114ae573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114d19190615335565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561155d5761155d6151f9565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516116109116866154c3565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611667906157d8565b90506113a3565b50600584018190555f61168086613253565b90505f6116908260400151613668565b9050806002856040516116a391906157c7565b602060405180830381855afa1580156116be573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906116e19190615335565b146117455760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106c2565b505050600a909201805460ff1916600117905550505050565b5f610cf66001600160401b03831664e8d4a510006157fa565b5f61178182612179565b6080015192915050565b5f80516020615ce38339815191525f6117a385612961565b5f86815260058401602052604090205460a08201519192506117d691600160b01b9091046001600160401b031690615450565b6001600160401b03168160c001516001600160401b0316101561180b5760405162461bcd60e51b81526004016106c290615470565b5f84156118235761181c8685612241565b905061183e565b505f8581526009830160205260409020546001600160401b03165b600483015460408301515f91600160401b90046001600160a01b03169063778c06b59061186a9061175e565b60a086015160c08701516040516001600160e01b031960e086901b16815261189e939291829189905f9081906004016152f7565b602060405180830381865afa1580156118b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dd9190615335565b90505f811161194c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e20604482015274696e656c6967626c6520666f72207265776172647360581b60648201526084016106c2565b5f8781526008850160205260408120805483929061196b9084906154c3565b909155505050505050505050565b611981612bdc565b5f80516020615ce38339815191525f61199984613253565b90505f806119aa836040015161342d565b50915091505f6119b983612179565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119f3576119f36151f9565b6004811115611a0457611a046151f9565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e09092019190915284015191925084811691161015611aa35760405162461bcd60e51b81526004016106c2906154d6565b826001600160401b03168160e001516001600160401b03161115611ad95760405162461bcd60e51b81526004016106c290615518565b600381516004811115611aee57611aee6151f9565b14611b425760405162461bcd60e51b815260206004820152603160248201525f80516020615d038339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106c2565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a0190925290912054611b7891906131da565b856007015f8881526020019081526020015f205f9055611ba38160200151610f49836060015161175e565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050611bf760015f80516020615d4383398151915255565b5050565b5f80516020615d238339815191525f611c1383613253565b90505f80611c2483604001516137d1565b9150915080611c865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106c2565b5f82815260078501602052604081208054611ca090615811565b9050118015611cd2575060015f83815260088601602052604090205460ff166005811115611cd057611cd06151f9565b145b611cee5760405162461bcd60e51b81526004016106c290615843565b5f8281526007850160205260408120611d0691614fa1565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ce383398151915293929190829060ff166004811115611e1457611e146151f9565b6004811115611e2557611e256151f9565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611eac57611eac6151f9565b1480611eca5750600381516004811115611ec857611ec86151f9565b145b611f1e5760405162461bcd60e51b815260206004820152603260248201525f80516020615d03833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106c2565b5f611f2c8260400151612179565b905080606001516001600160401b03165f03611fb05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106c2565b6005600160991b016001600160a01b031663ee5b48eb611fdd8460400151846060015185608001516126ed565b6040518263ffffffff1660e01b8152600401611ff9919061536e565b6020604051808303815f875af1158015612015573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4e9190615335565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615d2383398151915292919061208190615811565b90501180156120b3575060015f83815260088301602052604090205460ff1660058111156120b1576120b16151f9565b145b6120cf5760405162461bcd60e51b81526004016106c290615843565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612108919060040161588a565b6020604051808303815f875af1158015612124573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce19190615335565b5f612151612bdc565b61215c823334613972565b905061217460015f80516020615d4383398151915255565b919050565b612181614fd8565b5f8281525f80516020615d63833981519152602052604090819020815160e0810190925280545f80516020615d23833981519152929190829060ff1660058111156121ce576121ce6151f9565b60058111156121df576121df6151f9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561228c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b3919081019061591f565b91509150806123165760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106c2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612359573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237d9190615335565b8251146123e15760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106c2565b60208201516001600160a01b0316156124575760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106c2565b5f806124668460400151613ca6565b915091508187146124d35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106c2565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0960205260409020545f80516020615ce3833981519152906001600160401b03908116908316111561254d575f8881526009820160205260409020805467ffffffffffffffff19166001600160401b0384161790555b6040516001600160401b038316815288907fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d04359060200160405180910390a2509695505050505050565b5f8281525f80516020615d63833981519152602052604081206002015481905f80516020615d2383398151915290600160801b90046001600160401b03166125de8582613e7e565b5f6125e88761408c565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6126388a858b6126ed565b6040518263ffffffff1660e01b8152600401612654919061536e565b6020604051808303815f875af1158015612670573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126949190615335565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612766576127268160016159f1565b6127319060086157fa565b5081515f90839083908110612748576127486155d5565b60200101906001600160f81b03191690815f1a905350600101612712565b505f5b60048110156127d15761277d8160036159f1565b6127889060086157fa565b600263ffffffff16901c60f81b828260026127a391906154c3565b815181106127b3576127b36155d5565b60200101906001600160f81b03191690815f1a905350600101612769565b505f5b6020811015612833576127e881601f6159f1565b6127f39060086157fa565b86901c60f81b826128058360066154c3565b81518110612815576128156155d5565b60200101906001600160f81b03191690815f1a9053506001016127d4565b505f5b600881101561289e5761284a8160076159f1565b6128559060086157fa565b6001600160401b038616901c60f81b826128708360266154c3565b81518110612880576128806155d5565b60200101906001600160f81b03191690815f1a905350600101612836565b505f5b6008811015612909576128b58160076159f1565b6128c09060086157fa565b6001600160401b038516901c60f81b826128db83602e6154c3565b815181106128eb576128eb6155d5565b60200101906001600160f81b03191690815f1a9053506001016128a1565b50949350505050565b61291a61411c565b61292381614167565b50565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b612969614fd8565b5f8281525f80516020615d638339815191526020526040808220815160e0810190925280545f80516020615d2383398151915293929190829060ff1660058111156129b6576129b66151f9565b60058111156129c7576129c76151f9565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612a3957612a396151f9565b14612a955760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106c2565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff19166001836005811115612ad957612ad96151f9565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612b858582612596565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615d43833981519152805460011901612c0d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ce38339815191529061ffff861610801590612c5f575061271061ffff861611155b612c7b5760405162461bcd60e51b81526004016106c290615a04565b60028101546001600160401b039081169085161015612cf45760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106c2565b8054831015612d575760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106c2565b8060010154831115612dbe5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106c2565b825f612dc982610ce6565b90505f612dd689836141db565b90506040518060600160405280612dea3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615d4383398151915255565b5f612e99614fd8565b5f80516020615d238339815191525f612eb185613253565b90505f80612ec283604001516137d1565b915091508015612f275760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106c2565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612f5857612f586151f9565b6005811115612f6957612f696151f9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612fda57612fda6151f9565b1480612ff85750600182516005811115612ff657612ff66151f9565b145b6130575760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106c2565b60038251600581111561306c5761306c6151f9565b036130795750600461307d565b5060055b6020808301515f908152600988019091526040812055818160058111156130a6576130a66151f9565b908160058111156130b9576130b96151f9565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156130ed576130ed6151f9565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156131a1576131a16151f9565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015613226575f80fd5b505af1158015613238573d5f803e3d5ffd5b505050505050565b611bf76001600160a01b03831682614740565b60408051606080820183525f8083526020830181905292820152905f80516020615d238339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156132c8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526132ef919081019061591f565b915091508061334f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106c2565b82548251146133b25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106c2565b60208201516001600160a01b0316156134255760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106c2565b509392505050565b5f805f83516036146134515760405162461bcd60e51b81526004016106c290615a4f565b5f805b60028110156134a0576134688160016159f1565b6134739060086157fa565b61ffff16868281518110613489576134896155d5565b016020015160f81c901b9190911790600101613454565b5061ffff8116156134c35760405162461bcd60e51b81526004016106c290615a98565b5f805b600481101561351e576134da8160036159f1565b6134e59060086157fa565b63ffffffff16876134f78360026154c3565b81518110613507576135076155d5565b016020015160f81c901b91909117906001016134c6565b5063ffffffff81166004146135455760405162461bcd60e51b81526004016106c290615adb565b5f805b602081101561359a5761355c81601f6159f1565b6135679060086157fa565b886135738360066154c3565b81518110613583576135836155d5565b016020015160f81c901b9190911790600101613548565b505f805b60088110156135f9576135b28160076159f1565b6135bd9060086157fa565b6001600160401b0316896135d28360266154c3565b815181106135e2576135e26155d5565b016020015160f81c901b919091179060010161359e565b505f805b6008811015613658576136118160076159f1565b61361c9060086157fa565b6001600160401b03168a61363183602e6154c3565b81518110613641576136416155d5565b016020015160f81c901b91909117906001016135fd565b5091989097509095509350505050565b5f815160261461368a5760405162461bcd60e51b81526004016106c290615a4f565b5f805b60028110156136d9576136a18160016159f1565b6136ac9060086157fa565b61ffff168482815181106136c2576136c26155d5565b016020015160f81c901b919091179060010161368d565b5061ffff8116156136fc5760405162461bcd60e51b81526004016106c290615a98565b5f805b6004811015613757576137138160036159f1565b61371e9060086157fa565b63ffffffff16856137308360026154c3565b81518110613740576137406155d5565b016020015160f81c901b91909117906001016136ff565b5063ffffffff81161561377c5760405162461bcd60e51b81526004016106c290615adb565b5f805b60208110156129095761379381601f6159f1565b61379e9060086157fa565b866137aa8360066154c3565b815181106137ba576137ba6155d5565b016020015160f81c901b919091179060010161377f565b5f8082516027146137f45760405162461bcd60e51b81526004016106c290615a4f565b5f805b60028110156138435761380b8160016159f1565b6138169060086157fa565b61ffff1685828151811061382c5761382c6155d5565b016020015160f81c901b91909117906001016137f7565b5061ffff8116156138665760405162461bcd60e51b81526004016106c290615a98565b5f805b60048110156138c15761387d8160036159f1565b6138889060086157fa565b63ffffffff168661389a8360026154c3565b815181106138aa576138aa6155d5565b016020015160f81c901b9190911790600101613869565b5063ffffffff81166003146138e85760405162461bcd60e51b81526004016106c290615adb565b5f805b602081101561393d576138ff81601f6159f1565b61390a9060086157fa565b876139168360066154c3565b81518110613926576139266155d5565b016020015160f81c901b91909117906001016138eb565b505f86602681518110613952576139526155d5565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ce38339815191528161398b84610ce6565b90505f61399787612179565b90506139a287612926565b6139be5760405162461bcd60e51b81526004016106c2906153a0565b6002815160058111156139d3576139d36151f9565b146139f05760405162461bcd60e51b81526004016106c2906153e8565b5f828260800151613a019190615450565b60048501546040840151919250613a23916001600160401b0390911690615b22565b6001600160401b0316816001600160401b03161115613aa25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106c2565b5f80613aae8a84612596565b915091505f8a83604051602001613adc92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b7757613b776151f9565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613cc95760405162461bcd60e51b81526004016106c290615a4f565b5f805b6002811015613d1857613ce08160016159f1565b613ceb9060086157fa565b61ffff16858281518110613d0157613d016155d5565b016020015160f81c901b9190911790600101613ccc565b5061ffff811615613d3b5760405162461bcd60e51b81526004016106c290615a98565b5f805b6004811015613d9657613d528160036159f1565b613d5d9060086157fa565b63ffffffff1686613d6f8360026154c3565b81518110613d7f57613d7f6155d5565b016020015160f81c901b9190911790600101613d3e565b5063ffffffff8116600514613dbd5760405162461bcd60e51b81526004016106c290615adb565b5f805b6020811015613e1257613dd481601f6159f1565b613ddf9060086157fa565b87613deb8360066154c3565b81518110613dfb57613dfb6155d5565b016020015160f81c901b9190911790600101613dc0565b505f805b6008811015613e7157613e2a8160076159f1565b613e359060086157fa565b6001600160401b031688613e4a8360266154c3565b81518110613e5a57613e5a6155d5565b016020015160f81c901b9190911790600101613e16565b5090969095509350505050565b5f80516020615d238339815191525f6001600160401b038084169085161115613eb257613eab83856152d7565b9050613ebf565b613ebc84846152d7565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613f21575060028401548151613f1d916001600160401b0316906154c3565b8210155b15613f47576001600160401b038316606082015281815260408101516020820152613f66565b8281606001818151613f599190615450565b6001600160401b03169052505b6060810151613f76906064615b22565b602082015160028601546001600160401b039290921691613fa19190600160401b900460ff166157fa565b10156140055760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106c2565b856001600160401b03168160400181815161402091906154c3565b9052506040810180516001600160401b03871691906140409083906159f1565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d638339815191526020526040812060020180545f80516020615d2383398151915291600160401b9091046001600160401b03169060086140d683615b4d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661416557604051631afcd79f60e31b815260040160405180910390fd5b565b61416f61411c565b614178816147d3565b6141806147ec565b612923608082013560a083013561419d60e0850160c086016151e0565b6141ae610100860160e08701615b68565b61ffff166141c461012087016101008801615b81565b6141d661014088016101208901615575565b6147fc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142665760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106c2565b5f80516020615d238339815191524261428560408601602087016151e0565b6001600160401b0316116142f75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106c2565b61430760408501602086016151e0565b6001600160401b031661431d6202a300426154c3565b116143905760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106c2565b83356143e85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106c2565b83355f908152600982016020526040902054156144175760405162461bcd60e51b81526004016106c290615730565b60306144266040860186615ba1565b90501461448b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106c2565b614495835f613e7e565b5f8061452f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144da91906151e0565b6001600160401b031681526020016144f560408a018a615ba1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a40565b5f8281526007860160205260409020919350915061454d8282615c27565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061457a90859060040161536e565b6020604051808303815f875af1158015614596573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145ba9190615335565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614632576146326151f9565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614712918e01908e016151e0565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147635760405163cd78605960e01b81523060048201526024016106c2565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146147ac576040519150601f19603f3d011682016040523d82523d5f602084013e6147b1565b606091505b5050905080610ce157604051630a12f52160e11b815260040160405180910390fd5b6147db61411c565b6147e3614def565b61292381614df7565b6147f461411c565b614165614f99565b61480461411c565b5f80516020615ce3833981519152836148705760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106c2565b6127108411156148925760405162461bcd60e51b81526004016106c290615a04565b858711156148fa5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106c2565b5f8360ff16116149675760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106c2565b600a60ff841611156149d95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106c2565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614aaa5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106c2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614b2157614ae18160016159f1565b614aec9060086157fa565b5081515f90839083908110614b0357614b036155d5565b60200101906001600160f81b03191690815f1a905350600101614acd565b505f5b6004811015614b8957614b388160036159f1565b614b439060086157fa565b600160ff919091161c60f81b82614b5b8360026154c3565b81518110614b6b57614b6b6155d5565b60200101906001600160f81b03191690815f1a905350600101614b24565b505f5b6020811015614be65784518160208110614ba857614ba86155d5565b1a60f81b82614bb88360066154c3565b81518110614bc857614bc86155d5565b60200101906001600160f81b03191690815f1a905350600101614b8c565b505f5b6020811015614c465784602001518160208110614c0857614c086155d5565b1a60f81b82614c188360266154c3565b81518110614c2857614c286155d5565b60200101906001600160f81b03191690815f1a905350600101614be9565b505f5b6008811015614cba57614c5d8160076159f1565b614c689060086157fa565b60ff1685604001516001600160401b0316901c60f81b82826046614c8c91906154c3565b81518110614c9c57614c9c6155d5565b60200101906001600160f81b03191690815f1a905350600101614c49565b505f5b6030811015614d255784608001518181518110614cdc57614cdc6155d5565b01602001516001600160f81b03191682614cf783604e6154c3565b81518110614d0757614d076155d5565b60200101906001600160f81b03191690815f1a905350600101614cbd565b505f5b6008811015614d9757614d3c8160076159f1565b614d479060086157fa565b60608601516001600160401b0390811691161c60f81b82614d6983607e6154c3565b81518110614d7957614d796155d5565b60200101906001600160f81b03191690815f1a905350600101614d28565b50600281604051614da891906157c7565b602060405180830381855afa158015614dc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614de69190615335565b94909350915050565b61416561411c565b614dff61411c565b80355f80516020615d2383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e4b6080840160608501615b81565b60ff161115614eb85760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106c2565b5f614ec96080840160608501615b81565b60ff1611614f315760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106c2565b614f416080830160608401615b81565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f7260608301604084016151e0565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612e7d61411c565b508054614fad90615811565b5f825580601f10614fbc575050565b601f0160209004905f5260205f20908101906129239190615014565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615028575f8155600101615015565b5090565b8015158114612923575f80fd5b803563ffffffff81168114612174575f80fd5b5f805f6060848603121561505e575f80fd5b8335925060208401356150708161502c565b915061507e60408501615039565b90509250925092565b5f60208284031215615097575f80fd5b5035919050565b5f61014082840312156150af575f80fd5b50919050565b5f80604083850312156150c6575f80fd5b823591506150d660208401615039565b90509250929050565b803561ffff81168114612174575f80fd5b80356001600160401b0381168114612174575f80fd5b5f805f60608486031215615118575f80fd5b83356001600160401b0381111561512d575f80fd5b84016060818703121561513e575f80fd5b925061514c602085016150df565b915061507e604085016150f0565b5f6020828403121561516a575f80fd5b610eae82615039565b5f8060408385031215615184575f80fd5b61518d83615039565b946020939093013593505050565b5f80604083850312156151ac575f80fd5b82356001600160401b038111156151c1575f80fd5b8301608081860312156151d2575f80fd5b91506150d660208401615039565b5f602082840312156151f0575f80fd5b610eae826150f0565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061523057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161526b60608401826001600160401b03169052565b50608083015161528660808401826001600160401b03169052565b5060a08301516152a160a08401826001600160401b03169052565b5060c08301516152bc60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156152bc576152bc6152c3565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615345575f80fd5b5051919050565b5f5b8381101561536657818101518382015260200161534e565b50505f910152565b602081525f825180602084015261538c81604085016020870161534c565b601f01601f19169190910160400192915050565b60208082526028908201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660408201526730b634b230ba37b960c11b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6040820152686f742061637469766560b81b606082015260800190565b5f8261544b57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160401b038181168382160190808211156152bc576152bc6152c3565b60208082526033908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616040820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606082015260800190565b80820180821115610cf657610cf66152c3565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612923575f80fd5b5f60208284031215615585575f80fd5b8135610eae81615561565b5f808335601e198436030181126155a5575f80fd5b8301803591506001600160401b038211156155be575f80fd5b6020019150600581901b36038213156126e6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155fd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561563d5761563d615607565b60405290565b604051601f8201601f191681016001600160401b038111828210171561566b5761566b615607565b604052919050565b5f6001600160401b0382111561568b5761568b615607565b50601f01601f191660200190565b5f606082360312156156a9575f80fd5b6156b161561b565b8235815260206156c28185016150f0565b8183015260408401356001600160401b038111156156de575f80fd5b840136601f8201126156ee575f80fd5b80356157016156fc82615673565b615643565b8181523684838501011115615714575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615789818460208a0161534c565b80830190508581526001600160401b0360c01b8560c01b16602082015283516157b981602884016020880161534c565b016028019695505050505050565b5f82516155fd81846020870161534c565b5f63ffffffff8083168181036157f0576157f06152c3565b6001019392505050565b8082028115828204841417610cf657610cf66152c3565b600181811c9082168061582557607f821691505b6020821081036150af57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461589c81615811565b806020870152604060018084165f81146158bd57600181146158d957615906565b60ff19851660408a0152604084151560051b8a01019550615906565b895f5260205f205f5b858110156158fd5781548b82018601529083019088016158e2565b8a016040019650505b509398975050505050505050565b80516121748161502c565b5f8060408385031215615930575f80fd5b82516001600160401b0380821115615946575f80fd5b9084019060608287031215615959575f80fd5b61596161561b565b8251815260208084015161597481615561565b82820152604084015183811115615989575f80fd5b80850194505087601f85011261599d575f80fd5b835192506159ad6156fc84615673565b83815288828587010111156159c0575f80fd5b6159cf8483830184880161534c565b806040840152508195506159e4818801615914565b9450505050509250929050565b81810381811115610cf657610cf66152c3565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615b4557615b456152c3565b505092915050565b5f6001600160401b038083168181036157f0576157f06152c3565b5f60208284031215615b78575f80fd5b610eae826150df565b5f60208284031215615b91575f80fd5b813560ff81168114610eae575f80fd5b5f808335601e19843603018112615bb6575f80fd5b8301803591506001600160401b03821115615bcf575f80fd5b6020019150368190038213156126e6575f80fd5b601f821115610ce157805f5260205f20601f840160051c81016020851015615c085750805b601f840160051c820191505b81811015610f4e575f8155600101615c14565b81516001600160401b03811115615c4057615c40615607565b615c5481615c4e8454615811565b84615be3565b602080601f831160018114615c87575f8415615c705750858301515b5f19600386901b1c1916600185901b178555613238565b5f85815260208120601f198616915b82811015615cb557888601518255948401946001909101908401615c96565b5085821015615cd257878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -741,6 +741,27 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } +// ForceInitializeEndValidation is a paid mutator transaction binding the contract method 0x3a1cfff6. +// +// Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ForceInitializeEndValidation(opts *bind.TransactOpts, validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "forceInitializeEndValidation", validationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndValidation is a paid mutator transaction binding the contract method 0x3a1cfff6. +// +// Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ForceInitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ForceInitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndValidation is a paid mutator transaction binding the contract method 0x3a1cfff6. +// +// Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ForceInitializeEndValidation(validationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ForceInitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) +} + // Initialize is a paid mutator transaction binding the contract method 0x1f7a9d8f. // // Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() @@ -930,6 +951,27 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Re return _NativeTokenStakingManager.Contract.ResendUpdateDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID) } +// SubmitUptimeProof is a paid mutator transaction binding the contract method 0x25e1c776. +// +// Solidity: function submitUptimeProof(bytes32 validationID, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) SubmitUptimeProof(opts *bind.TransactOpts, validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "submitUptimeProof", validationID, messageIndex) +} + +// SubmitUptimeProof is a paid mutator transaction binding the contract method 0x25e1c776. +// +// Solidity: function submitUptimeProof(bytes32 validationID, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) SubmitUptimeProof(validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.SubmitUptimeProof(&_NativeTokenStakingManager.TransactOpts, validationID, messageIndex) +} + +// SubmitUptimeProof is a paid mutator transaction binding the contract method 0x25e1c776. +// +// Solidity: function submitUptimeProof(bytes32 validationID, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) SubmitUptimeProof(validationID [32]byte, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.SubmitUptimeProof(&_NativeTokenStakingManager.TransactOpts, validationID, messageIndex) +} + // NativeTokenStakingManagerDelegationEndedIterator is returned from FilterDelegationEnded and is used to iterate over the raw logs and unpacked data for DelegationEnded events raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerDelegationEndedIterator struct { Event *NativeTokenStakingManagerDelegationEnded // Event containing the contract specifics and raw log @@ -1863,6 +1905,151 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseInitia return event, nil } +// NativeTokenStakingManagerUptimeUpdatedIterator is returned from FilterUptimeUpdated and is used to iterate over the raw logs and unpacked data for UptimeUpdated events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerUptimeUpdatedIterator struct { + Event *NativeTokenStakingManagerUptimeUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerUptimeUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerUptimeUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerUptimeUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerUptimeUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerUptimeUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerUptimeUpdated represents a UptimeUpdated event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerUptimeUpdated struct { + ValidationID [32]byte + Uptime uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUptimeUpdated is a free log retrieval operation binding the contract event 0xec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435. +// +// Solidity: event UptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterUptimeUpdated(opts *bind.FilterOpts, validationID [][32]byte) (*NativeTokenStakingManagerUptimeUpdatedIterator, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "UptimeUpdated", validationIDRule) + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerUptimeUpdatedIterator{contract: _NativeTokenStakingManager.contract, event: "UptimeUpdated", logs: logs, sub: sub}, nil +} + +// WatchUptimeUpdated is a free log subscription operation binding the contract event 0xec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435. +// +// Solidity: event UptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchUptimeUpdated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerUptimeUpdated, validationID [][32]byte) (event.Subscription, error) { + + var validationIDRule []interface{} + for _, validationIDItem := range validationID { + validationIDRule = append(validationIDRule, validationIDItem) + } + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "UptimeUpdated", validationIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerUptimeUpdated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "UptimeUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseUptimeUpdated is a log parse operation binding the contract event 0xec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435. +// +// Solidity: event UptimeUpdated(bytes32 indexed validationID, uint64 uptime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseUptimeUpdated(log types.Log) (*NativeTokenStakingManagerUptimeUpdated, error) { + event := new(NativeTokenStakingManagerUptimeUpdated) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "UptimeUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // NativeTokenStakingManagerValidationPeriodCreatedIterator is returned from FilterValidationPeriodCreated and is used to iterate over the raw logs and unpacked data for ValidationPeriodCreated events raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerValidationPeriodCreatedIterator struct { Event *NativeTokenStakingManagerValidationPeriodCreated // Event containing the contract specifics and raw log diff --git a/contracts/validatorManager/PoSValidatorManager.sol b/contracts/validatorManager/PoSValidatorManager.sol index cd7f1fdeb..b9346aedd 100644 --- a/contracts/validatorManager/PoSValidatorManager.sol +++ b/contracts/validatorManager/PoSValidatorManager.sol @@ -60,8 +60,8 @@ abstract contract PoSValidatorManager is mapping(bytes32 delegationID => uint256) _redeemableDelegatorRewards; /// @notice Maps the validator owner address to its pending staking rewards. mapping(bytes32 validationID => uint256) _redeemableValidatorRewards; - /// @notice Saves the uptime of a pending completed or completed validation period so that delegators can collect rewards. - mapping(bytes32 validationID => uint64) _completedValidationUptimeSeconds; + /// @notice Saves the largest known uptime of an active, pending completed, or completed validation period so that delegators can collect rewards. + mapping(bytes32 validationID => uint64) _validationUptimeSeconds; } // solhint-enable private-vars-leading-underscore @@ -136,8 +136,20 @@ abstract contract PoSValidatorManager is $._rewardCalculator = rewardCalculator; } + function submitUptimeProof(bytes32 validationID, uint32 messageIndex) external { + require(_isPoSValidator(validationID), "PoSValidatorManager: not a PoS validator"); + require( + getValidator(validationID).status == ValidatorStatus.Active, + "PoSValidatorManager: validator not active" + ); + + // Uptime proofs include the absolute number of seconds the validator has been active. + _updateUptime(validationID, messageIndex); + } + function initializeEndValidation( bytes32 validationID, + bool includeUptimeProof, uint32 messageIndex ) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); @@ -152,9 +164,12 @@ abstract contract PoSValidatorManager is ); // Uptime proofs include the absolute number of seconds the validator has been active. - uint64 uptimeSeconds = _getUptime(validationID, messageIndex); - // Save this value for use by this validator's delegators. - $._completedValidationUptimeSeconds[validationID] = uptimeSeconds; + uint64 uptimeSeconds; + if (includeUptimeProof) { + uptimeSeconds = _updateUptime(validationID, messageIndex); + } else { + uptimeSeconds = $._validationUptimeSeconds[validationID]; + } uint256 reward = $._rewardCalculator.calculateReward({ stakeAmount: weightToValue(validator.startingWeight), @@ -171,6 +186,7 @@ abstract contract PoSValidatorManager is function forceInitializeEndValidation( bytes32 validationID, + bool includeUptimeProof, uint32 messageIndex ) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); @@ -185,9 +201,12 @@ abstract contract PoSValidatorManager is ); // Uptime proofs include the absolute number of seconds the validator has been active. - uint64 uptimeSeconds = _getUptime(validationID, messageIndex); - // Save this value for use by this validator's delegators. - $._completedValidationUptimeSeconds[validationID] = uptimeSeconds; + uint64 uptimeSeconds; + if (includeUptimeProof) { + uptimeSeconds = _updateUptime(validationID, messageIndex); + } else { + uptimeSeconds = $._validationUptimeSeconds[validationID]; + } $._redeemableValidatorRewards[validationID] += $._rewardCalculator.calculateReward({ stakeAmount: weightToValue(validator.startingWeight), @@ -221,7 +240,9 @@ abstract contract PoSValidatorManager is _unlock(owner, weightToValue(validator.startingWeight)); } - function _getUptime(bytes32 validationID, uint32 messageIndex) internal view returns (uint64) { + // 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); require(valid, "PoSValidatorManager: invalid warp message"); @@ -241,6 +262,13 @@ abstract contract PoSValidatorManager is validationID == uptimeValidationID, "PoSValidatorManager: invalid uptime validation ID" ); + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + if (uptime > $._validationUptimeSeconds[validationID]) { + $._validationUptimeSeconds[validationID] = uptime; + } + + emit UptimeUpdated(validationID, uptime); + return uptime; } @@ -415,7 +443,7 @@ abstract contract PoSValidatorManager is if (validator.status == ValidatorStatus.Active) { if (includeUptimeProof) { // Uptime proofs include the absolute number of seconds the validator has been active. - validatorUptimeSeconds = _getUptime(validationID, messageIndex); + validatorUptimeSeconds = _updateUptime(validationID, messageIndex); } uint64 newValidatorWeight = validator.weight - delegator.weight; (delegator.endingNonce,) = _setValidatorWeight(validationID, newValidatorWeight); @@ -425,7 +453,7 @@ abstract contract PoSValidatorManager is // If the validation period has already ended, we have saved the uptime. // Further, it is impossible to retrieve an uptime proof for an already ended validation, // so there's no need to check any uptime proof provided in this function call. - validatorUptimeSeconds = $._completedValidationUptimeSeconds[validationID]; + validatorUptimeSeconds = $._validationUptimeSeconds[validationID]; delegator.endingNonce = validator.messageNonce; delegator.endedAt = validator.endedAt; diff --git a/contracts/validatorManager/interfaces/IPoSValidatorManager.sol b/contracts/validatorManager/interfaces/IPoSValidatorManager.sol index ba02690b3..0a56bbf35 100644 --- a/contracts/validatorManager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validatorManager/interfaces/IPoSValidatorManager.sol @@ -98,30 +98,53 @@ interface IPoSValidatorManager is IValidatorManager { bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce ); + /** + * @notice Event emitted when the uptime of a validator is updated. Only emitted when the uptime is greater than the stored uptime. + * @param validationID The ID of the validation period + * @param uptime The updated uptime of the validator + */ + event UptimeUpdated(bytes32 indexed validationID, uint64 uptime); + + /** + * @notice Updates the uptime of the validationID if the submitted proof is greated than the stored uptime. + * Anybody may call this function to ensure the stored uptime is accurate. Callable only when the validation period is active. + * @param validationID The ID of the validation period + * @param messageIndex The index of the Warp message to be received providing the uptime proof + */ + function submitUptimeProof(bytes32 validationID, uint32 messageIndex) external; + /** * @notice Begins the process of ending an active validation period, and reverts if the validation period is not eligible * 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. + * 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. Reverts if the uptime * is not eligible for rewards. */ function initializeEndValidation( bytes32 validationID, + bool includeUptimeProof, uint32 messageIndex ) external; /** - * @notice Begins the process of ending an active validation period, but does not revert if the provided uptime proof - * is not sufficient to collect uptime-based rewards. This function is used to exit the validator set when rewards are + * @notice Begins the process of ending an active validation period, but does not revert if the latest known uptime + * is not sufficient to collect uptime-based rewards. This function is used to exit the validator set when rewards are * not 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. + * 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, * @param messageIndex The index of the Warp message to be received providing the uptime proof. */ - function forceInitializeEndValidation(bytes32 validationID, uint32 messageIndex) external; + function forceInitializeEndValidation( + bytes32 validationID, + bool includeUptimeProof, + uint32 messageIndex + ) external; /** * @notice Completes the delegator registration process by returning an acknowledgement of the registration of a diff --git a/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol b/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol index ac924187d..38b9fe90e 100644 --- a/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol @@ -57,7 +57,7 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { return app.initializeValidatorRegistration(input, weight); } - function _initializeEndValidation(bytes32 validationID) internal virtual override { + function _initializeEndValidation(bytes32 validationID, bool) internal virtual override { return app.initializeEndValidation(validationID); } diff --git a/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol b/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol index 6d1e640b5..9c9cc8bd8 100644 --- a/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol @@ -163,7 +163,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); vm.expectRevert(_formatErrorMessage("minimum stake duration not met")); - posValidatorManager.initializeEndValidation(validationID, 0); + posValidatorManager.initializeEndValidation(validationID, false, 0); } function testInvalidUptimeWarpMessage() public { @@ -178,7 +178,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(new bytes(0), false); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid warp message")); - posValidatorManager.initializeEndValidation(validationID, 0); + posValidatorManager.initializeEndValidation(validationID, true, 0); } function testInvalidUptimeChainID() public { @@ -195,7 +195,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetBlockchainID(); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid source chain ID")); - posValidatorManager.initializeEndValidation(validationID, 0); + posValidatorManager.initializeEndValidation(validationID, true, 0); } function testInvalidUptimeSenderAddress() public { @@ -227,7 +227,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid origin sender address")); - posValidatorManager.initializeEndValidation(validationID, 0); + posValidatorManager.initializeEndValidation(validationID, true, 0); } function testInvalidUptimeValidationID() public { @@ -259,7 +259,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid uptime validation ID")); - posValidatorManager.initializeEndValidation(validationID, 0); + posValidatorManager.initializeEndValidation(validationID, true, 0); } function testInitializeDelegatorRegistration() public { @@ -496,7 +496,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true }); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); @@ -731,7 +732,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true }); uint256 expectedReward = rewardCalculator.calculateReward({ @@ -760,10 +762,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true }); } + // TODONOW: implement these + function testInitializeEndValidationUseStoredUptime() public {} + + function testInitializeEndValidationInsufficientUptime() public {} + + function testForceInitializeEndValidation() public {} + + function testForceInitializeEndValidationInsufficientUptime() public {} + function testValueToWeight() public view { uint64 w1 = posValidatorManager.valueToWeight(1e12); uint64 w2 = posValidatorManager.valueToWeight(1e18); @@ -792,9 +804,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ) internal virtual returns (bytes32); function _initializeEndValidation( - bytes32 validationID + bytes32 validationID, + bool includeUptime ) internal virtual override { - return posValidatorManager.initializeEndValidation(validationID, 0); + return posValidatorManager.initializeEndValidation(validationID, includeUptime, 0); } function _initializeDelegatorRegistration( diff --git a/contracts/validatorManager/tests/ValidatorManagerTests.t.sol b/contracts/validatorManager/tests/ValidatorManagerTests.t.sol index ff76f6801..f7ea676f5 100644 --- a/contracts/validatorManager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validatorManager/tests/ValidatorManagerTests.t.sol @@ -261,7 +261,7 @@ abstract contract ValidatorManagerTest is Test { // Second call should fail vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); - _initializeEndValidation(validationID); + _initializeEndValidation(validationID, false); } function _newNodeID() internal returns (bytes32) { @@ -343,6 +343,28 @@ abstract contract ValidatorManagerTest is Test { bytes memory blsPublicKey, uint64 registrationTimestamp, uint64 completionTimestamp + ) internal returns (bytes32 validationID) { + return _setUpInitializeEndValidation({ + nodeID: nodeID, + subnetID: subnetID, + weight: weight, + registrationExpiry: registrationExpiry, + blsPublicKey: blsPublicKey, + registrationTimestamp: registrationTimestamp, + completionTimestamp: completionTimestamp, + includeUptime: false + }); + } + + function _setUpInitializeEndValidation( + bytes32 nodeID, + bytes32 subnetID, + uint64 weight, + uint64 registrationExpiry, + bytes memory blsPublicKey, + uint64 registrationTimestamp, + uint64 completionTimestamp, + bool includeUptime ) internal returns (bytes32 validationID) { validationID = _setUpCompleteValidatorRegistration({ nodeID: nodeID, @@ -357,16 +379,18 @@ abstract contract ValidatorManagerTest is Test { bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, completionTimestamp - registrationTimestamp - ); - _mockGetVerifiedWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); - + if (includeUptime) { + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, completionTimestamp - registrationTimestamp + ); + _mockGetVerifiedWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); + } + vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); - _initializeEndValidation(validationID); + _initializeEndValidation(validationID, includeUptime); } function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { @@ -424,7 +448,7 @@ abstract contract ValidatorManagerTest is Test { uint64 weight ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID) internal virtual; + function _initializeEndValidation(bytes32 validationID, bool includeUptime) internal virtual; function _beforeSend(uint256 amount, address spender) internal virtual; From 00504cb1f8cbe614728c442c038df14686e3b6db Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 19 Sep 2024 08:10:44 -0500 Subject: [PATCH 354/545] return stored uptime if greater than arg --- contracts/validatorManager/PoSValidatorManager.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/validatorManager/PoSValidatorManager.sol b/contracts/validatorManager/PoSValidatorManager.sol index b9346aedd..69e5d7804 100644 --- a/contracts/validatorManager/PoSValidatorManager.sol +++ b/contracts/validatorManager/PoSValidatorManager.sol @@ -265,6 +265,8 @@ abstract contract PoSValidatorManager is PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); if (uptime > $._validationUptimeSeconds[validationID]) { $._validationUptimeSeconds[validationID] = uptime; + } else { + uptime = $._validationUptimeSeconds[validationID]; } emit UptimeUpdated(validationID, uptime); From e17bb7f31d096bdc19f441d0e08f2233eaa67974 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 19 Sep 2024 08:11:00 -0500 Subject: [PATCH 355/545] uptime unit tests --- .../tests/PoAValidatorManagerTests.t.sol | 2 +- .../tests/PoSValidatorManagerTests.t.sol | 135 ++++++++++++++++-- .../tests/ValidatorManagerTests.t.sol | 42 ++---- 3 files changed, 140 insertions(+), 39 deletions(-) diff --git a/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol b/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol index 38b9fe90e..07df6e425 100644 --- a/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/validatorManager/tests/PoAValidatorManagerTests.t.sol @@ -57,7 +57,7 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { return app.initializeValidatorRegistration(input, weight); } - function _initializeEndValidation(bytes32 validationID, bool) internal virtual override { + function _initializeEndValidation(bytes32 validationID, bool, bool) internal virtual override { return app.initializeEndValidation(validationID); } diff --git a/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol b/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol index 9c9cc8bd8..88285fda4 100644 --- a/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol @@ -73,6 +73,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce ); + event UptimeUpdated(bytes32 indexed validationID, uint64 uptime); + function testDelegationFeeBipsTooLow() public { // ValidatorRegistrationInput calldata registrationInput, // uint16 delegationFeeBips, @@ -497,7 +499,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - includeUptime: true + includeUptime: true, + force: false }); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); @@ -733,7 +736,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - includeUptime: true + includeUptime: true, + force: false }); uint256 expectedReward = rewardCalculator.calculateReward({ @@ -763,18 +767,124 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, - includeUptime: true + includeUptime: true, + force: false }); } - // TODONOW: implement these - function testInitializeEndValidationUseStoredUptime() public {} + function testInitializeEndValidationUseStoredUptime() public { + + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); + bytes memory setValidatorWeightPayload = + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - function testInitializeEndValidationInsufficientUptime() public {} + // Submit an uptime proof via submitUptime + uint64 uptimePercentage1 = 80; + uint64 uptime1 = (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage1 / 100; + bytes memory uptimeMsg1 = ValidatorMessages.packValidationUptimeMessage( + validationID, uptime1 + ); + _mockGetVerifiedWarpMessage(uptimeMsg1, true); + _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); + + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit UptimeUpdated(validationID, uptime1); + posValidatorManager.submitUptimeProof(validationID, 0); - function testForceInitializeEndValidation() public {} + // Submit a second uptime proof via initializeEndValidation. This one is not sufficient for rewards + // Submit an uptime proof via submitUptime + uint64 uptimePercentage2 = 79; + uint64 uptime2 = (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage2 / 100; + bytes memory uptimeMsg2 = ValidatorMessages.packValidationUptimeMessage( + validationID, uptime2 + ); + _mockGetVerifiedWarpMessage(uptimeMsg2, true); + _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); - function testForceInitializeEndValidationInsufficientUptime() public {} + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit ValidatorRemovalInitialized(validationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP); + + _initializeEndValidation(validationID, true, false); + } + + function testInitializeEndValidationInsufficientUptime() public { + uint64 uptimePercentage = 79; + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); + bytes memory setValidatorWeightPayload = + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + ); + _mockGetVerifiedWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); + + vm.expectRevert("PoSValidatorManager: validation ineligble for rewards"); + + _initializeEndValidation(validationID, true, false); + } + + function testForceInitializeEndValidation() public { + _setUpInitializeEndValidation({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: true, + force: true + }); + } + + function testForceInitializeEndValidationInsufficientUptime() public { + uint64 uptimePercentage = 79; + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); + bytes memory setValidatorWeightPayload = + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + ); + _mockGetVerifiedWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); + + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit ValidatorRemovalInitialized(validationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP); + + _initializeEndValidation(validationID, true, true); + } function testValueToWeight() public view { uint64 w1 = posValidatorManager.valueToWeight(1e12); @@ -805,9 +915,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _initializeEndValidation( bytes32 validationID, - bool includeUptime + bool includeUptime, + bool force ) internal virtual override { - return posValidatorManager.initializeEndValidation(validationID, includeUptime, 0); + if (force) { + posValidatorManager.forceInitializeEndValidation(validationID, includeUptime, 0); + } else { + posValidatorManager.initializeEndValidation(validationID, includeUptime, 0); + } } function _initializeDelegatorRegistration( diff --git a/contracts/validatorManager/tests/ValidatorManagerTests.t.sol b/contracts/validatorManager/tests/ValidatorManagerTests.t.sol index f7ea676f5..d46a2c4ec 100644 --- a/contracts/validatorManager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validatorManager/tests/ValidatorManagerTests.t.sol @@ -145,7 +145,9 @@ abstract contract ValidatorManagerTest is Test { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: false, + force: false }); } @@ -157,7 +159,9 @@ abstract contract ValidatorManagerTest is Test { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: false, + force: false }); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); @@ -173,7 +177,9 @@ abstract contract ValidatorManagerTest is Test { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + includeUptime: false, + force: false }); bytes memory subnetValidatorRegistrationMessage = ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); @@ -261,7 +267,7 @@ abstract contract ValidatorManagerTest is Test { // Second call should fail vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); - _initializeEndValidation(validationID, false); + _initializeEndValidation(validationID, false, false); } function _newNodeID() internal returns (bytes32) { @@ -335,27 +341,6 @@ abstract contract ValidatorManagerTest is Test { validatorManager.completeValidatorRegistration(0); } - function _setUpInitializeEndValidation( - bytes32 nodeID, - bytes32 subnetID, - uint64 weight, - uint64 registrationExpiry, - bytes memory blsPublicKey, - uint64 registrationTimestamp, - uint64 completionTimestamp - ) internal returns (bytes32 validationID) { - return _setUpInitializeEndValidation({ - nodeID: nodeID, - subnetID: subnetID, - weight: weight, - registrationExpiry: registrationExpiry, - blsPublicKey: blsPublicKey, - registrationTimestamp: registrationTimestamp, - completionTimestamp: completionTimestamp, - includeUptime: false - }); - } - function _setUpInitializeEndValidation( bytes32 nodeID, bytes32 subnetID, @@ -364,7 +349,8 @@ abstract contract ValidatorManagerTest is Test { bytes memory blsPublicKey, uint64 registrationTimestamp, uint64 completionTimestamp, - bool includeUptime + bool includeUptime, + bool force ) internal returns (bytes32 validationID) { validationID = _setUpCompleteValidatorRegistration({ nodeID: nodeID, @@ -390,7 +376,7 @@ abstract contract ValidatorManagerTest is Test { vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); - _initializeEndValidation(validationID, includeUptime); + _initializeEndValidation(validationID, includeUptime, force); } function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { @@ -448,7 +434,7 @@ abstract contract ValidatorManagerTest is Test { uint64 weight ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID, bool includeUptime) internal virtual; + function _initializeEndValidation(bytes32 validationID, bool includeUptime, bool force) internal virtual; function _beforeSend(uint256 amount, address spender) internal virtual; From 5a288d53690f85f72fd8e8cd2dd5daba9cfd915c Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 19 Sep 2024 08:43:04 -0500 Subject: [PATCH 356/545] lint --- .../tests/PoSValidatorManagerTests.t.sol | 41 +++++++++++-------- .../tests/ValidatorManagerTests.t.sol | 6 ++- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol b/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol index 88285fda4..3b51420b4 100644 --- a/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validatorManager/tests/PoSValidatorManagerTests.t.sol @@ -773,7 +773,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInitializeEndValidationUseStoredUptime() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, @@ -790,10 +789,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Submit an uptime proof via submitUptime uint64 uptimePercentage1 = 80; - uint64 uptime1 = (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage1 / 100; - bytes memory uptimeMsg1 = ValidatorMessages.packValidationUptimeMessage( - validationID, uptime1 - ); + uint64 uptime1 = (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) + * uptimePercentage1 / 100; + bytes memory uptimeMsg1 = + ValidatorMessages.packValidationUptimeMessage(validationID, uptime1); _mockGetVerifiedWarpMessage(uptimeMsg1, true); _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); @@ -804,16 +803,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Submit a second uptime proof via initializeEndValidation. This one is not sufficient for rewards // Submit an uptime proof via submitUptime uint64 uptimePercentage2 = 79; - uint64 uptime2 = (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage2 / 100; - bytes memory uptimeMsg2 = ValidatorMessages.packValidationUptimeMessage( - validationID, uptime2 - ); + uint64 uptime2 = (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) + * uptimePercentage2 / 100; + bytes memory uptimeMsg2 = + ValidatorMessages.packValidationUptimeMessage(validationID, uptime2); _mockGetVerifiedWarpMessage(uptimeMsg2, true); _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); - vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidatorRemovalInitialized(validationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP); - + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit ValidatorRemovalInitialized( + validationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP + ); + _initializeEndValidation(validationID, true, false); } @@ -834,13 +835,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + validationID, + (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); _mockGetVerifiedWarpMessage(uptimeMsg, true); _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); vm.expectRevert("PoSValidatorManager: validation ineligble for rewards"); - + _initializeEndValidation(validationID, true, false); } @@ -873,15 +875,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 + validationID, + (DEFAULT_COMPLETION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP) * uptimePercentage / 100 ); _mockGetVerifiedWarpMessage(uptimeMsg, true); _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); - + vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidatorRemovalInitialized(validationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP); + emit ValidatorRemovalInitialized( + validationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP + ); _initializeEndValidation(validationID, true, true); } diff --git a/contracts/validatorManager/tests/ValidatorManagerTests.t.sol b/contracts/validatorManager/tests/ValidatorManagerTests.t.sol index d46a2c4ec..77115677f 100644 --- a/contracts/validatorManager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validatorManager/tests/ValidatorManagerTests.t.sol @@ -434,7 +434,11 @@ abstract contract ValidatorManagerTest is Test { uint64 weight ) internal virtual returns (bytes32); - function _initializeEndValidation(bytes32 validationID, bool includeUptime, bool force) internal virtual; + function _initializeEndValidation( + bytes32 validationID, + bool includeUptime, + bool force + ) internal virtual; function _beforeSend(uint256 amount, address spender) internal virtual; From 40872979c879cde87815e7f29f72c9e064bdbda1 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 19 Sep 2024 08:43:17 -0500 Subject: [PATCH 357/545] update abi bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 901cd5bac..c6ad95f42 100644 --- a/abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validatorManager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161622138038061622183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6160d48061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c806362065856116100f3578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103d4578063d5f20ff6146103dc578063df93d8de146103fc578063eb0acb8914610406575f80fd5b8063b771b3bc14610388578063ba3a4b97146103ae578063bee0a03f146103c1575f80fd5b80638280a25a116100ce5780638280a25a1461034757806398f3e2b41461034f5780639e1bc4ef14610362578063a3a65e4814610375575f80fd5b8063620658561461030e57806366435abf1461032157806376f7862114610334575f80fd5b8063330a0a3a1161015e578063467ef06f11610139578063467ef06f146102b85780635297fae6146102cb57806360305d62146102de57806361e2f490146102fb575f80fd5b8063330a0a3a1461027657806335455ded146102895780633a1cfff6146102a5575f80fd5b80630118acc4146101a55780630322ed98146101ba5780630cdd0985146101cd578063151d30d11461021e57806325e1c776146102385780632e2194d81461024b575b5f80fd5b6101b86101b33660046152f4565b610419565b005b6101b86101c836600461532f565b61088e565b61020b6101db36600461532f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610226600a81565b60405160ff9091168152602001610215565b6101b8610246366004615346565b610a47565b61025e61025936600461532f565b610ab5565b6040516001600160401b039091168152602001610215565b6101b8610284366004615384565b610acb565b61029261271081565b60405161ffff9091168152602001610215565b6101b86102b33660046152f4565b610baa565b6101b86102c63660046153c2565b610d2f565b6101b86102d93660046153db565b610dcf565b6102e6601481565b60405163ffffffff9091168152602001610215565b6101b8610309366004615403565b610fa4565b61020b61031c36600461545e565b6115d8565b61025e61032f36600461532f565b6115f1565b6101b86103423660046152f4565b611605565b610226603081565b6101b861035d3660046153db565b6117f3565b61020b610370366004615477565b611a75565b6101b86103833660046153c2565b611aa1565b6103966005600160991b0181565b6040516001600160a01b039091168152602001610215565b6101b86103bc36600461532f565b611c59565b6101b86103cf36600461532f565b611edf565b610226601481565b6103ef6103ea36600461532f565b611fee565b60405161021591906154ab565b61025e6202a30081565b61020b610414366004615572565b6120b6565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020616028833981519152949193919290829060ff16600481111561048157610481615497565b600481111561049257610492615497565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61050e83611fee565b905060028251600481111561052557610525615497565b146105775760405162461bcd60e51b815260206004820152602a60248201525f805160206160488339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105dc5760405162461bcd60e51b815260206004820152603360248201525f805160206160488339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161056e565b6003825280515f9060029060058111156105f8576105f8615497565b0361064f5786156106105761060d84876120eb565b90505b5f8360600151836080015161062591906155eb565b90506106318582612440565b506001600160401b0390811660e0860152421660a085015250610683565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106b685606001516115d8565b8460a0015186608001518760a00151865f806040518863ffffffff1660e01b81526004016106ea979695949392919061560b565b602060405180830381865afa158015610705573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107299190615649565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561076857610768615497565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206160a88339815191526020526040808220815160e0810190925280545f8051602061606883398151915293929190829060ff1660058111156108db576108db615497565b60058111156108ec576108ec615497565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095b5761095b615497565b146109c05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161056e565b6005600160991b016001600160a01b031663ee5b48eb6109e58584606001515f612597565b6040518263ffffffff1660e01b8152600401610a019190615682565b6020604051808303815f875af1158015610a1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a419190615649565b50505050565b610a50826127be565b610a6c5760405162461bcd60e51b815260040161056e906156b4565b6002610a7783611fee565b516005811115610a8957610a89615497565b14610aa65760405162461bcd60e51b815260040161056e906156fc565b610ab082826120eb565b505050565b5f610ac564e8d4a5100083615745565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b14575080546001600160401b03808416911610155b15610b325760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b5d84846127f9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206160288339815191525f610bc285612813565b5f86815260058401602052604090205460a0820151919250610bf591600160b01b9091046001600160401b031690615764565b6001600160401b03168160c001516001600160401b03161015610c2a5760405162461bcd60e51b815260040161056e90615784565b5f8415610c4257610c3b86856120eb565b9050610c5d565b505f8581526009830160205260409020546001600160401b03165b8260040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5610c9084604001516115d8565b60a085015160c08601516040516001600160e01b031960e086901b168152610cc4939291829188905f90819060040161560b565b602060405180830381865afa158015610cdf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d039190615649565b5f87815260088501602052604081208054909190610d229084906157d7565b9091555050505050505050565b5f805160206160288339815191525f80610d4884612a8e565b91509150610d55826127be565b610d5f5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d8d57610d8d615497565b03610db2575f83815260088501602052604081208054919055610db08282612dd8565b505b610dc881610dc384604001516115d8565b612e4e565b5050505050565b5f805160206160288339815191525f610de784612e71565b90505f80610df8836040015161304b565b50915091505f610e0783611fee565b9050816001600160401b031681606001516001600160401b03161015610e3f5760405162461bcd60e51b815260040161056e906157ea565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e845760405162461bcd60e51b815260040161056e9061582c565b60015f87815260068701602052604090205460ff166004811115610eaa57610eaa615497565b14610f135760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161056e565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206160688339815191529060ff16156110415760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161056e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611084573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a89190615649565b83602001351461110a5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161056e565b3061111b6060850160408601615875565b6001600160a01b03161461118d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161056e565b5f61119b6060850185615890565b91505f90508435602086013560146111b96060890160408a01615875565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156114e8575f6112396060890189615890565b8363ffffffff1681811061124f5761124f6158d5565b905060200281019061126191906158e9565b61126a90615999565b80515f818152600989016020526040902054919250901561129d5760405162461bcd60e51b815260040161056e90615a30565b84825f0151836020015184604001516040516020016112bf9493929190615a78565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161130d9190615ac7565b602060405180830381855afa158015611328573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061134b9190615649565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113d7576113d7615497565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161148a9116866157d7565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114e190615ad8565b905061121d565b50600584018190555f6114fa86612e71565b90505f61150a8260400151613286565b90508060028560405161151d9190615ac7565b602060405180830381855afa158015611538573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061155b9190615649565b146115bf5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161056e565b505050600a909201805460ff1916600117905550505050565b5f610ac56001600160401b03831664e8d4a51000615afa565b5f6115fb82611fee565b6080015192915050565b5f805160206160288339815191525f61161d85612813565b5f86815260058401602052604090205460a082015191925061165091600160b01b9091046001600160401b031690615764565b6001600160401b03168160c001516001600160401b031610156116855760405162461bcd60e51b815260040161056e90615784565b5f841561169d5761169686856120eb565b90506116b8565b505f8581526009830160205260409020546001600160401b03165b600483015460408301515f91600160401b90046001600160a01b03169063778c06b5906116e4906115d8565b60a086015160c08701516040516001600160e01b031960e086901b168152611718939291829189905f90819060040161560b565b602060405180830381865afa158015611733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117579190615649565b90505f81116117c65760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e20604482015274696e656c6967626c6520666f72207265776172647360581b606482015260840161056e565b5f878152600885016020526040812080548392906117e59084906157d7565b909155505050505050505050565b6117fb6133f8565b5f805160206160288339815191525f61181384612e71565b90505f80611824836040015161304b565b50915091505f61183383611fee565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561186d5761186d615497565b600481111561187e5761187e615497565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561191d5760405162461bcd60e51b815260040161056e906157ea565b826001600160401b03168160e001516001600160401b031611156119535760405162461bcd60e51b815260040161056e9061582c565b60038151600481111561196857611968615497565b146119bc5760405162461bcd60e51b815260206004820152603160248201525f805160206160488339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161056e565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a01909252909120546119f29190612dd8565b856007015f8881526020019081526020015f205f9055611a1d8160200151610dc383606001516115d8565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050611a7160015f8051602061608883398151915255565b5050565b5f611a7e6133f8565b611a89833384613442565b9050610ac560015f8051602061608883398151915255565b5f805160206160688339815191525f611ab983612e71565b90505f80611aca8360400151613779565b9150915080611b2c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161056e565b5f82815260078501602052604081208054611b4690615b11565b9050118015611b78575060015f83815260088601602052604090205460ff166005811115611b7657611b76615497565b145b611b945760405162461bcd60e51b815260040161056e90615b49565b5f8281526007850160205260408120611bac91615244565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061602883398151915293929190829060ff166004811115611cba57611cba615497565b6004811115611ccb57611ccb615497565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5257611d52615497565b1480611d705750600381516004811115611d6e57611d6e615497565b145b611dc45760405162461bcd60e51b815260206004820152603260248201525f80516020616048833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161056e565b5f611dd28260400151611fee565b905080606001516001600160401b03165f03611e565760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161056e565b6005600160991b016001600160a01b031663ee5b48eb611e83846040015184606001518560800151612597565b6040518263ffffffff1660e01b8152600401611e9f9190615682565b6020604051808303815f875af1158015611ebb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc89190615649565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020616068833981519152929190611f2790615b11565b9050118015611f59575060015f83815260088301602052604090205460ff166005811115611f5757611f57615497565b145b611f755760405162461bcd60e51b815260040161056e90615b49565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fae9190600401615b90565b6020604051808303815f875af1158015611fca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190615649565b611ff661527b565b5f8281525f805160206160a8833981519152602052604090819020815160e0810190925280545f80516020616068833981519152929190829060ff16600581111561204357612043615497565b600581111561205457612054615497565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120bf6133f8565b6120cb8585858561391a565b90506120e360015f8051602061608883398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612136573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261215d9190810190615c25565b91509150806121c05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161056e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122279190615649565b82511461228b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161056e565b60208201516001600160a01b0316156123015760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161056e565b5f806123108460400151613b8f565b9150915081871461237d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161056e565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0960205260409020545f80516020616028833981519152906001600160401b0390811690831611156123f7575f8881526009820160205260409020805467ffffffffffffffff19166001600160401b0384161790555b6040516001600160401b038316815288907fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d04359060200160405180910390a2509695505050505050565b5f8281525f805160206160a8833981519152602052604081206002015481905f8051602061606883398151915290600160801b90046001600160401b03166124888582613d67565b5f61249287613f75565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124e28a858b612597565b6040518263ffffffff1660e01b81526004016124fe9190615682565b6020604051808303815f875af115801561251a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253e9190615649565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612610576125d0816001615cf7565b6125db906008615afa565b5081515f908390839081106125f2576125f26158d5565b60200101906001600160f81b03191690815f1a9053506001016125bc565b505f5b600481101561267b57612627816003615cf7565b612632906008615afa565b600263ffffffff16901c60f81b8282600261264d91906157d7565b8151811061265d5761265d6158d5565b60200101906001600160f81b03191690815f1a905350600101612613565b505f5b60208110156126dd5761269281601f615cf7565b61269d906008615afa565b86901c60f81b826126af8360066157d7565b815181106126bf576126bf6158d5565b60200101906001600160f81b03191690815f1a90535060010161267e565b505f5b6008811015612748576126f4816007615cf7565b6126ff906008615afa565b6001600160401b038616901c60f81b8261271a8360266157d7565b8151811061272a5761272a6158d5565b60200101906001600160f81b03191690815f1a9053506001016126e0565b505f5b60088110156127b35761275f816007615cf7565b61276a906008615afa565b6001600160401b038516901c60f81b8261278583602e6157d7565b81518110612795576127956158d5565b60200101906001600160f81b03191690815f1a90535060010161274b565b5090505b9392505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b612801614005565b61280a82614050565b611a71816140c7565b61281b61527b565b5f8281525f805160206160a88339815191526020526040808220815160e0810190925280545f8051602061606883398151915293929190829060ff16600581111561286857612868615497565b600581111561287957612879615497565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156128eb576128eb615497565b146129475760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161056e565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561298b5761298b615497565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612a378582612440565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f612a9761527b565b5f805160206160688339815191525f612aaf85612e71565b90505f80612ac08360400151613779565b915091508015612b255760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161056e565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612b5657612b56615497565b6005811115612b6757612b67615497565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612bd857612bd8615497565b1480612bf65750600182516005811115612bf457612bf4615497565b145b612c555760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161056e565b600382516005811115612c6a57612c6a615497565b03612c7757506004612c7b565b5060055b6020808301515f90815260098801909152604081205581816005811115612ca457612ca4615497565b90816005811115612cb757612cb7615497565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612ceb57612ceb615497565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612d9f57612d9f615497565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f5f8051602061600883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612e33575f80fd5b505af1158015612e45573d5f803e3d5ffd5b50505050505050565b5f8051602061600883398151915254611a71906001600160a01b03168383614168565b60408051606080820183525f8083526020830181905292820152905f805160206160688339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ee6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f0d9190810190615c25565b9150915080612f6d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161056e565b8254825114612fd05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161056e565b60208201516001600160a01b0316156130435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161056e565b509392505050565b5f805f835160361461306f5760405162461bcd60e51b815260040161056e90615d0a565b5f805b60028110156130be57613086816001615cf7565b613091906008615afa565b61ffff168682815181106130a7576130a76158d5565b016020015160f81c901b9190911790600101613072565b5061ffff8116156130e15760405162461bcd60e51b815260040161056e90615d53565b5f805b600481101561313c576130f8816003615cf7565b613103906008615afa565b63ffffffff16876131158360026157d7565b81518110613125576131256158d5565b016020015160f81c901b91909117906001016130e4565b5063ffffffff81166004146131635760405162461bcd60e51b815260040161056e90615d96565b5f805b60208110156131b85761317a81601f615cf7565b613185906008615afa565b886131918360066157d7565b815181106131a1576131a16158d5565b016020015160f81c901b9190911790600101613166565b505f805b6008811015613217576131d0816007615cf7565b6131db906008615afa565b6001600160401b0316896131f08360266157d7565b81518110613200576132006158d5565b016020015160f81c901b91909117906001016131bc565b505f805b60088110156132765761322f816007615cf7565b61323a906008615afa565b6001600160401b03168a61324f83602e6157d7565b8151811061325f5761325f6158d5565b016020015160f81c901b919091179060010161321b565b5091989097509095509350505050565b5f81516026146132a85760405162461bcd60e51b815260040161056e90615d0a565b5f805b60028110156132f7576132bf816001615cf7565b6132ca906008615afa565b61ffff168482815181106132e0576132e06158d5565b016020015160f81c901b91909117906001016132ab565b5061ffff81161561331a5760405162461bcd60e51b815260040161056e90615d53565b5f805b600481101561337557613331816003615cf7565b61333c906008615afa565b63ffffffff168561334e8360026157d7565b8151811061335e5761335e6158d5565b016020015160f81c901b919091179060010161331d565b5063ffffffff81161561339a5760405162461bcd60e51b815260040161056e90615d96565b5f805b60208110156133ef576133b181601f615cf7565b6133bc906008615afa565b866133c88360066157d7565b815181106133d8576133d86158d5565b016020015160f81c901b919091179060010161339d565b50949350505050565b5f8051602061608883398151915280546001190161342957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061608883398151915255565b5f5f805160206160288339815191528161345e610259856141c7565b90505f61346a87611fee565b9050613475876127be565b6134915760405162461bcd60e51b815260040161056e906156b4565b6002815160058111156134a6576134a6615497565b146134c35760405162461bcd60e51b815260040161056e906156fc565b5f8282608001516134d49190615764565b600485015460408401519192506134f6916001600160401b0390911690615ddd565b6001600160401b0316816001600160401b031611156135755760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161056e565b5f806135818a84612440565b915091505f8a836040516020016135af92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561364a5761364a615497565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461379c5760405162461bcd60e51b815260040161056e90615d0a565b5f805b60028110156137eb576137b3816001615cf7565b6137be906008615afa565b61ffff168582815181106137d4576137d46158d5565b016020015160f81c901b919091179060010161379f565b5061ffff81161561380e5760405162461bcd60e51b815260040161056e90615d53565b5f805b600481101561386957613825816003615cf7565b613830906008615afa565b63ffffffff16866138428360026157d7565b81518110613852576138526158d5565b016020015160f81c901b9190911790600101613811565b5063ffffffff81166003146138905760405162461bcd60e51b815260040161056e90615d96565b5f805b60208110156138e5576138a781601f615cf7565b6138b2906008615afa565b876138be8360066157d7565b815181106138ce576138ce6158d5565b016020015160f81c901b9190911790600101613893565b505f866026815181106138fa576138fa6158d5565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206160288339815191529061ffff861610801590613966575061271061ffff861611155b6139825760405162461bcd60e51b815260040161056e90615e08565b60028101546001600160401b0390811690851610156139fb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161056e565b8054831015613a5e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161056e565b8060010154831115613ac55760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161056e565b5f613acf846141c7565b90505f613adb82610ab5565b90505f613ae889836141ea565b90506040518060600160405280613afc3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613bb25760405162461bcd60e51b815260040161056e90615d0a565b5f805b6002811015613c0157613bc9816001615cf7565b613bd4906008615afa565b61ffff16858281518110613bea57613bea6158d5565b016020015160f81c901b9190911790600101613bb5565b5061ffff811615613c245760405162461bcd60e51b815260040161056e90615d53565b5f805b6004811015613c7f57613c3b816003615cf7565b613c46906008615afa565b63ffffffff1686613c588360026157d7565b81518110613c6857613c686158d5565b016020015160f81c901b9190911790600101613c27565b5063ffffffff8116600514613ca65760405162461bcd60e51b815260040161056e90615d96565b5f805b6020811015613cfb57613cbd81601f615cf7565b613cc8906008615afa565b87613cd48360066157d7565b81518110613ce457613ce46158d5565b016020015160f81c901b9190911790600101613ca9565b505f805b6008811015613d5a57613d13816007615cf7565b613d1e906008615afa565b6001600160401b031688613d338360266157d7565b81518110613d4357613d436158d5565b016020015160f81c901b9190911790600101613cff565b5090969095509350505050565b5f805160206160688339815191525f6001600160401b038084169085161115613d9b57613d9483856155eb565b9050613da8565b613da584846155eb565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613e0a575060028401548151613e06916001600160401b0316906157d7565b8210155b15613e30576001600160401b038316606082015281815260408101516020820152613e4f565b8281606001818151613e429190615764565b6001600160401b03169052505b6060810151613e5f906064615ddd565b602082015160028601546001600160401b039290921691613e8a9190600160401b900460ff16615afa565b1015613eee5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161056e565b856001600160401b031681604001818151613f0991906157d7565b9052506040810180516001600160401b0387169190613f29908390615cf7565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206160a88339815191526020526040812060020180545f8051602061606883398151915291600160401b9091046001600160401b0316906008613fbf83615e53565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661404e57604051631afcd79f60e31b815260040160405180910390fd5b565b614058614005565b6140618161474f565b614069614768565b6140c4608082013560a083013561408660e0850160c0860161545e565b614097610100860160e08701615e6e565b61ffff166140ad61012087016101008801615e87565b6140bf61014088016101208901615875565b614778565b50565b6140cf614005565b5f805160206160088339815191526001600160a01b0382166141485760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161056e565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610ab091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506149bc565b5f610ac5825f80516020616008833981519152546001600160a01b031690614a1d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142755760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161056e565b5f8051602061606883398151915242614294604086016020870161545e565b6001600160401b0316116143065760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161056e565b614316604085016020860161545e565b6001600160401b031661432c6202a300426157d7565b1161439f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161056e565b83356143f75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161056e565b83355f908152600982016020526040902054156144265760405162461bcd60e51b815260040161056e90615a30565b60306144356040860186615ea7565b90501461449a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161056e565b6144a4835f613d67565b5f8061453e6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144e9919061545e565b6001600160401b0316815260200161450460408a018a615ea7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b7f565b5f8281526007860160205260409020919350915061455c8282615f2d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614589908590600401615682565b6020604051808303815f875af11580156145a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145c99190615649565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561464157614641615497565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614721918e01908e0161545e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614757614005565b61475f614f2e565b6140c481614f36565b614770614005565b61404e6150d8565b614780614005565b5f80516020616028833981519152836147ec5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161056e565b61271084111561480e5760405162461bcd60e51b815260040161056e90615e08565b858711156148765760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161056e565b5f8360ff16116148e35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161056e565b600a60ff841611156149555760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161056e565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149d06001600160a01b038416836150e0565b905080515f141580156149f45750808060200190518101906149f29190615fec565b155b15610ab057604051635274afe760e01b81526001600160a01b038416600482015260240161056e565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a879190615649565b9050614a9e6001600160a01b0385163330866150ed565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614ae2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b069190615649565b9050818111614b6c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161056e565b614b768282615cf7565b95945050505050565b5f6060826080015151603014614be95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161056e565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c6057614c20816001615cf7565b614c2b906008615afa565b5081515f90839083908110614c4257614c426158d5565b60200101906001600160f81b03191690815f1a905350600101614c0c565b505f5b6004811015614cc857614c77816003615cf7565b614c82906008615afa565b600160ff919091161c60f81b82614c9a8360026157d7565b81518110614caa57614caa6158d5565b60200101906001600160f81b03191690815f1a905350600101614c63565b505f5b6020811015614d255784518160208110614ce757614ce76158d5565b1a60f81b82614cf78360066157d7565b81518110614d0757614d076158d5565b60200101906001600160f81b03191690815f1a905350600101614ccb565b505f5b6020811015614d855784602001518160208110614d4757614d476158d5565b1a60f81b82614d578360266157d7565b81518110614d6757614d676158d5565b60200101906001600160f81b03191690815f1a905350600101614d28565b505f5b6008811015614df957614d9c816007615cf7565b614da7906008615afa565b60ff1685604001516001600160401b0316901c60f81b82826046614dcb91906157d7565b81518110614ddb57614ddb6158d5565b60200101906001600160f81b03191690815f1a905350600101614d88565b505f5b6030811015614e645784608001518181518110614e1b57614e1b6158d5565b01602001516001600160f81b03191682614e3683604e6157d7565b81518110614e4657614e466158d5565b60200101906001600160f81b03191690815f1a905350600101614dfc565b505f5b6008811015614ed657614e7b816007615cf7565b614e86906008615afa565b60608601516001600160401b0390811691161c60f81b82614ea883607e6157d7565b81518110614eb857614eb86158d5565b60200101906001600160f81b03191690815f1a905350600101614e67565b50600281604051614ee79190615ac7565b602060405180830381855afa158015614f02573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f259190615649565b94909350915050565b61404e614005565b614f3e614005565b80355f8051602061606883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f8a6080840160608501615e87565b60ff161115614ff75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161056e565b5f6150086080840160608501615e87565b60ff16116150705760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161056e565b6150806080830160608401615e87565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556150b1606083016040840161545e565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61342f614005565b60606127b783835f615126565b6040516001600160a01b038481166024830152838116604483015260648201839052610a419186918216906323b872dd90608401614195565b60608147101561514b5760405163cd78605960e01b815230600482015260240161056e565b5f80856001600160a01b031684866040516151669190615ac7565b5f6040518083038185875af1925050503d805f81146151a0576040519150601f19603f3d011682016040523d82523d5f602084013e6151a5565b606091505b50915091506151b58683836151bf565b9695505050505050565b6060826151d4576151cf8261521b565b6127b7565b81511580156151eb57506001600160a01b0384163b155b1561521457604051639996b31560e01b81526001600160a01b038516600482015260240161056e565b50806127b7565b80511561522b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461525090615b11565b5f825580601f1061525f575050565b601f0160209004905f5260205f20908101906140c491906152b7565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156152cb575f81556001016152b8565b5090565b80151581146140c4575f80fd5b803563ffffffff811681146152ef575f80fd5b919050565b5f805f60608486031215615306575f80fd5b833592506020840135615318816152cf565b9150615326604085016152dc565b90509250925092565b5f6020828403121561533f575f80fd5b5035919050565b5f8060408385031215615357575f80fd5b82359150615367602084016152dc565b90509250929050565b6001600160a01b03811681146140c4575f80fd5b5f80828403610160811215615397575f80fd5b610140808212156153a6575f80fd5b84935083013590506153b781615370565b809150509250929050565b5f602082840312156153d2575f80fd5b6127b7826152dc565b5f80604083850312156153ec575f80fd5b6153f5836152dc565b946020939093013593505050565b5f8060408385031215615414575f80fd5b82356001600160401b03811115615429575f80fd5b83016080818603121561543a575f80fd5b9150615367602084016152dc565b80356001600160401b03811681146152ef575f80fd5b5f6020828403121561546e575f80fd5b6127b782615448565b5f8060408385031215615488575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106154ce57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161550960608401826001600160401b03169052565b50608083015161552460808401826001600160401b03169052565b5060a083015161553f60a08401826001600160401b03169052565b5060c083015161555a60c08401826001600160401b03169052565b5092915050565b803561ffff811681146152ef575f80fd5b5f805f8060808587031215615585575f80fd5b84356001600160401b0381111561559a575f80fd5b8501606081880312156155ab575f80fd5b93506155b960208601615561565b92506155c760408601615448565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561555a5761555a6155d7565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615659575f80fd5b5051919050565b5f5b8381101561567a578181015183820152602001615662565b50505f910152565b602081525f82518060208401526156a0816040850160208701615660565b601f01601f19169190910160400192915050565b60208082526028908201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660408201526730b634b230ba37b960c11b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6040820152686f742061637469766560b81b606082015260800190565b5f8261575f57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160401b0381811683821601908082111561555a5761555a6155d7565b60208082526033908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616040820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606082015260800190565b80820180821115610ac557610ac56155d7565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615885575f80fd5b81356127b781615370565b5f808335601e198436030181126158a5575f80fd5b8301803591506001600160401b038211156158be575f80fd5b6020019150600581901b3603821315612590575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126158fd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561593d5761593d615907565b60405290565b604051601f8201601f191681016001600160401b038111828210171561596b5761596b615907565b604052919050565b5f6001600160401b0382111561598b5761598b615907565b50601f01601f191660200190565b5f606082360312156159a9575f80fd5b6159b161591b565b8235815260206159c2818501615448565b8183015260408401356001600160401b038111156159de575f80fd5b840136601f8201126159ee575f80fd5b8035615a016159fc82615973565b615943565b8181523684838501011115615a14575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615a89818460208a01615660565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615ab9816028840160208801615660565b016028019695505050505050565b5f82516158fd818460208701615660565b5f63ffffffff808316818103615af057615af06155d7565b6001019392505050565b8082028115828204841417610ac557610ac56155d7565b600181811c90821680615b2557607f821691505b602082108103615b4357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615ba281615b11565b806020870152604060018084165f8114615bc35760018114615bdf57615c0c565b60ff19851660408a0152604084151560051b8a01019550615c0c565b895f5260205f205f5b85811015615c035781548b8201860152908301908801615be8565b8a016040019650505b509398975050505050505050565b80516152ef816152cf565b5f8060408385031215615c36575f80fd5b82516001600160401b0380821115615c4c575f80fd5b9084019060608287031215615c5f575f80fd5b615c6761591b565b82518152602080840151615c7a81615370565b82820152604084015183811115615c8f575f80fd5b80850194505087601f850112615ca3575f80fd5b83519250615cb36159fc84615973565b8381528882858701011115615cc6575f80fd5b615cd584838301848801615660565b80604084015250819550615cea818801615c1a565b9450505050509250929050565b81810381811115610ac557610ac56155d7565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615e0057615e006155d7565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b03808316818103615af057615af06155d7565b5f60208284031215615e7e575f80fd5b6127b782615561565b5f60208284031215615e97575f80fd5b813560ff811681146127b7575f80fd5b5f808335601e19843603018112615ebc575f80fd5b8301803591506001600160401b03821115615ed5575f80fd5b602001915036819003821315612590575f80fd5b601f821115610ab057805f5260205f20601f840160051c81016020851015615f0e5750805b601f840160051c820191505b81811015610dc8575f8155600101615f1a565b81516001600160401b03811115615f4657615f46615907565b615f5a81615f548454615b11565b84615ee9565b602080601f831160018114615f8d575f8415615f765750858301515b5f19600386901b1c1916600185901b178555615fe4565b5f85815260208120601f198616915b82811015615fbb57888601518255948401946001909101908401615f9c565b5085821015615fd857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ffc575f80fd5b81516127b7816152cf56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161624138038061624183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6160f48061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c806362065856116100f3578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103d4578063d5f20ff6146103dc578063df93d8de146103fc578063eb0acb8914610406575f80fd5b8063b771b3bc14610388578063ba3a4b97146103ae578063bee0a03f146103c1575f80fd5b80638280a25a116100ce5780638280a25a1461034757806398f3e2b41461034f5780639e1bc4ef14610362578063a3a65e4814610375575f80fd5b8063620658561461030e57806366435abf1461032157806376f7862114610334575f80fd5b8063330a0a3a1161015e578063467ef06f11610139578063467ef06f146102b85780635297fae6146102cb57806360305d62146102de57806361e2f490146102fb575f80fd5b8063330a0a3a1461027657806335455ded146102895780633a1cfff6146102a5575f80fd5b80630118acc4146101a55780630322ed98146101ba5780630cdd0985146101cd578063151d30d11461021e57806325e1c776146102385780632e2194d81461024b575b5f80fd5b6101b86101b3366004615314565b610419565b005b6101b86101c836600461534f565b61088e565b61020b6101db36600461534f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610226600a81565b60405160ff9091168152602001610215565b6101b8610246366004615366565b610a47565b61025e61025936600461534f565b610ab5565b6040516001600160401b039091168152602001610215565b6101b86102843660046153a4565b610acb565b61029261271081565b60405161ffff9091168152602001610215565b6101b86102b3366004615314565b610baa565b6101b86102c63660046153e2565b610d2f565b6101b86102d93660046153fb565b610dcf565b6102e6601481565b60405163ffffffff9091168152602001610215565b6101b8610309366004615423565b610fa4565b61020b61031c36600461547e565b6115d8565b61025e61032f36600461534f565b6115f1565b6101b8610342366004615314565b611605565b610226603081565b6101b861035d3660046153fb565b6117f3565b61020b610370366004615497565b611a75565b6101b86103833660046153e2565b611aa1565b6103966005600160991b0181565b6040516001600160a01b039091168152602001610215565b6101b86103bc36600461534f565b611c59565b6101b86103cf36600461534f565b611edf565b610226601481565b6103ef6103ea36600461534f565b611fee565b60405161021591906154cb565b61025e6202a30081565b61020b610414366004615592565b6120b6565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020616048833981519152949193919290829060ff166004811115610481576104816154b7565b6004811115610492576104926154b7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61050e83611fee565b9050600282516004811115610525576105256154b7565b146105775760405162461bcd60e51b815260206004820152602a60248201525f805160206160688339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105dc5760405162461bcd60e51b815260206004820152603360248201525f805160206160688339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161056e565b6003825280515f9060029060058111156105f8576105f86154b7565b0361064f5786156106105761060d84876120eb565b90505b5f83606001518360800151610625919061560b565b90506106318582612460565b506001600160401b0390811660e0860152421660a085015250610683565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106b685606001516115d8565b8460a0015186608001518760a00151865f806040518863ffffffff1660e01b81526004016106ea979695949392919061562b565b602060405180830381865afa158015610705573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107299190615669565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff19166001836004811115610768576107686154b7565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206160c88339815191526020526040808220815160e0810190925280545f8051602061608883398151915293929190829060ff1660058111156108db576108db6154b7565b60058111156108ec576108ec6154b7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095b5761095b6154b7565b146109c05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161056e565b6005600160991b016001600160a01b031663ee5b48eb6109e58584606001515f6125b7565b6040518263ffffffff1660e01b8152600401610a0191906156a2565b6020604051808303815f875af1158015610a1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a419190615669565b50505050565b610a50826127de565b610a6c5760405162461bcd60e51b815260040161056e906156d4565b6002610a7783611fee565b516005811115610a8957610a896154b7565b14610aa65760405162461bcd60e51b815260040161056e9061571c565b610ab082826120eb565b505050565b5f610ac564e8d4a5100083615765565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b14575080546001600160401b03808416911610155b15610b325760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b5d8484612819565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206160488339815191525f610bc285612833565b5f86815260058401602052604090205460a0820151919250610bf591600160b01b9091046001600160401b031690615784565b6001600160401b03168160c001516001600160401b03161015610c2a5760405162461bcd60e51b815260040161056e906157a4565b5f8415610c4257610c3b86856120eb565b9050610c5d565b505f8581526009830160205260409020546001600160401b03165b8260040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5610c9084604001516115d8565b60a085015160c08601516040516001600160e01b031960e086901b168152610cc4939291829188905f90819060040161562b565b602060405180830381865afa158015610cdf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d039190615669565b5f87815260088501602052604081208054909190610d229084906157f7565b9091555050505050505050565b5f805160206160488339815191525f80610d4884612aae565b91509150610d55826127de565b610d5f5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d8d57610d8d6154b7565b03610db2575f83815260088501602052604081208054919055610db08282612df8565b505b610dc881610dc384604001516115d8565b612e6e565b5050505050565b5f805160206160488339815191525f610de784612e91565b90505f80610df8836040015161306b565b50915091505f610e0783611fee565b9050816001600160401b031681606001516001600160401b03161015610e3f5760405162461bcd60e51b815260040161056e9061580a565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e845760405162461bcd60e51b815260040161056e9061584c565b60015f87815260068701602052604090205460ff166004811115610eaa57610eaa6154b7565b14610f135760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161056e565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206160888339815191529060ff16156110415760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161056e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611084573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a89190615669565b83602001351461110a5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161056e565b3061111b6060850160408601615895565b6001600160a01b03161461118d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161056e565b5f61119b60608501856158b0565b91505f90508435602086013560146111b96060890160408a01615895565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156114e8575f61123960608901896158b0565b8363ffffffff1681811061124f5761124f6158f5565b90506020028101906112619190615909565b61126a906159b9565b80515f818152600989016020526040902054919250901561129d5760405162461bcd60e51b815260040161056e90615a50565b84825f0151836020015184604001516040516020016112bf9493929190615a98565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161130d9190615ae7565b602060405180830381855afa158015611328573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061134b9190615669565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113d7576113d76154b7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161148a9116866157f7565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114e190615af8565b905061121d565b50600584018190555f6114fa86612e91565b90505f61150a82604001516132a6565b90508060028560405161151d9190615ae7565b602060405180830381855afa158015611538573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061155b9190615669565b146115bf5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161056e565b505050600a909201805460ff1916600117905550505050565b5f610ac56001600160401b03831664e8d4a51000615b1a565b5f6115fb82611fee565b6080015192915050565b5f805160206160488339815191525f61161d85612833565b5f86815260058401602052604090205460a082015191925061165091600160b01b9091046001600160401b031690615784565b6001600160401b03168160c001516001600160401b031610156116855760405162461bcd60e51b815260040161056e906157a4565b5f841561169d5761169686856120eb565b90506116b8565b505f8581526009830160205260409020546001600160401b03165b600483015460408301515f91600160401b90046001600160a01b03169063778c06b5906116e4906115d8565b60a086015160c08701516040516001600160e01b031960e086901b168152611718939291829189905f90819060040161562b565b602060405180830381865afa158015611733573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117579190615669565b90505f81116117c65760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e20604482015274696e656c6967626c6520666f72207265776172647360581b606482015260840161056e565b5f878152600885016020526040812080548392906117e59084906157f7565b909155505050505050505050565b6117fb613418565b5f805160206160488339815191525f61181384612e91565b90505f80611824836040015161306b565b50915091505f61183383611fee565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561186d5761186d6154b7565b600481111561187e5761187e6154b7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561191d5760405162461bcd60e51b815260040161056e9061580a565b826001600160401b03168160e001516001600160401b031611156119535760405162461bcd60e51b815260040161056e9061584c565b600381516004811115611968576119686154b7565b146119bc5760405162461bcd60e51b815260206004820152603160248201525f805160206160688339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161056e565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a01909252909120546119f29190612df8565b856007015f8881526020019081526020015f205f9055611a1d8160200151610dc383606001516115d8565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050611a7160015f805160206160a883398151915255565b5050565b5f611a7e613418565b611a89833384613462565b9050610ac560015f805160206160a883398151915255565b5f805160206160888339815191525f611ab983612e91565b90505f80611aca8360400151613799565b9150915080611b2c5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161056e565b5f82815260078501602052604081208054611b4690615b31565b9050118015611b78575060015f83815260088601602052604090205460ff166005811115611b7657611b766154b7565b145b611b945760405162461bcd60e51b815260040161056e90615b69565b5f8281526007850160205260408120611bac91615264565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061604883398151915293929190829060ff166004811115611cba57611cba6154b7565b6004811115611ccb57611ccb6154b7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5257611d526154b7565b1480611d705750600381516004811115611d6e57611d6e6154b7565b145b611dc45760405162461bcd60e51b815260206004820152603260248201525f80516020616068833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161056e565b5f611dd28260400151611fee565b905080606001516001600160401b03165f03611e565760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161056e565b6005600160991b016001600160a01b031663ee5b48eb611e838460400151846060015185608001516125b7565b6040518263ffffffff1660e01b8152600401611e9f91906156a2565b6020604051808303815f875af1158015611ebb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dc89190615669565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020616088833981519152929190611f2790615b31565b9050118015611f59575060015f83815260088301602052604090205460ff166005811115611f5757611f576154b7565b145b611f755760405162461bcd60e51b815260040161056e90615b69565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fae9190600401615bb0565b6020604051808303815f875af1158015611fca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ab09190615669565b611ff661529b565b5f8281525f805160206160c8833981519152602052604090819020815160e0810190925280545f80516020616088833981519152929190829060ff166005811115612043576120436154b7565b6005811115612054576120546154b7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120bf613418565b6120cb8585858561393a565b90506120e360015f805160206160a883398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612136573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261215d9190810190615c45565b91509150806121c05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161056e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612203573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122279190615669565b82511461228b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161056e565b60208201516001600160a01b0316156123015760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161056e565b5f806123108460400151613baf565b9150915081871461237d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161056e565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0960205260409020545f80516020616048833981519152906001600160401b0390811690831611156123fb575f8881526009820160205260409020805467ffffffffffffffff19166001600160401b038416179055612417565b5f8881526009820160205260409020546001600160401b031691505b6040516001600160401b038316815288907fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d04359060200160405180910390a2509695505050505050565b5f8281525f805160206160c8833981519152602052604081206002015481905f8051602061608883398151915290600160801b90046001600160401b03166124a88582613d87565b5f6124b287613f95565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125028a858b6125b7565b6040518263ffffffff1660e01b815260040161251e91906156a2565b6020604051808303815f875af115801561253a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061255e9190615669565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612630576125f0816001615d17565b6125fb906008615b1a565b5081515f90839083908110612612576126126158f5565b60200101906001600160f81b03191690815f1a9053506001016125dc565b505f5b600481101561269b57612647816003615d17565b612652906008615b1a565b600263ffffffff16901c60f81b8282600261266d91906157f7565b8151811061267d5761267d6158f5565b60200101906001600160f81b03191690815f1a905350600101612633565b505f5b60208110156126fd576126b281601f615d17565b6126bd906008615b1a565b86901c60f81b826126cf8360066157f7565b815181106126df576126df6158f5565b60200101906001600160f81b03191690815f1a90535060010161269e565b505f5b600881101561276857612714816007615d17565b61271f906008615b1a565b6001600160401b038616901c60f81b8261273a8360266157f7565b8151811061274a5761274a6158f5565b60200101906001600160f81b03191690815f1a905350600101612700565b505f5b60088110156127d35761277f816007615d17565b61278a906008615b1a565b6001600160401b038516901c60f81b826127a583602e6157f7565b815181106127b5576127b56158f5565b60200101906001600160f81b03191690815f1a90535060010161276b565b5090505b9392505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b612821614025565b61282a82614070565b611a71816140e7565b61283b61529b565b5f8281525f805160206160c88339815191526020526040808220815160e0810190925280545f8051602061608883398151915293929190829060ff166005811115612888576128886154b7565b6005811115612899576128996154b7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561290b5761290b6154b7565b146129675760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161056e565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156129ab576129ab6154b7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612a578582612460565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f612ab761529b565b5f805160206160888339815191525f612acf85612e91565b90505f80612ae08360400151613799565b915091508015612b455760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161056e565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612b7657612b766154b7565b6005811115612b8757612b876154b7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612bf857612bf86154b7565b1480612c165750600182516005811115612c1457612c146154b7565b145b612c755760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161056e565b600382516005811115612c8a57612c8a6154b7565b03612c9757506004612c9b565b5060055b6020808301515f90815260098801909152604081205581816005811115612cc457612cc46154b7565b90816005811115612cd757612cd76154b7565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d0b57612d0b6154b7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612dbf57612dbf6154b7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f5f8051602061602883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612e53575f80fd5b505af1158015612e65573d5f803e3d5ffd5b50505050505050565b5f8051602061602883398151915254611a71906001600160a01b03168383614188565b60408051606080820183525f8083526020830181905292820152905f805160206160888339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f06573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f2d9190810190615c45565b9150915080612f8d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161056e565b8254825114612ff05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161056e565b60208201516001600160a01b0316156130635760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161056e565b509392505050565b5f805f835160361461308f5760405162461bcd60e51b815260040161056e90615d2a565b5f805b60028110156130de576130a6816001615d17565b6130b1906008615b1a565b61ffff168682815181106130c7576130c76158f5565b016020015160f81c901b9190911790600101613092565b5061ffff8116156131015760405162461bcd60e51b815260040161056e90615d73565b5f805b600481101561315c57613118816003615d17565b613123906008615b1a565b63ffffffff16876131358360026157f7565b81518110613145576131456158f5565b016020015160f81c901b9190911790600101613104565b5063ffffffff81166004146131835760405162461bcd60e51b815260040161056e90615db6565b5f805b60208110156131d85761319a81601f615d17565b6131a5906008615b1a565b886131b18360066157f7565b815181106131c1576131c16158f5565b016020015160f81c901b9190911790600101613186565b505f805b6008811015613237576131f0816007615d17565b6131fb906008615b1a565b6001600160401b0316896132108360266157f7565b81518110613220576132206158f5565b016020015160f81c901b91909117906001016131dc565b505f805b60088110156132965761324f816007615d17565b61325a906008615b1a565b6001600160401b03168a61326f83602e6157f7565b8151811061327f5761327f6158f5565b016020015160f81c901b919091179060010161323b565b5091989097509095509350505050565b5f81516026146132c85760405162461bcd60e51b815260040161056e90615d2a565b5f805b6002811015613317576132df816001615d17565b6132ea906008615b1a565b61ffff16848281518110613300576133006158f5565b016020015160f81c901b91909117906001016132cb565b5061ffff81161561333a5760405162461bcd60e51b815260040161056e90615d73565b5f805b600481101561339557613351816003615d17565b61335c906008615b1a565b63ffffffff168561336e8360026157f7565b8151811061337e5761337e6158f5565b016020015160f81c901b919091179060010161333d565b5063ffffffff8116156133ba5760405162461bcd60e51b815260040161056e90615db6565b5f805b602081101561340f576133d181601f615d17565b6133dc906008615b1a565b866133e88360066157f7565b815181106133f8576133f86158f5565b016020015160f81c901b91909117906001016133bd565b50949350505050565b5f805160206160a883398151915280546001190161344957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206160a883398151915255565b5f5f805160206160488339815191528161347e610259856141e7565b90505f61348a87611fee565b9050613495876127de565b6134b15760405162461bcd60e51b815260040161056e906156d4565b6002815160058111156134c6576134c66154b7565b146134e35760405162461bcd60e51b815260040161056e9061571c565b5f8282608001516134f49190615784565b60048501546040840151919250613516916001600160401b0390911690615dfd565b6001600160401b0316816001600160401b031611156135955760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161056e565b5f806135a18a84612460565b915091505f8a836040516020016135cf92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561366a5761366a6154b7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137bc5760405162461bcd60e51b815260040161056e90615d2a565b5f805b600281101561380b576137d3816001615d17565b6137de906008615b1a565b61ffff168582815181106137f4576137f46158f5565b016020015160f81c901b91909117906001016137bf565b5061ffff81161561382e5760405162461bcd60e51b815260040161056e90615d73565b5f805b600481101561388957613845816003615d17565b613850906008615b1a565b63ffffffff16866138628360026157f7565b81518110613872576138726158f5565b016020015160f81c901b9190911790600101613831565b5063ffffffff81166003146138b05760405162461bcd60e51b815260040161056e90615db6565b5f805b6020811015613905576138c781601f615d17565b6138d2906008615b1a565b876138de8360066157f7565b815181106138ee576138ee6158f5565b016020015160f81c901b91909117906001016138b3565b505f8660268151811061391a5761391a6158f5565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206160488339815191529061ffff861610801590613986575061271061ffff861611155b6139a25760405162461bcd60e51b815260040161056e90615e28565b60028101546001600160401b039081169085161015613a1b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161056e565b8054831015613a7e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161056e565b8060010154831115613ae55760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161056e565b5f613aef846141e7565b90505f613afb82610ab5565b90505f613b08898361420a565b90506040518060600160405280613b1c3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613bd25760405162461bcd60e51b815260040161056e90615d2a565b5f805b6002811015613c2157613be9816001615d17565b613bf4906008615b1a565b61ffff16858281518110613c0a57613c0a6158f5565b016020015160f81c901b9190911790600101613bd5565b5061ffff811615613c445760405162461bcd60e51b815260040161056e90615d73565b5f805b6004811015613c9f57613c5b816003615d17565b613c66906008615b1a565b63ffffffff1686613c788360026157f7565b81518110613c8857613c886158f5565b016020015160f81c901b9190911790600101613c47565b5063ffffffff8116600514613cc65760405162461bcd60e51b815260040161056e90615db6565b5f805b6020811015613d1b57613cdd81601f615d17565b613ce8906008615b1a565b87613cf48360066157f7565b81518110613d0457613d046158f5565b016020015160f81c901b9190911790600101613cc9565b505f805b6008811015613d7a57613d33816007615d17565b613d3e906008615b1a565b6001600160401b031688613d538360266157f7565b81518110613d6357613d636158f5565b016020015160f81c901b9190911790600101613d1f565b5090969095509350505050565b5f805160206160888339815191525f6001600160401b038084169085161115613dbb57613db4838561560b565b9050613dc8565b613dc5848461560b565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613e2a575060028401548151613e26916001600160401b0316906157f7565b8210155b15613e50576001600160401b038316606082015281815260408101516020820152613e6f565b8281606001818151613e629190615784565b6001600160401b03169052505b6060810151613e7f906064615dfd565b602082015160028601546001600160401b039290921691613eaa9190600160401b900460ff16615b1a565b1015613f0e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161056e565b856001600160401b031681604001818151613f2991906157f7565b9052506040810180516001600160401b0387169190613f49908390615d17565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206160c88339815191526020526040812060020180545f8051602061608883398151915291600160401b9091046001600160401b0316906008613fdf83615e73565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661406e57604051631afcd79f60e31b815260040160405180910390fd5b565b614078614025565b6140818161476f565b614089614788565b6140e4608082013560a08301356140a660e0850160c0860161547e565b6140b7610100860160e08701615e8e565b61ffff166140cd61012087016101008801615ea7565b6140df61014088016101208901615895565b614798565b50565b6140ef614025565b5f805160206160288339815191526001600160a01b0382166141685760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161056e565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052610ab091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506149dc565b5f610ac5825f80516020616028833981519152546001600160a01b031690614a3d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142955760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161056e565b5f80516020616088833981519152426142b4604086016020870161547e565b6001600160401b0316116143265760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161056e565b614336604085016020860161547e565b6001600160401b031661434c6202a300426157f7565b116143bf5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161056e565b83356144175760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161056e565b83355f908152600982016020526040902054156144465760405162461bcd60e51b815260040161056e90615a50565b60306144556040860186615ec7565b9050146144ba5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161056e565b6144c4835f613d87565b5f8061455e6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614509919061547e565b6001600160401b0316815260200161452460408a018a615ec7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b9f565b5f8281526007860160205260409020919350915061457c8282615f4d565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145a99085906004016156a2565b6020604051808303815f875af11580156145c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145e99190615669565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614661576146616154b7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614741918e01908e0161547e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614777614025565b61477f614f4e565b6140e481614f56565b614790614025565b61406e6150f8565b6147a0614025565b5f805160206160488339815191528361480c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161056e565b61271084111561482e5760405162461bcd60e51b815260040161056e90615e28565b858711156148965760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161056e565b5f8360ff16116149035760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161056e565b600a60ff841611156149755760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161056e565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149f06001600160a01b03841683615100565b905080515f14158015614a14575080806020019051810190614a12919061600c565b155b15610ab057604051635274afe760e01b81526001600160a01b038416600482015260240161056e565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614aa79190615669565b9050614abe6001600160a01b03851633308661510d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614b02573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b269190615669565b9050818111614b8c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161056e565b614b968282615d17565b95945050505050565b5f6060826080015151603014614c095760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161056e565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c8057614c40816001615d17565b614c4b906008615b1a565b5081515f90839083908110614c6257614c626158f5565b60200101906001600160f81b03191690815f1a905350600101614c2c565b505f5b6004811015614ce857614c97816003615d17565b614ca2906008615b1a565b600160ff919091161c60f81b82614cba8360026157f7565b81518110614cca57614cca6158f5565b60200101906001600160f81b03191690815f1a905350600101614c83565b505f5b6020811015614d455784518160208110614d0757614d076158f5565b1a60f81b82614d178360066157f7565b81518110614d2757614d276158f5565b60200101906001600160f81b03191690815f1a905350600101614ceb565b505f5b6020811015614da55784602001518160208110614d6757614d676158f5565b1a60f81b82614d778360266157f7565b81518110614d8757614d876158f5565b60200101906001600160f81b03191690815f1a905350600101614d48565b505f5b6008811015614e1957614dbc816007615d17565b614dc7906008615b1a565b60ff1685604001516001600160401b0316901c60f81b82826046614deb91906157f7565b81518110614dfb57614dfb6158f5565b60200101906001600160f81b03191690815f1a905350600101614da8565b505f5b6030811015614e845784608001518181518110614e3b57614e3b6158f5565b01602001516001600160f81b03191682614e5683604e6157f7565b81518110614e6657614e666158f5565b60200101906001600160f81b03191690815f1a905350600101614e1c565b505f5b6008811015614ef657614e9b816007615d17565b614ea6906008615b1a565b60608601516001600160401b0390811691161c60f81b82614ec883607e6157f7565b81518110614ed857614ed86158f5565b60200101906001600160f81b03191690815f1a905350600101614e87565b50600281604051614f079190615ae7565b602060405180830381855afa158015614f22573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f459190615669565b94909350915050565b61406e614025565b614f5e614025565b80355f8051602061608883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614faa6080840160608501615ea7565b60ff1611156150175760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161056e565b5f6150286080840160608501615ea7565b60ff16116150905760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161056e565b6150a06080830160608401615ea7565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556150d1606083016040840161547e565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61344f614025565b60606127d783835f615146565b6040516001600160a01b038481166024830152838116604483015260648201839052610a419186918216906323b872dd906084016141b5565b60608147101561516b5760405163cd78605960e01b815230600482015260240161056e565b5f80856001600160a01b031684866040516151869190615ae7565b5f6040518083038185875af1925050503d805f81146151c0576040519150601f19603f3d011682016040523d82523d5f602084013e6151c5565b606091505b50915091506151d58683836151df565b9695505050505050565b6060826151f4576151ef8261523b565b6127d7565b815115801561520b57506001600160a01b0384163b155b1561523457604051639996b31560e01b81526001600160a01b038516600482015260240161056e565b50806127d7565b80511561524b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461527090615b31565b5f825580601f1061527f575050565b601f0160209004905f5260205f20908101906140e491906152d7565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156152eb575f81556001016152d8565b5090565b80151581146140e4575f80fd5b803563ffffffff8116811461530f575f80fd5b919050565b5f805f60608486031215615326575f80fd5b833592506020840135615338816152ef565b9150615346604085016152fc565b90509250925092565b5f6020828403121561535f575f80fd5b5035919050565b5f8060408385031215615377575f80fd5b82359150615387602084016152fc565b90509250929050565b6001600160a01b03811681146140e4575f80fd5b5f808284036101608112156153b7575f80fd5b610140808212156153c6575f80fd5b84935083013590506153d781615390565b809150509250929050565b5f602082840312156153f2575f80fd5b6127d7826152fc565b5f806040838503121561540c575f80fd5b615415836152fc565b946020939093013593505050565b5f8060408385031215615434575f80fd5b82356001600160401b03811115615449575f80fd5b83016080818603121561545a575f80fd5b9150615387602084016152fc565b80356001600160401b038116811461530f575f80fd5b5f6020828403121561548e575f80fd5b6127d782615468565b5f80604083850312156154a8575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106154ee57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161552960608401826001600160401b03169052565b50608083015161554460808401826001600160401b03169052565b5060a083015161555f60a08401826001600160401b03169052565b5060c083015161557a60c08401826001600160401b03169052565b5092915050565b803561ffff8116811461530f575f80fd5b5f805f80608085870312156155a5575f80fd5b84356001600160401b038111156155ba575f80fd5b8501606081880312156155cb575f80fd5b93506155d960208601615581565b92506155e760408601615468565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561557a5761557a6155f7565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615679575f80fd5b5051919050565b5f5b8381101561569a578181015183820152602001615682565b50505f910152565b602081525f82518060208401526156c0816040850160208701615680565b601f01601f19169190910160400192915050565b60208082526028908201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660408201526730b634b230ba37b960c11b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6040820152686f742061637469766560b81b606082015260800190565b5f8261577f57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160401b0381811683821601908082111561557a5761557a6155f7565b60208082526033908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616040820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606082015260800190565b80820180821115610ac557610ac56155f7565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156158a5575f80fd5b81356127d781615390565b5f808335601e198436030181126158c5575f80fd5b8301803591506001600160401b038211156158de575f80fd5b6020019150600581901b36038213156125b0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261591d575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561595d5761595d615927565b60405290565b604051601f8201601f191681016001600160401b038111828210171561598b5761598b615927565b604052919050565b5f6001600160401b038211156159ab576159ab615927565b50601f01601f191660200190565b5f606082360312156159c9575f80fd5b6159d161593b565b8235815260206159e2818501615468565b8183015260408401356001600160401b038111156159fe575f80fd5b840136601f820112615a0e575f80fd5b8035615a21615a1c82615993565b615963565b8181523684838501011115615a34575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615aa9818460208a01615680565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615ad9816028840160208801615680565b016028019695505050505050565b5f825161591d818460208701615680565b5f63ffffffff808316818103615b1057615b106155f7565b6001019392505050565b8082028115828204841417610ac557610ac56155f7565b600181811c90821680615b4557607f821691505b602082108103615b6357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615bc281615b31565b806020870152604060018084165f8114615be35760018114615bff57615c2c565b60ff19851660408a0152604084151560051b8a01019550615c2c565b895f5260205f205f5b85811015615c235781548b8201860152908301908801615c08565b8a016040019650505b509398975050505050505050565b805161530f816152ef565b5f8060408385031215615c56575f80fd5b82516001600160401b0380821115615c6c575f80fd5b9084019060608287031215615c7f575f80fd5b615c8761593b565b82518152602080840151615c9a81615390565b82820152604084015183811115615caf575f80fd5b80850194505087601f850112615cc3575f80fd5b83519250615cd3615a1c84615993565b8381528882858701011115615ce6575f80fd5b615cf584838301848801615680565b80604084015250819550615d0a818801615c3a565b9450505050509250929050565b81810381811115610ac557610ac56155f7565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615e2057615e206155f7565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b03808316818103615b1057615b106155f7565b5f60208284031215615e9e575f80fd5b6127d782615581565b5f60208284031215615eb7575f80fd5b813560ff811681146127d7575f80fd5b5f808335601e19843603018112615edc575f80fd5b8301803591506001600160401b03821115615ef5575f80fd5b6020019150368190038213156125b0575f80fd5b601f821115610ab057805f5260205f20601f840160051c81016020851015615f2e5750805b601f840160051c820191505b81811015610dc8575f8155600101615f3a565b81516001600160401b03811115615f6657615f66615927565b615f7a81615f748454615b31565b84615f09565b602080601f831160018114615fad575f8415615f965750858301515b5f19600386901b1c1916600185901b178555616004565b5f85815260208120601f198616915b82811015615fdb57888601518255948401946001909101908401615fbc565b5085821015615ff857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561601c575f80fd5b81516127d7816152ef56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go index 91ecf9442..b2acca76d 100644 --- a/abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validatorManager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615edc380380615edc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615d8f8061014d5f395ff3fe6080604052600436106101af575f3560e01c806361e2f490116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f14610504578063c974d1b614610517578063d5f20ff61461052b578063df93d8de14610557575f80fd5b8063b771b3bc146104ac578063ba3a4b97146104c6578063bee0a03f146104e5575f80fd5b806376f78621116100c257806376f786211461043b5780638280a25a1461045a57806398f3e2b41461046e578063a3a65e481461048d575f80fd5b806361e2f490146103de57806362065856146103fd57806366435abf1461041c575f80fd5b8063329c3e121161015257806340034a931161012d57806340034a9314610364578063467ef06f146103775780635297fae61461039657806360305d62146103b5575f80fd5b8063329c3e12146102eb57806335455ded1461031d5780633a1cfff614610345575f80fd5b8063151d30d11161018d578063151d30d1146102505780631f7a9d8f1461027657806325e1c776146102955780632e2194d8146102b4575f80fd5b80630118acc4146101b35780630322ed98146101d45780630cdd0985146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd36600461504c565b61056d565b005b3480156101df575f80fd5b506101d26101ee366004615087565b6109e2565b3480156101fe575f80fd5b5061023d61020d366004615087565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b34801561025b575f80fd5b50610264600a81565b60405160ff9091168152602001610247565b348015610281575f80fd5b506101d261029036600461509e565b610b9b565b3480156102a0575f80fd5b506101d26102af3660046150b5565b610c78565b3480156102bf575f80fd5b506102d36102ce366004615087565b610ce6565b6040516001600160401b039091168152602001610247565b3480156102f6575f80fd5b506103056001600160991b0181565b6040516001600160a01b039091168152602001610247565b348015610328575f80fd5b5061033261271081565b60405161ffff9091168152602001610247565b348015610350575f80fd5b506101d261035f36600461504c565b610cfc565b61023d610372366004615106565b610e81565b348015610382575f80fd5b506101d261039136600461515a565b610eb5565b3480156103a1575f80fd5b506101d26103b0366004615173565b610f55565b3480156103c0575f80fd5b506103c9601481565b60405163ffffffff9091168152602001610247565b3480156103e9575f80fd5b506101d26103f836600461519b565b61112a565b348015610408575f80fd5b5061023d6104173660046151e0565b61175e565b348015610427575f80fd5b506102d3610436366004615087565b611777565b348015610446575f80fd5b506101d261045536600461504c565b61178b565b348015610465575f80fd5b50610264603081565b348015610479575f80fd5b506101d2610488366004615173565b611979565b348015610498575f80fd5b506101d26104a736600461515a565b611bfb565b3480156104b7575f80fd5b506103056005600160991b0181565b3480156104d1575f80fd5b506101d26104e0366004615087565b611db3565b3480156104f0575f80fd5b506101d26104ff366004615087565b612039565b61023d610512366004615087565b612148565b348015610522575f80fd5b50610264601481565b348015610536575f80fd5b5061054a610545366004615087565b612179565b604051610247919061520d565b348015610562575f80fd5b506102d36202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615ce3833981519152949193919290829060ff1660048111156105d5576105d56151f9565b60048111156105e6576105e66151f9565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61066283612179565b9050600282516004811115610679576106796151f9565b146106cb5760405162461bcd60e51b815260206004820152602a60248201525f80516020615d038339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146107305760405162461bcd60e51b815260206004820152603360248201525f80516020615d038339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106c2565b6003825280515f90600290600581111561074c5761074c6151f9565b036107a3578615610764576107618487612241565b90505b5f8360600151836080015161077991906152d7565b90506107858582612596565b506001600160401b0390811660e0860152421660a0850152506107d7565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561080a856060015161175e565b8460a0015186608001518760a00151865f806040518863ffffffff1660e01b815260040161083e97969594939291906152f7565b602060405180830381865afa158015610859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087d9190615335565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108bc576108bc6151f9565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109d0916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615d638339815191526020526040808220815160e0810190925280545f80516020615d2383398151915293929190829060ff166005811115610a2f57610a2f6151f9565b6005811115610a4057610a406151f9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aaf57610aaf6151f9565b14610b145760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106c2565b6005600160991b016001600160a01b031663ee5b48eb610b398584606001515f6126ed565b6040518263ffffffff1660e01b8152600401610b55919061536e565b6020604051808303815f875af1158015610b71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b959190615335565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610be4575080546001600160401b03808416911610155b15610c025760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c2c83612912565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610c8182612926565b610c9d5760405162461bcd60e51b81526004016106c2906153a0565b6002610ca883612179565b516005811115610cba57610cba6151f9565b14610cd75760405162461bcd60e51b81526004016106c2906153e8565b610ce18282612241565b505050565b5f610cf664e8d4a5100083615431565b92915050565b5f80516020615ce38339815191525f610d1485612961565b5f86815260058401602052604090205460a0820151919250610d4791600160b01b9091046001600160401b031690615450565b6001600160401b03168160c001516001600160401b03161015610d7c5760405162461bcd60e51b81526004016106c290615470565b5f8415610d9457610d8d8685612241565b9050610daf565b505f8581526009830160205260409020546001600160401b03165b8260040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5610de2846040015161175e565b60a085015160c08601516040516001600160e01b031960e086901b168152610e16939291829188905f9081906004016152f7565b602060405180830381865afa158015610e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e559190615335565b5f87815260088501602052604081208054909190610e749084906154c3565b9091555050505050505050565b5f610e8a612bdc565b610e9684848434612c13565b9050610eae60015f80516020615d4383398151915255565b9392505050565b5f80516020615ce38339815191525f80610ece84612e90565b91509150610edb82612926565b610ee55750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610f1357610f136151f9565b03610f38575f83815260088501602052604081208054919055610f3682826131da565b505b610f4e81610f49846040015161175e565b613240565b5050505050565b5f80516020615ce38339815191525f610f6d84613253565b90505f80610f7e836040015161342d565b50915091505f610f8d83612179565b9050816001600160401b031681606001516001600160401b03161015610fc55760405162461bcd60e51b81526004016106c2906154d6565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b90920416111561100a5760405162461bcd60e51b81526004016106c290615518565b60015f87815260068701602052604090205460ff166004811115611030576110306151f9565b146110995760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106c2565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615d238339815191529060ff16156111c75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106c2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122e9190615335565b8360200135146112905760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106c2565b306112a16060850160408601615575565b6001600160a01b0316146113135760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106c2565b5f6113216060850185615590565b91505f905084356020860135601461133f6060890160408a01615575565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561166e575f6113bf6060890189615590565b8363ffffffff168181106113d5576113d56155d5565b90506020028101906113e791906155e9565b6113f090615699565b80515f81815260098901602052604090205491925090156114235760405162461bcd60e51b81526004016106c290615730565b84825f0151836020015184604001516040516020016114459493929190615778565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161149391906157c7565b602060405180830381855afa1580156114ae573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114d19190615335565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561155d5761155d6151f9565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516116109116866154c3565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611667906157d8565b90506113a3565b50600584018190555f61168086613253565b90505f6116908260400151613668565b9050806002856040516116a391906157c7565b602060405180830381855afa1580156116be573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906116e19190615335565b146117455760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106c2565b505050600a909201805460ff1916600117905550505050565b5f610cf66001600160401b03831664e8d4a510006157fa565b5f61178182612179565b6080015192915050565b5f80516020615ce38339815191525f6117a385612961565b5f86815260058401602052604090205460a08201519192506117d691600160b01b9091046001600160401b031690615450565b6001600160401b03168160c001516001600160401b0316101561180b5760405162461bcd60e51b81526004016106c290615470565b5f84156118235761181c8685612241565b905061183e565b505f8581526009830160205260409020546001600160401b03165b600483015460408301515f91600160401b90046001600160a01b03169063778c06b59061186a9061175e565b60a086015160c08701516040516001600160e01b031960e086901b16815261189e939291829189905f9081906004016152f7565b602060405180830381865afa1580156118b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dd9190615335565b90505f811161194c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e20604482015274696e656c6967626c6520666f72207265776172647360581b60648201526084016106c2565b5f8781526008850160205260408120805483929061196b9084906154c3565b909155505050505050505050565b611981612bdc565b5f80516020615ce38339815191525f61199984613253565b90505f806119aa836040015161342d565b50915091505f6119b983612179565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119f3576119f36151f9565b6004811115611a0457611a046151f9565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e09092019190915284015191925084811691161015611aa35760405162461bcd60e51b81526004016106c2906154d6565b826001600160401b03168160e001516001600160401b03161115611ad95760405162461bcd60e51b81526004016106c290615518565b600381516004811115611aee57611aee6151f9565b14611b425760405162461bcd60e51b815260206004820152603160248201525f80516020615d038339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106c2565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a0190925290912054611b7891906131da565b856007015f8881526020019081526020015f205f9055611ba38160200151610f49836060015161175e565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050611bf760015f80516020615d4383398151915255565b5050565b5f80516020615d238339815191525f611c1383613253565b90505f80611c2483604001516137d1565b9150915080611c865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106c2565b5f82815260078501602052604081208054611ca090615811565b9050118015611cd2575060015f83815260088601602052604090205460ff166005811115611cd057611cd06151f9565b145b611cee5760405162461bcd60e51b81526004016106c290615843565b5f8281526007850160205260408120611d0691614fa1565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ce383398151915293929190829060ff166004811115611e1457611e146151f9565b6004811115611e2557611e256151f9565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611eac57611eac6151f9565b1480611eca5750600381516004811115611ec857611ec86151f9565b145b611f1e5760405162461bcd60e51b815260206004820152603260248201525f80516020615d03833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106c2565b5f611f2c8260400151612179565b905080606001516001600160401b03165f03611fb05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106c2565b6005600160991b016001600160a01b031663ee5b48eb611fdd8460400151846060015185608001516126ed565b6040518263ffffffff1660e01b8152600401611ff9919061536e565b6020604051808303815f875af1158015612015573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4e9190615335565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615d2383398151915292919061208190615811565b90501180156120b3575060015f83815260088301602052604090205460ff1660058111156120b1576120b16151f9565b145b6120cf5760405162461bcd60e51b81526004016106c290615843565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612108919060040161588a565b6020604051808303815f875af1158015612124573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce19190615335565b5f612151612bdc565b61215c823334613972565b905061217460015f80516020615d4383398151915255565b919050565b612181614fd8565b5f8281525f80516020615d63833981519152602052604090819020815160e0810190925280545f80516020615d23833981519152929190829060ff1660058111156121ce576121ce6151f9565b60058111156121df576121df6151f9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561228c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b3919081019061591f565b91509150806123165760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106c2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612359573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237d9190615335565b8251146123e15760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106c2565b60208201516001600160a01b0316156124575760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106c2565b5f806124668460400151613ca6565b915091508187146124d35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106c2565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0960205260409020545f80516020615ce3833981519152906001600160401b03908116908316111561254d575f8881526009820160205260409020805467ffffffffffffffff19166001600160401b0384161790555b6040516001600160401b038316815288907fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d04359060200160405180910390a2509695505050505050565b5f8281525f80516020615d63833981519152602052604081206002015481905f80516020615d2383398151915290600160801b90046001600160401b03166125de8582613e7e565b5f6125e88761408c565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6126388a858b6126ed565b6040518263ffffffff1660e01b8152600401612654919061536e565b6020604051808303815f875af1158015612670573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126949190615335565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612766576127268160016159f1565b6127319060086157fa565b5081515f90839083908110612748576127486155d5565b60200101906001600160f81b03191690815f1a905350600101612712565b505f5b60048110156127d15761277d8160036159f1565b6127889060086157fa565b600263ffffffff16901c60f81b828260026127a391906154c3565b815181106127b3576127b36155d5565b60200101906001600160f81b03191690815f1a905350600101612769565b505f5b6020811015612833576127e881601f6159f1565b6127f39060086157fa565b86901c60f81b826128058360066154c3565b81518110612815576128156155d5565b60200101906001600160f81b03191690815f1a9053506001016127d4565b505f5b600881101561289e5761284a8160076159f1565b6128559060086157fa565b6001600160401b038616901c60f81b826128708360266154c3565b81518110612880576128806155d5565b60200101906001600160f81b03191690815f1a905350600101612836565b505f5b6008811015612909576128b58160076159f1565b6128c09060086157fa565b6001600160401b038516901c60f81b826128db83602e6154c3565b815181106128eb576128eb6155d5565b60200101906001600160f81b03191690815f1a9053506001016128a1565b50949350505050565b61291a61411c565b61292381614167565b50565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b612969614fd8565b5f8281525f80516020615d638339815191526020526040808220815160e0810190925280545f80516020615d2383398151915293929190829060ff1660058111156129b6576129b66151f9565b60058111156129c7576129c76151f9565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612a3957612a396151f9565b14612a955760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106c2565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff19166001836005811115612ad957612ad96151f9565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612b858582612596565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615d43833981519152805460011901612c0d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ce38339815191529061ffff861610801590612c5f575061271061ffff861611155b612c7b5760405162461bcd60e51b81526004016106c290615a04565b60028101546001600160401b039081169085161015612cf45760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106c2565b8054831015612d575760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106c2565b8060010154831115612dbe5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106c2565b825f612dc982610ce6565b90505f612dd689836141db565b90506040518060600160405280612dea3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615d4383398151915255565b5f612e99614fd8565b5f80516020615d238339815191525f612eb185613253565b90505f80612ec283604001516137d1565b915091508015612f275760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106c2565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612f5857612f586151f9565b6005811115612f6957612f696151f9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612fda57612fda6151f9565b1480612ff85750600182516005811115612ff657612ff66151f9565b145b6130575760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106c2565b60038251600581111561306c5761306c6151f9565b036130795750600461307d565b5060055b6020808301515f908152600988019091526040812055818160058111156130a6576130a66151f9565b908160058111156130b9576130b96151f9565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156130ed576130ed6151f9565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156131a1576131a16151f9565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015613226575f80fd5b505af1158015613238573d5f803e3d5ffd5b505050505050565b611bf76001600160a01b03831682614740565b60408051606080820183525f8083526020830181905292820152905f80516020615d238339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156132c8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526132ef919081019061591f565b915091508061334f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106c2565b82548251146133b25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106c2565b60208201516001600160a01b0316156134255760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106c2565b509392505050565b5f805f83516036146134515760405162461bcd60e51b81526004016106c290615a4f565b5f805b60028110156134a0576134688160016159f1565b6134739060086157fa565b61ffff16868281518110613489576134896155d5565b016020015160f81c901b9190911790600101613454565b5061ffff8116156134c35760405162461bcd60e51b81526004016106c290615a98565b5f805b600481101561351e576134da8160036159f1565b6134e59060086157fa565b63ffffffff16876134f78360026154c3565b81518110613507576135076155d5565b016020015160f81c901b91909117906001016134c6565b5063ffffffff81166004146135455760405162461bcd60e51b81526004016106c290615adb565b5f805b602081101561359a5761355c81601f6159f1565b6135679060086157fa565b886135738360066154c3565b81518110613583576135836155d5565b016020015160f81c901b9190911790600101613548565b505f805b60088110156135f9576135b28160076159f1565b6135bd9060086157fa565b6001600160401b0316896135d28360266154c3565b815181106135e2576135e26155d5565b016020015160f81c901b919091179060010161359e565b505f805b6008811015613658576136118160076159f1565b61361c9060086157fa565b6001600160401b03168a61363183602e6154c3565b81518110613641576136416155d5565b016020015160f81c901b91909117906001016135fd565b5091989097509095509350505050565b5f815160261461368a5760405162461bcd60e51b81526004016106c290615a4f565b5f805b60028110156136d9576136a18160016159f1565b6136ac9060086157fa565b61ffff168482815181106136c2576136c26155d5565b016020015160f81c901b919091179060010161368d565b5061ffff8116156136fc5760405162461bcd60e51b81526004016106c290615a98565b5f805b6004811015613757576137138160036159f1565b61371e9060086157fa565b63ffffffff16856137308360026154c3565b81518110613740576137406155d5565b016020015160f81c901b91909117906001016136ff565b5063ffffffff81161561377c5760405162461bcd60e51b81526004016106c290615adb565b5f805b60208110156129095761379381601f6159f1565b61379e9060086157fa565b866137aa8360066154c3565b815181106137ba576137ba6155d5565b016020015160f81c901b919091179060010161377f565b5f8082516027146137f45760405162461bcd60e51b81526004016106c290615a4f565b5f805b60028110156138435761380b8160016159f1565b6138169060086157fa565b61ffff1685828151811061382c5761382c6155d5565b016020015160f81c901b91909117906001016137f7565b5061ffff8116156138665760405162461bcd60e51b81526004016106c290615a98565b5f805b60048110156138c15761387d8160036159f1565b6138889060086157fa565b63ffffffff168661389a8360026154c3565b815181106138aa576138aa6155d5565b016020015160f81c901b9190911790600101613869565b5063ffffffff81166003146138e85760405162461bcd60e51b81526004016106c290615adb565b5f805b602081101561393d576138ff81601f6159f1565b61390a9060086157fa565b876139168360066154c3565b81518110613926576139266155d5565b016020015160f81c901b91909117906001016138eb565b505f86602681518110613952576139526155d5565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ce38339815191528161398b84610ce6565b90505f61399787612179565b90506139a287612926565b6139be5760405162461bcd60e51b81526004016106c2906153a0565b6002815160058111156139d3576139d36151f9565b146139f05760405162461bcd60e51b81526004016106c2906153e8565b5f828260800151613a019190615450565b60048501546040840151919250613a23916001600160401b0390911690615b22565b6001600160401b0316816001600160401b03161115613aa25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106c2565b5f80613aae8a84612596565b915091505f8a83604051602001613adc92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b7757613b776151f9565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613cc95760405162461bcd60e51b81526004016106c290615a4f565b5f805b6002811015613d1857613ce08160016159f1565b613ceb9060086157fa565b61ffff16858281518110613d0157613d016155d5565b016020015160f81c901b9190911790600101613ccc565b5061ffff811615613d3b5760405162461bcd60e51b81526004016106c290615a98565b5f805b6004811015613d9657613d528160036159f1565b613d5d9060086157fa565b63ffffffff1686613d6f8360026154c3565b81518110613d7f57613d7f6155d5565b016020015160f81c901b9190911790600101613d3e565b5063ffffffff8116600514613dbd5760405162461bcd60e51b81526004016106c290615adb565b5f805b6020811015613e1257613dd481601f6159f1565b613ddf9060086157fa565b87613deb8360066154c3565b81518110613dfb57613dfb6155d5565b016020015160f81c901b9190911790600101613dc0565b505f805b6008811015613e7157613e2a8160076159f1565b613e359060086157fa565b6001600160401b031688613e4a8360266154c3565b81518110613e5a57613e5a6155d5565b016020015160f81c901b9190911790600101613e16565b5090969095509350505050565b5f80516020615d238339815191525f6001600160401b038084169085161115613eb257613eab83856152d7565b9050613ebf565b613ebc84846152d7565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613f21575060028401548151613f1d916001600160401b0316906154c3565b8210155b15613f47576001600160401b038316606082015281815260408101516020820152613f66565b8281606001818151613f599190615450565b6001600160401b03169052505b6060810151613f76906064615b22565b602082015160028601546001600160401b039290921691613fa19190600160401b900460ff166157fa565b10156140055760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106c2565b856001600160401b03168160400181815161402091906154c3565b9052506040810180516001600160401b03871691906140409083906159f1565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d638339815191526020526040812060020180545f80516020615d2383398151915291600160401b9091046001600160401b03169060086140d683615b4d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661416557604051631afcd79f60e31b815260040160405180910390fd5b565b61416f61411c565b614178816147d3565b6141806147ec565b612923608082013560a083013561419d60e0850160c086016151e0565b6141ae610100860160e08701615b68565b61ffff166141c461012087016101008801615b81565b6141d661014088016101208901615575565b6147fc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142665760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106c2565b5f80516020615d238339815191524261428560408601602087016151e0565b6001600160401b0316116142f75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106c2565b61430760408501602086016151e0565b6001600160401b031661431d6202a300426154c3565b116143905760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106c2565b83356143e85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106c2565b83355f908152600982016020526040902054156144175760405162461bcd60e51b81526004016106c290615730565b60306144266040860186615ba1565b90501461448b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106c2565b614495835f613e7e565b5f8061452f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144da91906151e0565b6001600160401b031681526020016144f560408a018a615ba1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a40565b5f8281526007860160205260409020919350915061454d8282615c27565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061457a90859060040161536e565b6020604051808303815f875af1158015614596573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145ba9190615335565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614632576146326151f9565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614712918e01908e016151e0565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147635760405163cd78605960e01b81523060048201526024016106c2565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146147ac576040519150601f19603f3d011682016040523d82523d5f602084013e6147b1565b606091505b5050905080610ce157604051630a12f52160e11b815260040160405180910390fd5b6147db61411c565b6147e3614def565b61292381614df7565b6147f461411c565b614165614f99565b61480461411c565b5f80516020615ce3833981519152836148705760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106c2565b6127108411156148925760405162461bcd60e51b81526004016106c290615a04565b858711156148fa5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106c2565b5f8360ff16116149675760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106c2565b600a60ff841611156149d95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106c2565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614aaa5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106c2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614b2157614ae18160016159f1565b614aec9060086157fa565b5081515f90839083908110614b0357614b036155d5565b60200101906001600160f81b03191690815f1a905350600101614acd565b505f5b6004811015614b8957614b388160036159f1565b614b439060086157fa565b600160ff919091161c60f81b82614b5b8360026154c3565b81518110614b6b57614b6b6155d5565b60200101906001600160f81b03191690815f1a905350600101614b24565b505f5b6020811015614be65784518160208110614ba857614ba86155d5565b1a60f81b82614bb88360066154c3565b81518110614bc857614bc86155d5565b60200101906001600160f81b03191690815f1a905350600101614b8c565b505f5b6020811015614c465784602001518160208110614c0857614c086155d5565b1a60f81b82614c188360266154c3565b81518110614c2857614c286155d5565b60200101906001600160f81b03191690815f1a905350600101614be9565b505f5b6008811015614cba57614c5d8160076159f1565b614c689060086157fa565b60ff1685604001516001600160401b0316901c60f81b82826046614c8c91906154c3565b81518110614c9c57614c9c6155d5565b60200101906001600160f81b03191690815f1a905350600101614c49565b505f5b6030811015614d255784608001518181518110614cdc57614cdc6155d5565b01602001516001600160f81b03191682614cf783604e6154c3565b81518110614d0757614d076155d5565b60200101906001600160f81b03191690815f1a905350600101614cbd565b505f5b6008811015614d9757614d3c8160076159f1565b614d479060086157fa565b60608601516001600160401b0390811691161c60f81b82614d6983607e6154c3565b81518110614d7957614d796155d5565b60200101906001600160f81b03191690815f1a905350600101614d28565b50600281604051614da891906157c7565b602060405180830381855afa158015614dc3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614de69190615335565b94909350915050565b61416561411c565b614dff61411c565b80355f80516020615d2383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e4b6080840160608501615b81565b60ff161115614eb85760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106c2565b5f614ec96080840160608501615b81565b60ff1611614f315760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106c2565b614f416080830160608401615b81565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f7260608301604084016151e0565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612e7d61411c565b508054614fad90615811565b5f825580601f10614fbc575050565b601f0160209004905f5260205f20908101906129239190615014565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615028575f8155600101615015565b5090565b8015158114612923575f80fd5b803563ffffffff81168114612174575f80fd5b5f805f6060848603121561505e575f80fd5b8335925060208401356150708161502c565b915061507e60408501615039565b90509250925092565b5f60208284031215615097575f80fd5b5035919050565b5f61014082840312156150af575f80fd5b50919050565b5f80604083850312156150c6575f80fd5b823591506150d660208401615039565b90509250929050565b803561ffff81168114612174575f80fd5b80356001600160401b0381168114612174575f80fd5b5f805f60608486031215615118575f80fd5b83356001600160401b0381111561512d575f80fd5b84016060818703121561513e575f80fd5b925061514c602085016150df565b915061507e604085016150f0565b5f6020828403121561516a575f80fd5b610eae82615039565b5f8060408385031215615184575f80fd5b61518d83615039565b946020939093013593505050565b5f80604083850312156151ac575f80fd5b82356001600160401b038111156151c1575f80fd5b8301608081860312156151d2575f80fd5b91506150d660208401615039565b5f602082840312156151f0575f80fd5b610eae826150f0565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061523057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161526b60608401826001600160401b03169052565b50608083015161528660808401826001600160401b03169052565b5060a08301516152a160a08401826001600160401b03169052565b5060c08301516152bc60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156152bc576152bc6152c3565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615345575f80fd5b5051919050565b5f5b8381101561536657818101518382015260200161534e565b50505f910152565b602081525f825180602084015261538c81604085016020870161534c565b601f01601f19169190910160400192915050565b60208082526028908201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660408201526730b634b230ba37b960c11b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6040820152686f742061637469766560b81b606082015260800190565b5f8261544b57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160401b038181168382160190808211156152bc576152bc6152c3565b60208082526033908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616040820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606082015260800190565b80820180821115610cf657610cf66152c3565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612923575f80fd5b5f60208284031215615585575f80fd5b8135610eae81615561565b5f808335601e198436030181126155a5575f80fd5b8301803591506001600160401b038211156155be575f80fd5b6020019150600581901b36038213156126e6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126155fd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561563d5761563d615607565b60405290565b604051601f8201601f191681016001600160401b038111828210171561566b5761566b615607565b604052919050565b5f6001600160401b0382111561568b5761568b615607565b50601f01601f191660200190565b5f606082360312156156a9575f80fd5b6156b161561b565b8235815260206156c28185016150f0565b8183015260408401356001600160401b038111156156de575f80fd5b840136601f8201126156ee575f80fd5b80356157016156fc82615673565b615643565b8181523684838501011115615714575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615789818460208a0161534c565b80830190508581526001600160401b0360c01b8560c01b16602082015283516157b981602884016020880161534c565b016028019695505050505050565b5f82516155fd81846020870161534c565b5f63ffffffff8083168181036157f0576157f06152c3565b6001019392505050565b8082028115828204841417610cf657610cf66152c3565b600181811c9082168061582557607f821691505b6020821081036150af57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461589c81615811565b806020870152604060018084165f81146158bd57600181146158d957615906565b60ff19851660408a0152604084151560051b8a01019550615906565b895f5260205f205f5b858110156158fd5781548b82018601529083019088016158e2565b8a016040019650505b509398975050505050505050565b80516121748161502c565b5f8060408385031215615930575f80fd5b82516001600160401b0380821115615946575f80fd5b9084019060608287031215615959575f80fd5b61596161561b565b8251815260208084015161597481615561565b82820152604084015183811115615989575f80fd5b80850194505087601f85011261599d575f80fd5b835192506159ad6156fc84615673565b83815288828587010111156159c0575f80fd5b6159cf8483830184880161534c565b806040840152508195506159e4818801615914565b9450505050509250929050565b81810381811115610cf657610cf66152c3565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615b4557615b456152c3565b505092915050565b5f6001600160401b038083168181036157f0576157f06152c3565b5f60208284031215615b78575f80fd5b610eae826150df565b5f60208284031215615b91575f80fd5b813560ff81168114610eae575f80fd5b5f808335601e19843603018112615bb6575f80fd5b8301803591506001600160401b03821115615bcf575f80fd5b6020019150368190038213156126e6575f80fd5b601f821115610ce157805f5260205f20601f840160051c81016020851015615c085750805b601f840160051c820191505b81811015610f4e575f8155600101615c14565b81516001600160401b03811115615c4057615c40615607565b615c5481615c4e8454615811565b84615be3565b602080601f831160018114615c87575f8415615c705750858301515b5f19600386901b1c1916600185901b178555613238565b5f85815260208120601f198616915b82811015615cb557888601518255948401946001909101908401615c96565b5085821015615cd257878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615efc380380615efc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615daf8061014d5f395ff3fe6080604052600436106101af575f3560e01c806361e2f490116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f14610504578063c974d1b614610517578063d5f20ff61461052b578063df93d8de14610557575f80fd5b8063b771b3bc146104ac578063ba3a4b97146104c6578063bee0a03f146104e5575f80fd5b806376f78621116100c257806376f786211461043b5780638280a25a1461045a57806398f3e2b41461046e578063a3a65e481461048d575f80fd5b806361e2f490146103de57806362065856146103fd57806366435abf1461041c575f80fd5b8063329c3e121161015257806340034a931161012d57806340034a9314610364578063467ef06f146103775780635297fae61461039657806360305d62146103b5575f80fd5b8063329c3e12146102eb57806335455ded1461031d5780633a1cfff614610345575f80fd5b8063151d30d11161018d578063151d30d1146102505780631f7a9d8f1461027657806325e1c776146102955780632e2194d8146102b4575f80fd5b80630118acc4146101b35780630322ed98146101d45780630cdd0985146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd36600461506c565b61056d565b005b3480156101df575f80fd5b506101d26101ee3660046150a7565b6109e2565b3480156101fe575f80fd5b5061023d61020d3660046150a7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b34801561025b575f80fd5b50610264600a81565b60405160ff9091168152602001610247565b348015610281575f80fd5b506101d26102903660046150be565b610b9b565b3480156102a0575f80fd5b506101d26102af3660046150d5565b610c78565b3480156102bf575f80fd5b506102d36102ce3660046150a7565b610ce6565b6040516001600160401b039091168152602001610247565b3480156102f6575f80fd5b506103056001600160991b0181565b6040516001600160a01b039091168152602001610247565b348015610328575f80fd5b5061033261271081565b60405161ffff9091168152602001610247565b348015610350575f80fd5b506101d261035f36600461506c565b610cfc565b61023d610372366004615126565b610e81565b348015610382575f80fd5b506101d261039136600461517a565b610eb5565b3480156103a1575f80fd5b506101d26103b0366004615193565b610f55565b3480156103c0575f80fd5b506103c9601481565b60405163ffffffff9091168152602001610247565b3480156103e9575f80fd5b506101d26103f83660046151bb565b61112a565b348015610408575f80fd5b5061023d610417366004615200565b61175e565b348015610427575f80fd5b506102d36104363660046150a7565b611777565b348015610446575f80fd5b506101d261045536600461506c565b61178b565b348015610465575f80fd5b50610264603081565b348015610479575f80fd5b506101d2610488366004615193565b611979565b348015610498575f80fd5b506101d26104a736600461517a565b611bfb565b3480156104b7575f80fd5b506103056005600160991b0181565b3480156104d1575f80fd5b506101d26104e03660046150a7565b611db3565b3480156104f0575f80fd5b506101d26104ff3660046150a7565b612039565b61023d6105123660046150a7565b612148565b348015610522575f80fd5b50610264601481565b348015610536575f80fd5b5061054a6105453660046150a7565b612179565b604051610247919061522d565b348015610562575f80fd5b506102d36202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615d03833981519152949193919290829060ff1660048111156105d5576105d5615219565b60048111156105e6576105e6615219565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61066283612179565b905060028251600481111561067957610679615219565b146106cb5760405162461bcd60e51b815260206004820152602a60248201525f80516020615d238339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146107305760405162461bcd60e51b815260206004820152603360248201525f80516020615d238339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106c2565b6003825280515f90600290600581111561074c5761074c615219565b036107a3578615610764576107618487612241565b90505b5f8360600151836080015161077991906152f7565b905061078585826125b6565b506001600160401b0390811660e0860152421660a0850152506107d7565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561080a856060015161175e565b8460a0015186608001518760a00151865f806040518863ffffffff1660e01b815260040161083e9796959493929190615317565b602060405180830381865afa158015610859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087d9190615355565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108bc576108bc615219565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109d0916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615d838339815191526020526040808220815160e0810190925280545f80516020615d4383398151915293929190829060ff166005811115610a2f57610a2f615219565b6005811115610a4057610a40615219565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aaf57610aaf615219565b14610b145760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106c2565b6005600160991b016001600160a01b031663ee5b48eb610b398584606001515f61270d565b6040518263ffffffff1660e01b8152600401610b55919061538e565b6020604051808303815f875af1158015610b71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b959190615355565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610be4575080546001600160401b03808416911610155b15610c025760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c2c83612932565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610c8182612946565b610c9d5760405162461bcd60e51b81526004016106c2906153c0565b6002610ca883612179565b516005811115610cba57610cba615219565b14610cd75760405162461bcd60e51b81526004016106c290615408565b610ce18282612241565b505050565b5f610cf664e8d4a5100083615451565b92915050565b5f80516020615d038339815191525f610d1485612981565b5f86815260058401602052604090205460a0820151919250610d4791600160b01b9091046001600160401b031690615470565b6001600160401b03168160c001516001600160401b03161015610d7c5760405162461bcd60e51b81526004016106c290615490565b5f8415610d9457610d8d8685612241565b9050610daf565b505f8581526009830160205260409020546001600160401b03165b8260040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5610de2846040015161175e565b60a085015160c08601516040516001600160e01b031960e086901b168152610e16939291829188905f908190600401615317565b602060405180830381865afa158015610e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e559190615355565b5f87815260088501602052604081208054909190610e749084906154e3565b9091555050505050505050565b5f610e8a612bfc565b610e9684848434612c33565b9050610eae60015f80516020615d6383398151915255565b9392505050565b5f80516020615d038339815191525f80610ece84612eb0565b91509150610edb82612946565b610ee55750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610f1357610f13615219565b03610f38575f83815260088501602052604081208054919055610f3682826131fa565b505b610f4e81610f49846040015161175e565b613260565b5050505050565b5f80516020615d038339815191525f610f6d84613273565b90505f80610f7e836040015161344d565b50915091505f610f8d83612179565b9050816001600160401b031681606001516001600160401b03161015610fc55760405162461bcd60e51b81526004016106c2906154f6565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b90920416111561100a5760405162461bcd60e51b81526004016106c290615538565b60015f87815260068701602052604090205460ff16600481111561103057611030615219565b146110995760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106c2565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615d438339815191529060ff16156111c75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106c2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561120a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122e9190615355565b8360200135146112905760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106c2565b306112a16060850160408601615595565b6001600160a01b0316146113135760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106c2565b5f61132160608501856155b0565b91505f905084356020860135601461133f6060890160408a01615595565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561166e575f6113bf60608901896155b0565b8363ffffffff168181106113d5576113d56155f5565b90506020028101906113e79190615609565b6113f0906156b9565b80515f81815260098901602052604090205491925090156114235760405162461bcd60e51b81526004016106c290615750565b84825f0151836020015184604001516040516020016114459493929190615798565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161149391906157e7565b602060405180830381855afa1580156114ae573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114d19190615355565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561155d5761155d615219565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516116109116866154e3565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611667906157f8565b90506113a3565b50600584018190555f61168086613273565b90505f6116908260400151613688565b9050806002856040516116a391906157e7565b602060405180830381855afa1580156116be573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906116e19190615355565b146117455760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106c2565b505050600a909201805460ff1916600117905550505050565b5f610cf66001600160401b03831664e8d4a5100061581a565b5f61178182612179565b6080015192915050565b5f80516020615d038339815191525f6117a385612981565b5f86815260058401602052604090205460a08201519192506117d691600160b01b9091046001600160401b031690615470565b6001600160401b03168160c001516001600160401b0316101561180b5760405162461bcd60e51b81526004016106c290615490565b5f84156118235761181c8685612241565b905061183e565b505f8581526009830160205260409020546001600160401b03165b600483015460408301515f91600160401b90046001600160a01b03169063778c06b59061186a9061175e565b60a086015160c08701516040516001600160e01b031960e086901b16815261189e939291829189905f908190600401615317565b602060405180830381865afa1580156118b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118dd9190615355565b90505f811161194c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e20604482015274696e656c6967626c6520666f72207265776172647360581b60648201526084016106c2565b5f8781526008850160205260408120805483929061196b9084906154e3565b909155505050505050505050565b611981612bfc565b5f80516020615d038339815191525f61199984613273565b90505f806119aa836040015161344d565b50915091505f6119b983612179565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119f3576119f3615219565b6004811115611a0457611a04615219565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e09092019190915284015191925084811691161015611aa35760405162461bcd60e51b81526004016106c2906154f6565b826001600160401b03168160e001516001600160401b03161115611ad95760405162461bcd60e51b81526004016106c290615538565b600381516004811115611aee57611aee615219565b14611b425760405162461bcd60e51b815260206004820152603160248201525f80516020615d238339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106c2565b5f8781526006870160209081526040808320805460ff191660041790558382015160078a0190925290912054611b7891906131fa565b856007015f8881526020019081526020015f205f9055611ba38160200151610f49836060015161175e565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a4505050505050611bf760015f80516020615d6383398151915255565b5050565b5f80516020615d438339815191525f611c1383613273565b90505f80611c2483604001516137f1565b9150915080611c865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106c2565b5f82815260078501602052604081208054611ca090615831565b9050118015611cd2575060015f83815260088601602052604090205460ff166005811115611cd057611cd0615219565b145b611cee5760405162461bcd60e51b81526004016106c290615863565b5f8281526007850160205260408120611d0691614fc1565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615d0383398151915293929190829060ff166004811115611e1457611e14615219565b6004811115611e2557611e25615219565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611eac57611eac615219565b1480611eca5750600381516004811115611ec857611ec8615219565b145b611f1e5760405162461bcd60e51b815260206004820152603260248201525f80516020615d23833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106c2565b5f611f2c8260400151612179565b905080606001516001600160401b03165f03611fb05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106c2565b6005600160991b016001600160a01b031663ee5b48eb611fdd84604001518460600151856080015161270d565b6040518263ffffffff1660e01b8152600401611ff9919061538e565b6020604051808303815f875af1158015612015573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4e9190615355565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615d4383398151915292919061208190615831565b90501180156120b3575060015f83815260088301602052604090205460ff1660058111156120b1576120b1615219565b145b6120cf5760405162461bcd60e51b81526004016106c290615863565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161210891906004016158aa565b6020604051808303815f875af1158015612124573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ce19190615355565b5f612151612bfc565b61215c823334613992565b905061217460015f80516020615d6383398151915255565b919050565b612181614ff8565b5f8281525f80516020615d83833981519152602052604090819020815160e0810190925280545f80516020615d43833981519152929190829060ff1660058111156121ce576121ce615219565b60058111156121df576121df615219565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561228c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b3919081019061593f565b91509150806123165760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106c2565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612359573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237d9190615355565b8251146123e15760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106c2565b60208201516001600160a01b0316156124575760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106c2565b5f806124668460400151613cc6565b915091508187146124d35760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106c2565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0960205260409020545f80516020615d03833981519152906001600160401b039081169083161115612551575f8881526009820160205260409020805467ffffffffffffffff19166001600160401b03841617905561256d565b5f8881526009820160205260409020546001600160401b031691505b6040516001600160401b038316815288907fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d04359060200160405180910390a2509695505050505050565b5f8281525f80516020615d83833981519152602052604081206002015481905f80516020615d4383398151915290600160801b90046001600160401b03166125fe8582613e9e565b5f612608876140ac565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6126588a858b61270d565b6040518263ffffffff1660e01b8152600401612674919061538e565b6020604051808303815f875af1158015612690573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126b49190615355565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561278657612746816001615a11565b61275190600861581a565b5081515f90839083908110612768576127686155f5565b60200101906001600160f81b03191690815f1a905350600101612732565b505f5b60048110156127f15761279d816003615a11565b6127a890600861581a565b600263ffffffff16901c60f81b828260026127c391906154e3565b815181106127d3576127d36155f5565b60200101906001600160f81b03191690815f1a905350600101612789565b505f5b60208110156128535761280881601f615a11565b61281390600861581a565b86901c60f81b826128258360066154e3565b81518110612835576128356155f5565b60200101906001600160f81b03191690815f1a9053506001016127f4565b505f5b60088110156128be5761286a816007615a11565b61287590600861581a565b6001600160401b038616901c60f81b826128908360266154e3565b815181106128a0576128a06155f5565b60200101906001600160f81b03191690815f1a905350600101612856565b505f5b6008811015612929576128d5816007615a11565b6128e090600861581a565b6001600160401b038516901c60f81b826128fb83602e6154e3565b8151811061290b5761290b6155f5565b60200101906001600160f81b03191690815f1a9053506001016128c1565b50949350505050565b61293a61413c565b61294381614187565b50565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b612989614ff8565b5f8281525f80516020615d838339815191526020526040808220815160e0810190925280545f80516020615d4383398151915293929190829060ff1660058111156129d6576129d6615219565b60058111156129e7576129e7615219565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612a5957612a59615219565b14612ab55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106c2565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff19166001836005811115612af957612af9615219565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612ba585826125b6565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615d63833981519152805460011901612c2d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615d038339815191529061ffff861610801590612c7f575061271061ffff861611155b612c9b5760405162461bcd60e51b81526004016106c290615a24565b60028101546001600160401b039081169085161015612d145760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106c2565b8054831015612d775760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106c2565b8060010154831115612dde5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106c2565b825f612de982610ce6565b90505f612df689836141fb565b90506040518060600160405280612e0a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615d6383398151915255565b5f612eb9614ff8565b5f80516020615d438339815191525f612ed185613273565b90505f80612ee283604001516137f1565b915091508015612f475760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106c2565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612f7857612f78615219565b6005811115612f8957612f89615219565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612ffa57612ffa615219565b1480613018575060018251600581111561301657613016615219565b145b6130775760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106c2565b60038251600581111561308c5761308c615219565b036130995750600461309d565b5060055b6020808301515f908152600988019091526040812055818160058111156130c6576130c6615219565b908160058111156130d9576130d9615219565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561310d5761310d615219565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156131c1576131c1615219565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015613246575f80fd5b505af1158015613258573d5f803e3d5ffd5b505050505050565b611bf76001600160a01b03831682614760565b60408051606080820183525f8083526020830181905292820152905f80516020615d438339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156132e8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261330f919081019061593f565b915091508061336f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106c2565b82548251146133d25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106c2565b60208201516001600160a01b0316156134455760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106c2565b509392505050565b5f805f83516036146134715760405162461bcd60e51b81526004016106c290615a6f565b5f805b60028110156134c057613488816001615a11565b61349390600861581a565b61ffff168682815181106134a9576134a96155f5565b016020015160f81c901b9190911790600101613474565b5061ffff8116156134e35760405162461bcd60e51b81526004016106c290615ab8565b5f805b600481101561353e576134fa816003615a11565b61350590600861581a565b63ffffffff16876135178360026154e3565b81518110613527576135276155f5565b016020015160f81c901b91909117906001016134e6565b5063ffffffff81166004146135655760405162461bcd60e51b81526004016106c290615afb565b5f805b60208110156135ba5761357c81601f615a11565b61358790600861581a565b886135938360066154e3565b815181106135a3576135a36155f5565b016020015160f81c901b9190911790600101613568565b505f805b6008811015613619576135d2816007615a11565b6135dd90600861581a565b6001600160401b0316896135f28360266154e3565b81518110613602576136026155f5565b016020015160f81c901b91909117906001016135be565b505f805b600881101561367857613631816007615a11565b61363c90600861581a565b6001600160401b03168a61365183602e6154e3565b81518110613661576136616155f5565b016020015160f81c901b919091179060010161361d565b5091989097509095509350505050565b5f81516026146136aa5760405162461bcd60e51b81526004016106c290615a6f565b5f805b60028110156136f9576136c1816001615a11565b6136cc90600861581a565b61ffff168482815181106136e2576136e26155f5565b016020015160f81c901b91909117906001016136ad565b5061ffff81161561371c5760405162461bcd60e51b81526004016106c290615ab8565b5f805b600481101561377757613733816003615a11565b61373e90600861581a565b63ffffffff16856137508360026154e3565b81518110613760576137606155f5565b016020015160f81c901b919091179060010161371f565b5063ffffffff81161561379c5760405162461bcd60e51b81526004016106c290615afb565b5f805b6020811015612929576137b381601f615a11565b6137be90600861581a565b866137ca8360066154e3565b815181106137da576137da6155f5565b016020015160f81c901b919091179060010161379f565b5f8082516027146138145760405162461bcd60e51b81526004016106c290615a6f565b5f805b60028110156138635761382b816001615a11565b61383690600861581a565b61ffff1685828151811061384c5761384c6155f5565b016020015160f81c901b9190911790600101613817565b5061ffff8116156138865760405162461bcd60e51b81526004016106c290615ab8565b5f805b60048110156138e15761389d816003615a11565b6138a890600861581a565b63ffffffff16866138ba8360026154e3565b815181106138ca576138ca6155f5565b016020015160f81c901b9190911790600101613889565b5063ffffffff81166003146139085760405162461bcd60e51b81526004016106c290615afb565b5f805b602081101561395d5761391f81601f615a11565b61392a90600861581a565b876139368360066154e3565b81518110613946576139466155f5565b016020015160f81c901b919091179060010161390b565b505f86602681518110613972576139726155f5565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615d03833981519152816139ab84610ce6565b90505f6139b787612179565b90506139c287612946565b6139de5760405162461bcd60e51b81526004016106c2906153c0565b6002815160058111156139f3576139f3615219565b14613a105760405162461bcd60e51b81526004016106c290615408565b5f828260800151613a219190615470565b60048501546040840151919250613a43916001600160401b0390911690615b42565b6001600160401b0316816001600160401b03161115613ac25760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106c2565b5f80613ace8a846125b6565b915091505f8a83604051602001613afc92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b9757613b97615219565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613ce95760405162461bcd60e51b81526004016106c290615a6f565b5f805b6002811015613d3857613d00816001615a11565b613d0b90600861581a565b61ffff16858281518110613d2157613d216155f5565b016020015160f81c901b9190911790600101613cec565b5061ffff811615613d5b5760405162461bcd60e51b81526004016106c290615ab8565b5f805b6004811015613db657613d72816003615a11565b613d7d90600861581a565b63ffffffff1686613d8f8360026154e3565b81518110613d9f57613d9f6155f5565b016020015160f81c901b9190911790600101613d5e565b5063ffffffff8116600514613ddd5760405162461bcd60e51b81526004016106c290615afb565b5f805b6020811015613e3257613df481601f615a11565b613dff90600861581a565b87613e0b8360066154e3565b81518110613e1b57613e1b6155f5565b016020015160f81c901b9190911790600101613de0565b505f805b6008811015613e9157613e4a816007615a11565b613e5590600861581a565b6001600160401b031688613e6a8360266154e3565b81518110613e7a57613e7a6155f5565b016020015160f81c901b9190911790600101613e36565b5090969095509350505050565b5f80516020615d438339815191525f6001600160401b038084169085161115613ed257613ecb83856152f7565b9050613edf565b613edc84846152f7565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613f41575060028401548151613f3d916001600160401b0316906154e3565b8210155b15613f67576001600160401b038316606082015281815260408101516020820152613f86565b8281606001818151613f799190615470565b6001600160401b03169052505b6060810151613f96906064615b42565b602082015160028601546001600160401b039290921691613fc19190600160401b900460ff1661581a565b10156140255760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106c2565b856001600160401b03168160400181815161404091906154e3565b9052506040810180516001600160401b0387169190614060908390615a11565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d838339815191526020526040812060020180545f80516020615d4383398151915291600160401b9091046001600160401b03169060086140f683615b6d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661418557604051631afcd79f60e31b815260040160405180910390fd5b565b61418f61413c565b614198816147f3565b6141a061480c565b612943608082013560a08301356141bd60e0850160c08601615200565b6141ce610100860160e08701615b88565b61ffff166141e461012087016101008801615ba1565b6141f661014088016101208901615595565b61481c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142865760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106c2565b5f80516020615d43833981519152426142a56040860160208701615200565b6001600160401b0316116143175760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106c2565b6143276040850160208601615200565b6001600160401b031661433d6202a300426154e3565b116143b05760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106c2565b83356144085760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106c2565b83355f908152600982016020526040902054156144375760405162461bcd60e51b81526004016106c290615750565b60306144466040860186615bc1565b9050146144ab5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106c2565b6144b5835f613e9e565b5f8061454f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144fa9190615200565b6001600160401b0316815260200161451560408a018a615bc1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a60565b5f8281526007860160205260409020919350915061456d8282615c47565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061459a90859060040161538e565b6020604051808303815f875af11580156145b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145da9190615355565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561465257614652615219565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614732918e01908e01615200565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147835760405163cd78605960e01b81523060048201526024016106c2565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146147cc576040519150601f19603f3d011682016040523d82523d5f602084013e6147d1565b606091505b5050905080610ce157604051630a12f52160e11b815260040160405180910390fd5b6147fb61413c565b614803614e0f565b61294381614e17565b61481461413c565b614185614fb9565b61482461413c565b5f80516020615d03833981519152836148905760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106c2565b6127108411156148b25760405162461bcd60e51b81526004016106c290615a24565b8587111561491a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106c2565b5f8360ff16116149875760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106c2565b600a60ff841611156149f95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106c2565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614aca5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106c2565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614b4157614b01816001615a11565b614b0c90600861581a565b5081515f90839083908110614b2357614b236155f5565b60200101906001600160f81b03191690815f1a905350600101614aed565b505f5b6004811015614ba957614b58816003615a11565b614b6390600861581a565b600160ff919091161c60f81b82614b7b8360026154e3565b81518110614b8b57614b8b6155f5565b60200101906001600160f81b03191690815f1a905350600101614b44565b505f5b6020811015614c065784518160208110614bc857614bc86155f5565b1a60f81b82614bd88360066154e3565b81518110614be857614be86155f5565b60200101906001600160f81b03191690815f1a905350600101614bac565b505f5b6020811015614c665784602001518160208110614c2857614c286155f5565b1a60f81b82614c388360266154e3565b81518110614c4857614c486155f5565b60200101906001600160f81b03191690815f1a905350600101614c09565b505f5b6008811015614cda57614c7d816007615a11565b614c8890600861581a565b60ff1685604001516001600160401b0316901c60f81b82826046614cac91906154e3565b81518110614cbc57614cbc6155f5565b60200101906001600160f81b03191690815f1a905350600101614c69565b505f5b6030811015614d455784608001518181518110614cfc57614cfc6155f5565b01602001516001600160f81b03191682614d1783604e6154e3565b81518110614d2757614d276155f5565b60200101906001600160f81b03191690815f1a905350600101614cdd565b505f5b6008811015614db757614d5c816007615a11565b614d6790600861581a565b60608601516001600160401b0390811691161c60f81b82614d8983607e6154e3565b81518110614d9957614d996155f5565b60200101906001600160f81b03191690815f1a905350600101614d48565b50600281604051614dc891906157e7565b602060405180830381855afa158015614de3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e069190615355565b94909350915050565b61418561413c565b614e1f61413c565b80355f80516020615d4383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e6b6080840160608501615ba1565b60ff161115614ed85760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106c2565b5f614ee96080840160608501615ba1565b60ff1611614f515760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106c2565b614f616080830160608401615ba1565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f926060830160408401615200565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612e9d61413c565b508054614fcd90615831565b5f825580601f10614fdc575050565b601f0160209004905f5260205f20908101906129439190615034565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615048575f8155600101615035565b5090565b8015158114612943575f80fd5b803563ffffffff81168114612174575f80fd5b5f805f6060848603121561507e575f80fd5b8335925060208401356150908161504c565b915061509e60408501615059565b90509250925092565b5f602082840312156150b7575f80fd5b5035919050565b5f61014082840312156150cf575f80fd5b50919050565b5f80604083850312156150e6575f80fd5b823591506150f660208401615059565b90509250929050565b803561ffff81168114612174575f80fd5b80356001600160401b0381168114612174575f80fd5b5f805f60608486031215615138575f80fd5b83356001600160401b0381111561514d575f80fd5b84016060818703121561515e575f80fd5b925061516c602085016150ff565b915061509e60408501615110565b5f6020828403121561518a575f80fd5b610eae82615059565b5f80604083850312156151a4575f80fd5b6151ad83615059565b946020939093013593505050565b5f80604083850312156151cc575f80fd5b82356001600160401b038111156151e1575f80fd5b8301608081860312156151f2575f80fd5b91506150f660208401615059565b5f60208284031215615210575f80fd5b610eae82615110565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061525057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161528b60608401826001600160401b03169052565b5060808301516152a660808401826001600160401b03169052565b5060a08301516152c160a08401826001600160401b03169052565b5060c08301516152dc60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156152dc576152dc6152e3565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615365575f80fd5b5051919050565b5f5b8381101561538657818101518382015260200161536e565b50505f910152565b602081525f82518060208401526153ac81604085016020870161536c565b601f01601f19169190910160400192915050565b60208082526028908201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660408201526730b634b230ba37b960c11b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6040820152686f742061637469766560b81b606082015260800190565b5f8261546b57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160401b038181168382160190808211156152dc576152dc6152e3565b60208082526033908201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616040820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606082015260800190565b80820180821115610cf657610cf66152e3565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612943575f80fd5b5f602082840312156155a5575f80fd5b8135610eae81615581565b5f808335601e198436030181126155c5575f80fd5b8301803591506001600160401b038211156155de575f80fd5b6020019150600581901b3603821315612706575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261561d575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561565d5761565d615627565b60405290565b604051601f8201601f191681016001600160401b038111828210171561568b5761568b615627565b604052919050565b5f6001600160401b038211156156ab576156ab615627565b50601f01601f191660200190565b5f606082360312156156c9575f80fd5b6156d161563b565b8235815260206156e2818501615110565b8183015260408401356001600160401b038111156156fe575f80fd5b840136601f82011261570e575f80fd5b803561572161571c82615693565b615663565b8181523684838501011115615734575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516157a9818460208a0161536c565b80830190508581526001600160401b0360c01b8560c01b16602082015283516157d981602884016020880161536c565b016028019695505050505050565b5f825161561d81846020870161536c565b5f63ffffffff808316818103615810576158106152e3565b6001019392505050565b8082028115828204841417610cf657610cf66152e3565b600181811c9082168061584557607f821691505b6020821081036150cf57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546158bc81615831565b806020870152604060018084165f81146158dd57600181146158f957615926565b60ff19851660408a0152604084151560051b8a01019550615926565b895f5260205f205f5b8581101561591d5781548b8201860152908301908801615902565b8a016040019650505b509398975050505050505050565b80516121748161504c565b5f8060408385031215615950575f80fd5b82516001600160401b0380821115615966575f80fd5b9084019060608287031215615979575f80fd5b61598161563b565b8251815260208084015161599481615581565b828201526040840151838111156159a9575f80fd5b80850194505087601f8501126159bd575f80fd5b835192506159cd61571c84615693565b83815288828587010111156159e0575f80fd5b6159ef8483830184880161536c565b80604084015250819550615a04818801615934565b9450505050509250929050565b81810381811115610cf657610cf66152e3565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615b6557615b656152e3565b505092915050565b5f6001600160401b03808316818103615810576158106152e3565b5f60208284031215615b98575f80fd5b610eae826150ff565b5f60208284031215615bb1575f80fd5b813560ff81168114610eae575f80fd5b5f808335601e19843603018112615bd6575f80fd5b8301803591506001600160401b03821115615bef575f80fd5b602001915036819003821315612706575f80fd5b601f821115610ce157805f5260205f20601f840160051c81016020851015615c285750805b601f840160051c820191505b81811015610f4e575f8155600101615c34565b81516001600160401b03811115615c6057615c60615627565b615c7481615c6e8454615831565b84615c03565b602080601f831160018114615ca7575f8415615c905750858301515b5f19600386901b1c1916600185901b178555613258565b5f85815260208120601f198616915b82811015615cd557888601518255948401946001909101908401615cb6565b5085821015615cf257878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. From 2eda1da98a8ca90ee292d71542a142bac4a6862f Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 19 Sep 2024 08:43:32 -0500 Subject: [PATCH 358/545] fix e2e --- tests/local/e2e_test.go | 14 ++++----- tests/utils/validator_manager.go | 50 ++++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 19 deletions(-) diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index 88011b97b..d5e1dc30f 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -8,9 +8,9 @@ import ( "testing" "github.com/ava-labs/teleporter/tests/flows/governance" - "github.com/ava-labs/teleporter/tests/flows/staking" "github.com/ava-labs/teleporter/tests/flows/teleporter" "github.com/ava-labs/teleporter/tests/flows/teleporter/registry" + validatorManager "github.com/ava-labs/teleporter/tests/flows/validatorManager" deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" "github.com/ethereum/go-ethereum/log" "github.com/onsi/ginkgo/v2" @@ -200,31 +200,31 @@ var _ = ginkgo.Describe("[Teleporter integration tests]", func() { ginkgo.It("Native token staking manager", ginkgo.Label(validatorManagerLabel), func() { - staking.NativeTokenStakingManager(LocalNetworkInstance) + validatorManager.NativeTokenStakingManager(LocalNetworkInstance) }) ginkgo.It("ERC20 token staking manager", ginkgo.Label(validatorManagerLabel), func() { - staking.ERC20TokenStakingManager(LocalNetworkInstance) + validatorManager.ERC20TokenStakingManager(LocalNetworkInstance) }) ginkgo.It("PoA validator manager", ginkgo.Label(validatorManagerLabel), func() { - staking.PoAValidatorManager(LocalNetworkInstance) + validatorManager.PoAValidatorManager(LocalNetworkInstance) }) ginkgo.It("ERC20 delegation", ginkgo.Label(validatorManagerLabel), func() { - staking.ERC20Delegation(LocalNetworkInstance) + validatorManager.ERC20Delegation(LocalNetworkInstance) }) ginkgo.It("Native token delegation", ginkgo.Label(validatorManagerLabel), func() { - staking.NativeDelegation(LocalNetworkInstance) + validatorManager.NativeDelegation(LocalNetworkInstance) }) ginkgo.It("PoA migration to PoS", ginkgo.Label(validatorManagerLabel), func() { - staking.PoAMigrationToPoS(LocalNetworkInstance) + validatorManager.PoAMigrationToPoS(LocalNetworkInstance) }) }) diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index b215c822c..235345da8 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -890,15 +890,27 @@ func InitializeEndNativeValidation( subnet interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, validationID ids.ID, + force bool, ) *types.Receipt { opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) - tx, err := stakingManager.InitializeEndValidation( - opts, - validationID, - false, - 0, - ) + var tx *types.Transaction + if force { + tx, err = stakingManager.ForceInitializeEndValidation( + opts, + validationID, + false, + 0, + ) + + } else { + tx, err = stakingManager.InitializeEndValidation( + opts, + validationID, + false, + 0, + ) + } Expect(err).Should(BeNil()) return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) } @@ -908,15 +920,27 @@ func InitializeEndERC20Validation( subnet interfaces.SubnetTestInfo, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, validationID ids.ID, + force bool, ) *types.Receipt { opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) - tx, err := stakingManager.InitializeEndValidation( - opts, - validationID, - false, - 0, - ) + var tx *types.Transaction + if force { + tx, err = stakingManager.ForceInitializeEndValidation( + opts, + validationID, + false, + 0, + ) + + } else { + tx, err = stakingManager.InitializeEndValidation( + opts, + validationID, + false, + 0, + ) + } Expect(err).Should(BeNil()) return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) } @@ -1189,6 +1213,7 @@ func InitializeAndCompleteEndNativeValidation( subnetInfo, stakingManager, validationID, + true, ) validatorRemovalEvent, err := GetEventFromLogs( receipt.Logs, @@ -1251,6 +1276,7 @@ func InitializeAndCompleteEndERC20Validation( subnetInfo, stakingManager, validationID, + true, ) validatorRemovalEvent, err := GetEventFromLogs( receipt.Logs, From 015d92e3ba7e4d93d7fe0a92214998a24aa75b67 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 09:47:44 -0400 Subject: [PATCH 359/545] Review fixes --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 18 +++++++++++++----- .../interfaces/IPoSValidatorManager.sol | 4 +++- 4 files changed, 18 insertions(+), 8 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 0d3ffc0ee..5867696ca 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160ab3803806160ab83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f5e8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152c1565b6103ec565b005b61019e6101ae3660046152fc565b61088f565b6101f16101c13660046152fc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152fc565b610a48565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615327565b610a5e565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615365565b610b3d565b61019e61029936600461537e565b610bdd565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c93660046153a6565b610db2565b6101f16102dc36600461540a565b6113e6565b6102316102ef3660046152fc565b6113ff565b61019e6103023660046152c1565b611413565b61020c603081565b61019e61031d3660046152fc565b61161f565b61019e61033036600461537e565b611770565b6101f1610343366004615423565b611a82565b61019e610356366004615365565b611aae565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152fc565b611c66565b61019e6103a23660046152fc565b611eec565b61020c601481565b6103c26103bd3660046152fc565b612000565b6040516101fb9190615457565b6102316202a30081565b6101f16103e736600461551e565b6120c8565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615eb2833981519152949193919290829060ff16600481111561045457610454615443565b600481111561046557610465615443565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104e183612000565b90506002825160048111156104f8576104f8615443565b1461054a5760405162461bcd60e51b815260206004820152602a60248201525f80516020615ed28339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105af5760405162461bcd60e51b815260206004820152603360248201525f80516020615ed28339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610541565b6003825280515f9060029060058111156105cb576105cb615443565b036106225786156105e3576105e084876120fd565b90505b5f836060015183608001516105f89190615597565b90506106048582612399565b506001600160401b0390811660e0860152421660a085015250610656565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068985606001516113e6565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072a91906155b7565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561076957610769615443565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087d916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f328339815191526020526040808220815160e0810190925280545f80516020615ef283398151915293929190829060ff1660058111156108dc576108dc615443565b60058111156108ed576108ed615443565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c615443565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6124f0565b6040518263ffffffff1660e01b8152600401610a0291906155f0565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4291906155b7565b50505050565b5f610a5864e8d4a5100083615622565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa7575080546001600160401b03808416911610155b15610ac55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af08484612717565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615eb28339815191525f80610b5684612731565b91509150610b6382612a7b565b610b6d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9b57610b9b615443565b03610bc0575f83815260088501602052604081208054919055610bbe8282612ab6565b505b610bd681610bd184604001516113e6565b612b2c565b5050505050565b5f80516020615eb28339815191525f610bf584612b4f565b90505f80610c068360400151612d29565b50915091505f610c1583612000565b9050816001600160401b031681606001516001600160401b03161015610c4d5760405162461bcd60e51b815260040161054190615641565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c925760405162461bcd60e51b815260040161054190615683565b60015f87815260068701602052604090205460ff166004811115610cb857610cb8615443565b14610d215760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610541565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ef28339815191529060ff1615610e4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb691906155b7565b836020013514610f185760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610541565b30610f2960608501604086016156cc565b6001600160a01b031614610f9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610541565b5f610fa960608501856156e7565b91505f9050843560208601356014610fc76060890160408a016156cc565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f6575f61104760608901896156e7565b8363ffffffff1681811061105d5761105d61572c565b905060200281019061106f9190615740565b611078906157f0565b80515f81815260098901602052604090205491925090156110ab5760405162461bcd60e51b815260040161054190615887565b84825f0151836020015184604001516040516020016110cd94939291906158cf565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111b919061591e565b602060405180830381855afa158015611136573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115991906155b7565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e5576111e5615443565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129891168661592f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ef90615942565b905061102b565b50600584018190555f61130886612b4f565b90505f6113188260400151612f64565b90508060028560405161132b919061591e565b602060405180830381855afa158015611346573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136991906155b7565b146113cd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610541565b505050600a909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a51000615964565b5f61140982612000565b6080015192915050565b5f80516020615eb28339815191525f61142b856130d6565b905061143685612a7b565b611441575050505050565b5f85815260058301602052604090205460a082015161147091600160b01b90046001600160401b03169061597b565b6001600160401b03168160c001516001600160401b031610156114f15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610541565b8315610bd6575f61150286856120fd565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611559906113e6565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f391906155b7565b5f8781526008850160205260408120805490919061161290849061592f565b9091555050505050505050565b5f80516020615eb28339815191525f61163783612000565b905060048151600581111561164e5761164e615443565b146116b85760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610541565b5f8381526005830160205260409020546001600160a01b0316331461173a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610541565b5f83815260088301602090815260408083208054908490556005860190925290912054610a42906001600160a01b031682612ab6565b611778613351565b5f80516020615eb28339815191525f61179084612b4f565b90505f806117a18360400151612d29565b50915091505f6117b083612000565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117ea576117ea615443565b60048111156117fb576117fb615443565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e0909201919091528401519192508481169116101561189a5760405162461bcd60e51b815260040161054190615641565b826001600160401b03168160e001516001600160401b031611156118d05760405162461bcd60e51b815260040161054190615683565b6003815160048111156118e5576118e5615443565b146119395760405162461bcd60e51b815260206004820152603160248201525f80516020615ed28339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610541565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a019092528220549091906127109061198f9061ffff600160a01b9091041684615964565b6119999190615622565b905080886008015f8881526020019081526020015f205f8282546119bd919061592f565b909155505060208301516119da906119d5838561599b565b612ab6565b6119ef8360200151610bd185606001516113e6565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050611a7e60015f80516020615f1283398151915255565b5050565b5f611a8b613351565b611a9683338461339b565b9050610a5860015f80516020615f1283398151915255565b5f80516020615ef28339815191525f611ac683612b4f565b90505f80611ad78360400151613755565b9150915080611b395760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610541565b5f82815260078501602052604081208054611b53906159ae565b9050118015611b85575060015f83815260088601602052604090205460ff166005811115611b8357611b83615443565b145b611ba15760405162461bcd60e51b8152600401610541906159e6565b5f8281526007850160205260408120611bb991615211565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615eb283398151915293929190829060ff166004811115611cc757611cc7615443565b6004811115611cd857611cd8615443565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5f57611d5f615443565b1480611d7d5750600381516004811115611d7b57611d7b615443565b145b611dd15760405162461bcd60e51b815260206004820152603260248201525f80516020615ed2833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610541565b5f611ddf8260400151612000565b905080606001516001600160401b03165f03611e635760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb611e908460400151846060015185608001516124f0565b6040518263ffffffff1660e01b8152600401611eac91906155f0565b6020604051808303815f875af1158015611ec8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd691906155b7565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ef2833981519152929190611f34906159ae565b9050118015611f66575060015f83815260088301602052604090205460ff166005811115611f6457611f64615443565b145b611f825760405162461bcd60e51b8152600401610541906159e6565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fbb9190600401615a2d565b6020604051808303815f875af1158015611fd7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffb91906155b7565b505050565b612008615248565b5f8281525f80516020615f32833981519152602052604090819020815160e0810190925280545f80516020615ef2833981519152929190829060ff16600581111561205557612055615443565b600581111561206657612066615443565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120d1613351565b6120dd858585856138f6565b90506120f560015f80516020615f1283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612148573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261216f9190810190615ac2565b91509150806121d25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612215573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223991906155b7565b82511461229d5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610541565b60208201516001600160a01b0316156123135760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610541565b5f806123228460400151613b6b565b9150915081871461238f5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610541565b9695505050505050565b5f8281525f80516020615f32833981519152602052604081206002015481905f80516020615ef283398151915290600160801b90046001600160401b03166123e18582613d43565b5f6123eb87613f51565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61243b8a858b6124f0565b6040518263ffffffff1660e01b815260040161245791906155f0565b6020604051808303815f875af1158015612473573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249791906155b7565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156125695761252981600161599b565b612534906008615964565b5081515f9083908390811061254b5761254b61572c565b60200101906001600160f81b03191690815f1a905350600101612515565b505f5b60048110156125d45761258081600361599b565b61258b906008615964565b600263ffffffff16901c60f81b828260026125a6919061592f565b815181106125b6576125b661572c565b60200101906001600160f81b03191690815f1a90535060010161256c565b505f5b6020811015612636576125eb81601f61599b565b6125f6906008615964565b86901c60f81b8261260883600661592f565b815181106126185761261861572c565b60200101906001600160f81b03191690815f1a9053506001016125d7565b505f5b60088110156126a15761264d81600761599b565b612658906008615964565b6001600160401b038616901c60f81b8261267383602661592f565b815181106126835761268361572c565b60200101906001600160f81b03191690815f1a905350600101612639565b505f5b600881101561270c576126b881600761599b565b6126c3906008615964565b6001600160401b038516901c60f81b826126de83602e61592f565b815181106126ee576126ee61572c565b60200101906001600160f81b03191690815f1a9053506001016126a4565b5090505b9392505050565b61271f613fe1565b6127288261402c565b611a7e816140a3565b5f61273a615248565b5f80516020615ef28339815191525f61275285612b4f565b90505f806127638360400151613755565b9150915080156127c85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610541565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f9576127f9615443565b600581111561280a5761280a615443565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561287b5761287b615443565b1480612899575060018251600581111561289757612897615443565b145b6128f85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610541565b60038251600581111561290d5761290d615443565b0361291a5750600461291e565b5060055b6020808301515f9081526009880190915260408120558181600581111561294757612947615443565b9081600581111561295a5761295a615443565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561298e5761298e615443565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a4257612a42615443565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615e9283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b11575f80fd5b505af1158015612b23573d5f803e3d5ffd5b50505050505050565b5f80516020615e9283398151915254611a7e906001600160a01b03168383614144565b60408051606080820183525f8083526020830181905292820152905f80516020615ef28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bc4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612beb9190810190615ac2565b9150915080612c4b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610541565b8254825114612cae5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610541565b60208201516001600160a01b031615612d215760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610541565b509392505050565b5f805f8351603614612d4d5760405162461bcd60e51b815260040161054190615b94565b5f805b6002811015612d9c57612d6481600161599b565b612d6f906008615964565b61ffff16868281518110612d8557612d8561572c565b016020015160f81c901b9190911790600101612d50565b5061ffff811615612dbf5760405162461bcd60e51b815260040161054190615bdd565b5f805b6004811015612e1a57612dd681600361599b565b612de1906008615964565b63ffffffff1687612df383600261592f565b81518110612e0357612e0361572c565b016020015160f81c901b9190911790600101612dc2565b5063ffffffff8116600414612e415760405162461bcd60e51b815260040161054190615c20565b5f805b6020811015612e9657612e5881601f61599b565b612e63906008615964565b88612e6f83600661592f565b81518110612e7f57612e7f61572c565b016020015160f81c901b9190911790600101612e44565b505f805b6008811015612ef557612eae81600761599b565b612eb9906008615964565b6001600160401b031689612ece83602661592f565b81518110612ede57612ede61572c565b016020015160f81c901b9190911790600101612e9a565b505f805b6008811015612f5457612f0d81600761599b565b612f18906008615964565b6001600160401b03168a612f2d83602e61592f565b81518110612f3d57612f3d61572c565b016020015160f81c901b9190911790600101612ef9565b5091989097509095509350505050565b5f8151602614612f865760405162461bcd60e51b815260040161054190615b94565b5f805b6002811015612fd557612f9d81600161599b565b612fa8906008615964565b61ffff16848281518110612fbe57612fbe61572c565b016020015160f81c901b9190911790600101612f89565b5061ffff811615612ff85760405162461bcd60e51b815260040161054190615bdd565b5f805b60048110156130535761300f81600361599b565b61301a906008615964565b63ffffffff168561302c83600261592f565b8151811061303c5761303c61572c565b016020015160f81c901b9190911790600101612ffb565b5063ffffffff8116156130785760405162461bcd60e51b815260040161054190615c20565b5f805b60208110156130cd5761308f81601f61599b565b61309a906008615964565b866130a683600661592f565b815181106130b6576130b661572c565b016020015160f81c901b919091179060010161307b565b50949350505050565b6130de615248565b5f8281525f80516020615f328339815191526020526040808220815160e0810190925280545f80516020615ef283398151915293929190829060ff16600581111561312b5761312b615443565b600581111561313c5761313c615443565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131ae576131ae615443565b1461320a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610541565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561324e5761324e615443565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132fa8582612399565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f1283398151915280546001190161338257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f1283398151915255565b5f5f80516020615eb2833981519152816133b761022c856141a3565b90505f6133c387612000565b90506133ce87612a7b565b61342b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610541565b60028151600581111561344057613440615443565b1461349f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610541565b5f8282608001516134b0919061597b565b600485015460408401519192506134d2916001600160401b0390911690615c67565b6001600160401b0316816001600160401b031611156135515760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610541565b5f8061355d8a84612399565b915091505f8a8360405160200161358b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561362657613626615443565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137785760405162461bcd60e51b815260040161054190615b94565b5f805b60028110156137c75761378f81600161599b565b61379a906008615964565b61ffff168582815181106137b0576137b061572c565b016020015160f81c901b919091179060010161377b565b5061ffff8116156137ea5760405162461bcd60e51b815260040161054190615bdd565b5f805b60048110156138455761380181600361599b565b61380c906008615964565b63ffffffff168661381e83600261592f565b8151811061382e5761382e61572c565b016020015160f81c901b91909117906001016137ed565b5063ffffffff811660031461386c5760405162461bcd60e51b815260040161054190615c20565b5f805b60208110156138c15761388381601f61599b565b61388e906008615964565b8761389a83600661592f565b815181106138aa576138aa61572c565b016020015160f81c901b919091179060010161386f565b505f866026815181106138d6576138d661572c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615eb28339815191529061ffff861610801590613942575061271061ffff861611155b61395e5760405162461bcd60e51b815260040161054190615c92565b60028101546001600160401b0390811690851610156139d75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610541565b8054831015613a3a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610541565b8060010154831115613aa15760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610541565b5f613aab846141a3565b90505f613ab782610a48565b90505f613ac489836141c6565b90506040518060600160405280613ad83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b8e5760405162461bcd60e51b815260040161054190615b94565b5f805b6002811015613bdd57613ba581600161599b565b613bb0906008615964565b61ffff16858281518110613bc657613bc661572c565b016020015160f81c901b9190911790600101613b91565b5061ffff811615613c005760405162461bcd60e51b815260040161054190615bdd565b5f805b6004811015613c5b57613c1781600361599b565b613c22906008615964565b63ffffffff1686613c3483600261592f565b81518110613c4457613c4461572c565b016020015160f81c901b9190911790600101613c03565b5063ffffffff8116600514613c825760405162461bcd60e51b815260040161054190615c20565b5f805b6020811015613cd757613c9981601f61599b565b613ca4906008615964565b87613cb083600661592f565b81518110613cc057613cc061572c565b016020015160f81c901b9190911790600101613c85565b505f805b6008811015613d3657613cef81600761599b565b613cfa906008615964565b6001600160401b031688613d0f83602661592f565b81518110613d1f57613d1f61572c565b016020015160f81c901b9190911790600101613cdb565b5090969095509350505050565b5f80516020615ef28339815191525f6001600160401b038084169085161115613d7757613d708385615597565b9050613d84565b613d818484615597565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613de6575060028401548151613de2916001600160401b03169061592f565b8210155b15613e0c576001600160401b038316606082015281815260408101516020820152613e2b565b8281606001818151613e1e919061597b565b6001600160401b03169052505b6060810151613e3b906064615c67565b602082015160028601546001600160401b039290921691613e669190600160401b900460ff16615964565b1015613eca5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610541565b856001600160401b031681604001818151613ee5919061592f565b9052506040810180516001600160401b0387169190613f0590839061599b565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f328339815191526020526040812060020180545f80516020615ef283398151915291600160401b9091046001600160401b0316906008613f9b83615cdd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402a57604051631afcd79f60e31b815260040160405180910390fd5b565b614034613fe1565b61403d8161472b565b614045614744565b6140a0608082013560a083013561406260e0850160c0860161540a565b614073610100860160e08701615cf8565b61ffff1661408961012087016101008801615d11565b61409b610140880161012089016156cc565b614754565b50565b6140ab613fe1565b5f80516020615e928339815191526001600160a01b0382166141245760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610541565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ffb91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614998565b5f610a58825f80516020615e92833981519152546001600160a01b0316906149f9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142515760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610541565b5f80516020615ef283398151915242614270604086016020870161540a565b6001600160401b0316116142e25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610541565b6142f2604085016020860161540a565b6001600160401b03166143086202a3004261592f565b1161437b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610541565b83356143d35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610541565b83355f908152600982016020526040902054156144025760405162461bcd60e51b815260040161054190615887565b60306144116040860186615d31565b9050146144765760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610541565b614480835f613d43565b5f8061451a6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144c5919061540a565b6001600160401b031681526020016144e060408a018a615d31565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b5b565b5f828152600786016020526040902091935091506145388282615db7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145659085906004016155f0565b6020604051808303815f875af1158015614581573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a591906155b7565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561461d5761461d615443565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146fd918e01908e0161540a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614733613fe1565b61473b614f0a565b6140a081614f12565b61474c613fe1565b61402a6150b4565b61475c613fe1565b5f80516020615eb2833981519152836147c85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610541565b6127108411156147ea5760405162461bcd60e51b815260040161054190615c92565b858711156148525760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610541565b5f8360ff16116148bf5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610541565b600a60ff841611156149315760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610541565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149ac6001600160a01b038416836150bc565b905080515f141580156149d05750808060200190518101906149ce9190615e76565b155b15611ffb57604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a3f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a6391906155b7565b9050614a7a6001600160a01b0385163330866150c9565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614abe573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ae291906155b7565b9050818111614b485760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610541565b614b52828261599b565b95945050505050565b5f6060826080015151603014614bc55760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610541565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3c57614bfc81600161599b565b614c07906008615964565b5081515f90839083908110614c1e57614c1e61572c565b60200101906001600160f81b03191690815f1a905350600101614be8565b505f5b6004811015614ca457614c5381600361599b565b614c5e906008615964565b600160ff919091161c60f81b82614c7683600261592f565b81518110614c8657614c8661572c565b60200101906001600160f81b03191690815f1a905350600101614c3f565b505f5b6020811015614d015784518160208110614cc357614cc361572c565b1a60f81b82614cd383600661592f565b81518110614ce357614ce361572c565b60200101906001600160f81b03191690815f1a905350600101614ca7565b505f5b6020811015614d615784602001518160208110614d2357614d2361572c565b1a60f81b82614d3383602661592f565b81518110614d4357614d4361572c565b60200101906001600160f81b03191690815f1a905350600101614d04565b505f5b6008811015614dd557614d7881600761599b565b614d83906008615964565b60ff1685604001516001600160401b0316901c60f81b82826046614da7919061592f565b81518110614db757614db761572c565b60200101906001600160f81b03191690815f1a905350600101614d64565b505f5b6030811015614e405784608001518181518110614df757614df761572c565b01602001516001600160f81b03191682614e1283604e61592f565b81518110614e2257614e2261572c565b60200101906001600160f81b03191690815f1a905350600101614dd8565b505f5b6008811015614eb257614e5781600761599b565b614e62906008615964565b60608601516001600160401b0390811691161c60f81b82614e8483607e61592f565b81518110614e9457614e9461572c565b60200101906001600160f81b03191690815f1a905350600101614e43565b50600281604051614ec3919061591e565b602060405180830381855afa158015614ede573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f0191906155b7565b94909350915050565b61402a613fe1565b614f1a613fe1565b80355f80516020615ef283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f666080840160608501615d11565b60ff161115614fd35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610541565b5f614fe46080840160608501615d11565b60ff161161504c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610541565b61505c6080830160608401615d11565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561508d606083016040840161540a565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613388613fe1565b606061271083835f615102565b6040516001600160a01b038481166024830152838116604483015260648201839052610a429186918216906323b872dd90608401614171565b6060814710156151275760405163cd78605960e01b8152306004820152602401610541565b5f80856001600160a01b03168486604051615142919061591e565b5f6040518083038185875af1925050503d805f811461517c576040519150601f19603f3d011682016040523d82523d5f602084013e615181565b606091505b509150915061238f8683836060826151a15761519c826151e8565b612710565b81511580156151b857506001600160a01b0384163b155b156151e157604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b5080612710565b8051156151f85780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461521d906159ae565b5f825580601f1061522c575050565b601f0160209004905f5260205f20908101906140a09190615284565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615298575f8155600101615285565b5090565b80151581146140a0575f80fd5b803563ffffffff811681146152bc575f80fd5b919050565b5f805f606084860312156152d3575f80fd5b8335925060208401356152e58161529c565b91506152f3604085016152a9565b90509250925092565b5f6020828403121561530c575f80fd5b5035919050565b6001600160a01b03811681146140a0575f80fd5b5f8082840361016081121561533a575f80fd5b61014080821215615349575f80fd5b849350830135905061535a81615313565b809150509250929050565b5f60208284031215615375575f80fd5b612710826152a9565b5f806040838503121561538f575f80fd5b615398836152a9565b946020939093013593505050565b5f80604083850312156153b7575f80fd5b82356001600160401b038111156153cc575f80fd5b8301608081860312156153dd575f80fd5b91506153eb602084016152a9565b90509250929050565b80356001600160401b03811681146152bc575f80fd5b5f6020828403121561541a575f80fd5b612710826153f4565b5f8060408385031215615434575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154b560608401826001600160401b03169052565b5060808301516154d060808401826001600160401b03169052565b5060a08301516154eb60a08401826001600160401b03169052565b5060c083015161550660c08401826001600160401b03169052565b5092915050565b803561ffff811681146152bc575f80fd5b5f805f8060808587031215615531575f80fd5b84356001600160401b03811115615546575f80fd5b850160608188031215615557575f80fd5b93506155656020860161550d565b9250615573604086016153f4565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561550657615506615583565b5f602082840312156155c7575f80fd5b5051919050565b5f5b838110156155e85781810151838201526020016155d0565b50505f910152565b602081525f825180602084015261560e8160408501602087016155ce565b601f01601f19169190910160400192915050565b5f8261563c57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156dc575f80fd5b813561271081615313565b5f808335601e198436030181126156fc575f80fd5b8301803591506001600160401b03821115615715575f80fd5b6020019150600581901b36038213156124e9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615754575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157945761579461575e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157c2576157c261575e565b604052919050565b5f6001600160401b038211156157e2576157e261575e565b50601f01601f191660200190565b5f60608236031215615800575f80fd5b615808615772565b8235815260206158198185016153f4565b8183015260408401356001600160401b03811115615835575f80fd5b840136601f820112615845575f80fd5b8035615858615853826157ca565b61579a565b818152368483850101111561586b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158e0818460208a016155ce565b80830190508581526001600160401b0360c01b8560c01b16602082015283516159108160288401602088016155ce565b016028019695505050505050565b5f82516157548184602087016155ce565b80820180821115610a5857610a58615583565b5f63ffffffff80831681810361595a5761595a615583565b6001019392505050565b8082028115828204841417610a5857610a58615583565b6001600160401b0381811683821601908082111561550657615506615583565b81810381811115610a5857610a58615583565b600181811c908216806159c257607f821691505b6020821081036159e057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a3f816159ae565b806020870152604060018084165f8114615a605760018114615a7c57615aa9565b60ff19851660408a0152604084151560051b8a01019550615aa9565b895f5260205f205f5b85811015615aa05781548b8201860152908301908801615a85565b8a016040019650505b509398975050505050505050565b80516152bc8161529c565b5f8060408385031215615ad3575f80fd5b82516001600160401b0380821115615ae9575f80fd5b9084019060608287031215615afc575f80fd5b615b04615772565b82518152602080840151615b1781615313565b82820152604084015183811115615b2c575f80fd5b80850194505087601f850112615b40575f80fd5b83519250615b50615853846157ca565b8381528882858701011115615b63575f80fd5b615b72848383018488016155ce565b80604084015250819550615b87818801615ab7565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615c8a57615c8a615583565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361595a5761595a615583565b5f60208284031215615d08575f80fd5b6127108261550d565b5f60208284031215615d21575f80fd5b813560ff81168114612710575f80fd5b5f808335601e19843603018112615d46575f80fd5b8301803591506001600160401b03821115615d5f575f80fd5b6020019150368190038213156124e9575f80fd5b601f821115611ffb57805f5260205f20601f840160051c81016020851015615d985750805b601f840160051c820191505b81811015610bd6575f8155600101615da4565b81516001600160401b03811115615dd057615dd061575e565b615de481615dde84546159ae565b84615d73565b602080601f831160018114615e17575f8415615e005750858301515b5f19600386901b1c1916600185901b178555615e6e565b5f85815260208120601f198616915b82811015615e4557888601518255948401946001909101908401615e26565b5085821015615e6257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e86575f80fd5b81516127108161529c56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516160a23803806160a283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f558061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152b8565b6103ec565b005b61019e6101ae3660046152f3565b61088f565b6101f16101c13660046152f3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152f3565b610a48565b6040516001600160401b0390911681526020016101fb565b61019e61025736600461531e565b610a5e565b61026561271081565b60405161ffff90911681526020016101fb565b61019e61028636600461535c565b610b3d565b61019e610299366004615375565b610bdd565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c936600461539d565b610db2565b6101f16102dc366004615401565b6113e6565b6102316102ef3660046152f3565b6113ff565b61019e6103023660046152b8565b611413565b61020c603081565b61019e61031d3660046152f3565b61161f565b61019e610330366004615375565b611770565b6101f161034336600461541a565b611a79565b61019e61035636600461535c565b611aa5565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152f3565b611c5d565b61019e6103a23660046152f3565b611ee3565b61020c601481565b6103c26103bd3660046152f3565b611ff7565b6040516101fb919061544e565b6102316202a30081565b6101f16103e7366004615515565b6120bf565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615ea9833981519152949193919290829060ff1660048111156104545761045461543a565b60048111156104655761046561543a565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104e183611ff7565b90506002825160048111156104f8576104f861543a565b1461054a5760405162461bcd60e51b815260206004820152602a60248201525f80516020615ec98339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105af5760405162461bcd60e51b815260206004820152603360248201525f80516020615ec98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610541565b6003825280515f9060029060058111156105cb576105cb61543a565b036106225786156105e3576105e084876120f4565b90505b5f836060015183608001516105f8919061558e565b90506106048582612390565b506001600160401b0390811660e0860152421660a085015250610656565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068985606001516113e6565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072a91906155ae565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156107695761076961543a565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087d916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f298339815191526020526040808220815160e0810190925280545f80516020615ee983398151915293929190829060ff1660058111156108dc576108dc61543a565b60058111156108ed576108ed61543a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c61543a565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6124e7565b6040518263ffffffff1660e01b8152600401610a0291906155e7565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4291906155ae565b50505050565b5f610a5864e8d4a5100083615619565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa7575080546001600160401b03808416911610155b15610ac55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af0848461270e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ea98339815191525f80610b5684612728565b91509150610b6382612a72565b610b6d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9b57610b9b61543a565b03610bc0575f83815260088501602052604081208054919055610bbe8282612aad565b505b610bd681610bd184604001516113e6565b612b23565b5050505050565b5f80516020615ea98339815191525f610bf584612b46565b90505f80610c068360400151612d20565b50915091505f610c1583611ff7565b9050816001600160401b031681606001516001600160401b03161015610c4d5760405162461bcd60e51b815260040161054190615638565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c925760405162461bcd60e51b81526004016105419061567a565b60015f87815260068701602052604090205460ff166004811115610cb857610cb861543a565b14610d215760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610541565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ee98339815191529060ff1615610e4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb691906155ae565b836020013514610f185760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610541565b30610f2960608501604086016156c3565b6001600160a01b031614610f9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610541565b5f610fa960608501856156de565b91505f9050843560208601356014610fc76060890160408a016156c3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f6575f61104760608901896156de565b8363ffffffff1681811061105d5761105d615723565b905060200281019061106f9190615737565b611078906157e7565b80515f81815260098901602052604090205491925090156110ab5760405162461bcd60e51b81526004016105419061587e565b84825f0151836020015184604001516040516020016110cd94939291906158c6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111b9190615915565b602060405180830381855afa158015611136573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115991906155ae565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e5576111e561543a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611298911686615926565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ef90615939565b905061102b565b50600584018190555f61130886612b46565b90505f6113188260400151612f5b565b90508060028560405161132b9190615915565b602060405180830381855afa158015611346573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136991906155ae565b146113cd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610541565b505050600a909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a5100061595b565b5f61140982611ff7565b6080015192915050565b5f80516020615ea98339815191525f61142b856130cd565b905061143685612a72565b611441575050505050565b5f85815260058301602052604090205460a082015161147091600160b01b90046001600160401b031690615972565b6001600160401b03168160c001516001600160401b031610156114f15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610541565b8315610bd6575f61150286856120f4565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611559906113e6565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f391906155ae565b5f87815260088501602052604081208054909190611612908490615926565b9091555050505050505050565b5f80516020615ea98339815191525f61163783611ff7565b905060048151600581111561164e5761164e61543a565b146116b85760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610541565b5f8381526005830160205260409020546001600160a01b0316331461173a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610541565b5f83815260088301602090815260408083208054908490556005860190925290912054610a42906001600160a01b031682612aad565b611778613348565b5f80516020615ea98339815191525f61179084612b46565b90505f806117a18360400151612d20565b50915091505f6117b083611ff7565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117ea576117ea61543a565b60048111156117fb576117fb61543a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118df5760405162461bcd60e51b815260040161054190615638565b826001600160401b03168160e001516001600160401b031611156119155760405162461bcd60e51b81526004016105419061567a565b60038151600481111561192a5761192a61543a565b1461197e5760405162461bcd60e51b815260206004820152603160248201525f80516020615ec98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610541565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119bf90600160a01b900461ffff168461595b565b6119c99190615619565b905080886008015f8881526020019081526020015f205f8282546119ed9190615926565b90915550506020830151611a0a90611a058385615992565b612aad565b611a1f8360200151610bd185606001516113e6565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a7560015f80516020615f0983398151915255565b5050565b5f611a82613348565b611a8d833384613392565b9050610a5860015f80516020615f0983398151915255565b5f80516020615ee98339815191525f611abd83612b46565b90505f80611ace836040015161374c565b9150915080611b305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610541565b5f82815260078501602052604081208054611b4a906159a5565b9050118015611b7c575060015f83815260088601602052604090205460ff166005811115611b7a57611b7a61543a565b145b611b985760405162461bcd60e51b8152600401610541906159dd565b5f8281526007850160205260408120611bb091615208565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ea983398151915293929190829060ff166004811115611cbe57611cbe61543a565b6004811115611ccf57611ccf61543a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5657611d5661543a565b1480611d745750600381516004811115611d7257611d7261543a565b145b611dc85760405162461bcd60e51b815260206004820152603260248201525f80516020615ec9833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610541565b5f611dd68260400151611ff7565b905080606001516001600160401b03165f03611e5a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb611e878460400151846060015185608001516124e7565b6040518263ffffffff1660e01b8152600401611ea391906155e7565b6020604051808303815f875af1158015611ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd691906155ae565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ee9833981519152929190611f2b906159a5565b9050118015611f5d575060015f83815260088301602052604090205460ff166005811115611f5b57611f5b61543a565b145b611f795760405162461bcd60e51b8152600401610541906159dd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fb29190600401615a24565b6020604051808303815f875af1158015611fce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff291906155ae565b505050565b611fff61523f565b5f8281525f80516020615f29833981519152602052604090819020815160e0810190925280545f80516020615ee9833981519152929190829060ff16600581111561204c5761204c61543a565b600581111561205d5761205d61543a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120c8613348565b6120d4858585856138ed565b90506120ec60015f80516020615f0983398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561213f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121669190810190615ab9565b91509150806121c95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561220c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223091906155ae565b8251146122945760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610541565b60208201516001600160a01b03161561230a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610541565b5f806123198460400151613b62565b915091508187146123865760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610541565b9695505050505050565b5f8281525f80516020615f29833981519152602052604081206002015481905f80516020615ee983398151915290600160801b90046001600160401b03166123d88582613d3a565b5f6123e287613f48565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124328a858b6124e7565b6040518263ffffffff1660e01b815260040161244e91906155e7565b6020604051808303815f875af115801561246a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e91906155ae565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561256057612520816001615992565b61252b90600861595b565b5081515f9083908390811061254257612542615723565b60200101906001600160f81b03191690815f1a90535060010161250c565b505f5b60048110156125cb57612577816003615992565b61258290600861595b565b600263ffffffff16901c60f81b8282600261259d9190615926565b815181106125ad576125ad615723565b60200101906001600160f81b03191690815f1a905350600101612563565b505f5b602081101561262d576125e281601f615992565b6125ed90600861595b565b86901c60f81b826125ff836006615926565b8151811061260f5761260f615723565b60200101906001600160f81b03191690815f1a9053506001016125ce565b505f5b600881101561269857612644816007615992565b61264f90600861595b565b6001600160401b038616901c60f81b8261266a836026615926565b8151811061267a5761267a615723565b60200101906001600160f81b03191690815f1a905350600101612630565b505f5b6008811015612703576126af816007615992565b6126ba90600861595b565b6001600160401b038516901c60f81b826126d583602e615926565b815181106126e5576126e5615723565b60200101906001600160f81b03191690815f1a90535060010161269b565b5090505b9392505050565b612716613fd8565b61271f82614023565b611a758161409a565b5f61273161523f565b5f80516020615ee98339815191525f61274985612b46565b90505f8061275a836040015161374c565b9150915080156127bf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610541565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f0576127f061543a565b60058111156128015761280161543a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156128725761287261543a565b1480612890575060018251600581111561288e5761288e61543a565b145b6128ef5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610541565b6003825160058111156129045761290461543a565b0361291157506004612915565b5060055b6020808301515f9081526009880190915260408120558181600581111561293e5761293e61543a565b908160058111156129515761295161543a565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156129855761298561543a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a3957612a3961543a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615e8983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b08575f80fd5b505af1158015612b1a573d5f803e3d5ffd5b50505050505050565b5f80516020615e8983398151915254611a75906001600160a01b0316838361413b565b60408051606080820183525f8083526020830181905292820152905f80516020615ee98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bbb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612be29190810190615ab9565b9150915080612c425760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610541565b8254825114612ca55760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610541565b60208201516001600160a01b031615612d185760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610541565b509392505050565b5f805f8351603614612d445760405162461bcd60e51b815260040161054190615b8b565b5f805b6002811015612d9357612d5b816001615992565b612d6690600861595b565b61ffff16868281518110612d7c57612d7c615723565b016020015160f81c901b9190911790600101612d47565b5061ffff811615612db65760405162461bcd60e51b815260040161054190615bd4565b5f805b6004811015612e1157612dcd816003615992565b612dd890600861595b565b63ffffffff1687612dea836002615926565b81518110612dfa57612dfa615723565b016020015160f81c901b9190911790600101612db9565b5063ffffffff8116600414612e385760405162461bcd60e51b815260040161054190615c17565b5f805b6020811015612e8d57612e4f81601f615992565b612e5a90600861595b565b88612e66836006615926565b81518110612e7657612e76615723565b016020015160f81c901b9190911790600101612e3b565b505f805b6008811015612eec57612ea5816007615992565b612eb090600861595b565b6001600160401b031689612ec5836026615926565b81518110612ed557612ed5615723565b016020015160f81c901b9190911790600101612e91565b505f805b6008811015612f4b57612f04816007615992565b612f0f90600861595b565b6001600160401b03168a612f2483602e615926565b81518110612f3457612f34615723565b016020015160f81c901b9190911790600101612ef0565b5091989097509095509350505050565b5f8151602614612f7d5760405162461bcd60e51b815260040161054190615b8b565b5f805b6002811015612fcc57612f94816001615992565b612f9f90600861595b565b61ffff16848281518110612fb557612fb5615723565b016020015160f81c901b9190911790600101612f80565b5061ffff811615612fef5760405162461bcd60e51b815260040161054190615bd4565b5f805b600481101561304a57613006816003615992565b61301190600861595b565b63ffffffff1685613023836002615926565b8151811061303357613033615723565b016020015160f81c901b9190911790600101612ff2565b5063ffffffff81161561306f5760405162461bcd60e51b815260040161054190615c17565b5f805b60208110156130c45761308681601f615992565b61309190600861595b565b8661309d836006615926565b815181106130ad576130ad615723565b016020015160f81c901b9190911790600101613072565b50949350505050565b6130d561523f565b5f8281525f80516020615f298339815191526020526040808220815160e0810190925280545f80516020615ee983398151915293929190829060ff1660058111156131225761312261543a565b60058111156131335761313361543a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131a5576131a561543a565b146132015760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610541565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156132455761324561543a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132f18582612390565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f0983398151915280546001190161337957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f0983398151915255565b5f5f80516020615ea9833981519152816133ae61022c8561419a565b90505f6133ba87611ff7565b90506133c587612a72565b6134225760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610541565b6002815160058111156134375761343761543a565b146134965760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610541565b5f8282608001516134a79190615972565b600485015460408401519192506134c9916001600160401b0390911690615c5e565b6001600160401b0316816001600160401b031611156135485760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610541565b5f806135548a84612390565b915091505f8a8360405160200161358292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561361d5761361d61543a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461376f5760405162461bcd60e51b815260040161054190615b8b565b5f805b60028110156137be57613786816001615992565b61379190600861595b565b61ffff168582815181106137a7576137a7615723565b016020015160f81c901b9190911790600101613772565b5061ffff8116156137e15760405162461bcd60e51b815260040161054190615bd4565b5f805b600481101561383c576137f8816003615992565b61380390600861595b565b63ffffffff1686613815836002615926565b8151811061382557613825615723565b016020015160f81c901b91909117906001016137e4565b5063ffffffff81166003146138635760405162461bcd60e51b815260040161054190615c17565b5f805b60208110156138b85761387a81601f615992565b61388590600861595b565b87613891836006615926565b815181106138a1576138a1615723565b016020015160f81c901b9190911790600101613866565b505f866026815181106138cd576138cd615723565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ea98339815191529061ffff861610801590613939575061271061ffff861611155b6139555760405162461bcd60e51b815260040161054190615c89565b60028101546001600160401b0390811690851610156139ce5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610541565b8054831015613a315760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610541565b8060010154831115613a985760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610541565b5f613aa28461419a565b90505f613aae82610a48565b90505f613abb89836141bd565b90506040518060600160405280613acf3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b855760405162461bcd60e51b815260040161054190615b8b565b5f805b6002811015613bd457613b9c816001615992565b613ba790600861595b565b61ffff16858281518110613bbd57613bbd615723565b016020015160f81c901b9190911790600101613b88565b5061ffff811615613bf75760405162461bcd60e51b815260040161054190615bd4565b5f805b6004811015613c5257613c0e816003615992565b613c1990600861595b565b63ffffffff1686613c2b836002615926565b81518110613c3b57613c3b615723565b016020015160f81c901b9190911790600101613bfa565b5063ffffffff8116600514613c795760405162461bcd60e51b815260040161054190615c17565b5f805b6020811015613cce57613c9081601f615992565b613c9b90600861595b565b87613ca7836006615926565b81518110613cb757613cb7615723565b016020015160f81c901b9190911790600101613c7c565b505f805b6008811015613d2d57613ce6816007615992565b613cf190600861595b565b6001600160401b031688613d06836026615926565b81518110613d1657613d16615723565b016020015160f81c901b9190911790600101613cd2565b5090969095509350505050565b5f80516020615ee98339815191525f6001600160401b038084169085161115613d6e57613d67838561558e565b9050613d7b565b613d78848461558e565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ddd575060028401548151613dd9916001600160401b031690615926565b8210155b15613e03576001600160401b038316606082015281815260408101516020820152613e22565b8281606001818151613e159190615972565b6001600160401b03169052505b6060810151613e32906064615c5e565b602082015160028601546001600160401b039290921691613e5d9190600160401b900460ff1661595b565b1015613ec15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610541565b856001600160401b031681604001818151613edc9190615926565b9052506040810180516001600160401b0387169190613efc908390615992565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f298339815191526020526040812060020180545f80516020615ee983398151915291600160401b9091046001600160401b0316906008613f9283615cd4565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402157604051631afcd79f60e31b815260040160405180910390fd5b565b61402b613fd8565b61403481614722565b61403c61473b565b614097608082013560a083013561405960e0850160c08601615401565b61406a610100860160e08701615cef565b61ffff1661408061012087016101008801615d08565b614092610140880161012089016156c3565b61474b565b50565b6140a2613fd8565b5f80516020615e898339815191526001600160a01b03821661411b5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610541565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ff291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061498f565b5f610a58825f80516020615e89833981519152546001600160a01b0316906149f0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610541565b5f80516020615ee9833981519152426142676040860160208701615401565b6001600160401b0316116142d95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610541565b6142e96040850160208601615401565b6001600160401b03166142ff6202a30042615926565b116143725760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610541565b83356143ca5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610541565b83355f908152600982016020526040902054156143f95760405162461bcd60e51b81526004016105419061587e565b60306144086040860186615d28565b90501461446d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610541565b614477835f613d3a565b5f806145116040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144bc9190615401565b6001600160401b031681526020016144d760408a018a615d28565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b52565b5f8281526007860160205260409020919350915061452f8282615dae565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061455c9085906004016155e7565b6020604051808303815f875af1158015614578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061459c91906155ae565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156146145761461461543a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146f4918e01908e01615401565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61472a613fd8565b614732614f01565b61409781614f09565b614743613fd8565b6140216150ab565b614753613fd8565b5f80516020615ea9833981519152836147bf5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610541565b6127108411156147e15760405162461bcd60e51b815260040161054190615c89565b858711156148495760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610541565b5f8360ff16116148b65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610541565b600a60ff841611156149285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610541565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149a36001600160a01b038416836150b3565b905080515f141580156149c75750808060200190518101906149c59190615e6d565b155b15611ff257604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a5a91906155ae565b9050614a716001600160a01b0385163330866150c0565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614ab5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ad991906155ae565b9050818111614b3f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610541565b614b498282615992565b95945050505050565b5f6060826080015151603014614bbc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610541565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3357614bf3816001615992565b614bfe90600861595b565b5081515f90839083908110614c1557614c15615723565b60200101906001600160f81b03191690815f1a905350600101614bdf565b505f5b6004811015614c9b57614c4a816003615992565b614c5590600861595b565b600160ff919091161c60f81b82614c6d836002615926565b81518110614c7d57614c7d615723565b60200101906001600160f81b03191690815f1a905350600101614c36565b505f5b6020811015614cf85784518160208110614cba57614cba615723565b1a60f81b82614cca836006615926565b81518110614cda57614cda615723565b60200101906001600160f81b03191690815f1a905350600101614c9e565b505f5b6020811015614d585784602001518160208110614d1a57614d1a615723565b1a60f81b82614d2a836026615926565b81518110614d3a57614d3a615723565b60200101906001600160f81b03191690815f1a905350600101614cfb565b505f5b6008811015614dcc57614d6f816007615992565b614d7a90600861595b565b60ff1685604001516001600160401b0316901c60f81b82826046614d9e9190615926565b81518110614dae57614dae615723565b60200101906001600160f81b03191690815f1a905350600101614d5b565b505f5b6030811015614e375784608001518181518110614dee57614dee615723565b01602001516001600160f81b03191682614e0983604e615926565b81518110614e1957614e19615723565b60200101906001600160f81b03191690815f1a905350600101614dcf565b505f5b6008811015614ea957614e4e816007615992565b614e5990600861595b565b60608601516001600160401b0390811691161c60f81b82614e7b83607e615926565b81518110614e8b57614e8b615723565b60200101906001600160f81b03191690815f1a905350600101614e3a565b50600281604051614eba9190615915565b602060405180830381855afa158015614ed5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ef891906155ae565b94909350915050565b614021613fd8565b614f11613fd8565b80355f80516020615ee983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f5d6080840160608501615d08565b60ff161115614fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610541565b5f614fdb6080840160608501615d08565b60ff16116150435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610541565b6150536080830160608401615d08565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556150846060830160408401615401565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61337f613fd8565b606061270783835f6150f9565b6040516001600160a01b038481166024830152838116604483015260648201839052610a429186918216906323b872dd90608401614168565b60608147101561511e5760405163cd78605960e01b8152306004820152602401610541565b5f80856001600160a01b031684866040516151399190615915565b5f6040518083038185875af1925050503d805f8114615173576040519150601f19603f3d011682016040523d82523d5f602084013e615178565b606091505b509150915061238686838360608261519857615193826151df565b612707565b81511580156151af57506001600160a01b0384163b155b156151d857604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b5080612707565b8051156151ef5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054615214906159a5565b5f825580601f10615223575050565b601f0160209004905f5260205f2090810190614097919061527b565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561528f575f815560010161527c565b5090565b8015158114614097575f80fd5b803563ffffffff811681146152b3575f80fd5b919050565b5f805f606084860312156152ca575f80fd5b8335925060208401356152dc81615293565b91506152ea604085016152a0565b90509250925092565b5f60208284031215615303575f80fd5b5035919050565b6001600160a01b0381168114614097575f80fd5b5f80828403610160811215615331575f80fd5b61014080821215615340575f80fd5b84935083013590506153518161530a565b809150509250929050565b5f6020828403121561536c575f80fd5b612707826152a0565b5f8060408385031215615386575f80fd5b61538f836152a0565b946020939093013593505050565b5f80604083850312156153ae575f80fd5b82356001600160401b038111156153c3575f80fd5b8301608081860312156153d4575f80fd5b91506153e2602084016152a0565b90509250929050565b80356001600160401b03811681146152b3575f80fd5b5f60208284031215615411575f80fd5b612707826153eb565b5f806040838503121561542b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154ac60608401826001600160401b03169052565b5060808301516154c760808401826001600160401b03169052565b5060a08301516154e260a08401826001600160401b03169052565b5060c08301516154fd60c08401826001600160401b03169052565b5092915050565b803561ffff811681146152b3575f80fd5b5f805f8060808587031215615528575f80fd5b84356001600160401b0381111561553d575f80fd5b85016060818803121561554e575f80fd5b935061555c60208601615504565b925061556a604086016153eb565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154fd576154fd61557a565b5f602082840312156155be575f80fd5b5051919050565b5f5b838110156155df5781810151838201526020016155c7565b50505f910152565b602081525f82518060208401526156058160408501602087016155c5565b601f01601f19169190910160400192915050565b5f8261563357634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156d3575f80fd5b81356127078161530a565b5f808335601e198436030181126156f3575f80fd5b8301803591506001600160401b0382111561570c575f80fd5b6020019150600581901b36038213156124e0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261574b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561578b5761578b615755565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157b9576157b9615755565b604052919050565b5f6001600160401b038211156157d9576157d9615755565b50601f01601f191660200190565b5f606082360312156157f7575f80fd5b6157ff615769565b8235815260206158108185016153eb565b8183015260408401356001600160401b0381111561582c575f80fd5b840136601f82011261583c575f80fd5b803561584f61584a826157c1565b615791565b8181523684838501011115615862575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158d7818460208a016155c5565b80830190508581526001600160401b0360c01b8560c01b16602082015283516159078160288401602088016155c5565b016028019695505050505050565b5f825161574b8184602087016155c5565b80820180821115610a5857610a5861557a565b5f63ffffffff8083168181036159515761595161557a565b6001019392505050565b8082028115828204841417610a5857610a5861557a565b6001600160401b038181168382160190808211156154fd576154fd61557a565b81810381811115610a5857610a5861557a565b600181811c908216806159b957607f821691505b6020821081036159d757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a36816159a5565b806020870152604060018084165f8114615a575760018114615a7357615aa0565b60ff19851660408a0152604084151560051b8a01019550615aa0565b895f5260205f205f5b85811015615a975781548b8201860152908301908801615a7c565b8a016040019650505b509398975050505050505050565b80516152b381615293565b5f8060408385031215615aca575f80fd5b82516001600160401b0380821115615ae0575f80fd5b9084019060608287031215615af3575f80fd5b615afb615769565b82518152602080840151615b0e8161530a565b82820152604084015183811115615b23575f80fd5b80850194505087601f850112615b37575f80fd5b83519250615b4761584a846157c1565b8381528882858701011115615b5a575f80fd5b615b69848383018488016155c5565b80604084015250819550615b7e818801615aae565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615c8157615c8161557a565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036159515761595161557a565b5f60208284031215615cff575f80fd5b61270782615504565b5f60208284031215615d18575f80fd5b813560ff81168114612707575f80fd5b5f808335601e19843603018112615d3d575f80fd5b8301803591506001600160401b03821115615d56575f80fd5b6020019150368190038213156124e0575f80fd5b601f821115611ff257805f5260205f20601f840160051c81016020851015615d8f5750805b601f840160051c820191505b81811015610bd6575f8155600101615d9b565b81516001600160401b03811115615dc757615dc7615755565b615ddb81615dd584546159a5565b84615d6a565b602080601f831160018114615e0e575f8415615df75750858301515b5f19600386901b1c1916600185901b178555615e65565b5f85815260208120601f198616915b82811015615e3c57888601518255948401946001909101908401615e1d565b5085821015615e5957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e7d575f80fd5b81516127078161529356fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index aa630ebfe..1a312f622 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d69380380615d6983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c1c8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b336600461501c565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615057565b6109d7565b3480156101e4575f80fd5b506102236101f3366004615057565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461506e565b610b90565b348015610286575f80fd5b5061029a610295366004615057565b610c6d565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150ac565b610c83565b34801561032a575f80fd5b506101b8610339366004615100565b610cb7565b348015610349575f80fd5b506101b8610358366004615119565b610d57565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615141565b610f2c565b3480156103b0575f80fd5b506102236103bf36600461518f565b611560565b3480156103cf575f80fd5b5061029a6103de366004615057565b611579565b3480156103ee575f80fd5b506101b86103fd36600461501c565b61158d565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615057565b611799565b348015610440575f80fd5b506101b861044f366004615119565b6118ea565b34801561045f575f80fd5b506101b861046e366004615100565b611bfc565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615057565b611db4565b3480156104b7575f80fd5b506101b86104c6366004615057565b61203a565b6102236104d9366004615057565b61214e565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615057565b61217f565b60405161022d91906151bc565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615b70833981519152949193919290829060ff16600481111561059c5761059c6151a8565b60048111156105ad576105ad6151a8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6106298361217f565b9050600282516004811115610640576106406151a8565b146106925760405162461bcd60e51b815260206004820152602a60248201525f80516020615b908339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106f75760405162461bcd60e51b815260206004820152603360248201525f80516020615b908339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610689565b6003825280515f906002906005811115610713576107136151a8565b0361076a57861561072b576107288487612247565b90505b5f836060015183608001516107409190615286565b905061074c85826124e3565b506001600160401b0390811660e0860152421660a08501525061079e565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d18560600151611560565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087291906152a6565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108b1576108b16151a8565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615bf08339815191526020526040808220815160e0810190925280545f80516020615bb083398151915293929190829060ff166005811115610a2457610a246151a8565b6005811115610a3557610a356151a8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa457610aa46151a8565b14610b095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb610b2e8584606001515f61263a565b6040518263ffffffff1660e01b8152600401610b4a91906152df565b6020604051808303815f875af1158015610b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8a91906152a6565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bd9575080546001600160401b03808416911610155b15610bf75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c218361285f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7d64e8d4a5100083615311565b92915050565b5f610c8c612873565b610c98848484346128aa565b9050610cb060015f80516020615bd083398151915255565b9392505050565b5f80516020615b708339815191525f80610cd084612b27565b91509150610cdd82612e71565b610ce75750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1557610d156151a8565b03610d3a575f83815260088501602052604081208054919055610d388282612eac565b505b610d5081610d4b8460400151611560565b612f12565b5050505050565b5f80516020615b708339815191525f610d6f84612f25565b90505f80610d8083604001516130ff565b50915091505f610d8f8361217f565b9050816001600160401b031681606001516001600160401b03161015610dc75760405162461bcd60e51b815260040161068990615330565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0c5760405162461bcd60e51b815260040161068990615372565b60015f87815260068701602052604090205460ff166004811115610e3257610e326151a8565b14610e9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610689565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bb08339815191529060ff1615610fc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103091906152a6565b8360200135146110925760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610689565b306110a360608501604086016153cf565b6001600160a01b0316146111155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610689565b5f61112360608501856153ea565b91505f90508435602086013560146111416060890160408a016153cf565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611470575f6111c160608901896153ea565b8363ffffffff168181106111d7576111d761542f565b90506020028101906111e99190615443565b6111f2906154f3565b80515f81815260098901602052604090205491925090156112255760405162461bcd60e51b81526004016106899061558a565b84825f01518360200151846040015160405160200161124794939291906155d2565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112959190615621565b602060405180830381855afa1580156112b0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d391906152a6565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561135f5761135f6151a8565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611412911686615632565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146990615645565b90506111a5565b50600584018190555f61148286612f25565b90505f611492826040015161333a565b9050806002856040516114a59190615621565b602060405180830381855afa1580156114c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e391906152a6565b146115475760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610689565b505050600a909201805460ff1916600117905550505050565b5f610c7d6001600160401b03831664e8d4a51000615667565b5f6115838261217f565b6080015192915050565b5f80516020615b708339815191525f6115a5856134a3565b90506115b085612e71565b6115bb575050505050565b5f85815260058301602052604090205460a08201516115ea91600160b01b90046001600160401b03169061567e565b6001600160401b03168160c001516001600160401b0316101561166b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610689565b8315610d50575f61167c8685612247565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906116d390611560565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611749573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176d91906152a6565b5f8781526008850160205260408120805490919061178c908490615632565b9091555050505050505050565b5f80516020615b708339815191525f6117b18361217f565b90506004815160058111156117c8576117c86151a8565b146118325760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610689565b5f8381526005830160205260409020546001600160a01b031633146118b45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610689565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8a906001600160a01b031682612eac565b6118f2612873565b5f80516020615b708339815191525f61190a84612f25565b90505f8061191b83604001516130ff565b50915091505f61192a8361217f565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611964576119646151a8565b6004811115611975576119756151a8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b03808216606080850191909152600160401b830482166080850152600160801b8304821660a0850152600160c01b909204811660c0840152600390930154831660e09092019190915284015191925084811691161015611a145760405162461bcd60e51b815260040161068990615330565b826001600160401b03168160e001516001600160401b03161115611a4a5760405162461bcd60e51b815260040161068990615372565b600381516004811115611a5f57611a5f6151a8565b14611ab35760405162461bcd60e51b815260206004820152603160248201525f80516020615b908339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610689565b5f8781526006870160209081526040808320805460ff1916600417905560078901825280832080549084905587845260058a0190925282205490919061271090611b099061ffff600160a01b9091041684615667565b611b139190615311565b905080886008015f8881526020019081526020015f205f828254611b379190615632565b90915550506020830151611b5490611b4f838561569e565b612eac565b611b698360200151610d4b8560600151611560565b5f89815260068901602052604080822080546001600160a81b03191681556001810183905560028101839055600301805467ffffffffffffffff19169055516001600160401b0387169188918c917f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab91a45050505050505050611bf860015f80516020615bd083398151915255565b5050565b5f80516020615bb08339815191525f611c1483612f25565b90505f80611c25836040015161371e565b9150915080611c875760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610689565b5f82815260078501602052604081208054611ca1906156b1565b9050118015611cd3575060015f83815260088601602052604090205460ff166005811115611cd157611cd16151a8565b145b611cef5760405162461bcd60e51b8152600401610689906156e3565b5f8281526007850160205260408120611d0791614f71565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b7083398151915293929190829060ff166004811115611e1557611e156151a8565b6004811115611e2657611e266151a8565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ead57611ead6151a8565b1480611ecb5750600381516004811115611ec957611ec96151a8565b145b611f1f5760405162461bcd60e51b815260206004820152603260248201525f80516020615b90833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610689565b5f611f2d826040015161217f565b905080606001516001600160401b03165f03611fb15760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb611fde84604001518460600151856080015161263a565b6040518263ffffffff1660e01b8152600401611ffa91906152df565b6020604051808303815f875af1158015612016573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5091906152a6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bb0833981519152929190612082906156b1565b90501180156120b4575060015f83815260088301602052604090205460ff1660058111156120b2576120b26151a8565b145b6120d05760405162461bcd60e51b8152600401610689906156e3565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612109919060040161572a565b6020604051808303815f875af1158015612125573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214991906152a6565b505050565b5f612157612873565b6121628233346138bf565b905061217a60015f80516020615bd083398151915255565b919050565b612187614fa8565b5f8281525f80516020615bf0833981519152602052604090819020815160e0810190925280545f80516020615bb0833981519152929190829060ff1660058111156121d4576121d46151a8565b60058111156121e5576121e56151a8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612292573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b991908101906157bf565b915091508061231c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561235f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238391906152a6565b8251146123e75760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610689565b60208201516001600160a01b03161561245d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610689565b5f8061246c8460400151613c76565b915091508187146124d95760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610689565b9695505050505050565b5f8281525f80516020615bf0833981519152602052604081206002015481905f80516020615bb083398151915290600160801b90046001600160401b031661252b8582613e4e565b5f6125358761405c565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125858a858b61263a565b6040518263ffffffff1660e01b81526004016125a191906152df565b6020604051808303815f875af11580156125bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125e191906152a6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126b35761267381600161569e565b61267e906008615667565b5081515f908390839081106126955761269561542f565b60200101906001600160f81b03191690815f1a90535060010161265f565b505f5b600481101561271e576126ca81600361569e565b6126d5906008615667565b600263ffffffff16901c60f81b828260026126f09190615632565b815181106127005761270061542f565b60200101906001600160f81b03191690815f1a9053506001016126b6565b505f5b60208110156127805761273581601f61569e565b612740906008615667565b86901c60f81b82612752836006615632565b815181106127625761276261542f565b60200101906001600160f81b03191690815f1a905350600101612721565b505f5b60088110156127eb5761279781600761569e565b6127a2906008615667565b6001600160401b038616901c60f81b826127bd836026615632565b815181106127cd576127cd61542f565b60200101906001600160f81b03191690815f1a905350600101612783565b505f5b60088110156128565761280281600761569e565b61280d906008615667565b6001600160401b038516901c60f81b8261282883602e615632565b815181106128385761283861542f565b60200101906001600160f81b03191690815f1a9053506001016127ee565b50949350505050565b6128676140ec565b61287081614137565b50565b5f80516020615bd08339815191528054600119016128a457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b708339815191529061ffff8616108015906128f6575061271061ffff861611155b6129125760405162461bcd60e51b815260040161068990615891565b60028101546001600160401b03908116908516101561298b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610689565b80548310156129ee5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610689565b8060010154831115612a555760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610689565b825f612a6082610c6d565b90505f612a6d89836141ab565b90506040518060600160405280612a813390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bd083398151915255565b5f612b30614fa8565b5f80516020615bb08339815191525f612b4885612f25565b90505f80612b59836040015161371e565b915091508015612bbe5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610689565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bef57612bef6151a8565b6005811115612c0057612c006151a8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c7157612c716151a8565b1480612c8f5750600182516005811115612c8d57612c8d6151a8565b145b612cee5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610689565b600382516005811115612d0357612d036151a8565b03612d1057506004612d14565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3d57612d3d6151a8565b90816005811115612d5057612d506151a8565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d8457612d846151a8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e3857612e386151a8565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ef8575f80fd5b505af1158015612f0a573d5f803e3d5ffd5b505050505050565b611bf86001600160a01b03831682614710565b60408051606080820183525f8083526020830181905292820152905f80516020615bb08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f9a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fc191908101906157bf565b91509150806130215760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610689565b82548251146130845760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610689565b60208201516001600160a01b0316156130f75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610689565b509392505050565b5f805f83516036146131235760405162461bcd60e51b8152600401610689906158dc565b5f805b60028110156131725761313a81600161569e565b613145906008615667565b61ffff1686828151811061315b5761315b61542f565b016020015160f81c901b9190911790600101613126565b5061ffff8116156131955760405162461bcd60e51b815260040161068990615925565b5f805b60048110156131f0576131ac81600361569e565b6131b7906008615667565b63ffffffff16876131c9836002615632565b815181106131d9576131d961542f565b016020015160f81c901b9190911790600101613198565b5063ffffffff81166004146132175760405162461bcd60e51b815260040161068990615968565b5f805b602081101561326c5761322e81601f61569e565b613239906008615667565b88613245836006615632565b815181106132555761325561542f565b016020015160f81c901b919091179060010161321a565b505f805b60088110156132cb5761328481600761569e565b61328f906008615667565b6001600160401b0316896132a4836026615632565b815181106132b4576132b461542f565b016020015160f81c901b9190911790600101613270565b505f805b600881101561332a576132e381600761569e565b6132ee906008615667565b6001600160401b03168a61330383602e615632565b815181106133135761331361542f565b016020015160f81c901b91909117906001016132cf565b5091989097509095509350505050565b5f815160261461335c5760405162461bcd60e51b8152600401610689906158dc565b5f805b60028110156133ab5761337381600161569e565b61337e906008615667565b61ffff168482815181106133945761339461542f565b016020015160f81c901b919091179060010161335f565b5061ffff8116156133ce5760405162461bcd60e51b815260040161068990615925565b5f805b6004811015613429576133e581600361569e565b6133f0906008615667565b63ffffffff1685613402836002615632565b815181106134125761341261542f565b016020015160f81c901b91909117906001016133d1565b5063ffffffff81161561344e5760405162461bcd60e51b815260040161068990615968565b5f805b60208110156128565761346581601f61569e565b613470906008615667565b8661347c836006615632565b8151811061348c5761348c61542f565b016020015160f81c901b9190911790600101613451565b6134ab614fa8565b5f8281525f80516020615bf08339815191526020526040808220815160e0810190925280545f80516020615bb083398151915293929190829060ff1660058111156134f8576134f86151a8565b6005811115613509576135096151a8565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561357b5761357b6151a8565b146135d75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610689565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561361b5761361b6151a8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136c785826124e3565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137415760405162461bcd60e51b8152600401610689906158dc565b5f805b60028110156137905761375881600161569e565b613763906008615667565b61ffff168582815181106137795761377961542f565b016020015160f81c901b9190911790600101613744565b5061ffff8116156137b35760405162461bcd60e51b815260040161068990615925565b5f805b600481101561380e576137ca81600361569e565b6137d5906008615667565b63ffffffff16866137e7836002615632565b815181106137f7576137f761542f565b016020015160f81c901b91909117906001016137b6565b5063ffffffff81166003146138355760405162461bcd60e51b815260040161068990615968565b5f805b602081101561388a5761384c81601f61569e565b613857906008615667565b87613863836006615632565b815181106138735761387361542f565b016020015160f81c901b9190911790600101613838565b505f8660268151811061389f5761389f61542f565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b70833981519152816138d884610c6d565b90505f6138e48761217f565b90506138ef87612e71565b61394c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610689565b600281516005811115613961576139616151a8565b146139c05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610689565b5f8282608001516139d1919061567e565b600485015460408401519192506139f3916001600160401b03909116906159af565b6001600160401b0316816001600160401b03161115613a725760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610689565b5f80613a7e8a846124e3565b915091505f8a83604051602001613aac92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b4757613b476151a8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c995760405162461bcd60e51b8152600401610689906158dc565b5f805b6002811015613ce857613cb081600161569e565b613cbb906008615667565b61ffff16858281518110613cd157613cd161542f565b016020015160f81c901b9190911790600101613c9c565b5061ffff811615613d0b5760405162461bcd60e51b815260040161068990615925565b5f805b6004811015613d6657613d2281600361569e565b613d2d906008615667565b63ffffffff1686613d3f836002615632565b81518110613d4f57613d4f61542f565b016020015160f81c901b9190911790600101613d0e565b5063ffffffff8116600514613d8d5760405162461bcd60e51b815260040161068990615968565b5f805b6020811015613de257613da481601f61569e565b613daf906008615667565b87613dbb836006615632565b81518110613dcb57613dcb61542f565b016020015160f81c901b9190911790600101613d90565b505f805b6008811015613e4157613dfa81600761569e565b613e05906008615667565b6001600160401b031688613e1a836026615632565b81518110613e2a57613e2a61542f565b016020015160f81c901b9190911790600101613de6565b5090969095509350505050565b5f80516020615bb08339815191525f6001600160401b038084169085161115613e8257613e7b8385615286565b9050613e8f565b613e8c8484615286565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ef1575060028401548151613eed916001600160401b031690615632565b8210155b15613f17576001600160401b038316606082015281815260408101516020820152613f36565b8281606001818151613f29919061567e565b6001600160401b03169052505b6060810151613f469060646159af565b602082015160028601546001600160401b039290921691613f719190600160401b900460ff16615667565b1015613fd55760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610689565b856001600160401b031681604001818151613ff09190615632565b9052506040810180516001600160401b038716919061401090839061569e565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615bf08339815191526020526040812060020180545f80516020615bb083398151915291600160401b9091046001600160401b03169060086140a6836159da565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661413557604051631afcd79f60e31b815260040160405180910390fd5b565b61413f6140ec565b614148816147a3565b6141506147bc565b612870608082013560a083013561416d60e0850160c0860161518f565b61417e610100860160e087016159f5565b61ffff1661419461012087016101008801615a0e565b6141a6610140880161012089016153cf565b6147cc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142365760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610689565b5f80516020615bb083398151915242614255604086016020870161518f565b6001600160401b0316116142c75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610689565b6142d7604085016020860161518f565b6001600160401b03166142ed6202a30042615632565b116143605760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610689565b83356143b85760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610689565b83355f908152600982016020526040902054156143e75760405162461bcd60e51b81526004016106899061558a565b60306143f66040860186615a2e565b90501461445b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610689565b614465835f613e4e565b5f806144ff6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144aa919061518f565b6001600160401b031681526020016144c560408a018a615a2e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a10565b5f8281526007860160205260409020919350915061451d8282615ab4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061454a9085906004016152df565b6020604051808303815f875af1158015614566573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061458a91906152a6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614602576146026151a8565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e2918e01908e0161518f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147335760405163cd78605960e01b8152306004820152602401610689565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461477c576040519150601f19603f3d011682016040523d82523d5f602084013e614781565b606091505b505090508061214957604051630a12f52160e11b815260040160405180910390fd5b6147ab6140ec565b6147b3614dbf565b61287081614dc7565b6147c46140ec565b614135614f69565b6147d46140ec565b5f80516020615b70833981519152836148405760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610689565b6127108411156148625760405162461bcd60e51b815260040161068990615891565b858711156148ca5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610689565b5f8360ff16116149375760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610689565b600a60ff841611156149a95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610689565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a7a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610689565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614af157614ab181600161569e565b614abc906008615667565b5081515f90839083908110614ad357614ad361542f565b60200101906001600160f81b03191690815f1a905350600101614a9d565b505f5b6004811015614b5957614b0881600361569e565b614b13906008615667565b600160ff919091161c60f81b82614b2b836002615632565b81518110614b3b57614b3b61542f565b60200101906001600160f81b03191690815f1a905350600101614af4565b505f5b6020811015614bb65784518160208110614b7857614b7861542f565b1a60f81b82614b88836006615632565b81518110614b9857614b9861542f565b60200101906001600160f81b03191690815f1a905350600101614b5c565b505f5b6020811015614c165784602001518160208110614bd857614bd861542f565b1a60f81b82614be8836026615632565b81518110614bf857614bf861542f565b60200101906001600160f81b03191690815f1a905350600101614bb9565b505f5b6008811015614c8a57614c2d81600761569e565b614c38906008615667565b60ff1685604001516001600160401b0316901c60f81b82826046614c5c9190615632565b81518110614c6c57614c6c61542f565b60200101906001600160f81b03191690815f1a905350600101614c19565b505f5b6030811015614cf55784608001518181518110614cac57614cac61542f565b01602001516001600160f81b03191682614cc783604e615632565b81518110614cd757614cd761542f565b60200101906001600160f81b03191690815f1a905350600101614c8d565b505f5b6008811015614d6757614d0c81600761569e565b614d17906008615667565b60608601516001600160401b0390811691161c60f81b82614d3983607e615632565b81518110614d4957614d4961542f565b60200101906001600160f81b03191690815f1a905350600101614cf8565b50600281604051614d789190615621565b602060405180830381855afa158015614d93573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614db691906152a6565b94909350915050565b6141356140ec565b614dcf6140ec565b80355f80516020615bb083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e1b6080840160608501615a0e565b60ff161115614e885760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610689565b5f614e996080840160608501615a0e565b60ff1611614f015760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610689565b614f116080830160608401615a0e565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f42606083016040840161518f565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b146140ec565b508054614f7d906156b1565b5f825580601f10614f8c575050565b601f0160209004905f5260205f20908101906128709190614fe4565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614ff8575f8155600101614fe5565b5090565b8015158114612870575f80fd5b803563ffffffff8116811461217a575f80fd5b5f805f6060848603121561502e575f80fd5b83359250602084013561504081614ffc565b915061504e60408501615009565b90509250925092565b5f60208284031215615067575f80fd5b5035919050565b5f610140828403121561507f575f80fd5b50919050565b803561ffff8116811461217a575f80fd5b80356001600160401b038116811461217a575f80fd5b5f805f606084860312156150be575f80fd5b83356001600160401b038111156150d3575f80fd5b8401606081870312156150e4575f80fd5b92506150f260208501615085565b915061504e60408501615096565b5f60208284031215615110575f80fd5b610cb082615009565b5f806040838503121561512a575f80fd5b61513383615009565b946020939093013593505050565b5f8060408385031215615152575f80fd5b82356001600160401b03811115615167575f80fd5b830160808186031215615178575f80fd5b915061518660208401615009565b90509250929050565b5f6020828403121561519f575f80fd5b610cb082615096565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151df57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521a60608401826001600160401b03169052565b50608083015161523560808401826001600160401b03169052565b5060a083015161525060a08401826001600160401b03169052565b5060c083015161526b60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526b5761526b615272565b5f602082840312156152b6575f80fd5b5051919050565b5f5b838110156152d75781810151838201526020016152bf565b50505f910152565b602081525f82518060208401526152fd8160408501602087016152bd565b601f01601f19169190910160400192915050565b5f8261532b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612870575f80fd5b5f602082840312156153df575f80fd5b8135610cb0816153bb565b5f808335601e198436030181126153ff575f80fd5b8301803591506001600160401b03821115615418575f80fd5b6020019150600581901b3603821315612633575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615457575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561549757615497615461565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154c5576154c5615461565b604052919050565b5f6001600160401b038211156154e5576154e5615461565b50601f01601f191660200190565b5f60608236031215615503575f80fd5b61550b615475565b82358152602061551c818501615096565b8183015260408401356001600160401b03811115615538575f80fd5b840136601f820112615548575f80fd5b803561555b615556826154cd565b61549d565b818152368483850101111561556e575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155e3818460208a016152bd565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156138160288401602088016152bd565b016028019695505050505050565b5f82516154578184602087016152bd565b80820180821115610c7d57610c7d615272565b5f63ffffffff80831681810361565d5761565d615272565b6001019392505050565b8082028115828204841417610c7d57610c7d615272565b6001600160401b0381811683821601908082111561526b5761526b615272565b81810381811115610c7d57610c7d615272565b600181811c908216806156c557607f821691505b60208210810361507f57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461573c816156b1565b806020870152604060018084165f811461575d5760018114615779576157a6565b60ff19851660408a0152604084151560051b8a010195506157a6565b895f5260205f205f5b8581101561579d5781548b8201860152908301908801615782565b8a016040019650505b509398975050505050505050565b805161217a81614ffc565b5f80604083850312156157d0575f80fd5b82516001600160401b03808211156157e6575f80fd5b90840190606082870312156157f9575f80fd5b615801615475565b82518152602080840151615814816153bb565b82820152604084015183811115615829575f80fd5b80850194505087601f85011261583d575f80fd5b8351925061584d615556846154cd565b8381528882858701011115615860575f80fd5b61586f848383018488016152bd565b806040840152508195506158848188016157b4565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159d2576159d2615272565b505092915050565b5f6001600160401b0380831681810361565d5761565d615272565b5f60208284031215615a05575f80fd5b610cb082615085565b5f60208284031215615a1e575f80fd5b813560ff81168114610cb0575f80fd5b5f808335601e19843603018112615a43575f80fd5b8301803591506001600160401b03821115615a5c575f80fd5b602001915036819003821315612633575f80fd5b601f82111561214957805f5260205f20601f840160051c81016020851015615a955750805b601f840160051c820191505b81811015610d50575f8155600101615aa1565b81516001600160401b03811115615acd57615acd615461565b615ae181615adb84546156b1565b84615a70565b602080601f831160018114615b14575f8415615afd5750858301515b5f19600386901b1c1916600185901b178555612f0a565b5f85815260208120601f198616915b82811015615b4257888601518255948401946001909101908401615b23565b5085821015615b5f57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d60380380615d6083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c138061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004615013565b610534565b005b3480156101c5575f80fd5b506101b86101d436600461504e565b6109d7565b3480156101e4575f80fd5b506102236101f336600461504e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b8610276366004615065565b610b90565b348015610286575f80fd5b5061029a61029536600461504e565b610c6d565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150a3565b610c83565b34801561032a575f80fd5b506101b86103393660046150f7565b610cb7565b348015610349575f80fd5b506101b8610358366004615110565b610d57565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615138565b610f2c565b3480156103b0575f80fd5b506102236103bf366004615186565b611560565b3480156103cf575f80fd5b5061029a6103de36600461504e565b611579565b3480156103ee575f80fd5b506101b86103fd366004615013565b61158d565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b861043036600461504e565b611799565b348015610440575f80fd5b506101b861044f366004615110565b6118ea565b34801561045f575f80fd5b506101b861046e3660046150f7565b611bf3565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a736600461504e565b611dab565b3480156104b7575f80fd5b506101b86104c636600461504e565b612031565b6102236104d936600461504e565b612145565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c36600461504e565b612176565b60405161022d91906151b3565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615b67833981519152949193919290829060ff16600481111561059c5761059c61519f565b60048111156105ad576105ad61519f565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61062983612176565b90506002825160048111156106405761064061519f565b146106925760405162461bcd60e51b815260206004820152602a60248201525f80516020615b878339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106f75760405162461bcd60e51b815260206004820152603360248201525f80516020615b878339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610689565b6003825280515f9060029060058111156107135761071361519f565b0361076a57861561072b57610728848761223e565b90505b5f83606001518360800151610740919061527d565b905061074c85826124da565b506001600160401b0390811660e0860152421660a08501525061079e565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d18560600151611560565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610872919061529d565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108b1576108b161519f565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615be78339815191526020526040808220815160e0810190925280545f80516020615ba783398151915293929190829060ff166005811115610a2457610a2461519f565b6005811115610a3557610a3561519f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa457610aa461519f565b14610b095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb610b2e8584606001515f612631565b6040518263ffffffff1660e01b8152600401610b4a91906152d6565b6020604051808303815f875af1158015610b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8a919061529d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bd9575080546001600160401b03808416911610155b15610bf75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c2183612856565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7d64e8d4a5100083615308565b92915050565b5f610c8c61286a565b610c98848484346128a1565b9050610cb060015f80516020615bc783398151915255565b9392505050565b5f80516020615b678339815191525f80610cd084612b1e565b91509150610cdd82612e68565b610ce75750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1557610d1561519f565b03610d3a575f83815260088501602052604081208054919055610d388282612ea3565b505b610d5081610d4b8460400151611560565b612f09565b5050505050565b5f80516020615b678339815191525f610d6f84612f1c565b90505f80610d8083604001516130f6565b50915091505f610d8f83612176565b9050816001600160401b031681606001516001600160401b03161015610dc75760405162461bcd60e51b815260040161068990615327565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0c5760405162461bcd60e51b815260040161068990615369565b60015f87815260068701602052604090205460ff166004811115610e3257610e3261519f565b14610e9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610689565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ba78339815191529060ff1615610fc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611030919061529d565b8360200135146110925760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610689565b306110a360608501604086016153c6565b6001600160a01b0316146111155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610689565b5f61112360608501856153e1565b91505f90508435602086013560146111416060890160408a016153c6565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611470575f6111c160608901896153e1565b8363ffffffff168181106111d7576111d7615426565b90506020028101906111e9919061543a565b6111f2906154ea565b80515f81815260098901602052604090205491925090156112255760405162461bcd60e51b815260040161068990615581565b84825f01518360200151846040015160405160200161124794939291906155c9565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112959190615618565b602060405180830381855afa1580156112b0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d3919061529d565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561135f5761135f61519f565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611412911686615629565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114699061563c565b90506111a5565b50600584018190555f61148286612f1c565b90505f6114928260400151613331565b9050806002856040516114a59190615618565b602060405180830381855afa1580156114c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e3919061529d565b146115475760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610689565b505050600a909201805460ff1916600117905550505050565b5f610c7d6001600160401b03831664e8d4a5100061565e565b5f61158382612176565b6080015192915050565b5f80516020615b678339815191525f6115a58561349a565b90506115b085612e68565b6115bb575050505050565b5f85815260058301602052604090205460a08201516115ea91600160b01b90046001600160401b031690615675565b6001600160401b03168160c001516001600160401b0316101561166b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610689565b8315610d50575f61167c868561223e565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906116d390611560565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611749573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176d919061529d565b5f8781526008850160205260408120805490919061178c908490615629565b9091555050505050505050565b5f80516020615b678339815191525f6117b183612176565b90506004815160058111156117c8576117c861519f565b146118325760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610689565b5f8381526005830160205260409020546001600160a01b031633146118b45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610689565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8a906001600160a01b031682612ea3565b6118f261286a565b5f80516020615b678339815191525f61190a84612f1c565b90505f8061191b83604001516130f6565b50915091505f61192a83612176565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119645761196461519f565b60048111156119755761197561519f565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a595760405162461bcd60e51b815260040161068990615327565b826001600160401b03168160e001516001600160401b03161115611a8f5760405162461bcd60e51b815260040161068990615369565b600381516004811115611aa457611aa461519f565b14611af85760405162461bcd60e51b815260206004820152603160248201525f80516020615b878339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610689565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b3990600160a01b900461ffff168461565e565b611b439190615308565b905080886008015f8881526020019081526020015f205f828254611b679190615629565b90915550506020830151611b8490611b7f8385615695565b612ea3565b611b998360200151610d4b8560600151611560565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bef60015f80516020615bc783398151915255565b5050565b5f80516020615ba78339815191525f611c0b83612f1c565b90505f80611c1c8360400151613715565b9150915080611c7e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610689565b5f82815260078501602052604081208054611c98906156a8565b9050118015611cca575060015f83815260088601602052604090205460ff166005811115611cc857611cc861519f565b145b611ce65760405162461bcd60e51b8152600401610689906156da565b5f8281526007850160205260408120611cfe91614f68565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b6783398151915293929190829060ff166004811115611e0c57611e0c61519f565b6004811115611e1d57611e1d61519f565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ea457611ea461519f565b1480611ec25750600381516004811115611ec057611ec061519f565b145b611f165760405162461bcd60e51b815260206004820152603260248201525f80516020615b87833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610689565b5f611f248260400151612176565b905080606001516001600160401b03165f03611fa85760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb611fd5846040015184606001518560800151612631565b6040518263ffffffff1660e01b8152600401611ff191906152d6565b6020604051808303815f875af115801561200d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d50919061529d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ba7833981519152929190612079906156a8565b90501180156120ab575060015f83815260088301602052604090205460ff1660058111156120a9576120a961519f565b145b6120c75760405162461bcd60e51b8152600401610689906156da565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916121009190600401615721565b6020604051808303815f875af115801561211c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612140919061529d565b505050565b5f61214e61286a565b6121598233346138b6565b905061217160015f80516020615bc783398151915255565b919050565b61217e614f9f565b5f8281525f80516020615be7833981519152602052604090819020815160e0810190925280545f80516020615ba7833981519152929190829060ff1660058111156121cb576121cb61519f565b60058111156121dc576121dc61519f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612289573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b091908101906157b6565b91509150806123135760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612356573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237a919061529d565b8251146123de5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610689565b60208201516001600160a01b0316156124545760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610689565b5f806124638460400151613c6d565b915091508187146124d05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610689565b9695505050505050565b5f8281525f80516020615be7833981519152602052604081206002015481905f80516020615ba783398151915290600160801b90046001600160401b03166125228582613e45565b5f61252c87614053565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61257c8a858b612631565b6040518263ffffffff1660e01b815260040161259891906152d6565b6020604051808303815f875af11580156125b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d8919061529d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126aa5761266a816001615695565b61267590600861565e565b5081515f9083908390811061268c5761268c615426565b60200101906001600160f81b03191690815f1a905350600101612656565b505f5b6004811015612715576126c1816003615695565b6126cc90600861565e565b600263ffffffff16901c60f81b828260026126e79190615629565b815181106126f7576126f7615426565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b60208110156127775761272c81601f615695565b61273790600861565e565b86901c60f81b82612749836006615629565b8151811061275957612759615426565b60200101906001600160f81b03191690815f1a905350600101612718565b505f5b60088110156127e25761278e816007615695565b61279990600861565e565b6001600160401b038616901c60f81b826127b4836026615629565b815181106127c4576127c4615426565b60200101906001600160f81b03191690815f1a90535060010161277a565b505f5b600881101561284d576127f9816007615695565b61280490600861565e565b6001600160401b038516901c60f81b8261281f83602e615629565b8151811061282f5761282f615426565b60200101906001600160f81b03191690815f1a9053506001016127e5565b50949350505050565b61285e6140e3565b6128678161412e565b50565b5f80516020615bc783398151915280546001190161289b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b678339815191529061ffff8616108015906128ed575061271061ffff861611155b6129095760405162461bcd60e51b815260040161068990615888565b60028101546001600160401b0390811690851610156129825760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610689565b80548310156129e55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610689565b8060010154831115612a4c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610689565b825f612a5782610c6d565b90505f612a6489836141a2565b90506040518060600160405280612a783390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bc783398151915255565b5f612b27614f9f565b5f80516020615ba78339815191525f612b3f85612f1c565b90505f80612b508360400151613715565b915091508015612bb55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610689565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612be657612be661519f565b6005811115612bf757612bf761519f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c6857612c6861519f565b1480612c865750600182516005811115612c8457612c8461519f565b145b612ce55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610689565b600382516005811115612cfa57612cfa61519f565b03612d0757506004612d0b565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3457612d3461519f565b90816005811115612d4757612d4761519f565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d7b57612d7b61519f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e2f57612e2f61519f565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612eef575f80fd5b505af1158015612f01573d5f803e3d5ffd5b505050505050565b611bef6001600160a01b03831682614707565b60408051606080820183525f8083526020830181905292820152905f80516020615ba78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f91573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fb891908101906157b6565b91509150806130185760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610689565b825482511461307b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610689565b60208201516001600160a01b0316156130ee5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610689565b509392505050565b5f805f835160361461311a5760405162461bcd60e51b8152600401610689906158d3565b5f805b600281101561316957613131816001615695565b61313c90600861565e565b61ffff1686828151811061315257613152615426565b016020015160f81c901b919091179060010161311d565b5061ffff81161561318c5760405162461bcd60e51b81526004016106899061591c565b5f805b60048110156131e7576131a3816003615695565b6131ae90600861565e565b63ffffffff16876131c0836002615629565b815181106131d0576131d0615426565b016020015160f81c901b919091179060010161318f565b5063ffffffff811660041461320e5760405162461bcd60e51b81526004016106899061595f565b5f805b60208110156132635761322581601f615695565b61323090600861565e565b8861323c836006615629565b8151811061324c5761324c615426565b016020015160f81c901b9190911790600101613211565b505f805b60088110156132c25761327b816007615695565b61328690600861565e565b6001600160401b03168961329b836026615629565b815181106132ab576132ab615426565b016020015160f81c901b9190911790600101613267565b505f805b6008811015613321576132da816007615695565b6132e590600861565e565b6001600160401b03168a6132fa83602e615629565b8151811061330a5761330a615426565b016020015160f81c901b91909117906001016132c6565b5091989097509095509350505050565b5f81516026146133535760405162461bcd60e51b8152600401610689906158d3565b5f805b60028110156133a25761336a816001615695565b61337590600861565e565b61ffff1684828151811061338b5761338b615426565b016020015160f81c901b9190911790600101613356565b5061ffff8116156133c55760405162461bcd60e51b81526004016106899061591c565b5f805b6004811015613420576133dc816003615695565b6133e790600861565e565b63ffffffff16856133f9836002615629565b8151811061340957613409615426565b016020015160f81c901b91909117906001016133c8565b5063ffffffff8116156134455760405162461bcd60e51b81526004016106899061595f565b5f805b602081101561284d5761345c81601f615695565b61346790600861565e565b86613473836006615629565b8151811061348357613483615426565b016020015160f81c901b9190911790600101613448565b6134a2614f9f565b5f8281525f80516020615be78339815191526020526040808220815160e0810190925280545f80516020615ba783398151915293929190829060ff1660058111156134ef576134ef61519f565b60058111156135005761350061519f565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156135725761357261519f565b146135ce5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610689565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156136125761361261519f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136be85826124da565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137385760405162461bcd60e51b8152600401610689906158d3565b5f805b60028110156137875761374f816001615695565b61375a90600861565e565b61ffff1685828151811061377057613770615426565b016020015160f81c901b919091179060010161373b565b5061ffff8116156137aa5760405162461bcd60e51b81526004016106899061591c565b5f805b6004811015613805576137c1816003615695565b6137cc90600861565e565b63ffffffff16866137de836002615629565b815181106137ee576137ee615426565b016020015160f81c901b91909117906001016137ad565b5063ffffffff811660031461382c5760405162461bcd60e51b81526004016106899061595f565b5f805b60208110156138815761384381601f615695565b61384e90600861565e565b8761385a836006615629565b8151811061386a5761386a615426565b016020015160f81c901b919091179060010161382f565b505f8660268151811061389657613896615426565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b67833981519152816138cf84610c6d565b90505f6138db87612176565b90506138e687612e68565b6139435760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610689565b6002815160058111156139585761395861519f565b146139b75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610689565b5f8282608001516139c89190615675565b600485015460408401519192506139ea916001600160401b03909116906159a6565b6001600160401b0316816001600160401b03161115613a695760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610689565b5f80613a758a846124da565b915091505f8a83604051602001613aa392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b3e57613b3e61519f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c905760405162461bcd60e51b8152600401610689906158d3565b5f805b6002811015613cdf57613ca7816001615695565b613cb290600861565e565b61ffff16858281518110613cc857613cc8615426565b016020015160f81c901b9190911790600101613c93565b5061ffff811615613d025760405162461bcd60e51b81526004016106899061591c565b5f805b6004811015613d5d57613d19816003615695565b613d2490600861565e565b63ffffffff1686613d36836002615629565b81518110613d4657613d46615426565b016020015160f81c901b9190911790600101613d05565b5063ffffffff8116600514613d845760405162461bcd60e51b81526004016106899061595f565b5f805b6020811015613dd957613d9b81601f615695565b613da690600861565e565b87613db2836006615629565b81518110613dc257613dc2615426565b016020015160f81c901b9190911790600101613d87565b505f805b6008811015613e3857613df1816007615695565b613dfc90600861565e565b6001600160401b031688613e11836026615629565b81518110613e2157613e21615426565b016020015160f81c901b9190911790600101613ddd565b5090969095509350505050565b5f80516020615ba78339815191525f6001600160401b038084169085161115613e7957613e72838561527d565b9050613e86565b613e83848461527d565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ee8575060028401548151613ee4916001600160401b031690615629565b8210155b15613f0e576001600160401b038316606082015281815260408101516020820152613f2d565b8281606001818151613f209190615675565b6001600160401b03169052505b6060810151613f3d9060646159a6565b602082015160028601546001600160401b039290921691613f689190600160401b900460ff1661565e565b1015613fcc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610689565b856001600160401b031681604001818151613fe79190615629565b9052506040810180516001600160401b0387169190614007908390615695565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615be78339815191526020526040812060020180545f80516020615ba783398151915291600160401b9091046001600160401b031690600861409d836159d1565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661412c57604051631afcd79f60e31b815260040160405180910390fd5b565b6141366140e3565b61413f8161479a565b6141476147b3565b612867608082013560a083013561416460e0850160c08601615186565b614175610100860160e087016159ec565b61ffff1661418b61012087016101008801615a05565b61419d610140880161012089016153c6565b6147c3565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661422d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610689565b5f80516020615ba78339815191524261424c6040860160208701615186565b6001600160401b0316116142be5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610689565b6142ce6040850160208601615186565b6001600160401b03166142e46202a30042615629565b116143575760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610689565b83356143af5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610689565b83355f908152600982016020526040902054156143de5760405162461bcd60e51b815260040161068990615581565b60306143ed6040860186615a25565b9050146144525760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610689565b61445c835f613e45565b5f806144f66040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a19190615186565b6001600160401b031681526020016144bc60408a018a615a25565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a07565b5f828152600786016020526040902091935091506145148282615aab565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145419085906004016152d6565b6020604051808303815f875af115801561455d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614581919061529d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145f9576145f961519f565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146d9918e01908e01615186565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561472a5760405163cd78605960e01b8152306004820152602401610689565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614773576040519150601f19603f3d011682016040523d82523d5f602084013e614778565b606091505b505090508061214057604051630a12f52160e11b815260040160405180910390fd5b6147a26140e3565b6147aa614db6565b61286781614dbe565b6147bb6140e3565b61412c614f60565b6147cb6140e3565b5f80516020615b67833981519152836148375760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610689565b6127108411156148595760405162461bcd60e51b815260040161068990615888565b858711156148c15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610689565b5f8360ff161161492e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610689565b600a60ff841611156149a05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610689565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a715760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610689565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ae857614aa8816001615695565b614ab390600861565e565b5081515f90839083908110614aca57614aca615426565b60200101906001600160f81b03191690815f1a905350600101614a94565b505f5b6004811015614b5057614aff816003615695565b614b0a90600861565e565b600160ff919091161c60f81b82614b22836002615629565b81518110614b3257614b32615426565b60200101906001600160f81b03191690815f1a905350600101614aeb565b505f5b6020811015614bad5784518160208110614b6f57614b6f615426565b1a60f81b82614b7f836006615629565b81518110614b8f57614b8f615426565b60200101906001600160f81b03191690815f1a905350600101614b53565b505f5b6020811015614c0d5784602001518160208110614bcf57614bcf615426565b1a60f81b82614bdf836026615629565b81518110614bef57614bef615426565b60200101906001600160f81b03191690815f1a905350600101614bb0565b505f5b6008811015614c8157614c24816007615695565b614c2f90600861565e565b60ff1685604001516001600160401b0316901c60f81b82826046614c539190615629565b81518110614c6357614c63615426565b60200101906001600160f81b03191690815f1a905350600101614c10565b505f5b6030811015614cec5784608001518181518110614ca357614ca3615426565b01602001516001600160f81b03191682614cbe83604e615629565b81518110614cce57614cce615426565b60200101906001600160f81b03191690815f1a905350600101614c84565b505f5b6008811015614d5e57614d03816007615695565b614d0e90600861565e565b60608601516001600160401b0390811691161c60f81b82614d3083607e615629565b81518110614d4057614d40615426565b60200101906001600160f81b03191690815f1a905350600101614cef565b50600281604051614d6f9190615618565b602060405180830381855afa158015614d8a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614dad919061529d565b94909350915050565b61412c6140e3565b614dc66140e3565b80355f80516020615ba783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e126080840160608501615a05565b60ff161115614e7f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610689565b5f614e906080840160608501615a05565b60ff1611614ef85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610689565b614f086080830160608401615a05565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f396060830160408401615186565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b0b6140e3565b508054614f74906156a8565b5f825580601f10614f83575050565b601f0160209004905f5260205f20908101906128679190614fdb565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fef575f8155600101614fdc565b5090565b8015158114612867575f80fd5b803563ffffffff81168114612171575f80fd5b5f805f60608486031215615025575f80fd5b83359250602084013561503781614ff3565b915061504560408501615000565b90509250925092565b5f6020828403121561505e575f80fd5b5035919050565b5f6101408284031215615076575f80fd5b50919050565b803561ffff81168114612171575f80fd5b80356001600160401b0381168114612171575f80fd5b5f805f606084860312156150b5575f80fd5b83356001600160401b038111156150ca575f80fd5b8401606081870312156150db575f80fd5b92506150e96020850161507c565b91506150456040850161508d565b5f60208284031215615107575f80fd5b610cb082615000565b5f8060408385031215615121575f80fd5b61512a83615000565b946020939093013593505050565b5f8060408385031215615149575f80fd5b82356001600160401b0381111561515e575f80fd5b83016080818603121561516f575f80fd5b915061517d60208401615000565b90509250929050565b5f60208284031215615196575f80fd5b610cb08261508d565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151d657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521160608401826001600160401b03169052565b50608083015161522c60808401826001600160401b03169052565b5060a083015161524760a08401826001600160401b03169052565b5060c083015161526260c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526257615262615269565b5f602082840312156152ad575f80fd5b5051919050565b5f5b838110156152ce5781810151838201526020016152b6565b50505f910152565b602081525f82518060208401526152f48160408501602087016152b4565b601f01601f19169190910160400192915050565b5f8261532257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612867575f80fd5b5f602082840312156153d6575f80fd5b8135610cb0816153b2565b5f808335601e198436030181126153f6575f80fd5b8301803591506001600160401b0382111561540f575f80fd5b6020019150600581901b360382131561262a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261544e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561548e5761548e615458565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154bc576154bc615458565b604052919050565b5f6001600160401b038211156154dc576154dc615458565b50601f01601f191660200190565b5f606082360312156154fa575f80fd5b61550261546c565b82358152602061551381850161508d565b8183015260408401356001600160401b0381111561552f575f80fd5b840136601f82011261553f575f80fd5b803561555261554d826154c4565b615494565b8181523684838501011115615565575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155da818460208a016152b4565b80830190508581526001600160401b0360c01b8560c01b166020820152835161560a8160288401602088016152b4565b016028019695505050505050565b5f825161544e8184602087016152b4565b80820180821115610c7d57610c7d615269565b5f63ffffffff80831681810361565457615654615269565b6001019392505050565b8082028115828204841417610c7d57610c7d615269565b6001600160401b0381811683821601908082111561526257615262615269565b81810381811115610c7d57610c7d615269565b600181811c908216806156bc57607f821691505b60208210810361507657634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615733816156a8565b806020870152604060018084165f811461575457600181146157705761579d565b60ff19851660408a0152604084151560051b8a0101955061579d565b895f5260205f205f5b858110156157945781548b8201860152908301908801615779565b8a016040019650505b509398975050505050505050565b805161217181614ff3565b5f80604083850312156157c7575f80fd5b82516001600160401b03808211156157dd575f80fd5b90840190606082870312156157f0575f80fd5b6157f861546c565b8251815260208084015161580b816153b2565b82820152604084015183811115615820575f80fd5b80850194505087601f850112615834575f80fd5b8351925061584461554d846154c4565b8381528882858701011115615857575f80fd5b615866848383018488016152b4565b8060408401525081955061587b8188016157ab565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159c9576159c9615269565b505092915050565b5f6001600160401b0380831681810361565457615654615269565b5f602082840312156159fc575f80fd5b610cb08261507c565b5f60208284031215615a15575f80fd5b813560ff81168114610cb0575f80fd5b5f808335601e19843603018112615a3a575f80fd5b8301803591506001600160401b03821115615a53575f80fd5b60200191503681900382131561262a575f80fd5b601f82111561214057805f5260205f20601f840160051c81016020851015615a8c5750805b601f840160051c820191505b81811015610d50575f8155600101615a98565b81516001600160401b03811115615ac457615ac4615458565b615ad881615ad284546156a8565b84615a67565b602080601f831160018114615b0b575f8415615af45750858301515b5f19600386901b1c1916600185901b178555612f01565b5f85815260208120601f198616915b82811015615b3957888601518255948401946001909101908401615b1a565b5085821015615b5657878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 748f854ad..38f7288ae 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -198,7 +198,8 @@ abstract contract PoSValidatorManager is (bytes32 validationID, Validator memory validator) = _completeEndValidation(messageIndex); - // Return now if this was originally a PoA validator that was later migrated to this PoS manager + // Return now if this was originally a PoA validator that was later migrated to this PoS manager, + // or the validator was part of the initial validator set. if (!_isPoSValidator(validationID)) { return; } @@ -380,6 +381,10 @@ abstract contract PoSValidatorManager is }); } + /** + * @notice See {INativeTokenStakingManager-initializeValidatorRegistration}. + * Begins the validator registration process. Locks the provided native asset in the contract as the stake. + */ function initializeEndDelegation( bytes32 delegationID, bool includeUptimeProof, @@ -484,6 +489,8 @@ abstract contract PoSValidatorManager is Validator memory validator = getValidator(validationID); Delegator memory delegator = $._delegatorStakes[delegationID]; + // Once this function completes, the delegation is completed and we can clear it from state. + delete $._delegatorStakes[delegationID]; // The received nonce should be no greater than the highest sent nonce. This should never // happen since the staking manager is the only entity that can trigger a weight update @@ -504,19 +511,20 @@ abstract contract PoSValidatorManager is "PoSValidatorManager: delegation not pending added" ); - // Update the delegator status - $._delegatorStakes[delegationID].status = DelegatorStatus.Completed; - uint256 rewards = $._redeemableDelegatorRewards[delegationID]; delete $._redeemableDelegatorRewards[delegationID]; uint256 validatorFees = rewards * $._validatorRequirements[validationID].delegationFeeBips / 10000; + + // Allocate the delegation fees to the validator. $._redeemableValidatorRewards[validationID] += validatorFees; + // Reward the remaining tokens to the delegator. _reward(delegator.owner, rewards - validatorFees); + + // Unlock the delegator's stake. _unlock(delegator.owner, weightToValue(delegator.weight)); - delete $._delegatorStakes[delegationID]; emit DelegationEnded(delegationID, validationID, nonce); } diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index 4b8aadcee..b29225c0a 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -134,7 +134,9 @@ interface IPoSValidatorManager is IValidatorManager { * Note that 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 no uptime proof is provided, the validation uptime for the delegation period will be assumed to be 0. + * If the validator has completed its validation period, it has already provided an uptime proof, so {includeUptimeProof} + * will be ignored and can be set to false. If the validator has not completed its validation period and no uptime proof + * is provided, the validation uptime for the delegation period will be assumed to be 0. * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the * uptime proof. */ From 6e46195c75001f2dc45e7d8b7ba7b30f422d6419 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 19 Sep 2024 08:49:08 -0500 Subject: [PATCH 360/545] e2e build fix --- tests/flows/validator-manager/poa_to_pos.go | 4 ++-- tests/flows/validator-manager/poa_validator_manager.go | 2 +- tests/local/e2e_test.go | 2 +- tests/utils/validator_manager.go | 10 ++++------ 4 files changed, 8 insertions(+), 10 deletions(-) diff --git a/tests/flows/validator-manager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go index 9b0dbecca..918dd3c79 100644 --- a/tests/flows/validator-manager/poa_to_pos.go +++ b/tests/flows/validator-manager/poa_to_pos.go @@ -6,8 +6,8 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/NativeTokenStakingManager" - poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/PoAValidatorManager" + nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/NativeTokenStakingManager" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/crypto" diff --git a/tests/flows/validator-manager/poa_validator_manager.go b/tests/flows/validator-manager/poa_validator_manager.go index 6a51ea077..28866d58d 100644 --- a/tests/flows/validator-manager/poa_validator_manager.go +++ b/tests/flows/validator-manager/poa_validator_manager.go @@ -8,7 +8,7 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/PoAValidatorManager" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/crypto" diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index d5e1dc30f..e1795e69b 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -10,7 +10,7 @@ import ( "github.com/ava-labs/teleporter/tests/flows/governance" "github.com/ava-labs/teleporter/tests/flows/teleporter" "github.com/ava-labs/teleporter/tests/flows/teleporter/registry" - validatorManager "github.com/ava-labs/teleporter/tests/flows/validatorManager" + validatorManager "github.com/ava-labs/teleporter/tests/flows/validator-manager" deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" "github.com/ethereum/go-ethereum/log" "github.com/onsi/ginkgo/v2" diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 235345da8..c9b24ddb6 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -21,10 +21,10 @@ import ( "github.com/ava-labs/subnet-evm/precompile/contracts/warp" predicateutils "github.com/ava-labs/subnet-evm/predicate" exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" - erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/ERC20TokenStakingManager" - examplerewardcalculator "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/ExampleRewardCalculator" - nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/NativeTokenStakingManager" - poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/PoAValidatorManager" + erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/ERC20TokenStakingManager" + examplerewardcalculator "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/ExampleRewardCalculator" + nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/NativeTokenStakingManager" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ethereum/go-ethereum/common" @@ -902,7 +902,6 @@ func InitializeEndNativeValidation( false, 0, ) - } else { tx, err = stakingManager.InitializeEndValidation( opts, @@ -932,7 +931,6 @@ func InitializeEndERC20Validation( false, 0, ) - } else { tx, err = stakingManager.InitializeEndValidation( opts, From daad5250c99799d0f4e64edbe3a20b389f8154ac Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 09:59:55 -0400 Subject: [PATCH 361/545] Check for owner when initializing validator completion --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 9 ++++++++- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 5867696ca..316d22a9b 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160a23803806160a283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f558061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152b8565b6103ec565b005b61019e6101ae3660046152f3565b61088f565b6101f16101c13660046152f3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152f3565b610a48565b6040516001600160401b0390911681526020016101fb565b61019e61025736600461531e565b610a5e565b61026561271081565b60405161ffff90911681526020016101fb565b61019e61028636600461535c565b610b3d565b61019e610299366004615375565b610bdd565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c936600461539d565b610db2565b6101f16102dc366004615401565b6113e6565b6102316102ef3660046152f3565b6113ff565b61019e6103023660046152b8565b611413565b61020c603081565b61019e61031d3660046152f3565b61161f565b61019e610330366004615375565b611770565b6101f161034336600461541a565b611a79565b61019e61035636600461535c565b611aa5565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152f3565b611c5d565b61019e6103a23660046152f3565b611ee3565b61020c601481565b6103c26103bd3660046152f3565b611ff7565b6040516101fb919061544e565b6102316202a30081565b6101f16103e7366004615515565b6120bf565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615ea9833981519152949193919290829060ff1660048111156104545761045461543a565b60048111156104655761046561543a565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104e183611ff7565b90506002825160048111156104f8576104f861543a565b1461054a5760405162461bcd60e51b815260206004820152602a60248201525f80516020615ec98339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105af5760405162461bcd60e51b815260206004820152603360248201525f80516020615ec98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610541565b6003825280515f9060029060058111156105cb576105cb61543a565b036106225786156105e3576105e084876120f4565b90505b5f836060015183608001516105f8919061558e565b90506106048582612390565b506001600160401b0390811660e0860152421660a085015250610656565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068985606001516113e6565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072a91906155ae565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156107695761076961543a565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087d916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f298339815191526020526040808220815160e0810190925280545f80516020615ee983398151915293929190829060ff1660058111156108dc576108dc61543a565b60058111156108ed576108ed61543a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c61543a565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6124e7565b6040518263ffffffff1660e01b8152600401610a0291906155e7565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4291906155ae565b50505050565b5f610a5864e8d4a5100083615619565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa7575080546001600160401b03808416911610155b15610ac55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af0848461270e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ea98339815191525f80610b5684612728565b91509150610b6382612a72565b610b6d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9b57610b9b61543a565b03610bc0575f83815260088501602052604081208054919055610bbe8282612aad565b505b610bd681610bd184604001516113e6565b612b23565b5050505050565b5f80516020615ea98339815191525f610bf584612b46565b90505f80610c068360400151612d20565b50915091505f610c1583611ff7565b9050816001600160401b031681606001516001600160401b03161015610c4d5760405162461bcd60e51b815260040161054190615638565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c925760405162461bcd60e51b81526004016105419061567a565b60015f87815260068701602052604090205460ff166004811115610cb857610cb861543a565b14610d215760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610541565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ee98339815191529060ff1615610e4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb691906155ae565b836020013514610f185760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610541565b30610f2960608501604086016156c3565b6001600160a01b031614610f9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610541565b5f610fa960608501856156de565b91505f9050843560208601356014610fc76060890160408a016156c3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f6575f61104760608901896156de565b8363ffffffff1681811061105d5761105d615723565b905060200281019061106f9190615737565b611078906157e7565b80515f81815260098901602052604090205491925090156110ab5760405162461bcd60e51b81526004016105419061587e565b84825f0151836020015184604001516040516020016110cd94939291906158c6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111b9190615915565b602060405180830381855afa158015611136573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115991906155ae565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e5576111e561543a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611298911686615926565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ef90615939565b905061102b565b50600584018190555f61130886612b46565b90505f6113188260400151612f5b565b90508060028560405161132b9190615915565b602060405180830381855afa158015611346573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136991906155ae565b146113cd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610541565b505050600a909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a5100061595b565b5f61140982611ff7565b6080015192915050565b5f80516020615ea98339815191525f61142b856130cd565b905061143685612a72565b611441575050505050565b5f85815260058301602052604090205460a082015161147091600160b01b90046001600160401b031690615972565b6001600160401b03168160c001516001600160401b031610156114f15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610541565b8315610bd6575f61150286856120f4565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611559906113e6565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156115cf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115f391906155ae565b5f87815260088501602052604081208054909190611612908490615926565b9091555050505050505050565b5f80516020615ea98339815191525f61163783611ff7565b905060048151600581111561164e5761164e61543a565b146116b85760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610541565b5f8381526005830160205260409020546001600160a01b0316331461173a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610541565b5f83815260088301602090815260408083208054908490556005860190925290912054610a42906001600160a01b031682612aad565b611778613348565b5f80516020615ea98339815191525f61179084612b46565b90505f806117a18360400151612d20565b50915091505f6117b083611ff7565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117ea576117ea61543a565b60048111156117fb576117fb61543a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118df5760405162461bcd60e51b815260040161054190615638565b826001600160401b03168160e001516001600160401b031611156119155760405162461bcd60e51b81526004016105419061567a565b60038151600481111561192a5761192a61543a565b1461197e5760405162461bcd60e51b815260206004820152603160248201525f80516020615ec98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610541565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119bf90600160a01b900461ffff168461595b565b6119c99190615619565b905080886008015f8881526020019081526020015f205f8282546119ed9190615926565b90915550506020830151611a0a90611a058385615992565b612aad565b611a1f8360200151610bd185606001516113e6565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a7560015f80516020615f0983398151915255565b5050565b5f611a82613348565b611a8d833384613392565b9050610a5860015f80516020615f0983398151915255565b5f80516020615ee98339815191525f611abd83612b46565b90505f80611ace836040015161374c565b9150915080611b305760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610541565b5f82815260078501602052604081208054611b4a906159a5565b9050118015611b7c575060015f83815260088601602052604090205460ff166005811115611b7a57611b7a61543a565b145b611b985760405162461bcd60e51b8152600401610541906159dd565b5f8281526007850160205260408120611bb091615208565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ea983398151915293929190829060ff166004811115611cbe57611cbe61543a565b6004811115611ccf57611ccf61543a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5657611d5661543a565b1480611d745750600381516004811115611d7257611d7261543a565b145b611dc85760405162461bcd60e51b815260206004820152603260248201525f80516020615ec9833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610541565b5f611dd68260400151611ff7565b905080606001516001600160401b03165f03611e5a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb611e878460400151846060015185608001516124e7565b6040518263ffffffff1660e01b8152600401611ea391906155e7565b6020604051808303815f875af1158015611ebf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd691906155ae565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ee9833981519152929190611f2b906159a5565b9050118015611f5d575060015f83815260088301602052604090205460ff166005811115611f5b57611f5b61543a565b145b611f795760405162461bcd60e51b8152600401610541906159dd565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fb29190600401615a24565b6020604051808303815f875af1158015611fce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff291906155ae565b505050565b611fff61523f565b5f8281525f80516020615f29833981519152602052604090819020815160e0810190925280545f80516020615ee9833981519152929190829060ff16600581111561204c5761204c61543a565b600581111561205d5761205d61543a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120c8613348565b6120d4858585856138ed565b90506120ec60015f80516020615f0983398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561213f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121669190810190615ab9565b91509150806121c95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561220c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223091906155ae565b8251146122945760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610541565b60208201516001600160a01b03161561230a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610541565b5f806123198460400151613b62565b915091508187146123865760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610541565b9695505050505050565b5f8281525f80516020615f29833981519152602052604081206002015481905f80516020615ee983398151915290600160801b90046001600160401b03166123d88582613d3a565b5f6123e287613f48565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124328a858b6124e7565b6040518263ffffffff1660e01b815260040161244e91906155e7565b6020604051808303815f875af115801561246a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e91906155ae565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561256057612520816001615992565b61252b90600861595b565b5081515f9083908390811061254257612542615723565b60200101906001600160f81b03191690815f1a90535060010161250c565b505f5b60048110156125cb57612577816003615992565b61258290600861595b565b600263ffffffff16901c60f81b8282600261259d9190615926565b815181106125ad576125ad615723565b60200101906001600160f81b03191690815f1a905350600101612563565b505f5b602081101561262d576125e281601f615992565b6125ed90600861595b565b86901c60f81b826125ff836006615926565b8151811061260f5761260f615723565b60200101906001600160f81b03191690815f1a9053506001016125ce565b505f5b600881101561269857612644816007615992565b61264f90600861595b565b6001600160401b038616901c60f81b8261266a836026615926565b8151811061267a5761267a615723565b60200101906001600160f81b03191690815f1a905350600101612630565b505f5b6008811015612703576126af816007615992565b6126ba90600861595b565b6001600160401b038516901c60f81b826126d583602e615926565b815181106126e5576126e5615723565b60200101906001600160f81b03191690815f1a90535060010161269b565b5090505b9392505050565b612716613fd8565b61271f82614023565b611a758161409a565b5f61273161523f565b5f80516020615ee98339815191525f61274985612b46565b90505f8061275a836040015161374c565b9150915080156127bf5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610541565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f0576127f061543a565b60058111156128015761280161543a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156128725761287261543a565b1480612890575060018251600581111561288e5761288e61543a565b145b6128ef5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610541565b6003825160058111156129045761290461543a565b0361291157506004612915565b5060055b6020808301515f9081526009880190915260408120558181600581111561293e5761293e61543a565b908160058111156129515761295161543a565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156129855761298561543a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a3957612a3961543a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615e8983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b08575f80fd5b505af1158015612b1a573d5f803e3d5ffd5b50505050505050565b5f80516020615e8983398151915254611a75906001600160a01b0316838361413b565b60408051606080820183525f8083526020830181905292820152905f80516020615ee98339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bbb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612be29190810190615ab9565b9150915080612c425760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610541565b8254825114612ca55760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610541565b60208201516001600160a01b031615612d185760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610541565b509392505050565b5f805f8351603614612d445760405162461bcd60e51b815260040161054190615b8b565b5f805b6002811015612d9357612d5b816001615992565b612d6690600861595b565b61ffff16868281518110612d7c57612d7c615723565b016020015160f81c901b9190911790600101612d47565b5061ffff811615612db65760405162461bcd60e51b815260040161054190615bd4565b5f805b6004811015612e1157612dcd816003615992565b612dd890600861595b565b63ffffffff1687612dea836002615926565b81518110612dfa57612dfa615723565b016020015160f81c901b9190911790600101612db9565b5063ffffffff8116600414612e385760405162461bcd60e51b815260040161054190615c17565b5f805b6020811015612e8d57612e4f81601f615992565b612e5a90600861595b565b88612e66836006615926565b81518110612e7657612e76615723565b016020015160f81c901b9190911790600101612e3b565b505f805b6008811015612eec57612ea5816007615992565b612eb090600861595b565b6001600160401b031689612ec5836026615926565b81518110612ed557612ed5615723565b016020015160f81c901b9190911790600101612e91565b505f805b6008811015612f4b57612f04816007615992565b612f0f90600861595b565b6001600160401b03168a612f2483602e615926565b81518110612f3457612f34615723565b016020015160f81c901b9190911790600101612ef0565b5091989097509095509350505050565b5f8151602614612f7d5760405162461bcd60e51b815260040161054190615b8b565b5f805b6002811015612fcc57612f94816001615992565b612f9f90600861595b565b61ffff16848281518110612fb557612fb5615723565b016020015160f81c901b9190911790600101612f80565b5061ffff811615612fef5760405162461bcd60e51b815260040161054190615bd4565b5f805b600481101561304a57613006816003615992565b61301190600861595b565b63ffffffff1685613023836002615926565b8151811061303357613033615723565b016020015160f81c901b9190911790600101612ff2565b5063ffffffff81161561306f5760405162461bcd60e51b815260040161054190615c17565b5f805b60208110156130c45761308681601f615992565b61309190600861595b565b8661309d836006615926565b815181106130ad576130ad615723565b016020015160f81c901b9190911790600101613072565b50949350505050565b6130d561523f565b5f8281525f80516020615f298339815191526020526040808220815160e0810190925280545f80516020615ee983398151915293929190829060ff1660058111156131225761312261543a565b60058111156131335761313361543a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131a5576131a561543a565b146132015760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610541565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156132455761324561543a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132f18582612390565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f0983398151915280546001190161337957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f0983398151915255565b5f5f80516020615ea9833981519152816133ae61022c8561419a565b90505f6133ba87611ff7565b90506133c587612a72565b6134225760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610541565b6002815160058111156134375761343761543a565b146134965760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610541565b5f8282608001516134a79190615972565b600485015460408401519192506134c9916001600160401b0390911690615c5e565b6001600160401b0316816001600160401b031611156135485760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610541565b5f806135548a84612390565b915091505f8a8360405160200161358292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561361d5761361d61543a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461376f5760405162461bcd60e51b815260040161054190615b8b565b5f805b60028110156137be57613786816001615992565b61379190600861595b565b61ffff168582815181106137a7576137a7615723565b016020015160f81c901b9190911790600101613772565b5061ffff8116156137e15760405162461bcd60e51b815260040161054190615bd4565b5f805b600481101561383c576137f8816003615992565b61380390600861595b565b63ffffffff1686613815836002615926565b8151811061382557613825615723565b016020015160f81c901b91909117906001016137e4565b5063ffffffff81166003146138635760405162461bcd60e51b815260040161054190615c17565b5f805b60208110156138b85761387a81601f615992565b61388590600861595b565b87613891836006615926565b815181106138a1576138a1615723565b016020015160f81c901b9190911790600101613866565b505f866026815181106138cd576138cd615723565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ea98339815191529061ffff861610801590613939575061271061ffff861611155b6139555760405162461bcd60e51b815260040161054190615c89565b60028101546001600160401b0390811690851610156139ce5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610541565b8054831015613a315760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610541565b8060010154831115613a985760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610541565b5f613aa28461419a565b90505f613aae82610a48565b90505f613abb89836141bd565b90506040518060600160405280613acf3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b855760405162461bcd60e51b815260040161054190615b8b565b5f805b6002811015613bd457613b9c816001615992565b613ba790600861595b565b61ffff16858281518110613bbd57613bbd615723565b016020015160f81c901b9190911790600101613b88565b5061ffff811615613bf75760405162461bcd60e51b815260040161054190615bd4565b5f805b6004811015613c5257613c0e816003615992565b613c1990600861595b565b63ffffffff1686613c2b836002615926565b81518110613c3b57613c3b615723565b016020015160f81c901b9190911790600101613bfa565b5063ffffffff8116600514613c795760405162461bcd60e51b815260040161054190615c17565b5f805b6020811015613cce57613c9081601f615992565b613c9b90600861595b565b87613ca7836006615926565b81518110613cb757613cb7615723565b016020015160f81c901b9190911790600101613c7c565b505f805b6008811015613d2d57613ce6816007615992565b613cf190600861595b565b6001600160401b031688613d06836026615926565b81518110613d1657613d16615723565b016020015160f81c901b9190911790600101613cd2565b5090969095509350505050565b5f80516020615ee98339815191525f6001600160401b038084169085161115613d6e57613d67838561558e565b9050613d7b565b613d78848461558e565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ddd575060028401548151613dd9916001600160401b031690615926565b8210155b15613e03576001600160401b038316606082015281815260408101516020820152613e22565b8281606001818151613e159190615972565b6001600160401b03169052505b6060810151613e32906064615c5e565b602082015160028601546001600160401b039290921691613e5d9190600160401b900460ff1661595b565b1015613ec15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610541565b856001600160401b031681604001818151613edc9190615926565b9052506040810180516001600160401b0387169190613efc908390615992565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f298339815191526020526040812060020180545f80516020615ee983398151915291600160401b9091046001600160401b0316906008613f9283615cd4565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402157604051631afcd79f60e31b815260040160405180910390fd5b565b61402b613fd8565b61403481614722565b61403c61473b565b614097608082013560a083013561405960e0850160c08601615401565b61406a610100860160e08701615cef565b61ffff1661408061012087016101008801615d08565b614092610140880161012089016156c3565b61474b565b50565b6140a2613fd8565b5f80516020615e898339815191526001600160a01b03821661411b5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610541565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ff291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061498f565b5f610a58825f80516020615e89833981519152546001600160a01b0316906149f0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142485760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610541565b5f80516020615ee9833981519152426142676040860160208701615401565b6001600160401b0316116142d95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610541565b6142e96040850160208601615401565b6001600160401b03166142ff6202a30042615926565b116143725760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610541565b83356143ca5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610541565b83355f908152600982016020526040902054156143f95760405162461bcd60e51b81526004016105419061587e565b60306144086040860186615d28565b90501461446d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610541565b614477835f613d3a565b5f806145116040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144bc9190615401565b6001600160401b031681526020016144d760408a018a615d28565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b52565b5f8281526007860160205260409020919350915061452f8282615dae565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061455c9085906004016155e7565b6020604051808303815f875af1158015614578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061459c91906155ae565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156146145761461461543a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146f4918e01908e01615401565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61472a613fd8565b614732614f01565b61409781614f09565b614743613fd8565b6140216150ab565b614753613fd8565b5f80516020615ea9833981519152836147bf5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610541565b6127108411156147e15760405162461bcd60e51b815260040161054190615c89565b858711156148495760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610541565b5f8360ff16116148b65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610541565b600a60ff841611156149285760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610541565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149a36001600160a01b038416836150b3565b905080515f141580156149c75750808060200190518101906149c59190615e6d565b155b15611ff257604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a5a91906155ae565b9050614a716001600160a01b0385163330866150c0565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614ab5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ad991906155ae565b9050818111614b3f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610541565b614b498282615992565b95945050505050565b5f6060826080015151603014614bbc5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610541565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3357614bf3816001615992565b614bfe90600861595b565b5081515f90839083908110614c1557614c15615723565b60200101906001600160f81b03191690815f1a905350600101614bdf565b505f5b6004811015614c9b57614c4a816003615992565b614c5590600861595b565b600160ff919091161c60f81b82614c6d836002615926565b81518110614c7d57614c7d615723565b60200101906001600160f81b03191690815f1a905350600101614c36565b505f5b6020811015614cf85784518160208110614cba57614cba615723565b1a60f81b82614cca836006615926565b81518110614cda57614cda615723565b60200101906001600160f81b03191690815f1a905350600101614c9e565b505f5b6020811015614d585784602001518160208110614d1a57614d1a615723565b1a60f81b82614d2a836026615926565b81518110614d3a57614d3a615723565b60200101906001600160f81b03191690815f1a905350600101614cfb565b505f5b6008811015614dcc57614d6f816007615992565b614d7a90600861595b565b60ff1685604001516001600160401b0316901c60f81b82826046614d9e9190615926565b81518110614dae57614dae615723565b60200101906001600160f81b03191690815f1a905350600101614d5b565b505f5b6030811015614e375784608001518181518110614dee57614dee615723565b01602001516001600160f81b03191682614e0983604e615926565b81518110614e1957614e19615723565b60200101906001600160f81b03191690815f1a905350600101614dcf565b505f5b6008811015614ea957614e4e816007615992565b614e5990600861595b565b60608601516001600160401b0390811691161c60f81b82614e7b83607e615926565b81518110614e8b57614e8b615723565b60200101906001600160f81b03191690815f1a905350600101614e3a565b50600281604051614eba9190615915565b602060405180830381855afa158015614ed5573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ef891906155ae565b94909350915050565b614021613fd8565b614f11613fd8565b80355f80516020615ee983398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f5d6080840160608501615d08565b60ff161115614fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610541565b5f614fdb6080840160608501615d08565b60ff16116150435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610541565b6150536080830160608401615d08565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556150846060830160408401615401565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61337f613fd8565b606061270783835f6150f9565b6040516001600160a01b038481166024830152838116604483015260648201839052610a429186918216906323b872dd90608401614168565b60608147101561511e5760405163cd78605960e01b8152306004820152602401610541565b5f80856001600160a01b031684866040516151399190615915565b5f6040518083038185875af1925050503d805f8114615173576040519150601f19603f3d011682016040523d82523d5f602084013e615178565b606091505b509150915061238686838360608261519857615193826151df565b612707565b81511580156151af57506001600160a01b0384163b155b156151d857604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b5080612707565b8051156151ef5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054615214906159a5565b5f825580601f10615223575050565b601f0160209004905f5260205f2090810190614097919061527b565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561528f575f815560010161527c565b5090565b8015158114614097575f80fd5b803563ffffffff811681146152b3575f80fd5b919050565b5f805f606084860312156152ca575f80fd5b8335925060208401356152dc81615293565b91506152ea604085016152a0565b90509250925092565b5f60208284031215615303575f80fd5b5035919050565b6001600160a01b0381168114614097575f80fd5b5f80828403610160811215615331575f80fd5b61014080821215615340575f80fd5b84935083013590506153518161530a565b809150509250929050565b5f6020828403121561536c575f80fd5b612707826152a0565b5f8060408385031215615386575f80fd5b61538f836152a0565b946020939093013593505050565b5f80604083850312156153ae575f80fd5b82356001600160401b038111156153c3575f80fd5b8301608081860312156153d4575f80fd5b91506153e2602084016152a0565b90509250929050565b80356001600160401b03811681146152b3575f80fd5b5f60208284031215615411575f80fd5b612707826153eb565b5f806040838503121561542b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154ac60608401826001600160401b03169052565b5060808301516154c760808401826001600160401b03169052565b5060a08301516154e260a08401826001600160401b03169052565b5060c08301516154fd60c08401826001600160401b03169052565b5092915050565b803561ffff811681146152b3575f80fd5b5f805f8060808587031215615528575f80fd5b84356001600160401b0381111561553d575f80fd5b85016060818803121561554e575f80fd5b935061555c60208601615504565b925061556a604086016153eb565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154fd576154fd61557a565b5f602082840312156155be575f80fd5b5051919050565b5f5b838110156155df5781810151838201526020016155c7565b50505f910152565b602081525f82518060208401526156058160408501602087016155c5565b601f01601f19169190910160400192915050565b5f8261563357634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156d3575f80fd5b81356127078161530a565b5f808335601e198436030181126156f3575f80fd5b8301803591506001600160401b0382111561570c575f80fd5b6020019150600581901b36038213156124e0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261574b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561578b5761578b615755565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157b9576157b9615755565b604052919050565b5f6001600160401b038211156157d9576157d9615755565b50601f01601f191660200190565b5f606082360312156157f7575f80fd5b6157ff615769565b8235815260206158108185016153eb565b8183015260408401356001600160401b0381111561582c575f80fd5b840136601f82011261583c575f80fd5b803561584f61584a826157c1565b615791565b8181523684838501011115615862575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158d7818460208a016155c5565b80830190508581526001600160401b0360c01b8560c01b16602082015283516159078160288401602088016155c5565b016028019695505050505050565b5f825161574b8184602087016155c5565b80820180821115610a5857610a5861557a565b5f63ffffffff8083168181036159515761595161557a565b6001019392505050565b8082028115828204841417610a5857610a5861557a565b6001600160401b038181168382160190808211156154fd576154fd61557a565b81810381811115610a5857610a5861557a565b600181811c908216806159b957607f821691505b6020821081036159d757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a36816159a5565b806020870152604060018084165f8114615a575760018114615a7357615aa0565b60ff19851660408a0152604084151560051b8a01019550615aa0565b895f5260205f205f5b85811015615a975781548b8201860152908301908801615a7c565b8a016040019650505b509398975050505050505050565b80516152b381615293565b5f8060408385031215615aca575f80fd5b82516001600160401b0380821115615ae0575f80fd5b9084019060608287031215615af3575f80fd5b615afb615769565b82518152602080840151615b0e8161530a565b82820152604084015183811115615b23575f80fd5b80850194505087601f850112615b37575f80fd5b83519250615b4761584a846157c1565b8381528882858701011115615b5a575f80fd5b615b69848383018488016155c5565b80604084015250819550615b7e818801615aae565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615c8157615c8161557a565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036159515761595161557a565b5f60208284031215615cff575f80fd5b61270782615504565b5f60208284031215615d18575f80fd5b813560ff81168114612707575f80fd5b5f808335601e19843603018112615d3d575f80fd5b8301803591506001600160401b03821115615d56575f80fd5b6020019150368190038213156124e0575f80fd5b601f821115611ff257805f5260205f20601f840160051c81016020851015615d8f5750805b601f840160051c820191505b81811015610bd6575f8155600101615d9b565b81516001600160401b03811115615dc757615dc7615755565b615ddb81615dd584546159a5565b84615d6a565b602080601f831160018114615e0e575f8415615df75750858301515b5f19600386901b1c1916600185901b178555615e65565b5f85815260208120601f198616915b82811015615e3c57888601518255948401946001909101908401615e1d565b5085821015615e5957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e7d575f80fd5b81516127078161529356fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516160da3803806160da83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f8d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e61019936600461529e565b6103ec565b005b61019e6101ae3660046152d9565b61088f565b6101f16101c13660046152d9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152d9565b610a48565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615304565b610a5e565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615342565b610b3d565b61019e61029936600461535b565b610bdd565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c9366004615383565b610db2565b6101f16102dc3660046153e7565b6113e6565b6102316102ef3660046152d9565b6113ff565b61019e61030236600461529e565b611413565b61020c603081565b61019e61031d3660046152d9565b611650565b61019e61033036600461535b565b611756565b6101f1610343366004615400565b611a5f565b61019e610356366004615342565b611a8b565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152d9565b611c43565b61019e6103a23660046152d9565b611ec9565b61020c601481565b6103c26103bd3660046152d9565b611fdd565b6040516101fb9190615434565b6102316202a30081565b6101f16103e73660046154fb565b6120a5565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615ee1833981519152949193919290829060ff16600481111561045457610454615420565b600481111561046557610465615420565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104e183611fdd565b90506002825160048111156104f8576104f8615420565b1461054a5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f018339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105af5760405162461bcd60e51b815260206004820152603360248201525f80516020615f018339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610541565b6003825280515f9060029060058111156105cb576105cb615420565b036106225786156105e3576105e084876120da565b90505b5f836060015183608001516105f89190615574565b90506106048582612376565b506001600160401b0390811660e0860152421660a085015250610656565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068985606001516113e6565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072a9190615594565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561076957610769615420565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087d916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f618339815191526020526040808220815160e0810190925280545f80516020615f2183398151915293929190829060ff1660058111156108dc576108dc615420565b60058111156108ed576108ed615420565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c615420565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6124cd565b6040518263ffffffff1660e01b8152600401610a0291906155cd565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a429190615594565b50505050565b5f610a5864e8d4a51000836155ff565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa7575080546001600160401b03808416911610155b15610ac55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af084846126f4565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ee18339815191525f80610b568461270e565b91509150610b6382612a58565b610b6d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9b57610b9b615420565b03610bc0575f83815260088501602052604081208054919055610bbe8282612a93565b505b610bd681610bd184604001516113e6565b612b09565b5050505050565b5f80516020615ee18339815191525f610bf584612b2c565b90505f80610c068360400151612d06565b50915091505f610c1583611fdd565b9050816001600160401b031681606001516001600160401b03161015610c4d5760405162461bcd60e51b81526004016105419061561e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c925760405162461bcd60e51b815260040161054190615660565b60015f87815260068701602052604090205460ff166004811115610cb857610cb8615420565b14610d215760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610541565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f218339815191529060ff1615610e4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb69190615594565b836020013514610f185760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610541565b30610f2960608501604086016156a9565b6001600160a01b031614610f9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610541565b5f610fa960608501856156c4565b91505f9050843560208601356014610fc76060890160408a016156a9565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f6575f61104760608901896156c4565b8363ffffffff1681811061105d5761105d615709565b905060200281019061106f919061571d565b611078906157cd565b80515f81815260098901602052604090205491925090156110ab5760405162461bcd60e51b815260040161054190615864565b84825f0151836020015184604001516040516020016110cd94939291906158ac565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111b91906158fb565b602060405180830381855afa158015611136573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111599190615594565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e5576111e5615420565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129891168661590c565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ef9061591f565b905061102b565b50600584018190555f61130886612b2c565b90505f6113188260400151612f41565b90508060028560405161132b91906158fb565b602060405180830381855afa158015611346573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113699190615594565b146113cd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610541565b505050600a909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a51000615941565b5f61140982611fdd565b6080015192915050565b5f80516020615ee18339815191525f61142b856130b3565b905061143685612a58565b15610bd6575f8581526005830160205260409020546001600160a01b031633146114725760405162461bcd60e51b815260040161054190615958565b5f85815260058301602052604090205460a08201516114a191600160b01b90046001600160401b0316906159aa565b6001600160401b03168160c001516001600160401b031610156115225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610541565b8315610bd6575f61153386856120da565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061158a906113e6565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611600573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116249190615594565b5f8781526008850160205260408120805490919061164390849061590c565b9091555050505050505050565b5f80516020615ee18339815191525f61166883611fdd565b905060048151600581111561167f5761167f615420565b146116e95760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610541565b5f8381526005830160205260409020546001600160a01b031633146117205760405162461bcd60e51b815260040161054190615958565b5f83815260088301602090815260408083208054908490556005860190925290912054610a42906001600160a01b031682612a93565b61175e61332e565b5f80516020615ee18339815191525f61177684612b2c565b90505f806117878360400151612d06565b50915091505f61179683611fdd565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d0576117d0615420565b60048111156117e1576117e1615420565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118c55760405162461bcd60e51b81526004016105419061561e565b826001600160401b03168160e001516001600160401b031611156118fb5760405162461bcd60e51b815260040161054190615660565b60038151600481111561191057611910615420565b146119645760405162461bcd60e51b815260206004820152603160248201525f80516020615f018339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610541565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119a590600160a01b900461ffff1684615941565b6119af91906155ff565b905080886008015f8881526020019081526020015f205f8282546119d3919061590c565b909155505060208301516119f0906119eb83856159ca565b612a93565b611a058360200151610bd185606001516113e6565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a5b60015f80516020615f4183398151915255565b5050565b5f611a6861332e565b611a73833384613378565b9050610a5860015f80516020615f4183398151915255565b5f80516020615f218339815191525f611aa383612b2c565b90505f80611ab48360400151613732565b9150915080611b165760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610541565b5f82815260078501602052604081208054611b30906159dd565b9050118015611b62575060015f83815260088601602052604090205460ff166005811115611b6057611b60615420565b145b611b7e5760405162461bcd60e51b815260040161054190615a15565b5f8281526007850160205260408120611b96916151ee565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee183398151915293929190829060ff166004811115611ca457611ca4615420565b6004811115611cb557611cb5615420565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d3c57611d3c615420565b1480611d5a5750600381516004811115611d5857611d58615420565b145b611dae5760405162461bcd60e51b815260206004820152603260248201525f80516020615f01833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610541565b5f611dbc8260400151611fdd565b905080606001516001600160401b03165f03611e405760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb611e6d8460400151846060015185608001516124cd565b6040518263ffffffff1660e01b8152600401611e8991906155cd565b6020604051808303815f875af1158015611ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190615594565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f21833981519152929190611f11906159dd565b9050118015611f43575060015f83815260088301602052604090205460ff166005811115611f4157611f41615420565b145b611f5f5760405162461bcd60e51b815260040161054190615a15565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f989190600401615a5c565b6020604051808303815f875af1158015611fb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd89190615594565b505050565b611fe5615225565b5f8281525f80516020615f61833981519152602052604090819020815160e0810190925280545f80516020615f21833981519152929190829060ff16600581111561203257612032615420565b600581111561204357612043615420565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120ae61332e565b6120ba858585856138d3565b90506120d260015f80516020615f4183398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612125573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261214c9190810190615af1565b91509150806121af5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122169190615594565b82511461227a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610541565b60208201516001600160a01b0316156122f05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610541565b5f806122ff8460400151613b48565b9150915081871461236c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610541565b9695505050505050565b5f8281525f80516020615f61833981519152602052604081206002015481905f80516020615f2183398151915290600160801b90046001600160401b03166123be8582613d20565b5f6123c887613f2e565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124188a858b6124cd565b6040518263ffffffff1660e01b815260040161243491906155cd565b6020604051808303815f875af1158015612450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124749190615594565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612546576125068160016159ca565b612511906008615941565b5081515f9083908390811061252857612528615709565b60200101906001600160f81b03191690815f1a9053506001016124f2565b505f5b60048110156125b15761255d8160036159ca565b612568906008615941565b600263ffffffff16901c60f81b82826002612583919061590c565b8151811061259357612593615709565b60200101906001600160f81b03191690815f1a905350600101612549565b505f5b6020811015612613576125c881601f6159ca565b6125d3906008615941565b86901c60f81b826125e583600661590c565b815181106125f5576125f5615709565b60200101906001600160f81b03191690815f1a9053506001016125b4565b505f5b600881101561267e5761262a8160076159ca565b612635906008615941565b6001600160401b038616901c60f81b8261265083602661590c565b8151811061266057612660615709565b60200101906001600160f81b03191690815f1a905350600101612616565b505f5b60088110156126e9576126958160076159ca565b6126a0906008615941565b6001600160401b038516901c60f81b826126bb83602e61590c565b815181106126cb576126cb615709565b60200101906001600160f81b03191690815f1a905350600101612681565b5090505b9392505050565b6126fc613fbe565b61270582614009565b611a5b81614080565b5f612717615225565b5f80516020615f218339815191525f61272f85612b2c565b90505f806127408360400151613732565b9150915080156127a55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610541565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127d6576127d6615420565b60058111156127e7576127e7615420565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561285857612858615420565b1480612876575060018251600581111561287457612874615420565b145b6128d55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610541565b6003825160058111156128ea576128ea615420565b036128f7575060046128fb565b5060055b6020808301515f9081526009880190915260408120558181600581111561292457612924615420565b9081600581111561293757612937615420565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561296b5761296b615420565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a1f57612a1f615420565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ec183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612aee575f80fd5b505af1158015612b00573d5f803e3d5ffd5b50505050505050565b5f80516020615ec183398151915254611a5b906001600160a01b03168383614121565b60408051606080820183525f8083526020830181905292820152905f80516020615f218339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ba1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bc89190810190615af1565b9150915080612c285760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610541565b8254825114612c8b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610541565b60208201516001600160a01b031615612cfe5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610541565b509392505050565b5f805f8351603614612d2a5760405162461bcd60e51b815260040161054190615bc3565b5f805b6002811015612d7957612d418160016159ca565b612d4c906008615941565b61ffff16868281518110612d6257612d62615709565b016020015160f81c901b9190911790600101612d2d565b5061ffff811615612d9c5760405162461bcd60e51b815260040161054190615c0c565b5f805b6004811015612df757612db38160036159ca565b612dbe906008615941565b63ffffffff1687612dd083600261590c565b81518110612de057612de0615709565b016020015160f81c901b9190911790600101612d9f565b5063ffffffff8116600414612e1e5760405162461bcd60e51b815260040161054190615c4f565b5f805b6020811015612e7357612e3581601f6159ca565b612e40906008615941565b88612e4c83600661590c565b81518110612e5c57612e5c615709565b016020015160f81c901b9190911790600101612e21565b505f805b6008811015612ed257612e8b8160076159ca565b612e96906008615941565b6001600160401b031689612eab83602661590c565b81518110612ebb57612ebb615709565b016020015160f81c901b9190911790600101612e77565b505f805b6008811015612f3157612eea8160076159ca565b612ef5906008615941565b6001600160401b03168a612f0a83602e61590c565b81518110612f1a57612f1a615709565b016020015160f81c901b9190911790600101612ed6565b5091989097509095509350505050565b5f8151602614612f635760405162461bcd60e51b815260040161054190615bc3565b5f805b6002811015612fb257612f7a8160016159ca565b612f85906008615941565b61ffff16848281518110612f9b57612f9b615709565b016020015160f81c901b9190911790600101612f66565b5061ffff811615612fd55760405162461bcd60e51b815260040161054190615c0c565b5f805b600481101561303057612fec8160036159ca565b612ff7906008615941565b63ffffffff168561300983600261590c565b8151811061301957613019615709565b016020015160f81c901b9190911790600101612fd8565b5063ffffffff8116156130555760405162461bcd60e51b815260040161054190615c4f565b5f805b60208110156130aa5761306c81601f6159ca565b613077906008615941565b8661308383600661590c565b8151811061309357613093615709565b016020015160f81c901b9190911790600101613058565b50949350505050565b6130bb615225565b5f8281525f80516020615f618339815191526020526040808220815160e0810190925280545f80516020615f2183398151915293929190829060ff16600581111561310857613108615420565b600581111561311957613119615420565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561318b5761318b615420565b146131e75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610541565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561322b5761322b615420565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132d78582612376565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f4183398151915280546001190161335f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f4183398151915255565b5f5f80516020615ee18339815191528161339461022c85614180565b90505f6133a087611fdd565b90506133ab87612a58565b6134085760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610541565b60028151600581111561341d5761341d615420565b1461347c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610541565b5f82826080015161348d91906159aa565b600485015460408401519192506134af916001600160401b0390911690615c96565b6001600160401b0316816001600160401b0316111561352e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610541565b5f8061353a8a84612376565b915091505f8a8360405160200161356892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561360357613603615420565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137555760405162461bcd60e51b815260040161054190615bc3565b5f805b60028110156137a45761376c8160016159ca565b613777906008615941565b61ffff1685828151811061378d5761378d615709565b016020015160f81c901b9190911790600101613758565b5061ffff8116156137c75760405162461bcd60e51b815260040161054190615c0c565b5f805b6004811015613822576137de8160036159ca565b6137e9906008615941565b63ffffffff16866137fb83600261590c565b8151811061380b5761380b615709565b016020015160f81c901b91909117906001016137ca565b5063ffffffff81166003146138495760405162461bcd60e51b815260040161054190615c4f565b5f805b602081101561389e5761386081601f6159ca565b61386b906008615941565b8761387783600661590c565b8151811061388757613887615709565b016020015160f81c901b919091179060010161384c565b505f866026815181106138b3576138b3615709565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ee18339815191529061ffff86161080159061391f575061271061ffff861611155b61393b5760405162461bcd60e51b815260040161054190615cc1565b60028101546001600160401b0390811690851610156139b45760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610541565b8054831015613a175760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610541565b8060010154831115613a7e5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610541565b5f613a8884614180565b90505f613a9482610a48565b90505f613aa189836141a3565b90506040518060600160405280613ab53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b6b5760405162461bcd60e51b815260040161054190615bc3565b5f805b6002811015613bba57613b828160016159ca565b613b8d906008615941565b61ffff16858281518110613ba357613ba3615709565b016020015160f81c901b9190911790600101613b6e565b5061ffff811615613bdd5760405162461bcd60e51b815260040161054190615c0c565b5f805b6004811015613c3857613bf48160036159ca565b613bff906008615941565b63ffffffff1686613c1183600261590c565b81518110613c2157613c21615709565b016020015160f81c901b9190911790600101613be0565b5063ffffffff8116600514613c5f5760405162461bcd60e51b815260040161054190615c4f565b5f805b6020811015613cb457613c7681601f6159ca565b613c81906008615941565b87613c8d83600661590c565b81518110613c9d57613c9d615709565b016020015160f81c901b9190911790600101613c62565b505f805b6008811015613d1357613ccc8160076159ca565b613cd7906008615941565b6001600160401b031688613cec83602661590c565b81518110613cfc57613cfc615709565b016020015160f81c901b9190911790600101613cb8565b5090969095509350505050565b5f80516020615f218339815191525f6001600160401b038084169085161115613d5457613d4d8385615574565b9050613d61565b613d5e8484615574565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613dc3575060028401548151613dbf916001600160401b03169061590c565b8210155b15613de9576001600160401b038316606082015281815260408101516020820152613e08565b8281606001818151613dfb91906159aa565b6001600160401b03169052505b6060810151613e18906064615c96565b602082015160028601546001600160401b039290921691613e439190600160401b900460ff16615941565b1015613ea75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610541565b856001600160401b031681604001818151613ec2919061590c565b9052506040810180516001600160401b0387169190613ee29083906159ca565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f618339815191526020526040812060020180545f80516020615f2183398151915291600160401b9091046001600160401b0316906008613f7883615d0c565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661400757604051631afcd79f60e31b815260040160405180910390fd5b565b614011613fbe565b61401a81614708565b614022614721565b61407d608082013560a083013561403f60e0850160c086016153e7565b614050610100860160e08701615d27565b61ffff1661406661012087016101008801615d40565b614078610140880161012089016156a9565b614731565b50565b614088613fbe565b5f80516020615ec18339815191526001600160a01b0382166141015760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610541565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611fd891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614975565b5f610a58825f80516020615ec1833981519152546001600160a01b0316906149d6565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661422e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610541565b5f80516020615f218339815191524261424d60408601602087016153e7565b6001600160401b0316116142bf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610541565b6142cf60408501602086016153e7565b6001600160401b03166142e56202a3004261590c565b116143585760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610541565b83356143b05760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610541565b83355f908152600982016020526040902054156143df5760405162461bcd60e51b815260040161054190615864565b60306143ee6040860186615d60565b9050146144535760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610541565b61445d835f613d20565b5f806144f76040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a291906153e7565b6001600160401b031681526020016144bd60408a018a615d60565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b38565b5f828152600786016020526040902091935091506145158282615de6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145429085906004016155cd565b6020604051808303815f875af115801561455e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145829190615594565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145fa576145fa615420565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146da918e01908e016153e7565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614710613fbe565b614718614ee7565b61407d81614eef565b614729613fbe565b614007615091565b614739613fbe565b5f80516020615ee1833981519152836147a55760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610541565b6127108411156147c75760405162461bcd60e51b815260040161054190615cc1565b8587111561482f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610541565b5f8360ff161161489c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610541565b600a60ff8416111561490e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610541565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149896001600160a01b03841683615099565b905080515f141580156149ad5750808060200190518101906149ab9190615ea5565b155b15611fd857604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a409190615594565b9050614a576001600160a01b0385163330866150a6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614a9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614abf9190615594565b9050818111614b255760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610541565b614b2f82826159ca565b95945050505050565b5f6060826080015151603014614ba25760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610541565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c1957614bd98160016159ca565b614be4906008615941565b5081515f90839083908110614bfb57614bfb615709565b60200101906001600160f81b03191690815f1a905350600101614bc5565b505f5b6004811015614c8157614c308160036159ca565b614c3b906008615941565b600160ff919091161c60f81b82614c5383600261590c565b81518110614c6357614c63615709565b60200101906001600160f81b03191690815f1a905350600101614c1c565b505f5b6020811015614cde5784518160208110614ca057614ca0615709565b1a60f81b82614cb083600661590c565b81518110614cc057614cc0615709565b60200101906001600160f81b03191690815f1a905350600101614c84565b505f5b6020811015614d3e5784602001518160208110614d0057614d00615709565b1a60f81b82614d1083602661590c565b81518110614d2057614d20615709565b60200101906001600160f81b03191690815f1a905350600101614ce1565b505f5b6008811015614db257614d558160076159ca565b614d60906008615941565b60ff1685604001516001600160401b0316901c60f81b82826046614d84919061590c565b81518110614d9457614d94615709565b60200101906001600160f81b03191690815f1a905350600101614d41565b505f5b6030811015614e1d5784608001518181518110614dd457614dd4615709565b01602001516001600160f81b03191682614def83604e61590c565b81518110614dff57614dff615709565b60200101906001600160f81b03191690815f1a905350600101614db5565b505f5b6008811015614e8f57614e348160076159ca565b614e3f906008615941565b60608601516001600160401b0390811691161c60f81b82614e6183607e61590c565b81518110614e7157614e71615709565b60200101906001600160f81b03191690815f1a905350600101614e20565b50600281604051614ea091906158fb565b602060405180830381855afa158015614ebb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ede9190615594565b94909350915050565b614007613fbe565b614ef7613fbe565b80355f80516020615f2183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f436080840160608501615d40565b60ff161115614fb05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610541565b5f614fc16080840160608501615d40565b60ff16116150295760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610541565b6150396080830160608401615d40565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561506a60608301604084016153e7565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613365613fbe565b60606126ed83835f6150df565b6040516001600160a01b038481166024830152838116604483015260648201839052610a429186918216906323b872dd9060840161414e565b6060814710156151045760405163cd78605960e01b8152306004820152602401610541565b5f80856001600160a01b0316848660405161511f91906158fb565b5f6040518083038185875af1925050503d805f8114615159576040519150601f19603f3d011682016040523d82523d5f602084013e61515e565b606091505b509150915061236c86838360608261517e57615179826151c5565b6126ed565b815115801561519557506001600160a01b0384163b155b156151be57604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b50806126ed565b8051156151d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151fa906159dd565b5f825580601f10615209575050565b601f0160209004905f5260205f209081019061407d9190615261565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615275575f8155600101615262565b5090565b801515811461407d575f80fd5b803563ffffffff81168114615299575f80fd5b919050565b5f805f606084860312156152b0575f80fd5b8335925060208401356152c281615279565b91506152d060408501615286565b90509250925092565b5f602082840312156152e9575f80fd5b5035919050565b6001600160a01b038116811461407d575f80fd5b5f80828403610160811215615317575f80fd5b61014080821215615326575f80fd5b8493508301359050615337816152f0565b809150509250929050565b5f60208284031215615352575f80fd5b6126ed82615286565b5f806040838503121561536c575f80fd5b61537583615286565b946020939093013593505050565b5f8060408385031215615394575f80fd5b82356001600160401b038111156153a9575f80fd5b8301608081860312156153ba575f80fd5b91506153c860208401615286565b90509250929050565b80356001600160401b0381168114615299575f80fd5b5f602082840312156153f7575f80fd5b6126ed826153d1565b5f8060408385031215615411575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061545757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161549260608401826001600160401b03169052565b5060808301516154ad60808401826001600160401b03169052565b5060a08301516154c860a08401826001600160401b03169052565b5060c08301516154e360c08401826001600160401b03169052565b5092915050565b803561ffff81168114615299575f80fd5b5f805f806080858703121561550e575f80fd5b84356001600160401b03811115615523575f80fd5b850160608188031215615534575f80fd5b9350615542602086016154ea565b9250615550604086016153d1565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154e3576154e3615560565b5f602082840312156155a4575f80fd5b5051919050565b5f5b838110156155c55781810151838201526020016155ad565b50505f910152565b602081525f82518060208401526155eb8160408501602087016155ab565b601f01601f19169190910160400192915050565b5f8261561957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156b9575f80fd5b81356126ed816152f0565b5f808335601e198436030181126156d9575f80fd5b8301803591506001600160401b038211156156f2575f80fd5b6020019150600581901b36038213156124c6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615731575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157715761577161573b565b60405290565b604051601f8201601f191681016001600160401b038111828210171561579f5761579f61573b565b604052919050565b5f6001600160401b038211156157bf576157bf61573b565b50601f01601f191660200190565b5f606082360312156157dd575f80fd5b6157e561574f565b8235815260206157f68185016153d1565b8183015260408401356001600160401b03811115615812575f80fd5b840136601f820112615822575f80fd5b8035615835615830826157a7565b615777565b8181523684838501011115615848575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158bd818460208a016155ab565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158ed8160288401602088016155ab565b016028019695505050505050565b5f82516157318184602087016155ab565b80820180821115610a5857610a58615560565b5f63ffffffff80831681810361593757615937615560565b6001019392505050565b8082028115828204841417610a5857610a58615560565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156154e3576154e3615560565b81810381811115610a5857610a58615560565b600181811c908216806159f157607f821691505b602082108103615a0f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a6e816159dd565b806020870152604060018084165f8114615a8f5760018114615aab57615ad8565b60ff19851660408a0152604084151560051b8a01019550615ad8565b895f5260205f205f5b85811015615acf5781548b8201860152908301908801615ab4565b8a016040019650505b509398975050505050505050565b805161529981615279565b5f8060408385031215615b02575f80fd5b82516001600160401b0380821115615b18575f80fd5b9084019060608287031215615b2b575f80fd5b615b3361574f565b82518152602080840151615b46816152f0565b82820152604084015183811115615b5b575f80fd5b80850194505087601f850112615b6f575f80fd5b83519250615b7f615830846157a7565b8381528882858701011115615b92575f80fd5b615ba1848383018488016155ab565b80604084015250819550615bb6818801615ae6565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cb957615cb9615560565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361593757615937615560565b5f60208284031215615d37575f80fd5b6126ed826154ea565b5f60208284031215615d50575f80fd5b813560ff811681146126ed575f80fd5b5f808335601e19843603018112615d75575f80fd5b8301803591506001600160401b03821115615d8e575f80fd5b6020019150368190038213156124c6575f80fd5b601f821115611fd857805f5260205f20601f840160051c81016020851015615dc75750805b601f840160051c820191505b81811015610bd6575f8155600101615dd3565b81516001600160401b03811115615dff57615dff61573b565b615e1381615e0d84546159dd565b84615da2565b602080601f831160018114615e46575f8415615e2f5750858301515b5f19600386901b1c1916600185901b178555615e9d565b5f85815260208120601f198616915b82811015615e7457888601518255948401946001909101908401615e55565b5085821015615e9157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615eb5575f80fd5b81516126ed8161527956fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 1a312f622..de6df87d5 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d60380380615d6083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c138061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004615013565b610534565b005b3480156101c5575f80fd5b506101b86101d436600461504e565b6109d7565b3480156101e4575f80fd5b506102236101f336600461504e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b8610276366004615065565b610b90565b348015610286575f80fd5b5061029a61029536600461504e565b610c6d565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150a3565b610c83565b34801561032a575f80fd5b506101b86103393660046150f7565b610cb7565b348015610349575f80fd5b506101b8610358366004615110565b610d57565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615138565b610f2c565b3480156103b0575f80fd5b506102236103bf366004615186565b611560565b3480156103cf575f80fd5b5061029a6103de36600461504e565b611579565b3480156103ee575f80fd5b506101b86103fd366004615013565b61158d565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b861043036600461504e565b611799565b348015610440575f80fd5b506101b861044f366004615110565b6118ea565b34801561045f575f80fd5b506101b861046e3660046150f7565b611bf3565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a736600461504e565b611dab565b3480156104b7575f80fd5b506101b86104c636600461504e565b612031565b6102236104d936600461504e565b612145565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c36600461504e565b612176565b60405161022d91906151b3565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615b67833981519152949193919290829060ff16600481111561059c5761059c61519f565b60048111156105ad576105ad61519f565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61062983612176565b90506002825160048111156106405761064061519f565b146106925760405162461bcd60e51b815260206004820152602a60248201525f80516020615b878339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106f75760405162461bcd60e51b815260206004820152603360248201525f80516020615b878339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610689565b6003825280515f9060029060058111156107135761071361519f565b0361076a57861561072b57610728848761223e565b90505b5f83606001518360800151610740919061527d565b905061074c85826124da565b506001600160401b0390811660e0860152421660a08501525061079e565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d18560600151611560565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610872919061529d565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108b1576108b161519f565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615be78339815191526020526040808220815160e0810190925280545f80516020615ba783398151915293929190829060ff166005811115610a2457610a2461519f565b6005811115610a3557610a3561519f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa457610aa461519f565b14610b095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb610b2e8584606001515f612631565b6040518263ffffffff1660e01b8152600401610b4a91906152d6565b6020604051808303815f875af1158015610b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8a919061529d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bd9575080546001600160401b03808416911610155b15610bf75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c2183612856565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7d64e8d4a5100083615308565b92915050565b5f610c8c61286a565b610c98848484346128a1565b9050610cb060015f80516020615bc783398151915255565b9392505050565b5f80516020615b678339815191525f80610cd084612b1e565b91509150610cdd82612e68565b610ce75750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1557610d1561519f565b03610d3a575f83815260088501602052604081208054919055610d388282612ea3565b505b610d5081610d4b8460400151611560565b612f09565b5050505050565b5f80516020615b678339815191525f610d6f84612f1c565b90505f80610d8083604001516130f6565b50915091505f610d8f83612176565b9050816001600160401b031681606001516001600160401b03161015610dc75760405162461bcd60e51b815260040161068990615327565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0c5760405162461bcd60e51b815260040161068990615369565b60015f87815260068701602052604090205460ff166004811115610e3257610e3261519f565b14610e9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610689565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ba78339815191529060ff1615610fc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611030919061529d565b8360200135146110925760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610689565b306110a360608501604086016153c6565b6001600160a01b0316146111155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610689565b5f61112360608501856153e1565b91505f90508435602086013560146111416060890160408a016153c6565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611470575f6111c160608901896153e1565b8363ffffffff168181106111d7576111d7615426565b90506020028101906111e9919061543a565b6111f2906154ea565b80515f81815260098901602052604090205491925090156112255760405162461bcd60e51b815260040161068990615581565b84825f01518360200151846040015160405160200161124794939291906155c9565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112959190615618565b602060405180830381855afa1580156112b0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d3919061529d565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561135f5761135f61519f565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611412911686615629565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114699061563c565b90506111a5565b50600584018190555f61148286612f1c565b90505f6114928260400151613331565b9050806002856040516114a59190615618565b602060405180830381855afa1580156114c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e3919061529d565b146115475760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610689565b505050600a909201805460ff1916600117905550505050565b5f610c7d6001600160401b03831664e8d4a5100061565e565b5f61158382612176565b6080015192915050565b5f80516020615b678339815191525f6115a58561349a565b90506115b085612e68565b6115bb575050505050565b5f85815260058301602052604090205460a08201516115ea91600160b01b90046001600160401b031690615675565b6001600160401b03168160c001516001600160401b0316101561166b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610689565b8315610d50575f61167c868561223e565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906116d390611560565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611749573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061176d919061529d565b5f8781526008850160205260408120805490919061178c908490615629565b9091555050505050505050565b5f80516020615b678339815191525f6117b183612176565b90506004815160058111156117c8576117c861519f565b146118325760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610689565b5f8381526005830160205260409020546001600160a01b031633146118b45760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60448201527137ba1037bbb732b210313c9039b2b73232b960711b6064820152608401610689565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8a906001600160a01b031682612ea3565b6118f261286a565b5f80516020615b678339815191525f61190a84612f1c565b90505f8061191b83604001516130f6565b50915091505f61192a83612176565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119645761196461519f565b60048111156119755761197561519f565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a595760405162461bcd60e51b815260040161068990615327565b826001600160401b03168160e001516001600160401b03161115611a8f5760405162461bcd60e51b815260040161068990615369565b600381516004811115611aa457611aa461519f565b14611af85760405162461bcd60e51b815260206004820152603160248201525f80516020615b878339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610689565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b3990600160a01b900461ffff168461565e565b611b439190615308565b905080886008015f8881526020019081526020015f205f828254611b679190615629565b90915550506020830151611b8490611b7f8385615695565b612ea3565b611b998360200151610d4b8560600151611560565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bef60015f80516020615bc783398151915255565b5050565b5f80516020615ba78339815191525f611c0b83612f1c565b90505f80611c1c8360400151613715565b9150915080611c7e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610689565b5f82815260078501602052604081208054611c98906156a8565b9050118015611cca575060015f83815260088601602052604090205460ff166005811115611cc857611cc861519f565b145b611ce65760405162461bcd60e51b8152600401610689906156da565b5f8281526007850160205260408120611cfe91614f68565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b6783398151915293929190829060ff166004811115611e0c57611e0c61519f565b6004811115611e1d57611e1d61519f565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ea457611ea461519f565b1480611ec25750600381516004811115611ec057611ec061519f565b145b611f165760405162461bcd60e51b815260206004820152603260248201525f80516020615b87833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610689565b5f611f248260400151612176565b905080606001516001600160401b03165f03611fa85760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb611fd5846040015184606001518560800151612631565b6040518263ffffffff1660e01b8152600401611ff191906152d6565b6020604051808303815f875af115801561200d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d50919061529d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ba7833981519152929190612079906156a8565b90501180156120ab575060015f83815260088301602052604090205460ff1660058111156120a9576120a961519f565b145b6120c75760405162461bcd60e51b8152600401610689906156da565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916121009190600401615721565b6020604051808303815f875af115801561211c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612140919061529d565b505050565b5f61214e61286a565b6121598233346138b6565b905061217160015f80516020615bc783398151915255565b919050565b61217e614f9f565b5f8281525f80516020615be7833981519152602052604090819020815160e0810190925280545f80516020615ba7833981519152929190829060ff1660058111156121cb576121cb61519f565b60058111156121dc576121dc61519f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612289573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b091908101906157b6565b91509150806123135760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612356573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061237a919061529d565b8251146123de5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610689565b60208201516001600160a01b0316156124545760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610689565b5f806124638460400151613c6d565b915091508187146124d05760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610689565b9695505050505050565b5f8281525f80516020615be7833981519152602052604081206002015481905f80516020615ba783398151915290600160801b90046001600160401b03166125228582613e45565b5f61252c87614053565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61257c8a858b612631565b6040518263ffffffff1660e01b815260040161259891906152d6565b6020604051808303815f875af11580156125b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d8919061529d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126aa5761266a816001615695565b61267590600861565e565b5081515f9083908390811061268c5761268c615426565b60200101906001600160f81b03191690815f1a905350600101612656565b505f5b6004811015612715576126c1816003615695565b6126cc90600861565e565b600263ffffffff16901c60f81b828260026126e79190615629565b815181106126f7576126f7615426565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b60208110156127775761272c81601f615695565b61273790600861565e565b86901c60f81b82612749836006615629565b8151811061275957612759615426565b60200101906001600160f81b03191690815f1a905350600101612718565b505f5b60088110156127e25761278e816007615695565b61279990600861565e565b6001600160401b038616901c60f81b826127b4836026615629565b815181106127c4576127c4615426565b60200101906001600160f81b03191690815f1a90535060010161277a565b505f5b600881101561284d576127f9816007615695565b61280490600861565e565b6001600160401b038516901c60f81b8261281f83602e615629565b8151811061282f5761282f615426565b60200101906001600160f81b03191690815f1a9053506001016127e5565b50949350505050565b61285e6140e3565b6128678161412e565b50565b5f80516020615bc783398151915280546001190161289b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b678339815191529061ffff8616108015906128ed575061271061ffff861611155b6129095760405162461bcd60e51b815260040161068990615888565b60028101546001600160401b0390811690851610156129825760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610689565b80548310156129e55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610689565b8060010154831115612a4c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610689565b825f612a5782610c6d565b90505f612a6489836141a2565b90506040518060600160405280612a783390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bc783398151915255565b5f612b27614f9f565b5f80516020615ba78339815191525f612b3f85612f1c565b90505f80612b508360400151613715565b915091508015612bb55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610689565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612be657612be661519f565b6005811115612bf757612bf761519f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c6857612c6861519f565b1480612c865750600182516005811115612c8457612c8461519f565b145b612ce55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610689565b600382516005811115612cfa57612cfa61519f565b03612d0757506004612d0b565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3457612d3461519f565b90816005811115612d4757612d4761519f565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d7b57612d7b61519f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e2f57612e2f61519f565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612eef575f80fd5b505af1158015612f01573d5f803e3d5ffd5b505050505050565b611bef6001600160a01b03831682614707565b60408051606080820183525f8083526020830181905292820152905f80516020615ba78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f91573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fb891908101906157b6565b91509150806130185760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610689565b825482511461307b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610689565b60208201516001600160a01b0316156130ee5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610689565b509392505050565b5f805f835160361461311a5760405162461bcd60e51b8152600401610689906158d3565b5f805b600281101561316957613131816001615695565b61313c90600861565e565b61ffff1686828151811061315257613152615426565b016020015160f81c901b919091179060010161311d565b5061ffff81161561318c5760405162461bcd60e51b81526004016106899061591c565b5f805b60048110156131e7576131a3816003615695565b6131ae90600861565e565b63ffffffff16876131c0836002615629565b815181106131d0576131d0615426565b016020015160f81c901b919091179060010161318f565b5063ffffffff811660041461320e5760405162461bcd60e51b81526004016106899061595f565b5f805b60208110156132635761322581601f615695565b61323090600861565e565b8861323c836006615629565b8151811061324c5761324c615426565b016020015160f81c901b9190911790600101613211565b505f805b60088110156132c25761327b816007615695565b61328690600861565e565b6001600160401b03168961329b836026615629565b815181106132ab576132ab615426565b016020015160f81c901b9190911790600101613267565b505f805b6008811015613321576132da816007615695565b6132e590600861565e565b6001600160401b03168a6132fa83602e615629565b8151811061330a5761330a615426565b016020015160f81c901b91909117906001016132c6565b5091989097509095509350505050565b5f81516026146133535760405162461bcd60e51b8152600401610689906158d3565b5f805b60028110156133a25761336a816001615695565b61337590600861565e565b61ffff1684828151811061338b5761338b615426565b016020015160f81c901b9190911790600101613356565b5061ffff8116156133c55760405162461bcd60e51b81526004016106899061591c565b5f805b6004811015613420576133dc816003615695565b6133e790600861565e565b63ffffffff16856133f9836002615629565b8151811061340957613409615426565b016020015160f81c901b91909117906001016133c8565b5063ffffffff8116156134455760405162461bcd60e51b81526004016106899061595f565b5f805b602081101561284d5761345c81601f615695565b61346790600861565e565b86613473836006615629565b8151811061348357613483615426565b016020015160f81c901b9190911790600101613448565b6134a2614f9f565b5f8281525f80516020615be78339815191526020526040808220815160e0810190925280545f80516020615ba783398151915293929190829060ff1660058111156134ef576134ef61519f565b60058111156135005761350061519f565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156135725761357261519f565b146135ce5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610689565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156136125761361261519f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136be85826124da565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137385760405162461bcd60e51b8152600401610689906158d3565b5f805b60028110156137875761374f816001615695565b61375a90600861565e565b61ffff1685828151811061377057613770615426565b016020015160f81c901b919091179060010161373b565b5061ffff8116156137aa5760405162461bcd60e51b81526004016106899061591c565b5f805b6004811015613805576137c1816003615695565b6137cc90600861565e565b63ffffffff16866137de836002615629565b815181106137ee576137ee615426565b016020015160f81c901b91909117906001016137ad565b5063ffffffff811660031461382c5760405162461bcd60e51b81526004016106899061595f565b5f805b60208110156138815761384381601f615695565b61384e90600861565e565b8761385a836006615629565b8151811061386a5761386a615426565b016020015160f81c901b919091179060010161382f565b505f8660268151811061389657613896615426565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b67833981519152816138cf84610c6d565b90505f6138db87612176565b90506138e687612e68565b6139435760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610689565b6002815160058111156139585761395861519f565b146139b75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610689565b5f8282608001516139c89190615675565b600485015460408401519192506139ea916001600160401b03909116906159a6565b6001600160401b0316816001600160401b03161115613a695760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610689565b5f80613a758a846124da565b915091505f8a83604051602001613aa392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b3e57613b3e61519f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c905760405162461bcd60e51b8152600401610689906158d3565b5f805b6002811015613cdf57613ca7816001615695565b613cb290600861565e565b61ffff16858281518110613cc857613cc8615426565b016020015160f81c901b9190911790600101613c93565b5061ffff811615613d025760405162461bcd60e51b81526004016106899061591c565b5f805b6004811015613d5d57613d19816003615695565b613d2490600861565e565b63ffffffff1686613d36836002615629565b81518110613d4657613d46615426565b016020015160f81c901b9190911790600101613d05565b5063ffffffff8116600514613d845760405162461bcd60e51b81526004016106899061595f565b5f805b6020811015613dd957613d9b81601f615695565b613da690600861565e565b87613db2836006615629565b81518110613dc257613dc2615426565b016020015160f81c901b9190911790600101613d87565b505f805b6008811015613e3857613df1816007615695565b613dfc90600861565e565b6001600160401b031688613e11836026615629565b81518110613e2157613e21615426565b016020015160f81c901b9190911790600101613ddd565b5090969095509350505050565b5f80516020615ba78339815191525f6001600160401b038084169085161115613e7957613e72838561527d565b9050613e86565b613e83848461527d565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ee8575060028401548151613ee4916001600160401b031690615629565b8210155b15613f0e576001600160401b038316606082015281815260408101516020820152613f2d565b8281606001818151613f209190615675565b6001600160401b03169052505b6060810151613f3d9060646159a6565b602082015160028601546001600160401b039290921691613f689190600160401b900460ff1661565e565b1015613fcc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610689565b856001600160401b031681604001818151613fe79190615629565b9052506040810180516001600160401b0387169190614007908390615695565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615be78339815191526020526040812060020180545f80516020615ba783398151915291600160401b9091046001600160401b031690600861409d836159d1565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661412c57604051631afcd79f60e31b815260040160405180910390fd5b565b6141366140e3565b61413f8161479a565b6141476147b3565b612867608082013560a083013561416460e0850160c08601615186565b614175610100860160e087016159ec565b61ffff1661418b61012087016101008801615a05565b61419d610140880161012089016153c6565b6147c3565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661422d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610689565b5f80516020615ba78339815191524261424c6040860160208701615186565b6001600160401b0316116142be5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610689565b6142ce6040850160208601615186565b6001600160401b03166142e46202a30042615629565b116143575760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610689565b83356143af5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610689565b83355f908152600982016020526040902054156143de5760405162461bcd60e51b815260040161068990615581565b60306143ed6040860186615a25565b9050146144525760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610689565b61445c835f613e45565b5f806144f66040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a19190615186565b6001600160401b031681526020016144bc60408a018a615a25565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a07565b5f828152600786016020526040902091935091506145148282615aab565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145419085906004016152d6565b6020604051808303815f875af115801561455d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614581919061529d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145f9576145f961519f565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146d9918e01908e01615186565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561472a5760405163cd78605960e01b8152306004820152602401610689565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614773576040519150601f19603f3d011682016040523d82523d5f602084013e614778565b606091505b505090508061214057604051630a12f52160e11b815260040160405180910390fd5b6147a26140e3565b6147aa614db6565b61286781614dbe565b6147bb6140e3565b61412c614f60565b6147cb6140e3565b5f80516020615b67833981519152836148375760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610689565b6127108411156148595760405162461bcd60e51b815260040161068990615888565b858711156148c15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610689565b5f8360ff161161492e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610689565b600a60ff841611156149a05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610689565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a715760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610689565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ae857614aa8816001615695565b614ab390600861565e565b5081515f90839083908110614aca57614aca615426565b60200101906001600160f81b03191690815f1a905350600101614a94565b505f5b6004811015614b5057614aff816003615695565b614b0a90600861565e565b600160ff919091161c60f81b82614b22836002615629565b81518110614b3257614b32615426565b60200101906001600160f81b03191690815f1a905350600101614aeb565b505f5b6020811015614bad5784518160208110614b6f57614b6f615426565b1a60f81b82614b7f836006615629565b81518110614b8f57614b8f615426565b60200101906001600160f81b03191690815f1a905350600101614b53565b505f5b6020811015614c0d5784602001518160208110614bcf57614bcf615426565b1a60f81b82614bdf836026615629565b81518110614bef57614bef615426565b60200101906001600160f81b03191690815f1a905350600101614bb0565b505f5b6008811015614c8157614c24816007615695565b614c2f90600861565e565b60ff1685604001516001600160401b0316901c60f81b82826046614c539190615629565b81518110614c6357614c63615426565b60200101906001600160f81b03191690815f1a905350600101614c10565b505f5b6030811015614cec5784608001518181518110614ca357614ca3615426565b01602001516001600160f81b03191682614cbe83604e615629565b81518110614cce57614cce615426565b60200101906001600160f81b03191690815f1a905350600101614c84565b505f5b6008811015614d5e57614d03816007615695565b614d0e90600861565e565b60608601516001600160401b0390811691161c60f81b82614d3083607e615629565b81518110614d4057614d40615426565b60200101906001600160f81b03191690815f1a905350600101614cef565b50600281604051614d6f9190615618565b602060405180830381855afa158015614d8a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614dad919061529d565b94909350915050565b61412c6140e3565b614dc66140e3565b80355f80516020615ba783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e126080840160608501615a05565b60ff161115614e7f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610689565b5f614e906080840160608501615a05565b60ff1611614ef85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610689565b614f086080830160608401615a05565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f396060830160408401615186565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b0b6140e3565b508054614f74906156a8565b5f825580601f10614f83575050565b601f0160209004905f5260205f20908101906128679190614fdb565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fef575f8155600101614fdc565b5090565b8015158114612867575f80fd5b803563ffffffff81168114612171575f80fd5b5f805f60608486031215615025575f80fd5b83359250602084013561503781614ff3565b915061504560408501615000565b90509250925092565b5f6020828403121561505e575f80fd5b5035919050565b5f6101408284031215615076575f80fd5b50919050565b803561ffff81168114612171575f80fd5b80356001600160401b0381168114612171575f80fd5b5f805f606084860312156150b5575f80fd5b83356001600160401b038111156150ca575f80fd5b8401606081870312156150db575f80fd5b92506150e96020850161507c565b91506150456040850161508d565b5f60208284031215615107575f80fd5b610cb082615000565b5f8060408385031215615121575f80fd5b61512a83615000565b946020939093013593505050565b5f8060408385031215615149575f80fd5b82356001600160401b0381111561515e575f80fd5b83016080818603121561516f575f80fd5b915061517d60208401615000565b90509250929050565b5f60208284031215615196575f80fd5b610cb08261508d565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151d657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521160608401826001600160401b03169052565b50608083015161522c60808401826001600160401b03169052565b5060a083015161524760a08401826001600160401b03169052565b5060c083015161526260c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526257615262615269565b5f602082840312156152ad575f80fd5b5051919050565b5f5b838110156152ce5781810151838201526020016152b6565b50505f910152565b602081525f82518060208401526152f48160408501602087016152b4565b601f01601f19169190910160400192915050565b5f8261532257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612867575f80fd5b5f602082840312156153d6575f80fd5b8135610cb0816153b2565b5f808335601e198436030181126153f6575f80fd5b8301803591506001600160401b0382111561540f575f80fd5b6020019150600581901b360382131561262a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261544e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561548e5761548e615458565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154bc576154bc615458565b604052919050565b5f6001600160401b038211156154dc576154dc615458565b50601f01601f191660200190565b5f606082360312156154fa575f80fd5b61550261546c565b82358152602061551381850161508d565b8183015260408401356001600160401b0381111561552f575f80fd5b840136601f82011261553f575f80fd5b803561555261554d826154c4565b615494565b8181523684838501011115615565575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155da818460208a016152b4565b80830190508581526001600160401b0360c01b8560c01b166020820152835161560a8160288401602088016152b4565b016028019695505050505050565b5f825161544e8184602087016152b4565b80820180821115610c7d57610c7d615269565b5f63ffffffff80831681810361565457615654615269565b6001019392505050565b8082028115828204841417610c7d57610c7d615269565b6001600160401b0381811683821601908082111561526257615262615269565b81810381811115610c7d57610c7d615269565b600181811c908216806156bc57607f821691505b60208210810361507657634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615733816156a8565b806020870152604060018084165f811461575457600181146157705761579d565b60ff19851660408a0152604084151560051b8a0101955061579d565b895f5260205f205f5b858110156157945781548b8201860152908301908801615779565b8a016040019650505b509398975050505050505050565b805161217181614ff3565b5f80604083850312156157c7575f80fd5b82516001600160401b03808211156157dd575f80fd5b90840190606082870312156157f0575f80fd5b6157f861546c565b8251815260208084015161580b816153b2565b82820152604084015183811115615820575f80fd5b80850194505087601f850112615834575f80fd5b8351925061584461554d846154c4565b8381528882858701011115615857575f80fd5b615866848383018488016152b4565b8060408401525081955061587b8188016157ab565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146159c9576159c9615269565b505092915050565b5f6001600160401b0380831681810361565457615654615269565b5f602082840312156159fc575f80fd5b610cb08261507c565b5f60208284031215615a15575f80fd5b813560ff81168114610cb0575f80fd5b5f808335601e19843603018112615a3a575f80fd5b8301803591506001600160401b03821115615a53575f80fd5b60200191503681900382131561262a575f80fd5b601f82111561214057805f5260205f20601f840160051c81016020851015615a8c5750805b601f840160051c820191505b81811015610d50575f8155600101615a98565b81516001600160401b03811115615ac457615ac4615458565b615ad881615ad284546156a8565b84615a67565b602080601f831160018114615b0b575f8415615af45750858301515b5f19600386901b1c1916600185901b178555612f01565b5f85815260208120601f198616915b82811015615b3957888601518255948401946001909101908401615b1a565b5085821015615b5657878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d98380380615d9883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c4b8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004614ff9565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615034565b6109d7565b3480156101e4575f80fd5b506102236101f3366004615034565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461504b565b610b90565b348015610286575f80fd5b5061029a610295366004615034565b610c6d565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a366004615089565b610c83565b34801561032a575f80fd5b506101b86103393660046150dd565b610cb7565b348015610349575f80fd5b506101b86103583660046150f6565b610d57565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a036600461511e565b610f2c565b3480156103b0575f80fd5b506102236103bf36600461516c565b611560565b3480156103cf575f80fd5b5061029a6103de366004615034565b611579565b3480156103ee575f80fd5b506101b86103fd366004614ff9565b61158d565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615034565b6117ca565b348015610440575f80fd5b506101b861044f3660046150f6565b6118d0565b34801561045f575f80fd5b506101b861046e3660046150dd565b611bd9565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615034565b611d91565b3480156104b7575f80fd5b506101b86104c6366004615034565b612017565b6102236104d9366004615034565b61212b565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615034565b61215c565b60405161022d9190615199565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615b9f833981519152949193919290829060ff16600481111561059c5761059c615185565b60048111156105ad576105ad615185565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6106298361215c565b905060028251600481111561064057610640615185565b146106925760405162461bcd60e51b815260206004820152602a60248201525f80516020615bbf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106f75760405162461bcd60e51b815260206004820152603360248201525f80516020615bbf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610689565b6003825280515f90600290600581111561071357610713615185565b0361076a57861561072b576107288487612224565b90505b5f836060015183608001516107409190615263565b905061074c85826124c0565b506001600160401b0390811660e0860152421660a08501525061079e565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d18560600151611560565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108729190615283565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108b1576108b1615185565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c1f8339815191526020526040808220815160e0810190925280545f80516020615bdf83398151915293929190829060ff166005811115610a2457610a24615185565b6005811115610a3557610a35615185565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa457610aa4615185565b14610b095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb610b2e8584606001515f612617565b6040518263ffffffff1660e01b8152600401610b4a91906152bc565b6020604051808303815f875af1158015610b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8a9190615283565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bd9575080546001600160401b03808416911610155b15610bf75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c218361283c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7d64e8d4a51000836152ee565b92915050565b5f610c8c612850565b610c9884848434612887565b9050610cb060015f80516020615bff83398151915255565b9392505050565b5f80516020615b9f8339815191525f80610cd084612b04565b91509150610cdd82612e4e565b610ce75750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1557610d15615185565b03610d3a575f83815260088501602052604081208054919055610d388282612e89565b505b610d5081610d4b8460400151611560565b612eef565b5050505050565b5f80516020615b9f8339815191525f610d6f84612f02565b90505f80610d8083604001516130dc565b50915091505f610d8f8361215c565b9050816001600160401b031681606001516001600160401b03161015610dc75760405162461bcd60e51b81526004016106899061530d565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0c5760405162461bcd60e51b81526004016106899061534f565b60015f87815260068701602052604090205460ff166004811115610e3257610e32615185565b14610e9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610689565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bdf8339815191529060ff1615610fc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110309190615283565b8360200135146110925760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610689565b306110a360608501604086016153ac565b6001600160a01b0316146111155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610689565b5f61112360608501856153c7565b91505f90508435602086013560146111416060890160408a016153ac565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611470575f6111c160608901896153c7565b8363ffffffff168181106111d7576111d761540c565b90506020028101906111e99190615420565b6111f2906154d0565b80515f81815260098901602052604090205491925090156112255760405162461bcd60e51b815260040161068990615567565b84825f01518360200151846040015160405160200161124794939291906155af565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161129591906155fe565b602060405180830381855afa1580156112b0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d39190615283565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561135f5761135f615185565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161141291168661560f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146990615622565b90506111a5565b50600584018190555f61148286612f02565b90505f6114928260400151613317565b9050806002856040516114a591906155fe565b602060405180830381855afa1580156114c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e39190615283565b146115475760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610689565b505050600a909201805460ff1916600117905550505050565b5f610c7d6001600160401b03831664e8d4a51000615644565b5f6115838261215c565b6080015192915050565b5f80516020615b9f8339815191525f6115a585613480565b90506115b085612e4e565b15610d50575f8581526005830160205260409020546001600160a01b031633146115ec5760405162461bcd60e51b81526004016106899061565b565b5f85815260058301602052604090205460a082015161161b91600160b01b90046001600160401b0316906156ad565b6001600160401b03168160c001516001600160401b0316101561169c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610689565b8315610d50575f6116ad8685612224565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170490611560565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561177a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179e9190615283565b5f878152600885016020526040812080549091906117bd90849061560f565b9091555050505050505050565b5f80516020615b9f8339815191525f6117e28361215c565b90506004815160058111156117f9576117f9615185565b146118635760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610689565b5f8381526005830160205260409020546001600160a01b0316331461189a5760405162461bcd60e51b81526004016106899061565b565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8a906001600160a01b031682612e89565b6118d8612850565b5f80516020615b9f8339815191525f6118f084612f02565b90505f8061190183604001516130dc565b50915091505f6119108361215c565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561194a5761194a615185565b600481111561195b5761195b615185565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a3f5760405162461bcd60e51b81526004016106899061530d565b826001600160401b03168160e001516001600160401b03161115611a755760405162461bcd60e51b81526004016106899061534f565b600381516004811115611a8a57611a8a615185565b14611ade5760405162461bcd60e51b815260206004820152603160248201525f80516020615bbf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610689565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b1f90600160a01b900461ffff1684615644565b611b2991906152ee565b905080886008015f8881526020019081526020015f205f828254611b4d919061560f565b90915550506020830151611b6a90611b6583856156cd565b612e89565b611b7f8360200151610d4b8560600151611560565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bd560015f80516020615bff83398151915255565b5050565b5f80516020615bdf8339815191525f611bf183612f02565b90505f80611c0283604001516136fb565b9150915080611c645760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610689565b5f82815260078501602052604081208054611c7e906156e0565b9050118015611cb0575060015f83815260088601602052604090205460ff166005811115611cae57611cae615185565b145b611ccc5760405162461bcd60e51b815260040161068990615712565b5f8281526007850160205260408120611ce491614f4e565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b9f83398151915293929190829060ff166004811115611df257611df2615185565b6004811115611e0357611e03615185565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e8a57611e8a615185565b1480611ea85750600381516004811115611ea657611ea6615185565b145b611efc5760405162461bcd60e51b815260206004820152603260248201525f80516020615bbf833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610689565b5f611f0a826040015161215c565b905080606001516001600160401b03165f03611f8e5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb611fbb846040015184606001518560800151612617565b6040518263ffffffff1660e01b8152600401611fd791906152bc565b6020604051808303815f875af1158015611ff3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d509190615283565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bdf83398151915292919061205f906156e0565b9050118015612091575060015f83815260088301602052604090205460ff16600581111561208f5761208f615185565b145b6120ad5760405162461bcd60e51b815260040161068990615712565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120e69190600401615759565b6020604051808303815f875af1158015612102573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121269190615283565b505050565b5f612134612850565b61213f82333461389c565b905061215760015f80516020615bff83398151915255565b919050565b612164614f85565b5f8281525f80516020615c1f833981519152602052604090819020815160e0810190925280545f80516020615bdf833981519152929190829060ff1660058111156121b1576121b1615185565b60058111156121c2576121c2615185565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561226f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229691908101906157ee565b91509150806122f95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561233c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123609190615283565b8251146123c45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610689565b60208201516001600160a01b03161561243a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610689565b5f806124498460400151613c53565b915091508187146124b65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610689565b9695505050505050565b5f8281525f80516020615c1f833981519152602052604081206002015481905f80516020615bdf83398151915290600160801b90046001600160401b03166125088582613e2b565b5f61251287614039565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125628a858b612617565b6040518263ffffffff1660e01b815260040161257e91906152bc565b6020604051808303815f875af115801561259a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125be9190615283565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612690576126508160016156cd565b61265b906008615644565b5081515f908390839081106126725761267261540c565b60200101906001600160f81b03191690815f1a90535060010161263c565b505f5b60048110156126fb576126a78160036156cd565b6126b2906008615644565b600263ffffffff16901c60f81b828260026126cd919061560f565b815181106126dd576126dd61540c565b60200101906001600160f81b03191690815f1a905350600101612693565b505f5b602081101561275d5761271281601f6156cd565b61271d906008615644565b86901c60f81b8261272f83600661560f565b8151811061273f5761273f61540c565b60200101906001600160f81b03191690815f1a9053506001016126fe565b505f5b60088110156127c8576127748160076156cd565b61277f906008615644565b6001600160401b038616901c60f81b8261279a83602661560f565b815181106127aa576127aa61540c565b60200101906001600160f81b03191690815f1a905350600101612760565b505f5b6008811015612833576127df8160076156cd565b6127ea906008615644565b6001600160401b038516901c60f81b8261280583602e61560f565b815181106128155761281561540c565b60200101906001600160f81b03191690815f1a9053506001016127cb565b50949350505050565b6128446140c9565b61284d81614114565b50565b5f80516020615bff83398151915280546001190161288157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b9f8339815191529061ffff8616108015906128d3575061271061ffff861611155b6128ef5760405162461bcd60e51b8152600401610689906158c0565b60028101546001600160401b0390811690851610156129685760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610689565b80548310156129cb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610689565b8060010154831115612a325760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610689565b825f612a3d82610c6d565b90505f612a4a8983614188565b90506040518060600160405280612a5e3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bff83398151915255565b5f612b0d614f85565b5f80516020615bdf8339815191525f612b2585612f02565b90505f80612b3683604001516136fb565b915091508015612b9b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610689565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bcc57612bcc615185565b6005811115612bdd57612bdd615185565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c4e57612c4e615185565b1480612c6c5750600182516005811115612c6a57612c6a615185565b145b612ccb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610689565b600382516005811115612ce057612ce0615185565b03612ced57506004612cf1565b5060055b6020808301515f90815260098801909152604081205581816005811115612d1a57612d1a615185565b90816005811115612d2d57612d2d615185565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d6157612d61615185565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e1557612e15615185565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ed5575f80fd5b505af1158015612ee7573d5f803e3d5ffd5b505050505050565b611bd56001600160a01b038316826146ed565b60408051606080820183525f8083526020830181905292820152905f80516020615bdf8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f77573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f9e91908101906157ee565b9150915080612ffe5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610689565b82548251146130615760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610689565b60208201516001600160a01b0316156130d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610689565b509392505050565b5f805f83516036146131005760405162461bcd60e51b81526004016106899061590b565b5f805b600281101561314f576131178160016156cd565b613122906008615644565b61ffff168682815181106131385761313861540c565b016020015160f81c901b9190911790600101613103565b5061ffff8116156131725760405162461bcd60e51b815260040161068990615954565b5f805b60048110156131cd576131898160036156cd565b613194906008615644565b63ffffffff16876131a683600261560f565b815181106131b6576131b661540c565b016020015160f81c901b9190911790600101613175565b5063ffffffff81166004146131f45760405162461bcd60e51b815260040161068990615997565b5f805b60208110156132495761320b81601f6156cd565b613216906008615644565b8861322283600661560f565b815181106132325761323261540c565b016020015160f81c901b91909117906001016131f7565b505f805b60088110156132a8576132618160076156cd565b61326c906008615644565b6001600160401b03168961328183602661560f565b815181106132915761329161540c565b016020015160f81c901b919091179060010161324d565b505f805b6008811015613307576132c08160076156cd565b6132cb906008615644565b6001600160401b03168a6132e083602e61560f565b815181106132f0576132f061540c565b016020015160f81c901b91909117906001016132ac565b5091989097509095509350505050565b5f81516026146133395760405162461bcd60e51b81526004016106899061590b565b5f805b6002811015613388576133508160016156cd565b61335b906008615644565b61ffff168482815181106133715761337161540c565b016020015160f81c901b919091179060010161333c565b5061ffff8116156133ab5760405162461bcd60e51b815260040161068990615954565b5f805b6004811015613406576133c28160036156cd565b6133cd906008615644565b63ffffffff16856133df83600261560f565b815181106133ef576133ef61540c565b016020015160f81c901b91909117906001016133ae565b5063ffffffff81161561342b5760405162461bcd60e51b815260040161068990615997565b5f805b60208110156128335761344281601f6156cd565b61344d906008615644565b8661345983600661560f565b815181106134695761346961540c565b016020015160f81c901b919091179060010161342e565b613488614f85565b5f8281525f80516020615c1f8339815191526020526040808220815160e0810190925280545f80516020615bdf83398151915293929190829060ff1660058111156134d5576134d5615185565b60058111156134e6576134e6615185565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561355857613558615185565b146135b45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610689565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156135f8576135f8615185565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136a485826124c0565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461371e5760405162461bcd60e51b81526004016106899061590b565b5f805b600281101561376d576137358160016156cd565b613740906008615644565b61ffff168582815181106137565761375661540c565b016020015160f81c901b9190911790600101613721565b5061ffff8116156137905760405162461bcd60e51b815260040161068990615954565b5f805b60048110156137eb576137a78160036156cd565b6137b2906008615644565b63ffffffff16866137c483600261560f565b815181106137d4576137d461540c565b016020015160f81c901b9190911790600101613793565b5063ffffffff81166003146138125760405162461bcd60e51b815260040161068990615997565b5f805b60208110156138675761382981601f6156cd565b613834906008615644565b8761384083600661560f565b815181106138505761385061540c565b016020015160f81c901b9190911790600101613815565b505f8660268151811061387c5761387c61540c565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b9f833981519152816138b584610c6d565b90505f6138c18761215c565b90506138cc87612e4e565b6139295760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610689565b60028151600581111561393e5761393e615185565b1461399d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610689565b5f8282608001516139ae91906156ad565b600485015460408401519192506139d0916001600160401b03909116906159de565b6001600160401b0316816001600160401b03161115613a4f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610689565b5f80613a5b8a846124c0565b915091505f8a83604051602001613a8992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b2457613b24615185565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c765760405162461bcd60e51b81526004016106899061590b565b5f805b6002811015613cc557613c8d8160016156cd565b613c98906008615644565b61ffff16858281518110613cae57613cae61540c565b016020015160f81c901b9190911790600101613c79565b5061ffff811615613ce85760405162461bcd60e51b815260040161068990615954565b5f805b6004811015613d4357613cff8160036156cd565b613d0a906008615644565b63ffffffff1686613d1c83600261560f565b81518110613d2c57613d2c61540c565b016020015160f81c901b9190911790600101613ceb565b5063ffffffff8116600514613d6a5760405162461bcd60e51b815260040161068990615997565b5f805b6020811015613dbf57613d8181601f6156cd565b613d8c906008615644565b87613d9883600661560f565b81518110613da857613da861540c565b016020015160f81c901b9190911790600101613d6d565b505f805b6008811015613e1e57613dd78160076156cd565b613de2906008615644565b6001600160401b031688613df783602661560f565b81518110613e0757613e0761540c565b016020015160f81c901b9190911790600101613dc3565b5090969095509350505050565b5f80516020615bdf8339815191525f6001600160401b038084169085161115613e5f57613e588385615263565b9050613e6c565b613e698484615263565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ece575060028401548151613eca916001600160401b03169061560f565b8210155b15613ef4576001600160401b038316606082015281815260408101516020820152613f13565b8281606001818151613f0691906156ad565b6001600160401b03169052505b6060810151613f239060646159de565b602082015160028601546001600160401b039290921691613f4e9190600160401b900460ff16615644565b1015613fb25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610689565b856001600160401b031681604001818151613fcd919061560f565b9052506040810180516001600160401b0387169190613fed9083906156cd565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c1f8339815191526020526040812060020180545f80516020615bdf83398151915291600160401b9091046001600160401b031690600861408383615a09565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661411257604051631afcd79f60e31b815260040160405180910390fd5b565b61411c6140c9565b61412581614780565b61412d614799565b61284d608082013560a083013561414a60e0850160c0860161516c565b61415b610100860160e08701615a24565b61ffff1661417161012087016101008801615a3d565b614183610140880161012089016153ac565b6147a9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142135760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610689565b5f80516020615bdf83398151915242614232604086016020870161516c565b6001600160401b0316116142a45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610689565b6142b4604085016020860161516c565b6001600160401b03166142ca6202a3004261560f565b1161433d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610689565b83356143955760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610689565b83355f908152600982016020526040902054156143c45760405162461bcd60e51b815260040161068990615567565b60306143d36040860186615a5d565b9050146144385760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610689565b614442835f613e2b565b5f806144dc6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614487919061516c565b6001600160401b031681526020016144a260408a018a615a5d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149ed565b5f828152600786016020526040902091935091506144fa8282615ae3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145279085906004016152bc565b6020604051808303815f875af1158015614543573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145679190615283565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145df576145df615185565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146bf918e01908e0161516c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147105760405163cd78605960e01b8152306004820152602401610689565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614759576040519150601f19603f3d011682016040523d82523d5f602084013e61475e565b606091505b505090508061212657604051630a12f52160e11b815260040160405180910390fd5b6147886140c9565b614790614d9c565b61284d81614da4565b6147a16140c9565b614112614f46565b6147b16140c9565b5f80516020615b9f8339815191528361481d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610689565b61271084111561483f5760405162461bcd60e51b8152600401610689906158c0565b858711156148a75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610689565b5f8360ff16116149145760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610689565b600a60ff841611156149865760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610689565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a575760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610689565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ace57614a8e8160016156cd565b614a99906008615644565b5081515f90839083908110614ab057614ab061540c565b60200101906001600160f81b03191690815f1a905350600101614a7a565b505f5b6004811015614b3657614ae58160036156cd565b614af0906008615644565b600160ff919091161c60f81b82614b0883600261560f565b81518110614b1857614b1861540c565b60200101906001600160f81b03191690815f1a905350600101614ad1565b505f5b6020811015614b935784518160208110614b5557614b5561540c565b1a60f81b82614b6583600661560f565b81518110614b7557614b7561540c565b60200101906001600160f81b03191690815f1a905350600101614b39565b505f5b6020811015614bf35784602001518160208110614bb557614bb561540c565b1a60f81b82614bc583602661560f565b81518110614bd557614bd561540c565b60200101906001600160f81b03191690815f1a905350600101614b96565b505f5b6008811015614c6757614c0a8160076156cd565b614c15906008615644565b60ff1685604001516001600160401b0316901c60f81b82826046614c39919061560f565b81518110614c4957614c4961540c565b60200101906001600160f81b03191690815f1a905350600101614bf6565b505f5b6030811015614cd25784608001518181518110614c8957614c8961540c565b01602001516001600160f81b03191682614ca483604e61560f565b81518110614cb457614cb461540c565b60200101906001600160f81b03191690815f1a905350600101614c6a565b505f5b6008811015614d4457614ce98160076156cd565b614cf4906008615644565b60608601516001600160401b0390811691161c60f81b82614d1683607e61560f565b81518110614d2657614d2661540c565b60200101906001600160f81b03191690815f1a905350600101614cd5565b50600281604051614d5591906155fe565b602060405180830381855afa158015614d70573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d939190615283565b94909350915050565b6141126140c9565b614dac6140c9565b80355f80516020615bdf83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614df86080840160608501615a3d565b60ff161115614e655760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610689565b5f614e766080840160608501615a3d565b60ff1611614ede5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610689565b614eee6080830160608401615a3d565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f1f606083016040840161516c565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612af16140c9565b508054614f5a906156e0565b5f825580601f10614f69575050565b601f0160209004905f5260205f209081019061284d9190614fc1565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fd5575f8155600101614fc2565b5090565b801515811461284d575f80fd5b803563ffffffff81168114612157575f80fd5b5f805f6060848603121561500b575f80fd5b83359250602084013561501d81614fd9565b915061502b60408501614fe6565b90509250925092565b5f60208284031215615044575f80fd5b5035919050565b5f610140828403121561505c575f80fd5b50919050565b803561ffff81168114612157575f80fd5b80356001600160401b0381168114612157575f80fd5b5f805f6060848603121561509b575f80fd5b83356001600160401b038111156150b0575f80fd5b8401606081870312156150c1575f80fd5b92506150cf60208501615062565b915061502b60408501615073565b5f602082840312156150ed575f80fd5b610cb082614fe6565b5f8060408385031215615107575f80fd5b61511083614fe6565b946020939093013593505050565b5f806040838503121561512f575f80fd5b82356001600160401b03811115615144575f80fd5b830160808186031215615155575f80fd5b915061516360208401614fe6565b90509250929050565b5f6020828403121561517c575f80fd5b610cb082615073565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151bc57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151f760608401826001600160401b03169052565b50608083015161521260808401826001600160401b03169052565b5060a083015161522d60a08401826001600160401b03169052565b5060c083015161524860c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156152485761524861524f565b5f60208284031215615293575f80fd5b5051919050565b5f5b838110156152b457818101518382015260200161529c565b50505f910152565b602081525f82518060208401526152da81604085016020870161529a565b601f01601f19169190910160400192915050565b5f8261530857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461284d575f80fd5b5f602082840312156153bc575f80fd5b8135610cb081615398565b5f808335601e198436030181126153dc575f80fd5b8301803591506001600160401b038211156153f5575f80fd5b6020019150600581901b3603821315612610575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615434575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154745761547461543e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154a2576154a261543e565b604052919050565b5f6001600160401b038211156154c2576154c261543e565b50601f01601f191660200190565b5f606082360312156154e0575f80fd5b6154e8615452565b8235815260206154f9818501615073565b8183015260408401356001600160401b03811115615515575f80fd5b840136601f820112615525575f80fd5b8035615538615533826154aa565b61547a565b818152368483850101111561554b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155c0818460208a0161529a565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155f081602884016020880161529a565b016028019695505050505050565b5f825161543481846020870161529a565b80820180821115610c7d57610c7d61524f565b5f63ffffffff80831681810361563a5761563a61524f565b6001019392505050565b8082028115828204841417610c7d57610c7d61524f565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156152485761524861524f565b81810381811115610c7d57610c7d61524f565b600181811c908216806156f457607f821691505b60208210810361505c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461576b816156e0565b806020870152604060018084165f811461578c57600181146157a8576157d5565b60ff19851660408a0152604084151560051b8a010195506157d5565b895f5260205f205f5b858110156157cc5781548b82018601529083019088016157b1565b8a016040019650505b509398975050505050505050565b805161215781614fd9565b5f80604083850312156157ff575f80fd5b82516001600160401b0380821115615815575f80fd5b9084019060608287031215615828575f80fd5b615830615452565b8251815260208084015161584381615398565b82820152604084015183811115615858575f80fd5b80850194505087601f85011261586c575f80fd5b8351925061587c615533846154aa565b838152888285870101111561588f575f80fd5b61589e8483830184880161529a565b806040840152508195506158b38188016157e3565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0157615a0161524f565b505092915050565b5f6001600160401b0380831681810361563a5761563a61524f565b5f60208284031215615a34575f80fd5b610cb082615062565b5f60208284031215615a4d575f80fd5b813560ff81168114610cb0575f80fd5b5f808335601e19843603018112615a72575f80fd5b8301803591506001600160401b03821115615a8b575f80fd5b602001915036819003821315612610575f80fd5b601f82111561212657805f5260205f20601f840160051c81016020851015615ac45750805b601f840160051c820191505b81811015610d50575f8155600101615ad0565b81516001600160401b03811115615afc57615afc61543e565b615b1081615b0a84546156e0565b84615a9f565b602080601f831160018114615b43575f8415615b2c5750858301515b5f19600386901b1c1916600185901b178555612ee7565b5f85815260208120601f198616915b82811015615b7157888601518255948401946001909101908401615b52565b5085821015615b8e57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 38f7288ae..56ac2c55e 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -164,7 +164,14 @@ abstract contract PoSValidatorManager is Validator memory validator = _initializeEndValidation(validationID); - if (!_isPoSValidator(validationID)) { + if (_isPoSValidator(validationID)) { + // PoS validations can only be ended by their owners. + require( + $._validatorRequirements[validationID].owner == _msgSender(), + "PoSValidatorManager: validator not owned by sender" + ); + } else { + // Non-PoS validations can be ended by anyone, and do not get rewards, so return here. return; } From 3286116ba599601014e4068f677b68d0e3c6a152 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 10:03:09 -0400 Subject: [PATCH 362/545] Small fix --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 316d22a9b..6eaab5861 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160da3803806160da83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f8d8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e61019936600461529e565b6103ec565b005b61019e6101ae3660046152d9565b61088f565b6101f16101c13660046152d9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152d9565b610a48565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615304565b610a5e565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615342565b610b3d565b61019e61029936600461535b565b610bdd565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c9366004615383565b610db2565b6101f16102dc3660046153e7565b6113e6565b6102316102ef3660046152d9565b6113ff565b61019e61030236600461529e565b611413565b61020c603081565b61019e61031d3660046152d9565b611650565b61019e61033036600461535b565b611756565b6101f1610343366004615400565b611a5f565b61019e610356366004615342565b611a8b565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152d9565b611c43565b61019e6103a23660046152d9565b611ec9565b61020c601481565b6103c26103bd3660046152d9565b611fdd565b6040516101fb9190615434565b6102316202a30081565b6101f16103e73660046154fb565b6120a5565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615ee1833981519152949193919290829060ff16600481111561045457610454615420565b600481111561046557610465615420565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104e183611fdd565b90506002825160048111156104f8576104f8615420565b1461054a5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f018339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105af5760405162461bcd60e51b815260206004820152603360248201525f80516020615f018339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610541565b6003825280515f9060029060058111156105cb576105cb615420565b036106225786156105e3576105e084876120da565b90505b5f836060015183608001516105f89190615574565b90506106048582612376565b506001600160401b0390811660e0860152421660a085015250610656565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068985606001516113e6565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610706573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072a9190615594565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff1916600183600481111561076957610769615420565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087d916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f618339815191526020526040808220815160e0810190925280545f80516020615f2183398151915293929190829060ff1660058111156108dc576108dc615420565b60058111156108ed576108ed615420565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095c5761095c615420565b146109c15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb6109e68584606001515f6124cd565b6040518263ffffffff1660e01b8152600401610a0291906155cd565b6020604051808303815f875af1158015610a1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a429190615594565b50505050565b5f610a5864e8d4a51000836155ff565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa7575080546001600160401b03808416911610155b15610ac55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af084846126f4565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ee18339815191525f80610b568461270e565b91509150610b6382612a58565b610b6d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9b57610b9b615420565b03610bc0575f83815260088501602052604081208054919055610bbe8282612a93565b505b610bd681610bd184604001516113e6565b612b09565b5050505050565b5f80516020615ee18339815191525f610bf584612b2c565b90505f80610c068360400151612d06565b50915091505f610c1583611fdd565b9050816001600160401b031681606001516001600160401b03161015610c4d5760405162461bcd60e51b81526004016105419061561e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c925760405162461bcd60e51b815260040161054190615660565b60015f87815260068701602052604090205460ff166004811115610cb857610cb8615420565b14610d215760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610541565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f218339815191529060ff1615610e4f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e92573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb69190615594565b836020013514610f185760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610541565b30610f2960608501604086016156a9565b6001600160a01b031614610f9b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610541565b5f610fa960608501856156c4565b91505f9050843560208601356014610fc76060890160408a016156a9565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f6575f61104760608901896156c4565b8363ffffffff1681811061105d5761105d615709565b905060200281019061106f919061571d565b611078906157cd565b80515f81815260098901602052604090205491925090156110ab5760405162461bcd60e51b815260040161054190615864565b84825f0151836020015184604001516040516020016110cd94939291906158ac565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111b91906158fb565b602060405180830381855afa158015611136573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111599190615594565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e5576111e5615420565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129891168661590c565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ef9061591f565b905061102b565b50600584018190555f61130886612b2c565b90505f6113188260400151612f41565b90508060028560405161132b91906158fb565b602060405180830381855afa158015611346573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113699190615594565b146113cd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610541565b505050600a909201805460ff1916600117905550505050565b5f610a586001600160401b03831664e8d4a51000615941565b5f61140982611fdd565b6080015192915050565b5f80516020615ee18339815191525f61142b856130b3565b905061143685612a58565b15610bd6575f8581526005830160205260409020546001600160a01b031633146114725760405162461bcd60e51b815260040161054190615958565b5f85815260058301602052604090205460a08201516114a191600160b01b90046001600160401b0316906159aa565b6001600160401b03168160c001516001600160401b031610156115225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610541565b8315610bd6575f61153386856120da565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061158a906113e6565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611600573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116249190615594565b5f8781526008850160205260408120805490919061164390849061590c565b9091555050505050505050565b5f80516020615ee18339815191525f61166883611fdd565b905060048151600581111561167f5761167f615420565b146116e95760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610541565b5f8381526005830160205260409020546001600160a01b031633146117205760405162461bcd60e51b815260040161054190615958565b5f83815260088301602090815260408083208054908490556005860190925290912054610a42906001600160a01b031682612a93565b61175e61332e565b5f80516020615ee18339815191525f61177684612b2c565b90505f806117878360400151612d06565b50915091505f61179683611fdd565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d0576117d0615420565b60048111156117e1576117e1615420565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118c55760405162461bcd60e51b81526004016105419061561e565b826001600160401b03168160e001516001600160401b031611156118fb5760405162461bcd60e51b815260040161054190615660565b60038151600481111561191057611910615420565b146119645760405162461bcd60e51b815260206004820152603160248201525f80516020615f018339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610541565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119a590600160a01b900461ffff1684615941565b6119af91906155ff565b905080886008015f8881526020019081526020015f205f8282546119d3919061590c565b909155505060208301516119f0906119eb83856159ca565b612a93565b611a058360200151610bd185606001516113e6565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a5b60015f80516020615f4183398151915255565b5050565b5f611a6861332e565b611a73833384613378565b9050610a5860015f80516020615f4183398151915255565b5f80516020615f218339815191525f611aa383612b2c565b90505f80611ab48360400151613732565b9150915080611b165760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610541565b5f82815260078501602052604081208054611b30906159dd565b9050118015611b62575060015f83815260088601602052604090205460ff166005811115611b6057611b60615420565b145b611b7e5760405162461bcd60e51b815260040161054190615a15565b5f8281526007850160205260408120611b96916151ee565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee183398151915293929190829060ff166004811115611ca457611ca4615420565b6004811115611cb557611cb5615420565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d3c57611d3c615420565b1480611d5a5750600381516004811115611d5857611d58615420565b145b611dae5760405162461bcd60e51b815260206004820152603260248201525f80516020615f01833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610541565b5f611dbc8260400151611fdd565b905080606001516001600160401b03165f03611e405760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610541565b6005600160991b016001600160a01b031663ee5b48eb611e6d8460400151846060015185608001516124cd565b6040518263ffffffff1660e01b8152600401611e8991906155cd565b6020604051808303815f875af1158015611ea5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd69190615594565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f21833981519152929190611f11906159dd565b9050118015611f43575060015f83815260088301602052604090205460ff166005811115611f4157611f41615420565b145b611f5f5760405162461bcd60e51b815260040161054190615a15565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f989190600401615a5c565b6020604051808303815f875af1158015611fb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd89190615594565b505050565b611fe5615225565b5f8281525f80516020615f61833981519152602052604090819020815160e0810190925280545f80516020615f21833981519152929190829060ff16600581111561203257612032615420565b600581111561204357612043615420565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120ae61332e565b6120ba858585856138d3565b90506120d260015f80516020615f4183398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612125573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261214c9190810190615af1565b91509150806121af5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610541565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122169190615594565b82511461227a5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610541565b60208201516001600160a01b0316156122f05760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610541565b5f806122ff8460400151613b48565b9150915081871461236c5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610541565b9695505050505050565b5f8281525f80516020615f61833981519152602052604081206002015481905f80516020615f2183398151915290600160801b90046001600160401b03166123be8582613d20565b5f6123c887613f2e565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124188a858b6124cd565b6040518263ffffffff1660e01b815260040161243491906155cd565b6020604051808303815f875af1158015612450573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124749190615594565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612546576125068160016159ca565b612511906008615941565b5081515f9083908390811061252857612528615709565b60200101906001600160f81b03191690815f1a9053506001016124f2565b505f5b60048110156125b15761255d8160036159ca565b612568906008615941565b600263ffffffff16901c60f81b82826002612583919061590c565b8151811061259357612593615709565b60200101906001600160f81b03191690815f1a905350600101612549565b505f5b6020811015612613576125c881601f6159ca565b6125d3906008615941565b86901c60f81b826125e583600661590c565b815181106125f5576125f5615709565b60200101906001600160f81b03191690815f1a9053506001016125b4565b505f5b600881101561267e5761262a8160076159ca565b612635906008615941565b6001600160401b038616901c60f81b8261265083602661590c565b8151811061266057612660615709565b60200101906001600160f81b03191690815f1a905350600101612616565b505f5b60088110156126e9576126958160076159ca565b6126a0906008615941565b6001600160401b038516901c60f81b826126bb83602e61590c565b815181106126cb576126cb615709565b60200101906001600160f81b03191690815f1a905350600101612681565b5090505b9392505050565b6126fc613fbe565b61270582614009565b611a5b81614080565b5f612717615225565b5f80516020615f218339815191525f61272f85612b2c565b90505f806127408360400151613732565b9150915080156127a55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610541565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127d6576127d6615420565b60058111156127e7576127e7615420565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561285857612858615420565b1480612876575060018251600581111561287457612874615420565b145b6128d55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610541565b6003825160058111156128ea576128ea615420565b036128f7575060046128fb565b5060055b6020808301515f9081526009880190915260408120558181600581111561292457612924615420565b9081600581111561293757612937615420565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561296b5761296b615420565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a1f57612a1f615420565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ec183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612aee575f80fd5b505af1158015612b00573d5f803e3d5ffd5b50505050505050565b5f80516020615ec183398151915254611a5b906001600160a01b03168383614121565b60408051606080820183525f8083526020830181905292820152905f80516020615f218339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ba1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bc89190810190615af1565b9150915080612c285760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610541565b8254825114612c8b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610541565b60208201516001600160a01b031615612cfe5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610541565b509392505050565b5f805f8351603614612d2a5760405162461bcd60e51b815260040161054190615bc3565b5f805b6002811015612d7957612d418160016159ca565b612d4c906008615941565b61ffff16868281518110612d6257612d62615709565b016020015160f81c901b9190911790600101612d2d565b5061ffff811615612d9c5760405162461bcd60e51b815260040161054190615c0c565b5f805b6004811015612df757612db38160036159ca565b612dbe906008615941565b63ffffffff1687612dd083600261590c565b81518110612de057612de0615709565b016020015160f81c901b9190911790600101612d9f565b5063ffffffff8116600414612e1e5760405162461bcd60e51b815260040161054190615c4f565b5f805b6020811015612e7357612e3581601f6159ca565b612e40906008615941565b88612e4c83600661590c565b81518110612e5c57612e5c615709565b016020015160f81c901b9190911790600101612e21565b505f805b6008811015612ed257612e8b8160076159ca565b612e96906008615941565b6001600160401b031689612eab83602661590c565b81518110612ebb57612ebb615709565b016020015160f81c901b9190911790600101612e77565b505f805b6008811015612f3157612eea8160076159ca565b612ef5906008615941565b6001600160401b03168a612f0a83602e61590c565b81518110612f1a57612f1a615709565b016020015160f81c901b9190911790600101612ed6565b5091989097509095509350505050565b5f8151602614612f635760405162461bcd60e51b815260040161054190615bc3565b5f805b6002811015612fb257612f7a8160016159ca565b612f85906008615941565b61ffff16848281518110612f9b57612f9b615709565b016020015160f81c901b9190911790600101612f66565b5061ffff811615612fd55760405162461bcd60e51b815260040161054190615c0c565b5f805b600481101561303057612fec8160036159ca565b612ff7906008615941565b63ffffffff168561300983600261590c565b8151811061301957613019615709565b016020015160f81c901b9190911790600101612fd8565b5063ffffffff8116156130555760405162461bcd60e51b815260040161054190615c4f565b5f805b60208110156130aa5761306c81601f6159ca565b613077906008615941565b8661308383600661590c565b8151811061309357613093615709565b016020015160f81c901b9190911790600101613058565b50949350505050565b6130bb615225565b5f8281525f80516020615f618339815191526020526040808220815160e0810190925280545f80516020615f2183398151915293929190829060ff16600581111561310857613108615420565b600581111561311957613119615420565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561318b5761318b615420565b146131e75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610541565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561322b5761322b615420565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132d78582612376565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f4183398151915280546001190161335f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f4183398151915255565b5f5f80516020615ee18339815191528161339461022c85614180565b90505f6133a087611fdd565b90506133ab87612a58565b6134085760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610541565b60028151600581111561341d5761341d615420565b1461347c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610541565b5f82826080015161348d91906159aa565b600485015460408401519192506134af916001600160401b0390911690615c96565b6001600160401b0316816001600160401b0316111561352e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610541565b5f8061353a8a84612376565b915091505f8a8360405160200161356892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561360357613603615420565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137555760405162461bcd60e51b815260040161054190615bc3565b5f805b60028110156137a45761376c8160016159ca565b613777906008615941565b61ffff1685828151811061378d5761378d615709565b016020015160f81c901b9190911790600101613758565b5061ffff8116156137c75760405162461bcd60e51b815260040161054190615c0c565b5f805b6004811015613822576137de8160036159ca565b6137e9906008615941565b63ffffffff16866137fb83600261590c565b8151811061380b5761380b615709565b016020015160f81c901b91909117906001016137ca565b5063ffffffff81166003146138495760405162461bcd60e51b815260040161054190615c4f565b5f805b602081101561389e5761386081601f6159ca565b61386b906008615941565b8761387783600661590c565b8151811061388757613887615709565b016020015160f81c901b919091179060010161384c565b505f866026815181106138b3576138b3615709565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ee18339815191529061ffff86161080159061391f575061271061ffff861611155b61393b5760405162461bcd60e51b815260040161054190615cc1565b60028101546001600160401b0390811690851610156139b45760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610541565b8054831015613a175760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610541565b8060010154831115613a7e5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610541565b5f613a8884614180565b90505f613a9482610a48565b90505f613aa189836141a3565b90506040518060600160405280613ab53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b6b5760405162461bcd60e51b815260040161054190615bc3565b5f805b6002811015613bba57613b828160016159ca565b613b8d906008615941565b61ffff16858281518110613ba357613ba3615709565b016020015160f81c901b9190911790600101613b6e565b5061ffff811615613bdd5760405162461bcd60e51b815260040161054190615c0c565b5f805b6004811015613c3857613bf48160036159ca565b613bff906008615941565b63ffffffff1686613c1183600261590c565b81518110613c2157613c21615709565b016020015160f81c901b9190911790600101613be0565b5063ffffffff8116600514613c5f5760405162461bcd60e51b815260040161054190615c4f565b5f805b6020811015613cb457613c7681601f6159ca565b613c81906008615941565b87613c8d83600661590c565b81518110613c9d57613c9d615709565b016020015160f81c901b9190911790600101613c62565b505f805b6008811015613d1357613ccc8160076159ca565b613cd7906008615941565b6001600160401b031688613cec83602661590c565b81518110613cfc57613cfc615709565b016020015160f81c901b9190911790600101613cb8565b5090969095509350505050565b5f80516020615f218339815191525f6001600160401b038084169085161115613d5457613d4d8385615574565b9050613d61565b613d5e8484615574565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613dc3575060028401548151613dbf916001600160401b03169061590c565b8210155b15613de9576001600160401b038316606082015281815260408101516020820152613e08565b8281606001818151613dfb91906159aa565b6001600160401b03169052505b6060810151613e18906064615c96565b602082015160028601546001600160401b039290921691613e439190600160401b900460ff16615941565b1015613ea75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610541565b856001600160401b031681604001818151613ec2919061590c565b9052506040810180516001600160401b0387169190613ee29083906159ca565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f618339815191526020526040812060020180545f80516020615f2183398151915291600160401b9091046001600160401b0316906008613f7883615d0c565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661400757604051631afcd79f60e31b815260040160405180910390fd5b565b614011613fbe565b61401a81614708565b614022614721565b61407d608082013560a083013561403f60e0850160c086016153e7565b614050610100860160e08701615d27565b61ffff1661406661012087016101008801615d40565b614078610140880161012089016156a9565b614731565b50565b614088613fbe565b5f80516020615ec18339815191526001600160a01b0382166141015760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610541565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611fd891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614975565b5f610a58825f80516020615ec1833981519152546001600160a01b0316906149d6565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661422e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610541565b5f80516020615f218339815191524261424d60408601602087016153e7565b6001600160401b0316116142bf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610541565b6142cf60408501602086016153e7565b6001600160401b03166142e56202a3004261590c565b116143585760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610541565b83356143b05760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610541565b83355f908152600982016020526040902054156143df5760405162461bcd60e51b815260040161054190615864565b60306143ee6040860186615d60565b9050146144535760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610541565b61445d835f613d20565b5f806144f76040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a291906153e7565b6001600160401b031681526020016144bd60408a018a615d60565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b38565b5f828152600786016020526040902091935091506145158282615de6565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145429085906004016155cd565b6020604051808303815f875af115801561455e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145829190615594565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145fa576145fa615420565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146da918e01908e016153e7565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614710613fbe565b614718614ee7565b61407d81614eef565b614729613fbe565b614007615091565b614739613fbe565b5f80516020615ee1833981519152836147a55760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610541565b6127108411156147c75760405162461bcd60e51b815260040161054190615cc1565b8587111561482f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610541565b5f8360ff161161489c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610541565b600a60ff8416111561490e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610541565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149896001600160a01b03841683615099565b905080515f141580156149ad5750808060200190518101906149ab9190615ea5565b155b15611fd857604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a409190615594565b9050614a576001600160a01b0385163330866150a6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614a9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614abf9190615594565b9050818111614b255760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610541565b614b2f82826159ca565b95945050505050565b5f6060826080015151603014614ba25760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610541565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c1957614bd98160016159ca565b614be4906008615941565b5081515f90839083908110614bfb57614bfb615709565b60200101906001600160f81b03191690815f1a905350600101614bc5565b505f5b6004811015614c8157614c308160036159ca565b614c3b906008615941565b600160ff919091161c60f81b82614c5383600261590c565b81518110614c6357614c63615709565b60200101906001600160f81b03191690815f1a905350600101614c1c565b505f5b6020811015614cde5784518160208110614ca057614ca0615709565b1a60f81b82614cb083600661590c565b81518110614cc057614cc0615709565b60200101906001600160f81b03191690815f1a905350600101614c84565b505f5b6020811015614d3e5784602001518160208110614d0057614d00615709565b1a60f81b82614d1083602661590c565b81518110614d2057614d20615709565b60200101906001600160f81b03191690815f1a905350600101614ce1565b505f5b6008811015614db257614d558160076159ca565b614d60906008615941565b60ff1685604001516001600160401b0316901c60f81b82826046614d84919061590c565b81518110614d9457614d94615709565b60200101906001600160f81b03191690815f1a905350600101614d41565b505f5b6030811015614e1d5784608001518181518110614dd457614dd4615709565b01602001516001600160f81b03191682614def83604e61590c565b81518110614dff57614dff615709565b60200101906001600160f81b03191690815f1a905350600101614db5565b505f5b6008811015614e8f57614e348160076159ca565b614e3f906008615941565b60608601516001600160401b0390811691161c60f81b82614e6183607e61590c565b81518110614e7157614e71615709565b60200101906001600160f81b03191690815f1a905350600101614e20565b50600281604051614ea091906158fb565b602060405180830381855afa158015614ebb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ede9190615594565b94909350915050565b614007613fbe565b614ef7613fbe565b80355f80516020615f2183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f436080840160608501615d40565b60ff161115614fb05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610541565b5f614fc16080840160608501615d40565b60ff16116150295760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610541565b6150396080830160608401615d40565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561506a60608301604084016153e7565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613365613fbe565b60606126ed83835f6150df565b6040516001600160a01b038481166024830152838116604483015260648201839052610a429186918216906323b872dd9060840161414e565b6060814710156151045760405163cd78605960e01b8152306004820152602401610541565b5f80856001600160a01b0316848660405161511f91906158fb565b5f6040518083038185875af1925050503d805f8114615159576040519150601f19603f3d011682016040523d82523d5f602084013e61515e565b606091505b509150915061236c86838360608261517e57615179826151c5565b6126ed565b815115801561519557506001600160a01b0384163b155b156151be57604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b50806126ed565b8051156151d55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151fa906159dd565b5f825580601f10615209575050565b601f0160209004905f5260205f209081019061407d9190615261565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615275575f8155600101615262565b5090565b801515811461407d575f80fd5b803563ffffffff81168114615299575f80fd5b919050565b5f805f606084860312156152b0575f80fd5b8335925060208401356152c281615279565b91506152d060408501615286565b90509250925092565b5f602082840312156152e9575f80fd5b5035919050565b6001600160a01b038116811461407d575f80fd5b5f80828403610160811215615317575f80fd5b61014080821215615326575f80fd5b8493508301359050615337816152f0565b809150509250929050565b5f60208284031215615352575f80fd5b6126ed82615286565b5f806040838503121561536c575f80fd5b61537583615286565b946020939093013593505050565b5f8060408385031215615394575f80fd5b82356001600160401b038111156153a9575f80fd5b8301608081860312156153ba575f80fd5b91506153c860208401615286565b90509250929050565b80356001600160401b0381168114615299575f80fd5b5f602082840312156153f7575f80fd5b6126ed826153d1565b5f8060408385031215615411575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061545757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161549260608401826001600160401b03169052565b5060808301516154ad60808401826001600160401b03169052565b5060a08301516154c860a08401826001600160401b03169052565b5060c08301516154e360c08401826001600160401b03169052565b5092915050565b803561ffff81168114615299575f80fd5b5f805f806080858703121561550e575f80fd5b84356001600160401b03811115615523575f80fd5b850160608188031215615534575f80fd5b9350615542602086016154ea565b9250615550604086016153d1565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154e3576154e3615560565b5f602082840312156155a4575f80fd5b5051919050565b5f5b838110156155c55781810151838201526020016155ad565b50505f910152565b602081525f82518060208401526155eb8160408501602087016155ab565b601f01601f19169190910160400192915050565b5f8261561957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156b9575f80fd5b81356126ed816152f0565b5f808335601e198436030181126156d9575f80fd5b8301803591506001600160401b038211156156f2575f80fd5b6020019150600581901b36038213156124c6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615731575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157715761577161573b565b60405290565b604051601f8201601f191681016001600160401b038111828210171561579f5761579f61573b565b604052919050565b5f6001600160401b038211156157bf576157bf61573b565b50601f01601f191660200190565b5f606082360312156157dd575f80fd5b6157e561574f565b8235815260206157f68185016153d1565b8183015260408401356001600160401b03811115615812575f80fd5b840136601f820112615822575f80fd5b8035615835615830826157a7565b615777565b8181523684838501011115615848575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158bd818460208a016155ab565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158ed8160288401602088016155ab565b016028019695505050505050565b5f82516157318184602087016155ab565b80820180821115610a5857610a58615560565b5f63ffffffff80831681810361593757615937615560565b6001019392505050565b8082028115828204841417610a5857610a58615560565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156154e3576154e3615560565b81810381811115610a5857610a58615560565b600181811c908216806159f157607f821691505b602082108103615a0f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a6e816159dd565b806020870152604060018084165f8114615a8f5760018114615aab57615ad8565b60ff19851660408a0152604084151560051b8a01019550615ad8565b895f5260205f205f5b85811015615acf5781548b8201860152908301908801615ab4565b8a016040019650505b509398975050505050505050565b805161529981615279565b5f8060408385031215615b02575f80fd5b82516001600160401b0380821115615b18575f80fd5b9084019060608287031215615b2b575f80fd5b615b3361574f565b82518152602080840151615b46816152f0565b82820152604084015183811115615b5b575f80fd5b80850194505087601f850112615b6f575f80fd5b83519250615b7f615830846157a7565b8381528882858701011115615b92575f80fd5b615ba1848383018488016155ab565b80604084015250819550615bb6818801615ae6565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cb957615cb9615560565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361593757615937615560565b5f60208284031215615d37575f80fd5b6126ed826154ea565b5f60208284031215615d50575f80fd5b813560ff811681146126ed575f80fd5b5f808335601e19843603018112615d75575f80fd5b8301803591506001600160401b03821115615d8e575f80fd5b6020019150368190038213156124c6575f80fd5b601f821115611fd857805f5260205f20601f840160051c81016020851015615dc75750805b601f840160051c820191505b81811015610bd6575f8155600101615dd3565b81516001600160401b03811115615dff57615dff61573b565b615e1381615e0d84546159dd565b84615da2565b602080601f831160018114615e46575f8415615e2f5750858301515b5f19600386901b1c1916600185901b178555615e9d565b5f85815260208120601f198616915b82811015615e7457888601518255948401946001909101908401615e55565b5085821015615e9157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615eb5575f80fd5b81516126ed8161527956fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516160db3803806160db83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f8e8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e61019936600461529f565b6103ec565b005b61019e6101ae3660046152da565b610890565b6101f16101c13660046152da565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152da565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615305565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615343565b610b3e565b61019e61029936600461535c565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c9366004615384565b610db3565b6101f16102dc3660046153e8565b6113e7565b6102316102ef3660046152da565b611400565b61019e61030236600461529f565b611414565b61020c603081565b61019e61031d3660046152da565b611651565b61019e61033036600461535c565b611757565b6101f1610343366004615401565b611a60565b61019e610356366004615343565b611a8c565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152da565b611c44565b61019e6103a23660046152da565b611eca565b61020c601481565b6103c26103bd3660046152da565b611fde565b6040516101fb9190615435565b6102316202a30081565b6101f16103e73660046154fc565b6120a6565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee283398151915293929190829060ff16600481111561044d5761044d615421565b600481111561045e5761045e615421565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fde565b90506002835160048111156104f9576104f9615421565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f028339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f028339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615421565b036106235786156105e4576105e183876120db565b90505b5f846060015183608001516105f99190615575565b90506106058482612377565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b9190615595565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615421565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f628339815191526020526040808220815160e0810190925280545f80516020615f2283398151915293929190829060ff1660058111156108dd576108dd615421565b60058111156108ee576108ee615421565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615421565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124ce565b6040518263ffffffff1660e01b8152600401610a0391906155ce565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a439190615595565b50505050565b5f610a5964e8d4a5100083615600565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af184846126f5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ee28339815191525f80610b578461270f565b91509150610b6482612a59565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615421565b03610bc1575f83815260088501602052604081208054919055610bbf8282612a94565b505b610bd781610bd284604001516113e7565b612b0a565b5050505050565b5f80516020615ee28339815191525f610bf684612b2d565b90505f80610c078360400151612d07565b50915091505f610c1683611fde565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b81526004016105429061561f565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615661565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615421565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f228339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb79190615595565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156aa565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156c5565b91505f9050843560208601356014610fc86060890160408a016156aa565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156c5565b8363ffffffff1681811061105e5761105e61570a565b9050602002810190611070919061571e565b611079906157ce565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b815260040161054290615865565b84825f0151836020015184604001516040516020016110ce94939291906158ad565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c91906158fc565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a9190615595565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615421565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129991168661590d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615920565b905061102c565b50600584018190555f61130986612b2d565b90505f6113198260400151612f42565b90508060028560405161132c91906158fc565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a9190615595565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615942565b5f61140a82611fde565b6080015192915050565b5f80516020615ee28339815191525f61142c856130b4565b905061143785612a59565b15610bd7575f8581526005830160205260409020546001600160a01b031633146114735760405162461bcd60e51b815260040161054290615959565b5f85815260058301602052604090205460a08201516114a291600160b01b90046001600160401b0316906159ab565b6001600160401b03168160c001516001600160401b031610156115235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153486856120db565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061158b906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611601573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116259190615595565b5f8781526008850160205260408120805490919061164490849061590d565b9091555050505050505050565b5f80516020615ee28339815191525f61166983611fde565b905060048151600581111561168057611680615421565b146116ea5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117215760405162461bcd60e51b815260040161054290615959565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612a94565b61175f61332f565b5f80516020615ee28339815191525f61177784612b2d565b90505f806117888360400151612d07565b50915091505f61179783611fde565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d1576117d1615421565b60048111156117e2576117e2615421565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118c65760405162461bcd60e51b81526004016105429061561f565b826001600160401b03168160e001516001600160401b031611156118fc5760405162461bcd60e51b815260040161054290615661565b60038151600481111561191157611911615421565b146119655760405162461bcd60e51b815260206004820152603160248201525f80516020615f028339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119a690600160a01b900461ffff1684615942565b6119b09190615600565b905080886008015f8881526020019081526020015f205f8282546119d4919061590d565b909155505060208301516119f1906119ec83856159cb565b612a94565b611a068360200151610bd285606001516113e7565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a5c60015f80516020615f4283398151915255565b5050565b5f611a6961332f565b611a74833384613379565b9050610a5960015f80516020615f4283398151915255565b5f80516020615f228339815191525f611aa483612b2d565b90505f80611ab58360400151613733565b9150915080611b175760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b31906159de565b9050118015611b63575060015f83815260088601602052604090205460ff166005811115611b6157611b61615421565b145b611b7f5760405162461bcd60e51b815260040161054290615a16565b5f8281526007850160205260408120611b97916151ef565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee283398151915293929190829060ff166004811115611ca557611ca5615421565b6004811115611cb657611cb6615421565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d3d57611d3d615421565b1480611d5b5750600381516004811115611d5957611d59615421565b145b611daf5760405162461bcd60e51b815260206004820152603260248201525f80516020615f02833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dbd8260400151611fde565b905080606001516001600160401b03165f03611e415760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e6e8460400151846060015185608001516124ce565b6040518263ffffffff1660e01b8152600401611e8a91906155ce565b6020604051808303815f875af1158015611ea6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd79190615595565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f22833981519152929190611f12906159de565b9050118015611f44575060015f83815260088301602052604090205460ff166005811115611f4257611f42615421565b145b611f605760405162461bcd60e51b815260040161054290615a16565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f999190600401615a5d565b6020604051808303815f875af1158015611fb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd99190615595565b505050565b611fe6615226565b5f8281525f80516020615f62833981519152602052604090819020815160e0810190925280545f80516020615f22833981519152929190829060ff16600581111561203357612033615421565b600581111561204457612044615421565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120af61332f565b6120bb858585856138d4565b90506120d360015f80516020615f4283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612126573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261214d9190810190615af2565b91509150806121b05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122179190615595565b82511461227b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156122f15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123008460400151613b49565b9150915081871461236d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f62833981519152602052604081206002015481905f80516020615f2283398151915290600160801b90046001600160401b03166123bf8582613d21565b5f6123c987613f2f565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124198a858b6124ce565b6040518263ffffffff1660e01b815260040161243591906155ce565b6020604051808303815f875af1158015612451573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124759190615595565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612547576125078160016159cb565b612512906008615942565b5081515f908390839081106125295761252961570a565b60200101906001600160f81b03191690815f1a9053506001016124f3565b505f5b60048110156125b25761255e8160036159cb565b612569906008615942565b600263ffffffff16901c60f81b82826002612584919061590d565b815181106125945761259461570a565b60200101906001600160f81b03191690815f1a90535060010161254a565b505f5b6020811015612614576125c981601f6159cb565b6125d4906008615942565b86901c60f81b826125e683600661590d565b815181106125f6576125f661570a565b60200101906001600160f81b03191690815f1a9053506001016125b5565b505f5b600881101561267f5761262b8160076159cb565b612636906008615942565b6001600160401b038616901c60f81b8261265183602661590d565b815181106126615761266161570a565b60200101906001600160f81b03191690815f1a905350600101612617565b505f5b60088110156126ea576126968160076159cb565b6126a1906008615942565b6001600160401b038516901c60f81b826126bc83602e61590d565b815181106126cc576126cc61570a565b60200101906001600160f81b03191690815f1a905350600101612682565b5090505b9392505050565b6126fd613fbf565b6127068261400a565b611a5c81614081565b5f612718615226565b5f80516020615f228339815191525f61273085612b2d565b90505f806127418360400151613733565b9150915080156127a65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127d7576127d7615421565b60058111156127e8576127e8615421565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561285957612859615421565b1480612877575060018251600581111561287557612875615421565b145b6128d65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b6003825160058111156128eb576128eb615421565b036128f8575060046128fc565b5060055b6020808301515f9081526009880190915260408120558181600581111561292557612925615421565b9081600581111561293857612938615421565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561296c5761296c615421565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a2057612a20615421565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ec283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612aef575f80fd5b505af1158015612b01573d5f803e3d5ffd5b50505050505050565b5f80516020615ec283398151915254611a5c906001600160a01b03168383614122565b60408051606080820183525f8083526020830181905292820152905f80516020615f228339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ba2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bc99190810190615af2565b9150915080612c295760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612c8c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612cff5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d2b5760405162461bcd60e51b815260040161054290615bc4565b5f805b6002811015612d7a57612d428160016159cb565b612d4d906008615942565b61ffff16868281518110612d6357612d6361570a565b016020015160f81c901b9190911790600101612d2e565b5061ffff811615612d9d5760405162461bcd60e51b815260040161054290615c0d565b5f805b6004811015612df857612db48160036159cb565b612dbf906008615942565b63ffffffff1687612dd183600261590d565b81518110612de157612de161570a565b016020015160f81c901b9190911790600101612da0565b5063ffffffff8116600414612e1f5760405162461bcd60e51b815260040161054290615c50565b5f805b6020811015612e7457612e3681601f6159cb565b612e41906008615942565b88612e4d83600661590d565b81518110612e5d57612e5d61570a565b016020015160f81c901b9190911790600101612e22565b505f805b6008811015612ed357612e8c8160076159cb565b612e97906008615942565b6001600160401b031689612eac83602661590d565b81518110612ebc57612ebc61570a565b016020015160f81c901b9190911790600101612e78565b505f805b6008811015612f3257612eeb8160076159cb565b612ef6906008615942565b6001600160401b03168a612f0b83602e61590d565b81518110612f1b57612f1b61570a565b016020015160f81c901b9190911790600101612ed7565b5091989097509095509350505050565b5f8151602614612f645760405162461bcd60e51b815260040161054290615bc4565b5f805b6002811015612fb357612f7b8160016159cb565b612f86906008615942565b61ffff16848281518110612f9c57612f9c61570a565b016020015160f81c901b9190911790600101612f67565b5061ffff811615612fd65760405162461bcd60e51b815260040161054290615c0d565b5f805b600481101561303157612fed8160036159cb565b612ff8906008615942565b63ffffffff168561300a83600261590d565b8151811061301a5761301a61570a565b016020015160f81c901b9190911790600101612fd9565b5063ffffffff8116156130565760405162461bcd60e51b815260040161054290615c50565b5f805b60208110156130ab5761306d81601f6159cb565b613078906008615942565b8661308483600661590d565b815181106130945761309461570a565b016020015160f81c901b9190911790600101613059565b50949350505050565b6130bc615226565b5f8281525f80516020615f628339815191526020526040808220815160e0810190925280545f80516020615f2283398151915293929190829060ff16600581111561310957613109615421565b600581111561311a5761311a615421565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561318c5761318c615421565b146131e85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561322c5761322c615421565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132d88582612377565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f4283398151915280546001190161336057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f4283398151915255565b5f5f80516020615ee28339815191528161339561022c85614181565b90505f6133a187611fde565b90506133ac87612a59565b6134095760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561341e5761341e615421565b1461347d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f82826080015161348e91906159ab565b600485015460408401519192506134b0916001600160401b0390911690615c97565b6001600160401b0316816001600160401b0316111561352f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f8061353b8a84612377565b915091505f8a8360405160200161356992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561360457613604615421565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137565760405162461bcd60e51b815260040161054290615bc4565b5f805b60028110156137a55761376d8160016159cb565b613778906008615942565b61ffff1685828151811061378e5761378e61570a565b016020015160f81c901b9190911790600101613759565b5061ffff8116156137c85760405162461bcd60e51b815260040161054290615c0d565b5f805b6004811015613823576137df8160036159cb565b6137ea906008615942565b63ffffffff16866137fc83600261590d565b8151811061380c5761380c61570a565b016020015160f81c901b91909117906001016137cb565b5063ffffffff811660031461384a5760405162461bcd60e51b815260040161054290615c50565b5f805b602081101561389f5761386181601f6159cb565b61386c906008615942565b8761387883600661590d565b815181106138885761388861570a565b016020015160f81c901b919091179060010161384d565b505f866026815181106138b4576138b461570a565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ee28339815191529061ffff861610801590613920575061271061ffff861611155b61393c5760405162461bcd60e51b815260040161054290615cc2565b60028101546001600160401b0390811690851610156139b55760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a185760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613a7f5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613a8984614181565b90505f613a9582610a49565b90505f613aa289836141a4565b90506040518060600160405280613ab63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b6c5760405162461bcd60e51b815260040161054290615bc4565b5f805b6002811015613bbb57613b838160016159cb565b613b8e906008615942565b61ffff16858281518110613ba457613ba461570a565b016020015160f81c901b9190911790600101613b6f565b5061ffff811615613bde5760405162461bcd60e51b815260040161054290615c0d565b5f805b6004811015613c3957613bf58160036159cb565b613c00906008615942565b63ffffffff1686613c1283600261590d565b81518110613c2257613c2261570a565b016020015160f81c901b9190911790600101613be1565b5063ffffffff8116600514613c605760405162461bcd60e51b815260040161054290615c50565b5f805b6020811015613cb557613c7781601f6159cb565b613c82906008615942565b87613c8e83600661590d565b81518110613c9e57613c9e61570a565b016020015160f81c901b9190911790600101613c63565b505f805b6008811015613d1457613ccd8160076159cb565b613cd8906008615942565b6001600160401b031688613ced83602661590d565b81518110613cfd57613cfd61570a565b016020015160f81c901b9190911790600101613cb9565b5090969095509350505050565b5f80516020615f228339815191525f6001600160401b038084169085161115613d5557613d4e8385615575565b9050613d62565b613d5f8484615575565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613dc4575060028401548151613dc0916001600160401b03169061590d565b8210155b15613dea576001600160401b038316606082015281815260408101516020820152613e09565b8281606001818151613dfc91906159ab565b6001600160401b03169052505b6060810151613e19906064615c97565b602082015160028601546001600160401b039290921691613e449190600160401b900460ff16615942565b1015613ea85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ec3919061590d565b9052506040810180516001600160401b0387169190613ee39083906159cb565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f628339815191526020526040812060020180545f80516020615f2283398151915291600160401b9091046001600160401b0316906008613f7983615d0d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661400857604051631afcd79f60e31b815260040160405180910390fd5b565b614012613fbf565b61401b81614709565b614023614722565b61407e608082013560a083013561404060e0850160c086016153e8565b614051610100860160e08701615d28565b61ffff1661406761012087016101008801615d41565b614079610140880161012089016156aa565b614732565b50565b614089613fbf565b5f80516020615ec28339815191526001600160a01b0382166141025760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611fd991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614976565b5f610a59825f80516020615ec2833981519152546001600160a01b0316906149d7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661422f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f228339815191524261424e60408601602087016153e8565b6001600160401b0316116142c05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142d060408501602086016153e8565b6001600160401b03166142e66202a3004261590d565b116143595760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143b15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156143e05760405162461bcd60e51b815260040161054290615865565b60306143ef6040860186615d61565b9050146144545760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b61445e835f613d21565b5f806144f86040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a391906153e8565b6001600160401b031681526020016144be60408a018a615d61565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b39565b5f828152600786016020526040902091935091506145168282615de7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145439085906004016155ce565b6020604051808303815f875af115801561455f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145839190615595565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145fb576145fb615421565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146db918e01908e016153e8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614711613fbf565b614719614ee8565b61407e81614ef0565b61472a613fbf565b614008615092565b61473a613fbf565b5f80516020615ee2833981519152836147a65760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147c85760405162461bcd60e51b815260040161054290615cc2565b858711156148305760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff161161489d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff8416111561490f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61498a6001600160a01b0384168361509a565b905080515f141580156149ae5750808060200190518101906149ac9190615ea6565b155b15611fd957604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a419190615595565b9050614a586001600160a01b0385163330866150a7565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614a9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ac09190615595565b9050818111614b265760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b3082826159cb565b95945050505050565b5f6060826080015151603014614ba35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c1a57614bda8160016159cb565b614be5906008615942565b5081515f90839083908110614bfc57614bfc61570a565b60200101906001600160f81b03191690815f1a905350600101614bc6565b505f5b6004811015614c8257614c318160036159cb565b614c3c906008615942565b600160ff919091161c60f81b82614c5483600261590d565b81518110614c6457614c6461570a565b60200101906001600160f81b03191690815f1a905350600101614c1d565b505f5b6020811015614cdf5784518160208110614ca157614ca161570a565b1a60f81b82614cb183600661590d565b81518110614cc157614cc161570a565b60200101906001600160f81b03191690815f1a905350600101614c85565b505f5b6020811015614d3f5784602001518160208110614d0157614d0161570a565b1a60f81b82614d1183602661590d565b81518110614d2157614d2161570a565b60200101906001600160f81b03191690815f1a905350600101614ce2565b505f5b6008811015614db357614d568160076159cb565b614d61906008615942565b60ff1685604001516001600160401b0316901c60f81b82826046614d85919061590d565b81518110614d9557614d9561570a565b60200101906001600160f81b03191690815f1a905350600101614d42565b505f5b6030811015614e1e5784608001518181518110614dd557614dd561570a565b01602001516001600160f81b03191682614df083604e61590d565b81518110614e0057614e0061570a565b60200101906001600160f81b03191690815f1a905350600101614db6565b505f5b6008811015614e9057614e358160076159cb565b614e40906008615942565b60608601516001600160401b0390811691161c60f81b82614e6283607e61590d565b81518110614e7257614e7261570a565b60200101906001600160f81b03191690815f1a905350600101614e21565b50600281604051614ea191906158fc565b602060405180830381855afa158015614ebc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614edf9190615595565b94909350915050565b614008613fbf565b614ef8613fbf565b80355f80516020615f2283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f446080840160608501615d41565b60ff161115614fb15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fc26080840160608501615d41565b60ff161161502a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b61503a6080830160608401615d41565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561506b60608301604084016153e8565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613366613fbf565b60606126ee83835f6150e0565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd9060840161414f565b6060814710156151055760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b0316848660405161512091906158fc565b5f6040518083038185875af1925050503d805f811461515a576040519150601f19603f3d011682016040523d82523d5f602084013e61515f565b606091505b509150915061236d86838360608261517f5761517a826151c6565b6126ee565b815115801561519657506001600160a01b0384163b155b156151bf57604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b50806126ee565b8051156151d65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151fb906159de565b5f825580601f1061520a575050565b601f0160209004905f5260205f209081019061407e9190615262565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615276575f8155600101615263565b5090565b801515811461407e575f80fd5b803563ffffffff8116811461529a575f80fd5b919050565b5f805f606084860312156152b1575f80fd5b8335925060208401356152c38161527a565b91506152d160408501615287565b90509250925092565b5f602082840312156152ea575f80fd5b5035919050565b6001600160a01b038116811461407e575f80fd5b5f80828403610160811215615318575f80fd5b61014080821215615327575f80fd5b8493508301359050615338816152f1565b809150509250929050565b5f60208284031215615353575f80fd5b6126ee82615287565b5f806040838503121561536d575f80fd5b61537683615287565b946020939093013593505050565b5f8060408385031215615395575f80fd5b82356001600160401b038111156153aa575f80fd5b8301608081860312156153bb575f80fd5b91506153c960208401615287565b90509250929050565b80356001600160401b038116811461529a575f80fd5b5f602082840312156153f8575f80fd5b6126ee826153d2565b5f8060408385031215615412575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061545857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161549360608401826001600160401b03169052565b5060808301516154ae60808401826001600160401b03169052565b5060a08301516154c960a08401826001600160401b03169052565b5060c08301516154e460c08401826001600160401b03169052565b5092915050565b803561ffff8116811461529a575f80fd5b5f805f806080858703121561550f575f80fd5b84356001600160401b03811115615524575f80fd5b850160608188031215615535575f80fd5b9350615543602086016154eb565b9250615551604086016153d2565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154e4576154e4615561565b5f602082840312156155a5575f80fd5b5051919050565b5f5b838110156155c65781810151838201526020016155ae565b50505f910152565b602081525f82518060208401526155ec8160408501602087016155ac565b601f01601f19169190910160400192915050565b5f8261561a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156ba575f80fd5b81356126ee816152f1565b5f808335601e198436030181126156da575f80fd5b8301803591506001600160401b038211156156f3575f80fd5b6020019150600581901b36038213156124c7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615732575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157725761577261573c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157a0576157a061573c565b604052919050565b5f6001600160401b038211156157c0576157c061573c565b50601f01601f191660200190565b5f606082360312156157de575f80fd5b6157e6615750565b8235815260206157f78185016153d2565b8183015260408401356001600160401b03811115615813575f80fd5b840136601f820112615823575f80fd5b8035615836615831826157a8565b615778565b8181523684838501011115615849575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158be818460208a016155ac565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158ee8160288401602088016155ac565b016028019695505050505050565b5f82516157328184602087016155ac565b80820180821115610a5957610a59615561565b5f63ffffffff80831681810361593857615938615561565b6001019392505050565b8082028115828204841417610a5957610a59615561565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156154e4576154e4615561565b81810381811115610a5957610a59615561565b600181811c908216806159f257607f821691505b602082108103615a1057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a6f816159de565b806020870152604060018084165f8114615a905760018114615aac57615ad9565b60ff19851660408a0152604084151560051b8a01019550615ad9565b895f5260205f205f5b85811015615ad05781548b8201860152908301908801615ab5565b8a016040019650505b509398975050505050505050565b805161529a8161527a565b5f8060408385031215615b03575f80fd5b82516001600160401b0380821115615b19575f80fd5b9084019060608287031215615b2c575f80fd5b615b34615750565b82518152602080840151615b47816152f1565b82820152604084015183811115615b5c575f80fd5b80850194505087601f850112615b70575f80fd5b83519250615b80615831846157a8565b8381528882858701011115615b93575f80fd5b615ba2848383018488016155ac565b80604084015250819550615bb7818801615ae7565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cba57615cba615561565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361593857615938615561565b5f60208284031215615d38575f80fd5b6126ee826154eb565b5f60208284031215615d51575f80fd5b813560ff811681146126ee575f80fd5b5f808335601e19843603018112615d76575f80fd5b8301803591506001600160401b03821115615d8f575f80fd5b6020019150368190038213156124c7575f80fd5b601f821115611fd957805f5260205f20601f840160051c81016020851015615dc85750805b601f840160051c820191505b81811015610bd7575f8155600101615dd4565b81516001600160401b03811115615e0057615e0061573c565b615e1481615e0e84546159de565b84615da3565b602080601f831160018114615e47575f8415615e305750858301515b5f19600386901b1c1916600185901b178555615e9e565b5f85815260208120601f198616915b82811015615e7557888601518255948401946001909101908401615e56565b5085821015615e9257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615eb6575f80fd5b81516126ee8161527a56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index de6df87d5..4ce5754f9 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d98380380615d9883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c4b8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004614ff9565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615034565b6109d7565b3480156101e4575f80fd5b506102236101f3366004615034565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461504b565b610b90565b348015610286575f80fd5b5061029a610295366004615034565b610c6d565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a366004615089565b610c83565b34801561032a575f80fd5b506101b86103393660046150dd565b610cb7565b348015610349575f80fd5b506101b86103583660046150f6565b610d57565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a036600461511e565b610f2c565b3480156103b0575f80fd5b506102236103bf36600461516c565b611560565b3480156103cf575f80fd5b5061029a6103de366004615034565b611579565b3480156103ee575f80fd5b506101b86103fd366004614ff9565b61158d565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615034565b6117ca565b348015610440575f80fd5b506101b861044f3660046150f6565b6118d0565b34801561045f575f80fd5b506101b861046e3660046150dd565b611bd9565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615034565b611d91565b3480156104b7575f80fd5b506101b86104c6366004615034565b612017565b6102236104d9366004615034565b61212b565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615034565b61215c565b60405161022d9190615199565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d06602052604080822060018101548251610100810190935281545f80516020615b9f833981519152949193919290829060ff16600481111561059c5761059c615185565b60048111156105ad576105ad615185565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6106298361215c565b905060028251600481111561064057610640615185565b146106925760405162461bcd60e51b815260206004820152602a60248201525f80516020615bbf8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106f75760405162461bcd60e51b815260206004820152603360248201525f80516020615bbf8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610689565b6003825280515f90600290600581111561071357610713615185565b0361076a57861561072b576107288487612224565b90505b5f836060015183608001516107409190615263565b905061074c85826124c0565b506001600160401b0390811660e0860152421660a08501525061079e565b505f83815260098501602052604090205460608201516001600160401b0390811660e085015260c0830151811660a0850152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d18560600151611560565b60a0808601516080880151918801516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108729190615283565b5f898152600787016020908152604080832093909355600688019052208351815485929190829060ff191660018360048111156108b1576108b1615185565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255840151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c5916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c1f8339815191526020526040808220815160e0810190925280545f80516020615bdf83398151915293929190829060ff166005811115610a2457610a24615185565b6005811115610a3557610a35615185565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa457610aa4615185565b14610b095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb610b2e8584606001515f612617565b6040518263ffffffff1660e01b8152600401610b4a91906152bc565b6020604051808303815f875af1158015610b66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8a9190615283565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bd9575080546001600160401b03808416911610155b15610bf75760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c218361283c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7d64e8d4a51000836152ee565b92915050565b5f610c8c612850565b610c9884848434612887565b9050610cb060015f80516020615bff83398151915255565b9392505050565b5f80516020615b9f8339815191525f80610cd084612b04565b91509150610cdd82612e4e565b610ce75750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1557610d15615185565b03610d3a575f83815260088501602052604081208054919055610d388282612e89565b505b610d5081610d4b8460400151611560565b612eef565b5050505050565b5f80516020615b9f8339815191525f610d6f84612f02565b90505f80610d8083604001516130dc565b50915091505f610d8f8361215c565b9050816001600160401b031681606001516001600160401b03161015610dc75760405162461bcd60e51b81526004016106899061530d565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0c5760405162461bcd60e51b81526004016106899061534f565b60015f87815260068701602052604090205460ff166004811115610e3257610e32615185565b14610e9b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610689565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bdf8339815191529060ff1615610fc95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110309190615283565b8360200135146110925760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610689565b306110a360608501604086016153ac565b6001600160a01b0316146111155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610689565b5f61112360608501856153c7565b91505f90508435602086013560146111416060890160408a016153ac565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611470575f6111c160608901896153c7565b8363ffffffff168181106111d7576111d761540c565b90506020028101906111e99190615420565b6111f2906154d0565b80515f81815260098901602052604090205491925090156112255760405162461bcd60e51b815260040161068990615567565b84825f01518360200151846040015160405160200161124794939291906155af565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161129591906155fe565b602060405180830381855afa1580156112b0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d39190615283565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561135f5761135f615185565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161141291168661560f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146990615622565b90506111a5565b50600584018190555f61148286612f02565b90505f6114928260400151613317565b9050806002856040516114a591906155fe565b602060405180830381855afa1580156114c0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e39190615283565b146115475760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610689565b505050600a909201805460ff1916600117905550505050565b5f610c7d6001600160401b03831664e8d4a51000615644565b5f6115838261215c565b6080015192915050565b5f80516020615b9f8339815191525f6115a585613480565b90506115b085612e4e565b15610d50575f8581526005830160205260409020546001600160a01b031633146115ec5760405162461bcd60e51b81526004016106899061565b565b5f85815260058301602052604090205460a082015161161b91600160b01b90046001600160401b0316906156ad565b6001600160401b03168160c001516001600160401b0316101561169c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610689565b8315610d50575f6116ad8685612224565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170490611560565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561177a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179e9190615283565b5f878152600885016020526040812080549091906117bd90849061560f565b9091555050505050505050565b5f80516020615b9f8339815191525f6117e28361215c565b90506004815160058111156117f9576117f9615185565b146118635760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610689565b5f8381526005830160205260409020546001600160a01b0316331461189a5760405162461bcd60e51b81526004016106899061565b565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8a906001600160a01b031682612e89565b6118d8612850565b5f80516020615b9f8339815191525f6118f084612f02565b90505f8061190183604001516130dc565b50915091505f6119108361215c565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561194a5761194a615185565b600481111561195b5761195b615185565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a3f5760405162461bcd60e51b81526004016106899061530d565b826001600160401b03168160e001516001600160401b03161115611a755760405162461bcd60e51b81526004016106899061534f565b600381516004811115611a8a57611a8a615185565b14611ade5760405162461bcd60e51b815260206004820152603160248201525f80516020615bbf8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610689565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b1f90600160a01b900461ffff1684615644565b611b2991906152ee565b905080886008015f8881526020019081526020015f205f828254611b4d919061560f565b90915550506020830151611b6a90611b6583856156cd565b612e89565b611b7f8360200151610d4b8560600151611560565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bd560015f80516020615bff83398151915255565b5050565b5f80516020615bdf8339815191525f611bf183612f02565b90505f80611c0283604001516136fb565b9150915080611c645760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610689565b5f82815260078501602052604081208054611c7e906156e0565b9050118015611cb0575060015f83815260088601602052604090205460ff166005811115611cae57611cae615185565b145b611ccc5760405162461bcd60e51b815260040161068990615712565b5f8281526007850160205260408120611ce491614f4e565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b9f83398151915293929190829060ff166004811115611df257611df2615185565b6004811115611e0357611e03615185565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e8a57611e8a615185565b1480611ea85750600381516004811115611ea657611ea6615185565b145b611efc5760405162461bcd60e51b815260206004820152603260248201525f80516020615bbf833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610689565b5f611f0a826040015161215c565b905080606001516001600160401b03165f03611f8e5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610689565b6005600160991b016001600160a01b031663ee5b48eb611fbb846040015184606001518560800151612617565b6040518263ffffffff1660e01b8152600401611fd791906152bc565b6020604051808303815f875af1158015611ff3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d509190615283565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bdf83398151915292919061205f906156e0565b9050118015612091575060015f83815260088301602052604090205460ff16600581111561208f5761208f615185565b145b6120ad5760405162461bcd60e51b815260040161068990615712565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120e69190600401615759565b6020604051808303815f875af1158015612102573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121269190615283565b505050565b5f612134612850565b61213f82333461389c565b905061215760015f80516020615bff83398151915255565b919050565b612164614f85565b5f8281525f80516020615c1f833981519152602052604090819020815160e0810190925280545f80516020615bdf833981519152929190829060ff1660058111156121b1576121b1615185565b60058111156121c2576121c2615185565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561226f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229691908101906157ee565b91509150806122f95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610689565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561233c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123609190615283565b8251146123c45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610689565b60208201516001600160a01b03161561243a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610689565b5f806124498460400151613c53565b915091508187146124b65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610689565b9695505050505050565b5f8281525f80516020615c1f833981519152602052604081206002015481905f80516020615bdf83398151915290600160801b90046001600160401b03166125088582613e2b565b5f61251287614039565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125628a858b612617565b6040518263ffffffff1660e01b815260040161257e91906152bc565b6020604051808303815f875af115801561259a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125be9190615283565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612690576126508160016156cd565b61265b906008615644565b5081515f908390839081106126725761267261540c565b60200101906001600160f81b03191690815f1a90535060010161263c565b505f5b60048110156126fb576126a78160036156cd565b6126b2906008615644565b600263ffffffff16901c60f81b828260026126cd919061560f565b815181106126dd576126dd61540c565b60200101906001600160f81b03191690815f1a905350600101612693565b505f5b602081101561275d5761271281601f6156cd565b61271d906008615644565b86901c60f81b8261272f83600661560f565b8151811061273f5761273f61540c565b60200101906001600160f81b03191690815f1a9053506001016126fe565b505f5b60088110156127c8576127748160076156cd565b61277f906008615644565b6001600160401b038616901c60f81b8261279a83602661560f565b815181106127aa576127aa61540c565b60200101906001600160f81b03191690815f1a905350600101612760565b505f5b6008811015612833576127df8160076156cd565b6127ea906008615644565b6001600160401b038516901c60f81b8261280583602e61560f565b815181106128155761281561540c565b60200101906001600160f81b03191690815f1a9053506001016127cb565b50949350505050565b6128446140c9565b61284d81614114565b50565b5f80516020615bff83398151915280546001190161288157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b9f8339815191529061ffff8616108015906128d3575061271061ffff861611155b6128ef5760405162461bcd60e51b8152600401610689906158c0565b60028101546001600160401b0390811690851610156129685760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610689565b80548310156129cb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610689565b8060010154831115612a325760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610689565b825f612a3d82610c6d565b90505f612a4a8983614188565b90506040518060600160405280612a5e3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bff83398151915255565b5f612b0d614f85565b5f80516020615bdf8339815191525f612b2585612f02565b90505f80612b3683604001516136fb565b915091508015612b9b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610689565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bcc57612bcc615185565b6005811115612bdd57612bdd615185565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c4e57612c4e615185565b1480612c6c5750600182516005811115612c6a57612c6a615185565b145b612ccb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610689565b600382516005811115612ce057612ce0615185565b03612ced57506004612cf1565b5060055b6020808301515f90815260098801909152604081205581816005811115612d1a57612d1a615185565b90816005811115612d2d57612d2d615185565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d6157612d61615185565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e1557612e15615185565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ed5575f80fd5b505af1158015612ee7573d5f803e3d5ffd5b505050505050565b611bd56001600160a01b038316826146ed565b60408051606080820183525f8083526020830181905292820152905f80516020615bdf8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f77573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f9e91908101906157ee565b9150915080612ffe5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610689565b82548251146130615760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610689565b60208201516001600160a01b0316156130d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610689565b509392505050565b5f805f83516036146131005760405162461bcd60e51b81526004016106899061590b565b5f805b600281101561314f576131178160016156cd565b613122906008615644565b61ffff168682815181106131385761313861540c565b016020015160f81c901b9190911790600101613103565b5061ffff8116156131725760405162461bcd60e51b815260040161068990615954565b5f805b60048110156131cd576131898160036156cd565b613194906008615644565b63ffffffff16876131a683600261560f565b815181106131b6576131b661540c565b016020015160f81c901b9190911790600101613175565b5063ffffffff81166004146131f45760405162461bcd60e51b815260040161068990615997565b5f805b60208110156132495761320b81601f6156cd565b613216906008615644565b8861322283600661560f565b815181106132325761323261540c565b016020015160f81c901b91909117906001016131f7565b505f805b60088110156132a8576132618160076156cd565b61326c906008615644565b6001600160401b03168961328183602661560f565b815181106132915761329161540c565b016020015160f81c901b919091179060010161324d565b505f805b6008811015613307576132c08160076156cd565b6132cb906008615644565b6001600160401b03168a6132e083602e61560f565b815181106132f0576132f061540c565b016020015160f81c901b91909117906001016132ac565b5091989097509095509350505050565b5f81516026146133395760405162461bcd60e51b81526004016106899061590b565b5f805b6002811015613388576133508160016156cd565b61335b906008615644565b61ffff168482815181106133715761337161540c565b016020015160f81c901b919091179060010161333c565b5061ffff8116156133ab5760405162461bcd60e51b815260040161068990615954565b5f805b6004811015613406576133c28160036156cd565b6133cd906008615644565b63ffffffff16856133df83600261560f565b815181106133ef576133ef61540c565b016020015160f81c901b91909117906001016133ae565b5063ffffffff81161561342b5760405162461bcd60e51b815260040161068990615997565b5f805b60208110156128335761344281601f6156cd565b61344d906008615644565b8661345983600661560f565b815181106134695761346961540c565b016020015160f81c901b919091179060010161342e565b613488614f85565b5f8281525f80516020615c1f8339815191526020526040808220815160e0810190925280545f80516020615bdf83398151915293929190829060ff1660058111156134d5576134d5615185565b60058111156134e6576134e6615185565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561355857613558615185565b146135b45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610689565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156135f8576135f8615185565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136a485826124c0565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461371e5760405162461bcd60e51b81526004016106899061590b565b5f805b600281101561376d576137358160016156cd565b613740906008615644565b61ffff168582815181106137565761375661540c565b016020015160f81c901b9190911790600101613721565b5061ffff8116156137905760405162461bcd60e51b815260040161068990615954565b5f805b60048110156137eb576137a78160036156cd565b6137b2906008615644565b63ffffffff16866137c483600261560f565b815181106137d4576137d461540c565b016020015160f81c901b9190911790600101613793565b5063ffffffff81166003146138125760405162461bcd60e51b815260040161068990615997565b5f805b60208110156138675761382981601f6156cd565b613834906008615644565b8761384083600661560f565b815181106138505761385061540c565b016020015160f81c901b9190911790600101613815565b505f8660268151811061387c5761387c61540c565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b9f833981519152816138b584610c6d565b90505f6138c18761215c565b90506138cc87612e4e565b6139295760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610689565b60028151600581111561393e5761393e615185565b1461399d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610689565b5f8282608001516139ae91906156ad565b600485015460408401519192506139d0916001600160401b03909116906159de565b6001600160401b0316816001600160401b03161115613a4f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610689565b5f80613a5b8a846124c0565b915091505f8a83604051602001613a8992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b2457613b24615185565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c765760405162461bcd60e51b81526004016106899061590b565b5f805b6002811015613cc557613c8d8160016156cd565b613c98906008615644565b61ffff16858281518110613cae57613cae61540c565b016020015160f81c901b9190911790600101613c79565b5061ffff811615613ce85760405162461bcd60e51b815260040161068990615954565b5f805b6004811015613d4357613cff8160036156cd565b613d0a906008615644565b63ffffffff1686613d1c83600261560f565b81518110613d2c57613d2c61540c565b016020015160f81c901b9190911790600101613ceb565b5063ffffffff8116600514613d6a5760405162461bcd60e51b815260040161068990615997565b5f805b6020811015613dbf57613d8181601f6156cd565b613d8c906008615644565b87613d9883600661560f565b81518110613da857613da861540c565b016020015160f81c901b9190911790600101613d6d565b505f805b6008811015613e1e57613dd78160076156cd565b613de2906008615644565b6001600160401b031688613df783602661560f565b81518110613e0757613e0761540c565b016020015160f81c901b9190911790600101613dc3565b5090969095509350505050565b5f80516020615bdf8339815191525f6001600160401b038084169085161115613e5f57613e588385615263565b9050613e6c565b613e698484615263565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ece575060028401548151613eca916001600160401b03169061560f565b8210155b15613ef4576001600160401b038316606082015281815260408101516020820152613f13565b8281606001818151613f0691906156ad565b6001600160401b03169052505b6060810151613f239060646159de565b602082015160028601546001600160401b039290921691613f4e9190600160401b900460ff16615644565b1015613fb25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610689565b856001600160401b031681604001818151613fcd919061560f565b9052506040810180516001600160401b0387169190613fed9083906156cd565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c1f8339815191526020526040812060020180545f80516020615bdf83398151915291600160401b9091046001600160401b031690600861408383615a09565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661411257604051631afcd79f60e31b815260040160405180910390fd5b565b61411c6140c9565b61412581614780565b61412d614799565b61284d608082013560a083013561414a60e0850160c0860161516c565b61415b610100860160e08701615a24565b61ffff1661417161012087016101008801615a3d565b614183610140880161012089016153ac565b6147a9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142135760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610689565b5f80516020615bdf83398151915242614232604086016020870161516c565b6001600160401b0316116142a45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610689565b6142b4604085016020860161516c565b6001600160401b03166142ca6202a3004261560f565b1161433d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610689565b83356143955760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610689565b83355f908152600982016020526040902054156143c45760405162461bcd60e51b815260040161068990615567565b60306143d36040860186615a5d565b9050146144385760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610689565b614442835f613e2b565b5f806144dc6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614487919061516c565b6001600160401b031681526020016144a260408a018a615a5d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149ed565b5f828152600786016020526040902091935091506144fa8282615ae3565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145279085906004016152bc565b6020604051808303815f875af1158015614543573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145679190615283565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145df576145df615185565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146bf918e01908e0161516c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147105760405163cd78605960e01b8152306004820152602401610689565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614759576040519150601f19603f3d011682016040523d82523d5f602084013e61475e565b606091505b505090508061212657604051630a12f52160e11b815260040160405180910390fd5b6147886140c9565b614790614d9c565b61284d81614da4565b6147a16140c9565b614112614f46565b6147b16140c9565b5f80516020615b9f8339815191528361481d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610689565b61271084111561483f5760405162461bcd60e51b8152600401610689906158c0565b858711156148a75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610689565b5f8360ff16116149145760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610689565b600a60ff841611156149865760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610689565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a575760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610689565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ace57614a8e8160016156cd565b614a99906008615644565b5081515f90839083908110614ab057614ab061540c565b60200101906001600160f81b03191690815f1a905350600101614a7a565b505f5b6004811015614b3657614ae58160036156cd565b614af0906008615644565b600160ff919091161c60f81b82614b0883600261560f565b81518110614b1857614b1861540c565b60200101906001600160f81b03191690815f1a905350600101614ad1565b505f5b6020811015614b935784518160208110614b5557614b5561540c565b1a60f81b82614b6583600661560f565b81518110614b7557614b7561540c565b60200101906001600160f81b03191690815f1a905350600101614b39565b505f5b6020811015614bf35784602001518160208110614bb557614bb561540c565b1a60f81b82614bc583602661560f565b81518110614bd557614bd561540c565b60200101906001600160f81b03191690815f1a905350600101614b96565b505f5b6008811015614c6757614c0a8160076156cd565b614c15906008615644565b60ff1685604001516001600160401b0316901c60f81b82826046614c39919061560f565b81518110614c4957614c4961540c565b60200101906001600160f81b03191690815f1a905350600101614bf6565b505f5b6030811015614cd25784608001518181518110614c8957614c8961540c565b01602001516001600160f81b03191682614ca483604e61560f565b81518110614cb457614cb461540c565b60200101906001600160f81b03191690815f1a905350600101614c6a565b505f5b6008811015614d4457614ce98160076156cd565b614cf4906008615644565b60608601516001600160401b0390811691161c60f81b82614d1683607e61560f565b81518110614d2657614d2661540c565b60200101906001600160f81b03191690815f1a905350600101614cd5565b50600281604051614d5591906155fe565b602060405180830381855afa158015614d70573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d939190615283565b94909350915050565b6141126140c9565b614dac6140c9565b80355f80516020615bdf83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614df86080840160608501615a3d565b60ff161115614e655760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610689565b5f614e766080840160608501615a3d565b60ff1611614ede5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610689565b614eee6080830160608401615a3d565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f1f606083016040840161516c565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612af16140c9565b508054614f5a906156e0565b5f825580601f10614f69575050565b601f0160209004905f5260205f209081019061284d9190614fc1565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fd5575f8155600101614fc2565b5090565b801515811461284d575f80fd5b803563ffffffff81168114612157575f80fd5b5f805f6060848603121561500b575f80fd5b83359250602084013561501d81614fd9565b915061502b60408501614fe6565b90509250925092565b5f60208284031215615044575f80fd5b5035919050565b5f610140828403121561505c575f80fd5b50919050565b803561ffff81168114612157575f80fd5b80356001600160401b0381168114612157575f80fd5b5f805f6060848603121561509b575f80fd5b83356001600160401b038111156150b0575f80fd5b8401606081870312156150c1575f80fd5b92506150cf60208501615062565b915061502b60408501615073565b5f602082840312156150ed575f80fd5b610cb082614fe6565b5f8060408385031215615107575f80fd5b61511083614fe6565b946020939093013593505050565b5f806040838503121561512f575f80fd5b82356001600160401b03811115615144575f80fd5b830160808186031215615155575f80fd5b915061516360208401614fe6565b90509250929050565b5f6020828403121561517c575f80fd5b610cb082615073565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151bc57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151f760608401826001600160401b03169052565b50608083015161521260808401826001600160401b03169052565b5060a083015161522d60a08401826001600160401b03169052565b5060c083015161524860c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156152485761524861524f565b5f60208284031215615293575f80fd5b5051919050565b5f5b838110156152b457818101518382015260200161529c565b50505f910152565b602081525f82518060208401526152da81604085016020870161529a565b601f01601f19169190910160400192915050565b5f8261530857634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461284d575f80fd5b5f602082840312156153bc575f80fd5b8135610cb081615398565b5f808335601e198436030181126153dc575f80fd5b8301803591506001600160401b038211156153f5575f80fd5b6020019150600581901b3603821315612610575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615434575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154745761547461543e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154a2576154a261543e565b604052919050565b5f6001600160401b038211156154c2576154c261543e565b50601f01601f191660200190565b5f606082360312156154e0575f80fd5b6154e8615452565b8235815260206154f9818501615073565b8183015260408401356001600160401b03811115615515575f80fd5b840136601f820112615525575f80fd5b8035615538615533826154aa565b61547a565b818152368483850101111561554b575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155c0818460208a0161529a565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155f081602884016020880161529a565b016028019695505050505050565b5f825161543481846020870161529a565b80820180821115610c7d57610c7d61524f565b5f63ffffffff80831681810361563a5761563a61524f565b6001019392505050565b8082028115828204841417610c7d57610c7d61524f565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156152485761524861524f565b81810381811115610c7d57610c7d61524f565b600181811c908216806156f457607f821691505b60208210810361505c57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461576b816156e0565b806020870152604060018084165f811461578c57600181146157a8576157d5565b60ff19851660408a0152604084151560051b8a010195506157d5565b895f5260205f205f5b858110156157cc5781548b82018601529083019088016157b1565b8a016040019650505b509398975050505050505050565b805161215781614fd9565b5f80604083850312156157ff575f80fd5b82516001600160401b0380821115615815575f80fd5b9084019060608287031215615828575f80fd5b615830615452565b8251815260208084015161584381615398565b82820152604084015183811115615858575f80fd5b80850194505087601f85011261586c575f80fd5b8351925061587c615533846154aa565b838152888285870101111561588f575f80fd5b61589e8483830184880161529a565b806040840152508195506158b38188016157e3565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0157615a0161524f565b505092915050565b5f6001600160401b0380831681810361563a5761563a61524f565b5f60208284031215615a34575f80fd5b610cb082615062565b5f60208284031215615a4d575f80fd5b813560ff81168114610cb0575f80fd5b5f808335601e19843603018112615a72575f80fd5b8301803591506001600160401b03821115615a8b575f80fd5b602001915036819003821315612610575f80fd5b601f82111561212657805f5260205f20601f840160051c81016020851015615ac45750805b601f840160051c820191505b81811015610d50575f8155600101615ad0565b81516001600160401b03811115615afc57615afc61543e565b615b1081615b0a84546156e0565b84615a9f565b602080601f831160018114615b43575f8415615b2c5750858301515b5f19600386901b1c1916600185901b178555612ee7565b5f85815260208120601f198616915b82811015615b7157888601518255948401946001909101908401615b52565b5085821015615b8e57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d99380380615d9983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c4c8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004614ffa565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615035565b6109d8565b3480156101e4575f80fd5b506102236101f3366004615035565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461504c565b610b91565b348015610286575f80fd5b5061029a610295366004615035565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a36600461508a565b610c84565b34801561032a575f80fd5b506101b86103393660046150de565b610cb8565b348015610349575f80fd5b506101b86103583660046150f7565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a036600461511f565b610f2d565b3480156103b0575f80fd5b506102236103bf36600461516d565b611561565b3480156103cf575f80fd5b5061029a6103de366004615035565b61157a565b3480156103ee575f80fd5b506101b86103fd366004614ffa565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615035565b6117cb565b348015610440575f80fd5b506101b861044f3660046150f7565b6118d1565b34801561045f575f80fd5b506101b861046e3660046150de565b611bda565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615035565b611d92565b3480156104b7575f80fd5b506101b86104c6366004615035565b612018565b6102236104d9366004615035565b61212c565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615035565b61215d565b60405161022d919061519a565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba083398151915293929190829060ff16600481111561059557610595615186565b60048111156105a6576105a6615186565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a8261215d565b905060028351600481111561064157610641615186565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615bc08339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615bc08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f90600290600581111561071457610714615186565b0361076b57861561072c576107298387612225565b90505b5f846060015183608001516107419190615264565b905061074d84826124c1565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108739190615284565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b2615186565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c208339815191526020526040808220815160e0810190925280545f80516020615be083398151915293929190829060ff166005811115610a2557610a25615186565b6005811115610a3657610a36615186565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa5615186565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f612618565b6040518263ffffffff1660e01b8152600401610b4b91906152bd565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b9190615284565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c228361283d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a51000836152ef565b92915050565b5f610c8d612851565b610c9984848434612888565b9050610cb160015f80516020615c0083398151915255565b9392505050565b5f80516020615ba08339815191525f80610cd184612b05565b91509150610cde82612e4f565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d16615186565b03610d3b575f83815260088501602052604081208054919055610d398282612e8a565b505b610d5181610d4c8460400151611561565b612ef0565b5050505050565b5f80516020615ba08339815191525f610d7084612f03565b90505f80610d8183604001516130dd565b50915091505f610d908361215d565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a9061530e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615350565b60015f87815260068701602052604090205460ff166004811115610e3357610e33615186565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615be08339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110319190615284565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153ad565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153c8565b91505f90508435602086013560146111426060890160408a016153ad565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153c8565b8363ffffffff168181106111d8576111d861540d565b90506020028101906111ea9190615421565b6111f3906154d1565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a90615568565b84825f01518360200151846040015160405160200161124894939291906155b0565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161129691906155ff565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d49190615284565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561136057611360615186565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615610565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615623565b90506111a6565b50600584018190555f61148386612f03565b90505f6114938260400151613318565b9050806002856040516114a691906155ff565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e49190615284565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a51000615645565b5f6115848261215d565b6080015192915050565b5f80516020615ba08339815191525f6115a685613481565b90506115b185612e4f565b15610d51575f8581526005830160205260409020546001600160a01b031633146115ed5760405162461bcd60e51b815260040161068a9061565c565b5f85815260058301602052604090205460a082015161161c91600160b01b90046001600160401b0316906156ae565b6001600160401b03168160c001516001600160401b0316101561169d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116ae8685612225565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170590611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561177b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179f9190615284565b5f878152600885016020526040812080549091906117be908490615610565b9091555050505050505050565b5f80516020615ba08339815191525f6117e38361215d565b90506004815160058111156117fa576117fa615186565b146118645760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b0316331461189b5760405162461bcd60e51b815260040161068a9061565c565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612e8a565b6118d9612851565b5f80516020615ba08339815191525f6118f184612f03565b90505f8061190283604001516130dd565b50915091505f6119118361215d565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561194b5761194b615186565b600481111561195c5761195c615186565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a405760405162461bcd60e51b815260040161068a9061530e565b826001600160401b03168160e001516001600160401b03161115611a765760405162461bcd60e51b815260040161068a90615350565b600381516004811115611a8b57611a8b615186565b14611adf5760405162461bcd60e51b815260206004820152603160248201525f80516020615bc08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2090600160a01b900461ffff1684615645565b611b2a91906152ef565b905080886008015f8881526020019081526020015f205f828254611b4e9190615610565b90915550506020830151611b6b90611b6683856156ce565b612e8a565b611b808360200151610d4c8560600151611561565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bd660015f80516020615c0083398151915255565b5050565b5f80516020615be08339815191525f611bf283612f03565b90505f80611c0383604001516136fc565b9150915080611c655760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611c7f906156e1565b9050118015611cb1575060015f83815260088601602052604090205460ff166005811115611caf57611caf615186565b145b611ccd5760405162461bcd60e51b815260040161068a90615713565b5f8281526007850160205260408120611ce591614f4f565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba083398151915293929190829060ff166004811115611df357611df3615186565b6004811115611e0457611e04615186565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e8b57611e8b615186565b1480611ea95750600381516004811115611ea757611ea7615186565b145b611efd5760405162461bcd60e51b815260206004820152603260248201525f80516020615bc0833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f0b826040015161215d565b905080606001516001600160401b03165f03611f8f5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fbc846040015184606001518560800151612618565b6040518263ffffffff1660e01b8152600401611fd891906152bd565b6020604051808303815f875af1158015611ff4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d519190615284565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615be0833981519152929190612060906156e1565b9050118015612092575060015f83815260088301602052604090205460ff16600581111561209057612090615186565b145b6120ae5760405162461bcd60e51b815260040161068a90615713565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120e7919060040161575a565b6020604051808303815f875af1158015612103573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121279190615284565b505050565b5f612135612851565b61214082333461389d565b905061215860015f80516020615c0083398151915255565b919050565b612165614f86565b5f8281525f80516020615c20833981519152602052604090819020815160e0810190925280545f80516020615be0833981519152929190829060ff1660058111156121b2576121b2615186565b60058111156121c3576121c3615186565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612270573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229791908101906157ef565b91509150806122fa5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561233d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123619190615284565b8251146123c55760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b03161561243b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f8061244a8460400151613c54565b915091508187146124b75760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c20833981519152602052604081206002015481905f80516020615be083398151915290600160801b90046001600160401b03166125098582613e2c565b5f6125138761403a565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125638a858b612618565b6040518263ffffffff1660e01b815260040161257f91906152bd565b6020604051808303815f875af115801561259b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125bf9190615284565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612691576126518160016156ce565b61265c906008615645565b5081515f908390839081106126735761267361540d565b60200101906001600160f81b03191690815f1a90535060010161263d565b505f5b60048110156126fc576126a88160036156ce565b6126b3906008615645565b600263ffffffff16901c60f81b828260026126ce9190615610565b815181106126de576126de61540d565b60200101906001600160f81b03191690815f1a905350600101612694565b505f5b602081101561275e5761271381601f6156ce565b61271e906008615645565b86901c60f81b82612730836006615610565b815181106127405761274061540d565b60200101906001600160f81b03191690815f1a9053506001016126ff565b505f5b60088110156127c9576127758160076156ce565b612780906008615645565b6001600160401b038616901c60f81b8261279b836026615610565b815181106127ab576127ab61540d565b60200101906001600160f81b03191690815f1a905350600101612761565b505f5b6008811015612834576127e08160076156ce565b6127eb906008615645565b6001600160401b038516901c60f81b8261280683602e615610565b815181106128165761281661540d565b60200101906001600160f81b03191690815f1a9053506001016127cc565b50949350505050565b6128456140ca565b61284e81614115565b50565b5f80516020615c0083398151915280546001190161288257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ba08339815191529061ffff8616108015906128d4575061271061ffff861611155b6128f05760405162461bcd60e51b815260040161068a906158c1565b60028101546001600160401b0390811690851610156129695760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129cc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a335760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a3e82610c6e565b90505f612a4b8983614189565b90506040518060600160405280612a5f3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c0083398151915255565b5f612b0e614f86565b5f80516020615be08339815191525f612b2685612f03565b90505f80612b3783604001516136fc565b915091508015612b9c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bcd57612bcd615186565b6005811115612bde57612bde615186565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c4f57612c4f615186565b1480612c6d5750600182516005811115612c6b57612c6b615186565b145b612ccc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612ce157612ce1615186565b03612cee57506004612cf2565b5060055b6020808301515f90815260098801909152604081205581816005811115612d1b57612d1b615186565b90816005811115612d2e57612d2e615186565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d6257612d62615186565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e1657612e16615186565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ed6575f80fd5b505af1158015612ee8573d5f803e3d5ffd5b505050505050565b611bd66001600160a01b038316826146ee565b60408051606080820183525f8083526020830181905292820152905f80516020615be08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f78573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f9f91908101906157ef565b9150915080612fff5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130625760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130d55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131015760405162461bcd60e51b815260040161068a9061590c565b5f805b6002811015613150576131188160016156ce565b613123906008615645565b61ffff168682815181106131395761313961540d565b016020015160f81c901b9190911790600101613104565b5061ffff8116156131735760405162461bcd60e51b815260040161068a90615955565b5f805b60048110156131ce5761318a8160036156ce565b613195906008615645565b63ffffffff16876131a7836002615610565b815181106131b7576131b761540d565b016020015160f81c901b9190911790600101613176565b5063ffffffff81166004146131f55760405162461bcd60e51b815260040161068a90615998565b5f805b602081101561324a5761320c81601f6156ce565b613217906008615645565b88613223836006615610565b815181106132335761323361540d565b016020015160f81c901b91909117906001016131f8565b505f805b60088110156132a9576132628160076156ce565b61326d906008615645565b6001600160401b031689613282836026615610565b815181106132925761329261540d565b016020015160f81c901b919091179060010161324e565b505f805b6008811015613308576132c18160076156ce565b6132cc906008615645565b6001600160401b03168a6132e183602e615610565b815181106132f1576132f161540d565b016020015160f81c901b91909117906001016132ad565b5091989097509095509350505050565b5f815160261461333a5760405162461bcd60e51b815260040161068a9061590c565b5f805b6002811015613389576133518160016156ce565b61335c906008615645565b61ffff168482815181106133725761337261540d565b016020015160f81c901b919091179060010161333d565b5061ffff8116156133ac5760405162461bcd60e51b815260040161068a90615955565b5f805b6004811015613407576133c38160036156ce565b6133ce906008615645565b63ffffffff16856133e0836002615610565b815181106133f0576133f061540d565b016020015160f81c901b91909117906001016133af565b5063ffffffff81161561342c5760405162461bcd60e51b815260040161068a90615998565b5f805b60208110156128345761344381601f6156ce565b61344e906008615645565b8661345a836006615610565b8151811061346a5761346a61540d565b016020015160f81c901b919091179060010161342f565b613489614f86565b5f8281525f80516020615c208339815191526020526040808220815160e0810190925280545f80516020615be083398151915293929190829060ff1660058111156134d6576134d6615186565b60058111156134e7576134e7615186565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561355957613559615186565b146135b55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156135f9576135f9615186565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136a585826124c1565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461371f5760405162461bcd60e51b815260040161068a9061590c565b5f805b600281101561376e576137368160016156ce565b613741906008615645565b61ffff168582815181106137575761375761540d565b016020015160f81c901b9190911790600101613722565b5061ffff8116156137915760405162461bcd60e51b815260040161068a90615955565b5f805b60048110156137ec576137a88160036156ce565b6137b3906008615645565b63ffffffff16866137c5836002615610565b815181106137d5576137d561540d565b016020015160f81c901b9190911790600101613794565b5063ffffffff81166003146138135760405162461bcd60e51b815260040161068a90615998565b5f805b60208110156138685761382a81601f6156ce565b613835906008615645565b87613841836006615610565b815181106138515761385161540d565b016020015160f81c901b9190911790600101613816565b505f8660268151811061387d5761387d61540d565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ba0833981519152816138b684610c6e565b90505f6138c28761215d565b90506138cd87612e4f565b61392a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b60028151600581111561393f5761393f615186565b1461399e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139af91906156ae565b600485015460408401519192506139d1916001600160401b03909116906159df565b6001600160401b0316816001600160401b03161115613a505760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a5c8a846124c1565b915091505f8a83604051602001613a8a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b2557613b25615186565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c775760405162461bcd60e51b815260040161068a9061590c565b5f805b6002811015613cc657613c8e8160016156ce565b613c99906008615645565b61ffff16858281518110613caf57613caf61540d565b016020015160f81c901b9190911790600101613c7a565b5061ffff811615613ce95760405162461bcd60e51b815260040161068a90615955565b5f805b6004811015613d4457613d008160036156ce565b613d0b906008615645565b63ffffffff1686613d1d836002615610565b81518110613d2d57613d2d61540d565b016020015160f81c901b9190911790600101613cec565b5063ffffffff8116600514613d6b5760405162461bcd60e51b815260040161068a90615998565b5f805b6020811015613dc057613d8281601f6156ce565b613d8d906008615645565b87613d99836006615610565b81518110613da957613da961540d565b016020015160f81c901b9190911790600101613d6e565b505f805b6008811015613e1f57613dd88160076156ce565b613de3906008615645565b6001600160401b031688613df8836026615610565b81518110613e0857613e0861540d565b016020015160f81c901b9190911790600101613dc4565b5090969095509350505050565b5f80516020615be08339815191525f6001600160401b038084169085161115613e6057613e598385615264565b9050613e6d565b613e6a8484615264565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ecf575060028401548151613ecb916001600160401b031690615610565b8210155b15613ef5576001600160401b038316606082015281815260408101516020820152613f14565b8281606001818151613f0791906156ae565b6001600160401b03169052505b6060810151613f249060646159df565b602082015160028601546001600160401b039290921691613f4f9190600160401b900460ff16615645565b1015613fb35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fce9190615610565b9052506040810180516001600160401b0387169190613fee9083906156ce565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c208339815191526020526040812060020180545f80516020615be083398151915291600160401b9091046001600160401b031690600861408483615a0a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661411357604051631afcd79f60e31b815260040160405180910390fd5b565b61411d6140ca565b61412681614781565b61412e61479a565b61284e608082013560a083013561414b60e0850160c0860161516d565b61415c610100860160e08701615a25565b61ffff1661417261012087016101008801615a3e565b614184610140880161012089016153ad565b6147aa565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142145760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615be083398151915242614233604086016020870161516d565b6001600160401b0316116142a55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142b5604085016020860161516d565b6001600160401b03166142cb6202a30042615610565b1161433e5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b83356143965760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143c55760405162461bcd60e51b815260040161068a90615568565b60306143d46040860186615a5e565b9050146144395760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614443835f613e2c565b5f806144dd6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614488919061516d565b6001600160401b031681526020016144a360408a018a615a5e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149ee565b5f828152600786016020526040902091935091506144fb8282615ae4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145289085906004016152bd565b6020604051808303815f875af1158015614544573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145689190615284565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145e0576145e0615186565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146c0918e01908e0161516d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147115760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461475a576040519150601f19603f3d011682016040523d82523d5f602084013e61475f565b606091505b505090508061212757604051630a12f52160e11b815260040160405180910390fd5b6147896140ca565b614791614d9d565b61284e81614da5565b6147a26140ca565b614113614f47565b6147b26140ca565b5f80516020615ba08339815191528361481e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148405760405162461bcd60e51b815260040161068a906158c1565b858711156148a85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff16116149155760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff841611156149875760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a585760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614acf57614a8f8160016156ce565b614a9a906008615645565b5081515f90839083908110614ab157614ab161540d565b60200101906001600160f81b03191690815f1a905350600101614a7b565b505f5b6004811015614b3757614ae68160036156ce565b614af1906008615645565b600160ff919091161c60f81b82614b09836002615610565b81518110614b1957614b1961540d565b60200101906001600160f81b03191690815f1a905350600101614ad2565b505f5b6020811015614b945784518160208110614b5657614b5661540d565b1a60f81b82614b66836006615610565b81518110614b7657614b7661540d565b60200101906001600160f81b03191690815f1a905350600101614b3a565b505f5b6020811015614bf45784602001518160208110614bb657614bb661540d565b1a60f81b82614bc6836026615610565b81518110614bd657614bd661540d565b60200101906001600160f81b03191690815f1a905350600101614b97565b505f5b6008811015614c6857614c0b8160076156ce565b614c16906008615645565b60ff1685604001516001600160401b0316901c60f81b82826046614c3a9190615610565b81518110614c4a57614c4a61540d565b60200101906001600160f81b03191690815f1a905350600101614bf7565b505f5b6030811015614cd35784608001518181518110614c8a57614c8a61540d565b01602001516001600160f81b03191682614ca583604e615610565b81518110614cb557614cb561540d565b60200101906001600160f81b03191690815f1a905350600101614c6b565b505f5b6008811015614d4557614cea8160076156ce565b614cf5906008615645565b60608601516001600160401b0390811691161c60f81b82614d1783607e615610565b81518110614d2757614d2761540d565b60200101906001600160f81b03191690815f1a905350600101614cd6565b50600281604051614d5691906155ff565b602060405180830381855afa158015614d71573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d949190615284565b94909350915050565b6141136140ca565b614dad6140ca565b80355f80516020615be083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614df96080840160608501615a3e565b60ff161115614e665760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e776080840160608501615a3e565b60ff1611614edf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614eef6080830160608401615a3e565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f20606083016040840161516d565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612af26140ca565b508054614f5b906156e1565b5f825580601f10614f6a575050565b601f0160209004905f5260205f209081019061284e9190614fc2565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fd6575f8155600101614fc3565b5090565b801515811461284e575f80fd5b803563ffffffff81168114612158575f80fd5b5f805f6060848603121561500c575f80fd5b83359250602084013561501e81614fda565b915061502c60408501614fe7565b90509250925092565b5f60208284031215615045575f80fd5b5035919050565b5f610140828403121561505d575f80fd5b50919050565b803561ffff81168114612158575f80fd5b80356001600160401b0381168114612158575f80fd5b5f805f6060848603121561509c575f80fd5b83356001600160401b038111156150b1575f80fd5b8401606081870312156150c2575f80fd5b92506150d060208501615063565b915061502c60408501615074565b5f602082840312156150ee575f80fd5b610cb182614fe7565b5f8060408385031215615108575f80fd5b61511183614fe7565b946020939093013593505050565b5f8060408385031215615130575f80fd5b82356001600160401b03811115615145575f80fd5b830160808186031215615156575f80fd5b915061516460208401614fe7565b90509250929050565b5f6020828403121561517d575f80fd5b610cb182615074565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151bd57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151f860608401826001600160401b03169052565b50608083015161521360808401826001600160401b03169052565b5060a083015161522e60a08401826001600160401b03169052565b5060c083015161524960c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561524957615249615250565b5f60208284031215615294575f80fd5b5051919050565b5f5b838110156152b557818101518382015260200161529d565b50505f910152565b602081525f82518060208401526152db81604085016020870161529b565b601f01601f19169190910160400192915050565b5f8261530957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461284e575f80fd5b5f602082840312156153bd575f80fd5b8135610cb181615399565b5f808335601e198436030181126153dd575f80fd5b8301803591506001600160401b038211156153f6575f80fd5b6020019150600581901b3603821315612611575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615435575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154755761547561543f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154a3576154a361543f565b604052919050565b5f6001600160401b038211156154c3576154c361543f565b50601f01601f191660200190565b5f606082360312156154e1575f80fd5b6154e9615453565b8235815260206154fa818501615074565b8183015260408401356001600160401b03811115615516575f80fd5b840136601f820112615526575f80fd5b8035615539615534826154ab565b61547b565b818152368483850101111561554c575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155c1818460208a0161529b565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155f181602884016020880161529b565b016028019695505050505050565b5f825161543581846020870161529b565b80820180821115610c7e57610c7e615250565b5f63ffffffff80831681810361563b5761563b615250565b6001019392505050565b8082028115828204841417610c7e57610c7e615250565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561524957615249615250565b81810381811115610c7e57610c7e615250565b600181811c908216806156f557607f821691505b60208210810361505d57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461576c816156e1565b806020870152604060018084165f811461578d57600181146157a9576157d6565b60ff19851660408a0152604084151560051b8a010195506157d6565b895f5260205f205f5b858110156157cd5781548b82018601529083019088016157b2565b8a016040019650505b509398975050505050505050565b805161215881614fda565b5f8060408385031215615800575f80fd5b82516001600160401b0380821115615816575f80fd5b9084019060608287031215615829575f80fd5b615831615453565b8251815260208084015161584481615399565b82820152604084015183811115615859575f80fd5b80850194505087601f85011261586d575f80fd5b8351925061587d615534846154ab565b8381528882858701011115615890575f80fd5b61589f8483830184880161529b565b806040840152508195506158b48188016157e4565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0257615a02615250565b505092915050565b5f6001600160401b0380831681810361563b5761563b615250565b5f60208284031215615a35575f80fd5b610cb182615063565b5f60208284031215615a4e575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a73575f80fd5b8301803591506001600160401b03821115615a8c575f80fd5b602001915036819003821315612611575f80fd5b601f82111561212757805f5260205f20601f840160051c81016020851015615ac55750805b601f840160051c820191505b81811015610d51575f8155600101615ad1565b81516001600160401b03811115615afd57615afd61543f565b615b1181615b0b84546156e1565b84615aa0565b602080601f831160018114615b44575f8415615b2d5750858301515b5f19600386901b1c1916600185901b178555612ee8565b5f85815260208120601f198616915b82811015615b7257888601518255948401946001909101908401615b53565b5085821015615b8f57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 56ac2c55e..8a7026f58 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -398,9 +398,9 @@ abstract contract PoSValidatorManager is uint32 messageIndex ) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - bytes32 validationID = $._delegatorStakes[delegationID].validationID; Delegator memory delegator = $._delegatorStakes[delegationID]; + bytes32 validationID = delegator.validationID; Validator memory validator = getValidator(validationID); // Ensure the delegator is active From 6b1e9c07b64fa22a0cab81d9078e5acc5b8c97f3 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 10:05:48 -0400 Subject: [PATCH 363/545] Small fix --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/staking/PoSValidatorManager.sol | 16 ++++++++-------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6eaab5861..7d787d8c7 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160db3803806160db83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f8e8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e61019936600461529f565b6103ec565b005b61019e6101ae3660046152da565b610890565b6101f16101c13660046152da565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152da565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615305565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615343565b610b3e565b61019e61029936600461535c565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c9366004615384565b610db3565b6101f16102dc3660046153e8565b6113e7565b6102316102ef3660046152da565b611400565b61019e61030236600461529f565b611414565b61020c603081565b61019e61031d3660046152da565b611651565b61019e61033036600461535c565b611757565b6101f1610343366004615401565b611a60565b61019e610356366004615343565b611a8c565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152da565b611c44565b61019e6103a23660046152da565b611eca565b61020c601481565b6103c26103bd3660046152da565b611fde565b6040516101fb9190615435565b6102316202a30081565b6101f16103e73660046154fc565b6120a6565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee283398151915293929190829060ff16600481111561044d5761044d615421565b600481111561045e5761045e615421565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fde565b90506002835160048111156104f9576104f9615421565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f028339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f028339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615421565b036106235786156105e4576105e183876120db565b90505b5f846060015183608001516105f99190615575565b90506106058482612377565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b9190615595565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615421565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f628339815191526020526040808220815160e0810190925280545f80516020615f2283398151915293929190829060ff1660058111156108dd576108dd615421565b60058111156108ee576108ee615421565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615421565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124ce565b6040518263ffffffff1660e01b8152600401610a0391906155ce565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a439190615595565b50505050565b5f610a5964e8d4a5100083615600565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af184846126f5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ee28339815191525f80610b578461270f565b91509150610b6482612a59565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615421565b03610bc1575f83815260088501602052604081208054919055610bbf8282612a94565b505b610bd781610bd284604001516113e7565b612b0a565b5050505050565b5f80516020615ee28339815191525f610bf684612b2d565b90505f80610c078360400151612d07565b50915091505f610c1683611fde565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b81526004016105429061561f565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615661565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615421565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f228339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb79190615595565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156aa565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156c5565b91505f9050843560208601356014610fc86060890160408a016156aa565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156c5565b8363ffffffff1681811061105e5761105e61570a565b9050602002810190611070919061571e565b611079906157ce565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b815260040161054290615865565b84825f0151836020015184604001516040516020016110ce94939291906158ad565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c91906158fc565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a9190615595565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615421565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129991168661590d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615920565b905061102c565b50600584018190555f61130986612b2d565b90505f6113198260400151612f42565b90508060028560405161132c91906158fc565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a9190615595565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615942565b5f61140a82611fde565b6080015192915050565b5f80516020615ee28339815191525f61142c856130b4565b905061143785612a59565b15610bd7575f8581526005830160205260409020546001600160a01b031633146114735760405162461bcd60e51b815260040161054290615959565b5f85815260058301602052604090205460a08201516114a291600160b01b90046001600160401b0316906159ab565b6001600160401b03168160c001516001600160401b031610156115235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153486856120db565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061158b906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611601573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116259190615595565b5f8781526008850160205260408120805490919061164490849061590d565b9091555050505050505050565b5f80516020615ee28339815191525f61166983611fde565b905060048151600581111561168057611680615421565b146116ea5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117215760405162461bcd60e51b815260040161054290615959565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612a94565b61175f61332f565b5f80516020615ee28339815191525f61177784612b2d565b90505f806117888360400151612d07565b50915091505f61179783611fde565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d1576117d1615421565b60048111156117e2576117e2615421565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118c65760405162461bcd60e51b81526004016105429061561f565b826001600160401b03168160e001516001600160401b031611156118fc5760405162461bcd60e51b815260040161054290615661565b60038151600481111561191157611911615421565b146119655760405162461bcd60e51b815260206004820152603160248201525f80516020615f028339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119a690600160a01b900461ffff1684615942565b6119b09190615600565b905080886008015f8881526020019081526020015f205f8282546119d4919061590d565b909155505060208301516119f1906119ec83856159cb565b612a94565b611a068360200151610bd285606001516113e7565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a5c60015f80516020615f4283398151915255565b5050565b5f611a6961332f565b611a74833384613379565b9050610a5960015f80516020615f4283398151915255565b5f80516020615f228339815191525f611aa483612b2d565b90505f80611ab58360400151613733565b9150915080611b175760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b31906159de565b9050118015611b63575060015f83815260088601602052604090205460ff166005811115611b6157611b61615421565b145b611b7f5760405162461bcd60e51b815260040161054290615a16565b5f8281526007850160205260408120611b97916151ef565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee283398151915293929190829060ff166004811115611ca557611ca5615421565b6004811115611cb657611cb6615421565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d3d57611d3d615421565b1480611d5b5750600381516004811115611d5957611d59615421565b145b611daf5760405162461bcd60e51b815260206004820152603260248201525f80516020615f02833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dbd8260400151611fde565b905080606001516001600160401b03165f03611e415760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e6e8460400151846060015185608001516124ce565b6040518263ffffffff1660e01b8152600401611e8a91906155ce565b6020604051808303815f875af1158015611ea6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd79190615595565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f22833981519152929190611f12906159de565b9050118015611f44575060015f83815260088301602052604090205460ff166005811115611f4257611f42615421565b145b611f605760405162461bcd60e51b815260040161054290615a16565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f999190600401615a5d565b6020604051808303815f875af1158015611fb5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fd99190615595565b505050565b611fe6615226565b5f8281525f80516020615f62833981519152602052604090819020815160e0810190925280545f80516020615f22833981519152929190829060ff16600581111561203357612033615421565b600581111561204457612044615421565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120af61332f565b6120bb858585856138d4565b90506120d360015f80516020615f4283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612126573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261214d9190810190615af2565b91509150806121b05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122179190615595565b82511461227b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156122f15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123008460400151613b49565b9150915081871461236d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f62833981519152602052604081206002015481905f80516020615f2283398151915290600160801b90046001600160401b03166123bf8582613d21565b5f6123c987613f2f565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124198a858b6124ce565b6040518263ffffffff1660e01b815260040161243591906155ce565b6020604051808303815f875af1158015612451573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124759190615595565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612547576125078160016159cb565b612512906008615942565b5081515f908390839081106125295761252961570a565b60200101906001600160f81b03191690815f1a9053506001016124f3565b505f5b60048110156125b25761255e8160036159cb565b612569906008615942565b600263ffffffff16901c60f81b82826002612584919061590d565b815181106125945761259461570a565b60200101906001600160f81b03191690815f1a90535060010161254a565b505f5b6020811015612614576125c981601f6159cb565b6125d4906008615942565b86901c60f81b826125e683600661590d565b815181106125f6576125f661570a565b60200101906001600160f81b03191690815f1a9053506001016125b5565b505f5b600881101561267f5761262b8160076159cb565b612636906008615942565b6001600160401b038616901c60f81b8261265183602661590d565b815181106126615761266161570a565b60200101906001600160f81b03191690815f1a905350600101612617565b505f5b60088110156126ea576126968160076159cb565b6126a1906008615942565b6001600160401b038516901c60f81b826126bc83602e61590d565b815181106126cc576126cc61570a565b60200101906001600160f81b03191690815f1a905350600101612682565b5090505b9392505050565b6126fd613fbf565b6127068261400a565b611a5c81614081565b5f612718615226565b5f80516020615f228339815191525f61273085612b2d565b90505f806127418360400151613733565b9150915080156127a65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127d7576127d7615421565b60058111156127e8576127e8615421565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561285957612859615421565b1480612877575060018251600581111561287557612875615421565b145b6128d65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b6003825160058111156128eb576128eb615421565b036128f8575060046128fc565b5060055b6020808301515f9081526009880190915260408120558181600581111561292557612925615421565b9081600581111561293857612938615421565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561296c5761296c615421565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a2057612a20615421565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ec283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612aef575f80fd5b505af1158015612b01573d5f803e3d5ffd5b50505050505050565b5f80516020615ec283398151915254611a5c906001600160a01b03168383614122565b60408051606080820183525f8083526020830181905292820152905f80516020615f228339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ba2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bc99190810190615af2565b9150915080612c295760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612c8c5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612cff5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d2b5760405162461bcd60e51b815260040161054290615bc4565b5f805b6002811015612d7a57612d428160016159cb565b612d4d906008615942565b61ffff16868281518110612d6357612d6361570a565b016020015160f81c901b9190911790600101612d2e565b5061ffff811615612d9d5760405162461bcd60e51b815260040161054290615c0d565b5f805b6004811015612df857612db48160036159cb565b612dbf906008615942565b63ffffffff1687612dd183600261590d565b81518110612de157612de161570a565b016020015160f81c901b9190911790600101612da0565b5063ffffffff8116600414612e1f5760405162461bcd60e51b815260040161054290615c50565b5f805b6020811015612e7457612e3681601f6159cb565b612e41906008615942565b88612e4d83600661590d565b81518110612e5d57612e5d61570a565b016020015160f81c901b9190911790600101612e22565b505f805b6008811015612ed357612e8c8160076159cb565b612e97906008615942565b6001600160401b031689612eac83602661590d565b81518110612ebc57612ebc61570a565b016020015160f81c901b9190911790600101612e78565b505f805b6008811015612f3257612eeb8160076159cb565b612ef6906008615942565b6001600160401b03168a612f0b83602e61590d565b81518110612f1b57612f1b61570a565b016020015160f81c901b9190911790600101612ed7565b5091989097509095509350505050565b5f8151602614612f645760405162461bcd60e51b815260040161054290615bc4565b5f805b6002811015612fb357612f7b8160016159cb565b612f86906008615942565b61ffff16848281518110612f9c57612f9c61570a565b016020015160f81c901b9190911790600101612f67565b5061ffff811615612fd65760405162461bcd60e51b815260040161054290615c0d565b5f805b600481101561303157612fed8160036159cb565b612ff8906008615942565b63ffffffff168561300a83600261590d565b8151811061301a5761301a61570a565b016020015160f81c901b9190911790600101612fd9565b5063ffffffff8116156130565760405162461bcd60e51b815260040161054290615c50565b5f805b60208110156130ab5761306d81601f6159cb565b613078906008615942565b8661308483600661590d565b815181106130945761309461570a565b016020015160f81c901b9190911790600101613059565b50949350505050565b6130bc615226565b5f8281525f80516020615f628339815191526020526040808220815160e0810190925280545f80516020615f2283398151915293929190829060ff16600581111561310957613109615421565b600581111561311a5761311a615421565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561318c5761318c615421565b146131e85760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561322c5761322c615421565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132d88582612377565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f4283398151915280546001190161336057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f4283398151915255565b5f5f80516020615ee28339815191528161339561022c85614181565b90505f6133a187611fde565b90506133ac87612a59565b6134095760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561341e5761341e615421565b1461347d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f82826080015161348e91906159ab565b600485015460408401519192506134b0916001600160401b0390911690615c97565b6001600160401b0316816001600160401b0316111561352f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f8061353b8a84612377565b915091505f8a8360405160200161356992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561360457613604615421565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137565760405162461bcd60e51b815260040161054290615bc4565b5f805b60028110156137a55761376d8160016159cb565b613778906008615942565b61ffff1685828151811061378e5761378e61570a565b016020015160f81c901b9190911790600101613759565b5061ffff8116156137c85760405162461bcd60e51b815260040161054290615c0d565b5f805b6004811015613823576137df8160036159cb565b6137ea906008615942565b63ffffffff16866137fc83600261590d565b8151811061380c5761380c61570a565b016020015160f81c901b91909117906001016137cb565b5063ffffffff811660031461384a5760405162461bcd60e51b815260040161054290615c50565b5f805b602081101561389f5761386181601f6159cb565b61386c906008615942565b8761387883600661590d565b815181106138885761388861570a565b016020015160f81c901b919091179060010161384d565b505f866026815181106138b4576138b461570a565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ee28339815191529061ffff861610801590613920575061271061ffff861611155b61393c5760405162461bcd60e51b815260040161054290615cc2565b60028101546001600160401b0390811690851610156139b55760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a185760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613a7f5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613a8984614181565b90505f613a9582610a49565b90505f613aa289836141a4565b90506040518060600160405280613ab63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b6c5760405162461bcd60e51b815260040161054290615bc4565b5f805b6002811015613bbb57613b838160016159cb565b613b8e906008615942565b61ffff16858281518110613ba457613ba461570a565b016020015160f81c901b9190911790600101613b6f565b5061ffff811615613bde5760405162461bcd60e51b815260040161054290615c0d565b5f805b6004811015613c3957613bf58160036159cb565b613c00906008615942565b63ffffffff1686613c1283600261590d565b81518110613c2257613c2261570a565b016020015160f81c901b9190911790600101613be1565b5063ffffffff8116600514613c605760405162461bcd60e51b815260040161054290615c50565b5f805b6020811015613cb557613c7781601f6159cb565b613c82906008615942565b87613c8e83600661590d565b81518110613c9e57613c9e61570a565b016020015160f81c901b9190911790600101613c63565b505f805b6008811015613d1457613ccd8160076159cb565b613cd8906008615942565b6001600160401b031688613ced83602661590d565b81518110613cfd57613cfd61570a565b016020015160f81c901b9190911790600101613cb9565b5090969095509350505050565b5f80516020615f228339815191525f6001600160401b038084169085161115613d5557613d4e8385615575565b9050613d62565b613d5f8484615575565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613dc4575060028401548151613dc0916001600160401b03169061590d565b8210155b15613dea576001600160401b038316606082015281815260408101516020820152613e09565b8281606001818151613dfc91906159ab565b6001600160401b03169052505b6060810151613e19906064615c97565b602082015160028601546001600160401b039290921691613e449190600160401b900460ff16615942565b1015613ea85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ec3919061590d565b9052506040810180516001600160401b0387169190613ee39083906159cb565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f628339815191526020526040812060020180545f80516020615f2283398151915291600160401b9091046001600160401b0316906008613f7983615d0d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661400857604051631afcd79f60e31b815260040160405180910390fd5b565b614012613fbf565b61401b81614709565b614023614722565b61407e608082013560a083013561404060e0850160c086016153e8565b614051610100860160e08701615d28565b61ffff1661406761012087016101008801615d41565b614079610140880161012089016156aa565b614732565b50565b614089613fbf565b5f80516020615ec28339815191526001600160a01b0382166141025760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611fd991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614976565b5f610a59825f80516020615ec2833981519152546001600160a01b0316906149d7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661422f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f228339815191524261424e60408601602087016153e8565b6001600160401b0316116142c05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142d060408501602086016153e8565b6001600160401b03166142e66202a3004261590d565b116143595760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143b15760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156143e05760405162461bcd60e51b815260040161054290615865565b60306143ef6040860186615d61565b9050146144545760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b61445e835f613d21565b5f806144f86040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a391906153e8565b6001600160401b031681526020016144be60408a018a615d61565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b39565b5f828152600786016020526040902091935091506145168282615de7565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145439085906004016155ce565b6020604051808303815f875af115801561455f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145839190615595565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145fb576145fb615421565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146db918e01908e016153e8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614711613fbf565b614719614ee8565b61407e81614ef0565b61472a613fbf565b614008615092565b61473a613fbf565b5f80516020615ee2833981519152836147a65760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147c85760405162461bcd60e51b815260040161054290615cc2565b858711156148305760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff161161489d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff8416111561490f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f61498a6001600160a01b0384168361509a565b905080515f141580156149ae5750808060200190518101906149ac9190615ea6565b155b15611fd957604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a419190615595565b9050614a586001600160a01b0385163330866150a7565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614a9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ac09190615595565b9050818111614b265760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b3082826159cb565b95945050505050565b5f6060826080015151603014614ba35760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c1a57614bda8160016159cb565b614be5906008615942565b5081515f90839083908110614bfc57614bfc61570a565b60200101906001600160f81b03191690815f1a905350600101614bc6565b505f5b6004811015614c8257614c318160036159cb565b614c3c906008615942565b600160ff919091161c60f81b82614c5483600261590d565b81518110614c6457614c6461570a565b60200101906001600160f81b03191690815f1a905350600101614c1d565b505f5b6020811015614cdf5784518160208110614ca157614ca161570a565b1a60f81b82614cb183600661590d565b81518110614cc157614cc161570a565b60200101906001600160f81b03191690815f1a905350600101614c85565b505f5b6020811015614d3f5784602001518160208110614d0157614d0161570a565b1a60f81b82614d1183602661590d565b81518110614d2157614d2161570a565b60200101906001600160f81b03191690815f1a905350600101614ce2565b505f5b6008811015614db357614d568160076159cb565b614d61906008615942565b60ff1685604001516001600160401b0316901c60f81b82826046614d85919061590d565b81518110614d9557614d9561570a565b60200101906001600160f81b03191690815f1a905350600101614d42565b505f5b6030811015614e1e5784608001518181518110614dd557614dd561570a565b01602001516001600160f81b03191682614df083604e61590d565b81518110614e0057614e0061570a565b60200101906001600160f81b03191690815f1a905350600101614db6565b505f5b6008811015614e9057614e358160076159cb565b614e40906008615942565b60608601516001600160401b0390811691161c60f81b82614e6283607e61590d565b81518110614e7257614e7261570a565b60200101906001600160f81b03191690815f1a905350600101614e21565b50600281604051614ea191906158fc565b602060405180830381855afa158015614ebc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614edf9190615595565b94909350915050565b614008613fbf565b614ef8613fbf565b80355f80516020615f2283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f446080840160608501615d41565b60ff161115614fb15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fc26080840160608501615d41565b60ff161161502a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b61503a6080830160608401615d41565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561506b60608301604084016153e8565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613366613fbf565b60606126ee83835f6150e0565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd9060840161414f565b6060814710156151055760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b0316848660405161512091906158fc565b5f6040518083038185875af1925050503d805f811461515a576040519150601f19603f3d011682016040523d82523d5f602084013e61515f565b606091505b509150915061236d86838360608261517f5761517a826151c6565b6126ee565b815115801561519657506001600160a01b0384163b155b156151bf57604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b50806126ee565b8051156151d65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151fb906159de565b5f825580601f1061520a575050565b601f0160209004905f5260205f209081019061407e9190615262565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615276575f8155600101615263565b5090565b801515811461407e575f80fd5b803563ffffffff8116811461529a575f80fd5b919050565b5f805f606084860312156152b1575f80fd5b8335925060208401356152c38161527a565b91506152d160408501615287565b90509250925092565b5f602082840312156152ea575f80fd5b5035919050565b6001600160a01b038116811461407e575f80fd5b5f80828403610160811215615318575f80fd5b61014080821215615327575f80fd5b8493508301359050615338816152f1565b809150509250929050565b5f60208284031215615353575f80fd5b6126ee82615287565b5f806040838503121561536d575f80fd5b61537683615287565b946020939093013593505050565b5f8060408385031215615395575f80fd5b82356001600160401b038111156153aa575f80fd5b8301608081860312156153bb575f80fd5b91506153c960208401615287565b90509250929050565b80356001600160401b038116811461529a575f80fd5b5f602082840312156153f8575f80fd5b6126ee826153d2565b5f8060408385031215615412575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061545857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161549360608401826001600160401b03169052565b5060808301516154ae60808401826001600160401b03169052565b5060a08301516154c960a08401826001600160401b03169052565b5060c08301516154e460c08401826001600160401b03169052565b5092915050565b803561ffff8116811461529a575f80fd5b5f805f806080858703121561550f575f80fd5b84356001600160401b03811115615524575f80fd5b850160608188031215615535575f80fd5b9350615543602086016154eb565b9250615551604086016153d2565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154e4576154e4615561565b5f602082840312156155a5575f80fd5b5051919050565b5f5b838110156155c65781810151838201526020016155ae565b50505f910152565b602081525f82518060208401526155ec8160408501602087016155ac565b601f01601f19169190910160400192915050565b5f8261561a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156ba575f80fd5b81356126ee816152f1565b5f808335601e198436030181126156da575f80fd5b8301803591506001600160401b038211156156f3575f80fd5b6020019150600581901b36038213156124c7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615732575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157725761577261573c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157a0576157a061573c565b604052919050565b5f6001600160401b038211156157c0576157c061573c565b50601f01601f191660200190565b5f606082360312156157de575f80fd5b6157e6615750565b8235815260206157f78185016153d2565b8183015260408401356001600160401b03811115615813575f80fd5b840136601f820112615823575f80fd5b8035615836615831826157a8565b615778565b8181523684838501011115615849575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158be818460208a016155ac565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158ee8160288401602088016155ac565b016028019695505050505050565b5f82516157328184602087016155ac565b80820180821115610a5957610a59615561565b5f63ffffffff80831681810361593857615938615561565b6001019392505050565b8082028115828204841417610a5957610a59615561565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156154e4576154e4615561565b81810381811115610a5957610a59615561565b600181811c908216806159f257607f821691505b602082108103615a1057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a6f816159de565b806020870152604060018084165f8114615a905760018114615aac57615ad9565b60ff19851660408a0152604084151560051b8a01019550615ad9565b895f5260205f205f5b85811015615ad05781548b8201860152908301908801615ab5565b8a016040019650505b509398975050505050505050565b805161529a8161527a565b5f8060408385031215615b03575f80fd5b82516001600160401b0380821115615b19575f80fd5b9084019060608287031215615b2c575f80fd5b615b34615750565b82518152602080840151615b47816152f1565b82820152604084015183811115615b5c575f80fd5b80850194505087601f850112615b70575f80fd5b83519250615b80615831846157a8565b8381528882858701011115615b93575f80fd5b615ba2848383018488016155ac565b80604084015250819550615bb7818801615ae7565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cba57615cba615561565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361593857615938615561565b5f60208284031215615d38575f80fd5b6126ee826154eb565b5f60208284031215615d51575f80fd5b813560ff811681146126ee575f80fd5b5f808335601e19843603018112615d76575f80fd5b8301803591506001600160401b03821115615d8f575f80fd5b6020019150368190038213156124c7575f80fd5b601f821115611fd957805f5260205f20601f840160051c81016020851015615dc85750805b601f840160051c820191505b81811015610bd7575f8155600101615dd4565b81516001600160401b03811115615e0057615e0061573c565b615e1481615e0e84546159de565b84615da3565b602080601f831160018114615e47575f8415615e305750858301515b5f19600386901b1c1916600185901b178555615e9e565b5f85815260208120601f198616915b82811015615e7557888601518255948401946001909101908401615e56565b5085821015615e9257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615eb6575f80fd5b81516126ee8161527a56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516160e13803806160e183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f948061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152a5565b6103ec565b005b61019e6101ae3660046152e0565b610890565b6101f16101c13660046152e0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152e0565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e61025736600461530b565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615349565b610b3e565b61019e610299366004615362565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c936600461538a565b610db3565b6101f16102dc3660046153ee565b6113e7565b6102316102ef3660046152e0565b611400565b61019e6103023660046152a5565b611414565b61020c603081565b61019e61031d3660046152e0565b611657565b61019e610330366004615362565b61175d565b6101f1610343366004615407565b611a66565b61019e610356366004615349565b611a92565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152e0565b611c4a565b61019e6103a23660046152e0565b611ed0565b61020c601481565b6103c26103bd3660046152e0565b611fe4565b6040516101fb919061543b565b6102316202a30081565b6101f16103e7366004615502565b6120ac565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee883398151915293929190829060ff16600481111561044d5761044d615427565b600481111561045e5761045e615427565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fe4565b90506002835160048111156104f9576104f9615427565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f088339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f088339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615427565b036106235786156105e4576105e183876120e1565b90505b5f846060015183608001516105f9919061557b565b9050610605848261237d565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b919061559b565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615427565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f688339815191526020526040808220815160e0810190925280545f80516020615f2883398151915293929190829060ff1660058111156108dd576108dd615427565b60058111156108ee576108ee615427565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615427565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124d4565b6040518263ffffffff1660e01b8152600401610a0391906155d4565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a43919061559b565b50505050565b5f610a5964e8d4a5100083615606565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af184846126fb565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ee88339815191525f80610b5784612715565b91509150610b6482612a5f565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615427565b03610bc1575f83815260088501602052604081208054919055610bbf8282612a9a565b505b610bd781610bd284604001516113e7565b612b10565b5050505050565b5f80516020615ee88339815191525f610bf684612b33565b90505f80610c078360400151612d0d565b50915091505f610c1683611fe4565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b815260040161054290615625565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615667565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615427565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f288339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb7919061559b565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156b0565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156cb565b91505f9050843560208601356014610fc86060890160408a016156b0565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156cb565b8363ffffffff1681811061105e5761105e615710565b90506020028101906110709190615724565b611079906157d4565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b81526004016105429061586b565b84825f0151836020015184604001516040516020016110ce94939291906158b3565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c9190615902565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a919061559b565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615427565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611299911686615913565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615926565b905061102c565b50600584018190555f61130986612b33565b90505f6113198260400151612f48565b90508060028560405161132c9190615902565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a919061559b565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615948565b5f61140a82611fe4565b6080015192915050565b5f80516020615ee88339815191525f61142c856130ba565b905061143785612a5f565b611442575050505050565b5f8581526005830160205260409020546001600160a01b031633146114795760405162461bcd60e51b81526004016105429061595f565b5f85815260058301602052604090205460a08201516114a891600160b01b90046001600160401b0316906159b1565b6001600160401b03168160c001516001600160401b031610156115295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153a86856120e1565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611591906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611607573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162b919061559b565b5f8781526008850160205260408120805490919061164a908490615913565b9091555050505050505050565b5f80516020615ee88339815191525f61166f83611fe4565b905060048151600581111561168657611686615427565b146116f05760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117275760405162461bcd60e51b81526004016105429061595f565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612a9a565b611765613335565b5f80516020615ee88339815191525f61177d84612b33565b90505f8061178e8360400151612d0d565b50915091505f61179d83611fe4565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d7576117d7615427565b60048111156117e8576117e8615427565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118cc5760405162461bcd60e51b815260040161054290615625565b826001600160401b03168160e001516001600160401b031611156119025760405162461bcd60e51b815260040161054290615667565b60038151600481111561191757611917615427565b1461196b5760405162461bcd60e51b815260206004820152603160248201525f80516020615f088339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119ac90600160a01b900461ffff1684615948565b6119b69190615606565b905080886008015f8881526020019081526020015f205f8282546119da9190615913565b909155505060208301516119f7906119f283856159d1565b612a9a565b611a0c8360200151610bd285606001516113e7565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a6260015f80516020615f4883398151915255565b5050565b5f611a6f613335565b611a7a83338461337f565b9050610a5960015f80516020615f4883398151915255565b5f80516020615f288339815191525f611aaa83612b33565b90505f80611abb8360400151613739565b9150915080611b1d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b37906159e4565b9050118015611b69575060015f83815260088601602052604090205460ff166005811115611b6757611b67615427565b145b611b855760405162461bcd60e51b815260040161054290615a1c565b5f8281526007850160205260408120611b9d916151f5565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee883398151915293929190829060ff166004811115611cab57611cab615427565b6004811115611cbc57611cbc615427565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d4357611d43615427565b1480611d615750600381516004811115611d5f57611d5f615427565b145b611db55760405162461bcd60e51b815260206004820152603260248201525f80516020615f08833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dc38260400151611fe4565b905080606001516001600160401b03165f03611e475760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e748460400151846060015185608001516124d4565b6040518263ffffffff1660e01b8152600401611e9091906155d4565b6020604051808303815f875af1158015611eac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd7919061559b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f28833981519152929190611f18906159e4565b9050118015611f4a575060015f83815260088301602052604090205460ff166005811115611f4857611f48615427565b145b611f665760405162461bcd60e51b815260040161054290615a1c565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f9f9190600401615a63565b6020604051808303815f875af1158015611fbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fdf919061559b565b505050565b611fec61522c565b5f8281525f80516020615f68833981519152602052604090819020815160e0810190925280545f80516020615f28833981519152929190829060ff16600581111561203957612039615427565b600581111561204a5761204a615427565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120b5613335565b6120c1858585856138da565b90506120d960015f80516020615f4883398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561212c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121539190810190615af8565b91509150806121b65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061221d919061559b565b8251146122815760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156122f75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123068460400151613b4f565b915091508187146123735760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f68833981519152602052604081206002015481905f80516020615f2883398151915290600160801b90046001600160401b03166123c58582613d27565b5f6123cf87613f35565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61241f8a858b6124d4565b6040518263ffffffff1660e01b815260040161243b91906155d4565b6020604051808303815f875af1158015612457573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247b919061559b565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561254d5761250d8160016159d1565b612518906008615948565b5081515f9083908390811061252f5761252f615710565b60200101906001600160f81b03191690815f1a9053506001016124f9565b505f5b60048110156125b8576125648160036159d1565b61256f906008615948565b600263ffffffff16901c60f81b8282600261258a9190615913565b8151811061259a5761259a615710565b60200101906001600160f81b03191690815f1a905350600101612550565b505f5b602081101561261a576125cf81601f6159d1565b6125da906008615948565b86901c60f81b826125ec836006615913565b815181106125fc576125fc615710565b60200101906001600160f81b03191690815f1a9053506001016125bb565b505f5b6008811015612685576126318160076159d1565b61263c906008615948565b6001600160401b038616901c60f81b82612657836026615913565b8151811061266757612667615710565b60200101906001600160f81b03191690815f1a90535060010161261d565b505f5b60088110156126f05761269c8160076159d1565b6126a7906008615948565b6001600160401b038516901c60f81b826126c283602e615913565b815181106126d2576126d2615710565b60200101906001600160f81b03191690815f1a905350600101612688565b5090505b9392505050565b612703613fc5565b61270c82614010565b611a6281614087565b5f61271e61522c565b5f80516020615f288339815191525f61273685612b33565b90505f806127478360400151613739565b9150915080156127ac5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127dd576127dd615427565b60058111156127ee576127ee615427565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561285f5761285f615427565b148061287d575060018251600581111561287b5761287b615427565b145b6128dc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b6003825160058111156128f1576128f1615427565b036128fe57506004612902565b5060055b6020808301515f9081526009880190915260408120558181600581111561292b5761292b615427565b9081600581111561293e5761293e615427565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561297257612972615427565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a2657612a26615427565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ec883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612af5575f80fd5b505af1158015612b07573d5f803e3d5ffd5b50505050505050565b5f80516020615ec883398151915254611a62906001600160a01b03168383614128565b60408051606080820183525f8083526020830181905292820152905f80516020615f288339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ba8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bcf9190810190615af8565b9150915080612c2f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612c925760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612d055760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d315760405162461bcd60e51b815260040161054290615bca565b5f805b6002811015612d8057612d488160016159d1565b612d53906008615948565b61ffff16868281518110612d6957612d69615710565b016020015160f81c901b9190911790600101612d34565b5061ffff811615612da35760405162461bcd60e51b815260040161054290615c13565b5f805b6004811015612dfe57612dba8160036159d1565b612dc5906008615948565b63ffffffff1687612dd7836002615913565b81518110612de757612de7615710565b016020015160f81c901b9190911790600101612da6565b5063ffffffff8116600414612e255760405162461bcd60e51b815260040161054290615c56565b5f805b6020811015612e7a57612e3c81601f6159d1565b612e47906008615948565b88612e53836006615913565b81518110612e6357612e63615710565b016020015160f81c901b9190911790600101612e28565b505f805b6008811015612ed957612e928160076159d1565b612e9d906008615948565b6001600160401b031689612eb2836026615913565b81518110612ec257612ec2615710565b016020015160f81c901b9190911790600101612e7e565b505f805b6008811015612f3857612ef18160076159d1565b612efc906008615948565b6001600160401b03168a612f1183602e615913565b81518110612f2157612f21615710565b016020015160f81c901b9190911790600101612edd565b5091989097509095509350505050565b5f8151602614612f6a5760405162461bcd60e51b815260040161054290615bca565b5f805b6002811015612fb957612f818160016159d1565b612f8c906008615948565b61ffff16848281518110612fa257612fa2615710565b016020015160f81c901b9190911790600101612f6d565b5061ffff811615612fdc5760405162461bcd60e51b815260040161054290615c13565b5f805b600481101561303757612ff38160036159d1565b612ffe906008615948565b63ffffffff1685613010836002615913565b8151811061302057613020615710565b016020015160f81c901b9190911790600101612fdf565b5063ffffffff81161561305c5760405162461bcd60e51b815260040161054290615c56565b5f805b60208110156130b15761307381601f6159d1565b61307e906008615948565b8661308a836006615913565b8151811061309a5761309a615710565b016020015160f81c901b919091179060010161305f565b50949350505050565b6130c261522c565b5f8281525f80516020615f688339815191526020526040808220815160e0810190925280545f80516020615f2883398151915293929190829060ff16600581111561310f5761310f615427565b600581111561312057613120615427565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561319257613192615427565b146131ee5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561323257613232615427565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132de858261237d565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f4883398151915280546001190161336657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f4883398151915255565b5f5f80516020615ee88339815191528161339b61022c85614187565b90505f6133a787611fe4565b90506133b287612a5f565b61340f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561342457613424615427565b146134835760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f82826080015161349491906159b1565b600485015460408401519192506134b6916001600160401b0390911690615c9d565b6001600160401b0316816001600160401b031611156135355760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f806135418a8461237d565b915091505f8a8360405160200161356f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561360a5761360a615427565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461375c5760405162461bcd60e51b815260040161054290615bca565b5f805b60028110156137ab576137738160016159d1565b61377e906008615948565b61ffff1685828151811061379457613794615710565b016020015160f81c901b919091179060010161375f565b5061ffff8116156137ce5760405162461bcd60e51b815260040161054290615c13565b5f805b6004811015613829576137e58160036159d1565b6137f0906008615948565b63ffffffff1686613802836002615913565b8151811061381257613812615710565b016020015160f81c901b91909117906001016137d1565b5063ffffffff81166003146138505760405162461bcd60e51b815260040161054290615c56565b5f805b60208110156138a55761386781601f6159d1565b613872906008615948565b8761387e836006615913565b8151811061388e5761388e615710565b016020015160f81c901b9190911790600101613853565b505f866026815181106138ba576138ba615710565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ee88339815191529061ffff861610801590613926575061271061ffff861611155b6139425760405162461bcd60e51b815260040161054290615cc8565b60028101546001600160401b0390811690851610156139bb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613a855760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613a8f84614187565b90505f613a9b82610a49565b90505f613aa889836141aa565b90506040518060600160405280613abc3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b725760405162461bcd60e51b815260040161054290615bca565b5f805b6002811015613bc157613b898160016159d1565b613b94906008615948565b61ffff16858281518110613baa57613baa615710565b016020015160f81c901b9190911790600101613b75565b5061ffff811615613be45760405162461bcd60e51b815260040161054290615c13565b5f805b6004811015613c3f57613bfb8160036159d1565b613c06906008615948565b63ffffffff1686613c18836002615913565b81518110613c2857613c28615710565b016020015160f81c901b9190911790600101613be7565b5063ffffffff8116600514613c665760405162461bcd60e51b815260040161054290615c56565b5f805b6020811015613cbb57613c7d81601f6159d1565b613c88906008615948565b87613c94836006615913565b81518110613ca457613ca4615710565b016020015160f81c901b9190911790600101613c69565b505f805b6008811015613d1a57613cd38160076159d1565b613cde906008615948565b6001600160401b031688613cf3836026615913565b81518110613d0357613d03615710565b016020015160f81c901b9190911790600101613cbf565b5090969095509350505050565b5f80516020615f288339815191525f6001600160401b038084169085161115613d5b57613d54838561557b565b9050613d68565b613d65848461557b565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613dca575060028401548151613dc6916001600160401b031690615913565b8210155b15613df0576001600160401b038316606082015281815260408101516020820152613e0f565b8281606001818151613e0291906159b1565b6001600160401b03169052505b6060810151613e1f906064615c9d565b602082015160028601546001600160401b039290921691613e4a9190600160401b900460ff16615948565b1015613eae5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ec99190615913565b9052506040810180516001600160401b0387169190613ee99083906159d1565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f688339815191526020526040812060020180545f80516020615f2883398151915291600160401b9091046001600160401b0316906008613f7f83615d13565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661400e57604051631afcd79f60e31b815260040160405180910390fd5b565b614018613fc5565b6140218161470f565b614029614728565b614084608082013560a083013561404660e0850160c086016153ee565b614057610100860160e08701615d2e565b61ffff1661406d61012087016101008801615d47565b61407f610140880161012089016156b0565b614738565b50565b61408f613fc5565b5f80516020615ec88339815191526001600160a01b0382166141085760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611fdf91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061497c565b5f610a59825f80516020615ec8833981519152546001600160a01b0316906149dd565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f288339815191524261425460408601602087016153ee565b6001600160401b0316116142c65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142d660408501602086016153ee565b6001600160401b03166142ec6202a30042615913565b1161435f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143b75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156143e65760405162461bcd60e51b81526004016105429061586b565b60306143f56040860186615d67565b90501461445a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b614464835f613d27565b5f806144fe6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a991906153ee565b6001600160401b031681526020016144c460408a018a615d67565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b3f565b5f8281526007860160205260409020919350915061451c8282615ded565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145499085906004016155d4565b6020604051808303815f875af1158015614565573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614589919061559b565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561460157614601615427565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e1918e01908e016153ee565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614717613fc5565b61471f614eee565b61408481614ef6565b614730613fc5565b61400e615098565b614740613fc5565b5f80516020615ee8833981519152836147ac5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147ce5760405162461bcd60e51b815260040161054290615cc8565b858711156148365760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff16116148a35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff841611156149155760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149906001600160a01b038416836150a0565b905080515f141580156149b45750808060200190518101906149b29190615eac565b155b15611fdf57604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a47919061559b565b9050614a5e6001600160a01b0385163330866150ad565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614aa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ac6919061559b565b9050818111614b2c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b3682826159d1565b95945050505050565b5f6060826080015151603014614ba95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c2057614be08160016159d1565b614beb906008615948565b5081515f90839083908110614c0257614c02615710565b60200101906001600160f81b03191690815f1a905350600101614bcc565b505f5b6004811015614c8857614c378160036159d1565b614c42906008615948565b600160ff919091161c60f81b82614c5a836002615913565b81518110614c6a57614c6a615710565b60200101906001600160f81b03191690815f1a905350600101614c23565b505f5b6020811015614ce55784518160208110614ca757614ca7615710565b1a60f81b82614cb7836006615913565b81518110614cc757614cc7615710565b60200101906001600160f81b03191690815f1a905350600101614c8b565b505f5b6020811015614d455784602001518160208110614d0757614d07615710565b1a60f81b82614d17836026615913565b81518110614d2757614d27615710565b60200101906001600160f81b03191690815f1a905350600101614ce8565b505f5b6008811015614db957614d5c8160076159d1565b614d67906008615948565b60ff1685604001516001600160401b0316901c60f81b82826046614d8b9190615913565b81518110614d9b57614d9b615710565b60200101906001600160f81b03191690815f1a905350600101614d48565b505f5b6030811015614e245784608001518181518110614ddb57614ddb615710565b01602001516001600160f81b03191682614df683604e615913565b81518110614e0657614e06615710565b60200101906001600160f81b03191690815f1a905350600101614dbc565b505f5b6008811015614e9657614e3b8160076159d1565b614e46906008615948565b60608601516001600160401b0390811691161c60f81b82614e6883607e615913565b81518110614e7857614e78615710565b60200101906001600160f81b03191690815f1a905350600101614e27565b50600281604051614ea79190615902565b602060405180830381855afa158015614ec2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ee5919061559b565b94909350915050565b61400e613fc5565b614efe613fc5565b80355f80516020615f2883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f4a6080840160608501615d47565b60ff161115614fb75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fc86080840160608501615d47565b60ff16116150305760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b6150406080830160608401615d47565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561507160608301604084016153ee565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61336c613fc5565b60606126f483835f6150e6565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd90608401614155565b60608147101561510b5760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b031684866040516151269190615902565b5f6040518083038185875af1925050503d805f8114615160576040519150601f19603f3d011682016040523d82523d5f602084013e615165565b606091505b509150915061237386838360608261518557615180826151cc565b6126f4565b815115801561519c57506001600160a01b0384163b155b156151c557604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b50806126f4565b8051156151dc5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054615201906159e4565b5f825580601f10615210575050565b601f0160209004905f5260205f20908101906140849190615268565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561527c575f8155600101615269565b5090565b8015158114614084575f80fd5b803563ffffffff811681146152a0575f80fd5b919050565b5f805f606084860312156152b7575f80fd5b8335925060208401356152c981615280565b91506152d76040850161528d565b90509250925092565b5f602082840312156152f0575f80fd5b5035919050565b6001600160a01b0381168114614084575f80fd5b5f8082840361016081121561531e575f80fd5b6101408082121561532d575f80fd5b849350830135905061533e816152f7565b809150509250929050565b5f60208284031215615359575f80fd5b6126f48261528d565b5f8060408385031215615373575f80fd5b61537c8361528d565b946020939093013593505050565b5f806040838503121561539b575f80fd5b82356001600160401b038111156153b0575f80fd5b8301608081860312156153c1575f80fd5b91506153cf6020840161528d565b90509250929050565b80356001600160401b03811681146152a0575f80fd5b5f602082840312156153fe575f80fd5b6126f4826153d8565b5f8060408385031215615418575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061545e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161549960608401826001600160401b03169052565b5060808301516154b460808401826001600160401b03169052565b5060a08301516154cf60a08401826001600160401b03169052565b5060c08301516154ea60c08401826001600160401b03169052565b5092915050565b803561ffff811681146152a0575f80fd5b5f805f8060808587031215615515575f80fd5b84356001600160401b0381111561552a575f80fd5b85016060818803121561553b575f80fd5b9350615549602086016154f1565b9250615557604086016153d8565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154ea576154ea615567565b5f602082840312156155ab575f80fd5b5051919050565b5f5b838110156155cc5781810151838201526020016155b4565b50505f910152565b602081525f82518060208401526155f28160408501602087016155b2565b601f01601f19169190910160400192915050565b5f8261562057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156c0575f80fd5b81356126f4816152f7565b5f808335601e198436030181126156e0575f80fd5b8301803591506001600160401b038211156156f9575f80fd5b6020019150600581901b36038213156124cd575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615738575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561577857615778615742565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157a6576157a6615742565b604052919050565b5f6001600160401b038211156157c6576157c6615742565b50601f01601f191660200190565b5f606082360312156157e4575f80fd5b6157ec615756565b8235815260206157fd8185016153d8565b8183015260408401356001600160401b03811115615819575f80fd5b840136601f820112615829575f80fd5b803561583c615837826157ae565b61577e565b818152368483850101111561584f575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158c4818460208a016155b2565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158f48160288401602088016155b2565b016028019695505050505050565b5f82516157388184602087016155b2565b80820180821115610a5957610a59615567565b5f63ffffffff80831681810361593e5761593e615567565b6001019392505050565b8082028115828204841417610a5957610a59615567565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156154ea576154ea615567565b81810381811115610a5957610a59615567565b600181811c908216806159f857607f821691505b602082108103615a1657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a75816159e4565b806020870152604060018084165f8114615a965760018114615ab257615adf565b60ff19851660408a0152604084151560051b8a01019550615adf565b895f5260205f205f5b85811015615ad65781548b8201860152908301908801615abb565b8a016040019650505b509398975050505050505050565b80516152a081615280565b5f8060408385031215615b09575f80fd5b82516001600160401b0380821115615b1f575f80fd5b9084019060608287031215615b32575f80fd5b615b3a615756565b82518152602080840151615b4d816152f7565b82820152604084015183811115615b62575f80fd5b80850194505087601f850112615b76575f80fd5b83519250615b86615837846157ae565b8381528882858701011115615b99575f80fd5b615ba8848383018488016155b2565b80604084015250819550615bbd818801615aed565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cc057615cc0615567565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361593e5761593e615567565b5f60208284031215615d3e575f80fd5b6126f4826154f1565b5f60208284031215615d57575f80fd5b813560ff811681146126f4575f80fd5b5f808335601e19843603018112615d7c575f80fd5b8301803591506001600160401b03821115615d95575f80fd5b6020019150368190038213156124cd575f80fd5b601f821115611fdf57805f5260205f20601f840160051c81016020851015615dce5750805b601f840160051c820191505b81811015610bd7575f8155600101615dda565b81516001600160401b03811115615e0657615e06615742565b615e1a81615e1484546159e4565b84615da9565b602080601f831160018114615e4d575f8415615e365750858301515b5f19600386901b1c1916600185901b178555615ea4565b5f85815260208120601f198616915b82811015615e7b57888601518255948401946001909101908401615e5c565b5085821015615e9857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ebc575f80fd5b81516126f48161528056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 4ce5754f9..a21ad1acd 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d99380380615d9983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c4c8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004614ffa565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615035565b6109d8565b3480156101e4575f80fd5b506102236101f3366004615035565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461504c565b610b91565b348015610286575f80fd5b5061029a610295366004615035565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a36600461508a565b610c84565b34801561032a575f80fd5b506101b86103393660046150de565b610cb8565b348015610349575f80fd5b506101b86103583660046150f7565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a036600461511f565b610f2d565b3480156103b0575f80fd5b506102236103bf36600461516d565b611561565b3480156103cf575f80fd5b5061029a6103de366004615035565b61157a565b3480156103ee575f80fd5b506101b86103fd366004614ffa565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615035565b6117cb565b348015610440575f80fd5b506101b861044f3660046150f7565b6118d1565b34801561045f575f80fd5b506101b861046e3660046150de565b611bda565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615035565b611d92565b3480156104b7575f80fd5b506101b86104c6366004615035565b612018565b6102236104d9366004615035565b61212c565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615035565b61215d565b60405161022d919061519a565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba083398151915293929190829060ff16600481111561059557610595615186565b60048111156105a6576105a6615186565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a8261215d565b905060028351600481111561064157610641615186565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615bc08339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615bc08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f90600290600581111561071457610714615186565b0361076b57861561072c576107298387612225565b90505b5f846060015183608001516107419190615264565b905061074d84826124c1565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108739190615284565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b2615186565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c208339815191526020526040808220815160e0810190925280545f80516020615be083398151915293929190829060ff166005811115610a2557610a25615186565b6005811115610a3657610a36615186565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa5615186565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f612618565b6040518263ffffffff1660e01b8152600401610b4b91906152bd565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b9190615284565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c228361283d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a51000836152ef565b92915050565b5f610c8d612851565b610c9984848434612888565b9050610cb160015f80516020615c0083398151915255565b9392505050565b5f80516020615ba08339815191525f80610cd184612b05565b91509150610cde82612e4f565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d16615186565b03610d3b575f83815260088501602052604081208054919055610d398282612e8a565b505b610d5181610d4c8460400151611561565b612ef0565b5050505050565b5f80516020615ba08339815191525f610d7084612f03565b90505f80610d8183604001516130dd565b50915091505f610d908361215d565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a9061530e565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615350565b60015f87815260068701602052604090205460ff166004811115610e3357610e33615186565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615be08339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110319190615284565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153ad565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153c8565b91505f90508435602086013560146111426060890160408a016153ad565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153c8565b8363ffffffff168181106111d8576111d861540d565b90506020028101906111ea9190615421565b6111f3906154d1565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a90615568565b84825f01518360200151846040015160405160200161124894939291906155b0565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161129691906155ff565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d49190615284565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561136057611360615186565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615610565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615623565b90506111a6565b50600584018190555f61148386612f03565b90505f6114938260400151613318565b9050806002856040516114a691906155ff565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e49190615284565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a51000615645565b5f6115848261215d565b6080015192915050565b5f80516020615ba08339815191525f6115a685613481565b90506115b185612e4f565b15610d51575f8581526005830160205260409020546001600160a01b031633146115ed5760405162461bcd60e51b815260040161068a9061565c565b5f85815260058301602052604090205460a082015161161c91600160b01b90046001600160401b0316906156ae565b6001600160401b03168160c001516001600160401b0316101561169d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116ae8685612225565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170590611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561177b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179f9190615284565b5f878152600885016020526040812080549091906117be908490615610565b9091555050505050505050565b5f80516020615ba08339815191525f6117e38361215d565b90506004815160058111156117fa576117fa615186565b146118645760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b0316331461189b5760405162461bcd60e51b815260040161068a9061565c565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612e8a565b6118d9612851565b5f80516020615ba08339815191525f6118f184612f03565b90505f8061190283604001516130dd565b50915091505f6119118361215d565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561194b5761194b615186565b600481111561195c5761195c615186565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a405760405162461bcd60e51b815260040161068a9061530e565b826001600160401b03168160e001516001600160401b03161115611a765760405162461bcd60e51b815260040161068a90615350565b600381516004811115611a8b57611a8b615186565b14611adf5760405162461bcd60e51b815260206004820152603160248201525f80516020615bc08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2090600160a01b900461ffff1684615645565b611b2a91906152ef565b905080886008015f8881526020019081526020015f205f828254611b4e9190615610565b90915550506020830151611b6b90611b6683856156ce565b612e8a565b611b808360200151610d4c8560600151611561565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bd660015f80516020615c0083398151915255565b5050565b5f80516020615be08339815191525f611bf283612f03565b90505f80611c0383604001516136fc565b9150915080611c655760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611c7f906156e1565b9050118015611cb1575060015f83815260088601602052604090205460ff166005811115611caf57611caf615186565b145b611ccd5760405162461bcd60e51b815260040161068a90615713565b5f8281526007850160205260408120611ce591614f4f565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba083398151915293929190829060ff166004811115611df357611df3615186565b6004811115611e0457611e04615186565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e8b57611e8b615186565b1480611ea95750600381516004811115611ea757611ea7615186565b145b611efd5760405162461bcd60e51b815260206004820152603260248201525f80516020615bc0833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f0b826040015161215d565b905080606001516001600160401b03165f03611f8f5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fbc846040015184606001518560800151612618565b6040518263ffffffff1660e01b8152600401611fd891906152bd565b6020604051808303815f875af1158015611ff4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d519190615284565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615be0833981519152929190612060906156e1565b9050118015612092575060015f83815260088301602052604090205460ff16600581111561209057612090615186565b145b6120ae5760405162461bcd60e51b815260040161068a90615713565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120e7919060040161575a565b6020604051808303815f875af1158015612103573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121279190615284565b505050565b5f612135612851565b61214082333461389d565b905061215860015f80516020615c0083398151915255565b919050565b612165614f86565b5f8281525f80516020615c20833981519152602052604090819020815160e0810190925280545f80516020615be0833981519152929190829060ff1660058111156121b2576121b2615186565b60058111156121c3576121c3615186565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612270573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229791908101906157ef565b91509150806122fa5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561233d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123619190615284565b8251146123c55760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b03161561243b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f8061244a8460400151613c54565b915091508187146124b75760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c20833981519152602052604081206002015481905f80516020615be083398151915290600160801b90046001600160401b03166125098582613e2c565b5f6125138761403a565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125638a858b612618565b6040518263ffffffff1660e01b815260040161257f91906152bd565b6020604051808303815f875af115801561259b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125bf9190615284565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612691576126518160016156ce565b61265c906008615645565b5081515f908390839081106126735761267361540d565b60200101906001600160f81b03191690815f1a90535060010161263d565b505f5b60048110156126fc576126a88160036156ce565b6126b3906008615645565b600263ffffffff16901c60f81b828260026126ce9190615610565b815181106126de576126de61540d565b60200101906001600160f81b03191690815f1a905350600101612694565b505f5b602081101561275e5761271381601f6156ce565b61271e906008615645565b86901c60f81b82612730836006615610565b815181106127405761274061540d565b60200101906001600160f81b03191690815f1a9053506001016126ff565b505f5b60088110156127c9576127758160076156ce565b612780906008615645565b6001600160401b038616901c60f81b8261279b836026615610565b815181106127ab576127ab61540d565b60200101906001600160f81b03191690815f1a905350600101612761565b505f5b6008811015612834576127e08160076156ce565b6127eb906008615645565b6001600160401b038516901c60f81b8261280683602e615610565b815181106128165761281661540d565b60200101906001600160f81b03191690815f1a9053506001016127cc565b50949350505050565b6128456140ca565b61284e81614115565b50565b5f80516020615c0083398151915280546001190161288257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ba08339815191529061ffff8616108015906128d4575061271061ffff861611155b6128f05760405162461bcd60e51b815260040161068a906158c1565b60028101546001600160401b0390811690851610156129695760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129cc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a335760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a3e82610c6e565b90505f612a4b8983614189565b90506040518060600160405280612a5f3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c0083398151915255565b5f612b0e614f86565b5f80516020615be08339815191525f612b2685612f03565b90505f80612b3783604001516136fc565b915091508015612b9c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bcd57612bcd615186565b6005811115612bde57612bde615186565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c4f57612c4f615186565b1480612c6d5750600182516005811115612c6b57612c6b615186565b145b612ccc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612ce157612ce1615186565b03612cee57506004612cf2565b5060055b6020808301515f90815260098801909152604081205581816005811115612d1b57612d1b615186565b90816005811115612d2e57612d2e615186565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d6257612d62615186565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e1657612e16615186565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ed6575f80fd5b505af1158015612ee8573d5f803e3d5ffd5b505050505050565b611bd66001600160a01b038316826146ee565b60408051606080820183525f8083526020830181905292820152905f80516020615be08339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f78573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f9f91908101906157ef565b9150915080612fff5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130625760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130d55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131015760405162461bcd60e51b815260040161068a9061590c565b5f805b6002811015613150576131188160016156ce565b613123906008615645565b61ffff168682815181106131395761313961540d565b016020015160f81c901b9190911790600101613104565b5061ffff8116156131735760405162461bcd60e51b815260040161068a90615955565b5f805b60048110156131ce5761318a8160036156ce565b613195906008615645565b63ffffffff16876131a7836002615610565b815181106131b7576131b761540d565b016020015160f81c901b9190911790600101613176565b5063ffffffff81166004146131f55760405162461bcd60e51b815260040161068a90615998565b5f805b602081101561324a5761320c81601f6156ce565b613217906008615645565b88613223836006615610565b815181106132335761323361540d565b016020015160f81c901b91909117906001016131f8565b505f805b60088110156132a9576132628160076156ce565b61326d906008615645565b6001600160401b031689613282836026615610565b815181106132925761329261540d565b016020015160f81c901b919091179060010161324e565b505f805b6008811015613308576132c18160076156ce565b6132cc906008615645565b6001600160401b03168a6132e183602e615610565b815181106132f1576132f161540d565b016020015160f81c901b91909117906001016132ad565b5091989097509095509350505050565b5f815160261461333a5760405162461bcd60e51b815260040161068a9061590c565b5f805b6002811015613389576133518160016156ce565b61335c906008615645565b61ffff168482815181106133725761337261540d565b016020015160f81c901b919091179060010161333d565b5061ffff8116156133ac5760405162461bcd60e51b815260040161068a90615955565b5f805b6004811015613407576133c38160036156ce565b6133ce906008615645565b63ffffffff16856133e0836002615610565b815181106133f0576133f061540d565b016020015160f81c901b91909117906001016133af565b5063ffffffff81161561342c5760405162461bcd60e51b815260040161068a90615998565b5f805b60208110156128345761344381601f6156ce565b61344e906008615645565b8661345a836006615610565b8151811061346a5761346a61540d565b016020015160f81c901b919091179060010161342f565b613489614f86565b5f8281525f80516020615c208339815191526020526040808220815160e0810190925280545f80516020615be083398151915293929190829060ff1660058111156134d6576134d6615186565b60058111156134e7576134e7615186565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561355957613559615186565b146135b55760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156135f9576135f9615186565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136a585826124c1565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461371f5760405162461bcd60e51b815260040161068a9061590c565b5f805b600281101561376e576137368160016156ce565b613741906008615645565b61ffff168582815181106137575761375761540d565b016020015160f81c901b9190911790600101613722565b5061ffff8116156137915760405162461bcd60e51b815260040161068a90615955565b5f805b60048110156137ec576137a88160036156ce565b6137b3906008615645565b63ffffffff16866137c5836002615610565b815181106137d5576137d561540d565b016020015160f81c901b9190911790600101613794565b5063ffffffff81166003146138135760405162461bcd60e51b815260040161068a90615998565b5f805b60208110156138685761382a81601f6156ce565b613835906008615645565b87613841836006615610565b815181106138515761385161540d565b016020015160f81c901b9190911790600101613816565b505f8660268151811061387d5761387d61540d565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ba0833981519152816138b684610c6e565b90505f6138c28761215d565b90506138cd87612e4f565b61392a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b60028151600581111561393f5761393f615186565b1461399e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139af91906156ae565b600485015460408401519192506139d1916001600160401b03909116906159df565b6001600160401b0316816001600160401b03161115613a505760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a5c8a846124c1565b915091505f8a83604051602001613a8a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b2557613b25615186565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c775760405162461bcd60e51b815260040161068a9061590c565b5f805b6002811015613cc657613c8e8160016156ce565b613c99906008615645565b61ffff16858281518110613caf57613caf61540d565b016020015160f81c901b9190911790600101613c7a565b5061ffff811615613ce95760405162461bcd60e51b815260040161068a90615955565b5f805b6004811015613d4457613d008160036156ce565b613d0b906008615645565b63ffffffff1686613d1d836002615610565b81518110613d2d57613d2d61540d565b016020015160f81c901b9190911790600101613cec565b5063ffffffff8116600514613d6b5760405162461bcd60e51b815260040161068a90615998565b5f805b6020811015613dc057613d8281601f6156ce565b613d8d906008615645565b87613d99836006615610565b81518110613da957613da961540d565b016020015160f81c901b9190911790600101613d6e565b505f805b6008811015613e1f57613dd88160076156ce565b613de3906008615645565b6001600160401b031688613df8836026615610565b81518110613e0857613e0861540d565b016020015160f81c901b9190911790600101613dc4565b5090969095509350505050565b5f80516020615be08339815191525f6001600160401b038084169085161115613e6057613e598385615264565b9050613e6d565b613e6a8484615264565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ecf575060028401548151613ecb916001600160401b031690615610565b8210155b15613ef5576001600160401b038316606082015281815260408101516020820152613f14565b8281606001818151613f0791906156ae565b6001600160401b03169052505b6060810151613f249060646159df565b602082015160028601546001600160401b039290921691613f4f9190600160401b900460ff16615645565b1015613fb35760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fce9190615610565b9052506040810180516001600160401b0387169190613fee9083906156ce565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c208339815191526020526040812060020180545f80516020615be083398151915291600160401b9091046001600160401b031690600861408483615a0a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661411357604051631afcd79f60e31b815260040160405180910390fd5b565b61411d6140ca565b61412681614781565b61412e61479a565b61284e608082013560a083013561414b60e0850160c0860161516d565b61415c610100860160e08701615a25565b61ffff1661417261012087016101008801615a3e565b614184610140880161012089016153ad565b6147aa565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142145760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615be083398151915242614233604086016020870161516d565b6001600160401b0316116142a55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142b5604085016020860161516d565b6001600160401b03166142cb6202a30042615610565b1161433e5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b83356143965760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143c55760405162461bcd60e51b815260040161068a90615568565b60306143d46040860186615a5e565b9050146144395760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614443835f613e2c565b5f806144dd6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190614488919061516d565b6001600160401b031681526020016144a360408a018a615a5e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149ee565b5f828152600786016020526040902091935091506144fb8282615ae4565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145289085906004016152bd565b6020604051808303815f875af1158015614544573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145689190615284565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145e0576145e0615186565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146c0918e01908e0161516d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147115760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461475a576040519150601f19603f3d011682016040523d82523d5f602084013e61475f565b606091505b505090508061212757604051630a12f52160e11b815260040160405180910390fd5b6147896140ca565b614791614d9d565b61284e81614da5565b6147a26140ca565b614113614f47565b6147b26140ca565b5f80516020615ba08339815191528361481e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148405760405162461bcd60e51b815260040161068a906158c1565b858711156148a85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff16116149155760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff841611156149875760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a585760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614acf57614a8f8160016156ce565b614a9a906008615645565b5081515f90839083908110614ab157614ab161540d565b60200101906001600160f81b03191690815f1a905350600101614a7b565b505f5b6004811015614b3757614ae68160036156ce565b614af1906008615645565b600160ff919091161c60f81b82614b09836002615610565b81518110614b1957614b1961540d565b60200101906001600160f81b03191690815f1a905350600101614ad2565b505f5b6020811015614b945784518160208110614b5657614b5661540d565b1a60f81b82614b66836006615610565b81518110614b7657614b7661540d565b60200101906001600160f81b03191690815f1a905350600101614b3a565b505f5b6020811015614bf45784602001518160208110614bb657614bb661540d565b1a60f81b82614bc6836026615610565b81518110614bd657614bd661540d565b60200101906001600160f81b03191690815f1a905350600101614b97565b505f5b6008811015614c6857614c0b8160076156ce565b614c16906008615645565b60ff1685604001516001600160401b0316901c60f81b82826046614c3a9190615610565b81518110614c4a57614c4a61540d565b60200101906001600160f81b03191690815f1a905350600101614bf7565b505f5b6030811015614cd35784608001518181518110614c8a57614c8a61540d565b01602001516001600160f81b03191682614ca583604e615610565b81518110614cb557614cb561540d565b60200101906001600160f81b03191690815f1a905350600101614c6b565b505f5b6008811015614d4557614cea8160076156ce565b614cf5906008615645565b60608601516001600160401b0390811691161c60f81b82614d1783607e615610565b81518110614d2757614d2761540d565b60200101906001600160f81b03191690815f1a905350600101614cd6565b50600281604051614d5691906155ff565b602060405180830381855afa158015614d71573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d949190615284565b94909350915050565b6141136140ca565b614dad6140ca565b80355f80516020615be083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614df96080840160608501615a3e565b60ff161115614e665760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e776080840160608501615a3e565b60ff1611614edf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614eef6080830160608401615a3e565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f20606083016040840161516d565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612af26140ca565b508054614f5b906156e1565b5f825580601f10614f6a575050565b601f0160209004905f5260205f209081019061284e9190614fc2565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fd6575f8155600101614fc3565b5090565b801515811461284e575f80fd5b803563ffffffff81168114612158575f80fd5b5f805f6060848603121561500c575f80fd5b83359250602084013561501e81614fda565b915061502c60408501614fe7565b90509250925092565b5f60208284031215615045575f80fd5b5035919050565b5f610140828403121561505d575f80fd5b50919050565b803561ffff81168114612158575f80fd5b80356001600160401b0381168114612158575f80fd5b5f805f6060848603121561509c575f80fd5b83356001600160401b038111156150b1575f80fd5b8401606081870312156150c2575f80fd5b92506150d060208501615063565b915061502c60408501615074565b5f602082840312156150ee575f80fd5b610cb182614fe7565b5f8060408385031215615108575f80fd5b61511183614fe7565b946020939093013593505050565b5f8060408385031215615130575f80fd5b82356001600160401b03811115615145575f80fd5b830160808186031215615156575f80fd5b915061516460208401614fe7565b90509250929050565b5f6020828403121561517d575f80fd5b610cb182615074565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151bd57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151f860608401826001600160401b03169052565b50608083015161521360808401826001600160401b03169052565b5060a083015161522e60a08401826001600160401b03169052565b5060c083015161524960c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561524957615249615250565b5f60208284031215615294575f80fd5b5051919050565b5f5b838110156152b557818101518382015260200161529d565b50505f910152565b602081525f82518060208401526152db81604085016020870161529b565b601f01601f19169190910160400192915050565b5f8261530957634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461284e575f80fd5b5f602082840312156153bd575f80fd5b8135610cb181615399565b5f808335601e198436030181126153dd575f80fd5b8301803591506001600160401b038211156153f6575f80fd5b6020019150600581901b3603821315612611575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615435575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154755761547561543f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154a3576154a361543f565b604052919050565b5f6001600160401b038211156154c3576154c361543f565b50601f01601f191660200190565b5f606082360312156154e1575f80fd5b6154e9615453565b8235815260206154fa818501615074565b8183015260408401356001600160401b03811115615516575f80fd5b840136601f820112615526575f80fd5b8035615539615534826154ab565b61547b565b818152368483850101111561554c575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155c1818460208a0161529b565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155f181602884016020880161529b565b016028019695505050505050565b5f825161543581846020870161529b565b80820180821115610c7e57610c7e615250565b5f63ffffffff80831681810361563b5761563b615250565b6001019392505050565b8082028115828204841417610c7e57610c7e615250565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561524957615249615250565b81810381811115610c7e57610c7e615250565b600181811c908216806156f557607f821691505b60208210810361505d57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461576c816156e1565b806020870152604060018084165f811461578d57600181146157a9576157d6565b60ff19851660408a0152604084151560051b8a010195506157d6565b895f5260205f205f5b858110156157cd5781548b82018601529083019088016157b2565b8a016040019650505b509398975050505050505050565b805161215881614fda565b5f8060408385031215615800575f80fd5b82516001600160401b0380821115615816575f80fd5b9084019060608287031215615829575f80fd5b615831615453565b8251815260208084015161584481615399565b82820152604084015183811115615859575f80fd5b80850194505087601f85011261586d575f80fd5b8351925061587d615534846154ab565b8381528882858701011115615890575f80fd5b61589f8483830184880161529b565b806040840152508195506158b48188016157e4565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0257615a02615250565b505092915050565b5f6001600160401b0380831681810361563b5761563b615250565b5f60208284031215615a35575f80fd5b610cb182615063565b5f60208284031215615a4e575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a73575f80fd5b8301803591506001600160401b03821115615a8c575f80fd5b602001915036819003821315612611575f80fd5b601f82111561212757805f5260205f20601f840160051c81016020851015615ac55750805b601f840160051c820191505b81811015610d51575f8155600101615ad1565b81516001600160401b03811115615afd57615afd61543f565b615b1181615b0b84546156e1565b84615aa0565b602080601f831160018114615b44575f8415615b2d5750858301515b5f19600386901b1c1916600185901b178555612ee8565b5f85815260208120601f198616915b82811015615b7257888601518255948401946001909101908401615b53565b5085821015615b8f57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d9f380380615d9f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c528061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004615000565b610534565b005b3480156101c5575f80fd5b506101b86101d436600461503b565b6109d8565b3480156101e4575f80fd5b506102236101f336600461503b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b8610276366004615052565b610b91565b348015610286575f80fd5b5061029a61029536600461503b565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a366004615090565b610c84565b34801561032a575f80fd5b506101b86103393660046150e4565b610cb8565b348015610349575f80fd5b506101b86103583660046150fd565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615125565b610f2d565b3480156103b0575f80fd5b506102236103bf366004615173565b611561565b3480156103cf575f80fd5b5061029a6103de36600461503b565b61157a565b3480156103ee575f80fd5b506101b86103fd366004615000565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b861043036600461503b565b6117d1565b348015610440575f80fd5b506101b861044f3660046150fd565b6118d7565b34801561045f575f80fd5b506101b861046e3660046150e4565b611be0565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a736600461503b565b611d98565b3480156104b7575f80fd5b506101b86104c636600461503b565b61201e565b6102236104d936600461503b565b612132565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c36600461503b565b612163565b60405161022d91906151a0565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba683398151915293929190829060ff1660048111156105955761059561518c565b60048111156105a6576105a661518c565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a82612163565b90506002835160048111156106415761064161518c565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615bc68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615bc68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f9060029060058111156107145761071461518c565b0361076b57861561072c57610729838761222b565b90505b5f84606001518360800151610741919061526a565b905061074d84826124c7565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610873919061528a565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b261518c565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c268339815191526020526040808220815160e0810190925280545f80516020615be683398151915293929190829060ff166005811115610a2557610a2561518c565b6005811115610a3657610a3661518c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa561518c565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f61261e565b6040518263ffffffff1660e01b8152600401610b4b91906152c3565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b919061528a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c2283612843565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a51000836152f5565b92915050565b5f610c8d612857565b610c998484843461288e565b9050610cb160015f80516020615c0683398151915255565b9392505050565b5f80516020615ba68339815191525f80610cd184612b0b565b91509150610cde82612e55565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d1661518c565b03610d3b575f83815260088501602052604081208054919055610d398282612e90565b505b610d5181610d4c8460400151611561565b612ef6565b5050505050565b5f80516020615ba68339815191525f610d7084612f09565b90505f80610d8183604001516130e3565b50915091505f610d9083612163565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a90615314565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615356565b60015f87815260068701602052604090205460ff166004811115610e3357610e3361518c565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615be68339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611031919061528a565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153b3565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153ce565b91505f90508435602086013560146111426060890160408a016153b3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153ce565b8363ffffffff168181106111d8576111d8615413565b90506020028101906111ea9190615427565b6111f3906154d7565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a9061556e565b84825f01518360200151846040015160405160200161124894939291906155b6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112969190615605565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d4919061528a565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113605761136061518c565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615616565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615629565b90506111a6565b50600584018190555f61148386612f09565b90505f611493826040015161331e565b9050806002856040516114a69190615605565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e4919061528a565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a5100061564b565b5f61158482612163565b6080015192915050565b5f80516020615ba68339815191525f6115a685613487565b90506115b185612e55565b6115bc575050505050565b5f8581526005830160205260409020546001600160a01b031633146115f35760405162461bcd60e51b815260040161068a90615662565b5f85815260058301602052604090205460a082015161162291600160b01b90046001600160401b0316906156b4565b6001600160401b03168160c001516001600160401b031610156116a35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116b4868561222b565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170b90611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a5919061528a565b5f878152600885016020526040812080549091906117c4908490615616565b9091555050505050505050565b5f80516020615ba68339815191525f6117e983612163565b90506004815160058111156118005761180061518c565b1461186a5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b031633146118a15760405162461bcd60e51b815260040161068a90615662565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612e90565b6118df612857565b5f80516020615ba68339815191525f6118f784612f09565b90505f8061190883604001516130e3565b50915091505f61191783612163565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119515761195161518c565b60048111156119625761196261518c565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a465760405162461bcd60e51b815260040161068a90615314565b826001600160401b03168160e001516001600160401b03161115611a7c5760405162461bcd60e51b815260040161068a90615356565b600381516004811115611a9157611a9161518c565b14611ae55760405162461bcd60e51b815260206004820152603160248201525f80516020615bc68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2690600160a01b900461ffff168461564b565b611b3091906152f5565b905080886008015f8881526020019081526020015f205f828254611b549190615616565b90915550506020830151611b7190611b6c83856156d4565b612e90565b611b868360200151610d4c8560600151611561565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bdc60015f80516020615c0683398151915255565b5050565b5f80516020615be68339815191525f611bf883612f09565b90505f80611c098360400151613702565b9150915080611c6b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611c85906156e7565b9050118015611cb7575060015f83815260088601602052604090205460ff166005811115611cb557611cb561518c565b145b611cd35760405162461bcd60e51b815260040161068a90615719565b5f8281526007850160205260408120611ceb91614f55565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba683398151915293929190829060ff166004811115611df957611df961518c565b6004811115611e0a57611e0a61518c565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e9157611e9161518c565b1480611eaf5750600381516004811115611ead57611ead61518c565b145b611f035760405162461bcd60e51b815260206004820152603260248201525f80516020615bc6833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f118260400151612163565b905080606001516001600160401b03165f03611f955760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fc284604001518460600151856080015161261e565b6040518263ffffffff1660e01b8152600401611fde91906152c3565b6020604051808303815f875af1158015611ffa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d51919061528a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615be6833981519152929190612066906156e7565b9050118015612098575060015f83815260088301602052604090205460ff1660058111156120965761209661518c565b145b6120b45760405162461bcd60e51b815260040161068a90615719565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120ed9190600401615760565b6020604051808303815f875af1158015612109573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212d919061528a565b505050565b5f61213b612857565b6121468233346138a3565b905061215e60015f80516020615c0683398151915255565b919050565b61216b614f8c565b5f8281525f80516020615c26833981519152602052604090819020815160e0810190925280545f80516020615be6833981519152929190829060ff1660058111156121b8576121b861518c565b60058111156121c9576121c961518c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612276573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229d91908101906157f5565b91509150806123005760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612343573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612367919061528a565b8251146123cb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b0316156124415760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f806124508460400151613c5a565b915091508187146124bd5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c26833981519152602052604081206002015481905f80516020615be683398151915290600160801b90046001600160401b031661250f8582613e32565b5f61251987614040565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125698a858b61261e565b6040518263ffffffff1660e01b815260040161258591906152c3565b6020604051808303815f875af11580156125a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c5919061528a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612697576126578160016156d4565b61266290600861564b565b5081515f9083908390811061267957612679615413565b60200101906001600160f81b03191690815f1a905350600101612643565b505f5b6004811015612702576126ae8160036156d4565b6126b990600861564b565b600263ffffffff16901c60f81b828260026126d49190615616565b815181106126e4576126e4615413565b60200101906001600160f81b03191690815f1a90535060010161269a565b505f5b60208110156127645761271981601f6156d4565b61272490600861564b565b86901c60f81b82612736836006615616565b8151811061274657612746615413565b60200101906001600160f81b03191690815f1a905350600101612705565b505f5b60088110156127cf5761277b8160076156d4565b61278690600861564b565b6001600160401b038616901c60f81b826127a1836026615616565b815181106127b1576127b1615413565b60200101906001600160f81b03191690815f1a905350600101612767565b505f5b600881101561283a576127e68160076156d4565b6127f190600861564b565b6001600160401b038516901c60f81b8261280c83602e615616565b8151811061281c5761281c615413565b60200101906001600160f81b03191690815f1a9053506001016127d2565b50949350505050565b61284b6140d0565b6128548161411b565b50565b5f80516020615c0683398151915280546001190161288857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ba68339815191529061ffff8616108015906128da575061271061ffff861611155b6128f65760405162461bcd60e51b815260040161068a906158c7565b60028101546001600160401b03908116908516101561296f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129d25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a395760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a4482610c6e565b90505f612a51898361418f565b90506040518060600160405280612a653390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c0683398151915255565b5f612b14614f8c565b5f80516020615be68339815191525f612b2c85612f09565b90505f80612b3d8360400151613702565b915091508015612ba25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bd357612bd361518c565b6005811115612be457612be461518c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c5557612c5561518c565b1480612c735750600182516005811115612c7157612c7161518c565b145b612cd25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612ce757612ce761518c565b03612cf457506004612cf8565b5060055b6020808301515f90815260098801909152604081205581816005811115612d2157612d2161518c565b90816005811115612d3457612d3461518c565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d6857612d6861518c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e1c57612e1c61518c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612edc575f80fd5b505af1158015612eee573d5f803e3d5ffd5b505050505050565b611bdc6001600160a01b038316826146f4565b60408051606080820183525f8083526020830181905292820152905f80516020615be68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f7e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fa591908101906157f5565b91509150806130055760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130685760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131075760405162461bcd60e51b815260040161068a90615912565b5f805b60028110156131565761311e8160016156d4565b61312990600861564b565b61ffff1686828151811061313f5761313f615413565b016020015160f81c901b919091179060010161310a565b5061ffff8116156131795760405162461bcd60e51b815260040161068a9061595b565b5f805b60048110156131d4576131908160036156d4565b61319b90600861564b565b63ffffffff16876131ad836002615616565b815181106131bd576131bd615413565b016020015160f81c901b919091179060010161317c565b5063ffffffff81166004146131fb5760405162461bcd60e51b815260040161068a9061599e565b5f805b60208110156132505761321281601f6156d4565b61321d90600861564b565b88613229836006615616565b8151811061323957613239615413565b016020015160f81c901b91909117906001016131fe565b505f805b60088110156132af576132688160076156d4565b61327390600861564b565b6001600160401b031689613288836026615616565b8151811061329857613298615413565b016020015160f81c901b9190911790600101613254565b505f805b600881101561330e576132c78160076156d4565b6132d290600861564b565b6001600160401b03168a6132e783602e615616565b815181106132f7576132f7615413565b016020015160f81c901b91909117906001016132b3565b5091989097509095509350505050565b5f81516026146133405760405162461bcd60e51b815260040161068a90615912565b5f805b600281101561338f576133578160016156d4565b61336290600861564b565b61ffff1684828151811061337857613378615413565b016020015160f81c901b9190911790600101613343565b5061ffff8116156133b25760405162461bcd60e51b815260040161068a9061595b565b5f805b600481101561340d576133c98160036156d4565b6133d490600861564b565b63ffffffff16856133e6836002615616565b815181106133f6576133f6615413565b016020015160f81c901b91909117906001016133b5565b5063ffffffff8116156134325760405162461bcd60e51b815260040161068a9061599e565b5f805b602081101561283a5761344981601f6156d4565b61345490600861564b565b86613460836006615616565b8151811061347057613470615413565b016020015160f81c901b9190911790600101613435565b61348f614f8c565b5f8281525f80516020615c268339815191526020526040808220815160e0810190925280545f80516020615be683398151915293929190829060ff1660058111156134dc576134dc61518c565b60058111156134ed576134ed61518c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561355f5761355f61518c565b146135bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156135ff576135ff61518c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136ab85826124c7565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137255760405162461bcd60e51b815260040161068a90615912565b5f805b60028110156137745761373c8160016156d4565b61374790600861564b565b61ffff1685828151811061375d5761375d615413565b016020015160f81c901b9190911790600101613728565b5061ffff8116156137975760405162461bcd60e51b815260040161068a9061595b565b5f805b60048110156137f2576137ae8160036156d4565b6137b990600861564b565b63ffffffff16866137cb836002615616565b815181106137db576137db615413565b016020015160f81c901b919091179060010161379a565b5063ffffffff81166003146138195760405162461bcd60e51b815260040161068a9061599e565b5f805b602081101561386e5761383081601f6156d4565b61383b90600861564b565b87613847836006615616565b8151811061385757613857615413565b016020015160f81c901b919091179060010161381c565b505f8660268151811061388357613883615413565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ba6833981519152816138bc84610c6e565b90505f6138c887612163565b90506138d387612e55565b6139305760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b6002815160058111156139455761394561518c565b146139a45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139b591906156b4565b600485015460408401519192506139d7916001600160401b03909116906159e5565b6001600160401b0316816001600160401b03161115613a565760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a628a846124c7565b915091505f8a83604051602001613a9092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b2b57613b2b61518c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c7d5760405162461bcd60e51b815260040161068a90615912565b5f805b6002811015613ccc57613c948160016156d4565b613c9f90600861564b565b61ffff16858281518110613cb557613cb5615413565b016020015160f81c901b9190911790600101613c80565b5061ffff811615613cef5760405162461bcd60e51b815260040161068a9061595b565b5f805b6004811015613d4a57613d068160036156d4565b613d1190600861564b565b63ffffffff1686613d23836002615616565b81518110613d3357613d33615413565b016020015160f81c901b9190911790600101613cf2565b5063ffffffff8116600514613d715760405162461bcd60e51b815260040161068a9061599e565b5f805b6020811015613dc657613d8881601f6156d4565b613d9390600861564b565b87613d9f836006615616565b81518110613daf57613daf615413565b016020015160f81c901b9190911790600101613d74565b505f805b6008811015613e2557613dde8160076156d4565b613de990600861564b565b6001600160401b031688613dfe836026615616565b81518110613e0e57613e0e615413565b016020015160f81c901b9190911790600101613dca565b5090969095509350505050565b5f80516020615be68339815191525f6001600160401b038084169085161115613e6657613e5f838561526a565b9050613e73565b613e70848461526a565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ed5575060028401548151613ed1916001600160401b031690615616565b8210155b15613efb576001600160401b038316606082015281815260408101516020820152613f1a565b8281606001818151613f0d91906156b4565b6001600160401b03169052505b6060810151613f2a9060646159e5565b602082015160028601546001600160401b039290921691613f559190600160401b900460ff1661564b565b1015613fb95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fd49190615616565b9052506040810180516001600160401b0387169190613ff49083906156d4565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c268339815191526020526040812060020180545f80516020615be683398151915291600160401b9091046001600160401b031690600861408a83615a10565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661411957604051631afcd79f60e31b815260040160405180910390fd5b565b6141236140d0565b61412c81614787565b6141346147a0565b612854608082013560a083013561415160e0850160c08601615173565b614162610100860160e08701615a2b565b61ffff1661417861012087016101008801615a44565b61418a610140880161012089016153b3565b6147b0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661421a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615be6833981519152426142396040860160208701615173565b6001600160401b0316116142ab5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142bb6040850160208601615173565b6001600160401b03166142d16202a30042615616565b116143445760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b833561439c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143cb5760405162461bcd60e51b815260040161068a9061556e565b60306143da6040860186615a64565b90501461443f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614449835f613e32565b5f806144e36040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061448e9190615173565b6001600160401b031681526020016144a960408a018a615a64565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149f4565b5f828152600786016020526040902091935091506145018282615aea565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061452e9085906004016152c3565b6020604051808303815f875af115801561454a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061456e919061528a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145e6576145e661518c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146c6918e01908e01615173565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147175760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614760576040519150601f19603f3d011682016040523d82523d5f602084013e614765565b606091505b505090508061212d57604051630a12f52160e11b815260040160405180910390fd5b61478f6140d0565b614797614da3565b61285481614dab565b6147a86140d0565b614119614f4d565b6147b86140d0565b5f80516020615ba6833981519152836148245760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148465760405162461bcd60e51b815260040161068a906158c7565b858711156148ae5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff161161491b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff8416111561498d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a5e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ad557614a958160016156d4565b614aa090600861564b565b5081515f90839083908110614ab757614ab7615413565b60200101906001600160f81b03191690815f1a905350600101614a81565b505f5b6004811015614b3d57614aec8160036156d4565b614af790600861564b565b600160ff919091161c60f81b82614b0f836002615616565b81518110614b1f57614b1f615413565b60200101906001600160f81b03191690815f1a905350600101614ad8565b505f5b6020811015614b9a5784518160208110614b5c57614b5c615413565b1a60f81b82614b6c836006615616565b81518110614b7c57614b7c615413565b60200101906001600160f81b03191690815f1a905350600101614b40565b505f5b6020811015614bfa5784602001518160208110614bbc57614bbc615413565b1a60f81b82614bcc836026615616565b81518110614bdc57614bdc615413565b60200101906001600160f81b03191690815f1a905350600101614b9d565b505f5b6008811015614c6e57614c118160076156d4565b614c1c90600861564b565b60ff1685604001516001600160401b0316901c60f81b82826046614c409190615616565b81518110614c5057614c50615413565b60200101906001600160f81b03191690815f1a905350600101614bfd565b505f5b6030811015614cd95784608001518181518110614c9057614c90615413565b01602001516001600160f81b03191682614cab83604e615616565b81518110614cbb57614cbb615413565b60200101906001600160f81b03191690815f1a905350600101614c71565b505f5b6008811015614d4b57614cf08160076156d4565b614cfb90600861564b565b60608601516001600160401b0390811691161c60f81b82614d1d83607e615616565b81518110614d2d57614d2d615413565b60200101906001600160f81b03191690815f1a905350600101614cdc565b50600281604051614d5c9190615605565b602060405180830381855afa158015614d77573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d9a919061528a565b94909350915050565b6141196140d0565b614db36140d0565b80355f80516020615be683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614dff6080840160608501615a44565b60ff161115614e6c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e7d6080840160608501615a44565b60ff1611614ee55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614ef56080830160608401615a44565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f266060830160408401615173565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612af86140d0565b508054614f61906156e7565b5f825580601f10614f70575050565b601f0160209004905f5260205f20908101906128549190614fc8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fdc575f8155600101614fc9565b5090565b8015158114612854575f80fd5b803563ffffffff8116811461215e575f80fd5b5f805f60608486031215615012575f80fd5b83359250602084013561502481614fe0565b915061503260408501614fed565b90509250925092565b5f6020828403121561504b575f80fd5b5035919050565b5f6101408284031215615063575f80fd5b50919050565b803561ffff8116811461215e575f80fd5b80356001600160401b038116811461215e575f80fd5b5f805f606084860312156150a2575f80fd5b83356001600160401b038111156150b7575f80fd5b8401606081870312156150c8575f80fd5b92506150d660208501615069565b91506150326040850161507a565b5f602082840312156150f4575f80fd5b610cb182614fed565b5f806040838503121561510e575f80fd5b61511783614fed565b946020939093013593505050565b5f8060408385031215615136575f80fd5b82356001600160401b0381111561514b575f80fd5b83016080818603121561515c575f80fd5b915061516a60208401614fed565b90509250929050565b5f60208284031215615183575f80fd5b610cb18261507a565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151c357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151fe60608401826001600160401b03169052565b50608083015161521960808401826001600160401b03169052565b5060a083015161523460a08401826001600160401b03169052565b5060c083015161524f60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561524f5761524f615256565b5f6020828403121561529a575f80fd5b5051919050565b5f5b838110156152bb5781810151838201526020016152a3565b50505f910152565b602081525f82518060208401526152e18160408501602087016152a1565b601f01601f19169190910160400192915050565b5f8261530f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612854575f80fd5b5f602082840312156153c3575f80fd5b8135610cb18161539f565b5f808335601e198436030181126153e3575f80fd5b8301803591506001600160401b038211156153fc575f80fd5b6020019150600581901b3603821315612617575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261543b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561547b5761547b615445565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154a9576154a9615445565b604052919050565b5f6001600160401b038211156154c9576154c9615445565b50601f01601f191660200190565b5f606082360312156154e7575f80fd5b6154ef615459565b82358152602061550081850161507a565b8183015260408401356001600160401b0381111561551c575f80fd5b840136601f82011261552c575f80fd5b803561553f61553a826154b1565b615481565b8181523684838501011115615552575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155c7818460208a016152a1565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155f78160288401602088016152a1565b016028019695505050505050565b5f825161543b8184602087016152a1565b80820180821115610c7e57610c7e615256565b5f63ffffffff80831681810361564157615641615256565b6001019392505050565b8082028115828204841417610c7e57610c7e615256565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561524f5761524f615256565b81810381811115610c7e57610c7e615256565b600181811c908216806156fb57607f821691505b60208210810361506357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615772816156e7565b806020870152604060018084165f811461579357600181146157af576157dc565b60ff19851660408a0152604084151560051b8a010195506157dc565b895f5260205f205f5b858110156157d35781548b82018601529083019088016157b8565b8a016040019650505b509398975050505050505050565b805161215e81614fe0565b5f8060408385031215615806575f80fd5b82516001600160401b038082111561581c575f80fd5b908401906060828703121561582f575f80fd5b615837615459565b8251815260208084015161584a8161539f565b8282015260408401518381111561585f575f80fd5b80850194505087601f850112615873575f80fd5b8351925061588361553a846154b1565b8381528882858701011115615896575f80fd5b6158a5848383018488016152a1565b806040840152508195506158ba8188016157ea565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0857615a08615256565b505092915050565b5f6001600160401b0380831681810361564157615641615256565b5f60208284031215615a3b575f80fd5b610cb182615069565b5f60208284031215615a54575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a79575f80fd5b8301803591506001600160401b03821115615a92575f80fd5b602001915036819003821315612617575f80fd5b601f82111561212d57805f5260205f20601f840160051c81016020851015615acb5750805b601f840160051c820191505b81811015610d51575f8155600101615ad7565b81516001600160401b03811115615b0357615b03615445565b615b1781615b1184546156e7565b84615aa6565b602080601f831160018114615b4a575f8415615b335750858301515b5f19600386901b1c1916600185901b178555612eee565b5f85815260208120601f198616915b82811015615b7857888601518255948401946001909101908401615b59565b5085821015615b9557878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index 8a7026f58..ee6af6395 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -164,17 +164,17 @@ abstract contract PoSValidatorManager is Validator memory validator = _initializeEndValidation(validationID); - if (_isPoSValidator(validationID)) { - // PoS validations can only be ended by their owners. - require( - $._validatorRequirements[validationID].owner == _msgSender(), - "PoSValidatorManager: validator not owned by sender" - ); - } else { - // Non-PoS validations can be ended by anyone, and do not get rewards, so return here. + // Non-PoS validators are required to boostrap the network, but are not eligible for rewards. + if (!_isPoSValidator(validationID)) { return; } + // PoS validations can only be ended by their owners. + require( + $._validatorRequirements[validationID].owner == _msgSender(), + "PoSValidatorManager: validator not owned by sender" + ); + // Check that minimum stake duration has passed. require( validator.endedAt From db44dab675b92580e83100ceed47ddccc76067ac Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 10:13:34 -0400 Subject: [PATCH 364/545] Emit rewards and fees on delegator exit --- .../ERC20TokenStakingManager.go | 18 +++++++++------- .../NativeTokenStakingManager.go | 18 +++++++++------- contracts/staking/PoSValidatorManager.sol | 5 +++-- .../interfaces/IPoSValidatorManager.sol | 6 +++++- .../tests/PoSValidatorManagerTests.t.sol | 21 +++++++++++++------ 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 7d787d8c7..cebf9195c 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,8 +83,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160e13803806160e183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f948061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152a5565b6103ec565b005b61019e6101ae3660046152e0565b610890565b6101f16101c13660046152e0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152e0565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e61025736600461530b565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615349565b610b3e565b61019e610299366004615362565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c936600461538a565b610db3565b6101f16102dc3660046153ee565b6113e7565b6102316102ef3660046152e0565b611400565b61019e6103023660046152a5565b611414565b61020c603081565b61019e61031d3660046152e0565b611657565b61019e610330366004615362565b61175d565b6101f1610343366004615407565b611a66565b61019e610356366004615349565b611a92565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152e0565b611c4a565b61019e6103a23660046152e0565b611ed0565b61020c601481565b6103c26103bd3660046152e0565b611fe4565b6040516101fb919061543b565b6102316202a30081565b6101f16103e7366004615502565b6120ac565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee883398151915293929190829060ff16600481111561044d5761044d615427565b600481111561045e5761045e615427565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fe4565b90506002835160048111156104f9576104f9615427565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f088339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f088339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615427565b036106235786156105e4576105e183876120e1565b90505b5f846060015183608001516105f9919061557b565b9050610605848261237d565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b919061559b565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615427565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f688339815191526020526040808220815160e0810190925280545f80516020615f2883398151915293929190829060ff1660058111156108dd576108dd615427565b60058111156108ee576108ee615427565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615427565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124d4565b6040518263ffffffff1660e01b8152600401610a0391906155d4565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a43919061559b565b50505050565b5f610a5964e8d4a5100083615606565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af184846126fb565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615ee88339815191525f80610b5784612715565b91509150610b6482612a5f565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615427565b03610bc1575f83815260088501602052604081208054919055610bbf8282612a9a565b505b610bd781610bd284604001516113e7565b612b10565b5050505050565b5f80516020615ee88339815191525f610bf684612b33565b90505f80610c078360400151612d0d565b50915091505f610c1683611fe4565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b815260040161054290615625565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615667565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615427565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f288339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb7919061559b565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156b0565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156cb565b91505f9050843560208601356014610fc86060890160408a016156b0565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156cb565b8363ffffffff1681811061105e5761105e615710565b90506020028101906110709190615724565b611079906157d4565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b81526004016105429061586b565b84825f0151836020015184604001516040516020016110ce94939291906158b3565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c9190615902565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a919061559b565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615427565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611299911686615913565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615926565b905061102c565b50600584018190555f61130986612b33565b90505f6113198260400151612f48565b90508060028560405161132c9190615902565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a919061559b565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615948565b5f61140a82611fe4565b6080015192915050565b5f80516020615ee88339815191525f61142c856130ba565b905061143785612a5f565b611442575050505050565b5f8581526005830160205260409020546001600160a01b031633146114795760405162461bcd60e51b81526004016105429061595f565b5f85815260058301602052604090205460a08201516114a891600160b01b90046001600160401b0316906159b1565b6001600160401b03168160c001516001600160401b031610156115295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153a86856120e1565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611591906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611607573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162b919061559b565b5f8781526008850160205260408120805490919061164a908490615913565b9091555050505050505050565b5f80516020615ee88339815191525f61166f83611fe4565b905060048151600581111561168657611686615427565b146116f05760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117275760405162461bcd60e51b81526004016105429061595f565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612a9a565b611765613335565b5f80516020615ee88339815191525f61177d84612b33565b90505f8061178e8360400151612d0d565b50915091505f61179d83611fe4565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d7576117d7615427565b60048111156117e8576117e8615427565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118cc5760405162461bcd60e51b815260040161054290615625565b826001600160401b03168160e001516001600160401b031611156119025760405162461bcd60e51b815260040161054290615667565b60038151600481111561191757611917615427565b1461196b5760405162461bcd60e51b815260206004820152603160248201525f80516020615f088339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119ac90600160a01b900461ffff1684615948565b6119b69190615606565b905080886008015f8881526020019081526020015f205f8282546119da9190615913565b909155505060208301516119f7906119f283856159d1565b612a9a565b611a0c8360200151610bd285606001516113e7565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611a6260015f80516020615f4883398151915255565b5050565b5f611a6f613335565b611a7a83338461337f565b9050610a5960015f80516020615f4883398151915255565b5f80516020615f288339815191525f611aaa83612b33565b90505f80611abb8360400151613739565b9150915080611b1d5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b37906159e4565b9050118015611b69575060015f83815260088601602052604090205460ff166005811115611b6757611b67615427565b145b611b855760405162461bcd60e51b815260040161054290615a1c565b5f8281526007850160205260408120611b9d916151f5565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ee883398151915293929190829060ff166004811115611cab57611cab615427565b6004811115611cbc57611cbc615427565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d4357611d43615427565b1480611d615750600381516004811115611d5f57611d5f615427565b145b611db55760405162461bcd60e51b815260206004820152603260248201525f80516020615f08833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dc38260400151611fe4565b905080606001516001600160401b03165f03611e475760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e748460400151846060015185608001516124d4565b6040518263ffffffff1660e01b8152600401611e9091906155d4565b6020604051808303815f875af1158015611eac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd7919061559b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f28833981519152929190611f18906159e4565b9050118015611f4a575060015f83815260088301602052604090205460ff166005811115611f4857611f48615427565b145b611f665760405162461bcd60e51b815260040161054290615a1c565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f9f9190600401615a63565b6020604051808303815f875af1158015611fbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fdf919061559b565b505050565b611fec61522c565b5f8281525f80516020615f68833981519152602052604090819020815160e0810190925280545f80516020615f28833981519152929190829060ff16600581111561203957612039615427565b600581111561204a5761204a615427565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120b5613335565b6120c1858585856138da565b90506120d960015f80516020615f4883398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561212c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121539190810190615af8565b91509150806121b65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061221d919061559b565b8251146122815760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156122f75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123068460400151613b4f565b915091508187146123735760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f68833981519152602052604081206002015481905f80516020615f2883398151915290600160801b90046001600160401b03166123c58582613d27565b5f6123cf87613f35565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61241f8a858b6124d4565b6040518263ffffffff1660e01b815260040161243b91906155d4565b6020604051808303815f875af1158015612457573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247b919061559b565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561254d5761250d8160016159d1565b612518906008615948565b5081515f9083908390811061252f5761252f615710565b60200101906001600160f81b03191690815f1a9053506001016124f9565b505f5b60048110156125b8576125648160036159d1565b61256f906008615948565b600263ffffffff16901c60f81b8282600261258a9190615913565b8151811061259a5761259a615710565b60200101906001600160f81b03191690815f1a905350600101612550565b505f5b602081101561261a576125cf81601f6159d1565b6125da906008615948565b86901c60f81b826125ec836006615913565b815181106125fc576125fc615710565b60200101906001600160f81b03191690815f1a9053506001016125bb565b505f5b6008811015612685576126318160076159d1565b61263c906008615948565b6001600160401b038616901c60f81b82612657836026615913565b8151811061266757612667615710565b60200101906001600160f81b03191690815f1a90535060010161261d565b505f5b60088110156126f05761269c8160076159d1565b6126a7906008615948565b6001600160401b038516901c60f81b826126c283602e615913565b815181106126d2576126d2615710565b60200101906001600160f81b03191690815f1a905350600101612688565b5090505b9392505050565b612703613fc5565b61270c82614010565b611a6281614087565b5f61271e61522c565b5f80516020615f288339815191525f61273685612b33565b90505f806127478360400151613739565b9150915080156127ac5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127dd576127dd615427565b60058111156127ee576127ee615427565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561285f5761285f615427565b148061287d575060018251600581111561287b5761287b615427565b145b6128dc5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b6003825160058111156128f1576128f1615427565b036128fe57506004612902565b5060055b6020808301515f9081526009880190915260408120558181600581111561292b5761292b615427565b9081600581111561293e5761293e615427565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561297257612972615427565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a2657612a26615427565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ec883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612af5575f80fd5b505af1158015612b07573d5f803e3d5ffd5b50505050505050565b5f80516020615ec883398151915254611a62906001600160a01b03168383614128565b60408051606080820183525f8083526020830181905292820152905f80516020615f288339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ba8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bcf9190810190615af8565b9150915080612c2f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612c925760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612d055760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d315760405162461bcd60e51b815260040161054290615bca565b5f805b6002811015612d8057612d488160016159d1565b612d53906008615948565b61ffff16868281518110612d6957612d69615710565b016020015160f81c901b9190911790600101612d34565b5061ffff811615612da35760405162461bcd60e51b815260040161054290615c13565b5f805b6004811015612dfe57612dba8160036159d1565b612dc5906008615948565b63ffffffff1687612dd7836002615913565b81518110612de757612de7615710565b016020015160f81c901b9190911790600101612da6565b5063ffffffff8116600414612e255760405162461bcd60e51b815260040161054290615c56565b5f805b6020811015612e7a57612e3c81601f6159d1565b612e47906008615948565b88612e53836006615913565b81518110612e6357612e63615710565b016020015160f81c901b9190911790600101612e28565b505f805b6008811015612ed957612e928160076159d1565b612e9d906008615948565b6001600160401b031689612eb2836026615913565b81518110612ec257612ec2615710565b016020015160f81c901b9190911790600101612e7e565b505f805b6008811015612f3857612ef18160076159d1565b612efc906008615948565b6001600160401b03168a612f1183602e615913565b81518110612f2157612f21615710565b016020015160f81c901b9190911790600101612edd565b5091989097509095509350505050565b5f8151602614612f6a5760405162461bcd60e51b815260040161054290615bca565b5f805b6002811015612fb957612f818160016159d1565b612f8c906008615948565b61ffff16848281518110612fa257612fa2615710565b016020015160f81c901b9190911790600101612f6d565b5061ffff811615612fdc5760405162461bcd60e51b815260040161054290615c13565b5f805b600481101561303757612ff38160036159d1565b612ffe906008615948565b63ffffffff1685613010836002615913565b8151811061302057613020615710565b016020015160f81c901b9190911790600101612fdf565b5063ffffffff81161561305c5760405162461bcd60e51b815260040161054290615c56565b5f805b60208110156130b15761307381601f6159d1565b61307e906008615948565b8661308a836006615913565b8151811061309a5761309a615710565b016020015160f81c901b919091179060010161305f565b50949350505050565b6130c261522c565b5f8281525f80516020615f688339815191526020526040808220815160e0810190925280545f80516020615f2883398151915293929190829060ff16600581111561310f5761310f615427565b600581111561312057613120615427565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561319257613192615427565b146131ee5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561323257613232615427565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132de858261237d565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f4883398151915280546001190161336657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f4883398151915255565b5f5f80516020615ee88339815191528161339b61022c85614187565b90505f6133a787611fe4565b90506133b287612a5f565b61340f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561342457613424615427565b146134835760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f82826080015161349491906159b1565b600485015460408401519192506134b6916001600160401b0390911690615c9d565b6001600160401b0316816001600160401b031611156135355760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f806135418a8461237d565b915091505f8a8360405160200161356f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561360a5761360a615427565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461375c5760405162461bcd60e51b815260040161054290615bca565b5f805b60028110156137ab576137738160016159d1565b61377e906008615948565b61ffff1685828151811061379457613794615710565b016020015160f81c901b919091179060010161375f565b5061ffff8116156137ce5760405162461bcd60e51b815260040161054290615c13565b5f805b6004811015613829576137e58160036159d1565b6137f0906008615948565b63ffffffff1686613802836002615913565b8151811061381257613812615710565b016020015160f81c901b91909117906001016137d1565b5063ffffffff81166003146138505760405162461bcd60e51b815260040161054290615c56565b5f805b60208110156138a55761386781601f6159d1565b613872906008615948565b8761387e836006615913565b8151811061388e5761388e615710565b016020015160f81c901b9190911790600101613853565b505f866026815181106138ba576138ba615710565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ee88339815191529061ffff861610801590613926575061271061ffff861611155b6139425760405162461bcd60e51b815260040161054290615cc8565b60028101546001600160401b0390811690851610156139bb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613a855760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613a8f84614187565b90505f613a9b82610a49565b90505f613aa889836141aa565b90506040518060600160405280613abc3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b725760405162461bcd60e51b815260040161054290615bca565b5f805b6002811015613bc157613b898160016159d1565b613b94906008615948565b61ffff16858281518110613baa57613baa615710565b016020015160f81c901b9190911790600101613b75565b5061ffff811615613be45760405162461bcd60e51b815260040161054290615c13565b5f805b6004811015613c3f57613bfb8160036159d1565b613c06906008615948565b63ffffffff1686613c18836002615913565b81518110613c2857613c28615710565b016020015160f81c901b9190911790600101613be7565b5063ffffffff8116600514613c665760405162461bcd60e51b815260040161054290615c56565b5f805b6020811015613cbb57613c7d81601f6159d1565b613c88906008615948565b87613c94836006615913565b81518110613ca457613ca4615710565b016020015160f81c901b9190911790600101613c69565b505f805b6008811015613d1a57613cd38160076159d1565b613cde906008615948565b6001600160401b031688613cf3836026615913565b81518110613d0357613d03615710565b016020015160f81c901b9190911790600101613cbf565b5090969095509350505050565b5f80516020615f288339815191525f6001600160401b038084169085161115613d5b57613d54838561557b565b9050613d68565b613d65848461557b565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613dca575060028401548151613dc6916001600160401b031690615913565b8210155b15613df0576001600160401b038316606082015281815260408101516020820152613e0f565b8281606001818151613e0291906159b1565b6001600160401b03169052505b6060810151613e1f906064615c9d565b602082015160028601546001600160401b039290921691613e4a9190600160401b900460ff16615948565b1015613eae5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ec99190615913565b9052506040810180516001600160401b0387169190613ee99083906159d1565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f688339815191526020526040812060020180545f80516020615f2883398151915291600160401b9091046001600160401b0316906008613f7f83615d13565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661400e57604051631afcd79f60e31b815260040160405180910390fd5b565b614018613fc5565b6140218161470f565b614029614728565b614084608082013560a083013561404660e0850160c086016153ee565b614057610100860160e08701615d2e565b61ffff1661406d61012087016101008801615d47565b61407f610140880161012089016156b0565b614738565b50565b61408f613fc5565b5f80516020615ec88339815191526001600160a01b0382166141085760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611fdf91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061497c565b5f610a59825f80516020615ec8833981519152546001600160a01b0316906149dd565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f288339815191524261425460408601602087016153ee565b6001600160401b0316116142c65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142d660408501602086016153ee565b6001600160401b03166142ec6202a30042615913565b1161435f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143b75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156143e65760405162461bcd60e51b81526004016105429061586b565b60306143f56040860186615d67565b90501461445a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b614464835f613d27565b5f806144fe6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a991906153ee565b6001600160401b031681526020016144c460408a018a615d67565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b3f565b5f8281526007860160205260409020919350915061451c8282615ded565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145499085906004016155d4565b6020604051808303815f875af1158015614565573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614589919061559b565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561460157614601615427565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e1918e01908e016153ee565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614717613fc5565b61471f614eee565b61408481614ef6565b614730613fc5565b61400e615098565b614740613fc5565b5f80516020615ee8833981519152836147ac5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147ce5760405162461bcd60e51b815260040161054290615cc8565b858711156148365760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff16116148a35760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff841611156149155760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149906001600160a01b038416836150a0565b905080515f141580156149b45750808060200190518101906149b29190615eac565b155b15611fdf57604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a47919061559b565b9050614a5e6001600160a01b0385163330866150ad565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614aa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ac6919061559b565b9050818111614b2c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b3682826159d1565b95945050505050565b5f6060826080015151603014614ba95760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c2057614be08160016159d1565b614beb906008615948565b5081515f90839083908110614c0257614c02615710565b60200101906001600160f81b03191690815f1a905350600101614bcc565b505f5b6004811015614c8857614c378160036159d1565b614c42906008615948565b600160ff919091161c60f81b82614c5a836002615913565b81518110614c6a57614c6a615710565b60200101906001600160f81b03191690815f1a905350600101614c23565b505f5b6020811015614ce55784518160208110614ca757614ca7615710565b1a60f81b82614cb7836006615913565b81518110614cc757614cc7615710565b60200101906001600160f81b03191690815f1a905350600101614c8b565b505f5b6020811015614d455784602001518160208110614d0757614d07615710565b1a60f81b82614d17836026615913565b81518110614d2757614d27615710565b60200101906001600160f81b03191690815f1a905350600101614ce8565b505f5b6008811015614db957614d5c8160076159d1565b614d67906008615948565b60ff1685604001516001600160401b0316901c60f81b82826046614d8b9190615913565b81518110614d9b57614d9b615710565b60200101906001600160f81b03191690815f1a905350600101614d48565b505f5b6030811015614e245784608001518181518110614ddb57614ddb615710565b01602001516001600160f81b03191682614df683604e615913565b81518110614e0657614e06615710565b60200101906001600160f81b03191690815f1a905350600101614dbc565b505f5b6008811015614e9657614e3b8160076159d1565b614e46906008615948565b60608601516001600160401b0390811691161c60f81b82614e6883607e615913565b81518110614e7857614e78615710565b60200101906001600160f81b03191690815f1a905350600101614e27565b50600281604051614ea79190615902565b602060405180830381855afa158015614ec2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614ee5919061559b565b94909350915050565b61400e613fc5565b614efe613fc5565b80355f80516020615f2883398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f4a6080840160608501615d47565b60ff161115614fb75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fc86080840160608501615d47565b60ff16116150305760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b6150406080830160608401615d47565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561507160608301604084016153ee565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61336c613fc5565b60606126f483835f6150e6565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd90608401614155565b60608147101561510b5760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b031684866040516151269190615902565b5f6040518083038185875af1925050503d805f8114615160576040519150601f19603f3d011682016040523d82523d5f602084013e615165565b606091505b509150915061237386838360608261518557615180826151cc565b6126f4565b815115801561519c57506001600160a01b0384163b155b156151c557604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b50806126f4565b8051156151dc5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054615201906159e4565b5f825580601f10615210575050565b601f0160209004905f5260205f20908101906140849190615268565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561527c575f8155600101615269565b5090565b8015158114614084575f80fd5b803563ffffffff811681146152a0575f80fd5b919050565b5f805f606084860312156152b7575f80fd5b8335925060208401356152c981615280565b91506152d76040850161528d565b90509250925092565b5f602082840312156152f0575f80fd5b5035919050565b6001600160a01b0381168114614084575f80fd5b5f8082840361016081121561531e575f80fd5b6101408082121561532d575f80fd5b849350830135905061533e816152f7565b809150509250929050565b5f60208284031215615359575f80fd5b6126f48261528d565b5f8060408385031215615373575f80fd5b61537c8361528d565b946020939093013593505050565b5f806040838503121561539b575f80fd5b82356001600160401b038111156153b0575f80fd5b8301608081860312156153c1575f80fd5b91506153cf6020840161528d565b90509250929050565b80356001600160401b03811681146152a0575f80fd5b5f602082840312156153fe575f80fd5b6126f4826153d8565b5f8060408385031215615418575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061545e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161549960608401826001600160401b03169052565b5060808301516154b460808401826001600160401b03169052565b5060a08301516154cf60a08401826001600160401b03169052565b5060c08301516154ea60c08401826001600160401b03169052565b5092915050565b803561ffff811681146152a0575f80fd5b5f805f8060808587031215615515575f80fd5b84356001600160401b0381111561552a575f80fd5b85016060818803121561553b575f80fd5b9350615549602086016154f1565b9250615557604086016153d8565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156154ea576154ea615567565b5f602082840312156155ab575f80fd5b5051919050565b5f5b838110156155cc5781810151838201526020016155b4565b50505f910152565b602081525f82518060208401526155f28160408501602087016155b2565b601f01601f19169190910160400192915050565b5f8261562057634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156c0575f80fd5b81356126f4816152f7565b5f808335601e198436030181126156e0575f80fd5b8301803591506001600160401b038211156156f9575f80fd5b6020019150600581901b36038213156124cd575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615738575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561577857615778615742565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157a6576157a6615742565b604052919050565b5f6001600160401b038211156157c6576157c6615742565b50601f01601f191660200190565b5f606082360312156157e4575f80fd5b6157ec615756565b8235815260206157fd8185016153d8565b8183015260408401356001600160401b03811115615819575f80fd5b840136601f820112615829575f80fd5b803561583c615837826157ae565b61577e565b818152368483850101111561584f575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158c4818460208a016155b2565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158f48160288401602088016155b2565b016028019695505050505050565b5f82516157388184602087016155b2565b80820180821115610a5957610a59615567565b5f63ffffffff80831681810361593e5761593e615567565b6001019392505050565b8082028115828204841417610a5957610a59615567565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156154ea576154ea615567565b81810381811115610a5957610a59615567565b600181811c908216806159f857607f821691505b602082108103615a1657634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a75816159e4565b806020870152604060018084165f8114615a965760018114615ab257615adf565b60ff19851660408a0152604084151560051b8a01019550615adf565b895f5260205f205f5b85811015615ad65781548b8201860152908301908801615abb565b8a016040019650505b509398975050505050505050565b80516152a081615280565b5f8060408385031215615b09575f80fd5b82516001600160401b0380821115615b1f575f80fd5b9084019060608287031215615b32575f80fd5b615b3a615756565b82518152602080840151615b4d816152f7565b82820152604084015183811115615b62575f80fd5b80850194505087601f850112615b76575f80fd5b83519250615b86615837846157ae565b8381528882858701011115615b99575f80fd5b615ba8848383018488016155b2565b80604084015250819550615bbd818801615aed565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cc057615cc0615567565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361593e5761593e615567565b5f60208284031215615d3e575f80fd5b6126f4826154f1565b5f60208284031215615d57575f80fd5b813560ff811681146126f4575f80fd5b5f808335601e19843603018112615d7c575f80fd5b8301803591506001600160401b03821115615d95575f80fd5b6020019150368190038213156124cd575f80fd5b601f821115611fdf57805f5260205f20601f840160051c81016020851015615dce5750805b601f840160051c820191505b81811015610bd7575f8155600101615dda565b81516001600160401b03811115615e0657615e06615742565b615e1a81615e1484546159e4565b84615da9565b602080601f831160018114615e4d575f8415615e365750858301515b5f19600386901b1c1916600185901b178555615ea4565b5f85815260208120601f198616915b82811015615e7b57888601518255948401946001909101908401615e5c565b5085821015615e9857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ebc575f80fd5b81516126f48161528056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516160fc3803806160fc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615faf8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152c0565b6103ec565b005b61019e6101ae3660046152fb565b610890565b6101f16101c13660046152fb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152fb565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615326565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615364565b610b3e565b61019e61029936600461537d565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c93660046153a5565b610db3565b6101f16102dc366004615409565b6113e7565b6102316102ef3660046152fb565b611400565b61019e6103023660046152c0565b611414565b61020c603081565b61019e61031d3660046152fb565b611657565b61019e61033036600461537d565b61175d565b6101f1610343366004615422565b611a81565b61019e610356366004615364565b611aad565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152fb565b611c65565b61019e6103a23660046152fb565b611eeb565b61020c601481565b6103c26103bd3660046152fb565b611fff565b6040516101fb9190615456565b6102316202a30081565b6101f16103e736600461551d565b6120c7565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f0383398151915293929190829060ff16600481111561044d5761044d615442565b600481111561045e5761045e615442565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fff565b90506002835160048111156104f9576104f9615442565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f238339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f238339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615442565b036106235786156105e4576105e183876120fc565b90505b5f846060015183608001516105f99190615596565b90506106058482612398565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b91906155b6565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615442565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f838339815191526020526040808220815160e0810190925280545f80516020615f4383398151915293929190829060ff1660058111156108dd576108dd615442565b60058111156108ee576108ee615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615442565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124ef565b6040518263ffffffff1660e01b8152600401610a0391906155ef565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4391906155b6565b50505050565b5f610a5964e8d4a5100083615621565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af18484612716565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615f038339815191525f80610b5784612730565b91509150610b6482612a7a565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615442565b03610bc1575f83815260088501602052604081208054919055610bbf8282612ab5565b505b610bd781610bd284604001516113e7565b612b2b565b5050505050565b5f80516020615f038339815191525f610bf684612b4e565b90505f80610c078360400151612d28565b50915091505f610c1683611fff565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b815260040161054290615640565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615682565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615442565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f438339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb791906155b6565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156cb565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156e6565b91505f9050843560208601356014610fc86060890160408a016156cb565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156e6565b8363ffffffff1681811061105e5761105e61572b565b9050602002810190611070919061573f565b611079906157ef565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b815260040161054290615886565b84825f0151836020015184604001516040516020016110ce94939291906158ce565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c919061591d565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a91906155b6565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615442565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129991168661592e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615941565b905061102c565b50600584018190555f61130986612b4e565b90505f6113198260400151612f63565b90508060028560405161132c919061591d565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a91906155b6565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615963565b5f61140a82611fff565b6080015192915050565b5f80516020615f038339815191525f61142c856130d5565b905061143785612a7a565b611442575050505050565b5f8581526005830160205260409020546001600160a01b031633146114795760405162461bcd60e51b81526004016105429061597a565b5f85815260058301602052604090205460a08201516114a891600160b01b90046001600160401b0316906159cc565b6001600160401b03168160c001516001600160401b031610156115295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153a86856120fc565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611591906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611607573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162b91906155b6565b5f8781526008850160205260408120805490919061164a90849061592e565b9091555050505050505050565b5f80516020615f038339815191525f61166f83611fff565b905060048151600581111561168657611686615442565b146116f05760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117275760405162461bcd60e51b81526004016105429061597a565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612ab5565b611765613350565b5f80516020615f038339815191525f61177d84612b4e565b90505f8061178e8360400151612d28565b50915091505f61179d83611fff565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d7576117d7615442565b60048111156117e8576117e8615442565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118cc5760405162461bcd60e51b815260040161054290615640565b826001600160401b03168160e001516001600160401b031611156119025760405162461bcd60e51b815260040161054290615682565b60038151600481111561191757611917615442565b1461196b5760405162461bcd60e51b815260206004820152603160248201525f80516020615f238339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119ac90600160a01b900461ffff1684615963565b6119b69190615621565b905080886008015f8881526020019081526020015f205f8282546119da919061592e565b909155505f90506119eb82846159ec565b90506119fb846020015182612ab5565b611a108460200151610bd286606001516113e7565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611a56929190918252602082015260400190565b60405180910390a4505050505050505050611a7d60015f80516020615f6383398151915255565b5050565b5f611a8a613350565b611a9583338461339a565b9050610a5960015f80516020615f6383398151915255565b5f80516020615f438339815191525f611ac583612b4e565b90505f80611ad68360400151613754565b9150915080611b385760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b52906159ff565b9050118015611b84575060015f83815260088601602052604090205460ff166005811115611b8257611b82615442565b145b611ba05760405162461bcd60e51b815260040161054290615a37565b5f8281526007850160205260408120611bb891615210565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f0383398151915293929190829060ff166004811115611cc657611cc6615442565b6004811115611cd757611cd7615442565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5e57611d5e615442565b1480611d7c5750600381516004811115611d7a57611d7a615442565b145b611dd05760405162461bcd60e51b815260206004820152603260248201525f80516020615f23833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dde8260400151611fff565b905080606001516001600160401b03165f03611e625760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e8f8460400151846060015185608001516124ef565b6040518263ffffffff1660e01b8152600401611eab91906155ef565b6020604051808303815f875af1158015611ec7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd791906155b6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f43833981519152929190611f33906159ff565b9050118015611f65575060015f83815260088301602052604090205460ff166005811115611f6357611f63615442565b145b611f815760405162461bcd60e51b815260040161054290615a37565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fba9190600401615a7e565b6020604051808303815f875af1158015611fd6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffa91906155b6565b505050565b612007615247565b5f8281525f80516020615f83833981519152602052604090819020815160e0810190925280545f80516020615f43833981519152929190829060ff16600581111561205457612054615442565b600581111561206557612065615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120d0613350565b6120dc858585856138f5565b90506120f460015f80516020615f6383398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612147573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261216e9190810190615b13565b91509150806121d15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612214573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223891906155b6565b82511461229c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156123125760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123218460400151613b6a565b9150915081871461238e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f83833981519152602052604081206002015481905f80516020615f4383398151915290600160801b90046001600160401b03166123e08582613d42565b5f6123ea87613f50565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61243a8a858b6124ef565b6040518263ffffffff1660e01b815260040161245691906155ef565b6020604051808303815f875af1158015612472573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249691906155b6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612568576125288160016159ec565b612533906008615963565b5081515f9083908390811061254a5761254a61572b565b60200101906001600160f81b03191690815f1a905350600101612514565b505f5b60048110156125d35761257f8160036159ec565b61258a906008615963565b600263ffffffff16901c60f81b828260026125a5919061592e565b815181106125b5576125b561572b565b60200101906001600160f81b03191690815f1a90535060010161256b565b505f5b6020811015612635576125ea81601f6159ec565b6125f5906008615963565b86901c60f81b8261260783600661592e565b815181106126175761261761572b565b60200101906001600160f81b03191690815f1a9053506001016125d6565b505f5b60088110156126a05761264c8160076159ec565b612657906008615963565b6001600160401b038616901c60f81b8261267283602661592e565b815181106126825761268261572b565b60200101906001600160f81b03191690815f1a905350600101612638565b505f5b600881101561270b576126b78160076159ec565b6126c2906008615963565b6001600160401b038516901c60f81b826126dd83602e61592e565b815181106126ed576126ed61572b565b60200101906001600160f81b03191690815f1a9053506001016126a3565b5090505b9392505050565b61271e613fe0565b6127278261402b565b611a7d816140a2565b5f612739615247565b5f80516020615f438339815191525f61275185612b4e565b90505f806127628360400151613754565b9150915080156127c75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f8576127f8615442565b600581111561280957612809615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561287a5761287a615442565b1480612898575060018251600581111561289657612896615442565b145b6128f75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b60038251600581111561290c5761290c615442565b036129195750600461291d565b5060055b6020808301515f9081526009880190915260408120558181600581111561294657612946615442565b9081600581111561295957612959615442565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561298d5761298d615442565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a4157612a41615442565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ee383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b10575f80fd5b505af1158015612b22573d5f803e3d5ffd5b50505050505050565b5f80516020615ee383398151915254611a7d906001600160a01b03168383614143565b60408051606080820183525f8083526020830181905292820152905f80516020615f438339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bc3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bea9190810190615b13565b9150915080612c4a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612cad5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612d205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d4c5760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015612d9b57612d638160016159ec565b612d6e906008615963565b61ffff16868281518110612d8457612d8461572b565b016020015160f81c901b9190911790600101612d4f565b5061ffff811615612dbe5760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015612e1957612dd58160036159ec565b612de0906008615963565b63ffffffff1687612df283600261592e565b81518110612e0257612e0261572b565b016020015160f81c901b9190911790600101612dc1565b5063ffffffff8116600414612e405760405162461bcd60e51b815260040161054290615c71565b5f805b6020811015612e9557612e5781601f6159ec565b612e62906008615963565b88612e6e83600661592e565b81518110612e7e57612e7e61572b565b016020015160f81c901b9190911790600101612e43565b505f805b6008811015612ef457612ead8160076159ec565b612eb8906008615963565b6001600160401b031689612ecd83602661592e565b81518110612edd57612edd61572b565b016020015160f81c901b9190911790600101612e99565b505f805b6008811015612f5357612f0c8160076159ec565b612f17906008615963565b6001600160401b03168a612f2c83602e61592e565b81518110612f3c57612f3c61572b565b016020015160f81c901b9190911790600101612ef8565b5091989097509095509350505050565b5f8151602614612f855760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015612fd457612f9c8160016159ec565b612fa7906008615963565b61ffff16848281518110612fbd57612fbd61572b565b016020015160f81c901b9190911790600101612f88565b5061ffff811615612ff75760405162461bcd60e51b815260040161054290615c2e565b5f805b60048110156130525761300e8160036159ec565b613019906008615963565b63ffffffff168561302b83600261592e565b8151811061303b5761303b61572b565b016020015160f81c901b9190911790600101612ffa565b5063ffffffff8116156130775760405162461bcd60e51b815260040161054290615c71565b5f805b60208110156130cc5761308e81601f6159ec565b613099906008615963565b866130a583600661592e565b815181106130b5576130b561572b565b016020015160f81c901b919091179060010161307a565b50949350505050565b6130dd615247565b5f8281525f80516020615f838339815191526020526040808220815160e0810190925280545f80516020615f4383398151915293929190829060ff16600581111561312a5761312a615442565b600581111561313b5761313b615442565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131ad576131ad615442565b146132095760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561324d5761324d615442565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132f98582612398565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f6383398151915280546001190161338157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f6383398151915255565b5f5f80516020615f03833981519152816133b661022c856141a2565b90505f6133c287611fff565b90506133cd87612a7a565b61342a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561343f5761343f615442565b1461349e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f8282608001516134af91906159cc565b600485015460408401519192506134d1916001600160401b0390911690615cb8565b6001600160401b0316816001600160401b031611156135505760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f8061355c8a84612398565b915091505f8a8360405160200161358a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561362557613625615442565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137775760405162461bcd60e51b815260040161054290615be5565b5f805b60028110156137c65761378e8160016159ec565b613799906008615963565b61ffff168582815181106137af576137af61572b565b016020015160f81c901b919091179060010161377a565b5061ffff8116156137e95760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015613844576138008160036159ec565b61380b906008615963565b63ffffffff168661381d83600261592e565b8151811061382d5761382d61572b565b016020015160f81c901b91909117906001016137ec565b5063ffffffff811660031461386b5760405162461bcd60e51b815260040161054290615c71565b5f805b60208110156138c05761388281601f6159ec565b61388d906008615963565b8761389983600661592e565b815181106138a9576138a961572b565b016020015160f81c901b919091179060010161386e565b505f866026815181106138d5576138d561572b565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615f038339815191529061ffff861610801590613941575061271061ffff861611155b61395d5760405162461bcd60e51b815260040161054290615ce3565b60028101546001600160401b0390811690851610156139d65760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a395760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613aa05760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613aaa846141a2565b90505f613ab682610a49565b90505f613ac389836141c5565b90506040518060600160405280613ad73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b8d5760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015613bdc57613ba48160016159ec565b613baf906008615963565b61ffff16858281518110613bc557613bc561572b565b016020015160f81c901b9190911790600101613b90565b5061ffff811615613bff5760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015613c5a57613c168160036159ec565b613c21906008615963565b63ffffffff1686613c3383600261592e565b81518110613c4357613c4361572b565b016020015160f81c901b9190911790600101613c02565b5063ffffffff8116600514613c815760405162461bcd60e51b815260040161054290615c71565b5f805b6020811015613cd657613c9881601f6159ec565b613ca3906008615963565b87613caf83600661592e565b81518110613cbf57613cbf61572b565b016020015160f81c901b9190911790600101613c84565b505f805b6008811015613d3557613cee8160076159ec565b613cf9906008615963565b6001600160401b031688613d0e83602661592e565b81518110613d1e57613d1e61572b565b016020015160f81c901b9190911790600101613cda565b5090969095509350505050565b5f80516020615f438339815191525f6001600160401b038084169085161115613d7657613d6f8385615596565b9050613d83565b613d808484615596565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613de5575060028401548151613de1916001600160401b03169061592e565b8210155b15613e0b576001600160401b038316606082015281815260408101516020820152613e2a565b8281606001818151613e1d91906159cc565b6001600160401b03169052505b6060810151613e3a906064615cb8565b602082015160028601546001600160401b039290921691613e659190600160401b900460ff16615963565b1015613ec95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ee4919061592e565b9052506040810180516001600160401b0387169190613f049083906159ec565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f838339815191526020526040812060020180545f80516020615f4383398151915291600160401b9091046001600160401b0316906008613f9a83615d2e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402957604051631afcd79f60e31b815260040160405180910390fd5b565b614033613fe0565b61403c8161472a565b614044614743565b61409f608082013560a083013561406160e0850160c08601615409565b614072610100860160e08701615d49565b61ffff1661408861012087016101008801615d62565b61409a610140880161012089016156cb565b614753565b50565b6140aa613fe0565b5f80516020615ee38339815191526001600160a01b0382166141235760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ffa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614997565b5f610a59825f80516020615ee3833981519152546001600160a01b0316906149f8565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f438339815191524261426f6040860160208701615409565b6001600160401b0316116142e15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142f16040850160208601615409565b6001600160401b03166143076202a3004261592e565b1161437a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143d25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156144015760405162461bcd60e51b815260040161054290615886565b60306144106040860186615d82565b9050146144755760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b61447f835f613d42565b5f806145196040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144c49190615409565b6001600160401b031681526020016144df60408a018a615d82565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b5a565b5f828152600786016020526040902091935091506145378282615e08565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145649085906004016155ef565b6020604051808303815f875af1158015614580573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a491906155b6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561461c5761461c615442565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146fc918e01908e01615409565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614732613fe0565b61473a614f09565b61409f81614f11565b61474b613fe0565b6140296150b3565b61475b613fe0565b5f80516020615f03833981519152836147c75760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147e95760405162461bcd60e51b815260040161054290615ce3565b858711156148515760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff16116148be5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff841611156149305760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149ab6001600160a01b038416836150bb565b905080515f141580156149cf5750808060200190518101906149cd9190615ec7565b155b15611ffa57604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a6291906155b6565b9050614a796001600160a01b0385163330866150c8565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614abd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ae191906155b6565b9050818111614b475760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b5182826159ec565b95945050505050565b5f6060826080015151603014614bc45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3b57614bfb8160016159ec565b614c06906008615963565b5081515f90839083908110614c1d57614c1d61572b565b60200101906001600160f81b03191690815f1a905350600101614be7565b505f5b6004811015614ca357614c528160036159ec565b614c5d906008615963565b600160ff919091161c60f81b82614c7583600261592e565b81518110614c8557614c8561572b565b60200101906001600160f81b03191690815f1a905350600101614c3e565b505f5b6020811015614d005784518160208110614cc257614cc261572b565b1a60f81b82614cd283600661592e565b81518110614ce257614ce261572b565b60200101906001600160f81b03191690815f1a905350600101614ca6565b505f5b6020811015614d605784602001518160208110614d2257614d2261572b565b1a60f81b82614d3283602661592e565b81518110614d4257614d4261572b565b60200101906001600160f81b03191690815f1a905350600101614d03565b505f5b6008811015614dd457614d778160076159ec565b614d82906008615963565b60ff1685604001516001600160401b0316901c60f81b82826046614da6919061592e565b81518110614db657614db661572b565b60200101906001600160f81b03191690815f1a905350600101614d63565b505f5b6030811015614e3f5784608001518181518110614df657614df661572b565b01602001516001600160f81b03191682614e1183604e61592e565b81518110614e2157614e2161572b565b60200101906001600160f81b03191690815f1a905350600101614dd7565b505f5b6008811015614eb157614e568160076159ec565b614e61906008615963565b60608601516001600160401b0390811691161c60f81b82614e8383607e61592e565b81518110614e9357614e9361572b565b60200101906001600160f81b03191690815f1a905350600101614e42565b50600281604051614ec2919061591d565b602060405180830381855afa158015614edd573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f0091906155b6565b94909350915050565b614029613fe0565b614f19613fe0565b80355f80516020615f4383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f656080840160608501615d62565b60ff161115614fd25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fe36080840160608501615d62565b60ff161161504b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b61505b6080830160608401615d62565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561508c6060830160408401615409565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613387613fe0565b606061270f83835f615101565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd90608401614170565b6060814710156151265760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b03168486604051615141919061591d565b5f6040518083038185875af1925050503d805f811461517b576040519150601f19603f3d011682016040523d82523d5f602084013e615180565b606091505b509150915061238e8683836060826151a05761519b826151e7565b61270f565b81511580156151b757506001600160a01b0384163b155b156151e057604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b508061270f565b8051156151f75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461521c906159ff565b5f825580601f1061522b575050565b601f0160209004905f5260205f209081019061409f9190615283565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615297575f8155600101615284565b5090565b801515811461409f575f80fd5b803563ffffffff811681146152bb575f80fd5b919050565b5f805f606084860312156152d2575f80fd5b8335925060208401356152e48161529b565b91506152f2604085016152a8565b90509250925092565b5f6020828403121561530b575f80fd5b5035919050565b6001600160a01b038116811461409f575f80fd5b5f80828403610160811215615339575f80fd5b61014080821215615348575f80fd5b849350830135905061535981615312565b809150509250929050565b5f60208284031215615374575f80fd5b61270f826152a8565b5f806040838503121561538e575f80fd5b615397836152a8565b946020939093013593505050565b5f80604083850312156153b6575f80fd5b82356001600160401b038111156153cb575f80fd5b8301608081860312156153dc575f80fd5b91506153ea602084016152a8565b90509250929050565b80356001600160401b03811681146152bb575f80fd5b5f60208284031215615419575f80fd5b61270f826153f3565b5f8060408385031215615433575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154b460608401826001600160401b03169052565b5060808301516154cf60808401826001600160401b03169052565b5060a08301516154ea60a08401826001600160401b03169052565b5060c083015161550560c08401826001600160401b03169052565b5092915050565b803561ffff811681146152bb575f80fd5b5f805f8060808587031215615530575f80fd5b84356001600160401b03811115615545575f80fd5b850160608188031215615556575f80fd5b93506155646020860161550c565b9250615572604086016153f3565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561550557615505615582565b5f602082840312156155c6575f80fd5b5051919050565b5f5b838110156155e75781810151838201526020016155cf565b50505f910152565b602081525f825180602084015261560d8160408501602087016155cd565b601f01601f19169190910160400192915050565b5f8261563b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156db575f80fd5b813561270f81615312565b5f808335601e198436030181126156fb575f80fd5b8301803591506001600160401b03821115615714575f80fd5b6020019150600581901b36038213156124e8575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615753575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157935761579361575d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157c1576157c161575d565b604052919050565b5f6001600160401b038211156157e1576157e161575d565b50601f01601f191660200190565b5f606082360312156157ff575f80fd5b615807615771565b8235815260206158188185016153f3565b8183015260408401356001600160401b03811115615834575f80fd5b840136601f820112615844575f80fd5b8035615857615852826157c9565b615799565b818152368483850101111561586a575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158df818460208a016155cd565b80830190508581526001600160401b0360c01b8560c01b166020820152835161590f8160288401602088016155cd565b016028019695505050505050565b5f82516157538184602087016155cd565b80820180821115610a5957610a59615582565b5f63ffffffff80831681810361595957615959615582565b6001019392505050565b8082028115828204841417610a5957610a59615582565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561550557615505615582565b81810381811115610a5957610a59615582565b600181811c90821680615a1357607f821691505b602082108103615a3157634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a90816159ff565b806020870152604060018084165f8114615ab15760018114615acd57615afa565b60ff19851660408a0152604084151560051b8a01019550615afa565b895f5260205f205f5b85811015615af15781548b8201860152908301908801615ad6565b8a016040019650505b509398975050505050505050565b80516152bb8161529b565b5f8060408385031215615b24575f80fd5b82516001600160401b0380821115615b3a575f80fd5b9084019060608287031215615b4d575f80fd5b615b55615771565b82518152602080840151615b6881615312565b82820152604084015183811115615b7d575f80fd5b80850194505087601f850112615b91575f80fd5b83519250615ba1615852846157c9565b8381528882858701011115615bb4575f80fd5b615bc3848383018488016155cd565b80604084015250819550615bd8818801615b08565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cdb57615cdb615582565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361595957615959615582565b5f60208284031215615d59575f80fd5b61270f8261550c565b5f60208284031215615d72575f80fd5b813560ff8116811461270f575f80fd5b5f808335601e19843603018112615d97575f80fd5b8301803591506001600160401b03821115615db0575f80fd5b6020019150368190038213156124e8575f80fd5b601f821115611ffa57805f5260205f20601f840160051c81016020851015615de95750805b601f840160051c820191505b81811015610bd7575f8155600101615df5565b81516001600160401b03811115615e2157615e2161575d565b615e3581615e2f84546159ff565b84615dc4565b602080601f831160018114615e68575f8415615e515750858301515b5f19600386901b1c1916600185901b178555615ebf565b5f85815260208120601f198616915b82811015615e9657888601518255948401946001909101908401615e77565b5085821015615eb357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ed7575f80fd5b815161270f8161529b56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -992,12 +992,14 @@ type ERC20TokenStakingManagerDelegationEnded struct { DelegationID [32]byte ValidationID [32]byte Nonce uint64 + Rewards *big.Int + Fees *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { var delegationIDRule []interface{} @@ -1020,9 +1022,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat return &ERC20TokenStakingManagerDelegationEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { var delegationIDRule []interface{} @@ -1070,9 +1072,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegati }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// ParseDelegationEnded is a log parse operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { event := new(ERC20TokenStakingManagerDelegationEnded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index a21ad1acd..731fe5258 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,8 +83,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615d9f380380615d9f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c528061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004615000565b610534565b005b3480156101c5575f80fd5b506101b86101d436600461503b565b6109d8565b3480156101e4575f80fd5b506102236101f336600461503b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b8610276366004615052565b610b91565b348015610286575f80fd5b5061029a61029536600461503b565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a366004615090565b610c84565b34801561032a575f80fd5b506101b86103393660046150e4565b610cb8565b348015610349575f80fd5b506101b86103583660046150fd565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615125565b610f2d565b3480156103b0575f80fd5b506102236103bf366004615173565b611561565b3480156103cf575f80fd5b5061029a6103de36600461503b565b61157a565b3480156103ee575f80fd5b506101b86103fd366004615000565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b861043036600461503b565b6117d1565b348015610440575f80fd5b506101b861044f3660046150fd565b6118d7565b34801561045f575f80fd5b506101b861046e3660046150e4565b611be0565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a736600461503b565b611d98565b3480156104b7575f80fd5b506101b86104c636600461503b565b61201e565b6102236104d936600461503b565b612132565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c36600461503b565b612163565b60405161022d91906151a0565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba683398151915293929190829060ff1660048111156105955761059561518c565b60048111156105a6576105a661518c565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a82612163565b90506002835160048111156106415761064161518c565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615bc68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615bc68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f9060029060058111156107145761071461518c565b0361076b57861561072c57610729838761222b565b90505b5f84606001518360800151610741919061526a565b905061074d84826124c7565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610873919061528a565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b261518c565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c268339815191526020526040808220815160e0810190925280545f80516020615be683398151915293929190829060ff166005811115610a2557610a2561518c565b6005811115610a3657610a3661518c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa561518c565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f61261e565b6040518263ffffffff1660e01b8152600401610b4b91906152c3565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b919061528a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c2283612843565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a51000836152f5565b92915050565b5f610c8d612857565b610c998484843461288e565b9050610cb160015f80516020615c0683398151915255565b9392505050565b5f80516020615ba68339815191525f80610cd184612b0b565b91509150610cde82612e55565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d1661518c565b03610d3b575f83815260088501602052604081208054919055610d398282612e90565b505b610d5181610d4c8460400151611561565b612ef6565b5050505050565b5f80516020615ba68339815191525f610d7084612f09565b90505f80610d8183604001516130e3565b50915091505f610d9083612163565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a90615314565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615356565b60015f87815260068701602052604090205460ff166004811115610e3357610e3361518c565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615be68339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611031919061528a565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153b3565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153ce565b91505f90508435602086013560146111426060890160408a016153b3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153ce565b8363ffffffff168181106111d8576111d8615413565b90506020028101906111ea9190615427565b6111f3906154d7565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a9061556e565b84825f01518360200151846040015160405160200161124894939291906155b6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112969190615605565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d4919061528a565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156113605761136061518c565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615616565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615629565b90506111a6565b50600584018190555f61148386612f09565b90505f611493826040015161331e565b9050806002856040516114a69190615605565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e4919061528a565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a5100061564b565b5f61158482612163565b6080015192915050565b5f80516020615ba68339815191525f6115a685613487565b90506115b185612e55565b6115bc575050505050565b5f8581526005830160205260409020546001600160a01b031633146115f35760405162461bcd60e51b815260040161068a90615662565b5f85815260058301602052604090205460a082015161162291600160b01b90046001600160401b0316906156b4565b6001600160401b03168160c001516001600160401b031610156116a35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116b4868561222b565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170b90611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a5919061528a565b5f878152600885016020526040812080549091906117c4908490615616565b9091555050505050505050565b5f80516020615ba68339815191525f6117e983612163565b90506004815160058111156118005761180061518c565b1461186a5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b031633146118a15760405162461bcd60e51b815260040161068a90615662565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612e90565b6118df612857565b5f80516020615ba68339815191525f6118f784612f09565b90505f8061190883604001516130e3565b50915091505f61191783612163565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119515761195161518c565b60048111156119625761196261518c565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a465760405162461bcd60e51b815260040161068a90615314565b826001600160401b03168160e001516001600160401b03161115611a7c5760405162461bcd60e51b815260040161068a90615356565b600381516004811115611a9157611a9161518c565b14611ae55760405162461bcd60e51b815260206004820152603160248201525f80516020615bc68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2690600160a01b900461ffff168461564b565b611b3091906152f5565b905080886008015f8881526020019081526020015f205f828254611b549190615616565b90915550506020830151611b7190611b6c83856156d4565b612e90565b611b868360200151610d4c8560600151611561565b846001600160401b0316868a7f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050505050611bdc60015f80516020615c0683398151915255565b5050565b5f80516020615be68339815191525f611bf883612f09565b90505f80611c098360400151613702565b9150915080611c6b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611c85906156e7565b9050118015611cb7575060015f83815260088601602052604090205460ff166005811115611cb557611cb561518c565b145b611cd35760405162461bcd60e51b815260040161068a90615719565b5f8281526007850160205260408120611ceb91614f55565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba683398151915293929190829060ff166004811115611df957611df961518c565b6004811115611e0a57611e0a61518c565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e9157611e9161518c565b1480611eaf5750600381516004811115611ead57611ead61518c565b145b611f035760405162461bcd60e51b815260206004820152603260248201525f80516020615bc6833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f118260400151612163565b905080606001516001600160401b03165f03611f955760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fc284604001518460600151856080015161261e565b6040518263ffffffff1660e01b8152600401611fde91906152c3565b6020604051808303815f875af1158015611ffa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d51919061528a565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615be6833981519152929190612066906156e7565b9050118015612098575060015f83815260088301602052604090205460ff1660058111156120965761209661518c565b145b6120b45760405162461bcd60e51b815260040161068a90615719565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120ed9190600401615760565b6020604051808303815f875af1158015612109573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212d919061528a565b505050565b5f61213b612857565b6121468233346138a3565b905061215e60015f80516020615c0683398151915255565b919050565b61216b614f8c565b5f8281525f80516020615c26833981519152602052604090819020815160e0810190925280545f80516020615be6833981519152929190829060ff1660058111156121b8576121b861518c565b60058111156121c9576121c961518c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612276573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261229d91908101906157f5565b91509150806123005760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612343573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612367919061528a565b8251146123cb5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b0316156124415760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f806124508460400151613c5a565b915091508187146124bd5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c26833981519152602052604081206002015481905f80516020615be683398151915290600160801b90046001600160401b031661250f8582613e32565b5f61251987614040565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125698a858b61261e565b6040518263ffffffff1660e01b815260040161258591906152c3565b6020604051808303815f875af11580156125a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c5919061528a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612697576126578160016156d4565b61266290600861564b565b5081515f9083908390811061267957612679615413565b60200101906001600160f81b03191690815f1a905350600101612643565b505f5b6004811015612702576126ae8160036156d4565b6126b990600861564b565b600263ffffffff16901c60f81b828260026126d49190615616565b815181106126e4576126e4615413565b60200101906001600160f81b03191690815f1a90535060010161269a565b505f5b60208110156127645761271981601f6156d4565b61272490600861564b565b86901c60f81b82612736836006615616565b8151811061274657612746615413565b60200101906001600160f81b03191690815f1a905350600101612705565b505f5b60088110156127cf5761277b8160076156d4565b61278690600861564b565b6001600160401b038616901c60f81b826127a1836026615616565b815181106127b1576127b1615413565b60200101906001600160f81b03191690815f1a905350600101612767565b505f5b600881101561283a576127e68160076156d4565b6127f190600861564b565b6001600160401b038516901c60f81b8261280c83602e615616565b8151811061281c5761281c615413565b60200101906001600160f81b03191690815f1a9053506001016127d2565b50949350505050565b61284b6140d0565b6128548161411b565b50565b5f80516020615c0683398151915280546001190161288857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ba68339815191529061ffff8616108015906128da575061271061ffff861611155b6128f65760405162461bcd60e51b815260040161068a906158c7565b60028101546001600160401b03908116908516101561296f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129d25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a395760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a4482610c6e565b90505f612a51898361418f565b90506040518060600160405280612a653390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c0683398151915255565b5f612b14614f8c565b5f80516020615be68339815191525f612b2c85612f09565b90505f80612b3d8360400151613702565b915091508015612ba25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bd357612bd361518c565b6005811115612be457612be461518c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c5557612c5561518c565b1480612c735750600182516005811115612c7157612c7161518c565b145b612cd25760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612ce757612ce761518c565b03612cf457506004612cf8565b5060055b6020808301515f90815260098801909152604081205581816005811115612d2157612d2161518c565b90816005811115612d3457612d3461518c565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d6857612d6861518c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e1c57612e1c61518c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612edc575f80fd5b505af1158015612eee573d5f803e3d5ffd5b505050505050565b611bdc6001600160a01b038316826146f4565b60408051606080820183525f8083526020830181905292820152905f80516020615be68339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f7e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fa591908101906157f5565b91509150806130055760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130685760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131075760405162461bcd60e51b815260040161068a90615912565b5f805b60028110156131565761311e8160016156d4565b61312990600861564b565b61ffff1686828151811061313f5761313f615413565b016020015160f81c901b919091179060010161310a565b5061ffff8116156131795760405162461bcd60e51b815260040161068a9061595b565b5f805b60048110156131d4576131908160036156d4565b61319b90600861564b565b63ffffffff16876131ad836002615616565b815181106131bd576131bd615413565b016020015160f81c901b919091179060010161317c565b5063ffffffff81166004146131fb5760405162461bcd60e51b815260040161068a9061599e565b5f805b60208110156132505761321281601f6156d4565b61321d90600861564b565b88613229836006615616565b8151811061323957613239615413565b016020015160f81c901b91909117906001016131fe565b505f805b60088110156132af576132688160076156d4565b61327390600861564b565b6001600160401b031689613288836026615616565b8151811061329857613298615413565b016020015160f81c901b9190911790600101613254565b505f805b600881101561330e576132c78160076156d4565b6132d290600861564b565b6001600160401b03168a6132e783602e615616565b815181106132f7576132f7615413565b016020015160f81c901b91909117906001016132b3565b5091989097509095509350505050565b5f81516026146133405760405162461bcd60e51b815260040161068a90615912565b5f805b600281101561338f576133578160016156d4565b61336290600861564b565b61ffff1684828151811061337857613378615413565b016020015160f81c901b9190911790600101613343565b5061ffff8116156133b25760405162461bcd60e51b815260040161068a9061595b565b5f805b600481101561340d576133c98160036156d4565b6133d490600861564b565b63ffffffff16856133e6836002615616565b815181106133f6576133f6615413565b016020015160f81c901b91909117906001016133b5565b5063ffffffff8116156134325760405162461bcd60e51b815260040161068a9061599e565b5f805b602081101561283a5761344981601f6156d4565b61345490600861564b565b86613460836006615616565b8151811061347057613470615413565b016020015160f81c901b9190911790600101613435565b61348f614f8c565b5f8281525f80516020615c268339815191526020526040808220815160e0810190925280545f80516020615be683398151915293929190829060ff1660058111156134dc576134dc61518c565b60058111156134ed576134ed61518c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561355f5761355f61518c565b146135bb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156135ff576135ff61518c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136ab85826124c7565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137255760405162461bcd60e51b815260040161068a90615912565b5f805b60028110156137745761373c8160016156d4565b61374790600861564b565b61ffff1685828151811061375d5761375d615413565b016020015160f81c901b9190911790600101613728565b5061ffff8116156137975760405162461bcd60e51b815260040161068a9061595b565b5f805b60048110156137f2576137ae8160036156d4565b6137b990600861564b565b63ffffffff16866137cb836002615616565b815181106137db576137db615413565b016020015160f81c901b919091179060010161379a565b5063ffffffff81166003146138195760405162461bcd60e51b815260040161068a9061599e565b5f805b602081101561386e5761383081601f6156d4565b61383b90600861564b565b87613847836006615616565b8151811061385757613857615413565b016020015160f81c901b919091179060010161381c565b505f8660268151811061388357613883615413565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ba6833981519152816138bc84610c6e565b90505f6138c887612163565b90506138d387612e55565b6139305760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b6002815160058111156139455761394561518c565b146139a45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139b591906156b4565b600485015460408401519192506139d7916001600160401b03909116906159e5565b6001600160401b0316816001600160401b03161115613a565760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a628a846124c7565b915091505f8a83604051602001613a9092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b2b57613b2b61518c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c7d5760405162461bcd60e51b815260040161068a90615912565b5f805b6002811015613ccc57613c948160016156d4565b613c9f90600861564b565b61ffff16858281518110613cb557613cb5615413565b016020015160f81c901b9190911790600101613c80565b5061ffff811615613cef5760405162461bcd60e51b815260040161068a9061595b565b5f805b6004811015613d4a57613d068160036156d4565b613d1190600861564b565b63ffffffff1686613d23836002615616565b81518110613d3357613d33615413565b016020015160f81c901b9190911790600101613cf2565b5063ffffffff8116600514613d715760405162461bcd60e51b815260040161068a9061599e565b5f805b6020811015613dc657613d8881601f6156d4565b613d9390600861564b565b87613d9f836006615616565b81518110613daf57613daf615413565b016020015160f81c901b9190911790600101613d74565b505f805b6008811015613e2557613dde8160076156d4565b613de990600861564b565b6001600160401b031688613dfe836026615616565b81518110613e0e57613e0e615413565b016020015160f81c901b9190911790600101613dca565b5090969095509350505050565b5f80516020615be68339815191525f6001600160401b038084169085161115613e6657613e5f838561526a565b9050613e73565b613e70848461526a565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ed5575060028401548151613ed1916001600160401b031690615616565b8210155b15613efb576001600160401b038316606082015281815260408101516020820152613f1a565b8281606001818151613f0d91906156b4565b6001600160401b03169052505b6060810151613f2a9060646159e5565b602082015160028601546001600160401b039290921691613f559190600160401b900460ff1661564b565b1015613fb95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fd49190615616565b9052506040810180516001600160401b0387169190613ff49083906156d4565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c268339815191526020526040812060020180545f80516020615be683398151915291600160401b9091046001600160401b031690600861408a83615a10565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661411957604051631afcd79f60e31b815260040160405180910390fd5b565b6141236140d0565b61412c81614787565b6141346147a0565b612854608082013560a083013561415160e0850160c08601615173565b614162610100860160e08701615a2b565b61ffff1661417861012087016101008801615a44565b61418a610140880161012089016153b3565b6147b0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661421a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615be6833981519152426142396040860160208701615173565b6001600160401b0316116142ab5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142bb6040850160208601615173565b6001600160401b03166142d16202a30042615616565b116143445760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b833561439c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143cb5760405162461bcd60e51b815260040161068a9061556e565b60306143da6040860186615a64565b90501461443f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614449835f613e32565b5f806144e36040518060a0016040528085600101548152602001885f01358152602001876001600160401b0316815260200188602001602081019061448e9190615173565b6001600160401b031681526020016144a960408a018a615a64565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506149f4565b5f828152600786016020526040902091935091506145018282615aea565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061452e9085906004016152c3565b6020604051808303815f875af115801561454a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061456e919061528a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156145e6576145e661518c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146c6918e01908e01615173565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147175760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614760576040519150601f19603f3d011682016040523d82523d5f602084013e614765565b606091505b505090508061212d57604051630a12f52160e11b815260040160405180910390fd5b61478f6140d0565b614797614da3565b61285481614dab565b6147a86140d0565b614119614f4d565b6147b86140d0565b5f80516020615ba6833981519152836148245760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148465760405162461bcd60e51b815260040161068a906158c7565b858711156148ae5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff161161491b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff8416111561498d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a5e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ad557614a958160016156d4565b614aa090600861564b565b5081515f90839083908110614ab757614ab7615413565b60200101906001600160f81b03191690815f1a905350600101614a81565b505f5b6004811015614b3d57614aec8160036156d4565b614af790600861564b565b600160ff919091161c60f81b82614b0f836002615616565b81518110614b1f57614b1f615413565b60200101906001600160f81b03191690815f1a905350600101614ad8565b505f5b6020811015614b9a5784518160208110614b5c57614b5c615413565b1a60f81b82614b6c836006615616565b81518110614b7c57614b7c615413565b60200101906001600160f81b03191690815f1a905350600101614b40565b505f5b6020811015614bfa5784602001518160208110614bbc57614bbc615413565b1a60f81b82614bcc836026615616565b81518110614bdc57614bdc615413565b60200101906001600160f81b03191690815f1a905350600101614b9d565b505f5b6008811015614c6e57614c118160076156d4565b614c1c90600861564b565b60ff1685604001516001600160401b0316901c60f81b82826046614c409190615616565b81518110614c5057614c50615413565b60200101906001600160f81b03191690815f1a905350600101614bfd565b505f5b6030811015614cd95784608001518181518110614c9057614c90615413565b01602001516001600160f81b03191682614cab83604e615616565b81518110614cbb57614cbb615413565b60200101906001600160f81b03191690815f1a905350600101614c71565b505f5b6008811015614d4b57614cf08160076156d4565b614cfb90600861564b565b60608601516001600160401b0390811691161c60f81b82614d1d83607e615616565b81518110614d2d57614d2d615413565b60200101906001600160f81b03191690815f1a905350600101614cdc565b50600281604051614d5c9190615605565b602060405180830381855afa158015614d77573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d9a919061528a565b94909350915050565b6141196140d0565b614db36140d0565b80355f80516020615be683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614dff6080840160608501615a44565b60ff161115614e6c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e7d6080840160608501615a44565b60ff1611614ee55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614ef56080830160608401615a44565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f266060830160408401615173565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612af86140d0565b508054614f61906156e7565b5f825580601f10614f70575050565b601f0160209004905f5260205f20908101906128549190614fc8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fdc575f8155600101614fc9565b5090565b8015158114612854575f80fd5b803563ffffffff8116811461215e575f80fd5b5f805f60608486031215615012575f80fd5b83359250602084013561502481614fe0565b915061503260408501614fed565b90509250925092565b5f6020828403121561504b575f80fd5b5035919050565b5f6101408284031215615063575f80fd5b50919050565b803561ffff8116811461215e575f80fd5b80356001600160401b038116811461215e575f80fd5b5f805f606084860312156150a2575f80fd5b83356001600160401b038111156150b7575f80fd5b8401606081870312156150c8575f80fd5b92506150d660208501615069565b91506150326040850161507a565b5f602082840312156150f4575f80fd5b610cb182614fed565b5f806040838503121561510e575f80fd5b61511783614fed565b946020939093013593505050565b5f8060408385031215615136575f80fd5b82356001600160401b0381111561514b575f80fd5b83016080818603121561515c575f80fd5b915061516a60208401614fed565b90509250929050565b5f60208284031215615183575f80fd5b610cb18261507a565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151c357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151fe60608401826001600160401b03169052565b50608083015161521960808401826001600160401b03169052565b5060a083015161523460a08401826001600160401b03169052565b5060c083015161524f60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561524f5761524f615256565b5f6020828403121561529a575f80fd5b5051919050565b5f5b838110156152bb5781810151838201526020016152a3565b50505f910152565b602081525f82518060208401526152e18160408501602087016152a1565b601f01601f19169190910160400192915050565b5f8261530f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612854575f80fd5b5f602082840312156153c3575f80fd5b8135610cb18161539f565b5f808335601e198436030181126153e3575f80fd5b8301803591506001600160401b038211156153fc575f80fd5b6020019150600581901b3603821315612617575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261543b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561547b5761547b615445565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154a9576154a9615445565b604052919050565b5f6001600160401b038211156154c9576154c9615445565b50601f01601f191660200190565b5f606082360312156154e7575f80fd5b6154ef615459565b82358152602061550081850161507a565b8183015260408401356001600160401b0381111561551c575f80fd5b840136601f82011261552c575f80fd5b803561553f61553a826154b1565b615481565b8181523684838501011115615552575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155c7818460208a016152a1565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155f78160288401602088016152a1565b016028019695505050505050565b5f825161543b8184602087016152a1565b80820180821115610c7e57610c7e615256565b5f63ffffffff80831681810361564157615641615256565b6001019392505050565b8082028115828204841417610c7e57610c7e615256565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561524f5761524f615256565b81810381811115610c7e57610c7e615256565b600181811c908216806156fb57607f821691505b60208210810361506357634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615772816156e7565b806020870152604060018084165f811461579357600181146157af576157dc565b60ff19851660408a0152604084151560051b8a010195506157dc565b895f5260205f205f5b858110156157d35781548b82018601529083019088016157b8565b8a016040019650505b509398975050505050505050565b805161215e81614fe0565b5f8060408385031215615806575f80fd5b82516001600160401b038082111561581c575f80fd5b908401906060828703121561582f575f80fd5b615837615459565b8251815260208084015161584a8161539f565b8282015260408401518381111561585f575f80fd5b80850194505087601f850112615873575f80fd5b8351925061588361553a846154b1565b8381528882858701011115615896575f80fd5b6158a5848383018488016152a1565b806040840152508195506158ba8188016157ea565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0857615a08615256565b505092915050565b5f6001600160401b0380831681810361564157615641615256565b5f60208284031215615a3b575f80fd5b610cb182615069565b5f60208284031215615a54575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a79575f80fd5b8301803591506001600160401b03821115615a92575f80fd5b602001915036819003821315612617575f80fd5b601f82111561212d57805f5260205f20601f840160051c81016020851015615acb5750805b601f840160051c820191505b81811015610d51575f8155600101615ad7565b81516001600160401b03811115615b0357615b03615445565b615b1781615b1184546156e7565b84615aa6565b602080601f831160018114615b4a575f8415615b335750858301515b5f19600386901b1c1916600185901b178555612eee565b5f85815260208120601f198616915b82811015615b7857888601518255948401946001909101908401615b59565b5085821015615b9557878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615dba380380615dba83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c6d8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b336600461501b565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615056565b6109d8565b3480156101e4575f80fd5b506102236101f3366004615056565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461506d565b610b91565b348015610286575f80fd5b5061029a610295366004615056565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150ab565b610c84565b34801561032a575f80fd5b506101b86103393660046150ff565b610cb8565b348015610349575f80fd5b506101b8610358366004615118565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615140565b610f2d565b3480156103b0575f80fd5b506102236103bf36600461518e565b611561565b3480156103cf575f80fd5b5061029a6103de366004615056565b61157a565b3480156103ee575f80fd5b506101b86103fd36600461501b565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615056565b6117d1565b348015610440575f80fd5b506101b861044f366004615118565b6118d7565b34801561045f575f80fd5b506101b861046e3660046150ff565b611bfb565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615056565b611db3565b3480156104b7575f80fd5b506101b86104c6366004615056565b612039565b6102236104d9366004615056565b61214d565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615056565b61217e565b60405161022d91906151bb565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc183398151915293929190829060ff166004811115610595576105956151a7565b60048111156105a6576105a66151a7565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a8261217e565b9050600283516004811115610641576106416151a7565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615be18339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615be18339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f906002906005811115610714576107146151a7565b0361076b57861561072c576107298387612246565b90505b5f846060015183608001516107419190615285565b905061074d84826124e2565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087391906152a5565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b26151a7565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c418339815191526020526040808220815160e0810190925280545f80516020615c0183398151915293929190829060ff166005811115610a2557610a256151a7565b6005811115610a3657610a366151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa56151a7565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f612639565b6040518263ffffffff1660e01b8152600401610b4b91906152de565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b91906152a5565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c228361285e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a5100083615310565b92915050565b5f610c8d612872565b610c99848484346128a9565b9050610cb160015f80516020615c2183398151915255565b9392505050565b5f80516020615bc18339815191525f80610cd184612b26565b91509150610cde82612e70565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d166151a7565b03610d3b575f83815260088501602052604081208054919055610d398282612eab565b505b610d5181610d4c8460400151611561565b612f11565b5050505050565b5f80516020615bc18339815191525f610d7084612f24565b90505f80610d8183604001516130fe565b50915091505f610d908361217e565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a9061532f565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615371565b60015f87815260068701602052604090205460ff166004811115610e3357610e336151a7565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615c018339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103191906152a5565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153ce565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153e9565b91505f90508435602086013560146111426060890160408a016153ce565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153e9565b8363ffffffff168181106111d8576111d861542e565b90506020028101906111ea9190615442565b6111f3906154f2565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a90615589565b84825f01518360200151846040015160405160200161124894939291906155d1565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112969190615620565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d491906152a5565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115611360576113606151a7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615631565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615644565b90506111a6565b50600584018190555f61148386612f24565b90505f6114938260400151613339565b9050806002856040516114a69190615620565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e491906152a5565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a51000615666565b5f6115848261217e565b6080015192915050565b5f80516020615bc18339815191525f6115a6856134a2565b90506115b185612e70565b6115bc575050505050565b5f8581526005830160205260409020546001600160a01b031633146115f35760405162461bcd60e51b815260040161068a9061567d565b5f85815260058301602052604090205460a082015161162291600160b01b90046001600160401b0316906156cf565b6001600160401b03168160c001516001600160401b031610156116a35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116b48685612246565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170b90611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a591906152a5565b5f878152600885016020526040812080549091906117c4908490615631565b9091555050505050505050565b5f80516020615bc18339815191525f6117e98361217e565b9050600481516005811115611800576118006151a7565b1461186a5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b031633146118a15760405162461bcd60e51b815260040161068a9061567d565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612eab565b6118df612872565b5f80516020615bc18339815191525f6118f784612f24565b90505f8061190883604001516130fe565b50915091505f6119178361217e565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611951576119516151a7565b6004811115611962576119626151a7565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a465760405162461bcd60e51b815260040161068a9061532f565b826001600160401b03168160e001516001600160401b03161115611a7c5760405162461bcd60e51b815260040161068a90615371565b600381516004811115611a9157611a916151a7565b14611ae55760405162461bcd60e51b815260206004820152603160248201525f80516020615be18339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2690600160a01b900461ffff1684615666565b611b309190615310565b905080886008015f8881526020019081526020015f205f828254611b549190615631565b909155505f9050611b6582846156ef565b9050611b75846020015182612eab565b611b8a8460200151610d4c8660600151611561565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611bd0929190918252602082015260400190565b60405180910390a4505050505050505050611bf760015f80516020615c2183398151915255565b5050565b5f80516020615c018339815191525f611c1383612f24565b90505f80611c24836040015161371d565b9150915080611c865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611ca090615702565b9050118015611cd2575060015f83815260088601602052604090205460ff166005811115611cd057611cd06151a7565b145b611cee5760405162461bcd60e51b815260040161068a90615734565b5f8281526007850160205260408120611d0691614f70565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc183398151915293929190829060ff166004811115611e1457611e146151a7565b6004811115611e2557611e256151a7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611eac57611eac6151a7565b1480611eca5750600381516004811115611ec857611ec86151a7565b145b611f1e5760405162461bcd60e51b815260206004820152603260248201525f80516020615be1833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f2c826040015161217e565b905080606001516001600160401b03165f03611fb05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fdd846040015184606001518560800151612639565b6040518263ffffffff1660e01b8152600401611ff991906152de565b6020604051808303815f875af1158015612015573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5191906152a5565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615c0183398151915292919061208190615702565b90501180156120b3575060015f83815260088301602052604090205460ff1660058111156120b1576120b16151a7565b145b6120cf5760405162461bcd60e51b815260040161068a90615734565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612108919060040161577b565b6020604051808303815f875af1158015612124573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214891906152a5565b505050565b5f612156612872565b6121618233346138be565b905061217960015f80516020615c2183398151915255565b919050565b612186614fa7565b5f8281525f80516020615c41833981519152602052604090819020815160e0810190925280545f80516020615c01833981519152929190829060ff1660058111156121d3576121d36151a7565b60058111156121e4576121e46151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612291573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b89190810190615810565b915091508061231b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561235e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238291906152a5565b8251146123e65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b03161561245c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f8061246b8460400151613c75565b915091508187146124d85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c41833981519152602052604081206002015481905f80516020615c0183398151915290600160801b90046001600160401b031661252a8582613e4d565b5f6125348761405b565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125848a858b612639565b6040518263ffffffff1660e01b81526004016125a091906152de565b6020604051808303815f875af11580156125bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125e091906152a5565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126b2576126728160016156ef565b61267d906008615666565b5081515f908390839081106126945761269461542e565b60200101906001600160f81b03191690815f1a90535060010161265e565b505f5b600481101561271d576126c98160036156ef565b6126d4906008615666565b600263ffffffff16901c60f81b828260026126ef9190615631565b815181106126ff576126ff61542e565b60200101906001600160f81b03191690815f1a9053506001016126b5565b505f5b602081101561277f5761273481601f6156ef565b61273f906008615666565b86901c60f81b82612751836006615631565b815181106127615761276161542e565b60200101906001600160f81b03191690815f1a905350600101612720565b505f5b60088110156127ea576127968160076156ef565b6127a1906008615666565b6001600160401b038616901c60f81b826127bc836026615631565b815181106127cc576127cc61542e565b60200101906001600160f81b03191690815f1a905350600101612782565b505f5b6008811015612855576128018160076156ef565b61280c906008615666565b6001600160401b038516901c60f81b8261282783602e615631565b815181106128375761283761542e565b60200101906001600160f81b03191690815f1a9053506001016127ed565b50949350505050565b6128666140eb565b61286f81614136565b50565b5f80516020615c218339815191528054600119016128a357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bc18339815191529061ffff8616108015906128f5575061271061ffff861611155b6129115760405162461bcd60e51b815260040161068a906158e2565b60028101546001600160401b03908116908516101561298a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129ed5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a545760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a5f82610c6e565b90505f612a6c89836141aa565b90506040518060600160405280612a803390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c2183398151915255565b5f612b2f614fa7565b5f80516020615c018339815191525f612b4785612f24565b90505f80612b58836040015161371d565b915091508015612bbd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bee57612bee6151a7565b6005811115612bff57612bff6151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c7057612c706151a7565b1480612c8e5750600182516005811115612c8c57612c8c6151a7565b145b612ced5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612d0257612d026151a7565b03612d0f57506004612d13565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3c57612d3c6151a7565b90816005811115612d4f57612d4f6151a7565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d8357612d836151a7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e3757612e376151a7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ef7575f80fd5b505af1158015612f09573d5f803e3d5ffd5b505050505050565b611bf76001600160a01b0383168261470f565b60408051606080820183525f8083526020830181905292820152905f80516020615c018339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f99573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fc09190810190615810565b91509150806130205760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130835760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130f65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131225760405162461bcd60e51b815260040161068a9061592d565b5f805b6002811015613171576131398160016156ef565b613144906008615666565b61ffff1686828151811061315a5761315a61542e565b016020015160f81c901b9190911790600101613125565b5061ffff8116156131945760405162461bcd60e51b815260040161068a90615976565b5f805b60048110156131ef576131ab8160036156ef565b6131b6906008615666565b63ffffffff16876131c8836002615631565b815181106131d8576131d861542e565b016020015160f81c901b9190911790600101613197565b5063ffffffff81166004146132165760405162461bcd60e51b815260040161068a906159b9565b5f805b602081101561326b5761322d81601f6156ef565b613238906008615666565b88613244836006615631565b815181106132545761325461542e565b016020015160f81c901b9190911790600101613219565b505f805b60088110156132ca576132838160076156ef565b61328e906008615666565b6001600160401b0316896132a3836026615631565b815181106132b3576132b361542e565b016020015160f81c901b919091179060010161326f565b505f805b6008811015613329576132e28160076156ef565b6132ed906008615666565b6001600160401b03168a61330283602e615631565b815181106133125761331261542e565b016020015160f81c901b91909117906001016132ce565b5091989097509095509350505050565b5f815160261461335b5760405162461bcd60e51b815260040161068a9061592d565b5f805b60028110156133aa576133728160016156ef565b61337d906008615666565b61ffff168482815181106133935761339361542e565b016020015160f81c901b919091179060010161335e565b5061ffff8116156133cd5760405162461bcd60e51b815260040161068a90615976565b5f805b6004811015613428576133e48160036156ef565b6133ef906008615666565b63ffffffff1685613401836002615631565b815181106134115761341161542e565b016020015160f81c901b91909117906001016133d0565b5063ffffffff81161561344d5760405162461bcd60e51b815260040161068a906159b9565b5f805b60208110156128555761346481601f6156ef565b61346f906008615666565b8661347b836006615631565b8151811061348b5761348b61542e565b016020015160f81c901b9190911790600101613450565b6134aa614fa7565b5f8281525f80516020615c418339815191526020526040808220815160e0810190925280545f80516020615c0183398151915293929190829060ff1660058111156134f7576134f76151a7565b6005811115613508576135086151a7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561357a5761357a6151a7565b146135d65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561361a5761361a6151a7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136c685826124e2565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137405760405162461bcd60e51b815260040161068a9061592d565b5f805b600281101561378f576137578160016156ef565b613762906008615666565b61ffff168582815181106137785761377861542e565b016020015160f81c901b9190911790600101613743565b5061ffff8116156137b25760405162461bcd60e51b815260040161068a90615976565b5f805b600481101561380d576137c98160036156ef565b6137d4906008615666565b63ffffffff16866137e6836002615631565b815181106137f6576137f661542e565b016020015160f81c901b91909117906001016137b5565b5063ffffffff81166003146138345760405162461bcd60e51b815260040161068a906159b9565b5f805b60208110156138895761384b81601f6156ef565b613856906008615666565b87613862836006615631565b815181106138725761387261542e565b016020015160f81c901b9190911790600101613837565b505f8660268151811061389e5761389e61542e565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615bc1833981519152816138d784610c6e565b90505f6138e38761217e565b90506138ee87612e70565b61394b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b600281516005811115613960576139606151a7565b146139bf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139d091906156cf565b600485015460408401519192506139f2916001600160401b0390911690615a00565b6001600160401b0316816001600160401b03161115613a715760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a7d8a846124e2565b915091505f8a83604051602001613aab92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b4657613b466151a7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c985760405162461bcd60e51b815260040161068a9061592d565b5f805b6002811015613ce757613caf8160016156ef565b613cba906008615666565b61ffff16858281518110613cd057613cd061542e565b016020015160f81c901b9190911790600101613c9b565b5061ffff811615613d0a5760405162461bcd60e51b815260040161068a90615976565b5f805b6004811015613d6557613d218160036156ef565b613d2c906008615666565b63ffffffff1686613d3e836002615631565b81518110613d4e57613d4e61542e565b016020015160f81c901b9190911790600101613d0d565b5063ffffffff8116600514613d8c5760405162461bcd60e51b815260040161068a906159b9565b5f805b6020811015613de157613da381601f6156ef565b613dae906008615666565b87613dba836006615631565b81518110613dca57613dca61542e565b016020015160f81c901b9190911790600101613d8f565b505f805b6008811015613e4057613df98160076156ef565b613e04906008615666565b6001600160401b031688613e19836026615631565b81518110613e2957613e2961542e565b016020015160f81c901b9190911790600101613de5565b5090969095509350505050565b5f80516020615c018339815191525f6001600160401b038084169085161115613e8157613e7a8385615285565b9050613e8e565b613e8b8484615285565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ef0575060028401548151613eec916001600160401b031690615631565b8210155b15613f16576001600160401b038316606082015281815260408101516020820152613f35565b8281606001818151613f2891906156cf565b6001600160401b03169052505b6060810151613f45906064615a00565b602082015160028601546001600160401b039290921691613f709190600160401b900460ff16615666565b1015613fd45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fef9190615631565b9052506040810180516001600160401b038716919061400f9083906156ef565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c418339815191526020526040812060020180545f80516020615c0183398151915291600160401b9091046001600160401b03169060086140a583615a2b565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661413457604051631afcd79f60e31b815260040160405180910390fd5b565b61413e6140eb565b614147816147a2565b61414f6147bb565b61286f608082013560a083013561416c60e0850160c0860161518e565b61417d610100860160e08701615a46565b61ffff1661419361012087016101008801615a5f565b6141a5610140880161012089016153ce565b6147cb565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615c0183398151915242614254604086016020870161518e565b6001600160401b0316116142c65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142d6604085016020860161518e565b6001600160401b03166142ec6202a30042615631565b1161435f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b83356143b75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143e65760405162461bcd60e51b815260040161068a90615589565b60306143f56040860186615a7f565b90501461445a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614464835f613e4d565b5f806144fe6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a9919061518e565b6001600160401b031681526020016144c460408a018a615a7f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a0f565b5f8281526007860160205260409020919350915061451c8282615b05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145499085906004016152de565b6020604051808303815f875af1158015614565573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061458991906152a5565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614601576146016151a7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e1918e01908e0161518e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147325760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461477b576040519150601f19603f3d011682016040523d82523d5f602084013e614780565b606091505b505090508061214857604051630a12f52160e11b815260040160405180910390fd5b6147aa6140eb565b6147b2614dbe565b61286f81614dc6565b6147c36140eb565b614134614f68565b6147d36140eb565b5f80516020615bc18339815191528361483f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148615760405162461bcd60e51b815260040161068a906158e2565b858711156148c95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff16116149365760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff841611156149a85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a795760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614af057614ab08160016156ef565b614abb906008615666565b5081515f90839083908110614ad257614ad261542e565b60200101906001600160f81b03191690815f1a905350600101614a9c565b505f5b6004811015614b5857614b078160036156ef565b614b12906008615666565b600160ff919091161c60f81b82614b2a836002615631565b81518110614b3a57614b3a61542e565b60200101906001600160f81b03191690815f1a905350600101614af3565b505f5b6020811015614bb55784518160208110614b7757614b7761542e565b1a60f81b82614b87836006615631565b81518110614b9757614b9761542e565b60200101906001600160f81b03191690815f1a905350600101614b5b565b505f5b6020811015614c155784602001518160208110614bd757614bd761542e565b1a60f81b82614be7836026615631565b81518110614bf757614bf761542e565b60200101906001600160f81b03191690815f1a905350600101614bb8565b505f5b6008811015614c8957614c2c8160076156ef565b614c37906008615666565b60ff1685604001516001600160401b0316901c60f81b82826046614c5b9190615631565b81518110614c6b57614c6b61542e565b60200101906001600160f81b03191690815f1a905350600101614c18565b505f5b6030811015614cf45784608001518181518110614cab57614cab61542e565b01602001516001600160f81b03191682614cc683604e615631565b81518110614cd657614cd661542e565b60200101906001600160f81b03191690815f1a905350600101614c8c565b505f5b6008811015614d6657614d0b8160076156ef565b614d16906008615666565b60608601516001600160401b0390811691161c60f81b82614d3883607e615631565b81518110614d4857614d4861542e565b60200101906001600160f81b03191690815f1a905350600101614cf7565b50600281604051614d779190615620565b602060405180830381855afa158015614d92573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614db591906152a5565b94909350915050565b6141346140eb565b614dce6140eb565b80355f80516020615c0183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e1a6080840160608501615a5f565b60ff161115614e875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e986080840160608501615a5f565b60ff1611614f005760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614f106080830160608401615a5f565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f41606083016040840161518e565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b136140eb565b508054614f7c90615702565b5f825580601f10614f8b575050565b601f0160209004905f5260205f209081019061286f9190614fe3565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614ff7575f8155600101614fe4565b5090565b801515811461286f575f80fd5b803563ffffffff81168114612179575f80fd5b5f805f6060848603121561502d575f80fd5b83359250602084013561503f81614ffb565b915061504d60408501615008565b90509250925092565b5f60208284031215615066575f80fd5b5035919050565b5f610140828403121561507e575f80fd5b50919050565b803561ffff81168114612179575f80fd5b80356001600160401b0381168114612179575f80fd5b5f805f606084860312156150bd575f80fd5b83356001600160401b038111156150d2575f80fd5b8401606081870312156150e3575f80fd5b92506150f160208501615084565b915061504d60408501615095565b5f6020828403121561510f575f80fd5b610cb182615008565b5f8060408385031215615129575f80fd5b61513283615008565b946020939093013593505050565b5f8060408385031215615151575f80fd5b82356001600160401b03811115615166575f80fd5b830160808186031215615177575f80fd5b915061518560208401615008565b90509250929050565b5f6020828403121561519e575f80fd5b610cb182615095565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151de57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521960608401826001600160401b03169052565b50608083015161523460808401826001600160401b03169052565b5060a083015161524f60a08401826001600160401b03169052565b5060c083015161526a60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526a5761526a615271565b5f602082840312156152b5575f80fd5b5051919050565b5f5b838110156152d65781810151838201526020016152be565b50505f910152565b602081525f82518060208401526152fc8160408501602087016152bc565b601f01601f19169190910160400192915050565b5f8261532a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461286f575f80fd5b5f602082840312156153de575f80fd5b8135610cb1816153ba565b5f808335601e198436030181126153fe575f80fd5b8301803591506001600160401b03821115615417575f80fd5b6020019150600581901b3603821315612632575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615456575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561549657615496615460565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154c4576154c4615460565b604052919050565b5f6001600160401b038211156154e4576154e4615460565b50601f01601f191660200190565b5f60608236031215615502575f80fd5b61550a615474565b82358152602061551b818501615095565b8183015260408401356001600160401b03811115615537575f80fd5b840136601f820112615547575f80fd5b803561555a615555826154cc565b61549c565b818152368483850101111561556d575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155e2818460208a016152bc565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156128160288401602088016152bc565b016028019695505050505050565b5f82516154568184602087016152bc565b80820180821115610c7e57610c7e615271565b5f63ffffffff80831681810361565c5761565c615271565b6001019392505050565b8082028115828204841417610c7e57610c7e615271565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561526a5761526a615271565b81810381811115610c7e57610c7e615271565b600181811c9082168061571657607f821691505b60208210810361507e57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461578d81615702565b806020870152604060018084165f81146157ae57600181146157ca576157f7565b60ff19851660408a0152604084151560051b8a010195506157f7565b895f5260205f205f5b858110156157ee5781548b82018601529083019088016157d3565b8a016040019650505b509398975050505050505050565b805161217981614ffb565b5f8060408385031215615821575f80fd5b82516001600160401b0380821115615837575f80fd5b908401906060828703121561584a575f80fd5b615852615474565b82518152602080840151615865816153ba565b8282015260408401518381111561587a575f80fd5b80850194505087601f85011261588e575f80fd5b8351925061589e615555846154cc565b83815288828587010111156158b1575f80fd5b6158c0848383018488016152bc565b806040840152508195506158d5818801615805565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a2357615a23615271565b505092915050565b5f6001600160401b0380831681810361565c5761565c615271565b5f60208284031215615a56575f80fd5b610cb182615084565b5f60208284031215615a6f575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a94575f80fd5b8301803591506001600160401b03821115615aad575f80fd5b602001915036819003821315612632575f80fd5b601f82111561214857805f5260205f20601f840160051c81016020851015615ae65750805b601f840160051c820191505b81811015610d51575f8155600101615af2565b81516001600160401b03811115615b1e57615b1e615460565b615b3281615b2c8454615702565b84615ac1565b602080601f831160018114615b65575f8415615b4e5750858301515b5f19600386901b1c1916600185901b178555612f09565b5f85815260208120601f198616915b82811015615b9357888601518255948401946001909101908401615b74565b5085821015615bb057878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1023,12 +1023,14 @@ type NativeTokenStakingManagerDelegationEnded struct { DelegationID [32]byte ValidationID [32]byte Nonce uint64 + Rewards *big.Int + Fees *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { var delegationIDRule []interface{} @@ -1051,9 +1053,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg return &NativeTokenStakingManagerDelegationEndedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { var delegationIDRule []interface{} @@ -1101,9 +1103,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab. +// ParseDelegationEnded is a log parse operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { event := new(NativeTokenStakingManagerDelegationEnded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { diff --git a/contracts/staking/PoSValidatorManager.sol b/contracts/staking/PoSValidatorManager.sol index ee6af6395..f661d7c2c 100644 --- a/contracts/staking/PoSValidatorManager.sol +++ b/contracts/staking/PoSValidatorManager.sol @@ -528,12 +528,13 @@ abstract contract PoSValidatorManager is $._redeemableValidatorRewards[validationID] += validatorFees; // Reward the remaining tokens to the delegator. - _reward(delegator.owner, rewards - validatorFees); + uint256 delegatorRewards = rewards - validatorFees; + _reward(delegator.owner, delegatorRewards); // Unlock the delegator's stake. _unlock(delegator.owner, weightToValue(delegator.weight)); - emit DelegationEnded(delegationID, validationID, nonce); + emit DelegationEnded(delegationID, validationID, nonce, delegatorRewards, validatorFees); } function _reward(address account, uint256 amount) internal virtual; diff --git a/contracts/staking/interfaces/IPoSValidatorManager.sol b/contracts/staking/interfaces/IPoSValidatorManager.sol index b29225c0a..b4d8cefff 100644 --- a/contracts/staking/interfaces/IPoSValidatorManager.sol +++ b/contracts/staking/interfaces/IPoSValidatorManager.sol @@ -95,7 +95,11 @@ interface IPoSValidatorManager is IValidatorManager { * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain */ event DelegationEnded( - bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce + bytes32 indexed delegationID, + bytes32 indexed validationID, + uint64 indexed nonce, + uint256 rewards, + uint256 fees ); /** diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 7b8ee3778..0a6bd5d5a 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -71,7 +71,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); event DelegationEnded( - bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce + bytes32 indexed delegationID, + bytes32 indexed validationID, + uint64 indexed nonce, + uint256 rewards, + uint256 fees ); function testDelegationFeeBipsTooLow() public { @@ -548,8 +552,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endSupply: 0 }); - uint256 expectedValidatorReward = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; - uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorReward; + uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; _setUpCompleteEndDelegation({ validationID: validationID, @@ -557,6 +561,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, expectedReward: expectedDelegatorReward, + expectedFees: expectedValidatorFees, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -713,8 +718,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endSupply: 0 }); - uint256 expectedValidatorReward = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; - uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorReward; + uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) _setUpCompleteEndDelegation({ @@ -723,6 +728,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, expectedReward: expectedDelegatorReward, + expectedFees: expectedValidatorFees, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 @@ -939,6 +945,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { address delegator, uint64 delegatorWeight, uint256 expectedReward, + uint256 expectedFees, uint64 validatorWeight, uint64 expectedValidatorWeight, uint64 expectedNonce @@ -949,7 +956,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetVerifiedWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(delegationID, validationID, expectedNonce); + emit DelegationEnded( + delegationID, validationID, expectedNonce, expectedReward, expectedFees + ); uint256 balanceBefore = _getStakeAssetBalance(delegator); _expectStakeUnlock(delegator, _weightToValue(delegatorWeight)); From 49636c1c1491320bf87f097fa2f3def8445bf08b Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Thu, 19 Sep 2024 10:40:48 -0400 Subject: [PATCH 365/545] manual packing: --- contracts/staking/ValidatorManager.sol | 7 +++ contracts/staking/ValidatorMessages.sol | 63 +++++++++++++++++++ .../staking/tests/ValidatorManagerTests.t.sol | 4 +- contracts/teleporter/README.md | 2 +- 4 files changed, 73 insertions(+), 3 deletions(-) diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 7ed9cd005..dbebc44e4 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -200,6 +200,13 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida "ValidatorManager: invalid subnet conversion ID" ); + bytes memory encodedConversion2 = + ValidatorMessages.packSubnetConversionData(subnetConversionData); + require( + sha256(encodedConversion2) == subnetConversionID, + "ValidatorManager: invalid subnet conversion ID 2" + ); + $._initializedValidatorSet = true; } diff --git a/contracts/staking/ValidatorMessages.sol b/contracts/staking/ValidatorMessages.sol index f624ccdbb..01998b572 100644 --- a/contracts/staking/ValidatorMessages.sol +++ b/contracts/staking/ValidatorMessages.sol @@ -4,6 +4,8 @@ // SPDX-License-Identifier: Ecosystem pragma solidity 0.8.25; +import {SubnetConversionData} from "./interfaces/IValidatorManager.sol"; + library ValidatorMessages { // The information that uniquely identifies a subnet validation period. // The validationID is the SHA-256 hash of the concatenation of the CODEC_ID, @@ -116,6 +118,67 @@ library ValidatorMessages { return subnetConversionID; } + /*+-------------------+------------------------+-------------------------------------------------------+ + | convertSubnetTxID : [32]byte | 32 bytes | + +-------------------+--------------------------+-------------------------------------------------------+ + | managerChainID : [32]byte | 32 bytes | + +-------------------+--------------------------+-------------------------------------------------------+ + | managerAddress : []byte | 4 + len(managerAddress) bytes | + +-------------------+--------------------------+-------------------------------------------------------+ + | validators : []ValidatorData | 4 + len(validators) * 88 bytes | + +-------------------+--------------------------+-------------------------------------------------------+ + | 72 + len(managerAddress) + len(validators) * 88 bytes | + +-------------------------------------------------------+ + */ + + function packSubnetConversionData(SubnetConversionData calldata scd) + internal + pure + returns (bytes memory) + { + bytes memory res = new bytes(92 + scd.initialValidators.length * 88); + // Pack the convertSubnetTx ID + for (uint256 i; i < 32; ++i) { + res[i] = scd.convertSubnetTxID[i]; + } + // Pack the validatorManagerBlockchainID + for (uint256 i; i < 32; ++i) { + res[i + 32] = scd.validatorManagerBlockchainID[i]; + } + // Pack the ADDRESS_LENGTH + for (uint256 i; i < 4; ++i) { + res[i + 64] = bytes1(uint8(20 >> (8 * (3 - i)))); + } + // Pack the address + bytes20 addrBytes = bytes20(scd.validatorManagerAddress); + for (uint256 i = 0; i < 20; i++) { + res[i + 68] = addrBytes[i]; + } + + // Pack the ADDRESS_LENGTH + uint32 ivLength = uint32(scd.initialValidators.length); + for (uint256 i; i < 4; ++i) { + res[i + 88] = bytes1(uint8(ivLength >> (8 * (3 - i)))); + } + + for (uint256 i = 0; i < scd.initialValidators.length; i++) { + uint256 offset = 92 + i * 88; + // Pack the nodeID + for (uint256 j; j < 32; ++j) { + res[offset + j] = scd.initialValidators[i].nodeID[j]; + } + // Pack the weight + for (uint256 j; j < 8; ++j) { + res[offset + 32 + j] = + bytes1(uint8(scd.initialValidators[i].weight >> (8 * (7 - j)))); + } + // Pack the blsPublicKey + for (uint256 j; j < 48; ++j) { + res[offset + 40 + j] = scd.initialValidators[i].blsPublicKey[j]; + } + } + return res; + } /** * @notice Packs a RegisterSubnetValidatorMessage message into a byte array. diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 22cc80c35..1d30ffbca 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -23,7 +23,7 @@ abstract contract ValidatorManagerTest is Test { bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes32 public constant DEFAULT_NODE_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); - bytes32 public constant DEFAULT_INTIIAL_VALIDATOR_NODE_ID = + bytes32 public constant DEFAULT_INITIAL_VALIDATOR_NODE_ID = bytes32(hex"2345678123456781234567812345678123456781234567812345678123456781"); bytes public constant DEFAULT_BLS_PUBLIC_KEY = bytes( hex"123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" @@ -429,7 +429,7 @@ abstract contract ValidatorManagerTest is Test { function _defaultSubnetConversionData() internal view returns (SubnetConversionData memory) { InitialValidator[] memory initialValidators = new InitialValidator[](1); initialValidators[0] = InitialValidator({ - nodeID: DEFAULT_INTIIAL_VALIDATOR_NODE_ID, + nodeID: DEFAULT_INITIAL_VALIDATOR_NODE_ID, weight: DEFAULT_INITIAL_VALIDATOR_WEIGHT, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); diff --git a/contracts/teleporter/README.md b/contracts/teleporter/README.md index b0f38a3c3..c5ca8c236 100644 --- a/contracts/teleporter/README.md +++ b/contracts/teleporter/README.md @@ -69,7 +69,7 @@ Once sent on chain, Warp messages cannot be re-signed by a new validator set in **Do not deploy the `TeleporterMessenger` contract using `forge create`**. The `TeleporterMessenger` contract must be deployed to the same contract address on every chain. To achieve this, the contract can be deployed using a static transaction that uses Nick's method as documented in [this guide](../..//utils/contract-deployment/README.md). Alternatively, if creating a new Subnet, the contract can be pre-allocated with the proper address and state in the new chain's [genesis file](https://docs.avax.network/build/subnet/upgrade/customize-a-subnet#setting-the-genesis-allocation). -As an example, to include `TeleporterMessenger` `v1.0.0` in the genesis file, include the following values in the `alloc` settings, as documented at the link above. The `storage` values included below correspond to the two contract values that are initialized as part of the default constructor of `TeleporterMessenger`. These are the `ReentrancyGuard` values set in this [abstract contract](../utilities/ReentrancyGuards.sol). Future versions of `TeleporterMessenger` may require different storage value intializations. +As an example, to include `TeleporterMessenger` `v1.0.0` in the genesis file, include the following values in the `alloc` settings, as documented at the link above. The `storage` values included below correspond to the two contract values that are initialized as part of the default constructor of `TeleporterMessenger`. These are the `ReentrancyGuard` values set in this [abstract contract](../utilities/ReentrancyGuards.sol). Future versions of `TeleporterMessenger` may require different storage value initializations. ```json "alloc": { "0x253b2784c75e510dD0fF1da844684a1aC0aa5fcf": { From b4ea1b35b033472076e08b5588bab801e49f0d4a Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Thu, 19 Sep 2024 10:45:52 -0400 Subject: [PATCH 366/545] rename more references --- tests/flows/validator-manager/poa_to_pos.go | 4 ++-- .../validator-manager/poa_validator_manager.go | 2 +- tests/local/e2e_test.go | 14 +++++++------- tests/utils/validator_manager.go | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/tests/flows/validator-manager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go index 9b0dbecca..918dd3c79 100644 --- a/tests/flows/validator-manager/poa_to_pos.go +++ b/tests/flows/validator-manager/poa_to_pos.go @@ -6,8 +6,8 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/NativeTokenStakingManager" - poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/PoAValidatorManager" + nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/NativeTokenStakingManager" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/crypto" diff --git a/tests/flows/validator-manager/poa_validator_manager.go b/tests/flows/validator-manager/poa_validator_manager.go index 6a51ea077..28866d58d 100644 --- a/tests/flows/validator-manager/poa_validator_manager.go +++ b/tests/flows/validator-manager/poa_validator_manager.go @@ -8,7 +8,7 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/PoAValidatorManager" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/crypto" diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index 88011b97b..e1795e69b 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -8,9 +8,9 @@ import ( "testing" "github.com/ava-labs/teleporter/tests/flows/governance" - "github.com/ava-labs/teleporter/tests/flows/staking" "github.com/ava-labs/teleporter/tests/flows/teleporter" "github.com/ava-labs/teleporter/tests/flows/teleporter/registry" + validatorManager "github.com/ava-labs/teleporter/tests/flows/validator-manager" deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" "github.com/ethereum/go-ethereum/log" "github.com/onsi/ginkgo/v2" @@ -200,31 +200,31 @@ var _ = ginkgo.Describe("[Teleporter integration tests]", func() { ginkgo.It("Native token staking manager", ginkgo.Label(validatorManagerLabel), func() { - staking.NativeTokenStakingManager(LocalNetworkInstance) + validatorManager.NativeTokenStakingManager(LocalNetworkInstance) }) ginkgo.It("ERC20 token staking manager", ginkgo.Label(validatorManagerLabel), func() { - staking.ERC20TokenStakingManager(LocalNetworkInstance) + validatorManager.ERC20TokenStakingManager(LocalNetworkInstance) }) ginkgo.It("PoA validator manager", ginkgo.Label(validatorManagerLabel), func() { - staking.PoAValidatorManager(LocalNetworkInstance) + validatorManager.PoAValidatorManager(LocalNetworkInstance) }) ginkgo.It("ERC20 delegation", ginkgo.Label(validatorManagerLabel), func() { - staking.ERC20Delegation(LocalNetworkInstance) + validatorManager.ERC20Delegation(LocalNetworkInstance) }) ginkgo.It("Native token delegation", ginkgo.Label(validatorManagerLabel), func() { - staking.NativeDelegation(LocalNetworkInstance) + validatorManager.NativeDelegation(LocalNetworkInstance) }) ginkgo.It("PoA migration to PoS", ginkgo.Label(validatorManagerLabel), func() { - staking.PoAMigrationToPoS(LocalNetworkInstance) + validatorManager.PoAMigrationToPoS(LocalNetworkInstance) }) }) diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index b215c822c..55ebf381b 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -21,10 +21,10 @@ import ( "github.com/ava-labs/subnet-evm/precompile/contracts/warp" predicateutils "github.com/ava-labs/subnet-evm/predicate" exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" - erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/ERC20TokenStakingManager" - examplerewardcalculator "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/ExampleRewardCalculator" - nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/NativeTokenStakingManager" - poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validatorManager/PoAValidatorManager" + erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/ERC20TokenStakingManager" + examplerewardcalculator "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/ExampleRewardCalculator" + nativetokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/NativeTokenStakingManager" + poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ethereum/go-ethereum/common" From 8f25e079d04967489e42f423dcceea4edaf2e8c1 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 19 Sep 2024 10:00:04 -0500 Subject: [PATCH 367/545] inline memory vars --- .../validator-manager/PoSValidatorManager.sol | 17 +++++------------ .../validator-manager/ValidatorManager.sol | 11 +++-------- 2 files changed, 8 insertions(+), 20 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index c19b55903..03242cf72 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -150,10 +150,8 @@ abstract contract PoSValidatorManager is function claimDelegationFees(bytes32 validationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - Validator memory validator = getValidator(validationID); - require( - validator.status == ValidatorStatus.Completed, + getValidator(validationID).status == ValidatorStatus.Completed, "PoSValidatorManager: validation period not completed" ); require( @@ -402,16 +400,13 @@ abstract contract PoSValidatorManager is PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Unpack the Warp message - WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce,) = - ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - - Validator memory validator = getValidator(validationID); + ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(_getPChainWarpMessage(messageIndex).payload); // The received nonce should be no greater than the highest sent nonce. This should never // happen since the staking manager is the only entity that can trigger a weight update // on the P-Chain. - require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); + require(getValidator(validationID).messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); // The nonce should also be greater than or equal to the delegationID's starting nonce. This allows // a weight update using a higher nonce (which implicitly includes the delegation's weight update) @@ -538,17 +533,15 @@ abstract contract PoSValidatorManager is PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Unpack the Warp message - WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce,) = - ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); + ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(_getPChainWarpMessage(messageIndex).payload); - Validator memory validator = getValidator(validationID); Delegator memory delegator = $._delegatorStakes[delegationID]; // The received nonce should be no greater than the highest sent nonce. This should never // happen since the staking manager is the only entity that can trigger a weight update // on the P-Chain. - require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); + require(getValidator(validationID).messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); // The nonce should also be greater than or equal to the delegationID's ending nonce. This allows // a weight update using a higher nonce (which implicitly includes the delegation's weight update) diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index f67def6b7..870a90223 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -191,10 +191,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida $._churnTracker.totalWeight = totalWeight; // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's subnetConversionID. - WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); - // Parse the Warp message into SubnetConversionMessage bytes32 subnetConversionID = - ValidatorMessages.unpackSubnetConversionMessage(warpMessage.payload); + ValidatorMessages.unpackSubnetConversionMessage(_getPChainWarpMessage(messageIndex).payload); require( sha256(encodedConversion) == subnetConversionID, "ValidatorManager: invalid subnet conversion ID" @@ -294,9 +292,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida */ function completeValidatorRegistration(uint32 messageIndex) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, bool validRegistration) = - ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); + ValidatorMessages.unpackSubnetValidatorRegistrationMessage(_getPChainWarpMessage(messageIndex).payload); require(validRegistration, "ValidatorManager: Registration not valid"); // The initial validator set must have been set already to have pending register validation messages. @@ -402,10 +399,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // Get the Warp message. - WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); - (bytes32 validationID, bool validRegistration) = - ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); + ValidatorMessages.unpackSubnetValidatorRegistrationMessage(_getPChainWarpMessage(messageIndex).payload); require(!validRegistration, "ValidatorManager: registration still valid"); Validator memory validator = $._validationPeriods[validationID]; From 099bf13ea26ff8b7c335fff84718418ce9cf7bd1 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 11:19:49 -0400 Subject: [PATCH 368/545] add test --- .../staking/tests/PoSValidatorManagerTests.t.sol | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 0a6bd5d5a..001260350 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -40,8 +40,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { event ValidationUptimeUpdated(bytes32 indexed validationID, uint64 uptime); - event GeoffEvent(uint256 num); - event DelegatorAdded( bytes32 indexed delegationID, bytes32 indexed validationID, @@ -415,6 +413,20 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); } + function testInitializeEndValidationNotOwner() public { + bytes32 validationID = _setUpCompleteValidatorRegistration({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + vm.prank(address(1)); + vm.expectRevert("PoSValidatorManager: validator not owned by sender"); + posValidatorManager.initializeEndValidation(validationID, false, 0); + } + function testInitializeEndDelegation() public { bytes32 validationID = _setUpCompleteValidatorRegistration({ nodeID: DEFAULT_NODE_ID, From 2b9ff693f1e474404c4c8569e19813b5ace57f80 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 19 Sep 2024 08:38:42 -0700 Subject: [PATCH 369/545] use constant for pchain blockchain id --- .../ERC20TokenStakingManager.go | 48 +++++++++++++++---- .../NativeTokenStakingManager.go | 48 +++++++++++++++---- .../PoAValidatorManager.go | 48 +++++++++++++++---- contracts/staking/ValidatorManager.sol | 8 ++-- .../staking/interfaces/IValidatorManager.sol | 1 - .../tests/ERC20TokenStakingManagerTests.t.sol | 6 --- .../NativeTokenStakingManagerTests.t.sol | 6 --- .../tests/PoAValidatorManagerTests.t.sol | 1 - .../staking/tests/ValidatorManagerTests.t.sol | 4 +- 9 files changed, 121 insertions(+), 49 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 87d753bd6..56689207a 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -68,7 +68,6 @@ type Validator struct { // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { - PChainBlockchainID [32]byte SubnetID [32]byte ChurnPeriodSeconds uint64 MaximumChurnPercentage uint8 @@ -83,8 +82,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615b86380380615b8683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615a398061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061016d575f3560e01c806366435abf116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b61461037a578063d5f20ff614610382578063df93d8de146103a2578063eb0acb89146103ac575f80fd5b8063b771b3bc1461032e578063ba3a4b9714610354578063bee0a03f14610367575f80fd5b806366435abf146102c757806376f78621146102da5780638280a25a146102ed57806398f3e2b4146102f55780639e1bc4ef14610308578063a3a65e481461031b575f80fd5b806335455ded1161012a57806335455ded14610242578063467ef06f1461025e5780635297fae61461027157806360305d621461028457806361e2f490146102a157806362065856146102b4575f80fd5b80630118acc4146101715780630322ed98146101865780630cdd098514610199578063151d30d1146101ea5780632e2194d814610204578063330a0a3a1461022f575b5f80fd5b61018461017f366004614dbc565b6103bf565b005b610184610194366004614df7565b610774565b6101d76101a7366004614df7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101f2600a81565b60405160ff90911681526020016101e1565b610217610212366004614df7565b61092d565b6040516001600160401b0390911681526020016101e1565b61018461023d366004614e22565b610943565b61024b61271081565b60405161ffff90911681526020016101e1565b61018461026c366004614e60565b610a22565b61018461027f366004614e79565b610a75565b61028c601481565b60405163ffffffff90911681526020016101e1565b6101846102af366004614ea1565b610c4a565b6101d76102c2366004614f05565b61127e565b6102176102d5366004614df7565b611297565b6101846102e8366004614dbc565b6112ab565b6101f2603081565b610184610303366004614e79565b61138c565b6101d7610316366004614f1e565b6115b9565b610184610329366004614e60565b6115e5565b61033c6005600160991b0181565b6040516001600160a01b0390911681526020016101e1565b610184610362366004614df7565b61179d565b610184610375366004614df7565b611a23565b6101f2601481565b610395610390366004614df7565b611b37565b6040516101e19190614f52565b6102176202a30081565b6101d76103ba366004615019565b611c2a565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f8051602061598d8339815191529184156104115761040e8285611c5f565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561044357610443614f3e565b600481111561045457610454614f3e565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104d084611b37565b90506002825160048111156104e7576104e7614f3e565b146105395760405162461bcd60e51b815260206004820152602a60248201525f805160206159ad8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b0316331461059e5760405162461bcd60e51b815260206004820152603360248201525f805160206159ad8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610530565b60038252805160029060058111156105b8576105b8614f3e565b036105fc575f826060015182608001516105d29190615092565b90506105de8582611efb565b506001600160401b0390811660e0850152421660a08401525061061d565b60608101516001600160401b0390811660e084015260c08201511660a08301525b5f88815260068601602052604090208251815484929190829060ff1916600183600481111561064e5761064e614f3e565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610762916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615a0d8339815191526020526040808220815160e0810190925280545f805160206159cd83398151915293929190829060ff1660058111156107c1576107c1614f3e565b60058111156107d2576107d2614f3e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561084157610841614f3e565b146108a65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610530565b6005600160991b016001600160a01b031663ee5b48eb6108cb8584606001515f612052565b6040518263ffffffff1660e01b81526004016108e791906150d4565b6020604051808303815f875af1158015610903573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109279190615106565b50505050565b5f61093d64e8d4a510008361511d565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061098c575080546001600160401b03808416911610155b156109aa5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109d58484612279565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f8051602061598d8339815191525f80610a3b84612293565b6040808201515f848152600588016020529190912054929450909250610927916001600160401b03909116906001600160a01b031661260b565b5f8051602061598d8339815191525f610a8d84612641565b90505f80610a9e836040015161281b565b50915091505f610aad83611b37565b9050816001600160401b031681606001516001600160401b03161015610ae55760405162461bcd60e51b81526004016105309061513c565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610b2a5760405162461bcd60e51b81526004016105309061517e565b60015f87815260068701602052604090205460ff166004811115610b5057610b50614f3e565b14610bb95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610530565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206159cd8339815191529060ff1615610ce75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610530565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d2a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d4e9190615106565b836020013514610db05760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610530565b30610dc160608501604086016151c7565b6001600160a01b031614610e335760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610530565b5f610e4160608501856151e2565b91505f9050843560208601356014610e5f6060890160408a016151c7565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561118e575f610edf60608901896151e2565b8363ffffffff16818110610ef557610ef5615227565b9050602002810190610f07919061523b565b610f10906152eb565b80515f8181526009890160205260409020549192509015610f435760405162461bcd60e51b815260040161053090615382565b84825f015183602001518460400151604051602001610f6594939291906153ca565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610fb39190615419565b602060405180830381855afa158015610fce573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ff19190615106565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff1916600183600581111561107d5761107d614f3e565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161113091168661542a565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806111879061543d565b9050610ec3565b50600584018190555f6111a086612641565b90505f6111b08260400151612a56565b9050806002856040516111c39190615419565b602060405180830381855afa1580156111de573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112019190615106565b146112655760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610530565b505050600a909201805460ff1916600117905550505050565b5f61093d6001600160401b03831664e8d4a5100061545f565b5f6112a182611b37565b6080015192915050565b5f8051602061598d8339815191525f6112c385611b37565b5f86815260058401602052604090205460a08201519192506112f691600160b01b9091046001600160401b031690615476565b6001600160401b031642101561136a5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610530565b831561137c5761137a8584611c5f565b505b61138585612bc8565b5050505050565b611394612e39565b5f8051602061598d8339815191525f6113ac84612641565b90505f806113bd836040015161281b565b50915091505f6113cc83611b37565b9050816001600160401b031681606001516001600160401b031610156114045760405162461bcd60e51b81526004016105309061513c565b5f8681526006860160205260409020600301546001600160401b03808416911611156114425760405162461bcd60e51b81526004016105309061517e565b60035f87815260068701602052604090205460ff16600481111561146857611468614f3e565b146114bc5760405162461bcd60e51b815260206004820152603160248201525f805160206159ad8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610530565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526115619161260b565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506115b560015f805160206159ed83398151915255565b5050565b5f6115c2612e39565b6115cd833384612e83565b905061093d60015f805160206159ed83398151915255565b5f805160206159cd8339815191525f6115fd83612641565b90505f8061160e836040015161326b565b91509150806116705760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610530565b5f8281526007850160205260408120805461168a90615496565b90501180156116bc575060015f83815260088601602052604090205460ff1660058111156116ba576116ba614f3e565b145b6116d85760405162461bcd60e51b8152600401610530906154ce565b5f82815260078501602052604081206116f091614d4d565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061598d83398151915293929190829060ff1660048111156117fe576117fe614f3e565b600481111561180f5761180f614f3e565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561189657611896614f3e565b14806118b457506003815160048111156118b2576118b2614f3e565b145b6119085760405162461bcd60e51b815260206004820152603260248201525f805160206159ad833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610530565b5f6119168260400151611b37565b905080606001516001600160401b03165f0361199a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610530565b6005600160991b016001600160a01b031663ee5b48eb6119c7846040015184606001518560800151612052565b6040518263ffffffff1660e01b81526004016119e391906150d4565b6020604051808303815f875af11580156119ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113859190615106565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206159cd833981519152929190611a6b90615496565b9050118015611a9d575060015f83815260088301602052604090205460ff166005811115611a9b57611a9b614f3e565b145b611ab95760405162461bcd60e51b8152600401610530906154ce565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611af29190600401615515565b6020604051808303815f875af1158015611b0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b329190615106565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f80516020615a0d83398151915290528390208351918201909352825491925f805160206159cd83398151915292829060ff166005811115611bb757611bb7614f3e565b6005811115611bc857611bc8614f3e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611c33612e39565b611c3f8585858561340c565b9050611c5760015f805160206159ed83398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611caa573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cd191908101906155aa565b9150915080611d345760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610530565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9b9190615106565b825114611dff5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610530565b60208201516001600160a01b031615611e755760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610530565b5f80611e848460400151613681565b91509150818714611ef15760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610530565b9695505050505050565b5f8281525f80516020615a0d833981519152602052604081206002015481905f805160206159cd83398151915290600160801b90046001600160401b0316611f438582613859565b5f611f4d87613a67565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611f9d8a858b612052565b6040518263ffffffff1660e01b8152600401611fb991906150d4565b6020604051808303815f875af1158015611fd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff99190615106565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156120cb5761208b81600161567c565b61209690600861545f565b5081515f908390839081106120ad576120ad615227565b60200101906001600160f81b03191690815f1a905350600101612077565b505f5b6004811015612136576120e281600361567c565b6120ed90600861545f565b600263ffffffff16901c60f81b82826002612108919061542a565b8151811061211857612118615227565b60200101906001600160f81b03191690815f1a9053506001016120ce565b505f5b60208110156121985761214d81601f61567c565b61215890600861545f565b86901c60f81b8261216a83600661542a565b8151811061217a5761217a615227565b60200101906001600160f81b03191690815f1a905350600101612139565b505f5b6008811015612203576121af81600761567c565b6121ba90600861545f565b6001600160401b038616901c60f81b826121d583602661542a565b815181106121e5576121e5615227565b60200101906001600160f81b03191690815f1a90535060010161219b565b505f5b600881101561226e5761221a81600761567c565b61222590600861545f565b6001600160401b038516901c60f81b8261224083602e61542a565b8151811061225057612250615227565b60200101906001600160f81b03191690815f1a905350600101612206565b5090505b9392505050565b612281613af7565b61228a82613b42565b6115b581613bb9565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206159cd8339815191525f6122e285612641565b90505f806122f3836040015161326b565b9150915080156123585760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610530565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561238957612389614f3e565b600581111561239a5761239a614f3e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561240b5761240b614f3e565b1480612429575060018251600581111561242757612427614f3e565b145b6124885760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610530565b60038251600581111561249d5761249d614f3e565b036124aa575060046124ae565b5060055b6020808301515f908152600988019091526040812055818160058111156124d7576124d7614f3e565b908160058111156124ea576124ea614f3e565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561251e5761251e614f3e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156125d2576125d2614f3e565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546115b5906001600160a01b03168284613c6d565b60408051606080820183525f8083526020830181905292820152905f805160206159cd8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156126b6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126dd91908101906155aa565b915091508061273d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610530565b82548251146127a05760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610530565b60208201516001600160a01b0316156128135760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610530565b509392505050565b5f805f835160361461283f5760405162461bcd60e51b81526004016105309061568f565b5f805b600281101561288e5761285681600161567c565b61286190600861545f565b61ffff1686828151811061287757612877615227565b016020015160f81c901b9190911790600101612842565b5061ffff8116156128b15760405162461bcd60e51b8152600401610530906156d8565b5f805b600481101561290c576128c881600361567c565b6128d390600861545f565b63ffffffff16876128e583600261542a565b815181106128f5576128f5615227565b016020015160f81c901b91909117906001016128b4565b5063ffffffff81166004146129335760405162461bcd60e51b81526004016105309061571b565b5f805b60208110156129885761294a81601f61567c565b61295590600861545f565b8861296183600661542a565b8151811061297157612971615227565b016020015160f81c901b9190911790600101612936565b505f805b60088110156129e7576129a081600761567c565b6129ab90600861545f565b6001600160401b0316896129c083602661542a565b815181106129d0576129d0615227565b016020015160f81c901b919091179060010161298c565b505f805b6008811015612a46576129ff81600761567c565b612a0a90600861545f565b6001600160401b03168a612a1f83602e61542a565b81518110612a2f57612a2f615227565b016020015160f81c901b91909117906001016129eb565b5091989097509095509350505050565b5f8151602614612a785760405162461bcd60e51b81526004016105309061568f565b5f805b6002811015612ac757612a8f81600161567c565b612a9a90600861545f565b61ffff16848281518110612ab057612ab0615227565b016020015160f81c901b9190911790600101612a7b565b5061ffff811615612aea5760405162461bcd60e51b8152600401610530906156d8565b5f805b6004811015612b4557612b0181600361567c565b612b0c90600861545f565b63ffffffff1685612b1e83600261542a565b81518110612b2e57612b2e615227565b016020015160f81c901b9190911790600101612aed565b5063ffffffff811615612b6a5760405162461bcd60e51b81526004016105309061571b565b5f805b6020811015612bbf57612b8181601f61567c565b612b8c90600861545f565b86612b9883600661542a565b81518110612ba857612ba8615227565b016020015160f81c901b9190911790600101612b6d565b50949350505050565b5f8181525f80516020615a0d8339815191526020526040808220815160e0810190925280545f805160206159cd83398151915293929190829060ff166005811115612c1557612c15614f3e565b6005811115612c2657612c26614f3e565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612c9857612c98614f3e565b14612cf45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610530565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff19166001836005811115612d3857612d38614f3e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612de48482611efb565b6080840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f805160206159ed833981519152805460011901612e6a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206159ed83398151915255565b5f5f8051602061598d83398151915281612e9f61021285613ccc565b90505f612eab87611b37565b5f8881527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020549091506001600160a01b0316612f415760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610530565b600281516005811115612f5657612f56614f3e565b14612fb55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610530565b5f828260800151612fc69190615476565b60048501546040840151919250612fe8916001600160401b0390911690615762565b6001600160401b0316816001600160401b031611156130675760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610530565b5f806130738a84611efb565b915091505f8a836040516020016130a192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561313c5761313c614f3e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461328e5760405162461bcd60e51b81526004016105309061568f565b5f805b60028110156132dd576132a581600161567c565b6132b090600861545f565b61ffff168582815181106132c6576132c6615227565b016020015160f81c901b9190911790600101613291565b5061ffff8116156133005760405162461bcd60e51b8152600401610530906156d8565b5f805b600481101561335b5761331781600361567c565b61332290600861545f565b63ffffffff168661333483600261542a565b8151811061334457613344615227565b016020015160f81c901b9190911790600101613303565b5063ffffffff81166003146133825760405162461bcd60e51b81526004016105309061571b565b5f805b60208110156133d75761339981601f61567c565b6133a490600861545f565b876133b083600661542a565b815181106133c0576133c0615227565b016020015160f81c901b9190911790600101613385565b505f866026815181106133ec576133ec615227565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061598d8339815191529061ffff861610801590613458575061271061ffff861611155b6134745760405162461bcd60e51b81526004016105309061578d565b60028101546001600160401b0390811690851610156134ed5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610530565b80548310156135505760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610530565b80600101548311156135b75760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610530565b5f6135c184613ccc565b90505f6135cd8261092d565b90505f6135da8983613d02565b905060405180606001604052806135ee3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e146136a45760405162461bcd60e51b81526004016105309061568f565b5f805b60028110156136f3576136bb81600161567c565b6136c690600861545f565b61ffff168582815181106136dc576136dc615227565b016020015160f81c901b91909117906001016136a7565b5061ffff8116156137165760405162461bcd60e51b8152600401610530906156d8565b5f805b60048110156137715761372d81600361567c565b61373890600861545f565b63ffffffff168661374a83600261542a565b8151811061375a5761375a615227565b016020015160f81c901b9190911790600101613719565b5063ffffffff81166005146137985760405162461bcd60e51b81526004016105309061571b565b5f805b60208110156137ed576137af81601f61567c565b6137ba90600861545f565b876137c683600661542a565b815181106137d6576137d6615227565b016020015160f81c901b919091179060010161379b565b505f805b600881101561384c5761380581600761567c565b61381090600861545f565b6001600160401b03168861382583602661542a565b8151811061383557613835615227565b016020015160f81c901b91909117906001016137f1565b5090969095509350505050565b5f805160206159cd8339815191525f6001600160401b03808416908516111561388d576138868385615092565b905061389a565b6138978484615092565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b03166060820152429115806138fc5750600284015481516138f8916001600160401b03169061542a565b8210155b15613922576001600160401b038316606082015281815260408101516020820152613941565b82816060018181516139349190615476565b6001600160401b03169052505b6060810151613951906064615762565b602082015160028601546001600160401b03929092169161397c9190600160401b900460ff1661545f565b10156139e05760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610530565b856001600160401b0316816040018181516139fb919061542a565b9052506040810180516001600160401b0387169190613a1b90839061567c565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615a0d8339815191526020526040812060020180545f805160206159cd83398151915291600160401b9091046001600160401b0316906008613ab1836157d8565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613b4057604051631afcd79f60e31b815260040160405180910390fd5b565b613b4a613af7565b613b5381614267565b613b5b614280565b613bb6608082013560a0830135613b7860e0850160c08601614f05565b613b89610100860160e087016157f3565b61ffff16613b9f6101208701610100880161580c565b613bb1610140880161012089016151c7565b614290565b50565b613bc1613af7565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b038216613c4d5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610530565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611b3291859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506144d4565b5f61093d827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b031690614535565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613d8d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610530565b5f805160206159cd83398151915242613dac6040860160208701614f05565b6001600160401b031611613e1e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610530565b613e2e6040850160208601614f05565b6001600160401b0316613e446202a3004261542a565b11613eb75760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610530565b8335613f0f5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610530565b83355f90815260098201602052604090205415613f3e5760405162461bcd60e51b815260040161053090615382565b6030613f4d604086018661582c565b905014613fb25760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610530565b613fbc835f613859565b5f806140566040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906140019190614f05565b6001600160401b0316815260200161401c60408a018a61582c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614697565b5f8281526007860160205260409020919350915061407482826158b2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906140a19085906004016150d4565b6020604051808303815f875af11580156140bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e19190615106565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561415957614159614f3e565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614239918e01908e01614f05565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61426f613af7565b614277614a46565b613bb681614a4e565b614288613af7565b613b40614bf0565b614298613af7565b5f8051602061598d833981519152836143045760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610530565b6127108411156143265760405162461bcd60e51b81526004016105309061578d565b8587111561438e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610530565b5f8360ff16116143fb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610530565b600a60ff8416111561446d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610530565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6144e86001600160a01b03841683614bf8565b905080515f1415801561450c57508080602001905181019061450a9190615971565b155b15611b3257604051635274afe760e01b81526001600160a01b0384166004820152602401610530565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561457b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061459f9190615106565b90506145b66001600160a01b038516333086614c05565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156145fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061461e9190615106565b90508181116146845760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610530565b61468e828261567c565b95945050505050565b5f60608260800151516030146147015760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610530565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156147785761473881600161567c565b61474390600861545f565b5081515f9083908390811061475a5761475a615227565b60200101906001600160f81b03191690815f1a905350600101614724565b505f5b60048110156147e05761478f81600361567c565b61479a90600861545f565b600160ff919091161c60f81b826147b283600261542a565b815181106147c2576147c2615227565b60200101906001600160f81b03191690815f1a90535060010161477b565b505f5b602081101561483d57845181602081106147ff576147ff615227565b1a60f81b8261480f83600661542a565b8151811061481f5761481f615227565b60200101906001600160f81b03191690815f1a9053506001016147e3565b505f5b602081101561489d578460200151816020811061485f5761485f615227565b1a60f81b8261486f83602661542a565b8151811061487f5761487f615227565b60200101906001600160f81b03191690815f1a905350600101614840565b505f5b6008811015614911576148b481600761567c565b6148bf90600861545f565b60ff1685604001516001600160401b0316901c60f81b828260466148e3919061542a565b815181106148f3576148f3615227565b60200101906001600160f81b03191690815f1a9053506001016148a0565b505f5b603081101561497c578460800151818151811061493357614933615227565b01602001516001600160f81b0319168261494e83604e61542a565b8151811061495e5761495e615227565b60200101906001600160f81b03191690815f1a905350600101614914565b505f5b60088110156149ee5761499381600761567c565b61499e90600861545f565b60608601516001600160401b0390811691161c60f81b826149c083607e61542a565b815181106149d0576149d0615227565b60200101906001600160f81b03191690815f1a90535060010161497f565b506002816040516149ff9190615419565b602060405180830381855afa158015614a1a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a3d9190615106565b94909350915050565b613b40613af7565b614a56613af7565b80355f805160206159cd83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614aa2608084016060850161580c565b60ff161115614b0f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610530565b5f614b20608084016060850161580c565b60ff1611614b885760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610530565b614b98608083016060840161580c565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614bc96060830160408401614f05565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612e70613af7565b606061227283835f614c3e565b6040516001600160a01b0384811660248301528381166044830152606482018390526109279186918216906323b872dd90608401613c9a565b606081471015614c635760405163cd78605960e01b8152306004820152602401610530565b5f80856001600160a01b03168486604051614c7e9190615419565b5f6040518083038185875af1925050503d805f8114614cb8576040519150601f19603f3d011682016040523d82523d5f602084013e614cbd565b606091505b5091509150611ef1868383606082614cdd57614cd882614d24565b612272565b8151158015614cf457506001600160a01b0384163b155b15614d1d57604051639996b31560e01b81526001600160a01b0385166004820152602401610530565b5080612272565b805115614d345780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614d5990615496565b5f825580601f10614d68575050565b601f0160209004905f5260205f2090810190613bb691905b80821115614d93575f8155600101614d80565b5090565b8015158114613bb6575f80fd5b803563ffffffff81168114614db7575f80fd5b919050565b5f805f60608486031215614dce575f80fd5b833592506020840135614de081614d97565b9150614dee60408501614da4565b90509250925092565b5f60208284031215614e07575f80fd5b5035919050565b6001600160a01b0381168114613bb6575f80fd5b5f80828403610160811215614e35575f80fd5b61014080821215614e44575f80fd5b8493508301359050614e5581614e0e565b809150509250929050565b5f60208284031215614e70575f80fd5b61227282614da4565b5f8060408385031215614e8a575f80fd5b614e9383614da4565b946020939093013593505050565b5f8060408385031215614eb2575f80fd5b82356001600160401b03811115614ec7575f80fd5b830160808186031215614ed8575f80fd5b9150614ee660208401614da4565b90509250929050565b80356001600160401b0381168114614db7575f80fd5b5f60208284031215614f15575f80fd5b61227282614eef565b5f8060408385031215614f2f575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614f7557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614fb060608401826001600160401b03169052565b506080830151614fcb60808401826001600160401b03169052565b5060a0830151614fe660a08401826001600160401b03169052565b5060c083015161500160c08401826001600160401b03169052565b5092915050565b803561ffff81168114614db7575f80fd5b5f805f806080858703121561502c575f80fd5b84356001600160401b03811115615041575f80fd5b850160608188031215615052575f80fd5b935061506060208601615008565b925061506e60408601614eef565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156150015761500161507e565b5f5b838110156150cc5781810151838201526020016150b4565b50505f910152565b602081525f82518060208401526150f28160408501602087016150b2565b601f01601f19169190910160400192915050565b5f60208284031215615116575f80fd5b5051919050565b5f8261513757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156151d7575f80fd5b813561227281614e0e565b5f808335601e198436030181126151f7575f80fd5b8301803591506001600160401b03821115615210575f80fd5b6020019150600581901b360382131561204b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261524f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561528f5761528f615259565b60405290565b604051601f8201601f191681016001600160401b03811182821017156152bd576152bd615259565b604052919050565b5f6001600160401b038211156152dd576152dd615259565b50601f01601f191660200190565b5f606082360312156152fb575f80fd5b61530361526d565b823581526020615314818501614eef565b8183015260408401356001600160401b03811115615330575f80fd5b840136601f820112615340575f80fd5b803561535361534e826152c5565b615295565b8181523684838501011115615366575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516153db818460208a016150b2565b80830190508581526001600160401b0360c01b8560c01b166020820152835161540b8160288401602088016150b2565b016028019695505050505050565b5f825161524f8184602087016150b2565b8082018082111561093d5761093d61507e565b5f63ffffffff8083168181036154555761545561507e565b6001019392505050565b808202811582820484141761093d5761093d61507e565b6001600160401b038181168382160190808211156150015761500161507e565b600181811c908216806154aa57607f821691505b6020821081036154c857634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461552781615496565b806020870152604060018084165f8114615548576001811461556457615591565b60ff19851660408a0152604084151560051b8a01019550615591565b895f5260205f205f5b858110156155885781548b820186015290830190880161556d565b8a016040019650505b509398975050505050505050565b8051614db781614d97565b5f80604083850312156155bb575f80fd5b82516001600160401b03808211156155d1575f80fd5b90840190606082870312156155e4575f80fd5b6155ec61526d565b825181526020808401516155ff81614e0e565b82820152604084015183811115615614575f80fd5b80850194505087601f850112615628575f80fd5b8351925061563861534e846152c5565b838152888285870101111561564b575f80fd5b61565a848383018488016150b2565b8060408401525081955061566f81880161559f565b9450505050509250929050565b8181038181111561093d5761093d61507e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146157855761578561507e565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036154555761545561507e565b5f60208284031215615803575f80fd5b61227282615008565b5f6020828403121561581c575f80fd5b813560ff81168114612272575f80fd5b5f808335601e19843603018112615841575f80fd5b8301803591506001600160401b0382111561585a575f80fd5b60200191503681900382131561204b575f80fd5b601f821115611b3257805f5260205f20601f840160051c810160208510156158935750805b601f840160051c820191505b81811015611385575f815560010161589f565b81516001600160401b038111156158cb576158cb615259565b6158df816158d98454615496565b8461586e565b602080601f831160018114615912575f84156158fb5750858301515b5f19600386901b1c1916600185901b178555615969565b5f85815260208120601f198616915b8281101561594057888601518255948401946001909101908401615921565b508582101561595d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615981575f80fd5b815161227281614d9756fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615b62380380615b6283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615a158061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063ba3a4b9711610093578063d5f20ff61161006e578063d5f20ff614610390578063df93d8de146103b0578063eb0acb89146103ba578063f09969ae146103cd575f80fd5b8063ba3a4b9714610362578063bee0a03f14610375578063c974d1b614610388575f80fd5b806376f78621146102e85780638280a25a146102fb57806398f3e2b4146103035780639e1bc4ef14610316578063a3a65e4814610329578063b771b3bc1461033c575f80fd5b8063467ef06f1161014457806361e2f4901161011f57806361e2f490146102a857806362065856146102bb57806366435abf146102ce578063732214f8146102e1575f80fd5b8063467ef06f146102655780635297fae61461027857806360305d621461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e57806335455ded14610249575b5f80fd5b61019e610199366004614d9f565b6103e0565b005b61019e6101ae366004614dda565b610795565b6101f16101c1366004614dda565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c366004614dda565b61094e565b6040516001600160401b0390911681526020016101fb565b61025261271081565b60405161ffff90911681526020016101fb565b61019e610273366004614df1565b610964565b61019e610286366004614e0a565b6109b7565b610293601481565b60405163ffffffff90911681526020016101fb565b61019e6102b6366004614e32565b610b8c565b6101f16102c9366004614e96565b6111c0565b6102316102dc366004614dda565b6111d9565b6101f15f81565b61019e6102f6366004614d9f565b6111ed565b61020c603081565b61019e610311366004614e0a565b6112ce565b6101f1610324366004614eaf565b6114fb565b61019e610337366004614df1565b611527565b61034a6005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e610370366004614dda565b6116df565b61019e610383366004614dda565b611965565b61020c601481565b6103a361039e366004614dda565b611a79565b6040516101fb9190614ee3565b6102316202a30081565b6101f16103c8366004614fa3565b611b6c565b61019e6103db36600461501c565b611ba1565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206159698339815191529184156104325761042f8285611c80565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561046457610464614ecf565b600481111561047557610475614ecf565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104f184611a79565b905060028251600481111561050857610508614ecf565b1461055a5760405162461bcd60e51b815260206004820152602a60248201525f805160206159898339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105bf5760405162461bcd60e51b815260206004820152603360248201525f805160206159898339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610551565b60038252805160029060058111156105d9576105d9614ecf565b0361061d575f826060015182608001516105f3919061506e565b90506105ff8582611f1c565b506001600160401b0390811660e0850152421660a08401525061063e565b60608101516001600160401b0390811660e084015260c08201511660a08301525b5f88815260068601602052604090208251815484929190829060ff1916600183600481111561066f5761066f614ecf565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610783916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206159e98339815191526020526040808220815160e0810190925280545f805160206159a983398151915293929190829060ff1660058111156107e2576107e2614ecf565b60058111156107f3576107f3614ecf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561086257610862614ecf565b146108c75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610551565b6005600160991b016001600160a01b031663ee5b48eb6108ec8584606001515f612073565b6040518263ffffffff1660e01b815260040161090891906150b0565b6020604051808303815f875af1158015610924573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094891906150e2565b50505050565b5f61095e64e8d4a51000836150f9565b92915050565b5f805160206159698339815191525f8061097d8461229a565b6040808201515f848152600588016020529190912054929450909250610948916001600160401b03909116906001600160a01b0316612612565b5f805160206159698339815191525f6109cf84612648565b90505f806109e0836040015161280e565b50915091505f6109ef83611a79565b9050816001600160401b031681606001516001600160401b03161015610a275760405162461bcd60e51b815260040161055190615118565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a6c5760405162461bcd60e51b81526004016105519061515a565b60015f87815260068701602052604090205460ff166004811115610a9257610a92614ecf565b14610afb5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610551565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206159a98339815191529060ff1615610c295760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610551565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9091906150e2565b836020013514610cf25760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610551565b30610d0360608501604086016151a3565b6001600160a01b031614610d755760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610551565b5f610d8360608501856151be565b91505f9050843560208601356014610da16060890160408a016151a3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156110d0575f610e2160608901896151be565b8363ffffffff16818110610e3757610e37615203565b9050602002810190610e499190615217565b610e52906152c7565b80515f8181526008890160205260409020549192509015610e855760405162461bcd60e51b81526004016105519061535e565b84825f015183602001518460400151604051602001610ea794939291906153a6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610ef591906153f5565b602060405180830381855afa158015610f10573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f3391906150e2565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff19166001836005811115610fbf57610fbf614ecf565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611072911686615406565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806110c990615419565b9050610e05565b50600484018190555f6110e286612648565b90505f6110f28260400151612a49565b90508060028560405161110591906153f5565b602060405180830381855afa158015611120573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061114391906150e2565b146111a75760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610551565b5050506009909201805460ff1916600117905550505050565b5f61095e6001600160401b03831664e8d4a5100061543b565b5f6111e382611a79565b6080015192915050565b5f805160206159698339815191525f61120585611a79565b5f86815260058401602052604090205460a082015191925061123891600160b01b9091046001600160401b031690615452565b6001600160401b03164210156112ac5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610551565b83156112be576112bc8584611c80565b505b6112c785612bbb565b5050505050565b6112d6612e2c565b5f805160206159698339815191525f6112ee84612648565b90505f806112ff836040015161280e565b50915091505f61130e83611a79565b9050816001600160401b031681606001516001600160401b031610156113465760405162461bcd60e51b815260040161055190615118565b5f8681526006860160205260409020600301546001600160401b03808416911611156113845760405162461bcd60e51b81526004016105519061515a565b60035f87815260068701602052604090205460ff1660048111156113aa576113aa614ecf565b146113fe5760405162461bcd60e51b815260206004820152603160248201525f805160206159898339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610551565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526114a391612612565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506114f760015f805160206159c983398151915255565b5050565b5f611504612e2c565b61150f833384612e76565b905061095e60015f805160206159c983398151915255565b5f805160206159a98339815191525f61153f83612648565b90505f80611550836040015161325e565b91509150806115b25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610551565b5f828152600685016020526040812080546115cc90615472565b90501180156115fe575060015f83815260078601602052604090205460ff1660058111156115fc576115fc614ecf565b145b61161a5760405162461bcd60e51b8152600401610551906154aa565b5f828152600685016020526040812061163291614d30565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061596983398151915293929190829060ff16600481111561174057611740614ecf565b600481111561175157611751614ecf565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156117d8576117d8614ecf565b14806117f657506003815160048111156117f4576117f4614ecf565b145b61184a5760405162461bcd60e51b815260206004820152603260248201525f80516020615989833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610551565b5f6118588260400151611a79565b905080606001516001600160401b03165f036118dc5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610551565b6005600160991b016001600160a01b031663ee5b48eb611909846040015184606001518560800151612073565b6040518263ffffffff1660e01b815260040161192591906150b0565b6020604051808303815f875af1158015611941573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112c791906150e2565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206159a98339815191529291906119ad90615472565b90501180156119df575060015f83815260078301602052604090205460ff1660058111156119dd576119dd614ecf565b145b6119fb5760405162461bcd60e51b8152600401610551906154aa565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611a3491906004016154f1565b6020604051808303815f875af1158015611a50573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a7491906150e2565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206159e983398151915290528390208351918201909352825491925f805160206159a983398151915292829060ff166005811115611af957611af9614ecf565b6005811115611b0a57611b0a614ecf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611b75612e2c565b611b81858585856133ff565b9050611b9960015f805160206159c983398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611bea575080546001600160401b03808416911610155b15611c085760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611c338484613674565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ccb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cf29190810190615586565b9150915080611d555760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610551565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dbc91906150e2565b825114611e205760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610551565b60208201516001600160a01b031615611e965760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610551565b5f80611ea5846040015161368e565b91509150818714611f125760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610551565b9695505050505050565b5f8281525f805160206159e9833981519152602052604081206002015481905f805160206159a983398151915290600160801b90046001600160401b0316611f648582613866565b5f611f6e87613a74565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611fbe8a858b612073565b6040518263ffffffff1660e01b8152600401611fda91906150b0565b6020604051808303815f875af1158015611ff6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201a91906150e2565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156120ec576120ac816001615658565b6120b790600861543b565b5081515f908390839081106120ce576120ce615203565b60200101906001600160f81b03191690815f1a905350600101612098565b505f5b600481101561215757612103816003615658565b61210e90600861543b565b600263ffffffff16901c60f81b828260026121299190615406565b8151811061213957612139615203565b60200101906001600160f81b03191690815f1a9053506001016120ef565b505f5b60208110156121b95761216e81601f615658565b61217990600861543b565b86901c60f81b8261218b836006615406565b8151811061219b5761219b615203565b60200101906001600160f81b03191690815f1a90535060010161215a565b505f5b6008811015612224576121d0816007615658565b6121db90600861543b565b6001600160401b038616901c60f81b826121f6836026615406565b8151811061220657612206615203565b60200101906001600160f81b03191690815f1a9053506001016121bc565b505f5b600881101561228f5761223b816007615658565b61224690600861543b565b6001600160401b038516901c60f81b8261226183602e615406565b8151811061227157612271615203565b60200101906001600160f81b03191690815f1a905350600101612227565b5090505b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206159a98339815191525f6122e985612648565b90505f806122fa836040015161325e565b91509150801561235f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610551565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561239057612390614ecf565b60058111156123a1576123a1614ecf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561241257612412614ecf565b1480612430575060018251600581111561242e5761242e614ecf565b145b61248f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610551565b6003825160058111156124a4576124a4614ecf565b036124b1575060046124b5565b5060055b6020808301515f908152600888019091526040812055818160058111156124de576124de614ecf565b908160058111156124f1576124f1614ecf565b9052505f84815260078701602052604090208251815484929190829060ff1916600183600581111561252557612525614ecf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156125d9576125d9614ecf565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546114f7906001600160a01b03168284613b04565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156126ac573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126d39190810190615586565b91509150806127335760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610551565b8151156127945760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610551565b60208201516001600160a01b0316156128075760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610551565b5092915050565b5f805f83516036146128325760405162461bcd60e51b81526004016105519061566b565b5f805b600281101561288157612849816001615658565b61285490600861543b565b61ffff1686828151811061286a5761286a615203565b016020015160f81c901b9190911790600101612835565b5061ffff8116156128a45760405162461bcd60e51b8152600401610551906156b4565b5f805b60048110156128ff576128bb816003615658565b6128c690600861543b565b63ffffffff16876128d8836002615406565b815181106128e8576128e8615203565b016020015160f81c901b91909117906001016128a7565b5063ffffffff81166004146129265760405162461bcd60e51b8152600401610551906156f7565b5f805b602081101561297b5761293d81601f615658565b61294890600861543b565b88612954836006615406565b8151811061296457612964615203565b016020015160f81c901b9190911790600101612929565b505f805b60088110156129da57612993816007615658565b61299e90600861543b565b6001600160401b0316896129b3836026615406565b815181106129c3576129c3615203565b016020015160f81c901b919091179060010161297f565b505f805b6008811015612a39576129f2816007615658565b6129fd90600861543b565b6001600160401b03168a612a1283602e615406565b81518110612a2257612a22615203565b016020015160f81c901b91909117906001016129de565b5091989097509095509350505050565b5f8151602614612a6b5760405162461bcd60e51b81526004016105519061566b565b5f805b6002811015612aba57612a82816001615658565b612a8d90600861543b565b61ffff16848281518110612aa357612aa3615203565b016020015160f81c901b9190911790600101612a6e565b5061ffff811615612add5760405162461bcd60e51b8152600401610551906156b4565b5f805b6004811015612b3857612af4816003615658565b612aff90600861543b565b63ffffffff1685612b11836002615406565b81518110612b2157612b21615203565b016020015160f81c901b9190911790600101612ae0565b5063ffffffff811615612b5d5760405162461bcd60e51b8152600401610551906156f7565b5f805b6020811015612bb257612b7481601f615658565b612b7f90600861543b565b86612b8b836006615406565b81518110612b9b57612b9b615203565b016020015160f81c901b9190911790600101612b60565b50949350505050565b5f8181525f805160206159e98339815191526020526040808220815160e0810190925280545f805160206159a983398151915293929190829060ff166005811115612c0857612c08614ecf565b6005811115612c1957612c19614ecf565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612c8b57612c8b614ecf565b14612ce75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610551565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff19166001836005811115612d2b57612d2b614ecf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612dd78482611f1c565b6080840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f805160206159c9833981519152805460011901612e5d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206159c983398151915255565b5f5f8051602061596983398151915281612e9261022c85613b63565b90505f612e9e87611a79565b5f8881527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020549091506001600160a01b0316612f345760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610551565b600281516005811115612f4957612f49614ecf565b14612fa85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610551565b5f828260800151612fb99190615452565b60048501546040840151919250612fdb916001600160401b039091169061573e565b6001600160401b0316816001600160401b0316111561305a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610551565b5f806130668a84611f1c565b915091505f8a8360405160200161309492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561312f5761312f614ecf565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146132815760405162461bcd60e51b81526004016105519061566b565b5f805b60028110156132d057613298816001615658565b6132a390600861543b565b61ffff168582815181106132b9576132b9615203565b016020015160f81c901b9190911790600101613284565b5061ffff8116156132f35760405162461bcd60e51b8152600401610551906156b4565b5f805b600481101561334e5761330a816003615658565b61331590600861543b565b63ffffffff1686613327836002615406565b8151811061333757613337615203565b016020015160f81c901b91909117906001016132f6565b5063ffffffff81166003146133755760405162461bcd60e51b8152600401610551906156f7565b5f805b60208110156133ca5761338c81601f615658565b61339790600861543b565b876133a3836006615406565b815181106133b3576133b3615203565b016020015160f81c901b9190911790600101613378565b505f866026815181106133df576133df615203565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206159698339815191529061ffff86161080159061344b575061271061ffff861611155b6134675760405162461bcd60e51b815260040161055190615769565b60028101546001600160401b0390811690851610156134e05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610551565b80548310156135435760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610551565b80600101548311156135aa5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610551565b5f6135b484613b63565b90505f6135c08261094e565b90505f6135cd8983613b99565b905060405180606001604052806135e13390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b61367c6140fd565b61368582614148565b6114f7816141bd565b5f808251602e146136b15760405162461bcd60e51b81526004016105519061566b565b5f805b6002811015613700576136c8816001615658565b6136d390600861543b565b61ffff168582815181106136e9576136e9615203565b016020015160f81c901b91909117906001016136b4565b5061ffff8116156137235760405162461bcd60e51b8152600401610551906156b4565b5f805b600481101561377e5761373a816003615658565b61374590600861543b565b63ffffffff1686613757836002615406565b8151811061376757613767615203565b016020015160f81c901b9190911790600101613726565b5063ffffffff81166005146137a55760405162461bcd60e51b8152600401610551906156f7565b5f805b60208110156137fa576137bc81601f615658565b6137c790600861543b565b876137d3836006615406565b815181106137e3576137e3615203565b016020015160f81c901b91909117906001016137a8565b505f805b600881101561385957613812816007615658565b61381d90600861543b565b6001600160401b031688613832836026615406565b8151811061384257613842615203565b016020015160f81c901b91909117906001016137fe565b5090969095509350505050565b5f805160206159a98339815191525f6001600160401b03808416908516111561389a57613893838561506e565b90506138a7565b6138a4848461506e565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613909575060018401548151613905916001600160401b031690615406565b8210155b1561392f576001600160401b03831660608201528181526040810151602082015261394e565b82816060018181516139419190615452565b6001600160401b03169052505b606081015161395e90606461573e565b602082015160018601546001600160401b0392909216916139899190600160401b900460ff1661543b565b10156139ed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610551565b856001600160401b031681604001818151613a089190615406565b9052506040810180516001600160401b0387169190613a28908390615658565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206159e98339815191526020526040812060020180545f805160206159a983398151915291600160401b9091046001600160401b0316906008613abe836157b4565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611a7491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614271565b5f61095e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906142d2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613c245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610551565b5f805160206159a983398151915242613c436040860160208701614e96565b6001600160401b031611613cb55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610551565b613cc56040850160208601614e96565b6001600160401b0316613cdb6202a30042615406565b11613d4e5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610551565b8335613da65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610551565b83355f90815260088201602052604090205415613dd55760405162461bcd60e51b81526004016105519061535e565b6030613de460408601866157cf565b905014613e495760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610551565b613e53835f613866565b5f80613eec6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e979190614e96565b6001600160401b03168152602001613eb260408a018a6157cf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614434565b5f82815260068601602052604090209193509150613f0a8282615855565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613f379085906004016150b0565b6020604051808303815f875af1158015613f53573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f7791906150e2565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613fef57613fef614ecf565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916140cf918e01908e01614e96565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661414657604051631afcd79f60e31b815260040160405180910390fd5b565b6141506140fd565b614159816147e3565b6141616147fc565b6141ba6060820135608083013561417e60c0850160a08601614e96565b61418e60e0860160c08701615914565b61ffff166141a3610100870160e0880161592d565b6141b5610120880161010089016151a3565b61480c565b50565b6141c56140fd565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166142515760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610551565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6142856001600160a01b03841683614a50565b905080515f141580156142a95750808060200190518101906142a7919061594d565b155b15611a7457604051635274afe760e01b81526001600160a01b0384166004820152602401610551565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614318573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061433c91906150e2565b90506143536001600160a01b038516333086614a5d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614397573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143bb91906150e2565b90508181116144215760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610551565b61442b8282615658565b95945050505050565b5f606082608001515160301461449e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610551565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614515576144d5816001615658565b6144e090600861543b565b5081515f908390839081106144f7576144f7615203565b60200101906001600160f81b03191690815f1a9053506001016144c1565b505f5b600481101561457d5761452c816003615658565b61453790600861543b565b600160ff919091161c60f81b8261454f836002615406565b8151811061455f5761455f615203565b60200101906001600160f81b03191690815f1a905350600101614518565b505f5b60208110156145da578451816020811061459c5761459c615203565b1a60f81b826145ac836006615406565b815181106145bc576145bc615203565b60200101906001600160f81b03191690815f1a905350600101614580565b505f5b602081101561463a57846020015181602081106145fc576145fc615203565b1a60f81b8261460c836026615406565b8151811061461c5761461c615203565b60200101906001600160f81b03191690815f1a9053506001016145dd565b505f5b60088110156146ae57614651816007615658565b61465c90600861543b565b60ff1685604001516001600160401b0316901c60f81b828260466146809190615406565b8151811061469057614690615203565b60200101906001600160f81b03191690815f1a90535060010161463d565b505f5b603081101561471957846080015181815181106146d0576146d0615203565b01602001516001600160f81b031916826146eb83604e615406565b815181106146fb576146fb615203565b60200101906001600160f81b03191690815f1a9053506001016146b1565b505f5b600881101561478b57614730816007615658565b61473b90600861543b565b60608601516001600160401b0390811691161c60f81b8261475d83607e615406565b8151811061476d5761476d615203565b60200101906001600160f81b03191690815f1a90535060010161471c565b5060028160405161479c91906153f5565b602060405180830381855afa1580156147b7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906147da91906150e2565b94909350915050565b6147eb6140fd565b6147f3614a96565b6141ba81614a9e565b6148046140fd565b614146614c19565b6148146140fd565b5f80516020615969833981519152836148805760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610551565b6127108411156148a25760405162461bcd60e51b815260040161055190615769565b8587111561490a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610551565b5f8360ff16116149775760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610551565b600a60ff841611156149e95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610551565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b606061229383835f614c21565b6040516001600160a01b0384811660248301528381166044830152606482018390526109489186918216906323b872dd90608401613b31565b6141466140fd565b614aa66140fd565b80355f805160206159a98339815191529081556014614acb606084016040850161592d565b60ff161115614b385760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610551565b5f614b49606084016040850161592d565b60ff1611614bb15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610551565b614bc1606083016040840161592d565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614bf26040830160208401614e96565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612e636140fd565b606081471015614c465760405163cd78605960e01b8152306004820152602401610551565b5f80856001600160a01b03168486604051614c6191906153f5565b5f6040518083038185875af1925050503d805f8114614c9b576040519150601f19603f3d011682016040523d82523d5f602084013e614ca0565b606091505b5091509150611f12868383606082614cc057614cbb82614d07565b612293565b8151158015614cd757506001600160a01b0384163b155b15614d0057604051639996b31560e01b81526001600160a01b0385166004820152602401610551565b5080612293565b805115614d175780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614d3c90615472565b5f825580601f10614d4b575050565b601f0160209004905f5260205f20908101906141ba91905b80821115614d76575f8155600101614d63565b5090565b80151581146141ba575f80fd5b803563ffffffff81168114614d9a575f80fd5b919050565b5f805f60608486031215614db1575f80fd5b833592506020840135614dc381614d7a565b9150614dd160408501614d87565b90509250925092565b5f60208284031215614dea575f80fd5b5035919050565b5f60208284031215614e01575f80fd5b61229382614d87565b5f8060408385031215614e1b575f80fd5b614e2483614d87565b946020939093013593505050565b5f8060408385031215614e43575f80fd5b82356001600160401b03811115614e58575f80fd5b830160808186031215614e69575f80fd5b9150614e7760208401614d87565b90509250929050565b80356001600160401b0381168114614d9a575f80fd5b5f60208284031215614ea6575f80fd5b61229382614e80565b5f8060408385031215614ec0575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614f0657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614f4160608401826001600160401b03169052565b506080830151614f5c60808401826001600160401b03169052565b5060a0830151614f7760a08401826001600160401b03169052565b5060c083015161280760c08401826001600160401b03169052565b803561ffff81168114614d9a575f80fd5b5f805f8060808587031215614fb6575f80fd5b84356001600160401b03811115614fcb575f80fd5b850160608188031215614fdc575f80fd5b9350614fea60208601614f92565b9250614ff860408601614e80565b9396929550929360600135925050565b6001600160a01b03811681146141ba575f80fd5b5f8082840361014081121561502f575f80fd5b6101208082121561503e575f80fd5b849350830135905061504f81615008565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156128075761280761505a565b5f5b838110156150a8578181015183820152602001615090565b50505f910152565b602081525f82518060208401526150ce81604085016020870161508e565b601f01601f19169190910160400192915050565b5f602082840312156150f2575f80fd5b5051919050565b5f8261511357634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156151b3575f80fd5b813561229381615008565b5f808335601e198436030181126151d3575f80fd5b8301803591506001600160401b038211156151ec575f80fd5b6020019150600581901b360382131561206c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261522b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561526b5761526b615235565b60405290565b604051601f8201601f191681016001600160401b038111828210171561529957615299615235565b604052919050565b5f6001600160401b038211156152b9576152b9615235565b50601f01601f191660200190565b5f606082360312156152d7575f80fd5b6152df615249565b8235815260206152f0818501614e80565b8183015260408401356001600160401b0381111561530c575f80fd5b840136601f82011261531c575f80fd5b803561532f61532a826152a1565b615271565b8181523684838501011115615342575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516153b7818460208a0161508e565b80830190508581526001600160401b0360c01b8560c01b16602082015283516153e781602884016020880161508e565b016028019695505050505050565b5f825161522b81846020870161508e565b8082018082111561095e5761095e61505a565b5f63ffffffff8083168181036154315761543161505a565b6001019392505050565b808202811582820484141761095e5761095e61505a565b6001600160401b038181168382160190808211156128075761280761505a565b600181811c9082168061548657607f821691505b6020821081036154a457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461550381615472565b806020870152604060018084165f811461552457600181146155405761556d565b60ff19851660408a0152604084151560051b8a0101955061556d565b895f5260205f205f5b858110156155645781548b8201860152908301908801615549565b8a016040019650505b509398975050505050505050565b8051614d9a81614d7a565b5f8060408385031215615597575f80fd5b82516001600160401b03808211156155ad575f80fd5b90840190606082870312156155c0575f80fd5b6155c8615249565b825181526020808401516155db81615008565b828201526040840151838111156155f0575f80fd5b80850194505087601f850112615604575f80fd5b8351925061561461532a846152a1565b8381528882858701011115615627575f80fd5b6156368483830184880161508e565b8060408401525081955061564b81880161557b565b9450505050509250929050565b8181038181111561095e5761095e61505a565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146157615761576161505a565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036154315761543161505a565b5f808335601e198436030181126157e4575f80fd5b8301803591506001600160401b038211156157fd575f80fd5b60200191503681900382131561206c575f80fd5b601f821115611a7457805f5260205f20601f840160051c810160208510156158365750805b601f840160051c820191505b818110156112c7575f8155600101615842565b81516001600160401b0381111561586e5761586e615235565b6158828161587c8454615472565b84615811565b602080601f8311600181146158b5575f841561589e5750858301515b5f19600386901b1c1916600185901b17855561590c565b5f85815260208120601f198616915b828110156158e3578886015182559484019460019091019084016158c4565b508582101561590057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615924575f80fd5b61229382614f92565b5f6020828403121561593d575f80fd5b813560ff81168114612293575f80fd5b5f6020828403121561595d575f80fd5b815161229381614d7a56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -440,6 +439,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) MAXIMUMS return _ERC20TokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_ERC20TokenStakingManager.CallOpts) } +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) PCHAINBLOCKCHAINID(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "P_CHAIN_BLOCKCHAIN_ID") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) PCHAINBLOCKCHAINID() ([32]byte, error) { + return _ERC20TokenStakingManager.Contract.PCHAINBLOCKCHAINID(&_ERC20TokenStakingManager.CallOpts) +} + +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) PCHAINBLOCKCHAINID() ([32]byte, error) { + return _ERC20TokenStakingManager.Contract.PCHAINBLOCKCHAINID(&_ERC20TokenStakingManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) @@ -710,23 +740,23 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x330a0a3a. +// Initialize is a paid mutator transaction binding the contract method 0xf09969ae. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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 0x330a0a3a. +// Initialize is a paid mutator transaction binding the contract method 0xf09969ae. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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 0x330a0a3a. +// Initialize is a paid mutator transaction binding the contract method 0xf09969ae. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings, address token) returns() +// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index 3cae87b6d..53aa949f7 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -68,7 +68,6 @@ type Validator struct { // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { - PChainBlockchainID [32]byte SubnetID [32]byte ChurnPeriodSeconds uint64 MaximumChurnPercentage uint8 @@ -83,8 +82,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516157ff3803806157ff83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6156b28061014d5f395ff3fe608060405260043610610161575f3560e01c806362065856116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f1461045e578063c974d1b614610471578063d5f20ff614610485578063df93d8de146104b1575f80fd5b8063b771b3bc146103ee578063ba3a4b9714610420578063bee0a03f1461043f575f80fd5b8063620658561461033f57806366435abf1461035e57806376f786211461037d5780638280a25a1461039c57806398f3e2b4146103b0578063a3a65e48146103cf575f80fd5b806335455ded1161011e57806335455ded1461027e57806340034a93146102a6578063467ef06f146102b95780635297fae6146102d857806360305d62146102f757806361e2f49014610320575f80fd5b80630118acc4146101655780630322ed98146101865780630cdd0985146101a5578063151d30d1146102025780631f7a9d8f146102285780632e2194d814610247575b5f80fd5b348015610170575f80fd5b5061018461017f366004614aae565b6104c7565b005b348015610191575f80fd5b506101846101a0366004614ae9565b61087c565b3480156101b0575f80fd5b506101ef6101bf366004614ae9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b34801561020d575f80fd5b50610216600a81565b60405160ff90911681526020016101f9565b348015610233575f80fd5b50610184610242366004614b00565b610a35565b348015610252575f80fd5b50610266610261366004614ae9565b610b12565b6040516001600160401b0390911681526020016101f9565b348015610289575f80fd5b5061029361271081565b60405161ffff90911681526020016101f9565b6101ef6102b4366004614b3e565b610b28565b3480156102c4575f80fd5b506101846102d3366004614b92565b610b5c565b3480156102e3575f80fd5b506101846102f2366004614bab565b610baf565b348015610302575f80fd5b5061030b601481565b60405163ffffffff90911681526020016101f9565b34801561032b575f80fd5b5061018461033a366004614bd3565b610d84565b34801561034a575f80fd5b506101ef610359366004614c21565b6113b8565b348015610369575f80fd5b50610266610378366004614ae9565b6113d1565b348015610388575f80fd5b50610184610397366004614aae565b6113e5565b3480156103a7575f80fd5b50610216603081565b3480156103bb575f80fd5b506101846103ca366004614bab565b6114c6565b3480156103da575f80fd5b506101846103e9366004614b92565b6116f3565b3480156103f9575f80fd5b506104086005600160991b0181565b6040516001600160a01b0390911681526020016101f9565b34801561042b575f80fd5b5061018461043a366004614ae9565b6118ab565b34801561044a575f80fd5b50610184610459366004614ae9565b611b31565b6101ef61046c366004614ae9565b611c45565b34801561047c575f80fd5b50610216601481565b348015610490575f80fd5b506104a461049f366004614ae9565b611c76565b6040516101f99190614c4e565b3480156104bc575f80fd5b506102666202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f80516020615606833981519152918415610519576105168285611d69565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561054b5761054b614c3a565b600481111561055c5761055c614c3a565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6105d884611c76565b90506002825160048111156105ef576105ef614c3a565b146106415760405162461bcd60e51b815260206004820152602a60248201525f805160206156268339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106a65760405162461bcd60e51b815260206004820152603360248201525f805160206156268339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610638565b60038252805160029060058111156106c0576106c0614c3a565b03610704575f826060015182608001516106da9190614d18565b90506106e68582612005565b506001600160401b0390811660e0850152421660a084015250610725565b60608101516001600160401b0390811660e084015260c08201511660a08301525b5f88815260068601602052604090208251815484929190829060ff1916600183600481111561075657610756614c3a565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161086a916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206156868339815191526020526040808220815160e0810190925280545f8051602061564683398151915293929190829060ff1660058111156108c9576108c9614c3a565b60058111156108da576108da614c3a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561094957610949614c3a565b146109ae5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610638565b6005600160991b016001600160a01b031663ee5b48eb6109d38584606001515f61215c565b6040518263ffffffff1660e01b81526004016109ef9190614d5a565b6020604051808303815f875af1158015610a0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a2f9190614d8c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610a7e575080546001600160401b03808416911610155b15610a9c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610ac683612381565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b2264e8d4a5100083614da3565b92915050565b5f610b31612395565b610b3d848484346123cc565b9050610b5560015f8051602061566683398151915255565b9392505050565b5f805160206156068339815191525f80610b7584612649565b6040808201515f848152600588016020529190912054929450909250610a2f916001600160401b03909116906001600160a01b03166129c1565b5f805160206156068339815191525f610bc7846129d4565b90505f80610bd88360400151612bae565b50915091505f610be783611c76565b9050816001600160401b031681606001516001600160401b03161015610c1f5760405162461bcd60e51b815260040161063890614dc2565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c645760405162461bcd60e51b815260040161063890614e04565b60015f87815260068701602052604090205460ff166004811115610c8a57610c8a614c3a565b14610cf35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610638565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206156468339815191529060ff1615610e215760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610638565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e889190614d8c565b836020013514610eea5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610638565b30610efb6060850160408601614e61565b6001600160a01b031614610f6d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610638565b5f610f7b6060850185614e7c565b91505f9050843560208601356014610f996060890160408a01614e61565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112c8575f6110196060890189614e7c565b8363ffffffff1681811061102f5761102f614ec1565b90506020028101906110419190614ed5565b61104a90614f85565b80515f818152600989016020526040902054919250901561107d5760405162461bcd60e51b81526004016106389061501c565b84825f01518360200151846040015160405160200161109f9493929190615064565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110ed91906150b3565b602060405180830381855afa158015611108573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061112b9190614d8c565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111b7576111b7614c3a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161126a9116866150c4565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112c1906150d7565b9050610ffd565b50600584018190555f6112da866129d4565b90505f6112ea8260400151612de9565b9050806002856040516112fd91906150b3565b602060405180830381855afa158015611318573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133b9190614d8c565b1461139f5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610638565b505050600a909201805460ff1916600117905550505050565b5f610b226001600160401b03831664e8d4a510006150f9565b5f6113db82611c76565b6080015192915050565b5f805160206156068339815191525f6113fd85611c76565b5f86815260058401602052604090205460a082015191925061143091600160b01b9091046001600160401b031690615110565b6001600160401b03164210156114a45760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610638565b83156114b6576114b48584611d69565b505b6114bf85612f52565b5050505050565b6114ce612395565b5f805160206156068339815191525f6114e6846129d4565b90505f806114f78360400151612bae565b50915091505f61150683611c76565b9050816001600160401b031681606001516001600160401b0316101561153e5760405162461bcd60e51b815260040161063890614dc2565b5f8681526006860160205260409020600301546001600160401b038084169116111561157c5760405162461bcd60e51b815260040161063890614e04565b60035f87815260068701602052604090205460ff1660048111156115a2576115a2614c3a565b146115f65760405162461bcd60e51b815260206004820152603160248201525f805160206156268339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610638565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e084015261169b916129c1565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506116ef60015f8051602061566683398151915255565b5050565b5f805160206156468339815191525f61170b836129d4565b90505f8061171c83604001516131c3565b915091508061177e5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610638565b5f8281526007850160205260408120805461179890615130565b90501180156117ca575060015f83815260088601602052604090205460ff1660058111156117c8576117c8614c3a565b145b6117e65760405162461bcd60e51b815260040161063890615162565b5f82815260078501602052604081206117fe91614a44565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061560683398151915293929190829060ff16600481111561190c5761190c614c3a565b600481111561191d5761191d614c3a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119a4576119a4614c3a565b14806119c257506003815160048111156119c0576119c0614c3a565b145b611a165760405162461bcd60e51b815260206004820152603260248201525f80516020615626833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610638565b5f611a248260400151611c76565b905080606001516001600160401b03165f03611aa85760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610638565b6005600160991b016001600160a01b031663ee5b48eb611ad584604001518460600151856080015161215c565b6040518263ffffffff1660e01b8152600401611af19190614d5a565b6020604051808303815f875af1158015611b0d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114bf9190614d8c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615646833981519152929190611b7990615130565b9050118015611bab575060015f83815260088301602052604090205460ff166005811115611ba957611ba9614c3a565b145b611bc75760405162461bcd60e51b815260040161063890615162565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c0091906004016151a9565b6020604051808303815f875af1158015611c1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c409190614d8c565b505050565b5f611c4e612395565b611c59823334613364565b9050611c7160015f8051602061566683398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061568683398151915290528390208351918201909352825491925f8051602061564683398151915292829060ff166005811115611cf657611cf6614c3a565b6005811115611d0757611d07614c3a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611db4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ddb919081019061523e565b9150915080611e3e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610638565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e81573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea59190614d8c565b825114611f095760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610638565b60208201516001600160a01b031615611f7f5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610638565b5f80611f8e8460400151613749565b91509150818714611ffb5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610638565b9695505050505050565b5f8281525f80516020615686833981519152602052604081206002015481905f8051602061564683398151915290600160801b90046001600160401b031661204d8582613921565b5f61205787613b2f565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6120a78a858b61215c565b6040518263ffffffff1660e01b81526004016120c39190614d5a565b6020604051808303815f875af11580156120df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121039190614d8c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156121d557612195816001615310565b6121a09060086150f9565b5081515f908390839081106121b7576121b7614ec1565b60200101906001600160f81b03191690815f1a905350600101612181565b505f5b6004811015612240576121ec816003615310565b6121f79060086150f9565b600263ffffffff16901c60f81b8282600261221291906150c4565b8151811061222257612222614ec1565b60200101906001600160f81b03191690815f1a9053506001016121d8565b505f5b60208110156122a25761225781601f615310565b6122629060086150f9565b86901c60f81b826122748360066150c4565b8151811061228457612284614ec1565b60200101906001600160f81b03191690815f1a905350600101612243565b505f5b600881101561230d576122b9816007615310565b6122c49060086150f9565b6001600160401b038616901c60f81b826122df8360266150c4565b815181106122ef576122ef614ec1565b60200101906001600160f81b03191690815f1a9053506001016122a5565b505f5b600881101561237857612324816007615310565b61232f9060086150f9565b6001600160401b038516901c60f81b8261234a83602e6150c4565b8151811061235a5761235a614ec1565b60200101906001600160f81b03191690815f1a905350600101612310565b50949350505050565b612389613bbf565b61239281613c0a565b50565b5f805160206156668339815191528054600119016123c657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206156068339815191529061ffff861610801590612418575061271061ffff861611155b6124345760405162461bcd60e51b815260040161063890615323565b60028101546001600160401b0390811690851610156124ad5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610638565b80548310156125105760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610638565b80600101548311156125775760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610638565b825f61258282610b12565b90505f61258f8983613c7e565b905060405180606001604052806125a33390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061566683398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206156468339815191525f612698856129d4565b90505f806126a983604001516131c3565b91509150801561270e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610638565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561273f5761273f614c3a565b600581111561275057612750614c3a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156127c1576127c1614c3a565b14806127df57506001825160058111156127dd576127dd614c3a565b145b61283e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610638565b60038251600581111561285357612853614c3a565b0361286057506004612864565b5060055b6020808301515f9081526009880190915260408120558181600581111561288d5761288d614c3a565b908160058111156128a0576128a0614c3a565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156128d4576128d4614c3a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561298857612988614c3a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6116ef6001600160a01b038216836141e3565b60408051606080820183525f8083526020830181905292820152905f805160206156468339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a49573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a70919081019061523e565b9150915080612ad05760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610638565b8254825114612b335760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610638565b60208201516001600160a01b031615612ba65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610638565b509392505050565b5f805f8351603614612bd25760405162461bcd60e51b81526004016106389061536e565b5f805b6002811015612c2157612be9816001615310565b612bf49060086150f9565b61ffff16868281518110612c0a57612c0a614ec1565b016020015160f81c901b9190911790600101612bd5565b5061ffff811615612c445760405162461bcd60e51b8152600401610638906153b7565b5f805b6004811015612c9f57612c5b816003615310565b612c669060086150f9565b63ffffffff1687612c788360026150c4565b81518110612c8857612c88614ec1565b016020015160f81c901b9190911790600101612c47565b5063ffffffff8116600414612cc65760405162461bcd60e51b8152600401610638906153fa565b5f805b6020811015612d1b57612cdd81601f615310565b612ce89060086150f9565b88612cf48360066150c4565b81518110612d0457612d04614ec1565b016020015160f81c901b9190911790600101612cc9565b505f805b6008811015612d7a57612d33816007615310565b612d3e9060086150f9565b6001600160401b031689612d538360266150c4565b81518110612d6357612d63614ec1565b016020015160f81c901b9190911790600101612d1f565b505f805b6008811015612dd957612d92816007615310565b612d9d9060086150f9565b6001600160401b03168a612db283602e6150c4565b81518110612dc257612dc2614ec1565b016020015160f81c901b9190911790600101612d7e565b5091989097509095509350505050565b5f8151602614612e0b5760405162461bcd60e51b81526004016106389061536e565b5f805b6002811015612e5a57612e22816001615310565b612e2d9060086150f9565b61ffff16848281518110612e4357612e43614ec1565b016020015160f81c901b9190911790600101612e0e565b5061ffff811615612e7d5760405162461bcd60e51b8152600401610638906153b7565b5f805b6004811015612ed857612e94816003615310565b612e9f9060086150f9565b63ffffffff1685612eb18360026150c4565b81518110612ec157612ec1614ec1565b016020015160f81c901b9190911790600101612e80565b5063ffffffff811615612efd5760405162461bcd60e51b8152600401610638906153fa565b5f805b602081101561237857612f1481601f615310565b612f1f9060086150f9565b86612f2b8360066150c4565b81518110612f3b57612f3b614ec1565b016020015160f81c901b9190911790600101612f00565b5f8181525f805160206156868339815191526020526040808220815160e0810190925280545f8051602061564683398151915293929190829060ff166005811115612f9f57612f9f614c3a565b6005811115612fb057612fb0614c3a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561302257613022614c3a565b1461307e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610638565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff191660018360058111156130c2576130c2614c3a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61316e8482612005565b6080840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f8082516027146131e65760405162461bcd60e51b81526004016106389061536e565b5f805b6002811015613235576131fd816001615310565b6132089060086150f9565b61ffff1685828151811061321e5761321e614ec1565b016020015160f81c901b91909117906001016131e9565b5061ffff8116156132585760405162461bcd60e51b8152600401610638906153b7565b5f805b60048110156132b35761326f816003615310565b61327a9060086150f9565b63ffffffff168661328c8360026150c4565b8151811061329c5761329c614ec1565b016020015160f81c901b919091179060010161325b565b5063ffffffff81166003146132da5760405162461bcd60e51b8152600401610638906153fa565b5f805b602081101561332f576132f181601f615310565b6132fc9060086150f9565b876133088360066150c4565b8151811061331857613318614ec1565b016020015160f81c901b91909117906001016132dd565b505f8660268151811061334457613344614ec1565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206156068339815191528161337d84610b12565b90505f61338987611c76565b5f8881527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020549091506001600160a01b031661341f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610638565b60028151600581111561343457613434614c3a565b146134935760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610638565b5f8282608001516134a49190615110565b600485015460408401519192506134c6916001600160401b0390911690615441565b6001600160401b0316816001600160401b031611156135455760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610638565b5f806135518a84612005565b915091505f8a8360405160200161357f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561361a5761361a614c3a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461376c5760405162461bcd60e51b81526004016106389061536e565b5f805b60028110156137bb57613783816001615310565b61378e9060086150f9565b61ffff168582815181106137a4576137a4614ec1565b016020015160f81c901b919091179060010161376f565b5061ffff8116156137de5760405162461bcd60e51b8152600401610638906153b7565b5f805b6004811015613839576137f5816003615310565b6138009060086150f9565b63ffffffff16866138128360026150c4565b8151811061382257613822614ec1565b016020015160f81c901b91909117906001016137e1565b5063ffffffff81166005146138605760405162461bcd60e51b8152600401610638906153fa565b5f805b60208110156138b55761387781601f615310565b6138829060086150f9565b8761388e8360066150c4565b8151811061389e5761389e614ec1565b016020015160f81c901b9190911790600101613863565b505f805b6008811015613914576138cd816007615310565b6138d89060086150f9565b6001600160401b0316886138ed8360266150c4565b815181106138fd576138fd614ec1565b016020015160f81c901b91909117906001016138b9565b5090969095509350505050565b5f805160206156468339815191525f6001600160401b0380841690851611156139555761394e8385614d18565b9050613962565b61395f8484614d18565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b03166060820152429115806139c45750600284015481516139c0916001600160401b0316906150c4565b8210155b156139ea576001600160401b038316606082015281815260408101516020820152613a09565b82816060018181516139fc9190615110565b6001600160401b03169052505b6060810151613a19906064615441565b602082015160028601546001600160401b039290921691613a449190600160401b900460ff166150f9565b1015613aa85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610638565b856001600160401b031681604001818151613ac391906150c4565b9052506040810180516001600160401b0387169190613ae3908390615310565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206156868339815191526020526040812060020180545f8051602061564683398151915291600160401b9091046001600160401b0316906008613b798361546c565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c0857604051631afcd79f60e31b815260040160405180910390fd5b565b613c12613bbf565b613c1b81614276565b613c2361428f565b612392608082013560a0830135613c4060e0850160c08601614c21565b613c51610100860160e08701615487565b61ffff16613c67610120870161010088016154a0565b613c7961014088016101208901614e61565b61429f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16613d095760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610638565b5f8051602061564683398151915242613d286040860160208701614c21565b6001600160401b031611613d9a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610638565b613daa6040850160208601614c21565b6001600160401b0316613dc06202a300426150c4565b11613e335760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610638565b8335613e8b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610638565b83355f90815260098201602052604090205415613eba5760405162461bcd60e51b81526004016106389061501c565b6030613ec960408601866154c0565b905014613f2e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610638565b613f38835f613921565b5f80613fd26040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f7d9190614c21565b6001600160401b03168152602001613f9860408a018a6154c0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506144e3565b5f82815260078601602052604090209193509150613ff08282615546565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061401d908590600401614d5a565b6020604051808303815f875af1158015614039573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061405d9190614d8c565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff191660018360058111156140d5576140d5614c3a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916141b5918e01908e01614c21565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156142065760405163cd78605960e01b8152306004820152602401610638565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461424f576040519150601f19603f3d011682016040523d82523d5f602084013e614254565b606091505b5050905080611c4057604051630a12f52160e11b815260040160405180910390fd5b61427e613bbf565b614286614892565b6123928161489a565b614297613bbf565b613c08614a3c565b6142a7613bbf565b5f80516020615606833981519152836143135760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610638565b6127108411156143355760405162461bcd60e51b815260040161063890615323565b8587111561439d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610638565b5f8360ff161161440a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610638565b600a60ff8416111561447c5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610638565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461454d5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610638565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156145c457614584816001615310565b61458f9060086150f9565b5081515f908390839081106145a6576145a6614ec1565b60200101906001600160f81b03191690815f1a905350600101614570565b505f5b600481101561462c576145db816003615310565b6145e69060086150f9565b600160ff919091161c60f81b826145fe8360026150c4565b8151811061460e5761460e614ec1565b60200101906001600160f81b03191690815f1a9053506001016145c7565b505f5b6020811015614689578451816020811061464b5761464b614ec1565b1a60f81b8261465b8360066150c4565b8151811061466b5761466b614ec1565b60200101906001600160f81b03191690815f1a90535060010161462f565b505f5b60208110156146e957846020015181602081106146ab576146ab614ec1565b1a60f81b826146bb8360266150c4565b815181106146cb576146cb614ec1565b60200101906001600160f81b03191690815f1a90535060010161468c565b505f5b600881101561475d57614700816007615310565b61470b9060086150f9565b60ff1685604001516001600160401b0316901c60f81b8282604661472f91906150c4565b8151811061473f5761473f614ec1565b60200101906001600160f81b03191690815f1a9053506001016146ec565b505f5b60308110156147c8578460800151818151811061477f5761477f614ec1565b01602001516001600160f81b0319168261479a83604e6150c4565b815181106147aa576147aa614ec1565b60200101906001600160f81b03191690815f1a905350600101614760565b505f5b600881101561483a576147df816007615310565b6147ea9060086150f9565b60608601516001600160401b0390811691161c60f81b8261480c83607e6150c4565b8151811061481c5761481c614ec1565b60200101906001600160f81b03191690815f1a9053506001016147cb565b5060028160405161484b91906150b3565b602060405180830381855afa158015614866573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906148899190614d8c565b94909350915050565b613c08613bbf565b6148a2613bbf565b80355f8051602061564683398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146148ee60808401606085016154a0565b60ff16111561495b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610638565b5f61496c60808401606085016154a0565b60ff16116149d45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610638565b6149e460808301606084016154a0565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614a156060830160408401614c21565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612636613bbf565b508054614a5090615130565b5f825580601f10614a5f575050565b601f0160209004905f5260205f209081019061239291905b80821115614a8a575f8155600101614a77565b5090565b8015158114612392575f80fd5b803563ffffffff81168114611c71575f80fd5b5f805f60608486031215614ac0575f80fd5b833592506020840135614ad281614a8e565b9150614ae060408501614a9b565b90509250925092565b5f60208284031215614af9575f80fd5b5035919050565b5f6101408284031215614b11575f80fd5b50919050565b803561ffff81168114611c71575f80fd5b80356001600160401b0381168114611c71575f80fd5b5f805f60608486031215614b50575f80fd5b83356001600160401b03811115614b65575f80fd5b840160608187031215614b76575f80fd5b9250614b8460208501614b17565b9150614ae060408501614b28565b5f60208284031215614ba2575f80fd5b610b5582614a9b565b5f8060408385031215614bbc575f80fd5b614bc583614a9b565b946020939093013593505050565b5f8060408385031215614be4575f80fd5b82356001600160401b03811115614bf9575f80fd5b830160808186031215614c0a575f80fd5b9150614c1860208401614a9b565b90509250929050565b5f60208284031215614c31575f80fd5b610b5582614b28565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614c7157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614cac60608401826001600160401b03169052565b506080830151614cc760808401826001600160401b03169052565b5060a0830151614ce260a08401826001600160401b03169052565b5060c0830151614cfd60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115614cfd57614cfd614d04565b5f5b83811015614d52578181015183820152602001614d3a565b50505f910152565b602081525f8251806020840152614d78816040850160208701614d38565b601f01601f19169190910160400192915050565b5f60208284031215614d9c575f80fd5b5051919050565b5f82614dbd57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612392575f80fd5b5f60208284031215614e71575f80fd5b8135610b5581614e4d565b5f808335601e19843603018112614e91575f80fd5b8301803591506001600160401b03821115614eaa575f80fd5b6020019150600581901b3603821315612155575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614ee9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f2957614f29614ef3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f5757614f57614ef3565b604052919050565b5f6001600160401b03821115614f7757614f77614ef3565b50601f01601f191660200190565b5f60608236031215614f95575f80fd5b614f9d614f07565b823581526020614fae818501614b28565b8183015260408401356001600160401b03811115614fca575f80fd5b840136601f820112614fda575f80fd5b8035614fed614fe882614f5f565b614f2f565b8181523684838501011115615000575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551615075818460208a01614d38565b80830190508581526001600160401b0360c01b8560c01b16602082015283516150a5816028840160208801614d38565b016028019695505050505050565b5f8251614ee9818460208701614d38565b80820180821115610b2257610b22614d04565b5f63ffffffff8083168181036150ef576150ef614d04565b6001019392505050565b8082028115828204841417610b2257610b22614d04565b6001600160401b03818116838216019080821115614cfd57614cfd614d04565b600181811c9082168061514457607f821691505b602082108103614b1157634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546151bb81615130565b806020870152604060018084165f81146151dc57600181146151f857615225565b60ff19851660408a0152604084151560051b8a01019550615225565b895f5260205f205f5b8581101561521c5781548b8201860152908301908801615201565b8a016040019650505b509398975050505050505050565b8051611c7181614a8e565b5f806040838503121561524f575f80fd5b82516001600160401b0380821115615265575f80fd5b9084019060608287031215615278575f80fd5b615280614f07565b8251815260208084015161529381614e4d565b828201526040840151838111156152a8575f80fd5b80850194505087601f8501126152bc575f80fd5b835192506152cc614fe884614f5f565b83815288828587010111156152df575f80fd5b6152ee84838301848801614d38565b80604084015250819550615303818801615233565b9450505050509250929050565b81810381811115610b2257610b22614d04565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461546457615464614d04565b505092915050565b5f6001600160401b038083168181036150ef576150ef614d04565b5f60208284031215615497575f80fd5b610b5582614b17565b5f602082840312156154b0575f80fd5b813560ff81168114610b55575f80fd5b5f808335601e198436030181126154d5575f80fd5b8301803591506001600160401b038211156154ee575f80fd5b602001915036819003821315612155575f80fd5b601f821115611c4057805f5260205f20601f840160051c810160208510156155275750805b601f840160051c820191505b818110156114bf575f8155600101615533565b81516001600160401b0381111561555f5761555f614ef3565b6155738161556d8454615130565b84615502565b602080601f8311600181146155a6575f841561558f5750858301515b5f19600386901b1c1916600185901b1785556155fd565b5f85815260208120601f198616915b828110156155d4578886015182559484019460019091019084016155b5565b50858210156155f157878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516157e73803806157e783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61569a8061014d5f395ff3fe60806040526004361061017b575f3560e01c806366435abf116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f1461048b578063c974d1b61461049e578063d5f20ff6146104b2578063df93d8de146104de575f80fd5b8063b771b3bc1461041b578063ba3a4b971461044d578063bee0a03f1461046c575f80fd5b806366435abf14610378578063732214f81461039757806376f78621146103aa5780638280a25a146103c957806398f3e2b4146103dd578063a3a65e48146103fc575f80fd5b806335455ded116101385780635297fae6116101135780635297fae6146102f257806360305d621461031157806361e2f4901461033a5780636206585614610359575f80fd5b806335455ded1461029857806340034a93146102c0578063467ef06f146102d3575f80fd5b80630118acc41461017f5780630322ed98146101a05780630cdd0985146101bf578063151d30d11461021c57806320e55565146102425780632e2194d814610261575b5f80fd5b34801561018a575f80fd5b5061019e610199366004614a9d565b6104f4565b005b3480156101ab575f80fd5b5061019e6101ba366004614ad8565b6108a9565b3480156101ca575f80fd5b506102096101d9366004614ad8565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b348015610227575f80fd5b50610230600a81565b60405160ff9091168152602001610213565b34801561024d575f80fd5b5061019e61025c366004614aef565b610a62565b34801561026c575f80fd5b5061028061027b366004614ad8565b610b3f565b6040516001600160401b039091168152602001610213565b3480156102a3575f80fd5b506102ad61271081565b60405161ffff9091168152602001610213565b6102096102ce366004614b2d565b610b55565b3480156102de575f80fd5b5061019e6102ed366004614b81565b610b89565b3480156102fd575f80fd5b5061019e61030c366004614b9a565b610bdc565b34801561031c575f80fd5b50610325601481565b60405163ffffffff9091168152602001610213565b348015610345575f80fd5b5061019e610354366004614bc2565b610db1565b348015610364575f80fd5b50610209610373366004614c10565b6113e5565b348015610383575f80fd5b50610280610392366004614ad8565b6113fe565b3480156103a2575f80fd5b506102095f81565b3480156103b5575f80fd5b5061019e6103c4366004614a9d565b611412565b3480156103d4575f80fd5b50610230603081565b3480156103e8575f80fd5b5061019e6103f7366004614b9a565b6114f3565b348015610407575f80fd5b5061019e610416366004614b81565b611720565b348015610426575f80fd5b506104356005600160991b0181565b6040516001600160a01b039091168152602001610213565b348015610458575f80fd5b5061019e610467366004614ad8565b6118d8565b348015610477575f80fd5b5061019e610486366004614ad8565b611b5e565b610209610499366004614ad8565b611c72565b3480156104a9575f80fd5b50610230601481565b3480156104bd575f80fd5b506104d16104cc366004614ad8565b611ca3565b6040516102139190614c3d565b3480156104e9575f80fd5b506102806202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206155ee833981519152918415610546576105438285611d96565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561057857610578614c29565b600481111561058957610589614c29565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61060584611ca3565b905060028251600481111561061c5761061c614c29565b1461066e5760405162461bcd60e51b815260206004820152602a60248201525f8051602061560e8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106d35760405162461bcd60e51b815260206004820152603360248201525f8051602061560e8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610665565b60038252805160029060058111156106ed576106ed614c29565b03610731575f826060015182608001516107079190614d00565b90506107138582612032565b506001600160401b0390811660e0850152421660a084015250610752565b60608101516001600160401b0390811660e084015260c08201511660a08301525b5f88815260068601602052604090208251815484929190829060ff1916600183600481111561078357610783614c29565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610897916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061566e8339815191526020526040808220815160e0810190925280545f8051602061562e83398151915293929190829060ff1660058111156108f6576108f6614c29565b600581111561090757610907614c29565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561097657610976614c29565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610665565b6005600160991b016001600160a01b031663ee5b48eb610a008584606001515f612189565b6040518263ffffffff1660e01b8152600401610a1c9190614d42565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614d74565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aab575080546001600160401b03808416911610155b15610ac95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af3836123ae565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b4f64e8d4a5100083614d8b565b92915050565b5f610b5e6123c2565b610b6a848484346123f9565b9050610b8260015f8051602061564e83398151915255565b9392505050565b5f805160206155ee8339815191525f80610ba284612676565b6040808201515f848152600588016020529190912054929450909250610a5c916001600160401b03909116906001600160a01b03166129ee565b5f805160206155ee8339815191525f610bf484612a01565b90505f80610c058360400151612bc7565b50915091505f610c1483611ca3565b9050816001600160401b031681606001516001600160401b03161015610c4c5760405162461bcd60e51b815260040161066590614daa565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c915760405162461bcd60e51b815260040161066590614dec565b60015f87815260068701602052604090205460ff166004811115610cb757610cb7614c29565b14610d205760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610665565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061562e8339815191529060ff1615610e4e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610665565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb59190614d74565b836020013514610f175760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610665565b30610f286060850160408601614e49565b6001600160a01b031614610f9a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610665565b5f610fa86060850185614e64565b91505f9050843560208601356014610fc66060890160408a01614e49565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f5575f6110466060890189614e64565b8363ffffffff1681811061105c5761105c614ea9565b905060200281019061106e9190614ebd565b61107790614f6d565b80515f81815260088901602052604090205491925090156110aa5760405162461bcd60e51b815260040161066590615004565b84825f0151836020015184604001516040516020016110cc949392919061504c565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111a919061509b565b602060405180830381855afa158015611135573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111589190614d74565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff191660018360058111156111e4576111e4614c29565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112979116866150ac565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ee906150bf565b905061102a565b50600484018190555f61130786612a01565b90505f6113178260400151612e02565b90508060028560405161132a919061509b565b602060405180830381855afa158015611345573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113689190614d74565b146113cc5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610665565b5050506009909201805460ff1916600117905550505050565b5f610b4f6001600160401b03831664e8d4a510006150e1565b5f61140882611ca3565b6080015192915050565b5f805160206155ee8339815191525f61142a85611ca3565b5f86815260058401602052604090205460a082015191925061145d91600160b01b9091046001600160401b0316906150f8565b6001600160401b03164210156114d15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610665565b83156114e3576114e18584611d96565b505b6114ec85612f6b565b5050505050565b6114fb6123c2565b5f805160206155ee8339815191525f61151384612a01565b90505f806115248360400151612bc7565b50915091505f61153383611ca3565b9050816001600160401b031681606001516001600160401b0316101561156b5760405162461bcd60e51b815260040161066590614daa565b5f8681526006860160205260409020600301546001600160401b03808416911611156115a95760405162461bcd60e51b815260040161066590614dec565b60035f87815260068701602052604090205460ff1660048111156115cf576115cf614c29565b146116235760405162461bcd60e51b815260206004820152603160248201525f8051602061560e8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610665565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526116c8916129ee565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061171c60015f8051602061564e83398151915255565b5050565b5f8051602061562e8339815191525f61173883612a01565b90505f8061174983604001516131dc565b91509150806117ab5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610665565b5f828152600685016020526040812080546117c590615118565b90501180156117f7575060015f83815260078601602052604090205460ff1660058111156117f5576117f5614c29565b145b6118135760405162461bcd60e51b81526004016106659061514a565b5f828152600685016020526040812061182b91614a33565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206155ee83398151915293929190829060ff16600481111561193957611939614c29565b600481111561194a5761194a614c29565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119d1576119d1614c29565b14806119ef57506003815160048111156119ed576119ed614c29565b145b611a435760405162461bcd60e51b815260206004820152603260248201525f8051602061560e833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610665565b5f611a518260400151611ca3565b905080606001516001600160401b03165f03611ad55760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610665565b6005600160991b016001600160a01b031663ee5b48eb611b02846040015184606001518560800151612189565b6040518263ffffffff1660e01b8152600401611b1e9190614d42565b6020604051808303815f875af1158015611b3a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ec9190614d74565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061562e833981519152929190611ba690615118565b9050118015611bd8575060015f83815260078301602052604090205460ff166005811115611bd657611bd6614c29565b145b611bf45760405162461bcd60e51b81526004016106659061514a565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c2d9190600401615191565b6020604051808303815f875af1158015611c49573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6d9190614d74565b505050565b5f611c7b6123c2565b611c8682333461337d565b9050611c9e60015f8051602061564e83398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061566e83398151915290528390208351918201909352825491925f8051602061562e83398151915292829060ff166005811115611d2357611d23614c29565b6005811115611d3457611d34614c29565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611de1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e089190810190615226565b9150915080611e6b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610665565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611eae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed29190614d74565b825114611f365760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610665565b60208201516001600160a01b031615611fac5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610665565b5f80611fbb8460400151613762565b915091508187146120285760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610665565b9695505050505050565b5f8281525f8051602061566e833981519152602052604081206002015481905f8051602061562e83398151915290600160801b90046001600160401b031661207a858261393a565b5f61208487613b48565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6120d48a858b612189565b6040518263ffffffff1660e01b81526004016120f09190614d42565b6020604051808303815f875af115801561210c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121309190614d74565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612202576121c28160016152f8565b6121cd9060086150e1565b5081515f908390839081106121e4576121e4614ea9565b60200101906001600160f81b03191690815f1a9053506001016121ae565b505f5b600481101561226d576122198160036152f8565b6122249060086150e1565b600263ffffffff16901c60f81b8282600261223f91906150ac565b8151811061224f5761224f614ea9565b60200101906001600160f81b03191690815f1a905350600101612205565b505f5b60208110156122cf5761228481601f6152f8565b61228f9060086150e1565b86901c60f81b826122a18360066150ac565b815181106122b1576122b1614ea9565b60200101906001600160f81b03191690815f1a905350600101612270565b505f5b600881101561233a576122e68160076152f8565b6122f19060086150e1565b6001600160401b038616901c60f81b8261230c8360266150ac565b8151811061231c5761231c614ea9565b60200101906001600160f81b03191690815f1a9053506001016122d2565b505f5b60088110156123a5576123518160076152f8565b61235c9060086150e1565b6001600160401b038516901c60f81b8261237783602e6150ac565b8151811061238757612387614ea9565b60200101906001600160f81b03191690815f1a90535060010161233d565b50949350505050565b6123b6613bd8565b6123bf81613c23565b50565b5f8051602061564e8339815191528054600119016123f357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206155ee8339815191529061ffff861610801590612445575061271061ffff861611155b6124615760405162461bcd60e51b81526004016106659061530b565b60028101546001600160401b0390811690851610156124da5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610665565b805483101561253d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610665565b80600101548311156125a45760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610665565b825f6125af82610b3f565b90505f6125bc8983613c95565b905060405180606001604052806125d03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061564e83398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061562e8339815191525f6126c585612a01565b90505f806126d683604001516131dc565b91509150801561273b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610665565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561276c5761276c614c29565b600581111561277d5761277d614c29565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156127ee576127ee614c29565b148061280c575060018251600581111561280a5761280a614c29565b145b61286b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610665565b60038251600581111561288057612880614c29565b0361288d57506004612891565b5060055b6020808301515f908152600888019091526040812055818160058111156128ba576128ba614c29565b908160058111156128cd576128cd614c29565b9052505f84815260078701602052604090208251815484929190829060ff1916600183600581111561290157612901614c29565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156129b5576129b5614c29565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b61171c6001600160a01b038216836141f9565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a8c9190810190615226565b9150915080612aec5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610665565b815115612b4d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610665565b60208201516001600160a01b031615612bc05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610665565b5092915050565b5f805f8351603614612beb5760405162461bcd60e51b815260040161066590615356565b5f805b6002811015612c3a57612c028160016152f8565b612c0d9060086150e1565b61ffff16868281518110612c2357612c23614ea9565b016020015160f81c901b9190911790600101612bee565b5061ffff811615612c5d5760405162461bcd60e51b81526004016106659061539f565b5f805b6004811015612cb857612c748160036152f8565b612c7f9060086150e1565b63ffffffff1687612c918360026150ac565b81518110612ca157612ca1614ea9565b016020015160f81c901b9190911790600101612c60565b5063ffffffff8116600414612cdf5760405162461bcd60e51b8152600401610665906153e2565b5f805b6020811015612d3457612cf681601f6152f8565b612d019060086150e1565b88612d0d8360066150ac565b81518110612d1d57612d1d614ea9565b016020015160f81c901b9190911790600101612ce2565b505f805b6008811015612d9357612d4c8160076152f8565b612d579060086150e1565b6001600160401b031689612d6c8360266150ac565b81518110612d7c57612d7c614ea9565b016020015160f81c901b9190911790600101612d38565b505f805b6008811015612df257612dab8160076152f8565b612db69060086150e1565b6001600160401b03168a612dcb83602e6150ac565b81518110612ddb57612ddb614ea9565b016020015160f81c901b9190911790600101612d97565b5091989097509095509350505050565b5f8151602614612e245760405162461bcd60e51b815260040161066590615356565b5f805b6002811015612e7357612e3b8160016152f8565b612e469060086150e1565b61ffff16848281518110612e5c57612e5c614ea9565b016020015160f81c901b9190911790600101612e27565b5061ffff811615612e965760405162461bcd60e51b81526004016106659061539f565b5f805b6004811015612ef157612ead8160036152f8565b612eb89060086150e1565b63ffffffff1685612eca8360026150ac565b81518110612eda57612eda614ea9565b016020015160f81c901b9190911790600101612e99565b5063ffffffff811615612f165760405162461bcd60e51b8152600401610665906153e2565b5f805b60208110156123a557612f2d81601f6152f8565b612f389060086150e1565b86612f448360066150ac565b81518110612f5457612f54614ea9565b016020015160f81c901b9190911790600101612f19565b5f8181525f8051602061566e8339815191526020526040808220815160e0810190925280545f8051602061562e83398151915293929190829060ff166005811115612fb857612fb8614c29565b6005811115612fc957612fc9614c29565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561303b5761303b614c29565b146130975760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610665565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156130db576130db614c29565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131878482612032565b6080840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f8082516027146131ff5760405162461bcd60e51b815260040161066590615356565b5f805b600281101561324e576132168160016152f8565b6132219060086150e1565b61ffff1685828151811061323757613237614ea9565b016020015160f81c901b9190911790600101613202565b5061ffff8116156132715760405162461bcd60e51b81526004016106659061539f565b5f805b60048110156132cc576132888160036152f8565b6132939060086150e1565b63ffffffff16866132a58360026150ac565b815181106132b5576132b5614ea9565b016020015160f81c901b9190911790600101613274565b5063ffffffff81166003146132f35760405162461bcd60e51b8152600401610665906153e2565b5f805b60208110156133485761330a81601f6152f8565b6133159060086150e1565b876133218360066150ac565b8151811061333157613331614ea9565b016020015160f81c901b91909117906001016132f6565b505f8660268151811061335d5761335d614ea9565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206155ee8339815191528161339684610b3f565b90505f6133a287611ca3565b5f8881527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020549091506001600160a01b03166134385760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610665565b60028151600581111561344d5761344d614c29565b146134ac5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610665565b5f8282608001516134bd91906150f8565b600485015460408401519192506134df916001600160401b0390911690615429565b6001600160401b0316816001600160401b0316111561355e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610665565b5f8061356a8a84612032565b915091505f8a8360405160200161359892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561363357613633614c29565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146137855760405162461bcd60e51b815260040161066590615356565b5f805b60028110156137d45761379c8160016152f8565b6137a79060086150e1565b61ffff168582815181106137bd576137bd614ea9565b016020015160f81c901b9190911790600101613788565b5061ffff8116156137f75760405162461bcd60e51b81526004016106659061539f565b5f805b60048110156138525761380e8160036152f8565b6138199060086150e1565b63ffffffff168661382b8360026150ac565b8151811061383b5761383b614ea9565b016020015160f81c901b91909117906001016137fa565b5063ffffffff81166005146138795760405162461bcd60e51b8152600401610665906153e2565b5f805b60208110156138ce5761389081601f6152f8565b61389b9060086150e1565b876138a78360066150ac565b815181106138b7576138b7614ea9565b016020015160f81c901b919091179060010161387c565b505f805b600881101561392d576138e68160076152f8565b6138f19060086150e1565b6001600160401b0316886139068360266150ac565b8151811061391657613916614ea9565b016020015160f81c901b91909117906001016138d2565b5090969095509350505050565b5f8051602061562e8339815191525f6001600160401b03808416908516111561396e576139678385614d00565b905061397b565b6139788484614d00565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806139dd5750600184015481516139d9916001600160401b0316906150ac565b8210155b15613a03576001600160401b038316606082015281815260408101516020820152613a22565b8281606001818151613a1591906150f8565b6001600160401b03169052505b6060810151613a32906064615429565b602082015160018601546001600160401b039290921691613a5d9190600160401b900460ff166150e1565b1015613ac15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610665565b856001600160401b031681604001818151613adc91906150ac565b9052506040810180516001600160401b0387169190613afc9083906152f8565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061566e8339815191526020526040812060020180545f8051602061562e83398151915291600160401b9091046001600160401b0316906008613b9283615454565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c2157604051631afcd79f60e31b815260040160405180910390fd5b565b613c2b613bd8565b613c348161428c565b613c3c6142a5565b6123bf60608201356080830135613c5960c0850160a08601614c10565b613c6960e0860160c0870161546f565b61ffff16613c7e610100870160e08801615488565b613c9061012088016101008901614e49565b6142b5565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613d205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610665565b5f8051602061562e83398151915242613d3f6040860160208701614c10565b6001600160401b031611613db15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610665565b613dc16040850160208601614c10565b6001600160401b0316613dd76202a300426150ac565b11613e4a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610665565b8335613ea25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610665565b83355f90815260088201602052604090205415613ed15760405162461bcd60e51b815260040161066590615004565b6030613ee060408601866154a8565b905014613f455760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610665565b613f4f835f61393a565b5f80613fe86040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f939190614c10565b6001600160401b03168152602001613fae60408a018a6154a8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506144f9565b5f82815260068601602052604090209193509150614006828261552e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614033908590600401614d42565b6020604051808303815f875af115801561404f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140739190614d74565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156140eb576140eb614c29565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916141cb918e01908e01614c10565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561421c5760405163cd78605960e01b8152306004820152602401610665565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614265576040519150601f19603f3d011682016040523d82523d5f602084013e61426a565b606091505b5050905080611c6d57604051630a12f52160e11b815260040160405180910390fd5b614294613bd8565b61429c6148a8565b6123bf816148b0565b6142ad613bd8565b613c21614a2b565b6142bd613bd8565b5f805160206155ee833981519152836143295760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610665565b61271084111561434b5760405162461bcd60e51b81526004016106659061530b565b858711156143b35760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610665565b5f8360ff16116144205760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610665565b600a60ff841611156144925760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610665565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146145635760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610665565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156145da5761459a8160016152f8565b6145a59060086150e1565b5081515f908390839081106145bc576145bc614ea9565b60200101906001600160f81b03191690815f1a905350600101614586565b505f5b6004811015614642576145f18160036152f8565b6145fc9060086150e1565b600160ff919091161c60f81b826146148360026150ac565b8151811061462457614624614ea9565b60200101906001600160f81b03191690815f1a9053506001016145dd565b505f5b602081101561469f578451816020811061466157614661614ea9565b1a60f81b826146718360066150ac565b8151811061468157614681614ea9565b60200101906001600160f81b03191690815f1a905350600101614645565b505f5b60208110156146ff57846020015181602081106146c1576146c1614ea9565b1a60f81b826146d18360266150ac565b815181106146e1576146e1614ea9565b60200101906001600160f81b03191690815f1a9053506001016146a2565b505f5b6008811015614773576147168160076152f8565b6147219060086150e1565b60ff1685604001516001600160401b0316901c60f81b8282604661474591906150ac565b8151811061475557614755614ea9565b60200101906001600160f81b03191690815f1a905350600101614702565b505f5b60308110156147de578460800151818151811061479557614795614ea9565b01602001516001600160f81b031916826147b083604e6150ac565b815181106147c0576147c0614ea9565b60200101906001600160f81b03191690815f1a905350600101614776565b505f5b6008811015614850576147f58160076152f8565b6148009060086150e1565b60608601516001600160401b0390811691161c60f81b8261482283607e6150ac565b8151811061483257614832614ea9565b60200101906001600160f81b03191690815f1a9053506001016147e1565b50600281604051614861919061509b565b602060405180830381855afa15801561487c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061489f9190614d74565b94909350915050565b613c21613bd8565b6148b8613bd8565b80355f8051602061562e83398151915290815560146148dd6060840160408501615488565b60ff16111561494a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610665565b5f61495b6060840160408501615488565b60ff16116149c35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610665565b6149d36060830160408401615488565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a046040830160208401614c10565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612663613bd8565b508054614a3f90615118565b5f825580601f10614a4e575050565b601f0160209004905f5260205f20908101906123bf91905b80821115614a79575f8155600101614a66565b5090565b80151581146123bf575f80fd5b803563ffffffff81168114611c9e575f80fd5b5f805f60608486031215614aaf575f80fd5b833592506020840135614ac181614a7d565b9150614acf60408501614a8a565b90509250925092565b5f60208284031215614ae8575f80fd5b5035919050565b5f6101208284031215614b00575f80fd5b50919050565b803561ffff81168114611c9e575f80fd5b80356001600160401b0381168114611c9e575f80fd5b5f805f60608486031215614b3f575f80fd5b83356001600160401b03811115614b54575f80fd5b840160608187031215614b65575f80fd5b9250614b7360208501614b06565b9150614acf60408501614b17565b5f60208284031215614b91575f80fd5b610b8282614a8a565b5f8060408385031215614bab575f80fd5b614bb483614a8a565b946020939093013593505050565b5f8060408385031215614bd3575f80fd5b82356001600160401b03811115614be8575f80fd5b830160808186031215614bf9575f80fd5b9150614c0760208401614a8a565b90509250929050565b5f60208284031215614c20575f80fd5b610b8282614b17565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614c6057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614c9b60608401826001600160401b03169052565b506080830151614cb660808401826001600160401b03169052565b5060a0830151614cd160a08401826001600160401b03169052565b5060c0830151612bc060c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612bc057612bc0614cec565b5f5b83811015614d3a578181015183820152602001614d22565b50505f910152565b602081525f8251806020840152614d60816040850160208701614d20565b601f01601f19169190910160400192915050565b5f60208284031215614d84575f80fd5b5051919050565b5f82614da557634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b03811681146123bf575f80fd5b5f60208284031215614e59575f80fd5b8135610b8281614e35565b5f808335601e19843603018112614e79575f80fd5b8301803591506001600160401b03821115614e92575f80fd5b6020019150600581901b3603821315612182575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614ed1575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f1157614f11614edb565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f3f57614f3f614edb565b604052919050565b5f6001600160401b03821115614f5f57614f5f614edb565b50601f01601f191660200190565b5f60608236031215614f7d575f80fd5b614f85614eef565b823581526020614f96818501614b17565b8183015260408401356001600160401b03811115614fb2575f80fd5b840136601f820112614fc2575f80fd5b8035614fd5614fd082614f47565b614f17565b8181523684838501011115614fe8575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f855161505d818460208a01614d20565b80830190508581526001600160401b0360c01b8560c01b166020820152835161508d816028840160208801614d20565b016028019695505050505050565b5f8251614ed1818460208701614d20565b80820180821115610b4f57610b4f614cec565b5f63ffffffff8083168181036150d7576150d7614cec565b6001019392505050565b8082028115828204841417610b4f57610b4f614cec565b6001600160401b03818116838216019080821115612bc057612bc0614cec565b600181811c9082168061512c57607f821691505b602082108103614b0057634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546151a381615118565b806020870152604060018084165f81146151c457600181146151e05761520d565b60ff19851660408a0152604084151560051b8a0101955061520d565b895f5260205f205f5b858110156152045781548b82018601529083019088016151e9565b8a016040019650505b509398975050505050505050565b8051611c9e81614a7d565b5f8060408385031215615237575f80fd5b82516001600160401b038082111561524d575f80fd5b9084019060608287031215615260575f80fd5b615268614eef565b8251815260208084015161527b81614e35565b82820152604084015183811115615290575f80fd5b80850194505087601f8501126152a4575f80fd5b835192506152b4614fd084614f47565b83815288828587010111156152c7575f80fd5b6152d684838301848801614d20565b806040840152508195506152eb81880161521b565b9450505050509250929050565b81810381811115610b4f57610b4f614cec565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461544c5761544c614cec565b505092915050565b5f6001600160401b038083168181036150d7576150d7614cec565b5f6020828403121561547f575f80fd5b610b8282614b06565b5f60208284031215615498575f80fd5b813560ff81168114610b82575f80fd5b5f808335601e198436030181126154bd575f80fd5b8301803591506001600160401b038211156154d6575f80fd5b602001915036819003821315612182575f80fd5b601f821115611c6d57805f5260205f20601f840160051c8101602085101561550f5750805b601f840160051c820191505b818110156114ec575f815560010161551b565b81516001600160401b0381111561554757615547614edb565b61555b816155558454615118565b846154ea565b602080601f83116001811461558e575f84156155775750858301515b5f19600386901b1c1916600185901b1785556155e5565b5f85815260208120601f198616915b828110156155bc5788860151825594840194600190910190840161559d565b50858210156155d957878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -440,6 +439,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMU return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) } +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) PCHAINBLOCKCHAINID(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "P_CHAIN_BLOCKCHAIN_ID") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) PCHAINBLOCKCHAINID() ([32]byte, error) { + return _NativeTokenStakingManager.Contract.PCHAINBLOCKCHAINID(&_NativeTokenStakingManager.CallOpts) +} + +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) PCHAINBLOCKCHAINID() ([32]byte, error) { + return _NativeTokenStakingManager.Contract.PCHAINBLOCKCHAINID(&_NativeTokenStakingManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) @@ -710,23 +740,23 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x1f7a9d8f. +// Initialize is a paid mutator transaction binding the contract method 0x20e55565. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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 0x1f7a9d8f. +// Initialize is a paid mutator transaction binding the contract method 0x20e55565. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,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 0x1f7a9d8f. +// Initialize is a paid mutator transaction binding the contract method 0x20e55565. // -// Solidity: function initialize(((bytes32,bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() +// Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Initialize(settings PoSValidatorManagerSettings) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.Initialize(&_NativeTokenStakingManager.TransactOpts, settings) } diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 0ef614183..345b80e71 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -57,7 +57,6 @@ type Validator struct { // ValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. type ValidatorManagerSettings struct { - PChainBlockchainID [32]byte SubnetID [32]byte ChurnPeriodSeconds uint64 MaximumChurnPercentage uint8 @@ -72,8 +71,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161397338038061397383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138268061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e366004612db8565b61030c565b005b610173610143366004612db8565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610133610194366004612de7565b6104ca565b6101336101a7366004612e2a565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004612e60565b6105e6565b6101ef6101ea366004612db8565b610c1a565b6040516001600160401b03909116815260200161017d565b610133610c2e565b610217603081565b60405160ff909116815260200161017d565b610173610237366004612ec0565b610c41565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e366004612db8565b610c5d565b6101336102a1366004612de7565b610c71565b6102686005600160991b0181565b6101336102c2366004612db8565b610e29565b610217601481565b6102e26102dd366004612db8565b610f38565b60405161017d9190612f19565b6101ef6202a30081565b610133610307366004612fcf565b61102b565b5f8181525f805160206137fa8339815191526020526040808220815160e0810190925280545f805160206137da83398151915293929190829060ff16600581111561035957610359612f05565b600581111561036a5761036a612f05565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d9612f05565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f611065565b6040518263ffffffff1660e01b81526004016104849190613013565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c49190613045565b50505050565b6104d38161128a565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b6105978787611602565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206137da8339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea9190613045565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d6060850160408601612fcf565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd606085018561305c565b91505f90508435602086013560146107fb6060890160408a01612fcf565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610b2a575f61087b606089018961305c565b8363ffffffff16818110610891576108916130a1565b90506020028101906108a391906130b5565b6108ac90613165565b80515f81815260098901602052604090205491925090156108df5760405162461bcd60e51b815260040161043a906131fc565b84825f0151836020015184604001516040516020016109019493929190613244565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161094f9190613293565b602060405180830381855afa15801561096a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061098d9190613045565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610a1957610a19612f05565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610acc9116866132b8565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610b23906132cb565b905061085f565b50600584018190555f610b3c86611620565b90505f610b4c82604001516117fa565b905080600285604051610b5f9190613293565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190613045565b14610c015760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610c2482610f38565b6080015192915050565b610c36611963565b610c3f5f6119be565b565b5f610c4a611963565b610c548383611a2e565b90505b92915050565b610c65611963565b610c6e81611f93565b50565b5f805160206137da8339815191525f610c8983611620565b90505f80610c9a8360400151612204565b9150915080610cfc5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610d16906132ed565b9050118015610d48575060015f83815260088601602052604090205460ff166005811115610d4657610d46612f05565b145b610d645760405162461bcd60e51b815260040161043a9061331f565b5f8281526007850160205260408120610d7c91612d6e565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206137da833981519152929190610e71906132ed565b9050118015610ea3575060015f83815260088301602052604090205460ff166005811115610ea157610ea1612f05565b145b610ebf5760405162461bcd60e51b815260040161043a9061331f565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610ef89190600401613366565b6020604051808303815f875af1158015610f14573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d39190613045565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206137fa83398151915290528390208351918201909352825491925f805160206137da83398151915292829060ff166005811115610fb857610fb8612f05565b6005811115610fc957610fc9612f05565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611033611963565b6001600160a01b03811661105c57604051631e4fbdf760e01b81525f600482015260240161043a565b610c6e816119be565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110de5761109e8160016133f0565b6110a9906008613403565b5081515f908390839081106110c0576110c06130a1565b60200101906001600160f81b03191690815f1a90535060010161108a565b505f5b6004811015611149576110f58160036133f0565b611100906008613403565b600263ffffffff16901c60f81b8282600261111b91906132b8565b8151811061112b5761112b6130a1565b60200101906001600160f81b03191690815f1a9053506001016110e1565b505f5b60208110156111ab5761116081601f6133f0565b61116b906008613403565b86901c60f81b8261117d8360066132b8565b8151811061118d5761118d6130a1565b60200101906001600160f81b03191690815f1a90535060010161114c565b505f5b6008811015611216576111c28160076133f0565b6111cd906008613403565b6001600160401b038616901c60f81b826111e88360266132b8565b815181106111f8576111f86130a1565b60200101906001600160f81b03191690815f1a9053506001016111ae565b505f5b60088110156112815761122d8160076133f0565b611238906008613403565b6001600160401b038516901c60f81b8261125383602e6132b8565b81518110611263576112636130a1565b60200101906001600160f81b03191690815f1a905350600101611219565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206137da8339815191525f6112d985611620565b90505f806112ea8360400151612204565b91509150801561134f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561138057611380612f05565b600581111561139157611391612f05565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561140257611402612f05565b1480611420575060018251600581111561141e5761141e612f05565b145b61147f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b60038251600581111561149457611494612f05565b036114a1575060046114a5565b5060055b6020808301515f908152600988019091526040812055818160058111156114ce576114ce612f05565b908160058111156114e1576114e1612f05565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561151557611515612f05565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156115c9576115c9612f05565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b61160a6123a5565b611613826123ee565b61161c81612407565b5050565b60408051606080820183525f8083526020830181905292820152905f805160206137da8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611695573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116bc9190810190613429565b915091508061171c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b825482511461177f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b0316156117f25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f815160261461181c5760405162461bcd60e51b815260040161043a906134fb565b5f805b600281101561186b576118338160016133f0565b61183e906008613403565b61ffff16848281518110611854576118546130a1565b016020015160f81c901b919091179060010161181f565b5061ffff81161561188e5760405162461bcd60e51b815260040161043a90613544565b5f805b60048110156118e9576118a58160036133f0565b6118b0906008613403565b63ffffffff16856118c28360026132b8565b815181106118d2576118d26130a1565b016020015160f81c901b9190911790600101611891565b5063ffffffff81161561190e5760405162461bcd60e51b815260040161043a90613587565b5f805b60208110156112815761192581601f6133f0565b611930906008613403565b8661193c8360066132b8565b8151811061194c5761194c6130a1565b016020015160f81c901b9190911790600101611911565b336119957f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c3f5760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611ab95760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f805160206137da83398151915242611ad860408601602087016135ce565b6001600160401b031611611b4a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611b5a60408501602086016135ce565b6001600160401b0316611b706202a300426132b8565b11611be35760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611c3b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043a565b83355f90815260098201602052604090205415611c6a5760405162461bcd60e51b815260040161043a906131fc565b6030611c7960408601866135e7565b905014611cde5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043a565b611ce8835f612418565b5f80611d826040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611d2d91906135ce565b6001600160401b03168152602001611d4860408a018a6135e7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612626565b5f82815260078601602052604090209193509150611da08282613674565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611dcd908590600401613013565b6020604051808303815f875af1158015611de9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0d9190613045565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611e8557611e85612f05565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f65918e01908e016135ce565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206137fa8339815191526020526040808220815160e0810190925280545f805160206137da83398151915293929190829060ff166005811115611fe057611fe0612f05565b6005811115611ff157611ff1612f05565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561206357612063612f05565b146120bf5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b60038152426001600160401b031660c08201525f83815260088301602052604090208151815483929190829060ff1916600183600581111561210357612103612f05565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121af84826129d5565b6080840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f8082516027146122275760405162461bcd60e51b815260040161043a906134fb565b5f805b60028110156122765761223e8160016133f0565b612249906008613403565b61ffff1685828151811061225f5761225f6130a1565b016020015160f81c901b919091179060010161222a565b5061ffff8116156122995760405162461bcd60e51b815260040161043a90613544565b5f805b60048110156122f4576122b08160036133f0565b6122bb906008613403565b63ffffffff16866122cd8360026132b8565b815181106122dd576122dd6130a1565b016020015160f81c901b919091179060010161229c565b5063ffffffff811660031461231b5760405162461bcd60e51b815260040161043a90613587565b5f805b60208110156123705761233281601f6133f0565b61233d906008613403565b876123498360066132b8565b81518110612359576123596130a1565b016020015160f81c901b919091179060010161231e565b505f86602681518110612385576123856130a1565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c3f57604051631afcd79f60e31b815260040160405180910390fd5b6123f66123a5565b6123fe612b2c565b610c6e81612b34565b61240f6123a5565b610c6e81612cd6565b5f805160206137da8339815191525f6001600160401b03808416908516111561244c576124458385613733565b9050612459565b6124568484613733565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b03166060820152429115806124bb5750600284015481516124b7916001600160401b0316906132b8565b8210155b156124e1576001600160401b038316606082015281815260408101516020820152612500565b82816060018181516124f39190613753565b6001600160401b03169052505b6060810151612510906064613773565b602082015160028601546001600160401b03929092169161253b9190600160401b900460ff16613403565b101561259f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b856001600160401b0316816040018181516125ba91906132b8565b9052506040810180516001600160401b03871691906125da9083906133f0565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146126905760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612707576126c78160016133f0565b6126d2906008613403565b5081515f908390839081106126e9576126e96130a1565b60200101906001600160f81b03191690815f1a9053506001016126b3565b505f5b600481101561276f5761271e8160036133f0565b612729906008613403565b600160ff919091161c60f81b826127418360026132b8565b81518110612751576127516130a1565b60200101906001600160f81b03191690815f1a90535060010161270a565b505f5b60208110156127cc578451816020811061278e5761278e6130a1565b1a60f81b8261279e8360066132b8565b815181106127ae576127ae6130a1565b60200101906001600160f81b03191690815f1a905350600101612772565b505f5b602081101561282c57846020015181602081106127ee576127ee6130a1565b1a60f81b826127fe8360266132b8565b8151811061280e5761280e6130a1565b60200101906001600160f81b03191690815f1a9053506001016127cf565b505f5b60088110156128a0576128438160076133f0565b61284e906008613403565b60ff1685604001516001600160401b0316901c60f81b8282604661287291906132b8565b81518110612882576128826130a1565b60200101906001600160f81b03191690815f1a90535060010161282f565b505f5b603081101561290b57846080015181815181106128c2576128c26130a1565b01602001516001600160f81b031916826128dd83604e6132b8565b815181106128ed576128ed6130a1565b60200101906001600160f81b03191690815f1a9053506001016128a3565b505f5b600881101561297d576129228160076133f0565b61292d906008613403565b60608601516001600160401b0390811691161c60f81b8261294f83607e6132b8565b8151811061295f5761295f6130a1565b60200101906001600160f81b03191690815f1a90535060010161290e565b5060028160405161298e9190613293565b602060405180830381855afa1580156129a9573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129cc9190613045565b94909350915050565b5f8281525f805160206137fa833981519152602052604081206002015481905f805160206137da83398151915290600160801b90046001600160401b0316612a1d8582612418565b5f612a2787612cde565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb612a778a858b611065565b6040518263ffffffff1660e01b8152600401612a939190613013565b6020604051808303815f875af1158015612aaf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ad39190613045565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b610c3f6123a5565b612b3c6123a5565b80355f805160206137da83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014612b88608084016060850161379e565b60ff161115612bf55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f612c06608084016060850161379e565b60ff1611612c6e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b612c7e608083016060840161379e565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612caf60608301604084016135ce565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6110336123a5565b5f8181525f805160206137fa8339815191526020526040812060020180545f805160206137da83398151915291600160401b9091046001600160401b0316906008612d28836137be565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b508054612d7a906132ed565b5f825580601f10612d89575050565b601f0160209004905f5260205f2090810190610c6e91905b80821115612db4575f8155600101612da1565b5090565b5f60208284031215612dc8575f80fd5b5035919050565b803563ffffffff81168114612de2575f80fd5b919050565b5f60208284031215612df7575f80fd5b610c5482612dcf565b5f60808284031215612e10575f80fd5b50919050565b6001600160a01b0381168114610c6e575f80fd5b5f8060a08385031215612e3b575f80fd5b612e458484612e00565b91506080830135612e5581612e16565b809150509250929050565b5f8060408385031215612e71575f80fd5b82356001600160401b03811115612e86575f80fd5b612e9285828601612e00565b925050612ea160208401612dcf565b90509250929050565b80356001600160401b0381168114612de2575f80fd5b5f8060408385031215612ed1575f80fd5b82356001600160401b03811115612ee6575f80fd5b830160608186031215612ef7575f80fd5b9150612ea160208401612eaa565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f3c57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f7760608401826001600160401b03169052565b506080830151612f9260808401826001600160401b03169052565b5060a0830151612fad60a08401826001600160401b03169052565b5060c0830151612fc860c08401826001600160401b03169052565b5092915050565b5f60208284031215612fdf575f80fd5b8135612fea81612e16565b9392505050565b5f5b8381101561300b578181015183820152602001612ff3565b50505f910152565b602081525f8251806020840152613031816040850160208701612ff1565b601f01601f19169190910160400192915050565b5f60208284031215613055575f80fd5b5051919050565b5f808335601e19843603018112613071575f80fd5b8301803591506001600160401b0382111561308a575f80fd5b6020019150600581901b3603821315612b25575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130c9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715613109576131096130d3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613137576131376130d3565b604052919050565b5f6001600160401b03821115613157576131576130d3565b50601f01601f191660200190565b5f60608236031215613175575f80fd5b61317d6130e7565b82358152602061318e818501612eaa565b8183015260408401356001600160401b038111156131aa575f80fd5b840136601f8201126131ba575f80fd5b80356131cd6131c88261313f565b61310f565b81815236848385010111156131e0575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551613255818460208a01612ff1565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613285816028840160208801612ff1565b016028019695505050505050565b5f82516130c9818460208701612ff1565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c5757610c576132a4565b5f63ffffffff8083168181036132e3576132e36132a4565b6001019392505050565b600181811c9082168061330157607f821691505b602082108103612e1057634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613378816132ed565b806020870152604060018084165f811461339957600181146133b5576133e2565b60ff19851660408a0152604084151560051b8a010195506133e2565b895f5260205f205f5b858110156133d95781548b82018601529083019088016133be565b8a016040019650505b509398975050505050505050565b81810381811115610c5757610c576132a4565b8082028115828204841417610c5757610c576132a4565b80518015158114612de2575f80fd5b5f806040838503121561343a575f80fd5b82516001600160401b0380821115613450575f80fd5b9084019060608287031215613463575f80fd5b61346b6130e7565b8251815260208084015161347e81612e16565b82820152604084015183811115613493575f80fd5b80850194505087601f8501126134a7575f80fd5b835192506134b76131c88461313f565b83815288828587010111156134ca575f80fd5b6134d984838301848801612ff1565b806040840152508195506134ee81880161341a565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156135de575f80fd5b610c5482612eaa565b5f808335601e198436030181126135fc575f80fd5b8301803591506001600160401b03821115613615575f80fd5b602001915036819003821315612b25575f80fd5b601f8211156104d357805f5260205f20601f840160051c8101602085101561364e5750805b601f840160051c820191505b8181101561366d575f815560010161365a565b5050505050565b81516001600160401b0381111561368d5761368d6130d3565b6136a18161369b84546132ed565b84613629565b602080601f8311600181146136d4575f84156136bd5750858301515b5f19600386901b1c1916600185901b17855561372b565b5f85815260208120601f198616915b82811015613702578886015182559484019460019091019084016136e3565b508582101561371f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03828116828216039080821115612fc857612fc86132a4565b6001600160401b03818116838216019080821115612fc857612fc86132a4565b6001600160401b03818116838216028082169190828114613796576137966132a4565b505092915050565b5f602082840312156137ae575f80fd5b813560ff81168114612fea575f80fd5b5f6001600160401b038083168181036132e3576132e36132a456fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161394238038061394283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6137f58061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c80638da5cb5b116100a9578063c974d1b61161006e578063c974d1b6146102c6578063d588c18f146102ce578063d5f20ff6146102e1578063df93d8de14610301578063f2fde38b1461030b575f80fd5b80638da5cb5b1461023b57806397fb70d41461027f578063a3a65e4814610292578063b771b3bc146102a5578063bee0a03f146102b3575f80fd5b806366435abf116100ef57806366435abf146101d4578063715018a6146101ff578063732214f8146102075780638280a25a1461020e5780638994ab4914610228575f80fd5b80630322ed981461012b5780630cdd098514610140578063467ef06f1461019157806360305d62146101a457806361e2f490146101c1575b5f80fd5b61013e610139366004612d8e565b61031e565b005b61017e61014e366004612d8e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61013e61019f366004612dbd565b6104dc565b6101ac601481565b60405163ffffffff9091168152602001610188565b61013e6101cf366004612dd6565b6104ea565b6101e76101e2366004612d8e565b610b1e565b6040516001600160401b039091168152602001610188565b61013e610b32565b61017e5f81565b610216603081565b60405160ff9091168152602001610188565b61017e610236366004612e50565b610b45565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610188565b61013e61028d366004612d8e565b610b61565b61013e6102a0366004612dbd565b610b75565b6102676005600160991b0181565b61013e6102c1366004612d8e565b610d2d565b610216601481565b61013e6102dc366004612ea5565b610e3c565b6102f46102ef366004612d8e565b610f4a565b6040516101889190612eef565b6101e76202a30081565b61013e610319366004612f9e565b61103d565b5f8181525f805160206137c98339815191526020526040808220815160e0810190925280545f805160206137a983398151915293929190829060ff16600581111561036b5761036b612edb565b600581111561037c5761037c612edb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb612edb565b146104555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61047a8584606001515f611077565b6040518263ffffffff1660e01b81526004016104969190612fe2565b6020604051808303815f875af11580156104b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d69190613014565b50505050565b6104e58161129c565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206137a98339815191529060ff16156105875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161044c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ee9190613014565b8360200135146106505760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161044c565b306106616060850160408601612f9e565b6001600160a01b0316146106d35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161044c565b5f6106e1606085018561302b565b91505f90508435602086013560146106ff6060890160408a01612f9e565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610a2e575f61077f606089018961302b565b8363ffffffff1681811061079557610795613070565b90506020028101906107a79190613084565b6107b090613134565b80515f81815260088901602052604090205491925090156107e35760405162461bcd60e51b815260040161044c906131cb565b84825f0151836020015184604001516040516020016108059493929190613213565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916108539190613262565b602060405180830381855afa15801561086e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108919190613014565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff1916600183600581111561091d5761091d612edb565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516109d0911686613287565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610a279061329a565b9050610763565b50600484018190555f610a4086611614565b90505f610a5082604001516117da565b905080600285604051610a639190613262565b602060405180830381855afa158015610a7e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aa19190613014565b14610b055760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161044c565b5050506009909201805460ff1916600117905550505050565b5f610b2882610f4a565b6080015192915050565b610b3a611943565b610b435f61199e565b565b5f610b4e611943565b610b588383611a0e565b90505b92915050565b610b69611943565b610b7281611f72565b50565b5f805160206137a98339815191525f610b8d83611614565b90505f80610b9e83604001516121e3565b9150915080610c005760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044c565b5f82815260068501602052604081208054610c1a906132bc565b9050118015610c4c575060015f83815260078601602052604090205460ff166005811115610c4a57610c4a612edb565b145b610c685760405162461bcd60e51b815260040161044c906132ee565b5f8281526006850160205260408120610c8091612d44565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206137a9833981519152929190610d75906132bc565b9050118015610da7575060015f83815260078301602052604090205460ff166005811115610da557610da5612edb565b145b610dc35760405162461bcd60e51b815260040161044c906132ee565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dfc9190600401613335565b6020604051808303815f875af1158015610e18573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e59190613014565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610e805750825b90505f826001600160401b03166001148015610e9b5750303b155b905081158015610ea9575080155b15610ec75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ef157845460ff60401b1916600160401b1785555b610efb8787612384565b8315610f4157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206137c983398151915290528390208351918201909352825491925f805160206137a983398151915292829060ff166005811115610fca57610fca612edb565b6005811115610fdb57610fdb612edb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611045611943565b6001600160a01b03811661106e57604051631e4fbdf760e01b81525f600482015260240161044c565b610b728161199e565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110f0576110b08160016133bf565b6110bb9060086133d2565b5081515f908390839081106110d2576110d2613070565b60200101906001600160f81b03191690815f1a90535060010161109c565b505f5b600481101561115b576111078160036133bf565b6111129060086133d2565b600263ffffffff16901c60f81b8282600261112d9190613287565b8151811061113d5761113d613070565b60200101906001600160f81b03191690815f1a9053506001016110f3565b505f5b60208110156111bd5761117281601f6133bf565b61117d9060086133d2565b86901c60f81b8261118f836006613287565b8151811061119f5761119f613070565b60200101906001600160f81b03191690815f1a90535060010161115e565b505f5b6008811015611228576111d48160076133bf565b6111df9060086133d2565b6001600160401b038616901c60f81b826111fa836026613287565b8151811061120a5761120a613070565b60200101906001600160f81b03191690815f1a9053506001016111c0565b505f5b60088110156112935761123f8160076133bf565b61124a9060086133d2565b6001600160401b038516901c60f81b8261126583602e613287565b8151811061127557611275613070565b60200101906001600160f81b03191690815f1a90535060010161122b565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206137a98339815191525f6112eb85611614565b90505f806112fc83604001516121e3565b9150915080156113615760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044c565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561139257611392612edb565b60058111156113a3576113a3612edb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561141457611414612edb565b1480611432575060018251600581111561143057611430612edb565b145b6114915760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044c565b6003825160058111156114a6576114a6612edb565b036114b3575060046114b7565b5060055b6020808301515f908152600888019091526040812055818160058111156114e0576114e0612edb565b908160058111156114f3576114f3612edb565b9052505f84815260078701602052604090208251815484929190829060ff1916600183600581111561152757611527612edb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156115db576115db612edb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611678573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261169f91908101906133f8565b91509150806116ff5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161044c565b8151156117605760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044c565b60208201516001600160a01b0316156117d35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044c565b5092915050565b5f81516026146117fc5760405162461bcd60e51b815260040161044c906134ca565b5f805b600281101561184b576118138160016133bf565b61181e9060086133d2565b61ffff1684828151811061183457611834613070565b016020015160f81c901b91909117906001016117ff565b5061ffff81161561186e5760405162461bcd60e51b815260040161044c90613513565b5f805b60048110156118c9576118858160036133bf565b6118909060086133d2565b63ffffffff16856118a2836002613287565b815181106118b2576118b2613070565b016020015160f81c901b9190911790600101611871565b5063ffffffff8116156118ee5760405162461bcd60e51b815260040161044c90613556565b5f805b60208110156112935761190581601f6133bf565b6119109060086133d2565b8661191c836006613287565b8151811061192c5761192c613070565b016020015160f81c901b91909117906001016118f1565b336119757f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b435760405163118cdaa760e01b815233600482015260240161044c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611a995760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161044c565b5f805160206137a983398151915242611ab8604086016020870161359d565b6001600160401b031611611b2a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161044c565b611b3a604085016020860161359d565b6001600160401b0316611b506202a30042613287565b11611bc35760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161044c565b8335611c1b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044c565b83355f90815260088201602052604090205415611c4a5760405162461bcd60e51b815260040161044c906131cb565b6030611c5960408601866135b6565b905014611cbe5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044c565b611cc8835f6123a2565b5f80611d616040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611d0c919061359d565b6001600160401b03168152602001611d2760408a018a6135b6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506125b0565b5f82815260068601602052604090209193509150611d7f8282613643565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611dac908590600401612fe2565b6020604051808303815f875af1158015611dc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dec9190613014565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115611e6457611e64612edb565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f44918e01908e0161359d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206137c98339815191526020526040808220815160e0810190925280545f805160206137a983398151915293929190829060ff166005811115611fbf57611fbf612edb565b6005811115611fd057611fd0612edb565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561204257612042612edb565b1461209e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044c565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156120e2576120e2612edb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61218e848261295f565b6080840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f8082516027146122065760405162461bcd60e51b815260040161044c906134ca565b5f805b60028110156122555761221d8160016133bf565b6122289060086133d2565b61ffff1685828151811061223e5761223e613070565b016020015160f81c901b9190911790600101612209565b5061ffff8116156122785760405162461bcd60e51b815260040161044c90613513565b5f805b60048110156122d35761228f8160036133bf565b61229a9060086133d2565b63ffffffff16866122ac836002613287565b815181106122bc576122bc613070565b016020015160f81c901b919091179060010161227b565b5063ffffffff81166003146122fa5760405162461bcd60e51b815260040161044c90613556565b5f805b602081101561234f5761231181601f6133bf565b61231c9060086133d2565b87612328836006613287565b8151811061233857612338613070565b016020015160f81c901b91909117906001016122fd565b505f8660268151811061236457612364613070565b016020015191976001600160f81b03199092161515965090945050505050565b61238c612ab6565b61239582612aff565b61239e81612b18565b5050565b5f805160206137a98339815191525f6001600160401b0380841690851611156123d6576123cf8385613702565b90506123e3565b6123e08484613702565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580612445575060018401548151612441916001600160401b031690613287565b8210155b1561246b576001600160401b03831660608201528181526040810151602082015261248a565b828160600181815161247d9190613722565b6001600160401b03169052505b606081015161249a906064613742565b602082015160018601546001600160401b0392909216916124c59190600160401b900460ff166133d2565b10156125295760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161044c565b856001600160401b0316816040018181516125449190613287565b9052506040810180516001600160401b03871691906125649083906133bf565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f606082608001515160301461261a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612691576126518160016133bf565b61265c9060086133d2565b5081515f9083908390811061267357612673613070565b60200101906001600160f81b03191690815f1a90535060010161263d565b505f5b60048110156126f9576126a88160036133bf565b6126b39060086133d2565b600160ff919091161c60f81b826126cb836002613287565b815181106126db576126db613070565b60200101906001600160f81b03191690815f1a905350600101612694565b505f5b6020811015612756578451816020811061271857612718613070565b1a60f81b82612728836006613287565b8151811061273857612738613070565b60200101906001600160f81b03191690815f1a9053506001016126fc565b505f5b60208110156127b6578460200151816020811061277857612778613070565b1a60f81b82612788836026613287565b8151811061279857612798613070565b60200101906001600160f81b03191690815f1a905350600101612759565b505f5b600881101561282a576127cd8160076133bf565b6127d89060086133d2565b60ff1685604001516001600160401b0316901c60f81b828260466127fc9190613287565b8151811061280c5761280c613070565b60200101906001600160f81b03191690815f1a9053506001016127b9565b505f5b6030811015612895578460800151818151811061284c5761284c613070565b01602001516001600160f81b0319168261286783604e613287565b8151811061287757612877613070565b60200101906001600160f81b03191690815f1a90535060010161282d565b505f5b6008811015612907576128ac8160076133bf565b6128b79060086133d2565b60608601516001600160401b0390811691161c60f81b826128d983607e613287565b815181106128e9576128e9613070565b60200101906001600160f81b03191690815f1a905350600101612898565b506002816040516129189190613262565b602060405180830381855afa158015612933573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129569190613014565b94909350915050565b5f8281525f805160206137c9833981519152602052604081206002015481905f805160206137a983398151915290600160801b90046001600160401b03166129a785826123a2565b5f6129b187612b29565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb612a018a858b611077565b6040518263ffffffff1660e01b8152600401612a1d9190612fe2565b6020604051808303815f875af1158015612a39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a5d9190613014565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b4357604051631afcd79f60e31b815260040160405180910390fd5b612b07612ab6565b612b0f612bb9565b610b7281612bc1565b612b20612ab6565b610b7281612d3c565b5f8181525f805160206137c98339815191526020526040812060020180545f805160206137a983398151915291600160401b9091046001600160401b0316906008612b738361376d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b610b43612ab6565b612bc9612ab6565b80355f805160206137a98339815191529081556014612bee6060840160408501613788565b60ff161115612c5b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161044c565b5f612c6c6060840160408501613788565b60ff1611612cd45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161044c565b612ce46060830160408401613788565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612d15604083016020840161359d565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b611045612ab6565b508054612d50906132bc565b5f825580601f10612d5f575050565b601f0160209004905f5260205f2090810190610b7291905b80821115612d8a575f8155600101612d77565b5090565b5f60208284031215612d9e575f80fd5b5035919050565b803563ffffffff81168114612db8575f80fd5b919050565b5f60208284031215612dcd575f80fd5b610b5882612da5565b5f8060408385031215612de7575f80fd5b82356001600160401b03811115612dfc575f80fd5b830160808186031215612e0d575f80fd5b9150612e1b60208401612da5565b90509250929050565b5f60608284031215612e34575f80fd5b50919050565b80356001600160401b0381168114612db8575f80fd5b5f8060408385031215612e61575f80fd5b82356001600160401b03811115612e76575f80fd5b612e8285828601612e24565b925050612e1b60208401612e3a565b6001600160a01b0381168114610b72575f80fd5b5f8060808385031215612eb6575f80fd5b612ec08484612e24565b91506060830135612ed081612e91565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f1257634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f4d60608401826001600160401b03169052565b506080830151612f6860808401826001600160401b03169052565b5060a0830151612f8360a08401826001600160401b03169052565b5060c08301516117d360c08401826001600160401b03169052565b5f60208284031215612fae575f80fd5b8135612fb981612e91565b9392505050565b5f5b83811015612fda578181015183820152602001612fc2565b50505f910152565b602081525f8251806020840152613000816040850160208701612fc0565b601f01601f19169190910160400192915050565b5f60208284031215613024575f80fd5b5051919050565b5f808335601e19843603018112613040575f80fd5b8301803591506001600160401b03821115613059575f80fd5b6020019150600581901b3603821315612aaf575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112613098575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130d8576130d86130a2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613106576131066130a2565b604052919050565b5f6001600160401b03821115613126576131266130a2565b50601f01601f191660200190565b5f60608236031215613144575f80fd5b61314c6130b6565b82358152602061315d818501612e3a565b8183015260408401356001600160401b03811115613179575f80fd5b840136601f820112613189575f80fd5b803561319c6131978261310e565b6130de565b81815236848385010111156131af575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551613224818460208a01612fc0565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613254816028840160208801612fc0565b016028019695505050505050565b5f8251613098818460208701612fc0565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b5b57610b5b613273565b5f63ffffffff8083168181036132b2576132b2613273565b6001019392505050565b600181811c908216806132d057607f821691505b602082108103612e3457634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613347816132bc565b806020870152604060018084165f81146133685760018114613384576133b1565b60ff19851660408a0152604084151560051b8a010195506133b1565b895f5260205f205f5b858110156133a85781548b820186015290830190880161338d565b8a016040019650505b509398975050505050505050565b81810381811115610b5b57610b5b613273565b8082028115828204841417610b5b57610b5b613273565b80518015158114612db8575f80fd5b5f8060408385031215613409575f80fd5b82516001600160401b038082111561341f575f80fd5b9084019060608287031215613432575f80fd5b61343a6130b6565b8251815260208084015161344d81612e91565b82820152604084015183811115613462575f80fd5b80850194505087601f850112613476575f80fd5b835192506134866131978461310e565b8381528882858701011115613499575f80fd5b6134a884838301848801612fc0565b806040840152508195506134bd8188016133e9565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156135ad575f80fd5b610b5882612e3a565b5f808335601e198436030181126135cb575f80fd5b8301803591506001600160401b038211156135e4575f80fd5b602001915036819003821315612aaf575f80fd5b601f8211156104e557805f5260205f20601f840160051c8101602085101561361d5750805b601f840160051c820191505b8181101561363c575f8155600101613629565b5050505050565b81516001600160401b0381111561365c5761365c6130a2565b6136708161366a84546132bc565b846135f8565b602080601f8311600181146136a3575f841561368c5750858301515b5f19600386901b1c1916600185901b1785556136fa565b5f85815260208120601f198616915b828110156136d1578886015182559484019460019091019084016136b2565b50858210156136ee57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b038281168282160390808211156117d3576117d3613273565b6001600160401b038181168382160190808211156117d3576117d3613273565b6001600160401b0381811683821602808216919082811461376557613765613273565b505092915050565b5f6001600160401b038083168181036132b2576132b2613273565b5f60208284031215613798575f80fd5b813560ff81168114612fb9575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -367,6 +366,37 @@ func (_PoAValidatorManager *PoAValidatorManagerCallerSession) MAXIMUMREGISTRATIO return _PoAValidatorManager.Contract.MAXIMUMREGISTRATIONEXPIRYLENGTH(&_PoAValidatorManager.CallOpts) } +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCaller) PCHAINBLOCKCHAINID(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "P_CHAIN_BLOCKCHAIN_ID") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerSession) PCHAINBLOCKCHAINID() ([32]byte, error) { + return _PoAValidatorManager.Contract.PCHAINBLOCKCHAINID(&_PoAValidatorManager.CallOpts) +} + +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) PCHAINBLOCKCHAINID() ([32]byte, error) { + return _PoAValidatorManager.Contract.PCHAINBLOCKCHAINID(&_PoAValidatorManager.CallOpts) +} + // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. // // Solidity: function WARP_MESSENGER() view returns(address) @@ -564,23 +594,23 @@ func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) CompleteValida return _PoAValidatorManager.Contract.CompleteValidatorRegistration(&_PoAValidatorManager.TransactOpts, messageIndex) } -// Initialize is a paid mutator transaction binding the contract method 0x580a4006. +// Initialize is a paid mutator transaction binding the contract method 0xd588c18f. // -// Solidity: function initialize((bytes32,bytes32,uint64,uint8) settings, address initialOwner) returns() +// Solidity: function initialize((bytes32,uint64,uint8) settings, address initialOwner) returns() func (_PoAValidatorManager *PoAValidatorManagerTransactor) Initialize(opts *bind.TransactOpts, settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { return _PoAValidatorManager.contract.Transact(opts, "initialize", settings, initialOwner) } -// Initialize is a paid mutator transaction binding the contract method 0x580a4006. +// Initialize is a paid mutator transaction binding the contract method 0xd588c18f. // -// Solidity: function initialize((bytes32,bytes32,uint64,uint8) settings, address initialOwner) returns() +// Solidity: function initialize((bytes32,uint64,uint8) settings, address initialOwner) returns() func (_PoAValidatorManager *PoAValidatorManagerSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) } -// Initialize is a paid mutator transaction binding the contract method 0x580a4006. +// Initialize is a paid mutator transaction binding the contract method 0xd588c18f. // -// Solidity: function initialize((bytes32,bytes32,uint64,uint8) settings, address initialOwner) returns() +// Solidity: function initialize((bytes32,uint64,uint8) settings, address initialOwner) returns() func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) Initialize(settings ValidatorManagerSettings, initialOwner common.Address) (*types.Transaction, error) { return _PoAValidatorManager.Contract.Initialize(&_PoAValidatorManager.TransactOpts, settings, initialOwner) } diff --git a/contracts/staking/ValidatorManager.sol b/contracts/staking/ValidatorManager.sol index 7ed9cd005..39711b9ab 100644 --- a/contracts/staking/ValidatorManager.sol +++ b/contracts/staking/ValidatorManager.sol @@ -32,8 +32,6 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida /// @custom:storage-location erc7201:avalanche-icm.storage.ValidatorManager struct ValidatorManagerStorage { - /// @notice The blockchainID of the P-Chain. - bytes32 _pChainBlockchainID; /// @notice The subnetID associated with this validator manager. bytes32 _subnetID; /// @notice The number of seconds after which to reset the churn tracker. @@ -62,6 +60,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida uint64 public constant MAXIMUM_REGISTRATION_EXPIRY_LENGTH = 2 days; uint32 public constant ADDRESS_LENGTH = 20; // This is only used as a packed uint32 uint8 public constant BLS_PUBLIC_KEY_LENGTH = 48; + bytes32 public constant P_CHAIN_BLOCKCHAIN_ID = bytes32(0); // solhint-disable ordering function _getValidatorManagerStorage() @@ -96,7 +95,6 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida onlyInitializing { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - $._pChainBlockchainID = settings.pChainBlockchainID; $._subnetID = settings.subnetID; require( @@ -451,12 +449,12 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida view returns (WarpMessage memory) { - ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); require(valid, "ValidatorManager: invalid warp message"); + // Must match to P-Chain blockchain id, which is 0. require( - warpMessage.sourceChainID == $._pChainBlockchainID, + warpMessage.sourceChainID == P_CHAIN_BLOCKCHAIN_ID, "ValidatorManager: invalid source chain ID" ); require( diff --git a/contracts/staking/interfaces/IValidatorManager.sol b/contracts/staking/interfaces/IValidatorManager.sol index 80bdad31b..a505f5605 100644 --- a/contracts/staking/interfaces/IValidatorManager.sol +++ b/contracts/staking/interfaces/IValidatorManager.sol @@ -46,7 +46,6 @@ event ValidatorWeightUpdate( ); struct ValidatorManagerSettings { - bytes32 pChainBlockchainID; bytes32 subnetID; uint64 churnPeriodSeconds; uint8 maximumChurnPercentage; diff --git a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol index 9db5522c1..cbdd63d91 100644 --- a/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/ERC20TokenStakingManagerTests.t.sol @@ -33,7 +33,6 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE @@ -60,7 +59,6 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE @@ -83,7 +81,6 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE @@ -105,7 +102,6 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE @@ -127,7 +123,6 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE @@ -150,7 +145,6 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE diff --git a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol index 2cf4243a7..bc53e3384 100644 --- a/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/staking/tests/NativeTokenStakingManagerTests.t.sol @@ -26,7 +26,6 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE @@ -52,7 +51,6 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE @@ -74,7 +72,6 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE @@ -95,7 +92,6 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE @@ -116,7 +112,6 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE @@ -138,7 +133,6 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE diff --git a/contracts/staking/tests/PoAValidatorManagerTests.t.sol b/contracts/staking/tests/PoAValidatorManagerTests.t.sol index ac924187d..bdd9279b2 100644 --- a/contracts/staking/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoAValidatorManagerTests.t.sol @@ -24,7 +24,6 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { app = new PoAValidatorManager(ICMInitializable.Allowed); app.initialize( ValidatorManagerSettings({ - pChainBlockchainID: P_CHAIN_BLOCKCHAIN_ID, subnetID: DEFAULT_SUBNET_ID, churnPeriodSeconds: DEFAULT_CHURN_PERIOD, maximumChurnPercentage: DEFAULT_MAXIMUM_CHURN_PERCENTAGE diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 22cc80c35..e6de8fb37 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -17,8 +17,6 @@ import { // TODO: Remove this once all unit tests implemented // solhint-disable no-empty-blocks abstract contract ValidatorManagerTest is Test { - bytes32 public constant P_CHAIN_BLOCKCHAIN_ID = - bytes32(hex"0000000000000000000000000000000000000000000000000000000000000000"); bytes32 public constant DEFAULT_SUBNET_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes32 public constant DEFAULT_NODE_ID = @@ -388,7 +386,7 @@ abstract contract ValidatorManagerTest is Test { abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), abi.encode( WarpMessage({ - sourceChainID: P_CHAIN_BLOCKCHAIN_ID, + sourceChainID: validatorManager.P_CHAIN_BLOCKCHAIN_ID(), originSenderAddress: address(0), payload: expectedPayload }), From b8d58ee4e767d9253396974d1f909335c6901e5e Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 19 Sep 2024 09:00:06 -0700 Subject: [PATCH 370/545] bindings --- .../ERC20TokenStakingManager.go | 9 +-- .../NativeTokenStakingManager.go | 66 +++++++++---------- .../PoAValidatorManager.go | 7 +- 3 files changed, 34 insertions(+), 48 deletions(-) diff --git a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 1084d020f..096976097 100644 --- a/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/staking/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -82,13 +82,8 @@ type ValidatorRegistrationInput struct { // ERC20TokenStakingManagerMetaData contains all meta data concerning the ERC20TokenStakingManager contract. var ERC20TokenStakingManagerMetaData = &bind.MetaData{ -<<<<<<< HEAD - 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"contractIERC20\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615b62380380615b6283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615a158061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063ba3a4b9711610093578063d5f20ff61161006e578063d5f20ff614610390578063df93d8de146103b0578063eb0acb89146103ba578063f09969ae146103cd575f80fd5b8063ba3a4b9714610362578063bee0a03f14610375578063c974d1b614610388575f80fd5b806376f78621146102e85780638280a25a146102fb57806398f3e2b4146103035780639e1bc4ef14610316578063a3a65e4814610329578063b771b3bc1461033c575f80fd5b8063467ef06f1161014457806361e2f4901161011f57806361e2f490146102a857806362065856146102bb57806366435abf146102ce578063732214f8146102e1575f80fd5b8063467ef06f146102655780635297fae61461027857806360305d621461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e57806335455ded14610249575b5f80fd5b61019e610199366004614d9f565b6103e0565b005b61019e6101ae366004614dda565b610795565b6101f16101c1366004614dda565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c366004614dda565b61094e565b6040516001600160401b0390911681526020016101fb565b61025261271081565b60405161ffff90911681526020016101fb565b61019e610273366004614df1565b610964565b61019e610286366004614e0a565b6109b7565b610293601481565b60405163ffffffff90911681526020016101fb565b61019e6102b6366004614e32565b610b8c565b6101f16102c9366004614e96565b6111c0565b6102316102dc366004614dda565b6111d9565b6101f15f81565b61019e6102f6366004614d9f565b6111ed565b61020c603081565b61019e610311366004614e0a565b6112ce565b6101f1610324366004614eaf565b6114fb565b61019e610337366004614df1565b611527565b61034a6005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e610370366004614dda565b6116df565b61019e610383366004614dda565b611965565b61020c601481565b6103a361039e366004614dda565b611a79565b6040516101fb9190614ee3565b6102316202a30081565b6101f16103c8366004614fa3565b611b6c565b61019e6103db36600461501c565b611ba1565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206159698339815191529184156104325761042f8285611c80565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561046457610464614ecf565b600481111561047557610475614ecf565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6104f184611a79565b905060028251600481111561050857610508614ecf565b1461055a5760405162461bcd60e51b815260206004820152602a60248201525f805160206159898339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146105bf5760405162461bcd60e51b815260206004820152603360248201525f805160206159898339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610551565b60038252805160029060058111156105d9576105d9614ecf565b0361061d575f826060015182608001516105f3919061506e565b90506105ff8582611f1c565b506001600160401b0390811660e0850152421660a08401525061063e565b60608101516001600160401b0390811660e084015260c08201511660a08301525b5f88815260068601602052604090208251815484929190829060ff1916600183600481111561066f5761066f614ecf565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610783916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206159e98339815191526020526040808220815160e0810190925280545f805160206159a983398151915293929190829060ff1660058111156107e2576107e2614ecf565b60058111156107f3576107f3614ecf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561086257610862614ecf565b146108c75760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610551565b6005600160991b016001600160a01b031663ee5b48eb6108ec8584606001515f612073565b6040518263ffffffff1660e01b815260040161090891906150b0565b6020604051808303815f875af1158015610924573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094891906150e2565b50505050565b5f61095e64e8d4a51000836150f9565b92915050565b5f805160206159698339815191525f8061097d8461229a565b6040808201515f848152600588016020529190912054929450909250610948916001600160401b03909116906001600160a01b0316612612565b5f805160206159698339815191525f6109cf84612648565b90505f806109e0836040015161280e565b50915091505f6109ef83611a79565b9050816001600160401b031681606001516001600160401b03161015610a275760405162461bcd60e51b815260040161055190615118565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610a6c5760405162461bcd60e51b81526004016105519061515a565b60015f87815260068701602052604090205460ff166004811115610a9257610a92614ecf565b14610afb5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610551565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206159a98339815191529060ff1615610c295760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610551565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9091906150e2565b836020013514610cf25760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610551565b30610d0360608501604086016151a3565b6001600160a01b031614610d755760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610551565b5f610d8360608501856151be565b91505f9050843560208601356014610da16060890160408a016151a3565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156110d0575f610e2160608901896151be565b8363ffffffff16818110610e3757610e37615203565b9050602002810190610e499190615217565b610e52906152c7565b80515f8181526008890160205260409020549192509015610e855760405162461bcd60e51b81526004016105519061535e565b84825f015183602001518460400151604051602001610ea794939291906153a6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610ef591906153f5565b602060405180830381855afa158015610f10573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f3391906150e2565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff19166001836005811115610fbf57610fbf614ecf565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611072911686615406565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806110c990615419565b9050610e05565b50600484018190555f6110e286612648565b90505f6110f28260400151612a49565b90508060028560405161110591906153f5565b602060405180830381855afa158015611120573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061114391906150e2565b146111a75760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610551565b5050506009909201805460ff1916600117905550505050565b5f61095e6001600160401b03831664e8d4a5100061543b565b5f6111e382611a79565b6080015192915050565b5f805160206159698339815191525f61120585611a79565b5f86815260058401602052604090205460a082015191925061123891600160b01b9091046001600160401b031690615452565b6001600160401b03164210156112ac5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610551565b83156112be576112bc8584611c80565b505b6112c785612bbb565b5050505050565b6112d6612e2c565b5f805160206159698339815191525f6112ee84612648565b90505f806112ff836040015161280e565b50915091505f61130e83611a79565b9050816001600160401b031681606001516001600160401b031610156113465760405162461bcd60e51b815260040161055190615118565b5f8681526006860160205260409020600301546001600160401b03808416911611156113845760405162461bcd60e51b81526004016105519061515a565b60035f87815260068701602052604090205460ff1660048111156113aa576113aa614ecf565b146113fe5760405162461bcd60e51b815260206004820152603160248201525f805160206159898339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610551565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526114a391612612565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a45050505050506114f760015f805160206159c983398151915255565b5050565b5f611504612e2c565b61150f833384612e76565b905061095e60015f805160206159c983398151915255565b5f805160206159a98339815191525f61153f83612648565b90505f80611550836040015161325e565b91509150806115b25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610551565b5f828152600685016020526040812080546115cc90615472565b90501180156115fe575060015f83815260078601602052604090205460ff1660058111156115fc576115fc614ecf565b145b61161a5760405162461bcd60e51b8152600401610551906154aa565b5f828152600685016020526040812061163291614d30565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061596983398151915293929190829060ff16600481111561174057611740614ecf565b600481111561175157611751614ecf565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156117d8576117d8614ecf565b14806117f657506003815160048111156117f4576117f4614ecf565b145b61184a5760405162461bcd60e51b815260206004820152603260248201525f80516020615989833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610551565b5f6118588260400151611a79565b905080606001516001600160401b03165f036118dc5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610551565b6005600160991b016001600160a01b031663ee5b48eb611909846040015184606001518560800151612073565b6040518263ffffffff1660e01b815260040161192591906150b0565b6020604051808303815f875af1158015611941573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112c791906150e2565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206159a98339815191529291906119ad90615472565b90501180156119df575060015f83815260078301602052604090205460ff1660058111156119dd576119dd614ecf565b145b6119fb5760405162461bcd60e51b8152600401610551906154aa565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611a3491906004016154f1565b6020604051808303815f875af1158015611a50573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a7491906150e2565b505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206159e983398151915290528390208351918201909352825491925f805160206159a983398151915292829060ff166005811115611af957611af9614ecf565b6005811115611b0a57611b0a614ecf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611b75612e2c565b611b81858585856133ff565b9050611b9960015f805160206159c983398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611bea575080546001600160401b03808416911610155b15611c085760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611c338484613674565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ccb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cf29190810190615586565b9150915080611d555760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610551565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dbc91906150e2565b825114611e205760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610551565b60208201516001600160a01b031615611e965760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610551565b5f80611ea5846040015161368e565b91509150818714611f125760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610551565b9695505050505050565b5f8281525f805160206159e9833981519152602052604081206002015481905f805160206159a983398151915290600160801b90046001600160401b0316611f648582613866565b5f611f6e87613a74565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611fbe8a858b612073565b6040518263ffffffff1660e01b8152600401611fda91906150b0565b6020604051808303815f875af1158015611ff6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061201a91906150e2565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156120ec576120ac816001615658565b6120b790600861543b565b5081515f908390839081106120ce576120ce615203565b60200101906001600160f81b03191690815f1a905350600101612098565b505f5b600481101561215757612103816003615658565b61210e90600861543b565b600263ffffffff16901c60f81b828260026121299190615406565b8151811061213957612139615203565b60200101906001600160f81b03191690815f1a9053506001016120ef565b505f5b60208110156121b95761216e81601f615658565b61217990600861543b565b86901c60f81b8261218b836006615406565b8151811061219b5761219b615203565b60200101906001600160f81b03191690815f1a90535060010161215a565b505f5b6008811015612224576121d0816007615658565b6121db90600861543b565b6001600160401b038616901c60f81b826121f6836026615406565b8151811061220657612206615203565b60200101906001600160f81b03191690815f1a9053506001016121bc565b505f5b600881101561228f5761223b816007615658565b61224690600861543b565b6001600160401b038516901c60f81b8261226183602e615406565b8151811061227157612271615203565b60200101906001600160f81b03191690815f1a905350600101612227565b5090505b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206159a98339815191525f6122e985612648565b90505f806122fa836040015161325e565b91509150801561235f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610551565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561239057612390614ecf565b60058111156123a1576123a1614ecf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561241257612412614ecf565b1480612430575060018251600581111561242e5761242e614ecf565b145b61248f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610551565b6003825160058111156124a4576124a4614ecf565b036124b1575060046124b5565b5060055b6020808301515f908152600888019091526040812055818160058111156124de576124de614ecf565b908160058111156124f1576124f1614ecf565b9052505f84815260078701602052604090208251815484929190829060ff1916600183600581111561252557612525614ecf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156125d9576125d9614ecf565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546114f7906001600160a01b03168284613b04565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156126ac573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126d39190810190615586565b91509150806127335760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610551565b8151156127945760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610551565b60208201516001600160a01b0316156128075760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610551565b5092915050565b5f805f83516036146128325760405162461bcd60e51b81526004016105519061566b565b5f805b600281101561288157612849816001615658565b61285490600861543b565b61ffff1686828151811061286a5761286a615203565b016020015160f81c901b9190911790600101612835565b5061ffff8116156128a45760405162461bcd60e51b8152600401610551906156b4565b5f805b60048110156128ff576128bb816003615658565b6128c690600861543b565b63ffffffff16876128d8836002615406565b815181106128e8576128e8615203565b016020015160f81c901b91909117906001016128a7565b5063ffffffff81166004146129265760405162461bcd60e51b8152600401610551906156f7565b5f805b602081101561297b5761293d81601f615658565b61294890600861543b565b88612954836006615406565b8151811061296457612964615203565b016020015160f81c901b9190911790600101612929565b505f805b60088110156129da57612993816007615658565b61299e90600861543b565b6001600160401b0316896129b3836026615406565b815181106129c3576129c3615203565b016020015160f81c901b919091179060010161297f565b505f805b6008811015612a39576129f2816007615658565b6129fd90600861543b565b6001600160401b03168a612a1283602e615406565b81518110612a2257612a22615203565b016020015160f81c901b91909117906001016129de565b5091989097509095509350505050565b5f8151602614612a6b5760405162461bcd60e51b81526004016105519061566b565b5f805b6002811015612aba57612a82816001615658565b612a8d90600861543b565b61ffff16848281518110612aa357612aa3615203565b016020015160f81c901b9190911790600101612a6e565b5061ffff811615612add5760405162461bcd60e51b8152600401610551906156b4565b5f805b6004811015612b3857612af4816003615658565b612aff90600861543b565b63ffffffff1685612b11836002615406565b81518110612b2157612b21615203565b016020015160f81c901b9190911790600101612ae0565b5063ffffffff811615612b5d5760405162461bcd60e51b8152600401610551906156f7565b5f805b6020811015612bb257612b7481601f615658565b612b7f90600861543b565b86612b8b836006615406565b81518110612b9b57612b9b615203565b016020015160f81c901b9190911790600101612b60565b50949350505050565b5f8181525f805160206159e98339815191526020526040808220815160e0810190925280545f805160206159a983398151915293929190829060ff166005811115612c0857612c08614ecf565b6005811115612c1957612c19614ecf565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612c8b57612c8b614ecf565b14612ce75760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610551565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff19166001836005811115612d2b57612d2b614ecf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612dd78482611f1c565b6080840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f805160206159c9833981519152805460011901612e5d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206159c983398151915255565b5f5f8051602061596983398151915281612e9261022c85613b63565b90505f612e9e87611a79565b5f8881527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020549091506001600160a01b0316612f345760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610551565b600281516005811115612f4957612f49614ecf565b14612fa85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610551565b5f828260800151612fb99190615452565b60048501546040840151919250612fdb916001600160401b039091169061573e565b6001600160401b0316816001600160401b0316111561305a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610551565b5f806130668a84611f1c565b915091505f8a8360405160200161309492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561312f5761312f614ecf565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146132815760405162461bcd60e51b81526004016105519061566b565b5f805b60028110156132d057613298816001615658565b6132a390600861543b565b61ffff168582815181106132b9576132b9615203565b016020015160f81c901b9190911790600101613284565b5061ffff8116156132f35760405162461bcd60e51b8152600401610551906156b4565b5f805b600481101561334e5761330a816003615658565b61331590600861543b565b63ffffffff1686613327836002615406565b8151811061333757613337615203565b016020015160f81c901b91909117906001016132f6565b5063ffffffff81166003146133755760405162461bcd60e51b8152600401610551906156f7565b5f805b60208110156133ca5761338c81601f615658565b61339790600861543b565b876133a3836006615406565b815181106133b3576133b3615203565b016020015160f81c901b9190911790600101613378565b505f866026815181106133df576133df615203565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206159698339815191529061ffff86161080159061344b575061271061ffff861611155b6134675760405162461bcd60e51b815260040161055190615769565b60028101546001600160401b0390811690851610156134e05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610551565b80548310156135435760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610551565b80600101548311156135aa5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610551565b5f6135b484613b63565b90505f6135c08261094e565b90505f6135cd8983613b99565b905060405180606001604052806135e13390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b61367c6140fd565b61368582614148565b6114f7816141bd565b5f808251602e146136b15760405162461bcd60e51b81526004016105519061566b565b5f805b6002811015613700576136c8816001615658565b6136d390600861543b565b61ffff168582815181106136e9576136e9615203565b016020015160f81c901b91909117906001016136b4565b5061ffff8116156137235760405162461bcd60e51b8152600401610551906156b4565b5f805b600481101561377e5761373a816003615658565b61374590600861543b565b63ffffffff1686613757836002615406565b8151811061376757613767615203565b016020015160f81c901b9190911790600101613726565b5063ffffffff81166005146137a55760405162461bcd60e51b8152600401610551906156f7565b5f805b60208110156137fa576137bc81601f615658565b6137c790600861543b565b876137d3836006615406565b815181106137e3576137e3615203565b016020015160f81c901b91909117906001016137a8565b505f805b600881101561385957613812816007615658565b61381d90600861543b565b6001600160401b031688613832836026615406565b8151811061384257613842615203565b016020015160f81c901b91909117906001016137fe565b5090969095509350505050565b5f805160206159a98339815191525f6001600160401b03808416908516111561389a57613893838561506e565b90506138a7565b6138a4848461506e565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613909575060018401548151613905916001600160401b031690615406565b8210155b1561392f576001600160401b03831660608201528181526040810151602082015261394e565b82816060018181516139419190615452565b6001600160401b03169052505b606081015161395e90606461573e565b602082015160018601546001600160401b0392909216916139899190600160401b900460ff1661543b565b10156139ed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610551565b856001600160401b031681604001818151613a089190615406565b9052506040810180516001600160401b0387169190613a28908390615658565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206159e98339815191526020526040812060020180545f805160206159a983398151915291600160401b9091046001600160401b0316906008613abe836157b4565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611a7491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614271565b5f61095e827f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00546001600160a01b0316906142d2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613c245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610551565b5f805160206159a983398151915242613c436040860160208701614e96565b6001600160401b031611613cb55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610551565b613cc56040850160208601614e96565b6001600160401b0316613cdb6202a30042615406565b11613d4e5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610551565b8335613da65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610551565b83355f90815260088201602052604090205415613dd55760405162461bcd60e51b81526004016105519061535e565b6030613de460408601866157cf565b905014613e495760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610551565b613e53835f613866565b5f80613eec6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e979190614e96565b6001600160401b03168152602001613eb260408a018a6157cf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614434565b5f82815260068601602052604090209193509150613f0a8282615855565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613f379085906004016150b0565b6020604051808303815f875af1158015613f53573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f7791906150e2565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613fef57613fef614ecf565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916140cf918e01908e01614e96565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661414657604051631afcd79f60e31b815260040160405180910390fd5b565b6141506140fd565b614159816147e3565b6141616147fc565b6141ba6060820135608083013561417e60c0850160a08601614e96565b61418e60e0860160c08701615914565b61ffff166141a3610100870160e0880161592d565b6141b5610120880161010089016151a3565b61480c565b50565b6141c56140fd565b7f6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab006001600160a01b0382166142515760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610551565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6142856001600160a01b03841683614a50565b905080515f141580156142a95750808060200190518101906142a7919061594d565b155b15611a7457604051635274afe760e01b81526001600160a01b0384166004820152602401610551565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614318573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061433c91906150e2565b90506143536001600160a01b038516333086614a5d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614397573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143bb91906150e2565b90508181116144215760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610551565b61442b8282615658565b95945050505050565b5f606082608001515160301461449e5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610551565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614515576144d5816001615658565b6144e090600861543b565b5081515f908390839081106144f7576144f7615203565b60200101906001600160f81b03191690815f1a9053506001016144c1565b505f5b600481101561457d5761452c816003615658565b61453790600861543b565b600160ff919091161c60f81b8261454f836002615406565b8151811061455f5761455f615203565b60200101906001600160f81b03191690815f1a905350600101614518565b505f5b60208110156145da578451816020811061459c5761459c615203565b1a60f81b826145ac836006615406565b815181106145bc576145bc615203565b60200101906001600160f81b03191690815f1a905350600101614580565b505f5b602081101561463a57846020015181602081106145fc576145fc615203565b1a60f81b8261460c836026615406565b8151811061461c5761461c615203565b60200101906001600160f81b03191690815f1a9053506001016145dd565b505f5b60088110156146ae57614651816007615658565b61465c90600861543b565b60ff1685604001516001600160401b0316901c60f81b828260466146809190615406565b8151811061469057614690615203565b60200101906001600160f81b03191690815f1a90535060010161463d565b505f5b603081101561471957846080015181815181106146d0576146d0615203565b01602001516001600160f81b031916826146eb83604e615406565b815181106146fb576146fb615203565b60200101906001600160f81b03191690815f1a9053506001016146b1565b505f5b600881101561478b57614730816007615658565b61473b90600861543b565b60608601516001600160401b0390811691161c60f81b8261475d83607e615406565b8151811061476d5761476d615203565b60200101906001600160f81b03191690815f1a90535060010161471c565b5060028160405161479c91906153f5565b602060405180830381855afa1580156147b7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906147da91906150e2565b94909350915050565b6147eb6140fd565b6147f3614a96565b6141ba81614a9e565b6148046140fd565b614146614c19565b6148146140fd565b5f80516020615969833981519152836148805760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610551565b6127108411156148a25760405162461bcd60e51b815260040161055190615769565b8587111561490a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610551565b5f8360ff16116149775760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610551565b600a60ff841611156149e95760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610551565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b606061229383835f614c21565b6040516001600160a01b0384811660248301528381166044830152606482018390526109489186918216906323b872dd90608401613b31565b6141466140fd565b614aa66140fd565b80355f805160206159a98339815191529081556014614acb606084016040850161592d565b60ff161115614b385760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610551565b5f614b49606084016040850161592d565b60ff1611614bb15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610551565b614bc1606083016040840161592d565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614bf26040830160208401614e96565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612e636140fd565b606081471015614c465760405163cd78605960e01b8152306004820152602401610551565b5f80856001600160a01b03168486604051614c6191906153f5565b5f6040518083038185875af1925050503d805f8114614c9b576040519150601f19603f3d011682016040523d82523d5f602084013e614ca0565b606091505b5091509150611f12868383606082614cc057614cbb82614d07565b612293565b8151158015614cd757506001600160a01b0384163b155b15614d0057604051639996b31560e01b81526001600160a01b0385166004820152602401610551565b5080612293565b805115614d175780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614d3c90615472565b5f825580601f10614d4b575050565b601f0160209004905f5260205f20908101906141ba91905b80821115614d76575f8155600101614d63565b5090565b80151581146141ba575f80fd5b803563ffffffff81168114614d9a575f80fd5b919050565b5f805f60608486031215614db1575f80fd5b833592506020840135614dc381614d7a565b9150614dd160408501614d87565b90509250925092565b5f60208284031215614dea575f80fd5b5035919050565b5f60208284031215614e01575f80fd5b61229382614d87565b5f8060408385031215614e1b575f80fd5b614e2483614d87565b946020939093013593505050565b5f8060408385031215614e43575f80fd5b82356001600160401b03811115614e58575f80fd5b830160808186031215614e69575f80fd5b9150614e7760208401614d87565b90509250929050565b80356001600160401b0381168114614d9a575f80fd5b5f60208284031215614ea6575f80fd5b61229382614e80565b5f8060408385031215614ec0575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614f0657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614f4160608401826001600160401b03169052565b506080830151614f5c60808401826001600160401b03169052565b5060a0830151614f7760a08401826001600160401b03169052565b5060c083015161280760c08401826001600160401b03169052565b803561ffff81168114614d9a575f80fd5b5f805f8060808587031215614fb6575f80fd5b84356001600160401b03811115614fcb575f80fd5b850160608188031215614fdc575f80fd5b9350614fea60208601614f92565b9250614ff860408601614e80565b9396929550929360600135925050565b6001600160a01b03811681146141ba575f80fd5b5f8082840361014081121561502f575f80fd5b6101208082121561503e575f80fd5b849350830135905061504f81615008565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156128075761280761505a565b5f5b838110156150a8578181015183820152602001615090565b50505f910152565b602081525f82518060208401526150ce81604085016020870161508e565b601f01601f19169190910160400192915050565b5f602082840312156150f2575f80fd5b5051919050565b5f8261511357634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156151b3575f80fd5b813561229381615008565b5f808335601e198436030181126151d3575f80fd5b8301803591506001600160401b038211156151ec575f80fd5b6020019150600581901b360382131561206c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261522b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561526b5761526b615235565b60405290565b604051601f8201601f191681016001600160401b038111828210171561529957615299615235565b604052919050565b5f6001600160401b038211156152b9576152b9615235565b50601f01601f191660200190565b5f606082360312156152d7575f80fd5b6152df615249565b8235815260206152f0818501614e80565b8183015260408401356001600160401b0381111561530c575f80fd5b840136601f82011261531c575f80fd5b803561532f61532a826152a1565b615271565b8181523684838501011115615342575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516153b7818460208a0161508e565b80830190508581526001600160401b0360c01b8560c01b16602082015283516153e781602884016020880161508e565b016028019695505050505050565b5f825161522b81846020870161508e565b8082018082111561095e5761095e61505a565b5f63ffffffff8083168181036154315761543161505a565b6001019392505050565b808202811582820484141761095e5761095e61505a565b6001600160401b038181168382160190808211156128075761280761505a565b600181811c9082168061548657607f821691505b6020821081036154a457634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461550381615472565b806020870152604060018084165f811461552457600181146155405761556d565b60ff19851660408a0152604084151560051b8a0101955061556d565b895f5260205f205f5b858110156155645781548b8201860152908301908801615549565b8a016040019650505b509398975050505050505050565b8051614d9a81614d7a565b5f8060408385031215615597575f80fd5b82516001600160401b03808211156155ad575f80fd5b90840190606082870312156155c0575f80fd5b6155c8615249565b825181526020808401516155db81615008565b828201526040840151838111156155f0575f80fd5b80850194505087601f850112615604575f80fd5b8351925061561461532a846152a1565b8381528882858701011115615627575f80fd5b6156368483830184880161508e565b8060408401525081955061564b81880161557b565b9450505050509250929050565b8181038181111561095e5761095e61505a565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146157615761576161505a565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036154315761543161505a565b5f808335601e198436030181126157e4575f80fd5b8301803591506001600160401b038211156157fd575f80fd5b60200191503681900382131561206c575f80fd5b601f821115611a7457805f5260205f20601f840160051c810160208510156158365750805b601f840160051c820191505b818110156112c7575f8155600101615842565b81516001600160401b0381111561586e5761586e615235565b6158828161587c8454615472565b84615811565b602080601f8311600181146158b5575f841561589e5750858301515b5f19600386901b1c1916600185901b17855561590c565b5f85815260208120601f198616915b828110156158e3578886015182559484019460019091019084016158c4565b508582101561590057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615924575f80fd5b61229382614f92565b5f6020828403121561593d575f80fd5b813560ff81168114612293575f80fd5b5f6020828403121561595d575f80fd5b815161229381614d7a56fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", -======= - 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160fc3803806160fc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615faf8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152c0565b6103ec565b005b61019e6101ae3660046152fb565b610890565b6101f16101c13660046152fb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152fb565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615326565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615364565b610b3e565b61019e61029936600461537d565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c93660046153a5565b610db3565b6101f16102dc366004615409565b6113e7565b6102316102ef3660046152fb565b611400565b61019e6103023660046152c0565b611414565b61020c603081565b61019e61031d3660046152fb565b611657565b61019e61033036600461537d565b61175d565b6101f1610343366004615422565b611a81565b61019e610356366004615364565b611aad565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152fb565b611c65565b61019e6103a23660046152fb565b611eeb565b61020c601481565b6103c26103bd3660046152fb565b611fff565b6040516101fb9190615456565b6102316202a30081565b6101f16103e736600461551d565b6120c7565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f0383398151915293929190829060ff16600481111561044d5761044d615442565b600481111561045e5761045e615442565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fff565b90506002835160048111156104f9576104f9615442565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f238339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f238339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615442565b036106235786156105e4576105e183876120fc565b90505b5f846060015183608001516105f99190615596565b90506106058482612398565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b91906155b6565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615442565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f838339815191526020526040808220815160e0810190925280545f80516020615f4383398151915293929190829060ff1660058111156108dd576108dd615442565b60058111156108ee576108ee615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615442565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124ef565b6040518263ffffffff1660e01b8152600401610a0391906155ef565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4391906155b6565b50505050565b5f610a5964e8d4a5100083615621565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af18484612716565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615f038339815191525f80610b5784612730565b91509150610b6482612a7a565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615442565b03610bc1575f83815260088501602052604081208054919055610bbf8282612ab5565b505b610bd781610bd284604001516113e7565b612b2b565b5050505050565b5f80516020615f038339815191525f610bf684612b4e565b90505f80610c078360400151612d28565b50915091505f610c1683611fff565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b815260040161054290615640565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615682565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615442565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f438339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb791906155b6565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156cb565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156e6565b91505f9050843560208601356014610fc86060890160408a016156cb565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156e6565b8363ffffffff1681811061105e5761105e61572b565b9050602002810190611070919061573f565b611079906157ef565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b815260040161054290615886565b84825f0151836020015184604001516040516020016110ce94939291906158ce565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c919061591d565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a91906155b6565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615442565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129991168661592e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615941565b905061102c565b50600584018190555f61130986612b4e565b90505f6113198260400151612f63565b90508060028560405161132c919061591d565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a91906155b6565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615963565b5f61140a82611fff565b6080015192915050565b5f80516020615f038339815191525f61142c856130d5565b905061143785612a7a565b611442575050505050565b5f8581526005830160205260409020546001600160a01b031633146114795760405162461bcd60e51b81526004016105429061597a565b5f85815260058301602052604090205460a08201516114a891600160b01b90046001600160401b0316906159cc565b6001600160401b03168160c001516001600160401b031610156115295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153a86856120fc565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611591906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611607573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162b91906155b6565b5f8781526008850160205260408120805490919061164a90849061592e565b9091555050505050505050565b5f80516020615f038339815191525f61166f83611fff565b905060048151600581111561168657611686615442565b146116f05760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117275760405162461bcd60e51b81526004016105429061597a565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612ab5565b611765613350565b5f80516020615f038339815191525f61177d84612b4e565b90505f8061178e8360400151612d28565b50915091505f61179d83611fff565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d7576117d7615442565b60048111156117e8576117e8615442565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118cc5760405162461bcd60e51b815260040161054290615640565b826001600160401b03168160e001516001600160401b031611156119025760405162461bcd60e51b815260040161054290615682565b60038151600481111561191757611917615442565b1461196b5760405162461bcd60e51b815260206004820152603160248201525f80516020615f238339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119ac90600160a01b900461ffff1684615963565b6119b69190615621565b905080886008015f8881526020019081526020015f205f8282546119da919061592e565b909155505f90506119eb82846159ec565b90506119fb846020015182612ab5565b611a108460200151610bd286606001516113e7565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611a56929190918252602082015260400190565b60405180910390a4505050505050505050611a7d60015f80516020615f6383398151915255565b5050565b5f611a8a613350565b611a9583338461339a565b9050610a5960015f80516020615f6383398151915255565b5f80516020615f438339815191525f611ac583612b4e565b90505f80611ad68360400151613754565b9150915080611b385760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b52906159ff565b9050118015611b84575060015f83815260088601602052604090205460ff166005811115611b8257611b82615442565b145b611ba05760405162461bcd60e51b815260040161054290615a37565b5f8281526007850160205260408120611bb891615210565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f0383398151915293929190829060ff166004811115611cc657611cc6615442565b6004811115611cd757611cd7615442565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5e57611d5e615442565b1480611d7c5750600381516004811115611d7a57611d7a615442565b145b611dd05760405162461bcd60e51b815260206004820152603260248201525f80516020615f23833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dde8260400151611fff565b905080606001516001600160401b03165f03611e625760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e8f8460400151846060015185608001516124ef565b6040518263ffffffff1660e01b8152600401611eab91906155ef565b6020604051808303815f875af1158015611ec7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd791906155b6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f43833981519152929190611f33906159ff565b9050118015611f65575060015f83815260088301602052604090205460ff166005811115611f6357611f63615442565b145b611f815760405162461bcd60e51b815260040161054290615a37565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fba9190600401615a7e565b6020604051808303815f875af1158015611fd6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffa91906155b6565b505050565b612007615247565b5f8281525f80516020615f83833981519152602052604090819020815160e0810190925280545f80516020615f43833981519152929190829060ff16600581111561205457612054615442565b600581111561206557612065615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120d0613350565b6120dc858585856138f5565b90506120f460015f80516020615f6383398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612147573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261216e9190810190615b13565b91509150806121d15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612214573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223891906155b6565b82511461229c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156123125760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123218460400151613b6a565b9150915081871461238e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f83833981519152602052604081206002015481905f80516020615f4383398151915290600160801b90046001600160401b03166123e08582613d42565b5f6123ea87613f50565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61243a8a858b6124ef565b6040518263ffffffff1660e01b815260040161245691906155ef565b6020604051808303815f875af1158015612472573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249691906155b6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612568576125288160016159ec565b612533906008615963565b5081515f9083908390811061254a5761254a61572b565b60200101906001600160f81b03191690815f1a905350600101612514565b505f5b60048110156125d35761257f8160036159ec565b61258a906008615963565b600263ffffffff16901c60f81b828260026125a5919061592e565b815181106125b5576125b561572b565b60200101906001600160f81b03191690815f1a90535060010161256b565b505f5b6020811015612635576125ea81601f6159ec565b6125f5906008615963565b86901c60f81b8261260783600661592e565b815181106126175761261761572b565b60200101906001600160f81b03191690815f1a9053506001016125d6565b505f5b60088110156126a05761264c8160076159ec565b612657906008615963565b6001600160401b038616901c60f81b8261267283602661592e565b815181106126825761268261572b565b60200101906001600160f81b03191690815f1a905350600101612638565b505f5b600881101561270b576126b78160076159ec565b6126c2906008615963565b6001600160401b038516901c60f81b826126dd83602e61592e565b815181106126ed576126ed61572b565b60200101906001600160f81b03191690815f1a9053506001016126a3565b5090505b9392505050565b61271e613fe0565b6127278261402b565b611a7d816140a2565b5f612739615247565b5f80516020615f438339815191525f61275185612b4e565b90505f806127628360400151613754565b9150915080156127c75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f8576127f8615442565b600581111561280957612809615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561287a5761287a615442565b1480612898575060018251600581111561289657612896615442565b145b6128f75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b60038251600581111561290c5761290c615442565b036129195750600461291d565b5060055b6020808301515f9081526009880190915260408120558181600581111561294657612946615442565b9081600581111561295957612959615442565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561298d5761298d615442565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a4157612a41615442565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ee383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b10575f80fd5b505af1158015612b22573d5f803e3d5ffd5b50505050505050565b5f80516020615ee383398151915254611a7d906001600160a01b03168383614143565b60408051606080820183525f8083526020830181905292820152905f80516020615f438339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bc3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bea9190810190615b13565b9150915080612c4a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612cad5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612d205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d4c5760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015612d9b57612d638160016159ec565b612d6e906008615963565b61ffff16868281518110612d8457612d8461572b565b016020015160f81c901b9190911790600101612d4f565b5061ffff811615612dbe5760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015612e1957612dd58160036159ec565b612de0906008615963565b63ffffffff1687612df283600261592e565b81518110612e0257612e0261572b565b016020015160f81c901b9190911790600101612dc1565b5063ffffffff8116600414612e405760405162461bcd60e51b815260040161054290615c71565b5f805b6020811015612e9557612e5781601f6159ec565b612e62906008615963565b88612e6e83600661592e565b81518110612e7e57612e7e61572b565b016020015160f81c901b9190911790600101612e43565b505f805b6008811015612ef457612ead8160076159ec565b612eb8906008615963565b6001600160401b031689612ecd83602661592e565b81518110612edd57612edd61572b565b016020015160f81c901b9190911790600101612e99565b505f805b6008811015612f5357612f0c8160076159ec565b612f17906008615963565b6001600160401b03168a612f2c83602e61592e565b81518110612f3c57612f3c61572b565b016020015160f81c901b9190911790600101612ef8565b5091989097509095509350505050565b5f8151602614612f855760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015612fd457612f9c8160016159ec565b612fa7906008615963565b61ffff16848281518110612fbd57612fbd61572b565b016020015160f81c901b9190911790600101612f88565b5061ffff811615612ff75760405162461bcd60e51b815260040161054290615c2e565b5f805b60048110156130525761300e8160036159ec565b613019906008615963565b63ffffffff168561302b83600261592e565b8151811061303b5761303b61572b565b016020015160f81c901b9190911790600101612ffa565b5063ffffffff8116156130775760405162461bcd60e51b815260040161054290615c71565b5f805b60208110156130cc5761308e81601f6159ec565b613099906008615963565b866130a583600661592e565b815181106130b5576130b561572b565b016020015160f81c901b919091179060010161307a565b50949350505050565b6130dd615247565b5f8281525f80516020615f838339815191526020526040808220815160e0810190925280545f80516020615f4383398151915293929190829060ff16600581111561312a5761312a615442565b600581111561313b5761313b615442565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131ad576131ad615442565b146132095760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561324d5761324d615442565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132f98582612398565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f6383398151915280546001190161338157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f6383398151915255565b5f5f80516020615f03833981519152816133b661022c856141a2565b90505f6133c287611fff565b90506133cd87612a7a565b61342a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561343f5761343f615442565b1461349e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f8282608001516134af91906159cc565b600485015460408401519192506134d1916001600160401b0390911690615cb8565b6001600160401b0316816001600160401b031611156135505760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f8061355c8a84612398565b915091505f8a8360405160200161358a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561362557613625615442565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137775760405162461bcd60e51b815260040161054290615be5565b5f805b60028110156137c65761378e8160016159ec565b613799906008615963565b61ffff168582815181106137af576137af61572b565b016020015160f81c901b919091179060010161377a565b5061ffff8116156137e95760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015613844576138008160036159ec565b61380b906008615963565b63ffffffff168661381d83600261592e565b8151811061382d5761382d61572b565b016020015160f81c901b91909117906001016137ec565b5063ffffffff811660031461386b5760405162461bcd60e51b815260040161054290615c71565b5f805b60208110156138c05761388281601f6159ec565b61388d906008615963565b8761389983600661592e565b815181106138a9576138a961572b565b016020015160f81c901b919091179060010161386e565b505f866026815181106138d5576138d561572b565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615f038339815191529061ffff861610801590613941575061271061ffff861611155b61395d5760405162461bcd60e51b815260040161054290615ce3565b60028101546001600160401b0390811690851610156139d65760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a395760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613aa05760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613aaa846141a2565b90505f613ab682610a49565b90505f613ac389836141c5565b90506040518060600160405280613ad73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b8d5760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015613bdc57613ba48160016159ec565b613baf906008615963565b61ffff16858281518110613bc557613bc561572b565b016020015160f81c901b9190911790600101613b90565b5061ffff811615613bff5760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015613c5a57613c168160036159ec565b613c21906008615963565b63ffffffff1686613c3383600261592e565b81518110613c4357613c4361572b565b016020015160f81c901b9190911790600101613c02565b5063ffffffff8116600514613c815760405162461bcd60e51b815260040161054290615c71565b5f805b6020811015613cd657613c9881601f6159ec565b613ca3906008615963565b87613caf83600661592e565b81518110613cbf57613cbf61572b565b016020015160f81c901b9190911790600101613c84565b505f805b6008811015613d3557613cee8160076159ec565b613cf9906008615963565b6001600160401b031688613d0e83602661592e565b81518110613d1e57613d1e61572b565b016020015160f81c901b9190911790600101613cda565b5090969095509350505050565b5f80516020615f438339815191525f6001600160401b038084169085161115613d7657613d6f8385615596565b9050613d83565b613d808484615596565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613de5575060028401548151613de1916001600160401b03169061592e565b8210155b15613e0b576001600160401b038316606082015281815260408101516020820152613e2a565b8281606001818151613e1d91906159cc565b6001600160401b03169052505b6060810151613e3a906064615cb8565b602082015160028601546001600160401b039290921691613e659190600160401b900460ff16615963565b1015613ec95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ee4919061592e565b9052506040810180516001600160401b0387169190613f049083906159ec565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f838339815191526020526040812060020180545f80516020615f4383398151915291600160401b9091046001600160401b0316906008613f9a83615d2e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402957604051631afcd79f60e31b815260040160405180910390fd5b565b614033613fe0565b61403c8161472a565b614044614743565b61409f608082013560a083013561406160e0850160c08601615409565b614072610100860160e08701615d49565b61ffff1661408861012087016101008801615d62565b61409a610140880161012089016156cb565b614753565b50565b6140aa613fe0565b5f80516020615ee38339815191526001600160a01b0382166141235760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ffa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614997565b5f610a59825f80516020615ee3833981519152546001600160a01b0316906149f8565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f438339815191524261426f6040860160208701615409565b6001600160401b0316116142e15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142f16040850160208601615409565b6001600160401b03166143076202a3004261592e565b1161437a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143d25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156144015760405162461bcd60e51b815260040161054290615886565b60306144106040860186615d82565b9050146144755760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b61447f835f613d42565b5f806145196040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144c49190615409565b6001600160401b031681526020016144df60408a018a615d82565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b5a565b5f828152600786016020526040902091935091506145378282615e08565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145649085906004016155ef565b6020604051808303815f875af1158015614580573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a491906155b6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561461c5761461c615442565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146fc918e01908e01615409565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614732613fe0565b61473a614f09565b61409f81614f11565b61474b613fe0565b6140296150b3565b61475b613fe0565b5f80516020615f03833981519152836147c75760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147e95760405162461bcd60e51b815260040161054290615ce3565b858711156148515760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff16116148be5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff841611156149305760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149ab6001600160a01b038416836150bb565b905080515f141580156149cf5750808060200190518101906149cd9190615ec7565b155b15611ffa57604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a6291906155b6565b9050614a796001600160a01b0385163330866150c8565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614abd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ae191906155b6565b9050818111614b475760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b5182826159ec565b95945050505050565b5f6060826080015151603014614bc45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3b57614bfb8160016159ec565b614c06906008615963565b5081515f90839083908110614c1d57614c1d61572b565b60200101906001600160f81b03191690815f1a905350600101614be7565b505f5b6004811015614ca357614c528160036159ec565b614c5d906008615963565b600160ff919091161c60f81b82614c7583600261592e565b81518110614c8557614c8561572b565b60200101906001600160f81b03191690815f1a905350600101614c3e565b505f5b6020811015614d005784518160208110614cc257614cc261572b565b1a60f81b82614cd283600661592e565b81518110614ce257614ce261572b565b60200101906001600160f81b03191690815f1a905350600101614ca6565b505f5b6020811015614d605784602001518160208110614d2257614d2261572b565b1a60f81b82614d3283602661592e565b81518110614d4257614d4261572b565b60200101906001600160f81b03191690815f1a905350600101614d03565b505f5b6008811015614dd457614d778160076159ec565b614d82906008615963565b60ff1685604001516001600160401b0316901c60f81b82826046614da6919061592e565b81518110614db657614db661572b565b60200101906001600160f81b03191690815f1a905350600101614d63565b505f5b6030811015614e3f5784608001518181518110614df657614df661572b565b01602001516001600160f81b03191682614e1183604e61592e565b81518110614e2157614e2161572b565b60200101906001600160f81b03191690815f1a905350600101614dd7565b505f5b6008811015614eb157614e568160076159ec565b614e61906008615963565b60608601516001600160401b0390811691161c60f81b82614e8383607e61592e565b81518110614e9357614e9361572b565b60200101906001600160f81b03191690815f1a905350600101614e42565b50600281604051614ec2919061591d565b602060405180830381855afa158015614edd573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f0091906155b6565b94909350915050565b614029613fe0565b614f19613fe0565b80355f80516020615f4383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f656080840160608501615d62565b60ff161115614fd25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fe36080840160608501615d62565b60ff161161504b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b61505b6080830160608401615d62565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561508c6060830160408401615409565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613387613fe0565b606061270f83835f615101565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd90608401614170565b6060814710156151265760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b03168486604051615141919061591d565b5f6040518083038185875af1925050503d805f811461517b576040519150601f19603f3d011682016040523d82523d5f602084013e615180565b606091505b509150915061238e8683836060826151a05761519b826151e7565b61270f565b81511580156151b757506001600160a01b0384163b155b156151e057604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b508061270f565b8051156151f75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461521c906159ff565b5f825580601f1061522b575050565b601f0160209004905f5260205f209081019061409f9190615283565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615297575f8155600101615284565b5090565b801515811461409f575f80fd5b803563ffffffff811681146152bb575f80fd5b919050565b5f805f606084860312156152d2575f80fd5b8335925060208401356152e48161529b565b91506152f2604085016152a8565b90509250925092565b5f6020828403121561530b575f80fd5b5035919050565b6001600160a01b038116811461409f575f80fd5b5f80828403610160811215615339575f80fd5b61014080821215615348575f80fd5b849350830135905061535981615312565b809150509250929050565b5f60208284031215615374575f80fd5b61270f826152a8565b5f806040838503121561538e575f80fd5b615397836152a8565b946020939093013593505050565b5f80604083850312156153b6575f80fd5b82356001600160401b038111156153cb575f80fd5b8301608081860312156153dc575f80fd5b91506153ea602084016152a8565b90509250929050565b80356001600160401b03811681146152bb575f80fd5b5f60208284031215615419575f80fd5b61270f826153f3565b5f8060408385031215615433575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154b460608401826001600160401b03169052565b5060808301516154cf60808401826001600160401b03169052565b5060a08301516154ea60a08401826001600160401b03169052565b5060c083015161550560c08401826001600160401b03169052565b5092915050565b803561ffff811681146152bb575f80fd5b5f805f8060808587031215615530575f80fd5b84356001600160401b03811115615545575f80fd5b850160608188031215615556575f80fd5b93506155646020860161550c565b9250615572604086016153f3565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561550557615505615582565b5f602082840312156155c6575f80fd5b5051919050565b5f5b838110156155e75781810151838201526020016155cf565b50505f910152565b602081525f825180602084015261560d8160408501602087016155cd565b601f01601f19169190910160400192915050565b5f8261563b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156db575f80fd5b813561270f81615312565b5f808335601e198436030181126156fb575f80fd5b8301803591506001600160401b03821115615714575f80fd5b6020019150600581901b36038213156124e8575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615753575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157935761579361575d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157c1576157c161575d565b604052919050565b5f6001600160401b038211156157e1576157e161575d565b50601f01601f191660200190565b5f606082360312156157ff575f80fd5b615807615771565b8235815260206158188185016153f3565b8183015260408401356001600160401b03811115615834575f80fd5b840136601f820112615844575f80fd5b8035615857615852826157c9565b615799565b818152368483850101111561586a575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158df818460208a016155cd565b80830190508581526001600160401b0360c01b8560c01b166020820152835161590f8160288401602088016155cd565b016028019695505050505050565b5f82516157538184602087016155cd565b80820180821115610a5957610a59615582565b5f63ffffffff80831681810361595957615959615582565b6001019392505050565b8082028115828204841417610a5957610a59615582565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561550557615505615582565b81810381811115610a5957610a59615582565b600181811c90821680615a1357607f821691505b602082108103615a3157634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a90816159ff565b806020870152604060018084165f8114615ab15760018114615acd57615afa565b60ff19851660408a0152604084151560051b8a01019550615afa565b895f5260205f205f5b85811015615af15781548b8201860152908301908801615ad6565b8a016040019650505b509398975050505050505050565b80516152bb8161529b565b5f8060408385031215615b24575f80fd5b82516001600160401b0380821115615b3a575f80fd5b9084019060608287031215615b4d575f80fd5b615b55615771565b82518152602080840151615b6881615312565b82820152604084015183811115615b7d575f80fd5b80850194505087601f850112615b91575f80fd5b83519250615ba1615852846157c9565b8381528882858701011115615bb4575f80fd5b615bc3848383018488016155cd565b80604084015250819550615bd8818801615b08565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cdb57615cdb615582565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361595957615959615582565b5f60208284031215615d59575f80fd5b61270f8261550c565b5f60208284031215615d72575f80fd5b813560ff8116811461270f575f80fd5b5f808335601e19843603018112615d97575f80fd5b8301803591506001600160401b03821115615db0575f80fd5b6020019150368190038213156124e8575f80fd5b601f821115611ffa57805f5260205f20601f840160051c81016020851015615de95750805b601f840160051c820191505b81811015610bd7575f8155600101615df5565b81516001600160401b03811115615e2157615e2161575d565b615e3581615e2f84546159ff565b84615dc4565b602080601f831160018114615e68575f8415615e515750858301515b5f19600386901b1c1916600185901b178555615ebf565b5f85815260208120601f198616915b82811015615e9657888601518255948401946001909101908401615e77565b5085821015615eb357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ed7575f80fd5b815161270f8161529b56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", ->>>>>>> origin/staking-contract + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516160d83803806160d883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f8b8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c806376f78621116100f3578063ba3a4b9711610093578063d5f20ff61161006e578063d5f20ff6146103bd578063df93d8de146103dd578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063ba3a4b971461038f578063bee0a03f146103a2578063c974d1b6146103b5575f80fd5b806398f3e2b4116100ce57806398f3e2b4146103305780639e1bc4ef14610343578063a3a65e4814610356578063b771b3bc14610369575f80fd5b806376f78621146103025780638280a25a1461031557806393e245981461031d575f80fd5b8063467ef06f1161015e57806361e2f4901161013957806361e2f490146102c257806362065856146102d557806366435abf146102e8578063732214f8146102fb575f80fd5b8063467ef06f1461027f5780635297fae61461029257806360305d62146102a5575f80fd5b80630118acc4146101a55780630322ed98146101ba5780630cdd0985146101cd578063151d30d11461021e5780632e2194d81461023857806335455ded14610263575b5f80fd5b6101b86101b33660046152a3565b61040d565b005b6101b86101c83660046152de565b6108b1565b61020b6101db3660046152de565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610226600a81565b60405160ff9091168152602001610215565b61024b6102463660046152de565b610a6a565b6040516001600160401b039091168152602001610215565b61026c61271081565b60405161ffff9091168152602001610215565b6101b861028d3660046152f5565b610a80565b6101b86102a036600461530e565b610b20565b6102ad601481565b60405163ffffffff9091168152602001610215565b6101b86102d0366004615336565b610cf5565b61020b6102e336600461539a565b611329565b61024b6102f63660046152de565b611342565b61020b5f81565b6101b86103103660046152a3565b611356565b610226603081565b6101b861032b3660046152de565b611599565b6101b861033e36600461530e565b61169f565b61020b6103513660046153b3565b6119c3565b6101b86103643660046152f5565b6119ef565b6103776005600160991b0181565b6040516001600160a01b039091168152602001610215565b6101b861039d3660046152de565b611ba7565b6101b86103b03660046152de565b611e2d565b610226601481565b6103d06103cb3660046152de565b611f41565b60405161021591906153e7565b61024b6202a30081565b61020b6103f53660046154a7565b612009565b6101b8610408366004615520565b61203e565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615edf83398151915293929190829060ff16600481111561046e5761046e6153d3565b600481111561047f5761047f6153d3565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61050382611f41565b905060028351600481111561051a5761051a6153d3565b1461056c5760405162461bcd60e51b815260206004820152602a60248201525f80516020615eff8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105d15760405162461bcd60e51b815260206004820152603360248201525f80516020615eff8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610563565b6003835280515f9060029060058111156105ed576105ed6153d3565b0361064457861561060557610602838761211d565b90505b5f8460600151836080015161061a9190615572565b905061062684826123b9565b506001600160401b0390811660e0870152421660a086015250610678565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106ab8660600151611329565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610728573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074c9190615592565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561078b5761078b6153d3565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161089f916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f5f8339815191526020526040808220815160e0810190925280545f80516020615f1f83398151915293929190829060ff1660058111156108fe576108fe6153d3565b600581111561090f5761090f6153d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561097e5761097e6153d3565b146109e35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610563565b6005600160991b016001600160a01b031663ee5b48eb610a088584606001515f612510565b6040518263ffffffff1660e01b8152600401610a2491906155cb565b6020604051808303815f875af1158015610a40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a649190615592565b50505050565b5f610a7a64e8d4a51000836155fd565b92915050565b5f80516020615edf8339815191525f80610a9984612737565b91509150610aa682612a81565b610ab05750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ade57610ade6153d3565b03610b03575f83815260088501602052604081208054919055610b018282612abc565b505b610b1981610b148460400151611329565b612b32565b5050505050565b5f80516020615edf8339815191525f610b3884612b55565b90505f80610b498360400151612d1b565b50915091505f610b5883611f41565b9050816001600160401b031681606001516001600160401b03161015610b905760405162461bcd60e51b81526004016105639061561c565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bd55760405162461bcd60e51b81526004016105639061565e565b60015f87815260068701602052604090205460ff166004811115610bfb57610bfb6153d3565b14610c645760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610563565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615f1f8339815191529060ff1615610d925760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610563565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df99190615592565b836020013514610e5b5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610563565b30610e6c60608501604086016156a7565b6001600160a01b031614610ede5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610563565b5f610eec60608501856156c2565b91505f9050843560208601356014610f0a6060890160408a016156a7565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611239575f610f8a60608901896156c2565b8363ffffffff16818110610fa057610fa0615707565b9050602002810190610fb2919061571b565b610fbb906157cb565b80515f8181526008890160205260409020549192509015610fee5760405162461bcd60e51b815260040161056390615862565b84825f01518360200151846040015160405160200161101094939291906158aa565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161105e91906158f9565b602060405180830381855afa158015611079573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061109c9190615592565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff19166001836005811115611128576111286153d3565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111db91168661590a565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112329061591d565b9050610f6e565b50600484018190555f61124b86612b55565b90505f61125b8260400151612f56565b90508060028560405161126e91906158f9565b602060405180830381855afa158015611289573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112ac9190615592565b146113105760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610563565b5050506009909201805460ff1916600117905550505050565b5f610a7a6001600160401b03831664e8d4a5100061593f565b5f61134c82611f41565b6080015192915050565b5f80516020615edf8339815191525f61136e856130c8565b905061137985612a81565b611384575050505050565b5f8581526005830160205260409020546001600160a01b031633146113bb5760405162461bcd60e51b815260040161056390615956565b5f85815260058301602052604090205460a08201516113ea91600160b01b90046001600160401b0316906159a8565b6001600160401b03168160c001516001600160401b0316101561146b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610563565b8315610b19575f61147c868561211d565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906114d390611329565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156d9190615592565b5f8781526008850160205260408120805490919061158c90849061590a565b9091555050505050505050565b5f80516020615edf8339815191525f6115b183611f41565b90506004815160058111156115c8576115c86153d3565b146116325760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610563565b5f8381526005830160205260409020546001600160a01b031633146116695760405162461bcd60e51b815260040161056390615956565b5f83815260088301602090815260408083208054908490556005860190925290912054610a64906001600160a01b031682612abc565b6116a7613343565b5f80516020615edf8339815191525f6116bf84612b55565b90505f806116d08360400151612d1b565b50915091505f6116df83611f41565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611719576117196153d3565b600481111561172a5761172a6153d3565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff19169055908401519192508481169116101561180e5760405162461bcd60e51b81526004016105639061561c565b826001600160401b03168160e001516001600160401b031611156118445760405162461bcd60e51b81526004016105639061565e565b600381516004811115611859576118596153d3565b146118ad5760405162461bcd60e51b815260206004820152603160248201525f80516020615eff8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610563565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906118ee90600160a01b900461ffff168461593f565b6118f891906155fd565b905080886008015f8881526020019081526020015f205f82825461191c919061590a565b909155505f905061192d82846159c8565b905061193d846020015182612abc565b6119528460200151610b148660600151611329565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611998929190918252602082015260400190565b60405180910390a45050505050505050506119bf60015f80516020615f3f83398151915255565b5050565b5f6119cc613343565b6119d783338461338d565b9050610a7a60015f80516020615f3f83398151915255565b5f80516020615f1f8339815191525f611a0783612b55565b90505f80611a188360400151613747565b9150915080611a7a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610563565b5f82815260068501602052604081208054611a94906159db565b9050118015611ac6575060015f83815260078601602052604090205460ff166005811115611ac457611ac46153d3565b145b611ae25760405162461bcd60e51b815260040161056390615a13565b5f8281526006850160205260408120611afa916151f3565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615edf83398151915293929190829060ff166004811115611c0857611c086153d3565b6004811115611c1957611c196153d3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ca057611ca06153d3565b1480611cbe5750600381516004811115611cbc57611cbc6153d3565b145b611d125760405162461bcd60e51b815260206004820152603260248201525f80516020615eff833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610563565b5f611d208260400151611f41565b905080606001516001600160401b03165f03611da45760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610563565b6005600160991b016001600160a01b031663ee5b48eb611dd1846040015184606001518560800151612510565b6040518263ffffffff1660e01b8152600401611ded91906155cb565b6020604051808303815f875af1158015611e09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b199190615592565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020615f1f833981519152929190611e75906159db565b9050118015611ea7575060015f83815260078301602052604090205460ff166005811115611ea557611ea56153d3565b145b611ec35760405162461bcd60e51b815260040161056390615a13565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611efc9190600401615a5a565b6020604051808303815f875af1158015611f18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f3c9190615592565b505050565b611f4961522a565b5f8281525f80516020615f5f833981519152602052604090819020815160e0810190925280545f80516020615f1f833981519152929190829060ff166005811115611f9657611f966153d3565b6005811115611fa757611fa76153d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f612012613343565b61201e858585856138e8565b905061203660015f80516020615f3f83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680612087575080546001600160401b03808416911610155b156120a55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556120d08484613b5d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612168573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261218f9190810190615aef565b91509150806121f25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610563565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612235573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122599190615592565b8251146122bd5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610563565b60208201516001600160a01b0316156123335760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610563565b5f806123428460400151613b77565b915091508187146123af5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610563565b9695505050505050565b5f8281525f80516020615f5f833981519152602052604081206002015481905f80516020615f1f83398151915290600160801b90046001600160401b03166124018582613d4f565b5f61240b87613f5d565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61245b8a858b612510565b6040518263ffffffff1660e01b815260040161247791906155cb565b6020604051808303815f875af1158015612493573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b79190615592565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612589576125498160016159c8565b61255490600861593f565b5081515f9083908390811061256b5761256b615707565b60200101906001600160f81b03191690815f1a905350600101612535565b505f5b60048110156125f4576125a08160036159c8565b6125ab90600861593f565b600263ffffffff16901c60f81b828260026125c6919061590a565b815181106125d6576125d6615707565b60200101906001600160f81b03191690815f1a90535060010161258c565b505f5b60208110156126565761260b81601f6159c8565b61261690600861593f565b86901c60f81b8261262883600661590a565b8151811061263857612638615707565b60200101906001600160f81b03191690815f1a9053506001016125f7565b505f5b60088110156126c15761266d8160076159c8565b61267890600861593f565b6001600160401b038616901c60f81b8261269383602661590a565b815181106126a3576126a3615707565b60200101906001600160f81b03191690815f1a905350600101612659565b505f5b600881101561272c576126d88160076159c8565b6126e390600861593f565b6001600160401b038516901c60f81b826126fe83602e61590a565b8151811061270e5761270e615707565b60200101906001600160f81b03191690815f1a9053506001016126c4565b5090505b9392505050565b5f61274061522a565b5f80516020615f1f8339815191525f61275885612b55565b90505f806127698360400151613747565b9150915080156127ce5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610563565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156127ff576127ff6153d3565b6005811115612810576128106153d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612881576128816153d3565b148061289f575060018251600581111561289d5761289d6153d3565b145b6128fe5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610563565b600382516005811115612913576129136153d3565b0361292057506004612924565b5060055b6020808301515f9081526008880190915260408120558181600581111561294d5761294d6153d3565b90816005811115612960576129606153d3565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115612994576129946153d3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a4857612a486153d3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ebf83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b17575f80fd5b505af1158015612b29573d5f803e3d5ffd5b50505050505050565b5f80516020615ebf833981519152546119bf906001600160a01b03168383613fed565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bb9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612be09190810190615aef565b9150915080612c405760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610563565b815115612ca15760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610563565b60208201516001600160a01b031615612d145760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610563565b5092915050565b5f805f8351603614612d3f5760405162461bcd60e51b815260040161056390615bc1565b5f805b6002811015612d8e57612d568160016159c8565b612d6190600861593f565b61ffff16868281518110612d7757612d77615707565b016020015160f81c901b9190911790600101612d42565b5061ffff811615612db15760405162461bcd60e51b815260040161056390615c0a565b5f805b6004811015612e0c57612dc88160036159c8565b612dd390600861593f565b63ffffffff1687612de583600261590a565b81518110612df557612df5615707565b016020015160f81c901b9190911790600101612db4565b5063ffffffff8116600414612e335760405162461bcd60e51b815260040161056390615c4d565b5f805b6020811015612e8857612e4a81601f6159c8565b612e5590600861593f565b88612e6183600661590a565b81518110612e7157612e71615707565b016020015160f81c901b9190911790600101612e36565b505f805b6008811015612ee757612ea08160076159c8565b612eab90600861593f565b6001600160401b031689612ec083602661590a565b81518110612ed057612ed0615707565b016020015160f81c901b9190911790600101612e8c565b505f805b6008811015612f4657612eff8160076159c8565b612f0a90600861593f565b6001600160401b03168a612f1f83602e61590a565b81518110612f2f57612f2f615707565b016020015160f81c901b9190911790600101612eeb565b5091989097509095509350505050565b5f8151602614612f785760405162461bcd60e51b815260040161056390615bc1565b5f805b6002811015612fc757612f8f8160016159c8565b612f9a90600861593f565b61ffff16848281518110612fb057612fb0615707565b016020015160f81c901b9190911790600101612f7b565b5061ffff811615612fea5760405162461bcd60e51b815260040161056390615c0a565b5f805b6004811015613045576130018160036159c8565b61300c90600861593f565b63ffffffff168561301e83600261590a565b8151811061302e5761302e615707565b016020015160f81c901b9190911790600101612fed565b5063ffffffff81161561306a5760405162461bcd60e51b815260040161056390615c4d565b5f805b60208110156130bf5761308181601f6159c8565b61308c90600861593f565b8661309883600661590a565b815181106130a8576130a8615707565b016020015160f81c901b919091179060010161306d565b50949350505050565b6130d061522a565b5f8281525f80516020615f5f8339815191526020526040808220815160e0810190925280545f80516020615f1f83398151915293929190829060ff16600581111561311d5761311d6153d3565b600581111561312e5761312e6153d3565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131a0576131a06153d3565b146131fc5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610563565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613240576132406153d3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132ec85826123b9565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f3f83398151915280546001190161337457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f3f83398151915255565b5f5f80516020615edf833981519152816133a96102468561404c565b90505f6133b587611f41565b90506133c087612a81565b61341d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610563565b600281516005811115613432576134326153d3565b146134915760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610563565b5f8282608001516134a291906159a8565b600485015460408401519192506134c4916001600160401b0390911690615c94565b6001600160401b0316816001600160401b031611156135435760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610563565b5f8061354f8a846123b9565b915091505f8a8360405160200161357d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613618576136186153d3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461376a5760405162461bcd60e51b815260040161056390615bc1565b5f805b60028110156137b9576137818160016159c8565b61378c90600861593f565b61ffff168582815181106137a2576137a2615707565b016020015160f81c901b919091179060010161376d565b5061ffff8116156137dc5760405162461bcd60e51b815260040161056390615c0a565b5f805b6004811015613837576137f38160036159c8565b6137fe90600861593f565b63ffffffff168661381083600261590a565b8151811061382057613820615707565b016020015160f81c901b91909117906001016137df565b5063ffffffff811660031461385e5760405162461bcd60e51b815260040161056390615c4d565b5f805b60208110156138b35761387581601f6159c8565b61388090600861593f565b8761388c83600661590a565b8151811061389c5761389c615707565b016020015160f81c901b9190911790600101613861565b505f866026815181106138c8576138c8615707565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615edf8339815191529061ffff861610801590613934575061271061ffff861611155b6139505760405162461bcd60e51b815260040161056390615cbf565b60028101546001600160401b0390811690851610156139c95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610563565b8054831015613a2c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610563565b8060010154831115613a935760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610563565b5f613a9d8461404c565b90505f613aa982610a6a565b90505f613ab6898361406f565b90506040518060600160405280613aca3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613b656145d3565b613b6e8261461e565b6119bf81614693565b5f808251602e14613b9a5760405162461bcd60e51b815260040161056390615bc1565b5f805b6002811015613be957613bb18160016159c8565b613bbc90600861593f565b61ffff16858281518110613bd257613bd2615707565b016020015160f81c901b9190911790600101613b9d565b5061ffff811615613c0c5760405162461bcd60e51b815260040161056390615c0a565b5f805b6004811015613c6757613c238160036159c8565b613c2e90600861593f565b63ffffffff1686613c4083600261590a565b81518110613c5057613c50615707565b016020015160f81c901b9190911790600101613c0f565b5063ffffffff8116600514613c8e5760405162461bcd60e51b815260040161056390615c4d565b5f805b6020811015613ce357613ca581601f6159c8565b613cb090600861593f565b87613cbc83600661590a565b81518110613ccc57613ccc615707565b016020015160f81c901b9190911790600101613c91565b505f805b6008811015613d4257613cfb8160076159c8565b613d0690600861593f565b6001600160401b031688613d1b83602661590a565b81518110613d2b57613d2b615707565b016020015160f81c901b9190911790600101613ce7565b5090969095509350505050565b5f80516020615f1f8339815191525f6001600160401b038084169085161115613d8357613d7c8385615572565b9050613d90565b613d8d8484615572565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613df2575060018401548151613dee916001600160401b03169061590a565b8210155b15613e18576001600160401b038316606082015281815260408101516020820152613e37565b8281606001818151613e2a91906159a8565b6001600160401b03169052505b6060810151613e47906064615c94565b602082015160018601546001600160401b039290921691613e729190600160401b900460ff1661593f565b1015613ed65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610563565b856001600160401b031681604001818151613ef1919061590a565b9052506040810180516001600160401b0387169190613f119083906159c8565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f5f8339815191526020526040812060020180545f80516020615f1f83398151915291600160401b9091046001600160401b0316906008613fa783615d0a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611f3c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614734565b5f610a7a825f80516020615ebf833981519152546001600160a01b031690614795565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166140fa5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610563565b5f80516020615f1f83398151915242614119604086016020870161539a565b6001600160401b03161161418b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610563565b61419b604085016020860161539a565b6001600160401b03166141b16202a3004261590a565b116142245760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610563565b833561427c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610563565b83355f908152600882016020526040902054156142ab5760405162461bcd60e51b815260040161056390615862565b60306142ba6040860186615d25565b90501461431f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610563565b614329835f613d4f565b5f806143c26040518060a00160405280855f01548152602001885f01358152602001876001600160401b0316815260200188602001602081019061436d919061539a565b6001600160401b0316815260200161438860408a018a615d25565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506148f7565b5f828152600686016020526040902091935091506143e08282615dab565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061440d9085906004016155cb565b6020604051808303815f875af1158015614429573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061444d9190615592565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156144c5576144c56153d3565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916145a5918e01908e0161539a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661461c57604051631afcd79f60e31b815260040160405180910390fd5b565b6146266145d3565b61462f81614ca6565b614637614cbf565b6146906060820135608083013561465460c0850160a0860161539a565b61466460e0860160c08701615e6a565b61ffff16614679610100870160e08801615e83565b61468b610120880161010089016156a7565b614ccf565b50565b61469b6145d3565b5f80516020615ebf8339815191526001600160a01b0382166147145760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610563565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6147486001600160a01b03841683614f13565b905080515f1415801561476c57508080602001905181019061476a9190615ea3565b155b15611f3c57604051635274afe760e01b81526001600160a01b0384166004820152602401610563565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156147db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147ff9190615592565b90506148166001600160a01b038516333086614f20565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561485a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061487e9190615592565b90508181116148e45760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610563565b6148ee82826159c8565b95945050505050565b5f60608260800151516030146149615760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610563565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156149d8576149988160016159c8565b6149a390600861593f565b5081515f908390839081106149ba576149ba615707565b60200101906001600160f81b03191690815f1a905350600101614984565b505f5b6004811015614a40576149ef8160036159c8565b6149fa90600861593f565b600160ff919091161c60f81b82614a1283600261590a565b81518110614a2257614a22615707565b60200101906001600160f81b03191690815f1a9053506001016149db565b505f5b6020811015614a9d5784518160208110614a5f57614a5f615707565b1a60f81b82614a6f83600661590a565b81518110614a7f57614a7f615707565b60200101906001600160f81b03191690815f1a905350600101614a43565b505f5b6020811015614afd5784602001518160208110614abf57614abf615707565b1a60f81b82614acf83602661590a565b81518110614adf57614adf615707565b60200101906001600160f81b03191690815f1a905350600101614aa0565b505f5b6008811015614b7157614b148160076159c8565b614b1f90600861593f565b60ff1685604001516001600160401b0316901c60f81b82826046614b43919061590a565b81518110614b5357614b53615707565b60200101906001600160f81b03191690815f1a905350600101614b00565b505f5b6030811015614bdc5784608001518181518110614b9357614b93615707565b01602001516001600160f81b03191682614bae83604e61590a565b81518110614bbe57614bbe615707565b60200101906001600160f81b03191690815f1a905350600101614b74565b505f5b6008811015614c4e57614bf38160076159c8565b614bfe90600861593f565b60608601516001600160401b0390811691161c60f81b82614c2083607e61590a565b81518110614c3057614c30615707565b60200101906001600160f81b03191690815f1a905350600101614bdf565b50600281604051614c5f91906158f9565b602060405180830381855afa158015614c7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c9d9190615592565b94909350915050565b614cae6145d3565b614cb6614f59565b61469081614f61565b614cc76145d3565b61461c6150dc565b614cd76145d3565b5f80516020615edf83398151915283614d435760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610563565b612710841115614d655760405162461bcd60e51b815260040161056390615cbf565b85871115614dcd5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610563565b5f8360ff1611614e3a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610563565b600a60ff84161115614eac5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610563565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b606061273083835f6150e4565b6040516001600160a01b038481166024830152838116604483015260648201839052610a649186918216906323b872dd9060840161401a565b61461c6145d3565b614f696145d3565b80355f80516020615f1f8339815191529081556014614f8e6060840160408501615e83565b60ff161115614ffb5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610563565b5f61500c6060840160408501615e83565b60ff16116150745760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610563565b6150846060830160408401615e83565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556150b5604083016020840161539a565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61337a6145d3565b6060814710156151095760405163cd78605960e01b8152306004820152602401610563565b5f80856001600160a01b0316848660405161512491906158f9565b5f6040518083038185875af1925050503d805f811461515e576040519150601f19603f3d011682016040523d82523d5f602084013e615163565b606091505b50915091506123af8683836060826151835761517e826151ca565b612730565b815115801561519a57506001600160a01b0384163b155b156151c357604051639996b31560e01b81526001600160a01b0385166004820152602401610563565b5080612730565b8051156151da5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151ff906159db565b5f825580601f1061520e575050565b601f0160209004905f5260205f20908101906146909190615266565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561527a575f8155600101615267565b5090565b8015158114614690575f80fd5b803563ffffffff8116811461529e575f80fd5b919050565b5f805f606084860312156152b5575f80fd5b8335925060208401356152c78161527e565b91506152d56040850161528b565b90509250925092565b5f602082840312156152ee575f80fd5b5035919050565b5f60208284031215615305575f80fd5b6127308261528b565b5f806040838503121561531f575f80fd5b6153288361528b565b946020939093013593505050565b5f8060408385031215615347575f80fd5b82356001600160401b0381111561535c575f80fd5b83016080818603121561536d575f80fd5b915061537b6020840161528b565b90509250929050565b80356001600160401b038116811461529e575f80fd5b5f602082840312156153aa575f80fd5b61273082615384565b5f80604083850312156153c4575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061540a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161544560608401826001600160401b03169052565b50608083015161546060808401826001600160401b03169052565b5060a083015161547b60a08401826001600160401b03169052565b5060c0830151612d1460c08401826001600160401b03169052565b803561ffff8116811461529e575f80fd5b5f805f80608085870312156154ba575f80fd5b84356001600160401b038111156154cf575f80fd5b8501606081880312156154e0575f80fd5b93506154ee60208601615496565b92506154fc60408601615384565b9396929550929360600135925050565b6001600160a01b0381168114614690575f80fd5b5f80828403610140811215615533575f80fd5b61012080821215615542575f80fd5b84935083013590506155538161550c565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612d1457612d1461555e565b5f602082840312156155a2575f80fd5b5051919050565b5f5b838110156155c35781810151838201526020016155ab565b50505f910152565b602081525f82518060208401526155e98160408501602087016155a9565b601f01601f19169190910160400192915050565b5f8261561757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156b7575f80fd5b81356127308161550c565b5f808335601e198436030181126156d7575f80fd5b8301803591506001600160401b038211156156f0575f80fd5b6020019150600581901b3603821315612509575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261572f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561576f5761576f615739565b60405290565b604051601f8201601f191681016001600160401b038111828210171561579d5761579d615739565b604052919050565b5f6001600160401b038211156157bd576157bd615739565b50601f01601f191660200190565b5f606082360312156157db575f80fd5b6157e361574d565b8235815260206157f4818501615384565b8183015260408401356001600160401b03811115615810575f80fd5b840136601f820112615820575f80fd5b803561583361582e826157a5565b615775565b8181523684838501011115615846575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158bb818460208a016155a9565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158eb8160288401602088016155a9565b016028019695505050505050565b5f825161572f8184602087016155a9565b80820180821115610a7a57610a7a61555e565b5f63ffffffff8083168181036159355761593561555e565b6001019392505050565b8082028115828204841417610a7a57610a7a61555e565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b03818116838216019080821115612d1457612d1461555e565b81810381811115610a7a57610a7a61555e565b600181811c908216806159ef57607f821691505b602082108103615a0d57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a6c816159db565b806020870152604060018084165f8114615a8d5760018114615aa957615ad6565b60ff19851660408a0152604084151560051b8a01019550615ad6565b895f5260205f205f5b85811015615acd5781548b8201860152908301908801615ab2565b8a016040019650505b509398975050505050505050565b805161529e8161527e565b5f8060408385031215615b00575f80fd5b82516001600160401b0380821115615b16575f80fd5b9084019060608287031215615b29575f80fd5b615b3161574d565b82518152602080840151615b448161550c565b82820152604084015183811115615b59575f80fd5b80850194505087601f850112615b6d575f80fd5b83519250615b7d61582e846157a5565b8381528882858701011115615b90575f80fd5b615b9f848383018488016155a9565b80604084015250819550615bb4818801615ae4565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cb757615cb761555e565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036159355761593561555e565b5f808335601e19843603018112615d3a575f80fd5b8301803591506001600160401b03821115615d53575f80fd5b602001915036819003821315612509575f80fd5b601f821115611f3c57805f5260205f20601f840160051c81016020851015615d8c5750805b601f840160051c820191505b81811015610b19575f8155600101615d98565b81516001600160401b03811115615dc457615dc4615739565b615dd881615dd284546159db565b84615d67565b602080601f831160018114615e0b575f8415615df45750858301515b5f19600386901b1c1916600185901b178555615e62565b5f85815260208120601f198616915b82811015615e3957888601518255948401946001909101908401615e1a565b5085821015615e5657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e7a575f80fd5b61273082615496565b5f60208284031215615e93575f80fd5b813560ff81168114612730575f80fd5b5f60208284031215615eb3575f80fd5b81516127308161527e56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. diff --git a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go index fe2238854..dd5233204 100644 --- a/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/staking/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -82,13 +82,8 @@ type ValidatorRegistrationInput struct { // NativeTokenStakingManagerMetaData contains all meta data concerning the NativeTokenStakingManager contract. var NativeTokenStakingManagerMetaData = &bind.MetaData{ -<<<<<<< HEAD - 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516157e73803806157e783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61569a8061014d5f395ff3fe60806040526004361061017b575f3560e01c806366435abf116100cd578063b771b3bc11610087578063c599e24f11610062578063c599e24f1461048b578063c974d1b61461049e578063d5f20ff6146104b2578063df93d8de146104de575f80fd5b8063b771b3bc1461041b578063ba3a4b971461044d578063bee0a03f1461046c575f80fd5b806366435abf14610378578063732214f81461039757806376f78621146103aa5780638280a25a146103c957806398f3e2b4146103dd578063a3a65e48146103fc575f80fd5b806335455ded116101385780635297fae6116101135780635297fae6146102f257806360305d621461031157806361e2f4901461033a5780636206585614610359575f80fd5b806335455ded1461029857806340034a93146102c0578063467ef06f146102d3575f80fd5b80630118acc41461017f5780630322ed98146101a05780630cdd0985146101bf578063151d30d11461021c57806320e55565146102425780632e2194d814610261575b5f80fd5b34801561018a575f80fd5b5061019e610199366004614a9d565b6104f4565b005b3480156101ab575f80fd5b5061019e6101ba366004614ad8565b6108a9565b3480156101ca575f80fd5b506102096101d9366004614ad8565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b348015610227575f80fd5b50610230600a81565b60405160ff9091168152602001610213565b34801561024d575f80fd5b5061019e61025c366004614aef565b610a62565b34801561026c575f80fd5b5061028061027b366004614ad8565b610b3f565b6040516001600160401b039091168152602001610213565b3480156102a3575f80fd5b506102ad61271081565b60405161ffff9091168152602001610213565b6102096102ce366004614b2d565b610b55565b3480156102de575f80fd5b5061019e6102ed366004614b81565b610b89565b3480156102fd575f80fd5b5061019e61030c366004614b9a565b610bdc565b34801561031c575f80fd5b50610325601481565b60405163ffffffff9091168152602001610213565b348015610345575f80fd5b5061019e610354366004614bc2565b610db1565b348015610364575f80fd5b50610209610373366004614c10565b6113e5565b348015610383575f80fd5b50610280610392366004614ad8565b6113fe565b3480156103a2575f80fd5b506102095f81565b3480156103b5575f80fd5b5061019e6103c4366004614a9d565b611412565b3480156103d4575f80fd5b50610230603081565b3480156103e8575f80fd5b5061019e6103f7366004614b9a565b6114f3565b348015610407575f80fd5b5061019e610416366004614b81565b611720565b348015610426575f80fd5b506104356005600160991b0181565b6040516001600160a01b039091168152602001610213565b348015610458575f80fd5b5061019e610467366004614ad8565b6118d8565b348015610477575f80fd5b5061019e610486366004614ad8565b611b5e565b610209610499366004614ad8565b611c72565b3480156104a9575f80fd5b50610230601481565b3480156104bd575f80fd5b506104d16104cc366004614ad8565b611ca3565b6040516102139190614c3d565b3480156104e9575f80fd5b506102806202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408120600101545f805160206155ee833981519152918415610546576105438285611d96565b90505b5f868152600684016020526040808220815161010081019092528054829060ff16600481111561057857610578614c29565b600481111561058957610589614c29565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f61060584611ca3565b905060028251600481111561061c5761061c614c29565b1461066e5760405162461bcd60e51b815260206004820152602a60248201525f8051602061560e8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208201516001600160a01b031633146106d35760405162461bcd60e51b815260206004820152603360248201525f8051602061560e8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610665565b60038252805160029060058111156106ed576106ed614c29565b03610731575f826060015182608001516107079190614d00565b90506107138582612032565b506001600160401b0390811660e0850152421660a084015250610752565b60608101516001600160401b0390811660e084015260c08201511660a08301525b5f88815260068601602052604090208251815484929190829060ff1916600183600481111561078357610783614c29565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255830151905185918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610897916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061566e8339815191526020526040808220815160e0810190925280545f8051602061562e83398151915293929190829060ff1660058111156108f6576108f6614c29565b600581111561090757610907614c29565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561097657610976614c29565b146109db5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610665565b6005600160991b016001600160a01b031663ee5b48eb610a008584606001515f612189565b6040518263ffffffff1660e01b8152600401610a1c9190614d42565b6020604051808303815f875af1158015610a38573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5c9190614d74565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aab575080546001600160401b03808416911610155b15610ac95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af3836123ae565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b4f64e8d4a5100083614d8b565b92915050565b5f610b5e6123c2565b610b6a848484346123f9565b9050610b8260015f8051602061564e83398151915255565b9392505050565b5f805160206155ee8339815191525f80610ba284612676565b6040808201515f848152600588016020529190912054929450909250610a5c916001600160401b03909116906001600160a01b03166129ee565b5f805160206155ee8339815191525f610bf484612a01565b90505f80610c058360400151612bc7565b50915091505f610c1483611ca3565b9050816001600160401b031681606001516001600160401b03161015610c4c5760405162461bcd60e51b815260040161066590614daa565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c915760405162461bcd60e51b815260040161066590614dec565b60015f87815260068701602052604090205460ff166004811115610cb757610cb7614c29565b14610d205760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610665565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061562e8339815191529060ff1615610e4e5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610665565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb59190614d74565b836020013514610f175760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610665565b30610f286060850160408601614e49565b6001600160a01b031614610f9a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610665565b5f610fa86060850185614e64565b91505f9050843560208601356014610fc66060890160408a01614e49565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f5575f6110466060890189614e64565b8363ffffffff1681811061105c5761105c614ea9565b905060200281019061106e9190614ebd565b61107790614f6d565b80515f81815260088901602052604090205491925090156110aa5760405162461bcd60e51b815260040161066590615004565b84825f0151836020015184604001516040516020016110cc949392919061504c565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111a919061509b565b602060405180830381855afa158015611135573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111589190614d74565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff191660018360058111156111e4576111e4614c29565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112979116866150ac565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112ee906150bf565b905061102a565b50600484018190555f61130786612a01565b90505f6113178260400151612e02565b90508060028560405161132a919061509b565b602060405180830381855afa158015611345573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113689190614d74565b146113cc5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610665565b5050506009909201805460ff1916600117905550505050565b5f610b4f6001600160401b03831664e8d4a510006150e1565b5f61140882611ca3565b6080015192915050565b5f805160206155ee8339815191525f61142a85611ca3565b5f86815260058401602052604090205460a082015191925061145d91600160b01b9091046001600160401b0316906150f8565b6001600160401b03164210156114d15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610665565b83156114e3576114e18584611d96565b505b6114ec85612f6b565b5050505050565b6114fb6123c2565b5f805160206155ee8339815191525f61151384612a01565b90505f806115248360400151612bc7565b50915091505f61153383611ca3565b9050816001600160401b031681606001516001600160401b0316101561156b5760405162461bcd60e51b815260040161066590614daa565b5f8681526006860160205260409020600301546001600160401b03808416911611156115a95760405162461bcd60e51b815260040161066590614dec565b60035f87815260068701602052604090205460ff1660048111156115cf576115cf614c29565b146116235760405162461bcd60e51b815260206004820152603160248201525f8051602061560e8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610665565b5f868152600686016020908152604091829020805460ff19166004908117808355845161010080820187529281529190046001600160a01b031692810183905260018201549381019390935260028101546001600160401b0380821660608601819052600160401b830482166080870152600160801b8304821660a0870152600160c01b909204811660c086015260039092015490911660e08401526116c8916129ee565b826001600160401b031684887f52e9b1eaef84d46cda83ccb9d427267bc4d04f756b4a32c8302722b79e5c65ab60405160405180910390a450505050505061171c60015f8051602061564e83398151915255565b5050565b5f8051602061562e8339815191525f61173883612a01565b90505f8061174983604001516131dc565b91509150806117ab5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610665565b5f828152600685016020526040812080546117c590615118565b90501180156117f7575060015f83815260078601602052604090205460ff1660058111156117f5576117f5614c29565b145b6118135760405162461bcd60e51b81526004016106659061514a565b5f828152600685016020526040812061182b91614a33565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206155ee83398151915293929190829060ff16600481111561193957611939614c29565b600481111561194a5761194a614c29565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156119d1576119d1614c29565b14806119ef57506003815160048111156119ed576119ed614c29565b145b611a435760405162461bcd60e51b815260206004820152603260248201525f8051602061560e833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610665565b5f611a518260400151611ca3565b905080606001516001600160401b03165f03611ad55760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610665565b6005600160991b016001600160a01b031663ee5b48eb611b02846040015184606001518560800151612189565b6040518263ffffffff1660e01b8152600401611b1e9190614d42565b6020604051808303815f875af1158015611b3a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ec9190614d74565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061562e833981519152929190611ba690615118565b9050118015611bd8575060015f83815260078301602052604090205460ff166005811115611bd657611bd6614c29565b145b611bf45760405162461bcd60e51b81526004016106659061514a565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c2d9190600401615191565b6020604051808303815f875af1158015611c49573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c6d9190614d74565b505050565b5f611c7b6123c2565b611c8682333461337d565b9050611c9e60015f8051602061564e83398151915255565b919050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f8051602061566e83398151915290528390208351918201909352825491925f8051602061562e83398151915292829060ff166005811115611d2357611d23614c29565b6005811115611d3457611d34614c29565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611de1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e089190810190615226565b9150915080611e6b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610665565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611eae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed29190614d74565b825114611f365760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610665565b60208201516001600160a01b031615611fac5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610665565b5f80611fbb8460400151613762565b915091508187146120285760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610665565b9695505050505050565b5f8281525f8051602061566e833981519152602052604081206002015481905f8051602061562e83398151915290600160801b90046001600160401b031661207a858261393a565b5f61208487613b48565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6120d48a858b612189565b6040518263ffffffff1660e01b81526004016120f09190614d42565b6020604051808303815f875af115801561210c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121309190614d74565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612202576121c28160016152f8565b6121cd9060086150e1565b5081515f908390839081106121e4576121e4614ea9565b60200101906001600160f81b03191690815f1a9053506001016121ae565b505f5b600481101561226d576122198160036152f8565b6122249060086150e1565b600263ffffffff16901c60f81b8282600261223f91906150ac565b8151811061224f5761224f614ea9565b60200101906001600160f81b03191690815f1a905350600101612205565b505f5b60208110156122cf5761228481601f6152f8565b61228f9060086150e1565b86901c60f81b826122a18360066150ac565b815181106122b1576122b1614ea9565b60200101906001600160f81b03191690815f1a905350600101612270565b505f5b600881101561233a576122e68160076152f8565b6122f19060086150e1565b6001600160401b038616901c60f81b8261230c8360266150ac565b8151811061231c5761231c614ea9565b60200101906001600160f81b03191690815f1a9053506001016122d2565b505f5b60088110156123a5576123518160076152f8565b61235c9060086150e1565b6001600160401b038516901c60f81b8261237783602e6150ac565b8151811061238757612387614ea9565b60200101906001600160f81b03191690815f1a90535060010161233d565b50949350505050565b6123b6613bd8565b6123bf81613c23565b50565b5f8051602061564e8339815191528054600119016123f357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206155ee8339815191529061ffff861610801590612445575061271061ffff861611155b6124615760405162461bcd60e51b81526004016106659061530b565b60028101546001600160401b0390811690851610156124da5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610665565b805483101561253d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610665565b80600101548311156125a45760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610665565b825f6125af82610b3f565b90505f6125bc8983613c95565b905060405180606001604052806125d03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061564e83398151915255565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f8051602061562e8339815191525f6126c585612a01565b90505f806126d683604001516131dc565b91509150801561273b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610665565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561276c5761276c614c29565b600581111561277d5761277d614c29565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156127ee576127ee614c29565b148061280c575060018251600581111561280a5761280a614c29565b145b61286b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610665565b60038251600581111561288057612880614c29565b0361288d57506004612891565b5060055b6020808301515f908152600888019091526040812055818160058111156128ba576128ba614c29565b908160058111156128cd576128cd614c29565b9052505f84815260078701602052604090208251815484929190829060ff1916600183600581111561290157612901614c29565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156129b5576129b5614c29565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b61171c6001600160a01b038216836141f9565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a8c9190810190615226565b9150915080612aec5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610665565b815115612b4d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610665565b60208201516001600160a01b031615612bc05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610665565b5092915050565b5f805f8351603614612beb5760405162461bcd60e51b815260040161066590615356565b5f805b6002811015612c3a57612c028160016152f8565b612c0d9060086150e1565b61ffff16868281518110612c2357612c23614ea9565b016020015160f81c901b9190911790600101612bee565b5061ffff811615612c5d5760405162461bcd60e51b81526004016106659061539f565b5f805b6004811015612cb857612c748160036152f8565b612c7f9060086150e1565b63ffffffff1687612c918360026150ac565b81518110612ca157612ca1614ea9565b016020015160f81c901b9190911790600101612c60565b5063ffffffff8116600414612cdf5760405162461bcd60e51b8152600401610665906153e2565b5f805b6020811015612d3457612cf681601f6152f8565b612d019060086150e1565b88612d0d8360066150ac565b81518110612d1d57612d1d614ea9565b016020015160f81c901b9190911790600101612ce2565b505f805b6008811015612d9357612d4c8160076152f8565b612d579060086150e1565b6001600160401b031689612d6c8360266150ac565b81518110612d7c57612d7c614ea9565b016020015160f81c901b9190911790600101612d38565b505f805b6008811015612df257612dab8160076152f8565b612db69060086150e1565b6001600160401b03168a612dcb83602e6150ac565b81518110612ddb57612ddb614ea9565b016020015160f81c901b9190911790600101612d97565b5091989097509095509350505050565b5f8151602614612e245760405162461bcd60e51b815260040161066590615356565b5f805b6002811015612e7357612e3b8160016152f8565b612e469060086150e1565b61ffff16848281518110612e5c57612e5c614ea9565b016020015160f81c901b9190911790600101612e27565b5061ffff811615612e965760405162461bcd60e51b81526004016106659061539f565b5f805b6004811015612ef157612ead8160036152f8565b612eb89060086150e1565b63ffffffff1685612eca8360026150ac565b81518110612eda57612eda614ea9565b016020015160f81c901b9190911790600101612e99565b5063ffffffff811615612f165760405162461bcd60e51b8152600401610665906153e2565b5f805b60208110156123a557612f2d81601f6152f8565b612f389060086150e1565b86612f448360066150ac565b81518110612f5457612f54614ea9565b016020015160f81c901b9190911790600101612f19565b5f8181525f8051602061566e8339815191526020526040808220815160e0810190925280545f8051602061562e83398151915293929190829060ff166005811115612fb857612fb8614c29565b6005811115612fc957612fc9614c29565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561303b5761303b614c29565b146130975760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610665565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156130db576130db614c29565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131878482612032565b6080840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f8082516027146131ff5760405162461bcd60e51b815260040161066590615356565b5f805b600281101561324e576132168160016152f8565b6132219060086150e1565b61ffff1685828151811061323757613237614ea9565b016020015160f81c901b9190911790600101613202565b5061ffff8116156132715760405162461bcd60e51b81526004016106659061539f565b5f805b60048110156132cc576132888160036152f8565b6132939060086150e1565b63ffffffff16866132a58360026150ac565b815181106132b5576132b5614ea9565b016020015160f81c901b9190911790600101613274565b5063ffffffff81166003146132f35760405162461bcd60e51b8152600401610665906153e2565b5f805b60208110156133485761330a81601f6152f8565b6133159060086150e1565b876133218360066150ac565b8151811061333157613331614ea9565b016020015160f81c901b91909117906001016132f6565b505f8660268151811061335d5761335d614ea9565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206155ee8339815191528161339684610b3f565b90505f6133a287611ca3565b5f8881527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020549091506001600160a01b03166134385760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610665565b60028151600581111561344d5761344d614c29565b146134ac5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610665565b5f8282608001516134bd91906150f8565b600485015460408401519192506134df916001600160401b0390911690615429565b6001600160401b0316816001600160401b0316111561355e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610665565b5f8061356a8a84612032565b915091505f8a8360405160200161359892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561363357613633614c29565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146137855760405162461bcd60e51b815260040161066590615356565b5f805b60028110156137d45761379c8160016152f8565b6137a79060086150e1565b61ffff168582815181106137bd576137bd614ea9565b016020015160f81c901b9190911790600101613788565b5061ffff8116156137f75760405162461bcd60e51b81526004016106659061539f565b5f805b60048110156138525761380e8160036152f8565b6138199060086150e1565b63ffffffff168661382b8360026150ac565b8151811061383b5761383b614ea9565b016020015160f81c901b91909117906001016137fa565b5063ffffffff81166005146138795760405162461bcd60e51b8152600401610665906153e2565b5f805b60208110156138ce5761389081601f6152f8565b61389b9060086150e1565b876138a78360066150ac565b815181106138b7576138b7614ea9565b016020015160f81c901b919091179060010161387c565b505f805b600881101561392d576138e68160076152f8565b6138f19060086150e1565b6001600160401b0316886139068360266150ac565b8151811061391657613916614ea9565b016020015160f81c901b91909117906001016138d2565b5090969095509350505050565b5f8051602061562e8339815191525f6001600160401b03808416908516111561396e576139678385614d00565b905061397b565b6139788484614d00565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806139dd5750600184015481516139d9916001600160401b0316906150ac565b8210155b15613a03576001600160401b038316606082015281815260408101516020820152613a22565b8281606001818151613a1591906150f8565b6001600160401b03169052505b6060810151613a32906064615429565b602082015160018601546001600160401b039290921691613a5d9190600160401b900460ff166150e1565b1015613ac15760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610665565b856001600160401b031681604001818151613adc91906150ac565b9052506040810180516001600160401b0387169190613afc9083906152f8565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061566e8339815191526020526040812060020180545f8051602061562e83398151915291600160401b9091046001600160401b0316906008613b9283615454565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c2157604051631afcd79f60e31b815260040160405180910390fd5b565b613c2b613bd8565b613c348161428c565b613c3c6142a5565b6123bf60608201356080830135613c5960c0850160a08601614c10565b613c6960e0860160c0870161546f565b61ffff16613c7e610100870160e08801615488565b613c9061012088016101008901614e49565b6142b5565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613d205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610665565b5f8051602061562e83398151915242613d3f6040860160208701614c10565b6001600160401b031611613db15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610665565b613dc16040850160208601614c10565b6001600160401b0316613dd76202a300426150ac565b11613e4a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610665565b8335613ea25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610665565b83355f90815260088201602052604090205415613ed15760405162461bcd60e51b815260040161066590615004565b6030613ee060408601866154a8565b905014613f455760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610665565b613f4f835f61393a565b5f80613fe86040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f939190614c10565b6001600160401b03168152602001613fae60408a018a6154a8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506144f9565b5f82815260068601602052604090209193509150614006828261552e565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614033908590600401614d42565b6020604051808303815f875af115801561404f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140739190614d74565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156140eb576140eb614c29565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916141cb918e01908e01614c10565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561421c5760405163cd78605960e01b8152306004820152602401610665565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614265576040519150601f19603f3d011682016040523d82523d5f602084013e61426a565b606091505b5050905080611c6d57604051630a12f52160e11b815260040160405180910390fd5b614294613bd8565b61429c6148a8565b6123bf816148b0565b6142ad613bd8565b613c21614a2b565b6142bd613bd8565b5f805160206155ee833981519152836143295760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610665565b61271084111561434b5760405162461bcd60e51b81526004016106659061530b565b858711156143b35760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610665565b5f8360ff16116144205760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610665565b600a60ff841611156144925760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610665565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146145635760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610665565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156145da5761459a8160016152f8565b6145a59060086150e1565b5081515f908390839081106145bc576145bc614ea9565b60200101906001600160f81b03191690815f1a905350600101614586565b505f5b6004811015614642576145f18160036152f8565b6145fc9060086150e1565b600160ff919091161c60f81b826146148360026150ac565b8151811061462457614624614ea9565b60200101906001600160f81b03191690815f1a9053506001016145dd565b505f5b602081101561469f578451816020811061466157614661614ea9565b1a60f81b826146718360066150ac565b8151811061468157614681614ea9565b60200101906001600160f81b03191690815f1a905350600101614645565b505f5b60208110156146ff57846020015181602081106146c1576146c1614ea9565b1a60f81b826146d18360266150ac565b815181106146e1576146e1614ea9565b60200101906001600160f81b03191690815f1a9053506001016146a2565b505f5b6008811015614773576147168160076152f8565b6147219060086150e1565b60ff1685604001516001600160401b0316901c60f81b8282604661474591906150ac565b8151811061475557614755614ea9565b60200101906001600160f81b03191690815f1a905350600101614702565b505f5b60308110156147de578460800151818151811061479557614795614ea9565b01602001516001600160f81b031916826147b083604e6150ac565b815181106147c0576147c0614ea9565b60200101906001600160f81b03191690815f1a905350600101614776565b505f5b6008811015614850576147f58160076152f8565b6148009060086150e1565b60608601516001600160401b0390811691161c60f81b8261482283607e6150ac565b8151811061483257614832614ea9565b60200101906001600160f81b03191690815f1a9053506001016147e1565b50600281604051614861919061509b565b602060405180830381855afa15801561487c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061489f9190614d74565b94909350915050565b613c21613bd8565b6148b8613bd8565b80355f8051602061562e83398151915290815560146148dd6060840160408501615488565b60ff16111561494a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610665565b5f61495b6060840160408501615488565b60ff16116149c35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610665565b6149d36060830160408401615488565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a046040830160208401614c10565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612663613bd8565b508054614a3f90615118565b5f825580601f10614a4e575050565b601f0160209004905f5260205f20908101906123bf91905b80821115614a79575f8155600101614a66565b5090565b80151581146123bf575f80fd5b803563ffffffff81168114611c9e575f80fd5b5f805f60608486031215614aaf575f80fd5b833592506020840135614ac181614a7d565b9150614acf60408501614a8a565b90509250925092565b5f60208284031215614ae8575f80fd5b5035919050565b5f6101208284031215614b00575f80fd5b50919050565b803561ffff81168114611c9e575f80fd5b80356001600160401b0381168114611c9e575f80fd5b5f805f60608486031215614b3f575f80fd5b83356001600160401b03811115614b54575f80fd5b840160608187031215614b65575f80fd5b9250614b7360208501614b06565b9150614acf60408501614b17565b5f60208284031215614b91575f80fd5b610b8282614a8a565b5f8060408385031215614bab575f80fd5b614bb483614a8a565b946020939093013593505050565b5f8060408385031215614bd3575f80fd5b82356001600160401b03811115614be8575f80fd5b830160808186031215614bf9575f80fd5b9150614c0760208401614a8a565b90509250929050565b5f60208284031215614c20575f80fd5b610b8282614b17565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614c6057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614c9b60608401826001600160401b03169052565b506080830151614cb660808401826001600160401b03169052565b5060a0830151614cd160a08401826001600160401b03169052565b5060c0830151612bc060c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612bc057612bc0614cec565b5f5b83811015614d3a578181015183820152602001614d22565b50505f910152565b602081525f8251806020840152614d60816040850160208701614d20565b601f01601f19169190910160400192915050565b5f60208284031215614d84575f80fd5b5051919050565b5f82614da557634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b03811681146123bf575f80fd5b5f60208284031215614e59575f80fd5b8135610b8281614e35565b5f808335601e19843603018112614e79575f80fd5b8301803591506001600160401b03821115614e92575f80fd5b6020019150600581901b3603821315612182575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614ed1575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f1157614f11614edb565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f3f57614f3f614edb565b604052919050565b5f6001600160401b03821115614f5f57614f5f614edb565b50601f01601f191660200190565b5f60608236031215614f7d575f80fd5b614f85614eef565b823581526020614f96818501614b17565b8183015260408401356001600160401b03811115614fb2575f80fd5b840136601f820112614fc2575f80fd5b8035614fd5614fd082614f47565b614f17565b8181523684838501011115614fe8575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f855161505d818460208a01614d20565b80830190508581526001600160401b0360c01b8560c01b166020820152835161508d816028840160208801614d20565b016028019695505050505050565b5f8251614ed1818460208701614d20565b80820180821115610b4f57610b4f614cec565b5f63ffffffff8083168181036150d7576150d7614cec565b6001019392505050565b8082028115828204841417610b4f57610b4f614cec565b6001600160401b03818116838216019080821115612bc057612bc0614cec565b600181811c9082168061512c57607f821691505b602082108103614b0057634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546151a381615118565b806020870152604060018084165f81146151c457600181146151e05761520d565b60ff19851660408a0152604084151560051b8a0101955061520d565b895f5260205f205f5b858110156152045781548b82018601529083019088016151e9565b8a016040019650505b509398975050505050505050565b8051611c9e81614a7d565b5f8060408385031215615237575f80fd5b82516001600160401b038082111561524d575f80fd5b9084019060608287031215615260575f80fd5b615268614eef565b8251815260208084015161527b81614e35565b82820152604084015183811115615290575f80fd5b80850194505087601f8501126152a4575f80fd5b835192506152b4614fd084614f47565b83815288828587010111156152c7575f80fd5b6152d684838301848801614d20565b806040840152508195506152eb81880161521b565b9450505050509250929050565b81810381811115610b4f57610b4f614cec565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b0381811683821602808216919082811461544c5761544c614cec565b505092915050565b5f6001600160401b038083168181036150d7576150d7614cec565b5f6020828403121561547f575f80fd5b610b8282614b06565b5f60208284031215615498575f80fd5b813560ff81168114610b82575f80fd5b5f808335601e198436030181126154bd575f80fd5b8301803591506001600160401b038211156154d6575f80fd5b602001915036819003821315612182575f80fd5b601f821115611c6d57805f5260205f20601f840160051c8101602085101561550f5750805b601f840160051c820191505b818110156114ec575f815560010161551b565b81516001600160401b0381111561554757615547614edb565b61555b816155558454615118565b846154ea565b602080601f83116001811461558e575f84156155775750858301515b5f19600386901b1c1916600185901b1785556155e5565b5f85815260208120601f198616915b828110156155bc5788860151825594840194600190910190840161559d565b50858210156155d957878501515f19600388901b60f8161c191681555b505060018460011b0185555b50505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", -======= - 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615dba380380615dba83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c6d8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b336600461501b565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615056565b6109d8565b3480156101e4575f80fd5b506102236101f3366004615056565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461506d565b610b91565b348015610286575f80fd5b5061029a610295366004615056565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150ab565b610c84565b34801561032a575f80fd5b506101b86103393660046150ff565b610cb8565b348015610349575f80fd5b506101b8610358366004615118565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615140565b610f2d565b3480156103b0575f80fd5b506102236103bf36600461518e565b611561565b3480156103cf575f80fd5b5061029a6103de366004615056565b61157a565b3480156103ee575f80fd5b506101b86103fd36600461501b565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615056565b6117d1565b348015610440575f80fd5b506101b861044f366004615118565b6118d7565b34801561045f575f80fd5b506101b861046e3660046150ff565b611bfb565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615056565b611db3565b3480156104b7575f80fd5b506101b86104c6366004615056565b612039565b6102236104d9366004615056565b61214d565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615056565b61217e565b60405161022d91906151bb565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc183398151915293929190829060ff166004811115610595576105956151a7565b60048111156105a6576105a66151a7565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a8261217e565b9050600283516004811115610641576106416151a7565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615be18339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615be18339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f906002906005811115610714576107146151a7565b0361076b57861561072c576107298387612246565b90505b5f846060015183608001516107419190615285565b905061074d84826124e2565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087391906152a5565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b26151a7565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c418339815191526020526040808220815160e0810190925280545f80516020615c0183398151915293929190829060ff166005811115610a2557610a256151a7565b6005811115610a3657610a366151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa56151a7565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f612639565b6040518263ffffffff1660e01b8152600401610b4b91906152de565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b91906152a5565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c228361285e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a5100083615310565b92915050565b5f610c8d612872565b610c99848484346128a9565b9050610cb160015f80516020615c2183398151915255565b9392505050565b5f80516020615bc18339815191525f80610cd184612b26565b91509150610cde82612e70565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d166151a7565b03610d3b575f83815260088501602052604081208054919055610d398282612eab565b505b610d5181610d4c8460400151611561565b612f11565b5050505050565b5f80516020615bc18339815191525f610d7084612f24565b90505f80610d8183604001516130fe565b50915091505f610d908361217e565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a9061532f565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615371565b60015f87815260068701602052604090205460ff166004811115610e3357610e336151a7565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615c018339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103191906152a5565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153ce565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153e9565b91505f90508435602086013560146111426060890160408a016153ce565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153e9565b8363ffffffff168181106111d8576111d861542e565b90506020028101906111ea9190615442565b6111f3906154f2565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a90615589565b84825f01518360200151846040015160405160200161124894939291906155d1565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112969190615620565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d491906152a5565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115611360576113606151a7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615631565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615644565b90506111a6565b50600584018190555f61148386612f24565b90505f6114938260400151613339565b9050806002856040516114a69190615620565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e491906152a5565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a51000615666565b5f6115848261217e565b6080015192915050565b5f80516020615bc18339815191525f6115a6856134a2565b90506115b185612e70565b6115bc575050505050565b5f8581526005830160205260409020546001600160a01b031633146115f35760405162461bcd60e51b815260040161068a9061567d565b5f85815260058301602052604090205460a082015161162291600160b01b90046001600160401b0316906156cf565b6001600160401b03168160c001516001600160401b031610156116a35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116b48685612246565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170b90611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a591906152a5565b5f878152600885016020526040812080549091906117c4908490615631565b9091555050505050505050565b5f80516020615bc18339815191525f6117e98361217e565b9050600481516005811115611800576118006151a7565b1461186a5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b031633146118a15760405162461bcd60e51b815260040161068a9061567d565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612eab565b6118df612872565b5f80516020615bc18339815191525f6118f784612f24565b90505f8061190883604001516130fe565b50915091505f6119178361217e565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611951576119516151a7565b6004811115611962576119626151a7565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a465760405162461bcd60e51b815260040161068a9061532f565b826001600160401b03168160e001516001600160401b03161115611a7c5760405162461bcd60e51b815260040161068a90615371565b600381516004811115611a9157611a916151a7565b14611ae55760405162461bcd60e51b815260206004820152603160248201525f80516020615be18339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2690600160a01b900461ffff1684615666565b611b309190615310565b905080886008015f8881526020019081526020015f205f828254611b549190615631565b909155505f9050611b6582846156ef565b9050611b75846020015182612eab565b611b8a8460200151610d4c8660600151611561565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611bd0929190918252602082015260400190565b60405180910390a4505050505050505050611bf760015f80516020615c2183398151915255565b5050565b5f80516020615c018339815191525f611c1383612f24565b90505f80611c24836040015161371d565b9150915080611c865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611ca090615702565b9050118015611cd2575060015f83815260088601602052604090205460ff166005811115611cd057611cd06151a7565b145b611cee5760405162461bcd60e51b815260040161068a90615734565b5f8281526007850160205260408120611d0691614f70565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc183398151915293929190829060ff166004811115611e1457611e146151a7565b6004811115611e2557611e256151a7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611eac57611eac6151a7565b1480611eca5750600381516004811115611ec857611ec86151a7565b145b611f1e5760405162461bcd60e51b815260206004820152603260248201525f80516020615be1833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f2c826040015161217e565b905080606001516001600160401b03165f03611fb05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fdd846040015184606001518560800151612639565b6040518263ffffffff1660e01b8152600401611ff991906152de565b6020604051808303815f875af1158015612015573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5191906152a5565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615c0183398151915292919061208190615702565b90501180156120b3575060015f83815260088301602052604090205460ff1660058111156120b1576120b16151a7565b145b6120cf5760405162461bcd60e51b815260040161068a90615734565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612108919060040161577b565b6020604051808303815f875af1158015612124573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214891906152a5565b505050565b5f612156612872565b6121618233346138be565b905061217960015f80516020615c2183398151915255565b919050565b612186614fa7565b5f8281525f80516020615c41833981519152602052604090819020815160e0810190925280545f80516020615c01833981519152929190829060ff1660058111156121d3576121d36151a7565b60058111156121e4576121e46151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612291573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b89190810190615810565b915091508061231b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561235e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238291906152a5565b8251146123e65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b03161561245c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f8061246b8460400151613c75565b915091508187146124d85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c41833981519152602052604081206002015481905f80516020615c0183398151915290600160801b90046001600160401b031661252a8582613e4d565b5f6125348761405b565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125848a858b612639565b6040518263ffffffff1660e01b81526004016125a091906152de565b6020604051808303815f875af11580156125bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125e091906152a5565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126b2576126728160016156ef565b61267d906008615666565b5081515f908390839081106126945761269461542e565b60200101906001600160f81b03191690815f1a90535060010161265e565b505f5b600481101561271d576126c98160036156ef565b6126d4906008615666565b600263ffffffff16901c60f81b828260026126ef9190615631565b815181106126ff576126ff61542e565b60200101906001600160f81b03191690815f1a9053506001016126b5565b505f5b602081101561277f5761273481601f6156ef565b61273f906008615666565b86901c60f81b82612751836006615631565b815181106127615761276161542e565b60200101906001600160f81b03191690815f1a905350600101612720565b505f5b60088110156127ea576127968160076156ef565b6127a1906008615666565b6001600160401b038616901c60f81b826127bc836026615631565b815181106127cc576127cc61542e565b60200101906001600160f81b03191690815f1a905350600101612782565b505f5b6008811015612855576128018160076156ef565b61280c906008615666565b6001600160401b038516901c60f81b8261282783602e615631565b815181106128375761283761542e565b60200101906001600160f81b03191690815f1a9053506001016127ed565b50949350505050565b6128666140eb565b61286f81614136565b50565b5f80516020615c218339815191528054600119016128a357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bc18339815191529061ffff8616108015906128f5575061271061ffff861611155b6129115760405162461bcd60e51b815260040161068a906158e2565b60028101546001600160401b03908116908516101561298a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129ed5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a545760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a5f82610c6e565b90505f612a6c89836141aa565b90506040518060600160405280612a803390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c2183398151915255565b5f612b2f614fa7565b5f80516020615c018339815191525f612b4785612f24565b90505f80612b58836040015161371d565b915091508015612bbd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bee57612bee6151a7565b6005811115612bff57612bff6151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c7057612c706151a7565b1480612c8e5750600182516005811115612c8c57612c8c6151a7565b145b612ced5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612d0257612d026151a7565b03612d0f57506004612d13565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3c57612d3c6151a7565b90816005811115612d4f57612d4f6151a7565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d8357612d836151a7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e3757612e376151a7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ef7575f80fd5b505af1158015612f09573d5f803e3d5ffd5b505050505050565b611bf76001600160a01b0383168261470f565b60408051606080820183525f8083526020830181905292820152905f80516020615c018339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f99573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fc09190810190615810565b91509150806130205760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130835760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130f65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131225760405162461bcd60e51b815260040161068a9061592d565b5f805b6002811015613171576131398160016156ef565b613144906008615666565b61ffff1686828151811061315a5761315a61542e565b016020015160f81c901b9190911790600101613125565b5061ffff8116156131945760405162461bcd60e51b815260040161068a90615976565b5f805b60048110156131ef576131ab8160036156ef565b6131b6906008615666565b63ffffffff16876131c8836002615631565b815181106131d8576131d861542e565b016020015160f81c901b9190911790600101613197565b5063ffffffff81166004146132165760405162461bcd60e51b815260040161068a906159b9565b5f805b602081101561326b5761322d81601f6156ef565b613238906008615666565b88613244836006615631565b815181106132545761325461542e565b016020015160f81c901b9190911790600101613219565b505f805b60088110156132ca576132838160076156ef565b61328e906008615666565b6001600160401b0316896132a3836026615631565b815181106132b3576132b361542e565b016020015160f81c901b919091179060010161326f565b505f805b6008811015613329576132e28160076156ef565b6132ed906008615666565b6001600160401b03168a61330283602e615631565b815181106133125761331261542e565b016020015160f81c901b91909117906001016132ce565b5091989097509095509350505050565b5f815160261461335b5760405162461bcd60e51b815260040161068a9061592d565b5f805b60028110156133aa576133728160016156ef565b61337d906008615666565b61ffff168482815181106133935761339361542e565b016020015160f81c901b919091179060010161335e565b5061ffff8116156133cd5760405162461bcd60e51b815260040161068a90615976565b5f805b6004811015613428576133e48160036156ef565b6133ef906008615666565b63ffffffff1685613401836002615631565b815181106134115761341161542e565b016020015160f81c901b91909117906001016133d0565b5063ffffffff81161561344d5760405162461bcd60e51b815260040161068a906159b9565b5f805b60208110156128555761346481601f6156ef565b61346f906008615666565b8661347b836006615631565b8151811061348b5761348b61542e565b016020015160f81c901b9190911790600101613450565b6134aa614fa7565b5f8281525f80516020615c418339815191526020526040808220815160e0810190925280545f80516020615c0183398151915293929190829060ff1660058111156134f7576134f76151a7565b6005811115613508576135086151a7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561357a5761357a6151a7565b146135d65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561361a5761361a6151a7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136c685826124e2565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137405760405162461bcd60e51b815260040161068a9061592d565b5f805b600281101561378f576137578160016156ef565b613762906008615666565b61ffff168582815181106137785761377861542e565b016020015160f81c901b9190911790600101613743565b5061ffff8116156137b25760405162461bcd60e51b815260040161068a90615976565b5f805b600481101561380d576137c98160036156ef565b6137d4906008615666565b63ffffffff16866137e6836002615631565b815181106137f6576137f661542e565b016020015160f81c901b91909117906001016137b5565b5063ffffffff81166003146138345760405162461bcd60e51b815260040161068a906159b9565b5f805b60208110156138895761384b81601f6156ef565b613856906008615666565b87613862836006615631565b815181106138725761387261542e565b016020015160f81c901b9190911790600101613837565b505f8660268151811061389e5761389e61542e565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615bc1833981519152816138d784610c6e565b90505f6138e38761217e565b90506138ee87612e70565b61394b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b600281516005811115613960576139606151a7565b146139bf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139d091906156cf565b600485015460408401519192506139f2916001600160401b0390911690615a00565b6001600160401b0316816001600160401b03161115613a715760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a7d8a846124e2565b915091505f8a83604051602001613aab92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b4657613b466151a7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c985760405162461bcd60e51b815260040161068a9061592d565b5f805b6002811015613ce757613caf8160016156ef565b613cba906008615666565b61ffff16858281518110613cd057613cd061542e565b016020015160f81c901b9190911790600101613c9b565b5061ffff811615613d0a5760405162461bcd60e51b815260040161068a90615976565b5f805b6004811015613d6557613d218160036156ef565b613d2c906008615666565b63ffffffff1686613d3e836002615631565b81518110613d4e57613d4e61542e565b016020015160f81c901b9190911790600101613d0d565b5063ffffffff8116600514613d8c5760405162461bcd60e51b815260040161068a906159b9565b5f805b6020811015613de157613da381601f6156ef565b613dae906008615666565b87613dba836006615631565b81518110613dca57613dca61542e565b016020015160f81c901b9190911790600101613d8f565b505f805b6008811015613e4057613df98160076156ef565b613e04906008615666565b6001600160401b031688613e19836026615631565b81518110613e2957613e2961542e565b016020015160f81c901b9190911790600101613de5565b5090969095509350505050565b5f80516020615c018339815191525f6001600160401b038084169085161115613e8157613e7a8385615285565b9050613e8e565b613e8b8484615285565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ef0575060028401548151613eec916001600160401b031690615631565b8210155b15613f16576001600160401b038316606082015281815260408101516020820152613f35565b8281606001818151613f2891906156cf565b6001600160401b03169052505b6060810151613f45906064615a00565b602082015160028601546001600160401b039290921691613f709190600160401b900460ff16615666565b1015613fd45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fef9190615631565b9052506040810180516001600160401b038716919061400f9083906156ef565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c418339815191526020526040812060020180545f80516020615c0183398151915291600160401b9091046001600160401b03169060086140a583615a2b565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661413457604051631afcd79f60e31b815260040160405180910390fd5b565b61413e6140eb565b614147816147a2565b61414f6147bb565b61286f608082013560a083013561416c60e0850160c0860161518e565b61417d610100860160e08701615a46565b61ffff1661419361012087016101008801615a5f565b6141a5610140880161012089016153ce565b6147cb565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615c0183398151915242614254604086016020870161518e565b6001600160401b0316116142c65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142d6604085016020860161518e565b6001600160401b03166142ec6202a30042615631565b1161435f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b83356143b75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143e65760405162461bcd60e51b815260040161068a90615589565b60306143f56040860186615a7f565b90501461445a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614464835f613e4d565b5f806144fe6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a9919061518e565b6001600160401b031681526020016144c460408a018a615a7f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a0f565b5f8281526007860160205260409020919350915061451c8282615b05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145499085906004016152de565b6020604051808303815f875af1158015614565573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061458991906152a5565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614601576146016151a7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e1918e01908e0161518e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147325760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461477b576040519150601f19603f3d011682016040523d82523d5f602084013e614780565b606091505b505090508061214857604051630a12f52160e11b815260040160405180910390fd5b6147aa6140eb565b6147b2614dbe565b61286f81614dc6565b6147c36140eb565b614134614f68565b6147d36140eb565b5f80516020615bc18339815191528361483f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148615760405162461bcd60e51b815260040161068a906158e2565b858711156148c95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff16116149365760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff841611156149a85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a795760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614af057614ab08160016156ef565b614abb906008615666565b5081515f90839083908110614ad257614ad261542e565b60200101906001600160f81b03191690815f1a905350600101614a9c565b505f5b6004811015614b5857614b078160036156ef565b614b12906008615666565b600160ff919091161c60f81b82614b2a836002615631565b81518110614b3a57614b3a61542e565b60200101906001600160f81b03191690815f1a905350600101614af3565b505f5b6020811015614bb55784518160208110614b7757614b7761542e565b1a60f81b82614b87836006615631565b81518110614b9757614b9761542e565b60200101906001600160f81b03191690815f1a905350600101614b5b565b505f5b6020811015614c155784602001518160208110614bd757614bd761542e565b1a60f81b82614be7836026615631565b81518110614bf757614bf761542e565b60200101906001600160f81b03191690815f1a905350600101614bb8565b505f5b6008811015614c8957614c2c8160076156ef565b614c37906008615666565b60ff1685604001516001600160401b0316901c60f81b82826046614c5b9190615631565b81518110614c6b57614c6b61542e565b60200101906001600160f81b03191690815f1a905350600101614c18565b505f5b6030811015614cf45784608001518181518110614cab57614cab61542e565b01602001516001600160f81b03191682614cc683604e615631565b81518110614cd657614cd661542e565b60200101906001600160f81b03191690815f1a905350600101614c8c565b505f5b6008811015614d6657614d0b8160076156ef565b614d16906008615666565b60608601516001600160401b0390811691161c60f81b82614d3883607e615631565b81518110614d4857614d4861542e565b60200101906001600160f81b03191690815f1a905350600101614cf7565b50600281604051614d779190615620565b602060405180830381855afa158015614d92573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614db591906152a5565b94909350915050565b6141346140eb565b614dce6140eb565b80355f80516020615c0183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e1a6080840160608501615a5f565b60ff161115614e875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e986080840160608501615a5f565b60ff1611614f005760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614f106080830160608401615a5f565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f41606083016040840161518e565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b136140eb565b508054614f7c90615702565b5f825580601f10614f8b575050565b601f0160209004905f5260205f209081019061286f9190614fe3565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614ff7575f8155600101614fe4565b5090565b801515811461286f575f80fd5b803563ffffffff81168114612179575f80fd5b5f805f6060848603121561502d575f80fd5b83359250602084013561503f81614ffb565b915061504d60408501615008565b90509250925092565b5f60208284031215615066575f80fd5b5035919050565b5f610140828403121561507e575f80fd5b50919050565b803561ffff81168114612179575f80fd5b80356001600160401b0381168114612179575f80fd5b5f805f606084860312156150bd575f80fd5b83356001600160401b038111156150d2575f80fd5b8401606081870312156150e3575f80fd5b92506150f160208501615084565b915061504d60408501615095565b5f6020828403121561510f575f80fd5b610cb182615008565b5f8060408385031215615129575f80fd5b61513283615008565b946020939093013593505050565b5f8060408385031215615151575f80fd5b82356001600160401b03811115615166575f80fd5b830160808186031215615177575f80fd5b915061518560208401615008565b90509250929050565b5f6020828403121561519e575f80fd5b610cb182615095565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151de57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521960608401826001600160401b03169052565b50608083015161523460808401826001600160401b03169052565b5060a083015161524f60a08401826001600160401b03169052565b5060c083015161526a60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526a5761526a615271565b5f602082840312156152b5575f80fd5b5051919050565b5f5b838110156152d65781810151838201526020016152be565b50505f910152565b602081525f82518060208401526152fc8160408501602087016152bc565b601f01601f19169190910160400192915050565b5f8261532a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461286f575f80fd5b5f602082840312156153de575f80fd5b8135610cb1816153ba565b5f808335601e198436030181126153fe575f80fd5b8301803591506001600160401b03821115615417575f80fd5b6020019150600581901b3603821315612632575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615456575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561549657615496615460565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154c4576154c4615460565b604052919050565b5f6001600160401b038211156154e4576154e4615460565b50601f01601f191660200190565b5f60608236031215615502575f80fd5b61550a615474565b82358152602061551b818501615095565b8183015260408401356001600160401b03811115615537575f80fd5b840136601f820112615547575f80fd5b803561555a615555826154cc565b61549c565b818152368483850101111561556d575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155e2818460208a016152bc565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156128160288401602088016152bc565b016028019695505050505050565b5f82516154568184602087016152bc565b80820180821115610c7e57610c7e615271565b5f63ffffffff80831681810361565c5761565c615271565b6001019392505050565b8082028115828204841417610c7e57610c7e615271565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561526a5761526a615271565b81810381811115610c7e57610c7e615271565b600181811c9082168061571657607f821691505b60208210810361507e57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461578d81615702565b806020870152604060018084165f81146157ae57600181146157ca576157f7565b60ff19851660408a0152604084151560051b8a010195506157f7565b895f5260205f205f5b858110156157ee5781548b82018601529083019088016157d3565b8a016040019650505b509398975050505050505050565b805161217981614ffb565b5f8060408385031215615821575f80fd5b82516001600160401b0380821115615837575f80fd5b908401906060828703121561584a575f80fd5b615852615474565b82518152602080840151615865816153ba565b8282015260408401518381111561587a575f80fd5b80850194505087601f85011261588e575f80fd5b8351925061589e615555846154cc565b83815288828587010111156158b1575f80fd5b6158c0848383018488016152bc565b806040840152508195506158d5818801615805565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a2357615a23615271565b505092915050565b5f6001600160401b0380831681810361565c5761565c615271565b5f60208284031215615a56575f80fd5b610cb182615084565b5f60208284031215615a6f575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a94575f80fd5b8301803591506001600160401b03821115615aad575f80fd5b602001915036819003821315612632575f80fd5b601f82111561214857805f5260205f20601f840160051c81016020851015615ae65750805b601f840160051c820191505b81811015610d51575f8155600101615af2565b81516001600160401b03811115615b1e57615b1e615460565b615b3281615b2c8454615702565b84615ac1565b602080601f831160018114615b65575f8415615b4e5750858301515b5f19600386901b1c1916600185901b178555612f09565b5f85815260208120601f198616915b82811015615b9357888601518255948401946001909101908401615b74565b5085821015615bb057878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", ->>>>>>> origin/staking-contract + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615da2380380615da283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c558061014d5f395ff3fe6080604052600436106101af575f3560e01c806366435abf116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104f8578063c974d1b61461050b578063d5f20ff61461051f578063df93d8de1461054b575f80fd5b8063b771b3bc146104a0578063ba3a4b97146104ba578063bee0a03f146104d9575f80fd5b80638280a25a116100c25780638280a25a1461042f57806393e245981461044357806398f3e2b414610462578063a3a65e4814610481575f80fd5b806366435abf146103de578063732214f8146103fd57806376f7862114610410575f80fd5b806335455ded116101525780635297fae61161012d5780635297fae61461035857806360305d621461037757806361e2f490146103a057806362065856146103bf575f80fd5b806335455ded146102fe57806340034a9314610326578063467ef06f14610339575f80fd5b8063151d30d11161018d578063151d30d11461025057806320e55565146102765780632e2194d814610295578063329c3e12146102cc575f80fd5b80630118acc4146101b35780630322ed98146101d45780630cdd0985146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd36600461500a565b610561565b005b3480156101df575f80fd5b506101d26101ee366004615045565b610a05565b3480156101fe575f80fd5b5061023d61020d366004615045565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b34801561025b575f80fd5b50610264600a81565b60405160ff9091168152602001610247565b348015610281575f80fd5b506101d261029036600461505c565b610bbe565b3480156102a0575f80fd5b506102b46102af366004615045565b610c9b565b6040516001600160401b039091168152602001610247565b3480156102d7575f80fd5b506102e66001600160991b0181565b6040516001600160a01b039091168152602001610247565b348015610309575f80fd5b5061031361271081565b60405161ffff9091168152602001610247565b61023d61033436600461509a565b610cb1565b348015610344575f80fd5b506101d26103533660046150ee565b610ce5565b348015610363575f80fd5b506101d2610372366004615107565b610d85565b348015610382575f80fd5b5061038b601481565b60405163ffffffff9091168152602001610247565b3480156103ab575f80fd5b506101d26103ba36600461512f565b610f5a565b3480156103ca575f80fd5b5061023d6103d936600461517d565b61158e565b3480156103e9575f80fd5b506102b46103f8366004615045565b6115a7565b348015610408575f80fd5b5061023d5f81565b34801561041b575f80fd5b506101d261042a36600461500a565b6115bb565b34801561043a575f80fd5b50610264603081565b34801561044e575f80fd5b506101d261045d366004615045565b6117fe565b34801561046d575f80fd5b506101d261047c366004615107565b611904565b34801561048c575f80fd5b506101d261049b3660046150ee565b611c28565b3480156104ab575f80fd5b506102e66005600160991b0181565b3480156104c5575f80fd5b506101d26104d4366004615045565b611de0565b3480156104e4575f80fd5b506101d26104f3366004615045565b612066565b61023d610506366004615045565b61217a565b348015610516575f80fd5b50610264601481565b34801561052a575f80fd5b5061053e610539366004615045565b6121ab565b60405161024791906151aa565b348015610556575f80fd5b506102b46202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba983398151915293929190829060ff1660048111156105c2576105c2615196565b60048111156105d3576105d3615196565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f610657826121ab565b905060028351600481111561066e5761066e615196565b146106c05760405162461bcd60e51b815260206004820152602a60248201525f80516020615bc98339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146107255760405162461bcd60e51b815260206004820152603360248201525f80516020615bc98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106b7565b6003835280515f90600290600581111561074157610741615196565b03610798578615610759576107568387612273565b90505b5f8460600151836080015161076e919061526d565b905061077a848261250f565b506001600160401b0390811660e0870152421660a0860152506107cc565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107ff866060015161158e565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561087c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a0919061528d565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108df576108df615196565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109f3916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c298339815191526020526040808220815160e0810190925280545f80516020615be983398151915293929190829060ff166005811115610a5257610a52615196565b6005811115610a6357610a63615196565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610ad257610ad2615196565b14610b375760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106b7565b6005600160991b016001600160a01b031663ee5b48eb610b5c8584606001515f612666565b6040518263ffffffff1660e01b8152600401610b7891906152c6565b6020604051808303815f875af1158015610b94573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb8919061528d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610c07575080546001600160401b03808416911610155b15610c255760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c4f8361288b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610cab64e8d4a51000836152f8565b92915050565b5f610cba61289f565b610cc6848484346128d6565b9050610cde60015f80516020615c0983398151915255565b9392505050565b5f80516020615ba98339815191525f80610cfe84612b53565b91509150610d0b82612e9d565b610d155750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d4357610d43615196565b03610d68575f83815260088501602052604081208054919055610d668282612ed8565b505b610d7e81610d79846040015161158e565b612f3e565b5050505050565b5f80516020615ba98339815191525f610d9d84612f51565b90505f80610dae8360400151613117565b50915091505f610dbd836121ab565b9050816001600160401b031681606001516001600160401b03161015610df55760405162461bcd60e51b81526004016106b790615317565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e3a5760405162461bcd60e51b81526004016106b790615359565b60015f87815260068701602052604090205460ff166004811115610e6057610e60615196565b14610ec95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106b7565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615be98339815191529060ff1615610ff75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106b7565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561103a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105e919061528d565b8360200135146110c05760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106b7565b306110d160608501604086016153b6565b6001600160a01b0316146111435760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106b7565b5f61115160608501856153d1565b91505f905084356020860135601461116f6060890160408a016153b6565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561149e575f6111ef60608901896153d1565b8363ffffffff1681811061120557611205615416565b9050602002810190611217919061542a565b611220906154da565b80515f81815260088901602052604090205491925090156112535760405162461bcd60e51b81526004016106b790615571565b84825f01518360200151846040015160405160200161127594939291906155b9565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112c39190615608565b602060405180830381855afa1580156112de573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611301919061528d565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff1916600183600581111561138d5761138d615196565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611440911686615619565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114979061562c565b90506111d3565b50600484018190555f6114b086612f51565b90505f6114c08260400151613352565b9050806002856040516114d39190615608565b602060405180830381855afa1580156114ee573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611511919061528d565b146115755760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106b7565b5050506009909201805460ff1916600117905550505050565b5f610cab6001600160401b03831664e8d4a5100061564e565b5f6115b1826121ab565b6080015192915050565b5f80516020615ba98339815191525f6115d3856134bb565b90506115de85612e9d565b6115e9575050505050565b5f8581526005830160205260409020546001600160a01b031633146116205760405162461bcd60e51b81526004016106b790615665565b5f85815260058301602052604090205460a082015161164f91600160b01b90046001600160401b0316906156b7565b6001600160401b03168160c001516001600160401b031610156116d05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106b7565b8315610d7e575f6116e18685612273565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117389061158e565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156117ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d2919061528d565b5f878152600885016020526040812080549091906117f1908490615619565b9091555050505050505050565b5f80516020615ba98339815191525f611816836121ab565b905060048151600581111561182d5761182d615196565b146118975760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106b7565b5f8381526005830160205260409020546001600160a01b031633146118ce5760405162461bcd60e51b81526004016106b790615665565b5f83815260088301602090815260408083208054908490556005860190925290912054610bb8906001600160a01b031682612ed8565b61190c61289f565b5f80516020615ba98339815191525f61192484612f51565b90505f806119358360400151613117565b50915091505f611944836121ab565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561197e5761197e615196565b600481111561198f5761198f615196565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a735760405162461bcd60e51b81526004016106b790615317565b826001600160401b03168160e001516001600160401b03161115611aa95760405162461bcd60e51b81526004016106b790615359565b600381516004811115611abe57611abe615196565b14611b125760405162461bcd60e51b815260206004820152603160248201525f80516020615bc98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106b7565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b5390600160a01b900461ffff168461564e565b611b5d91906152f8565b905080886008015f8881526020019081526020015f205f828254611b819190615619565b909155505f9050611b9282846156d7565b9050611ba2846020015182612ed8565b611bb78460200151610d79866060015161158e565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611bfd929190918252602082015260400190565b60405180910390a4505050505050505050611c2460015f80516020615c0983398151915255565b5050565b5f80516020615be98339815191525f611c4083612f51565b90505f80611c518360400151613736565b9150915080611cb35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106b7565b5f82815260068501602052604081208054611ccd906156ea565b9050118015611cff575060015f83815260078601602052604090205460ff166005811115611cfd57611cfd615196565b145b611d1b5760405162461bcd60e51b81526004016106b79061571c565b5f8281526006850160205260408120611d3391614f5f565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba983398151915293929190829060ff166004811115611e4157611e41615196565b6004811115611e5257611e52615196565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ed957611ed9615196565b1480611ef75750600381516004811115611ef557611ef5615196565b145b611f4b5760405162461bcd60e51b815260206004820152603260248201525f80516020615bc9833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106b7565b5f611f5982604001516121ab565b905080606001516001600160401b03165f03611fdd5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106b7565b6005600160991b016001600160a01b031663ee5b48eb61200a846040015184606001518560800151612666565b6040518263ffffffff1660e01b815260040161202691906152c6565b6020604051808303815f875af1158015612042573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7e919061528d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020615be98339815191529291906120ae906156ea565b90501180156120e0575060015f83815260078301602052604090205460ff1660058111156120de576120de615196565b145b6120fc5760405162461bcd60e51b81526004016106b79061571c565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916121359190600401615763565b6020604051808303815f875af1158015612151573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612175919061528d565b505050565b5f61218361289f565b61218e8233346138d7565b90506121a660015f80516020615c0983398151915255565b919050565b6121b3614f96565b5f8281525f80516020615c29833981519152602052604090819020815160e0810190925280545f80516020615be9833981519152929190829060ff16600581111561220057612200615196565b600581111561221157612211615196565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156122be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122e591908101906157f8565b91509150806123485760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106b7565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561238b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123af919061528d565b8251146124135760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106b7565b60208201516001600160a01b0316156124895760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106b7565b5f806124988460400151613c8e565b915091508187146125055760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106b7565b9695505050505050565b5f8281525f80516020615c29833981519152602052604081206002015481905f80516020615be983398151915290600160801b90046001600160401b03166125578582613e66565b5f61256187614074565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125b18a858b612666565b6040518263ffffffff1660e01b81526004016125cd91906152c6565b6020604051808303815f875af11580156125e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061260d919061528d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126df5761269f8160016156d7565b6126aa90600861564e565b5081515f908390839081106126c1576126c1615416565b60200101906001600160f81b03191690815f1a90535060010161268b565b505f5b600481101561274a576126f68160036156d7565b61270190600861564e565b600263ffffffff16901c60f81b8282600261271c9190615619565b8151811061272c5761272c615416565b60200101906001600160f81b03191690815f1a9053506001016126e2565b505f5b60208110156127ac5761276181601f6156d7565b61276c90600861564e565b86901c60f81b8261277e836006615619565b8151811061278e5761278e615416565b60200101906001600160f81b03191690815f1a90535060010161274d565b505f5b6008811015612817576127c38160076156d7565b6127ce90600861564e565b6001600160401b038616901c60f81b826127e9836026615619565b815181106127f9576127f9615416565b60200101906001600160f81b03191690815f1a9053506001016127af565b505f5b60088110156128825761282e8160076156d7565b61283990600861564e565b6001600160401b038516901c60f81b8261285483602e615619565b8151811061286457612864615416565b60200101906001600160f81b03191690815f1a90535060010161281a565b50949350505050565b612893614104565b61289c8161414f565b50565b5f80516020615c098339815191528054600119016128d057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ba98339815191529061ffff861610801590612922575061271061ffff861611155b61293e5760405162461bcd60e51b81526004016106b7906158ca565b60028101546001600160401b0390811690851610156129b75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106b7565b8054831015612a1a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106b7565b8060010154831115612a815760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106b7565b825f612a8c82610c9b565b90505f612a9989836141c1565b90506040518060600160405280612aad3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c0983398151915255565b5f612b5c614f96565b5f80516020615be98339815191525f612b7485612f51565b90505f80612b858360400151613736565b915091508015612bea5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106b7565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612c1b57612c1b615196565b6005811115612c2c57612c2c615196565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c9d57612c9d615196565b1480612cbb5750600182516005811115612cb957612cb9615196565b145b612d1a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106b7565b600382516005811115612d2f57612d2f615196565b03612d3c57506004612d40565b5060055b6020808301515f90815260088801909152604081205581816005811115612d6957612d69615196565b90816005811115612d7c57612d7c615196565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115612db057612db0615196565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e6457612e64615196565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612f24575f80fd5b505af1158015612f36573d5f803e3d5ffd5b505050505050565b611c246001600160a01b03831682614725565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612fb5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fdc91908101906157f8565b915091508061303c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106b7565b81511561309d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106b7565b60208201516001600160a01b0316156131105760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106b7565b5092915050565b5f805f835160361461313b5760405162461bcd60e51b81526004016106b790615915565b5f805b600281101561318a576131528160016156d7565b61315d90600861564e565b61ffff1686828151811061317357613173615416565b016020015160f81c901b919091179060010161313e565b5061ffff8116156131ad5760405162461bcd60e51b81526004016106b79061595e565b5f805b6004811015613208576131c48160036156d7565b6131cf90600861564e565b63ffffffff16876131e1836002615619565b815181106131f1576131f1615416565b016020015160f81c901b91909117906001016131b0565b5063ffffffff811660041461322f5760405162461bcd60e51b81526004016106b7906159a1565b5f805b60208110156132845761324681601f6156d7565b61325190600861564e565b8861325d836006615619565b8151811061326d5761326d615416565b016020015160f81c901b9190911790600101613232565b505f805b60088110156132e35761329c8160076156d7565b6132a790600861564e565b6001600160401b0316896132bc836026615619565b815181106132cc576132cc615416565b016020015160f81c901b9190911790600101613288565b505f805b6008811015613342576132fb8160076156d7565b61330690600861564e565b6001600160401b03168a61331b83602e615619565b8151811061332b5761332b615416565b016020015160f81c901b91909117906001016132e7565b5091989097509095509350505050565b5f81516026146133745760405162461bcd60e51b81526004016106b790615915565b5f805b60028110156133c35761338b8160016156d7565b61339690600861564e565b61ffff168482815181106133ac576133ac615416565b016020015160f81c901b9190911790600101613377565b5061ffff8116156133e65760405162461bcd60e51b81526004016106b79061595e565b5f805b6004811015613441576133fd8160036156d7565b61340890600861564e565b63ffffffff168561341a836002615619565b8151811061342a5761342a615416565b016020015160f81c901b91909117906001016133e9565b5063ffffffff8116156134665760405162461bcd60e51b81526004016106b7906159a1565b5f805b60208110156128825761347d81601f6156d7565b61348890600861564e565b86613494836006615619565b815181106134a4576134a4615416565b016020015160f81c901b9190911790600101613469565b6134c3614f96565b5f8281525f80516020615c298339815191526020526040808220815160e0810190925280545f80516020615be983398151915293929190829060ff16600581111561351057613510615196565b600581111561352157613521615196565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561359357613593615196565b146135ef5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106b7565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561363357613633615196565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136df858261250f565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137595760405162461bcd60e51b81526004016106b790615915565b5f805b60028110156137a8576137708160016156d7565b61377b90600861564e565b61ffff1685828151811061379157613791615416565b016020015160f81c901b919091179060010161375c565b5061ffff8116156137cb5760405162461bcd60e51b81526004016106b79061595e565b5f805b6004811015613826576137e28160036156d7565b6137ed90600861564e565b63ffffffff16866137ff836002615619565b8151811061380f5761380f615416565b016020015160f81c901b91909117906001016137ce565b5063ffffffff811660031461384d5760405162461bcd60e51b81526004016106b7906159a1565b5f805b60208110156138a25761386481601f6156d7565b61386f90600861564e565b8761387b836006615619565b8151811061388b5761388b615416565b016020015160f81c901b9190911790600101613850565b505f866026815181106138b7576138b7615416565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ba9833981519152816138f084610c9b565b90505f6138fc876121ab565b905061390787612e9d565b6139645760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106b7565b60028151600581111561397957613979615196565b146139d85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106b7565b5f8282608001516139e991906156b7565b60048501546040840151919250613a0b916001600160401b03909116906159e8565b6001600160401b0316816001600160401b03161115613a8a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106b7565b5f80613a968a8461250f565b915091505f8a83604051602001613ac492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b5f57613b5f615196565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613cb15760405162461bcd60e51b81526004016106b790615915565b5f805b6002811015613d0057613cc88160016156d7565b613cd390600861564e565b61ffff16858281518110613ce957613ce9615416565b016020015160f81c901b9190911790600101613cb4565b5061ffff811615613d235760405162461bcd60e51b81526004016106b79061595e565b5f805b6004811015613d7e57613d3a8160036156d7565b613d4590600861564e565b63ffffffff1686613d57836002615619565b81518110613d6757613d67615416565b016020015160f81c901b9190911790600101613d26565b5063ffffffff8116600514613da55760405162461bcd60e51b81526004016106b7906159a1565b5f805b6020811015613dfa57613dbc81601f6156d7565b613dc790600861564e565b87613dd3836006615619565b81518110613de357613de3615416565b016020015160f81c901b9190911790600101613da8565b505f805b6008811015613e5957613e128160076156d7565b613e1d90600861564e565b6001600160401b031688613e32836026615619565b81518110613e4257613e42615416565b016020015160f81c901b9190911790600101613dfe565b5090969095509350505050565b5f80516020615be98339815191525f6001600160401b038084169085161115613e9a57613e93838561526d565b9050613ea7565b613ea4848461526d565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613f09575060018401548151613f05916001600160401b031690615619565b8210155b15613f2f576001600160401b038316606082015281815260408101516020820152613f4e565b8281606001818151613f4191906156b7565b6001600160401b03169052505b6060810151613f5e9060646159e8565b602082015160018601546001600160401b039290921691613f899190600160401b900460ff1661564e565b1015613fed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106b7565b856001600160401b0316816040018181516140089190615619565b9052506040810180516001600160401b03871691906140289083906156d7565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c298339815191526020526040812060020180545f80516020615be983398151915291600160401b9091046001600160401b03169060086140be83615a13565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661414d57604051631afcd79f60e31b815260040160405180910390fd5b565b614157614104565b614160816147b8565b6141686147d1565b61289c6060820135608083013561418560c0850160a0860161517d565b61419560e0860160c08701615a2e565b61ffff166141aa610100870160e08801615a47565b6141bc610120880161010089016153b6565b6147e1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661424c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106b7565b5f80516020615be98339815191524261426b604086016020870161517d565b6001600160401b0316116142dd5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106b7565b6142ed604085016020860161517d565b6001600160401b03166143036202a30042615619565b116143765760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106b7565b83356143ce5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106b7565b83355f908152600882016020526040902054156143fd5760405162461bcd60e51b81526004016106b790615571565b603061440c6040860186615a67565b9050146144715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106b7565b61447b835f613e66565b5f806145146040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906144bf919061517d565b6001600160401b031681526020016144da60408a018a615a67565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a25565b5f828152600686016020526040902091935091506145328282615aed565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061455f9085906004016152c6565b6020604051808303815f875af115801561457b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061459f919061528d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561461757614617615196565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146f7918e01908e0161517d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147485760405163cd78605960e01b81523060048201526024016106b7565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614791576040519150601f19603f3d011682016040523d82523d5f602084013e614796565b606091505b505090508061217557604051630a12f52160e11b815260040160405180910390fd5b6147c0614104565b6147c8614dd4565b61289c81614ddc565b6147d9614104565b61414d614f57565b6147e9614104565b5f80516020615ba9833981519152836148555760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106b7565b6127108411156148775760405162461bcd60e51b81526004016106b7906158ca565b858711156148df5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106b7565b5f8360ff161161494c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106b7565b600a60ff841611156149be5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106b7565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a8f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106b7565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614b0657614ac68160016156d7565b614ad190600861564e565b5081515f90839083908110614ae857614ae8615416565b60200101906001600160f81b03191690815f1a905350600101614ab2565b505f5b6004811015614b6e57614b1d8160036156d7565b614b2890600861564e565b600160ff919091161c60f81b82614b40836002615619565b81518110614b5057614b50615416565b60200101906001600160f81b03191690815f1a905350600101614b09565b505f5b6020811015614bcb5784518160208110614b8d57614b8d615416565b1a60f81b82614b9d836006615619565b81518110614bad57614bad615416565b60200101906001600160f81b03191690815f1a905350600101614b71565b505f5b6020811015614c2b5784602001518160208110614bed57614bed615416565b1a60f81b82614bfd836026615619565b81518110614c0d57614c0d615416565b60200101906001600160f81b03191690815f1a905350600101614bce565b505f5b6008811015614c9f57614c428160076156d7565b614c4d90600861564e565b60ff1685604001516001600160401b0316901c60f81b82826046614c719190615619565b81518110614c8157614c81615416565b60200101906001600160f81b03191690815f1a905350600101614c2e565b505f5b6030811015614d0a5784608001518181518110614cc157614cc1615416565b01602001516001600160f81b03191682614cdc83604e615619565b81518110614cec57614cec615416565b60200101906001600160f81b03191690815f1a905350600101614ca2565b505f5b6008811015614d7c57614d218160076156d7565b614d2c90600861564e565b60608601516001600160401b0390811691161c60f81b82614d4e83607e615619565b81518110614d5e57614d5e615416565b60200101906001600160f81b03191690815f1a905350600101614d0d565b50600281604051614d8d9190615608565b602060405180830381855afa158015614da8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614dcb919061528d565b94909350915050565b61414d614104565b614de4614104565b80355f80516020615be98339815191529081556014614e096060840160408501615a47565b60ff161115614e765760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106b7565b5f614e876060840160408501615a47565b60ff1611614eef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106b7565b614eff6060830160408401615a47565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f30604083016020840161517d565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b40614104565b508054614f6b906156ea565b5f825580601f10614f7a575050565b601f0160209004905f5260205f209081019061289c9190614fd2565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fe6575f8155600101614fd3565b5090565b801515811461289c575f80fd5b803563ffffffff811681146121a6575f80fd5b5f805f6060848603121561501c575f80fd5b83359250602084013561502e81614fea565b915061503c60408501614ff7565b90509250925092565b5f60208284031215615055575f80fd5b5035919050565b5f610120828403121561506d575f80fd5b50919050565b803561ffff811681146121a6575f80fd5b80356001600160401b03811681146121a6575f80fd5b5f805f606084860312156150ac575f80fd5b83356001600160401b038111156150c1575f80fd5b8401606081870312156150d2575f80fd5b92506150e060208501615073565b915061503c60408501615084565b5f602082840312156150fe575f80fd5b610cde82614ff7565b5f8060408385031215615118575f80fd5b61512183614ff7565b946020939093013593505050565b5f8060408385031215615140575f80fd5b82356001600160401b03811115615155575f80fd5b830160808186031215615166575f80fd5b915061517460208401614ff7565b90509250929050565b5f6020828403121561518d575f80fd5b610cde82615084565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151cd57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161520860608401826001600160401b03169052565b50608083015161522360808401826001600160401b03169052565b5060a083015161523e60a08401826001600160401b03169052565b5060c083015161311060c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561311057613110615259565b5f6020828403121561529d575f80fd5b5051919050565b5f5b838110156152be5781810151838201526020016152a6565b50505f910152565b602081525f82518060208401526152e48160408501602087016152a4565b601f01601f19169190910160400192915050565b5f8261531257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461289c575f80fd5b5f602082840312156153c6575f80fd5b8135610cde816153a2565b5f808335601e198436030181126153e6575f80fd5b8301803591506001600160401b038211156153ff575f80fd5b6020019150600581901b360382131561265f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261543e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561547e5761547e615448565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154ac576154ac615448565b604052919050565b5f6001600160401b038211156154cc576154cc615448565b50601f01601f191660200190565b5f606082360312156154ea575f80fd5b6154f261545c565b823581526020615503818501615084565b8183015260408401356001600160401b0381111561551f575f80fd5b840136601f82011261552f575f80fd5b803561554261553d826154b4565b615484565b8181523684838501011115615555575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155ca818460208a016152a4565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155fa8160288401602088016152a4565b016028019695505050505050565b5f825161543e8184602087016152a4565b80820180821115610cab57610cab615259565b5f63ffffffff80831681810361564457615644615259565b6001019392505050565b8082028115828204841417610cab57610cab615259565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561311057613110615259565b81810381811115610cab57610cab615259565b600181811c908216806156fe57607f821691505b60208210810361506d57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615775816156ea565b806020870152604060018084165f811461579657600181146157b2576157df565b60ff19851660408a0152604084151560051b8a010195506157df565b895f5260205f205f5b858110156157d65781548b82018601529083019088016157bb565b8a016040019650505b509398975050505050505050565b80516121a681614fea565b5f8060408385031215615809575f80fd5b82516001600160401b038082111561581f575f80fd5b9084019060608287031215615832575f80fd5b61583a61545c565b8251815260208084015161584d816153a2565b82820152604084015183811115615862575f80fd5b80850194505087601f850112615876575f80fd5b8351925061588661553d846154b4565b8381528882858701011115615899575f80fd5b6158a8848383018488016152a4565b806040840152508195506158bd8188016157ed565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0b57615a0b615259565b505092915050565b5f6001600160401b0380831681810361564457615644615259565b5f60208284031215615a3e575f80fd5b610cde82615073565b5f60208284031215615a57575f80fd5b813560ff81168114610cde575f80fd5b5f808335601e19843603018112615a7c575f80fd5b8301803591506001600160401b03821115615a95575f80fd5b60200191503681900382131561265f575f80fd5b601f82111561217557805f5260205f20601f840160051c81016020851015615ace5750805b601f840160051c820191505b81811015610d7e575f8155600101615ada565b81516001600160401b03811115615b0657615b06615448565b615b1a81615b1484546156ea565b84615aa9565b602080601f831160018114615b4d575f8415615b365750858301515b5f19600386901b1c1916600185901b178555612f36565b5f85815260208120601f198616915b82811015615b7b57888601518255948401946001909101908401615b5c565b5085821015615b9857878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -444,39 +439,54 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) MAXIMU return _NativeTokenStakingManager.Contract.MAXIMUMSTAKEMULTIPLIERLIMIT(&_NativeTokenStakingManager.CallOpts) } -<<<<<<< HEAD -// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. // -// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) PCHAINBLOCKCHAINID(opts *bind.CallOpts) ([32]byte, error) { +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) NATIVEMINTER(opts *bind.CallOpts) (common.Address, error) { var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "P_CHAIN_BLOCKCHAIN_ID") + err := _NativeTokenStakingManager.contract.Call(opts, &out, "NATIVE_MINTER") if err != nil { - return *new([32]byte), err + return *new(common.Address), err } - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) -======= + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + // NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. // // Solidity: function NATIVE_MINTER() view returns(address) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) NATIVEMINTER(opts *bind.CallOpts) (common.Address, error) { +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) NATIVEMINTER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) +} + +// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. +// +// Solidity: function NATIVE_MINTER() view returns(address) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) NATIVEMINTER() (common.Address, error) { + return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) +} + +// PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. +// +// Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) PCHAINBLOCKCHAINID(opts *bind.CallOpts) ([32]byte, error) { var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "NATIVE_MINTER") + err := _NativeTokenStakingManager.contract.Call(opts, &out, "P_CHAIN_BLOCKCHAIN_ID") if err != nil { - return *new(common.Address), err + return *new([32]byte), err } - out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) ->>>>>>> origin/staking-contract + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) return out0, err } -<<<<<<< HEAD // PCHAINBLOCKCHAINID is a free data retrieval call binding the contract method 0x732214f8. // // Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) @@ -489,20 +499,6 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) PCHAINBLOCKC // Solidity: function P_CHAIN_BLOCKCHAIN_ID() view returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) PCHAINBLOCKCHAINID() ([32]byte, error) { return _NativeTokenStakingManager.Contract.PCHAINBLOCKCHAINID(&_NativeTokenStakingManager.CallOpts) -======= -// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. -// -// Solidity: function NATIVE_MINTER() view returns(address) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) NATIVEMINTER() (common.Address, error) { - return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) -} - -// NATIVEMINTER is a free data retrieval call binding the contract method 0x329c3e12. -// -// Solidity: function NATIVE_MINTER() view returns(address) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) NATIVEMINTER() (common.Address, error) { - return _NativeTokenStakingManager.Contract.NATIVEMINTER(&_NativeTokenStakingManager.CallOpts) ->>>>>>> origin/staking-contract } // WARPMESSENGER is a free data retrieval call binding the contract method 0xb771b3bc. diff --git a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go index 22c60bc31..f4c1dcc29 100644 --- a/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/staking/PoAValidatorManager/PoAValidatorManager.go @@ -71,13 +71,8 @@ type ValidatorRegistrationInput struct { // PoAValidatorManagerMetaData contains all meta data concerning the PoAValidatorManager contract. var PoAValidatorManagerMetaData = &bind.MetaData{ -<<<<<<< HEAD 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161394238038061394283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6137f58061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c80638da5cb5b116100a9578063c974d1b61161006e578063c974d1b6146102c6578063d588c18f146102ce578063d5f20ff6146102e1578063df93d8de14610301578063f2fde38b1461030b575f80fd5b80638da5cb5b1461023b57806397fb70d41461027f578063a3a65e4814610292578063b771b3bc146102a5578063bee0a03f146102b3575f80fd5b806366435abf116100ef57806366435abf146101d4578063715018a6146101ff578063732214f8146102075780638280a25a1461020e5780638994ab4914610228575f80fd5b80630322ed981461012b5780630cdd098514610140578063467ef06f1461019157806360305d62146101a457806361e2f490146101c1575b5f80fd5b61013e610139366004612d8e565b61031e565b005b61017e61014e366004612d8e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61013e61019f366004612dbd565b6104dc565b6101ac601481565b60405163ffffffff9091168152602001610188565b61013e6101cf366004612dd6565b6104ea565b6101e76101e2366004612d8e565b610b1e565b6040516001600160401b039091168152602001610188565b61013e610b32565b61017e5f81565b610216603081565b60405160ff9091168152602001610188565b61017e610236366004612e50565b610b45565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610188565b61013e61028d366004612d8e565b610b61565b61013e6102a0366004612dbd565b610b75565b6102676005600160991b0181565b61013e6102c1366004612d8e565b610d2d565b610216601481565b61013e6102dc366004612ea5565b610e3c565b6102f46102ef366004612d8e565b610f4a565b6040516101889190612eef565b6101e76202a30081565b61013e610319366004612f9e565b61103d565b5f8181525f805160206137c98339815191526020526040808220815160e0810190925280545f805160206137a983398151915293929190829060ff16600581111561036b5761036b612edb565b600581111561037c5761037c612edb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb612edb565b146104555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61047a8584606001515f611077565b6040518263ffffffff1660e01b81526004016104969190612fe2565b6020604051808303815f875af11580156104b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d69190613014565b50505050565b6104e58161129c565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206137a98339815191529060ff16156105875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161044c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ee9190613014565b8360200135146106505760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161044c565b306106616060850160408601612f9e565b6001600160a01b0316146106d35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161044c565b5f6106e1606085018561302b565b91505f90508435602086013560146106ff6060890160408a01612f9e565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610a2e575f61077f606089018961302b565b8363ffffffff1681811061079557610795613070565b90506020028101906107a79190613084565b6107b090613134565b80515f81815260088901602052604090205491925090156107e35760405162461bcd60e51b815260040161044c906131cb565b84825f0151836020015184604001516040516020016108059493929190613213565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916108539190613262565b602060405180830381855afa15801561086e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108919190613014565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff1916600183600581111561091d5761091d612edb565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516109d0911686613287565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610a279061329a565b9050610763565b50600484018190555f610a4086611614565b90505f610a5082604001516117da565b905080600285604051610a639190613262565b602060405180830381855afa158015610a7e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aa19190613014565b14610b055760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161044c565b5050506009909201805460ff1916600117905550505050565b5f610b2882610f4a565b6080015192915050565b610b3a611943565b610b435f61199e565b565b5f610b4e611943565b610b588383611a0e565b90505b92915050565b610b69611943565b610b7281611f72565b50565b5f805160206137a98339815191525f610b8d83611614565b90505f80610b9e83604001516121e3565b9150915080610c005760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044c565b5f82815260068501602052604081208054610c1a906132bc565b9050118015610c4c575060015f83815260078601602052604090205460ff166005811115610c4a57610c4a612edb565b145b610c685760405162461bcd60e51b815260040161044c906132ee565b5f8281526006850160205260408120610c8091612d44565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f805160206137a9833981519152929190610d75906132bc565b9050118015610da7575060015f83815260078301602052604090205460ff166005811115610da557610da5612edb565b145b610dc35760405162461bcd60e51b815260040161044c906132ee565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dfc9190600401613335565b6020604051808303815f875af1158015610e18573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e59190613014565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610e805750825b90505f826001600160401b03166001148015610e9b5750303b155b905081158015610ea9575080155b15610ec75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ef157845460ff60401b1916600160401b1785555b610efb8787612384565b8315610f4157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b6040805160e080820183525f8083526020808401829052838501829052606084018290526080840182905260a0840182905260c084018290528582525f805160206137c983398151915290528390208351918201909352825491925f805160206137a983398151915292829060ff166005811115610fca57610fca612edb565b6005811115610fdb57610fdb612edb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b611045611943565b6001600160a01b03811661106e57604051631e4fbdf760e01b81525f600482015260240161044c565b610b728161199e565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110f0576110b08160016133bf565b6110bb9060086133d2565b5081515f908390839081106110d2576110d2613070565b60200101906001600160f81b03191690815f1a90535060010161109c565b505f5b600481101561115b576111078160036133bf565b6111129060086133d2565b600263ffffffff16901c60f81b8282600261112d9190613287565b8151811061113d5761113d613070565b60200101906001600160f81b03191690815f1a9053506001016110f3565b505f5b60208110156111bd5761117281601f6133bf565b61117d9060086133d2565b86901c60f81b8261118f836006613287565b8151811061119f5761119f613070565b60200101906001600160f81b03191690815f1a90535060010161115e565b505f5b6008811015611228576111d48160076133bf565b6111df9060086133d2565b6001600160401b038616901c60f81b826111fa836026613287565b8151811061120a5761120a613070565b60200101906001600160f81b03191690815f1a9053506001016111c0565b505f5b60088110156112935761123f8160076133bf565b61124a9060086133d2565b6001600160401b038516901c60f81b8261126583602e613287565b8151811061127557611275613070565b60200101906001600160f81b03191690815f1a90535060010161122b565b50949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290525f805160206137a98339815191525f6112eb85611614565b90505f806112fc83604001516121e3565b9150915080156113615760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044c565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561139257611392612edb565b60058111156113a3576113a3612edb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561141457611414612edb565b1480611432575060018251600581111561143057611430612edb565b145b6114915760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044c565b6003825160058111156114a6576114a6612edb565b036114b3575060046114b7565b5060055b6020808301515f908152600888019091526040812055818160058111156114e0576114e0612edb565b908160058111156114f3576114f3612edb565b9052505f84815260078701602052604090208251815484929190829060ff1916600183600581111561152757611527612edb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156115db576115db612edb565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611678573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261169f91908101906133f8565b91509150806116ff5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161044c565b8151156117605760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044c565b60208201516001600160a01b0316156117d35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044c565b5092915050565b5f81516026146117fc5760405162461bcd60e51b815260040161044c906134ca565b5f805b600281101561184b576118138160016133bf565b61181e9060086133d2565b61ffff1684828151811061183457611834613070565b016020015160f81c901b91909117906001016117ff565b5061ffff81161561186e5760405162461bcd60e51b815260040161044c90613513565b5f805b60048110156118c9576118858160036133bf565b6118909060086133d2565b63ffffffff16856118a2836002613287565b815181106118b2576118b2613070565b016020015160f81c901b9190911790600101611871565b5063ffffffff8116156118ee5760405162461bcd60e51b815260040161044c90613556565b5f805b60208110156112935761190581601f6133bf565b6119109060086133d2565b8661191c836006613287565b8151811061192c5761192c613070565b016020015160f81c901b91909117906001016118f1565b336119757f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b435760405163118cdaa760e01b815233600482015260240161044c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611a995760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161044c565b5f805160206137a983398151915242611ab8604086016020870161359d565b6001600160401b031611611b2a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161044c565b611b3a604085016020860161359d565b6001600160401b0316611b506202a30042613287565b11611bc35760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161044c565b8335611c1b5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044c565b83355f90815260088201602052604090205415611c4a5760405162461bcd60e51b815260040161044c906131cb565b6030611c5960408601866135b6565b905014611cbe5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044c565b611cc8835f6123a2565b5f80611d616040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611d0c919061359d565b6001600160401b03168152602001611d2760408a018a6135b6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506125b0565b5f82815260068601602052604090209193509150611d7f8282613643565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611dac908590600401612fe2565b6020604051808303815f875af1158015611dc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dec9190613014565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115611e6457611e64612edb565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f44918e01908e0161359d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8181525f805160206137c98339815191526020526040808220815160e0810190925280545f805160206137a983398151915293929190829060ff166005811115611fbf57611fbf612edb565b6005811115611fd057611fd0612edb565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561204257612042612edb565b1461209e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044c565b60038152426001600160401b031660c08201525f83815260078301602052604090208151815483929190829060ff191660018360058111156120e2576120e2612edb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61218e848261295f565b6080840151604080516001600160401b03909216825242602083015291935083925086917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a350505050565b5f8082516027146122065760405162461bcd60e51b815260040161044c906134ca565b5f805b60028110156122555761221d8160016133bf565b6122289060086133d2565b61ffff1685828151811061223e5761223e613070565b016020015160f81c901b9190911790600101612209565b5061ffff8116156122785760405162461bcd60e51b815260040161044c90613513565b5f805b60048110156122d35761228f8160036133bf565b61229a9060086133d2565b63ffffffff16866122ac836002613287565b815181106122bc576122bc613070565b016020015160f81c901b919091179060010161227b565b5063ffffffff81166003146122fa5760405162461bcd60e51b815260040161044c90613556565b5f805b602081101561234f5761231181601f6133bf565b61231c9060086133d2565b87612328836006613287565b8151811061233857612338613070565b016020015160f81c901b91909117906001016122fd565b505f8660268151811061236457612364613070565b016020015191976001600160f81b03199092161515965090945050505050565b61238c612ab6565b61239582612aff565b61239e81612b18565b5050565b5f805160206137a98339815191525f6001600160401b0380841690851611156123d6576123cf8385613702565b90506123e3565b6123e08484613702565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580612445575060018401548151612441916001600160401b031690613287565b8210155b1561246b576001600160401b03831660608201528181526040810151602082015261248a565b828160600181815161247d9190613722565b6001600160401b03169052505b606081015161249a906064613742565b602082015160018601546001600160401b0392909216916124c59190600160401b900460ff166133d2565b10156125295760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161044c565b856001600160401b0316816040018181516125449190613287565b9052506040810180516001600160401b03871691906125649083906133bf565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f606082608001515160301461261a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612691576126518160016133bf565b61265c9060086133d2565b5081515f9083908390811061267357612673613070565b60200101906001600160f81b03191690815f1a90535060010161263d565b505f5b60048110156126f9576126a88160036133bf565b6126b39060086133d2565b600160ff919091161c60f81b826126cb836002613287565b815181106126db576126db613070565b60200101906001600160f81b03191690815f1a905350600101612694565b505f5b6020811015612756578451816020811061271857612718613070565b1a60f81b82612728836006613287565b8151811061273857612738613070565b60200101906001600160f81b03191690815f1a9053506001016126fc565b505f5b60208110156127b6578460200151816020811061277857612778613070565b1a60f81b82612788836026613287565b8151811061279857612798613070565b60200101906001600160f81b03191690815f1a905350600101612759565b505f5b600881101561282a576127cd8160076133bf565b6127d89060086133d2565b60ff1685604001516001600160401b0316901c60f81b828260466127fc9190613287565b8151811061280c5761280c613070565b60200101906001600160f81b03191690815f1a9053506001016127b9565b505f5b6030811015612895578460800151818151811061284c5761284c613070565b01602001516001600160f81b0319168261286783604e613287565b8151811061287757612877613070565b60200101906001600160f81b03191690815f1a90535060010161282d565b505f5b6008811015612907576128ac8160076133bf565b6128b79060086133d2565b60608601516001600160401b0390811691161c60f81b826128d983607e613287565b815181106128e9576128e9613070565b60200101906001600160f81b03191690815f1a905350600101612898565b506002816040516129189190613262565b602060405180830381855afa158015612933573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129569190613014565b94909350915050565b5f8281525f805160206137c9833981519152602052604081206002015481905f805160206137a983398151915290600160801b90046001600160401b03166129a785826123a2565b5f6129b187612b29565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb612a018a858b611077565b6040518263ffffffff1660e01b8152600401612a1d9190612fe2565b6020604051808303815f875af1158015612a39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a5d9190613014565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b4357604051631afcd79f60e31b815260040160405180910390fd5b612b07612ab6565b612b0f612bb9565b610b7281612bc1565b612b20612ab6565b610b7281612d3c565b5f8181525f805160206137c98339815191526020526040812060020180545f805160206137a983398151915291600160401b9091046001600160401b0316906008612b738361376d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b610b43612ab6565b612bc9612ab6565b80355f805160206137a98339815191529081556014612bee6060840160408501613788565b60ff161115612c5b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161044c565b5f612c6c6060840160408501613788565b60ff1611612cd45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161044c565b612ce46060830160408401613788565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612d15604083016020840161359d565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b611045612ab6565b508054612d50906132bc565b5f825580601f10612d5f575050565b601f0160209004905f5260205f2090810190610b7291905b80821115612d8a575f8155600101612d77565b5090565b5f60208284031215612d9e575f80fd5b5035919050565b803563ffffffff81168114612db8575f80fd5b919050565b5f60208284031215612dcd575f80fd5b610b5882612da5565b5f8060408385031215612de7575f80fd5b82356001600160401b03811115612dfc575f80fd5b830160808186031215612e0d575f80fd5b9150612e1b60208401612da5565b90509250929050565b5f60608284031215612e34575f80fd5b50919050565b80356001600160401b0381168114612db8575f80fd5b5f8060408385031215612e61575f80fd5b82356001600160401b03811115612e76575f80fd5b612e8285828601612e24565b925050612e1b60208401612e3a565b6001600160a01b0381168114610b72575f80fd5b5f8060808385031215612eb6575f80fd5b612ec08484612e24565b91506060830135612ed081612e91565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f1257634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f4d60608401826001600160401b03169052565b506080830151612f6860808401826001600160401b03169052565b5060a0830151612f8360a08401826001600160401b03169052565b5060c08301516117d360c08401826001600160401b03169052565b5f60208284031215612fae575f80fd5b8135612fb981612e91565b9392505050565b5f5b83811015612fda578181015183820152602001612fc2565b50505f910152565b602081525f8251806020840152613000816040850160208701612fc0565b601f01601f19169190910160400192915050565b5f60208284031215613024575f80fd5b5051919050565b5f808335601e19843603018112613040575f80fd5b8301803591506001600160401b03821115613059575f80fd5b6020019150600581901b3603821315612aaf575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112613098575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130d8576130d86130a2565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613106576131066130a2565b604052919050565b5f6001600160401b03821115613126576131266130a2565b50601f01601f191660200190565b5f60608236031215613144575f80fd5b61314c6130b6565b82358152602061315d818501612e3a565b8183015260408401356001600160401b03811115613179575f80fd5b840136601f820112613189575f80fd5b803561319c6131978261310e565b6130de565b81815236848385010111156131af575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551613224818460208a01612fc0565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613254816028840160208801612fc0565b016028019695505050505050565b5f8251613098818460208701612fc0565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b5b57610b5b613273565b5f63ffffffff8083168181036132b2576132b2613273565b6001019392505050565b600181811c908216806132d057607f821691505b602082108103612e3457634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613347816132bc565b806020870152604060018084165f81146133685760018114613384576133b1565b60ff19851660408a0152604084151560051b8a010195506133b1565b895f5260205f205f5b858110156133a85781548b820186015290830190880161338d565b8a016040019650505b509398975050505050505050565b81810381811115610b5b57610b5b613273565b8082028115828204841417610b5b57610b5b613273565b80518015158114612db8575f80fd5b5f8060408385031215613409575f80fd5b82516001600160401b038082111561341f575f80fd5b9084019060608287031215613432575f80fd5b61343a6130b6565b8251815260208084015161344d81612e91565b82820152604084015183811115613462575f80fd5b80850194505087601f850112613476575f80fd5b835192506134866131978461310e565b8381528882858701011115613499575f80fd5b6134a884838301848801612fc0565b806040840152508195506134bd8188016133e9565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156135ad575f80fd5b610b5882612e3a565b5f808335601e198436030181126135cb575f80fd5b8301803591506001600160401b038211156135e4575f80fd5b602001915036819003821315612aaf575f80fd5b601f8211156104e557805f5260205f20601f840160051c8101602085101561361d5750805b601f840160051c820191505b8181101561363c575f8155600101613629565b5050505050565b81516001600160401b0381111561365c5761365c6130a2565b6136708161366a84546132bc565b846135f8565b602080601f8311600181146136a3575f841561368c5750858301515b5f19600386901b1c1916600185901b1785556136fa565b5f85815260208120601f198616915b828110156136d1578886015182559484019460019091019084016136b2565b50858210156136ee57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b038281168282160390808211156117d3576117d3613273565b6001600160401b038181168382160190808211156117d3576117d3613273565b6001600160401b0381811683821602808216919082811461376557613765613273565b505092915050565b5f6001600160401b038083168181036132b2576132b2613273565b5f60208284031215613798575f80fd5b813560ff81168114612fb9575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", -======= - 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161396538038061396583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138188061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e366004612daa565b61030c565b005b610173610143366004612daa565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610133610194366004612dd9565b6104ca565b6101336101a7366004612e1c565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004612e52565b6105e6565b6101ef6101ea366004612daa565b610c1a565b6040516001600160401b03909116815260200161017d565b610133610c2e565b610217603081565b60405160ff909116815260200161017d565b610173610237366004612eb2565b610c41565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e366004612daa565b610c5d565b6101336102a1366004612dd9565b610c72565b6102686005600160991b0181565b6101336102c2366004612daa565b610e2a565b610217601481565b6102e26102dd366004612daa565b610f39565b60405161017d9190612f0b565b6101ef6202a30081565b610133610307366004612fc1565b611001565b5f8181525f805160206137ec8339815191526020526040808220815160e0810190925280545f805160206137cc83398151915293929190829060ff16600581111561035957610359612ef7565b600581111561036a5761036a612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d9612ef7565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f61103e565b6040518263ffffffff1660e01b81526004016104849190613005565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c49190613037565b50505050565b6104d381611263565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b61059787876115ad565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206137cc8339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea9190613037565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d6060850160408601612fc1565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd606085018561304e565b91505f90508435602086013560146107fb6060890160408a01612fc1565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610b2a575f61087b606089018961304e565b8363ffffffff1681811061089157610891613093565b90506020028101906108a391906130a7565b6108ac90613157565b80515f81815260098901602052604090205491925090156108df5760405162461bcd60e51b815260040161043a906131ee565b84825f0151836020015184604001516040516020016109019493929190613236565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161094f9190613285565b602060405180830381855afa15801561096a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061098d9190613037565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610a1957610a19612ef7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610acc9116866132aa565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610b23906132bd565b905061085f565b50600584018190555f610b3c866115c7565b90505f610b4c82604001516117a1565b905080600285604051610b5f9190613285565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190613037565b14610c015760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610c2482610f39565b6080015192915050565b610c3661190a565b610c3f5f611965565b565b5f610c4a61190a565b610c5483836119d5565b90505b92915050565b610c6561190a565b610c6e81611f3a565b5050565b5f805160206137cc8339815191525f610c8a836115c7565b90505f80610c9b83604001516121b5565b9150915080610cfd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610d17906132df565b9050118015610d49575060015f83815260088601602052604090205460ff166005811115610d4757610d47612ef7565b145b610d655760405162461bcd60e51b815260040161043a90613311565b5f8281526007850160205260408120610d7d91612d1f565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206137cc833981519152929190610e72906132df565b9050118015610ea4575060015f83815260088301602052604090205460ff166005811115610ea257610ea2612ef7565b145b610ec05760405162461bcd60e51b815260040161043a90613311565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610ef99190600401613358565b6020604051808303815f875af1158015610f15573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d39190613037565b610f41612d56565b5f8281525f805160206137ec833981519152602052604090819020815160e0810190925280545f805160206137cc833981519152929190829060ff166005811115610f8e57610f8e612ef7565b6005811115610f9f57610f9f612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b61100961190a565b6001600160a01b03811661103257604051631e4fbdf760e01b81525f600482015260240161043a565b61103b81611965565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110b7576110778160016133e2565b6110829060086133f5565b5081515f9083908390811061109957611099613093565b60200101906001600160f81b03191690815f1a905350600101611063565b505f5b6004811015611122576110ce8160036133e2565b6110d99060086133f5565b600263ffffffff16901c60f81b828260026110f491906132aa565b8151811061110457611104613093565b60200101906001600160f81b03191690815f1a9053506001016110ba565b505f5b60208110156111845761113981601f6133e2565b6111449060086133f5565b86901c60f81b826111568360066132aa565b8151811061116657611166613093565b60200101906001600160f81b03191690815f1a905350600101611125565b505f5b60088110156111ef5761119b8160076133e2565b6111a69060086133f5565b6001600160401b038616901c60f81b826111c18360266132aa565b815181106111d1576111d1613093565b60200101906001600160f81b03191690815f1a905350600101611187565b505f5b600881101561125a576112068160076133e2565b6112119060086133f5565b6001600160401b038516901c60f81b8261122c83602e6132aa565b8151811061123c5761123c613093565b60200101906001600160f81b03191690815f1a9053506001016111f2565b50949350505050565b5f61126c612d56565b5f805160206137cc8339815191525f611284856115c7565b90505f8061129583604001516121b5565b9150915080156112fa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561132b5761132b612ef7565b600581111561133c5761133c612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156113ad576113ad612ef7565b14806113cb57506001825160058111156113c9576113c9612ef7565b145b61142a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b60038251600581111561143f5761143f612ef7565b0361144c57506004611450565b5060055b6020808301515f9081526009880190915260408120558181600581111561147957611479612ef7565b9081600581111561148c5761148c612ef7565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156114c0576114c0612ef7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561157457611574612ef7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6115b5612356565b6115be8261239f565b610c6e816123b8565b60408051606080820183525f8083526020830181905292820152905f805160206137cc8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561163c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611663919081019061341b565b91509150806116c35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b82548251146117265760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b0316156117995760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f81516026146117c35760405162461bcd60e51b815260040161043a906134ed565b5f805b6002811015611812576117da8160016133e2565b6117e59060086133f5565b61ffff168482815181106117fb576117fb613093565b016020015160f81c901b91909117906001016117c6565b5061ffff8116156118355760405162461bcd60e51b815260040161043a90613536565b5f805b60048110156118905761184c8160036133e2565b6118579060086133f5565b63ffffffff16856118698360026132aa565b8151811061187957611879613093565b016020015160f81c901b9190911790600101611838565b5063ffffffff8116156118b55760405162461bcd60e51b815260040161043a90613579565b5f805b602081101561125a576118cc81601f6133e2565b6118d79060086133f5565b866118e38360066132aa565b815181106118f3576118f3613093565b016020015160f81c901b91909117906001016118b8565b3361193c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c3f5760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611a605760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f805160206137cc83398151915242611a7f60408601602087016135c0565b6001600160401b031611611af15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611b0160408501602086016135c0565b6001600160401b0316611b176202a300426132aa565b11611b8a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611be25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043a565b83355f90815260098201602052604090205415611c115760405162461bcd60e51b815260040161043a906131ee565b6030611c2060408601866135d9565b905014611c855760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043a565b611c8f835f6123c9565b5f80611d296040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611cd491906135c0565b6001600160401b03168152602001611cef60408a018a6135d9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506125d7565b5f82815260078601602052604090209193509150611d478282613666565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d74908590600401613005565b6020604051808303815f875af1158015611d90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db49190613037565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611e2c57611e2c612ef7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f0c918e01908e016135c0565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611f42612d56565b5f8281525f805160206137ec8339815191526020526040808220815160e0810190925280545f805160206137cc83398151915293929190829060ff166005811115611f8f57611f8f612ef7565b6005811115611fa057611fa0612ef7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561201257612012612ef7565b1461206e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156120b2576120b2612ef7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61215e8582612986565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146121d85760405162461bcd60e51b815260040161043a906134ed565b5f805b6002811015612227576121ef8160016133e2565b6121fa9060086133f5565b61ffff1685828151811061221057612210613093565b016020015160f81c901b91909117906001016121db565b5061ffff81161561224a5760405162461bcd60e51b815260040161043a90613536565b5f805b60048110156122a5576122618160036133e2565b61226c9060086133f5565b63ffffffff168661227e8360026132aa565b8151811061228e5761228e613093565b016020015160f81c901b919091179060010161224d565b5063ffffffff81166003146122cc5760405162461bcd60e51b815260040161043a90613579565b5f805b6020811015612321576122e381601f6133e2565b6122ee9060086133f5565b876122fa8360066132aa565b8151811061230a5761230a613093565b016020015160f81c901b91909117906001016122cf565b505f8660268151811061233657612336613093565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c3f57604051631afcd79f60e31b815260040160405180910390fd5b6123a7612356565b6123af612add565b61103b81612ae5565b6123c0612356565b61103b81612c87565b5f805160206137cc8339815191525f6001600160401b0380841690851611156123fd576123f68385613725565b905061240a565b6124078484613725565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b031660608201524291158061246c575060028401548151612468916001600160401b0316906132aa565b8210155b15612492576001600160401b0383166060820152818152604081015160208201526124b1565b82816060018181516124a49190613745565b6001600160401b03169052505b60608101516124c1906064613765565b602082015160028601546001600160401b0392909216916124ec9190600160401b900460ff166133f5565b10156125505760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b856001600160401b03168160400181815161256b91906132aa565b9052506040810180516001600160401b038716919061258b9083906133e2565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146126415760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156126b8576126788160016133e2565b6126839060086133f5565b5081515f9083908390811061269a5761269a613093565b60200101906001600160f81b03191690815f1a905350600101612664565b505f5b6004811015612720576126cf8160036133e2565b6126da9060086133f5565b600160ff919091161c60f81b826126f28360026132aa565b8151811061270257612702613093565b60200101906001600160f81b03191690815f1a9053506001016126bb565b505f5b602081101561277d578451816020811061273f5761273f613093565b1a60f81b8261274f8360066132aa565b8151811061275f5761275f613093565b60200101906001600160f81b03191690815f1a905350600101612723565b505f5b60208110156127dd578460200151816020811061279f5761279f613093565b1a60f81b826127af8360266132aa565b815181106127bf576127bf613093565b60200101906001600160f81b03191690815f1a905350600101612780565b505f5b6008811015612851576127f48160076133e2565b6127ff9060086133f5565b60ff1685604001516001600160401b0316901c60f81b8282604661282391906132aa565b8151811061283357612833613093565b60200101906001600160f81b03191690815f1a9053506001016127e0565b505f5b60308110156128bc578460800151818151811061287357612873613093565b01602001516001600160f81b0319168261288e83604e6132aa565b8151811061289e5761289e613093565b60200101906001600160f81b03191690815f1a905350600101612854565b505f5b600881101561292e576128d38160076133e2565b6128de9060086133f5565b60608601516001600160401b0390811691161c60f81b8261290083607e6132aa565b8151811061291057612910613093565b60200101906001600160f81b03191690815f1a9053506001016128bf565b5060028160405161293f9190613285565b602060405180830381855afa15801561295a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061297d9190613037565b94909350915050565b5f8281525f805160206137ec833981519152602052604081206002015481905f805160206137cc83398151915290600160801b90046001600160401b03166129ce85826123c9565b5f6129d887612c8f565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb612a288a858b61103e565b6040518263ffffffff1660e01b8152600401612a449190613005565b6020604051808303815f875af1158015612a60573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a849190613037565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b610c3f612356565b612aed612356565b80355f805160206137cc83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014612b396080840160608501613790565b60ff161115612ba65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f612bb76080840160608501613790565b60ff1611612c1f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b612c2f6080830160608401613790565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612c6060608301604084016135c0565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b611009612356565b5f8181525f805160206137ec8339815191526020526040812060020180545f805160206137cc83398151915291600160401b9091046001600160401b0316906008612cd9836137b0565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b508054612d2b906132df565b5f825580601f10612d3a575050565b601f0160209004905f5260205f209081019061103b9190612d92565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612da6575f8155600101612d93565b5090565b5f60208284031215612dba575f80fd5b5035919050565b803563ffffffff81168114612dd4575f80fd5b919050565b5f60208284031215612de9575f80fd5b610c5482612dc1565b5f60808284031215612e02575f80fd5b50919050565b6001600160a01b038116811461103b575f80fd5b5f8060a08385031215612e2d575f80fd5b612e378484612df2565b91506080830135612e4781612e08565b809150509250929050565b5f8060408385031215612e63575f80fd5b82356001600160401b03811115612e78575f80fd5b612e8485828601612df2565b925050612e9360208401612dc1565b90509250929050565b80356001600160401b0381168114612dd4575f80fd5b5f8060408385031215612ec3575f80fd5b82356001600160401b03811115612ed8575f80fd5b830160608186031215612ee9575f80fd5b9150612e9360208401612e9c565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f2e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f6960608401826001600160401b03169052565b506080830151612f8460808401826001600160401b03169052565b5060a0830151612f9f60a08401826001600160401b03169052565b5060c0830151612fba60c08401826001600160401b03169052565b5092915050565b5f60208284031215612fd1575f80fd5b8135612fdc81612e08565b9392505050565b5f5b83811015612ffd578181015183820152602001612fe5565b50505f910152565b602081525f8251806020840152613023816040850160208701612fe3565b601f01601f19169190910160400192915050565b5f60208284031215613047575f80fd5b5051919050565b5f808335601e19843603018112613063575f80fd5b8301803591506001600160401b0382111561307c575f80fd5b6020019150600581901b3603821315612ad6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130bb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130fb576130fb6130c5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613129576131296130c5565b604052919050565b5f6001600160401b03821115613149576131496130c5565b50601f01601f191660200190565b5f60608236031215613167575f80fd5b61316f6130d9565b823581526020613180818501612e9c565b8183015260408401356001600160401b0381111561319c575f80fd5b840136601f8201126131ac575f80fd5b80356131bf6131ba82613131565b613101565b81815236848385010111156131d2575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551613247818460208a01612fe3565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613277816028840160208801612fe3565b016028019695505050505050565b5f82516130bb818460208701612fe3565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c5757610c57613296565b5f63ffffffff8083168181036132d5576132d5613296565b6001019392505050565b600181811c908216806132f357607f821691505b602082108103612e0257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461336a816132df565b806020870152604060018084165f811461338b57600181146133a7576133d4565b60ff19851660408a0152604084151560051b8a010195506133d4565b895f5260205f205f5b858110156133cb5781548b82018601529083019088016133b0565b8a016040019650505b509398975050505050505050565b81810381811115610c5757610c57613296565b8082028115828204841417610c5757610c57613296565b80518015158114612dd4575f80fd5b5f806040838503121561342c575f80fd5b82516001600160401b0380821115613442575f80fd5b9084019060608287031215613455575f80fd5b61345d6130d9565b8251815260208084015161347081612e08565b82820152604084015183811115613485575f80fd5b80850194505087601f850112613499575f80fd5b835192506134a96131ba84613131565b83815288828587010111156134bc575f80fd5b6134cb84838301848801612fe3565b806040840152508195506134e081880161340c565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156135d0575f80fd5b610c5482612e9c565b5f808335601e198436030181126135ee575f80fd5b8301803591506001600160401b03821115613607575f80fd5b602001915036819003821315612ad6575f80fd5b601f8211156104d357805f5260205f20601f840160051c810160208510156136405750805b601f840160051c820191505b8181101561365f575f815560010161364c565b5050505050565b81516001600160401b0381111561367f5761367f6130c5565b6136938161368d84546132df565b8461361b565b602080601f8311600181146136c6575f84156136af5750858301515b5f19600386901b1c1916600185901b17855561371d565b5f85815260208120601f198616915b828110156136f4578886015182559484019460019091019084016136d5565b508582101561371157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03828116828216039080821115612fba57612fba613296565b6001600160401b03818116838216019080821115612fba57612fba613296565b6001600160401b0381811683821602808216919082811461378857613788613296565b505092915050565b5f602082840312156137a0575f80fd5b813560ff81168114612fdc575f80fd5b5f6001600160401b038083168181036132d5576132d561329656fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", ->>>>>>> origin/staking-contract + Bin: "0x608060405234801561000f575f80fd5b5060405161393438038061393483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6137e78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c80638da5cb5b116100a9578063c974d1b61161006e578063c974d1b6146102c6578063d588c18f146102ce578063d5f20ff6146102e1578063df93d8de14610301578063f2fde38b1461030b575f80fd5b80638da5cb5b1461023b57806397fb70d41461027f578063a3a65e4814610292578063b771b3bc146102a5578063bee0a03f146102b3575f80fd5b806366435abf116100ef57806366435abf146101d4578063715018a6146101ff578063732214f8146102075780638280a25a1461020e5780638994ab4914610228575f80fd5b80630322ed981461012b5780630cdd098514610140578063467ef06f1461019157806360305d62146101a457806361e2f490146101c1575b5f80fd5b61013e610139366004612d80565b61031e565b005b61017e61014e366004612d80565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61013e61019f366004612daf565b6104dc565b6101ac601481565b60405163ffffffff9091168152602001610188565b61013e6101cf366004612dc8565b6104ea565b6101e76101e2366004612d80565b610b1e565b6040516001600160401b039091168152602001610188565b61013e610b32565b61017e5f81565b610216603081565b60405160ff9091168152602001610188565b61017e610236366004612e42565b610b45565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610188565b61013e61028d366004612d80565b610b61565b61013e6102a0366004612daf565b610b76565b6102676005600160991b0181565b61013e6102c1366004612d80565b610d2e565b610216601481565b61013e6102dc366004612e97565b610e3d565b6102f46102ef366004612d80565b610f4b565b6040516101889190612ee1565b6101e76202a30081565b61013e610319366004612f90565b611013565b5f8181525f805160206137bb8339815191526020526040808220815160e0810190925280545f8051602061379b83398151915293929190829060ff16600581111561036b5761036b612ecd565b600581111561037c5761037c612ecd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb612ecd565b146104555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61047a8584606001515f611050565b6040518263ffffffff1660e01b81526004016104969190612fd4565b6020604051808303815f875af11580156104b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d69190613006565b50505050565b6104e581611275565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061379b8339815191529060ff16156105875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161044c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ee9190613006565b8360200135146106505760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161044c565b306106616060850160408601612f90565b6001600160a01b0316146106d35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161044c565b5f6106e1606085018561301d565b91505f90508435602086013560146106ff6060890160408a01612f90565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610a2e575f61077f606089018961301d565b8363ffffffff1681811061079557610795613062565b90506020028101906107a79190613076565b6107b090613126565b80515f81815260088901602052604090205491925090156107e35760405162461bcd60e51b815260040161044c906131bd565b84825f0151836020015184604001516040516020016108059493929190613205565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916108539190613254565b602060405180830381855afa15801561086e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108919190613006565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff1916600183600581111561091d5761091d612ecd565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516109d0911686613279565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610a279061328c565b9050610763565b50600484018190555f610a40866115bf565b90505f610a508260400151611785565b905080600285604051610a639190613254565b602060405180830381855afa158015610a7e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aa19190613006565b14610b055760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161044c565b5050506009909201805460ff1916600117905550505050565b5f610b2882610f4b565b6080015192915050565b610b3a6118ee565b610b435f611949565b565b5f610b4e6118ee565b610b5883836119b9565b90505b92915050565b610b696118ee565b610b7281611f1d565b5050565b5f8051602061379b8339815191525f610b8e836115bf565b90505f80610b9f8360400151612198565b9150915080610c015760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044c565b5f82815260068501602052604081208054610c1b906132ae565b9050118015610c4d575060015f83815260078601602052604090205460ff166005811115610c4b57610c4b612ecd565b145b610c695760405162461bcd60e51b815260040161044c906132e0565b5f8281526006850160205260408120610c8191612cf5565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061379b833981519152929190610d76906132ae565b9050118015610da8575060015f83815260078301602052604090205460ff166005811115610da657610da6612ecd565b145b610dc45760405162461bcd60e51b815260040161044c906132e0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dfd9190600401613327565b6020604051808303815f875af1158015610e19573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e59190613006565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610e815750825b90505f826001600160401b03166001148015610e9c5750303b155b905081158015610eaa575080155b15610ec85760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ef257845460ff60401b1916600160401b1785555b610efc8787612339565b8315610f4257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610f53612d2c565b5f8281525f805160206137bb833981519152602052604090819020815160e0810190925280545f8051602061379b833981519152929190829060ff166005811115610fa057610fa0612ecd565b6005811115610fb157610fb1612ecd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b61101b6118ee565b6001600160a01b03811661104457604051631e4fbdf760e01b81525f600482015260240161044c565b61104d81611949565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110c9576110898160016133b1565b6110949060086133c4565b5081515f908390839081106110ab576110ab613062565b60200101906001600160f81b03191690815f1a905350600101611075565b505f5b6004811015611134576110e08160036133b1565b6110eb9060086133c4565b600263ffffffff16901c60f81b828260026111069190613279565b8151811061111657611116613062565b60200101906001600160f81b03191690815f1a9053506001016110cc565b505f5b60208110156111965761114b81601f6133b1565b6111569060086133c4565b86901c60f81b82611168836006613279565b8151811061117857611178613062565b60200101906001600160f81b03191690815f1a905350600101611137565b505f5b6008811015611201576111ad8160076133b1565b6111b89060086133c4565b6001600160401b038616901c60f81b826111d3836026613279565b815181106111e3576111e3613062565b60200101906001600160f81b03191690815f1a905350600101611199565b505f5b600881101561126c576112188160076133b1565b6112239060086133c4565b6001600160401b038516901c60f81b8261123e83602e613279565b8151811061124e5761124e613062565b60200101906001600160f81b03191690815f1a905350600101611204565b50949350505050565b5f61127e612d2c565b5f8051602061379b8339815191525f611296856115bf565b90505f806112a78360400151612198565b91509150801561130c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044c565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561133d5761133d612ecd565b600581111561134e5761134e612ecd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156113bf576113bf612ecd565b14806113dd57506001825160058111156113db576113db612ecd565b145b61143c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044c565b60038251600581111561145157611451612ecd565b0361145e57506004611462565b5060055b6020808301515f9081526008880190915260408120558181600581111561148b5761148b612ecd565b9081600581111561149e5761149e612ecd565b9052505f84815260078701602052604090208251815484929190829060ff191660018360058111156114d2576114d2612ecd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561158657611586612ecd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611623573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261164a91908101906133ea565b91509150806116aa5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161044c565b81511561170b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044c565b60208201516001600160a01b03161561177e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044c565b5092915050565b5f81516026146117a75760405162461bcd60e51b815260040161044c906134bc565b5f805b60028110156117f6576117be8160016133b1565b6117c99060086133c4565b61ffff168482815181106117df576117df613062565b016020015160f81c901b91909117906001016117aa565b5061ffff8116156118195760405162461bcd60e51b815260040161044c90613505565b5f805b6004811015611874576118308160036133b1565b61183b9060086133c4565b63ffffffff168561184d836002613279565b8151811061185d5761185d613062565b016020015160f81c901b919091179060010161181c565b5063ffffffff8116156118995760405162461bcd60e51b815260040161044c90613548565b5f805b602081101561126c576118b081601f6133b1565b6118bb9060086133c4565b866118c7836006613279565b815181106118d7576118d7613062565b016020015160f81c901b919091179060010161189c565b336119207f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b435760405163118cdaa760e01b815233600482015260240161044c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611a445760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161044c565b5f8051602061379b83398151915242611a63604086016020870161358f565b6001600160401b031611611ad55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161044c565b611ae5604085016020860161358f565b6001600160401b0316611afb6202a30042613279565b11611b6e5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161044c565b8335611bc65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044c565b83355f90815260088201602052604090205415611bf55760405162461bcd60e51b815260040161044c906131bd565b6030611c0460408601866135a8565b905014611c695760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044c565b611c73835f612353565b5f80611d0c6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611cb7919061358f565b6001600160401b03168152602001611cd260408a018a6135a8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612561565b5f82815260068601602052604090209193509150611d2a8282613635565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d57908590600401612fd4565b6020604051808303815f875af1158015611d73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d979190613006565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115611e0f57611e0f612ecd565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611eef918e01908e0161358f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611f25612d2c565b5f8281525f805160206137bb8339815191526020526040808220815160e0810190925280545f8051602061379b83398151915293929190829060ff166005811115611f7257611f72612ecd565b6005811115611f8357611f83612ecd565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611ff557611ff5612ecd565b146120515760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044c565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561209557612095612ecd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121418582612910565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146121bb5760405162461bcd60e51b815260040161044c906134bc565b5f805b600281101561220a576121d28160016133b1565b6121dd9060086133c4565b61ffff168582815181106121f3576121f3613062565b016020015160f81c901b91909117906001016121be565b5061ffff81161561222d5760405162461bcd60e51b815260040161044c90613505565b5f805b6004811015612288576122448160036133b1565b61224f9060086133c4565b63ffffffff1686612261836002613279565b8151811061227157612271613062565b016020015160f81c901b9190911790600101612230565b5063ffffffff81166003146122af5760405162461bcd60e51b815260040161044c90613548565b5f805b6020811015612304576122c681601f6133b1565b6122d19060086133c4565b876122dd836006613279565b815181106122ed576122ed613062565b016020015160f81c901b91909117906001016122b2565b505f8660268151811061231957612319613062565b016020015191976001600160f81b03199092161515965090945050505050565b612341612a67565b61234a82612ab0565b610b7281612ac9565b5f8051602061379b8339815191525f6001600160401b0380841690851611156123875761238083856136f4565b9050612394565b61239184846136f4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806123f65750600184015481516123f2916001600160401b031690613279565b8210155b1561241c576001600160401b03831660608201528181526040810151602082015261243b565b828160600181815161242e9190613714565b6001600160401b03169052505b606081015161244b906064613734565b602082015160018601546001600160401b0392909216916124769190600160401b900460ff166133c4565b10156124da5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161044c565b856001600160401b0316816040018181516124f59190613279565b9052506040810180516001600160401b03871691906125159083906133b1565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146125cb5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612642576126028160016133b1565b61260d9060086133c4565b5081515f9083908390811061262457612624613062565b60200101906001600160f81b03191690815f1a9053506001016125ee565b505f5b60048110156126aa576126598160036133b1565b6126649060086133c4565b600160ff919091161c60f81b8261267c836002613279565b8151811061268c5761268c613062565b60200101906001600160f81b03191690815f1a905350600101612645565b505f5b602081101561270757845181602081106126c9576126c9613062565b1a60f81b826126d9836006613279565b815181106126e9576126e9613062565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b6020811015612767578460200151816020811061272957612729613062565b1a60f81b82612739836026613279565b8151811061274957612749613062565b60200101906001600160f81b03191690815f1a90535060010161270a565b505f5b60088110156127db5761277e8160076133b1565b6127899060086133c4565b60ff1685604001516001600160401b0316901c60f81b828260466127ad9190613279565b815181106127bd576127bd613062565b60200101906001600160f81b03191690815f1a90535060010161276a565b505f5b603081101561284657846080015181815181106127fd576127fd613062565b01602001516001600160f81b0319168261281883604e613279565b8151811061282857612828613062565b60200101906001600160f81b03191690815f1a9053506001016127de565b505f5b60088110156128b85761285d8160076133b1565b6128689060086133c4565b60608601516001600160401b0390811691161c60f81b8261288a83607e613279565b8151811061289a5761289a613062565b60200101906001600160f81b03191690815f1a905350600101612849565b506002816040516128c99190613254565b602060405180830381855afa1580156128e4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129079190613006565b94909350915050565b5f8281525f805160206137bb833981519152602052604081206002015481905f8051602061379b83398151915290600160801b90046001600160401b03166129588582612353565b5f61296287612ada565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129b28a858b611050565b6040518263ffffffff1660e01b81526004016129ce9190612fd4565b6020604051808303815f875af11580156129ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0e9190613006565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b4357604051631afcd79f60e31b815260040160405180910390fd5b612ab8612a67565b612ac0612b6a565b61104d81612b72565b612ad1612a67565b61104d81612ced565b5f8181525f805160206137bb8339815191526020526040812060020180545f8051602061379b83398151915291600160401b9091046001600160401b0316906008612b248361375f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b610b43612a67565b612b7a612a67565b80355f8051602061379b8339815191529081556014612b9f606084016040850161377a565b60ff161115612c0c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161044c565b5f612c1d606084016040850161377a565b60ff1611612c855760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161044c565b612c95606083016040840161377a565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612cc6604083016020840161358f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61101b612a67565b508054612d01906132ae565b5f825580601f10612d10575050565b601f0160209004905f5260205f209081019061104d9190612d68565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612d7c575f8155600101612d69565b5090565b5f60208284031215612d90575f80fd5b5035919050565b803563ffffffff81168114612daa575f80fd5b919050565b5f60208284031215612dbf575f80fd5b610b5882612d97565b5f8060408385031215612dd9575f80fd5b82356001600160401b03811115612dee575f80fd5b830160808186031215612dff575f80fd5b9150612e0d60208401612d97565b90509250929050565b5f60608284031215612e26575f80fd5b50919050565b80356001600160401b0381168114612daa575f80fd5b5f8060408385031215612e53575f80fd5b82356001600160401b03811115612e68575f80fd5b612e7485828601612e16565b925050612e0d60208401612e2c565b6001600160a01b038116811461104d575f80fd5b5f8060808385031215612ea8575f80fd5b612eb28484612e16565b91506060830135612ec281612e83565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f0457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f3f60608401826001600160401b03169052565b506080830151612f5a60808401826001600160401b03169052565b5060a0830151612f7560a08401826001600160401b03169052565b5060c083015161177e60c08401826001600160401b03169052565b5f60208284031215612fa0575f80fd5b8135612fab81612e83565b9392505050565b5f5b83811015612fcc578181015183820152602001612fb4565b50505f910152565b602081525f8251806020840152612ff2816040850160208701612fb2565b601f01601f19169190910160400192915050565b5f60208284031215613016575f80fd5b5051919050565b5f808335601e19843603018112613032575f80fd5b8301803591506001600160401b0382111561304b575f80fd5b6020019150600581901b3603821315612a60575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261308a575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130ca576130ca613094565b60405290565b604051601f8201601f191681016001600160401b03811182821017156130f8576130f8613094565b604052919050565b5f6001600160401b0382111561311857613118613094565b50601f01601f191660200190565b5f60608236031215613136575f80fd5b61313e6130a8565b82358152602061314f818501612e2c565b8183015260408401356001600160401b0381111561316b575f80fd5b840136601f82011261317b575f80fd5b803561318e61318982613100565b6130d0565b81815236848385010111156131a1575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551613216818460208a01612fb2565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613246816028840160208801612fb2565b016028019695505050505050565b5f825161308a818460208701612fb2565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b5b57610b5b613265565b5f63ffffffff8083168181036132a4576132a4613265565b6001019392505050565b600181811c908216806132c257607f821691505b602082108103612e2657634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613339816132ae565b806020870152604060018084165f811461335a5760018114613376576133a3565b60ff19851660408a0152604084151560051b8a010195506133a3565b895f5260205f205f5b8581101561339a5781548b820186015290830190880161337f565b8a016040019650505b509398975050505050505050565b81810381811115610b5b57610b5b613265565b8082028115828204841417610b5b57610b5b613265565b80518015158114612daa575f80fd5b5f80604083850312156133fb575f80fd5b82516001600160401b0380821115613411575f80fd5b9084019060608287031215613424575f80fd5b61342c6130a8565b8251815260208084015161343f81612e83565b82820152604084015183811115613454575f80fd5b80850194505087601f850112613468575f80fd5b8351925061347861318984613100565b838152888285870101111561348b575f80fd5b61349a84838301848801612fb2565b806040840152508195506134af8188016133db565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561359f575f80fd5b610b5882612e2c565b5f808335601e198436030181126135bd575f80fd5b8301803591506001600160401b038211156135d6575f80fd5b602001915036819003821315612a60575f80fd5b601f8211156104e557805f5260205f20601f840160051c8101602085101561360f5750805b601f840160051c820191505b8181101561362e575f815560010161361b565b5050505050565b81516001600160401b0381111561364e5761364e613094565b6136628161365c84546132ae565b846135ea565b602080601f831160018114613695575f841561367e5750858301515b5f19600386901b1c1916600185901b1785556136ec565b5f85815260208120601f198616915b828110156136c3578886015182559484019460019091019084016136a4565b50858210156136e057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0382811682821603908082111561177e5761177e613265565b6001600160401b0381811683821601908082111561177e5761177e613265565b6001600160401b0381811683821602808216919082811461375757613757613265565b505092915050565b5f6001600160401b038083168181036132a4576132a4613265565b5f6020828403121561378a575f80fd5b813560ff81168114612fab575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. From 6c4b0f74851fc249411898db6cb01c47b79edabc Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Thu, 19 Sep 2024 10:17:56 -0700 Subject: [PATCH 371/545] fix uptime get blockchain ID --- .../tests/PoSValidatorManagerTests.t.sol | 20 ++++++------ .../staking/tests/ValidatorManagerTests.t.sol | 32 +++++++++++++++---- tests/flows/staking/poa_to_pos.go | 2 -- tests/utils/staking.go | 3 -- 4 files changed, 35 insertions(+), 22 deletions(-) diff --git a/contracts/staking/tests/PoSValidatorManagerTests.t.sol b/contracts/staking/tests/PoSValidatorManagerTests.t.sol index 001260350..089b3351d 100644 --- a/contracts/staking/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/staking/tests/PoSValidatorManagerTests.t.sol @@ -174,7 +174,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _mockGetVerifiedWarpMessage(new bytes(0), false); + _mockGetUptimeWarpMessage(new bytes(0), false); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid warp message")); posValidatorManager.initializeEndValidation(validationID, true, 0); @@ -190,8 +190,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _mockGetVerifiedWarpMessage(new bytes(0), true); - _mockGetBlockchainID(); + _mockGetUptimeWarpMessage(new bytes(0), true); + _mockGetBlockchainID(posValidatorManager.P_CHAIN_BLOCKCHAIN_ID()); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(_formatErrorMessage("invalid source chain ID")); posValidatorManager.initializeEndValidation(validationID, true, 0); @@ -367,7 +367,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { .packSubnetValidatorWeightUpdateMessage( validationID, 1, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT ); - _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); + _mockGetPChainWarpMessage(setValidatorWeightPayload, true); vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); vm.expectRevert("PoSValidatorManager: nonce does not match"); @@ -650,7 +650,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { .packSubnetValidatorWeightUpdateMessage( validationID, 3, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT ); - _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); + _mockGetPChainWarpMessage(setValidatorWeightPayload, true); vm.expectRevert("PoSValidatorManager: nonce does not match"); posValidatorManager.completeEndDelegation(0, delegationID2); @@ -873,7 +873,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { .packSubnetValidatorWeightUpdateMessage( validationID, expectedNonce, expectedValidatorWeight ); - _mockGetVerifiedWarpMessage(setValidatorWeightPayload, true); + _mockGetPChainWarpMessage(setValidatorWeightPayload, true); vm.warp(completeRegistrationTimestamp); vm.expectEmit(true, true, true, true, address(posValidatorManager)); @@ -903,8 +903,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, endDelegationTimestamp - startDelegationTimestamp ); - _mockGetVerifiedWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit ValidatorWeightUpdate({ @@ -934,7 +934,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory subnetValidatorRegistrationMessage = ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); - _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); @@ -965,7 +965,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( validationID, expectedNonce, validatorWeight ); - _mockGetVerifiedWarpMessage(weightUpdateMessage, true); + _mockGetPChainWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegationEnded( diff --git a/contracts/staking/tests/ValidatorManagerTests.t.sol b/contracts/staking/tests/ValidatorManagerTests.t.sol index 0a61aca22..bbe7417ee 100644 --- a/contracts/staking/tests/ValidatorManagerTests.t.sol +++ b/contracts/staking/tests/ValidatorManagerTests.t.sol @@ -176,7 +176,7 @@ abstract contract ValidatorManagerTest is Test { bytes memory subnetValidatorRegistrationMessage = ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); - _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); @@ -195,7 +195,7 @@ abstract contract ValidatorManagerTest is Test { bytes memory subnetValidatorRegistrationMessage = ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); - _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidationPeriodEnded(validationID, ValidatorStatus.Invalidated); @@ -324,7 +324,7 @@ abstract contract ValidatorManagerTest is Test { bytes memory subnetValidatorRegistrationMessage = ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, true); - _mockGetVerifiedWarpMessage(subnetValidatorRegistrationMessage, true); + _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); vm.warp(registrationTimestamp); vm.expectEmit(true, true, true, true, address(validatorManager)); @@ -381,8 +381,8 @@ abstract contract ValidatorManagerTest is Test { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, completionTimestamp - registrationTimestamp ); - _mockGetVerifiedWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(P_CHAIN_BLOCKCHAIN_ID); + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); } vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); @@ -401,7 +401,7 @@ abstract contract ValidatorManagerTest is Test { ); } - function _mockGetVerifiedWarpMessage(bytes memory expectedPayload, bool valid) internal { + function _mockGetPChainWarpMessage(bytes memory expectedPayload, bool valid) internal { vm.mockCall( WARP_PRECOMPILE_ADDRESS, abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), @@ -419,6 +419,24 @@ abstract contract ValidatorManagerTest is Test { ); } + function _mockGetUptimeWarpMessage(bytes memory expectedPayload, bool valid) internal { + vm.mockCall( + WARP_PRECOMPILE_ADDRESS, + abi.encodeWithSelector(IWarpMessenger.getVerifiedWarpMessage.selector, uint32(0)), + abi.encode( + WarpMessage({ + sourceChainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, + originSenderAddress: address(0), + payload: expectedPayload + }), + valid + ) + ); + vm.expectCall( + WARP_PRECOMPILE_ADDRESS, abi.encodeCall(IWarpMessenger.getVerifiedWarpMessage, 0) + ); + } + function _mockGetBlockchainID() internal { _mockGetBlockchainID(DEFAULT_SOURCE_BLOCKCHAIN_ID); } @@ -435,7 +453,7 @@ abstract contract ValidatorManagerTest is Test { } function _mockInitializeValidatorSet() internal { - _mockGetVerifiedWarpMessage( + _mockGetPChainWarpMessage( ValidatorMessages.packSubnetConversionMessage(DEFAULT_SUBNET_CONVERSION_TX_ID), true ); } diff --git a/tests/flows/staking/poa_to_pos.go b/tests/flows/staking/poa_to_pos.go index e69b51b7c..4e08b7b6b 100644 --- a/tests/flows/staking/poa_to_pos.go +++ b/tests/flows/staking/poa_to_pos.go @@ -88,7 +88,6 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { tx, err := poaValidatorManager.Initialize( opts, poavalidatormanager.ValidatorManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnetAInfo.SubnetID, ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(20), @@ -165,7 +164,6 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { opts, nativetokenstakingmanager.PoSValidatorManagerSettings{ BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnetAInfo.SubnetID, ChurnPeriodSeconds: utils.DefaultChurnPeriodSeconds, MaximumChurnPercentage: utils.DefaultMaxChurnPercentage, diff --git a/tests/utils/staking.go b/tests/utils/staking.go index 1c26f63c1..017fefa81 100644 --- a/tests/utils/staking.go +++ b/tests/utils/staking.go @@ -90,7 +90,6 @@ func DeployAndInitializeNativeTokenStakingManager( opts, nativetokenstakingmanager.PoSValidatorManagerSettings{ BaseSettings: nativetokenstakingmanager.ValidatorManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnet.SubnetID, ChurnPeriodSeconds: DefaultChurnPeriodSeconds, MaximumChurnPercentage: DefaultMaxChurnPercentage, @@ -159,7 +158,6 @@ func DeployAndInitializeERC20TokenStakingManager( opts, erc20tokenstakingmanager.PoSValidatorManagerSettings{ BaseSettings: erc20tokenstakingmanager.ValidatorManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnet.SubnetID, ChurnPeriodSeconds: DefaultChurnPeriodSeconds, MaximumChurnPercentage: DefaultMaxChurnPercentage, @@ -216,7 +214,6 @@ func DeployAndInitializePoAValidatorManager( tx, err := validatorManager.Initialize( opts, poavalidatormanager.ValidatorManagerSettings{ - PChainBlockchainID: pChainInfo.BlockchainID, SubnetID: subnet.SubnetID, ChurnPeriodSeconds: uint64(0), MaximumChurnPercentage: uint8(20), From fd20c8411ac13e9b857fcae5235e0252c60d322a Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Thu, 19 Sep 2024 13:45:58 -0400 Subject: [PATCH 372/545] pass unit tests but exceed max contract size --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- .../validator-manager/ValidatorManager.sol | 25 +------ .../validator-manager/ValidatorMessages.sol | 66 ++++++++++++------- 5 files changed, 47 insertions(+), 50 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index cebf9195c..62be28d37 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160fc3803806160fc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615faf8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046152c0565b6103ec565b005b61019e6101ae3660046152fb565b610890565b6101f16101c13660046152fb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046152fb565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615326565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615364565b610b3e565b61019e61029936600461537d565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c93660046153a5565b610db3565b6101f16102dc366004615409565b6113e7565b6102316102ef3660046152fb565b611400565b61019e6103023660046152c0565b611414565b61020c603081565b61019e61031d3660046152fb565b611657565b61019e61033036600461537d565b61175d565b6101f1610343366004615422565b611a81565b61019e610356366004615364565b611aad565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046152fb565b611c65565b61019e6103a23660046152fb565b611eeb565b61020c601481565b6103c26103bd3660046152fb565b611fff565b6040516101fb9190615456565b6102316202a30081565b6101f16103e736600461551d565b6120c7565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f0383398151915293929190829060ff16600481111561044d5761044d615442565b600481111561045e5761045e615442565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611fff565b90506002835160048111156104f9576104f9615442565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f238339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615f238339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615442565b036106235786156105e4576105e183876120fc565b90505b5f846060015183608001516105f99190615596565b90506106058482612398565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a86606001516113e7565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b91906155b6565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615442565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f838339815191526020526040808220815160e0810190925280545f80516020615f4383398151915293929190829060ff1660058111156108dd576108dd615442565b60058111156108ee576108ee615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615442565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f6124ef565b6040518263ffffffff1660e01b8152600401610a0391906155ef565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4391906155b6565b50505050565b5f610a5964e8d4a5100083615621565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af18484612716565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615f038339815191525f80610b5784612730565b91509150610b6482612a7a565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615442565b03610bc1575f83815260088501602052604081208054919055610bbf8282612ab5565b505b610bd781610bd284604001516113e7565b612b2b565b5050505050565b5f80516020615f038339815191525f610bf684612b4e565b90505f80610c078360400151612d28565b50915091505f610c1683611fff565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b815260040161054290615640565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615682565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615442565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615f438339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb791906155b6565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a60608501604086016156cb565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa60608501856156e6565b91505f9050843560208601356014610fc86060890160408a016156cb565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112f7575f61104860608901896156e6565b8363ffffffff1681811061105e5761105e61572b565b9050602002810190611070919061573f565b611079906157ef565b80515f81815260098901602052604090205491925090156110ac5760405162461bcd60e51b815260040161054290615886565b84825f0151836020015184604001516040516020016110ce94939291906158ce565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161111c919061591d565b602060405180830381855afa158015611137573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061115a91906155b6565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff191660018360058111156111e6576111e6615442565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161129991168661592e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112f090615941565b905061102c565b50600584018190555f61130986612b4e565b90505f6113198260400151612f63565b90508060028560405161132c919061591d565b602060405180830381855afa158015611347573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061136a91906155b6565b146113ce5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615963565b5f61140a82611fff565b6080015192915050565b5f80516020615f038339815191525f61142c856130d5565b905061143785612a7a565b611442575050505050565b5f8581526005830160205260409020546001600160a01b031633146114795760405162461bcd60e51b81526004016105429061597a565b5f85815260058301602052604090205460a08201516114a891600160b01b90046001600160401b0316906159cc565b6001600160401b03168160c001516001600160401b031610156115295760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f61153a86856120fc565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611591906113e7565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611607573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061162b91906155b6565b5f8781526008850160205260408120805490919061164a90849061592e565b9091555050505050505050565b5f80516020615f038339815191525f61166f83611fff565b905060048151600581111561168657611686615442565b146116f05760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146117275760405162461bcd60e51b81526004016105429061597a565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612ab5565b611765613350565b5f80516020615f038339815191525f61177d84612b4e565b90505f8061178e8360400151612d28565b50915091505f61179d83611fff565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156117d7576117d7615442565b60048111156117e8576117e8615442565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118cc5760405162461bcd60e51b815260040161054290615640565b826001600160401b03168160e001516001600160401b031611156119025760405162461bcd60e51b815260040161054290615682565b60038151600481111561191757611917615442565b1461196b5760405162461bcd60e51b815260206004820152603160248201525f80516020615f238339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906119ac90600160a01b900461ffff1684615963565b6119b69190615621565b905080886008015f8881526020019081526020015f205f8282546119da919061592e565b909155505f90506119eb82846159ec565b90506119fb846020015182612ab5565b611a108460200151610bd286606001516113e7565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611a56929190918252602082015260400190565b60405180910390a4505050505050505050611a7d60015f80516020615f6383398151915255565b5050565b5f611a8a613350565b611a9583338461339a565b9050610a5960015f80516020615f6383398151915255565b5f80516020615f438339815191525f611ac583612b4e565b90505f80611ad68360400151613754565b9150915080611b385760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611b52906159ff565b9050118015611b84575060015f83815260088601602052604090205460ff166005811115611b8257611b82615442565b145b611ba05760405162461bcd60e51b815260040161054290615a37565b5f8281526007850160205260408120611bb891615210565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f0383398151915293929190829060ff166004811115611cc657611cc6615442565b6004811115611cd757611cd7615442565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d5e57611d5e615442565b1480611d7c5750600381516004811115611d7a57611d7a615442565b145b611dd05760405162461bcd60e51b815260206004820152603260248201525f80516020615f23833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611dde8260400151611fff565b905080606001516001600160401b03165f03611e625760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611e8f8460400151846060015185608001516124ef565b6040518263ffffffff1660e01b8152600401611eab91906155ef565b6020604051808303815f875af1158015611ec7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd791906155b6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615f43833981519152929190611f33906159ff565b9050118015611f65575060015f83815260088301602052604090205460ff166005811115611f6357611f63615442565b145b611f815760405162461bcd60e51b815260040161054290615a37565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fba9190600401615a7e565b6020604051808303815f875af1158015611fd6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ffa91906155b6565b505050565b612007615247565b5f8281525f80516020615f83833981519152602052604090819020815160e0810190925280545f80516020615f43833981519152929190829060ff16600581111561205457612054615442565b600581111561206557612065615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120d0613350565b6120dc858585856138f5565b90506120f460015f80516020615f6383398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612147573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261216e9190810190615b13565b91509150806121d15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612214573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061223891906155b6565b82511461229c5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b0316156123125760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f806123218460400151613b6a565b9150915081871461238e5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f83833981519152602052604081206002015481905f80516020615f4383398151915290600160801b90046001600160401b03166123e08582613d42565b5f6123ea87613f50565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61243a8a858b6124ef565b6040518263ffffffff1660e01b815260040161245691906155ef565b6020604051808303815f875af1158015612472573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249691906155b6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612568576125288160016159ec565b612533906008615963565b5081515f9083908390811061254a5761254a61572b565b60200101906001600160f81b03191690815f1a905350600101612514565b505f5b60048110156125d35761257f8160036159ec565b61258a906008615963565b600263ffffffff16901c60f81b828260026125a5919061592e565b815181106125b5576125b561572b565b60200101906001600160f81b03191690815f1a90535060010161256b565b505f5b6020811015612635576125ea81601f6159ec565b6125f5906008615963565b86901c60f81b8261260783600661592e565b815181106126175761261761572b565b60200101906001600160f81b03191690815f1a9053506001016125d6565b505f5b60088110156126a05761264c8160076159ec565b612657906008615963565b6001600160401b038616901c60f81b8261267283602661592e565b815181106126825761268261572b565b60200101906001600160f81b03191690815f1a905350600101612638565b505f5b600881101561270b576126b78160076159ec565b6126c2906008615963565b6001600160401b038516901c60f81b826126dd83602e61592e565b815181106126ed576126ed61572b565b60200101906001600160f81b03191690815f1a9053506001016126a3565b5090505b9392505050565b61271e613fe0565b6127278261402b565b611a7d816140a2565b5f612739615247565b5f80516020615f438339815191525f61275185612b4e565b90505f806127628360400151613754565b9150915080156127c75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156127f8576127f8615442565b600581111561280957612809615442565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561287a5761287a615442565b1480612898575060018251600581111561289657612896615442565b145b6128f75760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b60038251600581111561290c5761290c615442565b036129195750600461291d565b5060055b6020808301515f9081526009880190915260408120558181600581111561294657612946615442565b9081600581111561295957612959615442565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561298d5761298d615442565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a4157612a41615442565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ee383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b10575f80fd5b505af1158015612b22573d5f803e3d5ffd5b50505050505050565b5f80516020615ee383398151915254611a7d906001600160a01b03168383614143565b60408051606080820183525f8083526020830181905292820152905f80516020615f438339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bc3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bea9190810190615b13565b9150915080612c4a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612cad5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612d205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612d4c5760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015612d9b57612d638160016159ec565b612d6e906008615963565b61ffff16868281518110612d8457612d8461572b565b016020015160f81c901b9190911790600101612d4f565b5061ffff811615612dbe5760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015612e1957612dd58160036159ec565b612de0906008615963565b63ffffffff1687612df283600261592e565b81518110612e0257612e0261572b565b016020015160f81c901b9190911790600101612dc1565b5063ffffffff8116600414612e405760405162461bcd60e51b815260040161054290615c71565b5f805b6020811015612e9557612e5781601f6159ec565b612e62906008615963565b88612e6e83600661592e565b81518110612e7e57612e7e61572b565b016020015160f81c901b9190911790600101612e43565b505f805b6008811015612ef457612ead8160076159ec565b612eb8906008615963565b6001600160401b031689612ecd83602661592e565b81518110612edd57612edd61572b565b016020015160f81c901b9190911790600101612e99565b505f805b6008811015612f5357612f0c8160076159ec565b612f17906008615963565b6001600160401b03168a612f2c83602e61592e565b81518110612f3c57612f3c61572b565b016020015160f81c901b9190911790600101612ef8565b5091989097509095509350505050565b5f8151602614612f855760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015612fd457612f9c8160016159ec565b612fa7906008615963565b61ffff16848281518110612fbd57612fbd61572b565b016020015160f81c901b9190911790600101612f88565b5061ffff811615612ff75760405162461bcd60e51b815260040161054290615c2e565b5f805b60048110156130525761300e8160036159ec565b613019906008615963565b63ffffffff168561302b83600261592e565b8151811061303b5761303b61572b565b016020015160f81c901b9190911790600101612ffa565b5063ffffffff8116156130775760405162461bcd60e51b815260040161054290615c71565b5f805b60208110156130cc5761308e81601f6159ec565b613099906008615963565b866130a583600661592e565b815181106130b5576130b561572b565b016020015160f81c901b919091179060010161307a565b50949350505050565b6130dd615247565b5f8281525f80516020615f838339815191526020526040808220815160e0810190925280545f80516020615f4383398151915293929190829060ff16600581111561312a5761312a615442565b600581111561313b5761313b615442565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131ad576131ad615442565b146132095760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561324d5761324d615442565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132f98582612398565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f6383398151915280546001190161338157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f6383398151915255565b5f5f80516020615f03833981519152816133b661022c856141a2565b90505f6133c287611fff565b90506133cd87612a7a565b61342a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561343f5761343f615442565b1461349e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f8282608001516134af91906159cc565b600485015460408401519192506134d1916001600160401b0390911690615cb8565b6001600160401b0316816001600160401b031611156135505760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f8061355c8a84612398565b915091505f8a8360405160200161358a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600481111561362557613625615442565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137775760405162461bcd60e51b815260040161054290615be5565b5f805b60028110156137c65761378e8160016159ec565b613799906008615963565b61ffff168582815181106137af576137af61572b565b016020015160f81c901b919091179060010161377a565b5061ffff8116156137e95760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015613844576138008160036159ec565b61380b906008615963565b63ffffffff168661381d83600261592e565b8151811061382d5761382d61572b565b016020015160f81c901b91909117906001016137ec565b5063ffffffff811660031461386b5760405162461bcd60e51b815260040161054290615c71565b5f805b60208110156138c05761388281601f6159ec565b61388d906008615963565b8761389983600661592e565b815181106138a9576138a961572b565b016020015160f81c901b919091179060010161386e565b505f866026815181106138d5576138d561572b565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615f038339815191529061ffff861610801590613941575061271061ffff861611155b61395d5760405162461bcd60e51b815260040161054290615ce3565b60028101546001600160401b0390811690851610156139d65760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613a395760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613aa05760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613aaa846141a2565b90505f613ab682610a49565b90505f613ac389836141c5565b90506040518060600160405280613ad73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613b8d5760405162461bcd60e51b815260040161054290615be5565b5f805b6002811015613bdc57613ba48160016159ec565b613baf906008615963565b61ffff16858281518110613bc557613bc561572b565b016020015160f81c901b9190911790600101613b90565b5061ffff811615613bff5760405162461bcd60e51b815260040161054290615c2e565b5f805b6004811015613c5a57613c168160036159ec565b613c21906008615963565b63ffffffff1686613c3383600261592e565b81518110613c4357613c4361572b565b016020015160f81c901b9190911790600101613c02565b5063ffffffff8116600514613c815760405162461bcd60e51b815260040161054290615c71565b5f805b6020811015613cd657613c9881601f6159ec565b613ca3906008615963565b87613caf83600661592e565b81518110613cbf57613cbf61572b565b016020015160f81c901b9190911790600101613c84565b505f805b6008811015613d3557613cee8160076159ec565b613cf9906008615963565b6001600160401b031688613d0e83602661592e565b81518110613d1e57613d1e61572b565b016020015160f81c901b9190911790600101613cda565b5090969095509350505050565b5f80516020615f438339815191525f6001600160401b038084169085161115613d7657613d6f8385615596565b9050613d83565b613d808484615596565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613de5575060028401548151613de1916001600160401b03169061592e565b8210155b15613e0b576001600160401b038316606082015281815260408101516020820152613e2a565b8281606001818151613e1d91906159cc565b6001600160401b03169052505b6060810151613e3a906064615cb8565b602082015160028601546001600160401b039290921691613e659190600160401b900460ff16615963565b1015613ec95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b031681604001818151613ee4919061592e565b9052506040810180516001600160401b0387169190613f049083906159ec565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f838339815191526020526040812060020180545f80516020615f4383398151915291600160401b9091046001600160401b0316906008613f9a83615d2e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402957604051631afcd79f60e31b815260040160405180910390fd5b565b614033613fe0565b61403c8161472a565b614044614743565b61409f608082013560a083013561406160e0850160c08601615409565b614072610100860160e08701615d49565b61ffff1661408861012087016101008801615d62565b61409a610140880161012089016156cb565b614753565b50565b6140aa613fe0565b5f80516020615ee38339815191526001600160a01b0382166141235760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611ffa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614997565b5f610a59825f80516020615ee3833981519152546001600160a01b0316906149f8565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615f438339815191524261426f6040860160208701615409565b6001600160401b0316116142e15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6142f16040850160208601615409565b6001600160401b03166143076202a3004261592e565b1161437a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356143d25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156144015760405162461bcd60e51b815260040161054290615886565b60306144106040860186615d82565b9050146144755760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b61447f835f613d42565b5f806145196040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144c49190615409565b6001600160401b031681526020016144df60408a018a615d82565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614b5a565b5f828152600786016020526040902091935091506145378282615e08565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145649085906004016155ef565b6020604051808303815f875af1158015614580573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145a491906155b6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561461c5761461c615442565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146fc918e01908e01615409565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614732613fe0565b61473a614f09565b61409f81614f11565b61474b613fe0565b6140296150b3565b61475b613fe0565b5f80516020615f03833981519152836147c75760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b6127108411156147e95760405162461bcd60e51b815260040161054290615ce3565b858711156148515760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff16116148be5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff841611156149305760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6149ab6001600160a01b038416836150bb565b905080515f141580156149cf5750808060200190518101906149cd9190615ec7565b155b15611ffa57604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614a3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a6291906155b6565b9050614a796001600160a01b0385163330866150c8565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614abd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ae191906155b6565b9050818111614b475760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614b5182826159ec565b95945050505050565b5f6060826080015151603014614bc45760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614c3b57614bfb8160016159ec565b614c06906008615963565b5081515f90839083908110614c1d57614c1d61572b565b60200101906001600160f81b03191690815f1a905350600101614be7565b505f5b6004811015614ca357614c528160036159ec565b614c5d906008615963565b600160ff919091161c60f81b82614c7583600261592e565b81518110614c8557614c8561572b565b60200101906001600160f81b03191690815f1a905350600101614c3e565b505f5b6020811015614d005784518160208110614cc257614cc261572b565b1a60f81b82614cd283600661592e565b81518110614ce257614ce261572b565b60200101906001600160f81b03191690815f1a905350600101614ca6565b505f5b6020811015614d605784602001518160208110614d2257614d2261572b565b1a60f81b82614d3283602661592e565b81518110614d4257614d4261572b565b60200101906001600160f81b03191690815f1a905350600101614d03565b505f5b6008811015614dd457614d778160076159ec565b614d82906008615963565b60ff1685604001516001600160401b0316901c60f81b82826046614da6919061592e565b81518110614db657614db661572b565b60200101906001600160f81b03191690815f1a905350600101614d63565b505f5b6030811015614e3f5784608001518181518110614df657614df661572b565b01602001516001600160f81b03191682614e1183604e61592e565b81518110614e2157614e2161572b565b60200101906001600160f81b03191690815f1a905350600101614dd7565b505f5b6008811015614eb157614e568160076159ec565b614e61906008615963565b60608601516001600160401b0390811691161c60f81b82614e8383607e61592e565b81518110614e9357614e9361572b565b60200101906001600160f81b03191690815f1a905350600101614e42565b50600281604051614ec2919061591d565b602060405180830381855afa158015614edd573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614f0091906155b6565b94909350915050565b614029613fe0565b614f19613fe0565b80355f80516020615f4383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614f656080840160608501615d62565b60ff161115614fd25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614fe36080840160608501615d62565b60ff161161504b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b61505b6080830160608401615d62565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561508c6060830160408401615409565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613387613fe0565b606061270f83835f615101565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd90608401614170565b6060814710156151265760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b03168486604051615141919061591d565b5f6040518083038185875af1925050503d805f811461517b576040519150601f19603f3d011682016040523d82523d5f602084013e615180565b606091505b509150915061238e8683836060826151a05761519b826151e7565b61270f565b81511580156151b757506001600160a01b0384163b155b156151e057604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b508061270f565b8051156151f75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461521c906159ff565b5f825580601f1061522b575050565b601f0160209004905f5260205f209081019061409f9190615283565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615297575f8155600101615284565b5090565b801515811461409f575f80fd5b803563ffffffff811681146152bb575f80fd5b919050565b5f805f606084860312156152d2575f80fd5b8335925060208401356152e48161529b565b91506152f2604085016152a8565b90509250925092565b5f6020828403121561530b575f80fd5b5035919050565b6001600160a01b038116811461409f575f80fd5b5f80828403610160811215615339575f80fd5b61014080821215615348575f80fd5b849350830135905061535981615312565b809150509250929050565b5f60208284031215615374575f80fd5b61270f826152a8565b5f806040838503121561538e575f80fd5b615397836152a8565b946020939093013593505050565b5f80604083850312156153b6575f80fd5b82356001600160401b038111156153cb575f80fd5b8301608081860312156153dc575f80fd5b91506153ea602084016152a8565b90509250929050565b80356001600160401b03811681146152bb575f80fd5b5f60208284031215615419575f80fd5b61270f826153f3565b5f8060408385031215615433575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061547957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154b460608401826001600160401b03169052565b5060808301516154cf60808401826001600160401b03169052565b5060a08301516154ea60a08401826001600160401b03169052565b5060c083015161550560c08401826001600160401b03169052565b5092915050565b803561ffff811681146152bb575f80fd5b5f805f8060808587031215615530575f80fd5b84356001600160401b03811115615545575f80fd5b850160608188031215615556575f80fd5b93506155646020860161550c565b9250615572604086016153f3565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561550557615505615582565b5f602082840312156155c6575f80fd5b5051919050565b5f5b838110156155e75781810151838201526020016155cf565b50505f910152565b602081525f825180602084015261560d8160408501602087016155cd565b601f01601f19169190910160400192915050565b5f8261563b57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156db575f80fd5b813561270f81615312565b5f808335601e198436030181126156fb575f80fd5b8301803591506001600160401b03821115615714575f80fd5b6020019150600581901b36038213156124e8575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615753575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156157935761579361575d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156157c1576157c161575d565b604052919050565b5f6001600160401b038211156157e1576157e161575d565b50601f01601f191660200190565b5f606082360312156157ff575f80fd5b615807615771565b8235815260206158188185016153f3565b8183015260408401356001600160401b03811115615834575f80fd5b840136601f820112615844575f80fd5b8035615857615852826157c9565b615799565b818152368483850101111561586a575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158df818460208a016155cd565b80830190508581526001600160401b0360c01b8560c01b166020820152835161590f8160288401602088016155cd565b016028019695505050505050565b5f82516157538184602087016155cd565b80820180821115610a5957610a59615582565b5f63ffffffff80831681810361595957615959615582565b6001019392505050565b8082028115828204841417610a5957610a59615582565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561550557615505615582565b81810381811115610a5957610a59615582565b600181811c90821680615a1357607f821691505b602082108103615a3157634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a90816159ff565b806020870152604060018084165f8114615ab15760018114615acd57615afa565b60ff19851660408a0152604084151560051b8a01019550615afa565b895f5260205f205f5b85811015615af15781548b8201860152908301908801615ad6565b8a016040019650505b509398975050505050505050565b80516152bb8161529b565b5f8060408385031215615b24575f80fd5b82516001600160401b0380821115615b3a575f80fd5b9084019060608287031215615b4d575f80fd5b615b55615771565b82518152602080840151615b6881615312565b82820152604084015183811115615b7d575f80fd5b80850194505087601f850112615b91575f80fd5b83519250615ba1615852846157c9565b8381528882858701011115615bb4575f80fd5b615bc3848383018488016155cd565b80604084015250819550615bd8818801615b08565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cdb57615cdb615582565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b0380831681810361595957615959615582565b5f60208284031215615d59575f80fd5b61270f8261550c565b5f60208284031215615d72575f80fd5b813560ff8116811461270f575f80fd5b5f808335601e19843603018112615d97575f80fd5b8301803591506001600160401b03821115615db0575f80fd5b6020019150368190038213156124e8575f80fd5b601f821115611ffa57805f5260205f20601f840160051c81016020851015615de95750805b601f840160051c820191505b81811015610bd7575f8155600101615df5565b81516001600160401b03811115615e2157615e2161575d565b615e3581615e2f84546159ff565b84615dc4565b602080601f831160018114615e68575f8415615e515750858301515b5f19600386901b1c1916600185901b178555615ebf565b5f85815260208120601f198616915b82811015615e9657888601518255948401946001909101908401615e77565b5085821015615eb357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615ed7575f80fd5b815161270f8161529b56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516164b03803806164b083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6163638061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046156c3565b6103ec565b005b61019e6101ae3660046156fe565b610890565b6101f16101c13660046156fe565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046156fe565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615729565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615767565b610b3e565b61019e610299366004615780565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c93660046157a8565b610db3565b6101f16102dc36600461580c565b611351565b6102316102ef3660046156fe565b61136a565b61019e6103023660046156c3565b61137e565b61020c603081565b61019e61031d3660046156fe565b6115c1565b61019e610330366004615780565b6116c7565b6101f1610343366004615825565b6119eb565b61019e610356366004615767565b611a17565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046156fe565b611bcf565b61019e6103a23660046156fe565b611e55565b61020c601481565b6103c26103bd3660046156fe565b611f69565b6040516101fb9190615859565b6102316202a30081565b6101f16103e7366004615920565b612031565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206162b783398151915293929190829060ff16600481111561044d5761044d615845565b600481111561045e5761045e615845565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611f69565b90506002835160048111156104f9576104f9615845565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f805160206162d78339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f805160206162d78339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615845565b036106235786156105e4576105e18387612066565b90505b5f846060015183608001516105f99190615999565b90506106058482612302565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a8660600151611351565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b91906159b9565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615845565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206163378339815191526020526040808220815160e0810190925280545f805160206162f783398151915293929190829060ff1660058111156108dd576108dd615845565b60058111156108ee576108ee615845565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615845565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f612459565b6040518263ffffffff1660e01b8152600401610a0391906159f2565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4391906159b9565b50505050565b5f610a5964e8d4a5100083615a24565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af18484612680565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206162b78339815191525f80610b578461269a565b91509150610b64826129e4565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615845565b03610bc1575f83815260088501602052604081208054919055610bbf8282612a1f565b505b610bd781610bd28460400151611351565b612a95565b5050505050565b5f805160206162b78339815191525f610bf684612ab8565b90505f80610c078360400151612c92565b50915091505f610c1683611f69565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b815260040161054290615a43565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615a85565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615845565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206162f78339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb791906159b9565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a6060850160408601615ace565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa6060850185615ae9565b905090505f805b828163ffffffff161015611255575f610fcd6060880188615ae9565b8363ffffffff16818110610fe357610fe3615b2e565b9050602002810190610ff59190615b42565b610ffe90615bf2565b80515f81815260098801602052604090205491925090156110315760405162461bcd60e51b815260040161054290615c89565b5f6002895f01358560405160200161106092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261107a91615cd1565b602060405180830381855afa158015611095573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110b891906159b9565b5f8381526009890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088c01909252909120815181549394509192909190829060ff1916600183600581111561114457611144615845565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111f7911686615ce2565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061124e90615cf5565b9050610fb1565b50600583018190555f61126785612ab8565b90505f6112778260400151612ecd565b90505f6112838861303f565b9050816002826040516112969190615cd1565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d491906159b9565b146113385760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615d17565b5f61137482611f69565b6080015192915050565b5f805160206162b78339815191525f611396856134d8565b90506113a1856129e4565b6113ac575050505050565b5f8581526005830160205260409020546001600160a01b031633146113e35760405162461bcd60e51b815260040161054290615d2e565b5f85815260058301602052604090205460a082015161141291600160b01b90046001600160401b031690615d80565b6001600160401b03168160c001516001600160401b031610156114935760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f6114a48685612066565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906114fb90611351565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611571573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159591906159b9565b5f878152600885016020526040812080549091906115b4908490615ce2565b9091555050505050505050565b5f805160206162b78339815191525f6115d983611f69565b90506004815160058111156115f0576115f0615845565b1461165a5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146116915760405162461bcd60e51b815260040161054290615d2e565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612a1f565b6116cf613753565b5f805160206162b78339815191525f6116e784612ab8565b90505f806116f88360400151612c92565b50915091505f61170783611f69565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561174157611741615845565b600481111561175257611752615845565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118365760405162461bcd60e51b815260040161054290615a43565b826001600160401b03168160e001516001600160401b0316111561186c5760405162461bcd60e51b815260040161054290615a85565b60038151600481111561188157611881615845565b146118d55760405162461bcd60e51b815260206004820152603160248201525f805160206162d78339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a019092528220549091906127109061191690600160a01b900461ffff1684615d17565b6119209190615a24565b905080886008015f8881526020019081526020015f205f8282546119449190615ce2565b909155505f90506119558284615da0565b9050611965846020015182612a1f565b61197a8460200151610bd28660600151611351565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d503384866040516119c0929190918252602082015260400190565b60405180910390a45050505050505050506119e760015f8051602061631783398151915255565b5050565b5f6119f4613753565b6119ff83338461379d565b9050610a5960015f8051602061631783398151915255565b5f805160206162f78339815191525f611a2f83612ab8565b90505f80611a408360400151613b57565b9150915080611aa25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611abc90615db3565b9050118015611aee575060015f83815260088601602052604090205460ff166005811115611aec57611aec615845565b145b611b0a5760405162461bcd60e51b815260040161054290615deb565b5f8281526007850160205260408120611b2291615613565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206162b783398151915293929190829060ff166004811115611c3057611c30615845565b6004811115611c4157611c41615845565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611cc857611cc8615845565b1480611ce65750600381516004811115611ce457611ce4615845565b145b611d3a5760405162461bcd60e51b815260206004820152603260248201525f805160206162d7833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611d488260400151611f69565b905080606001516001600160401b03165f03611dcc5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611df9846040015184606001518560800151612459565b6040518263ffffffff1660e01b8152600401611e1591906159f2565b6020604051808303815f875af1158015611e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd791906159b9565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206162f7833981519152929190611e9d90615db3565b9050118015611ecf575060015f83815260088301602052604090205460ff166005811115611ecd57611ecd615845565b145b611eeb5760405162461bcd60e51b815260040161054290615deb565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f249190600401615e32565b6020604051808303815f875af1158015611f40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f6491906159b9565b505050565b611f7161564a565b5f8281525f80516020616337833981519152602052604090819020815160e0810190925280545f805160206162f7833981519152929190829060ff166005811115611fbe57611fbe615845565b6005811115611fcf57611fcf615845565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61203a613753565b61204685858585613cf8565b905061205e60015f8051602061631783398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156120b1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d89190810190615ec7565b915091508061213b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561217e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121a291906159b9565b8251146122065760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b03161561227c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f8061228b8460400151613f6d565b915091508187146122f85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020616337833981519152602052604081206002015481905f805160206162f783398151915290600160801b90046001600160401b031661234a8582614145565b5f61235487614353565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123a48a858b612459565b6040518263ffffffff1660e01b81526004016123c091906159f2565b6020604051808303815f875af11580156123dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061240091906159b9565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156124d257612492816001615da0565b61249d906008615d17565b5081515f908390839081106124b4576124b4615b2e565b60200101906001600160f81b03191690815f1a90535060010161247e565b505f5b600481101561253d576124e9816003615da0565b6124f4906008615d17565b600263ffffffff16901c60f81b8282600261250f9190615ce2565b8151811061251f5761251f615b2e565b60200101906001600160f81b03191690815f1a9053506001016124d5565b505f5b602081101561259f5761255481601f615da0565b61255f906008615d17565b86901c60f81b82612571836006615ce2565b8151811061258157612581615b2e565b60200101906001600160f81b03191690815f1a905350600101612540565b505f5b600881101561260a576125b6816007615da0565b6125c1906008615d17565b6001600160401b038616901c60f81b826125dc836026615ce2565b815181106125ec576125ec615b2e565b60200101906001600160f81b03191690815f1a9053506001016125a2565b505f5b600881101561267557612621816007615da0565b61262c906008615d17565b6001600160401b038516901c60f81b8261264783602e615ce2565b8151811061265757612657615b2e565b60200101906001600160f81b03191690815f1a90535060010161260d565b5090505b9392505050565b6126886143e3565b6126918261442e565b6119e7816144a5565b5f6126a361564a565b5f805160206162f78339815191525f6126bb85612ab8565b90505f806126cc8360400151613b57565b9150915080156127315760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561276257612762615845565b600581111561277357612773615845565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156127e4576127e4615845565b1480612802575060018251600581111561280057612800615845565b145b6128615760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b60038251600581111561287657612876615845565b0361288357506004612887565b5060055b6020808301515f908152600988019091526040812055818160058111156128b0576128b0615845565b908160058111156128c3576128c3615845565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156128f7576128f7615845565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156129ab576129ab615845565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f8051602061629783398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a7a575f80fd5b505af1158015612a8c573d5f803e3d5ffd5b50505050505050565b5f80516020616297833981519152546119e7906001600160a01b03168383614546565b60408051606080820183525f8083526020830181905292820152905f805160206162f78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612b2d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612b549190810190615ec7565b9150915080612bb45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612c175760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612c8a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612cb65760405162461bcd60e51b815260040161054290615f99565b5f805b6002811015612d0557612ccd816001615da0565b612cd8906008615d17565b61ffff16868281518110612cee57612cee615b2e565b016020015160f81c901b9190911790600101612cb9565b5061ffff811615612d285760405162461bcd60e51b815260040161054290615fe2565b5f805b6004811015612d8357612d3f816003615da0565b612d4a906008615d17565b63ffffffff1687612d5c836002615ce2565b81518110612d6c57612d6c615b2e565b016020015160f81c901b9190911790600101612d2b565b5063ffffffff8116600414612daa5760405162461bcd60e51b815260040161054290616025565b5f805b6020811015612dff57612dc181601f615da0565b612dcc906008615d17565b88612dd8836006615ce2565b81518110612de857612de8615b2e565b016020015160f81c901b9190911790600101612dad565b505f805b6008811015612e5e57612e17816007615da0565b612e22906008615d17565b6001600160401b031689612e37836026615ce2565b81518110612e4757612e47615b2e565b016020015160f81c901b9190911790600101612e03565b505f805b6008811015612ebd57612e76816007615da0565b612e81906008615d17565b6001600160401b03168a612e9683602e615ce2565b81518110612ea657612ea6615b2e565b016020015160f81c901b9190911790600101612e62565b5091989097509095509350505050565b5f8151602614612eef5760405162461bcd60e51b815260040161054290615f99565b5f805b6002811015612f3e57612f06816001615da0565b612f11906008615d17565b61ffff16848281518110612f2757612f27615b2e565b016020015160f81c901b9190911790600101612ef2565b5061ffff811615612f615760405162461bcd60e51b815260040161054290615fe2565b5f805b6004811015612fbc57612f78816003615da0565b612f83906008615d17565b63ffffffff1685612f95836002615ce2565b81518110612fa557612fa5615b2e565b016020015160f81c901b9190911790600101612f64565b5063ffffffff811615612fe15760405162461bcd60e51b815260040161054290616025565b5f805b602081101561303657612ff881601f615da0565b613003906008615d17565b8661300f836006615ce2565b8151811061301f5761301f615b2e565b016020015160f81c901b9190911790600101612fe4565b50949350505050565b60605f61304e83830184615ae9565b61305a91506058615d17565b61306590605c615ce2565b6001600160401b0381111561307c5761307c615b60565b6040519080825280601f01601f1916602001820160405280156130a6576020820181803683370190505b5090505f5b60208110156130fb57833581602081106130c7576130c7615b2e565b1a60f81b8282815181106130dd576130dd615b2e565b60200101906001600160f81b03191690815f1a9053506001016130ab565b505f5b602081101561315b578360200135816020811061311d5761311d615b2e565b1a60f81b8261312d836020615ce2565b8151811061313d5761313d615b2e565b60200101906001600160f81b03191690815f1a9053506001016130fe565b505f5b60048110156131be57613172816003615da0565b61317d906008615d17565b6014901c60f81b82613190836040615ce2565b815181106131a0576131a0615b2e565b60200101906001600160f81b03191690815f1a90535060010161315e565b505f6131d06060850160408601615ace565b60601b90505f5b6014811015613230578181601481106131f2576131f2615b2e565b1a60f81b83613202836044615ce2565b8151811061321257613212615b2e565b60200101906001600160f81b03191690815f1a9053506001016131d7565b505f61323f6060860186615ae9565b905090505f5b60048110156132aa57613259816003615da0565b613264906008615d17565b63ffffffff8316901c60f81b8461327c836058615ce2565b8151811061328c5761328c615b2e565b60200101906001600160f81b03191690815f1a905350600101613245565b505f5b6132ba6060870187615ae9565b90508110156134ce575f6132cf826058615d17565b6132da90605c615ce2565b90505f5b6020811015613365576132f46060890189615ae9565b8481811061330457613304615b2e565b90506020028101906133169190615b42565b35816020811061332857613328615b2e565b1a60f81b866133378385615ce2565b8151811061334757613347615b2e565b60200101906001600160f81b03191690815f1a9053506001016132de565b505f5b600881101561341a5761337c816007615da0565b613387906008615d17565b61339460608a018a615ae9565b858181106133a4576133a4615b2e565b90506020028101906133b69190615b42565b6133c790604081019060200161580c565b6001600160401b0316901c60f81b86826133e2856020615ce2565b6133ec9190615ce2565b815181106133fc576133fc615b2e565b60200101906001600160f81b03191690815f1a905350600101613368565b505f5b60308110156134c4576134336060890189615ae9565b8481811061344357613443615b2e565b90506020028101906134559190615b42565b61346390604081019061606c565b8281811061347357613473615b2e565b9050013560f81c60f81b868284602861348c9190615ce2565b6134969190615ce2565b815181106134a6576134a6615b2e565b60200101906001600160f81b03191690815f1a90535060010161341d565b50506001016132ad565b5091949350505050565b6134e061564a565b5f8281525f805160206163378339815191526020526040808220815160e0810190925280545f805160206162f783398151915293929190829060ff16600581111561352d5761352d615845565b600581111561353e5761353e615845565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156135b0576135b0615845565b1461360c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561365057613650615845565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136fc8582612302565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061631783398151915280546001190161378457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061631783398151915255565b5f5f805160206162b7833981519152816137b961022c856145a5565b90505f6137c587611f69565b90506137d0876129e4565b61382d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561384257613842615845565b146138a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f8282608001516138b29190615d80565b600485015460408401519192506138d4916001600160401b03909116906160ae565b6001600160401b0316816001600160401b031611156139535760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f8061395f8a84612302565b915091505f8a8360405160200161398d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613a2857613a28615845565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613b7a5760405162461bcd60e51b815260040161054290615f99565b5f805b6002811015613bc957613b91816001615da0565b613b9c906008615d17565b61ffff16858281518110613bb257613bb2615b2e565b016020015160f81c901b9190911790600101613b7d565b5061ffff811615613bec5760405162461bcd60e51b815260040161054290615fe2565b5f805b6004811015613c4757613c03816003615da0565b613c0e906008615d17565b63ffffffff1686613c20836002615ce2565b81518110613c3057613c30615b2e565b016020015160f81c901b9190911790600101613bef565b5063ffffffff8116600314613c6e5760405162461bcd60e51b815260040161054290616025565b5f805b6020811015613cc357613c8581601f615da0565b613c90906008615d17565b87613c9c836006615ce2565b81518110613cac57613cac615b2e565b016020015160f81c901b9190911790600101613c71565b505f86602681518110613cd857613cd8615b2e565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206162b78339815191529061ffff861610801590613d44575061271061ffff861611155b613d605760405162461bcd60e51b8152600401610542906160d9565b60028101546001600160401b039081169085161015613dd95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613e3c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613ea35760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613ead846145a5565b90505f613eb982610a49565b90505f613ec689836145c8565b90506040518060600160405280613eda3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613f905760405162461bcd60e51b815260040161054290615f99565b5f805b6002811015613fdf57613fa7816001615da0565b613fb2906008615d17565b61ffff16858281518110613fc857613fc8615b2e565b016020015160f81c901b9190911790600101613f93565b5061ffff8116156140025760405162461bcd60e51b815260040161054290615fe2565b5f805b600481101561405d57614019816003615da0565b614024906008615d17565b63ffffffff1686614036836002615ce2565b8151811061404657614046615b2e565b016020015160f81c901b9190911790600101614005565b5063ffffffff81166005146140845760405162461bcd60e51b815260040161054290616025565b5f805b60208110156140d95761409b81601f615da0565b6140a6906008615d17565b876140b2836006615ce2565b815181106140c2576140c2615b2e565b016020015160f81c901b9190911790600101614087565b505f805b6008811015614138576140f1816007615da0565b6140fc906008615d17565b6001600160401b031688614111836026615ce2565b8151811061412157614121615b2e565b016020015160f81c901b91909117906001016140dd565b5090969095509350505050565b5f805160206162f78339815191525f6001600160401b038084169085161115614179576141728385615999565b9050614186565b6141838484615999565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b03166060820152429115806141e85750600284015481516141e4916001600160401b031690615ce2565b8210155b1561420e576001600160401b03831660608201528181526040810151602082015261422d565b82816060018181516142209190615d80565b6001600160401b03169052505b606081015161423d9060646160ae565b602082015160028601546001600160401b0392909216916142689190600160401b900460ff16615d17565b10156142cc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b0316816040018181516142e79190615ce2565b9052506040810180516001600160401b0387169190614307908390615da0565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206163378339815191526020526040812060020180545f805160206162f783398151915291600160401b9091046001600160401b031690600861439d83616124565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661442c57604051631afcd79f60e31b815260040160405180910390fd5b565b6144366143e3565b61443f81614b2d565b614447614b46565b6144a2608082013560a083013561446460e0850160c0860161580c565b614475610100860160e0870161613f565b61ffff1661448b61012087016101008801616158565b61449d61014088016101208901615ace565b614b56565b50565b6144ad6143e3565b5f805160206162978339815191526001600160a01b0382166145265760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611f6491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614d9a565b5f610a59825f80516020616297833981519152546001600160a01b031690614dfb565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166146535760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f805160206162f783398151915242614672604086016020870161580c565b6001600160401b0316116146e45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6146f4604085016020860161580c565b6001600160401b031661470a6202a30042615ce2565b1161477d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356147d55760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156148045760405162461bcd60e51b815260040161054290615c89565b6030614813604086018661606c565b9050146148785760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b614882835f614145565b5f8061491c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906148c7919061580c565b6001600160401b031681526020016148e260408a018a61606c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614f5d565b5f8281526007860160205260409020919350915061493a82826161bc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906149679085906004016159f2565b6020604051808303815f875af1158015614983573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149a791906159b9565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614a1f57614a1f615845565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614aff918e01908e0161580c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614b356143e3565b614b3d61530c565b6144a281615314565b614b4e6143e3565b61442c6154b6565b614b5e6143e3565b5f805160206162b783398151915283614bca5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b612710841115614bec5760405162461bcd60e51b8152600401610542906160d9565b85871115614c545760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff1611614cc15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff84161115614d335760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f614dae6001600160a01b038416836154be565b905080515f14158015614dd2575080806020019051810190614dd0919061627b565b155b15611f6457604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614e41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e6591906159b9565b9050614e7c6001600160a01b0385163330866154cb565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614ec0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ee491906159b9565b9050818111614f4a5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614f548282615da0565b95945050505050565b5f6060826080015151603014614fc75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561503e57614ffe816001615da0565b615009906008615d17565b5081515f9083908390811061502057615020615b2e565b60200101906001600160f81b03191690815f1a905350600101614fea565b505f5b60048110156150a657615055816003615da0565b615060906008615d17565b600160ff919091161c60f81b82615078836002615ce2565b8151811061508857615088615b2e565b60200101906001600160f81b03191690815f1a905350600101615041565b505f5b602081101561510357845181602081106150c5576150c5615b2e565b1a60f81b826150d5836006615ce2565b815181106150e5576150e5615b2e565b60200101906001600160f81b03191690815f1a9053506001016150a9565b505f5b6020811015615163578460200151816020811061512557615125615b2e565b1a60f81b82615135836026615ce2565b8151811061514557615145615b2e565b60200101906001600160f81b03191690815f1a905350600101615106565b505f5b60088110156151d75761517a816007615da0565b615185906008615d17565b60ff1685604001516001600160401b0316901c60f81b828260466151a99190615ce2565b815181106151b9576151b9615b2e565b60200101906001600160f81b03191690815f1a905350600101615166565b505f5b603081101561524257846080015181815181106151f9576151f9615b2e565b01602001516001600160f81b0319168261521483604e615ce2565b8151811061522457615224615b2e565b60200101906001600160f81b03191690815f1a9053506001016151da565b505f5b60088110156152b457615259816007615da0565b615264906008615d17565b60608601516001600160401b0390811691161c60f81b8261528683607e615ce2565b8151811061529657615296615b2e565b60200101906001600160f81b03191690815f1a905350600101615245565b506002816040516152c59190615cd1565b602060405180830381855afa1580156152e0573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061530391906159b9565b94909350915050565b61442c6143e3565b61531c6143e3565b80355f805160206162f783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146153686080840160608501616158565b60ff1611156153d55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f6153e66080840160608501616158565b60ff161161544e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b61545e6080830160608401616158565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561548f606083016040840161580c565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61378a6143e3565b606061267983835f615504565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd90608401614573565b6060814710156155295760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b031684866040516155449190615cd1565b5f6040518083038185875af1925050503d805f811461557e576040519150601f19603f3d011682016040523d82523d5f602084013e615583565b606091505b50915091506122f88683836060826155a35761559e826155ea565b612679565b81511580156155ba57506001600160a01b0384163b155b156155e357604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b5080612679565b8051156155fa5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461561f90615db3565b5f825580601f1061562e575050565b601f0160209004905f5260205f20908101906144a29190615686565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561569a575f8155600101615687565b5090565b80151581146144a2575f80fd5b803563ffffffff811681146156be575f80fd5b919050565b5f805f606084860312156156d5575f80fd5b8335925060208401356156e78161569e565b91506156f5604085016156ab565b90509250925092565b5f6020828403121561570e575f80fd5b5035919050565b6001600160a01b03811681146144a2575f80fd5b5f8082840361016081121561573c575f80fd5b6101408082121561574b575f80fd5b849350830135905061575c81615715565b809150509250929050565b5f60208284031215615777575f80fd5b612679826156ab565b5f8060408385031215615791575f80fd5b61579a836156ab565b946020939093013593505050565b5f80604083850312156157b9575f80fd5b82356001600160401b038111156157ce575f80fd5b8301608081860312156157df575f80fd5b91506157ed602084016156ab565b90509250929050565b80356001600160401b03811681146156be575f80fd5b5f6020828403121561581c575f80fd5b612679826157f6565b5f8060408385031215615836575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061587c57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516158b760608401826001600160401b03169052565b5060808301516158d260808401826001600160401b03169052565b5060a08301516158ed60a08401826001600160401b03169052565b5060c083015161590860c08401826001600160401b03169052565b5092915050565b803561ffff811681146156be575f80fd5b5f805f8060808587031215615933575f80fd5b84356001600160401b03811115615948575f80fd5b850160608188031215615959575f80fd5b93506159676020860161590f565b9250615975604086016157f6565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561590857615908615985565b5f602082840312156159c9575f80fd5b5051919050565b5f5b838110156159ea5781810151838201526020016159d2565b50505f910152565b602081525f8251806020840152615a108160408501602087016159d0565b601f01601f19169190910160400192915050565b5f82615a3e57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615ade575f80fd5b813561267981615715565b5f808335601e19843603018112615afe575f80fd5b8301803591506001600160401b03821115615b17575f80fd5b6020019150600581901b3603821315612452575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615b56575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b9657615b96615b60565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615bc457615bc4615b60565b604052919050565b5f6001600160401b03821115615be457615be4615b60565b50601f01601f191660200190565b5f60608236031215615c02575f80fd5b615c0a615b74565b823581526020615c1b8185016157f6565b8183015260408401356001600160401b03811115615c37575f80fd5b840136601f820112615c47575f80fd5b8035615c5a615c5582615bcc565b615b9c565b8181523684838501011115615c6d575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8251615b568184602087016159d0565b80820180821115610a5957610a59615985565b5f63ffffffff808316818103615d0d57615d0d615985565b6001019392505050565b8082028115828204841417610a5957610a59615985565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561590857615908615985565b81810381811115610a5957610a59615985565b600181811c90821680615dc757607f821691505b602082108103615de557634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615e4481615db3565b806020870152604060018084165f8114615e655760018114615e8157615eae565b60ff19851660408a0152604084151560051b8a01019550615eae565b895f5260205f205f5b85811015615ea55781548b8201860152908301908801615e8a565b8a016040019650505b509398975050505050505050565b80516156be8161569e565b5f8060408385031215615ed8575f80fd5b82516001600160401b0380821115615eee575f80fd5b9084019060608287031215615f01575f80fd5b615f09615b74565b82518152602080840151615f1c81615715565b82820152604084015183811115615f31575f80fd5b80850194505087601f850112615f45575f80fd5b83519250615f55615c5584615bcc565b8381528882858701011115615f68575f80fd5b615f77848383018488016159d0565b80604084015250819550615f8c818801615ebc565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112616081575f80fd5b8301803591506001600160401b0382111561609a575f80fd5b602001915036819003821315612452575f80fd5b6001600160401b038181168382160280821691908281146160d1576160d1615985565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b03808316818103615d0d57615d0d615985565b5f6020828403121561614f575f80fd5b6126798261590f565b5f60208284031215616168575f80fd5b813560ff81168114612679575f80fd5b601f821115611f6457805f5260205f20601f840160051c8101602085101561619d5750805b601f840160051c820191505b81811015610bd7575f81556001016161a9565b81516001600160401b038111156161d5576161d5615b60565b6161e9816161e38454615db3565b84616178565b602080601f83116001811461621c575f84156162055750858301515b5f19600386901b1c1916600185901b178555616273565b5f85815260208120601f198616915b8281101561624a5788860151825594840194600190910190840161622b565b508582101561626757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561628b575f80fd5b81516126798161569e56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // 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 731fe5258..290d3b83c 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615dba380380615dba83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c6d8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b336600461501b565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615056565b6109d8565b3480156101e4575f80fd5b506102236101f3366004615056565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b861027636600461506d565b610b91565b348015610286575f80fd5b5061029a610295366004615056565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046150ab565b610c84565b34801561032a575f80fd5b506101b86103393660046150ff565b610cb8565b348015610349575f80fd5b506101b8610358366004615118565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615140565b610f2d565b3480156103b0575f80fd5b506102236103bf36600461518e565b611561565b3480156103cf575f80fd5b5061029a6103de366004615056565b61157a565b3480156103ee575f80fd5b506101b86103fd36600461501b565b61158e565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615056565b6117d1565b348015610440575f80fd5b506101b861044f366004615118565b6118d7565b34801561045f575f80fd5b506101b861046e3660046150ff565b611bfb565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615056565b611db3565b3480156104b7575f80fd5b506101b86104c6366004615056565b612039565b6102236104d9366004615056565b61214d565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615056565b61217e565b60405161022d91906151bb565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc183398151915293929190829060ff166004811115610595576105956151a7565b60048111156105a6576105a66151a7565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a8261217e565b9050600283516004811115610641576106416151a7565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615be18339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615be18339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f906002906005811115610714576107146151a7565b0361076b57861561072c576107298387612246565b90505b5f846060015183608001516107419190615285565b905061074d84826124e2565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d28660600151611561565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087391906152a5565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b26151a7565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c418339815191526020526040808220815160e0810190925280545f80516020615c0183398151915293929190829060ff166005811115610a2557610a256151a7565b6005811115610a3657610a366151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa56151a7565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f612639565b6040518263ffffffff1660e01b8152600401610b4b91906152de565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b91906152a5565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c228361285e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a5100083615310565b92915050565b5f610c8d612872565b610c99848484346128a9565b9050610cb160015f80516020615c2183398151915255565b9392505050565b5f80516020615bc18339815191525f80610cd184612b26565b91509150610cde82612e70565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d166151a7565b03610d3b575f83815260088501602052604081208054919055610d398282612eab565b505b610d5181610d4c8460400151611561565b612f11565b5050505050565b5f80516020615bc18339815191525f610d7084612f24565b90505f80610d8183604001516130fe565b50915091505f610d908361217e565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a9061532f565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615371565b60015f87815260068701602052604090205460ff166004811115610e3357610e336151a7565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615c018339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103191906152a5565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016153ce565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856153e9565b91505f90508435602086013560146111426060890160408a016153ce565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611471575f6111c260608901896153e9565b8363ffffffff168181106111d8576111d861542e565b90506020028101906111ea9190615442565b6111f3906154f2565b80515f81815260098901602052604090205491925090156112265760405162461bcd60e51b815260040161068a90615589565b84825f01518360200151846040015160405160200161124894939291906155d1565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112969190615620565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d491906152a5565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115611360576113606151a7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611413911686615631565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061146a90615644565b90506111a6565b50600584018190555f61148386612f24565b90505f6114938260400151613339565b9050806002856040516114a69190615620565b602060405180830381855afa1580156114c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114e491906152a5565b146115485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a51000615666565b5f6115848261217e565b6080015192915050565b5f80516020615bc18339815191525f6115a6856134a2565b90506115b185612e70565b6115bc575050505050565b5f8581526005830160205260409020546001600160a01b031633146115f35760405162461bcd60e51b815260040161068a9061567d565b5f85815260058301602052604090205460a082015161162291600160b01b90046001600160401b0316906156cf565b6001600160401b03168160c001516001600160401b031610156116a35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f6116b48685612246565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061170b90611561565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611781573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117a591906152a5565b5f878152600885016020526040812080549091906117c4908490615631565b9091555050505050505050565b5f80516020615bc18339815191525f6117e98361217e565b9050600481516005811115611800576118006151a7565b1461186a5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b031633146118a15760405162461bcd60e51b815260040161068a9061567d565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612eab565b6118df612872565b5f80516020615bc18339815191525f6118f784612f24565b90505f8061190883604001516130fe565b50915091505f6119178361217e565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611951576119516151a7565b6004811115611962576119626151a7565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a465760405162461bcd60e51b815260040161068a9061532f565b826001600160401b03168160e001516001600160401b03161115611a7c5760405162461bcd60e51b815260040161068a90615371565b600381516004811115611a9157611a916151a7565b14611ae55760405162461bcd60e51b815260206004820152603160248201525f80516020615be18339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b2690600160a01b900461ffff1684615666565b611b309190615310565b905080886008015f8881526020019081526020015f205f828254611b549190615631565b909155505f9050611b6582846156ef565b9050611b75846020015182612eab565b611b8a8460200151610d4c8660600151611561565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611bd0929190918252602082015260400190565b60405180910390a4505050505050505050611bf760015f80516020615c2183398151915255565b5050565b5f80516020615c018339815191525f611c1383612f24565b90505f80611c24836040015161371d565b9150915080611c865760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611ca090615702565b9050118015611cd2575060015f83815260088601602052604090205460ff166005811115611cd057611cd06151a7565b145b611cee5760405162461bcd60e51b815260040161068a90615734565b5f8281526007850160205260408120611d0691614f70565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc183398151915293929190829060ff166004811115611e1457611e146151a7565b6004811115611e2557611e256151a7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611eac57611eac6151a7565b1480611eca5750600381516004811115611ec857611ec86151a7565b145b611f1e5760405162461bcd60e51b815260206004820152603260248201525f80516020615be1833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611f2c826040015161217e565b905080606001516001600160401b03165f03611fb05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611fdd846040015184606001518560800151612639565b6040518263ffffffff1660e01b8152600401611ff991906152de565b6020604051808303815f875af1158015612015573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5191906152a5565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615c0183398151915292919061208190615702565b90501180156120b3575060015f83815260088301602052604090205460ff1660058111156120b1576120b16151a7565b145b6120cf5760405162461bcd60e51b815260040161068a90615734565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612108919060040161577b565b6020604051808303815f875af1158015612124573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214891906152a5565b505050565b5f612156612872565b6121618233346138be565b905061217960015f80516020615c2183398151915255565b919050565b612186614fa7565b5f8281525f80516020615c41833981519152602052604090819020815160e0810190925280545f80516020615c01833981519152929190829060ff1660058111156121d3576121d36151a7565b60058111156121e4576121e46151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612291573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122b89190810190615810565b915091508061231b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561235e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238291906152a5565b8251146123e65760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b03161561245c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f8061246b8460400151613c75565b915091508187146124d85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615c41833981519152602052604081206002015481905f80516020615c0183398151915290600160801b90046001600160401b031661252a8582613e4d565b5f6125348761405b565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125848a858b612639565b6040518263ffffffff1660e01b81526004016125a091906152de565b6020604051808303815f875af11580156125bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125e091906152a5565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126b2576126728160016156ef565b61267d906008615666565b5081515f908390839081106126945761269461542e565b60200101906001600160f81b03191690815f1a90535060010161265e565b505f5b600481101561271d576126c98160036156ef565b6126d4906008615666565b600263ffffffff16901c60f81b828260026126ef9190615631565b815181106126ff576126ff61542e565b60200101906001600160f81b03191690815f1a9053506001016126b5565b505f5b602081101561277f5761273481601f6156ef565b61273f906008615666565b86901c60f81b82612751836006615631565b815181106127615761276161542e565b60200101906001600160f81b03191690815f1a905350600101612720565b505f5b60088110156127ea576127968160076156ef565b6127a1906008615666565b6001600160401b038616901c60f81b826127bc836026615631565b815181106127cc576127cc61542e565b60200101906001600160f81b03191690815f1a905350600101612782565b505f5b6008811015612855576128018160076156ef565b61280c906008615666565b6001600160401b038516901c60f81b8261282783602e615631565b815181106128375761283761542e565b60200101906001600160f81b03191690815f1a9053506001016127ed565b50949350505050565b6128666140eb565b61286f81614136565b50565b5f80516020615c218339815191528054600119016128a357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bc18339815191529061ffff8616108015906128f5575061271061ffff861611155b6129115760405162461bcd60e51b815260040161068a906158e2565b60028101546001600160401b03908116908516101561298a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129ed5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b8060010154831115612a545760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f612a5f82610c6e565b90505f612a6c89836141aa565b90506040518060600160405280612a803390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c2183398151915255565b5f612b2f614fa7565b5f80516020615c018339815191525f612b4785612f24565b90505f80612b58836040015161371d565b915091508015612bbd5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612bee57612bee6151a7565b6005811115612bff57612bff6151a7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c7057612c706151a7565b1480612c8e5750600182516005811115612c8c57612c8c6151a7565b145b612ced5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612d0257612d026151a7565b03612d0f57506004612d13565b5060055b6020808301515f90815260098801909152604081205581816005811115612d3c57612d3c6151a7565b90816005811115612d4f57612d4f6151a7565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612d8357612d836151a7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e3757612e376151a7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612ef7575f80fd5b505af1158015612f09573d5f803e3d5ffd5b505050505050565b611bf76001600160a01b0383168261470f565b60408051606080820183525f8083526020830181905292820152905f80516020615c018339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f99573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fc09190810190615810565b91509150806130205760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b82548251146130835760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130f65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f83516036146131225760405162461bcd60e51b815260040161068a9061592d565b5f805b6002811015613171576131398160016156ef565b613144906008615666565b61ffff1686828151811061315a5761315a61542e565b016020015160f81c901b9190911790600101613125565b5061ffff8116156131945760405162461bcd60e51b815260040161068a90615976565b5f805b60048110156131ef576131ab8160036156ef565b6131b6906008615666565b63ffffffff16876131c8836002615631565b815181106131d8576131d861542e565b016020015160f81c901b9190911790600101613197565b5063ffffffff81166004146132165760405162461bcd60e51b815260040161068a906159b9565b5f805b602081101561326b5761322d81601f6156ef565b613238906008615666565b88613244836006615631565b815181106132545761325461542e565b016020015160f81c901b9190911790600101613219565b505f805b60088110156132ca576132838160076156ef565b61328e906008615666565b6001600160401b0316896132a3836026615631565b815181106132b3576132b361542e565b016020015160f81c901b919091179060010161326f565b505f805b6008811015613329576132e28160076156ef565b6132ed906008615666565b6001600160401b03168a61330283602e615631565b815181106133125761331261542e565b016020015160f81c901b91909117906001016132ce565b5091989097509095509350505050565b5f815160261461335b5760405162461bcd60e51b815260040161068a9061592d565b5f805b60028110156133aa576133728160016156ef565b61337d906008615666565b61ffff168482815181106133935761339361542e565b016020015160f81c901b919091179060010161335e565b5061ffff8116156133cd5760405162461bcd60e51b815260040161068a90615976565b5f805b6004811015613428576133e48160036156ef565b6133ef906008615666565b63ffffffff1685613401836002615631565b815181106134115761341161542e565b016020015160f81c901b91909117906001016133d0565b5063ffffffff81161561344d5760405162461bcd60e51b815260040161068a906159b9565b5f805b60208110156128555761346481601f6156ef565b61346f906008615666565b8661347b836006615631565b8151811061348b5761348b61542e565b016020015160f81c901b9190911790600101613450565b6134aa614fa7565b5f8281525f80516020615c418339815191526020526040808220815160e0810190925280545f80516020615c0183398151915293929190829060ff1660058111156134f7576134f76151a7565b6005811115613508576135086151a7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561357a5761357a6151a7565b146135d65760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561361a5761361a6151a7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136c685826124e2565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137405760405162461bcd60e51b815260040161068a9061592d565b5f805b600281101561378f576137578160016156ef565b613762906008615666565b61ffff168582815181106137785761377861542e565b016020015160f81c901b9190911790600101613743565b5061ffff8116156137b25760405162461bcd60e51b815260040161068a90615976565b5f805b600481101561380d576137c98160036156ef565b6137d4906008615666565b63ffffffff16866137e6836002615631565b815181106137f6576137f661542e565b016020015160f81c901b91909117906001016137b5565b5063ffffffff81166003146138345760405162461bcd60e51b815260040161068a906159b9565b5f805b60208110156138895761384b81601f6156ef565b613856906008615666565b87613862836006615631565b815181106138725761387261542e565b016020015160f81c901b9190911790600101613837565b505f8660268151811061389e5761389e61542e565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615bc1833981519152816138d784610c6e565b90505f6138e38761217e565b90506138ee87612e70565b61394b5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b600281516005811115613960576139606151a7565b146139bf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f8282608001516139d091906156cf565b600485015460408401519192506139f2916001600160401b0390911690615a00565b6001600160401b0316816001600160401b03161115613a715760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613a7d8a846124e2565b915091505f8a83604051602001613aab92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b4657613b466151a7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613c985760405162461bcd60e51b815260040161068a9061592d565b5f805b6002811015613ce757613caf8160016156ef565b613cba906008615666565b61ffff16858281518110613cd057613cd061542e565b016020015160f81c901b9190911790600101613c9b565b5061ffff811615613d0a5760405162461bcd60e51b815260040161068a90615976565b5f805b6004811015613d6557613d218160036156ef565b613d2c906008615666565b63ffffffff1686613d3e836002615631565b81518110613d4e57613d4e61542e565b016020015160f81c901b9190911790600101613d0d565b5063ffffffff8116600514613d8c5760405162461bcd60e51b815260040161068a906159b9565b5f805b6020811015613de157613da381601f6156ef565b613dae906008615666565b87613dba836006615631565b81518110613dca57613dca61542e565b016020015160f81c901b9190911790600101613d8f565b505f805b6008811015613e4057613df98160076156ef565b613e04906008615666565b6001600160401b031688613e19836026615631565b81518110613e2957613e2961542e565b016020015160f81c901b9190911790600101613de5565b5090969095509350505050565b5f80516020615c018339815191525f6001600160401b038084169085161115613e8157613e7a8385615285565b9050613e8e565b613e8b8484615285565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580613ef0575060028401548151613eec916001600160401b031690615631565b8210155b15613f16576001600160401b038316606082015281815260408101516020820152613f35565b8281606001818151613f2891906156cf565b6001600160401b03169052505b6060810151613f45906064615a00565b602082015160028601546001600160401b039290921691613f709190600160401b900460ff16615666565b1015613fd45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151613fef9190615631565b9052506040810180516001600160401b038716919061400f9083906156ef565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c418339815191526020526040812060020180545f80516020615c0183398151915291600160401b9091046001600160401b03169060086140a583615a2b565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661413457604051631afcd79f60e31b815260040160405180910390fd5b565b61413e6140eb565b614147816147a2565b61414f6147bb565b61286f608082013560a083013561416c60e0850160c0860161518e565b61417d610100860160e08701615a46565b61ffff1661419361012087016101008801615a5f565b6141a5610140880161012089016153ce565b6147cb565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166142355760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615c0183398151915242614254604086016020870161518e565b6001600160401b0316116142c65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6142d6604085016020860161518e565b6001600160401b03166142ec6202a30042615631565b1161435f5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b83356143b75760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156143e65760405162461bcd60e51b815260040161068a90615589565b60306143f56040860186615a7f565b90501461445a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614464835f613e4d565b5f806144fe6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906144a9919061518e565b6001600160401b031681526020016144c460408a018a615a7f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a0f565b5f8281526007860160205260409020919350915061451c8282615b05565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906145499085906004016152de565b6020604051808303815f875af1158015614565573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061458991906152a5565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614601576146016151a7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146e1918e01908e0161518e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147325760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461477b576040519150601f19603f3d011682016040523d82523d5f602084013e614780565b606091505b505090508061214857604051630a12f52160e11b815260040160405180910390fd5b6147aa6140eb565b6147b2614dbe565b61286f81614dc6565b6147c36140eb565b614134614f68565b6147d36140eb565b5f80516020615bc18339815191528361483f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b6127108411156148615760405162461bcd60e51b815260040161068a906158e2565b858711156148c95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff16116149365760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff841611156149a85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a795760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614af057614ab08160016156ef565b614abb906008615666565b5081515f90839083908110614ad257614ad261542e565b60200101906001600160f81b03191690815f1a905350600101614a9c565b505f5b6004811015614b5857614b078160036156ef565b614b12906008615666565b600160ff919091161c60f81b82614b2a836002615631565b81518110614b3a57614b3a61542e565b60200101906001600160f81b03191690815f1a905350600101614af3565b505f5b6020811015614bb55784518160208110614b7757614b7761542e565b1a60f81b82614b87836006615631565b81518110614b9757614b9761542e565b60200101906001600160f81b03191690815f1a905350600101614b5b565b505f5b6020811015614c155784602001518160208110614bd757614bd761542e565b1a60f81b82614be7836026615631565b81518110614bf757614bf761542e565b60200101906001600160f81b03191690815f1a905350600101614bb8565b505f5b6008811015614c8957614c2c8160076156ef565b614c37906008615666565b60ff1685604001516001600160401b0316901c60f81b82826046614c5b9190615631565b81518110614c6b57614c6b61542e565b60200101906001600160f81b03191690815f1a905350600101614c18565b505f5b6030811015614cf45784608001518181518110614cab57614cab61542e565b01602001516001600160f81b03191682614cc683604e615631565b81518110614cd657614cd661542e565b60200101906001600160f81b03191690815f1a905350600101614c8c565b505f5b6008811015614d6657614d0b8160076156ef565b614d16906008615666565b60608601516001600160401b0390811691161c60f81b82614d3883607e615631565b81518110614d4857614d4861542e565b60200101906001600160f81b03191690815f1a905350600101614cf7565b50600281604051614d779190615620565b602060405180830381855afa158015614d92573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614db591906152a5565b94909350915050565b6141346140eb565b614dce6140eb565b80355f80516020615c0183398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614e1a6080840160608501615a5f565b60ff161115614e875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e986080840160608501615a5f565b60ff1611614f005760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614f106080830160608401615a5f565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614f41606083016040840161518e565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b136140eb565b508054614f7c90615702565b5f825580601f10614f8b575050565b601f0160209004905f5260205f209081019061286f9190614fe3565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614ff7575f8155600101614fe4565b5090565b801515811461286f575f80fd5b803563ffffffff81168114612179575f80fd5b5f805f6060848603121561502d575f80fd5b83359250602084013561503f81614ffb565b915061504d60408501615008565b90509250925092565b5f60208284031215615066575f80fd5b5035919050565b5f610140828403121561507e575f80fd5b50919050565b803561ffff81168114612179575f80fd5b80356001600160401b0381168114612179575f80fd5b5f805f606084860312156150bd575f80fd5b83356001600160401b038111156150d2575f80fd5b8401606081870312156150e3575f80fd5b92506150f160208501615084565b915061504d60408501615095565b5f6020828403121561510f575f80fd5b610cb182615008565b5f8060408385031215615129575f80fd5b61513283615008565b946020939093013593505050565b5f8060408385031215615151575f80fd5b82356001600160401b03811115615166575f80fd5b830160808186031215615177575f80fd5b915061518560208401615008565b90509250929050565b5f6020828403121561519e575f80fd5b610cb182615095565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151de57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161521960608401826001600160401b03169052565b50608083015161523460808401826001600160401b03169052565b5060a083015161524f60a08401826001600160401b03169052565b5060c083015161526a60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561526a5761526a615271565b5f602082840312156152b5575f80fd5b5051919050565b5f5b838110156152d65781810151838201526020016152be565b50505f910152565b602081525f82518060208401526152fc8160408501602087016152bc565b601f01601f19169190910160400192915050565b5f8261532a57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461286f575f80fd5b5f602082840312156153de575f80fd5b8135610cb1816153ba565b5f808335601e198436030181126153fe575f80fd5b8301803591506001600160401b03821115615417575f80fd5b6020019150600581901b3603821315612632575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615456575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561549657615496615460565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154c4576154c4615460565b604052919050565b5f6001600160401b038211156154e4576154e4615460565b50601f01601f191660200190565b5f60608236031215615502575f80fd5b61550a615474565b82358152602061551b818501615095565b8183015260408401356001600160401b03811115615537575f80fd5b840136601f820112615547575f80fd5b803561555a615555826154cc565b61549c565b818152368483850101111561556d575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155e2818460208a016152bc565b80830190508581526001600160401b0360c01b8560c01b16602082015283516156128160288401602088016152bc565b016028019695505050505050565b5f82516154568184602087016152bc565b80820180821115610c7e57610c7e615271565b5f63ffffffff80831681810361565c5761565c615271565b6001019392505050565b8082028115828204841417610c7e57610c7e615271565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561526a5761526a615271565b81810381811115610c7e57610c7e615271565b600181811c9082168061571657607f821691505b60208210810361507e57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461578d81615702565b806020870152604060018084165f81146157ae57600181146157ca576157f7565b60ff19851660408a0152604084151560051b8a010195506157f7565b895f5260205f205f5b858110156157ee5781548b82018601529083019088016157d3565b8a016040019650505b509398975050505050505050565b805161217981614ffb565b5f8060408385031215615821575f80fd5b82516001600160401b0380821115615837575f80fd5b908401906060828703121561584a575f80fd5b615852615474565b82518152602080840151615865816153ba565b8282015260408401518381111561587a575f80fd5b80850194505087601f85011261588e575f80fd5b8351925061589e615555846154cc565b83815288828587010111156158b1575f80fd5b6158c0848383018488016152bc565b806040840152508195506158d5818801615805565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a2357615a23615271565b505092915050565b5f6001600160401b0380831681810361565c5761565c615271565b5f60208284031215615a56575f80fd5b610cb182615084565b5f60208284031215615a6f575f80fd5b813560ff81168114610cb1575f80fd5b5f808335601e19843603018112615a94575f80fd5b8301803591506001600160401b03821115615aad575f80fd5b602001915036819003821315612632575f80fd5b601f82111561214857805f5260205f20601f840160051c81016020851015615ae65750805b601f840160051c820191505b81811015610d51575f8155600101615af2565b81516001600160401b03811115615b1e57615b1e615460565b615b3281615b2c8454615702565b84615ac1565b602080601f831160018114615b65575f8415615b4e5750858301515b5f19600386901b1c1916600185901b178555612f09565b5f85815260208120601f198616915b82811015615b9357888601518255948401946001909101908401615b74565b5085821015615bb057878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161616e38038061616e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6160218061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b336600461541e565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615459565b6109d8565b3480156101e4575f80fd5b506102236101f3366004615459565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b8610276366004615470565b610b91565b348015610286575f80fd5b5061029a610295366004615459565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046154ae565b610c84565b34801561032a575f80fd5b506101b8610339366004615502565b610cb8565b348015610349575f80fd5b506101b861035836600461551b565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615543565b610f2d565b3480156103b0575f80fd5b506102236103bf366004615591565b6114cb565b3480156103cf575f80fd5b5061029a6103de366004615459565b6114e4565b3480156103ee575f80fd5b506101b86103fd36600461541e565b6114f8565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615459565b61173b565b348015610440575f80fd5b506101b861044f36600461551b565b611841565b34801561045f575f80fd5b506101b861046e366004615502565b611b65565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615459565b611d1d565b3480156104b7575f80fd5b506101b86104c6366004615459565b611fa3565b6102236104d9366004615459565b6120b7565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615459565b6120e8565b60405161022d91906155be565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f7583398151915293929190829060ff166004811115610595576105956155aa565b60048111156105a6576105a66155aa565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a826120e8565b9050600283516004811115610641576106416155aa565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615f958339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615f958339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f906002906005811115610714576107146155aa565b0361076b57861561072c5761072983876121b0565b90505b5f846060015183608001516107419190615688565b905061074d848261244c565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d286606001516114cb565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087391906156a8565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b26155aa565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615ff58339815191526020526040808220815160e0810190925280545f80516020615fb583398151915293929190829060ff166005811115610a2557610a256155aa565b6005811115610a3657610a366155aa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa56155aa565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f6125a3565b6040518263ffffffff1660e01b8152600401610b4b91906156e1565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b91906156a8565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c22836127c8565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a5100083615713565b92915050565b5f610c8d6127dc565b610c9984848434612813565b9050610cb160015f80516020615fd583398151915255565b9392505050565b5f80516020615f758339815191525f80610cd184612a90565b91509150610cde82612dda565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d166155aa565b03610d3b575f83815260088501602052604081208054919055610d398282612e15565b505b610d5181610d4c84604001516114cb565b612e7b565b5050505050565b5f80516020615f758339815191525f610d7084612e8e565b90505f80610d818360400151613068565b50915091505f610d90836120e8565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a90615732565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615774565b60015f87815260068701602052604090205460ff166004811115610e3357610e336155aa565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615fb58339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103191906156a8565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016157d1565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856157ec565b905090505f805b828163ffffffff1610156113cf575f61114760608801886157ec565b8363ffffffff1681811061115d5761115d615831565b905060200281019061116f9190615845565b611178906158f5565b80515f81815260098801602052604090205491925090156111ab5760405162461bcd60e51b815260040161068a9061598c565b5f6002895f0135856040516020016111da92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526111f4916159d4565b602060405180830381855afa15801561120f573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061123291906156a8565b5f8381526009890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088c01909252909120815181549394509192909190829060ff191660018360058111156112be576112be6155aa565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113719116866159e5565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806113c8906159f8565b905061112b565b50600583018190555f6113e185612e8e565b90505f6113f182604001516132a3565b90505f6113fd8861340c565b90508160028260405161141091906159d4565b602060405180830381855afa15801561142b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061144e91906156a8565b146114b25760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a51000615a1a565b5f6114ee826120e8565b6080015192915050565b5f80516020615f758339815191525f611510856138a5565b905061151b85612dda565b611526575050505050565b5f8581526005830160205260409020546001600160a01b0316331461155d5760405162461bcd60e51b815260040161068a90615a31565b5f85815260058301602052604090205460a082015161158c91600160b01b90046001600160401b031690615a83565b6001600160401b03168160c001516001600160401b0316101561160d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f61161e86856121b0565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611675906114cb565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156116eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170f91906156a8565b5f8781526008850160205260408120805490919061172e9084906159e5565b9091555050505050505050565b5f80516020615f758339815191525f611753836120e8565b905060048151600581111561176a5761176a6155aa565b146117d45760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b0316331461180b5760405162461bcd60e51b815260040161068a90615a31565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612e15565b6118496127dc565b5f80516020615f758339815191525f61186184612e8e565b90505f806118728360400151613068565b50915091505f611881836120e8565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156118bb576118bb6155aa565b60048111156118cc576118cc6155aa565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156119b05760405162461bcd60e51b815260040161068a90615732565b826001600160401b03168160e001516001600160401b031611156119e65760405162461bcd60e51b815260040161068a90615774565b6003815160048111156119fb576119fb6155aa565b14611a4f5760405162461bcd60e51b815260206004820152603160248201525f80516020615f958339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611a9090600160a01b900461ffff1684615a1a565b611a9a9190615713565b905080886008015f8881526020019081526020015f205f828254611abe91906159e5565b909155505f9050611acf8284615aa3565b9050611adf846020015182612e15565b611af48460200151610d4c86606001516114cb565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611b3a929190918252602082015260400190565b60405180910390a4505050505050505050611b6160015f80516020615fd583398151915255565b5050565b5f80516020615fb58339815191525f611b7d83612e8e565b90505f80611b8e8360400151613b20565b9150915080611bf05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611c0a90615ab6565b9050118015611c3c575060015f83815260088601602052604090205460ff166005811115611c3a57611c3a6155aa565b145b611c585760405162461bcd60e51b815260040161068a90615ae8565b5f8281526007850160205260408120611c7091615373565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f7583398151915293929190829060ff166004811115611d7e57611d7e6155aa565b6004811115611d8f57611d8f6155aa565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e1657611e166155aa565b1480611e345750600381516004811115611e3257611e326155aa565b145b611e885760405162461bcd60e51b815260206004820152603260248201525f80516020615f95833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611e9682604001516120e8565b905080606001516001600160401b03165f03611f1a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611f478460400151846060015185608001516125a3565b6040518263ffffffff1660e01b8152600401611f6391906156e1565b6020604051808303815f875af1158015611f7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5191906156a8565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615fb5833981519152929190611feb90615ab6565b905011801561201d575060015f83815260088301602052604090205460ff16600581111561201b5761201b6155aa565b145b6120395760405162461bcd60e51b815260040161068a90615ae8565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120729190600401615b2f565b6020604051808303815f875af115801561208e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b291906156a8565b505050565b5f6120c06127dc565b6120cb823334613cc1565b90506120e360015f80516020615fd583398151915255565b919050565b6120f06153aa565b5f8281525f80516020615ff5833981519152602052604090819020815160e0810190925280545f80516020615fb5833981519152929190829060ff16600581111561213d5761213d6155aa565b600581111561214e5761214e6155aa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156121fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122229190810190615bc4565b91509150806122855760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ec91906156a8565b8251146123505760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b0316156123c65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f806123d58460400151614078565b915091508187146124425760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615ff5833981519152602052604081206002015481905f80516020615fb583398151915290600160801b90046001600160401b03166124948582614250565b5f61249e8761445e565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124ee8a858b6125a3565b6040518263ffffffff1660e01b815260040161250a91906156e1565b6020604051808303815f875af1158015612526573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254a91906156a8565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561261c576125dc816001615aa3565b6125e7906008615a1a565b5081515f908390839081106125fe576125fe615831565b60200101906001600160f81b03191690815f1a9053506001016125c8565b505f5b600481101561268757612633816003615aa3565b61263e906008615a1a565b600263ffffffff16901c60f81b8282600261265991906159e5565b8151811061266957612669615831565b60200101906001600160f81b03191690815f1a90535060010161261f565b505f5b60208110156126e95761269e81601f615aa3565b6126a9906008615a1a565b86901c60f81b826126bb8360066159e5565b815181106126cb576126cb615831565b60200101906001600160f81b03191690815f1a90535060010161268a565b505f5b600881101561275457612700816007615aa3565b61270b906008615a1a565b6001600160401b038616901c60f81b826127268360266159e5565b8151811061273657612736615831565b60200101906001600160f81b03191690815f1a9053506001016126ec565b505f5b60088110156127bf5761276b816007615aa3565b612776906008615a1a565b6001600160401b038516901c60f81b8261279183602e6159e5565b815181106127a1576127a1615831565b60200101906001600160f81b03191690815f1a905350600101612757565b50949350505050565b6127d06144ee565b6127d981614539565b50565b5f80516020615fd583398151915280546001190161280d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615f758339815191529061ffff86161080159061285f575061271061ffff861611155b61287b5760405162461bcd60e51b815260040161068a90615c96565b60028101546001600160401b0390811690851610156128f45760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129575760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b80600101548311156129be5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f6129c982610c6e565b90505f6129d689836145ad565b905060405180606001604052806129ea3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615fd583398151915255565b5f612a996153aa565b5f80516020615fb58339815191525f612ab185612e8e565b90505f80612ac28360400151613b20565b915091508015612b275760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612b5857612b586155aa565b6005811115612b6957612b696155aa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612bda57612bda6155aa565b1480612bf85750600182516005811115612bf657612bf66155aa565b145b612c575760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612c6c57612c6c6155aa565b03612c7957506004612c7d565b5060055b6020808301515f90815260098801909152604081205581816005811115612ca657612ca66155aa565b90816005811115612cb957612cb96155aa565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612ced57612ced6155aa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612da157612da16155aa565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612e61575f80fd5b505af1158015612e73573d5f803e3d5ffd5b505050505050565b611b616001600160a01b03831682614b12565b60408051606080820183525f8083526020830181905292820152905f80516020615fb58339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f03573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f2a9190810190615bc4565b9150915080612f8a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b8254825114612fed5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130605760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f835160361461308c5760405162461bcd60e51b815260040161068a90615ce1565b5f805b60028110156130db576130a3816001615aa3565b6130ae906008615a1a565b61ffff168682815181106130c4576130c4615831565b016020015160f81c901b919091179060010161308f565b5061ffff8116156130fe5760405162461bcd60e51b815260040161068a90615d2a565b5f805b600481101561315957613115816003615aa3565b613120906008615a1a565b63ffffffff16876131328360026159e5565b8151811061314257613142615831565b016020015160f81c901b9190911790600101613101565b5063ffffffff81166004146131805760405162461bcd60e51b815260040161068a90615d6d565b5f805b60208110156131d55761319781601f615aa3565b6131a2906008615a1a565b886131ae8360066159e5565b815181106131be576131be615831565b016020015160f81c901b9190911790600101613183565b505f805b6008811015613234576131ed816007615aa3565b6131f8906008615a1a565b6001600160401b03168961320d8360266159e5565b8151811061321d5761321d615831565b016020015160f81c901b91909117906001016131d9565b505f805b60088110156132935761324c816007615aa3565b613257906008615a1a565b6001600160401b03168a61326c83602e6159e5565b8151811061327c5761327c615831565b016020015160f81c901b9190911790600101613238565b5091989097509095509350505050565b5f81516026146132c55760405162461bcd60e51b815260040161068a90615ce1565b5f805b6002811015613314576132dc816001615aa3565b6132e7906008615a1a565b61ffff168482815181106132fd576132fd615831565b016020015160f81c901b91909117906001016132c8565b5061ffff8116156133375760405162461bcd60e51b815260040161068a90615d2a565b5f805b60048110156133925761334e816003615aa3565b613359906008615a1a565b63ffffffff168561336b8360026159e5565b8151811061337b5761337b615831565b016020015160f81c901b919091179060010161333a565b5063ffffffff8116156133b75760405162461bcd60e51b815260040161068a90615d6d565b5f805b60208110156127bf576133ce81601f615aa3565b6133d9906008615a1a565b866133e58360066159e5565b815181106133f5576133f5615831565b016020015160f81c901b91909117906001016133ba565b60605f61341b838301846157ec565b61342791506058615a1a565b61343290605c6159e5565b6001600160401b0381111561344957613449615863565b6040519080825280601f01601f191660200182016040528015613473576020820181803683370190505b5090505f5b60208110156134c8578335816020811061349457613494615831565b1a60f81b8282815181106134aa576134aa615831565b60200101906001600160f81b03191690815f1a905350600101613478565b505f5b602081101561352857836020013581602081106134ea576134ea615831565b1a60f81b826134fa8360206159e5565b8151811061350a5761350a615831565b60200101906001600160f81b03191690815f1a9053506001016134cb565b505f5b600481101561358b5761353f816003615aa3565b61354a906008615a1a565b6014901c60f81b8261355d8360406159e5565b8151811061356d5761356d615831565b60200101906001600160f81b03191690815f1a90535060010161352b565b505f61359d60608501604086016157d1565b60601b90505f5b60148110156135fd578181601481106135bf576135bf615831565b1a60f81b836135cf8360446159e5565b815181106135df576135df615831565b60200101906001600160f81b03191690815f1a9053506001016135a4565b505f61360c60608601866157ec565b905090505f5b600481101561367757613626816003615aa3565b613631906008615a1a565b63ffffffff8316901c60f81b846136498360586159e5565b8151811061365957613659615831565b60200101906001600160f81b03191690815f1a905350600101613612565b505f5b61368760608701876157ec565b905081101561389b575f61369c826058615a1a565b6136a790605c6159e5565b90505f5b6020811015613732576136c160608901896157ec565b848181106136d1576136d1615831565b90506020028101906136e39190615845565b3581602081106136f5576136f5615831565b1a60f81b8661370483856159e5565b8151811061371457613714615831565b60200101906001600160f81b03191690815f1a9053506001016136ab565b505f5b60088110156137e757613749816007615aa3565b613754906008615a1a565b61376160608a018a6157ec565b8581811061377157613771615831565b90506020028101906137839190615845565b613794906040810190602001615591565b6001600160401b0316901c60f81b86826137af8560206159e5565b6137b991906159e5565b815181106137c9576137c9615831565b60200101906001600160f81b03191690815f1a905350600101613735565b505f5b60308110156138915761380060608901896157ec565b8481811061381057613810615831565b90506020028101906138229190615845565b613830906040810190615db4565b8281811061384057613840615831565b9050013560f81c60f81b868284602861385991906159e5565b61386391906159e5565b8151811061387357613873615831565b60200101906001600160f81b03191690815f1a9053506001016137ea565b505060010161367a565b5091949350505050565b6138ad6153aa565b5f8281525f80516020615ff58339815191526020526040808220815160e0810190925280545f80516020615fb583398151915293929190829060ff1660058111156138fa576138fa6155aa565b600581111561390b5761390b6155aa565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561397d5761397d6155aa565b146139d95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff19166001836005811115613a1d57613a1d6155aa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613ac9858261244c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613b435760405162461bcd60e51b815260040161068a90615ce1565b5f805b6002811015613b9257613b5a816001615aa3565b613b65906008615a1a565b61ffff16858281518110613b7b57613b7b615831565b016020015160f81c901b9190911790600101613b46565b5061ffff811615613bb55760405162461bcd60e51b815260040161068a90615d2a565b5f805b6004811015613c1057613bcc816003615aa3565b613bd7906008615a1a565b63ffffffff1686613be98360026159e5565b81518110613bf957613bf9615831565b016020015160f81c901b9190911790600101613bb8565b5063ffffffff8116600314613c375760405162461bcd60e51b815260040161068a90615d6d565b5f805b6020811015613c8c57613c4e81601f615aa3565b613c59906008615a1a565b87613c658360066159e5565b81518110613c7557613c75615831565b016020015160f81c901b9190911790600101613c3a565b505f86602681518110613ca157613ca1615831565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615f7583398151915281613cda84610c6e565b90505f613ce6876120e8565b9050613cf187612dda565b613d4e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b600281516005811115613d6357613d636155aa565b14613dc25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f828260800151613dd39190615a83565b60048501546040840151919250613df5916001600160401b0390911690615df6565b6001600160401b0316816001600160401b03161115613e745760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613e808a8461244c565b915091505f8a83604051602001613eae92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613f4957613f496155aa565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461409b5760405162461bcd60e51b815260040161068a90615ce1565b5f805b60028110156140ea576140b2816001615aa3565b6140bd906008615a1a565b61ffff168582815181106140d3576140d3615831565b016020015160f81c901b919091179060010161409e565b5061ffff81161561410d5760405162461bcd60e51b815260040161068a90615d2a565b5f805b600481101561416857614124816003615aa3565b61412f906008615a1a565b63ffffffff16866141418360026159e5565b8151811061415157614151615831565b016020015160f81c901b9190911790600101614110565b5063ffffffff811660051461418f5760405162461bcd60e51b815260040161068a90615d6d565b5f805b60208110156141e4576141a681601f615aa3565b6141b1906008615a1a565b876141bd8360066159e5565b815181106141cd576141cd615831565b016020015160f81c901b9190911790600101614192565b505f805b6008811015614243576141fc816007615aa3565b614207906008615a1a565b6001600160401b03168861421c8360266159e5565b8151811061422c5761422c615831565b016020015160f81c901b91909117906001016141e8565b5090969095509350505050565b5f80516020615fb58339815191525f6001600160401b0380841690851611156142845761427d8385615688565b9050614291565b61428e8484615688565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b03166060820152429115806142f35750600284015481516142ef916001600160401b0316906159e5565b8210155b15614319576001600160401b038316606082015281815260408101516020820152614338565b828160600181815161432b9190615a83565b6001600160401b03169052505b6060810151614348906064615df6565b602082015160028601546001600160401b0392909216916143739190600160401b900460ff16615a1a565b10156143d75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b0316816040018181516143f291906159e5565b9052506040810180516001600160401b0387169190614412908390615aa3565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615ff58339815191526020526040812060020180545f80516020615fb583398151915291600160401b9091046001600160401b03169060086144a883615e21565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661453757604051631afcd79f60e31b815260040160405180910390fd5b565b6145416144ee565b61454a81614ba5565b614552614bbe565b6127d9608082013560a083013561456f60e0850160c08601615591565b614580610100860160e08701615e3c565b61ffff1661459661012087016101008801615e55565b6145a8610140880161012089016157d1565b614bce565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166146385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615fb5833981519152426146576040860160208701615591565b6001600160401b0316116146c95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6146d96040850160208601615591565b6001600160401b03166146ef6202a300426159e5565b116147625760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b83356147ba5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156147e95760405162461bcd60e51b815260040161068a9061598c565b60306147f86040860186615db4565b90501461485d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614867835f614250565b5f806149016040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906148ac9190615591565b6001600160401b031681526020016148c760408a018a615db4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614e12565b5f8281526007860160205260409020919350915061491f8282615eb9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061494c9085906004016156e1565b6020604051808303815f875af1158015614968573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061498c91906156a8565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614a0457614a046155aa565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614ae4918e01908e01615591565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015614b355760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614b7e576040519150601f19603f3d011682016040523d82523d5f602084013e614b83565b606091505b50509050806120b257604051630a12f52160e11b815260040160405180910390fd5b614bad6144ee565b614bb56151c1565b6127d9816151c9565b614bc66144ee565b61453761536b565b614bd66144ee565b5f80516020615f7583398151915283614c425760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b612710841115614c645760405162461bcd60e51b815260040161068a90615c96565b85871115614ccc5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff1611614d395760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff84161115614dab5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614e7c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ef357614eb3816001615aa3565b614ebe906008615a1a565b5081515f90839083908110614ed557614ed5615831565b60200101906001600160f81b03191690815f1a905350600101614e9f565b505f5b6004811015614f5b57614f0a816003615aa3565b614f15906008615a1a565b600160ff919091161c60f81b82614f2d8360026159e5565b81518110614f3d57614f3d615831565b60200101906001600160f81b03191690815f1a905350600101614ef6565b505f5b6020811015614fb85784518160208110614f7a57614f7a615831565b1a60f81b82614f8a8360066159e5565b81518110614f9a57614f9a615831565b60200101906001600160f81b03191690815f1a905350600101614f5e565b505f5b60208110156150185784602001518160208110614fda57614fda615831565b1a60f81b82614fea8360266159e5565b81518110614ffa57614ffa615831565b60200101906001600160f81b03191690815f1a905350600101614fbb565b505f5b600881101561508c5761502f816007615aa3565b61503a906008615a1a565b60ff1685604001516001600160401b0316901c60f81b8282604661505e91906159e5565b8151811061506e5761506e615831565b60200101906001600160f81b03191690815f1a90535060010161501b565b505f5b60308110156150f757846080015181815181106150ae576150ae615831565b01602001516001600160f81b031916826150c983604e6159e5565b815181106150d9576150d9615831565b60200101906001600160f81b03191690815f1a90535060010161508f565b505f5b60088110156151695761510e816007615aa3565b615119906008615a1a565b60608601516001600160401b0390811691161c60f81b8261513b83607e6159e5565b8151811061514b5761514b615831565b60200101906001600160f81b03191690815f1a9053506001016150fa565b5060028160405161517a91906159d4565b602060405180830381855afa158015615195573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906151b891906156a8565b94909350915050565b6145376144ee565b6151d16144ee565b80355f80516020615fb583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461521d6080840160608501615e55565b60ff16111561528a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f61529b6080840160608501615e55565b60ff16116153035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b6153136080830160608401615e55565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556153446060830160408401615591565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612a7d6144ee565b50805461537f90615ab6565b5f825580601f1061538e575050565b601f0160209004905f5260205f20908101906127d991906153e6565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156153fa575f81556001016153e7565b5090565b80151581146127d9575f80fd5b803563ffffffff811681146120e3575f80fd5b5f805f60608486031215615430575f80fd5b833592506020840135615442816153fe565b91506154506040850161540b565b90509250925092565b5f60208284031215615469575f80fd5b5035919050565b5f6101408284031215615481575f80fd5b50919050565b803561ffff811681146120e3575f80fd5b80356001600160401b03811681146120e3575f80fd5b5f805f606084860312156154c0575f80fd5b83356001600160401b038111156154d5575f80fd5b8401606081870312156154e6575f80fd5b92506154f460208501615487565b915061545060408501615498565b5f60208284031215615512575f80fd5b610cb18261540b565b5f806040838503121561552c575f80fd5b6155358361540b565b946020939093013593505050565b5f8060408385031215615554575f80fd5b82356001600160401b03811115615569575f80fd5b83016080818603121561557a575f80fd5b91506155886020840161540b565b90509250929050565b5f602082840312156155a1575f80fd5b610cb182615498565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106155e157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161561c60608401826001600160401b03169052565b50608083015161563760808401826001600160401b03169052565b5060a083015161565260a08401826001600160401b03169052565b5060c083015161566d60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561566d5761566d615674565b5f602082840312156156b8575f80fd5b5051919050565b5f5b838110156156d95781810151838201526020016156c1565b50505f910152565b602081525f82518060208401526156ff8160408501602087016156bf565b601f01601f19169190910160400192915050565b5f8261572d57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b03811681146127d9575f80fd5b5f602082840312156157e1575f80fd5b8135610cb1816157bd565b5f808335601e19843603018112615801575f80fd5b8301803591506001600160401b0382111561581a575f80fd5b6020019150600581901b360382131561259c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615859575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561589957615899615863565b60405290565b604051601f8201601f191681016001600160401b03811182821017156158c7576158c7615863565b604052919050565b5f6001600160401b038211156158e7576158e7615863565b50601f01601f191660200190565b5f60608236031215615905575f80fd5b61590d615877565b82358152602061591e818501615498565b8183015260408401356001600160401b0381111561593a575f80fd5b840136601f82011261594a575f80fd5b803561595d615958826158cf565b61589f565b8181523684838501011115615970575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f82516158598184602087016156bf565b80820180821115610c7e57610c7e615674565b5f63ffffffff808316818103615a1057615a10615674565b6001019392505050565b8082028115828204841417610c7e57610c7e615674565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561566d5761566d615674565b81810381811115610c7e57610c7e615674565b600181811c90821680615aca57607f821691505b60208210810361548157634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615b4181615ab6565b806020870152604060018084165f8114615b625760018114615b7e57615bab565b60ff19851660408a0152604084151560051b8a01019550615bab565b895f5260205f205f5b85811015615ba25781548b8201860152908301908801615b87565b8a016040019650505b509398975050505050505050565b80516120e3816153fe565b5f8060408385031215615bd5575f80fd5b82516001600160401b0380821115615beb575f80fd5b9084019060608287031215615bfe575f80fd5b615c06615877565b82518152602080840151615c19816157bd565b82820152604084015183811115615c2e575f80fd5b80850194505087601f850112615c42575f80fd5b83519250615c52615958846158cf565b8381528882858701011115615c65575f80fd5b615c74848383018488016156bf565b80604084015250819550615c89818801615bb9565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615dc9575f80fd5b8301803591506001600160401b03821115615de2575f80fd5b60200191503681900382131561259c575f80fd5b6001600160401b03818116838216028082169190828114615e1957615e19615674565b505092915050565b5f6001600160401b03808316818103615a1057615a10615674565b5f60208284031215615e4c575f80fd5b610cb182615487565b5f60208284031215615e65575f80fd5b813560ff81168114610cb1575f80fd5b601f8211156120b257805f5260205f20601f840160051c81016020851015615e9a5750805b601f840160051c820191505b81811015610d51575f8155600101615ea6565b81516001600160401b03811115615ed257615ed2615863565b615ee681615ee08454615ab6565b84615e75565b602080601f831160018114615f19575f8415615f025750858301515b5f19600386901b1c1916600185901b178555612e73565b5f85815260208120601f198616915b82811015615f4757888601518255948401946001909101908401615f28565b5085821015615f6457878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // 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 2dbe9c8fa..c23b8d656 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -73,7 +73,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161396538038061396583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6138188061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e366004612daa565b61030c565b005b610173610143366004612daa565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610133610194366004612dd9565b6104ca565b6101336101a7366004612e1c565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004612e52565b6105e6565b6101ef6101ea366004612daa565b610c1a565b6040516001600160401b03909116815260200161017d565b610133610c2e565b610217603081565b60405160ff909116815260200161017d565b610173610237366004612eb2565b610c41565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e366004612daa565b610c5d565b6101336102a1366004612dd9565b610c72565b6102686005600160991b0181565b6101336102c2366004612daa565b610e2a565b610217601481565b6102e26102dd366004612daa565b610f39565b60405161017d9190612f0b565b6101ef6202a30081565b610133610307366004612fc1565b611001565b5f8181525f805160206137ec8339815191526020526040808220815160e0810190925280545f805160206137cc83398151915293929190829060ff16600581111561035957610359612ef7565b600581111561036a5761036a612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d9612ef7565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f61103e565b6040518263ffffffff1660e01b81526004016104849190613005565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c49190613037565b50505050565b6104d381611263565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b61059787876115ad565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206137cc8339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea9190613037565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d6060850160408601612fc1565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd606085018561304e565b91505f90508435602086013560146107fb6060890160408a01612fc1565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610b2a575f61087b606089018961304e565b8363ffffffff1681811061089157610891613093565b90506020028101906108a391906130a7565b6108ac90613157565b80515f81815260098901602052604090205491925090156108df5760405162461bcd60e51b815260040161043a906131ee565b84825f0151836020015184604001516040516020016109019493929190613236565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161094f9190613285565b602060405180830381855afa15801561096a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061098d9190613037565b5f83815260098a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088d01909252909120815181549394509192909190829060ff19166001836005811115610a1957610a19612ef7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610acc9116866132aa565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610b23906132bd565b905061085f565b50600584018190555f610b3c866115c7565b90505f610b4c82604001516117a1565b905080600285604051610b5f9190613285565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190613037565b14610c015760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610c2482610f39565b6080015192915050565b610c3661190a565b610c3f5f611965565b565b5f610c4a61190a565b610c5483836119d5565b90505b92915050565b610c6561190a565b610c6e81611f3a565b5050565b5f805160206137cc8339815191525f610c8a836115c7565b90505f80610c9b83604001516121b5565b9150915080610cfd5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610d17906132df565b9050118015610d49575060015f83815260088601602052604090205460ff166005811115610d4757610d47612ef7565b145b610d655760405162461bcd60e51b815260040161043a90613311565b5f8281526007850160205260408120610d7d91612d1f565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206137cc833981519152929190610e72906132df565b9050118015610ea4575060015f83815260088301602052604090205460ff166005811115610ea257610ea2612ef7565b145b610ec05760405162461bcd60e51b815260040161043a90613311565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610ef99190600401613358565b6020604051808303815f875af1158015610f15573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d39190613037565b610f41612d56565b5f8281525f805160206137ec833981519152602052604090819020815160e0810190925280545f805160206137cc833981519152929190829060ff166005811115610f8e57610f8e612ef7565b6005811115610f9f57610f9f612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b61100961190a565b6001600160a01b03811661103257604051631e4fbdf760e01b81525f600482015260240161043a565b61103b81611965565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110b7576110778160016133e2565b6110829060086133f5565b5081515f9083908390811061109957611099613093565b60200101906001600160f81b03191690815f1a905350600101611063565b505f5b6004811015611122576110ce8160036133e2565b6110d99060086133f5565b600263ffffffff16901c60f81b828260026110f491906132aa565b8151811061110457611104613093565b60200101906001600160f81b03191690815f1a9053506001016110ba565b505f5b60208110156111845761113981601f6133e2565b6111449060086133f5565b86901c60f81b826111568360066132aa565b8151811061116657611166613093565b60200101906001600160f81b03191690815f1a905350600101611125565b505f5b60088110156111ef5761119b8160076133e2565b6111a69060086133f5565b6001600160401b038616901c60f81b826111c18360266132aa565b815181106111d1576111d1613093565b60200101906001600160f81b03191690815f1a905350600101611187565b505f5b600881101561125a576112068160076133e2565b6112119060086133f5565b6001600160401b038516901c60f81b8261122c83602e6132aa565b8151811061123c5761123c613093565b60200101906001600160f81b03191690815f1a9053506001016111f2565b50949350505050565b5f61126c612d56565b5f805160206137cc8339815191525f611284856115c7565b90505f8061129583604001516121b5565b9150915080156112fa5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561132b5761132b612ef7565b600581111561133c5761133c612ef7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156113ad576113ad612ef7565b14806113cb57506001825160058111156113c9576113c9612ef7565b145b61142a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b60038251600581111561143f5761143f612ef7565b0361144c57506004611450565b5060055b6020808301515f9081526009880190915260408120558181600581111561147957611479612ef7565b9081600581111561148c5761148c612ef7565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156114c0576114c0612ef7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561157457611574612ef7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b6115b5612356565b6115be8261239f565b610c6e816123b8565b60408051606080820183525f8083526020830181905292820152905f805160206137cc8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561163c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611663919081019061341b565b91509150806116c35760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b82548251146117265760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b0316156117995760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f81516026146117c35760405162461bcd60e51b815260040161043a906134ed565b5f805b6002811015611812576117da8160016133e2565b6117e59060086133f5565b61ffff168482815181106117fb576117fb613093565b016020015160f81c901b91909117906001016117c6565b5061ffff8116156118355760405162461bcd60e51b815260040161043a90613536565b5f805b60048110156118905761184c8160036133e2565b6118579060086133f5565b63ffffffff16856118698360026132aa565b8151811061187957611879613093565b016020015160f81c901b9190911790600101611838565b5063ffffffff8116156118b55760405162461bcd60e51b815260040161043a90613579565b5f805b602081101561125a576118cc81601f6133e2565b6118d79060086133f5565b866118e38360066132aa565b815181106118f3576118f3613093565b016020015160f81c901b91909117906001016118b8565b3361193c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610c3f5760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611a605760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f805160206137cc83398151915242611a7f60408601602087016135c0565b6001600160401b031611611af15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611b0160408501602086016135c0565b6001600160401b0316611b176202a300426132aa565b11611b8a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611be25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043a565b83355f90815260098201602052604090205415611c115760405162461bcd60e51b815260040161043a906131ee565b6030611c2060408601866135d9565b905014611c855760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043a565b611c8f835f6123c9565b5f80611d296040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611cd491906135c0565b6001600160401b03168152602001611cef60408a018a6135d9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506125d7565b5f82815260078601602052604090209193509150611d478282613666565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d74908590600401613005565b6020604051808303815f875af1158015611d90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db49190613037565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115611e2c57611e2c612ef7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611f0c918e01908e016135c0565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611f42612d56565b5f8281525f805160206137ec8339815191526020526040808220815160e0810190925280545f805160206137cc83398151915293929190829060ff166005811115611f8f57611f8f612ef7565b6005811115611fa057611fa0612ef7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561201257612012612ef7565b1461206e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156120b2576120b2612ef7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61215e8582612986565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146121d85760405162461bcd60e51b815260040161043a906134ed565b5f805b6002811015612227576121ef8160016133e2565b6121fa9060086133f5565b61ffff1685828151811061221057612210613093565b016020015160f81c901b91909117906001016121db565b5061ffff81161561224a5760405162461bcd60e51b815260040161043a90613536565b5f805b60048110156122a5576122618160036133e2565b61226c9060086133f5565b63ffffffff168661227e8360026132aa565b8151811061228e5761228e613093565b016020015160f81c901b919091179060010161224d565b5063ffffffff81166003146122cc5760405162461bcd60e51b815260040161043a90613579565b5f805b6020811015612321576122e381601f6133e2565b6122ee9060086133f5565b876122fa8360066132aa565b8151811061230a5761230a613093565b016020015160f81c901b91909117906001016122cf565b505f8660268151811061233657612336613093565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610c3f57604051631afcd79f60e31b815260040160405180910390fd5b6123a7612356565b6123af612add565b61103b81612ae5565b6123c0612356565b61103b81612c87565b5f805160206137cc8339815191525f6001600160401b0380841690851611156123fd576123f68385613725565b905061240a565b6124078484613725565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b031660608201524291158061246c575060028401548151612468916001600160401b0316906132aa565b8210155b15612492576001600160401b0383166060820152818152604081015160208201526124b1565b82816060018181516124a49190613745565b6001600160401b03169052505b60608101516124c1906064613765565b602082015160028601546001600160401b0392909216916124ec9190600160401b900460ff166133f5565b10156125505760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b856001600160401b03168160400181815161256b91906132aa565b9052506040810180516001600160401b038716919061258b9083906133e2565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146126415760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156126b8576126788160016133e2565b6126839060086133f5565b5081515f9083908390811061269a5761269a613093565b60200101906001600160f81b03191690815f1a905350600101612664565b505f5b6004811015612720576126cf8160036133e2565b6126da9060086133f5565b600160ff919091161c60f81b826126f28360026132aa565b8151811061270257612702613093565b60200101906001600160f81b03191690815f1a9053506001016126bb565b505f5b602081101561277d578451816020811061273f5761273f613093565b1a60f81b8261274f8360066132aa565b8151811061275f5761275f613093565b60200101906001600160f81b03191690815f1a905350600101612723565b505f5b60208110156127dd578460200151816020811061279f5761279f613093565b1a60f81b826127af8360266132aa565b815181106127bf576127bf613093565b60200101906001600160f81b03191690815f1a905350600101612780565b505f5b6008811015612851576127f48160076133e2565b6127ff9060086133f5565b60ff1685604001516001600160401b0316901c60f81b8282604661282391906132aa565b8151811061283357612833613093565b60200101906001600160f81b03191690815f1a9053506001016127e0565b505f5b60308110156128bc578460800151818151811061287357612873613093565b01602001516001600160f81b0319168261288e83604e6132aa565b8151811061289e5761289e613093565b60200101906001600160f81b03191690815f1a905350600101612854565b505f5b600881101561292e576128d38160076133e2565b6128de9060086133f5565b60608601516001600160401b0390811691161c60f81b8261290083607e6132aa565b8151811061291057612910613093565b60200101906001600160f81b03191690815f1a9053506001016128bf565b5060028160405161293f9190613285565b602060405180830381855afa15801561295a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061297d9190613037565b94909350915050565b5f8281525f805160206137ec833981519152602052604081206002015481905f805160206137cc83398151915290600160801b90046001600160401b03166129ce85826123c9565b5f6129d887612c8f565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb612a288a858b61103e565b6040518263ffffffff1660e01b8152600401612a449190613005565b6020604051808303815f875af1158015612a60573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a849190613037565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b610c3f612356565b612aed612356565b80355f805160206137cc83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014612b396080840160608501613790565b60ff161115612ba65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f612bb76080840160608501613790565b60ff1611612c1f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b612c2f6080830160608401613790565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612c6060608301604084016135c0565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b611009612356565b5f8181525f805160206137ec8339815191526020526040812060020180545f805160206137cc83398151915291600160401b9091046001600160401b0316906008612cd9836137b0565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b508054612d2b906132df565b5f825580601f10612d3a575050565b601f0160209004905f5260205f209081019061103b9190612d92565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612da6575f8155600101612d93565b5090565b5f60208284031215612dba575f80fd5b5035919050565b803563ffffffff81168114612dd4575f80fd5b919050565b5f60208284031215612de9575f80fd5b610c5482612dc1565b5f60808284031215612e02575f80fd5b50919050565b6001600160a01b038116811461103b575f80fd5b5f8060a08385031215612e2d575f80fd5b612e378484612df2565b91506080830135612e4781612e08565b809150509250929050565b5f8060408385031215612e63575f80fd5b82356001600160401b03811115612e78575f80fd5b612e8485828601612df2565b925050612e9360208401612dc1565b90509250929050565b80356001600160401b0381168114612dd4575f80fd5b5f8060408385031215612ec3575f80fd5b82356001600160401b03811115612ed8575f80fd5b830160608186031215612ee9575f80fd5b9150612e9360208401612e9c565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f2e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f6960608401826001600160401b03169052565b506080830151612f8460808401826001600160401b03169052565b5060a0830151612f9f60a08401826001600160401b03169052565b5060c0830151612fba60c08401826001600160401b03169052565b5092915050565b5f60208284031215612fd1575f80fd5b8135612fdc81612e08565b9392505050565b5f5b83811015612ffd578181015183820152602001612fe5565b50505f910152565b602081525f8251806020840152613023816040850160208701612fe3565b601f01601f19169190910160400192915050565b5f60208284031215613047575f80fd5b5051919050565b5f808335601e19843603018112613063575f80fd5b8301803591506001600160401b0382111561307c575f80fd5b6020019150600581901b3603821315612ad6575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126130bb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130fb576130fb6130c5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613129576131296130c5565b604052919050565b5f6001600160401b03821115613149576131496130c5565b50601f01601f191660200190565b5f60608236031215613167575f80fd5b61316f6130d9565b823581526020613180818501612e9c565b8183015260408401356001600160401b0381111561319c575f80fd5b840136601f8201126131ac575f80fd5b80356131bf6131ba82613131565b613101565b81815236848385010111156131d2575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551613247818460208a01612fe3565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613277816028840160208801612fe3565b016028019695505050505050565b5f82516130bb818460208701612fe3565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c5757610c57613296565b5f63ffffffff8083168181036132d5576132d5613296565b6001019392505050565b600181811c908216806132f357607f821691505b602082108103612e0257634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461336a816132df565b806020870152604060018084165f811461338b57600181146133a7576133d4565b60ff19851660408a0152604084151560051b8a010195506133d4565b895f5260205f205f5b858110156133cb5781548b82018601529083019088016133b0565b8a016040019650505b509398975050505050505050565b81810381811115610c5757610c57613296565b8082028115828204841417610c5757610c57613296565b80518015158114612dd4575f80fd5b5f806040838503121561342c575f80fd5b82516001600160401b0380821115613442575f80fd5b9084019060608287031215613455575f80fd5b61345d6130d9565b8251815260208084015161347081612e08565b82820152604084015183811115613485575f80fd5b80850194505087601f850112613499575f80fd5b835192506134a96131ba84613131565b83815288828587010111156134bc575f80fd5b6134cb84838301848801612fe3565b806040840152508195506134e081880161340c565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f602082840312156135d0575f80fd5b610c5482612e9c565b5f808335601e198436030181126135ee575f80fd5b8301803591506001600160401b03821115613607575f80fd5b602001915036819003821315612ad6575f80fd5b601f8211156104d357805f5260205f20601f840160051c810160208510156136405750805b601f840160051c820191505b8181101561365f575f815560010161364c565b5050505050565b81516001600160401b0381111561367f5761367f6130c5565b6136938161368d84546132df565b8461361b565b602080601f8311600181146136c6575f84156136af5750858301515b5f19600386901b1c1916600185901b17855561371d565b5f85815260208120601f198616915b828110156136f4578886015182559484019460019091019084016136d5565b508582101561371157878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03828116828216039080821115612fba57612fba613296565b6001600160401b03818116838216019080821115612fba57612fba613296565b6001600160401b0381811683821602808216919082811461378857613788613296565b505092915050565b5f602082840312156137a0575f80fd5b813560ff81168114612fdc575f80fd5b5f6001600160401b038083168181036132d5576132d561329656fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051613d19380380613d1983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b613bcc8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e3660046131ad565b61030c565b005b6101736101433660046131ad565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101336101943660046131dc565b6104ca565b6101336101a736600461321f565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004613255565b6105e6565b6101ef6101ea3660046131ad565b610b84565b6040516001600160401b03909116815260200161017d565b610133610b98565b610217603081565b60405160ff909116815260200161017d565b6101736102373660046132b5565b610bab565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e3660046131ad565b610bc7565b6101336102a13660046131dc565b610bdc565b6102686005600160991b0181565b6101336102c23660046131ad565b610d94565b610217601481565b6102e26102dd3660046131ad565b610ea3565b60405161017d919061330e565b6101ef6202a30081565b6101336103073660046133c4565b610f6b565b5f8181525f80516020613ba08339815191526020526040808220815160e0810190925280545f80516020613b8083398151915293929190829060ff166005811115610359576103596132fa565b600581111561036a5761036a6132fa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d96132fa565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f610fa8565b6040518263ffffffff1660e01b81526004016104849190613408565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c4919061343a565b50505050565b6104d3816111cd565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b6105978787611517565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020613b808339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea919061343a565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d60608501604086016133c4565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd6060850185613451565b905090505f805b828163ffffffff161015610a88575f6108006060880188613451565b8363ffffffff1681811061081657610816613496565b905060200281019061082891906134aa565b6108319061355a565b80515f81815260098801602052604090205491925090156108645760405162461bcd60e51b815260040161043a906135f1565b5f6002895f01358560405160200161089392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526108ad91613639565b602060405180830381855afa1580156108c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108eb919061343a565b5f8381526009890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088c01909252909120815181549394509192909190829060ff19166001836005811115610977576109776132fa565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610a2a91168661365e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610a8190613671565b90506107e4565b50600583018190555f610a9a85611531565b90505f610aaa826040015161170b565b90505f610ab688611874565b905081600282604051610ac99190613639565b602060405180830381855afa158015610ae4573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b07919061343a565b14610b6b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610b8e82610ea3565b6080015192915050565b610ba0611d0d565b610ba95f611d68565b565b5f610bb4611d0d565b610bbe8383611dd8565b90505b92915050565b610bcf611d0d565b610bd88161233d565b5050565b5f80516020613b808339815191525f610bf483611531565b90505f80610c0583604001516125b8565b9150915080610c675760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610c8190613693565b9050118015610cb3575060015f83815260088601602052604090205460ff166005811115610cb157610cb16132fa565b145b610ccf5760405162461bcd60e51b815260040161043a906136c5565b5f8281526007850160205260408120610ce791613122565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020613b80833981519152929190610ddc90613693565b9050118015610e0e575060015f83815260088301602052604090205460ff166005811115610e0c57610e0c6132fa565b145b610e2a5760405162461bcd60e51b815260040161043a906136c5565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e63919060040161370c565b6020604051808303815f875af1158015610e7f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d3919061343a565b610eab613159565b5f8281525f80516020613ba0833981519152602052604090819020815160e0810190925280545f80516020613b80833981519152929190829060ff166005811115610ef857610ef86132fa565b6005811115610f0957610f096132fa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610f73611d0d565b6001600160a01b038116610f9c57604051631e4fbdf760e01b81525f600482015260240161043a565b610fa581611d68565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561102157610fe1816001613796565b610fec9060086137a9565b5081515f9083908390811061100357611003613496565b60200101906001600160f81b03191690815f1a905350600101610fcd565b505f5b600481101561108c57611038816003613796565b6110439060086137a9565b600263ffffffff16901c60f81b8282600261105e919061365e565b8151811061106e5761106e613496565b60200101906001600160f81b03191690815f1a905350600101611024565b505f5b60208110156110ee576110a381601f613796565b6110ae9060086137a9565b86901c60f81b826110c083600661365e565b815181106110d0576110d0613496565b60200101906001600160f81b03191690815f1a90535060010161108f565b505f5b600881101561115957611105816007613796565b6111109060086137a9565b6001600160401b038616901c60f81b8261112b83602661365e565b8151811061113b5761113b613496565b60200101906001600160f81b03191690815f1a9053506001016110f1565b505f5b60088110156111c457611170816007613796565b61117b9060086137a9565b6001600160401b038516901c60f81b8261119683602e61365e565b815181106111a6576111a6613496565b60200101906001600160f81b03191690815f1a90535060010161115c565b50949350505050565b5f6111d6613159565b5f80516020613b808339815191525f6111ee85611531565b90505f806111ff83604001516125b8565b9150915080156112645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115611295576112956132fa565b60058111156112a6576112a66132fa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115611317576113176132fa565b14806113355750600182516005811115611333576113336132fa565b145b6113945760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b6003825160058111156113a9576113a96132fa565b036113b6575060046113ba565b5060055b6020808301515f908152600988019091526040812055818160058111156113e3576113e36132fa565b908160058111156113f6576113f66132fa565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561142a5761142a6132fa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156114de576114de6132fa565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b61151f612759565b611528826127a2565b610bd8816127bb565b60408051606080820183525f8083526020830181905292820152905f80516020613b808339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115a6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115cd91908101906137cf565b915091508061162d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b82548251146116905760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b0316156117035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f815160261461172d5760405162461bcd60e51b815260040161043a906138a1565b5f805b600281101561177c57611744816001613796565b61174f9060086137a9565b61ffff1684828151811061176557611765613496565b016020015160f81c901b9190911790600101611730565b5061ffff81161561179f5760405162461bcd60e51b815260040161043a906138ea565b5f805b60048110156117fa576117b6816003613796565b6117c19060086137a9565b63ffffffff16856117d383600261365e565b815181106117e3576117e3613496565b016020015160f81c901b91909117906001016117a2565b5063ffffffff81161561181f5760405162461bcd60e51b815260040161043a9061392d565b5f805b60208110156111c45761183681601f613796565b6118419060086137a9565b8661184d83600661365e565b8151811061185d5761185d613496565b016020015160f81c901b9190911790600101611822565b60605f61188383830184613451565b61188f915060586137a9565b61189a90605c61365e565b6001600160401b038111156118b1576118b16134c8565b6040519080825280601f01601f1916602001820160405280156118db576020820181803683370190505b5090505f5b602081101561193057833581602081106118fc576118fc613496565b1a60f81b82828151811061191257611912613496565b60200101906001600160f81b03191690815f1a9053506001016118e0565b505f5b6020811015611990578360200135816020811061195257611952613496565b1a60f81b8261196283602061365e565b8151811061197257611972613496565b60200101906001600160f81b03191690815f1a905350600101611933565b505f5b60048110156119f3576119a7816003613796565b6119b29060086137a9565b6014901c60f81b826119c583604061365e565b815181106119d5576119d5613496565b60200101906001600160f81b03191690815f1a905350600101611993565b505f611a0560608501604086016133c4565b60601b90505f5b6014811015611a6557818160148110611a2757611a27613496565b1a60f81b83611a3783604461365e565b81518110611a4757611a47613496565b60200101906001600160f81b03191690815f1a905350600101611a0c565b505f611a746060860186613451565b905090505f5b6004811015611adf57611a8e816003613796565b611a999060086137a9565b63ffffffff8316901c60f81b84611ab183605861365e565b81518110611ac157611ac1613496565b60200101906001600160f81b03191690815f1a905350600101611a7a565b505f5b611aef6060870187613451565b9050811015611d03575f611b048260586137a9565b611b0f90605c61365e565b90505f5b6020811015611b9a57611b296060890189613451565b84818110611b3957611b39613496565b9050602002810190611b4b91906134aa565b358160208110611b5d57611b5d613496565b1a60f81b86611b6c838561365e565b81518110611b7c57611b7c613496565b60200101906001600160f81b03191690815f1a905350600101611b13565b505f5b6008811015611c4f57611bb1816007613796565b611bbc9060086137a9565b611bc960608a018a613451565b85818110611bd957611bd9613496565b9050602002810190611beb91906134aa565b611bfc906040810190602001613974565b6001600160401b0316901c60f81b8682611c1785602061365e565b611c21919061365e565b81518110611c3157611c31613496565b60200101906001600160f81b03191690815f1a905350600101611b9d565b505f5b6030811015611cf957611c686060890189613451565b84818110611c7857611c78613496565b9050602002810190611c8a91906134aa565b611c9890604081019061398d565b82818110611ca857611ca8613496565b9050013560f81c60f81b8682846028611cc1919061365e565b611ccb919061365e565b81518110611cdb57611cdb613496565b60200101906001600160f81b03191690815f1a905350600101611c52565b5050600101611ae2565b5091949350505050565b33611d3f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610ba95760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611e635760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f80516020613b8083398151915242611e826040860160208701613974565b6001600160401b031611611ef45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611f046040850160208601613974565b6001600160401b0316611f1a6202a3004261365e565b11611f8d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611fe55760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043a565b83355f908152600982016020526040902054156120145760405162461bcd60e51b815260040161043a906135f1565b6030612023604086018661398d565b9050146120885760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043a565b612092835f6127cc565b5f8061212c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906120d79190613974565b6001600160401b031681526020016120f260408a018a61398d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506129da565b5f8281526007860160205260409020919350915061214a8282613a1a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612177908590600401613408565b6020604051808303815f875af1158015612193573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b7919061343a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561222f5761222f6132fa565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161230f918e01908e01613974565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b612345613159565b5f8281525f80516020613ba08339815191526020526040808220815160e0810190925280545f80516020613b8083398151915293929190829060ff166005811115612392576123926132fa565b60058111156123a3576123a36132fa565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612415576124156132fa565b146124715760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156124b5576124b56132fa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6125618582612d89565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146125db5760405162461bcd60e51b815260040161043a906138a1565b5f805b600281101561262a576125f2816001613796565b6125fd9060086137a9565b61ffff1685828151811061261357612613613496565b016020015160f81c901b91909117906001016125de565b5061ffff81161561264d5760405162461bcd60e51b815260040161043a906138ea565b5f805b60048110156126a857612664816003613796565b61266f9060086137a9565b63ffffffff168661268183600261365e565b8151811061269157612691613496565b016020015160f81c901b9190911790600101612650565b5063ffffffff81166003146126cf5760405162461bcd60e51b815260040161043a9061392d565b5f805b6020811015612724576126e681601f613796565b6126f19060086137a9565b876126fd83600661365e565b8151811061270d5761270d613496565b016020015160f81c901b91909117906001016126d2565b505f8660268151811061273957612739613496565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610ba957604051631afcd79f60e31b815260040160405180910390fd5b6127aa612759565b6127b2612ee0565b610fa581612ee8565b6127c3612759565b610fa58161308a565b5f80516020613b808339815191525f6001600160401b038084169085161115612800576127f98385613ad9565b905061280d565b61280a8484613ad9565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b031660608201524291158061286f57506002840154815161286b916001600160401b03169061365e565b8210155b15612895576001600160401b0383166060820152818152604081015160208201526128b4565b82816060018181516128a79190613af9565b6001600160401b03169052505b60608101516128c4906064613b19565b602082015160028601546001600160401b0392909216916128ef9190600160401b900460ff166137a9565b10156129535760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b856001600160401b03168160400181815161296e919061365e565b9052506040810180516001600160401b038716919061298e908390613796565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f6060826080015151603014612a445760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612abb57612a7b816001613796565b612a869060086137a9565b5081515f90839083908110612a9d57612a9d613496565b60200101906001600160f81b03191690815f1a905350600101612a67565b505f5b6004811015612b2357612ad2816003613796565b612add9060086137a9565b600160ff919091161c60f81b82612af583600261365e565b81518110612b0557612b05613496565b60200101906001600160f81b03191690815f1a905350600101612abe565b505f5b6020811015612b805784518160208110612b4257612b42613496565b1a60f81b82612b5283600661365e565b81518110612b6257612b62613496565b60200101906001600160f81b03191690815f1a905350600101612b26565b505f5b6020811015612be05784602001518160208110612ba257612ba2613496565b1a60f81b82612bb283602661365e565b81518110612bc257612bc2613496565b60200101906001600160f81b03191690815f1a905350600101612b83565b505f5b6008811015612c5457612bf7816007613796565b612c029060086137a9565b60ff1685604001516001600160401b0316901c60f81b82826046612c26919061365e565b81518110612c3657612c36613496565b60200101906001600160f81b03191690815f1a905350600101612be3565b505f5b6030811015612cbf5784608001518181518110612c7657612c76613496565b01602001516001600160f81b03191682612c9183604e61365e565b81518110612ca157612ca1613496565b60200101906001600160f81b03191690815f1a905350600101612c57565b505f5b6008811015612d3157612cd6816007613796565b612ce19060086137a9565b60608601516001600160401b0390811691161c60f81b82612d0383607e61365e565b81518110612d1357612d13613496565b60200101906001600160f81b03191690815f1a905350600101612cc2565b50600281604051612d429190613639565b602060405180830381855afa158015612d5d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612d80919061343a565b94909350915050565b5f8281525f80516020613ba0833981519152602052604081206002015481905f80516020613b8083398151915290600160801b90046001600160401b0316612dd185826127cc565b5f612ddb87613092565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb612e2b8a858b610fa8565b6040518263ffffffff1660e01b8152600401612e479190613408565b6020604051808303815f875af1158015612e63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e87919061343a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b610ba9612759565b612ef0612759565b80355f80516020613b8083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014612f3c6080840160608501613b44565b60ff161115612fa95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f612fba6080840160608501613b44565b60ff16116130225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b6130326080830160608401613b44565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556130636060830160408401613974565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610f73612759565b5f8181525f80516020613ba08339815191526020526040812060020180545f80516020613b8083398151915291600160401b9091046001600160401b03169060086130dc83613b64565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b50805461312e90613693565b5f825580601f1061313d575050565b601f0160209004905f5260205f2090810190610fa59190613195565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156131a9575f8155600101613196565b5090565b5f602082840312156131bd575f80fd5b5035919050565b803563ffffffff811681146131d7575f80fd5b919050565b5f602082840312156131ec575f80fd5b610bbe826131c4565b5f60808284031215613205575f80fd5b50919050565b6001600160a01b0381168114610fa5575f80fd5b5f8060a08385031215613230575f80fd5b61323a84846131f5565b9150608083013561324a8161320b565b809150509250929050565b5f8060408385031215613266575f80fd5b82356001600160401b0381111561327b575f80fd5b613287858286016131f5565b925050613296602084016131c4565b90509250929050565b80356001600160401b03811681146131d7575f80fd5b5f80604083850312156132c6575f80fd5b82356001600160401b038111156132db575f80fd5b8301606081860312156132ec575f80fd5b91506132966020840161329f565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061333157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161336c60608401826001600160401b03169052565b50608083015161338760808401826001600160401b03169052565b5060a08301516133a260a08401826001600160401b03169052565b5060c08301516133bd60c08401826001600160401b03169052565b5092915050565b5f602082840312156133d4575f80fd5b81356133df8161320b565b9392505050565b5f5b838110156134005781810151838201526020016133e8565b50505f910152565b602081525f82518060208401526134268160408501602087016133e6565b601f01601f19169190910160400192915050565b5f6020828403121561344a575f80fd5b5051919050565b5f808335601e19843603018112613466575f80fd5b8301803591506001600160401b0382111561347f575f80fd5b6020019150600581901b3603821315612ed9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126134be575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156134fe576134fe6134c8565b60405290565b604051601f8201601f191681016001600160401b038111828210171561352c5761352c6134c8565b604052919050565b5f6001600160401b0382111561354c5761354c6134c8565b50601f01601f191660200190565b5f6060823603121561356a575f80fd5b6135726134dc565b82358152602061358381850161329f565b8183015260408401356001600160401b0381111561359f575f80fd5b840136601f8201126135af575f80fd5b80356135c26135bd82613534565b613504565b81815236848385010111156135d5575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f82516134be8184602087016133e6565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610bc157610bc161364a565b5f63ffffffff8083168181036136895761368961364a565b6001019392505050565b600181811c908216806136a757607f821691505b60208210810361320557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461371e81613693565b806020870152604060018084165f811461373f576001811461375b57613788565b60ff19851660408a0152604084151560051b8a01019550613788565b895f5260205f205f5b8581101561377f5781548b8201860152908301908801613764565b8a016040019650505b509398975050505050505050565b81810381811115610bc157610bc161364a565b8082028115828204841417610bc157610bc161364a565b805180151581146131d7575f80fd5b5f80604083850312156137e0575f80fd5b82516001600160401b03808211156137f6575f80fd5b9084019060608287031215613809575f80fd5b6138116134dc565b825181526020808401516138248161320b565b82820152604084015183811115613839575f80fd5b80850194505087601f85011261384d575f80fd5b8351925061385d6135bd84613534565b8381528882858701011115613870575f80fd5b61387f848383018488016133e6565b806040840152508195506138948188016137c0565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f60208284031215613984575f80fd5b610bbe8261329f565b5f808335601e198436030181126139a2575f80fd5b8301803591506001600160401b038211156139bb575f80fd5b602001915036819003821315612ed9575f80fd5b601f8211156104d357805f5260205f20601f840160051c810160208510156139f45750805b601f840160051c820191505b81811015613a13575f8155600101613a00565b5050505050565b81516001600160401b03811115613a3357613a336134c8565b613a4781613a418454613693565b846139cf565b602080601f831160018114613a7a575f8415613a635750858301515b5f19600386901b1c1916600185901b178555613ad1565b5f85815260208120601f198616915b82811015613aa857888601518255948401946001909101908401613a89565b5085821015613ac557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b038281168282160390808211156133bd576133bd61364a565b6001600160401b038181168382160190808211156133bd576133bd61364a565b6001600160401b03818116838216028082169190828114613b3c57613b3c61364a565b505092915050565b5f60208284031215613b54575f80fd5b813560ff811681146133df575f80fd5b5f6001600160401b038083168181036136895761368961364a56fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // 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 98bae2a13..a104778b9 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -140,14 +140,6 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida uint256 numInitialValidators = subnetConversionData.initialValidators.length; - // Verify that the sha256 hash of the Subnet conversion data matches with the Warp message's subnetConversionID. - bytes memory encodedConversion = abi.encodePacked( - subnetConversionData.convertSubnetTxID, - subnetConversionData.validatorManagerBlockchainID, - ADDRESS_LENGTH, - subnetConversionData.validatorManagerAddress, - uint32(numInitialValidators) - ); uint256 totalWeight; for (uint32 i; i < numInitialValidators; ++i) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; @@ -157,14 +149,6 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida "ValidatorManager: node ID already active" ); - // Continue to encode the initial validators. - encodedConversion = abi.encodePacked( - encodedConversion, - initialValidator.nodeID, - initialValidator.weight, - initialValidator.blsPublicKey - ); - // Validation ID of the initial validators is the sha256 hash of the // convert Subnet tx ID and the index of the initial validator. bytes32 validationID = @@ -195,18 +179,13 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Parse the Warp message into SubnetConversionMessage bytes32 subnetConversionID = ValidatorMessages.unpackSubnetConversionMessage(warpMessage.payload); + bytes memory encodedConversion = + ValidatorMessages.packSubnetConversionData(subnetConversionData); require( sha256(encodedConversion) == subnetConversionID, "ValidatorManager: invalid subnet conversion ID" ); - bytes memory encodedConversion2 = - ValidatorMessages.packSubnetConversionData(subnetConversionData); - require( - sha256(encodedConversion2) == subnetConversionID, - "ValidatorManager: invalid subnet conversion ID 2" - ); - $._initializedValidatorSet = true; } diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 01998b572..e14ca7bfc 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -118,63 +118,81 @@ library ValidatorMessages { return subnetConversionID; } - /*+-------------------+------------------------+-------------------------------------------------------+ - | convertSubnetTxID : [32]byte | 32 bytes | - +-------------------+--------------------------+-------------------------------------------------------+ - | managerChainID : [32]byte | 32 bytes | - +-------------------+--------------------------+-------------------------------------------------------+ - | managerAddress : []byte | 4 + len(managerAddress) bytes | - +-------------------+--------------------------+-------------------------------------------------------+ - | validators : []ValidatorData | 4 + len(validators) * 88 bytes | - +-------------------+--------------------------+-------------------------------------------------------+ - | 72 + len(managerAddress) + len(validators) * 88 bytes | - +-------------------------------------------------------+ - */ - - function packSubnetConversionData(SubnetConversionData calldata scd) + + /** + * @notice Packs SubnetConversionData into a byte array. + * This byte array is the SHA256 pre-image of the subnetConversionID hash + * The message format specification is: + * + * +-------------------+---------------+---------------------------------------------------------+ + * | convertSubnetTxID : [32]byte | 32 bytes | + * +-------------------+-----------------+-------------------------------------------------------+ + * | managerChainID : [32]byte | 32 bytes | + * +-------------------+-----------------+-------------------------------------------------------+ + * | managerAddress : []byte | 4 + len(managerAddress) bytes | + * +-------------------+-----------------+-------------------------------------------------------+ + * | validators : []ValidatorData | 4 + len(validators) * 88 bytes | + * +-------------------+-----------------+-------------------------------------------------------+ + * | 72 + len(managerAddress) + len(validators) * 88 bytes | + * +-------------------------------------------------------+ + * And ValidatorData: + * +--------------+----------+-----------+ + * | nodeID : [32]byte | 32 bytes | + * +--------------+----------+-----------+ + * | weight : uint64 | 8 bytes | + * +--------------+----------+-----------+ + * | blsPublicKey : [48]byte | 48 bytes | + * +--------------+----------+-----------+ + * | 88 bytes | + * +-----------+ + * + * @param subnetConversionData The struct representing data to pack into the message. + * @return The packed message. + */ + function packSubnetConversionData(SubnetConversionData calldata subnetConversionData) internal pure returns (bytes memory) { - bytes memory res = new bytes(92 + scd.initialValidators.length * 88); + bytes memory res = new bytes(92 + subnetConversionData.initialValidators.length * 88); // Pack the convertSubnetTx ID for (uint256 i; i < 32; ++i) { - res[i] = scd.convertSubnetTxID[i]; + res[i] = subnetConversionData.convertSubnetTxID[i]; } // Pack the validatorManagerBlockchainID for (uint256 i; i < 32; ++i) { - res[i + 32] = scd.validatorManagerBlockchainID[i]; + res[i + 32] = subnetConversionData.validatorManagerBlockchainID[i]; } // Pack the ADDRESS_LENGTH for (uint256 i; i < 4; ++i) { res[i + 64] = bytes1(uint8(20 >> (8 * (3 - i)))); } // Pack the address - bytes20 addrBytes = bytes20(scd.validatorManagerAddress); + bytes20 addrBytes = bytes20(subnetConversionData.validatorManagerAddress); for (uint256 i = 0; i < 20; i++) { res[i + 68] = addrBytes[i]; } - // Pack the ADDRESS_LENGTH - uint32 ivLength = uint32(scd.initialValidators.length); + // Pack the initial validators length + uint32 ivLength = uint32(subnetConversionData.initialValidators.length); for (uint256 i; i < 4; ++i) { res[i + 88] = bytes1(uint8(ivLength >> (8 * (3 - i)))); } - for (uint256 i = 0; i < scd.initialValidators.length; i++) { + for (uint256 i = 0; i < subnetConversionData.initialValidators.length; i++) { uint256 offset = 92 + i * 88; // Pack the nodeID for (uint256 j; j < 32; ++j) { - res[offset + j] = scd.initialValidators[i].nodeID[j]; + res[offset + j] = subnetConversionData.initialValidators[i].nodeID[j]; } // Pack the weight for (uint256 j; j < 8; ++j) { res[offset + 32 + j] = - bytes1(uint8(scd.initialValidators[i].weight >> (8 * (7 - j)))); + bytes1(uint8(subnetConversionData.initialValidators[i].weight >> (8 * (7 - j)))); } // Pack the blsPublicKey for (uint256 j; j < 48; ++j) { - res[offset + 40 + j] = scd.initialValidators[i].blsPublicKey[j]; + res[offset + 40 + j] = subnetConversionData.initialValidators[i].blsPublicKey[j]; } } return res; From bc4de864ff41a9f8fbf47070e8f7d32ec3ca2eda Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Thu, 19 Sep 2024 14:03:24 -0400 Subject: [PATCH 373/545] make all other pack functions use abi.encodePacked --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- .../validator-manager/ValidatorMessages.sol | 148 +++--------------- 4 files changed, 24 insertions(+), 130 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 62be28d37..55a0dfb82 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -84,7 +84,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\":\"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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516164b03803806164b083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6163638061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e6101993660046156c3565b6103ec565b005b61019e6101ae3660046156fe565b610890565b6101f16101c13660046156fe565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c3660046156fe565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e610257366004615729565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e610286366004615767565b610b3e565b61019e610299366004615780565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c93660046157a8565b610db3565b6101f16102dc36600461580c565b611351565b6102316102ef3660046156fe565b61136a565b61019e6103023660046156c3565b61137e565b61020c603081565b61019e61031d3660046156fe565b6115c1565b61019e610330366004615780565b6116c7565b6101f1610343366004615825565b6119eb565b61019e610356366004615767565b611a17565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f3660046156fe565b611bcf565b61019e6103a23660046156fe565b611e55565b61020c601481565b6103c26103bd3660046156fe565b611f69565b6040516101fb9190615859565b6102316202a30081565b6101f16103e7366004615920565b612031565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206162b783398151915293929190829060ff16600481111561044d5761044d615845565b600481111561045e5761045e615845565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611f69565b90506002835160048111156104f9576104f9615845565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f805160206162d78339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f805160206162d78339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc615845565b036106235786156105e4576105e18387612066565b90505b5f846060015183608001516105f99190615999565b90506106058482612302565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a8660600151611351565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b91906159b9565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a615845565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206163378339815191526020526040808220815160e0810190925280545f805160206162f783398151915293929190829060ff1660058111156108dd576108dd615845565b60058111156108ee576108ee615845565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d615845565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f612459565b6040518263ffffffff1660e01b8152600401610a0391906159f2565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a4391906159b9565b50505050565b5f610a5964e8d4a5100083615a24565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af18484612680565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f805160206162b78339815191525f80610b578461269a565b91509150610b64826129e4565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c615845565b03610bc1575f83815260088501602052604081208054919055610bbf8282612a1f565b505b610bd781610bd28460400151611351565b612a95565b5050505050565b5f805160206162b78339815191525f610bf684612ab8565b90505f80610c078360400151612c92565b50915091505f610c1683611f69565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b815260040161054290615a43565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b815260040161054290615a85565b60015f87815260068701602052604090205460ff166004811115610cb957610cb9615845565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f805160206162f78339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb791906159b9565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a6060850160408601615ace565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa6060850185615ae9565b905090505f805b828163ffffffff161015611255575f610fcd6060880188615ae9565b8363ffffffff16818110610fe357610fe3615b2e565b9050602002810190610ff59190615b42565b610ffe90615bf2565b80515f81815260098801602052604090205491925090156110315760405162461bcd60e51b815260040161054290615c89565b5f6002895f01358560405160200161106092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261107a91615cd1565b602060405180830381855afa158015611095573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110b891906159b9565b5f8381526009890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088c01909252909120815181549394509192909190829060ff1916600183600581111561114457611144615845565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111f7911686615ce2565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061124e90615cf5565b9050610fb1565b50600583018190555f61126785612ab8565b90505f6112778260400151612ecd565b90505f6112838861303f565b9050816002826040516112969190615cd1565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d491906159b9565b146113385760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a51000615d17565b5f61137482611f69565b6080015192915050565b5f805160206162b78339815191525f611396856134d8565b90506113a1856129e4565b6113ac575050505050565b5f8581526005830160205260409020546001600160a01b031633146113e35760405162461bcd60e51b815260040161054290615d2e565b5f85815260058301602052604090205460a082015161141291600160b01b90046001600160401b031690615d80565b6001600160401b03168160c001516001600160401b031610156114935760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f6114a48685612066565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906114fb90611351565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611571573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159591906159b9565b5f878152600885016020526040812080549091906115b4908490615ce2565b9091555050505050505050565b5f805160206162b78339815191525f6115d983611f69565b90506004815160058111156115f0576115f0615845565b1461165a5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146116915760405162461bcd60e51b815260040161054290615d2e565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b031682612a1f565b6116cf613753565b5f805160206162b78339815191525f6116e784612ab8565b90505f806116f88360400151612c92565b50915091505f61170783611f69565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561174157611741615845565b600481111561175257611752615845565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118365760405162461bcd60e51b815260040161054290615a43565b826001600160401b03168160e001516001600160401b0316111561186c5760405162461bcd60e51b815260040161054290615a85565b60038151600481111561188157611881615845565b146118d55760405162461bcd60e51b815260206004820152603160248201525f805160206162d78339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a019092528220549091906127109061191690600160a01b900461ffff1684615d17565b6119209190615a24565b905080886008015f8881526020019081526020015f205f8282546119449190615ce2565b909155505f90506119558284615da0565b9050611965846020015182612a1f565b61197a8460200151610bd28660600151611351565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d503384866040516119c0929190918252602082015260400190565b60405180910390a45050505050505050506119e760015f8051602061631783398151915255565b5050565b5f6119f4613753565b6119ff83338461379d565b9050610a5960015f8051602061631783398151915255565b5f805160206162f78339815191525f611a2f83612ab8565b90505f80611a408360400151613b57565b9150915080611aa25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611abc90615db3565b9050118015611aee575060015f83815260088601602052604090205460ff166005811115611aec57611aec615845565b145b611b0a5760405162461bcd60e51b815260040161054290615deb565b5f8281526007850160205260408120611b2291615613565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206162b783398151915293929190829060ff166004811115611c3057611c30615845565b6004811115611c4157611c41615845565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611cc857611cc8615845565b1480611ce65750600381516004811115611ce457611ce4615845565b145b611d3a5760405162461bcd60e51b815260206004820152603260248201525f805160206162d7833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611d488260400151611f69565b905080606001516001600160401b03165f03611dcc5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611df9846040015184606001518560800151612459565b6040518263ffffffff1660e01b8152600401611e1591906159f2565b6020604051808303815f875af1158015611e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd791906159b9565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f805160206162f7833981519152929190611e9d90615db3565b9050118015611ecf575060015f83815260088301602052604090205460ff166005811115611ecd57611ecd615845565b145b611eeb5760405162461bcd60e51b815260040161054290615deb565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f249190600401615e32565b6020604051808303815f875af1158015611f40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f6491906159b9565b505050565b611f7161564a565b5f8281525f80516020616337833981519152602052604090819020815160e0810190925280545f805160206162f7833981519152929190829060ff166005811115611fbe57611fbe615845565b6005811115611fcf57611fcf615845565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61203a613753565b61204685858585613cf8565b905061205e60015f8051602061631783398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156120b1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d89190810190615ec7565b915091508061213b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561217e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121a291906159b9565b8251146122065760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b03161561227c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f8061228b8460400151613f6d565b915091508187146122f85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020616337833981519152602052604081206002015481905f805160206162f783398151915290600160801b90046001600160401b031661234a8582614145565b5f61235487614353565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123a48a858b612459565b6040518263ffffffff1660e01b81526004016123c091906159f2565b6020604051808303815f875af11580156123dc573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061240091906159b9565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156124d257612492816001615da0565b61249d906008615d17565b5081515f908390839081106124b4576124b4615b2e565b60200101906001600160f81b03191690815f1a90535060010161247e565b505f5b600481101561253d576124e9816003615da0565b6124f4906008615d17565b600263ffffffff16901c60f81b8282600261250f9190615ce2565b8151811061251f5761251f615b2e565b60200101906001600160f81b03191690815f1a9053506001016124d5565b505f5b602081101561259f5761255481601f615da0565b61255f906008615d17565b86901c60f81b82612571836006615ce2565b8151811061258157612581615b2e565b60200101906001600160f81b03191690815f1a905350600101612540565b505f5b600881101561260a576125b6816007615da0565b6125c1906008615d17565b6001600160401b038616901c60f81b826125dc836026615ce2565b815181106125ec576125ec615b2e565b60200101906001600160f81b03191690815f1a9053506001016125a2565b505f5b600881101561267557612621816007615da0565b61262c906008615d17565b6001600160401b038516901c60f81b8261264783602e615ce2565b8151811061265757612657615b2e565b60200101906001600160f81b03191690815f1a90535060010161260d565b5090505b9392505050565b6126886143e3565b6126918261442e565b6119e7816144a5565b5f6126a361564a565b5f805160206162f78339815191525f6126bb85612ab8565b90505f806126cc8360400151613b57565b9150915080156127315760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561276257612762615845565b600581111561277357612773615845565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156127e4576127e4615845565b1480612802575060018251600581111561280057612800615845565b145b6128615760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b60038251600581111561287657612876615845565b0361288357506004612887565b5060055b6020808301515f908152600988019091526040812055818160058111156128b0576128b0615845565b908160058111156128c3576128c3615845565b9052505f84815260088701602052604090208251815484929190829060ff191660018360058111156128f7576128f7615845565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156129ab576129ab615845565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f8051602061629783398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a7a575f80fd5b505af1158015612a8c573d5f803e3d5ffd5b50505050505050565b5f80516020616297833981519152546119e7906001600160a01b03168383614546565b60408051606080820183525f8083526020830181905292820152905f805160206162f78339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612b2d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612b549190810190615ec7565b9150915080612bb45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612c175760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612c8a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612cb65760405162461bcd60e51b815260040161054290615f99565b5f805b6002811015612d0557612ccd816001615da0565b612cd8906008615d17565b61ffff16868281518110612cee57612cee615b2e565b016020015160f81c901b9190911790600101612cb9565b5061ffff811615612d285760405162461bcd60e51b815260040161054290615fe2565b5f805b6004811015612d8357612d3f816003615da0565b612d4a906008615d17565b63ffffffff1687612d5c836002615ce2565b81518110612d6c57612d6c615b2e565b016020015160f81c901b9190911790600101612d2b565b5063ffffffff8116600414612daa5760405162461bcd60e51b815260040161054290616025565b5f805b6020811015612dff57612dc181601f615da0565b612dcc906008615d17565b88612dd8836006615ce2565b81518110612de857612de8615b2e565b016020015160f81c901b9190911790600101612dad565b505f805b6008811015612e5e57612e17816007615da0565b612e22906008615d17565b6001600160401b031689612e37836026615ce2565b81518110612e4757612e47615b2e565b016020015160f81c901b9190911790600101612e03565b505f805b6008811015612ebd57612e76816007615da0565b612e81906008615d17565b6001600160401b03168a612e9683602e615ce2565b81518110612ea657612ea6615b2e565b016020015160f81c901b9190911790600101612e62565b5091989097509095509350505050565b5f8151602614612eef5760405162461bcd60e51b815260040161054290615f99565b5f805b6002811015612f3e57612f06816001615da0565b612f11906008615d17565b61ffff16848281518110612f2757612f27615b2e565b016020015160f81c901b9190911790600101612ef2565b5061ffff811615612f615760405162461bcd60e51b815260040161054290615fe2565b5f805b6004811015612fbc57612f78816003615da0565b612f83906008615d17565b63ffffffff1685612f95836002615ce2565b81518110612fa557612fa5615b2e565b016020015160f81c901b9190911790600101612f64565b5063ffffffff811615612fe15760405162461bcd60e51b815260040161054290616025565b5f805b602081101561303657612ff881601f615da0565b613003906008615d17565b8661300f836006615ce2565b8151811061301f5761301f615b2e565b016020015160f81c901b9190911790600101612fe4565b50949350505050565b60605f61304e83830184615ae9565b61305a91506058615d17565b61306590605c615ce2565b6001600160401b0381111561307c5761307c615b60565b6040519080825280601f01601f1916602001820160405280156130a6576020820181803683370190505b5090505f5b60208110156130fb57833581602081106130c7576130c7615b2e565b1a60f81b8282815181106130dd576130dd615b2e565b60200101906001600160f81b03191690815f1a9053506001016130ab565b505f5b602081101561315b578360200135816020811061311d5761311d615b2e565b1a60f81b8261312d836020615ce2565b8151811061313d5761313d615b2e565b60200101906001600160f81b03191690815f1a9053506001016130fe565b505f5b60048110156131be57613172816003615da0565b61317d906008615d17565b6014901c60f81b82613190836040615ce2565b815181106131a0576131a0615b2e565b60200101906001600160f81b03191690815f1a90535060010161315e565b505f6131d06060850160408601615ace565b60601b90505f5b6014811015613230578181601481106131f2576131f2615b2e565b1a60f81b83613202836044615ce2565b8151811061321257613212615b2e565b60200101906001600160f81b03191690815f1a9053506001016131d7565b505f61323f6060860186615ae9565b905090505f5b60048110156132aa57613259816003615da0565b613264906008615d17565b63ffffffff8316901c60f81b8461327c836058615ce2565b8151811061328c5761328c615b2e565b60200101906001600160f81b03191690815f1a905350600101613245565b505f5b6132ba6060870187615ae9565b90508110156134ce575f6132cf826058615d17565b6132da90605c615ce2565b90505f5b6020811015613365576132f46060890189615ae9565b8481811061330457613304615b2e565b90506020028101906133169190615b42565b35816020811061332857613328615b2e565b1a60f81b866133378385615ce2565b8151811061334757613347615b2e565b60200101906001600160f81b03191690815f1a9053506001016132de565b505f5b600881101561341a5761337c816007615da0565b613387906008615d17565b61339460608a018a615ae9565b858181106133a4576133a4615b2e565b90506020028101906133b69190615b42565b6133c790604081019060200161580c565b6001600160401b0316901c60f81b86826133e2856020615ce2565b6133ec9190615ce2565b815181106133fc576133fc615b2e565b60200101906001600160f81b03191690815f1a905350600101613368565b505f5b60308110156134c4576134336060890189615ae9565b8481811061344357613443615b2e565b90506020028101906134559190615b42565b61346390604081019061606c565b8281811061347357613473615b2e565b9050013560f81c60f81b868284602861348c9190615ce2565b6134969190615ce2565b815181106134a6576134a6615b2e565b60200101906001600160f81b03191690815f1a90535060010161341d565b50506001016132ad565b5091949350505050565b6134e061564a565b5f8281525f805160206163378339815191526020526040808220815160e0810190925280545f805160206162f783398151915293929190829060ff16600581111561352d5761352d615845565b600581111561353e5761353e615845565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156135b0576135b0615845565b1461360c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561365057613650615845565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136fc8582612302565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061631783398151915280546001190161378457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061631783398151915255565b5f5f805160206162b7833981519152816137b961022c856145a5565b90505f6137c587611f69565b90506137d0876129e4565b61382d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b60028151600581111561384257613842615845565b146138a15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f8282608001516138b29190615d80565b600485015460408401519192506138d4916001600160401b03909116906160ae565b6001600160401b0316816001600160401b031611156139535760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f8061395f8a84612302565b915091505f8a8360405160200161398d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613a2857613a28615845565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613b7a5760405162461bcd60e51b815260040161054290615f99565b5f805b6002811015613bc957613b91816001615da0565b613b9c906008615d17565b61ffff16858281518110613bb257613bb2615b2e565b016020015160f81c901b9190911790600101613b7d565b5061ffff811615613bec5760405162461bcd60e51b815260040161054290615fe2565b5f805b6004811015613c4757613c03816003615da0565b613c0e906008615d17565b63ffffffff1686613c20836002615ce2565b81518110613c3057613c30615b2e565b016020015160f81c901b9190911790600101613bef565b5063ffffffff8116600314613c6e5760405162461bcd60e51b815260040161054290616025565b5f805b6020811015613cc357613c8581601f615da0565b613c90906008615d17565b87613c9c836006615ce2565b81518110613cac57613cac615b2e565b016020015160f81c901b9190911790600101613c71565b505f86602681518110613cd857613cd8615b2e565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206162b78339815191529061ffff861610801590613d44575061271061ffff861611155b613d605760405162461bcd60e51b8152600401610542906160d9565b60028101546001600160401b039081169085161015613dd95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613e3c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613ea35760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613ead846145a5565b90505f613eb982610a49565b90505f613ec689836145c8565b90506040518060600160405280613eda3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613f905760405162461bcd60e51b815260040161054290615f99565b5f805b6002811015613fdf57613fa7816001615da0565b613fb2906008615d17565b61ffff16858281518110613fc857613fc8615b2e565b016020015160f81c901b9190911790600101613f93565b5061ffff8116156140025760405162461bcd60e51b815260040161054290615fe2565b5f805b600481101561405d57614019816003615da0565b614024906008615d17565b63ffffffff1686614036836002615ce2565b8151811061404657614046615b2e565b016020015160f81c901b9190911790600101614005565b5063ffffffff81166005146140845760405162461bcd60e51b815260040161054290616025565b5f805b60208110156140d95761409b81601f615da0565b6140a6906008615d17565b876140b2836006615ce2565b815181106140c2576140c2615b2e565b016020015160f81c901b9190911790600101614087565b505f805b6008811015614138576140f1816007615da0565b6140fc906008615d17565b6001600160401b031688614111836026615ce2565b8151811061412157614121615b2e565b016020015160f81c901b91909117906001016140dd565b5090969095509350505050565b5f805160206162f78339815191525f6001600160401b038084169085161115614179576141728385615999565b9050614186565b6141838484615999565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b03166060820152429115806141e85750600284015481516141e4916001600160401b031690615ce2565b8210155b1561420e576001600160401b03831660608201528181526040810151602082015261422d565b82816060018181516142209190615d80565b6001600160401b03169052505b606081015161423d9060646160ae565b602082015160028601546001600160401b0392909216916142689190600160401b900460ff16615d17565b10156142cc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b0316816040018181516142e79190615ce2565b9052506040810180516001600160401b0387169190614307908390615da0565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206163378339815191526020526040812060020180545f805160206162f783398151915291600160401b9091046001600160401b031690600861439d83616124565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661442c57604051631afcd79f60e31b815260040160405180910390fd5b565b6144366143e3565b61443f81614b2d565b614447614b46565b6144a2608082013560a083013561446460e0850160c0860161580c565b614475610100860160e0870161613f565b61ffff1661448b61012087016101008801616158565b61449d61014088016101208901615ace565b614b56565b50565b6144ad6143e3565b5f805160206162978339815191526001600160a01b0382166145265760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611f6491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614d9a565b5f610a59825f80516020616297833981519152546001600160a01b031690614dfb565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166146535760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f805160206162f783398151915242614672604086016020870161580c565b6001600160401b0316116146e45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6146f4604085016020860161580c565b6001600160401b031661470a6202a30042615ce2565b1161477d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356147d55760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156148045760405162461bcd60e51b815260040161054290615c89565b6030614813604086018661606c565b9050146148785760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b614882835f614145565b5f8061491c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906148c7919061580c565b6001600160401b031681526020016148e260408a018a61606c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614f5d565b5f8281526007860160205260409020919350915061493a82826161bc565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906149679085906004016159f2565b6020604051808303815f875af1158015614983573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149a791906159b9565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614a1f57614a1f615845565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614aff918e01908e0161580c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614b356143e3565b614b3d61530c565b6144a281615314565b614b4e6143e3565b61442c6154b6565b614b5e6143e3565b5f805160206162b783398151915283614bca5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b612710841115614bec5760405162461bcd60e51b8152600401610542906160d9565b85871115614c545760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff1611614cc15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff84161115614d335760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f614dae6001600160a01b038416836154be565b905080515f14158015614dd2575080806020019051810190614dd0919061627b565b155b15611f6457604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614e41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e6591906159b9565b9050614e7c6001600160a01b0385163330866154cb565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614ec0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ee491906159b9565b9050818111614f4a5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614f548282615da0565b95945050505050565b5f6060826080015151603014614fc75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561503e57614ffe816001615da0565b615009906008615d17565b5081515f9083908390811061502057615020615b2e565b60200101906001600160f81b03191690815f1a905350600101614fea565b505f5b60048110156150a657615055816003615da0565b615060906008615d17565b600160ff919091161c60f81b82615078836002615ce2565b8151811061508857615088615b2e565b60200101906001600160f81b03191690815f1a905350600101615041565b505f5b602081101561510357845181602081106150c5576150c5615b2e565b1a60f81b826150d5836006615ce2565b815181106150e5576150e5615b2e565b60200101906001600160f81b03191690815f1a9053506001016150a9565b505f5b6020811015615163578460200151816020811061512557615125615b2e565b1a60f81b82615135836026615ce2565b8151811061514557615145615b2e565b60200101906001600160f81b03191690815f1a905350600101615106565b505f5b60088110156151d75761517a816007615da0565b615185906008615d17565b60ff1685604001516001600160401b0316901c60f81b828260466151a99190615ce2565b815181106151b9576151b9615b2e565b60200101906001600160f81b03191690815f1a905350600101615166565b505f5b603081101561524257846080015181815181106151f9576151f9615b2e565b01602001516001600160f81b0319168261521483604e615ce2565b8151811061522457615224615b2e565b60200101906001600160f81b03191690815f1a9053506001016151da565b505f5b60088110156152b457615259816007615da0565b615264906008615d17565b60608601516001600160401b0390811691161c60f81b8261528683607e615ce2565b8151811061529657615296615b2e565b60200101906001600160f81b03191690815f1a905350600101615245565b506002816040516152c59190615cd1565b602060405180830381855afa1580156152e0573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061530391906159b9565b94909350915050565b61442c6143e3565b61531c6143e3565b80355f805160206162f783398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb015560146153686080840160608501616158565b60ff1611156153d55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f6153e66080840160608501616158565b60ff161161544e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b61545e6080830160608401616158565b60028201805460ff92909216600160401b0260ff60401b1990921691909117905561548f606083016040840161580c565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61378a6143e3565b606061267983835f615504565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd90608401614573565b6060814710156155295760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b031684866040516155449190615cd1565b5f6040518083038185875af1925050503d805f811461557e576040519150601f19603f3d011682016040523d82523d5f602084013e615583565b606091505b50915091506122f88683836060826155a35761559e826155ea565b612679565b81511580156155ba57506001600160a01b0384163b155b156155e357604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b5080612679565b8051156155fa5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461561f90615db3565b5f825580601f1061562e575050565b601f0160209004905f5260205f20908101906144a29190615686565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561569a575f8155600101615687565b5090565b80151581146144a2575f80fd5b803563ffffffff811681146156be575f80fd5b919050565b5f805f606084860312156156d5575f80fd5b8335925060208401356156e78161569e565b91506156f5604085016156ab565b90509250925092565b5f6020828403121561570e575f80fd5b5035919050565b6001600160a01b03811681146144a2575f80fd5b5f8082840361016081121561573c575f80fd5b6101408082121561574b575f80fd5b849350830135905061575c81615715565b809150509250929050565b5f60208284031215615777575f80fd5b612679826156ab565b5f8060408385031215615791575f80fd5b61579a836156ab565b946020939093013593505050565b5f80604083850312156157b9575f80fd5b82356001600160401b038111156157ce575f80fd5b8301608081860312156157df575f80fd5b91506157ed602084016156ab565b90509250929050565b80356001600160401b03811681146156be575f80fd5b5f6020828403121561581c575f80fd5b612679826157f6565b5f8060408385031215615836575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061587c57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516158b760608401826001600160401b03169052565b5060808301516158d260808401826001600160401b03169052565b5060a08301516158ed60a08401826001600160401b03169052565b5060c083015161590860c08401826001600160401b03169052565b5092915050565b803561ffff811681146156be575f80fd5b5f805f8060808587031215615933575f80fd5b84356001600160401b03811115615948575f80fd5b850160608188031215615959575f80fd5b93506159676020860161590f565b9250615975604086016157f6565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561590857615908615985565b5f602082840312156159c9575f80fd5b5051919050565b5f5b838110156159ea5781810151838201526020016159d2565b50505f910152565b602081525f8251806020840152615a108160408501602087016159d0565b601f01601f19169190910160400192915050565b5f82615a3e57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615ade575f80fd5b813561267981615715565b5f808335601e19843603018112615afe575f80fd5b8301803591506001600160401b03821115615b17575f80fd5b6020019150600581901b3603821315612452575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615b56575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b9657615b96615b60565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615bc457615bc4615b60565b604052919050565b5f6001600160401b03821115615be457615be4615b60565b50601f01601f191660200190565b5f60608236031215615c02575f80fd5b615c0a615b74565b823581526020615c1b8185016157f6565b8183015260408401356001600160401b03811115615c37575f80fd5b840136601f820112615c47575f80fd5b8035615c5a615c5582615bcc565b615b9c565b8181523684838501011115615c6d575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8251615b568184602087016159d0565b80820180821115610a5957610a59615985565b5f63ffffffff808316818103615d0d57615d0d615985565b6001019392505050565b8082028115828204841417610a5957610a59615985565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561590857615908615985565b81810381811115610a5957610a59615985565b600181811c90821680615dc757607f821691505b602082108103615de557634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615e4481615db3565b806020870152604060018084165f8114615e655760018114615e8157615eae565b60ff19851660408a0152604084151560051b8a01019550615eae565b895f5260205f205f5b85811015615ea55781548b8201860152908301908801615e8a565b8a016040019650505b509398975050505050505050565b80516156be8161569e565b5f8060408385031215615ed8575f80fd5b82516001600160401b0380821115615eee575f80fd5b9084019060608287031215615f01575f80fd5b615f09615b74565b82518152602080840151615f1c81615715565b82820152604084015183811115615f31575f80fd5b80850194505087601f850112615f45575f80fd5b83519250615f55615c5584615bcc565b8381528882858701011115615f68575f80fd5b615f77848383018488016159d0565b80604084015250819550615f8c818801615ebc565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112616081575f80fd5b8301803591506001600160401b0382111561609a575f80fd5b602001915036819003821315612452575f80fd5b6001600160401b038181168382160280821691908281146160d1576160d1615985565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b03808316818103615d0d57615d0d615985565b5f6020828403121561614f575f80fd5b6126798261590f565b5f60208284031215616168575f80fd5b813560ff81168114612679575f80fd5b601f821115611f6457805f5260205f20601f840160051c8101602085101561619d5750805b601f840160051c820191505b81811015610bd7575f81556001016161a9565b81516001600160401b038111156161d5576161d5615b60565b6161e9816161e38454615db3565b84616178565b602080601f83116001811461621c575f84156162055750858301515b5f19600386901b1c1916600185901b178555616273565b5f85815260208120601f198616915b8281101561624a5788860151825594840194600190910190840161622b565b508582101561626757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561628b575f80fd5b81516126798161569e56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516160ab3803806160ab83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f5e8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610187575f3560e01c806376f78621116100d9578063b771b3bc11610093578063c974d1b61161006e578063c974d1b6146103a7578063d5f20ff6146103af578063df93d8de146103cf578063eb0acb89146103d9575f80fd5b8063b771b3bc1461035b578063ba3a4b9714610381578063bee0a03f14610394575f80fd5b806376f78621146102f45780638280a25a1461030757806393e245981461030f57806398f3e2b4146103225780639e1bc4ef14610335578063a3a65e4814610348575f80fd5b806335455ded1161014457806360305d621161011f57806360305d621461029e57806361e2f490146102bb57806362065856146102ce57806366435abf146102e1575f80fd5b806335455ded1461025c578063467ef06f146102785780635297fae61461028b575f80fd5b80630118acc41461018b5780630322ed98146101a05780630cdd0985146101b3578063151d30d1146102045780632e2194d81461021e578063330a0a3a14610249575b5f80fd5b61019e610199366004615248565b6103ec565b005b61019e6101ae366004615283565b610890565b6101f16101c1366004615283565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b61020c600a81565b60405160ff90911681526020016101fb565b61023161022c366004615283565b610a49565b6040516001600160401b0390911681526020016101fb565b61019e6102573660046152ae565b610a5f565b61026561271081565b60405161ffff90911681526020016101fb565b61019e6102863660046152ec565b610b3e565b61019e610299366004615305565b610bde565b6102a6601481565b60405163ffffffff90911681526020016101fb565b61019e6102c936600461532d565b610db3565b6101f16102dc366004615391565b611351565b6102316102ef366004615283565b61136a565b61019e610302366004615248565b61137e565b61020c603081565b61019e61031d366004615283565b6115c1565b61019e610330366004615305565b6116c7565b6101f16103433660046153aa565b6119eb565b61019e6103563660046152ec565b611a17565b6103696005600160991b0181565b6040516001600160a01b0390911681526020016101fb565b61019e61038f366004615283565b611bcf565b61019e6103a2366004615283565b611e55565b61020c601481565b6103c26103bd366004615283565b611f69565b6040516101fb91906153de565b6102316202a30081565b6101f16103e73660046154a5565b612031565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615eb283398151915293929190829060ff16600481111561044d5761044d6153ca565b600481111561045e5761045e6153ca565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104e282611f69565b90506002835160048111156104f9576104f96153ca565b1461054b5760405162461bcd60e51b815260206004820152602a60248201525f80516020615ed28339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105b05760405162461bcd60e51b815260206004820152603360248201525f80516020615ed28339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610542565b6003835280515f9060029060058111156105cc576105cc6153ca565b036106235786156105e4576105e18387612066565b90505b5f846060015183608001516105f9919061551e565b90506106058482612302565b506001600160401b0390811660e0870152421660a086015250610657565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561068a8660600151611351565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072b919061553e565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561076a5761076a6153ca565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161087e916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f328339815191526020526040808220815160e0810190925280545f80516020615ef283398151915293929190829060ff1660058111156108dd576108dd6153ca565b60058111156108ee576108ee6153ca565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561095d5761095d6153ca565b146109c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb6109e78584606001515f612459565b6040518263ffffffff1660e01b8152600401610a039190615577565b6020604051808303815f875af1158015610a1f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a43919061553e565b50505050565b5f610a5964e8d4a51000836155a9565b92915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aa8575080546001600160401b03808416911610155b15610ac65760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610af184846124b0565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f80516020615eb28339815191525f80610b57846124ca565b91509150610b6482612814565b610b6e5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610b9c57610b9c6153ca565b03610bc1575f83815260088501602052604081208054919055610bbf828261284f565b505b610bd781610bd28460400151611351565b6128c5565b5050505050565b5f80516020615eb28339815191525f610bf6846128e8565b90505f80610c078360400151612ac2565b50915091505f610c1683611f69565b9050816001600160401b031681606001516001600160401b03161015610c4e5760405162461bcd60e51b8152600401610542906155c8565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610c935760405162461bcd60e51b81526004016105429061560a565b60015f87815260068701602052604090205460ff166004811115610cb957610cb96153ca565b14610d225760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610542565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615ef28339815191529060ff1615610e505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb7919061553e565b836020013514610f195760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610542565b30610f2a6060850160408601615653565b6001600160a01b031614610f9c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610542565b5f610faa606085018561566e565b905090505f805b828163ffffffff161015611255575f610fcd606088018861566e565b8363ffffffff16818110610fe357610fe36156b3565b9050602002810190610ff591906156c7565b610ffe90615777565b80515f81815260098801602052604090205491925090156110315760405162461bcd60e51b81526004016105429061580e565b5f6002895f01358560405160200161106092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261107a91615856565b602060405180830381855afa158015611095573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110b8919061553e565b5f8381526009890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088c01909252909120815181549394509192909190829060ff19166001836005811115611144576111446153ca565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111f7911686615867565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061124e9061587a565b9050610fb1565b50600583018190555f611267856128e8565b90505f6112778260400151612cfd565b90505f61128388612e6f565b9050816002826040516112969190615856565b602060405180830381855afa1580156112b1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112d4919061553e565b146113385760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610542565b505050600a909201805460ff1916600117905550505050565b5f610a596001600160401b03831664e8d4a5100061589c565b5f61137482611f69565b6080015192915050565b5f80516020615eb28339815191525f61139685613308565b90506113a185612814565b6113ac575050505050565b5f8581526005830160205260409020546001600160a01b031633146113e35760405162461bcd60e51b8152600401610542906158b3565b5f85815260058301602052604090205460a082015161141291600160b01b90046001600160401b031690615905565b6001600160401b03168160c001516001600160401b031610156114935760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610542565b8315610bd7575f6114a48685612066565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906114fb90611351565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611571573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611595919061553e565b5f878152600885016020526040812080549091906115b4908490615867565b9091555050505050505050565b5f80516020615eb28339815191525f6115d983611f69565b90506004815160058111156115f0576115f06153ca565b1461165a5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610542565b5f8381526005830160205260409020546001600160a01b031633146116915760405162461bcd60e51b8152600401610542906158b3565b5f83815260088301602090815260408083208054908490556005860190925290912054610a43906001600160a01b03168261284f565b6116cf613583565b5f80516020615eb28339815191525f6116e7846128e8565b90505f806116f88360400151612ac2565b50915091505f61170783611f69565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611741576117416153ca565b6004811115611752576117526153ca565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118365760405162461bcd60e51b8152600401610542906155c8565b826001600160401b03168160e001516001600160401b0316111561186c5760405162461bcd60e51b81526004016105429061560a565b600381516004811115611881576118816153ca565b146118d55760405162461bcd60e51b815260206004820152603160248201525f80516020615ed28339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610542565b5f878152600787016020908152604080832080549084905587845260058a019092528220549091906127109061191690600160a01b900461ffff168461589c565b61192091906155a9565b905080886008015f8881526020019081526020015f205f8282546119449190615867565b909155505f90506119558284615925565b905061196584602001518261284f565b61197a8460200151610bd28660600151611351565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d503384866040516119c0929190918252602082015260400190565b60405180910390a45050505050505050506119e760015f80516020615f1283398151915255565b5050565b5f6119f4613583565b6119ff8333846135cd565b9050610a5960015f80516020615f1283398151915255565b5f80516020615ef28339815191525f611a2f836128e8565b90505f80611a408360400151613987565b9150915080611aa25760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610542565b5f82815260078501602052604081208054611abc90615938565b9050118015611aee575060015f83815260088601602052604090205460ff166005811115611aec57611aec6153ca565b145b611b0a5760405162461bcd60e51b815260040161054290615970565b5f8281526007850160205260408120611b2291615198565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615eb283398151915293929190829060ff166004811115611c3057611c306153ca565b6004811115611c4157611c416153ca565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611cc857611cc86153ca565b1480611ce65750600381516004811115611ce457611ce46153ca565b145b611d3a5760405162461bcd60e51b815260206004820152603260248201525f80516020615ed2833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610542565b5f611d488260400151611f69565b905080606001516001600160401b03165f03611dcc5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610542565b6005600160991b016001600160a01b031663ee5b48eb611df9846040015184606001518560800151612459565b6040518263ffffffff1660e01b8152600401611e159190615577565b6020604051808303815f875af1158015611e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd7919061553e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615ef2833981519152929190611e9d90615938565b9050118015611ecf575060015f83815260088301602052604090205460ff166005811115611ecd57611ecd6153ca565b145b611eeb5760405162461bcd60e51b815260040161054290615970565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f2491906004016159b7565b6020604051808303815f875af1158015611f40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f64919061553e565b505050565b611f716151cf565b5f8281525f80516020615f32833981519152602052604090819020815160e0810190925280545f80516020615ef2833981519152929190829060ff166005811115611fbe57611fbe6153ca565b6005811115611fcf57611fcf6153ca565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61203a613583565b61204685858585613b28565b905061205e60015f80516020615f1283398151915255565b949350505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156120b1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120d89190810190615a4c565b915091508061213b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610542565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561217e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121a2919061553e565b8251146122065760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610542565b60208201516001600160a01b03161561227c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610542565b5f8061228b8460400151613d9d565b915091508187146122f85760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610542565b9695505050505050565b5f8281525f80516020615f32833981519152602052604081206002015481905f80516020615ef283398151915290600160801b90046001600160401b031661234a8582613f75565b5f61235487614183565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123a48a858b612459565b6040518263ffffffff1660e01b81526004016123c09190615577565b6020604051808303815f875af11580156123dc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612400919061553e565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b6124b8614213565b6124c18261425e565b6119e7816142d5565b5f6124d36151cf565b5f80516020615ef28339815191525f6124eb856128e8565b90505f806124fc8360400151613987565b9150915080156125615760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610542565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612592576125926153ca565b60058111156125a3576125a36153ca565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612614576126146153ca565b14806126325750600182516005811115612630576126306153ca565b145b6126915760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610542565b6003825160058111156126a6576126a66153ca565b036126b3575060046126b7565b5060055b6020808301515f908152600988019091526040812055818160058111156126e0576126e06153ca565b908160058111156126f3576126f36153ca565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612727576127276153ca565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156127db576127db6153ca565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615e9283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156128aa575f80fd5b505af11580156128bc573d5f803e3d5ffd5b50505050505050565b5f80516020615e92833981519152546119e7906001600160a01b03168383614376565b60408051606080820183525f8083526020830181905292820152905f80516020615ef28339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561295d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129849190810190615a4c565b91509150806129e45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610542565b8254825114612a475760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610542565b60208201516001600160a01b031615612aba5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610542565b509392505050565b5f805f8351603614612ae65760405162461bcd60e51b815260040161054290615b1e565b5f805b6002811015612b3557612afd816001615925565b612b0890600861589c565b61ffff16868281518110612b1e57612b1e6156b3565b016020015160f81c901b9190911790600101612ae9565b5061ffff811615612b585760405162461bcd60e51b815260040161054290615b67565b5f805b6004811015612bb357612b6f816003615925565b612b7a90600861589c565b63ffffffff1687612b8c836002615867565b81518110612b9c57612b9c6156b3565b016020015160f81c901b9190911790600101612b5b565b5063ffffffff8116600414612bda5760405162461bcd60e51b815260040161054290615baa565b5f805b6020811015612c2f57612bf181601f615925565b612bfc90600861589c565b88612c08836006615867565b81518110612c1857612c186156b3565b016020015160f81c901b9190911790600101612bdd565b505f805b6008811015612c8e57612c47816007615925565b612c5290600861589c565b6001600160401b031689612c67836026615867565b81518110612c7757612c776156b3565b016020015160f81c901b9190911790600101612c33565b505f805b6008811015612ced57612ca6816007615925565b612cb190600861589c565b6001600160401b03168a612cc683602e615867565b81518110612cd657612cd66156b3565b016020015160f81c901b9190911790600101612c92565b5091989097509095509350505050565b5f8151602614612d1f5760405162461bcd60e51b815260040161054290615b1e565b5f805b6002811015612d6e57612d36816001615925565b612d4190600861589c565b61ffff16848281518110612d5757612d576156b3565b016020015160f81c901b9190911790600101612d22565b5061ffff811615612d915760405162461bcd60e51b815260040161054290615b67565b5f805b6004811015612dec57612da8816003615925565b612db390600861589c565b63ffffffff1685612dc5836002615867565b81518110612dd557612dd56156b3565b016020015160f81c901b9190911790600101612d94565b5063ffffffff811615612e115760405162461bcd60e51b815260040161054290615baa565b5f805b6020811015612e6657612e2881601f615925565b612e3390600861589c565b86612e3f836006615867565b81518110612e4f57612e4f6156b3565b016020015160f81c901b9190911790600101612e14565b50949350505050565b60605f612e7e8383018461566e565b612e8a9150605861589c565b612e9590605c615867565b6001600160401b03811115612eac57612eac6156e5565b6040519080825280601f01601f191660200182016040528015612ed6576020820181803683370190505b5090505f5b6020811015612f2b5783358160208110612ef757612ef76156b3565b1a60f81b828281518110612f0d57612f0d6156b3565b60200101906001600160f81b03191690815f1a905350600101612edb565b505f5b6020811015612f8b5783602001358160208110612f4d57612f4d6156b3565b1a60f81b82612f5d836020615867565b81518110612f6d57612f6d6156b3565b60200101906001600160f81b03191690815f1a905350600101612f2e565b505f5b6004811015612fee57612fa2816003615925565b612fad90600861589c565b6014901c60f81b82612fc0836040615867565b81518110612fd057612fd06156b3565b60200101906001600160f81b03191690815f1a905350600101612f8e565b505f6130006060850160408601615653565b60601b90505f5b601481101561306057818160148110613022576130226156b3565b1a60f81b83613032836044615867565b81518110613042576130426156b3565b60200101906001600160f81b03191690815f1a905350600101613007565b505f61306f606086018661566e565b905090505f5b60048110156130da57613089816003615925565b61309490600861589c565b63ffffffff8316901c60f81b846130ac836058615867565b815181106130bc576130bc6156b3565b60200101906001600160f81b03191690815f1a905350600101613075565b505f5b6130ea606087018761566e565b90508110156132fe575f6130ff82605861589c565b61310a90605c615867565b90505f5b602081101561319557613124606089018961566e565b84818110613134576131346156b3565b905060200281019061314691906156c7565b358160208110613158576131586156b3565b1a60f81b866131678385615867565b81518110613177576131776156b3565b60200101906001600160f81b03191690815f1a90535060010161310e565b505f5b600881101561324a576131ac816007615925565b6131b790600861589c565b6131c460608a018a61566e565b858181106131d4576131d46156b3565b90506020028101906131e691906156c7565b6131f7906040810190602001615391565b6001600160401b0316901c60f81b8682613212856020615867565b61321c9190615867565b8151811061322c5761322c6156b3565b60200101906001600160f81b03191690815f1a905350600101613198565b505f5b60308110156132f457613263606089018961566e565b84818110613273576132736156b3565b905060200281019061328591906156c7565b613293906040810190615bf1565b828181106132a3576132a36156b3565b9050013560f81c60f81b86828460286132bc9190615867565b6132c69190615867565b815181106132d6576132d66156b3565b60200101906001600160f81b03191690815f1a90535060010161324d565b50506001016130dd565b5091949350505050565b6133106151cf565b5f8281525f80516020615f328339815191526020526040808220815160e0810190925280545f80516020615ef283398151915293929190829060ff16600581111561335d5761335d6153ca565b600581111561336e5761336e6153ca565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156133e0576133e06153ca565b1461343c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610542565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff19166001836005811115613480576134806153ca565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61352c8582612302565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f128339815191528054600119016135b457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f1283398151915255565b5f5f80516020615eb2833981519152816135e961022c856143d5565b90505f6135f587611f69565b905061360087612814565b61365d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610542565b600281516005811115613672576136726153ca565b146136d15760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610542565b5f8282608001516136e29190615905565b60048501546040840151919250613704916001600160401b0390911690615c33565b6001600160401b0316816001600160401b031611156137835760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610542565b5f8061378f8a84612302565b915091505f8a836040516020016137bd92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613858576138586153ca565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146139aa5760405162461bcd60e51b815260040161054290615b1e565b5f805b60028110156139f9576139c1816001615925565b6139cc90600861589c565b61ffff168582815181106139e2576139e26156b3565b016020015160f81c901b91909117906001016139ad565b5061ffff811615613a1c5760405162461bcd60e51b815260040161054290615b67565b5f805b6004811015613a7757613a33816003615925565b613a3e90600861589c565b63ffffffff1686613a50836002615867565b81518110613a6057613a606156b3565b016020015160f81c901b9190911790600101613a1f565b5063ffffffff8116600314613a9e5760405162461bcd60e51b815260040161054290615baa565b5f805b6020811015613af357613ab581601f615925565b613ac090600861589c565b87613acc836006615867565b81518110613adc57613adc6156b3565b016020015160f81c901b9190911790600101613aa1565b505f86602681518110613b0857613b086156b3565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615eb28339815191529061ffff861610801590613b74575061271061ffff861611155b613b905760405162461bcd60e51b815260040161054290615c5e565b60028101546001600160401b039081169085161015613c095760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610542565b8054831015613c6c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610542565b8060010154831115613cd35760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610542565b5f613cdd846143d5565b90505f613ce982610a49565b90505f613cf689836143f8565b90506040518060600160405280613d0a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b5f808251602e14613dc05760405162461bcd60e51b815260040161054290615b1e565b5f805b6002811015613e0f57613dd7816001615925565b613de290600861589c565b61ffff16858281518110613df857613df86156b3565b016020015160f81c901b9190911790600101613dc3565b5061ffff811615613e325760405162461bcd60e51b815260040161054290615b67565b5f805b6004811015613e8d57613e49816003615925565b613e5490600861589c565b63ffffffff1686613e66836002615867565b81518110613e7657613e766156b3565b016020015160f81c901b9190911790600101613e35565b5063ffffffff8116600514613eb45760405162461bcd60e51b815260040161054290615baa565b5f805b6020811015613f0957613ecb81601f615925565b613ed690600861589c565b87613ee2836006615867565b81518110613ef257613ef26156b3565b016020015160f81c901b9190911790600101613eb7565b505f805b6008811015613f6857613f21816007615925565b613f2c90600861589c565b6001600160401b031688613f41836026615867565b81518110613f5157613f516156b3565b016020015160f81c901b9190911790600101613f0d565b5090969095509350505050565b5f80516020615ef28339815191525f6001600160401b038084169085161115613fa957613fa2838561551e565b9050613fb6565b613fb3848461551e565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580614018575060028401548151614014916001600160401b031690615867565b8210155b1561403e576001600160401b03831660608201528181526040810151602082015261405d565b82816060018181516140509190615905565b6001600160401b03169052505b606081015161406d906064615c33565b602082015160028601546001600160401b0392909216916140989190600160401b900460ff1661589c565b10156140fc5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610542565b856001600160401b0316816040018181516141179190615867565b9052506040810180516001600160401b0387169190614137908390615925565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f328339815191526020526040812060020180545f80516020615ef283398151915291600160401b9091046001600160401b03169060086141cd83615ca9565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661425c57604051631afcd79f60e31b815260040160405180910390fd5b565b614266614213565b61426f8161495d565b614277614976565b6142d2608082013560a083013561429460e0850160c08601615391565b6142a5610100860160e08701615cc4565b61ffff166142bb61012087016101008801615cdd565b6142cd61014088016101208901615653565b614986565b50565b6142dd614213565b5f80516020615e928339815191526001600160a01b0382166143565760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610542565b80546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160a01b03838116602483015260448201839052611f6491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614bca565b5f610a59825f80516020615e92833981519152546001600160a01b031690614c2b565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166144835760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610542565b5f80516020615ef2833981519152426144a26040860160208701615391565b6001600160401b0316116145145760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610542565b6145246040850160208601615391565b6001600160401b031661453a6202a30042615867565b116145ad5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610542565b83356146055760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610542565b83355f908152600982016020526040902054156146345760405162461bcd60e51b81526004016105429061580e565b60306146436040860186615bf1565b9050146146a85760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610542565b6146b2835f613f75565b5f8061474c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906146f79190615391565b6001600160401b0316815260200161471260408a018a615bf1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614d8d565b5f8281526007860160205260409020919350915061476a8282615d41565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614797908590600401615577565b6020604051808303815f875af11580156147b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147d7919061553e565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561484f5761484f6153ca565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161492f918e01908e01615391565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b614965614213565b61496d614e91565b6142d281614e99565b61497e614213565b61425c61503b565b61498e614213565b5f80516020615eb2833981519152836149fa5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610542565b612710841115614a1c5760405162461bcd60e51b815260040161054290615c5e565b85871115614a845760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610542565b5f8360ff1611614af15760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610542565b600a60ff84161115614b635760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610542565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f614bde6001600160a01b03841683615043565b905080515f14158015614c02575080806020019051810190614c009190615e00565b155b15611f6457604051635274afe760e01b81526001600160a01b0384166004820152602401610542565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614c71573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614c95919061553e565b9050614cac6001600160a01b038516333086615050565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614cf0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d14919061553e565b9050818111614d7a5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610542565b614d848282615925565b95945050505050565b5f6060826080015151603014614df75760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610542565b5f806001855f01518660200151876040015188608001518960600151604051602001614e299796959493929190615e1b565b6040516020818303038152906040529050600281604051614e4a9190615856565b602060405180830381855afa158015614e65573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e88919061553e565b94909350915050565b61425c614213565b614ea1614213565b80355f80516020615ef283398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614eed6080840160608501615cdd565b60ff161115614f5a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610542565b5f614f6b6080840160608501615cdd565b60ff1611614fd35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610542565b614fe36080830160608401615cdd565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556150146060830160408401615391565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6135ba614213565b60606124a983835f615089565b6040516001600160a01b038481166024830152838116604483015260648201839052610a439186918216906323b872dd906084016143a3565b6060814710156150ae5760405163cd78605960e01b8152306004820152602401610542565b5f80856001600160a01b031684866040516150c99190615856565b5f6040518083038185875af1925050503d805f8114615103576040519150601f19603f3d011682016040523d82523d5f602084013e615108565b606091505b50915091506122f8868383606082615128576151238261516f565b6124a9565b815115801561513f57506001600160a01b0384163b155b1561516857604051639996b31560e01b81526001600160a01b0385166004820152602401610542565b50806124a9565b80511561517f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151a490615938565b5f825580601f106151b3575050565b601f0160209004905f5260205f20908101906142d2919061520b565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561521f575f815560010161520c565b5090565b80151581146142d2575f80fd5b803563ffffffff81168114615243575f80fd5b919050565b5f805f6060848603121561525a575f80fd5b83359250602084013561526c81615223565b915061527a60408501615230565b90509250925092565b5f60208284031215615293575f80fd5b5035919050565b6001600160a01b03811681146142d2575f80fd5b5f808284036101608112156152c1575f80fd5b610140808212156152d0575f80fd5b84935083013590506152e18161529a565b809150509250929050565b5f602082840312156152fc575f80fd5b6124a982615230565b5f8060408385031215615316575f80fd5b61531f83615230565b946020939093013593505050565b5f806040838503121561533e575f80fd5b82356001600160401b03811115615353575f80fd5b830160808186031215615364575f80fd5b915061537260208401615230565b90509250929050565b80356001600160401b0381168114615243575f80fd5b5f602082840312156153a1575f80fd5b6124a98261537b565b5f80604083850312156153bb575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061540157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161543c60608401826001600160401b03169052565b50608083015161545760808401826001600160401b03169052565b5060a083015161547260a08401826001600160401b03169052565b5060c083015161548d60c08401826001600160401b03169052565b5092915050565b803561ffff81168114615243575f80fd5b5f805f80608085870312156154b8575f80fd5b84356001600160401b038111156154cd575f80fd5b8501606081880312156154de575f80fd5b93506154ec60208601615494565b92506154fa6040860161537b565b9396929550929360600135925050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561548d5761548d61550a565b5f6020828403121561554e575f80fd5b5051919050565b5f5b8381101561556f578181015183820152602001615557565b50505f910152565b602081525f8251806020840152615595816040850160208701615555565b601f01601f19169190910160400192915050565b5f826155c357634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615663575f80fd5b81356124a98161529a565b5f808335601e19843603018112615683575f80fd5b8301803591506001600160401b0382111561569c575f80fd5b6020019150600581901b3603821315612452575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126156db575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561571b5761571b6156e5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615749576157496156e5565b604052919050565b5f6001600160401b03821115615769576157696156e5565b50601f01601f191660200190565b5f60608236031215615787575f80fd5b61578f6156f9565b8235815260206157a081850161537b565b8183015260408401356001600160401b038111156157bc575f80fd5b840136601f8201126157cc575f80fd5b80356157df6157da82615751565b615721565b81815236848385010111156157f2575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f82516156db818460208701615555565b80820180821115610a5957610a5961550a565b5f63ffffffff8083168181036158925761589261550a565b6001019392505050565b8082028115828204841417610a5957610a5961550a565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561548d5761548d61550a565b81810381811115610a5957610a5961550a565b600181811c9082168061594c57607f821691505b60208210810361596a57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546159c981615938565b806020870152604060018084165f81146159ea5760018114615a0657615a33565b60ff19851660408a0152604084151560051b8a01019550615a33565b895f5260205f205f5b85811015615a2a5781548b8201860152908301908801615a0f565b8a016040019650505b509398975050505050505050565b805161524381615223565b5f8060408385031215615a5d575f80fd5b82516001600160401b0380821115615a73575f80fd5b9084019060608287031215615a86575f80fd5b615a8e6156f9565b82518152602080840151615aa18161529a565b82820152604084015183811115615ab6575f80fd5b80850194505087601f850112615aca575f80fd5b83519250615ada6157da84615751565b8381528882858701011115615aed575f80fd5b615afc84838301848801615555565b80604084015250819550615b11818801615a41565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615c06575f80fd5b8301803591506001600160401b03821115615c1f575f80fd5b602001915036819003821315612452575f80fd5b6001600160401b03818116838216028082169190828114615c5657615c5661550a565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036158925761589261550a565b5f60208284031215615cd4575f80fd5b6124a982615494565b5f60208284031215615ced575f80fd5b813560ff811681146124a9575f80fd5b601f821115611f6457805f5260205f20601f840160051c81016020851015615d225750805b601f840160051c820191505b81811015610bd7575f8155600101615d2e565b81516001600160401b03811115615d5a57615d5a6156e5565b615d6e81615d688454615938565b84615cfd565b602080601f831160018114615da1575f8415615d8a5750858301515b5f19600386901b1c1916600185901b178555615df8565b5f85815260208120601f198616915b82811015615dcf57888601518255948401946001909101908401615db0565b5085821015615dec57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e10575f80fd5b81516124a981615223565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451615e7081604e860160208901615555565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // 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 290d3b83c..f42f8513f 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -84,7 +84,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161616e38038061616e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6160218061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b336600461541e565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004615459565b6109d8565b3480156101e4575f80fd5b506102236101f3366004615459565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b8610276366004615470565b610b91565b348015610286575f80fd5b5061029a610295366004615459565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a3660046154ae565b610c84565b34801561032a575f80fd5b506101b8610339366004615502565b610cb8565b348015610349575f80fd5b506101b861035836600461551b565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a0366004615543565b610f2d565b3480156103b0575f80fd5b506102236103bf366004615591565b6114cb565b3480156103cf575f80fd5b5061029a6103de366004615459565b6114e4565b3480156103ee575f80fd5b506101b86103fd36600461541e565b6114f8565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004615459565b61173b565b348015610440575f80fd5b506101b861044f36600461551b565b611841565b34801561045f575f80fd5b506101b861046e366004615502565b611b65565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004615459565b611d1d565b3480156104b7575f80fd5b506101b86104c6366004615459565b611fa3565b6102236104d9366004615459565b6120b7565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004615459565b6120e8565b60405161022d91906155be565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f7583398151915293929190829060ff166004811115610595576105956155aa565b60048111156105a6576105a66155aa565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a826120e8565b9050600283516004811115610641576106416155aa565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615f958339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615f958339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f906002906005811115610714576107146155aa565b0361076b57861561072c5761072983876121b0565b90505b5f846060015183608001516107419190615688565b905061074d848261244c565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d286606001516114cb565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061087391906156a8565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b26155aa565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615ff58339815191526020526040808220815160e0810190925280545f80516020615fb583398151915293929190829060ff166005811115610a2557610a256155aa565b6005811115610a3657610a366155aa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa56155aa565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f6125a3565b6040518263ffffffff1660e01b8152600401610b4b91906156e1565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b91906156a8565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c22836127c8565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a5100083615713565b92915050565b5f610c8d6127dc565b610c9984848434612813565b9050610cb160015f80516020615fd583398151915255565b9392505050565b5f80516020615f758339815191525f80610cd184612a90565b91509150610cde82612dda565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d166155aa565b03610d3b575f83815260088501602052604081208054919055610d398282612e15565b505b610d5181610d4c84604001516114cb565b612e7b565b5050505050565b5f80516020615f758339815191525f610d7084612e8e565b90505f80610d818360400151613068565b50915091505f610d90836120e8565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a90615732565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a90615774565b60015f87815260068701602052604090205460ff166004811115610e3357610e336155aa565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615fb58339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061103191906156a8565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a460608501604086016157d1565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f61112460608501856157ec565b905090505f805b828163ffffffff1610156113cf575f61114760608801886157ec565b8363ffffffff1681811061115d5761115d615831565b905060200281019061116f9190615845565b611178906158f5565b80515f81815260098801602052604090205491925090156111ab5760405162461bcd60e51b815260040161068a9061598c565b5f6002895f0135856040516020016111da92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526111f4916159d4565b602060405180830381855afa15801561120f573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061123291906156a8565b5f8381526009890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088c01909252909120815181549394509192909190829060ff191660018360058111156112be576112be6155aa565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113719116866159e5565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806113c8906159f8565b905061112b565b50600583018190555f6113e185612e8e565b90505f6113f182604001516132a3565b90505f6113fd8861340c565b90508160028260405161141091906159d4565b602060405180830381855afa15801561142b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061144e91906156a8565b146114b25760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a51000615a1a565b5f6114ee826120e8565b6080015192915050565b5f80516020615f758339815191525f611510856138a5565b905061151b85612dda565b611526575050505050565b5f8581526005830160205260409020546001600160a01b0316331461155d5760405162461bcd60e51b815260040161068a90615a31565b5f85815260058301602052604090205460a082015161158c91600160b01b90046001600160401b031690615a83565b6001600160401b03168160c001516001600160401b0316101561160d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f61161e86856121b0565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611675906114cb565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156116eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170f91906156a8565b5f8781526008850160205260408120805490919061172e9084906159e5565b9091555050505050505050565b5f80516020615f758339815191525f611753836120e8565b905060048151600581111561176a5761176a6155aa565b146117d45760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b0316331461180b5760405162461bcd60e51b815260040161068a90615a31565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612e15565b6118496127dc565b5f80516020615f758339815191525f61186184612e8e565b90505f806118728360400151613068565b50915091505f611881836120e8565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156118bb576118bb6155aa565b60048111156118cc576118cc6155aa565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156119b05760405162461bcd60e51b815260040161068a90615732565b826001600160401b03168160e001516001600160401b031611156119e65760405162461bcd60e51b815260040161068a90615774565b6003815160048111156119fb576119fb6155aa565b14611a4f5760405162461bcd60e51b815260206004820152603160248201525f80516020615f958339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611a9090600160a01b900461ffff1684615a1a565b611a9a9190615713565b905080886008015f8881526020019081526020015f205f828254611abe91906159e5565b909155505f9050611acf8284615aa3565b9050611adf846020015182612e15565b611af48460200151610d4c86606001516114cb565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611b3a929190918252602082015260400190565b60405180910390a4505050505050505050611b6160015f80516020615fd583398151915255565b5050565b5f80516020615fb58339815191525f611b7d83612e8e565b90505f80611b8e8360400151613b20565b9150915080611bf05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611c0a90615ab6565b9050118015611c3c575060015f83815260088601602052604090205460ff166005811115611c3a57611c3a6155aa565b145b611c585760405162461bcd60e51b815260040161068a90615ae8565b5f8281526007850160205260408120611c7091615373565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615f7583398151915293929190829060ff166004811115611d7e57611d7e6155aa565b6004811115611d8f57611d8f6155aa565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e1657611e166155aa565b1480611e345750600381516004811115611e3257611e326155aa565b145b611e885760405162461bcd60e51b815260206004820152603260248201525f80516020615f95833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611e9682604001516120e8565b905080606001516001600160401b03165f03611f1a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611f478460400151846060015185608001516125a3565b6040518263ffffffff1660e01b8152600401611f6391906156e1565b6020604051808303815f875af1158015611f7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5191906156a8565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615fb5833981519152929190611feb90615ab6565b905011801561201d575060015f83815260088301602052604090205460ff16600581111561201b5761201b6155aa565b145b6120395760405162461bcd60e51b815260040161068a90615ae8565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120729190600401615b2f565b6020604051808303815f875af115801561208e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b291906156a8565b505050565b5f6120c06127dc565b6120cb823334613cc1565b90506120e360015f80516020615fd583398151915255565b919050565b6120f06153aa565b5f8281525f80516020615ff5833981519152602052604090819020815160e0810190925280545f80516020615fb5833981519152929190829060ff16600581111561213d5761213d6155aa565b600581111561214e5761214e6155aa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156121fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122229190810190615bc4565b91509150806122855760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ec91906156a8565b8251146123505760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b0316156123c65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f806123d58460400151614078565b915091508187146124425760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615ff5833981519152602052604081206002015481905f80516020615fb583398151915290600160801b90046001600160401b03166124948582614250565b5f61249e8761445e565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124ee8a858b6125a3565b6040518263ffffffff1660e01b815260040161250a91906156e1565b6020604051808303815f875af1158015612526573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254a91906156a8565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561261c576125dc816001615aa3565b6125e7906008615a1a565b5081515f908390839081106125fe576125fe615831565b60200101906001600160f81b03191690815f1a9053506001016125c8565b505f5b600481101561268757612633816003615aa3565b61263e906008615a1a565b600263ffffffff16901c60f81b8282600261265991906159e5565b8151811061266957612669615831565b60200101906001600160f81b03191690815f1a90535060010161261f565b505f5b60208110156126e95761269e81601f615aa3565b6126a9906008615a1a565b86901c60f81b826126bb8360066159e5565b815181106126cb576126cb615831565b60200101906001600160f81b03191690815f1a90535060010161268a565b505f5b600881101561275457612700816007615aa3565b61270b906008615a1a565b6001600160401b038616901c60f81b826127268360266159e5565b8151811061273657612736615831565b60200101906001600160f81b03191690815f1a9053506001016126ec565b505f5b60088110156127bf5761276b816007615aa3565b612776906008615a1a565b6001600160401b038516901c60f81b8261279183602e6159e5565b815181106127a1576127a1615831565b60200101906001600160f81b03191690815f1a905350600101612757565b50949350505050565b6127d06144ee565b6127d981614539565b50565b5f80516020615fd583398151915280546001190161280d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615f758339815191529061ffff86161080159061285f575061271061ffff861611155b61287b5760405162461bcd60e51b815260040161068a90615c96565b60028101546001600160401b0390811690851610156128f45760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156129575760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b80600101548311156129be5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f6129c982610c6e565b90505f6129d689836145ad565b905060405180606001604052806129ea3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615fd583398151915255565b5f612a996153aa565b5f80516020615fb58339815191525f612ab185612e8e565b90505f80612ac28360400151613b20565b915091508015612b275760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115612b5857612b586155aa565b6005811115612b6957612b696155aa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612bda57612bda6155aa565b1480612bf85750600182516005811115612bf657612bf66155aa565b145b612c575760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612c6c57612c6c6155aa565b03612c7957506004612c7d565b5060055b6020808301515f90815260098801909152604081205581816005811115612ca657612ca66155aa565b90816005811115612cb957612cb96155aa565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612ced57612ced6155aa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612da157612da16155aa565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612e61575f80fd5b505af1158015612e73573d5f803e3d5ffd5b505050505050565b611b616001600160a01b03831682614b12565b60408051606080820183525f8083526020830181905292820152905f80516020615fb58339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f03573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f2a9190810190615bc4565b9150915080612f8a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b8254825114612fed5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b0316156130605760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f835160361461308c5760405162461bcd60e51b815260040161068a90615ce1565b5f805b60028110156130db576130a3816001615aa3565b6130ae906008615a1a565b61ffff168682815181106130c4576130c4615831565b016020015160f81c901b919091179060010161308f565b5061ffff8116156130fe5760405162461bcd60e51b815260040161068a90615d2a565b5f805b600481101561315957613115816003615aa3565b613120906008615a1a565b63ffffffff16876131328360026159e5565b8151811061314257613142615831565b016020015160f81c901b9190911790600101613101565b5063ffffffff81166004146131805760405162461bcd60e51b815260040161068a90615d6d565b5f805b60208110156131d55761319781601f615aa3565b6131a2906008615a1a565b886131ae8360066159e5565b815181106131be576131be615831565b016020015160f81c901b9190911790600101613183565b505f805b6008811015613234576131ed816007615aa3565b6131f8906008615a1a565b6001600160401b03168961320d8360266159e5565b8151811061321d5761321d615831565b016020015160f81c901b91909117906001016131d9565b505f805b60088110156132935761324c816007615aa3565b613257906008615a1a565b6001600160401b03168a61326c83602e6159e5565b8151811061327c5761327c615831565b016020015160f81c901b9190911790600101613238565b5091989097509095509350505050565b5f81516026146132c55760405162461bcd60e51b815260040161068a90615ce1565b5f805b6002811015613314576132dc816001615aa3565b6132e7906008615a1a565b61ffff168482815181106132fd576132fd615831565b016020015160f81c901b91909117906001016132c8565b5061ffff8116156133375760405162461bcd60e51b815260040161068a90615d2a565b5f805b60048110156133925761334e816003615aa3565b613359906008615a1a565b63ffffffff168561336b8360026159e5565b8151811061337b5761337b615831565b016020015160f81c901b919091179060010161333a565b5063ffffffff8116156133b75760405162461bcd60e51b815260040161068a90615d6d565b5f805b60208110156127bf576133ce81601f615aa3565b6133d9906008615a1a565b866133e58360066159e5565b815181106133f5576133f5615831565b016020015160f81c901b91909117906001016133ba565b60605f61341b838301846157ec565b61342791506058615a1a565b61343290605c6159e5565b6001600160401b0381111561344957613449615863565b6040519080825280601f01601f191660200182016040528015613473576020820181803683370190505b5090505f5b60208110156134c8578335816020811061349457613494615831565b1a60f81b8282815181106134aa576134aa615831565b60200101906001600160f81b03191690815f1a905350600101613478565b505f5b602081101561352857836020013581602081106134ea576134ea615831565b1a60f81b826134fa8360206159e5565b8151811061350a5761350a615831565b60200101906001600160f81b03191690815f1a9053506001016134cb565b505f5b600481101561358b5761353f816003615aa3565b61354a906008615a1a565b6014901c60f81b8261355d8360406159e5565b8151811061356d5761356d615831565b60200101906001600160f81b03191690815f1a90535060010161352b565b505f61359d60608501604086016157d1565b60601b90505f5b60148110156135fd578181601481106135bf576135bf615831565b1a60f81b836135cf8360446159e5565b815181106135df576135df615831565b60200101906001600160f81b03191690815f1a9053506001016135a4565b505f61360c60608601866157ec565b905090505f5b600481101561367757613626816003615aa3565b613631906008615a1a565b63ffffffff8316901c60f81b846136498360586159e5565b8151811061365957613659615831565b60200101906001600160f81b03191690815f1a905350600101613612565b505f5b61368760608701876157ec565b905081101561389b575f61369c826058615a1a565b6136a790605c6159e5565b90505f5b6020811015613732576136c160608901896157ec565b848181106136d1576136d1615831565b90506020028101906136e39190615845565b3581602081106136f5576136f5615831565b1a60f81b8661370483856159e5565b8151811061371457613714615831565b60200101906001600160f81b03191690815f1a9053506001016136ab565b505f5b60088110156137e757613749816007615aa3565b613754906008615a1a565b61376160608a018a6157ec565b8581811061377157613771615831565b90506020028101906137839190615845565b613794906040810190602001615591565b6001600160401b0316901c60f81b86826137af8560206159e5565b6137b991906159e5565b815181106137c9576137c9615831565b60200101906001600160f81b03191690815f1a905350600101613735565b505f5b60308110156138915761380060608901896157ec565b8481811061381057613810615831565b90506020028101906138229190615845565b613830906040810190615db4565b8281811061384057613840615831565b9050013560f81c60f81b868284602861385991906159e5565b61386391906159e5565b8151811061387357613873615831565b60200101906001600160f81b03191690815f1a9053506001016137ea565b505060010161367a565b5091949350505050565b6138ad6153aa565b5f8281525f80516020615ff58339815191526020526040808220815160e0810190925280545f80516020615fb583398151915293929190829060ff1660058111156138fa576138fa6155aa565b600581111561390b5761390b6155aa565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561397d5761397d6155aa565b146139d95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff19166001836005811115613a1d57613a1d6155aa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613ac9858261244c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613b435760405162461bcd60e51b815260040161068a90615ce1565b5f805b6002811015613b9257613b5a816001615aa3565b613b65906008615a1a565b61ffff16858281518110613b7b57613b7b615831565b016020015160f81c901b9190911790600101613b46565b5061ffff811615613bb55760405162461bcd60e51b815260040161068a90615d2a565b5f805b6004811015613c1057613bcc816003615aa3565b613bd7906008615a1a565b63ffffffff1686613be98360026159e5565b81518110613bf957613bf9615831565b016020015160f81c901b9190911790600101613bb8565b5063ffffffff8116600314613c375760405162461bcd60e51b815260040161068a90615d6d565b5f805b6020811015613c8c57613c4e81601f615aa3565b613c59906008615a1a565b87613c658360066159e5565b81518110613c7557613c75615831565b016020015160f81c901b9190911790600101613c3a565b505f86602681518110613ca157613ca1615831565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615f7583398151915281613cda84610c6e565b90505f613ce6876120e8565b9050613cf187612dda565b613d4e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b600281516005811115613d6357613d636155aa565b14613dc25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f828260800151613dd39190615a83565b60048501546040840151919250613df5916001600160401b0390911690615df6565b6001600160401b0316816001600160401b03161115613e745760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613e808a8461244c565b915091505f8a83604051602001613eae92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613f4957613f496155aa565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461409b5760405162461bcd60e51b815260040161068a90615ce1565b5f805b60028110156140ea576140b2816001615aa3565b6140bd906008615a1a565b61ffff168582815181106140d3576140d3615831565b016020015160f81c901b919091179060010161409e565b5061ffff81161561410d5760405162461bcd60e51b815260040161068a90615d2a565b5f805b600481101561416857614124816003615aa3565b61412f906008615a1a565b63ffffffff16866141418360026159e5565b8151811061415157614151615831565b016020015160f81c901b9190911790600101614110565b5063ffffffff811660051461418f5760405162461bcd60e51b815260040161068a90615d6d565b5f805b60208110156141e4576141a681601f615aa3565b6141b1906008615a1a565b876141bd8360066159e5565b815181106141cd576141cd615831565b016020015160f81c901b9190911790600101614192565b505f805b6008811015614243576141fc816007615aa3565b614207906008615a1a565b6001600160401b03168861421c8360266159e5565b8151811061422c5761422c615831565b016020015160f81c901b91909117906001016141e8565b5090969095509350505050565b5f80516020615fb58339815191525f6001600160401b0380841690851611156142845761427d8385615688565b9050614291565b61428e8484615688565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b03166060820152429115806142f35750600284015481516142ef916001600160401b0316906159e5565b8210155b15614319576001600160401b038316606082015281815260408101516020820152614338565b828160600181815161432b9190615a83565b6001600160401b03169052505b6060810151614348906064615df6565b602082015160028601546001600160401b0392909216916143739190600160401b900460ff16615a1a565b10156143d75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b0316816040018181516143f291906159e5565b9052506040810180516001600160401b0387169190614412908390615aa3565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615ff58339815191526020526040812060020180545f80516020615fb583398151915291600160401b9091046001600160401b03169060086144a883615e21565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661453757604051631afcd79f60e31b815260040160405180910390fd5b565b6145416144ee565b61454a81614ba5565b614552614bbe565b6127d9608082013560a083013561456f60e0850160c08601615591565b614580610100860160e08701615e3c565b61ffff1661459661012087016101008801615e55565b6145a8610140880161012089016157d1565b614bce565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff166146385760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615fb5833981519152426146576040860160208701615591565b6001600160401b0316116146c95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b6146d96040850160208601615591565b6001600160401b03166146ef6202a300426159e5565b116147625760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b83356147ba5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f908152600982016020526040902054156147e95760405162461bcd60e51b815260040161068a9061598c565b60306147f86040860186615db4565b90501461485d5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b614867835f614250565b5f806149016040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906148ac9190615591565b6001600160401b031681526020016148c760408a018a615db4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614e12565b5f8281526007860160205260409020919350915061491f8282615eb9565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061494c9085906004016156e1565b6020604051808303815f875af1158015614968573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061498c91906156a8565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff19166001836005811115614a0457614a046155aa565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614ae4918e01908e01615591565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015614b355760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614b7e576040519150601f19603f3d011682016040523d82523d5f602084013e614b83565b606091505b50509050806120b257604051630a12f52160e11b815260040160405180910390fd5b614bad6144ee565b614bb56151c1565b6127d9816151c9565b614bc66144ee565b61453761536b565b614bd66144ee565b5f80516020615f7583398151915283614c425760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b612710841115614c645760405162461bcd60e51b815260040161068a90615c96565b85871115614ccc5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff1611614d395760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff84161115614dab5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614e7c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614ef357614eb3816001615aa3565b614ebe906008615a1a565b5081515f90839083908110614ed557614ed5615831565b60200101906001600160f81b03191690815f1a905350600101614e9f565b505f5b6004811015614f5b57614f0a816003615aa3565b614f15906008615a1a565b600160ff919091161c60f81b82614f2d8360026159e5565b81518110614f3d57614f3d615831565b60200101906001600160f81b03191690815f1a905350600101614ef6565b505f5b6020811015614fb85784518160208110614f7a57614f7a615831565b1a60f81b82614f8a8360066159e5565b81518110614f9a57614f9a615831565b60200101906001600160f81b03191690815f1a905350600101614f5e565b505f5b60208110156150185784602001518160208110614fda57614fda615831565b1a60f81b82614fea8360266159e5565b81518110614ffa57614ffa615831565b60200101906001600160f81b03191690815f1a905350600101614fbb565b505f5b600881101561508c5761502f816007615aa3565b61503a906008615a1a565b60ff1685604001516001600160401b0316901c60f81b8282604661505e91906159e5565b8151811061506e5761506e615831565b60200101906001600160f81b03191690815f1a90535060010161501b565b505f5b60308110156150f757846080015181815181106150ae576150ae615831565b01602001516001600160f81b031916826150c983604e6159e5565b815181106150d9576150d9615831565b60200101906001600160f81b03191690815f1a90535060010161508f565b505f5b60088110156151695761510e816007615aa3565b615119906008615a1a565b60608601516001600160401b0390811691161c60f81b8261513b83607e6159e5565b8151811061514b5761514b615831565b60200101906001600160f81b03191690815f1a9053506001016150fa565b5060028160405161517a91906159d4565b602060405180830381855afa158015615195573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906151b891906156a8565b94909350915050565b6145376144ee565b6151d16144ee565b80355f80516020615fb583398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0155601461521d6080840160608501615e55565b60ff16111561528a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f61529b6080840160608501615e55565b60ff16116153035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b6153136080830160608401615e55565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556153446060830160408401615591565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612a7d6144ee565b50805461537f90615ab6565b5f825580601f1061538e575050565b601f0160209004905f5260205f20908101906127d991906153e6565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156153fa575f81556001016153e7565b5090565b80151581146127d9575f80fd5b803563ffffffff811681146120e3575f80fd5b5f805f60608486031215615430575f80fd5b833592506020840135615442816153fe565b91506154506040850161540b565b90509250925092565b5f60208284031215615469575f80fd5b5035919050565b5f6101408284031215615481575f80fd5b50919050565b803561ffff811681146120e3575f80fd5b80356001600160401b03811681146120e3575f80fd5b5f805f606084860312156154c0575f80fd5b83356001600160401b038111156154d5575f80fd5b8401606081870312156154e6575f80fd5b92506154f460208501615487565b915061545060408501615498565b5f60208284031215615512575f80fd5b610cb18261540b565b5f806040838503121561552c575f80fd5b6155358361540b565b946020939093013593505050565b5f8060408385031215615554575f80fd5b82356001600160401b03811115615569575f80fd5b83016080818603121561557a575f80fd5b91506155886020840161540b565b90509250929050565b5f602082840312156155a1575f80fd5b610cb182615498565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106155e157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161561c60608401826001600160401b03169052565b50608083015161563760808401826001600160401b03169052565b5060a083015161565260a08401826001600160401b03169052565b5060c083015161566d60c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561566d5761566d615674565b5f602082840312156156b8575f80fd5b5051919050565b5f5b838110156156d95781810151838201526020016156c1565b50505f910152565b602081525f82518060208401526156ff8160408501602087016156bf565b601f01601f19169190910160400192915050565b5f8261572d57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b03811681146127d9575f80fd5b5f602082840312156157e1575f80fd5b8135610cb1816157bd565b5f808335601e19843603018112615801575f80fd5b8301803591506001600160401b0382111561581a575f80fd5b6020019150600581901b360382131561259c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615859575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561589957615899615863565b60405290565b604051601f8201601f191681016001600160401b03811182821017156158c7576158c7615863565b604052919050565b5f6001600160401b038211156158e7576158e7615863565b50601f01601f191660200190565b5f60608236031215615905575f80fd5b61590d615877565b82358152602061591e818501615498565b8183015260408401356001600160401b0381111561593a575f80fd5b840136601f82011261594a575f80fd5b803561595d615958826158cf565b61589f565b8181523684838501011115615970575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f82516158598184602087016156bf565b80820180821115610c7e57610c7e615674565b5f63ffffffff808316818103615a1057615a10615674565b6001019392505050565b8082028115828204841417610c7e57610c7e615674565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561566d5761566d615674565b81810381811115610c7e57610c7e615674565b600181811c90821680615aca57607f821691505b60208210810361548157634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615b4181615ab6565b806020870152604060018084165f8114615b625760018114615b7e57615bab565b60ff19851660408a0152604084151560051b8a01019550615bab565b895f5260205f205f5b85811015615ba25781548b8201860152908301908801615b87565b8a016040019650505b509398975050505050505050565b80516120e3816153fe565b5f8060408385031215615bd5575f80fd5b82516001600160401b0380821115615beb575f80fd5b9084019060608287031215615bfe575f80fd5b615c06615877565b82518152602080840151615c19816157bd565b82820152604084015183811115615c2e575f80fd5b80850194505087601f850112615c42575f80fd5b83519250615c52615958846158cf565b8381528882858701011115615c65575f80fd5b615c74848383018488016156bf565b80604084015250819550615c89818801615bb9565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615dc9575f80fd5b8301803591506001600160401b03821115615de2575f80fd5b60200191503681900382131561259c575f80fd5b6001600160401b03818116838216028082169190828114615e1957615e19615674565b505092915050565b5f6001600160401b03808316818103615a1057615a10615674565b5f60208284031215615e4c575f80fd5b610cb182615487565b5f60208284031215615e65575f80fd5b813560ff81168114610cb1575f80fd5b601f8211156120b257805f5260205f20601f840160051c81016020851015615e9a5750805b601f840160051c820191505b81811015610d51575f8155600101615ea6565b81516001600160401b03811115615ed257615ed2615863565b615ee681615ee08454615ab6565b84615e75565b602080601f831160018114615f19575f8415615f025750858301515b5f19600386901b1c1916600185901b178555612e73565b5f85815260208120601f198616915b82811015615f4757888601518255948401946001909101908401615f28565b5085821015615f6457878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d6c380380615d6c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c1f8061014d5f395ff3fe608060405260043610610195575f3560e01c806362065856116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104cb578063c974d1b6146104de578063d5f20ff6146104f2578063df93d8de1461051e575f80fd5b8063b771b3bc14610473578063ba3a4b971461048d578063bee0a03f146104ac575f80fd5b80638280a25a116100c25780638280a25a1461040257806393e245981461041657806398f3e2b414610435578063a3a65e4814610454575f80fd5b806362065856146103a557806366435abf146103c457806376f78621146103e3575f80fd5b8063329c3e1211610152578063467ef06f1161012d578063467ef06f1461031f5780635297fae61461033e57806360305d621461035d57806361e2f49014610386575f80fd5b8063329c3e12146102b257806335455ded146102e457806340034a931461030c575f80fd5b80630118acc4146101995780630322ed98146101ba5780630cdd0985146101d9578063151d30d1146102365780631f7a9d8f1461025c5780632e2194d81461027b575b5f80fd5b3480156101a4575f80fd5b506101b86101b3366004614fa6565b610534565b005b3480156101c5575f80fd5b506101b86101d4366004614fe1565b6109d8565b3480156101e4575f80fd5b506102236101f3366004614fe1565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b348015610241575f80fd5b5061024a600a81565b60405160ff909116815260200161022d565b348015610267575f80fd5b506101b8610276366004614ff8565b610b91565b348015610286575f80fd5b5061029a610295366004614fe1565b610c6e565b6040516001600160401b03909116815260200161022d565b3480156102bd575f80fd5b506102cc6001600160991b0181565b6040516001600160a01b03909116815260200161022d565b3480156102ef575f80fd5b506102f961271081565b60405161ffff909116815260200161022d565b61022361031a366004615036565b610c84565b34801561032a575f80fd5b506101b861033936600461508a565b610cb8565b348015610349575f80fd5b506101b86103583660046150a3565b610d58565b348015610368575f80fd5b50610371601481565b60405163ffffffff909116815260200161022d565b348015610391575f80fd5b506101b86103a03660046150cb565b610f2d565b3480156103b0575f80fd5b506102236103bf366004615119565b6114cb565b3480156103cf575f80fd5b5061029a6103de366004614fe1565b6114e4565b3480156103ee575f80fd5b506101b86103fd366004614fa6565b6114f8565b34801561040d575f80fd5b5061024a603081565b348015610421575f80fd5b506101b8610430366004614fe1565b61173b565b348015610440575f80fd5b506101b861044f3660046150a3565b611841565b34801561045f575f80fd5b506101b861046e36600461508a565b611b65565b34801561047e575f80fd5b506102cc6005600160991b0181565b348015610498575f80fd5b506101b86104a7366004614fe1565b611d1d565b3480156104b7575f80fd5b506101b86104c6366004614fe1565b611fa3565b6102236104d9366004614fe1565b6120b7565b3480156104e9575f80fd5b5061024a601481565b3480156104fd575f80fd5b5061051161050c366004614fe1565b6120e8565b60405161022d9190615146565b348015610529575f80fd5b5061029a6202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b7383398151915293929190829060ff16600481111561059557610595615132565b60048111156105a6576105a6615132565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61062a826120e8565b905060028351600481111561064157610641615132565b146106935760405162461bcd60e51b815260206004820152602a60248201525f80516020615b938339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146106f85760405162461bcd60e51b815260206004820152603360248201525f80516020615b938339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161068a565b6003835280515f90600290600581111561071457610714615132565b0361076b57861561072c5761072983876121b0565b90505b5f846060015183608001516107419190615210565b905061074d848261244c565b506001600160401b0390811660e0870152421660a08601525061079f565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107d286606001516114cb565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561084f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108739190615230565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108b2576108b2615132565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109c6916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615bf38339815191526020526040808220815160e0810190925280545f80516020615bb383398151915293929190829060ff166005811115610a2557610a25615132565b6005811115610a3657610a36615132565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610aa557610aa5615132565b14610b0a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb610b2f8584606001515f6125a3565b6040518263ffffffff1660e01b8152600401610b4b9190615269565b6020604051808303815f875af1158015610b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b8b9190615230565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bda575080546001600160401b03808416911610155b15610bf85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c22836125f2565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c7e64e8d4a510008361529b565b92915050565b5f610c8d612606565b610c998484843461263d565b9050610cb160015f80516020615bd383398151915255565b9392505050565b5f80516020615b738339815191525f80610cd1846128ba565b91509150610cde82612c04565b610ce85750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d1657610d16615132565b03610d3b575f83815260088501602052604081208054919055610d398282612c3f565b505b610d5181610d4c84604001516114cb565b612ca5565b5050505050565b5f80516020615b738339815191525f610d7084612cb8565b90505f80610d818360400151612e92565b50915091505f610d90836120e8565b9050816001600160401b031681606001516001600160401b03161015610dc85760405162461bcd60e51b815260040161068a906152ba565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e0d5760405162461bcd60e51b815260040161068a906152fc565b60015f87815260068701602052604090205460ff166004811115610e3357610e33615132565b14610e9c5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161068a565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020615bb38339815191529060ff1615610fca5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561100d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110319190615230565b8360200135146110935760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161068a565b306110a46060850160408601615359565b6001600160a01b0316146111165760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161068a565b5f6111246060850185615374565b905090505f805b828163ffffffff1610156113cf575f6111476060880188615374565b8363ffffffff1681811061115d5761115d6153b9565b905060200281019061116f91906153cd565b6111789061547d565b80515f81815260098801602052604090205491925090156111ab5760405162461bcd60e51b815260040161068a90615514565b5f6002895f0135856040516020016111da92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526111f49161555c565b602060405180830381855afa15801561120f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112329190615230565b5f8381526009890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088c01909252909120815181549394509192909190829060ff191660018360058111156112be576112be615132565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161137191168661556d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806113c890615580565b905061112b565b50600583018190555f6113e185612cb8565b90505f6113f182604001516130cd565b90505f6113fd8861323f565b905081600282604051611410919061555c565b602060405180830381855afa15801561142b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061144e9190615230565b146114b25760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161068a565b505050600a909201805460ff1916600117905550505050565b5f610c7e6001600160401b03831664e8d4a510006155a2565b5f6114ee826120e8565b6080015192915050565b5f80516020615b738339815191525f611510856136d8565b905061151b85612c04565b611526575050505050565b5f8581526005830160205260409020546001600160a01b0316331461155d5760405162461bcd60e51b815260040161068a906155b9565b5f85815260058301602052604090205460a082015161158c91600160b01b90046001600160401b03169061560b565b6001600160401b03168160c001516001600160401b0316101561160d5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161068a565b8315610d51575f61161e86856121b0565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611675906114cb565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156116eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061170f9190615230565b5f8781526008850160205260408120805490919061172e90849061556d565b9091555050505050505050565b5f80516020615b738339815191525f611753836120e8565b905060048151600581111561176a5761176a615132565b146117d45760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161068a565b5f8381526005830160205260409020546001600160a01b0316331461180b5760405162461bcd60e51b815260040161068a906155b9565b5f83815260088301602090815260408083208054908490556005860190925290912054610b8b906001600160a01b031682612c3f565b611849612606565b5f80516020615b738339815191525f61186184612cb8565b90505f806118728360400151612e92565b50915091505f611881836120e8565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156118bb576118bb615132565b60048111156118cc576118cc615132565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156119b05760405162461bcd60e51b815260040161068a906152ba565b826001600160401b03168160e001516001600160401b031611156119e65760405162461bcd60e51b815260040161068a906152fc565b6003815160048111156119fb576119fb615132565b14611a4f5760405162461bcd60e51b815260206004820152603160248201525f80516020615b938339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161068a565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611a9090600160a01b900461ffff16846155a2565b611a9a919061529b565b905080886008015f8881526020019081526020015f205f828254611abe919061556d565b909155505f9050611acf828461562b565b9050611adf846020015182612c3f565b611af48460200151610d4c86606001516114cb565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611b3a929190918252602082015260400190565b60405180910390a4505050505050505050611b6160015f80516020615bd383398151915255565b5050565b5f80516020615bb38339815191525f611b7d83612cb8565b90505f80611b8e8360400151613953565b9150915080611bf05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161068a565b5f82815260078501602052604081208054611c0a9061563e565b9050118015611c3c575060015f83815260088601602052604090205460ff166005811115611c3a57611c3a615132565b145b611c585760405162461bcd60e51b815260040161068a90615670565b5f8281526007850160205260408120611c7091614efb565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615b7383398151915293929190829060ff166004811115611d7e57611d7e615132565b6004811115611d8f57611d8f615132565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611e1657611e16615132565b1480611e345750600381516004811115611e3257611e32615132565b145b611e885760405162461bcd60e51b815260206004820152603260248201525f80516020615b93833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161068a565b5f611e9682604001516120e8565b905080606001516001600160401b03165f03611f1a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161068a565b6005600160991b016001600160a01b031663ee5b48eb611f478460400151846060015185608001516125a3565b6040518263ffffffff1660e01b8152600401611f639190615269565b6020604051808303815f875af1158015611f7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d519190615230565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020615bb3833981519152929190611feb9061563e565b905011801561201d575060015f83815260088301602052604090205460ff16600581111561201b5761201b615132565b145b6120395760405162461bcd60e51b815260040161068a90615670565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161207291906004016156b7565b6020604051808303815f875af115801561208e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b29190615230565b505050565b5f6120c0612606565b6120cb823334613af4565b90506120e360015f80516020615bd383398151915255565b919050565b6120f0614f32565b5f8281525f80516020615bf3833981519152602052604090819020815160e0810190925280545f80516020615bb3833981519152929190829060ff16600581111561213d5761213d615132565b600581111561214e5761214e615132565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156121fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612222919081019061574c565b91509150806122855760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161068a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ec9190615230565b8251146123505760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161068a565b60208201516001600160a01b0316156123c65760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161068a565b5f806123d58460400151613eab565b915091508187146124425760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161068a565b9695505050505050565b5f8281525f80516020615bf3833981519152602052604081206002015481905f80516020615bb383398151915290600160801b90046001600160401b03166124948582614083565b5f61249e87614291565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124ee8a858b6125a3565b6040518263ffffffff1660e01b815260040161250a9190615269565b6020604051808303815f875af1158015612526573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254a9190615230565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6125fa614321565b6126038161436c565b50565b5f80516020615bd383398151915280546001190161263757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615b738339815191529061ffff861610801590612689575061271061ffff861611155b6126a55760405162461bcd60e51b815260040161068a9061581e565b60028101546001600160401b03908116908516101561271e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161068a565b80548310156127815760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161068a565b80600101548311156127e85760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161068a565b825f6127f382610c6e565b90505f61280089836143e0565b905060405180606001604052806128143390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615bd383398151915255565b5f6128c3614f32565b5f80516020615bb38339815191525f6128db85612cb8565b90505f806128ec8360400151613953565b9150915080156129515760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161068a565b5f828152600885016020526040808220815160e081019092528054829060ff16600581111561298257612982615132565b600581111561299357612993615132565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612a0457612a04615132565b1480612a225750600182516005811115612a2057612a20615132565b145b612a815760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161068a565b600382516005811115612a9657612a96615132565b03612aa357506004612aa7565b5060055b6020808301515f90815260098801909152604081205581816005811115612ad057612ad0615132565b90816005811115612ae357612ae3615132565b9052505f84815260088701602052604090208251815484929190829060ff19166001836005811115612b1757612b17615132565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612bcb57612bcb615132565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612c8b575f80fd5b505af1158015612c9d573d5f803e3d5ffd5b505050505050565b611b616001600160a01b03831682614945565b60408051606080820183525f8083526020830181905292820152905f80516020615bb38339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612d2d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612d54919081019061574c565b9150915080612db45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161068a565b8254825114612e175760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161068a565b60208201516001600160a01b031615612e8a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161068a565b509392505050565b5f805f8351603614612eb65760405162461bcd60e51b815260040161068a90615869565b5f805b6002811015612f0557612ecd81600161562b565b612ed89060086155a2565b61ffff16868281518110612eee57612eee6153b9565b016020015160f81c901b9190911790600101612eb9565b5061ffff811615612f285760405162461bcd60e51b815260040161068a906158b2565b5f805b6004811015612f8357612f3f81600361562b565b612f4a9060086155a2565b63ffffffff1687612f5c83600261556d565b81518110612f6c57612f6c6153b9565b016020015160f81c901b9190911790600101612f2b565b5063ffffffff8116600414612faa5760405162461bcd60e51b815260040161068a906158f5565b5f805b6020811015612fff57612fc181601f61562b565b612fcc9060086155a2565b88612fd883600661556d565b81518110612fe857612fe86153b9565b016020015160f81c901b9190911790600101612fad565b505f805b600881101561305e5761301781600761562b565b6130229060086155a2565b6001600160401b03168961303783602661556d565b81518110613047576130476153b9565b016020015160f81c901b9190911790600101613003565b505f805b60088110156130bd5761307681600761562b565b6130819060086155a2565b6001600160401b03168a61309683602e61556d565b815181106130a6576130a66153b9565b016020015160f81c901b9190911790600101613062565b5091989097509095509350505050565b5f81516026146130ef5760405162461bcd60e51b815260040161068a90615869565b5f805b600281101561313e5761310681600161562b565b6131119060086155a2565b61ffff16848281518110613127576131276153b9565b016020015160f81c901b91909117906001016130f2565b5061ffff8116156131615760405162461bcd60e51b815260040161068a906158b2565b5f805b60048110156131bc5761317881600361562b565b6131839060086155a2565b63ffffffff168561319583600261556d565b815181106131a5576131a56153b9565b016020015160f81c901b9190911790600101613164565b5063ffffffff8116156131e15760405162461bcd60e51b815260040161068a906158f5565b5f805b6020811015613236576131f881601f61562b565b6132039060086155a2565b8661320f83600661556d565b8151811061321f5761321f6153b9565b016020015160f81c901b91909117906001016131e4565b50949350505050565b60605f61324e83830184615374565b61325a915060586155a2565b61326590605c61556d565b6001600160401b0381111561327c5761327c6153eb565b6040519080825280601f01601f1916602001820160405280156132a6576020820181803683370190505b5090505f5b60208110156132fb57833581602081106132c7576132c76153b9565b1a60f81b8282815181106132dd576132dd6153b9565b60200101906001600160f81b03191690815f1a9053506001016132ab565b505f5b602081101561335b578360200135816020811061331d5761331d6153b9565b1a60f81b8261332d83602061556d565b8151811061333d5761333d6153b9565b60200101906001600160f81b03191690815f1a9053506001016132fe565b505f5b60048110156133be5761337281600361562b565b61337d9060086155a2565b6014901c60f81b8261339083604061556d565b815181106133a0576133a06153b9565b60200101906001600160f81b03191690815f1a90535060010161335e565b505f6133d06060850160408601615359565b60601b90505f5b6014811015613430578181601481106133f2576133f26153b9565b1a60f81b8361340283604461556d565b81518110613412576134126153b9565b60200101906001600160f81b03191690815f1a9053506001016133d7565b505f61343f6060860186615374565b905090505f5b60048110156134aa5761345981600361562b565b6134649060086155a2565b63ffffffff8316901c60f81b8461347c83605861556d565b8151811061348c5761348c6153b9565b60200101906001600160f81b03191690815f1a905350600101613445565b505f5b6134ba6060870187615374565b90508110156136ce575f6134cf8260586155a2565b6134da90605c61556d565b90505f5b6020811015613565576134f46060890189615374565b84818110613504576135046153b9565b905060200281019061351691906153cd565b358160208110613528576135286153b9565b1a60f81b86613537838561556d565b81518110613547576135476153b9565b60200101906001600160f81b03191690815f1a9053506001016134de565b505f5b600881101561361a5761357c81600761562b565b6135879060086155a2565b61359460608a018a615374565b858181106135a4576135a46153b9565b90506020028101906135b691906153cd565b6135c7906040810190602001615119565b6001600160401b0316901c60f81b86826135e285602061556d565b6135ec919061556d565b815181106135fc576135fc6153b9565b60200101906001600160f81b03191690815f1a905350600101613568565b505f5b60308110156136c4576136336060890189615374565b84818110613643576136436153b9565b905060200281019061365591906153cd565b61366390604081019061593c565b82818110613673576136736153b9565b9050013560f81c60f81b868284602861368c919061556d565b613696919061556d565b815181106136a6576136a66153b9565b60200101906001600160f81b03191690815f1a90535060010161361d565b50506001016134ad565b5091949350505050565b6136e0614f32565b5f8281525f80516020615bf38339815191526020526040808220815160e0810190925280545f80516020615bb383398151915293929190829060ff16600581111561372d5761372d615132565b600581111561373e5761373e615132565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156137b0576137b0615132565b1461380c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161068a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff1916600183600581111561385057613850615132565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6138fc858261244c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146139765760405162461bcd60e51b815260040161068a90615869565b5f805b60028110156139c55761398d81600161562b565b6139989060086155a2565b61ffff168582815181106139ae576139ae6153b9565b016020015160f81c901b9190911790600101613979565b5061ffff8116156139e85760405162461bcd60e51b815260040161068a906158b2565b5f805b6004811015613a43576139ff81600361562b565b613a0a9060086155a2565b63ffffffff1686613a1c83600261556d565b81518110613a2c57613a2c6153b9565b016020015160f81c901b91909117906001016139eb565b5063ffffffff8116600314613a6a5760405162461bcd60e51b815260040161068a906158f5565b5f805b6020811015613abf57613a8181601f61562b565b613a8c9060086155a2565b87613a9883600661556d565b81518110613aa857613aa86153b9565b016020015160f81c901b9190911790600101613a6d565b505f86602681518110613ad457613ad46153b9565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615b7383398151915281613b0d84610c6e565b90505f613b19876120e8565b9050613b2487612c04565b613b815760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161068a565b600281516005811115613b9657613b96615132565b14613bf55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161068a565b5f828260800151613c06919061560b565b60048501546040840151919250613c28916001600160401b039091169061597e565b6001600160401b0316816001600160401b03161115613ca75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161068a565b5f80613cb38a8461244c565b915091505f8a83604051602001613ce192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613d7c57613d7c615132565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613ece5760405162461bcd60e51b815260040161068a90615869565b5f805b6002811015613f1d57613ee581600161562b565b613ef09060086155a2565b61ffff16858281518110613f0657613f066153b9565b016020015160f81c901b9190911790600101613ed1565b5061ffff811615613f405760405162461bcd60e51b815260040161068a906158b2565b5f805b6004811015613f9b57613f5781600361562b565b613f629060086155a2565b63ffffffff1686613f7483600261556d565b81518110613f8457613f846153b9565b016020015160f81c901b9190911790600101613f43565b5063ffffffff8116600514613fc25760405162461bcd60e51b815260040161068a906158f5565b5f805b602081101561401757613fd981601f61562b565b613fe49060086155a2565b87613ff083600661556d565b81518110614000576140006153b9565b016020015160f81c901b9190911790600101613fc5565b505f805b60088110156140765761402f81600761562b565b61403a9060086155a2565b6001600160401b03168861404f83602661556d565b8151811061405f5761405f6153b9565b016020015160f81c901b919091179060010161401b565b5090969095509350505050565b5f80516020615bb38339815191525f6001600160401b0380841690851611156140b7576140b08385615210565b90506140c4565b6140c18484615210565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b0316606082015242911580614126575060028401548151614122916001600160401b03169061556d565b8210155b1561414c576001600160401b03831660608201528181526040810151602082015261416b565b828160600181815161415e919061560b565b6001600160401b03169052505b606081015161417b90606461597e565b602082015160028601546001600160401b0392909216916141a69190600160401b900460ff166155a2565b101561420a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161068a565b856001600160401b031681604001818151614225919061556d565b9052506040810180516001600160401b038716919061424590839061562b565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615bf38339815191526020526040812060020180545f80516020615bb383398151915291600160401b9091046001600160401b03169060086142db836159a9565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661436a57604051631afcd79f60e31b815260040160405180910390fd5b565b614374614321565b61437d816149d8565b6143856149f1565b612603608082013560a08301356143a260e0850160c08601615119565b6143b3610100860160e087016159c4565b61ffff166143c9610120870161010088016159dd565b6143db61014088016101208901615359565b614a01565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff1661446b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161068a565b5f80516020615bb38339815191524261448a6040860160208701615119565b6001600160401b0316116144fc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161068a565b61450c6040850160208601615119565b6001600160401b03166145226202a3004261556d565b116145955760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161068a565b83356145ed5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161068a565b83355f9081526009820160205260409020541561461c5760405162461bcd60e51b815260040161068a90615514565b603061462b604086018661593c565b9050146146905760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161068a565b61469a835f614083565b5f806147346040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906146df9190615119565b6001600160401b031681526020016146fa60408a018a61593c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614c45565b5f828152600786016020526040902091935091506147528282615a41565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061477f908590600401615269565b6020604051808303815f875af115801561479b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147bf9190615230565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561483757614837615132565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614917918e01908e01615119565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156149685760405163cd78605960e01b815230600482015260240161068a565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146149b1576040519150601f19603f3d011682016040523d82523d5f602084013e6149b6565b606091505b50509050806120b257604051630a12f52160e11b815260040160405180910390fd5b6149e0614321565b6149e8614d49565b61260381614d51565b6149f9614321565b61436a614ef3565b614a09614321565b5f80516020615b7383398151915283614a755760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161068a565b612710841115614a975760405162461bcd60e51b815260040161068a9061581e565b85871115614aff5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161068a565b5f8360ff1611614b6c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161068a565b600a60ff84161115614bde5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161068a565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614caf5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161068a565b5f806001855f01518660200151876040015188608001518960600151604051602001614ce19796959493929190615afc565b6040516020818303038152906040529050600281604051614d02919061555c565b602060405180830381855afa158015614d1d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d409190615230565b94909350915050565b61436a614321565b614d59614321565b80355f80516020615bb383398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014614da560808401606085016159dd565b60ff161115614e125760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161068a565b5f614e2360808401606085016159dd565b60ff1611614e8b5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161068a565b614e9b60808301606084016159dd565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055614ecc6060830160408401615119565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6128a7614321565b508054614f079061563e565b5f825580601f10614f16575050565b601f0160209004905f5260205f20908101906126039190614f6e565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614f82575f8155600101614f6f565b5090565b8015158114612603575f80fd5b803563ffffffff811681146120e3575f80fd5b5f805f60608486031215614fb8575f80fd5b833592506020840135614fca81614f86565b9150614fd860408501614f93565b90509250925092565b5f60208284031215614ff1575f80fd5b5035919050565b5f6101408284031215615009575f80fd5b50919050565b803561ffff811681146120e3575f80fd5b80356001600160401b03811681146120e3575f80fd5b5f805f60608486031215615048575f80fd5b83356001600160401b0381111561505d575f80fd5b84016060818703121561506e575f80fd5b925061507c6020850161500f565b9150614fd860408501615020565b5f6020828403121561509a575f80fd5b610cb182614f93565b5f80604083850312156150b4575f80fd5b6150bd83614f93565b946020939093013593505050565b5f80604083850312156150dc575f80fd5b82356001600160401b038111156150f1575f80fd5b830160808186031215615102575f80fd5b915061511060208401614f93565b90509250929050565b5f60208284031215615129575f80fd5b610cb182615020565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061516957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516151a460608401826001600160401b03169052565b5060808301516151bf60808401826001600160401b03169052565b5060a08301516151da60a08401826001600160401b03169052565b5060c08301516151f560c08401826001600160401b03169052565b5092915050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156151f5576151f56151fc565b5f60208284031215615240575f80fd5b5051919050565b5f5b83811015615261578181015183820152602001615249565b50505f910152565b602081525f8251806020840152615287816040850160208701615247565b601f01601f19169190910160400192915050565b5f826152b557634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612603575f80fd5b5f60208284031215615369575f80fd5b8135610cb181615345565b5f808335601e19843603018112615389575f80fd5b8301803591506001600160401b038211156153a2575f80fd5b6020019150600581901b360382131561259c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126153e1575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615421576154216153eb565b60405290565b604051601f8201601f191681016001600160401b038111828210171561544f5761544f6153eb565b604052919050565b5f6001600160401b0382111561546f5761546f6153eb565b50601f01601f191660200190565b5f6060823603121561548d575f80fd5b6154956153ff565b8235815260206154a6818501615020565b8183015260408401356001600160401b038111156154c2575f80fd5b840136601f8201126154d2575f80fd5b80356154e56154e082615457565b615427565b81815236848385010111156154f8575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f82516153e1818460208701615247565b80820180821115610c7e57610c7e6151fc565b5f63ffffffff808316818103615598576155986151fc565b6001019392505050565b8082028115828204841417610c7e57610c7e6151fc565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156151f5576151f56151fc565b81810381811115610c7e57610c7e6151fc565b600181811c9082168061565257607f821691505b60208210810361500957634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546156c98161563e565b806020870152604060018084165f81146156ea576001811461570657615733565b60ff19851660408a0152604084151560051b8a01019550615733565b895f5260205f205f5b8581101561572a5781548b820186015290830190880161570f565b8a016040019650505b509398975050505050505050565b80516120e381614f86565b5f806040838503121561575d575f80fd5b82516001600160401b0380821115615773575f80fd5b9084019060608287031215615786575f80fd5b61578e6153ff565b825181526020808401516157a181615345565b828201526040840151838111156157b6575f80fd5b80850194505087601f8501126157ca575f80fd5b835192506157da6154e084615457565b83815288828587010111156157ed575f80fd5b6157fc84838301848801615247565b80604084015250819550615811818801615741565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615951575f80fd5b8301803591506001600160401b0382111561596a575f80fd5b60200191503681900382131561259c575f80fd5b6001600160401b038181168382160280821691908281146159a1576159a16151fc565b505092915050565b5f6001600160401b03808316818103615598576155986151fc565b5f602082840312156159d4575f80fd5b610cb18261500f565b5f602082840312156159ed575f80fd5b813560ff81168114610cb1575f80fd5b601f8211156120b257805f5260205f20601f840160051c81016020851015615a225750805b601f840160051c820191505b81811015610d51575f8155600101615a2e565b81516001600160401b03811115615a5a57615a5a6153eb565b615a6e81615a68845461563e565b846159fd565b602080601f831160018114615aa1575f8415615a8a5750858301515b5f19600386901b1c1916600185901b178555612c9d565b5f85815260208120601f198616915b82811015615acf57888601518255948401946001909101908401615ab0565b5085821015615aec57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451615b5181604e860160208901615247565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // 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 c23b8d656..b42f9e6b2 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -73,7 +73,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"pChainBlockchainID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051613d19380380613d1983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b613bcc8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e3660046131ad565b61030c565b005b6101736101433660046131ad565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b6101336101943660046131dc565b6104ca565b6101336101a736600461321f565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004613255565b6105e6565b6101ef6101ea3660046131ad565b610b84565b6040516001600160401b03909116815260200161017d565b610133610b98565b610217603081565b60405160ff909116815260200161017d565b6101736102373660046132b5565b610bab565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e3660046131ad565b610bc7565b6101336102a13660046131dc565b610bdc565b6102686005600160991b0181565b6101336102c23660046131ad565b610d94565b610217601481565b6102e26102dd3660046131ad565b610ea3565b60405161017d919061330e565b6101ef6202a30081565b6101336103073660046133c4565b610f6b565b5f8181525f80516020613ba08339815191526020526040808220815160e0810190925280545f80516020613b8083398151915293929190829060ff166005811115610359576103596132fa565b600581111561036a5761036a6132fa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d96132fa565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f610fa8565b6040518263ffffffff1660e01b81526004016104849190613408565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c4919061343a565b50505050565b6104d3816111cd565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b6105978787611517565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f80516020613b808339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea919061343a565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d60608501604086016133c4565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd6060850185613451565b905090505f805b828163ffffffff161015610a88575f6108006060880188613451565b8363ffffffff1681811061081657610816613496565b905060200281019061082891906134aa565b6108319061355a565b80515f81815260098801602052604090205491925090156108645760405162461bcd60e51b815260040161043a906135f1565b5f6002895f01358560405160200161089392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526108ad91613639565b602060405180830381855afa1580156108c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108eb919061343a565b5f8381526009890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088c01909252909120815181549394509192909190829060ff19166001836005811115610977576109776132fa565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610a2a91168661365e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610a8190613671565b90506107e4565b50600583018190555f610a9a85611531565b90505f610aaa826040015161170b565b90505f610ab688611874565b905081600282604051610ac99190613639565b602060405180830381855afa158015610ae4573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b07919061343a565b14610b6b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610b8e82610ea3565b6080015192915050565b610ba0611d0d565b610ba95f611d68565b565b5f610bb4611d0d565b610bbe8383611dd8565b90505b92915050565b610bcf611d0d565b610bd88161233d565b5050565b5f80516020613b808339815191525f610bf483611531565b90505f80610c0583604001516125b8565b9150915080610c675760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610c8190613693565b9050118015610cb3575060015f83815260088601602052604090205460ff166005811115610cb157610cb16132fa565b145b610ccf5760405162461bcd60e51b815260040161043a906136c5565b5f8281526007850160205260408120610ce791613122565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f80516020613b80833981519152929190610ddc90613693565b9050118015610e0e575060015f83815260088301602052604090205460ff166005811115610e0c57610e0c6132fa565b145b610e2a5760405162461bcd60e51b815260040161043a906136c5565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e63919060040161370c565b6020604051808303815f875af1158015610e7f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d3919061343a565b610eab613159565b5f8281525f80516020613ba0833981519152602052604090819020815160e0810190925280545f80516020613b80833981519152929190829060ff166005811115610ef857610ef86132fa565b6005811115610f0957610f096132fa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610f73611d0d565b6001600160a01b038116610f9c57604051631e4fbdf760e01b81525f600482015260240161043a565b610fa581611d68565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561102157610fe1816001613796565b610fec9060086137a9565b5081515f9083908390811061100357611003613496565b60200101906001600160f81b03191690815f1a905350600101610fcd565b505f5b600481101561108c57611038816003613796565b6110439060086137a9565b600263ffffffff16901c60f81b8282600261105e919061365e565b8151811061106e5761106e613496565b60200101906001600160f81b03191690815f1a905350600101611024565b505f5b60208110156110ee576110a381601f613796565b6110ae9060086137a9565b86901c60f81b826110c083600661365e565b815181106110d0576110d0613496565b60200101906001600160f81b03191690815f1a90535060010161108f565b505f5b600881101561115957611105816007613796565b6111109060086137a9565b6001600160401b038616901c60f81b8261112b83602661365e565b8151811061113b5761113b613496565b60200101906001600160f81b03191690815f1a9053506001016110f1565b505f5b60088110156111c457611170816007613796565b61117b9060086137a9565b6001600160401b038516901c60f81b8261119683602e61365e565b815181106111a6576111a6613496565b60200101906001600160f81b03191690815f1a90535060010161115c565b50949350505050565b5f6111d6613159565b5f80516020613b808339815191525f6111ee85611531565b90505f806111ff83604001516125b8565b9150915080156112645760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff166005811115611295576112956132fa565b60058111156112a6576112a66132fa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115611317576113176132fa565b14806113355750600182516005811115611333576113336132fa565b145b6113945760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b6003825160058111156113a9576113a96132fa565b036113b6575060046113ba565b5060055b6020808301515f908152600988019091526040812055818160058111156113e3576113e36132fa565b908160058111156113f6576113f66132fa565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561142a5761142a6132fa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156114de576114de6132fa565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b61151f612759565b611528826127a2565b610bd8816127bb565b60408051606080820183525f8083526020830181905292820152905f80516020613b808339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115a6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115cd91908101906137cf565b915091508061162d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b82548251146116905760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b0316156117035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f815160261461172d5760405162461bcd60e51b815260040161043a906138a1565b5f805b600281101561177c57611744816001613796565b61174f9060086137a9565b61ffff1684828151811061176557611765613496565b016020015160f81c901b9190911790600101611730565b5061ffff81161561179f5760405162461bcd60e51b815260040161043a906138ea565b5f805b60048110156117fa576117b6816003613796565b6117c19060086137a9565b63ffffffff16856117d383600261365e565b815181106117e3576117e3613496565b016020015160f81c901b91909117906001016117a2565b5063ffffffff81161561181f5760405162461bcd60e51b815260040161043a9061392d565b5f805b60208110156111c45761183681601f613796565b6118419060086137a9565b8661184d83600661365e565b8151811061185d5761185d613496565b016020015160f81c901b9190911790600101611822565b60605f61188383830184613451565b61188f915060586137a9565b61189a90605c61365e565b6001600160401b038111156118b1576118b16134c8565b6040519080825280601f01601f1916602001820160405280156118db576020820181803683370190505b5090505f5b602081101561193057833581602081106118fc576118fc613496565b1a60f81b82828151811061191257611912613496565b60200101906001600160f81b03191690815f1a9053506001016118e0565b505f5b6020811015611990578360200135816020811061195257611952613496565b1a60f81b8261196283602061365e565b8151811061197257611972613496565b60200101906001600160f81b03191690815f1a905350600101611933565b505f5b60048110156119f3576119a7816003613796565b6119b29060086137a9565b6014901c60f81b826119c583604061365e565b815181106119d5576119d5613496565b60200101906001600160f81b03191690815f1a905350600101611993565b505f611a0560608501604086016133c4565b60601b90505f5b6014811015611a6557818160148110611a2757611a27613496565b1a60f81b83611a3783604461365e565b81518110611a4757611a47613496565b60200101906001600160f81b03191690815f1a905350600101611a0c565b505f611a746060860186613451565b905090505f5b6004811015611adf57611a8e816003613796565b611a999060086137a9565b63ffffffff8316901c60f81b84611ab183605861365e565b81518110611ac157611ac1613496565b60200101906001600160f81b03191690815f1a905350600101611a7a565b505f5b611aef6060870187613451565b9050811015611d03575f611b048260586137a9565b611b0f90605c61365e565b90505f5b6020811015611b9a57611b296060890189613451565b84818110611b3957611b39613496565b9050602002810190611b4b91906134aa565b358160208110611b5d57611b5d613496565b1a60f81b86611b6c838561365e565b81518110611b7c57611b7c613496565b60200101906001600160f81b03191690815f1a905350600101611b13565b505f5b6008811015611c4f57611bb1816007613796565b611bbc9060086137a9565b611bc960608a018a613451565b85818110611bd957611bd9613496565b9050602002810190611beb91906134aa565b611bfc906040810190602001613974565b6001600160401b0316901c60f81b8682611c1785602061365e565b611c21919061365e565b81518110611c3157611c31613496565b60200101906001600160f81b03191690815f1a905350600101611b9d565b505f5b6030811015611cf957611c686060890189613451565b84818110611c7857611c78613496565b9050602002810190611c8a91906134aa565b611c9890604081019061398d565b82818110611ca857611ca8613496565b9050013560f81c60f81b8682846028611cc1919061365e565b611ccb919061365e565b81518110611cdb57611cdb613496565b60200101906001600160f81b03191690815f1a905350600101611c52565b5050600101611ae2565b5091949350505050565b33611d3f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610ba95760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611e635760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f80516020613b8083398151915242611e826040860160208701613974565b6001600160401b031611611ef45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611f046040850160208601613974565b6001600160401b0316611f1a6202a3004261365e565b11611f8d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611fe55760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043a565b83355f908152600982016020526040902054156120145760405162461bcd60e51b815260040161043a906135f1565b6030612023604086018661398d565b9050146120885760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043a565b612092835f6127cc565b5f8061212c6040518060a0016040528085600101548152602001885f01358152602001876001600160401b031681526020018860200160208101906120d79190613974565b6001600160401b031681526020016120f260408a018a61398d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506129da565b5f8281526007860160205260409020919350915061214a8282613a1a565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90612177908590600401613408565b6020604051808303815f875af1158015612193573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121b7919061343a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561222f5761222f6132fa565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161230f918e01908e01613974565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b612345613159565b5f8281525f80516020613ba08339815191526020526040808220815160e0810190925280545f80516020613b8083398151915293929190829060ff166005811115612392576123926132fa565b60058111156123a3576123a36132fa565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612415576124156132fa565b146124715760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156124b5576124b56132fa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6125618582612d89565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146125db5760405162461bcd60e51b815260040161043a906138a1565b5f805b600281101561262a576125f2816001613796565b6125fd9060086137a9565b61ffff1685828151811061261357612613613496565b016020015160f81c901b91909117906001016125de565b5061ffff81161561264d5760405162461bcd60e51b815260040161043a906138ea565b5f805b60048110156126a857612664816003613796565b61266f9060086137a9565b63ffffffff168661268183600261365e565b8151811061269157612691613496565b016020015160f81c901b9190911790600101612650565b5063ffffffff81166003146126cf5760405162461bcd60e51b815260040161043a9061392d565b5f805b6020811015612724576126e681601f613796565b6126f19060086137a9565b876126fd83600661365e565b8151811061270d5761270d613496565b016020015160f81c901b91909117906001016126d2565b505f8660268151811061273957612739613496565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610ba957604051631afcd79f60e31b815260040160405180910390fd5b6127aa612759565b6127b2612ee0565b610fa581612ee8565b6127c3612759565b610fa58161308a565b5f80516020613b808339815191525f6001600160401b038084169085161115612800576127f98385613ad9565b905061280d565b61280a8484613ad9565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b031660608201524291158061286f57506002840154815161286b916001600160401b03169061365e565b8210155b15612895576001600160401b0383166060820152818152604081015160208201526128b4565b82816060018181516128a79190613af9565b6001600160401b03169052505b60608101516128c4906064613b19565b602082015160028601546001600160401b0392909216916128ef9190600160401b900460ff166137a9565b10156129535760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b856001600160401b03168160400181815161296e919061365e565b9052506040810180516001600160401b038716919061298e908390613796565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f6060826080015151603014612a445760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612abb57612a7b816001613796565b612a869060086137a9565b5081515f90839083908110612a9d57612a9d613496565b60200101906001600160f81b03191690815f1a905350600101612a67565b505f5b6004811015612b2357612ad2816003613796565b612add9060086137a9565b600160ff919091161c60f81b82612af583600261365e565b81518110612b0557612b05613496565b60200101906001600160f81b03191690815f1a905350600101612abe565b505f5b6020811015612b805784518160208110612b4257612b42613496565b1a60f81b82612b5283600661365e565b81518110612b6257612b62613496565b60200101906001600160f81b03191690815f1a905350600101612b26565b505f5b6020811015612be05784602001518160208110612ba257612ba2613496565b1a60f81b82612bb283602661365e565b81518110612bc257612bc2613496565b60200101906001600160f81b03191690815f1a905350600101612b83565b505f5b6008811015612c5457612bf7816007613796565b612c029060086137a9565b60ff1685604001516001600160401b0316901c60f81b82826046612c26919061365e565b81518110612c3657612c36613496565b60200101906001600160f81b03191690815f1a905350600101612be3565b505f5b6030811015612cbf5784608001518181518110612c7657612c76613496565b01602001516001600160f81b03191682612c9183604e61365e565b81518110612ca157612ca1613496565b60200101906001600160f81b03191690815f1a905350600101612c57565b505f5b6008811015612d3157612cd6816007613796565b612ce19060086137a9565b60608601516001600160401b0390811691161c60f81b82612d0383607e61365e565b81518110612d1357612d13613496565b60200101906001600160f81b03191690815f1a905350600101612cc2565b50600281604051612d429190613639565b602060405180830381855afa158015612d5d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612d80919061343a565b94909350915050565b5f8281525f80516020613ba0833981519152602052604081206002015481905f80516020613b8083398151915290600160801b90046001600160401b0316612dd185826127cc565b5f612ddb87613092565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb612e2b8a858b610fa8565b6040518263ffffffff1660e01b8152600401612e479190613408565b6020604051808303815f875af1158015612e63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612e87919061343a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b610ba9612759565b612ef0612759565b80355f80516020613b8083398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014612f3c6080840160608501613b44565b60ff161115612fa95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f612fba6080840160608501613b44565b60ff16116130225760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b6130326080830160608401613b44565b60028201805460ff92909216600160401b0260ff60401b199092169190911790556130636060830160408401613974565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610f73612759565b5f8181525f80516020613ba08339815191526020526040812060020180545f80516020613b8083398151915291600160401b9091046001600160401b03169060086130dc83613b64565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b50805461312e90613693565b5f825580601f1061313d575050565b601f0160209004905f5260205f2090810190610fa59190613195565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156131a9575f8155600101613196565b5090565b5f602082840312156131bd575f80fd5b5035919050565b803563ffffffff811681146131d7575f80fd5b919050565b5f602082840312156131ec575f80fd5b610bbe826131c4565b5f60808284031215613205575f80fd5b50919050565b6001600160a01b0381168114610fa5575f80fd5b5f8060a08385031215613230575f80fd5b61323a84846131f5565b9150608083013561324a8161320b565b809150509250929050565b5f8060408385031215613266575f80fd5b82356001600160401b0381111561327b575f80fd5b613287858286016131f5565b925050613296602084016131c4565b90509250929050565b80356001600160401b03811681146131d7575f80fd5b5f80604083850312156132c6575f80fd5b82356001600160401b038111156132db575f80fd5b8301606081860312156132ec575f80fd5b91506132966020840161329f565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061333157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161336c60608401826001600160401b03169052565b50608083015161338760808401826001600160401b03169052565b5060a08301516133a260a08401826001600160401b03169052565b5060c08301516133bd60c08401826001600160401b03169052565b5092915050565b5f602082840312156133d4575f80fd5b81356133df8161320b565b9392505050565b5f5b838110156134005781810151838201526020016133e8565b50505f910152565b602081525f82518060208401526134268160408501602087016133e6565b601f01601f19169190910160400192915050565b5f6020828403121561344a575f80fd5b5051919050565b5f808335601e19843603018112613466575f80fd5b8301803591506001600160401b0382111561347f575f80fd5b6020019150600581901b3603821315612ed9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126134be575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156134fe576134fe6134c8565b60405290565b604051601f8201601f191681016001600160401b038111828210171561352c5761352c6134c8565b604052919050565b5f6001600160401b0382111561354c5761354c6134c8565b50601f01601f191660200190565b5f6060823603121561356a575f80fd5b6135726134dc565b82358152602061358381850161329f565b8183015260408401356001600160401b0381111561359f575f80fd5b840136601f8201126135af575f80fd5b80356135c26135bd82613534565b613504565b81815236848385010111156135d5575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f82516134be8184602087016133e6565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610bc157610bc161364a565b5f63ffffffff8083168181036136895761368961364a565b6001019392505050565b600181811c908216806136a757607f821691505b60208210810361320557634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f845461371e81613693565b806020870152604060018084165f811461373f576001811461375b57613788565b60ff19851660408a0152604084151560051b8a01019550613788565b895f5260205f205f5b8581101561377f5781548b8201860152908301908801613764565b8a016040019650505b509398975050505050505050565b81810381811115610bc157610bc161364a565b8082028115828204841417610bc157610bc161364a565b805180151581146131d7575f80fd5b5f80604083850312156137e0575f80fd5b82516001600160401b03808211156137f6575f80fd5b9084019060608287031215613809575f80fd5b6138116134dc565b825181526020808401516138248161320b565b82820152604084015183811115613839575f80fd5b80850194505087601f85011261384d575f80fd5b8351925061385d6135bd84613534565b8381528882858701011115613870575f80fd5b61387f848383018488016133e6565b806040840152508195506138948188016137c0565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f60208284031215613984575f80fd5b610bbe8261329f565b5f808335601e198436030181126139a2575f80fd5b8301803591506001600160401b038211156139bb575f80fd5b602001915036819003821315612ed9575f80fd5b601f8211156104d357805f5260205f20601f840160051c810160208510156139f45750805b601f840160051c820191505b81811015613a13575f8155600101613a00565b5050505050565b81516001600160401b03811115613a3357613a336134c8565b613a4781613a418454613693565b846139cf565b602080601f831160018114613a7a575f8415613a635750858301515b5f19600386901b1c1916600185901b178555613ad1565b5f85815260208120601f198616915b82811015613aa857888601518255948401946001909101908401613a89565b5085821015613ac557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b038281168282160390808211156133bd576133bd61364a565b6001600160401b038181168382160190808211156133bd576133bd61364a565b6001600160401b03818116838216028082169190828114613b3c57613b3c61364a565b505092915050565b5f60208284031215613b54575f80fd5b813560ff811681146133df575f80fd5b5f6001600160401b038083168181036136895761368961364a56fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161391738038061391783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6137ca8061014d5f395ff3fe608060405234801561000f575f80fd5b506004361061011c575f3560e01c80638994ab49116100a9578063bee0a03f1161006e578063bee0a03f146102b4578063c974d1b6146102c7578063d5f20ff6146102cf578063df93d8de146102ef578063f2fde38b146102f9575f80fd5b80638994ab49146102295780638da5cb5b1461023c57806397fb70d414610280578063a3a65e4814610293578063b771b3bc146102a6575f80fd5b806360305d62116100ef57806360305d62146101ac57806361e2f490146101c957806366435abf146101dc578063715018a6146102075780638280a25a1461020f575f80fd5b80630322ed98146101205780630cdd098514610135578063467ef06f14610186578063580a400614610199575b5f80fd5b61013361012e366004612d35565b61030c565b005b610173610143366004612d35565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09602052604090205490565b6040519081526020015b60405180910390f35b610133610194366004612d64565b6104ca565b6101336101a7366004612da7565b6104d8565b6101b4601481565b60405163ffffffff909116815260200161017d565b6101336101d7366004612ddd565b6105e6565b6101ef6101ea366004612d35565b610b84565b6040516001600160401b03909116815260200161017d565b610133610b98565b610217603081565b60405160ff909116815260200161017d565b610173610237366004612e3d565b610bab565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161017d565b61013361028e366004612d35565b610bc7565b6101336102a1366004612d64565b610bdc565b6102686005600160991b0181565b6101336102c2366004612d35565b610d94565b610217601481565b6102e26102dd366004612d35565b610ea3565b60405161017d9190612e96565b6101ef6202a30081565b610133610307366004612f4c565b610f6b565b5f8181525f8051602061379e8339815191526020526040808220815160e0810190925280545f8051602061377e83398151915293929190829060ff16600581111561035957610359612e82565b600581111561036a5761036a612e82565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103d9576103d9612e82565b146104435760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104688584606001515f610fa8565b6040518263ffffffff1660e01b81526004016104849190612f90565b6020604051808303815f875af11580156104a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c49190612fc2565b50505050565b6104d381610ff7565b505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f8115801561051c5750825b90505f826001600160401b031660011480156105375750303b155b905081158015610545575080155b156105635760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561058d57845460ff60401b1916600160401b1785555b6105978787611341565b83156105dd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f8051602061377e8339815191529060ff16156106835760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161043a565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106ea9190612fc2565b83602001351461074c5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161043a565b3061075d6060850160408601612f4c565b6001600160a01b0316146107cf5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161043a565b5f6107dd6060850185612fd9565b905090505f805b828163ffffffff161015610a88575f6108006060880188612fd9565b8363ffffffff168181106108165761081661301e565b90506020028101906108289190613032565b610831906130e2565b80515f81815260098801602052604090205491925090156108645760405162461bcd60e51b815260040161043a90613179565b5f6002895f01358560405160200161089392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526108ad916131c1565b602060405180830381855afa1580156108c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108eb9190612fc2565b5f8381526009890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260088c01909252909120815181549394509192909190829060ff1916600183600581111561097757610977612e82565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610a2a9116866131e6565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610a81906131f9565b90506107e4565b50600583018190555f610a9a8561135b565b90505f610aaa8260400151611535565b90505f610ab6886116a7565b905081600282604051610ac991906131c1565b602060405180830381855afa158015610ae4573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b079190612fc2565b14610b6b5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161043a565b505050600a909201805460ff1916600117905550505050565b5f610b8e82610ea3565b6080015192915050565b610ba0611b40565b610ba95f611b9b565b565b5f610bb4611b40565b610bbe8383611c0b565b90505b92915050565b610bcf611b40565b610bd881612170565b5050565b5f8051602061377e8339815191525f610bf48361135b565b90505f80610c0583604001516123eb565b9150915080610c675760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161043a565b5f82815260078501602052604081208054610c819061321b565b9050118015610cb3575060015f83815260088601602052604090205460ff166005811115610cb157610cb1612e82565b145b610ccf5760405162461bcd60e51b815260040161043a9061324d565b5f8281526007850160205260408120610ce791612caa565b5f8281526008850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260098b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb076020526040812080545f8051602061377e833981519152929190610ddc9061321b565b9050118015610e0e575060015f83815260088301602052604090205460ff166005811115610e0c57610e0c612e82565b145b610e2a5760405162461bcd60e51b815260040161043a9061324d565b5f82815260078201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610e639190600401613294565b6020604051808303815f875af1158015610e7f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d39190612fc2565b610eab612ce1565b5f8281525f8051602061379e833981519152602052604090819020815160e0810190925280545f8051602061377e833981519152929190829060ff166005811115610ef857610ef8612e82565b6005811115610f0957610f09612e82565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610f73611b40565b6001600160a01b038116610f9c57604051631e4fbdf760e01b81525f600482015260240161043a565b610fa581611b9b565b50565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f611000612ce1565b5f8051602061377e8339815191525f6110188561135b565b90505f8061102983604001516123eb565b91509150801561108e5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161043a565b5f828152600885016020526040808220815160e081019092528054829060ff1660058111156110bf576110bf612e82565b60058111156110d0576110d0612e82565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561114157611141612e82565b148061115f575060018251600581111561115d5761115d612e82565b145b6111be5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161043a565b6003825160058111156111d3576111d3612e82565b036111e0575060046111e4565b5060055b6020808301515f9081526009880190915260408120558181600581111561120d5761120d612e82565b9081600581111561122057611220612e82565b9052505f84815260088701602052604090208251815484929190829060ff1916600183600581111561125457611254612e82565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561130857611308612e82565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b61134961258c565b611352826125d5565b610bd8816125ee565b60408051606080820183525f8083526020830181905292820152905f8051602061377e8339815191526040516306f8253560e41b815263ffffffff851660048201529091505f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156113d0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526113f7919081019061332d565b91509150806114575760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161043a565b82548251146114ba5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161043a565b60208201516001600160a01b03161561152d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161043a565b509392505050565b5f81516026146115575760405162461bcd60e51b815260040161043a906133ff565b5f805b60028110156115a65761156e816001613448565b61157990600861345b565b61ffff1684828151811061158f5761158f61301e565b016020015160f81c901b919091179060010161155a565b5061ffff8116156115c95760405162461bcd60e51b815260040161043a90613472565b5f805b6004811015611624576115e0816003613448565b6115eb90600861345b565b63ffffffff16856115fd8360026131e6565b8151811061160d5761160d61301e565b016020015160f81c901b91909117906001016115cc565b5063ffffffff8116156116495760405162461bcd60e51b815260040161043a906134b5565b5f805b602081101561169e5761166081601f613448565b61166b90600861345b565b866116778360066131e6565b815181106116875761168761301e565b016020015160f81c901b919091179060010161164c565b50949350505050565b60605f6116b683830184612fd9565b6116c29150605861345b565b6116cd90605c6131e6565b6001600160401b038111156116e4576116e4613050565b6040519080825280601f01601f19166020018201604052801561170e576020820181803683370190505b5090505f5b6020811015611763578335816020811061172f5761172f61301e565b1a60f81b8282815181106117455761174561301e565b60200101906001600160f81b03191690815f1a905350600101611713565b505f5b60208110156117c357836020013581602081106117855761178561301e565b1a60f81b826117958360206131e6565b815181106117a5576117a561301e565b60200101906001600160f81b03191690815f1a905350600101611766565b505f5b6004811015611826576117da816003613448565b6117e590600861345b565b6014901c60f81b826117f88360406131e6565b815181106118085761180861301e565b60200101906001600160f81b03191690815f1a9053506001016117c6565b505f6118386060850160408601612f4c565b60601b90505f5b60148110156118985781816014811061185a5761185a61301e565b1a60f81b8361186a8360446131e6565b8151811061187a5761187a61301e565b60200101906001600160f81b03191690815f1a90535060010161183f565b505f6118a76060860186612fd9565b905090505f5b6004811015611912576118c1816003613448565b6118cc90600861345b565b63ffffffff8316901c60f81b846118e48360586131e6565b815181106118f4576118f461301e565b60200101906001600160f81b03191690815f1a9053506001016118ad565b505f5b6119226060870187612fd9565b9050811015611b36575f61193782605861345b565b61194290605c6131e6565b90505f5b60208110156119cd5761195c6060890189612fd9565b8481811061196c5761196c61301e565b905060200281019061197e9190613032565b3581602081106119905761199061301e565b1a60f81b8661199f83856131e6565b815181106119af576119af61301e565b60200101906001600160f81b03191690815f1a905350600101611946565b505f5b6008811015611a82576119e4816007613448565b6119ef90600861345b565b6119fc60608a018a612fd9565b85818110611a0c57611a0c61301e565b9050602002810190611a1e9190613032565b611a2f9060408101906020016134fc565b6001600160401b0316901c60f81b8682611a4a8560206131e6565b611a5491906131e6565b81518110611a6457611a6461301e565b60200101906001600160f81b03191690815f1a9053506001016119d0565b505f5b6030811015611b2c57611a9b6060890189612fd9565b84818110611aab57611aab61301e565b9050602002810190611abd9190613032565b611acb906040810190613515565b82818110611adb57611adb61301e565b9050013560f81c60f81b8682846028611af491906131e6565b611afe91906131e6565b81518110611b0e57611b0e61301e565b60200101906001600160f81b03191690815f1a905350600101611a85565b5050600101611915565b5091949350505050565b33611b727f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610ba95760405163118cdaa760e01b815233600482015260240161043a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0a545f9060ff16611c965760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161043a565b5f8051602061377e83398151915242611cb560408601602087016134fc565b6001600160401b031611611d275760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161043a565b611d3760408501602086016134fc565b6001600160401b0316611d4d6202a300426131e6565b11611dc05760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161043a565b8335611e185760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161043a565b83355f90815260098201602052604090205415611e475760405162461bcd60e51b815260040161043a90613179565b6030611e566040860186613515565b905014611ebb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161043a565b611ec5835f6125ff565b5f80611f5f6040518060a0016040528085600101548152602001885f01358152602001876001600160401b03168152602001886020016020810190611f0a91906134fc565b6001600160401b03168152602001611f2560408a018a613515565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061280d565b5f82815260078601602052604090209193509150611f7d82826135a2565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611faa908590600401612f90565b6020604051808303815f875af1158015611fc6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fea9190612fc2565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600888019091522081518154829060ff1916600183600581111561206257612062612e82565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91612142918e01908e016134fc565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b612178612ce1565b5f8281525f8051602061379e8339815191526020526040808220815160e0810190925280545f8051602061377e83398151915293929190829060ff1660058111156121c5576121c5612e82565b60058111156121d6576121d6612e82565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561224857612248612e82565b146122a45760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161043a565b60038152426001600160401b031660c08201525f84815260088301602052604090208151815483929190829060ff191660018360058111156122e8576122e8612e82565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6123948582612911565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461240e5760405162461bcd60e51b815260040161043a906133ff565b5f805b600281101561245d57612425816001613448565b61243090600861345b565b61ffff168582815181106124465761244661301e565b016020015160f81c901b9190911790600101612411565b5061ffff8116156124805760405162461bcd60e51b815260040161043a90613472565b5f805b60048110156124db57612497816003613448565b6124a290600861345b565b63ffffffff16866124b48360026131e6565b815181106124c4576124c461301e565b016020015160f81c901b9190911790600101612483565b5063ffffffff81166003146125025760405162461bcd60e51b815260040161043a906134b5565b5f805b60208110156125575761251981601f613448565b61252490600861345b565b876125308360066131e6565b815181106125405761254061301e565b016020015160f81c901b9190911790600101612505565b505f8660268151811061256c5761256c61301e565b016020015191976001600160f81b03199092161515965090945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610ba957604051631afcd79f60e31b815260040160405180910390fd5b6125dd61258c565b6125e5612a68565b610fa581612a70565b6125f661258c565b610fa581612c12565b5f8051602061377e8339815191525f6001600160401b0380841690851611156126335761262c8385613661565b9050612640565b61263d8484613661565b90505b6040805160808101825260038401548082526004850154602083015260058501549282019290925260068401546001600160401b03166060820152429115806126a257506002840154815161269e916001600160401b0316906131e6565b8210155b156126c8576001600160401b0383166060820152818152604081015160208201526126e7565b82816060018181516126da9190613681565b6001600160401b03169052505b60608101516126f79060646136a1565b602082015160028601546001600160401b0392909216916127229190600160401b900460ff1661345b565b10156127865760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161043a565b856001600160401b0316816040018181516127a191906131e6565b9052506040810180516001600160401b03871691906127c1908390613448565b905250805160038501556020810151600485015560408101516005850155606001516006909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146128775760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161043a565b5f806001855f015186602001518760400151886080015189606001516040516020016128a997969594939291906136cc565b60405160208183030381529060405290506002816040516128ca91906131c1565b602060405180830381855afa1580156128e5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129089190612fc2565b94909350915050565b5f8281525f8051602061379e833981519152602052604081206002015481905f8051602061377e83398151915290600160801b90046001600160401b031661295985826125ff565b5f61296387612c1a565b5f8881526008850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129b38a858b610fa8565b6040518263ffffffff1660e01b81526004016129cf9190612f90565b6020604051808303815f875af11580156129eb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0f9190612fc2565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b610ba961258c565b612a7861258c565b80355f8051602061377e83398151915290815560208201357fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb01556014612ac46080840160608501613742565b60ff161115612b315760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161043a565b5f612b426080840160608501613742565b60ff1611612baa5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161043a565b612bba6080830160608401613742565b60028201805460ff92909216600160401b0260ff60401b19909216919091179055612beb60608301604084016134fc565b600291909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610f7361258c565b5f8181525f8051602061379e8339815191526020526040812060020180545f8051602061377e83398151915291600160401b9091046001600160401b0316906008612c6483613762565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260089290920160205250604090922060020154600160401b9004909116919050565b508054612cb69061321b565b5f825580601f10612cc5575050565b601f0160209004905f5260205f2090810190610fa59190612d1d565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612d31575f8155600101612d1e565b5090565b5f60208284031215612d45575f80fd5b5035919050565b803563ffffffff81168114612d5f575f80fd5b919050565b5f60208284031215612d74575f80fd5b610bbe82612d4c565b5f60808284031215612d8d575f80fd5b50919050565b6001600160a01b0381168114610fa5575f80fd5b5f8060a08385031215612db8575f80fd5b612dc28484612d7d565b91506080830135612dd281612d93565b809150509250929050565b5f8060408385031215612dee575f80fd5b82356001600160401b03811115612e03575f80fd5b612e0f85828601612d7d565b925050612e1e60208401612d4c565b90509250929050565b80356001600160401b0381168114612d5f575f80fd5b5f8060408385031215612e4e575f80fd5b82356001600160401b03811115612e63575f80fd5b830160608186031215612e74575f80fd5b9150612e1e60208401612e27565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612eb957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612ef460608401826001600160401b03169052565b506080830151612f0f60808401826001600160401b03169052565b5060a0830151612f2a60a08401826001600160401b03169052565b5060c0830151612f4560c08401826001600160401b03169052565b5092915050565b5f60208284031215612f5c575f80fd5b8135612f6781612d93565b9392505050565b5f5b83811015612f88578181015183820152602001612f70565b50505f910152565b602081525f8251806020840152612fae816040850160208701612f6e565b601f01601f19169190910160400192915050565b5f60208284031215612fd2575f80fd5b5051919050565b5f808335601e19843603018112612fee575f80fd5b8301803591506001600160401b03821115613007575f80fd5b6020019150600581901b3603821315612a61575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112613046575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561308657613086613050565b60405290565b604051601f8201601f191681016001600160401b03811182821017156130b4576130b4613050565b604052919050565b5f6001600160401b038211156130d4576130d4613050565b50601f01601f191660200190565b5f606082360312156130f2575f80fd5b6130fa613064565b82358152602061310b818501612e27565b8183015260408401356001600160401b03811115613127575f80fd5b840136601f820112613137575f80fd5b803561314a613145826130bc565b61308c565b818152368483850101111561315d575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8251613046818460208701612f6e565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610bc157610bc16131d2565b5f63ffffffff808316818103613211576132116131d2565b6001019392505050565b600181811c9082168061322f57607f821691505b602082108103612d8d57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f84546132a68161321b565b806020870152604060018084165f81146132c757600181146132e357613310565b60ff19851660408a0152604084151560051b8a01019550613310565b895f5260205f205f5b858110156133075781548b82018601529083019088016132ec565b8a016040019650505b509398975050505050505050565b80518015158114612d5f575f80fd5b5f806040838503121561333e575f80fd5b82516001600160401b0380821115613354575f80fd5b9084019060608287031215613367575f80fd5b61336f613064565b8251815260208084015161338281612d93565b82820152604084015183811115613397575f80fd5b80850194505087601f8501126133ab575f80fd5b835192506133bb613145846130bc565b83815288828587010111156133ce575f80fd5b6133dd84838301848801612f6e565b806040840152508195506133f281880161331e565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b81810381811115610bc157610bc16131d2565b8082028115828204841417610bc157610bc16131d2565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561350c575f80fd5b610bbe82612e27565b5f808335601e1984360301811261352a575f80fd5b8301803591506001600160401b03821115613543575f80fd5b602001915036819003821315612a61575f80fd5b601f8211156104d357805f5260205f20601f840160051c8101602085101561357c5750805b601f840160051c820191505b8181101561359b575f8155600101613588565b5050505050565b81516001600160401b038111156135bb576135bb613050565b6135cf816135c9845461321b565b84613557565b602080601f831160018114613602575f84156135eb5750858301515b5f19600386901b1c1916600185901b178555613659565b5f85815260208120601f198616915b8281101561363057888601518255948401946001909101908401613611565b508582101561364d57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b03828116828216039080821115612f4557612f456131d2565b6001600160401b03818116838216019080821115612f4557612f456131d2565b6001600160401b038181168382160280821691908281146136c4576136c46131d2565b505092915050565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161372181604e860160208901612f6e565b60c09490941b1691909201604e810191909152605601979650505050505050565b5f60208284031215613752575f80fd5b813560ff81168114612f67575f80fd5b5f6001600160401b03808316818103613211576132116131d256fee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index e14ca7bfc..fa2d6859a 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -67,21 +67,7 @@ library ValidatorMessages { pure returns (bytes memory) { - bytes memory res = new bytes(38); - // Pack the codec ID - for (uint256 i; i < 2; ++i) { - res[i] = bytes1(uint8(CODEC_ID >> uint8((8 * (1 - i))))); - } - // Pack the type ID - for (uint256 i; i < 4; ++i) { - res[i + 2] = bytes1(uint8(SUBNET_CONVERSION_MESSAGE_TYPE_ID >> uint8((8 * (3 - i))))); - } - // Pack the subnetConversionID - for (uint256 i; i < 32; ++i) { - res[i + 6] = bytes1(uint8(uint256(subnetConversionID >> (8 * (31 - i))))); - } - - return res; + return abi.encodePacked(CODEC_ID, SUBNET_CONVERSION_MESSAGE_TYPE_ID, subnetConversionID); } /** @@ -230,38 +216,17 @@ library ValidatorMessages { require( validationPeriod.blsPublicKey.length == 48, "StakingMessages: invalid signature length" ); - bytes memory res = new bytes(134); - // Pack the codec ID - for (uint256 i; i < 2; ++i) { - res[i] = bytes1(uint8(CODEC_ID >> uint8((8 * (1 - i))))); - } - // Pack the type ID - for (uint256 i; i < 4; ++i) { - res[i + 2] = - bytes1(uint8(REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID >> uint8((8 * (3 - i))))); - } - // Pack the subnetID - for (uint256 i; i < 32; ++i) { - res[i + 6] = validationPeriod.subnetID[i]; - } - // Pack the nodeID - for (uint256 i; i < 32; ++i) { - res[i + 38] = validationPeriod.nodeID[i]; - } - // Pack the weight - for (uint256 i; i < 8; ++i) { - res[i + 70] = bytes1(uint8(validationPeriod.weight >> uint8((8 * (7 - i))))); - } - // Pack the blsPublicKey - for (uint256 i; i < 48; ++i) { - res[i + 78] = validationPeriod.blsPublicKey[i]; - } - // Pack the registration expiry - for (uint256 i; i < 8; ++i) { - res[i + 126] = - bytes1(uint8(validationPeriod.registrationExpiry >> uint64((8 * (7 - i))))); - } + // solhint-disable-next-line func-named-parameters + bytes memory res = abi.encodePacked( + CODEC_ID, + REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID, + validationPeriod.subnetID, + validationPeriod.nodeID, + validationPeriod.weight, + validationPeriod.blsPublicKey, + validationPeriod.registrationExpiry + ); return (sha256(res), res); } @@ -359,23 +324,9 @@ library ValidatorMessages { bytes32 validationID, bool valid ) internal pure returns (bytes memory) { - bytes memory res = new bytes(39); - // Pack the codec ID. - for (uint256 i; i < 2; ++i) { - res[i] = bytes1(uint8(CODEC_ID >> (8 * (1 - i)))); - } - // Pack the type ID. - for (uint256 i; i < 4; ++i) { - res[i + 2] = - bytes1(uint8(SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID >> (8 * (3 - i)))); - } - // Pack the validation ID. - for (uint256 i; i < 32; ++i) { - res[i + 6] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); - } - // Pack the validity. - res[38] = bytes1(valid ? 1 : 0); - return res; + return abi.encodePacked( + CODEC_ID, SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID, validationID, valid + ); } /** @@ -448,28 +399,9 @@ library ValidatorMessages { uint64 nonce, uint64 weight ) internal pure returns (bytes memory) { - bytes memory res = new bytes(54); - // Pack the codec ID. - for (uint256 i; i < 2; ++i) { - res[i] = bytes1(uint8(CODEC_ID >> (8 * (1 - i)))); - } - // Pack the type ID. - for (uint256 i; i < 4; ++i) { - res[i + 2] = bytes1(uint8(SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID >> (8 * (3 - i)))); - } - // Pack the validation ID. - for (uint256 i; i < 32; ++i) { - res[i + 6] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); - } - // Pack the nonce. - for (uint256 i; i < 8; ++i) { - res[i + 38] = bytes1(uint8(nonce >> (8 * (7 - i)))); - } - // Pack the weight. - for (uint256 i; i < 8; ++i) { - res[i + 46] = bytes1(uint8(weight >> (8 * (7 - i)))); - } - return res; + return abi.encodePacked( + CODEC_ID, SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID, validationID, nonce, weight + ); } /** @@ -546,29 +478,9 @@ library ValidatorMessages { uint64 nonce, uint64 weight ) internal pure returns (bytes memory) { - bytes memory res = new bytes(54); - // Pack the codec ID. - for (uint256 i; i < 2; ++i) { - res[i] = bytes1(uint8(CODEC_ID >> (8 * (1 - i)))); - } - // Pack the type ID. - for (uint256 i; i < 4; ++i) { - res[i + 2] = - bytes1(uint8(SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID >> (8 * (3 - i)))); - } - // Pack the validation ID. - for (uint256 i; i < 32; ++i) { - res[i + 6] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); - } - // Pack the nonce. - for (uint256 i; i < 8; ++i) { - res[i + 38] = bytes1(uint8(nonce >> (8 * (7 - i)))); - } - // Pack the weight. - for (uint256 i; i < 8; ++i) { - res[i + 46] = bytes1(uint8(weight >> (8 * (7 - i)))); - } - return res; + return abi.encodePacked( + CODEC_ID, SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID, validationID, nonce, weight + ); } /** @@ -646,25 +558,7 @@ library ValidatorMessages { bytes32 validationID, uint64 uptime ) internal pure returns (bytes memory) { - bytes memory res = new bytes(46); - - // Pack the codec ID. - for (uint256 i; i < 2; ++i) { - res[i] = bytes1(uint8(CODEC_ID >> (8 * (1 - i)))); - } - // Pack the type ID. - for (uint256 i; i < 4; ++i) { - res[i + 2] = bytes1(uint8(VALIDATION_UPTIME_MESSAGE_TYPE_ID >> (8 * (3 - i)))); - } - // Pack the validation ID. - for (uint256 i; i < 32; ++i) { - res[i + 6] = bytes1(uint8(uint256(validationID >> (8 * (31 - i))))); - } - // Pack the uptime. - for (uint256 i; i < 8; ++i) { - res[i + 38] = bytes1(uint8(uptime >> (8 * (7 - i)))); - } - return res; + return abi.encodePacked(CODEC_ID, VALIDATION_UPTIME_MESSAGE_TYPE_ID, validationID, uptime); } /** From 1aa83fea47639d1f3ccae2f9da02117a936f1a40 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 15:24:26 -0400 Subject: [PATCH 374/545] Small fixes --- .../ERC20TokenStakingManager.go | 66 +++++++++---------- .../NativeTokenStakingManager.go | 66 +++++++++---------- .../PoAValidatorManager.go | 66 +++++++++---------- .../validator-manager/PoSValidatorManager.sol | 31 ++++----- .../validator-manager/ValidatorManager.sol | 40 +++++------ .../interfaces/IPoSValidatorManager.sol | 2 +- 6 files changed, 134 insertions(+), 137 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 096976097..ee7a070fb 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -82,8 +82,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160d83803806160d883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f8b8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c806376f78621116100f3578063ba3a4b9711610093578063d5f20ff61161006e578063d5f20ff6146103bd578063df93d8de146103dd578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063ba3a4b971461038f578063bee0a03f146103a2578063c974d1b6146103b5575f80fd5b806398f3e2b4116100ce57806398f3e2b4146103305780639e1bc4ef14610343578063a3a65e4814610356578063b771b3bc14610369575f80fd5b806376f78621146103025780638280a25a1461031557806393e245981461031d575f80fd5b8063467ef06f1161015e57806361e2f4901161013957806361e2f490146102c257806362065856146102d557806366435abf146102e8578063732214f8146102fb575f80fd5b8063467ef06f1461027f5780635297fae61461029257806360305d62146102a5575f80fd5b80630118acc4146101a55780630322ed98146101ba5780630cdd0985146101cd578063151d30d11461021e5780632e2194d81461023857806335455ded14610263575b5f80fd5b6101b86101b33660046152a3565b61040d565b005b6101b86101c83660046152de565b6108b1565b61020b6101db3660046152de565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610226600a81565b60405160ff9091168152602001610215565b61024b6102463660046152de565b610a6a565b6040516001600160401b039091168152602001610215565b61026c61271081565b60405161ffff9091168152602001610215565b6101b861028d3660046152f5565b610a80565b6101b86102a036600461530e565b610b20565b6102ad601481565b60405163ffffffff9091168152602001610215565b6101b86102d0366004615336565b610cf5565b61020b6102e336600461539a565b611329565b61024b6102f63660046152de565b611342565b61020b5f81565b6101b86103103660046152a3565b611356565b610226603081565b6101b861032b3660046152de565b611599565b6101b861033e36600461530e565b61169f565b61020b6103513660046153b3565b6119c3565b6101b86103643660046152f5565b6119ef565b6103776005600160991b0181565b6040516001600160a01b039091168152602001610215565b6101b861039d3660046152de565b611ba7565b6101b86103b03660046152de565b611e2d565b610226601481565b6103d06103cb3660046152de565b611f41565b60405161021591906153e7565b61024b6202a30081565b61020b6103f53660046154a7565b612009565b6101b8610408366004615520565b61203e565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615edf83398151915293929190829060ff16600481111561046e5761046e6153d3565b600481111561047f5761047f6153d3565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61050382611f41565b905060028351600481111561051a5761051a6153d3565b1461056c5760405162461bcd60e51b815260206004820152602a60248201525f80516020615eff8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105d15760405162461bcd60e51b815260206004820152603360248201525f80516020615eff8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610563565b6003835280515f9060029060058111156105ed576105ed6153d3565b0361064457861561060557610602838761211d565b90505b5f8460600151836080015161061a9190615572565b905061062684826123b9565b506001600160401b0390811660e0870152421660a086015250610678565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106ab8660600151611329565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610728573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074c9190615592565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561078b5761078b6153d3565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161089f916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f5f8339815191526020526040808220815160e0810190925280545f80516020615f1f83398151915293929190829060ff1660058111156108fe576108fe6153d3565b600581111561090f5761090f6153d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561097e5761097e6153d3565b146109e35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610563565b6005600160991b016001600160a01b031663ee5b48eb610a088584606001515f612510565b6040518263ffffffff1660e01b8152600401610a2491906155cb565b6020604051808303815f875af1158015610a40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a649190615592565b50505050565b5f610a7a64e8d4a51000836155fd565b92915050565b5f80516020615edf8339815191525f80610a9984612737565b91509150610aa682612a81565b610ab05750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ade57610ade6153d3565b03610b03575f83815260088501602052604081208054919055610b018282612abc565b505b610b1981610b148460400151611329565b612b32565b5050505050565b5f80516020615edf8339815191525f610b3884612b55565b90505f80610b498360400151612d1b565b50915091505f610b5883611f41565b9050816001600160401b031681606001516001600160401b03161015610b905760405162461bcd60e51b81526004016105639061561c565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bd55760405162461bcd60e51b81526004016105639061565e565b60015f87815260068701602052604090205460ff166004811115610bfb57610bfb6153d3565b14610c645760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610563565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615f1f8339815191529060ff1615610d925760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610563565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df99190615592565b836020013514610e5b5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610563565b30610e6c60608501604086016156a7565b6001600160a01b031614610ede5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610563565b5f610eec60608501856156c2565b91505f9050843560208601356014610f0a6060890160408a016156a7565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611239575f610f8a60608901896156c2565b8363ffffffff16818110610fa057610fa0615707565b9050602002810190610fb2919061571b565b610fbb906157cb565b80515f8181526008890160205260409020549192509015610fee5760405162461bcd60e51b815260040161056390615862565b84825f01518360200151846040015160405160200161101094939291906158aa565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161105e91906158f9565b602060405180830381855afa158015611079573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061109c9190615592565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff19166001836005811115611128576111286153d3565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111db91168661590a565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112329061591d565b9050610f6e565b50600484018190555f61124b86612b55565b90505f61125b8260400151612f56565b90508060028560405161126e91906158f9565b602060405180830381855afa158015611289573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112ac9190615592565b146113105760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610563565b5050506009909201805460ff1916600117905550505050565b5f610a7a6001600160401b03831664e8d4a5100061593f565b5f61134c82611f41565b6080015192915050565b5f80516020615edf8339815191525f61136e856130c8565b905061137985612a81565b611384575050505050565b5f8581526005830160205260409020546001600160a01b031633146113bb5760405162461bcd60e51b815260040161056390615956565b5f85815260058301602052604090205460a08201516113ea91600160b01b90046001600160401b0316906159a8565b6001600160401b03168160c001516001600160401b0316101561146b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610563565b8315610b19575f61147c868561211d565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906114d390611329565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156d9190615592565b5f8781526008850160205260408120805490919061158c90849061590a565b9091555050505050505050565b5f80516020615edf8339815191525f6115b183611f41565b90506004815160058111156115c8576115c86153d3565b146116325760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610563565b5f8381526005830160205260409020546001600160a01b031633146116695760405162461bcd60e51b815260040161056390615956565b5f83815260088301602090815260408083208054908490556005860190925290912054610a64906001600160a01b031682612abc565b6116a7613343565b5f80516020615edf8339815191525f6116bf84612b55565b90505f806116d08360400151612d1b565b50915091505f6116df83611f41565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611719576117196153d3565b600481111561172a5761172a6153d3565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff19169055908401519192508481169116101561180e5760405162461bcd60e51b81526004016105639061561c565b826001600160401b03168160e001516001600160401b031611156118445760405162461bcd60e51b81526004016105639061565e565b600381516004811115611859576118596153d3565b146118ad5760405162461bcd60e51b815260206004820152603160248201525f80516020615eff8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610563565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906118ee90600160a01b900461ffff168461593f565b6118f891906155fd565b905080886008015f8881526020019081526020015f205f82825461191c919061590a565b909155505f905061192d82846159c8565b905061193d846020015182612abc565b6119528460200151610b148660600151611329565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611998929190918252602082015260400190565b60405180910390a45050505050505050506119bf60015f80516020615f3f83398151915255565b5050565b5f6119cc613343565b6119d783338461338d565b9050610a7a60015f80516020615f3f83398151915255565b5f80516020615f1f8339815191525f611a0783612b55565b90505f80611a188360400151613747565b9150915080611a7a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610563565b5f82815260068501602052604081208054611a94906159db565b9050118015611ac6575060015f83815260078601602052604090205460ff166005811115611ac457611ac46153d3565b145b611ae25760405162461bcd60e51b815260040161056390615a13565b5f8281526006850160205260408120611afa916151f3565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615edf83398151915293929190829060ff166004811115611c0857611c086153d3565b6004811115611c1957611c196153d3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ca057611ca06153d3565b1480611cbe5750600381516004811115611cbc57611cbc6153d3565b145b611d125760405162461bcd60e51b815260206004820152603260248201525f80516020615eff833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610563565b5f611d208260400151611f41565b905080606001516001600160401b03165f03611da45760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610563565b6005600160991b016001600160a01b031663ee5b48eb611dd1846040015184606001518560800151612510565b6040518263ffffffff1660e01b8152600401611ded91906155cb565b6020604051808303815f875af1158015611e09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b199190615592565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020615f1f833981519152929190611e75906159db565b9050118015611ea7575060015f83815260078301602052604090205460ff166005811115611ea557611ea56153d3565b145b611ec35760405162461bcd60e51b815260040161056390615a13565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611efc9190600401615a5a565b6020604051808303815f875af1158015611f18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f3c9190615592565b505050565b611f4961522a565b5f8281525f80516020615f5f833981519152602052604090819020815160e0810190925280545f80516020615f1f833981519152929190829060ff166005811115611f9657611f966153d3565b6005811115611fa757611fa76153d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f612012613343565b61201e858585856138e8565b905061203660015f80516020615f3f83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680612087575080546001600160401b03808416911610155b156120a55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556120d08484613b5d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612168573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261218f9190810190615aef565b91509150806121f25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610563565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612235573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122599190615592565b8251146122bd5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610563565b60208201516001600160a01b0316156123335760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610563565b5f806123428460400151613b77565b915091508187146123af5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610563565b9695505050505050565b5f8281525f80516020615f5f833981519152602052604081206002015481905f80516020615f1f83398151915290600160801b90046001600160401b03166124018582613d4f565b5f61240b87613f5d565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61245b8a858b612510565b6040518263ffffffff1660e01b815260040161247791906155cb565b6020604051808303815f875af1158015612493573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b79190615592565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612589576125498160016159c8565b61255490600861593f565b5081515f9083908390811061256b5761256b615707565b60200101906001600160f81b03191690815f1a905350600101612535565b505f5b60048110156125f4576125a08160036159c8565b6125ab90600861593f565b600263ffffffff16901c60f81b828260026125c6919061590a565b815181106125d6576125d6615707565b60200101906001600160f81b03191690815f1a90535060010161258c565b505f5b60208110156126565761260b81601f6159c8565b61261690600861593f565b86901c60f81b8261262883600661590a565b8151811061263857612638615707565b60200101906001600160f81b03191690815f1a9053506001016125f7565b505f5b60088110156126c15761266d8160076159c8565b61267890600861593f565b6001600160401b038616901c60f81b8261269383602661590a565b815181106126a3576126a3615707565b60200101906001600160f81b03191690815f1a905350600101612659565b505f5b600881101561272c576126d88160076159c8565b6126e390600861593f565b6001600160401b038516901c60f81b826126fe83602e61590a565b8151811061270e5761270e615707565b60200101906001600160f81b03191690815f1a9053506001016126c4565b5090505b9392505050565b5f61274061522a565b5f80516020615f1f8339815191525f61275885612b55565b90505f806127698360400151613747565b9150915080156127ce5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610563565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156127ff576127ff6153d3565b6005811115612810576128106153d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612881576128816153d3565b148061289f575060018251600581111561289d5761289d6153d3565b145b6128fe5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610563565b600382516005811115612913576129136153d3565b0361292057506004612924565b5060055b6020808301515f9081526008880190915260408120558181600581111561294d5761294d6153d3565b90816005811115612960576129606153d3565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115612994576129946153d3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a4857612a486153d3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ebf83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b17575f80fd5b505af1158015612b29573d5f803e3d5ffd5b50505050505050565b5f80516020615ebf833981519152546119bf906001600160a01b03168383613fed565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bb9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612be09190810190615aef565b9150915080612c405760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610563565b815115612ca15760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610563565b60208201516001600160a01b031615612d145760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610563565b5092915050565b5f805f8351603614612d3f5760405162461bcd60e51b815260040161056390615bc1565b5f805b6002811015612d8e57612d568160016159c8565b612d6190600861593f565b61ffff16868281518110612d7757612d77615707565b016020015160f81c901b9190911790600101612d42565b5061ffff811615612db15760405162461bcd60e51b815260040161056390615c0a565b5f805b6004811015612e0c57612dc88160036159c8565b612dd390600861593f565b63ffffffff1687612de583600261590a565b81518110612df557612df5615707565b016020015160f81c901b9190911790600101612db4565b5063ffffffff8116600414612e335760405162461bcd60e51b815260040161056390615c4d565b5f805b6020811015612e8857612e4a81601f6159c8565b612e5590600861593f565b88612e6183600661590a565b81518110612e7157612e71615707565b016020015160f81c901b9190911790600101612e36565b505f805b6008811015612ee757612ea08160076159c8565b612eab90600861593f565b6001600160401b031689612ec083602661590a565b81518110612ed057612ed0615707565b016020015160f81c901b9190911790600101612e8c565b505f805b6008811015612f4657612eff8160076159c8565b612f0a90600861593f565b6001600160401b03168a612f1f83602e61590a565b81518110612f2f57612f2f615707565b016020015160f81c901b9190911790600101612eeb565b5091989097509095509350505050565b5f8151602614612f785760405162461bcd60e51b815260040161056390615bc1565b5f805b6002811015612fc757612f8f8160016159c8565b612f9a90600861593f565b61ffff16848281518110612fb057612fb0615707565b016020015160f81c901b9190911790600101612f7b565b5061ffff811615612fea5760405162461bcd60e51b815260040161056390615c0a565b5f805b6004811015613045576130018160036159c8565b61300c90600861593f565b63ffffffff168561301e83600261590a565b8151811061302e5761302e615707565b016020015160f81c901b9190911790600101612fed565b5063ffffffff81161561306a5760405162461bcd60e51b815260040161056390615c4d565b5f805b60208110156130bf5761308181601f6159c8565b61308c90600861593f565b8661309883600661590a565b815181106130a8576130a8615707565b016020015160f81c901b919091179060010161306d565b50949350505050565b6130d061522a565b5f8281525f80516020615f5f8339815191526020526040808220815160e0810190925280545f80516020615f1f83398151915293929190829060ff16600581111561311d5761311d6153d3565b600581111561312e5761312e6153d3565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131a0576131a06153d3565b146131fc5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610563565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613240576132406153d3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132ec85826123b9565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f3f83398151915280546001190161337457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f3f83398151915255565b5f5f80516020615edf833981519152816133a96102468561404c565b90505f6133b587611f41565b90506133c087612a81565b61341d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610563565b600281516005811115613432576134326153d3565b146134915760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610563565b5f8282608001516134a291906159a8565b600485015460408401519192506134c4916001600160401b0390911690615c94565b6001600160401b0316816001600160401b031611156135435760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610563565b5f8061354f8a846123b9565b915091505f8a8360405160200161357d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613618576136186153d3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461376a5760405162461bcd60e51b815260040161056390615bc1565b5f805b60028110156137b9576137818160016159c8565b61378c90600861593f565b61ffff168582815181106137a2576137a2615707565b016020015160f81c901b919091179060010161376d565b5061ffff8116156137dc5760405162461bcd60e51b815260040161056390615c0a565b5f805b6004811015613837576137f38160036159c8565b6137fe90600861593f565b63ffffffff168661381083600261590a565b8151811061382057613820615707565b016020015160f81c901b91909117906001016137df565b5063ffffffff811660031461385e5760405162461bcd60e51b815260040161056390615c4d565b5f805b60208110156138b35761387581601f6159c8565b61388090600861593f565b8761388c83600661590a565b8151811061389c5761389c615707565b016020015160f81c901b9190911790600101613861565b505f866026815181106138c8576138c8615707565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615edf8339815191529061ffff861610801590613934575061271061ffff861611155b6139505760405162461bcd60e51b815260040161056390615cbf565b60028101546001600160401b0390811690851610156139c95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610563565b8054831015613a2c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610563565b8060010154831115613a935760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610563565b5f613a9d8461404c565b90505f613aa982610a6a565b90505f613ab6898361406f565b90506040518060600160405280613aca3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613b656145d3565b613b6e8261461e565b6119bf81614693565b5f808251602e14613b9a5760405162461bcd60e51b815260040161056390615bc1565b5f805b6002811015613be957613bb18160016159c8565b613bbc90600861593f565b61ffff16858281518110613bd257613bd2615707565b016020015160f81c901b9190911790600101613b9d565b5061ffff811615613c0c5760405162461bcd60e51b815260040161056390615c0a565b5f805b6004811015613c6757613c238160036159c8565b613c2e90600861593f565b63ffffffff1686613c4083600261590a565b81518110613c5057613c50615707565b016020015160f81c901b9190911790600101613c0f565b5063ffffffff8116600514613c8e5760405162461bcd60e51b815260040161056390615c4d565b5f805b6020811015613ce357613ca581601f6159c8565b613cb090600861593f565b87613cbc83600661590a565b81518110613ccc57613ccc615707565b016020015160f81c901b9190911790600101613c91565b505f805b6008811015613d4257613cfb8160076159c8565b613d0690600861593f565b6001600160401b031688613d1b83602661590a565b81518110613d2b57613d2b615707565b016020015160f81c901b9190911790600101613ce7565b5090969095509350505050565b5f80516020615f1f8339815191525f6001600160401b038084169085161115613d8357613d7c8385615572565b9050613d90565b613d8d8484615572565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613df2575060018401548151613dee916001600160401b03169061590a565b8210155b15613e18576001600160401b038316606082015281815260408101516020820152613e37565b8281606001818151613e2a91906159a8565b6001600160401b03169052505b6060810151613e47906064615c94565b602082015160018601546001600160401b039290921691613e729190600160401b900460ff1661593f565b1015613ed65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610563565b856001600160401b031681604001818151613ef1919061590a565b9052506040810180516001600160401b0387169190613f119083906159c8565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f5f8339815191526020526040812060020180545f80516020615f1f83398151915291600160401b9091046001600160401b0316906008613fa783615d0a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611f3c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614734565b5f610a7a825f80516020615ebf833981519152546001600160a01b031690614795565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166140fa5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610563565b5f80516020615f1f83398151915242614119604086016020870161539a565b6001600160401b03161161418b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610563565b61419b604085016020860161539a565b6001600160401b03166141b16202a3004261590a565b116142245760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610563565b833561427c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610563565b83355f908152600882016020526040902054156142ab5760405162461bcd60e51b815260040161056390615862565b60306142ba6040860186615d25565b90501461431f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610563565b614329835f613d4f565b5f806143c26040518060a00160405280855f01548152602001885f01358152602001876001600160401b0316815260200188602001602081019061436d919061539a565b6001600160401b0316815260200161438860408a018a615d25565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506148f7565b5f828152600686016020526040902091935091506143e08282615dab565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061440d9085906004016155cb565b6020604051808303815f875af1158015614429573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061444d9190615592565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156144c5576144c56153d3565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916145a5918e01908e0161539a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661461c57604051631afcd79f60e31b815260040160405180910390fd5b565b6146266145d3565b61462f81614ca6565b614637614cbf565b6146906060820135608083013561465460c0850160a0860161539a565b61466460e0860160c08701615e6a565b61ffff16614679610100870160e08801615e83565b61468b610120880161010089016156a7565b614ccf565b50565b61469b6145d3565b5f80516020615ebf8339815191526001600160a01b0382166147145760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610563565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6147486001600160a01b03841683614f13565b905080515f1415801561476c57508080602001905181019061476a9190615ea3565b155b15611f3c57604051635274afe760e01b81526001600160a01b0384166004820152602401610563565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156147db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147ff9190615592565b90506148166001600160a01b038516333086614f20565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561485a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061487e9190615592565b90508181116148e45760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610563565b6148ee82826159c8565b95945050505050565b5f60608260800151516030146149615760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610563565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156149d8576149988160016159c8565b6149a390600861593f565b5081515f908390839081106149ba576149ba615707565b60200101906001600160f81b03191690815f1a905350600101614984565b505f5b6004811015614a40576149ef8160036159c8565b6149fa90600861593f565b600160ff919091161c60f81b82614a1283600261590a565b81518110614a2257614a22615707565b60200101906001600160f81b03191690815f1a9053506001016149db565b505f5b6020811015614a9d5784518160208110614a5f57614a5f615707565b1a60f81b82614a6f83600661590a565b81518110614a7f57614a7f615707565b60200101906001600160f81b03191690815f1a905350600101614a43565b505f5b6020811015614afd5784602001518160208110614abf57614abf615707565b1a60f81b82614acf83602661590a565b81518110614adf57614adf615707565b60200101906001600160f81b03191690815f1a905350600101614aa0565b505f5b6008811015614b7157614b148160076159c8565b614b1f90600861593f565b60ff1685604001516001600160401b0316901c60f81b82826046614b43919061590a565b81518110614b5357614b53615707565b60200101906001600160f81b03191690815f1a905350600101614b00565b505f5b6030811015614bdc5784608001518181518110614b9357614b93615707565b01602001516001600160f81b03191682614bae83604e61590a565b81518110614bbe57614bbe615707565b60200101906001600160f81b03191690815f1a905350600101614b74565b505f5b6008811015614c4e57614bf38160076159c8565b614bfe90600861593f565b60608601516001600160401b0390811691161c60f81b82614c2083607e61590a565b81518110614c3057614c30615707565b60200101906001600160f81b03191690815f1a905350600101614bdf565b50600281604051614c5f91906158f9565b602060405180830381855afa158015614c7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c9d9190615592565b94909350915050565b614cae6145d3565b614cb6614f59565b61469081614f61565b614cc76145d3565b61461c6150dc565b614cd76145d3565b5f80516020615edf83398151915283614d435760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610563565b612710841115614d655760405162461bcd60e51b815260040161056390615cbf565b85871115614dcd5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610563565b5f8360ff1611614e3a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610563565b600a60ff84161115614eac5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610563565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b606061273083835f6150e4565b6040516001600160a01b038481166024830152838116604483015260648201839052610a649186918216906323b872dd9060840161401a565b61461c6145d3565b614f696145d3565b80355f80516020615f1f8339815191529081556014614f8e6060840160408501615e83565b60ff161115614ffb5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610563565b5f61500c6060840160408501615e83565b60ff16116150745760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610563565b6150846060830160408401615e83565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556150b5604083016020840161539a565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61337a6145d3565b6060814710156151095760405163cd78605960e01b8152306004820152602401610563565b5f80856001600160a01b0316848660405161512491906158f9565b5f6040518083038185875af1925050503d805f811461515e576040519150601f19603f3d011682016040523d82523d5f602084013e615163565b606091505b50915091506123af8683836060826151835761517e826151ca565b612730565b815115801561519a57506001600160a01b0384163b155b156151c357604051639996b31560e01b81526001600160a01b0385166004820152602401610563565b5080612730565b8051156151da5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151ff906159db565b5f825580601f1061520e575050565b601f0160209004905f5260205f20908101906146909190615266565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561527a575f8155600101615267565b5090565b8015158114614690575f80fd5b803563ffffffff8116811461529e575f80fd5b919050565b5f805f606084860312156152b5575f80fd5b8335925060208401356152c78161527e565b91506152d56040850161528b565b90509250925092565b5f602082840312156152ee575f80fd5b5035919050565b5f60208284031215615305575f80fd5b6127308261528b565b5f806040838503121561531f575f80fd5b6153288361528b565b946020939093013593505050565b5f8060408385031215615347575f80fd5b82356001600160401b0381111561535c575f80fd5b83016080818603121561536d575f80fd5b915061537b6020840161528b565b90509250929050565b80356001600160401b038116811461529e575f80fd5b5f602082840312156153aa575f80fd5b61273082615384565b5f80604083850312156153c4575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061540a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161544560608401826001600160401b03169052565b50608083015161546060808401826001600160401b03169052565b5060a083015161547b60a08401826001600160401b03169052565b5060c0830151612d1460c08401826001600160401b03169052565b803561ffff8116811461529e575f80fd5b5f805f80608085870312156154ba575f80fd5b84356001600160401b038111156154cf575f80fd5b8501606081880312156154e0575f80fd5b93506154ee60208601615496565b92506154fc60408601615384565b9396929550929360600135925050565b6001600160a01b0381168114614690575f80fd5b5f80828403610140811215615533575f80fd5b61012080821215615542575f80fd5b84935083013590506155538161550c565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612d1457612d1461555e565b5f602082840312156155a2575f80fd5b5051919050565b5f5b838110156155c35781810151838201526020016155ab565b50505f910152565b602081525f82518060208401526155e98160408501602087016155a9565b601f01601f19169190910160400192915050565b5f8261561757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156b7575f80fd5b81356127308161550c565b5f808335601e198436030181126156d7575f80fd5b8301803591506001600160401b038211156156f0575f80fd5b6020019150600581901b3603821315612509575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261572f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561576f5761576f615739565b60405290565b604051601f8201601f191681016001600160401b038111828210171561579d5761579d615739565b604052919050565b5f6001600160401b038211156157bd576157bd615739565b50601f01601f191660200190565b5f606082360312156157db575f80fd5b6157e361574d565b8235815260206157f4818501615384565b8183015260408401356001600160401b03811115615810575f80fd5b840136601f820112615820575f80fd5b803561583361582e826157a5565b615775565b8181523684838501011115615846575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158bb818460208a016155a9565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158eb8160288401602088016155a9565b016028019695505050505050565b5f825161572f8184602087016155a9565b80820180821115610a7a57610a7a61555e565b5f63ffffffff8083168181036159355761593561555e565b6001019392505050565b8082028115828204841417610a7a57610a7a61555e565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b03818116838216019080821115612d1457612d1461555e565b81810381811115610a7a57610a7a61555e565b600181811c908216806159ef57607f821691505b602082108103615a0d57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a6c816159db565b806020870152604060018084165f8114615a8d5760018114615aa957615ad6565b60ff19851660408a0152604084151560051b8a01019550615ad6565b895f5260205f205f5b85811015615acd5781548b8201860152908301908801615ab2565b8a016040019650505b509398975050505050505050565b805161529e8161527e565b5f8060408385031215615b00575f80fd5b82516001600160401b0380821115615b16575f80fd5b9084019060608287031215615b29575f80fd5b615b3161574d565b82518152602080840151615b448161550c565b82820152604084015183811115615b59575f80fd5b80850194505087601f850112615b6d575f80fd5b83519250615b7d61582e846157a5565b8381528882858701011115615b90575f80fd5b615b9f848383018488016155a9565b80604084015250819550615bb4818801615ae4565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cb757615cb761555e565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036159355761593561555e565b5f808335601e19843603018112615d3a575f80fd5b8301803591506001600160401b03821115615d53575f80fd5b602001915036819003821315612509575f80fd5b601f821115611f3c57805f5260205f20601f840160051c81016020851015615d8c5750805b601f840160051c820191505b81811015610b19575f8155600101615d98565b81516001600160401b03811115615dc457615dc4615739565b615dd881615dd284546159db565b84615d67565b602080601f831160018114615e0b575f8415615df45750858301515b5f19600386901b1c1916600185901b178555615e62565b5f85815260208120601f198616915b82811015615e3957888601518255948401946001909101908401615e1a565b5085821015615e5657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e7a575f80fd5b61273082615496565b5f60208284031215615e93575f80fd5b813560ff81168114612730575f80fd5b5f60208284031215615eb3575f80fd5b81516127308161527e56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516160f43803806160f483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615fa78061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b336600461534e565b61040d565b005b6101b86101c8366004615389565b6108b1565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004615389565b610a6a565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b86102413660046153a0565b610a80565b6101b86102543660046153b9565b610b20565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b86102843660046153e1565b610cf5565b61029c610297366004615445565b61136e565b6040519081526020016101e3565b6101ff6102b8366004615389565b611387565b61029c5f81565b6101b86102d236600461534e565b61139b565b6101d5603081565b6101b86102ed366004615389565b6115de565b6101b86103003660046153b9565b6116e4565b61029c61031336600461545e565b611a08565b6101b86103263660046153a0565b611a34565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004615389565b611baa565b6101b8610372366004615389565b611e30565b6101d5601481565b61039261038d366004615389565b611f0b565b6040516101e39190615492565b6101ff6202a30081565b61029c6103b7366004615389565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f5366004615552565b611fd3565b6101b86104083660046155cb565b612008565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615efb83398151915293929190829060ff16600481111561046e5761046e61547e565b600481111561047f5761047f61547e565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61050382611f0b565b905060028351600481111561051a5761051a61547e565b1461056c5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f1b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105d15760405162461bcd60e51b815260206004820152603360248201525f80516020615f1b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610563565b6003835280515f9060029060058111156105ed576105ed61547e565b036106445786156106055761060283876120e7565b90505b5f8460600151836080015161061a919061561d565b90506106268482612383565b506001600160401b0390811660e0870152421660a086015250610678565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106ab866060015161136e565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610728573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074c919061563d565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561078b5761078b61547e565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161089f916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f7b8339815191526020526040808220815160e0810190925280545f80516020615f3b83398151915293929190829060ff1660058111156108fe576108fe61547e565b600581111561090f5761090f61547e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561097e5761097e61547e565b146109e35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610563565b6005600160991b016001600160a01b031663ee5b48eb610a088584606001515f6124da565b6040518263ffffffff1660e01b8152600401610a249190615676565b6020604051808303815f875af1158015610a40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a64919061563d565b50505050565b5f610a7a64e8d4a51000836156a8565b92915050565b5f80516020615efb8339815191525f80610a9984612701565b91509150610aa682612a1f565b610ab05750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ade57610ade61547e565b03610b03575f83815260088501602052604081208054919055610b018282612a5a565b505b610b1981610b14846040015161136e565b612ad0565b5050505050565b5f80516020615efb8339815191525f610b3884612af3565b90505f80610b498360400151612cb9565b50915091505f610b5883611f0b565b9050816001600160401b031681606001516001600160401b03161015610b905760405162461bcd60e51b8152600401610563906156c7565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bd55760405162461bcd60e51b815260040161056390615709565b60015f87815260068701602052604090205460ff166004811115610bfb57610bfb61547e565b14610c645760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610563565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615f3b8339815191529060ff1615610d925760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610563565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df9919061563d565b836020013514610e5b5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610563565b30610e6c6060850160408601615752565b6001600160a01b031614610ede5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610563565b5f610eec606085018561576d565b91505f9050843560208601356014610f0a6060890160408a01615752565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561127e575f610f8a606089018961576d565b8363ffffffff16818110610fa057610fa06157b2565b9050602002810190610fb291906157c6565b610fbb90615876565b80515f81815260088901602052604090205491925090156110335760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b6064820152608401610563565b84825f015183602001518460400151604051602001611055949392919061590d565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110a3919061595c565b602060405180830381855afa1580156110be573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110e1919061563d565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff1916600183600581111561116d5761116d61547e565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161122091168661596d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061127790615980565b9050610f6e565b50600484018190555f61129086612af3565b90505f6112a08260400151612ef4565b9050806002856040516112b3919061595c565b602060405180830381855afa1580156112ce573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112f1919061563d565b146113555760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610563565b5050506009909201805460ff1916600117905550505050565b5f610a7a6001600160401b03831664e8d4a510006159a2565b5f61139182611f0b565b6080015192915050565b5f80516020615efb8339815191525f6113b385613066565b90506113be85612a1f565b6113c9575050505050565b5f8581526005830160205260409020546001600160a01b031633146114005760405162461bcd60e51b8152600401610563906159b9565b5f85815260058301602052604090205460a082015161142f91600160b01b90046001600160401b031690615a0b565b6001600160401b03168160c001516001600160401b031610156114b05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610563565b8315610b19575f6114c186856120e7565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906115189061136e565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561158e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b2919061563d565b5f878152600885016020526040812080549091906115d190849061596d565b9091555050505050505050565b5f80516020615efb8339815191525f6115f683611f0b565b905060048151600581111561160d5761160d61547e565b146116775760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610563565b5f8381526005830160205260409020546001600160a01b031633146116ae5760405162461bcd60e51b8152600401610563906159b9565b5f83815260088301602090815260408083208054908490556005860190925290912054610a64906001600160a01b031682612a5a565b6116ec6132e1565b5f80516020615efb8339815191525f61170484612af3565b90505f806117158360400151612cb9565b50915091505f61172483611f0b565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561175e5761175e61547e565b600481111561176f5761176f61547e565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118535760405162461bcd60e51b8152600401610563906156c7565b826001600160401b03168160e001516001600160401b031611156118895760405162461bcd60e51b815260040161056390615709565b60038151600481111561189e5761189e61547e565b146118f25760405162461bcd60e51b815260206004820152603160248201525f80516020615f1b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610563565b5f878152600787016020908152604080832080549084905587845260058a019092528220549091906127109061193390600160a01b900461ffff16846159a2565b61193d91906156a8565b905080886008015f8881526020019081526020015f205f828254611961919061596d565b909155505f90506119728284615a2b565b9050611982846020015182612a5a565b6119978460200151610b14866060015161136e565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d503384866040516119dd929190918252602082015260400190565b60405180910390a4505050505050505050611a0460015f80516020615f5b83398151915255565b5050565b5f611a116132e1565b611a1c83338461332b565b9050610a7a60015f80516020615f5b83398151915255565b5f80516020615f3b8339815191525f611a4c83612af3565b90505f80611a5d83604001516136e5565b9150915080611abf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610563565b60015f83815260078601602052604090205460ff166005811115611ae557611ae561547e565b14611b025760405162461bcd60e51b815260040161056390615a3e565b5f8281526006850160205260408120611b1a9161529e565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615efb83398151915293929190829060ff166004811115611c0b57611c0b61547e565b6004811115611c1c57611c1c61547e565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ca357611ca361547e565b1480611cc15750600381516004811115611cbf57611cbf61547e565b145b611d155760405162461bcd60e51b815260206004820152603260248201525f80516020615f1b833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610563565b5f611d238260400151611f0b565b905080606001516001600160401b03165f03611da75760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610563565b6005600160991b016001600160a01b031663ee5b48eb611dd48460400151846060015185608001516124da565b6040518263ffffffff1660e01b8152600401611df09190615676565b6020604051808303815f875af1158015611e0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b19919061563d565b5f8181525f80516020615f7b83398151915260205260409020545f80516020615f3b8339815191529060019060ff166005811115611e7057611e7061547e565b14611e8d5760405162461bcd60e51b815260040161056390615a3e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ec69190600401615ac1565b6020604051808303815f875af1158015611ee2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f06919061563d565b505050565b611f136152d5565b5f8281525f80516020615f7b833981519152602052604090819020815160e0810190925280545f80516020615f3b833981519152929190829060ff166005811115611f6057611f6061547e565b6005811115611f7157611f7161547e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611fdc6132e1565b611fe885858585613886565b905061200060015f80516020615f5b83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680612051575080546001600160401b03808416911610155b1561206f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561209a8484613b72565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612132573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121599190810190615b56565b91509150806121bc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610563565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121ff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612223919061563d565b8251146122875760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610563565b60208201516001600160a01b0316156122fd5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610563565b5f8061230c8460400151613b8c565b915091508187146123795760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610563565b9695505050505050565b5f8281525f80516020615f7b833981519152602052604081206002015481905f80516020615f3b83398151915290600160801b90046001600160401b03166123cb8582613d64565b5f6123d587613f72565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124258a858b6124da565b6040518263ffffffff1660e01b81526004016124419190615676565b6020604051808303815f875af115801561245d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612481919061563d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561255357612513816001615a2b565b61251e9060086159a2565b5081515f90839083908110612535576125356157b2565b60200101906001600160f81b03191690815f1a9053506001016124ff565b505f5b60048110156125be5761256a816003615a2b565b6125759060086159a2565b600263ffffffff16901c60f81b82826002612590919061596d565b815181106125a0576125a06157b2565b60200101906001600160f81b03191690815f1a905350600101612556565b505f5b6020811015612620576125d581601f615a2b565b6125e09060086159a2565b86901c60f81b826125f283600661596d565b81518110612602576126026157b2565b60200101906001600160f81b03191690815f1a9053506001016125c1565b505f5b600881101561268b57612637816007615a2b565b6126429060086159a2565b6001600160401b038616901c60f81b8261265d83602661596d565b8151811061266d5761266d6157b2565b60200101906001600160f81b03191690815f1a905350600101612623565b505f5b60088110156126f6576126a2816007615a2b565b6126ad9060086159a2565b6001600160401b038516901c60f81b826126c883602e61596d565b815181106126d8576126d86157b2565b60200101906001600160f81b03191690815f1a90535060010161268e565b5090505b9392505050565b5f61270a6152d5565b5f80516020615f3b8339815191525f61272285612af3565b90505f8061273383604001516136e5565b9150915080156127985760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610563565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156127c9576127c961547e565b60058111156127da576127da61547e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156128495761284961547e565b148061286757506001815160058111156128655761286561547e565b145b6128c65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610563565b6003815160058111156128db576128db61547e565b036128e957600481526128ee565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156129335761293361547e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129e7576129e761547e565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615edb83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ab5575f80fd5b505af1158015612ac7573d5f803e3d5ffd5b50505050505050565b5f80516020615edb83398151915254611a04906001600160a01b03168383614002565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612b57573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612b7e9190810190615b56565b9150915080612bde5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610563565b815115612c3f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610563565b60208201516001600160a01b031615612cb25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610563565b5092915050565b5f805f8351603614612cdd5760405162461bcd60e51b815260040161056390615c28565b5f805b6002811015612d2c57612cf4816001615a2b565b612cff9060086159a2565b61ffff16868281518110612d1557612d156157b2565b016020015160f81c901b9190911790600101612ce0565b5061ffff811615612d4f5760405162461bcd60e51b815260040161056390615c71565b5f805b6004811015612daa57612d66816003615a2b565b612d719060086159a2565b63ffffffff1687612d8383600261596d565b81518110612d9357612d936157b2565b016020015160f81c901b9190911790600101612d52565b5063ffffffff8116600414612dd15760405162461bcd60e51b815260040161056390615cb4565b5f805b6020811015612e2657612de881601f615a2b565b612df39060086159a2565b88612dff83600661596d565b81518110612e0f57612e0f6157b2565b016020015160f81c901b9190911790600101612dd4565b505f805b6008811015612e8557612e3e816007615a2b565b612e499060086159a2565b6001600160401b031689612e5e83602661596d565b81518110612e6e57612e6e6157b2565b016020015160f81c901b9190911790600101612e2a565b505f805b6008811015612ee457612e9d816007615a2b565b612ea89060086159a2565b6001600160401b03168a612ebd83602e61596d565b81518110612ecd57612ecd6157b2565b016020015160f81c901b9190911790600101612e89565b5091989097509095509350505050565b5f8151602614612f165760405162461bcd60e51b815260040161056390615c28565b5f805b6002811015612f6557612f2d816001615a2b565b612f389060086159a2565b61ffff16848281518110612f4e57612f4e6157b2565b016020015160f81c901b9190911790600101612f19565b5061ffff811615612f885760405162461bcd60e51b815260040161056390615c71565b5f805b6004811015612fe357612f9f816003615a2b565b612faa9060086159a2565b63ffffffff1685612fbc83600261596d565b81518110612fcc57612fcc6157b2565b016020015160f81c901b9190911790600101612f8b565b5063ffffffff8116156130085760405162461bcd60e51b815260040161056390615cb4565b5f805b602081101561305d5761301f81601f615a2b565b61302a9060086159a2565b8661303683600661596d565b81518110613046576130466157b2565b016020015160f81c901b919091179060010161300b565b50949350505050565b61306e6152d5565b5f8281525f80516020615f7b8339815191526020526040808220815160e0810190925280545f80516020615f3b83398151915293929190829060ff1660058111156130bb576130bb61547e565b60058111156130cc576130cc61547e565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561313e5761313e61547e565b1461319a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610563565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156131de576131de61547e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61328a8582612383565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f5b83398151915280546001190161331257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f5b83398151915255565b5f5f80516020615efb833981519152816133476101fa85614061565b90505f61335387611f0b565b905061335e87612a1f565b6133bb5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610563565b6002815160058111156133d0576133d061547e565b1461342f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610563565b5f8282608001516134409190615a0b565b60048501546040840151919250613462916001600160401b0390911690615cfb565b6001600160401b0316816001600160401b031611156134e15760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610563565b5f806134ed8a84612383565b915091505f8a8360405160200161351b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156135b6576135b661547e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137085760405162461bcd60e51b815260040161056390615c28565b5f805b60028110156137575761371f816001615a2b565b61372a9060086159a2565b61ffff16858281518110613740576137406157b2565b016020015160f81c901b919091179060010161370b565b5061ffff81161561377a5760405162461bcd60e51b815260040161056390615c71565b5f805b60048110156137d557613791816003615a2b565b61379c9060086159a2565b63ffffffff16866137ae83600261596d565b815181106137be576137be6157b2565b016020015160f81c901b919091179060010161377d565b5063ffffffff81166003146137fc5760405162461bcd60e51b815260040161056390615cb4565b5f805b60208110156138515761381381601f615a2b565b61381e9060086159a2565b8761382a83600661596d565b8151811061383a5761383a6157b2565b016020015160f81c901b91909117906001016137ff565b505f86602681518110613866576138666157b2565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615efb8339815191529061ffff8616101561390d5760405162461bcd60e51b815260206004820152602b60248201525f80516020615f1b83398151915260448201526a66656520746f6f206c6f7760a81b6064820152608401610563565b61271061ffff861611156139655760405162461bcd60e51b815260206004820152602c60248201525f80516020615f1b83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b6064820152608401610563565b60028101546001600160401b0390811690851610156139de5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610563565b8054831015613a415760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610563565b8060010154831115613aa85760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610563565b5f613ab284614061565b90505f613abe82610a6a565b90505f613acb8983614084565b90506040518060600160405280613adf3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613b7a61463a565b613b8382614685565b611a04816146fa565b5f808251602e14613baf5760405162461bcd60e51b815260040161056390615c28565b5f805b6002811015613bfe57613bc6816001615a2b565b613bd19060086159a2565b61ffff16858281518110613be757613be76157b2565b016020015160f81c901b9190911790600101613bb2565b5061ffff811615613c215760405162461bcd60e51b815260040161056390615c71565b5f805b6004811015613c7c57613c38816003615a2b565b613c439060086159a2565b63ffffffff1686613c5583600261596d565b81518110613c6557613c656157b2565b016020015160f81c901b9190911790600101613c24565b5063ffffffff8116600514613ca35760405162461bcd60e51b815260040161056390615cb4565b5f805b6020811015613cf857613cba81601f615a2b565b613cc59060086159a2565b87613cd183600661596d565b81518110613ce157613ce16157b2565b016020015160f81c901b9190911790600101613ca6565b505f805b6008811015613d5757613d10816007615a2b565b613d1b9060086159a2565b6001600160401b031688613d3083602661596d565b81518110613d4057613d406157b2565b016020015160f81c901b9190911790600101613cfc565b5090969095509350505050565b5f80516020615f3b8339815191525f6001600160401b038084169085161115613d9857613d91838561561d565b9050613da5565b613da2848461561d565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613e07575060018401548151613e03916001600160401b03169061596d565b8210155b15613e2d576001600160401b038316606082015281815260408101516020820152613e4c565b8281606001818151613e3f9190615a0b565b6001600160401b03169052505b6060810151613e5c906064615cfb565b602082015160018601546001600160401b039290921691613e879190600160401b900460ff166159a2565b1015613eeb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610563565b856001600160401b031681604001818151613f06919061596d565b9052506040810180516001600160401b0387169190613f26908390615a2b565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f7b8339815191526020526040812060020180545f80516020615f3b83398151915291600160401b9091046001600160401b0316906008613fbc83615d26565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611f0691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061479b565b5f610a7a825f80516020615edb833981519152546001600160a01b0316906147fc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661410f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610563565b5f80516020615f3b8339815191524261412e6040860160208701615445565b6001600160401b0316116141a05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610563565b6141b06040850160208601615445565b6001600160401b03166141c66202a3004261596d565b116142395760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610563565b83356142915760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610563565b83355f908152600882016020526040902054156143015760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610563565b60306143106040860186615d41565b9050146143755760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610563565b61437f835f613d64565b5f806144186040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906143c39190615445565b6001600160401b031681526020016143de60408a018a615d41565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061495e565b5f828152600686016020526040902091935091506144368282615dc7565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614474908590600401615676565b6020604051808303815f875af1158015614490573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144b4919061563d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561452c5761452c61547e565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161460c918e01908e01615445565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661468357604051631afcd79f60e31b815260040160405180910390fd5b565b61468d61463a565b61469681614d0d565b61469e614d26565b6146f7606082013560808301356146bb60c0850160a08601615445565b6146cb60e0860160c08701615e86565b61ffff166146e0610100870160e08801615e9f565b6146f261012088016101008901615752565b614d36565b50565b61470261463a565b5f80516020615edb8339815191526001600160a01b03821661477b5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610563565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6147af6001600160a01b03841683614fbe565b905080515f141580156147d35750808060200190518101906147d19190615ebf565b155b15611f0657604051635274afe760e01b81526001600160a01b0384166004820152602401610563565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614842573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614866919061563d565b905061487d6001600160a01b038516333086614fcb565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156148c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148e5919061563d565b905081811161494b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610563565b6149558282615a2b565b95945050505050565b5f60608260800151516030146149c85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610563565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614a3f576149ff816001615a2b565b614a0a9060086159a2565b5081515f90839083908110614a2157614a216157b2565b60200101906001600160f81b03191690815f1a9053506001016149eb565b505f5b6004811015614aa757614a56816003615a2b565b614a619060086159a2565b600160ff919091161c60f81b82614a7983600261596d565b81518110614a8957614a896157b2565b60200101906001600160f81b03191690815f1a905350600101614a42565b505f5b6020811015614b045784518160208110614ac657614ac66157b2565b1a60f81b82614ad683600661596d565b81518110614ae657614ae66157b2565b60200101906001600160f81b03191690815f1a905350600101614aaa565b505f5b6020811015614b645784602001518160208110614b2657614b266157b2565b1a60f81b82614b3683602661596d565b81518110614b4657614b466157b2565b60200101906001600160f81b03191690815f1a905350600101614b07565b505f5b6008811015614bd857614b7b816007615a2b565b614b869060086159a2565b60ff1685604001516001600160401b0316901c60f81b82826046614baa919061596d565b81518110614bba57614bba6157b2565b60200101906001600160f81b03191690815f1a905350600101614b67565b505f5b6030811015614c435784608001518181518110614bfa57614bfa6157b2565b01602001516001600160f81b03191682614c1583604e61596d565b81518110614c2557614c256157b2565b60200101906001600160f81b03191690815f1a905350600101614bdb565b505f5b6008811015614cb557614c5a816007615a2b565b614c659060086159a2565b60608601516001600160401b0390811691161c60f81b82614c8783607e61596d565b81518110614c9757614c976157b2565b60200101906001600160f81b03191690815f1a905350600101614c46565b50600281604051614cc6919061595c565b602060405180830381855afa158015614ce1573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d04919061563d565b94909350915050565b614d1561463a565b614d1d615004565b6146f78161500c565b614d2e61463a565b614683615187565b614d3e61463a565b5f80516020615efb83398151915283614daa5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610563565b612710841115614e105760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610563565b85871115614e785760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610563565b5f8360ff1611614ee55760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610563565b600a60ff84161115614f575760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610563565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606126fa83835f61518f565b6040516001600160a01b038481166024830152838116604483015260648201839052610a649186918216906323b872dd9060840161402f565b61468361463a565b61501461463a565b80355f80516020615f3b83398151915290815560146150396060840160408501615e9f565b60ff1611156150a65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610563565b5f6150b76060840160408501615e9f565b60ff161161511f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610563565b61512f6060830160408401615e9f565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556151606040830160208401615445565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61331861463a565b6060814710156151b45760405163cd78605960e01b8152306004820152602401610563565b5f80856001600160a01b031684866040516151cf919061595c565b5f6040518083038185875af1925050503d805f8114615209576040519150601f19603f3d011682016040523d82523d5f602084013e61520e565b606091505b509150915061237986838360608261522e5761522982615275565b6126fa565b815115801561524557506001600160a01b0384163b155b1561526e57604051639996b31560e01b81526001600160a01b0385166004820152602401610563565b50806126fa565b8051156152855780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546152aa90615a89565b5f825580601f106152b9575050565b601f0160209004905f5260205f20908101906146f79190615311565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615325575f8155600101615312565b5090565b80151581146146f7575f80fd5b803563ffffffff81168114615349575f80fd5b919050565b5f805f60608486031215615360575f80fd5b83359250602084013561537281615329565b915061538060408501615336565b90509250925092565b5f60208284031215615399575f80fd5b5035919050565b5f602082840312156153b0575f80fd5b6126fa82615336565b5f80604083850312156153ca575f80fd5b6153d383615336565b946020939093013593505050565b5f80604083850312156153f2575f80fd5b82356001600160401b03811115615407575f80fd5b830160808186031215615418575f80fd5b915061542660208401615336565b90509250929050565b80356001600160401b0381168114615349575f80fd5b5f60208284031215615455575f80fd5b6126fa8261542f565b5f806040838503121561546f575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106154b557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154f060608401826001600160401b03169052565b50608083015161550b60808401826001600160401b03169052565b5060a083015161552660a08401826001600160401b03169052565b5060c0830151612cb260c08401826001600160401b03169052565b803561ffff81168114615349575f80fd5b5f805f8060808587031215615565575f80fd5b84356001600160401b0381111561557a575f80fd5b85016060818803121561558b575f80fd5b935061559960208601615541565b92506155a76040860161542f565b9396929550929360600135925050565b6001600160a01b03811681146146f7575f80fd5b5f808284036101408112156155de575f80fd5b610120808212156155ed575f80fd5b84935083013590506155fe816155b7565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612cb257612cb2615609565b5f6020828403121561564d575f80fd5b5051919050565b5f5b8381101561566e578181015183820152602001615656565b50505f910152565b602081525f8251806020840152615694816040850160208701615654565b601f01601f19169190910160400192915050565b5f826156c257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615762575f80fd5b81356126fa816155b7565b5f808335601e19843603018112615782575f80fd5b8301803591506001600160401b0382111561579b575f80fd5b6020019150600581901b36038213156124d3575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126157da575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561581a5761581a6157e4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615848576158486157e4565b604052919050565b5f6001600160401b03821115615868576158686157e4565b50601f01601f191660200190565b5f60608236031215615886575f80fd5b61588e6157f8565b82358152602061589f81850161542f565b8183015260408401356001600160401b038111156158bb575f80fd5b840136601f8201126158cb575f80fd5b80356158de6158d982615850565b615820565b81815236848385010111156158f1575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f855161591e818460208a01615654565b80830190508581526001600160401b0360c01b8560c01b166020820152835161594e816028840160208801615654565b016028019695505050505050565b5f82516157da818460208701615654565b80820180821115610a7a57610a7a615609565b5f63ffffffff80831681810361599857615998615609565b6001019392505050565b8082028115828204841417610a7a57610a7a615609565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b03818116838216019080821115612cb257612cb2615609565b81810381811115610a7a57610a7a615609565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615a9d57607f821691505b602082108103615abb57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454615ad381615a89565b806020870152604060018084165f8114615af45760018114615b1057615b3d565b60ff19851660408a0152604084151560051b8a01019550615b3d565b895f5260205f205f5b85811015615b345781548b8201860152908301908801615b19565b8a016040019650505b509398975050505050505050565b805161534981615329565b5f8060408385031215615b67575f80fd5b82516001600160401b0380821115615b7d575f80fd5b9084019060608287031215615b90575f80fd5b615b986157f8565b82518152602080840151615bab816155b7565b82820152604084015183811115615bc0575f80fd5b80850194505087601f850112615bd4575f80fd5b83519250615be46158d984615850565b8381528882858701011115615bf7575f80fd5b615c0684838301848801615654565b80604084015250819550615c1b818801615b4b565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615d1e57615d1e615609565b505092915050565b5f6001600160401b0380831681810361599857615998615609565b5f808335601e19843603018112615d56575f80fd5b8301803591506001600160401b03821115615d6f575f80fd5b6020019150368190038213156124d3575f80fd5b601f821115611f0657805f5260205f20601f840160051c81016020851015615da85750805b601f840160051c820191505b81811015610b19575f8155600101615db4565b81516001600160401b03811115615de057615de06157e4565b615df481615dee8454615a89565b84615d83565b602080601f831160018114615e27575f8415615e105750858301515b5f19600386901b1c1916600185901b178555615e7e565b5f85815260208120601f198616915b82811015615e5557888601518255948401946001909101908401615e36565b5085821015615e7257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e96575f80fd5b6126fa82615541565b5f60208284031215615eaf575f80fd5b813560ff811681146126fa575f80fd5b5f60208284031215615ecf575f80fd5b81516126fa8161532956fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -501,37 +501,6 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WARPMESS return _ERC20TokenStakingManager.Contract.WARPMESSENGER(&_ERC20TokenStakingManager.CallOpts) } -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) ActiveValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { - var out []interface{} - err := _ERC20TokenStakingManager.contract.Call(opts, &out, "activeValidators", nodeID) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { - return _ERC20TokenStakingManager.Contract.ActiveValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { - return _ERC20TokenStakingManager.Contract.ActiveValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) -} - // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // // Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) @@ -594,6 +563,37 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) GetWeigh return _ERC20TokenStakingManager.Contract.GetWeight(&_ERC20TokenStakingManager.CallOpts, validationID) } +// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// +// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) RegisteredValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { + var out []interface{} + err := _ERC20TokenStakingManager.contract.Call(opts, &out, "registeredValidators", nodeID) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// +// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) RegisteredValidators(nodeID [32]byte) ([32]byte, error) { + return _ERC20TokenStakingManager.Contract.RegisteredValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) +} + +// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// +// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) RegisteredValidators(nodeID [32]byte) ([32]byte, error) { + return _ERC20TokenStakingManager.Contract.RegisteredValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) +} + // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. // // Solidity: function valueToWeight(uint256 value) pure returns(uint64) diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index dd5233204..35a771078 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -82,8 +82,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615da2380380615da283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c558061014d5f395ff3fe6080604052600436106101af575f3560e01c806366435abf116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104f8578063c974d1b61461050b578063d5f20ff61461051f578063df93d8de1461054b575f80fd5b8063b771b3bc146104a0578063ba3a4b97146104ba578063bee0a03f146104d9575f80fd5b80638280a25a116100c25780638280a25a1461042f57806393e245981461044357806398f3e2b414610462578063a3a65e4814610481575f80fd5b806366435abf146103de578063732214f8146103fd57806376f7862114610410575f80fd5b806335455ded116101525780635297fae61161012d5780635297fae61461035857806360305d621461037757806361e2f490146103a057806362065856146103bf575f80fd5b806335455ded146102fe57806340034a9314610326578063467ef06f14610339575f80fd5b8063151d30d11161018d578063151d30d11461025057806320e55565146102765780632e2194d814610295578063329c3e12146102cc575f80fd5b80630118acc4146101b35780630322ed98146101d45780630cdd0985146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd36600461500a565b610561565b005b3480156101df575f80fd5b506101d26101ee366004615045565b610a05565b3480156101fe575f80fd5b5061023d61020d366004615045565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b34801561025b575f80fd5b50610264600a81565b60405160ff9091168152602001610247565b348015610281575f80fd5b506101d261029036600461505c565b610bbe565b3480156102a0575f80fd5b506102b46102af366004615045565b610c9b565b6040516001600160401b039091168152602001610247565b3480156102d7575f80fd5b506102e66001600160991b0181565b6040516001600160a01b039091168152602001610247565b348015610309575f80fd5b5061031361271081565b60405161ffff9091168152602001610247565b61023d61033436600461509a565b610cb1565b348015610344575f80fd5b506101d26103533660046150ee565b610ce5565b348015610363575f80fd5b506101d2610372366004615107565b610d85565b348015610382575f80fd5b5061038b601481565b60405163ffffffff9091168152602001610247565b3480156103ab575f80fd5b506101d26103ba36600461512f565b610f5a565b3480156103ca575f80fd5b5061023d6103d936600461517d565b61158e565b3480156103e9575f80fd5b506102b46103f8366004615045565b6115a7565b348015610408575f80fd5b5061023d5f81565b34801561041b575f80fd5b506101d261042a36600461500a565b6115bb565b34801561043a575f80fd5b50610264603081565b34801561044e575f80fd5b506101d261045d366004615045565b6117fe565b34801561046d575f80fd5b506101d261047c366004615107565b611904565b34801561048c575f80fd5b506101d261049b3660046150ee565b611c28565b3480156104ab575f80fd5b506102e66005600160991b0181565b3480156104c5575f80fd5b506101d26104d4366004615045565b611de0565b3480156104e4575f80fd5b506101d26104f3366004615045565b612066565b61023d610506366004615045565b61217a565b348015610516575f80fd5b50610264601481565b34801561052a575f80fd5b5061053e610539366004615045565b6121ab565b60405161024791906151aa565b348015610556575f80fd5b506102b46202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba983398151915293929190829060ff1660048111156105c2576105c2615196565b60048111156105d3576105d3615196565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f610657826121ab565b905060028351600481111561066e5761066e615196565b146106c05760405162461bcd60e51b815260206004820152602a60248201525f80516020615bc98339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146107255760405162461bcd60e51b815260206004820152603360248201525f80516020615bc98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106b7565b6003835280515f90600290600581111561074157610741615196565b03610798578615610759576107568387612273565b90505b5f8460600151836080015161076e919061526d565b905061077a848261250f565b506001600160401b0390811660e0870152421660a0860152506107cc565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107ff866060015161158e565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561087c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a0919061528d565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108df576108df615196565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109f3916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c298339815191526020526040808220815160e0810190925280545f80516020615be983398151915293929190829060ff166005811115610a5257610a52615196565b6005811115610a6357610a63615196565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610ad257610ad2615196565b14610b375760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106b7565b6005600160991b016001600160a01b031663ee5b48eb610b5c8584606001515f612666565b6040518263ffffffff1660e01b8152600401610b7891906152c6565b6020604051808303815f875af1158015610b94573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb8919061528d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610c07575080546001600160401b03808416911610155b15610c255760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c4f8361288b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610cab64e8d4a51000836152f8565b92915050565b5f610cba61289f565b610cc6848484346128d6565b9050610cde60015f80516020615c0983398151915255565b9392505050565b5f80516020615ba98339815191525f80610cfe84612b53565b91509150610d0b82612e9d565b610d155750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d4357610d43615196565b03610d68575f83815260088501602052604081208054919055610d668282612ed8565b505b610d7e81610d79846040015161158e565b612f3e565b5050505050565b5f80516020615ba98339815191525f610d9d84612f51565b90505f80610dae8360400151613117565b50915091505f610dbd836121ab565b9050816001600160401b031681606001516001600160401b03161015610df55760405162461bcd60e51b81526004016106b790615317565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e3a5760405162461bcd60e51b81526004016106b790615359565b60015f87815260068701602052604090205460ff166004811115610e6057610e60615196565b14610ec95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106b7565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615be98339815191529060ff1615610ff75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106b7565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561103a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105e919061528d565b8360200135146110c05760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106b7565b306110d160608501604086016153b6565b6001600160a01b0316146111435760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106b7565b5f61115160608501856153d1565b91505f905084356020860135601461116f6060890160408a016153b6565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561149e575f6111ef60608901896153d1565b8363ffffffff1681811061120557611205615416565b9050602002810190611217919061542a565b611220906154da565b80515f81815260088901602052604090205491925090156112535760405162461bcd60e51b81526004016106b790615571565b84825f01518360200151846040015160405160200161127594939291906155b9565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112c39190615608565b602060405180830381855afa1580156112de573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611301919061528d565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff1916600183600581111561138d5761138d615196565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611440911686615619565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114979061562c565b90506111d3565b50600484018190555f6114b086612f51565b90505f6114c08260400151613352565b9050806002856040516114d39190615608565b602060405180830381855afa1580156114ee573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611511919061528d565b146115755760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106b7565b5050506009909201805460ff1916600117905550505050565b5f610cab6001600160401b03831664e8d4a5100061564e565b5f6115b1826121ab565b6080015192915050565b5f80516020615ba98339815191525f6115d3856134bb565b90506115de85612e9d565b6115e9575050505050565b5f8581526005830160205260409020546001600160a01b031633146116205760405162461bcd60e51b81526004016106b790615665565b5f85815260058301602052604090205460a082015161164f91600160b01b90046001600160401b0316906156b7565b6001600160401b03168160c001516001600160401b031610156116d05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106b7565b8315610d7e575f6116e18685612273565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117389061158e565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156117ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d2919061528d565b5f878152600885016020526040812080549091906117f1908490615619565b9091555050505050505050565b5f80516020615ba98339815191525f611816836121ab565b905060048151600581111561182d5761182d615196565b146118975760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106b7565b5f8381526005830160205260409020546001600160a01b031633146118ce5760405162461bcd60e51b81526004016106b790615665565b5f83815260088301602090815260408083208054908490556005860190925290912054610bb8906001600160a01b031682612ed8565b61190c61289f565b5f80516020615ba98339815191525f61192484612f51565b90505f806119358360400151613117565b50915091505f611944836121ab565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561197e5761197e615196565b600481111561198f5761198f615196565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a735760405162461bcd60e51b81526004016106b790615317565b826001600160401b03168160e001516001600160401b03161115611aa95760405162461bcd60e51b81526004016106b790615359565b600381516004811115611abe57611abe615196565b14611b125760405162461bcd60e51b815260206004820152603160248201525f80516020615bc98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106b7565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b5390600160a01b900461ffff168461564e565b611b5d91906152f8565b905080886008015f8881526020019081526020015f205f828254611b819190615619565b909155505f9050611b9282846156d7565b9050611ba2846020015182612ed8565b611bb78460200151610d79866060015161158e565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611bfd929190918252602082015260400190565b60405180910390a4505050505050505050611c2460015f80516020615c0983398151915255565b5050565b5f80516020615be98339815191525f611c4083612f51565b90505f80611c518360400151613736565b9150915080611cb35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106b7565b5f82815260068501602052604081208054611ccd906156ea565b9050118015611cff575060015f83815260078601602052604090205460ff166005811115611cfd57611cfd615196565b145b611d1b5760405162461bcd60e51b81526004016106b79061571c565b5f8281526006850160205260408120611d3391614f5f565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba983398151915293929190829060ff166004811115611e4157611e41615196565b6004811115611e5257611e52615196565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ed957611ed9615196565b1480611ef75750600381516004811115611ef557611ef5615196565b145b611f4b5760405162461bcd60e51b815260206004820152603260248201525f80516020615bc9833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106b7565b5f611f5982604001516121ab565b905080606001516001600160401b03165f03611fdd5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106b7565b6005600160991b016001600160a01b031663ee5b48eb61200a846040015184606001518560800151612666565b6040518263ffffffff1660e01b815260040161202691906152c6565b6020604051808303815f875af1158015612042573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7e919061528d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020615be98339815191529291906120ae906156ea565b90501180156120e0575060015f83815260078301602052604090205460ff1660058111156120de576120de615196565b145b6120fc5760405162461bcd60e51b81526004016106b79061571c565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916121359190600401615763565b6020604051808303815f875af1158015612151573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612175919061528d565b505050565b5f61218361289f565b61218e8233346138d7565b90506121a660015f80516020615c0983398151915255565b919050565b6121b3614f96565b5f8281525f80516020615c29833981519152602052604090819020815160e0810190925280545f80516020615be9833981519152929190829060ff16600581111561220057612200615196565b600581111561221157612211615196565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156122be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122e591908101906157f8565b91509150806123485760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106b7565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561238b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123af919061528d565b8251146124135760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106b7565b60208201516001600160a01b0316156124895760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106b7565b5f806124988460400151613c8e565b915091508187146125055760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106b7565b9695505050505050565b5f8281525f80516020615c29833981519152602052604081206002015481905f80516020615be983398151915290600160801b90046001600160401b03166125578582613e66565b5f61256187614074565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125b18a858b612666565b6040518263ffffffff1660e01b81526004016125cd91906152c6565b6020604051808303815f875af11580156125e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061260d919061528d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126df5761269f8160016156d7565b6126aa90600861564e565b5081515f908390839081106126c1576126c1615416565b60200101906001600160f81b03191690815f1a90535060010161268b565b505f5b600481101561274a576126f68160036156d7565b61270190600861564e565b600263ffffffff16901c60f81b8282600261271c9190615619565b8151811061272c5761272c615416565b60200101906001600160f81b03191690815f1a9053506001016126e2565b505f5b60208110156127ac5761276181601f6156d7565b61276c90600861564e565b86901c60f81b8261277e836006615619565b8151811061278e5761278e615416565b60200101906001600160f81b03191690815f1a90535060010161274d565b505f5b6008811015612817576127c38160076156d7565b6127ce90600861564e565b6001600160401b038616901c60f81b826127e9836026615619565b815181106127f9576127f9615416565b60200101906001600160f81b03191690815f1a9053506001016127af565b505f5b60088110156128825761282e8160076156d7565b61283990600861564e565b6001600160401b038516901c60f81b8261285483602e615619565b8151811061286457612864615416565b60200101906001600160f81b03191690815f1a90535060010161281a565b50949350505050565b612893614104565b61289c8161414f565b50565b5f80516020615c098339815191528054600119016128d057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ba98339815191529061ffff861610801590612922575061271061ffff861611155b61293e5760405162461bcd60e51b81526004016106b7906158ca565b60028101546001600160401b0390811690851610156129b75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106b7565b8054831015612a1a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106b7565b8060010154831115612a815760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106b7565b825f612a8c82610c9b565b90505f612a9989836141c1565b90506040518060600160405280612aad3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c0983398151915255565b5f612b5c614f96565b5f80516020615be98339815191525f612b7485612f51565b90505f80612b858360400151613736565b915091508015612bea5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106b7565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612c1b57612c1b615196565b6005811115612c2c57612c2c615196565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c9d57612c9d615196565b1480612cbb5750600182516005811115612cb957612cb9615196565b145b612d1a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106b7565b600382516005811115612d2f57612d2f615196565b03612d3c57506004612d40565b5060055b6020808301515f90815260088801909152604081205581816005811115612d6957612d69615196565b90816005811115612d7c57612d7c615196565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115612db057612db0615196565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e6457612e64615196565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612f24575f80fd5b505af1158015612f36573d5f803e3d5ffd5b505050505050565b611c246001600160a01b03831682614725565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612fb5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fdc91908101906157f8565b915091508061303c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106b7565b81511561309d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106b7565b60208201516001600160a01b0316156131105760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106b7565b5092915050565b5f805f835160361461313b5760405162461bcd60e51b81526004016106b790615915565b5f805b600281101561318a576131528160016156d7565b61315d90600861564e565b61ffff1686828151811061317357613173615416565b016020015160f81c901b919091179060010161313e565b5061ffff8116156131ad5760405162461bcd60e51b81526004016106b79061595e565b5f805b6004811015613208576131c48160036156d7565b6131cf90600861564e565b63ffffffff16876131e1836002615619565b815181106131f1576131f1615416565b016020015160f81c901b91909117906001016131b0565b5063ffffffff811660041461322f5760405162461bcd60e51b81526004016106b7906159a1565b5f805b60208110156132845761324681601f6156d7565b61325190600861564e565b8861325d836006615619565b8151811061326d5761326d615416565b016020015160f81c901b9190911790600101613232565b505f805b60088110156132e35761329c8160076156d7565b6132a790600861564e565b6001600160401b0316896132bc836026615619565b815181106132cc576132cc615416565b016020015160f81c901b9190911790600101613288565b505f805b6008811015613342576132fb8160076156d7565b61330690600861564e565b6001600160401b03168a61331b83602e615619565b8151811061332b5761332b615416565b016020015160f81c901b91909117906001016132e7565b5091989097509095509350505050565b5f81516026146133745760405162461bcd60e51b81526004016106b790615915565b5f805b60028110156133c35761338b8160016156d7565b61339690600861564e565b61ffff168482815181106133ac576133ac615416565b016020015160f81c901b9190911790600101613377565b5061ffff8116156133e65760405162461bcd60e51b81526004016106b79061595e565b5f805b6004811015613441576133fd8160036156d7565b61340890600861564e565b63ffffffff168561341a836002615619565b8151811061342a5761342a615416565b016020015160f81c901b91909117906001016133e9565b5063ffffffff8116156134665760405162461bcd60e51b81526004016106b7906159a1565b5f805b60208110156128825761347d81601f6156d7565b61348890600861564e565b86613494836006615619565b815181106134a4576134a4615416565b016020015160f81c901b9190911790600101613469565b6134c3614f96565b5f8281525f80516020615c298339815191526020526040808220815160e0810190925280545f80516020615be983398151915293929190829060ff16600581111561351057613510615196565b600581111561352157613521615196565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561359357613593615196565b146135ef5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106b7565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561363357613633615196565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136df858261250f565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137595760405162461bcd60e51b81526004016106b790615915565b5f805b60028110156137a8576137708160016156d7565b61377b90600861564e565b61ffff1685828151811061379157613791615416565b016020015160f81c901b919091179060010161375c565b5061ffff8116156137cb5760405162461bcd60e51b81526004016106b79061595e565b5f805b6004811015613826576137e28160036156d7565b6137ed90600861564e565b63ffffffff16866137ff836002615619565b8151811061380f5761380f615416565b016020015160f81c901b91909117906001016137ce565b5063ffffffff811660031461384d5760405162461bcd60e51b81526004016106b7906159a1565b5f805b60208110156138a25761386481601f6156d7565b61386f90600861564e565b8761387b836006615619565b8151811061388b5761388b615416565b016020015160f81c901b9190911790600101613850565b505f866026815181106138b7576138b7615416565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ba9833981519152816138f084610c9b565b90505f6138fc876121ab565b905061390787612e9d565b6139645760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106b7565b60028151600581111561397957613979615196565b146139d85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106b7565b5f8282608001516139e991906156b7565b60048501546040840151919250613a0b916001600160401b03909116906159e8565b6001600160401b0316816001600160401b03161115613a8a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106b7565b5f80613a968a8461250f565b915091505f8a83604051602001613ac492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b5f57613b5f615196565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613cb15760405162461bcd60e51b81526004016106b790615915565b5f805b6002811015613d0057613cc88160016156d7565b613cd390600861564e565b61ffff16858281518110613ce957613ce9615416565b016020015160f81c901b9190911790600101613cb4565b5061ffff811615613d235760405162461bcd60e51b81526004016106b79061595e565b5f805b6004811015613d7e57613d3a8160036156d7565b613d4590600861564e565b63ffffffff1686613d57836002615619565b81518110613d6757613d67615416565b016020015160f81c901b9190911790600101613d26565b5063ffffffff8116600514613da55760405162461bcd60e51b81526004016106b7906159a1565b5f805b6020811015613dfa57613dbc81601f6156d7565b613dc790600861564e565b87613dd3836006615619565b81518110613de357613de3615416565b016020015160f81c901b9190911790600101613da8565b505f805b6008811015613e5957613e128160076156d7565b613e1d90600861564e565b6001600160401b031688613e32836026615619565b81518110613e4257613e42615416565b016020015160f81c901b9190911790600101613dfe565b5090969095509350505050565b5f80516020615be98339815191525f6001600160401b038084169085161115613e9a57613e93838561526d565b9050613ea7565b613ea4848461526d565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613f09575060018401548151613f05916001600160401b031690615619565b8210155b15613f2f576001600160401b038316606082015281815260408101516020820152613f4e565b8281606001818151613f4191906156b7565b6001600160401b03169052505b6060810151613f5e9060646159e8565b602082015160018601546001600160401b039290921691613f899190600160401b900460ff1661564e565b1015613fed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106b7565b856001600160401b0316816040018181516140089190615619565b9052506040810180516001600160401b03871691906140289083906156d7565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c298339815191526020526040812060020180545f80516020615be983398151915291600160401b9091046001600160401b03169060086140be83615a13565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661414d57604051631afcd79f60e31b815260040160405180910390fd5b565b614157614104565b614160816147b8565b6141686147d1565b61289c6060820135608083013561418560c0850160a0860161517d565b61419560e0860160c08701615a2e565b61ffff166141aa610100870160e08801615a47565b6141bc610120880161010089016153b6565b6147e1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661424c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106b7565b5f80516020615be98339815191524261426b604086016020870161517d565b6001600160401b0316116142dd5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106b7565b6142ed604085016020860161517d565b6001600160401b03166143036202a30042615619565b116143765760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106b7565b83356143ce5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106b7565b83355f908152600882016020526040902054156143fd5760405162461bcd60e51b81526004016106b790615571565b603061440c6040860186615a67565b9050146144715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106b7565b61447b835f613e66565b5f806145146040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906144bf919061517d565b6001600160401b031681526020016144da60408a018a615a67565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a25565b5f828152600686016020526040902091935091506145328282615aed565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061455f9085906004016152c6565b6020604051808303815f875af115801561457b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061459f919061528d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561461757614617615196565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146f7918e01908e0161517d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147485760405163cd78605960e01b81523060048201526024016106b7565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614791576040519150601f19603f3d011682016040523d82523d5f602084013e614796565b606091505b505090508061217557604051630a12f52160e11b815260040160405180910390fd5b6147c0614104565b6147c8614dd4565b61289c81614ddc565b6147d9614104565b61414d614f57565b6147e9614104565b5f80516020615ba9833981519152836148555760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106b7565b6127108411156148775760405162461bcd60e51b81526004016106b7906158ca565b858711156148df5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106b7565b5f8360ff161161494c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106b7565b600a60ff841611156149be5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106b7565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a8f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106b7565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614b0657614ac68160016156d7565b614ad190600861564e565b5081515f90839083908110614ae857614ae8615416565b60200101906001600160f81b03191690815f1a905350600101614ab2565b505f5b6004811015614b6e57614b1d8160036156d7565b614b2890600861564e565b600160ff919091161c60f81b82614b40836002615619565b81518110614b5057614b50615416565b60200101906001600160f81b03191690815f1a905350600101614b09565b505f5b6020811015614bcb5784518160208110614b8d57614b8d615416565b1a60f81b82614b9d836006615619565b81518110614bad57614bad615416565b60200101906001600160f81b03191690815f1a905350600101614b71565b505f5b6020811015614c2b5784602001518160208110614bed57614bed615416565b1a60f81b82614bfd836026615619565b81518110614c0d57614c0d615416565b60200101906001600160f81b03191690815f1a905350600101614bce565b505f5b6008811015614c9f57614c428160076156d7565b614c4d90600861564e565b60ff1685604001516001600160401b0316901c60f81b82826046614c719190615619565b81518110614c8157614c81615416565b60200101906001600160f81b03191690815f1a905350600101614c2e565b505f5b6030811015614d0a5784608001518181518110614cc157614cc1615416565b01602001516001600160f81b03191682614cdc83604e615619565b81518110614cec57614cec615416565b60200101906001600160f81b03191690815f1a905350600101614ca2565b505f5b6008811015614d7c57614d218160076156d7565b614d2c90600861564e565b60608601516001600160401b0390811691161c60f81b82614d4e83607e615619565b81518110614d5e57614d5e615416565b60200101906001600160f81b03191690815f1a905350600101614d0d565b50600281604051614d8d9190615608565b602060405180830381855afa158015614da8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614dcb919061528d565b94909350915050565b61414d614104565b614de4614104565b80355f80516020615be98339815191529081556014614e096060840160408501615a47565b60ff161115614e765760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106b7565b5f614e876060840160408501615a47565b60ff1611614eef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106b7565b614eff6060830160408401615a47565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f30604083016020840161517d565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b40614104565b508054614f6b906156ea565b5f825580601f10614f7a575050565b601f0160209004905f5260205f209081019061289c9190614fd2565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fe6575f8155600101614fd3565b5090565b801515811461289c575f80fd5b803563ffffffff811681146121a6575f80fd5b5f805f6060848603121561501c575f80fd5b83359250602084013561502e81614fea565b915061503c60408501614ff7565b90509250925092565b5f60208284031215615055575f80fd5b5035919050565b5f610120828403121561506d575f80fd5b50919050565b803561ffff811681146121a6575f80fd5b80356001600160401b03811681146121a6575f80fd5b5f805f606084860312156150ac575f80fd5b83356001600160401b038111156150c1575f80fd5b8401606081870312156150d2575f80fd5b92506150e060208501615073565b915061503c60408501615084565b5f602082840312156150fe575f80fd5b610cde82614ff7565b5f8060408385031215615118575f80fd5b61512183614ff7565b946020939093013593505050565b5f8060408385031215615140575f80fd5b82356001600160401b03811115615155575f80fd5b830160808186031215615166575f80fd5b915061517460208401614ff7565b90509250929050565b5f6020828403121561518d575f80fd5b610cde82615084565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151cd57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161520860608401826001600160401b03169052565b50608083015161522360808401826001600160401b03169052565b5060a083015161523e60a08401826001600160401b03169052565b5060c083015161311060c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561311057613110615259565b5f6020828403121561529d575f80fd5b5051919050565b5f5b838110156152be5781810151838201526020016152a6565b50505f910152565b602081525f82518060208401526152e48160408501602087016152a4565b601f01601f19169190910160400192915050565b5f8261531257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461289c575f80fd5b5f602082840312156153c6575f80fd5b8135610cde816153a2565b5f808335601e198436030181126153e6575f80fd5b8301803591506001600160401b038211156153ff575f80fd5b6020019150600581901b360382131561265f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261543e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561547e5761547e615448565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154ac576154ac615448565b604052919050565b5f6001600160401b038211156154cc576154cc615448565b50601f01601f191660200190565b5f606082360312156154ea575f80fd5b6154f261545c565b823581526020615503818501615084565b8183015260408401356001600160401b0381111561551f575f80fd5b840136601f82011261552f575f80fd5b803561554261553d826154b4565b615484565b8181523684838501011115615555575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155ca818460208a016152a4565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155fa8160288401602088016152a4565b016028019695505050505050565b5f825161543e8184602087016152a4565b80820180821115610cab57610cab615259565b5f63ffffffff80831681810361564457615644615259565b6001019392505050565b8082028115828204841417610cab57610cab615259565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561311057613110615259565b81810381811115610cab57610cab615259565b600181811c908216806156fe57607f821691505b60208210810361506d57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615775816156ea565b806020870152604060018084165f811461579657600181146157b2576157df565b60ff19851660408a0152604084151560051b8a010195506157df565b895f5260205f205f5b858110156157d65781548b82018601529083019088016157bb565b8a016040019650505b509398975050505050505050565b80516121a681614fea565b5f8060408385031215615809575f80fd5b82516001600160401b038082111561581f575f80fd5b9084019060608287031215615832575f80fd5b61583a61545c565b8251815260208084015161584d816153a2565b82820152604084015183811115615862575f80fd5b80850194505087601f850112615876575f80fd5b8351925061588661553d846154b4565b8381528882858701011115615899575f80fd5b6158a8848383018488016152a4565b806040840152508195506158bd8188016157ed565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0b57615a0b615259565b505092915050565b5f6001600160401b0380831681810361564457615644615259565b5f60208284031215615a3e575f80fd5b610cde82615073565b5f60208284031215615a57575f80fd5b813560ff81168114610cde575f80fd5b5f808335601e19843603018112615a7c575f80fd5b8301803591506001600160401b03821115615a95575f80fd5b60200191503681900382131561265f575f80fd5b601f82111561217557805f5260205f20601f840160051c81016020851015615ace5750805b601f840160051c820191505b81811015610d7e575f8155600101615ada565b81516001600160401b03811115615b0657615b06615448565b615b1a81615b1484546156ea565b84615aa9565b602080601f831160018114615b4d575f8415615b365750858301515b5f19600386901b1c1916600185901b178555612f36565b5f85815260208120601f198616915b82811015615b7b57888601518255948401946001909101908401615b5c565b5085821015615b9857878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051615dbe380380615dbe83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c718061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd3660046150b5565b610561565b005b3480156101df575f80fd5b506101d26101ee3660046150f0565b610a05565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d2610238366004615107565b610bbe565b348015610248575f80fd5b5061025c6102573660046150f0565b610c9b565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc366004615145565b610cb1565b604051908152602001610215565b3480156102fa575f80fd5b506101d2610309366004615199565b610ce5565b348015610319575f80fd5b506101d26103283660046151b2565b610d85565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d26103703660046151da565b610f5a565b348015610380575f80fd5b506102e161038f366004615228565b6115d3565b34801561039f575f80fd5b5061025c6103ae3660046150f0565b6115ec565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e03660046150b5565b611600565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d26104133660046150f0565b611843565b348015610423575f80fd5b506101d26104323660046151b2565b611949565b348015610442575f80fd5b506101d2610451366004615199565b611c6d565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a3660046150f0565b611de3565b34801561049a575f80fd5b506101d26104a93660046150f0565b612069565b6102e16104bc3660046150f0565b612144565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef3660046150f0565b612175565b6040516102159190615255565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e16105313660046150f0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc583398151915293929190829060ff1660048111156105c2576105c2615241565b60048111156105d3576105d3615241565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61065782612175565b905060028351600481111561066e5761066e615241565b146106c05760405162461bcd60e51b815260206004820152602a60248201525f80516020615be58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146107255760405162461bcd60e51b815260206004820152603360248201525f80516020615be58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106b7565b6003835280515f90600290600581111561074157610741615241565b0361079857861561075957610756838761223d565b90505b5f8460600151836080015161076e9190615318565b905061077a84826124d9565b506001600160401b0390811660e0870152421660a0860152506107cc565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107ff86606001516115d3565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561087c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a09190615338565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108df576108df615241565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109f3916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c458339815191526020526040808220815160e0810190925280545f80516020615c0583398151915293929190829060ff166005811115610a5257610a52615241565b6005811115610a6357610a63615241565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610ad257610ad2615241565b14610b375760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106b7565b6005600160991b016001600160a01b031663ee5b48eb610b5c8584606001515f612630565b6040518263ffffffff1660e01b8152600401610b789190615371565b6020604051808303815f875af1158015610b94573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb89190615338565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610c07575080546001600160401b03808416911610155b15610c255760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c4f83612855565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610cab64e8d4a51000836153a3565b92915050565b5f610cba612869565b610cc6848484346128a0565b9050610cde60015f80516020615c2583398151915255565b9392505050565b5f80516020615bc58339815191525f80610cfe84612b94565b91509150610d0b82612eb2565b610d155750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d4357610d43615241565b03610d68575f83815260088501602052604081208054919055610d668282612eed565b505b610d7e81610d7984604001516115d3565b612f53565b5050505050565b5f80516020615bc58339815191525f610d9d84612f66565b90505f80610dae836040015161312c565b50915091505f610dbd83612175565b9050816001600160401b031681606001516001600160401b03161015610df55760405162461bcd60e51b81526004016106b7906153c2565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e3a5760405162461bcd60e51b81526004016106b790615404565b60015f87815260068701602052604090205460ff166004811115610e6057610e60615241565b14610ec95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106b7565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615c058339815191529060ff1615610ff75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106b7565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561103a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105e9190615338565b8360200135146110c05760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106b7565b306110d16060850160408601615461565b6001600160a01b0316146111435760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106b7565b5f611151606085018561547c565b91505f905084356020860135601461116f6060890160408a01615461565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156114e3575f6111ef606089018961547c565b8363ffffffff16818110611205576112056154c1565b905060200281019061121791906154d5565b61122090615585565b80515f81815260088901602052604090205491925090156112985760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106b7565b84825f0151836020015184604001516040516020016112ba949392919061561c565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291611308919061566b565b602060405180830381855afa158015611323573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113469190615338565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff191660018360058111156113d2576113d2615241565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161148591168661567c565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114dc9061568f565b90506111d3565b50600484018190555f6114f586612f66565b90505f6115058260400151613367565b905080600285604051611518919061566b565b602060405180830381855afa158015611533573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115569190615338565b146115ba5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106b7565b5050506009909201805460ff1916600117905550505050565b5f610cab6001600160401b03831664e8d4a510006156b1565b5f6115f682612175565b6080015192915050565b5f80516020615bc58339815191525f611618856134d0565b905061162385612eb2565b61162e575050505050565b5f8581526005830160205260409020546001600160a01b031633146116655760405162461bcd60e51b81526004016106b7906156c8565b5f85815260058301602052604090205460a082015161169491600160b01b90046001600160401b03169061571a565b6001600160401b03168160c001516001600160401b031610156117155760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106b7565b8315610d7e575f611726868561223d565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061177d906115d3565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156117f3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118179190615338565b5f8781526008850160205260408120805490919061183690849061567c565b9091555050505050505050565b5f80516020615bc58339815191525f61185b83612175565b905060048151600581111561187257611872615241565b146118dc5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106b7565b5f8381526005830160205260409020546001600160a01b031633146119135760405162461bcd60e51b81526004016106b7906156c8565b5f83815260088301602090815260408083208054908490556005860190925290912054610bb8906001600160a01b031682612eed565b611951612869565b5f80516020615bc58339815191525f61196984612f66565b90505f8061197a836040015161312c565b50915091505f61198983612175565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119c3576119c3615241565b60048111156119d4576119d4615241565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611ab85760405162461bcd60e51b81526004016106b7906153c2565b826001600160401b03168160e001516001600160401b03161115611aee5760405162461bcd60e51b81526004016106b790615404565b600381516004811115611b0357611b03615241565b14611b575760405162461bcd60e51b815260206004820152603160248201525f80516020615be58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106b7565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b9890600160a01b900461ffff16846156b1565b611ba291906153a3565b905080886008015f8881526020019081526020015f205f828254611bc6919061567c565b909155505f9050611bd7828461573a565b9050611be7846020015182612eed565b611bfc8460200151610d7986606001516115d3565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611c42929190918252602082015260400190565b60405180910390a4505050505050505050611c6960015f80516020615c2583398151915255565b5050565b5f80516020615c058339815191525f611c8583612f66565b90505f80611c96836040015161374b565b9150915080611cf85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106b7565b60015f83815260078601602052604090205460ff166005811115611d1e57611d1e615241565b14611d3b5760405162461bcd60e51b81526004016106b79061574d565b5f8281526006850160205260408120611d539161500a565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc583398151915293929190829060ff166004811115611e4457611e44615241565b6004811115611e5557611e55615241565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611edc57611edc615241565b1480611efa5750600381516004811115611ef857611ef8615241565b145b611f4e5760405162461bcd60e51b815260206004820152603260248201525f80516020615be5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106b7565b5f611f5c8260400151612175565b905080606001516001600160401b03165f03611fe05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106b7565b6005600160991b016001600160a01b031663ee5b48eb61200d846040015184606001518560800151612630565b6040518263ffffffff1660e01b81526004016120299190615371565b6020604051808303815f875af1158015612045573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7e9190615338565b5f8181525f80516020615c4583398151915260205260409020545f80516020615c058339815191529060019060ff1660058111156120a9576120a9615241565b146120c65760405162461bcd60e51b81526004016106b79061574d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120ff91906004016157ca565b6020604051808303815f875af115801561211b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061213f9190615338565b505050565b5f61214d612869565b6121588233346138ec565b905061217060015f80516020615c2583398151915255565b919050565b61217d615041565b5f8281525f80516020615c45833981519152602052604090819020815160e0810190925280545f80516020615c05833981519152929190829060ff1660058111156121ca576121ca615241565b60058111156121db576121db615241565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612288573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122af919081019061585f565b91509150806123125760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106b7565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612355573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123799190615338565b8251146123dd5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106b7565b60208201516001600160a01b0316156124535760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106b7565b5f806124628460400151613ca3565b915091508187146124cf5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106b7565b9695505050505050565b5f8281525f80516020615c45833981519152602052604081206002015481905f80516020615c0583398151915290600160801b90046001600160401b03166125218582613e7b565b5f61252b87614089565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61257b8a858b612630565b6040518263ffffffff1660e01b81526004016125979190615371565b6020604051808303815f875af11580156125b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d79190615338565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126a95761266981600161573a565b6126749060086156b1565b5081515f9083908390811061268b5761268b6154c1565b60200101906001600160f81b03191690815f1a905350600101612655565b505f5b6004811015612714576126c081600361573a565b6126cb9060086156b1565b600263ffffffff16901c60f81b828260026126e6919061567c565b815181106126f6576126f66154c1565b60200101906001600160f81b03191690815f1a9053506001016126ac565b505f5b60208110156127765761272b81601f61573a565b6127369060086156b1565b86901c60f81b8261274883600661567c565b81518110612758576127586154c1565b60200101906001600160f81b03191690815f1a905350600101612717565b505f5b60088110156127e15761278d81600761573a565b6127989060086156b1565b6001600160401b038616901c60f81b826127b383602661567c565b815181106127c3576127c36154c1565b60200101906001600160f81b03191690815f1a905350600101612779565b505f5b600881101561284c576127f881600761573a565b6128039060086156b1565b6001600160401b038516901c60f81b8261281e83602e61567c565b8151811061282e5761282e6154c1565b60200101906001600160f81b03191690815f1a9053506001016127e4565b50949350505050565b61285d614119565b61286681614164565b50565b5f80516020615c2583398151915280546001190161289a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bc58339815191529061ffff861610156129275760405162461bcd60e51b815260206004820152602b60248201525f80516020615be583398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106b7565b61271061ffff8616111561297f5760405162461bcd60e51b815260206004820152602c60248201525f80516020615be583398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106b7565b60028101546001600160401b0390811690851610156129f85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106b7565b8054831015612a5b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106b7565b8060010154831115612ac25760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106b7565b825f612acd82610c9b565b90505f612ada89836141d6565b90506040518060600160405280612aee3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c2583398151915255565b5f612b9d615041565b5f80516020615c058339815191525f612bb585612f66565b90505f80612bc6836040015161374b565b915091508015612c2b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106b7565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612c5c57612c5c615241565b6005811115612c6d57612c6d615241565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612cdc57612cdc615241565b1480612cfa5750600181516005811115612cf857612cf8615241565b145b612d595760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106b7565b600381516005811115612d6e57612d6e615241565b03612d7c5760048152612d81565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612dc657612dc6615241565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612e7a57612e7a615241565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612f39575f80fd5b505af1158015612f4b573d5f803e3d5ffd5b505050505050565b611c696001600160a01b0383168261478c565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612fca573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ff1919081019061585f565b91509150806130515760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106b7565b8151156130b25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106b7565b60208201516001600160a01b0316156131255760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106b7565b5092915050565b5f805f83516036146131505760405162461bcd60e51b81526004016106b790615931565b5f805b600281101561319f5761316781600161573a565b6131729060086156b1565b61ffff16868281518110613188576131886154c1565b016020015160f81c901b9190911790600101613153565b5061ffff8116156131c25760405162461bcd60e51b81526004016106b79061597a565b5f805b600481101561321d576131d981600361573a565b6131e49060086156b1565b63ffffffff16876131f683600261567c565b81518110613206576132066154c1565b016020015160f81c901b91909117906001016131c5565b5063ffffffff81166004146132445760405162461bcd60e51b81526004016106b7906159bd565b5f805b60208110156132995761325b81601f61573a565b6132669060086156b1565b8861327283600661567c565b81518110613282576132826154c1565b016020015160f81c901b9190911790600101613247565b505f805b60088110156132f8576132b181600761573a565b6132bc9060086156b1565b6001600160401b0316896132d183602661567c565b815181106132e1576132e16154c1565b016020015160f81c901b919091179060010161329d565b505f805b60088110156133575761331081600761573a565b61331b9060086156b1565b6001600160401b03168a61333083602e61567c565b81518110613340576133406154c1565b016020015160f81c901b91909117906001016132fc565b5091989097509095509350505050565b5f81516026146133895760405162461bcd60e51b81526004016106b790615931565b5f805b60028110156133d8576133a081600161573a565b6133ab9060086156b1565b61ffff168482815181106133c1576133c16154c1565b016020015160f81c901b919091179060010161338c565b5061ffff8116156133fb5760405162461bcd60e51b81526004016106b79061597a565b5f805b60048110156134565761341281600361573a565b61341d9060086156b1565b63ffffffff168561342f83600261567c565b8151811061343f5761343f6154c1565b016020015160f81c901b91909117906001016133fe565b5063ffffffff81161561347b5760405162461bcd60e51b81526004016106b7906159bd565b5f805b602081101561284c5761349281601f61573a565b61349d9060086156b1565b866134a983600661567c565b815181106134b9576134b96154c1565b016020015160f81c901b919091179060010161347e565b6134d8615041565b5f8281525f80516020615c458339815191526020526040808220815160e0810190925280545f80516020615c0583398151915293929190829060ff16600581111561352557613525615241565b600581111561353657613536615241565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156135a8576135a8615241565b146136045760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106b7565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561364857613648615241565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136f485826124d9565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461376e5760405162461bcd60e51b81526004016106b790615931565b5f805b60028110156137bd5761378581600161573a565b6137909060086156b1565b61ffff168582815181106137a6576137a66154c1565b016020015160f81c901b9190911790600101613771565b5061ffff8116156137e05760405162461bcd60e51b81526004016106b79061597a565b5f805b600481101561383b576137f781600361573a565b6138029060086156b1565b63ffffffff168661381483600261567c565b81518110613824576138246154c1565b016020015160f81c901b91909117906001016137e3565b5063ffffffff81166003146138625760405162461bcd60e51b81526004016106b7906159bd565b5f805b60208110156138b75761387981601f61573a565b6138849060086156b1565b8761389083600661567c565b815181106138a0576138a06154c1565b016020015160f81c901b9190911790600101613865565b505f866026815181106138cc576138cc6154c1565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615bc58339815191528161390584610c9b565b90505f61391187612175565b905061391c87612eb2565b6139795760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106b7565b60028151600581111561398e5761398e615241565b146139ed5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106b7565b5f8282608001516139fe919061571a565b60048501546040840151919250613a20916001600160401b0390911690615a04565b6001600160401b0316816001600160401b03161115613a9f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106b7565b5f80613aab8a846124d9565b915091505f8a83604051602001613ad992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b7457613b74615241565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613cc65760405162461bcd60e51b81526004016106b790615931565b5f805b6002811015613d1557613cdd81600161573a565b613ce89060086156b1565b61ffff16858281518110613cfe57613cfe6154c1565b016020015160f81c901b9190911790600101613cc9565b5061ffff811615613d385760405162461bcd60e51b81526004016106b79061597a565b5f805b6004811015613d9357613d4f81600361573a565b613d5a9060086156b1565b63ffffffff1686613d6c83600261567c565b81518110613d7c57613d7c6154c1565b016020015160f81c901b9190911790600101613d3b565b5063ffffffff8116600514613dba5760405162461bcd60e51b81526004016106b7906159bd565b5f805b6020811015613e0f57613dd181601f61573a565b613ddc9060086156b1565b87613de883600661567c565b81518110613df857613df86154c1565b016020015160f81c901b9190911790600101613dbd565b505f805b6008811015613e6e57613e2781600761573a565b613e329060086156b1565b6001600160401b031688613e4783602661567c565b81518110613e5757613e576154c1565b016020015160f81c901b9190911790600101613e13565b5090969095509350505050565b5f80516020615c058339815191525f6001600160401b038084169085161115613eaf57613ea88385615318565b9050613ebc565b613eb98484615318565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613f1e575060018401548151613f1a916001600160401b03169061567c565b8210155b15613f44576001600160401b038316606082015281815260408101516020820152613f63565b8281606001818151613f56919061571a565b6001600160401b03169052505b6060810151613f73906064615a04565b602082015160018601546001600160401b039290921691613f9e9190600160401b900460ff166156b1565b10156140025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106b7565b856001600160401b03168160400181815161401d919061567c565b9052506040810180516001600160401b038716919061403d90839061573a565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c458339815191526020526040812060020180545f80516020615c0583398151915291600160401b9091046001600160401b03169060086140d383615a2f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661416257604051631afcd79f60e31b815260040160405180910390fd5b565b61416c614119565b6141758161481f565b61417d614838565b6128666060820135608083013561419a60c0850160a08601615228565b6141aa60e0860160c08701615a4a565b61ffff166141bf610100870160e08801615a63565b6141d161012088016101008901615461565b614848565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166142615760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106b7565b5f80516020615c05833981519152426142806040860160208701615228565b6001600160401b0316116142f25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106b7565b6143026040850160208601615228565b6001600160401b03166143186202a3004261567c565b1161438b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106b7565b83356143e35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106b7565b83355f908152600882016020526040902054156144535760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106b7565b60306144626040860186615a83565b9050146144c75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106b7565b6144d1835f613e7b565b5f8061456a6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906145159190615228565b6001600160401b0316815260200161453060408a018a615a83565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614ad0565b5f828152600686016020526040902091935091506145888282615b09565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906145c6908590600401615371565b6020604051808303815f875af11580156145e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146069190615338565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561467e5761467e615241565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161475e918e01908e01615228565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147af5760405163cd78605960e01b81523060048201526024016106b7565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146147f8576040519150601f19603f3d011682016040523d82523d5f602084013e6147fd565b606091505b505090508061213f57604051630a12f52160e11b815260040160405180910390fd5b614827614119565b61482f614e7f565b61286681614e87565b614840614119565b614162615002565b614850614119565b5f80516020615bc5833981519152836148bc5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106b7565b6127108411156149225760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106b7565b8587111561498a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106b7565b5f8360ff16116149f75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106b7565b600a60ff84161115614a695760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106b7565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614b3a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106b7565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614bb157614b7181600161573a565b614b7c9060086156b1565b5081515f90839083908110614b9357614b936154c1565b60200101906001600160f81b03191690815f1a905350600101614b5d565b505f5b6004811015614c1957614bc881600361573a565b614bd39060086156b1565b600160ff919091161c60f81b82614beb83600261567c565b81518110614bfb57614bfb6154c1565b60200101906001600160f81b03191690815f1a905350600101614bb4565b505f5b6020811015614c765784518160208110614c3857614c386154c1565b1a60f81b82614c4883600661567c565b81518110614c5857614c586154c1565b60200101906001600160f81b03191690815f1a905350600101614c1c565b505f5b6020811015614cd65784602001518160208110614c9857614c986154c1565b1a60f81b82614ca883602661567c565b81518110614cb857614cb86154c1565b60200101906001600160f81b03191690815f1a905350600101614c79565b505f5b6008811015614d4a57614ced81600761573a565b614cf89060086156b1565b60ff1685604001516001600160401b0316901c60f81b82826046614d1c919061567c565b81518110614d2c57614d2c6154c1565b60200101906001600160f81b03191690815f1a905350600101614cd9565b505f5b6030811015614db55784608001518181518110614d6c57614d6c6154c1565b01602001516001600160f81b03191682614d8783604e61567c565b81518110614d9757614d976154c1565b60200101906001600160f81b03191690815f1a905350600101614d4d565b505f5b6008811015614e2757614dcc81600761573a565b614dd79060086156b1565b60608601516001600160401b0390811691161c60f81b82614df983607e61567c565b81518110614e0957614e096154c1565b60200101906001600160f81b03191690815f1a905350600101614db8565b50600281604051614e38919061566b565b602060405180830381855afa158015614e53573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e769190615338565b94909350915050565b614162614119565b614e8f614119565b80355f80516020615c058339815191529081556014614eb46060840160408501615a63565b60ff161115614f215760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106b7565b5f614f326060840160408501615a63565b60ff1611614f9a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106b7565b614faa6060830160408401615a63565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614fdb6040830160208401615228565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b81614119565b50805461501690615798565b5f825580601f10615025575050565b601f0160209004905f5260205f2090810190612866919061507d565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615091575f815560010161507e565b5090565b8015158114612866575f80fd5b803563ffffffff81168114612170575f80fd5b5f805f606084860312156150c7575f80fd5b8335925060208401356150d981615095565b91506150e7604085016150a2565b90509250925092565b5f60208284031215615100575f80fd5b5035919050565b5f6101208284031215615118575f80fd5b50919050565b803561ffff81168114612170575f80fd5b80356001600160401b0381168114612170575f80fd5b5f805f60608486031215615157575f80fd5b83356001600160401b0381111561516c575f80fd5b84016060818703121561517d575f80fd5b925061518b6020850161511e565b91506150e76040850161512f565b5f602082840312156151a9575f80fd5b610cde826150a2565b5f80604083850312156151c3575f80fd5b6151cc836150a2565b946020939093013593505050565b5f80604083850312156151eb575f80fd5b82356001600160401b03811115615200575f80fd5b830160808186031215615211575f80fd5b915061521f602084016150a2565b90509250929050565b5f60208284031215615238575f80fd5b610cde8261512f565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061527857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516152b360608401826001600160401b03169052565b5060808301516152ce60808401826001600160401b03169052565b5060a08301516152e960a08401826001600160401b03169052565b5060c083015161312560c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561312557613125615304565b5f60208284031215615348575f80fd5b5051919050565b5f5b83811015615369578181015183820152602001615351565b50505f910152565b602081525f825180602084015261538f81604085016020870161534f565b601f01601f19169190910160400192915050565b5f826153bd57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612866575f80fd5b5f60208284031215615471575f80fd5b8135610cde8161544d565b5f808335601e19843603018112615491575f80fd5b8301803591506001600160401b038211156154aa575f80fd5b6020019150600581901b3603821315612629575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126154e9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615529576155296154f3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615557576155576154f3565b604052919050565b5f6001600160401b03821115615577576155776154f3565b50601f01601f191660200190565b5f60608236031215615595575f80fd5b61559d615507565b8235815260206155ae81850161512f565b8183015260408401356001600160401b038111156155ca575f80fd5b840136601f8201126155da575f80fd5b80356155ed6155e88261555f565b61552f565b8181523684838501011115615600575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f855161562d818460208a0161534f565b80830190508581526001600160401b0360c01b8560c01b166020820152835161565d81602884016020880161534f565b016028019695505050505050565b5f82516154e981846020870161534f565b80820180821115610cab57610cab615304565b5f63ffffffff8083168181036156a7576156a7615304565b6001019392505050565b8082028115828204841417610cab57610cab615304565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561312557613125615304565b81810381811115610cab57610cab615304565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c908216806157ac57607f821691505b60208210810361511857634e487b7160e01b5f52602260045260245ffd5b5f60208083525f84546157dc81615798565b806020870152604060018084165f81146157fd576001811461581957615846565b60ff19851660408a0152604084151560051b8a01019550615846565b895f5260205f205f5b8581101561583d5781548b8201860152908301908801615822565b8a016040019650505b509398975050505050505050565b805161217081615095565b5f8060408385031215615870575f80fd5b82516001600160401b0380821115615886575f80fd5b9084019060608287031215615899575f80fd5b6158a1615507565b825181526020808401516158b48161544d565b828201526040840151838111156158c9575f80fd5b80850194505087601f8501126158dd575f80fd5b835192506158ed6155e88461555f565b8381528882858701011115615900575f80fd5b61590f8483830184880161534f565b80604084015250819550615924818801615854565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a2757615a27615304565b505092915050565b5f6001600160401b038083168181036156a7576156a7615304565b5f60208284031215615a5a575f80fd5b610cde8261511e565b5f60208284031215615a73575f80fd5b813560ff81168114610cde575f80fd5b5f808335601e19843603018112615a98575f80fd5b8301803591506001600160401b03821115615ab1575f80fd5b602001915036819003821315612629575f80fd5b601f82111561213f57805f5260205f20601f840160051c81016020851015615aea5750805b601f840160051c820191505b81811015610d7e575f8155600101615af6565b81516001600160401b03811115615b2257615b226154f3565b615b3681615b308454615798565b84615ac5565b602080601f831160018114615b69575f8415615b525750858301515b5f19600386901b1c1916600185901b178555612f4b565b5f85815260208120601f198616915b82811015615b9757888601518255948401946001909101908401615b78565b5085821015615bb457878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -532,37 +532,6 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) WARPME return _NativeTokenStakingManager.Contract.WARPMESSENGER(&_NativeTokenStakingManager.CallOpts) } -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) ActiveValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { - var out []interface{} - err := _NativeTokenStakingManager.contract.Call(opts, &out, "activeValidators", nodeID) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { - return _NativeTokenStakingManager.Contract.ActiveValidators(&_NativeTokenStakingManager.CallOpts, nodeID) -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { - return _NativeTokenStakingManager.Contract.ActiveValidators(&_NativeTokenStakingManager.CallOpts, nodeID) -} - // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // // Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) @@ -625,6 +594,37 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) GetWei return _NativeTokenStakingManager.Contract.GetWeight(&_NativeTokenStakingManager.CallOpts, validationID) } +// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// +// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) RegisteredValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { + var out []interface{} + err := _NativeTokenStakingManager.contract.Call(opts, &out, "registeredValidators", nodeID) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// +// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) RegisteredValidators(nodeID [32]byte) ([32]byte, error) { + return _NativeTokenStakingManager.Contract.RegisteredValidators(&_NativeTokenStakingManager.CallOpts, nodeID) +} + +// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// +// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) RegisteredValidators(nodeID [32]byte) ([32]byte, error) { + return _NativeTokenStakingManager.Contract.RegisteredValidators(&_NativeTokenStakingManager.CallOpts, nodeID) +} + // ValueToWeight is a free data retrieval call binding the contract method 0x2e2194d8. // // Solidity: function valueToWeight(uint256 value) pure returns(uint64) diff --git a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go index f4c1dcc29..5db8f2217 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -71,8 +71,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161393438038061393483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6137e78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c80638da5cb5b116100a9578063c974d1b61161006e578063c974d1b6146102c6578063d588c18f146102ce578063d5f20ff6146102e1578063df93d8de14610301578063f2fde38b1461030b575f80fd5b80638da5cb5b1461023b57806397fb70d41461027f578063a3a65e4814610292578063b771b3bc146102a5578063bee0a03f146102b3575f80fd5b806366435abf116100ef57806366435abf146101d4578063715018a6146101ff578063732214f8146102075780638280a25a1461020e5780638994ab4914610228575f80fd5b80630322ed981461012b5780630cdd098514610140578063467ef06f1461019157806360305d62146101a457806361e2f490146101c1575b5f80fd5b61013e610139366004612d80565b61031e565b005b61017e61014e366004612d80565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61013e61019f366004612daf565b6104dc565b6101ac601481565b60405163ffffffff9091168152602001610188565b61013e6101cf366004612dc8565b6104ea565b6101e76101e2366004612d80565b610b1e565b6040516001600160401b039091168152602001610188565b61013e610b32565b61017e5f81565b610216603081565b60405160ff9091168152602001610188565b61017e610236366004612e42565b610b45565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610188565b61013e61028d366004612d80565b610b61565b61013e6102a0366004612daf565b610b76565b6102676005600160991b0181565b61013e6102c1366004612d80565b610d2e565b610216601481565b61013e6102dc366004612e97565b610e3d565b6102f46102ef366004612d80565b610f4b565b6040516101889190612ee1565b6101e76202a30081565b61013e610319366004612f90565b611013565b5f8181525f805160206137bb8339815191526020526040808220815160e0810190925280545f8051602061379b83398151915293929190829060ff16600581111561036b5761036b612ecd565b600581111561037c5761037c612ecd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb612ecd565b146104555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61047a8584606001515f611050565b6040518263ffffffff1660e01b81526004016104969190612fd4565b6020604051808303815f875af11580156104b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d69190613006565b50505050565b6104e581611275565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061379b8339815191529060ff16156105875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161044c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ee9190613006565b8360200135146106505760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161044c565b306106616060850160408601612f90565b6001600160a01b0316146106d35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161044c565b5f6106e1606085018561301d565b91505f90508435602086013560146106ff6060890160408a01612f90565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610a2e575f61077f606089018961301d565b8363ffffffff1681811061079557610795613062565b90506020028101906107a79190613076565b6107b090613126565b80515f81815260088901602052604090205491925090156107e35760405162461bcd60e51b815260040161044c906131bd565b84825f0151836020015184604001516040516020016108059493929190613205565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916108539190613254565b602060405180830381855afa15801561086e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108919190613006565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff1916600183600581111561091d5761091d612ecd565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516109d0911686613279565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610a279061328c565b9050610763565b50600484018190555f610a40866115bf565b90505f610a508260400151611785565b905080600285604051610a639190613254565b602060405180830381855afa158015610a7e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aa19190613006565b14610b055760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161044c565b5050506009909201805460ff1916600117905550505050565b5f610b2882610f4b565b6080015192915050565b610b3a6118ee565b610b435f611949565b565b5f610b4e6118ee565b610b5883836119b9565b90505b92915050565b610b696118ee565b610b7281611f1d565b5050565b5f8051602061379b8339815191525f610b8e836115bf565b90505f80610b9f8360400151612198565b9150915080610c015760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044c565b5f82815260068501602052604081208054610c1b906132ae565b9050118015610c4d575060015f83815260078601602052604090205460ff166005811115610c4b57610c4b612ecd565b145b610c695760405162461bcd60e51b815260040161044c906132e0565b5f8281526006850160205260408120610c8191612cf5565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061379b833981519152929190610d76906132ae565b9050118015610da8575060015f83815260078301602052604090205460ff166005811115610da657610da6612ecd565b145b610dc45760405162461bcd60e51b815260040161044c906132e0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dfd9190600401613327565b6020604051808303815f875af1158015610e19573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e59190613006565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610e815750825b90505f826001600160401b03166001148015610e9c5750303b155b905081158015610eaa575080155b15610ec85760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ef257845460ff60401b1916600160401b1785555b610efc8787612339565b8315610f4257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610f53612d2c565b5f8281525f805160206137bb833981519152602052604090819020815160e0810190925280545f8051602061379b833981519152929190829060ff166005811115610fa057610fa0612ecd565b6005811115610fb157610fb1612ecd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b61101b6118ee565b6001600160a01b03811661104457604051631e4fbdf760e01b81525f600482015260240161044c565b61104d81611949565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110c9576110898160016133b1565b6110949060086133c4565b5081515f908390839081106110ab576110ab613062565b60200101906001600160f81b03191690815f1a905350600101611075565b505f5b6004811015611134576110e08160036133b1565b6110eb9060086133c4565b600263ffffffff16901c60f81b828260026111069190613279565b8151811061111657611116613062565b60200101906001600160f81b03191690815f1a9053506001016110cc565b505f5b60208110156111965761114b81601f6133b1565b6111569060086133c4565b86901c60f81b82611168836006613279565b8151811061117857611178613062565b60200101906001600160f81b03191690815f1a905350600101611137565b505f5b6008811015611201576111ad8160076133b1565b6111b89060086133c4565b6001600160401b038616901c60f81b826111d3836026613279565b815181106111e3576111e3613062565b60200101906001600160f81b03191690815f1a905350600101611199565b505f5b600881101561126c576112188160076133b1565b6112239060086133c4565b6001600160401b038516901c60f81b8261123e83602e613279565b8151811061124e5761124e613062565b60200101906001600160f81b03191690815f1a905350600101611204565b50949350505050565b5f61127e612d2c565b5f8051602061379b8339815191525f611296856115bf565b90505f806112a78360400151612198565b91509150801561130c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044c565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561133d5761133d612ecd565b600581111561134e5761134e612ecd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156113bf576113bf612ecd565b14806113dd57506001825160058111156113db576113db612ecd565b145b61143c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044c565b60038251600581111561145157611451612ecd565b0361145e57506004611462565b5060055b6020808301515f9081526008880190915260408120558181600581111561148b5761148b612ecd565b9081600581111561149e5761149e612ecd565b9052505f84815260078701602052604090208251815484929190829060ff191660018360058111156114d2576114d2612ecd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561158657611586612ecd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611623573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261164a91908101906133ea565b91509150806116aa5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161044c565b81511561170b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044c565b60208201516001600160a01b03161561177e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044c565b5092915050565b5f81516026146117a75760405162461bcd60e51b815260040161044c906134bc565b5f805b60028110156117f6576117be8160016133b1565b6117c99060086133c4565b61ffff168482815181106117df576117df613062565b016020015160f81c901b91909117906001016117aa565b5061ffff8116156118195760405162461bcd60e51b815260040161044c90613505565b5f805b6004811015611874576118308160036133b1565b61183b9060086133c4565b63ffffffff168561184d836002613279565b8151811061185d5761185d613062565b016020015160f81c901b919091179060010161181c565b5063ffffffff8116156118995760405162461bcd60e51b815260040161044c90613548565b5f805b602081101561126c576118b081601f6133b1565b6118bb9060086133c4565b866118c7836006613279565b815181106118d7576118d7613062565b016020015160f81c901b919091179060010161189c565b336119207f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b435760405163118cdaa760e01b815233600482015260240161044c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611a445760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161044c565b5f8051602061379b83398151915242611a63604086016020870161358f565b6001600160401b031611611ad55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161044c565b611ae5604085016020860161358f565b6001600160401b0316611afb6202a30042613279565b11611b6e5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161044c565b8335611bc65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044c565b83355f90815260088201602052604090205415611bf55760405162461bcd60e51b815260040161044c906131bd565b6030611c0460408601866135a8565b905014611c695760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044c565b611c73835f612353565b5f80611d0c6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611cb7919061358f565b6001600160401b03168152602001611cd260408a018a6135a8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612561565b5f82815260068601602052604090209193509150611d2a8282613635565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d57908590600401612fd4565b6020604051808303815f875af1158015611d73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d979190613006565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115611e0f57611e0f612ecd565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611eef918e01908e0161358f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611f25612d2c565b5f8281525f805160206137bb8339815191526020526040808220815160e0810190925280545f8051602061379b83398151915293929190829060ff166005811115611f7257611f72612ecd565b6005811115611f8357611f83612ecd565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611ff557611ff5612ecd565b146120515760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044c565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561209557612095612ecd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121418582612910565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146121bb5760405162461bcd60e51b815260040161044c906134bc565b5f805b600281101561220a576121d28160016133b1565b6121dd9060086133c4565b61ffff168582815181106121f3576121f3613062565b016020015160f81c901b91909117906001016121be565b5061ffff81161561222d5760405162461bcd60e51b815260040161044c90613505565b5f805b6004811015612288576122448160036133b1565b61224f9060086133c4565b63ffffffff1686612261836002613279565b8151811061227157612271613062565b016020015160f81c901b9190911790600101612230565b5063ffffffff81166003146122af5760405162461bcd60e51b815260040161044c90613548565b5f805b6020811015612304576122c681601f6133b1565b6122d19060086133c4565b876122dd836006613279565b815181106122ed576122ed613062565b016020015160f81c901b91909117906001016122b2565b505f8660268151811061231957612319613062565b016020015191976001600160f81b03199092161515965090945050505050565b612341612a67565b61234a82612ab0565b610b7281612ac9565b5f8051602061379b8339815191525f6001600160401b0380841690851611156123875761238083856136f4565b9050612394565b61239184846136f4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806123f65750600184015481516123f2916001600160401b031690613279565b8210155b1561241c576001600160401b03831660608201528181526040810151602082015261243b565b828160600181815161242e9190613714565b6001600160401b03169052505b606081015161244b906064613734565b602082015160018601546001600160401b0392909216916124769190600160401b900460ff166133c4565b10156124da5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161044c565b856001600160401b0316816040018181516124f59190613279565b9052506040810180516001600160401b03871691906125159083906133b1565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146125cb5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612642576126028160016133b1565b61260d9060086133c4565b5081515f9083908390811061262457612624613062565b60200101906001600160f81b03191690815f1a9053506001016125ee565b505f5b60048110156126aa576126598160036133b1565b6126649060086133c4565b600160ff919091161c60f81b8261267c836002613279565b8151811061268c5761268c613062565b60200101906001600160f81b03191690815f1a905350600101612645565b505f5b602081101561270757845181602081106126c9576126c9613062565b1a60f81b826126d9836006613279565b815181106126e9576126e9613062565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b6020811015612767578460200151816020811061272957612729613062565b1a60f81b82612739836026613279565b8151811061274957612749613062565b60200101906001600160f81b03191690815f1a90535060010161270a565b505f5b60088110156127db5761277e8160076133b1565b6127899060086133c4565b60ff1685604001516001600160401b0316901c60f81b828260466127ad9190613279565b815181106127bd576127bd613062565b60200101906001600160f81b03191690815f1a90535060010161276a565b505f5b603081101561284657846080015181815181106127fd576127fd613062565b01602001516001600160f81b0319168261281883604e613279565b8151811061282857612828613062565b60200101906001600160f81b03191690815f1a9053506001016127de565b505f5b60088110156128b85761285d8160076133b1565b6128689060086133c4565b60608601516001600160401b0390811691161c60f81b8261288a83607e613279565b8151811061289a5761289a613062565b60200101906001600160f81b03191690815f1a905350600101612849565b506002816040516128c99190613254565b602060405180830381855afa1580156128e4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129079190613006565b94909350915050565b5f8281525f805160206137bb833981519152602052604081206002015481905f8051602061379b83398151915290600160801b90046001600160401b03166129588582612353565b5f61296287612ada565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129b28a858b611050565b6040518263ffffffff1660e01b81526004016129ce9190612fd4565b6020604051808303815f875af11580156129ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0e9190613006565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b4357604051631afcd79f60e31b815260040160405180910390fd5b612ab8612a67565b612ac0612b6a565b61104d81612b72565b612ad1612a67565b61104d81612ced565b5f8181525f805160206137bb8339815191526020526040812060020180545f8051602061379b83398151915291600160401b9091046001600160401b0316906008612b248361375f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b610b43612a67565b612b7a612a67565b80355f8051602061379b8339815191529081556014612b9f606084016040850161377a565b60ff161115612c0c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161044c565b5f612c1d606084016040850161377a565b60ff1611612c855760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161044c565b612c95606083016040840161377a565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612cc6604083016020840161358f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61101b612a67565b508054612d01906132ae565b5f825580601f10612d10575050565b601f0160209004905f5260205f209081019061104d9190612d68565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612d7c575f8155600101612d69565b5090565b5f60208284031215612d90575f80fd5b5035919050565b803563ffffffff81168114612daa575f80fd5b919050565b5f60208284031215612dbf575f80fd5b610b5882612d97565b5f8060408385031215612dd9575f80fd5b82356001600160401b03811115612dee575f80fd5b830160808186031215612dff575f80fd5b9150612e0d60208401612d97565b90509250929050565b5f60608284031215612e26575f80fd5b50919050565b80356001600160401b0381168114612daa575f80fd5b5f8060408385031215612e53575f80fd5b82356001600160401b03811115612e68575f80fd5b612e7485828601612e16565b925050612e0d60208401612e2c565b6001600160a01b038116811461104d575f80fd5b5f8060808385031215612ea8575f80fd5b612eb28484612e16565b91506060830135612ec281612e83565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f0457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f3f60608401826001600160401b03169052565b506080830151612f5a60808401826001600160401b03169052565b5060a0830151612f7560a08401826001600160401b03169052565b5060c083015161177e60c08401826001600160401b03169052565b5f60208284031215612fa0575f80fd5b8135612fab81612e83565b9392505050565b5f5b83811015612fcc578181015183820152602001612fb4565b50505f910152565b602081525f8251806020840152612ff2816040850160208701612fb2565b601f01601f19169190910160400192915050565b5f60208284031215613016575f80fd5b5051919050565b5f808335601e19843603018112613032575f80fd5b8301803591506001600160401b0382111561304b575f80fd5b6020019150600581901b3603821315612a60575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261308a575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130ca576130ca613094565b60405290565b604051601f8201601f191681016001600160401b03811182821017156130f8576130f8613094565b604052919050565b5f6001600160401b0382111561311857613118613094565b50601f01601f191660200190565b5f60608236031215613136575f80fd5b61313e6130a8565b82358152602061314f818501612e2c565b8183015260408401356001600160401b0381111561316b575f80fd5b840136601f82011261317b575f80fd5b803561318e61318982613100565b6130d0565b81815236848385010111156131a1575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551613216818460208a01612fb2565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613246816028840160208801612fb2565b016028019695505050505050565b5f825161308a818460208701612fb2565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b5b57610b5b613265565b5f63ffffffff8083168181036132a4576132a4613265565b6001019392505050565b600181811c908216806132c257607f821691505b602082108103612e2657634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613339816132ae565b806020870152604060018084165f811461335a5760018114613376576133a3565b60ff19851660408a0152604084151560051b8a010195506133a3565b895f5260205f205f5b8581101561339a5781548b820186015290830190880161337f565b8a016040019650505b509398975050505050505050565b81810381811115610b5b57610b5b613265565b8082028115828204841417610b5b57610b5b613265565b80518015158114612daa575f80fd5b5f80604083850312156133fb575f80fd5b82516001600160401b0380821115613411575f80fd5b9084019060608287031215613424575f80fd5b61342c6130a8565b8251815260208084015161343f81612e83565b82820152604084015183811115613454575f80fd5b80850194505087601f850112613468575f80fd5b8351925061347861318984613100565b838152888285870101111561348b575f80fd5b61349a84838301848801612fb2565b806040840152508195506134af8188016133db565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561359f575f80fd5b610b5882612e2c565b5f808335601e198436030181126135bd575f80fd5b8301803591506001600160401b038211156135d6575f80fd5b602001915036819003821315612a60575f80fd5b601f8211156104e557805f5260205f20601f840160051c8101602085101561360f5750805b601f840160051c820191505b8181101561362e575f815560010161361b565b5050505050565b81516001600160401b0381111561364e5761364e613094565b6136628161365c84546132ae565b846135ea565b602080601f831160018114613695575f841561367e5750858301515b5f19600386901b1c1916600185901b1785556136ec565b5f85815260208120601f198616915b828110156136c3578886015182559484019460019091019084016136a4565b50858210156136e057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0382811682821603908082111561177e5761177e613265565b6001600160401b0381811683821601908082111561177e5761177e613265565b6001600160401b0381811683821602808216919082811461375757613757613265565b505092915050565b5f6001600160401b038083168181036132a4576132a4613265565b5f6020828403121561378a575f80fd5b813560ff81168114612fab575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516138e03803806138e083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6137938061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806397fb70d4116100a9578063d588c18f1161006e578063d588c18f14610290578063d5f20ff6146102a3578063df93d8de146102c3578063e7d14c1c146102cd578063f2fde38b1461030b575f80fd5b806397fb70d414610241578063a3a65e4814610254578063b771b3bc14610267578063bee0a03f14610275578063c974d1b614610288575f80fd5b8063715018a6116100ef578063715018a6146101b3578063732214f8146101bb5780638280a25a146101d05780638994ab49146101ea5780638da5cb5b146101fd575f80fd5b80630322ed981461012b578063467ef06f1461014057806360305d621461015357806361e2f4901461017557806366435abf14610188575b5f80fd5b61013e610139366004612d70565b61031e565b005b61013e61014e366004612d9f565b6104dc565b61015b601481565b60405163ffffffff90911681526020015b60405180910390f35b61013e610183366004612db8565b6104ea565b61019b610196366004612d70565b610b63565b6040516001600160401b03909116815260200161016c565b61013e610b77565b6101c25f81565b60405190815260200161016c565b6101d8603081565b60405160ff909116815260200161016c565b6101c26101f8366004612e32565b610b8a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161016c565b61013e61024f366004612d70565b610ba6565b61013e610262366004612d9f565b610bbb565b6102296005600160991b0181565b61013e610283366004612d70565b610d31565b6101d8601481565b61013e61029e366004612e87565b610e07565b6102b66102b1366004612d70565b610f15565b60405161016c9190612ed1565b61019b6202a30081565b6101c26102db366004612d70565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61013e610319366004612f80565b610fdd565b5f8181525f805160206137678339815191526020526040808220815160e0810190925280545f8051602061374783398151915293929190829060ff16600581111561036b5761036b612ebd565b600581111561037c5761037c612ebd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb612ebd565b146104555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61047a8584606001515f61101a565b6040518263ffffffff1660e01b81526004016104969190612fc4565b6020604051808303815f875af11580156104b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d69190612ff6565b50505050565b6104e58161123f565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206137478339815191529060ff16156105875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161044c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ee9190612ff6565b8360200135146106505760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161044c565b306106616060850160408601612f80565b6001600160a01b0316146106d35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161044c565b5f6106e1606085018561300d565b91505f90508435602086013560146106ff6060890160408a01612f80565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610a73575f61077f606089018961300d565b8363ffffffff1681811061079557610795613052565b90506020028101906107a79190613066565b6107b090613116565b80515f81815260088901602052604090205491925090156108285760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161044c565b84825f01518360200151846040015160405160200161084a94939291906131ad565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161089891906131fc565b602060405180830381855afa1580156108b3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108d69190612ff6565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff1916600183600581111561096257610962612ebd565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610a15911686613221565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610a6c90613234565b9050610763565b50600484018190555f610a858661155d565b90505f610a958260400151611723565b905080600285604051610aa891906131fc565b602060405180830381855afa158015610ac3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ae69190612ff6565b14610b4a5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161044c565b5050506009909201805460ff1916600117905550505050565b5f610b6d82610f15565b6080015192915050565b610b7f61188c565b610b885f6118e7565b565b5f610b9361188c565b610b9d8383611957565b90505b92915050565b610bae61188c565b610bb781611f0d565b5050565b5f805160206137478339815191525f610bd38361155d565b90505f80610be48360400151612188565b9150915080610c465760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044c565b60015f83815260078601602052604090205460ff166005811115610c6c57610c6c612ebd565b14610c895760405162461bcd60e51b815260040161044c90613256565b5f8281526006850160205260408120610ca191612ce5565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061376783398151915260205260409020545f805160206137478339815191529060019060ff166005811115610d7157610d71612ebd565b14610d8e5760405162461bcd60e51b815260040161044c90613256565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dc791906004016132d3565b6020604051808303815f875af1158015610de3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e59190612ff6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610e4b5750825b90505f826001600160401b03166001148015610e665750303b155b905081158015610e74575080155b15610e925760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ebc57845460ff60401b1916600160401b1785555b610ec68787612329565b8315610f0c57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610f1d612d1c565b5f8281525f80516020613767833981519152602052604090819020815160e0810190925280545f80516020613747833981519152929190829060ff166005811115610f6a57610f6a612ebd565b6005811115610f7b57610f7b612ebd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610fe561188c565b6001600160a01b03811661100e57604051631e4fbdf760e01b81525f600482015260240161044c565b611017816118e7565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110935761105381600161335d565b61105e906008613370565b5081515f9083908390811061107557611075613052565b60200101906001600160f81b03191690815f1a90535060010161103f565b505f5b60048110156110fe576110aa81600361335d565b6110b5906008613370565b600263ffffffff16901c60f81b828260026110d09190613221565b815181106110e0576110e0613052565b60200101906001600160f81b03191690815f1a905350600101611096565b505f5b60208110156111605761111581601f61335d565b611120906008613370565b86901c60f81b82611132836006613221565b8151811061114257611142613052565b60200101906001600160f81b03191690815f1a905350600101611101565b505f5b60088110156111cb5761117781600761335d565b611182906008613370565b6001600160401b038616901c60f81b8261119d836026613221565b815181106111ad576111ad613052565b60200101906001600160f81b03191690815f1a905350600101611163565b505f5b6008811015611236576111e281600761335d565b6111ed906008613370565b6001600160401b038516901c60f81b8261120883602e613221565b8151811061121857611218613052565b60200101906001600160f81b03191690815f1a9053506001016111ce565b50949350505050565b5f611248612d1c565b5f805160206137478339815191525f6112608561155d565b90505f806112718360400151612188565b9150915080156112d65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044c565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561130757611307612ebd565b600581111561131857611318612ebd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561138757611387612ebd565b14806113a557506001815160058111156113a3576113a3612ebd565b145b6114045760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044c565b60038151600581111561141957611419612ebd565b03611427576004815261142c565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561147157611471612ebd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561152557611525612ebd565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156115c1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526115e89190810190613396565b91509150806116485760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161044c565b8151156116a95760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044c565b60208201516001600160a01b03161561171c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044c565b5092915050565b5f81516026146117455760405162461bcd60e51b815260040161044c90613468565b5f805b60028110156117945761175c81600161335d565b611767906008613370565b61ffff1684828151811061177d5761177d613052565b016020015160f81c901b9190911790600101611748565b5061ffff8116156117b75760405162461bcd60e51b815260040161044c906134b1565b5f805b6004811015611812576117ce81600361335d565b6117d9906008613370565b63ffffffff16856117eb836002613221565b815181106117fb576117fb613052565b016020015160f81c901b91909117906001016117ba565b5063ffffffff8116156118375760405162461bcd60e51b815260040161044c906134f4565b5f805b60208110156112365761184e81601f61335d565b611859906008613370565b86611865836006613221565b8151811061187557611875613052565b016020015160f81c901b919091179060010161183a565b336118be7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b885760405163118cdaa760e01b815233600482015260240161044c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166119e25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161044c565b5f8051602061374783398151915242611a01604086016020870161353b565b6001600160401b031611611a735760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161044c565b611a83604085016020860161353b565b6001600160401b0316611a996202a30042613221565b11611b0c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161044c565b8335611b645760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044c565b83355f90815260088201602052604090205415611bd45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161044c565b6030611be36040860186613554565b905014611c485760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044c565b611c52835f612343565b5f80611ceb6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611c96919061353b565b6001600160401b03168152602001611cb160408a018a613554565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612551565b5f82815260068601602052604090209193509150611d0982826135e1565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90611d47908590600401612fc4565b6020604051808303815f875af1158015611d63573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d879190612ff6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115611dff57611dff612ebd565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611edf918e01908e0161353b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611f15612d1c565b5f8281525f805160206137678339815191526020526040808220815160e0810190925280545f8051602061374783398151915293929190829060ff166005811115611f6257611f62612ebd565b6005811115611f7357611f73612ebd565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611fe557611fe5612ebd565b146120415760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044c565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561208557612085612ebd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121318582612900565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146121ab5760405162461bcd60e51b815260040161044c90613468565b5f805b60028110156121fa576121c281600161335d565b6121cd906008613370565b61ffff168582815181106121e3576121e3613052565b016020015160f81c901b91909117906001016121ae565b5061ffff81161561221d5760405162461bcd60e51b815260040161044c906134b1565b5f805b60048110156122785761223481600361335d565b61223f906008613370565b63ffffffff1686612251836002613221565b8151811061226157612261613052565b016020015160f81c901b9190911790600101612220565b5063ffffffff811660031461229f5760405162461bcd60e51b815260040161044c906134f4565b5f805b60208110156122f4576122b681601f61335d565b6122c1906008613370565b876122cd836006613221565b815181106122dd576122dd613052565b016020015160f81c901b91909117906001016122a2565b505f8660268151811061230957612309613052565b016020015191976001600160f81b03199092161515965090945050505050565b612331612a57565b61233a82612aa0565b610bb781612ab9565b5f805160206137478339815191525f6001600160401b0380841690851611156123775761237083856136a0565b9050612384565b61238184846136a0565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806123e65750600184015481516123e2916001600160401b031690613221565b8210155b1561240c576001600160401b03831660608201528181526040810151602082015261242b565b828160600181815161241e91906136c0565b6001600160401b03169052505b606081015161243b9060646136e0565b602082015160018601546001600160401b0392909216916124669190600160401b900460ff16613370565b10156124ca5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161044c565b856001600160401b0316816040018181516124e59190613221565b9052506040810180516001600160401b038716919061250590839061335d565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146125bb5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612632576125f281600161335d565b6125fd906008613370565b5081515f9083908390811061261457612614613052565b60200101906001600160f81b03191690815f1a9053506001016125de565b505f5b600481101561269a5761264981600361335d565b612654906008613370565b600160ff919091161c60f81b8261266c836002613221565b8151811061267c5761267c613052565b60200101906001600160f81b03191690815f1a905350600101612635565b505f5b60208110156126f757845181602081106126b9576126b9613052565b1a60f81b826126c9836006613221565b815181106126d9576126d9613052565b60200101906001600160f81b03191690815f1a90535060010161269d565b505f5b6020811015612757578460200151816020811061271957612719613052565b1a60f81b82612729836026613221565b8151811061273957612739613052565b60200101906001600160f81b03191690815f1a9053506001016126fa565b505f5b60088110156127cb5761276e81600761335d565b612779906008613370565b60ff1685604001516001600160401b0316901c60f81b8282604661279d9190613221565b815181106127ad576127ad613052565b60200101906001600160f81b03191690815f1a90535060010161275a565b505f5b603081101561283657846080015181815181106127ed576127ed613052565b01602001516001600160f81b0319168261280883604e613221565b8151811061281857612818613052565b60200101906001600160f81b03191690815f1a9053506001016127ce565b505f5b60088110156128a85761284d81600761335d565b612858906008613370565b60608601516001600160401b0390811691161c60f81b8261287a83607e613221565b8151811061288a5761288a613052565b60200101906001600160f81b03191690815f1a905350600101612839565b506002816040516128b991906131fc565b602060405180830381855afa1580156128d4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128f79190612ff6565b94909350915050565b5f8281525f80516020613767833981519152602052604081206002015481905f8051602061374783398151915290600160801b90046001600160401b03166129488582612343565b5f61295287612aca565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129a28a858b61101a565b6040518263ffffffff1660e01b81526004016129be9190612fc4565b6020604051808303815f875af11580156129da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129fe9190612ff6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b8857604051631afcd79f60e31b815260040160405180910390fd5b612aa8612a57565b612ab0612b5a565b61101781612b62565b612ac1612a57565b61101781612cdd565b5f8181525f805160206137678339815191526020526040812060020180545f8051602061374783398151915291600160401b9091046001600160401b0316906008612b148361370b565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b610b88612a57565b612b6a612a57565b80355f805160206137478339815191529081556014612b8f6060840160408501613726565b60ff161115612bfc5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161044c565b5f612c0d6060840160408501613726565b60ff1611612c755760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161044c565b612c856060830160408401613726565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612cb6604083016020840161353b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fe5612a57565b508054612cf1906132a1565b5f825580601f10612d00575050565b601f0160209004905f5260205f20908101906110179190612d58565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612d6c575f8155600101612d59565b5090565b5f60208284031215612d80575f80fd5b5035919050565b803563ffffffff81168114612d9a575f80fd5b919050565b5f60208284031215612daf575f80fd5b610b9d82612d87565b5f8060408385031215612dc9575f80fd5b82356001600160401b03811115612dde575f80fd5b830160808186031215612def575f80fd5b9150612dfd60208401612d87565b90509250929050565b5f60608284031215612e16575f80fd5b50919050565b80356001600160401b0381168114612d9a575f80fd5b5f8060408385031215612e43575f80fd5b82356001600160401b03811115612e58575f80fd5b612e6485828601612e06565b925050612dfd60208401612e1c565b6001600160a01b0381168114611017575f80fd5b5f8060808385031215612e98575f80fd5b612ea28484612e06565b91506060830135612eb281612e73565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612ef457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f2f60608401826001600160401b03169052565b506080830151612f4a60808401826001600160401b03169052565b5060a0830151612f6560a08401826001600160401b03169052565b5060c083015161171c60c08401826001600160401b03169052565b5f60208284031215612f90575f80fd5b8135612f9b81612e73565b9392505050565b5f5b83811015612fbc578181015183820152602001612fa4565b50505f910152565b602081525f8251806020840152612fe2816040850160208701612fa2565b601f01601f19169190910160400192915050565b5f60208284031215613006575f80fd5b5051919050565b5f808335601e19843603018112613022575f80fd5b8301803591506001600160401b0382111561303b575f80fd5b6020019150600581901b3603821315612a50575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261307a575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130ba576130ba613084565b60405290565b604051601f8201601f191681016001600160401b03811182821017156130e8576130e8613084565b604052919050565b5f6001600160401b0382111561310857613108613084565b50601f01601f191660200190565b5f60608236031215613126575f80fd5b61312e613098565b82358152602061313f818501612e1c565b8183015260408401356001600160401b0381111561315b575f80fd5b840136601f82011261316b575f80fd5b803561317e613179826130f0565b6130c0565b8181523684838501011115613191575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f85516131be818460208a01612fa2565b80830190508581526001600160401b0360c01b8560c01b16602082015283516131ee816028840160208801612fa2565b016028019695505050505050565b5f825161307a818460208701612fa2565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ba057610ba061320d565b5f63ffffffff80831681810361324c5761324c61320d565b6001019392505050565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c908216806132b557607f821691505b602082108103612e1657634e487b7160e01b5f52602260045260245ffd5b5f60208083525f84546132e5816132a1565b806020870152604060018084165f811461330657600181146133225761334f565b60ff19851660408a0152604084151560051b8a0101955061334f565b895f5260205f205f5b858110156133465781548b820186015290830190880161332b565b8a016040019650505b509398975050505050505050565b81810381811115610ba057610ba061320d565b8082028115828204841417610ba057610ba061320d565b80518015158114612d9a575f80fd5b5f80604083850312156133a7575f80fd5b82516001600160401b03808211156133bd575f80fd5b90840190606082870312156133d0575f80fd5b6133d8613098565b825181526020808401516133eb81612e73565b82820152604084015183811115613400575f80fd5b80850194505087601f850112613414575f80fd5b83519250613424613179846130f0565b8381528882858701011115613437575f80fd5b61344684838301848801612fa2565b8060408401525081955061345b818801613387565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561354b575f80fd5b610b9d82612e1c565b5f808335601e19843603018112613569575f80fd5b8301803591506001600160401b03821115613582575f80fd5b602001915036819003821315612a50575f80fd5b601f8211156104e557805f5260205f20601f840160051c810160208510156135bb5750805b601f840160051c820191505b818110156135da575f81556001016135c7565b5050505050565b81516001600160401b038111156135fa576135fa613084565b61360e8161360884546132a1565b84613596565b602080601f831160018114613641575f841561362a5750858301515b5f19600386901b1c1916600185901b178555613698565b5f85815260208120601f198616915b8281101561366f57888601518255948401946001909101908401613650565b508582101561368c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0382811682821603908082111561171c5761171c61320d565b6001600160401b0381811683821601908082111561171c5761171c61320d565b6001600160401b038181168382160280821691908281146137035761370361320d565b505092915050565b5f6001600160401b0380831681810361324c5761324c61320d565b5f60208284031215613736575f80fd5b813560ff81168114612f9b575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -428,37 +428,6 @@ func (_PoAValidatorManager *PoAValidatorManagerCallerSession) WARPMESSENGER() (c return _PoAValidatorManager.Contract.WARPMESSENGER(&_PoAValidatorManager.CallOpts) } -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_PoAValidatorManager *PoAValidatorManagerCaller) ActiveValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { - var out []interface{} - err := _PoAValidatorManager.contract.Call(opts, &out, "activeValidators", nodeID) - - if err != nil { - return *new([32]byte), err - } - - out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) - - return out0, err - -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_PoAValidatorManager *PoAValidatorManagerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { - return _PoAValidatorManager.Contract.ActiveValidators(&_PoAValidatorManager.CallOpts, nodeID) -} - -// ActiveValidators is a free data retrieval call binding the contract method 0x0cdd0985. -// -// Solidity: function activeValidators(bytes32 nodeID) view returns(bytes32) -func (_PoAValidatorManager *PoAValidatorManagerCallerSession) ActiveValidators(nodeID [32]byte) ([32]byte, error) { - return _PoAValidatorManager.Contract.ActiveValidators(&_PoAValidatorManager.CallOpts, nodeID) -} - // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // // Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) @@ -552,6 +521,37 @@ func (_PoAValidatorManager *PoAValidatorManagerCallerSession) Owner() (common.Ad return _PoAValidatorManager.Contract.Owner(&_PoAValidatorManager.CallOpts) } +// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// +// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCaller) RegisteredValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { + var out []interface{} + err := _PoAValidatorManager.contract.Call(opts, &out, "registeredValidators", nodeID) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// +// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerSession) RegisteredValidators(nodeID [32]byte) ([32]byte, error) { + return _PoAValidatorManager.Contract.RegisteredValidators(&_PoAValidatorManager.CallOpts, nodeID) +} + +// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// +// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) RegisteredValidators(nodeID [32]byte) ([32]byte, error) { + return _PoAValidatorManager.Contract.RegisteredValidators(&_PoAValidatorManager.CallOpts, nodeID) +} + // CompleteEndValidation is a paid mutator transaction binding the contract method 0x467ef06f. // // Solidity: function completeEndValidation(uint32 messageIndex) returns() diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index f661d7c2c..a11780af0 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -9,8 +9,7 @@ import { IPoSValidatorManager, Delegator, DelegatorStatus } from "./interfaces/IPoSValidatorManager.sol"; import { - PoSValidatorManagerSettings, - PoSValidatorRequirements + PoSValidatorManagerSettings, PoSValidatorInfo } from "./interfaces/IPoSValidatorManager.sol"; import {Validator} from "./interfaces/IValidatorManager.sol"; import {ValidatorManager} from "./ValidatorManager.sol"; @@ -53,7 +52,7 @@ abstract contract PoSValidatorManager is /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; /// @notice Maps the validation ID to its requirements. - mapping(bytes32 validationID => PoSValidatorRequirements) _validatorRequirements; + mapping(bytes32 validationID => PoSValidatorInfo) _validatorInfo; /// @notice Maps the delegation ID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; /// @notice Maps the delegation ID to its pending staking rewards. @@ -146,13 +145,13 @@ abstract contract PoSValidatorManager is "PoSValidatorManager: validation period not completed" ); require( - $._validatorRequirements[validationID].owner == _msgSender(), + $._validatorInfo[validationID].owner == _msgSender(), "PoSValidatorManager: validator not owned by sender" ); uint256 rewards = $._redeemableValidatorRewards[validationID]; delete $._redeemableValidatorRewards[validationID]; - _reward($._validatorRequirements[validationID].owner, rewards); + _reward($._validatorInfo[validationID].owner, rewards); } function initializeEndValidation( @@ -171,14 +170,14 @@ abstract contract PoSValidatorManager is // PoS validations can only be ended by their owners. require( - $._validatorRequirements[validationID].owner == _msgSender(), + $._validatorInfo[validationID].owner == _msgSender(), "PoSValidatorManager: validator not owned by sender" ); // Check that minimum stake duration has passed. require( validator.endedAt - >= validator.startedAt + $._validatorRequirements[validationID].minStakeDuration, + >= validator.startedAt + $._validatorInfo[validationID].minStakeDuration, "PoSValidatorManager: minimum stake duration not met" ); @@ -211,7 +210,7 @@ abstract contract PoSValidatorManager is return; } - address owner = $._validatorRequirements[validationID].owner; + address owner = $._validatorInfo[validationID].owner; // The validator can either be Completed or Invalidated here. We only grant rewards for Completed. if (validator.status == ValidatorStatus.Completed) { uint256 rewards = $._redeemableValidatorRewards[validationID]; @@ -255,9 +254,12 @@ abstract contract PoSValidatorManager is PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Validate and save the validator requirements require( - delegationFeeBips >= $._minimumDelegationFeeBips - && delegationFeeBips <= MAXIMUM_DELEGATION_FEE_BIPS, - "PoSValidatorManager: invalid delegation fee" + delegationFeeBips >= $._minimumDelegationFeeBips, + "PoSValidatorManager: delegation fee too low" + ); + require( + delegationFeeBips <= MAXIMUM_DELEGATION_FEE_BIPS, + "PoSValidatorManager: delegation fee too high" ); require( minStakeDuration >= $._minimumStakeDuration, @@ -274,7 +276,7 @@ abstract contract PoSValidatorManager is uint64 weight = valueToWeight(lockedValue); bytes32 validationID = _initializeValidatorRegistration(registrationInput, weight); - $._validatorRequirements[validationID] = PoSValidatorRequirements({ + $._validatorInfo[validationID] = PoSValidatorInfo({ owner: _msgSender(), delegationFeeBips: delegationFeeBips, minStakeDuration: minStakeDuration @@ -521,8 +523,7 @@ abstract contract PoSValidatorManager is uint256 rewards = $._redeemableDelegatorRewards[delegationID]; delete $._redeemableDelegatorRewards[delegationID]; - uint256 validatorFees = - rewards * $._validatorRequirements[validationID].delegationFeeBips / 10000; + uint256 validatorFees = rewards * $._validatorInfo[validationID].delegationFeeBips / 10000; // Allocate the delegation fees to the validator. $._redeemableValidatorRewards[validationID] += validatorFees; @@ -541,6 +542,6 @@ abstract contract PoSValidatorManager is function _isPoSValidator(bytes32 validationID) internal view returns (bool) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - return $._validatorRequirements[validationID].owner != address(0); + return $._validatorInfo[validationID].owner != address(0); } } diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index c783adc48..cdfad8009 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -44,8 +44,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida mapping(bytes32 => bytes) _pendingRegisterValidationMessages; /// @notice Maps the validationID to the validator information. mapping(bytes32 => Validator) _validationPeriods; - /// @notice Maps the nodeID to the validationID for active validation periods. - mapping(bytes32 => bytes32) _activeValidators; + /// @notice Maps the nodeID to the validationID for validation periods that have not ended. + mapping(bytes32 => bytes32) _registeredValidators; /// @notice Boolean that indicates if the initial validator set has been set. bool _initializedValidatorSet; } @@ -151,8 +151,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; bytes32 nodeID = initialValidator.nodeID; require( - $._activeValidators[nodeID] == bytes32(0), - "ValidatorManager: node ID already active" + $._registeredValidators[nodeID] == bytes32(0), + "ValidatorManager: node ID already registered" ); // Continue to encode the initial validators. @@ -170,7 +170,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Save the initial validator as an active validator. - $._activeValidators[nodeID] = validationID; + $._registeredValidators[nodeID] = validationID; $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.Active, nodeID: initialValidator.nodeID, @@ -226,7 +226,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Ensure the nodeID is not the zero address, and is not already an active validator. require(input.nodeID != bytes32(0), "ValidatorManager: invalid node ID"); require( - $._activeValidators[input.nodeID] == bytes32(0), + $._registeredValidators[input.nodeID] == bytes32(0), "ValidatorManager: node ID already active" ); require( @@ -248,6 +248,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida }) ); $._pendingRegisterValidationMessages[validationID] = registerSubnetValidatorMessage; + $._registeredValidators[input.nodeID] = validationID; // Submit the message to the Warp precompile. bytes32 messageID = WARP_MESSENGER.sendWarpMessage(registerSubnetValidatorMessage); @@ -276,9 +277,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // The initial validator set must have been set already to have pending register validation messages. require( - $._pendingRegisterValidationMessages[validationID].length > 0 - && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, - "ValidatorManager: invalid validation ID" + $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, + "ValidatorManager: validation ID not pending" ); // Submit the message to the Warp precompile. @@ -299,23 +299,21 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida require(validRegistration, "ValidatorManager: Registration not valid"); // The initial validator set must have been set already to have pending register validation messages. require( - $._pendingRegisterValidationMessages[validationID].length > 0 - && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, - "ValidatorManager: invalid validation ID" + $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, + "ValidatorManager: validation ID not pending" ); delete $._pendingRegisterValidationMessages[validationID]; $._validationPeriods[validationID].status = ValidatorStatus.Active; $._validationPeriods[validationID].startedAt = uint64(block.timestamp); - $._activeValidators[$._validationPeriods[validationID].nodeID] = validationID; emit ValidationPeriodRegistered( validationID, $._validationPeriods[validationID].weight, block.timestamp ); } - function activeValidators(bytes32 nodeID) public view returns (bytes32) { + function registeredValidators(bytes32 nodeID) public view returns (bytes32) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - return $._activeValidators[nodeID]; + return $._registeredValidators[nodeID]; } function getValidator(bytes32 validationID) public view returns (Validator memory) { @@ -407,7 +405,6 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida require(!validRegistration, "ValidatorManager: registration still valid"); Validator memory validator = $._validationPeriods[validationID]; - ValidatorStatus endStatus; // The validation status is PendingRemoved if validator removal was initiated with a call to {initiateEndValidation}. // The validation status is PendingAdded if the validator was never registered on the P-Chain. @@ -419,15 +416,14 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ); if (validator.status == ValidatorStatus.PendingRemoved) { - endStatus = ValidatorStatus.Completed; + validator.status = ValidatorStatus.Completed; } else { - endStatus = ValidatorStatus.Invalidated; + validator.status = ValidatorStatus.Invalidated; } - // Remove the validator from the active validators mapping. - delete $._activeValidators[validator.nodeID]; + // Remove the validator from the registered validators mapping. + delete $._registeredValidators[validator.nodeID]; - // Update the validator status. - validator.status = endStatus; + // Update the validator. $._validationPeriods[validationID] = validator; // Emit event. diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index b4d8cefff..0f4a35d69 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -38,7 +38,7 @@ struct Delegator { uint64 endingNonce; } -struct PoSValidatorRequirements { +struct PoSValidatorInfo { address owner; uint16 delegationFeeBips; uint64 minStakeDuration; From 59a98b104dd1ca43422101021d36a9e0afb1895d Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 15:38:16 -0400 Subject: [PATCH 375/545] Fix e2e --- .../validator-manager/PoSValidatorManager.sol | 19 ++++++++++--------- tests/flows/validator-manager/poa_to_pos.go | 4 ++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index a11780af0..ac47ed16b 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -52,7 +52,7 @@ abstract contract PoSValidatorManager is /// @notice The reward calculator for this validator manager. IRewardCalculator _rewardCalculator; /// @notice Maps the validation ID to its requirements. - mapping(bytes32 validationID => PoSValidatorInfo) _validatorInfo; + mapping(bytes32 validationID => PoSValidatorInfo) _posValidatorInfo; /// @notice Maps the delegation ID to the delegator information. mapping(bytes32 delegationID => Delegator) _delegatorStakes; /// @notice Maps the delegation ID to its pending staking rewards. @@ -145,13 +145,13 @@ abstract contract PoSValidatorManager is "PoSValidatorManager: validation period not completed" ); require( - $._validatorInfo[validationID].owner == _msgSender(), + $._posValidatorInfo[validationID].owner == _msgSender(), "PoSValidatorManager: validator not owned by sender" ); uint256 rewards = $._redeemableValidatorRewards[validationID]; delete $._redeemableValidatorRewards[validationID]; - _reward($._validatorInfo[validationID].owner, rewards); + _reward($._posValidatorInfo[validationID].owner, rewards); } function initializeEndValidation( @@ -170,14 +170,14 @@ abstract contract PoSValidatorManager is // PoS validations can only be ended by their owners. require( - $._validatorInfo[validationID].owner == _msgSender(), + $._posValidatorInfo[validationID].owner == _msgSender(), "PoSValidatorManager: validator not owned by sender" ); // Check that minimum stake duration has passed. require( validator.endedAt - >= validator.startedAt + $._validatorInfo[validationID].minStakeDuration, + >= validator.startedAt + $._posValidatorInfo[validationID].minStakeDuration, "PoSValidatorManager: minimum stake duration not met" ); @@ -210,7 +210,7 @@ abstract contract PoSValidatorManager is return; } - address owner = $._validatorInfo[validationID].owner; + address owner = $._posValidatorInfo[validationID].owner; // The validator can either be Completed or Invalidated here. We only grant rewards for Completed. if (validator.status == ValidatorStatus.Completed) { uint256 rewards = $._redeemableValidatorRewards[validationID]; @@ -276,7 +276,7 @@ abstract contract PoSValidatorManager is uint64 weight = valueToWeight(lockedValue); bytes32 validationID = _initializeValidatorRegistration(registrationInput, weight); - $._validatorInfo[validationID] = PoSValidatorInfo({ + $._posValidatorInfo[validationID] = PoSValidatorInfo({ owner: _msgSender(), delegationFeeBips: delegationFeeBips, minStakeDuration: minStakeDuration @@ -523,7 +523,8 @@ abstract contract PoSValidatorManager is uint256 rewards = $._redeemableDelegatorRewards[delegationID]; delete $._redeemableDelegatorRewards[delegationID]; - uint256 validatorFees = rewards * $._validatorInfo[validationID].delegationFeeBips / 10000; + uint256 validatorFees = + rewards * $._posValidatorInfo[validationID].delegationFeeBips / 10000; // Allocate the delegation fees to the validator. $._redeemableValidatorRewards[validationID] += validatorFees; @@ -542,6 +543,6 @@ abstract contract PoSValidatorManager is function _isPoSValidator(bytes32 validationID) internal view returns (bool) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - return $._validatorInfo[validationID].owner != address(0); + return $._posValidatorInfo[validationID].owner != address(0); } } diff --git a/tests/flows/validator-manager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go index 872303576..21ab63680 100644 --- a/tests/flows/validator-manager/poa_to_pos.go +++ b/tests/flows/validator-manager/poa_to_pos.go @@ -179,8 +179,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) - // Check that previous validator is still active - validationID, err := posValidatorManager.ActiveValidators(&bind.CallOpts{}, poaNodeID) + // Check that previous validator is still registered + validationID, err := posValidatorManager.RegisteredValidators(&bind.CallOpts{}, poaNodeID) Expect(err).Should(BeNil()) Expect(validationID[:]).Should(Equal(poaValidationID[:])) From ed15d98521e688685a3ab57c352bcadcc921437e Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 19 Sep 2024 15:41:26 -0400 Subject: [PATCH 376/545] Fix unit tests --- .../validator-manager/tests/PoSValidatorManagerTests.t.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 089b3351d..f7d89bf42 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -82,7 +82,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(_formatErrorMessage("invalid delegation fee")); + vm.expectRevert(_formatErrorMessage("delegation fee too low")); _initializeValidatorRegistration( registrationInput, DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1, @@ -98,7 +98,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); uint16 delegationFeeBips = posValidatorManager.MAXIMUM_DELEGATION_FEE_BIPS() + 1; - vm.expectRevert(_formatErrorMessage("invalid delegation fee")); + vm.expectRevert(_formatErrorMessage("delegation fee too high")); _initializeValidatorRegistration( registrationInput, delegationFeeBips, From 5048225bc53bde8fd51ecee4aa99f1aa524c8c54 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Thu, 19 Sep 2024 16:34:53 -0400 Subject: [PATCH 377/545] review feedback --- contracts/validator-manager/ValidatorMessages.sol | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index fa2d6859a..7278f33ad 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -43,9 +43,6 @@ library ValidatorMessages { // the end of their validation period. uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 5; - // TODO: The implementation of these packing and unpacking functions is neither tested nor optimized at all. - // Full test coverage should be provided, and the implementation should be optimized for gas efficiency. - /** * @notice Packs a SubnetConversionMessage message into a byte array. * The message format specification is: @@ -140,6 +137,8 @@ library ValidatorMessages { pure returns (bytes memory) { + // The formula for the length in the comment above is VM agnostic, but in EVM + // the address length is always 20 bytes so the constant term is 72 + 20 = 92. bytes memory res = new bytes(92 + subnetConversionData.initialValidators.length * 88); // Pack the convertSubnetTx ID for (uint256 i; i < 32; ++i) { @@ -155,7 +154,7 @@ library ValidatorMessages { } // Pack the address bytes20 addrBytes = bytes20(subnetConversionData.validatorManagerAddress); - for (uint256 i = 0; i < 20; i++) { + for (uint256 i = 0; i < 20; ++i) { res[i + 68] = addrBytes[i]; } From 9683e9c7b85a29697363e098854b9245627ccd21 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 20 Sep 2024 10:57:12 -0400 Subject: [PATCH 378/545] Fix bug where validator exits while delegation is still pending added --- .../ERC20TokenStakingManager.go | 33 +++---- .../NativeTokenStakingManager.go | 33 +++---- .../validator-manager/PoSValidatorManager.sol | 96 +++++++++++++------ .../interfaces/IPoSValidatorManager.sol | 10 +- .../tests/PoSValidatorManagerTests.t.sol | 10 +- 5 files changed, 99 insertions(+), 83 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index ee7a070fb..5b23ff8d7 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -82,8 +82,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160f43803806160f483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615fa78061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b336600461534e565b61040d565b005b6101b86101c8366004615389565b6108b1565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004615389565b610a6a565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b86102413660046153a0565b610a80565b6101b86102543660046153b9565b610b20565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b86102843660046153e1565b610cf5565b61029c610297366004615445565b61136e565b6040519081526020016101e3565b6101ff6102b8366004615389565b611387565b61029c5f81565b6101b86102d236600461534e565b61139b565b6101d5603081565b6101b86102ed366004615389565b6115de565b6101b86103003660046153b9565b6116e4565b61029c61031336600461545e565b611a08565b6101b86103263660046153a0565b611a34565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004615389565b611baa565b6101b8610372366004615389565b611e30565b6101d5601481565b61039261038d366004615389565b611f0b565b6040516101e39190615492565b6101ff6202a30081565b61029c6103b7366004615389565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f5366004615552565b611fd3565b6101b86104083660046155cb565b612008565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615efb83398151915293929190829060ff16600481111561046e5761046e61547e565b600481111561047f5761047f61547e565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61050382611f0b565b905060028351600481111561051a5761051a61547e565b1461056c5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f1b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105d15760405162461bcd60e51b815260206004820152603360248201525f80516020615f1b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610563565b6003835280515f9060029060058111156105ed576105ed61547e565b036106445786156106055761060283876120e7565b90505b5f8460600151836080015161061a919061561d565b90506106268482612383565b506001600160401b0390811660e0870152421660a086015250610678565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106ab866060015161136e565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610728573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074c919061563d565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561078b5761078b61547e565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161089f916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f7b8339815191526020526040808220815160e0810190925280545f80516020615f3b83398151915293929190829060ff1660058111156108fe576108fe61547e565b600581111561090f5761090f61547e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561097e5761097e61547e565b146109e35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610563565b6005600160991b016001600160a01b031663ee5b48eb610a088584606001515f6124da565b6040518263ffffffff1660e01b8152600401610a249190615676565b6020604051808303815f875af1158015610a40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a64919061563d565b50505050565b5f610a7a64e8d4a51000836156a8565b92915050565b5f80516020615efb8339815191525f80610a9984612701565b91509150610aa682612a1f565b610ab05750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ade57610ade61547e565b03610b03575f83815260088501602052604081208054919055610b018282612a5a565b505b610b1981610b14846040015161136e565b612ad0565b5050505050565b5f80516020615efb8339815191525f610b3884612af3565b90505f80610b498360400151612cb9565b50915091505f610b5883611f0b565b9050816001600160401b031681606001516001600160401b03161015610b905760405162461bcd60e51b8152600401610563906156c7565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bd55760405162461bcd60e51b815260040161056390615709565b60015f87815260068701602052604090205460ff166004811115610bfb57610bfb61547e565b14610c645760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610563565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615f3b8339815191529060ff1615610d925760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610563565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df9919061563d565b836020013514610e5b5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610563565b30610e6c6060850160408601615752565b6001600160a01b031614610ede5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610563565b5f610eec606085018561576d565b91505f9050843560208601356014610f0a6060890160408a01615752565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561127e575f610f8a606089018961576d565b8363ffffffff16818110610fa057610fa06157b2565b9050602002810190610fb291906157c6565b610fbb90615876565b80515f81815260088901602052604090205491925090156110335760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b6064820152608401610563565b84825f015183602001518460400151604051602001611055949392919061590d565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110a3919061595c565b602060405180830381855afa1580156110be573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110e1919061563d565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff1916600183600581111561116d5761116d61547e565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161122091168661596d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061127790615980565b9050610f6e565b50600484018190555f61129086612af3565b90505f6112a08260400151612ef4565b9050806002856040516112b3919061595c565b602060405180830381855afa1580156112ce573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112f1919061563d565b146113555760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610563565b5050506009909201805460ff1916600117905550505050565b5f610a7a6001600160401b03831664e8d4a510006159a2565b5f61139182611f0b565b6080015192915050565b5f80516020615efb8339815191525f6113b385613066565b90506113be85612a1f565b6113c9575050505050565b5f8581526005830160205260409020546001600160a01b031633146114005760405162461bcd60e51b8152600401610563906159b9565b5f85815260058301602052604090205460a082015161142f91600160b01b90046001600160401b031690615a0b565b6001600160401b03168160c001516001600160401b031610156114b05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610563565b8315610b19575f6114c186856120e7565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906115189061136e565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561158e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115b2919061563d565b5f878152600885016020526040812080549091906115d190849061596d565b9091555050505050505050565b5f80516020615efb8339815191525f6115f683611f0b565b905060048151600581111561160d5761160d61547e565b146116775760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610563565b5f8381526005830160205260409020546001600160a01b031633146116ae5760405162461bcd60e51b8152600401610563906159b9565b5f83815260088301602090815260408083208054908490556005860190925290912054610a64906001600160a01b031682612a5a565b6116ec6132e1565b5f80516020615efb8339815191525f61170484612af3565b90505f806117158360400151612cb9565b50915091505f61172483611f0b565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561175e5761175e61547e565b600481111561176f5761176f61547e565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610156118535760405162461bcd60e51b8152600401610563906156c7565b826001600160401b03168160e001516001600160401b031611156118895760405162461bcd60e51b815260040161056390615709565b60038151600481111561189e5761189e61547e565b146118f25760405162461bcd60e51b815260206004820152603160248201525f80516020615f1b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610563565b5f878152600787016020908152604080832080549084905587845260058a019092528220549091906127109061193390600160a01b900461ffff16846159a2565b61193d91906156a8565b905080886008015f8881526020019081526020015f205f828254611961919061596d565b909155505f90506119728284615a2b565b9050611982846020015182612a5a565b6119978460200151610b14866060015161136e565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d503384866040516119dd929190918252602082015260400190565b60405180910390a4505050505050505050611a0460015f80516020615f5b83398151915255565b5050565b5f611a116132e1565b611a1c83338461332b565b9050610a7a60015f80516020615f5b83398151915255565b5f80516020615f3b8339815191525f611a4c83612af3565b90505f80611a5d83604001516136e5565b9150915080611abf5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610563565b60015f83815260078601602052604090205460ff166005811115611ae557611ae561547e565b14611b025760405162461bcd60e51b815260040161056390615a3e565b5f8281526006850160205260408120611b1a9161529e565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615efb83398151915293929190829060ff166004811115611c0b57611c0b61547e565b6004811115611c1c57611c1c61547e565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ca357611ca361547e565b1480611cc15750600381516004811115611cbf57611cbf61547e565b145b611d155760405162461bcd60e51b815260206004820152603260248201525f80516020615f1b833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610563565b5f611d238260400151611f0b565b905080606001516001600160401b03165f03611da75760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610563565b6005600160991b016001600160a01b031663ee5b48eb611dd48460400151846060015185608001516124da565b6040518263ffffffff1660e01b8152600401611df09190615676565b6020604051808303815f875af1158015611e0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b19919061563d565b5f8181525f80516020615f7b83398151915260205260409020545f80516020615f3b8339815191529060019060ff166005811115611e7057611e7061547e565b14611e8d5760405162461bcd60e51b815260040161056390615a3e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ec69190600401615ac1565b6020604051808303815f875af1158015611ee2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f06919061563d565b505050565b611f136152d5565b5f8281525f80516020615f7b833981519152602052604090819020815160e0810190925280545f80516020615f3b833981519152929190829060ff166005811115611f6057611f6061547e565b6005811115611f7157611f7161547e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611fdc6132e1565b611fe885858585613886565b905061200060015f80516020615f5b83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680612051575080546001600160401b03808416911610155b1561206f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561209a8484613b72565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612132573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121599190810190615b56565b91509150806121bc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610563565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121ff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612223919061563d565b8251146122875760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610563565b60208201516001600160a01b0316156122fd5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610563565b5f8061230c8460400151613b8c565b915091508187146123795760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610563565b9695505050505050565b5f8281525f80516020615f7b833981519152602052604081206002015481905f80516020615f3b83398151915290600160801b90046001600160401b03166123cb8582613d64565b5f6123d587613f72565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124258a858b6124da565b6040518263ffffffff1660e01b81526004016124419190615676565b6020604051808303815f875af115801561245d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612481919061563d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561255357612513816001615a2b565b61251e9060086159a2565b5081515f90839083908110612535576125356157b2565b60200101906001600160f81b03191690815f1a9053506001016124ff565b505f5b60048110156125be5761256a816003615a2b565b6125759060086159a2565b600263ffffffff16901c60f81b82826002612590919061596d565b815181106125a0576125a06157b2565b60200101906001600160f81b03191690815f1a905350600101612556565b505f5b6020811015612620576125d581601f615a2b565b6125e09060086159a2565b86901c60f81b826125f283600661596d565b81518110612602576126026157b2565b60200101906001600160f81b03191690815f1a9053506001016125c1565b505f5b600881101561268b57612637816007615a2b565b6126429060086159a2565b6001600160401b038616901c60f81b8261265d83602661596d565b8151811061266d5761266d6157b2565b60200101906001600160f81b03191690815f1a905350600101612623565b505f5b60088110156126f6576126a2816007615a2b565b6126ad9060086159a2565b6001600160401b038516901c60f81b826126c883602e61596d565b815181106126d8576126d86157b2565b60200101906001600160f81b03191690815f1a90535060010161268e565b5090505b9392505050565b5f61270a6152d5565b5f80516020615f3b8339815191525f61272285612af3565b90505f8061273383604001516136e5565b9150915080156127985760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610563565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156127c9576127c961547e565b60058111156127da576127da61547e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156128495761284961547e565b148061286757506001815160058111156128655761286561547e565b145b6128c65760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610563565b6003815160058111156128db576128db61547e565b036128e957600481526128ee565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156129335761293361547e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129e7576129e761547e565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615edb83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612ab5575f80fd5b505af1158015612ac7573d5f803e3d5ffd5b50505050505050565b5f80516020615edb83398151915254611a04906001600160a01b03168383614002565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612b57573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612b7e9190810190615b56565b9150915080612bde5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610563565b815115612c3f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610563565b60208201516001600160a01b031615612cb25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610563565b5092915050565b5f805f8351603614612cdd5760405162461bcd60e51b815260040161056390615c28565b5f805b6002811015612d2c57612cf4816001615a2b565b612cff9060086159a2565b61ffff16868281518110612d1557612d156157b2565b016020015160f81c901b9190911790600101612ce0565b5061ffff811615612d4f5760405162461bcd60e51b815260040161056390615c71565b5f805b6004811015612daa57612d66816003615a2b565b612d719060086159a2565b63ffffffff1687612d8383600261596d565b81518110612d9357612d936157b2565b016020015160f81c901b9190911790600101612d52565b5063ffffffff8116600414612dd15760405162461bcd60e51b815260040161056390615cb4565b5f805b6020811015612e2657612de881601f615a2b565b612df39060086159a2565b88612dff83600661596d565b81518110612e0f57612e0f6157b2565b016020015160f81c901b9190911790600101612dd4565b505f805b6008811015612e8557612e3e816007615a2b565b612e499060086159a2565b6001600160401b031689612e5e83602661596d565b81518110612e6e57612e6e6157b2565b016020015160f81c901b9190911790600101612e2a565b505f805b6008811015612ee457612e9d816007615a2b565b612ea89060086159a2565b6001600160401b03168a612ebd83602e61596d565b81518110612ecd57612ecd6157b2565b016020015160f81c901b9190911790600101612e89565b5091989097509095509350505050565b5f8151602614612f165760405162461bcd60e51b815260040161056390615c28565b5f805b6002811015612f6557612f2d816001615a2b565b612f389060086159a2565b61ffff16848281518110612f4e57612f4e6157b2565b016020015160f81c901b9190911790600101612f19565b5061ffff811615612f885760405162461bcd60e51b815260040161056390615c71565b5f805b6004811015612fe357612f9f816003615a2b565b612faa9060086159a2565b63ffffffff1685612fbc83600261596d565b81518110612fcc57612fcc6157b2565b016020015160f81c901b9190911790600101612f8b565b5063ffffffff8116156130085760405162461bcd60e51b815260040161056390615cb4565b5f805b602081101561305d5761301f81601f615a2b565b61302a9060086159a2565b8661303683600661596d565b81518110613046576130466157b2565b016020015160f81c901b919091179060010161300b565b50949350505050565b61306e6152d5565b5f8281525f80516020615f7b8339815191526020526040808220815160e0810190925280545f80516020615f3b83398151915293929190829060ff1660058111156130bb576130bb61547e565b60058111156130cc576130cc61547e565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561313e5761313e61547e565b1461319a5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610563565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156131de576131de61547e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61328a8582612383565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f5b83398151915280546001190161331257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f5b83398151915255565b5f5f80516020615efb833981519152816133476101fa85614061565b90505f61335387611f0b565b905061335e87612a1f565b6133bb5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610563565b6002815160058111156133d0576133d061547e565b1461342f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610563565b5f8282608001516134409190615a0b565b60048501546040840151919250613462916001600160401b0390911690615cfb565b6001600160401b0316816001600160401b031611156134e15760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610563565b5f806134ed8a84612383565b915091505f8a8360405160200161351b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156135b6576135b661547e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146137085760405162461bcd60e51b815260040161056390615c28565b5f805b60028110156137575761371f816001615a2b565b61372a9060086159a2565b61ffff16858281518110613740576137406157b2565b016020015160f81c901b919091179060010161370b565b5061ffff81161561377a5760405162461bcd60e51b815260040161056390615c71565b5f805b60048110156137d557613791816003615a2b565b61379c9060086159a2565b63ffffffff16866137ae83600261596d565b815181106137be576137be6157b2565b016020015160f81c901b919091179060010161377d565b5063ffffffff81166003146137fc5760405162461bcd60e51b815260040161056390615cb4565b5f805b60208110156138515761381381601f615a2b565b61381e9060086159a2565b8761382a83600661596d565b8151811061383a5761383a6157b2565b016020015160f81c901b91909117906001016137ff565b505f86602681518110613866576138666157b2565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615efb8339815191529061ffff8616101561390d5760405162461bcd60e51b815260206004820152602b60248201525f80516020615f1b83398151915260448201526a66656520746f6f206c6f7760a81b6064820152608401610563565b61271061ffff861611156139655760405162461bcd60e51b815260206004820152602c60248201525f80516020615f1b83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b6064820152608401610563565b60028101546001600160401b0390811690851610156139de5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610563565b8054831015613a415760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610563565b8060010154831115613aa85760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610563565b5f613ab284614061565b90505f613abe82610a6a565b90505f613acb8983614084565b90506040518060600160405280613adf3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613b7a61463a565b613b8382614685565b611a04816146fa565b5f808251602e14613baf5760405162461bcd60e51b815260040161056390615c28565b5f805b6002811015613bfe57613bc6816001615a2b565b613bd19060086159a2565b61ffff16858281518110613be757613be76157b2565b016020015160f81c901b9190911790600101613bb2565b5061ffff811615613c215760405162461bcd60e51b815260040161056390615c71565b5f805b6004811015613c7c57613c38816003615a2b565b613c439060086159a2565b63ffffffff1686613c5583600261596d565b81518110613c6557613c656157b2565b016020015160f81c901b9190911790600101613c24565b5063ffffffff8116600514613ca35760405162461bcd60e51b815260040161056390615cb4565b5f805b6020811015613cf857613cba81601f615a2b565b613cc59060086159a2565b87613cd183600661596d565b81518110613ce157613ce16157b2565b016020015160f81c901b9190911790600101613ca6565b505f805b6008811015613d5757613d10816007615a2b565b613d1b9060086159a2565b6001600160401b031688613d3083602661596d565b81518110613d4057613d406157b2565b016020015160f81c901b9190911790600101613cfc565b5090969095509350505050565b5f80516020615f3b8339815191525f6001600160401b038084169085161115613d9857613d91838561561d565b9050613da5565b613da2848461561d565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613e07575060018401548151613e03916001600160401b03169061596d565b8210155b15613e2d576001600160401b038316606082015281815260408101516020820152613e4c565b8281606001818151613e3f9190615a0b565b6001600160401b03169052505b6060810151613e5c906064615cfb565b602082015160018601546001600160401b039290921691613e879190600160401b900460ff166159a2565b1015613eeb5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610563565b856001600160401b031681604001818151613f06919061596d565b9052506040810180516001600160401b0387169190613f26908390615a2b565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f7b8339815191526020526040812060020180545f80516020615f3b83398151915291600160401b9091046001600160401b0316906008613fbc83615d26565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611f0691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061479b565b5f610a7a825f80516020615edb833981519152546001600160a01b0316906147fc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661410f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610563565b5f80516020615f3b8339815191524261412e6040860160208701615445565b6001600160401b0316116141a05760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610563565b6141b06040850160208601615445565b6001600160401b03166141c66202a3004261596d565b116142395760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610563565b83356142915760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610563565b83355f908152600882016020526040902054156143015760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610563565b60306143106040860186615d41565b9050146143755760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610563565b61437f835f613d64565b5f806144186040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906143c39190615445565b6001600160401b031681526020016143de60408a018a615d41565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061495e565b5f828152600686016020526040902091935091506144368282615dc7565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614474908590600401615676565b6020604051808303815f875af1158015614490573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144b4919061563d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561452c5761452c61547e565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161460c918e01908e01615445565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661468357604051631afcd79f60e31b815260040160405180910390fd5b565b61468d61463a565b61469681614d0d565b61469e614d26565b6146f7606082013560808301356146bb60c0850160a08601615445565b6146cb60e0860160c08701615e86565b61ffff166146e0610100870160e08801615e9f565b6146f261012088016101008901615752565b614d36565b50565b61470261463a565b5f80516020615edb8339815191526001600160a01b03821661477b5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610563565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6147af6001600160a01b03841683614fbe565b905080515f141580156147d35750808060200190518101906147d19190615ebf565b155b15611f0657604051635274afe760e01b81526001600160a01b0384166004820152602401610563565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614842573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614866919061563d565b905061487d6001600160a01b038516333086614fcb565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156148c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906148e5919061563d565b905081811161494b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610563565b6149558282615a2b565b95945050505050565b5f60608260800151516030146149c85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610563565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614a3f576149ff816001615a2b565b614a0a9060086159a2565b5081515f90839083908110614a2157614a216157b2565b60200101906001600160f81b03191690815f1a9053506001016149eb565b505f5b6004811015614aa757614a56816003615a2b565b614a619060086159a2565b600160ff919091161c60f81b82614a7983600261596d565b81518110614a8957614a896157b2565b60200101906001600160f81b03191690815f1a905350600101614a42565b505f5b6020811015614b045784518160208110614ac657614ac66157b2565b1a60f81b82614ad683600661596d565b81518110614ae657614ae66157b2565b60200101906001600160f81b03191690815f1a905350600101614aaa565b505f5b6020811015614b645784602001518160208110614b2657614b266157b2565b1a60f81b82614b3683602661596d565b81518110614b4657614b466157b2565b60200101906001600160f81b03191690815f1a905350600101614b07565b505f5b6008811015614bd857614b7b816007615a2b565b614b869060086159a2565b60ff1685604001516001600160401b0316901c60f81b82826046614baa919061596d565b81518110614bba57614bba6157b2565b60200101906001600160f81b03191690815f1a905350600101614b67565b505f5b6030811015614c435784608001518181518110614bfa57614bfa6157b2565b01602001516001600160f81b03191682614c1583604e61596d565b81518110614c2557614c256157b2565b60200101906001600160f81b03191690815f1a905350600101614bdb565b505f5b6008811015614cb557614c5a816007615a2b565b614c659060086159a2565b60608601516001600160401b0390811691161c60f81b82614c8783607e61596d565b81518110614c9757614c976157b2565b60200101906001600160f81b03191690815f1a905350600101614c46565b50600281604051614cc6919061595c565b602060405180830381855afa158015614ce1573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614d04919061563d565b94909350915050565b614d1561463a565b614d1d615004565b6146f78161500c565b614d2e61463a565b614683615187565b614d3e61463a565b5f80516020615efb83398151915283614daa5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610563565b612710841115614e105760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610563565b85871115614e785760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610563565b5f8360ff1611614ee55760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610563565b600a60ff84161115614f575760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610563565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606126fa83835f61518f565b6040516001600160a01b038481166024830152838116604483015260648201839052610a649186918216906323b872dd9060840161402f565b61468361463a565b61501461463a565b80355f80516020615f3b83398151915290815560146150396060840160408501615e9f565b60ff1611156150a65760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610563565b5f6150b76060840160408501615e9f565b60ff161161511f5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610563565b61512f6060830160408401615e9f565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556151606040830160208401615445565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61331861463a565b6060814710156151b45760405163cd78605960e01b8152306004820152602401610563565b5f80856001600160a01b031684866040516151cf919061595c565b5f6040518083038185875af1925050503d805f8114615209576040519150601f19603f3d011682016040523d82523d5f602084013e61520e565b606091505b509150915061237986838360608261522e5761522982615275565b6126fa565b815115801561524557506001600160a01b0384163b155b1561526e57604051639996b31560e01b81526001600160a01b0385166004820152602401610563565b50806126fa565b8051156152855780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546152aa90615a89565b5f825580601f106152b9575050565b601f0160209004905f5260205f20908101906146f79190615311565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615325575f8155600101615312565b5090565b80151581146146f7575f80fd5b803563ffffffff81168114615349575f80fd5b919050565b5f805f60608486031215615360575f80fd5b83359250602084013561537281615329565b915061538060408501615336565b90509250925092565b5f60208284031215615399575f80fd5b5035919050565b5f602082840312156153b0575f80fd5b6126fa82615336565b5f80604083850312156153ca575f80fd5b6153d383615336565b946020939093013593505050565b5f80604083850312156153f2575f80fd5b82356001600160401b03811115615407575f80fd5b830160808186031215615418575f80fd5b915061542660208401615336565b90509250929050565b80356001600160401b0381168114615349575f80fd5b5f60208284031215615455575f80fd5b6126fa8261542f565b5f806040838503121561546f575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106154b557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516154f060608401826001600160401b03169052565b50608083015161550b60808401826001600160401b03169052565b5060a083015161552660a08401826001600160401b03169052565b5060c0830151612cb260c08401826001600160401b03169052565b803561ffff81168114615349575f80fd5b5f805f8060808587031215615565575f80fd5b84356001600160401b0381111561557a575f80fd5b85016060818803121561558b575f80fd5b935061559960208601615541565b92506155a76040860161542f565b9396929550929360600135925050565b6001600160a01b03811681146146f7575f80fd5b5f808284036101408112156155de575f80fd5b610120808212156155ed575f80fd5b84935083013590506155fe816155b7565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612cb257612cb2615609565b5f6020828403121561564d575f80fd5b5051919050565b5f5b8381101561566e578181015183820152602001615656565b50505f910152565b602081525f8251806020840152615694816040850160208701615654565b601f01601f19169190910160400192915050565b5f826156c257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615762575f80fd5b81356126fa816155b7565b5f808335601e19843603018112615782575f80fd5b8301803591506001600160401b0382111561579b575f80fd5b6020019150600581901b36038213156124d3575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126157da575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561581a5761581a6157e4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615848576158486157e4565b604052919050565b5f6001600160401b03821115615868576158686157e4565b50601f01601f191660200190565b5f60608236031215615886575f80fd5b61588e6157f8565b82358152602061589f81850161542f565b8183015260408401356001600160401b038111156158bb575f80fd5b840136601f8201126158cb575f80fd5b80356158de6158d982615850565b615820565b81815236848385010111156158f1575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f855161591e818460208a01615654565b80830190508581526001600160401b0360c01b8560c01b166020820152835161594e816028840160208801615654565b016028019695505050505050565b5f82516157da818460208701615654565b80820180821115610a7a57610a7a615609565b5f63ffffffff80831681810361599857615998615609565b6001019392505050565b8082028115828204841417610a7a57610a7a615609565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b03818116838216019080821115612cb257612cb2615609565b81810381811115610a7a57610a7a615609565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615a9d57607f821691505b602082108103615abb57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454615ad381615a89565b806020870152604060018084165f8114615af45760018114615b1057615b3d565b60ff19851660408a0152604084151560051b8a01019550615b3d565b895f5260205f205f5b85811015615b345781548b8201860152908301908801615b19565b8a016040019650505b509398975050505050505050565b805161534981615329565b5f8060408385031215615b67575f80fd5b82516001600160401b0380821115615b7d575f80fd5b9084019060608287031215615b90575f80fd5b615b986157f8565b82518152602080840151615bab816155b7565b82820152604084015183811115615bc0575f80fd5b80850194505087601f850112615bd4575f80fd5b83519250615be46158d984615850565b8381528882858701011115615bf7575f80fd5b615c0684838301848801615654565b80604084015250819550615c1b818801615b4b565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615d1e57615d1e615609565b505092915050565b5f6001600160401b0380831681810361599857615998615609565b5f808335601e19843603018112615d56575f80fd5b8301803591506001600160401b03821115615d6f575f80fd5b6020019150368190038213156124d3575f80fd5b601f821115611f0657805f5260205f20601f840160051c81016020851015615da85750805b601f840160051c820191505b81811015610b19575f8155600101615db4565b81516001600160401b03811115615de057615de06157e4565b615df481615dee8454615a89565b84615d83565b602080601f831160018114615e27575f8415615e105750858301515b5f19600386901b1c1916600185901b178555615e7e565b5f85815260208120601f198616915b82811015615e5557888601518255948401946001909101908401615e36565b5085821015615e7257878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e96575f80fd5b6126fa82615541565b5f60208284031215615eaf575f80fd5b813560ff811681146126fa575f80fd5b5f60208284031215615ecf575f80fd5b81516126fa8161532956fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161646d38038061646d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6163208061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b336600461569f565b61040d565b005b6101b86101c83660046156da565b61089e565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa3660046156da565b610a57565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b86102413660046156f1565b610a6d565b6101b861025436600461570a565b610b0d565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b8610284366004615732565b610f9d565b61029c610297366004615796565b611616565b6040519081526020016101e3565b6101ff6102b83660046156da565b61162f565b61029c5f81565b6101b86102d236600461569f565b611643565b6101d5603081565b6101b86102ed3660046156da565b611886565b6101b861030036600461570a565b61198c565b61029c6103133660046157af565b611b6f565b6101b86103263660046156f1565b611b9b565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f3660046156da565b611d11565b6101b86103723660046156da565b611f84565b6101d5601481565b61039261038d3660046156da565b61205f565b6040516101e391906157e3565b6101ff6202a30081565b61029c6103b73660046156da565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f53660046158a3565b612127565b6101b861040836600461591c565b61215c565b5f8381525f805160206162b483398151915260205260408082208151610100810190925280545f8051602061625483398151915293929190829060ff16600481111561045b5761045b6157cf565b600481111561046c5761046c6157cf565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104f08261205f565b9050600283516004811115610507576105076157cf565b146105595760405162461bcd60e51b815260206004820152602a60248201525f805160206162748339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105be5760405162461bcd60e51b815260206004820152603360248201525f805160206162748339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610550565b6003835280515f9060029060058111156105da576105da6157cf565b036106315786156105f2576105ef838761223b565b90505b5f84606001518360800151610607919061596e565b905061061384826124d7565b506001600160401b0390811660e0870152421660a086015250610665565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106988660600151611616565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610715573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610739919061598e565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff19166001836004811115610778576107786157cf565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206162f48339815191526020526040808220815160e0810190925280545f8051602061629483398151915293929190829060ff1660058111156108eb576108eb6157cf565b60058111156108fc576108fc6157cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096b5761096b6157cf565b146109d05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610550565b6005600160991b016001600160a01b031663ee5b48eb6109f58584606001515f61262e565b6040518263ffffffff1660e01b8152600401610a1191906159c7565b6020604051808303815f875af1158015610a2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a51919061598e565b50505050565b5f610a6764e8d4a51000836159f9565b92915050565b5f805160206162548339815191525f80610a8684612855565b91509150610a9382612b73565b610a9d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610acb57610acb6157cf565b03610af0575f83815260088501602052604081208054919055610aee8282612bae565b505b610b0681610b018460400151611616565b612c24565b5050505050565b5f8181525f805160206162b483398151915260205260408082208151610100810190925280545f8051602061625483398151915293929190829060ff166004811115610b5b57610b5b6157cf565b6004811115610b6c57610b6c6157cf565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf19061205f565b9050600182516004811115610c0857610c086157cf565b14610c715760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610550565b600381516005811115610c8657610c866157cf565b03610dfe576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610cea57610cea6157cf565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1357610e136157cf565b03610e2157610b0684612c47565b5f610e2b86612e44565b90505f80610e3c836040015161300a565b509150915081856040015114610e645760405162461bcd60e51b815260040161055090615a18565b806001600160401b031684606001516001600160401b03161015610ed55760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b6064820152608401610550565b806001600160401b03168560c001516001600160401b03161115610f0b5760405162461bcd60e51b815260040161055090615a62565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206162948339815191529060ff161561103a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610550565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a1919061598e565b8360200135146111035760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610550565b306111146060850160408601615aab565b6001600160a01b0316146111865760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610550565b5f6111946060850185615ac6565b91505f90508435602086013560146111b26060890160408a01615aab565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611526575f6112326060890189615ac6565b8363ffffffff1681811061124857611248615b0b565b905060200281019061125a9190615b1f565b61126390615bcf565b80515f81815260088901602052604090205491925090156112db5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b6064820152608401610550565b84825f0151836020015184604001516040516020016112fd9493929190615c66565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161134b9190615cb5565b602060405180830381855afa158015611366573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611389919061598e565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff19166001836005811115611415576114156157cf565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516114c8911686615cc6565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061151f90615cd9565b9050611216565b50600484018190555f61153886612e44565b90505f6115488260400151613245565b90508060028560405161155b9190615cb5565b602060405180830381855afa158015611576573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611599919061598e565b146115fd5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610550565b5050506009909201805460ff1916600117905550505050565b5f610a676001600160401b03831664e8d4a51000615cfb565b5f6116398261205f565b6080015192915050565b5f805160206162548339815191525f61165b856133b7565b905061166685612b73565b611671575050505050565b5f8581526005830160205260409020546001600160a01b031633146116a85760405162461bcd60e51b815260040161055090615d12565b5f85815260058301602052604090205460a08201516116d791600160b01b90046001600160401b031690615d64565b6001600160401b03168160c001516001600160401b031610156117585760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610550565b8315610b06575f611769868561223b565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117c090611616565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611836573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061185a919061598e565b5f87815260088501602052604081208054909190611879908490615cc6565b9091555050505050505050565b5f805160206162548339815191525f61189e8361205f565b90506004815160058111156118b5576118b56157cf565b1461191f5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610550565b5f8381526005830160205260409020546001600160a01b031633146119565760405162461bcd60e51b815260040161055090615d12565b5f83815260088301602090815260408083208054908490556005860190925290912054610a51906001600160a01b031682612bae565b611994613632565b5f8181525f805160206162b483398151915260205260408082208151610100810190925280545f8051602061625483398151915293929190829060ff1660048111156119e2576119e26157cf565b60048111156119f3576119f36157cf565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611a6f85612e44565b90505f80611a80836040015161300a565b509150915081846040015114611aa85760405162461bcd60e51b815260040161055090615a18565b806001600160401b03168460e001516001600160401b03161115611ade5760405162461bcd60e51b815260040161055090615a62565b600384516004811115611af357611af36157cf565b14611b475760405162461bcd60e51b815260206004820152603160248201525f805160206162748339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610550565b611b5086612c47565b5050505050611b6b60015f805160206162d483398151915255565b5050565b5f611b78613632565b611b8383338461367c565b9050610a6760015f805160206162d483398151915255565b5f805160206162948339815191525f611bb383612e44565b90505f80611bc48360400151613a36565b9150915080611c265760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610550565b60015f83815260078601602052604090205460ff166005811115611c4c57611c4c6157cf565b14611c695760405162461bcd60e51b815260040161055090615d84565b5f8281526006850160205260408120611c81916155ef565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206162b483398151915260205260408082208151610100810190925280545f8051602061625483398151915293929190829060ff166004811115611d5f57611d5f6157cf565b6004811115611d7057611d706157cf565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611df757611df76157cf565b1480611e155750600381516004811115611e1357611e136157cf565b145b611e695760405162461bcd60e51b815260206004820152603260248201525f80516020616274833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610550565b5f611e77826040015161205f565b905080606001516001600160401b03165f03611efb5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610550565b6005600160991b016001600160a01b031663ee5b48eb611f2884604001518460600151856080015161262e565b6040518263ffffffff1660e01b8152600401611f4491906159c7565b6020604051808303815f875af1158015611f60573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b06919061598e565b5f8181525f805160206162f483398151915260205260409020545f805160206162948339815191529060019060ff166005811115611fc457611fc46157cf565b14611fe15760405162461bcd60e51b815260040161055090615d84565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161201a9190600401615e07565b6020604051808303815f875af1158015612036573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061205a919061598e565b505050565b612067615626565b5f8281525f805160206162f4833981519152602052604090819020815160e0810190925280545f80516020616294833981519152929190829060ff1660058111156120b4576120b46157cf565b60058111156120c5576120c56157cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f612130613632565b61213c85858585613bd7565b905061215460015f805160206162d483398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806121a5575080546001600160401b03808416911610155b156121c35760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556121ee8484613ec3565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612286573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122ad9190810190615e9c565b91509150806123105760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610550565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612353573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612377919061598e565b8251146123db5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610550565b60208201516001600160a01b0316156124515760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610550565b5f806124608460400151613edd565b915091508187146124cd5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610550565b9695505050505050565b5f8281525f805160206162f4833981519152602052604081206002015481905f8051602061629483398151915290600160801b90046001600160401b031661251f85826140b5565b5f612529876142c3565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125798a858b61262e565b6040518263ffffffff1660e01b815260040161259591906159c7565b6020604051808303815f875af11580156125b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d5919061598e565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126a757612667816001615f6e565b612672906008615cfb565b5081515f9083908390811061268957612689615b0b565b60200101906001600160f81b03191690815f1a905350600101612653565b505f5b6004811015612712576126be816003615f6e565b6126c9906008615cfb565b600263ffffffff16901c60f81b828260026126e49190615cc6565b815181106126f4576126f4615b0b565b60200101906001600160f81b03191690815f1a9053506001016126aa565b505f5b60208110156127745761272981601f615f6e565b612734906008615cfb565b86901c60f81b82612746836006615cc6565b8151811061275657612756615b0b565b60200101906001600160f81b03191690815f1a905350600101612715565b505f5b60088110156127df5761278b816007615f6e565b612796906008615cfb565b6001600160401b038616901c60f81b826127b1836026615cc6565b815181106127c1576127c1615b0b565b60200101906001600160f81b03191690815f1a905350600101612777565b505f5b600881101561284a576127f6816007615f6e565b612801906008615cfb565b6001600160401b038516901c60f81b8261281c83602e615cc6565b8151811061282c5761282c615b0b565b60200101906001600160f81b03191690815f1a9053506001016127e2565b5090505b9392505050565b5f61285e615626565b5f805160206162948339815191525f61287685612e44565b90505f806128878360400151613a36565b9150915080156128ec5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610550565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561291d5761291d6157cf565b600581111561292e5761292e6157cf565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561299d5761299d6157cf565b14806129bb57506001815160058111156129b9576129b96157cf565b145b612a1a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610550565b600381516005811115612a2f57612a2f6157cf565b03612a3d5760048152612a42565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612a8757612a876157cf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b3b57612b3b6157cf565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f8051602061623483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c09575f80fd5b505af1158015612c1b573d5f803e3d5ffd5b50505050505050565b5f8051602061623483398151915254611b6b906001600160a01b03168383614353565b5f8181525f805160206162b483398151915260205260408082208151610100810190925280545f8051602061625483398151915293929190829060ff166004811115612c9557612c956157cf565b6004811115612ca657612ca66157cf565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612d9a90600160a01b900461ffff1684615cfb565b612da491906159f9565b905080856008015f8581526020019081526020015f205f828254612dc89190615cc6565b909155505f9050612dd98284615f6e565b9050612de9856020015182612bae565b612dfe8560200151610b018760600151611616565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ea8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ecf9190810190615e9c565b9150915080612f2f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610550565b815115612f905760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610550565b60208201516001600160a01b0316156130035760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610550565b5092915050565b5f805f835160361461302e5760405162461bcd60e51b815260040161055090615f81565b5f805b600281101561307d57613045816001615f6e565b613050906008615cfb565b61ffff1686828151811061306657613066615b0b565b016020015160f81c901b9190911790600101613031565b5061ffff8116156130a05760405162461bcd60e51b815260040161055090615fca565b5f805b60048110156130fb576130b7816003615f6e565b6130c2906008615cfb565b63ffffffff16876130d4836002615cc6565b815181106130e4576130e4615b0b565b016020015160f81c901b91909117906001016130a3565b5063ffffffff81166004146131225760405162461bcd60e51b81526004016105509061600d565b5f805b60208110156131775761313981601f615f6e565b613144906008615cfb565b88613150836006615cc6565b8151811061316057613160615b0b565b016020015160f81c901b9190911790600101613125565b505f805b60088110156131d65761318f816007615f6e565b61319a906008615cfb565b6001600160401b0316896131af836026615cc6565b815181106131bf576131bf615b0b565b016020015160f81c901b919091179060010161317b565b505f805b6008811015613235576131ee816007615f6e565b6131f9906008615cfb565b6001600160401b03168a61320e83602e615cc6565b8151811061321e5761321e615b0b565b016020015160f81c901b91909117906001016131da565b5091989097509095509350505050565b5f81516026146132675760405162461bcd60e51b815260040161055090615f81565b5f805b60028110156132b65761327e816001615f6e565b613289906008615cfb565b61ffff1684828151811061329f5761329f615b0b565b016020015160f81c901b919091179060010161326a565b5061ffff8116156132d95760405162461bcd60e51b815260040161055090615fca565b5f805b6004811015613334576132f0816003615f6e565b6132fb906008615cfb565b63ffffffff168561330d836002615cc6565b8151811061331d5761331d615b0b565b016020015160f81c901b91909117906001016132dc565b5063ffffffff8116156133595760405162461bcd60e51b81526004016105509061600d565b5f805b60208110156133ae5761337081601f615f6e565b61337b906008615cfb565b86613387836006615cc6565b8151811061339757613397615b0b565b016020015160f81c901b919091179060010161335c565b50949350505050565b6133bf615626565b5f8281525f805160206162f48339815191526020526040808220815160e0810190925280545f8051602061629483398151915293929190829060ff16600581111561340c5761340c6157cf565b600581111561341d5761341d6157cf565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561348f5761348f6157cf565b146134eb5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610550565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561352f5761352f6157cf565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6135db85826124d7565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f805160206162d483398151915280546001190161366357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206162d483398151915255565b5f5f80516020616254833981519152816136986101fa856143b2565b90505f6136a48761205f565b90506136af87612b73565b61370c5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610550565b600281516005811115613721576137216157cf565b146137805760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610550565b5f8282608001516137919190615d64565b600485015460408401519192506137b3916001600160401b0390911690616054565b6001600160401b0316816001600160401b031611156138325760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610550565b5f8061383e8a846124d7565b915091505f8a8360405160200161386c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613907576139076157cf565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613a595760405162461bcd60e51b815260040161055090615f81565b5f805b6002811015613aa857613a70816001615f6e565b613a7b906008615cfb565b61ffff16858281518110613a9157613a91615b0b565b016020015160f81c901b9190911790600101613a5c565b5061ffff811615613acb5760405162461bcd60e51b815260040161055090615fca565b5f805b6004811015613b2657613ae2816003615f6e565b613aed906008615cfb565b63ffffffff1686613aff836002615cc6565b81518110613b0f57613b0f615b0b565b016020015160f81c901b9190911790600101613ace565b5063ffffffff8116600314613b4d5760405162461bcd60e51b81526004016105509061600d565b5f805b6020811015613ba257613b6481601f615f6e565b613b6f906008615cfb565b87613b7b836006615cc6565b81518110613b8b57613b8b615b0b565b016020015160f81c901b9190911790600101613b50565b505f86602681518110613bb757613bb7615b0b565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206162548339815191529061ffff86161015613c5e5760405162461bcd60e51b815260206004820152602b60248201525f8051602061627483398151915260448201526a66656520746f6f206c6f7760a81b6064820152608401610550565b61271061ffff86161115613cb65760405162461bcd60e51b815260206004820152602c60248201525f8051602061627483398151915260448201526b0cccaca40e8dede40d0d2ced60a31b6064820152608401610550565b60028101546001600160401b039081169085161015613d2f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610550565b8054831015613d925760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610550565b8060010154831115613df95760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610550565b5f613e03846143b2565b90505f613e0f82610a57565b90505f613e1c89836143d5565b90506040518060600160405280613e303390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613ecb61498b565b613ed4826149d6565b611b6b81614a4b565b5f808251602e14613f005760405162461bcd60e51b815260040161055090615f81565b5f805b6002811015613f4f57613f17816001615f6e565b613f22906008615cfb565b61ffff16858281518110613f3857613f38615b0b565b016020015160f81c901b9190911790600101613f03565b5061ffff811615613f725760405162461bcd60e51b815260040161055090615fca565b5f805b6004811015613fcd57613f89816003615f6e565b613f94906008615cfb565b63ffffffff1686613fa6836002615cc6565b81518110613fb657613fb6615b0b565b016020015160f81c901b9190911790600101613f75565b5063ffffffff8116600514613ff45760405162461bcd60e51b81526004016105509061600d565b5f805b60208110156140495761400b81601f615f6e565b614016906008615cfb565b87614022836006615cc6565b8151811061403257614032615b0b565b016020015160f81c901b9190911790600101613ff7565b505f805b60088110156140a857614061816007615f6e565b61406c906008615cfb565b6001600160401b031688614081836026615cc6565b8151811061409157614091615b0b565b016020015160f81c901b919091179060010161404d565b5090969095509350505050565b5f805160206162948339815191525f6001600160401b0380841690851611156140e9576140e2838561596e565b90506140f6565b6140f3848461596e565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614158575060018401548151614154916001600160401b031690615cc6565b8210155b1561417e576001600160401b03831660608201528181526040810151602082015261419d565b82816060018181516141909190615d64565b6001600160401b03169052505b60608101516141ad906064616054565b602082015160018601546001600160401b0392909216916141d89190600160401b900460ff16615cfb565b101561423c5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610550565b856001600160401b0316816040018181516142579190615cc6565b9052506040810180516001600160401b0387169190614277908390615f6e565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162f48339815191526020526040812060020180545f8051602061629483398151915291600160401b9091046001600160401b031690600861430d8361607f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b0383811660248301526044820183905261205a91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614aec565b5f610a67825f80516020616234833981519152546001600160a01b031690614b4d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166144605760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610550565b5f805160206162948339815191524261447f6040860160208701615796565b6001600160401b0316116144f15760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610550565b6145016040850160208601615796565b6001600160401b03166145176202a30042615cc6565b1161458a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610550565b83356145e25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610550565b83355f908152600882016020526040902054156146525760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610550565b6030614661604086018661609a565b9050146146c65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610550565b6146d0835f6140b5565b5f806147696040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906147149190615796565b6001600160401b0316815260200161472f60408a018a61609a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614caf565b5f828152600686016020526040902091935091506147878282616120565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906147c59085906004016159c7565b6020604051808303815f875af11580156147e1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614805919061598e565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561487d5761487d6157cf565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161495d918e01908e01615796565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166149d457604051631afcd79f60e31b815260040160405180910390fd5b565b6149de61498b565b6149e78161505e565b6149ef615077565b614a4860608201356080830135614a0c60c0850160a08601615796565b614a1c60e0860160c087016161df565b61ffff16614a31610100870160e088016161f8565b614a4361012088016101008901615aab565b615087565b50565b614a5361498b565b5f805160206162348339815191526001600160a01b038216614acc5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610550565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f614b006001600160a01b0384168361530f565b905080515f14158015614b24575080806020019051810190614b229190616218565b155b1561205a57604051635274afe760e01b81526001600160a01b0384166004820152602401610550565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614b93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614bb7919061598e565b9050614bce6001600160a01b03851633308661531c565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614c12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614c36919061598e565b9050818111614c9c5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610550565b614ca68282615f6e565b95945050505050565b5f6060826080015151603014614d195760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610550565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614d9057614d50816001615f6e565b614d5b906008615cfb565b5081515f90839083908110614d7257614d72615b0b565b60200101906001600160f81b03191690815f1a905350600101614d3c565b505f5b6004811015614df857614da7816003615f6e565b614db2906008615cfb565b600160ff919091161c60f81b82614dca836002615cc6565b81518110614dda57614dda615b0b565b60200101906001600160f81b03191690815f1a905350600101614d93565b505f5b6020811015614e555784518160208110614e1757614e17615b0b565b1a60f81b82614e27836006615cc6565b81518110614e3757614e37615b0b565b60200101906001600160f81b03191690815f1a905350600101614dfb565b505f5b6020811015614eb55784602001518160208110614e7757614e77615b0b565b1a60f81b82614e87836026615cc6565b81518110614e9757614e97615b0b565b60200101906001600160f81b03191690815f1a905350600101614e58565b505f5b6008811015614f2957614ecc816007615f6e565b614ed7906008615cfb565b60ff1685604001516001600160401b0316901c60f81b82826046614efb9190615cc6565b81518110614f0b57614f0b615b0b565b60200101906001600160f81b03191690815f1a905350600101614eb8565b505f5b6030811015614f945784608001518181518110614f4b57614f4b615b0b565b01602001516001600160f81b03191682614f6683604e615cc6565b81518110614f7657614f76615b0b565b60200101906001600160f81b03191690815f1a905350600101614f2c565b505f5b600881101561500657614fab816007615f6e565b614fb6906008615cfb565b60608601516001600160401b0390811691161c60f81b82614fd883607e615cc6565b81518110614fe857614fe8615b0b565b60200101906001600160f81b03191690815f1a905350600101614f97565b506002816040516150179190615cb5565b602060405180830381855afa158015615032573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190615055919061598e565b94909350915050565b61506661498b565b61506e615355565b614a488161535d565b61507f61498b565b6149d46154d8565b61508f61498b565b5f80516020616254833981519152836150fb5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610550565b6127108411156151615760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610550565b858711156151c95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610550565b5f8360ff16116152365760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610550565b600a60ff841611156152a85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610550565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b606061284e83835f6154e0565b6040516001600160a01b038481166024830152838116604483015260648201839052610a519186918216906323b872dd90608401614380565b6149d461498b565b61536561498b565b80355f80516020616294833981519152908155601461538a60608401604085016161f8565b60ff1611156153f75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610550565b5f61540860608401604085016161f8565b60ff16116154705760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610550565b61548060608301604084016161f8565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556154b16040830160208401615796565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61366961498b565b6060814710156155055760405163cd78605960e01b8152306004820152602401610550565b5f80856001600160a01b031684866040516155209190615cb5565b5f6040518083038185875af1925050503d805f811461555a576040519150601f19603f3d011682016040523d82523d5f602084013e61555f565b606091505b50915091506124cd86838360608261557f5761557a826155c6565b61284e565b815115801561559657506001600160a01b0384163b155b156155bf57604051639996b31560e01b81526001600160a01b0385166004820152602401610550565b508061284e565b8051156155d65780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546155fb90615dcf565b5f825580601f1061560a575050565b601f0160209004905f5260205f2090810190614a489190615662565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615676575f8155600101615663565b5090565b8015158114614a48575f80fd5b803563ffffffff8116811461569a575f80fd5b919050565b5f805f606084860312156156b1575f80fd5b8335925060208401356156c38161567a565b91506156d160408501615687565b90509250925092565b5f602082840312156156ea575f80fd5b5035919050565b5f60208284031215615701575f80fd5b61284e82615687565b5f806040838503121561571b575f80fd5b61572483615687565b946020939093013593505050565b5f8060408385031215615743575f80fd5b82356001600160401b03811115615758575f80fd5b830160808186031215615769575f80fd5b915061577760208401615687565b90509250929050565b80356001600160401b038116811461569a575f80fd5b5f602082840312156157a6575f80fd5b61284e82615780565b5f80604083850312156157c0575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061580657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161584160608401826001600160401b03169052565b50608083015161585c60808401826001600160401b03169052565b5060a083015161587760a08401826001600160401b03169052565b5060c083015161300360c08401826001600160401b03169052565b803561ffff8116811461569a575f80fd5b5f805f80608085870312156158b6575f80fd5b84356001600160401b038111156158cb575f80fd5b8501606081880312156158dc575f80fd5b93506158ea60208601615892565b92506158f860408601615780565b9396929550929360600135925050565b6001600160a01b0381168114614a48575f80fd5b5f8082840361014081121561592f575f80fd5b6101208082121561593e575f80fd5b849350830135905061594f81615908565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156130035761300361595a565b5f6020828403121561599e575f80fd5b5051919050565b5f5b838110156159bf5781810151838201526020016159a7565b50505f910152565b602081525f82518060208401526159e58160408501602087016159a5565b601f01601f19169190910160400192915050565b5f82615a1357634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615abb575f80fd5b813561284e81615908565b5f808335601e19843603018112615adb575f80fd5b8301803591506001600160401b03821115615af4575f80fd5b6020019150600581901b3603821315612627575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615b33575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b7357615b73615b3d565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615ba157615ba1615b3d565b604052919050565b5f6001600160401b03821115615bc157615bc1615b3d565b50601f01601f191660200190565b5f60608236031215615bdf575f80fd5b615be7615b51565b823581526020615bf8818501615780565b8183015260408401356001600160401b03811115615c14575f80fd5b840136601f820112615c24575f80fd5b8035615c37615c3282615ba9565b615b79565b8181523684838501011115615c4a575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551615c77818460208a016159a5565b80830190508581526001600160401b0360c01b8560c01b1660208201528351615ca78160288401602088016159a5565b016028019695505050505050565b5f8251615b338184602087016159a5565b80820180821115610a6757610a6761595a565b5f63ffffffff808316818103615cf157615cf161595a565b6001019392505050565b8082028115828204841417610a6757610a6761595a565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156130035761300361595a565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615de357607f821691505b602082108103615e0157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454615e1981615dcf565b806020870152604060018084165f8114615e3a5760018114615e5657615e83565b60ff19851660408a0152604084151560051b8a01019550615e83565b895f5260205f205f5b85811015615e7a5781548b8201860152908301908801615e5f565b8a016040019650505b509398975050505050505050565b805161569a8161567a565b5f8060408385031215615ead575f80fd5b82516001600160401b0380821115615ec3575f80fd5b9084019060608287031215615ed6575f80fd5b615ede615b51565b82518152602080840151615ef181615908565b82820152604084015183811115615f06575f80fd5b80850194505087601f850112615f1a575f80fd5b83519250615f2a615c3284615ba9565b8381528882858701011115615f3d575f80fd5b615f4c848383018488016159a5565b80604084015250819550615f61818801615e91565b9450505050509250929050565b81810381811115610a6757610a6761595a565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b038181168382160280821691908281146160775761607761595a565b505092915050565b5f6001600160401b03808316818103615cf157615cf161595a565b5f808335601e198436030181126160af575f80fd5b8301803591506001600160401b038211156160c8575f80fd5b602001915036819003821315612627575f80fd5b601f82111561205a57805f5260205f20601f840160051c810160208510156161015750805b601f840160051c820191505b81811015610b06575f815560010161610d565b81516001600160401b0381111561613957616139615b3d565b61614d816161478454615dcf565b846160dc565b602080601f831160018114616180575f84156161695750858301515b5f19600386901b1c1916600185901b1785556161d7565b5f85815260208120601f198616915b828110156161ae5788860151825594840194600190910190840161618f565b50858210156161cb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156161ef575f80fd5b61284e82615892565b5f60208284031215616208575f80fd5b813560ff8116811461284e575f80fd5b5f60208284031215616228575f80fd5b815161284e8161567a56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1021,16 +1021,15 @@ func (it *ERC20TokenStakingManagerDelegationEndedIterator) Close() error { type ERC20TokenStakingManagerDelegationEnded struct { DelegationID [32]byte ValidationID [32]byte - Nonce uint64 Rewards *big.Int Fees *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 rewards, uint256 fees) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*ERC20TokenStakingManagerDelegationEndedIterator, error) { var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { @@ -1040,22 +1039,18 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegationEndedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 rewards, uint256 fees) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { @@ -1065,12 +1060,8 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegati for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule) if err != nil { return nil, err } @@ -1102,9 +1093,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegati }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. +// ParseDelegationEnded is a log parse operation binding the contract event 0x8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 rewards, uint256 fees) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*ERC20TokenStakingManagerDelegationEnded, error) { event := new(ERC20TokenStakingManagerDelegationEnded) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 35a771078..878875eb8 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -82,8 +82,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615dbe380380615dbe83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c718061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd3660046150b5565b610561565b005b3480156101df575f80fd5b506101d26101ee3660046150f0565b610a05565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d2610238366004615107565b610bbe565b348015610248575f80fd5b5061025c6102573660046150f0565b610c9b565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc366004615145565b610cb1565b604051908152602001610215565b3480156102fa575f80fd5b506101d2610309366004615199565b610ce5565b348015610319575f80fd5b506101d26103283660046151b2565b610d85565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d26103703660046151da565b610f5a565b348015610380575f80fd5b506102e161038f366004615228565b6115d3565b34801561039f575f80fd5b5061025c6103ae3660046150f0565b6115ec565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e03660046150b5565b611600565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d26104133660046150f0565b611843565b348015610423575f80fd5b506101d26104323660046151b2565b611949565b348015610442575f80fd5b506101d2610451366004615199565b611c6d565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a3660046150f0565b611de3565b34801561049a575f80fd5b506101d26104a93660046150f0565b612069565b6102e16104bc3660046150f0565b612144565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef3660046150f0565b612175565b6040516102159190615255565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e16105313660046150f0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc583398151915293929190829060ff1660048111156105c2576105c2615241565b60048111156105d3576105d3615241565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61065782612175565b905060028351600481111561066e5761066e615241565b146106c05760405162461bcd60e51b815260206004820152602a60248201525f80516020615be58339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146107255760405162461bcd60e51b815260206004820152603360248201525f80516020615be58339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106b7565b6003835280515f90600290600581111561074157610741615241565b0361079857861561075957610756838761223d565b90505b5f8460600151836080015161076e9190615318565b905061077a84826124d9565b506001600160401b0390811660e0870152421660a0860152506107cc565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107ff86606001516115d3565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561087c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a09190615338565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108df576108df615241565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109f3916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c458339815191526020526040808220815160e0810190925280545f80516020615c0583398151915293929190829060ff166005811115610a5257610a52615241565b6005811115610a6357610a63615241565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610ad257610ad2615241565b14610b375760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106b7565b6005600160991b016001600160a01b031663ee5b48eb610b5c8584606001515f612630565b6040518263ffffffff1660e01b8152600401610b789190615371565b6020604051808303815f875af1158015610b94573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb89190615338565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610c07575080546001600160401b03808416911610155b15610c255760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c4f83612855565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610cab64e8d4a51000836153a3565b92915050565b5f610cba612869565b610cc6848484346128a0565b9050610cde60015f80516020615c2583398151915255565b9392505050565b5f80516020615bc58339815191525f80610cfe84612b94565b91509150610d0b82612eb2565b610d155750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d4357610d43615241565b03610d68575f83815260088501602052604081208054919055610d668282612eed565b505b610d7e81610d7984604001516115d3565b612f53565b5050505050565b5f80516020615bc58339815191525f610d9d84612f66565b90505f80610dae836040015161312c565b50915091505f610dbd83612175565b9050816001600160401b031681606001516001600160401b03161015610df55760405162461bcd60e51b81526004016106b7906153c2565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e3a5760405162461bcd60e51b81526004016106b790615404565b60015f87815260068701602052604090205460ff166004811115610e6057610e60615241565b14610ec95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106b7565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615c058339815191529060ff1615610ff75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106b7565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561103a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105e9190615338565b8360200135146110c05760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106b7565b306110d16060850160408601615461565b6001600160a01b0316146111435760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106b7565b5f611151606085018561547c565b91505f905084356020860135601461116f6060890160408a01615461565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156114e3575f6111ef606089018961547c565b8363ffffffff16818110611205576112056154c1565b905060200281019061121791906154d5565b61122090615585565b80515f81815260088901602052604090205491925090156112985760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106b7565b84825f0151836020015184604001516040516020016112ba949392919061561c565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291611308919061566b565b602060405180830381855afa158015611323573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113469190615338565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff191660018360058111156113d2576113d2615241565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161148591168661567c565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114dc9061568f565b90506111d3565b50600484018190555f6114f586612f66565b90505f6115058260400151613367565b905080600285604051611518919061566b565b602060405180830381855afa158015611533573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115569190615338565b146115ba5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106b7565b5050506009909201805460ff1916600117905550505050565b5f610cab6001600160401b03831664e8d4a510006156b1565b5f6115f682612175565b6080015192915050565b5f80516020615bc58339815191525f611618856134d0565b905061162385612eb2565b61162e575050505050565b5f8581526005830160205260409020546001600160a01b031633146116655760405162461bcd60e51b81526004016106b7906156c8565b5f85815260058301602052604090205460a082015161169491600160b01b90046001600160401b03169061571a565b6001600160401b03168160c001516001600160401b031610156117155760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106b7565b8315610d7e575f611726868561223d565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061177d906115d3565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156117f3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118179190615338565b5f8781526008850160205260408120805490919061183690849061567c565b9091555050505050505050565b5f80516020615bc58339815191525f61185b83612175565b905060048151600581111561187257611872615241565b146118dc5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106b7565b5f8381526005830160205260409020546001600160a01b031633146119135760405162461bcd60e51b81526004016106b7906156c8565b5f83815260088301602090815260408083208054908490556005860190925290912054610bb8906001600160a01b031682612eed565b611951612869565b5f80516020615bc58339815191525f61196984612f66565b90505f8061197a836040015161312c565b50915091505f61198983612175565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156119c3576119c3615241565b60048111156119d4576119d4615241565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611ab85760405162461bcd60e51b81526004016106b7906153c2565b826001600160401b03168160e001516001600160401b03161115611aee5760405162461bcd60e51b81526004016106b790615404565b600381516004811115611b0357611b03615241565b14611b575760405162461bcd60e51b815260206004820152603160248201525f80516020615be58339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106b7565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b9890600160a01b900461ffff16846156b1565b611ba291906153a3565b905080886008015f8881526020019081526020015f205f828254611bc6919061567c565b909155505f9050611bd7828461573a565b9050611be7846020015182612eed565b611bfc8460200151610d7986606001516115d3565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611c42929190918252602082015260400190565b60405180910390a4505050505050505050611c6960015f80516020615c2583398151915255565b5050565b5f80516020615c058339815191525f611c8583612f66565b90505f80611c96836040015161374b565b9150915080611cf85760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106b7565b60015f83815260078601602052604090205460ff166005811115611d1e57611d1e615241565b14611d3b5760405162461bcd60e51b81526004016106b79061574d565b5f8281526006850160205260408120611d539161500a565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615bc583398151915293929190829060ff166004811115611e4457611e44615241565b6004811115611e5557611e55615241565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611edc57611edc615241565b1480611efa5750600381516004811115611ef857611ef8615241565b145b611f4e5760405162461bcd60e51b815260206004820152603260248201525f80516020615be5833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106b7565b5f611f5c8260400151612175565b905080606001516001600160401b03165f03611fe05760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106b7565b6005600160991b016001600160a01b031663ee5b48eb61200d846040015184606001518560800151612630565b6040518263ffffffff1660e01b81526004016120299190615371565b6020604051808303815f875af1158015612045573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7e9190615338565b5f8181525f80516020615c4583398151915260205260409020545f80516020615c058339815191529060019060ff1660058111156120a9576120a9615241565b146120c65760405162461bcd60e51b81526004016106b79061574d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916120ff91906004016157ca565b6020604051808303815f875af115801561211b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061213f9190615338565b505050565b5f61214d612869565b6121588233346138ec565b905061217060015f80516020615c2583398151915255565b919050565b61217d615041565b5f8281525f80516020615c45833981519152602052604090819020815160e0810190925280545f80516020615c05833981519152929190829060ff1660058111156121ca576121ca615241565b60058111156121db576121db615241565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612288573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122af919081019061585f565b91509150806123125760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106b7565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612355573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123799190615338565b8251146123dd5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106b7565b60208201516001600160a01b0316156124535760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106b7565b5f806124628460400151613ca3565b915091508187146124cf5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106b7565b9695505050505050565b5f8281525f80516020615c45833981519152602052604081206002015481905f80516020615c0583398151915290600160801b90046001600160401b03166125218582613e7b565b5f61252b87614089565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61257b8a858b612630565b6040518263ffffffff1660e01b81526004016125979190615371565b6020604051808303815f875af11580156125b3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d79190615338565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126a95761266981600161573a565b6126749060086156b1565b5081515f9083908390811061268b5761268b6154c1565b60200101906001600160f81b03191690815f1a905350600101612655565b505f5b6004811015612714576126c081600361573a565b6126cb9060086156b1565b600263ffffffff16901c60f81b828260026126e6919061567c565b815181106126f6576126f66154c1565b60200101906001600160f81b03191690815f1a9053506001016126ac565b505f5b60208110156127765761272b81601f61573a565b6127369060086156b1565b86901c60f81b8261274883600661567c565b81518110612758576127586154c1565b60200101906001600160f81b03191690815f1a905350600101612717565b505f5b60088110156127e15761278d81600761573a565b6127989060086156b1565b6001600160401b038616901c60f81b826127b383602661567c565b815181106127c3576127c36154c1565b60200101906001600160f81b03191690815f1a905350600101612779565b505f5b600881101561284c576127f881600761573a565b6128039060086156b1565b6001600160401b038516901c60f81b8261281e83602e61567c565b8151811061282e5761282e6154c1565b60200101906001600160f81b03191690815f1a9053506001016127e4565b50949350505050565b61285d614119565b61286681614164565b50565b5f80516020615c2583398151915280546001190161289a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615bc58339815191529061ffff861610156129275760405162461bcd60e51b815260206004820152602b60248201525f80516020615be583398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106b7565b61271061ffff8616111561297f5760405162461bcd60e51b815260206004820152602c60248201525f80516020615be583398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106b7565b60028101546001600160401b0390811690851610156129f85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106b7565b8054831015612a5b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106b7565b8060010154831115612ac25760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106b7565b825f612acd82610c9b565b90505f612ada89836141d6565b90506040518060600160405280612aee3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c2583398151915255565b5f612b9d615041565b5f80516020615c058339815191525f612bb585612f66565b90505f80612bc6836040015161374b565b915091508015612c2b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106b7565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612c5c57612c5c615241565b6005811115612c6d57612c6d615241565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612cdc57612cdc615241565b1480612cfa5750600181516005811115612cf857612cf8615241565b145b612d595760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106b7565b600381516005811115612d6e57612d6e615241565b03612d7c5760048152612d81565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612dc657612dc6615241565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612e7a57612e7a615241565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612f39575f80fd5b505af1158015612f4b573d5f803e3d5ffd5b505050505050565b611c696001600160a01b0383168261478c565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612fca573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ff1919081019061585f565b91509150806130515760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106b7565b8151156130b25760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106b7565b60208201516001600160a01b0316156131255760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106b7565b5092915050565b5f805f83516036146131505760405162461bcd60e51b81526004016106b790615931565b5f805b600281101561319f5761316781600161573a565b6131729060086156b1565b61ffff16868281518110613188576131886154c1565b016020015160f81c901b9190911790600101613153565b5061ffff8116156131c25760405162461bcd60e51b81526004016106b79061597a565b5f805b600481101561321d576131d981600361573a565b6131e49060086156b1565b63ffffffff16876131f683600261567c565b81518110613206576132066154c1565b016020015160f81c901b91909117906001016131c5565b5063ffffffff81166004146132445760405162461bcd60e51b81526004016106b7906159bd565b5f805b60208110156132995761325b81601f61573a565b6132669060086156b1565b8861327283600661567c565b81518110613282576132826154c1565b016020015160f81c901b9190911790600101613247565b505f805b60088110156132f8576132b181600761573a565b6132bc9060086156b1565b6001600160401b0316896132d183602661567c565b815181106132e1576132e16154c1565b016020015160f81c901b919091179060010161329d565b505f805b60088110156133575761331081600761573a565b61331b9060086156b1565b6001600160401b03168a61333083602e61567c565b81518110613340576133406154c1565b016020015160f81c901b91909117906001016132fc565b5091989097509095509350505050565b5f81516026146133895760405162461bcd60e51b81526004016106b790615931565b5f805b60028110156133d8576133a081600161573a565b6133ab9060086156b1565b61ffff168482815181106133c1576133c16154c1565b016020015160f81c901b919091179060010161338c565b5061ffff8116156133fb5760405162461bcd60e51b81526004016106b79061597a565b5f805b60048110156134565761341281600361573a565b61341d9060086156b1565b63ffffffff168561342f83600261567c565b8151811061343f5761343f6154c1565b016020015160f81c901b91909117906001016133fe565b5063ffffffff81161561347b5760405162461bcd60e51b81526004016106b7906159bd565b5f805b602081101561284c5761349281601f61573a565b61349d9060086156b1565b866134a983600661567c565b815181106134b9576134b96154c1565b016020015160f81c901b919091179060010161347e565b6134d8615041565b5f8281525f80516020615c458339815191526020526040808220815160e0810190925280545f80516020615c0583398151915293929190829060ff16600581111561352557613525615241565b600581111561353657613536615241565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156135a8576135a8615241565b146136045760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106b7565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561364857613648615241565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136f485826124d9565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461376e5760405162461bcd60e51b81526004016106b790615931565b5f805b60028110156137bd5761378581600161573a565b6137909060086156b1565b61ffff168582815181106137a6576137a66154c1565b016020015160f81c901b9190911790600101613771565b5061ffff8116156137e05760405162461bcd60e51b81526004016106b79061597a565b5f805b600481101561383b576137f781600361573a565b6138029060086156b1565b63ffffffff168661381483600261567c565b81518110613824576138246154c1565b016020015160f81c901b91909117906001016137e3565b5063ffffffff81166003146138625760405162461bcd60e51b81526004016106b7906159bd565b5f805b60208110156138b75761387981601f61573a565b6138849060086156b1565b8761389083600661567c565b815181106138a0576138a06154c1565b016020015160f81c901b9190911790600101613865565b505f866026815181106138cc576138cc6154c1565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615bc58339815191528161390584610c9b565b90505f61391187612175565b905061391c87612eb2565b6139795760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106b7565b60028151600581111561398e5761398e615241565b146139ed5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106b7565b5f8282608001516139fe919061571a565b60048501546040840151919250613a20916001600160401b0390911690615a04565b6001600160401b0316816001600160401b03161115613a9f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106b7565b5f80613aab8a846124d9565b915091505f8a83604051602001613ad992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b7457613b74615241565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613cc65760405162461bcd60e51b81526004016106b790615931565b5f805b6002811015613d1557613cdd81600161573a565b613ce89060086156b1565b61ffff16858281518110613cfe57613cfe6154c1565b016020015160f81c901b9190911790600101613cc9565b5061ffff811615613d385760405162461bcd60e51b81526004016106b79061597a565b5f805b6004811015613d9357613d4f81600361573a565b613d5a9060086156b1565b63ffffffff1686613d6c83600261567c565b81518110613d7c57613d7c6154c1565b016020015160f81c901b9190911790600101613d3b565b5063ffffffff8116600514613dba5760405162461bcd60e51b81526004016106b7906159bd565b5f805b6020811015613e0f57613dd181601f61573a565b613ddc9060086156b1565b87613de883600661567c565b81518110613df857613df86154c1565b016020015160f81c901b9190911790600101613dbd565b505f805b6008811015613e6e57613e2781600761573a565b613e329060086156b1565b6001600160401b031688613e4783602661567c565b81518110613e5757613e576154c1565b016020015160f81c901b9190911790600101613e13565b5090969095509350505050565b5f80516020615c058339815191525f6001600160401b038084169085161115613eaf57613ea88385615318565b9050613ebc565b613eb98484615318565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613f1e575060018401548151613f1a916001600160401b03169061567c565b8210155b15613f44576001600160401b038316606082015281815260408101516020820152613f63565b8281606001818151613f56919061571a565b6001600160401b03169052505b6060810151613f73906064615a04565b602082015160018601546001600160401b039290921691613f9e9190600160401b900460ff166156b1565b10156140025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106b7565b856001600160401b03168160400181815161401d919061567c565b9052506040810180516001600160401b038716919061403d90839061573a565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c458339815191526020526040812060020180545f80516020615c0583398151915291600160401b9091046001600160401b03169060086140d383615a2f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661416257604051631afcd79f60e31b815260040160405180910390fd5b565b61416c614119565b6141758161481f565b61417d614838565b6128666060820135608083013561419a60c0850160a08601615228565b6141aa60e0860160c08701615a4a565b61ffff166141bf610100870160e08801615a63565b6141d161012088016101008901615461565b614848565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166142615760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106b7565b5f80516020615c05833981519152426142806040860160208701615228565b6001600160401b0316116142f25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106b7565b6143026040850160208601615228565b6001600160401b03166143186202a3004261567c565b1161438b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106b7565b83356143e35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106b7565b83355f908152600882016020526040902054156144535760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106b7565b60306144626040860186615a83565b9050146144c75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106b7565b6144d1835f613e7b565b5f8061456a6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906145159190615228565b6001600160401b0316815260200161453060408a018a615a83565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614ad0565b5f828152600686016020526040902091935091506145888282615b09565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906145c6908590600401615371565b6020604051808303815f875af11580156145e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146069190615338565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561467e5761467e615241565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161475e918e01908e01615228565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147af5760405163cd78605960e01b81523060048201526024016106b7565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146147f8576040519150601f19603f3d011682016040523d82523d5f602084013e6147fd565b606091505b505090508061213f57604051630a12f52160e11b815260040160405180910390fd5b614827614119565b61482f614e7f565b61286681614e87565b614840614119565b614162615002565b614850614119565b5f80516020615bc5833981519152836148bc5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106b7565b6127108411156149225760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106b7565b8587111561498a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106b7565b5f8360ff16116149f75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106b7565b600a60ff84161115614a695760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106b7565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614b3a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106b7565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614bb157614b7181600161573a565b614b7c9060086156b1565b5081515f90839083908110614b9357614b936154c1565b60200101906001600160f81b03191690815f1a905350600101614b5d565b505f5b6004811015614c1957614bc881600361573a565b614bd39060086156b1565b600160ff919091161c60f81b82614beb83600261567c565b81518110614bfb57614bfb6154c1565b60200101906001600160f81b03191690815f1a905350600101614bb4565b505f5b6020811015614c765784518160208110614c3857614c386154c1565b1a60f81b82614c4883600661567c565b81518110614c5857614c586154c1565b60200101906001600160f81b03191690815f1a905350600101614c1c565b505f5b6020811015614cd65784602001518160208110614c9857614c986154c1565b1a60f81b82614ca883602661567c565b81518110614cb857614cb86154c1565b60200101906001600160f81b03191690815f1a905350600101614c79565b505f5b6008811015614d4a57614ced81600761573a565b614cf89060086156b1565b60ff1685604001516001600160401b0316901c60f81b82826046614d1c919061567c565b81518110614d2c57614d2c6154c1565b60200101906001600160f81b03191690815f1a905350600101614cd9565b505f5b6030811015614db55784608001518181518110614d6c57614d6c6154c1565b01602001516001600160f81b03191682614d8783604e61567c565b81518110614d9757614d976154c1565b60200101906001600160f81b03191690815f1a905350600101614d4d565b505f5b6008811015614e2757614dcc81600761573a565b614dd79060086156b1565b60608601516001600160401b0390811691161c60f81b82614df983607e61567c565b81518110614e0957614e096154c1565b60200101906001600160f81b03191690815f1a905350600101614db8565b50600281604051614e38919061566b565b602060405180830381855afa158015614e53573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614e769190615338565b94909350915050565b614162614119565b614e8f614119565b80355f80516020615c058339815191529081556014614eb46060840160408501615a63565b60ff161115614f215760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106b7565b5f614f326060840160408501615a63565b60ff1611614f9a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106b7565b614faa6060830160408401615a63565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614fdb6040830160208401615228565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b81614119565b50805461501690615798565b5f825580601f10615025575050565b601f0160209004905f5260205f2090810190612866919061507d565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615091575f815560010161507e565b5090565b8015158114612866575f80fd5b803563ffffffff81168114612170575f80fd5b5f805f606084860312156150c7575f80fd5b8335925060208401356150d981615095565b91506150e7604085016150a2565b90509250925092565b5f60208284031215615100575f80fd5b5035919050565b5f6101208284031215615118575f80fd5b50919050565b803561ffff81168114612170575f80fd5b80356001600160401b0381168114612170575f80fd5b5f805f60608486031215615157575f80fd5b83356001600160401b0381111561516c575f80fd5b84016060818703121561517d575f80fd5b925061518b6020850161511e565b91506150e76040850161512f565b5f602082840312156151a9575f80fd5b610cde826150a2565b5f80604083850312156151c3575f80fd5b6151cc836150a2565b946020939093013593505050565b5f80604083850312156151eb575f80fd5b82356001600160401b03811115615200575f80fd5b830160808186031215615211575f80fd5b915061521f602084016150a2565b90509250929050565b5f60208284031215615238575f80fd5b610cde8261512f565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061527857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516152b360608401826001600160401b03169052565b5060808301516152ce60808401826001600160401b03169052565b5060a08301516152e960a08401826001600160401b03169052565b5060c083015161312560c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561312557613125615304565b5f60208284031215615348575f80fd5b5051919050565b5f5b83811015615369578181015183820152602001615351565b50505f910152565b602081525f825180602084015261538f81604085016020870161534f565b601f01601f19169190910160400192915050565b5f826153bd57634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612866575f80fd5b5f60208284031215615471575f80fd5b8135610cde8161544d565b5f808335601e19843603018112615491575f80fd5b8301803591506001600160401b038211156154aa575f80fd5b6020019150600581901b3603821315612629575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126154e9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615529576155296154f3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615557576155576154f3565b604052919050565b5f6001600160401b03821115615577576155776154f3565b50601f01601f191660200190565b5f60608236031215615595575f80fd5b61559d615507565b8235815260206155ae81850161512f565b8183015260408401356001600160401b038111156155ca575f80fd5b840136601f8201126155da575f80fd5b80356155ed6155e88261555f565b61552f565b8181523684838501011115615600575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f855161562d818460208a0161534f565b80830190508581526001600160401b0360c01b8560c01b166020820152835161565d81602884016020880161534f565b016028019695505050505050565b5f82516154e981846020870161534f565b80820180821115610cab57610cab615304565b5f63ffffffff8083168181036156a7576156a7615304565b6001019392505050565b8082028115828204841417610cab57610cab615304565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561312557613125615304565b81810381811115610cab57610cab615304565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c908216806157ac57607f821691505b60208210810361511857634e487b7160e01b5f52602260045260245ffd5b5f60208083525f84546157dc81615798565b806020870152604060018084165f81146157fd576001811461581957615846565b60ff19851660408a0152604084151560051b8a01019550615846565b895f5260205f205f5b8581101561583d5781548b8201860152908301908801615822565b8a016040019650505b509398975050505050505050565b805161217081615095565b5f8060408385031215615870575f80fd5b82516001600160401b0380821115615886575f80fd5b9084019060608287031215615899575f80fd5b6158a1615507565b825181526020808401516158b48161544d565b828201526040840151838111156158c9575f80fd5b80850194505087601f8501126158dd575f80fd5b835192506158ed6155e88461555f565b8381528882858701011115615900575f80fd5b61590f8483830184880161534f565b80604084015250819550615924818801615854565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a2757615a27615304565b505092915050565b5f6001600160401b038083168181036156a7576156a7615304565b5f60208284031215615a5a575f80fd5b610cde8261511e565b5f60208284031215615a73575f80fd5b813560ff81168114610cde575f80fd5b5f808335601e19843603018112615a98575f80fd5b8301803591506001600160401b03821115615ab1575f80fd5b602001915036819003821315612629575f80fd5b601f82111561213f57805f5260205f20601f840160051c81016020851015615aea5750805b601f840160051c820191505b81811015610d7e575f8155600101615af6565b81516001600160401b03811115615b2257615b226154f3565b615b3681615b308454615798565b84615ac5565b602080601f831160018114615b69575f8415615b525750858301515b5f19600386901b1c1916600185901b178555612f4b565b5f85815260208120601f198616915b82811015615b9757888601518255948401946001909101908401615b78565b5085821015615bb457878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161613738038061613783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615fea8061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004615406565b610561565b005b3480156101df575f80fd5b506101d26101ee366004615441565b6109f2565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d2610238366004615458565b610bab565b348015610248575f80fd5b5061025c610257366004615441565b610c88565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc366004615496565b610c9e565b604051908152602001610215565b3480156102fa575f80fd5b506101d26103093660046154ea565b610cd2565b348015610319575f80fd5b506101d2610328366004615503565b610d72565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d261037036600461552b565b611202565b348015610380575f80fd5b506102e161038f366004615579565b61187b565b34801561039f575f80fd5b5061025c6103ae366004615441565b611894565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e0366004615406565b6118a8565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d2610413366004615441565b611aeb565b348015610423575f80fd5b506101d2610432366004615503565b611bf1565b348015610442575f80fd5b506101d26104513660046154ea565b611dd4565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a366004615441565b611f4a565b34801561049a575f80fd5b506101d26104a9366004615441565b6121bd565b6102e16104bc366004615441565b612298565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef366004615441565b6122c9565b60405161021591906155a6565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e1610531366004615441565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020615f7e83398151915260205260408082208151610100810190925280545f80516020615f1e83398151915293929190829060ff1660048111156105af576105af615592565b60048111156105c0576105c0615592565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f610644826122c9565b905060028351600481111561065b5761065b615592565b146106ad5760405162461bcd60e51b815260206004820152602a60248201525f80516020615f3e8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146107125760405162461bcd60e51b815260206004820152603360248201525f80516020615f3e8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106a4565b6003835280515f90600290600581111561072e5761072e615592565b03610785578615610746576107438387612391565b90505b5f8460600151836080015161075b9190615669565b9050610767848261262d565b506001600160401b0390811660e0870152421660a0860152506107b9565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107ec866060015161187b565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610869573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088d9190615689565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108cc576108cc615592565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109e0916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615fbe8339815191526020526040808220815160e0810190925280545f80516020615f5e83398151915293929190829060ff166005811115610a3f57610a3f615592565b6005811115610a5057610a50615592565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abf57610abf615592565b14610b245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106a4565b6005600160991b016001600160a01b031663ee5b48eb610b498584606001515f612784565b6040518263ffffffff1660e01b8152600401610b6591906156c2565b6020604051808303815f875af1158015610b81573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba59190615689565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf4575080546001600160401b03808416911610155b15610c125760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c3c836129a9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9864e8d4a51000836156f4565b92915050565b5f610ca76129bd565b610cb3848484346129f4565b9050610ccb60015f80516020615f9e83398151915255565b9392505050565b5f80516020615f1e8339815191525f80610ceb84612ce8565b91509150610cf882613006565b610d025750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d3057610d30615592565b03610d55575f83815260088501602052604081208054919055610d538282613041565b505b610d6b81610d66846040015161187b565b6130a7565b5050505050565b5f8181525f80516020615f7e83398151915260205260408082208151610100810190925280545f80516020615f1e83398151915293929190829060ff166004811115610dc057610dc0615592565b6004811115610dd157610dd1615592565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e56906122c9565b9050600182516004811115610e6d57610e6d615592565b14610ed65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106a4565b600381516005811115610eeb57610eeb615592565b03611063576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610f4f57610f4f615592565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b60048151600581111561107857611078615592565b0361108657610d6b846130ba565b5f611090866132b7565b90505f806110a1836040015161347d565b5091509150818560400151146110c95760405162461bcd60e51b81526004016106a490615713565b806001600160401b031684606001516001600160401b0316101561113a5760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106a4565b806001600160401b03168560c001516001600160401b031611156111705760405162461bcd60e51b81526004016106a49061575d565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615f5e8339815191529060ff161561129f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106a4565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113069190615689565b8360200135146113685760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106a4565b3061137960608501604086016157ba565b6001600160a01b0316146113eb5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106a4565b5f6113f960608501856157d5565b91505f90508435602086013560146114176060890160408a016157ba565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561178b575f61149760608901896157d5565b8363ffffffff168181106114ad576114ad61581a565b90506020028101906114bf919061582e565b6114c8906158de565b80515f81815260088901602052604090205491925090156115405760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106a4565b84825f0151836020015184604001516040516020016115629493929190615975565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916115b091906159c4565b602060405180830381855afa1580156115cb573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115ee9190615689565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff1916600183600581111561167a5761167a615592565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161172d9116866159d5565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611784906159e8565b905061147b565b50600484018190555f61179d866132b7565b90505f6117ad82604001516136b8565b9050806002856040516117c091906159c4565b602060405180830381855afa1580156117db573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906117fe9190615689565b146118625760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106a4565b5050506009909201805460ff1916600117905550505050565b5f610c986001600160401b03831664e8d4a51000615a0a565b5f61189e826122c9565b6080015192915050565b5f80516020615f1e8339815191525f6118c085613821565b90506118cb85613006565b6118d6575050505050565b5f8581526005830160205260409020546001600160a01b0316331461190d5760405162461bcd60e51b81526004016106a490615a21565b5f85815260058301602052604090205460a082015161193c91600160b01b90046001600160401b031690615a73565b6001600160401b03168160c001516001600160401b031610156119bd5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106a4565b8315610d6b575f6119ce8685612391565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b590611a259061187b565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611a9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611abf9190615689565b5f87815260088501602052604081208054909190611ade9084906159d5565b9091555050505050505050565b5f80516020615f1e8339815191525f611b03836122c9565b9050600481516005811115611b1a57611b1a615592565b14611b845760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106a4565b5f8381526005830160205260409020546001600160a01b03163314611bbb5760405162461bcd60e51b81526004016106a490615a21565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba5906001600160a01b031682613041565b611bf96129bd565b5f8181525f80516020615f7e83398151915260205260408082208151610100810190925280545f80516020615f1e83398151915293929190829060ff166004811115611c4757611c47615592565b6004811115611c5857611c58615592565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611cd4856132b7565b90505f80611ce5836040015161347d565b509150915081846040015114611d0d5760405162461bcd60e51b81526004016106a490615713565b806001600160401b03168460e001516001600160401b03161115611d435760405162461bcd60e51b81526004016106a49061575d565b600384516004811115611d5857611d58615592565b14611dac5760405162461bcd60e51b815260206004820152603160248201525f80516020615f3e8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106a4565b611db5866130ba565b5050505050611dd060015f80516020615f9e83398151915255565b5050565b5f80516020615f5e8339815191525f611dec836132b7565b90505f80611dfd8360400151613a9c565b9150915080611e5f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106a4565b60015f83815260078601602052604090205460ff166005811115611e8557611e85615592565b14611ea25760405162461bcd60e51b81526004016106a490615a93565b5f8281526006850160205260408120611eba9161535b565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020615f7e83398151915260205260408082208151610100810190925280545f80516020615f1e83398151915293929190829060ff166004811115611f9857611f98615592565b6004811115611fa957611fa9615592565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561203057612030615592565b148061204e575060038151600481111561204c5761204c615592565b145b6120a25760405162461bcd60e51b815260206004820152603260248201525f80516020615f3e833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106a4565b5f6120b082604001516122c9565b905080606001516001600160401b03165f036121345760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106a4565b6005600160991b016001600160a01b031663ee5b48eb612161846040015184606001518560800151612784565b6040518263ffffffff1660e01b815260040161217d91906156c2565b6020604051808303815f875af1158015612199573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6b9190615689565b5f8181525f80516020615fbe83398151915260205260409020545f80516020615f5e8339815191529060019060ff1660058111156121fd576121fd615592565b1461221a5760405162461bcd60e51b81526004016106a490615a93565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916122539190600401615b10565b6020604051808303815f875af115801561226f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122939190615689565b505050565b5f6122a16129bd565b6122ac823334613c3d565b90506122c460015f80516020615f9e83398151915255565b919050565b6122d1615392565b5f8281525f80516020615fbe833981519152602052604090819020815160e0810190925280545f80516020615f5e833981519152929190829060ff16600581111561231e5761231e615592565b600581111561232f5761232f615592565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156123dc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124039190810190615ba5565b91509150806124665760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106a4565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124a9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124cd9190615689565b8251146125315760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106a4565b60208201516001600160a01b0316156125a75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106a4565b5f806125b68460400151613ff4565b915091508187146126235760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106a4565b9695505050505050565b5f8281525f80516020615fbe833981519152602052604081206002015481905f80516020615f5e83398151915290600160801b90046001600160401b031661267585826141cc565b5f61267f876143da565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6126cf8a858b612784565b6040518263ffffffff1660e01b81526004016126eb91906156c2565b6020604051808303815f875af1158015612707573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061272b9190615689565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156127fd576127bd816001615c77565b6127c8906008615a0a565b5081515f908390839081106127df576127df61581a565b60200101906001600160f81b03191690815f1a9053506001016127a9565b505f5b600481101561286857612814816003615c77565b61281f906008615a0a565b600263ffffffff16901c60f81b8282600261283a91906159d5565b8151811061284a5761284a61581a565b60200101906001600160f81b03191690815f1a905350600101612800565b505f5b60208110156128ca5761287f81601f615c77565b61288a906008615a0a565b86901c60f81b8261289c8360066159d5565b815181106128ac576128ac61581a565b60200101906001600160f81b03191690815f1a90535060010161286b565b505f5b6008811015612935576128e1816007615c77565b6128ec906008615a0a565b6001600160401b038616901c60f81b826129078360266159d5565b815181106129175761291761581a565b60200101906001600160f81b03191690815f1a9053506001016128cd565b505f5b60088110156129a05761294c816007615c77565b612957906008615a0a565b6001600160401b038516901c60f81b8261297283602e6159d5565b815181106129825761298261581a565b60200101906001600160f81b03191690815f1a905350600101612938565b50949350505050565b6129b161446a565b6129ba816144b5565b50565b5f80516020615f9e8339815191528054600119016129ee57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615f1e8339815191529061ffff86161015612a7b5760405162461bcd60e51b815260206004820152602b60248201525f80516020615f3e83398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106a4565b61271061ffff86161115612ad35760405162461bcd60e51b815260206004820152602c60248201525f80516020615f3e83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106a4565b60028101546001600160401b039081169085161015612b4c5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106a4565b8054831015612baf5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106a4565b8060010154831115612c165760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106a4565b825f612c2182610c88565b90505f612c2e8983614527565b90506040518060600160405280612c423390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615f9e83398151915255565b5f612cf1615392565b5f80516020615f5e8339815191525f612d09856132b7565b90505f80612d1a8360400151613a9c565b915091508015612d7f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106a4565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612db057612db0615592565b6005811115612dc157612dc1615592565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612e3057612e30615592565b1480612e4e5750600181516005811115612e4c57612e4c615592565b145b612ead5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106a4565b600381516005811115612ec257612ec2615592565b03612ed05760048152612ed5565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f1a57612f1a615592565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612fce57612fce615592565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561308d575f80fd5b505af115801561309f573d5f803e3d5ffd5b505050505050565b611dd06001600160a01b03831682614add565b5f8181525f80516020615f7e83398151915260205260408082208151610100810190925280545f80516020615f1e83398151915293929190829060ff16600481111561310857613108615592565b600481111561311957613119615592565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061320d90600160a01b900461ffff1684615a0a565b61321791906156f4565b905080856008015f8581526020019081526020015f205f82825461323b91906159d5565b909155505f905061324c8284615c77565b905061325c856020015182613041565b6132718560200151610d66876060015161187b565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561331b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526133429190810190615ba5565b91509150806133a25760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106a4565b8151156134035760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106a4565b60208201516001600160a01b0316156134765760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106a4565b5092915050565b5f805f83516036146134a15760405162461bcd60e51b81526004016106a490615c8a565b5f805b60028110156134f0576134b8816001615c77565b6134c3906008615a0a565b61ffff168682815181106134d9576134d961581a565b016020015160f81c901b91909117906001016134a4565b5061ffff8116156135135760405162461bcd60e51b81526004016106a490615cd3565b5f805b600481101561356e5761352a816003615c77565b613535906008615a0a565b63ffffffff16876135478360026159d5565b815181106135575761355761581a565b016020015160f81c901b9190911790600101613516565b5063ffffffff81166004146135955760405162461bcd60e51b81526004016106a490615d16565b5f805b60208110156135ea576135ac81601f615c77565b6135b7906008615a0a565b886135c38360066159d5565b815181106135d3576135d361581a565b016020015160f81c901b9190911790600101613598565b505f805b600881101561364957613602816007615c77565b61360d906008615a0a565b6001600160401b0316896136228360266159d5565b815181106136325761363261581a565b016020015160f81c901b91909117906001016135ee565b505f805b60088110156136a857613661816007615c77565b61366c906008615a0a565b6001600160401b03168a61368183602e6159d5565b815181106136915761369161581a565b016020015160f81c901b919091179060010161364d565b5091989097509095509350505050565b5f81516026146136da5760405162461bcd60e51b81526004016106a490615c8a565b5f805b6002811015613729576136f1816001615c77565b6136fc906008615a0a565b61ffff168482815181106137125761371261581a565b016020015160f81c901b91909117906001016136dd565b5061ffff81161561374c5760405162461bcd60e51b81526004016106a490615cd3565b5f805b60048110156137a757613763816003615c77565b61376e906008615a0a565b63ffffffff16856137808360026159d5565b815181106137905761379061581a565b016020015160f81c901b919091179060010161374f565b5063ffffffff8116156137cc5760405162461bcd60e51b81526004016106a490615d16565b5f805b60208110156129a0576137e381601f615c77565b6137ee906008615a0a565b866137fa8360066159d5565b8151811061380a5761380a61581a565b016020015160f81c901b91909117906001016137cf565b613829615392565b5f8281525f80516020615fbe8339815191526020526040808220815160e0810190925280545f80516020615f5e83398151915293929190829060ff16600581111561387657613876615592565b600581111561388757613887615592565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156138f9576138f9615592565b146139555760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106a4565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561399957613999615592565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613a45858261262d565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613abf5760405162461bcd60e51b81526004016106a490615c8a565b5f805b6002811015613b0e57613ad6816001615c77565b613ae1906008615a0a565b61ffff16858281518110613af757613af761581a565b016020015160f81c901b9190911790600101613ac2565b5061ffff811615613b315760405162461bcd60e51b81526004016106a490615cd3565b5f805b6004811015613b8c57613b48816003615c77565b613b53906008615a0a565b63ffffffff1686613b658360026159d5565b81518110613b7557613b7561581a565b016020015160f81c901b9190911790600101613b34565b5063ffffffff8116600314613bb35760405162461bcd60e51b81526004016106a490615d16565b5f805b6020811015613c0857613bca81601f615c77565b613bd5906008615a0a565b87613be18360066159d5565b81518110613bf157613bf161581a565b016020015160f81c901b9190911790600101613bb6565b505f86602681518110613c1d57613c1d61581a565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615f1e83398151915281613c5684610c88565b90505f613c62876122c9565b9050613c6d87613006565b613cca5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106a4565b600281516005811115613cdf57613cdf615592565b14613d3e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106a4565b5f828260800151613d4f9190615a73565b60048501546040840151919250613d71916001600160401b0390911690615d5d565b6001600160401b0316816001600160401b03161115613df05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106a4565b5f80613dfc8a8461262d565b915091505f8a83604051602001613e2a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613ec557613ec5615592565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146140175760405162461bcd60e51b81526004016106a490615c8a565b5f805b60028110156140665761402e816001615c77565b614039906008615a0a565b61ffff1685828151811061404f5761404f61581a565b016020015160f81c901b919091179060010161401a565b5061ffff8116156140895760405162461bcd60e51b81526004016106a490615cd3565b5f805b60048110156140e4576140a0816003615c77565b6140ab906008615a0a565b63ffffffff16866140bd8360026159d5565b815181106140cd576140cd61581a565b016020015160f81c901b919091179060010161408c565b5063ffffffff811660051461410b5760405162461bcd60e51b81526004016106a490615d16565b5f805b60208110156141605761412281601f615c77565b61412d906008615a0a565b876141398360066159d5565b815181106141495761414961581a565b016020015160f81c901b919091179060010161410e565b505f805b60088110156141bf57614178816007615c77565b614183906008615a0a565b6001600160401b0316886141988360266159d5565b815181106141a8576141a861581a565b016020015160f81c901b9190911790600101614164565b5090969095509350505050565b5f80516020615f5e8339815191525f6001600160401b038084169085161115614200576141f98385615669565b905061420d565b61420a8484615669565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061426f57506001840154815161426b916001600160401b0316906159d5565b8210155b15614295576001600160401b0383166060820152818152604081015160208201526142b4565b82816060018181516142a79190615a73565b6001600160401b03169052505b60608101516142c4906064615d5d565b602082015160018601546001600160401b0392909216916142ef9190600160401b900460ff16615a0a565b10156143535760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106a4565b856001600160401b03168160400181815161436e91906159d5565b9052506040810180516001600160401b038716919061438e908390615c77565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615fbe8339815191526020526040812060020180545f80516020615f5e83398151915291600160401b9091046001600160401b031690600861442483615d88565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166144b357604051631afcd79f60e31b815260040160405180910390fd5b565b6144bd61446a565b6144c681614b70565b6144ce614b89565b6129ba606082013560808301356144eb60c0850160a08601615579565b6144fb60e0860160c08701615da3565b61ffff16614510610100870160e08801615dbc565b614522610120880161010089016157ba565b614b99565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166145b25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106a4565b5f80516020615f5e833981519152426145d16040860160208701615579565b6001600160401b0316116146435760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106a4565b6146536040850160208601615579565b6001600160401b03166146696202a300426159d5565b116146dc5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106a4565b83356147345760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106a4565b83355f908152600882016020526040902054156147a45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106a4565b60306147b36040860186615ddc565b9050146148185760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106a4565b614822835f6141cc565b5f806148bb6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906148669190615579565b6001600160401b0316815260200161488160408a018a615ddc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614e21565b5f828152600686016020526040902091935091506148d98282615e62565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906149179085906004016156c2565b6020604051808303815f875af1158015614933573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149579190615689565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156149cf576149cf615592565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614aaf918e01908e01615579565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015614b005760405163cd78605960e01b81523060048201526024016106a4565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614b49576040519150601f19603f3d011682016040523d82523d5f602084013e614b4e565b606091505b505090508061229357604051630a12f52160e11b815260040160405180910390fd5b614b7861446a565b614b806151d0565b6129ba816151d8565b614b9161446a565b6144b3615353565b614ba161446a565b5f80516020615f1e83398151915283614c0d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106a4565b612710841115614c735760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106a4565b85871115614cdb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106a4565b5f8360ff1611614d485760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106a4565b600a60ff84161115614dba5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106a4565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614e8b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106a4565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614f0257614ec2816001615c77565b614ecd906008615a0a565b5081515f90839083908110614ee457614ee461581a565b60200101906001600160f81b03191690815f1a905350600101614eae565b505f5b6004811015614f6a57614f19816003615c77565b614f24906008615a0a565b600160ff919091161c60f81b82614f3c8360026159d5565b81518110614f4c57614f4c61581a565b60200101906001600160f81b03191690815f1a905350600101614f05565b505f5b6020811015614fc75784518160208110614f8957614f8961581a565b1a60f81b82614f998360066159d5565b81518110614fa957614fa961581a565b60200101906001600160f81b03191690815f1a905350600101614f6d565b505f5b60208110156150275784602001518160208110614fe957614fe961581a565b1a60f81b82614ff98360266159d5565b815181106150095761500961581a565b60200101906001600160f81b03191690815f1a905350600101614fca565b505f5b600881101561509b5761503e816007615c77565b615049906008615a0a565b60ff1685604001516001600160401b0316901c60f81b8282604661506d91906159d5565b8151811061507d5761507d61581a565b60200101906001600160f81b03191690815f1a90535060010161502a565b505f5b603081101561510657846080015181815181106150bd576150bd61581a565b01602001516001600160f81b031916826150d883604e6159d5565b815181106150e8576150e861581a565b60200101906001600160f81b03191690815f1a90535060010161509e565b505f5b60088110156151785761511d816007615c77565b615128906008615a0a565b60608601516001600160401b0390811691161c60f81b8261514a83607e6159d5565b8151811061515a5761515a61581a565b60200101906001600160f81b03191690815f1a905350600101615109565b5060028160405161518991906159c4565b602060405180830381855afa1580156151a4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906151c79190615689565b94909350915050565b6144b361446a565b6151e061446a565b80355f80516020615f5e83398151915290815560146152056060840160408501615dbc565b60ff1611156152725760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106a4565b5f6152836060840160408501615dbc565b60ff16116152eb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106a4565b6152fb6060830160408401615dbc565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561532c6040830160208401615579565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612cd561446a565b50805461536790615ade565b5f825580601f10615376575050565b601f0160209004905f5260205f20908101906129ba91906153ce565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156153e2575f81556001016153cf565b5090565b80151581146129ba575f80fd5b803563ffffffff811681146122c4575f80fd5b5f805f60608486031215615418575f80fd5b83359250602084013561542a816153e6565b9150615438604085016153f3565b90509250925092565b5f60208284031215615451575f80fd5b5035919050565b5f6101208284031215615469575f80fd5b50919050565b803561ffff811681146122c4575f80fd5b80356001600160401b03811681146122c4575f80fd5b5f805f606084860312156154a8575f80fd5b83356001600160401b038111156154bd575f80fd5b8401606081870312156154ce575f80fd5b92506154dc6020850161546f565b915061543860408501615480565b5f602082840312156154fa575f80fd5b610ccb826153f3565b5f8060408385031215615514575f80fd5b61551d836153f3565b946020939093013593505050565b5f806040838503121561553c575f80fd5b82356001600160401b03811115615551575f80fd5b830160808186031215615562575f80fd5b9150615570602084016153f3565b90509250929050565b5f60208284031215615589575f80fd5b610ccb82615480565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106155c957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161560460608401826001600160401b03169052565b50608083015161561f60808401826001600160401b03169052565b5060a083015161563a60a08401826001600160401b03169052565b5060c083015161347660c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561347657613476615655565b5f60208284031215615699575f80fd5b5051919050565b5f5b838110156156ba5781810151838201526020016156a2565b50505f910152565b602081525f82518060208401526156e08160408501602087016156a0565b601f01601f19169190910160400192915050565b5f8261570e57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b03811681146129ba575f80fd5b5f602082840312156157ca575f80fd5b8135610ccb816157a6565b5f808335601e198436030181126157ea575f80fd5b8301803591506001600160401b03821115615803575f80fd5b6020019150600581901b360382131561277d575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615842575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156158825761588261584c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156158b0576158b061584c565b604052919050565b5f6001600160401b038211156158d0576158d061584c565b50601f01601f191660200190565b5f606082360312156158ee575f80fd5b6158f6615860565b823581526020615907818501615480565b8183015260408401356001600160401b03811115615923575f80fd5b840136601f820112615933575f80fd5b8035615946615941826158b8565b615888565b8181523684838501011115615959575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551615986818460208a016156a0565b80830190508581526001600160401b0360c01b8560c01b16602082015283516159b68160288401602088016156a0565b016028019695505050505050565b5f82516158428184602087016156a0565b80820180821115610c9857610c98615655565b5f63ffffffff808316818103615a0057615a00615655565b6001019392505050565b8082028115828204841417610c9857610c98615655565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561347657613476615655565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615af257607f821691505b60208210810361546957634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615b2281615ade565b806020870152604060018084165f8114615b435760018114615b5f57615b8c565b60ff19851660408a0152604084151560051b8a01019550615b8c565b895f5260205f205f5b85811015615b835781548b8201860152908301908801615b68565b8a016040019650505b509398975050505050505050565b80516122c4816153e6565b5f8060408385031215615bb6575f80fd5b82516001600160401b0380821115615bcc575f80fd5b9084019060608287031215615bdf575f80fd5b615be7615860565b82518152602080840151615bfa816157a6565b82820152604084015183811115615c0f575f80fd5b80850194505087601f850112615c23575f80fd5b83519250615c33615941846158b8565b8381528882858701011115615c46575f80fd5b615c55848383018488016156a0565b80604084015250819550615c6a818801615b9a565b9450505050509250929050565b81810381811115610c9857610c98615655565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615d8057615d80615655565b505092915050565b5f6001600160401b03808316818103615a0057615a00615655565b5f60208284031215615db3575f80fd5b610ccb8261546f565b5f60208284031215615dcc575f80fd5b813560ff81168114610ccb575f80fd5b5f808335601e19843603018112615df1575f80fd5b8301803591506001600160401b03821115615e0a575f80fd5b60200191503681900382131561277d575f80fd5b601f82111561229357805f5260205f20601f840160051c81016020851015615e435750805b601f840160051c820191505b81811015610d6b575f8155600101615e4f565b81516001600160401b03811115615e7b57615e7b61584c565b615e8f81615e898454615ade565b84615e1e565b602080601f831160018114615ec2575f8415615eab5750858301515b5f19600386901b1c1916600185901b17855561309f565b5f85815260208120601f198616915b82811015615ef057888601518255948401946001909101908401615ed1565b5085821015615f0d57878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1052,16 +1052,15 @@ func (it *NativeTokenStakingManagerDelegationEndedIterator) Close() error { type NativeTokenStakingManagerDelegationEnded struct { DelegationID [32]byte ValidationID [32]byte - Nonce uint64 Rewards *big.Int Fees *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. +// FilterDelegationEnded is a free log retrieval operation binding the contract event 0x8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegationEndedIterator, error) { +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 rewards, uint256 fees) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegationEnded(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*NativeTokenStakingManagerDelegationEndedIterator, error) { var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { @@ -1071,22 +1070,18 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegationEndedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegationEnded", logs: logs, sub: sub}, nil } -// WatchDelegationEnded is a free log subscription operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. +// WatchDelegationEnded is a free log subscription operation binding the contract event 0x8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 rewards, uint256 fees) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegationEnded(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegationEnded, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { @@ -1096,12 +1091,8 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegationEnded", delegationIDRule, validationIDRule) if err != nil { return nil, err } @@ -1133,9 +1124,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegationEnded is a log parse operation binding the contract event 0x9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033. +// ParseDelegationEnded is a log parse operation binding the contract event 0x8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993. // -// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 rewards, uint256 fees) +// Solidity: event DelegationEnded(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 rewards, uint256 fees) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegationEnded(log types.Log) (*NativeTokenStakingManagerDelegationEnded, error) { event := new(NativeTokenStakingManagerDelegationEnded) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegationEnded", log); err != nil { diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index ac47ed16b..dc58ed4cc 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -351,37 +351,69 @@ abstract contract PoSValidatorManager is function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + Delegator memory delegator = $._delegatorStakes[delegationID]; + Validator memory validator = getValidator(delegator.validationID); + + // Ensure the delegator is pending added. Since anybody can call this function once + // delegator registration has been initialized, we need to make sure that this function is only + // callable after that has been done. + require( + delegator.status == DelegatorStatus.PendingAdded, + "PoSValidatorManager: delegationID not pending added" + ); + + // In the case where the validator has initiated ending its validation period, we can no + // longer stake, but the validator's weight may not have been removed from the p-chain yet, + // so we have to wait for confirmation that the validator has been removed before returning the stake. + if (validator.status == ValidatorStatus.PendingRemoved) { + delegator.status = DelegatorStatus.PendingRemoved; + delegator.startedAt = validator.endedAt; + delegator.endedAt = validator.endedAt; + delegator.endingNonce = validator.messageNonce; + + // Write back the delegator + $._delegatorStakes[delegationID] = delegator; + + emit DelegatorRemovalInitialized({ + delegationID: delegationID, + validationID: delegator.validationID, + endTime: validator.endedAt + }); + + return; + } + + // In the case where the validator has completed its validation period, we can no + // longer stake and should move our status directly to completed and return the stake. + if (validator.status == ValidatorStatus.Completed) { + _completeEndDelegation(delegationID); + return; + } + // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce,) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - Validator memory validator = getValidator(validationID); + require( + delegator.validationID == validationID, "PoSValidatorManager: invalid validation ID" + ); // The received nonce should be no greater than the highest sent nonce. This should never // happen since the staking manager is the only entity that can trigger a weight update // on the P-Chain. require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); - // The nonce should also be greater than or equal to the delegationID's starting nonce. This allows + // The nonce should be greater than or equal to the delegationID's starting nonce. This allows // a weight update using a higher nonce (which implicitly includes the delegation's weight update) // to be used to complete registration for an earlier delegation. This is necessary because the P-Chain // is only willing to sign the latest weight update. - require( - $._delegatorStakes[delegationID].startingNonce <= nonce, - "PoSValidatorManager: nonce does not match" - ); + require(delegator.startingNonce <= nonce, "PoSValidatorManager: nonce does not match"); - // Ensure the delegator is pending added. Since anybody can call this function once - // delegator registration has been initialized, we need to make sure that this function is only - // callable after that has been done. - require( - $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, - "PoSValidatorManager: delegationID not pending added" - ); // Update the delegation status $._delegatorStakes[delegationID].status = DelegatorStatus.Active; $._delegatorStakes[delegationID].startedAt = uint64(block.timestamp); + emit DelegatorRegistered({ delegationID: delegationID, validationID: validationID, @@ -390,10 +422,6 @@ abstract contract PoSValidatorManager is }); } - /** - * @notice See {INativeTokenStakingManager-initializeValidatorRegistration}. - * Begins the validator registration process. Locks the provided native asset in the contract as the stake. - */ function initializeEndDelegation( bytes32 delegationID, bool includeUptimeProof, @@ -490,21 +518,16 @@ abstract contract PoSValidatorManager is bytes32 delegationID ) external nonReentrant { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + Delegator memory delegator = $._delegatorStakes[delegationID]; // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce,) = ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - Validator memory validator = getValidator(validationID); - Delegator memory delegator = $._delegatorStakes[delegationID]; - // Once this function completes, the delegation is completed and we can clear it from state. - delete $._delegatorStakes[delegationID]; - - // The received nonce should be no greater than the highest sent nonce. This should never - // happen since the staking manager is the only entity that can trigger a weight update - // on the P-Chain. - require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); + require( + delegator.validationID == validationID, "PoSValidatorManager: invalid validation ID" + ); // The nonce should also be greater than or equal to the delegationID's ending nonce. This allows // a weight update using a higher nonce (which implicitly includes the delegation's weight update) @@ -520,6 +543,18 @@ abstract contract PoSValidatorManager is "PoSValidatorManager: delegation not pending added" ); + _completeEndDelegation(delegationID); + } + + function _completeEndDelegation(bytes32 delegationID) internal { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + Delegator memory delegator = $._delegatorStakes[delegationID]; + bytes32 validationID = delegator.validationID; + + // Once this function completes, the delegation is completed so we can clear it from state now. + delete $._delegatorStakes[delegationID]; + uint256 rewards = $._redeemableDelegatorRewards[delegationID]; delete $._redeemableDelegatorRewards[delegationID]; @@ -536,11 +571,18 @@ abstract contract PoSValidatorManager is // Unlock the delegator's stake. _unlock(delegator.owner, weightToValue(delegator.weight)); - emit DelegationEnded(delegationID, validationID, nonce, delegatorRewards, validatorFees); + emit DelegationEnded(delegationID, validationID, delegatorRewards, validatorFees); } + /** + * @dev This function must be implemented to mint rewards to validators and delegators. + */ function _reward(address account, uint256 amount) internal virtual; + /** + * @dev Return true if this is a PoS validator with locked stake. Returns false if this was originally a PoA + * validator that was later migrated to this PoS manager, or the validator was part of the initial validator set. + */ function _isPoSValidator(bytes32 validationID) internal view returns (bool) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); return $._posValidatorInfo[validationID].owner != address(0); diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index 0f4a35d69..2d8b2e056 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -92,14 +92,12 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when delegator removal is completed * @param delegationID The ID of the delegation - * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain + * @param validationID The ID of the validator the delegator was staked to + * @param rewards The rewards given to the delegator + * @param fees The portion of the delegator's rewards paid to the validator */ event DelegationEnded( - bytes32 indexed delegationID, - bytes32 indexed validationID, - uint64 indexed nonce, - uint256 rewards, - uint256 fees + bytes32 indexed delegationID, bytes32 indexed validationID, uint256 rewards, uint256 fees ); /** diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index f7d89bf42..75f7899b0 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -69,11 +69,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); event DelegationEnded( - bytes32 indexed delegationID, - bytes32 indexed validationID, - uint64 indexed nonce, - uint256 rewards, - uint256 fees + bytes32 indexed delegationID, bytes32 indexed validationID, uint256 rewards, uint256 fees ); function testDelegationFeeBipsTooLow() public { @@ -968,9 +964,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetPChainWarpMessage(weightUpdateMessage, true); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded( - delegationID, validationID, expectedNonce, expectedReward, expectedFees - ); + emit DelegationEnded(delegationID, validationID, expectedReward, expectedFees); uint256 balanceBefore = _getStakeAssetBalance(delegator); _expectStakeUnlock(delegator, _weightToValue(delegatorWeight)); From e6e162972dcb611ca9cc240bb585cd655d202819 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 20 Sep 2024 12:07:45 -0500 Subject: [PATCH 379/545] validator manager custom errors --- .../validator-manager/ValidatorManager.sol | 174 +++++++++--------- .../interfaces/IValidatorManager.sol | 13 ++ .../tests/ValidatorManagerTests.t.sol | 6 +- 3 files changed, 108 insertions(+), 85 deletions(-) diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index c783adc48..aeb3c2a02 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -62,6 +62,19 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida uint8 public constant BLS_PUBLIC_KEY_LENGTH = 48; bytes32 public constant P_CHAIN_BLOCKCHAIN_ID = bytes32(0); + error MaxChurnRateExceeded(); + error InvalidWarpMessage(); + error InvalidBlockchainID(); + error InvalidAddress(); + error UnexpectedRegistrationStatus(); + error InvalidValidatorStatus(); + error InvalidValidationID(); + error NodeAlreadyRegistered(); + error InvalidSubnetConversionID(); + error InvalidInput(); + error InvalidExpiry(); + error InvalidInitializationStatus(); + // solhint-disable ordering function _getValidatorManagerStorage() private @@ -97,22 +110,19 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); $._subnetID = settings.subnetID; - require( - settings.maximumChurnPercentage <= MAXIMUM_CHURN_PERCENTAGE_LIMIT, - "ValidatorManager: maximum churn percentage too high" - ); - require( - settings.maximumChurnPercentage > 0, "ValidatorManager: zero maximum churn percentage" - ); + if (settings.maximumChurnPercentage > MAXIMUM_CHURN_PERCENTAGE_LIMIT || + settings.maximumChurnPercentage == 0) { + revert InvalidInput(); + } + $._maximumChurnPercentage = settings.maximumChurnPercentage; $._churnPeriodSeconds = settings.churnPeriodSeconds; } modifier initializedValidatorSet() { - require( - _getValidatorManagerStorage()._initializedValidatorSet, - "ValidatorManager: validator set not initialized" - ); + if (!_getValidatorManagerStorage()._initializedValidatorSet) { + revert InvalidInitializationStatus(); + } _; } @@ -124,17 +134,17 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida uint32 messageIndex ) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - require(!$._initializedValidatorSet, "ValidatorManager: already initialized validator set"); + if($._initializedValidatorSet) { + revert InvalidInitializationStatus(); + } // Check that the blockchainID and validator manager address in the subnetConversionData correspond to this contract. // Other validation checks are done by the P-Chain when converting the subnet, so are not required here. - require( - subnetConversionData.validatorManagerBlockchainID == WARP_MESSENGER.getBlockchainID(), - "ValidatorManager: invalid blockchain ID" - ); - require( - address(subnetConversionData.validatorManagerAddress) == address(this), - "ValidatorManager: invalid validator manager address" - ); + if (subnetConversionData.validatorManagerBlockchainID != WARP_MESSENGER.getBlockchainID()) { + revert InvalidBlockchainID(); + } + if (address(subnetConversionData.validatorManagerAddress) != address(this)) { + revert InvalidAddress(); + } uint256 numInitialValidators = subnetConversionData.initialValidators.length; @@ -150,10 +160,9 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida for (uint32 i; i < numInitialValidators; ++i) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; bytes32 nodeID = initialValidator.nodeID; - require( - $._activeValidators[nodeID] == bytes32(0), - "ValidatorManager: node ID already active" - ); + if ($._activeValidators[nodeID] != bytes32(0)) { + revert NodeAlreadyRegistered(); + } // Continue to encode the initial validators. encodedConversion = abi.encodePacked( @@ -193,10 +202,10 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Parse the Warp message into SubnetConversionMessage bytes32 subnetConversionID = ValidatorMessages.unpackSubnetConversionMessage(warpMessage.payload); - require( - sha256(encodedConversion) == subnetConversionID, - "ValidatorManager: invalid subnet conversion ID" - ); + + if (sha256(encodedConversion) != subnetConversionID) { + revert InvalidSubnetConversionID(); + } $._initializedValidatorSet = true; } @@ -214,25 +223,20 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ) internal virtual initializedValidatorSet returns (bytes32) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - require( - input.registrationExpiry > block.timestamp, - "ValidatorManager: registration expiry not in future" - ); - require( - block.timestamp + MAXIMUM_REGISTRATION_EXPIRY_LENGTH > input.registrationExpiry, - "ValidatorManager: registration expiry too far in future" - ); + + if (input.registrationExpiry <= block.timestamp || + input.registrationExpiry >= block.timestamp + MAXIMUM_REGISTRATION_EXPIRY_LENGTH) { + revert InvalidExpiry(); + } // Ensure the nodeID is not the zero address, and is not already an active validator. - require(input.nodeID != bytes32(0), "ValidatorManager: invalid node ID"); - require( - $._activeValidators[input.nodeID] == bytes32(0), - "ValidatorManager: node ID already active" - ); - require( - input.blsPublicKey.length == BLS_PUBLIC_KEY_LENGTH, - "ValidatorManager: invalid blsPublicKey length" - ); + if (input.blsPublicKey.length != BLS_PUBLIC_KEY_LENGTH || + input.nodeID == bytes32(0)) { + revert InvalidInput(); + } + if ($._activeValidators[input.nodeID] != bytes32(0)) { + revert NodeAlreadyRegistered(); + } // Check that adding this validator would not exceed the maximum churn rate. _checkAndUpdateChurnTracker(weight, 0); @@ -275,11 +279,12 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida function resendRegisterValidatorMessage(bytes32 validationID) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // The initial validator set must have been set already to have pending register validation messages. - require( - $._pendingRegisterValidationMessages[validationID].length > 0 - && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, - "ValidatorManager: invalid validation ID" - ); + if ($._pendingRegisterValidationMessages[validationID].length == 0) { + revert InvalidValidationID(); + } + if ($._validationPeriods[validationID].status != ValidatorStatus.PendingAdded) { + revert InvalidValidatorStatus(); + } // Submit the message to the Warp precompile. WARP_MESSENGER.sendWarpMessage($._pendingRegisterValidationMessages[validationID]); @@ -296,13 +301,16 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida (bytes32 validationID, bool validRegistration) = ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); - require(validRegistration, "ValidatorManager: Registration not valid"); + if (!validRegistration) { + revert UnexpectedRegistrationStatus(); + } // The initial validator set must have been set already to have pending register validation messages. - require( - $._pendingRegisterValidationMessages[validationID].length > 0 - && $._validationPeriods[validationID].status == ValidatorStatus.PendingAdded, - "ValidatorManager: invalid validation ID" - ); + if ($._pendingRegisterValidationMessages[validationID].length == 0) { + revert InvalidValidationID(); + } + if ($._validationPeriods[validationID].status != ValidatorStatus.PendingAdded) { + revert InvalidValidatorStatus(); + } delete $._pendingRegisterValidationMessages[validationID]; $._validationPeriods[validationID].status = ValidatorStatus.Active; @@ -339,9 +347,9 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Ensure the validation period is active. // The initial validator set must have been set already to have active validators. Validator memory validator = $._validationPeriods[validationID]; - require( - validator.status == ValidatorStatus.Active, "ValidatorManager: validator not active" - ); + if (validator.status != ValidatorStatus.Active) { + revert InvalidValidatorStatus(); + } // Update the validator status to pending removal. // They are not removed from the active validators mapping until the P-Chain acknowledges the removal. @@ -373,10 +381,9 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida Validator memory validator = $._validationPeriods[validationID]; // The initial validator set must have been set already to have pending end validation messages. - require( - validator.status == ValidatorStatus.PendingRemoved, - "ValidatorManager: Validator not pending removal" - ); + if (validator.status != ValidatorStatus.PendingRemoved) { + revert InvalidValidatorStatus(); + } WARP_MESSENGER.sendWarpMessage( ValidatorMessages.packSetSubnetValidatorWeightMessage( @@ -404,7 +411,9 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida (bytes32 validationID, bool validRegistration) = ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); - require(!validRegistration, "ValidatorManager: registration still valid"); + if (validRegistration) { + revert UnexpectedRegistrationStatus(); + } Validator memory validator = $._validationPeriods[validationID]; ValidatorStatus endStatus; @@ -412,11 +421,10 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // The validation status is PendingRemoved if validator removal was initiated with a call to {initiateEndValidation}. // The validation status is PendingAdded if the validator was never registered on the P-Chain. // The initial validator set must have been set already to have pending validation messages. - require( - validator.status == ValidatorStatus.PendingRemoved - || validator.status == ValidatorStatus.PendingAdded, - "ValidatorManager: invalid validator status" - ); + if (validator.status != ValidatorStatus.PendingRemoved + && validator.status != ValidatorStatus.PendingAdded) { + revert InvalidValidatorStatus(); + } if (validator.status == ValidatorStatus.PendingRemoved) { endStatus = ValidatorStatus.Completed; @@ -457,16 +465,17 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida { (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "ValidatorManager: invalid warp message"); + if (!valid) { + revert InvalidWarpMessage(); + } // Must match to P-Chain blockchain id, which is 0. - require( - warpMessage.sourceChainID == P_CHAIN_BLOCKCHAIN_ID, - "ValidatorManager: invalid source chain ID" - ); - require( - warpMessage.originSenderAddress == address(0), - "ValidatorManager: invalid origin sender address" - ); + if (warpMessage.sourceChainID != P_CHAIN_BLOCKCHAIN_ID) { + revert InvalidBlockchainID(); + } + if (warpMessage.originSenderAddress != address(0)) { + revert InvalidAddress(); + } + return warpMessage; } @@ -532,11 +541,10 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida churnTracker.churnAmount += weightChange; } - require( - // Rearranged equation of maximumChurnPercentage >= currentChurnPercentage to avoid integer division truncation. - $._maximumChurnPercentage * churnTracker.initialWeight >= churnTracker.churnAmount * 100, - "ValidatorManager: maximum churn rate exceeded" - ); + // Rearranged equation of maximumChurnPercentage >= currentChurnPercentage to avoid integer division truncation. + if ($._maximumChurnPercentage * churnTracker.initialWeight < churnTracker.churnAmount * 100) { + revert MaxChurnRateExceeded(); + } // Two separate calculations because we're using uints and (newValidatorWeight - oldValidatorWeight) could underflow. churnTracker.totalWeight += newValidatorWeight; diff --git a/contracts/validator-manager/interfaces/IValidatorManager.sol b/contracts/validator-manager/interfaces/IValidatorManager.sol index a505f5605..10f5a6821 100644 --- a/contracts/validator-manager/interfaces/IValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IValidatorManager.sol @@ -70,6 +70,19 @@ struct ValidatorRegistrationInput { bytes blsPublicKey; } +error MaxChurnRateExceeded(); +error InvalidWarpMessage(); +error InvalidBlockchainID(); +error InvalidAddress(); +error UnexpectedRegistrationStatus(); +error InvalidStatus(); +error InvalidValidationID(); +error NodeAlreadyRegistered(); +error InvalidSubnetConversionID(); +error InvalidInput(); +error InvalidExpiry(); +error InvalidInitializationStatus(); + interface IValidatorManager { /** * @notice Emitted when a new validation period is created by stake being locked in the manager contract. diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index bbe7417ee..a0bfaab08 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -70,6 +70,8 @@ abstract contract ValidatorManagerTest is Test { event ValidationPeriodEnded(bytes32 indexed validationID, ValidatorStatus indexed status); + error MaxChurnRateExceeded(); + receive() external payable {} fallback() external payable {} @@ -221,7 +223,7 @@ abstract contract ValidatorManagerTest is Test { _beforeSend(DEFAULT_MINIMUM_STAKE_AMOUNT, address(this)); // TODO may need to be updated with minimum stake amount // Second call should fail - vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); + vm.expectRevert(MaxChurnRateExceeded.selector); _initializeValidatorRegistration( ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, @@ -258,7 +260,7 @@ abstract contract ValidatorManagerTest is Test { }); // Second call should fail - vm.expectRevert("ValidatorManager: maximum churn rate exceeded"); + vm.expectRevert(MaxChurnRateExceeded.selector); _initializeEndValidation(validationID, false); } From c8ee39566de2d7763a41c64a9aa81c5309e7e525 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 20 Sep 2024 12:24:54 -0500 Subject: [PATCH 380/545] remove error decls from interface --- .../interfaces/IValidatorManager.sol | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/contracts/validator-manager/interfaces/IValidatorManager.sol b/contracts/validator-manager/interfaces/IValidatorManager.sol index 10f5a6821..a505f5605 100644 --- a/contracts/validator-manager/interfaces/IValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IValidatorManager.sol @@ -70,19 +70,6 @@ struct ValidatorRegistrationInput { bytes blsPublicKey; } -error MaxChurnRateExceeded(); -error InvalidWarpMessage(); -error InvalidBlockchainID(); -error InvalidAddress(); -error UnexpectedRegistrationStatus(); -error InvalidStatus(); -error InvalidValidationID(); -error NodeAlreadyRegistered(); -error InvalidSubnetConversionID(); -error InvalidInput(); -error InvalidExpiry(); -error InvalidInitializationStatus(); - interface IValidatorManager { /** * @notice Emitted when a new validation period is created by stake being locked in the manager contract. From bafc103ac61ae8f789173d2bc625810cb6c0234c Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 20 Sep 2024 13:00:37 -0500 Subject: [PATCH 381/545] pos manager custom errors --- .../ERC20TokenStakingManager.sol | 4 +- .../validator-manager/PoSValidatorManager.sol | 214 +++++++++--------- .../validator-manager/ValidatorManager.sol | 31 +-- .../tests/ERC20TokenStakingManagerTests.t.sol | 12 +- .../NativeTokenStakingManagerTests.t.sol | 10 +- .../tests/PoSValidatorManagerTests.t.sol | 40 ++-- .../tests/ValidatorManagerTests.t.sol | 11 + 7 files changed, 173 insertions(+), 149 deletions(-) diff --git a/contracts/validator-manager/ERC20TokenStakingManager.sol b/contracts/validator-manager/ERC20TokenStakingManager.sol index bb4756b94..16af3c64c 100644 --- a/contracts/validator-manager/ERC20TokenStakingManager.sol +++ b/contracts/validator-manager/ERC20TokenStakingManager.sol @@ -83,7 +83,9 @@ contract ERC20TokenStakingManager is onlyInitializing { ERC20TokenStakingManagerStorage storage $ = _getERC20StakingManagerStorage(); - require(address(token) != address(0), "ERC20TokenStakingManager: zero token address"); + if (address(token) == address(0)) { + revert InvalidAddress(); + } $._token = token; } diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index f661d7c2c..fe5b5274d 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -74,6 +74,16 @@ abstract contract PoSValidatorManager is uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; + error InvalidDelegatorStatus(); + error InvalidNonce(); + error InvalidDelegationID(); + error ValidatorNotPoS(); + error MaxWeightExceeded(); + error InvalidDelegationFee(); + error InvalidStakeDuration(); + error InvalidStakeAmount(); + error InvalidStakeMultiplier(); + // solhint-disable ordering function _getPoSValidatorManagerStorage() private @@ -113,20 +123,17 @@ abstract contract PoSValidatorManager is IRewardCalculator rewardCalculator ) internal onlyInitializing { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - require(minimumDelegationFeeBips > 0, "PoSValidatorManager: zero delegation fee"); - require( - minimumDelegationFeeBips <= MAXIMUM_DELEGATION_FEE_BIPS, - "PoSValidatorManager: invalid delegation fee" - ); - require( - minimumStakeAmount <= maximumStakeAmount, - "PoSValidatorManager: invalid stake amount range" - ); - require(maximumStakeMultiplier > 0, "PoSValidatorManager: zero maximum stake multiplier"); - require( - maximumStakeMultiplier <= MAXIMUM_STAKE_MULTIPLIER_LIMIT, - "PoSValidatorManager: invalid maximum stake multiplier" - ); + if (minimumDelegationFeeBips == 0 || minimumDelegationFeeBips > MAXIMUM_DELEGATION_FEE_BIPS) + { + revert InvalidDelegationFee(); + } + if (minimumStakeAmount > maximumStakeAmount) { + revert InvalidStakeAmount(); + } + if (maximumStakeMultiplier == 0 || maximumStakeMultiplier > MAXIMUM_STAKE_MULTIPLIER_LIMIT) + { + revert InvalidStakeMultiplier(); + } $._minimumStakeAmount = minimumStakeAmount; $._maximumStakeAmount = maximumStakeAmount; @@ -141,14 +148,13 @@ abstract contract PoSValidatorManager is Validator memory validator = getValidator(validationID); - require( - validator.status == ValidatorStatus.Completed, - "PoSValidatorManager: validation period not completed" - ); - require( - $._validatorRequirements[validationID].owner == _msgSender(), - "PoSValidatorManager: validator not owned by sender" - ); + if (validator.status != ValidatorStatus.Completed) { + revert InvalidValidatorStatus(); + } + + if ($._validatorRequirements[validationID].owner != _msgSender()) { + revert InvalidAddress(); + } uint256 rewards = $._redeemableValidatorRewards[validationID]; delete $._redeemableValidatorRewards[validationID]; @@ -170,17 +176,17 @@ abstract contract PoSValidatorManager is } // PoS validations can only be ended by their owners. - require( - $._validatorRequirements[validationID].owner == _msgSender(), - "PoSValidatorManager: validator not owned by sender" - ); + if ($._validatorRequirements[validationID].owner != _msgSender()) { + revert InvalidAddress(); + } // Check that minimum stake duration has passed. - require( + if ( validator.endedAt - >= validator.startedAt + $._validatorRequirements[validationID].minStakeDuration, - "PoSValidatorManager: minimum stake duration not met" - ); + < validator.startedAt + $._validatorRequirements[validationID].minStakeDuration + ) { + revert InvalidStakeDuration(); + } if (includeUptimeProof) { // Uptime proofs include the absolute number of seconds the validator has been active. @@ -226,22 +232,22 @@ abstract contract PoSValidatorManager is function _getUptime(bytes32 validationID, uint32 messageIndex) internal view returns (uint64) { (WarpMessage memory warpMessage, bool valid) = WARP_MESSENGER.getVerifiedWarpMessage(messageIndex); - require(valid, "PoSValidatorManager: invalid warp message"); + if (!valid) { + revert InvalidWarpMessage(); + } - require( - warpMessage.sourceChainID == WARP_MESSENGER.getBlockchainID(), - "PoSValidatorManager: invalid source chain ID" - ); - require( - warpMessage.originSenderAddress == address(0), - "PoSValidatorManager: invalid origin sender address" - ); + if (warpMessage.sourceChainID != WARP_MESSENGER.getBlockchainID()) { + revert InvalidBlockchainID(); + } + if (warpMessage.originSenderAddress != address(0)) { + revert InvalidAddress(); + } (bytes32 uptimeValidationID, uint64 uptime) = ValidatorMessages.unpackValidationUptimeMessage(warpMessage.payload); - require( - validationID == uptimeValidationID, "PoSValidatorManager: invalid uptime validation ID" - ); + if (validationID != uptimeValidationID) { + revert InvalidValidationID(); + } return uptime; } @@ -254,19 +260,21 @@ abstract contract PoSValidatorManager is ) internal virtual returns (bytes32) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); // Validate and save the validator requirements - require( - delegationFeeBips >= $._minimumDelegationFeeBips - && delegationFeeBips <= MAXIMUM_DELEGATION_FEE_BIPS, - "PoSValidatorManager: invalid delegation fee" - ); - require( - minStakeDuration >= $._minimumStakeDuration, - "PoSValidatorManager: invalid min stake duration" - ); + if ( + delegationFeeBips < $._minimumDelegationFeeBips + || delegationFeeBips > MAXIMUM_DELEGATION_FEE_BIPS + ) { + revert InvalidDelegationFee(); + } + + if (minStakeDuration < $._minimumStakeDuration) { + revert InvalidStakeDuration(); + } // Ensure the weight is within the valid range. - require(stakeAmount >= $._minimumStakeAmount, "PoSValidatorManager: stake amount too low"); - require(stakeAmount <= $._maximumStakeAmount, "PoSValidatorManager: stake amount too high"); + if (stakeAmount < $._minimumStakeAmount || stakeAmount > $._maximumStakeAmount) { + revert InvalidStakeAmount(); + } // Lock the stake in the contract. uint256 lockedValue = _lock(stakeAmount); @@ -304,17 +312,18 @@ abstract contract PoSValidatorManager is // Ensure the validation period is active Validator memory validator = getValidator(validationID); // Check that the validation ID is a PoS validator - require(_isPoSValidator(validationID), "PoSValidatorManager: not a PoS validator"); - require( - validator.status == ValidatorStatus.Active, "PoSValidatorManager: validator not active" - ); + if (!_isPoSValidator(validationID)) { + revert ValidatorNotPoS(); + } + if (validator.status != ValidatorStatus.Active) { + revert InvalidValidatorStatus(); + } // Update the validator weight uint64 newValidatorWeight = validator.weight + weight; - require( - newValidatorWeight <= validator.startingWeight * $._maximumStakeMultiplier, - "PoSValidatorManager: maximum validator weight reached" - ); + if (newValidatorWeight > validator.startingWeight * $._maximumStakeMultiplier) { + revert MaxWeightExceeded(); + } (uint64 nonce, bytes32 messageID) = _setValidatorWeight(validationID, newValidatorWeight); @@ -356,27 +365,22 @@ abstract contract PoSValidatorManager is Validator memory validator = getValidator(validationID); - // The received nonce should be no greater than the highest sent nonce. This should never - // happen since the staking manager is the only entity that can trigger a weight update - // on the P-Chain. - require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); - - // The nonce should also be greater than or equal to the delegationID's starting nonce. This allows - // a weight update using a higher nonce (which implicitly includes the delegation's weight update) - // to be used to complete registration for an earlier delegation. This is necessary because the P-Chain - // is only willing to sign the latest weight update. - require( - $._delegatorStakes[delegationID].startingNonce <= nonce, - "PoSValidatorManager: nonce does not match" - ); + // The received nonce should be no greater than the highest sent nonce, and at least as high as + // the delegation's statubg nonce. This allows //a weight update using a higher nonce + // (which implicitly includes the delegation's weight update) to be used to complete delisting + // for an earlier delegation. This is necessary because the P-Chainis only willing to sign the latest weight update. + if ( + validator.messageNonce < nonce || $._delegatorStakes[delegationID].startingNonce > nonce + ) { + revert InvalidNonce(); + } // Ensure the delegator is pending added. Since anybody can call this function once // delegator registration has been initialized, we need to make sure that this function is only // callable after that has been done. - require( - $._delegatorStakes[delegationID].status == DelegatorStatus.PendingAdded, - "PoSValidatorManager: delegationID not pending added" - ); + if ($._delegatorStakes[delegationID].status != DelegatorStatus.PendingAdded) { + revert InvalidDelegatorStatus(); + } // Update the delegation status $._delegatorStakes[delegationID].status = DelegatorStatus.Active; $._delegatorStakes[delegationID].startedAt = uint64(block.timestamp); @@ -404,13 +408,13 @@ abstract contract PoSValidatorManager is Validator memory validator = getValidator(validationID); // Ensure the delegator is active - require( - delegator.status == DelegatorStatus.Active, "PoSValidatorManager: delegation not active" - ); + if (delegator.status != DelegatorStatus.Active) { + revert InvalidDelegatorStatus(); + } // Only the delegation owner can end the delegation. - require( - delegator.owner == _msgSender(), "PoSValidatorManager: delegation not owned by sender" - ); + if (delegator.owner != _msgSender()) { + revert InvalidAddress(); + } // Set the delegator status to pending removed, so that it can be properly removed in // the complete step, even if the delivered nonce is greater than the nonce used to @@ -463,17 +467,17 @@ abstract contract PoSValidatorManager is function resendUpdateDelegation(bytes32 delegationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; - require( - delegator.status == DelegatorStatus.PendingAdded - || delegator.status == DelegatorStatus.PendingRemoved, - "PoSValidatorManager: delegation status not pending" - ); + if ( + delegator.status != DelegatorStatus.PendingAdded + && delegator.status != DelegatorStatus.PendingRemoved + ) { + revert InvalidDelegatorStatus(); + } Validator memory validator = getValidator(delegator.validationID); - require( - validator.messageNonce != 0, - "PoSValidatorManager: could not find validator for delegation ID" - ); + if (validator.messageNonce == 0) { + revert InvalidDelegationID(); + } // Submit the message to the Warp precompile. WARP_MESSENGER.sendWarpMessage( @@ -499,24 +503,20 @@ abstract contract PoSValidatorManager is // Once this function completes, the delegation is completed and we can clear it from state. delete $._delegatorStakes[delegationID]; - // The received nonce should be no greater than the highest sent nonce. This should never - // happen since the staking manager is the only entity that can trigger a weight update - // on the P-Chain. - require(validator.messageNonce >= nonce, "PoSValidatorManager: invalid nonce"); - - // The nonce should also be greater than or equal to the delegationID's ending nonce. This allows - // a weight update using a higher nonce (which implicitly includes the delegation's weight update) - // to be used to complete delisting for an earlier delegation. This is necessary because the P-Chain - // is only willing to sign the latest weight update. - require(delegator.endingNonce <= nonce, "PoSValidatorManager: nonce does not match"); + // The received nonce should be no greater than the highest sent nonce, and at least as high as + // the delegation's ending nonce. This allows //a weight update using a higher nonce + // (which implicitly includes the delegation's weight update) to be used to complete delisting + // for an earlier delegation. This is necessary because the P-Chainis only willing to sign the latest weight update. + if (validator.messageNonce < nonce || delegator.endingNonce > nonce) { + revert InvalidNonce(); + } // Ensure the delegator is pending removed. Since anybody can call this function once // end delegation has been initialized, we need to make sure that this function is only // callable after that has been done. - require( - delegator.status == DelegatorStatus.PendingRemoved, - "PoSValidatorManager: delegation not pending added" - ); + if (delegator.status != DelegatorStatus.PendingRemoved) { + revert InvalidDelegatorStatus(); + } uint256 rewards = $._redeemableDelegatorRewards[delegationID]; delete $._redeemableDelegatorRewards[delegationID]; diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index aeb3c2a02..3b8258589 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -110,8 +110,10 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); $._subnetID = settings.subnetID; - if (settings.maximumChurnPercentage > MAXIMUM_CHURN_PERCENTAGE_LIMIT || - settings.maximumChurnPercentage == 0) { + if ( + settings.maximumChurnPercentage > MAXIMUM_CHURN_PERCENTAGE_LIMIT + || settings.maximumChurnPercentage == 0 + ) { revert InvalidInput(); } @@ -134,7 +136,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida uint32 messageIndex ) external { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - if($._initializedValidatorSet) { + if ($._initializedValidatorSet) { revert InvalidInitializationStatus(); } // Check that the blockchainID and validator manager address in the subnetConversionData correspond to this contract. @@ -202,7 +204,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Parse the Warp message into SubnetConversionMessage bytes32 subnetConversionID = ValidatorMessages.unpackSubnetConversionMessage(warpMessage.payload); - + if (sha256(encodedConversion) != subnetConversionID) { revert InvalidSubnetConversionID(); } @@ -223,15 +225,15 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ) internal virtual initializedValidatorSet returns (bytes32) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - - if (input.registrationExpiry <= block.timestamp || - input.registrationExpiry >= block.timestamp + MAXIMUM_REGISTRATION_EXPIRY_LENGTH) { + if ( + input.registrationExpiry <= block.timestamp + || input.registrationExpiry >= block.timestamp + MAXIMUM_REGISTRATION_EXPIRY_LENGTH + ) { revert InvalidExpiry(); } // Ensure the nodeID is not the zero address, and is not already an active validator. - if (input.blsPublicKey.length != BLS_PUBLIC_KEY_LENGTH || - input.nodeID == bytes32(0)) { + if (input.blsPublicKey.length != BLS_PUBLIC_KEY_LENGTH || input.nodeID == bytes32(0)) { revert InvalidInput(); } if ($._activeValidators[input.nodeID] != bytes32(0)) { @@ -421,8 +423,10 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // The validation status is PendingRemoved if validator removal was initiated with a call to {initiateEndValidation}. // The validation status is PendingAdded if the validator was never registered on the P-Chain. // The initial validator set must have been set already to have pending validation messages. - if (validator.status != ValidatorStatus.PendingRemoved - && validator.status != ValidatorStatus.PendingAdded) { + if ( + validator.status != ValidatorStatus.PendingRemoved + && validator.status != ValidatorStatus.PendingAdded + ) { revert InvalidValidatorStatus(); } @@ -475,7 +479,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida if (warpMessage.originSenderAddress != address(0)) { revert InvalidAddress(); } - + return warpMessage; } @@ -542,7 +546,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida } // Rearranged equation of maximumChurnPercentage >= currentChurnPercentage to avoid integer division truncation. - if ($._maximumChurnPercentage * churnTracker.initialWeight < churnTracker.churnAmount * 100) { + if ($._maximumChurnPercentage * churnTracker.initialWeight < churnTracker.churnAmount * 100) + { revert MaxChurnRateExceeded(); } diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index 046130709..998fcf583 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -58,7 +58,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMinimumDelegationFee() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(_formatErrorMessage("zero delegation fee")); + vm.expectRevert(InvalidDelegationFee.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -80,7 +80,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testMaxMinimumDelegationFee() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); uint16 minimumDelegationFeeBips = app.MAXIMUM_DELEGATION_FEE_BIPS() + 1; - vm.expectRevert(_formatErrorMessage("invalid delegation fee")); + vm.expectRevert(InvalidDelegationFee.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -101,7 +101,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testInvalidStakeAmountRange() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(_formatErrorMessage("invalid stake amount range")); + vm.expectRevert(InvalidStakeAmount.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -122,7 +122,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMaxStakeMultiplier() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(_formatErrorMessage("zero maximum stake multiplier")); + vm.expectRevert(InvalidStakeMultiplier.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -144,7 +144,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testMaxStakeMultiplierOverLimit() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; - vm.expectRevert(_formatErrorMessage("invalid maximum stake multiplier")); + vm.expectRevert(InvalidStakeMultiplier.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -167,7 +167,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ValidatorRegistrationInput memory input = ValidatorRegistrationInput(DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY); uint256 stakeAmount = _weightToValue(DEFAULT_WEIGHT); - vm.expectRevert(_formatErrorMessage("invalid min stake duration")); + vm.expectRevert(InvalidStakeDuration.selector); app.initializeValidatorRegistration( input, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION - 1, stakeAmount ); diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index 593704a78..3c3605027 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -51,7 +51,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(_formatErrorMessage("zero delegation fee")); + vm.expectRevert(InvalidDelegationFee.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -72,7 +72,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testMaxMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); uint16 minimumDelegationFeeBips = app.MAXIMUM_DELEGATION_FEE_BIPS() + 1; - vm.expectRevert(_formatErrorMessage("invalid delegation fee")); + vm.expectRevert(InvalidDelegationFee.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -92,7 +92,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testInvalidStakeAmountRange() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(_formatErrorMessage("invalid stake amount range")); + vm.expectRevert(InvalidStakeAmount.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -112,7 +112,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMaxStakeMultiplier() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(_formatErrorMessage("zero maximum stake multiplier")); + vm.expectRevert(InvalidStakeMultiplier.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -133,7 +133,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testMaxStakeMultiplierOverLimit() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; - vm.expectRevert(_formatErrorMessage("invalid maximum stake multiplier")); + vm.expectRevert(InvalidStakeMultiplier.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 089b3351d..130e7cab9 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -76,13 +76,23 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 fees ); + error InvalidDelegatorStatus(); + error InvalidNonce(); + error InvalidDelegationID(); + error ValidatorNotPoS(); + error MaxWeightExceeded(); + error InvalidDelegationFee(); + error InvalidStakeDuration(); + error InvalidStakeAmount(); + error InvalidStakeMultiplier(); + function testDelegationFeeBipsTooLow() public { ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(_formatErrorMessage("invalid delegation fee")); + vm.expectRevert(InvalidDelegationFee.selector); _initializeValidatorRegistration( registrationInput, DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1, @@ -98,7 +108,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); uint16 delegationFeeBips = posValidatorManager.MAXIMUM_DELEGATION_FEE_BIPS() + 1; - vm.expectRevert(_formatErrorMessage("invalid delegation fee")); + vm.expectRevert(InvalidDelegationFee.selector); _initializeValidatorRegistration( registrationInput, delegationFeeBips, @@ -113,7 +123,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(_formatErrorMessage("invalid min stake duration")); + vm.expectRevert(InvalidStakeDuration.selector); _initializeValidatorRegistration( registrationInput, DEFAULT_DELEGATION_FEE_BIPS, @@ -128,7 +138,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(_formatErrorMessage("stake amount too low")); + vm.expectRevert(InvalidStakeAmount.selector); _initializeValidatorRegistration( registrationInput, DEFAULT_DELEGATION_FEE_BIPS, @@ -143,7 +153,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(_formatErrorMessage("stake amount too high")); + vm.expectRevert(InvalidStakeAmount.selector); _initializeValidatorRegistration( registrationInput, DEFAULT_DELEGATION_FEE_BIPS, @@ -161,7 +171,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - vm.expectRevert(_formatErrorMessage("minimum stake duration not met")); + vm.expectRevert(InvalidStakeDuration.selector); posValidatorManager.initializeEndValidation(validationID, false, 0); } @@ -176,7 +186,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _mockGetUptimeWarpMessage(new bytes(0), false); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); - vm.expectRevert(_formatErrorMessage("invalid warp message")); + vm.expectRevert(InvalidWarpMessage.selector); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -193,7 +203,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetUptimeWarpMessage(new bytes(0), true); _mockGetBlockchainID(posValidatorManager.P_CHAIN_BLOCKCHAIN_ID()); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); - vm.expectRevert(_formatErrorMessage("invalid source chain ID")); + vm.expectRevert(InvalidBlockchainID.selector); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -225,7 +235,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); - vm.expectRevert(_formatErrorMessage("invalid origin sender address")); + vm.expectRevert(InvalidAddress.selector); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -257,7 +267,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); - vm.expectRevert(_formatErrorMessage("invalid uptime validation ID")); + vm.expectRevert(InvalidValidationID.selector); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -370,7 +380,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetPChainWarpMessage(setValidatorWeightPayload, true); vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); - vm.expectRevert("PoSValidatorManager: nonce does not match"); + vm.expectRevert(InvalidNonce.selector); posValidatorManager.completeDelegatorRegistration(0, delegationID2); } @@ -423,7 +433,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); vm.prank(address(1)); - vm.expectRevert("PoSValidatorManager: validator not owned by sender"); + vm.expectRevert(InvalidAddress.selector); posValidatorManager.initializeEndValidation(validationID, false, 0); } @@ -652,7 +662,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _mockGetPChainWarpMessage(setValidatorWeightPayload, true); - vm.expectRevert("PoSValidatorManager: nonce does not match"); + vm.expectRevert(InvalidNonce.selector); posValidatorManager.completeEndDelegation(0, delegationID2); } @@ -989,8 +999,4 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _getStakeAssetBalance(address account) internal virtual returns (uint256); function _expectStakeUnlock(address account, uint256 amount) internal virtual; function _expectRewardIssuance(address account, uint256 amount) internal virtual; - - function _formatErrorMessage(bytes memory errorMessage) internal pure returns (bytes memory) { - return abi.encodePacked("PoSValidatorManager: ", errorMessage); - } } diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index a0bfaab08..9df16b91d 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -71,6 +71,17 @@ abstract contract ValidatorManagerTest is Test { event ValidationPeriodEnded(bytes32 indexed validationID, ValidatorStatus indexed status); error MaxChurnRateExceeded(); + error InvalidWarpMessage(); + error InvalidBlockchainID(); + error InvalidAddress(); + error UnexpectedRegistrationStatus(); + error InvalidValidatorStatus(); + error InvalidValidationID(); + error NodeAlreadyRegistered(); + error InvalidSubnetConversionID(); + error InvalidInput(); + error InvalidExpiry(); + error InvalidInitializationStatus(); receive() external payable {} fallback() external payable {} From e7ac131002f45f8cd9b33f6211f9709a5602f31e Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 20 Sep 2024 13:03:18 -0500 Subject: [PATCH 382/545] update abi --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 4 ++-- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 4 ++-- .../PoAValidatorManager/PoAValidatorManager.go | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 096976097..d97c1c66e 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -82,8 +82,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160d83803806160d883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f8b8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c806376f78621116100f3578063ba3a4b9711610093578063d5f20ff61161006e578063d5f20ff6146103bd578063df93d8de146103dd578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063ba3a4b971461038f578063bee0a03f146103a2578063c974d1b6146103b5575f80fd5b806398f3e2b4116100ce57806398f3e2b4146103305780639e1bc4ef14610343578063a3a65e4814610356578063b771b3bc14610369575f80fd5b806376f78621146103025780638280a25a1461031557806393e245981461031d575f80fd5b8063467ef06f1161015e57806361e2f4901161013957806361e2f490146102c257806362065856146102d557806366435abf146102e8578063732214f8146102fb575f80fd5b8063467ef06f1461027f5780635297fae61461029257806360305d62146102a5575f80fd5b80630118acc4146101a55780630322ed98146101ba5780630cdd0985146101cd578063151d30d11461021e5780632e2194d81461023857806335455ded14610263575b5f80fd5b6101b86101b33660046152a3565b61040d565b005b6101b86101c83660046152de565b6108b1565b61020b6101db3660046152de565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610226600a81565b60405160ff9091168152602001610215565b61024b6102463660046152de565b610a6a565b6040516001600160401b039091168152602001610215565b61026c61271081565b60405161ffff9091168152602001610215565b6101b861028d3660046152f5565b610a80565b6101b86102a036600461530e565b610b20565b6102ad601481565b60405163ffffffff9091168152602001610215565b6101b86102d0366004615336565b610cf5565b61020b6102e336600461539a565b611329565b61024b6102f63660046152de565b611342565b61020b5f81565b6101b86103103660046152a3565b611356565b610226603081565b6101b861032b3660046152de565b611599565b6101b861033e36600461530e565b61169f565b61020b6103513660046153b3565b6119c3565b6101b86103643660046152f5565b6119ef565b6103776005600160991b0181565b6040516001600160a01b039091168152602001610215565b6101b861039d3660046152de565b611ba7565b6101b86103b03660046152de565b611e2d565b610226601481565b6103d06103cb3660046152de565b611f41565b60405161021591906153e7565b61024b6202a30081565b61020b6103f53660046154a7565b612009565b6101b8610408366004615520565b61203e565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615edf83398151915293929190829060ff16600481111561046e5761046e6153d3565b600481111561047f5761047f6153d3565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61050382611f41565b905060028351600481111561051a5761051a6153d3565b1461056c5760405162461bcd60e51b815260206004820152602a60248201525f80516020615eff8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105d15760405162461bcd60e51b815260206004820152603360248201525f80516020615eff8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610563565b6003835280515f9060029060058111156105ed576105ed6153d3565b0361064457861561060557610602838761211d565b90505b5f8460600151836080015161061a9190615572565b905061062684826123b9565b506001600160401b0390811660e0870152421660a086015250610678565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106ab8660600151611329565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610728573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074c9190615592565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561078b5761078b6153d3565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161089f916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f5f8339815191526020526040808220815160e0810190925280545f80516020615f1f83398151915293929190829060ff1660058111156108fe576108fe6153d3565b600581111561090f5761090f6153d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561097e5761097e6153d3565b146109e35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610563565b6005600160991b016001600160a01b031663ee5b48eb610a088584606001515f612510565b6040518263ffffffff1660e01b8152600401610a2491906155cb565b6020604051808303815f875af1158015610a40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a649190615592565b50505050565b5f610a7a64e8d4a51000836155fd565b92915050565b5f80516020615edf8339815191525f80610a9984612737565b91509150610aa682612a81565b610ab05750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610ade57610ade6153d3565b03610b03575f83815260088501602052604081208054919055610b018282612abc565b505b610b1981610b148460400151611329565b612b32565b5050505050565b5f80516020615edf8339815191525f610b3884612b55565b90505f80610b498360400151612d1b565b50915091505f610b5883611f41565b9050816001600160401b031681606001516001600160401b03161015610b905760405162461bcd60e51b81526004016105639061561c565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610bd55760405162461bcd60e51b81526004016105639061565e565b60015f87815260068701602052604090205460ff166004811115610bfb57610bfb6153d3565b14610c645760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610563565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615f1f8339815191529060ff1615610d925760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610563565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df99190615592565b836020013514610e5b5760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610563565b30610e6c60608501604086016156a7565b6001600160a01b031614610ede5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610563565b5f610eec60608501856156c2565b91505f9050843560208601356014610f0a6060890160408a016156a7565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611239575f610f8a60608901896156c2565b8363ffffffff16818110610fa057610fa0615707565b9050602002810190610fb2919061571b565b610fbb906157cb565b80515f8181526008890160205260409020549192509015610fee5760405162461bcd60e51b815260040161056390615862565b84825f01518360200151846040015160405160200161101094939291906158aa565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f9160029161105e91906158f9565b602060405180830381855afa158015611079573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061109c9190615592565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff19166001836005811115611128576111286153d3565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111db91168661590a565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112329061591d565b9050610f6e565b50600484018190555f61124b86612b55565b90505f61125b8260400151612f56565b90508060028560405161126e91906158f9565b602060405180830381855afa158015611289573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112ac9190615592565b146113105760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610563565b5050506009909201805460ff1916600117905550505050565b5f610a7a6001600160401b03831664e8d4a5100061593f565b5f61134c82611f41565b6080015192915050565b5f80516020615edf8339815191525f61136e856130c8565b905061137985612a81565b611384575050505050565b5f8581526005830160205260409020546001600160a01b031633146113bb5760405162461bcd60e51b815260040161056390615956565b5f85815260058301602052604090205460a08201516113ea91600160b01b90046001600160401b0316906159a8565b6001600160401b03168160c001516001600160401b0316101561146b5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610563565b8315610b19575f61147c868561211d565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906114d390611329565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611549573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061156d9190615592565b5f8781526008850160205260408120805490919061158c90849061590a565b9091555050505050505050565b5f80516020615edf8339815191525f6115b183611f41565b90506004815160058111156115c8576115c86153d3565b146116325760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610563565b5f8381526005830160205260409020546001600160a01b031633146116695760405162461bcd60e51b815260040161056390615956565b5f83815260088301602090815260408083208054908490556005860190925290912054610a64906001600160a01b031682612abc565b6116a7613343565b5f80516020615edf8339815191525f6116bf84612b55565b90505f806116d08360400151612d1b565b50915091505f6116df83611f41565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611719576117196153d3565b600481111561172a5761172a6153d3565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff19169055908401519192508481169116101561180e5760405162461bcd60e51b81526004016105639061561c565b826001600160401b03168160e001516001600160401b031611156118445760405162461bcd60e51b81526004016105639061565e565b600381516004811115611859576118596153d3565b146118ad5760405162461bcd60e51b815260206004820152603160248201525f80516020615eff8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610563565b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906118ee90600160a01b900461ffff168461593f565b6118f891906155fd565b905080886008015f8881526020019081526020015f205f82825461191c919061590a565b909155505f905061192d82846159c8565b905061193d846020015182612abc565b6119528460200151610b148660600151611329565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611998929190918252602082015260400190565b60405180910390a45050505050505050506119bf60015f80516020615f3f83398151915255565b5050565b5f6119cc613343565b6119d783338461338d565b9050610a7a60015f80516020615f3f83398151915255565b5f80516020615f1f8339815191525f611a0783612b55565b90505f80611a188360400151613747565b9150915080611a7a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610563565b5f82815260068501602052604081208054611a94906159db565b9050118015611ac6575060015f83815260078601602052604090205460ff166005811115611ac457611ac46153d3565b145b611ae25760405162461bcd60e51b815260040161056390615a13565b5f8281526006850160205260408120611afa916151f3565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615edf83398151915293929190829060ff166004811115611c0857611c086153d3565b6004811115611c1957611c196153d3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ca057611ca06153d3565b1480611cbe5750600381516004811115611cbc57611cbc6153d3565b145b611d125760405162461bcd60e51b815260206004820152603260248201525f80516020615eff833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610563565b5f611d208260400151611f41565b905080606001516001600160401b03165f03611da45760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610563565b6005600160991b016001600160a01b031663ee5b48eb611dd1846040015184606001518560800151612510565b6040518263ffffffff1660e01b8152600401611ded91906155cb565b6020604051808303815f875af1158015611e09573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b199190615592565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020615f1f833981519152929190611e75906159db565b9050118015611ea7575060015f83815260078301602052604090205460ff166005811115611ea557611ea56153d3565b145b611ec35760405162461bcd60e51b815260040161056390615a13565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611efc9190600401615a5a565b6020604051808303815f875af1158015611f18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f3c9190615592565b505050565b611f4961522a565b5f8281525f80516020615f5f833981519152602052604090819020815160e0810190925280545f80516020615f1f833981519152929190829060ff166005811115611f9657611f966153d3565b6005811115611fa757611fa76153d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f612012613343565b61201e858585856138e8565b905061203660015f80516020615f3f83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680612087575080546001600160401b03808416911610155b156120a55760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556120d08484613b5d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612168573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261218f9190810190615aef565b91509150806121f25760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610563565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612235573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122599190615592565b8251146122bd5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610563565b60208201516001600160a01b0316156123335760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610563565b5f806123428460400151613b77565b915091508187146123af5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610563565b9695505050505050565b5f8281525f80516020615f5f833981519152602052604081206002015481905f80516020615f1f83398151915290600160801b90046001600160401b03166124018582613d4f565b5f61240b87613f5d565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61245b8a858b612510565b6040518263ffffffff1660e01b815260040161247791906155cb565b6020604051808303815f875af1158015612493573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b79190615592565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015612589576125498160016159c8565b61255490600861593f565b5081515f9083908390811061256b5761256b615707565b60200101906001600160f81b03191690815f1a905350600101612535565b505f5b60048110156125f4576125a08160036159c8565b6125ab90600861593f565b600263ffffffff16901c60f81b828260026125c6919061590a565b815181106125d6576125d6615707565b60200101906001600160f81b03191690815f1a90535060010161258c565b505f5b60208110156126565761260b81601f6159c8565b61261690600861593f565b86901c60f81b8261262883600661590a565b8151811061263857612638615707565b60200101906001600160f81b03191690815f1a9053506001016125f7565b505f5b60088110156126c15761266d8160076159c8565b61267890600861593f565b6001600160401b038616901c60f81b8261269383602661590a565b815181106126a3576126a3615707565b60200101906001600160f81b03191690815f1a905350600101612659565b505f5b600881101561272c576126d88160076159c8565b6126e390600861593f565b6001600160401b038516901c60f81b826126fe83602e61590a565b8151811061270e5761270e615707565b60200101906001600160f81b03191690815f1a9053506001016126c4565b5090505b9392505050565b5f61274061522a565b5f80516020615f1f8339815191525f61275885612b55565b90505f806127698360400151613747565b9150915080156127ce5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610563565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156127ff576127ff6153d3565b6005811115612810576128106153d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612881576128816153d3565b148061289f575060018251600581111561289d5761289d6153d3565b145b6128fe5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610563565b600382516005811115612913576129136153d3565b0361292057506004612924565b5060055b6020808301515f9081526008880190915260408120558181600581111561294d5761294d6153d3565b90816005811115612960576129606153d3565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115612994576129946153d3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612a4857612a486153d3565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f80516020615ebf83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b17575f80fd5b505af1158015612b29573d5f803e3d5ffd5b50505050505050565b5f80516020615ebf833981519152546119bf906001600160a01b03168383613fed565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bb9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612be09190810190615aef565b9150915080612c405760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610563565b815115612ca15760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610563565b60208201516001600160a01b031615612d145760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610563565b5092915050565b5f805f8351603614612d3f5760405162461bcd60e51b815260040161056390615bc1565b5f805b6002811015612d8e57612d568160016159c8565b612d6190600861593f565b61ffff16868281518110612d7757612d77615707565b016020015160f81c901b9190911790600101612d42565b5061ffff811615612db15760405162461bcd60e51b815260040161056390615c0a565b5f805b6004811015612e0c57612dc88160036159c8565b612dd390600861593f565b63ffffffff1687612de583600261590a565b81518110612df557612df5615707565b016020015160f81c901b9190911790600101612db4565b5063ffffffff8116600414612e335760405162461bcd60e51b815260040161056390615c4d565b5f805b6020811015612e8857612e4a81601f6159c8565b612e5590600861593f565b88612e6183600661590a565b81518110612e7157612e71615707565b016020015160f81c901b9190911790600101612e36565b505f805b6008811015612ee757612ea08160076159c8565b612eab90600861593f565b6001600160401b031689612ec083602661590a565b81518110612ed057612ed0615707565b016020015160f81c901b9190911790600101612e8c565b505f805b6008811015612f4657612eff8160076159c8565b612f0a90600861593f565b6001600160401b03168a612f1f83602e61590a565b81518110612f2f57612f2f615707565b016020015160f81c901b9190911790600101612eeb565b5091989097509095509350505050565b5f8151602614612f785760405162461bcd60e51b815260040161056390615bc1565b5f805b6002811015612fc757612f8f8160016159c8565b612f9a90600861593f565b61ffff16848281518110612fb057612fb0615707565b016020015160f81c901b9190911790600101612f7b565b5061ffff811615612fea5760405162461bcd60e51b815260040161056390615c0a565b5f805b6004811015613045576130018160036159c8565b61300c90600861593f565b63ffffffff168561301e83600261590a565b8151811061302e5761302e615707565b016020015160f81c901b9190911790600101612fed565b5063ffffffff81161561306a5760405162461bcd60e51b815260040161056390615c4d565b5f805b60208110156130bf5761308181601f6159c8565b61308c90600861593f565b8661309883600661590a565b815181106130a8576130a8615707565b016020015160f81c901b919091179060010161306d565b50949350505050565b6130d061522a565b5f8281525f80516020615f5f8339815191526020526040808220815160e0810190925280545f80516020615f1f83398151915293929190829060ff16600581111561311d5761311d6153d3565b600581111561312e5761312e6153d3565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131a0576131a06153d3565b146131fc5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610563565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613240576132406153d3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132ec85826123b9565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615f3f83398151915280546001190161337457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f80516020615f3f83398151915255565b5f5f80516020615edf833981519152816133a96102468561404c565b90505f6133b587611f41565b90506133c087612a81565b61341d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610563565b600281516005811115613432576134326153d3565b146134915760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610563565b5f8282608001516134a291906159a8565b600485015460408401519192506134c4916001600160401b0390911690615c94565b6001600160401b0316816001600160401b031611156135435760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610563565b5f8061354f8a846123b9565b915091505f8a8360405160200161357d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613618576136186153d3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461376a5760405162461bcd60e51b815260040161056390615bc1565b5f805b60028110156137b9576137818160016159c8565b61378c90600861593f565b61ffff168582815181106137a2576137a2615707565b016020015160f81c901b919091179060010161376d565b5061ffff8116156137dc5760405162461bcd60e51b815260040161056390615c0a565b5f805b6004811015613837576137f38160036159c8565b6137fe90600861593f565b63ffffffff168661381083600261590a565b8151811061382057613820615707565b016020015160f81c901b91909117906001016137df565b5063ffffffff811660031461385e5760405162461bcd60e51b815260040161056390615c4d565b5f805b60208110156138b35761387581601f6159c8565b61388090600861593f565b8761388c83600661590a565b8151811061389c5761389c615707565b016020015160f81c901b9190911790600101613861565b505f866026815181106138c8576138c8615707565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615edf8339815191529061ffff861610801590613934575061271061ffff861611155b6139505760405162461bcd60e51b815260040161056390615cbf565b60028101546001600160401b0390811690851610156139c95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610563565b8054831015613a2c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610563565b8060010154831115613a935760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610563565b5f613a9d8461404c565b90505f613aa982610a6a565b90505f613ab6898361406f565b90506040518060600160405280613aca3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613b656145d3565b613b6e8261461e565b6119bf81614693565b5f808251602e14613b9a5760405162461bcd60e51b815260040161056390615bc1565b5f805b6002811015613be957613bb18160016159c8565b613bbc90600861593f565b61ffff16858281518110613bd257613bd2615707565b016020015160f81c901b9190911790600101613b9d565b5061ffff811615613c0c5760405162461bcd60e51b815260040161056390615c0a565b5f805b6004811015613c6757613c238160036159c8565b613c2e90600861593f565b63ffffffff1686613c4083600261590a565b81518110613c5057613c50615707565b016020015160f81c901b9190911790600101613c0f565b5063ffffffff8116600514613c8e5760405162461bcd60e51b815260040161056390615c4d565b5f805b6020811015613ce357613ca581601f6159c8565b613cb090600861593f565b87613cbc83600661590a565b81518110613ccc57613ccc615707565b016020015160f81c901b9190911790600101613c91565b505f805b6008811015613d4257613cfb8160076159c8565b613d0690600861593f565b6001600160401b031688613d1b83602661590a565b81518110613d2b57613d2b615707565b016020015160f81c901b9190911790600101613ce7565b5090969095509350505050565b5f80516020615f1f8339815191525f6001600160401b038084169085161115613d8357613d7c8385615572565b9050613d90565b613d8d8484615572565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613df2575060018401548151613dee916001600160401b03169061590a565b8210155b15613e18576001600160401b038316606082015281815260408101516020820152613e37565b8281606001818151613e2a91906159a8565b6001600160401b03169052505b6060810151613e47906064615c94565b602082015160018601546001600160401b039290921691613e729190600160401b900460ff1661593f565b1015613ed65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610563565b856001600160401b031681604001818151613ef1919061590a565b9052506040810180516001600160401b0387169190613f119083906159c8565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f5f8339815191526020526040812060020180545f80516020615f1f83398151915291600160401b9091046001600160401b0316906008613fa783615d0a565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611f3c91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614734565b5f610a7a825f80516020615ebf833981519152546001600160a01b031690614795565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166140fa5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610563565b5f80516020615f1f83398151915242614119604086016020870161539a565b6001600160401b03161161418b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610563565b61419b604085016020860161539a565b6001600160401b03166141b16202a3004261590a565b116142245760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610563565b833561427c5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610563565b83355f908152600882016020526040902054156142ab5760405162461bcd60e51b815260040161056390615862565b60306142ba6040860186615d25565b90501461431f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610563565b614329835f613d4f565b5f806143c26040518060a00160405280855f01548152602001885f01358152602001876001600160401b0316815260200188602001602081019061436d919061539a565b6001600160401b0316815260200161438860408a018a615d25565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506148f7565b5f828152600686016020526040902091935091506143e08282615dab565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061440d9085906004016155cb565b6020604051808303815f875af1158015614429573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061444d9190615592565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156144c5576144c56153d3565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916145a5918e01908e0161539a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661461c57604051631afcd79f60e31b815260040160405180910390fd5b565b6146266145d3565b61462f81614ca6565b614637614cbf565b6146906060820135608083013561465460c0850160a0860161539a565b61466460e0860160c08701615e6a565b61ffff16614679610100870160e08801615e83565b61468b610120880161010089016156a7565b614ccf565b50565b61469b6145d3565b5f80516020615ebf8339815191526001600160a01b0382166147145760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610563565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6147486001600160a01b03841683614f13565b905080515f1415801561476c57508080602001905181019061476a9190615ea3565b155b15611f3c57604051635274afe760e01b81526001600160a01b0384166004820152602401610563565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156147db573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147ff9190615592565b90506148166001600160a01b038516333086614f20565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561485a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061487e9190615592565b90508181116148e45760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610563565b6148ee82826159c8565b95945050505050565b5f60608260800151516030146149615760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610563565b60408051608680825260c082019092525f916020820181803683370190505090505f5b60028110156149d8576149988160016159c8565b6149a390600861593f565b5081515f908390839081106149ba576149ba615707565b60200101906001600160f81b03191690815f1a905350600101614984565b505f5b6004811015614a40576149ef8160036159c8565b6149fa90600861593f565b600160ff919091161c60f81b82614a1283600261590a565b81518110614a2257614a22615707565b60200101906001600160f81b03191690815f1a9053506001016149db565b505f5b6020811015614a9d5784518160208110614a5f57614a5f615707565b1a60f81b82614a6f83600661590a565b81518110614a7f57614a7f615707565b60200101906001600160f81b03191690815f1a905350600101614a43565b505f5b6020811015614afd5784602001518160208110614abf57614abf615707565b1a60f81b82614acf83602661590a565b81518110614adf57614adf615707565b60200101906001600160f81b03191690815f1a905350600101614aa0565b505f5b6008811015614b7157614b148160076159c8565b614b1f90600861593f565b60ff1685604001516001600160401b0316901c60f81b82826046614b43919061590a565b81518110614b5357614b53615707565b60200101906001600160f81b03191690815f1a905350600101614b00565b505f5b6030811015614bdc5784608001518181518110614b9357614b93615707565b01602001516001600160f81b03191682614bae83604e61590a565b81518110614bbe57614bbe615707565b60200101906001600160f81b03191690815f1a905350600101614b74565b505f5b6008811015614c4e57614bf38160076159c8565b614bfe90600861593f565b60608601516001600160401b0390811691161c60f81b82614c2083607e61590a565b81518110614c3057614c30615707565b60200101906001600160f81b03191690815f1a905350600101614bdf565b50600281604051614c5f91906158f9565b602060405180830381855afa158015614c7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c9d9190615592565b94909350915050565b614cae6145d3565b614cb6614f59565b61469081614f61565b614cc76145d3565b61461c6150dc565b614cd76145d3565b5f80516020615edf83398151915283614d435760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610563565b612710841115614d655760405162461bcd60e51b815260040161056390615cbf565b85871115614dcd5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610563565b5f8360ff1611614e3a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610563565b600a60ff84161115614eac5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610563565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b606061273083835f6150e4565b6040516001600160a01b038481166024830152838116604483015260648201839052610a649186918216906323b872dd9060840161401a565b61461c6145d3565b614f696145d3565b80355f80516020615f1f8339815191529081556014614f8e6060840160408501615e83565b60ff161115614ffb5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610563565b5f61500c6060840160408501615e83565b60ff16116150745760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610563565b6150846060830160408401615e83565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556150b5604083016020840161539a565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61337a6145d3565b6060814710156151095760405163cd78605960e01b8152306004820152602401610563565b5f80856001600160a01b0316848660405161512491906158f9565b5f6040518083038185875af1925050503d805f811461515e576040519150601f19603f3d011682016040523d82523d5f602084013e615163565b606091505b50915091506123af8683836060826151835761517e826151ca565b612730565b815115801561519a57506001600160a01b0384163b155b156151c357604051639996b31560e01b81526001600160a01b0385166004820152602401610563565b5080612730565b8051156151da5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546151ff906159db565b5f825580601f1061520e575050565b601f0160209004905f5260205f20908101906146909190615266565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561527a575f8155600101615267565b5090565b8015158114614690575f80fd5b803563ffffffff8116811461529e575f80fd5b919050565b5f805f606084860312156152b5575f80fd5b8335925060208401356152c78161527e565b91506152d56040850161528b565b90509250925092565b5f602082840312156152ee575f80fd5b5035919050565b5f60208284031215615305575f80fd5b6127308261528b565b5f806040838503121561531f575f80fd5b6153288361528b565b946020939093013593505050565b5f8060408385031215615347575f80fd5b82356001600160401b0381111561535c575f80fd5b83016080818603121561536d575f80fd5b915061537b6020840161528b565b90509250929050565b80356001600160401b038116811461529e575f80fd5b5f602082840312156153aa575f80fd5b61273082615384565b5f80604083850312156153c4575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061540a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161544560608401826001600160401b03169052565b50608083015161546060808401826001600160401b03169052565b5060a083015161547b60a08401826001600160401b03169052565b5060c0830151612d1460c08401826001600160401b03169052565b803561ffff8116811461529e575f80fd5b5f805f80608085870312156154ba575f80fd5b84356001600160401b038111156154cf575f80fd5b8501606081880312156154e0575f80fd5b93506154ee60208601615496565b92506154fc60408601615384565b9396929550929360600135925050565b6001600160a01b0381168114614690575f80fd5b5f80828403610140811215615533575f80fd5b61012080821215615542575f80fd5b84935083013590506155538161550c565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612d1457612d1461555e565b5f602082840312156155a2575f80fd5b5051919050565b5f5b838110156155c35781810151838201526020016155ab565b50505f910152565b602081525f82518060208401526155e98160408501602087016155a9565b601f01601f19169190910160400192915050565b5f8261561757634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f602082840312156156b7575f80fd5b81356127308161550c565b5f808335601e198436030181126156d7575f80fd5b8301803591506001600160401b038211156156f0575f80fd5b6020019150600581901b3603821315612509575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261572f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561576f5761576f615739565b60405290565b604051601f8201601f191681016001600160401b038111828210171561579d5761579d615739565b604052919050565b5f6001600160401b038211156157bd576157bd615739565b50601f01601f191660200190565b5f606082360312156157db575f80fd5b6157e361574d565b8235815260206157f4818501615384565b8183015260408401356001600160401b03811115615810575f80fd5b840136601f820112615820575f80fd5b803561583361582e826157a5565b615775565b8181523684838501011115615846575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516158bb818460208a016155a9565b80830190508581526001600160401b0360c01b8560c01b16602082015283516158eb8160288401602088016155a9565b016028019695505050505050565b5f825161572f8184602087016155a9565b80820180821115610a7a57610a7a61555e565b5f63ffffffff8083168181036159355761593561555e565b6001019392505050565b8082028115828204841417610a7a57610a7a61555e565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b03818116838216019080821115612d1457612d1461555e565b81810381811115610a7a57610a7a61555e565b600181811c908216806159ef57607f821691505b602082108103615a0d57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615a6c816159db565b806020870152604060018084165f8114615a8d5760018114615aa957615ad6565b60ff19851660408a0152604084151560051b8a01019550615ad6565b895f5260205f205f5b85811015615acd5781548b8201860152908301908801615ab2565b8a016040019650505b509398975050505050505050565b805161529e8161527e565b5f8060408385031215615b00575f80fd5b82516001600160401b0380821115615b16575f80fd5b9084019060608287031215615b29575f80fd5b615b3161574d565b82518152602080840151615b448161550c565b82820152604084015183811115615b59575f80fd5b80850194505087601f850112615b6d575f80fd5b83519250615b7d61582e846157a5565b8381528882858701011115615b90575f80fd5b615b9f848383018488016155a9565b80604084015250819550615bb4818801615ae4565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615cb757615cb761555e565b505092915050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b5f6001600160401b038083168181036159355761593561555e565b5f808335601e19843603018112615d3a575f80fd5b8301803591506001600160401b03821115615d53575f80fd5b602001915036819003821315612509575f80fd5b601f821115611f3c57805f5260205f20601f840160051c81016020851015615d8c5750805b601f840160051c820191505b81811015610b19575f8155600101615d98565b81516001600160401b03811115615dc457615dc4615739565b615dd881615dd284546159db565b84615d67565b602080601f831160018114615e0b575f8415615df45750858301515b5f19600386901b1c1916600185901b178555615e62565b5f85815260208120601f198616915b82811015615e3957888601518255948401946001909101908401615e1a565b5085821015615e5657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615e7a575f80fd5b61273082615496565b5f60208284031215615e93575f80fd5b813560ff81168114612730575f80fd5b5f60208284031215615eb3575f80fd5b81516127308161527e56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161531038038061531083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151c38061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c806376f78621116100f3578063ba3a4b9711610093578063d5f20ff61161006e578063d5f20ff6146103bd578063df93d8de146103dd578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063ba3a4b971461038f578063bee0a03f146103a2578063c974d1b6146103b5575f80fd5b806398f3e2b4116100ce57806398f3e2b4146103305780639e1bc4ef14610343578063a3a65e4814610356578063b771b3bc14610369575f80fd5b806376f78621146103025780638280a25a1461031557806393e245981461031d575f80fd5b8063467ef06f1161015e57806361e2f4901161013957806361e2f490146102c257806362065856146102d557806366435abf146102e8578063732214f8146102fb575f80fd5b8063467ef06f1461027f5780635297fae61461029257806360305d62146102a5575f80fd5b80630118acc4146101a55780630322ed98146101ba5780630cdd0985146101cd578063151d30d11461021e5780632e2194d81461023857806335455ded14610263575b5f80fd5b6101b86101b33660046146b2565b61040d565b005b6101b86101c83660046146ed565b610845565b61020b6101db3660046146ed565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610226600a81565b60405160ff9091168152602001610215565b61024b6102463660046146ed565b6109b7565b6040516001600160401b039091168152602001610215565b61026c61271081565b60405161ffff9091168152602001610215565b6101b861028d366004614704565b6109cd565b6101b86102a036600461471d565b610a6d565b6102ad601481565b60405163ffffffff9091168152602001610215565b6101b86102d0366004614745565b610be2565b61020b6102e33660046147a9565b6110fc565b61024b6102f63660046146ed565b611115565b61020b5f81565b6101b86103103660046146b2565b611129565b610226603081565b6101b861032b3660046146ed565b611322565b6101b861033e36600461471d565b6113dd565b61020b6103513660046147c2565b6116b6565b6101b8610364366004614704565b6116e2565b6103776005600160991b0181565b6040516001600160a01b039091168152602001610215565b6101b861039d3660046146ed565b611871565b6101b86103b03660046146ed565b611a6f565b610226601481565b6103d06103cb3660046146ed565b611b99565b60405161021591906147f6565b61024b6202a30081565b61020b6103f53660046148b6565b611c61565b6101b861040836600461492f565b611c96565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061513783398151915293929190829060ff16600481111561046e5761046e6147e2565b600481111561047f5761047f6147e2565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61050382611b99565b905060028351600481111561051a5761051a6147e2565b146105385760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105655760405163e6c4247b60e01b815260040160405180910390fd5b6003835280515f906002906005811115610581576105816147e2565b036105d8578615610599576105968387611d75565b90505b5f846060015183608001516105ae9190614981565b90506105ba8482611ef9565b506001600160401b0390811660e0870152421660a08601525061060c565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561063f86606001516110fc565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e091906149a1565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561071f5761071f6147e2565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610833916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206151978339815191526020526040808220815160e0810190925280545f8051602061515783398151915293929190829060ff166005811115610892576108926147e2565b60058111156108a3576108a36147e2565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610912576109126147e2565b146109305760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109558584606001515f612050565b6040518263ffffffff1660e01b815260040161097191906149da565b6020604051808303815f875af115801561098d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b191906149a1565b50505050565b5f6109c764e8d4a5100083614a0c565b92915050565b5f805160206151378339815191525f806109e684612277565b915091506109f382612541565b6109fd5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610a2b57610a2b6147e2565b03610a50575f83815260088501602052604081208054919055610a4e828261257c565b505b610a6681610a6184604001516110fc565b6125f2565b5050505050565b5f805160206151378339815191525f610a8584612615565b90505f80610a968360400151612715565b50915091505f610aa583611b99565b9050816001600160401b031681606001516001600160401b03161080610aef57505f8681526006860160205260409020600201546001600160401b03808416600160c01b90920416115b15610b0d57604051633ab3447f60e11b815260040160405180910390fd5b60015f87815260068701602052604090205460ff166004811115610b3357610b336147e2565b14610b515760405163f95c7fe160e01b815260040160405180910390fd5b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151578339815191529060ff1615610c3457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9b91906149a1565b836020013514610cbe5760405163d040949d60e01b815260040160405180910390fd5b30610ccf6060850160408601614a2b565b6001600160a01b031614610cf65760405163e6c4247b60e01b815260040160405180910390fd5b5f610d046060850185614a46565b91505f9050843560208601356014610d226060890160408a01614a2b565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015611052575f610da26060890189614a46565b8363ffffffff16818110610db857610db8614a8b565b9050602002810190610dca9190614a9f565b610dd390614b4f565b80515f8181526008890160205260409020549192509015610e0757604051630eb0d31360e11b815260040160405180910390fd5b84825f015183602001518460400151604051602001610e299493929190614be6565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f91600291610e779190614c35565b602060405180830381855afa158015610e92573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610eb591906149a1565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff19166001836005811115610f4157610f416147e2565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610ff4911686614c46565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061104b90614c59565b9050610d86565b50600484018190555f61106486612615565b90505f6110748260400151612959565b9050806002856040516110879190614c35565b602060405180830381855afa1580156110a2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110c591906149a1565b146110e357604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6109c76001600160401b03831664e8d4a51000614c7b565b5f61111f82611b99565b6080015192915050565b5f805160206151378339815191525f61114185612acb565b905061114c85612541565b611157575050505050565b5f8581526005830160205260409020546001600160a01b0316331461118f5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260058301602052604090205460a08201516111be91600160b01b90046001600160401b031690614c92565b6001600160401b03168160c001516001600160401b031610156111f4576040516302336bad60e51b815260040160405180910390fd5b8315610a66575f6112058685611d75565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061125c906110fc565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156112d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f691906149a1565b5f87815260088501602052604081208054909190611315908490614c46565b9091555050505050505050565b5f805160206151378339815191525f61133a83611b99565b9050600481516005811115611351576113516147e2565b1461136f5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526005830160205260409020546001600160a01b031633146113a75760405163e6c4247b60e01b815260040160405180910390fd5b5f838152600883016020908152604080832080549084905560058601909252909120546109b1906001600160a01b03168261257c565b6113e5612d08565b5f805160206151378339815191525f6113fd84612615565b90505f8061140e8360400151612715565b50915091505f61141d83611b99565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff166004811115611457576114576147e2565b6004811115611468576114686147e2565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff19169055908401519192508481169116108061154f5750826001600160401b03168160e001516001600160401b0316115b1561156d57604051633ab3447f60e11b815260040160405180910390fd5b600381516004811115611582576115826147e2565b146115a05760405163f95c7fe160e01b815260040160405180910390fd5b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906115e190600160a01b900461ffff1684614c7b565b6115eb9190614a0c565b905080886008015f8881526020019081526020015f205f82825461160f9190614c46565b909155505f90506116208284614cb2565b905061163084602001518261257c565b6116458460200151610a6186606001516110fc565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033848660405161168b929190918252602082015260400190565b60405180910390a45050505050505050506116b260015f8051602061517783398151915255565b5050565b5f6116bf612d08565b6116ca833384612d52565b90506109c760015f8051602061517783398151915255565b5f805160206151578339815191525f6116fa83612615565b90505f8061170b836040015161303e565b915091508061172d57604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461174790614cc5565b90505f0361176857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561178e5761178e6147e2565b146117ac5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206117c491614602565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f8051602061513783398151915293929190829060ff1660048111156118d2576118d26147e2565b60048111156118e3576118e36147e2565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561196a5761196a6147e2565b1415801561198b5750600381516004811115611988576119886147e2565b14155b156119a95760405163f95c7fe160e01b815260040160405180910390fd5b5f6119b78260400151611b99565b905080606001516001600160401b03165f036119e657604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611a13846040015184606001518560800151612050565b6040518263ffffffff1660e01b8152600401611a2f91906149da565b6020604051808303815f875af1158015611a4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a6691906149a1565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206151578339815191529190611ab690614cc5565b90505f03611ad757604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611afd57611afd6147e2565b14611b1b5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611b549190600401614cfd565b6020604051808303815f875af1158015611b70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b9491906149a1565b505050565b611ba1614639565b5f8281525f80516020615197833981519152602052604090819020815160e0810190925280545f80516020615157833981519152929190829060ff166005811115611bee57611bee6147e2565b6005811115611bff57611bff6147e2565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611c6a612d08565b611c76858585856131df565b9050611c8e60015f8051602061517783398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611cdf575080546001600160401b03808416911610155b15611cfd5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611d288484613372565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611dc0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611de79190810190614d92565b9150915080611e0957604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e7091906149a1565b825114611e905760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611ebc5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ecb846040015161338c565b91509150818714611eef57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615197833981519152602052604081206002015481905f8051602061515783398151915290600160801b90046001600160401b0316611f418582613564565b5f611f4b8761372d565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611f9b8a858b612050565b6040518263ffffffff1660e01b8152600401611fb791906149da565b6020604051808303815f875af1158015611fd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff791906149a1565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156120c957612089816001614cb2565b612094906008614c7b565b5081515f908390839081106120ab576120ab614a8b565b60200101906001600160f81b03191690815f1a905350600101612075565b505f5b6004811015612134576120e0816003614cb2565b6120eb906008614c7b565b600263ffffffff16901c60f81b828260026121069190614c46565b8151811061211657612116614a8b565b60200101906001600160f81b03191690815f1a9053506001016120cc565b505f5b60208110156121965761214b81601f614cb2565b612156906008614c7b565b86901c60f81b82612168836006614c46565b8151811061217857612178614a8b565b60200101906001600160f81b03191690815f1a905350600101612137565b505f5b6008811015612201576121ad816007614cb2565b6121b8906008614c7b565b6001600160401b038616901c60f81b826121d3836026614c46565b815181106121e3576121e3614a8b565b60200101906001600160f81b03191690815f1a905350600101612199565b505f5b600881101561226c57612218816007614cb2565b612223906008614c7b565b6001600160401b038516901c60f81b8261223e83602e614c46565b8151811061224e5761224e614a8b565b60200101906001600160f81b03191690815f1a905350600101612204565b5090505b9392505050565b5f612280614639565b5f805160206151578339815191525f61229885612615565b90505f806122a9836040015161303e565b9150915080156122cc57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156122fd576122fd6147e2565b600581111561230e5761230e6147e2565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561237f5761237f6147e2565b141580156123a0575060018251600581111561239d5761239d6147e2565b14155b156123be5760405163a36c527f60e01b815260040160405180910390fd5b6003825160058111156123d3576123d36147e2565b036123e0575060046123e4565b5060055b6020808301515f9081526008880190915260408120558181600581111561240d5761240d6147e2565b90816005811115612420576124206147e2565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115612454576124546147e2565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612508576125086147e2565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f8051602061511783398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156125d7575f80fd5b505af11580156125e9573d5f803e3d5ffd5b50505050505050565b5f80516020615117833981519152546116b2906001600160a01b031683836137bd565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612679573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126a09190810190614d92565b91509150806126c257604051636b2f19e960e01b815260040160405180910390fd5b8151156126e25760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561270e5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146127425760405162461bcd60e51b815260040161273990614e64565b60405180910390fd5b5f805b600281101561279157612759816001614cb2565b612764906008614c7b565b61ffff1686828151811061277a5761277a614a8b565b016020015160f81c901b9190911790600101612745565b5061ffff8116156127b45760405162461bcd60e51b815260040161273990614ead565b5f805b600481101561280f576127cb816003614cb2565b6127d6906008614c7b565b63ffffffff16876127e8836002614c46565b815181106127f8576127f8614a8b565b016020015160f81c901b91909117906001016127b7565b5063ffffffff81166004146128365760405162461bcd60e51b815260040161273990614ef0565b5f805b602081101561288b5761284d81601f614cb2565b612858906008614c7b565b88612864836006614c46565b8151811061287457612874614a8b565b016020015160f81c901b9190911790600101612839565b505f805b60088110156128ea576128a3816007614cb2565b6128ae906008614c7b565b6001600160401b0316896128c3836026614c46565b815181106128d3576128d3614a8b565b016020015160f81c901b919091179060010161288f565b505f805b600881101561294957612902816007614cb2565b61290d906008614c7b565b6001600160401b03168a61292283602e614c46565b8151811061293257612932614a8b565b016020015160f81c901b91909117906001016128ee565b5091989097509095509350505050565b5f815160261461297b5760405162461bcd60e51b815260040161273990614e64565b5f805b60028110156129ca57612992816001614cb2565b61299d906008614c7b565b61ffff168482815181106129b3576129b3614a8b565b016020015160f81c901b919091179060010161297e565b5061ffff8116156129ed5760405162461bcd60e51b815260040161273990614ead565b5f805b6004811015612a4857612a04816003614cb2565b612a0f906008614c7b565b63ffffffff1685612a21836002614c46565b81518110612a3157612a31614a8b565b016020015160f81c901b91909117906001016129f0565b5063ffffffff811615612a6d5760405162461bcd60e51b815260040161273990614ef0565b5f805b6020811015612ac257612a8481601f614cb2565b612a8f906008614c7b565b86612a9b836006614c46565b81518110612aab57612aab614a8b565b016020015160f81c901b9190911790600101612a70565b50949350505050565b612ad3614639565b5f8281525f805160206151978339815191526020526040808220815160e0810190925280545f8051602061515783398151915293929190829060ff166005811115612b2057612b206147e2565b6005811115612b3157612b316147e2565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612ba357612ba36147e2565b14612bc15760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612c0557612c056147e2565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612cb18582611ef9565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615177833981519152805460011901612d3957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061517783398151915255565b5f5f8051602061513783398151915281612d6e6102468561381c565b90505f612d7a87611b99565b9050612d8587612541565b612da257604051636ca57bcf60e01b815260040160405180910390fd5b600281516005811115612db757612db76147e2565b14612dd55760405163a36c527f60e01b815260040160405180910390fd5b5f828260800151612de69190614c92565b60048501546040840151919250612e08916001600160401b0390911690614f37565b6001600160401b0316816001600160401b03161115612e3a57604051630c192e7760e41b815260040160405180910390fd5b5f80612e468a84611ef9565b915091505f8a83604051602001612e7492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115612f0f57612f0f6147e2565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146130615760405162461bcd60e51b815260040161273990614e64565b5f805b60028110156130b057613078816001614cb2565b613083906008614c7b565b61ffff1685828151811061309957613099614a8b565b016020015160f81c901b9190911790600101613064565b5061ffff8116156130d35760405162461bcd60e51b815260040161273990614ead565b5f805b600481101561312e576130ea816003614cb2565b6130f5906008614c7b565b63ffffffff1686613107836002614c46565b8151811061311757613117614a8b565b016020015160f81c901b91909117906001016130d6565b5063ffffffff81166003146131555760405162461bcd60e51b815260040161273990614ef0565b5f805b60208110156131aa5761316c81601f614cb2565b613177906008614c7b565b87613183836006614c46565b8151811061319357613193614a8b565b016020015160f81c901b9190911790600101613158565b505f866026815181106131bf576131bf614a8b565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206151378339815191529061ffff86161080613228575061271061ffff8616115b156132465760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613278576040516302336bad60e51b815260040160405180910390fd5b805483108061328a5750806001015483115b156132a857604051630103be3b60e21b815260040160405180910390fd5b5f6132b28461381c565b90505f6132be826109b7565b90505f6132cb898361383f565b905060405180606001604052806132df3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b61337a613c18565b61338382613c63565b6116b281613cd8565b5f808251602e146133af5760405162461bcd60e51b815260040161273990614e64565b5f805b60028110156133fe576133c6816001614cb2565b6133d1906008614c7b565b61ffff168582815181106133e7576133e7614a8b565b016020015160f81c901b91909117906001016133b2565b5061ffff8116156134215760405162461bcd60e51b815260040161273990614ead565b5f805b600481101561347c57613438816003614cb2565b613443906008614c7b565b63ffffffff1686613455836002614c46565b8151811061346557613465614a8b565b016020015160f81c901b9190911790600101613424565b5063ffffffff81166005146134a35760405162461bcd60e51b815260040161273990614ef0565b5f805b60208110156134f8576134ba81601f614cb2565b6134c5906008614c7b565b876134d1836006614c46565b815181106134e1576134e1614a8b565b016020015160f81c901b91909117906001016134a6565b505f805b600881101561355757613510816007614cb2565b61351b906008614c7b565b6001600160401b031688613530836026614c46565b8151811061354057613540614a8b565b016020015160f81c901b91909117906001016134fc565b5090969095509350505050565b5f805160206151578339815191525f6001600160401b038084169085161115613598576135918385614981565b90506135a5565b6135a28484614981565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613607575060018401548151613603916001600160401b031690614c46565b8210155b1561362d576001600160401b03831660608201528181526040810151602082015261364c565b828160600181815161363f9190614c92565b6001600160401b03169052505b606081015161365c906064614f37565b602082015160018601546001600160401b0392909216916136879190600160401b900460ff16614c7b565b10156136a65760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516136c19190614c46565b9052506040810180516001600160401b03871691906136e1908390614cb2565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206151978339815191526020526040812060020180545f8051602061515783398151915291600160401b9091046001600160401b031690600861377783614f62565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611b9491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613d35565b5f6109c7825f80516020615117833981519152546001600160a01b031690613d96565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661388357604051637fab81e560e01b815260040160405180910390fd5b5f80516020615157833981519152426138a260408601602087016147a9565b6001600160401b03161115806138dc57506138c06202a30042614c46565b6138d060408601602087016147a9565b6001600160401b031610155b156138f95760405162d36c8560e81b815260040160405180910390fd5b60306139086040860186614f7d565b905014158061391657508335155b156139345760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561396457604051630eb0d31360e11b815260040160405180910390fd5b61396e835f613564565b5f80613a076040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906139b291906147a9565b6001600160401b031681526020016139cd60408a018a614f7d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613ef8565b5f82815260068601602052604090209193509150613a258282615003565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613a529085906004016149da565b6020604051808303815f875af1158015613a6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a9291906149a1565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613b0a57613b0a6147e2565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613bea918e01908e016147a9565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c6157604051631afcd79f60e31b815260040160405180910390fd5b565b613c6b613c18565b613c74816142a7565b613c7c6142c0565b613cd560608201356080830135613c9960c0850160a086016147a9565b613ca960e0860160c087016150c2565b61ffff16613cbe610100870160e088016150db565b613cd061012088016101008901614a2b565b6142d0565b50565b613ce0613c18565b5f805160206151178339815191526001600160a01b038216613d155760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613d496001600160a01b038416836143cb565b905080515f14158015613d6d575080806020019051810190613d6b91906150fb565b155b15611b9457604051635274afe760e01b81526001600160a01b0384166004820152602401612739565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015613ddc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e0091906149a1565b9050613e176001600160a01b0385163330866143d8565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015613e5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e7f91906149a1565b9050818111613ee55760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401612739565b613eef8282614cb2565b95945050505050565b5f6060826080015151603014613f625760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401612739565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015613fd957613f99816001614cb2565b613fa4906008614c7b565b5081515f90839083908110613fbb57613fbb614a8b565b60200101906001600160f81b03191690815f1a905350600101613f85565b505f5b600481101561404157613ff0816003614cb2565b613ffb906008614c7b565b600160ff919091161c60f81b82614013836002614c46565b8151811061402357614023614a8b565b60200101906001600160f81b03191690815f1a905350600101613fdc565b505f5b602081101561409e578451816020811061406057614060614a8b565b1a60f81b82614070836006614c46565b8151811061408057614080614a8b565b60200101906001600160f81b03191690815f1a905350600101614044565b505f5b60208110156140fe57846020015181602081106140c0576140c0614a8b565b1a60f81b826140d0836026614c46565b815181106140e0576140e0614a8b565b60200101906001600160f81b03191690815f1a9053506001016140a1565b505f5b600881101561417257614115816007614cb2565b614120906008614c7b565b60ff1685604001516001600160401b0316901c60f81b828260466141449190614c46565b8151811061415457614154614a8b565b60200101906001600160f81b03191690815f1a905350600101614101565b505f5b60308110156141dd578460800151818151811061419457614194614a8b565b01602001516001600160f81b031916826141af83604e614c46565b815181106141bf576141bf614a8b565b60200101906001600160f81b03191690815f1a905350600101614175565b505f5b600881101561424f576141f4816007614cb2565b6141ff906008614c7b565b60608601516001600160401b0390811691161c60f81b8261422183607e614c46565b8151811061423157614231614a8b565b60200101906001600160f81b03191690815f1a9053506001016141e0565b506002816040516142609190614c35565b602060405180830381855afa15801561427b573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061429e91906149a1565b94909350915050565b6142af613c18565b6142b7614411565b613cd581614419565b6142c8613c18565b613c616144eb565b6142d8613c18565b5f805160206151378339815191528315806142f4575061271084115b156143125760405163c98d73a760e01b815260040160405180910390fd5b8587111561433357604051630103be3b60e21b815260040160405180910390fd5b60ff831615806143465750600a60ff8416115b15614364576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b606061227083835f6144f3565b6040516001600160a01b0384811660248301528381166044830152606482018390526109b19186918216906323b872dd906084016137ea565b613c61613c18565b614421613c18565b80355f80516020615157833981519152908155601461444660608401604085016150db565b60ff161180614465575061446060608301604084016150db565b60ff16155b156144835760405163b4fa3fb360e01b815260040160405180910390fd5b61449360608301604084016150db565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556144c460408301602084016147a9565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d3f613c18565b6060814710156145185760405163cd78605960e01b8152306004820152602401612739565b5f80856001600160a01b031684866040516145339190614c35565b5f6040518083038185875af1925050503d805f811461456d576040519150601f19603f3d011682016040523d82523d5f602084013e614572565b606091505b5091509150611eef8683836060826145925761458d826145d9565b612270565b81511580156145a957506001600160a01b0384163b155b156145d257604051639996b31560e01b81526001600160a01b0385166004820152602401612739565b5080612270565b8051156145e95780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461460e90614cc5565b5f825580601f1061461d575050565b601f0160209004905f5260205f2090810190613cd59190614675565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614689575f8155600101614676565b5090565b8015158114613cd5575f80fd5b803563ffffffff811681146146ad575f80fd5b919050565b5f805f606084860312156146c4575f80fd5b8335925060208401356146d68161468d565b91506146e46040850161469a565b90509250925092565b5f602082840312156146fd575f80fd5b5035919050565b5f60208284031215614714575f80fd5b6122708261469a565b5f806040838503121561472e575f80fd5b6147378361469a565b946020939093013593505050565b5f8060408385031215614756575f80fd5b82356001600160401b0381111561476b575f80fd5b83016080818603121561477c575f80fd5b915061478a6020840161469a565b90509250929050565b80356001600160401b03811681146146ad575f80fd5b5f602082840312156147b9575f80fd5b61227082614793565b5f80604083850312156147d3575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061481957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161485460608401826001600160401b03169052565b50608083015161486f60808401826001600160401b03169052565b5060a083015161488a60a08401826001600160401b03169052565b5060c083015161270e60c08401826001600160401b03169052565b803561ffff811681146146ad575f80fd5b5f805f80608085870312156148c9575f80fd5b84356001600160401b038111156148de575f80fd5b8501606081880312156148ef575f80fd5b93506148fd602086016148a5565b925061490b60408601614793565b9396929550929360600135925050565b6001600160a01b0381168114613cd5575f80fd5b5f80828403610140811215614942575f80fd5b61012080821215614951575f80fd5b84935083013590506149628161491b565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561270e5761270e61496d565b5f602082840312156149b1575f80fd5b5051919050565b5f5b838110156149d25781810151838201526020016149ba565b50505f910152565b602081525f82518060208401526149f88160408501602087016149b8565b601f01601f19169190910160400192915050565b5f82614a2657634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614a3b575f80fd5b81356122708161491b565b5f808335601e19843603018112614a5b575f80fd5b8301803591506001600160401b03821115614a74575f80fd5b6020019150600581901b3603821315612049575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614ab3575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614af357614af3614abd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b2157614b21614abd565b604052919050565b5f6001600160401b03821115614b4157614b41614abd565b50601f01601f191660200190565b5f60608236031215614b5f575f80fd5b614b67614ad1565b823581526020614b78818501614793565b8183015260408401356001600160401b03811115614b94575f80fd5b840136601f820112614ba4575f80fd5b8035614bb7614bb282614b29565b614af9565b8181523684838501011115614bca575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551614bf7818460208a016149b8565b80830190508581526001600160401b0360c01b8560c01b1660208201528351614c278160288401602088016149b8565b016028019695505050505050565b5f8251614ab38184602087016149b8565b808201808211156109c7576109c761496d565b5f63ffffffff808316818103614c7157614c7161496d565b6001019392505050565b80820281158282048414176109c7576109c761496d565b6001600160401b0381811683821601908082111561270e5761270e61496d565b818103818111156109c7576109c761496d565b600181811c90821680614cd957607f821691505b602082108103614cf757634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614d0f81614cc5565b806020870152604060018084165f8114614d305760018114614d4c57614d79565b60ff19851660408a0152604084151560051b8a01019550614d79565b895f5260205f205f5b85811015614d705781548b8201860152908301908801614d55565b8a016040019650505b509398975050505050505050565b80516146ad8161468d565b5f8060408385031215614da3575f80fd5b82516001600160401b0380821115614db9575f80fd5b9084019060608287031215614dcc575f80fd5b614dd4614ad1565b82518152602080840151614de78161491b565b82820152604084015183811115614dfc575f80fd5b80850194505087601f850112614e10575f80fd5b83519250614e20614bb284614b29565b8381528882858701011115614e33575f80fd5b614e42848383018488016149b8565b80604084015250819550614e57818801614d87565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614f5a57614f5a61496d565b505092915050565b5f6001600160401b03808316818103614c7157614c7161496d565b5f808335601e19843603018112614f92575f80fd5b8301803591506001600160401b03821115614fab575f80fd5b602001915036819003821315612049575f80fd5b601f821115611b9457805f5260205f20601f840160051c81016020851015614fe45750805b601f840160051c820191505b81811015610a66575f8155600101614ff0565b81516001600160401b0381111561501c5761501c614abd565b6150308161502a8454614cc5565b84614fbf565b602080601f831160018114615063575f841561504c5750858301515b5f19600386901b1c1916600185901b1785556150ba565b5f85815260208120601f198616915b8281101561509157888601518255948401946001909101908401615072565b50858210156150ae57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156150d2575f80fd5b612270826148a5565b5f602082840312156150eb575f80fd5b813560ff81168114612270575f80fd5b5f6020828403121561510b575f80fd5b81516122708161468d56fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 dd5233204..1fb1aef5f 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -82,8 +82,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051615da2380380615da283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c558061014d5f395ff3fe6080604052600436106101af575f3560e01c806366435abf116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104f8578063c974d1b61461050b578063d5f20ff61461051f578063df93d8de1461054b575f80fd5b8063b771b3bc146104a0578063ba3a4b97146104ba578063bee0a03f146104d9575f80fd5b80638280a25a116100c25780638280a25a1461042f57806393e245981461044357806398f3e2b414610462578063a3a65e4814610481575f80fd5b806366435abf146103de578063732214f8146103fd57806376f7862114610410575f80fd5b806335455ded116101525780635297fae61161012d5780635297fae61461035857806360305d621461037757806361e2f490146103a057806362065856146103bf575f80fd5b806335455ded146102fe57806340034a9314610326578063467ef06f14610339575f80fd5b8063151d30d11161018d578063151d30d11461025057806320e55565146102765780632e2194d814610295578063329c3e12146102cc575f80fd5b80630118acc4146101b35780630322ed98146101d45780630cdd0985146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd36600461500a565b610561565b005b3480156101df575f80fd5b506101d26101ee366004615045565b610a05565b3480156101fe575f80fd5b5061023d61020d366004615045565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b34801561025b575f80fd5b50610264600a81565b60405160ff9091168152602001610247565b348015610281575f80fd5b506101d261029036600461505c565b610bbe565b3480156102a0575f80fd5b506102b46102af366004615045565b610c9b565b6040516001600160401b039091168152602001610247565b3480156102d7575f80fd5b506102e66001600160991b0181565b6040516001600160a01b039091168152602001610247565b348015610309575f80fd5b5061031361271081565b60405161ffff9091168152602001610247565b61023d61033436600461509a565b610cb1565b348015610344575f80fd5b506101d26103533660046150ee565b610ce5565b348015610363575f80fd5b506101d2610372366004615107565b610d85565b348015610382575f80fd5b5061038b601481565b60405163ffffffff9091168152602001610247565b3480156103ab575f80fd5b506101d26103ba36600461512f565b610f5a565b3480156103ca575f80fd5b5061023d6103d936600461517d565b61158e565b3480156103e9575f80fd5b506102b46103f8366004615045565b6115a7565b348015610408575f80fd5b5061023d5f81565b34801561041b575f80fd5b506101d261042a36600461500a565b6115bb565b34801561043a575f80fd5b50610264603081565b34801561044e575f80fd5b506101d261045d366004615045565b6117fe565b34801561046d575f80fd5b506101d261047c366004615107565b611904565b34801561048c575f80fd5b506101d261049b3660046150ee565b611c28565b3480156104ab575f80fd5b506102e66005600160991b0181565b3480156104c5575f80fd5b506101d26104d4366004615045565b611de0565b3480156104e4575f80fd5b506101d26104f3366004615045565b612066565b61023d610506366004615045565b61217a565b348015610516575f80fd5b50610264601481565b34801561052a575f80fd5b5061053e610539366004615045565b6121ab565b60405161024791906151aa565b348015610556575f80fd5b506102b46202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba983398151915293929190829060ff1660048111156105c2576105c2615196565b60048111156105d3576105d3615196565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f610657826121ab565b905060028351600481111561066e5761066e615196565b146106c05760405162461bcd60e51b815260206004820152602a60248201525f80516020615bc98339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146107255760405162461bcd60e51b815260206004820152603360248201525f80516020615bc98339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106b7565b6003835280515f90600290600581111561074157610741615196565b03610798578615610759576107568387612273565b90505b5f8460600151836080015161076e919061526d565b905061077a848261250f565b506001600160401b0390811660e0870152421660a0860152506107cc565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107ff866060015161158e565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561087c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a0919061528d565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108df576108df615196565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109f3916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615c298339815191526020526040808220815160e0810190925280545f80516020615be983398151915293929190829060ff166005811115610a5257610a52615196565b6005811115610a6357610a63615196565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610ad257610ad2615196565b14610b375760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106b7565b6005600160991b016001600160a01b031663ee5b48eb610b5c8584606001515f612666565b6040518263ffffffff1660e01b8152600401610b7891906152c6565b6020604051808303815f875af1158015610b94573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bb8919061528d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610c07575080546001600160401b03808416911610155b15610c255760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c4f8361288b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610cab64e8d4a51000836152f8565b92915050565b5f610cba61289f565b610cc6848484346128d6565b9050610cde60015f80516020615c0983398151915255565b9392505050565b5f80516020615ba98339815191525f80610cfe84612b53565b91509150610d0b82612e9d565b610d155750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d4357610d43615196565b03610d68575f83815260088501602052604081208054919055610d668282612ed8565b505b610d7e81610d79846040015161158e565b612f3e565b5050505050565b5f80516020615ba98339815191525f610d9d84612f51565b90505f80610dae8360400151613117565b50915091505f610dbd836121ab565b9050816001600160401b031681606001516001600160401b03161015610df55760405162461bcd60e51b81526004016106b790615317565b5f8681526006860160205260409020600201546001600160401b03808416600160c01b909204161115610e3a5760405162461bcd60e51b81526004016106b790615359565b60015f87815260068701602052604090205460ff166004811115610e6057610e60615196565b14610ec95760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106b7565b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615be98339815191529060ff1615610ff75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106b7565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561103a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105e919061528d565b8360200135146110c05760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106b7565b306110d160608501604086016153b6565b6001600160a01b0316146111435760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106b7565b5f61115160608501856153d1565b91505f905084356020860135601461116f6060890160408a016153b6565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561149e575f6111ef60608901896153d1565b8363ffffffff1681811061120557611205615416565b9050602002810190611217919061542a565b611220906154da565b80515f81815260088901602052604090205491925090156112535760405162461bcd60e51b81526004016106b790615571565b84825f01518360200151846040015160405160200161127594939291906155b9565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916112c39190615608565b602060405180830381855afa1580156112de573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611301919061528d565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff1916600183600581111561138d5761138d615196565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611440911686615619565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114979061562c565b90506111d3565b50600484018190555f6114b086612f51565b90505f6114c08260400151613352565b9050806002856040516114d39190615608565b602060405180830381855afa1580156114ee573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611511919061528d565b146115755760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106b7565b5050506009909201805460ff1916600117905550505050565b5f610cab6001600160401b03831664e8d4a5100061564e565b5f6115b1826121ab565b6080015192915050565b5f80516020615ba98339815191525f6115d3856134bb565b90506115de85612e9d565b6115e9575050505050565b5f8581526005830160205260409020546001600160a01b031633146116205760405162461bcd60e51b81526004016106b790615665565b5f85815260058301602052604090205460a082015161164f91600160b01b90046001600160401b0316906156b7565b6001600160401b03168160c001516001600160401b031610156116d05760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106b7565b8315610d7e575f6116e18685612273565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117389061158e565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156117ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d2919061528d565b5f878152600885016020526040812080549091906117f1908490615619565b9091555050505050505050565b5f80516020615ba98339815191525f611816836121ab565b905060048151600581111561182d5761182d615196565b146118975760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106b7565b5f8381526005830160205260409020546001600160a01b031633146118ce5760405162461bcd60e51b81526004016106b790615665565b5f83815260088301602090815260408083208054908490556005860190925290912054610bb8906001600160a01b031682612ed8565b61190c61289f565b5f80516020615ba98339815191525f61192484612f51565b90505f806119358360400151613117565b50915091505f611944836121ab565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561197e5761197e615196565b600481111561198f5761198f615196565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff191690559084015191925084811691161015611a735760405162461bcd60e51b81526004016106b790615317565b826001600160401b03168160e001516001600160401b03161115611aa95760405162461bcd60e51b81526004016106b790615359565b600381516004811115611abe57611abe615196565b14611b125760405162461bcd60e51b815260206004820152603160248201525f80516020615bc98339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106b7565b5f878152600787016020908152604080832080549084905587845260058a0190925282205490919061271090611b5390600160a01b900461ffff168461564e565b611b5d91906152f8565b905080886008015f8881526020019081526020015f205f828254611b819190615619565b909155505f9050611b9282846156d7565b9050611ba2846020015182612ed8565b611bb78460200151610d79866060015161158e565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611bfd929190918252602082015260400190565b60405180910390a4505050505050505050611c2460015f80516020615c0983398151915255565b5050565b5f80516020615be98339815191525f611c4083612f51565b90505f80611c518360400151613736565b9150915080611cb35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106b7565b5f82815260068501602052604081208054611ccd906156ea565b9050118015611cff575060015f83815260078601602052604090205460ff166005811115611cfd57611cfd615196565b145b611d1b5760405162461bcd60e51b81526004016106b79061571c565b5f8281526006850160205260408120611d3391614f5f565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020615ba983398151915293929190829060ff166004811115611e4157611e41615196565b6004811115611e5257611e52615196565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ed957611ed9615196565b1480611ef75750600381516004811115611ef557611ef5615196565b145b611f4b5760405162461bcd60e51b815260206004820152603260248201525f80516020615bc9833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106b7565b5f611f5982604001516121ab565b905080606001516001600160401b03165f03611fdd5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106b7565b6005600160991b016001600160a01b031663ee5b48eb61200a846040015184606001518560800151612666565b6040518263ffffffff1660e01b815260040161202691906152c6565b6020604051808303815f875af1158015612042573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d7e919061528d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f80516020615be98339815191529291906120ae906156ea565b90501180156120e0575060015f83815260078301602052604090205460ff1660058111156120de576120de615196565b145b6120fc5760405162461bcd60e51b81526004016106b79061571c565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916121359190600401615763565b6020604051808303815f875af1158015612151573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612175919061528d565b505050565b5f61218361289f565b61218e8233346138d7565b90506121a660015f80516020615c0983398151915255565b919050565b6121b3614f96565b5f8281525f80516020615c29833981519152602052604090819020815160e0810190925280545f80516020615be9833981519152929190829060ff16600581111561220057612200615196565b600581111561221157612211615196565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156122be573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122e591908101906157f8565b91509150806123485760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106b7565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561238b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123af919061528d565b8251146124135760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106b7565b60208201516001600160a01b0316156124895760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106b7565b5f806124988460400151613c8e565b915091508187146125055760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106b7565b9695505050505050565b5f8281525f80516020615c29833981519152602052604081206002015481905f80516020615be983398151915290600160801b90046001600160401b03166125578582613e66565b5f61256187614074565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6125b18a858b612666565b6040518263ffffffff1660e01b81526004016125cd91906152c6565b6020604051808303815f875af11580156125e9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061260d919061528d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156126df5761269f8160016156d7565b6126aa90600861564e565b5081515f908390839081106126c1576126c1615416565b60200101906001600160f81b03191690815f1a90535060010161268b565b505f5b600481101561274a576126f68160036156d7565b61270190600861564e565b600263ffffffff16901c60f81b8282600261271c9190615619565b8151811061272c5761272c615416565b60200101906001600160f81b03191690815f1a9053506001016126e2565b505f5b60208110156127ac5761276181601f6156d7565b61276c90600861564e565b86901c60f81b8261277e836006615619565b8151811061278e5761278e615416565b60200101906001600160f81b03191690815f1a90535060010161274d565b505f5b6008811015612817576127c38160076156d7565b6127ce90600861564e565b6001600160401b038616901c60f81b826127e9836026615619565b815181106127f9576127f9615416565b60200101906001600160f81b03191690815f1a9053506001016127af565b505f5b60088110156128825761282e8160076156d7565b61283990600861564e565b6001600160401b038516901c60f81b8261285483602e615619565b8151811061286457612864615416565b60200101906001600160f81b03191690815f1a90535060010161281a565b50949350505050565b612893614104565b61289c8161414f565b50565b5f80516020615c098339815191528054600119016128d057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ba98339815191529061ffff861610801590612922575061271061ffff861611155b61293e5760405162461bcd60e51b81526004016106b7906158ca565b60028101546001600160401b0390811690851610156129b75760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106b7565b8054831015612a1a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106b7565b8060010154831115612a815760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106b7565b825f612a8c82610c9b565b90505f612a9989836141c1565b90506040518060600160405280612aad3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615c0983398151915255565b5f612b5c614f96565b5f80516020615be98339815191525f612b7485612f51565b90505f80612b858360400151613736565b915091508015612bea5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106b7565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612c1b57612c1b615196565b6005811115612c2c57612c2c615196565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115612c9d57612c9d615196565b1480612cbb5750600182516005811115612cb957612cb9615196565b145b612d1a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106b7565b600382516005811115612d2f57612d2f615196565b03612d3c57506004612d40565b5060055b6020808301515f90815260088801909152604081205581816005811115612d6957612d69615196565b90816005811115612d7c57612d7c615196565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115612db057612db0615196565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612e6457612e64615196565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612f24575f80fd5b505af1158015612f36573d5f803e3d5ffd5b505050505050565b611c246001600160a01b03831682614725565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612fb5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612fdc91908101906157f8565b915091508061303c5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106b7565b81511561309d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106b7565b60208201516001600160a01b0316156131105760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106b7565b5092915050565b5f805f835160361461313b5760405162461bcd60e51b81526004016106b790615915565b5f805b600281101561318a576131528160016156d7565b61315d90600861564e565b61ffff1686828151811061317357613173615416565b016020015160f81c901b919091179060010161313e565b5061ffff8116156131ad5760405162461bcd60e51b81526004016106b79061595e565b5f805b6004811015613208576131c48160036156d7565b6131cf90600861564e565b63ffffffff16876131e1836002615619565b815181106131f1576131f1615416565b016020015160f81c901b91909117906001016131b0565b5063ffffffff811660041461322f5760405162461bcd60e51b81526004016106b7906159a1565b5f805b60208110156132845761324681601f6156d7565b61325190600861564e565b8861325d836006615619565b8151811061326d5761326d615416565b016020015160f81c901b9190911790600101613232565b505f805b60088110156132e35761329c8160076156d7565b6132a790600861564e565b6001600160401b0316896132bc836026615619565b815181106132cc576132cc615416565b016020015160f81c901b9190911790600101613288565b505f805b6008811015613342576132fb8160076156d7565b61330690600861564e565b6001600160401b03168a61331b83602e615619565b8151811061332b5761332b615416565b016020015160f81c901b91909117906001016132e7565b5091989097509095509350505050565b5f81516026146133745760405162461bcd60e51b81526004016106b790615915565b5f805b60028110156133c35761338b8160016156d7565b61339690600861564e565b61ffff168482815181106133ac576133ac615416565b016020015160f81c901b9190911790600101613377565b5061ffff8116156133e65760405162461bcd60e51b81526004016106b79061595e565b5f805b6004811015613441576133fd8160036156d7565b61340890600861564e565b63ffffffff168561341a836002615619565b8151811061342a5761342a615416565b016020015160f81c901b91909117906001016133e9565b5063ffffffff8116156134665760405162461bcd60e51b81526004016106b7906159a1565b5f805b60208110156128825761347d81601f6156d7565b61348890600861564e565b86613494836006615619565b815181106134a4576134a4615416565b016020015160f81c901b9190911790600101613469565b6134c3614f96565b5f8281525f80516020615c298339815191526020526040808220815160e0810190925280545f80516020615be983398151915293929190829060ff16600581111561351057613510615196565b600581111561352157613521615196565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561359357613593615196565b146135ef5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106b7565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561363357613633615196565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136df858261250f565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146137595760405162461bcd60e51b81526004016106b790615915565b5f805b60028110156137a8576137708160016156d7565b61377b90600861564e565b61ffff1685828151811061379157613791615416565b016020015160f81c901b919091179060010161375c565b5061ffff8116156137cb5760405162461bcd60e51b81526004016106b79061595e565b5f805b6004811015613826576137e28160036156d7565b6137ed90600861564e565b63ffffffff16866137ff836002615619565b8151811061380f5761380f615416565b016020015160f81c901b91909117906001016137ce565b5063ffffffff811660031461384d5760405162461bcd60e51b81526004016106b7906159a1565b5f805b60208110156138a25761386481601f6156d7565b61386f90600861564e565b8761387b836006615619565b8151811061388b5761388b615416565b016020015160f81c901b9190911790600101613850565b505f866026815181106138b7576138b7615416565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ba9833981519152816138f084610c9b565b90505f6138fc876121ab565b905061390787612e9d565b6139645760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106b7565b60028151600581111561397957613979615196565b146139d85760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106b7565b5f8282608001516139e991906156b7565b60048501546040840151919250613a0b916001600160401b03909116906159e8565b6001600160401b0316816001600160401b03161115613a8a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106b7565b5f80613a968a8461250f565b915091505f8a83604051602001613ac492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b5f57613b5f615196565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613cb15760405162461bcd60e51b81526004016106b790615915565b5f805b6002811015613d0057613cc88160016156d7565b613cd390600861564e565b61ffff16858281518110613ce957613ce9615416565b016020015160f81c901b9190911790600101613cb4565b5061ffff811615613d235760405162461bcd60e51b81526004016106b79061595e565b5f805b6004811015613d7e57613d3a8160036156d7565b613d4590600861564e565b63ffffffff1686613d57836002615619565b81518110613d6757613d67615416565b016020015160f81c901b9190911790600101613d26565b5063ffffffff8116600514613da55760405162461bcd60e51b81526004016106b7906159a1565b5f805b6020811015613dfa57613dbc81601f6156d7565b613dc790600861564e565b87613dd3836006615619565b81518110613de357613de3615416565b016020015160f81c901b9190911790600101613da8565b505f805b6008811015613e5957613e128160076156d7565b613e1d90600861564e565b6001600160401b031688613e32836026615619565b81518110613e4257613e42615416565b016020015160f81c901b9190911790600101613dfe565b5090969095509350505050565b5f80516020615be98339815191525f6001600160401b038084169085161115613e9a57613e93838561526d565b9050613ea7565b613ea4848461526d565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613f09575060018401548151613f05916001600160401b031690615619565b8210155b15613f2f576001600160401b038316606082015281815260408101516020820152613f4e565b8281606001818151613f4191906156b7565b6001600160401b03169052505b6060810151613f5e9060646159e8565b602082015160018601546001600160401b039290921691613f899190600160401b900460ff1661564e565b1015613fed5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106b7565b856001600160401b0316816040018181516140089190615619565b9052506040810180516001600160401b03871691906140289083906156d7565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c298339815191526020526040812060020180545f80516020615be983398151915291600160401b9091046001600160401b03169060086140be83615a13565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661414d57604051631afcd79f60e31b815260040160405180910390fd5b565b614157614104565b614160816147b8565b6141686147d1565b61289c6060820135608083013561418560c0850160a0860161517d565b61419560e0860160c08701615a2e565b61ffff166141aa610100870160e08801615a47565b6141bc610120880161010089016153b6565b6147e1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661424c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106b7565b5f80516020615be98339815191524261426b604086016020870161517d565b6001600160401b0316116142dd5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106b7565b6142ed604085016020860161517d565b6001600160401b03166143036202a30042615619565b116143765760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106b7565b83356143ce5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106b7565b83355f908152600882016020526040902054156143fd5760405162461bcd60e51b81526004016106b790615571565b603061440c6040860186615a67565b9050146144715760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106b7565b61447b835f613e66565b5f806145146040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906144bf919061517d565b6001600160401b031681526020016144da60408a018a615a67565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614a25565b5f828152600686016020526040902091935091506145328282615aed565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061455f9085906004016152c6565b6020604051808303815f875af115801561457b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061459f919061528d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561461757614617615196565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146f7918e01908e0161517d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147485760405163cd78605960e01b81523060048201526024016106b7565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614791576040519150601f19603f3d011682016040523d82523d5f602084013e614796565b606091505b505090508061217557604051630a12f52160e11b815260040160405180910390fd5b6147c0614104565b6147c8614dd4565b61289c81614ddc565b6147d9614104565b61414d614f57565b6147e9614104565b5f80516020615ba9833981519152836148555760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106b7565b6127108411156148775760405162461bcd60e51b81526004016106b7906158ca565b858711156148df5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106b7565b5f8360ff161161494c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106b7565b600a60ff841611156149be5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106b7565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014614a8f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106b7565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015614b0657614ac68160016156d7565b614ad190600861564e565b5081515f90839083908110614ae857614ae8615416565b60200101906001600160f81b03191690815f1a905350600101614ab2565b505f5b6004811015614b6e57614b1d8160036156d7565b614b2890600861564e565b600160ff919091161c60f81b82614b40836002615619565b81518110614b5057614b50615416565b60200101906001600160f81b03191690815f1a905350600101614b09565b505f5b6020811015614bcb5784518160208110614b8d57614b8d615416565b1a60f81b82614b9d836006615619565b81518110614bad57614bad615416565b60200101906001600160f81b03191690815f1a905350600101614b71565b505f5b6020811015614c2b5784602001518160208110614bed57614bed615416565b1a60f81b82614bfd836026615619565b81518110614c0d57614c0d615416565b60200101906001600160f81b03191690815f1a905350600101614bce565b505f5b6008811015614c9f57614c428160076156d7565b614c4d90600861564e565b60ff1685604001516001600160401b0316901c60f81b82826046614c719190615619565b81518110614c8157614c81615416565b60200101906001600160f81b03191690815f1a905350600101614c2e565b505f5b6030811015614d0a5784608001518181518110614cc157614cc1615416565b01602001516001600160f81b03191682614cdc83604e615619565b81518110614cec57614cec615416565b60200101906001600160f81b03191690815f1a905350600101614ca2565b505f5b6008811015614d7c57614d218160076156d7565b614d2c90600861564e565b60608601516001600160401b0390811691161c60f81b82614d4e83607e615619565b81518110614d5e57614d5e615416565b60200101906001600160f81b03191690815f1a905350600101614d0d565b50600281604051614d8d9190615608565b602060405180830381855afa158015614da8573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614dcb919061528d565b94909350915050565b61414d614104565b614de4614104565b80355f80516020615be98339815191529081556014614e096060840160408501615a47565b60ff161115614e765760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106b7565b5f614e876060840160408501615a47565b60ff1611614eef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106b7565b614eff6060830160408401615a47565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614f30604083016020840161517d565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b40614104565b508054614f6b906156ea565b5f825580601f10614f7a575050565b601f0160209004905f5260205f209081019061289c9190614fd2565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614fe6575f8155600101614fd3565b5090565b801515811461289c575f80fd5b803563ffffffff811681146121a6575f80fd5b5f805f6060848603121561501c575f80fd5b83359250602084013561502e81614fea565b915061503c60408501614ff7565b90509250925092565b5f60208284031215615055575f80fd5b5035919050565b5f610120828403121561506d575f80fd5b50919050565b803561ffff811681146121a6575f80fd5b80356001600160401b03811681146121a6575f80fd5b5f805f606084860312156150ac575f80fd5b83356001600160401b038111156150c1575f80fd5b8401606081870312156150d2575f80fd5b92506150e060208501615073565b915061503c60408501615084565b5f602082840312156150fe575f80fd5b610cde82614ff7565b5f8060408385031215615118575f80fd5b61512183614ff7565b946020939093013593505050565b5f8060408385031215615140575f80fd5b82356001600160401b03811115615155575f80fd5b830160808186031215615166575f80fd5b915061517460208401614ff7565b90509250929050565b5f6020828403121561518d575f80fd5b610cde82615084565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106151cd57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161520860608401826001600160401b03169052565b50608083015161522360808401826001600160401b03169052565b5060a083015161523e60a08401826001600160401b03169052565b5060c083015161311060c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561311057613110615259565b5f6020828403121561529d575f80fd5b5051919050565b5f5b838110156152be5781810151838201526020016152a6565b50505f910152565b602081525f82518060208401526152e48160408501602087016152a4565b601f01601f19169190910160400192915050565b5f8261531257634e487b7160e01b5f52601260045260245ffd5b500490565b60208082526022908201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604082015261636560f01b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461289c575f80fd5b5f602082840312156153c6575f80fd5b8135610cde816153a2565b5f808335601e198436030181126153e6575f80fd5b8301803591506001600160401b038211156153ff575f80fd5b6020019150600581901b360382131561265f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261543e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561547e5761547e615448565b60405290565b604051601f8201601f191681016001600160401b03811182821017156154ac576154ac615448565b604052919050565b5f6001600160401b038211156154cc576154cc615448565b50601f01601f191660200190565b5f606082360312156154ea575f80fd5b6154f261545c565b823581526020615503818501615084565b8183015260408401356001600160401b0381111561551f575f80fd5b840136601f82011261552f575f80fd5b803561554261553d826154b4565b615484565b8181523684838501011115615555575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f85516155ca818460208a016152a4565b80830190508581526001600160401b0360c01b8560c01b16602082015283516155fa8160288401602088016152a4565b016028019695505050505050565b5f825161543e8184602087016152a4565b80820180821115610cab57610cab615259565b5f63ffffffff80831681810361564457615644615259565b6001019392505050565b8082028115828204841417610cab57610cab615259565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561311057613110615259565b81810381811115610cab57610cab615259565b600181811c908216806156fe57607f821691505b60208210810361506d57634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454615775816156ea565b806020870152604060018084165f811461579657600181146157b2576157df565b60ff19851660408a0152604084151560051b8a010195506157df565b895f5260205f205f5b858110156157d65781548b82018601529083019088016157bb565b8a016040019650505b509398975050505050505050565b80516121a681614fea565b5f8060408385031215615809575f80fd5b82516001600160401b038082111561581f575f80fd5b9084019060608287031215615832575f80fd5b61583a61545c565b8251815260208084015161584d816153a2565b82820152604084015183811115615862575f80fd5b80850194505087601f850112615876575f80fd5b8351925061588661553d846154b4565b8381528882858701011115615899575f80fd5b6158a8848383018488016152a4565b806040840152508195506158bd8188016157ed565b9450505050509250929050565b6020808252602b908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60408201526a65676174696f6e2066656560a81b606082015260800190565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114615a0b57615a0b615259565b505092915050565b5f6001600160401b0380831681810361564457615644615259565b5f60208284031215615a3e575f80fd5b610cde82615073565b5f60208284031215615a57575f80fd5b813560ff81168114610cde575f80fd5b5f808335601e19843603018112615a7c575f80fd5b8301803591506001600160401b03821115615a95575f80fd5b60200191503681900382131561265f575f80fd5b601f82111561217557805f5260205f20601f840160051c81016020851015615ace5750805b601f840160051c820191505b81811015610d7e575f8155600101615ada565b81516001600160401b03811115615b0657615b06615448565b615b1a81615b1484546156ea565b84615aa9565b602080601f831160018114615b4d575f8415615b365750858301515b5f19600386901b1c1916600185901b178555612f36565b5f85815260208120601f198616915b82811015615b7b57888601518255948401946001909101908401615b5c565b5085821015615b9857878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161501e38038061501e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614ed18061014d5f395ff3fe6080604052600436106101af575f3560e01c806366435abf116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104f8578063c974d1b61461050b578063d5f20ff61461051f578063df93d8de1461054b575f80fd5b8063b771b3bc146104a0578063ba3a4b97146104ba578063bee0a03f146104d9575f80fd5b80638280a25a116100c25780638280a25a1461042f57806393e245981461044357806398f3e2b414610462578063a3a65e4814610481575f80fd5b806366435abf146103de578063732214f8146103fd57806376f7862114610410575f80fd5b806335455ded116101525780635297fae61161012d5780635297fae61461035857806360305d621461037757806361e2f490146103a057806362065856146103bf575f80fd5b806335455ded146102fe57806340034a9314610326578063467ef06f14610339575f80fd5b8063151d30d11161018d578063151d30d11461025057806320e55565146102765780632e2194d814610295578063329c3e12146102cc575f80fd5b80630118acc4146101b35780630322ed98146101d45780630cdd0985146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd36600461445d565b610561565b005b3480156101df575f80fd5b506101d26101ee366004614498565b610999565b3480156101fe575f80fd5b5061023d61020d366004614498565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b34801561025b575f80fd5b50610264600a81565b60405160ff9091168152602001610247565b348015610281575f80fd5b506101d26102903660046144af565b610b0b565b3480156102a0575f80fd5b506102b46102af366004614498565b610be8565b6040516001600160401b039091168152602001610247565b3480156102d7575f80fd5b506102e66001600160991b0181565b6040516001600160a01b039091168152602001610247565b348015610309575f80fd5b5061031361271081565b60405161ffff9091168152602001610247565b61023d6103343660046144ed565b610bfe565b348015610344575f80fd5b506101d2610353366004614541565b610c32565b348015610363575f80fd5b506101d261037236600461455a565b610cd2565b348015610382575f80fd5b5061038b601481565b60405163ffffffff9091168152602001610247565b3480156103ab575f80fd5b506101d26103ba366004614582565b610e47565b3480156103ca575f80fd5b5061023d6103d93660046145d0565b611361565b3480156103e9575f80fd5b506102b46103f8366004614498565b61137a565b348015610408575f80fd5b5061023d5f81565b34801561041b575f80fd5b506101d261042a36600461445d565b61138e565b34801561043a575f80fd5b50610264603081565b34801561044e575f80fd5b506101d261045d366004614498565b611587565b34801561046d575f80fd5b506101d261047c36600461455a565b611642565b34801561048c575f80fd5b506101d261049b366004614541565b61191b565b3480156104ab575f80fd5b506102e66005600160991b0181565b3480156104c5575f80fd5b506101d26104d4366004614498565b611aaa565b3480156104e4575f80fd5b506101d26104f3366004614498565b611ca8565b61023d610506366004614498565b611dd2565b348015610516575f80fd5b50610264601481565b34801561052a575f80fd5b5061053e610539366004614498565b611e03565b60405161024791906145fd565b348015610556575f80fd5b506102b46202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614e4583398151915293929190829060ff1660048111156105c2576105c26145e9565b60048111156105d3576105d36145e9565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61065782611e03565b905060028351600481111561066e5761066e6145e9565b1461068c5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106b95760405163e6c4247b60e01b815260040160405180910390fd5b6003835280515f9060029060058111156106d5576106d56145e9565b0361072c5786156106ed576106ea8387611ecb565b90505b5f8460600151836080015161070291906146c0565b905061070e848261204f565b506001600160401b0390811660e0870152421660a086015250610760565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107938660600151611361565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610810573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083491906146e0565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff19166001836004811115610873576108736145e9565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610987916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614ea58339815191526020526040808220815160e0810190925280545f80516020614e6583398151915293929190829060ff1660058111156109e6576109e66145e9565b60058111156109f7576109f76145e9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a6657610a666145e9565b14610a845760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610aa98584606001515f6121a6565b6040518263ffffffff1660e01b8152600401610ac59190614719565b6020604051808303815f875af1158015610ae1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b0591906146e0565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b54575080546001600160401b03808416911610155b15610b725760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b9c836123cb565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610bf864e8d4a510008361474b565b92915050565b5f610c076123df565b610c1384848434612416565b9050610c2b60015f80516020614e8583398151915255565b9392505050565b5f80516020614e458339815191525f80610c4b846125b1565b91509150610c588261287b565b610c625750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610c9057610c906145e9565b03610cb5575f83815260088501602052604081208054919055610cb382826128b6565b505b610ccb81610cc68460400151611361565b61291c565b5050505050565b5f80516020614e458339815191525f610cea8461292f565b90505f80610cfb8360400151612a2f565b50915091505f610d0a83611e03565b9050816001600160401b031681606001516001600160401b03161080610d5457505f8681526006860160205260409020600201546001600160401b03808416600160c01b90920416115b15610d7257604051633ab3447f60e11b815260040160405180910390fd5b60015f87815260068701602052604090205460ff166004811115610d9857610d986145e9565b14610db65760405163f95c7fe160e01b815260040160405180910390fd5b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614e658339815191529060ff1615610e9957604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610edc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f0091906146e0565b836020013514610f235760405163d040949d60e01b815260040160405180910390fd5b30610f34606085016040860161477e565b6001600160a01b031614610f5b5760405163e6c4247b60e01b815260040160405180910390fd5b5f610f696060850185614799565b91505f9050843560208601356014610f876060890160408a0161477e565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff1610156112b7575f6110076060890189614799565b8363ffffffff1681811061101d5761101d6147de565b905060200281019061102f91906147f2565b611038906148a2565b80515f818152600889016020526040902054919250901561106c57604051630eb0d31360e11b815260040160405180910390fd5b84825f01518360200151846040015160405160200161108e9493929190614939565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916110dc9190614988565b602060405180830381855afa1580156110f7573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061111a91906146e0565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff191660018360058111156111a6576111a66145e9565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611259911686614999565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112b0906149ac565b9050610feb565b50600484018190555f6112c98661292f565b90505f6112d98260400151612c73565b9050806002856040516112ec9190614988565b602060405180830381855afa158015611307573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061132a91906146e0565b1461134857604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610bf86001600160401b03831664e8d4a510006149ce565b5f61138482611e03565b6080015192915050565b5f80516020614e458339815191525f6113a685612ddc565b90506113b18561287b565b6113bc575050505050565b5f8581526005830160205260409020546001600160a01b031633146113f45760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260058301602052604090205460a082015161142391600160b01b90046001600160401b0316906149e5565b6001600160401b03168160c001516001600160401b03161015611459576040516302336bad60e51b815260040160405180910390fd5b8315610ccb575f61146a8685611ecb565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906114c190611361565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611537573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061155b91906146e0565b5f8781526008850160205260408120805490919061157a908490614999565b9091555050505050505050565b5f80516020614e458339815191525f61159f83611e03565b90506004815160058111156115b6576115b66145e9565b146115d45760405163a36c527f60e01b815260040160405180910390fd5b5f8381526005830160205260409020546001600160a01b0316331461160c5760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260088301602090815260408083208054908490556005860190925290912054610b05906001600160a01b0316826128b6565b61164a6123df565b5f80516020614e458339815191525f6116628461292f565b90505f806116738360400151612a2f565b50915091505f61168283611e03565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156116bc576116bc6145e9565b60048111156116cd576116cd6145e9565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610806117b45750826001600160401b03168160e001516001600160401b0316115b156117d257604051633ab3447f60e11b815260040160405180910390fd5b6003815160048111156117e7576117e76145e9565b146118055760405163f95c7fe160e01b815260040160405180910390fd5b5f878152600787016020908152604080832080549084905587845260058a019092528220549091906127109061184690600160a01b900461ffff16846149ce565b611850919061474b565b905080886008015f8881526020019081526020015f205f8282546118749190614999565b909155505f90506118858284614a05565b90506118958460200151826128b6565b6118aa8460200151610cc68660600151611361565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d503384866040516118f0929190918252602082015260400190565b60405180910390a450505050505050505061191760015f80516020614e8583398151915255565b5050565b5f80516020614e658339815191525f6119338361292f565b90505f806119448360400151613019565b915091508061196657604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461198090614a18565b90505f036119a157604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156119c7576119c76145e9565b146119e55760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206119fd916143b2565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614e4583398151915293929190829060ff166004811115611b0b57611b0b6145e9565b6004811115611b1c57611b1c6145e9565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611ba357611ba36145e9565b14158015611bc45750600381516004811115611bc157611bc16145e9565b14155b15611be25760405163f95c7fe160e01b815260040160405180910390fd5b5f611bf08260400151611e03565b905080606001516001600160401b03165f03611c1f57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611c4c8460400151846060015185608001516121a6565b6040518263ffffffff1660e01b8152600401611c689190614719565b6020604051808303815f875af1158015611c84573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ccb91906146e0565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614e658339815191529190611cef90614a18565b90505f03611d1057604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611d3657611d366145e9565b14611d545760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d8d9190600401614a4a565b6020604051808303815f875af1158015611da9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dcd91906146e0565b505050565b5f611ddb6123df565b611de68233346131ba565b9050611dfe60015f80516020614e8583398151915255565b919050565b611e0b6143e9565b5f8281525f80516020614ea5833981519152602052604090819020815160e0810190925280545f80516020614e65833981519152929190829060ff166005811115611e5857611e586145e9565b6005811115611e6957611e696145e9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611f16573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f3d9190810190614adf565b9150915080611f5f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611fa2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc691906146e0565b825114611fe65760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156120125760405163e6c4247b60e01b815260040160405180910390fd5b5f8061202184604001516134a3565b9150915081871461204557604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614ea5833981519152602052604081206002015481905f80516020614e6583398151915290600160801b90046001600160401b0316612097858261367b565b5f6120a187613844565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6120f18a858b6121a6565b6040518263ffffffff1660e01b815260040161210d9190614719565b6020604051808303815f875af1158015612129573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214d91906146e0565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b600281101561221f576121df816001614a05565b6121ea9060086149ce565b5081515f90839083908110612201576122016147de565b60200101906001600160f81b03191690815f1a9053506001016121cb565b505f5b600481101561228a57612236816003614a05565b6122419060086149ce565b600263ffffffff16901c60f81b8282600261225c9190614999565b8151811061226c5761226c6147de565b60200101906001600160f81b03191690815f1a905350600101612222565b505f5b60208110156122ec576122a181601f614a05565b6122ac9060086149ce565b86901c60f81b826122be836006614999565b815181106122ce576122ce6147de565b60200101906001600160f81b03191690815f1a90535060010161228d565b505f5b600881101561235757612303816007614a05565b61230e9060086149ce565b6001600160401b038616901c60f81b82612329836026614999565b81518110612339576123396147de565b60200101906001600160f81b03191690815f1a9053506001016122ef565b505f5b60088110156123c25761236e816007614a05565b6123799060086149ce565b6001600160401b038516901c60f81b8261239483602e614999565b815181106123a4576123a46147de565b60200101906001600160f81b03191690815f1a90535060010161235a565b50949350505050565b6123d36138d4565b6123dc8161391f565b50565b5f80516020614e8583398151915280546001190161241057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020614e458339815191529061ffff8616108061245f575061271061ffff8616115b1561247d5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156124af576040516302336bad60e51b815260040160405180910390fd5b80548310806124c15750806001015483115b156124df57604051630103be3b60e21b815260040160405180910390fd5b825f6124ea82610be8565b90505f6124f78983613991565b9050604051806060016040528061250b3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e8583398151915255565b5f6125ba6143e9565b5f80516020614e658339815191525f6125d28561292f565b90505f806125e38360400151613019565b91509150801561260657604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612637576126376145e9565b6005811115612648576126486145e9565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156126b9576126b96145e9565b141580156126da57506001825160058111156126d7576126d76145e9565b14155b156126f85760405163a36c527f60e01b815260040160405180910390fd5b60038251600581111561270d5761270d6145e9565b0361271a5750600461271e565b5060055b6020808301515f90815260088801909152604081205581816005811115612747576127476145e9565b9081600581111561275a5761275a6145e9565b9052505f84815260078701602052604090208251815484929190829060ff1916600183600581111561278e5761278e6145e9565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115612842576128426145e9565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612902575f80fd5b505af1158015612914573d5f803e3d5ffd5b505050505050565b6119176001600160a01b03831682613d6a565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612993573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129ba9190810190614adf565b91509150806129dc57604051636b2f19e960e01b815260040160405180910390fd5b8151156129fc5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612a285760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612a5c5760405162461bcd60e51b8152600401612a5390614bb1565b60405180910390fd5b5f805b6002811015612aab57612a73816001614a05565b612a7e9060086149ce565b61ffff16868281518110612a9457612a946147de565b016020015160f81c901b9190911790600101612a5f565b5061ffff811615612ace5760405162461bcd60e51b8152600401612a5390614bfa565b5f805b6004811015612b2957612ae5816003614a05565b612af09060086149ce565b63ffffffff1687612b02836002614999565b81518110612b1257612b126147de565b016020015160f81c901b9190911790600101612ad1565b5063ffffffff8116600414612b505760405162461bcd60e51b8152600401612a5390614c3d565b5f805b6020811015612ba557612b6781601f614a05565b612b729060086149ce565b88612b7e836006614999565b81518110612b8e57612b8e6147de565b016020015160f81c901b9190911790600101612b53565b505f805b6008811015612c0457612bbd816007614a05565b612bc89060086149ce565b6001600160401b031689612bdd836026614999565b81518110612bed57612bed6147de565b016020015160f81c901b9190911790600101612ba9565b505f805b6008811015612c6357612c1c816007614a05565b612c279060086149ce565b6001600160401b03168a612c3c83602e614999565b81518110612c4c57612c4c6147de565b016020015160f81c901b9190911790600101612c08565b5091989097509095509350505050565b5f8151602614612c955760405162461bcd60e51b8152600401612a5390614bb1565b5f805b6002811015612ce457612cac816001614a05565b612cb79060086149ce565b61ffff16848281518110612ccd57612ccd6147de565b016020015160f81c901b9190911790600101612c98565b5061ffff811615612d075760405162461bcd60e51b8152600401612a5390614bfa565b5f805b6004811015612d6257612d1e816003614a05565b612d299060086149ce565b63ffffffff1685612d3b836002614999565b81518110612d4b57612d4b6147de565b016020015160f81c901b9190911790600101612d0a565b5063ffffffff811615612d875760405162461bcd60e51b8152600401612a5390614c3d565b5f805b60208110156123c257612d9e81601f614a05565b612da99060086149ce565b86612db5836006614999565b81518110612dc557612dc56147de565b016020015160f81c901b9190911790600101612d8a565b612de46143e9565b5f8281525f80516020614ea58339815191526020526040808220815160e0810190925280545f80516020614e6583398151915293929190829060ff166005811115612e3157612e316145e9565b6005811115612e4257612e426145e9565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612eb457612eb46145e9565b14612ed25760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612f1657612f166145e9565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612fc2858261204f565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461303c5760405162461bcd60e51b8152600401612a5390614bb1565b5f805b600281101561308b57613053816001614a05565b61305e9060086149ce565b61ffff16858281518110613074576130746147de565b016020015160f81c901b919091179060010161303f565b5061ffff8116156130ae5760405162461bcd60e51b8152600401612a5390614bfa565b5f805b6004811015613109576130c5816003614a05565b6130d09060086149ce565b63ffffffff16866130e2836002614999565b815181106130f2576130f26147de565b016020015160f81c901b91909117906001016130b1565b5063ffffffff81166003146131305760405162461bcd60e51b8152600401612a5390614c3d565b5f805b60208110156131855761314781601f614a05565b6131529060086149ce565b8761315e836006614999565b8151811061316e5761316e6147de565b016020015160f81c901b9190911790600101613133565b505f8660268151811061319a5761319a6147de565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614e45833981519152816131d384610be8565b90505f6131df87611e03565b90506131ea8761287b565b61320757604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561321c5761321c6145e9565b1461323a5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161324b91906149e5565b6004850154604084015191925061326d916001600160401b0390911690614c84565b6001600160401b0316816001600160401b0316111561329f57604051630c192e7760e41b815260040160405180910390fd5b5f806132ab8a8461204f565b915091505f8a836040516020016132d992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613374576133746145e9565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146134c65760405162461bcd60e51b8152600401612a5390614bb1565b5f805b6002811015613515576134dd816001614a05565b6134e89060086149ce565b61ffff168582815181106134fe576134fe6147de565b016020015160f81c901b91909117906001016134c9565b5061ffff8116156135385760405162461bcd60e51b8152600401612a5390614bfa565b5f805b60048110156135935761354f816003614a05565b61355a9060086149ce565b63ffffffff168661356c836002614999565b8151811061357c5761357c6147de565b016020015160f81c901b919091179060010161353b565b5063ffffffff81166005146135ba5760405162461bcd60e51b8152600401612a5390614c3d565b5f805b602081101561360f576135d181601f614a05565b6135dc9060086149ce565b876135e8836006614999565b815181106135f8576135f86147de565b016020015160f81c901b91909117906001016135bd565b505f805b600881101561366e57613627816007614a05565b6136329060086149ce565b6001600160401b031688613647836026614999565b81518110613657576136576147de565b016020015160f81c901b9190911790600101613613565b5090969095509350505050565b5f80516020614e658339815191525f6001600160401b0380841690851611156136af576136a883856146c0565b90506136bc565b6136b984846146c0565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061371e57506001840154815161371a916001600160401b031690614999565b8210155b15613744576001600160401b038316606082015281815260408101516020820152613763565b828160600181815161375691906149e5565b6001600160401b03169052505b6060810151613773906064614c84565b602082015160018601546001600160401b03929092169161379e9190600160401b900460ff166149ce565b10156137bd5760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516137d89190614999565b9052506040810180516001600160401b03871691906137f8908390614a05565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614ea58339815191526020526040812060020180545f80516020614e6583398151915291600160401b9091046001600160401b031690600861388e83614caf565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661391d57604051631afcd79f60e31b815260040160405180910390fd5b565b6139276138d4565b61393081613dfd565b613938613e16565b6123dc6060820135608083013561395560c0850160a086016145d0565b61396560e0860160c08701614cca565b61ffff1661397a610100870160e08801614ce3565b61398c6101208801610100890161477e565b613e26565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166139d557604051637fab81e560e01b815260040160405180910390fd5b5f80516020614e65833981519152426139f460408601602087016145d0565b6001600160401b0316111580613a2e5750613a126202a30042614999565b613a2260408601602087016145d0565b6001600160401b031610155b15613a4b5760405162d36c8560e81b815260040160405180910390fd5b6030613a5a6040860186614d03565b9050141580613a6857508335155b15613a865760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613ab657604051630eb0d31360e11b815260040160405180910390fd5b613ac0835f61367b565b5f80613b596040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613b0491906145d0565b6001600160401b03168152602001613b1f60408a018a614d03565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250613f21565b5f82815260068601602052604090209193509150613b778282614d89565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613ba4908590600401614719565b6020604051808303815f875af1158015613bc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613be491906146e0565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613c5c57613c5c6145e9565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613d3c918e01908e016145d0565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613d8d5760405163cd78605960e01b8152306004820152602401612a53565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613dd6576040519150601f19603f3d011682016040523d82523d5f602084013e613ddb565b606091505b5050905080611dcd57604051630a12f52160e11b815260040160405180910390fd5b613e056138d4565b613e0d6142d0565b6123dc816142d8565b613e1e6138d4565b61391d6143aa565b613e2e6138d4565b5f80516020614e45833981519152831580613e4a575061271084115b15613e685760405163c98d73a760e01b815260040160405180910390fd5b85871115613e8957604051630103be3b60e21b815260040160405180910390fd5b60ff83161580613e9c5750600a60ff8416115b15613eba576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f6060826080015151603014613f8b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401612a53565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561400257613fc2816001614a05565b613fcd9060086149ce565b5081515f90839083908110613fe457613fe46147de565b60200101906001600160f81b03191690815f1a905350600101613fae565b505f5b600481101561406a57614019816003614a05565b6140249060086149ce565b600160ff919091161c60f81b8261403c836002614999565b8151811061404c5761404c6147de565b60200101906001600160f81b03191690815f1a905350600101614005565b505f5b60208110156140c75784518160208110614089576140896147de565b1a60f81b82614099836006614999565b815181106140a9576140a96147de565b60200101906001600160f81b03191690815f1a90535060010161406d565b505f5b602081101561412757846020015181602081106140e9576140e96147de565b1a60f81b826140f9836026614999565b81518110614109576141096147de565b60200101906001600160f81b03191690815f1a9053506001016140ca565b505f5b600881101561419b5761413e816007614a05565b6141499060086149ce565b60ff1685604001516001600160401b0316901c60f81b8282604661416d9190614999565b8151811061417d5761417d6147de565b60200101906001600160f81b03191690815f1a90535060010161412a565b505f5b603081101561420657846080015181815181106141bd576141bd6147de565b01602001516001600160f81b031916826141d883604e614999565b815181106141e8576141e86147de565b60200101906001600160f81b03191690815f1a90535060010161419e565b505f5b60088110156142785761421d816007614a05565b6142289060086149ce565b60608601516001600160401b0390811691161c60f81b8261424a83607e614999565b8151811061425a5761425a6147de565b60200101906001600160f81b03191690815f1a905350600101614209565b506002816040516142899190614988565b602060405180830381855afa1580156142a4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142c791906146e0565b94909350915050565b61391d6138d4565b6142e06138d4565b80355f80516020614e6583398151915290815560146143056060840160408501614ce3565b60ff161180614324575061431f6060830160408401614ce3565b60ff16155b156143425760405163b4fa3fb360e01b815260040160405180910390fd5b6143526060830160408401614ce3565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561438360408301602084016145d0565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61259e6138d4565b5080546143be90614a18565b5f825580601f106143cd575050565b601f0160209004905f5260205f20908101906123dc9190614425565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614439575f8155600101614426565b5090565b80151581146123dc575f80fd5b803563ffffffff81168114611dfe575f80fd5b5f805f6060848603121561446f575f80fd5b8335925060208401356144818161443d565b915061448f6040850161444a565b90509250925092565b5f602082840312156144a8575f80fd5b5035919050565b5f61012082840312156144c0575f80fd5b50919050565b803561ffff81168114611dfe575f80fd5b80356001600160401b0381168114611dfe575f80fd5b5f805f606084860312156144ff575f80fd5b83356001600160401b03811115614514575f80fd5b840160608187031215614525575f80fd5b9250614533602085016144c6565b915061448f604085016144d7565b5f60208284031215614551575f80fd5b610c2b8261444a565b5f806040838503121561456b575f80fd5b6145748361444a565b946020939093013593505050565b5f8060408385031215614593575f80fd5b82356001600160401b038111156145a8575f80fd5b8301608081860312156145b9575f80fd5b91506145c76020840161444a565b90509250929050565b5f602082840312156145e0575f80fd5b610c2b826144d7565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061462057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161465b60608401826001600160401b03169052565b50608083015161467660808401826001600160401b03169052565b5060a083015161469160a08401826001600160401b03169052565b5060c0830151612a2860c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612a2857612a286146ac565b5f602082840312156146f0575f80fd5b5051919050565b5f5b838110156147115781810151838201526020016146f9565b50505f910152565b602081525f82518060208401526147378160408501602087016146f7565b601f01601f19169190910160400192915050565b5f8261476557634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03811681146123dc575f80fd5b5f6020828403121561478e575f80fd5b8135610c2b8161476a565b5f808335601e198436030181126147ae575f80fd5b8301803591506001600160401b038211156147c7575f80fd5b6020019150600581901b360382131561219f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614806575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561484657614846614810565b60405290565b604051601f8201601f191681016001600160401b038111828210171561487457614874614810565b604052919050565b5f6001600160401b0382111561489457614894614810565b50601f01601f191660200190565b5f606082360312156148b2575f80fd5b6148ba614824565b8235815260206148cb8185016144d7565b8183015260408401356001600160401b038111156148e7575f80fd5b840136601f8201126148f7575f80fd5b803561490a6149058261487c565b61484c565b818152368483850101111561491d575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f855161494a818460208a016146f7565b80830190508581526001600160401b0360c01b8560c01b166020820152835161497a8160288401602088016146f7565b016028019695505050505050565b5f82516148068184602087016146f7565b80820180821115610bf857610bf86146ac565b5f63ffffffff8083168181036149c4576149c46146ac565b6001019392505050565b8082028115828204841417610bf857610bf86146ac565b6001600160401b03818116838216019080821115612a2857612a286146ac565b81810381811115610bf857610bf86146ac565b600181811c90821680614a2c57607f821691505b6020821081036144c057634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614a5c81614a18565b806020870152604060018084165f8114614a7d5760018114614a9957614ac6565b60ff19851660408a0152604084151560051b8a01019550614ac6565b895f5260205f205f5b85811015614abd5781548b8201860152908301908801614aa2565b8a016040019650505b509398975050505050505050565b8051611dfe8161443d565b5f8060408385031215614af0575f80fd5b82516001600160401b0380821115614b06575f80fd5b9084019060608287031215614b19575f80fd5b614b21614824565b82518152602080840151614b348161476a565b82820152604084015183811115614b49575f80fd5b80850194505087601f850112614b5d575f80fd5b83519250614b6d6149058461487c565b8381528882858701011115614b80575f80fd5b614b8f848383018488016146f7565b80604084015250819550614ba4818801614ad4565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b6001600160401b03818116838216028082169190828114614ca757614ca76146ac565b505092915050565b5f6001600160401b038083168181036149c4576149c46146ac565b5f60208284031215614cda575f80fd5b610c2b826144c6565b5f60208284031215614cf3575f80fd5b813560ff81168114610c2b575f80fd5b5f808335601e19843603018112614d18575f80fd5b8301803591506001600160401b03821115614d31575f80fd5b60200191503681900382131561219f575f80fd5b601f821115611dcd57805f5260205f20601f840160051c81016020851015614d6a5750805b601f840160051c820191505b81811015610ccb575f8155600101614d76565b81516001600160401b03811115614da257614da2614810565b614db681614db08454614a18565b84614d45565b602080601f831160018114614de9575f8415614dd25750858301515b5f19600386901b1c1916600185901b178555612914565b5f85815260208120601f198616915b82811015614e1757888601518255948401946001909101908401614df8565b5085821015614e3457878501515f19600388901b60f8161c191681555b5050505050600190811b0190555056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 f4c1dcc29..2f29b0cea 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -71,8 +71,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161393438038061393483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6137e78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c80638da5cb5b116100a9578063c974d1b61161006e578063c974d1b6146102c6578063d588c18f146102ce578063d5f20ff6146102e1578063df93d8de14610301578063f2fde38b1461030b575f80fd5b80638da5cb5b1461023b57806397fb70d41461027f578063a3a65e4814610292578063b771b3bc146102a5578063bee0a03f146102b3575f80fd5b806366435abf116100ef57806366435abf146101d4578063715018a6146101ff578063732214f8146102075780638280a25a1461020e5780638994ab4914610228575f80fd5b80630322ed981461012b5780630cdd098514610140578063467ef06f1461019157806360305d62146101a457806361e2f490146101c1575b5f80fd5b61013e610139366004612d80565b61031e565b005b61017e61014e366004612d80565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61013e61019f366004612daf565b6104dc565b6101ac601481565b60405163ffffffff9091168152602001610188565b61013e6101cf366004612dc8565b6104ea565b6101e76101e2366004612d80565b610b1e565b6040516001600160401b039091168152602001610188565b61013e610b32565b61017e5f81565b610216603081565b60405160ff9091168152602001610188565b61017e610236366004612e42565b610b45565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610188565b61013e61028d366004612d80565b610b61565b61013e6102a0366004612daf565b610b76565b6102676005600160991b0181565b61013e6102c1366004612d80565b610d2e565b610216601481565b61013e6102dc366004612e97565b610e3d565b6102f46102ef366004612d80565b610f4b565b6040516101889190612ee1565b6101e76202a30081565b61013e610319366004612f90565b611013565b5f8181525f805160206137bb8339815191526020526040808220815160e0810190925280545f8051602061379b83398151915293929190829060ff16600581111561036b5761036b612ecd565b600581111561037c5761037c612ecd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb612ecd565b146104555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61047a8584606001515f611050565b6040518263ffffffff1660e01b81526004016104969190612fd4565b6020604051808303815f875af11580156104b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d69190613006565b50505050565b6104e581611275565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061379b8339815191529060ff16156105875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161044c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ee9190613006565b8360200135146106505760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161044c565b306106616060850160408601612f90565b6001600160a01b0316146106d35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161044c565b5f6106e1606085018561301d565b91505f90508435602086013560146106ff6060890160408a01612f90565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff161015610a2e575f61077f606089018961301d565b8363ffffffff1681811061079557610795613062565b90506020028101906107a79190613076565b6107b090613126565b80515f81815260088901602052604090205491925090156107e35760405162461bcd60e51b815260040161044c906131bd565b84825f0151836020015184604001516040516020016108059493929190613205565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916108539190613254565b602060405180830381855afa15801561086e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108919190613006565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff1916600183600581111561091d5761091d612ecd565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516109d0911686613279565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610a279061328c565b9050610763565b50600484018190555f610a40866115bf565b90505f610a508260400151611785565b905080600285604051610a639190613254565b602060405180830381855afa158015610a7e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610aa19190613006565b14610b055760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161044c565b5050506009909201805460ff1916600117905550505050565b5f610b2882610f4b565b6080015192915050565b610b3a6118ee565b610b435f611949565b565b5f610b4e6118ee565b610b5883836119b9565b90505b92915050565b610b696118ee565b610b7281611f1d565b5050565b5f8051602061379b8339815191525f610b8e836115bf565b90505f80610b9f8360400151612198565b9150915080610c015760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044c565b5f82815260068501602052604081208054610c1b906132ae565b9050118015610c4d575060015f83815260078601602052604090205460ff166005811115610c4b57610c4b612ecd565b145b610c695760405162461bcd60e51b815260040161044c906132e0565b5f8281526006850160205260408120610c8191612cf5565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040812080545f8051602061379b833981519152929190610d76906132ae565b9050118015610da8575060015f83815260078301602052604090205460ff166005811115610da657610da6612ecd565b145b610dc45760405162461bcd60e51b815260040161044c906132e0565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610dfd9190600401613327565b6020604051808303815f875af1158015610e19573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e59190613006565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610e815750825b90505f826001600160401b03166001148015610e9c5750303b155b905081158015610eaa575080155b15610ec85760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ef257845460ff60401b1916600160401b1785555b610efc8787612339565b8315610f4257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610f53612d2c565b5f8281525f805160206137bb833981519152602052604090819020815160e0810190925280545f8051602061379b833981519152929190829060ff166005811115610fa057610fa0612ecd565b6005811115610fb157610fb1612ecd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b61101b6118ee565b6001600160a01b03811661104457604051631e4fbdf760e01b81525f600482015260240161044c565b61104d81611949565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b60028110156110c9576110898160016133b1565b6110949060086133c4565b5081515f908390839081106110ab576110ab613062565b60200101906001600160f81b03191690815f1a905350600101611075565b505f5b6004811015611134576110e08160036133b1565b6110eb9060086133c4565b600263ffffffff16901c60f81b828260026111069190613279565b8151811061111657611116613062565b60200101906001600160f81b03191690815f1a9053506001016110cc565b505f5b60208110156111965761114b81601f6133b1565b6111569060086133c4565b86901c60f81b82611168836006613279565b8151811061117857611178613062565b60200101906001600160f81b03191690815f1a905350600101611137565b505f5b6008811015611201576111ad8160076133b1565b6111b89060086133c4565b6001600160401b038616901c60f81b826111d3836026613279565b815181106111e3576111e3613062565b60200101906001600160f81b03191690815f1a905350600101611199565b505f5b600881101561126c576112188160076133b1565b6112239060086133c4565b6001600160401b038516901c60f81b8261123e83602e613279565b8151811061124e5761124e613062565b60200101906001600160f81b03191690815f1a905350600101611204565b50949350505050565b5f61127e612d2c565b5f8051602061379b8339815191525f611296856115bf565b90505f806112a78360400151612198565b91509150801561130c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044c565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561133d5761133d612ecd565b600581111561134e5761134e612ecd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156113bf576113bf612ecd565b14806113dd57506001825160058111156113db576113db612ecd565b145b61143c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044c565b60038251600581111561145157611451612ecd565b0361145e57506004611462565b5060055b6020808301515f9081526008880190915260408120558181600581111561148b5761148b612ecd565b9081600581111561149e5761149e612ecd565b9052505f84815260078701602052604090208251815484929190829060ff191660018360058111156114d2576114d2612ecd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561158657611586612ecd565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611623573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261164a91908101906133ea565b91509150806116aa5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161044c565b81511561170b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044c565b60208201516001600160a01b03161561177e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044c565b5092915050565b5f81516026146117a75760405162461bcd60e51b815260040161044c906134bc565b5f805b60028110156117f6576117be8160016133b1565b6117c99060086133c4565b61ffff168482815181106117df576117df613062565b016020015160f81c901b91909117906001016117aa565b5061ffff8116156118195760405162461bcd60e51b815260040161044c90613505565b5f805b6004811015611874576118308160036133b1565b61183b9060086133c4565b63ffffffff168561184d836002613279565b8151811061185d5761185d613062565b016020015160f81c901b919091179060010161181c565b5063ffffffff8116156118995760405162461bcd60e51b815260040161044c90613548565b5f805b602081101561126c576118b081601f6133b1565b6118bb9060086133c4565b866118c7836006613279565b815181106118d7576118d7613062565b016020015160f81c901b919091179060010161189c565b336119207f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610b435760405163118cdaa760e01b815233600482015260240161044c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611a445760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161044c565b5f8051602061379b83398151915242611a63604086016020870161358f565b6001600160401b031611611ad55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161044c565b611ae5604085016020860161358f565b6001600160401b0316611afb6202a30042613279565b11611b6e5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161044c565b8335611bc65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044c565b83355f90815260088201602052604090205415611bf55760405162461bcd60e51b815260040161044c906131bd565b6030611c0460408601866135a8565b905014611c695760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044c565b611c73835f612353565b5f80611d0c6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611cb7919061358f565b6001600160401b03168152602001611cd260408a018a6135a8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612561565b5f82815260068601602052604090209193509150611d2a8282613635565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611d57908590600401612fd4565b6020604051808303815f875af1158015611d73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d979190613006565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115611e0f57611e0f612ecd565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611eef918e01908e0161358f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611f25612d2c565b5f8281525f805160206137bb8339815191526020526040808220815160e0810190925280545f8051602061379b83398151915293929190829060ff166005811115611f7257611f72612ecd565b6005811115611f8357611f83612ecd565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611ff557611ff5612ecd565b146120515760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044c565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561209557612095612ecd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6121418582612910565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146121bb5760405162461bcd60e51b815260040161044c906134bc565b5f805b600281101561220a576121d28160016133b1565b6121dd9060086133c4565b61ffff168582815181106121f3576121f3613062565b016020015160f81c901b91909117906001016121be565b5061ffff81161561222d5760405162461bcd60e51b815260040161044c90613505565b5f805b6004811015612288576122448160036133b1565b61224f9060086133c4565b63ffffffff1686612261836002613279565b8151811061227157612271613062565b016020015160f81c901b9190911790600101612230565b5063ffffffff81166003146122af5760405162461bcd60e51b815260040161044c90613548565b5f805b6020811015612304576122c681601f6133b1565b6122d19060086133c4565b876122dd836006613279565b815181106122ed576122ed613062565b016020015160f81c901b91909117906001016122b2565b505f8660268151811061231957612319613062565b016020015191976001600160f81b03199092161515965090945050505050565b612341612a67565b61234a82612ab0565b610b7281612ac9565b5f8051602061379b8339815191525f6001600160401b0380841690851611156123875761238083856136f4565b9050612394565b61239184846136f4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806123f65750600184015481516123f2916001600160401b031690613279565b8210155b1561241c576001600160401b03831660608201528181526040810151602082015261243b565b828160600181815161242e9190613714565b6001600160401b03169052505b606081015161244b906064613734565b602082015160018601546001600160401b0392909216916124769190600160401b900460ff166133c4565b10156124da5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161044c565b856001600160401b0316816040018181516124f59190613279565b9052506040810180516001600160401b03871691906125159083906133b1565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146125cb5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044c565b60408051608680825260c082019092525f916020820181803683370190505090505f5b6002811015612642576126028160016133b1565b61260d9060086133c4565b5081515f9083908390811061262457612624613062565b60200101906001600160f81b03191690815f1a9053506001016125ee565b505f5b60048110156126aa576126598160036133b1565b6126649060086133c4565b600160ff919091161c60f81b8261267c836002613279565b8151811061268c5761268c613062565b60200101906001600160f81b03191690815f1a905350600101612645565b505f5b602081101561270757845181602081106126c9576126c9613062565b1a60f81b826126d9836006613279565b815181106126e9576126e9613062565b60200101906001600160f81b03191690815f1a9053506001016126ad565b505f5b6020811015612767578460200151816020811061272957612729613062565b1a60f81b82612739836026613279565b8151811061274957612749613062565b60200101906001600160f81b03191690815f1a90535060010161270a565b505f5b60088110156127db5761277e8160076133b1565b6127899060086133c4565b60ff1685604001516001600160401b0316901c60f81b828260466127ad9190613279565b815181106127bd576127bd613062565b60200101906001600160f81b03191690815f1a90535060010161276a565b505f5b603081101561284657846080015181815181106127fd576127fd613062565b01602001516001600160f81b0319168261281883604e613279565b8151811061282857612828613062565b60200101906001600160f81b03191690815f1a9053506001016127de565b505f5b60088110156128b85761285d8160076133b1565b6128689060086133c4565b60608601516001600160401b0390811691161c60f81b8261288a83607e613279565b8151811061289a5761289a613062565b60200101906001600160f81b03191690815f1a905350600101612849565b506002816040516128c99190613254565b602060405180830381855afa1580156128e4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906129079190613006565b94909350915050565b5f8281525f805160206137bb833981519152602052604081206002015481905f8051602061379b83398151915290600160801b90046001600160401b03166129588582612353565b5f61296287612ada565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129b28a858b611050565b6040518263ffffffff1660e01b81526004016129ce9190612fd4565b6020604051808303815f875af11580156129ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a0e9190613006565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610b4357604051631afcd79f60e31b815260040160405180910390fd5b612ab8612a67565b612ac0612b6a565b61104d81612b72565b612ad1612a67565b61104d81612ced565b5f8181525f805160206137bb8339815191526020526040812060020180545f8051602061379b83398151915291600160401b9091046001600160401b0316906008612b248361375f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b610b43612a67565b612b7a612a67565b80355f8051602061379b8339815191529081556014612b9f606084016040850161377a565b60ff161115612c0c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161044c565b5f612c1d606084016040850161377a565b60ff1611612c855760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161044c565b612c95606083016040840161377a565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612cc6604083016020840161358f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61101b612a67565b508054612d01906132ae565b5f825580601f10612d10575050565b601f0160209004905f5260205f209081019061104d9190612d68565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612d7c575f8155600101612d69565b5090565b5f60208284031215612d90575f80fd5b5035919050565b803563ffffffff81168114612daa575f80fd5b919050565b5f60208284031215612dbf575f80fd5b610b5882612d97565b5f8060408385031215612dd9575f80fd5b82356001600160401b03811115612dee575f80fd5b830160808186031215612dff575f80fd5b9150612e0d60208401612d97565b90509250929050565b5f60608284031215612e26575f80fd5b50919050565b80356001600160401b0381168114612daa575f80fd5b5f8060408385031215612e53575f80fd5b82356001600160401b03811115612e68575f80fd5b612e7485828601612e16565b925050612e0d60208401612e2c565b6001600160a01b038116811461104d575f80fd5b5f8060808385031215612ea8575f80fd5b612eb28484612e16565b91506060830135612ec281612e83565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612f0457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612f3f60608401826001600160401b03169052565b506080830151612f5a60808401826001600160401b03169052565b5060a0830151612f7560a08401826001600160401b03169052565b5060c083015161177e60c08401826001600160401b03169052565b5f60208284031215612fa0575f80fd5b8135612fab81612e83565b9392505050565b5f5b83811015612fcc578181015183820152602001612fb4565b50505f910152565b602081525f8251806020840152612ff2816040850160208701612fb2565b601f01601f19169190910160400192915050565b5f60208284031215613016575f80fd5b5051919050565b5f808335601e19843603018112613032575f80fd5b8301803591506001600160401b0382111561304b575f80fd5b6020019150600581901b3603821315612a60575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261308a575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130ca576130ca613094565b60405290565b604051601f8201601f191681016001600160401b03811182821017156130f8576130f8613094565b604052919050565b5f6001600160401b0382111561311857613118613094565b50601f01601f191660200190565b5f60608236031215613136575f80fd5b61313e6130a8565b82358152602061314f818501612e2c565b8183015260408401356001600160401b0381111561316b575f80fd5b840136601f82011261317b575f80fd5b803561318e61318982613100565b6130d0565b81815236848385010111156131a1575f80fd5b81848401858301375f9181019093015250604082015292915050565b60208082526028908201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604082015267792061637469766560c01b606082015260800190565b5f8551613216818460208a01612fb2565b80830190508581526001600160401b0360c01b8560c01b1660208201528351613246816028840160208801612fb2565b016028019695505050505050565b5f825161308a818460208701612fb2565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b5b57610b5b613265565b5f63ffffffff8083168181036132a4576132a4613265565b6001019392505050565b600181811c908216806132c257607f821691505b602082108103612e2657634e487b7160e01b5f52602260045260245ffd5b60208082526027908201527f56616c696461746f724d616e616765723a20696e76616c69642076616c6964616040820152661d1a5bdb88125160ca1b606082015260800190565b5f60208083525f8454613339816132ae565b806020870152604060018084165f811461335a5760018114613376576133a3565b60ff19851660408a0152604084151560051b8a010195506133a3565b895f5260205f205f5b8581101561339a5781548b820186015290830190880161337f565b8a016040019650505b509398975050505050505050565b81810381811115610b5b57610b5b613265565b8082028115828204841417610b5b57610b5b613265565b80518015158114612daa575f80fd5b5f80604083850312156133fb575f80fd5b82516001600160401b0380821115613411575f80fd5b9084019060608287031215613424575f80fd5b61342c6130a8565b8251815260208084015161343f81612e83565b82820152604084015183811115613454575f80fd5b80850194505087601f850112613468575f80fd5b8351925061347861318984613100565b838152888285870101111561348b575f80fd5b61349a84838301848801612fb2565b806040840152508195506134af8188016133db565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561359f575f80fd5b610b5882612e2c565b5f808335601e198436030181126135bd575f80fd5b8301803591506001600160401b038211156135d6575f80fd5b602001915036819003821315612a60575f80fd5b601f8211156104e557805f5260205f20601f840160051c8101602085101561360f5750805b601f840160051c820191505b8181101561362e575f815560010161361b565b5050505050565b81516001600160401b0381111561364e5761364e613094565b6136628161365c84546132ae565b846135ea565b602080601f831160018114613695575f841561367e5750858301515b5f19600386901b1c1916600185901b1785556136ec565b5f85815260208120601f198616915b828110156136c3578886015182559484019460019091019084016136a4565b50858210156136e057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0382811682821603908082111561177e5761177e613265565b6001600160401b0381811683821601908082111561177e5761177e613265565b6001600160401b0381811683821602808216919082811461375757613757613265565b505092915050565b5f6001600160401b038083168181036132a4576132a4613265565b5f6020828403121561378a575f80fd5b813560ff81168114612fab575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"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\":\"UnexpectedRegistrationStatus\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161333438038061333483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6131e78061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c80638da5cb5b116100a9578063c974d1b61161006e578063c974d1b6146102c6578063d588c18f146102ce578063d5f20ff6146102e1578063df93d8de14610301578063f2fde38b1461030b575f80fd5b80638da5cb5b1461023b57806397fb70d41461027f578063a3a65e4814610292578063b771b3bc146102a5578063bee0a03f146102b3575f80fd5b806366435abf116100ef57806366435abf146101d4578063715018a6146101ff578063732214f8146102075780638280a25a1461020e5780638994ab4914610228575f80fd5b80630322ed981461012b5780630cdd098514610140578063467ef06f1461019157806360305d62146101a457806361e2f490146101c1575b5f80fd5b61013e61013936600461280f565b61031e565b005b61017e61014e36600461280f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61013e61019f36600461283e565b610490565b6101ac601481565b60405163ffffffff9091168152602001610188565b61013e6101cf366004612857565b61049e565b6101e76101e236600461280f565b6109b8565b6040516001600160401b039091168152602001610188565b61013e6109cc565b61017e5f81565b610216603081565b60405160ff9091168152602001610188565b61017e6102363660046128d1565b6109df565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610188565b61013e61028d36600461280f565b6109fb565b61013e6102a036600461283e565b610a10565b6102676005600160991b0181565b61013e6102c136600461280f565b610b9f565b610216601481565b61013e6102dc366004612926565b610cc4565b6102f46102ef36600461280f565b610dd2565b6040516101889190612970565b6101e76202a30081565b61013e610319366004612a1f565b610e9a565b5f8181525f805160206131bb8339815191526020526040808220815160e0810190925280545f8051602061319b83398151915293929190829060ff16600581111561036b5761036b61295c565b600581111561037c5761037c61295c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb61295c565b146104095760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042e8584606001515f610edc565b6040518263ffffffff1660e01b815260040161044a9190612a63565b6020604051808303815f875af1158015610466573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048a9190612a95565b50505050565b61049981611101565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061319b8339815191529060ff16156104f057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610533573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105579190612a95565b83602001351461057a5760405163d040949d60e01b815260040160405180910390fd5b3061058b6060850160408601612a1f565b6001600160a01b0316146105b25760405163e6c4247b60e01b815260040160405180910390fd5b5f6105c06060850185612aac565b91505f90508435602086013560146105de6060890160408a01612a1f565b60408051602081019590955284019290925260e090811b6001600160e01b03199081166060808601919091529290921b6bffffffffffffffffffffffff1916606484015284901b166078820152607c0160405160208183030381529060405290505f805b838163ffffffff16101561090e575f61065e6060890189612aac565b8363ffffffff1681811061067457610674612af1565b90506020028101906106869190612b05565b61068f90612bb5565b80515f81815260088901602052604090205491925090156106c357604051630eb0d31360e11b815260040160405180910390fd5b84825f0151836020015184604001516040516020016106e59493929190612c4c565b60408051808303601f190181528282528b35602084015260e086901b6001600160e01b031916838301528151602481850301815260449093019182905296505f916002916107339190612c9b565b602060405180830381855afa15801561074e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107719190612a95565b5f83815260088a0160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078d01909252909120815181549394509192909190829060ff191660018360058111156107fd576107fd61295c565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516108b0911686612cc0565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061090790612cd3565b9050610642565b50600484018190555f610920866113cb565b90505f61093082604001516114cb565b9050806002856040516109439190612c9b565b602060405180830381855afa15801561095e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109819190612a95565b1461099f57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6109c282610dd2565b6080015192915050565b6109d4611634565b6109dd5f61168f565b565b5f6109e8611634565b6109f283836116ff565b90505b92915050565b610a03611634565b610a0c81611ad8565b5050565b5f8051602061319b8339815191525f610a28836113cb565b90505f80610a398360400151611d15565b9150915080610a5b57604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068501602052604090208054610a7590612cf5565b90505f03610a9657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115610abc57610abc61295c565b14610ada5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120610af291612784565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061319b8339815191529190610be690612cf5565b90505f03610c0757604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115610c2d57610c2d61295c565b14610c4b5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c849190600401612d27565b6020604051808303815f875af1158015610ca0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104999190612a95565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610d085750825b90505f826001600160401b03166001148015610d235750303b155b905081158015610d31575080155b15610d4f5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610d7957845460ff60401b1916600160401b1785555b610d838787611eb6565b8315610dc957845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610dda6127bb565b5f8281525f805160206131bb833981519152602052604090819020815160e0810190925280545f8051602061319b833981519152929190829060ff166005811115610e2757610e2761295c565b6005811115610e3857610e3861295c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610ea2611634565b6001600160a01b038116610ed057604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610ed98161168f565b50565b60408051603680825260608281019093525f91906020820181803683370190505090505f5b6002811015610f5557610f15816001612db1565b610f20906008612dc4565b5081515f90839083908110610f3757610f37612af1565b60200101906001600160f81b03191690815f1a905350600101610f01565b505f5b6004811015610fc057610f6c816003612db1565b610f77906008612dc4565b600263ffffffff16901c60f81b82826002610f929190612cc0565b81518110610fa257610fa2612af1565b60200101906001600160f81b03191690815f1a905350600101610f58565b505f5b602081101561102257610fd781601f612db1565b610fe2906008612dc4565b86901c60f81b82610ff4836006612cc0565b8151811061100457611004612af1565b60200101906001600160f81b03191690815f1a905350600101610fc3565b505f5b600881101561108d57611039816007612db1565b611044906008612dc4565b6001600160401b038616901c60f81b8261105f836026612cc0565b8151811061106f5761106f612af1565b60200101906001600160f81b03191690815f1a905350600101611025565b505f5b60088110156110f8576110a4816007612db1565b6110af906008612dc4565b6001600160401b038516901c60f81b826110ca83602e612cc0565b815181106110da576110da612af1565b60200101906001600160f81b03191690815f1a905350600101611090565b50949350505050565b5f61110a6127bb565b5f8051602061319b8339815191525f611122856113cb565b90505f806111338360400151611d15565b91509150801561115657604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156111875761118761295c565b60058111156111985761119861295c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156112095761120961295c565b1415801561122a57506001825160058111156112275761122761295c565b14155b156112485760405163a36c527f60e01b815260040160405180910390fd5b60038251600581111561125d5761125d61295c565b0361126a5750600461126e565b5060055b6020808301515f908152600888019091526040812055818160058111156112975761129761295c565b908160058111156112aa576112aa61295c565b9052505f84815260078701602052604090208251815484929190829060ff191660018360058111156112de576112de61295c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156113925761139261295c565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561142f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526114569190810190612dea565b915091508061147857604051636b2f19e960e01b815260040160405180910390fd5b8151156114985760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156114c45760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f81516026146114ed5760405162461bcd60e51b8152600401610ec790612ebc565b5f805b600281101561153c57611504816001612db1565b61150f906008612dc4565b61ffff1684828151811061152557611525612af1565b016020015160f81c901b91909117906001016114f0565b5061ffff81161561155f5760405162461bcd60e51b8152600401610ec790612f05565b5f805b60048110156115ba57611576816003612db1565b611581906008612dc4565b63ffffffff1685611593836002612cc0565b815181106115a3576115a3612af1565b016020015160f81c901b9190911790600101611562565b5063ffffffff8116156115df5760405162461bcd60e51b8152600401610ec790612f48565b5f805b60208110156110f8576115f681601f612db1565b611601906008612dc4565b8661160d836006612cc0565b8151811061161d5761161d612af1565b016020015160f81c901b91909117906001016115e2565b336116667f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109dd5760405163118cdaa760e01b8152336004820152602401610ec7565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661174357604051637fab81e560e01b815260040160405180910390fd5b5f8051602061319b833981519152426117626040860160208701612f8f565b6001600160401b031611158061179c57506117806202a30042612cc0565b6117906040860160208701612f8f565b6001600160401b031610155b156117b95760405162d36c8560e81b815260040160405180910390fd5b60306117c86040860186612fa8565b90501415806117d657508335155b156117f45760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561182457604051630eb0d31360e11b815260040160405180910390fd5b61182e835f611ed0565b5f806118c76040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906118729190612f8f565b6001600160401b0316815260200161188d60408a018a612fa8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612099565b5f828152600686016020526040902091935091506118e58282613035565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611912908590600401612a63565b6020604051808303815f875af115801561192e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119529190612a95565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156119ca576119ca61295c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611aaa918e01908e01612f8f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611ae06127bb565b5f8281525f805160206131bb8339815191526020526040808220815160e0810190925280545f8051602061319b83398151915293929190829060ff166005811115611b2d57611b2d61295c565b6005811115611b3e57611b3e61295c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611bb057611bb061295c565b14611bce5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611c1257611c1261295c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611cbe8582612448565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714611d385760405162461bcd60e51b8152600401610ec790612ebc565b5f805b6002811015611d8757611d4f816001612db1565b611d5a906008612dc4565b61ffff16858281518110611d7057611d70612af1565b016020015160f81c901b9190911790600101611d3b565b5061ffff811615611daa5760405162461bcd60e51b8152600401610ec790612f05565b5f805b6004811015611e0557611dc1816003612db1565b611dcc906008612dc4565b63ffffffff1686611dde836002612cc0565b81518110611dee57611dee612af1565b016020015160f81c901b9190911790600101611dad565b5063ffffffff8116600314611e2c5760405162461bcd60e51b8152600401610ec790612f48565b5f805b6020811015611e8157611e4381601f612db1565b611e4e906008612dc4565b87611e5a836006612cc0565b81518110611e6a57611e6a612af1565b016020015160f81c901b9190911790600101611e2f565b505f86602681518110611e9657611e96612af1565b016020015191976001600160f81b03199092161515965090945050505050565b611ebe61259f565b611ec7826125e8565b610a0c81612601565b5f8051602061319b8339815191525f6001600160401b038084169085161115611f0457611efd83856130f4565b9050611f11565b611f0e84846130f4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580611f73575060018401548151611f6f916001600160401b031690612cc0565b8210155b15611f99576001600160401b038316606082015281815260408101516020820152611fb8565b8281606001818151611fab9190613114565b6001600160401b03169052505b6060810151611fc8906064613134565b602082015160018601546001600160401b039290921691611ff39190600160401b900460ff16612dc4565b10156120125760405163254d226960e01b815260040160405180910390fd5b856001600160401b03168160400181815161202d9190612cc0565b9052506040810180516001600160401b038716919061204d908390612db1565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146121035760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610ec7565b60408051608680825260c082019092525f916020820181803683370190505090505f5b600281101561217a5761213a816001612db1565b612145906008612dc4565b5081515f9083908390811061215c5761215c612af1565b60200101906001600160f81b03191690815f1a905350600101612126565b505f5b60048110156121e257612191816003612db1565b61219c906008612dc4565b600160ff919091161c60f81b826121b4836002612cc0565b815181106121c4576121c4612af1565b60200101906001600160f81b03191690815f1a90535060010161217d565b505f5b602081101561223f578451816020811061220157612201612af1565b1a60f81b82612211836006612cc0565b8151811061222157612221612af1565b60200101906001600160f81b03191690815f1a9053506001016121e5565b505f5b602081101561229f578460200151816020811061226157612261612af1565b1a60f81b82612271836026612cc0565b8151811061228157612281612af1565b60200101906001600160f81b03191690815f1a905350600101612242565b505f5b6008811015612313576122b6816007612db1565b6122c1906008612dc4565b60ff1685604001516001600160401b0316901c60f81b828260466122e59190612cc0565b815181106122f5576122f5612af1565b60200101906001600160f81b03191690815f1a9053506001016122a2565b505f5b603081101561237e578460800151818151811061233557612335612af1565b01602001516001600160f81b0319168261235083604e612cc0565b8151811061236057612360612af1565b60200101906001600160f81b03191690815f1a905350600101612316565b505f5b60088110156123f057612395816007612db1565b6123a0906008612dc4565b60608601516001600160401b0390811691161c60f81b826123c283607e612cc0565b815181106123d2576123d2612af1565b60200101906001600160f81b03191690815f1a905350600101612381565b506002816040516124019190612c9b565b602060405180830381855afa15801561241c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061243f9190612a95565b94909350915050565b5f8281525f805160206131bb833981519152602052604081206002015481905f8051602061319b83398151915290600160801b90046001600160401b03166124908582611ed0565b5f61249a87612612565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124ea8a858b610edc565b6040518263ffffffff1660e01b81526004016125069190612a63565b6020604051808303815f875af1158015612522573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125469190612a95565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166109dd57604051631afcd79f60e31b815260040160405180910390fd5b6125f061259f565b6125f86126a2565b610ed9816126aa565b61260961259f565b610ed98161277c565b5f8181525f805160206131bb8339815191526020526040812060020180545f8051602061319b83398151915291600160401b9091046001600160401b031690600861265c8361315f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6109dd61259f565b6126b261259f565b80355f8051602061319b83398151915290815560146126d7606084016040850161317a565b60ff1611806126f657506126f1606083016040840161317a565b60ff16155b156127145760405163b4fa3fb360e01b815260040160405180910390fd5b612724606083016040840161317a565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556127556040830160208401612f8f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610ea261259f565b50805461279090612cf5565b5f825580601f1061279f575050565b601f0160209004905f5260205f2090810190610ed991906127f7565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561280b575f81556001016127f8565b5090565b5f6020828403121561281f575f80fd5b5035919050565b803563ffffffff81168114612839575f80fd5b919050565b5f6020828403121561284e575f80fd5b6109f282612826565b5f8060408385031215612868575f80fd5b82356001600160401b0381111561287d575f80fd5b83016080818603121561288e575f80fd5b915061289c60208401612826565b90509250929050565b5f606082840312156128b5575f80fd5b50919050565b80356001600160401b0381168114612839575f80fd5b5f80604083850312156128e2575f80fd5b82356001600160401b038111156128f7575f80fd5b612903858286016128a5565b92505061289c602084016128bb565b6001600160a01b0381168114610ed9575f80fd5b5f8060808385031215612937575f80fd5b61294184846128a5565b9150606083013561295181612912565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061299357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516129ce60608401826001600160401b03169052565b5060808301516129e960808401826001600160401b03169052565b5060a0830151612a0460a08401826001600160401b03169052565b5060c08301516114c460c08401826001600160401b03169052565b5f60208284031215612a2f575f80fd5b8135612a3a81612912565b9392505050565b5f5b83811015612a5b578181015183820152602001612a43565b50505f910152565b602081525f8251806020840152612a81816040850160208701612a41565b601f01601f19169190910160400192915050565b5f60208284031215612aa5575f80fd5b5051919050565b5f808335601e19843603018112612ac1575f80fd5b8301803591506001600160401b03821115612ada575f80fd5b6020019150600581901b3603821315612598575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612b19575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612b5957612b59612b23565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612b8757612b87612b23565b604052919050565b5f6001600160401b03821115612ba757612ba7612b23565b50601f01601f191660200190565b5f60608236031215612bc5575f80fd5b612bcd612b37565b823581526020612bde8185016128bb565b8183015260408401356001600160401b03811115612bfa575f80fd5b840136601f820112612c0a575f80fd5b8035612c1d612c1882612b8f565b612b5f565b8181523684838501011115612c30575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8551612c5d818460208a01612a41565b80830190508581526001600160401b0360c01b8560c01b1660208201528351612c8d816028840160208801612a41565b016028019695505050505050565b5f8251612b19818460208701612a41565b634e487b7160e01b5f52601160045260245ffd5b808201808211156109f5576109f5612cac565b5f63ffffffff808316818103612ceb57612ceb612cac565b6001019392505050565b600181811c90821680612d0957607f821691505b6020821081036128b557634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454612d3981612cf5565b806020870152604060018084165f8114612d5a5760018114612d7657612da3565b60ff19851660408a0152604084151560051b8a01019550612da3565b895f5260205f205f5b85811015612d9a5781548b8201860152908301908801612d7f565b8a016040019650505b509398975050505050505050565b818103818111156109f5576109f5612cac565b80820281158282048414176109f5576109f5612cac565b80518015158114612839575f80fd5b5f8060408385031215612dfb575f80fd5b82516001600160401b0380821115612e11575f80fd5b9084019060608287031215612e24575f80fd5b612e2c612b37565b82518152602080840151612e3f81612912565b82820152604084015183811115612e54575f80fd5b80850194505087601f850112612e68575f80fd5b83519250612e78612c1884612b8f565b8381528882858701011115612e8b575f80fd5b612e9a84838301848801612a41565b80604084015250819550612eaf818801612ddb565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f60208284031215612f9f575f80fd5b6109f2826128bb565b5f808335601e19843603018112612fbd575f80fd5b8301803591506001600160401b03821115612fd6575f80fd5b602001915036819003821315612598575f80fd5b601f82111561049957805f5260205f20601f840160051c8101602085101561300f5750805b601f840160051c820191505b8181101561302e575f815560010161301b565b5050505050565b81516001600160401b0381111561304e5761304e612b23565b6130628161305c8454612cf5565b84612fea565b602080601f831160018114613095575f841561307e5750858301515b5f19600386901b1c1916600185901b1785556130ec565b5f85815260208120601f198616915b828110156130c3578886015182559484019460019091019084016130a4565b50858210156130e057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b038281168282160390808211156114c4576114c4612cac565b6001600160401b038181168382160190808211156114c4576114c4612cac565b6001600160401b0381811683821602808216919082811461315757613157612cac565b505092915050565b5f6001600160401b03808316818103612ceb57612ceb612cac565b5f6020828403121561318a575f80fd5b813560ff81168114612a3a575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. From 059aee352be26173b62ab8999a010b76a1fe3577 Mon Sep 17 00:00:00 2001 From: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Date: Fri, 20 Sep 2024 14:20:54 -0500 Subject: [PATCH 383/545] Update contracts/validator-manager/PoSValidatorManager.sol Co-authored-by: Ian Suvak Signed-off-by: cam-schultz <78878559+cam-schultz@users.noreply.github.com> --- contracts/validator-manager/PoSValidatorManager.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index fe5b5274d..c745bcd65 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -366,9 +366,9 @@ abstract contract PoSValidatorManager is Validator memory validator = getValidator(validationID); // The received nonce should be no greater than the highest sent nonce, and at least as high as - // the delegation's statubg nonce. This allows //a weight update using a higher nonce + // the delegation's starting nonce. This allows a weight update using a higher nonce // (which implicitly includes the delegation's weight update) to be used to complete delisting - // for an earlier delegation. This is necessary because the P-Chainis only willing to sign the latest weight update. + // for an earlier delegation. This is necessary because the P-Chain is only willing to sign the latest weight update. if ( validator.messageNonce < nonce || $._delegatorStakes[delegationID].startingNonce > nonce ) { From 6a80d6316a60a53f35a8f9eb16b7850bde2650f7 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 20 Sep 2024 14:21:58 -0500 Subject: [PATCH 384/545] comment type --- contracts/validator-manager/PoSValidatorManager.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index c745bcd65..8e6761b42 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -504,9 +504,9 @@ abstract contract PoSValidatorManager is delete $._delegatorStakes[delegationID]; // The received nonce should be no greater than the highest sent nonce, and at least as high as - // the delegation's ending nonce. This allows //a weight update using a higher nonce + // the delegation's ending nonce. This allows a weight update using a higher nonce // (which implicitly includes the delegation's weight update) to be used to complete delisting - // for an earlier delegation. This is necessary because the P-Chainis only willing to sign the latest weight update. + // for an earlier delegation. This is necessary because the P-Chain is only willing to sign the latest weight update. if (validator.messageNonce < nonce || delegator.endingNonce > nonce) { revert InvalidNonce(); } From 556c147793e14dccc38d3c6b193d213fa3349a80 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 20 Sep 2024 15:51:25 -0400 Subject: [PATCH 385/545] Fix bug where delegator can't exit after validation has ended --- .../ERC20TokenStakingManager.go | 25 +++++++++++- .../NativeTokenStakingManager.go | 25 +++++++++++- .../validator-manager/PoSValidatorManager.sol | 39 +++++++++++++++++-- 3 files changed, 81 insertions(+), 8 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 073f7a472..4b2b127f2 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -82,8 +82,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161641c38038061641c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162cf8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b3366004615627565b61040d565b005b6101b86101c8366004615662565b61089e565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004615662565b610a57565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b8610241366004615679565b610a6d565b6101b8610254366004615692565b610b0d565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b86102843660046156ba565b610f9d565b61029c61029736600461571e565b611580565b6040519081526020016101e3565b6101ff6102b8366004615662565b611599565b61029c5f81565b6101b86102d2366004615627565b6115ad565b6101d5603081565b6101b86102ed366004615662565b6117f0565b6101b8610300366004615692565b6118f6565b61029c610313366004615737565b611ad9565b6101b8610326366004615679565b611b05565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004615662565b611c7b565b6101b8610372366004615662565b611eee565b6101d5601481565b61039261038d366004615662565b611fc9565b6040516101e3919061576b565b6101ff6202a30081565b61029c6103b7366004615662565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f536600461582b565b612091565b6101b86104083660046158a4565b6120c6565b5f8381525f8051602061626383398151915260205260408082208151610100810190925280545f8051602061620383398151915293929190829060ff16600481111561045b5761045b615757565b600481111561046c5761046c615757565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f6104f082611fc9565b905060028351600481111561050757610507615757565b146105595760405162461bcd60e51b815260206004820152602a60248201525f805160206162238339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105be5760405162461bcd60e51b815260206004820152603360248201525f805160206162238339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b6064820152608401610550565b6003835280515f9060029060058111156105da576105da615757565b036106315786156105f2576105ef83876121a5565b90505b5f8460600151836080015161060791906158f6565b90506106138482612441565b506001600160401b0390811660e0870152421660a086015250610665565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106988660600151611580565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610715573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107399190615916565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561077857610778615757565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088c916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206162a38339815191526020526040808220815160e0810190925280545f8051602061624383398151915293929190829060ff1660058111156108eb576108eb615757565b60058111156108fc576108fc615757565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096b5761096b615757565b146109d05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b6064820152608401610550565b6005600160991b016001600160a01b031663ee5b48eb6109f58584606001515f612598565b6040518263ffffffff1660e01b8152600401610a11919061594f565b6020604051808303815f875af1158015610a2d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a519190615916565b50505050565b5f610a6764e8d4a5100083615981565b92915050565b5f805160206162038339815191525f80610a86846125ef565b91509150610a938261290d565b610a9d5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610acb57610acb615757565b03610af0575f83815260088501602052604081208054919055610aee8282612948565b505b610b0681610b018460400151611580565b6129be565b5050505050565b5f8181525f8051602061626383398151915260205260408082208151610100810190925280545f8051602061620383398151915293929190829060ff166004811115610b5b57610b5b615757565b6004811115610b6c57610b6c615757565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf190611fc9565b9050600182516004811115610c0857610c08615757565b14610c715760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b6064820152608401610550565b600381516005811115610c8657610c86615757565b03610dfe576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610cea57610cea615757565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1357610e13615757565b03610e2157610b06846129e1565b5f610e2b86612bde565b90505f80610e3c8360400151612da4565b509150915081856040015114610e645760405162461bcd60e51b8152600401610550906159a0565b806001600160401b031684606001516001600160401b03161015610ed55760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b6064820152608401610550565b806001600160401b03168560c001516001600160401b03161115610f0b5760405162461bcd60e51b8152600401610550906159ea565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206162438339815191529060ff161561103a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b6064820152608401610550565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a19190615916565b8360200135146111035760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b6064820152608401610550565b306111146060850160408601615a33565b6001600160a01b0316146111865760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b6064820152608401610550565b5f6111946060850185615a4e565b905090505f805b828163ffffffff161015611484575f6111b76060880188615a4e565b8363ffffffff168181106111cd576111cd615a93565b90506020028101906111df9190615aa7565b6111e890615b57565b80515f81815260088801602052604090205491925090156112605760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b6064820152608401610550565b5f6002895f01358560405160200161128f92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a991615bee565b602060405180830381855afa1580156112c4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e79190615916565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561137357611373615757565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611426911686615bff565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147d90615c12565b905061119b565b50600483018190555f61149685612bde565b90505f6114a68260400151612fdf565b90505f6114b288613151565b9050816002826040516114c59190615bee565b602060405180830381855afa1580156114e0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115039190615916565b146115675760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b6064820152608401610550565b5050506009909201805460ff1916600117905550505050565b5f610a676001600160401b03831664e8d4a51000615c34565b5f6115a382611fc9565b6080015192915050565b5f805160206162038339815191525f6115c5856135ea565b90506115d08561290d565b6115db575050505050565b5f8581526005830160205260409020546001600160a01b031633146116125760405162461bcd60e51b815260040161055090615c4b565b5f85815260058301602052604090205460a082015161164191600160b01b90046001600160401b031690615c9d565b6001600160401b03168160c001516001600160401b031610156116c25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b6064820152608401610550565b8315610b06575f6116d386856121a5565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061172a90611580565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156117a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117c49190615916565b5f878152600885016020526040812080549091906117e3908490615bff565b9091555050505050505050565b5f805160206162038339815191525f61180883611fc9565b905060048151600581111561181f5761181f615757565b146118895760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b6064820152608401610550565b5f8381526005830160205260409020546001600160a01b031633146118c05760405162461bcd60e51b815260040161055090615c4b565b5f83815260088301602090815260408083208054908490556005860190925290912054610a51906001600160a01b031682612948565b6118fe613865565b5f8181525f8051602061626383398151915260205260408082208151610100810190925280545f8051602061620383398151915293929190829060ff16600481111561194c5761194c615757565b600481111561195d5761195d615757565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119d985612bde565b90505f806119ea8360400151612da4565b509150915081846040015114611a125760405162461bcd60e51b8152600401610550906159a0565b806001600160401b03168460e001516001600160401b03161115611a485760405162461bcd60e51b8152600401610550906159ea565b600384516004811115611a5d57611a5d615757565b14611ab15760405162461bcd60e51b815260206004820152603160248201525f805160206162238339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b6064820152608401610550565b611aba866129e1565b5050505050611ad560015f8051602061628383398151915255565b5050565b5f611ae2613865565b611aed8333846138af565b9050610a6760015f8051602061628383398151915255565b5f805160206162438339815191525f611b1d83612bde565b90505f80611b2e8360400151613c69565b9150915080611b905760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b6064820152608401610550565b60015f83815260078601602052604090205460ff166005811115611bb657611bb6615757565b14611bd35760405162461bcd60e51b815260040161055090615cbd565b5f8281526006850160205260408120611beb91615577565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061626383398151915260205260408082208151610100810190925280545f8051602061620383398151915293929190829060ff166004811115611cc957611cc9615757565b6004811115611cda57611cda615757565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611d6157611d61615757565b1480611d7f5750600381516004811115611d7d57611d7d615757565b145b611dd35760405162461bcd60e51b815260206004820152603260248201525f80516020616223833981519152604482015271737461747573206e6f742070656e64696e6760701b6064820152608401610550565b5f611de18260400151611fc9565b905080606001516001600160401b03165f03611e655760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e204944006064820152608401610550565b6005600160991b016001600160a01b031663ee5b48eb611e92846040015184606001518560800151612598565b6040518263ffffffff1660e01b8152600401611eae919061594f565b6020604051808303815f875af1158015611eca573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b069190615916565b5f8181525f805160206162a383398151915260205260409020545f805160206162438339815191529060019060ff166005811115611f2e57611f2e615757565b14611f4b5760405162461bcd60e51b815260040161055090615cbd565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611f849190600401615d40565b6020604051808303815f875af1158015611fa0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc49190615916565b505050565b611fd16155ae565b5f8281525f805160206162a3833981519152602052604090819020815160e0810190925280545f80516020616243833981519152929190829060ff16600581111561201e5761201e615757565b600581111561202f5761202f615757565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61209a613865565b6120a685858585613e0a565b90506120be60015f8051602061628383398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061210f575080546001600160401b03808416911610155b1561212d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561215884846140f6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156121f0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122179190810190615dd5565b915091508061227a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b6064820152608401610550565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e19190615916565b8251146123455760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b6064820152608401610550565b60208201516001600160a01b0316156123bb5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b6064820152608401610550565b5f806123ca8460400151614110565b915091508187146124375760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b6064820152608401610550565b9695505050505050565b5f8281525f805160206162a3833981519152602052604081206002015481905f8051602061624383398151915290600160801b90046001600160401b031661248985826142e8565b5f612493876144f6565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124e38a858b612598565b6040518263ffffffff1660e01b81526004016124ff919061594f565b6020604051808303815f875af115801561251b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061253f9190615916565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6125f86155ae565b5f805160206162438339815191525f61261085612bde565b90505f806126218360400151613c69565b9150915080156126865760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b6064820152608401610550565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156126b7576126b7615757565b60058111156126c8576126c8615757565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561273757612737615757565b1480612755575060018151600581111561275357612753615757565b145b6127b45760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b6064820152608401610550565b6003815160058111156127c9576127c9615757565b036127d757600481526127dc565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561282157612821615757565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156128d5576128d5615757565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f805160206161e383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156129a3575f80fd5b505af11580156129b5573d5f803e3d5ffd5b50505050505050565b5f805160206161e383398151915254611ad5906001600160a01b03168383614586565b5f8181525f8051602061626383398151915260205260408082208151610100810190925280545f8051602061620383398151915293929190829060ff166004811115612a2f57612a2f615757565b6004811115612a4057612a40615757565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612b3490600160a01b900461ffff1684615c34565b612b3e9190615981565b905080856008015f8581526020019081526020015f205f828254612b629190615bff565b909155505f9050612b738284615ea7565b9050612b83856020015182612948565b612b988560200151610b018760600151611580565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612c42573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612c699190810190615dd5565b9150915080612cc95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b6064820152608401610550565b815115612d2a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b6064820152608401610550565b60208201516001600160a01b031615612d9d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b6064820152608401610550565b5092915050565b5f805f8351603614612dc85760405162461bcd60e51b815260040161055090615eba565b5f805b6002811015612e1757612ddf816001615ea7565b612dea906008615c34565b61ffff16868281518110612e0057612e00615a93565b016020015160f81c901b9190911790600101612dcb565b5061ffff811615612e3a5760405162461bcd60e51b815260040161055090615f03565b5f805b6004811015612e9557612e51816003615ea7565b612e5c906008615c34565b63ffffffff1687612e6e836002615bff565b81518110612e7e57612e7e615a93565b016020015160f81c901b9190911790600101612e3d565b5063ffffffff8116600414612ebc5760405162461bcd60e51b815260040161055090615f46565b5f805b6020811015612f1157612ed381601f615ea7565b612ede906008615c34565b88612eea836006615bff565b81518110612efa57612efa615a93565b016020015160f81c901b9190911790600101612ebf565b505f805b6008811015612f7057612f29816007615ea7565b612f34906008615c34565b6001600160401b031689612f49836026615bff565b81518110612f5957612f59615a93565b016020015160f81c901b9190911790600101612f15565b505f805b6008811015612fcf57612f88816007615ea7565b612f93906008615c34565b6001600160401b03168a612fa883602e615bff565b81518110612fb857612fb8615a93565b016020015160f81c901b9190911790600101612f74565b5091989097509095509350505050565b5f81516026146130015760405162461bcd60e51b815260040161055090615eba565b5f805b600281101561305057613018816001615ea7565b613023906008615c34565b61ffff1684828151811061303957613039615a93565b016020015160f81c901b9190911790600101613004565b5061ffff8116156130735760405162461bcd60e51b815260040161055090615f03565b5f805b60048110156130ce5761308a816003615ea7565b613095906008615c34565b63ffffffff16856130a7836002615bff565b815181106130b7576130b7615a93565b016020015160f81c901b9190911790600101613076565b5063ffffffff8116156130f35760405162461bcd60e51b815260040161055090615f46565b5f805b60208110156131485761310a81601f615ea7565b613115906008615c34565b86613121836006615bff565b8151811061313157613131615a93565b016020015160f81c901b91909117906001016130f6565b50949350505050565b60605f61316083830184615a4e565b61316c91506058615c34565b61317790605c615bff565b6001600160401b0381111561318e5761318e615ac5565b6040519080825280601f01601f1916602001820160405280156131b8576020820181803683370190505b5090505f5b602081101561320d57833581602081106131d9576131d9615a93565b1a60f81b8282815181106131ef576131ef615a93565b60200101906001600160f81b03191690815f1a9053506001016131bd565b505f5b602081101561326d578360200135816020811061322f5761322f615a93565b1a60f81b8261323f836020615bff565b8151811061324f5761324f615a93565b60200101906001600160f81b03191690815f1a905350600101613210565b505f5b60048110156132d057613284816003615ea7565b61328f906008615c34565b6014901c60f81b826132a2836040615bff565b815181106132b2576132b2615a93565b60200101906001600160f81b03191690815f1a905350600101613270565b505f6132e26060850160408601615a33565b60601b90505f5b60148110156133425781816014811061330457613304615a93565b1a60f81b83613314836044615bff565b8151811061332457613324615a93565b60200101906001600160f81b03191690815f1a9053506001016132e9565b505f6133516060860186615a4e565b905090505f5b60048110156133bc5761336b816003615ea7565b613376906008615c34565b63ffffffff8316901c60f81b8461338e836058615bff565b8151811061339e5761339e615a93565b60200101906001600160f81b03191690815f1a905350600101613357565b505f5b6133cc6060870187615a4e565b90508110156135e0575f6133e1826058615c34565b6133ec90605c615bff565b90505f5b6020811015613477576134066060890189615a4e565b8481811061341657613416615a93565b90506020028101906134289190615aa7565b35816020811061343a5761343a615a93565b1a60f81b866134498385615bff565b8151811061345957613459615a93565b60200101906001600160f81b03191690815f1a9053506001016133f0565b505f5b600881101561352c5761348e816007615ea7565b613499906008615c34565b6134a660608a018a615a4e565b858181106134b6576134b6615a93565b90506020028101906134c89190615aa7565b6134d990604081019060200161571e565b6001600160401b0316901c60f81b86826134f4856020615bff565b6134fe9190615bff565b8151811061350e5761350e615a93565b60200101906001600160f81b03191690815f1a90535060010161347a565b505f5b60308110156135d6576135456060890189615a4e565b8481811061355557613555615a93565b90506020028101906135679190615aa7565b613575906040810190615f8d565b8281811061358557613585615a93565b9050013560f81c60f81b868284602861359e9190615bff565b6135a89190615bff565b815181106135b8576135b8615a93565b60200101906001600160f81b03191690815f1a90535060010161352f565b50506001016133bf565b5091949350505050565b6135f26155ae565b5f8281525f805160206162a38339815191526020526040808220815160e0810190925280545f8051602061624383398151915293929190829060ff16600581111561363f5761363f615757565b600581111561365057613650615757565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156136c2576136c2615757565b1461371e5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b6064820152608401610550565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561376257613762615757565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61380e8582612441565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061628383398151915280546001190161389657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061628383398151915255565b5f5f80516020616203833981519152816138cb6101fa856145e5565b90505f6138d787611fc9565b90506138e28761290d565b61393f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b6064820152608401610550565b60028151600581111561395457613954615757565b146139b35760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b6064820152608401610550565b5f8282608001516139c49190615c9d565b600485015460408401519192506139e6916001600160401b0390911690615fcf565b6001600160401b0316816001600160401b03161115613a655760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b6064820152608401610550565b5f80613a718a84612441565b915091505f8a83604051602001613a9f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613b3a57613b3a615757565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613c8c5760405162461bcd60e51b815260040161055090615eba565b5f805b6002811015613cdb57613ca3816001615ea7565b613cae906008615c34565b61ffff16858281518110613cc457613cc4615a93565b016020015160f81c901b9190911790600101613c8f565b5061ffff811615613cfe5760405162461bcd60e51b815260040161055090615f03565b5f805b6004811015613d5957613d15816003615ea7565b613d20906008615c34565b63ffffffff1686613d32836002615bff565b81518110613d4257613d42615a93565b016020015160f81c901b9190911790600101613d01565b5063ffffffff8116600314613d805760405162461bcd60e51b815260040161055090615f46565b5f805b6020811015613dd557613d9781601f615ea7565b613da2906008615c34565b87613dae836006615bff565b81518110613dbe57613dbe615a93565b016020015160f81c901b9190911790600101613d83565b505f86602681518110613dea57613dea615a93565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206162038339815191529061ffff86161015613e915760405162461bcd60e51b815260206004820152602b60248201525f8051602061622383398151915260448201526a66656520746f6f206c6f7760a81b6064820152608401610550565b61271061ffff86161115613ee95760405162461bcd60e51b815260206004820152602c60248201525f8051602061622383398151915260448201526b0cccaca40e8dede40d0d2ced60a31b6064820152608401610550565b60028101546001600160401b039081169085161015613f625760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b6064820152608401610550565b8054831015613fc55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b6064820152608401610550565b806001015483111561402c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b6064820152608401610550565b5f614036846145e5565b90505f61404282610a57565b90505f61404f8983614608565b905060405180606001604052806140633390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6140fe614bbe565b61410782614c09565b611ad581614c7e565b5f808251602e146141335760405162461bcd60e51b815260040161055090615eba565b5f805b60028110156141825761414a816001615ea7565b614155906008615c34565b61ffff1685828151811061416b5761416b615a93565b016020015160f81c901b9190911790600101614136565b5061ffff8116156141a55760405162461bcd60e51b815260040161055090615f03565b5f805b6004811015614200576141bc816003615ea7565b6141c7906008615c34565b63ffffffff16866141d9836002615bff565b815181106141e9576141e9615a93565b016020015160f81c901b91909117906001016141a8565b5063ffffffff81166005146142275760405162461bcd60e51b815260040161055090615f46565b5f805b602081101561427c5761423e81601f615ea7565b614249906008615c34565b87614255836006615bff565b8151811061426557614265615a93565b016020015160f81c901b919091179060010161422a565b505f805b60088110156142db57614294816007615ea7565b61429f906008615c34565b6001600160401b0316886142b4836026615bff565b815181106142c4576142c4615a93565b016020015160f81c901b9190911790600101614280565b5090969095509350505050565b5f805160206162438339815191525f6001600160401b03808416908516111561431c5761431583856158f6565b9050614329565b61432684846158f6565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061438b575060018401548151614387916001600160401b031690615bff565b8210155b156143b1576001600160401b0383166060820152818152604081015160208201526143d0565b82816060018181516143c39190615c9d565b6001600160401b03169052505b60608101516143e0906064615fcf565b602082015160018601546001600160401b03929092169161440b9190600160401b900460ff16615c34565b101561446f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b6064820152608401610550565b856001600160401b03168160400181815161448a9190615bff565b9052506040810180516001600160401b03871691906144aa908390615ea7565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162a38339815191526020526040812060020180545f8051602061624383398151915291600160401b9091046001600160401b031690600861454083615ffa565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611fc491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614d1f565b5f610a67825f805160206161e3833981519152546001600160a01b031690614d80565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166146935760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b6064820152608401610550565b5f80516020616243833981519152426146b2604086016020870161571e565b6001600160401b0316116147245760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b6064820152608401610550565b614734604085016020860161571e565b6001600160401b031661474a6202a30042615bff565b116147bd5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e206675747572650000000000000000006064820152608401610550565b83356148155760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b6064820152608401610550565b83355f908152600882016020526040902054156148855760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b6064820152608401610550565b60306148946040860186615f8d565b9050146148f95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b6064820152608401610550565b614903835f6142e8565b5f8061499c6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614947919061571e565b6001600160401b0316815260200161496260408a018a615f8d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614ee2565b5f828152600686016020526040902091935091506149ba8282616059565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906149f890859060040161594f565b6020604051808303815f875af1158015614a14573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a389190615916565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614ab057614ab0615757565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614b90918e01908e0161571e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614c0757604051631afcd79f60e31b815260040160405180910390fd5b565b614c11614bbe565b614c1a81614fe6565b614c22614fff565b614c7b60608201356080830135614c3f60c0850160a0860161571e565b614c4f60e0860160c08701616118565b61ffff16614c64610100870160e08801616131565b614c7661012088016101008901615a33565b61500f565b50565b614c86614bbe565b5f805160206161e38339815191526001600160a01b038216614cff5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b6064820152608401610550565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f614d336001600160a01b03841683615297565b905080515f14158015614d57575080806020019051810190614d559190616151565b155b15611fc457604051635274afe760e01b81526001600160a01b0384166004820152602401610550565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614dc6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614dea9190615916565b9050614e016001600160a01b0385163330866152a4565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614e45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e699190615916565b9050818111614ecf5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610550565b614ed98282615ea7565b95945050505050565b5f6060826080015151603014614f4c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610550565b5f806001855f01518660200151876040015188608001518960600151604051602001614f7e979695949392919061616c565b6040516020818303038152906040529050600281604051614f9f9190615bee565b602060405180830381855afa158015614fba573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614fdd9190615916565b94909350915050565b614fee614bbe565b614ff66152dd565b614c7b816152e5565b615007614bbe565b614c07615460565b615017614bbe565b5f80516020616203833981519152836150835760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b6064820152608401610550565b6127108411156150e95760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b6064820152608401610550565b858711156151515760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b6064820152608401610550565b5f8360ff16116151be5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b6064820152608401610550565b600a60ff841611156152305760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b6064820152608401610550565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606125e883835f615468565b6040516001600160a01b038481166024830152838116604483015260648201839052610a519186918216906323b872dd906084016145b3565b614c07614bbe565b6152ed614bbe565b80355f8051602061624383398151915290815560146153126060840160408501616131565b60ff16111561537f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b6064820152608401610550565b5f6153906060840160408501616131565b60ff16116153f85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b6064820152608401610550565b6154086060830160408401616131565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055615439604083016020840161571e565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61389c614bbe565b60608147101561548d5760405163cd78605960e01b8152306004820152602401610550565b5f80856001600160a01b031684866040516154a89190615bee565b5f6040518083038185875af1925050503d805f81146154e2576040519150601f19603f3d011682016040523d82523d5f602084013e6154e7565b606091505b5091509150612437868383606082615507576155028261554e565b6125e8565b815115801561551e57506001600160a01b0384163b155b1561554757604051639996b31560e01b81526001600160a01b0385166004820152602401610550565b50806125e8565b80511561555e5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461558390615d08565b5f825580601f10615592575050565b601f0160209004905f5260205f2090810190614c7b91906155ea565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156155fe575f81556001016155eb565b5090565b8015158114614c7b575f80fd5b803563ffffffff81168114615622575f80fd5b919050565b5f805f60608486031215615639575f80fd5b83359250602084013561564b81615602565b91506156596040850161560f565b90509250925092565b5f60208284031215615672575f80fd5b5035919050565b5f60208284031215615689575f80fd5b6125e88261560f565b5f80604083850312156156a3575f80fd5b6156ac8361560f565b946020939093013593505050565b5f80604083850312156156cb575f80fd5b82356001600160401b038111156156e0575f80fd5b8301608081860312156156f1575f80fd5b91506156ff6020840161560f565b90509250929050565b80356001600160401b0381168114615622575f80fd5b5f6020828403121561572e575f80fd5b6125e882615708565b5f8060408385031215615748575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061578e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516157c960608401826001600160401b03169052565b5060808301516157e460808401826001600160401b03169052565b5060a08301516157ff60a08401826001600160401b03169052565b5060c0830151612d9d60c08401826001600160401b03169052565b803561ffff81168114615622575f80fd5b5f805f806080858703121561583e575f80fd5b84356001600160401b03811115615853575f80fd5b850160608188031215615864575f80fd5b93506158726020860161581a565b925061588060408601615708565b9396929550929360600135925050565b6001600160a01b0381168114614c7b575f80fd5b5f808284036101408112156158b7575f80fd5b610120808212156158c6575f80fd5b84935083013590506158d781615890565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612d9d57612d9d6158e2565b5f60208284031215615926575f80fd5b5051919050565b5f5b8381101561594757818101518382015260200161592f565b50505f910152565b602081525f825180602084015261596d81604085016020870161592d565b601f01601f19169190910160400192915050565b5f8261599b57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615a43575f80fd5b81356125e881615890565b5f808335601e19843603018112615a63575f80fd5b8301803591506001600160401b03821115615a7c575f80fd5b6020019150600581901b3603821315612591575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615abb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615afb57615afb615ac5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615b2957615b29615ac5565b604052919050565b5f6001600160401b03821115615b4957615b49615ac5565b50601f01601f191660200190565b5f60608236031215615b67575f80fd5b615b6f615ad9565b823581526020615b80818501615708565b8183015260408401356001600160401b03811115615b9c575f80fd5b840136601f820112615bac575f80fd5b8035615bbf615bba82615b31565b615b01565b8181523684838501011115615bd2575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615abb81846020870161592d565b80820180821115610a6757610a676158e2565b5f63ffffffff808316818103615c2a57615c2a6158e2565b6001019392505050565b8082028115828204841417610a6757610a676158e2565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b03818116838216019080821115612d9d57612d9d6158e2565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615d1c57607f821691505b602082108103615d3a57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454615d5281615d08565b806020870152604060018084165f8114615d735760018114615d8f57615dbc565b60ff19851660408a0152604084151560051b8a01019550615dbc565b895f5260205f205f5b85811015615db35781548b8201860152908301908801615d98565b8a016040019650505b509398975050505050505050565b805161562281615602565b5f8060408385031215615de6575f80fd5b82516001600160401b0380821115615dfc575f80fd5b9084019060608287031215615e0f575f80fd5b615e17615ad9565b82518152602080840151615e2a81615890565b82820152604084015183811115615e3f575f80fd5b80850194505087601f850112615e53575f80fd5b83519250615e63615bba84615b31565b8381528882858701011115615e76575f80fd5b615e858483830184880161592d565b80604084015250819550615e9a818801615dca565b9450505050509250929050565b81810381811115610a6757610a676158e2565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615fa2575f80fd5b8301803591506001600160401b03821115615fbb575f80fd5b602001915036819003821315612591575f80fd5b6001600160401b03818116838216028082169190828114615ff257615ff26158e2565b505092915050565b5f6001600160401b03808316818103615c2a57615c2a6158e2565b601f821115611fc457805f5260205f20601f840160051c8101602085101561603a5750805b601f840160051c820191505b81811015610b06575f8155600101616046565b81516001600160401b0381111561607257616072615ac5565b616086816160808454615d08565b84616015565b602080601f8311600181146160b9575f84156160a25750858301515b5f19600386901b1c1916600185901b178555616110565b5f85815260208120601f198616915b828110156160e7578886015182559484019460019091019084016160c8565b508582101561610457878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215616128575f80fd5b6125e88261581a565b5f60208284031215616141575f80fd5b813560ff811681146125e8575f80fd5b5f60208284031215616161575f80fd5b81516125e881615602565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516161c181604e86016020890161592d565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161671538038061671583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6165c88061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd3660046158e2565b61043a565b005b6101d26101e236600461591d565b61089d565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b61021961021436600461591d565b610a56565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004615934565b610a6c565b6101d261026e36600461594d565b610b0c565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004615975565b610f9c565b6102b66102b13660046159d9565b61157f565b6040519081526020016101fd565b6102196102d236600461591d565b611598565b6102b65f81565b6101d26102ec3660046158e2565b6115ac565b6101ef603081565b6101d261030736600461591d565b6117c8565b6101d261031a36600461594d565b6118ce565b6101d261032d36600461591d565b611ab1565b6102b66103403660046159f2565b611d94565b6101d2610353366004615934565b611dc0565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c36600461591d565b611f36565b6101d261039f36600461591d565b6121a9565b6101ef601481565b6103bf6103ba36600461591d565b612284565b6040516101fd9190615a26565b6102196202a30081565b6102b66103e436600461591d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615ae6565b61234c565b6101d2610435366004615b5f565b612381565b5f8381525f8051602061655c83398151915260205260408082208151610100810190925280545f805160206164fc83398151915293929190829060ff16600481111561048857610488615a12565b600481111561049957610499615a12565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61051d82612284565b905060028351600481111561053457610534615a12565b146105865760405162461bcd60e51b815260206004820152602a60248201525f8051602061651c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105eb5760405162461bcd60e51b815260206004820152603360248201525f8051602061651c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161057d565b6003835280515f90600290600581111561060757610607615a12565b0361065e57861561061f5761061c8387612460565b90505b5f846060015183608001516106349190615bb1565b905061064084826126fc565b506001600160401b0390811660e0870152421660a086015250610692565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106c5866060015161157f565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b81526004016106f99796959493929190615bd1565b602060405180830381865afa158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190615c0f565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561077757610777615a12565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088b916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061659c8339815191526020526040808220815160e0810190925280545f8051602061653c83398151915293929190829060ff1660058111156108ea576108ea615a12565b60058111156108fb576108fb615a12565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096a5761096a615a12565b146109cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb6109f48584606001515f612853565b6040518263ffffffff1660e01b8152600401610a109190615c48565b6020604051808303815f875af1158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190615c0f565b50505050565b5f610a6664e8d4a5100083615c7a565b92915050565b5f805160206164fc8339815191525f80610a85846128aa565b91509150610a9282612bc8565b610a9c5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610aca57610aca615a12565b03610aef575f83815260088501602052604081208054919055610aed8282612c03565b505b610b0581610b00846040015161157f565b612c79565b5050505050565b5f8181525f8051602061655c83398151915260205260408082208151610100810190925280545f805160206164fc83398151915293929190829060ff166004811115610b5a57610b5a615a12565b6004811115610b6b57610b6b615a12565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf090612284565b9050600182516004811115610c0757610c07615a12565b14610c705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161057d565b600381516005811115610c8557610c85615a12565b03610dfd576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610ce957610ce9615a12565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1257610e12615a12565b03610e2057610b0584612c9c565b5f610e2a86612e99565b90505f80610e3b836040015161305f565b509150915081856040015114610e635760405162461bcd60e51b815260040161057d90615c99565b806001600160401b031684606001516001600160401b03161015610ed45760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161057d565b806001600160401b03168560c001516001600160401b03161115610f0a5760405162461bcd60e51b815260040161057d90615ce3565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061653c8339815191529060ff16156110395760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a09190615c0f565b8360200135146111025760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161057d565b306111136060850160408601615d2c565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161057d565b5f6111936060850185615d47565b905090505f805b828163ffffffff161015611483575f6111b66060880188615d47565b8363ffffffff168181106111cc576111cc615d8c565b90506020028101906111de9190615da0565b6111e790615e50565b80515f818152600888016020526040902054919250901561125f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161057d565b5f6002895f01358560405160200161128e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a891615ee7565b602060405180830381855afa1580156112c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e69190615c0f565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561137257611372615a12565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611425911686615ef8565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147c90615f0b565b905061119a565b50600483018190555f61149585612e99565b90505f6114a5826040015161329a565b90505f6114b18861340c565b9050816002826040516114c49190615ee7565b602060405180830381855afa1580156114df573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115029190615c0f565b146115665760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161057d565b5050506009909201805460ff1916600117905550505050565b5f610a666001600160401b03831664e8d4a51000615f2d565b5f6115a282612284565b6080015192915050565b5f805160206164fc8339815191525f6115c4856138a5565b90506115cf85612bc8565b6115da575050505050565b5f8581526005830160205260409020546001600160a01b031633146116115760405162461bcd60e51b815260040161057d90615f44565b5f85815260058301602052604090205460a082015161164091600160b01b90046001600160401b031690615f96565b6001600160401b03168160c001516001600160401b031610156116c15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161057d565b8315610b05575f6116d28685612460565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117299061157f565b60a085015160c08601516040516001600160e01b031960e086901b16815261175d939291829188905f908190600401615bd1565b602060405180830381865afa158015611778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c9190615c0f565b5f878152600885016020526040812080549091906117bb908490615ef8565b9091555050505050505050565b5f805160206164fc8339815191525f6117e083612284565b90506004815160058111156117f7576117f7615a12565b146118615760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161057d565b5f8381526005830160205260409020546001600160a01b031633146118985760405162461bcd60e51b815260040161057d90615f44565b5f83815260088301602090815260408083208054908490556005860190925290912054610a50906001600160a01b031682612c03565b6118d6613b20565b5f8181525f8051602061655c83398151915260205260408082208151610100810190925280545f805160206164fc83398151915293929190829060ff16600481111561192457611924615a12565b600481111561193557611935615a12565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119b185612e99565b90505f806119c2836040015161305f565b5091509150818460400151146119ea5760405162461bcd60e51b815260040161057d90615c99565b806001600160401b03168460e001516001600160401b03161115611a205760405162461bcd60e51b815260040161057d90615ce3565b600384516004811115611a3557611a35615a12565b14611a895760405162461bcd60e51b815260206004820152603160248201525f8051602061651c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161057d565b611a9286612c9c565b5050505050611aad60015f8051602061657c83398151915255565b5050565b5f8181525f8051602061655c83398151915260205260408082208151610100810190925280545f805160206164fc83398151915293929190829060ff166004811115611aff57611aff615a12565b6004811115611b1057611b10615a12565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611b9482612284565b9050600481516005811115611bab57611bab615a12565b14611c0e5760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161057d565b600283516004811115611c2357611c23615a12565b1480611c415750600383516004811115611c3f57611c3f615a12565b145b611c9d5760405162461bcd60e51b815260206004820152602760248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526632b3b0ba34b7b760c91b606482015260840161057d565b600283516004811115611cb257611cb2615a12565b03611d8b578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611cea856060015161157f565b60a0808501516080880151918801515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611d3b969593926001600160401b0390921691908190600401615bd1565b602060405180830381865afa158015611d56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d7a9190615c0f565b5f8681526007860160205260409020555b610b0585612c9c565b5f611d9d613b20565b611da8833384613b6a565b9050610a6660015f8051602061657c83398151915255565b5f8051602061653c8339815191525f611dd883612e99565b90505f80611de98360400151613f24565b9150915080611e4b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057d565b60015f83815260078601602052604090205460ff166005811115611e7157611e71615a12565b14611e8e5760405162461bcd60e51b815260040161057d90615fb6565b5f8281526006850160205260408120611ea691615832565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061655c83398151915260205260408082208151610100810190925280545f805160206164fc83398151915293929190829060ff166004811115611f8457611f84615a12565b6004811115611f9557611f95615a12565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561201c5761201c615a12565b148061203a575060038151600481111561203857612038615a12565b145b61208e5760405162461bcd60e51b815260206004820152603260248201525f8051602061651c833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161057d565b5f61209c8260400151612284565b905080606001516001600160401b03165f036121205760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb61214d846040015184606001518560800151612853565b6040518263ffffffff1660e01b81526004016121699190615c48565b6020604051808303815f875af1158015612185573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190615c0f565b5f8181525f8051602061659c83398151915260205260409020545f8051602061653c8339815191529060019060ff1660058111156121e9576121e9615a12565b146122065760405162461bcd60e51b815260040161057d90615fb6565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161223f9190600401616039565b6020604051808303815f875af115801561225b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227f9190615c0f565b505050565b61228c615869565b5f8281525f8051602061659c833981519152602052604090819020815160e0810190925280545f8051602061653c833981519152929190829060ff1660058111156122d9576122d9615a12565b60058111156122ea576122ea615a12565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f612355613b20565b612361858585856140c5565b905061237960015f8051602061657c83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806123ca575080546001600160401b03808416911610155b156123e85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561241384846143b1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124ab573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124d291908101906160ce565b91509150806125355760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061259c9190615c0f565b8251146126005760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057d565b60208201516001600160a01b0316156126765760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057d565b5f8061268584604001516143cb565b915091508187146126f25760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057d565b9695505050505050565b5f8281525f8051602061659c833981519152602052604081206002015481905f8051602061653c83398151915290600160801b90046001600160401b031661274485826145a3565b5f61274e876147b1565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61279e8a858b612853565b6040518263ffffffff1660e01b81526004016127ba9190615c48565b6020604051808303815f875af11580156127d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127fa9190615c0f565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6128b3615869565b5f8051602061653c8339815191525f6128cb85612e99565b90505f806128dc8360400151613f24565b9150915080156129415760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057d565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561297257612972615a12565b600581111561298357612983615a12565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156129f2576129f2615a12565b1480612a105750600181516005811115612a0e57612a0e615a12565b145b612a6f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161057d565b600381516005811115612a8457612a84615a12565b03612a925760048152612a97565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612adc57612adc615a12565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b9057612b90615a12565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f805160206164dc83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c5e575f80fd5b505af1158015612c70573d5f803e3d5ffd5b50505050505050565b5f805160206164dc83398151915254611aad906001600160a01b03168383614841565b5f8181525f8051602061655c83398151915260205260408082208151610100810190925280545f805160206164fc83398151915293929190829060ff166004811115612cea57612cea615a12565b6004811115612cfb57612cfb615a12565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612def90600160a01b900461ffff1684615f2d565b612df99190615c7a565b905080856008015f8581526020019081526020015f205f828254612e1d9190615ef8565b909155505f9050612e2e82846161a0565b9050612e3e856020015182612c03565b612e538560200151610b00876060015161157f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612efd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f2491908101906160ce565b9150915080612f845760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057d565b815115612fe55760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057d565b60208201516001600160a01b0316156130585760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057d565b5092915050565b5f805f83516036146130835760405162461bcd60e51b815260040161057d906161b3565b5f805b60028110156130d25761309a8160016161a0565b6130a5906008615f2d565b61ffff168682815181106130bb576130bb615d8c565b016020015160f81c901b9190911790600101613086565b5061ffff8116156130f55760405162461bcd60e51b815260040161057d906161fc565b5f805b60048110156131505761310c8160036161a0565b613117906008615f2d565b63ffffffff1687613129836002615ef8565b8151811061313957613139615d8c565b016020015160f81c901b91909117906001016130f8565b5063ffffffff81166004146131775760405162461bcd60e51b815260040161057d9061623f565b5f805b60208110156131cc5761318e81601f6161a0565b613199906008615f2d565b886131a5836006615ef8565b815181106131b5576131b5615d8c565b016020015160f81c901b919091179060010161317a565b505f805b600881101561322b576131e48160076161a0565b6131ef906008615f2d565b6001600160401b031689613204836026615ef8565b8151811061321457613214615d8c565b016020015160f81c901b91909117906001016131d0565b505f805b600881101561328a576132438160076161a0565b61324e906008615f2d565b6001600160401b03168a61326383602e615ef8565b8151811061327357613273615d8c565b016020015160f81c901b919091179060010161322f565b5091989097509095509350505050565b5f81516026146132bc5760405162461bcd60e51b815260040161057d906161b3565b5f805b600281101561330b576132d38160016161a0565b6132de906008615f2d565b61ffff168482815181106132f4576132f4615d8c565b016020015160f81c901b91909117906001016132bf565b5061ffff81161561332e5760405162461bcd60e51b815260040161057d906161fc565b5f805b6004811015613389576133458160036161a0565b613350906008615f2d565b63ffffffff1685613362836002615ef8565b8151811061337257613372615d8c565b016020015160f81c901b9190911790600101613331565b5063ffffffff8116156133ae5760405162461bcd60e51b815260040161057d9061623f565b5f805b6020811015613403576133c581601f6161a0565b6133d0906008615f2d565b866133dc836006615ef8565b815181106133ec576133ec615d8c565b016020015160f81c901b91909117906001016133b1565b50949350505050565b60605f61341b83830184615d47565b61342791506058615f2d565b61343290605c615ef8565b6001600160401b0381111561344957613449615dbe565b6040519080825280601f01601f191660200182016040528015613473576020820181803683370190505b5090505f5b60208110156134c8578335816020811061349457613494615d8c565b1a60f81b8282815181106134aa576134aa615d8c565b60200101906001600160f81b03191690815f1a905350600101613478565b505f5b602081101561352857836020013581602081106134ea576134ea615d8c565b1a60f81b826134fa836020615ef8565b8151811061350a5761350a615d8c565b60200101906001600160f81b03191690815f1a9053506001016134cb565b505f5b600481101561358b5761353f8160036161a0565b61354a906008615f2d565b6014901c60f81b8261355d836040615ef8565b8151811061356d5761356d615d8c565b60200101906001600160f81b03191690815f1a90535060010161352b565b505f61359d6060850160408601615d2c565b60601b90505f5b60148110156135fd578181601481106135bf576135bf615d8c565b1a60f81b836135cf836044615ef8565b815181106135df576135df615d8c565b60200101906001600160f81b03191690815f1a9053506001016135a4565b505f61360c6060860186615d47565b905090505f5b6004811015613677576136268160036161a0565b613631906008615f2d565b63ffffffff8316901c60f81b84613649836058615ef8565b8151811061365957613659615d8c565b60200101906001600160f81b03191690815f1a905350600101613612565b505f5b6136876060870187615d47565b905081101561389b575f61369c826058615f2d565b6136a790605c615ef8565b90505f5b6020811015613732576136c16060890189615d47565b848181106136d1576136d1615d8c565b90506020028101906136e39190615da0565b3581602081106136f5576136f5615d8c565b1a60f81b866137048385615ef8565b8151811061371457613714615d8c565b60200101906001600160f81b03191690815f1a9053506001016136ab565b505f5b60088110156137e7576137498160076161a0565b613754906008615f2d565b61376160608a018a615d47565b8581811061377157613771615d8c565b90506020028101906137839190615da0565b6137949060408101906020016159d9565b6001600160401b0316901c60f81b86826137af856020615ef8565b6137b99190615ef8565b815181106137c9576137c9615d8c565b60200101906001600160f81b03191690815f1a905350600101613735565b505f5b6030811015613891576138006060890189615d47565b8481811061381057613810615d8c565b90506020028101906138229190615da0565b613830906040810190616286565b8281811061384057613840615d8c565b9050013560f81c60f81b86828460286138599190615ef8565b6138639190615ef8565b8151811061387357613873615d8c565b60200101906001600160f81b03191690815f1a9053506001016137ea565b505060010161367a565b5091949350505050565b6138ad615869565b5f8281525f8051602061659c8339815191526020526040808220815160e0810190925280545f8051602061653c83398151915293929190829060ff1660058111156138fa576138fa615a12565b600581111561390b5761390b615a12565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561397d5761397d615a12565b146139d95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613a1d57613a1d615a12565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613ac985826126fc565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061657c833981519152805460011901613b5157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061657c83398151915255565b5f5f805160206164fc83398151915281613b86610214856148a0565b90505f613b9287612284565b9050613b9d87612bc8565b613bfa5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161057d565b600281516005811115613c0f57613c0f615a12565b14613c6e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161057d565b5f828260800151613c7f9190615f96565b60048501546040840151919250613ca1916001600160401b03909116906162c8565b6001600160401b0316816001600160401b03161115613d205760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161057d565b5f80613d2c8a846126fc565b915091505f8a83604051602001613d5a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613df557613df5615a12565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613f475760405162461bcd60e51b815260040161057d906161b3565b5f805b6002811015613f9657613f5e8160016161a0565b613f69906008615f2d565b61ffff16858281518110613f7f57613f7f615d8c565b016020015160f81c901b9190911790600101613f4a565b5061ffff811615613fb95760405162461bcd60e51b815260040161057d906161fc565b5f805b600481101561401457613fd08160036161a0565b613fdb906008615f2d565b63ffffffff1686613fed836002615ef8565b81518110613ffd57613ffd615d8c565b016020015160f81c901b9190911790600101613fbc565b5063ffffffff811660031461403b5760405162461bcd60e51b815260040161057d9061623f565b5f805b60208110156140905761405281601f6161a0565b61405d906008615f2d565b87614069836006615ef8565b8151811061407957614079615d8c565b016020015160f81c901b919091179060010161403e565b505f866026815181106140a5576140a5615d8c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206164fc8339815191529061ffff8616101561414c5760405162461bcd60e51b815260206004820152602b60248201525f8051602061651c83398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161057d565b61271061ffff861611156141a45760405162461bcd60e51b815260206004820152602c60248201525f8051602061651c83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161057d565b60028101546001600160401b03908116908516101561421d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161057d565b80548310156142805760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161057d565b80600101548311156142e75760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161057d565b5f6142f1846148a0565b90505f6142fd82610a56565b90505f61430a89836148c3565b9050604051806060016040528061431e3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6143b9614e79565b6143c282614ec4565b611aad81614f39565b5f808251602e146143ee5760405162461bcd60e51b815260040161057d906161b3565b5f805b600281101561443d576144058160016161a0565b614410906008615f2d565b61ffff1685828151811061442657614426615d8c565b016020015160f81c901b91909117906001016143f1565b5061ffff8116156144605760405162461bcd60e51b815260040161057d906161fc565b5f805b60048110156144bb576144778160036161a0565b614482906008615f2d565b63ffffffff1686614494836002615ef8565b815181106144a4576144a4615d8c565b016020015160f81c901b9190911790600101614463565b5063ffffffff81166005146144e25760405162461bcd60e51b815260040161057d9061623f565b5f805b6020811015614537576144f981601f6161a0565b614504906008615f2d565b87614510836006615ef8565b8151811061452057614520615d8c565b016020015160f81c901b91909117906001016144e5565b505f805b60088110156145965761454f8160076161a0565b61455a906008615f2d565b6001600160401b03168861456f836026615ef8565b8151811061457f5761457f615d8c565b016020015160f81c901b919091179060010161453b565b5090969095509350505050565b5f8051602061653c8339815191525f6001600160401b0380841690851611156145d7576145d08385615bb1565b90506145e4565b6145e18484615bb1565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614646575060018401548151614642916001600160401b031690615ef8565b8210155b1561466c576001600160401b03831660608201528181526040810151602082015261468b565b828160600181815161467e9190615f96565b6001600160401b03169052505b606081015161469b9060646162c8565b602082015160018601546001600160401b0392909216916146c69190600160401b900460ff16615f2d565b101561472a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161057d565b856001600160401b0316816040018181516147459190615ef8565b9052506040810180516001600160401b03871691906147659083906161a0565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061659c8339815191526020526040812060020180545f8051602061653c83398151915291600160401b9091046001600160401b03169060086147fb836162f3565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b0383811660248301526044820183905261227f91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614fda565b5f610a66825f805160206164dc833981519152546001600160a01b03169061503b565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661494e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161057d565b5f8051602061653c8339815191524261496d60408601602087016159d9565b6001600160401b0316116149df5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161057d565b6149ef60408501602086016159d9565b6001600160401b0316614a056202a30042615ef8565b11614a785760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161057d565b8335614ad05760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161057d565b83355f90815260088201602052604090205415614b405760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057d565b6030614b4f6040860186616286565b905014614bb45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057d565b614bbe835f6145a3565b5f80614c576040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614c0291906159d9565b6001600160401b03168152602001614c1d60408a018a616286565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061519d565b5f82815260068601602052604090209193509150614c758282616352565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614cb3908590600401615c48565b6020604051808303815f875af1158015614ccf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614cf39190615c0f565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614d6b57614d6b615a12565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614e4b918e01908e016159d9565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614ec257604051631afcd79f60e31b815260040160405180910390fd5b565b614ecc614e79565b614ed5816152a1565b614edd6152ba565b614f3660608201356080830135614efa60c0850160a086016159d9565b614f0a60e0860160c08701616411565b61ffff16614f1f610100870160e0880161642a565b614f3161012088016101008901615d2c565b6152ca565b50565b614f41614e79565b5f805160206164dc8339815191526001600160a01b038216614fba5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161057d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f614fee6001600160a01b03841683615552565b905080515f14158015615012575080806020019051810190615010919061644a565b155b1561227f57604051635274afe760e01b81526001600160a01b038416600482015260240161057d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015615081573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150a59190615c0f565b90506150bc6001600160a01b03851633308661555f565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015615100573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906151249190615c0f565b905081811161518a5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161057d565b61519482826161a0565b95945050505050565b5f60608260800151516030146152075760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057d565b5f806001855f015186602001518760400151886080015189606001516040516020016152399796959493929190616465565b604051602081830303815290604052905060028160405161525a9190615ee7565b602060405180830381855afa158015615275573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152989190615c0f565b94909350915050565b6152a9614e79565b6152b1615598565b614f36816155a0565b6152c2614e79565b614ec261571b565b6152d2614e79565b5f805160206164fc8339815191528361533e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161057d565b6127108411156153a45760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161057d565b8587111561540c5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161057d565b5f8360ff16116154795760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161057d565b600a60ff841611156154eb5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161057d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606128a383835f615723565b6040516001600160a01b038481166024830152838116604483015260648201839052610a509186918216906323b872dd9060840161486e565b614ec2614e79565b6155a8614e79565b80355f8051602061653c83398151915290815560146155cd606084016040850161642a565b60ff16111561563a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161057d565b5f61564b606084016040850161642a565b60ff16116156b35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161057d565b6156c3606083016040840161642a565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556156f460408301602084016159d9565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613b57614e79565b6060814710156157485760405163cd78605960e01b815230600482015260240161057d565b5f80856001600160a01b031684866040516157639190615ee7565b5f6040518083038185875af1925050503d805f811461579d576040519150601f19603f3d011682016040523d82523d5f602084013e6157a2565b606091505b50915091506126f28683836060826157c2576157bd82615809565b6128a3565b81511580156157d957506001600160a01b0384163b155b1561580257604051639996b31560e01b81526001600160a01b038516600482015260240161057d565b50806128a3565b8051156158195780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461583e90616001565b5f825580601f1061584d575050565b601f0160209004905f5260205f2090810190614f3691906158a5565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156158b9575f81556001016158a6565b5090565b8015158114614f36575f80fd5b803563ffffffff811681146158dd575f80fd5b919050565b5f805f606084860312156158f4575f80fd5b833592506020840135615906816158bd565b9150615914604085016158ca565b90509250925092565b5f6020828403121561592d575f80fd5b5035919050565b5f60208284031215615944575f80fd5b6128a3826158ca565b5f806040838503121561595e575f80fd5b615967836158ca565b946020939093013593505050565b5f8060408385031215615986575f80fd5b82356001600160401b0381111561599b575f80fd5b8301608081860312156159ac575f80fd5b91506159ba602084016158ca565b90509250929050565b80356001600160401b03811681146158dd575f80fd5b5f602082840312156159e9575f80fd5b6128a3826159c3565b5f8060408385031215615a03575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110615a4957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151615a8460608401826001600160401b03169052565b506080830151615a9f60808401826001600160401b03169052565b5060a0830151615aba60a08401826001600160401b03169052565b5060c083015161305860c08401826001600160401b03169052565b803561ffff811681146158dd575f80fd5b5f805f8060808587031215615af9575f80fd5b84356001600160401b03811115615b0e575f80fd5b850160608188031215615b1f575f80fd5b9350615b2d60208601615ad5565b9250615b3b604086016159c3565b9396929550929360600135925050565b6001600160a01b0381168114614f36575f80fd5b5f80828403610140811215615b72575f80fd5b61012080821215615b81575f80fd5b8493508301359050615b9281615b4b565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561305857613058615b9d565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615c1f575f80fd5b5051919050565b5f5b83811015615c40578181015183820152602001615c28565b50505f910152565b602081525f8251806020840152615c66816040850160208701615c26565b601f01601f19169190910160400192915050565b5f82615c9457634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615d3c575f80fd5b81356128a381615b4b565b5f808335601e19843603018112615d5c575f80fd5b8301803591506001600160401b03821115615d75575f80fd5b6020019150600581901b360382131561284c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615db4575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615df457615df4615dbe565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615e2257615e22615dbe565b604052919050565b5f6001600160401b03821115615e4257615e42615dbe565b50601f01601f191660200190565b5f60608236031215615e60575f80fd5b615e68615dd2565b823581526020615e798185016159c3565b8183015260408401356001600160401b03811115615e95575f80fd5b840136601f820112615ea5575f80fd5b8035615eb8615eb382615e2a565b615dfa565b8181523684838501011115615ecb575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615db4818460208701615c26565b80820180821115610a6657610a66615b9d565b5f63ffffffff808316818103615f2357615f23615b9d565b6001019392505050565b8082028115828204841417610a6657610a66615b9d565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561305857613058615b9d565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c9082168061601557607f821691505b60208210810361603357634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461604b81616001565b806020870152604060018084165f811461606c5760018114616088576160b5565b60ff19851660408a0152604084151560051b8a010195506160b5565b895f5260205f205f5b858110156160ac5781548b8201860152908301908801616091565b8a016040019650505b509398975050505050505050565b80516158dd816158bd565b5f80604083850312156160df575f80fd5b82516001600160401b03808211156160f5575f80fd5b9084019060608287031215616108575f80fd5b616110615dd2565b8251815260208084015161612381615b4b565b82820152604084015183811115616138575f80fd5b80850194505087601f85011261614c575f80fd5b8351925061615c615eb384615e2a565b838152888285870101111561616f575f80fd5b61617e84838301848801615c26565b806040840152508195506161938188016160c3565b9450505050509250929050565b81810381811115610a6657610a66615b9d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e1984360301811261629b575f80fd5b8301803591506001600160401b038211156162b4575f80fd5b60200191503681900382131561284c575f80fd5b6001600160401b038181168382160280821691908281146162eb576162eb615b9d565b505092915050565b5f6001600160401b03808316818103615f2357615f23615b9d565b601f82111561227f57805f5260205f20601f840160051c810160208510156163335750805b601f840160051c820191505b81811015610b05575f815560010161633f565b81516001600160401b0381111561636b5761636b615dbe565b61637f816163798454616001565b8461630e565b602080601f8311600181146163b2575f841561639b5750858301515b5f19600386901b1c1916600185901b178555616409565b5f85815260208120601f198616915b828110156163e0578886015182559484019460019091019084016163c1565b50858210156163fd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215616421575f80fd5b6128a382615ad5565b5f6020828403121561643a575f80fd5b813560ff811681146128a3575f80fd5b5f6020828403121561645a575f80fd5b81516128a3816158bd565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516164ba81604e860160208901615c26565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -761,6 +761,27 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } +// EndDelegationCompletedValidator is a paid mutator transaction binding the contract method 0x9dde029a. +// +// Solidity: function endDelegationCompletedValidator(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) EndDelegationCompletedValidator(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "endDelegationCompletedValidator", delegationID) +} + +// EndDelegationCompletedValidator is a paid mutator transaction binding the contract method 0x9dde029a. +// +// Solidity: function endDelegationCompletedValidator(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) EndDelegationCompletedValidator(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.EndDelegationCompletedValidator(&_ERC20TokenStakingManager.TransactOpts, delegationID) +} + +// EndDelegationCompletedValidator is a paid mutator transaction binding the contract method 0x9dde029a. +// +// Solidity: function endDelegationCompletedValidator(bytes32 delegationID) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) EndDelegationCompletedValidator(delegationID [32]byte) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.EndDelegationCompletedValidator(&_ERC20TokenStakingManager.TransactOpts, delegationID) +} + // Initialize is a paid mutator transaction binding the contract method 0xf09969ae. // // Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings, address token) returns() diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index dc7098378..147918302 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -82,8 +82,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516160e93803806160e983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615f9c8061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004615391565b610561565b005b3480156101df575f80fd5b506101d26101ee3660046153cc565b6109f2565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d26102383660046153e3565b610bab565b348015610248575f80fd5b5061025c6102573660046153cc565b610c88565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc366004615421565b610c9e565b604051908152602001610215565b3480156102fa575f80fd5b506101d2610309366004615475565b610cd2565b348015610319575f80fd5b506101d261032836600461548e565b610d72565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d26103703660046154b6565b611202565b348015610380575f80fd5b506102e161038f366004615504565b6117e5565b34801561039f575f80fd5b5061025c6103ae3660046153cc565b6117fe565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e0366004615391565b611812565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d26104133660046153cc565b611a55565b348015610423575f80fd5b506101d261043236600461548e565b611b5b565b348015610442575f80fd5b506101d2610451366004615475565b611d3e565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a3660046153cc565b611eb4565b34801561049a575f80fd5b506101d26104a93660046153cc565b612127565b6102e16104bc3660046153cc565b612202565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef3660046153cc565b612233565b6040516102159190615531565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e16105313660046153cc565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020615f3083398151915260205260408082208151610100810190925280545f80516020615ed083398151915293929190829060ff1660048111156105af576105af61551d565b60048111156105c0576105c061551d565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61064482612233565b905060028351600481111561065b5761065b61551d565b146106ad5760405162461bcd60e51b815260206004820152602a60248201525f80516020615ef08339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146107125760405162461bcd60e51b815260206004820152603360248201525f80516020615ef08339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106a4565b6003835280515f90600290600581111561072e5761072e61551d565b036107855786156107465761074383876122fb565b90505b5f8460600151836080015161075b91906155f4565b90506107678482612597565b506001600160401b0390811660e0870152421660a0860152506107b9565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56107ec86606001516117e5565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610869573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088d9190615614565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108cc576108cc61551d565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109e0916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020615f708339815191526020526040808220815160e0810190925280545f80516020615f1083398151915293929190829060ff166005811115610a3f57610a3f61551d565b6005811115610a5057610a5061551d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abf57610abf61551d565b14610b245760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106a4565b6005600160991b016001600160a01b031663ee5b48eb610b498584606001515f6126ee565b6040518263ffffffff1660e01b8152600401610b65919061564d565b6020604051808303815f875af1158015610b81573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba59190615614565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf4575080546001600160401b03808416911610155b15610c125760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c3c8361273d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9864e8d4a510008361567f565b92915050565b5f610ca7612751565b610cb384848434612788565b9050610ccb60015f80516020615f5083398151915255565b9392505050565b5f80516020615ed08339815191525f80610ceb84612a7c565b91509150610cf882612d9a565b610d025750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d3057610d3061551d565b03610d55575f83815260088501602052604081208054919055610d538282612dd5565b505b610d6b81610d6684604001516117e5565b612e3b565b5050505050565b5f8181525f80516020615f3083398151915260205260408082208151610100810190925280545f80516020615ed083398151915293929190829060ff166004811115610dc057610dc061551d565b6004811115610dd157610dd161551d565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e5690612233565b9050600182516004811115610e6d57610e6d61551d565b14610ed65760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106a4565b600381516005811115610eeb57610eeb61551d565b03611063576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610f4f57610f4f61551d565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b6004815160058111156110785761107861551d565b0361108657610d6b84612e4e565b5f6110908661304b565b90505f806110a18360400151613211565b5091509150818560400151146110c95760405162461bcd60e51b81526004016106a49061569e565b806001600160401b031684606001516001600160401b0316101561113a5760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106a4565b806001600160401b03168560c001516001600160401b031611156111705760405162461bcd60e51b81526004016106a4906156e8565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615f108339815191529060ff161561129f5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106a4565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113069190615614565b8360200135146113685760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106a4565b306113796060850160408601615745565b6001600160a01b0316146113eb5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106a4565b5f6113f96060850185615760565b905090505f805b828163ffffffff1610156116e9575f61141c6060880188615760565b8363ffffffff16818110611432576114326157a5565b905060200281019061144491906157b9565b61144d90615869565b80515f81815260088801602052604090205491925090156114c55760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106a4565b5f6002895f0135856040516020016114f492919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150e91615900565b602060405180830381855afa158015611529573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061154c9190615614565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d8576115d861551d565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161168b911686615911565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116e290615924565b9050611400565b50600483018190555f6116fb8561304b565b90505f61170b826040015161344c565b90505f611717886135be565b90508160028260405161172a9190615900565b602060405180830381855afa158015611745573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906117689190615614565b146117cc5760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106a4565b5050506009909201805460ff1916600117905550505050565b5f610c986001600160401b03831664e8d4a51000615946565b5f61180882612233565b6080015192915050565b5f80516020615ed08339815191525f61182a85613a57565b905061183585612d9a565b611840575050505050565b5f8581526005830160205260409020546001600160a01b031633146118775760405162461bcd60e51b81526004016106a49061595d565b5f85815260058301602052604090205460a08201516118a691600160b01b90046001600160401b0316906159af565b6001600160401b03168160c001516001600160401b031610156119275760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106a4565b8315610d6b575f61193886856122fb565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198f906117e5565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611a05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a299190615614565b5f87815260088501602052604081208054909190611a48908490615911565b9091555050505050505050565b5f80516020615ed08339815191525f611a6d83612233565b9050600481516005811115611a8457611a8461551d565b14611aee5760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106a4565b5f8381526005830160205260409020546001600160a01b03163314611b255760405162461bcd60e51b81526004016106a49061595d565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba5906001600160a01b031682612dd5565b611b63612751565b5f8181525f80516020615f3083398151915260205260408082208151610100810190925280545f80516020615ed083398151915293929190829060ff166004811115611bb157611bb161551d565b6004811115611bc257611bc261551d565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c3e8561304b565b90505f80611c4f8360400151613211565b509150915081846040015114611c775760405162461bcd60e51b81526004016106a49061569e565b806001600160401b03168460e001516001600160401b03161115611cad5760405162461bcd60e51b81526004016106a4906156e8565b600384516004811115611cc257611cc261551d565b14611d165760405162461bcd60e51b815260206004820152603160248201525f80516020615ef08339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106a4565b611d1f86612e4e565b5050505050611d3a60015f80516020615f5083398151915255565b5050565b5f80516020615f108339815191525f611d568361304b565b90505f80611d678360400151613cd2565b9150915080611dc95760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106a4565b60015f83815260078601602052604090205460ff166005811115611def57611def61551d565b14611e0c5760405162461bcd60e51b81526004016106a4906159cf565b5f8281526006850160205260408120611e24916152e6565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020615f3083398151915260205260408082208151610100810190925280545f80516020615ed083398151915293929190829060ff166004811115611f0257611f0261551d565b6004811115611f1357611f1361551d565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611f9a57611f9a61551d565b1480611fb85750600381516004811115611fb657611fb661551d565b145b61200c5760405162461bcd60e51b815260206004820152603260248201525f80516020615ef0833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106a4565b5f61201a8260400151612233565b905080606001516001600160401b03165f0361209e5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106a4565b6005600160991b016001600160a01b031663ee5b48eb6120cb8460400151846060015185608001516126ee565b6040518263ffffffff1660e01b81526004016120e7919061564d565b6020604051808303815f875af1158015612103573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6b9190615614565b5f8181525f80516020615f7083398151915260205260409020545f80516020615f108339815191529060019060ff1660058111156121675761216761551d565b146121845760405162461bcd60e51b81526004016106a4906159cf565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916121bd9190600401615a4c565b6020604051808303815f875af11580156121d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fd9190615614565b505050565b5f61220b612751565b612216823334613e73565b905061222e60015f80516020615f5083398151915255565b919050565b61223b61531d565b5f8281525f80516020615f70833981519152602052604090819020815160e0810190925280545f80516020615f10833981519152929190829060ff1660058111156122885761228861551d565b60058111156122995761229961551d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612346573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261236d9190810190615ae1565b91509150806123d05760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106a4565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612413573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124379190615614565b82511461249b5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106a4565b60208201516001600160a01b0316156125115760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106a4565b5f80612520846040015161422a565b9150915081871461258d5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106a4565b9695505050505050565b5f8281525f80516020615f70833981519152602052604081206002015481905f80516020615f1083398151915290600160801b90046001600160401b03166125df8582614402565b5f6125e987614610565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6126398a858b6126ee565b6040518263ffffffff1660e01b8152600401612655919061564d565b6020604051808303815f875af1158015612671573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126959190615614565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6127456146a0565b61274e816146eb565b50565b5f80516020615f5083398151915280546001190161278257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020615ed08339815191529061ffff8616101561280f5760405162461bcd60e51b815260206004820152602b60248201525f80516020615ef083398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106a4565b61271061ffff861611156128675760405162461bcd60e51b815260206004820152602c60248201525f80516020615ef083398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106a4565b60028101546001600160401b0390811690851610156128e05760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106a4565b80548310156129435760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106a4565b80600101548311156129aa5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106a4565b825f6129b582610c88565b90505f6129c2898361475d565b905060405180606001604052806129d63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020615f5083398151915255565b5f612a8561531d565b5f80516020615f108339815191525f612a9d8561304b565b90505f80612aae8360400151613cd2565b915091508015612b135760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106a4565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612b4457612b4461551d565b6005811115612b5557612b5561551d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612bc457612bc461551d565b1480612be25750600181516005811115612be057612be061551d565b145b612c415760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106a4565b600381516005811115612c5657612c5661551d565b03612c645760048152612c69565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612cae57612cae61551d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612d6257612d6261551d565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612e21575f80fd5b505af1158015612e33573d5f803e3d5ffd5b505050505050565b611d3a6001600160a01b03831682614d13565b5f8181525f80516020615f3083398151915260205260408082208151610100810190925280545f80516020615ed083398151915293929190829060ff166004811115612e9c57612e9c61551d565b6004811115612ead57612ead61551d565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612fa190600160a01b900461ffff1684615946565b612fab919061567f565b905080856008015f8581526020019081526020015f205f828254612fcf9190615911565b909155505f9050612fe08284615bb3565b9050612ff0856020015182612dd5565b6130058560200151610d6687606001516117e5565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156130af573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526130d69190810190615ae1565b91509150806131365760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106a4565b8151156131975760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106a4565b60208201516001600160a01b03161561320a5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106a4565b5092915050565b5f805f83516036146132355760405162461bcd60e51b81526004016106a490615bc6565b5f805b60028110156132845761324c816001615bb3565b613257906008615946565b61ffff1686828151811061326d5761326d6157a5565b016020015160f81c901b9190911790600101613238565b5061ffff8116156132a75760405162461bcd60e51b81526004016106a490615c0f565b5f805b6004811015613302576132be816003615bb3565b6132c9906008615946565b63ffffffff16876132db836002615911565b815181106132eb576132eb6157a5565b016020015160f81c901b91909117906001016132aa565b5063ffffffff81166004146133295760405162461bcd60e51b81526004016106a490615c52565b5f805b602081101561337e5761334081601f615bb3565b61334b906008615946565b88613357836006615911565b81518110613367576133676157a5565b016020015160f81c901b919091179060010161332c565b505f805b60088110156133dd57613396816007615bb3565b6133a1906008615946565b6001600160401b0316896133b6836026615911565b815181106133c6576133c66157a5565b016020015160f81c901b9190911790600101613382565b505f805b600881101561343c576133f5816007615bb3565b613400906008615946565b6001600160401b03168a61341583602e615911565b81518110613425576134256157a5565b016020015160f81c901b91909117906001016133e1565b5091989097509095509350505050565b5f815160261461346e5760405162461bcd60e51b81526004016106a490615bc6565b5f805b60028110156134bd57613485816001615bb3565b613490906008615946565b61ffff168482815181106134a6576134a66157a5565b016020015160f81c901b9190911790600101613471565b5061ffff8116156134e05760405162461bcd60e51b81526004016106a490615c0f565b5f805b600481101561353b576134f7816003615bb3565b613502906008615946565b63ffffffff1685613514836002615911565b81518110613524576135246157a5565b016020015160f81c901b91909117906001016134e3565b5063ffffffff8116156135605760405162461bcd60e51b81526004016106a490615c52565b5f805b60208110156135b55761357781601f615bb3565b613582906008615946565b8661358e836006615911565b8151811061359e5761359e6157a5565b016020015160f81c901b9190911790600101613563565b50949350505050565b60605f6135cd83830184615760565b6135d991506058615946565b6135e490605c615911565b6001600160401b038111156135fb576135fb6157d7565b6040519080825280601f01601f191660200182016040528015613625576020820181803683370190505b5090505f5b602081101561367a5783358160208110613646576136466157a5565b1a60f81b82828151811061365c5761365c6157a5565b60200101906001600160f81b03191690815f1a90535060010161362a565b505f5b60208110156136da578360200135816020811061369c5761369c6157a5565b1a60f81b826136ac836020615911565b815181106136bc576136bc6157a5565b60200101906001600160f81b03191690815f1a90535060010161367d565b505f5b600481101561373d576136f1816003615bb3565b6136fc906008615946565b6014901c60f81b8261370f836040615911565b8151811061371f5761371f6157a5565b60200101906001600160f81b03191690815f1a9053506001016136dd565b505f61374f6060850160408601615745565b60601b90505f5b60148110156137af57818160148110613771576137716157a5565b1a60f81b83613781836044615911565b81518110613791576137916157a5565b60200101906001600160f81b03191690815f1a905350600101613756565b505f6137be6060860186615760565b905090505f5b6004811015613829576137d8816003615bb3565b6137e3906008615946565b63ffffffff8316901c60f81b846137fb836058615911565b8151811061380b5761380b6157a5565b60200101906001600160f81b03191690815f1a9053506001016137c4565b505f5b6138396060870187615760565b9050811015613a4d575f61384e826058615946565b61385990605c615911565b90505f5b60208110156138e4576138736060890189615760565b84818110613883576138836157a5565b905060200281019061389591906157b9565b3581602081106138a7576138a76157a5565b1a60f81b866138b68385615911565b815181106138c6576138c66157a5565b60200101906001600160f81b03191690815f1a90535060010161385d565b505f5b6008811015613999576138fb816007615bb3565b613906906008615946565b61391360608a018a615760565b85818110613923576139236157a5565b905060200281019061393591906157b9565b613946906040810190602001615504565b6001600160401b0316901c60f81b8682613961856020615911565b61396b9190615911565b8151811061397b5761397b6157a5565b60200101906001600160f81b03191690815f1a9053506001016138e7565b505f5b6030811015613a43576139b26060890189615760565b848181106139c2576139c26157a5565b90506020028101906139d491906157b9565b6139e2906040810190615c99565b828181106139f2576139f26157a5565b9050013560f81c60f81b8682846028613a0b9190615911565b613a159190615911565b81518110613a2557613a256157a5565b60200101906001600160f81b03191690815f1a90535060010161399c565b505060010161382c565b5091949350505050565b613a5f61531d565b5f8281525f80516020615f708339815191526020526040808220815160e0810190925280545f80516020615f1083398151915293929190829060ff166005811115613aac57613aac61551d565b6005811115613abd57613abd61551d565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613b2f57613b2f61551d565b14613b8b5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106a4565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613bcf57613bcf61551d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613c7b8582612597565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613cf55760405162461bcd60e51b81526004016106a490615bc6565b5f805b6002811015613d4457613d0c816001615bb3565b613d17906008615946565b61ffff16858281518110613d2d57613d2d6157a5565b016020015160f81c901b9190911790600101613cf8565b5061ffff811615613d675760405162461bcd60e51b81526004016106a490615c0f565b5f805b6004811015613dc257613d7e816003615bb3565b613d89906008615946565b63ffffffff1686613d9b836002615911565b81518110613dab57613dab6157a5565b016020015160f81c901b9190911790600101613d6a565b5063ffffffff8116600314613de95760405162461bcd60e51b81526004016106a490615c52565b5f805b6020811015613e3e57613e0081601f615bb3565b613e0b906008615946565b87613e17836006615911565b81518110613e2757613e276157a5565b016020015160f81c901b9190911790600101613dec565b505f86602681518110613e5357613e536157a5565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615ed083398151915281613e8c84610c88565b90505f613e9887612233565b9050613ea387612d9a565b613f005760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106a4565b600281516005811115613f1557613f1561551d565b14613f745760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106a4565b5f828260800151613f8591906159af565b60048501546040840151919250613fa7916001600160401b0390911690615cdb565b6001600160401b0316816001600160401b031611156140265760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106a4565b5f806140328a84612597565b915091505f8a8360405160200161406092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156140fb576140fb61551d565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461424d5760405162461bcd60e51b81526004016106a490615bc6565b5f805b600281101561429c57614264816001615bb3565b61426f906008615946565b61ffff16858281518110614285576142856157a5565b016020015160f81c901b9190911790600101614250565b5061ffff8116156142bf5760405162461bcd60e51b81526004016106a490615c0f565b5f805b600481101561431a576142d6816003615bb3565b6142e1906008615946565b63ffffffff16866142f3836002615911565b81518110614303576143036157a5565b016020015160f81c901b91909117906001016142c2565b5063ffffffff81166005146143415760405162461bcd60e51b81526004016106a490615c52565b5f805b60208110156143965761435881601f615bb3565b614363906008615946565b8761436f836006615911565b8151811061437f5761437f6157a5565b016020015160f81c901b9190911790600101614344565b505f805b60088110156143f5576143ae816007615bb3565b6143b9906008615946565b6001600160401b0316886143ce836026615911565b815181106143de576143de6157a5565b016020015160f81c901b919091179060010161439a565b5090969095509350505050565b5f80516020615f108339815191525f6001600160401b0380841690851611156144365761442f83856155f4565b9050614443565b61444084846155f4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806144a55750600184015481516144a1916001600160401b031690615911565b8210155b156144cb576001600160401b0383166060820152818152604081015160208201526144ea565b82816060018181516144dd91906159af565b6001600160401b03169052505b60608101516144fa906064615cdb565b602082015160018601546001600160401b0392909216916145259190600160401b900460ff16615946565b10156145895760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106a4565b856001600160401b0316816040018181516145a49190615911565b9052506040810180516001600160401b03871691906145c4908390615bb3565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615f708339815191526020526040812060020180545f80516020615f1083398151915291600160401b9091046001600160401b031690600861465a83615d06565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166146e957604051631afcd79f60e31b815260040160405180910390fd5b565b6146f36146a0565b6146fc81614da6565b614704614dbf565b61274e6060820135608083013561472160c0850160a08601615504565b61473160e0860160c08701615d21565b61ffff16614746610100870160e08801615d3a565b61475861012088016101008901615745565b614dcf565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166147e85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106a4565b5f80516020615f10833981519152426148076040860160208701615504565b6001600160401b0316116148795760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106a4565b6148896040850160208601615504565b6001600160401b031661489f6202a30042615911565b116149125760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106a4565b833561496a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106a4565b83355f908152600882016020526040902054156149da5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106a4565b60306149e96040860186615c99565b905014614a4e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106a4565b614a58835f614402565b5f80614af16040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614a9c9190615504565b6001600160401b03168152602001614ab760408a018a615c99565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250615057565b5f82815260068601602052604090209193509150614b0f8282615d9e565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614b4d90859060040161564d565b6020604051808303815f875af1158015614b69573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b8d9190615614565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614c0557614c0561551d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614ce5918e01908e01615504565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015614d365760405163cd78605960e01b81523060048201526024016106a4565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614d7f576040519150601f19603f3d011682016040523d82523d5f602084013e614d84565b606091505b50509050806121fd57604051630a12f52160e11b815260040160405180910390fd5b614dae6146a0565b614db661515b565b61274e81615163565b614dc76146a0565b6146e96152de565b614dd76146a0565b5f80516020615ed083398151915283614e435760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106a4565b612710841115614ea95760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106a4565b85871115614f115760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106a4565b5f8360ff1611614f7e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106a4565b600a60ff84161115614ff05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106a4565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146150c15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106a4565b5f806001855f015186602001518760400151886080015189606001516040516020016150f39796959493929190615e59565b60405160208183030381529060405290506002816040516151149190615900565b602060405180830381855afa15801561512f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906151529190615614565b94909350915050565b6146e96146a0565b61516b6146a0565b80355f80516020615f1083398151915290815560146151906060840160408501615d3a565b60ff1611156151fd5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106a4565b5f61520e6060840160408501615d3a565b60ff16116152765760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106a4565b6152866060830160408401615d3a565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556152b76040830160208401615504565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612a696146a0565b5080546152f290615a1a565b5f825580601f10615301575050565b601f0160209004905f5260205f209081019061274e9190615359565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561536d575f815560010161535a565b5090565b801515811461274e575f80fd5b803563ffffffff8116811461222e575f80fd5b5f805f606084860312156153a3575f80fd5b8335925060208401356153b581615371565b91506153c36040850161537e565b90509250925092565b5f602082840312156153dc575f80fd5b5035919050565b5f61012082840312156153f4575f80fd5b50919050565b803561ffff8116811461222e575f80fd5b80356001600160401b038116811461222e575f80fd5b5f805f60608486031215615433575f80fd5b83356001600160401b03811115615448575f80fd5b840160608187031215615459575f80fd5b9250615467602085016153fa565b91506153c36040850161540b565b5f60208284031215615485575f80fd5b610ccb8261537e565b5f806040838503121561549f575f80fd5b6154a88361537e565b946020939093013593505050565b5f80604083850312156154c7575f80fd5b82356001600160401b038111156154dc575f80fd5b8301608081860312156154ed575f80fd5b91506154fb6020840161537e565b90509250929050565b5f60208284031215615514575f80fd5b610ccb8261540b565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061555457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161558f60608401826001600160401b03169052565b5060808301516155aa60808401826001600160401b03169052565b5060a08301516155c560a08401826001600160401b03169052565b5060c083015161320a60c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561320a5761320a6155e0565b5f60208284031215615624575f80fd5b5051919050565b5f5b8381101561564557818101518382015260200161562d565b50505f910152565b602081525f825180602084015261566b81604085016020870161562b565b601f01601f19169190910160400192915050565b5f8261569957634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b038116811461274e575f80fd5b5f60208284031215615755575f80fd5b8135610ccb81615731565b5f808335601e19843603018112615775575f80fd5b8301803591506001600160401b0382111561578e575f80fd5b6020019150600581901b36038213156126e7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126157cd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561580d5761580d6157d7565b60405290565b604051601f8201601f191681016001600160401b038111828210171561583b5761583b6157d7565b604052919050565b5f6001600160401b0382111561585b5761585b6157d7565b50601f01601f191660200190565b5f60608236031215615879575f80fd5b6158816157eb565b82358152602061589281850161540b565b8183015260408401356001600160401b038111156158ae575f80fd5b840136601f8201126158be575f80fd5b80356158d16158cc82615843565b615813565b81815236848385010111156158e4575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516157cd81846020870161562b565b80820180821115610c9857610c986155e0565b5f63ffffffff80831681810361593c5761593c6155e0565b6001019392505050565b8082028115828204841417610c9857610c986155e0565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561320a5761320a6155e0565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615a2e57607f821691505b6020821081036153f457634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615a5e81615a1a565b806020870152604060018084165f8114615a7f5760018114615a9b57615ac8565b60ff19851660408a0152604084151560051b8a01019550615ac8565b895f5260205f205f5b85811015615abf5781548b8201860152908301908801615aa4565b8a016040019650505b509398975050505050505050565b805161222e81615371565b5f8060408385031215615af2575f80fd5b82516001600160401b0380821115615b08575f80fd5b9084019060608287031215615b1b575f80fd5b615b236157eb565b82518152602080840151615b3681615731565b82820152604084015183811115615b4b575f80fd5b80850194505087601f850112615b5f575f80fd5b83519250615b6f6158cc84615843565b8381528882858701011115615b82575f80fd5b615b918483830184880161562b565b80604084015250819550615ba6818801615ad6565b9450505050509250929050565b81810381811115610c9857610c986155e0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615cae575f80fd5b8301803591506001600160401b03821115615cc7575f80fd5b6020019150368190038213156126e7575f80fd5b6001600160401b03818116838216028082169190828114615cfe57615cfe6155e0565b505092915050565b5f6001600160401b0380831681810361593c5761593c6155e0565b5f60208284031215615d31575f80fd5b610ccb826153fa565b5f60208284031215615d4a575f80fd5b813560ff81168114610ccb575f80fd5b601f8211156121fd57805f5260205f20601f840160051c81016020851015615d7f5750805b601f840160051c820191505b81811015610d6b575f8155600101615d8b565b81516001600160401b03811115615db757615db76157d7565b615dcb81615dc58454615a1a565b84615d5a565b602080601f831160018114615dfe575f8415615de75750858301515b5f19600386901b1c1916600185901b178555612e33565b5f85815260208120601f198616915b82811015615e2c57888601518255948401946001909101908401615e0d565b5085821015615e4957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451615eae81604e86016020890161562b565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516163df3803806163df83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162928061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004615649565b61058b565b005b3480156101ea575f80fd5b506101dd6101f9366004615684565b6109ee565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd61024336600461569b565b610ba7565b348015610253575f80fd5b50610267610262366004615684565b610c84565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046156d9565b610c9a565b604051908152602001610220565b348015610305575f80fd5b506101dd61031436600461572d565b610cce565b348015610324575f80fd5b506101dd610333366004615746565b610d6e565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b36600461576e565b6111fe565b34801561038b575f80fd5b506102ec61039a3660046157bc565b6117e1565b3480156103aa575f80fd5b506102676103b9366004615684565b6117fa565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb366004615649565b61180e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e366004615684565b611a2a565b34801561042e575f80fd5b506101dd61043d366004615746565b611b30565b34801561044d575f80fd5b506101dd61045c366004615684565b611d13565b34801561046c575f80fd5b506101dd61047b36600461572d565b611ff6565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b4366004615684565b61216c565b3480156104c4575f80fd5b506101dd6104d3366004615684565b6123df565b6102ec6104e6366004615684565b6124ba565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e610519366004615684565b6124eb565b60405161022091906157e9565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b366004615684565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f8051602061622683398151915260205260408082208151610100810190925280545f805160206161c683398151915293929190829060ff1660048111156105d9576105d96157d5565b60048111156105ea576105ea6157d5565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61066e826124eb565b9050600283516004811115610685576106856157d5565b146106d75760405162461bcd60e51b815260206004820152602a60248201525f805160206161e68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461073c5760405162461bcd60e51b815260206004820152603360248201525f805160206161e68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106ce565b6003835280515f906002906005811115610758576107586157d5565b036107af5786156107705761076d83876125b3565b90505b5f8460600151836080015161078591906158ac565b9050610791848261284f565b506001600160401b0390811660e0870152421660a0860152506107e3565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561081686606001516117e1565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b815260040161084a97969594939291906158cc565b602060405180830381865afa158015610865573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610889919061590a565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108c8576108c86157d5565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109dc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206162668339815191526020526040808220815160e0810190925280545f8051602061620683398151915293929190829060ff166005811115610a3b57610a3b6157d5565b6005811115610a4c57610a4c6157d5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abb57610abb6157d5565b14610b205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb610b458584606001515f6129a6565b6040518263ffffffff1660e01b8152600401610b619190615943565b6020604051808303815f875af1158015610b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba1919061590a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c38836129f5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9464e8d4a5100083615975565b92915050565b5f610ca3612a09565b610caf84848434612a40565b9050610cc760015f8051602061624683398151915255565b9392505050565b5f805160206161c68339815191525f80610ce784612d34565b91509150610cf482613052565b610cfe5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d2c57610d2c6157d5565b03610d51575f83815260088501602052604081208054919055610d4f828261308d565b505b610d6781610d6284604001516117e1565b6130f3565b5050505050565b5f8181525f8051602061622683398151915260205260408082208151610100810190925280545f805160206161c683398151915293929190829060ff166004811115610dbc57610dbc6157d5565b6004811115610dcd57610dcd6157d5565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e52906124eb565b9050600182516004811115610e6957610e696157d5565b14610ed25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106ce565b600381516005811115610ee757610ee76157d5565b0361105f576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610f4b57610f4b6157d5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115611074576110746157d5565b0361108257610d6784613106565b5f61108c86613303565b90505f8061109d83604001516134c9565b5091509150818560400151146110c55760405162461bcd60e51b81526004016106ce90615994565b806001600160401b031684606001516001600160401b031610156111365760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106ce565b806001600160401b03168560c001516001600160401b0316111561116c5760405162461bcd60e51b81526004016106ce906159de565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206162068339815191529060ff161561129b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611302919061590a565b8360200135146113645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106ce565b306113756060850160408601615a3b565b6001600160a01b0316146113e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106ce565b5f6113f56060850185615a56565b905090505f805b828163ffffffff1610156116e5575f6114186060880188615a56565b8363ffffffff1681811061142e5761142e615a9b565b90506020028101906114409190615aaf565b61144990615b5f565b80515f81815260088801602052604090205491925090156114c15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106ce565b5f6002895f0135856040516020016114f092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150a91615bf6565b602060405180830381855afa158015611525573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611548919061590a565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d4576115d46157d5565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611687911686615c07565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116de90615c1a565b90506113fc565b50600483018190555f6116f785613303565b90505f6117078260400151613704565b90505f61171388613876565b9050816002826040516117269190615bf6565b602060405180830381855afa158015611741573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611764919061590a565b146117c85760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106ce565b5050506009909201805460ff1916600117905550505050565b5f610c946001600160401b03831664e8d4a51000615c3c565b5f611804826124eb565b6080015192915050565b5f805160206161c68339815191525f61182685613d0f565b905061183185613052565b61183c575050505050565b5f8581526005830160205260409020546001600160a01b031633146118735760405162461bcd60e51b81526004016106ce90615c53565b5f85815260058301602052604090205460a08201516118a291600160b01b90046001600160401b031690615ca5565b6001600160401b03168160c001516001600160401b031610156119235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106ce565b8315610d67575f61193486856125b3565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198b906117e1565b60a085015160c08601516040516001600160e01b031960e086901b1681526119bf939291829188905f9081906004016158cc565b602060405180830381865afa1580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe919061590a565b5f87815260088501602052604081208054909190611a1d908490615c07565b9091555050505050505050565b5f805160206161c68339815191525f611a42836124eb565b9050600481516005811115611a5957611a596157d5565b14611ac35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106ce565b5f8381526005830160205260409020546001600160a01b03163314611afa5760405162461bcd60e51b81526004016106ce90615c53565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba1906001600160a01b03168261308d565b611b38612a09565b5f8181525f8051602061622683398151915260205260408082208151610100810190925280545f805160206161c683398151915293929190829060ff166004811115611b8657611b866157d5565b6004811115611b9757611b976157d5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c1385613303565b90505f80611c2483604001516134c9565b509150915081846040015114611c4c5760405162461bcd60e51b81526004016106ce90615994565b806001600160401b03168460e001516001600160401b03161115611c825760405162461bcd60e51b81526004016106ce906159de565b600384516004811115611c9757611c976157d5565b14611ceb5760405162461bcd60e51b815260206004820152603160248201525f805160206161e68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106ce565b611cf486613106565b5050505050611d0f60015f8051602061624683398151915255565b5050565b5f8181525f8051602061622683398151915260205260408082208151610100810190925280545f805160206161c683398151915293929190829060ff166004811115611d6157611d616157d5565b6004811115611d7257611d726157d5565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611df6826124eb565b9050600481516005811115611e0d57611e0d6157d5565b14611e705760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106ce565b600283516004811115611e8557611e856157d5565b1480611ea35750600383516004811115611ea157611ea16157d5565b145b611eff5760405162461bcd60e51b815260206004820152602760248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526632b3b0ba34b7b760c91b60648201526084016106ce565b600283516004811115611f1457611f146157d5565b03611fed578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611f4c85606001516117e1565b60a0808501516080880151918801515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611f9d969593926001600160401b03909216919081906004016158cc565b602060405180830381865afa158015611fb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fdc919061590a565b5f8681526007860160205260409020555b610d6785613106565b5f805160206162068339815191525f61200e83613303565b90505f8061201f8360400151613f8a565b91509150806120815760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106ce565b60015f83815260078601602052604090205460ff1660058111156120a7576120a76157d5565b146120c45760405162461bcd60e51b81526004016106ce90615cc5565b5f82815260068501602052604081206120dc9161559e565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061622683398151915260205260408082208151610100810190925280545f805160206161c683398151915293929190829060ff1660048111156121ba576121ba6157d5565b60048111156121cb576121cb6157d5565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115612252576122526157d5565b1480612270575060038151600481111561226e5761226e6157d5565b145b6122c45760405162461bcd60e51b815260206004820152603260248201525f805160206161e6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106ce565b5f6122d282604001516124eb565b905080606001516001600160401b03165f036123565760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb6123838460400151846060015185608001516129a6565b6040518263ffffffff1660e01b815260040161239f9190615943565b6020604051808303815f875af11580156123bb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d67919061590a565b5f8181525f8051602061626683398151915260205260409020545f805160206162068339815191529060019060ff16600581111561241f5761241f6157d5565b1461243c5760405162461bcd60e51b81526004016106ce90615cc5565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916124759190600401615d42565b6020604051808303815f875af1158015612491573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b5919061590a565b505050565b5f6124c3612a09565b6124ce82333461412b565b90506124e660015f8051602061624683398151915255565b919050565b6124f36155d5565b5f8281525f80516020616266833981519152602052604090819020815160e0810190925280545f80516020616206833981519152929190829060ff166005811115612540576125406157d5565b6005811115612551576125516157d5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156125fe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126259190810190615dd7565b91509150806126885760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126ef919061590a565b8251146127535760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106ce565b60208201516001600160a01b0316156127c95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106ce565b5f806127d884604001516144e2565b915091508187146128455760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106ce565b9695505050505050565b5f8281525f80516020616266833981519152602052604081206002015481905f8051602061620683398151915290600160801b90046001600160401b031661289785826146ba565b5f6128a1876148c8565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6128f18a858b6129a6565b6040518263ffffffff1660e01b815260040161290d9190615943565b6020604051808303815f875af1158015612929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061294d919061590a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6129fd614958565b612a06816149a3565b50565b5f80516020616246833981519152805460011901612a3a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206161c68339815191529061ffff86161015612ac75760405162461bcd60e51b815260206004820152602b60248201525f805160206161e683398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106ce565b61271061ffff86161115612b1f5760405162461bcd60e51b815260206004820152602c60248201525f805160206161e683398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106ce565b60028101546001600160401b039081169085161015612b985760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106ce565b8054831015612bfb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106ce565b8060010154831115612c625760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106ce565b825f612c6d82610c84565b90505f612c7a8983614a15565b90506040518060600160405280612c8e3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061624683398151915255565b5f612d3d6155d5565b5f805160206162068339815191525f612d5585613303565b90505f80612d668360400151613f8a565b915091508015612dcb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106ce565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612dfc57612dfc6157d5565b6005811115612e0d57612e0d6157d5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612e7c57612e7c6157d5565b1480612e9a5750600181516005811115612e9857612e986157d5565b145b612ef95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106ce565b600381516005811115612f0e57612f0e6157d5565b03612f1c5760048152612f21565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f6657612f666157d5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561301a5761301a6157d5565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156130d9575f80fd5b505af11580156130eb573d5f803e3d5ffd5b505050505050565b611d0f6001600160a01b03831682614fcb565b5f8181525f8051602061622683398151915260205260408082208151610100810190925280545f805160206161c683398151915293929190829060ff166004811115613154576131546157d5565b6004811115613165576131656157d5565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061325990600160a01b900461ffff1684615c3c565b6132639190615975565b905080856008015f8581526020019081526020015f205f8282546132879190615c07565b909155505f90506132988284615ea9565b90506132a885602001518261308d565b6132bd8560200151610d6287606001516117e1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015613367573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261338e9190810190615dd7565b91509150806133ee5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106ce565b81511561344f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106ce565b60208201516001600160a01b0316156134c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106ce565b5092915050565b5f805f83516036146134ed5760405162461bcd60e51b81526004016106ce90615ebc565b5f805b600281101561353c57613504816001615ea9565b61350f906008615c3c565b61ffff1686828151811061352557613525615a9b565b016020015160f81c901b91909117906001016134f0565b5061ffff81161561355f5760405162461bcd60e51b81526004016106ce90615f05565b5f805b60048110156135ba57613576816003615ea9565b613581906008615c3c565b63ffffffff1687613593836002615c07565b815181106135a3576135a3615a9b565b016020015160f81c901b9190911790600101613562565b5063ffffffff81166004146135e15760405162461bcd60e51b81526004016106ce90615f48565b5f805b6020811015613636576135f881601f615ea9565b613603906008615c3c565b8861360f836006615c07565b8151811061361f5761361f615a9b565b016020015160f81c901b91909117906001016135e4565b505f805b60088110156136955761364e816007615ea9565b613659906008615c3c565b6001600160401b03168961366e836026615c07565b8151811061367e5761367e615a9b565b016020015160f81c901b919091179060010161363a565b505f805b60088110156136f4576136ad816007615ea9565b6136b8906008615c3c565b6001600160401b03168a6136cd83602e615c07565b815181106136dd576136dd615a9b565b016020015160f81c901b9190911790600101613699565b5091989097509095509350505050565b5f81516026146137265760405162461bcd60e51b81526004016106ce90615ebc565b5f805b60028110156137755761373d816001615ea9565b613748906008615c3c565b61ffff1684828151811061375e5761375e615a9b565b016020015160f81c901b9190911790600101613729565b5061ffff8116156137985760405162461bcd60e51b81526004016106ce90615f05565b5f805b60048110156137f3576137af816003615ea9565b6137ba906008615c3c565b63ffffffff16856137cc836002615c07565b815181106137dc576137dc615a9b565b016020015160f81c901b919091179060010161379b565b5063ffffffff8116156138185760405162461bcd60e51b81526004016106ce90615f48565b5f805b602081101561386d5761382f81601f615ea9565b61383a906008615c3c565b86613846836006615c07565b8151811061385657613856615a9b565b016020015160f81c901b919091179060010161381b565b50949350505050565b60605f61388583830184615a56565b61389191506058615c3c565b61389c90605c615c07565b6001600160401b038111156138b3576138b3615acd565b6040519080825280601f01601f1916602001820160405280156138dd576020820181803683370190505b5090505f5b602081101561393257833581602081106138fe576138fe615a9b565b1a60f81b82828151811061391457613914615a9b565b60200101906001600160f81b03191690815f1a9053506001016138e2565b505f5b6020811015613992578360200135816020811061395457613954615a9b565b1a60f81b82613964836020615c07565b8151811061397457613974615a9b565b60200101906001600160f81b03191690815f1a905350600101613935565b505f5b60048110156139f5576139a9816003615ea9565b6139b4906008615c3c565b6014901c60f81b826139c7836040615c07565b815181106139d7576139d7615a9b565b60200101906001600160f81b03191690815f1a905350600101613995565b505f613a076060850160408601615a3b565b60601b90505f5b6014811015613a6757818160148110613a2957613a29615a9b565b1a60f81b83613a39836044615c07565b81518110613a4957613a49615a9b565b60200101906001600160f81b03191690815f1a905350600101613a0e565b505f613a766060860186615a56565b905090505f5b6004811015613ae157613a90816003615ea9565b613a9b906008615c3c565b63ffffffff8316901c60f81b84613ab3836058615c07565b81518110613ac357613ac3615a9b565b60200101906001600160f81b03191690815f1a905350600101613a7c565b505f5b613af16060870187615a56565b9050811015613d05575f613b06826058615c3c565b613b1190605c615c07565b90505f5b6020811015613b9c57613b2b6060890189615a56565b84818110613b3b57613b3b615a9b565b9050602002810190613b4d9190615aaf565b358160208110613b5f57613b5f615a9b565b1a60f81b86613b6e8385615c07565b81518110613b7e57613b7e615a9b565b60200101906001600160f81b03191690815f1a905350600101613b15565b505f5b6008811015613c5157613bb3816007615ea9565b613bbe906008615c3c565b613bcb60608a018a615a56565b85818110613bdb57613bdb615a9b565b9050602002810190613bed9190615aaf565b613bfe9060408101906020016157bc565b6001600160401b0316901c60f81b8682613c19856020615c07565b613c239190615c07565b81518110613c3357613c33615a9b565b60200101906001600160f81b03191690815f1a905350600101613b9f565b505f5b6030811015613cfb57613c6a6060890189615a56565b84818110613c7a57613c7a615a9b565b9050602002810190613c8c9190615aaf565b613c9a906040810190615f8f565b82818110613caa57613caa615a9b565b9050013560f81c60f81b8682846028613cc39190615c07565b613ccd9190615c07565b81518110613cdd57613cdd615a9b565b60200101906001600160f81b03191690815f1a905350600101613c54565b5050600101613ae4565b5091949350505050565b613d176155d5565b5f8281525f805160206162668339815191526020526040808220815160e0810190925280545f8051602061620683398151915293929190829060ff166005811115613d6457613d646157d5565b6005811115613d7557613d756157d5565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613de757613de76157d5565b14613e435760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106ce565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e8757613e876157d5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f33858261284f565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613fad5760405162461bcd60e51b81526004016106ce90615ebc565b5f805b6002811015613ffc57613fc4816001615ea9565b613fcf906008615c3c565b61ffff16858281518110613fe557613fe5615a9b565b016020015160f81c901b9190911790600101613fb0565b5061ffff81161561401f5760405162461bcd60e51b81526004016106ce90615f05565b5f805b600481101561407a57614036816003615ea9565b614041906008615c3c565b63ffffffff1686614053836002615c07565b8151811061406357614063615a9b565b016020015160f81c901b9190911790600101614022565b5063ffffffff81166003146140a15760405162461bcd60e51b81526004016106ce90615f48565b5f805b60208110156140f6576140b881601f615ea9565b6140c3906008615c3c565b876140cf836006615c07565b815181106140df576140df615a9b565b016020015160f81c901b91909117906001016140a4565b505f8660268151811061410b5761410b615a9b565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206161c68339815191528161414484610c84565b90505f614150876124eb565b905061415b87613052565b6141b85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106ce565b6002815160058111156141cd576141cd6157d5565b1461422c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106ce565b5f82826080015161423d9190615ca5565b6004850154604084015191925061425f916001600160401b0390911690615fd1565b6001600160401b0316816001600160401b031611156142de5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106ce565b5f806142ea8a8461284f565b915091505f8a8360405160200161431892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156143b3576143b36157d5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146145055760405162461bcd60e51b81526004016106ce90615ebc565b5f805b60028110156145545761451c816001615ea9565b614527906008615c3c565b61ffff1685828151811061453d5761453d615a9b565b016020015160f81c901b9190911790600101614508565b5061ffff8116156145775760405162461bcd60e51b81526004016106ce90615f05565b5f805b60048110156145d25761458e816003615ea9565b614599906008615c3c565b63ffffffff16866145ab836002615c07565b815181106145bb576145bb615a9b565b016020015160f81c901b919091179060010161457a565b5063ffffffff81166005146145f95760405162461bcd60e51b81526004016106ce90615f48565b5f805b602081101561464e5761461081601f615ea9565b61461b906008615c3c565b87614627836006615c07565b8151811061463757614637615a9b565b016020015160f81c901b91909117906001016145fc565b505f805b60088110156146ad57614666816007615ea9565b614671906008615c3c565b6001600160401b031688614686836026615c07565b8151811061469657614696615a9b565b016020015160f81c901b9190911790600101614652565b5090969095509350505050565b5f805160206162068339815191525f6001600160401b0380841690851611156146ee576146e783856158ac565b90506146fb565b6146f884846158ac565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061475d575060018401548151614759916001600160401b031690615c07565b8210155b15614783576001600160401b0383166060820152818152604081015160208201526147a2565b82816060018181516147959190615ca5565b6001600160401b03169052505b60608101516147b2906064615fd1565b602082015160018601546001600160401b0392909216916147dd9190600160401b900460ff16615c3c565b10156148415760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106ce565b856001600160401b03168160400181815161485c9190615c07565b9052506040810180516001600160401b038716919061487c908390615ea9565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162668339815191526020526040812060020180545f8051602061620683398151915291600160401b9091046001600160401b031690600861491283615ffc565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166149a157604051631afcd79f60e31b815260040160405180910390fd5b565b6149ab614958565b6149b48161505e565b6149bc615077565b612a06606082013560808301356149d960c0850160a086016157bc565b6149e960e0860160c08701616017565b61ffff166149fe610100870160e08801616030565b614a1061012088016101008901615a3b565b615087565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16614aa05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106ce565b5f8051602061620683398151915242614abf60408601602087016157bc565b6001600160401b031611614b315760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106ce565b614b4160408501602086016157bc565b6001600160401b0316614b576202a30042615c07565b11614bca5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106ce565b8335614c225760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106ce565b83355f90815260088201602052604090205415614c925760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106ce565b6030614ca16040860186615f8f565b905014614d065760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106ce565b614d10835f6146ba565b5f80614da96040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614d5491906157bc565b6001600160401b03168152602001614d6f60408a018a615f8f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061530f565b5f82815260068601602052604090209193509150614dc78282616094565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614e05908590600401615943565b6020604051808303815f875af1158015614e21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e45919061590a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614ebd57614ebd6157d5565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614f9d918e01908e016157bc565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015614fee5760405163cd78605960e01b81523060048201526024016106ce565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114615037576040519150601f19603f3d011682016040523d82523d5f602084013e61503c565b606091505b50509050806124b557604051630a12f52160e11b815260040160405180910390fd5b615066614958565b61506e615413565b612a068161541b565b61507f614958565b6149a1615596565b61508f614958565b5f805160206161c6833981519152836150fb5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106ce565b6127108411156151615760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106ce565b858711156151c95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106ce565b5f8360ff16116152365760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106ce565b600a60ff841611156152a85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106ce565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146153795760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106ce565b5f806001855f015186602001518760400151886080015189606001516040516020016153ab979695949392919061614f565b60405160208183030381529060405290506002816040516153cc9190615bf6565b602060405180830381855afa1580156153e7573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061540a919061590a565b94909350915050565b6149a1614958565b615423614958565b80355f8051602061620683398151915290815560146154486060840160408501616030565b60ff1611156154b55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106ce565b5f6154c66060840160408501616030565b60ff161161552e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106ce565b61553e6060830160408401616030565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561556f60408301602084016157bc565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d21614958565b5080546155aa90615d10565b5f825580601f106155b9575050565b601f0160209004905f5260205f2090810190612a069190615611565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615625575f8155600101615612565b5090565b8015158114612a06575f80fd5b803563ffffffff811681146124e6575f80fd5b5f805f6060848603121561565b575f80fd5b83359250602084013561566d81615629565b915061567b60408501615636565b90509250925092565b5f60208284031215615694575f80fd5b5035919050565b5f61012082840312156156ac575f80fd5b50919050565b803561ffff811681146124e6575f80fd5b80356001600160401b03811681146124e6575f80fd5b5f805f606084860312156156eb575f80fd5b83356001600160401b03811115615700575f80fd5b840160608187031215615711575f80fd5b925061571f602085016156b2565b915061567b604085016156c3565b5f6020828403121561573d575f80fd5b610cc782615636565b5f8060408385031215615757575f80fd5b61576083615636565b946020939093013593505050565b5f806040838503121561577f575f80fd5b82356001600160401b03811115615794575f80fd5b8301608081860312156157a5575f80fd5b91506157b360208401615636565b90509250929050565b5f602082840312156157cc575f80fd5b610cc7826156c3565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061580c57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161584760608401826001600160401b03169052565b50608083015161586260808401826001600160401b03169052565b5060a083015161587d60a08401826001600160401b03169052565b5060c08301516134c260c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156134c2576134c2615898565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f6020828403121561591a575f80fd5b5051919050565b5f5b8381101561593b578181015183820152602001615923565b50505f910152565b602081525f8251806020840152615961816040850160208701615921565b601f01601f19169190910160400192915050565b5f8261598f57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612a06575f80fd5b5f60208284031215615a4b575f80fd5b8135610cc781615a27565b5f808335601e19843603018112615a6b575f80fd5b8301803591506001600160401b03821115615a84575f80fd5b6020019150600581901b360382131561299f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615ac3575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b0357615b03615acd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615b3157615b31615acd565b604052919050565b5f6001600160401b03821115615b5157615b51615acd565b50601f01601f191660200190565b5f60608236031215615b6f575f80fd5b615b77615ae1565b823581526020615b888185016156c3565b8183015260408401356001600160401b03811115615ba4575f80fd5b840136601f820112615bb4575f80fd5b8035615bc7615bc282615b39565b615b09565b8181523684838501011115615bda575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615ac3818460208701615921565b80820180821115610c9457610c94615898565b5f63ffffffff808316818103615c3257615c32615898565b6001019392505050565b8082028115828204841417610c9457610c94615898565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156134c2576134c2615898565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615d2457607f821691505b6020821081036156ac57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615d5481615d10565b806020870152604060018084165f8114615d755760018114615d9157615dbe565b60ff19851660408a0152604084151560051b8a01019550615dbe565b895f5260205f205f5b85811015615db55781548b8201860152908301908801615d9a565b8a016040019650505b509398975050505050505050565b80516124e681615629565b5f8060408385031215615de8575f80fd5b82516001600160401b0380821115615dfe575f80fd5b9084019060608287031215615e11575f80fd5b615e19615ae1565b82518152602080840151615e2c81615a27565b82820152604084015183811115615e41575f80fd5b80850194505087601f850112615e55575f80fd5b83519250615e65615bc284615b39565b8381528882858701011115615e78575f80fd5b615e8784838301848801615921565b80604084015250819550615e9c818801615dcc565b9450505050509250929050565b81810381811115610c9457610c94615898565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615fa4575f80fd5b8301803591506001600160401b03821115615fbd575f80fd5b60200191503681900382131561299f575f80fd5b6001600160401b03818116838216028082169190828114615ff457615ff4615898565b505092915050565b5f6001600160401b03808316818103615c3257615c32615898565b5f60208284031215616027575f80fd5b610cc7826156b2565b5f60208284031215616040575f80fd5b813560ff81168114610cc7575f80fd5b601f8211156124b557805f5260205f20601f840160051c810160208510156160755750805b601f840160051c820191505b81811015610d67575f8155600101616081565b81516001600160401b038111156160ad576160ad615acd565b6160c1816160bb8454615d10565b84616050565b602080601f8311600181146160f4575f84156160dd5750858301515b5f19600386901b1c1916600185901b1785556130eb565b5f85815260208120601f198616915b8281101561612257888601518255948401946001909101908401616103565b508582101561613f57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516161a481604e860160208901615921565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -792,6 +792,27 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } +// EndDelegationCompletedValidator is a paid mutator transaction binding the contract method 0x9dde029a. +// +// Solidity: function endDelegationCompletedValidator(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) EndDelegationCompletedValidator(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "endDelegationCompletedValidator", delegationID) +} + +// EndDelegationCompletedValidator is a paid mutator transaction binding the contract method 0x9dde029a. +// +// Solidity: function endDelegationCompletedValidator(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) EndDelegationCompletedValidator(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.EndDelegationCompletedValidator(&_NativeTokenStakingManager.TransactOpts, delegationID) +} + +// EndDelegationCompletedValidator is a paid mutator transaction binding the contract method 0x9dde029a. +// +// Solidity: function endDelegationCompletedValidator(bytes32 delegationID) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) EndDelegationCompletedValidator(delegationID [32]byte) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.EndDelegationCompletedValidator(&_NativeTokenStakingManager.TransactOpts, delegationID) +} + // Initialize is a paid mutator transaction binding the contract method 0x20e55565. // // Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index dc58ed4cc..466f9ca7a 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -422,6 +422,41 @@ abstract contract PoSValidatorManager is }); } + function endDelegationCompletedValidator(bytes32 delegationID) external { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + Delegator memory delegator = $._delegatorStakes[delegationID]; + bytes32 validationID = delegator.validationID; + Validator memory validator = getValidator(validationID); + + // Ensure the validation is completed + require( + validator.status == ValidatorStatus.Completed, + "PoSValidatorManager: validation not completed" + ); + + require( + delegator.status == DelegatorStatus.Active + || delegator.status == DelegatorStatus.PendingRemoved, + "PoSValidatorManager: invalid delegation" + ); + + // Calculate and set rewards if the delegator is active. + if (delegator.status == DelegatorStatus.Active) { + $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward({ + stakeAmount: weightToValue(delegator.weight), + validatorStartTime: validator.startedAt, + stakingStartTime: delegator.startedAt, + stakingEndTime: delegator.endedAt, + uptimeSeconds: $._completedValidationUptimeSeconds[validationID], + initialSupply: 0, + endSupply: 0 + }); + } + + _completeEndDelegation(delegationID); + } + function initializeEndDelegation( bytes32 delegationID, bool includeUptimeProof, @@ -486,10 +521,6 @@ abstract contract PoSValidatorManager is }); } - /** - * @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. - */ function resendUpdateDelegation(bytes32 delegationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; From 4b00073f44dfb0f1aaec5a5f035e095929cf0252 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 20 Sep 2024 15:56:42 -0400 Subject: [PATCH 386/545] cleanup --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 6 +++++- .../validator-manager/interfaces/IPoSValidatorManager.sol | 8 ++++++++ 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 4b2b127f2..db6721dbf 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161671538038061671583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6165c88061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd3660046158e2565b61043a565b005b6101d26101e236600461591d565b61089d565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b61021961021436600461591d565b610a56565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004615934565b610a6c565b6101d261026e36600461594d565b610b0c565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004615975565b610f9c565b6102b66102b13660046159d9565b61157f565b6040519081526020016101fd565b6102196102d236600461591d565b611598565b6102b65f81565b6101d26102ec3660046158e2565b6115ac565b6101ef603081565b6101d261030736600461591d565b6117c8565b6101d261031a36600461594d565b6118ce565b6101d261032d36600461591d565b611ab1565b6102b66103403660046159f2565b611d94565b6101d2610353366004615934565b611dc0565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c36600461591d565b611f36565b6101d261039f36600461591d565b6121a9565b6101ef601481565b6103bf6103ba36600461591d565b612284565b6040516101fd9190615a26565b6102196202a30081565b6102b66103e436600461591d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615ae6565b61234c565b6101d2610435366004615b5f565b612381565b5f8381525f8051602061655c83398151915260205260408082208151610100810190925280545f805160206164fc83398151915293929190829060ff16600481111561048857610488615a12565b600481111561049957610499615a12565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61051d82612284565b905060028351600481111561053457610534615a12565b146105865760405162461bcd60e51b815260206004820152602a60248201525f8051602061651c8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105eb5760405162461bcd60e51b815260206004820152603360248201525f8051602061651c8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161057d565b6003835280515f90600290600581111561060757610607615a12565b0361065e57861561061f5761061c8387612460565b90505b5f846060015183608001516106349190615bb1565b905061064084826126fc565b506001600160401b0390811660e0870152421660a086015250610692565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106c5866060015161157f565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b81526004016106f99796959493929190615bd1565b602060405180830381865afa158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190615c0f565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561077757610777615a12565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088b916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061659c8339815191526020526040808220815160e0810190925280545f8051602061653c83398151915293929190829060ff1660058111156108ea576108ea615a12565b60058111156108fb576108fb615a12565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096a5761096a615a12565b146109cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb6109f48584606001515f612853565b6040518263ffffffff1660e01b8152600401610a109190615c48565b6020604051808303815f875af1158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190615c0f565b50505050565b5f610a6664e8d4a5100083615c7a565b92915050565b5f805160206164fc8339815191525f80610a85846128aa565b91509150610a9282612bc8565b610a9c5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610aca57610aca615a12565b03610aef575f83815260088501602052604081208054919055610aed8282612c03565b505b610b0581610b00846040015161157f565b612c79565b5050505050565b5f8181525f8051602061655c83398151915260205260408082208151610100810190925280545f805160206164fc83398151915293929190829060ff166004811115610b5a57610b5a615a12565b6004811115610b6b57610b6b615a12565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf090612284565b9050600182516004811115610c0757610c07615a12565b14610c705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161057d565b600381516005811115610c8557610c85615a12565b03610dfd576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610ce957610ce9615a12565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1257610e12615a12565b03610e2057610b0584612c9c565b5f610e2a86612e99565b90505f80610e3b836040015161305f565b509150915081856040015114610e635760405162461bcd60e51b815260040161057d90615c99565b806001600160401b031684606001516001600160401b03161015610ed45760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161057d565b806001600160401b03168560c001516001600160401b03161115610f0a5760405162461bcd60e51b815260040161057d90615ce3565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061653c8339815191529060ff16156110395760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a09190615c0f565b8360200135146111025760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161057d565b306111136060850160408601615d2c565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161057d565b5f6111936060850185615d47565b905090505f805b828163ffffffff161015611483575f6111b66060880188615d47565b8363ffffffff168181106111cc576111cc615d8c565b90506020028101906111de9190615da0565b6111e790615e50565b80515f818152600888016020526040902054919250901561125f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161057d565b5f6002895f01358560405160200161128e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a891615ee7565b602060405180830381855afa1580156112c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e69190615c0f565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561137257611372615a12565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611425911686615ef8565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147c90615f0b565b905061119a565b50600483018190555f61149585612e99565b90505f6114a5826040015161329a565b90505f6114b18861340c565b9050816002826040516114c49190615ee7565b602060405180830381855afa1580156114df573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115029190615c0f565b146115665760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161057d565b5050506009909201805460ff1916600117905550505050565b5f610a666001600160401b03831664e8d4a51000615f2d565b5f6115a282612284565b6080015192915050565b5f805160206164fc8339815191525f6115c4856138a5565b90506115cf85612bc8565b6115da575050505050565b5f8581526005830160205260409020546001600160a01b031633146116115760405162461bcd60e51b815260040161057d90615f44565b5f85815260058301602052604090205460a082015161164091600160b01b90046001600160401b031690615f96565b6001600160401b03168160c001516001600160401b031610156116c15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161057d565b8315610b05575f6116d28685612460565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117299061157f565b60a085015160c08601516040516001600160e01b031960e086901b16815261175d939291829188905f908190600401615bd1565b602060405180830381865afa158015611778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c9190615c0f565b5f878152600885016020526040812080549091906117bb908490615ef8565b9091555050505050505050565b5f805160206164fc8339815191525f6117e083612284565b90506004815160058111156117f7576117f7615a12565b146118615760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161057d565b5f8381526005830160205260409020546001600160a01b031633146118985760405162461bcd60e51b815260040161057d90615f44565b5f83815260088301602090815260408083208054908490556005860190925290912054610a50906001600160a01b031682612c03565b6118d6613b20565b5f8181525f8051602061655c83398151915260205260408082208151610100810190925280545f805160206164fc83398151915293929190829060ff16600481111561192457611924615a12565b600481111561193557611935615a12565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119b185612e99565b90505f806119c2836040015161305f565b5091509150818460400151146119ea5760405162461bcd60e51b815260040161057d90615c99565b806001600160401b03168460e001516001600160401b03161115611a205760405162461bcd60e51b815260040161057d90615ce3565b600384516004811115611a3557611a35615a12565b14611a895760405162461bcd60e51b815260206004820152603160248201525f8051602061651c8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161057d565b611a9286612c9c565b5050505050611aad60015f8051602061657c83398151915255565b5050565b5f8181525f8051602061655c83398151915260205260408082208151610100810190925280545f805160206164fc83398151915293929190829060ff166004811115611aff57611aff615a12565b6004811115611b1057611b10615a12565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611b9482612284565b9050600481516005811115611bab57611bab615a12565b14611c0e5760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161057d565b600283516004811115611c2357611c23615a12565b1480611c415750600383516004811115611c3f57611c3f615a12565b145b611c9d5760405162461bcd60e51b815260206004820152602760248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526632b3b0ba34b7b760c91b606482015260840161057d565b600283516004811115611cb257611cb2615a12565b03611d8b578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611cea856060015161157f565b60a0808501516080880151918801515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611d3b969593926001600160401b0390921691908190600401615bd1565b602060405180830381865afa158015611d56573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d7a9190615c0f565b5f8681526007860160205260409020555b610b0585612c9c565b5f611d9d613b20565b611da8833384613b6a565b9050610a6660015f8051602061657c83398151915255565b5f8051602061653c8339815191525f611dd883612e99565b90505f80611de98360400151613f24565b9150915080611e4b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057d565b60015f83815260078601602052604090205460ff166005811115611e7157611e71615a12565b14611e8e5760405162461bcd60e51b815260040161057d90615fb6565b5f8281526006850160205260408120611ea691615832565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061655c83398151915260205260408082208151610100810190925280545f805160206164fc83398151915293929190829060ff166004811115611f8457611f84615a12565b6004811115611f9557611f95615a12565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561201c5761201c615a12565b148061203a575060038151600481111561203857612038615a12565b145b61208e5760405162461bcd60e51b815260206004820152603260248201525f8051602061651c833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161057d565b5f61209c8260400151612284565b905080606001516001600160401b03165f036121205760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb61214d846040015184606001518560800151612853565b6040518263ffffffff1660e01b81526004016121699190615c48565b6020604051808303815f875af1158015612185573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190615c0f565b5f8181525f8051602061659c83398151915260205260409020545f8051602061653c8339815191529060019060ff1660058111156121e9576121e9615a12565b146122065760405162461bcd60e51b815260040161057d90615fb6565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161223f9190600401616039565b6020604051808303815f875af115801561225b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227f9190615c0f565b505050565b61228c615869565b5f8281525f8051602061659c833981519152602052604090819020815160e0810190925280545f8051602061653c833981519152929190829060ff1660058111156122d9576122d9615a12565b60058111156122ea576122ea615a12565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f612355613b20565b612361858585856140c5565b905061237960015f8051602061657c83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806123ca575080546001600160401b03808416911610155b156123e85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561241384846143b1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124ab573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124d291908101906160ce565b91509150806125355760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612578573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061259c9190615c0f565b8251146126005760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057d565b60208201516001600160a01b0316156126765760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057d565b5f8061268584604001516143cb565b915091508187146126f25760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057d565b9695505050505050565b5f8281525f8051602061659c833981519152602052604081206002015481905f8051602061653c83398151915290600160801b90046001600160401b031661274485826145a3565b5f61274e876147b1565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61279e8a858b612853565b6040518263ffffffff1660e01b81526004016127ba9190615c48565b6020604051808303815f875af11580156127d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127fa9190615c0f565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6128b3615869565b5f8051602061653c8339815191525f6128cb85612e99565b90505f806128dc8360400151613f24565b9150915080156129415760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057d565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561297257612972615a12565b600581111561298357612983615a12565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156129f2576129f2615a12565b1480612a105750600181516005811115612a0e57612a0e615a12565b145b612a6f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161057d565b600381516005811115612a8457612a84615a12565b03612a925760048152612a97565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612adc57612adc615a12565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b9057612b90615a12565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f805160206164dc83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c5e575f80fd5b505af1158015612c70573d5f803e3d5ffd5b50505050505050565b5f805160206164dc83398151915254611aad906001600160a01b03168383614841565b5f8181525f8051602061655c83398151915260205260408082208151610100810190925280545f805160206164fc83398151915293929190829060ff166004811115612cea57612cea615a12565b6004811115612cfb57612cfb615a12565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612def90600160a01b900461ffff1684615f2d565b612df99190615c7a565b905080856008015f8581526020019081526020015f205f828254612e1d9190615ef8565b909155505f9050612e2e82846161a0565b9050612e3e856020015182612c03565b612e538560200151610b00876060015161157f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612efd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f2491908101906160ce565b9150915080612f845760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057d565b815115612fe55760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057d565b60208201516001600160a01b0316156130585760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057d565b5092915050565b5f805f83516036146130835760405162461bcd60e51b815260040161057d906161b3565b5f805b60028110156130d25761309a8160016161a0565b6130a5906008615f2d565b61ffff168682815181106130bb576130bb615d8c565b016020015160f81c901b9190911790600101613086565b5061ffff8116156130f55760405162461bcd60e51b815260040161057d906161fc565b5f805b60048110156131505761310c8160036161a0565b613117906008615f2d565b63ffffffff1687613129836002615ef8565b8151811061313957613139615d8c565b016020015160f81c901b91909117906001016130f8565b5063ffffffff81166004146131775760405162461bcd60e51b815260040161057d9061623f565b5f805b60208110156131cc5761318e81601f6161a0565b613199906008615f2d565b886131a5836006615ef8565b815181106131b5576131b5615d8c565b016020015160f81c901b919091179060010161317a565b505f805b600881101561322b576131e48160076161a0565b6131ef906008615f2d565b6001600160401b031689613204836026615ef8565b8151811061321457613214615d8c565b016020015160f81c901b91909117906001016131d0565b505f805b600881101561328a576132438160076161a0565b61324e906008615f2d565b6001600160401b03168a61326383602e615ef8565b8151811061327357613273615d8c565b016020015160f81c901b919091179060010161322f565b5091989097509095509350505050565b5f81516026146132bc5760405162461bcd60e51b815260040161057d906161b3565b5f805b600281101561330b576132d38160016161a0565b6132de906008615f2d565b61ffff168482815181106132f4576132f4615d8c565b016020015160f81c901b91909117906001016132bf565b5061ffff81161561332e5760405162461bcd60e51b815260040161057d906161fc565b5f805b6004811015613389576133458160036161a0565b613350906008615f2d565b63ffffffff1685613362836002615ef8565b8151811061337257613372615d8c565b016020015160f81c901b9190911790600101613331565b5063ffffffff8116156133ae5760405162461bcd60e51b815260040161057d9061623f565b5f805b6020811015613403576133c581601f6161a0565b6133d0906008615f2d565b866133dc836006615ef8565b815181106133ec576133ec615d8c565b016020015160f81c901b91909117906001016133b1565b50949350505050565b60605f61341b83830184615d47565b61342791506058615f2d565b61343290605c615ef8565b6001600160401b0381111561344957613449615dbe565b6040519080825280601f01601f191660200182016040528015613473576020820181803683370190505b5090505f5b60208110156134c8578335816020811061349457613494615d8c565b1a60f81b8282815181106134aa576134aa615d8c565b60200101906001600160f81b03191690815f1a905350600101613478565b505f5b602081101561352857836020013581602081106134ea576134ea615d8c565b1a60f81b826134fa836020615ef8565b8151811061350a5761350a615d8c565b60200101906001600160f81b03191690815f1a9053506001016134cb565b505f5b600481101561358b5761353f8160036161a0565b61354a906008615f2d565b6014901c60f81b8261355d836040615ef8565b8151811061356d5761356d615d8c565b60200101906001600160f81b03191690815f1a90535060010161352b565b505f61359d6060850160408601615d2c565b60601b90505f5b60148110156135fd578181601481106135bf576135bf615d8c565b1a60f81b836135cf836044615ef8565b815181106135df576135df615d8c565b60200101906001600160f81b03191690815f1a9053506001016135a4565b505f61360c6060860186615d47565b905090505f5b6004811015613677576136268160036161a0565b613631906008615f2d565b63ffffffff8316901c60f81b84613649836058615ef8565b8151811061365957613659615d8c565b60200101906001600160f81b03191690815f1a905350600101613612565b505f5b6136876060870187615d47565b905081101561389b575f61369c826058615f2d565b6136a790605c615ef8565b90505f5b6020811015613732576136c16060890189615d47565b848181106136d1576136d1615d8c565b90506020028101906136e39190615da0565b3581602081106136f5576136f5615d8c565b1a60f81b866137048385615ef8565b8151811061371457613714615d8c565b60200101906001600160f81b03191690815f1a9053506001016136ab565b505f5b60088110156137e7576137498160076161a0565b613754906008615f2d565b61376160608a018a615d47565b8581811061377157613771615d8c565b90506020028101906137839190615da0565b6137949060408101906020016159d9565b6001600160401b0316901c60f81b86826137af856020615ef8565b6137b99190615ef8565b815181106137c9576137c9615d8c565b60200101906001600160f81b03191690815f1a905350600101613735565b505f5b6030811015613891576138006060890189615d47565b8481811061381057613810615d8c565b90506020028101906138229190615da0565b613830906040810190616286565b8281811061384057613840615d8c565b9050013560f81c60f81b86828460286138599190615ef8565b6138639190615ef8565b8151811061387357613873615d8c565b60200101906001600160f81b03191690815f1a9053506001016137ea565b505060010161367a565b5091949350505050565b6138ad615869565b5f8281525f8051602061659c8339815191526020526040808220815160e0810190925280545f8051602061653c83398151915293929190829060ff1660058111156138fa576138fa615a12565b600581111561390b5761390b615a12565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561397d5761397d615a12565b146139d95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613a1d57613a1d615a12565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613ac985826126fc565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061657c833981519152805460011901613b5157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061657c83398151915255565b5f5f805160206164fc83398151915281613b86610214856148a0565b90505f613b9287612284565b9050613b9d87612bc8565b613bfa5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161057d565b600281516005811115613c0f57613c0f615a12565b14613c6e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161057d565b5f828260800151613c7f9190615f96565b60048501546040840151919250613ca1916001600160401b03909116906162c8565b6001600160401b0316816001600160401b03161115613d205760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161057d565b5f80613d2c8a846126fc565b915091505f8a83604051602001613d5a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613df557613df5615a12565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613f475760405162461bcd60e51b815260040161057d906161b3565b5f805b6002811015613f9657613f5e8160016161a0565b613f69906008615f2d565b61ffff16858281518110613f7f57613f7f615d8c565b016020015160f81c901b9190911790600101613f4a565b5061ffff811615613fb95760405162461bcd60e51b815260040161057d906161fc565b5f805b600481101561401457613fd08160036161a0565b613fdb906008615f2d565b63ffffffff1686613fed836002615ef8565b81518110613ffd57613ffd615d8c565b016020015160f81c901b9190911790600101613fbc565b5063ffffffff811660031461403b5760405162461bcd60e51b815260040161057d9061623f565b5f805b60208110156140905761405281601f6161a0565b61405d906008615f2d565b87614069836006615ef8565b8151811061407957614079615d8c565b016020015160f81c901b919091179060010161403e565b505f866026815181106140a5576140a5615d8c565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206164fc8339815191529061ffff8616101561414c5760405162461bcd60e51b815260206004820152602b60248201525f8051602061651c83398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161057d565b61271061ffff861611156141a45760405162461bcd60e51b815260206004820152602c60248201525f8051602061651c83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161057d565b60028101546001600160401b03908116908516101561421d5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161057d565b80548310156142805760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161057d565b80600101548311156142e75760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161057d565b5f6142f1846148a0565b90505f6142fd82610a56565b90505f61430a89836148c3565b9050604051806060016040528061431e3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6143b9614e79565b6143c282614ec4565b611aad81614f39565b5f808251602e146143ee5760405162461bcd60e51b815260040161057d906161b3565b5f805b600281101561443d576144058160016161a0565b614410906008615f2d565b61ffff1685828151811061442657614426615d8c565b016020015160f81c901b91909117906001016143f1565b5061ffff8116156144605760405162461bcd60e51b815260040161057d906161fc565b5f805b60048110156144bb576144778160036161a0565b614482906008615f2d565b63ffffffff1686614494836002615ef8565b815181106144a4576144a4615d8c565b016020015160f81c901b9190911790600101614463565b5063ffffffff81166005146144e25760405162461bcd60e51b815260040161057d9061623f565b5f805b6020811015614537576144f981601f6161a0565b614504906008615f2d565b87614510836006615ef8565b8151811061452057614520615d8c565b016020015160f81c901b91909117906001016144e5565b505f805b60088110156145965761454f8160076161a0565b61455a906008615f2d565b6001600160401b03168861456f836026615ef8565b8151811061457f5761457f615d8c565b016020015160f81c901b919091179060010161453b565b5090969095509350505050565b5f8051602061653c8339815191525f6001600160401b0380841690851611156145d7576145d08385615bb1565b90506145e4565b6145e18484615bb1565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614646575060018401548151614642916001600160401b031690615ef8565b8210155b1561466c576001600160401b03831660608201528181526040810151602082015261468b565b828160600181815161467e9190615f96565b6001600160401b03169052505b606081015161469b9060646162c8565b602082015160018601546001600160401b0392909216916146c69190600160401b900460ff16615f2d565b101561472a5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161057d565b856001600160401b0316816040018181516147459190615ef8565b9052506040810180516001600160401b03871691906147659083906161a0565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061659c8339815191526020526040812060020180545f8051602061653c83398151915291600160401b9091046001600160401b03169060086147fb836162f3565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b0383811660248301526044820183905261227f91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614fda565b5f610a66825f805160206164dc833981519152546001600160a01b03169061503b565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661494e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161057d565b5f8051602061653c8339815191524261496d60408601602087016159d9565b6001600160401b0316116149df5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161057d565b6149ef60408501602086016159d9565b6001600160401b0316614a056202a30042615ef8565b11614a785760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161057d565b8335614ad05760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161057d565b83355f90815260088201602052604090205415614b405760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057d565b6030614b4f6040860186616286565b905014614bb45760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057d565b614bbe835f6145a3565b5f80614c576040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614c0291906159d9565b6001600160401b03168152602001614c1d60408a018a616286565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061519d565b5f82815260068601602052604090209193509150614c758282616352565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614cb3908590600401615c48565b6020604051808303815f875af1158015614ccf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614cf39190615c0f565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614d6b57614d6b615a12565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614e4b918e01908e016159d9565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614ec257604051631afcd79f60e31b815260040160405180910390fd5b565b614ecc614e79565b614ed5816152a1565b614edd6152ba565b614f3660608201356080830135614efa60c0850160a086016159d9565b614f0a60e0860160c08701616411565b61ffff16614f1f610100870160e0880161642a565b614f3161012088016101008901615d2c565b6152ca565b50565b614f41614e79565b5f805160206164dc8339815191526001600160a01b038216614fba5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161057d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f614fee6001600160a01b03841683615552565b905080515f14158015615012575080806020019051810190615010919061644a565b155b1561227f57604051635274afe760e01b81526001600160a01b038416600482015260240161057d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015615081573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150a59190615c0f565b90506150bc6001600160a01b03851633308661555f565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015615100573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906151249190615c0f565b905081811161518a5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161057d565b61519482826161a0565b95945050505050565b5f60608260800151516030146152075760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057d565b5f806001855f015186602001518760400151886080015189606001516040516020016152399796959493929190616465565b604051602081830303815290604052905060028160405161525a9190615ee7565b602060405180830381855afa158015615275573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152989190615c0f565b94909350915050565b6152a9614e79565b6152b1615598565b614f36816155a0565b6152c2614e79565b614ec261571b565b6152d2614e79565b5f805160206164fc8339815191528361533e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161057d565b6127108411156153a45760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161057d565b8587111561540c5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161057d565b5f8360ff16116154795760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161057d565b600a60ff841611156154eb5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161057d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606128a383835f615723565b6040516001600160a01b038481166024830152838116604483015260648201839052610a509186918216906323b872dd9060840161486e565b614ec2614e79565b6155a8614e79565b80355f8051602061653c83398151915290815560146155cd606084016040850161642a565b60ff16111561563a5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161057d565b5f61564b606084016040850161642a565b60ff16116156b35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161057d565b6156c3606083016040840161642a565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556156f460408301602084016159d9565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613b57614e79565b6060814710156157485760405163cd78605960e01b815230600482015260240161057d565b5f80856001600160a01b031684866040516157639190615ee7565b5f6040518083038185875af1925050503d805f811461579d576040519150601f19603f3d011682016040523d82523d5f602084013e6157a2565b606091505b50915091506126f28683836060826157c2576157bd82615809565b6128a3565b81511580156157d957506001600160a01b0384163b155b1561580257604051639996b31560e01b81526001600160a01b038516600482015260240161057d565b50806128a3565b8051156158195780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461583e90616001565b5f825580601f1061584d575050565b601f0160209004905f5260205f2090810190614f3691906158a5565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156158b9575f81556001016158a6565b5090565b8015158114614f36575f80fd5b803563ffffffff811681146158dd575f80fd5b919050565b5f805f606084860312156158f4575f80fd5b833592506020840135615906816158bd565b9150615914604085016158ca565b90509250925092565b5f6020828403121561592d575f80fd5b5035919050565b5f60208284031215615944575f80fd5b6128a3826158ca565b5f806040838503121561595e575f80fd5b615967836158ca565b946020939093013593505050565b5f8060408385031215615986575f80fd5b82356001600160401b0381111561599b575f80fd5b8301608081860312156159ac575f80fd5b91506159ba602084016158ca565b90509250929050565b80356001600160401b03811681146158dd575f80fd5b5f602082840312156159e9575f80fd5b6128a3826159c3565b5f8060408385031215615a03575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110615a4957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151615a8460608401826001600160401b03169052565b506080830151615a9f60808401826001600160401b03169052565b5060a0830151615aba60a08401826001600160401b03169052565b5060c083015161305860c08401826001600160401b03169052565b803561ffff811681146158dd575f80fd5b5f805f8060808587031215615af9575f80fd5b84356001600160401b03811115615b0e575f80fd5b850160608188031215615b1f575f80fd5b9350615b2d60208601615ad5565b9250615b3b604086016159c3565b9396929550929360600135925050565b6001600160a01b0381168114614f36575f80fd5b5f80828403610140811215615b72575f80fd5b61012080821215615b81575f80fd5b8493508301359050615b9281615b4b565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561305857613058615b9d565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615c1f575f80fd5b5051919050565b5f5b83811015615c40578181015183820152602001615c28565b50505f910152565b602081525f8251806020840152615c66816040850160208701615c26565b601f01601f19169190910160400192915050565b5f82615c9457634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615d3c575f80fd5b81356128a381615b4b565b5f808335601e19843603018112615d5c575f80fd5b8301803591506001600160401b03821115615d75575f80fd5b6020019150600581901b360382131561284c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615db4575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615df457615df4615dbe565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615e2257615e22615dbe565b604052919050565b5f6001600160401b03821115615e4257615e42615dbe565b50601f01601f191660200190565b5f60608236031215615e60575f80fd5b615e68615dd2565b823581526020615e798185016159c3565b8183015260408401356001600160401b03811115615e95575f80fd5b840136601f820112615ea5575f80fd5b8035615eb8615eb382615e2a565b615dfa565b8181523684838501011115615ecb575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615db4818460208701615c26565b80820180821115610a6657610a66615b9d565b5f63ffffffff808316818103615f2357615f23615b9d565b6001019392505050565b8082028115828204841417610a6657610a66615b9d565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561305857613058615b9d565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c9082168061601557607f821691505b60208210810361603357634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461604b81616001565b806020870152604060018084165f811461606c5760018114616088576160b5565b60ff19851660408a0152604084151560051b8a010195506160b5565b895f5260205f205f5b858110156160ac5781548b8201860152908301908801616091565b8a016040019650505b509398975050505050505050565b80516158dd816158bd565b5f80604083850312156160df575f80fd5b82516001600160401b03808211156160f5575f80fd5b9084019060608287031215616108575f80fd5b616110615dd2565b8251815260208084015161612381615b4b565b82820152604084015183811115616138575f80fd5b80850194505087601f85011261614c575f80fd5b8351925061615c615eb384615e2a565b838152888285870101111561616f575f80fd5b61617e84838301848801615c26565b806040840152508195506161938188016160c3565b9450505050509250929050565b81810381811115610a6657610a66615b9d565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e1984360301811261629b575f80fd5b8301803591506001600160401b038211156162b4575f80fd5b60200191503681900382131561284c575f80fd5b6001600160401b038181168382160280821691908281146162eb576162eb615b9d565b505092915050565b5f6001600160401b03808316818103615f2357615f23615b9d565b601f82111561227f57805f5260205f20601f840160051c810160208510156163335750805b601f840160051c820191505b81811015610b05575f815560010161633f565b81516001600160401b0381111561636b5761636b615dbe565b61637f816163798454616001565b8461630e565b602080601f8311600181146163b2575f841561639b5750858301515b5f19600386901b1c1916600185901b178555616409565b5f85815260208120601f198616915b828110156163e0578886015182559484019460019091019084016163c1565b50858210156163fd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215616421575f80fd5b6128a382615ad5565b5f6020828403121561643a575f80fd5b813560ff811681146128a3575f80fd5b5f6020828403121561645a575f80fd5b81516128a3816158bd565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516164ba81604e860160208901615c26565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161673738038061673783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6165ea8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd366004615904565b61043a565b005b6101d26101e236600461593f565b61089d565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b61021961021436600461593f565b610a56565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004615956565b610a6c565b6101d261026e36600461596f565b610b0c565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004615997565b610f9c565b6102b66102b13660046159fb565b61157f565b6040519081526020016101fd565b6102196102d236600461593f565b611598565b6102b65f81565b6101d26102ec366004615904565b6115ac565b6101ef603081565b6101d261030736600461593f565b6117c8565b6101d261031a36600461596f565b6118ce565b6101d261032d36600461593f565b611ab1565b6102b6610340366004615a14565b611db9565b6101d2610353366004615956565b611de5565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c36600461593f565b611f5b565b6101d261039f36600461593f565b6121ce565b6101ef601481565b6103bf6103ba36600461593f565b6122a9565b6040516101fd9190615a48565b6102196202a30081565b6102b66103e436600461593f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615b08565b612371565b6101d2610435366004615b81565b6123a6565b5f8381525f8051602061657e83398151915260205260408082208151610100810190925280545f8051602061651e83398151915293929190829060ff16600481111561048857610488615a34565b600481111561049957610499615a34565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61051d826122a9565b905060028351600481111561053457610534615a34565b146105865760405162461bcd60e51b815260206004820152602a60248201525f8051602061653e8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105eb5760405162461bcd60e51b815260206004820152603360248201525f8051602061653e8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161057d565b6003835280515f90600290600581111561060757610607615a34565b0361065e57861561061f5761061c8387612485565b90505b5f846060015183608001516106349190615bd3565b90506106408482612721565b506001600160401b0390811660e0870152421660a086015250610692565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106c5866060015161157f565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b81526004016106f99796959493929190615bf3565b602060405180830381865afa158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190615c31565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561077757610777615a34565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088b916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206165be8339815191526020526040808220815160e0810190925280545f8051602061655e83398151915293929190829060ff1660058111156108ea576108ea615a34565b60058111156108fb576108fb615a34565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096a5761096a615a34565b146109cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb6109f48584606001515f612878565b6040518263ffffffff1660e01b8152600401610a109190615c6a565b6020604051808303815f875af1158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190615c31565b50505050565b5f610a6664e8d4a5100083615c9c565b92915050565b5f8051602061651e8339815191525f80610a85846128cf565b91509150610a9282612bed565b610a9c5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610aca57610aca615a34565b03610aef575f83815260088501602052604081208054919055610aed8282612c28565b505b610b0581610b00846040015161157f565b612c9e565b5050505050565b5f8181525f8051602061657e83398151915260205260408082208151610100810190925280545f8051602061651e83398151915293929190829060ff166004811115610b5a57610b5a615a34565b6004811115610b6b57610b6b615a34565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf0906122a9565b9050600182516004811115610c0757610c07615a34565b14610c705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161057d565b600381516005811115610c8557610c85615a34565b03610dfd576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610ce957610ce9615a34565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1257610e12615a34565b03610e2057610b0584612cc1565b5f610e2a86612ebe565b90505f80610e3b8360400151613084565b509150915081856040015114610e635760405162461bcd60e51b815260040161057d90615cbb565b806001600160401b031684606001516001600160401b03161015610ed45760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161057d565b806001600160401b03168560c001516001600160401b03161115610f0a5760405162461bcd60e51b815260040161057d90615d05565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061655e8339815191529060ff16156110395760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a09190615c31565b8360200135146111025760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161057d565b306111136060850160408601615d4e565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161057d565b5f6111936060850185615d69565b905090505f805b828163ffffffff161015611483575f6111b66060880188615d69565b8363ffffffff168181106111cc576111cc615dae565b90506020028101906111de9190615dc2565b6111e790615e72565b80515f818152600888016020526040902054919250901561125f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161057d565b5f6002895f01358560405160200161128e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a891615f09565b602060405180830381855afa1580156112c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e69190615c31565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561137257611372615a34565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611425911686615f1a565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147c90615f2d565b905061119a565b50600483018190555f61149585612ebe565b90505f6114a582604001516132bf565b90505f6114b188613431565b9050816002826040516114c49190615f09565b602060405180830381855afa1580156114df573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115029190615c31565b146115665760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161057d565b5050506009909201805460ff1916600117905550505050565b5f610a666001600160401b03831664e8d4a51000615f4f565b5f6115a2826122a9565b6080015192915050565b5f8051602061651e8339815191525f6115c4856138ca565b90506115cf85612bed565b6115da575050505050565b5f8581526005830160205260409020546001600160a01b031633146116115760405162461bcd60e51b815260040161057d90615f66565b5f85815260058301602052604090205460a082015161164091600160b01b90046001600160401b031690615fb8565b6001600160401b03168160c001516001600160401b031610156116c15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161057d565b8315610b05575f6116d28685612485565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117299061157f565b60a085015160c08601516040516001600160e01b031960e086901b16815261175d939291829188905f908190600401615bf3565b602060405180830381865afa158015611778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c9190615c31565b5f878152600885016020526040812080549091906117bb908490615f1a565b9091555050505050505050565b5f8051602061651e8339815191525f6117e0836122a9565b90506004815160058111156117f7576117f7615a34565b146118615760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161057d565b5f8381526005830160205260409020546001600160a01b031633146118985760405162461bcd60e51b815260040161057d90615f66565b5f83815260088301602090815260408083208054908490556005860190925290912054610a50906001600160a01b031682612c28565b6118d6613b45565b5f8181525f8051602061657e83398151915260205260408082208151610100810190925280545f8051602061651e83398151915293929190829060ff16600481111561192457611924615a34565b600481111561193557611935615a34565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119b185612ebe565b90505f806119c28360400151613084565b5091509150818460400151146119ea5760405162461bcd60e51b815260040161057d90615cbb565b806001600160401b03168460e001516001600160401b03161115611a205760405162461bcd60e51b815260040161057d90615d05565b600384516004811115611a3557611a35615a34565b14611a895760405162461bcd60e51b815260206004820152603160248201525f8051602061653e8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161057d565b611a9286612cc1565b5050505050611aad60015f8051602061659e83398151915255565b5050565b611ab9613b45565b5f8181525f8051602061657e83398151915260205260408082208151610100810190925280545f8051602061651e83398151915293929190829060ff166004811115611b0757611b07615a34565b6004811115611b1857611b18615a34565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611b9c826122a9565b9050600481516005811115611bb357611bb3615a34565b14611c165760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161057d565b600283516004811115611c2b57611c2b615a34565b1480611c495750600383516004811115611c4757611c47615a34565b145b611ca55760405162461bcd60e51b815260206004820152602760248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526632b3b0ba34b7b760c91b606482015260840161057d565b600283516004811115611cba57611cba615a34565b03611d93578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611cf2856060015161157f565b60a0808501516080880151918801515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611d43969593926001600160401b0390921691908190600401615bf3565b602060405180830381865afa158015611d5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d829190615c31565b5f8681526007860160205260409020555b611d9c85612cc1565b50505050611db660015f8051602061659e83398151915255565b50565b5f611dc2613b45565b611dcd833384613b8f565b9050610a6660015f8051602061659e83398151915255565b5f8051602061655e8339815191525f611dfd83612ebe565b90505f80611e0e8360400151613f49565b9150915080611e705760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057d565b60015f83815260078601602052604090205460ff166005811115611e9657611e96615a34565b14611eb35760405162461bcd60e51b815260040161057d90615fd8565b5f8281526006850160205260408120611ecb91615854565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061657e83398151915260205260408082208151610100810190925280545f8051602061651e83398151915293929190829060ff166004811115611fa957611fa9615a34565b6004811115611fba57611fba615a34565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561204157612041615a34565b148061205f575060038151600481111561205d5761205d615a34565b145b6120b35760405162461bcd60e51b815260206004820152603260248201525f8051602061653e833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161057d565b5f6120c182604001516122a9565b905080606001516001600160401b03165f036121455760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb612172846040015184606001518560800151612878565b6040518263ffffffff1660e01b815260040161218e9190615c6a565b6020604051808303815f875af11580156121aa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190615c31565b5f8181525f805160206165be83398151915260205260409020545f8051602061655e8339815191529060019060ff16600581111561220e5761220e615a34565b1461222b5760405162461bcd60e51b815260040161057d90615fd8565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612264919060040161605b565b6020604051808303815f875af1158015612280573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a49190615c31565b505050565b6122b161588b565b5f8281525f805160206165be833981519152602052604090819020815160e0810190925280545f8051602061655e833981519152929190829060ff1660058111156122fe576122fe615a34565b600581111561230f5761230f615a34565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61237a613b45565b612386858585856140ea565b905061239e60015f8051602061659e83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806123ef575080546001600160401b03808416911610155b1561240d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561243884846143d6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124d0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124f791908101906160f0565b915091508061255a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561259d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c19190615c31565b8251146126255760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057d565b60208201516001600160a01b03161561269b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057d565b5f806126aa84604001516143f0565b915091508187146127175760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057d565b9695505050505050565b5f8281525f805160206165be833981519152602052604081206002015481905f8051602061655e83398151915290600160801b90046001600160401b031661276985826145c8565b5f612773876147d6565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6127c38a858b612878565b6040518263ffffffff1660e01b81526004016127df9190615c6a565b6020604051808303815f875af11580156127fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061281f9190615c31565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6128d861588b565b5f8051602061655e8339815191525f6128f085612ebe565b90505f806129018360400151613f49565b9150915080156129665760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057d565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561299757612997615a34565b60058111156129a8576129a8615a34565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612a1757612a17615a34565b1480612a355750600181516005811115612a3357612a33615a34565b145b612a945760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161057d565b600381516005811115612aa957612aa9615a34565b03612ab75760048152612abc565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612b0157612b01615a34565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bb557612bb5615a34565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f805160206164fe83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c83575f80fd5b505af1158015612c95573d5f803e3d5ffd5b50505050505050565b5f805160206164fe83398151915254611aad906001600160a01b03168383614866565b5f8181525f8051602061657e83398151915260205260408082208151610100810190925280545f8051602061651e83398151915293929190829060ff166004811115612d0f57612d0f615a34565b6004811115612d2057612d20615a34565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612e1490600160a01b900461ffff1684615f4f565b612e1e9190615c9c565b905080856008015f8581526020019081526020015f205f828254612e429190615f1a565b909155505f9050612e5382846161c2565b9050612e63856020015182612c28565b612e788560200151610b00876060015161157f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f22573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f4991908101906160f0565b9150915080612fa95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057d565b81511561300a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057d565b60208201516001600160a01b03161561307d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057d565b5092915050565b5f805f83516036146130a85760405162461bcd60e51b815260040161057d906161d5565b5f805b60028110156130f7576130bf8160016161c2565b6130ca906008615f4f565b61ffff168682815181106130e0576130e0615dae565b016020015160f81c901b91909117906001016130ab565b5061ffff81161561311a5760405162461bcd60e51b815260040161057d9061621e565b5f805b6004811015613175576131318160036161c2565b61313c906008615f4f565b63ffffffff168761314e836002615f1a565b8151811061315e5761315e615dae565b016020015160f81c901b919091179060010161311d565b5063ffffffff811660041461319c5760405162461bcd60e51b815260040161057d90616261565b5f805b60208110156131f1576131b381601f6161c2565b6131be906008615f4f565b886131ca836006615f1a565b815181106131da576131da615dae565b016020015160f81c901b919091179060010161319f565b505f805b6008811015613250576132098160076161c2565b613214906008615f4f565b6001600160401b031689613229836026615f1a565b8151811061323957613239615dae565b016020015160f81c901b91909117906001016131f5565b505f805b60088110156132af576132688160076161c2565b613273906008615f4f565b6001600160401b03168a61328883602e615f1a565b8151811061329857613298615dae565b016020015160f81c901b9190911790600101613254565b5091989097509095509350505050565b5f81516026146132e15760405162461bcd60e51b815260040161057d906161d5565b5f805b6002811015613330576132f88160016161c2565b613303906008615f4f565b61ffff1684828151811061331957613319615dae565b016020015160f81c901b91909117906001016132e4565b5061ffff8116156133535760405162461bcd60e51b815260040161057d9061621e565b5f805b60048110156133ae5761336a8160036161c2565b613375906008615f4f565b63ffffffff1685613387836002615f1a565b8151811061339757613397615dae565b016020015160f81c901b9190911790600101613356565b5063ffffffff8116156133d35760405162461bcd60e51b815260040161057d90616261565b5f805b6020811015613428576133ea81601f6161c2565b6133f5906008615f4f565b86613401836006615f1a565b8151811061341157613411615dae565b016020015160f81c901b91909117906001016133d6565b50949350505050565b60605f61344083830184615d69565b61344c91506058615f4f565b61345790605c615f1a565b6001600160401b0381111561346e5761346e615de0565b6040519080825280601f01601f191660200182016040528015613498576020820181803683370190505b5090505f5b60208110156134ed57833581602081106134b9576134b9615dae565b1a60f81b8282815181106134cf576134cf615dae565b60200101906001600160f81b03191690815f1a90535060010161349d565b505f5b602081101561354d578360200135816020811061350f5761350f615dae565b1a60f81b8261351f836020615f1a565b8151811061352f5761352f615dae565b60200101906001600160f81b03191690815f1a9053506001016134f0565b505f5b60048110156135b0576135648160036161c2565b61356f906008615f4f565b6014901c60f81b82613582836040615f1a565b8151811061359257613592615dae565b60200101906001600160f81b03191690815f1a905350600101613550565b505f6135c26060850160408601615d4e565b60601b90505f5b6014811015613622578181601481106135e4576135e4615dae565b1a60f81b836135f4836044615f1a565b8151811061360457613604615dae565b60200101906001600160f81b03191690815f1a9053506001016135c9565b505f6136316060860186615d69565b905090505f5b600481101561369c5761364b8160036161c2565b613656906008615f4f565b63ffffffff8316901c60f81b8461366e836058615f1a565b8151811061367e5761367e615dae565b60200101906001600160f81b03191690815f1a905350600101613637565b505f5b6136ac6060870187615d69565b90508110156138c0575f6136c1826058615f4f565b6136cc90605c615f1a565b90505f5b6020811015613757576136e66060890189615d69565b848181106136f6576136f6615dae565b90506020028101906137089190615dc2565b35816020811061371a5761371a615dae565b1a60f81b866137298385615f1a565b8151811061373957613739615dae565b60200101906001600160f81b03191690815f1a9053506001016136d0565b505f5b600881101561380c5761376e8160076161c2565b613779906008615f4f565b61378660608a018a615d69565b8581811061379657613796615dae565b90506020028101906137a89190615dc2565b6137b99060408101906020016159fb565b6001600160401b0316901c60f81b86826137d4856020615f1a565b6137de9190615f1a565b815181106137ee576137ee615dae565b60200101906001600160f81b03191690815f1a90535060010161375a565b505f5b60308110156138b6576138256060890189615d69565b8481811061383557613835615dae565b90506020028101906138479190615dc2565b6138559060408101906162a8565b8281811061386557613865615dae565b9050013560f81c60f81b868284602861387e9190615f1a565b6138889190615f1a565b8151811061389857613898615dae565b60200101906001600160f81b03191690815f1a90535060010161380f565b505060010161369f565b5091949350505050565b6138d261588b565b5f8281525f805160206165be8339815191526020526040808220815160e0810190925280545f8051602061655e83398151915293929190829060ff16600581111561391f5761391f615a34565b600581111561393057613930615a34565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156139a2576139a2615a34565b146139fe5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613a4257613a42615a34565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613aee8582612721565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061659e833981519152805460011901613b7657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061659e83398151915255565b5f5f8051602061651e83398151915281613bab610214856148c5565b90505f613bb7876122a9565b9050613bc287612bed565b613c1f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161057d565b600281516005811115613c3457613c34615a34565b14613c935760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161057d565b5f828260800151613ca49190615fb8565b60048501546040840151919250613cc6916001600160401b03909116906162ea565b6001600160401b0316816001600160401b03161115613d455760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161057d565b5f80613d518a84612721565b915091505f8a83604051602001613d7f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613e1a57613e1a615a34565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613f6c5760405162461bcd60e51b815260040161057d906161d5565b5f805b6002811015613fbb57613f838160016161c2565b613f8e906008615f4f565b61ffff16858281518110613fa457613fa4615dae565b016020015160f81c901b9190911790600101613f6f565b5061ffff811615613fde5760405162461bcd60e51b815260040161057d9061621e565b5f805b600481101561403957613ff58160036161c2565b614000906008615f4f565b63ffffffff1686614012836002615f1a565b8151811061402257614022615dae565b016020015160f81c901b9190911790600101613fe1565b5063ffffffff81166003146140605760405162461bcd60e51b815260040161057d90616261565b5f805b60208110156140b55761407781601f6161c2565b614082906008615f4f565b8761408e836006615f1a565b8151811061409e5761409e615dae565b016020015160f81c901b9190911790600101614063565b505f866026815181106140ca576140ca615dae565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061651e8339815191529061ffff861610156141715760405162461bcd60e51b815260206004820152602b60248201525f8051602061653e83398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161057d565b61271061ffff861611156141c95760405162461bcd60e51b815260206004820152602c60248201525f8051602061653e83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161057d565b60028101546001600160401b0390811690851610156142425760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161057d565b80548310156142a55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161057d565b806001015483111561430c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161057d565b5f614316846148c5565b90505f61432282610a56565b90505f61432f89836148e8565b905060405180606001604052806143433390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6143de614e9e565b6143e782614ee9565b611aad81614f5b565b5f808251602e146144135760405162461bcd60e51b815260040161057d906161d5565b5f805b60028110156144625761442a8160016161c2565b614435906008615f4f565b61ffff1685828151811061444b5761444b615dae565b016020015160f81c901b9190911790600101614416565b5061ffff8116156144855760405162461bcd60e51b815260040161057d9061621e565b5f805b60048110156144e05761449c8160036161c2565b6144a7906008615f4f565b63ffffffff16866144b9836002615f1a565b815181106144c9576144c9615dae565b016020015160f81c901b9190911790600101614488565b5063ffffffff81166005146145075760405162461bcd60e51b815260040161057d90616261565b5f805b602081101561455c5761451e81601f6161c2565b614529906008615f4f565b87614535836006615f1a565b8151811061454557614545615dae565b016020015160f81c901b919091179060010161450a565b505f805b60088110156145bb576145748160076161c2565b61457f906008615f4f565b6001600160401b031688614594836026615f1a565b815181106145a4576145a4615dae565b016020015160f81c901b9190911790600101614560565b5090969095509350505050565b5f8051602061655e8339815191525f6001600160401b0380841690851611156145fc576145f58385615bd3565b9050614609565b6146068484615bd3565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061466b575060018401548151614667916001600160401b031690615f1a565b8210155b15614691576001600160401b0383166060820152818152604081015160208201526146b0565b82816060018181516146a39190615fb8565b6001600160401b03169052505b60608101516146c09060646162ea565b602082015160018601546001600160401b0392909216916146eb9190600160401b900460ff16615f4f565b101561474f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161057d565b856001600160401b03168160400181815161476a9190615f1a565b9052506040810180516001600160401b038716919061478a9083906161c2565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206165be8339815191526020526040812060020180545f8051602061655e83398151915291600160401b9091046001600160401b031690600861482083616315565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b038381166024830152604482018390526122a491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614ffc565b5f610a66825f805160206164fe833981519152546001600160a01b03169061505d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166149735760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161057d565b5f8051602061655e8339815191524261499260408601602087016159fb565b6001600160401b031611614a045760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161057d565b614a1460408501602086016159fb565b6001600160401b0316614a2a6202a30042615f1a565b11614a9d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161057d565b8335614af55760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161057d565b83355f90815260088201602052604090205415614b655760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057d565b6030614b7460408601866162a8565b905014614bd95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057d565b614be3835f6145c8565b5f80614c7c6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614c2791906159fb565b6001600160401b03168152602001614c4260408a018a6162a8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506151bf565b5f82815260068601602052604090209193509150614c9a8282616374565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614cd8908590600401615c6a565b6020604051808303815f875af1158015614cf4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d189190615c31565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614d9057614d90615a34565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614e70918e01908e016159fb565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614ee757604051631afcd79f60e31b815260040160405180910390fd5b565b614ef1614e9e565b614efa816152c3565b614f026152dc565b611db660608201356080830135614f1f60c0850160a086016159fb565b614f2f60e0860160c08701616433565b61ffff16614f44610100870160e0880161644c565b614f5661012088016101008901615d4e565b6152ec565b614f63614e9e565b5f805160206164fe8339815191526001600160a01b038216614fdc5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161057d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6150106001600160a01b03841683615574565b905080515f14158015615034575080806020019051810190615032919061646c565b155b156122a457604051635274afe760e01b81526001600160a01b038416600482015260240161057d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156150a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150c79190615c31565b90506150de6001600160a01b038516333086615581565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015615122573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906151469190615c31565b90508181116151ac5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161057d565b6151b682826161c2565b95945050505050565b5f60608260800151516030146152295760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057d565b5f806001855f0151866020015187604001518860800151896060015160405160200161525b9796959493929190616487565b604051602081830303815290604052905060028160405161527c9190615f09565b602060405180830381855afa158015615297573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152ba9190615c31565b94909350915050565b6152cb614e9e565b6152d36155ba565b611db6816155c2565b6152e4614e9e565b614ee761573d565b6152f4614e9e565b5f8051602061651e833981519152836153605760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161057d565b6127108411156153c65760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161057d565b8587111561542e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161057d565b5f8360ff161161549b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161057d565b600a60ff8416111561550d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161057d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606128c883835f615745565b6040516001600160a01b038481166024830152838116604483015260648201839052610a509186918216906323b872dd90608401614893565b614ee7614e9e565b6155ca614e9e565b80355f8051602061655e83398151915290815560146155ef606084016040850161644c565b60ff16111561565c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161057d565b5f61566d606084016040850161644c565b60ff16116156d55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161057d565b6156e5606083016040840161644c565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561571660408301602084016159fb565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613b7c614e9e565b60608147101561576a5760405163cd78605960e01b815230600482015260240161057d565b5f80856001600160a01b031684866040516157859190615f09565b5f6040518083038185875af1925050503d805f81146157bf576040519150601f19603f3d011682016040523d82523d5f602084013e6157c4565b606091505b50915091506127178683836060826157e4576157df8261582b565b6128c8565b81511580156157fb57506001600160a01b0384163b155b1561582457604051639996b31560e01b81526001600160a01b038516600482015260240161057d565b50806128c8565b80511561583b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461586090616023565b5f825580601f1061586f575050565b601f0160209004905f5260205f2090810190611db691906158c7565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156158db575f81556001016158c8565b5090565b8015158114611db6575f80fd5b803563ffffffff811681146158ff575f80fd5b919050565b5f805f60608486031215615916575f80fd5b833592506020840135615928816158df565b9150615936604085016158ec565b90509250925092565b5f6020828403121561594f575f80fd5b5035919050565b5f60208284031215615966575f80fd5b6128c8826158ec565b5f8060408385031215615980575f80fd5b615989836158ec565b946020939093013593505050565b5f80604083850312156159a8575f80fd5b82356001600160401b038111156159bd575f80fd5b8301608081860312156159ce575f80fd5b91506159dc602084016158ec565b90509250929050565b80356001600160401b03811681146158ff575f80fd5b5f60208284031215615a0b575f80fd5b6128c8826159e5565b5f8060408385031215615a25575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110615a6b57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151615aa660608401826001600160401b03169052565b506080830151615ac160808401826001600160401b03169052565b5060a0830151615adc60a08401826001600160401b03169052565b5060c083015161307d60c08401826001600160401b03169052565b803561ffff811681146158ff575f80fd5b5f805f8060808587031215615b1b575f80fd5b84356001600160401b03811115615b30575f80fd5b850160608188031215615b41575f80fd5b9350615b4f60208601615af7565b9250615b5d604086016159e5565b9396929550929360600135925050565b6001600160a01b0381168114611db6575f80fd5b5f80828403610140811215615b94575f80fd5b61012080821215615ba3575f80fd5b8493508301359050615bb481615b6d565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561307d5761307d615bbf565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615c41575f80fd5b5051919050565b5f5b83811015615c62578181015183820152602001615c4a565b50505f910152565b602081525f8251806020840152615c88816040850160208701615c48565b601f01601f19169190910160400192915050565b5f82615cb657634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615d5e575f80fd5b81356128c881615b6d565b5f808335601e19843603018112615d7e575f80fd5b8301803591506001600160401b03821115615d97575f80fd5b6020019150600581901b3603821315612871575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615dd6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615e1657615e16615de0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615e4457615e44615de0565b604052919050565b5f6001600160401b03821115615e6457615e64615de0565b50601f01601f191660200190565b5f60608236031215615e82575f80fd5b615e8a615df4565b823581526020615e9b8185016159e5565b8183015260408401356001600160401b03811115615eb7575f80fd5b840136601f820112615ec7575f80fd5b8035615eda615ed582615e4c565b615e1c565b8181523684838501011115615eed575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615dd6818460208701615c48565b80820180821115610a6657610a66615bbf565b5f63ffffffff808316818103615f4557615f45615bbf565b6001019392505050565b8082028115828204841417610a6657610a66615bbf565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561307d5761307d615bbf565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c9082168061603757607f821691505b60208210810361605557634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461606d81616023565b806020870152604060018084165f811461608e57600181146160aa576160d7565b60ff19851660408a0152604084151560051b8a010195506160d7565b895f5260205f205f5b858110156160ce5781548b82018601529083019088016160b3565b8a016040019650505b509398975050505050505050565b80516158ff816158df565b5f8060408385031215616101575f80fd5b82516001600160401b0380821115616117575f80fd5b908401906060828703121561612a575f80fd5b616132615df4565b8251815260208084015161614581615b6d565b8282015260408401518381111561615a575f80fd5b80850194505087601f85011261616e575f80fd5b8351925061617e615ed584615e4c565b8381528882858701011115616191575f80fd5b6161a084838301848801615c48565b806040840152508195506161b58188016160e5565b9450505050509250929050565b81810381811115610a6657610a66615bbf565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e198436030181126162bd575f80fd5b8301803591506001600160401b038211156162d6575f80fd5b602001915036819003821315612871575f80fd5b6001600160401b0381811683821602808216919082811461630d5761630d615bbf565b505092915050565b5f6001600160401b03808316818103615f4557615f45615bbf565b601f8211156122a457805f5260205f20601f840160051c810160208510156163555750805b601f840160051c820191505b81811015610b05575f8155600101616361565b81516001600160401b0381111561638d5761638d615de0565b6163a18161639b8454616023565b84616330565b602080601f8311600181146163d4575f84156163bd5750858301515b5f19600386901b1c1916600185901b17855561642b565b5f85815260208120601f198616915b82811015616402578886015182559484019460019091019084016163e3565b508582101561641f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215616443575f80fd5b6128c882615af7565b5f6020828403121561645c575f80fd5b813560ff811681146128c8575f80fd5b5f6020828403121561647c575f80fd5b81516128c8816158df565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516164dc81604e860160208901615c48565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 147918302..896c61b2e 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516163df3803806163df83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162928061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004615649565b61058b565b005b3480156101ea575f80fd5b506101dd6101f9366004615684565b6109ee565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd61024336600461569b565b610ba7565b348015610253575f80fd5b50610267610262366004615684565b610c84565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046156d9565b610c9a565b604051908152602001610220565b348015610305575f80fd5b506101dd61031436600461572d565b610cce565b348015610324575f80fd5b506101dd610333366004615746565b610d6e565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b36600461576e565b6111fe565b34801561038b575f80fd5b506102ec61039a3660046157bc565b6117e1565b3480156103aa575f80fd5b506102676103b9366004615684565b6117fa565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb366004615649565b61180e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e366004615684565b611a2a565b34801561042e575f80fd5b506101dd61043d366004615746565b611b30565b34801561044d575f80fd5b506101dd61045c366004615684565b611d13565b34801561046c575f80fd5b506101dd61047b36600461572d565b611ff6565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b4366004615684565b61216c565b3480156104c4575f80fd5b506101dd6104d3366004615684565b6123df565b6102ec6104e6366004615684565b6124ba565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e610519366004615684565b6124eb565b60405161022091906157e9565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b366004615684565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f8051602061622683398151915260205260408082208151610100810190925280545f805160206161c683398151915293929190829060ff1660048111156105d9576105d96157d5565b60048111156105ea576105ea6157d5565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61066e826124eb565b9050600283516004811115610685576106856157d5565b146106d75760405162461bcd60e51b815260206004820152602a60248201525f805160206161e68339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461073c5760405162461bcd60e51b815260206004820152603360248201525f805160206161e68339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106ce565b6003835280515f906002906005811115610758576107586157d5565b036107af5786156107705761076d83876125b3565b90505b5f8460600151836080015161078591906158ac565b9050610791848261284f565b506001600160401b0390811660e0870152421660a0860152506107e3565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561081686606001516117e1565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b815260040161084a97969594939291906158cc565b602060405180830381865afa158015610865573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610889919061590a565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108c8576108c86157d5565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109dc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206162668339815191526020526040808220815160e0810190925280545f8051602061620683398151915293929190829060ff166005811115610a3b57610a3b6157d5565b6005811115610a4c57610a4c6157d5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abb57610abb6157d5565b14610b205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb610b458584606001515f6129a6565b6040518263ffffffff1660e01b8152600401610b619190615943565b6020604051808303815f875af1158015610b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba1919061590a565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c38836129f5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9464e8d4a5100083615975565b92915050565b5f610ca3612a09565b610caf84848434612a40565b9050610cc760015f8051602061624683398151915255565b9392505050565b5f805160206161c68339815191525f80610ce784612d34565b91509150610cf482613052565b610cfe5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d2c57610d2c6157d5565b03610d51575f83815260088501602052604081208054919055610d4f828261308d565b505b610d6781610d6284604001516117e1565b6130f3565b5050505050565b5f8181525f8051602061622683398151915260205260408082208151610100810190925280545f805160206161c683398151915293929190829060ff166004811115610dbc57610dbc6157d5565b6004811115610dcd57610dcd6157d5565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e52906124eb565b9050600182516004811115610e6957610e696157d5565b14610ed25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106ce565b600381516005811115610ee757610ee76157d5565b0361105f576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610f4b57610f4b6157d5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115611074576110746157d5565b0361108257610d6784613106565b5f61108c86613303565b90505f8061109d83604001516134c9565b5091509150818560400151146110c55760405162461bcd60e51b81526004016106ce90615994565b806001600160401b031684606001516001600160401b031610156111365760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106ce565b806001600160401b03168560c001516001600160401b0316111561116c5760405162461bcd60e51b81526004016106ce906159de565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206162068339815191529060ff161561129b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611302919061590a565b8360200135146113645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106ce565b306113756060850160408601615a3b565b6001600160a01b0316146113e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106ce565b5f6113f56060850185615a56565b905090505f805b828163ffffffff1610156116e5575f6114186060880188615a56565b8363ffffffff1681811061142e5761142e615a9b565b90506020028101906114409190615aaf565b61144990615b5f565b80515f81815260088801602052604090205491925090156114c15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106ce565b5f6002895f0135856040516020016114f092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150a91615bf6565b602060405180830381855afa158015611525573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611548919061590a565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d4576115d46157d5565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611687911686615c07565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116de90615c1a565b90506113fc565b50600483018190555f6116f785613303565b90505f6117078260400151613704565b90505f61171388613876565b9050816002826040516117269190615bf6565b602060405180830381855afa158015611741573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611764919061590a565b146117c85760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106ce565b5050506009909201805460ff1916600117905550505050565b5f610c946001600160401b03831664e8d4a51000615c3c565b5f611804826124eb565b6080015192915050565b5f805160206161c68339815191525f61182685613d0f565b905061183185613052565b61183c575050505050565b5f8581526005830160205260409020546001600160a01b031633146118735760405162461bcd60e51b81526004016106ce90615c53565b5f85815260058301602052604090205460a08201516118a291600160b01b90046001600160401b031690615ca5565b6001600160401b03168160c001516001600160401b031610156119235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106ce565b8315610d67575f61193486856125b3565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198b906117e1565b60a085015160c08601516040516001600160e01b031960e086901b1681526119bf939291829188905f9081906004016158cc565b602060405180830381865afa1580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe919061590a565b5f87815260088501602052604081208054909190611a1d908490615c07565b9091555050505050505050565b5f805160206161c68339815191525f611a42836124eb565b9050600481516005811115611a5957611a596157d5565b14611ac35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106ce565b5f8381526005830160205260409020546001600160a01b03163314611afa5760405162461bcd60e51b81526004016106ce90615c53565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba1906001600160a01b03168261308d565b611b38612a09565b5f8181525f8051602061622683398151915260205260408082208151610100810190925280545f805160206161c683398151915293929190829060ff166004811115611b8657611b866157d5565b6004811115611b9757611b976157d5565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c1385613303565b90505f80611c2483604001516134c9565b509150915081846040015114611c4c5760405162461bcd60e51b81526004016106ce90615994565b806001600160401b03168460e001516001600160401b03161115611c825760405162461bcd60e51b81526004016106ce906159de565b600384516004811115611c9757611c976157d5565b14611ceb5760405162461bcd60e51b815260206004820152603160248201525f805160206161e68339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106ce565b611cf486613106565b5050505050611d0f60015f8051602061624683398151915255565b5050565b5f8181525f8051602061622683398151915260205260408082208151610100810190925280545f805160206161c683398151915293929190829060ff166004811115611d6157611d616157d5565b6004811115611d7257611d726157d5565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611df6826124eb565b9050600481516005811115611e0d57611e0d6157d5565b14611e705760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106ce565b600283516004811115611e8557611e856157d5565b1480611ea35750600383516004811115611ea157611ea16157d5565b145b611eff5760405162461bcd60e51b815260206004820152602760248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526632b3b0ba34b7b760c91b60648201526084016106ce565b600283516004811115611f1457611f146157d5565b03611fed578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611f4c85606001516117e1565b60a0808501516080880151918801515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611f9d969593926001600160401b03909216919081906004016158cc565b602060405180830381865afa158015611fb8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fdc919061590a565b5f8681526007860160205260409020555b610d6785613106565b5f805160206162068339815191525f61200e83613303565b90505f8061201f8360400151613f8a565b91509150806120815760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106ce565b60015f83815260078601602052604090205460ff1660058111156120a7576120a76157d5565b146120c45760405162461bcd60e51b81526004016106ce90615cc5565b5f82815260068501602052604081206120dc9161559e565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061622683398151915260205260408082208151610100810190925280545f805160206161c683398151915293929190829060ff1660048111156121ba576121ba6157d5565b60048111156121cb576121cb6157d5565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115612252576122526157d5565b1480612270575060038151600481111561226e5761226e6157d5565b145b6122c45760405162461bcd60e51b815260206004820152603260248201525f805160206161e6833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106ce565b5f6122d282604001516124eb565b905080606001516001600160401b03165f036123565760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb6123838460400151846060015185608001516129a6565b6040518263ffffffff1660e01b815260040161239f9190615943565b6020604051808303815f875af11580156123bb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d67919061590a565b5f8181525f8051602061626683398151915260205260409020545f805160206162068339815191529060019060ff16600581111561241f5761241f6157d5565b1461243c5760405162461bcd60e51b81526004016106ce90615cc5565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916124759190600401615d42565b6020604051808303815f875af1158015612491573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b5919061590a565b505050565b5f6124c3612a09565b6124ce82333461412b565b90506124e660015f8051602061624683398151915255565b919050565b6124f36155d5565b5f8281525f80516020616266833981519152602052604090819020815160e0810190925280545f80516020616206833981519152929190829060ff166005811115612540576125406157d5565b6005811115612551576125516157d5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156125fe573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126259190810190615dd7565b91509150806126885760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126ef919061590a565b8251146127535760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106ce565b60208201516001600160a01b0316156127c95760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106ce565b5f806127d884604001516144e2565b915091508187146128455760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106ce565b9695505050505050565b5f8281525f80516020616266833981519152602052604081206002015481905f8051602061620683398151915290600160801b90046001600160401b031661289785826146ba565b5f6128a1876148c8565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6128f18a858b6129a6565b6040518263ffffffff1660e01b815260040161290d9190615943565b6020604051808303815f875af1158015612929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061294d919061590a565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6129fd614958565b612a06816149a3565b50565b5f80516020616246833981519152805460011901612a3a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206161c68339815191529061ffff86161015612ac75760405162461bcd60e51b815260206004820152602b60248201525f805160206161e683398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106ce565b61271061ffff86161115612b1f5760405162461bcd60e51b815260206004820152602c60248201525f805160206161e683398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106ce565b60028101546001600160401b039081169085161015612b985760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106ce565b8054831015612bfb5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106ce565b8060010154831115612c625760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106ce565b825f612c6d82610c84565b90505f612c7a8983614a15565b90506040518060600160405280612c8e3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061624683398151915255565b5f612d3d6155d5565b5f805160206162068339815191525f612d5585613303565b90505f80612d668360400151613f8a565b915091508015612dcb5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106ce565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612dfc57612dfc6157d5565b6005811115612e0d57612e0d6157d5565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612e7c57612e7c6157d5565b1480612e9a5750600181516005811115612e9857612e986157d5565b145b612ef95760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106ce565b600381516005811115612f0e57612f0e6157d5565b03612f1c5760048152612f21565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f6657612f666157d5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561301a5761301a6157d5565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156130d9575f80fd5b505af11580156130eb573d5f803e3d5ffd5b505050505050565b611d0f6001600160a01b03831682614fcb565b5f8181525f8051602061622683398151915260205260408082208151610100810190925280545f805160206161c683398151915293929190829060ff166004811115613154576131546157d5565b6004811115613165576131656157d5565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061325990600160a01b900461ffff1684615c3c565b6132639190615975565b905080856008015f8581526020019081526020015f205f8282546132879190615c07565b909155505f90506132988284615ea9565b90506132a885602001518261308d565b6132bd8560200151610d6287606001516117e1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015613367573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261338e9190810190615dd7565b91509150806133ee5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106ce565b81511561344f5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106ce565b60208201516001600160a01b0316156134c25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106ce565b5092915050565b5f805f83516036146134ed5760405162461bcd60e51b81526004016106ce90615ebc565b5f805b600281101561353c57613504816001615ea9565b61350f906008615c3c565b61ffff1686828151811061352557613525615a9b565b016020015160f81c901b91909117906001016134f0565b5061ffff81161561355f5760405162461bcd60e51b81526004016106ce90615f05565b5f805b60048110156135ba57613576816003615ea9565b613581906008615c3c565b63ffffffff1687613593836002615c07565b815181106135a3576135a3615a9b565b016020015160f81c901b9190911790600101613562565b5063ffffffff81166004146135e15760405162461bcd60e51b81526004016106ce90615f48565b5f805b6020811015613636576135f881601f615ea9565b613603906008615c3c565b8861360f836006615c07565b8151811061361f5761361f615a9b565b016020015160f81c901b91909117906001016135e4565b505f805b60088110156136955761364e816007615ea9565b613659906008615c3c565b6001600160401b03168961366e836026615c07565b8151811061367e5761367e615a9b565b016020015160f81c901b919091179060010161363a565b505f805b60088110156136f4576136ad816007615ea9565b6136b8906008615c3c565b6001600160401b03168a6136cd83602e615c07565b815181106136dd576136dd615a9b565b016020015160f81c901b9190911790600101613699565b5091989097509095509350505050565b5f81516026146137265760405162461bcd60e51b81526004016106ce90615ebc565b5f805b60028110156137755761373d816001615ea9565b613748906008615c3c565b61ffff1684828151811061375e5761375e615a9b565b016020015160f81c901b9190911790600101613729565b5061ffff8116156137985760405162461bcd60e51b81526004016106ce90615f05565b5f805b60048110156137f3576137af816003615ea9565b6137ba906008615c3c565b63ffffffff16856137cc836002615c07565b815181106137dc576137dc615a9b565b016020015160f81c901b919091179060010161379b565b5063ffffffff8116156138185760405162461bcd60e51b81526004016106ce90615f48565b5f805b602081101561386d5761382f81601f615ea9565b61383a906008615c3c565b86613846836006615c07565b8151811061385657613856615a9b565b016020015160f81c901b919091179060010161381b565b50949350505050565b60605f61388583830184615a56565b61389191506058615c3c565b61389c90605c615c07565b6001600160401b038111156138b3576138b3615acd565b6040519080825280601f01601f1916602001820160405280156138dd576020820181803683370190505b5090505f5b602081101561393257833581602081106138fe576138fe615a9b565b1a60f81b82828151811061391457613914615a9b565b60200101906001600160f81b03191690815f1a9053506001016138e2565b505f5b6020811015613992578360200135816020811061395457613954615a9b565b1a60f81b82613964836020615c07565b8151811061397457613974615a9b565b60200101906001600160f81b03191690815f1a905350600101613935565b505f5b60048110156139f5576139a9816003615ea9565b6139b4906008615c3c565b6014901c60f81b826139c7836040615c07565b815181106139d7576139d7615a9b565b60200101906001600160f81b03191690815f1a905350600101613995565b505f613a076060850160408601615a3b565b60601b90505f5b6014811015613a6757818160148110613a2957613a29615a9b565b1a60f81b83613a39836044615c07565b81518110613a4957613a49615a9b565b60200101906001600160f81b03191690815f1a905350600101613a0e565b505f613a766060860186615a56565b905090505f5b6004811015613ae157613a90816003615ea9565b613a9b906008615c3c565b63ffffffff8316901c60f81b84613ab3836058615c07565b81518110613ac357613ac3615a9b565b60200101906001600160f81b03191690815f1a905350600101613a7c565b505f5b613af16060870187615a56565b9050811015613d05575f613b06826058615c3c565b613b1190605c615c07565b90505f5b6020811015613b9c57613b2b6060890189615a56565b84818110613b3b57613b3b615a9b565b9050602002810190613b4d9190615aaf565b358160208110613b5f57613b5f615a9b565b1a60f81b86613b6e8385615c07565b81518110613b7e57613b7e615a9b565b60200101906001600160f81b03191690815f1a905350600101613b15565b505f5b6008811015613c5157613bb3816007615ea9565b613bbe906008615c3c565b613bcb60608a018a615a56565b85818110613bdb57613bdb615a9b565b9050602002810190613bed9190615aaf565b613bfe9060408101906020016157bc565b6001600160401b0316901c60f81b8682613c19856020615c07565b613c239190615c07565b81518110613c3357613c33615a9b565b60200101906001600160f81b03191690815f1a905350600101613b9f565b505f5b6030811015613cfb57613c6a6060890189615a56565b84818110613c7a57613c7a615a9b565b9050602002810190613c8c9190615aaf565b613c9a906040810190615f8f565b82818110613caa57613caa615a9b565b9050013560f81c60f81b8682846028613cc39190615c07565b613ccd9190615c07565b81518110613cdd57613cdd615a9b565b60200101906001600160f81b03191690815f1a905350600101613c54565b5050600101613ae4565b5091949350505050565b613d176155d5565b5f8281525f805160206162668339815191526020526040808220815160e0810190925280545f8051602061620683398151915293929190829060ff166005811115613d6457613d646157d5565b6005811115613d7557613d756157d5565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613de757613de76157d5565b14613e435760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106ce565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e8757613e876157d5565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f33858261284f565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613fad5760405162461bcd60e51b81526004016106ce90615ebc565b5f805b6002811015613ffc57613fc4816001615ea9565b613fcf906008615c3c565b61ffff16858281518110613fe557613fe5615a9b565b016020015160f81c901b9190911790600101613fb0565b5061ffff81161561401f5760405162461bcd60e51b81526004016106ce90615f05565b5f805b600481101561407a57614036816003615ea9565b614041906008615c3c565b63ffffffff1686614053836002615c07565b8151811061406357614063615a9b565b016020015160f81c901b9190911790600101614022565b5063ffffffff81166003146140a15760405162461bcd60e51b81526004016106ce90615f48565b5f805b60208110156140f6576140b881601f615ea9565b6140c3906008615c3c565b876140cf836006615c07565b815181106140df576140df615a9b565b016020015160f81c901b91909117906001016140a4565b505f8660268151811061410b5761410b615a9b565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206161c68339815191528161414484610c84565b90505f614150876124eb565b905061415b87613052565b6141b85760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106ce565b6002815160058111156141cd576141cd6157d5565b1461422c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106ce565b5f82826080015161423d9190615ca5565b6004850154604084015191925061425f916001600160401b0390911690615fd1565b6001600160401b0316816001600160401b031611156142de5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106ce565b5f806142ea8a8461284f565b915091505f8a8360405160200161431892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156143b3576143b36157d5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146145055760405162461bcd60e51b81526004016106ce90615ebc565b5f805b60028110156145545761451c816001615ea9565b614527906008615c3c565b61ffff1685828151811061453d5761453d615a9b565b016020015160f81c901b9190911790600101614508565b5061ffff8116156145775760405162461bcd60e51b81526004016106ce90615f05565b5f805b60048110156145d25761458e816003615ea9565b614599906008615c3c565b63ffffffff16866145ab836002615c07565b815181106145bb576145bb615a9b565b016020015160f81c901b919091179060010161457a565b5063ffffffff81166005146145f95760405162461bcd60e51b81526004016106ce90615f48565b5f805b602081101561464e5761461081601f615ea9565b61461b906008615c3c565b87614627836006615c07565b8151811061463757614637615a9b565b016020015160f81c901b91909117906001016145fc565b505f805b60088110156146ad57614666816007615ea9565b614671906008615c3c565b6001600160401b031688614686836026615c07565b8151811061469657614696615a9b565b016020015160f81c901b9190911790600101614652565b5090969095509350505050565b5f805160206162068339815191525f6001600160401b0380841690851611156146ee576146e783856158ac565b90506146fb565b6146f884846158ac565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061475d575060018401548151614759916001600160401b031690615c07565b8210155b15614783576001600160401b0383166060820152818152604081015160208201526147a2565b82816060018181516147959190615ca5565b6001600160401b03169052505b60608101516147b2906064615fd1565b602082015160018601546001600160401b0392909216916147dd9190600160401b900460ff16615c3c565b10156148415760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106ce565b856001600160401b03168160400181815161485c9190615c07565b9052506040810180516001600160401b038716919061487c908390615ea9565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162668339815191526020526040812060020180545f8051602061620683398151915291600160401b9091046001600160401b031690600861491283615ffc565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166149a157604051631afcd79f60e31b815260040160405180910390fd5b565b6149ab614958565b6149b48161505e565b6149bc615077565b612a06606082013560808301356149d960c0850160a086016157bc565b6149e960e0860160c08701616017565b61ffff166149fe610100870160e08801616030565b614a1061012088016101008901615a3b565b615087565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16614aa05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106ce565b5f8051602061620683398151915242614abf60408601602087016157bc565b6001600160401b031611614b315760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106ce565b614b4160408501602086016157bc565b6001600160401b0316614b576202a30042615c07565b11614bca5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106ce565b8335614c225760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106ce565b83355f90815260088201602052604090205415614c925760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106ce565b6030614ca16040860186615f8f565b905014614d065760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106ce565b614d10835f6146ba565b5f80614da96040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614d5491906157bc565b6001600160401b03168152602001614d6f60408a018a615f8f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061530f565b5f82815260068601602052604090209193509150614dc78282616094565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614e05908590600401615943565b6020604051808303815f875af1158015614e21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e45919061590a565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614ebd57614ebd6157d5565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614f9d918e01908e016157bc565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015614fee5760405163cd78605960e01b81523060048201526024016106ce565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114615037576040519150601f19603f3d011682016040523d82523d5f602084013e61503c565b606091505b50509050806124b557604051630a12f52160e11b815260040160405180910390fd5b615066614958565b61506e615413565b612a068161541b565b61507f614958565b6149a1615596565b61508f614958565b5f805160206161c6833981519152836150fb5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106ce565b6127108411156151615760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106ce565b858711156151c95760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106ce565b5f8360ff16116152365760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106ce565b600a60ff841611156152a85760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106ce565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146153795760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106ce565b5f806001855f015186602001518760400151886080015189606001516040516020016153ab979695949392919061614f565b60405160208183030381529060405290506002816040516153cc9190615bf6565b602060405180830381855afa1580156153e7573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061540a919061590a565b94909350915050565b6149a1614958565b615423614958565b80355f8051602061620683398151915290815560146154486060840160408501616030565b60ff1611156154b55760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106ce565b5f6154c66060840160408501616030565b60ff161161552e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106ce565b61553e6060830160408401616030565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561556f60408301602084016157bc565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d21614958565b5080546155aa90615d10565b5f825580601f106155b9575050565b601f0160209004905f5260205f2090810190612a069190615611565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615625575f8155600101615612565b5090565b8015158114612a06575f80fd5b803563ffffffff811681146124e6575f80fd5b5f805f6060848603121561565b575f80fd5b83359250602084013561566d81615629565b915061567b60408501615636565b90509250925092565b5f60208284031215615694575f80fd5b5035919050565b5f61012082840312156156ac575f80fd5b50919050565b803561ffff811681146124e6575f80fd5b80356001600160401b03811681146124e6575f80fd5b5f805f606084860312156156eb575f80fd5b83356001600160401b03811115615700575f80fd5b840160608187031215615711575f80fd5b925061571f602085016156b2565b915061567b604085016156c3565b5f6020828403121561573d575f80fd5b610cc782615636565b5f8060408385031215615757575f80fd5b61576083615636565b946020939093013593505050565b5f806040838503121561577f575f80fd5b82356001600160401b03811115615794575f80fd5b8301608081860312156157a5575f80fd5b91506157b360208401615636565b90509250929050565b5f602082840312156157cc575f80fd5b610cc7826156c3565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061580c57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161584760608401826001600160401b03169052565b50608083015161586260808401826001600160401b03169052565b5060a083015161587d60a08401826001600160401b03169052565b5060c08301516134c260c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156134c2576134c2615898565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f6020828403121561591a575f80fd5b5051919050565b5f5b8381101561593b578181015183820152602001615923565b50505f910152565b602081525f8251806020840152615961816040850160208701615921565b601f01601f19169190910160400192915050565b5f8261598f57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612a06575f80fd5b5f60208284031215615a4b575f80fd5b8135610cc781615a27565b5f808335601e19843603018112615a6b575f80fd5b8301803591506001600160401b03821115615a84575f80fd5b6020019150600581901b360382131561299f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615ac3575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b0357615b03615acd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615b3157615b31615acd565b604052919050565b5f6001600160401b03821115615b5157615b51615acd565b50601f01601f191660200190565b5f60608236031215615b6f575f80fd5b615b77615ae1565b823581526020615b888185016156c3565b8183015260408401356001600160401b03811115615ba4575f80fd5b840136601f820112615bb4575f80fd5b8035615bc7615bc282615b39565b615b09565b8181523684838501011115615bda575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615ac3818460208701615921565b80820180821115610c9457610c94615898565b5f63ffffffff808316818103615c3257615c32615898565b6001019392505050565b8082028115828204841417610c9457610c94615898565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156134c2576134c2615898565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615d2457607f821691505b6020821081036156ac57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615d5481615d10565b806020870152604060018084165f8114615d755760018114615d9157615dbe565b60ff19851660408a0152604084151560051b8a01019550615dbe565b895f5260205f205f5b85811015615db55781548b8201860152908301908801615d9a565b8a016040019650505b509398975050505050505050565b80516124e681615629565b5f8060408385031215615de8575f80fd5b82516001600160401b0380821115615dfe575f80fd5b9084019060608287031215615e11575f80fd5b615e19615ae1565b82518152602080840151615e2c81615a27565b82820152604084015183811115615e41575f80fd5b80850194505087601f850112615e55575f80fd5b83519250615e65615bc284615b39565b8381528882858701011115615e78575f80fd5b615e8784838301848801615921565b80604084015250819550615e9c818801615dcc565b9450505050509250929050565b81810381811115610c9457610c94615898565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615fa4575f80fd5b8301803591506001600160401b03821115615fbd575f80fd5b60200191503681900382131561299f575f80fd5b6001600160401b03818116838216028082169190828114615ff457615ff4615898565b505092915050565b5f6001600160401b03808316818103615c3257615c32615898565b5f60208284031215616027575f80fd5b610cc7826156b2565b5f60208284031215616040575f80fd5b813560ff81168114610cc7575f80fd5b601f8211156124b557805f5260205f20601f840160051c810160208510156160755750805b601f840160051c820191505b81811015610d67575f8155600101616081565b81516001600160401b038111156160ad576160ad615acd565b6160c1816160bb8454615d10565b84616050565b602080601f8311600181146160f4575f84156160dd5750858301515b5f19600386901b1c1916600185901b1785556130eb565b5f85815260208120601f198616915b8281101561612257888601518255948401946001909101908401616103565b508582101561613f57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516161a481604e860160208901615921565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161640138038061640183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162b48061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d836600461566b565b61058b565b005b3480156101ea575f80fd5b506101dd6101f93660046156a6565b6109ee565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd6102433660046156bd565b610ba7565b348015610253575f80fd5b506102676102623660046156a6565b610c84565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046156fb565b610c9a565b604051908152602001610220565b348015610305575f80fd5b506101dd61031436600461574f565b610cce565b348015610324575f80fd5b506101dd610333366004615768565b610d6e565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b366004615790565b6111fe565b34801561038b575f80fd5b506102ec61039a3660046157de565b6117e1565b3480156103aa575f80fd5b506102676103b93660046156a6565b6117fa565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb36600461566b565b61180e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e3660046156a6565b611a2a565b34801561042e575f80fd5b506101dd61043d366004615768565b611b30565b34801561044d575f80fd5b506101dd61045c3660046156a6565b611d13565b34801561046c575f80fd5b506101dd61047b36600461574f565b61201b565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b43660046156a6565b612191565b3480156104c4575f80fd5b506101dd6104d33660046156a6565b612404565b6102ec6104e63660046156a6565b6124df565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e6105193660046156a6565b612510565b604051610220919061580b565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b3660046156a6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f8051602061624883398151915260205260408082208151610100810190925280545f805160206161e883398151915293929190829060ff1660048111156105d9576105d96157f7565b60048111156105ea576105ea6157f7565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61066e82612510565b9050600283516004811115610685576106856157f7565b146106d75760405162461bcd60e51b815260206004820152602a60248201525f805160206162088339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461073c5760405162461bcd60e51b815260206004820152603360248201525f805160206162088339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106ce565b6003835280515f906002906005811115610758576107586157f7565b036107af5786156107705761076d83876125d8565b90505b5f8460600151836080015161078591906158ce565b90506107918482612874565b506001600160401b0390811660e0870152421660a0860152506107e3565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561081686606001516117e1565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b815260040161084a97969594939291906158ee565b602060405180830381865afa158015610865573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610889919061592c565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108c8576108c86157f7565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109dc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206162888339815191526020526040808220815160e0810190925280545f8051602061622883398151915293929190829060ff166005811115610a3b57610a3b6157f7565b6005811115610a4c57610a4c6157f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abb57610abb6157f7565b14610b205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb610b458584606001515f6129cb565b6040518263ffffffff1660e01b8152600401610b619190615965565b6020604051808303815f875af1158015610b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba1919061592c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c3883612a1a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9464e8d4a5100083615997565b92915050565b5f610ca3612a2b565b610caf84848434612a62565b9050610cc760015f8051602061626883398151915255565b9392505050565b5f805160206161e88339815191525f80610ce784612d56565b91509150610cf482613074565b610cfe5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d2c57610d2c6157f7565b03610d51575f83815260088501602052604081208054919055610d4f82826130af565b505b610d6781610d6284604001516117e1565b613115565b5050505050565b5f8181525f8051602061624883398151915260205260408082208151610100810190925280545f805160206161e883398151915293929190829060ff166004811115610dbc57610dbc6157f7565b6004811115610dcd57610dcd6157f7565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e5290612510565b9050600182516004811115610e6957610e696157f7565b14610ed25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106ce565b600381516005811115610ee757610ee76157f7565b0361105f576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610f4b57610f4b6157f7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115611074576110746157f7565b0361108257610d6784613128565b5f61108c86613325565b90505f8061109d83604001516134eb565b5091509150818560400151146110c55760405162461bcd60e51b81526004016106ce906159b6565b806001600160401b031684606001516001600160401b031610156111365760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106ce565b806001600160401b03168560c001516001600160401b0316111561116c5760405162461bcd60e51b81526004016106ce90615a00565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206162288339815191529060ff161561129b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611302919061592c565b8360200135146113645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106ce565b306113756060850160408601615a5d565b6001600160a01b0316146113e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106ce565b5f6113f56060850185615a78565b905090505f805b828163ffffffff1610156116e5575f6114186060880188615a78565b8363ffffffff1681811061142e5761142e615abd565b90506020028101906114409190615ad1565b61144990615b81565b80515f81815260088801602052604090205491925090156114c15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106ce565b5f6002895f0135856040516020016114f092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150a91615c18565b602060405180830381855afa158015611525573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611548919061592c565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d4576115d46157f7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611687911686615c29565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116de90615c3c565b90506113fc565b50600483018190555f6116f785613325565b90505f6117078260400151613726565b90505f61171388613898565b9050816002826040516117269190615c18565b602060405180830381855afa158015611741573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611764919061592c565b146117c85760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106ce565b5050506009909201805460ff1916600117905550505050565b5f610c946001600160401b03831664e8d4a51000615c5e565b5f61180482612510565b6080015192915050565b5f805160206161e88339815191525f61182685613d31565b905061183185613074565b61183c575050505050565b5f8581526005830160205260409020546001600160a01b031633146118735760405162461bcd60e51b81526004016106ce90615c75565b5f85815260058301602052604090205460a08201516118a291600160b01b90046001600160401b031690615cc7565b6001600160401b03168160c001516001600160401b031610156119235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106ce565b8315610d67575f61193486856125d8565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198b906117e1565b60a085015160c08601516040516001600160e01b031960e086901b1681526119bf939291829188905f9081906004016158ee565b602060405180830381865afa1580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe919061592c565b5f87815260088501602052604081208054909190611a1d908490615c29565b9091555050505050505050565b5f805160206161e88339815191525f611a4283612510565b9050600481516005811115611a5957611a596157f7565b14611ac35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106ce565b5f8381526005830160205260409020546001600160a01b03163314611afa5760405162461bcd60e51b81526004016106ce90615c75565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba1906001600160a01b0316826130af565b611b38612a2b565b5f8181525f8051602061624883398151915260205260408082208151610100810190925280545f805160206161e883398151915293929190829060ff166004811115611b8657611b866157f7565b6004811115611b9757611b976157f7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c1385613325565b90505f80611c2483604001516134eb565b509150915081846040015114611c4c5760405162461bcd60e51b81526004016106ce906159b6565b806001600160401b03168460e001516001600160401b03161115611c825760405162461bcd60e51b81526004016106ce90615a00565b600384516004811115611c9757611c976157f7565b14611ceb5760405162461bcd60e51b815260206004820152603160248201525f805160206162088339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106ce565b611cf486613128565b5050505050611d0f60015f8051602061626883398151915255565b5050565b611d1b612a2b565b5f8181525f8051602061624883398151915260205260408082208151610100810190925280545f805160206161e883398151915293929190829060ff166004811115611d6957611d696157f7565b6004811115611d7a57611d7a6157f7565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611dfe82612510565b9050600481516005811115611e1557611e156157f7565b14611e785760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106ce565b600283516004811115611e8d57611e8d6157f7565b1480611eab5750600383516004811115611ea957611ea96157f7565b145b611f075760405162461bcd60e51b815260206004820152602760248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526632b3b0ba34b7b760c91b60648201526084016106ce565b600283516004811115611f1c57611f1c6157f7565b03611ff5578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611f5485606001516117e1565b60a0808501516080880151918801515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611fa5969593926001600160401b03909216919081906004016158ee565b602060405180830381865afa158015611fc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe4919061592c565b5f8681526007860160205260409020555b611ffe85613128565b5050505061201860015f8051602061626883398151915255565b50565b5f805160206162288339815191525f61203383613325565b90505f806120448360400151613fac565b91509150806120a65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106ce565b60015f83815260078601602052604090205460ff1660058111156120cc576120cc6157f7565b146120e95760405162461bcd60e51b81526004016106ce90615ce7565b5f8281526006850160205260408120612101916155c0565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061624883398151915260205260408082208151610100810190925280545f805160206161e883398151915293929190829060ff1660048111156121df576121df6157f7565b60048111156121f0576121f06157f7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115612277576122776157f7565b14806122955750600381516004811115612293576122936157f7565b145b6122e95760405162461bcd60e51b815260206004820152603260248201525f80516020616208833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106ce565b5f6122f78260400151612510565b905080606001516001600160401b03165f0361237b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb6123a88460400151846060015185608001516129cb565b6040518263ffffffff1660e01b81526004016123c49190615965565b6020604051808303815f875af11580156123e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d67919061592c565b5f8181525f8051602061628883398151915260205260409020545f805160206162288339815191529060019060ff166005811115612444576124446157f7565b146124615760405162461bcd60e51b81526004016106ce90615ce7565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161249a9190600401615d64565b6020604051808303815f875af11580156124b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124da919061592c565b505050565b5f6124e8612a2b565b6124f382333461414d565b905061250b60015f8051602061626883398151915255565b919050565b6125186155f7565b5f8281525f80516020616288833981519152602052604090819020815160e0810190925280545f80516020616228833981519152929190829060ff166005811115612565576125656157f7565b6005811115612576576125766157f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612623573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261264a9190810190615df9565b91509150806126ad5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612714919061592c565b8251146127785760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106ce565b60208201516001600160a01b0316156127ee5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106ce565b5f806127fd8460400151614504565b9150915081871461286a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106ce565b9695505050505050565b5f8281525f80516020616288833981519152602052604081206002015481905f8051602061622883398151915290600160801b90046001600160401b03166128bc85826146dc565b5f6128c6876148ea565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129168a858b6129cb565b6040518263ffffffff1660e01b81526004016129329190615965565b6020604051808303815f875af115801561294e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612972919061592c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612a2261497a565b612018816149c5565b5f80516020616268833981519152805460011901612a5c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206161e88339815191529061ffff86161015612ae95760405162461bcd60e51b815260206004820152602b60248201525f8051602061620883398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106ce565b61271061ffff86161115612b415760405162461bcd60e51b815260206004820152602c60248201525f8051602061620883398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106ce565b60028101546001600160401b039081169085161015612bba5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106ce565b8054831015612c1d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106ce565b8060010154831115612c845760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106ce565b825f612c8f82610c84565b90505f612c9c8983614a37565b90506040518060600160405280612cb03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061626883398151915255565b5f612d5f6155f7565b5f805160206162288339815191525f612d7785613325565b90505f80612d888360400151613fac565b915091508015612ded5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106ce565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612e1e57612e1e6157f7565b6005811115612e2f57612e2f6157f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612e9e57612e9e6157f7565b1480612ebc5750600181516005811115612eba57612eba6157f7565b145b612f1b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106ce565b600381516005811115612f3057612f306157f7565b03612f3e5760048152612f43565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f8857612f886157f7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561303c5761303c6157f7565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156130fb575f80fd5b505af115801561310d573d5f803e3d5ffd5b505050505050565b611d0f6001600160a01b03831682614fed565b5f8181525f8051602061624883398151915260205260408082208151610100810190925280545f805160206161e883398151915293929190829060ff166004811115613176576131766157f7565b6004811115613187576131876157f7565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061327b90600160a01b900461ffff1684615c5e565b6132859190615997565b905080856008015f8581526020019081526020015f205f8282546132a99190615c29565b909155505f90506132ba8284615ecb565b90506132ca8560200151826130af565b6132df8560200151610d6287606001516117e1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015613389573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526133b09190810190615df9565b91509150806134105760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106ce565b8151156134715760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106ce565b60208201516001600160a01b0316156134e45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106ce565b5092915050565b5f805f835160361461350f5760405162461bcd60e51b81526004016106ce90615ede565b5f805b600281101561355e57613526816001615ecb565b613531906008615c5e565b61ffff1686828151811061354757613547615abd565b016020015160f81c901b9190911790600101613512565b5061ffff8116156135815760405162461bcd60e51b81526004016106ce90615f27565b5f805b60048110156135dc57613598816003615ecb565b6135a3906008615c5e565b63ffffffff16876135b5836002615c29565b815181106135c5576135c5615abd565b016020015160f81c901b9190911790600101613584565b5063ffffffff81166004146136035760405162461bcd60e51b81526004016106ce90615f6a565b5f805b60208110156136585761361a81601f615ecb565b613625906008615c5e565b88613631836006615c29565b8151811061364157613641615abd565b016020015160f81c901b9190911790600101613606565b505f805b60088110156136b757613670816007615ecb565b61367b906008615c5e565b6001600160401b031689613690836026615c29565b815181106136a0576136a0615abd565b016020015160f81c901b919091179060010161365c565b505f805b6008811015613716576136cf816007615ecb565b6136da906008615c5e565b6001600160401b03168a6136ef83602e615c29565b815181106136ff576136ff615abd565b016020015160f81c901b91909117906001016136bb565b5091989097509095509350505050565b5f81516026146137485760405162461bcd60e51b81526004016106ce90615ede565b5f805b60028110156137975761375f816001615ecb565b61376a906008615c5e565b61ffff1684828151811061378057613780615abd565b016020015160f81c901b919091179060010161374b565b5061ffff8116156137ba5760405162461bcd60e51b81526004016106ce90615f27565b5f805b6004811015613815576137d1816003615ecb565b6137dc906008615c5e565b63ffffffff16856137ee836002615c29565b815181106137fe576137fe615abd565b016020015160f81c901b91909117906001016137bd565b5063ffffffff81161561383a5760405162461bcd60e51b81526004016106ce90615f6a565b5f805b602081101561388f5761385181601f615ecb565b61385c906008615c5e565b86613868836006615c29565b8151811061387857613878615abd565b016020015160f81c901b919091179060010161383d565b50949350505050565b60605f6138a783830184615a78565b6138b391506058615c5e565b6138be90605c615c29565b6001600160401b038111156138d5576138d5615aef565b6040519080825280601f01601f1916602001820160405280156138ff576020820181803683370190505b5090505f5b6020811015613954578335816020811061392057613920615abd565b1a60f81b82828151811061393657613936615abd565b60200101906001600160f81b03191690815f1a905350600101613904565b505f5b60208110156139b4578360200135816020811061397657613976615abd565b1a60f81b82613986836020615c29565b8151811061399657613996615abd565b60200101906001600160f81b03191690815f1a905350600101613957565b505f5b6004811015613a17576139cb816003615ecb565b6139d6906008615c5e565b6014901c60f81b826139e9836040615c29565b815181106139f9576139f9615abd565b60200101906001600160f81b03191690815f1a9053506001016139b7565b505f613a296060850160408601615a5d565b60601b90505f5b6014811015613a8957818160148110613a4b57613a4b615abd565b1a60f81b83613a5b836044615c29565b81518110613a6b57613a6b615abd565b60200101906001600160f81b03191690815f1a905350600101613a30565b505f613a986060860186615a78565b905090505f5b6004811015613b0357613ab2816003615ecb565b613abd906008615c5e565b63ffffffff8316901c60f81b84613ad5836058615c29565b81518110613ae557613ae5615abd565b60200101906001600160f81b03191690815f1a905350600101613a9e565b505f5b613b136060870187615a78565b9050811015613d27575f613b28826058615c5e565b613b3390605c615c29565b90505f5b6020811015613bbe57613b4d6060890189615a78565b84818110613b5d57613b5d615abd565b9050602002810190613b6f9190615ad1565b358160208110613b8157613b81615abd565b1a60f81b86613b908385615c29565b81518110613ba057613ba0615abd565b60200101906001600160f81b03191690815f1a905350600101613b37565b505f5b6008811015613c7357613bd5816007615ecb565b613be0906008615c5e565b613bed60608a018a615a78565b85818110613bfd57613bfd615abd565b9050602002810190613c0f9190615ad1565b613c209060408101906020016157de565b6001600160401b0316901c60f81b8682613c3b856020615c29565b613c459190615c29565b81518110613c5557613c55615abd565b60200101906001600160f81b03191690815f1a905350600101613bc1565b505f5b6030811015613d1d57613c8c6060890189615a78565b84818110613c9c57613c9c615abd565b9050602002810190613cae9190615ad1565b613cbc906040810190615fb1565b82818110613ccc57613ccc615abd565b9050013560f81c60f81b8682846028613ce59190615c29565b613cef9190615c29565b81518110613cff57613cff615abd565b60200101906001600160f81b03191690815f1a905350600101613c76565b5050600101613b06565b5091949350505050565b613d396155f7565b5f8281525f805160206162888339815191526020526040808220815160e0810190925280545f8051602061622883398151915293929190829060ff166005811115613d8657613d866157f7565b6005811115613d9757613d976157f7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e0957613e096157f7565b14613e655760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106ce565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ea957613ea96157f7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f558582612874565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613fcf5760405162461bcd60e51b81526004016106ce90615ede565b5f805b600281101561401e57613fe6816001615ecb565b613ff1906008615c5e565b61ffff1685828151811061400757614007615abd565b016020015160f81c901b9190911790600101613fd2565b5061ffff8116156140415760405162461bcd60e51b81526004016106ce90615f27565b5f805b600481101561409c57614058816003615ecb565b614063906008615c5e565b63ffffffff1686614075836002615c29565b8151811061408557614085615abd565b016020015160f81c901b9190911790600101614044565b5063ffffffff81166003146140c35760405162461bcd60e51b81526004016106ce90615f6a565b5f805b6020811015614118576140da81601f615ecb565b6140e5906008615c5e565b876140f1836006615c29565b8151811061410157614101615abd565b016020015160f81c901b91909117906001016140c6565b505f8660268151811061412d5761412d615abd565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206161e88339815191528161416684610c84565b90505f61417287612510565b905061417d87613074565b6141da5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106ce565b6002815160058111156141ef576141ef6157f7565b1461424e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106ce565b5f82826080015161425f9190615cc7565b60048501546040840151919250614281916001600160401b0390911690615ff3565b6001600160401b0316816001600160401b031611156143005760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106ce565b5f8061430c8a84612874565b915091505f8a8360405160200161433a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156143d5576143d56157f7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146145275760405162461bcd60e51b81526004016106ce90615ede565b5f805b60028110156145765761453e816001615ecb565b614549906008615c5e565b61ffff1685828151811061455f5761455f615abd565b016020015160f81c901b919091179060010161452a565b5061ffff8116156145995760405162461bcd60e51b81526004016106ce90615f27565b5f805b60048110156145f4576145b0816003615ecb565b6145bb906008615c5e565b63ffffffff16866145cd836002615c29565b815181106145dd576145dd615abd565b016020015160f81c901b919091179060010161459c565b5063ffffffff811660051461461b5760405162461bcd60e51b81526004016106ce90615f6a565b5f805b60208110156146705761463281601f615ecb565b61463d906008615c5e565b87614649836006615c29565b8151811061465957614659615abd565b016020015160f81c901b919091179060010161461e565b505f805b60088110156146cf57614688816007615ecb565b614693906008615c5e565b6001600160401b0316886146a8836026615c29565b815181106146b8576146b8615abd565b016020015160f81c901b9190911790600101614674565b5090969095509350505050565b5f805160206162288339815191525f6001600160401b0380841690851611156147105761470983856158ce565b905061471d565b61471a84846158ce565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061477f57506001840154815161477b916001600160401b031690615c29565b8210155b156147a5576001600160401b0383166060820152818152604081015160208201526147c4565b82816060018181516147b79190615cc7565b6001600160401b03169052505b60608101516147d4906064615ff3565b602082015160018601546001600160401b0392909216916147ff9190600160401b900460ff16615c5e565b10156148635760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106ce565b856001600160401b03168160400181815161487e9190615c29565b9052506040810180516001600160401b038716919061489e908390615ecb565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162888339815191526020526040812060020180545f8051602061622883398151915291600160401b9091046001600160401b03169060086149348361601e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166149c357604051631afcd79f60e31b815260040160405180910390fd5b565b6149cd61497a565b6149d681615080565b6149de615099565b612018606082013560808301356149fb60c0850160a086016157de565b614a0b60e0860160c08701616039565b61ffff16614a20610100870160e08801616052565b614a3261012088016101008901615a5d565b6150a9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16614ac25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106ce565b5f8051602061622883398151915242614ae160408601602087016157de565b6001600160401b031611614b535760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106ce565b614b6360408501602086016157de565b6001600160401b0316614b796202a30042615c29565b11614bec5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106ce565b8335614c445760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106ce565b83355f90815260088201602052604090205415614cb45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106ce565b6030614cc36040860186615fb1565b905014614d285760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106ce565b614d32835f6146dc565b5f80614dcb6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614d7691906157de565b6001600160401b03168152602001614d9160408a018a615fb1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250615331565b5f82815260068601602052604090209193509150614de982826160b6565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614e27908590600401615965565b6020604051808303815f875af1158015614e43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e67919061592c565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614edf57614edf6157f7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614fbf918e01908e016157de565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156150105760405163cd78605960e01b81523060048201526024016106ce565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114615059576040519150601f19603f3d011682016040523d82523d5f602084013e61505e565b606091505b50509050806124da57604051630a12f52160e11b815260040160405180910390fd5b61508861497a565b615090615435565b6120188161543d565b6150a161497a565b6149c36155b8565b6150b161497a565b5f805160206161e88339815191528361511d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106ce565b6127108411156151835760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106ce565b858711156151eb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106ce565b5f8360ff16116152585760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106ce565b600a60ff841611156152ca5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106ce565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461539b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106ce565b5f806001855f015186602001518760400151886080015189606001516040516020016153cd9796959493929190616171565b60405160208183030381529060405290506002816040516153ee9190615c18565b602060405180830381855afa158015615409573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061542c919061592c565b94909350915050565b6149c361497a565b61544561497a565b80355f80516020616228833981519152908155601461546a6060840160408501616052565b60ff1611156154d75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106ce565b5f6154e86060840160408501616052565b60ff16116155505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106ce565b6155606060830160408401616052565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561559160408301602084016157de565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d4361497a565b5080546155cc90615d32565b5f825580601f106155db575050565b601f0160209004905f5260205f20908101906120189190615633565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615647575f8155600101615634565b5090565b8015158114612018575f80fd5b803563ffffffff8116811461250b575f80fd5b5f805f6060848603121561567d575f80fd5b83359250602084013561568f8161564b565b915061569d60408501615658565b90509250925092565b5f602082840312156156b6575f80fd5b5035919050565b5f61012082840312156156ce575f80fd5b50919050565b803561ffff8116811461250b575f80fd5b80356001600160401b038116811461250b575f80fd5b5f805f6060848603121561570d575f80fd5b83356001600160401b03811115615722575f80fd5b840160608187031215615733575f80fd5b9250615741602085016156d4565b915061569d604085016156e5565b5f6020828403121561575f575f80fd5b610cc782615658565b5f8060408385031215615779575f80fd5b61578283615658565b946020939093013593505050565b5f80604083850312156157a1575f80fd5b82356001600160401b038111156157b6575f80fd5b8301608081860312156157c7575f80fd5b91506157d560208401615658565b90509250929050565b5f602082840312156157ee575f80fd5b610cc7826156e5565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061582e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161586960608401826001600160401b03169052565b50608083015161588460808401826001600160401b03169052565b5060a083015161589f60a08401826001600160401b03169052565b5060c08301516134e460c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156134e4576134e46158ba565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f6020828403121561593c575f80fd5b5051919050565b5f5b8381101561595d578181015183820152602001615945565b50505f910152565b602081525f8251806020840152615983816040850160208701615943565b601f01601f19169190910160400192915050565b5f826159b157634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612018575f80fd5b5f60208284031215615a6d575f80fd5b8135610cc781615a49565b5f808335601e19843603018112615a8d575f80fd5b8301803591506001600160401b03821115615aa6575f80fd5b6020019150600581901b36038213156129c4575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615ae5575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b2557615b25615aef565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615b5357615b53615aef565b604052919050565b5f6001600160401b03821115615b7357615b73615aef565b50601f01601f191660200190565b5f60608236031215615b91575f80fd5b615b99615b03565b823581526020615baa8185016156e5565b8183015260408401356001600160401b03811115615bc6575f80fd5b840136601f820112615bd6575f80fd5b8035615be9615be482615b5b565b615b2b565b8181523684838501011115615bfc575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615ae5818460208701615943565b80820180821115610c9457610c946158ba565b5f63ffffffff808316818103615c5457615c546158ba565b6001019392505050565b8082028115828204841417610c9457610c946158ba565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156134e4576134e46158ba565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615d4657607f821691505b6020821081036156ce57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615d7681615d32565b806020870152604060018084165f8114615d975760018114615db357615de0565b60ff19851660408a0152604084151560051b8a01019550615de0565b895f5260205f205f5b85811015615dd75781548b8201860152908301908801615dbc565b8a016040019650505b509398975050505050505050565b805161250b8161564b565b5f8060408385031215615e0a575f80fd5b82516001600160401b0380821115615e20575f80fd5b9084019060608287031215615e33575f80fd5b615e3b615b03565b82518152602080840151615e4e81615a49565b82820152604084015183811115615e63575f80fd5b80850194505087601f850112615e77575f80fd5b83519250615e87615be484615b5b565b8381528882858701011115615e9a575f80fd5b615ea984838301848801615943565b80604084015250819550615ebe818801615dee565b9450505050509250929050565b81810381811115610c9457610c946158ba565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615fc6575f80fd5b8301803591506001600160401b03821115615fdf575f80fd5b6020019150368190038213156129c4575f80fd5b6001600160401b03818116838216028082169190828114616016576160166158ba565b505092915050565b5f6001600160401b03808316818103615c5457615c546158ba565b5f60208284031215616049575f80fd5b610cc7826156d4565b5f60208284031215616062575f80fd5b813560ff81168114610cc7575f80fd5b601f8211156124da57805f5260205f20601f840160051c810160208510156160975750805b601f840160051c820191505b81811015610d67575f81556001016160a3565b81516001600160401b038111156160cf576160cf615aef565b6160e3816160dd8454615d32565b84616072565b602080601f831160018114616116575f84156160ff5750858301515b5f19600386901b1c1916600185901b17855561310d565b5f85815260208120601f198616915b8281101561614457888601518255948401946001909101908401616125565b508582101561616157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516161c681604e860160208901615943565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 466f9ca7a..b94b247ae 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -422,7 +422,7 @@ abstract contract PoSValidatorManager is }); } - function endDelegationCompletedValidator(bytes32 delegationID) external { + function endDelegationCompletedValidator(bytes32 delegationID) external nonReentrant { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; @@ -521,6 +521,10 @@ abstract contract PoSValidatorManager is }); } + /** + * @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. + */ function resendUpdateDelegation(bytes32 delegationID) external { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index 2d8b2e056..2b8184cbe 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -129,6 +129,14 @@ interface IPoSValidatorManager is IValidatorManager { */ function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external; + /** + * @notice Removes a delegator from a completed validation period. The delegator can be in either the active or pending removed + * state. No uptime proof is required in this case, because it will have been provided by the validator upon their exit. + * Note that this function can only be called by any address to clean up the delegation. + * @param delegationID The ID of the delegation being removed. + */ + function endDelegationCompletedValidator(bytes32 delegationID) external; + /** * @notice Begins the process of removing a delegator from a validation period. The delegator must have been previously * registered with the given validationID. For the purposes of computing delegation rewards, the delegation period is From 396bf4c712c40b4813a3e9b4effbf805d99560be Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 20 Sep 2024 16:03:00 -0400 Subject: [PATCH 387/545] Fix delegator end time --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index db6721dbf..697ea3bc2 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161673738038061673783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6165ea8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd366004615904565b61043a565b005b6101d26101e236600461593f565b61089d565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b61021961021436600461593f565b610a56565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004615956565b610a6c565b6101d261026e36600461596f565b610b0c565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004615997565b610f9c565b6102b66102b13660046159fb565b61157f565b6040519081526020016101fd565b6102196102d236600461593f565b611598565b6102b65f81565b6101d26102ec366004615904565b6115ac565b6101ef603081565b6101d261030736600461593f565b6117c8565b6101d261031a36600461596f565b6118ce565b6101d261032d36600461593f565b611ab1565b6102b6610340366004615a14565b611db9565b6101d2610353366004615956565b611de5565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c36600461593f565b611f5b565b6101d261039f36600461593f565b6121ce565b6101ef601481565b6103bf6103ba36600461593f565b6122a9565b6040516101fd9190615a48565b6102196202a30081565b6102b66103e436600461593f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615b08565b612371565b6101d2610435366004615b81565b6123a6565b5f8381525f8051602061657e83398151915260205260408082208151610100810190925280545f8051602061651e83398151915293929190829060ff16600481111561048857610488615a34565b600481111561049957610499615a34565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61051d826122a9565b905060028351600481111561053457610534615a34565b146105865760405162461bcd60e51b815260206004820152602a60248201525f8051602061653e8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105eb5760405162461bcd60e51b815260206004820152603360248201525f8051602061653e8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161057d565b6003835280515f90600290600581111561060757610607615a34565b0361065e57861561061f5761061c8387612485565b90505b5f846060015183608001516106349190615bd3565b90506106408482612721565b506001600160401b0390811660e0870152421660a086015250610692565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106c5866060015161157f565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b81526004016106f99796959493929190615bf3565b602060405180830381865afa158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190615c31565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561077757610777615a34565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088b916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206165be8339815191526020526040808220815160e0810190925280545f8051602061655e83398151915293929190829060ff1660058111156108ea576108ea615a34565b60058111156108fb576108fb615a34565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096a5761096a615a34565b146109cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb6109f48584606001515f612878565b6040518263ffffffff1660e01b8152600401610a109190615c6a565b6020604051808303815f875af1158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190615c31565b50505050565b5f610a6664e8d4a5100083615c9c565b92915050565b5f8051602061651e8339815191525f80610a85846128cf565b91509150610a9282612bed565b610a9c5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610aca57610aca615a34565b03610aef575f83815260088501602052604081208054919055610aed8282612c28565b505b610b0581610b00846040015161157f565b612c9e565b5050505050565b5f8181525f8051602061657e83398151915260205260408082208151610100810190925280545f8051602061651e83398151915293929190829060ff166004811115610b5a57610b5a615a34565b6004811115610b6b57610b6b615a34565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf0906122a9565b9050600182516004811115610c0757610c07615a34565b14610c705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161057d565b600381516005811115610c8557610c85615a34565b03610dfd576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610ce957610ce9615a34565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1257610e12615a34565b03610e2057610b0584612cc1565b5f610e2a86612ebe565b90505f80610e3b8360400151613084565b509150915081856040015114610e635760405162461bcd60e51b815260040161057d90615cbb565b806001600160401b031684606001516001600160401b03161015610ed45760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161057d565b806001600160401b03168560c001516001600160401b03161115610f0a5760405162461bcd60e51b815260040161057d90615d05565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061655e8339815191529060ff16156110395760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a09190615c31565b8360200135146111025760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161057d565b306111136060850160408601615d4e565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161057d565b5f6111936060850185615d69565b905090505f805b828163ffffffff161015611483575f6111b66060880188615d69565b8363ffffffff168181106111cc576111cc615dae565b90506020028101906111de9190615dc2565b6111e790615e72565b80515f818152600888016020526040902054919250901561125f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161057d565b5f6002895f01358560405160200161128e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a891615f09565b602060405180830381855afa1580156112c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e69190615c31565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561137257611372615a34565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611425911686615f1a565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147c90615f2d565b905061119a565b50600483018190555f61149585612ebe565b90505f6114a582604001516132bf565b90505f6114b188613431565b9050816002826040516114c49190615f09565b602060405180830381855afa1580156114df573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115029190615c31565b146115665760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161057d565b5050506009909201805460ff1916600117905550505050565b5f610a666001600160401b03831664e8d4a51000615f4f565b5f6115a2826122a9565b6080015192915050565b5f8051602061651e8339815191525f6115c4856138ca565b90506115cf85612bed565b6115da575050505050565b5f8581526005830160205260409020546001600160a01b031633146116115760405162461bcd60e51b815260040161057d90615f66565b5f85815260058301602052604090205460a082015161164091600160b01b90046001600160401b031690615fb8565b6001600160401b03168160c001516001600160401b031610156116c15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161057d565b8315610b05575f6116d28685612485565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117299061157f565b60a085015160c08601516040516001600160e01b031960e086901b16815261175d939291829188905f908190600401615bf3565b602060405180830381865afa158015611778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c9190615c31565b5f878152600885016020526040812080549091906117bb908490615f1a565b9091555050505050505050565b5f8051602061651e8339815191525f6117e0836122a9565b90506004815160058111156117f7576117f7615a34565b146118615760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161057d565b5f8381526005830160205260409020546001600160a01b031633146118985760405162461bcd60e51b815260040161057d90615f66565b5f83815260088301602090815260408083208054908490556005860190925290912054610a50906001600160a01b031682612c28565b6118d6613b45565b5f8181525f8051602061657e83398151915260205260408082208151610100810190925280545f8051602061651e83398151915293929190829060ff16600481111561192457611924615a34565b600481111561193557611935615a34565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119b185612ebe565b90505f806119c28360400151613084565b5091509150818460400151146119ea5760405162461bcd60e51b815260040161057d90615cbb565b806001600160401b03168460e001516001600160401b03161115611a205760405162461bcd60e51b815260040161057d90615d05565b600384516004811115611a3557611a35615a34565b14611a895760405162461bcd60e51b815260206004820152603160248201525f8051602061653e8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161057d565b611a9286612cc1565b5050505050611aad60015f8051602061659e83398151915255565b5050565b611ab9613b45565b5f8181525f8051602061657e83398151915260205260408082208151610100810190925280545f8051602061651e83398151915293929190829060ff166004811115611b0757611b07615a34565b6004811115611b1857611b18615a34565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611b9c826122a9565b9050600481516005811115611bb357611bb3615a34565b14611c165760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161057d565b600283516004811115611c2b57611c2b615a34565b1480611c495750600383516004811115611c4757611c47615a34565b145b611ca55760405162461bcd60e51b815260206004820152602760248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526632b3b0ba34b7b760c91b606482015260840161057d565b600283516004811115611cba57611cba615a34565b03611d93578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611cf2856060015161157f565b60a0808501516080880151918801515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611d43969593926001600160401b0390921691908190600401615bf3565b602060405180830381865afa158015611d5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d829190615c31565b5f8681526007860160205260409020555b611d9c85612cc1565b50505050611db660015f8051602061659e83398151915255565b50565b5f611dc2613b45565b611dcd833384613b8f565b9050610a6660015f8051602061659e83398151915255565b5f8051602061655e8339815191525f611dfd83612ebe565b90505f80611e0e8360400151613f49565b9150915080611e705760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057d565b60015f83815260078601602052604090205460ff166005811115611e9657611e96615a34565b14611eb35760405162461bcd60e51b815260040161057d90615fd8565b5f8281526006850160205260408120611ecb91615854565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061657e83398151915260205260408082208151610100810190925280545f8051602061651e83398151915293929190829060ff166004811115611fa957611fa9615a34565b6004811115611fba57611fba615a34565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561204157612041615a34565b148061205f575060038151600481111561205d5761205d615a34565b145b6120b35760405162461bcd60e51b815260206004820152603260248201525f8051602061653e833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161057d565b5f6120c182604001516122a9565b905080606001516001600160401b03165f036121455760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb612172846040015184606001518560800151612878565b6040518263ffffffff1660e01b815260040161218e9190615c6a565b6020604051808303815f875af11580156121aa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190615c31565b5f8181525f805160206165be83398151915260205260409020545f8051602061655e8339815191529060019060ff16600581111561220e5761220e615a34565b1461222b5760405162461bcd60e51b815260040161057d90615fd8565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612264919060040161605b565b6020604051808303815f875af1158015612280573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a49190615c31565b505050565b6122b161588b565b5f8281525f805160206165be833981519152602052604090819020815160e0810190925280545f8051602061655e833981519152929190829060ff1660058111156122fe576122fe615a34565b600581111561230f5761230f615a34565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61237a613b45565b612386858585856140ea565b905061239e60015f8051602061659e83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806123ef575080546001600160401b03808416911610155b1561240d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561243884846143d6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124d0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124f791908101906160f0565b915091508061255a5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561259d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c19190615c31565b8251146126255760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057d565b60208201516001600160a01b03161561269b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057d565b5f806126aa84604001516143f0565b915091508187146127175760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057d565b9695505050505050565b5f8281525f805160206165be833981519152602052604081206002015481905f8051602061655e83398151915290600160801b90046001600160401b031661276985826145c8565b5f612773876147d6565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6127c38a858b612878565b6040518263ffffffff1660e01b81526004016127df9190615c6a565b6020604051808303815f875af11580156127fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061281f9190615c31565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6128d861588b565b5f8051602061655e8339815191525f6128f085612ebe565b90505f806129018360400151613f49565b9150915080156129665760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057d565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561299757612997615a34565b60058111156129a8576129a8615a34565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612a1757612a17615a34565b1480612a355750600181516005811115612a3357612a33615a34565b145b612a945760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161057d565b600381516005811115612aa957612aa9615a34565b03612ab75760048152612abc565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612b0157612b01615a34565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bb557612bb5615a34565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f805160206164fe83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c83575f80fd5b505af1158015612c95573d5f803e3d5ffd5b50505050505050565b5f805160206164fe83398151915254611aad906001600160a01b03168383614866565b5f8181525f8051602061657e83398151915260205260408082208151610100810190925280545f8051602061651e83398151915293929190829060ff166004811115612d0f57612d0f615a34565b6004811115612d2057612d20615a34565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612e1490600160a01b900461ffff1684615f4f565b612e1e9190615c9c565b905080856008015f8581526020019081526020015f205f828254612e429190615f1a565b909155505f9050612e5382846161c2565b9050612e63856020015182612c28565b612e788560200151610b00876060015161157f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f22573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f4991908101906160f0565b9150915080612fa95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057d565b81511561300a5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057d565b60208201516001600160a01b03161561307d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057d565b5092915050565b5f805f83516036146130a85760405162461bcd60e51b815260040161057d906161d5565b5f805b60028110156130f7576130bf8160016161c2565b6130ca906008615f4f565b61ffff168682815181106130e0576130e0615dae565b016020015160f81c901b91909117906001016130ab565b5061ffff81161561311a5760405162461bcd60e51b815260040161057d9061621e565b5f805b6004811015613175576131318160036161c2565b61313c906008615f4f565b63ffffffff168761314e836002615f1a565b8151811061315e5761315e615dae565b016020015160f81c901b919091179060010161311d565b5063ffffffff811660041461319c5760405162461bcd60e51b815260040161057d90616261565b5f805b60208110156131f1576131b381601f6161c2565b6131be906008615f4f565b886131ca836006615f1a565b815181106131da576131da615dae565b016020015160f81c901b919091179060010161319f565b505f805b6008811015613250576132098160076161c2565b613214906008615f4f565b6001600160401b031689613229836026615f1a565b8151811061323957613239615dae565b016020015160f81c901b91909117906001016131f5565b505f805b60088110156132af576132688160076161c2565b613273906008615f4f565b6001600160401b03168a61328883602e615f1a565b8151811061329857613298615dae565b016020015160f81c901b9190911790600101613254565b5091989097509095509350505050565b5f81516026146132e15760405162461bcd60e51b815260040161057d906161d5565b5f805b6002811015613330576132f88160016161c2565b613303906008615f4f565b61ffff1684828151811061331957613319615dae565b016020015160f81c901b91909117906001016132e4565b5061ffff8116156133535760405162461bcd60e51b815260040161057d9061621e565b5f805b60048110156133ae5761336a8160036161c2565b613375906008615f4f565b63ffffffff1685613387836002615f1a565b8151811061339757613397615dae565b016020015160f81c901b9190911790600101613356565b5063ffffffff8116156133d35760405162461bcd60e51b815260040161057d90616261565b5f805b6020811015613428576133ea81601f6161c2565b6133f5906008615f4f565b86613401836006615f1a565b8151811061341157613411615dae565b016020015160f81c901b91909117906001016133d6565b50949350505050565b60605f61344083830184615d69565b61344c91506058615f4f565b61345790605c615f1a565b6001600160401b0381111561346e5761346e615de0565b6040519080825280601f01601f191660200182016040528015613498576020820181803683370190505b5090505f5b60208110156134ed57833581602081106134b9576134b9615dae565b1a60f81b8282815181106134cf576134cf615dae565b60200101906001600160f81b03191690815f1a90535060010161349d565b505f5b602081101561354d578360200135816020811061350f5761350f615dae565b1a60f81b8261351f836020615f1a565b8151811061352f5761352f615dae565b60200101906001600160f81b03191690815f1a9053506001016134f0565b505f5b60048110156135b0576135648160036161c2565b61356f906008615f4f565b6014901c60f81b82613582836040615f1a565b8151811061359257613592615dae565b60200101906001600160f81b03191690815f1a905350600101613550565b505f6135c26060850160408601615d4e565b60601b90505f5b6014811015613622578181601481106135e4576135e4615dae565b1a60f81b836135f4836044615f1a565b8151811061360457613604615dae565b60200101906001600160f81b03191690815f1a9053506001016135c9565b505f6136316060860186615d69565b905090505f5b600481101561369c5761364b8160036161c2565b613656906008615f4f565b63ffffffff8316901c60f81b8461366e836058615f1a565b8151811061367e5761367e615dae565b60200101906001600160f81b03191690815f1a905350600101613637565b505f5b6136ac6060870187615d69565b90508110156138c0575f6136c1826058615f4f565b6136cc90605c615f1a565b90505f5b6020811015613757576136e66060890189615d69565b848181106136f6576136f6615dae565b90506020028101906137089190615dc2565b35816020811061371a5761371a615dae565b1a60f81b866137298385615f1a565b8151811061373957613739615dae565b60200101906001600160f81b03191690815f1a9053506001016136d0565b505f5b600881101561380c5761376e8160076161c2565b613779906008615f4f565b61378660608a018a615d69565b8581811061379657613796615dae565b90506020028101906137a89190615dc2565b6137b99060408101906020016159fb565b6001600160401b0316901c60f81b86826137d4856020615f1a565b6137de9190615f1a565b815181106137ee576137ee615dae565b60200101906001600160f81b03191690815f1a90535060010161375a565b505f5b60308110156138b6576138256060890189615d69565b8481811061383557613835615dae565b90506020028101906138479190615dc2565b6138559060408101906162a8565b8281811061386557613865615dae565b9050013560f81c60f81b868284602861387e9190615f1a565b6138889190615f1a565b8151811061389857613898615dae565b60200101906001600160f81b03191690815f1a90535060010161380f565b505060010161369f565b5091949350505050565b6138d261588b565b5f8281525f805160206165be8339815191526020526040808220815160e0810190925280545f8051602061655e83398151915293929190829060ff16600581111561391f5761391f615a34565b600581111561393057613930615a34565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156139a2576139a2615a34565b146139fe5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613a4257613a42615a34565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613aee8582612721565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061659e833981519152805460011901613b7657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061659e83398151915255565b5f5f8051602061651e83398151915281613bab610214856148c5565b90505f613bb7876122a9565b9050613bc287612bed565b613c1f5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161057d565b600281516005811115613c3457613c34615a34565b14613c935760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161057d565b5f828260800151613ca49190615fb8565b60048501546040840151919250613cc6916001600160401b03909116906162ea565b6001600160401b0316816001600160401b03161115613d455760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161057d565b5f80613d518a84612721565b915091505f8a83604051602001613d7f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613e1a57613e1a615a34565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613f6c5760405162461bcd60e51b815260040161057d906161d5565b5f805b6002811015613fbb57613f838160016161c2565b613f8e906008615f4f565b61ffff16858281518110613fa457613fa4615dae565b016020015160f81c901b9190911790600101613f6f565b5061ffff811615613fde5760405162461bcd60e51b815260040161057d9061621e565b5f805b600481101561403957613ff58160036161c2565b614000906008615f4f565b63ffffffff1686614012836002615f1a565b8151811061402257614022615dae565b016020015160f81c901b9190911790600101613fe1565b5063ffffffff81166003146140605760405162461bcd60e51b815260040161057d90616261565b5f805b60208110156140b55761407781601f6161c2565b614082906008615f4f565b8761408e836006615f1a565b8151811061409e5761409e615dae565b016020015160f81c901b9190911790600101614063565b505f866026815181106140ca576140ca615dae565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061651e8339815191529061ffff861610156141715760405162461bcd60e51b815260206004820152602b60248201525f8051602061653e83398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161057d565b61271061ffff861611156141c95760405162461bcd60e51b815260206004820152602c60248201525f8051602061653e83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161057d565b60028101546001600160401b0390811690851610156142425760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161057d565b80548310156142a55760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161057d565b806001015483111561430c5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161057d565b5f614316846148c5565b90505f61432282610a56565b90505f61432f89836148e8565b905060405180606001604052806143433390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6143de614e9e565b6143e782614ee9565b611aad81614f5b565b5f808251602e146144135760405162461bcd60e51b815260040161057d906161d5565b5f805b60028110156144625761442a8160016161c2565b614435906008615f4f565b61ffff1685828151811061444b5761444b615dae565b016020015160f81c901b9190911790600101614416565b5061ffff8116156144855760405162461bcd60e51b815260040161057d9061621e565b5f805b60048110156144e05761449c8160036161c2565b6144a7906008615f4f565b63ffffffff16866144b9836002615f1a565b815181106144c9576144c9615dae565b016020015160f81c901b9190911790600101614488565b5063ffffffff81166005146145075760405162461bcd60e51b815260040161057d90616261565b5f805b602081101561455c5761451e81601f6161c2565b614529906008615f4f565b87614535836006615f1a565b8151811061454557614545615dae565b016020015160f81c901b919091179060010161450a565b505f805b60088110156145bb576145748160076161c2565b61457f906008615f4f565b6001600160401b031688614594836026615f1a565b815181106145a4576145a4615dae565b016020015160f81c901b9190911790600101614560565b5090969095509350505050565b5f8051602061655e8339815191525f6001600160401b0380841690851611156145fc576145f58385615bd3565b9050614609565b6146068484615bd3565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061466b575060018401548151614667916001600160401b031690615f1a565b8210155b15614691576001600160401b0383166060820152818152604081015160208201526146b0565b82816060018181516146a39190615fb8565b6001600160401b03169052505b60608101516146c09060646162ea565b602082015160018601546001600160401b0392909216916146eb9190600160401b900460ff16615f4f565b101561474f5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161057d565b856001600160401b03168160400181815161476a9190615f1a565b9052506040810180516001600160401b038716919061478a9083906161c2565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206165be8339815191526020526040812060020180545f8051602061655e83398151915291600160401b9091046001600160401b031690600861482083616315565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b038381166024830152604482018390526122a491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614ffc565b5f610a66825f805160206164fe833981519152546001600160a01b03169061505d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166149735760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161057d565b5f8051602061655e8339815191524261499260408601602087016159fb565b6001600160401b031611614a045760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161057d565b614a1460408501602086016159fb565b6001600160401b0316614a2a6202a30042615f1a565b11614a9d5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161057d565b8335614af55760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161057d565b83355f90815260088201602052604090205415614b655760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057d565b6030614b7460408601866162a8565b905014614bd95760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057d565b614be3835f6145c8565b5f80614c7c6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614c2791906159fb565b6001600160401b03168152602001614c4260408a018a6162a8565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506151bf565b5f82815260068601602052604090209193509150614c9a8282616374565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614cd8908590600401615c6a565b6020604051808303815f875af1158015614cf4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d189190615c31565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614d9057614d90615a34565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614e70918e01908e016159fb565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614ee757604051631afcd79f60e31b815260040160405180910390fd5b565b614ef1614e9e565b614efa816152c3565b614f026152dc565b611db660608201356080830135614f1f60c0850160a086016159fb565b614f2f60e0860160c08701616433565b61ffff16614f44610100870160e0880161644c565b614f5661012088016101008901615d4e565b6152ec565b614f63614e9e565b5f805160206164fe8339815191526001600160a01b038216614fdc5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161057d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6150106001600160a01b03841683615574565b905080515f14158015615034575080806020019051810190615032919061646c565b155b156122a457604051635274afe760e01b81526001600160a01b038416600482015260240161057d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156150a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150c79190615c31565b90506150de6001600160a01b038516333086615581565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015615122573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906151469190615c31565b90508181116151ac5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161057d565b6151b682826161c2565b95945050505050565b5f60608260800151516030146152295760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057d565b5f806001855f0151866020015187604001518860800151896060015160405160200161525b9796959493929190616487565b604051602081830303815290604052905060028160405161527c9190615f09565b602060405180830381855afa158015615297573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152ba9190615c31565b94909350915050565b6152cb614e9e565b6152d36155ba565b611db6816155c2565b6152e4614e9e565b614ee761573d565b6152f4614e9e565b5f8051602061651e833981519152836153605760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161057d565b6127108411156153c65760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161057d565b8587111561542e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161057d565b5f8360ff161161549b5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161057d565b600a60ff8416111561550d5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161057d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606128c883835f615745565b6040516001600160a01b038481166024830152838116604483015260648201839052610a509186918216906323b872dd90608401614893565b614ee7614e9e565b6155ca614e9e565b80355f8051602061655e83398151915290815560146155ef606084016040850161644c565b60ff16111561565c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161057d565b5f61566d606084016040850161644c565b60ff16116156d55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161057d565b6156e5606083016040840161644c565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561571660408301602084016159fb565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613b7c614e9e565b60608147101561576a5760405163cd78605960e01b815230600482015260240161057d565b5f80856001600160a01b031684866040516157859190615f09565b5f6040518083038185875af1925050503d805f81146157bf576040519150601f19603f3d011682016040523d82523d5f602084013e6157c4565b606091505b50915091506127178683836060826157e4576157df8261582b565b6128c8565b81511580156157fb57506001600160a01b0384163b155b1561582457604051639996b31560e01b81526001600160a01b038516600482015260240161057d565b50806128c8565b80511561583b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461586090616023565b5f825580601f1061586f575050565b601f0160209004905f5260205f2090810190611db691906158c7565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156158db575f81556001016158c8565b5090565b8015158114611db6575f80fd5b803563ffffffff811681146158ff575f80fd5b919050565b5f805f60608486031215615916575f80fd5b833592506020840135615928816158df565b9150615936604085016158ec565b90509250925092565b5f6020828403121561594f575f80fd5b5035919050565b5f60208284031215615966575f80fd5b6128c8826158ec565b5f8060408385031215615980575f80fd5b615989836158ec565b946020939093013593505050565b5f80604083850312156159a8575f80fd5b82356001600160401b038111156159bd575f80fd5b8301608081860312156159ce575f80fd5b91506159dc602084016158ec565b90509250929050565b80356001600160401b03811681146158ff575f80fd5b5f60208284031215615a0b575f80fd5b6128c8826159e5565b5f8060408385031215615a25575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110615a6b57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151615aa660608401826001600160401b03169052565b506080830151615ac160808401826001600160401b03169052565b5060a0830151615adc60a08401826001600160401b03169052565b5060c083015161307d60c08401826001600160401b03169052565b803561ffff811681146158ff575f80fd5b5f805f8060808587031215615b1b575f80fd5b84356001600160401b03811115615b30575f80fd5b850160608188031215615b41575f80fd5b9350615b4f60208601615af7565b9250615b5d604086016159e5565b9396929550929360600135925050565b6001600160a01b0381168114611db6575f80fd5b5f80828403610140811215615b94575f80fd5b61012080821215615ba3575f80fd5b8493508301359050615bb481615b6d565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561307d5761307d615bbf565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615c41575f80fd5b5051919050565b5f5b83811015615c62578181015183820152602001615c4a565b50505f910152565b602081525f8251806020840152615c88816040850160208701615c48565b601f01601f19169190910160400192915050565b5f82615cb657634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615d5e575f80fd5b81356128c881615b6d565b5f808335601e19843603018112615d7e575f80fd5b8301803591506001600160401b03821115615d97575f80fd5b6020019150600581901b3603821315612871575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615dd6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615e1657615e16615de0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615e4457615e44615de0565b604052919050565b5f6001600160401b03821115615e6457615e64615de0565b50601f01601f191660200190565b5f60608236031215615e82575f80fd5b615e8a615df4565b823581526020615e9b8185016159e5565b8183015260408401356001600160401b03811115615eb7575f80fd5b840136601f820112615ec7575f80fd5b8035615eda615ed582615e4c565b615e1c565b8181523684838501011115615eed575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615dd6818460208701615c48565b80820180821115610a6657610a66615bbf565b5f63ffffffff808316818103615f4557615f45615bbf565b6001019392505050565b8082028115828204841417610a6657610a66615bbf565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561307d5761307d615bbf565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c9082168061603757607f821691505b60208210810361605557634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461606d81616023565b806020870152604060018084165f811461608e57600181146160aa576160d7565b60ff19851660408a0152604084151560051b8a010195506160d7565b895f5260205f205f5b858110156160ce5781548b82018601529083019088016160b3565b8a016040019650505b509398975050505050505050565b80516158ff816158df565b5f8060408385031215616101575f80fd5b82516001600160401b0380821115616117575f80fd5b908401906060828703121561612a575f80fd5b616132615df4565b8251815260208084015161614581615b6d565b8282015260408401518381111561615a575f80fd5b80850194505087601f85011261616e575f80fd5b8351925061617e615ed584615e4c565b8381528882858701011115616191575f80fd5b6161a084838301848801615c48565b806040840152508195506161b58188016160e5565b9450505050509250929050565b81810381811115610a6657610a66615bbf565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e198436030181126162bd575f80fd5b8301803591506001600160401b038211156162d6575f80fd5b602001915036819003821315612871575f80fd5b6001600160401b0381811683821602808216919082811461630d5761630d615bbf565b505092915050565b5f6001600160401b03808316818103615f4557615f45615bbf565b601f8211156122a457805f5260205f20601f840160051c810160208510156163555750805b601f840160051c820191505b81811015610b05575f8155600101616361565b81516001600160401b0381111561638d5761638d615de0565b6163a18161639b8454616023565b84616330565b602080601f8311600181146163d4575f84156163bd5750858301515b5f19600386901b1c1916600185901b17855561642b565b5f85815260208120601f198616915b82811015616402578886015182559484019460019091019084016163e3565b508582101561641f57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215616443575f80fd5b6128c882615af7565b5f6020828403121561645c575f80fd5b813560ff811681146128c8575f80fd5b5f6020828403121561647c575f80fd5b81516128c8816158df565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516164dc81604e860160208901615c48565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161673838038061673883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6165eb8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd366004615905565b61043a565b005b6101d26101e2366004615940565b61089d565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b610219610214366004615940565b610a56565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004615957565b610a6c565b6101d261026e366004615970565b610b0c565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004615998565b610f9c565b6102b66102b13660046159fc565b61157f565b6040519081526020016101fd565b6102196102d2366004615940565b611598565b6102b65f81565b6101d26102ec366004615905565b6115ac565b6101ef603081565b6101d2610307366004615940565b6117c8565b6101d261031a366004615970565b6118ce565b6101d261032d366004615940565b611ab1565b6102b6610340366004615a15565b611dba565b6101d2610353366004615957565b611de6565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c366004615940565b611f5c565b6101d261039f366004615940565b6121cf565b6101ef601481565b6103bf6103ba366004615940565b6122aa565b6040516101fd9190615a49565b6102196202a30081565b6102b66103e4366004615940565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615b09565b612372565b6101d2610435366004615b82565b6123a7565b5f8381525f8051602061657f83398151915260205260408082208151610100810190925280545f8051602061651f83398151915293929190829060ff16600481111561048857610488615a35565b600481111561049957610499615a35565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61051d826122aa565b905060028351600481111561053457610534615a35565b146105865760405162461bcd60e51b815260206004820152602a60248201525f8051602061653f8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105eb5760405162461bcd60e51b815260206004820152603360248201525f8051602061653f8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161057d565b6003835280515f90600290600581111561060757610607615a35565b0361065e57861561061f5761061c8387612486565b90505b5f846060015183608001516106349190615bd4565b90506106408482612722565b506001600160401b0390811660e0870152421660a086015250610692565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106c5866060015161157f565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b81526004016106f99796959493929190615bf4565b602060405180830381865afa158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190615c32565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561077757610777615a35565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088b916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206165bf8339815191526020526040808220815160e0810190925280545f8051602061655f83398151915293929190829060ff1660058111156108ea576108ea615a35565b60058111156108fb576108fb615a35565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096a5761096a615a35565b146109cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb6109f48584606001515f612879565b6040518263ffffffff1660e01b8152600401610a109190615c6b565b6020604051808303815f875af1158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190615c32565b50505050565b5f610a6664e8d4a5100083615c9d565b92915050565b5f8051602061651f8339815191525f80610a85846128d0565b91509150610a9282612bee565b610a9c5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610aca57610aca615a35565b03610aef575f83815260088501602052604081208054919055610aed8282612c29565b505b610b0581610b00846040015161157f565b612c9f565b5050505050565b5f8181525f8051602061657f83398151915260205260408082208151610100810190925280545f8051602061651f83398151915293929190829060ff166004811115610b5a57610b5a615a35565b6004811115610b6b57610b6b615a35565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf0906122aa565b9050600182516004811115610c0757610c07615a35565b14610c705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161057d565b600381516005811115610c8557610c85615a35565b03610dfd576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610ce957610ce9615a35565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1257610e12615a35565b03610e2057610b0584612cc2565b5f610e2a86612ebf565b90505f80610e3b8360400151613085565b509150915081856040015114610e635760405162461bcd60e51b815260040161057d90615cbc565b806001600160401b031684606001516001600160401b03161015610ed45760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161057d565b806001600160401b03168560c001516001600160401b03161115610f0a5760405162461bcd60e51b815260040161057d90615d06565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061655f8339815191529060ff16156110395760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a09190615c32565b8360200135146111025760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161057d565b306111136060850160408601615d4f565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161057d565b5f6111936060850185615d6a565b905090505f805b828163ffffffff161015611483575f6111b66060880188615d6a565b8363ffffffff168181106111cc576111cc615daf565b90506020028101906111de9190615dc3565b6111e790615e73565b80515f818152600888016020526040902054919250901561125f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161057d565b5f6002895f01358560405160200161128e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a891615f0a565b602060405180830381855afa1580156112c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e69190615c32565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561137257611372615a35565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611425911686615f1b565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147c90615f2e565b905061119a565b50600483018190555f61149585612ebf565b90505f6114a582604001516132c0565b90505f6114b188613432565b9050816002826040516114c49190615f0a565b602060405180830381855afa1580156114df573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115029190615c32565b146115665760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161057d565b5050506009909201805460ff1916600117905550505050565b5f610a666001600160401b03831664e8d4a51000615f50565b5f6115a2826122aa565b6080015192915050565b5f8051602061651f8339815191525f6115c4856138cb565b90506115cf85612bee565b6115da575050505050565b5f8581526005830160205260409020546001600160a01b031633146116115760405162461bcd60e51b815260040161057d90615f67565b5f85815260058301602052604090205460a082015161164091600160b01b90046001600160401b031690615fb9565b6001600160401b03168160c001516001600160401b031610156116c15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161057d565b8315610b05575f6116d28685612486565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117299061157f565b60a085015160c08601516040516001600160e01b031960e086901b16815261175d939291829188905f908190600401615bf4565b602060405180830381865afa158015611778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c9190615c32565b5f878152600885016020526040812080549091906117bb908490615f1b565b9091555050505050505050565b5f8051602061651f8339815191525f6117e0836122aa565b90506004815160058111156117f7576117f7615a35565b146118615760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161057d565b5f8381526005830160205260409020546001600160a01b031633146118985760405162461bcd60e51b815260040161057d90615f67565b5f83815260088301602090815260408083208054908490556005860190925290912054610a50906001600160a01b031682612c29565b6118d6613b46565b5f8181525f8051602061657f83398151915260205260408082208151610100810190925280545f8051602061651f83398151915293929190829060ff16600481111561192457611924615a35565b600481111561193557611935615a35565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119b185612ebf565b90505f806119c28360400151613085565b5091509150818460400151146119ea5760405162461bcd60e51b815260040161057d90615cbc565b806001600160401b03168460e001516001600160401b03161115611a205760405162461bcd60e51b815260040161057d90615d06565b600384516004811115611a3557611a35615a35565b14611a895760405162461bcd60e51b815260206004820152603160248201525f8051602061653f8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161057d565b611a9286612cc2565b5050505050611aad60015f8051602061659f83398151915255565b5050565b611ab9613b46565b5f8181525f8051602061657f83398151915260205260408082208151610100810190925280545f8051602061651f83398151915293929190829060ff166004811115611b0757611b07615a35565b6004811115611b1857611b18615a35565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611b9c826122aa565b9050600481516005811115611bb357611bb3615a35565b14611c165760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161057d565b600283516004811115611c2b57611c2b615a35565b1480611c495750600383516004811115611c4757611c47615a35565b145b611ca55760405162461bcd60e51b815260206004820152602760248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526632b3b0ba34b7b760c91b606482015260840161057d565b600283516004811115611cba57611cba615a35565b03611d94578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611cf2856060015161157f565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611d4496959493926001600160401b0390921691908190600401615bf4565b602060405180830381865afa158015611d5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d839190615c32565b5f8681526007860160205260409020555b611d9d85612cc2565b50505050611db760015f8051602061659f83398151915255565b50565b5f611dc3613b46565b611dce833384613b90565b9050610a6660015f8051602061659f83398151915255565b5f8051602061655f8339815191525f611dfe83612ebf565b90505f80611e0f8360400151613f4a565b9150915080611e715760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057d565b60015f83815260078601602052604090205460ff166005811115611e9757611e97615a35565b14611eb45760405162461bcd60e51b815260040161057d90615fd9565b5f8281526006850160205260408120611ecc91615855565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061657f83398151915260205260408082208151610100810190925280545f8051602061651f83398151915293929190829060ff166004811115611faa57611faa615a35565b6004811115611fbb57611fbb615a35565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561204257612042615a35565b1480612060575060038151600481111561205e5761205e615a35565b145b6120b45760405162461bcd60e51b815260206004820152603260248201525f8051602061653f833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161057d565b5f6120c282604001516122aa565b905080606001516001600160401b03165f036121465760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb612173846040015184606001518560800151612879565b6040518263ffffffff1660e01b815260040161218f9190615c6b565b6020604051808303815f875af11580156121ab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190615c32565b5f8181525f805160206165bf83398151915260205260409020545f8051602061655f8339815191529060019060ff16600581111561220f5761220f615a35565b1461222c5760405162461bcd60e51b815260040161057d90615fd9565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612265919060040161605c565b6020604051808303815f875af1158015612281573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a59190615c32565b505050565b6122b261588c565b5f8281525f805160206165bf833981519152602052604090819020815160e0810190925280545f8051602061655f833981519152929190829060ff1660058111156122ff576122ff615a35565b600581111561231057612310615a35565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61237b613b46565b612387858585856140eb565b905061239f60015f8051602061659f83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806123f0575080546001600160401b03808416911610155b1561240e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561243984846143d7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124d1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124f891908101906160f1565b915091508061255b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561259e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c29190615c32565b8251146126265760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057d565b60208201516001600160a01b03161561269c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057d565b5f806126ab84604001516143f1565b915091508187146127185760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057d565b9695505050505050565b5f8281525f805160206165bf833981519152602052604081206002015481905f8051602061655f83398151915290600160801b90046001600160401b031661276a85826145c9565b5f612774876147d7565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6127c48a858b612879565b6040518263ffffffff1660e01b81526004016127e09190615c6b565b6020604051808303815f875af11580156127fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128209190615c32565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6128d961588c565b5f8051602061655f8339815191525f6128f185612ebf565b90505f806129028360400151613f4a565b9150915080156129675760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057d565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561299857612998615a35565b60058111156129a9576129a9615a35565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612a1857612a18615a35565b1480612a365750600181516005811115612a3457612a34615a35565b145b612a955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161057d565b600381516005811115612aaa57612aaa615a35565b03612ab85760048152612abd565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612b0257612b02615a35565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bb657612bb6615a35565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f805160206164ff83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c84575f80fd5b505af1158015612c96573d5f803e3d5ffd5b50505050505050565b5f805160206164ff83398151915254611aad906001600160a01b03168383614867565b5f8181525f8051602061657f83398151915260205260408082208151610100810190925280545f8051602061651f83398151915293929190829060ff166004811115612d1057612d10615a35565b6004811115612d2157612d21615a35565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612e1590600160a01b900461ffff1684615f50565b612e1f9190615c9d565b905080856008015f8581526020019081526020015f205f828254612e439190615f1b565b909155505f9050612e5482846161c3565b9050612e64856020015182612c29565b612e798560200151610b00876060015161157f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f23573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f4a91908101906160f1565b9150915080612faa5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057d565b81511561300b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057d565b60208201516001600160a01b03161561307e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057d565b5092915050565b5f805f83516036146130a95760405162461bcd60e51b815260040161057d906161d6565b5f805b60028110156130f8576130c08160016161c3565b6130cb906008615f50565b61ffff168682815181106130e1576130e1615daf565b016020015160f81c901b91909117906001016130ac565b5061ffff81161561311b5760405162461bcd60e51b815260040161057d9061621f565b5f805b6004811015613176576131328160036161c3565b61313d906008615f50565b63ffffffff168761314f836002615f1b565b8151811061315f5761315f615daf565b016020015160f81c901b919091179060010161311e565b5063ffffffff811660041461319d5760405162461bcd60e51b815260040161057d90616262565b5f805b60208110156131f2576131b481601f6161c3565b6131bf906008615f50565b886131cb836006615f1b565b815181106131db576131db615daf565b016020015160f81c901b91909117906001016131a0565b505f805b60088110156132515761320a8160076161c3565b613215906008615f50565b6001600160401b03168961322a836026615f1b565b8151811061323a5761323a615daf565b016020015160f81c901b91909117906001016131f6565b505f805b60088110156132b0576132698160076161c3565b613274906008615f50565b6001600160401b03168a61328983602e615f1b565b8151811061329957613299615daf565b016020015160f81c901b9190911790600101613255565b5091989097509095509350505050565b5f81516026146132e25760405162461bcd60e51b815260040161057d906161d6565b5f805b6002811015613331576132f98160016161c3565b613304906008615f50565b61ffff1684828151811061331a5761331a615daf565b016020015160f81c901b91909117906001016132e5565b5061ffff8116156133545760405162461bcd60e51b815260040161057d9061621f565b5f805b60048110156133af5761336b8160036161c3565b613376906008615f50565b63ffffffff1685613388836002615f1b565b8151811061339857613398615daf565b016020015160f81c901b9190911790600101613357565b5063ffffffff8116156133d45760405162461bcd60e51b815260040161057d90616262565b5f805b6020811015613429576133eb81601f6161c3565b6133f6906008615f50565b86613402836006615f1b565b8151811061341257613412615daf565b016020015160f81c901b91909117906001016133d7565b50949350505050565b60605f61344183830184615d6a565b61344d91506058615f50565b61345890605c615f1b565b6001600160401b0381111561346f5761346f615de1565b6040519080825280601f01601f191660200182016040528015613499576020820181803683370190505b5090505f5b60208110156134ee57833581602081106134ba576134ba615daf565b1a60f81b8282815181106134d0576134d0615daf565b60200101906001600160f81b03191690815f1a90535060010161349e565b505f5b602081101561354e578360200135816020811061351057613510615daf565b1a60f81b82613520836020615f1b565b8151811061353057613530615daf565b60200101906001600160f81b03191690815f1a9053506001016134f1565b505f5b60048110156135b1576135658160036161c3565b613570906008615f50565b6014901c60f81b82613583836040615f1b565b8151811061359357613593615daf565b60200101906001600160f81b03191690815f1a905350600101613551565b505f6135c36060850160408601615d4f565b60601b90505f5b6014811015613623578181601481106135e5576135e5615daf565b1a60f81b836135f5836044615f1b565b8151811061360557613605615daf565b60200101906001600160f81b03191690815f1a9053506001016135ca565b505f6136326060860186615d6a565b905090505f5b600481101561369d5761364c8160036161c3565b613657906008615f50565b63ffffffff8316901c60f81b8461366f836058615f1b565b8151811061367f5761367f615daf565b60200101906001600160f81b03191690815f1a905350600101613638565b505f5b6136ad6060870187615d6a565b90508110156138c1575f6136c2826058615f50565b6136cd90605c615f1b565b90505f5b6020811015613758576136e76060890189615d6a565b848181106136f7576136f7615daf565b90506020028101906137099190615dc3565b35816020811061371b5761371b615daf565b1a60f81b8661372a8385615f1b565b8151811061373a5761373a615daf565b60200101906001600160f81b03191690815f1a9053506001016136d1565b505f5b600881101561380d5761376f8160076161c3565b61377a906008615f50565b61378760608a018a615d6a565b8581811061379757613797615daf565b90506020028101906137a99190615dc3565b6137ba9060408101906020016159fc565b6001600160401b0316901c60f81b86826137d5856020615f1b565b6137df9190615f1b565b815181106137ef576137ef615daf565b60200101906001600160f81b03191690815f1a90535060010161375b565b505f5b60308110156138b7576138266060890189615d6a565b8481811061383657613836615daf565b90506020028101906138489190615dc3565b6138569060408101906162a9565b8281811061386657613866615daf565b9050013560f81c60f81b868284602861387f9190615f1b565b6138899190615f1b565b8151811061389957613899615daf565b60200101906001600160f81b03191690815f1a905350600101613810565b50506001016136a0565b5091949350505050565b6138d361588c565b5f8281525f805160206165bf8339815191526020526040808220815160e0810190925280545f8051602061655f83398151915293929190829060ff16600581111561392057613920615a35565b600581111561393157613931615a35565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156139a3576139a3615a35565b146139ff5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613a4357613a43615a35565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613aef8582612722565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061659f833981519152805460011901613b7757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061659f83398151915255565b5f5f8051602061651f83398151915281613bac610214856148c6565b90505f613bb8876122aa565b9050613bc387612bee565b613c205760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161057d565b600281516005811115613c3557613c35615a35565b14613c945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161057d565b5f828260800151613ca59190615fb9565b60048501546040840151919250613cc7916001600160401b03909116906162eb565b6001600160401b0316816001600160401b03161115613d465760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161057d565b5f80613d528a84612722565b915091505f8a83604051602001613d8092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613e1b57613e1b615a35565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613f6d5760405162461bcd60e51b815260040161057d906161d6565b5f805b6002811015613fbc57613f848160016161c3565b613f8f906008615f50565b61ffff16858281518110613fa557613fa5615daf565b016020015160f81c901b9190911790600101613f70565b5061ffff811615613fdf5760405162461bcd60e51b815260040161057d9061621f565b5f805b600481101561403a57613ff68160036161c3565b614001906008615f50565b63ffffffff1686614013836002615f1b565b8151811061402357614023615daf565b016020015160f81c901b9190911790600101613fe2565b5063ffffffff81166003146140615760405162461bcd60e51b815260040161057d90616262565b5f805b60208110156140b65761407881601f6161c3565b614083906008615f50565b8761408f836006615f1b565b8151811061409f5761409f615daf565b016020015160f81c901b9190911790600101614064565b505f866026815181106140cb576140cb615daf565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061651f8339815191529061ffff861610156141725760405162461bcd60e51b815260206004820152602b60248201525f8051602061653f83398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161057d565b61271061ffff861611156141ca5760405162461bcd60e51b815260206004820152602c60248201525f8051602061653f83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161057d565b60028101546001600160401b0390811690851610156142435760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161057d565b80548310156142a65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161057d565b806001015483111561430d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161057d565b5f614317846148c6565b90505f61432382610a56565b90505f61433089836148e9565b905060405180606001604052806143443390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6143df614e9f565b6143e882614eea565b611aad81614f5c565b5f808251602e146144145760405162461bcd60e51b815260040161057d906161d6565b5f805b60028110156144635761442b8160016161c3565b614436906008615f50565b61ffff1685828151811061444c5761444c615daf565b016020015160f81c901b9190911790600101614417565b5061ffff8116156144865760405162461bcd60e51b815260040161057d9061621f565b5f805b60048110156144e15761449d8160036161c3565b6144a8906008615f50565b63ffffffff16866144ba836002615f1b565b815181106144ca576144ca615daf565b016020015160f81c901b9190911790600101614489565b5063ffffffff81166005146145085760405162461bcd60e51b815260040161057d90616262565b5f805b602081101561455d5761451f81601f6161c3565b61452a906008615f50565b87614536836006615f1b565b8151811061454657614546615daf565b016020015160f81c901b919091179060010161450b565b505f805b60088110156145bc576145758160076161c3565b614580906008615f50565b6001600160401b031688614595836026615f1b565b815181106145a5576145a5615daf565b016020015160f81c901b9190911790600101614561565b5090969095509350505050565b5f8051602061655f8339815191525f6001600160401b0380841690851611156145fd576145f68385615bd4565b905061460a565b6146078484615bd4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061466c575060018401548151614668916001600160401b031690615f1b565b8210155b15614692576001600160401b0383166060820152818152604081015160208201526146b1565b82816060018181516146a49190615fb9565b6001600160401b03169052505b60608101516146c19060646162eb565b602082015160018601546001600160401b0392909216916146ec9190600160401b900460ff16615f50565b10156147505760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161057d565b856001600160401b03168160400181815161476b9190615f1b565b9052506040810180516001600160401b038716919061478b9083906161c3565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206165bf8339815191526020526040812060020180545f8051602061655f83398151915291600160401b9091046001600160401b031690600861482183616316565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b038381166024830152604482018390526122a591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614ffd565b5f610a66825f805160206164ff833981519152546001600160a01b03169061505e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166149745760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161057d565b5f8051602061655f8339815191524261499360408601602087016159fc565b6001600160401b031611614a055760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161057d565b614a1560408501602086016159fc565b6001600160401b0316614a2b6202a30042615f1b565b11614a9e5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161057d565b8335614af65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161057d565b83355f90815260088201602052604090205415614b665760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057d565b6030614b7560408601866162a9565b905014614bda5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057d565b614be4835f6145c9565b5f80614c7d6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614c2891906159fc565b6001600160401b03168152602001614c4360408a018a6162a9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506151c0565b5f82815260068601602052604090209193509150614c9b8282616375565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614cd9908590600401615c6b565b6020604051808303815f875af1158015614cf5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d199190615c32565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614d9157614d91615a35565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614e71918e01908e016159fc565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614ee857604051631afcd79f60e31b815260040160405180910390fd5b565b614ef2614e9f565b614efb816152c4565b614f036152dd565b611db760608201356080830135614f2060c0850160a086016159fc565b614f3060e0860160c08701616434565b61ffff16614f45610100870160e0880161644d565b614f5761012088016101008901615d4f565b6152ed565b614f64614e9f565b5f805160206164ff8339815191526001600160a01b038216614fdd5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161057d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6150116001600160a01b03841683615575565b905080515f14158015615035575080806020019051810190615033919061646d565b155b156122a557604051635274afe760e01b81526001600160a01b038416600482015260240161057d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156150a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150c89190615c32565b90506150df6001600160a01b038516333086615582565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015615123573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906151479190615c32565b90508181116151ad5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161057d565b6151b782826161c3565b95945050505050565b5f606082608001515160301461522a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057d565b5f806001855f0151866020015187604001518860800151896060015160405160200161525c9796959493929190616488565b604051602081830303815290604052905060028160405161527d9190615f0a565b602060405180830381855afa158015615298573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152bb9190615c32565b94909350915050565b6152cc614e9f565b6152d46155bb565b611db7816155c3565b6152e5614e9f565b614ee861573e565b6152f5614e9f565b5f8051602061651f833981519152836153615760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161057d565b6127108411156153c75760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161057d565b8587111561542f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161057d565b5f8360ff161161549c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161057d565b600a60ff8416111561550e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161057d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606128c983835f615746565b6040516001600160a01b038481166024830152838116604483015260648201839052610a509186918216906323b872dd90608401614894565b614ee8614e9f565b6155cb614e9f565b80355f8051602061655f83398151915290815560146155f0606084016040850161644d565b60ff16111561565d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161057d565b5f61566e606084016040850161644d565b60ff16116156d65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161057d565b6156e6606083016040840161644d565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561571760408301602084016159fc565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613b7d614e9f565b60608147101561576b5760405163cd78605960e01b815230600482015260240161057d565b5f80856001600160a01b031684866040516157869190615f0a565b5f6040518083038185875af1925050503d805f81146157c0576040519150601f19603f3d011682016040523d82523d5f602084013e6157c5565b606091505b50915091506127188683836060826157e5576157e08261582c565b6128c9565b81511580156157fc57506001600160a01b0384163b155b1561582557604051639996b31560e01b81526001600160a01b038516600482015260240161057d565b50806128c9565b80511561583c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461586190616024565b5f825580601f10615870575050565b601f0160209004905f5260205f2090810190611db791906158c8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156158dc575f81556001016158c9565b5090565b8015158114611db7575f80fd5b803563ffffffff81168114615900575f80fd5b919050565b5f805f60608486031215615917575f80fd5b833592506020840135615929816158e0565b9150615937604085016158ed565b90509250925092565b5f60208284031215615950575f80fd5b5035919050565b5f60208284031215615967575f80fd5b6128c9826158ed565b5f8060408385031215615981575f80fd5b61598a836158ed565b946020939093013593505050565b5f80604083850312156159a9575f80fd5b82356001600160401b038111156159be575f80fd5b8301608081860312156159cf575f80fd5b91506159dd602084016158ed565b90509250929050565b80356001600160401b0381168114615900575f80fd5b5f60208284031215615a0c575f80fd5b6128c9826159e6565b5f8060408385031215615a26575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110615a6c57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151615aa760608401826001600160401b03169052565b506080830151615ac260808401826001600160401b03169052565b5060a0830151615add60a08401826001600160401b03169052565b5060c083015161307e60c08401826001600160401b03169052565b803561ffff81168114615900575f80fd5b5f805f8060808587031215615b1c575f80fd5b84356001600160401b03811115615b31575f80fd5b850160608188031215615b42575f80fd5b9350615b5060208601615af8565b9250615b5e604086016159e6565b9396929550929360600135925050565b6001600160a01b0381168114611db7575f80fd5b5f80828403610140811215615b95575f80fd5b61012080821215615ba4575f80fd5b8493508301359050615bb581615b6e565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561307e5761307e615bc0565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615c42575f80fd5b5051919050565b5f5b83811015615c63578181015183820152602001615c4b565b50505f910152565b602081525f8251806020840152615c89816040850160208701615c49565b601f01601f19169190910160400192915050565b5f82615cb757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615d5f575f80fd5b81356128c981615b6e565b5f808335601e19843603018112615d7f575f80fd5b8301803591506001600160401b03821115615d98575f80fd5b6020019150600581901b3603821315612872575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615dd7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615e1757615e17615de1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615e4557615e45615de1565b604052919050565b5f6001600160401b03821115615e6557615e65615de1565b50601f01601f191660200190565b5f60608236031215615e83575f80fd5b615e8b615df5565b823581526020615e9c8185016159e6565b8183015260408401356001600160401b03811115615eb8575f80fd5b840136601f820112615ec8575f80fd5b8035615edb615ed682615e4d565b615e1d565b8181523684838501011115615eee575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615dd7818460208701615c49565b80820180821115610a6657610a66615bc0565b5f63ffffffff808316818103615f4657615f46615bc0565b6001019392505050565b8082028115828204841417610a6657610a66615bc0565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561307e5761307e615bc0565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c9082168061603857607f821691505b60208210810361605657634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461606e81616024565b806020870152604060018084165f811461608f57600181146160ab576160d8565b60ff19851660408a0152604084151560051b8a010195506160d8565b895f5260205f205f5b858110156160cf5781548b82018601529083019088016160b4565b8a016040019650505b509398975050505050505050565b8051615900816158e0565b5f8060408385031215616102575f80fd5b82516001600160401b0380821115616118575f80fd5b908401906060828703121561612b575f80fd5b616133615df5565b8251815260208084015161614681615b6e565b8282015260408401518381111561615b575f80fd5b80850194505087601f85011261616f575f80fd5b8351925061617f615ed684615e4d565b8381528882858701011115616192575f80fd5b6161a184838301848801615c49565b806040840152508195506161b68188016160e6565b9450505050509250929050565b81810381811115610a6657610a66615bc0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e198436030181126162be575f80fd5b8301803591506001600160401b038211156162d7575f80fd5b602001915036819003821315612872575f80fd5b6001600160401b0381811683821602808216919082811461630e5761630e615bc0565b505092915050565b5f6001600160401b03808316818103615f4657615f46615bc0565b601f8211156122a557805f5260205f20601f840160051c810160208510156163565750805b601f840160051c820191505b81811015610b05575f8155600101616362565b81516001600160401b0381111561638e5761638e615de1565b6163a28161639c8454616024565b84616331565b602080601f8311600181146163d5575f84156163be5750858301515b5f19600386901b1c1916600185901b17855561642c565b5f85815260208120601f198616915b82811015616403578886015182559484019460019091019084016163e4565b508582101561642057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215616444575f80fd5b6128c982615af8565b5f6020828403121561645d575f80fd5b813560ff811681146128c9575f80fd5b5f6020828403121561647d575f80fd5b81516128c9816158e0565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516164dd81604e860160208901615c49565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 896c61b2e..b8fd26513 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161640138038061640183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162b48061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d836600461566b565b61058b565b005b3480156101ea575f80fd5b506101dd6101f93660046156a6565b6109ee565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd6102433660046156bd565b610ba7565b348015610253575f80fd5b506102676102623660046156a6565b610c84565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046156fb565b610c9a565b604051908152602001610220565b348015610305575f80fd5b506101dd61031436600461574f565b610cce565b348015610324575f80fd5b506101dd610333366004615768565b610d6e565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b366004615790565b6111fe565b34801561038b575f80fd5b506102ec61039a3660046157de565b6117e1565b3480156103aa575f80fd5b506102676103b93660046156a6565b6117fa565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb36600461566b565b61180e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e3660046156a6565b611a2a565b34801561042e575f80fd5b506101dd61043d366004615768565b611b30565b34801561044d575f80fd5b506101dd61045c3660046156a6565b611d13565b34801561046c575f80fd5b506101dd61047b36600461574f565b61201b565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b43660046156a6565b612191565b3480156104c4575f80fd5b506101dd6104d33660046156a6565b612404565b6102ec6104e63660046156a6565b6124df565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e6105193660046156a6565b612510565b604051610220919061580b565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b3660046156a6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f8051602061624883398151915260205260408082208151610100810190925280545f805160206161e883398151915293929190829060ff1660048111156105d9576105d96157f7565b60048111156105ea576105ea6157f7565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61066e82612510565b9050600283516004811115610685576106856157f7565b146106d75760405162461bcd60e51b815260206004820152602a60248201525f805160206162088339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461073c5760405162461bcd60e51b815260206004820152603360248201525f805160206162088339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106ce565b6003835280515f906002906005811115610758576107586157f7565b036107af5786156107705761076d83876125d8565b90505b5f8460600151836080015161078591906158ce565b90506107918482612874565b506001600160401b0390811660e0870152421660a0860152506107e3565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561081686606001516117e1565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b815260040161084a97969594939291906158ee565b602060405180830381865afa158015610865573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610889919061592c565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108c8576108c86157f7565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109dc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206162888339815191526020526040808220815160e0810190925280545f8051602061622883398151915293929190829060ff166005811115610a3b57610a3b6157f7565b6005811115610a4c57610a4c6157f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abb57610abb6157f7565b14610b205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb610b458584606001515f6129cb565b6040518263ffffffff1660e01b8152600401610b619190615965565b6020604051808303815f875af1158015610b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba1919061592c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c3883612a1a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9464e8d4a5100083615997565b92915050565b5f610ca3612a2b565b610caf84848434612a62565b9050610cc760015f8051602061626883398151915255565b9392505050565b5f805160206161e88339815191525f80610ce784612d56565b91509150610cf482613074565b610cfe5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d2c57610d2c6157f7565b03610d51575f83815260088501602052604081208054919055610d4f82826130af565b505b610d6781610d6284604001516117e1565b613115565b5050505050565b5f8181525f8051602061624883398151915260205260408082208151610100810190925280545f805160206161e883398151915293929190829060ff166004811115610dbc57610dbc6157f7565b6004811115610dcd57610dcd6157f7565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e5290612510565b9050600182516004811115610e6957610e696157f7565b14610ed25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106ce565b600381516005811115610ee757610ee76157f7565b0361105f576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610f4b57610f4b6157f7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115611074576110746157f7565b0361108257610d6784613128565b5f61108c86613325565b90505f8061109d83604001516134eb565b5091509150818560400151146110c55760405162461bcd60e51b81526004016106ce906159b6565b806001600160401b031684606001516001600160401b031610156111365760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106ce565b806001600160401b03168560c001516001600160401b0316111561116c5760405162461bcd60e51b81526004016106ce90615a00565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206162288339815191529060ff161561129b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611302919061592c565b8360200135146113645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106ce565b306113756060850160408601615a5d565b6001600160a01b0316146113e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106ce565b5f6113f56060850185615a78565b905090505f805b828163ffffffff1610156116e5575f6114186060880188615a78565b8363ffffffff1681811061142e5761142e615abd565b90506020028101906114409190615ad1565b61144990615b81565b80515f81815260088801602052604090205491925090156114c15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106ce565b5f6002895f0135856040516020016114f092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150a91615c18565b602060405180830381855afa158015611525573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611548919061592c565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d4576115d46157f7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611687911686615c29565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116de90615c3c565b90506113fc565b50600483018190555f6116f785613325565b90505f6117078260400151613726565b90505f61171388613898565b9050816002826040516117269190615c18565b602060405180830381855afa158015611741573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611764919061592c565b146117c85760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106ce565b5050506009909201805460ff1916600117905550505050565b5f610c946001600160401b03831664e8d4a51000615c5e565b5f61180482612510565b6080015192915050565b5f805160206161e88339815191525f61182685613d31565b905061183185613074565b61183c575050505050565b5f8581526005830160205260409020546001600160a01b031633146118735760405162461bcd60e51b81526004016106ce90615c75565b5f85815260058301602052604090205460a08201516118a291600160b01b90046001600160401b031690615cc7565b6001600160401b03168160c001516001600160401b031610156119235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106ce565b8315610d67575f61193486856125d8565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198b906117e1565b60a085015160c08601516040516001600160e01b031960e086901b1681526119bf939291829188905f9081906004016158ee565b602060405180830381865afa1580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe919061592c565b5f87815260088501602052604081208054909190611a1d908490615c29565b9091555050505050505050565b5f805160206161e88339815191525f611a4283612510565b9050600481516005811115611a5957611a596157f7565b14611ac35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106ce565b5f8381526005830160205260409020546001600160a01b03163314611afa5760405162461bcd60e51b81526004016106ce90615c75565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba1906001600160a01b0316826130af565b611b38612a2b565b5f8181525f8051602061624883398151915260205260408082208151610100810190925280545f805160206161e883398151915293929190829060ff166004811115611b8657611b866157f7565b6004811115611b9757611b976157f7565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c1385613325565b90505f80611c2483604001516134eb565b509150915081846040015114611c4c5760405162461bcd60e51b81526004016106ce906159b6565b806001600160401b03168460e001516001600160401b03161115611c825760405162461bcd60e51b81526004016106ce90615a00565b600384516004811115611c9757611c976157f7565b14611ceb5760405162461bcd60e51b815260206004820152603160248201525f805160206162088339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106ce565b611cf486613128565b5050505050611d0f60015f8051602061626883398151915255565b5050565b611d1b612a2b565b5f8181525f8051602061624883398151915260205260408082208151610100810190925280545f805160206161e883398151915293929190829060ff166004811115611d6957611d696157f7565b6004811115611d7a57611d7a6157f7565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611dfe82612510565b9050600481516005811115611e1557611e156157f7565b14611e785760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106ce565b600283516004811115611e8d57611e8d6157f7565b1480611eab5750600383516004811115611ea957611ea96157f7565b145b611f075760405162461bcd60e51b815260206004820152602760248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526632b3b0ba34b7b760c91b60648201526084016106ce565b600283516004811115611f1c57611f1c6157f7565b03611ff5578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611f5485606001516117e1565b60a0808501516080880151918801515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611fa5969593926001600160401b03909216919081906004016158ee565b602060405180830381865afa158015611fc0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe4919061592c565b5f8681526007860160205260409020555b611ffe85613128565b5050505061201860015f8051602061626883398151915255565b50565b5f805160206162288339815191525f61203383613325565b90505f806120448360400151613fac565b91509150806120a65760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106ce565b60015f83815260078601602052604090205460ff1660058111156120cc576120cc6157f7565b146120e95760405162461bcd60e51b81526004016106ce90615ce7565b5f8281526006850160205260408120612101916155c0565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061624883398151915260205260408082208151610100810190925280545f805160206161e883398151915293929190829060ff1660048111156121df576121df6157f7565b60048111156121f0576121f06157f7565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115612277576122776157f7565b14806122955750600381516004811115612293576122936157f7565b145b6122e95760405162461bcd60e51b815260206004820152603260248201525f80516020616208833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106ce565b5f6122f78260400151612510565b905080606001516001600160401b03165f0361237b5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb6123a88460400151846060015185608001516129cb565b6040518263ffffffff1660e01b81526004016123c49190615965565b6020604051808303815f875af11580156123e0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d67919061592c565b5f8181525f8051602061628883398151915260205260409020545f805160206162288339815191529060019060ff166005811115612444576124446157f7565b146124615760405162461bcd60e51b81526004016106ce90615ce7565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161249a9190600401615d64565b6020604051808303815f875af11580156124b6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124da919061592c565b505050565b5f6124e8612a2b565b6124f382333461414d565b905061250b60015f8051602061626883398151915255565b919050565b6125186155f7565b5f8281525f80516020616288833981519152602052604090819020815160e0810190925280545f80516020616228833981519152929190829060ff166005811115612565576125656157f7565b6005811115612576576125766157f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612623573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261264a9190810190615df9565b91509150806126ad5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612714919061592c565b8251146127785760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106ce565b60208201516001600160a01b0316156127ee5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106ce565b5f806127fd8460400151614504565b9150915081871461286a5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106ce565b9695505050505050565b5f8281525f80516020616288833981519152602052604081206002015481905f8051602061622883398151915290600160801b90046001600160401b03166128bc85826146dc565b5f6128c6876148ea565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129168a858b6129cb565b6040518263ffffffff1660e01b81526004016129329190615965565b6020604051808303815f875af115801561294e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612972919061592c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612a2261497a565b612018816149c5565b5f80516020616268833981519152805460011901612a5c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206161e88339815191529061ffff86161015612ae95760405162461bcd60e51b815260206004820152602b60248201525f8051602061620883398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106ce565b61271061ffff86161115612b415760405162461bcd60e51b815260206004820152602c60248201525f8051602061620883398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106ce565b60028101546001600160401b039081169085161015612bba5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106ce565b8054831015612c1d5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106ce565b8060010154831115612c845760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106ce565b825f612c8f82610c84565b90505f612c9c8983614a37565b90506040518060600160405280612cb03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061626883398151915255565b5f612d5f6155f7565b5f805160206162288339815191525f612d7785613325565b90505f80612d888360400151613fac565b915091508015612ded5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106ce565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612e1e57612e1e6157f7565b6005811115612e2f57612e2f6157f7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612e9e57612e9e6157f7565b1480612ebc5750600181516005811115612eba57612eba6157f7565b145b612f1b5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106ce565b600381516005811115612f3057612f306157f7565b03612f3e5760048152612f43565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f8857612f886157f7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561303c5761303c6157f7565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156130fb575f80fd5b505af115801561310d573d5f803e3d5ffd5b505050505050565b611d0f6001600160a01b03831682614fed565b5f8181525f8051602061624883398151915260205260408082208151610100810190925280545f805160206161e883398151915293929190829060ff166004811115613176576131766157f7565b6004811115613187576131876157f7565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061327b90600160a01b900461ffff1684615c5e565b6132859190615997565b905080856008015f8581526020019081526020015f205f8282546132a99190615c29565b909155505f90506132ba8284615ecb565b90506132ca8560200151826130af565b6132df8560200151610d6287606001516117e1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015613389573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526133b09190810190615df9565b91509150806134105760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106ce565b8151156134715760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106ce565b60208201516001600160a01b0316156134e45760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106ce565b5092915050565b5f805f835160361461350f5760405162461bcd60e51b81526004016106ce90615ede565b5f805b600281101561355e57613526816001615ecb565b613531906008615c5e565b61ffff1686828151811061354757613547615abd565b016020015160f81c901b9190911790600101613512565b5061ffff8116156135815760405162461bcd60e51b81526004016106ce90615f27565b5f805b60048110156135dc57613598816003615ecb565b6135a3906008615c5e565b63ffffffff16876135b5836002615c29565b815181106135c5576135c5615abd565b016020015160f81c901b9190911790600101613584565b5063ffffffff81166004146136035760405162461bcd60e51b81526004016106ce90615f6a565b5f805b60208110156136585761361a81601f615ecb565b613625906008615c5e565b88613631836006615c29565b8151811061364157613641615abd565b016020015160f81c901b9190911790600101613606565b505f805b60088110156136b757613670816007615ecb565b61367b906008615c5e565b6001600160401b031689613690836026615c29565b815181106136a0576136a0615abd565b016020015160f81c901b919091179060010161365c565b505f805b6008811015613716576136cf816007615ecb565b6136da906008615c5e565b6001600160401b03168a6136ef83602e615c29565b815181106136ff576136ff615abd565b016020015160f81c901b91909117906001016136bb565b5091989097509095509350505050565b5f81516026146137485760405162461bcd60e51b81526004016106ce90615ede565b5f805b60028110156137975761375f816001615ecb565b61376a906008615c5e565b61ffff1684828151811061378057613780615abd565b016020015160f81c901b919091179060010161374b565b5061ffff8116156137ba5760405162461bcd60e51b81526004016106ce90615f27565b5f805b6004811015613815576137d1816003615ecb565b6137dc906008615c5e565b63ffffffff16856137ee836002615c29565b815181106137fe576137fe615abd565b016020015160f81c901b91909117906001016137bd565b5063ffffffff81161561383a5760405162461bcd60e51b81526004016106ce90615f6a565b5f805b602081101561388f5761385181601f615ecb565b61385c906008615c5e565b86613868836006615c29565b8151811061387857613878615abd565b016020015160f81c901b919091179060010161383d565b50949350505050565b60605f6138a783830184615a78565b6138b391506058615c5e565b6138be90605c615c29565b6001600160401b038111156138d5576138d5615aef565b6040519080825280601f01601f1916602001820160405280156138ff576020820181803683370190505b5090505f5b6020811015613954578335816020811061392057613920615abd565b1a60f81b82828151811061393657613936615abd565b60200101906001600160f81b03191690815f1a905350600101613904565b505f5b60208110156139b4578360200135816020811061397657613976615abd565b1a60f81b82613986836020615c29565b8151811061399657613996615abd565b60200101906001600160f81b03191690815f1a905350600101613957565b505f5b6004811015613a17576139cb816003615ecb565b6139d6906008615c5e565b6014901c60f81b826139e9836040615c29565b815181106139f9576139f9615abd565b60200101906001600160f81b03191690815f1a9053506001016139b7565b505f613a296060850160408601615a5d565b60601b90505f5b6014811015613a8957818160148110613a4b57613a4b615abd565b1a60f81b83613a5b836044615c29565b81518110613a6b57613a6b615abd565b60200101906001600160f81b03191690815f1a905350600101613a30565b505f613a986060860186615a78565b905090505f5b6004811015613b0357613ab2816003615ecb565b613abd906008615c5e565b63ffffffff8316901c60f81b84613ad5836058615c29565b81518110613ae557613ae5615abd565b60200101906001600160f81b03191690815f1a905350600101613a9e565b505f5b613b136060870187615a78565b9050811015613d27575f613b28826058615c5e565b613b3390605c615c29565b90505f5b6020811015613bbe57613b4d6060890189615a78565b84818110613b5d57613b5d615abd565b9050602002810190613b6f9190615ad1565b358160208110613b8157613b81615abd565b1a60f81b86613b908385615c29565b81518110613ba057613ba0615abd565b60200101906001600160f81b03191690815f1a905350600101613b37565b505f5b6008811015613c7357613bd5816007615ecb565b613be0906008615c5e565b613bed60608a018a615a78565b85818110613bfd57613bfd615abd565b9050602002810190613c0f9190615ad1565b613c209060408101906020016157de565b6001600160401b0316901c60f81b8682613c3b856020615c29565b613c459190615c29565b81518110613c5557613c55615abd565b60200101906001600160f81b03191690815f1a905350600101613bc1565b505f5b6030811015613d1d57613c8c6060890189615a78565b84818110613c9c57613c9c615abd565b9050602002810190613cae9190615ad1565b613cbc906040810190615fb1565b82818110613ccc57613ccc615abd565b9050013560f81c60f81b8682846028613ce59190615c29565b613cef9190615c29565b81518110613cff57613cff615abd565b60200101906001600160f81b03191690815f1a905350600101613c76565b5050600101613b06565b5091949350505050565b613d396155f7565b5f8281525f805160206162888339815191526020526040808220815160e0810190925280545f8051602061622883398151915293929190829060ff166005811115613d8657613d866157f7565b6005811115613d9757613d976157f7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e0957613e096157f7565b14613e655760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106ce565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ea957613ea96157f7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f558582612874565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613fcf5760405162461bcd60e51b81526004016106ce90615ede565b5f805b600281101561401e57613fe6816001615ecb565b613ff1906008615c5e565b61ffff1685828151811061400757614007615abd565b016020015160f81c901b9190911790600101613fd2565b5061ffff8116156140415760405162461bcd60e51b81526004016106ce90615f27565b5f805b600481101561409c57614058816003615ecb565b614063906008615c5e565b63ffffffff1686614075836002615c29565b8151811061408557614085615abd565b016020015160f81c901b9190911790600101614044565b5063ffffffff81166003146140c35760405162461bcd60e51b81526004016106ce90615f6a565b5f805b6020811015614118576140da81601f615ecb565b6140e5906008615c5e565b876140f1836006615c29565b8151811061410157614101615abd565b016020015160f81c901b91909117906001016140c6565b505f8660268151811061412d5761412d615abd565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206161e88339815191528161416684610c84565b90505f61417287612510565b905061417d87613074565b6141da5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106ce565b6002815160058111156141ef576141ef6157f7565b1461424e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106ce565b5f82826080015161425f9190615cc7565b60048501546040840151919250614281916001600160401b0390911690615ff3565b6001600160401b0316816001600160401b031611156143005760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106ce565b5f8061430c8a84612874565b915091505f8a8360405160200161433a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156143d5576143d56157f7565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146145275760405162461bcd60e51b81526004016106ce90615ede565b5f805b60028110156145765761453e816001615ecb565b614549906008615c5e565b61ffff1685828151811061455f5761455f615abd565b016020015160f81c901b919091179060010161452a565b5061ffff8116156145995760405162461bcd60e51b81526004016106ce90615f27565b5f805b60048110156145f4576145b0816003615ecb565b6145bb906008615c5e565b63ffffffff16866145cd836002615c29565b815181106145dd576145dd615abd565b016020015160f81c901b919091179060010161459c565b5063ffffffff811660051461461b5760405162461bcd60e51b81526004016106ce90615f6a565b5f805b60208110156146705761463281601f615ecb565b61463d906008615c5e565b87614649836006615c29565b8151811061465957614659615abd565b016020015160f81c901b919091179060010161461e565b505f805b60088110156146cf57614688816007615ecb565b614693906008615c5e565b6001600160401b0316886146a8836026615c29565b815181106146b8576146b8615abd565b016020015160f81c901b9190911790600101614674565b5090969095509350505050565b5f805160206162288339815191525f6001600160401b0380841690851611156147105761470983856158ce565b905061471d565b61471a84846158ce565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061477f57506001840154815161477b916001600160401b031690615c29565b8210155b156147a5576001600160401b0383166060820152818152604081015160208201526147c4565b82816060018181516147b79190615cc7565b6001600160401b03169052505b60608101516147d4906064615ff3565b602082015160018601546001600160401b0392909216916147ff9190600160401b900460ff16615c5e565b10156148635760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106ce565b856001600160401b03168160400181815161487e9190615c29565b9052506040810180516001600160401b038716919061489e908390615ecb565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162888339815191526020526040812060020180545f8051602061622883398151915291600160401b9091046001600160401b03169060086149348361601e565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166149c357604051631afcd79f60e31b815260040160405180910390fd5b565b6149cd61497a565b6149d681615080565b6149de615099565b612018606082013560808301356149fb60c0850160a086016157de565b614a0b60e0860160c08701616039565b61ffff16614a20610100870160e08801616052565b614a3261012088016101008901615a5d565b6150a9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16614ac25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106ce565b5f8051602061622883398151915242614ae160408601602087016157de565b6001600160401b031611614b535760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106ce565b614b6360408501602086016157de565b6001600160401b0316614b796202a30042615c29565b11614bec5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106ce565b8335614c445760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106ce565b83355f90815260088201602052604090205415614cb45760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106ce565b6030614cc36040860186615fb1565b905014614d285760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106ce565b614d32835f6146dc565b5f80614dcb6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614d7691906157de565b6001600160401b03168152602001614d9160408a018a615fb1565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250615331565b5f82815260068601602052604090209193509150614de982826160b6565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614e27908590600401615965565b6020604051808303815f875af1158015614e43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e67919061592c565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614edf57614edf6157f7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614fbf918e01908e016157de565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156150105760405163cd78605960e01b81523060048201526024016106ce565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114615059576040519150601f19603f3d011682016040523d82523d5f602084013e61505e565b606091505b50509050806124da57604051630a12f52160e11b815260040160405180910390fd5b61508861497a565b615090615435565b6120188161543d565b6150a161497a565b6149c36155b8565b6150b161497a565b5f805160206161e88339815191528361511d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106ce565b6127108411156151835760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106ce565b858711156151eb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106ce565b5f8360ff16116152585760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106ce565b600a60ff841611156152ca5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106ce565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461539b5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106ce565b5f806001855f015186602001518760400151886080015189606001516040516020016153cd9796959493929190616171565b60405160208183030381529060405290506002816040516153ee9190615c18565b602060405180830381855afa158015615409573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061542c919061592c565b94909350915050565b6149c361497a565b61544561497a565b80355f80516020616228833981519152908155601461546a6060840160408501616052565b60ff1611156154d75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106ce565b5f6154e86060840160408501616052565b60ff16116155505760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106ce565b6155606060830160408401616052565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561559160408301602084016157de565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d4361497a565b5080546155cc90615d32565b5f825580601f106155db575050565b601f0160209004905f5260205f20908101906120189190615633565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615647575f8155600101615634565b5090565b8015158114612018575f80fd5b803563ffffffff8116811461250b575f80fd5b5f805f6060848603121561567d575f80fd5b83359250602084013561568f8161564b565b915061569d60408501615658565b90509250925092565b5f602082840312156156b6575f80fd5b5035919050565b5f61012082840312156156ce575f80fd5b50919050565b803561ffff8116811461250b575f80fd5b80356001600160401b038116811461250b575f80fd5b5f805f6060848603121561570d575f80fd5b83356001600160401b03811115615722575f80fd5b840160608187031215615733575f80fd5b9250615741602085016156d4565b915061569d604085016156e5565b5f6020828403121561575f575f80fd5b610cc782615658565b5f8060408385031215615779575f80fd5b61578283615658565b946020939093013593505050565b5f80604083850312156157a1575f80fd5b82356001600160401b038111156157b6575f80fd5b8301608081860312156157c7575f80fd5b91506157d560208401615658565b90509250929050565b5f602082840312156157ee575f80fd5b610cc7826156e5565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061582e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161586960608401826001600160401b03169052565b50608083015161588460808401826001600160401b03169052565b5060a083015161589f60a08401826001600160401b03169052565b5060c08301516134e460c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156134e4576134e46158ba565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f6020828403121561593c575f80fd5b5051919050565b5f5b8381101561595d578181015183820152602001615945565b50505f910152565b602081525f8251806020840152615983816040850160208701615943565b601f01601f19169190910160400192915050565b5f826159b157634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612018575f80fd5b5f60208284031215615a6d575f80fd5b8135610cc781615a49565b5f808335601e19843603018112615a8d575f80fd5b8301803591506001600160401b03821115615aa6575f80fd5b6020019150600581901b36038213156129c4575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615ae5575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b2557615b25615aef565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615b5357615b53615aef565b604052919050565b5f6001600160401b03821115615b7357615b73615aef565b50601f01601f191660200190565b5f60608236031215615b91575f80fd5b615b99615b03565b823581526020615baa8185016156e5565b8183015260408401356001600160401b03811115615bc6575f80fd5b840136601f820112615bd6575f80fd5b8035615be9615be482615b5b565b615b2b565b8181523684838501011115615bfc575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615ae5818460208701615943565b80820180821115610c9457610c946158ba565b5f63ffffffff808316818103615c5457615c546158ba565b6001019392505050565b8082028115828204841417610c9457610c946158ba565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156134e4576134e46158ba565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615d4657607f821691505b6020821081036156ce57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615d7681615d32565b806020870152604060018084165f8114615d975760018114615db357615de0565b60ff19851660408a0152604084151560051b8a01019550615de0565b895f5260205f205f5b85811015615dd75781548b8201860152908301908801615dbc565b8a016040019650505b509398975050505050505050565b805161250b8161564b565b5f8060408385031215615e0a575f80fd5b82516001600160401b0380821115615e20575f80fd5b9084019060608287031215615e33575f80fd5b615e3b615b03565b82518152602080840151615e4e81615a49565b82820152604084015183811115615e63575f80fd5b80850194505087601f850112615e77575f80fd5b83519250615e87615be484615b5b565b8381528882858701011115615e9a575f80fd5b615ea984838301848801615943565b80604084015250819550615ebe818801615dee565b9450505050509250929050565b81810381811115610c9457610c946158ba565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615fc6575f80fd5b8301803591506001600160401b03821115615fdf575f80fd5b6020019150368190038213156129c4575f80fd5b6001600160401b03818116838216028082169190828114616016576160166158ba565b505092915050565b5f6001600160401b03808316818103615c5457615c546158ba565b5f60208284031215616049575f80fd5b610cc7826156d4565b5f60208284031215616062575f80fd5b813560ff81168114610cc7575f80fd5b601f8211156124da57805f5260205f20601f840160051c810160208510156160975750805b601f840160051c820191505b81811015610d67575f81556001016160a3565b81516001600160401b038111156160cf576160cf615aef565b6160e3816160dd8454615d32565b84616072565b602080601f831160018114616116575f84156160ff5750858301515b5f19600386901b1c1916600185901b17855561310d565b5f85815260208120601f198616915b8281101561614457888601518255948401946001909101908401616125565b508582101561616157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516161c681604e860160208901615943565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161640238038061640283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162b58061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d836600461566c565b61058b565b005b3480156101ea575f80fd5b506101dd6101f93660046156a7565b6109ee565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd6102433660046156be565b610ba7565b348015610253575f80fd5b506102676102623660046156a7565b610c84565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046156fc565b610c9a565b604051908152602001610220565b348015610305575f80fd5b506101dd610314366004615750565b610cce565b348015610324575f80fd5b506101dd610333366004615769565b610d6e565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b366004615791565b6111fe565b34801561038b575f80fd5b506102ec61039a3660046157df565b6117e1565b3480156103aa575f80fd5b506102676103b93660046156a7565b6117fa565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb36600461566c565b61180e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e3660046156a7565b611a2a565b34801561042e575f80fd5b506101dd61043d366004615769565b611b30565b34801561044d575f80fd5b506101dd61045c3660046156a7565b611d13565b34801561046c575f80fd5b506101dd61047b366004615750565b61201c565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b43660046156a7565b612192565b3480156104c4575f80fd5b506101dd6104d33660046156a7565b612405565b6102ec6104e63660046156a7565b6124e0565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e6105193660046156a7565b612511565b604051610220919061580c565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b3660046156a7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f8051602061624983398151915260205260408082208151610100810190925280545f805160206161e983398151915293929190829060ff1660048111156105d9576105d96157f8565b60048111156105ea576105ea6157f8565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61066e82612511565b9050600283516004811115610685576106856157f8565b146106d75760405162461bcd60e51b815260206004820152602a60248201525f805160206162098339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461073c5760405162461bcd60e51b815260206004820152603360248201525f805160206162098339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106ce565b6003835280515f906002906005811115610758576107586157f8565b036107af5786156107705761076d83876125d9565b90505b5f8460600151836080015161078591906158cf565b90506107918482612875565b506001600160401b0390811660e0870152421660a0860152506107e3565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561081686606001516117e1565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b815260040161084a97969594939291906158ef565b602060405180830381865afa158015610865573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610889919061592d565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108c8576108c86157f8565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109dc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206162898339815191526020526040808220815160e0810190925280545f8051602061622983398151915293929190829060ff166005811115610a3b57610a3b6157f8565b6005811115610a4c57610a4c6157f8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abb57610abb6157f8565b14610b205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb610b458584606001515f6129cc565b6040518263ffffffff1660e01b8152600401610b619190615966565b6020604051808303815f875af1158015610b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba1919061592d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c3883612a1b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9464e8d4a5100083615998565b92915050565b5f610ca3612a2c565b610caf84848434612a63565b9050610cc760015f8051602061626983398151915255565b9392505050565b5f805160206161e98339815191525f80610ce784612d57565b91509150610cf482613075565b610cfe5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d2c57610d2c6157f8565b03610d51575f83815260088501602052604081208054919055610d4f82826130b0565b505b610d6781610d6284604001516117e1565b613116565b5050505050565b5f8181525f8051602061624983398151915260205260408082208151610100810190925280545f805160206161e983398151915293929190829060ff166004811115610dbc57610dbc6157f8565b6004811115610dcd57610dcd6157f8565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e5290612511565b9050600182516004811115610e6957610e696157f8565b14610ed25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106ce565b600381516005811115610ee757610ee76157f8565b0361105f576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610f4b57610f4b6157f8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115611074576110746157f8565b0361108257610d6784613129565b5f61108c86613326565b90505f8061109d83604001516134ec565b5091509150818560400151146110c55760405162461bcd60e51b81526004016106ce906159b7565b806001600160401b031684606001516001600160401b031610156111365760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106ce565b806001600160401b03168560c001516001600160401b0316111561116c5760405162461bcd60e51b81526004016106ce90615a01565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206162298339815191529060ff161561129b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611302919061592d565b8360200135146113645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106ce565b306113756060850160408601615a5e565b6001600160a01b0316146113e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106ce565b5f6113f56060850185615a79565b905090505f805b828163ffffffff1610156116e5575f6114186060880188615a79565b8363ffffffff1681811061142e5761142e615abe565b90506020028101906114409190615ad2565b61144990615b82565b80515f81815260088801602052604090205491925090156114c15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106ce565b5f6002895f0135856040516020016114f092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150a91615c19565b602060405180830381855afa158015611525573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611548919061592d565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d4576115d46157f8565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611687911686615c2a565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116de90615c3d565b90506113fc565b50600483018190555f6116f785613326565b90505f6117078260400151613727565b90505f61171388613899565b9050816002826040516117269190615c19565b602060405180830381855afa158015611741573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611764919061592d565b146117c85760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106ce565b5050506009909201805460ff1916600117905550505050565b5f610c946001600160401b03831664e8d4a51000615c5f565b5f61180482612511565b6080015192915050565b5f805160206161e98339815191525f61182685613d32565b905061183185613075565b61183c575050505050565b5f8581526005830160205260409020546001600160a01b031633146118735760405162461bcd60e51b81526004016106ce90615c76565b5f85815260058301602052604090205460a08201516118a291600160b01b90046001600160401b031690615cc8565b6001600160401b03168160c001516001600160401b031610156119235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106ce565b8315610d67575f61193486856125d9565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198b906117e1565b60a085015160c08601516040516001600160e01b031960e086901b1681526119bf939291829188905f9081906004016158ef565b602060405180830381865afa1580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe919061592d565b5f87815260088501602052604081208054909190611a1d908490615c2a565b9091555050505050505050565b5f805160206161e98339815191525f611a4283612511565b9050600481516005811115611a5957611a596157f8565b14611ac35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106ce565b5f8381526005830160205260409020546001600160a01b03163314611afa5760405162461bcd60e51b81526004016106ce90615c76565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba1906001600160a01b0316826130b0565b611b38612a2c565b5f8181525f8051602061624983398151915260205260408082208151610100810190925280545f805160206161e983398151915293929190829060ff166004811115611b8657611b866157f8565b6004811115611b9757611b976157f8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c1385613326565b90505f80611c2483604001516134ec565b509150915081846040015114611c4c5760405162461bcd60e51b81526004016106ce906159b7565b806001600160401b03168460e001516001600160401b03161115611c825760405162461bcd60e51b81526004016106ce90615a01565b600384516004811115611c9757611c976157f8565b14611ceb5760405162461bcd60e51b815260206004820152603160248201525f805160206162098339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106ce565b611cf486613129565b5050505050611d0f60015f8051602061626983398151915255565b5050565b611d1b612a2c565b5f8181525f8051602061624983398151915260205260408082208151610100810190925280545f805160206161e983398151915293929190829060ff166004811115611d6957611d696157f8565b6004811115611d7a57611d7a6157f8565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611dfe82612511565b9050600481516005811115611e1557611e156157f8565b14611e785760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106ce565b600283516004811115611e8d57611e8d6157f8565b1480611eab5750600383516004811115611ea957611ea96157f8565b145b611f075760405162461bcd60e51b815260206004820152602760248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526632b3b0ba34b7b760c91b60648201526084016106ce565b600283516004811115611f1c57611f1c6157f8565b03611ff6578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611f5485606001516117e1565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611fa696959493926001600160401b03909216919081906004016158ef565b602060405180830381865afa158015611fc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe5919061592d565b5f8681526007860160205260409020555b611fff85613129565b5050505061201960015f8051602061626983398151915255565b50565b5f805160206162298339815191525f61203483613326565b90505f806120458360400151613fad565b91509150806120a75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106ce565b60015f83815260078601602052604090205460ff1660058111156120cd576120cd6157f8565b146120ea5760405162461bcd60e51b81526004016106ce90615ce8565b5f8281526006850160205260408120612102916155c1565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061624983398151915260205260408082208151610100810190925280545f805160206161e983398151915293929190829060ff1660048111156121e0576121e06157f8565b60048111156121f1576121f16157f8565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115612278576122786157f8565b14806122965750600381516004811115612294576122946157f8565b145b6122ea5760405162461bcd60e51b815260206004820152603260248201525f80516020616209833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106ce565b5f6122f88260400151612511565b905080606001516001600160401b03165f0361237c5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb6123a98460400151846060015185608001516129cc565b6040518263ffffffff1660e01b81526004016123c59190615966565b6020604051808303815f875af11580156123e1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d67919061592d565b5f8181525f8051602061628983398151915260205260409020545f805160206162298339815191529060019060ff166005811115612445576124456157f8565b146124625760405162461bcd60e51b81526004016106ce90615ce8565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161249b9190600401615d65565b6020604051808303815f875af11580156124b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124db919061592d565b505050565b5f6124e9612a2c565b6124f482333461414e565b905061250c60015f8051602061626983398151915255565b919050565b6125196155f8565b5f8281525f80516020616289833981519152602052604090819020815160e0810190925280545f80516020616229833981519152929190829060ff166005811115612566576125666157f8565b6005811115612577576125776157f8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612624573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261264b9190810190615dfa565b91509150806126ae5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612715919061592d565b8251146127795760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106ce565b60208201516001600160a01b0316156127ef5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106ce565b5f806127fe8460400151614505565b9150915081871461286b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106ce565b9695505050505050565b5f8281525f80516020616289833981519152602052604081206002015481905f8051602061622983398151915290600160801b90046001600160401b03166128bd85826146dd565b5f6128c7876148eb565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129178a858b6129cc565b6040518263ffffffff1660e01b81526004016129339190615966565b6020604051808303815f875af115801561294f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612973919061592d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612a2361497b565b612019816149c6565b5f80516020616269833981519152805460011901612a5d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206161e98339815191529061ffff86161015612aea5760405162461bcd60e51b815260206004820152602b60248201525f8051602061620983398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106ce565b61271061ffff86161115612b425760405162461bcd60e51b815260206004820152602c60248201525f8051602061620983398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106ce565b60028101546001600160401b039081169085161015612bbb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106ce565b8054831015612c1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106ce565b8060010154831115612c855760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106ce565b825f612c9082610c84565b90505f612c9d8983614a38565b90506040518060600160405280612cb13390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061626983398151915255565b5f612d606155f8565b5f805160206162298339815191525f612d7885613326565b90505f80612d898360400151613fad565b915091508015612dee5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106ce565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612e1f57612e1f6157f8565b6005811115612e3057612e306157f8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612e9f57612e9f6157f8565b1480612ebd5750600181516005811115612ebb57612ebb6157f8565b145b612f1c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106ce565b600381516005811115612f3157612f316157f8565b03612f3f5760048152612f44565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f8957612f896157f8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561303d5761303d6157f8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156130fc575f80fd5b505af115801561310e573d5f803e3d5ffd5b505050505050565b611d0f6001600160a01b03831682614fee565b5f8181525f8051602061624983398151915260205260408082208151610100810190925280545f805160206161e983398151915293929190829060ff166004811115613177576131776157f8565b6004811115613188576131886157f8565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061327c90600160a01b900461ffff1684615c5f565b6132869190615998565b905080856008015f8581526020019081526020015f205f8282546132aa9190615c2a565b909155505f90506132bb8284615ecc565b90506132cb8560200151826130b0565b6132e08560200151610d6287606001516117e1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561338a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526133b19190810190615dfa565b91509150806134115760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106ce565b8151156134725760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106ce565b60208201516001600160a01b0316156134e55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106ce565b5092915050565b5f805f83516036146135105760405162461bcd60e51b81526004016106ce90615edf565b5f805b600281101561355f57613527816001615ecc565b613532906008615c5f565b61ffff1686828151811061354857613548615abe565b016020015160f81c901b9190911790600101613513565b5061ffff8116156135825760405162461bcd60e51b81526004016106ce90615f28565b5f805b60048110156135dd57613599816003615ecc565b6135a4906008615c5f565b63ffffffff16876135b6836002615c2a565b815181106135c6576135c6615abe565b016020015160f81c901b9190911790600101613585565b5063ffffffff81166004146136045760405162461bcd60e51b81526004016106ce90615f6b565b5f805b60208110156136595761361b81601f615ecc565b613626906008615c5f565b88613632836006615c2a565b8151811061364257613642615abe565b016020015160f81c901b9190911790600101613607565b505f805b60088110156136b857613671816007615ecc565b61367c906008615c5f565b6001600160401b031689613691836026615c2a565b815181106136a1576136a1615abe565b016020015160f81c901b919091179060010161365d565b505f805b6008811015613717576136d0816007615ecc565b6136db906008615c5f565b6001600160401b03168a6136f083602e615c2a565b8151811061370057613700615abe565b016020015160f81c901b91909117906001016136bc565b5091989097509095509350505050565b5f81516026146137495760405162461bcd60e51b81526004016106ce90615edf565b5f805b600281101561379857613760816001615ecc565b61376b906008615c5f565b61ffff1684828151811061378157613781615abe565b016020015160f81c901b919091179060010161374c565b5061ffff8116156137bb5760405162461bcd60e51b81526004016106ce90615f28565b5f805b6004811015613816576137d2816003615ecc565b6137dd906008615c5f565b63ffffffff16856137ef836002615c2a565b815181106137ff576137ff615abe565b016020015160f81c901b91909117906001016137be565b5063ffffffff81161561383b5760405162461bcd60e51b81526004016106ce90615f6b565b5f805b60208110156138905761385281601f615ecc565b61385d906008615c5f565b86613869836006615c2a565b8151811061387957613879615abe565b016020015160f81c901b919091179060010161383e565b50949350505050565b60605f6138a883830184615a79565b6138b491506058615c5f565b6138bf90605c615c2a565b6001600160401b038111156138d6576138d6615af0565b6040519080825280601f01601f191660200182016040528015613900576020820181803683370190505b5090505f5b6020811015613955578335816020811061392157613921615abe565b1a60f81b82828151811061393757613937615abe565b60200101906001600160f81b03191690815f1a905350600101613905565b505f5b60208110156139b5578360200135816020811061397757613977615abe565b1a60f81b82613987836020615c2a565b8151811061399757613997615abe565b60200101906001600160f81b03191690815f1a905350600101613958565b505f5b6004811015613a18576139cc816003615ecc565b6139d7906008615c5f565b6014901c60f81b826139ea836040615c2a565b815181106139fa576139fa615abe565b60200101906001600160f81b03191690815f1a9053506001016139b8565b505f613a2a6060850160408601615a5e565b60601b90505f5b6014811015613a8a57818160148110613a4c57613a4c615abe565b1a60f81b83613a5c836044615c2a565b81518110613a6c57613a6c615abe565b60200101906001600160f81b03191690815f1a905350600101613a31565b505f613a996060860186615a79565b905090505f5b6004811015613b0457613ab3816003615ecc565b613abe906008615c5f565b63ffffffff8316901c60f81b84613ad6836058615c2a565b81518110613ae657613ae6615abe565b60200101906001600160f81b03191690815f1a905350600101613a9f565b505f5b613b146060870187615a79565b9050811015613d28575f613b29826058615c5f565b613b3490605c615c2a565b90505f5b6020811015613bbf57613b4e6060890189615a79565b84818110613b5e57613b5e615abe565b9050602002810190613b709190615ad2565b358160208110613b8257613b82615abe565b1a60f81b86613b918385615c2a565b81518110613ba157613ba1615abe565b60200101906001600160f81b03191690815f1a905350600101613b38565b505f5b6008811015613c7457613bd6816007615ecc565b613be1906008615c5f565b613bee60608a018a615a79565b85818110613bfe57613bfe615abe565b9050602002810190613c109190615ad2565b613c219060408101906020016157df565b6001600160401b0316901c60f81b8682613c3c856020615c2a565b613c469190615c2a565b81518110613c5657613c56615abe565b60200101906001600160f81b03191690815f1a905350600101613bc2565b505f5b6030811015613d1e57613c8d6060890189615a79565b84818110613c9d57613c9d615abe565b9050602002810190613caf9190615ad2565b613cbd906040810190615fb2565b82818110613ccd57613ccd615abe565b9050013560f81c60f81b8682846028613ce69190615c2a565b613cf09190615c2a565b81518110613d0057613d00615abe565b60200101906001600160f81b03191690815f1a905350600101613c77565b5050600101613b07565b5091949350505050565b613d3a6155f8565b5f8281525f805160206162898339815191526020526040808220815160e0810190925280545f8051602061622983398151915293929190829060ff166005811115613d8757613d876157f8565b6005811115613d9857613d986157f8565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e0a57613e0a6157f8565b14613e665760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106ce565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613eaa57613eaa6157f8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f568582612875565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613fd05760405162461bcd60e51b81526004016106ce90615edf565b5f805b600281101561401f57613fe7816001615ecc565b613ff2906008615c5f565b61ffff1685828151811061400857614008615abe565b016020015160f81c901b9190911790600101613fd3565b5061ffff8116156140425760405162461bcd60e51b81526004016106ce90615f28565b5f805b600481101561409d57614059816003615ecc565b614064906008615c5f565b63ffffffff1686614076836002615c2a565b8151811061408657614086615abe565b016020015160f81c901b9190911790600101614045565b5063ffffffff81166003146140c45760405162461bcd60e51b81526004016106ce90615f6b565b5f805b6020811015614119576140db81601f615ecc565b6140e6906008615c5f565b876140f2836006615c2a565b8151811061410257614102615abe565b016020015160f81c901b91909117906001016140c7565b505f8660268151811061412e5761412e615abe565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206161e98339815191528161416784610c84565b90505f61417387612511565b905061417e87613075565b6141db5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106ce565b6002815160058111156141f0576141f06157f8565b1461424f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106ce565b5f8282608001516142609190615cc8565b60048501546040840151919250614282916001600160401b0390911690615ff4565b6001600160401b0316816001600160401b031611156143015760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106ce565b5f8061430d8a84612875565b915091505f8a8360405160200161433b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156143d6576143d66157f8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146145285760405162461bcd60e51b81526004016106ce90615edf565b5f805b60028110156145775761453f816001615ecc565b61454a906008615c5f565b61ffff1685828151811061456057614560615abe565b016020015160f81c901b919091179060010161452b565b5061ffff81161561459a5760405162461bcd60e51b81526004016106ce90615f28565b5f805b60048110156145f5576145b1816003615ecc565b6145bc906008615c5f565b63ffffffff16866145ce836002615c2a565b815181106145de576145de615abe565b016020015160f81c901b919091179060010161459d565b5063ffffffff811660051461461c5760405162461bcd60e51b81526004016106ce90615f6b565b5f805b60208110156146715761463381601f615ecc565b61463e906008615c5f565b8761464a836006615c2a565b8151811061465a5761465a615abe565b016020015160f81c901b919091179060010161461f565b505f805b60088110156146d057614689816007615ecc565b614694906008615c5f565b6001600160401b0316886146a9836026615c2a565b815181106146b9576146b9615abe565b016020015160f81c901b9190911790600101614675565b5090969095509350505050565b5f805160206162298339815191525f6001600160401b0380841690851611156147115761470a83856158cf565b905061471e565b61471b84846158cf565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061478057506001840154815161477c916001600160401b031690615c2a565b8210155b156147a6576001600160401b0383166060820152818152604081015160208201526147c5565b82816060018181516147b89190615cc8565b6001600160401b03169052505b60608101516147d5906064615ff4565b602082015160018601546001600160401b0392909216916148009190600160401b900460ff16615c5f565b10156148645760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106ce565b856001600160401b03168160400181815161487f9190615c2a565b9052506040810180516001600160401b038716919061489f908390615ecc565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162898339815191526020526040812060020180545f8051602061622983398151915291600160401b9091046001600160401b03169060086149358361601f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166149c457604051631afcd79f60e31b815260040160405180910390fd5b565b6149ce61497b565b6149d781615081565b6149df61509a565b612019606082013560808301356149fc60c0850160a086016157df565b614a0c60e0860160c0870161603a565b61ffff16614a21610100870160e08801616053565b614a3361012088016101008901615a5e565b6150aa565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16614ac35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106ce565b5f8051602061622983398151915242614ae260408601602087016157df565b6001600160401b031611614b545760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106ce565b614b6460408501602086016157df565b6001600160401b0316614b7a6202a30042615c2a565b11614bed5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106ce565b8335614c455760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106ce565b83355f90815260088201602052604090205415614cb55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106ce565b6030614cc46040860186615fb2565b905014614d295760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106ce565b614d33835f6146dd565b5f80614dcc6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614d7791906157df565b6001600160401b03168152602001614d9260408a018a615fb2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250615332565b5f82815260068601602052604090209193509150614dea82826160b7565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614e28908590600401615966565b6020604051808303815f875af1158015614e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e68919061592d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614ee057614ee06157f8565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614fc0918e01908e016157df565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156150115760405163cd78605960e01b81523060048201526024016106ce565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461505a576040519150601f19603f3d011682016040523d82523d5f602084013e61505f565b606091505b50509050806124db57604051630a12f52160e11b815260040160405180910390fd5b61508961497b565b615091615436565b6120198161543e565b6150a261497b565b6149c46155b9565b6150b261497b565b5f805160206161e98339815191528361511e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106ce565b6127108411156151845760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106ce565b858711156151ec5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106ce565b5f8360ff16116152595760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106ce565b600a60ff841611156152cb5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106ce565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461539c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106ce565b5f806001855f015186602001518760400151886080015189606001516040516020016153ce9796959493929190616172565b60405160208183030381529060405290506002816040516153ef9190615c19565b602060405180830381855afa15801561540a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061542d919061592d565b94909350915050565b6149c461497b565b61544661497b565b80355f80516020616229833981519152908155601461546b6060840160408501616053565b60ff1611156154d85760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106ce565b5f6154e96060840160408501616053565b60ff16116155515760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106ce565b6155616060830160408401616053565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561559260408301602084016157df565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d4461497b565b5080546155cd90615d33565b5f825580601f106155dc575050565b601f0160209004905f5260205f20908101906120199190615634565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615648575f8155600101615635565b5090565b8015158114612019575f80fd5b803563ffffffff8116811461250c575f80fd5b5f805f6060848603121561567e575f80fd5b8335925060208401356156908161564c565b915061569e60408501615659565b90509250925092565b5f602082840312156156b7575f80fd5b5035919050565b5f61012082840312156156cf575f80fd5b50919050565b803561ffff8116811461250c575f80fd5b80356001600160401b038116811461250c575f80fd5b5f805f6060848603121561570e575f80fd5b83356001600160401b03811115615723575f80fd5b840160608187031215615734575f80fd5b9250615742602085016156d5565b915061569e604085016156e6565b5f60208284031215615760575f80fd5b610cc782615659565b5f806040838503121561577a575f80fd5b61578383615659565b946020939093013593505050565b5f80604083850312156157a2575f80fd5b82356001600160401b038111156157b7575f80fd5b8301608081860312156157c8575f80fd5b91506157d660208401615659565b90509250929050565b5f602082840312156157ef575f80fd5b610cc7826156e6565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061582f57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161586a60608401826001600160401b03169052565b50608083015161588560808401826001600160401b03169052565b5060a08301516158a060a08401826001600160401b03169052565b5060c08301516134e560c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156134e5576134e56158bb565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f6020828403121561593d575f80fd5b5051919050565b5f5b8381101561595e578181015183820152602001615946565b50505f910152565b602081525f8251806020840152615984816040850160208701615944565b601f01601f19169190910160400192915050565b5f826159b257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612019575f80fd5b5f60208284031215615a6e575f80fd5b8135610cc781615a4a565b5f808335601e19843603018112615a8e575f80fd5b8301803591506001600160401b03821115615aa7575f80fd5b6020019150600581901b36038213156129c5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615ae6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b2657615b26615af0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615b5457615b54615af0565b604052919050565b5f6001600160401b03821115615b7457615b74615af0565b50601f01601f191660200190565b5f60608236031215615b92575f80fd5b615b9a615b04565b823581526020615bab8185016156e6565b8183015260408401356001600160401b03811115615bc7575f80fd5b840136601f820112615bd7575f80fd5b8035615bea615be582615b5c565b615b2c565b8181523684838501011115615bfd575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615ae6818460208701615944565b80820180821115610c9457610c946158bb565b5f63ffffffff808316818103615c5557615c556158bb565b6001019392505050565b8082028115828204841417610c9457610c946158bb565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156134e5576134e56158bb565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615d4757607f821691505b6020821081036156cf57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615d7781615d33565b806020870152604060018084165f8114615d985760018114615db457615de1565b60ff19851660408a0152604084151560051b8a01019550615de1565b895f5260205f205f5b85811015615dd85781548b8201860152908301908801615dbd565b8a016040019650505b509398975050505050505050565b805161250c8161564c565b5f8060408385031215615e0b575f80fd5b82516001600160401b0380821115615e21575f80fd5b9084019060608287031215615e34575f80fd5b615e3c615b04565b82518152602080840151615e4f81615a4a565b82820152604084015183811115615e64575f80fd5b80850194505087601f850112615e78575f80fd5b83519250615e88615be584615b5c565b8381528882858701011115615e9b575f80fd5b615eaa84838301848801615944565b80604084015250819550615ebf818801615def565b9450505050509250929050565b81810381811115610c9457610c946158bb565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615fc7575f80fd5b8301803591506001600160401b03821115615fe0575f80fd5b6020019150368190038213156129c5575f80fd5b6001600160401b03818116838216028082169190828114616017576160176158bb565b505092915050565b5f6001600160401b03808316818103615c5557615c556158bb565b5f6020828403121561604a575f80fd5b610cc7826156d5565b5f60208284031215616063575f80fd5b813560ff81168114610cc7575f80fd5b601f8211156124db57805f5260205f20601f840160051c810160208510156160985750805b601f840160051c820191505b81811015610d67575f81556001016160a4565b81516001600160401b038111156160d0576160d0615af0565b6160e4816160de8454615d33565b84616073565b602080601f831160018114616117575f84156161005750858301515b5f19600386901b1c1916600185901b17855561310e565b5f85815260208120601f198616915b8281101561614557888601518255948401946001909101908401616126565b508582101561616257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516161c781604e860160208901615944565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 b94b247ae..dc1f233ef 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -447,7 +447,7 @@ abstract contract PoSValidatorManager is stakeAmount: weightToValue(delegator.weight), validatorStartTime: validator.startedAt, stakingStartTime: delegator.startedAt, - stakingEndTime: delegator.endedAt, + stakingEndTime: validator.endedAt, uptimeSeconds: $._completedValidationUptimeSeconds[validationID], initialSupply: 0, endSupply: 0 From b61841d9a4e2aa012b73953689789d26c2ae5030 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 20 Sep 2024 15:03:45 -0500 Subject: [PATCH 388/545] consistent types --- contracts/validator-manager/PoSValidatorManager.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 8e6761b42..d8b381b59 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -41,7 +41,7 @@ abstract contract PoSValidatorManager is /// @notice The minimum amount of time a validator must be staked for. uint64 _minimumStakeDuration; /// @notice The minimum delegation fee percentage, in basis points, required to delegate to a validator. - uint256 _minimumDelegationFeeBips; + uint16 _minimumDelegationFeeBips; /** * @notice A multiplier applied to validator's initial stake amount to determine * the maximum amount of stake a validator can have with delegations. @@ -118,7 +118,7 @@ abstract contract PoSValidatorManager is uint256 minimumStakeAmount, uint256 maximumStakeAmount, uint64 minimumStakeDuration, - uint256 minimumDelegationFeeBips, + uint16 minimumDelegationFeeBips, uint8 maximumStakeMultiplier, IRewardCalculator rewardCalculator ) internal onlyInitializing { From 315ee62f4b14e34b1e941880f70bea30e1cd0ca0 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 20 Sep 2024 15:03:55 -0500 Subject: [PATCH 389/545] update bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 28f6ffa0d..f2fbc329a 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516152bf3803806152bf83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151728061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c806376f78621116100f3578063ba3a4b9711610093578063d5f20ff61161006e578063d5f20ff6146103bd578063df93d8de146103dd578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063ba3a4b971461038f578063bee0a03f146103a2578063c974d1b6146103b5575f80fd5b806398f3e2b4116100ce57806398f3e2b4146103305780639e1bc4ef14610343578063a3a65e4814610356578063b771b3bc14610369575f80fd5b806376f78621146103025780638280a25a1461031557806393e245981461031d575f80fd5b8063467ef06f1161015e57806361e2f4901161013957806361e2f490146102c257806362065856146102d557806366435abf146102e8578063732214f8146102fb575f80fd5b8063467ef06f1461027f5780635297fae61461029257806360305d62146102a5575f80fd5b80630118acc4146101a55780630322ed98146101ba5780630cdd0985146101cd578063151d30d11461021e5780632e2194d81461023857806335455ded14610263575b5f80fd5b6101b86101b336600461463a565b61040d565b005b6101b86101c8366004614675565b610845565b61020b6101db366004614675565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610226600a81565b60405160ff9091168152602001610215565b61024b610246366004614675565b6109b7565b6040516001600160401b039091168152602001610215565b61026c61271081565b60405161ffff9091168152602001610215565b6101b861028d36600461468c565b6109cd565b6101b86102a03660046146a5565b610a6d565b6102ad601481565b60405163ffffffff9091168152602001610215565b6101b86102d03660046146cd565b610be2565b61020b6102e3366004614731565b611066565b61024b6102f6366004614675565b61107f565b61020b5f81565b6101b861031036600461463a565b611093565b610226603081565b6101b861032b366004614675565b61128c565b6101b861033e3660046146a5565b611347565b61020b61035136600461474a565b611620565b6101b861036436600461468c565b61164c565b6103776005600160991b0181565b6040516001600160a01b039091168152602001610215565b6101b861039d366004614675565b6117db565b6101b86103b0366004614675565b6119d9565b610226601481565b6103d06103cb366004614675565b611b03565b604051610215919061477e565b61024b6202a30081565b61020b6103f536600461483e565b611bcb565b6101b86104083660046148b7565b611c00565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206150e683398151915293929190829060ff16600481111561046e5761046e61476a565b600481111561047f5761047f61476a565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61050382611b03565b905060028351600481111561051a5761051a61476a565b146105385760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105655760405163e6c4247b60e01b815260040160405180910390fd5b6003835280515f9060029060058111156105815761058161476a565b036105d8578615610599576105968387611cdf565b90505b5f846060015183608001516105ae9190614909565b90506105ba8482611e63565b506001600160401b0390811660e0870152421660a08601525061060c565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561063f8660600151611066565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e09190614929565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561071f5761071f61476a565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610833916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206151468339815191526020526040808220815160e0810190925280545f8051602061510683398151915293929190829060ff1660058111156108925761089261476a565b60058111156108a3576108a361476a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109125761091261476a565b146109305760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109558584606001515f611fba565b6040518263ffffffff1660e01b81526004016109719190614962565b6020604051808303815f875af115801561098d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109b19190614929565b50505050565b5f6109c764e8d4a5100083614994565b92915050565b5f805160206150e68339815191525f806109e684612011565b915091506109f3826122db565b6109fd5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610a2b57610a2b61476a565b03610a50575f83815260088501602052604081208054919055610a4e8282612316565b505b610a6681610a618460400151611066565b61238c565b5050505050565b5f805160206150e68339815191525f610a85846123af565b90505f80610a9683604001516124af565b50915091505f610aa583611b03565b9050816001600160401b031681606001516001600160401b03161080610aef57505f8681526006860160205260409020600201546001600160401b03808416600160c01b90920416115b15610b0d57604051633ab3447f60e11b815260040160405180910390fd5b60015f87815260068701602052604090205460ff166004811115610b3357610b3361476a565b14610b515760405163f95c7fe160e01b815260040160405180910390fd5b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151068339815191529060ff1615610c3457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9b9190614929565b836020013514610cbe5760405163d040949d60e01b815260040160405180910390fd5b30610ccf60608501604086016149b3565b6001600160a01b031614610cf65760405163e6c4247b60e01b815260040160405180910390fd5b5f610d0460608501856149ce565b905090505f805b828163ffffffff161015610fb0575f610d2760608801886149ce565b8363ffffffff16818110610d3d57610d3d614a13565b9050602002810190610d4f9190614a27565b610d5890614ad7565b80515f8181526008880160205260409020549192509015610d8c57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610dbb92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610dd591614b6e565b602060405180830381855afa158015610df0573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610e139190614929565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610e9f57610e9f61476a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610f52911686614b7f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610fa990614b92565b9050610d0b565b50600483018190555f610fc2856123af565b90505f610fd282604001516126f3565b90505f610fde88612865565b905081600282604051610ff19190614b6e565b602060405180830381855afa15801561100c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061102f9190614929565b1461104d57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6109c76001600160401b03831664e8d4a51000614bb4565b5f61108982611b03565b6080015192915050565b5f805160206150e68339815191525f6110ab85612cfe565b90506110b6856122db565b6110c1575050505050565b5f8581526005830160205260409020546001600160a01b031633146110f95760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260058301602052604090205460a082015161112891600160b01b90046001600160401b031690614bcb565b6001600160401b03168160c001516001600160401b0316101561115e576040516302336bad60e51b815260040160405180910390fd5b8315610a66575f61116f8685611cdf565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906111c690611066565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561123c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112609190614929565b5f8781526008850160205260408120805490919061127f908490614b7f565b9091555050505050505050565b5f805160206150e68339815191525f6112a483611b03565b90506004815160058111156112bb576112bb61476a565b146112d95760405163a36c527f60e01b815260040160405180910390fd5b5f8381526005830160205260409020546001600160a01b031633146113115760405163e6c4247b60e01b815260040160405180910390fd5b5f838152600883016020908152604080832080549084905560058601909252909120546109b1906001600160a01b031682612316565b61134f612f3b565b5f805160206150e68339815191525f611367846123af565b90505f8061137883604001516124af565b50915091505f61138783611b03565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff1660048111156113c1576113c161476a565b60048111156113d2576113d261476a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610806114b95750826001600160401b03168160e001516001600160401b0316115b156114d757604051633ab3447f60e11b815260040160405180910390fd5b6003815160048111156114ec576114ec61476a565b1461150a5760405163f95c7fe160e01b815260040160405180910390fd5b5f878152600787016020908152604080832080549084905587845260058a019092528220549091906127109061154b90600160a01b900461ffff1684614bb4565b6115559190614994565b905080886008015f8881526020019081526020015f205f8282546115799190614b7f565b909155505f905061158a8284614beb565b905061159a846020015182612316565b6115af8460200151610a618660600151611066565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d503384866040516115f5929190918252602082015260400190565b60405180910390a450505050505050505061161c60015f8051602061512683398151915255565b5050565b5f611629612f3b565b611634833384612f85565b90506109c760015f8051602061512683398151915255565b5f805160206151068339815191525f611664836123af565b90505f806116758360400151613271565b915091508061169757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546116b190614bfe565b90505f036116d257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156116f8576116f861476a565b146117165760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061172e9161458a565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f805160206150e683398151915293929190829060ff16600481111561183c5761183c61476a565b600481111561184d5761184d61476a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156118d4576118d461476a565b141580156118f557506003815160048111156118f2576118f261476a565b14155b156119135760405163f95c7fe160e01b815260040160405180910390fd5b5f6119218260400151611b03565b905080606001516001600160401b03165f0361195057604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61197d846040015184606001518560800151611fba565b6040518263ffffffff1660e01b81526004016119999190614962565b6020604051808303815f875af11580156119b5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a669190614929565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206151068339815191529190611a2090614bfe565b90505f03611a4157604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611a6757611a6761476a565b14611a855760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611abe9190600401614c36565b6020604051808303815f875af1158015611ada573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611afe9190614929565b505050565b611b0b6145c1565b5f8281525f80516020615146833981519152602052604090819020815160e0810190925280545f80516020615106833981519152929190829060ff166005811115611b5857611b5861476a565b6005811115611b6957611b6961476a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611bd4612f3b565b611be085858585613412565b9050611bf860015f8051602061512683398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611c49575080546001600160401b03808416911610155b15611c675760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611c9284846135a5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d2a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d519190810190614ccb565b9150915080611d7357604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611db6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dda9190614929565b825114611dfa5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611e265760405163e6c4247b60e01b815260040160405180910390fd5b5f80611e3584604001516135bf565b91509150818714611e5957604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615146833981519152602052604081206002015481905f8051602061510683398151915290600160801b90046001600160401b0316611eab8582613797565b5f611eb587613960565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611f058a858b611fba565b6040518263ffffffff1660e01b8152600401611f219190614962565b6020604051808303815f875af1158015611f3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f619190614929565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f61201a6145c1565b5f805160206151068339815191525f612032856123af565b90505f806120438360400151613271565b91509150801561206657604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156120975761209761476a565b60058111156120a8576120a861476a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156121195761211961476a565b1415801561213a57506001825160058111156121375761213761476a565b14155b156121585760405163a36c527f60e01b815260040160405180910390fd5b60038251600581111561216d5761216d61476a565b0361217a5750600461217e565b5060055b6020808301515f908152600888019091526040812055818160058111156121a7576121a761476a565b908160058111156121ba576121ba61476a565b9052505f84815260078701602052604090208251815484929190829060ff191660018360058111156121ee576121ee61476a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156122a2576122a261476a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f805160206150c683398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612371575f80fd5b505af1158015612383573d5f803e3d5ffd5b50505050505050565b5f805160206150c68339815191525461161c906001600160a01b031683836139f0565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612413573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261243a9190810190614ccb565b915091508061245c57604051636b2f19e960e01b815260040160405180910390fd5b81511561247c5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156124a85760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146124dc5760405162461bcd60e51b81526004016124d390614d9d565b60405180910390fd5b5f805b600281101561252b576124f3816001614beb565b6124fe906008614bb4565b61ffff1686828151811061251457612514614a13565b016020015160f81c901b91909117906001016124df565b5061ffff81161561254e5760405162461bcd60e51b81526004016124d390614de6565b5f805b60048110156125a957612565816003614beb565b612570906008614bb4565b63ffffffff1687612582836002614b7f565b8151811061259257612592614a13565b016020015160f81c901b9190911790600101612551565b5063ffffffff81166004146125d05760405162461bcd60e51b81526004016124d390614e29565b5f805b6020811015612625576125e781601f614beb565b6125f2906008614bb4565b886125fe836006614b7f565b8151811061260e5761260e614a13565b016020015160f81c901b91909117906001016125d3565b505f805b60088110156126845761263d816007614beb565b612648906008614bb4565b6001600160401b03168961265d836026614b7f565b8151811061266d5761266d614a13565b016020015160f81c901b9190911790600101612629565b505f805b60088110156126e35761269c816007614beb565b6126a7906008614bb4565b6001600160401b03168a6126bc83602e614b7f565b815181106126cc576126cc614a13565b016020015160f81c901b9190911790600101612688565b5091989097509095509350505050565b5f81516026146127155760405162461bcd60e51b81526004016124d390614d9d565b5f805b60028110156127645761272c816001614beb565b612737906008614bb4565b61ffff1684828151811061274d5761274d614a13565b016020015160f81c901b9190911790600101612718565b5061ffff8116156127875760405162461bcd60e51b81526004016124d390614de6565b5f805b60048110156127e25761279e816003614beb565b6127a9906008614bb4565b63ffffffff16856127bb836002614b7f565b815181106127cb576127cb614a13565b016020015160f81c901b919091179060010161278a565b5063ffffffff8116156128075760405162461bcd60e51b81526004016124d390614e29565b5f805b602081101561285c5761281e81601f614beb565b612829906008614bb4565b86612835836006614b7f565b8151811061284557612845614a13565b016020015160f81c901b919091179060010161280a565b50949350505050565b60605f612874838301846149ce565b61288091506058614bb4565b61288b90605c614b7f565b6001600160401b038111156128a2576128a2614a45565b6040519080825280601f01601f1916602001820160405280156128cc576020820181803683370190505b5090505f5b602081101561292157833581602081106128ed576128ed614a13565b1a60f81b82828151811061290357612903614a13565b60200101906001600160f81b03191690815f1a9053506001016128d1565b505f5b6020811015612981578360200135816020811061294357612943614a13565b1a60f81b82612953836020614b7f565b8151811061296357612963614a13565b60200101906001600160f81b03191690815f1a905350600101612924565b505f5b60048110156129e457612998816003614beb565b6129a3906008614bb4565b6014901c60f81b826129b6836040614b7f565b815181106129c6576129c6614a13565b60200101906001600160f81b03191690815f1a905350600101612984565b505f6129f660608501604086016149b3565b60601b90505f5b6014811015612a5657818160148110612a1857612a18614a13565b1a60f81b83612a28836044614b7f565b81518110612a3857612a38614a13565b60200101906001600160f81b03191690815f1a9053506001016129fd565b505f612a6560608601866149ce565b905090505f5b6004811015612ad057612a7f816003614beb565b612a8a906008614bb4565b63ffffffff8316901c60f81b84612aa2836058614b7f565b81518110612ab257612ab2614a13565b60200101906001600160f81b03191690815f1a905350600101612a6b565b505f5b612ae060608701876149ce565b9050811015612cf4575f612af5826058614bb4565b612b0090605c614b7f565b90505f5b6020811015612b8b57612b1a60608901896149ce565b84818110612b2a57612b2a614a13565b9050602002810190612b3c9190614a27565b358160208110612b4e57612b4e614a13565b1a60f81b86612b5d8385614b7f565b81518110612b6d57612b6d614a13565b60200101906001600160f81b03191690815f1a905350600101612b04565b505f5b6008811015612c4057612ba2816007614beb565b612bad906008614bb4565b612bba60608a018a6149ce565b85818110612bca57612bca614a13565b9050602002810190612bdc9190614a27565b612bed906040810190602001614731565b6001600160401b0316901c60f81b8682612c08856020614b7f565b612c129190614b7f565b81518110612c2257612c22614a13565b60200101906001600160f81b03191690815f1a905350600101612b8e565b505f5b6030811015612cea57612c5960608901896149ce565b84818110612c6957612c69614a13565b9050602002810190612c7b9190614a27565b612c89906040810190614e70565b82818110612c9957612c99614a13565b9050013560f81c60f81b8682846028612cb29190614b7f565b612cbc9190614b7f565b81518110612ccc57612ccc614a13565b60200101906001600160f81b03191690815f1a905350600101612c43565b5050600101612ad3565b5091949350505050565b612d066145c1565b5f8281525f805160206151468339815191526020526040808220815160e0810190925280545f8051602061510683398151915293929190829060ff166005811115612d5357612d5361476a565b6005811115612d6457612d6461476a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612dd657612dd661476a565b14612df45760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612e3857612e3861476a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612ee48582611e63565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615126833981519152805460011901612f6c57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061512683398151915255565b5f5f805160206150e683398151915281612fa161024685613a4f565b90505f612fad87611b03565b9050612fb8876122db565b612fd557604051636ca57bcf60e01b815260040160405180910390fd5b600281516005811115612fea57612fea61476a565b146130085760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516130199190614bcb565b6004850154604084015191925061303b916001600160401b0390911690614eb2565b6001600160401b0316816001600160401b0316111561306d57604051630c192e7760e41b815260040160405180910390fd5b5f806130798a84611e63565b915091505f8a836040516020016130a792919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156131425761314261476a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146132945760405162461bcd60e51b81526004016124d390614d9d565b5f805b60028110156132e3576132ab816001614beb565b6132b6906008614bb4565b61ffff168582815181106132cc576132cc614a13565b016020015160f81c901b9190911790600101613297565b5061ffff8116156133065760405162461bcd60e51b81526004016124d390614de6565b5f805b60048110156133615761331d816003614beb565b613328906008614bb4565b63ffffffff168661333a836002614b7f565b8151811061334a5761334a614a13565b016020015160f81c901b9190911790600101613309565b5063ffffffff81166003146133885760405162461bcd60e51b81526004016124d390614e29565b5f805b60208110156133dd5761339f81601f614beb565b6133aa906008614bb4565b876133b6836006614b7f565b815181106133c6576133c6614a13565b016020015160f81c901b919091179060010161338b565b505f866026815181106133f2576133f2614a13565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206150e68339815191529061ffff8616108061345b575061271061ffff8616115b156134795760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156134ab576040516302336bad60e51b815260040160405180910390fd5b80548310806134bd5750806001015483115b156134db57604051630103be3b60e21b815260040160405180910390fd5b5f6134e584613a4f565b90505f6134f1826109b7565b90505f6134fe8983613a72565b905060405180606001604052806135123390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6135ad613e4b565b6135b682613e96565b61161c81613f0b565b5f808251602e146135e25760405162461bcd60e51b81526004016124d390614d9d565b5f805b6002811015613631576135f9816001614beb565b613604906008614bb4565b61ffff1685828151811061361a5761361a614a13565b016020015160f81c901b91909117906001016135e5565b5061ffff8116156136545760405162461bcd60e51b81526004016124d390614de6565b5f805b60048110156136af5761366b816003614beb565b613676906008614bb4565b63ffffffff1686613688836002614b7f565b8151811061369857613698614a13565b016020015160f81c901b9190911790600101613657565b5063ffffffff81166005146136d65760405162461bcd60e51b81526004016124d390614e29565b5f805b602081101561372b576136ed81601f614beb565b6136f8906008614bb4565b87613704836006614b7f565b8151811061371457613714614a13565b016020015160f81c901b91909117906001016136d9565b505f805b600881101561378a57613743816007614beb565b61374e906008614bb4565b6001600160401b031688613763836026614b7f565b8151811061377357613773614a13565b016020015160f81c901b919091179060010161372f565b5090969095509350505050565b5f805160206151068339815191525f6001600160401b0380841690851611156137cb576137c48385614909565b90506137d8565b6137d58484614909565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061383a575060018401548151613836916001600160401b031690614b7f565b8210155b15613860576001600160401b03831660608201528181526040810151602082015261387f565b82816060018181516138729190614bcb565b6001600160401b03169052505b606081015161388f906064614eb2565b602082015160018601546001600160401b0392909216916138ba9190600160401b900460ff16614bb4565b10156138d95760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516138f49190614b7f565b9052506040810180516001600160401b0387169190613914908390614beb565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206151468339815191526020526040812060020180545f8051602061510683398151915291600160401b9091046001600160401b03169060086139aa83614edd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611afe91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f68565b5f6109c7825f805160206150c6833981519152546001600160a01b031690613fc9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ab657604051637fab81e560e01b815260040160405180910390fd5b5f8051602061510683398151915242613ad56040860160208701614731565b6001600160401b0316111580613b0f5750613af36202a30042614b7f565b613b036040860160208701614731565b6001600160401b031610155b15613b2c5760405162d36c8560e81b815260040160405180910390fd5b6030613b3b6040860186614e70565b9050141580613b4957508335155b15613b675760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613b9757604051630eb0d31360e11b815260040160405180910390fd5b613ba1835f613797565b5f80613c3a6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613be59190614731565b6001600160401b03168152602001613c0060408a018a614e70565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061412b565b5f82815260068601602052604090209193509150613c588282614f3c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613c85908590600401614962565b6020604051808303815f875af1158015613ca1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cc59190614929565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613d3d57613d3d61476a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613e1d918e01908e01614731565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e9457604051631afcd79f60e31b815260040160405180910390fd5b565b613e9e613e4b565b613ea78161422f565b613eaf614248565b613f0860608201356080830135613ecc60c0850160a08601614731565b613edc60e0860160c08701614ffb565b61ffff16613ef1610100870160e08801615014565b613f03610120880161010089016149b3565b614258565b50565b613f13613e4b565b5f805160206150c68339815191526001600160a01b038216613f485760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613f7c6001600160a01b03841683614353565b905080515f14158015613fa0575080806020019051810190613f9e9190615034565b155b15611afe57604051635274afe760e01b81526001600160a01b03841660048201526024016124d3565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561400f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140339190614929565b905061404a6001600160a01b038516333086614360565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561408e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b29190614929565b90508181116141185760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016124d3565b6141228282614beb565b95945050505050565b5f60608260800151516030146141955760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016124d3565b5f806001855f015186602001518760400151886080015189606001516040516020016141c7979695949392919061504f565b60405160208183030381529060405290506002816040516141e89190614b6e565b602060405180830381855afa158015614203573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142269190614929565b94909350915050565b614237613e4b565b61423f614399565b613f08816143a1565b614250613e4b565b613e94614473565b614260613e4b565b5f805160206150e683398151915283158061427c575061271084115b1561429a5760405163c98d73a760e01b815260040160405180910390fd5b858711156142bb57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806142ce5750600a60ff8416115b156142ec576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b606061200a83835f61447b565b6040516001600160a01b0384811660248301528381166044830152606482018390526109b19186918216906323b872dd90608401613a1d565b613e94613e4b565b6143a9613e4b565b80355f8051602061510683398151915290815560146143ce6060840160408501615014565b60ff1611806143ed57506143e86060830160408401615014565b60ff16155b1561440b5760405163b4fa3fb360e01b815260040160405180910390fd5b61441b6060830160408401615014565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561444c6040830160208401614731565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612f72613e4b565b6060814710156144a05760405163cd78605960e01b81523060048201526024016124d3565b5f80856001600160a01b031684866040516144bb9190614b6e565b5f6040518083038185875af1925050503d805f81146144f5576040519150601f19603f3d011682016040523d82523d5f602084013e6144fa565b606091505b5091509150611e5986838360608261451a5761451582614561565b61200a565b815115801561453157506001600160a01b0384163b155b1561455a57604051639996b31560e01b81526001600160a01b03851660048201526024016124d3565b508061200a565b8051156145715780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461459690614bfe565b5f825580601f106145a5575050565b601f0160209004905f5260205f2090810190613f0891906145fd565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614611575f81556001016145fe565b5090565b8015158114613f08575f80fd5b803563ffffffff81168114614635575f80fd5b919050565b5f805f6060848603121561464c575f80fd5b83359250602084013561465e81614615565b915061466c60408501614622565b90509250925092565b5f60208284031215614685575f80fd5b5035919050565b5f6020828403121561469c575f80fd5b61200a82614622565b5f80604083850312156146b6575f80fd5b6146bf83614622565b946020939093013593505050565b5f80604083850312156146de575f80fd5b82356001600160401b038111156146f3575f80fd5b830160808186031215614704575f80fd5b915061471260208401614622565b90509250929050565b80356001600160401b0381168114614635575f80fd5b5f60208284031215614741575f80fd5b61200a8261471b565b5f806040838503121561475b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106147a157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516147dc60608401826001600160401b03169052565b5060808301516147f760808401826001600160401b03169052565b5060a083015161481260a08401826001600160401b03169052565b5060c08301516124a860c08401826001600160401b03169052565b803561ffff81168114614635575f80fd5b5f805f8060808587031215614851575f80fd5b84356001600160401b03811115614866575f80fd5b850160608188031215614877575f80fd5b93506148856020860161482d565b92506148936040860161471b565b9396929550929360600135925050565b6001600160a01b0381168114613f08575f80fd5b5f808284036101408112156148ca575f80fd5b610120808212156148d9575f80fd5b84935083013590506148ea816148a3565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156124a8576124a86148f5565b5f60208284031215614939575f80fd5b5051919050565b5f5b8381101561495a578181015183820152602001614942565b50505f910152565b602081525f8251806020840152614980816040850160208701614940565b601f01601f19169190910160400192915050565b5f826149ae57634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156149c3575f80fd5b813561200a816148a3565b5f808335601e198436030181126149e3575f80fd5b8301803591506001600160401b038211156149fc575f80fd5b6020019150600581901b3603821315611fb3575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614a3b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614a7b57614a7b614a45565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614aa957614aa9614a45565b604052919050565b5f6001600160401b03821115614ac957614ac9614a45565b50601f01601f191660200190565b5f60608236031215614ae7575f80fd5b614aef614a59565b823581526020614b0081850161471b565b8183015260408401356001600160401b03811115614b1c575f80fd5b840136601f820112614b2c575f80fd5b8035614b3f614b3a82614ab1565b614a81565b8181523684838501011115614b52575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614a3b818460208701614940565b808201808211156109c7576109c76148f5565b5f63ffffffff808316818103614baa57614baa6148f5565b6001019392505050565b80820281158282048414176109c7576109c76148f5565b6001600160401b038181168382160190808211156124a8576124a86148f5565b818103818111156109c7576109c76148f5565b600181811c90821680614c1257607f821691505b602082108103614c3057634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614c4881614bfe565b806020870152604060018084165f8114614c695760018114614c8557614cb2565b60ff19851660408a0152604084151560051b8a01019550614cb2565b895f5260205f205f5b85811015614ca95781548b8201860152908301908801614c8e565b8a016040019650505b509398975050505050505050565b805161463581614615565b5f8060408385031215614cdc575f80fd5b82516001600160401b0380821115614cf2575f80fd5b9084019060608287031215614d05575f80fd5b614d0d614a59565b82518152602080840151614d20816148a3565b82820152604084015183811115614d35575f80fd5b80850194505087601f850112614d49575f80fd5b83519250614d59614b3a84614ab1565b8381528882858701011115614d6c575f80fd5b614d7b84838301848801614940565b80604084015250819550614d90818801614cc0565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112614e85575f80fd5b8301803591506001600160401b03821115614e9e575f80fd5b602001915036819003821315611fb3575f80fd5b6001600160401b03818116838216028082169190828114614ed557614ed56148f5565b505092915050565b5f6001600160401b03808316818103614baa57614baa6148f5565b601f821115611afe57805f5260205f20601f840160051c81016020851015614f1d5750805b601f840160051c820191505b81811015610a66575f8155600101614f29565b81516001600160401b03811115614f5557614f55614a45565b614f6981614f638454614bfe565b84614ef8565b602080601f831160018114614f9c575f8415614f855750858301515b5f19600386901b1c1916600185901b178555614ff3565b5f85815260208120601f198616915b82811015614fca57888601518255948401946001909101908401614fab565b5085821015614fe757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561500b575f80fd5b61200a8261482d565b5f60208284031215615024575f80fd5b813560ff8116811461200a575f80fd5b5f60208284031215615044575f80fd5b815161200a81614615565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516150a481604e860160208901614940565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516152df3803806152df83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151928061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c806376f78621116100f3578063ba3a4b9711610093578063d5f20ff61161006e578063d5f20ff6146103bd578063df93d8de146103dd578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063ba3a4b971461038f578063bee0a03f146103a2578063c974d1b6146103b5575f80fd5b806398f3e2b4116100ce57806398f3e2b4146103305780639e1bc4ef14610343578063a3a65e4814610356578063b771b3bc14610369575f80fd5b806376f78621146103025780638280a25a1461031557806393e245981461031d575f80fd5b8063467ef06f1161015e57806361e2f4901161013957806361e2f490146102c257806362065856146102d557806366435abf146102e8578063732214f8146102fb575f80fd5b8063467ef06f1461027f5780635297fae61461029257806360305d62146102a5575f80fd5b80630118acc4146101a55780630322ed98146101ba5780630cdd0985146101cd578063151d30d11461021e5780632e2194d81461023857806335455ded14610263575b5f80fd5b6101b86101b336600461465a565b61040d565b005b6101b86101c8366004614695565b610837565b61020b6101db366004614695565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610226600a81565b60405160ff9091168152602001610215565b61024b610246366004614695565b6109a9565b6040516001600160401b039091168152602001610215565b61026c61271081565b60405161ffff9091168152602001610215565b6101b861028d3660046146ac565b6109bf565b6101b86102a03660046146c5565b610a60565b6102ad601481565b60405163ffffffff9091168152602001610215565b6101b86102d03660046146ed565b610bd5565b61020b6102e3366004614751565b611059565b61024b6102f6366004614695565b611072565b61020b5f81565b6101b861031036600461465a565b611086565b610226603081565b6101b861032b366004614695565b611278565b6101b861033e3660046146c5565b611333565b61020b61035136600461476a565b61160c565b6101b86103643660046146ac565b611638565b6103776005600160991b0181565b6040516001600160a01b039091168152602001610215565b6101b861039d366004614695565b6117c7565b6101b86103b0366004614695565b6119c5565b610226601481565b6103d06103cb366004614695565b611aef565b604051610215919061479e565b61024b6202a30081565b61020b6103f536600461485e565b611bb7565b6101b86104083660046148d7565b611bec565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260408082208151610100810190925280545f8051602061510683398151915293929190829060ff16600481111561046e5761046e61478a565b600481111561047f5761047f61478a565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61050382611aef565b905060028351600481111561051a5761051a61478a565b146105385760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105655760405163e6c4247b60e01b815260040160405180910390fd5b6003835280515f9060029060058111156105815761058161478a565b036105d8578615610599576105968387611ccb565b90505b5f846060015183608001516105ae9190614929565b90506105ba8482611e4f565b506001600160401b0390811660e0870152421660a08601525061060c565b505f82815260088501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b600385015460608501516001600160a01b039091169063778c06b59061063190611059565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d29190614949565b5f898152600687016020908152604080832093909355600588019052208451815486929190829060ff191660018360048111156107115761071161478a565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610825916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206151668339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff1660058111156108845761088461478a565b60058111156108955761089561478a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109045761090461478a565b146109225760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109478584606001515f611fa6565b6040518263ffffffff1660e01b81526004016109639190614982565b6020604051808303815f875af115801561097f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a39190614949565b50505050565b5f6109b964e8d4a51000836149b4565b92915050565b5f805160206151068339815191525f806109d884611ffd565b915091506109e5826122c7565b6109ef5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610a1e57610a1e61478a565b03610a43575f83815260078501602052604081208054919055610a418282612302565b505b610a5981610a548460400151611059565b612378565b5050505050565b5f805160206151068339815191525f610a788461239b565b90505f80610a89836040015161249b565b50915091505f610a9883611aef565b9050816001600160401b031681606001516001600160401b03161080610ae257505f8681526005860160205260409020600201546001600160401b03808416600160c01b90920416115b15610b0057604051633ab3447f60e11b815260040160405180910390fd5b60015f87815260058701602052604090205460ff166004811115610b2657610b2661478a565b14610b445760405163f95c7fe160e01b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151268339815191529060ff1615610c2757604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8e9190614949565b836020013514610cb15760405163d040949d60e01b815260040160405180910390fd5b30610cc260608501604086016149d3565b6001600160a01b031614610ce95760405163e6c4247b60e01b815260040160405180910390fd5b5f610cf760608501856149ee565b905090505f805b828163ffffffff161015610fa3575f610d1a60608801886149ee565b8363ffffffff16818110610d3057610d30614a33565b9050602002810190610d429190614a47565b610d4b90614af7565b80515f8181526008880160205260409020549192509015610d7f57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610dae92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610dc891614b8e565b602060405180830381855afa158015610de3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610e069190614949565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610e9257610e9261478a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610f45911686614b9f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610f9c90614bb2565b9050610cfe565b50600483018190555f610fb58561239b565b90505f610fc582604001516126df565b90505f610fd188612851565b905081600282604051610fe49190614b8e565b602060405180830381855afa158015610fff573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110229190614949565b1461104057604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6109b96001600160401b03831664e8d4a51000614bd4565b5f61107c82611aef565b6080015192915050565b5f805160206151068339815191525f61109e85612cea565b90506110a9856122c7565b6110b4575050505050565b5f8581526004830160205260409020546001600160a01b031633146110ec5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161111b91600160b01b90046001600160401b031690614beb565b6001600160401b03168160c001516001600160401b03161015611151576040516302336bad60e51b815260040160405180910390fd5b8315610a59575f6111628685611ccb565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906111b290611059565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611228573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c9190614949565b5f8781526007850160205260408120805490919061126b908490614b9f565b9091555050505050505050565b5f805160206151068339815191525f61129083611aef565b90506004815160058111156112a7576112a761478a565b146112c55760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146112fd5760405163e6c4247b60e01b815260040160405180910390fd5b5f838152600783016020908152604080832080549084905560048601909252909120546109a3906001600160a01b031682612302565b61133b612f27565b5f805160206151068339815191525f6113538461239b565b90505f80611364836040015161249b565b50915091505f61137383611aef565b5f8781526005870160205260408082208151610100810190925280549394509192909190829060ff1660048111156113ad576113ad61478a565b60048111156113be576113be61478a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260058f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610806114a55750826001600160401b03168160e001516001600160401b0316115b156114c357604051633ab3447f60e11b815260040160405180910390fd5b6003815160048111156114d8576114d861478a565b146114f65760405163f95c7fe160e01b815260040160405180910390fd5b5f878152600687016020908152604080832080549084905587845260048a019092528220549091906127109061153790600160a01b900461ffff1684614bd4565b61154191906149b4565b905080886007015f8881526020019081526020015f205f8282546115659190614b9f565b909155505f90506115768284614c0b565b9050611586846020015182612302565b61159b8460200151610a548660600151611059565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d503384866040516115e1929190918252602082015260400190565b60405180910390a450505050505050505061160860015f8051602061514683398151915255565b5050565b5f611615612f27565b611620833384612f71565b90506109b960015f8051602061514683398151915255565b5f805160206151268339815191525f6116508361239b565b90505f806116618360400151613264565b915091508061168357604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461169d90614c1e565b90505f036116be57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156116e4576116e461478a565b146117025760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061171a916145aa565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260408082208151610100810190925280545f8051602061510683398151915293929190829060ff1660048111156118285761182861478a565b60048111156118395761183961478a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156118c0576118c061478a565b141580156118e157506003815160048111156118de576118de61478a565b14155b156118ff5760405163f95c7fe160e01b815260040160405180910390fd5b5f61190d8260400151611aef565b905080606001516001600160401b03165f0361193c57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611969846040015184606001518560800151611fa6565b6040518263ffffffff1660e01b81526004016119859190614982565b6020604051808303815f875af11580156119a1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a599190614949565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206151268339815191529190611a0c90614c1e565b90505f03611a2d57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611a5357611a5361478a565b14611a715760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611aaa9190600401614c56565b6020604051808303815f875af1158015611ac6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aea9190614949565b505050565b611af76145e1565b5f8281525f80516020615166833981519152602052604090819020815160e0810190925280545f80516020615126833981519152929190829060ff166005811115611b4457611b4461478a565b6005811115611b5557611b5561478a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611bc0612f27565b611bcc85858585613405565b9050611be460015f8051602061514683398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611c35575080546001600160401b03808416911610155b15611c535760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611c7e84846135a3565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d16573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d3d9190810190614ceb565b9150915080611d5f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611da2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc69190614949565b825114611de65760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611e125760405163e6c4247b60e01b815260040160405180910390fd5b5f80611e2184604001516135bd565b91509150818714611e4557604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615166833981519152602052604081206002015481905f8051602061512683398151915290600160801b90046001600160401b0316611e978582613795565b5f611ea18761395e565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611ef18a858b611fa6565b6040518263ffffffff1660e01b8152600401611f0d9190614982565b6020604051808303815f875af1158015611f29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f4d9190614949565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6120066145e1565b5f805160206151268339815191525f61201e8561239b565b90505f8061202f8360400151613264565b91509150801561205257604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156120835761208361478a565b60058111156120945761209461478a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156121055761210561478a565b1415801561212657506001825160058111156121235761212361478a565b14155b156121445760405163a36c527f60e01b815260040160405180910390fd5b6003825160058111156121595761215961478a565b036121665750600461216a565b5060055b6020808301515f908152600888019091526040812055818160058111156121935761219361478a565b908160058111156121a6576121a661478a565b9052505f84815260078701602052604090208251815484929190829060ff191660018360058111156121da576121da61478a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561228e5761228e61478a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206150e683398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561235d575f80fd5b505af115801561236f573d5f803e3d5ffd5b50505050505050565b5f805160206150e683398151915254611608906001600160a01b031683836139ee565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156123ff573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124269190810190614ceb565b915091508061244857604051636b2f19e960e01b815260040160405180910390fd5b8151156124685760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156124945760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146124c85760405162461bcd60e51b81526004016124bf90614dbd565b60405180910390fd5b5f805b6002811015612517576124df816001614c0b565b6124ea906008614bd4565b61ffff1686828151811061250057612500614a33565b016020015160f81c901b91909117906001016124cb565b5061ffff81161561253a5760405162461bcd60e51b81526004016124bf90614e06565b5f805b600481101561259557612551816003614c0b565b61255c906008614bd4565b63ffffffff168761256e836002614b9f565b8151811061257e5761257e614a33565b016020015160f81c901b919091179060010161253d565b5063ffffffff81166004146125bc5760405162461bcd60e51b81526004016124bf90614e49565b5f805b6020811015612611576125d381601f614c0b565b6125de906008614bd4565b886125ea836006614b9f565b815181106125fa576125fa614a33565b016020015160f81c901b91909117906001016125bf565b505f805b600881101561267057612629816007614c0b565b612634906008614bd4565b6001600160401b031689612649836026614b9f565b8151811061265957612659614a33565b016020015160f81c901b9190911790600101612615565b505f805b60088110156126cf57612688816007614c0b565b612693906008614bd4565b6001600160401b03168a6126a883602e614b9f565b815181106126b8576126b8614a33565b016020015160f81c901b9190911790600101612674565b5091989097509095509350505050565b5f81516026146127015760405162461bcd60e51b81526004016124bf90614dbd565b5f805b600281101561275057612718816001614c0b565b612723906008614bd4565b61ffff1684828151811061273957612739614a33565b016020015160f81c901b9190911790600101612704565b5061ffff8116156127735760405162461bcd60e51b81526004016124bf90614e06565b5f805b60048110156127ce5761278a816003614c0b565b612795906008614bd4565b63ffffffff16856127a7836002614b9f565b815181106127b7576127b7614a33565b016020015160f81c901b9190911790600101612776565b5063ffffffff8116156127f35760405162461bcd60e51b81526004016124bf90614e49565b5f805b60208110156128485761280a81601f614c0b565b612815906008614bd4565b86612821836006614b9f565b8151811061283157612831614a33565b016020015160f81c901b91909117906001016127f6565b50949350505050565b60605f612860838301846149ee565b61286c91506058614bd4565b61287790605c614b9f565b6001600160401b0381111561288e5761288e614a65565b6040519080825280601f01601f1916602001820160405280156128b8576020820181803683370190505b5090505f5b602081101561290d57833581602081106128d9576128d9614a33565b1a60f81b8282815181106128ef576128ef614a33565b60200101906001600160f81b03191690815f1a9053506001016128bd565b505f5b602081101561296d578360200135816020811061292f5761292f614a33565b1a60f81b8261293f836020614b9f565b8151811061294f5761294f614a33565b60200101906001600160f81b03191690815f1a905350600101612910565b505f5b60048110156129d057612984816003614c0b565b61298f906008614bd4565b6014901c60f81b826129a2836040614b9f565b815181106129b2576129b2614a33565b60200101906001600160f81b03191690815f1a905350600101612970565b505f6129e260608501604086016149d3565b60601b90505f5b6014811015612a4257818160148110612a0457612a04614a33565b1a60f81b83612a14836044614b9f565b81518110612a2457612a24614a33565b60200101906001600160f81b03191690815f1a9053506001016129e9565b505f612a5160608601866149ee565b905090505f5b6004811015612abc57612a6b816003614c0b565b612a76906008614bd4565b63ffffffff8316901c60f81b84612a8e836058614b9f565b81518110612a9e57612a9e614a33565b60200101906001600160f81b03191690815f1a905350600101612a57565b505f5b612acc60608701876149ee565b9050811015612ce0575f612ae1826058614bd4565b612aec90605c614b9f565b90505f5b6020811015612b7757612b0660608901896149ee565b84818110612b1657612b16614a33565b9050602002810190612b289190614a47565b358160208110612b3a57612b3a614a33565b1a60f81b86612b498385614b9f565b81518110612b5957612b59614a33565b60200101906001600160f81b03191690815f1a905350600101612af0565b505f5b6008811015612c2c57612b8e816007614c0b565b612b99906008614bd4565b612ba660608a018a6149ee565b85818110612bb657612bb6614a33565b9050602002810190612bc89190614a47565b612bd9906040810190602001614751565b6001600160401b0316901c60f81b8682612bf4856020614b9f565b612bfe9190614b9f565b81518110612c0e57612c0e614a33565b60200101906001600160f81b03191690815f1a905350600101612b7a565b505f5b6030811015612cd657612c4560608901896149ee565b84818110612c5557612c55614a33565b9050602002810190612c679190614a47565b612c75906040810190614e90565b82818110612c8557612c85614a33565b9050013560f81c60f81b8682846028612c9e9190614b9f565b612ca89190614b9f565b81518110612cb857612cb8614a33565b60200101906001600160f81b03191690815f1a905350600101612c2f565b5050600101612abf565b5091949350505050565b612cf26145e1565b5f8281525f805160206151668339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff166005811115612d3f57612d3f61478a565b6005811115612d5057612d5061478a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612dc257612dc261478a565b14612de05760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612e2457612e2461478a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612ed08582611e4f565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615146833981519152805460011901612f5857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061514683398151915255565b5f5f8051602061510683398151915281612f8d61024685613a4d565b90505f612f9987611aef565b9050612fa4876122c7565b612fc157604051636ca57bcf60e01b815260040160405180910390fd5b600281516005811115612fd657612fd661478a565b14612ff45760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516130059190614beb565b905083600201600a9054906101000a90046001600160401b0316826040015161302e9190614ed2565b6001600160401b0316816001600160401b0316111561306057604051630c192e7760e41b815260040160405180910390fd5b5f8061306c8a84611e4f565b915091505f8a8360405160200161309a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260058b01909152902081518154829060ff191660018360048111156131355761313561478a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146132875760405162461bcd60e51b81526004016124bf90614dbd565b5f805b60028110156132d65761329e816001614c0b565b6132a9906008614bd4565b61ffff168582815181106132bf576132bf614a33565b016020015160f81c901b919091179060010161328a565b5061ffff8116156132f95760405162461bcd60e51b81526004016124bf90614e06565b5f805b600481101561335457613310816003614c0b565b61331b906008614bd4565b63ffffffff168661332d836002614b9f565b8151811061333d5761333d614a33565b016020015160f81c901b91909117906001016132fc565b5063ffffffff811660031461337b5760405162461bcd60e51b81526004016124bf90614e49565b5f805b60208110156133d05761339281601f614c0b565b61339d906008614bd4565b876133a9836006614b9f565b815181106133b9576133b9614a33565b016020015160f81c901b919091179060010161337e565b505f866026815181106133e5576133e5614a33565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061510683398151915290600160401b900461ffff9081169086161080613459575061271061ffff8616115b156134775760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156134a9576040516302336bad60e51b815260040160405180910390fd5b80548310806134bb5750806001015483115b156134d957604051630103be3b60e21b815260040160405180910390fd5b5f6134e384613a4d565b90505f6134ef826109a9565b90505f6134fc8983613a70565b905060405180606001604052806135103390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6135ab613e49565b6135b482613e94565b61160881613f05565b5f808251602e146135e05760405162461bcd60e51b81526004016124bf90614dbd565b5f805b600281101561362f576135f7816001614c0b565b613602906008614bd4565b61ffff1685828151811061361857613618614a33565b016020015160f81c901b91909117906001016135e3565b5061ffff8116156136525760405162461bcd60e51b81526004016124bf90614e06565b5f805b60048110156136ad57613669816003614c0b565b613674906008614bd4565b63ffffffff1686613686836002614b9f565b8151811061369657613696614a33565b016020015160f81c901b9190911790600101613655565b5063ffffffff81166005146136d45760405162461bcd60e51b81526004016124bf90614e49565b5f805b6020811015613729576136eb81601f614c0b565b6136f6906008614bd4565b87613702836006614b9f565b8151811061371257613712614a33565b016020015160f81c901b91909117906001016136d7565b505f805b600881101561378857613741816007614c0b565b61374c906008614bd4565b6001600160401b031688613761836026614b9f565b8151811061377157613771614a33565b016020015160f81c901b919091179060010161372d565b5090969095509350505050565b5f805160206151268339815191525f6001600160401b0380841690851611156137c9576137c28385614929565b90506137d6565b6137d38484614929565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613838575060018401548151613834916001600160401b031690614b9f565b8210155b1561385e576001600160401b03831660608201528181526040810151602082015261387d565b82816060018181516138709190614beb565b6001600160401b03169052505b606081015161388d906064614ed2565b602082015160018601546001600160401b0392909216916138b89190600160401b900460ff16614bd4565b10156138d75760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516138f29190614b9f565b9052506040810180516001600160401b0387169190613912908390614c0b565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206151668339815191526020526040812060020180545f8051602061512683398151915291600160401b9091046001600160401b03169060086139a883614efd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611aea91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f62565b5f6109b9825f805160206150e6833981519152546001600160a01b031690613fc3565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ab457604051637fab81e560e01b815260040160405180910390fd5b5f8051602061512683398151915242613ad36040860160208701614751565b6001600160401b0316111580613b0d5750613af16202a30042614b9f565b613b016040860160208701614751565b6001600160401b031610155b15613b2a5760405162d36c8560e81b815260040160405180910390fd5b6030613b396040860186614e90565b9050141580613b4757508335155b15613b655760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613b9557604051630eb0d31360e11b815260040160405180910390fd5b613b9f835f613795565b5f80613c386040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613be39190614751565b6001600160401b03168152602001613bfe60408a018a614e90565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614125565b5f82815260068601602052604090209193509150613c568282614f5c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613c83908590600401614982565b6020604051808303815f875af1158015613c9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cc39190614949565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613d3b57613d3b61478a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613e1b918e01908e01614751565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e9257604051631afcd79f60e31b815260040160405180910390fd5b565b613e9c613e49565b613ea581614229565b613ead614242565b613f0260608201356080830135613eca60c0850160a08601614751565b613eda60e0860160c0870161501b565b613eeb610100870160e08801615034565b613efd610120880161010089016149d3565b614252565b50565b613f0d613e49565b5f805160206150e68339815191526001600160a01b038216613f425760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613f766001600160a01b03841683614373565b905080515f14158015613f9a575080806020019051810190613f989190615054565b155b15611aea57604051635274afe760e01b81526001600160a01b03841660048201526024016124bf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614009573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061402d9190614949565b90506140446001600160a01b038516333086614380565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614088573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140ac9190614949565b90508181116141125760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016124bf565b61411c8282614c0b565b95945050505050565b5f606082608001515160301461418f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016124bf565b5f806001855f015186602001518760400151886080015189606001516040516020016141c1979695949392919061506f565b60405160208183030381529060405290506002816040516141e29190614b8e565b602060405180830381855afa1580156141fd573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142209190614949565b94909350915050565b614231613e49565b6142396143b9565b613f02816143c1565b61424a613e49565b613e92614493565b61425a613e49565b5f8051602061510683398151915261ffff8416158061427e575061271061ffff8516115b1561429c5760405163c98d73a760e01b815260040160405180910390fd5b858711156142bd57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806142d05750600a60ff8416115b156142ee576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611ff683835f61449b565b6040516001600160a01b0384811660248301528381166044830152606482018390526109a39186918216906323b872dd90608401613a1b565b613e92613e49565b6143c9613e49565b80355f8051602061512683398151915290815560146143ee6060840160408501615034565b60ff16118061440d57506144086060830160408401615034565b60ff16155b1561442b5760405163b4fa3fb360e01b815260040160405180910390fd5b61443b6060830160408401615034565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561446c6040830160208401614751565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612f5e613e49565b6060814710156144c05760405163cd78605960e01b81523060048201526024016124bf565b5f80856001600160a01b031684866040516144db9190614b8e565b5f6040518083038185875af1925050503d805f8114614515576040519150601f19603f3d011682016040523d82523d5f602084013e61451a565b606091505b5091509150611e4586838360608261453a5761453582614581565b611ff6565b815115801561455157506001600160a01b0384163b155b1561457a57604051639996b31560e01b81526001600160a01b03851660048201526024016124bf565b5080611ff6565b8051156145915780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546145b690614c1e565b5f825580601f106145c5575050565b601f0160209004905f5260205f2090810190613f02919061461d565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614631575f815560010161461e565b5090565b8015158114613f02575f80fd5b803563ffffffff81168114614655575f80fd5b919050565b5f805f6060848603121561466c575f80fd5b83359250602084013561467e81614635565b915061468c60408501614642565b90509250925092565b5f602082840312156146a5575f80fd5b5035919050565b5f602082840312156146bc575f80fd5b611ff682614642565b5f80604083850312156146d6575f80fd5b6146df83614642565b946020939093013593505050565b5f80604083850312156146fe575f80fd5b82356001600160401b03811115614713575f80fd5b830160808186031215614724575f80fd5b915061473260208401614642565b90509250929050565b80356001600160401b0381168114614655575f80fd5b5f60208284031215614761575f80fd5b611ff68261473b565b5f806040838503121561477b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106147c157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516147fc60608401826001600160401b03169052565b50608083015161481760808401826001600160401b03169052565b5060a083015161483260a08401826001600160401b03169052565b5060c083015161249460c08401826001600160401b03169052565b803561ffff81168114614655575f80fd5b5f805f8060808587031215614871575f80fd5b84356001600160401b03811115614886575f80fd5b850160608188031215614897575f80fd5b93506148a56020860161484d565b92506148b36040860161473b565b9396929550929360600135925050565b6001600160a01b0381168114613f02575f80fd5b5f808284036101408112156148ea575f80fd5b610120808212156148f9575f80fd5b849350830135905061490a816148c3565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561249457612494614915565b5f60208284031215614959575f80fd5b5051919050565b5f5b8381101561497a578181015183820152602001614962565b50505f910152565b602081525f82518060208401526149a0816040850160208701614960565b601f01601f19169190910160400192915050565b5f826149ce57634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156149e3575f80fd5b8135611ff6816148c3565b5f808335601e19843603018112614a03575f80fd5b8301803591506001600160401b03821115614a1c575f80fd5b6020019150600581901b3603821315611f9f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614a5b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614a9b57614a9b614a65565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614ac957614ac9614a65565b604052919050565b5f6001600160401b03821115614ae957614ae9614a65565b50601f01601f191660200190565b5f60608236031215614b07575f80fd5b614b0f614a79565b823581526020614b2081850161473b565b8183015260408401356001600160401b03811115614b3c575f80fd5b840136601f820112614b4c575f80fd5b8035614b5f614b5a82614ad1565b614aa1565b8181523684838501011115614b72575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614a5b818460208701614960565b808201808211156109b9576109b9614915565b5f63ffffffff808316818103614bca57614bca614915565b6001019392505050565b80820281158282048414176109b9576109b9614915565b6001600160401b0381811683821601908082111561249457612494614915565b818103818111156109b9576109b9614915565b600181811c90821680614c3257607f821691505b602082108103614c5057634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614c6881614c1e565b806020870152604060018084165f8114614c895760018114614ca557614cd2565b60ff19851660408a0152604084151560051b8a01019550614cd2565b895f5260205f205f5b85811015614cc95781548b8201860152908301908801614cae565b8a016040019650505b509398975050505050505050565b805161465581614635565b5f8060408385031215614cfc575f80fd5b82516001600160401b0380821115614d12575f80fd5b9084019060608287031215614d25575f80fd5b614d2d614a79565b82518152602080840151614d40816148c3565b82820152604084015183811115614d55575f80fd5b80850194505087601f850112614d69575f80fd5b83519250614d79614b5a84614ad1565b8381528882858701011115614d8c575f80fd5b614d9b84838301848801614960565b80604084015250819550614db0818801614ce0565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112614ea5575f80fd5b8301803591506001600160401b03821115614ebe575f80fd5b602001915036819003821315611f9f575f80fd5b6001600160401b03818116838216028082169190828114614ef557614ef5614915565b505092915050565b5f6001600160401b03808316818103614bca57614bca614915565b601f821115611aea57805f5260205f20601f840160051c81016020851015614f3d5750805b601f840160051c820191505b81811015610a59575f8155600101614f49565b81516001600160401b03811115614f7557614f75614a65565b614f8981614f838454614c1e565b84614f18565b602080601f831160018114614fbc575f8415614fa55750858301515b5f19600386901b1c1916600185901b178555615013565b5f85815260208120601f198616915b82811015614fea57888601518255948401946001909101908401614fcb565b508582101561500757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561502b575f80fd5b611ff68261484d565b5f60208284031215615044575f80fd5b813560ff81168114611ff6575f80fd5b5f60208284031215615064575f80fd5b8151611ff681614635565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516150c481604e860160208901614960565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 1ca8db7f4..47502195f 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614fd0380380614fd083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614e838061014d5f395ff3fe6080604052600436106101af575f3560e01c806366435abf116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104f8578063c974d1b61461050b578063d5f20ff61461051f578063df93d8de1461054b575f80fd5b8063b771b3bc146104a0578063ba3a4b97146104ba578063bee0a03f146104d9575f80fd5b80638280a25a116100c25780638280a25a1461042f57806393e245981461044357806398f3e2b414610462578063a3a65e4814610481575f80fd5b806366435abf146103de578063732214f8146103fd57806376f7862114610410575f80fd5b806335455ded116101525780635297fae61161012d5780635297fae61461035857806360305d621461037757806361e2f490146103a057806362065856146103bf575f80fd5b806335455ded146102fe57806340034a9314610326578063467ef06f14610339575f80fd5b8063151d30d11161018d578063151d30d11461025057806320e55565146102765780632e2194d814610295578063329c3e12146102cc575f80fd5b80630118acc4146101b35780630322ed98146101d45780630cdd0985146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd3660046143e8565b610561565b005b3480156101df575f80fd5b506101d26101ee366004614423565b610999565b3480156101fe575f80fd5b5061023d61020d366004614423565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b34801561025b575f80fd5b50610264600a81565b60405160ff9091168152602001610247565b348015610281575f80fd5b506101d261029036600461443a565b610b0b565b3480156102a0575f80fd5b506102b46102af366004614423565b610be8565b6040516001600160401b039091168152602001610247565b3480156102d7575f80fd5b506102e66001600160991b0181565b6040516001600160a01b039091168152602001610247565b348015610309575f80fd5b5061031361271081565b60405161ffff9091168152602001610247565b61023d610334366004614478565b610bfe565b348015610344575f80fd5b506101d26103533660046144cc565b610c32565b348015610363575f80fd5b506101d26103723660046144e5565b610cd2565b348015610382575f80fd5b5061038b601481565b60405163ffffffff9091168152602001610247565b3480156103ab575f80fd5b506101d26103ba36600461450d565b610e47565b3480156103ca575f80fd5b5061023d6103d936600461455b565b6112cb565b3480156103e9575f80fd5b506102b46103f8366004614423565b6112e4565b348015610408575f80fd5b5061023d5f81565b34801561041b575f80fd5b506101d261042a3660046143e8565b6112f8565b34801561043a575f80fd5b50610264603081565b34801561044e575f80fd5b506101d261045d366004614423565b6114f1565b34801561046d575f80fd5b506101d261047c3660046144e5565b6115ac565b34801561048c575f80fd5b506101d261049b3660046144cc565b611885565b3480156104ab575f80fd5b506102e66005600160991b0181565b3480156104c5575f80fd5b506101d26104d4366004614423565b611a14565b3480156104e4575f80fd5b506101d26104f3366004614423565b611c12565b61023d610506366004614423565b611d3c565b348015610516575f80fd5b50610264601481565b34801561052a575f80fd5b5061053e610539366004614423565b611d6d565b6040516102479190614588565b348015610556575f80fd5b506102b46202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614df783398151915293929190829060ff1660048111156105c2576105c2614574565b60048111156105d3576105d3614574565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61065782611d6d565b905060028351600481111561066e5761066e614574565b1461068c5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106b95760405163e6c4247b60e01b815260040160405180910390fd5b6003835280515f9060029060058111156106d5576106d5614574565b0361072c5786156106ed576106ea8387611e35565b90505b5f84606001518360800151610702919061464b565b905061070e8482611fb9565b506001600160401b0390811660e0870152421660a086015250610760565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561079386606001516112cb565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610810573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610834919061466b565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561087357610873614574565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610987916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614e578339815191526020526040808220815160e0810190925280545f80516020614e1783398151915293929190829060ff1660058111156109e6576109e6614574565b60058111156109f7576109f7614574565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a6657610a66614574565b14610a845760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610aa98584606001515f612110565b6040518263ffffffff1660e01b8152600401610ac591906146a4565b6020604051808303815f875af1158015610ae1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b05919061466b565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b54575080546001600160401b03808416911610155b15610b725760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b9c8361215f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610bf864e8d4a51000836146d6565b92915050565b5f610c07612173565b610c13848484346121aa565b9050610c2b60015f80516020614e3783398151915255565b9392505050565b5f80516020614df78339815191525f80610c4b84612345565b91509150610c588261260f565b610c625750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610c9057610c90614574565b03610cb5575f83815260088501602052604081208054919055610cb3828261264a565b505b610ccb81610cc684604001516112cb565b6126b0565b5050505050565b5f80516020614df78339815191525f610cea846126c3565b90505f80610cfb83604001516127c3565b50915091505f610d0a83611d6d565b9050816001600160401b031681606001516001600160401b03161080610d5457505f8681526006860160205260409020600201546001600160401b03808416600160c01b90920416115b15610d7257604051633ab3447f60e11b815260040160405180910390fd5b60015f87815260068701602052604090205460ff166004811115610d9857610d98614574565b14610db65760405163f95c7fe160e01b815260040160405180910390fd5b5f868152600686016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614e178339815191529060ff1615610e9957604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610edc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f00919061466b565b836020013514610f235760405163d040949d60e01b815260040160405180910390fd5b30610f346060850160408601614709565b6001600160a01b031614610f5b5760405163e6c4247b60e01b815260040160405180910390fd5b5f610f696060850185614724565b905090505f805b828163ffffffff161015611215575f610f8c6060880188614724565b8363ffffffff16818110610fa257610fa2614769565b9050602002810190610fb4919061477d565b610fbd9061482d565b80515f8181526008880160205260409020549192509015610ff157604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161102092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261103a916148c4565b602060405180830381855afa158015611055573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611078919061466b565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561110457611104614574565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111b79116866148d5565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061120e906148e8565b9050610f70565b50600483018190555f611227856126c3565b90505f6112378260400151612a07565b90505f61124388612b79565b90508160028260405161125691906148c4565b602060405180830381855afa158015611271573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611294919061466b565b146112b257604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610bf86001600160401b03831664e8d4a5100061490a565b5f6112ee82611d6d565b6080015192915050565b5f80516020614df78339815191525f61131085613012565b905061131b8561260f565b611326575050505050565b5f8581526005830160205260409020546001600160a01b0316331461135e5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260058301602052604090205460a082015161138d91600160b01b90046001600160401b031690614921565b6001600160401b03168160c001516001600160401b031610156113c3576040516302336bad60e51b815260040160405180910390fd5b8315610ccb575f6113d48685611e35565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061142b906112cb565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156114a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c5919061466b565b5f878152600885016020526040812080549091906114e49084906148d5565b9091555050505050505050565b5f80516020614df78339815191525f61150983611d6d565b905060048151600581111561152057611520614574565b1461153e5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526005830160205260409020546001600160a01b031633146115765760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260088301602090815260408083208054908490556005860190925290912054610b05906001600160a01b03168261264a565b6115b4612173565b5f80516020614df78339815191525f6115cc846126c3565b90505f806115dd83604001516127c3565b50915091505f6115ec83611d6d565b5f8781526006870160205260408082208151610100810190925280549394509192909190829060ff16600481111561162657611626614574565b600481111561163757611637614574565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260068f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff19169055908401519192508481169116108061171e5750826001600160401b03168160e001516001600160401b0316115b1561173c57604051633ab3447f60e11b815260040160405180910390fd5b60038151600481111561175157611751614574565b1461176f5760405163f95c7fe160e01b815260040160405180910390fd5b5f878152600787016020908152604080832080549084905587845260058a01909252822054909190612710906117b090600160a01b900461ffff168461490a565b6117ba91906146d6565b905080886008015f8881526020019081526020015f205f8282546117de91906148d5565b909155505f90506117ef8284614941565b90506117ff84602001518261264a565b6118148460200151610cc686606001516112cb565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d5033848660405161185a929190918252602082015260400190565b60405180910390a450505050505050505061188160015f80516020614e3783398151915255565b5050565b5f80516020614e178339815191525f61189d836126c3565b90505f806118ae836040015161324f565b91509150806118d057604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546118ea90614954565b90505f0361190b57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561193157611931614574565b1461194f5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206119679161433d565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0660205260408082208151610100810190925280545f80516020614df783398151915293929190829060ff166004811115611a7557611a75614574565b6004811115611a8657611a86614574565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611b0d57611b0d614574565b14158015611b2e5750600381516004811115611b2b57611b2b614574565b14155b15611b4c5760405163f95c7fe160e01b815260040160405180910390fd5b5f611b5a8260400151611d6d565b905080606001516001600160401b03165f03611b8957604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611bb6846040015184606001518560800151612110565b6040518263ffffffff1660e01b8152600401611bd291906146a4565b6020604051808303815f875af1158015611bee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ccb919061466b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614e178339815191529190611c5990614954565b90505f03611c7a57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611ca057611ca0614574565b14611cbe5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611cf79190600401614986565b6020604051808303815f875af1158015611d13573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d37919061466b565b505050565b5f611d45612173565b611d508233346133f0565b9050611d6860015f80516020614e3783398151915255565b919050565b611d75614374565b5f8281525f80516020614e57833981519152602052604090819020815160e0810190925280545f80516020614e17833981519152929190829060ff166005811115611dc257611dc2614574565b6005811115611dd357611dd3614574565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e80573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ea79190810190614a1b565b9150915080611ec957604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f0c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f30919061466b565b825114611f505760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611f7c5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611f8b84604001516136d9565b91509150818714611faf57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e57833981519152602052604081206002015481905f80516020614e1783398151915290600160801b90046001600160401b031661200185826138b1565b5f61200b87613a7a565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61205b8a858b612110565b6040518263ffffffff1660e01b815260040161207791906146a4565b6020604051808303815f875af1158015612093573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120b7919061466b565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612167613b0a565b61217081613b55565b50565b5f80516020614e378339815191528054600119016121a457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f80516020614df78339815191529061ffff861610806121f3575061271061ffff8616115b156122115760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612243576040516302336bad60e51b815260040160405180910390fd5b80548310806122555750806001015483115b1561227357604051630103be3b60e21b815260040160405180910390fd5b825f61227e82610be8565b90505f61228b8983613bc7565b9050604051806060016040528061229f3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e3783398151915255565b5f61234e614374565b5f80516020614e178339815191525f612366856126c3565b90505f80612377836040015161324f565b91509150801561239a57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156123cb576123cb614574565b60058111156123dc576123dc614574565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561244d5761244d614574565b1415801561246e575060018251600581111561246b5761246b614574565b14155b1561248c5760405163a36c527f60e01b815260040160405180910390fd5b6003825160058111156124a1576124a1614574565b036124ae575060046124b2565b5060055b6020808301515f908152600888019091526040812055818160058111156124db576124db614574565b908160058111156124ee576124ee614574565b9052505f84815260078701602052604090208251815484929190829060ff1916600183600581111561252257612522614574565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156125d6576125d6614574565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612696575f80fd5b505af11580156126a8573d5f803e3d5ffd5b505050505050565b6118816001600160a01b03831682613fa0565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612727573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261274e9190810190614a1b565b915091508061277057604051636b2f19e960e01b815260040160405180910390fd5b8151156127905760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156127bc5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146127f05760405162461bcd60e51b81526004016127e790614aed565b60405180910390fd5b5f805b600281101561283f57612807816001614941565b61281290600861490a565b61ffff1686828151811061282857612828614769565b016020015160f81c901b91909117906001016127f3565b5061ffff8116156128625760405162461bcd60e51b81526004016127e790614b36565b5f805b60048110156128bd57612879816003614941565b61288490600861490a565b63ffffffff16876128968360026148d5565b815181106128a6576128a6614769565b016020015160f81c901b9190911790600101612865565b5063ffffffff81166004146128e45760405162461bcd60e51b81526004016127e790614b79565b5f805b6020811015612939576128fb81601f614941565b61290690600861490a565b886129128360066148d5565b8151811061292257612922614769565b016020015160f81c901b91909117906001016128e7565b505f805b600881101561299857612951816007614941565b61295c90600861490a565b6001600160401b0316896129718360266148d5565b8151811061298157612981614769565b016020015160f81c901b919091179060010161293d565b505f805b60088110156129f7576129b0816007614941565b6129bb90600861490a565b6001600160401b03168a6129d083602e6148d5565b815181106129e0576129e0614769565b016020015160f81c901b919091179060010161299c565b5091989097509095509350505050565b5f8151602614612a295760405162461bcd60e51b81526004016127e790614aed565b5f805b6002811015612a7857612a40816001614941565b612a4b90600861490a565b61ffff16848281518110612a6157612a61614769565b016020015160f81c901b9190911790600101612a2c565b5061ffff811615612a9b5760405162461bcd60e51b81526004016127e790614b36565b5f805b6004811015612af657612ab2816003614941565b612abd90600861490a565b63ffffffff1685612acf8360026148d5565b81518110612adf57612adf614769565b016020015160f81c901b9190911790600101612a9e565b5063ffffffff811615612b1b5760405162461bcd60e51b81526004016127e790614b79565b5f805b6020811015612b7057612b3281601f614941565b612b3d90600861490a565b86612b498360066148d5565b81518110612b5957612b59614769565b016020015160f81c901b9190911790600101612b1e565b50949350505050565b60605f612b8883830184614724565b612b949150605861490a565b612b9f90605c6148d5565b6001600160401b03811115612bb657612bb661479b565b6040519080825280601f01601f191660200182016040528015612be0576020820181803683370190505b5090505f5b6020811015612c355783358160208110612c0157612c01614769565b1a60f81b828281518110612c1757612c17614769565b60200101906001600160f81b03191690815f1a905350600101612be5565b505f5b6020811015612c955783602001358160208110612c5757612c57614769565b1a60f81b82612c678360206148d5565b81518110612c7757612c77614769565b60200101906001600160f81b03191690815f1a905350600101612c38565b505f5b6004811015612cf857612cac816003614941565b612cb790600861490a565b6014901c60f81b82612cca8360406148d5565b81518110612cda57612cda614769565b60200101906001600160f81b03191690815f1a905350600101612c98565b505f612d0a6060850160408601614709565b60601b90505f5b6014811015612d6a57818160148110612d2c57612d2c614769565b1a60f81b83612d3c8360446148d5565b81518110612d4c57612d4c614769565b60200101906001600160f81b03191690815f1a905350600101612d11565b505f612d796060860186614724565b905090505f5b6004811015612de457612d93816003614941565b612d9e90600861490a565b63ffffffff8316901c60f81b84612db68360586148d5565b81518110612dc657612dc6614769565b60200101906001600160f81b03191690815f1a905350600101612d7f565b505f5b612df46060870187614724565b9050811015613008575f612e0982605861490a565b612e1490605c6148d5565b90505f5b6020811015612e9f57612e2e6060890189614724565b84818110612e3e57612e3e614769565b9050602002810190612e50919061477d565b358160208110612e6257612e62614769565b1a60f81b86612e7183856148d5565b81518110612e8157612e81614769565b60200101906001600160f81b03191690815f1a905350600101612e18565b505f5b6008811015612f5457612eb6816007614941565b612ec190600861490a565b612ece60608a018a614724565b85818110612ede57612ede614769565b9050602002810190612ef0919061477d565b612f0190604081019060200161455b565b6001600160401b0316901c60f81b8682612f1c8560206148d5565b612f2691906148d5565b81518110612f3657612f36614769565b60200101906001600160f81b03191690815f1a905350600101612ea2565b505f5b6030811015612ffe57612f6d6060890189614724565b84818110612f7d57612f7d614769565b9050602002810190612f8f919061477d565b612f9d906040810190614bc0565b82818110612fad57612fad614769565b9050013560f81c60f81b8682846028612fc691906148d5565b612fd091906148d5565b81518110612fe057612fe0614769565b60200101906001600160f81b03191690815f1a905350600101612f57565b5050600101612de7565b5091949350505050565b61301a614374565b5f8281525f80516020614e578339815191526020526040808220815160e0810190925280545f80516020614e1783398151915293929190829060ff16600581111561306757613067614574565b600581111561307857613078614574565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156130ea576130ea614574565b146131085760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561314c5761314c614574565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131f88582611fb9565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146132725760405162461bcd60e51b81526004016127e790614aed565b5f805b60028110156132c157613289816001614941565b61329490600861490a565b61ffff168582815181106132aa576132aa614769565b016020015160f81c901b9190911790600101613275565b5061ffff8116156132e45760405162461bcd60e51b81526004016127e790614b36565b5f805b600481101561333f576132fb816003614941565b61330690600861490a565b63ffffffff16866133188360026148d5565b8151811061332857613328614769565b016020015160f81c901b91909117906001016132e7565b5063ffffffff81166003146133665760405162461bcd60e51b81526004016127e790614b79565b5f805b60208110156133bb5761337d81601f614941565b61338890600861490a565b876133948360066148d5565b815181106133a4576133a4614769565b016020015160f81c901b9190911790600101613369565b505f866026815181106133d0576133d0614769565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614df78339815191528161340984610be8565b90505f61341587611d6d565b90506134208761260f565b61343d57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561345257613452614574565b146134705760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516134819190614921565b600485015460408401519192506134a3916001600160401b0390911690614c02565b6001600160401b0316816001600160401b031611156134d557604051630c192e7760e41b815260040160405180910390fd5b5f806134e18a84611fb9565b915091505f8a8360405160200161350f92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156135aa576135aa614574565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146136fc5760405162461bcd60e51b81526004016127e790614aed565b5f805b600281101561374b57613713816001614941565b61371e90600861490a565b61ffff1685828151811061373457613734614769565b016020015160f81c901b91909117906001016136ff565b5061ffff81161561376e5760405162461bcd60e51b81526004016127e790614b36565b5f805b60048110156137c957613785816003614941565b61379090600861490a565b63ffffffff16866137a28360026148d5565b815181106137b2576137b2614769565b016020015160f81c901b9190911790600101613771565b5063ffffffff81166005146137f05760405162461bcd60e51b81526004016127e790614b79565b5f805b60208110156138455761380781601f614941565b61381290600861490a565b8761381e8360066148d5565b8151811061382e5761382e614769565b016020015160f81c901b91909117906001016137f3565b505f805b60088110156138a45761385d816007614941565b61386890600861490a565b6001600160401b03168861387d8360266148d5565b8151811061388d5761388d614769565b016020015160f81c901b9190911790600101613849565b5090969095509350505050565b5f80516020614e178339815191525f6001600160401b0380841690851611156138e5576138de838561464b565b90506138f2565b6138ef848461464b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613954575060018401548151613950916001600160401b0316906148d5565b8210155b1561397a576001600160401b038316606082015281815260408101516020820152613999565b828160600181815161398c9190614921565b6001600160401b03169052505b60608101516139a9906064614c02565b602082015160018601546001600160401b0392909216916139d49190600160401b900460ff1661490a565b10156139f35760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613a0e91906148d5565b9052506040810180516001600160401b0387169190613a2e908390614941565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e578339815191526020526040812060020180545f80516020614e1783398151915291600160401b9091046001600160401b0316906008613ac483614c2d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613b5357604051631afcd79f60e31b815260040160405180910390fd5b565b613b5d613b0a565b613b6681614033565b613b6e61404c565b61217060608201356080830135613b8b60c0850160a0860161455b565b613b9b60e0860160c08701614c48565b61ffff16613bb0610100870160e08801614c61565b613bc261012088016101008901614709565b61405c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613c0b57604051637fab81e560e01b815260040160405180910390fd5b5f80516020614e1783398151915242613c2a604086016020870161455b565b6001600160401b0316111580613c645750613c486202a300426148d5565b613c58604086016020870161455b565b6001600160401b031610155b15613c815760405162d36c8560e81b815260040160405180910390fd5b6030613c906040860186614bc0565b9050141580613c9e57508335155b15613cbc5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613cec57604051630eb0d31360e11b815260040160405180910390fd5b613cf6835f6138b1565b5f80613d8f6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613d3a919061455b565b6001600160401b03168152602001613d5560408a018a614bc0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614157565b5f82815260068601602052604090209193509150613dad8282614cc5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613dda9085906004016146a4565b6020604051808303815f875af1158015613df6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e1a919061466b565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e9257613e92614574565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f72918e01908e0161455b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613fc35760405163cd78605960e01b81523060048201526024016127e7565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461400c576040519150601f19603f3d011682016040523d82523d5f602084013e614011565b606091505b5050905080611d3757604051630a12f52160e11b815260040160405180910390fd5b61403b613b0a565b61404361425b565b61217081614263565b614054613b0a565b613b53614335565b614064613b0a565b5f80516020614df7833981519152831580614080575061271084115b1561409e5760405163c98d73a760e01b815260040160405180910390fd5b858711156140bf57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806140d25750600a60ff8416115b156140f0576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146141c15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016127e7565b5f806001855f015186602001518760400151886080015189606001516040516020016141f39796959493929190614d80565b604051602081830303815290604052905060028160405161421491906148c4565b602060405180830381855afa15801561422f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614252919061466b565b94909350915050565b613b53613b0a565b61426b613b0a565b80355f80516020614e1783398151915290815560146142906060840160408501614c61565b60ff1611806142af57506142aa6060830160408401614c61565b60ff16155b156142cd5760405163b4fa3fb360e01b815260040160405180910390fd5b6142dd6060830160408401614c61565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561430e604083016020840161455b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612332613b0a565b50805461434990614954565b5f825580601f10614358575050565b601f0160209004905f5260205f209081019061217091906143b0565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156143c4575f81556001016143b1565b5090565b8015158114612170575f80fd5b803563ffffffff81168114611d68575f80fd5b5f805f606084860312156143fa575f80fd5b83359250602084013561440c816143c8565b915061441a604085016143d5565b90509250925092565b5f60208284031215614433575f80fd5b5035919050565b5f610120828403121561444b575f80fd5b50919050565b803561ffff81168114611d68575f80fd5b80356001600160401b0381168114611d68575f80fd5b5f805f6060848603121561448a575f80fd5b83356001600160401b0381111561449f575f80fd5b8401606081870312156144b0575f80fd5b92506144be60208501614451565b915061441a60408501614462565b5f602082840312156144dc575f80fd5b610c2b826143d5565b5f80604083850312156144f6575f80fd5b6144ff836143d5565b946020939093013593505050565b5f806040838503121561451e575f80fd5b82356001600160401b03811115614533575f80fd5b830160808186031215614544575f80fd5b9150614552602084016143d5565b90509250929050565b5f6020828403121561456b575f80fd5b610c2b82614462565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106145ab57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516145e660608401826001600160401b03169052565b50608083015161460160808401826001600160401b03169052565b5060a083015161461c60a08401826001600160401b03169052565b5060c08301516127bc60c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156127bc576127bc614637565b5f6020828403121561467b575f80fd5b5051919050565b5f5b8381101561469c578181015183820152602001614684565b50505f910152565b602081525f82518060208401526146c2816040850160208701614682565b601f01601f19169190910160400192915050565b5f826146f057634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114612170575f80fd5b5f60208284031215614719575f80fd5b8135610c2b816146f5565b5f808335601e19843603018112614739575f80fd5b8301803591506001600160401b03821115614752575f80fd5b6020019150600581901b3603821315612109575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614791575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156147d1576147d161479b565b60405290565b604051601f8201601f191681016001600160401b03811182821017156147ff576147ff61479b565b604052919050565b5f6001600160401b0382111561481f5761481f61479b565b50601f01601f191660200190565b5f6060823603121561483d575f80fd5b6148456147af565b823581526020614856818501614462565b8183015260408401356001600160401b03811115614872575f80fd5b840136601f820112614882575f80fd5b803561489561489082614807565b6147d7565b81815236848385010111156148a8575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614791818460208701614682565b80820180821115610bf857610bf8614637565b5f63ffffffff80831681810361490057614900614637565b6001019392505050565b8082028115828204841417610bf857610bf8614637565b6001600160401b038181168382160190808211156127bc576127bc614637565b81810381811115610bf857610bf8614637565b600181811c9082168061496857607f821691505b60208210810361444b57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f845461499881614954565b806020870152604060018084165f81146149b957600181146149d557614a02565b60ff19851660408a0152604084151560051b8a01019550614a02565b895f5260205f205f5b858110156149f95781548b82018601529083019088016149de565b8a016040019650505b509398975050505050505050565b8051611d68816143c8565b5f8060408385031215614a2c575f80fd5b82516001600160401b0380821115614a42575f80fd5b9084019060608287031215614a55575f80fd5b614a5d6147af565b82518152602080840151614a70816146f5565b82820152604084015183811115614a85575f80fd5b80850194505087601f850112614a99575f80fd5b83519250614aa961489084614807565b8381528882858701011115614abc575f80fd5b614acb84838301848801614682565b80604084015250819550614ae0818801614a10565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112614bd5575f80fd5b8301803591506001600160401b03821115614bee575f80fd5b602001915036819003821315612109575f80fd5b6001600160401b03818116838216028082169190828114614c2557614c25614637565b505092915050565b5f6001600160401b0380831681810361490057614900614637565b5f60208284031215614c58575f80fd5b610c2b82614451565b5f60208284031215614c71575f80fd5b813560ff81168114610c2b575f80fd5b601f821115611d3757805f5260205f20601f840160051c81016020851015614ca65750805b601f840160051c820191505b81811015610ccb575f8155600101614cb2565b81516001600160401b03811115614cde57614cde61479b565b614cf281614cec8454614954565b84614c81565b602080601f831160018114614d25575f8415614d0e5750858301515b5f19600386901b1c1916600185901b1785556126a8565b5f85815260208120601f198616915b82811015614d5357888601518255948401946001909101908401614d34565b5085821015614d7057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614dd581604e860160208901614682565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614ff0380380614ff083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614ea38061014d5f395ff3fe6080604052600436106101af575f3560e01c806366435abf116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104f8578063c974d1b61461050b578063d5f20ff61461051f578063df93d8de1461054b575f80fd5b8063b771b3bc146104a0578063ba3a4b97146104ba578063bee0a03f146104d9575f80fd5b80638280a25a116100c25780638280a25a1461042f57806393e245981461044357806398f3e2b414610462578063a3a65e4814610481575f80fd5b806366435abf146103de578063732214f8146103fd57806376f7862114610410575f80fd5b806335455ded116101525780635297fae61161012d5780635297fae61461035857806360305d621461037757806361e2f490146103a057806362065856146103bf575f80fd5b806335455ded146102fe57806340034a9314610326578063467ef06f14610339575f80fd5b8063151d30d11161018d578063151d30d11461025057806320e55565146102765780632e2194d814610295578063329c3e12146102cc575f80fd5b80630118acc4146101b35780630322ed98146101d45780630cdd0985146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004614408565b610561565b005b3480156101df575f80fd5b506101d26101ee366004614443565b61098b565b3480156101fe575f80fd5b5061023d61020d366004614443565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b34801561025b575f80fd5b50610264600a81565b60405160ff9091168152602001610247565b348015610281575f80fd5b506101d261029036600461445a565b610afd565b3480156102a0575f80fd5b506102b46102af366004614443565b610bda565b6040516001600160401b039091168152602001610247565b3480156102d7575f80fd5b506102e66001600160991b0181565b6040516001600160a01b039091168152602001610247565b348015610309575f80fd5b5061031361271081565b60405161ffff9091168152602001610247565b61023d610334366004614498565b610bf0565b348015610344575f80fd5b506101d26103533660046144ec565b610c24565b348015610363575f80fd5b506101d2610372366004614505565b610cc5565b348015610382575f80fd5b5061038b601481565b60405163ffffffff9091168152602001610247565b3480156103ab575f80fd5b506101d26103ba36600461452d565b610e3a565b3480156103ca575f80fd5b5061023d6103d936600461457b565b6112be565b3480156103e9575f80fd5b506102b46103f8366004614443565b6112d7565b348015610408575f80fd5b5061023d5f81565b34801561041b575f80fd5b506101d261042a366004614408565b6112eb565b34801561043a575f80fd5b50610264603081565b34801561044e575f80fd5b506101d261045d366004614443565b6114dd565b34801561046d575f80fd5b506101d261047c366004614505565b611598565b34801561048c575f80fd5b506101d261049b3660046144ec565b611871565b3480156104ab575f80fd5b506102e66005600160991b0181565b3480156104c5575f80fd5b506101d26104d4366004614443565b611a00565b3480156104e4575f80fd5b506101d26104f3366004614443565b611bfe565b61023d610506366004614443565b611d28565b348015610516575f80fd5b50610264601481565b34801561052a575f80fd5b5061053e610539366004614443565b611d59565b60405161024791906145a8565b348015610556575f80fd5b506102b46202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260408082208151610100810190925280545f80516020614e1783398151915293929190829060ff1660048111156105c2576105c2614594565b60048111156105d3576105d3614594565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61065782611d59565b905060028351600481111561066e5761066e614594565b1461068c5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106b95760405163e6c4247b60e01b815260040160405180910390fd5b6003835280515f9060029060058111156106d5576106d5614594565b0361072c5786156106ed576106ea8387611e21565b90505b5f84606001518360800151610702919061466b565b905061070e8482611fa5565b506001600160401b0390811660e0870152421660a086015250610760565b505f82815260088501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b600385015460608501516001600160a01b039091169063778c06b590610785906112be565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610802573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610826919061468b565b5f898152600687016020908152604080832093909355600588019052208451815486929190829060ff1916600183600481111561086557610865614594565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610979916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614e778339815191526020526040808220815160e0810190925280545f80516020614e3783398151915293929190829060ff1660058111156109d8576109d8614594565b60058111156109e9576109e9614594565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a5857610a58614594565b14610a765760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a9b8584606001515f6120fc565b6040518263ffffffff1660e01b8152600401610ab791906146c4565b6020604051808303815f875af1158015610ad3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af7919061468b565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b46575080546001600160401b03808416911610155b15610b645760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b8e8361214b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610bea64e8d4a51000836146f6565b92915050565b5f610bf961215f565b610c0584848434612196565b9050610c1d60015f80516020614e5783398151915255565b9392505050565b5f80516020614e178339815191525f80610c3d8461233c565b91509150610c4a82612606565b610c545750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c8357610c83614594565b03610ca8575f83815260078501602052604081208054919055610ca68282612641565b505b610cbe81610cb984604001516112be565b6126a7565b5050505050565b5f80516020614e178339815191525f610cdd846126ba565b90505f80610cee83604001516127ba565b50915091505f610cfd83611d59565b9050816001600160401b031681606001516001600160401b03161080610d4757505f8681526005860160205260409020600201546001600160401b03808416600160c01b90920416115b15610d6557604051633ab3447f60e11b815260040160405180910390fd5b60015f87815260058701602052604090205460ff166004811115610d8b57610d8b614594565b14610da95760405163f95c7fe160e01b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614e378339815191529060ff1615610e8c57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ecf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef3919061468b565b836020013514610f165760405163d040949d60e01b815260040160405180910390fd5b30610f276060850160408601614729565b6001600160a01b031614610f4e5760405163e6c4247b60e01b815260040160405180910390fd5b5f610f5c6060850185614744565b905090505f805b828163ffffffff161015611208575f610f7f6060880188614744565b8363ffffffff16818110610f9557610f95614789565b9050602002810190610fa7919061479d565b610fb09061484d565b80515f8181526008880160205260409020549192509015610fe457604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161101392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261102d916148e4565b602060405180830381855afa158015611048573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061106b919061468b565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156110f7576110f7614594565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111aa9116866148f5565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061120190614908565b9050610f63565b50600483018190555f61121a856126ba565b90505f61122a82604001516129fe565b90505f61123688612b70565b90508160028260405161124991906148e4565b602060405180830381855afa158015611264573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611287919061468b565b146112a557604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610bea6001600160401b03831664e8d4a5100061492a565b5f6112e182611d59565b6080015192915050565b5f80516020614e178339815191525f61130385613009565b905061130e85612606565b611319575050505050565b5f8581526004830160205260409020546001600160a01b031633146113515760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161138091600160b01b90046001600160401b031690614941565b6001600160401b03168160c001516001600160401b031610156113b6576040516302336bad60e51b815260040160405180910390fd5b8315610cbe575f6113c78685611e21565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b590611417906112be565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561148d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114b1919061468b565b5f878152600785016020526040812080549091906114d09084906148f5565b9091555050505050505050565b5f80516020614e178339815191525f6114f583611d59565b905060048151600581111561150c5761150c614594565b1461152a5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146115625760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610af7906001600160a01b031682612641565b6115a061215f565b5f80516020614e178339815191525f6115b8846126ba565b90505f806115c983604001516127ba565b50915091505f6115d883611d59565b5f8781526005870160205260408082208151610100810190925280549394509192909190829060ff16600481111561161257611612614594565b600481111561162357611623614594565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260058f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff19169055908401519192508481169116108061170a5750826001600160401b03168160e001516001600160401b0316115b1561172857604051633ab3447f60e11b815260040160405180910390fd5b60038151600481111561173d5761173d614594565b1461175b5760405163f95c7fe160e01b815260040160405180910390fd5b5f878152600687016020908152604080832080549084905587845260048a019092528220549091906127109061179c90600160a01b900461ffff168461492a565b6117a691906146f6565b905080886007015f8881526020019081526020015f205f8282546117ca91906148f5565b909155505f90506117db8284614961565b90506117eb846020015182612641565b6118008460200151610cb986606001516112be565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611846929190918252602082015260400190565b60405180910390a450505050505050505061186d60015f80516020614e5783398151915255565b5050565b5f80516020614e378339815191525f611889836126ba565b90505f8061189a8360400151613246565b91509150806118bc57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546118d690614974565b90505f036118f757604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561191d5761191d614594565b1461193b5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206119539161435d565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260408082208151610100810190925280545f80516020614e1783398151915293929190829060ff166004811115611a6157611a61614594565b6004811115611a7257611a72614594565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611af957611af9614594565b14158015611b1a5750600381516004811115611b1757611b17614594565b14155b15611b385760405163f95c7fe160e01b815260040160405180910390fd5b5f611b468260400151611d59565b905080606001516001600160401b03165f03611b7557604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611ba28460400151846060015185608001516120fc565b6040518263ffffffff1660e01b8152600401611bbe91906146c4565b6020604051808303815f875af1158015611bda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbe919061468b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614e378339815191529190611c4590614974565b90505f03611c6657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611c8c57611c8c614594565b14611caa5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ce391906004016149a6565b6020604051808303815f875af1158015611cff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d23919061468b565b505050565b5f611d3161215f565b611d3c8233346133e7565b9050611d5460015f80516020614e5783398151915255565b919050565b611d61614394565b5f8281525f80516020614e77833981519152602052604090819020815160e0810190925280545f80516020614e37833981519152929190829060ff166005811115611dae57611dae614594565b6005811115611dbf57611dbf614594565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e6c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e939190810190614a3b565b9150915080611eb557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1c919061468b565b825114611f3c5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611f685760405163e6c4247b60e01b815260040160405180910390fd5b5f80611f7784604001516136d7565b91509150818714611f9b57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e77833981519152602052604081206002015481905f80516020614e3783398151915290600160801b90046001600160401b0316611fed85826138af565b5f611ff787613a78565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6120478a858b6120fc565b6040518263ffffffff1660e01b815260040161206391906146c4565b6020604051808303815f875af115801561207f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a3919061468b565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612153613b08565b61215c81613b53565b50565b5f80516020614e5783398151915280546001190161219057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614e1783398151915290600160401b900461ffff90811690861610806121ea575061271061ffff8616115b156122085760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561223a576040516302336bad60e51b815260040160405180910390fd5b805483108061224c5750806001015483115b1561226a57604051630103be3b60e21b815260040160405180910390fd5b825f61227582610bda565b90505f6122828983613bc1565b905060405180606001604052806122963390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e5783398151915255565b5f612345614394565b5f80516020614e378339815191525f61235d856126ba565b90505f8061236e8360400151613246565b91509150801561239157604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156123c2576123c2614594565b60058111156123d3576123d3614594565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561244457612444614594565b14158015612465575060018251600581111561246257612462614594565b14155b156124835760405163a36c527f60e01b815260040160405180910390fd5b60038251600581111561249857612498614594565b036124a5575060046124a9565b5060055b6020808301515f908152600888019091526040812055818160058111156124d2576124d2614594565b908160058111156124e5576124e5614594565b9052505f84815260078701602052604090208251815484929190829060ff1916600183600581111561251957612519614594565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156125cd576125cd614594565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561268d575f80fd5b505af115801561269f573d5f803e3d5ffd5b505050505050565b61186d6001600160a01b03831682613f9a565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561271e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127459190810190614a3b565b915091508061276757604051636b2f19e960e01b815260040160405180910390fd5b8151156127875760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156127b35760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146127e75760405162461bcd60e51b81526004016127de90614b0d565b60405180910390fd5b5f805b6002811015612836576127fe816001614961565b61280990600861492a565b61ffff1686828151811061281f5761281f614789565b016020015160f81c901b91909117906001016127ea565b5061ffff8116156128595760405162461bcd60e51b81526004016127de90614b56565b5f805b60048110156128b457612870816003614961565b61287b90600861492a565b63ffffffff168761288d8360026148f5565b8151811061289d5761289d614789565b016020015160f81c901b919091179060010161285c565b5063ffffffff81166004146128db5760405162461bcd60e51b81526004016127de90614b99565b5f805b6020811015612930576128f281601f614961565b6128fd90600861492a565b886129098360066148f5565b8151811061291957612919614789565b016020015160f81c901b91909117906001016128de565b505f805b600881101561298f57612948816007614961565b61295390600861492a565b6001600160401b0316896129688360266148f5565b8151811061297857612978614789565b016020015160f81c901b9190911790600101612934565b505f805b60088110156129ee576129a7816007614961565b6129b290600861492a565b6001600160401b03168a6129c783602e6148f5565b815181106129d7576129d7614789565b016020015160f81c901b9190911790600101612993565b5091989097509095509350505050565b5f8151602614612a205760405162461bcd60e51b81526004016127de90614b0d565b5f805b6002811015612a6f57612a37816001614961565b612a4290600861492a565b61ffff16848281518110612a5857612a58614789565b016020015160f81c901b9190911790600101612a23565b5061ffff811615612a925760405162461bcd60e51b81526004016127de90614b56565b5f805b6004811015612aed57612aa9816003614961565b612ab490600861492a565b63ffffffff1685612ac68360026148f5565b81518110612ad657612ad6614789565b016020015160f81c901b9190911790600101612a95565b5063ffffffff811615612b125760405162461bcd60e51b81526004016127de90614b99565b5f805b6020811015612b6757612b2981601f614961565b612b3490600861492a565b86612b408360066148f5565b81518110612b5057612b50614789565b016020015160f81c901b9190911790600101612b15565b50949350505050565b60605f612b7f83830184614744565b612b8b9150605861492a565b612b9690605c6148f5565b6001600160401b03811115612bad57612bad6147bb565b6040519080825280601f01601f191660200182016040528015612bd7576020820181803683370190505b5090505f5b6020811015612c2c5783358160208110612bf857612bf8614789565b1a60f81b828281518110612c0e57612c0e614789565b60200101906001600160f81b03191690815f1a905350600101612bdc565b505f5b6020811015612c8c5783602001358160208110612c4e57612c4e614789565b1a60f81b82612c5e8360206148f5565b81518110612c6e57612c6e614789565b60200101906001600160f81b03191690815f1a905350600101612c2f565b505f5b6004811015612cef57612ca3816003614961565b612cae90600861492a565b6014901c60f81b82612cc18360406148f5565b81518110612cd157612cd1614789565b60200101906001600160f81b03191690815f1a905350600101612c8f565b505f612d016060850160408601614729565b60601b90505f5b6014811015612d6157818160148110612d2357612d23614789565b1a60f81b83612d338360446148f5565b81518110612d4357612d43614789565b60200101906001600160f81b03191690815f1a905350600101612d08565b505f612d706060860186614744565b905090505f5b6004811015612ddb57612d8a816003614961565b612d9590600861492a565b63ffffffff8316901c60f81b84612dad8360586148f5565b81518110612dbd57612dbd614789565b60200101906001600160f81b03191690815f1a905350600101612d76565b505f5b612deb6060870187614744565b9050811015612fff575f612e0082605861492a565b612e0b90605c6148f5565b90505f5b6020811015612e9657612e256060890189614744565b84818110612e3557612e35614789565b9050602002810190612e47919061479d565b358160208110612e5957612e59614789565b1a60f81b86612e6883856148f5565b81518110612e7857612e78614789565b60200101906001600160f81b03191690815f1a905350600101612e0f565b505f5b6008811015612f4b57612ead816007614961565b612eb890600861492a565b612ec560608a018a614744565b85818110612ed557612ed5614789565b9050602002810190612ee7919061479d565b612ef890604081019060200161457b565b6001600160401b0316901c60f81b8682612f138560206148f5565b612f1d91906148f5565b81518110612f2d57612f2d614789565b60200101906001600160f81b03191690815f1a905350600101612e99565b505f5b6030811015612ff557612f646060890189614744565b84818110612f7457612f74614789565b9050602002810190612f86919061479d565b612f94906040810190614be0565b82818110612fa457612fa4614789565b9050013560f81c60f81b8682846028612fbd91906148f5565b612fc791906148f5565b81518110612fd757612fd7614789565b60200101906001600160f81b03191690815f1a905350600101612f4e565b5050600101612dde565b5091949350505050565b613011614394565b5f8281525f80516020614e778339815191526020526040808220815160e0810190925280545f80516020614e3783398151915293929190829060ff16600581111561305e5761305e614594565b600581111561306f5761306f614594565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156130e1576130e1614594565b146130ff5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561314357613143614594565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131ef8582611fa5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146132695760405162461bcd60e51b81526004016127de90614b0d565b5f805b60028110156132b857613280816001614961565b61328b90600861492a565b61ffff168582815181106132a1576132a1614789565b016020015160f81c901b919091179060010161326c565b5061ffff8116156132db5760405162461bcd60e51b81526004016127de90614b56565b5f805b6004811015613336576132f2816003614961565b6132fd90600861492a565b63ffffffff168661330f8360026148f5565b8151811061331f5761331f614789565b016020015160f81c901b91909117906001016132de565b5063ffffffff811660031461335d5760405162461bcd60e51b81526004016127de90614b99565b5f805b60208110156133b25761337481601f614961565b61337f90600861492a565b8761338b8360066148f5565b8151811061339b5761339b614789565b016020015160f81c901b9190911790600101613360565b505f866026815181106133c7576133c7614789565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614e178339815191528161340084610bda565b90505f61340c87611d59565b905061341787612606565b61343457604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561344957613449614594565b146134675760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516134789190614941565b905083600201600a9054906101000a90046001600160401b031682604001516134a19190614c22565b6001600160401b0316816001600160401b031611156134d357604051630c192e7760e41b815260040160405180910390fd5b5f806134df8a84611fa5565b915091505f8a8360405160200161350d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260058b01909152902081518154829060ff191660018360048111156135a8576135a8614594565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146136fa5760405162461bcd60e51b81526004016127de90614b0d565b5f805b600281101561374957613711816001614961565b61371c90600861492a565b61ffff1685828151811061373257613732614789565b016020015160f81c901b91909117906001016136fd565b5061ffff81161561376c5760405162461bcd60e51b81526004016127de90614b56565b5f805b60048110156137c757613783816003614961565b61378e90600861492a565b63ffffffff16866137a08360026148f5565b815181106137b0576137b0614789565b016020015160f81c901b919091179060010161376f565b5063ffffffff81166005146137ee5760405162461bcd60e51b81526004016127de90614b99565b5f805b60208110156138435761380581601f614961565b61381090600861492a565b8761381c8360066148f5565b8151811061382c5761382c614789565b016020015160f81c901b91909117906001016137f1565b505f805b60088110156138a25761385b816007614961565b61386690600861492a565b6001600160401b03168861387b8360266148f5565b8151811061388b5761388b614789565b016020015160f81c901b9190911790600101613847565b5090969095509350505050565b5f80516020614e378339815191525f6001600160401b0380841690851611156138e3576138dc838561466b565b90506138f0565b6138ed848461466b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061395257506001840154815161394e916001600160401b0316906148f5565b8210155b15613978576001600160401b038316606082015281815260408101516020820152613997565b828160600181815161398a9190614941565b6001600160401b03169052505b60608101516139a7906064614c22565b602082015160018601546001600160401b0392909216916139d29190600160401b900460ff1661492a565b10156139f15760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613a0c91906148f5565b9052506040810180516001600160401b0387169190613a2c908390614961565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e778339815191526020526040812060020180545f80516020614e3783398151915291600160401b9091046001600160401b0316906008613ac283614c4d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613b5157604051631afcd79f60e31b815260040160405180910390fd5b565b613b5b613b08565b613b648161402d565b613b6c614046565b61215c60608201356080830135613b8960c0850160a0860161457b565b613b9960e0860160c08701614c68565b613baa610100870160e08801614c81565b613bbc61012088016101008901614729565b614056565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613c0557604051637fab81e560e01b815260040160405180910390fd5b5f80516020614e3783398151915242613c24604086016020870161457b565b6001600160401b0316111580613c5e5750613c426202a300426148f5565b613c52604086016020870161457b565b6001600160401b031610155b15613c7b5760405162d36c8560e81b815260040160405180910390fd5b6030613c8a6040860186614be0565b9050141580613c9857508335155b15613cb65760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613ce657604051630eb0d31360e11b815260040160405180910390fd5b613cf0835f6138af565b5f80613d896040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613d34919061457b565b6001600160401b03168152602001613d4f60408a018a614be0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614177565b5f82815260068601602052604090209193509150613da78282614ce5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613dd49085906004016146c4565b6020604051808303815f875af1158015613df0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e14919061468b565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e8c57613e8c614594565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f6c918e01908e0161457b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613fbd5760405163cd78605960e01b81523060048201526024016127de565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614006576040519150601f19603f3d011682016040523d82523d5f602084013e61400b565b606091505b5050905080611d2357604051630a12f52160e11b815260040160405180910390fd5b614035613b08565b61403d61427b565b61215c81614283565b61404e613b08565b613b51614355565b61405e613b08565b5f80516020614e1783398151915261ffff84161580614082575061271061ffff8516115b156140a05760405163c98d73a760e01b815260040160405180910390fd5b858711156140c157604051630103be3b60e21b815260040160405180910390fd5b60ff831615806140d45750600a60ff8416115b156140f2576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146141e15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016127de565b5f806001855f015186602001518760400151886080015189606001516040516020016142139796959493929190614da0565b604051602081830303815290604052905060028160405161423491906148e4565b602060405180830381855afa15801561424f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614272919061468b565b94909350915050565b613b51613b08565b61428b613b08565b80355f80516020614e3783398151915290815560146142b06060840160408501614c81565b60ff1611806142cf57506142ca6060830160408401614c81565b60ff16155b156142ed5760405163b4fa3fb360e01b815260040160405180910390fd5b6142fd6060830160408401614c81565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561432e604083016020840161457b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612329613b08565b50805461436990614974565b5f825580601f10614378575050565b601f0160209004905f5260205f209081019061215c91906143d0565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156143e4575f81556001016143d1565b5090565b801515811461215c575f80fd5b803563ffffffff81168114611d54575f80fd5b5f805f6060848603121561441a575f80fd5b83359250602084013561442c816143e8565b915061443a604085016143f5565b90509250925092565b5f60208284031215614453575f80fd5b5035919050565b5f610120828403121561446b575f80fd5b50919050565b803561ffff81168114611d54575f80fd5b80356001600160401b0381168114611d54575f80fd5b5f805f606084860312156144aa575f80fd5b83356001600160401b038111156144bf575f80fd5b8401606081870312156144d0575f80fd5b92506144de60208501614471565b915061443a60408501614482565b5f602082840312156144fc575f80fd5b610c1d826143f5565b5f8060408385031215614516575f80fd5b61451f836143f5565b946020939093013593505050565b5f806040838503121561453e575f80fd5b82356001600160401b03811115614553575f80fd5b830160808186031215614564575f80fd5b9150614572602084016143f5565b90509250929050565b5f6020828403121561458b575f80fd5b610c1d82614482565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106145cb57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161460660608401826001600160401b03169052565b50608083015161462160808401826001600160401b03169052565b5060a083015161463c60a08401826001600160401b03169052565b5060c08301516127b360c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156127b3576127b3614657565b5f6020828403121561469b575f80fd5b5051919050565b5f5b838110156146bc5781810151838201526020016146a4565b50505f910152565b602081525f82518060208401526146e28160408501602087016146a2565b601f01601f19169190910160400192915050565b5f8261471057634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b038116811461215c575f80fd5b5f60208284031215614739575f80fd5b8135610c1d81614715565b5f808335601e19843603018112614759575f80fd5b8301803591506001600160401b03821115614772575f80fd5b6020019150600581901b36038213156120f5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126147b1575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156147f1576147f16147bb565b60405290565b604051601f8201601f191681016001600160401b038111828210171561481f5761481f6147bb565b604052919050565b5f6001600160401b0382111561483f5761483f6147bb565b50601f01601f191660200190565b5f6060823603121561485d575f80fd5b6148656147cf565b823581526020614876818501614482565b8183015260408401356001600160401b03811115614892575f80fd5b840136601f8201126148a2575f80fd5b80356148b56148b082614827565b6147f7565b81815236848385010111156148c8575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516147b18184602087016146a2565b80820180821115610bea57610bea614657565b5f63ffffffff80831681810361492057614920614657565b6001019392505050565b8082028115828204841417610bea57610bea614657565b6001600160401b038181168382160190808211156127b3576127b3614657565b81810381811115610bea57610bea614657565b600181811c9082168061498857607f821691505b60208210810361446b57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f84546149b881614974565b806020870152604060018084165f81146149d957600181146149f557614a22565b60ff19851660408a0152604084151560051b8a01019550614a22565b895f5260205f205f5b85811015614a195781548b82018601529083019088016149fe565b8a016040019650505b509398975050505050505050565b8051611d54816143e8565b5f8060408385031215614a4c575f80fd5b82516001600160401b0380821115614a62575f80fd5b9084019060608287031215614a75575f80fd5b614a7d6147cf565b82518152602080840151614a9081614715565b82820152604084015183811115614aa5575f80fd5b80850194505087601f850112614ab9575f80fd5b83519250614ac96148b084614827565b8381528882858701011115614adc575f80fd5b614aeb848383018488016146a2565b80604084015250819550614b00818801614a30565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112614bf5575f80fd5b8301803591506001600160401b03821115614c0e575f80fd5b6020019150368190038213156120f5575f80fd5b6001600160401b03818116838216028082169190828114614c4557614c45614657565b505092915050565b5f6001600160401b0380831681810361492057614920614657565b5f60208284031215614c78575f80fd5b610c1d82614471565b5f60208284031215614c91575f80fd5b813560ff81168114610c1d575f80fd5b601f821115611d2357805f5260205f20601f840160051c81016020851015614cc65750805b601f840160051c820191505b81811015610cbe575f8155600101614cd2565b81516001600160401b03811115614cfe57614cfe6147bb565b614d1281614d0c8454614974565b84614ca1565b602080601f831160018114614d45575f8415614d2e5750858301515b5f19600386901b1c1916600185901b17855561269f565b5f85815260208120601f198616915b82811015614d7357888601518255948401946001909101908401614d54565b5085821015614d9057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614df581604e8601602089016146a2565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. From 69cf948cb2547c5d4197158aa2e1d6360dacc2df Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 20 Sep 2024 15:04:40 -0500 Subject: [PATCH 390/545] reference custom errors directly --- .../tests/ERC20TokenStakingManagerTests.t.sol | 13 ++++--- .../NativeTokenStakingManagerTests.t.sol | 11 +++--- .../tests/PoSValidatorManagerTests.t.sol | 38 ++++++++----------- .../tests/ValidatorManagerTests.t.sol | 17 +-------- 4 files changed, 30 insertions(+), 49 deletions(-) diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index 998fcf583..fee9cde4b 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -7,6 +7,7 @@ pragma solidity 0.8.25; import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {ERC20TokenStakingManager} from "../ERC20TokenStakingManager.sol"; +import {PoSValidatorManager} from "../PoSValidatorManager.sol"; import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import { ValidatorManagerSettings, @@ -58,7 +59,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMinimumDelegationFee() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(InvalidDelegationFee.selector); + vm.expectRevert(PoSValidatorManager.InvalidDelegationFee.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -80,7 +81,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testMaxMinimumDelegationFee() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); uint16 minimumDelegationFeeBips = app.MAXIMUM_DELEGATION_FEE_BIPS() + 1; - vm.expectRevert(InvalidDelegationFee.selector); + vm.expectRevert(PoSValidatorManager.InvalidDelegationFee.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -101,7 +102,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testInvalidStakeAmountRange() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(InvalidStakeAmount.selector); + vm.expectRevert(PoSValidatorManager.InvalidStakeAmount.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -122,7 +123,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMaxStakeMultiplier() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(InvalidStakeMultiplier.selector); + vm.expectRevert(PoSValidatorManager.InvalidStakeMultiplier.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -144,7 +145,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testMaxStakeMultiplierOverLimit() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; - vm.expectRevert(InvalidStakeMultiplier.selector); + vm.expectRevert(PoSValidatorManager.InvalidStakeMultiplier.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -167,7 +168,7 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ValidatorRegistrationInput memory input = ValidatorRegistrationInput(DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY); uint256 stakeAmount = _weightToValue(DEFAULT_WEIGHT); - vm.expectRevert(InvalidStakeDuration.selector); + vm.expectRevert(PoSValidatorManager.InvalidStakeDuration.selector); app.initializeValidatorRegistration( input, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION - 1, stakeAmount ); diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index 3c3605027..78ba2629c 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -7,6 +7,7 @@ pragma solidity 0.8.25; import {PoSValidatorManagerTest} from "./PoSValidatorManagerTests.t.sol"; import {NativeTokenStakingManager} from "../NativeTokenStakingManager.sol"; +import {PoSValidatorManager} from "../PoSValidatorManager.sol"; import { ValidatorManagerSettings, ValidatorRegistrationInput @@ -51,7 +52,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(InvalidDelegationFee.selector); + vm.expectRevert(PoSValidatorManager.InvalidDelegationFee.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -72,7 +73,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testMaxMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); uint16 minimumDelegationFeeBips = app.MAXIMUM_DELEGATION_FEE_BIPS() + 1; - vm.expectRevert(InvalidDelegationFee.selector); + vm.expectRevert(PoSValidatorManager.InvalidDelegationFee.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -92,7 +93,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testInvalidStakeAmountRange() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(InvalidStakeAmount.selector); + vm.expectRevert(PoSValidatorManager.InvalidStakeAmount.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -112,7 +113,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMaxStakeMultiplier() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(InvalidStakeMultiplier.selector); + vm.expectRevert(PoSValidatorManager.InvalidStakeMultiplier.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -133,7 +134,7 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testMaxStakeMultiplierOverLimit() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; - vm.expectRevert(InvalidStakeMultiplier.selector); + vm.expectRevert(PoSValidatorManager.InvalidStakeMultiplier.selector); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 130e7cab9..e75f8e66d 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -8,12 +8,14 @@ pragma solidity 0.8.25; import {IRewardCalculator} from "../interfaces/IRewardCalculator.sol"; import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; import {PoSValidatorManager} from "../PoSValidatorManager.sol"; +import {ValidatorManager} from "../ValidatorManager.sol"; import { WarpMessage, IWarpMessenger } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; import {ValidatorRegistrationInput, ValidatorStatus} from "../interfaces/IValidatorManager.sol"; +import {DelegatorStatus} from "../interfaces/IPoSValidatorManager.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_UPTIME = uint64(100); @@ -76,23 +78,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint256 fees ); - error InvalidDelegatorStatus(); - error InvalidNonce(); - error InvalidDelegationID(); - error ValidatorNotPoS(); - error MaxWeightExceeded(); - error InvalidDelegationFee(); - error InvalidStakeDuration(); - error InvalidStakeAmount(); - error InvalidStakeMultiplier(); - function testDelegationFeeBipsTooLow() public { ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(InvalidDelegationFee.selector); + vm.expectRevert(PoSValidatorManager.InvalidDelegationFee.selector); _initializeValidatorRegistration( registrationInput, DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1, @@ -108,7 +100,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); uint16 delegationFeeBips = posValidatorManager.MAXIMUM_DELEGATION_FEE_BIPS() + 1; - vm.expectRevert(InvalidDelegationFee.selector); + vm.expectRevert(PoSValidatorManager.InvalidDelegationFee.selector); _initializeValidatorRegistration( registrationInput, delegationFeeBips, @@ -123,7 +115,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(InvalidStakeDuration.selector); + vm.expectRevert(PoSValidatorManager.InvalidStakeDuration.selector); _initializeValidatorRegistration( registrationInput, DEFAULT_DELEGATION_FEE_BIPS, @@ -138,7 +130,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(InvalidStakeAmount.selector); + vm.expectRevert(PoSValidatorManager.InvalidStakeAmount.selector); _initializeValidatorRegistration( registrationInput, DEFAULT_DELEGATION_FEE_BIPS, @@ -153,7 +145,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(InvalidStakeAmount.selector); + vm.expectRevert(PoSValidatorManager.InvalidStakeAmount.selector); _initializeValidatorRegistration( registrationInput, DEFAULT_DELEGATION_FEE_BIPS, @@ -171,7 +163,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - vm.expectRevert(InvalidStakeDuration.selector); + vm.expectRevert(PoSValidatorManager.InvalidStakeDuration.selector); posValidatorManager.initializeEndValidation(validationID, false, 0); } @@ -186,7 +178,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _mockGetUptimeWarpMessage(new bytes(0), false); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); - vm.expectRevert(InvalidWarpMessage.selector); + vm.expectRevert(ValidatorManager.InvalidWarpMessage.selector); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -203,7 +195,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetUptimeWarpMessage(new bytes(0), true); _mockGetBlockchainID(posValidatorManager.P_CHAIN_BLOCKCHAIN_ID()); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); - vm.expectRevert(InvalidBlockchainID.selector); + vm.expectRevert(ValidatorManager.InvalidBlockchainID.selector); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -235,7 +227,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); - vm.expectRevert(InvalidAddress.selector); + vm.expectRevert(ValidatorManager.InvalidAddress.selector); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -267,7 +259,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); - vm.expectRevert(InvalidValidationID.selector); + vm.expectRevert(ValidatorManager.InvalidValidationID.selector); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -380,7 +372,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetPChainWarpMessage(setValidatorWeightPayload, true); vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); - vm.expectRevert(InvalidNonce.selector); + vm.expectRevert(PoSValidatorManager.InvalidNonce.selector); posValidatorManager.completeDelegatorRegistration(0, delegationID2); } @@ -433,7 +425,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); vm.prank(address(1)); - vm.expectRevert(InvalidAddress.selector); + vm.expectRevert(ValidatorManager.InvalidAddress.selector); posValidatorManager.initializeEndValidation(validationID, false, 0); } @@ -662,7 +654,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); _mockGetPChainWarpMessage(setValidatorWeightPayload, true); - vm.expectRevert(InvalidNonce.selector); + vm.expectRevert(PoSValidatorManager.InvalidNonce.selector); posValidatorManager.completeEndDelegation(0, delegationID2); } diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index 9eb1a3658..373acd357 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -70,19 +70,6 @@ abstract contract ValidatorManagerTest is Test { event ValidationPeriodEnded(bytes32 indexed validationID, ValidatorStatus indexed status); - error MaxChurnRateExceeded(); - error InvalidWarpMessage(); - error InvalidBlockchainID(); - error InvalidAddress(); - error UnexpectedRegistrationStatus(); - error InvalidValidatorStatus(); - error InvalidValidationID(); - error NodeAlreadyRegistered(); - error InvalidSubnetConversionID(); - error InvalidInput(); - error InvalidExpiry(); - error InvalidInitializationStatus(); - receive() external payable {} fallback() external payable {} @@ -234,7 +221,7 @@ abstract contract ValidatorManagerTest is Test { _beforeSend(DEFAULT_MINIMUM_STAKE_AMOUNT, address(this)); // TODO may need to be updated with minimum stake amount // Second call should fail - vm.expectRevert(MaxChurnRateExceeded.selector); + vm.expectRevert(ValidatorManager.MaxChurnRateExceeded.selector); _initializeValidatorRegistration( ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, @@ -271,7 +258,7 @@ abstract contract ValidatorManagerTest is Test { }); // Second call should fail - vm.expectRevert(MaxChurnRateExceeded.selector); + vm.expectRevert(ValidatorManager.MaxChurnRateExceeded.selector); _initializeEndValidation(validationID, false); } From 179372704ac59d2a09293b92c0aaae2d9e9f8374 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 20 Sep 2024 15:12:10 -0500 Subject: [PATCH 391/545] validator messages custom errors --- .../ERC20TokenStakingManager.go | 4 +- .../NativeTokenStakingManager.go | 4 +- .../PoAValidatorManager.go | 4 +- .../validator-manager/ValidatorMessages.sol | 100 +++++++++++------- 4 files changed, 69 insertions(+), 43 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index f2fbc329a..9103a4ed5 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -82,8 +82,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516152df3803806152df83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151928061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c806376f78621116100f3578063ba3a4b9711610093578063d5f20ff61161006e578063d5f20ff6146103bd578063df93d8de146103dd578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063ba3a4b971461038f578063bee0a03f146103a2578063c974d1b6146103b5575f80fd5b806398f3e2b4116100ce57806398f3e2b4146103305780639e1bc4ef14610343578063a3a65e4814610356578063b771b3bc14610369575f80fd5b806376f78621146103025780638280a25a1461031557806393e245981461031d575f80fd5b8063467ef06f1161015e57806361e2f4901161013957806361e2f490146102c257806362065856146102d557806366435abf146102e8578063732214f8146102fb575f80fd5b8063467ef06f1461027f5780635297fae61461029257806360305d62146102a5575f80fd5b80630118acc4146101a55780630322ed98146101ba5780630cdd0985146101cd578063151d30d11461021e5780632e2194d81461023857806335455ded14610263575b5f80fd5b6101b86101b336600461465a565b61040d565b005b6101b86101c8366004614695565b610837565b61020b6101db366004614695565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610226600a81565b60405160ff9091168152602001610215565b61024b610246366004614695565b6109a9565b6040516001600160401b039091168152602001610215565b61026c61271081565b60405161ffff9091168152602001610215565b6101b861028d3660046146ac565b6109bf565b6101b86102a03660046146c5565b610a60565b6102ad601481565b60405163ffffffff9091168152602001610215565b6101b86102d03660046146ed565b610bd5565b61020b6102e3366004614751565b611059565b61024b6102f6366004614695565b611072565b61020b5f81565b6101b861031036600461465a565b611086565b610226603081565b6101b861032b366004614695565b611278565b6101b861033e3660046146c5565b611333565b61020b61035136600461476a565b61160c565b6101b86103643660046146ac565b611638565b6103776005600160991b0181565b6040516001600160a01b039091168152602001610215565b6101b861039d366004614695565b6117c7565b6101b86103b0366004614695565b6119c5565b610226601481565b6103d06103cb366004614695565b611aef565b604051610215919061479e565b61024b6202a30081565b61020b6103f536600461485e565b611bb7565b6101b86104083660046148d7565b611bec565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260408082208151610100810190925280545f8051602061510683398151915293929190829060ff16600481111561046e5761046e61478a565b600481111561047f5761047f61478a565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61050382611aef565b905060028351600481111561051a5761051a61478a565b146105385760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105655760405163e6c4247b60e01b815260040160405180910390fd5b6003835280515f9060029060058111156105815761058161478a565b036105d8578615610599576105968387611ccb565b90505b5f846060015183608001516105ae9190614929565b90506105ba8482611e4f565b506001600160401b0390811660e0870152421660a08601525061060c565b505f82815260088501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b600385015460608501516001600160a01b039091169063778c06b59061063190611059565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d29190614949565b5f898152600687016020908152604080832093909355600588019052208451815486929190829060ff191660018360048111156107115761071161478a565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610825916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206151668339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff1660058111156108845761088461478a565b60058111156108955761089561478a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109045761090461478a565b146109225760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109478584606001515f611fa6565b6040518263ffffffff1660e01b81526004016109639190614982565b6020604051808303815f875af115801561097f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a39190614949565b50505050565b5f6109b964e8d4a51000836149b4565b92915050565b5f805160206151068339815191525f806109d884611ffd565b915091506109e5826122c7565b6109ef5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610a1e57610a1e61478a565b03610a43575f83815260078501602052604081208054919055610a418282612302565b505b610a5981610a548460400151611059565b612378565b5050505050565b5f805160206151068339815191525f610a788461239b565b90505f80610a89836040015161249b565b50915091505f610a9883611aef565b9050816001600160401b031681606001516001600160401b03161080610ae257505f8681526005860160205260409020600201546001600160401b03808416600160c01b90920416115b15610b0057604051633ab3447f60e11b815260040160405180910390fd5b60015f87815260058701602052604090205460ff166004811115610b2657610b2661478a565b14610b445760405163f95c7fe160e01b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151268339815191529060ff1615610c2757604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8e9190614949565b836020013514610cb15760405163d040949d60e01b815260040160405180910390fd5b30610cc260608501604086016149d3565b6001600160a01b031614610ce95760405163e6c4247b60e01b815260040160405180910390fd5b5f610cf760608501856149ee565b905090505f805b828163ffffffff161015610fa3575f610d1a60608801886149ee565b8363ffffffff16818110610d3057610d30614a33565b9050602002810190610d429190614a47565b610d4b90614af7565b80515f8181526008880160205260409020549192509015610d7f57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610dae92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610dc891614b8e565b602060405180830381855afa158015610de3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610e069190614949565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610e9257610e9261478a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610f45911686614b9f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610f9c90614bb2565b9050610cfe565b50600483018190555f610fb58561239b565b90505f610fc582604001516126df565b90505f610fd188612851565b905081600282604051610fe49190614b8e565b602060405180830381855afa158015610fff573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110229190614949565b1461104057604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6109b96001600160401b03831664e8d4a51000614bd4565b5f61107c82611aef565b6080015192915050565b5f805160206151068339815191525f61109e85612cea565b90506110a9856122c7565b6110b4575050505050565b5f8581526004830160205260409020546001600160a01b031633146110ec5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161111b91600160b01b90046001600160401b031690614beb565b6001600160401b03168160c001516001600160401b03161015611151576040516302336bad60e51b815260040160405180910390fd5b8315610a59575f6111628685611ccb565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906111b290611059565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611228573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c9190614949565b5f8781526007850160205260408120805490919061126b908490614b9f565b9091555050505050505050565b5f805160206151068339815191525f61129083611aef565b90506004815160058111156112a7576112a761478a565b146112c55760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146112fd5760405163e6c4247b60e01b815260040160405180910390fd5b5f838152600783016020908152604080832080549084905560048601909252909120546109a3906001600160a01b031682612302565b61133b612f27565b5f805160206151068339815191525f6113538461239b565b90505f80611364836040015161249b565b50915091505f61137383611aef565b5f8781526005870160205260408082208151610100810190925280549394509192909190829060ff1660048111156113ad576113ad61478a565b60048111156113be576113be61478a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260058f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610806114a55750826001600160401b03168160e001516001600160401b0316115b156114c357604051633ab3447f60e11b815260040160405180910390fd5b6003815160048111156114d8576114d861478a565b146114f65760405163f95c7fe160e01b815260040160405180910390fd5b5f878152600687016020908152604080832080549084905587845260048a019092528220549091906127109061153790600160a01b900461ffff1684614bd4565b61154191906149b4565b905080886007015f8881526020019081526020015f205f8282546115659190614b9f565b909155505f90506115768284614c0b565b9050611586846020015182612302565b61159b8460200151610a548660600151611059565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d503384866040516115e1929190918252602082015260400190565b60405180910390a450505050505050505061160860015f8051602061514683398151915255565b5050565b5f611615612f27565b611620833384612f71565b90506109b960015f8051602061514683398151915255565b5f805160206151268339815191525f6116508361239b565b90505f806116618360400151613264565b915091508061168357604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461169d90614c1e565b90505f036116be57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156116e4576116e461478a565b146117025760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061171a916145aa565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260408082208151610100810190925280545f8051602061510683398151915293929190829060ff1660048111156118285761182861478a565b60048111156118395761183961478a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156118c0576118c061478a565b141580156118e157506003815160048111156118de576118de61478a565b14155b156118ff5760405163f95c7fe160e01b815260040160405180910390fd5b5f61190d8260400151611aef565b905080606001516001600160401b03165f0361193c57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611969846040015184606001518560800151611fa6565b6040518263ffffffff1660e01b81526004016119859190614982565b6020604051808303815f875af11580156119a1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a599190614949565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206151268339815191529190611a0c90614c1e565b90505f03611a2d57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611a5357611a5361478a565b14611a715760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611aaa9190600401614c56565b6020604051808303815f875af1158015611ac6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aea9190614949565b505050565b611af76145e1565b5f8281525f80516020615166833981519152602052604090819020815160e0810190925280545f80516020615126833981519152929190829060ff166005811115611b4457611b4461478a565b6005811115611b5557611b5561478a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611bc0612f27565b611bcc85858585613405565b9050611be460015f8051602061514683398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611c35575080546001600160401b03808416911610155b15611c535760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611c7e84846135a3565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d16573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d3d9190810190614ceb565b9150915080611d5f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611da2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc69190614949565b825114611de65760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611e125760405163e6c4247b60e01b815260040160405180910390fd5b5f80611e2184604001516135bd565b91509150818714611e4557604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615166833981519152602052604081206002015481905f8051602061512683398151915290600160801b90046001600160401b0316611e978582613795565b5f611ea18761395e565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611ef18a858b611fa6565b6040518263ffffffff1660e01b8152600401611f0d9190614982565b6020604051808303815f875af1158015611f29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f4d9190614949565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6120066145e1565b5f805160206151268339815191525f61201e8561239b565b90505f8061202f8360400151613264565b91509150801561205257604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156120835761208361478a565b60058111156120945761209461478a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156121055761210561478a565b1415801561212657506001825160058111156121235761212361478a565b14155b156121445760405163a36c527f60e01b815260040160405180910390fd5b6003825160058111156121595761215961478a565b036121665750600461216a565b5060055b6020808301515f908152600888019091526040812055818160058111156121935761219361478a565b908160058111156121a6576121a661478a565b9052505f84815260078701602052604090208251815484929190829060ff191660018360058111156121da576121da61478a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561228e5761228e61478a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206150e683398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561235d575f80fd5b505af115801561236f573d5f803e3d5ffd5b50505050505050565b5f805160206150e683398151915254611608906001600160a01b031683836139ee565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156123ff573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124269190810190614ceb565b915091508061244857604051636b2f19e960e01b815260040160405180910390fd5b8151156124685760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156124945760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146124c85760405162461bcd60e51b81526004016124bf90614dbd565b60405180910390fd5b5f805b6002811015612517576124df816001614c0b565b6124ea906008614bd4565b61ffff1686828151811061250057612500614a33565b016020015160f81c901b91909117906001016124cb565b5061ffff81161561253a5760405162461bcd60e51b81526004016124bf90614e06565b5f805b600481101561259557612551816003614c0b565b61255c906008614bd4565b63ffffffff168761256e836002614b9f565b8151811061257e5761257e614a33565b016020015160f81c901b919091179060010161253d565b5063ffffffff81166004146125bc5760405162461bcd60e51b81526004016124bf90614e49565b5f805b6020811015612611576125d381601f614c0b565b6125de906008614bd4565b886125ea836006614b9f565b815181106125fa576125fa614a33565b016020015160f81c901b91909117906001016125bf565b505f805b600881101561267057612629816007614c0b565b612634906008614bd4565b6001600160401b031689612649836026614b9f565b8151811061265957612659614a33565b016020015160f81c901b9190911790600101612615565b505f805b60088110156126cf57612688816007614c0b565b612693906008614bd4565b6001600160401b03168a6126a883602e614b9f565b815181106126b8576126b8614a33565b016020015160f81c901b9190911790600101612674565b5091989097509095509350505050565b5f81516026146127015760405162461bcd60e51b81526004016124bf90614dbd565b5f805b600281101561275057612718816001614c0b565b612723906008614bd4565b61ffff1684828151811061273957612739614a33565b016020015160f81c901b9190911790600101612704565b5061ffff8116156127735760405162461bcd60e51b81526004016124bf90614e06565b5f805b60048110156127ce5761278a816003614c0b565b612795906008614bd4565b63ffffffff16856127a7836002614b9f565b815181106127b7576127b7614a33565b016020015160f81c901b9190911790600101612776565b5063ffffffff8116156127f35760405162461bcd60e51b81526004016124bf90614e49565b5f805b60208110156128485761280a81601f614c0b565b612815906008614bd4565b86612821836006614b9f565b8151811061283157612831614a33565b016020015160f81c901b91909117906001016127f6565b50949350505050565b60605f612860838301846149ee565b61286c91506058614bd4565b61287790605c614b9f565b6001600160401b0381111561288e5761288e614a65565b6040519080825280601f01601f1916602001820160405280156128b8576020820181803683370190505b5090505f5b602081101561290d57833581602081106128d9576128d9614a33565b1a60f81b8282815181106128ef576128ef614a33565b60200101906001600160f81b03191690815f1a9053506001016128bd565b505f5b602081101561296d578360200135816020811061292f5761292f614a33565b1a60f81b8261293f836020614b9f565b8151811061294f5761294f614a33565b60200101906001600160f81b03191690815f1a905350600101612910565b505f5b60048110156129d057612984816003614c0b565b61298f906008614bd4565b6014901c60f81b826129a2836040614b9f565b815181106129b2576129b2614a33565b60200101906001600160f81b03191690815f1a905350600101612970565b505f6129e260608501604086016149d3565b60601b90505f5b6014811015612a4257818160148110612a0457612a04614a33565b1a60f81b83612a14836044614b9f565b81518110612a2457612a24614a33565b60200101906001600160f81b03191690815f1a9053506001016129e9565b505f612a5160608601866149ee565b905090505f5b6004811015612abc57612a6b816003614c0b565b612a76906008614bd4565b63ffffffff8316901c60f81b84612a8e836058614b9f565b81518110612a9e57612a9e614a33565b60200101906001600160f81b03191690815f1a905350600101612a57565b505f5b612acc60608701876149ee565b9050811015612ce0575f612ae1826058614bd4565b612aec90605c614b9f565b90505f5b6020811015612b7757612b0660608901896149ee565b84818110612b1657612b16614a33565b9050602002810190612b289190614a47565b358160208110612b3a57612b3a614a33565b1a60f81b86612b498385614b9f565b81518110612b5957612b59614a33565b60200101906001600160f81b03191690815f1a905350600101612af0565b505f5b6008811015612c2c57612b8e816007614c0b565b612b99906008614bd4565b612ba660608a018a6149ee565b85818110612bb657612bb6614a33565b9050602002810190612bc89190614a47565b612bd9906040810190602001614751565b6001600160401b0316901c60f81b8682612bf4856020614b9f565b612bfe9190614b9f565b81518110612c0e57612c0e614a33565b60200101906001600160f81b03191690815f1a905350600101612b7a565b505f5b6030811015612cd657612c4560608901896149ee565b84818110612c5557612c55614a33565b9050602002810190612c679190614a47565b612c75906040810190614e90565b82818110612c8557612c85614a33565b9050013560f81c60f81b8682846028612c9e9190614b9f565b612ca89190614b9f565b81518110612cb857612cb8614a33565b60200101906001600160f81b03191690815f1a905350600101612c2f565b5050600101612abf565b5091949350505050565b612cf26145e1565b5f8281525f805160206151668339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff166005811115612d3f57612d3f61478a565b6005811115612d5057612d5061478a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612dc257612dc261478a565b14612de05760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612e2457612e2461478a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612ed08582611e4f565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020615146833981519152805460011901612f5857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061514683398151915255565b5f5f8051602061510683398151915281612f8d61024685613a4d565b90505f612f9987611aef565b9050612fa4876122c7565b612fc157604051636ca57bcf60e01b815260040160405180910390fd5b600281516005811115612fd657612fd661478a565b14612ff45760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516130059190614beb565b905083600201600a9054906101000a90046001600160401b0316826040015161302e9190614ed2565b6001600160401b0316816001600160401b0316111561306057604051630c192e7760e41b815260040160405180910390fd5b5f8061306c8a84611e4f565b915091505f8a8360405160200161309a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260058b01909152902081518154829060ff191660018360048111156131355761313561478a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146132875760405162461bcd60e51b81526004016124bf90614dbd565b5f805b60028110156132d65761329e816001614c0b565b6132a9906008614bd4565b61ffff168582815181106132bf576132bf614a33565b016020015160f81c901b919091179060010161328a565b5061ffff8116156132f95760405162461bcd60e51b81526004016124bf90614e06565b5f805b600481101561335457613310816003614c0b565b61331b906008614bd4565b63ffffffff168661332d836002614b9f565b8151811061333d5761333d614a33565b016020015160f81c901b91909117906001016132fc565b5063ffffffff811660031461337b5760405162461bcd60e51b81526004016124bf90614e49565b5f805b60208110156133d05761339281601f614c0b565b61339d906008614bd4565b876133a9836006614b9f565b815181106133b9576133b9614a33565b016020015160f81c901b919091179060010161337e565b505f866026815181106133e5576133e5614a33565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061510683398151915290600160401b900461ffff9081169086161080613459575061271061ffff8616115b156134775760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156134a9576040516302336bad60e51b815260040160405180910390fd5b80548310806134bb5750806001015483115b156134d957604051630103be3b60e21b815260040160405180910390fd5b5f6134e384613a4d565b90505f6134ef826109a9565b90505f6134fc8983613a70565b905060405180606001604052806135103390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6135ab613e49565b6135b482613e94565b61160881613f05565b5f808251602e146135e05760405162461bcd60e51b81526004016124bf90614dbd565b5f805b600281101561362f576135f7816001614c0b565b613602906008614bd4565b61ffff1685828151811061361857613618614a33565b016020015160f81c901b91909117906001016135e3565b5061ffff8116156136525760405162461bcd60e51b81526004016124bf90614e06565b5f805b60048110156136ad57613669816003614c0b565b613674906008614bd4565b63ffffffff1686613686836002614b9f565b8151811061369657613696614a33565b016020015160f81c901b9190911790600101613655565b5063ffffffff81166005146136d45760405162461bcd60e51b81526004016124bf90614e49565b5f805b6020811015613729576136eb81601f614c0b565b6136f6906008614bd4565b87613702836006614b9f565b8151811061371257613712614a33565b016020015160f81c901b91909117906001016136d7565b505f805b600881101561378857613741816007614c0b565b61374c906008614bd4565b6001600160401b031688613761836026614b9f565b8151811061377157613771614a33565b016020015160f81c901b919091179060010161372d565b5090969095509350505050565b5f805160206151268339815191525f6001600160401b0380841690851611156137c9576137c28385614929565b90506137d6565b6137d38484614929565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613838575060018401548151613834916001600160401b031690614b9f565b8210155b1561385e576001600160401b03831660608201528181526040810151602082015261387d565b82816060018181516138709190614beb565b6001600160401b03169052505b606081015161388d906064614ed2565b602082015160018601546001600160401b0392909216916138b89190600160401b900460ff16614bd4565b10156138d75760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516138f29190614b9f565b9052506040810180516001600160401b0387169190613912908390614c0b565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206151668339815191526020526040812060020180545f8051602061512683398151915291600160401b9091046001600160401b03169060086139a883614efd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611aea91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f62565b5f6109b9825f805160206150e6833981519152546001600160a01b031690613fc3565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ab457604051637fab81e560e01b815260040160405180910390fd5b5f8051602061512683398151915242613ad36040860160208701614751565b6001600160401b0316111580613b0d5750613af16202a30042614b9f565b613b016040860160208701614751565b6001600160401b031610155b15613b2a5760405162d36c8560e81b815260040160405180910390fd5b6030613b396040860186614e90565b9050141580613b4757508335155b15613b655760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613b9557604051630eb0d31360e11b815260040160405180910390fd5b613b9f835f613795565b5f80613c386040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613be39190614751565b6001600160401b03168152602001613bfe60408a018a614e90565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614125565b5f82815260068601602052604090209193509150613c568282614f5c565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613c83908590600401614982565b6020604051808303815f875af1158015613c9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cc39190614949565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613d3b57613d3b61478a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613e1b918e01908e01614751565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e9257604051631afcd79f60e31b815260040160405180910390fd5b565b613e9c613e49565b613ea581614229565b613ead614242565b613f0260608201356080830135613eca60c0850160a08601614751565b613eda60e0860160c0870161501b565b613eeb610100870160e08801615034565b613efd610120880161010089016149d3565b614252565b50565b613f0d613e49565b5f805160206150e68339815191526001600160a01b038216613f425760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613f766001600160a01b03841683614373565b905080515f14158015613f9a575080806020019051810190613f989190615054565b155b15611aea57604051635274afe760e01b81526001600160a01b03841660048201526024016124bf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614009573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061402d9190614949565b90506140446001600160a01b038516333086614380565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614088573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140ac9190614949565b90508181116141125760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016124bf565b61411c8282614c0b565b95945050505050565b5f606082608001515160301461418f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016124bf565b5f806001855f015186602001518760400151886080015189606001516040516020016141c1979695949392919061506f565b60405160208183030381529060405290506002816040516141e29190614b8e565b602060405180830381855afa1580156141fd573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142209190614949565b94909350915050565b614231613e49565b6142396143b9565b613f02816143c1565b61424a613e49565b613e92614493565b61425a613e49565b5f8051602061510683398151915261ffff8416158061427e575061271061ffff8516115b1561429c5760405163c98d73a760e01b815260040160405180910390fd5b858711156142bd57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806142d05750600a60ff8416115b156142ee576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611ff683835f61449b565b6040516001600160a01b0384811660248301528381166044830152606482018390526109a39186918216906323b872dd90608401613a1b565b613e92613e49565b6143c9613e49565b80355f8051602061512683398151915290815560146143ee6060840160408501615034565b60ff16118061440d57506144086060830160408401615034565b60ff16155b1561442b5760405163b4fa3fb360e01b815260040160405180910390fd5b61443b6060830160408401615034565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561446c6040830160208401614751565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612f5e613e49565b6060814710156144c05760405163cd78605960e01b81523060048201526024016124bf565b5f80856001600160a01b031684866040516144db9190614b8e565b5f6040518083038185875af1925050503d805f8114614515576040519150601f19603f3d011682016040523d82523d5f602084013e61451a565b606091505b5091509150611e4586838360608261453a5761453582614581565b611ff6565b815115801561455157506001600160a01b0384163b155b1561457a57604051639996b31560e01b81526001600160a01b03851660048201526024016124bf565b5080611ff6565b8051156145915780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546145b690614c1e565b5f825580601f106145c5575050565b601f0160209004905f5260205f2090810190613f02919061461d565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614631575f815560010161461e565b5090565b8015158114613f02575f80fd5b803563ffffffff81168114614655575f80fd5b919050565b5f805f6060848603121561466c575f80fd5b83359250602084013561467e81614635565b915061468c60408501614642565b90509250925092565b5f602082840312156146a5575f80fd5b5035919050565b5f602082840312156146bc575f80fd5b611ff682614642565b5f80604083850312156146d6575f80fd5b6146df83614642565b946020939093013593505050565b5f80604083850312156146fe575f80fd5b82356001600160401b03811115614713575f80fd5b830160808186031215614724575f80fd5b915061473260208401614642565b90509250929050565b80356001600160401b0381168114614655575f80fd5b5f60208284031215614761575f80fd5b611ff68261473b565b5f806040838503121561477b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106147c157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516147fc60608401826001600160401b03169052565b50608083015161481760808401826001600160401b03169052565b5060a083015161483260a08401826001600160401b03169052565b5060c083015161249460c08401826001600160401b03169052565b803561ffff81168114614655575f80fd5b5f805f8060808587031215614871575f80fd5b84356001600160401b03811115614886575f80fd5b850160608188031215614897575f80fd5b93506148a56020860161484d565b92506148b36040860161473b565b9396929550929360600135925050565b6001600160a01b0381168114613f02575f80fd5b5f808284036101408112156148ea575f80fd5b610120808212156148f9575f80fd5b849350830135905061490a816148c3565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561249457612494614915565b5f60208284031215614959575f80fd5b5051919050565b5f5b8381101561497a578181015183820152602001614962565b50505f910152565b602081525f82518060208401526149a0816040850160208701614960565b601f01601f19169190910160400192915050565b5f826149ce57634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156149e3575f80fd5b8135611ff6816148c3565b5f808335601e19843603018112614a03575f80fd5b8301803591506001600160401b03821115614a1c575f80fd5b6020019150600581901b3603821315611f9f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614a5b575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614a9b57614a9b614a65565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614ac957614ac9614a65565b604052919050565b5f6001600160401b03821115614ae957614ae9614a65565b50601f01601f191660200190565b5f60608236031215614b07575f80fd5b614b0f614a79565b823581526020614b2081850161473b565b8183015260408401356001600160401b03811115614b3c575f80fd5b840136601f820112614b4c575f80fd5b8035614b5f614b5a82614ad1565b614aa1565b8181523684838501011115614b72575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614a5b818460208701614960565b808201808211156109b9576109b9614915565b5f63ffffffff808316818103614bca57614bca614915565b6001019392505050565b80820281158282048414176109b9576109b9614915565b6001600160401b0381811683821601908082111561249457612494614915565b818103818111156109b9576109b9614915565b600181811c90821680614c3257607f821691505b602082108103614c5057634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614c6881614c1e565b806020870152604060018084165f8114614c895760018114614ca557614cd2565b60ff19851660408a0152604084151560051b8a01019550614cd2565b895f5260205f205f5b85811015614cc95781548b8201860152908301908801614cae565b8a016040019650505b509398975050505050505050565b805161465581614635565b5f8060408385031215614cfc575f80fd5b82516001600160401b0380821115614d12575f80fd5b9084019060608287031215614d25575f80fd5b614d2d614a79565b82518152602080840151614d40816148c3565b82820152604084015183811115614d55575f80fd5b80850194505087601f850112614d69575f80fd5b83519250614d79614b5a84614ad1565b8381528882858701011115614d8c575f80fd5b614d9b84838301848801614960565b80604084015250819550614db0818801614ce0565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112614ea5575f80fd5b8301803591506001600160401b03821115614ebe575f80fd5b602001915036819003821315611f9f575f80fd5b6001600160401b03818116838216028082169190828114614ef557614ef5614915565b505092915050565b5f6001600160401b03808316818103614bca57614bca614915565b601f821115611aea57805f5260205f20601f840160051c81016020851015614f3d5750805b601f840160051c820191505b81811015610a59575f8155600101614f49565b81516001600160401b03811115614f7557614f75614a65565b614f8981614f838454614c1e565b84614f18565b602080601f831160018114614fbc575f8415614fa55750858301515b5f19600386901b1c1916600185901b178555615013565b5f85815260208120601f198616915b82811015614fea57888601518255948401946001909101908401614fcb565b508582101561500757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561502b575f80fd5b611ff68261484d565b5f60208284031215615044575f80fd5b813560ff81168114611ff6575f80fd5b5f60208284031215615064575f80fd5b8151611ff681614635565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516150c481604e860160208901614960565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516151d33803806151d383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150868061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c806376f78621116100f3578063ba3a4b9711610093578063d5f20ff61161006e578063d5f20ff6146103bd578063df93d8de146103dd578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063ba3a4b971461038f578063bee0a03f146103a2578063c974d1b6146103b5575f80fd5b806398f3e2b4116100ce57806398f3e2b4146103305780639e1bc4ef14610343578063a3a65e4814610356578063b771b3bc14610369575f80fd5b806376f78621146103025780638280a25a1461031557806393e245981461031d575f80fd5b8063467ef06f1161015e57806361e2f4901161013957806361e2f490146102c257806362065856146102d557806366435abf146102e8578063732214f8146102fb575f80fd5b8063467ef06f1461027f5780635297fae61461029257806360305d62146102a5575f80fd5b80630118acc4146101a55780630322ed98146101ba5780630cdd0985146101cd578063151d30d11461021e5780632e2194d81461023857806335455ded14610263575b5f80fd5b6101b86101b3366004614621565b61040d565b005b6101b86101c836600461465c565b610837565b61020b6101db36600461465c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b610226600a81565b60405160ff9091168152602001610215565b61024b61024636600461465c565b6109a9565b6040516001600160401b039091168152602001610215565b61026c61271081565b60405161ffff9091168152602001610215565b6101b861028d366004614673565b6109bf565b6101b86102a036600461468c565b610a60565b6102ad601481565b60405163ffffffff9091168152602001610215565b6101b86102d03660046146b4565b610bd5565b61020b6102e3366004614718565b611059565b61024b6102f636600461465c565b611072565b61020b5f81565b6101b8610310366004614621565b611086565b610226603081565b6101b861032b36600461465c565b611278565b6101b861033e36600461468c565b611333565b61020b610351366004614731565b61160c565b6101b8610364366004614673565b611638565b6103776005600160991b0181565b6040516001600160a01b039091168152602001610215565b6101b861039d36600461465c565b6117c7565b6101b86103b036600461465c565b6119c5565b610226601481565b6103d06103cb36600461465c565b611aef565b6040516102159190614765565b61024b6202a30081565b61020b6103f5366004614825565b611bb7565b6101b861040836600461489e565b611bec565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260408082208151610100810190925280545f80516020614ffa83398151915293929190829060ff16600481111561046e5761046e614751565b600481111561047f5761047f614751565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61050382611aef565b905060028351600481111561051a5761051a614751565b146105385760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105655760405163e6c4247b60e01b815260040160405180910390fd5b6003835280515f90600290600581111561058157610581614751565b036105d8578615610599576105968387611ccb565b90505b5f846060015183608001516105ae91906148f0565b90506105ba8482611e4f565b506001600160401b0390811660e0870152421660a08601525061060c565b505f82815260088501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b600385015460608501516001600160a01b039091169063778c06b59061063190611059565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156106ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d29190614910565b5f898152600687016020908152604080832093909355600588019052208451815486929190829060ff1916600183600481111561071157610711614751565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610825916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061505a8339815191526020526040808220815160e0810190925280545f8051602061501a83398151915293929190829060ff16600581111561088457610884614751565b600581111561089557610895614751565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561090457610904614751565b146109225760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109478584606001515f611fa6565b6040518263ffffffff1660e01b81526004016109639190614949565b6020604051808303815f875af115801561097f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a39190614910565b50505050565b5f6109b964e8d4a510008361497b565b92915050565b5f80516020614ffa8339815191525f806109d884611ffd565b915091506109e5826122c7565b6109ef5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610a1e57610a1e614751565b03610a43575f83815260078501602052604081208054919055610a418282612302565b505b610a5981610a548460400151611059565b612378565b5050505050565b5f80516020614ffa8339815191525f610a788461239b565b90505f80610a89836040015161249b565b50915091505f610a9883611aef565b9050816001600160401b031681606001516001600160401b03161080610ae257505f8681526005860160205260409020600201546001600160401b03808416600160c01b90920416115b15610b0057604051633ab3447f60e11b815260040160405180910390fd5b60015f87815260058701602052604090205460ff166004811115610b2657610b26614751565b14610b445760405163f95c7fe160e01b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061501a8339815191529060ff1615610c2757604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8e9190614910565b836020013514610cb15760405163d040949d60e01b815260040160405180910390fd5b30610cc2606085016040860161499a565b6001600160a01b031614610ce95760405163e6c4247b60e01b815260040160405180910390fd5b5f610cf760608501856149b5565b905090505f805b828163ffffffff161015610fa3575f610d1a60608801886149b5565b8363ffffffff16818110610d3057610d306149fa565b9050602002810190610d429190614a0e565b610d4b90614abe565b80515f8181526008880160205260409020549192509015610d7f57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610dae92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610dc891614b55565b602060405180830381855afa158015610de3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610e069190614910565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610e9257610e92614751565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610f45911686614b66565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610f9c90614b79565b9050610cfe565b50600483018190555f610fb58561239b565b90505f610fc582604001516126d9565b90505f610fd18861284e565b905081600282604051610fe49190614b55565b602060405180830381855afa158015610fff573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110229190614910565b1461104057604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6109b96001600160401b03831664e8d4a51000614b9b565b5f61107c82611aef565b6080015192915050565b5f80516020614ffa8339815191525f61109e85612ce7565b90506110a9856122c7565b6110b4575050505050565b5f8581526004830160205260409020546001600160a01b031633146110ec5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161111b91600160b01b90046001600160401b031690614bb2565b6001600160401b03168160c001516001600160401b03161015611151576040516302336bad60e51b815260040160405180910390fd5b8315610a59575f6111628685611ccb565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906111b290611059565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611228573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061124c9190614910565b5f8781526007850160205260408120805490919061126b908490614b66565b9091555050505050505050565b5f80516020614ffa8339815191525f61129083611aef565b90506004815160058111156112a7576112a7614751565b146112c55760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146112fd5760405163e6c4247b60e01b815260040160405180910390fd5b5f838152600783016020908152604080832080549084905560048601909252909120546109a3906001600160a01b031682612302565b61133b612f24565b5f80516020614ffa8339815191525f6113538461239b565b90505f80611364836040015161249b565b50915091505f61137383611aef565b5f8781526005870160205260408082208151610100810190925280549394509192909190829060ff1660048111156113ad576113ad614751565b60048111156113be576113be614751565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260058f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff1916905590840151919250848116911610806114a55750826001600160401b03168160e001516001600160401b0316115b156114c357604051633ab3447f60e11b815260040160405180910390fd5b6003815160048111156114d8576114d8614751565b146114f65760405163f95c7fe160e01b815260040160405180910390fd5b5f878152600687016020908152604080832080549084905587845260048a019092528220549091906127109061153790600160a01b900461ffff1684614b9b565b611541919061497b565b905080886007015f8881526020019081526020015f205f8282546115659190614b66565b909155505f90506115768284614bd2565b9050611586846020015182612302565b61159b8460200151610a548660600151611059565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d503384866040516115e1929190918252602082015260400190565b60405180910390a450505050505050505061160860015f8051602061503a83398151915255565b5050565b5f611615612f24565b611620833384612f6e565b90506109b960015f8051602061503a83398151915255565b5f8051602061501a8339815191525f6116508361239b565b90505f806116618360400151613261565b915091508061168357604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461169d90614be5565b90505f036116be57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156116e4576116e4614751565b146117025760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061171a91614571565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260408082208151610100810190925280545f80516020614ffa83398151915293929190829060ff16600481111561182857611828614751565b600481111561183957611839614751565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e090910152909150815160048111156118c0576118c0614751565b141580156118e157506003815160048111156118de576118de614751565b14155b156118ff5760405163f95c7fe160e01b815260040160405180910390fd5b5f61190d8260400151611aef565b905080606001516001600160401b03165f0361193c57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611969846040015184606001518560800151611fa6565b6040518263ffffffff1660e01b81526004016119859190614949565b6020604051808303815f875af11580156119a1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a599190614910565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061501a8339815191529190611a0c90614be5565b90505f03611a2d57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611a5357611a53614751565b14611a715760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611aaa9190600401614c1d565b6020604051808303815f875af1158015611ac6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aea9190614910565b505050565b611af76145a8565b5f8281525f8051602061505a833981519152602052604090819020815160e0810190925280545f8051602061501a833981519152929190829060ff166005811115611b4457611b44614751565b6005811115611b5557611b55614751565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611bc0612f24565b611bcc85858585613405565b9050611be460015f8051602061503a83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611c35575080546001600160401b03808416911610155b15611c535760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611c7e84846135a3565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d16573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d3d9190810190614cb2565b9150915080611d5f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611da2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc69190614910565b825114611de65760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611e125760405163e6c4247b60e01b815260040160405180910390fd5b5f80611e2184604001516135bd565b91509150818714611e4557604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f8051602061505a833981519152602052604081206002015481905f8051602061501a83398151915290600160801b90046001600160401b0316611e978582613798565b5f611ea187613961565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611ef18a858b611fa6565b6040518263ffffffff1660e01b8152600401611f0d9190614949565b6020604051808303815f875af1158015611f29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f4d9190614910565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6120066145a8565b5f8051602061501a8339815191525f61201e8561239b565b90505f8061202f8360400151613261565b91509150801561205257604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561208357612083614751565b600581111561209457612094614751565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561210557612105614751565b14158015612126575060018251600581111561212357612123614751565b14155b156121445760405163a36c527f60e01b815260040160405180910390fd5b60038251600581111561215957612159614751565b036121665750600461216a565b5060055b6020808301515f9081526008880190915260408120558181600581111561219357612193614751565b908160058111156121a6576121a6614751565b9052505f84815260078701602052604090208251815484929190829060ff191660018360058111156121da576121da614751565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558151600581111561228e5761228e614751565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f80516020614fda83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561235d575f80fd5b505af115801561236f573d5f803e3d5ffd5b50505050505050565b5f80516020614fda83398151915254611608906001600160a01b031683836139f1565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156123ff573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124269190810190614cb2565b915091508061244857604051636b2f19e960e01b815260040160405180910390fd5b8151156124685760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156124945760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146124c057604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561250f576124d7816001614bd2565b6124e2906008614b9b565b61ffff168682815181106124f8576124f86149fa565b016020015160f81c901b91909117906001016124c3565b5061ffff8116156125335760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561258e5761254a816003614bd2565b612555906008614b9b565b63ffffffff1687612567836002614b66565b81518110612577576125776149fa565b016020015160f81c901b9190911790600101612536565b5063ffffffff81166004146125b657604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561260b576125cd81601f614bd2565b6125d8906008614b9b565b886125e4836006614b66565b815181106125f4576125f46149fa565b016020015160f81c901b91909117906001016125b9565b505f805b600881101561266a57612623816007614bd2565b61262e906008614b9b565b6001600160401b031689612643836026614b66565b81518110612653576126536149fa565b016020015160f81c901b919091179060010161260f565b505f805b60088110156126c957612682816007614bd2565b61268d906008614b9b565b6001600160401b03168a6126a283602e614b66565b815181106126b2576126b26149fa565b016020015160f81c901b919091179060010161266e565b5091989097509095509350505050565b5f81516026146126fc57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561274b57612713816001614bd2565b61271e906008614b9b565b61ffff16848281518110612734576127346149fa565b016020015160f81c901b91909117906001016126ff565b5061ffff81161561276f5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156127ca57612786816003614bd2565b612791906008614b9b565b63ffffffff16856127a3836002614b66565b815181106127b3576127b36149fa565b016020015160f81c901b9190911790600101612772565b5063ffffffff8116156127f057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156128455761280781601f614bd2565b612812906008614b9b565b8661281e836006614b66565b8151811061282e5761282e6149fa565b016020015160f81c901b91909117906001016127f3565b50949350505050565b60605f61285d838301846149b5565b61286991506058614b9b565b61287490605c614b66565b6001600160401b0381111561288b5761288b614a2c565b6040519080825280601f01601f1916602001820160405280156128b5576020820181803683370190505b5090505f5b602081101561290a57833581602081106128d6576128d66149fa565b1a60f81b8282815181106128ec576128ec6149fa565b60200101906001600160f81b03191690815f1a9053506001016128ba565b505f5b602081101561296a578360200135816020811061292c5761292c6149fa565b1a60f81b8261293c836020614b66565b8151811061294c5761294c6149fa565b60200101906001600160f81b03191690815f1a90535060010161290d565b505f5b60048110156129cd57612981816003614bd2565b61298c906008614b9b565b6014901c60f81b8261299f836040614b66565b815181106129af576129af6149fa565b60200101906001600160f81b03191690815f1a90535060010161296d565b505f6129df606085016040860161499a565b60601b90505f5b6014811015612a3f57818160148110612a0157612a016149fa565b1a60f81b83612a11836044614b66565b81518110612a2157612a216149fa565b60200101906001600160f81b03191690815f1a9053506001016129e6565b505f612a4e60608601866149b5565b905090505f5b6004811015612ab957612a68816003614bd2565b612a73906008614b9b565b63ffffffff8316901c60f81b84612a8b836058614b66565b81518110612a9b57612a9b6149fa565b60200101906001600160f81b03191690815f1a905350600101612a54565b505f5b612ac960608701876149b5565b9050811015612cdd575f612ade826058614b9b565b612ae990605c614b66565b90505f5b6020811015612b7457612b0360608901896149b5565b84818110612b1357612b136149fa565b9050602002810190612b259190614a0e565b358160208110612b3757612b376149fa565b1a60f81b86612b468385614b66565b81518110612b5657612b566149fa565b60200101906001600160f81b03191690815f1a905350600101612aed565b505f5b6008811015612c2957612b8b816007614bd2565b612b96906008614b9b565b612ba360608a018a6149b5565b85818110612bb357612bb36149fa565b9050602002810190612bc59190614a0e565b612bd6906040810190602001614718565b6001600160401b0316901c60f81b8682612bf1856020614b66565b612bfb9190614b66565b81518110612c0b57612c0b6149fa565b60200101906001600160f81b03191690815f1a905350600101612b77565b505f5b6030811015612cd357612c4260608901896149b5565b84818110612c5257612c526149fa565b9050602002810190612c649190614a0e565b612c72906040810190614d84565b82818110612c8257612c826149fa565b9050013560f81c60f81b8682846028612c9b9190614b66565b612ca59190614b66565b81518110612cb557612cb56149fa565b60200101906001600160f81b03191690815f1a905350600101612c2c565b5050600101612abc565b5091949350505050565b612cef6145a8565b5f8281525f8051602061505a8339815191526020526040808220815160e0810190925280545f8051602061501a83398151915293929190829060ff166005811115612d3c57612d3c614751565b6005811115612d4d57612d4d614751565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612dbf57612dbf614751565b14612ddd5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612e2157612e21614751565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612ecd8582611e4f565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061503a833981519152805460011901612f5557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061503a83398151915255565b5f5f80516020614ffa83398151915281612f8a61024685613a50565b90505f612f9687611aef565b9050612fa1876122c7565b612fbe57604051636ca57bcf60e01b815260040160405180910390fd5b600281516005811115612fd357612fd3614751565b14612ff15760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516130029190614bb2565b905083600201600a9054906101000a90046001600160401b0316826040015161302b9190614dc6565b6001600160401b0316816001600160401b0316111561305d57604051630c192e7760e41b815260040160405180910390fd5b5f806130698a84611e4f565b915091505f8a8360405160200161309792919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260058b01909152902081518154829060ff1916600183600481111561313257613132614751565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461328557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156132d45761329c816001614bd2565b6132a7906008614b9b565b61ffff168582815181106132bd576132bd6149fa565b016020015160f81c901b9190911790600101613288565b5061ffff8116156132f85760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156133535761330f816003614bd2565b61331a906008614b9b565b63ffffffff168661332c836002614b66565b8151811061333c5761333c6149fa565b016020015160f81c901b91909117906001016132fb565b5063ffffffff811660031461337b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156133d05761339281601f614bd2565b61339d906008614b9b565b876133a9836006614b66565b815181106133b9576133b96149fa565b016020015160f81c901b919091179060010161337e565b505f866026815181106133e5576133e56149fa565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ffa83398151915290600160401b900461ffff9081169086161080613459575061271061ffff8616115b156134775760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156134a9576040516302336bad60e51b815260040160405180910390fd5b80548310806134bb5750806001015483115b156134d957604051630103be3b60e21b815260040160405180910390fd5b5f6134e384613a50565b90505f6134ef826109a9565b90505f6134fc8983613a73565b905060405180606001604052806135103390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6135ab613e4c565b6135b482613e97565b61160881613f08565b5f808251602e146135e157604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613630576135f8816001614bd2565b613603906008614b9b565b61ffff16858281518110613619576136196149fa565b016020015160f81c901b91909117906001016135e4565b5061ffff8116156136545760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156136af5761366b816003614bd2565b613676906008614b9b565b63ffffffff1686613688836002614b66565b81518110613698576136986149fa565b016020015160f81c901b9190911790600101613657565b5063ffffffff81166005146136d757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561372c576136ee81601f614bd2565b6136f9906008614b9b565b87613705836006614b66565b81518110613715576137156149fa565b016020015160f81c901b91909117906001016136da565b505f805b600881101561378b57613744816007614bd2565b61374f906008614b9b565b6001600160401b031688613764836026614b66565b81518110613774576137746149fa565b016020015160f81c901b9190911790600101613730565b5090969095509350505050565b5f8051602061501a8339815191525f6001600160401b0380841690851611156137cc576137c583856148f0565b90506137d9565b6137d684846148f0565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061383b575060018401548151613837916001600160401b031690614b66565b8210155b15613861576001600160401b038316606082015281815260408101516020820152613880565b82816060018181516138739190614bb2565b6001600160401b03169052505b6060810151613890906064614dc6565b602082015160018601546001600160401b0392909216916138bb9190600160401b900460ff16614b9b565b10156138da5760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516138f59190614b66565b9052506040810180516001600160401b0387169190613915908390614bd2565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061505a8339815191526020526040812060020180545f8051602061501a83398151915291600160401b9091046001600160401b03169060086139ab83614df1565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b03838116602483015260448201839052611aea91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050613f65565b5f6109b9825f80516020614fda833981519152546001600160a01b031690613fcb565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ab757604051637fab81e560e01b815260040160405180910390fd5b5f8051602061501a83398151915242613ad66040860160208701614718565b6001600160401b0316111580613b105750613af46202a30042614b66565b613b046040860160208701614718565b6001600160401b031610155b15613b2d5760405162d36c8560e81b815260040160405180910390fd5b6030613b3c6040860186614d84565b9050141580613b4a57508335155b15613b685760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613b9857604051630eb0d31360e11b815260040160405180910390fd5b613ba2835f613798565b5f80613c3b6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613be69190614718565b6001600160401b03168152602001613c0160408a018a614d84565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061412d565b5f82815260068601602052604090209193509150613c598282614e50565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613c86908590600401614949565b6020604051808303815f875af1158015613ca2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cc69190614910565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613d3e57613d3e614751565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613e1e918e01908e01614718565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e9557604051631afcd79f60e31b815260040160405180910390fd5b565b613e9f613e4c565b613ea8816141f0565b613eb0614209565b613f0560608201356080830135613ecd60c0850160a08601614718565b613edd60e0860160c08701614f0f565b613eee610100870160e08801614f28565b613f006101208801610100890161499a565b614219565b50565b613f10613e4c565b5f80516020614fda8339815191526001600160a01b038216613f455760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f613f796001600160a01b0384168361433a565b905080515f14158015613f9d575080806020019051810190613f9b9190614f48565b155b15611aea57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614011573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140359190614910565b905061404c6001600160a01b038516333086614347565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614090573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140b49190614910565b905081811161411a5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401613fc2565b6141248282614bd2565b95945050505050565b5f606082608001515160301461415657604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016141889796959493929190614f63565b60405160208183030381529060405290506002816040516141a99190614b55565b602060405180830381855afa1580156141c4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906141e79190614910565b94909350915050565b6141f8613e4c565b614200614380565b613f0581614388565b614211613e4c565b613e9561445a565b614221613e4c565b5f80516020614ffa83398151915261ffff84161580614245575061271061ffff8516115b156142635760405163c98d73a760e01b815260040160405180910390fd5b8587111561428457604051630103be3b60e21b815260040160405180910390fd5b60ff831615806142975750600a60ff8416115b156142b5576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611ff683835f614462565b6040516001600160a01b0384811660248301528381166044830152606482018390526109a39186918216906323b872dd90608401613a1e565b613e95613e4c565b614390613e4c565b80355f8051602061501a83398151915290815560146143b56060840160408501614f28565b60ff1611806143d457506143cf6060830160408401614f28565b60ff16155b156143f25760405163b4fa3fb360e01b815260040160405180910390fd5b6144026060830160408401614f28565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556144336040830160208401614718565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612f5b613e4c565b6060814710156144875760405163cd78605960e01b8152306004820152602401613fc2565b5f80856001600160a01b031684866040516144a29190614b55565b5f6040518083038185875af1925050503d805f81146144dc576040519150601f19603f3d011682016040523d82523d5f602084013e6144e1565b606091505b5091509150611e45868383606082614501576144fc82614548565b611ff6565b815115801561451857506001600160a01b0384163b155b1561454157604051639996b31560e01b81526001600160a01b0385166004820152602401613fc2565b5080611ff6565b8051156145585780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461457d90614be5565b5f825580601f1061458c575050565b601f0160209004905f5260205f2090810190613f0591906145e4565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156145f8575f81556001016145e5565b5090565b8015158114613f05575f80fd5b803563ffffffff8116811461461c575f80fd5b919050565b5f805f60608486031215614633575f80fd5b833592506020840135614645816145fc565b915061465360408501614609565b90509250925092565b5f6020828403121561466c575f80fd5b5035919050565b5f60208284031215614683575f80fd5b611ff682614609565b5f806040838503121561469d575f80fd5b6146a683614609565b946020939093013593505050565b5f80604083850312156146c5575f80fd5b82356001600160401b038111156146da575f80fd5b8301608081860312156146eb575f80fd5b91506146f960208401614609565b90509250929050565b80356001600160401b038116811461461c575f80fd5b5f60208284031215614728575f80fd5b611ff682614702565b5f8060408385031215614742575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061478857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516147c360608401826001600160401b03169052565b5060808301516147de60808401826001600160401b03169052565b5060a08301516147f960a08401826001600160401b03169052565b5060c083015161249460c08401826001600160401b03169052565b803561ffff8116811461461c575f80fd5b5f805f8060808587031215614838575f80fd5b84356001600160401b0381111561484d575f80fd5b85016060818803121561485e575f80fd5b935061486c60208601614814565b925061487a60408601614702565b9396929550929360600135925050565b6001600160a01b0381168114613f05575f80fd5b5f808284036101408112156148b1575f80fd5b610120808212156148c0575f80fd5b84935083013590506148d18161488a565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612494576124946148dc565b5f60208284031215614920575f80fd5b5051919050565b5f5b83811015614941578181015183820152602001614929565b50505f910152565b602081525f8251806020840152614967816040850160208701614927565b601f01601f19169190910160400192915050565b5f8261499557634e487b7160e01b5f52601260045260245ffd5b500490565b5f602082840312156149aa575f80fd5b8135611ff68161488a565b5f808335601e198436030181126149ca575f80fd5b8301803591506001600160401b038211156149e3575f80fd5b6020019150600581901b3603821315611f9f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614a22575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614a6257614a62614a2c565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614a9057614a90614a2c565b604052919050565b5f6001600160401b03821115614ab057614ab0614a2c565b50601f01601f191660200190565b5f60608236031215614ace575f80fd5b614ad6614a40565b823581526020614ae7818501614702565b8183015260408401356001600160401b03811115614b03575f80fd5b840136601f820112614b13575f80fd5b8035614b26614b2182614a98565b614a68565b8181523684838501011115614b39575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614a22818460208701614927565b808201808211156109b9576109b96148dc565b5f63ffffffff808316818103614b9157614b916148dc565b6001019392505050565b80820281158282048414176109b9576109b96148dc565b6001600160401b03818116838216019080821115612494576124946148dc565b818103818111156109b9576109b96148dc565b600181811c90821680614bf957607f821691505b602082108103614c1757634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614c2f81614be5565b806020870152604060018084165f8114614c505760018114614c6c57614c99565b60ff19851660408a0152604084151560051b8a01019550614c99565b895f5260205f205f5b85811015614c905781548b8201860152908301908801614c75565b8a016040019650505b509398975050505050505050565b805161461c816145fc565b5f8060408385031215614cc3575f80fd5b82516001600160401b0380821115614cd9575f80fd5b9084019060608287031215614cec575f80fd5b614cf4614a40565b82518152602080840151614d078161488a565b82820152604084015183811115614d1c575f80fd5b80850194505087601f850112614d30575f80fd5b83519250614d40614b2184614a98565b8381528882858701011115614d53575f80fd5b614d6284838301848801614927565b80604084015250819550614d77818801614ca7565b9450505050509250929050565b5f808335601e19843603018112614d99575f80fd5b8301803591506001600160401b03821115614db2575f80fd5b602001915036819003821315611f9f575f80fd5b6001600160401b03818116838216028082169190828114614de957614de96148dc565b505092915050565b5f6001600160401b03808316818103614b9157614b916148dc565b601f821115611aea57805f5260205f20601f840160051c81016020851015614e315750805b601f840160051c820191505b81811015610a59575f8155600101614e3d565b81516001600160401b03811115614e6957614e69614a2c565b614e7d81614e778454614be5565b84614e0c565b602080601f831160018114614eb0575f8415614e995750858301515b5f19600386901b1c1916600185901b178555614f07565b5f85815260208120601f198616915b82811015614ede57888601518255948401946001909101908401614ebf565b5085821015614efb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215614f1f575f80fd5b611ff682614814565b5f60208284031215614f38575f80fd5b813560ff81168114611ff6575f80fd5b5f60208284031215614f58575f80fd5b8151611ff6816145fc565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614fb881604e860160208901614927565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 47502195f..d355b775d 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -82,8 +82,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614ff0380380614ff083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614ea38061014d5f395ff3fe6080604052600436106101af575f3560e01c806366435abf116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104f8578063c974d1b61461050b578063d5f20ff61461051f578063df93d8de1461054b575f80fd5b8063b771b3bc146104a0578063ba3a4b97146104ba578063bee0a03f146104d9575f80fd5b80638280a25a116100c25780638280a25a1461042f57806393e245981461044357806398f3e2b414610462578063a3a65e4814610481575f80fd5b806366435abf146103de578063732214f8146103fd57806376f7862114610410575f80fd5b806335455ded116101525780635297fae61161012d5780635297fae61461035857806360305d621461037757806361e2f490146103a057806362065856146103bf575f80fd5b806335455ded146102fe57806340034a9314610326578063467ef06f14610339575f80fd5b8063151d30d11161018d578063151d30d11461025057806320e55565146102765780632e2194d814610295578063329c3e12146102cc575f80fd5b80630118acc4146101b35780630322ed98146101d45780630cdd0985146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004614408565b610561565b005b3480156101df575f80fd5b506101d26101ee366004614443565b61098b565b3480156101fe575f80fd5b5061023d61020d366004614443565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b34801561025b575f80fd5b50610264600a81565b60405160ff9091168152602001610247565b348015610281575f80fd5b506101d261029036600461445a565b610afd565b3480156102a0575f80fd5b506102b46102af366004614443565b610bda565b6040516001600160401b039091168152602001610247565b3480156102d7575f80fd5b506102e66001600160991b0181565b6040516001600160a01b039091168152602001610247565b348015610309575f80fd5b5061031361271081565b60405161ffff9091168152602001610247565b61023d610334366004614498565b610bf0565b348015610344575f80fd5b506101d26103533660046144ec565b610c24565b348015610363575f80fd5b506101d2610372366004614505565b610cc5565b348015610382575f80fd5b5061038b601481565b60405163ffffffff9091168152602001610247565b3480156103ab575f80fd5b506101d26103ba36600461452d565b610e3a565b3480156103ca575f80fd5b5061023d6103d936600461457b565b6112be565b3480156103e9575f80fd5b506102b46103f8366004614443565b6112d7565b348015610408575f80fd5b5061023d5f81565b34801561041b575f80fd5b506101d261042a366004614408565b6112eb565b34801561043a575f80fd5b50610264603081565b34801561044e575f80fd5b506101d261045d366004614443565b6114dd565b34801561046d575f80fd5b506101d261047c366004614505565b611598565b34801561048c575f80fd5b506101d261049b3660046144ec565b611871565b3480156104ab575f80fd5b506102e66005600160991b0181565b3480156104c5575f80fd5b506101d26104d4366004614443565b611a00565b3480156104e4575f80fd5b506101d26104f3366004614443565b611bfe565b61023d610506366004614443565b611d28565b348015610516575f80fd5b50610264601481565b34801561052a575f80fd5b5061053e610539366004614443565b611d59565b60405161024791906145a8565b348015610556575f80fd5b506102b46202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260408082208151610100810190925280545f80516020614e1783398151915293929190829060ff1660048111156105c2576105c2614594565b60048111156105d3576105d3614594565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61065782611d59565b905060028351600481111561066e5761066e614594565b1461068c5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106b95760405163e6c4247b60e01b815260040160405180910390fd5b6003835280515f9060029060058111156106d5576106d5614594565b0361072c5786156106ed576106ea8387611e21565b90505b5f84606001518360800151610702919061466b565b905061070e8482611fa5565b506001600160401b0390811660e0870152421660a086015250610760565b505f82815260088501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b600385015460608501516001600160a01b039091169063778c06b590610785906112be565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610802573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610826919061468b565b5f898152600687016020908152604080832093909355600588019052208451815486929190829060ff1916600183600481111561086557610865614594565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610979916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614e778339815191526020526040808220815160e0810190925280545f80516020614e3783398151915293929190829060ff1660058111156109d8576109d8614594565b60058111156109e9576109e9614594565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a5857610a58614594565b14610a765760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a9b8584606001515f6120fc565b6040518263ffffffff1660e01b8152600401610ab791906146c4565b6020604051808303815f875af1158015610ad3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af7919061468b565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b46575080546001600160401b03808416911610155b15610b645760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b8e8361214b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610bea64e8d4a51000836146f6565b92915050565b5f610bf961215f565b610c0584848434612196565b9050610c1d60015f80516020614e5783398151915255565b9392505050565b5f80516020614e178339815191525f80610c3d8461233c565b91509150610c4a82612606565b610c545750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c8357610c83614594565b03610ca8575f83815260078501602052604081208054919055610ca68282612641565b505b610cbe81610cb984604001516112be565b6126a7565b5050505050565b5f80516020614e178339815191525f610cdd846126ba565b90505f80610cee83604001516127ba565b50915091505f610cfd83611d59565b9050816001600160401b031681606001516001600160401b03161080610d4757505f8681526005860160205260409020600201546001600160401b03808416600160c01b90920416115b15610d6557604051633ab3447f60e11b815260040160405180910390fd5b60015f87815260058701602052604090205460ff166004811115610d8b57610d8b614594565b14610da95760405163f95c7fe160e01b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614e378339815191529060ff1615610e8c57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ecf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef3919061468b565b836020013514610f165760405163d040949d60e01b815260040160405180910390fd5b30610f276060850160408601614729565b6001600160a01b031614610f4e5760405163e6c4247b60e01b815260040160405180910390fd5b5f610f5c6060850185614744565b905090505f805b828163ffffffff161015611208575f610f7f6060880188614744565b8363ffffffff16818110610f9557610f95614789565b9050602002810190610fa7919061479d565b610fb09061484d565b80515f8181526008880160205260409020549192509015610fe457604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161101392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261102d916148e4565b602060405180830381855afa158015611048573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061106b919061468b565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156110f7576110f7614594565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111aa9116866148f5565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061120190614908565b9050610f63565b50600483018190555f61121a856126ba565b90505f61122a82604001516129fe565b90505f61123688612b70565b90508160028260405161124991906148e4565b602060405180830381855afa158015611264573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611287919061468b565b146112a557604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610bea6001600160401b03831664e8d4a5100061492a565b5f6112e182611d59565b6080015192915050565b5f80516020614e178339815191525f61130385613009565b905061130e85612606565b611319575050505050565b5f8581526004830160205260409020546001600160a01b031633146113515760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161138091600160b01b90046001600160401b031690614941565b6001600160401b03168160c001516001600160401b031610156113b6576040516302336bad60e51b815260040160405180910390fd5b8315610cbe575f6113c78685611e21565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b590611417906112be565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561148d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114b1919061468b565b5f878152600785016020526040812080549091906114d09084906148f5565b9091555050505050505050565b5f80516020614e178339815191525f6114f583611d59565b905060048151600581111561150c5761150c614594565b1461152a5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146115625760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610af7906001600160a01b031682612641565b6115a061215f565b5f80516020614e178339815191525f6115b8846126ba565b90505f806115c983604001516127ba565b50915091505f6115d883611d59565b5f8781526005870160205260408082208151610100810190925280549394509192909190829060ff16600481111561161257611612614594565b600481111561162357611623614594565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260058f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff19169055908401519192508481169116108061170a5750826001600160401b03168160e001516001600160401b0316115b1561172857604051633ab3447f60e11b815260040160405180910390fd5b60038151600481111561173d5761173d614594565b1461175b5760405163f95c7fe160e01b815260040160405180910390fd5b5f878152600687016020908152604080832080549084905587845260048a019092528220549091906127109061179c90600160a01b900461ffff168461492a565b6117a691906146f6565b905080886007015f8881526020019081526020015f205f8282546117ca91906148f5565b909155505f90506117db8284614961565b90506117eb846020015182612641565b6118008460200151610cb986606001516112be565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611846929190918252602082015260400190565b60405180910390a450505050505050505061186d60015f80516020614e5783398151915255565b5050565b5f80516020614e378339815191525f611889836126ba565b90505f8061189a8360400151613246565b91509150806118bc57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546118d690614974565b90505f036118f757604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561191d5761191d614594565b1461193b5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206119539161435d565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260408082208151610100810190925280545f80516020614e1783398151915293929190829060ff166004811115611a6157611a61614594565b6004811115611a7257611a72614594565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611af957611af9614594565b14158015611b1a5750600381516004811115611b1757611b17614594565b14155b15611b385760405163f95c7fe160e01b815260040160405180910390fd5b5f611b468260400151611d59565b905080606001516001600160401b03165f03611b7557604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611ba28460400151846060015185608001516120fc565b6040518263ffffffff1660e01b8152600401611bbe91906146c4565b6020604051808303815f875af1158015611bda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbe919061468b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614e378339815191529190611c4590614974565b90505f03611c6657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611c8c57611c8c614594565b14611caa5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ce391906004016149a6565b6020604051808303815f875af1158015611cff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d23919061468b565b505050565b5f611d3161215f565b611d3c8233346133e7565b9050611d5460015f80516020614e5783398151915255565b919050565b611d61614394565b5f8281525f80516020614e77833981519152602052604090819020815160e0810190925280545f80516020614e37833981519152929190829060ff166005811115611dae57611dae614594565b6005811115611dbf57611dbf614594565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e6c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e939190810190614a3b565b9150915080611eb557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1c919061468b565b825114611f3c5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611f685760405163e6c4247b60e01b815260040160405180910390fd5b5f80611f7784604001516136d7565b91509150818714611f9b57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e77833981519152602052604081206002015481905f80516020614e3783398151915290600160801b90046001600160401b0316611fed85826138af565b5f611ff787613a78565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6120478a858b6120fc565b6040518263ffffffff1660e01b815260040161206391906146c4565b6020604051808303815f875af115801561207f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a3919061468b565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612153613b08565b61215c81613b53565b50565b5f80516020614e5783398151915280546001190161219057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614e1783398151915290600160401b900461ffff90811690861610806121ea575061271061ffff8616115b156122085760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561223a576040516302336bad60e51b815260040160405180910390fd5b805483108061224c5750806001015483115b1561226a57604051630103be3b60e21b815260040160405180910390fd5b825f61227582610bda565b90505f6122828983613bc1565b905060405180606001604052806122963390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e5783398151915255565b5f612345614394565b5f80516020614e378339815191525f61235d856126ba565b90505f8061236e8360400151613246565b91509150801561239157604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156123c2576123c2614594565b60058111156123d3576123d3614594565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f908251600581111561244457612444614594565b14158015612465575060018251600581111561246257612462614594565b14155b156124835760405163a36c527f60e01b815260040160405180910390fd5b60038251600581111561249857612498614594565b036124a5575060046124a9565b5060055b6020808301515f908152600888019091526040812055818160058111156124d2576124d2614594565b908160058111156124e5576124e5614594565b9052505f84815260078701602052604090208251815484929190829060ff1916600183600581111561251957612519614594565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156125cd576125cd614594565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561268d575f80fd5b505af115801561269f573d5f803e3d5ffd5b505050505050565b61186d6001600160a01b03831682613f9a565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561271e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127459190810190614a3b565b915091508061276757604051636b2f19e960e01b815260040160405180910390fd5b8151156127875760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156127b35760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146127e75760405162461bcd60e51b81526004016127de90614b0d565b60405180910390fd5b5f805b6002811015612836576127fe816001614961565b61280990600861492a565b61ffff1686828151811061281f5761281f614789565b016020015160f81c901b91909117906001016127ea565b5061ffff8116156128595760405162461bcd60e51b81526004016127de90614b56565b5f805b60048110156128b457612870816003614961565b61287b90600861492a565b63ffffffff168761288d8360026148f5565b8151811061289d5761289d614789565b016020015160f81c901b919091179060010161285c565b5063ffffffff81166004146128db5760405162461bcd60e51b81526004016127de90614b99565b5f805b6020811015612930576128f281601f614961565b6128fd90600861492a565b886129098360066148f5565b8151811061291957612919614789565b016020015160f81c901b91909117906001016128de565b505f805b600881101561298f57612948816007614961565b61295390600861492a565b6001600160401b0316896129688360266148f5565b8151811061297857612978614789565b016020015160f81c901b9190911790600101612934565b505f805b60088110156129ee576129a7816007614961565b6129b290600861492a565b6001600160401b03168a6129c783602e6148f5565b815181106129d7576129d7614789565b016020015160f81c901b9190911790600101612993565b5091989097509095509350505050565b5f8151602614612a205760405162461bcd60e51b81526004016127de90614b0d565b5f805b6002811015612a6f57612a37816001614961565b612a4290600861492a565b61ffff16848281518110612a5857612a58614789565b016020015160f81c901b9190911790600101612a23565b5061ffff811615612a925760405162461bcd60e51b81526004016127de90614b56565b5f805b6004811015612aed57612aa9816003614961565b612ab490600861492a565b63ffffffff1685612ac68360026148f5565b81518110612ad657612ad6614789565b016020015160f81c901b9190911790600101612a95565b5063ffffffff811615612b125760405162461bcd60e51b81526004016127de90614b99565b5f805b6020811015612b6757612b2981601f614961565b612b3490600861492a565b86612b408360066148f5565b81518110612b5057612b50614789565b016020015160f81c901b9190911790600101612b15565b50949350505050565b60605f612b7f83830184614744565b612b8b9150605861492a565b612b9690605c6148f5565b6001600160401b03811115612bad57612bad6147bb565b6040519080825280601f01601f191660200182016040528015612bd7576020820181803683370190505b5090505f5b6020811015612c2c5783358160208110612bf857612bf8614789565b1a60f81b828281518110612c0e57612c0e614789565b60200101906001600160f81b03191690815f1a905350600101612bdc565b505f5b6020811015612c8c5783602001358160208110612c4e57612c4e614789565b1a60f81b82612c5e8360206148f5565b81518110612c6e57612c6e614789565b60200101906001600160f81b03191690815f1a905350600101612c2f565b505f5b6004811015612cef57612ca3816003614961565b612cae90600861492a565b6014901c60f81b82612cc18360406148f5565b81518110612cd157612cd1614789565b60200101906001600160f81b03191690815f1a905350600101612c8f565b505f612d016060850160408601614729565b60601b90505f5b6014811015612d6157818160148110612d2357612d23614789565b1a60f81b83612d338360446148f5565b81518110612d4357612d43614789565b60200101906001600160f81b03191690815f1a905350600101612d08565b505f612d706060860186614744565b905090505f5b6004811015612ddb57612d8a816003614961565b612d9590600861492a565b63ffffffff8316901c60f81b84612dad8360586148f5565b81518110612dbd57612dbd614789565b60200101906001600160f81b03191690815f1a905350600101612d76565b505f5b612deb6060870187614744565b9050811015612fff575f612e0082605861492a565b612e0b90605c6148f5565b90505f5b6020811015612e9657612e256060890189614744565b84818110612e3557612e35614789565b9050602002810190612e47919061479d565b358160208110612e5957612e59614789565b1a60f81b86612e6883856148f5565b81518110612e7857612e78614789565b60200101906001600160f81b03191690815f1a905350600101612e0f565b505f5b6008811015612f4b57612ead816007614961565b612eb890600861492a565b612ec560608a018a614744565b85818110612ed557612ed5614789565b9050602002810190612ee7919061479d565b612ef890604081019060200161457b565b6001600160401b0316901c60f81b8682612f138560206148f5565b612f1d91906148f5565b81518110612f2d57612f2d614789565b60200101906001600160f81b03191690815f1a905350600101612e99565b505f5b6030811015612ff557612f646060890189614744565b84818110612f7457612f74614789565b9050602002810190612f86919061479d565b612f94906040810190614be0565b82818110612fa457612fa4614789565b9050013560f81c60f81b8682846028612fbd91906148f5565b612fc791906148f5565b81518110612fd757612fd7614789565b60200101906001600160f81b03191690815f1a905350600101612f4e565b5050600101612dde565b5091949350505050565b613011614394565b5f8281525f80516020614e778339815191526020526040808220815160e0810190925280545f80516020614e3783398151915293929190829060ff16600581111561305e5761305e614594565b600581111561306f5761306f614594565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156130e1576130e1614594565b146130ff5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561314357613143614594565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131ef8582611fa5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146132695760405162461bcd60e51b81526004016127de90614b0d565b5f805b60028110156132b857613280816001614961565b61328b90600861492a565b61ffff168582815181106132a1576132a1614789565b016020015160f81c901b919091179060010161326c565b5061ffff8116156132db5760405162461bcd60e51b81526004016127de90614b56565b5f805b6004811015613336576132f2816003614961565b6132fd90600861492a565b63ffffffff168661330f8360026148f5565b8151811061331f5761331f614789565b016020015160f81c901b91909117906001016132de565b5063ffffffff811660031461335d5760405162461bcd60e51b81526004016127de90614b99565b5f805b60208110156133b25761337481601f614961565b61337f90600861492a565b8761338b8360066148f5565b8151811061339b5761339b614789565b016020015160f81c901b9190911790600101613360565b505f866026815181106133c7576133c7614789565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614e178339815191528161340084610bda565b90505f61340c87611d59565b905061341787612606565b61343457604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561344957613449614594565b146134675760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516134789190614941565b905083600201600a9054906101000a90046001600160401b031682604001516134a19190614c22565b6001600160401b0316816001600160401b031611156134d357604051630c192e7760e41b815260040160405180910390fd5b5f806134df8a84611fa5565b915091505f8a8360405160200161350d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260058b01909152902081518154829060ff191660018360048111156135a8576135a8614594565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146136fa5760405162461bcd60e51b81526004016127de90614b0d565b5f805b600281101561374957613711816001614961565b61371c90600861492a565b61ffff1685828151811061373257613732614789565b016020015160f81c901b91909117906001016136fd565b5061ffff81161561376c5760405162461bcd60e51b81526004016127de90614b56565b5f805b60048110156137c757613783816003614961565b61378e90600861492a565b63ffffffff16866137a08360026148f5565b815181106137b0576137b0614789565b016020015160f81c901b919091179060010161376f565b5063ffffffff81166005146137ee5760405162461bcd60e51b81526004016127de90614b99565b5f805b60208110156138435761380581601f614961565b61381090600861492a565b8761381c8360066148f5565b8151811061382c5761382c614789565b016020015160f81c901b91909117906001016137f1565b505f805b60088110156138a25761385b816007614961565b61386690600861492a565b6001600160401b03168861387b8360266148f5565b8151811061388b5761388b614789565b016020015160f81c901b9190911790600101613847565b5090969095509350505050565b5f80516020614e378339815191525f6001600160401b0380841690851611156138e3576138dc838561466b565b90506138f0565b6138ed848461466b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061395257506001840154815161394e916001600160401b0316906148f5565b8210155b15613978576001600160401b038316606082015281815260408101516020820152613997565b828160600181815161398a9190614941565b6001600160401b03169052505b60608101516139a7906064614c22565b602082015160018601546001600160401b0392909216916139d29190600160401b900460ff1661492a565b10156139f15760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613a0c91906148f5565b9052506040810180516001600160401b0387169190613a2c908390614961565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e778339815191526020526040812060020180545f80516020614e3783398151915291600160401b9091046001600160401b0316906008613ac283614c4d565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613b5157604051631afcd79f60e31b815260040160405180910390fd5b565b613b5b613b08565b613b648161402d565b613b6c614046565b61215c60608201356080830135613b8960c0850160a0860161457b565b613b9960e0860160c08701614c68565b613baa610100870160e08801614c81565b613bbc61012088016101008901614729565b614056565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613c0557604051637fab81e560e01b815260040160405180910390fd5b5f80516020614e3783398151915242613c24604086016020870161457b565b6001600160401b0316111580613c5e5750613c426202a300426148f5565b613c52604086016020870161457b565b6001600160401b031610155b15613c7b5760405162d36c8560e81b815260040160405180910390fd5b6030613c8a6040860186614be0565b9050141580613c9857508335155b15613cb65760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613ce657604051630eb0d31360e11b815260040160405180910390fd5b613cf0835f6138af565b5f80613d896040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613d34919061457b565b6001600160401b03168152602001613d4f60408a018a614be0565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614177565b5f82815260068601602052604090209193509150613da78282614ce5565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613dd49085906004016146c4565b6020604051808303815f875af1158015613df0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e14919061468b565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e8c57613e8c614594565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f6c918e01908e0161457b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613fbd5760405163cd78605960e01b81523060048201526024016127de565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614006576040519150601f19603f3d011682016040523d82523d5f602084013e61400b565b606091505b5050905080611d2357604051630a12f52160e11b815260040160405180910390fd5b614035613b08565b61403d61427b565b61215c81614283565b61404e613b08565b613b51614355565b61405e613b08565b5f80516020614e1783398151915261ffff84161580614082575061271061ffff8516115b156140a05760405163c98d73a760e01b815260040160405180910390fd5b858711156140c157604051630103be3b60e21b815260040160405180910390fd5b60ff831615806140d45750600a60ff8416115b156140f2576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146141e15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016127de565b5f806001855f015186602001518760400151886080015189606001516040516020016142139796959493929190614da0565b604051602081830303815290604052905060028160405161423491906148e4565b602060405180830381855afa15801561424f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614272919061468b565b94909350915050565b613b51613b08565b61428b613b08565b80355f80516020614e3783398151915290815560146142b06060840160408501614c81565b60ff1611806142cf57506142ca6060830160408401614c81565b60ff16155b156142ed5760405163b4fa3fb360e01b815260040160405180910390fd5b6142fd6060830160408401614c81565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561432e604083016020840161457b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612329613b08565b50805461436990614974565b5f825580601f10614378575050565b601f0160209004905f5260205f209081019061215c91906143d0565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156143e4575f81556001016143d1565b5090565b801515811461215c575f80fd5b803563ffffffff81168114611d54575f80fd5b5f805f6060848603121561441a575f80fd5b83359250602084013561442c816143e8565b915061443a604085016143f5565b90509250925092565b5f60208284031215614453575f80fd5b5035919050565b5f610120828403121561446b575f80fd5b50919050565b803561ffff81168114611d54575f80fd5b80356001600160401b0381168114611d54575f80fd5b5f805f606084860312156144aa575f80fd5b83356001600160401b038111156144bf575f80fd5b8401606081870312156144d0575f80fd5b92506144de60208501614471565b915061443a60408501614482565b5f602082840312156144fc575f80fd5b610c1d826143f5565b5f8060408385031215614516575f80fd5b61451f836143f5565b946020939093013593505050565b5f806040838503121561453e575f80fd5b82356001600160401b03811115614553575f80fd5b830160808186031215614564575f80fd5b9150614572602084016143f5565b90509250929050565b5f6020828403121561458b575f80fd5b610c1d82614482565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106145cb57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161460660608401826001600160401b03169052565b50608083015161462160808401826001600160401b03169052565b5060a083015161463c60a08401826001600160401b03169052565b5060c08301516127b360c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156127b3576127b3614657565b5f6020828403121561469b575f80fd5b5051919050565b5f5b838110156146bc5781810151838201526020016146a4565b50505f910152565b602081525f82518060208401526146e28160408501602087016146a2565b601f01601f19169190910160400192915050565b5f8261471057634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b038116811461215c575f80fd5b5f60208284031215614739575f80fd5b8135610c1d81614715565b5f808335601e19843603018112614759575f80fd5b8301803591506001600160401b03821115614772575f80fd5b6020019150600581901b36038213156120f5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126147b1575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156147f1576147f16147bb565b60405290565b604051601f8201601f191681016001600160401b038111828210171561481f5761481f6147bb565b604052919050565b5f6001600160401b0382111561483f5761483f6147bb565b50601f01601f191660200190565b5f6060823603121561485d575f80fd5b6148656147cf565b823581526020614876818501614482565b8183015260408401356001600160401b03811115614892575f80fd5b840136601f8201126148a2575f80fd5b80356148b56148b082614827565b6147f7565b81815236848385010111156148c8575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516147b18184602087016146a2565b80820180821115610bea57610bea614657565b5f63ffffffff80831681810361492057614920614657565b6001019392505050565b8082028115828204841417610bea57610bea614657565b6001600160401b038181168382160190808211156127b3576127b3614657565b81810381811115610bea57610bea614657565b600181811c9082168061498857607f821691505b60208210810361446b57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f84546149b881614974565b806020870152604060018084165f81146149d957600181146149f557614a22565b60ff19851660408a0152604084151560051b8a01019550614a22565b895f5260205f205f5b85811015614a195781548b82018601529083019088016149fe565b8a016040019650505b509398975050505050505050565b8051611d54816143e8565b5f8060408385031215614a4c575f80fd5b82516001600160401b0380821115614a62575f80fd5b9084019060608287031215614a75575f80fd5b614a7d6147cf565b82518152602080840151614a9081614715565b82820152604084015183811115614aa5575f80fd5b80850194505087601f850112614ab9575f80fd5b83519250614ac96148b084614827565b8381528882858701011115614adc575f80fd5b614aeb848383018488016146a2565b80604084015250819550614b00818801614a30565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112614bf5575f80fd5b8301803591506001600160401b03821115614c0e575f80fd5b6020019150368190038213156120f5575f80fd5b6001600160401b03818116838216028082169190828114614c4557614c45614657565b505092915050565b5f6001600160401b0380831681810361492057614920614657565b5f60208284031215614c78575f80fd5b610c1d82614471565b5f60208284031215614c91575f80fd5b813560ff81168114610c1d575f80fd5b601f821115611d2357805f5260205f20601f840160051c81016020851015614cc65750805b601f840160051c820191505b81811015610cbe575f8155600101614cd2565b81516001600160401b03811115614cfe57614cfe6147bb565b614d1281614d0c8454614974565b84614ca1565b602080601f831160018114614d45575f8415614d2e5750858301515b5f19600386901b1c1916600185901b17855561269f565b5f85815260208120601f198616915b82811015614d7357888601518255948401946001909101908401614d54565b5085821015614d9057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614df581604e8601602089016146a2565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"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\":\"resendUpdateDelegation\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614ee3380380614ee383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614d968061014d5f395ff3fe6080604052600436106101af575f3560e01c806366435abf116100e7578063b771b3bc11610087578063c599e24f11610062578063c599e24f146104f8578063c974d1b61461050b578063d5f20ff61461051f578063df93d8de1461054b575f80fd5b8063b771b3bc146104a0578063ba3a4b97146104ba578063bee0a03f146104d9575f80fd5b80638280a25a116100c25780638280a25a1461042f57806393e245981461044357806398f3e2b414610462578063a3a65e4814610481575f80fd5b806366435abf146103de578063732214f8146103fd57806376f7862114610410575f80fd5b806335455ded116101525780635297fae61161012d5780635297fae61461035857806360305d621461037757806361e2f490146103a057806362065856146103bf575f80fd5b806335455ded146102fe57806340034a9314610326578063467ef06f14610339575f80fd5b8063151d30d11161018d578063151d30d11461025057806320e55565146102765780632e2194d814610295578063329c3e12146102cc575f80fd5b80630118acc4146101b35780630322ed98146101d45780630cdd0985146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd3660046143ce565b610561565b005b3480156101df575f80fd5b506101d26101ee366004614409565b61098b565b3480156101fe575f80fd5b5061023d61020d366004614409565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b34801561025b575f80fd5b50610264600a81565b60405160ff9091168152602001610247565b348015610281575f80fd5b506101d2610290366004614420565b610afd565b3480156102a0575f80fd5b506102b46102af366004614409565b610bda565b6040516001600160401b039091168152602001610247565b3480156102d7575f80fd5b506102e66001600160991b0181565b6040516001600160a01b039091168152602001610247565b348015610309575f80fd5b5061031361271081565b60405161ffff9091168152602001610247565b61023d61033436600461445e565b610bf0565b348015610344575f80fd5b506101d26103533660046144b2565b610c24565b348015610363575f80fd5b506101d26103723660046144cb565b610cc5565b348015610382575f80fd5b5061038b601481565b60405163ffffffff9091168152602001610247565b3480156103ab575f80fd5b506101d26103ba3660046144f3565b610e3a565b3480156103ca575f80fd5b5061023d6103d9366004614541565b6112be565b3480156103e9575f80fd5b506102b46103f8366004614409565b6112d7565b348015610408575f80fd5b5061023d5f81565b34801561041b575f80fd5b506101d261042a3660046143ce565b6112eb565b34801561043a575f80fd5b50610264603081565b34801561044e575f80fd5b506101d261045d366004614409565b6114dd565b34801561046d575f80fd5b506101d261047c3660046144cb565b611598565b34801561048c575f80fd5b506101d261049b3660046144b2565b611871565b3480156104ab575f80fd5b506102e66005600160991b0181565b3480156104c5575f80fd5b506101d26104d4366004614409565b611a00565b3480156104e4575f80fd5b506101d26104f3366004614409565b611bfe565b61023d610506366004614409565b611d28565b348015610516575f80fd5b50610264601481565b34801561052a575f80fd5b5061053e610539366004614409565b611d59565b604051610247919061456e565b348015610556575f80fd5b506102b46202a30081565b5f8381527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260408082208151610100810190925280545f80516020614d0a83398151915293929190829060ff1660048111156105c2576105c261455a565b60048111156105d3576105d361455a565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61065782611d59565b905060028351600481111561066e5761066e61455a565b1461068c5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106b95760405163e6c4247b60e01b815260040160405180910390fd5b6003835280515f9060029060058111156106d5576106d561455a565b0361072c5786156106ed576106ea8387611e21565b90505b5f846060015183608001516107029190614631565b905061070e8482611fa5565b506001600160401b0390811660e0870152421660a086015250610760565b505f82815260088501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b600385015460608501516001600160a01b039091169063778c06b590610785906112be565b60a0808601516080890151918901516040516001600160e01b031960e087901b16815260048101949094526001600160401b03918216602485015291811660448401529081166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610802573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108269190614651565b5f898152600687016020908152604080832093909355600588019052208451815486929190829060ff191660018360048111156108655761086561455a565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6991610979916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f80516020614d6a8339815191526020526040808220815160e0810190925280545f80516020614d2a83398151915293929190829060ff1660058111156109d8576109d861455a565b60058111156109e9576109e961455a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a5857610a5861455a565b14610a765760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a9b8584606001515f6120fc565b6040518263ffffffff1660e01b8152600401610ab7919061468a565b6020604051808303815f875af1158015610ad3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af79190614651565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b46575080546001600160401b03808416911610155b15610b645760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b8e8361214b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610bea64e8d4a51000836146bc565b92915050565b5f610bf961215f565b610c0584848434612196565b9050610c1d60015f80516020614d4a83398151915255565b9392505050565b5f80516020614d0a8339815191525f80610c3d8461233c565b91509150610c4a82612606565b610c545750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c8357610c8361455a565b03610ca8575f83815260078501602052604081208054919055610ca68282612641565b505b610cbe81610cb984604001516112be565b6126a7565b5050505050565b5f80516020614d0a8339815191525f610cdd846126ba565b90505f80610cee83604001516127ba565b50915091505f610cfd83611d59565b9050816001600160401b031681606001516001600160401b03161080610d4757505f8681526005860160205260409020600201546001600160401b03808416600160c01b90920416115b15610d6557604051633ab3447f60e11b815260040160405180910390fd5b60015f87815260058701602052604090205460ff166004811115610d8b57610d8b61455a565b14610da95760405163f95c7fe160e01b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352841691859189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614d2a8339815191529060ff1615610e8c57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ecf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef39190614651565b836020013514610f165760405163d040949d60e01b815260040160405180910390fd5b30610f2760608501604086016146ef565b6001600160a01b031614610f4e5760405163e6c4247b60e01b815260040160405180910390fd5b5f610f5c606085018561470a565b905090505f805b828163ffffffff161015611208575f610f7f606088018861470a565b8363ffffffff16818110610f9557610f9561474f565b9050602002810190610fa79190614763565b610fb090614813565b80515f8181526008880160205260409020549192509015610fe457604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161101392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261102d916148aa565b602060405180830381855afa158015611048573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061106b9190614651565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156110f7576110f761455a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111aa9116866148bb565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611201906148ce565b9050610f63565b50600483018190555f61121a856126ba565b90505f61122a82604001516129f8565b90505f61123688612b6d565b90508160028260405161124991906148aa565b602060405180830381855afa158015611264573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112879190614651565b146112a557604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610bea6001600160401b03831664e8d4a510006148f0565b5f6112e182611d59565b6080015192915050565b5f80516020614d0a8339815191525f61130385613006565b905061130e85612606565b611319575050505050565b5f8581526004830160205260409020546001600160a01b031633146113515760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161138091600160b01b90046001600160401b031690614907565b6001600160401b03168160c001516001600160401b031610156113b6576040516302336bad60e51b815260040160405180910390fd5b8315610cbe575f6113c78685611e21565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b590611417906112be565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561148d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114b19190614651565b5f878152600785016020526040812080549091906114d09084906148bb565b9091555050505050505050565b5f80516020614d0a8339815191525f6114f583611d59565b905060048151600581111561150c5761150c61455a565b1461152a5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146115625760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610af7906001600160a01b031682612641565b6115a061215f565b5f80516020614d0a8339815191525f6115b8846126ba565b90505f806115c983604001516127ba565b50915091505f6115d883611d59565b5f8781526005870160205260408082208151610100810190925280549394509192909190829060ff1660048111156116125761161261455a565b60048111156116235761162361455a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b03808216606080890191909152600160401b830482166080890152600160801b8304821660a0890152600160c01b909204811660c0880152600397880154811660e0909701969096525f8f815260058f0190955291842080546001600160a81b0319168155928301849055820192909255909201805467ffffffffffffffff19169055908401519192508481169116108061170a5750826001600160401b03168160e001516001600160401b0316115b1561172857604051633ab3447f60e11b815260040160405180910390fd5b60038151600481111561173d5761173d61455a565b1461175b5760405163f95c7fe160e01b815260040160405180910390fd5b5f878152600687016020908152604080832080549084905587845260048a019092528220549091906127109061179c90600160a01b900461ffff16846148f0565b6117a691906146bc565b905080886007015f8881526020019081526020015f205f8282546117ca91906148bb565b909155505f90506117db8284614927565b90506117eb846020015182612641565b6118008460200151610cb986606001516112be565b856001600160401b0316878b7f9cc4dec6f77ce74cf7d565971195f01393686ba1a6df96b64f20d4ce571d50338486604051611846929190918252602082015260400190565b60405180910390a450505050505050505061186d60015f80516020614d4a83398151915255565b5050565b5f80516020614d2a8339815191525f611889836126ba565b90505f8061189a8360400151613243565b91509150806118bc57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546118d69061493a565b90505f036118f757604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561191d5761191d61455a565b1461193b5760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061195391614323565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260408082208151610100810190925280545f80516020614d0a83398151915293929190829060ff166004811115611a6157611a6161455a565b6004811115611a7257611a7261455a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115611af957611af961455a565b14158015611b1a5750600381516004811115611b1757611b1761455a565b14155b15611b385760405163f95c7fe160e01b815260040160405180910390fd5b5f611b468260400151611d59565b905080606001516001600160401b03165f03611b7557604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611ba28460400151846060015185608001516120fc565b6040518263ffffffff1660e01b8152600401611bbe919061468a565b6020604051808303815f875af1158015611bda573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cbe9190614651565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614d2a8339815191529190611c459061493a565b90505f03611c6657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611c8c57611c8c61455a565b14611caa5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ce3919060040161496c565b6020604051808303815f875af1158015611cff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d239190614651565b505050565b5f611d3161215f565b611d3c8233346133e7565b9050611d5460015f80516020614d4a83398151915255565b919050565b611d6161435a565b5f8281525f80516020614d6a833981519152602052604090819020815160e0810190925280545f80516020614d2a833981519152929190829060ff166005811115611dae57611dae61455a565b6005811115611dbf57611dbf61455a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611e6c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e939190810190614a01565b9150915080611eb557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ef8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f1c9190614651565b825114611f3c5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611f685760405163e6c4247b60e01b815260040160405180910390fd5b5f80611f7784604001516136d7565b91509150818714611f9b57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614d6a833981519152602052604081206002015481905f80516020614d2a83398151915290600160801b90046001600160401b0316611fed85826138b2565b5f611ff787613a7b565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6120478a858b6120fc565b6040518263ffffffff1660e01b8152600401612063919061468a565b6020604051808303815f875af115801561207f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120a39190614651565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612153613b0b565b61215c81613b56565b50565b5f80516020614d4a83398151915280546001190161219057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614d0a83398151915290600160401b900461ffff90811690861610806121ea575061271061ffff8616115b156122085760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561223a576040516302336bad60e51b815260040160405180910390fd5b805483108061224c5750806001015483115b1561226a57604051630103be3b60e21b815260040160405180910390fd5b825f61227582610bda565b90505f6122828983613bc4565b905060405180606001604052806122963390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614d4a83398151915255565b5f61234561435a565b5f80516020614d2a8339815191525f61235d856126ba565b90505f8061236e8360400151613243565b91509150801561239157604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156123c2576123c261455a565b60058111156123d3576123d361455a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f90825160058111156124445761244461455a565b1415801561246557506001825160058111156124625761246261455a565b14155b156124835760405163a36c527f60e01b815260040160405180910390fd5b6003825160058111156124985761249861455a565b036124a5575060046124a9565b5060055b6020808301515f908152600888019091526040812055818160058111156124d2576124d261455a565b908160058111156124e5576124e561455a565b9052505f84815260078701602052604090208251815484929190829060ff191660018360058111156125195761251961455a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055815160058111156125cd576125cd61455a565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561268d575f80fd5b505af115801561269f573d5f803e3d5ffd5b505050505050565b61186d6001600160a01b03831682613f9d565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561271e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526127459190810190614a01565b915091508061276757604051636b2f19e960e01b815260040160405180910390fd5b8151156127875760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156127b35760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146127df57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561282e576127f6816001614927565b6128019060086148f0565b61ffff168682815181106128175761281761474f565b016020015160f81c901b91909117906001016127e2565b5061ffff8116156128525760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156128ad57612869816003614927565b6128749060086148f0565b63ffffffff16876128868360026148bb565b815181106128965761289661474f565b016020015160f81c901b9190911790600101612855565b5063ffffffff81166004146128d557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561292a576128ec81601f614927565b6128f79060086148f0565b886129038360066148bb565b815181106129135761291361474f565b016020015160f81c901b91909117906001016128d8565b505f805b600881101561298957612942816007614927565b61294d9060086148f0565b6001600160401b0316896129628360266148bb565b815181106129725761297261474f565b016020015160f81c901b919091179060010161292e565b505f805b60088110156129e8576129a1816007614927565b6129ac9060086148f0565b6001600160401b03168a6129c183602e6148bb565b815181106129d1576129d161474f565b016020015160f81c901b919091179060010161298d565b5091989097509095509350505050565b5f8151602614612a1b57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612a6a57612a32816001614927565b612a3d9060086148f0565b61ffff16848281518110612a5357612a5361474f565b016020015160f81c901b9190911790600101612a1e565b5061ffff811615612a8e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612ae957612aa5816003614927565b612ab09060086148f0565b63ffffffff1685612ac28360026148bb565b81518110612ad257612ad261474f565b016020015160f81c901b9190911790600101612a91565b5063ffffffff811615612b0f57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612b6457612b2681601f614927565b612b319060086148f0565b86612b3d8360066148bb565b81518110612b4d57612b4d61474f565b016020015160f81c901b9190911790600101612b12565b50949350505050565b60605f612b7c8383018461470a565b612b88915060586148f0565b612b9390605c6148bb565b6001600160401b03811115612baa57612baa614781565b6040519080825280601f01601f191660200182016040528015612bd4576020820181803683370190505b5090505f5b6020811015612c295783358160208110612bf557612bf561474f565b1a60f81b828281518110612c0b57612c0b61474f565b60200101906001600160f81b03191690815f1a905350600101612bd9565b505f5b6020811015612c895783602001358160208110612c4b57612c4b61474f565b1a60f81b82612c5b8360206148bb565b81518110612c6b57612c6b61474f565b60200101906001600160f81b03191690815f1a905350600101612c2c565b505f5b6004811015612cec57612ca0816003614927565b612cab9060086148f0565b6014901c60f81b82612cbe8360406148bb565b81518110612cce57612cce61474f565b60200101906001600160f81b03191690815f1a905350600101612c8c565b505f612cfe60608501604086016146ef565b60601b90505f5b6014811015612d5e57818160148110612d2057612d2061474f565b1a60f81b83612d308360446148bb565b81518110612d4057612d4061474f565b60200101906001600160f81b03191690815f1a905350600101612d05565b505f612d6d606086018661470a565b905090505f5b6004811015612dd857612d87816003614927565b612d929060086148f0565b63ffffffff8316901c60f81b84612daa8360586148bb565b81518110612dba57612dba61474f565b60200101906001600160f81b03191690815f1a905350600101612d73565b505f5b612de8606087018761470a565b9050811015612ffc575f612dfd8260586148f0565b612e0890605c6148bb565b90505f5b6020811015612e9357612e22606089018961470a565b84818110612e3257612e3261474f565b9050602002810190612e449190614763565b358160208110612e5657612e5661474f565b1a60f81b86612e6583856148bb565b81518110612e7557612e7561474f565b60200101906001600160f81b03191690815f1a905350600101612e0c565b505f5b6008811015612f4857612eaa816007614927565b612eb59060086148f0565b612ec260608a018a61470a565b85818110612ed257612ed261474f565b9050602002810190612ee49190614763565b612ef5906040810190602001614541565b6001600160401b0316901c60f81b8682612f108560206148bb565b612f1a91906148bb565b81518110612f2a57612f2a61474f565b60200101906001600160f81b03191690815f1a905350600101612e96565b505f5b6030811015612ff257612f61606089018961470a565b84818110612f7157612f7161474f565b9050602002810190612f839190614763565b612f91906040810190614ad3565b82818110612fa157612fa161474f565b9050013560f81c60f81b8682846028612fba91906148bb565b612fc491906148bb565b81518110612fd457612fd461474f565b60200101906001600160f81b03191690815f1a905350600101612f4b565b5050600101612ddb565b5091949350505050565b61300e61435a565b5f8281525f80516020614d6a8339815191526020526040808220815160e0810190925280545f80516020614d2a83398151915293929190829060ff16600581111561305b5761305b61455a565b600581111561306c5761306c61455a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156130de576130de61455a565b146130fc5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156131405761314061455a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6131ec8582611fa5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461326757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156132b65761327e816001614927565b6132899060086148f0565b61ffff1685828151811061329f5761329f61474f565b016020015160f81c901b919091179060010161326a565b5061ffff8116156132da5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613335576132f1816003614927565b6132fc9060086148f0565b63ffffffff168661330e8360026148bb565b8151811061331e5761331e61474f565b016020015160f81c901b91909117906001016132dd565b5063ffffffff811660031461335d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156133b25761337481601f614927565b61337f9060086148f0565b8761338b8360066148bb565b8151811061339b5761339b61474f565b016020015160f81c901b9190911790600101613360565b505f866026815181106133c7576133c761474f565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614d0a8339815191528161340084610bda565b90505f61340c87611d59565b905061341787612606565b61343457604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156134495761344961455a565b146134675760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516134789190614907565b905083600201600a9054906101000a90046001600160401b031682604001516134a19190614b15565b6001600160401b0316816001600160401b031611156134d357604051630c192e7760e41b815260040160405180910390fd5b5f806134df8a84611fa5565b915091505f8a8360405160200161350d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260058b01909152902081518154829060ff191660018360048111156135a8576135a861455a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146136fb57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561374a57613712816001614927565b61371d9060086148f0565b61ffff168582815181106137335761373361474f565b016020015160f81c901b91909117906001016136fe565b5061ffff81161561376e5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137c957613785816003614927565b6137909060086148f0565b63ffffffff16866137a28360026148bb565b815181106137b2576137b261474f565b016020015160f81c901b9190911790600101613771565b5063ffffffff81166005146137f157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138465761380881601f614927565b6138139060086148f0565b8761381f8360066148bb565b8151811061382f5761382f61474f565b016020015160f81c901b91909117906001016137f4565b505f805b60088110156138a55761385e816007614927565b6138699060086148f0565b6001600160401b03168861387e8360266148bb565b8151811061388e5761388e61474f565b016020015160f81c901b919091179060010161384a565b5090969095509350505050565b5f80516020614d2a8339815191525f6001600160401b0380841690851611156138e6576138df8385614631565b90506138f3565b6138f08484614631565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613955575060018401548151613951916001600160401b0316906148bb565b8210155b1561397b576001600160401b03831660608201528181526040810151602082015261399a565b828160600181815161398d9190614907565b6001600160401b03169052505b60608101516139aa906064614b15565b602082015160018601546001600160401b0392909216916139d59190600160401b900460ff166148f0565b10156139f45760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613a0f91906148bb565b9052506040810180516001600160401b0387169190613a2f908390614927565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614d6a8339815191526020526040812060020180545f80516020614d2a83398151915291600160401b9091046001600160401b0316906008613ac583614b40565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613b5457604051631afcd79f60e31b815260040160405180910390fd5b565b613b5e613b0b565b613b6781614034565b613b6f61404d565b61215c60608201356080830135613b8c60c0850160a08601614541565b613b9c60e0860160c08701614b5b565b613bad610100870160e08801614b74565b613bbf610120880161010089016146ef565b61405d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613c0857604051637fab81e560e01b815260040160405180910390fd5b5f80516020614d2a83398151915242613c276040860160208701614541565b6001600160401b0316111580613c615750613c456202a300426148bb565b613c556040860160208701614541565b6001600160401b031610155b15613c7e5760405162d36c8560e81b815260040160405180910390fd5b6030613c8d6040860186614ad3565b9050141580613c9b57508335155b15613cb95760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613ce957604051630eb0d31360e11b815260040160405180910390fd5b613cf3835f6138b2565b5f80613d8c6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613d379190614541565b6001600160401b03168152602001613d5260408a018a614ad3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061417e565b5f82815260068601602052604090209193509150613daa8282614bd8565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90613dd790859060040161468a565b6020604051808303815f875af1158015613df3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e179190614651565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e8f57613e8f61455a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f6f918e01908e01614541565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613fc45760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461400d576040519150601f19603f3d011682016040523d82523d5f602084013e614012565b606091505b5050905080611d2357604051630a12f52160e11b815260040160405180910390fd5b61403c613b0b565b614044614241565b61215c81614249565b614055613b0b565b613b5461431b565b614065613b0b565b5f80516020614d0a83398151915261ffff84161580614089575061271061ffff8516115b156140a75760405163c98d73a760e01b815260040160405180910390fd5b858711156140c857604051630103be3b60e21b815260040160405180910390fd5b60ff831615806140db5750600a60ff8416115b156140f9576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146141a757604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016141d99796959493929190614c93565b60405160208183030381529060405290506002816040516141fa91906148aa565b602060405180830381855afa158015614215573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142389190614651565b94909350915050565b613b54613b0b565b614251613b0b565b80355f80516020614d2a83398151915290815560146142766060840160408501614b74565b60ff16118061429557506142906060830160408401614b74565b60ff16155b156142b35760405163b4fa3fb360e01b815260040160405180910390fd5b6142c36060830160408401614b74565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556142f46040830160208401614541565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612329613b0b565b50805461432f9061493a565b5f825580601f1061433e575050565b601f0160209004905f5260205f209081019061215c9190614396565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156143aa575f8155600101614397565b5090565b801515811461215c575f80fd5b803563ffffffff81168114611d54575f80fd5b5f805f606084860312156143e0575f80fd5b8335925060208401356143f2816143ae565b9150614400604085016143bb565b90509250925092565b5f60208284031215614419575f80fd5b5035919050565b5f6101208284031215614431575f80fd5b50919050565b803561ffff81168114611d54575f80fd5b80356001600160401b0381168114611d54575f80fd5b5f805f60608486031215614470575f80fd5b83356001600160401b03811115614485575f80fd5b840160608187031215614496575f80fd5b92506144a460208501614437565b915061440060408501614448565b5f602082840312156144c2575f80fd5b610c1d826143bb565b5f80604083850312156144dc575f80fd5b6144e5836143bb565b946020939093013593505050565b5f8060408385031215614504575f80fd5b82356001600160401b03811115614519575f80fd5b83016080818603121561452a575f80fd5b9150614538602084016143bb565b90509250929050565b5f60208284031215614551575f80fd5b610c1d82614448565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061459157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516145cc60608401826001600160401b03169052565b5060808301516145e760808401826001600160401b03169052565b5060a083015161460260a08401826001600160401b03169052565b5060c08301516127b360c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156127b3576127b361461d565b5f60208284031215614661575f80fd5b5051919050565b5f5b8381101561468257818101518382015260200161466a565b50505f910152565b602081525f82518060208401526146a8816040850160208701614668565b601f01601f19169190910160400192915050565b5f826146d657634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b038116811461215c575f80fd5b5f602082840312156146ff575f80fd5b8135610c1d816146db565b5f808335601e1984360301811261471f575f80fd5b8301803591506001600160401b03821115614738575f80fd5b6020019150600581901b36038213156120f5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614777575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156147b7576147b7614781565b60405290565b604051601f8201601f191681016001600160401b03811182821017156147e5576147e5614781565b604052919050565b5f6001600160401b0382111561480557614805614781565b50601f01601f191660200190565b5f60608236031215614823575f80fd5b61482b614795565b82358152602061483c818501614448565b8183015260408401356001600160401b03811115614858575f80fd5b840136601f820112614868575f80fd5b803561487b614876826147ed565b6147bd565b818152368483850101111561488e575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614777818460208701614668565b80820180821115610bea57610bea61461d565b5f63ffffffff8083168181036148e6576148e661461d565b6001019392505050565b8082028115828204841417610bea57610bea61461d565b6001600160401b038181168382160190808211156127b3576127b361461d565b81810381811115610bea57610bea61461d565b600181811c9082168061494e57607f821691505b60208210810361443157634e487b7160e01b5f52602260045260245ffd5b5f60208083525f845461497e8161493a565b806020870152604060018084165f811461499f57600181146149bb576149e8565b60ff19851660408a0152604084151560051b8a010195506149e8565b895f5260205f205f5b858110156149df5781548b82018601529083019088016149c4565b8a016040019650505b509398975050505050505050565b8051611d54816143ae565b5f8060408385031215614a12575f80fd5b82516001600160401b0380821115614a28575f80fd5b9084019060608287031215614a3b575f80fd5b614a43614795565b82518152602080840151614a56816146db565b82820152604084015183811115614a6b575f80fd5b80850194505087601f850112614a7f575f80fd5b83519250614a8f614876846147ed565b8381528882858701011115614aa2575f80fd5b614ab184838301848801614668565b80604084015250819550614ac68188016149f6565b9450505050509250929050565b5f808335601e19843603018112614ae8575f80fd5b8301803591506001600160401b03821115614b01575f80fd5b6020019150368190038213156120f5575f80fd5b6001600160401b03818116838216028082169190828114614b3857614b3861461d565b505092915050565b5f6001600160401b038083168181036148e6576148e661461d565b5f60208284031215614b6b575f80fd5b610c1d82614437565b5f60208284031215614b84575f80fd5b813560ff81168114610c1d575f80fd5b601f821115611d2357805f5260205f20601f840160051c81016020851015614bb95750805b601f840160051c820191505b81811015610cbe575f8155600101614bc5565b81516001600160401b03811115614bf157614bf1614781565b614c0581614bff845461493a565b84614b94565b602080601f831160018114614c38575f8415614c215750858301515b5f19600386901b1c1916600185901b17855561269f565b5f85815260208120601f198616915b82811015614c6657888601518255948401946001909101908401614c47565b5085821015614c8357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614ce881604e860160208901614668565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 099ef3024..b2c274fe1 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -71,8 +71,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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"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\":\"UnexpectedRegistrationStatus\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516132e63803806132e683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6131998061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c80638da5cb5b116100a9578063c974d1b61161006e578063c974d1b6146102c6578063d588c18f146102ce578063d5f20ff6146102e1578063df93d8de14610301578063f2fde38b1461030b575f80fd5b80638da5cb5b1461023b57806397fb70d41461027f578063a3a65e4814610292578063b771b3bc146102a5578063bee0a03f146102b3575f80fd5b806366435abf116100ef57806366435abf146101d4578063715018a6146101ff578063732214f8146102075780638280a25a1461020e5780638994ab4914610228575f80fd5b80630322ed981461012b5780630cdd098514610140578063467ef06f1461019157806360305d62146101a457806361e2f490146101c1575b5f80fd5b61013e61013936600461279a565b61031e565b005b61017e61014e36600461279a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61013e61019f3660046127c9565b610490565b6101ac601481565b60405163ffffffff9091168152602001610188565b61013e6101cf3660046127e2565b61049e565b6101e76101e236600461279a565b610922565b6040516001600160401b039091168152602001610188565b61013e610936565b61017e5f81565b610216603081565b60405160ff9091168152602001610188565b61017e61023636600461285c565b610949565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610188565b61013e61028d36600461279a565b610965565b61013e6102a03660046127c9565b61097a565b6102676005600160991b0181565b61013e6102c136600461279a565b610b09565b610216601481565b61013e6102dc3660046128b1565b610c2e565b6102f46102ef36600461279a565b610d3c565b60405161018891906128fb565b6101e76202a30081565b61013e6103193660046129aa565b610e04565b5f8181525f8051602061316d8339815191526020526040808220815160e0810190925280545f8051602061314d83398151915293929190829060ff16600581111561036b5761036b6128e7565b600581111561037c5761037c6128e7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb6128e7565b146104095760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042e8584606001515f610e46565b6040518263ffffffff1660e01b815260040161044a91906129ee565b6020604051808303815f875af1158015610466573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048a9190612a20565b50505050565b61049981610e95565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061314d8339815191529060ff16156104f057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610533573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105579190612a20565b83602001351461057a5760405163d040949d60e01b815260040160405180910390fd5b3061058b60608501604086016129aa565b6001600160a01b0316146105b25760405163e6c4247b60e01b815260040160405180910390fd5b5f6105c06060850185612a37565b905090505f805b828163ffffffff16101561086c575f6105e36060880188612a37565b8363ffffffff168181106105f9576105f9612a7c565b905060200281019061060b9190612a90565b61061490612b40565b80515f818152600888016020526040902054919250901561064857604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161067792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261069191612bd7565b602060405180830381855afa1580156106ac573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906106cf9190612a20565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561075b5761075b6128e7565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161080e911686612bfc565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061086590612c0f565b90506105c7565b50600483018190555f61087e8561115f565b90505f61088e826040015161125f565b90505f61089a886113d1565b9050816002826040516108ad9190612bd7565b602060405180830381855afa1580156108c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108eb9190612a20565b1461090957604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61092c82610d3c565b6080015192915050565b61093e61186a565b6109475f6118c5565b565b5f61095261186a565b61095c8383611935565b90505b92915050565b61096d61186a565b61097681611d0e565b5050565b5f8051602061314d8339815191525f6109928361115f565b90505f806109a38360400151611f4b565b91509150806109c557604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546109df90612c31565b90505f03610a0057604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115610a2657610a266128e7565b14610a445760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120610a5c9161270f565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061314d8339815191529190610b5090612c31565b90505f03610b7157604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115610b9757610b976128e7565b14610bb55760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bee9190600401612c63565b6020604051808303815f875af1158015610c0a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104999190612a20565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610c725750825b90505f826001600160401b03166001148015610c8d5750303b155b905081158015610c9b575080155b15610cb95760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ce357845460ff60401b1916600160401b1785555b610ced87876120ec565b8315610d3357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610d44612746565b5f8281525f8051602061316d833981519152602052604090819020815160e0810190925280545f8051602061314d833981519152929190829060ff166005811115610d9157610d916128e7565b6005811115610da257610da26128e7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610e0c61186a565b6001600160a01b038116610e3a57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610e43816118c5565b50565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f610e9e612746565b5f8051602061314d8339815191525f610eb68561115f565b90505f80610ec78360400151611f4b565b915091508015610eea57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610f1b57610f1b6128e7565b6005811115610f2c57610f2c6128e7565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115610f9d57610f9d6128e7565b14158015610fbe5750600182516005811115610fbb57610fbb6128e7565b14155b15610fdc5760405163a36c527f60e01b815260040160405180910390fd5b600382516005811115610ff157610ff16128e7565b03610ffe57506004611002565b5060055b6020808301515f9081526008880190915260408120558181600581111561102b5761102b6128e7565b9081600581111561103e5761103e6128e7565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611072576110726128e7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115611126576111266128e7565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156111c3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111ea9190810190612cfc565b915091508061120c57604051636b2f19e960e01b815260040160405180910390fd5b81511561122c5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156112585760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f81516026146112815760405162461bcd60e51b8152600401610e3190612dce565b5f805b60028110156112d057611298816001612e17565b6112a3906008612e2a565b61ffff168482815181106112b9576112b9612a7c565b016020015160f81c901b9190911790600101611284565b5061ffff8116156112f35760405162461bcd60e51b8152600401610e3190612e41565b5f805b600481101561134e5761130a816003612e17565b611315906008612e2a565b63ffffffff1685611327836002612bfc565b8151811061133757611337612a7c565b016020015160f81c901b91909117906001016112f6565b5063ffffffff8116156113735760405162461bcd60e51b8152600401610e3190612e84565b5f805b60208110156113c85761138a81601f612e17565b611395906008612e2a565b866113a1836006612bfc565b815181106113b1576113b1612a7c565b016020015160f81c901b9190911790600101611376565b50949350505050565b60605f6113e083830184612a37565b6113ec91506058612e2a565b6113f790605c612bfc565b6001600160401b0381111561140e5761140e612aae565b6040519080825280601f01601f191660200182016040528015611438576020820181803683370190505b5090505f5b602081101561148d578335816020811061145957611459612a7c565b1a60f81b82828151811061146f5761146f612a7c565b60200101906001600160f81b03191690815f1a90535060010161143d565b505f5b60208110156114ed57836020013581602081106114af576114af612a7c565b1a60f81b826114bf836020612bfc565b815181106114cf576114cf612a7c565b60200101906001600160f81b03191690815f1a905350600101611490565b505f5b600481101561155057611504816003612e17565b61150f906008612e2a565b6014901c60f81b82611522836040612bfc565b8151811061153257611532612a7c565b60200101906001600160f81b03191690815f1a9053506001016114f0565b505f61156260608501604086016129aa565b60601b90505f5b60148110156115c25781816014811061158457611584612a7c565b1a60f81b83611594836044612bfc565b815181106115a4576115a4612a7c565b60200101906001600160f81b03191690815f1a905350600101611569565b505f6115d16060860186612a37565b905090505f5b600481101561163c576115eb816003612e17565b6115f6906008612e2a565b63ffffffff8316901c60f81b8461160e836058612bfc565b8151811061161e5761161e612a7c565b60200101906001600160f81b03191690815f1a9053506001016115d7565b505f5b61164c6060870187612a37565b9050811015611860575f611661826058612e2a565b61166c90605c612bfc565b90505f5b60208110156116f7576116866060890189612a37565b8481811061169657611696612a7c565b90506020028101906116a89190612a90565b3581602081106116ba576116ba612a7c565b1a60f81b866116c98385612bfc565b815181106116d9576116d9612a7c565b60200101906001600160f81b03191690815f1a905350600101611670565b505f5b60088110156117ac5761170e816007612e17565b611719906008612e2a565b61172660608a018a612a37565b8581811061173657611736612a7c565b90506020028101906117489190612a90565b611759906040810190602001612ecb565b6001600160401b0316901c60f81b8682611774856020612bfc565b61177e9190612bfc565b8151811061178e5761178e612a7c565b60200101906001600160f81b03191690815f1a9053506001016116fa565b505f5b6030811015611856576117c56060890189612a37565b848181106117d5576117d5612a7c565b90506020028101906117e79190612a90565b6117f5906040810190612ee4565b8281811061180557611805612a7c565b9050013560f81c60f81b868284602861181e9190612bfc565b6118289190612bfc565b8151811061183857611838612a7c565b60200101906001600160f81b03191690815f1a9053506001016117af565b505060010161163f565b5091949350505050565b3361189c7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109475760405163118cdaa760e01b8152336004820152602401610e31565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661197957604051637fab81e560e01b815260040160405180910390fd5b5f8051602061314d833981519152426119986040860160208701612ecb565b6001600160401b03161115806119d257506119b66202a30042612bfc565b6119c66040860160208701612ecb565b6001600160401b031610155b156119ef5760405162d36c8560e81b815260040160405180910390fd5b60306119fe6040860186612ee4565b9050141580611a0c57508335155b15611a2a5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415611a5a57604051630eb0d31360e11b815260040160405180910390fd5b611a64835f612106565b5f80611afd6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611aa89190612ecb565b6001600160401b03168152602001611ac360408a018a612ee4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506122cf565b5f82815260068601602052604090209193509150611b1b8282612f71565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b489085906004016129ee565b6020604051808303815f875af1158015611b64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b889190612a20565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115611c0057611c006128e7565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611ce0918e01908e01612ecb565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611d16612746565b5f8281525f8051602061316d8339815191526020526040808220815160e0810190925280545f8051602061314d83398151915293929190829060ff166005811115611d6357611d636128e7565b6005811115611d7457611d746128e7565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611de657611de66128e7565b14611e045760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611e4857611e486128e7565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611ef485826123d3565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714611f6e5760405162461bcd60e51b8152600401610e3190612dce565b5f805b6002811015611fbd57611f85816001612e17565b611f90906008612e2a565b61ffff16858281518110611fa657611fa6612a7c565b016020015160f81c901b9190911790600101611f71565b5061ffff811615611fe05760405162461bcd60e51b8152600401610e3190612e41565b5f805b600481101561203b57611ff7816003612e17565b612002906008612e2a565b63ffffffff1686612014836002612bfc565b8151811061202457612024612a7c565b016020015160f81c901b9190911790600101611fe3565b5063ffffffff81166003146120625760405162461bcd60e51b8152600401610e3190612e84565b5f805b60208110156120b75761207981601f612e17565b612084906008612e2a565b87612090836006612bfc565b815181106120a0576120a0612a7c565b016020015160f81c901b9190911790600101612065565b505f866026815181106120cc576120cc612a7c565b016020015191976001600160f81b03199092161515965090945050505050565b6120f461252a565b6120fd82612573565b6109768161258c565b5f8051602061314d8339815191525f6001600160401b03808416908516111561213a576121338385613030565b9050612147565b6121448484613030565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806121a95750600184015481516121a5916001600160401b031690612bfc565b8210155b156121cf576001600160401b0383166060820152818152604081015160208201526121ee565b82816060018181516121e19190613050565b6001600160401b03169052505b60608101516121fe906064613070565b602082015160018601546001600160401b0392909216916122299190600160401b900460ff16612e2a565b10156122485760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516122639190612bfc565b9052506040810180516001600160401b0387169190612283908390612e17565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146123395760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b6064820152608401610e31565b5f806001855f0151866020015187604001518860800151896060015160405160200161236b979695949392919061309b565b604051602081830303815290604052905060028160405161238c9190612bd7565b602060405180830381855afa1580156123a7573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906123ca9190612a20565b94909350915050565b5f8281525f8051602061316d833981519152602052604081206002015481905f8051602061314d83398151915290600160801b90046001600160401b031661241b8582612106565b5f6124258761259d565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124758a858b610e46565b6040518263ffffffff1660e01b815260040161249191906129ee565b6020604051808303815f875af11580156124ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124d19190612a20565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661094757604051631afcd79f60e31b815260040160405180910390fd5b61257b61252a565b61258361262d565b610e4381612635565b61259461252a565b610e4381612707565b5f8181525f8051602061316d8339815191526020526040812060020180545f8051602061314d83398151915291600160401b9091046001600160401b03169060086125e783613111565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b61094761252a565b61263d61252a565b80355f8051602061314d8339815191529081556014612662606084016040850161312c565b60ff161180612681575061267c606083016040840161312c565b60ff16155b1561269f5760405163b4fa3fb360e01b815260040160405180910390fd5b6126af606083016040840161312c565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556126e06040830160208401612ecb565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610e0c61252a565b50805461271b90612c31565b5f825580601f1061272a575050565b601f0160209004905f5260205f2090810190610e439190612782565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612796575f8155600101612783565b5090565b5f602082840312156127aa575f80fd5b5035919050565b803563ffffffff811681146127c4575f80fd5b919050565b5f602082840312156127d9575f80fd5b61095c826127b1565b5f80604083850312156127f3575f80fd5b82356001600160401b03811115612808575f80fd5b830160808186031215612819575f80fd5b9150612827602084016127b1565b90509250929050565b5f60608284031215612840575f80fd5b50919050565b80356001600160401b03811681146127c4575f80fd5b5f806040838503121561286d575f80fd5b82356001600160401b03811115612882575f80fd5b61288e85828601612830565b92505061282760208401612846565b6001600160a01b0381168114610e43575f80fd5b5f80608083850312156128c2575f80fd5b6128cc8484612830565b915060608301356128dc8161289d565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061291e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161295960608401826001600160401b03169052565b50608083015161297460808401826001600160401b03169052565b5060a083015161298f60a08401826001600160401b03169052565b5060c083015161125860c08401826001600160401b03169052565b5f602082840312156129ba575f80fd5b81356129c58161289d565b9392505050565b5f5b838110156129e65781810151838201526020016129ce565b50505f910152565b602081525f8251806020840152612a0c8160408501602087016129cc565b601f01601f19169190910160400192915050565b5f60208284031215612a30575f80fd5b5051919050565b5f808335601e19843603018112612a4c575f80fd5b8301803591506001600160401b03821115612a65575f80fd5b6020019150600581901b3603821315612523575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612aa4575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612ae457612ae4612aae565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612b1257612b12612aae565b604052919050565b5f6001600160401b03821115612b3257612b32612aae565b50601f01601f191660200190565b5f60608236031215612b50575f80fd5b612b58612ac2565b823581526020612b69818501612846565b8183015260408401356001600160401b03811115612b85575f80fd5b840136601f820112612b95575f80fd5b8035612ba8612ba382612b1a565b612aea565b8181523684838501011115612bbb575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251612aa48184602087016129cc565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561095f5761095f612be8565b5f63ffffffff808316818103612c2757612c27612be8565b6001019392505050565b600181811c90821680612c4557607f821691505b60208210810361284057634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454612c7581612c31565b806020870152604060018084165f8114612c965760018114612cb257612cdf565b60ff19851660408a0152604084151560051b8a01019550612cdf565b895f5260205f205f5b85811015612cd65781548b8201860152908301908801612cbb565b8a016040019650505b509398975050505050505050565b805180151581146127c4575f80fd5b5f8060408385031215612d0d575f80fd5b82516001600160401b0380821115612d23575f80fd5b9084019060608287031215612d36575f80fd5b612d3e612ac2565b82518152602080840151612d518161289d565b82820152604084015183811115612d66575f80fd5b80850194505087601f850112612d7a575f80fd5b83519250612d8a612ba384612b1a565b8381528882858701011115612d9d575f80fd5b612dac848383018488016129cc565b80604084015250819550612dc1818801612ced565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b8181038181111561095f5761095f612be8565b808202811582820484141761095f5761095f612be8565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f60208284031215612edb575f80fd5b61095c82612846565b5f808335601e19843603018112612ef9575f80fd5b8301803591506001600160401b03821115612f12575f80fd5b602001915036819003821315612523575f80fd5b601f82111561049957805f5260205f20601f840160051c81016020851015612f4b5750805b601f840160051c820191505b81811015612f6a575f8155600101612f57565b5050505050565b81516001600160401b03811115612f8a57612f8a612aae565b612f9e81612f988454612c31565b84612f26565b602080601f831160018114612fd1575f8415612fba5750858301515b5f19600386901b1c1916600185901b178555613028565b5f85815260208120601f198616915b82811015612fff57888601518255948401946001909101908401612fe0565b508582101561301c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0382811682821603908082111561125857611258612be8565b6001600160401b0381811683821601908082111561125857611258612be8565b6001600160401b0381811683821602808216919082811461309357613093612be8565b505092915050565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516130f081604e8601602089016129cc565b60c09490941b1691909201604e810191909152605601979650505050505050565b5f6001600160401b03808316818103612c2757612c27612be8565b5f6020828403121561313c575f80fd5b813560ff811681146129c5575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"WARP_MESSENGER\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"contractIWarpMessenger\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"activeValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"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\":\"UnexpectedRegistrationStatus\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516131d83803806131d883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61308b8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c80638da5cb5b116100a9578063c974d1b61161006e578063c974d1b6146102c6578063d588c18f146102ce578063d5f20ff6146102e1578063df93d8de14610301578063f2fde38b1461030b575f80fd5b80638da5cb5b1461023b57806397fb70d41461027f578063a3a65e4814610292578063b771b3bc146102a5578063bee0a03f146102b3575f80fd5b806366435abf116100ef57806366435abf146101d4578063715018a6146101ff578063732214f8146102075780638280a25a1461020e5780638994ab4914610228575f80fd5b80630322ed981461012b5780630cdd098514610140578063467ef06f1461019157806360305d62146101a457806361e2f490146101c1575b5f80fd5b61013e61013936600461275f565b61031e565b005b61017e61014e36600461275f565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6040519081526020015b60405180910390f35b61013e61019f36600461278e565b610490565b6101ac601481565b60405163ffffffff9091168152602001610188565b61013e6101cf3660046127a7565b61049e565b6101e76101e236600461275f565b610922565b6040516001600160401b039091168152602001610188565b61013e610936565b61017e5f81565b610216603081565b60405160ff9091168152602001610188565b61017e610236366004612821565b610949565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610188565b61013e61028d36600461275f565b610965565b61013e6102a036600461278e565b61097a565b6102676005600160991b0181565b61013e6102c136600461275f565b610b09565b610216601481565b61013e6102dc366004612876565b610c2e565b6102f46102ef36600461275f565b610d3c565b60405161018891906128c0565b6101e76202a30081565b61013e61031936600461296f565b610e04565b5f8181525f8051602061305f8339815191526020526040808220815160e0810190925280545f8051602061303f83398151915293929190829060ff16600581111561036b5761036b6128ac565b600581111561037c5761037c6128ac565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb6128ac565b146104095760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042e8584606001515f610e46565b6040518263ffffffff1660e01b815260040161044a91906129b3565b6020604051808303815f875af1158015610466573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048a91906129e5565b50505050565b61049981610e95565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061303f8339815191529060ff16156104f057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610533573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061055791906129e5565b83602001351461057a5760405163d040949d60e01b815260040160405180910390fd5b3061058b606085016040860161296f565b6001600160a01b0316146105b25760405163e6c4247b60e01b815260040160405180910390fd5b5f6105c060608501856129fc565b905090505f805b828163ffffffff16101561086c575f6105e360608801886129fc565b8363ffffffff168181106105f9576105f9612a41565b905060200281019061060b9190612a55565b61061490612b05565b80515f818152600888016020526040902054919250901561064857604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161067792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261069191612b9c565b602060405180830381855afa1580156106ac573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906106cf91906129e5565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561075b5761075b6128ac565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161080e911686612bc1565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061086590612bd4565b90506105c7565b50600483018190555f61087e8561115f565b90505f61088e826040015161125f565b90505f61089a886113d4565b9050816002826040516108ad9190612b9c565b602060405180830381855afa1580156108c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108eb91906129e5565b1461090957604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61092c82610d3c565b6080015192915050565b61093e61186d565b6109475f6118c8565b565b5f61095261186d565b61095c8383611938565b90505b92915050565b61096d61186d565b61097681611d11565b5050565b5f8051602061303f8339815191525f6109928361115f565b90505f806109a38360400151611f4e565b91509150806109c557604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546109df90612bf6565b90505f03610a0057604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115610a2657610a266128ac565b14610a445760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120610a5c916126d4565b5f8281526007850160208181526040808420805460ff191660029081178255810180546001600160401b0342818116600160c01b026001600160c01b03909316929092178355600190930154875260088b0185528387208990559588905293835292548151600160801b90910490931683529082019290925283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061303f8339815191529190610b5090612bf6565b90505f03610b7157604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115610b9757610b976128ac565b14610bb55760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bee9190600401612c28565b6020604051808303815f875af1158015610c0a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061049991906129e5565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610c725750825b90505f826001600160401b03166001148015610c8d5750303b155b905081158015610c9b575080155b15610cb95760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610ce357845460ff60401b1916600160401b1785555b610ced87876120f2565b8315610d3357845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610d4461270b565b5f8281525f8051602061305f833981519152602052604090819020815160e0810190925280545f8051602061303f833981519152929190829060ff166005811115610d9157610d916128ac565b6005811115610da257610da26128ac565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610e0c61186d565b6001600160a01b038116610e3a57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610e43816118c8565b50565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f610e9e61270b565b5f8051602061303f8339815191525f610eb68561115f565b90505f80610ec78360400151611f4e565b915091508015610eea57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610f1b57610f1b6128ac565b6005811115610f2c57610f2c6128ac565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091505f9082516005811115610f9d57610f9d6128ac565b14158015610fbe5750600182516005811115610fbb57610fbb6128ac565b14155b15610fdc5760405163a36c527f60e01b815260040160405180910390fd5b600382516005811115610ff157610ff16128ac565b03610ffe57506004611002565b5060055b6020808301515f9081526008880190915260408120558181600581111561102b5761102b6128ac565b9081600581111561103e5761103e6128ac565b9052505f84815260078701602052604090208251815484929190829060ff19166001836005811115611072576110726128ac565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905581516005811115611126576111266128ac565b60405185907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a350919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156111c3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111ea9190810190612cc1565b915091508061120c57604051636b2f19e960e01b815260040160405180910390fd5b81511561122c5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156112585760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f815160261461128257604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156112d157611299816001612d93565b6112a4906008612da6565b61ffff168482815181106112ba576112ba612a41565b016020015160f81c901b9190911790600101611285565b5061ffff8116156112f55760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156113505761130c816003612d93565b611317906008612da6565b63ffffffff1685611329836002612bc1565b8151811061133957611339612a41565b016020015160f81c901b91909117906001016112f8565b5063ffffffff81161561137657604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156113cb5761138d81601f612d93565b611398906008612da6565b866113a4836006612bc1565b815181106113b4576113b4612a41565b016020015160f81c901b9190911790600101611379565b50949350505050565b60605f6113e3838301846129fc565b6113ef91506058612da6565b6113fa90605c612bc1565b6001600160401b0381111561141157611411612a73565b6040519080825280601f01601f19166020018201604052801561143b576020820181803683370190505b5090505f5b6020811015611490578335816020811061145c5761145c612a41565b1a60f81b82828151811061147257611472612a41565b60200101906001600160f81b03191690815f1a905350600101611440565b505f5b60208110156114f057836020013581602081106114b2576114b2612a41565b1a60f81b826114c2836020612bc1565b815181106114d2576114d2612a41565b60200101906001600160f81b03191690815f1a905350600101611493565b505f5b600481101561155357611507816003612d93565b611512906008612da6565b6014901c60f81b82611525836040612bc1565b8151811061153557611535612a41565b60200101906001600160f81b03191690815f1a9053506001016114f3565b505f611565606085016040860161296f565b60601b90505f5b60148110156115c55781816014811061158757611587612a41565b1a60f81b83611597836044612bc1565b815181106115a7576115a7612a41565b60200101906001600160f81b03191690815f1a90535060010161156c565b505f6115d460608601866129fc565b905090505f5b600481101561163f576115ee816003612d93565b6115f9906008612da6565b63ffffffff8316901c60f81b84611611836058612bc1565b8151811061162157611621612a41565b60200101906001600160f81b03191690815f1a9053506001016115da565b505f5b61164f60608701876129fc565b9050811015611863575f611664826058612da6565b61166f90605c612bc1565b90505f5b60208110156116fa5761168960608901896129fc565b8481811061169957611699612a41565b90506020028101906116ab9190612a55565b3581602081106116bd576116bd612a41565b1a60f81b866116cc8385612bc1565b815181106116dc576116dc612a41565b60200101906001600160f81b03191690815f1a905350600101611673565b505f5b60088110156117af57611711816007612d93565b61171c906008612da6565b61172960608a018a6129fc565b8581811061173957611739612a41565b905060200281019061174b9190612a55565b61175c906040810190602001612dbd565b6001600160401b0316901c60f81b8682611777856020612bc1565b6117819190612bc1565b8151811061179157611791612a41565b60200101906001600160f81b03191690815f1a9053506001016116fd565b505f5b6030811015611859576117c860608901896129fc565b848181106117d8576117d8612a41565b90506020028101906117ea9190612a55565b6117f8906040810190612dd6565b8281811061180857611808612a41565b9050013560f81c60f81b86828460286118219190612bc1565b61182b9190612bc1565b8151811061183b5761183b612a41565b60200101906001600160f81b03191690815f1a9053506001016117b2565b5050600101611642565b5091949350505050565b3361189f7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109475760405163118cdaa760e01b8152336004820152602401610e31565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661197c57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061303f8339815191524261199b6040860160208701612dbd565b6001600160401b03161115806119d557506119b96202a30042612bc1565b6119c96040860160208701612dbd565b6001600160401b031610155b156119f25760405162d36c8560e81b815260040160405180910390fd5b6030611a016040860186612dd6565b9050141580611a0f57508335155b15611a2d5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415611a5d57604051630eb0d31360e11b815260040160405180910390fd5b611a67835f61210c565b5f80611b006040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611aab9190612dbd565b6001600160401b03168152602001611ac660408a018a612dd6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506122d5565b5f82815260068601602052604090209193509150611b1e8282612e63565b5060405163ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611b4b9085906004016129b3565b6020604051808303815f875af1158015611b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b8b91906129e5565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115611c0357611c036128ac565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611ce3918e01908e01612dbd565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611d1961270b565b5f8281525f8051602061305f8339815191526020526040808220815160e0810190925280545f8051602061303f83398151915293929190829060ff166005811115611d6657611d666128ac565b6005811115611d7757611d776128ac565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611de957611de96128ac565b14611e075760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611e4b57611e4b6128ac565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611ef78582612398565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714611f7257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015611fc157611f89816001612d93565b611f94906008612da6565b61ffff16858281518110611faa57611faa612a41565b016020015160f81c901b9190911790600101611f75565b5061ffff811615611fe55760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561204057611ffc816003612d93565b612007906008612da6565b63ffffffff1686612019836002612bc1565b8151811061202957612029612a41565b016020015160f81c901b9190911790600101611fe8565b5063ffffffff811660031461206857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120bd5761207f81601f612d93565b61208a906008612da6565b87612096836006612bc1565b815181106120a6576120a6612a41565b016020015160f81c901b919091179060010161206b565b505f866026815181106120d2576120d2612a41565b016020015191976001600160f81b03199092161515965090945050505050565b6120fa6124ef565b61210382612538565b61097681612551565b5f8051602061303f8339815191525f6001600160401b038084169085161115612140576121398385612f22565b905061214d565b61214a8484612f22565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806121af5750600184015481516121ab916001600160401b031690612bc1565b8210155b156121d5576001600160401b0383166060820152818152604081015160208201526121f4565b82816060018181516121e79190612f42565b6001600160401b03169052505b6060810151612204906064612f62565b602082015160018601546001600160401b03929092169161222f9190600160401b900460ff16612da6565b101561224e5760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516122699190612bc1565b9052506040810180516001600160401b0387169190612289908390612d93565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146122fe57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016123309796959493929190612f8d565b60405160208183030381529060405290506002816040516123519190612b9c565b602060405180830381855afa15801561236c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061238f91906129e5565b94909350915050565b5f8281525f8051602061305f833981519152602052604081206002015481905f8051602061303f83398151915290600160801b90046001600160401b03166123e0858261210c565b5f6123ea87612562565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61243a8a858b610e46565b6040518263ffffffff1660e01b815260040161245691906129b3565b6020604051808303815f875af1158015612472573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061249691906129e5565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661094757604051631afcd79f60e31b815260040160405180910390fd5b6125406124ef565b6125486125f2565b610e43816125fa565b6125596124ef565b610e43816126cc565b5f8181525f8051602061305f8339815191526020526040812060020180545f8051602061303f83398151915291600160401b9091046001600160401b03169060086125ac83613003565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6109476124ef565b6126026124ef565b80355f8051602061303f8339815191529081556014612627606084016040850161301e565b60ff1611806126465750612641606083016040840161301e565b60ff16155b156126645760405163b4fa3fb360e01b815260040160405180910390fd5b612674606083016040840161301e565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556126a56040830160208401612dbd565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610e0c6124ef565b5080546126e090612bf6565b5f825580601f106126ef575050565b601f0160209004905f5260205f2090810190610e439190612747565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561275b575f8155600101612748565b5090565b5f6020828403121561276f575f80fd5b5035919050565b803563ffffffff81168114612789575f80fd5b919050565b5f6020828403121561279e575f80fd5b61095c82612776565b5f80604083850312156127b8575f80fd5b82356001600160401b038111156127cd575f80fd5b8301608081860312156127de575f80fd5b91506127ec60208401612776565b90509250929050565b5f60608284031215612805575f80fd5b50919050565b80356001600160401b0381168114612789575f80fd5b5f8060408385031215612832575f80fd5b82356001600160401b03811115612847575f80fd5b612853858286016127f5565b9250506127ec6020840161280b565b6001600160a01b0381168114610e43575f80fd5b5f8060808385031215612887575f80fd5b61289184846127f5565b915060608301356128a181612862565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106128e357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161291e60608401826001600160401b03169052565b50608083015161293960808401826001600160401b03169052565b5060a083015161295460a08401826001600160401b03169052565b5060c083015161125860c08401826001600160401b03169052565b5f6020828403121561297f575f80fd5b813561298a81612862565b9392505050565b5f5b838110156129ab578181015183820152602001612993565b50505f910152565b602081525f82518060208401526129d1816040850160208701612991565b601f01601f19169190910160400192915050565b5f602082840312156129f5575f80fd5b5051919050565b5f808335601e19843603018112612a11575f80fd5b8301803591506001600160401b03821115612a2a575f80fd5b6020019150600581901b36038213156124e8575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612a69575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612aa957612aa9612a73565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612ad757612ad7612a73565b604052919050565b5f6001600160401b03821115612af757612af7612a73565b50601f01601f191660200190565b5f60608236031215612b15575f80fd5b612b1d612a87565b823581526020612b2e81850161280b565b8183015260408401356001600160401b03811115612b4a575f80fd5b840136601f820112612b5a575f80fd5b8035612b6d612b6882612adf565b612aaf565b8181523684838501011115612b80575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251612a69818460208701612991565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561095f5761095f612bad565b5f63ffffffff808316818103612bec57612bec612bad565b6001019392505050565b600181811c90821680612c0a57607f821691505b60208210810361280557634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454612c3a81612bf6565b806020870152604060018084165f8114612c5b5760018114612c7757612ca4565b60ff19851660408a0152604084151560051b8a01019550612ca4565b895f5260205f205f5b85811015612c9b5781548b8201860152908301908801612c80565b8a016040019650505b509398975050505050505050565b80518015158114612789575f80fd5b5f8060408385031215612cd2575f80fd5b82516001600160401b0380821115612ce8575f80fd5b9084019060608287031215612cfb575f80fd5b612d03612a87565b82518152602080840151612d1681612862565b82820152604084015183811115612d2b575f80fd5b80850194505087601f850112612d3f575f80fd5b83519250612d4f612b6884612adf565b8381528882858701011115612d62575f80fd5b612d7184838301848801612991565b80604084015250819550612d86818801612cb2565b9450505050509250929050565b8181038181111561095f5761095f612bad565b808202811582820484141761095f5761095f612bad565b5f60208284031215612dcd575f80fd5b61095c8261280b565b5f808335601e19843603018112612deb575f80fd5b8301803591506001600160401b03821115612e04575f80fd5b6020019150368190038213156124e8575f80fd5b601f82111561049957805f5260205f20601f840160051c81016020851015612e3d5750805b601f840160051c820191505b81811015612e5c575f8155600101612e49565b5050505050565b81516001600160401b03811115612e7c57612e7c612a73565b612e9081612e8a8454612bf6565b84612e18565b602080601f831160018114612ec3575f8415612eac5750858301515b5f19600386901b1c1916600185901b178555612f1a565b5f85815260208120601f198616915b82811015612ef157888601518255948401946001909101908401612ed2565b5085821015612f0e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0382811682821603908082111561125857611258612bad565b6001600160401b0381811683821601908082111561125857611258612bad565b6001600160401b03818116838216028082169190828114612f8557612f85612bad565b505092915050565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451612fe281604e860160208901612991565b60c09490941b1691909201604e810191909152605601979650505050505050565b5f6001600160401b03808316818103612bec57612bec612bad565b5f6020828403121561302e575f80fd5b813560ff8116811461298a575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 7278f33ad..95fa00287 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -43,6 +43,11 @@ library ValidatorMessages { // the end of their validation period. uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 5; + error InvalidMessageLength(); + error InvalidCodecID(); + error InvalidMessageType(); + error InvalidSignatureLength(); + /** * @notice Packs a SubnetConversionMessage message into a byte array. * The message format specification is: @@ -75,23 +80,27 @@ library ValidatorMessages { * @return the unpacked subnetConversionID. */ function unpackSubnetConversionMessage(bytes memory input) internal pure returns (bytes32) { - require(input.length == 38, "ValidatorMessages: invalid message length"); + if (input.length != 38) { + revert InvalidMessageLength(); + } // Unpack the codec ID uint16 codecID; for (uint256 i; i < 2; ++i) { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } - require(codecID == CODEC_ID, "ValidatorMessages: invalid codec ID"); + if (codecID != CODEC_ID) { + revert InvalidCodecID(); + } // Unpack the type ID uint32 typeID; for (uint256 i; i < 4; ++i) { typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } - require( - typeID == SUBNET_CONVERSION_MESSAGE_TYPE_ID, "ValidatorMessages: invalid message type" - ); + if (typeID != SUBNET_CONVERSION_MESSAGE_TYPE_ID) { + revert InvalidMessageType(); + } // Unpack the subnetConversionID bytes32 subnetConversionID; @@ -212,9 +221,9 @@ library ValidatorMessages { pure returns (bytes32, bytes memory) { - require( - validationPeriod.blsPublicKey.length == 48, "StakingMessages: invalid signature length" - ); + if (validationPeriod.blsPublicKey.length != 48) { + revert InvalidMessageLength(); + } // solhint-disable-next-line func-named-parameters bytes memory res = abi.encodePacked( @@ -241,24 +250,27 @@ library ValidatorMessages { pure returns (ValidationPeriod memory) { - require(input.length == 134, "ValidatorMessages: invalid message length"); + if (input.length != 134) { + revert InvalidMessageLength(); + } // Unpack the codec ID uint16 codecID; for (uint256 i; i < 2; ++i) { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } - require(codecID == CODEC_ID, "ValidatorMessages: invalid codec ID"); + if (codecID != CODEC_ID) { + revert InvalidCodecID(); + } // Unpack the type ID uint32 typeID; for (uint256 i; i < 4; ++i) { typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } - require( - typeID == REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID, - "ValidatorMessages: invalid message type" - ); + if (typeID != REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID) { + revert InvalidMessageType(); + } // Unpack the subnetID bytes32 subnetID; @@ -341,23 +353,26 @@ library ValidatorMessages { pure returns (bytes32, bool) { - require(input.length == 39, "ValidatorMessages: invalid message length"); + if(input.length != 39) { + revert InvalidMessageLength(); + } // Unpack the codec ID uint16 codecID; for (uint256 i; i < 2; ++i) { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } - require(codecID == CODEC_ID, "ValidatorMessages: invalid codec ID"); + if (codecID != CODEC_ID) { + revert InvalidCodecID(); + } // Unpack the type ID uint32 typeID; for (uint256 i; i < 4; ++i) { typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } - require( - typeID == SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID, - "ValidatorMessages: invalid message type" - ); + if (typeID != SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID) { + revert InvalidMessageType(); + } // Unpack the validation ID. bytes32 validationID; @@ -415,24 +430,27 @@ library ValidatorMessages { pure returns (bytes32, uint64, uint64) { - require(input.length == 54, "ValidatorMessages: invalid message length"); + if(input.length != 54) { + revert InvalidMessageLength(); + } // Unpack the codec ID. uint16 codecID; for (uint256 i; i < 2; ++i) { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } - require(codecID == CODEC_ID, "ValidatorMessages: invalid codec ID"); + if (codecID != CODEC_ID) { + revert InvalidCodecID(); + } // Unpack the type ID. uint32 typeID; for (uint256 i; i < 4; ++i) { typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } - require( - typeID == SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID, - "ValidatorMessages: invalid message type" - ); + if (typeID != SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID) { + revert InvalidMessageType(); + } // Unpack the validation ID. bytes32 validationID; @@ -494,24 +512,28 @@ library ValidatorMessages { pure returns (bytes32, uint64, uint64) { - require(input.length == 54, "ValidatorMessages: invalid message length"); + if (input.length != 54) { + revert InvalidMessageLength(); + } // Unpack the codec ID. uint16 codecID; for (uint256 i; i < 2; ++i) { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } - require(codecID == CODEC_ID, "ValidatorMessages: invalid codec ID"); + if (codecID != CODEC_ID) { + revert InvalidCodecID(); + } // Unpack the type ID. uint32 typeID; for (uint256 i; i < 4; ++i) { typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } - require( - typeID == SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID, - "ValidatorMessages: invalid message type" - ); + + if (typeID != SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID) { + revert InvalidMessageType(); + } // Unpack the validation ID. bytes32 validationID; @@ -572,23 +594,27 @@ library ValidatorMessages { pure returns (bytes32, uint64) { - require(input.length == 46, "ValidatorMessages: invalid message length"); + if (input.length != 46) { + revert InvalidMessageLength(); + } // Unpack the codec ID. uint16 codecID; for (uint256 i; i < 2; ++i) { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } - require(codecID == CODEC_ID, "ValidatorMessages: invalid codec ID"); + if (codecID != CODEC_ID) { + revert InvalidCodecID(); + } // Unpack the type ID. uint32 typeID; for (uint256 i; i < 4; ++i) { typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } - require( - typeID == VALIDATION_UPTIME_MESSAGE_TYPE_ID, "ValidatorMessages: invalid message type" - ); + if (typeID != VALIDATION_UPTIME_MESSAGE_TYPE_ID) { + revert InvalidMessageType(); + } // Unpack the validation ID. bytes32 validationID; From 64700da8d5d00ec31a208fd4d19bfc5740fb6376 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 20 Sep 2024 16:28:57 -0400 Subject: [PATCH 392/545] Fixups --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 10 +++++----- .../interfaces/IPoSValidatorManager.sol | 5 ++--- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 697ea3bc2..f3ae3bfc6 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161673838038061673883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6165eb8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd366004615905565b61043a565b005b6101d26101e2366004615940565b61089d565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b610219610214366004615940565b610a56565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004615957565b610a6c565b6101d261026e366004615970565b610b0c565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004615998565b610f9c565b6102b66102b13660046159fc565b61157f565b6040519081526020016101fd565b6102196102d2366004615940565b611598565b6102b65f81565b6101d26102ec366004615905565b6115ac565b6101ef603081565b6101d2610307366004615940565b6117c8565b6101d261031a366004615970565b6118ce565b6101d261032d366004615940565b611ab1565b6102b6610340366004615a15565b611dba565b6101d2610353366004615957565b611de6565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c366004615940565b611f5c565b6101d261039f366004615940565b6121cf565b6101ef601481565b6103bf6103ba366004615940565b6122aa565b6040516101fd9190615a49565b6102196202a30081565b6102b66103e4366004615940565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615b09565b612372565b6101d2610435366004615b82565b6123a7565b5f8381525f8051602061657f83398151915260205260408082208151610100810190925280545f8051602061651f83398151915293929190829060ff16600481111561048857610488615a35565b600481111561049957610499615a35565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61051d826122aa565b905060028351600481111561053457610534615a35565b146105865760405162461bcd60e51b815260206004820152602a60248201525f8051602061653f8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105eb5760405162461bcd60e51b815260206004820152603360248201525f8051602061653f8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161057d565b6003835280515f90600290600581111561060757610607615a35565b0361065e57861561061f5761061c8387612486565b90505b5f846060015183608001516106349190615bd4565b90506106408482612722565b506001600160401b0390811660e0870152421660a086015250610692565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106c5866060015161157f565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b81526004016106f99796959493929190615bf4565b602060405180830381865afa158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190615c32565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600481111561077757610777615a35565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088b916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206165bf8339815191526020526040808220815160e0810190925280545f8051602061655f83398151915293929190829060ff1660058111156108ea576108ea615a35565b60058111156108fb576108fb615a35565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096a5761096a615a35565b146109cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb6109f48584606001515f612879565b6040518263ffffffff1660e01b8152600401610a109190615c6b565b6020604051808303815f875af1158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190615c32565b50505050565b5f610a6664e8d4a5100083615c9d565b92915050565b5f8051602061651f8339815191525f80610a85846128d0565b91509150610a9282612bee565b610a9c5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610aca57610aca615a35565b03610aef575f83815260088501602052604081208054919055610aed8282612c29565b505b610b0581610b00846040015161157f565b612c9f565b5050505050565b5f8181525f8051602061657f83398151915260205260408082208151610100810190925280545f8051602061651f83398151915293929190829060ff166004811115610b5a57610b5a615a35565b6004811115610b6b57610b6b615a35565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf0906122aa565b9050600182516004811115610c0757610c07615a35565b14610c705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161057d565b600381516005811115610c8557610c85615a35565b03610dfd576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610ce957610ce9615a35565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1257610e12615a35565b03610e2057610b0584612cc2565b5f610e2a86612ebf565b90505f80610e3b8360400151613085565b509150915081856040015114610e635760405162461bcd60e51b815260040161057d90615cbc565b806001600160401b031684606001516001600160401b03161015610ed45760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161057d565b806001600160401b03168560c001516001600160401b03161115610f0a5760405162461bcd60e51b815260040161057d90615d06565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061655f8339815191529060ff16156110395760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a09190615c32565b8360200135146111025760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161057d565b306111136060850160408601615d4f565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161057d565b5f6111936060850185615d6a565b905090505f805b828163ffffffff161015611483575f6111b66060880188615d6a565b8363ffffffff168181106111cc576111cc615daf565b90506020028101906111de9190615dc3565b6111e790615e73565b80515f818152600888016020526040902054919250901561125f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161057d565b5f6002895f01358560405160200161128e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a891615f0a565b602060405180830381855afa1580156112c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e69190615c32565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561137257611372615a35565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611425911686615f1b565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147c90615f2e565b905061119a565b50600483018190555f61149585612ebf565b90505f6114a582604001516132c0565b90505f6114b188613432565b9050816002826040516114c49190615f0a565b602060405180830381855afa1580156114df573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115029190615c32565b146115665760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161057d565b5050506009909201805460ff1916600117905550505050565b5f610a666001600160401b03831664e8d4a51000615f50565b5f6115a2826122aa565b6080015192915050565b5f8051602061651f8339815191525f6115c4856138cb565b90506115cf85612bee565b6115da575050505050565b5f8581526005830160205260409020546001600160a01b031633146116115760405162461bcd60e51b815260040161057d90615f67565b5f85815260058301602052604090205460a082015161164091600160b01b90046001600160401b031690615fb9565b6001600160401b03168160c001516001600160401b031610156116c15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161057d565b8315610b05575f6116d28685612486565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117299061157f565b60a085015160c08601516040516001600160e01b031960e086901b16815261175d939291829188905f908190600401615bf4565b602060405180830381865afa158015611778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c9190615c32565b5f878152600885016020526040812080549091906117bb908490615f1b565b9091555050505050505050565b5f8051602061651f8339815191525f6117e0836122aa565b90506004815160058111156117f7576117f7615a35565b146118615760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161057d565b5f8381526005830160205260409020546001600160a01b031633146118985760405162461bcd60e51b815260040161057d90615f67565b5f83815260088301602090815260408083208054908490556005860190925290912054610a50906001600160a01b031682612c29565b6118d6613b46565b5f8181525f8051602061657f83398151915260205260408082208151610100810190925280545f8051602061651f83398151915293929190829060ff16600481111561192457611924615a35565b600481111561193557611935615a35565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119b185612ebf565b90505f806119c28360400151613085565b5091509150818460400151146119ea5760405162461bcd60e51b815260040161057d90615cbc565b806001600160401b03168460e001516001600160401b03161115611a205760405162461bcd60e51b815260040161057d90615d06565b600384516004811115611a3557611a35615a35565b14611a895760405162461bcd60e51b815260206004820152603160248201525f8051602061653f8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161057d565b611a9286612cc2565b5050505050611aad60015f8051602061659f83398151915255565b5050565b611ab9613b46565b5f8181525f8051602061657f83398151915260205260408082208151610100810190925280545f8051602061651f83398151915293929190829060ff166004811115611b0757611b07615a35565b6004811115611b1857611b18615a35565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611b9c826122aa565b9050600481516005811115611bb357611bb3615a35565b14611c165760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161057d565b600283516004811115611c2b57611c2b615a35565b1480611c495750600383516004811115611c4757611c47615a35565b145b611ca55760405162461bcd60e51b815260206004820152602760248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526632b3b0ba34b7b760c91b606482015260840161057d565b600283516004811115611cba57611cba615a35565b03611d94578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611cf2856060015161157f565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611d4496959493926001600160401b0390921691908190600401615bf4565b602060405180830381865afa158015611d5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d839190615c32565b5f8681526007860160205260409020555b611d9d85612cc2565b50505050611db760015f8051602061659f83398151915255565b50565b5f611dc3613b46565b611dce833384613b90565b9050610a6660015f8051602061659f83398151915255565b5f8051602061655f8339815191525f611dfe83612ebf565b90505f80611e0f8360400151613f4a565b9150915080611e715760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057d565b60015f83815260078601602052604090205460ff166005811115611e9757611e97615a35565b14611eb45760405162461bcd60e51b815260040161057d90615fd9565b5f8281526006850160205260408120611ecc91615855565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061657f83398151915260205260408082208151610100810190925280545f8051602061651f83398151915293929190829060ff166004811115611faa57611faa615a35565b6004811115611fbb57611fbb615a35565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600481111561204257612042615a35565b1480612060575060038151600481111561205e5761205e615a35565b145b6120b45760405162461bcd60e51b815260206004820152603260248201525f8051602061653f833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161057d565b5f6120c282604001516122aa565b905080606001516001600160401b03165f036121465760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb612173846040015184606001518560800151612879565b6040518263ffffffff1660e01b815260040161218f9190615c6b565b6020604051808303815f875af11580156121ab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190615c32565b5f8181525f805160206165bf83398151915260205260409020545f8051602061655f8339815191529060019060ff16600581111561220f5761220f615a35565b1461222c5760405162461bcd60e51b815260040161057d90615fd9565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612265919060040161605c565b6020604051808303815f875af1158015612281573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a59190615c32565b505050565b6122b261588c565b5f8281525f805160206165bf833981519152602052604090819020815160e0810190925280545f8051602061655f833981519152929190829060ff1660058111156122ff576122ff615a35565b600581111561231057612310615a35565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61237b613b46565b612387858585856140eb565b905061239f60015f8051602061659f83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806123f0575080546001600160401b03808416911610155b1561240e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561243984846143d7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124d1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124f891908101906160f1565b915091508061255b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561259e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c29190615c32565b8251146126265760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057d565b60208201516001600160a01b03161561269c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057d565b5f806126ab84604001516143f1565b915091508187146127185760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057d565b9695505050505050565b5f8281525f805160206165bf833981519152602052604081206002015481905f8051602061655f83398151915290600160801b90046001600160401b031661276a85826145c9565b5f612774876147d7565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6127c48a858b612879565b6040518263ffffffff1660e01b81526004016127e09190615c6b565b6020604051808303815f875af11580156127fc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128209190615c32565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6128d961588c565b5f8051602061655f8339815191525f6128f185612ebf565b90505f806129028360400151613f4a565b9150915080156129675760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057d565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561299857612998615a35565b60058111156129a9576129a9615a35565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612a1857612a18615a35565b1480612a365750600181516005811115612a3457612a34615a35565b145b612a955760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161057d565b600381516005811115612aaa57612aaa615a35565b03612ab85760048152612abd565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612b0257612b02615a35565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bb657612bb6615a35565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f805160206164ff83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c84575f80fd5b505af1158015612c96573d5f803e3d5ffd5b50505050505050565b5f805160206164ff83398151915254611aad906001600160a01b03168383614867565b5f8181525f8051602061657f83398151915260205260408082208151610100810190925280545f8051602061651f83398151915293929190829060ff166004811115612d1057612d10615a35565b6004811115612d2157612d21615a35565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612e1590600160a01b900461ffff1684615f50565b612e1f9190615c9d565b905080856008015f8581526020019081526020015f205f828254612e439190615f1b565b909155505f9050612e5482846161c3565b9050612e64856020015182612c29565b612e798560200151610b00876060015161157f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f23573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f4a91908101906160f1565b9150915080612faa5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057d565b81511561300b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057d565b60208201516001600160a01b03161561307e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057d565b5092915050565b5f805f83516036146130a95760405162461bcd60e51b815260040161057d906161d6565b5f805b60028110156130f8576130c08160016161c3565b6130cb906008615f50565b61ffff168682815181106130e1576130e1615daf565b016020015160f81c901b91909117906001016130ac565b5061ffff81161561311b5760405162461bcd60e51b815260040161057d9061621f565b5f805b6004811015613176576131328160036161c3565b61313d906008615f50565b63ffffffff168761314f836002615f1b565b8151811061315f5761315f615daf565b016020015160f81c901b919091179060010161311e565b5063ffffffff811660041461319d5760405162461bcd60e51b815260040161057d90616262565b5f805b60208110156131f2576131b481601f6161c3565b6131bf906008615f50565b886131cb836006615f1b565b815181106131db576131db615daf565b016020015160f81c901b91909117906001016131a0565b505f805b60088110156132515761320a8160076161c3565b613215906008615f50565b6001600160401b03168961322a836026615f1b565b8151811061323a5761323a615daf565b016020015160f81c901b91909117906001016131f6565b505f805b60088110156132b0576132698160076161c3565b613274906008615f50565b6001600160401b03168a61328983602e615f1b565b8151811061329957613299615daf565b016020015160f81c901b9190911790600101613255565b5091989097509095509350505050565b5f81516026146132e25760405162461bcd60e51b815260040161057d906161d6565b5f805b6002811015613331576132f98160016161c3565b613304906008615f50565b61ffff1684828151811061331a5761331a615daf565b016020015160f81c901b91909117906001016132e5565b5061ffff8116156133545760405162461bcd60e51b815260040161057d9061621f565b5f805b60048110156133af5761336b8160036161c3565b613376906008615f50565b63ffffffff1685613388836002615f1b565b8151811061339857613398615daf565b016020015160f81c901b9190911790600101613357565b5063ffffffff8116156133d45760405162461bcd60e51b815260040161057d90616262565b5f805b6020811015613429576133eb81601f6161c3565b6133f6906008615f50565b86613402836006615f1b565b8151811061341257613412615daf565b016020015160f81c901b91909117906001016133d7565b50949350505050565b60605f61344183830184615d6a565b61344d91506058615f50565b61345890605c615f1b565b6001600160401b0381111561346f5761346f615de1565b6040519080825280601f01601f191660200182016040528015613499576020820181803683370190505b5090505f5b60208110156134ee57833581602081106134ba576134ba615daf565b1a60f81b8282815181106134d0576134d0615daf565b60200101906001600160f81b03191690815f1a90535060010161349e565b505f5b602081101561354e578360200135816020811061351057613510615daf565b1a60f81b82613520836020615f1b565b8151811061353057613530615daf565b60200101906001600160f81b03191690815f1a9053506001016134f1565b505f5b60048110156135b1576135658160036161c3565b613570906008615f50565b6014901c60f81b82613583836040615f1b565b8151811061359357613593615daf565b60200101906001600160f81b03191690815f1a905350600101613551565b505f6135c36060850160408601615d4f565b60601b90505f5b6014811015613623578181601481106135e5576135e5615daf565b1a60f81b836135f5836044615f1b565b8151811061360557613605615daf565b60200101906001600160f81b03191690815f1a9053506001016135ca565b505f6136326060860186615d6a565b905090505f5b600481101561369d5761364c8160036161c3565b613657906008615f50565b63ffffffff8316901c60f81b8461366f836058615f1b565b8151811061367f5761367f615daf565b60200101906001600160f81b03191690815f1a905350600101613638565b505f5b6136ad6060870187615d6a565b90508110156138c1575f6136c2826058615f50565b6136cd90605c615f1b565b90505f5b6020811015613758576136e76060890189615d6a565b848181106136f7576136f7615daf565b90506020028101906137099190615dc3565b35816020811061371b5761371b615daf565b1a60f81b8661372a8385615f1b565b8151811061373a5761373a615daf565b60200101906001600160f81b03191690815f1a9053506001016136d1565b505f5b600881101561380d5761376f8160076161c3565b61377a906008615f50565b61378760608a018a615d6a565b8581811061379757613797615daf565b90506020028101906137a99190615dc3565b6137ba9060408101906020016159fc565b6001600160401b0316901c60f81b86826137d5856020615f1b565b6137df9190615f1b565b815181106137ef576137ef615daf565b60200101906001600160f81b03191690815f1a90535060010161375b565b505f5b60308110156138b7576138266060890189615d6a565b8481811061383657613836615daf565b90506020028101906138489190615dc3565b6138569060408101906162a9565b8281811061386657613866615daf565b9050013560f81c60f81b868284602861387f9190615f1b565b6138899190615f1b565b8151811061389957613899615daf565b60200101906001600160f81b03191690815f1a905350600101613810565b50506001016136a0565b5091949350505050565b6138d361588c565b5f8281525f805160206165bf8339815191526020526040808220815160e0810190925280545f8051602061655f83398151915293929190829060ff16600581111561392057613920615a35565b600581111561393157613931615a35565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156139a3576139a3615a35565b146139ff5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613a4357613a43615a35565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613aef8582612722565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061659f833981519152805460011901613b7757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061659f83398151915255565b5f5f8051602061651f83398151915281613bac610214856148c6565b90505f613bb8876122aa565b9050613bc387612bee565b613c205760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161057d565b600281516005811115613c3557613c35615a35565b14613c945760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161057d565b5f828260800151613ca59190615fb9565b60048501546040840151919250613cc7916001600160401b03909116906162eb565b6001600160401b0316816001600160401b03161115613d465760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161057d565b5f80613d528a84612722565b915091505f8a83604051602001613d8092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836004811115613e1b57613e1b615a35565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613f6d5760405162461bcd60e51b815260040161057d906161d6565b5f805b6002811015613fbc57613f848160016161c3565b613f8f906008615f50565b61ffff16858281518110613fa557613fa5615daf565b016020015160f81c901b9190911790600101613f70565b5061ffff811615613fdf5760405162461bcd60e51b815260040161057d9061621f565b5f805b600481101561403a57613ff68160036161c3565b614001906008615f50565b63ffffffff1686614013836002615f1b565b8151811061402357614023615daf565b016020015160f81c901b9190911790600101613fe2565b5063ffffffff81166003146140615760405162461bcd60e51b815260040161057d90616262565b5f805b60208110156140b65761407881601f6161c3565b614083906008615f50565b8761408f836006615f1b565b8151811061409f5761409f615daf565b016020015160f81c901b9190911790600101614064565b505f866026815181106140cb576140cb615daf565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061651f8339815191529061ffff861610156141725760405162461bcd60e51b815260206004820152602b60248201525f8051602061653f83398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161057d565b61271061ffff861611156141ca5760405162461bcd60e51b815260206004820152602c60248201525f8051602061653f83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161057d565b60028101546001600160401b0390811690851610156142435760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161057d565b80548310156142a65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161057d565b806001015483111561430d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161057d565b5f614317846148c6565b90505f61432382610a56565b90505f61433089836148e9565b905060405180606001604052806143443390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6143df614e9f565b6143e882614eea565b611aad81614f5c565b5f808251602e146144145760405162461bcd60e51b815260040161057d906161d6565b5f805b60028110156144635761442b8160016161c3565b614436906008615f50565b61ffff1685828151811061444c5761444c615daf565b016020015160f81c901b9190911790600101614417565b5061ffff8116156144865760405162461bcd60e51b815260040161057d9061621f565b5f805b60048110156144e15761449d8160036161c3565b6144a8906008615f50565b63ffffffff16866144ba836002615f1b565b815181106144ca576144ca615daf565b016020015160f81c901b9190911790600101614489565b5063ffffffff81166005146145085760405162461bcd60e51b815260040161057d90616262565b5f805b602081101561455d5761451f81601f6161c3565b61452a906008615f50565b87614536836006615f1b565b8151811061454657614546615daf565b016020015160f81c901b919091179060010161450b565b505f805b60088110156145bc576145758160076161c3565b614580906008615f50565b6001600160401b031688614595836026615f1b565b815181106145a5576145a5615daf565b016020015160f81c901b9190911790600101614561565b5090969095509350505050565b5f8051602061655f8339815191525f6001600160401b0380841690851611156145fd576145f68385615bd4565b905061460a565b6146078484615bd4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061466c575060018401548151614668916001600160401b031690615f1b565b8210155b15614692576001600160401b0383166060820152818152604081015160208201526146b1565b82816060018181516146a49190615fb9565b6001600160401b03169052505b60608101516146c19060646162eb565b602082015160018601546001600160401b0392909216916146ec9190600160401b900460ff16615f50565b10156147505760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161057d565b856001600160401b03168160400181815161476b9190615f1b565b9052506040810180516001600160401b038716919061478b9083906161c3565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206165bf8339815191526020526040812060020180545f8051602061655f83398151915291600160401b9091046001600160401b031690600861482183616316565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b038381166024830152604482018390526122a591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614ffd565b5f610a66825f805160206164ff833981519152546001600160a01b03169061505e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166149745760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161057d565b5f8051602061655f8339815191524261499360408601602087016159fc565b6001600160401b031611614a055760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161057d565b614a1560408501602086016159fc565b6001600160401b0316614a2b6202a30042615f1b565b11614a9e5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161057d565b8335614af65760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161057d565b83355f90815260088201602052604090205415614b665760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057d565b6030614b7560408601866162a9565b905014614bda5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057d565b614be4835f6145c9565b5f80614c7d6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614c2891906159fc565b6001600160401b03168152602001614c4360408a018a6162a9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506151c0565b5f82815260068601602052604090209193509150614c9b8282616375565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614cd9908590600401615c6b565b6020604051808303815f875af1158015614cf5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d199190615c32565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614d9157614d91615a35565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614e71918e01908e016159fc565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614ee857604051631afcd79f60e31b815260040160405180910390fd5b565b614ef2614e9f565b614efb816152c4565b614f036152dd565b611db760608201356080830135614f2060c0850160a086016159fc565b614f3060e0860160c08701616434565b61ffff16614f45610100870160e0880161644d565b614f5761012088016101008901615d4f565b6152ed565b614f64614e9f565b5f805160206164ff8339815191526001600160a01b038216614fdd5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161057d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6150116001600160a01b03841683615575565b905080515f14158015615035575080806020019051810190615033919061646d565b155b156122a557604051635274afe760e01b81526001600160a01b038416600482015260240161057d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156150a4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150c89190615c32565b90506150df6001600160a01b038516333086615582565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015615123573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906151479190615c32565b90508181116151ad5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161057d565b6151b782826161c3565b95945050505050565b5f606082608001515160301461522a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057d565b5f806001855f0151866020015187604001518860800151896060015160405160200161525c9796959493929190616488565b604051602081830303815290604052905060028160405161527d9190615f0a565b602060405180830381855afa158015615298573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152bb9190615c32565b94909350915050565b6152cc614e9f565b6152d46155bb565b611db7816155c3565b6152e5614e9f565b614ee861573e565b6152f5614e9f565b5f8051602061651f833981519152836153615760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161057d565b6127108411156153c75760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161057d565b8587111561542f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161057d565b5f8360ff161161549c5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161057d565b600a60ff8416111561550e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161057d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606128c983835f615746565b6040516001600160a01b038481166024830152838116604483015260648201839052610a509186918216906323b872dd90608401614894565b614ee8614e9f565b6155cb614e9f565b80355f8051602061655f83398151915290815560146155f0606084016040850161644d565b60ff16111561565d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161057d565b5f61566e606084016040850161644d565b60ff16116156d65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161057d565b6156e6606083016040840161644d565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561571760408301602084016159fc565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613b7d614e9f565b60608147101561576b5760405163cd78605960e01b815230600482015260240161057d565b5f80856001600160a01b031684866040516157869190615f0a565b5f6040518083038185875af1925050503d805f81146157c0576040519150601f19603f3d011682016040523d82523d5f602084013e6157c5565b606091505b50915091506127188683836060826157e5576157e08261582c565b6128c9565b81511580156157fc57506001600160a01b0384163b155b1561582557604051639996b31560e01b81526001600160a01b038516600482015260240161057d565b50806128c9565b80511561583c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461586190616024565b5f825580601f10615870575050565b601f0160209004905f5260205f2090810190611db791906158c8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156158dc575f81556001016158c9565b5090565b8015158114611db7575f80fd5b803563ffffffff81168114615900575f80fd5b919050565b5f805f60608486031215615917575f80fd5b833592506020840135615929816158e0565b9150615937604085016158ed565b90509250925092565b5f60208284031215615950575f80fd5b5035919050565b5f60208284031215615967575f80fd5b6128c9826158ed565b5f8060408385031215615981575f80fd5b61598a836158ed565b946020939093013593505050565b5f80604083850312156159a9575f80fd5b82356001600160401b038111156159be575f80fd5b8301608081860312156159cf575f80fd5b91506159dd602084016158ed565b90509250929050565b80356001600160401b0381168114615900575f80fd5b5f60208284031215615a0c575f80fd5b6128c9826159e6565b5f8060408385031215615a26575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110615a6c57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151615aa760608401826001600160401b03169052565b506080830151615ac260808401826001600160401b03169052565b5060a0830151615add60a08401826001600160401b03169052565b5060c083015161307e60c08401826001600160401b03169052565b803561ffff81168114615900575f80fd5b5f805f8060808587031215615b1c575f80fd5b84356001600160401b03811115615b31575f80fd5b850160608188031215615b42575f80fd5b9350615b5060208601615af8565b9250615b5e604086016159e6565b9396929550929360600135925050565b6001600160a01b0381168114611db7575f80fd5b5f80828403610140811215615b95575f80fd5b61012080821215615ba4575f80fd5b8493508301359050615bb581615b6e565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561307e5761307e615bc0565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615c42575f80fd5b5051919050565b5f5b83811015615c63578181015183820152602001615c4b565b50505f910152565b602081525f8251806020840152615c89816040850160208701615c49565b601f01601f19169190910160400192915050565b5f82615cb757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615d5f575f80fd5b81356128c981615b6e565b5f808335601e19843603018112615d7f575f80fd5b8301803591506001600160401b03821115615d98575f80fd5b6020019150600581901b3603821315612872575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615dd7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615e1757615e17615de1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615e4557615e45615de1565b604052919050565b5f6001600160401b03821115615e6557615e65615de1565b50601f01601f191660200190565b5f60608236031215615e83575f80fd5b615e8b615df5565b823581526020615e9c8185016159e6565b8183015260408401356001600160401b03811115615eb8575f80fd5b840136601f820112615ec8575f80fd5b8035615edb615ed682615e4d565b615e1d565b8181523684838501011115615eee575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615dd7818460208701615c49565b80820180821115610a6657610a66615bc0565b5f63ffffffff808316818103615f4657615f46615bc0565b6001019392505050565b8082028115828204841417610a6657610a66615bc0565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561307e5761307e615bc0565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c9082168061603857607f821691505b60208210810361605657634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461606e81616024565b806020870152604060018084165f811461608f57600181146160ab576160d8565b60ff19851660408a0152604084151560051b8a010195506160d8565b895f5260205f205f5b858110156160cf5781548b82018601529083019088016160b4565b8a016040019650505b509398975050505050505050565b8051615900816158e0565b5f8060408385031215616102575f80fd5b82516001600160401b0380821115616118575f80fd5b908401906060828703121561612b575f80fd5b616133615df5565b8251815260208084015161614681615b6e565b8282015260408401518381111561615b575f80fd5b80850194505087601f85011261616f575f80fd5b8351925061617f615ed684615e4d565b8381528882858701011115616192575f80fd5b6161a184838301848801615c49565b806040840152508195506161b68188016160e6565b9450505050509250929050565b81810381811115610a6657610a66615bc0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e198436030181126162be575f80fd5b8301803591506001600160401b038211156162d7575f80fd5b602001915036819003821315612872575f80fd5b6001600160401b0381811683821602808216919082811461630e5761630e615bc0565b505092915050565b5f6001600160401b03808316818103615f4657615f46615bc0565b601f8211156122a557805f5260205f20601f840160051c810160208510156163565750805b601f840160051c820191505b81811015610b05575f8155600101616362565b81516001600160401b0381111561638e5761638e615de1565b6163a28161639c8454616024565b84616331565b602080601f8311600181146163d5575f84156163be5750858301515b5f19600386901b1c1916600185901b17855561642c565b5f85815260208120601f198616915b82811015616403578886015182559484019460019091019084016163e4565b508582101561642057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215616444575f80fd5b6128c982615af8565b5f6020828403121561645d575f80fd5b813560ff811681146128c9575f80fd5b5f6020828403121561647d575f80fd5b81516128c9816158e0565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516164dd81604e860160208901615c49565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516166d63803806166d683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6165898061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd3660046158a3565b61043a565b005b6101d26101e23660046158de565b61089d565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b6102196102143660046158de565b610a56565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b3660046158f5565b610a6c565b6101d261026e36600461590e565b610b0c565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004615936565b610f9c565b6102b66102b136600461599a565b61157f565b6040519081526020016101fd565b6102196102d23660046158de565b611598565b6102b65f81565b6101d26102ec3660046158a3565b6115ac565b6101ef603081565b6101d26103073660046158de565b6117c8565b6101d261031a36600461590e565b6118ce565b6101d261032d3660046158de565b611ab1565b6102b66103403660046159b3565b611d58565b6101d26103533660046158f5565b611d84565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c3660046158de565b611efa565b6101d261039f3660046158de565b61216d565b6101ef601481565b6103bf6103ba3660046158de565b612248565b6040516101fd91906159e7565b6102196202a30081565b6102b66103e43660046158de565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615aa7565b612310565b6101d2610435366004615b20565b612345565b5f8381525f8051602061651d83398151915260205260408082208151610100810190925280545f805160206164bd83398151915293929190829060ff166003811115610488576104886159d3565b6003811115610499576104996159d3565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61051d82612248565b9050600283516003811115610534576105346159d3565b146105865760405162461bcd60e51b815260206004820152602a60248201525f805160206164dd8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105eb5760405162461bcd60e51b815260206004820152603360248201525f805160206164dd8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161057d565b6003835280515f906002906005811115610607576106076159d3565b0361065e57861561061f5761061c8387612424565b90505b5f846060015183608001516106349190615b72565b905061064084826126c0565b506001600160401b0390811660e0870152421660a086015250610692565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106c5866060015161157f565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b81526004016106f99796959493929190615b92565b602060405180830381865afa158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190615bd0565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff19166001836003811115610777576107776159d3565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088b916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061655d8339815191526020526040808220815160e0810190925280545f805160206164fd83398151915293929190829060ff1660058111156108ea576108ea6159d3565b60058111156108fb576108fb6159d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096a5761096a6159d3565b146109cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb6109f48584606001515f612817565b6040518263ffffffff1660e01b8152600401610a109190615c09565b6020604051808303815f875af1158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190615bd0565b50505050565b5f610a6664e8d4a5100083615c3b565b92915050565b5f805160206164bd8339815191525f80610a858461286e565b91509150610a9282612b8c565b610a9c5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610aca57610aca6159d3565b03610aef575f83815260088501602052604081208054919055610aed8282612bc7565b505b610b0581610b00846040015161157f565b612c3d565b5050505050565b5f8181525f8051602061651d83398151915260205260408082208151610100810190925280545f805160206164bd83398151915293929190829060ff166003811115610b5a57610b5a6159d3565b6003811115610b6b57610b6b6159d3565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf090612248565b9050600182516003811115610c0757610c076159d3565b14610c705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161057d565b600381516005811115610c8557610c856159d3565b03610dfd57600380835260c0820180516001600160401b0390811660808601529051811660a085015260608301511660e08401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610ce957610ce96159d3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1257610e126159d3565b03610e2057610b0584612c60565b5f610e2a86612e5d565b90505f80610e3b8360400151613023565b509150915081856040015114610e635760405162461bcd60e51b815260040161057d90615c5a565b806001600160401b031684606001516001600160401b03161015610ed45760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161057d565b806001600160401b03168560c001516001600160401b03161115610f0a5760405162461bcd60e51b815260040161057d90615ca4565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206164fd8339815191529060ff16156110395760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a09190615bd0565b8360200135146111025760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161057d565b306111136060850160408601615ced565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161057d565b5f6111936060850185615d08565b905090505f805b828163ffffffff161015611483575f6111b66060880188615d08565b8363ffffffff168181106111cc576111cc615d4d565b90506020028101906111de9190615d61565b6111e790615e11565b80515f818152600888016020526040902054919250901561125f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161057d565b5f6002895f01358560405160200161128e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a891615ea8565b602060405180830381855afa1580156112c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e69190615bd0565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115611372576113726159d3565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611425911686615eb9565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147c90615ecc565b905061119a565b50600483018190555f61149585612e5d565b90505f6114a5826040015161325e565b90505f6114b1886133d0565b9050816002826040516114c49190615ea8565b602060405180830381855afa1580156114df573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115029190615bd0565b146115665760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161057d565b5050506009909201805460ff1916600117905550505050565b5f610a666001600160401b03831664e8d4a51000615eee565b5f6115a282612248565b6080015192915050565b5f805160206164bd8339815191525f6115c485613869565b90506115cf85612b8c565b6115da575050505050565b5f8581526005830160205260409020546001600160a01b031633146116115760405162461bcd60e51b815260040161057d90615f05565b5f85815260058301602052604090205460a082015161164091600160b01b90046001600160401b031690615f57565b6001600160401b03168160c001516001600160401b031610156116c15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161057d565b8315610b05575f6116d28685612424565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117299061157f565b60a085015160c08601516040516001600160e01b031960e086901b16815261175d939291829188905f908190600401615b92565b602060405180830381865afa158015611778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c9190615bd0565b5f878152600885016020526040812080549091906117bb908490615eb9565b9091555050505050505050565b5f805160206164bd8339815191525f6117e083612248565b90506004815160058111156117f7576117f76159d3565b146118615760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161057d565b5f8381526005830160205260409020546001600160a01b031633146118985760405162461bcd60e51b815260040161057d90615f05565b5f83815260088301602090815260408083208054908490556005860190925290912054610a50906001600160a01b031682612bc7565b6118d6613ae4565b5f8181525f8051602061651d83398151915260205260408082208151610100810190925280545f805160206164bd83398151915293929190829060ff166003811115611924576119246159d3565b6003811115611935576119356159d3565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119b185612e5d565b90505f806119c28360400151613023565b5091509150818460400151146119ea5760405162461bcd60e51b815260040161057d90615c5a565b806001600160401b03168460e001516001600160401b03161115611a205760405162461bcd60e51b815260040161057d90615ca4565b600384516003811115611a3557611a356159d3565b14611a895760405162461bcd60e51b815260206004820152603160248201525f805160206164dd8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161057d565b611a9286612c60565b5050505050611aad60015f8051602061653d83398151915255565b5050565b611ab9613ae4565b5f8181525f8051602061651d83398151915260205260408082208151610100810190925280545f805160206164bd83398151915293929190829060ff166003811115611b0757611b076159d3565b6003811115611b1857611b186159d3565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611b9c82612248565b9050600481516005811115611bb357611bb36159d3565b14611c165760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161057d565b600183516003811115611c2b57611c2b6159d3565b03611c4257611c3985612c60565b50505050611d3f565b600283516003811115611c5757611c576159d3565b03611d31578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611c8f856060015161157f565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611ce196959493926001600160401b0390921691908190600401615b92565b602060405180830381865afa158015611cfc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d209190615bd0565b5f8681526007860160205260409020555b611d3a85612c60565b505050505b611d5560015f8051602061653d83398151915255565b50565b5f611d61613ae4565b611d6c833384613b2e565b9050610a6660015f8051602061653d83398151915255565b5f805160206164fd8339815191525f611d9c83612e5d565b90505f80611dad8360400151613ee8565b9150915080611e0f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057d565b60015f83815260078601602052604090205460ff166005811115611e3557611e356159d3565b14611e525760405162461bcd60e51b815260040161057d90615f77565b5f8281526006850160205260408120611e6a916157f3565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061651d83398151915260205260408082208151610100810190925280545f805160206164bd83398151915293929190829060ff166003811115611f4857611f486159d3565b6003811115611f5957611f596159d3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516003811115611fe057611fe06159d3565b1480611ffe5750600381516003811115611ffc57611ffc6159d3565b145b6120525760405162461bcd60e51b815260206004820152603260248201525f805160206164dd833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161057d565b5f6120608260400151612248565b905080606001516001600160401b03165f036120e45760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb612111846040015184606001518560800151612817565b6040518263ffffffff1660e01b815260040161212d9190615c09565b6020604051808303815f875af1158015612149573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190615bd0565b5f8181525f8051602061655d83398151915260205260409020545f805160206164fd8339815191529060019060ff1660058111156121ad576121ad6159d3565b146121ca5760405162461bcd60e51b815260040161057d90615f77565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916122039190600401615ffa565b6020604051808303815f875af115801561221f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122439190615bd0565b505050565b61225061582a565b5f8281525f8051602061655d833981519152602052604090819020815160e0810190925280545f805160206164fd833981519152929190829060ff16600581111561229d5761229d6159d3565b60058111156122ae576122ae6159d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f612319613ae4565b61232585858585614089565b905061233d60015f8051602061653d83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061238e575080546001600160401b03808416911610155b156123ac5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556123d78484614375565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561246f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612496919081019061608f565b91509150806124f95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561253c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125609190615bd0565b8251146125c45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057d565b60208201516001600160a01b03161561263a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057d565b5f80612649846040015161438f565b915091508187146126b65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057d565b9695505050505050565b5f8281525f8051602061655d833981519152602052604081206002015481905f805160206164fd83398151915290600160801b90046001600160401b03166127088582614567565b5f61271287614775565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6127628a858b612817565b6040518263ffffffff1660e01b815260040161277e9190615c09565b6020604051808303815f875af115801561279a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127be9190615bd0565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f61287761582a565b5f805160206164fd8339815191525f61288f85612e5d565b90505f806128a08360400151613ee8565b9150915080156129055760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057d565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612936576129366159d3565b6005811115612947576129476159d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156129b6576129b66159d3565b14806129d457506001815160058111156129d2576129d26159d3565b145b612a335760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161057d565b600381516005811115612a4857612a486159d3565b03612a565760048152612a5b565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612aa057612aa06159d3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b5457612b546159d3565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f8051602061649d83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c22575f80fd5b505af1158015612c34573d5f803e3d5ffd5b50505050505050565b5f8051602061649d83398151915254611aad906001600160a01b03168383614805565b5f8181525f8051602061651d83398151915260205260408082208151610100810190925280545f805160206164bd83398151915293929190829060ff166003811115612cae57612cae6159d3565b6003811115612cbf57612cbf6159d3565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612db390600160a01b900461ffff1684615eee565b612dbd9190615c3b565b905080856008015f8581526020019081526020015f205f828254612de19190615eb9565b909155505f9050612df28284616161565b9050612e02856020015182612bc7565b612e178560200151610b00876060015161157f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ec1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ee8919081019061608f565b9150915080612f485760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057d565b815115612fa95760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057d565b60208201516001600160a01b03161561301c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057d565b5092915050565b5f805f83516036146130475760405162461bcd60e51b815260040161057d90616174565b5f805b60028110156130965761305e816001616161565b613069906008615eee565b61ffff1686828151811061307f5761307f615d4d565b016020015160f81c901b919091179060010161304a565b5061ffff8116156130b95760405162461bcd60e51b815260040161057d906161bd565b5f805b6004811015613114576130d0816003616161565b6130db906008615eee565b63ffffffff16876130ed836002615eb9565b815181106130fd576130fd615d4d565b016020015160f81c901b91909117906001016130bc565b5063ffffffff811660041461313b5760405162461bcd60e51b815260040161057d90616200565b5f805b60208110156131905761315281601f616161565b61315d906008615eee565b88613169836006615eb9565b8151811061317957613179615d4d565b016020015160f81c901b919091179060010161313e565b505f805b60088110156131ef576131a8816007616161565b6131b3906008615eee565b6001600160401b0316896131c8836026615eb9565b815181106131d8576131d8615d4d565b016020015160f81c901b9190911790600101613194565b505f805b600881101561324e57613207816007616161565b613212906008615eee565b6001600160401b03168a61322783602e615eb9565b8151811061323757613237615d4d565b016020015160f81c901b91909117906001016131f3565b5091989097509095509350505050565b5f81516026146132805760405162461bcd60e51b815260040161057d90616174565b5f805b60028110156132cf57613297816001616161565b6132a2906008615eee565b61ffff168482815181106132b8576132b8615d4d565b016020015160f81c901b9190911790600101613283565b5061ffff8116156132f25760405162461bcd60e51b815260040161057d906161bd565b5f805b600481101561334d57613309816003616161565b613314906008615eee565b63ffffffff1685613326836002615eb9565b8151811061333657613336615d4d565b016020015160f81c901b91909117906001016132f5565b5063ffffffff8116156133725760405162461bcd60e51b815260040161057d90616200565b5f805b60208110156133c75761338981601f616161565b613394906008615eee565b866133a0836006615eb9565b815181106133b0576133b0615d4d565b016020015160f81c901b9190911790600101613375565b50949350505050565b60605f6133df83830184615d08565b6133eb91506058615eee565b6133f690605c615eb9565b6001600160401b0381111561340d5761340d615d7f565b6040519080825280601f01601f191660200182016040528015613437576020820181803683370190505b5090505f5b602081101561348c578335816020811061345857613458615d4d565b1a60f81b82828151811061346e5761346e615d4d565b60200101906001600160f81b03191690815f1a90535060010161343c565b505f5b60208110156134ec57836020013581602081106134ae576134ae615d4d565b1a60f81b826134be836020615eb9565b815181106134ce576134ce615d4d565b60200101906001600160f81b03191690815f1a90535060010161348f565b505f5b600481101561354f57613503816003616161565b61350e906008615eee565b6014901c60f81b82613521836040615eb9565b8151811061353157613531615d4d565b60200101906001600160f81b03191690815f1a9053506001016134ef565b505f6135616060850160408601615ced565b60601b90505f5b60148110156135c15781816014811061358357613583615d4d565b1a60f81b83613593836044615eb9565b815181106135a3576135a3615d4d565b60200101906001600160f81b03191690815f1a905350600101613568565b505f6135d06060860186615d08565b905090505f5b600481101561363b576135ea816003616161565b6135f5906008615eee565b63ffffffff8316901c60f81b8461360d836058615eb9565b8151811061361d5761361d615d4d565b60200101906001600160f81b03191690815f1a9053506001016135d6565b505f5b61364b6060870187615d08565b905081101561385f575f613660826058615eee565b61366b90605c615eb9565b90505f5b60208110156136f6576136856060890189615d08565b8481811061369557613695615d4d565b90506020028101906136a79190615d61565b3581602081106136b9576136b9615d4d565b1a60f81b866136c88385615eb9565b815181106136d8576136d8615d4d565b60200101906001600160f81b03191690815f1a90535060010161366f565b505f5b60088110156137ab5761370d816007616161565b613718906008615eee565b61372560608a018a615d08565b8581811061373557613735615d4d565b90506020028101906137479190615d61565b61375890604081019060200161599a565b6001600160401b0316901c60f81b8682613773856020615eb9565b61377d9190615eb9565b8151811061378d5761378d615d4d565b60200101906001600160f81b03191690815f1a9053506001016136f9565b505f5b6030811015613855576137c46060890189615d08565b848181106137d4576137d4615d4d565b90506020028101906137e69190615d61565b6137f4906040810190616247565b8281811061380457613804615d4d565b9050013560f81c60f81b868284602861381d9190615eb9565b6138279190615eb9565b8151811061383757613837615d4d565b60200101906001600160f81b03191690815f1a9053506001016137ae565b505060010161363e565b5091949350505050565b61387161582a565b5f8281525f8051602061655d8339815191526020526040808220815160e0810190925280545f805160206164fd83398151915293929190829060ff1660058111156138be576138be6159d3565b60058111156138cf576138cf6159d3565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613941576139416159d3565b1461399d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156139e1576139e16159d3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613a8d85826126c0565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061653d833981519152805460011901613b1557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061653d83398151915255565b5f5f805160206164bd83398151915281613b4a61021485614864565b90505f613b5687612248565b9050613b6187612b8c565b613bbe5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161057d565b600281516005811115613bd357613bd36159d3565b14613c325760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161057d565b5f828260800151613c439190615f57565b60048501546040840151919250613c65916001600160401b0390911690616289565b6001600160401b0316816001600160401b03161115613ce45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161057d565b5f80613cf08a846126c0565b915091505f8a83604051602001613d1e92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836003811115613db957613db96159d3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613f0b5760405162461bcd60e51b815260040161057d90616174565b5f805b6002811015613f5a57613f22816001616161565b613f2d906008615eee565b61ffff16858281518110613f4357613f43615d4d565b016020015160f81c901b9190911790600101613f0e565b5061ffff811615613f7d5760405162461bcd60e51b815260040161057d906161bd565b5f805b6004811015613fd857613f94816003616161565b613f9f906008615eee565b63ffffffff1686613fb1836002615eb9565b81518110613fc157613fc1615d4d565b016020015160f81c901b9190911790600101613f80565b5063ffffffff8116600314613fff5760405162461bcd60e51b815260040161057d90616200565b5f805b60208110156140545761401681601f616161565b614021906008615eee565b8761402d836006615eb9565b8151811061403d5761403d615d4d565b016020015160f81c901b9190911790600101614002565b505f8660268151811061406957614069615d4d565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206164bd8339815191529061ffff861610156141105760405162461bcd60e51b815260206004820152602b60248201525f805160206164dd83398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161057d565b61271061ffff861611156141685760405162461bcd60e51b815260206004820152602c60248201525f805160206164dd83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161057d565b60028101546001600160401b0390811690851610156141e15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161057d565b80548310156142445760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161057d565b80600101548311156142ab5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161057d565b5f6142b584614864565b90505f6142c182610a56565b90505f6142ce8983614887565b905060405180606001604052806142e23390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b61437d614e3d565b61438682614e88565b611aad81614efa565b5f808251602e146143b25760405162461bcd60e51b815260040161057d90616174565b5f805b6002811015614401576143c9816001616161565b6143d4906008615eee565b61ffff168582815181106143ea576143ea615d4d565b016020015160f81c901b91909117906001016143b5565b5061ffff8116156144245760405162461bcd60e51b815260040161057d906161bd565b5f805b600481101561447f5761443b816003616161565b614446906008615eee565b63ffffffff1686614458836002615eb9565b8151811061446857614468615d4d565b016020015160f81c901b9190911790600101614427565b5063ffffffff81166005146144a65760405162461bcd60e51b815260040161057d90616200565b5f805b60208110156144fb576144bd81601f616161565b6144c8906008615eee565b876144d4836006615eb9565b815181106144e4576144e4615d4d565b016020015160f81c901b91909117906001016144a9565b505f805b600881101561455a57614513816007616161565b61451e906008615eee565b6001600160401b031688614533836026615eb9565b8151811061454357614543615d4d565b016020015160f81c901b91909117906001016144ff565b5090969095509350505050565b5f805160206164fd8339815191525f6001600160401b03808416908516111561459b576145948385615b72565b90506145a8565b6145a58484615b72565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061460a575060018401548151614606916001600160401b031690615eb9565b8210155b15614630576001600160401b03831660608201528181526040810151602082015261464f565b82816060018181516146429190615f57565b6001600160401b03169052505b606081015161465f906064616289565b602082015160018601546001600160401b03929092169161468a9190600160401b900460ff16615eee565b10156146ee5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161057d565b856001600160401b0316816040018181516147099190615eb9565b9052506040810180516001600160401b0387169190614729908390616161565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061655d8339815191526020526040812060020180545f805160206164fd83398151915291600160401b9091046001600160401b03169060086147bf836162b4565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b0383811660248301526044820183905261224391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614f9b565b5f610a66825f8051602061649d833981519152546001600160a01b031690614ffc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166149125760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161057d565b5f805160206164fd83398151915242614931604086016020870161599a565b6001600160401b0316116149a35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161057d565b6149b3604085016020860161599a565b6001600160401b03166149c96202a30042615eb9565b11614a3c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161057d565b8335614a945760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161057d565b83355f90815260088201602052604090205415614b045760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057d565b6030614b136040860186616247565b905014614b785760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057d565b614b82835f614567565b5f80614c1b6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614bc6919061599a565b6001600160401b03168152602001614be160408a018a616247565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061515e565b5f82815260068601602052604090209193509150614c398282616313565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614c77908590600401615c09565b6020604051808303815f875af1158015614c93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614cb79190615bd0565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614d2f57614d2f6159d3565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614e0f918e01908e0161599a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614e8657604051631afcd79f60e31b815260040160405180910390fd5b565b614e90614e3d565b614e9981615262565b614ea161527b565b611d5560608201356080830135614ebe60c0850160a0860161599a565b614ece60e0860160c087016163d2565b61ffff16614ee3610100870160e088016163eb565b614ef561012088016101008901615ced565b61528b565b614f02614e3d565b5f8051602061649d8339815191526001600160a01b038216614f7b5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161057d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f614faf6001600160a01b03841683615513565b905080515f14158015614fd3575080806020019051810190614fd1919061640b565b155b1561224357604051635274afe760e01b81526001600160a01b038416600482015260240161057d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015615042573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150669190615bd0565b905061507d6001600160a01b038516333086615520565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156150c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150e59190615bd0565b905081811161514b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161057d565b6151558282616161565b95945050505050565b5f60608260800151516030146151c85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057d565b5f806001855f015186602001518760400151886080015189606001516040516020016151fa9796959493929190616426565b604051602081830303815290604052905060028160405161521b9190615ea8565b602060405180830381855afa158015615236573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152599190615bd0565b94909350915050565b61526a614e3d565b615272615559565b611d5581615561565b615283614e3d565b614e866156dc565b615293614e3d565b5f805160206164bd833981519152836152ff5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161057d565b6127108411156153655760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161057d565b858711156153cd5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161057d565b5f8360ff161161543a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161057d565b600a60ff841611156154ac5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161057d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b606061286783835f6156e4565b6040516001600160a01b038481166024830152838116604483015260648201839052610a509186918216906323b872dd90608401614832565b614e86614e3d565b615569614e3d565b80355f805160206164fd833981519152908155601461558e60608401604085016163eb565b60ff1611156155fb5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161057d565b5f61560c60608401604085016163eb565b60ff16116156745760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161057d565b61568460608301604084016163eb565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556156b5604083016020840161599a565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613b1b614e3d565b6060814710156157095760405163cd78605960e01b815230600482015260240161057d565b5f80856001600160a01b031684866040516157249190615ea8565b5f6040518083038185875af1925050503d805f811461575e576040519150601f19603f3d011682016040523d82523d5f602084013e615763565b606091505b50915091506126b68683836060826157835761577e826157ca565b612867565b815115801561579a57506001600160a01b0384163b155b156157c357604051639996b31560e01b81526001600160a01b038516600482015260240161057d565b5080612867565b8051156157da5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546157ff90615fc2565b5f825580601f1061580e575050565b601f0160209004905f5260205f2090810190611d559190615866565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561587a575f8155600101615867565b5090565b8015158114611d55575f80fd5b803563ffffffff8116811461589e575f80fd5b919050565b5f805f606084860312156158b5575f80fd5b8335925060208401356158c78161587e565b91506158d56040850161588b565b90509250925092565b5f602082840312156158ee575f80fd5b5035919050565b5f60208284031215615905575f80fd5b6128678261588b565b5f806040838503121561591f575f80fd5b6159288361588b565b946020939093013593505050565b5f8060408385031215615947575f80fd5b82356001600160401b0381111561595c575f80fd5b83016080818603121561596d575f80fd5b915061597b6020840161588b565b90509250929050565b80356001600160401b038116811461589e575f80fd5b5f602082840312156159aa575f80fd5b61286782615984565b5f80604083850312156159c4575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110615a0a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151615a4560608401826001600160401b03169052565b506080830151615a6060808401826001600160401b03169052565b5060a0830151615a7b60a08401826001600160401b03169052565b5060c083015161301c60c08401826001600160401b03169052565b803561ffff8116811461589e575f80fd5b5f805f8060808587031215615aba575f80fd5b84356001600160401b03811115615acf575f80fd5b850160608188031215615ae0575f80fd5b9350615aee60208601615a96565b9250615afc60408601615984565b9396929550929360600135925050565b6001600160a01b0381168114611d55575f80fd5b5f80828403610140811215615b33575f80fd5b61012080821215615b42575f80fd5b8493508301359050615b5381615b0c565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561301c5761301c615b5e565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615be0575f80fd5b5051919050565b5f5b83811015615c01578181015183820152602001615be9565b50505f910152565b602081525f8251806020840152615c27816040850160208701615be7565b601f01601f19169190910160400192915050565b5f82615c5557634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615cfd575f80fd5b813561286781615b0c565b5f808335601e19843603018112615d1d575f80fd5b8301803591506001600160401b03821115615d36575f80fd5b6020019150600581901b3603821315612810575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615d75575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615db557615db5615d7f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615de357615de3615d7f565b604052919050565b5f6001600160401b03821115615e0357615e03615d7f565b50601f01601f191660200190565b5f60608236031215615e21575f80fd5b615e29615d93565b823581526020615e3a818501615984565b8183015260408401356001600160401b03811115615e56575f80fd5b840136601f820112615e66575f80fd5b8035615e79615e7482615deb565b615dbb565b8181523684838501011115615e8c575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615d75818460208701615be7565b80820180821115610a6657610a66615b5e565b5f63ffffffff808316818103615ee457615ee4615b5e565b6001019392505050565b8082028115828204841417610a6657610a66615b5e565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561301c5761301c615b5e565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615fd657607f821691505b602082108103615ff457634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461600c81615fc2565b806020870152604060018084165f811461602d576001811461604957616076565b60ff19851660408a0152604084151560051b8a01019550616076565b895f5260205f205f5b8581101561606d5781548b8201860152908301908801616052565b8a016040019650505b509398975050505050505050565b805161589e8161587e565b5f80604083850312156160a0575f80fd5b82516001600160401b03808211156160b6575f80fd5b90840190606082870312156160c9575f80fd5b6160d1615d93565b825181526020808401516160e481615b0c565b828201526040840151838111156160f9575f80fd5b80850194505087601f85011261610d575f80fd5b8351925061611d615e7484615deb565b8381528882858701011115616130575f80fd5b61613f84838301848801615be7565b80604084015250819550616154818801616084565b9450505050509250929050565b81810381811115610a6657610a66615b5e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e1984360301811261625c575f80fd5b8301803591506001600160401b03821115616275575f80fd5b602001915036819003821315612810575f80fd5b6001600160401b038181168382160280821691908281146162ac576162ac615b5e565b505092915050565b5f6001600160401b03808316818103615ee457615ee4615b5e565b601f82111561224357805f5260205f20601f840160051c810160208510156162f45750805b601f840160051c820191505b81811015610b05575f8155600101616300565b81516001600160401b0381111561632c5761632c615d7f565b6163408161633a8454615fc2565b846162cf565b602080601f831160018114616373575f841561635c5750858301515b5f19600386901b1c1916600185901b1785556163ca565b5f85815260208120601f198616915b828110156163a157888601518255948401946001909101908401616382565b50858210156163be57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156163e2575f80fd5b61286782615a96565b5f602082840312156163fb575f80fd5b813560ff81168114612867575f80fd5b5f6020828403121561641b575f80fd5b81516128678161587e565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161647b81604e860160208901615be7565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 b8fd26513..d5e1499c8 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161640238038061640283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162b58061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d836600461566c565b61058b565b005b3480156101ea575f80fd5b506101dd6101f93660046156a7565b6109ee565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd6102433660046156be565b610ba7565b348015610253575f80fd5b506102676102623660046156a7565b610c84565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046156fc565b610c9a565b604051908152602001610220565b348015610305575f80fd5b506101dd610314366004615750565b610cce565b348015610324575f80fd5b506101dd610333366004615769565b610d6e565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b366004615791565b6111fe565b34801561038b575f80fd5b506102ec61039a3660046157df565b6117e1565b3480156103aa575f80fd5b506102676103b93660046156a7565b6117fa565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb36600461566c565b61180e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e3660046156a7565b611a2a565b34801561042e575f80fd5b506101dd61043d366004615769565b611b30565b34801561044d575f80fd5b506101dd61045c3660046156a7565b611d13565b34801561046c575f80fd5b506101dd61047b366004615750565b61201c565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b43660046156a7565b612192565b3480156104c4575f80fd5b506101dd6104d33660046156a7565b612405565b6102ec6104e63660046156a7565b6124e0565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e6105193660046156a7565b612511565b604051610220919061580c565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b3660046156a7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f8051602061624983398151915260205260408082208151610100810190925280545f805160206161e983398151915293929190829060ff1660048111156105d9576105d96157f8565b60048111156105ea576105ea6157f8565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61066e82612511565b9050600283516004811115610685576106856157f8565b146106d75760405162461bcd60e51b815260206004820152602a60248201525f805160206162098339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461073c5760405162461bcd60e51b815260206004820152603360248201525f805160206162098339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106ce565b6003835280515f906002906005811115610758576107586157f8565b036107af5786156107705761076d83876125d9565b90505b5f8460600151836080015161078591906158cf565b90506107918482612875565b506001600160401b0390811660e0870152421660a0860152506107e3565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561081686606001516117e1565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b815260040161084a97969594939291906158ef565b602060405180830381865afa158015610865573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610889919061592d565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360048111156108c8576108c86157f8565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109dc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206162898339815191526020526040808220815160e0810190925280545f8051602061622983398151915293929190829060ff166005811115610a3b57610a3b6157f8565b6005811115610a4c57610a4c6157f8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abb57610abb6157f8565b14610b205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb610b458584606001515f6129cc565b6040518263ffffffff1660e01b8152600401610b619190615966565b6020604051808303815f875af1158015610b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba1919061592d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c3883612a1b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9464e8d4a5100083615998565b92915050565b5f610ca3612a2c565b610caf84848434612a63565b9050610cc760015f8051602061626983398151915255565b9392505050565b5f805160206161e98339815191525f80610ce784612d57565b91509150610cf482613075565b610cfe5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d2c57610d2c6157f8565b03610d51575f83815260088501602052604081208054919055610d4f82826130b0565b505b610d6781610d6284604001516117e1565b613116565b5050505050565b5f8181525f8051602061624983398151915260205260408082208151610100810190925280545f805160206161e983398151915293929190829060ff166004811115610dbc57610dbc6157f8565b6004811115610dcd57610dcd6157f8565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e5290612511565b9050600182516004811115610e6957610e696157f8565b14610ed25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106ce565b600381516005811115610ee757610ee76157f8565b0361105f576003825260c0810180516001600160401b0390811660808501529051811660a084015260608201511660e08301525f84815260068401602052604090208251815484929190829060ff19166001836004811115610f4b57610f4b6157f8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115611074576110746157f8565b0361108257610d6784613129565b5f61108c86613326565b90505f8061109d83604001516134ec565b5091509150818560400151146110c55760405162461bcd60e51b81526004016106ce906159b7565b806001600160401b031684606001516001600160401b031610156111365760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106ce565b806001600160401b03168560c001516001600160401b0316111561116c5760405162461bcd60e51b81526004016106ce90615a01565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206162298339815191529060ff161561129b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611302919061592d565b8360200135146113645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106ce565b306113756060850160408601615a5e565b6001600160a01b0316146113e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106ce565b5f6113f56060850185615a79565b905090505f805b828163ffffffff1610156116e5575f6114186060880188615a79565b8363ffffffff1681811061142e5761142e615abe565b90506020028101906114409190615ad2565b61144990615b82565b80515f81815260088801602052604090205491925090156114c15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106ce565b5f6002895f0135856040516020016114f092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150a91615c19565b602060405180830381855afa158015611525573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611548919061592d565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d4576115d46157f8565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611687911686615c2a565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116de90615c3d565b90506113fc565b50600483018190555f6116f785613326565b90505f6117078260400151613727565b90505f61171388613899565b9050816002826040516117269190615c19565b602060405180830381855afa158015611741573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611764919061592d565b146117c85760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106ce565b5050506009909201805460ff1916600117905550505050565b5f610c946001600160401b03831664e8d4a51000615c5f565b5f61180482612511565b6080015192915050565b5f805160206161e98339815191525f61182685613d32565b905061183185613075565b61183c575050505050565b5f8581526005830160205260409020546001600160a01b031633146118735760405162461bcd60e51b81526004016106ce90615c76565b5f85815260058301602052604090205460a08201516118a291600160b01b90046001600160401b031690615cc8565b6001600160401b03168160c001516001600160401b031610156119235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106ce565b8315610d67575f61193486856125d9565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198b906117e1565b60a085015160c08601516040516001600160e01b031960e086901b1681526119bf939291829188905f9081906004016158ef565b602060405180830381865afa1580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe919061592d565b5f87815260088501602052604081208054909190611a1d908490615c2a565b9091555050505050505050565b5f805160206161e98339815191525f611a4283612511565b9050600481516005811115611a5957611a596157f8565b14611ac35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106ce565b5f8381526005830160205260409020546001600160a01b03163314611afa5760405162461bcd60e51b81526004016106ce90615c76565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba1906001600160a01b0316826130b0565b611b38612a2c565b5f8181525f8051602061624983398151915260205260408082208151610100810190925280545f805160206161e983398151915293929190829060ff166004811115611b8657611b866157f8565b6004811115611b9757611b976157f8565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c1385613326565b90505f80611c2483604001516134ec565b509150915081846040015114611c4c5760405162461bcd60e51b81526004016106ce906159b7565b806001600160401b03168460e001516001600160401b03161115611c825760405162461bcd60e51b81526004016106ce90615a01565b600384516004811115611c9757611c976157f8565b14611ceb5760405162461bcd60e51b815260206004820152603160248201525f805160206162098339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106ce565b611cf486613129565b5050505050611d0f60015f8051602061626983398151915255565b5050565b611d1b612a2c565b5f8181525f8051602061624983398151915260205260408082208151610100810190925280545f805160206161e983398151915293929190829060ff166004811115611d6957611d696157f8565b6004811115611d7a57611d7a6157f8565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611dfe82612511565b9050600481516005811115611e1557611e156157f8565b14611e785760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106ce565b600283516004811115611e8d57611e8d6157f8565b1480611eab5750600383516004811115611ea957611ea96157f8565b145b611f075760405162461bcd60e51b815260206004820152602760248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526632b3b0ba34b7b760c91b60648201526084016106ce565b600283516004811115611f1c57611f1c6157f8565b03611ff6578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611f5485606001516117e1565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611fa696959493926001600160401b03909216919081906004016158ef565b602060405180830381865afa158015611fc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe5919061592d565b5f8681526007860160205260409020555b611fff85613129565b5050505061201960015f8051602061626983398151915255565b50565b5f805160206162298339815191525f61203483613326565b90505f806120458360400151613fad565b91509150806120a75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106ce565b60015f83815260078601602052604090205460ff1660058111156120cd576120cd6157f8565b146120ea5760405162461bcd60e51b81526004016106ce90615ce8565b5f8281526006850160205260408120612102916155c1565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061624983398151915260205260408082208151610100810190925280545f805160206161e983398151915293929190829060ff1660048111156121e0576121e06157f8565b60048111156121f1576121f16157f8565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516004811115612278576122786157f8565b14806122965750600381516004811115612294576122946157f8565b145b6122ea5760405162461bcd60e51b815260206004820152603260248201525f80516020616209833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106ce565b5f6122f88260400151612511565b905080606001516001600160401b03165f0361237c5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb6123a98460400151846060015185608001516129cc565b6040518263ffffffff1660e01b81526004016123c59190615966565b6020604051808303815f875af11580156123e1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d67919061592d565b5f8181525f8051602061628983398151915260205260409020545f805160206162298339815191529060019060ff166005811115612445576124456157f8565b146124625760405162461bcd60e51b81526004016106ce90615ce8565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161249b9190600401615d65565b6020604051808303815f875af11580156124b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124db919061592d565b505050565b5f6124e9612a2c565b6124f482333461414e565b905061250c60015f8051602061626983398151915255565b919050565b6125196155f8565b5f8281525f80516020616289833981519152602052604090819020815160e0810190925280545f80516020616229833981519152929190829060ff166005811115612566576125666157f8565b6005811115612577576125776157f8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612624573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261264b9190810190615dfa565b91509150806126ae5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156126f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612715919061592d565b8251146127795760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106ce565b60208201516001600160a01b0316156127ef5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106ce565b5f806127fe8460400151614505565b9150915081871461286b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106ce565b9695505050505050565b5f8281525f80516020616289833981519152602052604081206002015481905f8051602061622983398151915290600160801b90046001600160401b03166128bd85826146dd565b5f6128c7876148eb565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129178a858b6129cc565b6040518263ffffffff1660e01b81526004016129339190615966565b6020604051808303815f875af115801561294f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612973919061592d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612a2361497b565b612019816149c6565b5f80516020616269833981519152805460011901612a5d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206161e98339815191529061ffff86161015612aea5760405162461bcd60e51b815260206004820152602b60248201525f8051602061620983398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106ce565b61271061ffff86161115612b425760405162461bcd60e51b815260206004820152602c60248201525f8051602061620983398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106ce565b60028101546001600160401b039081169085161015612bbb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106ce565b8054831015612c1e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106ce565b8060010154831115612c855760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106ce565b825f612c9082610c84565b90505f612c9d8983614a38565b90506040518060600160405280612cb13390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061626983398151915255565b5f612d606155f8565b5f805160206162298339815191525f612d7885613326565b90505f80612d898360400151613fad565b915091508015612dee5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106ce565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612e1f57612e1f6157f8565b6005811115612e3057612e306157f8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612e9f57612e9f6157f8565b1480612ebd5750600181516005811115612ebb57612ebb6157f8565b145b612f1c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106ce565b600381516005811115612f3157612f316157f8565b03612f3f5760048152612f44565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f8957612f896157f8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561303d5761303d6157f8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156130fc575f80fd5b505af115801561310e573d5f803e3d5ffd5b505050505050565b611d0f6001600160a01b03831682614fee565b5f8181525f8051602061624983398151915260205260408082208151610100810190925280545f805160206161e983398151915293929190829060ff166004811115613177576131776157f8565b6004811115613188576131886157f8565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061327c90600160a01b900461ffff1684615c5f565b6132869190615998565b905080856008015f8581526020019081526020015f205f8282546132aa9190615c2a565b909155505f90506132bb8284615ecc565b90506132cb8560200151826130b0565b6132e08560200151610d6287606001516117e1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561338a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526133b19190810190615dfa565b91509150806134115760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106ce565b8151156134725760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106ce565b60208201516001600160a01b0316156134e55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106ce565b5092915050565b5f805f83516036146135105760405162461bcd60e51b81526004016106ce90615edf565b5f805b600281101561355f57613527816001615ecc565b613532906008615c5f565b61ffff1686828151811061354857613548615abe565b016020015160f81c901b9190911790600101613513565b5061ffff8116156135825760405162461bcd60e51b81526004016106ce90615f28565b5f805b60048110156135dd57613599816003615ecc565b6135a4906008615c5f565b63ffffffff16876135b6836002615c2a565b815181106135c6576135c6615abe565b016020015160f81c901b9190911790600101613585565b5063ffffffff81166004146136045760405162461bcd60e51b81526004016106ce90615f6b565b5f805b60208110156136595761361b81601f615ecc565b613626906008615c5f565b88613632836006615c2a565b8151811061364257613642615abe565b016020015160f81c901b9190911790600101613607565b505f805b60088110156136b857613671816007615ecc565b61367c906008615c5f565b6001600160401b031689613691836026615c2a565b815181106136a1576136a1615abe565b016020015160f81c901b919091179060010161365d565b505f805b6008811015613717576136d0816007615ecc565b6136db906008615c5f565b6001600160401b03168a6136f083602e615c2a565b8151811061370057613700615abe565b016020015160f81c901b91909117906001016136bc565b5091989097509095509350505050565b5f81516026146137495760405162461bcd60e51b81526004016106ce90615edf565b5f805b600281101561379857613760816001615ecc565b61376b906008615c5f565b61ffff1684828151811061378157613781615abe565b016020015160f81c901b919091179060010161374c565b5061ffff8116156137bb5760405162461bcd60e51b81526004016106ce90615f28565b5f805b6004811015613816576137d2816003615ecc565b6137dd906008615c5f565b63ffffffff16856137ef836002615c2a565b815181106137ff576137ff615abe565b016020015160f81c901b91909117906001016137be565b5063ffffffff81161561383b5760405162461bcd60e51b81526004016106ce90615f6b565b5f805b60208110156138905761385281601f615ecc565b61385d906008615c5f565b86613869836006615c2a565b8151811061387957613879615abe565b016020015160f81c901b919091179060010161383e565b50949350505050565b60605f6138a883830184615a79565b6138b491506058615c5f565b6138bf90605c615c2a565b6001600160401b038111156138d6576138d6615af0565b6040519080825280601f01601f191660200182016040528015613900576020820181803683370190505b5090505f5b6020811015613955578335816020811061392157613921615abe565b1a60f81b82828151811061393757613937615abe565b60200101906001600160f81b03191690815f1a905350600101613905565b505f5b60208110156139b5578360200135816020811061397757613977615abe565b1a60f81b82613987836020615c2a565b8151811061399757613997615abe565b60200101906001600160f81b03191690815f1a905350600101613958565b505f5b6004811015613a18576139cc816003615ecc565b6139d7906008615c5f565b6014901c60f81b826139ea836040615c2a565b815181106139fa576139fa615abe565b60200101906001600160f81b03191690815f1a9053506001016139b8565b505f613a2a6060850160408601615a5e565b60601b90505f5b6014811015613a8a57818160148110613a4c57613a4c615abe565b1a60f81b83613a5c836044615c2a565b81518110613a6c57613a6c615abe565b60200101906001600160f81b03191690815f1a905350600101613a31565b505f613a996060860186615a79565b905090505f5b6004811015613b0457613ab3816003615ecc565b613abe906008615c5f565b63ffffffff8316901c60f81b84613ad6836058615c2a565b81518110613ae657613ae6615abe565b60200101906001600160f81b03191690815f1a905350600101613a9f565b505f5b613b146060870187615a79565b9050811015613d28575f613b29826058615c5f565b613b3490605c615c2a565b90505f5b6020811015613bbf57613b4e6060890189615a79565b84818110613b5e57613b5e615abe565b9050602002810190613b709190615ad2565b358160208110613b8257613b82615abe565b1a60f81b86613b918385615c2a565b81518110613ba157613ba1615abe565b60200101906001600160f81b03191690815f1a905350600101613b38565b505f5b6008811015613c7457613bd6816007615ecc565b613be1906008615c5f565b613bee60608a018a615a79565b85818110613bfe57613bfe615abe565b9050602002810190613c109190615ad2565b613c219060408101906020016157df565b6001600160401b0316901c60f81b8682613c3c856020615c2a565b613c469190615c2a565b81518110613c5657613c56615abe565b60200101906001600160f81b03191690815f1a905350600101613bc2565b505f5b6030811015613d1e57613c8d6060890189615a79565b84818110613c9d57613c9d615abe565b9050602002810190613caf9190615ad2565b613cbd906040810190615fb2565b82818110613ccd57613ccd615abe565b9050013560f81c60f81b8682846028613ce69190615c2a565b613cf09190615c2a565b81518110613d0057613d00615abe565b60200101906001600160f81b03191690815f1a905350600101613c77565b5050600101613b07565b5091949350505050565b613d3a6155f8565b5f8281525f805160206162898339815191526020526040808220815160e0810190925280545f8051602061622983398151915293929190829060ff166005811115613d8757613d876157f8565b6005811115613d9857613d986157f8565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e0a57613e0a6157f8565b14613e665760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106ce565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613eaa57613eaa6157f8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f568582612875565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613fd05760405162461bcd60e51b81526004016106ce90615edf565b5f805b600281101561401f57613fe7816001615ecc565b613ff2906008615c5f565b61ffff1685828151811061400857614008615abe565b016020015160f81c901b9190911790600101613fd3565b5061ffff8116156140425760405162461bcd60e51b81526004016106ce90615f28565b5f805b600481101561409d57614059816003615ecc565b614064906008615c5f565b63ffffffff1686614076836002615c2a565b8151811061408657614086615abe565b016020015160f81c901b9190911790600101614045565b5063ffffffff81166003146140c45760405162461bcd60e51b81526004016106ce90615f6b565b5f805b6020811015614119576140db81601f615ecc565b6140e6906008615c5f565b876140f2836006615c2a565b8151811061410257614102615abe565b016020015160f81c901b91909117906001016140c7565b505f8660268151811061412e5761412e615abe565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206161e98339815191528161416784610c84565b90505f61417387612511565b905061417e87613075565b6141db5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106ce565b6002815160058111156141f0576141f06157f8565b1461424f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106ce565b5f8282608001516142609190615cc8565b60048501546040840151919250614282916001600160401b0390911690615ff4565b6001600160401b0316816001600160401b031611156143015760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106ce565b5f8061430d8a84612875565b915091505f8a8360405160200161433b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360048111156143d6576143d66157f8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146145285760405162461bcd60e51b81526004016106ce90615edf565b5f805b60028110156145775761453f816001615ecc565b61454a906008615c5f565b61ffff1685828151811061456057614560615abe565b016020015160f81c901b919091179060010161452b565b5061ffff81161561459a5760405162461bcd60e51b81526004016106ce90615f28565b5f805b60048110156145f5576145b1816003615ecc565b6145bc906008615c5f565b63ffffffff16866145ce836002615c2a565b815181106145de576145de615abe565b016020015160f81c901b919091179060010161459d565b5063ffffffff811660051461461c5760405162461bcd60e51b81526004016106ce90615f6b565b5f805b60208110156146715761463381601f615ecc565b61463e906008615c5f565b8761464a836006615c2a565b8151811061465a5761465a615abe565b016020015160f81c901b919091179060010161461f565b505f805b60088110156146d057614689816007615ecc565b614694906008615c5f565b6001600160401b0316886146a9836026615c2a565b815181106146b9576146b9615abe565b016020015160f81c901b9190911790600101614675565b5090969095509350505050565b5f805160206162298339815191525f6001600160401b0380841690851611156147115761470a83856158cf565b905061471e565b61471b84846158cf565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061478057506001840154815161477c916001600160401b031690615c2a565b8210155b156147a6576001600160401b0383166060820152818152604081015160208201526147c5565b82816060018181516147b89190615cc8565b6001600160401b03169052505b60608101516147d5906064615ff4565b602082015160018601546001600160401b0392909216916148009190600160401b900460ff16615c5f565b10156148645760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106ce565b856001600160401b03168160400181815161487f9190615c2a565b9052506040810180516001600160401b038716919061489f908390615ecc565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162898339815191526020526040812060020180545f8051602061622983398151915291600160401b9091046001600160401b03169060086149358361601f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166149c457604051631afcd79f60e31b815260040160405180910390fd5b565b6149ce61497b565b6149d781615081565b6149df61509a565b612019606082013560808301356149fc60c0850160a086016157df565b614a0c60e0860160c0870161603a565b61ffff16614a21610100870160e08801616053565b614a3361012088016101008901615a5e565b6150aa565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16614ac35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106ce565b5f8051602061622983398151915242614ae260408601602087016157df565b6001600160401b031611614b545760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106ce565b614b6460408501602086016157df565b6001600160401b0316614b7a6202a30042615c2a565b11614bed5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106ce565b8335614c455760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106ce565b83355f90815260088201602052604090205415614cb55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106ce565b6030614cc46040860186615fb2565b905014614d295760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106ce565b614d33835f6146dd565b5f80614dcc6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614d7791906157df565b6001600160401b03168152602001614d9260408a018a615fb2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250615332565b5f82815260068601602052604090209193509150614dea82826160b7565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614e28908590600401615966565b6020604051808303815f875af1158015614e44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e68919061592d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614ee057614ee06157f8565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614fc0918e01908e016157df565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156150115760405163cd78605960e01b81523060048201526024016106ce565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461505a576040519150601f19603f3d011682016040523d82523d5f602084013e61505f565b606091505b50509050806124db57604051630a12f52160e11b815260040160405180910390fd5b61508961497b565b615091615436565b6120198161543e565b6150a261497b565b6149c46155b9565b6150b261497b565b5f805160206161e98339815191528361511e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106ce565b6127108411156151845760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106ce565b858711156151ec5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106ce565b5f8360ff16116152595760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106ce565b600a60ff841611156152cb5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106ce565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461539c5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106ce565b5f806001855f015186602001518760400151886080015189606001516040516020016153ce9796959493929190616172565b60405160208183030381529060405290506002816040516153ef9190615c19565b602060405180830381855afa15801561540a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061542d919061592d565b94909350915050565b6149c461497b565b61544661497b565b80355f80516020616229833981519152908155601461546b6060840160408501616053565b60ff1611156154d85760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106ce565b5f6154e96060840160408501616053565b60ff16116155515760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106ce565b6155616060830160408401616053565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561559260408301602084016157df565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d4461497b565b5080546155cd90615d33565b5f825580601f106155dc575050565b601f0160209004905f5260205f20908101906120199190615634565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615648575f8155600101615635565b5090565b8015158114612019575f80fd5b803563ffffffff8116811461250c575f80fd5b5f805f6060848603121561567e575f80fd5b8335925060208401356156908161564c565b915061569e60408501615659565b90509250925092565b5f602082840312156156b7575f80fd5b5035919050565b5f61012082840312156156cf575f80fd5b50919050565b803561ffff8116811461250c575f80fd5b80356001600160401b038116811461250c575f80fd5b5f805f6060848603121561570e575f80fd5b83356001600160401b03811115615723575f80fd5b840160608187031215615734575f80fd5b9250615742602085016156d5565b915061569e604085016156e6565b5f60208284031215615760575f80fd5b610cc782615659565b5f806040838503121561577a575f80fd5b61578383615659565b946020939093013593505050565b5f80604083850312156157a2575f80fd5b82356001600160401b038111156157b7575f80fd5b8301608081860312156157c8575f80fd5b91506157d660208401615659565b90509250929050565b5f602082840312156157ef575f80fd5b610cc7826156e6565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061582f57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161586a60608401826001600160401b03169052565b50608083015161588560808401826001600160401b03169052565b5060a08301516158a060a08401826001600160401b03169052565b5060c08301516134e560c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156134e5576134e56158bb565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f6020828403121561593d575f80fd5b5051919050565b5f5b8381101561595e578181015183820152602001615946565b50505f910152565b602081525f8251806020840152615984816040850160208701615944565b601f01601f19169190910160400192915050565b5f826159b257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612019575f80fd5b5f60208284031215615a6e575f80fd5b8135610cc781615a4a565b5f808335601e19843603018112615a8e575f80fd5b8301803591506001600160401b03821115615aa7575f80fd5b6020019150600581901b36038213156129c5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615ae6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b2657615b26615af0565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615b5457615b54615af0565b604052919050565b5f6001600160401b03821115615b7457615b74615af0565b50601f01601f191660200190565b5f60608236031215615b92575f80fd5b615b9a615b04565b823581526020615bab8185016156e6565b8183015260408401356001600160401b03811115615bc7575f80fd5b840136601f820112615bd7575f80fd5b8035615bea615be582615b5c565b615b2c565b8181523684838501011115615bfd575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615ae6818460208701615944565b80820180821115610c9457610c946158bb565b5f63ffffffff808316818103615c5557615c556158bb565b6001019392505050565b8082028115828204841417610c9457610c946158bb565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156134e5576134e56158bb565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615d4757607f821691505b6020821081036156cf57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615d7781615d33565b806020870152604060018084165f8114615d985760018114615db457615de1565b60ff19851660408a0152604084151560051b8a01019550615de1565b895f5260205f205f5b85811015615dd85781548b8201860152908301908801615dbd565b8a016040019650505b509398975050505050505050565b805161250c8161564c565b5f8060408385031215615e0b575f80fd5b82516001600160401b0380821115615e21575f80fd5b9084019060608287031215615e34575f80fd5b615e3c615b04565b82518152602080840151615e4f81615a4a565b82820152604084015183811115615e64575f80fd5b80850194505087601f850112615e78575f80fd5b83519250615e88615be584615b5c565b8381528882858701011115615e9b575f80fd5b615eaa84838301848801615944565b80604084015250819550615ebf818801615def565b9450505050509250929050565b81810381811115610c9457610c946158bb565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615fc7575f80fd5b8301803591506001600160401b03821115615fe0575f80fd5b6020019150368190038213156129c5575f80fd5b6001600160401b03818116838216028082169190828114616017576160176158bb565b505092915050565b5f6001600160401b03808316818103615c5557615c556158bb565b5f6020828403121561604a575f80fd5b610cc7826156d5565b5f60208284031215616063575f80fd5b813560ff81168114610cc7575f80fd5b601f8211156124db57805f5260205f20601f840160051c810160208510156160985750805b601f840160051c820191505b81811015610d67575f81556001016160a4565b81516001600160401b038111156160d0576160d0615af0565b6160e4816160de8454615d33565b84616073565b602080601f831160018114616117575f84156161005750858301515b5f19600386901b1c1916600185901b17855561310e565b5f85815260208120601f198616915b8281101561614557888601518255948401946001909101908401616126565b508582101561616257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516161c781604e860160208901615944565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516163a03803806163a083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162538061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d836600461560a565b61058b565b005b3480156101ea575f80fd5b506101dd6101f9366004615645565b6109ee565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd61024336600461565c565b610ba7565b348015610253575f80fd5b50610267610262366004615645565b610c84565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e736600461569a565b610c9a565b604051908152602001610220565b348015610305575f80fd5b506101dd6103143660046156ee565b610cce565b348015610324575f80fd5b506101dd610333366004615707565b610d6e565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b36600461572f565b6111fe565b34801561038b575f80fd5b506102ec61039a36600461577d565b6117e1565b3480156103aa575f80fd5b506102676103b9366004615645565b6117fa565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb36600461560a565b61180e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e366004615645565b611a2a565b34801561042e575f80fd5b506101dd61043d366004615707565b611b30565b34801561044d575f80fd5b506101dd61045c366004615645565b611d13565b34801561046c575f80fd5b506101dd61047b3660046156ee565b611fba565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b4366004615645565b612130565b3480156104c4575f80fd5b506101dd6104d3366004615645565b6123a3565b6102ec6104e6366004615645565b61247e565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e610519366004615645565b6124af565b60405161022091906157aa565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b366004615645565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206161e783398151915260205260408082208151610100810190925280545f8051602061618783398151915293929190829060ff1660038111156105d9576105d9615796565b60038111156105ea576105ea615796565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61066e826124af565b905060028351600381111561068557610685615796565b146106d75760405162461bcd60e51b815260206004820152602a60248201525f805160206161a78339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461073c5760405162461bcd60e51b815260206004820152603360248201525f805160206161a78339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106ce565b6003835280515f90600290600581111561075857610758615796565b036107af5786156107705761076d8387612577565b90505b5f84606001518360800151610785919061586d565b90506107918482612813565b506001600160401b0390811660e0870152421660a0860152506107e3565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561081686606001516117e1565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b815260040161084a979695949392919061588d565b602060405180830381865afa158015610865573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088991906158cb565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360038111156108c8576108c8615796565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109dc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206162278339815191526020526040808220815160e0810190925280545f805160206161c783398151915293929190829060ff166005811115610a3b57610a3b615796565b6005811115610a4c57610a4c615796565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abb57610abb615796565b14610b205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb610b458584606001515f61296a565b6040518263ffffffff1660e01b8152600401610b619190615904565b6020604051808303815f875af1158015610b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba191906158cb565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c38836129b9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9464e8d4a5100083615936565b92915050565b5f610ca36129ca565b610caf84848434612a01565b9050610cc760015f8051602061620783398151915255565b9392505050565b5f805160206161878339815191525f80610ce784612cf5565b91509150610cf482613013565b610cfe5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d2c57610d2c615796565b03610d51575f83815260088501602052604081208054919055610d4f828261304e565b505b610d6781610d6284604001516117e1565b6130b4565b5050505050565b5f8181525f805160206161e783398151915260205260408082208151610100810190925280545f8051602061618783398151915293929190829060ff166003811115610dbc57610dbc615796565b6003811115610dcd57610dcd615796565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e52906124af565b9050600182516003811115610e6957610e69615796565b14610ed25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106ce565b600381516005811115610ee757610ee7615796565b0361105f57600380835260c0820180516001600160401b0390811660808601529051811660a085015260608301511660e08401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610f4b57610f4b615796565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b60048151600581111561107457611074615796565b0361108257610d67846130c7565b5f61108c866132c4565b90505f8061109d836040015161348a565b5091509150818560400151146110c55760405162461bcd60e51b81526004016106ce90615955565b806001600160401b031684606001516001600160401b031610156111365760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106ce565b806001600160401b03168560c001516001600160401b0316111561116c5760405162461bcd60e51b81526004016106ce9061599f565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206161c78339815191529060ff161561129b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112de573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061130291906158cb565b8360200135146113645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106ce565b3061137560608501604086016159fc565b6001600160a01b0316146113e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106ce565b5f6113f56060850185615a17565b905090505f805b828163ffffffff1610156116e5575f6114186060880188615a17565b8363ffffffff1681811061142e5761142e615a5c565b90506020028101906114409190615a70565b61144990615b20565b80515f81815260088801602052604090205491925090156114c15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106ce565b5f6002895f0135856040516020016114f092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150a91615bb7565b602060405180830381855afa158015611525573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061154891906158cb565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d4576115d4615796565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611687911686615bc8565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116de90615bdb565b90506113fc565b50600483018190555f6116f7856132c4565b90505f61170782604001516136c5565b90505f61171388613837565b9050816002826040516117269190615bb7565b602060405180830381855afa158015611741573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061176491906158cb565b146117c85760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106ce565b5050506009909201805460ff1916600117905550505050565b5f610c946001600160401b03831664e8d4a51000615bfd565b5f611804826124af565b6080015192915050565b5f805160206161878339815191525f61182685613cd0565b905061183185613013565b61183c575050505050565b5f8581526005830160205260409020546001600160a01b031633146118735760405162461bcd60e51b81526004016106ce90615c14565b5f85815260058301602052604090205460a08201516118a291600160b01b90046001600160401b031690615c66565b6001600160401b03168160c001516001600160401b031610156119235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106ce565b8315610d67575f6119348685612577565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198b906117e1565b60a085015160c08601516040516001600160e01b031960e086901b1681526119bf939291829188905f90819060040161588d565b602060405180830381865afa1580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe91906158cb565b5f87815260088501602052604081208054909190611a1d908490615bc8565b9091555050505050505050565b5f805160206161878339815191525f611a42836124af565b9050600481516005811115611a5957611a59615796565b14611ac35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106ce565b5f8381526005830160205260409020546001600160a01b03163314611afa5760405162461bcd60e51b81526004016106ce90615c14565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba1906001600160a01b03168261304e565b611b386129ca565b5f8181525f805160206161e783398151915260205260408082208151610100810190925280545f8051602061618783398151915293929190829060ff166003811115611b8657611b86615796565b6003811115611b9757611b97615796565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c13856132c4565b90505f80611c24836040015161348a565b509150915081846040015114611c4c5760405162461bcd60e51b81526004016106ce90615955565b806001600160401b03168460e001516001600160401b03161115611c825760405162461bcd60e51b81526004016106ce9061599f565b600384516003811115611c9757611c97615796565b14611ceb5760405162461bcd60e51b815260206004820152603160248201525f805160206161a78339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106ce565b611cf4866130c7565b5050505050611d0f60015f8051602061620783398151915255565b5050565b611d1b6129ca565b5f8181525f805160206161e783398151915260205260408082208151610100810190925280545f8051602061618783398151915293929190829060ff166003811115611d6957611d69615796565b6003811115611d7a57611d7a615796565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611dfe826124af565b9050600481516005811115611e1557611e15615796565b14611e785760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106ce565b600183516003811115611e8d57611e8d615796565b03611ea457611e9b856130c7565b50505050611fa1565b600283516003811115611eb957611eb9615796565b03611f93578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611ef185606001516117e1565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611f4396959493926001600160401b039092169190819060040161588d565b602060405180830381865afa158015611f5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8291906158cb565b5f8681526007860160205260409020555b611f9c856130c7565b505050505b611fb760015f8051602061620783398151915255565b50565b5f805160206161c78339815191525f611fd2836132c4565b90505f80611fe38360400151613f4b565b91509150806120455760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106ce565b60015f83815260078601602052604090205460ff16600581111561206b5761206b615796565b146120885760405162461bcd60e51b81526004016106ce90615c86565b5f82815260068501602052604081206120a09161555f565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206161e783398151915260205260408082208151610100810190925280545f8051602061618783398151915293929190829060ff16600381111561217e5761217e615796565b600381111561218f5761218f615796565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600381111561221657612216615796565b1480612234575060038151600381111561223257612232615796565b145b6122885760405162461bcd60e51b815260206004820152603260248201525f805160206161a7833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106ce565b5f61229682604001516124af565b905080606001516001600160401b03165f0361231a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb61234784604001518460600151856080015161296a565b6040518263ffffffff1660e01b81526004016123639190615904565b6020604051808303815f875af115801561237f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6791906158cb565b5f8181525f8051602061622783398151915260205260409020545f805160206161c78339815191529060019060ff1660058111156123e3576123e3615796565b146124005760405162461bcd60e51b81526004016106ce90615c86565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916124399190600401615d03565b6020604051808303815f875af1158015612455573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247991906158cb565b505050565b5f6124876129ca565b6124928233346140ec565b90506124aa60015f8051602061620783398151915255565b919050565b6124b7615596565b5f8281525f80516020616227833981519152602052604090819020815160e0810190925280545f805160206161c7833981519152929190829060ff16600581111561250457612504615796565b600581111561251557612515615796565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156125c2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125e99190810190615d98565b915091508061264c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561268f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126b391906158cb565b8251146127175760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106ce565b60208201516001600160a01b03161561278d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106ce565b5f8061279c84604001516144a3565b915091508187146128095760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106ce565b9695505050505050565b5f8281525f80516020616227833981519152602052604081206002015481905f805160206161c783398151915290600160801b90046001600160401b031661285b858261467b565b5f61286587614889565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6128b58a858b61296a565b6040518263ffffffff1660e01b81526004016128d19190615904565b6020604051808303815f875af11580156128ed573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061291191906158cb565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6129c1614919565b611fb781614964565b5f805160206162078339815191528054600119016129fb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206161878339815191529061ffff86161015612a885760405162461bcd60e51b815260206004820152602b60248201525f805160206161a783398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106ce565b61271061ffff86161115612ae05760405162461bcd60e51b815260206004820152602c60248201525f805160206161a783398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106ce565b60028101546001600160401b039081169085161015612b595760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106ce565b8054831015612bbc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106ce565b8060010154831115612c235760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106ce565b825f612c2e82610c84565b90505f612c3b89836149d6565b90506040518060600160405280612c4f3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061620783398151915255565b5f612cfe615596565b5f805160206161c78339815191525f612d16856132c4565b90505f80612d278360400151613f4b565b915091508015612d8c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106ce565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612dbd57612dbd615796565b6005811115612dce57612dce615796565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612e3d57612e3d615796565b1480612e5b5750600181516005811115612e5957612e59615796565b145b612eba5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106ce565b600381516005811115612ecf57612ecf615796565b03612edd5760048152612ee2565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f2757612f27615796565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612fdb57612fdb615796565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561309a575f80fd5b505af11580156130ac573d5f803e3d5ffd5b505050505050565b611d0f6001600160a01b03831682614f8c565b5f8181525f805160206161e783398151915260205260408082208151610100810190925280545f8051602061618783398151915293929190829060ff16600381111561311557613115615796565b600381111561312657613126615796565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061321a90600160a01b900461ffff1684615bfd565b6132249190615936565b905080856008015f8581526020019081526020015f205f8282546132489190615bc8565b909155505f90506132598284615e6a565b905061326985602001518261304e565b61327e8560200151610d6287606001516117e1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015613328573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261334f9190810190615d98565b91509150806133af5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106ce565b8151156134105760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106ce565b60208201516001600160a01b0316156134835760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106ce565b5092915050565b5f805f83516036146134ae5760405162461bcd60e51b81526004016106ce90615e7d565b5f805b60028110156134fd576134c5816001615e6a565b6134d0906008615bfd565b61ffff168682815181106134e6576134e6615a5c565b016020015160f81c901b91909117906001016134b1565b5061ffff8116156135205760405162461bcd60e51b81526004016106ce90615ec6565b5f805b600481101561357b57613537816003615e6a565b613542906008615bfd565b63ffffffff1687613554836002615bc8565b8151811061356457613564615a5c565b016020015160f81c901b9190911790600101613523565b5063ffffffff81166004146135a25760405162461bcd60e51b81526004016106ce90615f09565b5f805b60208110156135f7576135b981601f615e6a565b6135c4906008615bfd565b886135d0836006615bc8565b815181106135e0576135e0615a5c565b016020015160f81c901b91909117906001016135a5565b505f805b60088110156136565761360f816007615e6a565b61361a906008615bfd565b6001600160401b03168961362f836026615bc8565b8151811061363f5761363f615a5c565b016020015160f81c901b91909117906001016135fb565b505f805b60088110156136b55761366e816007615e6a565b613679906008615bfd565b6001600160401b03168a61368e83602e615bc8565b8151811061369e5761369e615a5c565b016020015160f81c901b919091179060010161365a565b5091989097509095509350505050565b5f81516026146136e75760405162461bcd60e51b81526004016106ce90615e7d565b5f805b6002811015613736576136fe816001615e6a565b613709906008615bfd565b61ffff1684828151811061371f5761371f615a5c565b016020015160f81c901b91909117906001016136ea565b5061ffff8116156137595760405162461bcd60e51b81526004016106ce90615ec6565b5f805b60048110156137b457613770816003615e6a565b61377b906008615bfd565b63ffffffff168561378d836002615bc8565b8151811061379d5761379d615a5c565b016020015160f81c901b919091179060010161375c565b5063ffffffff8116156137d95760405162461bcd60e51b81526004016106ce90615f09565b5f805b602081101561382e576137f081601f615e6a565b6137fb906008615bfd565b86613807836006615bc8565b8151811061381757613817615a5c565b016020015160f81c901b91909117906001016137dc565b50949350505050565b60605f61384683830184615a17565b61385291506058615bfd565b61385d90605c615bc8565b6001600160401b0381111561387457613874615a8e565b6040519080825280601f01601f19166020018201604052801561389e576020820181803683370190505b5090505f5b60208110156138f357833581602081106138bf576138bf615a5c565b1a60f81b8282815181106138d5576138d5615a5c565b60200101906001600160f81b03191690815f1a9053506001016138a3565b505f5b6020811015613953578360200135816020811061391557613915615a5c565b1a60f81b82613925836020615bc8565b8151811061393557613935615a5c565b60200101906001600160f81b03191690815f1a9053506001016138f6565b505f5b60048110156139b65761396a816003615e6a565b613975906008615bfd565b6014901c60f81b82613988836040615bc8565b8151811061399857613998615a5c565b60200101906001600160f81b03191690815f1a905350600101613956565b505f6139c860608501604086016159fc565b60601b90505f5b6014811015613a28578181601481106139ea576139ea615a5c565b1a60f81b836139fa836044615bc8565b81518110613a0a57613a0a615a5c565b60200101906001600160f81b03191690815f1a9053506001016139cf565b505f613a376060860186615a17565b905090505f5b6004811015613aa257613a51816003615e6a565b613a5c906008615bfd565b63ffffffff8316901c60f81b84613a74836058615bc8565b81518110613a8457613a84615a5c565b60200101906001600160f81b03191690815f1a905350600101613a3d565b505f5b613ab26060870187615a17565b9050811015613cc6575f613ac7826058615bfd565b613ad290605c615bc8565b90505f5b6020811015613b5d57613aec6060890189615a17565b84818110613afc57613afc615a5c565b9050602002810190613b0e9190615a70565b358160208110613b2057613b20615a5c565b1a60f81b86613b2f8385615bc8565b81518110613b3f57613b3f615a5c565b60200101906001600160f81b03191690815f1a905350600101613ad6565b505f5b6008811015613c1257613b74816007615e6a565b613b7f906008615bfd565b613b8c60608a018a615a17565b85818110613b9c57613b9c615a5c565b9050602002810190613bae9190615a70565b613bbf90604081019060200161577d565b6001600160401b0316901c60f81b8682613bda856020615bc8565b613be49190615bc8565b81518110613bf457613bf4615a5c565b60200101906001600160f81b03191690815f1a905350600101613b60565b505f5b6030811015613cbc57613c2b6060890189615a17565b84818110613c3b57613c3b615a5c565b9050602002810190613c4d9190615a70565b613c5b906040810190615f50565b82818110613c6b57613c6b615a5c565b9050013560f81c60f81b8682846028613c849190615bc8565b613c8e9190615bc8565b81518110613c9e57613c9e615a5c565b60200101906001600160f81b03191690815f1a905350600101613c15565b5050600101613aa5565b5091949350505050565b613cd8615596565b5f8281525f805160206162278339815191526020526040808220815160e0810190925280545f805160206161c783398151915293929190829060ff166005811115613d2557613d25615796565b6005811115613d3657613d36615796565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613da857613da8615796565b14613e045760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106ce565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e4857613e48615796565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613ef48582612813565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613f6e5760405162461bcd60e51b81526004016106ce90615e7d565b5f805b6002811015613fbd57613f85816001615e6a565b613f90906008615bfd565b61ffff16858281518110613fa657613fa6615a5c565b016020015160f81c901b9190911790600101613f71565b5061ffff811615613fe05760405162461bcd60e51b81526004016106ce90615ec6565b5f805b600481101561403b57613ff7816003615e6a565b614002906008615bfd565b63ffffffff1686614014836002615bc8565b8151811061402457614024615a5c565b016020015160f81c901b9190911790600101613fe3565b5063ffffffff81166003146140625760405162461bcd60e51b81526004016106ce90615f09565b5f805b60208110156140b75761407981601f615e6a565b614084906008615bfd565b87614090836006615bc8565b815181106140a0576140a0615a5c565b016020015160f81c901b9190911790600101614065565b505f866026815181106140cc576140cc615a5c565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206161878339815191528161410584610c84565b90505f614111876124af565b905061411c87613013565b6141795760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106ce565b60028151600581111561418e5761418e615796565b146141ed5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106ce565b5f8282608001516141fe9190615c66565b60048501546040840151919250614220916001600160401b0390911690615f92565b6001600160401b0316816001600160401b0316111561429f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106ce565b5f806142ab8a84612813565b915091505f8a836040516020016142d992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600381111561437457614374615796565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146144c65760405162461bcd60e51b81526004016106ce90615e7d565b5f805b6002811015614515576144dd816001615e6a565b6144e8906008615bfd565b61ffff168582815181106144fe576144fe615a5c565b016020015160f81c901b91909117906001016144c9565b5061ffff8116156145385760405162461bcd60e51b81526004016106ce90615ec6565b5f805b60048110156145935761454f816003615e6a565b61455a906008615bfd565b63ffffffff168661456c836002615bc8565b8151811061457c5761457c615a5c565b016020015160f81c901b919091179060010161453b565b5063ffffffff81166005146145ba5760405162461bcd60e51b81526004016106ce90615f09565b5f805b602081101561460f576145d181601f615e6a565b6145dc906008615bfd565b876145e8836006615bc8565b815181106145f8576145f8615a5c565b016020015160f81c901b91909117906001016145bd565b505f805b600881101561466e57614627816007615e6a565b614632906008615bfd565b6001600160401b031688614647836026615bc8565b8151811061465757614657615a5c565b016020015160f81c901b9190911790600101614613565b5090969095509350505050565b5f805160206161c78339815191525f6001600160401b0380841690851611156146af576146a8838561586d565b90506146bc565b6146b9848461586d565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061471e57506001840154815161471a916001600160401b031690615bc8565b8210155b15614744576001600160401b038316606082015281815260408101516020820152614763565b82816060018181516147569190615c66565b6001600160401b03169052505b6060810151614773906064615f92565b602082015160018601546001600160401b03929092169161479e9190600160401b900460ff16615bfd565b10156148025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106ce565b856001600160401b03168160400181815161481d9190615bc8565b9052506040810180516001600160401b038716919061483d908390615e6a565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162278339815191526020526040812060020180545f805160206161c783398151915291600160401b9091046001600160401b03169060086148d383615fbd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661496257604051631afcd79f60e31b815260040160405180910390fd5b565b61496c614919565b6149758161501f565b61497d615038565b611fb76060820135608083013561499a60c0850160a0860161577d565b6149aa60e0860160c08701615fd8565b61ffff166149bf610100870160e08801615ff1565b6149d1610120880161010089016159fc565b615048565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16614a615760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106ce565b5f805160206161c783398151915242614a80604086016020870161577d565b6001600160401b031611614af25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106ce565b614b02604085016020860161577d565b6001600160401b0316614b186202a30042615bc8565b11614b8b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106ce565b8335614be35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106ce565b83355f90815260088201602052604090205415614c535760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106ce565b6030614c626040860186615f50565b905014614cc75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106ce565b614cd1835f61467b565b5f80614d6a6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614d15919061577d565b6001600160401b03168152602001614d3060408a018a615f50565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506152d0565b5f82815260068601602052604090209193509150614d888282616055565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614dc6908590600401615904565b6020604051808303815f875af1158015614de2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e0691906158cb565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614e7e57614e7e615796565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614f5e918e01908e0161577d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015614faf5760405163cd78605960e01b81523060048201526024016106ce565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614ff8576040519150601f19603f3d011682016040523d82523d5f602084013e614ffd565b606091505b505090508061247957604051630a12f52160e11b815260040160405180910390fd5b615027614919565b61502f6153d4565b611fb7816153dc565b615040614919565b614962615557565b615050614919565b5f80516020616187833981519152836150bc5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106ce565b6127108411156151225760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106ce565b8587111561518a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106ce565b5f8360ff16116151f75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106ce565b600a60ff841611156152695760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106ce565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461533a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106ce565b5f806001855f0151866020015187604001518860800151896060015160405160200161536c9796959493929190616110565b604051602081830303815290604052905060028160405161538d9190615bb7565b602060405180830381855afa1580156153a8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906153cb91906158cb565b94909350915050565b614962614919565b6153e4614919565b80355f805160206161c783398151915290815560146154096060840160408501615ff1565b60ff1611156154765760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106ce565b5f6154876060840160408501615ff1565b60ff16116154ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106ce565b6154ff6060830160408401615ff1565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055615530604083016020840161577d565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ce2614919565b50805461556b90615cd1565b5f825580601f1061557a575050565b601f0160209004905f5260205f2090810190611fb791906155d2565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156155e6575f81556001016155d3565b5090565b8015158114611fb7575f80fd5b803563ffffffff811681146124aa575f80fd5b5f805f6060848603121561561c575f80fd5b83359250602084013561562e816155ea565b915061563c604085016155f7565b90509250925092565b5f60208284031215615655575f80fd5b5035919050565b5f610120828403121561566d575f80fd5b50919050565b803561ffff811681146124aa575f80fd5b80356001600160401b03811681146124aa575f80fd5b5f805f606084860312156156ac575f80fd5b83356001600160401b038111156156c1575f80fd5b8401606081870312156156d2575f80fd5b92506156e060208501615673565b915061563c60408501615684565b5f602082840312156156fe575f80fd5b610cc7826155f7565b5f8060408385031215615718575f80fd5b615721836155f7565b946020939093013593505050565b5f8060408385031215615740575f80fd5b82356001600160401b03811115615755575f80fd5b830160808186031215615766575f80fd5b9150615774602084016155f7565b90509250929050565b5f6020828403121561578d575f80fd5b610cc782615684565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106157cd57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161580860608401826001600160401b03169052565b50608083015161582360808401826001600160401b03169052565b5060a083015161583e60a08401826001600160401b03169052565b5060c083015161348360c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561348357613483615859565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f602082840312156158db575f80fd5b5051919050565b5f5b838110156158fc5781810151838201526020016158e4565b50505f910152565b602081525f82518060208401526159228160408501602087016158e2565b601f01601f19169190910160400192915050565b5f8261595057634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114611fb7575f80fd5b5f60208284031215615a0c575f80fd5b8135610cc7816159e8565b5f808335601e19843603018112615a2c575f80fd5b8301803591506001600160401b03821115615a45575f80fd5b6020019150600581901b3603821315612963575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615a84575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615ac457615ac4615a8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615af257615af2615a8e565b604052919050565b5f6001600160401b03821115615b1257615b12615a8e565b50601f01601f191660200190565b5f60608236031215615b30575f80fd5b615b38615aa2565b823581526020615b49818501615684565b8183015260408401356001600160401b03811115615b65575f80fd5b840136601f820112615b75575f80fd5b8035615b88615b8382615afa565b615aca565b8181523684838501011115615b9b575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615a848184602087016158e2565b80820180821115610c9457610c94615859565b5f63ffffffff808316818103615bf357615bf3615859565b6001019392505050565b8082028115828204841417610c9457610c94615859565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561348357613483615859565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615ce557607f821691505b60208210810361566d57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615d1581615cd1565b806020870152604060018084165f8114615d365760018114615d5257615d7f565b60ff19851660408a0152604084151560051b8a01019550615d7f565b895f5260205f205f5b85811015615d765781548b8201860152908301908801615d5b565b8a016040019650505b509398975050505050505050565b80516124aa816155ea565b5f8060408385031215615da9575f80fd5b82516001600160401b0380821115615dbf575f80fd5b9084019060608287031215615dd2575f80fd5b615dda615aa2565b82518152602080840151615ded816159e8565b82820152604084015183811115615e02575f80fd5b80850194505087601f850112615e16575f80fd5b83519250615e26615b8384615afa565b8381528882858701011115615e39575f80fd5b615e48848383018488016158e2565b80604084015250819550615e5d818801615d8d565b9450505050509250929050565b81810381811115610c9457610c94615859565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615f65575f80fd5b8301803591506001600160401b03821115615f7e575f80fd5b602001915036819003821315612963575f80fd5b6001600160401b03818116838216028082169190828114615fb557615fb5615859565b505092915050565b5f6001600160401b03808316818103615bf357615bf3615859565b5f60208284031215615fe8575f80fd5b610cc782615673565b5f60208284031215616001575f80fd5b813560ff81168114610cc7575f80fd5b601f82111561247957805f5260205f20601f840160051c810160208510156160365750805b601f840160051c820191505b81811015610d67575f8155600101616042565b81516001600160401b0381111561606e5761606e615a8e565b6160828161607c8454615cd1565b84616011565b602080601f8311600181146160b5575f841561609e5750858301515b5f19600386901b1c1916600185901b1785556130ac565b5f85815260208120601f198616915b828110156160e3578886015182559484019460019091019084016160c4565b508582101561610057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161616581604e8601602089016158e2565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 dc1f233ef..3a2fed04a 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -435,11 +435,11 @@ abstract contract PoSValidatorManager is "PoSValidatorManager: validation not completed" ); - require( - delegator.status == DelegatorStatus.Active - || delegator.status == DelegatorStatus.PendingRemoved, - "PoSValidatorManager: invalid delegation" - ); + // If the validator completes before the delegator is added, let them exit from here. + if (delegator.status == DelegatorStatus.PendingAdded) { + _completeEndDelegation(delegationID); + return; + } // Calculate and set rewards if the delegator is active. if (delegator.status == DelegatorStatus.Active) { diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index 2b8184cbe..e711b84bc 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -12,8 +12,7 @@ enum DelegatorStatus { Unknown, PendingAdded, Active, - PendingRemoved, - Completed + PendingRemoved } // TODO: visit types of these fields, for example uint64 might be too big for stake duration seconds. @@ -132,7 +131,7 @@ interface IPoSValidatorManager is IValidatorManager { /** * @notice Removes a delegator from a completed validation period. The delegator can be in either the active or pending removed * state. No uptime proof is required in this case, because it will have been provided by the validator upon their exit. - * Note that this function can only be called by any address to clean up the delegation. + * Note that this function can be called by any address to clean up the delegation. * @param delegationID The ID of the delegation being removed. */ function endDelegationCompletedValidator(bytes32 delegationID) external; From d0b3724adb06b47ff62b69f863719139f0f54410 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 20 Sep 2024 16:31:19 -0400 Subject: [PATCH 393/545] fix comment --- .../validator-manager/interfaces/IPoSValidatorManager.sol | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index e711b84bc..5da2b2278 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -129,8 +129,9 @@ interface IPoSValidatorManager is IValidatorManager { function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external; /** - * @notice Removes a delegator from a completed validation period. The delegator can be in either the active or pending removed - * state. No uptime proof is required in this case, because it will have been provided by the validator upon their exit. + * @notice Removes a delegator from a completed validation period. The delegator can be in either the pending added, active + * or pending removed state. No uptime proof is required in this case, because it will have been provided by the validator + * upon their exit. * Note that this function can be called by any address to clean up the delegation. * @param delegationID The ID of the delegation being removed. */ From 5d1be584ce547854739c2e7e56a5bc03424fdfef Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 20 Sep 2024 16:45:42 -0400 Subject: [PATCH 394/545] Add check --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 5 +++++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index f3ae3bfc6..28cd3a753 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516166d63803806166d683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6165898061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd3660046158a3565b61043a565b005b6101d26101e23660046158de565b61089d565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b6102196102143660046158de565b610a56565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b3660046158f5565b610a6c565b6101d261026e36600461590e565b610b0c565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004615936565b610f9c565b6102b66102b136600461599a565b61157f565b6040519081526020016101fd565b6102196102d23660046158de565b611598565b6102b65f81565b6101d26102ec3660046158a3565b6115ac565b6101ef603081565b6101d26103073660046158de565b6117c8565b6101d261031a36600461590e565b6118ce565b6101d261032d3660046158de565b611ab1565b6102b66103403660046159b3565b611d58565b6101d26103533660046158f5565b611d84565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c3660046158de565b611efa565b6101d261039f3660046158de565b61216d565b6101ef601481565b6103bf6103ba3660046158de565b612248565b6040516101fd91906159e7565b6102196202a30081565b6102b66103e43660046158de565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615aa7565b612310565b6101d2610435366004615b20565b612345565b5f8381525f8051602061651d83398151915260205260408082208151610100810190925280545f805160206164bd83398151915293929190829060ff166003811115610488576104886159d3565b6003811115610499576104996159d3565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61051d82612248565b9050600283516003811115610534576105346159d3565b146105865760405162461bcd60e51b815260206004820152602a60248201525f805160206164dd8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105eb5760405162461bcd60e51b815260206004820152603360248201525f805160206164dd8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161057d565b6003835280515f906002906005811115610607576106076159d3565b0361065e57861561061f5761061c8387612424565b90505b5f846060015183608001516106349190615b72565b905061064084826126c0565b506001600160401b0390811660e0870152421660a086015250610692565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106c5866060015161157f565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b81526004016106f99796959493929190615b92565b602060405180830381865afa158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190615bd0565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff19166001836003811115610777576107776159d3565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088b916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061655d8339815191526020526040808220815160e0810190925280545f805160206164fd83398151915293929190829060ff1660058111156108ea576108ea6159d3565b60058111156108fb576108fb6159d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096a5761096a6159d3565b146109cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb6109f48584606001515f612817565b6040518263ffffffff1660e01b8152600401610a109190615c09565b6020604051808303815f875af1158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190615bd0565b50505050565b5f610a6664e8d4a5100083615c3b565b92915050565b5f805160206164bd8339815191525f80610a858461286e565b91509150610a9282612b8c565b610a9c5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610aca57610aca6159d3565b03610aef575f83815260088501602052604081208054919055610aed8282612bc7565b505b610b0581610b00846040015161157f565b612c3d565b5050505050565b5f8181525f8051602061651d83398151915260205260408082208151610100810190925280545f805160206164bd83398151915293929190829060ff166003811115610b5a57610b5a6159d3565b6003811115610b6b57610b6b6159d3565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf090612248565b9050600182516003811115610c0757610c076159d3565b14610c705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161057d565b600381516005811115610c8557610c856159d3565b03610dfd57600380835260c0820180516001600160401b0390811660808601529051811660a085015260608301511660e08401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610ce957610ce96159d3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1257610e126159d3565b03610e2057610b0584612c60565b5f610e2a86612e5d565b90505f80610e3b8360400151613023565b509150915081856040015114610e635760405162461bcd60e51b815260040161057d90615c5a565b806001600160401b031684606001516001600160401b03161015610ed45760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161057d565b806001600160401b03168560c001516001600160401b03161115610f0a5760405162461bcd60e51b815260040161057d90615ca4565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206164fd8339815191529060ff16156110395760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a09190615bd0565b8360200135146111025760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161057d565b306111136060850160408601615ced565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161057d565b5f6111936060850185615d08565b905090505f805b828163ffffffff161015611483575f6111b66060880188615d08565b8363ffffffff168181106111cc576111cc615d4d565b90506020028101906111de9190615d61565b6111e790615e11565b80515f818152600888016020526040902054919250901561125f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161057d565b5f6002895f01358560405160200161128e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a891615ea8565b602060405180830381855afa1580156112c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e69190615bd0565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115611372576113726159d3565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611425911686615eb9565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147c90615ecc565b905061119a565b50600483018190555f61149585612e5d565b90505f6114a5826040015161325e565b90505f6114b1886133d0565b9050816002826040516114c49190615ea8565b602060405180830381855afa1580156114df573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115029190615bd0565b146115665760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161057d565b5050506009909201805460ff1916600117905550505050565b5f610a666001600160401b03831664e8d4a51000615eee565b5f6115a282612248565b6080015192915050565b5f805160206164bd8339815191525f6115c485613869565b90506115cf85612b8c565b6115da575050505050565b5f8581526005830160205260409020546001600160a01b031633146116115760405162461bcd60e51b815260040161057d90615f05565b5f85815260058301602052604090205460a082015161164091600160b01b90046001600160401b031690615f57565b6001600160401b03168160c001516001600160401b031610156116c15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161057d565b8315610b05575f6116d28685612424565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117299061157f565b60a085015160c08601516040516001600160e01b031960e086901b16815261175d939291829188905f908190600401615b92565b602060405180830381865afa158015611778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c9190615bd0565b5f878152600885016020526040812080549091906117bb908490615eb9565b9091555050505050505050565b5f805160206164bd8339815191525f6117e083612248565b90506004815160058111156117f7576117f76159d3565b146118615760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161057d565b5f8381526005830160205260409020546001600160a01b031633146118985760405162461bcd60e51b815260040161057d90615f05565b5f83815260088301602090815260408083208054908490556005860190925290912054610a50906001600160a01b031682612bc7565b6118d6613ae4565b5f8181525f8051602061651d83398151915260205260408082208151610100810190925280545f805160206164bd83398151915293929190829060ff166003811115611924576119246159d3565b6003811115611935576119356159d3565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119b185612e5d565b90505f806119c28360400151613023565b5091509150818460400151146119ea5760405162461bcd60e51b815260040161057d90615c5a565b806001600160401b03168460e001516001600160401b03161115611a205760405162461bcd60e51b815260040161057d90615ca4565b600384516003811115611a3557611a356159d3565b14611a895760405162461bcd60e51b815260206004820152603160248201525f805160206164dd8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161057d565b611a9286612c60565b5050505050611aad60015f8051602061653d83398151915255565b5050565b611ab9613ae4565b5f8181525f8051602061651d83398151915260205260408082208151610100810190925280545f805160206164bd83398151915293929190829060ff166003811115611b0757611b076159d3565b6003811115611b1857611b186159d3565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611b9c82612248565b9050600481516005811115611bb357611bb36159d3565b14611c165760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161057d565b600183516003811115611c2b57611c2b6159d3565b03611c4257611c3985612c60565b50505050611d3f565b600283516003811115611c5757611c576159d3565b03611d31578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611c8f856060015161157f565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611ce196959493926001600160401b0390921691908190600401615b92565b602060405180830381865afa158015611cfc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d209190615bd0565b5f8681526007860160205260409020555b611d3a85612c60565b505050505b611d5560015f8051602061653d83398151915255565b50565b5f611d61613ae4565b611d6c833384613b2e565b9050610a6660015f8051602061653d83398151915255565b5f805160206164fd8339815191525f611d9c83612e5d565b90505f80611dad8360400151613ee8565b9150915080611e0f5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057d565b60015f83815260078601602052604090205460ff166005811115611e3557611e356159d3565b14611e525760405162461bcd60e51b815260040161057d90615f77565b5f8281526006850160205260408120611e6a916157f3565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061651d83398151915260205260408082208151610100810190925280545f805160206164bd83398151915293929190829060ff166003811115611f4857611f486159d3565b6003811115611f5957611f596159d3565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516003811115611fe057611fe06159d3565b1480611ffe5750600381516003811115611ffc57611ffc6159d3565b145b6120525760405162461bcd60e51b815260206004820152603260248201525f805160206164dd833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161057d565b5f6120608260400151612248565b905080606001516001600160401b03165f036120e45760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb612111846040015184606001518560800151612817565b6040518263ffffffff1660e01b815260040161212d9190615c09565b6020604051808303815f875af1158015612149573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190615bd0565b5f8181525f8051602061655d83398151915260205260409020545f805160206164fd8339815191529060019060ff1660058111156121ad576121ad6159d3565b146121ca5760405162461bcd60e51b815260040161057d90615f77565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916122039190600401615ffa565b6020604051808303815f875af115801561221f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122439190615bd0565b505050565b61225061582a565b5f8281525f8051602061655d833981519152602052604090819020815160e0810190925280545f805160206164fd833981519152929190829060ff16600581111561229d5761229d6159d3565b60058111156122ae576122ae6159d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f612319613ae4565b61232585858585614089565b905061233d60015f8051602061653d83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061238e575080546001600160401b03808416911610155b156123ac5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556123d78484614375565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561246f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612496919081019061608f565b91509150806124f95760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561253c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125609190615bd0565b8251146125c45760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057d565b60208201516001600160a01b03161561263a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057d565b5f80612649846040015161438f565b915091508187146126b65760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057d565b9695505050505050565b5f8281525f8051602061655d833981519152602052604081206002015481905f805160206164fd83398151915290600160801b90046001600160401b03166127088582614567565b5f61271287614775565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6127628a858b612817565b6040518263ffffffff1660e01b815260040161277e9190615c09565b6020604051808303815f875af115801561279a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127be9190615bd0565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f61287761582a565b5f805160206164fd8339815191525f61288f85612e5d565b90505f806128a08360400151613ee8565b9150915080156129055760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057d565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612936576129366159d3565b6005811115612947576129476159d3565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156129b6576129b66159d3565b14806129d457506001815160058111156129d2576129d26159d3565b145b612a335760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161057d565b600381516005811115612a4857612a486159d3565b03612a565760048152612a5b565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612aa057612aa06159d3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b5457612b546159d3565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f8051602061649d83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c22575f80fd5b505af1158015612c34573d5f803e3d5ffd5b50505050505050565b5f8051602061649d83398151915254611aad906001600160a01b03168383614805565b5f8181525f8051602061651d83398151915260205260408082208151610100810190925280545f805160206164bd83398151915293929190829060ff166003811115612cae57612cae6159d3565b6003811115612cbf57612cbf6159d3565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612db390600160a01b900461ffff1684615eee565b612dbd9190615c3b565b905080856008015f8581526020019081526020015f205f828254612de19190615eb9565b909155505f9050612df28284616161565b9050612e02856020015182612bc7565b612e178560200151610b00876060015161157f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612ec1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ee8919081019061608f565b9150915080612f485760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057d565b815115612fa95760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057d565b60208201516001600160a01b03161561301c5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057d565b5092915050565b5f805f83516036146130475760405162461bcd60e51b815260040161057d90616174565b5f805b60028110156130965761305e816001616161565b613069906008615eee565b61ffff1686828151811061307f5761307f615d4d565b016020015160f81c901b919091179060010161304a565b5061ffff8116156130b95760405162461bcd60e51b815260040161057d906161bd565b5f805b6004811015613114576130d0816003616161565b6130db906008615eee565b63ffffffff16876130ed836002615eb9565b815181106130fd576130fd615d4d565b016020015160f81c901b91909117906001016130bc565b5063ffffffff811660041461313b5760405162461bcd60e51b815260040161057d90616200565b5f805b60208110156131905761315281601f616161565b61315d906008615eee565b88613169836006615eb9565b8151811061317957613179615d4d565b016020015160f81c901b919091179060010161313e565b505f805b60088110156131ef576131a8816007616161565b6131b3906008615eee565b6001600160401b0316896131c8836026615eb9565b815181106131d8576131d8615d4d565b016020015160f81c901b9190911790600101613194565b505f805b600881101561324e57613207816007616161565b613212906008615eee565b6001600160401b03168a61322783602e615eb9565b8151811061323757613237615d4d565b016020015160f81c901b91909117906001016131f3565b5091989097509095509350505050565b5f81516026146132805760405162461bcd60e51b815260040161057d90616174565b5f805b60028110156132cf57613297816001616161565b6132a2906008615eee565b61ffff168482815181106132b8576132b8615d4d565b016020015160f81c901b9190911790600101613283565b5061ffff8116156132f25760405162461bcd60e51b815260040161057d906161bd565b5f805b600481101561334d57613309816003616161565b613314906008615eee565b63ffffffff1685613326836002615eb9565b8151811061333657613336615d4d565b016020015160f81c901b91909117906001016132f5565b5063ffffffff8116156133725760405162461bcd60e51b815260040161057d90616200565b5f805b60208110156133c75761338981601f616161565b613394906008615eee565b866133a0836006615eb9565b815181106133b0576133b0615d4d565b016020015160f81c901b9190911790600101613375565b50949350505050565b60605f6133df83830184615d08565b6133eb91506058615eee565b6133f690605c615eb9565b6001600160401b0381111561340d5761340d615d7f565b6040519080825280601f01601f191660200182016040528015613437576020820181803683370190505b5090505f5b602081101561348c578335816020811061345857613458615d4d565b1a60f81b82828151811061346e5761346e615d4d565b60200101906001600160f81b03191690815f1a90535060010161343c565b505f5b60208110156134ec57836020013581602081106134ae576134ae615d4d565b1a60f81b826134be836020615eb9565b815181106134ce576134ce615d4d565b60200101906001600160f81b03191690815f1a90535060010161348f565b505f5b600481101561354f57613503816003616161565b61350e906008615eee565b6014901c60f81b82613521836040615eb9565b8151811061353157613531615d4d565b60200101906001600160f81b03191690815f1a9053506001016134ef565b505f6135616060850160408601615ced565b60601b90505f5b60148110156135c15781816014811061358357613583615d4d565b1a60f81b83613593836044615eb9565b815181106135a3576135a3615d4d565b60200101906001600160f81b03191690815f1a905350600101613568565b505f6135d06060860186615d08565b905090505f5b600481101561363b576135ea816003616161565b6135f5906008615eee565b63ffffffff8316901c60f81b8461360d836058615eb9565b8151811061361d5761361d615d4d565b60200101906001600160f81b03191690815f1a9053506001016135d6565b505f5b61364b6060870187615d08565b905081101561385f575f613660826058615eee565b61366b90605c615eb9565b90505f5b60208110156136f6576136856060890189615d08565b8481811061369557613695615d4d565b90506020028101906136a79190615d61565b3581602081106136b9576136b9615d4d565b1a60f81b866136c88385615eb9565b815181106136d8576136d8615d4d565b60200101906001600160f81b03191690815f1a90535060010161366f565b505f5b60088110156137ab5761370d816007616161565b613718906008615eee565b61372560608a018a615d08565b8581811061373557613735615d4d565b90506020028101906137479190615d61565b61375890604081019060200161599a565b6001600160401b0316901c60f81b8682613773856020615eb9565b61377d9190615eb9565b8151811061378d5761378d615d4d565b60200101906001600160f81b03191690815f1a9053506001016136f9565b505f5b6030811015613855576137c46060890189615d08565b848181106137d4576137d4615d4d565b90506020028101906137e69190615d61565b6137f4906040810190616247565b8281811061380457613804615d4d565b9050013560f81c60f81b868284602861381d9190615eb9565b6138279190615eb9565b8151811061383757613837615d4d565b60200101906001600160f81b03191690815f1a9053506001016137ae565b505060010161363e565b5091949350505050565b61387161582a565b5f8281525f8051602061655d8339815191526020526040808220815160e0810190925280545f805160206164fd83398151915293929190829060ff1660058111156138be576138be6159d3565b60058111156138cf576138cf6159d3565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613941576139416159d3565b1461399d5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156139e1576139e16159d3565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613a8d85826126c0565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061653d833981519152805460011901613b1557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061653d83398151915255565b5f5f805160206164bd83398151915281613b4a61021485614864565b90505f613b5687612248565b9050613b6187612b8c565b613bbe5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161057d565b600281516005811115613bd357613bd36159d3565b14613c325760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161057d565b5f828260800151613c439190615f57565b60048501546040840151919250613c65916001600160401b0390911690616289565b6001600160401b0316816001600160401b03161115613ce45760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161057d565b5f80613cf08a846126c0565b915091505f8a83604051602001613d1e92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836003811115613db957613db96159d3565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613f0b5760405162461bcd60e51b815260040161057d90616174565b5f805b6002811015613f5a57613f22816001616161565b613f2d906008615eee565b61ffff16858281518110613f4357613f43615d4d565b016020015160f81c901b9190911790600101613f0e565b5061ffff811615613f7d5760405162461bcd60e51b815260040161057d906161bd565b5f805b6004811015613fd857613f94816003616161565b613f9f906008615eee565b63ffffffff1686613fb1836002615eb9565b81518110613fc157613fc1615d4d565b016020015160f81c901b9190911790600101613f80565b5063ffffffff8116600314613fff5760405162461bcd60e51b815260040161057d90616200565b5f805b60208110156140545761401681601f616161565b614021906008615eee565b8761402d836006615eb9565b8151811061403d5761403d615d4d565b016020015160f81c901b9190911790600101614002565b505f8660268151811061406957614069615d4d565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206164bd8339815191529061ffff861610156141105760405162461bcd60e51b815260206004820152602b60248201525f805160206164dd83398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161057d565b61271061ffff861611156141685760405162461bcd60e51b815260206004820152602c60248201525f805160206164dd83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161057d565b60028101546001600160401b0390811690851610156141e15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161057d565b80548310156142445760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161057d565b80600101548311156142ab5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161057d565b5f6142b584614864565b90505f6142c182610a56565b90505f6142ce8983614887565b905060405180606001604052806142e23390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b61437d614e3d565b61438682614e88565b611aad81614efa565b5f808251602e146143b25760405162461bcd60e51b815260040161057d90616174565b5f805b6002811015614401576143c9816001616161565b6143d4906008615eee565b61ffff168582815181106143ea576143ea615d4d565b016020015160f81c901b91909117906001016143b5565b5061ffff8116156144245760405162461bcd60e51b815260040161057d906161bd565b5f805b600481101561447f5761443b816003616161565b614446906008615eee565b63ffffffff1686614458836002615eb9565b8151811061446857614468615d4d565b016020015160f81c901b9190911790600101614427565b5063ffffffff81166005146144a65760405162461bcd60e51b815260040161057d90616200565b5f805b60208110156144fb576144bd81601f616161565b6144c8906008615eee565b876144d4836006615eb9565b815181106144e4576144e4615d4d565b016020015160f81c901b91909117906001016144a9565b505f805b600881101561455a57614513816007616161565b61451e906008615eee565b6001600160401b031688614533836026615eb9565b8151811061454357614543615d4d565b016020015160f81c901b91909117906001016144ff565b5090969095509350505050565b5f805160206164fd8339815191525f6001600160401b03808416908516111561459b576145948385615b72565b90506145a8565b6145a58484615b72565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061460a575060018401548151614606916001600160401b031690615eb9565b8210155b15614630576001600160401b03831660608201528181526040810151602082015261464f565b82816060018181516146429190615f57565b6001600160401b03169052505b606081015161465f906064616289565b602082015160018601546001600160401b03929092169161468a9190600160401b900460ff16615eee565b10156146ee5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161057d565b856001600160401b0316816040018181516147099190615eb9565b9052506040810180516001600160401b0387169190614729908390616161565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061655d8339815191526020526040812060020180545f805160206164fd83398151915291600160401b9091046001600160401b03169060086147bf836162b4565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b0383811660248301526044820183905261224391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614f9b565b5f610a66825f8051602061649d833981519152546001600160a01b031690614ffc565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166149125760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161057d565b5f805160206164fd83398151915242614931604086016020870161599a565b6001600160401b0316116149a35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161057d565b6149b3604085016020860161599a565b6001600160401b03166149c96202a30042615eb9565b11614a3c5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161057d565b8335614a945760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161057d565b83355f90815260088201602052604090205415614b045760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057d565b6030614b136040860186616247565b905014614b785760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057d565b614b82835f614567565b5f80614c1b6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614bc6919061599a565b6001600160401b03168152602001614be160408a018a616247565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061515e565b5f82815260068601602052604090209193509150614c398282616313565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614c77908590600401615c09565b6020604051808303815f875af1158015614c93573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614cb79190615bd0565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614d2f57614d2f6159d3565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614e0f918e01908e0161599a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614e8657604051631afcd79f60e31b815260040160405180910390fd5b565b614e90614e3d565b614e9981615262565b614ea161527b565b611d5560608201356080830135614ebe60c0850160a0860161599a565b614ece60e0860160c087016163d2565b61ffff16614ee3610100870160e088016163eb565b614ef561012088016101008901615ced565b61528b565b614f02614e3d565b5f8051602061649d8339815191526001600160a01b038216614f7b5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161057d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f614faf6001600160a01b03841683615513565b905080515f14158015614fd3575080806020019051810190614fd1919061640b565b155b1561224357604051635274afe760e01b81526001600160a01b038416600482015260240161057d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015615042573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150669190615bd0565b905061507d6001600160a01b038516333086615520565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156150c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150e59190615bd0565b905081811161514b5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161057d565b6151558282616161565b95945050505050565b5f60608260800151516030146151c85760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057d565b5f806001855f015186602001518760400151886080015189606001516040516020016151fa9796959493929190616426565b604051602081830303815290604052905060028160405161521b9190615ea8565b602060405180830381855afa158015615236573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152599190615bd0565b94909350915050565b61526a614e3d565b615272615559565b611d5581615561565b615283614e3d565b614e866156dc565b615293614e3d565b5f805160206164bd833981519152836152ff5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161057d565b6127108411156153655760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161057d565b858711156153cd5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161057d565b5f8360ff161161543a5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161057d565b600a60ff841611156154ac5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161057d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b606061286783835f6156e4565b6040516001600160a01b038481166024830152838116604483015260648201839052610a509186918216906323b872dd90608401614832565b614e86614e3d565b615569614e3d565b80355f805160206164fd833981519152908155601461558e60608401604085016163eb565b60ff1611156155fb5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161057d565b5f61560c60608401604085016163eb565b60ff16116156745760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161057d565b61568460608301604084016163eb565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556156b5604083016020840161599a565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613b1b614e3d565b6060814710156157095760405163cd78605960e01b815230600482015260240161057d565b5f80856001600160a01b031684866040516157249190615ea8565b5f6040518083038185875af1925050503d805f811461575e576040519150601f19603f3d011682016040523d82523d5f602084013e615763565b606091505b50915091506126b68683836060826157835761577e826157ca565b612867565b815115801561579a57506001600160a01b0384163b155b156157c357604051639996b31560e01b81526001600160a01b038516600482015260240161057d565b5080612867565b8051156157da5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546157ff90615fc2565b5f825580601f1061580e575050565b601f0160209004905f5260205f2090810190611d559190615866565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561587a575f8155600101615867565b5090565b8015158114611d55575f80fd5b803563ffffffff8116811461589e575f80fd5b919050565b5f805f606084860312156158b5575f80fd5b8335925060208401356158c78161587e565b91506158d56040850161588b565b90509250925092565b5f602082840312156158ee575f80fd5b5035919050565b5f60208284031215615905575f80fd5b6128678261588b565b5f806040838503121561591f575f80fd5b6159288361588b565b946020939093013593505050565b5f8060408385031215615947575f80fd5b82356001600160401b0381111561595c575f80fd5b83016080818603121561596d575f80fd5b915061597b6020840161588b565b90509250929050565b80356001600160401b038116811461589e575f80fd5b5f602082840312156159aa575f80fd5b61286782615984565b5f80604083850312156159c4575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110615a0a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151615a4560608401826001600160401b03169052565b506080830151615a6060808401826001600160401b03169052565b5060a0830151615a7b60a08401826001600160401b03169052565b5060c083015161301c60c08401826001600160401b03169052565b803561ffff8116811461589e575f80fd5b5f805f8060808587031215615aba575f80fd5b84356001600160401b03811115615acf575f80fd5b850160608188031215615ae0575f80fd5b9350615aee60208601615a96565b9250615afc60408601615984565b9396929550929360600135925050565b6001600160a01b0381168114611d55575f80fd5b5f80828403610140811215615b33575f80fd5b61012080821215615b42575f80fd5b8493508301359050615b5381615b0c565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561301c5761301c615b5e565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615be0575f80fd5b5051919050565b5f5b83811015615c01578181015183820152602001615be9565b50505f910152565b602081525f8251806020840152615c27816040850160208701615be7565b601f01601f19169190910160400192915050565b5f82615c5557634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615cfd575f80fd5b813561286781615b0c565b5f808335601e19843603018112615d1d575f80fd5b8301803591506001600160401b03821115615d36575f80fd5b6020019150600581901b3603821315612810575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615d75575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615db557615db5615d7f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615de357615de3615d7f565b604052919050565b5f6001600160401b03821115615e0357615e03615d7f565b50601f01601f191660200190565b5f60608236031215615e21575f80fd5b615e29615d93565b823581526020615e3a818501615984565b8183015260408401356001600160401b03811115615e56575f80fd5b840136601f820112615e66575f80fd5b8035615e79615e7482615deb565b615dbb565b8181523684838501011115615e8c575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615d75818460208701615be7565b80820180821115610a6657610a66615b5e565b5f63ffffffff808316818103615ee457615ee4615b5e565b6001019392505050565b8082028115828204841417610a6657610a66615b5e565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561301c5761301c615b5e565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615fd657607f821691505b602082108103615ff457634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461600c81615fc2565b806020870152604060018084165f811461602d576001811461604957616076565b60ff19851660408a0152604084151560051b8a01019550616076565b895f5260205f205f5b8581101561606d5781548b8201860152908301908801616052565b8a016040019650505b509398975050505050505050565b805161589e8161587e565b5f80604083850312156160a0575f80fd5b82516001600160401b03808211156160b6575f80fd5b90840190606082870312156160c9575f80fd5b6160d1615d93565b825181526020808401516160e481615b0c565b828201526040840151838111156160f9575f80fd5b80850194505087601f85011261610d575f80fd5b8351925061611d615e7484615deb565b8381528882858701011115616130575f80fd5b61613f84838301848801615be7565b80604084015250819550616154818801616084565b9450505050509250929050565b81810381811115610a6657610a66615b5e565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e1984360301811261625c575f80fd5b8301803591506001600160401b03821115616275575f80fd5b602001915036819003821315612810575f80fd5b6001600160401b038181168382160280821691908281146162ac576162ac615b5e565b505092915050565b5f6001600160401b03808316818103615ee457615ee4615b5e565b601f82111561224357805f5260205f20601f840160051c810160208510156162f45750805b601f840160051c820191505b81811015610b05575f8155600101616300565b81516001600160401b0381111561632c5761632c615d7f565b6163408161633a8454615fc2565b846162cf565b602080601f831160018114616373575f841561635c5750858301515b5f19600386901b1c1916600185901b1785556163ca565b5f85815260208120601f198616915b828110156163a157888601518255948401946001909101908401616382565b50858210156163be57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156163e2575f80fd5b61286782615a96565b5f602082840312156163fb575f80fd5b813560ff81168114612867575f80fd5b5f6020828403121561641b575f80fd5b81516128678161587e565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161647b81604e860160208901615be7565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161674838038061674883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6165fb8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd366004615915565b61043a565b005b6101d26101e2366004615950565b61089d565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b610219610214366004615950565b610a56565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004615967565b610a6c565b6101d261026e366004615980565b610b0c565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e3660046159a8565b610f9c565b6102b66102b1366004615a0c565b61157f565b6040519081526020016101fd565b6102196102d2366004615950565b611598565b6102b65f81565b6101d26102ec366004615915565b6115ac565b6101ef603081565b6101d2610307366004615950565b6117c8565b6101d261031a366004615980565b6118ce565b6101d261032d366004615950565b611ab1565b6102b6610340366004615a25565b611dca565b6101d2610353366004615967565b611df6565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c366004615950565b611f6c565b6101d261039f366004615950565b6121df565b6101ef601481565b6103bf6103ba366004615950565b6122ba565b6040516101fd9190615a59565b6102196202a30081565b6102b66103e4366004615950565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615b19565b612382565b6101d2610435366004615b92565b6123b7565b5f8381525f8051602061658f83398151915260205260408082208151610100810190925280545f8051602061652f83398151915293929190829060ff16600381111561048857610488615a45565b600381111561049957610499615a45565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61051d826122ba565b905060028351600381111561053457610534615a45565b146105865760405162461bcd60e51b815260206004820152602a60248201525f8051602061654f8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105eb5760405162461bcd60e51b815260206004820152603360248201525f8051602061654f8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161057d565b6003835280515f90600290600581111561060757610607615a45565b0361065e57861561061f5761061c8387612496565b90505b5f846060015183608001516106349190615be4565b90506106408482612732565b506001600160401b0390811660e0870152421660a086015250610692565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106c5866060015161157f565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b81526004016106f99796959493929190615c04565b602060405180830381865afa158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190615c42565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600381111561077757610777615a45565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088b916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206165cf8339815191526020526040808220815160e0810190925280545f8051602061656f83398151915293929190829060ff1660058111156108ea576108ea615a45565b60058111156108fb576108fb615a45565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096a5761096a615a45565b146109cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb6109f48584606001515f612889565b6040518263ffffffff1660e01b8152600401610a109190615c7b565b6020604051808303815f875af1158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190615c42565b50505050565b5f610a6664e8d4a5100083615cad565b92915050565b5f8051602061652f8339815191525f80610a85846128e0565b91509150610a9282612bfe565b610a9c5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610aca57610aca615a45565b03610aef575f83815260088501602052604081208054919055610aed8282612c39565b505b610b0581610b00846040015161157f565b612caf565b5050505050565b5f8181525f8051602061658f83398151915260205260408082208151610100810190925280545f8051602061652f83398151915293929190829060ff166003811115610b5a57610b5a615a45565b6003811115610b6b57610b6b615a45565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf0906122ba565b9050600182516003811115610c0757610c07615a45565b14610c705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161057d565b600381516005811115610c8557610c85615a45565b03610dfd57600380835260c0820180516001600160401b0390811660808601529051811660a085015260608301511660e08401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610ce957610ce9615a45565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1257610e12615a45565b03610e2057610b0584612cd2565b5f610e2a86612ecf565b90505f80610e3b8360400151613095565b509150915081856040015114610e635760405162461bcd60e51b815260040161057d90615ccc565b806001600160401b031684606001516001600160401b03161015610ed45760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161057d565b806001600160401b03168560c001516001600160401b03161115610f0a5760405162461bcd60e51b815260040161057d90615d16565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061656f8339815191529060ff16156110395760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a09190615c42565b8360200135146111025760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161057d565b306111136060850160408601615d5f565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161057d565b5f6111936060850185615d7a565b905090505f805b828163ffffffff161015611483575f6111b66060880188615d7a565b8363ffffffff168181106111cc576111cc615dbf565b90506020028101906111de9190615dd3565b6111e790615e83565b80515f818152600888016020526040902054919250901561125f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161057d565b5f6002895f01358560405160200161128e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a891615f1a565b602060405180830381855afa1580156112c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e69190615c42565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561137257611372615a45565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611425911686615f2b565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147c90615f3e565b905061119a565b50600483018190555f61149585612ecf565b90505f6114a582604001516132d0565b90505f6114b188613442565b9050816002826040516114c49190615f1a565b602060405180830381855afa1580156114df573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115029190615c42565b146115665760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161057d565b5050506009909201805460ff1916600117905550505050565b5f610a666001600160401b03831664e8d4a51000615f60565b5f6115a2826122ba565b6080015192915050565b5f8051602061652f8339815191525f6115c4856138db565b90506115cf85612bfe565b6115da575050505050565b5f8581526005830160205260409020546001600160a01b031633146116115760405162461bcd60e51b815260040161057d90615f77565b5f85815260058301602052604090205460a082015161164091600160b01b90046001600160401b031690615fc9565b6001600160401b03168160c001516001600160401b031610156116c15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161057d565b8315610b05575f6116d28685612496565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117299061157f565b60a085015160c08601516040516001600160e01b031960e086901b16815261175d939291829188905f908190600401615c04565b602060405180830381865afa158015611778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c9190615c42565b5f878152600885016020526040812080549091906117bb908490615f2b565b9091555050505050505050565b5f8051602061652f8339815191525f6117e0836122ba565b90506004815160058111156117f7576117f7615a45565b146118615760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161057d565b5f8381526005830160205260409020546001600160a01b031633146118985760405162461bcd60e51b815260040161057d90615f77565b5f83815260088301602090815260408083208054908490556005860190925290912054610a50906001600160a01b031682612c39565b6118d6613b56565b5f8181525f8051602061658f83398151915260205260408082208151610100810190925280545f8051602061652f83398151915293929190829060ff16600381111561192457611924615a45565b600381111561193557611935615a45565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119b185612ecf565b90505f806119c28360400151613095565b5091509150818460400151146119ea5760405162461bcd60e51b815260040161057d90615ccc565b806001600160401b03168460e001516001600160401b03161115611a205760405162461bcd60e51b815260040161057d90615d16565b600384516003811115611a3557611a35615a45565b14611a895760405162461bcd60e51b815260206004820152603160248201525f8051602061654f8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161057d565b611a9286612cd2565b5050505050611aad60015f805160206165af83398151915255565b5050565b611ab9613b56565b5f8181525f8051602061658f83398151915260205260408082208151610100810190925280545f8051602061652f83398151915293929190829060ff166003811115611b0757611b07615a45565b6003811115611b1857611b18615a45565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611b9c826122ba565b90505f83516003811115611bb257611bb2615a45565b03611c105760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152671bdd08199bdd5b9960c21b606482015260840161057d565b600481516005811115611c2557611c25615a45565b14611c885760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161057d565b600183516003811115611c9d57611c9d615a45565b03611cb457611cab85612cd2565b50505050611db1565b600283516003811115611cc957611cc9615a45565b03611da3578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611d01856060015161157f565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611d5396959493926001600160401b0390921691908190600401615c04565b602060405180830381865afa158015611d6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d929190615c42565b5f8681526007860160205260409020555b611dac85612cd2565b505050505b611dc760015f805160206165af83398151915255565b50565b5f611dd3613b56565b611dde833384613ba0565b9050610a6660015f805160206165af83398151915255565b5f8051602061656f8339815191525f611e0e83612ecf565b90505f80611e1f8360400151613f5a565b9150915080611e815760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057d565b60015f83815260078601602052604090205460ff166005811115611ea757611ea7615a45565b14611ec45760405162461bcd60e51b815260040161057d90615fe9565b5f8281526006850160205260408120611edc91615865565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061658f83398151915260205260408082208151610100810190925280545f8051602061652f83398151915293929190829060ff166003811115611fba57611fba615a45565b6003811115611fcb57611fcb615a45565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600381111561205257612052615a45565b1480612070575060038151600381111561206e5761206e615a45565b145b6120c45760405162461bcd60e51b815260206004820152603260248201525f8051602061654f833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161057d565b5f6120d282604001516122ba565b905080606001516001600160401b03165f036121565760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb612183846040015184606001518560800151612889565b6040518263ffffffff1660e01b815260040161219f9190615c7b565b6020604051808303815f875af11580156121bb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190615c42565b5f8181525f805160206165cf83398151915260205260409020545f8051602061656f8339815191529060019060ff16600581111561221f5761221f615a45565b1461223c5760405162461bcd60e51b815260040161057d90615fe9565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612275919060040161606c565b6020604051808303815f875af1158015612291573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122b59190615c42565b505050565b6122c261589c565b5f8281525f805160206165cf833981519152602052604090819020815160e0810190925280545f8051602061656f833981519152929190829060ff16600581111561230f5761230f615a45565b600581111561232057612320615a45565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61238b613b56565b612397858585856140fb565b90506123af60015f805160206165af83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680612400575080546001600160401b03808416911610155b1561241e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561244984846143e7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124e1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125089190810190616101565b915091508061256b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d29190615c42565b8251146126365760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057d565b60208201516001600160a01b0316156126ac5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057d565b5f806126bb8460400151614401565b915091508187146127285760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057d565b9695505050505050565b5f8281525f805160206165cf833981519152602052604081206002015481905f8051602061656f83398151915290600160801b90046001600160401b031661277a85826145d9565b5f612784876147e7565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6127d48a858b612889565b6040518263ffffffff1660e01b81526004016127f09190615c7b565b6020604051808303815f875af115801561280c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128309190615c42565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6128e961589c565b5f8051602061656f8339815191525f61290185612ecf565b90505f806129128360400151613f5a565b9150915080156129775760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057d565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156129a8576129a8615a45565b60058111156129b9576129b9615a45565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612a2857612a28615a45565b1480612a465750600181516005811115612a4457612a44615a45565b145b612aa55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161057d565b600381516005811115612aba57612aba615a45565b03612ac85760048152612acd565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612b1257612b12615a45565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bc657612bc6615a45565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f8051602061650f83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c94575f80fd5b505af1158015612ca6573d5f803e3d5ffd5b50505050505050565b5f8051602061650f83398151915254611aad906001600160a01b03168383614877565b5f8181525f8051602061658f83398151915260205260408082208151610100810190925280545f8051602061652f83398151915293929190829060ff166003811115612d2057612d20615a45565b6003811115612d3157612d31615a45565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612e2590600160a01b900461ffff1684615f60565b612e2f9190615cad565b905080856008015f8581526020019081526020015f205f828254612e539190615f2b565b909155505f9050612e6482846161d3565b9050612e74856020015182612c39565b612e898560200151610b00876060015161157f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f33573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f5a9190810190616101565b9150915080612fba5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057d565b81511561301b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057d565b60208201516001600160a01b03161561308e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057d565b5092915050565b5f805f83516036146130b95760405162461bcd60e51b815260040161057d906161e6565b5f805b6002811015613108576130d08160016161d3565b6130db906008615f60565b61ffff168682815181106130f1576130f1615dbf565b016020015160f81c901b91909117906001016130bc565b5061ffff81161561312b5760405162461bcd60e51b815260040161057d9061622f565b5f805b6004811015613186576131428160036161d3565b61314d906008615f60565b63ffffffff168761315f836002615f2b565b8151811061316f5761316f615dbf565b016020015160f81c901b919091179060010161312e565b5063ffffffff81166004146131ad5760405162461bcd60e51b815260040161057d90616272565b5f805b6020811015613202576131c481601f6161d3565b6131cf906008615f60565b886131db836006615f2b565b815181106131eb576131eb615dbf565b016020015160f81c901b91909117906001016131b0565b505f805b60088110156132615761321a8160076161d3565b613225906008615f60565b6001600160401b03168961323a836026615f2b565b8151811061324a5761324a615dbf565b016020015160f81c901b9190911790600101613206565b505f805b60088110156132c0576132798160076161d3565b613284906008615f60565b6001600160401b03168a61329983602e615f2b565b815181106132a9576132a9615dbf565b016020015160f81c901b9190911790600101613265565b5091989097509095509350505050565b5f81516026146132f25760405162461bcd60e51b815260040161057d906161e6565b5f805b6002811015613341576133098160016161d3565b613314906008615f60565b61ffff1684828151811061332a5761332a615dbf565b016020015160f81c901b91909117906001016132f5565b5061ffff8116156133645760405162461bcd60e51b815260040161057d9061622f565b5f805b60048110156133bf5761337b8160036161d3565b613386906008615f60565b63ffffffff1685613398836002615f2b565b815181106133a8576133a8615dbf565b016020015160f81c901b9190911790600101613367565b5063ffffffff8116156133e45760405162461bcd60e51b815260040161057d90616272565b5f805b6020811015613439576133fb81601f6161d3565b613406906008615f60565b86613412836006615f2b565b8151811061342257613422615dbf565b016020015160f81c901b91909117906001016133e7565b50949350505050565b60605f61345183830184615d7a565b61345d91506058615f60565b61346890605c615f2b565b6001600160401b0381111561347f5761347f615df1565b6040519080825280601f01601f1916602001820160405280156134a9576020820181803683370190505b5090505f5b60208110156134fe57833581602081106134ca576134ca615dbf565b1a60f81b8282815181106134e0576134e0615dbf565b60200101906001600160f81b03191690815f1a9053506001016134ae565b505f5b602081101561355e578360200135816020811061352057613520615dbf565b1a60f81b82613530836020615f2b565b8151811061354057613540615dbf565b60200101906001600160f81b03191690815f1a905350600101613501565b505f5b60048110156135c1576135758160036161d3565b613580906008615f60565b6014901c60f81b82613593836040615f2b565b815181106135a3576135a3615dbf565b60200101906001600160f81b03191690815f1a905350600101613561565b505f6135d36060850160408601615d5f565b60601b90505f5b6014811015613633578181601481106135f5576135f5615dbf565b1a60f81b83613605836044615f2b565b8151811061361557613615615dbf565b60200101906001600160f81b03191690815f1a9053506001016135da565b505f6136426060860186615d7a565b905090505f5b60048110156136ad5761365c8160036161d3565b613667906008615f60565b63ffffffff8316901c60f81b8461367f836058615f2b565b8151811061368f5761368f615dbf565b60200101906001600160f81b03191690815f1a905350600101613648565b505f5b6136bd6060870187615d7a565b90508110156138d1575f6136d2826058615f60565b6136dd90605c615f2b565b90505f5b6020811015613768576136f76060890189615d7a565b8481811061370757613707615dbf565b90506020028101906137199190615dd3565b35816020811061372b5761372b615dbf565b1a60f81b8661373a8385615f2b565b8151811061374a5761374a615dbf565b60200101906001600160f81b03191690815f1a9053506001016136e1565b505f5b600881101561381d5761377f8160076161d3565b61378a906008615f60565b61379760608a018a615d7a565b858181106137a7576137a7615dbf565b90506020028101906137b99190615dd3565b6137ca906040810190602001615a0c565b6001600160401b0316901c60f81b86826137e5856020615f2b565b6137ef9190615f2b565b815181106137ff576137ff615dbf565b60200101906001600160f81b03191690815f1a90535060010161376b565b505f5b60308110156138c7576138366060890189615d7a565b8481811061384657613846615dbf565b90506020028101906138589190615dd3565b6138669060408101906162b9565b8281811061387657613876615dbf565b9050013560f81c60f81b868284602861388f9190615f2b565b6138999190615f2b565b815181106138a9576138a9615dbf565b60200101906001600160f81b03191690815f1a905350600101613820565b50506001016136b0565b5091949350505050565b6138e361589c565b5f8281525f805160206165cf8339815191526020526040808220815160e0810190925280545f8051602061656f83398151915293929190829060ff16600581111561393057613930615a45565b600581111561394157613941615a45565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156139b3576139b3615a45565b14613a0f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613a5357613a53615a45565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613aff8582612732565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f805160206165af833981519152805460011901613b8757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206165af83398151915255565b5f5f8051602061652f83398151915281613bbc610214856148d6565b90505f613bc8876122ba565b9050613bd387612bfe565b613c305760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161057d565b600281516005811115613c4557613c45615a45565b14613ca45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161057d565b5f828260800151613cb59190615fc9565b60048501546040840151919250613cd7916001600160401b03909116906162fb565b6001600160401b0316816001600160401b03161115613d565760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161057d565b5f80613d628a84612732565b915091505f8a83604051602001613d9092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836003811115613e2b57613e2b615a45565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613f7d5760405162461bcd60e51b815260040161057d906161e6565b5f805b6002811015613fcc57613f948160016161d3565b613f9f906008615f60565b61ffff16858281518110613fb557613fb5615dbf565b016020015160f81c901b9190911790600101613f80565b5061ffff811615613fef5760405162461bcd60e51b815260040161057d9061622f565b5f805b600481101561404a576140068160036161d3565b614011906008615f60565b63ffffffff1686614023836002615f2b565b8151811061403357614033615dbf565b016020015160f81c901b9190911790600101613ff2565b5063ffffffff81166003146140715760405162461bcd60e51b815260040161057d90616272565b5f805b60208110156140c65761408881601f6161d3565b614093906008615f60565b8761409f836006615f2b565b815181106140af576140af615dbf565b016020015160f81c901b9190911790600101614074565b505f866026815181106140db576140db615dbf565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061652f8339815191529061ffff861610156141825760405162461bcd60e51b815260206004820152602b60248201525f8051602061654f83398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161057d565b61271061ffff861611156141da5760405162461bcd60e51b815260206004820152602c60248201525f8051602061654f83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161057d565b60028101546001600160401b0390811690851610156142535760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161057d565b80548310156142b65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161057d565b806001015483111561431d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161057d565b5f614327846148d6565b90505f61433382610a56565b90505f61434089836148f9565b905060405180606001604052806143543390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6143ef614eaf565b6143f882614efa565b611aad81614f6c565b5f808251602e146144245760405162461bcd60e51b815260040161057d906161e6565b5f805b60028110156144735761443b8160016161d3565b614446906008615f60565b61ffff1685828151811061445c5761445c615dbf565b016020015160f81c901b9190911790600101614427565b5061ffff8116156144965760405162461bcd60e51b815260040161057d9061622f565b5f805b60048110156144f1576144ad8160036161d3565b6144b8906008615f60565b63ffffffff16866144ca836002615f2b565b815181106144da576144da615dbf565b016020015160f81c901b9190911790600101614499565b5063ffffffff81166005146145185760405162461bcd60e51b815260040161057d90616272565b5f805b602081101561456d5761452f81601f6161d3565b61453a906008615f60565b87614546836006615f2b565b8151811061455657614556615dbf565b016020015160f81c901b919091179060010161451b565b505f805b60088110156145cc576145858160076161d3565b614590906008615f60565b6001600160401b0316886145a5836026615f2b565b815181106145b5576145b5615dbf565b016020015160f81c901b9190911790600101614571565b5090969095509350505050565b5f8051602061656f8339815191525f6001600160401b03808416908516111561460d576146068385615be4565b905061461a565b6146178484615be4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061467c575060018401548151614678916001600160401b031690615f2b565b8210155b156146a2576001600160401b0383166060820152818152604081015160208201526146c1565b82816060018181516146b49190615fc9565b6001600160401b03169052505b60608101516146d19060646162fb565b602082015160018601546001600160401b0392909216916146fc9190600160401b900460ff16615f60565b10156147605760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161057d565b856001600160401b03168160400181815161477b9190615f2b565b9052506040810180516001600160401b038716919061479b9083906161d3565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206165cf8339815191526020526040812060020180545f8051602061656f83398151915291600160401b9091046001600160401b031690600861483183616326565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b038381166024830152604482018390526122b591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061500d565b5f610a66825f8051602061650f833981519152546001600160a01b03169061506e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166149845760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161057d565b5f8051602061656f833981519152426149a36040860160208701615a0c565b6001600160401b031611614a155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161057d565b614a256040850160208601615a0c565b6001600160401b0316614a3b6202a30042615f2b565b11614aae5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161057d565b8335614b065760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161057d565b83355f90815260088201602052604090205415614b765760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057d565b6030614b8560408601866162b9565b905014614bea5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057d565b614bf4835f6145d9565b5f80614c8d6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614c389190615a0c565b6001600160401b03168152602001614c5360408a018a6162b9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506151d0565b5f82815260068601602052604090209193509150614cab8282616385565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614ce9908590600401615c7b565b6020604051808303815f875af1158015614d05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d299190615c42565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614da157614da1615a45565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614e81918e01908e01615a0c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614ef857604051631afcd79f60e31b815260040160405180910390fd5b565b614f02614eaf565b614f0b816152d4565b614f136152ed565b611dc760608201356080830135614f3060c0850160a08601615a0c565b614f4060e0860160c08701616444565b61ffff16614f55610100870160e0880161645d565b614f6761012088016101008901615d5f565b6152fd565b614f74614eaf565b5f8051602061650f8339815191526001600160a01b038216614fed5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161057d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6150216001600160a01b03841683615585565b905080515f14158015615045575080806020019051810190615043919061647d565b155b156122b557604051635274afe760e01b81526001600160a01b038416600482015260240161057d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156150b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150d89190615c42565b90506150ef6001600160a01b038516333086615592565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015615133573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906151579190615c42565b90508181116151bd5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161057d565b6151c782826161d3565b95945050505050565b5f606082608001515160301461523a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057d565b5f806001855f0151866020015187604001518860800151896060015160405160200161526c9796959493929190616498565b604051602081830303815290604052905060028160405161528d9190615f1a565b602060405180830381855afa1580156152a8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152cb9190615c42565b94909350915050565b6152dc614eaf565b6152e46155cb565b611dc7816155d3565b6152f5614eaf565b614ef861574e565b615305614eaf565b5f8051602061652f833981519152836153715760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161057d565b6127108411156153d75760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161057d565b8587111561543f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161057d565b5f8360ff16116154ac5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161057d565b600a60ff8416111561551e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161057d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606128d983835f615756565b6040516001600160a01b038481166024830152838116604483015260648201839052610a509186918216906323b872dd906084016148a4565b614ef8614eaf565b6155db614eaf565b80355f8051602061656f8339815191529081556014615600606084016040850161645d565b60ff16111561566d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161057d565b5f61567e606084016040850161645d565b60ff16116156e65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161057d565b6156f6606083016040840161645d565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556157276040830160208401615a0c565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613b8d614eaf565b60608147101561577b5760405163cd78605960e01b815230600482015260240161057d565b5f80856001600160a01b031684866040516157969190615f1a565b5f6040518083038185875af1925050503d805f81146157d0576040519150601f19603f3d011682016040523d82523d5f602084013e6157d5565b606091505b50915091506127288683836060826157f5576157f08261583c565b6128d9565b815115801561580c57506001600160a01b0384163b155b1561583557604051639996b31560e01b81526001600160a01b038516600482015260240161057d565b50806128d9565b80511561584c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461587190616034565b5f825580601f10615880575050565b601f0160209004905f5260205f2090810190611dc791906158d8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156158ec575f81556001016158d9565b5090565b8015158114611dc7575f80fd5b803563ffffffff81168114615910575f80fd5b919050565b5f805f60608486031215615927575f80fd5b833592506020840135615939816158f0565b9150615947604085016158fd565b90509250925092565b5f60208284031215615960575f80fd5b5035919050565b5f60208284031215615977575f80fd5b6128d9826158fd565b5f8060408385031215615991575f80fd5b61599a836158fd565b946020939093013593505050565b5f80604083850312156159b9575f80fd5b82356001600160401b038111156159ce575f80fd5b8301608081860312156159df575f80fd5b91506159ed602084016158fd565b90509250929050565b80356001600160401b0381168114615910575f80fd5b5f60208284031215615a1c575f80fd5b6128d9826159f6565b5f8060408385031215615a36575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110615a7c57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151615ab760608401826001600160401b03169052565b506080830151615ad260808401826001600160401b03169052565b5060a0830151615aed60a08401826001600160401b03169052565b5060c083015161308e60c08401826001600160401b03169052565b803561ffff81168114615910575f80fd5b5f805f8060808587031215615b2c575f80fd5b84356001600160401b03811115615b41575f80fd5b850160608188031215615b52575f80fd5b9350615b6060208601615b08565b9250615b6e604086016159f6565b9396929550929360600135925050565b6001600160a01b0381168114611dc7575f80fd5b5f80828403610140811215615ba5575f80fd5b61012080821215615bb4575f80fd5b8493508301359050615bc581615b7e565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561308e5761308e615bd0565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615c52575f80fd5b5051919050565b5f5b83811015615c73578181015183820152602001615c5b565b50505f910152565b602081525f8251806020840152615c99816040850160208701615c59565b601f01601f19169190910160400192915050565b5f82615cc757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615d6f575f80fd5b81356128d981615b7e565b5f808335601e19843603018112615d8f575f80fd5b8301803591506001600160401b03821115615da8575f80fd5b6020019150600581901b3603821315612882575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615de7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615e2757615e27615df1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615e5557615e55615df1565b604052919050565b5f6001600160401b03821115615e7557615e75615df1565b50601f01601f191660200190565b5f60608236031215615e93575f80fd5b615e9b615e05565b823581526020615eac8185016159f6565b8183015260408401356001600160401b03811115615ec8575f80fd5b840136601f820112615ed8575f80fd5b8035615eeb615ee682615e5d565b615e2d565b8181523684838501011115615efe575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615de7818460208701615c59565b80820180821115610a6657610a66615bd0565b5f63ffffffff808316818103615f5657615f56615bd0565b6001019392505050565b8082028115828204841417610a6657610a66615bd0565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561308e5761308e615bd0565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c9082168061604857607f821691505b60208210810361606657634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461607e81616034565b806020870152604060018084165f811461609f57600181146160bb576160e8565b60ff19851660408a0152604084151560051b8a010195506160e8565b895f5260205f205f5b858110156160df5781548b82018601529083019088016160c4565b8a016040019650505b509398975050505050505050565b8051615910816158f0565b5f8060408385031215616112575f80fd5b82516001600160401b0380821115616128575f80fd5b908401906060828703121561613b575f80fd5b616143615e05565b8251815260208084015161615681615b7e565b8282015260408401518381111561616b575f80fd5b80850194505087601f85011261617f575f80fd5b8351925061618f615ee684615e5d565b83815288828587010111156161a2575f80fd5b6161b184838301848801615c59565b806040840152508195506161c68188016160f6565b9450505050509250929050565b81810381811115610a6657610a66615bd0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e198436030181126162ce575f80fd5b8301803591506001600160401b038211156162e7575f80fd5b602001915036819003821315612882575f80fd5b6001600160401b0381811683821602808216919082811461631e5761631e615bd0565b505092915050565b5f6001600160401b03808316818103615f5657615f56615bd0565b601f8211156122b557805f5260205f20601f840160051c810160208510156163665750805b601f840160051c820191505b81811015610b05575f8155600101616372565b81516001600160401b0381111561639e5761639e615df1565b6163b2816163ac8454616034565b84616341565b602080601f8311600181146163e5575f84156163ce5750858301515b5f19600386901b1c1916600185901b17855561643c565b5f85815260208120601f198616915b82811015616413578886015182559484019460019091019084016163f4565b508582101561643057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215616454575f80fd5b6128d982615b08565b5f6020828403121561646d575f80fd5b813560ff811681146128d9575f80fd5b5f6020828403121561648d575f80fd5b81516128d9816158f0565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516164ed81604e860160208901615c59565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 d5e1499c8..fa575bd35 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516163a03803806163a083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162538061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d836600461560a565b61058b565b005b3480156101ea575f80fd5b506101dd6101f9366004615645565b6109ee565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd61024336600461565c565b610ba7565b348015610253575f80fd5b50610267610262366004615645565b610c84565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e736600461569a565b610c9a565b604051908152602001610220565b348015610305575f80fd5b506101dd6103143660046156ee565b610cce565b348015610324575f80fd5b506101dd610333366004615707565b610d6e565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b36600461572f565b6111fe565b34801561038b575f80fd5b506102ec61039a36600461577d565b6117e1565b3480156103aa575f80fd5b506102676103b9366004615645565b6117fa565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb36600461560a565b61180e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e366004615645565b611a2a565b34801561042e575f80fd5b506101dd61043d366004615707565b611b30565b34801561044d575f80fd5b506101dd61045c366004615645565b611d13565b34801561046c575f80fd5b506101dd61047b3660046156ee565b611fba565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b4366004615645565b612130565b3480156104c4575f80fd5b506101dd6104d3366004615645565b6123a3565b6102ec6104e6366004615645565b61247e565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e610519366004615645565b6124af565b60405161022091906157aa565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b366004615645565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206161e783398151915260205260408082208151610100810190925280545f8051602061618783398151915293929190829060ff1660038111156105d9576105d9615796565b60038111156105ea576105ea615796565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61066e826124af565b905060028351600381111561068557610685615796565b146106d75760405162461bcd60e51b815260206004820152602a60248201525f805160206161a78339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461073c5760405162461bcd60e51b815260206004820152603360248201525f805160206161a78339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106ce565b6003835280515f90600290600581111561075857610758615796565b036107af5786156107705761076d8387612577565b90505b5f84606001518360800151610785919061586d565b90506107918482612813565b506001600160401b0390811660e0870152421660a0860152506107e3565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561081686606001516117e1565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b815260040161084a979695949392919061588d565b602060405180830381865afa158015610865573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061088991906158cb565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360038111156108c8576108c8615796565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109dc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206162278339815191526020526040808220815160e0810190925280545f805160206161c783398151915293929190829060ff166005811115610a3b57610a3b615796565b6005811115610a4c57610a4c615796565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abb57610abb615796565b14610b205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb610b458584606001515f61296a565b6040518263ffffffff1660e01b8152600401610b619190615904565b6020604051808303815f875af1158015610b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba191906158cb565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c38836129b9565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9464e8d4a5100083615936565b92915050565b5f610ca36129ca565b610caf84848434612a01565b9050610cc760015f8051602061620783398151915255565b9392505050565b5f805160206161878339815191525f80610ce784612cf5565b91509150610cf482613013565b610cfe5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d2c57610d2c615796565b03610d51575f83815260088501602052604081208054919055610d4f828261304e565b505b610d6781610d6284604001516117e1565b6130b4565b5050505050565b5f8181525f805160206161e783398151915260205260408082208151610100810190925280545f8051602061618783398151915293929190829060ff166003811115610dbc57610dbc615796565b6003811115610dcd57610dcd615796565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e52906124af565b9050600182516003811115610e6957610e69615796565b14610ed25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106ce565b600381516005811115610ee757610ee7615796565b0361105f57600380835260c0820180516001600160401b0390811660808601529051811660a085015260608301511660e08401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610f4b57610f4b615796565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b60048151600581111561107457611074615796565b0361108257610d67846130c7565b5f61108c866132c4565b90505f8061109d836040015161348a565b5091509150818560400151146110c55760405162461bcd60e51b81526004016106ce90615955565b806001600160401b031684606001516001600160401b031610156111365760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106ce565b806001600160401b03168560c001516001600160401b0316111561116c5760405162461bcd60e51b81526004016106ce9061599f565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206161c78339815191529060ff161561129b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112de573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061130291906158cb565b8360200135146113645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106ce565b3061137560608501604086016159fc565b6001600160a01b0316146113e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106ce565b5f6113f56060850185615a17565b905090505f805b828163ffffffff1610156116e5575f6114186060880188615a17565b8363ffffffff1681811061142e5761142e615a5c565b90506020028101906114409190615a70565b61144990615b20565b80515f81815260088801602052604090205491925090156114c15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106ce565b5f6002895f0135856040516020016114f092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150a91615bb7565b602060405180830381855afa158015611525573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061154891906158cb565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d4576115d4615796565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611687911686615bc8565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116de90615bdb565b90506113fc565b50600483018190555f6116f7856132c4565b90505f61170782604001516136c5565b90505f61171388613837565b9050816002826040516117269190615bb7565b602060405180830381855afa158015611741573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061176491906158cb565b146117c85760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106ce565b5050506009909201805460ff1916600117905550505050565b5f610c946001600160401b03831664e8d4a51000615bfd565b5f611804826124af565b6080015192915050565b5f805160206161878339815191525f61182685613cd0565b905061183185613013565b61183c575050505050565b5f8581526005830160205260409020546001600160a01b031633146118735760405162461bcd60e51b81526004016106ce90615c14565b5f85815260058301602052604090205460a08201516118a291600160b01b90046001600160401b031690615c66565b6001600160401b03168160c001516001600160401b031610156119235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106ce565b8315610d67575f6119348685612577565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198b906117e1565b60a085015160c08601516040516001600160e01b031960e086901b1681526119bf939291829188905f90819060040161588d565b602060405180830381865afa1580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe91906158cb565b5f87815260088501602052604081208054909190611a1d908490615bc8565b9091555050505050505050565b5f805160206161878339815191525f611a42836124af565b9050600481516005811115611a5957611a59615796565b14611ac35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106ce565b5f8381526005830160205260409020546001600160a01b03163314611afa5760405162461bcd60e51b81526004016106ce90615c14565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba1906001600160a01b03168261304e565b611b386129ca565b5f8181525f805160206161e783398151915260205260408082208151610100810190925280545f8051602061618783398151915293929190829060ff166003811115611b8657611b86615796565b6003811115611b9757611b97615796565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c13856132c4565b90505f80611c24836040015161348a565b509150915081846040015114611c4c5760405162461bcd60e51b81526004016106ce90615955565b806001600160401b03168460e001516001600160401b03161115611c825760405162461bcd60e51b81526004016106ce9061599f565b600384516003811115611c9757611c97615796565b14611ceb5760405162461bcd60e51b815260206004820152603160248201525f805160206161a78339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106ce565b611cf4866130c7565b5050505050611d0f60015f8051602061620783398151915255565b5050565b611d1b6129ca565b5f8181525f805160206161e783398151915260205260408082208151610100810190925280545f8051602061618783398151915293929190829060ff166003811115611d6957611d69615796565b6003811115611d7a57611d7a615796565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611dfe826124af565b9050600481516005811115611e1557611e15615796565b14611e785760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106ce565b600183516003811115611e8d57611e8d615796565b03611ea457611e9b856130c7565b50505050611fa1565b600283516003811115611eb957611eb9615796565b03611f93578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611ef185606001516117e1565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611f4396959493926001600160401b039092169190819060040161588d565b602060405180830381865afa158015611f5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8291906158cb565b5f8681526007860160205260409020555b611f9c856130c7565b505050505b611fb760015f8051602061620783398151915255565b50565b5f805160206161c78339815191525f611fd2836132c4565b90505f80611fe38360400151613f4b565b91509150806120455760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106ce565b60015f83815260078601602052604090205460ff16600581111561206b5761206b615796565b146120885760405162461bcd60e51b81526004016106ce90615c86565b5f82815260068501602052604081206120a09161555f565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206161e783398151915260205260408082208151610100810190925280545f8051602061618783398151915293929190829060ff16600381111561217e5761217e615796565b600381111561218f5761218f615796565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600381111561221657612216615796565b1480612234575060038151600381111561223257612232615796565b145b6122885760405162461bcd60e51b815260206004820152603260248201525f805160206161a7833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106ce565b5f61229682604001516124af565b905080606001516001600160401b03165f0361231a5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb61234784604001518460600151856080015161296a565b6040518263ffffffff1660e01b81526004016123639190615904565b6020604051808303815f875af115801561237f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d6791906158cb565b5f8181525f8051602061622783398151915260205260409020545f805160206161c78339815191529060019060ff1660058111156123e3576123e3615796565b146124005760405162461bcd60e51b81526004016106ce90615c86565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916124399190600401615d03565b6020604051808303815f875af1158015612455573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247991906158cb565b505050565b5f6124876129ca565b6124928233346140ec565b90506124aa60015f8051602061620783398151915255565b919050565b6124b7615596565b5f8281525f80516020616227833981519152602052604090819020815160e0810190925280545f805160206161c7833981519152929190829060ff16600581111561250457612504615796565b600581111561251557612515615796565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156125c2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125e99190810190615d98565b915091508061264c5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561268f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126b391906158cb565b8251146127175760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106ce565b60208201516001600160a01b03161561278d5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106ce565b5f8061279c84604001516144a3565b915091508187146128095760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106ce565b9695505050505050565b5f8281525f80516020616227833981519152602052604081206002015481905f805160206161c783398151915290600160801b90046001600160401b031661285b858261467b565b5f61286587614889565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6128b58a858b61296a565b6040518263ffffffff1660e01b81526004016128d19190615904565b6020604051808303815f875af11580156128ed573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061291191906158cb565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6129c1614919565b611fb781614964565b5f805160206162078339815191528054600119016129fb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206161878339815191529061ffff86161015612a885760405162461bcd60e51b815260206004820152602b60248201525f805160206161a783398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106ce565b61271061ffff86161115612ae05760405162461bcd60e51b815260206004820152602c60248201525f805160206161a783398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106ce565b60028101546001600160401b039081169085161015612b595760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106ce565b8054831015612bbc5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106ce565b8060010154831115612c235760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106ce565b825f612c2e82610c84565b90505f612c3b89836149d6565b90506040518060600160405280612c4f3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061620783398151915255565b5f612cfe615596565b5f805160206161c78339815191525f612d16856132c4565b90505f80612d278360400151613f4b565b915091508015612d8c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106ce565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612dbd57612dbd615796565b6005811115612dce57612dce615796565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612e3d57612e3d615796565b1480612e5b5750600181516005811115612e5957612e59615796565b145b612eba5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106ce565b600381516005811115612ecf57612ecf615796565b03612edd5760048152612ee2565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f2757612f27615796565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612fdb57612fdb615796565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561309a575f80fd5b505af11580156130ac573d5f803e3d5ffd5b505050505050565b611d0f6001600160a01b03831682614f8c565b5f8181525f805160206161e783398151915260205260408082208151610100810190925280545f8051602061618783398151915293929190829060ff16600381111561311557613115615796565b600381111561312657613126615796565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061321a90600160a01b900461ffff1684615bfd565b6132249190615936565b905080856008015f8581526020019081526020015f205f8282546132489190615bc8565b909155505f90506132598284615e6a565b905061326985602001518261304e565b61327e8560200151610d6287606001516117e1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015613328573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261334f9190810190615d98565b91509150806133af5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106ce565b8151156134105760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106ce565b60208201516001600160a01b0316156134835760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106ce565b5092915050565b5f805f83516036146134ae5760405162461bcd60e51b81526004016106ce90615e7d565b5f805b60028110156134fd576134c5816001615e6a565b6134d0906008615bfd565b61ffff168682815181106134e6576134e6615a5c565b016020015160f81c901b91909117906001016134b1565b5061ffff8116156135205760405162461bcd60e51b81526004016106ce90615ec6565b5f805b600481101561357b57613537816003615e6a565b613542906008615bfd565b63ffffffff1687613554836002615bc8565b8151811061356457613564615a5c565b016020015160f81c901b9190911790600101613523565b5063ffffffff81166004146135a25760405162461bcd60e51b81526004016106ce90615f09565b5f805b60208110156135f7576135b981601f615e6a565b6135c4906008615bfd565b886135d0836006615bc8565b815181106135e0576135e0615a5c565b016020015160f81c901b91909117906001016135a5565b505f805b60088110156136565761360f816007615e6a565b61361a906008615bfd565b6001600160401b03168961362f836026615bc8565b8151811061363f5761363f615a5c565b016020015160f81c901b91909117906001016135fb565b505f805b60088110156136b55761366e816007615e6a565b613679906008615bfd565b6001600160401b03168a61368e83602e615bc8565b8151811061369e5761369e615a5c565b016020015160f81c901b919091179060010161365a565b5091989097509095509350505050565b5f81516026146136e75760405162461bcd60e51b81526004016106ce90615e7d565b5f805b6002811015613736576136fe816001615e6a565b613709906008615bfd565b61ffff1684828151811061371f5761371f615a5c565b016020015160f81c901b91909117906001016136ea565b5061ffff8116156137595760405162461bcd60e51b81526004016106ce90615ec6565b5f805b60048110156137b457613770816003615e6a565b61377b906008615bfd565b63ffffffff168561378d836002615bc8565b8151811061379d5761379d615a5c565b016020015160f81c901b919091179060010161375c565b5063ffffffff8116156137d95760405162461bcd60e51b81526004016106ce90615f09565b5f805b602081101561382e576137f081601f615e6a565b6137fb906008615bfd565b86613807836006615bc8565b8151811061381757613817615a5c565b016020015160f81c901b91909117906001016137dc565b50949350505050565b60605f61384683830184615a17565b61385291506058615bfd565b61385d90605c615bc8565b6001600160401b0381111561387457613874615a8e565b6040519080825280601f01601f19166020018201604052801561389e576020820181803683370190505b5090505f5b60208110156138f357833581602081106138bf576138bf615a5c565b1a60f81b8282815181106138d5576138d5615a5c565b60200101906001600160f81b03191690815f1a9053506001016138a3565b505f5b6020811015613953578360200135816020811061391557613915615a5c565b1a60f81b82613925836020615bc8565b8151811061393557613935615a5c565b60200101906001600160f81b03191690815f1a9053506001016138f6565b505f5b60048110156139b65761396a816003615e6a565b613975906008615bfd565b6014901c60f81b82613988836040615bc8565b8151811061399857613998615a5c565b60200101906001600160f81b03191690815f1a905350600101613956565b505f6139c860608501604086016159fc565b60601b90505f5b6014811015613a28578181601481106139ea576139ea615a5c565b1a60f81b836139fa836044615bc8565b81518110613a0a57613a0a615a5c565b60200101906001600160f81b03191690815f1a9053506001016139cf565b505f613a376060860186615a17565b905090505f5b6004811015613aa257613a51816003615e6a565b613a5c906008615bfd565b63ffffffff8316901c60f81b84613a74836058615bc8565b81518110613a8457613a84615a5c565b60200101906001600160f81b03191690815f1a905350600101613a3d565b505f5b613ab26060870187615a17565b9050811015613cc6575f613ac7826058615bfd565b613ad290605c615bc8565b90505f5b6020811015613b5d57613aec6060890189615a17565b84818110613afc57613afc615a5c565b9050602002810190613b0e9190615a70565b358160208110613b2057613b20615a5c565b1a60f81b86613b2f8385615bc8565b81518110613b3f57613b3f615a5c565b60200101906001600160f81b03191690815f1a905350600101613ad6565b505f5b6008811015613c1257613b74816007615e6a565b613b7f906008615bfd565b613b8c60608a018a615a17565b85818110613b9c57613b9c615a5c565b9050602002810190613bae9190615a70565b613bbf90604081019060200161577d565b6001600160401b0316901c60f81b8682613bda856020615bc8565b613be49190615bc8565b81518110613bf457613bf4615a5c565b60200101906001600160f81b03191690815f1a905350600101613b60565b505f5b6030811015613cbc57613c2b6060890189615a17565b84818110613c3b57613c3b615a5c565b9050602002810190613c4d9190615a70565b613c5b906040810190615f50565b82818110613c6b57613c6b615a5c565b9050013560f81c60f81b8682846028613c849190615bc8565b613c8e9190615bc8565b81518110613c9e57613c9e615a5c565b60200101906001600160f81b03191690815f1a905350600101613c15565b5050600101613aa5565b5091949350505050565b613cd8615596565b5f8281525f805160206162278339815191526020526040808220815160e0810190925280545f805160206161c783398151915293929190829060ff166005811115613d2557613d25615796565b6005811115613d3657613d36615796565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613da857613da8615796565b14613e045760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106ce565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e4857613e48615796565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613ef48582612813565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613f6e5760405162461bcd60e51b81526004016106ce90615e7d565b5f805b6002811015613fbd57613f85816001615e6a565b613f90906008615bfd565b61ffff16858281518110613fa657613fa6615a5c565b016020015160f81c901b9190911790600101613f71565b5061ffff811615613fe05760405162461bcd60e51b81526004016106ce90615ec6565b5f805b600481101561403b57613ff7816003615e6a565b614002906008615bfd565b63ffffffff1686614014836002615bc8565b8151811061402457614024615a5c565b016020015160f81c901b9190911790600101613fe3565b5063ffffffff81166003146140625760405162461bcd60e51b81526004016106ce90615f09565b5f805b60208110156140b75761407981601f615e6a565b614084906008615bfd565b87614090836006615bc8565b815181106140a0576140a0615a5c565b016020015160f81c901b9190911790600101614065565b505f866026815181106140cc576140cc615a5c565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206161878339815191528161410584610c84565b90505f614111876124af565b905061411c87613013565b6141795760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106ce565b60028151600581111561418e5761418e615796565b146141ed5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106ce565b5f8282608001516141fe9190615c66565b60048501546040840151919250614220916001600160401b0390911690615f92565b6001600160401b0316816001600160401b0316111561429f5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106ce565b5f806142ab8a84612813565b915091505f8a836040516020016142d992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff1916600183600381111561437457614374615796565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146144c65760405162461bcd60e51b81526004016106ce90615e7d565b5f805b6002811015614515576144dd816001615e6a565b6144e8906008615bfd565b61ffff168582815181106144fe576144fe615a5c565b016020015160f81c901b91909117906001016144c9565b5061ffff8116156145385760405162461bcd60e51b81526004016106ce90615ec6565b5f805b60048110156145935761454f816003615e6a565b61455a906008615bfd565b63ffffffff168661456c836002615bc8565b8151811061457c5761457c615a5c565b016020015160f81c901b919091179060010161453b565b5063ffffffff81166005146145ba5760405162461bcd60e51b81526004016106ce90615f09565b5f805b602081101561460f576145d181601f615e6a565b6145dc906008615bfd565b876145e8836006615bc8565b815181106145f8576145f8615a5c565b016020015160f81c901b91909117906001016145bd565b505f805b600881101561466e57614627816007615e6a565b614632906008615bfd565b6001600160401b031688614647836026615bc8565b8151811061465757614657615a5c565b016020015160f81c901b9190911790600101614613565b5090969095509350505050565b5f805160206161c78339815191525f6001600160401b0380841690851611156146af576146a8838561586d565b90506146bc565b6146b9848461586d565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061471e57506001840154815161471a916001600160401b031690615bc8565b8210155b15614744576001600160401b038316606082015281815260408101516020820152614763565b82816060018181516147569190615c66565b6001600160401b03169052505b6060810151614773906064615f92565b602082015160018601546001600160401b03929092169161479e9190600160401b900460ff16615bfd565b10156148025760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106ce565b856001600160401b03168160400181815161481d9190615bc8565b9052506040810180516001600160401b038716919061483d908390615e6a565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162278339815191526020526040812060020180545f805160206161c783398151915291600160401b9091046001600160401b03169060086148d383615fbd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661496257604051631afcd79f60e31b815260040160405180910390fd5b565b61496c614919565b6149758161501f565b61497d615038565b611fb76060820135608083013561499a60c0850160a0860161577d565b6149aa60e0860160c08701615fd8565b61ffff166149bf610100870160e08801615ff1565b6149d1610120880161010089016159fc565b615048565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16614a615760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106ce565b5f805160206161c783398151915242614a80604086016020870161577d565b6001600160401b031611614af25760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106ce565b614b02604085016020860161577d565b6001600160401b0316614b186202a30042615bc8565b11614b8b5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106ce565b8335614be35760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106ce565b83355f90815260088201602052604090205415614c535760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106ce565b6030614c626040860186615f50565b905014614cc75760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106ce565b614cd1835f61467b565b5f80614d6a6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614d15919061577d565b6001600160401b03168152602001614d3060408a018a615f50565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506152d0565b5f82815260068601602052604090209193509150614d888282616055565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614dc6908590600401615904565b6020604051808303815f875af1158015614de2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e0691906158cb565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614e7e57614e7e615796565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614f5e918e01908e0161577d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015614faf5760405163cd78605960e01b81523060048201526024016106ce565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614ff8576040519150601f19603f3d011682016040523d82523d5f602084013e614ffd565b606091505b505090508061247957604051630a12f52160e11b815260040160405180910390fd5b615027614919565b61502f6153d4565b611fb7816153dc565b615040614919565b614962615557565b615050614919565b5f80516020616187833981519152836150bc5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106ce565b6127108411156151225760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106ce565b8587111561518a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106ce565b5f8360ff16116151f75760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106ce565b600a60ff841611156152695760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106ce565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f606082608001515160301461533a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106ce565b5f806001855f0151866020015187604001518860800151896060015160405160200161536c9796959493929190616110565b604051602081830303815290604052905060028160405161538d9190615bb7565b602060405180830381855afa1580156153a8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906153cb91906158cb565b94909350915050565b614962614919565b6153e4614919565b80355f805160206161c783398151915290815560146154096060840160408501615ff1565b60ff1611156154765760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106ce565b5f6154876060840160408501615ff1565b60ff16116154ef5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106ce565b6154ff6060830160408401615ff1565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055615530604083016020840161577d565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ce2614919565b50805461556b90615cd1565b5f825580601f1061557a575050565b601f0160209004905f5260205f2090810190611fb791906155d2565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156155e6575f81556001016155d3565b5090565b8015158114611fb7575f80fd5b803563ffffffff811681146124aa575f80fd5b5f805f6060848603121561561c575f80fd5b83359250602084013561562e816155ea565b915061563c604085016155f7565b90509250925092565b5f60208284031215615655575f80fd5b5035919050565b5f610120828403121561566d575f80fd5b50919050565b803561ffff811681146124aa575f80fd5b80356001600160401b03811681146124aa575f80fd5b5f805f606084860312156156ac575f80fd5b83356001600160401b038111156156c1575f80fd5b8401606081870312156156d2575f80fd5b92506156e060208501615673565b915061563c60408501615684565b5f602082840312156156fe575f80fd5b610cc7826155f7565b5f8060408385031215615718575f80fd5b615721836155f7565b946020939093013593505050565b5f8060408385031215615740575f80fd5b82356001600160401b03811115615755575f80fd5b830160808186031215615766575f80fd5b9150615774602084016155f7565b90509250929050565b5f6020828403121561578d575f80fd5b610cc782615684565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106157cd57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161580860608401826001600160401b03169052565b50608083015161582360808401826001600160401b03169052565b5060a083015161583e60a08401826001600160401b03169052565b5060c083015161348360c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561348357613483615859565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f602082840312156158db575f80fd5b5051919050565b5f5b838110156158fc5781810151838201526020016158e4565b50505f910152565b602081525f82518060208401526159228160408501602087016158e2565b601f01601f19169190910160400192915050565b5f8261595057634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114611fb7575f80fd5b5f60208284031215615a0c575f80fd5b8135610cc7816159e8565b5f808335601e19843603018112615a2c575f80fd5b8301803591506001600160401b03821115615a45575f80fd5b6020019150600581901b3603821315612963575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615a84575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615ac457615ac4615a8e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615af257615af2615a8e565b604052919050565b5f6001600160401b03821115615b1257615b12615a8e565b50601f01601f191660200190565b5f60608236031215615b30575f80fd5b615b38615aa2565b823581526020615b49818501615684565b8183015260408401356001600160401b03811115615b65575f80fd5b840136601f820112615b75575f80fd5b8035615b88615b8382615afa565b615aca565b8181523684838501011115615b9b575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615a848184602087016158e2565b80820180821115610c9457610c94615859565b5f63ffffffff808316818103615bf357615bf3615859565b6001019392505050565b8082028115828204841417610c9457610c94615859565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561348357613483615859565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615ce557607f821691505b60208210810361566d57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615d1581615cd1565b806020870152604060018084165f8114615d365760018114615d5257615d7f565b60ff19851660408a0152604084151560051b8a01019550615d7f565b895f5260205f205f5b85811015615d765781548b8201860152908301908801615d5b565b8a016040019650505b509398975050505050505050565b80516124aa816155ea565b5f8060408385031215615da9575f80fd5b82516001600160401b0380821115615dbf575f80fd5b9084019060608287031215615dd2575f80fd5b615dda615aa2565b82518152602080840151615ded816159e8565b82820152604084015183811115615e02575f80fd5b80850194505087601f850112615e16575f80fd5b83519250615e26615b8384615afa565b8381528882858701011115615e39575f80fd5b615e48848383018488016158e2565b80604084015250819550615e5d818801615d8d565b9450505050509250929050565b81810381811115610c9457610c94615859565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615f65575f80fd5b8301803591506001600160401b03821115615f7e575f80fd5b602001915036819003821315612963575f80fd5b6001600160401b03818116838216028082169190828114615fb557615fb5615859565b505092915050565b5f6001600160401b03808316818103615bf357615bf3615859565b5f60208284031215615fe8575f80fd5b610cc782615673565b5f60208284031215616001575f80fd5b813560ff81168114610cc7575f80fd5b601f82111561247957805f5260205f20601f840160051c810160208510156160365750805b601f840160051c820191505b81811015610d67575f8155600101616042565b81516001600160401b0381111561606e5761606e615a8e565b6160828161607c8454615cd1565b84616011565b602080601f8311600181146160b5575f841561609e5750858301515b5f19600386901b1c1916600185901b1785556130ac565b5f85815260208120601f198616915b828110156160e3578886015182559484019460019091019084016160c4565b508582101561610057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161616581604e8601602089016158e2565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161641238038061641283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162c58061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d836600461567c565b61058b565b005b3480156101ea575f80fd5b506101dd6101f93660046156b7565b6109ee565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd6102433660046156ce565b610ba7565b348015610253575f80fd5b506102676102623660046156b7565b610c84565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e736600461570c565b610c9a565b604051908152602001610220565b348015610305575f80fd5b506101dd610314366004615760565b610cce565b348015610324575f80fd5b506101dd610333366004615779565b610d6e565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b3660046157a1565b6111fe565b34801561038b575f80fd5b506102ec61039a3660046157ef565b6117e1565b3480156103aa575f80fd5b506102676103b93660046156b7565b6117fa565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb36600461567c565b61180e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e3660046156b7565b611a2a565b34801561042e575f80fd5b506101dd61043d366004615779565b611b30565b34801561044d575f80fd5b506101dd61045c3660046156b7565b611d13565b34801561046c575f80fd5b506101dd61047b366004615760565b61202c565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b43660046156b7565b6121a2565b3480156104c4575f80fd5b506101dd6104d33660046156b7565b612415565b6102ec6104e63660046156b7565b6124f0565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e6105193660046156b7565b612521565b604051610220919061581c565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b3660046156b7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f8051602061625983398151915260205260408082208151610100810190925280545f805160206161f983398151915293929190829060ff1660038111156105d9576105d9615808565b60038111156105ea576105ea615808565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61066e82612521565b905060028351600381111561068557610685615808565b146106d75760405162461bcd60e51b815260206004820152602a60248201525f805160206162198339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461073c5760405162461bcd60e51b815260206004820152603360248201525f805160206162198339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106ce565b6003835280515f90600290600581111561075857610758615808565b036107af5786156107705761076d83876125e9565b90505b5f8460600151836080015161078591906158df565b90506107918482612885565b506001600160401b0390811660e0870152421660a0860152506107e3565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561081686606001516117e1565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b815260040161084a97969594939291906158ff565b602060405180830381865afa158015610865573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610889919061593d565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360038111156108c8576108c8615808565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109dc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206162998339815191526020526040808220815160e0810190925280545f8051602061623983398151915293929190829060ff166005811115610a3b57610a3b615808565b6005811115610a4c57610a4c615808565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abb57610abb615808565b14610b205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb610b458584606001515f6129dc565b6040518263ffffffff1660e01b8152600401610b619190615976565b6020604051808303815f875af1158015610b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba1919061593d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c3883612a2b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9464e8d4a51000836159a8565b92915050565b5f610ca3612a3c565b610caf84848434612a73565b9050610cc760015f8051602061627983398151915255565b9392505050565b5f805160206161f98339815191525f80610ce784612d67565b91509150610cf482613085565b610cfe5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d2c57610d2c615808565b03610d51575f83815260088501602052604081208054919055610d4f82826130c0565b505b610d6781610d6284604001516117e1565b613126565b5050505050565b5f8181525f8051602061625983398151915260205260408082208151610100810190925280545f805160206161f983398151915293929190829060ff166003811115610dbc57610dbc615808565b6003811115610dcd57610dcd615808565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e5290612521565b9050600182516003811115610e6957610e69615808565b14610ed25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106ce565b600381516005811115610ee757610ee7615808565b0361105f57600380835260c0820180516001600160401b0390811660808601529051811660a085015260608301511660e08401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610f4b57610f4b615808565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b60048151600581111561107457611074615808565b0361108257610d6784613139565b5f61108c86613336565b90505f8061109d83604001516134fc565b5091509150818560400151146110c55760405162461bcd60e51b81526004016106ce906159c7565b806001600160401b031684606001516001600160401b031610156111365760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106ce565b806001600160401b03168560c001516001600160401b0316111561116c5760405162461bcd60e51b81526004016106ce90615a11565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206162398339815191529060ff161561129b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611302919061593d565b8360200135146113645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106ce565b306113756060850160408601615a6e565b6001600160a01b0316146113e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106ce565b5f6113f56060850185615a89565b905090505f805b828163ffffffff1610156116e5575f6114186060880188615a89565b8363ffffffff1681811061142e5761142e615ace565b90506020028101906114409190615ae2565b61144990615b92565b80515f81815260088801602052604090205491925090156114c15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106ce565b5f6002895f0135856040516020016114f092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150a91615c29565b602060405180830381855afa158015611525573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611548919061593d565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d4576115d4615808565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611687911686615c3a565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116de90615c4d565b90506113fc565b50600483018190555f6116f785613336565b90505f6117078260400151613737565b90505f611713886138a9565b9050816002826040516117269190615c29565b602060405180830381855afa158015611741573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611764919061593d565b146117c85760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106ce565b5050506009909201805460ff1916600117905550505050565b5f610c946001600160401b03831664e8d4a51000615c6f565b5f61180482612521565b6080015192915050565b5f805160206161f98339815191525f61182685613d42565b905061183185613085565b61183c575050505050565b5f8581526005830160205260409020546001600160a01b031633146118735760405162461bcd60e51b81526004016106ce90615c86565b5f85815260058301602052604090205460a08201516118a291600160b01b90046001600160401b031690615cd8565b6001600160401b03168160c001516001600160401b031610156119235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106ce565b8315610d67575f61193486856125e9565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198b906117e1565b60a085015160c08601516040516001600160e01b031960e086901b1681526119bf939291829188905f9081906004016158ff565b602060405180830381865afa1580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe919061593d565b5f87815260088501602052604081208054909190611a1d908490615c3a565b9091555050505050505050565b5f805160206161f98339815191525f611a4283612521565b9050600481516005811115611a5957611a59615808565b14611ac35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106ce565b5f8381526005830160205260409020546001600160a01b03163314611afa5760405162461bcd60e51b81526004016106ce90615c86565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba1906001600160a01b0316826130c0565b611b38612a3c565b5f8181525f8051602061625983398151915260205260408082208151610100810190925280545f805160206161f983398151915293929190829060ff166003811115611b8657611b86615808565b6003811115611b9757611b97615808565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c1385613336565b90505f80611c2483604001516134fc565b509150915081846040015114611c4c5760405162461bcd60e51b81526004016106ce906159c7565b806001600160401b03168460e001516001600160401b03161115611c825760405162461bcd60e51b81526004016106ce90615a11565b600384516003811115611c9757611c97615808565b14611ceb5760405162461bcd60e51b815260206004820152603160248201525f805160206162198339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106ce565b611cf486613139565b5050505050611d0f60015f8051602061627983398151915255565b5050565b611d1b612a3c565b5f8181525f8051602061625983398151915260205260408082208151610100810190925280545f805160206161f983398151915293929190829060ff166003811115611d6957611d69615808565b6003811115611d7a57611d7a615808565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611dfe82612521565b90505f83516003811115611e1457611e14615808565b03611e725760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152671bdd08199bdd5b9960c21b60648201526084016106ce565b600481516005811115611e8757611e87615808565b14611eea5760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106ce565b600183516003811115611eff57611eff615808565b03611f1657611f0d85613139565b50505050612013565b600283516003811115611f2b57611f2b615808565b03612005578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611f6385606001516117e1565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611fb596959493926001600160401b03909216919081906004016158ff565b602060405180830381865afa158015611fd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff4919061593d565b5f8681526007860160205260409020555b61200e85613139565b505050505b61202960015f8051602061627983398151915255565b50565b5f805160206162398339815191525f61204483613336565b90505f806120558360400151613fbd565b91509150806120b75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106ce565b60015f83815260078601602052604090205460ff1660058111156120dd576120dd615808565b146120fa5760405162461bcd60e51b81526004016106ce90615cf8565b5f8281526006850160205260408120612112916155d1565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061625983398151915260205260408082208151610100810190925280545f805160206161f983398151915293929190829060ff1660038111156121f0576121f0615808565b600381111561220157612201615808565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600381111561228857612288615808565b14806122a657506003815160038111156122a4576122a4615808565b145b6122fa5760405162461bcd60e51b815260206004820152603260248201525f80516020616219833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106ce565b5f6123088260400151612521565b905080606001516001600160401b03165f0361238c5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb6123b98460400151846060015185608001516129dc565b6040518263ffffffff1660e01b81526004016123d59190615976565b6020604051808303815f875af11580156123f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d67919061593d565b5f8181525f8051602061629983398151915260205260409020545f805160206162398339815191529060019060ff16600581111561245557612455615808565b146124725760405162461bcd60e51b81526004016106ce90615cf8565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916124ab9190600401615d75565b6020604051808303815f875af11580156124c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124eb919061593d565b505050565b5f6124f9612a3c565b61250482333461415e565b905061251c60015f8051602061627983398151915255565b919050565b612529615608565b5f8281525f80516020616299833981519152602052604090819020815160e0810190925280545f80516020616239833981519152929190829060ff16600581111561257657612576615808565b600581111561258757612587615808565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612634573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261265b9190810190615e0a565b91509150806126be5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612701573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612725919061593d565b8251146127895760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106ce565b60208201516001600160a01b0316156127ff5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106ce565b5f8061280e8460400151614515565b9150915081871461287b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106ce565b9695505050505050565b5f8281525f80516020616299833981519152602052604081206002015481905f8051602061623983398151915290600160801b90046001600160401b03166128cd85826146ed565b5f6128d7876148fb565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129278a858b6129dc565b6040518263ffffffff1660e01b81526004016129439190615976565b6020604051808303815f875af115801561295f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612983919061593d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612a3361498b565b612029816149d6565b5f80516020616279833981519152805460011901612a6d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206161f98339815191529061ffff86161015612afa5760405162461bcd60e51b815260206004820152602b60248201525f8051602061621983398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106ce565b61271061ffff86161115612b525760405162461bcd60e51b815260206004820152602c60248201525f8051602061621983398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106ce565b60028101546001600160401b039081169085161015612bcb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106ce565b8054831015612c2e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106ce565b8060010154831115612c955760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106ce565b825f612ca082610c84565b90505f612cad8983614a48565b90506040518060600160405280612cc13390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061627983398151915255565b5f612d70615608565b5f805160206162398339815191525f612d8885613336565b90505f80612d998360400151613fbd565b915091508015612dfe5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106ce565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612e2f57612e2f615808565b6005811115612e4057612e40615808565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612eaf57612eaf615808565b1480612ecd5750600181516005811115612ecb57612ecb615808565b145b612f2c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106ce565b600381516005811115612f4157612f41615808565b03612f4f5760048152612f54565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f9957612f99615808565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561304d5761304d615808565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561310c575f80fd5b505af115801561311e573d5f803e3d5ffd5b505050505050565b611d0f6001600160a01b03831682614ffe565b5f8181525f8051602061625983398151915260205260408082208151610100810190925280545f805160206161f983398151915293929190829060ff16600381111561318757613187615808565b600381111561319857613198615808565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061328c90600160a01b900461ffff1684615c6f565b61329691906159a8565b905080856008015f8581526020019081526020015f205f8282546132ba9190615c3a565b909155505f90506132cb8284615edc565b90506132db8560200151826130c0565b6132f08560200151610d6287606001516117e1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561339a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526133c19190810190615e0a565b91509150806134215760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106ce565b8151156134825760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106ce565b60208201516001600160a01b0316156134f55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106ce565b5092915050565b5f805f83516036146135205760405162461bcd60e51b81526004016106ce90615eef565b5f805b600281101561356f57613537816001615edc565b613542906008615c6f565b61ffff1686828151811061355857613558615ace565b016020015160f81c901b9190911790600101613523565b5061ffff8116156135925760405162461bcd60e51b81526004016106ce90615f38565b5f805b60048110156135ed576135a9816003615edc565b6135b4906008615c6f565b63ffffffff16876135c6836002615c3a565b815181106135d6576135d6615ace565b016020015160f81c901b9190911790600101613595565b5063ffffffff81166004146136145760405162461bcd60e51b81526004016106ce90615f7b565b5f805b60208110156136695761362b81601f615edc565b613636906008615c6f565b88613642836006615c3a565b8151811061365257613652615ace565b016020015160f81c901b9190911790600101613617565b505f805b60088110156136c857613681816007615edc565b61368c906008615c6f565b6001600160401b0316896136a1836026615c3a565b815181106136b1576136b1615ace565b016020015160f81c901b919091179060010161366d565b505f805b6008811015613727576136e0816007615edc565b6136eb906008615c6f565b6001600160401b03168a61370083602e615c3a565b8151811061371057613710615ace565b016020015160f81c901b91909117906001016136cc565b5091989097509095509350505050565b5f81516026146137595760405162461bcd60e51b81526004016106ce90615eef565b5f805b60028110156137a857613770816001615edc565b61377b906008615c6f565b61ffff1684828151811061379157613791615ace565b016020015160f81c901b919091179060010161375c565b5061ffff8116156137cb5760405162461bcd60e51b81526004016106ce90615f38565b5f805b6004811015613826576137e2816003615edc565b6137ed906008615c6f565b63ffffffff16856137ff836002615c3a565b8151811061380f5761380f615ace565b016020015160f81c901b91909117906001016137ce565b5063ffffffff81161561384b5760405162461bcd60e51b81526004016106ce90615f7b565b5f805b60208110156138a05761386281601f615edc565b61386d906008615c6f565b86613879836006615c3a565b8151811061388957613889615ace565b016020015160f81c901b919091179060010161384e565b50949350505050565b60605f6138b883830184615a89565b6138c491506058615c6f565b6138cf90605c615c3a565b6001600160401b038111156138e6576138e6615b00565b6040519080825280601f01601f191660200182016040528015613910576020820181803683370190505b5090505f5b6020811015613965578335816020811061393157613931615ace565b1a60f81b82828151811061394757613947615ace565b60200101906001600160f81b03191690815f1a905350600101613915565b505f5b60208110156139c5578360200135816020811061398757613987615ace565b1a60f81b82613997836020615c3a565b815181106139a7576139a7615ace565b60200101906001600160f81b03191690815f1a905350600101613968565b505f5b6004811015613a28576139dc816003615edc565b6139e7906008615c6f565b6014901c60f81b826139fa836040615c3a565b81518110613a0a57613a0a615ace565b60200101906001600160f81b03191690815f1a9053506001016139c8565b505f613a3a6060850160408601615a6e565b60601b90505f5b6014811015613a9a57818160148110613a5c57613a5c615ace565b1a60f81b83613a6c836044615c3a565b81518110613a7c57613a7c615ace565b60200101906001600160f81b03191690815f1a905350600101613a41565b505f613aa96060860186615a89565b905090505f5b6004811015613b1457613ac3816003615edc565b613ace906008615c6f565b63ffffffff8316901c60f81b84613ae6836058615c3a565b81518110613af657613af6615ace565b60200101906001600160f81b03191690815f1a905350600101613aaf565b505f5b613b246060870187615a89565b9050811015613d38575f613b39826058615c6f565b613b4490605c615c3a565b90505f5b6020811015613bcf57613b5e6060890189615a89565b84818110613b6e57613b6e615ace565b9050602002810190613b809190615ae2565b358160208110613b9257613b92615ace565b1a60f81b86613ba18385615c3a565b81518110613bb157613bb1615ace565b60200101906001600160f81b03191690815f1a905350600101613b48565b505f5b6008811015613c8457613be6816007615edc565b613bf1906008615c6f565b613bfe60608a018a615a89565b85818110613c0e57613c0e615ace565b9050602002810190613c209190615ae2565b613c319060408101906020016157ef565b6001600160401b0316901c60f81b8682613c4c856020615c3a565b613c569190615c3a565b81518110613c6657613c66615ace565b60200101906001600160f81b03191690815f1a905350600101613bd2565b505f5b6030811015613d2e57613c9d6060890189615a89565b84818110613cad57613cad615ace565b9050602002810190613cbf9190615ae2565b613ccd906040810190615fc2565b82818110613cdd57613cdd615ace565b9050013560f81c60f81b8682846028613cf69190615c3a565b613d009190615c3a565b81518110613d1057613d10615ace565b60200101906001600160f81b03191690815f1a905350600101613c87565b5050600101613b17565b5091949350505050565b613d4a615608565b5f8281525f805160206162998339815191526020526040808220815160e0810190925280545f8051602061623983398151915293929190829060ff166005811115613d9757613d97615808565b6005811115613da857613da8615808565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e1a57613e1a615808565b14613e765760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106ce565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613eba57613eba615808565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f668582612885565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613fe05760405162461bcd60e51b81526004016106ce90615eef565b5f805b600281101561402f57613ff7816001615edc565b614002906008615c6f565b61ffff1685828151811061401857614018615ace565b016020015160f81c901b9190911790600101613fe3565b5061ffff8116156140525760405162461bcd60e51b81526004016106ce90615f38565b5f805b60048110156140ad57614069816003615edc565b614074906008615c6f565b63ffffffff1686614086836002615c3a565b8151811061409657614096615ace565b016020015160f81c901b9190911790600101614055565b5063ffffffff81166003146140d45760405162461bcd60e51b81526004016106ce90615f7b565b5f805b6020811015614129576140eb81601f615edc565b6140f6906008615c6f565b87614102836006615c3a565b8151811061411257614112615ace565b016020015160f81c901b91909117906001016140d7565b505f8660268151811061413e5761413e615ace565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206161f98339815191528161417784610c84565b90505f61418387612521565b905061418e87613085565b6141eb5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106ce565b60028151600581111561420057614200615808565b1461425f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106ce565b5f8282608001516142709190615cd8565b60048501546040840151919250614292916001600160401b0390911690616004565b6001600160401b0316816001600160401b031611156143115760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106ce565b5f8061431d8a84612885565b915091505f8a8360405160200161434b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360038111156143e6576143e6615808565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146145385760405162461bcd60e51b81526004016106ce90615eef565b5f805b60028110156145875761454f816001615edc565b61455a906008615c6f565b61ffff1685828151811061457057614570615ace565b016020015160f81c901b919091179060010161453b565b5061ffff8116156145aa5760405162461bcd60e51b81526004016106ce90615f38565b5f805b6004811015614605576145c1816003615edc565b6145cc906008615c6f565b63ffffffff16866145de836002615c3a565b815181106145ee576145ee615ace565b016020015160f81c901b91909117906001016145ad565b5063ffffffff811660051461462c5760405162461bcd60e51b81526004016106ce90615f7b565b5f805b60208110156146815761464381601f615edc565b61464e906008615c6f565b8761465a836006615c3a565b8151811061466a5761466a615ace565b016020015160f81c901b919091179060010161462f565b505f805b60088110156146e057614699816007615edc565b6146a4906008615c6f565b6001600160401b0316886146b9836026615c3a565b815181106146c9576146c9615ace565b016020015160f81c901b9190911790600101614685565b5090969095509350505050565b5f805160206162398339815191525f6001600160401b0380841690851611156147215761471a83856158df565b905061472e565b61472b84846158df565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061479057506001840154815161478c916001600160401b031690615c3a565b8210155b156147b6576001600160401b0383166060820152818152604081015160208201526147d5565b82816060018181516147c89190615cd8565b6001600160401b03169052505b60608101516147e5906064616004565b602082015160018601546001600160401b0392909216916148109190600160401b900460ff16615c6f565b10156148745760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106ce565b856001600160401b03168160400181815161488f9190615c3a565b9052506040810180516001600160401b03871691906148af908390615edc565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162998339815191526020526040812060020180545f8051602061623983398151915291600160401b9091046001600160401b03169060086149458361602f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166149d457604051631afcd79f60e31b815260040160405180910390fd5b565b6149de61498b565b6149e781615091565b6149ef6150aa565b61202960608201356080830135614a0c60c0850160a086016157ef565b614a1c60e0860160c0870161604a565b61ffff16614a31610100870160e08801616063565b614a4361012088016101008901615a6e565b6150ba565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16614ad35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106ce565b5f8051602061623983398151915242614af260408601602087016157ef565b6001600160401b031611614b645760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106ce565b614b7460408501602086016157ef565b6001600160401b0316614b8a6202a30042615c3a565b11614bfd5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106ce565b8335614c555760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106ce565b83355f90815260088201602052604090205415614cc55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106ce565b6030614cd46040860186615fc2565b905014614d395760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106ce565b614d43835f6146ed565b5f80614ddc6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614d8791906157ef565b6001600160401b03168152602001614da260408a018a615fc2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250615342565b5f82815260068601602052604090209193509150614dfa82826160c7565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614e38908590600401615976565b6020604051808303815f875af1158015614e54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e78919061593d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614ef057614ef0615808565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614fd0918e01908e016157ef565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156150215760405163cd78605960e01b81523060048201526024016106ce565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461506a576040519150601f19603f3d011682016040523d82523d5f602084013e61506f565b606091505b50509050806124eb57604051630a12f52160e11b815260040160405180910390fd5b61509961498b565b6150a1615446565b6120298161544e565b6150b261498b565b6149d46155c9565b6150c261498b565b5f805160206161f98339815191528361512e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106ce565b6127108411156151945760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106ce565b858711156151fc5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106ce565b5f8360ff16116152695760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106ce565b600a60ff841611156152db5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106ce565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146153ac5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106ce565b5f806001855f015186602001518760400151886080015189606001516040516020016153de9796959493929190616182565b60405160208183030381529060405290506002816040516153ff9190615c29565b602060405180830381855afa15801561541a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061543d919061593d565b94909350915050565b6149d461498b565b61545661498b565b80355f80516020616239833981519152908155601461547b6060840160408501616063565b60ff1611156154e85760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106ce565b5f6154f96060840160408501616063565b60ff16116155615760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106ce565b6155716060830160408401616063565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556155a260408301602084016157ef565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d5461498b565b5080546155dd90615d43565b5f825580601f106155ec575050565b601f0160209004905f5260205f20908101906120299190615644565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615658575f8155600101615645565b5090565b8015158114612029575f80fd5b803563ffffffff8116811461251c575f80fd5b5f805f6060848603121561568e575f80fd5b8335925060208401356156a08161565c565b91506156ae60408501615669565b90509250925092565b5f602082840312156156c7575f80fd5b5035919050565b5f61012082840312156156df575f80fd5b50919050565b803561ffff8116811461251c575f80fd5b80356001600160401b038116811461251c575f80fd5b5f805f6060848603121561571e575f80fd5b83356001600160401b03811115615733575f80fd5b840160608187031215615744575f80fd5b9250615752602085016156e5565b91506156ae604085016156f6565b5f60208284031215615770575f80fd5b610cc782615669565b5f806040838503121561578a575f80fd5b61579383615669565b946020939093013593505050565b5f80604083850312156157b2575f80fd5b82356001600160401b038111156157c7575f80fd5b8301608081860312156157d8575f80fd5b91506157e660208401615669565b90509250929050565b5f602082840312156157ff575f80fd5b610cc7826156f6565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061583f57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161587a60608401826001600160401b03169052565b50608083015161589560808401826001600160401b03169052565b5060a08301516158b060a08401826001600160401b03169052565b5060c08301516134f560c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156134f5576134f56158cb565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f6020828403121561594d575f80fd5b5051919050565b5f5b8381101561596e578181015183820152602001615956565b50505f910152565b602081525f8251806020840152615994816040850160208701615954565b601f01601f19169190910160400192915050565b5f826159c257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612029575f80fd5b5f60208284031215615a7e575f80fd5b8135610cc781615a5a565b5f808335601e19843603018112615a9e575f80fd5b8301803591506001600160401b03821115615ab7575f80fd5b6020019150600581901b36038213156129d5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615af6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b3657615b36615b00565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615b6457615b64615b00565b604052919050565b5f6001600160401b03821115615b8457615b84615b00565b50601f01601f191660200190565b5f60608236031215615ba2575f80fd5b615baa615b14565b823581526020615bbb8185016156f6565b8183015260408401356001600160401b03811115615bd7575f80fd5b840136601f820112615be7575f80fd5b8035615bfa615bf582615b6c565b615b3c565b8181523684838501011115615c0d575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615af6818460208701615954565b80820180821115610c9457610c946158cb565b5f63ffffffff808316818103615c6557615c656158cb565b6001019392505050565b8082028115828204841417610c9457610c946158cb565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156134f5576134f56158cb565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615d5757607f821691505b6020821081036156df57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615d8781615d43565b806020870152604060018084165f8114615da85760018114615dc457615df1565b60ff19851660408a0152604084151560051b8a01019550615df1565b895f5260205f205f5b85811015615de85781548b8201860152908301908801615dcd565b8a016040019650505b509398975050505050505050565b805161251c8161565c565b5f8060408385031215615e1b575f80fd5b82516001600160401b0380821115615e31575f80fd5b9084019060608287031215615e44575f80fd5b615e4c615b14565b82518152602080840151615e5f81615a5a565b82820152604084015183811115615e74575f80fd5b80850194505087601f850112615e88575f80fd5b83519250615e98615bf584615b6c565b8381528882858701011115615eab575f80fd5b615eba84838301848801615954565b80604084015250819550615ecf818801615dff565b9450505050509250929050565b81810381811115610c9457610c946158cb565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615fd7575f80fd5b8301803591506001600160401b03821115615ff0575f80fd5b6020019150368190038213156129d5575f80fd5b6001600160401b03818116838216028082169190828114616027576160276158cb565b505092915050565b5f6001600160401b03808316818103615c6557615c656158cb565b5f6020828403121561605a575f80fd5b610cc7826156e5565b5f60208284031215616073575f80fd5b813560ff81168114610cc7575f80fd5b601f8211156124eb57805f5260205f20601f840160051c810160208510156160a85750805b601f840160051c820191505b81811015610d67575f81556001016160b4565b81516001600160401b038111156160e0576160e0615b00565b6160f4816160ee8454615d43565b84616083565b602080601f831160018114616127575f84156161105750858301515b5f19600386901b1c1916600185901b17855561311e565b5f85815260208120601f198616915b8281101561615557888601518255948401946001909101908401616136565b508582101561617257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516161d781604e860160208901615954565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 3a2fed04a..cf5fdf4f6 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -429,6 +429,11 @@ abstract contract PoSValidatorManager is bytes32 validationID = delegator.validationID; Validator memory validator = getValidator(validationID); + // Ensure the validation is completed + require( + delegator.status != DelegatorStatus.Unknown, "PoSValidatorManager: delegator not found" + ); + // Ensure the validation is completed require( validator.status == ValidatorStatus.Completed, From d9b18da3b65707f1db80b17ad30b60e81a962508 Mon Sep 17 00:00:00 2001 From: Michael Kaplan Date: Fri, 20 Sep 2024 16:50:11 -0400 Subject: [PATCH 395/545] pre-increment --- contracts/validator-manager/ValidatorManager.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 2b07b5bbc..7f94d6c91 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -428,8 +428,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida function _incrementAndGetNonce(bytes32 validationID) internal returns (uint64) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); - $._validationPeriods[validationID].messageNonce++; - return $._validationPeriods[validationID].messageNonce; + return ++$._validationPeriods[validationID].messageNonce; } function _getPChainWarpMessage(uint32 messageIndex) From 0eaeea883ecfffc304b0aefa95457150d6e98ae5 Mon Sep 17 00:00:00 2001 From: Michael Kaplan Date: Fri, 20 Sep 2024 16:59:41 -0400 Subject: [PATCH 396/545] Fix abi bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager/PoAValidatorManager.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 28cd3a753..a4780cb51 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161674838038061674883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6165fb8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd366004615915565b61043a565b005b6101d26101e2366004615950565b61089d565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b610219610214366004615950565b610a56565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004615967565b610a6c565b6101d261026e366004615980565b610b0c565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e3660046159a8565b610f9c565b6102b66102b1366004615a0c565b61157f565b6040519081526020016101fd565b6102196102d2366004615950565b611598565b6102b65f81565b6101d26102ec366004615915565b6115ac565b6101ef603081565b6101d2610307366004615950565b6117c8565b6101d261031a366004615980565b6118ce565b6101d261032d366004615950565b611ab1565b6102b6610340366004615a25565b611dca565b6101d2610353366004615967565b611df6565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c366004615950565b611f6c565b6101d261039f366004615950565b6121df565b6101ef601481565b6103bf6103ba366004615950565b6122ba565b6040516101fd9190615a59565b6102196202a30081565b6102b66103e4366004615950565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615b19565b612382565b6101d2610435366004615b92565b6123b7565b5f8381525f8051602061658f83398151915260205260408082208151610100810190925280545f8051602061652f83398151915293929190829060ff16600381111561048857610488615a45565b600381111561049957610499615a45565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61051d826122ba565b905060028351600381111561053457610534615a45565b146105865760405162461bcd60e51b815260206004820152602a60248201525f8051602061654f8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105eb5760405162461bcd60e51b815260206004820152603360248201525f8051602061654f8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161057d565b6003835280515f90600290600581111561060757610607615a45565b0361065e57861561061f5761061c8387612496565b90505b5f846060015183608001516106349190615be4565b90506106408482612732565b506001600160401b0390811660e0870152421660a086015250610692565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106c5866060015161157f565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b81526004016106f99796959493929190615c04565b602060405180830381865afa158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190615c42565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600381111561077757610777615a45565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088b916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206165cf8339815191526020526040808220815160e0810190925280545f8051602061656f83398151915293929190829060ff1660058111156108ea576108ea615a45565b60058111156108fb576108fb615a45565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096a5761096a615a45565b146109cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb6109f48584606001515f612889565b6040518263ffffffff1660e01b8152600401610a109190615c7b565b6020604051808303815f875af1158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190615c42565b50505050565b5f610a6664e8d4a5100083615cad565b92915050565b5f8051602061652f8339815191525f80610a85846128e0565b91509150610a9282612bfe565b610a9c5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610aca57610aca615a45565b03610aef575f83815260088501602052604081208054919055610aed8282612c39565b505b610b0581610b00846040015161157f565b612caf565b5050505050565b5f8181525f8051602061658f83398151915260205260408082208151610100810190925280545f8051602061652f83398151915293929190829060ff166003811115610b5a57610b5a615a45565b6003811115610b6b57610b6b615a45565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf0906122ba565b9050600182516003811115610c0757610c07615a45565b14610c705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161057d565b600381516005811115610c8557610c85615a45565b03610dfd57600380835260c0820180516001600160401b0390811660808601529051811660a085015260608301511660e08401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610ce957610ce9615a45565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1257610e12615a45565b03610e2057610b0584612cd2565b5f610e2a86612ecf565b90505f80610e3b8360400151613095565b509150915081856040015114610e635760405162461bcd60e51b815260040161057d90615ccc565b806001600160401b031684606001516001600160401b03161015610ed45760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161057d565b806001600160401b03168560c001516001600160401b03161115610f0a5760405162461bcd60e51b815260040161057d90615d16565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061656f8339815191529060ff16156110395760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a09190615c42565b8360200135146111025760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161057d565b306111136060850160408601615d5f565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161057d565b5f6111936060850185615d7a565b905090505f805b828163ffffffff161015611483575f6111b66060880188615d7a565b8363ffffffff168181106111cc576111cc615dbf565b90506020028101906111de9190615dd3565b6111e790615e83565b80515f818152600888016020526040902054919250901561125f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161057d565b5f6002895f01358560405160200161128e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a891615f1a565b602060405180830381855afa1580156112c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e69190615c42565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561137257611372615a45565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611425911686615f2b565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147c90615f3e565b905061119a565b50600483018190555f61149585612ecf565b90505f6114a582604001516132d0565b90505f6114b188613442565b9050816002826040516114c49190615f1a565b602060405180830381855afa1580156114df573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115029190615c42565b146115665760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161057d565b5050506009909201805460ff1916600117905550505050565b5f610a666001600160401b03831664e8d4a51000615f60565b5f6115a2826122ba565b6080015192915050565b5f8051602061652f8339815191525f6115c4856138db565b90506115cf85612bfe565b6115da575050505050565b5f8581526005830160205260409020546001600160a01b031633146116115760405162461bcd60e51b815260040161057d90615f77565b5f85815260058301602052604090205460a082015161164091600160b01b90046001600160401b031690615fc9565b6001600160401b03168160c001516001600160401b031610156116c15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161057d565b8315610b05575f6116d28685612496565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117299061157f565b60a085015160c08601516040516001600160e01b031960e086901b16815261175d939291829188905f908190600401615c04565b602060405180830381865afa158015611778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c9190615c42565b5f878152600885016020526040812080549091906117bb908490615f2b565b9091555050505050505050565b5f8051602061652f8339815191525f6117e0836122ba565b90506004815160058111156117f7576117f7615a45565b146118615760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161057d565b5f8381526005830160205260409020546001600160a01b031633146118985760405162461bcd60e51b815260040161057d90615f77565b5f83815260088301602090815260408083208054908490556005860190925290912054610a50906001600160a01b031682612c39565b6118d6613b56565b5f8181525f8051602061658f83398151915260205260408082208151610100810190925280545f8051602061652f83398151915293929190829060ff16600381111561192457611924615a45565b600381111561193557611935615a45565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119b185612ecf565b90505f806119c28360400151613095565b5091509150818460400151146119ea5760405162461bcd60e51b815260040161057d90615ccc565b806001600160401b03168460e001516001600160401b03161115611a205760405162461bcd60e51b815260040161057d90615d16565b600384516003811115611a3557611a35615a45565b14611a895760405162461bcd60e51b815260206004820152603160248201525f8051602061654f8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161057d565b611a9286612cd2565b5050505050611aad60015f805160206165af83398151915255565b5050565b611ab9613b56565b5f8181525f8051602061658f83398151915260205260408082208151610100810190925280545f8051602061652f83398151915293929190829060ff166003811115611b0757611b07615a45565b6003811115611b1857611b18615a45565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611b9c826122ba565b90505f83516003811115611bb257611bb2615a45565b03611c105760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152671bdd08199bdd5b9960c21b606482015260840161057d565b600481516005811115611c2557611c25615a45565b14611c885760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161057d565b600183516003811115611c9d57611c9d615a45565b03611cb457611cab85612cd2565b50505050611db1565b600283516003811115611cc957611cc9615a45565b03611da3578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611d01856060015161157f565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611d5396959493926001600160401b0390921691908190600401615c04565b602060405180830381865afa158015611d6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d929190615c42565b5f8681526007860160205260409020555b611dac85612cd2565b505050505b611dc760015f805160206165af83398151915255565b50565b5f611dd3613b56565b611dde833384613ba0565b9050610a6660015f805160206165af83398151915255565b5f8051602061656f8339815191525f611e0e83612ecf565b90505f80611e1f8360400151613f5a565b9150915080611e815760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057d565b60015f83815260078601602052604090205460ff166005811115611ea757611ea7615a45565b14611ec45760405162461bcd60e51b815260040161057d90615fe9565b5f8281526006850160205260408120611edc91615865565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061658f83398151915260205260408082208151610100810190925280545f8051602061652f83398151915293929190829060ff166003811115611fba57611fba615a45565b6003811115611fcb57611fcb615a45565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600381111561205257612052615a45565b1480612070575060038151600381111561206e5761206e615a45565b145b6120c45760405162461bcd60e51b815260206004820152603260248201525f8051602061654f833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161057d565b5f6120d282604001516122ba565b905080606001516001600160401b03165f036121565760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb612183846040015184606001518560800151612889565b6040518263ffffffff1660e01b815260040161219f9190615c7b565b6020604051808303815f875af11580156121bb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190615c42565b5f8181525f805160206165cf83398151915260205260409020545f8051602061656f8339815191529060019060ff16600581111561221f5761221f615a45565b1461223c5760405162461bcd60e51b815260040161057d90615fe9565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91612275919060040161606c565b6020604051808303815f875af1158015612291573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122b59190615c42565b505050565b6122c261589c565b5f8281525f805160206165cf833981519152602052604090819020815160e0810190925280545f8051602061656f833981519152929190829060ff16600581111561230f5761230f615a45565b600581111561232057612320615a45565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61238b613b56565b612397858585856140fb565b90506123af60015f805160206165af83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680612400575080546001600160401b03808416911610155b1561241e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561244984846143e7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124e1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125089190810190616101565b915091508061256b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d29190615c42565b8251146126365760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057d565b60208201516001600160a01b0316156126ac5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057d565b5f806126bb8460400151614401565b915091508187146127285760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057d565b9695505050505050565b5f8281525f805160206165cf833981519152602052604081206002015481905f8051602061656f83398151915290600160801b90046001600160401b031661277a85826145d9565b5f612784876147e7565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6127d48a858b612889565b6040518263ffffffff1660e01b81526004016127f09190615c7b565b6020604051808303815f875af115801561280c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128309190615c42565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6128e961589c565b5f8051602061656f8339815191525f61290185612ecf565b90505f806129128360400151613f5a565b9150915080156129775760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057d565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156129a8576129a8615a45565b60058111156129b9576129b9615a45565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612a2857612a28615a45565b1480612a465750600181516005811115612a4457612a44615a45565b145b612aa55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161057d565b600381516005811115612aba57612aba615a45565b03612ac85760048152612acd565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612b1257612b12615a45565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bc657612bc6615a45565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f8051602061650f83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c94575f80fd5b505af1158015612ca6573d5f803e3d5ffd5b50505050505050565b5f8051602061650f83398151915254611aad906001600160a01b03168383614877565b5f8181525f8051602061658f83398151915260205260408082208151610100810190925280545f8051602061652f83398151915293929190829060ff166003811115612d2057612d20615a45565b6003811115612d3157612d31615a45565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612e2590600160a01b900461ffff1684615f60565b612e2f9190615cad565b905080856008015f8581526020019081526020015f205f828254612e539190615f2b565b909155505f9050612e6482846161d3565b9050612e74856020015182612c39565b612e898560200151610b00876060015161157f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f33573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f5a9190810190616101565b9150915080612fba5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057d565b81511561301b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057d565b60208201516001600160a01b03161561308e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057d565b5092915050565b5f805f83516036146130b95760405162461bcd60e51b815260040161057d906161e6565b5f805b6002811015613108576130d08160016161d3565b6130db906008615f60565b61ffff168682815181106130f1576130f1615dbf565b016020015160f81c901b91909117906001016130bc565b5061ffff81161561312b5760405162461bcd60e51b815260040161057d9061622f565b5f805b6004811015613186576131428160036161d3565b61314d906008615f60565b63ffffffff168761315f836002615f2b565b8151811061316f5761316f615dbf565b016020015160f81c901b919091179060010161312e565b5063ffffffff81166004146131ad5760405162461bcd60e51b815260040161057d90616272565b5f805b6020811015613202576131c481601f6161d3565b6131cf906008615f60565b886131db836006615f2b565b815181106131eb576131eb615dbf565b016020015160f81c901b91909117906001016131b0565b505f805b60088110156132615761321a8160076161d3565b613225906008615f60565b6001600160401b03168961323a836026615f2b565b8151811061324a5761324a615dbf565b016020015160f81c901b9190911790600101613206565b505f805b60088110156132c0576132798160076161d3565b613284906008615f60565b6001600160401b03168a61329983602e615f2b565b815181106132a9576132a9615dbf565b016020015160f81c901b9190911790600101613265565b5091989097509095509350505050565b5f81516026146132f25760405162461bcd60e51b815260040161057d906161e6565b5f805b6002811015613341576133098160016161d3565b613314906008615f60565b61ffff1684828151811061332a5761332a615dbf565b016020015160f81c901b91909117906001016132f5565b5061ffff8116156133645760405162461bcd60e51b815260040161057d9061622f565b5f805b60048110156133bf5761337b8160036161d3565b613386906008615f60565b63ffffffff1685613398836002615f2b565b815181106133a8576133a8615dbf565b016020015160f81c901b9190911790600101613367565b5063ffffffff8116156133e45760405162461bcd60e51b815260040161057d90616272565b5f805b6020811015613439576133fb81601f6161d3565b613406906008615f60565b86613412836006615f2b565b8151811061342257613422615dbf565b016020015160f81c901b91909117906001016133e7565b50949350505050565b60605f61345183830184615d7a565b61345d91506058615f60565b61346890605c615f2b565b6001600160401b0381111561347f5761347f615df1565b6040519080825280601f01601f1916602001820160405280156134a9576020820181803683370190505b5090505f5b60208110156134fe57833581602081106134ca576134ca615dbf565b1a60f81b8282815181106134e0576134e0615dbf565b60200101906001600160f81b03191690815f1a9053506001016134ae565b505f5b602081101561355e578360200135816020811061352057613520615dbf565b1a60f81b82613530836020615f2b565b8151811061354057613540615dbf565b60200101906001600160f81b03191690815f1a905350600101613501565b505f5b60048110156135c1576135758160036161d3565b613580906008615f60565b6014901c60f81b82613593836040615f2b565b815181106135a3576135a3615dbf565b60200101906001600160f81b03191690815f1a905350600101613561565b505f6135d36060850160408601615d5f565b60601b90505f5b6014811015613633578181601481106135f5576135f5615dbf565b1a60f81b83613605836044615f2b565b8151811061361557613615615dbf565b60200101906001600160f81b03191690815f1a9053506001016135da565b505f6136426060860186615d7a565b905090505f5b60048110156136ad5761365c8160036161d3565b613667906008615f60565b63ffffffff8316901c60f81b8461367f836058615f2b565b8151811061368f5761368f615dbf565b60200101906001600160f81b03191690815f1a905350600101613648565b505f5b6136bd6060870187615d7a565b90508110156138d1575f6136d2826058615f60565b6136dd90605c615f2b565b90505f5b6020811015613768576136f76060890189615d7a565b8481811061370757613707615dbf565b90506020028101906137199190615dd3565b35816020811061372b5761372b615dbf565b1a60f81b8661373a8385615f2b565b8151811061374a5761374a615dbf565b60200101906001600160f81b03191690815f1a9053506001016136e1565b505f5b600881101561381d5761377f8160076161d3565b61378a906008615f60565b61379760608a018a615d7a565b858181106137a7576137a7615dbf565b90506020028101906137b99190615dd3565b6137ca906040810190602001615a0c565b6001600160401b0316901c60f81b86826137e5856020615f2b565b6137ef9190615f2b565b815181106137ff576137ff615dbf565b60200101906001600160f81b03191690815f1a90535060010161376b565b505f5b60308110156138c7576138366060890189615d7a565b8481811061384657613846615dbf565b90506020028101906138589190615dd3565b6138669060408101906162b9565b8281811061387657613876615dbf565b9050013560f81c60f81b868284602861388f9190615f2b565b6138999190615f2b565b815181106138a9576138a9615dbf565b60200101906001600160f81b03191690815f1a905350600101613820565b50506001016136b0565b5091949350505050565b6138e361589c565b5f8281525f805160206165cf8339815191526020526040808220815160e0810190925280545f8051602061656f83398151915293929190829060ff16600581111561393057613930615a45565b600581111561394157613941615a45565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156139b3576139b3615a45565b14613a0f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613a5357613a53615a45565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613aff8582612732565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f805160206165af833981519152805460011901613b8757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206165af83398151915255565b5f5f8051602061652f83398151915281613bbc610214856148d6565b90505f613bc8876122ba565b9050613bd387612bfe565b613c305760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161057d565b600281516005811115613c4557613c45615a45565b14613ca45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161057d565b5f828260800151613cb59190615fc9565b60048501546040840151919250613cd7916001600160401b03909116906162fb565b6001600160401b0316816001600160401b03161115613d565760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161057d565b5f80613d628a84612732565b915091505f8a83604051602001613d9092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836003811115613e2b57613e2b615a45565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613f7d5760405162461bcd60e51b815260040161057d906161e6565b5f805b6002811015613fcc57613f948160016161d3565b613f9f906008615f60565b61ffff16858281518110613fb557613fb5615dbf565b016020015160f81c901b9190911790600101613f80565b5061ffff811615613fef5760405162461bcd60e51b815260040161057d9061622f565b5f805b600481101561404a576140068160036161d3565b614011906008615f60565b63ffffffff1686614023836002615f2b565b8151811061403357614033615dbf565b016020015160f81c901b9190911790600101613ff2565b5063ffffffff81166003146140715760405162461bcd60e51b815260040161057d90616272565b5f805b60208110156140c65761408881601f6161d3565b614093906008615f60565b8761409f836006615f2b565b815181106140af576140af615dbf565b016020015160f81c901b9190911790600101614074565b505f866026815181106140db576140db615dbf565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061652f8339815191529061ffff861610156141825760405162461bcd60e51b815260206004820152602b60248201525f8051602061654f83398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161057d565b61271061ffff861611156141da5760405162461bcd60e51b815260206004820152602c60248201525f8051602061654f83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161057d565b60028101546001600160401b0390811690851610156142535760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161057d565b80548310156142b65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161057d565b806001015483111561431d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161057d565b5f614327846148d6565b90505f61433382610a56565b90505f61434089836148f9565b905060405180606001604052806143543390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6143ef614eaf565b6143f882614efa565b611aad81614f6c565b5f808251602e146144245760405162461bcd60e51b815260040161057d906161e6565b5f805b60028110156144735761443b8160016161d3565b614446906008615f60565b61ffff1685828151811061445c5761445c615dbf565b016020015160f81c901b9190911790600101614427565b5061ffff8116156144965760405162461bcd60e51b815260040161057d9061622f565b5f805b60048110156144f1576144ad8160036161d3565b6144b8906008615f60565b63ffffffff16866144ca836002615f2b565b815181106144da576144da615dbf565b016020015160f81c901b9190911790600101614499565b5063ffffffff81166005146145185760405162461bcd60e51b815260040161057d90616272565b5f805b602081101561456d5761452f81601f6161d3565b61453a906008615f60565b87614546836006615f2b565b8151811061455657614556615dbf565b016020015160f81c901b919091179060010161451b565b505f805b60088110156145cc576145858160076161d3565b614590906008615f60565b6001600160401b0316886145a5836026615f2b565b815181106145b5576145b5615dbf565b016020015160f81c901b9190911790600101614571565b5090969095509350505050565b5f8051602061656f8339815191525f6001600160401b03808416908516111561460d576146068385615be4565b905061461a565b6146178484615be4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061467c575060018401548151614678916001600160401b031690615f2b565b8210155b156146a2576001600160401b0383166060820152818152604081015160208201526146c1565b82816060018181516146b49190615fc9565b6001600160401b03169052505b60608101516146d19060646162fb565b602082015160018601546001600160401b0392909216916146fc9190600160401b900460ff16615f60565b10156147605760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161057d565b856001600160401b03168160400181815161477b9190615f2b565b9052506040810180516001600160401b038716919061479b9083906161d3565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206165cf8339815191526020526040812060020180545f8051602061656f83398151915291600160401b9091046001600160401b031690600861483183616326565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b6040516001600160a01b038381166024830152604482018390526122b591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061500d565b5f610a66825f8051602061650f833981519152546001600160a01b03169061506e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166149845760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161057d565b5f8051602061656f833981519152426149a36040860160208701615a0c565b6001600160401b031611614a155760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161057d565b614a256040850160208601615a0c565b6001600160401b0316614a3b6202a30042615f2b565b11614aae5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161057d565b8335614b065760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161057d565b83355f90815260088201602052604090205415614b765760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057d565b6030614b8560408601866162b9565b905014614bea5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057d565b614bf4835f6145d9565b5f80614c8d6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614c389190615a0c565b6001600160401b03168152602001614c5360408a018a6162b9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506151d0565b5f82815260068601602052604090209193509150614cab8282616385565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614ce9908590600401615c7b565b6020604051808303815f875af1158015614d05573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d299190615c42565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614da157614da1615a45565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614e81918e01908e01615a0c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614ef857604051631afcd79f60e31b815260040160405180910390fd5b565b614f02614eaf565b614f0b816152d4565b614f136152ed565b611dc760608201356080830135614f3060c0850160a08601615a0c565b614f4060e0860160c08701616444565b61ffff16614f55610100870160e0880161645d565b614f6761012088016101008901615d5f565b6152fd565b614f74614eaf565b5f8051602061650f8339815191526001600160a01b038216614fed5760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161057d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6150216001600160a01b03841683615585565b905080515f14158015615045575080806020019051810190615043919061647d565b155b156122b557604051635274afe760e01b81526001600160a01b038416600482015260240161057d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156150b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150d89190615c42565b90506150ef6001600160a01b038516333086615592565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015615133573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906151579190615c42565b90508181116151bd5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161057d565b6151c782826161d3565b95945050505050565b5f606082608001515160301461523a5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057d565b5f806001855f0151866020015187604001518860800151896060015160405160200161526c9796959493929190616498565b604051602081830303815290604052905060028160405161528d9190615f1a565b602060405180830381855afa1580156152a8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152cb9190615c42565b94909350915050565b6152dc614eaf565b6152e46155cb565b611dc7816155d3565b6152f5614eaf565b614ef861574e565b615305614eaf565b5f8051602061652f833981519152836153715760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161057d565b6127108411156153d75760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161057d565b8587111561543f5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161057d565b5f8360ff16116154ac5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161057d565b600a60ff8416111561551e5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161057d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606128d983835f615756565b6040516001600160a01b038481166024830152838116604483015260648201839052610a509186918216906323b872dd906084016148a4565b614ef8614eaf565b6155db614eaf565b80355f8051602061656f8339815191529081556014615600606084016040850161645d565b60ff16111561566d5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161057d565b5f61567e606084016040850161645d565b60ff16116156e65760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161057d565b6156f6606083016040840161645d565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556157276040830160208401615a0c565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613b8d614eaf565b60608147101561577b5760405163cd78605960e01b815230600482015260240161057d565b5f80856001600160a01b031684866040516157969190615f1a565b5f6040518083038185875af1925050503d805f81146157d0576040519150601f19603f3d011682016040523d82523d5f602084013e6157d5565b606091505b50915091506127288683836060826157f5576157f08261583c565b6128d9565b815115801561580c57506001600160a01b0384163b155b1561583557604051639996b31560e01b81526001600160a01b038516600482015260240161057d565b50806128d9565b80511561584c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461587190616034565b5f825580601f10615880575050565b601f0160209004905f5260205f2090810190611dc791906158d8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156158ec575f81556001016158d9565b5090565b8015158114611dc7575f80fd5b803563ffffffff81168114615910575f80fd5b919050565b5f805f60608486031215615927575f80fd5b833592506020840135615939816158f0565b9150615947604085016158fd565b90509250925092565b5f60208284031215615960575f80fd5b5035919050565b5f60208284031215615977575f80fd5b6128d9826158fd565b5f8060408385031215615991575f80fd5b61599a836158fd565b946020939093013593505050565b5f80604083850312156159b9575f80fd5b82356001600160401b038111156159ce575f80fd5b8301608081860312156159df575f80fd5b91506159ed602084016158fd565b90509250929050565b80356001600160401b0381168114615910575f80fd5b5f60208284031215615a1c575f80fd5b6128d9826159f6565b5f8060408385031215615a36575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110615a7c57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151615ab760608401826001600160401b03169052565b506080830151615ad260808401826001600160401b03169052565b5060a0830151615aed60a08401826001600160401b03169052565b5060c083015161308e60c08401826001600160401b03169052565b803561ffff81168114615910575f80fd5b5f805f8060808587031215615b2c575f80fd5b84356001600160401b03811115615b41575f80fd5b850160608188031215615b52575f80fd5b9350615b6060208601615b08565b9250615b6e604086016159f6565b9396929550929360600135925050565b6001600160a01b0381168114611dc7575f80fd5b5f80828403610140811215615ba5575f80fd5b61012080821215615bb4575f80fd5b8493508301359050615bc581615b7e565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561308e5761308e615bd0565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615c52575f80fd5b5051919050565b5f5b83811015615c73578181015183820152602001615c5b565b50505f910152565b602081525f8251806020840152615c99816040850160208701615c59565b601f01601f19169190910160400192915050565b5f82615cc757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615d6f575f80fd5b81356128d981615b7e565b5f808335601e19843603018112615d8f575f80fd5b8301803591506001600160401b03821115615da8575f80fd5b6020019150600581901b3603821315612882575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615de7575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615e2757615e27615df1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615e5557615e55615df1565b604052919050565b5f6001600160401b03821115615e7557615e75615df1565b50601f01601f191660200190565b5f60608236031215615e93575f80fd5b615e9b615e05565b823581526020615eac8185016159f6565b8183015260408401356001600160401b03811115615ec8575f80fd5b840136601f820112615ed8575f80fd5b8035615eeb615ee682615e5d565b615e2d565b8181523684838501011115615efe575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615de7818460208701615c59565b80820180821115610a6657610a66615bd0565b5f63ffffffff808316818103615f5657615f56615bd0565b6001019392505050565b8082028115828204841417610a6657610a66615bd0565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561308e5761308e615bd0565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c9082168061604857607f821691505b60208210810361606657634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461607e81616034565b806020870152604060018084165f811461609f57600181146160bb576160e8565b60ff19851660408a0152604084151560051b8a010195506160e8565b895f5260205f205f5b858110156160df5781548b82018601529083019088016160c4565b8a016040019650505b509398975050505050505050565b8051615910816158f0565b5f8060408385031215616112575f80fd5b82516001600160401b0380821115616128575f80fd5b908401906060828703121561613b575f80fd5b616143615e05565b8251815260208084015161615681615b7e565b8282015260408401518381111561616b575f80fd5b80850194505087601f85011261617f575f80fd5b8351925061618f615ee684615e5d565b83815288828587010111156161a2575f80fd5b6161b184838301848801615c59565b806040840152508195506161c68188016160f6565b9450505050509250929050565b81810381811115610a6657610a66615bd0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e198436030181126162ce575f80fd5b8301803591506001600160401b038211156162e7575f80fd5b602001915036819003821315612882575f80fd5b6001600160401b0381811683821602808216919082811461631e5761631e615bd0565b505092915050565b5f6001600160401b03808316818103615f5657615f56615bd0565b601f8211156122b557805f5260205f20601f840160051c810160208510156163665750805b601f840160051c820191505b81811015610b05575f8155600101616372565b81516001600160401b0381111561639e5761639e615df1565b6163b2816163ac8454616034565b84616341565b602080601f8311600181146163e5575f84156163ce5750858301515b5f19600386901b1c1916600185901b17855561643c565b5f85815260208120601f198616915b82811015616413578886015182559484019460019091019084016163f4565b508582101561643057878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215616454575f80fd5b6128d982615b08565b5f6020828403121561646d575f80fd5b813560ff811681146128d9575f80fd5b5f6020828403121561648d575f80fd5b81516128d9816158f0565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516164ed81604e860160208901615c59565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161672d38038061672d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6165e08061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd3660046158fa565b61043a565b005b6101d26101e2366004615935565b61089d565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b610219610214366004615935565b610a56565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b36600461594c565b610a6c565b6101d261026e366004615965565b610b0c565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e36600461598d565b610f9c565b6102b66102b13660046159f1565b61157f565b6040519081526020016101fd565b6102196102d2366004615935565b611598565b6102b65f81565b6101d26102ec3660046158fa565b6115ac565b6101ef603081565b6101d2610307366004615935565b6117c8565b6101d261031a366004615965565b6118ce565b6101d261032d366004615935565b611ab1565b6102b6610340366004615a0a565b611dca565b6101d261035336600461594c565b611df6565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c366004615935565b611f6c565b6101d261039f366004615935565b6121df565b6101ef601481565b6103bf6103ba366004615935565b6122ba565b6040516101fd9190615a3e565b6102196202a30081565b6102b66103e4366004615935565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615afe565b612382565b6101d2610435366004615b77565b6123b7565b5f8381525f8051602061657483398151915260205260408082208151610100810190925280545f8051602061651483398151915293929190829060ff16600381111561048857610488615a2a565b600381111561049957610499615a2a565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61051d826122ba565b905060028351600381111561053457610534615a2a565b146105865760405162461bcd60e51b815260206004820152602a60248201525f805160206165348339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105eb5760405162461bcd60e51b815260206004820152603360248201525f805160206165348339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161057d565b6003835280515f90600290600581111561060757610607615a2a565b0361065e57861561061f5761061c8387612496565b90505b5f846060015183608001516106349190615bc9565b90506106408482612732565b506001600160401b0390811660e0870152421660a086015250610692565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106c5866060015161157f565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b81526004016106f99796959493929190615be9565b602060405180830381865afa158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190615c27565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600381111561077757610777615a2a565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088b916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206165b48339815191526020526040808220815160e0810190925280545f8051602061655483398151915293929190829060ff1660058111156108ea576108ea615a2a565b60058111156108fb576108fb615a2a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096a5761096a615a2a565b146109cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb6109f48584606001515f612889565b6040518263ffffffff1660e01b8152600401610a109190615c60565b6020604051808303815f875af1158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190615c27565b50505050565b5f610a6664e8d4a5100083615c92565b92915050565b5f805160206165148339815191525f80610a85846128e0565b91509150610a9282612bfe565b610a9c5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610aca57610aca615a2a565b03610aef575f83815260088501602052604081208054919055610aed8282612c39565b505b610b0581610b00846040015161157f565b612caf565b5050505050565b5f8181525f8051602061657483398151915260205260408082208151610100810190925280545f8051602061651483398151915293929190829060ff166003811115610b5a57610b5a615a2a565b6003811115610b6b57610b6b615a2a565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf0906122ba565b9050600182516003811115610c0757610c07615a2a565b14610c705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161057d565b600381516005811115610c8557610c85615a2a565b03610dfd57600380835260c0820180516001600160401b0390811660808601529051811660a085015260608301511660e08401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610ce957610ce9615a2a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1257610e12615a2a565b03610e2057610b0584612cd2565b5f610e2a86612ecf565b90505f80610e3b8360400151613095565b509150915081856040015114610e635760405162461bcd60e51b815260040161057d90615cb1565b806001600160401b031684606001516001600160401b03161015610ed45760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161057d565b806001600160401b03168560c001516001600160401b03161115610f0a5760405162461bcd60e51b815260040161057d90615cfb565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206165548339815191529060ff16156110395760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a09190615c27565b8360200135146111025760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161057d565b306111136060850160408601615d44565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161057d565b5f6111936060850185615d5f565b905090505f805b828163ffffffff161015611483575f6111b66060880188615d5f565b8363ffffffff168181106111cc576111cc615da4565b90506020028101906111de9190615db8565b6111e790615e68565b80515f818152600888016020526040902054919250901561125f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161057d565b5f6002895f01358560405160200161128e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a891615eff565b602060405180830381855afa1580156112c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e69190615c27565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561137257611372615a2a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611425911686615f10565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147c90615f23565b905061119a565b50600483018190555f61149585612ecf565b90505f6114a582604001516132d0565b90505f6114b188613442565b9050816002826040516114c49190615eff565b602060405180830381855afa1580156114df573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115029190615c27565b146115665760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161057d565b5050506009909201805460ff1916600117905550505050565b5f610a666001600160401b03831664e8d4a51000615f45565b5f6115a2826122ba565b6080015192915050565b5f805160206165148339815191525f6115c4856138db565b90506115cf85612bfe565b6115da575050505050565b5f8581526005830160205260409020546001600160a01b031633146116115760405162461bcd60e51b815260040161057d90615f5c565b5f85815260058301602052604090205460a082015161164091600160b01b90046001600160401b031690615fae565b6001600160401b03168160c001516001600160401b031610156116c15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161057d565b8315610b05575f6116d28685612496565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117299061157f565b60a085015160c08601516040516001600160e01b031960e086901b16815261175d939291829188905f908190600401615be9565b602060405180830381865afa158015611778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c9190615c27565b5f878152600885016020526040812080549091906117bb908490615f10565b9091555050505050505050565b5f805160206165148339815191525f6117e0836122ba565b90506004815160058111156117f7576117f7615a2a565b146118615760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161057d565b5f8381526005830160205260409020546001600160a01b031633146118985760405162461bcd60e51b815260040161057d90615f5c565b5f83815260088301602090815260408083208054908490556005860190925290912054610a50906001600160a01b031682612c39565b6118d6613b56565b5f8181525f8051602061657483398151915260205260408082208151610100810190925280545f8051602061651483398151915293929190829060ff16600381111561192457611924615a2a565b600381111561193557611935615a2a565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119b185612ecf565b90505f806119c28360400151613095565b5091509150818460400151146119ea5760405162461bcd60e51b815260040161057d90615cb1565b806001600160401b03168460e001516001600160401b03161115611a205760405162461bcd60e51b815260040161057d90615cfb565b600384516003811115611a3557611a35615a2a565b14611a895760405162461bcd60e51b815260206004820152603160248201525f805160206165348339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161057d565b611a9286612cd2565b5050505050611aad60015f8051602061659483398151915255565b5050565b611ab9613b56565b5f8181525f8051602061657483398151915260205260408082208151610100810190925280545f8051602061651483398151915293929190829060ff166003811115611b0757611b07615a2a565b6003811115611b1857611b18615a2a565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611b9c826122ba565b90505f83516003811115611bb257611bb2615a2a565b03611c105760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152671bdd08199bdd5b9960c21b606482015260840161057d565b600481516005811115611c2557611c25615a2a565b14611c885760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161057d565b600183516003811115611c9d57611c9d615a2a565b03611cb457611cab85612cd2565b50505050611db1565b600283516003811115611cc957611cc9615a2a565b03611da3578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611d01856060015161157f565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611d5396959493926001600160401b0390921691908190600401615be9565b602060405180830381865afa158015611d6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d929190615c27565b5f8681526007860160205260409020555b611dac85612cd2565b505050505b611dc760015f8051602061659483398151915255565b50565b5f611dd3613b56565b611dde833384613ba0565b9050610a6660015f8051602061659483398151915255565b5f805160206165548339815191525f611e0e83612ecf565b90505f80611e1f8360400151613f5a565b9150915080611e815760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057d565b60015f83815260078601602052604090205460ff166005811115611ea757611ea7615a2a565b14611ec45760405162461bcd60e51b815260040161057d90615fce565b5f8281526006850160205260408120611edc9161584a565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061657483398151915260205260408082208151610100810190925280545f8051602061651483398151915293929190829060ff166003811115611fba57611fba615a2a565b6003811115611fcb57611fcb615a2a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600381111561205257612052615a2a565b1480612070575060038151600381111561206e5761206e615a2a565b145b6120c45760405162461bcd60e51b815260206004820152603260248201525f80516020616534833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161057d565b5f6120d282604001516122ba565b905080606001516001600160401b03165f036121565760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb612183846040015184606001518560800151612889565b6040518263ffffffff1660e01b815260040161219f9190615c60565b6020604051808303815f875af11580156121bb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190615c27565b5f8181525f805160206165b483398151915260205260409020545f805160206165548339815191529060019060ff16600581111561221f5761221f615a2a565b1461223c5760405162461bcd60e51b815260040161057d90615fce565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916122759190600401616051565b6020604051808303815f875af1158015612291573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122b59190615c27565b505050565b6122c2615881565b5f8281525f805160206165b4833981519152602052604090819020815160e0810190925280545f80516020616554833981519152929190829060ff16600581111561230f5761230f615a2a565b600581111561232057612320615a2a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61238b613b56565b612397858585856140fb565b90506123af60015f8051602061659483398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680612400575080546001600160401b03808416911610155b1561241e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561244984846143e7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124e1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261250891908101906160e6565b915091508061256b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d29190615c27565b8251146126365760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057d565b60208201516001600160a01b0316156126ac5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057d565b5f806126bb8460400151614401565b915091508187146127285760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057d565b9695505050505050565b5f8281525f805160206165b4833981519152602052604081206002015481905f8051602061655483398151915290600160801b90046001600160401b031661277a85826145d9565b5f612784876147e7565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6127d48a858b612889565b6040518263ffffffff1660e01b81526004016127f09190615c60565b6020604051808303815f875af115801561280c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128309190615c27565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6128e9615881565b5f805160206165548339815191525f61290185612ecf565b90505f806129128360400151613f5a565b9150915080156129775760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057d565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156129a8576129a8615a2a565b60058111156129b9576129b9615a2a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612a2857612a28615a2a565b1480612a465750600181516005811115612a4457612a44615a2a565b145b612aa55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161057d565b600381516005811115612aba57612aba615a2a565b03612ac85760048152612acd565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612b1257612b12615a2a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bc657612bc6615a2a565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f805160206164f483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c94575f80fd5b505af1158015612ca6573d5f803e3d5ffd5b50505050505050565b5f805160206164f483398151915254611aad906001600160a01b0316838361485c565b5f8181525f8051602061657483398151915260205260408082208151610100810190925280545f8051602061651483398151915293929190829060ff166003811115612d2057612d20615a2a565b6003811115612d3157612d31615a2a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612e2590600160a01b900461ffff1684615f45565b612e2f9190615c92565b905080856008015f8581526020019081526020015f205f828254612e539190615f10565b909155505f9050612e6482846161b8565b9050612e74856020015182612c39565b612e898560200151610b00876060015161157f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f33573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f5a91908101906160e6565b9150915080612fba5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057d565b81511561301b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057d565b60208201516001600160a01b03161561308e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057d565b5092915050565b5f805f83516036146130b95760405162461bcd60e51b815260040161057d906161cb565b5f805b6002811015613108576130d08160016161b8565b6130db906008615f45565b61ffff168682815181106130f1576130f1615da4565b016020015160f81c901b91909117906001016130bc565b5061ffff81161561312b5760405162461bcd60e51b815260040161057d90616214565b5f805b6004811015613186576131428160036161b8565b61314d906008615f45565b63ffffffff168761315f836002615f10565b8151811061316f5761316f615da4565b016020015160f81c901b919091179060010161312e565b5063ffffffff81166004146131ad5760405162461bcd60e51b815260040161057d90616257565b5f805b6020811015613202576131c481601f6161b8565b6131cf906008615f45565b886131db836006615f10565b815181106131eb576131eb615da4565b016020015160f81c901b91909117906001016131b0565b505f805b60088110156132615761321a8160076161b8565b613225906008615f45565b6001600160401b03168961323a836026615f10565b8151811061324a5761324a615da4565b016020015160f81c901b9190911790600101613206565b505f805b60088110156132c0576132798160076161b8565b613284906008615f45565b6001600160401b03168a61329983602e615f10565b815181106132a9576132a9615da4565b016020015160f81c901b9190911790600101613265565b5091989097509095509350505050565b5f81516026146132f25760405162461bcd60e51b815260040161057d906161cb565b5f805b6002811015613341576133098160016161b8565b613314906008615f45565b61ffff1684828151811061332a5761332a615da4565b016020015160f81c901b91909117906001016132f5565b5061ffff8116156133645760405162461bcd60e51b815260040161057d90616214565b5f805b60048110156133bf5761337b8160036161b8565b613386906008615f45565b63ffffffff1685613398836002615f10565b815181106133a8576133a8615da4565b016020015160f81c901b9190911790600101613367565b5063ffffffff8116156133e45760405162461bcd60e51b815260040161057d90616257565b5f805b6020811015613439576133fb81601f6161b8565b613406906008615f45565b86613412836006615f10565b8151811061342257613422615da4565b016020015160f81c901b91909117906001016133e7565b50949350505050565b60605f61345183830184615d5f565b61345d91506058615f45565b61346890605c615f10565b6001600160401b0381111561347f5761347f615dd6565b6040519080825280601f01601f1916602001820160405280156134a9576020820181803683370190505b5090505f5b60208110156134fe57833581602081106134ca576134ca615da4565b1a60f81b8282815181106134e0576134e0615da4565b60200101906001600160f81b03191690815f1a9053506001016134ae565b505f5b602081101561355e578360200135816020811061352057613520615da4565b1a60f81b82613530836020615f10565b8151811061354057613540615da4565b60200101906001600160f81b03191690815f1a905350600101613501565b505f5b60048110156135c1576135758160036161b8565b613580906008615f45565b6014901c60f81b82613593836040615f10565b815181106135a3576135a3615da4565b60200101906001600160f81b03191690815f1a905350600101613561565b505f6135d36060850160408601615d44565b60601b90505f5b6014811015613633578181601481106135f5576135f5615da4565b1a60f81b83613605836044615f10565b8151811061361557613615615da4565b60200101906001600160f81b03191690815f1a9053506001016135da565b505f6136426060860186615d5f565b905090505f5b60048110156136ad5761365c8160036161b8565b613667906008615f45565b63ffffffff8316901c60f81b8461367f836058615f10565b8151811061368f5761368f615da4565b60200101906001600160f81b03191690815f1a905350600101613648565b505f5b6136bd6060870187615d5f565b90508110156138d1575f6136d2826058615f45565b6136dd90605c615f10565b90505f5b6020811015613768576136f76060890189615d5f565b8481811061370757613707615da4565b90506020028101906137199190615db8565b35816020811061372b5761372b615da4565b1a60f81b8661373a8385615f10565b8151811061374a5761374a615da4565b60200101906001600160f81b03191690815f1a9053506001016136e1565b505f5b600881101561381d5761377f8160076161b8565b61378a906008615f45565b61379760608a018a615d5f565b858181106137a7576137a7615da4565b90506020028101906137b99190615db8565b6137ca9060408101906020016159f1565b6001600160401b0316901c60f81b86826137e5856020615f10565b6137ef9190615f10565b815181106137ff576137ff615da4565b60200101906001600160f81b03191690815f1a90535060010161376b565b505f5b60308110156138c7576138366060890189615d5f565b8481811061384657613846615da4565b90506020028101906138589190615db8565b61386690604081019061629e565b8281811061387657613876615da4565b9050013560f81c60f81b868284602861388f9190615f10565b6138999190615f10565b815181106138a9576138a9615da4565b60200101906001600160f81b03191690815f1a905350600101613820565b50506001016136b0565b5091949350505050565b6138e3615881565b5f8281525f805160206165b48339815191526020526040808220815160e0810190925280545f8051602061655483398151915293929190829060ff16600581111561393057613930615a2a565b600581111561394157613941615a2a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156139b3576139b3615a2a565b14613a0f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613a5357613a53615a2a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613aff8582612732565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020616594833981519152805460011901613b8757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061659483398151915255565b5f5f8051602061651483398151915281613bbc610214856148bb565b90505f613bc8876122ba565b9050613bd387612bfe565b613c305760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161057d565b600281516005811115613c4557613c45615a2a565b14613ca45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161057d565b5f828260800151613cb59190615fae565b60048501546040840151919250613cd7916001600160401b03909116906162e0565b6001600160401b0316816001600160401b03161115613d565760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161057d565b5f80613d628a84612732565b915091505f8a83604051602001613d9092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836003811115613e2b57613e2b615a2a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613f7d5760405162461bcd60e51b815260040161057d906161cb565b5f805b6002811015613fcc57613f948160016161b8565b613f9f906008615f45565b61ffff16858281518110613fb557613fb5615da4565b016020015160f81c901b9190911790600101613f80565b5061ffff811615613fef5760405162461bcd60e51b815260040161057d90616214565b5f805b600481101561404a576140068160036161b8565b614011906008615f45565b63ffffffff1686614023836002615f10565b8151811061403357614033615da4565b016020015160f81c901b9190911790600101613ff2565b5063ffffffff81166003146140715760405162461bcd60e51b815260040161057d90616257565b5f805b60208110156140c65761408881601f6161b8565b614093906008615f45565b8761409f836006615f10565b815181106140af576140af615da4565b016020015160f81c901b9190911790600101614074565b505f866026815181106140db576140db615da4565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206165148339815191529061ffff861610156141825760405162461bcd60e51b815260206004820152602b60248201525f8051602061653483398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161057d565b61271061ffff861611156141da5760405162461bcd60e51b815260206004820152602c60248201525f8051602061653483398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161057d565b60028101546001600160401b0390811690851610156142535760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161057d565b80548310156142b65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161057d565b806001015483111561431d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161057d565b5f614327846148bb565b90505f61433382610a56565b90505f61434089836148de565b905060405180606001604052806143543390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6143ef614e94565b6143f882614edf565b611aad81614f51565b5f808251602e146144245760405162461bcd60e51b815260040161057d906161cb565b5f805b60028110156144735761443b8160016161b8565b614446906008615f45565b61ffff1685828151811061445c5761445c615da4565b016020015160f81c901b9190911790600101614427565b5061ffff8116156144965760405162461bcd60e51b815260040161057d90616214565b5f805b60048110156144f1576144ad8160036161b8565b6144b8906008615f45565b63ffffffff16866144ca836002615f10565b815181106144da576144da615da4565b016020015160f81c901b9190911790600101614499565b5063ffffffff81166005146145185760405162461bcd60e51b815260040161057d90616257565b5f805b602081101561456d5761452f81601f6161b8565b61453a906008615f45565b87614546836006615f10565b8151811061455657614556615da4565b016020015160f81c901b919091179060010161451b565b505f805b60088110156145cc576145858160076161b8565b614590906008615f45565b6001600160401b0316886145a5836026615f10565b815181106145b5576145b5615da4565b016020015160f81c901b9190911790600101614571565b5090969095509350505050565b5f805160206165548339815191525f6001600160401b03808416908516111561460d576146068385615bc9565b905061461a565b6146178484615bc9565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061467c575060018401548151614678916001600160401b031690615f10565b8210155b156146a2576001600160401b0383166060820152818152604081015160208201526146c1565b82816060018181516146b49190615fae565b6001600160401b03169052505b60608101516146d19060646162e0565b602082015160018601546001600160401b0392909216916146fc9190600160401b900460ff16615f45565b10156147605760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161057d565b856001600160401b03168160400181815161477b9190615f10565b9052506040810180516001600160401b038716919061479b9083906161b8565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206165b48339815191526020526040812060020180545f80516020616554833981519152919060089061483190600160401b90046001600160401b031661630b565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b038381166024830152604482018390526122b591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614ff2565b5f610a66825f805160206164f4833981519152546001600160a01b031690615053565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166149695760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161057d565b5f805160206165548339815191524261498860408601602087016159f1565b6001600160401b0316116149fa5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161057d565b614a0a60408501602086016159f1565b6001600160401b0316614a206202a30042615f10565b11614a935760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161057d565b8335614aeb5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161057d565b83355f90815260088201602052604090205415614b5b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057d565b6030614b6a604086018661629e565b905014614bcf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057d565b614bd9835f6145d9565b5f80614c726040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614c1d91906159f1565b6001600160401b03168152602001614c3860408a018a61629e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506151b5565b5f82815260068601602052604090209193509150614c90828261636a565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614cce908590600401615c60565b6020604051808303815f875af1158015614cea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d0e9190615c27565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614d8657614d86615a2a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614e66918e01908e016159f1565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614edd57604051631afcd79f60e31b815260040160405180910390fd5b565b614ee7614e94565b614ef0816152b9565b614ef86152d2565b611dc760608201356080830135614f1560c0850160a086016159f1565b614f2560e0860160c08701616429565b61ffff16614f3a610100870160e08801616442565b614f4c61012088016101008901615d44565b6152e2565b614f59614e94565b5f805160206164f48339815191526001600160a01b038216614fd25760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161057d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6150066001600160a01b0384168361556a565b905080515f1415801561502a5750808060200190518101906150289190616462565b155b156122b557604051635274afe760e01b81526001600160a01b038416600482015260240161057d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015615099573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150bd9190615c27565b90506150d46001600160a01b038516333086615577565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015615118573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061513c9190615c27565b90508181116151a25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161057d565b6151ac82826161b8565b95945050505050565b5f606082608001515160301461521f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057d565b5f806001855f01518660200151876040015188608001518960600151604051602001615251979695949392919061647d565b60405160208183030381529060405290506002816040516152729190615eff565b602060405180830381855afa15801561528d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152b09190615c27565b94909350915050565b6152c1614e94565b6152c96155b0565b611dc7816155b8565b6152da614e94565b614edd615733565b6152ea614e94565b5f80516020616514833981519152836153565760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161057d565b6127108411156153bc5760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161057d565b858711156154245760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161057d565b5f8360ff16116154915760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161057d565b600a60ff841611156155035760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161057d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606128d983835f61573b565b6040516001600160a01b038481166024830152838116604483015260648201839052610a509186918216906323b872dd90608401614889565b614edd614e94565b6155c0614e94565b80355f8051602061655483398151915290815560146155e56060840160408501616442565b60ff1611156156525760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161057d565b5f6156636060840160408501616442565b60ff16116156cb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161057d565b6156db6060830160408401616442565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561570c60408301602084016159f1565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613b8d614e94565b6060814710156157605760405163cd78605960e01b815230600482015260240161057d565b5f80856001600160a01b0316848660405161577b9190615eff565b5f6040518083038185875af1925050503d805f81146157b5576040519150601f19603f3d011682016040523d82523d5f602084013e6157ba565b606091505b50915091506127288683836060826157da576157d582615821565b6128d9565b81511580156157f157506001600160a01b0384163b155b1561581a57604051639996b31560e01b81526001600160a01b038516600482015260240161057d565b50806128d9565b8051156158315780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461585690616019565b5f825580601f10615865575050565b601f0160209004905f5260205f2090810190611dc791906158bd565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156158d1575f81556001016158be565b5090565b8015158114611dc7575f80fd5b803563ffffffff811681146158f5575f80fd5b919050565b5f805f6060848603121561590c575f80fd5b83359250602084013561591e816158d5565b915061592c604085016158e2565b90509250925092565b5f60208284031215615945575f80fd5b5035919050565b5f6020828403121561595c575f80fd5b6128d9826158e2565b5f8060408385031215615976575f80fd5b61597f836158e2565b946020939093013593505050565b5f806040838503121561599e575f80fd5b82356001600160401b038111156159b3575f80fd5b8301608081860312156159c4575f80fd5b91506159d2602084016158e2565b90509250929050565b80356001600160401b03811681146158f5575f80fd5b5f60208284031215615a01575f80fd5b6128d9826159db565b5f8060408385031215615a1b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110615a6157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151615a9c60608401826001600160401b03169052565b506080830151615ab760808401826001600160401b03169052565b5060a0830151615ad260a08401826001600160401b03169052565b5060c083015161308e60c08401826001600160401b03169052565b803561ffff811681146158f5575f80fd5b5f805f8060808587031215615b11575f80fd5b84356001600160401b03811115615b26575f80fd5b850160608188031215615b37575f80fd5b9350615b4560208601615aed565b9250615b53604086016159db565b9396929550929360600135925050565b6001600160a01b0381168114611dc7575f80fd5b5f80828403610140811215615b8a575f80fd5b61012080821215615b99575f80fd5b8493508301359050615baa81615b63565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561308e5761308e615bb5565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615c37575f80fd5b5051919050565b5f5b83811015615c58578181015183820152602001615c40565b50505f910152565b602081525f8251806020840152615c7e816040850160208701615c3e565b601f01601f19169190910160400192915050565b5f82615cac57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615d54575f80fd5b81356128d981615b63565b5f808335601e19843603018112615d74575f80fd5b8301803591506001600160401b03821115615d8d575f80fd5b6020019150600581901b3603821315612882575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615dcc575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615e0c57615e0c615dd6565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615e3a57615e3a615dd6565b604052919050565b5f6001600160401b03821115615e5a57615e5a615dd6565b50601f01601f191660200190565b5f60608236031215615e78575f80fd5b615e80615dea565b823581526020615e918185016159db565b8183015260408401356001600160401b03811115615ead575f80fd5b840136601f820112615ebd575f80fd5b8035615ed0615ecb82615e42565b615e12565b8181523684838501011115615ee3575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615dcc818460208701615c3e565b80820180821115610a6657610a66615bb5565b5f63ffffffff808316818103615f3b57615f3b615bb5565b6001019392505050565b8082028115828204841417610a6657610a66615bb5565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561308e5761308e615bb5565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c9082168061602d57607f821691505b60208210810361604b57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461606381616019565b806020870152604060018084165f811461608457600181146160a0576160cd565b60ff19851660408a0152604084151560051b8a010195506160cd565b895f5260205f205f5b858110156160c45781548b82018601529083019088016160a9565b8a016040019650505b509398975050505050505050565b80516158f5816158d5565b5f80604083850312156160f7575f80fd5b82516001600160401b038082111561610d575f80fd5b9084019060608287031215616120575f80fd5b616128615dea565b8251815260208084015161613b81615b63565b82820152604084015183811115616150575f80fd5b80850194505087601f850112616164575f80fd5b83519250616174615ecb84615e42565b8381528882858701011115616187575f80fd5b61619684838301848801615c3e565b806040840152508195506161ab8188016160db565b9450505050509250929050565b81810381811115610a6657610a66615bb5565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e198436030181126162b3575f80fd5b8301803591506001600160401b038211156162cc575f80fd5b602001915036819003821315612882575f80fd5b6001600160401b0381811683821602808216919082811461630357616303615bb5565b505092915050565b5f6001600160401b03808316818103615f3b57615f3b615bb5565b601f8211156122b557805f5260205f20601f840160051c8101602085101561634b5750805b601f840160051c820191505b81811015610b05575f8155600101616357565b81516001600160401b0381111561638357616383615dd6565b616397816163918454616019565b84616326565b602080601f8311600181146163ca575f84156163b35750858301515b5f19600386901b1c1916600185901b178555616421565b5f85815260208120601f198616915b828110156163f8578886015182559484019460019091019084016163d9565b508582101561641557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215616439575f80fd5b6128d982615aed565b5f60208284031215616452575f80fd5b813560ff811681146128d9575f80fd5b5f60208284031215616472575f80fd5b81516128d9816158d5565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516164d281604e860160208901615c3e565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 fa575bd35..4b0c36b6a 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161641238038061641283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162c58061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d836600461567c565b61058b565b005b3480156101ea575f80fd5b506101dd6101f93660046156b7565b6109ee565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd6102433660046156ce565b610ba7565b348015610253575f80fd5b506102676102623660046156b7565b610c84565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e736600461570c565b610c9a565b604051908152602001610220565b348015610305575f80fd5b506101dd610314366004615760565b610cce565b348015610324575f80fd5b506101dd610333366004615779565b610d6e565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b3660046157a1565b6111fe565b34801561038b575f80fd5b506102ec61039a3660046157ef565b6117e1565b3480156103aa575f80fd5b506102676103b93660046156b7565b6117fa565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb36600461567c565b61180e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e3660046156b7565b611a2a565b34801561042e575f80fd5b506101dd61043d366004615779565b611b30565b34801561044d575f80fd5b506101dd61045c3660046156b7565b611d13565b34801561046c575f80fd5b506101dd61047b366004615760565b61202c565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b43660046156b7565b6121a2565b3480156104c4575f80fd5b506101dd6104d33660046156b7565b612415565b6102ec6104e63660046156b7565b6124f0565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e6105193660046156b7565b612521565b604051610220919061581c565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b3660046156b7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f8051602061625983398151915260205260408082208151610100810190925280545f805160206161f983398151915293929190829060ff1660038111156105d9576105d9615808565b60038111156105ea576105ea615808565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61066e82612521565b905060028351600381111561068557610685615808565b146106d75760405162461bcd60e51b815260206004820152602a60248201525f805160206162198339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461073c5760405162461bcd60e51b815260206004820152603360248201525f805160206162198339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106ce565b6003835280515f90600290600581111561075857610758615808565b036107af5786156107705761076d83876125e9565b90505b5f8460600151836080015161078591906158df565b90506107918482612885565b506001600160401b0390811660e0870152421660a0860152506107e3565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561081686606001516117e1565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b815260040161084a97969594939291906158ff565b602060405180830381865afa158015610865573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610889919061593d565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360038111156108c8576108c8615808565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109dc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206162998339815191526020526040808220815160e0810190925280545f8051602061623983398151915293929190829060ff166005811115610a3b57610a3b615808565b6005811115610a4c57610a4c615808565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abb57610abb615808565b14610b205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb610b458584606001515f6129dc565b6040518263ffffffff1660e01b8152600401610b619190615976565b6020604051808303815f875af1158015610b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba1919061593d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c3883612a2b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9464e8d4a51000836159a8565b92915050565b5f610ca3612a3c565b610caf84848434612a73565b9050610cc760015f8051602061627983398151915255565b9392505050565b5f805160206161f98339815191525f80610ce784612d67565b91509150610cf482613085565b610cfe5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d2c57610d2c615808565b03610d51575f83815260088501602052604081208054919055610d4f82826130c0565b505b610d6781610d6284604001516117e1565b613126565b5050505050565b5f8181525f8051602061625983398151915260205260408082208151610100810190925280545f805160206161f983398151915293929190829060ff166003811115610dbc57610dbc615808565b6003811115610dcd57610dcd615808565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e5290612521565b9050600182516003811115610e6957610e69615808565b14610ed25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106ce565b600381516005811115610ee757610ee7615808565b0361105f57600380835260c0820180516001600160401b0390811660808601529051811660a085015260608301511660e08401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610f4b57610f4b615808565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b60048151600581111561107457611074615808565b0361108257610d6784613139565b5f61108c86613336565b90505f8061109d83604001516134fc565b5091509150818560400151146110c55760405162461bcd60e51b81526004016106ce906159c7565b806001600160401b031684606001516001600160401b031610156111365760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106ce565b806001600160401b03168560c001516001600160401b0316111561116c5760405162461bcd60e51b81526004016106ce90615a11565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206162398339815191529060ff161561129b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611302919061593d565b8360200135146113645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106ce565b306113756060850160408601615a6e565b6001600160a01b0316146113e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106ce565b5f6113f56060850185615a89565b905090505f805b828163ffffffff1610156116e5575f6114186060880188615a89565b8363ffffffff1681811061142e5761142e615ace565b90506020028101906114409190615ae2565b61144990615b92565b80515f81815260088801602052604090205491925090156114c15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106ce565b5f6002895f0135856040516020016114f092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150a91615c29565b602060405180830381855afa158015611525573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611548919061593d565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d4576115d4615808565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611687911686615c3a565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116de90615c4d565b90506113fc565b50600483018190555f6116f785613336565b90505f6117078260400151613737565b90505f611713886138a9565b9050816002826040516117269190615c29565b602060405180830381855afa158015611741573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611764919061593d565b146117c85760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106ce565b5050506009909201805460ff1916600117905550505050565b5f610c946001600160401b03831664e8d4a51000615c6f565b5f61180482612521565b6080015192915050565b5f805160206161f98339815191525f61182685613d42565b905061183185613085565b61183c575050505050565b5f8581526005830160205260409020546001600160a01b031633146118735760405162461bcd60e51b81526004016106ce90615c86565b5f85815260058301602052604090205460a08201516118a291600160b01b90046001600160401b031690615cd8565b6001600160401b03168160c001516001600160401b031610156119235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106ce565b8315610d67575f61193486856125e9565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198b906117e1565b60a085015160c08601516040516001600160e01b031960e086901b1681526119bf939291829188905f9081906004016158ff565b602060405180830381865afa1580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe919061593d565b5f87815260088501602052604081208054909190611a1d908490615c3a565b9091555050505050505050565b5f805160206161f98339815191525f611a4283612521565b9050600481516005811115611a5957611a59615808565b14611ac35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106ce565b5f8381526005830160205260409020546001600160a01b03163314611afa5760405162461bcd60e51b81526004016106ce90615c86565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba1906001600160a01b0316826130c0565b611b38612a3c565b5f8181525f8051602061625983398151915260205260408082208151610100810190925280545f805160206161f983398151915293929190829060ff166003811115611b8657611b86615808565b6003811115611b9757611b97615808565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c1385613336565b90505f80611c2483604001516134fc565b509150915081846040015114611c4c5760405162461bcd60e51b81526004016106ce906159c7565b806001600160401b03168460e001516001600160401b03161115611c825760405162461bcd60e51b81526004016106ce90615a11565b600384516003811115611c9757611c97615808565b14611ceb5760405162461bcd60e51b815260206004820152603160248201525f805160206162198339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106ce565b611cf486613139565b5050505050611d0f60015f8051602061627983398151915255565b5050565b611d1b612a3c565b5f8181525f8051602061625983398151915260205260408082208151610100810190925280545f805160206161f983398151915293929190829060ff166003811115611d6957611d69615808565b6003811115611d7a57611d7a615808565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611dfe82612521565b90505f83516003811115611e1457611e14615808565b03611e725760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152671bdd08199bdd5b9960c21b60648201526084016106ce565b600481516005811115611e8757611e87615808565b14611eea5760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106ce565b600183516003811115611eff57611eff615808565b03611f1657611f0d85613139565b50505050612013565b600283516003811115611f2b57611f2b615808565b03612005578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611f6385606001516117e1565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611fb596959493926001600160401b03909216919081906004016158ff565b602060405180830381865afa158015611fd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff4919061593d565b5f8681526007860160205260409020555b61200e85613139565b505050505b61202960015f8051602061627983398151915255565b50565b5f805160206162398339815191525f61204483613336565b90505f806120558360400151613fbd565b91509150806120b75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106ce565b60015f83815260078601602052604090205460ff1660058111156120dd576120dd615808565b146120fa5760405162461bcd60e51b81526004016106ce90615cf8565b5f8281526006850160205260408120612112916155d1565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061625983398151915260205260408082208151610100810190925280545f805160206161f983398151915293929190829060ff1660038111156121f0576121f0615808565b600381111561220157612201615808565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600381111561228857612288615808565b14806122a657506003815160038111156122a4576122a4615808565b145b6122fa5760405162461bcd60e51b815260206004820152603260248201525f80516020616219833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106ce565b5f6123088260400151612521565b905080606001516001600160401b03165f0361238c5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb6123b98460400151846060015185608001516129dc565b6040518263ffffffff1660e01b81526004016123d59190615976565b6020604051808303815f875af11580156123f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d67919061593d565b5f8181525f8051602061629983398151915260205260409020545f805160206162398339815191529060019060ff16600581111561245557612455615808565b146124725760405162461bcd60e51b81526004016106ce90615cf8565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916124ab9190600401615d75565b6020604051808303815f875af11580156124c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124eb919061593d565b505050565b5f6124f9612a3c565b61250482333461415e565b905061251c60015f8051602061627983398151915255565b919050565b612529615608565b5f8281525f80516020616299833981519152602052604090819020815160e0810190925280545f80516020616239833981519152929190829060ff16600581111561257657612576615808565b600581111561258757612587615808565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612634573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261265b9190810190615e0a565b91509150806126be5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612701573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612725919061593d565b8251146127895760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106ce565b60208201516001600160a01b0316156127ff5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106ce565b5f8061280e8460400151614515565b9150915081871461287b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106ce565b9695505050505050565b5f8281525f80516020616299833981519152602052604081206002015481905f8051602061623983398151915290600160801b90046001600160401b03166128cd85826146ed565b5f6128d7876148fb565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129278a858b6129dc565b6040518263ffffffff1660e01b81526004016129439190615976565b6020604051808303815f875af115801561295f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612983919061593d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612a3361498b565b612029816149d6565b5f80516020616279833981519152805460011901612a6d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206161f98339815191529061ffff86161015612afa5760405162461bcd60e51b815260206004820152602b60248201525f8051602061621983398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106ce565b61271061ffff86161115612b525760405162461bcd60e51b815260206004820152602c60248201525f8051602061621983398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106ce565b60028101546001600160401b039081169085161015612bcb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106ce565b8054831015612c2e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106ce565b8060010154831115612c955760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106ce565b825f612ca082610c84565b90505f612cad8983614a48565b90506040518060600160405280612cc13390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061627983398151915255565b5f612d70615608565b5f805160206162398339815191525f612d8885613336565b90505f80612d998360400151613fbd565b915091508015612dfe5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106ce565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612e2f57612e2f615808565b6005811115612e4057612e40615808565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612eaf57612eaf615808565b1480612ecd5750600181516005811115612ecb57612ecb615808565b145b612f2c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106ce565b600381516005811115612f4157612f41615808565b03612f4f5760048152612f54565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f9957612f99615808565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561304d5761304d615808565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561310c575f80fd5b505af115801561311e573d5f803e3d5ffd5b505050505050565b611d0f6001600160a01b03831682614ffe565b5f8181525f8051602061625983398151915260205260408082208151610100810190925280545f805160206161f983398151915293929190829060ff16600381111561318757613187615808565b600381111561319857613198615808565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061328c90600160a01b900461ffff1684615c6f565b61329691906159a8565b905080856008015f8581526020019081526020015f205f8282546132ba9190615c3a565b909155505f90506132cb8284615edc565b90506132db8560200151826130c0565b6132f08560200151610d6287606001516117e1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561339a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526133c19190810190615e0a565b91509150806134215760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106ce565b8151156134825760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106ce565b60208201516001600160a01b0316156134f55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106ce565b5092915050565b5f805f83516036146135205760405162461bcd60e51b81526004016106ce90615eef565b5f805b600281101561356f57613537816001615edc565b613542906008615c6f565b61ffff1686828151811061355857613558615ace565b016020015160f81c901b9190911790600101613523565b5061ffff8116156135925760405162461bcd60e51b81526004016106ce90615f38565b5f805b60048110156135ed576135a9816003615edc565b6135b4906008615c6f565b63ffffffff16876135c6836002615c3a565b815181106135d6576135d6615ace565b016020015160f81c901b9190911790600101613595565b5063ffffffff81166004146136145760405162461bcd60e51b81526004016106ce90615f7b565b5f805b60208110156136695761362b81601f615edc565b613636906008615c6f565b88613642836006615c3a565b8151811061365257613652615ace565b016020015160f81c901b9190911790600101613617565b505f805b60088110156136c857613681816007615edc565b61368c906008615c6f565b6001600160401b0316896136a1836026615c3a565b815181106136b1576136b1615ace565b016020015160f81c901b919091179060010161366d565b505f805b6008811015613727576136e0816007615edc565b6136eb906008615c6f565b6001600160401b03168a61370083602e615c3a565b8151811061371057613710615ace565b016020015160f81c901b91909117906001016136cc565b5091989097509095509350505050565b5f81516026146137595760405162461bcd60e51b81526004016106ce90615eef565b5f805b60028110156137a857613770816001615edc565b61377b906008615c6f565b61ffff1684828151811061379157613791615ace565b016020015160f81c901b919091179060010161375c565b5061ffff8116156137cb5760405162461bcd60e51b81526004016106ce90615f38565b5f805b6004811015613826576137e2816003615edc565b6137ed906008615c6f565b63ffffffff16856137ff836002615c3a565b8151811061380f5761380f615ace565b016020015160f81c901b91909117906001016137ce565b5063ffffffff81161561384b5760405162461bcd60e51b81526004016106ce90615f7b565b5f805b60208110156138a05761386281601f615edc565b61386d906008615c6f565b86613879836006615c3a565b8151811061388957613889615ace565b016020015160f81c901b919091179060010161384e565b50949350505050565b60605f6138b883830184615a89565b6138c491506058615c6f565b6138cf90605c615c3a565b6001600160401b038111156138e6576138e6615b00565b6040519080825280601f01601f191660200182016040528015613910576020820181803683370190505b5090505f5b6020811015613965578335816020811061393157613931615ace565b1a60f81b82828151811061394757613947615ace565b60200101906001600160f81b03191690815f1a905350600101613915565b505f5b60208110156139c5578360200135816020811061398757613987615ace565b1a60f81b82613997836020615c3a565b815181106139a7576139a7615ace565b60200101906001600160f81b03191690815f1a905350600101613968565b505f5b6004811015613a28576139dc816003615edc565b6139e7906008615c6f565b6014901c60f81b826139fa836040615c3a565b81518110613a0a57613a0a615ace565b60200101906001600160f81b03191690815f1a9053506001016139c8565b505f613a3a6060850160408601615a6e565b60601b90505f5b6014811015613a9a57818160148110613a5c57613a5c615ace565b1a60f81b83613a6c836044615c3a565b81518110613a7c57613a7c615ace565b60200101906001600160f81b03191690815f1a905350600101613a41565b505f613aa96060860186615a89565b905090505f5b6004811015613b1457613ac3816003615edc565b613ace906008615c6f565b63ffffffff8316901c60f81b84613ae6836058615c3a565b81518110613af657613af6615ace565b60200101906001600160f81b03191690815f1a905350600101613aaf565b505f5b613b246060870187615a89565b9050811015613d38575f613b39826058615c6f565b613b4490605c615c3a565b90505f5b6020811015613bcf57613b5e6060890189615a89565b84818110613b6e57613b6e615ace565b9050602002810190613b809190615ae2565b358160208110613b9257613b92615ace565b1a60f81b86613ba18385615c3a565b81518110613bb157613bb1615ace565b60200101906001600160f81b03191690815f1a905350600101613b48565b505f5b6008811015613c8457613be6816007615edc565b613bf1906008615c6f565b613bfe60608a018a615a89565b85818110613c0e57613c0e615ace565b9050602002810190613c209190615ae2565b613c319060408101906020016157ef565b6001600160401b0316901c60f81b8682613c4c856020615c3a565b613c569190615c3a565b81518110613c6657613c66615ace565b60200101906001600160f81b03191690815f1a905350600101613bd2565b505f5b6030811015613d2e57613c9d6060890189615a89565b84818110613cad57613cad615ace565b9050602002810190613cbf9190615ae2565b613ccd906040810190615fc2565b82818110613cdd57613cdd615ace565b9050013560f81c60f81b8682846028613cf69190615c3a565b613d009190615c3a565b81518110613d1057613d10615ace565b60200101906001600160f81b03191690815f1a905350600101613c87565b5050600101613b17565b5091949350505050565b613d4a615608565b5f8281525f805160206162998339815191526020526040808220815160e0810190925280545f8051602061623983398151915293929190829060ff166005811115613d9757613d97615808565b6005811115613da857613da8615808565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e1a57613e1a615808565b14613e765760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106ce565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613eba57613eba615808565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f668582612885565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613fe05760405162461bcd60e51b81526004016106ce90615eef565b5f805b600281101561402f57613ff7816001615edc565b614002906008615c6f565b61ffff1685828151811061401857614018615ace565b016020015160f81c901b9190911790600101613fe3565b5061ffff8116156140525760405162461bcd60e51b81526004016106ce90615f38565b5f805b60048110156140ad57614069816003615edc565b614074906008615c6f565b63ffffffff1686614086836002615c3a565b8151811061409657614096615ace565b016020015160f81c901b9190911790600101614055565b5063ffffffff81166003146140d45760405162461bcd60e51b81526004016106ce90615f7b565b5f805b6020811015614129576140eb81601f615edc565b6140f6906008615c6f565b87614102836006615c3a565b8151811061411257614112615ace565b016020015160f81c901b91909117906001016140d7565b505f8660268151811061413e5761413e615ace565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206161f98339815191528161417784610c84565b90505f61418387612521565b905061418e87613085565b6141eb5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106ce565b60028151600581111561420057614200615808565b1461425f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106ce565b5f8282608001516142709190615cd8565b60048501546040840151919250614292916001600160401b0390911690616004565b6001600160401b0316816001600160401b031611156143115760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106ce565b5f8061431d8a84612885565b915091505f8a8360405160200161434b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360038111156143e6576143e6615808565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146145385760405162461bcd60e51b81526004016106ce90615eef565b5f805b60028110156145875761454f816001615edc565b61455a906008615c6f565b61ffff1685828151811061457057614570615ace565b016020015160f81c901b919091179060010161453b565b5061ffff8116156145aa5760405162461bcd60e51b81526004016106ce90615f38565b5f805b6004811015614605576145c1816003615edc565b6145cc906008615c6f565b63ffffffff16866145de836002615c3a565b815181106145ee576145ee615ace565b016020015160f81c901b91909117906001016145ad565b5063ffffffff811660051461462c5760405162461bcd60e51b81526004016106ce90615f7b565b5f805b60208110156146815761464381601f615edc565b61464e906008615c6f565b8761465a836006615c3a565b8151811061466a5761466a615ace565b016020015160f81c901b919091179060010161462f565b505f805b60088110156146e057614699816007615edc565b6146a4906008615c6f565b6001600160401b0316886146b9836026615c3a565b815181106146c9576146c9615ace565b016020015160f81c901b9190911790600101614685565b5090969095509350505050565b5f805160206162398339815191525f6001600160401b0380841690851611156147215761471a83856158df565b905061472e565b61472b84846158df565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061479057506001840154815161478c916001600160401b031690615c3a565b8210155b156147b6576001600160401b0383166060820152818152604081015160208201526147d5565b82816060018181516147c89190615cd8565b6001600160401b03169052505b60608101516147e5906064616004565b602082015160018601546001600160401b0392909216916148109190600160401b900460ff16615c6f565b10156148745760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106ce565b856001600160401b03168160400181815161488f9190615c3a565b9052506040810180516001600160401b03871691906148af908390615edc565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206162998339815191526020526040812060020180545f8051602061623983398151915291600160401b9091046001600160401b03169060086149458361602f565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166149d457604051631afcd79f60e31b815260040160405180910390fd5b565b6149de61498b565b6149e781615091565b6149ef6150aa565b61202960608201356080830135614a0c60c0850160a086016157ef565b614a1c60e0860160c0870161604a565b61ffff16614a31610100870160e08801616063565b614a4361012088016101008901615a6e565b6150ba565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16614ad35760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106ce565b5f8051602061623983398151915242614af260408601602087016157ef565b6001600160401b031611614b645760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106ce565b614b7460408501602086016157ef565b6001600160401b0316614b8a6202a30042615c3a565b11614bfd5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106ce565b8335614c555760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106ce565b83355f90815260088201602052604090205415614cc55760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106ce565b6030614cd46040860186615fc2565b905014614d395760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106ce565b614d43835f6146ed565b5f80614ddc6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614d8791906157ef565b6001600160401b03168152602001614da260408a018a615fc2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250615342565b5f82815260068601602052604090209193509150614dfa82826160c7565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614e38908590600401615976565b6020604051808303815f875af1158015614e54573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e78919061593d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614ef057614ef0615808565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614fd0918e01908e016157ef565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156150215760405163cd78605960e01b81523060048201526024016106ce565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461506a576040519150601f19603f3d011682016040523d82523d5f602084013e61506f565b606091505b50509050806124eb57604051630a12f52160e11b815260040160405180910390fd5b61509961498b565b6150a1615446565b6120298161544e565b6150b261498b565b6149d46155c9565b6150c261498b565b5f805160206161f98339815191528361512e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106ce565b6127108411156151945760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106ce565b858711156151fc5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106ce565b5f8360ff16116152695760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106ce565b600a60ff841611156152db5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106ce565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146153ac5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106ce565b5f806001855f015186602001518760400151886080015189606001516040516020016153de9796959493929190616182565b60405160208183030381529060405290506002816040516153ff9190615c29565b602060405180830381855afa15801561541a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061543d919061593d565b94909350915050565b6149d461498b565b61545661498b565b80355f80516020616239833981519152908155601461547b6060840160408501616063565b60ff1611156154e85760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106ce565b5f6154f96060840160408501616063565b60ff16116155615760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106ce565b6155716060830160408401616063565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556155a260408301602084016157ef565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d5461498b565b5080546155dd90615d43565b5f825580601f106155ec575050565b601f0160209004905f5260205f20908101906120299190615644565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615658575f8155600101615645565b5090565b8015158114612029575f80fd5b803563ffffffff8116811461251c575f80fd5b5f805f6060848603121561568e575f80fd5b8335925060208401356156a08161565c565b91506156ae60408501615669565b90509250925092565b5f602082840312156156c7575f80fd5b5035919050565b5f61012082840312156156df575f80fd5b50919050565b803561ffff8116811461251c575f80fd5b80356001600160401b038116811461251c575f80fd5b5f805f6060848603121561571e575f80fd5b83356001600160401b03811115615733575f80fd5b840160608187031215615744575f80fd5b9250615752602085016156e5565b91506156ae604085016156f6565b5f60208284031215615770575f80fd5b610cc782615669565b5f806040838503121561578a575f80fd5b61579383615669565b946020939093013593505050565b5f80604083850312156157b2575f80fd5b82356001600160401b038111156157c7575f80fd5b8301608081860312156157d8575f80fd5b91506157e660208401615669565b90509250929050565b5f602082840312156157ff575f80fd5b610cc7826156f6565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061583f57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161587a60608401826001600160401b03169052565b50608083015161589560808401826001600160401b03169052565b5060a08301516158b060a08401826001600160401b03169052565b5060c08301516134f560c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156134f5576134f56158cb565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f6020828403121561594d575f80fd5b5051919050565b5f5b8381101561596e578181015183820152602001615956565b50505f910152565b602081525f8251806020840152615994816040850160208701615954565b601f01601f19169190910160400192915050565b5f826159c257634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612029575f80fd5b5f60208284031215615a7e575f80fd5b8135610cc781615a5a565b5f808335601e19843603018112615a9e575f80fd5b8301803591506001600160401b03821115615ab7575f80fd5b6020019150600581901b36038213156129d5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615af6575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b3657615b36615b00565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615b6457615b64615b00565b604052919050565b5f6001600160401b03821115615b8457615b84615b00565b50601f01601f191660200190565b5f60608236031215615ba2575f80fd5b615baa615b14565b823581526020615bbb8185016156f6565b8183015260408401356001600160401b03811115615bd7575f80fd5b840136601f820112615be7575f80fd5b8035615bfa615bf582615b6c565b615b3c565b8181523684838501011115615c0d575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615af6818460208701615954565b80820180821115610c9457610c946158cb565b5f63ffffffff808316818103615c6557615c656158cb565b6001019392505050565b8082028115828204841417610c9457610c946158cb565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156134f5576134f56158cb565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615d5757607f821691505b6020821081036156df57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615d8781615d43565b806020870152604060018084165f8114615da85760018114615dc457615df1565b60ff19851660408a0152604084151560051b8a01019550615df1565b895f5260205f205f5b85811015615de85781548b8201860152908301908801615dcd565b8a016040019650505b509398975050505050505050565b805161251c8161565c565b5f8060408385031215615e1b575f80fd5b82516001600160401b0380821115615e31575f80fd5b9084019060608287031215615e44575f80fd5b615e4c615b14565b82518152602080840151615e5f81615a5a565b82820152604084015183811115615e74575f80fd5b80850194505087601f850112615e88575f80fd5b83519250615e98615bf584615b6c565b8381528882858701011115615eab575f80fd5b615eba84838301848801615954565b80604084015250819550615ecf818801615dff565b9450505050509250929050565b81810381811115610c9457610c946158cb565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615fd7575f80fd5b8301803591506001600160401b03821115615ff0575f80fd5b6020019150368190038213156129d5575f80fd5b6001600160401b03818116838216028082169190828114616027576160276158cb565b505092915050565b5f6001600160401b03808316818103615c6557615c656158cb565b5f6020828403121561605a575f80fd5b610cc7826156e5565b5f60208284031215616073575f80fd5b813560ff81168114610cc7575f80fd5b601f8211156124eb57805f5260205f20601f840160051c810160208510156160a85750805b601f840160051c820191505b81811015610d67575f81556001016160b4565b81516001600160401b038111156160e0576160e0615b00565b6160f4816160ee8454615d43565b84616083565b602080601f831160018114616127575f84156161105750858301515b5f19600386901b1c1916600185901b17855561311e565b5f85815260208120601f198616915b8281101561615557888601518255948401946001909101908401616136565b508582101561617257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516161d781604e860160208901615954565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516163f73803806163f783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162aa8061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004615661565b61058b565b005b3480156101ea575f80fd5b506101dd6101f936600461569c565b6109ee565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd6102433660046156b3565b610ba7565b348015610253575f80fd5b5061026761026236600461569c565b610c84565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046156f1565b610c9a565b604051908152602001610220565b348015610305575f80fd5b506101dd610314366004615745565b610cce565b348015610324575f80fd5b506101dd61033336600461575e565b610d6e565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b366004615786565b6111fe565b34801561038b575f80fd5b506102ec61039a3660046157d4565b6117e1565b3480156103aa575f80fd5b506102676103b936600461569c565b6117fa565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb366004615661565b61180e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e36600461569c565b611a2a565b34801561042e575f80fd5b506101dd61043d36600461575e565b611b30565b34801561044d575f80fd5b506101dd61045c36600461569c565b611d13565b34801561046c575f80fd5b506101dd61047b366004615745565b61202c565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b436600461569c565b6121a2565b3480156104c4575f80fd5b506101dd6104d336600461569c565b612415565b6102ec6104e636600461569c565b6124f0565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e61051936600461569c565b612521565b6040516102209190615801565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b36600461569c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f8051602061623e83398151915260205260408082208151610100810190925280545f805160206161de83398151915293929190829060ff1660038111156105d9576105d96157ed565b60038111156105ea576105ea6157ed565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61066e82612521565b9050600283516003811115610685576106856157ed565b146106d75760405162461bcd60e51b815260206004820152602a60248201525f805160206161fe8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461073c5760405162461bcd60e51b815260206004820152603360248201525f805160206161fe8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106ce565b6003835280515f906002906005811115610758576107586157ed565b036107af5786156107705761076d83876125e9565b90505b5f8460600151836080015161078591906158c4565b90506107918482612885565b506001600160401b0390811660e0870152421660a0860152506107e3565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561081686606001516117e1565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b815260040161084a97969594939291906158e4565b602060405180830381865afa158015610865573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108899190615922565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360038111156108c8576108c86157ed565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109dc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061627e8339815191526020526040808220815160e0810190925280545f8051602061621e83398151915293929190829060ff166005811115610a3b57610a3b6157ed565b6005811115610a4c57610a4c6157ed565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abb57610abb6157ed565b14610b205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb610b458584606001515f6129dc565b6040518263ffffffff1660e01b8152600401610b61919061595b565b6020604051808303815f875af1158015610b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba19190615922565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c3883612a2b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9464e8d4a510008361598d565b92915050565b5f610ca3612a3c565b610caf84848434612a73565b9050610cc760015f8051602061625e83398151915255565b9392505050565b5f805160206161de8339815191525f80610ce784612d67565b91509150610cf482613085565b610cfe5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d2c57610d2c6157ed565b03610d51575f83815260088501602052604081208054919055610d4f82826130c0565b505b610d6781610d6284604001516117e1565b613126565b5050505050565b5f8181525f8051602061623e83398151915260205260408082208151610100810190925280545f805160206161de83398151915293929190829060ff166003811115610dbc57610dbc6157ed565b6003811115610dcd57610dcd6157ed565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e5290612521565b9050600182516003811115610e6957610e696157ed565b14610ed25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106ce565b600381516005811115610ee757610ee76157ed565b0361105f57600380835260c0820180516001600160401b0390811660808601529051811660a085015260608301511660e08401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610f4b57610f4b6157ed565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115611074576110746157ed565b0361108257610d6784613139565b5f61108c86613336565b90505f8061109d83604001516134fc565b5091509150818560400151146110c55760405162461bcd60e51b81526004016106ce906159ac565b806001600160401b031684606001516001600160401b031610156111365760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106ce565b806001600160401b03168560c001516001600160401b0316111561116c5760405162461bcd60e51b81526004016106ce906159f6565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061621e8339815191529060ff161561129b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113029190615922565b8360200135146113645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106ce565b306113756060850160408601615a53565b6001600160a01b0316146113e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106ce565b5f6113f56060850185615a6e565b905090505f805b828163ffffffff1610156116e5575f6114186060880188615a6e565b8363ffffffff1681811061142e5761142e615ab3565b90506020028101906114409190615ac7565b61144990615b77565b80515f81815260088801602052604090205491925090156114c15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106ce565b5f6002895f0135856040516020016114f092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150a91615c0e565b602060405180830381855afa158015611525573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115489190615922565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d4576115d46157ed565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611687911686615c1f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116de90615c32565b90506113fc565b50600483018190555f6116f785613336565b90505f6117078260400151613737565b90505f611713886138a9565b9050816002826040516117269190615c0e565b602060405180830381855afa158015611741573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906117649190615922565b146117c85760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106ce565b5050506009909201805460ff1916600117905550505050565b5f610c946001600160401b03831664e8d4a51000615c54565b5f61180482612521565b6080015192915050565b5f805160206161de8339815191525f61182685613d42565b905061183185613085565b61183c575050505050565b5f8581526005830160205260409020546001600160a01b031633146118735760405162461bcd60e51b81526004016106ce90615c6b565b5f85815260058301602052604090205460a08201516118a291600160b01b90046001600160401b031690615cbd565b6001600160401b03168160c001516001600160401b031610156119235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106ce565b8315610d67575f61193486856125e9565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198b906117e1565b60a085015160c08601516040516001600160e01b031960e086901b1681526119bf939291829188905f9081906004016158e4565b602060405180830381865afa1580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe9190615922565b5f87815260088501602052604081208054909190611a1d908490615c1f565b9091555050505050505050565b5f805160206161de8339815191525f611a4283612521565b9050600481516005811115611a5957611a596157ed565b14611ac35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106ce565b5f8381526005830160205260409020546001600160a01b03163314611afa5760405162461bcd60e51b81526004016106ce90615c6b565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba1906001600160a01b0316826130c0565b611b38612a3c565b5f8181525f8051602061623e83398151915260205260408082208151610100810190925280545f805160206161de83398151915293929190829060ff166003811115611b8657611b866157ed565b6003811115611b9757611b976157ed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c1385613336565b90505f80611c2483604001516134fc565b509150915081846040015114611c4c5760405162461bcd60e51b81526004016106ce906159ac565b806001600160401b03168460e001516001600160401b03161115611c825760405162461bcd60e51b81526004016106ce906159f6565b600384516003811115611c9757611c976157ed565b14611ceb5760405162461bcd60e51b815260206004820152603160248201525f805160206161fe8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106ce565b611cf486613139565b5050505050611d0f60015f8051602061625e83398151915255565b5050565b611d1b612a3c565b5f8181525f8051602061623e83398151915260205260408082208151610100810190925280545f805160206161de83398151915293929190829060ff166003811115611d6957611d696157ed565b6003811115611d7a57611d7a6157ed565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611dfe82612521565b90505f83516003811115611e1457611e146157ed565b03611e725760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152671bdd08199bdd5b9960c21b60648201526084016106ce565b600481516005811115611e8757611e876157ed565b14611eea5760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106ce565b600183516003811115611eff57611eff6157ed565b03611f1657611f0d85613139565b50505050612013565b600283516003811115611f2b57611f2b6157ed565b03612005578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611f6385606001516117e1565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611fb596959493926001600160401b03909216919081906004016158e4565b602060405180830381865afa158015611fd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff49190615922565b5f8681526007860160205260409020555b61200e85613139565b505050505b61202960015f8051602061625e83398151915255565b50565b5f8051602061621e8339815191525f61204483613336565b90505f806120558360400151613fbd565b91509150806120b75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106ce565b60015f83815260078601602052604090205460ff1660058111156120dd576120dd6157ed565b146120fa5760405162461bcd60e51b81526004016106ce90615cdd565b5f8281526006850160205260408120612112916155b6565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061623e83398151915260205260408082208151610100810190925280545f805160206161de83398151915293929190829060ff1660038111156121f0576121f06157ed565b6003811115612201576122016157ed565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516003811115612288576122886157ed565b14806122a657506003815160038111156122a4576122a46157ed565b145b6122fa5760405162461bcd60e51b815260206004820152603260248201525f805160206161fe833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106ce565b5f6123088260400151612521565b905080606001516001600160401b03165f0361238c5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb6123b98460400151846060015185608001516129dc565b6040518263ffffffff1660e01b81526004016123d5919061595b565b6020604051808303815f875af11580156123f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d679190615922565b5f8181525f8051602061627e83398151915260205260409020545f8051602061621e8339815191529060019060ff166005811115612455576124556157ed565b146124725760405162461bcd60e51b81526004016106ce90615cdd565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916124ab9190600401615d5a565b6020604051808303815f875af11580156124c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124eb9190615922565b505050565b5f6124f9612a3c565b61250482333461415e565b905061251c60015f8051602061625e83398151915255565b919050565b6125296155ed565b5f8281525f8051602061627e833981519152602052604090819020815160e0810190925280545f8051602061621e833981519152929190829060ff166005811115612576576125766157ed565b6005811115612587576125876157ed565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612634573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261265b9190810190615def565b91509150806126be5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612701573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127259190615922565b8251146127895760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106ce565b60208201516001600160a01b0316156127ff5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106ce565b5f8061280e8460400151614515565b9150915081871461287b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106ce565b9695505050505050565b5f8281525f8051602061627e833981519152602052604081206002015481905f8051602061621e83398151915290600160801b90046001600160401b03166128cd85826146ed565b5f6128d7876148fb565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129278a858b6129dc565b6040518263ffffffff1660e01b8152600401612943919061595b565b6020604051808303815f875af115801561295f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129839190615922565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612a33614970565b612029816149bb565b5f8051602061625e833981519152805460011901612a6d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206161de8339815191529061ffff86161015612afa5760405162461bcd60e51b815260206004820152602b60248201525f805160206161fe83398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106ce565b61271061ffff86161115612b525760405162461bcd60e51b815260206004820152602c60248201525f805160206161fe83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106ce565b60028101546001600160401b039081169085161015612bcb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106ce565b8054831015612c2e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106ce565b8060010154831115612c955760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106ce565b825f612ca082610c84565b90505f612cad8983614a2d565b90506040518060600160405280612cc13390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061625e83398151915255565b5f612d706155ed565b5f8051602061621e8339815191525f612d8885613336565b90505f80612d998360400151613fbd565b915091508015612dfe5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106ce565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612e2f57612e2f6157ed565b6005811115612e4057612e406157ed565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612eaf57612eaf6157ed565b1480612ecd5750600181516005811115612ecb57612ecb6157ed565b145b612f2c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106ce565b600381516005811115612f4157612f416157ed565b03612f4f5760048152612f54565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f9957612f996157ed565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561304d5761304d6157ed565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561310c575f80fd5b505af115801561311e573d5f803e3d5ffd5b505050505050565b611d0f6001600160a01b03831682614fe3565b5f8181525f8051602061623e83398151915260205260408082208151610100810190925280545f805160206161de83398151915293929190829060ff166003811115613187576131876157ed565b6003811115613198576131986157ed565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061328c90600160a01b900461ffff1684615c54565b613296919061598d565b905080856008015f8581526020019081526020015f205f8282546132ba9190615c1f565b909155505f90506132cb8284615ec1565b90506132db8560200151826130c0565b6132f08560200151610d6287606001516117e1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561339a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526133c19190810190615def565b91509150806134215760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106ce565b8151156134825760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106ce565b60208201516001600160a01b0316156134f55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106ce565b5092915050565b5f805f83516036146135205760405162461bcd60e51b81526004016106ce90615ed4565b5f805b600281101561356f57613537816001615ec1565b613542906008615c54565b61ffff1686828151811061355857613558615ab3565b016020015160f81c901b9190911790600101613523565b5061ffff8116156135925760405162461bcd60e51b81526004016106ce90615f1d565b5f805b60048110156135ed576135a9816003615ec1565b6135b4906008615c54565b63ffffffff16876135c6836002615c1f565b815181106135d6576135d6615ab3565b016020015160f81c901b9190911790600101613595565b5063ffffffff81166004146136145760405162461bcd60e51b81526004016106ce90615f60565b5f805b60208110156136695761362b81601f615ec1565b613636906008615c54565b88613642836006615c1f565b8151811061365257613652615ab3565b016020015160f81c901b9190911790600101613617565b505f805b60088110156136c857613681816007615ec1565b61368c906008615c54565b6001600160401b0316896136a1836026615c1f565b815181106136b1576136b1615ab3565b016020015160f81c901b919091179060010161366d565b505f805b6008811015613727576136e0816007615ec1565b6136eb906008615c54565b6001600160401b03168a61370083602e615c1f565b8151811061371057613710615ab3565b016020015160f81c901b91909117906001016136cc565b5091989097509095509350505050565b5f81516026146137595760405162461bcd60e51b81526004016106ce90615ed4565b5f805b60028110156137a857613770816001615ec1565b61377b906008615c54565b61ffff1684828151811061379157613791615ab3565b016020015160f81c901b919091179060010161375c565b5061ffff8116156137cb5760405162461bcd60e51b81526004016106ce90615f1d565b5f805b6004811015613826576137e2816003615ec1565b6137ed906008615c54565b63ffffffff16856137ff836002615c1f565b8151811061380f5761380f615ab3565b016020015160f81c901b91909117906001016137ce565b5063ffffffff81161561384b5760405162461bcd60e51b81526004016106ce90615f60565b5f805b60208110156138a05761386281601f615ec1565b61386d906008615c54565b86613879836006615c1f565b8151811061388957613889615ab3565b016020015160f81c901b919091179060010161384e565b50949350505050565b60605f6138b883830184615a6e565b6138c491506058615c54565b6138cf90605c615c1f565b6001600160401b038111156138e6576138e6615ae5565b6040519080825280601f01601f191660200182016040528015613910576020820181803683370190505b5090505f5b6020811015613965578335816020811061393157613931615ab3565b1a60f81b82828151811061394757613947615ab3565b60200101906001600160f81b03191690815f1a905350600101613915565b505f5b60208110156139c5578360200135816020811061398757613987615ab3565b1a60f81b82613997836020615c1f565b815181106139a7576139a7615ab3565b60200101906001600160f81b03191690815f1a905350600101613968565b505f5b6004811015613a28576139dc816003615ec1565b6139e7906008615c54565b6014901c60f81b826139fa836040615c1f565b81518110613a0a57613a0a615ab3565b60200101906001600160f81b03191690815f1a9053506001016139c8565b505f613a3a6060850160408601615a53565b60601b90505f5b6014811015613a9a57818160148110613a5c57613a5c615ab3565b1a60f81b83613a6c836044615c1f565b81518110613a7c57613a7c615ab3565b60200101906001600160f81b03191690815f1a905350600101613a41565b505f613aa96060860186615a6e565b905090505f5b6004811015613b1457613ac3816003615ec1565b613ace906008615c54565b63ffffffff8316901c60f81b84613ae6836058615c1f565b81518110613af657613af6615ab3565b60200101906001600160f81b03191690815f1a905350600101613aaf565b505f5b613b246060870187615a6e565b9050811015613d38575f613b39826058615c54565b613b4490605c615c1f565b90505f5b6020811015613bcf57613b5e6060890189615a6e565b84818110613b6e57613b6e615ab3565b9050602002810190613b809190615ac7565b358160208110613b9257613b92615ab3565b1a60f81b86613ba18385615c1f565b81518110613bb157613bb1615ab3565b60200101906001600160f81b03191690815f1a905350600101613b48565b505f5b6008811015613c8457613be6816007615ec1565b613bf1906008615c54565b613bfe60608a018a615a6e565b85818110613c0e57613c0e615ab3565b9050602002810190613c209190615ac7565b613c319060408101906020016157d4565b6001600160401b0316901c60f81b8682613c4c856020615c1f565b613c569190615c1f565b81518110613c6657613c66615ab3565b60200101906001600160f81b03191690815f1a905350600101613bd2565b505f5b6030811015613d2e57613c9d6060890189615a6e565b84818110613cad57613cad615ab3565b9050602002810190613cbf9190615ac7565b613ccd906040810190615fa7565b82818110613cdd57613cdd615ab3565b9050013560f81c60f81b8682846028613cf69190615c1f565b613d009190615c1f565b81518110613d1057613d10615ab3565b60200101906001600160f81b03191690815f1a905350600101613c87565b5050600101613b17565b5091949350505050565b613d4a6155ed565b5f8281525f8051602061627e8339815191526020526040808220815160e0810190925280545f8051602061621e83398151915293929190829060ff166005811115613d9757613d976157ed565b6005811115613da857613da86157ed565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e1a57613e1a6157ed565b14613e765760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106ce565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613eba57613eba6157ed565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f668582612885565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613fe05760405162461bcd60e51b81526004016106ce90615ed4565b5f805b600281101561402f57613ff7816001615ec1565b614002906008615c54565b61ffff1685828151811061401857614018615ab3565b016020015160f81c901b9190911790600101613fe3565b5061ffff8116156140525760405162461bcd60e51b81526004016106ce90615f1d565b5f805b60048110156140ad57614069816003615ec1565b614074906008615c54565b63ffffffff1686614086836002615c1f565b8151811061409657614096615ab3565b016020015160f81c901b9190911790600101614055565b5063ffffffff81166003146140d45760405162461bcd60e51b81526004016106ce90615f60565b5f805b6020811015614129576140eb81601f615ec1565b6140f6906008615c54565b87614102836006615c1f565b8151811061411257614112615ab3565b016020015160f81c901b91909117906001016140d7565b505f8660268151811061413e5761413e615ab3565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206161de8339815191528161417784610c84565b90505f61418387612521565b905061418e87613085565b6141eb5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106ce565b600281516005811115614200576142006157ed565b1461425f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106ce565b5f8282608001516142709190615cbd565b60048501546040840151919250614292916001600160401b0390911690615fe9565b6001600160401b0316816001600160401b031611156143115760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106ce565b5f8061431d8a84612885565b915091505f8a8360405160200161434b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360038111156143e6576143e66157ed565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146145385760405162461bcd60e51b81526004016106ce90615ed4565b5f805b60028110156145875761454f816001615ec1565b61455a906008615c54565b61ffff1685828151811061457057614570615ab3565b016020015160f81c901b919091179060010161453b565b5061ffff8116156145aa5760405162461bcd60e51b81526004016106ce90615f1d565b5f805b6004811015614605576145c1816003615ec1565b6145cc906008615c54565b63ffffffff16866145de836002615c1f565b815181106145ee576145ee615ab3565b016020015160f81c901b91909117906001016145ad565b5063ffffffff811660051461462c5760405162461bcd60e51b81526004016106ce90615f60565b5f805b60208110156146815761464381601f615ec1565b61464e906008615c54565b8761465a836006615c1f565b8151811061466a5761466a615ab3565b016020015160f81c901b919091179060010161462f565b505f805b60088110156146e057614699816007615ec1565b6146a4906008615c54565b6001600160401b0316886146b9836026615c1f565b815181106146c9576146c9615ab3565b016020015160f81c901b9190911790600101614685565b5090969095509350505050565b5f8051602061621e8339815191525f6001600160401b0380841690851611156147215761471a83856158c4565b905061472e565b61472b84846158c4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061479057506001840154815161478c916001600160401b031690615c1f565b8210155b156147b6576001600160401b0383166060820152818152604081015160208201526147d5565b82816060018181516147c89190615cbd565b6001600160401b03169052505b60608101516147e5906064615fe9565b602082015160018601546001600160401b0392909216916148109190600160401b900460ff16615c54565b10156148745760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106ce565b856001600160401b03168160400181815161488f9190615c1f565b9052506040810180516001600160401b03871691906148af908390615ec1565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061627e8339815191526020526040812060020180545f8051602061621e833981519152919060089061494590600160401b90046001600160401b0316616014565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166149b957604051631afcd79f60e31b815260040160405180910390fd5b565b6149c3614970565b6149cc81615076565b6149d461508f565b612029606082013560808301356149f160c0850160a086016157d4565b614a0160e0860160c0870161602f565b61ffff16614a16610100870160e08801616048565b614a2861012088016101008901615a53565b61509f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16614ab85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106ce565b5f8051602061621e83398151915242614ad760408601602087016157d4565b6001600160401b031611614b495760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106ce565b614b5960408501602086016157d4565b6001600160401b0316614b6f6202a30042615c1f565b11614be25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106ce565b8335614c3a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106ce565b83355f90815260088201602052604090205415614caa5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106ce565b6030614cb96040860186615fa7565b905014614d1e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106ce565b614d28835f6146ed565b5f80614dc16040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614d6c91906157d4565b6001600160401b03168152602001614d8760408a018a615fa7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250615327565b5f82815260068601602052604090209193509150614ddf82826160ac565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614e1d90859060040161595b565b6020604051808303815f875af1158015614e39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e5d9190615922565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614ed557614ed56157ed565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614fb5918e01908e016157d4565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156150065760405163cd78605960e01b81523060048201526024016106ce565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461504f576040519150601f19603f3d011682016040523d82523d5f602084013e615054565b606091505b50509050806124eb57604051630a12f52160e11b815260040160405180910390fd5b61507e614970565b61508661542b565b61202981615433565b615097614970565b6149b96155ae565b6150a7614970565b5f805160206161de833981519152836151135760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106ce565b6127108411156151795760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106ce565b858711156151e15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106ce565b5f8360ff161161524e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106ce565b600a60ff841611156152c05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106ce565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146153915760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106ce565b5f806001855f015186602001518760400151886080015189606001516040516020016153c39796959493929190616167565b60405160208183030381529060405290506002816040516153e49190615c0e565b602060405180830381855afa1580156153ff573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906154229190615922565b94909350915050565b6149b9614970565b61543b614970565b80355f8051602061621e83398151915290815560146154606060840160408501616048565b60ff1611156154cd5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106ce565b5f6154de6060840160408501616048565b60ff16116155465760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106ce565b6155566060830160408401616048565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561558760408301602084016157d4565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d54614970565b5080546155c290615d28565b5f825580601f106155d1575050565b601f0160209004905f5260205f20908101906120299190615629565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561563d575f815560010161562a565b5090565b8015158114612029575f80fd5b803563ffffffff8116811461251c575f80fd5b5f805f60608486031215615673575f80fd5b83359250602084013561568581615641565b91506156936040850161564e565b90509250925092565b5f602082840312156156ac575f80fd5b5035919050565b5f61012082840312156156c4575f80fd5b50919050565b803561ffff8116811461251c575f80fd5b80356001600160401b038116811461251c575f80fd5b5f805f60608486031215615703575f80fd5b83356001600160401b03811115615718575f80fd5b840160608187031215615729575f80fd5b9250615737602085016156ca565b9150615693604085016156db565b5f60208284031215615755575f80fd5b610cc78261564e565b5f806040838503121561576f575f80fd5b6157788361564e565b946020939093013593505050565b5f8060408385031215615797575f80fd5b82356001600160401b038111156157ac575f80fd5b8301608081860312156157bd575f80fd5b91506157cb6020840161564e565b90509250929050565b5f602082840312156157e4575f80fd5b610cc7826156db565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061582457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161585f60608401826001600160401b03169052565b50608083015161587a60808401826001600160401b03169052565b5060a083015161589560a08401826001600160401b03169052565b5060c08301516134f560c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156134f5576134f56158b0565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615932575f80fd5b5051919050565b5f5b8381101561595357818101518382015260200161593b565b50505f910152565b602081525f8251806020840152615979816040850160208701615939565b601f01601f19169190910160400192915050565b5f826159a757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612029575f80fd5b5f60208284031215615a63575f80fd5b8135610cc781615a3f565b5f808335601e19843603018112615a83575f80fd5b8301803591506001600160401b03821115615a9c575f80fd5b6020019150600581901b36038213156129d5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615adb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b1b57615b1b615ae5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615b4957615b49615ae5565b604052919050565b5f6001600160401b03821115615b6957615b69615ae5565b50601f01601f191660200190565b5f60608236031215615b87575f80fd5b615b8f615af9565b823581526020615ba08185016156db565b8183015260408401356001600160401b03811115615bbc575f80fd5b840136601f820112615bcc575f80fd5b8035615bdf615bda82615b51565b615b21565b8181523684838501011115615bf2575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615adb818460208701615939565b80820180821115610c9457610c946158b0565b5f63ffffffff808316818103615c4a57615c4a6158b0565b6001019392505050565b8082028115828204841417610c9457610c946158b0565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156134f5576134f56158b0565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615d3c57607f821691505b6020821081036156c457634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615d6c81615d28565b806020870152604060018084165f8114615d8d5760018114615da957615dd6565b60ff19851660408a0152604084151560051b8a01019550615dd6565b895f5260205f205f5b85811015615dcd5781548b8201860152908301908801615db2565b8a016040019650505b509398975050505050505050565b805161251c81615641565b5f8060408385031215615e00575f80fd5b82516001600160401b0380821115615e16575f80fd5b9084019060608287031215615e29575f80fd5b615e31615af9565b82518152602080840151615e4481615a3f565b82820152604084015183811115615e59575f80fd5b80850194505087601f850112615e6d575f80fd5b83519250615e7d615bda84615b51565b8381528882858701011115615e90575f80fd5b615e9f84838301848801615939565b80604084015250819550615eb4818801615de4565b9450505050509250929050565b81810381811115610c9457610c946158b0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615fbc575f80fd5b8301803591506001600160401b03821115615fd5575f80fd5b6020019150368190038213156129d5575f80fd5b6001600160401b0381811683821602808216919082811461600c5761600c6158b0565b505092915050565b5f6001600160401b03808316818103615c4a57615c4a6158b0565b5f6020828403121561603f575f80fd5b610cc7826156ca565b5f60208284031215616058575f80fd5b813560ff81168114610cc7575f80fd5b601f8211156124eb57805f5260205f20601f840160051c8101602085101561608d5750805b601f840160051c820191505b81811015610d67575f8155600101616099565b81516001600160401b038111156160c5576160c5615ae5565b6160d9816160d38454615d28565b84616068565b602080601f83116001811461610c575f84156160f55750858301515b5f19600386901b1c1916600185901b17855561311e565b5f85815260208120601f198616915b8281101561613a5788860151825594840194600190910190840161611b565b508582101561615757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516161bc81604e860160208901615939565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 bbd47d483..b4e022c47 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -72,7 +72,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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"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\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161389238038061389283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6137458061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806397fb70d4116100a9578063d588c18f1161006e578063d588c18f14610290578063d5f20ff6146102a3578063df93d8de146102c3578063e7d14c1c146102cd578063f2fde38b1461030b575f80fd5b806397fb70d414610241578063a3a65e4814610254578063b771b3bc14610267578063bee0a03f14610275578063c974d1b614610288575f80fd5b8063715018a6116100ef578063715018a6146101b3578063732214f8146101bb5780638280a25a146101d05780638994ab49146101ea5780638da5cb5b146101fd575f80fd5b80630322ed981461012b578063467ef06f1461014057806360305d621461015357806361e2f4901461017557806366435abf14610188575b5f80fd5b61013e610139366004612cfb565b61031e565b005b61013e61014e366004612d2a565b6104dc565b61015b601481565b60405163ffffffff90911681526020015b60405180910390f35b61013e610183366004612d43565b6104ea565b61019b610196366004612cfb565b610acd565b6040516001600160401b03909116815260200161016c565b61013e610ae1565b6101c25f81565b60405190815260200161016c565b6101d8603081565b60405160ff909116815260200161016c565b6101c26101f8366004612dbd565b610af4565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161016c565b61013e61024f366004612cfb565b610b10565b61013e610262366004612d2a565b610b25565b6102296005600160991b0181565b61013e610283366004612cfb565b610c9b565b6101d8601481565b61013e61029e366004612e12565b610d71565b6102b66102b1366004612cfb565b610e7f565b60405161016c9190612e5c565b61019b6202a30081565b6101c26102db366004612cfb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61013e610319366004612f0b565b610f47565b5f8181525f805160206137198339815191526020526040808220815160e0810190925280545f805160206136f983398151915293929190829060ff16600581111561036b5761036b612e48565b600581111561037c5761037c612e48565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb612e48565b146104555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61047a8584606001515f610f84565b6040518263ffffffff1660e01b81526004016104969190612f4f565b6020604051808303815f875af11580156104b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d69190612f81565b50505050565b6104e581610fd3565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206136f98339815191529060ff16156105875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161044c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ee9190612f81565b8360200135146106505760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161044c565b306106616060850160408601612f0b565b6001600160a01b0316146106d35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161044c565b5f6106e16060850185612f98565b905090505f805b828163ffffffff1610156109d1575f6107046060880188612f98565b8363ffffffff1681811061071a5761071a612fdd565b905060200281019061072c9190612ff1565b610735906130a1565b80515f81815260088801602052604090205491925090156107ad5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161044c565b5f6002895f0135856040516020016107dc92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526107f691613138565b602060405180830381855afa158015610811573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108349190612f81565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156108c0576108c0612e48565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161097391168661315d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806109ca90613170565b90506106e8565b50600483018190555f6109e3856112f1565b90505f6109f382604001516114b7565b90505f6109ff88611629565b905081600282604051610a129190613138565b602060405180830381855afa158015610a2d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a509190612f81565b14610ab45760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161044c565b5050506009909201805460ff1916600117905550505050565b5f610ad782610e7f565b6080015192915050565b610ae9611ac2565b610af25f611b1d565b565b5f610afd611ac2565b610b078383611b8d565b90505b92915050565b610b18611ac2565b610b2181612143565b5050565b5f805160206136f98339815191525f610b3d836112f1565b90505f80610b4e83604001516123be565b9150915080610bb05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044c565b60015f83815260078601602052604090205460ff166005811115610bd657610bd6612e48565b14610bf35760405162461bcd60e51b815260040161044c90613192565b5f8281526006850160205260408120610c0b91612c70565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061371983398151915260205260409020545f805160206136f98339815191529060019060ff166005811115610cdb57610cdb612e48565b14610cf85760405162461bcd60e51b815260040161044c90613192565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d31919060040161320f565b6020604051808303815f875af1158015610d4d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e59190612f81565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610db55750825b90505f826001600160401b03166001148015610dd05750303b155b905081158015610dde575080155b15610dfc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e2657845460ff60401b1916600160401b1785555b610e30878761255f565b8315610e7657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e87612ca7565b5f8281525f80516020613719833981519152602052604090819020815160e0810190925280545f805160206136f9833981519152929190829060ff166005811115610ed457610ed4612e48565b6005811115610ee557610ee5612e48565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610f4f611ac2565b6001600160a01b038116610f7857604051631e4fbdf760e01b81525f600482015260240161044c565b610f8181611b1d565b50565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f610fdc612ca7565b5f805160206136f98339815191525f610ff4856112f1565b90505f8061100583604001516123be565b91509150801561106a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044c565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561109b5761109b612e48565b60058111156110ac576110ac612e48565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561111b5761111b612e48565b1480611139575060018151600581111561113757611137612e48565b145b6111985760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044c565b6003815160058111156111ad576111ad612e48565b036111bb57600481526111c0565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561120557611205612e48565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156112b9576112b9612e48565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611355573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261137c91908101906132a8565b91509150806113dc5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161044c565b81511561143d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044c565b60208201516001600160a01b0316156114b05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044c565b5092915050565b5f81516026146114d95760405162461bcd60e51b815260040161044c9061337a565b5f805b6002811015611528576114f08160016133c3565b6114fb9060086133d6565b61ffff1684828151811061151157611511612fdd565b016020015160f81c901b91909117906001016114dc565b5061ffff81161561154b5760405162461bcd60e51b815260040161044c906133ed565b5f805b60048110156115a6576115628160036133c3565b61156d9060086133d6565b63ffffffff168561157f83600261315d565b8151811061158f5761158f612fdd565b016020015160f81c901b919091179060010161154e565b5063ffffffff8116156115cb5760405162461bcd60e51b815260040161044c90613430565b5f805b6020811015611620576115e281601f6133c3565b6115ed9060086133d6565b866115f983600661315d565b8151811061160957611609612fdd565b016020015160f81c901b91909117906001016115ce565b50949350505050565b60605f61163883830184612f98565b611644915060586133d6565b61164f90605c61315d565b6001600160401b038111156116665761166661300f565b6040519080825280601f01601f191660200182016040528015611690576020820181803683370190505b5090505f5b60208110156116e557833581602081106116b1576116b1612fdd565b1a60f81b8282815181106116c7576116c7612fdd565b60200101906001600160f81b03191690815f1a905350600101611695565b505f5b6020811015611745578360200135816020811061170757611707612fdd565b1a60f81b8261171783602061315d565b8151811061172757611727612fdd565b60200101906001600160f81b03191690815f1a9053506001016116e8565b505f5b60048110156117a85761175c8160036133c3565b6117679060086133d6565b6014901c60f81b8261177a83604061315d565b8151811061178a5761178a612fdd565b60200101906001600160f81b03191690815f1a905350600101611748565b505f6117ba6060850160408601612f0b565b60601b90505f5b601481101561181a578181601481106117dc576117dc612fdd565b1a60f81b836117ec83604461315d565b815181106117fc576117fc612fdd565b60200101906001600160f81b03191690815f1a9053506001016117c1565b505f6118296060860186612f98565b905090505f5b6004811015611894576118438160036133c3565b61184e9060086133d6565b63ffffffff8316901c60f81b8461186683605861315d565b8151811061187657611876612fdd565b60200101906001600160f81b03191690815f1a90535060010161182f565b505f5b6118a46060870187612f98565b9050811015611ab8575f6118b98260586133d6565b6118c490605c61315d565b90505f5b602081101561194f576118de6060890189612f98565b848181106118ee576118ee612fdd565b90506020028101906119009190612ff1565b35816020811061191257611912612fdd565b1a60f81b86611921838561315d565b8151811061193157611931612fdd565b60200101906001600160f81b03191690815f1a9053506001016118c8565b505f5b6008811015611a04576119668160076133c3565b6119719060086133d6565b61197e60608a018a612f98565b8581811061198e5761198e612fdd565b90506020028101906119a09190612ff1565b6119b1906040810190602001613477565b6001600160401b0316901c60f81b86826119cc85602061315d565b6119d6919061315d565b815181106119e6576119e6612fdd565b60200101906001600160f81b03191690815f1a905350600101611952565b505f5b6030811015611aae57611a1d6060890189612f98565b84818110611a2d57611a2d612fdd565b9050602002810190611a3f9190612ff1565b611a4d906040810190613490565b82818110611a5d57611a5d612fdd565b9050013560f81c60f81b8682846028611a76919061315d565b611a80919061315d565b81518110611a9057611a90612fdd565b60200101906001600160f81b03191690815f1a905350600101611a07565b5050600101611897565b5091949350505050565b33611af47f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610af25760405163118cdaa760e01b815233600482015260240161044c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611c185760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161044c565b5f805160206136f983398151915242611c376040860160208701613477565b6001600160401b031611611ca95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161044c565b611cb96040850160208601613477565b6001600160401b0316611ccf6202a3004261315d565b11611d425760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161044c565b8335611d9a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044c565b83355f90815260088201602052604090205415611e0a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161044c565b6030611e196040860186613490565b905014611e7e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044c565b611e88835f612579565b5f80611f216040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611ecc9190613477565b6001600160401b03168152602001611ee760408a018a613490565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612787565b5f82815260068601602052604090209193509150611f3f828261351d565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90611f7d908590600401612f4f565b6020604051808303815f875af1158015611f99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fbd9190612f81565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561203557612035612e48565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91612115918e01908e01613477565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61214b612ca7565b5f8281525f805160206137198339815191526020526040808220815160e0810190925280545f805160206136f983398151915293929190829060ff16600581111561219857612198612e48565b60058111156121a9576121a9612e48565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561221b5761221b612e48565b146122775760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044c565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156122bb576122bb612e48565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612367858261288b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146123e15760405162461bcd60e51b815260040161044c9061337a565b5f805b6002811015612430576123f88160016133c3565b6124039060086133d6565b61ffff1685828151811061241957612419612fdd565b016020015160f81c901b91909117906001016123e4565b5061ffff8116156124535760405162461bcd60e51b815260040161044c906133ed565b5f805b60048110156124ae5761246a8160036133c3565b6124759060086133d6565b63ffffffff168661248783600261315d565b8151811061249757612497612fdd565b016020015160f81c901b9190911790600101612456565b5063ffffffff81166003146124d55760405162461bcd60e51b815260040161044c90613430565b5f805b602081101561252a576124ec81601f6133c3565b6124f79060086133d6565b8761250383600661315d565b8151811061251357612513612fdd565b016020015160f81c901b91909117906001016124d8565b505f8660268151811061253f5761253f612fdd565b016020015191976001600160f81b03199092161515965090945050505050565b6125676129e2565b61257082612a2b565b610b2181612a44565b5f805160206136f98339815191525f6001600160401b0380841690851611156125ad576125a683856135dc565b90506125ba565b6125b784846135dc565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061261c575060018401548151612618916001600160401b03169061315d565b8210155b15612642576001600160401b038316606082015281815260408101516020820152612661565b828160600181815161265491906135fc565b6001600160401b03169052505b606081015161267190606461361c565b602082015160018601546001600160401b03929092169161269c9190600160401b900460ff166133d6565b10156127005760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161044c565b856001600160401b03168160400181815161271b919061315d565b9052506040810180516001600160401b038716919061273b9083906133c3565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146127f15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044c565b5f806001855f015186602001518760400151886080015189606001516040516020016128239796959493929190613647565b60405160208183030381529060405290506002816040516128449190613138565b602060405180830381855afa15801561285f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128829190612f81565b94909350915050565b5f8281525f80516020613719833981519152602052604081206002015481905f805160206136f983398151915290600160801b90046001600160401b03166128d38582612579565b5f6128dd87612a55565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61292d8a858b610f84565b6040518263ffffffff1660e01b81526004016129499190612f4f565b6020604051808303815f875af1158015612965573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129899190612f81565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610af257604051631afcd79f60e31b815260040160405180910390fd5b612a336129e2565b612a3b612ae5565b610f8181612aed565b612a4c6129e2565b610f8181612c68565b5f8181525f805160206137198339815191526020526040812060020180545f805160206136f983398151915291600160401b9091046001600160401b0316906008612a9f836136bd565b82546101009290920a6001600160401b038181021990931691831602179091555f94855260079290920160205250604090922060020154600160401b9004909116919050565b610af26129e2565b612af56129e2565b80355f805160206136f98339815191529081556014612b1a60608401604085016136d8565b60ff161115612b875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161044c565b5f612b9860608401604085016136d8565b60ff1611612c005760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161044c565b612c1060608301604084016136d8565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612c416040830160208401613477565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610f4f6129e2565b508054612c7c906131dd565b5f825580601f10612c8b575050565b601f0160209004905f5260205f2090810190610f819190612ce3565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612cf7575f8155600101612ce4565b5090565b5f60208284031215612d0b575f80fd5b5035919050565b803563ffffffff81168114612d25575f80fd5b919050565b5f60208284031215612d3a575f80fd5b610b0782612d12565b5f8060408385031215612d54575f80fd5b82356001600160401b03811115612d69575f80fd5b830160808186031215612d7a575f80fd5b9150612d8860208401612d12565b90509250929050565b5f60608284031215612da1575f80fd5b50919050565b80356001600160401b0381168114612d25575f80fd5b5f8060408385031215612dce575f80fd5b82356001600160401b03811115612de3575f80fd5b612def85828601612d91565b925050612d8860208401612da7565b6001600160a01b0381168114610f81575f80fd5b5f8060808385031215612e23575f80fd5b612e2d8484612d91565b91506060830135612e3d81612dfe565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612e7f57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612eba60608401826001600160401b03169052565b506080830151612ed560808401826001600160401b03169052565b5060a0830151612ef060a08401826001600160401b03169052565b5060c08301516114b060c08401826001600160401b03169052565b5f60208284031215612f1b575f80fd5b8135612f2681612dfe565b9392505050565b5f5b83811015612f47578181015183820152602001612f2f565b50505f910152565b602081525f8251806020840152612f6d816040850160208701612f2d565b601f01601f19169190910160400192915050565b5f60208284031215612f91575f80fd5b5051919050565b5f808335601e19843603018112612fad575f80fd5b8301803591506001600160401b03821115612fc6575f80fd5b6020019150600581901b36038213156129db575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112613005575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156130455761304561300f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156130735761307361300f565b604052919050565b5f6001600160401b038211156130935761309361300f565b50601f01601f191660200190565b5f606082360312156130b1575f80fd5b6130b9613023565b8235815260206130ca818501612da7565b8183015260408401356001600160401b038111156130e6575f80fd5b840136601f8201126130f6575f80fd5b80356131096131048261307b565b61304b565b818152368483850101111561311c575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251613005818460208701612f2d565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b0a57610b0a613149565b5f63ffffffff80831681810361318857613188613149565b6001019392505050565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c908216806131f157607f821691505b602082108103612da157634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454613221816131dd565b806020870152604060018084165f8114613242576001811461325e5761328b565b60ff19851660408a0152604084151560051b8a0101955061328b565b895f5260205f205f5b858110156132825781548b8201860152908301908801613267565b8a016040019650505b509398975050505050505050565b80518015158114612d25575f80fd5b5f80604083850312156132b9575f80fd5b82516001600160401b03808211156132cf575f80fd5b90840190606082870312156132e2575f80fd5b6132ea613023565b825181526020808401516132fd81612dfe565b82820152604084015183811115613312575f80fd5b80850194505087601f850112613326575f80fd5b835192506133366131048461307b565b8381528882858701011115613349575f80fd5b61335884838301848801612f2d565b8060408401525081955061336d818801613299565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b81810381811115610b0a57610b0a613149565b8082028115828204841417610b0a57610b0a613149565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f60208284031215613487575f80fd5b610b0782612da7565b5f808335601e198436030181126134a5575f80fd5b8301803591506001600160401b038211156134be575f80fd5b6020019150368190038213156129db575f80fd5b601f8211156104e557805f5260205f20601f840160051c810160208510156134f75750805b601f840160051c820191505b81811015613516575f8155600101613503565b5050505050565b81516001600160401b038111156135365761353661300f565b61354a8161354484546131dd565b846134d2565b602080601f83116001811461357d575f84156135665750858301515b5f19600386901b1c1916600185901b1785556135d4565b5f85815260208120601f198616915b828110156135ab5788860151825594840194600190910190840161358c565b50858210156135c857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b038281168282160390808211156114b0576114b0613149565b6001600160401b038181168382160190808211156114b0576114b0613149565b6001600160401b0381811683821602808216919082811461363f5761363f613149565b505092915050565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161369c81604e860160208901612f2d565b60c09490941b1691909201604e810191909152605601979650505050505050565b5f6001600160401b0380831681810361318857613188613149565b5f602082840312156136e8575f80fd5b813560ff81168114612f26575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161387738038061387783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61372a8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806397fb70d4116100a9578063d588c18f1161006e578063d588c18f14610290578063d5f20ff6146102a3578063df93d8de146102c3578063e7d14c1c146102cd578063f2fde38b1461030b575f80fd5b806397fb70d414610241578063a3a65e4814610254578063b771b3bc14610267578063bee0a03f14610275578063c974d1b614610288575f80fd5b8063715018a6116100ef578063715018a6146101b3578063732214f8146101bb5780638280a25a146101d05780638994ab49146101ea5780638da5cb5b146101fd575f80fd5b80630322ed981461012b578063467ef06f1461014057806360305d621461015357806361e2f4901461017557806366435abf14610188575b5f80fd5b61013e610139366004612ce0565b61031e565b005b61013e61014e366004612d0f565b6104dc565b61015b601481565b60405163ffffffff90911681526020015b60405180910390f35b61013e610183366004612d28565b6104ea565b61019b610196366004612ce0565b610acd565b6040516001600160401b03909116815260200161016c565b61013e610ae1565b6101c25f81565b60405190815260200161016c565b6101d8603081565b60405160ff909116815260200161016c565b6101c26101f8366004612da2565b610af4565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161016c565b61013e61024f366004612ce0565b610b10565b61013e610262366004612d0f565b610b25565b6102296005600160991b0181565b61013e610283366004612ce0565b610c9b565b6101d8601481565b61013e61029e366004612df7565b610d71565b6102b66102b1366004612ce0565b610e7f565b60405161016c9190612e41565b61019b6202a30081565b6101c26102db366004612ce0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61013e610319366004612ef0565b610f47565b5f8181525f805160206136fe8339815191526020526040808220815160e0810190925280545f805160206136de83398151915293929190829060ff16600581111561036b5761036b612e2d565b600581111561037c5761037c612e2d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb612e2d565b146104555760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084015b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61047a8584606001515f610f84565b6040518263ffffffff1660e01b81526004016104969190612f34565b6020604051808303815f875af11580156104b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d69190612f66565b50505050565b6104e581610fd3565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206136de8339815191529060ff16156105875760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161044c565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105ee9190612f66565b8360200135146106505760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161044c565b306106616060850160408601612ef0565b6001600160a01b0316146106d35760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161044c565b5f6106e16060850185612f7d565b905090505f805b828163ffffffff1610156109d1575f6107046060880188612f7d565b8363ffffffff1681811061071a5761071a612fc2565b905060200281019061072c9190612fd6565b61073590613086565b80515f81815260088801602052604090205491925090156107ad5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161044c565b5f6002895f0135856040516020016107dc92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526107f69161311d565b602060405180830381855afa158015610811573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108349190612f66565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156108c0576108c0612e2d565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610973911686613142565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806109ca90613155565b90506106e8565b50600483018190555f6109e3856112f1565b90505f6109f382604001516114b7565b90505f6109ff88611629565b905081600282604051610a12919061311d565b602060405180830381855afa158015610a2d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610a509190612f66565b14610ab45760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161044c565b5050506009909201805460ff1916600117905550505050565b5f610ad782610e7f565b6080015192915050565b610ae9611ac2565b610af25f611b1d565b565b5f610afd611ac2565b610b078383611b8d565b90505b92915050565b610b18611ac2565b610b2181612143565b5050565b5f805160206136de8339815191525f610b3d836112f1565b90505f80610b4e83604001516123be565b9150915080610bb05760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161044c565b60015f83815260078601602052604090205460ff166005811115610bd657610bd6612e2d565b14610bf35760405162461bcd60e51b815260040161044c90613177565b5f8281526006850160205260408120610c0b91612c55565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206136fe83398151915260205260409020545f805160206136de8339815191529060019060ff166005811115610cdb57610cdb612e2d565b14610cf85760405162461bcd60e51b815260040161044c90613177565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d3191906004016131f4565b6020604051808303815f875af1158015610d4d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104e59190612f66565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610db55750825b90505f826001600160401b03166001148015610dd05750303b155b905081158015610dde575080155b15610dfc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610e2657845460ff60401b1916600160401b1785555b610e30878761255f565b8315610e7657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e87612c8c565b5f8281525f805160206136fe833981519152602052604090819020815160e0810190925280545f805160206136de833981519152929190829060ff166005811115610ed457610ed4612e2d565b6005811115610ee557610ee5612e2d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610f4f611ac2565b6001600160a01b038116610f7857604051631e4fbdf760e01b81525f600482015260240161044c565b610f8181611b1d565b50565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f610fdc612c8c565b5f805160206136de8339815191525f610ff4856112f1565b90505f8061100583604001516123be565b91509150801561106a5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161044c565b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561109b5761109b612e2d565b60058111156110ac576110ac612e2d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561111b5761111b612e2d565b1480611139575060018151600581111561113757611137612e2d565b145b6111985760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161044c565b6003815160058111156111ad576111ad612e2d565b036111bb57600481526111c0565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561120557611205612e2d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156112b9576112b9612e2d565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611355573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261137c919081019061328d565b91509150806113dc5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161044c565b81511561143d5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161044c565b60208201516001600160a01b0316156114b05760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161044c565b5092915050565b5f81516026146114d95760405162461bcd60e51b815260040161044c9061335f565b5f805b6002811015611528576114f08160016133a8565b6114fb9060086133bb565b61ffff1684828151811061151157611511612fc2565b016020015160f81c901b91909117906001016114dc565b5061ffff81161561154b5760405162461bcd60e51b815260040161044c906133d2565b5f805b60048110156115a6576115628160036133a8565b61156d9060086133bb565b63ffffffff168561157f836002613142565b8151811061158f5761158f612fc2565b016020015160f81c901b919091179060010161154e565b5063ffffffff8116156115cb5760405162461bcd60e51b815260040161044c90613415565b5f805b6020811015611620576115e281601f6133a8565b6115ed9060086133bb565b866115f9836006613142565b8151811061160957611609612fc2565b016020015160f81c901b91909117906001016115ce565b50949350505050565b60605f61163883830184612f7d565b611644915060586133bb565b61164f90605c613142565b6001600160401b0381111561166657611666612ff4565b6040519080825280601f01601f191660200182016040528015611690576020820181803683370190505b5090505f5b60208110156116e557833581602081106116b1576116b1612fc2565b1a60f81b8282815181106116c7576116c7612fc2565b60200101906001600160f81b03191690815f1a905350600101611695565b505f5b6020811015611745578360200135816020811061170757611707612fc2565b1a60f81b82611717836020613142565b8151811061172757611727612fc2565b60200101906001600160f81b03191690815f1a9053506001016116e8565b505f5b60048110156117a85761175c8160036133a8565b6117679060086133bb565b6014901c60f81b8261177a836040613142565b8151811061178a5761178a612fc2565b60200101906001600160f81b03191690815f1a905350600101611748565b505f6117ba6060850160408601612ef0565b60601b90505f5b601481101561181a578181601481106117dc576117dc612fc2565b1a60f81b836117ec836044613142565b815181106117fc576117fc612fc2565b60200101906001600160f81b03191690815f1a9053506001016117c1565b505f6118296060860186612f7d565b905090505f5b6004811015611894576118438160036133a8565b61184e9060086133bb565b63ffffffff8316901c60f81b84611866836058613142565b8151811061187657611876612fc2565b60200101906001600160f81b03191690815f1a90535060010161182f565b505f5b6118a46060870187612f7d565b9050811015611ab8575f6118b98260586133bb565b6118c490605c613142565b90505f5b602081101561194f576118de6060890189612f7d565b848181106118ee576118ee612fc2565b90506020028101906119009190612fd6565b35816020811061191257611912612fc2565b1a60f81b866119218385613142565b8151811061193157611931612fc2565b60200101906001600160f81b03191690815f1a9053506001016118c8565b505f5b6008811015611a04576119668160076133a8565b6119719060086133bb565b61197e60608a018a612f7d565b8581811061198e5761198e612fc2565b90506020028101906119a09190612fd6565b6119b190604081019060200161345c565b6001600160401b0316901c60f81b86826119cc856020613142565b6119d69190613142565b815181106119e6576119e6612fc2565b60200101906001600160f81b03191690815f1a905350600101611952565b505f5b6030811015611aae57611a1d6060890189612f7d565b84818110611a2d57611a2d612fc2565b9050602002810190611a3f9190612fd6565b611a4d906040810190613475565b82818110611a5d57611a5d612fc2565b9050013560f81c60f81b8682846028611a769190613142565b611a809190613142565b81518110611a9057611a90612fc2565b60200101906001600160f81b03191690815f1a905350600101611a07565b5050600101611897565b5091949350505050565b33611af47f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610af25760405163118cdaa760e01b815233600482015260240161044c565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611c185760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161044c565b5f805160206136de83398151915242611c37604086016020870161345c565b6001600160401b031611611ca95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161044c565b611cb9604085016020860161345c565b6001600160401b0316611ccf6202a30042613142565b11611d425760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161044c565b8335611d9a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161044c565b83355f90815260088201602052604090205415611e0a5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161044c565b6030611e196040860186613475565b905014611e7e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161044c565b611e88835f612579565b5f80611f216040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611ecc919061345c565b6001600160401b03168152602001611ee760408a018a613475565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612787565b5f82815260068601602052604090209193509150611f3f8282613502565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90611f7d908590600401612f34565b6020604051808303815f875af1158015611f99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fbd9190612f66565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561203557612035612e2d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91612115918e01908e0161345c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b61214b612c8c565b5f8281525f805160206136fe8339815191526020526040808220815160e0810190925280545f805160206136de83398151915293929190829060ff16600581111561219857612198612e2d565b60058111156121a9576121a9612e2d565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561221b5761221b612e2d565b146122775760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161044c565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156122bb576122bb612e2d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612367858261288b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146123e15760405162461bcd60e51b815260040161044c9061335f565b5f805b6002811015612430576123f88160016133a8565b6124039060086133bb565b61ffff1685828151811061241957612419612fc2565b016020015160f81c901b91909117906001016123e4565b5061ffff8116156124535760405162461bcd60e51b815260040161044c906133d2565b5f805b60048110156124ae5761246a8160036133a8565b6124759060086133bb565b63ffffffff1686612487836002613142565b8151811061249757612497612fc2565b016020015160f81c901b9190911790600101612456565b5063ffffffff81166003146124d55760405162461bcd60e51b815260040161044c90613415565b5f805b602081101561252a576124ec81601f6133a8565b6124f79060086133bb565b87612503836006613142565b8151811061251357612513612fc2565b016020015160f81c901b91909117906001016124d8565b505f8660268151811061253f5761253f612fc2565b016020015191976001600160f81b03199092161515965090945050505050565b6125676129e2565b61257082612a2b565b610b2181612a44565b5f805160206136de8339815191525f6001600160401b0380841690851611156125ad576125a683856135c1565b90506125ba565b6125b784846135c1565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061261c575060018401548151612618916001600160401b031690613142565b8210155b15612642576001600160401b038316606082015281815260408101516020820152612661565b828160600181815161265491906135e1565b6001600160401b03169052505b6060810151612671906064613601565b602082015160018601546001600160401b03929092169161269c9190600160401b900460ff166133bb565b10156127005760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161044c565b856001600160401b03168160400181815161271b9190613142565b9052506040810180516001600160401b038716919061273b9083906133a8565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146127f15760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161044c565b5f806001855f01518660200151876040015188608001518960600151604051602001612823979695949392919061362c565b6040516020818303038152906040529050600281604051612844919061311d565b602060405180830381855afa15801561285f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906128829190612f66565b94909350915050565b5f8281525f805160206136fe833981519152602052604081206002015481905f805160206136de83398151915290600160801b90046001600160401b03166128d38582612579565b5f6128dd87612a55565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61292d8a858b610f84565b6040518263ffffffff1660e01b81526004016129499190612f34565b6020604051808303815f875af1158015612965573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129899190612f66565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610af257604051631afcd79f60e31b815260040160405180910390fd5b612a336129e2565b612a3b612aca565b610f8181612ad2565b612a4c6129e2565b610f8181612c4d565b5f8181525f805160206136fe8339815191526020526040812060020180545f805160206136de8339815191529190600890612a9f90600160401b90046001600160401b03166136a2565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610af26129e2565b612ada6129e2565b80355f805160206136de8339815191529081556014612aff60608401604085016136bd565b60ff161115612b6c5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161044c565b5f612b7d60608401604085016136bd565b60ff1611612be55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161044c565b612bf560608301604084016136bd565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612c26604083016020840161345c565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610f4f6129e2565b508054612c61906131c2565b5f825580601f10612c70575050565b601f0160209004905f5260205f2090810190610f819190612cc8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612cdc575f8155600101612cc9565b5090565b5f60208284031215612cf0575f80fd5b5035919050565b803563ffffffff81168114612d0a575f80fd5b919050565b5f60208284031215612d1f575f80fd5b610b0782612cf7565b5f8060408385031215612d39575f80fd5b82356001600160401b03811115612d4e575f80fd5b830160808186031215612d5f575f80fd5b9150612d6d60208401612cf7565b90509250929050565b5f60608284031215612d86575f80fd5b50919050565b80356001600160401b0381168114612d0a575f80fd5b5f8060408385031215612db3575f80fd5b82356001600160401b03811115612dc8575f80fd5b612dd485828601612d76565b925050612d6d60208401612d8c565b6001600160a01b0381168114610f81575f80fd5b5f8060808385031215612e08575f80fd5b612e128484612d76565b91506060830135612e2281612de3565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110612e6457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151612e9f60608401826001600160401b03169052565b506080830151612eba60808401826001600160401b03169052565b5060a0830151612ed560a08401826001600160401b03169052565b5060c08301516114b060c08401826001600160401b03169052565b5f60208284031215612f00575f80fd5b8135612f0b81612de3565b9392505050565b5f5b83811015612f2c578181015183820152602001612f14565b50505f910152565b602081525f8251806020840152612f52816040850160208701612f12565b601f01601f19169190910160400192915050565b5f60208284031215612f76575f80fd5b5051919050565b5f808335601e19843603018112612f92575f80fd5b8301803591506001600160401b03821115612fab575f80fd5b6020019150600581901b36038213156129db575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612fea575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561302a5761302a612ff4565b60405290565b604051601f8201601f191681016001600160401b038111828210171561305857613058612ff4565b604052919050565b5f6001600160401b0382111561307857613078612ff4565b50601f01601f191660200190565b5f60608236031215613096575f80fd5b61309e613008565b8235815260206130af818501612d8c565b8183015260408401356001600160401b038111156130cb575f80fd5b840136601f8201126130db575f80fd5b80356130ee6130e982613060565b613030565b8181523684838501011115613101575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251612fea818460208701612f12565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b0a57610b0a61312e565b5f63ffffffff80831681810361316d5761316d61312e565b6001019392505050565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c908216806131d657607f821691505b602082108103612d8657634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454613206816131c2565b806020870152604060018084165f8114613227576001811461324357613270565b60ff19851660408a0152604084151560051b8a01019550613270565b895f5260205f205f5b858110156132675781548b820186015290830190880161324c565b8a016040019650505b509398975050505050505050565b80518015158114612d0a575f80fd5b5f806040838503121561329e575f80fd5b82516001600160401b03808211156132b4575f80fd5b90840190606082870312156132c7575f80fd5b6132cf613008565b825181526020808401516132e281612de3565b828201526040840151838111156132f7575f80fd5b80850194505087601f85011261330b575f80fd5b8351925061331b6130e984613060565b838152888285870101111561332e575f80fd5b61333d84838301848801612f12565b8060408401525081955061335281880161327e565b9450505050509250929050565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b81810381811115610b0a57610b0a61312e565b8082028115828204841417610b0a57610b0a61312e565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f6020828403121561346c575f80fd5b610b0782612d8c565b5f808335601e1984360301811261348a575f80fd5b8301803591506001600160401b038211156134a3575f80fd5b6020019150368190038213156129db575f80fd5b601f8211156104e557805f5260205f20601f840160051c810160208510156134dc5750805b601f840160051c820191505b818110156134fb575f81556001016134e8565b5050505050565b81516001600160401b0381111561351b5761351b612ff4565b61352f8161352984546131c2565b846134b7565b602080601f831160018114613562575f841561354b5750858301515b5f19600386901b1c1916600185901b1785556135b9565b5f85815260208120601f198616915b8281101561359057888601518255948401946001909101908401613571565b50858210156135ad57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b038281168282160390808211156114b0576114b061312e565b6001600160401b038181168382160190808211156114b0576114b061312e565b6001600160401b038181168382160280821691908281146136245761362461312e565b505092915050565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161368181604e860160208901612f12565b60c09490941b1691909201604e810191909152605601979650505050505050565b5f6001600160401b0380831681810361316d5761316d61312e565b5f602082840312156136cd575f80fd5b813560ff81168114612f0b575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. From d7367d6d346620237406b97d3832e79c1f53de16 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Fri, 20 Sep 2024 17:01:46 -0400 Subject: [PATCH 397/545] Remove Delegator.endedAt --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 11 +++++------ .../interfaces/IPoSValidatorManager.sol | 1 - 4 files changed, 7 insertions(+), 9 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index a4780cb51..d84ef3dfd 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161672d38038061672d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6165e08061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd3660046158fa565b61043a565b005b6101d26101e2366004615935565b61089d565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b610219610214366004615935565b610a56565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b36600461594c565b610a6c565b6101d261026e366004615965565b610b0c565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e36600461598d565b610f9c565b6102b66102b13660046159f1565b61157f565b6040519081526020016101fd565b6102196102d2366004615935565b611598565b6102b65f81565b6101d26102ec3660046158fa565b6115ac565b6101ef603081565b6101d2610307366004615935565b6117c8565b6101d261031a366004615965565b6118ce565b6101d261032d366004615935565b611ab1565b6102b6610340366004615a0a565b611dca565b6101d261035336600461594c565b611df6565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c366004615935565b611f6c565b6101d261039f366004615935565b6121df565b6101ef601481565b6103bf6103ba366004615935565b6122ba565b6040516101fd9190615a3e565b6102196202a30081565b6102b66103e4366004615935565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615afe565b612382565b6101d2610435366004615b77565b6123b7565b5f8381525f8051602061657483398151915260205260408082208151610100810190925280545f8051602061651483398151915293929190829060ff16600381111561048857610488615a2a565b600381111561049957610499615a2a565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61051d826122ba565b905060028351600381111561053457610534615a2a565b146105865760405162461bcd60e51b815260206004820152602a60248201525f805160206165348339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105eb5760405162461bcd60e51b815260206004820152603360248201525f805160206165348339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161057d565b6003835280515f90600290600581111561060757610607615a2a565b0361065e57861561061f5761061c8387612496565b90505b5f846060015183608001516106349190615bc9565b90506106408482612732565b506001600160401b0390811660e0870152421660a086015250610692565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106c5866060015161157f565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b81526004016106f99796959493929190615be9565b602060405180830381865afa158015610714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107389190615c27565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff1916600183600381111561077757610777615a2a565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699161088b916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f805160206165b48339815191526020526040808220815160e0810190925280545f8051602061655483398151915293929190829060ff1660058111156108ea576108ea615a2a565b60058111156108fb576108fb615a2a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561096a5761096a615a2a565b146109cf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb6109f48584606001515f612889565b6040518263ffffffff1660e01b8152600401610a109190615c60565b6020604051808303815f875af1158015610a2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a509190615c27565b50505050565b5f610a6664e8d4a5100083615c92565b92915050565b5f805160206165148339815191525f80610a85846128e0565b91509150610a9282612bfe565b610a9c5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610aca57610aca615a2a565b03610aef575f83815260088501602052604081208054919055610aed8282612c39565b505b610b0581610b00846040015161157f565b612caf565b5050505050565b5f8181525f8051602061657483398151915260205260408082208151610100810190925280545f8051602061651483398151915293929190829060ff166003811115610b5a57610b5a615a2a565b6003811115610b6b57610b6b615a2a565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610bf0906122ba565b9050600182516003811115610c0757610c07615a2a565b14610c705760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161057d565b600381516005811115610c8557610c85615a2a565b03610dfd57600380835260c0820180516001600160401b0390811660808601529051811660a085015260608301511660e08401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610ce957610ce9615a2a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610e1257610e12615a2a565b03610e2057610b0584612cd2565b5f610e2a86612ecf565b90505f80610e3b8360400151613095565b509150915081856040015114610e635760405162461bcd60e51b815260040161057d90615cb1565b806001600160401b031684606001516001600160401b03161015610ed45760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161057d565b806001600160401b03168560c001516001600160401b03161115610f0a5760405162461bcd60e51b815260040161057d90615cfb565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206165548339815191529060ff16156110395760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110a09190615c27565b8360200135146111025760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161057d565b306111136060850160408601615d44565b6001600160a01b0316146111855760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161057d565b5f6111936060850185615d5f565b905090505f805b828163ffffffff161015611483575f6111b66060880188615d5f565b8363ffffffff168181106111cc576111cc615da4565b90506020028101906111de9190615db8565b6111e790615e68565b80515f818152600888016020526040902054919250901561125f5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161057d565b5f6002895f01358560405160200161128e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526112a891615eff565b602060405180830381855afa1580156112c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e69190615c27565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561137257611372615a2a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611425911686615f10565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061147c90615f23565b905061119a565b50600483018190555f61149585612ecf565b90505f6114a582604001516132d0565b90505f6114b188613442565b9050816002826040516114c49190615eff565b602060405180830381855afa1580156114df573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115029190615c27565b146115665760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161057d565b5050506009909201805460ff1916600117905550505050565b5f610a666001600160401b03831664e8d4a51000615f45565b5f6115a2826122ba565b6080015192915050565b5f805160206165148339815191525f6115c4856138db565b90506115cf85612bfe565b6115da575050505050565b5f8581526005830160205260409020546001600160a01b031633146116115760405162461bcd60e51b815260040161057d90615f5c565b5f85815260058301602052604090205460a082015161164091600160b01b90046001600160401b031690615fae565b6001600160401b03168160c001516001600160401b031610156116c15760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161057d565b8315610b05575f6116d28685612496565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906117299061157f565b60a085015160c08601516040516001600160e01b031960e086901b16815261175d939291829188905f908190600401615be9565b602060405180830381865afa158015611778573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061179c9190615c27565b5f878152600885016020526040812080549091906117bb908490615f10565b9091555050505050505050565b5f805160206165148339815191525f6117e0836122ba565b90506004815160058111156117f7576117f7615a2a565b146118615760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161057d565b5f8381526005830160205260409020546001600160a01b031633146118985760405162461bcd60e51b815260040161057d90615f5c565b5f83815260088301602090815260408083208054908490556005860190925290912054610a50906001600160a01b031682612c39565b6118d6613b56565b5f8181525f8051602061657483398151915260205260408082208151610100810190925280545f8051602061651483398151915293929190829060ff16600381111561192457611924615a2a565b600381111561193557611935615a2a565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f6119b185612ecf565b90505f806119c28360400151613095565b5091509150818460400151146119ea5760405162461bcd60e51b815260040161057d90615cb1565b806001600160401b03168460e001516001600160401b03161115611a205760405162461bcd60e51b815260040161057d90615cfb565b600384516003811115611a3557611a35615a2a565b14611a895760405162461bcd60e51b815260206004820152603160248201525f805160206165348339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161057d565b611a9286612cd2565b5050505050611aad60015f8051602061659483398151915255565b5050565b611ab9613b56565b5f8181525f8051602061657483398151915260205260408082208151610100810190925280545f8051602061651483398151915293929190829060ff166003811115611b0757611b07615a2a565b6003811115611b1857611b18615a2a565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611b9c826122ba565b90505f83516003811115611bb257611bb2615a2a565b03611c105760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152671bdd08199bdd5b9960c21b606482015260840161057d565b600481516005811115611c2557611c25615a2a565b14611c885760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161057d565b600183516003811115611c9d57611c9d615a2a565b03611cb457611cab85612cd2565b50505050611db1565b600283516003811115611cc957611cc9615a2a565b03611da3578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611d01856060015161157f565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611d5396959493926001600160401b0390921691908190600401615be9565b602060405180830381865afa158015611d6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d929190615c27565b5f8681526007860160205260409020555b611dac85612cd2565b505050505b611dc760015f8051602061659483398151915255565b50565b5f611dd3613b56565b611dde833384613ba0565b9050610a6660015f8051602061659483398151915255565b5f805160206165548339815191525f611e0e83612ecf565b90505f80611e1f8360400151613f5a565b9150915080611e815760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161057d565b60015f83815260078601602052604090205460ff166005811115611ea757611ea7615a2a565b14611ec45760405162461bcd60e51b815260040161057d90615fce565b5f8281526006850160205260408120611edc9161584a565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061657483398151915260205260408082208151610100810190925280545f8051602061651483398151915293929190829060ff166003811115611fba57611fba615a2a565b6003811115611fcb57611fcb615a2a565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101529091508151600381111561205257612052615a2a565b1480612070575060038151600381111561206e5761206e615a2a565b145b6120c45760405162461bcd60e51b815260206004820152603260248201525f80516020616534833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161057d565b5f6120d282604001516122ba565b905080606001516001600160401b03165f036121565760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161057d565b6005600160991b016001600160a01b031663ee5b48eb612183846040015184606001518560800151612889565b6040518263ffffffff1660e01b815260040161219f9190615c60565b6020604051808303815f875af11580156121bb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b059190615c27565b5f8181525f805160206165b483398151915260205260409020545f805160206165548339815191529060019060ff16600581111561221f5761221f615a2a565b1461223c5760405162461bcd60e51b815260040161057d90615fce565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916122759190600401616051565b6020604051808303815f875af1158015612291573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122b59190615c27565b505050565b6122c2615881565b5f8281525f805160206165b4833981519152602052604090819020815160e0810190925280545f80516020616554833981519152929190829060ff16600581111561230f5761230f615a2a565b600581111561232057612320615a2a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61238b613b56565b612397858585856140fb565b90506123af60015f8051602061659483398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680612400575080546001600160401b03808416911610155b1561241e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561244984846143e7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156124e1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261250891908101906160e6565b915091508061256b5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161057d565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d29190615c27565b8251146126365760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161057d565b60208201516001600160a01b0316156126ac5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161057d565b5f806126bb8460400151614401565b915091508187146127285760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161057d565b9695505050505050565b5f8281525f805160206165b4833981519152602052604081206002015481905f8051602061655483398151915290600160801b90046001600160401b031661277a85826145d9565b5f612784876147e7565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6127d48a858b612889565b6040518263ffffffff1660e01b81526004016127f09190615c60565b6020604051808303815f875af115801561280c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128309190615c27565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6128e9615881565b5f805160206165548339815191525f61290185612ecf565b90505f806129128360400151613f5a565b9150915080156129775760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161057d565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156129a8576129a8615a2a565b60058111156129b9576129b9615a2a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612a2857612a28615a2a565b1480612a465750600181516005811115612a4457612a44615a2a565b145b612aa55760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161057d565b600381516005811115612aba57612aba615a2a565b03612ac85760048152612acd565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612b1257612b12615a2a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612bc657612bc6615a2a565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f805160206164f483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612c94575f80fd5b505af1158015612ca6573d5f803e3d5ffd5b50505050505050565b5f805160206164f483398151915254611aad906001600160a01b0316838361485c565b5f8181525f8051602061657483398151915260205260408082208151610100810190925280545f8051602061651483398151915293929190829060ff166003811115612d2057612d20615a2a565b6003811115612d3157612d31615a2a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff191690556007870182528383208054908490558184526005880190925292822054939450919261271090612e2590600160a01b900461ffff1684615f45565b612e2f9190615c92565b905080856008015f8581526020019081526020015f205f828254612e539190615f10565b909155505f9050612e6482846161b8565b9050612e74856020015182612c39565b612e898560200151610b00876060015161157f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612f33573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612f5a91908101906160e6565b9150915080612fba5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161057d565b81511561301b5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161057d565b60208201516001600160a01b03161561308e5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161057d565b5092915050565b5f805f83516036146130b95760405162461bcd60e51b815260040161057d906161cb565b5f805b6002811015613108576130d08160016161b8565b6130db906008615f45565b61ffff168682815181106130f1576130f1615da4565b016020015160f81c901b91909117906001016130bc565b5061ffff81161561312b5760405162461bcd60e51b815260040161057d90616214565b5f805b6004811015613186576131428160036161b8565b61314d906008615f45565b63ffffffff168761315f836002615f10565b8151811061316f5761316f615da4565b016020015160f81c901b919091179060010161312e565b5063ffffffff81166004146131ad5760405162461bcd60e51b815260040161057d90616257565b5f805b6020811015613202576131c481601f6161b8565b6131cf906008615f45565b886131db836006615f10565b815181106131eb576131eb615da4565b016020015160f81c901b91909117906001016131b0565b505f805b60088110156132615761321a8160076161b8565b613225906008615f45565b6001600160401b03168961323a836026615f10565b8151811061324a5761324a615da4565b016020015160f81c901b9190911790600101613206565b505f805b60088110156132c0576132798160076161b8565b613284906008615f45565b6001600160401b03168a61329983602e615f10565b815181106132a9576132a9615da4565b016020015160f81c901b9190911790600101613265565b5091989097509095509350505050565b5f81516026146132f25760405162461bcd60e51b815260040161057d906161cb565b5f805b6002811015613341576133098160016161b8565b613314906008615f45565b61ffff1684828151811061332a5761332a615da4565b016020015160f81c901b91909117906001016132f5565b5061ffff8116156133645760405162461bcd60e51b815260040161057d90616214565b5f805b60048110156133bf5761337b8160036161b8565b613386906008615f45565b63ffffffff1685613398836002615f10565b815181106133a8576133a8615da4565b016020015160f81c901b9190911790600101613367565b5063ffffffff8116156133e45760405162461bcd60e51b815260040161057d90616257565b5f805b6020811015613439576133fb81601f6161b8565b613406906008615f45565b86613412836006615f10565b8151811061342257613422615da4565b016020015160f81c901b91909117906001016133e7565b50949350505050565b60605f61345183830184615d5f565b61345d91506058615f45565b61346890605c615f10565b6001600160401b0381111561347f5761347f615dd6565b6040519080825280601f01601f1916602001820160405280156134a9576020820181803683370190505b5090505f5b60208110156134fe57833581602081106134ca576134ca615da4565b1a60f81b8282815181106134e0576134e0615da4565b60200101906001600160f81b03191690815f1a9053506001016134ae565b505f5b602081101561355e578360200135816020811061352057613520615da4565b1a60f81b82613530836020615f10565b8151811061354057613540615da4565b60200101906001600160f81b03191690815f1a905350600101613501565b505f5b60048110156135c1576135758160036161b8565b613580906008615f45565b6014901c60f81b82613593836040615f10565b815181106135a3576135a3615da4565b60200101906001600160f81b03191690815f1a905350600101613561565b505f6135d36060850160408601615d44565b60601b90505f5b6014811015613633578181601481106135f5576135f5615da4565b1a60f81b83613605836044615f10565b8151811061361557613615615da4565b60200101906001600160f81b03191690815f1a9053506001016135da565b505f6136426060860186615d5f565b905090505f5b60048110156136ad5761365c8160036161b8565b613667906008615f45565b63ffffffff8316901c60f81b8461367f836058615f10565b8151811061368f5761368f615da4565b60200101906001600160f81b03191690815f1a905350600101613648565b505f5b6136bd6060870187615d5f565b90508110156138d1575f6136d2826058615f45565b6136dd90605c615f10565b90505f5b6020811015613768576136f76060890189615d5f565b8481811061370757613707615da4565b90506020028101906137199190615db8565b35816020811061372b5761372b615da4565b1a60f81b8661373a8385615f10565b8151811061374a5761374a615da4565b60200101906001600160f81b03191690815f1a9053506001016136e1565b505f5b600881101561381d5761377f8160076161b8565b61378a906008615f45565b61379760608a018a615d5f565b858181106137a7576137a7615da4565b90506020028101906137b99190615db8565b6137ca9060408101906020016159f1565b6001600160401b0316901c60f81b86826137e5856020615f10565b6137ef9190615f10565b815181106137ff576137ff615da4565b60200101906001600160f81b03191690815f1a90535060010161376b565b505f5b60308110156138c7576138366060890189615d5f565b8481811061384657613846615da4565b90506020028101906138589190615db8565b61386690604081019061629e565b8281811061387657613876615da4565b9050013560f81c60f81b868284602861388f9190615f10565b6138999190615f10565b815181106138a9576138a9615da4565b60200101906001600160f81b03191690815f1a905350600101613820565b50506001016136b0565b5091949350505050565b6138e3615881565b5f8281525f805160206165b48339815191526020526040808220815160e0810190925280545f8051602061655483398151915293929190829060ff16600581111561393057613930615a2a565b600581111561394157613941615a2a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156139b3576139b3615a2a565b14613a0f5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161057d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613a5357613a53615a2a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613aff8582612732565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80516020616594833981519152805460011901613b8757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061659483398151915255565b5f5f8051602061651483398151915281613bbc610214856148bb565b90505f613bc8876122ba565b9050613bd387612bfe565b613c305760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161057d565b600281516005811115613c4557613c45615a2a565b14613ca45760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161057d565b5f828260800151613cb59190615fae565b60048501546040840151919250613cd7916001600160401b03909116906162e0565b6001600160401b0316816001600160401b03161115613d565760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161057d565b5f80613d628a84612732565b915091505f8a83604051602001613d9092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff19166001836003811115613e2b57613e2b615a2a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613f7d5760405162461bcd60e51b815260040161057d906161cb565b5f805b6002811015613fcc57613f948160016161b8565b613f9f906008615f45565b61ffff16858281518110613fb557613fb5615da4565b016020015160f81c901b9190911790600101613f80565b5061ffff811615613fef5760405162461bcd60e51b815260040161057d90616214565b5f805b600481101561404a576140068160036161b8565b614011906008615f45565b63ffffffff1686614023836002615f10565b8151811061403357614033615da4565b016020015160f81c901b9190911790600101613ff2565b5063ffffffff81166003146140715760405162461bcd60e51b815260040161057d90616257565b5f805b60208110156140c65761408881601f6161b8565b614093906008615f45565b8761409f836006615f10565b815181106140af576140af615da4565b016020015160f81c901b9190911790600101614074565b505f866026815181106140db576140db615da4565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206165148339815191529061ffff861610156141825760405162461bcd60e51b815260206004820152602b60248201525f8051602061653483398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161057d565b61271061ffff861611156141da5760405162461bcd60e51b815260206004820152602c60248201525f8051602061653483398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161057d565b60028101546001600160401b0390811690851610156142535760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161057d565b80548310156142b65760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161057d565b806001015483111561431d5760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161057d565b5f614327846148bb565b90505f61433382610a56565b90505f61434089836148de565b905060405180606001604052806143543390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6143ef614e94565b6143f882614edf565b611aad81614f51565b5f808251602e146144245760405162461bcd60e51b815260040161057d906161cb565b5f805b60028110156144735761443b8160016161b8565b614446906008615f45565b61ffff1685828151811061445c5761445c615da4565b016020015160f81c901b9190911790600101614427565b5061ffff8116156144965760405162461bcd60e51b815260040161057d90616214565b5f805b60048110156144f1576144ad8160036161b8565b6144b8906008615f45565b63ffffffff16866144ca836002615f10565b815181106144da576144da615da4565b016020015160f81c901b9190911790600101614499565b5063ffffffff81166005146145185760405162461bcd60e51b815260040161057d90616257565b5f805b602081101561456d5761452f81601f6161b8565b61453a906008615f45565b87614546836006615f10565b8151811061455657614556615da4565b016020015160f81c901b919091179060010161451b565b505f805b60088110156145cc576145858160076161b8565b614590906008615f45565b6001600160401b0316886145a5836026615f10565b815181106145b5576145b5615da4565b016020015160f81c901b9190911790600101614571565b5090969095509350505050565b5f805160206165548339815191525f6001600160401b03808416908516111561460d576146068385615bc9565b905061461a565b6146178484615bc9565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061467c575060018401548151614678916001600160401b031690615f10565b8210155b156146a2576001600160401b0383166060820152818152604081015160208201526146c1565b82816060018181516146b49190615fae565b6001600160401b03169052505b60608101516146d19060646162e0565b602082015160018601546001600160401b0392909216916146fc9190600160401b900460ff16615f45565b10156147605760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161057d565b856001600160401b03168160400181815161477b9190615f10565b9052506040810180516001600160401b038716919061479b9083906161b8565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206165b48339815191526020526040812060020180545f80516020616554833981519152919060089061483190600160401b90046001600160401b031661630b565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b038381166024830152604482018390526122b591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614ff2565b5f610a66825f805160206164f4833981519152546001600160a01b031690615053565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166149695760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161057d565b5f805160206165548339815191524261498860408601602087016159f1565b6001600160401b0316116149fa5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161057d565b614a0a60408501602086016159f1565b6001600160401b0316614a206202a30042615f10565b11614a935760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161057d565b8335614aeb5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161057d565b83355f90815260088201602052604090205415614b5b5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161057d565b6030614b6a604086018661629e565b905014614bcf5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161057d565b614bd9835f6145d9565b5f80614c726040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614c1d91906159f1565b6001600160401b03168152602001614c3860408a018a61629e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506151b5565b5f82815260068601602052604090209193509150614c90828261636a565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614cce908590600401615c60565b6020604051808303815f875af1158015614cea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d0e9190615c27565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614d8657614d86615a2a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614e66918e01908e016159f1565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614edd57604051631afcd79f60e31b815260040160405180910390fd5b565b614ee7614e94565b614ef0816152b9565b614ef86152d2565b611dc760608201356080830135614f1560c0850160a086016159f1565b614f2560e0860160c08701616429565b61ffff16614f3a610100870160e08801616442565b614f4c61012088016101008901615d44565b6152e2565b614f59614e94565b5f805160206164f48339815191526001600160a01b038216614fd25760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161057d565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6150066001600160a01b0384168361556a565b905080515f1415801561502a5750808060200190518101906150289190616462565b155b156122b557604051635274afe760e01b81526001600160a01b038416600482015260240161057d565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015615099573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150bd9190615c27565b90506150d46001600160a01b038516333086615577565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015615118573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061513c9190615c27565b90508181116151a25760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161057d565b6151ac82826161b8565b95945050505050565b5f606082608001515160301461521f5760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161057d565b5f806001855f01518660200151876040015188608001518960600151604051602001615251979695949392919061647d565b60405160208183030381529060405290506002816040516152729190615eff565b602060405180830381855afa15801561528d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906152b09190615c27565b94909350915050565b6152c1614e94565b6152c96155b0565b611dc7816155b8565b6152da614e94565b614edd615733565b6152ea614e94565b5f80516020616514833981519152836153565760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161057d565b6127108411156153bc5760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161057d565b858711156154245760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161057d565b5f8360ff16116154915760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161057d565b600a60ff841611156155035760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161057d565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b60606128d983835f61573b565b6040516001600160a01b038481166024830152838116604483015260648201839052610a509186918216906323b872dd90608401614889565b614edd614e94565b6155c0614e94565b80355f8051602061655483398151915290815560146155e56060840160408501616442565b60ff1611156156525760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161057d565b5f6156636060840160408501616442565b60ff16116156cb5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161057d565b6156db6060830160408401616442565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561570c60408301602084016159f1565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613b8d614e94565b6060814710156157605760405163cd78605960e01b815230600482015260240161057d565b5f80856001600160a01b0316848660405161577b9190615eff565b5f6040518083038185875af1925050503d805f81146157b5576040519150601f19603f3d011682016040523d82523d5f602084013e6157ba565b606091505b50915091506127288683836060826157da576157d582615821565b6128d9565b81511580156157f157506001600160a01b0384163b155b1561581a57604051639996b31560e01b81526001600160a01b038516600482015260240161057d565b50806128d9565b8051156158315780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461585690616019565b5f825580601f10615865575050565b601f0160209004905f5260205f2090810190611dc791906158bd565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156158d1575f81556001016158be565b5090565b8015158114611dc7575f80fd5b803563ffffffff811681146158f5575f80fd5b919050565b5f805f6060848603121561590c575f80fd5b83359250602084013561591e816158d5565b915061592c604085016158e2565b90509250925092565b5f60208284031215615945575f80fd5b5035919050565b5f6020828403121561595c575f80fd5b6128d9826158e2565b5f8060408385031215615976575f80fd5b61597f836158e2565b946020939093013593505050565b5f806040838503121561599e575f80fd5b82356001600160401b038111156159b3575f80fd5b8301608081860312156159c4575f80fd5b91506159d2602084016158e2565b90509250929050565b80356001600160401b03811681146158f5575f80fd5b5f60208284031215615a01575f80fd5b6128d9826159db565b5f8060408385031215615a1b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110615a6157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151615a9c60608401826001600160401b03169052565b506080830151615ab760808401826001600160401b03169052565b5060a0830151615ad260a08401826001600160401b03169052565b5060c083015161308e60c08401826001600160401b03169052565b803561ffff811681146158f5575f80fd5b5f805f8060808587031215615b11575f80fd5b84356001600160401b03811115615b26575f80fd5b850160608188031215615b37575f80fd5b9350615b4560208601615aed565b9250615b53604086016159db565b9396929550929360600135925050565b6001600160a01b0381168114611dc7575f80fd5b5f80828403610140811215615b8a575f80fd5b61012080821215615b99575f80fd5b8493508301359050615baa81615b63565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561308e5761308e615bb5565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615c37575f80fd5b5051919050565b5f5b83811015615c58578181015183820152602001615c40565b50505f910152565b602081525f8251806020840152615c7e816040850160208701615c3e565b601f01601f19169190910160400192915050565b5f82615cac57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615d54575f80fd5b81356128d981615b63565b5f808335601e19843603018112615d74575f80fd5b8301803591506001600160401b03821115615d8d575f80fd5b6020019150600581901b3603821315612882575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615dcc575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615e0c57615e0c615dd6565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615e3a57615e3a615dd6565b604052919050565b5f6001600160401b03821115615e5a57615e5a615dd6565b50601f01601f191660200190565b5f60608236031215615e78575f80fd5b615e80615dea565b823581526020615e918185016159db565b8183015260408401356001600160401b03811115615ead575f80fd5b840136601f820112615ebd575f80fd5b8035615ed0615ecb82615e42565b615e12565b8181523684838501011115615ee3575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615dcc818460208701615c3e565b80820180821115610a6657610a66615bb5565b5f63ffffffff808316818103615f3b57615f3b615bb5565b6001019392505050565b8082028115828204841417610a6657610a66615bb5565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b0381811683821601908082111561308e5761308e615bb5565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c9082168061602d57607f821691505b60208210810361604b57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461606381616019565b806020870152604060018084165f811461608457600181146160a0576160cd565b60ff19851660408a0152604084151560051b8a010195506160cd565b895f5260205f205f5b858110156160c45781548b82018601529083019088016160a9565b8a016040019650505b509398975050505050505050565b80516158f5816158d5565b5f80604083850312156160f7575f80fd5b82516001600160401b038082111561610d575f80fd5b9084019060608287031215616120575f80fd5b616128615dea565b8251815260208084015161613b81615b63565b82820152604084015183811115616150575f80fd5b80850194505087601f850112616164575f80fd5b83519250616174615ecb84615e42565b8381528882858701011115616187575f80fd5b61619684838301848801615c3e565b806040840152508195506161ab8188016160db565b9450505050509250929050565b81810381811115610a6657610a66615bb5565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e198436030181126162b3575f80fd5b8301803591506001600160401b038211156162cc575f80fd5b602001915036819003821315612882575f80fd5b6001600160401b0381811683821602808216919082811461630357616303615bb5565b505092915050565b5f6001600160401b03808316818103615f3b57615f3b615bb5565b601f8211156122b557805f5260205f20601f840160051c8101602085101561634b5750805b601f840160051c820191505b81811015610b05575f8155600101616357565b81516001600160401b0381111561638357616383615dd6565b616397816163918454616019565b84616326565b602080601f8311600181146163ca575f84156163b35750858301515b5f19600386901b1c1916600185901b178555616421565b5f85815260208120601f198616915b828110156163f8578886015182559484019460019091019084016163d9565b508582101561641557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215616439575f80fd5b6128d982615aed565b5f60208284031215616452575f80fd5b813560ff811681146128d9575f80fd5b5f60208284031215616472575f80fd5b81516128d9816158d5565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516164d281604e860160208901615c3e565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161663438038061663483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6164e78061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd366004615801565b61043a565b005b6101d26101e236600461583c565b61085b565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b61021961021436600461583c565b610a14565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004615853565b610a2a565b6101d261026e36600461586c565b610aca565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004615894565b610f1c565b6102b66102b13660046158f8565b6114ff565b6040519081526020016101fd565b6102196102d236600461583c565b611518565b6102b65f81565b6101d26102ec366004615801565b61152c565b6101ef603081565b6101d261030736600461583c565b611748565b6101d261031a36600461586c565b61184e565b6101d261032d36600461583c565b611a22565b6102b6610340366004615911565b611d2c565b6101d2610353366004615853565b611d58565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c36600461583c565b611ece565b6101d261039f36600461583c565b612132565b6101ef601481565b6103bf6103ba36600461583c565b61220d565b6040516101fd9190615945565b6102196202a30081565b6102b66103e436600461583c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004615a05565b6122d5565b6101d2610435366004615a7e565b61230a565b5f8381525f8051602061647b8339815191526020526040808220815160e0810190925280545f8051602061641b83398151915293929190829060ff16600381111561048757610487615931565b600381111561049857610498615931565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61050e8261220d565b905060028351600381111561052557610525615931565b146105775760405162461bcd60e51b815260206004820152602a60248201525f8051602061643b8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b031633146105dc5760405162461bcd60e51b815260206004820152603360248201525f8051602061643b8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b606482015260840161056e565b600383819052505f806002835160058111156105fa576105fa615931565b0361064b5787156106125761060f84886123e9565b91505b5f856060015184608001516106279190615ad0565b90506106338582612685565b506001600160401b031660c08701525042905061067d565b50505f82815260098501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b8560040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56106b087606001516114ff565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106e09796959493929190615af0565b602060405180830381865afa1580156106fb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061071f9190615b2e565b5f8a8152600788016020908152604080832093909355600689019052208551815487929190829060ff1916600183600381111561075e5761075e615931565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906108489085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206164bb8339815191526020526040808220815160e0810190925280545f8051602061645b83398151915293929190829060ff1660058111156108a8576108a8615931565b60058111156108b9576108b9615931565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561092857610928615931565b1461098d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b606482015260840161056e565b6005600160991b016001600160a01b031663ee5b48eb6109b28584606001515f6127dc565b6040518263ffffffff1660e01b81526004016109ce9190615b67565b6020604051808303815f875af11580156109ea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a0e9190615b2e565b50505050565b5f610a2464e8d4a5100083615b99565b92915050565b5f8051602061641b8339815191525f80610a4384612833565b91509150610a5082612b51565b610a5a5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610a8857610a88615931565b03610aad575f83815260088501602052604081208054919055610aab8282612b8c565b505b610ac381610abe84604001516114ff565b612c02565b5050505050565b5f8181525f8051602061647b8339815191526020526040808220815160e0810190925280545f8051602061641b83398151915293929190829060ff166003811115610b1757610b17615931565b6003811115610b2857610b28615931565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610b9f9061220d565b9050600182516003811115610bb657610bb6615931565b14610c1f5760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b606482015260840161056e565b600381516005811115610c3457610c34615931565b03610d7d57600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610c8e57610c8e615931565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610d9257610d92615931565b03610da057610ac384612c25565b5f610daa86612e02565b90505f80610dbb8360400151612fc8565b509150915081856040015114610de35760405162461bcd60e51b815260040161056e90615bb8565b806001600160401b031684606001516001600160401b03161015610e545760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b606482015260840161056e565b806001600160401b03168560a001516001600160401b03161115610e8a5760405162461bcd60e51b815260040161056e90615c02565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061645b8339815191529060ff1615610fb95760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b606482015260840161056e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ffc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110209190615b2e565b8360200135146110825760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b606482015260840161056e565b306110936060850160408601615c4b565b6001600160a01b0316146111055760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b606482015260840161056e565b5f6111136060850185615c66565b905090505f805b828163ffffffff161015611403575f6111366060880188615c66565b8363ffffffff1681811061114c5761114c615cab565b905060200281019061115e9190615cbf565b61116790615d6f565b80515f81815260088801602052604090205491925090156111df5760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b606482015260840161056e565b5f6002895f01358560405160200161120e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261122891615e06565b602060405180830381855afa158015611243573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112669190615b2e565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156112f2576112f2615931565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113a5911686615e17565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806113fc90615e2a565b905061111a565b50600483018190555f61141585612e02565b90505f6114258260400151613203565b90505f61143188613375565b9050816002826040516114449190615e06565b602060405180830381855afa15801561145f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114829190615b2e565b146114e65760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b606482015260840161056e565b5050506009909201805460ff1916600117905550505050565b5f610a246001600160401b03831664e8d4a51000615e4c565b5f6115228261220d565b6080015192915050565b5f8051602061641b8339815191525f6115448561380e565b905061154f85612b51565b61155a575050505050565b5f8581526005830160205260409020546001600160a01b031633146115915760405162461bcd60e51b815260040161056e90615e63565b5f85815260058301602052604090205460a08201516115c091600160b01b90046001600160401b031690615eb5565b6001600160401b03168160c001516001600160401b031610156116415760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b606482015260840161056e565b8315610ac3575f61165286856123e9565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b5906116a9906114ff565b60a085015160c08601516040516001600160e01b031960e086901b1681526116dd939291829188905f908190600401615af0565b602060405180830381865afa1580156116f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061171c9190615b2e565b5f8781526008850160205260408120805490919061173b908490615e17565b9091555050505050505050565b5f8051602061641b8339815191525f6117608361220d565b905060048151600581111561177757611777615931565b146117e15760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b606482015260840161056e565b5f8381526005830160205260409020546001600160a01b031633146118185760405162461bcd60e51b815260040161056e90615e63565b5f83815260088301602090815260408083208054908490556005860190925290912054610a0e906001600160a01b031682612b8c565b611856613a89565b5f8181525f8051602061647b8339815191526020526040808220815160e0810190925280545f8051602061641b83398151915293929190829060ff1660038111156118a3576118a3615931565b60038111156118b4576118b4615931565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f61192285612e02565b90505f806119338360400151612fc8565b50915091508184604001511461195b5760405162461bcd60e51b815260040161056e90615bb8565b806001600160401b03168460c001516001600160401b031611156119915760405162461bcd60e51b815260040161056e90615c02565b6003845160038111156119a6576119a6615931565b146119fa5760405162461bcd60e51b815260206004820152603160248201525f8051602061643b8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b606482015260840161056e565b611a0386612c25565b5050505050611a1e60015f8051602061649b83398151915255565b5050565b611a2a613a89565b5f8181525f8051602061647b8339815191526020526040808220815160e0810190925280545f8051602061641b83398151915293929190829060ff166003811115611a7757611a77615931565b6003811115611a8857611a88615931565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611afe8261220d565b90505f83516003811115611b1457611b14615931565b03611b725760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152671bdd08199bdd5b9960c21b606482015260840161056e565b600481516005811115611b8757611b87615931565b14611bea5760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b606482015260840161056e565b600183516003811115611bff57611bff615931565b03611c1657611c0d85612c25565b50505050611d13565b600283516003811115611c2b57611c2b615931565b03611d05578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611c6385606001516114ff565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611cb596959493926001600160401b0390921691908190600401615af0565b602060405180830381865afa158015611cd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf49190615b2e565b5f8681526007860160205260409020555b611d0e85612c25565b505050505b611d2960015f8051602061649b83398151915255565b50565b5f611d35613a89565b611d40833384613ad3565b9050610a2460015f8051602061649b83398151915255565b5f8051602061645b8339815191525f611d7083612e02565b90505f80611d818360400151613e61565b9150915080611de35760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b606482015260840161056e565b60015f83815260078601602052604090205460ff166005811115611e0957611e09615931565b14611e265760405162461bcd60e51b815260040161056e90615ed5565b5f8281526006850160205260408120611e3e91615751565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061647b8339815191526020526040808220815160e0810190925280545f8051602061641b83398151915293929190829060ff166003811115611f1b57611f1b615931565b6003811115611f2c57611f2c615931565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611fa557611fa5615931565b1480611fc35750600381516003811115611fc157611fc1615931565b145b6120175760405162461bcd60e51b815260206004820152603260248201525f8051602061643b833981519152604482015271737461747573206e6f742070656e64696e6760701b606482015260840161056e565b5f612025826040015161220d565b905080606001516001600160401b03165f036120a95760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e20494400606482015260840161056e565b6005600160991b016001600160a01b031663ee5b48eb6120d68460400151846060015185608001516127dc565b6040518263ffffffff1660e01b81526004016120f29190615b67565b6020604051808303815f875af115801561210e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ac39190615b2e565b5f8181525f805160206164bb83398151915260205260409020545f8051602061645b8339815191529060019060ff16600581111561217257612172615931565b1461218f5760405162461bcd60e51b815260040161056e90615ed5565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916121c89190600401615f58565b6020604051808303815f875af11580156121e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122089190615b2e565b505050565b612215615788565b5f8281525f805160206164bb833981519152602052604090819020815160e0810190925280545f8051602061645b833981519152929190829060ff16600581111561226257612262615931565b600581111561227357612273615931565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6122de613a89565b6122ea85858585614002565b905061230260015f8051602061649b83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680612353575080546001600160401b03808416911610155b156123715760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561239c84846142ee565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612434573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261245b9190810190615fed565b91509150806124be5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b606482015260840161056e565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612501573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125259190615b2e565b8251146125895760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b606482015260840161056e565b60208201516001600160a01b0316156125ff5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b606482015260840161056e565b5f8061260e8460400151614308565b9150915081871461267b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b606482015260840161056e565b9695505050505050565b5f8281525f805160206164bb833981519152602052604081206002015481905f8051602061645b83398151915290600160801b90046001600160401b03166126cd85826144e0565b5f6126d7876146ee565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6127278a858b6127dc565b6040518263ffffffff1660e01b81526004016127439190615b67565b6020604051808303815f875af115801561275f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127839190615b2e565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f61283c615788565b5f8051602061645b8339815191525f61285485612e02565b90505f806128658360400151613e61565b9150915080156128ca5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b606482015260840161056e565b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156128fb576128fb615931565b600581111561290c5761290c615931565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561297b5761297b615931565b1480612999575060018151600581111561299757612997615931565b145b6129f85760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b606482015260840161056e565b600381516005811115612a0d57612a0d615931565b03612a1b5760048152612a20565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612a6557612a65615931565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b1957612b19615931565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b5f5f805160206163fb83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612be7575f80fd5b505af1158015612bf9573d5f803e3d5ffd5b50505050505050565b5f805160206163fb83398151915254611a1e906001600160a01b03168383614763565b5f8181525f8051602061647b8339815191526020526040808220815160e0810190925280545f8051602061641b83398151915293929190829060ff166003811115612c7257612c72615931565b6003811115612c8357612c83615931565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b0319168155928301819055919094018190556007870182528281208054908290558482526005880190925291822054939450919261271090612d5890600160a01b900461ffff1684615e4c565b612d629190615b99565b905080856008015f8581526020019081526020015f205f828254612d869190615e17565b909155505f9050612d9782846160bf565b9050612da7856020015182612b8c565b612dbc8560200151610abe87606001516114ff565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612e66573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612e8d9190810190615fed565b9150915080612eed5760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b606482015260840161056e565b815115612f4e5760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b606482015260840161056e565b60208201516001600160a01b031615612fc15760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b606482015260840161056e565b5092915050565b5f805f8351603614612fec5760405162461bcd60e51b815260040161056e906160d2565b5f805b600281101561303b576130038160016160bf565b61300e906008615e4c565b61ffff1686828151811061302457613024615cab565b016020015160f81c901b9190911790600101612fef565b5061ffff81161561305e5760405162461bcd60e51b815260040161056e9061611b565b5f805b60048110156130b9576130758160036160bf565b613080906008615e4c565b63ffffffff1687613092836002615e17565b815181106130a2576130a2615cab565b016020015160f81c901b9190911790600101613061565b5063ffffffff81166004146130e05760405162461bcd60e51b815260040161056e9061615e565b5f805b6020811015613135576130f781601f6160bf565b613102906008615e4c565b8861310e836006615e17565b8151811061311e5761311e615cab565b016020015160f81c901b91909117906001016130e3565b505f805b60088110156131945761314d8160076160bf565b613158906008615e4c565b6001600160401b03168961316d836026615e17565b8151811061317d5761317d615cab565b016020015160f81c901b9190911790600101613139565b505f805b60088110156131f3576131ac8160076160bf565b6131b7906008615e4c565b6001600160401b03168a6131cc83602e615e17565b815181106131dc576131dc615cab565b016020015160f81c901b9190911790600101613198565b5091989097509095509350505050565b5f81516026146132255760405162461bcd60e51b815260040161056e906160d2565b5f805b60028110156132745761323c8160016160bf565b613247906008615e4c565b61ffff1684828151811061325d5761325d615cab565b016020015160f81c901b9190911790600101613228565b5061ffff8116156132975760405162461bcd60e51b815260040161056e9061611b565b5f805b60048110156132f2576132ae8160036160bf565b6132b9906008615e4c565b63ffffffff16856132cb836002615e17565b815181106132db576132db615cab565b016020015160f81c901b919091179060010161329a565b5063ffffffff8116156133175760405162461bcd60e51b815260040161056e9061615e565b5f805b602081101561336c5761332e81601f6160bf565b613339906008615e4c565b86613345836006615e17565b8151811061335557613355615cab565b016020015160f81c901b919091179060010161331a565b50949350505050565b60605f61338483830184615c66565b61339091506058615e4c565b61339b90605c615e17565b6001600160401b038111156133b2576133b2615cdd565b6040519080825280601f01601f1916602001820160405280156133dc576020820181803683370190505b5090505f5b602081101561343157833581602081106133fd576133fd615cab565b1a60f81b82828151811061341357613413615cab565b60200101906001600160f81b03191690815f1a9053506001016133e1565b505f5b6020811015613491578360200135816020811061345357613453615cab565b1a60f81b82613463836020615e17565b8151811061347357613473615cab565b60200101906001600160f81b03191690815f1a905350600101613434565b505f5b60048110156134f4576134a88160036160bf565b6134b3906008615e4c565b6014901c60f81b826134c6836040615e17565b815181106134d6576134d6615cab565b60200101906001600160f81b03191690815f1a905350600101613494565b505f6135066060850160408601615c4b565b60601b90505f5b60148110156135665781816014811061352857613528615cab565b1a60f81b83613538836044615e17565b8151811061354857613548615cab565b60200101906001600160f81b03191690815f1a90535060010161350d565b505f6135756060860186615c66565b905090505f5b60048110156135e05761358f8160036160bf565b61359a906008615e4c565b63ffffffff8316901c60f81b846135b2836058615e17565b815181106135c2576135c2615cab565b60200101906001600160f81b03191690815f1a90535060010161357b565b505f5b6135f06060870187615c66565b9050811015613804575f613605826058615e4c565b61361090605c615e17565b90505f5b602081101561369b5761362a6060890189615c66565b8481811061363a5761363a615cab565b905060200281019061364c9190615cbf565b35816020811061365e5761365e615cab565b1a60f81b8661366d8385615e17565b8151811061367d5761367d615cab565b60200101906001600160f81b03191690815f1a905350600101613614565b505f5b6008811015613750576136b28160076160bf565b6136bd906008615e4c565b6136ca60608a018a615c66565b858181106136da576136da615cab565b90506020028101906136ec9190615cbf565b6136fd9060408101906020016158f8565b6001600160401b0316901c60f81b8682613718856020615e17565b6137229190615e17565b8151811061373257613732615cab565b60200101906001600160f81b03191690815f1a90535060010161369e565b505f5b60308110156137fa576137696060890189615c66565b8481811061377957613779615cab565b905060200281019061378b9190615cbf565b6137999060408101906161a5565b828181106137a9576137a9615cab565b9050013560f81c60f81b86828460286137c29190615e17565b6137cc9190615e17565b815181106137dc576137dc615cab565b60200101906001600160f81b03191690815f1a905350600101613753565b50506001016135e3565b5091949350505050565b613816615788565b5f8281525f805160206164bb8339815191526020526040808220815160e0810190925280545f8051602061645b83398151915293929190829060ff16600581111561386357613863615931565b600581111561387457613874615931565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156138e6576138e6615931565b146139425760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b606482015260840161056e565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561398657613986615931565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613a328582612685565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061649b833981519152805460011901613aba57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061649b83398151915255565b5f5f8051602061641b83398151915281613aef610214856147c2565b90505f613afb8761220d565b9050613b0687612b51565b613b635760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b606482015260840161056e565b600281516005811115613b7857613b78615931565b14613bd75760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b606482015260840161056e565b5f828260800151613be89190615eb5565b60048501546040840151919250613c0a916001600160401b03909116906161e7565b6001600160401b0316816001600160401b03161115613c895760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b606482015260840161056e565b5f80613c958a84612685565b915091505f8a83604051602001613cc392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff19166001836003811115613d5657613d56615931565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714613e845760405162461bcd60e51b815260040161056e906160d2565b5f805b6002811015613ed357613e9b8160016160bf565b613ea6906008615e4c565b61ffff16858281518110613ebc57613ebc615cab565b016020015160f81c901b9190911790600101613e87565b5061ffff811615613ef65760405162461bcd60e51b815260040161056e9061611b565b5f805b6004811015613f5157613f0d8160036160bf565b613f18906008615e4c565b63ffffffff1686613f2a836002615e17565b81518110613f3a57613f3a615cab565b016020015160f81c901b9190911790600101613ef9565b5063ffffffff8116600314613f785760405162461bcd60e51b815260040161056e9061615e565b5f805b6020811015613fcd57613f8f81601f6160bf565b613f9a906008615e4c565b87613fa6836006615e17565b81518110613fb657613fb6615cab565b016020015160f81c901b9190911790600101613f7b565b505f86602681518110613fe257613fe2615cab565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f8051602061641b8339815191529061ffff861610156140895760405162461bcd60e51b815260206004820152602b60248201525f8051602061643b83398151915260448201526a66656520746f6f206c6f7760a81b606482015260840161056e565b61271061ffff861611156140e15760405162461bcd60e51b815260206004820152602c60248201525f8051602061643b83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b606482015260840161056e565b60028101546001600160401b03908116908516101561415a5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b606482015260840161056e565b80548310156141bd5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b606482015260840161056e565b80600101548311156142245760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b606482015260840161056e565b5f61422e846147c2565b90505f61423a82610a14565b90505f61424789836147e5565b9050604051806060016040528061425b3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6142f6614d9b565b6142ff82614de6565b611a1e81614e58565b5f808251602e1461432b5760405162461bcd60e51b815260040161056e906160d2565b5f805b600281101561437a576143428160016160bf565b61434d906008615e4c565b61ffff1685828151811061436357614363615cab565b016020015160f81c901b919091179060010161432e565b5061ffff81161561439d5760405162461bcd60e51b815260040161056e9061611b565b5f805b60048110156143f8576143b48160036160bf565b6143bf906008615e4c565b63ffffffff16866143d1836002615e17565b815181106143e1576143e1615cab565b016020015160f81c901b91909117906001016143a0565b5063ffffffff811660051461441f5760405162461bcd60e51b815260040161056e9061615e565b5f805b60208110156144745761443681601f6160bf565b614441906008615e4c565b8761444d836006615e17565b8151811061445d5761445d615cab565b016020015160f81c901b9190911790600101614422565b505f805b60088110156144d35761448c8160076160bf565b614497906008615e4c565b6001600160401b0316886144ac836026615e17565b815181106144bc576144bc615cab565b016020015160f81c901b9190911790600101614478565b5090969095509350505050565b5f8051602061645b8339815191525f6001600160401b0380841690851611156145145761450d8385615ad0565b9050614521565b61451e8484615ad0565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061458357506001840154815161457f916001600160401b031690615e17565b8210155b156145a9576001600160401b0383166060820152818152604081015160208201526145c8565b82816060018181516145bb9190615eb5565b6001600160401b03169052505b60608101516145d89060646161e7565b602082015160018601546001600160401b0392909216916146039190600160401b900460ff16615e4c565b10156146675760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b606482015260840161056e565b856001600160401b0316816040018181516146829190615e17565b9052506040810180516001600160401b03871691906146a29083906160bf565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206164bb8339815191526020526040812060020180545f8051602061645b833981519152919060089061473890600160401b90046001600160401b0316616212565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b0383811660248301526044820183905261220891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614ef9565b5f610a24825f805160206163fb833981519152546001600160a01b031690614f5a565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166148705760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b606482015260840161056e565b5f8051602061645b8339815191524261488f60408601602087016158f8565b6001600160401b0316116149015760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b606482015260840161056e565b61491160408501602086016158f8565b6001600160401b03166149276202a30042615e17565b1161499a5760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e20667574757265000000000000000000606482015260840161056e565b83356149f25760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b606482015260840161056e565b83355f90815260088201602052604090205415614a625760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b606482015260840161056e565b6030614a7160408601866161a5565b905014614ad65760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b606482015260840161056e565b614ae0835f6144e0565b5f80614b796040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614b2491906158f8565b6001600160401b03168152602001614b3f60408a018a6161a5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506150bc565b5f82815260068601602052604090209193509150614b978282616271565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614bd5908590600401615b67565b6020604051808303815f875af1158015614bf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614c159190615b2e565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614c8d57614c8d615931565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614d6d918e01908e016158f8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16614de457604051631afcd79f60e31b815260040160405180910390fd5b565b614dee614d9b565b614df7816151c0565b614dff6151d9565b611d2960608201356080830135614e1c60c0850160a086016158f8565b614e2c60e0860160c08701616330565b61ffff16614e41610100870160e08801616349565b614e5361012088016101008901615c4b565b6151e9565b614e60614d9b565b5f805160206163fb8339815191526001600160a01b038216614ed95760405162461bcd60e51b815260206004820152602c60248201527f4552433230546f6b656e5374616b696e674d616e616765723a207a65726f207460448201526b6f6b656e206164647265737360a01b606482015260840161056e565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f614f0d6001600160a01b03841683615471565b905080515f14158015614f31575080806020019051810190614f2f9190616369565b155b1561220857604051635274afe760e01b81526001600160a01b038416600482015260240161056e565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614fa0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614fc49190615b2e565b9050614fdb6001600160a01b03851633308661547e565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561501f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150439190615b2e565b90508181116150a95760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161056e565b6150b382826160bf565b95945050505050565b5f60608260800151516030146151265760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b606482015260840161056e565b5f806001855f015186602001518760400151886080015189606001516040516020016151589796959493929190616384565b60405160208183030381529060405290506002816040516151799190615e06565b602060405180830381855afa158015615194573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906151b79190615b2e565b94909350915050565b6151c8614d9b565b6151d06154b7565b611d29816154bf565b6151e1614d9b565b614de461563a565b6151f1614d9b565b5f8051602061641b8339815191528361525d5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b606482015260840161056e565b6127108411156152c35760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b606482015260840161056e565b8587111561532b5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b606482015260840161056e565b5f8360ff16116153985760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b606482015260840161056e565b600a60ff8416111561540a5760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b606482015260840161056e565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b606061282c83835f615642565b6040516001600160a01b038481166024830152838116604483015260648201839052610a0e9186918216906323b872dd90608401614790565b614de4614d9b565b6154c7614d9b565b80355f8051602061645b83398151915290815560146154ec6060840160408501616349565b60ff1611156155595760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b606482015260840161056e565b5f61556a6060840160408501616349565b60ff16116155d25760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b606482015260840161056e565b6155e26060830160408401616349565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561561360408301602084016158f8565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613ac0614d9b565b6060814710156156675760405163cd78605960e01b815230600482015260240161056e565b5f80856001600160a01b031684866040516156829190615e06565b5f6040518083038185875af1925050503d805f81146156bc576040519150601f19603f3d011682016040523d82523d5f602084013e6156c1565b606091505b509150915061267b8683836060826156e1576156dc82615728565b61282c565b81511580156156f857506001600160a01b0384163b155b1561572157604051639996b31560e01b81526001600160a01b038516600482015260240161056e565b508061282c565b8051156157385780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461575d90615f20565b5f825580601f1061576c575050565b601f0160209004905f5260205f2090810190611d2991906157c4565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156157d8575f81556001016157c5565b5090565b8015158114611d29575f80fd5b803563ffffffff811681146157fc575f80fd5b919050565b5f805f60608486031215615813575f80fd5b833592506020840135615825816157dc565b9150615833604085016157e9565b90509250925092565b5f6020828403121561584c575f80fd5b5035919050565b5f60208284031215615863575f80fd5b61282c826157e9565b5f806040838503121561587d575f80fd5b615886836157e9565b946020939093013593505050565b5f80604083850312156158a5575f80fd5b82356001600160401b038111156158ba575f80fd5b8301608081860312156158cb575f80fd5b91506158d9602084016157e9565b90509250929050565b80356001600160401b03811681146157fc575f80fd5b5f60208284031215615908575f80fd5b61282c826158e2565b5f8060408385031215615922575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061596857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516159a360608401826001600160401b03169052565b5060808301516159be60808401826001600160401b03169052565b5060a08301516159d960a08401826001600160401b03169052565b5060c0830151612fc160c08401826001600160401b03169052565b803561ffff811681146157fc575f80fd5b5f805f8060808587031215615a18575f80fd5b84356001600160401b03811115615a2d575f80fd5b850160608188031215615a3e575f80fd5b9350615a4c602086016159f4565b9250615a5a604086016158e2565b9396929550929360600135925050565b6001600160a01b0381168114611d29575f80fd5b5f80828403610140811215615a91575f80fd5b61012080821215615aa0575f80fd5b8493508301359050615ab181615a6a565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612fc157612fc1615abc565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615b3e575f80fd5b5051919050565b5f5b83811015615b5f578181015183820152602001615b47565b50505f910152565b602081525f8251806020840152615b85816040850160208701615b45565b601f01601f19169190910160400192915050565b5f82615bb357634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b5f60208284031215615c5b575f80fd5b813561282c81615a6a565b5f808335601e19843603018112615c7b575f80fd5b8301803591506001600160401b03821115615c94575f80fd5b6020019150600581901b36038213156127d5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615cd3575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615d1357615d13615cdd565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615d4157615d41615cdd565b604052919050565b5f6001600160401b03821115615d6157615d61615cdd565b50601f01601f191660200190565b5f60608236031215615d7f575f80fd5b615d87615cf1565b823581526020615d988185016158e2565b8183015260408401356001600160401b03811115615db4575f80fd5b840136601f820112615dc4575f80fd5b8035615dd7615dd282615d49565b615d19565b8181523684838501011115615dea575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615cd3818460208701615b45565b80820180821115610a2457610a24615abc565b5f63ffffffff808316818103615e4257615e42615abc565b6001019392505050565b8082028115828204841417610a2457610a24615abc565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b03818116838216019080821115612fc157612fc1615abc565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615f3457607f821691505b602082108103615f5257634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454615f6a81615f20565b806020870152604060018084165f8114615f8b5760018114615fa757615fd4565b60ff19851660408a0152604084151560051b8a01019550615fd4565b895f5260205f205f5b85811015615fcb5781548b8201860152908301908801615fb0565b8a016040019650505b509398975050505050505050565b80516157fc816157dc565b5f8060408385031215615ffe575f80fd5b82516001600160401b0380821115616014575f80fd5b9084019060608287031215616027575f80fd5b61602f615cf1565b8251815260208084015161604281615a6a565b82820152604084015183811115616057575f80fd5b80850194505087601f85011261606b575f80fd5b8351925061607b615dd284615d49565b838152888285870101111561608e575f80fd5b61609d84838301848801615b45565b806040840152508195506160b2818801615fe2565b9450505050509250929050565b81810381811115610a2457610a24615abc565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e198436030181126161ba575f80fd5b8301803591506001600160401b038211156161d3575f80fd5b6020019150368190038213156127d5575f80fd5b6001600160401b0381811683821602808216919082811461620a5761620a615abc565b505092915050565b5f6001600160401b03808316818103615e4257615e42615abc565b601f82111561220857805f5260205f20601f840160051c810160208510156162525750805b601f840160051c820191505b81811015610ac3575f815560010161625e565b81516001600160401b0381111561628a5761628a615cdd565b61629e816162988454615f20565b8461622d565b602080601f8311600181146162d1575f84156162ba5750858301515b5f19600386901b1c1916600185901b178555616328565b5f85815260208120601f198616915b828110156162ff578886015182559484019460019091019084016162e0565b508582101561631c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215616340575f80fd5b61282c826159f4565b5f60208284031215616359575f80fd5b813560ff8116811461282c575f80fd5b5f60208284031215616379575f80fd5b815161282c816157dc565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516163d981604e860160208901615b45565b60c09490941b1691909201604e81019190915260560197965050505050505056fe6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 4b0c36b6a..4e1c5fe5a 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516163f73803806163f783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6162aa8061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004615661565b61058b565b005b3480156101ea575f80fd5b506101dd6101f936600461569c565b6109ee565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd6102433660046156b3565b610ba7565b348015610253575f80fd5b5061026761026236600461569c565b610c84565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046156f1565b610c9a565b604051908152602001610220565b348015610305575f80fd5b506101dd610314366004615745565b610cce565b348015610324575f80fd5b506101dd61033336600461575e565b610d6e565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b366004615786565b6111fe565b34801561038b575f80fd5b506102ec61039a3660046157d4565b6117e1565b3480156103aa575f80fd5b506102676103b936600461569c565b6117fa565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb366004615661565b61180e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e36600461569c565b611a2a565b34801561042e575f80fd5b506101dd61043d36600461575e565b611b30565b34801561044d575f80fd5b506101dd61045c36600461569c565b611d13565b34801561046c575f80fd5b506101dd61047b366004615745565b61202c565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b436600461569c565b6121a2565b3480156104c4575f80fd5b506101dd6104d336600461569c565b612415565b6102ec6104e636600461569c565b6124f0565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e61051936600461569c565b612521565b6040516102209190615801565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b36600461569c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f8051602061623e83398151915260205260408082208151610100810190925280545f805160206161de83398151915293929190829060ff1660038111156105d9576105d96157ed565b60038111156105ea576105ea6157ed565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f61066e82612521565b9050600283516003811115610685576106856157ed565b146106d75760405162461bcd60e51b815260206004820152602a60248201525f805160206161fe8339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461073c5760405162461bcd60e51b815260206004820152603360248201525f805160206161fe8339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106ce565b6003835280515f906002906005811115610758576107586157ed565b036107af5786156107705761076d83876125e9565b90505b5f8460600151836080015161078591906158c4565b90506107918482612885565b506001600160401b0390811660e0870152421660a0860152506107e3565b505f82815260098501602052604090205460608201516001600160401b0390811660e086015260c0830151811660a0860152165b8460040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b561081686606001516117e1565b8460a0015187608001518860a00151865f806040518863ffffffff1660e01b815260040161084a97969594939291906158e4565b602060405180830381865afa158015610865573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108899190615922565b5f898152600787016020908152604080832093909355600688019052208451815486929190829060ff191660018360038111156108c8576108c86157ed565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b031990911617815560408083015160018301556060830151600283018054608086015160a08088015160c08901516001600160401b03908116600160c01b026001600160c01b03928216600160801b02929092166001600160801b03948216600160401b026001600160801b0319909616978216979097179490941792909216949094171790915560e090940151600390930180549390941667ffffffffffffffff199390931692909217909255850151905184918a917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69916109dc916001600160401b0391909116815260200190565b60405180910390a35050505050505050565b5f8181525f8051602061627e8339815191526020526040808220815160e0810190925280545f8051602061621e83398151915293929190829060ff166005811115610a3b57610a3b6157ed565b6005811115610a4c57610a4c6157ed565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610abb57610abb6157ed565b14610b205760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb610b458584606001515f6129dc565b6040518263ffffffff1660e01b8152600401610b61919061595b565b6020604051808303815f875af1158015610b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba19190615922565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bf0575080546001600160401b03808416911610155b15610c0e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610c3883612a2b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c9464e8d4a510008361598d565b92915050565b5f610ca3612a3c565b610caf84848434612a73565b9050610cc760015f8051602061625e83398151915255565b9392505050565b5f805160206161de8339815191525f80610ce784612d67565b91509150610cf482613085565b610cfe5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610d2c57610d2c6157ed565b03610d51575f83815260088501602052604081208054919055610d4f82826130c0565b505b610d6781610d6284604001516117e1565b613126565b5050505050565b5f8181525f8051602061623e83398151915260205260408082208151610100810190925280545f805160206161de83398151915293929190829060ff166003811115610dbc57610dbc6157ed565b6003811115610dcd57610dcd6157ed565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f90610e5290612521565b9050600182516003811115610e6957610e696157ed565b14610ed25760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106ce565b600381516005811115610ee757610ee76157ed565b0361105f57600380835260c0820180516001600160401b0390811660808601529051811660a085015260608301511660e08401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610f4b57610f4b6157ed565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039092169190910217825560408084015160018401556060840151600284018054608087015160a088015160c0808a01516001600160401b039687166001600160801b031990951694909417600160401b93871693909302929092176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909501516003909401805467ffffffffffffffff191694821694909417909355858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115611074576110746157ed565b0361108257610d6784613139565b5f61108c86613336565b90505f8061109d83604001516134fc565b5091509150818560400151146110c55760405162461bcd60e51b81526004016106ce906159ac565b806001600160401b031684606001516001600160401b031610156111365760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106ce565b806001600160401b03168560c001516001600160401b0316111561116c5760405162461bcd60e51b81526004016106ce906159f6565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061621e8339815191529060ff161561129b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156112de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113029190615922565b8360200135146113645760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106ce565b306113756060850160408601615a53565b6001600160a01b0316146113e75760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106ce565b5f6113f56060850185615a6e565b905090505f805b828163ffffffff1610156116e5575f6114186060880188615a6e565b8363ffffffff1681811061142e5761142e615ab3565b90506020028101906114409190615ac7565b61144990615b77565b80515f81815260088801602052604090205491925090156114c15760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106ce565b5f6002895f0135856040516020016114f092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261150a91615c0e565b602060405180830381855afa158015611525573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115489190615922565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156115d4576115d46157ed565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611687911686615c1f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806116de90615c32565b90506113fc565b50600483018190555f6116f785613336565b90505f6117078260400151613737565b90505f611713886138a9565b9050816002826040516117269190615c0e565b602060405180830381855afa158015611741573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906117649190615922565b146117c85760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106ce565b5050506009909201805460ff1916600117905550505050565b5f610c946001600160401b03831664e8d4a51000615c54565b5f61180482612521565b6080015192915050565b5f805160206161de8339815191525f61182685613d42565b905061183185613085565b61183c575050505050565b5f8581526005830160205260409020546001600160a01b031633146118735760405162461bcd60e51b81526004016106ce90615c6b565b5f85815260058301602052604090205460a08201516118a291600160b01b90046001600160401b031690615cbd565b6001600160401b03168160c001516001600160401b031610156119235760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106ce565b8315610d67575f61193486856125e9565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061198b906117e1565b60a085015160c08601516040516001600160e01b031960e086901b1681526119bf939291829188905f9081906004016158e4565b602060405180830381865afa1580156119da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119fe9190615922565b5f87815260088501602052604081208054909190611a1d908490615c1f565b9091555050505050505050565b5f805160206161de8339815191525f611a4283612521565b9050600481516005811115611a5957611a596157ed565b14611ac35760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106ce565b5f8381526005830160205260409020546001600160a01b03163314611afa5760405162461bcd60e51b81526004016106ce90615c6b565b5f83815260088301602090815260408083208054908490556005860190925290912054610ba1906001600160a01b0316826130c0565b611b38612a3c565b5f8181525f8051602061623e83398151915260205260408082208151610100810190925280545f805160206161de83398151915293929190829060ff166003811115611b8657611b866157ed565b6003811115611b9757611b976157ed565b8152815461010090046001600160a01b031660208201526001820154604082015260028201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b909104811660c083015260039092015490911660e09091015290505f611c1385613336565b90505f80611c2483604001516134fc565b509150915081846040015114611c4c5760405162461bcd60e51b81526004016106ce906159ac565b806001600160401b03168460e001516001600160401b03161115611c825760405162461bcd60e51b81526004016106ce906159f6565b600384516003811115611c9757611c976157ed565b14611ceb5760405162461bcd60e51b815260206004820152603160248201525f805160206161fe8339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106ce565b611cf486613139565b5050505050611d0f60015f8051602061625e83398151915255565b5050565b611d1b612a3c565b5f8181525f8051602061623e83398151915260205260408082208151610100810190925280545f805160206161de83398151915293929190829060ff166003811115611d6957611d696157ed565b6003811115611d7a57611d7a6157ed565b8152815461010090046001600160a01b03166020820152600182015460408083019190915260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e0909101528101519091505f611dfe82612521565b90505f83516003811115611e1457611e146157ed565b03611e725760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152671bdd08199bdd5b9960c21b60648201526084016106ce565b600481516005811115611e8757611e876157ed565b14611eea5760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106ce565b600183516003811115611eff57611eff6157ed565b03611f1657611f0d85613139565b50505050612013565b600283516003811115611f2b57611f2b6157ed565b03612005578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611f6385606001516117e1565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611fb596959493926001600160401b03909216919081906004016158e4565b602060405180830381865afa158015611fd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ff49190615922565b5f8681526007860160205260409020555b61200e85613139565b505050505b61202960015f8051602061625e83398151915255565b50565b5f8051602061621e8339815191525f61204483613336565b90505f806120558360400151613fbd565b91509150806120b75760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106ce565b60015f83815260078601602052604090205460ff1660058111156120dd576120dd6157ed565b146120fa5760405162461bcd60e51b81526004016106ce90615cdd565b5f8281526006850160205260408120612112916155b6565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f8051602061623e83398151915260205260408082208151610100810190925280545f805160206161de83398151915293929190829060ff1660038111156121f0576121f06157ed565b6003811115612201576122016157ed565b8152815461010090046001600160a01b03166020820152600180830154604083015260028301546001600160401b038082166060850152600160401b820481166080850152600160801b8204811660a0850152600160c01b909104811660c084015260039093015490921660e09091015290915081516003811115612288576122886157ed565b14806122a657506003815160038111156122a4576122a46157ed565b145b6122fa5760405162461bcd60e51b815260206004820152603260248201525f805160206161fe833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106ce565b5f6123088260400151612521565b905080606001516001600160401b03165f0361238c5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106ce565b6005600160991b016001600160a01b031663ee5b48eb6123b98460400151846060015185608001516129dc565b6040518263ffffffff1660e01b81526004016123d5919061595b565b6020604051808303815f875af11580156123f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d679190615922565b5f8181525f8051602061627e83398151915260205260409020545f8051602061621e8339815191529060019060ff166005811115612455576124556157ed565b146124725760405162461bcd60e51b81526004016106ce90615cdd565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916124ab9190600401615d5a565b6020604051808303815f875af11580156124c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124eb9190615922565b505050565b5f6124f9612a3c565b61250482333461415e565b905061251c60015f8051602061625e83398151915255565b919050565b6125296155ed565b5f8281525f8051602061627e833981519152602052604090819020815160e0810190925280545f8051602061621e833981519152929190829060ff166005811115612576576125766157ed565b6005811115612587576125876157ed565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612634573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261265b9190810190615def565b91509150806126be5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106ce565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612701573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127259190615922565b8251146127895760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106ce565b60208201516001600160a01b0316156127ff5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106ce565b5f8061280e8460400151614515565b9150915081871461287b5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106ce565b9695505050505050565b5f8281525f8051602061627e833981519152602052604081206002015481905f8051602061621e83398151915290600160801b90046001600160401b03166128cd85826146ed565b5f6128d7876148fb565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6129278a858b6129dc565b6040518263ffffffff1660e01b8152600401612943919061595b565b6020604051808303815f875af115801561295f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129839190615922565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612a33614970565b612029816149bb565b5f8051602061625e833981519152805460011901612a6d57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206161de8339815191529061ffff86161015612afa5760405162461bcd60e51b815260206004820152602b60248201525f805160206161fe83398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106ce565b61271061ffff86161115612b525760405162461bcd60e51b815260206004820152602c60248201525f805160206161fe83398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106ce565b60028101546001600160401b039081169085161015612bcb5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106ce565b8054831015612c2e5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106ce565b8060010154831115612c955760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106ce565b825f612ca082610c84565b90505f612cad8983614a2d565b90506040518060600160405280612cc13390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061625e83398151915255565b5f612d706155ed565b5f8051602061621e8339815191525f612d8885613336565b90505f80612d998360400151613fbd565b915091508015612dfe5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106ce565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612e2f57612e2f6157ed565b6005811115612e4057612e406157ed565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612eaf57612eaf6157ed565b1480612ecd5750600181516005811115612ecb57612ecb6157ed565b145b612f2c5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106ce565b600381516005811115612f4157612f416157ed565b03612f4f5760048152612f54565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612f9957612f996157ed565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561304d5761304d6157ed565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561310c575f80fd5b505af115801561311e573d5f803e3d5ffd5b505050505050565b611d0f6001600160a01b03831682614fe3565b5f8181525f8051602061623e83398151915260205260408082208151610100810190925280545f805160206161de83398151915293929190829060ff166003811115613187576131876157ed565b6003811115613198576131986157ed565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002808601546001600160401b038082166060880152600160401b820481166080880152600160801b8204811660a0880152600160c01b909104811660c08701526003968701541660e090950194909452858101515f8a815260068a01855282812080546001600160a81b031916815593840181905594830185905591909401805467ffffffffffffffff19169055600787018252838320805490849055818452600588019092529282205493945091926127109061328c90600160a01b900461ffff1684615c54565b613296919061598d565b905080856008015f8581526020019081526020015f205f8282546132ba9190615c1f565b909155505f90506132cb8284615ec1565b90506132db8560200151826130c0565b6132f08560200151610d6287606001516117e1565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561339a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526133c19190810190615def565b91509150806134215760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106ce565b8151156134825760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106ce565b60208201516001600160a01b0316156134f55760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106ce565b5092915050565b5f805f83516036146135205760405162461bcd60e51b81526004016106ce90615ed4565b5f805b600281101561356f57613537816001615ec1565b613542906008615c54565b61ffff1686828151811061355857613558615ab3565b016020015160f81c901b9190911790600101613523565b5061ffff8116156135925760405162461bcd60e51b81526004016106ce90615f1d565b5f805b60048110156135ed576135a9816003615ec1565b6135b4906008615c54565b63ffffffff16876135c6836002615c1f565b815181106135d6576135d6615ab3565b016020015160f81c901b9190911790600101613595565b5063ffffffff81166004146136145760405162461bcd60e51b81526004016106ce90615f60565b5f805b60208110156136695761362b81601f615ec1565b613636906008615c54565b88613642836006615c1f565b8151811061365257613652615ab3565b016020015160f81c901b9190911790600101613617565b505f805b60088110156136c857613681816007615ec1565b61368c906008615c54565b6001600160401b0316896136a1836026615c1f565b815181106136b1576136b1615ab3565b016020015160f81c901b919091179060010161366d565b505f805b6008811015613727576136e0816007615ec1565b6136eb906008615c54565b6001600160401b03168a61370083602e615c1f565b8151811061371057613710615ab3565b016020015160f81c901b91909117906001016136cc565b5091989097509095509350505050565b5f81516026146137595760405162461bcd60e51b81526004016106ce90615ed4565b5f805b60028110156137a857613770816001615ec1565b61377b906008615c54565b61ffff1684828151811061379157613791615ab3565b016020015160f81c901b919091179060010161375c565b5061ffff8116156137cb5760405162461bcd60e51b81526004016106ce90615f1d565b5f805b6004811015613826576137e2816003615ec1565b6137ed906008615c54565b63ffffffff16856137ff836002615c1f565b8151811061380f5761380f615ab3565b016020015160f81c901b91909117906001016137ce565b5063ffffffff81161561384b5760405162461bcd60e51b81526004016106ce90615f60565b5f805b60208110156138a05761386281601f615ec1565b61386d906008615c54565b86613879836006615c1f565b8151811061388957613889615ab3565b016020015160f81c901b919091179060010161384e565b50949350505050565b60605f6138b883830184615a6e565b6138c491506058615c54565b6138cf90605c615c1f565b6001600160401b038111156138e6576138e6615ae5565b6040519080825280601f01601f191660200182016040528015613910576020820181803683370190505b5090505f5b6020811015613965578335816020811061393157613931615ab3565b1a60f81b82828151811061394757613947615ab3565b60200101906001600160f81b03191690815f1a905350600101613915565b505f5b60208110156139c5578360200135816020811061398757613987615ab3565b1a60f81b82613997836020615c1f565b815181106139a7576139a7615ab3565b60200101906001600160f81b03191690815f1a905350600101613968565b505f5b6004811015613a28576139dc816003615ec1565b6139e7906008615c54565b6014901c60f81b826139fa836040615c1f565b81518110613a0a57613a0a615ab3565b60200101906001600160f81b03191690815f1a9053506001016139c8565b505f613a3a6060850160408601615a53565b60601b90505f5b6014811015613a9a57818160148110613a5c57613a5c615ab3565b1a60f81b83613a6c836044615c1f565b81518110613a7c57613a7c615ab3565b60200101906001600160f81b03191690815f1a905350600101613a41565b505f613aa96060860186615a6e565b905090505f5b6004811015613b1457613ac3816003615ec1565b613ace906008615c54565b63ffffffff8316901c60f81b84613ae6836058615c1f565b81518110613af657613af6615ab3565b60200101906001600160f81b03191690815f1a905350600101613aaf565b505f5b613b246060870187615a6e565b9050811015613d38575f613b39826058615c54565b613b4490605c615c1f565b90505f5b6020811015613bcf57613b5e6060890189615a6e565b84818110613b6e57613b6e615ab3565b9050602002810190613b809190615ac7565b358160208110613b9257613b92615ab3565b1a60f81b86613ba18385615c1f565b81518110613bb157613bb1615ab3565b60200101906001600160f81b03191690815f1a905350600101613b48565b505f5b6008811015613c8457613be6816007615ec1565b613bf1906008615c54565b613bfe60608a018a615a6e565b85818110613c0e57613c0e615ab3565b9050602002810190613c209190615ac7565b613c319060408101906020016157d4565b6001600160401b0316901c60f81b8682613c4c856020615c1f565b613c569190615c1f565b81518110613c6657613c66615ab3565b60200101906001600160f81b03191690815f1a905350600101613bd2565b505f5b6030811015613d2e57613c9d6060890189615a6e565b84818110613cad57613cad615ab3565b9050602002810190613cbf9190615ac7565b613ccd906040810190615fa7565b82818110613cdd57613cdd615ab3565b9050013560f81c60f81b8682846028613cf69190615c1f565b613d009190615c1f565b81518110613d1057613d10615ab3565b60200101906001600160f81b03191690815f1a905350600101613c87565b5050600101613b17565b5091949350505050565b613d4a6155ed565b5f8281525f8051602061627e8339815191526020526040808220815160e0810190925280545f8051602061621e83398151915293929190829060ff166005811115613d9757613d976157ed565b6005811115613da857613da86157ed565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e1a57613e1a6157ed565b14613e765760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106ce565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613eba57613eba6157ed565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f668582612885565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613fe05760405162461bcd60e51b81526004016106ce90615ed4565b5f805b600281101561402f57613ff7816001615ec1565b614002906008615c54565b61ffff1685828151811061401857614018615ab3565b016020015160f81c901b9190911790600101613fe3565b5061ffff8116156140525760405162461bcd60e51b81526004016106ce90615f1d565b5f805b60048110156140ad57614069816003615ec1565b614074906008615c54565b63ffffffff1686614086836002615c1f565b8151811061409657614096615ab3565b016020015160f81c901b9190911790600101614055565b5063ffffffff81166003146140d45760405162461bcd60e51b81526004016106ce90615f60565b5f805b6020811015614129576140eb81601f615ec1565b6140f6906008615c54565b87614102836006615c1f565b8151811061411257614112615ab3565b016020015160f81c901b91909117906001016140d7565b505f8660268151811061413e5761413e615ab3565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206161de8339815191528161417784610c84565b90505f61418387612521565b905061418e87613085565b6141eb5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106ce565b600281516005811115614200576142006157ed565b1461425f5760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106ce565b5f8282608001516142709190615cbd565b60048501546040840151919250614292916001600160401b0390911690615fe9565b6001600160401b0316816001600160401b031611156143115760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106ce565b5f8061431d8a84612885565b915091505f8a8360405160200161434b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f1981840301815282825280516020909101206101008301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905260a0850181905290881660c085015260e090930183905284835260068b01909152902081518154829060ff191660018360038111156143e6576143e66157ed565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002860180546080808a015160a08b015160c08c01516001600160401b039687166001600160801b031990951694909417600160401b92871692909202919091176001600160801b0316600160801b918616919091026001600160c01b031617600160c01b928516929092029190911790915560e0909701516003909601805467ffffffffffffffff191696821696909617909555815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146145385760405162461bcd60e51b81526004016106ce90615ed4565b5f805b60028110156145875761454f816001615ec1565b61455a906008615c54565b61ffff1685828151811061457057614570615ab3565b016020015160f81c901b919091179060010161453b565b5061ffff8116156145aa5760405162461bcd60e51b81526004016106ce90615f1d565b5f805b6004811015614605576145c1816003615ec1565b6145cc906008615c54565b63ffffffff16866145de836002615c1f565b815181106145ee576145ee615ab3565b016020015160f81c901b91909117906001016145ad565b5063ffffffff811660051461462c5760405162461bcd60e51b81526004016106ce90615f60565b5f805b60208110156146815761464381601f615ec1565b61464e906008615c54565b8761465a836006615c1f565b8151811061466a5761466a615ab3565b016020015160f81c901b919091179060010161462f565b505f805b60088110156146e057614699816007615ec1565b6146a4906008615c54565b6001600160401b0316886146b9836026615c1f565b815181106146c9576146c9615ab3565b016020015160f81c901b9190911790600101614685565b5090969095509350505050565b5f8051602061621e8339815191525f6001600160401b0380841690851611156147215761471a83856158c4565b905061472e565b61472b84846158c4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061479057506001840154815161478c916001600160401b031690615c1f565b8210155b156147b6576001600160401b0383166060820152818152604081015160208201526147d5565b82816060018181516147c89190615cbd565b6001600160401b03169052505b60608101516147e5906064615fe9565b602082015160018601546001600160401b0392909216916148109190600160401b900460ff16615c54565b10156148745760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106ce565b856001600160401b03168160400181815161488f9190615c1f565b9052506040810180516001600160401b03871691906148af908390615ec1565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061627e8339815191526020526040812060020180545f8051602061621e833981519152919060089061494590600160401b90046001600160401b0316616014565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166149b957604051631afcd79f60e31b815260040160405180910390fd5b565b6149c3614970565b6149cc81615076565b6149d461508f565b612029606082013560808301356149f160c0850160a086016157d4565b614a0160e0860160c0870161602f565b61ffff16614a16610100870160e08801616048565b614a2861012088016101008901615a53565b61509f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16614ab85760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106ce565b5f8051602061621e83398151915242614ad760408601602087016157d4565b6001600160401b031611614b495760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106ce565b614b5960408501602086016157d4565b6001600160401b0316614b6f6202a30042615c1f565b11614be25760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106ce565b8335614c3a5760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106ce565b83355f90815260088201602052604090205415614caa5760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106ce565b6030614cb96040860186615fa7565b905014614d1e5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106ce565b614d28835f6146ed565b5f80614dc16040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614d6c91906157d4565b6001600160401b03168152602001614d8760408a018a615fa7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250615327565b5f82815260068601602052604090209193509150614ddf82826160ac565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614e1d90859060040161595b565b6020604051808303815f875af1158015614e39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e5d9190615922565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614ed557614ed56157ed565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614fb5918e01908e016157d4565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156150065760405163cd78605960e01b81523060048201526024016106ce565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461504f576040519150601f19603f3d011682016040523d82523d5f602084013e615054565b606091505b50509050806124eb57604051630a12f52160e11b815260040160405180910390fd5b61507e614970565b61508661542b565b61202981615433565b615097614970565b6149b96155ae565b6150a7614970565b5f805160206161de833981519152836151135760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106ce565b6127108411156151795760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106ce565b858711156151e15760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106ce565b5f8360ff161161524e5760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106ce565b600a60ff841611156152c05760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106ce565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146153915760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106ce565b5f806001855f015186602001518760400151886080015189606001516040516020016153c39796959493929190616167565b60405160208183030381529060405290506002816040516153e49190615c0e565b602060405180830381855afa1580156153ff573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906154229190615922565b94909350915050565b6149b9614970565b61543b614970565b80355f8051602061621e83398151915290815560146154606060840160408501616048565b60ff1611156154cd5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106ce565b5f6154de6060840160408501616048565b60ff16116155465760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106ce565b6155566060830160408401616048565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561558760408301602084016157d4565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612d54614970565b5080546155c290615d28565b5f825580601f106155d1575050565b601f0160209004905f5260205f20908101906120299190615629565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561563d575f815560010161562a565b5090565b8015158114612029575f80fd5b803563ffffffff8116811461251c575f80fd5b5f805f60608486031215615673575f80fd5b83359250602084013561568581615641565b91506156936040850161564e565b90509250925092565b5f602082840312156156ac575f80fd5b5035919050565b5f61012082840312156156c4575f80fd5b50919050565b803561ffff8116811461251c575f80fd5b80356001600160401b038116811461251c575f80fd5b5f805f60608486031215615703575f80fd5b83356001600160401b03811115615718575f80fd5b840160608187031215615729575f80fd5b9250615737602085016156ca565b9150615693604085016156db565b5f60208284031215615755575f80fd5b610cc78261564e565b5f806040838503121561576f575f80fd5b6157788361564e565b946020939093013593505050565b5f8060408385031215615797575f80fd5b82356001600160401b038111156157ac575f80fd5b8301608081860312156157bd575f80fd5b91506157cb6020840161564e565b90509250929050565b5f602082840312156157e4575f80fd5b610cc7826156db565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061582457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161585f60608401826001600160401b03169052565b50608083015161587a60808401826001600160401b03169052565b5060a083015161589560a08401826001600160401b03169052565b5060c08301516134f560c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156134f5576134f56158b0565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615932575f80fd5b5051919050565b5f5b8381101561595357818101518382015260200161593b565b50505f910152565b602081525f8251806020840152615979816040850160208701615939565b601f01601f19169190910160400192915050565b5f826159a757634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114612029575f80fd5b5f60208284031215615a63575f80fd5b8135610cc781615a3f565b5f808335601e19843603018112615a83575f80fd5b8301803591506001600160401b03821115615a9c575f80fd5b6020019150600581901b36038213156129d5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615adb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615b1b57615b1b615ae5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615b4957615b49615ae5565b604052919050565b5f6001600160401b03821115615b6957615b69615ae5565b50601f01601f191660200190565b5f60608236031215615b87575f80fd5b615b8f615af9565b823581526020615ba08185016156db565b8183015260408401356001600160401b03811115615bbc575f80fd5b840136601f820112615bcc575f80fd5b8035615bdf615bda82615b51565b615b21565b8181523684838501011115615bf2575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615adb818460208701615939565b80820180821115610c9457610c946158b0565b5f63ffffffff808316818103615c4a57615c4a6158b0565b6001019392505050565b8082028115828204841417610c9457610c946158b0565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b038181168382160190808211156134f5576134f56158b0565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615d3c57607f821691505b6020821081036156c457634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615d6c81615d28565b806020870152604060018084165f8114615d8d5760018114615da957615dd6565b60ff19851660408a0152604084151560051b8a01019550615dd6565b895f5260205f205f5b85811015615dcd5781548b8201860152908301908801615db2565b8a016040019650505b509398975050505050505050565b805161251c81615641565b5f8060408385031215615e00575f80fd5b82516001600160401b0380821115615e16575f80fd5b9084019060608287031215615e29575f80fd5b615e31615af9565b82518152602080840151615e4481615a3f565b82820152604084015183811115615e59575f80fd5b80850194505087601f850112615e6d575f80fd5b83519250615e7d615bda84615b51565b8381528882858701011115615e90575f80fd5b615e9f84838301848801615939565b80604084015250819550615eb4818801615de4565b9450505050509250929050565b81810381811115610c9457610c946158b0565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615fbc575f80fd5b8301803591506001600160401b03821115615fd5575f80fd5b6020019150368190038213156129d5575f80fd5b6001600160401b0381811683821602808216919082811461600c5761600c6158b0565b505092915050565b5f6001600160401b03808316818103615c4a57615c4a6158b0565b5f6020828403121561603f575f80fd5b610cc7826156ca565b5f60208284031215616058575f80fd5b813560ff81168114610cc7575f80fd5b601f8211156124eb57805f5260205f20601f840160051c8101602085101561608d5750805b601f840160051c820191505b81811015610d67575f8155600101616099565b81516001600160401b038111156160c5576160c5615ae5565b6160d9816160d38454615d28565b84616068565b602080601f83116001811461610c575f84156160f55750858301515b5f19600386901b1c1916600185901b17855561311e565b5f85815260208120601f198616915b8281101561613a5788860151825594840194600190910190840161611b565b508582101561615757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516161bc81604e860160208901615939565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516162fe3803806162fe83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6161b18061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004615568565b61058b565b005b3480156101ea575f80fd5b506101dd6101f93660046155a3565b6109ac565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd6102433660046155ba565b610b65565b348015610253575f80fd5b506102676102623660046155a3565b610c42565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046155f8565b610c58565b604051908152602001610220565b348015610305575f80fd5b506101dd61031436600461564c565b610c8c565b348015610324575f80fd5b506101dd610333366004615665565b610d2c565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b36600461568d565b61117e565b34801561038b575f80fd5b506102ec61039a3660046156db565b611761565b3480156103aa575f80fd5b506102676103b93660046155a3565b61177a565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb366004615568565b61178e565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e3660046155a3565b6119aa565b34801561042e575f80fd5b506101dd61043d366004615665565b611ab0565b34801561044d575f80fd5b506101dd61045c3660046155a3565b611c84565b34801561046c575f80fd5b506101dd61047b36600461564c565b611f8e565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b43660046155a3565b612104565b3480156104c4575f80fd5b506101dd6104d33660046155a3565b612368565b6102ec6104e63660046155a3565b612443565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e6105193660046155a3565b612474565b6040516102209190615708565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b3660046155a3565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206161458339815191526020526040808220815160e0810190925280545f805160206160e583398151915293929190829060ff1660038111156105d8576105d86156f4565b60038111156105e9576105e96156f4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61065f82612474565b9050600283516003811115610676576106766156f4565b146106c85760405162461bcd60e51b815260206004820152602a60248201525f805160206161058339815191526044820152696e6f742061637469766560b01b60648201526084015b60405180910390fd5b60208301516001600160a01b0316331461072d5760405162461bcd60e51b815260206004820152603360248201525f805160206161058339815191526044820152723737ba1037bbb732b210313c9039b2b73232b960691b60648201526084016106bf565b600383819052505f8060028351600581111561074b5761074b6156f4565b0361079c57871561076357610760848861253c565b91505b5f8560600151846080015161077891906157cb565b905061078485826127d8565b506001600160401b031660c0870152504290506107ce565b50505f82815260098501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b8560040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b56108018760600151611761565b8560a00151886080015185875f806040518863ffffffff1660e01b815260040161083197969594939291906157eb565b602060405180830381865afa15801561084c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108709190615829565b5f8a8152600788016020908152604080832093909355600689019052208551815487929190829060ff191660018360038111156108af576108af6156f4565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906109999085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206161858339815191526020526040808220815160e0810190925280545f8051602061612583398151915293929190829060ff1660058111156109f9576109f96156f4565b6005811115610a0a57610a0a6156f4565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a7957610a796156f4565b14610ade5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2056616c696461746f72206e6f742060448201526e1c195b991a5b99c81c995b5bdd985b608a1b60648201526084016106bf565b6005600160991b016001600160a01b031663ee5b48eb610b038584606001515f61292f565b6040518263ffffffff1660e01b8152600401610b1f9190615862565b6020604051808303815f875af1158015610b3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b5f9190615829565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610bae575080546001600160401b03808416911610155b15610bcc5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610bf68361297e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610c5264e8d4a5100083615894565b92915050565b5f610c6161298f565b610c6d848484346129c6565b9050610c8560015f8051602061616583398151915255565b9392505050565b5f805160206160e58339815191525f80610ca584612cba565b91509150610cb282612fd8565b610cbc5750505050565b5f8281526005840160205260409020546001600160a01b0316600482516005811115610cea57610cea6156f4565b03610d0f575f83815260088501602052604081208054919055610d0d8282613013565b505b610d2581610d208460400151611761565b613079565b5050505050565b5f8181525f805160206161458339815191526020526040808220815160e0810190925280545f805160206160e583398151915293929190829060ff166003811115610d7957610d796156f4565b6003811115610d8a57610d8a6156f4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610e0190612474565b9050600182516003811115610e1857610e186156f4565b14610e815760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a2064656c65676174696f6e4960448201527211081b9bdd081c195b991a5b99c81859191959606a1b60648201526084016106bf565b600381516005811115610e9657610e966156f4565b03610fdf57600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526006850160205260409020835181548593839160ff1916906001908490811115610ef057610ef06156f4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610ff457610ff46156f4565b0361100257610d258461308c565b5f61100c86613269565b90505f8061101d836040015161342f565b5091509150818560400151146110455760405162461bcd60e51b81526004016106bf906158b3565b806001600160401b031684606001516001600160401b031610156110b65760405162461bcd60e51b815260206004820152602260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206e6f6e604482015261636560f01b60648201526084016106bf565b806001600160401b03168560a001516001600160401b031611156110ec5760405162461bcd60e51b81526004016106bf906158fd565b5f878152600687016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206161258339815191529060ff161561121b5760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20616c726561647920696e697469616044820152721b1a5e9959081d985b1a59185d1bdc881cd95d606a1b60648201526084016106bf565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561125e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112829190615829565b8360200135146112e45760405162461bcd60e51b815260206004820152602760248201527f56616c696461746f724d616e616765723a20696e76616c696420626c6f636b636044820152661a185a5b88125160ca1b60648201526084016106bf565b306112f5606085016040860161595a565b6001600160a01b0316146113675760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015272746f72206d616e61676572206164647265737360681b60648201526084016106bf565b5f6113756060850185615975565b905090505f805b828163ffffffff161015611665575f6113986060880188615975565b8363ffffffff168181106113ae576113ae6159ba565b90506020028101906113c091906159ce565b6113c990615a7e565b80515f81815260088801602052604090205491925090156114415760405162461bcd60e51b815260206004820152602c60248201527f56616c696461746f724d616e616765723a206e6f646520494420616c7265616460448201526b1e481c9959da5cdd195c995960a21b60648201526084016106bf565b5f6002895f01358560405160200161147092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261148a91615b15565b602060405180830381855afa1580156114a5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114c89190615829565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115611554576115546156f4565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611607911686615b26565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061165e90615b39565b905061137c565b50600483018190555f61167785613269565b90505f611687826040015161366a565b90505f611693886137dc565b9050816002826040516116a69190615b15565b602060405180830381855afa1580156116c1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906116e49190615829565b146117485760405162461bcd60e51b815260206004820152602e60248201527f56616c696461746f724d616e616765723a20696e76616c6964207375626e657460448201526d0818dbdb9d995c9cda5bdb88125160921b60648201526084016106bf565b5050506009909201805460ff1916600117905550505050565b5f610c526001600160401b03831664e8d4a51000615b5b565b5f61178482612474565b6080015192915050565b5f805160206160e58339815191525f6117a685613c75565b90506117b185612fd8565b6117bc575050505050565b5f8581526005830160205260409020546001600160a01b031633146117f35760405162461bcd60e51b81526004016106bf90615b72565b5f85815260058301602052604090205460a082015161182291600160b01b90046001600160401b031690615bc4565b6001600160401b03168160c001516001600160401b031610156118a35760405162461bcd60e51b815260206004820152603360248201527f506f5356616c696461746f724d616e616765723a206d696e696d756d207374616044820152721ad948191d5c985d1a5bdb881b9bdd081b595d606a1b60648201526084016106bf565b8315610d25575f6118b4868561253c565b5f87815260098501602052604090819020805467ffffffffffffffff19166001600160401b038416179055600485015490840151919250600160401b90046001600160a01b03169063778c06b59061190b90611761565b60a085015160c08601516040516001600160e01b031960e086901b16815261193f939291829188905f9081906004016157eb565b602060405180830381865afa15801561195a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061197e9190615829565b5f8781526008850160205260408120805490919061199d908490615b26565b9091555050505050505050565b5f805160206160e58339815191525f6119c283612474565b90506004815160058111156119d9576119d96156f4565b14611a435760405162461bcd60e51b815260206004820152603460248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e206044820152731c195c9a5bd9081b9bdd0818dbdb5c1b195d195960621b60648201526084016106bf565b5f8381526005830160205260409020546001600160a01b03163314611a7a5760405162461bcd60e51b81526004016106bf90615b72565b5f83815260088301602090815260408083208054908490556005860190925290912054610b5f906001600160a01b031682613013565b611ab861298f565b5f8181525f805160206161458339815191526020526040808220815160e0810190925280545f805160206160e583398151915293929190829060ff166003811115611b0557611b056156f4565b6003811115611b1657611b166156f4565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f611b8485613269565b90505f80611b95836040015161342f565b509150915081846040015114611bbd5760405162461bcd60e51b81526004016106bf906158b3565b806001600160401b03168460c001516001600160401b03161115611bf35760405162461bcd60e51b81526004016106bf906158fd565b600384516003811115611c0857611c086156f4565b14611c5c5760405162461bcd60e51b815260206004820152603160248201525f805160206161058339815191526044820152701b9bdd081c195b991a5b99c81859191959607a1b60648201526084016106bf565b611c658661308c565b5050505050611c8060015f8051602061616583398151915255565b5050565b611c8c61298f565b5f8181525f805160206161458339815191526020526040808220815160e0810190925280545f805160206160e583398151915293929190829060ff166003811115611cd957611cd96156f4565b6003811115611cea57611cea6156f4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d6082612474565b90505f83516003811115611d7657611d766156f4565b03611dd45760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a2064656c656761746f72206e6044820152671bdd08199bdd5b9960c21b60648201526084016106bf565b600481516005811115611de957611de96156f4565b14611e4c5760405162461bcd60e51b815260206004820152602d60248201527f506f5356616c696461746f724d616e616765723a2076616c69646174696f6e2060448201526c1b9bdd0818dbdb5c1b195d1959609a1b60648201526084016106bf565b600183516003811115611e6157611e616156f4565b03611e7857611e6f8561308c565b50505050611f75565b600283516003811115611e8d57611e8d6156f4565b03611f67578360040160089054906101000a90046001600160a01b03166001600160a01b031663778c06b5611ec58560600151611761565b60a0840151608087015160c08601515f88815260098b0160205260408082205490516001600160e01b031960e089901b168152611f1796959493926001600160401b03909216919081906004016157eb565b602060405180830381865afa158015611f32573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f569190615829565b5f8681526007860160205260409020555b611f708561308c565b505050505b611f8b60015f8051602061616583398151915255565b50565b5f805160206161258339815191525f611fa683613269565b90505f80611fb78360400151613ef0565b91509150806120195760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a20526567697374726174696f6e206e6044820152671bdd081d985b1a5960c21b60648201526084016106bf565b60015f83815260078601602052604090205460ff16600581111561203f5761203f6156f4565b1461205c5760405162461bcd60e51b81526004016106bf90615be4565b5f8281526006850160205260408120612074916154bd565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206161458339815191526020526040808220815160e0810190925280545f805160206160e583398151915293929190829060ff166003811115612151576121516156f4565b6003811115612162576121626156f4565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156121db576121db6156f4565b14806121f957506003815160038111156121f7576121f76156f4565b145b61224d5760405162461bcd60e51b815260206004820152603260248201525f80516020616105833981519152604482015271737461747573206e6f742070656e64696e6760701b60648201526084016106bf565b5f61225b8260400151612474565b905080606001516001600160401b03165f036122df5760405162461bcd60e51b815260206004820152603f60248201527f506f5356616c696461746f724d616e616765723a20636f756c64206e6f74206660448201527f696e642076616c696461746f7220666f722064656c65676174696f6e2049440060648201526084016106bf565b6005600160991b016001600160a01b031663ee5b48eb61230c84604001518460600151856080015161292f565b6040518263ffffffff1660e01b81526004016123289190615862565b6020604051808303815f875af1158015612344573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d259190615829565b5f8181525f8051602061618583398151915260205260409020545f805160206161258339815191529060019060ff1660058111156123a8576123a86156f4565b146123c55760405162461bcd60e51b81526004016106bf90615be4565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916123fe9190600401615c61565b6020604051808303815f875af115801561241a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061243e9190615829565b505050565b5f61244c61298f565b612457823334614091565b905061246f60015f8051602061616583398151915255565b919050565b61247c6154f4565b5f8281525f80516020616185833981519152602052604090819020815160e0810190925280545f80516020616125833981519152929190829060ff1660058111156124c9576124c96156f4565b60058111156124da576124da6156f4565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612587573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125ae9190810190615cf6565b91509150806126115760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642077617260448201526870206d65737361676560b81b60648201526084016106bf565b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612654573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126789190615829565b8251146126dc5760405162461bcd60e51b815260206004820152602c60248201527f506f5356616c696461746f724d616e616765723a20696e76616c696420736f7560448201526b1c98d94818da185a5b88125160a21b60648201526084016106bf565b60208201516001600160a01b0316156127525760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206f726960448201527167696e2073656e646572206164647265737360701b60648201526084016106bf565b5f80612761846040015161441c565b915091508187146127ce5760405162461bcd60e51b815260206004820152603160248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964207570746044820152701a5b59481d985b1a59185d1a5bdb881251607a1b60648201526084016106bf565b9695505050505050565b5f8281525f80516020616185833981519152602052604081206002015481905f8051602061612583398151915290600160801b90046001600160401b031661282085826145f4565b5f61282a87614802565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61287a8a858b61292f565b6040518263ffffffff1660e01b81526004016128969190615862565b6020604051808303815f875af11580156128b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128d69190615829565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612986614877565b611f8b816148c2565b5f805160206161658339815191528054600119016129c057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d03545f905f805160206160e58339815191529061ffff86161015612a4d5760405162461bcd60e51b815260206004820152602b60248201525f8051602061610583398151915260448201526a66656520746f6f206c6f7760a81b60648201526084016106bf565b61271061ffff86161115612aa55760405162461bcd60e51b815260206004820152602c60248201525f8051602061610583398151915260448201526b0cccaca40e8dede40d0d2ced60a31b60648201526084016106bf565b60028101546001600160401b039081169085161015612b1e5760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d696e60448201526e1039ba30b5b290323ab930ba34b7b760891b60648201526084016106bf565b8054831015612b815760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152687420746f6f206c6f7760b81b60648201526084016106bf565b8060010154831115612be85760405162461bcd60e51b815260206004820152602a60248201527f506f5356616c696461746f724d616e616765723a207374616b6520616d6f756e6044820152690e840e8dede40d0d2ced60b31b60648201526084016106bf565b825f612bf382610c42565b90505f612c008983614934565b90506040518060600160405280612c143390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526005909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061616583398151915255565b5f612cc36154f4565b5f805160206161258339815191525f612cdb85613269565b90505f80612cec8360400151613ef0565b915091508015612d515760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20736044820152691d1a5b1b081d985b1a5960b21b60648201526084016106bf565b5f828152600785016020526040808220815160e081019092528054829060ff166005811115612d8257612d826156f4565b6005811115612d9357612d936156f4565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612e0257612e026156f4565b1480612e205750600181516005811115612e1e57612e1e6156f4565b145b612e7f5760405162461bcd60e51b815260206004820152602a60248201527f56616c696461746f724d616e616765723a20696e76616c69642076616c696461604482015269746f722073746174757360b01b60648201526084016106bf565b600381516005811115612e9457612e946156f4565b03612ea25760048152612ea7565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115612eec57612eec6156f4565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612fa057612fa06156f4565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0560205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561305f575f80fd5b505af1158015613071573d5f803e3d5ffd5b505050505050565b611c806001600160a01b03831682614eea565b5f8181525f805160206161458339815191526020526040808220815160e0810190925280545f805160206160e583398151915293929190829060ff1660038111156130d9576130d96156f4565b60038111156130ea576130ea6156f4565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260068901845284812080546001600160a81b03191681559283018190559190940181905560078701825282812080549082905584825260058801909252918220549394509192612710906131bf90600160a01b900461ffff1684615b5b565b6131c99190615894565b905080856008015f8581526020019081526020015f205f8282546131ed9190615b26565b909155505f90506131fe8284615dc8565b905061320e856020015182613013565b6132238560200151610d208760600151611761565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156132cd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526132f49190810190615cf6565b91509150806133545760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a20696e76616c69642077617270206d60448201526565737361676560d01b60648201526084016106bf565b8151156133b55760405162461bcd60e51b815260206004820152602960248201527f56616c696461746f724d616e616765723a20696e76616c696420736f757263656044820152680818da185a5b88125160ba1b60648201526084016106bf565b60208201516001600160a01b0316156134285760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a20696e76616c6964206f726967696e60448201526e2073656e646572206164647265737360881b60648201526084016106bf565b5092915050565b5f805f83516036146134535760405162461bcd60e51b81526004016106bf90615ddb565b5f805b60028110156134a25761346a816001615dc8565b613475906008615b5b565b61ffff1686828151811061348b5761348b6159ba565b016020015160f81c901b9190911790600101613456565b5061ffff8116156134c55760405162461bcd60e51b81526004016106bf90615e24565b5f805b6004811015613520576134dc816003615dc8565b6134e7906008615b5b565b63ffffffff16876134f9836002615b26565b81518110613509576135096159ba565b016020015160f81c901b91909117906001016134c8565b5063ffffffff81166004146135475760405162461bcd60e51b81526004016106bf90615e67565b5f805b602081101561359c5761355e81601f615dc8565b613569906008615b5b565b88613575836006615b26565b81518110613585576135856159ba565b016020015160f81c901b919091179060010161354a565b505f805b60088110156135fb576135b4816007615dc8565b6135bf906008615b5b565b6001600160401b0316896135d4836026615b26565b815181106135e4576135e46159ba565b016020015160f81c901b91909117906001016135a0565b505f805b600881101561365a57613613816007615dc8565b61361e906008615b5b565b6001600160401b03168a61363383602e615b26565b81518110613643576136436159ba565b016020015160f81c901b91909117906001016135ff565b5091989097509095509350505050565b5f815160261461368c5760405162461bcd60e51b81526004016106bf90615ddb565b5f805b60028110156136db576136a3816001615dc8565b6136ae906008615b5b565b61ffff168482815181106136c4576136c46159ba565b016020015160f81c901b919091179060010161368f565b5061ffff8116156136fe5760405162461bcd60e51b81526004016106bf90615e24565b5f805b600481101561375957613715816003615dc8565b613720906008615b5b565b63ffffffff1685613732836002615b26565b81518110613742576137426159ba565b016020015160f81c901b9190911790600101613701565b5063ffffffff81161561377e5760405162461bcd60e51b81526004016106bf90615e67565b5f805b60208110156137d35761379581601f615dc8565b6137a0906008615b5b565b866137ac836006615b26565b815181106137bc576137bc6159ba565b016020015160f81c901b9190911790600101613781565b50949350505050565b60605f6137eb83830184615975565b6137f791506058615b5b565b61380290605c615b26565b6001600160401b03811115613819576138196159ec565b6040519080825280601f01601f191660200182016040528015613843576020820181803683370190505b5090505f5b60208110156138985783358160208110613864576138646159ba565b1a60f81b82828151811061387a5761387a6159ba565b60200101906001600160f81b03191690815f1a905350600101613848565b505f5b60208110156138f857836020013581602081106138ba576138ba6159ba565b1a60f81b826138ca836020615b26565b815181106138da576138da6159ba565b60200101906001600160f81b03191690815f1a90535060010161389b565b505f5b600481101561395b5761390f816003615dc8565b61391a906008615b5b565b6014901c60f81b8261392d836040615b26565b8151811061393d5761393d6159ba565b60200101906001600160f81b03191690815f1a9053506001016138fb565b505f61396d606085016040860161595a565b60601b90505f5b60148110156139cd5781816014811061398f5761398f6159ba565b1a60f81b8361399f836044615b26565b815181106139af576139af6159ba565b60200101906001600160f81b03191690815f1a905350600101613974565b505f6139dc6060860186615975565b905090505f5b6004811015613a47576139f6816003615dc8565b613a01906008615b5b565b63ffffffff8316901c60f81b84613a19836058615b26565b81518110613a2957613a296159ba565b60200101906001600160f81b03191690815f1a9053506001016139e2565b505f5b613a576060870187615975565b9050811015613c6b575f613a6c826058615b5b565b613a7790605c615b26565b90505f5b6020811015613b0257613a916060890189615975565b84818110613aa157613aa16159ba565b9050602002810190613ab391906159ce565b358160208110613ac557613ac56159ba565b1a60f81b86613ad48385615b26565b81518110613ae457613ae46159ba565b60200101906001600160f81b03191690815f1a905350600101613a7b565b505f5b6008811015613bb757613b19816007615dc8565b613b24906008615b5b565b613b3160608a018a615975565b85818110613b4157613b416159ba565b9050602002810190613b5391906159ce565b613b649060408101906020016156db565b6001600160401b0316901c60f81b8682613b7f856020615b26565b613b899190615b26565b81518110613b9957613b996159ba565b60200101906001600160f81b03191690815f1a905350600101613b05565b505f5b6030811015613c6157613bd06060890189615975565b84818110613be057613be06159ba565b9050602002810190613bf291906159ce565b613c00906040810190615eae565b82818110613c1057613c106159ba565b9050013560f81c60f81b8682846028613c299190615b26565b613c339190615b26565b81518110613c4357613c436159ba565b60200101906001600160f81b03191690815f1a905350600101613bba565b5050600101613a4a565b5091949350505050565b613c7d6154f4565b5f8281525f805160206161858339815191526020526040808220815160e0810190925280545f8051602061612583398151915293929190829060ff166005811115613cca57613cca6156f4565b6005811115613cdb57613cdb6156f4565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613d4d57613d4d6156f4565b14613da95760405162461bcd60e51b815260206004820152602660248201527f56616c696461746f724d616e616765723a2076616c696461746f72206e6f742060448201526561637469766560d01b60648201526084016106bf565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ded57613ded6156f4565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e9985826127d8565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714613f135760405162461bcd60e51b81526004016106bf90615ddb565b5f805b6002811015613f6257613f2a816001615dc8565b613f35906008615b5b565b61ffff16858281518110613f4b57613f4b6159ba565b016020015160f81c901b9190911790600101613f16565b5061ffff811615613f855760405162461bcd60e51b81526004016106bf90615e24565b5f805b6004811015613fe057613f9c816003615dc8565b613fa7906008615b5b565b63ffffffff1686613fb9836002615b26565b81518110613fc957613fc96159ba565b016020015160f81c901b9190911790600101613f88565b5063ffffffff81166003146140075760405162461bcd60e51b81526004016106bf90615e67565b5f805b602081101561405c5761401e81601f615dc8565b614029906008615b5b565b87614035836006615b26565b81518110614045576140456159ba565b016020015160f81c901b919091179060010161400a565b505f86602681518110614071576140716159ba565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206160e5833981519152816140aa84610c42565b90505f6140b687612474565b90506140c187612fd8565b61411e5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a206e6f74206120506f53207660448201526730b634b230ba37b960c11b60648201526084016106bf565b600281516005811115614133576141336156f4565b146141925760405162461bcd60e51b815260206004820152602960248201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e6044820152686f742061637469766560b81b60648201526084016106bf565b5f8282608001516141a39190615bc4565b600485015460408401519192506141c5916001600160401b0390911690615ef0565b6001600160401b0316816001600160401b031611156142445760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a206d6178696d756d2076616c6044820152741a59185d1bdc881dd95a59da1d081c995858da1959605a1b60648201526084016106bf565b5f806142508a846127d8565b915091505f8a8360405160200161427e92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260068b01909152902081518154829060ff19166001836003811115614311576143116156f4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461443f5760405162461bcd60e51b81526004016106bf90615ddb565b5f805b600281101561448e57614456816001615dc8565b614461906008615b5b565b61ffff16858281518110614477576144776159ba565b016020015160f81c901b9190911790600101614442565b5061ffff8116156144b15760405162461bcd60e51b81526004016106bf90615e24565b5f805b600481101561450c576144c8816003615dc8565b6144d3906008615b5b565b63ffffffff16866144e5836002615b26565b815181106144f5576144f56159ba565b016020015160f81c901b91909117906001016144b4565b5063ffffffff81166005146145335760405162461bcd60e51b81526004016106bf90615e67565b5f805b60208110156145885761454a81601f615dc8565b614555906008615b5b565b87614561836006615b26565b81518110614571576145716159ba565b016020015160f81c901b9190911790600101614536565b505f805b60088110156145e7576145a0816007615dc8565b6145ab906008615b5b565b6001600160401b0316886145c0836026615b26565b815181106145d0576145d06159ba565b016020015160f81c901b919091179060010161458c565b5090969095509350505050565b5f805160206161258339815191525f6001600160401b0380841690851611156146285761462183856157cb565b9050614635565b61463284846157cb565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614697575060018401548151614693916001600160401b031690615b26565b8210155b156146bd576001600160401b0383166060820152818152604081015160208201526146dc565b82816060018181516146cf9190615bc4565b6001600160401b03169052505b60608101516146ec906064615ef0565b602082015160018601546001600160401b0392909216916147179190600160401b900460ff16615b5b565b101561477b5760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e2060448201526c1c985d1948195e18d959591959609a1b60648201526084016106bf565b856001600160401b0316816040018181516147969190615b26565b9052506040810180516001600160401b03871691906147b6908390615dc8565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206161858339815191526020526040812060020180545f80516020616125833981519152919060089061484c90600160401b90046001600160401b0316615f1b565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166148c057604051631afcd79f60e31b815260040160405180910390fd5b565b6148ca614877565b6148d381614f7d565b6148db614f96565b611f8b606082013560808301356148f860c0850160a086016156db565b61490860e0860160c08701615f36565b61ffff1661491d610100870160e08801615f4f565b61492f6101208801610100890161595a565b614fa6565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166149bf5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a2076616c696461746f72207365742060448201526e1b9bdd081a5b9a5d1a585b1a5e9959608a1b60648201526084016106bf565b5f80516020616125833981519152426149de60408601602087016156db565b6001600160401b031611614a505760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e20656044820152727870697279206e6f7420696e2066757475726560681b60648201526084016106bf565b614a6060408501602086016156db565b6001600160401b0316614a766202a30042615b26565b11614ae95760405162461bcd60e51b815260206004820152603760248201527f56616c696461746f724d616e616765723a20726567697374726174696f6e206560448201527f787069727920746f6f2066617220696e2066757475726500000000000000000060648201526084016106bf565b8335614b415760405162461bcd60e51b815260206004820152602160248201527f56616c696461746f724d616e616765723a20696e76616c6964206e6f646520496044820152601160fa1b60648201526084016106bf565b83355f90815260088201602052604090205415614bb15760405162461bcd60e51b815260206004820152602860248201527f56616c696461746f724d616e616765723a206e6f646520494420616c72656164604482015267792061637469766560c01b60648201526084016106bf565b6030614bc06040860186615eae565b905014614c255760405162461bcd60e51b815260206004820152602d60248201527f56616c696461746f724d616e616765723a20696e76616c696420626c7350756260448201526c0d8d2c696caf240d8cadccee8d609b1b60648201526084016106bf565b614c2f835f6145f4565b5f80614cc86040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614c7391906156db565b6001600160401b03168152602001614c8e60408a018a615eae565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061522e565b5f82815260068601602052604090209193509150614ce68282615fb3565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614d24908590600401615862565b6020604051808303815f875af1158015614d40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614d649190615829565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115614ddc57614ddc6156f4565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614ebc918e01908e016156db565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015614f0d5760405163cd78605960e01b81523060048201526024016106bf565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614f56576040519150601f19603f3d011682016040523d82523d5f602084013e614f5b565b606091505b505090508061243e57604051630a12f52160e11b815260040160405180910390fd5b614f85614877565b614f8d615332565b611f8b8161533a565b614f9e614877565b6148c06154b5565b614fae614877565b5f805160206160e58339815191528361501a5760405162461bcd60e51b815260206004820152602860248201527f506f5356616c696461746f724d616e616765723a207a65726f2064656c65676160448201526774696f6e2066656560c01b60648201526084016106bf565b6127108411156150805760405162461bcd60e51b815260206004820152602b60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642064656c60448201526a65676174696f6e2066656560a81b60648201526084016106bf565b858711156150e85760405162461bcd60e51b815260206004820152602f60248201527f506f5356616c696461746f724d616e616765723a20696e76616c69642073746160448201526e6b6520616d6f756e742072616e676560881b60648201526084016106bf565b5f8360ff16116151555760405162461bcd60e51b815260206004820152603260248201527f506f5356616c696461746f724d616e616765723a207a65726f206d6178696d75604482015271369039ba30b5b29036bab63a34b83634b2b960711b60648201526084016106bf565b600a60ff841611156151c75760405162461bcd60e51b815260206004820152603560248201527f506f5356616c696461746f724d616e616765723a20696e76616c6964206d617860448201527434b6bab69039ba30b5b29036bab63a34b83634b2b960591b60648201526084016106bf565b95865560018601949094556002850180546001600160401b0390941667ffffffffffffffff19909416939093179092556003840155600490920180546001600160a01b03909216600160401b026001600160e01b031990921660ff90931692909217179055565b5f60608260800151516030146152985760405162461bcd60e51b815260206004820152602960248201527f5374616b696e674d657373616765733a20696e76616c6964207369676e6174756044820152680e4ca40d8cadccee8d60bb1b60648201526084016106bf565b5f806001855f015186602001518760400151886080015189606001516040516020016152ca979695949392919061606e565b60405160208183030381529060405290506002816040516152eb9190615b15565b602060405180830381855afa158015615306573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906153299190615829565b94909350915050565b6148c0614877565b615342614877565b80355f8051602061612583398151915290815560146153676060840160408501615f4f565b60ff1611156153d45760405162461bcd60e51b815260206004820152603360248201527f56616c696461746f724d616e616765723a206d6178696d756d20636875726e206044820152720e0cae4c6cadce8c2ceca40e8dede40d0d2ced606b1b60648201526084016106bf565b5f6153e56060840160408501615f4f565b60ff161161544d5760405162461bcd60e51b815260206004820152602f60248201527f56616c696461746f724d616e616765723a207a65726f206d6178696d756d206360448201526e6875726e2070657263656e7461676560881b60648201526084016106bf565b61545d6060830160408401615f4f565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561548e60408301602084016156db565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ca7614877565b5080546154c990615c2f565b5f825580601f106154d8575050565b601f0160209004905f5260205f2090810190611f8b9190615530565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115615544575f8155600101615531565b5090565b8015158114611f8b575f80fd5b803563ffffffff8116811461246f575f80fd5b5f805f6060848603121561557a575f80fd5b83359250602084013561558c81615548565b915061559a60408501615555565b90509250925092565b5f602082840312156155b3575f80fd5b5035919050565b5f61012082840312156155cb575f80fd5b50919050565b803561ffff8116811461246f575f80fd5b80356001600160401b038116811461246f575f80fd5b5f805f6060848603121561560a575f80fd5b83356001600160401b0381111561561f575f80fd5b840160608187031215615630575f80fd5b925061563e602085016155d1565b915061559a604085016155e2565b5f6020828403121561565c575f80fd5b610c8582615555565b5f8060408385031215615676575f80fd5b61567f83615555565b946020939093013593505050565b5f806040838503121561569e575f80fd5b82356001600160401b038111156156b3575f80fd5b8301608081860312156156c4575f80fd5b91506156d260208401615555565b90509250929050565b5f602082840312156156eb575f80fd5b610c85826155e2565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061572b57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161576660608401826001600160401b03169052565b50608083015161578160808401826001600160401b03169052565b5060a083015161579c60a08401826001600160401b03169052565b5060c083015161342860c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115613428576134286157b7565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215615839575f80fd5b5051919050565b5f5b8381101561585a578181015183820152602001615842565b50505f910152565b602081525f8251806020840152615880816040850160208701615840565b601f01601f19169190910160400192915050565b5f826158ae57634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602a908201527f506f5356616c696461746f724d616e616765723a20696e76616c69642076616c6040820152691a59185d1a5bdb88125160b21b606082015260800190565b60208082526029908201527f506f5356616c696461746f724d616e616765723a206e6f6e636520646f6573206040820152680dcdee840dac2e8c6d60bb1b606082015260800190565b6001600160a01b0381168114611f8b575f80fd5b5f6020828403121561596a575f80fd5b8135610c8581615946565b5f808335601e1984360301811261598a575f80fd5b8301803591506001600160401b038211156159a3575f80fd5b6020019150600581901b3603821315612928575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126159e2575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715615a2257615a226159ec565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615a5057615a506159ec565b604052919050565b5f6001600160401b03821115615a7057615a706159ec565b50601f01601f191660200190565b5f60608236031215615a8e575f80fd5b615a96615a00565b823581526020615aa78185016155e2565b8183015260408401356001600160401b03811115615ac3575f80fd5b840136601f820112615ad3575f80fd5b8035615ae6615ae182615a58565b615a28565b8181523684838501011115615af9575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516159e2818460208701615840565b80820180821115610c5257610c526157b7565b5f63ffffffff808316818103615b5157615b516157b7565b6001019392505050565b8082028115828204841417610c5257610c526157b7565b60208082526032908201527f506f5356616c696461746f724d616e616765723a2076616c696461746f72206e60408201527137ba1037bbb732b210313c9039b2b73232b960711b606082015260800190565b6001600160401b03818116838216019080821115613428576134286157b7565b6020808252602b908201527f56616c696461746f724d616e616765723a2076616c69646174696f6e2049442060408201526a6e6f742070656e64696e6760a81b606082015260800190565b600181811c90821680615c4357607f821691505b6020821081036155cb57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454615c7381615c2f565b806020870152604060018084165f8114615c945760018114615cb057615cdd565b60ff19851660408a0152604084151560051b8a01019550615cdd565b895f5260205f205f5b85811015615cd45781548b8201860152908301908801615cb9565b8a016040019650505b509398975050505050505050565b805161246f81615548565b5f8060408385031215615d07575f80fd5b82516001600160401b0380821115615d1d575f80fd5b9084019060608287031215615d30575f80fd5b615d38615a00565b82518152602080840151615d4b81615946565b82820152604084015183811115615d60575f80fd5b80850194505087601f850112615d74575f80fd5b83519250615d84615ae184615a58565b8381528882858701011115615d97575f80fd5b615da684838301848801615840565b80604084015250819550615dbb818801615ceb565b9450505050509250929050565b81810381811115610c5257610c526157b7565b60208082526029908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152680ceca40d8cadccee8d60bb1b606082015260800190565b60208082526023908201527f56616c696461746f724d657373616765733a20696e76616c696420636f64656360408201526208125160ea1b606082015260800190565b60208082526027908201527f56616c696461746f724d657373616765733a20696e76616c6964206d657373616040820152666765207479706560c81b606082015260800190565b5f808335601e19843603018112615ec3575f80fd5b8301803591506001600160401b03821115615edc575f80fd5b602001915036819003821315612928575f80fd5b6001600160401b03818116838216028082169190828114615f1357615f136157b7565b505092915050565b5f6001600160401b03808316818103615b5157615b516157b7565b5f60208284031215615f46575f80fd5b610c85826155d1565b5f60208284031215615f5f575f80fd5b813560ff81168114610c85575f80fd5b601f82111561243e57805f5260205f20601f840160051c81016020851015615f945750805b601f840160051c820191505b81811015610d25575f8155600101615fa0565b81516001600160401b03811115615fcc57615fcc6159ec565b615fe081615fda8454615c2f565b84615f6f565b602080601f831160018114616013575f8415615ffc5750858301515b5f19600386901b1c1916600185901b178555613071565b5f85815260208120601f198616915b8281101561604157888601518255948401946001909101908401616022565b508582101561605e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516160c381604e860160208901615840565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00506f5356616c696461746f724d616e616765723a2064656c65676174696f6e20e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d069b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 cf5fdf4f6..b855ea989 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -331,7 +331,6 @@ abstract contract PoSValidatorManager is validationID: validationID, weight: weight, startedAt: 0, - endedAt: 0, startingNonce: nonce, endingNonce: 0 }); @@ -368,7 +367,6 @@ abstract contract PoSValidatorManager is if (validator.status == ValidatorStatus.PendingRemoved) { delegator.status = DelegatorStatus.PendingRemoved; delegator.startedAt = validator.endedAt; - delegator.endedAt = validator.endedAt; delegator.endingNonce = validator.messageNonce; // Write back the delegator @@ -488,6 +486,7 @@ abstract contract PoSValidatorManager is delegator.status = DelegatorStatus.PendingRemoved; uint64 validatorUptimeSeconds; + uint64 delegationEndTime; if (validator.status == ValidatorStatus.Active) { if (includeUptimeProof) { // Uptime proofs include the absolute number of seconds the validator has been active. @@ -496,7 +495,7 @@ abstract contract PoSValidatorManager is uint64 newValidatorWeight = validator.weight - delegator.weight; (delegator.endingNonce,) = _setValidatorWeight(validationID, newValidatorWeight); - delegator.endedAt = uint64(block.timestamp); + delegationEndTime = uint64(block.timestamp); } else { // If the validation period has already ended, we have saved the uptime. // Further, it is impossible to retrieve an uptime proof for an already ended validation, @@ -504,14 +503,14 @@ abstract contract PoSValidatorManager is validatorUptimeSeconds = $._completedValidationUptimeSeconds[validationID]; delegator.endingNonce = validator.messageNonce; - delegator.endedAt = validator.endedAt; + delegationEndTime = validator.endedAt; } $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward({ stakeAmount: weightToValue(delegator.weight), validatorStartTime: validator.startedAt, stakingStartTime: delegator.startedAt, - stakingEndTime: delegator.endedAt, + stakingEndTime: delegationEndTime, uptimeSeconds: validatorUptimeSeconds, initialSupply: 0, endSupply: 0 @@ -522,7 +521,7 @@ abstract contract PoSValidatorManager is emit DelegatorRemovalInitialized({ delegationID: delegationID, validationID: validationID, - endTime: delegator.endedAt + endTime: delegationEndTime }); } diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index 5da2b2278..ca9ba291b 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -32,7 +32,6 @@ struct Delegator { bytes32 validationID; uint64 weight; uint64 startedAt; - uint64 endedAt; uint64 startingNonce; uint64 endingNonce; } From f73d2d04f985cb3a75acb4a90898f56633d863a4 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 20 Sep 2024 16:05:40 -0500 Subject: [PATCH 398/545] format + lint --- contracts/validator-manager/ValidatorMessages.sol | 6 +++--- .../validator-manager/tests/PoSValidatorManagerTests.t.sol | 1 - 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 95fa00287..a59981932 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -353,7 +353,7 @@ library ValidatorMessages { pure returns (bytes32, bool) { - if(input.length != 39) { + if (input.length != 39) { revert InvalidMessageLength(); } // Unpack the codec ID @@ -430,7 +430,7 @@ library ValidatorMessages { pure returns (bytes32, uint64, uint64) { - if(input.length != 54) { + if (input.length != 54) { revert InvalidMessageLength(); } @@ -530,7 +530,7 @@ library ValidatorMessages { for (uint256 i; i < 4; ++i) { typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } - + if (typeID != SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID) { revert InvalidMessageType(); } diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index e75f8e66d..ffa98ce5d 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -15,7 +15,6 @@ import { } from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/IWarpMessenger.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; import {ValidatorRegistrationInput, ValidatorStatus} from "../interfaces/IValidatorManager.sol"; -import {DelegatorStatus} from "../interfaces/IPoSValidatorManager.sol"; abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 public constant DEFAULT_UPTIME = uint64(100); From 8c27c5a669a1c0d8f15440a443bf8e82581a2c73 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 20 Sep 2024 16:30:53 -0500 Subject: [PATCH 399/545] update vdr manager readme --- contracts/validator-manager/README.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/contracts/validator-manager/README.md b/contracts/validator-manager/README.md index 688f53da3..25650009f 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -8,7 +8,7 @@ _Disclaimer:_ The contracts in this directory are still under active development The common case for adding or removing a validator from a Subnet's validator set follows these general steps: -1. Inform the Validator Manager contract of the change. The Validator Manager contract will construct a Warp message attesting to the change in the validator set. +1. Initiate the change through the Validator Manager contract. The Validator Manager contract will construct a Warp message attesting to the change in the validator set. 2. Deliver the Warp message containing the validator set change to the P-Chain. The P-Chain will construct a Warp message acknowledging the change to the validator set. 3. Deliver the Warp message containing the P-Chain acknowledgement back to the Validator Manager contract on the Subnet. The Validator Manager contract finalizes the validator set change. @@ -30,7 +30,7 @@ In the case of a missed expiry, the `RegisterSubnetValidatorTx` will result in a ### Exiting the Validator Set -Validator exit is initiated with a call to `initializeEndValidation` on the Validator Manager contract. For PoS Validator Managers, a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message may optionally be provided in order to calculate the staking rewards; otherwise the validator's uptime will be set to `0`. This proof may be requested from the P-Chain, which will provide it in a `ValidationUptimeMessage` Warp message. Once `initializeEndValidation` is called, staking rewards cease accruing for PoS Validator Managers: the Validator Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. +Validator exit is initiated with a call to `initializeEndValidation` on the Validator Manager contract. For PoS Validator Managers, a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message may optionally be provided in order to calculate the staking rewards; otherwise the validator's uptime will be set to `0`. This proof may be requested directly from the Subnet, which will provide it in a `ValidationUptimeMessage` Warp message. Once `initializeEndValidation` is called, staking rewards cease accruing for PoS Validator Managers: the Validator Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The P-Chain acknowledges validator exit by signing a `SubnetValidatorRegistrationMessage` with `valid=0`, which is delivered to the Validator Manager by calling `completeEndValidation`. The validation is removed from the contract's state, and for PoS Validator Managers, staking rewards are disbursed and stake is returned. @@ -47,6 +47,7 @@ Disabled Subnet validators can re-activate at any time by increasing their balan Description: Issued by the Validator Manager contract in order to register a Subnet validator Signed by: Subnet +Consumed by: P-Chain Specification: @@ -76,6 +77,7 @@ Specification: Description: Issued by the P-Chain in order to confirm Subnet validator registration Signed by: P-Chain +Consumed by: Validator Manager contract Specification: @@ -95,9 +97,10 @@ Specification: ### `ValidationUptimeMessage` -Description: Issued by the P-Chain in order to provide validator uptime to the Subnet to calculate staking rewards +Description: Issued by the Subnet in order to provide validator uptime to the Subnet to calculate staking rewards -Signed by: P-Chain +Signed by: Subnet +Consumed by: Validator Manager contract Specification: @@ -119,7 +122,8 @@ Specification: Description: Used to set a validator's stake weight on another chain -Signed by: Subnet, P-Chain +Signed by: Subnet +Consumed by: P-Chain Specification: From f3a6194635eb14f9e628b1a3cebf37a93d222099 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 20 Sep 2024 16:35:53 -0500 Subject: [PATCH 400/545] clarification --- 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 25650009f..22ada1f53 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -30,7 +30,7 @@ In the case of a missed expiry, the `RegisterSubnetValidatorTx` will result in a ### Exiting the Validator Set -Validator exit is initiated with a call to `initializeEndValidation` on the Validator Manager contract. For PoS Validator Managers, a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message may optionally be provided in order to calculate the staking rewards; otherwise the validator's uptime will be set to `0`. This proof may be requested directly from the Subnet, which will provide it in a `ValidationUptimeMessage` Warp message. Once `initializeEndValidation` is called, staking rewards cease accruing for PoS Validator Managers: the Validator Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. +Validator exit is initiated with a call to `initializeEndValidation` on the Validator Manager contract. For PoS Validator Managers, a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message may optionally be provided in order to calculate the staking rewards; otherwise the validator's uptime will be set to `0`. This proof may be requested directly from the Subnet validators, which will provide it in a `ValidationUptimeMessage` Warp message. Once `initializeEndValidation` is called, staking rewards cease accruing for PoS Validator Managers: the Validator Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The P-Chain acknowledges validator exit by signing a `SubnetValidatorRegistrationMessage` with `valid=0`, which is delivered to the Validator Manager by calling `completeEndValidation`. The validation is removed from the contract's state, and for PoS Validator Managers, staking rewards are disbursed and stake is returned. From a23bedb95ad54afeaa2f926b0225a9a0431b1c93 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 24 Sep 2024 12:23:12 -0500 Subject: [PATCH 401/545] delegation readme + state diagram --- contracts/validator-manager/Delegation.md | 37 +++++++++++++++++++++++ contracts/validator-manager/README.md | 25 +++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 contracts/validator-manager/Delegation.md diff --git a/contracts/validator-manager/Delegation.md b/contracts/validator-manager/Delegation.md new file mode 100644 index 000000000..73d08c6c3 --- /dev/null +++ b/contracts/validator-manager/Delegation.md @@ -0,0 +1,37 @@ +## Delegation + +`PoSValidatorManager` supports Delegation to an active Validator as a way for users to earn staking rewards without having to validate the chain. Delegators pay a configurable percentage fee on any earned staking rewards to the host Validator. Delegations are reflected on the P-Chain by adjusting the Validator's registered weight via a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The weight change acknowledgement is delivered to the `PoSValidatorManager` via a [`SubnetValidatorWeightUpdateMessage`](./README.md#subnetvalidatorweightupdatemessage). + +> [!NOTE] +> The P-Chain is only willing to sign a `SubnetValidatorWeightUpdateMessage` for an active Validator. Once Validator exit has been initiated (via a call to `initializeEndValidation`), the `PoSValidatorManager` must assume that the Validator has been deactivated on the P-Chain, and will therefore not sign any further weight updates. Therefore, it is invalid to _initiate_ adding or removing a Delegator when the Validator is in this state, though it _may be_ valid to _complete_ an already initiated Delegator action, depending on the order of delivery to the P-Chain. If the Delegator weight change was submitted (and a Warp signature on the acknowledgement retrieved) before the Validator was removed, then the Delegator action may be completed. Otherwise, the acknowledgement of the Validation end must first be delivered before completing the Delegator action. + +The following state transition diagram illustrates the relationship between Validator and Delegator state. `Validator` is abbreviated as `V`, `Delegator` is abbreviated as `D`, and function names are shortened to improve readability. `Delegator.Completed` is omitted to show equivalance between the Validator's initial state and the state after a Delegation completes. +```mermaid +stateDiagram-v2 + % Happy path + [*] --> V.PendingAdded : initAddVdr + V.PendingAdded --> V.Active : completeVdrReg + V.Active --> V.Active,D.PendingAdded : initAddDel + V.Active,D.PendingAdded --> V.Active,D.Active : completeAddDel + V.Active,D.Active --> V.Active,D.PendingRemoved : initEndDel + V.Active,D.PendingRemoved --> V.Active : completeEndDel + V.Active --> V.PendingRemoved : initEndVdr + V.PendingRemoved --> V.Completed : completeEndVdr + + % Validator/Delegator state changes do not affect the Delegator/Validator state + V.Active,D.PendingRemoved --> V.PendingRemoved,D.PendingRemoved : initEndVdr + V.Active,D.PendingAdded --> V.PendingRemoved,D.PendingAdded : initEndVdr + V.Active,D.Active --> V.PendingRemoved,D.Active: initEndVdr + + % When the Validator is in PendingRemoved or Completed, in general Delegator actions + % may be completed, but not initialized. + V.PendingRemoved,D.PendingAdded --> V.Completed,D.PendingAdded : completeEndVdr + V.PendingRemoved,D.PendingRemoved --> V.Completed,D.PendingRemoved : completeEndVdr + V.PendingRemoved,D.PendingRemoved --> V.PendingRemoved : completeEndDel + V.PendingRemoved,D.Active --> V.Completed,D.Active : completeEndVdr + % This is a no-op + V.PendingRemoved,D.PendingAdded --> V.PendingRemoved,D.Active : completeAddDel + V.Completed,D.PendingRemoved --> V.Completed : endDelegationCompletedValidator + V.Completed,D.Active --> V.Completed : endDelegationCompletedValidator + V.Completed,D.PendingAdded --> V.Completed : endDelegationCompletedValidator +``` \ No newline at end of file diff --git a/contracts/validator-manager/README.md b/contracts/validator-manager/README.md index 22ada1f53..6f3a820d8 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -143,6 +143,31 @@ Specification: +----------+ ``` +### `SubnetValidatorWeightUpdateMessage` + +Description: Acknowledges a validator weight update + +Signed by: P-Chain +Consumed by: Validator Manager contract + +Specification: + +``` ++--------------+----------+----------+ +| codecID : uint16 | 2 bytes | ++--------------+----------+----------+ +| typeID : uint32 | 4 bytes | ++--------------+----------+----------+ +| validationID : [32]byte | 32 bytes | ++--------------+----------+----------+ +| nonce : uint64 | 8 bytes | ++--------------+----------+----------+ +| weight : uint64 | 8 bytes | ++--------------+----------+----------+ + | 54 bytes | + +----------+ +``` + ## Types of Validator Managers ### Proof of Authority From be119a01e36211551c170f4c6110c907475339a8 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 24 Sep 2024 14:21:11 -0400 Subject: [PATCH 402/545] Clean up state transitions --- .../ERC20TokenStakingManager.go | 54 ++---- .../NativeTokenStakingManager.go | 54 ++---- .../validator-manager/PoSValidatorManager.sol | 179 +++++++----------- .../interfaces/IPoSValidatorManager.sol | 15 +- .../tests/PoSValidatorManagerTests.t.sol | 6 +- 5 files changed, 98 insertions(+), 210 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6f9461ea6..fb8a8e256 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -82,8 +82,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161568e38038061568e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6155418061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd366004614a7e565b61043a565b005b6101d26101e2366004614ab9565b6107e1565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b610219610214366004614ab9565b610953565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004614ad0565b610969565b6101d261026e366004614ae9565b610a0a565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004614b11565b610de2565b6102b66102b1366004614b75565b611266565b6040519081526020016101fd565b6102196102d2366004614ab9565b61127f565b6102b65f81565b6101d26102ec366004614a7e565b611293565b6101ef603081565b6101d2610307366004614ab9565b61145e565b6101d261031a366004614ae9565b611519565b6101d261032d366004614ab9565b6116b9565b6102b6610340366004614b8e565b611930565b6101d2610353366004614ad0565b61195c565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c366004614ab9565b611ace565b6101d261039f366004614ab9565b611caa565b6101ef601481565b6103bf6103ba366004614ab9565b611dd4565b6040516101fd9190614bc2565b6102196202a30081565b6102b66103e4366004614ab9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004614c82565b611e9c565b6101d2610435366004614cfb565b611ed1565b5f8381525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff16600381111561048757610487614bae565b600381111561049857610498614bae565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61050e82611dd4565b905060028351600381111561052557610525614bae565b146105435760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105705760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f8060028351600581111561058e5761058e614bae565b036105df5787156105a6576105a38488611fb0565b91505b5f856060015184608001516105bb9190614d4d565b90506105c78582612134565b506001600160401b031660c087015250429050610611565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b59061063690611266565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106669796959493929190614d6d565b602060405180830381865afa158015610681573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a59190614dab565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff191660018360038111156106e4576106e4614bae565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906107ce9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206155158339815191526020526040808220815160e0810190925280545f805160206154d583398151915293929190829060ff16600581111561082e5761082e614bae565b600581111561083f5761083f614bae565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108ae576108ae614bae565b146108cc5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6108f18584606001515f61228b565b6040518263ffffffff1660e01b815260040161090d9190614de4565b6020604051808303815f875af1158015610929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094d9190614dab565b50505050565b5f61096364e8d4a5100083614e16565b92915050565b5f805160206154b58339815191525f80610982846122e2565b9150915061098f82612580565b6109995750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156109c8576109c8614bae565b036109ed575f838152600785016020526040812080549190556109eb82826125bb565b505b610a03816109fe8460400151611266565b612631565b5050505050565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff166003811115610a5757610a57614bae565b6003811115610a6857610a68614bae565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610adf90611dd4565b905060015f85815260058501602052604090205460ff166003811115610b0757610b07614bae565b14610b255760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610b3a57610b3a614bae565b03610c8357600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610b9457610b94614bae565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610c9857610c98614bae565b03610ca657610a0384612654565b5f610cb086612831565b90505f80610cc18360400151612931565b509150915081856040015114610cea57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610d3257505f8781526005870160205260409020600201546001600160401b03808316600160801b90920416115b15610d5057604051633ab3447f60e11b815260040160405180910390fd5b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206154d58339815191529060ff1615610e3457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9b9190614dab565b836020013514610ebe5760405163d040949d60e01b815260040160405180910390fd5b30610ecf6060850160408601614e35565b6001600160a01b031614610ef65760405163e6c4247b60e01b815260040160405180910390fd5b5f610f046060850185614e50565b905090505f805b828163ffffffff1610156111b0575f610f276060880188614e50565b8363ffffffff16818110610f3d57610f3d614e95565b9050602002810190610f4f9190614ea9565b610f5890614f59565b80515f8181526008880160205260409020549192509015610f8c57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610fbb92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610fd591614ff0565b602060405180830381855afa158015610ff0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110139190614dab565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561109f5761109f614bae565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611152911686615001565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806111a990615014565b9050610f0b565b50600483018190555f6111c285612831565b90505f6111d28260400151612b6f565b90505f6111de88612ce4565b9050816002826040516111f19190614ff0565b602060405180830381855afa15801561120c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061122f9190614dab565b1461124d57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6109636001600160401b03831664e8d4a51000615036565b5f61128982611dd4565b6080015192915050565b5f805160206154b58339815191525f6112ab8561317d565b90506112b685612580565b6112c1575050505050565b5f8581526004830160205260409020546001600160a01b031633146112f95760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161132891600160b01b90046001600160401b03169061504d565b6001600160401b03168160c001516001600160401b0316101561135e576040516302336bad60e51b815260040160405180910390fd5b8315610a03575f61136f8685611fb0565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906113bf90611266565b60a085015160c08601516040516001600160e01b031960e086901b1681526113f3939291829188905f908190600401614d6d565b602060405180830381865afa15801561140e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114329190614dab565b5f87815260078501602052604081208054909190611451908490615001565b9091555050505050505050565b5f805160206154b58339815191525f61147683611dd4565b905060048151600581111561148d5761148d614bae565b146114ab5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114e35760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461094d906001600160a01b0316826125bb565b6115216133ba565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff16600381111561156e5761156e614bae565b600381111561157f5761157f614bae565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f6115ed85612831565b90505f806115fe8360400151612931565b50915091508184604001511461162757604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561165e57604051633ab3447f60e11b815260040160405180910390fd5b60038451600381111561167357611673614bae565b146116915760405163f95c7fe160e01b815260040160405180910390fd5b61169a86612654565b50505050506116b560015f805160206154f583398151915255565b5050565b6116c16133ba565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff16600381111561170e5761170e614bae565b600381111561171f5761171f614bae565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61179582611dd4565b90505f835160038111156117ab576117ab614bae565b036117c957604051631d0b665760e21b815260040160405180910390fd5b6004815160058111156117de576117de614bae565b146117fc5760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561181157611811614bae565b036118285761181f85612654565b50505050611917565b60028351600381111561183d5761183d614bae565b0361190957600384015460608401516001600160a01b039091169063778c06b59061186790611266565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b1681526118b996959493926001600160401b0390921691908190600401614d6d565b602060405180830381865afa1580156118d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f89190614dab565b5f8681526006860160205260409020555b61191285612654565b505050505b61192d60015f805160206154f583398151915255565b50565b5f6119396133ba565b611944833384613404565b905061096360015f805160206154f583398151915255565b5f805160206154d58339815191525f61197483612831565b90505f8061198583604001516136cb565b91509150806119a757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546119c19061506d565b90505f036119e257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115611a0857611a08614bae565b14611a265760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120611a3e916149ce565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff166003811115611b1b57611b1b614bae565b6003811115611b2c57611b2c614bae565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611ba557611ba5614bae565b14158015611bc65750600381516003811115611bc357611bc3614bae565b14155b15611be45760405163f95c7fe160e01b815260040160405180910390fd5b5f611bf28260400151611dd4565b905080606001516001600160401b03165f03611c2157604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611c4e84604001518460600151856080015161228b565b6040518263ffffffff1660e01b8152600401611c6a9190614de4565b6020604051808303815f875af1158015611c86573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a039190614dab565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206154d58339815191529190611cf19061506d565b90505f03611d1257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611d3857611d38614bae565b14611d565760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d8f91906004016150a5565b6020604051808303815f875af1158015611dab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dcf9190614dab565b505050565b611ddc614a05565b5f8281525f80516020615515833981519152602052604090819020815160e0810190925280545f805160206154d5833981519152929190829060ff166005811115611e2957611e29614bae565b6005811115611e3a57611e3a614bae565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611ea56133ba565b611eb18585858561386f565b9050611ec960015f805160206154f583398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611f1a575080546001600160401b03808416911610155b15611f385760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611f638484613a0d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ffb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612022919081019061513a565b915091508061204457604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612087573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ab9190614dab565b8251146120cb5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156120f75760405163e6c4247b60e01b815260040160405180910390fd5b5f806121068460400151613a27565b9150915081871461212a57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615515833981519152602052604081206002015481905f805160206154d583398151915290600160801b90046001600160401b031661217c8582613c02565b5f61218687613dcb565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6121d68a858b61228b565b6040518263ffffffff1660e01b81526004016121f29190614de4565b6020604051808303815f875af115801561220e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122329190614dab565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6122eb614a05565b5f805160206154d58339815191525f61230385612831565b90505f8061231483604001516136cb565b91509150801561233757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561236857612368614bae565b600581111561237957612379614bae565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156123e8576123e8614bae565b14158015612409575060018151600581111561240657612406614bae565b14155b156124275760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561243c5761243c614bae565b0361244a576004815261244f565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561249457612494614bae565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561254857612548614bae565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061549583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612616575f80fd5b505af1158015612628573d5f803e3d5ffd5b50505050505050565b5f80516020615495833981519152546116b5906001600160a01b03168383613e40565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff1660038111156126a1576126a1614bae565b60038111156126b2576126b2614bae565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687018252828120805490829055848252600488019092529182205493945091926127109061278790600160a01b900461ffff1684615036565b6127919190614e16565b905080856007015f8581526020019081526020015f205f8282546127b59190615001565b909155505f90506127c6828461520c565b90506127d68560200151826125bb565b6127eb85602001516109fe8760600151611266565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612895573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128bc919081019061513a565b91509150806128de57604051636b2f19e960e01b815260040160405180910390fd5b8151156128fe5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561292a5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461295657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129a55761296d81600161520c565b612978906008615036565b61ffff1686828151811061298e5761298e614e95565b016020015160f81c901b9190911790600101612959565b5061ffff8116156129c95760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612a24576129e081600361520c565b6129eb906008615036565b63ffffffff16876129fd836002615001565b81518110612a0d57612a0d614e95565b016020015160f81c901b91909117906001016129cc565b5063ffffffff8116600414612a4c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612aa157612a6381601f61520c565b612a6e906008615036565b88612a7a836006615001565b81518110612a8a57612a8a614e95565b016020015160f81c901b9190911790600101612a4f565b505f805b6008811015612b0057612ab981600761520c565b612ac4906008615036565b6001600160401b031689612ad9836026615001565b81518110612ae957612ae9614e95565b016020015160f81c901b9190911790600101612aa5565b505f805b6008811015612b5f57612b1881600761520c565b612b23906008615036565b6001600160401b03168a612b3883602e615001565b81518110612b4857612b48614e95565b016020015160f81c901b9190911790600101612b04565b5091989097509095509350505050565b5f8151602614612b9257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612be157612ba981600161520c565b612bb4906008615036565b61ffff16848281518110612bca57612bca614e95565b016020015160f81c901b9190911790600101612b95565b5061ffff811615612c055760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612c6057612c1c81600361520c565b612c27906008615036565b63ffffffff1685612c39836002615001565b81518110612c4957612c49614e95565b016020015160f81c901b9190911790600101612c08565b5063ffffffff811615612c8657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612cdb57612c9d81601f61520c565b612ca8906008615036565b86612cb4836006615001565b81518110612cc457612cc4614e95565b016020015160f81c901b9190911790600101612c89565b50949350505050565b60605f612cf383830184614e50565b612cff91506058615036565b612d0a90605c615001565b6001600160401b03811115612d2157612d21614ec7565b6040519080825280601f01601f191660200182016040528015612d4b576020820181803683370190505b5090505f5b6020811015612da05783358160208110612d6c57612d6c614e95565b1a60f81b828281518110612d8257612d82614e95565b60200101906001600160f81b03191690815f1a905350600101612d50565b505f5b6020811015612e005783602001358160208110612dc257612dc2614e95565b1a60f81b82612dd2836020615001565b81518110612de257612de2614e95565b60200101906001600160f81b03191690815f1a905350600101612da3565b505f5b6004811015612e6357612e1781600361520c565b612e22906008615036565b6014901c60f81b82612e35836040615001565b81518110612e4557612e45614e95565b60200101906001600160f81b03191690815f1a905350600101612e03565b505f612e756060850160408601614e35565b60601b90505f5b6014811015612ed557818160148110612e9757612e97614e95565b1a60f81b83612ea7836044615001565b81518110612eb757612eb7614e95565b60200101906001600160f81b03191690815f1a905350600101612e7c565b505f612ee46060860186614e50565b905090505f5b6004811015612f4f57612efe81600361520c565b612f09906008615036565b63ffffffff8316901c60f81b84612f21836058615001565b81518110612f3157612f31614e95565b60200101906001600160f81b03191690815f1a905350600101612eea565b505f5b612f5f6060870187614e50565b9050811015613173575f612f74826058615036565b612f7f90605c615001565b90505f5b602081101561300a57612f996060890189614e50565b84818110612fa957612fa9614e95565b9050602002810190612fbb9190614ea9565b358160208110612fcd57612fcd614e95565b1a60f81b86612fdc8385615001565b81518110612fec57612fec614e95565b60200101906001600160f81b03191690815f1a905350600101612f83565b505f5b60088110156130bf5761302181600761520c565b61302c906008615036565b61303960608a018a614e50565b8581811061304957613049614e95565b905060200281019061305b9190614ea9565b61306c906040810190602001614b75565b6001600160401b0316901c60f81b8682613087856020615001565b6130919190615001565b815181106130a1576130a1614e95565b60200101906001600160f81b03191690815f1a90535060010161300d565b505f5b6030811015613169576130d86060890189614e50565b848181106130e8576130e8614e95565b90506020028101906130fa9190614ea9565b61310890604081019061521f565b8281811061311857613118614e95565b9050013560f81c60f81b86828460286131319190615001565b61313b9190615001565b8151811061314b5761314b614e95565b60200101906001600160f81b03191690815f1a9053506001016130c2565b5050600101612f52565b5091949350505050565b613185614a05565b5f8281525f805160206155158339815191526020526040808220815160e0810190925280545f805160206154d583398151915293929190829060ff1660058111156131d2576131d2614bae565b60058111156131e3576131e3614bae565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561325557613255614bae565b146132735760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156132b7576132b7614bae565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133638582612134565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f805160206154f58339815191528054600119016133eb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206154f583398151915255565b5f5f805160206154b58339815191528161342061021485613e9f565b90505f61342c87611dd4565b905061343787612580565b61345457604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561346957613469614bae565b146134875760405163a36c527f60e01b815260040160405180910390fd5b5f828260800151613498919061504d565b905083600201600a9054906101000a90046001600160401b031682604001516134c19190615261565b6001600160401b0316816001600160401b031611156134f357604051630c192e7760e41b815260040160405180910390fd5b5f806134ff8a84612134565b915091505f8a8360405160200161352d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156135c0576135c0614bae565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146136ef57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561373e5761370681600161520c565b613711906008615036565b61ffff1685828151811061372757613727614e95565b016020015160f81c901b91909117906001016136f2565b5061ffff8116156137625760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137bd5761377981600361520c565b613784906008615036565b63ffffffff1686613796836002615001565b815181106137a6576137a6614e95565b016020015160f81c901b9190911790600101613765565b5063ffffffff81166003146137e557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561383a576137fc81601f61520c565b613807906008615036565b87613813836006615001565b8151811061382357613823614e95565b016020015160f81c901b91909117906001016137e8565b505f8660268151811061384f5761384f614e95565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206154b583398151915290600160401b900461ffff90811690861610806138c3575061271061ffff8616115b156138e15760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613913576040516302336bad60e51b815260040160405180910390fd5b80548310806139255750806001015483115b1561394357604051630103be3b60e21b815260040160405180910390fd5b5f61394d84613e9f565b90505f61395982610953565b90505f6139668983613ec2565b9050604051806060016040528061397a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613a156142ac565b613a1e826142f7565b6116b581614365565b5f808251602e14613a4b57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613a9a57613a6281600161520c565b613a6d906008615036565b61ffff16858281518110613a8357613a83614e95565b016020015160f81c901b9190911790600101613a4e565b5061ffff811615613abe5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613b1957613ad581600361520c565b613ae0906008615036565b63ffffffff1686613af2836002615001565b81518110613b0257613b02614e95565b016020015160f81c901b9190911790600101613ac1565b5063ffffffff8116600514613b4157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b9657613b5881601f61520c565b613b63906008615036565b87613b6f836006615001565b81518110613b7f57613b7f614e95565b016020015160f81c901b9190911790600101613b44565b505f805b6008811015613bf557613bae81600761520c565b613bb9906008615036565b6001600160401b031688613bce836026615001565b81518110613bde57613bde614e95565b016020015160f81c901b9190911790600101613b9a565b5090969095509350505050565b5f805160206154d58339815191525f6001600160401b038084169085161115613c3657613c2f8385614d4d565b9050613c43565b613c408484614d4d565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613ca5575060018401548151613ca1916001600160401b031690615001565b8210155b15613ccb576001600160401b038316606082015281815260408101516020820152613cea565b8281606001818151613cdd919061504d565b6001600160401b03169052505b6060810151613cfa906064615261565b602082015160018601546001600160401b039290921691613d259190600160401b900460ff16615036565b1015613d445760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613d5f9190615001565b9052506040810180516001600160401b0387169190613d7f90839061520c565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206155158339815191526020526040812060020180545f805160206154d58339815191529190600890613e1590600160401b90046001600160401b031661528c565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b03838116602483015260448201839052611dcf91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506143c2565b5f610963825f80516020615495833981519152546001600160a01b031690614428565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613f0657604051637fab81e560e01b815260040160405180910390fd5b5f805160206154d583398151915242613f256040860160208701614b75565b6001600160401b0316111580613f5f5750613f436202a30042615001565b613f536040860160208701614b75565b6001600160401b031610155b15613f7c5760405162d36c8560e81b815260040160405180910390fd5b6030613f8b604086018661521f565b9050141580613f9957508335155b15613fb75760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613fe757604051630eb0d31360e11b815260040160405180910390fd5b613ff1835f613c02565b5f8061408a6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906140359190614b75565b6001600160401b0316815260200161405060408a018a61521f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061458a565b5f828152600686016020526040902091935091506140a882826152eb565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906140e6908590600401614de4565b6020604051808303815f875af1158015614102573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141269190614dab565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561419e5761419e614bae565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161427e918e01908e01614b75565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166142f557604051631afcd79f60e31b815260040160405180910390fd5b565b6142ff6142ac565b6143088161464d565b614310614666565b61192d6060820135608083013561432d60c0850160a08601614b75565b61433d60e0860160c087016153aa565b61434e610100870160e088016153c3565b61436061012088016101008901614e35565b614676565b61436d6142ac565b5f805160206154958339815191526001600160a01b0382166143a25760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6143d66001600160a01b03841683614797565b905080515f141580156143fa5750808060200190518101906143f891906153e3565b155b15611dcf57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561446e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144929190614dab565b90506144a96001600160a01b0385163330866147a4565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156144ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145119190614dab565b90508181116145775760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161441f565b614581828261520c565b95945050505050565b5f60608260800151516030146145b357604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016145e597969594939291906153fe565b60405160208183030381529060405290506002816040516146069190614ff0565b602060405180830381855afa158015614621573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906146449190614dab565b94909350915050565b6146556142ac565b61465d6147dd565b61192d816147e5565b61466e6142ac565b6142f56148b7565b61467e6142ac565b5f805160206154b583398151915261ffff841615806146a2575061271061ffff8516115b156146c05760405163c98d73a760e01b815260040160405180910390fd5b858711156146e157604051630103be3b60e21b815260040160405180910390fd5b60ff831615806146f45750600a60ff8416115b15614712576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b60606122db83835f6148bf565b6040516001600160a01b03848116602483015283811660448301526064820183905261094d9186918216906323b872dd90608401613e6d565b6142f56142ac565b6147ed6142ac565b80355f805160206154d5833981519152908155601461481260608401604085016153c3565b60ff161180614831575061482c60608301604084016153c3565b60ff16155b1561484f5760405163b4fa3fb360e01b815260040160405180910390fd5b61485f60608301604084016153c3565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556148906040830160208401614b75565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6133f16142ac565b6060814710156148e45760405163cd78605960e01b815230600482015260240161441f565b5f80856001600160a01b031684866040516148ff9190614ff0565b5f6040518083038185875af1925050503d805f8114614939576040519150601f19603f3d011682016040523d82523d5f602084013e61493e565b606091505b509150915061212a86838360608261495e57614959826149a5565b6122db565b815115801561497557506001600160a01b0384163b155b1561499e57604051639996b31560e01b81526001600160a01b038516600482015260240161441f565b50806122db565b8051156149b55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546149da9061506d565b5f825580601f106149e9575050565b601f0160209004905f5260205f209081019061192d9190614a41565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614a55575f8155600101614a42565b5090565b801515811461192d575f80fd5b803563ffffffff81168114614a79575f80fd5b919050565b5f805f60608486031215614a90575f80fd5b833592506020840135614aa281614a59565b9150614ab060408501614a66565b90509250925092565b5f60208284031215614ac9575f80fd5b5035919050565b5f60208284031215614ae0575f80fd5b6122db82614a66565b5f8060408385031215614afa575f80fd5b614b0383614a66565b946020939093013593505050565b5f8060408385031215614b22575f80fd5b82356001600160401b03811115614b37575f80fd5b830160808186031215614b48575f80fd5b9150614b5660208401614a66565b90509250929050565b80356001600160401b0381168114614a79575f80fd5b5f60208284031215614b85575f80fd5b6122db82614b5f565b5f8060408385031215614b9f575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614be557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614c2060608401826001600160401b03169052565b506080830151614c3b60808401826001600160401b03169052565b5060a0830151614c5660a08401826001600160401b03169052565b5060c083015161292a60c08401826001600160401b03169052565b803561ffff81168114614a79575f80fd5b5f805f8060808587031215614c95575f80fd5b84356001600160401b03811115614caa575f80fd5b850160608188031215614cbb575f80fd5b9350614cc960208601614c71565b9250614cd760408601614b5f565b9396929550929360600135925050565b6001600160a01b038116811461192d575f80fd5b5f80828403610140811215614d0e575f80fd5b61012080821215614d1d575f80fd5b8493508301359050614d2e81614ce7565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561292a5761292a614d39565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614dbb575f80fd5b5051919050565b5f5b83811015614ddc578181015183820152602001614dc4565b50505f910152565b602081525f8251806020840152614e02816040850160208701614dc2565b601f01601f19169190910160400192915050565b5f82614e3057634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614e45575f80fd5b81356122db81614ce7565b5f808335601e19843603018112614e65575f80fd5b8301803591506001600160401b03821115614e7e575f80fd5b6020019150600581901b3603821315612284575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614ebd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614efd57614efd614ec7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2b57614f2b614ec7565b604052919050565b5f6001600160401b03821115614f4b57614f4b614ec7565b50601f01601f191660200190565b5f60608236031215614f69575f80fd5b614f71614edb565b823581526020614f82818501614b5f565b8183015260408401356001600160401b03811115614f9e575f80fd5b840136601f820112614fae575f80fd5b8035614fc1614fbc82614f33565b614f03565b8181523684838501011115614fd4575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614ebd818460208701614dc2565b8082018082111561096357610963614d39565b5f63ffffffff80831681810361502c5761502c614d39565b6001019392505050565b808202811582820484141761096357610963614d39565b6001600160401b0381811683821601908082111561292a5761292a614d39565b600181811c9082168061508157607f821691505b60208210810361509f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546150b78161506d565b806020870152604060018084165f81146150d857600181146150f457615121565b60ff19851660408a0152604084151560051b8a01019550615121565b895f5260205f205f5b858110156151185781548b82018601529083019088016150fd565b8a016040019650505b509398975050505050505050565b8051614a7981614a59565b5f806040838503121561514b575f80fd5b82516001600160401b0380821115615161575f80fd5b9084019060608287031215615174575f80fd5b61517c614edb565b8251815260208084015161518f81614ce7565b828201526040840151838111156151a4575f80fd5b80850194505087601f8501126151b8575f80fd5b835192506151c8614fbc84614f33565b83815288828587010111156151db575f80fd5b6151ea84838301848801614dc2565b806040840152508195506151ff81880161512f565b9450505050509250929050565b8181038181111561096357610963614d39565b5f808335601e19843603018112615234575f80fd5b8301803591506001600160401b0382111561524d575f80fd5b602001915036819003821315612284575f80fd5b6001600160401b0381811683821602808216919082811461528457615284614d39565b505092915050565b5f6001600160401b0380831681810361502c5761502c614d39565b601f821115611dcf57805f5260205f20601f840160051c810160208510156152cc5750805b601f840160051c820191505b81811015610a03575f81556001016152d8565b81516001600160401b0381111561530457615304614ec7565b61531881615312845461506d565b846152a7565b602080601f83116001811461534b575f84156153345750858301515b5f19600386901b1c1916600185901b1785556153a2565b5f85815260208120601f198616915b828110156153795788860151825594840194600190910190840161535a565b508582101561539657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156153ba575f80fd5b6122db82614c71565b5f602082840312156153d3575f80fd5b813560ff811681146122db575f80fd5b5f602082840312156153f3575f80fd5b81516122db81614a59565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161545381604e860160208901614dc2565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516152e73803806152e783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61519a8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b3366004614719565b61040d565b005b6101b86101c8366004614754565b6107bb565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004614754565b61092d565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b861024136600461476b565b610943565b6101b8610254366004614784565b6109e4565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b86102843660046147ac565b610ca5565b61029c610297366004614810565b611129565b6040519081526020016101e3565b6101ff6102b8366004614754565b611142565b61029c5f81565b6101b86102d2366004614719565b611156565b6101d5603081565b6101b86102ed366004614754565b611348565b6101b8610300366004614784565b611403565b61029c610313366004614829565b6115ca565b6101b861032636600461476b565b6115f6565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004614754565b611768565b6101b8610372366004614754565b611944565b6101d5601481565b61039261038d366004614754565b611a6e565b6040516101e3919061485d565b6101ff6202a30081565b61029c6103b7366004614754565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f536600461491d565b611b36565b6101b8610408366004614996565b611b6b565b5f8381525f805160206150ce8339815191526020526040808220815160e0810190925280545f8051602061510e83398151915293929190829060ff16600381111561045a5761045a614849565b600381111561046b5761046b614849565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e182611a6e565b90506002835160038111156104f8576104f8614849565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b60038151600581111561055857610558614849565b036105765760405163a36c527f60e01b815260040160405180910390fd5b5f878152600585810160205260408220805460ff1916600317905582518291600291908111156105a8576105a8614849565b036106215787156105c0576105bd8488611c4a565b91505b5f856060015184608001516105d591906149e8565b90506105e18582611dce565b505f8b8152600589016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905550429050610672565b50505f82815260088501602090815260408083205460608501518b855260058901909352922060020180546001600160c01b0316600160c01b6001600160401b039384160217905560c08301519116905b600386015460608601516001600160a01b039091169063778c06b59061069790611129565b60a086015160808901516040516001600160e01b031960e086901b16815260048101939093526001600160401b039182166024840152811660448301528085166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561070e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107329190614a08565b5f8a815260068801602052604090205560048351600581111561075757610757614849565b036107705761076589611f25565b505050505050505050565b6040516001600160401b038216815284908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699060200160405180910390a3505050505050505050565b5f8181525f8051602061516e8339815191526020526040808220815160e0810190925280545f8051602061512e83398151915293929190829060ff16600581111561080857610808614849565b600581111561081957610819614849565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561088857610888614849565b146108a65760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6108cb8584606001515f612100565b6040518263ffffffff1660e01b81526004016108e79190614a41565b6020604051808303815f875af1158015610903573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109279190614a08565b50505050565b5f61093d64e8d4a5100083614a73565b92915050565b5f8051602061510e8339815191525f8061095c84612157565b91509150610969826123f5565b6109735750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156109a2576109a2614849565b036109c7575f838152600785016020526040812080549190556109c58282612430565b505b6109dd816109d88460400151611129565b6124a6565b5050505050565b5f8181525f805160206150ce8339815191526020526040808220815160e0810190925280545f8051602061510e83398151915293929190829060ff166003811115610a3157610a31614849565b6003811115610a4257610a42614849565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ab882611a6e565b9050600183516003811115610acf57610acf614849565b14610aed5760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610b0257610b02614849565b03610b1857610b1085611f25565b505050505050565b5f600382516005811115610b2e57610b2e614849565b03610b79575060608101515f868152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905560c0810151610c17565b5f610b83886124c9565b90505f80610b9483604001516125c9565b5091509150818614610bb957604051636990657d60e01b815260040160405180910390fd5b806001600160401b031685606001516001600160401b03161080610bf25750806001600160401b03168760a001516001600160401b0316115b15610c1057604051633ab3447f60e11b815260040160405180910390fd5b4293505050505b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b038516600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252849188917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f691015b60405180910390a350505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061512e8339815191529060ff1615610cf757604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5e9190614a08565b836020013514610d815760405163d040949d60e01b815260040160405180910390fd5b30610d926060850160408601614a92565b6001600160a01b031614610db95760405163e6c4247b60e01b815260040160405180910390fd5b5f610dc76060850185614aad565b905090505f805b828163ffffffff161015611073575f610dea6060880188614aad565b8363ffffffff16818110610e0057610e00614af2565b9050602002810190610e129190614b06565b610e1b90614bb6565b80515f8181526008880160205260409020549192509015610e4f57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610e7e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610e9891614c4d565b602060405180830381855afa158015610eb3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ed69190614a08565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610f6257610f62614849565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611015911686614c5e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061106c90614c71565b9050610dce565b50600483018190555f611085856124c9565b90505f6110958260400151612807565b90505f6110a18861297c565b9050816002826040516110b49190614c4d565b602060405180830381855afa1580156110cf573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110f29190614a08565b1461111057604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61093d6001600160401b03831664e8d4a51000614c93565b5f61114c82611a6e565b6080015192915050565b5f8051602061510e8339815191525f61116e85612e15565b9050611179856123f5565b611184575050505050565b5f8581526004830160205260409020546001600160a01b031633146111bc5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516111eb91600160b01b90046001600160401b031690614caa565b6001600160401b03168160c001516001600160401b03161015611221576040516302336bad60e51b815260040160405180910390fd5b83156109dd575f6112328685611c4a565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061128290611129565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156112f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061131c9190614a08565b5f8781526007850160205260408120805490919061133b908490614c5e565b9091555050505050505050565b5f8051602061510e8339815191525f61136083611a6e565b905060048151600581111561137757611377614849565b146113955760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146113cd5760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610927906001600160a01b031682612430565b61140b613052565b5f8181525f805160206150ce8339815191526020526040808220815160e0810190925280545f8051602061510e83398151915293929190829060ff16600381111561145857611458614849565b600381111561146957611469614849565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156114e2576114e2614849565b146115005760405163f95c7fe160e01b815260040160405180910390fd5b600461150f8260400151611a6e565b51600581111561152157611521614849565b146115a5575f611530856124c9565b90505f8061154183604001516125c9565b50915091508184604001511461156a57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156115a157604051633ab3447f60e11b815260040160405180910390fd5b5050505b6115ae83611f25565b50506115c660015f8051602061514e83398151915255565b5050565b5f6115d3613052565b6115de83338461309c565b905061093d60015f8051602061514e83398151915255565b5f8051602061512e8339815191525f61160e836124c9565b90505f8061161f8360400151613363565b915091508061164157604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461165b90614cca565b90505f0361167c57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156116a2576116a2614849565b146116c05760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206116d891614669565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206150ce8339815191526020526040808220815160e0810190925280545f8051602061510e83398151915293929190829060ff1660038111156117b5576117b5614849565b60038111156117c6576117c6614849565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561183f5761183f614849565b14158015611860575060038151600381111561185d5761185d614849565b14155b1561187e5760405163f95c7fe160e01b815260040160405180910390fd5b5f61188c8260400151611a6e565b905080606001516001600160401b03165f036118bb57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6118e8846040015184606001518560800151612100565b6040518263ffffffff1660e01b81526004016119049190614a41565b6020604051808303815f875af1158015611920573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109dd9190614a08565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061512e833981519152919061198b90614cca565b90505f036119ac57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff1660058111156119d2576119d2614849565b146119f05760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611a299190600401614d02565b6020604051808303815f875af1158015611a45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a699190614a08565b505050565b611a766146a0565b5f8281525f8051602061516e833981519152602052604090819020815160e0810190925280545f8051602061512e833981519152929190829060ff166005811115611ac357611ac3614849565b6005811115611ad457611ad4614849565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611b3f613052565b611b4b85858585613507565b9050611b6360015f8051602061514e83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611bb4575080546001600160401b03808416911610155b15611bd25760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611bfd84846136a5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c95573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cbc9190810190614d97565b9150915080611cde57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d459190614a08565b825114611d655760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d915760405163e6c4247b60e01b815260040160405180910390fd5b5f80611da084604001516136bf565b91509150818714611dc457604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f8051602061516e833981519152602052604081206002015481905f8051602061512e83398151915290600160801b90046001600160401b0316611e16858261389a565b5f611e2087613a63565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e708a858b612100565b6040518263ffffffff1660e01b8152600401611e8c9190614a41565b6020604051808303815f875af1158015611ea8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ecc9190614a08565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f805160206150ce8339815191526020526040808220815160e0810190925280545f8051602061510e83398151915293929190829060ff166003811115611f7257611f72614849565b6003811115611f8357611f83614849565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156120b1575f8481526004870160205260409020546127109061206390600160a01b900461ffff1685614c93565b61206d9190614a73565b915081866007015f8681526020019081526020015f205f8282546120919190614c5e565b909155506120a190508284614e69565b90506120b1856020015182612430565b6120c685602001516109d88760600151611129565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc9939101610c94565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6121606146a0565b5f8051602061512e8339815191525f612178856124c9565b90505f806121898360400151613363565b9150915080156121ac57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156121dd576121dd614849565b60058111156121ee576121ee614849565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561225d5761225d614849565b1415801561227e575060018151600581111561227b5761227b614849565b14155b1561229c5760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156122b1576122b1614849565b036122bf57600481526122c4565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561230957612309614849565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156123bd576123bd614849565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206150ee83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561248b575f80fd5b505af115801561249d573d5f803e3d5ffd5b50505050505050565b5f805160206150ee833981519152546115c6906001600160a01b03168383613ad8565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561252d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125549190810190614d97565b915091508061257657604051636b2f19e960e01b815260040160405180910390fd5b8151156125965760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156125c25760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146125ee57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561263d57612605816001614e69565b612610906008614c93565b61ffff1686828151811061262657612626614af2565b016020015160f81c901b91909117906001016125f1565b5061ffff8116156126615760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156126bc57612678816003614e69565b612683906008614c93565b63ffffffff1687612695836002614c5e565b815181106126a5576126a5614af2565b016020015160f81c901b9190911790600101612664565b5063ffffffff81166004146126e457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612739576126fb81601f614e69565b612706906008614c93565b88612712836006614c5e565b8151811061272257612722614af2565b016020015160f81c901b91909117906001016126e7565b505f805b600881101561279857612751816007614e69565b61275c906008614c93565b6001600160401b031689612771836026614c5e565b8151811061278157612781614af2565b016020015160f81c901b919091179060010161273d565b505f805b60088110156127f7576127b0816007614e69565b6127bb906008614c93565b6001600160401b03168a6127d083602e614c5e565b815181106127e0576127e0614af2565b016020015160f81c901b919091179060010161279c565b5091989097509095509350505050565b5f815160261461282a57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561287957612841816001614e69565b61284c906008614c93565b61ffff1684828151811061286257612862614af2565b016020015160f81c901b919091179060010161282d565b5061ffff81161561289d5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156128f8576128b4816003614e69565b6128bf906008614c93565b63ffffffff16856128d1836002614c5e565b815181106128e1576128e1614af2565b016020015160f81c901b91909117906001016128a0565b5063ffffffff81161561291e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156129735761293581601f614e69565b612940906008614c93565b8661294c836006614c5e565b8151811061295c5761295c614af2565b016020015160f81c901b9190911790600101612921565b50949350505050565b60605f61298b83830184614aad565b61299791506058614c93565b6129a290605c614c5e565b6001600160401b038111156129b9576129b9614b24565b6040519080825280601f01601f1916602001820160405280156129e3576020820181803683370190505b5090505f5b6020811015612a385783358160208110612a0457612a04614af2565b1a60f81b828281518110612a1a57612a1a614af2565b60200101906001600160f81b03191690815f1a9053506001016129e8565b505f5b6020811015612a985783602001358160208110612a5a57612a5a614af2565b1a60f81b82612a6a836020614c5e565b81518110612a7a57612a7a614af2565b60200101906001600160f81b03191690815f1a905350600101612a3b565b505f5b6004811015612afb57612aaf816003614e69565b612aba906008614c93565b6014901c60f81b82612acd836040614c5e565b81518110612add57612add614af2565b60200101906001600160f81b03191690815f1a905350600101612a9b565b505f612b0d6060850160408601614a92565b60601b90505f5b6014811015612b6d57818160148110612b2f57612b2f614af2565b1a60f81b83612b3f836044614c5e565b81518110612b4f57612b4f614af2565b60200101906001600160f81b03191690815f1a905350600101612b14565b505f612b7c6060860186614aad565b905090505f5b6004811015612be757612b96816003614e69565b612ba1906008614c93565b63ffffffff8316901c60f81b84612bb9836058614c5e565b81518110612bc957612bc9614af2565b60200101906001600160f81b03191690815f1a905350600101612b82565b505f5b612bf76060870187614aad565b9050811015612e0b575f612c0c826058614c93565b612c1790605c614c5e565b90505f5b6020811015612ca257612c316060890189614aad565b84818110612c4157612c41614af2565b9050602002810190612c539190614b06565b358160208110612c6557612c65614af2565b1a60f81b86612c748385614c5e565b81518110612c8457612c84614af2565b60200101906001600160f81b03191690815f1a905350600101612c1b565b505f5b6008811015612d5757612cb9816007614e69565b612cc4906008614c93565b612cd160608a018a614aad565b85818110612ce157612ce1614af2565b9050602002810190612cf39190614b06565b612d04906040810190602001614810565b6001600160401b0316901c60f81b8682612d1f856020614c5e565b612d299190614c5e565b81518110612d3957612d39614af2565b60200101906001600160f81b03191690815f1a905350600101612ca5565b505f5b6030811015612e0157612d706060890189614aad565b84818110612d8057612d80614af2565b9050602002810190612d929190614b06565b612da0906040810190614e7c565b82818110612db057612db0614af2565b9050013560f81c60f81b8682846028612dc99190614c5e565b612dd39190614c5e565b81518110612de357612de3614af2565b60200101906001600160f81b03191690815f1a905350600101612d5a565b5050600101612bea565b5091949350505050565b612e1d6146a0565b5f8281525f8051602061516e8339815191526020526040808220815160e0810190925280545f8051602061512e83398151915293929190829060ff166005811115612e6a57612e6a614849565b6005811115612e7b57612e7b614849565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612eed57612eed614849565b14612f0b5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612f4f57612f4f614849565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612ffb8582611dce565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061514e83398151915280546001190161308357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061514e83398151915255565b5f5f8051602061510e833981519152816130b86101fa85613b37565b90505f6130c487611a6e565b90506130cf876123f5565b6130ec57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561310157613101614849565b1461311f5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516131309190614caa565b905083600201600a9054906101000a90046001600160401b031682604001516131599190614ebe565b6001600160401b0316816001600160401b0316111561318b57604051630c192e7760e41b815260040160405180910390fd5b5f806131978a84611dce565b915091505f8a836040516020016131c592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561325857613258614849565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461338757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133d65761339e816001614e69565b6133a9906008614c93565b61ffff168582815181106133bf576133bf614af2565b016020015160f81c901b919091179060010161338a565b5061ffff8116156133fa5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561345557613411816003614e69565b61341c906008614c93565b63ffffffff168661342e836002614c5e565b8151811061343e5761343e614af2565b016020015160f81c901b91909117906001016133fd565b5063ffffffff811660031461347d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134d25761349481601f614e69565b61349f906008614c93565b876134ab836006614c5e565b815181106134bb576134bb614af2565b016020015160f81c901b9190911790600101613480565b505f866026815181106134e7576134e7614af2565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061510e83398151915290600160401b900461ffff908116908616108061355b575061271061ffff8616115b156135795760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156135ab576040516302336bad60e51b815260040160405180910390fd5b80548310806135bd5750806001015483115b156135db57604051630103be3b60e21b815260040160405180910390fd5b5f6135e584613b37565b90505f6135f18261092d565b90505f6135fe8983613b5a565b905060405180606001604052806136123390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6136ad613f44565b6136b682613f8f565b6115c681614000565b5f808251602e146136e357604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613732576136fa816001614e69565b613705906008614c93565b61ffff1685828151811061371b5761371b614af2565b016020015160f81c901b91909117906001016136e6565b5061ffff8116156137565760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137b15761376d816003614e69565b613778906008614c93565b63ffffffff168661378a836002614c5e565b8151811061379a5761379a614af2565b016020015160f81c901b9190911790600101613759565b5063ffffffff81166005146137d957604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561382e576137f081601f614e69565b6137fb906008614c93565b87613807836006614c5e565b8151811061381757613817614af2565b016020015160f81c901b91909117906001016137dc565b505f805b600881101561388d57613846816007614e69565b613851906008614c93565b6001600160401b031688613866836026614c5e565b8151811061387657613876614af2565b016020015160f81c901b9190911790600101613832565b5090969095509350505050565b5f8051602061512e8339815191525f6001600160401b0380841690851611156138ce576138c783856149e8565b90506138db565b6138d884846149e8565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061393d575060018401548151613939916001600160401b031690614c5e565b8210155b15613963576001600160401b038316606082015281815260408101516020820152613982565b82816060018181516139759190614caa565b6001600160401b03169052505b6060810151613992906064614ebe565b602082015160018601546001600160401b0392909216916139bd9190600160401b900460ff16614c93565b10156139dc5760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516139f79190614c5e565b9052506040810180516001600160401b0387169190613a17908390614e69565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061516e8339815191526020526040812060020180545f8051602061512e8339815191529190600890613aad90600160401b90046001600160401b0316614ee9565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b03838116602483015260448201839052611a6991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061405d565b5f61093d825f805160206150ee833981519152546001600160a01b0316906140c3565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613b9e57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061512e83398151915242613bbd6040860160208701614810565b6001600160401b0316111580613bf75750613bdb6202a30042614c5e565b613beb6040860160208701614810565b6001600160401b031610155b15613c145760405162d36c8560e81b815260040160405180910390fd5b6030613c236040860186614e7c565b9050141580613c3157508335155b15613c4f5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613c7f57604051630eb0d31360e11b815260040160405180910390fd5b613c89835f61389a565b5f80613d226040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ccd9190614810565b6001600160401b03168152602001613ce860408a018a614e7c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614225565b5f82815260068601602052604090209193509150613d408282614f48565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613d7e908590600401614a41565b6020604051808303815f875af1158015613d9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dbe9190614a08565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e3657613e36614849565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f16918e01908e01614810565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f8d57604051631afcd79f60e31b815260040160405180910390fd5b565b613f97613f44565b613fa0816142e8565b613fa8614301565b613ffd60608201356080830135613fc560c0850160a08601614810565b613fd560e0860160c08701615003565b613fe6610100870160e0880161501c565b613ff861012088016101008901614a92565b614311565b50565b614008613f44565b5f805160206150ee8339815191526001600160a01b03821661403d5760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6140716001600160a01b03841683614432565b905080515f14158015614095575080806020019051810190614093919061503c565b155b15611a6957604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614109573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061412d9190614a08565b90506141446001600160a01b03851633308661443f565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614188573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141ac9190614a08565b90508181116142125760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016140ba565b61421c8282614e69565b95945050505050565b5f606082608001515160301461424e57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016142809796959493929190615057565b60405160208183030381529060405290506002816040516142a19190614c4d565b602060405180830381855afa1580156142bc573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142df9190614a08565b94909350915050565b6142f0613f44565b6142f8614478565b613ffd81614480565b614309613f44565b613f8d614552565b614319613f44565b5f8051602061510e83398151915261ffff8416158061433d575061271061ffff8516115b1561435b5760405163c98d73a760e01b815260040160405180910390fd5b8587111561437c57604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061438f5750600a60ff8416115b156143ad576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061215083835f61455a565b6040516001600160a01b0384811660248301528381166044830152606482018390526109279186918216906323b872dd90608401613b05565b613f8d613f44565b614488613f44565b80355f8051602061512e83398151915290815560146144ad606084016040850161501c565b60ff1611806144cc57506144c7606083016040840161501c565b60ff16155b156144ea5760405163b4fa3fb360e01b815260040160405180910390fd5b6144fa606083016040840161501c565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561452b6040830160208401614810565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613089613f44565b60608147101561457f5760405163cd78605960e01b81523060048201526024016140ba565b5f80856001600160a01b0316848660405161459a9190614c4d565b5f6040518083038185875af1925050503d805f81146145d4576040519150601f19603f3d011682016040523d82523d5f602084013e6145d9565b606091505b5091509150611dc48683836060826145f9576145f482614640565b612150565b815115801561461057506001600160a01b0384163b155b1561463957604051639996b31560e01b81526001600160a01b03851660048201526024016140ba565b5080612150565b8051156146505780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461467590614cca565b5f825580601f10614684575050565b601f0160209004905f5260205f2090810190613ffd91906146dc565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156146f0575f81556001016146dd565b5090565b8015158114613ffd575f80fd5b803563ffffffff81168114614714575f80fd5b919050565b5f805f6060848603121561472b575f80fd5b83359250602084013561473d816146f4565b915061474b60408501614701565b90509250925092565b5f60208284031215614764575f80fd5b5035919050565b5f6020828403121561477b575f80fd5b61215082614701565b5f8060408385031215614795575f80fd5b61479e83614701565b946020939093013593505050565b5f80604083850312156147bd575f80fd5b82356001600160401b038111156147d2575f80fd5b8301608081860312156147e3575f80fd5b91506147f160208401614701565b90509250929050565b80356001600160401b0381168114614714575f80fd5b5f60208284031215614820575f80fd5b612150826147fa565b5f806040838503121561483a575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061488057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516148bb60608401826001600160401b03169052565b5060808301516148d660808401826001600160401b03169052565b5060a08301516148f160a08401826001600160401b03169052565b5060c08301516125c260c08401826001600160401b03169052565b803561ffff81168114614714575f80fd5b5f805f8060808587031215614930575f80fd5b84356001600160401b03811115614945575f80fd5b850160608188031215614956575f80fd5b93506149646020860161490c565b9250614972604086016147fa565b9396929550929360600135925050565b6001600160a01b0381168114613ffd575f80fd5b5f808284036101408112156149a9575f80fd5b610120808212156149b8575f80fd5b84935083013590506149c981614982565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156125c2576125c26149d4565b5f60208284031215614a18575f80fd5b5051919050565b5f5b83811015614a39578181015183820152602001614a21565b50505f910152565b602081525f8251806020840152614a5f816040850160208701614a1f565b601f01601f19169190910160400192915050565b5f82614a8d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614aa2575f80fd5b813561215081614982565b5f808335601e19843603018112614ac2575f80fd5b8301803591506001600160401b03821115614adb575f80fd5b6020019150600581901b3603821315611f1e575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614b1a575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b5a57614b5a614b24565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b8857614b88614b24565b604052919050565b5f6001600160401b03821115614ba857614ba8614b24565b50601f01601f191660200190565b5f60608236031215614bc6575f80fd5b614bce614b38565b823581526020614bdf8185016147fa565b8183015260408401356001600160401b03811115614bfb575f80fd5b840136601f820112614c0b575f80fd5b8035614c1e614c1982614b90565b614b60565b8181523684838501011115614c31575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614b1a818460208701614a1f565b8082018082111561093d5761093d6149d4565b5f63ffffffff808316818103614c8957614c896149d4565b6001019392505050565b808202811582820484141761093d5761093d6149d4565b6001600160401b038181168382160190808211156125c2576125c26149d4565b600181811c90821680614cde57607f821691505b602082108103614cfc57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614d1481614cca565b806020870152604060018084165f8114614d355760018114614d5157614d7e565b60ff19851660408a0152604084151560051b8a01019550614d7e565b895f5260205f205f5b85811015614d755781548b8201860152908301908801614d5a565b8a016040019650505b509398975050505050505050565b8051614714816146f4565b5f8060408385031215614da8575f80fd5b82516001600160401b0380821115614dbe575f80fd5b9084019060608287031215614dd1575f80fd5b614dd9614b38565b82518152602080840151614dec81614982565b82820152604084015183811115614e01575f80fd5b80850194505087601f850112614e15575f80fd5b83519250614e25614c1984614b90565b8381528882858701011115614e38575f80fd5b614e4784838301848801614a1f565b80604084015250819550614e5c818801614d8c565b9450505050509250929050565b8181038181111561093d5761093d6149d4565b5f808335601e19843603018112614e91575f80fd5b8301803591506001600160401b03821115614eaa575f80fd5b602001915036819003821315611f1e575f80fd5b6001600160401b03818116838216028082169190828114614ee157614ee16149d4565b505092915050565b5f6001600160401b03808316818103614c8957614c896149d4565b601f821115611a6957805f5260205f20601f840160051c81016020851015614f295750805b601f840160051c820191505b818110156109dd575f8155600101614f35565b81516001600160401b03811115614f6157614f61614b24565b614f7581614f6f8454614cca565b84614f04565b602080601f831160018114614fa8575f8415614f915750858301515b5f19600386901b1c1916600185901b178555610b10565b5f85815260208120601f198616915b82811015614fd657888601518255948401946001909101908401614fb7565b5085821015614ff357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215615013575f80fd5b6121508261490c565b5f6020828403121561502c575f80fd5b813560ff81168114612150575f80fd5b5f6020828403121561504c575f80fd5b8151612150816146f4565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516150ac81604e860160208901614a1f565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -761,27 +761,6 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Comp return _ERC20TokenStakingManager.Contract.CompleteValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, messageIndex) } -// EndDelegationCompletedValidator is a paid mutator transaction binding the contract method 0x9dde029a. -// -// Solidity: function endDelegationCompletedValidator(bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) EndDelegationCompletedValidator(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.contract.Transact(opts, "endDelegationCompletedValidator", delegationID) -} - -// EndDelegationCompletedValidator is a paid mutator transaction binding the contract method 0x9dde029a. -// -// Solidity: function endDelegationCompletedValidator(bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) EndDelegationCompletedValidator(delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.EndDelegationCompletedValidator(&_ERC20TokenStakingManager.TransactOpts, delegationID) -} - -// EndDelegationCompletedValidator is a paid mutator transaction binding the contract method 0x9dde029a. -// -// Solidity: function endDelegationCompletedValidator(bytes32 delegationID) returns() -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) EndDelegationCompletedValidator(delegationID [32]byte) (*types.Transaction, error) { - return _ERC20TokenStakingManager.Contract.EndDelegationCompletedValidator(&_ERC20TokenStakingManager.TransactOpts, delegationID) -} - // Initialize is a paid mutator transaction binding the contract method 0xf09969ae. // // Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings, address token) returns() @@ -1363,15 +1342,14 @@ func (it *ERC20TokenStakingManagerDelegatorRegisteredIterator) Close() error { type ERC20TokenStakingManagerDelegatorRegistered struct { DelegationID [32]byte ValidationID [32]byte - Nonce uint64 StartTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6. // -// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*ERC20TokenStakingManagerDelegatorRegisteredIterator, error) { var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { @@ -1381,22 +1359,18 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule) if err != nil { return nil, err } return &ERC20TokenStakingManagerDelegatorRegisteredIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil } -// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6. // -// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 startTime) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { @@ -1406,12 +1380,8 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule) if err != nil { return nil, err } @@ -1443,9 +1413,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. +// ParseDelegatorRegistered is a log parse operation binding the contract event 0x047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6. // -// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 startTime) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*ERC20TokenStakingManagerDelegatorRegistered, error) { event := new(ERC20TokenStakingManagerDelegatorRegistered) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 7e43fb0dc..fd21e913f 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -82,8 +82,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161539b38038061539b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61524e8061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004614828565b61058b565b005b3480156101ea575f80fd5b506101dd6101f9366004614863565b610932565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd61024336600461487a565b610aa4565b348015610253575f80fd5b50610267610262366004614863565b610b81565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046148b8565b610b97565b604051908152602001610220565b348015610305575f80fd5b506101dd61031436600461490c565b610bcb565b348015610324575f80fd5b506101dd610333366004614925565b610c6c565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b36600461494d565b611044565b34801561038b575f80fd5b506102ec61039a36600461499b565b6114c8565b3480156103aa575f80fd5b506102676103b9366004614863565b6114e1565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb366004614828565b6114f5565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e366004614863565b6116c0565b34801561042e575f80fd5b506101dd61043d366004614925565b61177b565b34801561044d575f80fd5b506101dd61045c366004614863565b61191b565b34801561046c575f80fd5b506101dd61047b36600461490c565b611b92565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b4366004614863565b611d04565b3480156104c4575f80fd5b506101dd6104d3366004614863565b611ee0565b6102ec6104e6366004614863565b61200a565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e610519366004614863565b61203b565b60405161022091906149c8565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b366004614863565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff1660038111156105d8576105d86149b4565b60038111156105e9576105e96149b4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61065f8261203b565b9050600283516003811115610676576106766149b4565b146106945760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106c15760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f806002835160058111156106df576106df6149b4565b036107305787156106f7576106f48488612103565b91505b5f8560600151846080015161070c9190614a8b565b90506107188582612287565b506001600160401b031660c087015250429050610762565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b590610787906114c8565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016107b79796959493929190614aab565b602060405180830381865afa1580156107d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f69190614ae9565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff19166001836003811115610835576108356149b4565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061091f9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206152228339815191526020526040808220815160e0810190925280545f805160206151e283398151915293929190829060ff16600581111561097f5761097f6149b4565b6005811115610990576109906149b4565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109ff576109ff6149b4565b14610a1d5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a428584606001515f6123de565b6040518263ffffffff1660e01b8152600401610a5e9190614b22565b6020604051808303815f875af1158015610a7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9e9190614ae9565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aed575080546001600160401b03808416911610155b15610b0b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b358361242d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b9164e8d4a5100083614b54565b92915050565b5f610ba061243e565b610bac84848434612475565b9050610bc460015f8051602061520283398151915255565b9392505050565b5f805160206151c28339815191525f80610be48461261b565b91509150610bf1826128b9565b610bfb5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c2a57610c2a6149b4565b03610c4f575f83815260078501602052604081208054919055610c4d82826128f4565b505b610c6581610c6084604001516114c8565b61295a565b5050505050565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff166003811115610cb957610cb96149b4565b6003811115610cca57610cca6149b4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610d419061203b565b905060015f85815260058501602052604090205460ff166003811115610d6957610d696149b4565b14610d875760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610d9c57610d9c6149b4565b03610ee557600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610df657610df66149b4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610efa57610efa6149b4565b03610f0857610c658461296d565b5f610f1286612b4a565b90505f80610f238360400151612c4a565b509150915081856040015114610f4c57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610f9457505f8781526005870160205260409020600201546001600160401b03808316600160801b90920416115b15610fb257604051633ab3447f60e11b815260040160405180910390fd5b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151e28339815191529060ff161561109657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110fd9190614ae9565b8360200135146111205760405163d040949d60e01b815260040160405180910390fd5b306111316060850160408601614b87565b6001600160a01b0316146111585760405163e6c4247b60e01b815260040160405180910390fd5b5f6111666060850185614ba2565b905090505f805b828163ffffffff161015611412575f6111896060880188614ba2565b8363ffffffff1681811061119f5761119f614be7565b90506020028101906111b19190614bfb565b6111ba90614cab565b80515f81815260088801602052604090205491925090156111ee57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161121d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261123791614d42565b602060405180830381855afa158015611252573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112759190614ae9565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115611301576113016149b4565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113b4911686614d53565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061140b90614d66565b905061116d565b50600483018190555f61142485612b4a565b90505f6114348260400151612e88565b90505f61144088612ffd565b9050816002826040516114539190614d42565b602060405180830381855afa15801561146e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114919190614ae9565b146114af57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610b916001600160401b03831664e8d4a51000614d88565b5f6114eb8261203b565b6080015192915050565b5f805160206151c28339815191525f61150d85613496565b9050611518856128b9565b611523575050505050565b5f8581526004830160205260409020546001600160a01b0316331461155b5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161158a91600160b01b90046001600160401b031690614d9f565b6001600160401b03168160c001516001600160401b031610156115c0576040516302336bad60e51b815260040160405180910390fd5b8315610c65575f6115d18685612103565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b590611621906114c8565b60a085015160c08601516040516001600160e01b031960e086901b168152611655939291829188905f908190600401614aab565b602060405180830381865afa158015611670573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116949190614ae9565b5f878152600785016020526040812080549091906116b3908490614d53565b9091555050505050505050565b5f805160206151c28339815191525f6116d88361203b565b90506004815160058111156116ef576116ef6149b4565b1461170d5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146117455760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610a9e906001600160a01b0316826128f4565b61178361243e565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff1660038111156117d0576117d06149b4565b60038111156117e1576117e16149b4565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f61184f85612b4a565b90505f806118608360400151612c4a565b50915091508184604001511461188957604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156118c057604051633ab3447f60e11b815260040160405180910390fd5b6003845160038111156118d5576118d56149b4565b146118f35760405163f95c7fe160e01b815260040160405180910390fd5b6118fc8661296d565b505050505061191760015f8051602061520283398151915255565b5050565b61192361243e565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff166003811115611970576119706149b4565b6003811115611981576119816149b4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6119f78261203b565b90505f83516003811115611a0d57611a0d6149b4565b03611a2b57604051631d0b665760e21b815260040160405180910390fd5b600481516005811115611a4057611a406149b4565b14611a5e5760405163a36c527f60e01b815260040160405180910390fd5b600183516003811115611a7357611a736149b4565b03611a8a57611a818561296d565b50505050611b79565b600283516003811115611a9f57611a9f6149b4565b03611b6b57600384015460608401516001600160a01b039091169063778c06b590611ac9906114c8565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b168152611b1b96959493926001600160401b0390921691908190600401614aab565b602060405180830381865afa158015611b36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b5a9190614ae9565b5f8681526006860160205260409020555b611b748561296d565b505050505b611b8f60015f8051602061520283398151915255565b50565b5f805160206151e28339815191525f611baa83612b4a565b90505f80611bbb83604001516136d3565b9150915080611bdd57604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068501602052604090208054611bf790614dbf565b90505f03611c1857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115611c3e57611c3e6149b4565b14611c5c5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120611c749161477d565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff166003811115611d5157611d516149b4565b6003811115611d6257611d626149b4565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611ddb57611ddb6149b4565b14158015611dfc5750600381516003811115611df957611df96149b4565b14155b15611e1a5760405163f95c7fe160e01b815260040160405180910390fd5b5f611e28826040015161203b565b905080606001516001600160401b03165f03611e5757604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611e848460400151846060015185608001516123de565b6040518263ffffffff1660e01b8152600401611ea09190614b22565b6020604051808303815f875af1158015611ebc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c659190614ae9565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206151e28339815191529190611f2790614dbf565b90505f03611f4857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611f6e57611f6e6149b4565b14611f8c5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fc59190600401614df1565b6020604051808303815f875af1158015611fe1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120059190614ae9565b505050565b5f61201361243e565b61201e823334613877565b905061203660015f8051602061520283398151915255565b919050565b6120436147b4565b5f8281525f80516020615222833981519152602052604090819020815160e0810190925280545f805160206151e2833981519152929190829060ff166005811115612090576120906149b4565b60058111156120a1576120a16149b4565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561214e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121759190810190614e86565b915091508061219757604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fe9190614ae9565b82511461221e5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561224a5760405163e6c4247b60e01b815260040160405180910390fd5b5f806122598460400151613b3b565b9150915081871461227d57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615222833981519152602052604081206002015481905f805160206151e283398151915290600160801b90046001600160401b03166122cf8582613d16565b5f6122d987613edf565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123298a858b6123de565b6040518263ffffffff1660e01b81526004016123459190614b22565b6020604051808303815f875af1158015612361573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123859190614ae9565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612435613f54565b611b8f81613f9f565b5f8051602061520283398151915280546001190161246f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206151c283398151915290600160401b900461ffff90811690861610806124c9575061271061ffff8616115b156124e75760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612519576040516302336bad60e51b815260040160405180910390fd5b805483108061252b5750806001015483115b1561254957604051630103be3b60e21b815260040160405180910390fd5b825f61255482610b81565b90505f612561898361400d565b905060405180606001604052806125753390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061520283398151915255565b5f6126246147b4565b5f805160206151e28339815191525f61263c85612b4a565b90505f8061264d83604001516136d3565b91509150801561267057604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156126a1576126a16149b4565b60058111156126b2576126b26149b4565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612721576127216149b4565b14158015612742575060018151600581111561273f5761273f6149b4565b14155b156127605760405163a36c527f60e01b815260040160405180910390fd5b600381516005811115612775576127756149b4565b036127835760048152612788565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156127cd576127cd6149b4565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612881576128816149b4565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612940575f80fd5b505af1158015612952573d5f803e3d5ffd5b505050505050565b6119176001600160a01b038316826143f7565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff1660038111156129ba576129ba6149b4565b60038111156129cb576129cb6149b4565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612aa090600160a01b900461ffff1684614d88565b612aaa9190614b54565b905080856007015f8581526020019081526020015f205f828254612ace9190614d53565b909155505f9050612adf8284614f58565b9050612aef8560200151826128f4565b612b048560200151610c6087606001516114c8565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bae573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bd59190810190614e86565b9150915080612bf757604051636b2f19e960e01b815260040160405180910390fd5b815115612c175760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612c435760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612c6f57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612cbe57612c86816001614f58565b612c91906008614d88565b61ffff16868281518110612ca757612ca7614be7565b016020015160f81c901b9190911790600101612c72565b5061ffff811615612ce25760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612d3d57612cf9816003614f58565b612d04906008614d88565b63ffffffff1687612d16836002614d53565b81518110612d2657612d26614be7565b016020015160f81c901b9190911790600101612ce5565b5063ffffffff8116600414612d6557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612dba57612d7c81601f614f58565b612d87906008614d88565b88612d93836006614d53565b81518110612da357612da3614be7565b016020015160f81c901b9190911790600101612d68565b505f805b6008811015612e1957612dd2816007614f58565b612ddd906008614d88565b6001600160401b031689612df2836026614d53565b81518110612e0257612e02614be7565b016020015160f81c901b9190911790600101612dbe565b505f805b6008811015612e7857612e31816007614f58565b612e3c906008614d88565b6001600160401b03168a612e5183602e614d53565b81518110612e6157612e61614be7565b016020015160f81c901b9190911790600101612e1d565b5091989097509095509350505050565b5f8151602614612eab57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612efa57612ec2816001614f58565b612ecd906008614d88565b61ffff16848281518110612ee357612ee3614be7565b016020015160f81c901b9190911790600101612eae565b5061ffff811615612f1e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612f7957612f35816003614f58565b612f40906008614d88565b63ffffffff1685612f52836002614d53565b81518110612f6257612f62614be7565b016020015160f81c901b9190911790600101612f21565b5063ffffffff811615612f9f57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612ff457612fb681601f614f58565b612fc1906008614d88565b86612fcd836006614d53565b81518110612fdd57612fdd614be7565b016020015160f81c901b9190911790600101612fa2565b50949350505050565b60605f61300c83830184614ba2565b61301891506058614d88565b61302390605c614d53565b6001600160401b0381111561303a5761303a614c19565b6040519080825280601f01601f191660200182016040528015613064576020820181803683370190505b5090505f5b60208110156130b9578335816020811061308557613085614be7565b1a60f81b82828151811061309b5761309b614be7565b60200101906001600160f81b03191690815f1a905350600101613069565b505f5b602081101561311957836020013581602081106130db576130db614be7565b1a60f81b826130eb836020614d53565b815181106130fb576130fb614be7565b60200101906001600160f81b03191690815f1a9053506001016130bc565b505f5b600481101561317c57613130816003614f58565b61313b906008614d88565b6014901c60f81b8261314e836040614d53565b8151811061315e5761315e614be7565b60200101906001600160f81b03191690815f1a90535060010161311c565b505f61318e6060850160408601614b87565b60601b90505f5b60148110156131ee578181601481106131b0576131b0614be7565b1a60f81b836131c0836044614d53565b815181106131d0576131d0614be7565b60200101906001600160f81b03191690815f1a905350600101613195565b505f6131fd6060860186614ba2565b905090505f5b600481101561326857613217816003614f58565b613222906008614d88565b63ffffffff8316901c60f81b8461323a836058614d53565b8151811061324a5761324a614be7565b60200101906001600160f81b03191690815f1a905350600101613203565b505f5b6132786060870187614ba2565b905081101561348c575f61328d826058614d88565b61329890605c614d53565b90505f5b6020811015613323576132b26060890189614ba2565b848181106132c2576132c2614be7565b90506020028101906132d49190614bfb565b3581602081106132e6576132e6614be7565b1a60f81b866132f58385614d53565b8151811061330557613305614be7565b60200101906001600160f81b03191690815f1a90535060010161329c565b505f5b60088110156133d85761333a816007614f58565b613345906008614d88565b61335260608a018a614ba2565b8581811061336257613362614be7565b90506020028101906133749190614bfb565b61338590604081019060200161499b565b6001600160401b0316901c60f81b86826133a0856020614d53565b6133aa9190614d53565b815181106133ba576133ba614be7565b60200101906001600160f81b03191690815f1a905350600101613326565b505f5b6030811015613482576133f16060890189614ba2565b8481811061340157613401614be7565b90506020028101906134139190614bfb565b613421906040810190614f6b565b8281811061343157613431614be7565b9050013560f81c60f81b868284602861344a9190614d53565b6134549190614d53565b8151811061346457613464614be7565b60200101906001600160f81b03191690815f1a9053506001016133db565b505060010161326b565b5091949350505050565b61349e6147b4565b5f8281525f805160206152228339815191526020526040808220815160e0810190925280545f805160206151e283398151915293929190829060ff1660058111156134eb576134eb6149b4565b60058111156134fc576134fc6149b4565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561356e5761356e6149b4565b1461358c5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156135d0576135d06149b4565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61367c8582612287565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146136f757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137465761370e816001614f58565b613719906008614d88565b61ffff1685828151811061372f5761372f614be7565b016020015160f81c901b91909117906001016136fa565b5061ffff81161561376a5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137c557613781816003614f58565b61378c906008614d88565b63ffffffff168661379e836002614d53565b815181106137ae576137ae614be7565b016020015160f81c901b919091179060010161376d565b5063ffffffff81166003146137ed57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138425761380481601f614f58565b61380f906008614d88565b8761381b836006614d53565b8151811061382b5761382b614be7565b016020015160f81c901b91909117906001016137f0565b505f8660268151811061385757613857614be7565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206151c28339815191528161389084610b81565b90505f61389c8761203b565b90506138a7876128b9565b6138c457604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156138d9576138d96149b4565b146138f75760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516139089190614d9f565b905083600201600a9054906101000a90046001600160401b031682604001516139319190614fad565b6001600160401b0316816001600160401b0316111561396357604051630c192e7760e41b815260040160405180910390fd5b5f8061396f8a84612287565b915091505f8a8360405160200161399d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff19166001836003811115613a3057613a306149b4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613b5f57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613bae57613b76816001614f58565b613b81906008614d88565b61ffff16858281518110613b9757613b97614be7565b016020015160f81c901b9190911790600101613b62565b5061ffff811615613bd25760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613c2d57613be9816003614f58565b613bf4906008614d88565b63ffffffff1686613c06836002614d53565b81518110613c1657613c16614be7565b016020015160f81c901b9190911790600101613bd5565b5063ffffffff8116600514613c5557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613caa57613c6c81601f614f58565b613c77906008614d88565b87613c83836006614d53565b81518110613c9357613c93614be7565b016020015160f81c901b9190911790600101613c58565b505f805b6008811015613d0957613cc2816007614f58565b613ccd906008614d88565b6001600160401b031688613ce2836026614d53565b81518110613cf257613cf2614be7565b016020015160f81c901b9190911790600101613cae565b5090969095509350505050565b5f805160206151e28339815191525f6001600160401b038084169085161115613d4a57613d438385614a8b565b9050613d57565b613d548484614a8b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613db9575060018401548151613db5916001600160401b031690614d53565b8210155b15613ddf576001600160401b038316606082015281815260408101516020820152613dfe565b8281606001818151613df19190614d9f565b6001600160401b03169052505b6060810151613e0e906064614fad565b602082015160018601546001600160401b039290921691613e399190600160401b900460ff16614d88565b1015613e585760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613e739190614d53565b9052506040810180516001600160401b0387169190613e93908390614f58565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206152228339815191526020526040812060020180545f805160206151e28339815191529190600890613f2990600160401b90046001600160401b0316614fd8565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f9d57604051631afcd79f60e31b815260040160405180910390fd5b565b613fa7613f54565b613fb08161448e565b613fb86144a7565b611b8f60608201356080830135613fd560c0850160a0860161499b565b613fe560e0860160c08701614ff3565b613ff6610100870160e0880161500c565b61400861012088016101008901614b87565b6144b7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661405157604051637fab81e560e01b815260040160405180910390fd5b5f805160206151e283398151915242614070604086016020870161499b565b6001600160401b03161115806140aa575061408e6202a30042614d53565b61409e604086016020870161499b565b6001600160401b031610155b156140c75760405162d36c8560e81b815260040160405180910390fd5b60306140d66040860186614f6b565b90501415806140e457508335155b156141025760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561413257604051630eb0d31360e11b815260040160405180910390fd5b61413c835f613d16565b5f806141d56040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614180919061499b565b6001600160401b0316815260200161419b60408a018a614f6b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506145d8565b5f828152600686016020526040902091935091506141f38282615070565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614231908590600401614b22565b6020604051808303815f875af115801561424d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142719190614ae9565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156142e9576142e96149b4565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916143c9918e01908e0161499b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561441e5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614467576040519150601f19603f3d011682016040523d82523d5f602084013e61446c565b606091505b505090508061200557604051630a12f52160e11b815260040160405180910390fd5b614496613f54565b61449e61469b565b611b8f816146a3565b6144af613f54565b613f9d614775565b6144bf613f54565b5f805160206151c283398151915261ffff841615806144e3575061271061ffff8516115b156145015760405163c98d73a760e01b815260040160405180910390fd5b8587111561452257604051630103be3b60e21b815260040160405180910390fd5b60ff831615806145355750600a60ff8416115b15614553576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461460157604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614633979695949392919061512b565b60405160208183030381529060405290506002816040516146549190614d42565b602060405180830381855afa15801561466f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906146929190614ae9565b94909350915050565b613f9d613f54565b6146ab613f54565b80355f805160206151e283398151915290815560146146d0606084016040850161500c565b60ff1611806146ef57506146ea606083016040840161500c565b60ff16155b1561470d5760405163b4fa3fb360e01b815260040160405180910390fd5b61471d606083016040840161500c565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561474e604083016020840161499b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612608613f54565b50805461478990614dbf565b5f825580601f10614798575050565b601f0160209004905f5260205f2090810190611b8f91906147f0565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614804575f81556001016147f1565b5090565b8015158114611b8f575f80fd5b803563ffffffff81168114612036575f80fd5b5f805f6060848603121561483a575f80fd5b83359250602084013561484c81614808565b915061485a60408501614815565b90509250925092565b5f60208284031215614873575f80fd5b5035919050565b5f610120828403121561488b575f80fd5b50919050565b803561ffff81168114612036575f80fd5b80356001600160401b0381168114612036575f80fd5b5f805f606084860312156148ca575f80fd5b83356001600160401b038111156148df575f80fd5b8401606081870312156148f0575f80fd5b92506148fe60208501614891565b915061485a604085016148a2565b5f6020828403121561491c575f80fd5b610bc482614815565b5f8060408385031215614936575f80fd5b61493f83614815565b946020939093013593505050565b5f806040838503121561495e575f80fd5b82356001600160401b03811115614973575f80fd5b830160808186031215614984575f80fd5b915061499260208401614815565b90509250929050565b5f602082840312156149ab575f80fd5b610bc4826148a2565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106149eb57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614a2660608401826001600160401b03169052565b506080830151614a4160808401826001600160401b03169052565b5060a0830151614a5c60a08401826001600160401b03169052565b5060c0830151612c4360c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612c4357612c43614a77565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614af9575f80fd5b5051919050565b5f5b83811015614b1a578181015183820152602001614b02565b50505f910152565b602081525f8251806020840152614b40816040850160208701614b00565b601f01601f19169190910160400192915050565b5f82614b6e57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114611b8f575f80fd5b5f60208284031215614b97575f80fd5b8135610bc481614b73565b5f808335601e19843603018112614bb7575f80fd5b8301803591506001600160401b03821115614bd0575f80fd5b6020019150600581901b36038213156123d7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614c0f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614c4f57614c4f614c19565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c7d57614c7d614c19565b604052919050565b5f6001600160401b03821115614c9d57614c9d614c19565b50601f01601f191660200190565b5f60608236031215614cbb575f80fd5b614cc3614c2d565b823581526020614cd48185016148a2565b8183015260408401356001600160401b03811115614cf0575f80fd5b840136601f820112614d00575f80fd5b8035614d13614d0e82614c85565b614c55565b8181523684838501011115614d26575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614c0f818460208701614b00565b80820180821115610b9157610b91614a77565b5f63ffffffff808316818103614d7e57614d7e614a77565b6001019392505050565b8082028115828204841417610b9157610b91614a77565b6001600160401b03818116838216019080821115612c4357612c43614a77565b600181811c90821680614dd357607f821691505b60208210810361488b57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614e0381614dbf565b806020870152604060018084165f8114614e245760018114614e4057614e6d565b60ff19851660408a0152604084151560051b8a01019550614e6d565b895f5260205f205f5b85811015614e645781548b8201860152908301908801614e49565b8a016040019650505b509398975050505050505050565b805161203681614808565b5f8060408385031215614e97575f80fd5b82516001600160401b0380821115614ead575f80fd5b9084019060608287031215614ec0575f80fd5b614ec8614c2d565b82518152602080840151614edb81614b73565b82820152604084015183811115614ef0575f80fd5b80850194505087601f850112614f04575f80fd5b83519250614f14614d0e84614c85565b8381528882858701011115614f27575f80fd5b614f3684838301848801614b00565b80604084015250819550614f4b818801614e7b565b9450505050509250929050565b81810381811115610b9157610b91614a77565b5f808335601e19843603018112614f80575f80fd5b8301803591506001600160401b03821115614f99575f80fd5b6020019150368190038213156123d7575f80fd5b6001600160401b03818116838216028082169190828114614fd057614fd0614a77565b505092915050565b5f6001600160401b03808316818103614d7e57614d7e614a77565b5f60208284031215615003575f80fd5b610bc482614891565b5f6020828403121561501c575f80fd5b813560ff81168114610bc4575f80fd5b601f82111561200557805f5260205f20601f840160051c810160208510156150515750805b601f840160051c820191505b81811015610c65575f815560010161505d565b81516001600160401b0381111561508957615089614c19565b61509d816150978454614dbf565b8461502c565b602080601f8311600181146150d0575f84156150b95750858301515b5f19600386901b1c1916600185901b178555612952565b5f85815260208120601f198616915b828110156150fe578886015182559484019460019091019084016150df565b508582101561511b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161518081604e860160208901614b00565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b50604051614ff3380380614ff383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614ea68061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd3660046144be565b610561565b005b3480156101df575f80fd5b506101d26101ee3660046144f9565b61090f565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d2610238366004614510565b610a81565b348015610248575f80fd5b5061025c6102573660046144f9565b610b5e565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc36600461454e565b610b74565b604051908152602001610215565b3480156102fa575f80fd5b506101d26103093660046145a2565b610ba8565b348015610319575f80fd5b506101d26103283660046145bb565b610c49565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d26103703660046145e3565b610f0a565b348015610380575f80fd5b506102e161038f366004614631565b61138e565b34801561039f575f80fd5b5061025c6103ae3660046144f9565b6113a7565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e03660046144be565b6113bb565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d26104133660046144f9565b6115ad565b348015610423575f80fd5b506101d26104323660046145bb565b611668565b348015610442575f80fd5b506101d26104513660046145a2565b61182f565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a3660046144f9565b6119a1565b34801561049a575f80fd5b506101d26104a93660046144f9565b611b7d565b6102e16104bc3660046144f9565b611ca7565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef3660046144f9565b611cd8565b604051610215919061465e565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e16105313660046144f9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614dfa8339815191526020526040808220815160e0810190925280545f80516020614e1a83398151915293929190829060ff1660038111156105ae576105ae61464a565b60038111156105bf576105bf61464a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611cd8565b905060028351600381111561064c5761064c61464a565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b6003815160058111156106ac576106ac61464a565b036106ca5760405163a36c527f60e01b815260040160405180910390fd5b5f878152600585810160205260408220805460ff1916600317905582518291600291908111156106fc576106fc61464a565b03610775578715610714576107118488611da0565b91505b5f856060015184608001516107299190614721565b90506107358582611f24565b505f8b8152600589016020526040902060020180546001600160401b03909216600160c01b026001600160c01b03909216919091179055504290506107c6565b50505f82815260088501602090815260408083205460608501518b855260058901909352922060020180546001600160c01b0316600160c01b6001600160401b039384160217905560c08301519116905b600386015460608601516001600160a01b039091169063778c06b5906107eb9061138e565b60a086015160808901516040516001600160e01b031960e086901b16815260048101939093526001600160401b039182166024840152811660448301528085166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610862573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108869190614741565b5f8a81526006880160205260409020556004835160058111156108ab576108ab61464a565b036108c4576108b98961207b565b505050505050505050565b6040516001600160401b038216815284908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699060200160405180910390a3505050505050505050565b5f8181525f80516020614e7a8339815191526020526040808220815160e0810190925280545f80516020614e3a83398151915293929190829060ff16600581111561095c5761095c61464a565b600581111561096d5761096d61464a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109dc576109dc61464a565b146109fa5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a1f8584606001515f612256565b6040518263ffffffff1660e01b8152600401610a3b919061477a565b6020604051808303815f875af1158015610a57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7b9190614741565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aca575080546001600160401b03808416911610155b15610ae85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b12836122a5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b6e64e8d4a51000836147ac565b92915050565b5f610b7d6122b9565b610b89848484346122f0565b9050610ba160015f80516020614e5a83398151915255565b9392505050565b5f80516020614e1a8339815191525f80610bc184612496565b91509150610bce82612734565b610bd85750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c0757610c0761464a565b03610c2c575f83815260078501602052604081208054919055610c2a828261276f565b505b610c4281610c3d846040015161138e565b6127cd565b5050505050565b5f8181525f80516020614dfa8339815191526020526040808220815160e0810190925280545f80516020614e1a83398151915293929190829060ff166003811115610c9657610c9661464a565b6003811115610ca757610ca761464a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610d1d82611cd8565b9050600183516003811115610d3457610d3461464a565b14610d525760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610d6757610d6761464a565b03610d7d57610d758561207b565b505050505050565b5f600382516005811115610d9357610d9361464a565b03610dde575060608101515f868152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905560c0810151610e7c565b5f610de8886127e0565b90505f80610df983604001516128e0565b5091509150818614610e1e57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031685606001516001600160401b03161080610e575750806001600160401b03168760a001516001600160401b0316115b15610e7557604051633ab3447f60e11b815260040160405180910390fd5b4293505050505b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b038516600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252849188917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f691015b60405180910390a350505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614e3a8339815191529060ff1615610f5c57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc39190614741565b836020013514610fe65760405163d040949d60e01b815260040160405180910390fd5b30610ff760608501604086016147df565b6001600160a01b03161461101e5760405163e6c4247b60e01b815260040160405180910390fd5b5f61102c60608501856147fa565b905090505f805b828163ffffffff1610156112d8575f61104f60608801886147fa565b8363ffffffff168181106110655761106561483f565b90506020028101906110779190614853565b61108090614903565b80515f81815260088801602052604090205491925090156110b457604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f0135856040516020016110e392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526110fd9161499a565b602060405180830381855afa158015611118573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061113b9190614741565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156111c7576111c761464a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161127a9116866149ab565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112d1906149be565b9050611033565b50600483018190555f6112ea856127e0565b90505f6112fa8260400151612b1e565b90505f61130688612c93565b905081600282604051611319919061499a565b602060405180830381855afa158015611334573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113579190614741565b1461137557604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610b6e6001600160401b03831664e8d4a510006149e0565b5f6113b182611cd8565b6080015192915050565b5f80516020614e1a8339815191525f6113d38561312c565b90506113de85612734565b6113e9575050505050565b5f8581526004830160205260409020546001600160a01b031633146114215760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161145091600160b01b90046001600160401b0316906149f7565b6001600160401b03168160c001516001600160401b03161015611486576040516302336bad60e51b815260040160405180910390fd5b8315610c42575f6114978685611da0565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906114e79061138e565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561155d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115819190614741565b5f878152600785016020526040812080549091906115a09084906149ab565b9091555050505050505050565b5f80516020614e1a8339815191525f6115c583611cd8565b90506004815160058111156115dc576115dc61464a565b146115fa5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146116325760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610a7b906001600160a01b03168261276f565b6116706122b9565b5f8181525f80516020614dfa8339815191526020526040808220815160e0810190925280545f80516020614e1a83398151915293929190829060ff1660038111156116bd576116bd61464a565b60038111156116ce576116ce61464a565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156117475761174761464a565b146117655760405163f95c7fe160e01b815260040160405180910390fd5b60046117748260400151611cd8565b5160058111156117865761178661464a565b1461180a575f611795856127e0565b90505f806117a683604001516128e0565b5091509150818460400151146117cf57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561180657604051633ab3447f60e11b815260040160405180910390fd5b5050505b6118138361207b565b505061182b60015f80516020614e5a83398151915255565b5050565b5f80516020614e3a8339815191525f611847836127e0565b90505f806118588360400151613369565b915091508061187a57604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461189490614a17565b90505f036118b557604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156118db576118db61464a565b146118f95760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061191191614413565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614dfa8339815191526020526040808220815160e0810190925280545f80516020614e1a83398151915293929190829060ff1660038111156119ee576119ee61464a565b60038111156119ff576119ff61464a565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a7857611a7861464a565b14158015611a995750600381516003811115611a9657611a9661464a565b14155b15611ab75760405163f95c7fe160e01b815260040160405180910390fd5b5f611ac58260400151611cd8565b905080606001516001600160401b03165f03611af457604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611b21846040015184606001518560800151612256565b6040518263ffffffff1660e01b8152600401611b3d919061477a565b6020604051808303815f875af1158015611b59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c429190614741565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614e3a8339815191529190611bc490614a17565b90505f03611be557604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611c0b57611c0b61464a565b14611c295760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c629190600401614a49565b6020604051808303815f875af1158015611c7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ca29190614741565b505050565b5f611cb06122b9565b611cbb82333461350d565b9050611cd360015f80516020614e5a83398151915255565b919050565b611ce061444a565b5f8281525f80516020614e7a833981519152602052604090819020815160e0810190925280545f80516020614e3a833981519152929190829060ff166005811115611d2d57611d2d61464a565b6005811115611d3e57611d3e61464a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611deb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e129190810190614ade565b9150915080611e3457604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e9b9190614741565b825114611ebb5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611ee75760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ef684604001516137d1565b91509150818714611f1a57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e7a833981519152602052604081206002015481905f80516020614e3a83398151915290600160801b90046001600160401b0316611f6c85826139ac565b5f611f7687613b75565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611fc68a858b612256565b6040518263ffffffff1660e01b8152600401611fe2919061477a565b6020604051808303815f875af1158015611ffe573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120229190614741565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f80516020614dfa8339815191526020526040808220815160e0810190925280545f80516020614e1a83398151915293929190829060ff1660038111156120c8576120c861464a565b60038111156120d9576120d961464a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612207575f848152600487016020526040902054612710906121b990600160a01b900461ffff16856149e0565b6121c391906147ac565b915081866007015f8681526020019081526020015f205f8282546121e791906149ab565b909155506121f790508284614bb0565b905061220785602001518261276f565b61221c8560200151610c3d876060015161138e565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc9939101610ef9565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6122ad613bea565b6122b681613c35565b50565b5f80516020614e5a8339815191528054600119016122ea57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614e1a83398151915290600160401b900461ffff9081169086161080612344575061271061ffff8616115b156123625760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612394576040516302336bad60e51b815260040160405180910390fd5b80548310806123a65750806001015483115b156123c457604051630103be3b60e21b815260040160405180910390fd5b825f6123cf82610b5e565b90505f6123dc8983613ca3565b905060405180606001604052806123f03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e5a83398151915255565b5f61249f61444a565b5f80516020614e3a8339815191525f6124b7856127e0565b90505f806124c88360400151613369565b9150915080156124eb57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561251c5761251c61464a565b600581111561252d5761252d61464a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561259c5761259c61464a565b141580156125bd57506001815160058111156125ba576125ba61464a565b14155b156125db5760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156125f0576125f061464a565b036125fe5760048152612603565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156126485761264861464a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156126fc576126fc61464a565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156127bb575f80fd5b505af1158015610d75573d5f803e3d5ffd5b61182b6001600160a01b0383168261408d565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612844573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261286b9190810190614ade565b915091508061288d57604051636b2f19e960e01b815260040160405180910390fd5b8151156128ad5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156128d95760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461290557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129545761291c816001614bb0565b6129279060086149e0565b61ffff1686828151811061293d5761293d61483f565b016020015160f81c901b9190911790600101612908565b5061ffff8116156129785760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156129d35761298f816003614bb0565b61299a9060086149e0565b63ffffffff16876129ac8360026149ab565b815181106129bc576129bc61483f565b016020015160f81c901b919091179060010161297b565b5063ffffffff81166004146129fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a5057612a1281601f614bb0565b612a1d9060086149e0565b88612a298360066149ab565b81518110612a3957612a3961483f565b016020015160f81c901b91909117906001016129fe565b505f805b6008811015612aaf57612a68816007614bb0565b612a739060086149e0565b6001600160401b031689612a888360266149ab565b81518110612a9857612a9861483f565b016020015160f81c901b9190911790600101612a54565b505f805b6008811015612b0e57612ac7816007614bb0565b612ad29060086149e0565b6001600160401b03168a612ae783602e6149ab565b81518110612af757612af761483f565b016020015160f81c901b9190911790600101612ab3565b5091989097509095509350505050565b5f8151602614612b4157604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b9057612b58816001614bb0565b612b639060086149e0565b61ffff16848281518110612b7957612b7961483f565b016020015160f81c901b9190911790600101612b44565b5061ffff811615612bb45760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612c0f57612bcb816003614bb0565b612bd69060086149e0565b63ffffffff1685612be88360026149ab565b81518110612bf857612bf861483f565b016020015160f81c901b9190911790600101612bb7565b5063ffffffff811615612c3557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c8a57612c4c81601f614bb0565b612c579060086149e0565b86612c638360066149ab565b81518110612c7357612c7361483f565b016020015160f81c901b9190911790600101612c38565b50949350505050565b60605f612ca2838301846147fa565b612cae915060586149e0565b612cb990605c6149ab565b6001600160401b03811115612cd057612cd0614871565b6040519080825280601f01601f191660200182016040528015612cfa576020820181803683370190505b5090505f5b6020811015612d4f5783358160208110612d1b57612d1b61483f565b1a60f81b828281518110612d3157612d3161483f565b60200101906001600160f81b03191690815f1a905350600101612cff565b505f5b6020811015612daf5783602001358160208110612d7157612d7161483f565b1a60f81b82612d818360206149ab565b81518110612d9157612d9161483f565b60200101906001600160f81b03191690815f1a905350600101612d52565b505f5b6004811015612e1257612dc6816003614bb0565b612dd19060086149e0565b6014901c60f81b82612de48360406149ab565b81518110612df457612df461483f565b60200101906001600160f81b03191690815f1a905350600101612db2565b505f612e2460608501604086016147df565b60601b90505f5b6014811015612e8457818160148110612e4657612e4661483f565b1a60f81b83612e568360446149ab565b81518110612e6657612e6661483f565b60200101906001600160f81b03191690815f1a905350600101612e2b565b505f612e9360608601866147fa565b905090505f5b6004811015612efe57612ead816003614bb0565b612eb89060086149e0565b63ffffffff8316901c60f81b84612ed08360586149ab565b81518110612ee057612ee061483f565b60200101906001600160f81b03191690815f1a905350600101612e99565b505f5b612f0e60608701876147fa565b9050811015613122575f612f238260586149e0565b612f2e90605c6149ab565b90505f5b6020811015612fb957612f4860608901896147fa565b84818110612f5857612f5861483f565b9050602002810190612f6a9190614853565b358160208110612f7c57612f7c61483f565b1a60f81b86612f8b83856149ab565b81518110612f9b57612f9b61483f565b60200101906001600160f81b03191690815f1a905350600101612f32565b505f5b600881101561306e57612fd0816007614bb0565b612fdb9060086149e0565b612fe860608a018a6147fa565b85818110612ff857612ff861483f565b905060200281019061300a9190614853565b61301b906040810190602001614631565b6001600160401b0316901c60f81b86826130368560206149ab565b61304091906149ab565b815181106130505761305061483f565b60200101906001600160f81b03191690815f1a905350600101612fbc565b505f5b60308110156131185761308760608901896147fa565b848181106130975761309761483f565b90506020028101906130a99190614853565b6130b7906040810190614bc3565b828181106130c7576130c761483f565b9050013560f81c60f81b86828460286130e091906149ab565b6130ea91906149ab565b815181106130fa576130fa61483f565b60200101906001600160f81b03191690815f1a905350600101613071565b5050600101612f01565b5091949350505050565b61313461444a565b5f8281525f80516020614e7a8339815191526020526040808220815160e0810190925280545f80516020614e3a83398151915293929190829060ff1660058111156131815761318161464a565b60058111156131925761319261464a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156132045761320461464a565b146132225760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156132665761326661464a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133128582611f24565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461338d57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133dc576133a4816001614bb0565b6133af9060086149e0565b61ffff168582815181106133c5576133c561483f565b016020015160f81c901b9190911790600101613390565b5061ffff8116156134005760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561345b57613417816003614bb0565b6134229060086149e0565b63ffffffff16866134348360026149ab565b815181106134445761344461483f565b016020015160f81c901b9190911790600101613403565b5063ffffffff811660031461348357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134d85761349a81601f614bb0565b6134a59060086149e0565b876134b18360066149ab565b815181106134c1576134c161483f565b016020015160f81c901b9190911790600101613486565b505f866026815181106134ed576134ed61483f565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614e1a8339815191528161352684610b5e565b90505f61353287611cd8565b905061353d87612734565b61355a57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561356f5761356f61464a565b1461358d5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161359e91906149f7565b905083600201600a9054906101000a90046001600160401b031682604001516135c79190614c05565b6001600160401b0316816001600160401b031611156135f957604051630c192e7760e41b815260040160405180910390fd5b5f806136058a84611f24565b915091505f8a8360405160200161363392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156136c6576136c661464a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146137f557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156138445761380c816001614bb0565b6138179060086149e0565b61ffff1685828151811061382d5761382d61483f565b016020015160f81c901b91909117906001016137f8565b5061ffff8116156138685760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156138c35761387f816003614bb0565b61388a9060086149e0565b63ffffffff168661389c8360026149ab565b815181106138ac576138ac61483f565b016020015160f81c901b919091179060010161386b565b5063ffffffff81166005146138eb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139405761390281601f614bb0565b61390d9060086149e0565b876139198360066149ab565b815181106139295761392961483f565b016020015160f81c901b91909117906001016138ee565b505f805b600881101561399f57613958816007614bb0565b6139639060086149e0565b6001600160401b0316886139788360266149ab565b815181106139885761398861483f565b016020015160f81c901b9190911790600101613944565b5090969095509350505050565b5f80516020614e3a8339815191525f6001600160401b0380841690851611156139e0576139d98385614721565b90506139ed565b6139ea8484614721565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a4f575060018401548151613a4b916001600160401b0316906149ab565b8210155b15613a75576001600160401b038316606082015281815260408101516020820152613a94565b8281606001818151613a8791906149f7565b6001600160401b03169052505b6060810151613aa4906064614c05565b602082015160018601546001600160401b039290921691613acf9190600160401b900460ff166149e0565b1015613aee5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613b0991906149ab565b9052506040810180516001600160401b0387169190613b29908390614bb0565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e7a8339815191526020526040812060020180545f80516020614e3a8339815191529190600890613bbf90600160401b90046001600160401b0316614c30565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c3357604051631afcd79f60e31b815260040160405180910390fd5b565b613c3d613bea565b613c4681614124565b613c4e61413d565b6122b660608201356080830135613c6b60c0850160a08601614631565b613c7b60e0860160c08701614c4b565b613c8c610100870160e08801614c64565b613c9e610120880161010089016147df565b61414d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ce757604051637fab81e560e01b815260040160405180910390fd5b5f80516020614e3a83398151915242613d066040860160208701614631565b6001600160401b0316111580613d405750613d246202a300426149ab565b613d346040860160208701614631565b6001600160401b031610155b15613d5d5760405162d36c8560e81b815260040160405180910390fd5b6030613d6c6040860186614bc3565b9050141580613d7a57508335155b15613d985760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613dc857604051630eb0d31360e11b815260040160405180910390fd5b613dd2835f6139ac565b5f80613e6b6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e169190614631565b6001600160401b03168152602001613e3160408a018a614bc3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061426e565b5f82815260068601602052604090209193509150613e898282614cc8565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613ec790859060040161477a565b6020604051808303815f875af1158015613ee3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f079190614741565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613f7f57613f7f61464a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161405f918e01908e01614631565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156140b45760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146140fd576040519150601f19603f3d011682016040523d82523d5f602084013e614102565b606091505b5050905080611ca257604051630a12f52160e11b815260040160405180910390fd5b61412c613bea565b614134614331565b6122b681614339565b614145613bea565b613c3361440b565b614155613bea565b5f80516020614e1a83398151915261ffff84161580614179575061271061ffff8516115b156141975760405163c98d73a760e01b815260040160405180910390fd5b858711156141b857604051630103be3b60e21b815260040160405180910390fd5b60ff831615806141cb5750600a60ff8416115b156141e9576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461429757604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016142c99796959493929190614d83565b60405160208183030381529060405290506002816040516142ea919061499a565b602060405180830381855afa158015614305573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143289190614741565b94909350915050565b613c33613bea565b614341613bea565b80355f80516020614e3a83398151915290815560146143666060840160408501614c64565b60ff16118061438557506143806060830160408401614c64565b60ff16155b156143a35760405163b4fa3fb360e01b815260040160405180910390fd5b6143b36060830160408401614c64565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556143e46040830160208401614631565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612483613bea565b50805461441f90614a17565b5f825580601f1061442e575050565b601f0160209004905f5260205f20908101906122b69190614486565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561449a575f8155600101614487565b5090565b80151581146122b6575f80fd5b803563ffffffff81168114611cd3575f80fd5b5f805f606084860312156144d0575f80fd5b8335925060208401356144e28161449e565b91506144f0604085016144ab565b90509250925092565b5f60208284031215614509575f80fd5b5035919050565b5f6101208284031215614521575f80fd5b50919050565b803561ffff81168114611cd3575f80fd5b80356001600160401b0381168114611cd3575f80fd5b5f805f60608486031215614560575f80fd5b83356001600160401b03811115614575575f80fd5b840160608187031215614586575f80fd5b925061459460208501614527565b91506144f060408501614538565b5f602082840312156145b2575f80fd5b610ba1826144ab565b5f80604083850312156145cc575f80fd5b6145d5836144ab565b946020939093013593505050565b5f80604083850312156145f4575f80fd5b82356001600160401b03811115614609575f80fd5b83016080818603121561461a575f80fd5b9150614628602084016144ab565b90509250929050565b5f60208284031215614641575f80fd5b610ba182614538565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061468157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516146bc60608401826001600160401b03169052565b5060808301516146d760808401826001600160401b03169052565b5060a08301516146f260a08401826001600160401b03169052565b5060c08301516128d960c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156128d9576128d961470d565b5f60208284031215614751575f80fd5b5051919050565b5f5b8381101561477257818101518382015260200161475a565b50505f910152565b602081525f8251806020840152614798816040850160208701614758565b601f01601f19169190910160400192915050565b5f826147c657634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03811681146122b6575f80fd5b5f602082840312156147ef575f80fd5b8135610ba1816147cb565b5f808335601e1984360301811261480f575f80fd5b8301803591506001600160401b03821115614828575f80fd5b6020019150600581901b3603821315612074575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614867575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156148a7576148a7614871565b60405290565b604051601f8201601f191681016001600160401b03811182821017156148d5576148d5614871565b604052919050565b5f6001600160401b038211156148f5576148f5614871565b50601f01601f191660200190565b5f60608236031215614913575f80fd5b61491b614885565b82358152602061492c818501614538565b8183015260408401356001600160401b03811115614948575f80fd5b840136601f820112614958575f80fd5b803561496b614966826148dd565b6148ad565b818152368483850101111561497e575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614867818460208701614758565b80820180821115610b6e57610b6e61470d565b5f63ffffffff8083168181036149d6576149d661470d565b6001019392505050565b8082028115828204841417610b6e57610b6e61470d565b6001600160401b038181168382160190808211156128d9576128d961470d565b600181811c90821680614a2b57607f821691505b60208210810361452157634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614a5b81614a17565b806020870152604060018084165f8114614a7c5760018114614a9857614ac5565b60ff19851660408a0152604084151560051b8a01019550614ac5565b895f5260205f205f5b85811015614abc5781548b8201860152908301908801614aa1565b8a016040019650505b509398975050505050505050565b8051611cd38161449e565b5f8060408385031215614aef575f80fd5b82516001600160401b0380821115614b05575f80fd5b9084019060608287031215614b18575f80fd5b614b20614885565b82518152602080840151614b33816147cb565b82820152604084015183811115614b48575f80fd5b80850194505087601f850112614b5c575f80fd5b83519250614b6c614966846148dd565b8381528882858701011115614b7f575f80fd5b614b8e84838301848801614758565b80604084015250819550614ba3818801614ad3565b9450505050509250929050565b81810381811115610b6e57610b6e61470d565b5f808335601e19843603018112614bd8575f80fd5b8301803591506001600160401b03821115614bf1575f80fd5b602001915036819003821315612074575f80fd5b6001600160401b03818116838216028082169190828114614c2857614c2861470d565b505092915050565b5f6001600160401b038083168181036149d6576149d661470d565b5f60208284031215614c5b575f80fd5b610ba182614527565b5f60208284031215614c74575f80fd5b813560ff81168114610ba1575f80fd5b601f821115611ca257805f5260205f20601f840160051c81016020851015614ca95750805b601f840160051c820191505b81811015610c42575f8155600101614cb5565b81516001600160401b03811115614ce157614ce1614871565b614cf581614cef8454614a17565b84614c84565b602080601f831160018114614d28575f8415614d115750858301515b5f19600386901b1c1916600185901b178555610d75565b5f85815260208120601f198616915b82811015614d5657888601518255948401946001909101908401614d37565b5085821015614d7357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614dd881604e860160208901614758565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -792,27 +792,6 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) Co return _NativeTokenStakingManager.Contract.CompleteValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, messageIndex) } -// EndDelegationCompletedValidator is a paid mutator transaction binding the contract method 0x9dde029a. -// -// Solidity: function endDelegationCompletedValidator(bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) EndDelegationCompletedValidator(opts *bind.TransactOpts, delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.contract.Transact(opts, "endDelegationCompletedValidator", delegationID) -} - -// EndDelegationCompletedValidator is a paid mutator transaction binding the contract method 0x9dde029a. -// -// Solidity: function endDelegationCompletedValidator(bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) EndDelegationCompletedValidator(delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.EndDelegationCompletedValidator(&_NativeTokenStakingManager.TransactOpts, delegationID) -} - -// EndDelegationCompletedValidator is a paid mutator transaction binding the contract method 0x9dde029a. -// -// Solidity: function endDelegationCompletedValidator(bytes32 delegationID) returns() -func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) EndDelegationCompletedValidator(delegationID [32]byte) (*types.Transaction, error) { - return _NativeTokenStakingManager.Contract.EndDelegationCompletedValidator(&_NativeTokenStakingManager.TransactOpts, delegationID) -} - // Initialize is a paid mutator transaction binding the contract method 0x20e55565. // // Solidity: function initialize(((bytes32,uint64,uint8),uint256,uint256,uint64,uint16,uint8,address) settings) returns() @@ -1394,15 +1373,14 @@ func (it *NativeTokenStakingManagerDelegatorRegisteredIterator) Close() error { type NativeTokenStakingManagerDelegatorRegistered struct { DelegationID [32]byte ValidationID [32]byte - Nonce uint64 StartTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. +// FilterDelegatorRegistered is a free log retrieval operation binding the contract event 0x047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6. // -// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRegistered(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*NativeTokenStakingManagerDelegatorRegisteredIterator, error) { var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { @@ -1412,22 +1390,18 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule) if err != nil { return nil, err } return &NativeTokenStakingManagerDelegatorRegisteredIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRegistered", logs: logs, sub: sub}, nil } -// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. +// WatchDelegatorRegistered is a free log subscription operation binding the contract event 0x047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6. // -// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte, nonce []uint64) (event.Subscription, error) { +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 startTime) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRegistered(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRegistered, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { var delegationIDRule []interface{} for _, delegationIDItem := range delegationID { @@ -1437,12 +1411,8 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega for _, validationIDItem := range validationID { validationIDRule = append(validationIDRule, validationIDItem) } - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule, nonceRule) + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "DelegatorRegistered", delegationIDRule, validationIDRule) if err != nil { return nil, err } @@ -1474,9 +1444,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorRegistered is a log parse operation binding the contract event 0x245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064. +// ParseDelegatorRegistered is a log parse operation binding the contract event 0x047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6. // -// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce, uint256 startTime) +// Solidity: event DelegatorRegistered(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 startTime) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRegistered(log types.Log) (*NativeTokenStakingManagerDelegatorRegistered, error) { event := new(NativeTokenStakingManagerDelegatorRegistered) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRegistered", log); err != nil { diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index ba51178f3..618f6346b 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -357,112 +357,63 @@ abstract contract PoSValidatorManager is PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; + bytes32 validationID = delegator.validationID; Validator memory validator = getValidator(delegator.validationID); // Ensure the delegator is pending added. Since anybody can call this function once // delegator registration has been initialized, we need to make sure that this function is only // callable after that has been done. - if ($._delegatorStakes[delegationID].status != DelegatorStatus.PendingAdded) { + if (delegator.status != DelegatorStatus.PendingAdded) { revert InvalidDelegatorStatus(); } + // In the case where the validator has completed its validation period, we can no + // longer stake and should move our status directly to completed and return the stake. + if (validator.status == ValidatorStatus.Completed) { + return _completeEndDelegation(delegationID); + } + // In the case where the validator has initiated ending its validation period, we can no // longer stake, but the validator's weight may not have been removed from the p-chain yet, // so we have to wait for confirmation that the validator has been removed before returning the stake. + uint64 delegatorStartTime; if (validator.status == ValidatorStatus.PendingRemoved) { - delegator.status = DelegatorStatus.PendingRemoved; - delegator.startedAt = validator.endedAt; - delegator.endingNonce = validator.messageNonce; - - // Write back the delegator - $._delegatorStakes[delegationID] = delegator; - - emit DelegatorRemovalInitialized({ - delegationID: delegationID, - validationID: delegator.validationID, - endTime: validator.endedAt - }); - - return; - } + $._delegatorStakes[delegationID].endingNonce = validator.messageNonce; + delegatorStartTime = validator.endedAt; + } else { + // Validator Active case - // In the case where the validator has completed its validation period, we can no - // longer stake and should move our status directly to completed and return the stake. - if (validator.status == ValidatorStatus.Completed) { - _completeEndDelegation(delegationID); - return; - } + // Unpack the Warp message + WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); + (bytes32 messageValidationID, uint64 nonce,) = + ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - // Unpack the Warp message - WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); - (bytes32 validationID, uint64 nonce,) = - ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); + if (validationID != messageValidationID) { + revert InvalidValidationID(); + } - if (delegator.validationID != validationID) { - revert InvalidValidationID(); - } + // The received nonce should be no greater than the highest sent nonce, and at least as high as + // the delegation's starting nonce. This allows a weight update using a higher nonce + // (which implicitly includes the delegation's weight update) to be used to complete delisting + // for an earlier delegation. This is necessary because the P-Chain is only willing to sign the latest weight update. + if (validator.messageNonce < nonce || delegator.startingNonce > nonce) { + revert InvalidNonce(); + } - // The received nonce should be no greater than the highest sent nonce, and at least as high as - // the delegation's starting nonce. This allows a weight update using a higher nonce - // (which implicitly includes the delegation's weight update) to be used to complete delisting - // for an earlier delegation. This is necessary because the P-Chain is only willing to sign the latest weight update. - if ( - validator.messageNonce < nonce || $._delegatorStakes[delegationID].startingNonce > nonce - ) { - revert InvalidNonce(); + delegatorStartTime = uint64(block.timestamp); } // Update the delegation status $._delegatorStakes[delegationID].status = DelegatorStatus.Active; - $._delegatorStakes[delegationID].startedAt = uint64(block.timestamp); + $._delegatorStakes[delegationID].startedAt = delegatorStartTime; emit DelegatorRegistered({ delegationID: delegationID, validationID: validationID, - nonce: nonce, - startTime: block.timestamp + startTime: delegatorStartTime }); } - function endDelegationCompletedValidator(bytes32 delegationID) external nonReentrant { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - - Delegator memory delegator = $._delegatorStakes[delegationID]; - bytes32 validationID = delegator.validationID; - Validator memory validator = getValidator(validationID); - - // Ensure the delegation is found - if (delegator.status == DelegatorStatus.Unknown) { - revert InvalidDelegationID(); - } - - // Ensure the validation is completed - if (validator.status != ValidatorStatus.Completed) { - revert InvalidValidatorStatus(); - } - - // If the validator completes before the delegator is added, let them exit from here. - if (delegator.status == DelegatorStatus.PendingAdded) { - _completeEndDelegation(delegationID); - return; - } - - // Calculate and set rewards if the delegator is active. - if (delegator.status == DelegatorStatus.Active) { - $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward({ - stakeAmount: weightToValue(delegator.weight), - validatorStartTime: validator.startedAt, - stakingStartTime: delegator.startedAt, - stakingEndTime: validator.endedAt, - uptimeSeconds: $._completedValidationUptimeSeconds[validationID], - initialSupply: 0, - endSupply: 0 - }); - } - - _completeEndDelegation(delegationID); - } - function initializeEndDelegation( bytes32 delegationID, bool includeUptimeProof, @@ -482,11 +433,15 @@ abstract contract PoSValidatorManager is if (delegator.owner != _msgSender()) { revert InvalidAddress(); } + // Delegators may not initiate removal when the validator's state is pending. + if (validator.status == ValidatorStatus.PendingRemoved) { + revert InvalidValidatorStatus(); + } // Set the delegator status to pending removed, so that it can be properly removed in // the complete step, even if the delivered nonce is greater than the nonce used to // initialize the removal. - delegator.status = DelegatorStatus.PendingRemoved; + $._delegatorStakes[delegationID].status = DelegatorStatus.PendingRemoved; uint64 validatorUptimeSeconds; uint64 delegationEndTime; @@ -496,7 +451,8 @@ abstract contract PoSValidatorManager is validatorUptimeSeconds = _getUptime(validationID, messageIndex); } uint64 newValidatorWeight = validator.weight - delegator.weight; - (delegator.endingNonce,) = _setValidatorWeight(validationID, newValidatorWeight); + ($._delegatorStakes[delegationID].endingNonce,) = + _setValidatorWeight(validationID, newValidatorWeight); delegationEndTime = uint64(block.timestamp); } else { @@ -505,7 +461,7 @@ abstract contract PoSValidatorManager is // so there's no need to check any uptime proof provided in this function call. validatorUptimeSeconds = $._completedValidationUptimeSeconds[validationID]; - delegator.endingNonce = validator.messageNonce; + $._delegatorStakes[delegationID].endingNonce = validator.messageNonce; delegationEndTime = validator.endedAt; } @@ -519,7 +475,11 @@ abstract contract PoSValidatorManager is endSupply: 0 }); - $._delegatorStakes[delegationID] = delegator; + // If the validator has been completed, we don't need any more communication with the p-chain and we can + // complete processing the delegator's state now. + if (validator.status == ValidatorStatus.Completed) { + return _completeEndDelegation(delegationID); + } emit DelegatorRemovalInitialized({ delegationID: delegationID, @@ -562,23 +522,6 @@ abstract contract PoSValidatorManager is PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; - // Unpack the Warp message - WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); - (bytes32 validationID, uint64 nonce,) = - ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - - if (delegator.validationID != validationID) { - revert InvalidValidationID(); - } - - // The received nonce should be at least as high as the delegation's ending nonce. This allows a weight - // update using a higher nonce (which implicitly includes the delegation's weight update) to be used to - // complete delisting for an earlier delegation. This is necessary because the P-Chain is only willing - // to sign the latest weight update. - if (delegator.endingNonce > nonce) { - revert InvalidNonce(); - } - // Ensure the delegator is pending removed. Since anybody can call this function once // end delegation has been initialized, we need to make sure that this function is only // callable after that has been done. @@ -586,6 +529,25 @@ abstract contract PoSValidatorManager is revert InvalidDelegatorStatus(); } + if (getValidator(delegator.validationID).status != ValidatorStatus.Completed) { + // Unpack the Warp message + WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); + (bytes32 validationID, uint64 nonce,) = + ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); + + if (delegator.validationID != validationID) { + revert InvalidValidationID(); + } + + // The received nonce should be at least as high as the delegation's ending nonce. This allows a weight + // update using a higher nonce (which implicitly includes the delegation's weight update) to be used to + // complete delisting for an earlier delegation. This is necessary because the P-Chain is only willing + // to sign the latest weight update. + if (delegator.endingNonce > nonce) { + revert InvalidNonce(); + } + } + _completeEndDelegation(delegationID); } @@ -601,15 +563,18 @@ abstract contract PoSValidatorManager is uint256 rewards = $._redeemableDelegatorRewards[delegationID]; delete $._redeemableDelegatorRewards[delegationID]; - uint256 validatorFees = - rewards * $._posValidatorInfo[validationID].delegationFeeBips / 10000; + uint256 validatorFees; + uint256 delegatorRewards; + if (rewards > 0) { + validatorFees = rewards * $._posValidatorInfo[validationID].delegationFeeBips / 10000; - // Allocate the delegation fees to the validator. - $._redeemableValidatorRewards[validationID] += validatorFees; + // Allocate the delegation fees to the validator. + $._redeemableValidatorRewards[validationID] += validatorFees; - // Reward the remaining tokens to the delegator. - uint256 delegatorRewards = rewards - validatorFees; - _reward(delegator.owner, delegatorRewards); + // Reward the remaining tokens to the delegator. + delegatorRewards = rewards - validatorFees; + _reward(delegator.owner, delegatorRewards); + } // Unlock the delegator's stake. _unlock(delegator.owner, weightToValue(delegator.weight)); diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index ca9ba291b..40e9970f7 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -67,14 +67,10 @@ interface IPoSValidatorManager is IValidatorManager { * @notice Event emitted when a delegator registration is completed * @param delegationID The ID of the delegation * @param validationID The ID of the validation period - * @param nonce The message nonce used to update the validator weight, as returned by the P-Chain * @param startTime The time at which the registration was completed */ event DelegatorRegistered( - bytes32 indexed delegationID, - bytes32 indexed validationID, - uint64 indexed nonce, - uint256 startTime + bytes32 indexed delegationID, bytes32 indexed validationID, uint256 startTime ); /** @@ -127,15 +123,6 @@ interface IPoSValidatorManager is IValidatorManager { */ function completeDelegatorRegistration(uint32 messageIndex, bytes32 delegationID) external; - /** - * @notice Removes a delegator from a completed validation period. The delegator can be in either the pending added, active - * or pending removed state. No uptime proof is required in this case, because it will have been provided by the validator - * upon their exit. - * Note that this function can be called by any address to clean up the delegation. - * @param delegationID The ID of the delegation being removed. - */ - function endDelegationCompletedValidator(bytes32 delegationID) external; - /** * @notice Begins the process of removing a delegator from a validation period. The delegator must have been previously * registered with the given validationID. For the purposes of computing delegation rewards, the delegation period is diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index f4dbfc027..79dcd2def 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -52,10 +52,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); event DelegatorRegistered( - bytes32 indexed delegationID, - bytes32 indexed validationID, - uint64 indexed nonce, - uint256 startTime + bytes32 indexed delegationID, bytes32 indexed validationID, uint256 startTime ); event DelegatorRemovalInitialized( @@ -878,7 +875,6 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { emit DelegatorRegistered({ delegationID: delegationID, validationID: validationID, - nonce: expectedNonce, startTime: completeRegistrationTimestamp }); posValidatorManager.completeDelegatorRegistration(0, delegationID); From 8aa030e9d485e6817017009a7c237228f0ac3ec9 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 24 Sep 2024 14:31:09 -0400 Subject: [PATCH 403/545] Remove unneeded line --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index fb8a8e256..2f41057c6 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516152e73803806152e783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61519a8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b3366004614719565b61040d565b005b6101b86101c8366004614754565b6107bb565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004614754565b61092d565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b861024136600461476b565b610943565b6101b8610254366004614784565b6109e4565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b86102843660046147ac565b610ca5565b61029c610297366004614810565b611129565b6040519081526020016101e3565b6101ff6102b8366004614754565b611142565b61029c5f81565b6101b86102d2366004614719565b611156565b6101d5603081565b6101b86102ed366004614754565b611348565b6101b8610300366004614784565b611403565b61029c610313366004614829565b6115ca565b6101b861032636600461476b565b6115f6565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004614754565b611768565b6101b8610372366004614754565b611944565b6101d5601481565b61039261038d366004614754565b611a6e565b6040516101e3919061485d565b6101ff6202a30081565b61029c6103b7366004614754565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f536600461491d565b611b36565b6101b8610408366004614996565b611b6b565b5f8381525f805160206150ce8339815191526020526040808220815160e0810190925280545f8051602061510e83398151915293929190829060ff16600381111561045a5761045a614849565b600381111561046b5761046b614849565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e182611a6e565b90506002835160038111156104f8576104f8614849565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b60038151600581111561055857610558614849565b036105765760405163a36c527f60e01b815260040160405180910390fd5b5f878152600585810160205260408220805460ff1916600317905582518291600291908111156105a8576105a8614849565b036106215787156105c0576105bd8488611c4a565b91505b5f856060015184608001516105d591906149e8565b90506105e18582611dce565b505f8b8152600589016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905550429050610672565b50505f82815260088501602090815260408083205460608501518b855260058901909352922060020180546001600160c01b0316600160c01b6001600160401b039384160217905560c08301519116905b600386015460608601516001600160a01b039091169063778c06b59061069790611129565b60a086015160808901516040516001600160e01b031960e086901b16815260048101939093526001600160401b039182166024840152811660448301528085166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561070e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107329190614a08565b5f8a815260068801602052604090205560048351600581111561075757610757614849565b036107705761076589611f25565b505050505050505050565b6040516001600160401b038216815284908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699060200160405180910390a3505050505050505050565b5f8181525f8051602061516e8339815191526020526040808220815160e0810190925280545f8051602061512e83398151915293929190829060ff16600581111561080857610808614849565b600581111561081957610819614849565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561088857610888614849565b146108a65760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6108cb8584606001515f612100565b6040518263ffffffff1660e01b81526004016108e79190614a41565b6020604051808303815f875af1158015610903573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109279190614a08565b50505050565b5f61093d64e8d4a5100083614a73565b92915050565b5f8051602061510e8339815191525f8061095c84612157565b91509150610969826123f5565b6109735750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156109a2576109a2614849565b036109c7575f838152600785016020526040812080549190556109c58282612430565b505b6109dd816109d88460400151611129565b6124a6565b5050505050565b5f8181525f805160206150ce8339815191526020526040808220815160e0810190925280545f8051602061510e83398151915293929190829060ff166003811115610a3157610a31614849565b6003811115610a4257610a42614849565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ab882611a6e565b9050600183516003811115610acf57610acf614849565b14610aed5760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610b0257610b02614849565b03610b1857610b1085611f25565b505050505050565b5f600382516005811115610b2e57610b2e614849565b03610b79575060608101515f868152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905560c0810151610c17565b5f610b83886124c9565b90505f80610b9483604001516125c9565b5091509150818614610bb957604051636990657d60e01b815260040160405180910390fd5b806001600160401b031685606001516001600160401b03161080610bf25750806001600160401b03168760a001516001600160401b0316115b15610c1057604051633ab3447f60e11b815260040160405180910390fd5b4293505050505b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b038516600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252849188917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f691015b60405180910390a350505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061512e8339815191529060ff1615610cf757604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d5e9190614a08565b836020013514610d815760405163d040949d60e01b815260040160405180910390fd5b30610d926060850160408601614a92565b6001600160a01b031614610db95760405163e6c4247b60e01b815260040160405180910390fd5b5f610dc76060850185614aad565b905090505f805b828163ffffffff161015611073575f610dea6060880188614aad565b8363ffffffff16818110610e0057610e00614af2565b9050602002810190610e129190614b06565b610e1b90614bb6565b80515f8181526008880160205260409020549192509015610e4f57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610e7e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610e9891614c4d565b602060405180830381855afa158015610eb3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ed69190614a08565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610f6257610f62614849565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611015911686614c5e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061106c90614c71565b9050610dce565b50600483018190555f611085856124c9565b90505f6110958260400151612807565b90505f6110a18861297c565b9050816002826040516110b49190614c4d565b602060405180830381855afa1580156110cf573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110f29190614a08565b1461111057604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61093d6001600160401b03831664e8d4a51000614c93565b5f61114c82611a6e565b6080015192915050565b5f8051602061510e8339815191525f61116e85612e15565b9050611179856123f5565b611184575050505050565b5f8581526004830160205260409020546001600160a01b031633146111bc5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516111eb91600160b01b90046001600160401b031690614caa565b6001600160401b03168160c001516001600160401b03161015611221576040516302336bad60e51b815260040160405180910390fd5b83156109dd575f6112328685611c4a565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061128290611129565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156112f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061131c9190614a08565b5f8781526007850160205260408120805490919061133b908490614c5e565b9091555050505050505050565b5f8051602061510e8339815191525f61136083611a6e565b905060048151600581111561137757611377614849565b146113955760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146113cd5760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610927906001600160a01b031682612430565b61140b613052565b5f8181525f805160206150ce8339815191526020526040808220815160e0810190925280545f8051602061510e83398151915293929190829060ff16600381111561145857611458614849565b600381111561146957611469614849565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156114e2576114e2614849565b146115005760405163f95c7fe160e01b815260040160405180910390fd5b600461150f8260400151611a6e565b51600581111561152157611521614849565b146115a5575f611530856124c9565b90505f8061154183604001516125c9565b50915091508184604001511461156a57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156115a157604051633ab3447f60e11b815260040160405180910390fd5b5050505b6115ae83611f25565b50506115c660015f8051602061514e83398151915255565b5050565b5f6115d3613052565b6115de83338461309c565b905061093d60015f8051602061514e83398151915255565b5f8051602061512e8339815191525f61160e836124c9565b90505f8061161f8360400151613363565b915091508061164157604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461165b90614cca565b90505f0361167c57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156116a2576116a2614849565b146116c05760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206116d891614669565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206150ce8339815191526020526040808220815160e0810190925280545f8051602061510e83398151915293929190829060ff1660038111156117b5576117b5614849565b60038111156117c6576117c6614849565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561183f5761183f614849565b14158015611860575060038151600381111561185d5761185d614849565b14155b1561187e5760405163f95c7fe160e01b815260040160405180910390fd5b5f61188c8260400151611a6e565b905080606001516001600160401b03165f036118bb57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6118e8846040015184606001518560800151612100565b6040518263ffffffff1660e01b81526004016119049190614a41565b6020604051808303815f875af1158015611920573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109dd9190614a08565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061512e833981519152919061198b90614cca565b90505f036119ac57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff1660058111156119d2576119d2614849565b146119f05760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611a299190600401614d02565b6020604051808303815f875af1158015611a45573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a699190614a08565b505050565b611a766146a0565b5f8281525f8051602061516e833981519152602052604090819020815160e0810190925280545f8051602061512e833981519152929190829060ff166005811115611ac357611ac3614849565b6005811115611ad457611ad4614849565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611b3f613052565b611b4b85858585613507565b9050611b6360015f8051602061514e83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611bb4575080546001600160401b03808416911610155b15611bd25760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611bfd84846136a5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c95573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cbc9190810190614d97565b9150915080611cde57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d21573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d459190614a08565b825114611d655760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d915760405163e6c4247b60e01b815260040160405180910390fd5b5f80611da084604001516136bf565b91509150818714611dc457604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f8051602061516e833981519152602052604081206002015481905f8051602061512e83398151915290600160801b90046001600160401b0316611e16858261389a565b5f611e2087613a63565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e708a858b612100565b6040518263ffffffff1660e01b8152600401611e8c9190614a41565b6020604051808303815f875af1158015611ea8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ecc9190614a08565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f805160206150ce8339815191526020526040808220815160e0810190925280545f8051602061510e83398151915293929190829060ff166003811115611f7257611f72614849565b6003811115611f8357611f83614849565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156120b1575f8481526004870160205260409020546127109061206390600160a01b900461ffff1685614c93565b61206d9190614a73565b915081866007015f8681526020019081526020015f205f8282546120919190614c5e565b909155506120a190508284614e69565b90506120b1856020015182612430565b6120c685602001516109d88760600151611129565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc9939101610c94565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6121606146a0565b5f8051602061512e8339815191525f612178856124c9565b90505f806121898360400151613363565b9150915080156121ac57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156121dd576121dd614849565b60058111156121ee576121ee614849565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561225d5761225d614849565b1415801561227e575060018151600581111561227b5761227b614849565b14155b1561229c5760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156122b1576122b1614849565b036122bf57600481526122c4565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561230957612309614849565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156123bd576123bd614849565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206150ee83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561248b575f80fd5b505af115801561249d573d5f803e3d5ffd5b50505050505050565b5f805160206150ee833981519152546115c6906001600160a01b03168383613ad8565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561252d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125549190810190614d97565b915091508061257657604051636b2f19e960e01b815260040160405180910390fd5b8151156125965760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156125c25760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146125ee57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561263d57612605816001614e69565b612610906008614c93565b61ffff1686828151811061262657612626614af2565b016020015160f81c901b91909117906001016125f1565b5061ffff8116156126615760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156126bc57612678816003614e69565b612683906008614c93565b63ffffffff1687612695836002614c5e565b815181106126a5576126a5614af2565b016020015160f81c901b9190911790600101612664565b5063ffffffff81166004146126e457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612739576126fb81601f614e69565b612706906008614c93565b88612712836006614c5e565b8151811061272257612722614af2565b016020015160f81c901b91909117906001016126e7565b505f805b600881101561279857612751816007614e69565b61275c906008614c93565b6001600160401b031689612771836026614c5e565b8151811061278157612781614af2565b016020015160f81c901b919091179060010161273d565b505f805b60088110156127f7576127b0816007614e69565b6127bb906008614c93565b6001600160401b03168a6127d083602e614c5e565b815181106127e0576127e0614af2565b016020015160f81c901b919091179060010161279c565b5091989097509095509350505050565b5f815160261461282a57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561287957612841816001614e69565b61284c906008614c93565b61ffff1684828151811061286257612862614af2565b016020015160f81c901b919091179060010161282d565b5061ffff81161561289d5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156128f8576128b4816003614e69565b6128bf906008614c93565b63ffffffff16856128d1836002614c5e565b815181106128e1576128e1614af2565b016020015160f81c901b91909117906001016128a0565b5063ffffffff81161561291e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156129735761293581601f614e69565b612940906008614c93565b8661294c836006614c5e565b8151811061295c5761295c614af2565b016020015160f81c901b9190911790600101612921565b50949350505050565b60605f61298b83830184614aad565b61299791506058614c93565b6129a290605c614c5e565b6001600160401b038111156129b9576129b9614b24565b6040519080825280601f01601f1916602001820160405280156129e3576020820181803683370190505b5090505f5b6020811015612a385783358160208110612a0457612a04614af2565b1a60f81b828281518110612a1a57612a1a614af2565b60200101906001600160f81b03191690815f1a9053506001016129e8565b505f5b6020811015612a985783602001358160208110612a5a57612a5a614af2565b1a60f81b82612a6a836020614c5e565b81518110612a7a57612a7a614af2565b60200101906001600160f81b03191690815f1a905350600101612a3b565b505f5b6004811015612afb57612aaf816003614e69565b612aba906008614c93565b6014901c60f81b82612acd836040614c5e565b81518110612add57612add614af2565b60200101906001600160f81b03191690815f1a905350600101612a9b565b505f612b0d6060850160408601614a92565b60601b90505f5b6014811015612b6d57818160148110612b2f57612b2f614af2565b1a60f81b83612b3f836044614c5e565b81518110612b4f57612b4f614af2565b60200101906001600160f81b03191690815f1a905350600101612b14565b505f612b7c6060860186614aad565b905090505f5b6004811015612be757612b96816003614e69565b612ba1906008614c93565b63ffffffff8316901c60f81b84612bb9836058614c5e565b81518110612bc957612bc9614af2565b60200101906001600160f81b03191690815f1a905350600101612b82565b505f5b612bf76060870187614aad565b9050811015612e0b575f612c0c826058614c93565b612c1790605c614c5e565b90505f5b6020811015612ca257612c316060890189614aad565b84818110612c4157612c41614af2565b9050602002810190612c539190614b06565b358160208110612c6557612c65614af2565b1a60f81b86612c748385614c5e565b81518110612c8457612c84614af2565b60200101906001600160f81b03191690815f1a905350600101612c1b565b505f5b6008811015612d5757612cb9816007614e69565b612cc4906008614c93565b612cd160608a018a614aad565b85818110612ce157612ce1614af2565b9050602002810190612cf39190614b06565b612d04906040810190602001614810565b6001600160401b0316901c60f81b8682612d1f856020614c5e565b612d299190614c5e565b81518110612d3957612d39614af2565b60200101906001600160f81b03191690815f1a905350600101612ca5565b505f5b6030811015612e0157612d706060890189614aad565b84818110612d8057612d80614af2565b9050602002810190612d929190614b06565b612da0906040810190614e7c565b82818110612db057612db0614af2565b9050013560f81c60f81b8682846028612dc99190614c5e565b612dd39190614c5e565b81518110612de357612de3614af2565b60200101906001600160f81b03191690815f1a905350600101612d5a565b5050600101612bea565b5091949350505050565b612e1d6146a0565b5f8281525f8051602061516e8339815191526020526040808220815160e0810190925280545f8051602061512e83398151915293929190829060ff166005811115612e6a57612e6a614849565b6005811115612e7b57612e7b614849565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612eed57612eed614849565b14612f0b5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612f4f57612f4f614849565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612ffb8582611dce565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061514e83398151915280546001190161308357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061514e83398151915255565b5f5f8051602061510e833981519152816130b86101fa85613b37565b90505f6130c487611a6e565b90506130cf876123f5565b6130ec57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561310157613101614849565b1461311f5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516131309190614caa565b905083600201600a9054906101000a90046001600160401b031682604001516131599190614ebe565b6001600160401b0316816001600160401b0316111561318b57604051630c192e7760e41b815260040160405180910390fd5b5f806131978a84611dce565b915091505f8a836040516020016131c592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561325857613258614849565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461338757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133d65761339e816001614e69565b6133a9906008614c93565b61ffff168582815181106133bf576133bf614af2565b016020015160f81c901b919091179060010161338a565b5061ffff8116156133fa5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561345557613411816003614e69565b61341c906008614c93565b63ffffffff168661342e836002614c5e565b8151811061343e5761343e614af2565b016020015160f81c901b91909117906001016133fd565b5063ffffffff811660031461347d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134d25761349481601f614e69565b61349f906008614c93565b876134ab836006614c5e565b815181106134bb576134bb614af2565b016020015160f81c901b9190911790600101613480565b505f866026815181106134e7576134e7614af2565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061510e83398151915290600160401b900461ffff908116908616108061355b575061271061ffff8616115b156135795760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156135ab576040516302336bad60e51b815260040160405180910390fd5b80548310806135bd5750806001015483115b156135db57604051630103be3b60e21b815260040160405180910390fd5b5f6135e584613b37565b90505f6135f18261092d565b90505f6135fe8983613b5a565b905060405180606001604052806136123390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6136ad613f44565b6136b682613f8f565b6115c681614000565b5f808251602e146136e357604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613732576136fa816001614e69565b613705906008614c93565b61ffff1685828151811061371b5761371b614af2565b016020015160f81c901b91909117906001016136e6565b5061ffff8116156137565760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137b15761376d816003614e69565b613778906008614c93565b63ffffffff168661378a836002614c5e565b8151811061379a5761379a614af2565b016020015160f81c901b9190911790600101613759565b5063ffffffff81166005146137d957604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561382e576137f081601f614e69565b6137fb906008614c93565b87613807836006614c5e565b8151811061381757613817614af2565b016020015160f81c901b91909117906001016137dc565b505f805b600881101561388d57613846816007614e69565b613851906008614c93565b6001600160401b031688613866836026614c5e565b8151811061387657613876614af2565b016020015160f81c901b9190911790600101613832565b5090969095509350505050565b5f8051602061512e8339815191525f6001600160401b0380841690851611156138ce576138c783856149e8565b90506138db565b6138d884846149e8565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061393d575060018401548151613939916001600160401b031690614c5e565b8210155b15613963576001600160401b038316606082015281815260408101516020820152613982565b82816060018181516139759190614caa565b6001600160401b03169052505b6060810151613992906064614ebe565b602082015160018601546001600160401b0392909216916139bd9190600160401b900460ff16614c93565b10156139dc5760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516139f79190614c5e565b9052506040810180516001600160401b0387169190613a17908390614e69565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061516e8339815191526020526040812060020180545f8051602061512e8339815191529190600890613aad90600160401b90046001600160401b0316614ee9565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b03838116602483015260448201839052611a6991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061405d565b5f61093d825f805160206150ee833981519152546001600160a01b0316906140c3565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613b9e57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061512e83398151915242613bbd6040860160208701614810565b6001600160401b0316111580613bf75750613bdb6202a30042614c5e565b613beb6040860160208701614810565b6001600160401b031610155b15613c145760405162d36c8560e81b815260040160405180910390fd5b6030613c236040860186614e7c565b9050141580613c3157508335155b15613c4f5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613c7f57604051630eb0d31360e11b815260040160405180910390fd5b613c89835f61389a565b5f80613d226040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ccd9190614810565b6001600160401b03168152602001613ce860408a018a614e7c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614225565b5f82815260068601602052604090209193509150613d408282614f48565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613d7e908590600401614a41565b6020604051808303815f875af1158015613d9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dbe9190614a08565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e3657613e36614849565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f16918e01908e01614810565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f8d57604051631afcd79f60e31b815260040160405180910390fd5b565b613f97613f44565b613fa0816142e8565b613fa8614301565b613ffd60608201356080830135613fc560c0850160a08601614810565b613fd560e0860160c08701615003565b613fe6610100870160e0880161501c565b613ff861012088016101008901614a92565b614311565b50565b614008613f44565b5f805160206150ee8339815191526001600160a01b03821661403d5760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6140716001600160a01b03841683614432565b905080515f14158015614095575080806020019051810190614093919061503c565b155b15611a6957604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614109573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061412d9190614a08565b90506141446001600160a01b03851633308661443f565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614188573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141ac9190614a08565b90508181116142125760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016140ba565b61421c8282614e69565b95945050505050565b5f606082608001515160301461424e57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016142809796959493929190615057565b60405160208183030381529060405290506002816040516142a19190614c4d565b602060405180830381855afa1580156142bc573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142df9190614a08565b94909350915050565b6142f0613f44565b6142f8614478565b613ffd81614480565b614309613f44565b613f8d614552565b614319613f44565b5f8051602061510e83398151915261ffff8416158061433d575061271061ffff8516115b1561435b5760405163c98d73a760e01b815260040160405180910390fd5b8587111561437c57604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061438f5750600a60ff8416115b156143ad576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061215083835f61455a565b6040516001600160a01b0384811660248301528381166044830152606482018390526109279186918216906323b872dd90608401613b05565b613f8d613f44565b614488613f44565b80355f8051602061512e83398151915290815560146144ad606084016040850161501c565b60ff1611806144cc57506144c7606083016040840161501c565b60ff16155b156144ea5760405163b4fa3fb360e01b815260040160405180910390fd5b6144fa606083016040840161501c565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561452b6040830160208401614810565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613089613f44565b60608147101561457f5760405163cd78605960e01b81523060048201526024016140ba565b5f80856001600160a01b0316848660405161459a9190614c4d565b5f6040518083038185875af1925050503d805f81146145d4576040519150601f19603f3d011682016040523d82523d5f602084013e6145d9565b606091505b5091509150611dc48683836060826145f9576145f482614640565b612150565b815115801561461057506001600160a01b0384163b155b1561463957604051639996b31560e01b81526001600160a01b03851660048201526024016140ba565b5080612150565b8051156146505780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461467590614cca565b5f825580601f10614684575050565b601f0160209004905f5260205f2090810190613ffd91906146dc565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156146f0575f81556001016146dd565b5090565b8015158114613ffd575f80fd5b803563ffffffff81168114614714575f80fd5b919050565b5f805f6060848603121561472b575f80fd5b83359250602084013561473d816146f4565b915061474b60408501614701565b90509250925092565b5f60208284031215614764575f80fd5b5035919050565b5f6020828403121561477b575f80fd5b61215082614701565b5f8060408385031215614795575f80fd5b61479e83614701565b946020939093013593505050565b5f80604083850312156147bd575f80fd5b82356001600160401b038111156147d2575f80fd5b8301608081860312156147e3575f80fd5b91506147f160208401614701565b90509250929050565b80356001600160401b0381168114614714575f80fd5b5f60208284031215614820575f80fd5b612150826147fa565b5f806040838503121561483a575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061488057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516148bb60608401826001600160401b03169052565b5060808301516148d660808401826001600160401b03169052565b5060a08301516148f160a08401826001600160401b03169052565b5060c08301516125c260c08401826001600160401b03169052565b803561ffff81168114614714575f80fd5b5f805f8060808587031215614930575f80fd5b84356001600160401b03811115614945575f80fd5b850160608188031215614956575f80fd5b93506149646020860161490c565b9250614972604086016147fa565b9396929550929360600135925050565b6001600160a01b0381168114613ffd575f80fd5b5f808284036101408112156149a9575f80fd5b610120808212156149b8575f80fd5b84935083013590506149c981614982565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156125c2576125c26149d4565b5f60208284031215614a18575f80fd5b5051919050565b5f5b83811015614a39578181015183820152602001614a21565b50505f910152565b602081525f8251806020840152614a5f816040850160208701614a1f565b601f01601f19169190910160400192915050565b5f82614a8d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614aa2575f80fd5b813561215081614982565b5f808335601e19843603018112614ac2575f80fd5b8301803591506001600160401b03821115614adb575f80fd5b6020019150600581901b3603821315611f1e575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614b1a575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b5a57614b5a614b24565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b8857614b88614b24565b604052919050565b5f6001600160401b03821115614ba857614ba8614b24565b50601f01601f191660200190565b5f60608236031215614bc6575f80fd5b614bce614b38565b823581526020614bdf8185016147fa565b8183015260408401356001600160401b03811115614bfb575f80fd5b840136601f820112614c0b575f80fd5b8035614c1e614c1982614b90565b614b60565b8181523684838501011115614c31575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614b1a818460208701614a1f565b8082018082111561093d5761093d6149d4565b5f63ffffffff808316818103614c8957614c896149d4565b6001019392505050565b808202811582820484141761093d5761093d6149d4565b6001600160401b038181168382160190808211156125c2576125c26149d4565b600181811c90821680614cde57607f821691505b602082108103614cfc57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614d1481614cca565b806020870152604060018084165f8114614d355760018114614d5157614d7e565b60ff19851660408a0152604084151560051b8a01019550614d7e565b895f5260205f205f5b85811015614d755781548b8201860152908301908801614d5a565b8a016040019650505b509398975050505050505050565b8051614714816146f4565b5f8060408385031215614da8575f80fd5b82516001600160401b0380821115614dbe575f80fd5b9084019060608287031215614dd1575f80fd5b614dd9614b38565b82518152602080840151614dec81614982565b82820152604084015183811115614e01575f80fd5b80850194505087601f850112614e15575f80fd5b83519250614e25614c1984614b90565b8381528882858701011115614e38575f80fd5b614e4784838301848801614a1f565b80604084015250819550614e5c818801614d8c565b9450505050509250929050565b8181038181111561093d5761093d6149d4565b5f808335601e19843603018112614e91575f80fd5b8301803591506001600160401b03821115614eaa575f80fd5b602001915036819003821315611f1e575f80fd5b6001600160401b03818116838216028082169190828114614ee157614ee16149d4565b505092915050565b5f6001600160401b03808316818103614c8957614c896149d4565b601f821115611a6957805f5260205f20601f840160051c81016020851015614f295750805b601f840160051c820191505b818110156109dd575f8155600101614f35565b81516001600160401b03811115614f6157614f61614b24565b614f7581614f6f8454614cca565b84614f04565b602080601f831160018114614fa8575f8415614f915750858301515b5f19600386901b1c1916600185901b178555610b10565b5f85815260208120601f198616915b82811015614fd657888601518255948401946001909101908401614fb7565b5085821015614ff357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215615013575f80fd5b6121508261490c565b5f6020828403121561502c575f80fd5b813560ff81168114612150575f80fd5b5f6020828403121561504c575f80fd5b8151612150816146f4565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516150ac81604e860160208901614a1f565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516152ac3803806152ac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61515f8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b33660046146de565b61040d565b005b6101b86101c8366004614719565b6107bb565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004614719565b61092d565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b8610241366004614730565b610943565b6101b8610254366004614749565b6109e4565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b8610284366004614771565b610c6a565b61029c6102973660046147d5565b6110ee565b6040519081526020016101e3565b6101ff6102b8366004614719565b611107565b61029c5f81565b6101b86102d23660046146de565b61111b565b6101d5603081565b6101b86102ed366004614719565b61130d565b6101b8610300366004614749565b6113c8565b61029c6103133660046147ee565b61158f565b6101b8610326366004614730565b6115bb565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004614719565b61172d565b6101b8610372366004614719565b611909565b6101d5601481565b61039261038d366004614719565b611a33565b6040516101e39190614822565b6101ff6202a30081565b61029c6103b7366004614719565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f53660046148e2565b611afb565b6101b861040836600461495b565b611b30565b5f8381525f805160206150938339815191526020526040808220815160e0810190925280545f805160206150d383398151915293929190829060ff16600381111561045a5761045a61480e565b600381111561046b5761046b61480e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e182611a33565b90506002835160038111156104f8576104f861480e565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b6003815160058111156105585761055861480e565b036105765760405163a36c527f60e01b815260040160405180910390fd5b5f878152600585810160205260408220805460ff1916600317905582518291600291908111156105a8576105a861480e565b036106215787156105c0576105bd8488611c0f565b91505b5f856060015184608001516105d591906149ad565b90506105e18582611d93565b505f8b8152600589016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905550429050610672565b50505f82815260088501602090815260408083205460608501518b855260058901909352922060020180546001600160c01b0316600160c01b6001600160401b039384160217905560c08301519116905b600386015460608601516001600160a01b039091169063778c06b590610697906110ee565b60a086015160808901516040516001600160e01b031960e086901b16815260048101939093526001600160401b039182166024840152811660448301528085166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561070e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073291906149cd565b5f8a81526006880160205260409020556004835160058111156107575761075761480e565b036107705761076589611eea565b505050505050505050565b6040516001600160401b038216815284908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699060200160405180910390a3505050505050505050565b5f8181525f805160206151338339815191526020526040808220815160e0810190925280545f805160206150f383398151915293929190829060ff1660058111156108085761080861480e565b60058111156108195761081961480e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108885761088861480e565b146108a65760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6108cb8584606001515f6120c5565b6040518263ffffffff1660e01b81526004016108e79190614a06565b6020604051808303815f875af1158015610903573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092791906149cd565b50505050565b5f61093d64e8d4a5100083614a38565b92915050565b5f805160206150d38339815191525f8061095c8461211c565b91509150610969826123ba565b6109735750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156109a2576109a261480e565b036109c7575f838152600785016020526040812080549190556109c582826123f5565b505b6109dd816109d884604001516110ee565b61246b565b5050505050565b5f8181525f805160206150938339815191526020526040808220815160e0810190925280545f805160206150d383398151915293929190829060ff166003811115610a3157610a3161480e565b6003811115610a4257610a4261480e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ab882611a33565b9050600183516003811115610acf57610acf61480e565b14610aed5760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610b0257610b0261480e565b03610b1857610b1085611eea565b505050505050565b5f600382516005811115610b2e57610b2e61480e565b03610b3e575060c0810151610bdc565b5f610b488861248e565b90505f80610b59836040015161258e565b5091509150818614610b7e57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031685606001516001600160401b03161080610bb75750806001600160401b03168760a001516001600160401b0316115b15610bd557604051633ab3447f60e11b815260040160405180910390fd5b4293505050505b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b038516600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252849188917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f691015b60405180910390a350505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206150f38339815191529060ff1615610cbc57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2391906149cd565b836020013514610d465760405163d040949d60e01b815260040160405180910390fd5b30610d576060850160408601614a57565b6001600160a01b031614610d7e5760405163e6c4247b60e01b815260040160405180910390fd5b5f610d8c6060850185614a72565b905090505f805b828163ffffffff161015611038575f610daf6060880188614a72565b8363ffffffff16818110610dc557610dc5614ab7565b9050602002810190610dd79190614acb565b610de090614b7b565b80515f8181526008880160205260409020549192509015610e1457604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610e4392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610e5d91614c12565b602060405180830381855afa158015610e78573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610e9b91906149cd565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610f2757610f2761480e565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610fda911686614c23565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061103190614c36565b9050610d93565b50600483018190555f61104a8561248e565b90505f61105a82604001516127cc565b90505f61106688612941565b9050816002826040516110799190614c12565b602060405180830381855afa158015611094573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110b791906149cd565b146110d557604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61093d6001600160401b03831664e8d4a51000614c58565b5f61111182611a33565b6080015192915050565b5f805160206150d38339815191525f61113385612dda565b905061113e856123ba565b611149575050505050565b5f8581526004830160205260409020546001600160a01b031633146111815760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516111b091600160b01b90046001600160401b031690614c6f565b6001600160401b03168160c001516001600160401b031610156111e6576040516302336bad60e51b815260040160405180910390fd5b83156109dd575f6111f78685611c0f565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b590611247906110ee565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156112bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e191906149cd565b5f87815260078501602052604081208054909190611300908490614c23565b9091555050505050505050565b5f805160206150d38339815191525f61132583611a33565b905060048151600581111561133c5761133c61480e565b1461135a5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146113925760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610927906001600160a01b0316826123f5565b6113d0613017565b5f8181525f805160206150938339815191526020526040808220815160e0810190925280545f805160206150d383398151915293929190829060ff16600381111561141d5761141d61480e565b600381111561142e5761142e61480e565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156114a7576114a761480e565b146114c55760405163f95c7fe160e01b815260040160405180910390fd5b60046114d48260400151611a33565b5160058111156114e6576114e661480e565b1461156a575f6114f58561248e565b90505f80611506836040015161258e565b50915091508184604001511461152f57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561156657604051633ab3447f60e11b815260040160405180910390fd5b5050505b61157383611eea565b505061158b60015f8051602061511383398151915255565b5050565b5f611598613017565b6115a3833384613061565b905061093d60015f8051602061511383398151915255565b5f805160206150f38339815191525f6115d38361248e565b90505f806115e48360400151613328565b915091508061160657604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461162090614c8f565b90505f0361164157604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156116675761166761480e565b146116855760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061169d9161462e565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206150938339815191526020526040808220815160e0810190925280545f805160206150d383398151915293929190829060ff16600381111561177a5761177a61480e565b600381111561178b5761178b61480e565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156118045761180461480e565b1415801561182557506003815160038111156118225761182261480e565b14155b156118435760405163f95c7fe160e01b815260040160405180910390fd5b5f6118518260400151611a33565b905080606001516001600160401b03165f0361188057604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6118ad8460400151846060015185608001516120c5565b6040518263ffffffff1660e01b81526004016118c99190614a06565b6020604051808303815f875af11580156118e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109dd91906149cd565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206150f3833981519152919061195090614c8f565b90505f0361197157604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff1660058111156119975761199761480e565b146119b55760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119ee9190600401614cc7565b6020604051808303815f875af1158015611a0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2e91906149cd565b505050565b611a3b614665565b5f8281525f80516020615133833981519152602052604090819020815160e0810190925280545f805160206150f3833981519152929190829060ff166005811115611a8857611a8861480e565b6005811115611a9957611a9961480e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611b04613017565b611b10858585856134cc565b9050611b2860015f8051602061511383398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611b79575080546001600160401b03808416911610155b15611b975760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611bc2848461366a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c5a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c819190810190614d5c565b9150915080611ca357604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0a91906149cd565b825114611d2a5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d565760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d658460400151613684565b91509150818714611d8957604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615133833981519152602052604081206002015481905f805160206150f383398151915290600160801b90046001600160401b0316611ddb858261385f565b5f611de587613a28565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e358a858b6120c5565b6040518263ffffffff1660e01b8152600401611e519190614a06565b6020604051808303815f875af1158015611e6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e9191906149cd565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f805160206150938339815191526020526040808220815160e0810190925280545f805160206150d383398151915293929190829060ff166003811115611f3757611f3761480e565b6003811115611f4857611f4861480e565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612076575f8481526004870160205260409020546127109061202890600160a01b900461ffff1685614c58565b6120329190614a38565b915081866007015f8681526020019081526020015f205f8282546120569190614c23565b9091555061206690508284614e2e565b90506120768560200151826123f5565b61208b85602001516109d887606001516110ee565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc9939101610c59565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f612125614665565b5f805160206150f38339815191525f61213d8561248e565b90505f8061214e8360400151613328565b91509150801561217157604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156121a2576121a261480e565b60058111156121b3576121b361480e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156122225761222261480e565b1415801561224357506001815160058111156122405761224061480e565b14155b156122615760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156122765761227661480e565b036122845760048152612289565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156122ce576122ce61480e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156123825761238261480e565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206150b383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612450575f80fd5b505af1158015612462573d5f803e3d5ffd5b50505050505050565b5f805160206150b38339815191525461158b906001600160a01b03168383613a9d565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156124f2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125199190810190614d5c565b915091508061253b57604051636b2f19e960e01b815260040160405180910390fd5b81511561255b5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156125875760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146125b357604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612602576125ca816001614e2e565b6125d5906008614c58565b61ffff168682815181106125eb576125eb614ab7565b016020015160f81c901b91909117906001016125b6565b5061ffff8116156126265760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156126815761263d816003614e2e565b612648906008614c58565b63ffffffff168761265a836002614c23565b8151811061266a5761266a614ab7565b016020015160f81c901b9190911790600101612629565b5063ffffffff81166004146126a957604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156126fe576126c081601f614e2e565b6126cb906008614c58565b886126d7836006614c23565b815181106126e7576126e7614ab7565b016020015160f81c901b91909117906001016126ac565b505f805b600881101561275d57612716816007614e2e565b612721906008614c58565b6001600160401b031689612736836026614c23565b8151811061274657612746614ab7565b016020015160f81c901b9190911790600101612702565b505f805b60088110156127bc57612775816007614e2e565b612780906008614c58565b6001600160401b03168a61279583602e614c23565b815181106127a5576127a5614ab7565b016020015160f81c901b9190911790600101612761565b5091989097509095509350505050565b5f81516026146127ef57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561283e57612806816001614e2e565b612811906008614c58565b61ffff1684828151811061282757612827614ab7565b016020015160f81c901b91909117906001016127f2565b5061ffff8116156128625760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156128bd57612879816003614e2e565b612884906008614c58565b63ffffffff1685612896836002614c23565b815181106128a6576128a6614ab7565b016020015160f81c901b9190911790600101612865565b5063ffffffff8116156128e357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612938576128fa81601f614e2e565b612905906008614c58565b86612911836006614c23565b8151811061292157612921614ab7565b016020015160f81c901b91909117906001016128e6565b50949350505050565b60605f61295083830184614a72565b61295c91506058614c58565b61296790605c614c23565b6001600160401b0381111561297e5761297e614ae9565b6040519080825280601f01601f1916602001820160405280156129a8576020820181803683370190505b5090505f5b60208110156129fd57833581602081106129c9576129c9614ab7565b1a60f81b8282815181106129df576129df614ab7565b60200101906001600160f81b03191690815f1a9053506001016129ad565b505f5b6020811015612a5d5783602001358160208110612a1f57612a1f614ab7565b1a60f81b82612a2f836020614c23565b81518110612a3f57612a3f614ab7565b60200101906001600160f81b03191690815f1a905350600101612a00565b505f5b6004811015612ac057612a74816003614e2e565b612a7f906008614c58565b6014901c60f81b82612a92836040614c23565b81518110612aa257612aa2614ab7565b60200101906001600160f81b03191690815f1a905350600101612a60565b505f612ad26060850160408601614a57565b60601b90505f5b6014811015612b3257818160148110612af457612af4614ab7565b1a60f81b83612b04836044614c23565b81518110612b1457612b14614ab7565b60200101906001600160f81b03191690815f1a905350600101612ad9565b505f612b416060860186614a72565b905090505f5b6004811015612bac57612b5b816003614e2e565b612b66906008614c58565b63ffffffff8316901c60f81b84612b7e836058614c23565b81518110612b8e57612b8e614ab7565b60200101906001600160f81b03191690815f1a905350600101612b47565b505f5b612bbc6060870187614a72565b9050811015612dd0575f612bd1826058614c58565b612bdc90605c614c23565b90505f5b6020811015612c6757612bf66060890189614a72565b84818110612c0657612c06614ab7565b9050602002810190612c189190614acb565b358160208110612c2a57612c2a614ab7565b1a60f81b86612c398385614c23565b81518110612c4957612c49614ab7565b60200101906001600160f81b03191690815f1a905350600101612be0565b505f5b6008811015612d1c57612c7e816007614e2e565b612c89906008614c58565b612c9660608a018a614a72565b85818110612ca657612ca6614ab7565b9050602002810190612cb89190614acb565b612cc99060408101906020016147d5565b6001600160401b0316901c60f81b8682612ce4856020614c23565b612cee9190614c23565b81518110612cfe57612cfe614ab7565b60200101906001600160f81b03191690815f1a905350600101612c6a565b505f5b6030811015612dc657612d356060890189614a72565b84818110612d4557612d45614ab7565b9050602002810190612d579190614acb565b612d65906040810190614e41565b82818110612d7557612d75614ab7565b9050013560f81c60f81b8682846028612d8e9190614c23565b612d989190614c23565b81518110612da857612da8614ab7565b60200101906001600160f81b03191690815f1a905350600101612d1f565b5050600101612baf565b5091949350505050565b612de2614665565b5f8281525f805160206151338339815191526020526040808220815160e0810190925280545f805160206150f383398151915293929190829060ff166005811115612e2f57612e2f61480e565b6005811115612e4057612e4061480e565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612eb257612eb261480e565b14612ed05760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612f1457612f1461480e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612fc08582611d93565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061511383398151915280546001190161304857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061511383398151915255565b5f5f805160206150d38339815191528161307d6101fa85613afc565b90505f61308987611a33565b9050613094876123ba565b6130b157604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156130c6576130c661480e565b146130e45760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516130f59190614c6f565b905083600201600a9054906101000a90046001600160401b0316826040015161311e9190614e83565b6001600160401b0316816001600160401b0316111561315057604051630c192e7760e41b815260040160405180910390fd5b5f8061315c8a84611d93565b915091505f8a8360405160200161318a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561321d5761321d61480e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461334c57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561339b57613363816001614e2e565b61336e906008614c58565b61ffff1685828151811061338457613384614ab7565b016020015160f81c901b919091179060010161334f565b5061ffff8116156133bf5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561341a576133d6816003614e2e565b6133e1906008614c58565b63ffffffff16866133f3836002614c23565b8151811061340357613403614ab7565b016020015160f81c901b91909117906001016133c2565b5063ffffffff811660031461344257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134975761345981601f614e2e565b613464906008614c58565b87613470836006614c23565b8151811061348057613480614ab7565b016020015160f81c901b9190911790600101613445565b505f866026815181106134ac576134ac614ab7565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206150d383398151915290600160401b900461ffff9081169086161080613520575061271061ffff8616115b1561353e5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613570576040516302336bad60e51b815260040160405180910390fd5b80548310806135825750806001015483115b156135a057604051630103be3b60e21b815260040160405180910390fd5b5f6135aa84613afc565b90505f6135b68261092d565b90505f6135c38983613b1f565b905060405180606001604052806135d73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613672613f09565b61367b82613f54565b61158b81613fc5565b5f808251602e146136a857604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136f7576136bf816001614e2e565b6136ca906008614c58565b61ffff168582815181106136e0576136e0614ab7565b016020015160f81c901b91909117906001016136ab565b5061ffff81161561371b5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561377657613732816003614e2e565b61373d906008614c58565b63ffffffff168661374f836002614c23565b8151811061375f5761375f614ab7565b016020015160f81c901b919091179060010161371e565b5063ffffffff811660051461379e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137f3576137b581601f614e2e565b6137c0906008614c58565b876137cc836006614c23565b815181106137dc576137dc614ab7565b016020015160f81c901b91909117906001016137a1565b505f805b60088110156138525761380b816007614e2e565b613816906008614c58565b6001600160401b03168861382b836026614c23565b8151811061383b5761383b614ab7565b016020015160f81c901b91909117906001016137f7565b5090969095509350505050565b5f805160206150f38339815191525f6001600160401b0380841690851611156138935761388c83856149ad565b90506138a0565b61389d84846149ad565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806139025750600184015481516138fe916001600160401b031690614c23565b8210155b15613928576001600160401b038316606082015281815260408101516020820152613947565b828160600181815161393a9190614c6f565b6001600160401b03169052505b6060810151613957906064614e83565b602082015160018601546001600160401b0392909216916139829190600160401b900460ff16614c58565b10156139a15760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516139bc9190614c23565b9052506040810180516001600160401b03871691906139dc908390614e2e565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206151338339815191526020526040812060020180545f805160206150f38339815191529190600890613a7290600160401b90046001600160401b0316614eae565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b03838116602483015260448201839052611a2e91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614022565b5f61093d825f805160206150b3833981519152546001600160a01b031690614088565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613b6357604051637fab81e560e01b815260040160405180910390fd5b5f805160206150f383398151915242613b8260408601602087016147d5565b6001600160401b0316111580613bbc5750613ba06202a30042614c23565b613bb060408601602087016147d5565b6001600160401b031610155b15613bd95760405162d36c8560e81b815260040160405180910390fd5b6030613be86040860186614e41565b9050141580613bf657508335155b15613c145760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613c4457604051630eb0d31360e11b815260040160405180910390fd5b613c4e835f61385f565b5f80613ce76040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613c9291906147d5565b6001600160401b03168152602001613cad60408a018a614e41565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141ea565b5f82815260068601602052604090209193509150613d058282614f0d565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613d43908590600401614a06565b6020604051808303815f875af1158015613d5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d8391906149cd565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613dfb57613dfb61480e565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613edb918e01908e016147d5565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f5257604051631afcd79f60e31b815260040160405180910390fd5b565b613f5c613f09565b613f65816142ad565b613f6d6142c6565b613fc260608201356080830135613f8a60c0850160a086016147d5565b613f9a60e0860160c08701614fc8565b613fab610100870160e08801614fe1565b613fbd61012088016101008901614a57565b6142d6565b50565b613fcd613f09565b5f805160206150b38339815191526001600160a01b0382166140025760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6140366001600160a01b038416836143f7565b905080515f1415801561405a5750808060200190518101906140589190615001565b155b15611a2e57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140f291906149cd565b90506141096001600160a01b038516333086614404565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561414d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061417191906149cd565b90508181116141d75760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161407f565b6141e18282614e2e565b95945050505050565b5f606082608001515160301461421357604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614245979695949392919061501c565b60405160208183030381529060405290506002816040516142669190614c12565b602060405180830381855afa158015614281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142a491906149cd565b94909350915050565b6142b5613f09565b6142bd61443d565b613fc281614445565b6142ce613f09565b613f52614517565b6142de613f09565b5f805160206150d383398151915261ffff84161580614302575061271061ffff8516115b156143205760405163c98d73a760e01b815260040160405180910390fd5b8587111561434157604051630103be3b60e21b815260040160405180910390fd5b60ff831615806143545750600a60ff8416115b15614372576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061211583835f61451f565b6040516001600160a01b0384811660248301528381166044830152606482018390526109279186918216906323b872dd90608401613aca565b613f52613f09565b61444d613f09565b80355f805160206150f383398151915290815560146144726060840160408501614fe1565b60ff161180614491575061448c6060830160408401614fe1565b60ff16155b156144af5760405163b4fa3fb360e01b815260040160405180910390fd5b6144bf6060830160408401614fe1565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556144f060408301602084016147d5565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61304e613f09565b6060814710156145445760405163cd78605960e01b815230600482015260240161407f565b5f80856001600160a01b0316848660405161455f9190614c12565b5f6040518083038185875af1925050503d805f8114614599576040519150601f19603f3d011682016040523d82523d5f602084013e61459e565b606091505b5091509150611d898683836060826145be576145b982614605565b612115565b81511580156145d557506001600160a01b0384163b155b156145fe57604051639996b31560e01b81526001600160a01b038516600482015260240161407f565b5080612115565b8051156146155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461463a90614c8f565b5f825580601f10614649575050565b601f0160209004905f5260205f2090810190613fc291906146a1565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156146b5575f81556001016146a2565b5090565b8015158114613fc2575f80fd5b803563ffffffff811681146146d9575f80fd5b919050565b5f805f606084860312156146f0575f80fd5b833592506020840135614702816146b9565b9150614710604085016146c6565b90509250925092565b5f60208284031215614729575f80fd5b5035919050565b5f60208284031215614740575f80fd5b612115826146c6565b5f806040838503121561475a575f80fd5b614763836146c6565b946020939093013593505050565b5f8060408385031215614782575f80fd5b82356001600160401b03811115614797575f80fd5b8301608081860312156147a8575f80fd5b91506147b6602084016146c6565b90509250929050565b80356001600160401b03811681146146d9575f80fd5b5f602082840312156147e5575f80fd5b612115826147bf565b5f80604083850312156147ff575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061484557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161488060608401826001600160401b03169052565b50608083015161489b60808401826001600160401b03169052565b5060a08301516148b660a08401826001600160401b03169052565b5060c083015161258760c08401826001600160401b03169052565b803561ffff811681146146d9575f80fd5b5f805f80608085870312156148f5575f80fd5b84356001600160401b0381111561490a575f80fd5b85016060818803121561491b575f80fd5b9350614929602086016148d1565b9250614937604086016147bf565b9396929550929360600135925050565b6001600160a01b0381168114613fc2575f80fd5b5f8082840361014081121561496e575f80fd5b6101208082121561497d575f80fd5b849350830135905061498e81614947565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561258757612587614999565b5f602082840312156149dd575f80fd5b5051919050565b5f5b838110156149fe5781810151838201526020016149e6565b50505f910152565b602081525f8251806020840152614a248160408501602087016149e4565b601f01601f19169190910160400192915050565b5f82614a5257634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614a67575f80fd5b813561211581614947565b5f808335601e19843603018112614a87575f80fd5b8301803591506001600160401b03821115614aa0575f80fd5b6020019150600581901b3603821315611ee3575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614adf575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b1f57614b1f614ae9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b4d57614b4d614ae9565b604052919050565b5f6001600160401b03821115614b6d57614b6d614ae9565b50601f01601f191660200190565b5f60608236031215614b8b575f80fd5b614b93614afd565b823581526020614ba48185016147bf565b8183015260408401356001600160401b03811115614bc0575f80fd5b840136601f820112614bd0575f80fd5b8035614be3614bde82614b55565b614b25565b8181523684838501011115614bf6575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614adf8184602087016149e4565b8082018082111561093d5761093d614999565b5f63ffffffff808316818103614c4e57614c4e614999565b6001019392505050565b808202811582820484141761093d5761093d614999565b6001600160401b0381811683821601908082111561258757612587614999565b600181811c90821680614ca357607f821691505b602082108103614cc157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614cd981614c8f565b806020870152604060018084165f8114614cfa5760018114614d1657614d43565b60ff19851660408a0152604084151560051b8a01019550614d43565b895f5260205f205f5b85811015614d3a5781548b8201860152908301908801614d1f565b8a016040019650505b509398975050505050505050565b80516146d9816146b9565b5f8060408385031215614d6d575f80fd5b82516001600160401b0380821115614d83575f80fd5b9084019060608287031215614d96575f80fd5b614d9e614afd565b82518152602080840151614db181614947565b82820152604084015183811115614dc6575f80fd5b80850194505087601f850112614dda575f80fd5b83519250614dea614bde84614b55565b8381528882858701011115614dfd575f80fd5b614e0c848383018488016149e4565b80604084015250819550614e21818801614d51565b9450505050509250929050565b8181038181111561093d5761093d614999565b5f808335601e19843603018112614e56575f80fd5b8301803591506001600160401b03821115614e6f575f80fd5b602001915036819003821315611ee3575f80fd5b6001600160401b03818116838216028082169190828114614ea657614ea6614999565b505092915050565b5f6001600160401b03808316818103614c4e57614c4e614999565b601f821115611a2e57805f5260205f20601f840160051c81016020851015614eee5750805b601f840160051c820191505b818110156109dd575f8155600101614efa565b81516001600160401b03811115614f2657614f26614ae9565b614f3a81614f348454614c8f565b84614ec9565b602080601f831160018114614f6d575f8415614f565750858301515b5f19600386901b1c1916600185901b178555610b10565b5f85815260208120601f198616915b82811015614f9b57888601518255948401946001909101908401614f7c565b5085821015614fb857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215614fd8575f80fd5b612115826148d1565b5f60208284031215614ff1575f80fd5b813560ff81168114612115575f80fd5b5f60208284031215615011575f80fd5b8151612115816146b9565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161507181604e8601602089016149e4565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 fd21e913f..3a7054959 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614ff3380380614ff383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614ea68061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd3660046144be565b610561565b005b3480156101df575f80fd5b506101d26101ee3660046144f9565b61090f565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d2610238366004614510565b610a81565b348015610248575f80fd5b5061025c6102573660046144f9565b610b5e565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc36600461454e565b610b74565b604051908152602001610215565b3480156102fa575f80fd5b506101d26103093660046145a2565b610ba8565b348015610319575f80fd5b506101d26103283660046145bb565b610c49565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d26103703660046145e3565b610f0a565b348015610380575f80fd5b506102e161038f366004614631565b61138e565b34801561039f575f80fd5b5061025c6103ae3660046144f9565b6113a7565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e03660046144be565b6113bb565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d26104133660046144f9565b6115ad565b348015610423575f80fd5b506101d26104323660046145bb565b611668565b348015610442575f80fd5b506101d26104513660046145a2565b61182f565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a3660046144f9565b6119a1565b34801561049a575f80fd5b506101d26104a93660046144f9565b611b7d565b6102e16104bc3660046144f9565b611ca7565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef3660046144f9565b611cd8565b604051610215919061465e565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e16105313660046144f9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614dfa8339815191526020526040808220815160e0810190925280545f80516020614e1a83398151915293929190829060ff1660038111156105ae576105ae61464a565b60038111156105bf576105bf61464a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611cd8565b905060028351600381111561064c5761064c61464a565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b6003815160058111156106ac576106ac61464a565b036106ca5760405163a36c527f60e01b815260040160405180910390fd5b5f878152600585810160205260408220805460ff1916600317905582518291600291908111156106fc576106fc61464a565b03610775578715610714576107118488611da0565b91505b5f856060015184608001516107299190614721565b90506107358582611f24565b505f8b8152600589016020526040902060020180546001600160401b03909216600160c01b026001600160c01b03909216919091179055504290506107c6565b50505f82815260088501602090815260408083205460608501518b855260058901909352922060020180546001600160c01b0316600160c01b6001600160401b039384160217905560c08301519116905b600386015460608601516001600160a01b039091169063778c06b5906107eb9061138e565b60a086015160808901516040516001600160e01b031960e086901b16815260048101939093526001600160401b039182166024840152811660448301528085166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610862573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108869190614741565b5f8a81526006880160205260409020556004835160058111156108ab576108ab61464a565b036108c4576108b98961207b565b505050505050505050565b6040516001600160401b038216815284908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699060200160405180910390a3505050505050505050565b5f8181525f80516020614e7a8339815191526020526040808220815160e0810190925280545f80516020614e3a83398151915293929190829060ff16600581111561095c5761095c61464a565b600581111561096d5761096d61464a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109dc576109dc61464a565b146109fa5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a1f8584606001515f612256565b6040518263ffffffff1660e01b8152600401610a3b919061477a565b6020604051808303815f875af1158015610a57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7b9190614741565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aca575080546001600160401b03808416911610155b15610ae85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b12836122a5565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b6e64e8d4a51000836147ac565b92915050565b5f610b7d6122b9565b610b89848484346122f0565b9050610ba160015f80516020614e5a83398151915255565b9392505050565b5f80516020614e1a8339815191525f80610bc184612496565b91509150610bce82612734565b610bd85750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c0757610c0761464a565b03610c2c575f83815260078501602052604081208054919055610c2a828261276f565b505b610c4281610c3d846040015161138e565b6127cd565b5050505050565b5f8181525f80516020614dfa8339815191526020526040808220815160e0810190925280545f80516020614e1a83398151915293929190829060ff166003811115610c9657610c9661464a565b6003811115610ca757610ca761464a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610d1d82611cd8565b9050600183516003811115610d3457610d3461464a565b14610d525760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610d6757610d6761464a565b03610d7d57610d758561207b565b505050505050565b5f600382516005811115610d9357610d9361464a565b03610dde575060608101515f868152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905560c0810151610e7c565b5f610de8886127e0565b90505f80610df983604001516128e0565b5091509150818614610e1e57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031685606001516001600160401b03161080610e575750806001600160401b03168760a001516001600160401b0316115b15610e7557604051633ab3447f60e11b815260040160405180910390fd5b4293505050505b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b038516600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252849188917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f691015b60405180910390a350505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614e3a8339815191529060ff1615610f5c57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f9f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fc39190614741565b836020013514610fe65760405163d040949d60e01b815260040160405180910390fd5b30610ff760608501604086016147df565b6001600160a01b03161461101e5760405163e6c4247b60e01b815260040160405180910390fd5b5f61102c60608501856147fa565b905090505f805b828163ffffffff1610156112d8575f61104f60608801886147fa565b8363ffffffff168181106110655761106561483f565b90506020028101906110779190614853565b61108090614903565b80515f81815260088801602052604090205491925090156110b457604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f0135856040516020016110e392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526110fd9161499a565b602060405180830381855afa158015611118573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061113b9190614741565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156111c7576111c761464a565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161127a9116866149ab565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806112d1906149be565b9050611033565b50600483018190555f6112ea856127e0565b90505f6112fa8260400151612b1e565b90505f61130688612c93565b905081600282604051611319919061499a565b602060405180830381855afa158015611334573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113579190614741565b1461137557604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610b6e6001600160401b03831664e8d4a510006149e0565b5f6113b182611cd8565b6080015192915050565b5f80516020614e1a8339815191525f6113d38561312c565b90506113de85612734565b6113e9575050505050565b5f8581526004830160205260409020546001600160a01b031633146114215760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161145091600160b01b90046001600160401b0316906149f7565b6001600160401b03168160c001516001600160401b03161015611486576040516302336bad60e51b815260040160405180910390fd5b8315610c42575f6114978685611da0565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906114e79061138e565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561155d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115819190614741565b5f878152600785016020526040812080549091906115a09084906149ab565b9091555050505050505050565b5f80516020614e1a8339815191525f6115c583611cd8565b90506004815160058111156115dc576115dc61464a565b146115fa5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146116325760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610a7b906001600160a01b03168261276f565b6116706122b9565b5f8181525f80516020614dfa8339815191526020526040808220815160e0810190925280545f80516020614e1a83398151915293929190829060ff1660038111156116bd576116bd61464a565b60038111156116ce576116ce61464a565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156117475761174761464a565b146117655760405163f95c7fe160e01b815260040160405180910390fd5b60046117748260400151611cd8565b5160058111156117865761178661464a565b1461180a575f611795856127e0565b90505f806117a683604001516128e0565b5091509150818460400151146117cf57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561180657604051633ab3447f60e11b815260040160405180910390fd5b5050505b6118138361207b565b505061182b60015f80516020614e5a83398151915255565b5050565b5f80516020614e3a8339815191525f611847836127e0565b90505f806118588360400151613369565b915091508061187a57604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461189490614a17565b90505f036118b557604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156118db576118db61464a565b146118f95760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061191191614413565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614dfa8339815191526020526040808220815160e0810190925280545f80516020614e1a83398151915293929190829060ff1660038111156119ee576119ee61464a565b60038111156119ff576119ff61464a565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a7857611a7861464a565b14158015611a995750600381516003811115611a9657611a9661464a565b14155b15611ab75760405163f95c7fe160e01b815260040160405180910390fd5b5f611ac58260400151611cd8565b905080606001516001600160401b03165f03611af457604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611b21846040015184606001518560800151612256565b6040518263ffffffff1660e01b8152600401611b3d919061477a565b6020604051808303815f875af1158015611b59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c429190614741565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614e3a8339815191529190611bc490614a17565b90505f03611be557604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611c0b57611c0b61464a565b14611c295760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c629190600401614a49565b6020604051808303815f875af1158015611c7e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ca29190614741565b505050565b5f611cb06122b9565b611cbb82333461350d565b9050611cd360015f80516020614e5a83398151915255565b919050565b611ce061444a565b5f8281525f80516020614e7a833981519152602052604090819020815160e0810190925280545f80516020614e3a833981519152929190829060ff166005811115611d2d57611d2d61464a565b6005811115611d3e57611d3e61464a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611deb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e129190810190614ade565b9150915080611e3457604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e9b9190614741565b825114611ebb5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611ee75760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ef684604001516137d1565b91509150818714611f1a57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e7a833981519152602052604081206002015481905f80516020614e3a83398151915290600160801b90046001600160401b0316611f6c85826139ac565b5f611f7687613b75565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611fc68a858b612256565b6040518263ffffffff1660e01b8152600401611fe2919061477a565b6020604051808303815f875af1158015611ffe573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120229190614741565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f80516020614dfa8339815191526020526040808220815160e0810190925280545f80516020614e1a83398151915293929190829060ff1660038111156120c8576120c861464a565b60038111156120d9576120d961464a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612207575f848152600487016020526040902054612710906121b990600160a01b900461ffff16856149e0565b6121c391906147ac565b915081866007015f8681526020019081526020015f205f8282546121e791906149ab565b909155506121f790508284614bb0565b905061220785602001518261276f565b61221c8560200151610c3d876060015161138e565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc9939101610ef9565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6122ad613bea565b6122b681613c35565b50565b5f80516020614e5a8339815191528054600119016122ea57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614e1a83398151915290600160401b900461ffff9081169086161080612344575061271061ffff8616115b156123625760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612394576040516302336bad60e51b815260040160405180910390fd5b80548310806123a65750806001015483115b156123c457604051630103be3b60e21b815260040160405180910390fd5b825f6123cf82610b5e565b90505f6123dc8983613ca3565b905060405180606001604052806123f03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e5a83398151915255565b5f61249f61444a565b5f80516020614e3a8339815191525f6124b7856127e0565b90505f806124c88360400151613369565b9150915080156124eb57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561251c5761251c61464a565b600581111561252d5761252d61464a565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561259c5761259c61464a565b141580156125bd57506001815160058111156125ba576125ba61464a565b14155b156125db5760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156125f0576125f061464a565b036125fe5760048152612603565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156126485761264861464a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156126fc576126fc61464a565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156127bb575f80fd5b505af1158015610d75573d5f803e3d5ffd5b61182b6001600160a01b0383168261408d565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612844573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261286b9190810190614ade565b915091508061288d57604051636b2f19e960e01b815260040160405180910390fd5b8151156128ad5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156128d95760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461290557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129545761291c816001614bb0565b6129279060086149e0565b61ffff1686828151811061293d5761293d61483f565b016020015160f81c901b9190911790600101612908565b5061ffff8116156129785760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156129d35761298f816003614bb0565b61299a9060086149e0565b63ffffffff16876129ac8360026149ab565b815181106129bc576129bc61483f565b016020015160f81c901b919091179060010161297b565b5063ffffffff81166004146129fb57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a5057612a1281601f614bb0565b612a1d9060086149e0565b88612a298360066149ab565b81518110612a3957612a3961483f565b016020015160f81c901b91909117906001016129fe565b505f805b6008811015612aaf57612a68816007614bb0565b612a739060086149e0565b6001600160401b031689612a888360266149ab565b81518110612a9857612a9861483f565b016020015160f81c901b9190911790600101612a54565b505f805b6008811015612b0e57612ac7816007614bb0565b612ad29060086149e0565b6001600160401b03168a612ae783602e6149ab565b81518110612af757612af761483f565b016020015160f81c901b9190911790600101612ab3565b5091989097509095509350505050565b5f8151602614612b4157604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b9057612b58816001614bb0565b612b639060086149e0565b61ffff16848281518110612b7957612b7961483f565b016020015160f81c901b9190911790600101612b44565b5061ffff811615612bb45760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612c0f57612bcb816003614bb0565b612bd69060086149e0565b63ffffffff1685612be88360026149ab565b81518110612bf857612bf861483f565b016020015160f81c901b9190911790600101612bb7565b5063ffffffff811615612c3557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c8a57612c4c81601f614bb0565b612c579060086149e0565b86612c638360066149ab565b81518110612c7357612c7361483f565b016020015160f81c901b9190911790600101612c38565b50949350505050565b60605f612ca2838301846147fa565b612cae915060586149e0565b612cb990605c6149ab565b6001600160401b03811115612cd057612cd0614871565b6040519080825280601f01601f191660200182016040528015612cfa576020820181803683370190505b5090505f5b6020811015612d4f5783358160208110612d1b57612d1b61483f565b1a60f81b828281518110612d3157612d3161483f565b60200101906001600160f81b03191690815f1a905350600101612cff565b505f5b6020811015612daf5783602001358160208110612d7157612d7161483f565b1a60f81b82612d818360206149ab565b81518110612d9157612d9161483f565b60200101906001600160f81b03191690815f1a905350600101612d52565b505f5b6004811015612e1257612dc6816003614bb0565b612dd19060086149e0565b6014901c60f81b82612de48360406149ab565b81518110612df457612df461483f565b60200101906001600160f81b03191690815f1a905350600101612db2565b505f612e2460608501604086016147df565b60601b90505f5b6014811015612e8457818160148110612e4657612e4661483f565b1a60f81b83612e568360446149ab565b81518110612e6657612e6661483f565b60200101906001600160f81b03191690815f1a905350600101612e2b565b505f612e9360608601866147fa565b905090505f5b6004811015612efe57612ead816003614bb0565b612eb89060086149e0565b63ffffffff8316901c60f81b84612ed08360586149ab565b81518110612ee057612ee061483f565b60200101906001600160f81b03191690815f1a905350600101612e99565b505f5b612f0e60608701876147fa565b9050811015613122575f612f238260586149e0565b612f2e90605c6149ab565b90505f5b6020811015612fb957612f4860608901896147fa565b84818110612f5857612f5861483f565b9050602002810190612f6a9190614853565b358160208110612f7c57612f7c61483f565b1a60f81b86612f8b83856149ab565b81518110612f9b57612f9b61483f565b60200101906001600160f81b03191690815f1a905350600101612f32565b505f5b600881101561306e57612fd0816007614bb0565b612fdb9060086149e0565b612fe860608a018a6147fa565b85818110612ff857612ff861483f565b905060200281019061300a9190614853565b61301b906040810190602001614631565b6001600160401b0316901c60f81b86826130368560206149ab565b61304091906149ab565b815181106130505761305061483f565b60200101906001600160f81b03191690815f1a905350600101612fbc565b505f5b60308110156131185761308760608901896147fa565b848181106130975761309761483f565b90506020028101906130a99190614853565b6130b7906040810190614bc3565b828181106130c7576130c761483f565b9050013560f81c60f81b86828460286130e091906149ab565b6130ea91906149ab565b815181106130fa576130fa61483f565b60200101906001600160f81b03191690815f1a905350600101613071565b5050600101612f01565b5091949350505050565b61313461444a565b5f8281525f80516020614e7a8339815191526020526040808220815160e0810190925280545f80516020614e3a83398151915293929190829060ff1660058111156131815761318161464a565b60058111156131925761319261464a565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156132045761320461464a565b146132225760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156132665761326661464a565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133128582611f24565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461338d57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133dc576133a4816001614bb0565b6133af9060086149e0565b61ffff168582815181106133c5576133c561483f565b016020015160f81c901b9190911790600101613390565b5061ffff8116156134005760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561345b57613417816003614bb0565b6134229060086149e0565b63ffffffff16866134348360026149ab565b815181106134445761344461483f565b016020015160f81c901b9190911790600101613403565b5063ffffffff811660031461348357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134d85761349a81601f614bb0565b6134a59060086149e0565b876134b18360066149ab565b815181106134c1576134c161483f565b016020015160f81c901b9190911790600101613486565b505f866026815181106134ed576134ed61483f565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614e1a8339815191528161352684610b5e565b90505f61353287611cd8565b905061353d87612734565b61355a57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561356f5761356f61464a565b1461358d5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161359e91906149f7565b905083600201600a9054906101000a90046001600160401b031682604001516135c79190614c05565b6001600160401b0316816001600160401b031611156135f957604051630c192e7760e41b815260040160405180910390fd5b5f806136058a84611f24565b915091505f8a8360405160200161363392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156136c6576136c661464a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146137f557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156138445761380c816001614bb0565b6138179060086149e0565b61ffff1685828151811061382d5761382d61483f565b016020015160f81c901b91909117906001016137f8565b5061ffff8116156138685760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156138c35761387f816003614bb0565b61388a9060086149e0565b63ffffffff168661389c8360026149ab565b815181106138ac576138ac61483f565b016020015160f81c901b919091179060010161386b565b5063ffffffff81166005146138eb57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139405761390281601f614bb0565b61390d9060086149e0565b876139198360066149ab565b815181106139295761392961483f565b016020015160f81c901b91909117906001016138ee565b505f805b600881101561399f57613958816007614bb0565b6139639060086149e0565b6001600160401b0316886139788360266149ab565b815181106139885761398861483f565b016020015160f81c901b9190911790600101613944565b5090969095509350505050565b5f80516020614e3a8339815191525f6001600160401b0380841690851611156139e0576139d98385614721565b90506139ed565b6139ea8484614721565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a4f575060018401548151613a4b916001600160401b0316906149ab565b8210155b15613a75576001600160401b038316606082015281815260408101516020820152613a94565b8281606001818151613a8791906149f7565b6001600160401b03169052505b6060810151613aa4906064614c05565b602082015160018601546001600160401b039290921691613acf9190600160401b900460ff166149e0565b1015613aee5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613b0991906149ab565b9052506040810180516001600160401b0387169190613b29908390614bb0565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e7a8339815191526020526040812060020180545f80516020614e3a8339815191529190600890613bbf90600160401b90046001600160401b0316614c30565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c3357604051631afcd79f60e31b815260040160405180910390fd5b565b613c3d613bea565b613c4681614124565b613c4e61413d565b6122b660608201356080830135613c6b60c0850160a08601614631565b613c7b60e0860160c08701614c4b565b613c8c610100870160e08801614c64565b613c9e610120880161010089016147df565b61414d565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ce757604051637fab81e560e01b815260040160405180910390fd5b5f80516020614e3a83398151915242613d066040860160208701614631565b6001600160401b0316111580613d405750613d246202a300426149ab565b613d346040860160208701614631565b6001600160401b031610155b15613d5d5760405162d36c8560e81b815260040160405180910390fd5b6030613d6c6040860186614bc3565b9050141580613d7a57508335155b15613d985760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613dc857604051630eb0d31360e11b815260040160405180910390fd5b613dd2835f6139ac565b5f80613e6b6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e169190614631565b6001600160401b03168152602001613e3160408a018a614bc3565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061426e565b5f82815260068601602052604090209193509150613e898282614cc8565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613ec790859060040161477a565b6020604051808303815f875af1158015613ee3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f079190614741565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613f7f57613f7f61464a565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161405f918e01908e01614631565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156140b45760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146140fd576040519150601f19603f3d011682016040523d82523d5f602084013e614102565b606091505b5050905080611ca257604051630a12f52160e11b815260040160405180910390fd5b61412c613bea565b614134614331565b6122b681614339565b614145613bea565b613c3361440b565b614155613bea565b5f80516020614e1a83398151915261ffff84161580614179575061271061ffff8516115b156141975760405163c98d73a760e01b815260040160405180910390fd5b858711156141b857604051630103be3b60e21b815260040160405180910390fd5b60ff831615806141cb5750600a60ff8416115b156141e9576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461429757604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016142c99796959493929190614d83565b60405160208183030381529060405290506002816040516142ea919061499a565b602060405180830381855afa158015614305573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143289190614741565b94909350915050565b613c33613bea565b614341613bea565b80355f80516020614e3a83398151915290815560146143666060840160408501614c64565b60ff16118061438557506143806060830160408401614c64565b60ff16155b156143a35760405163b4fa3fb360e01b815260040160405180910390fd5b6143b36060830160408401614c64565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556143e46040830160208401614631565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612483613bea565b50805461441f90614a17565b5f825580601f1061442e575050565b601f0160209004905f5260205f20908101906122b69190614486565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561449a575f8155600101614487565b5090565b80151581146122b6575f80fd5b803563ffffffff81168114611cd3575f80fd5b5f805f606084860312156144d0575f80fd5b8335925060208401356144e28161449e565b91506144f0604085016144ab565b90509250925092565b5f60208284031215614509575f80fd5b5035919050565b5f6101208284031215614521575f80fd5b50919050565b803561ffff81168114611cd3575f80fd5b80356001600160401b0381168114611cd3575f80fd5b5f805f60608486031215614560575f80fd5b83356001600160401b03811115614575575f80fd5b840160608187031215614586575f80fd5b925061459460208501614527565b91506144f060408501614538565b5f602082840312156145b2575f80fd5b610ba1826144ab565b5f80604083850312156145cc575f80fd5b6145d5836144ab565b946020939093013593505050565b5f80604083850312156145f4575f80fd5b82356001600160401b03811115614609575f80fd5b83016080818603121561461a575f80fd5b9150614628602084016144ab565b90509250929050565b5f60208284031215614641575f80fd5b610ba182614538565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061468157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516146bc60608401826001600160401b03169052565b5060808301516146d760808401826001600160401b03169052565b5060a08301516146f260a08401826001600160401b03169052565b5060c08301516128d960c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156128d9576128d961470d565b5f60208284031215614751575f80fd5b5051919050565b5f5b8381101561477257818101518382015260200161475a565b50505f910152565b602081525f8251806020840152614798816040850160208701614758565b601f01601f19169190910160400192915050565b5f826147c657634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03811681146122b6575f80fd5b5f602082840312156147ef575f80fd5b8135610ba1816147cb565b5f808335601e1984360301811261480f575f80fd5b8301803591506001600160401b03821115614828575f80fd5b6020019150600581901b3603821315612074575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614867575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156148a7576148a7614871565b60405290565b604051601f8201601f191681016001600160401b03811182821017156148d5576148d5614871565b604052919050565b5f6001600160401b038211156148f5576148f5614871565b50601f01601f191660200190565b5f60608236031215614913575f80fd5b61491b614885565b82358152602061492c818501614538565b8183015260408401356001600160401b03811115614948575f80fd5b840136601f820112614958575f80fd5b803561496b614966826148dd565b6148ad565b818152368483850101111561497e575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614867818460208701614758565b80820180821115610b6e57610b6e61470d565b5f63ffffffff8083168181036149d6576149d661470d565b6001019392505050565b8082028115828204841417610b6e57610b6e61470d565b6001600160401b038181168382160190808211156128d9576128d961470d565b600181811c90821680614a2b57607f821691505b60208210810361452157634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614a5b81614a17565b806020870152604060018084165f8114614a7c5760018114614a9857614ac5565b60ff19851660408a0152604084151560051b8a01019550614ac5565b895f5260205f205f5b85811015614abc5781548b8201860152908301908801614aa1565b8a016040019650505b509398975050505050505050565b8051611cd38161449e565b5f8060408385031215614aef575f80fd5b82516001600160401b0380821115614b05575f80fd5b9084019060608287031215614b18575f80fd5b614b20614885565b82518152602080840151614b33816147cb565b82820152604084015183811115614b48575f80fd5b80850194505087601f850112614b5c575f80fd5b83519250614b6c614966846148dd565b8381528882858701011115614b7f575f80fd5b614b8e84838301848801614758565b80604084015250819550614ba3818801614ad3565b9450505050509250929050565b81810381811115610b6e57610b6e61470d565b5f808335601e19843603018112614bd8575f80fd5b8301803591506001600160401b03821115614bf1575f80fd5b602001915036819003821315612074575f80fd5b6001600160401b03818116838216028082169190828114614c2857614c2861470d565b505092915050565b5f6001600160401b038083168181036149d6576149d661470d565b5f60208284031215614c5b575f80fd5b610ba182614527565b5f60208284031215614c74575f80fd5b813560ff81168114610ba1575f80fd5b601f821115611ca257805f5260205f20601f840160051c81016020851015614ca95750805b601f840160051c820191505b81811015610c42575f8155600101614cb5565b81516001600160401b03811115614ce157614ce1614871565b614cf581614cef8454614a17565b84614c84565b602080601f831160018114614d28575f8415614d115750858301515b5f19600386901b1c1916600185901b178555610d75565b5f85815260208120601f198616915b82811015614d5657888601518255948401946001909101908401614d37565b5085821015614d7357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614dd881604e860160208901614758565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614fb8380380614fb883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614e6b8061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004614483565b610561565b005b3480156101df575f80fd5b506101d26101ee3660046144be565b61090f565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d26102383660046144d5565b610a81565b348015610248575f80fd5b5061025c6102573660046144be565b610b5e565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc366004614513565b610b74565b604051908152602001610215565b3480156102fa575f80fd5b506101d2610309366004614567565b610ba8565b348015610319575f80fd5b506101d2610328366004614580565b610c49565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d26103703660046145a8565b610ecf565b348015610380575f80fd5b506102e161038f3660046145f6565b611353565b34801561039f575f80fd5b5061025c6103ae3660046144be565b61136c565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e0366004614483565b611380565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d26104133660046144be565b611572565b348015610423575f80fd5b506101d2610432366004614580565b61162d565b348015610442575f80fd5b506101d2610451366004614567565b6117f4565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a3660046144be565b611966565b34801561049a575f80fd5b506101d26104a93660046144be565b611b42565b6102e16104bc3660046144be565b611c6c565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef3660046144be565b611c9d565b6040516102159190614623565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e16105313660046144be565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614dbf8339815191526020526040808220815160e0810190925280545f80516020614ddf83398151915293929190829060ff1660038111156105ae576105ae61460f565b60038111156105bf576105bf61460f565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611c9d565b905060028351600381111561064c5761064c61460f565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b6003815160058111156106ac576106ac61460f565b036106ca5760405163a36c527f60e01b815260040160405180910390fd5b5f878152600585810160205260408220805460ff1916600317905582518291600291908111156106fc576106fc61460f565b03610775578715610714576107118488611d65565b91505b5f8560600151846080015161072991906146e6565b90506107358582611ee9565b505f8b8152600589016020526040902060020180546001600160401b03909216600160c01b026001600160c01b03909216919091179055504290506107c6565b50505f82815260088501602090815260408083205460608501518b855260058901909352922060020180546001600160c01b0316600160c01b6001600160401b039384160217905560c08301519116905b600386015460608601516001600160a01b039091169063778c06b5906107eb90611353565b60a086015160808901516040516001600160e01b031960e086901b16815260048101939093526001600160401b039182166024840152811660448301528085166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610862573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108869190614706565b5f8a81526006880160205260409020556004835160058111156108ab576108ab61460f565b036108c4576108b989612040565b505050505050505050565b6040516001600160401b038216815284908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699060200160405180910390a3505050505050505050565b5f8181525f80516020614e3f8339815191526020526040808220815160e0810190925280545f80516020614dff83398151915293929190829060ff16600581111561095c5761095c61460f565b600581111561096d5761096d61460f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109dc576109dc61460f565b146109fa5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a1f8584606001515f61221b565b6040518263ffffffff1660e01b8152600401610a3b919061473f565b6020604051808303815f875af1158015610a57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7b9190614706565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aca575080546001600160401b03808416911610155b15610ae85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b128361226a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b6e64e8d4a5100083614771565b92915050565b5f610b7d61227e565b610b89848484346122b5565b9050610ba160015f80516020614e1f83398151915255565b9392505050565b5f80516020614ddf8339815191525f80610bc18461245b565b91509150610bce826126f9565b610bd85750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c0757610c0761460f565b03610c2c575f83815260078501602052604081208054919055610c2a8282612734565b505b610c4281610c3d8460400151611353565b612792565b5050505050565b5f8181525f80516020614dbf8339815191526020526040808220815160e0810190925280545f80516020614ddf83398151915293929190829060ff166003811115610c9657610c9661460f565b6003811115610ca757610ca761460f565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610d1d82611c9d565b9050600183516003811115610d3457610d3461460f565b14610d525760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610d6757610d6761460f565b03610d7d57610d7585612040565b505050505050565b5f600382516005811115610d9357610d9361460f565b03610da3575060c0810151610e41565b5f610dad886127a5565b90505f80610dbe83604001516128a5565b5091509150818614610de357604051636990657d60e01b815260040160405180910390fd5b806001600160401b031685606001516001600160401b03161080610e1c5750806001600160401b03168760a001516001600160401b0316115b15610e3a57604051633ab3447f60e11b815260040160405180910390fd5b4293505050505b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b038516600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252849188917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f691015b60405180910390a350505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614dff8339815191529060ff1615610f2157604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f889190614706565b836020013514610fab5760405163d040949d60e01b815260040160405180910390fd5b30610fbc60608501604086016147a4565b6001600160a01b031614610fe35760405163e6c4247b60e01b815260040160405180910390fd5b5f610ff160608501856147bf565b905090505f805b828163ffffffff16101561129d575f61101460608801886147bf565b8363ffffffff1681811061102a5761102a614804565b905060200281019061103c9190614818565b611045906148c8565b80515f818152600888016020526040902054919250901561107957604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f0135856040516020016110a892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526110c29161495f565b602060405180830381855afa1580156110dd573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111009190614706565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561118c5761118c61460f565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161123f911686614970565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061129690614983565b9050610ff8565b50600483018190555f6112af856127a5565b90505f6112bf8260400151612ae3565b90505f6112cb88612c58565b9050816002826040516112de919061495f565b602060405180830381855afa1580156112f9573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061131c9190614706565b1461133a57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610b6e6001600160401b03831664e8d4a510006149a5565b5f61137682611c9d565b6080015192915050565b5f80516020614ddf8339815191525f611398856130f1565b90506113a3856126f9565b6113ae575050505050565b5f8581526004830160205260409020546001600160a01b031633146113e65760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161141591600160b01b90046001600160401b0316906149bc565b6001600160401b03168160c001516001600160401b0316101561144b576040516302336bad60e51b815260040160405180910390fd5b8315610c42575f61145c8685611d65565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906114ac90611353565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611522573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115469190614706565b5f87815260078501602052604081208054909190611565908490614970565b9091555050505050505050565b5f80516020614ddf8339815191525f61158a83611c9d565b90506004815160058111156115a1576115a161460f565b146115bf5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146115f75760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610a7b906001600160a01b031682612734565b61163561227e565b5f8181525f80516020614dbf8339815191526020526040808220815160e0810190925280545f80516020614ddf83398151915293929190829060ff1660038111156116825761168261460f565b60038111156116935761169361460f565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561170c5761170c61460f565b1461172a5760405163f95c7fe160e01b815260040160405180910390fd5b60046117398260400151611c9d565b51600581111561174b5761174b61460f565b146117cf575f61175a856127a5565b90505f8061176b83604001516128a5565b50915091508184604001511461179457604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156117cb57604051633ab3447f60e11b815260040160405180910390fd5b5050505b6117d883612040565b50506117f060015f80516020614e1f83398151915255565b5050565b5f80516020614dff8339815191525f61180c836127a5565b90505f8061181d836040015161332e565b915091508061183f57604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068501602052604090208054611859906149dc565b90505f0361187a57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156118a0576118a061460f565b146118be5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206118d6916143d8565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614dbf8339815191526020526040808220815160e0810190925280545f80516020614ddf83398151915293929190829060ff1660038111156119b3576119b361460f565b60038111156119c4576119c461460f565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a3d57611a3d61460f565b14158015611a5e5750600381516003811115611a5b57611a5b61460f565b14155b15611a7c5760405163f95c7fe160e01b815260040160405180910390fd5b5f611a8a8260400151611c9d565b905080606001516001600160401b03165f03611ab957604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611ae684604001518460600151856080015161221b565b6040518263ffffffff1660e01b8152600401611b02919061473f565b6020604051808303815f875af1158015611b1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c429190614706565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614dff8339815191529190611b89906149dc565b90505f03611baa57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611bd057611bd061460f565b14611bee5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c279190600401614a0e565b6020604051808303815f875af1158015611c43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c679190614706565b505050565b5f611c7561227e565b611c808233346134d2565b9050611c9860015f80516020614e1f83398151915255565b919050565b611ca561440f565b5f8281525f80516020614e3f833981519152602052604090819020815160e0810190925280545f80516020614dff833981519152929190829060ff166005811115611cf257611cf261460f565b6005811115611d0357611d0361460f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611db0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611dd79190810190614aa3565b9150915080611df957604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e609190614706565b825114611e805760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611eac5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ebb8460400151613796565b91509150818714611edf57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e3f833981519152602052604081206002015481905f80516020614dff83398151915290600160801b90046001600160401b0316611f318582613971565b5f611f3b87613b3a565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611f8b8a858b61221b565b6040518263ffffffff1660e01b8152600401611fa7919061473f565b6020604051808303815f875af1158015611fc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe79190614706565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f80516020614dbf8339815191526020526040808220815160e0810190925280545f80516020614ddf83398151915293929190829060ff16600381111561208d5761208d61460f565b600381111561209e5761209e61460f565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156121cc575f8481526004870160205260409020546127109061217e90600160a01b900461ffff16856149a5565b6121889190614771565b915081866007015f8681526020019081526020015f205f8282546121ac9190614970565b909155506121bc90508284614b75565b90506121cc856020015182612734565b6121e18560200151610c3d8760600151611353565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc9939101610ebe565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612272613baf565b61227b81613bfa565b50565b5f80516020614e1f8339815191528054600119016122af57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ddf83398151915290600160401b900461ffff9081169086161080612309575061271061ffff8616115b156123275760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612359576040516302336bad60e51b815260040160405180910390fd5b805483108061236b5750806001015483115b1561238957604051630103be3b60e21b815260040160405180910390fd5b825f61239482610b5e565b90505f6123a18983613c68565b905060405180606001604052806123b53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e1f83398151915255565b5f61246461440f565b5f80516020614dff8339815191525f61247c856127a5565b90505f8061248d836040015161332e565b9150915080156124b057604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156124e1576124e161460f565b60058111156124f2576124f261460f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125615761256161460f565b14158015612582575060018151600581111561257f5761257f61460f565b14155b156125a05760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156125b5576125b561460f565b036125c357600481526125c8565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561260d5761260d61460f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156126c1576126c161460f565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612780575f80fd5b505af1158015610d75573d5f803e3d5ffd5b6117f06001600160a01b03831682614052565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612809573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128309190810190614aa3565b915091508061285257604051636b2f19e960e01b815260040160405180910390fd5b8151156128725760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561289e5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146128ca57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612919576128e1816001614b75565b6128ec9060086149a5565b61ffff1686828151811061290257612902614804565b016020015160f81c901b91909117906001016128cd565b5061ffff81161561293d5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561299857612954816003614b75565b61295f9060086149a5565b63ffffffff1687612971836002614970565b8151811061298157612981614804565b016020015160f81c901b9190911790600101612940565b5063ffffffff81166004146129c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a15576129d781601f614b75565b6129e29060086149a5565b886129ee836006614970565b815181106129fe576129fe614804565b016020015160f81c901b91909117906001016129c3565b505f805b6008811015612a7457612a2d816007614b75565b612a389060086149a5565b6001600160401b031689612a4d836026614970565b81518110612a5d57612a5d614804565b016020015160f81c901b9190911790600101612a19565b505f805b6008811015612ad357612a8c816007614b75565b612a979060086149a5565b6001600160401b03168a612aac83602e614970565b81518110612abc57612abc614804565b016020015160f81c901b9190911790600101612a78565b5091989097509095509350505050565b5f8151602614612b0657604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b5557612b1d816001614b75565b612b289060086149a5565b61ffff16848281518110612b3e57612b3e614804565b016020015160f81c901b9190911790600101612b09565b5061ffff811615612b795760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612bd457612b90816003614b75565b612b9b9060086149a5565b63ffffffff1685612bad836002614970565b81518110612bbd57612bbd614804565b016020015160f81c901b9190911790600101612b7c565b5063ffffffff811615612bfa57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c4f57612c1181601f614b75565b612c1c9060086149a5565b86612c28836006614970565b81518110612c3857612c38614804565b016020015160f81c901b9190911790600101612bfd565b50949350505050565b60605f612c67838301846147bf565b612c73915060586149a5565b612c7e90605c614970565b6001600160401b03811115612c9557612c95614836565b6040519080825280601f01601f191660200182016040528015612cbf576020820181803683370190505b5090505f5b6020811015612d145783358160208110612ce057612ce0614804565b1a60f81b828281518110612cf657612cf6614804565b60200101906001600160f81b03191690815f1a905350600101612cc4565b505f5b6020811015612d745783602001358160208110612d3657612d36614804565b1a60f81b82612d46836020614970565b81518110612d5657612d56614804565b60200101906001600160f81b03191690815f1a905350600101612d17565b505f5b6004811015612dd757612d8b816003614b75565b612d969060086149a5565b6014901c60f81b82612da9836040614970565b81518110612db957612db9614804565b60200101906001600160f81b03191690815f1a905350600101612d77565b505f612de960608501604086016147a4565b60601b90505f5b6014811015612e4957818160148110612e0b57612e0b614804565b1a60f81b83612e1b836044614970565b81518110612e2b57612e2b614804565b60200101906001600160f81b03191690815f1a905350600101612df0565b505f612e5860608601866147bf565b905090505f5b6004811015612ec357612e72816003614b75565b612e7d9060086149a5565b63ffffffff8316901c60f81b84612e95836058614970565b81518110612ea557612ea5614804565b60200101906001600160f81b03191690815f1a905350600101612e5e565b505f5b612ed360608701876147bf565b90508110156130e7575f612ee88260586149a5565b612ef390605c614970565b90505f5b6020811015612f7e57612f0d60608901896147bf565b84818110612f1d57612f1d614804565b9050602002810190612f2f9190614818565b358160208110612f4157612f41614804565b1a60f81b86612f508385614970565b81518110612f6057612f60614804565b60200101906001600160f81b03191690815f1a905350600101612ef7565b505f5b600881101561303357612f95816007614b75565b612fa09060086149a5565b612fad60608a018a6147bf565b85818110612fbd57612fbd614804565b9050602002810190612fcf9190614818565b612fe09060408101906020016145f6565b6001600160401b0316901c60f81b8682612ffb856020614970565b6130059190614970565b8151811061301557613015614804565b60200101906001600160f81b03191690815f1a905350600101612f81565b505f5b60308110156130dd5761304c60608901896147bf565b8481811061305c5761305c614804565b905060200281019061306e9190614818565b61307c906040810190614b88565b8281811061308c5761308c614804565b9050013560f81c60f81b86828460286130a59190614970565b6130af9190614970565b815181106130bf576130bf614804565b60200101906001600160f81b03191690815f1a905350600101613036565b5050600101612ec6565b5091949350505050565b6130f961440f565b5f8281525f80516020614e3f8339815191526020526040808220815160e0810190925280545f80516020614dff83398151915293929190829060ff1660058111156131465761314661460f565b60058111156131575761315761460f565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131c9576131c961460f565b146131e75760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561322b5761322b61460f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132d78582611ee9565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461335257604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133a157613369816001614b75565b6133749060086149a5565b61ffff1685828151811061338a5761338a614804565b016020015160f81c901b9190911790600101613355565b5061ffff8116156133c55760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613420576133dc816003614b75565b6133e79060086149a5565b63ffffffff16866133f9836002614970565b8151811061340957613409614804565b016020015160f81c901b91909117906001016133c8565b5063ffffffff811660031461344857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561349d5761345f81601f614b75565b61346a9060086149a5565b87613476836006614970565b8151811061348657613486614804565b016020015160f81c901b919091179060010161344b565b505f866026815181106134b2576134b2614804565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614ddf833981519152816134eb84610b5e565b90505f6134f787611c9d565b9050613502876126f9565b61351f57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156135345761353461460f565b146135525760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161356391906149bc565b905083600201600a9054906101000a90046001600160401b0316826040015161358c9190614bca565b6001600160401b0316816001600160401b031611156135be57604051630c192e7760e41b815260040160405180910390fd5b5f806135ca8a84611ee9565b915091505f8a836040516020016135f892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561368b5761368b61460f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146137ba57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613809576137d1816001614b75565b6137dc9060086149a5565b61ffff168582815181106137f2576137f2614804565b016020015160f81c901b91909117906001016137bd565b5061ffff81161561382d5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561388857613844816003614b75565b61384f9060086149a5565b63ffffffff1686613861836002614970565b8151811061387157613871614804565b016020015160f81c901b9190911790600101613830565b5063ffffffff81166005146138b057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613905576138c781601f614b75565b6138d29060086149a5565b876138de836006614970565b815181106138ee576138ee614804565b016020015160f81c901b91909117906001016138b3565b505f805b60088110156139645761391d816007614b75565b6139289060086149a5565b6001600160401b03168861393d836026614970565b8151811061394d5761394d614804565b016020015160f81c901b9190911790600101613909565b5090969095509350505050565b5f80516020614dff8339815191525f6001600160401b0380841690851611156139a55761399e83856146e6565b90506139b2565b6139af84846146e6565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a14575060018401548151613a10916001600160401b031690614970565b8210155b15613a3a576001600160401b038316606082015281815260408101516020820152613a59565b8281606001818151613a4c91906149bc565b6001600160401b03169052505b6060810151613a69906064614bca565b602082015160018601546001600160401b039290921691613a949190600160401b900460ff166149a5565b1015613ab35760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613ace9190614970565b9052506040810180516001600160401b0387169190613aee908390614b75565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e3f8339815191526020526040812060020180545f80516020614dff8339815191529190600890613b8490600160401b90046001600160401b0316614bf5565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613bf857604051631afcd79f60e31b815260040160405180910390fd5b565b613c02613baf565b613c0b816140e9565b613c13614102565b61227b60608201356080830135613c3060c0850160a086016145f6565b613c4060e0860160c08701614c10565b613c51610100870160e08801614c29565b613c63610120880161010089016147a4565b614112565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613cac57604051637fab81e560e01b815260040160405180910390fd5b5f80516020614dff83398151915242613ccb60408601602087016145f6565b6001600160401b0316111580613d055750613ce96202a30042614970565b613cf960408601602087016145f6565b6001600160401b031610155b15613d225760405162d36c8560e81b815260040160405180910390fd5b6030613d316040860186614b88565b9050141580613d3f57508335155b15613d5d5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613d8d57604051630eb0d31360e11b815260040160405180910390fd5b613d97835f613971565b5f80613e306040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ddb91906145f6565b6001600160401b03168152602001613df660408a018a614b88565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614233565b5f82815260068601602052604090209193509150613e4e8282614c8d565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613e8c90859060040161473f565b6020604051808303815f875af1158015613ea8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ecc9190614706565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613f4457613f4461460f565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614024918e01908e016145f6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156140795760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146140c2576040519150601f19603f3d011682016040523d82523d5f602084013e6140c7565b606091505b5050905080611c6757604051630a12f52160e11b815260040160405180910390fd5b6140f1613baf565b6140f96142f6565b61227b816142fe565b61410a613baf565b613bf86143d0565b61411a613baf565b5f80516020614ddf83398151915261ffff8416158061413e575061271061ffff8516115b1561415c5760405163c98d73a760e01b815260040160405180910390fd5b8587111561417d57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806141905750600a60ff8416115b156141ae576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461425c57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161428e9796959493929190614d48565b60405160208183030381529060405290506002816040516142af919061495f565b602060405180830381855afa1580156142ca573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142ed9190614706565b94909350915050565b613bf8613baf565b614306613baf565b80355f80516020614dff833981519152908155601461432b6060840160408501614c29565b60ff16118061434a57506143456060830160408401614c29565b60ff16155b156143685760405163b4fa3fb360e01b815260040160405180910390fd5b6143786060830160408401614c29565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556143a960408301602084016145f6565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612448613baf565b5080546143e4906149dc565b5f825580601f106143f3575050565b601f0160209004905f5260205f209081019061227b919061444b565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561445f575f815560010161444c565b5090565b801515811461227b575f80fd5b803563ffffffff81168114611c98575f80fd5b5f805f60608486031215614495575f80fd5b8335925060208401356144a781614463565b91506144b560408501614470565b90509250925092565b5f602082840312156144ce575f80fd5b5035919050565b5f61012082840312156144e6575f80fd5b50919050565b803561ffff81168114611c98575f80fd5b80356001600160401b0381168114611c98575f80fd5b5f805f60608486031215614525575f80fd5b83356001600160401b0381111561453a575f80fd5b84016060818703121561454b575f80fd5b9250614559602085016144ec565b91506144b5604085016144fd565b5f60208284031215614577575f80fd5b610ba182614470565b5f8060408385031215614591575f80fd5b61459a83614470565b946020939093013593505050565b5f80604083850312156145b9575f80fd5b82356001600160401b038111156145ce575f80fd5b8301608081860312156145df575f80fd5b91506145ed60208401614470565b90509250929050565b5f60208284031215614606575f80fd5b610ba1826144fd565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061464657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161468160608401826001600160401b03169052565b50608083015161469c60808401826001600160401b03169052565b5060a08301516146b760a08401826001600160401b03169052565b5060c083015161289e60c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561289e5761289e6146d2565b5f60208284031215614716575f80fd5b5051919050565b5f5b8381101561473757818101518382015260200161471f565b50505f910152565b602081525f825180602084015261475d81604085016020870161471d565b601f01601f19169190910160400192915050565b5f8261478b57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b038116811461227b575f80fd5b5f602082840312156147b4575f80fd5b8135610ba181614790565b5f808335601e198436030181126147d4575f80fd5b8301803591506001600160401b038211156147ed575f80fd5b6020019150600581901b3603821315612039575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261482c575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561486c5761486c614836565b60405290565b604051601f8201601f191681016001600160401b038111828210171561489a5761489a614836565b604052919050565b5f6001600160401b038211156148ba576148ba614836565b50601f01601f191660200190565b5f606082360312156148d8575f80fd5b6148e061484a565b8235815260206148f18185016144fd565b8183015260408401356001600160401b0381111561490d575f80fd5b840136601f82011261491d575f80fd5b803561493061492b826148a2565b614872565b8181523684838501011115614943575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f825161482c81846020870161471d565b80820180821115610b6e57610b6e6146d2565b5f63ffffffff80831681810361499b5761499b6146d2565b6001019392505050565b8082028115828204841417610b6e57610b6e6146d2565b6001600160401b0381811683821601908082111561289e5761289e6146d2565b600181811c908216806149f057607f821691505b6020821081036144e657634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614a20816149dc565b806020870152604060018084165f8114614a415760018114614a5d57614a8a565b60ff19851660408a0152604084151560051b8a01019550614a8a565b895f5260205f205f5b85811015614a815781548b8201860152908301908801614a66565b8a016040019650505b509398975050505050505050565b8051611c9881614463565b5f8060408385031215614ab4575f80fd5b82516001600160401b0380821115614aca575f80fd5b9084019060608287031215614add575f80fd5b614ae561484a565b82518152602080840151614af881614790565b82820152604084015183811115614b0d575f80fd5b80850194505087601f850112614b21575f80fd5b83519250614b3161492b846148a2565b8381528882858701011115614b44575f80fd5b614b538483830184880161471d565b80604084015250819550614b68818801614a98565b9450505050509250929050565b81810381811115610b6e57610b6e6146d2565b5f808335601e19843603018112614b9d575f80fd5b8301803591506001600160401b03821115614bb6575f80fd5b602001915036819003821315612039575f80fd5b6001600160401b03818116838216028082169190828114614bed57614bed6146d2565b505092915050565b5f6001600160401b0380831681810361499b5761499b6146d2565b5f60208284031215614c20575f80fd5b610ba1826144ec565b5f60208284031215614c39575f80fd5b813560ff81168114610ba1575f80fd5b601f821115611c6757805f5260205f20601f840160051c81016020851015614c6e5750805b601f840160051c820191505b81811015610c42575f8155600101614c7a565b81516001600160401b03811115614ca657614ca6614836565b614cba81614cb484546149dc565b84614c49565b602080601f831160018114614ced575f8415614cd65750858301515b5f19600386901b1c1916600185901b178555610d75565b5f85815260208120601f198616915b82811015614d1b57888601518255948401946001909101908401614cfc565b5085821015614d3857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614d9d81604e86016020890161471d565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 618f6346b..8bf777cae 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -378,7 +378,6 @@ abstract contract PoSValidatorManager is // so we have to wait for confirmation that the validator has been removed before returning the stake. uint64 delegatorStartTime; if (validator.status == ValidatorStatus.PendingRemoved) { - $._delegatorStakes[delegationID].endingNonce = validator.messageNonce; delegatorStartTime = validator.endedAt; } else { // Validator Active case From 1c5d5464730d206d9de7f61b9c01f92cbd1672ae Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 24 Sep 2024 14:09:43 -0500 Subject: [PATCH 404/545] address feedback --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../validator-manager/PoSValidatorManager.sol | 64 +++++++------------ 3 files changed, 24 insertions(+), 44 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 00c2f9ae2..b3000d5a7 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516159a13803806159a183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6158548061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c80638280a25a116100fe578063ba3a4b971161009e578063df93d8de1161006e578063df93d8de14610408578063e7d14c1c14610412578063eb0acb8914610450578063f09969ae14610463575f80fd5b8063ba3a4b97146103ba578063bee0a03f146103cd578063c974d1b6146103e0578063d5f20ff6146103e8575f80fd5b80639dde029a116100d95780639dde029a1461035b5780639e1bc4ef1461036e578063a3a65e4814610381578063b771b3bc14610394575f80fd5b80638280a25a1461032d57806393e245981461033557806398f3e2b414610348575f80fd5b8063467ef06f11610174578063620658561161014457806362065856146102df57806366435abf14610300578063732214f81461031357806376f786211461031a575f80fd5b8063467ef06f146102895780635297fae61461029c57806360305d62146102af57806361e2f490146102cc575f80fd5b806325e1c776116101af57806325e1c7761461021c5780632e2194d81461022f57806335455ded1461025a5780633a1cfff614610276575f80fd5b80630118acc4146101d55780630322ed98146101ea578063151d30d1146101fd575b5f80fd5b6101e86101e3366004614d70565b610476565b005b6101e86101f8366004614dab565b61081d565b610205600a81565b60405160ff90911681526020015b60405180910390f35b6101e861022a366004614dc2565b61098f565b61024261023d366004614dab565b6109ff565b6040516001600160401b039091168152602001610213565b61026361271081565b60405161ffff9091168152602001610213565b6101e8610284366004614d70565b610a15565b6101e8610297366004614dec565b610b8d565b6101e86102aa366004614e05565b610c2e565b6102b7601481565b60405163ffffffff9091168152602001610213565b6101e86102da366004614e2d565b611001565b6102f26102ed366004614e88565b611480565b604051908152602001610213565b61024261030e366004614dab565b611499565b6102f25f81565b6101e8610328366004614d70565b6114ad565b610205603081565b6101e8610343366004614dab565b611692565b6101e8610356366004614e05565b611749565b6101e8610369366004614dab565b6118db565b6102f261037c366004614ea1565b611b52565b6101e861038f366004614dec565b611b7e565b6103a26005600160991b0181565b6040516001600160a01b039091168152602001610213565b6101e86103c8366004614dab565b611ceb565b6101e86103db366004614dab565b611ec7565b610205601481565b6103fb6103f6366004614dab565b611fec565b6040516102139190614ed5565b6102426202a30081565b6102f2610420366004614dab565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102f261045e366004614f95565b6120b4565b6101e861047136600461500e565b6120e9565b5f8381525f805160206157888339815191526020526040808220815160e0810190925280545f805160206157c883398151915293929190829060ff1660038111156104c3576104c3614ec1565b60038111156104d4576104d4614ec1565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61054a82611fec565b905060028351600381111561056157610561614ec1565b1461057f5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105ac5760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f806002835160058111156105ca576105ca614ec1565b0361061b5787156105e2576105df84886121c8565b91505b5f856060015184608001516105f79190615060565b90506106038582612425565b506001600160401b031660c08701525042905061064d565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b59061067290611480565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106a29796959493929190615080565b602060405180830381865afa1580156106bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e191906150be565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561072057610720614ec1565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061080a9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206158288339815191526020526040808220815160e0810190925280545f805160206157e883398151915293929190829060ff16600581111561086a5761086a614ec1565b600581111561087b5761087b614ec1565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108ea576108ea614ec1565b146109085760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61092d8584606001515f61257c565b6040518263ffffffff1660e01b815260040161094991906150f7565b6020604051808303815f875af1158015610965573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098991906150be565b50505050565b610998826125d3565b6109b557604051636ca57bcf60e01b815260040160405180910390fd5b60026109c083611fec565b5160058111156109d2576109d2614ec1565b146109f05760405163a36c527f60e01b815260040160405180910390fd5b6109fa82826121c8565b505050565b5f610a0f64e8d4a5100083615129565b92915050565b5f805160206157c88339815191525f610a2d8561260e565b5f86815260048401602052604090205460a0820151919250610a6091600160b01b9091046001600160401b031690615148565b6001600160401b03168160c001516001600160401b03161015610a96576040516302336bad60e51b815260040160405180910390fd5b5f8415610aae57610aa786856121c8565b9050610ac9565b505f8581526008830160205260409020546001600160401b03165b600383015460408301516001600160a01b039091169063778c06b590610aee90611480565b60a085015160c08601516040516001600160e01b031960e086901b168152610b22939291829188905f908190600401615080565b602060405180830381865afa158015610b3d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6191906150be565b5f87815260078501602052604081208054909190610b80908490615168565b9091555050505050505050565b5f805160206157c88339815191525f80610ba68461284b565b91509150610bb3826125d3565b610bbd5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610bec57610bec614ec1565b03610c11575f83815260078501602052604081208054919055610c0f8282612adb565b505b610c2781610c228460400151611480565b612b51565b5050505050565b5f8181525f805160206157888339815191526020526040808220815160e0810190925280545f805160206157c883398151915293929190829060ff166003811115610c7b57610c7b614ec1565b6003811115610c8c57610c8c614ec1565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610d0390611fec565b905060015f85815260058501602052604090205460ff166003811115610d2b57610d2b614ec1565b14610d495760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610d5e57610d5e614ec1565b03610ea757600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610db857610db8614ec1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610ebc57610ebc614ec1565b03610eca57610c2784612b74565b5f80610ee1610ed888612d51565b60400151612e51565b509150915081846040015114610f0a57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610f5257505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b15610f7057604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206157e88339815191529060ff161561105357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611096573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110ba91906150be565b8360200135146110dd5760405163d040949d60e01b815260040160405180910390fd5b306110ee606085016040860161517b565b6001600160a01b0316146111155760405163e6c4247b60e01b815260040160405180910390fd5b5f6111236060850185615196565b905090505f805b828163ffffffff1610156113cf575f6111466060880188615196565b8363ffffffff1681811061115c5761115c6151db565b905060200281019061116e91906151ef565b6111779061529f565b80515f81815260088801602052604090205491925090156111ab57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f0135856040516020016111da92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526111f491615336565b602060405180830381855afa15801561120f573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061123291906150be565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156112be576112be614ec1565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611371911686615168565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806113c890615347565b905061112a565b50600483018190555f6113ed6113e486612d51565b6040015161308f565b90505f6113f987613204565b90508160028260405161140c9190615336565b602060405180830381855afa158015611427573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061144a91906150be565b1461146857604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610a0f6001600160401b03831664e8d4a51000615369565b5f6114a382611fec565b6080015192915050565b5f805160206157c88339815191525f6114c58561260e565b90506114d0856125d3565b6114db575050505050565b5f8581526004830160205260409020546001600160a01b031633146115135760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161154291600160b01b90046001600160401b031690615148565b6001600160401b03168160c001516001600160401b03161015611578576040516302336bad60e51b815260040160405180910390fd5b5f84156115905761158986856121c8565b90506115ab565b505f8581526008830160205260409020546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906115d090611480565b60a086015160c08701516040516001600160e01b031960e086901b168152611604939291829189905f908190600401615080565b602060405180830381865afa15801561161f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061164391906150be565b9050805f036116655760405163d802b9f360e01b815260040160405180910390fd5b5f87815260078501602052604081208054839290611684908490615168565b909155505050505050505050565b5f805160206157c883398151915260046116ab83611fec565b5160058111156116bd576116bd614ec1565b146116db5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146117135760405163e6c4247b60e01b815260040160405180910390fd5b5f828152600782016020908152604080832080549084905560048501909252909120546109fa906001600160a01b031682612adb565b61175161369d565b5f8181525f805160206157888339815191526020526040808220815160e0810190925280545f805160206157c883398151915293929190829060ff16600381111561179e5761179e614ec1565b60038111156117af576117af614ec1565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f80611821610ed887612d51565b50915091508183604001511461184a57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b0316111561188157604051633ab3447f60e11b815260040160405180910390fd5b60038351600381111561189657611896614ec1565b146118b45760405163f95c7fe160e01b815260040160405180910390fd5b6118bd85612b74565b505050506118d760015f8051602061580883398151915255565b5050565b6118e361369d565b5f8181525f805160206157888339815191526020526040808220815160e0810190925280545f805160206157c883398151915293929190829060ff16600381111561193057611930614ec1565b600381111561194157611941614ec1565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6119b782611fec565b90505f835160038111156119cd576119cd614ec1565b036119eb57604051631d0b665760e21b815260040160405180910390fd5b600481516005811115611a0057611a00614ec1565b14611a1e5760405163a36c527f60e01b815260040160405180910390fd5b600183516003811115611a3357611a33614ec1565b03611a4a57611a4185612b74565b50505050611b39565b600283516003811115611a5f57611a5f614ec1565b03611b2b57600384015460608401516001600160a01b039091169063778c06b590611a8990611480565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b168152611adb96959493926001600160401b0390921691908190600401615080565b602060405180830381865afa158015611af6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1a91906150be565b5f8681526006860160205260409020555b611b3485612b74565b505050505b611b4f60015f8051602061580883398151915255565b50565b5f611b5b61369d565b611b668333846136e7565b9050610a0f60015f8051602061580883398151915255565b5f805160206157e88339815191525f80611ba3611b9a85612d51565b604001516139ae565b9150915080611bc557604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068401602052604090208054611bdf90615380565b90505f03611c0057604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff166005811115611c2657611c26614ec1565b14611c445760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006840160205260408120611c5c91614cc0565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206157888339815191526020526040808220815160e0810190925280545f805160206157c883398151915293929190829060ff166003811115611d3857611d38614ec1565b6003811115611d4957611d49614ec1565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611dc257611dc2614ec1565b14158015611de35750600381516003811115611de057611de0614ec1565b14155b15611e015760405163f95c7fe160e01b815260040160405180910390fd5b5f611e0f8260400151611fec565b905080606001516001600160401b03165f03611e3e57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611e6b84604001518460600151856080015161257c565b6040518263ffffffff1660e01b8152600401611e8791906150f7565b6020604051808303815f875af1158015611ea3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c2791906150be565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206157e88339815191529190611f0e90615380565b90505f03611f2f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611f5557611f55614ec1565b14611f735760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fac91906004016153b8565b6020604051808303815f875af1158015611fc8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109fa91906150be565b611ff4614cf7565b5f8281525f80516020615828833981519152602052604090819020815160e0810190925280545f805160206157e8833981519152929190829060ff16600581111561204157612041614ec1565b600581111561205257612052614ec1565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6120bd61369d565b6120c985858585613b52565b90506120e160015f8051602061580883398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680612132575080546001600160401b03808416911610155b156121505760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561217b8484613cf0565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612213573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261223a919081019061544d565b915091508061225c57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561229f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122c391906150be565b8251146122e35760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561230f5760405163e6c4247b60e01b815260040160405180910390fd5b5f8061231e8460400151613d0a565b9150915081871461234257604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260409020545f805160206157c8833981519152906001600160401b0390811690831611156123c0575f8881526008820160205260409020805467ffffffffffffffff19166001600160401b0384161790556123dc565b5f8881526008820160205260409020546001600160401b031691505b6040516001600160401b038316815288907fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d04359060200160405180910390a2509695505050505050565b5f8281525f80516020615828833981519152602052604081206002015481905f805160206157e883398151915290600160801b90046001600160401b031661246d8582613ee5565b5f612477876140ae565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124c78a858b61257c565b6040518263ffffffff1660e01b81526004016124e391906150f7565b6020604051808303815f875af11580156124ff573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061252391906150be565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b612616614cf7565b5f8281525f805160206158288339815191526020526040808220815160e0810190925280545f805160206157e883398151915293929190829060ff16600581111561266357612663614ec1565b600581111561267457612674614ec1565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156126e6576126e6614ec1565b146127045760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561274857612748614ec1565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6127f48582612425565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f612854614cf7565b5f805160206157e88339815191525f80612870611b9a87612d51565b91509150801561289357604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128c4576128c4614ec1565b60058111156128d5576128d5614ec1565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561294457612944614ec1565b14158015612965575060018151600581111561296257612962614ec1565b14155b156129835760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561299857612998614ec1565b036129a657600481526129ab565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff191660018360058111156129f0576129f0614ec1565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612aa457612aa4614ec1565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f805160206157a883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612b36575f80fd5b505af1158015612b48573d5f803e3d5ffd5b50505050505050565b5f805160206157a8833981519152546118d7906001600160a01b03168383614123565b5f8181525f805160206157888339815191526020526040808220815160e0810190925280545f805160206157c883398151915293929190829060ff166003811115612bc157612bc1614ec1565b6003811115612bd257612bd2614ec1565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612ca790600160a01b900461ffff1684615369565b612cb19190615129565b905080856007015f8581526020019081526020015f205f828254612cd59190615168565b909155505f9050612ce6828461551f565b9050612cf6856020015182612adb565b612d0b8560200151610c228760600151611480565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612db5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612ddc919081019061544d565b9150915080612dfe57604051636b2f19e960e01b815260040160405180910390fd5b815115612e1e5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612e4a5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612e7657604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612ec557612e8d81600161551f565b612e98906008615369565b61ffff16868281518110612eae57612eae6151db565b016020015160f81c901b9190911790600101612e79565b5061ffff811615612ee95760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612f4457612f0081600361551f565b612f0b906008615369565b63ffffffff1687612f1d836002615168565b81518110612f2d57612f2d6151db565b016020015160f81c901b9190911790600101612eec565b5063ffffffff8116600414612f6c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fc157612f8381601f61551f565b612f8e906008615369565b88612f9a836006615168565b81518110612faa57612faa6151db565b016020015160f81c901b9190911790600101612f6f565b505f805b600881101561302057612fd981600761551f565b612fe4906008615369565b6001600160401b031689612ff9836026615168565b81518110613009576130096151db565b016020015160f81c901b9190911790600101612fc5565b505f805b600881101561307f5761303881600761551f565b613043906008615369565b6001600160401b03168a61305883602e615168565b81518110613068576130686151db565b016020015160f81c901b9190911790600101613024565b5091989097509095509350505050565b5f81516026146130b257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613101576130c981600161551f565b6130d4906008615369565b61ffff168482815181106130ea576130ea6151db565b016020015160f81c901b91909117906001016130b5565b5061ffff8116156131255760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156131805761313c81600361551f565b613147906008615369565b63ffffffff1685613159836002615168565b81518110613169576131696151db565b016020015160f81c901b9190911790600101613128565b5063ffffffff8116156131a657604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131fb576131bd81601f61551f565b6131c8906008615369565b866131d4836006615168565b815181106131e4576131e46151db565b016020015160f81c901b91909117906001016131a9565b50949350505050565b60605f61321383830184615196565b61321f91506058615369565b61322a90605c615168565b6001600160401b038111156132415761324161520d565b6040519080825280601f01601f19166020018201604052801561326b576020820181803683370190505b5090505f5b60208110156132c0578335816020811061328c5761328c6151db565b1a60f81b8282815181106132a2576132a26151db565b60200101906001600160f81b03191690815f1a905350600101613270565b505f5b602081101561332057836020013581602081106132e2576132e26151db565b1a60f81b826132f2836020615168565b81518110613302576133026151db565b60200101906001600160f81b03191690815f1a9053506001016132c3565b505f5b60048110156133835761333781600361551f565b613342906008615369565b6014901c60f81b82613355836040615168565b81518110613365576133656151db565b60200101906001600160f81b03191690815f1a905350600101613323565b505f613395606085016040860161517b565b60601b90505f5b60148110156133f5578181601481106133b7576133b76151db565b1a60f81b836133c7836044615168565b815181106133d7576133d76151db565b60200101906001600160f81b03191690815f1a90535060010161339c565b505f6134046060860186615196565b905090505f5b600481101561346f5761341e81600361551f565b613429906008615369565b63ffffffff8316901c60f81b84613441836058615168565b81518110613451576134516151db565b60200101906001600160f81b03191690815f1a90535060010161340a565b505f5b61347f6060870187615196565b9050811015613693575f613494826058615369565b61349f90605c615168565b90505f5b602081101561352a576134b96060890189615196565b848181106134c9576134c96151db565b90506020028101906134db91906151ef565b3581602081106134ed576134ed6151db565b1a60f81b866134fc8385615168565b8151811061350c5761350c6151db565b60200101906001600160f81b03191690815f1a9053506001016134a3565b505f5b60088110156135df5761354181600761551f565b61354c906008615369565b61355960608a018a615196565b85818110613569576135696151db565b905060200281019061357b91906151ef565b61358c906040810190602001614e88565b6001600160401b0316901c60f81b86826135a7856020615168565b6135b19190615168565b815181106135c1576135c16151db565b60200101906001600160f81b03191690815f1a90535060010161352d565b505f5b6030811015613689576135f86060890189615196565b84818110613608576136086151db565b905060200281019061361a91906151ef565b613628906040810190615532565b82818110613638576136386151db565b9050013560f81c60f81b86828460286136519190615168565b61365b9190615168565b8151811061366b5761366b6151db565b60200101906001600160f81b03191690815f1a9053506001016135e2565b5050600101613472565b5091949350505050565b5f805160206158088339815191528054600119016136ce57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061580883398151915255565b5f5f805160206157c88339815191528161370361023d85614182565b90505f61370f87611fec565b905061371a876125d3565b61373757604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561374c5761374c614ec1565b1461376a5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161377b9190615148565b905083600201600a9054906101000a90046001600160401b031682604001516137a49190615574565b6001600160401b0316816001600160401b031611156137d657604051630c192e7760e41b815260040160405180910390fd5b5f806137e28a84612425565b915091505f8a8360405160200161381092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156138a3576138a3614ec1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146139d257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613a21576139e981600161551f565b6139f4906008615369565b61ffff16858281518110613a0a57613a0a6151db565b016020015160f81c901b91909117906001016139d5565b5061ffff811615613a455760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613aa057613a5c81600361551f565b613a67906008615369565b63ffffffff1686613a79836002615168565b81518110613a8957613a896151db565b016020015160f81c901b9190911790600101613a48565b5063ffffffff8116600314613ac857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b1d57613adf81601f61551f565b613aea906008615369565b87613af6836006615168565b81518110613b0657613b066151db565b016020015160f81c901b9190911790600101613acb565b505f86602681518110613b3257613b326151db565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206157c883398151915290600160401b900461ffff9081169086161080613ba6575061271061ffff8616115b15613bc45760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613bf6576040516302336bad60e51b815260040160405180910390fd5b8054831080613c085750806001015483115b15613c2657604051630103be3b60e21b815260040160405180910390fd5b5f613c3084614182565b90505f613c3c826109ff565b90505f613c4989836141a5565b90506040518060600160405280613c5d3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613cf861458f565b613d01826145da565b6118d781614648565b5f808251602e14613d2e57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613d7d57613d4581600161551f565b613d50906008615369565b61ffff16858281518110613d6657613d666151db565b016020015160f81c901b9190911790600101613d31565b5061ffff811615613da15760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613dfc57613db881600361551f565b613dc3906008615369565b63ffffffff1686613dd5836002615168565b81518110613de557613de56151db565b016020015160f81c901b9190911790600101613da4565b5063ffffffff8116600514613e2457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613e7957613e3b81601f61551f565b613e46906008615369565b87613e52836006615168565b81518110613e6257613e626151db565b016020015160f81c901b9190911790600101613e27565b505f805b6008811015613ed857613e9181600761551f565b613e9c906008615369565b6001600160401b031688613eb1836026615168565b81518110613ec157613ec16151db565b016020015160f81c901b9190911790600101613e7d565b5090969095509350505050565b5f805160206157e88339815191525f6001600160401b038084169085161115613f1957613f128385615060565b9050613f26565b613f238484615060565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613f88575060018401548151613f84916001600160401b031690615168565b8210155b15613fae576001600160401b038316606082015281815260408101516020820152613fcd565b8281606001818151613fc09190615148565b6001600160401b03169052505b6060810151613fdd906064615574565b602082015160018601546001600160401b0392909216916140089190600160401b900460ff16615369565b10156140275760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516140429190615168565b9052506040810180516001600160401b038716919061406290839061551f565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206158288339815191526020526040812060020180545f805160206157e883398151915291906008906140f890600160401b90046001600160401b031661559f565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b038381166024830152604482018390526109fa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146a5565b5f610a0f825f805160206157a8833981519152546001600160a01b03169061470b565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166141e957604051637fab81e560e01b815260040160405180910390fd5b5f805160206157e8833981519152426142086040860160208701614e88565b6001600160401b031611158061424257506142266202a30042615168565b6142366040860160208701614e88565b6001600160401b031610155b1561425f5760405162d36c8560e81b815260040160405180910390fd5b603061426e6040860186615532565b905014158061427c57508335155b1561429a5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f908152600882016020526040902054156142ca57604051630eb0d31360e11b815260040160405180910390fd5b6142d4835f613ee5565b5f8061436d6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906143189190614e88565b6001600160401b0316815260200161433360408a018a615532565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061486d565b5f8281526006860160205260409020919350915061438b82826155fe565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906143c99085906004016150f7565b6020604051808303815f875af11580156143e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061440991906150be565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561448157614481614ec1565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614561918e01908e01614e88565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166145d857604051631afcd79f60e31b815260040160405180910390fd5b565b6145e261458f565b6145eb81614930565b6145f3614949565b611b4f6060820135608083013561461060c0850160a08601614e88565b61462060e0860160c087016156bd565b614631610100870160e088016156d6565b6146436101208801610100890161517b565b614959565b61465061458f565b5f805160206157a88339815191526001600160a01b0382166146855760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6146b96001600160a01b03841683614a7a565b905080515f141580156146dd5750808060200190518101906146db91906156f6565b155b156109fa57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614751573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061477591906150be565b905061478c6001600160a01b038516333086614a87565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156147d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147f491906150be565b905081811161485a5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401614702565b614864828261551f565b95945050505050565b5f606082608001515160301461489657604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016148c89796959493929190615711565b60405160208183030381529060405290506002816040516148e99190615336565b602060405180830381855afa158015614904573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061492791906150be565b94909350915050565b61493861458f565b614940614ac0565b611b4f81614ac8565b61495161458f565b6145d8614b9a565b61496161458f565b5f805160206157c883398151915261ffff84161580614985575061271061ffff8516115b156149a35760405163c98d73a760e01b815260040160405180910390fd5b858711156149c457604051630103be3b60e21b815260040160405180910390fd5b60ff831615806149d75750600a60ff8416115b156149f5576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b60606125cc83835f614ba2565b6040516001600160a01b0384811660248301528381166044830152606482018390526109899186918216906323b872dd90608401614150565b6145d861458f565b614ad061458f565b80355f805160206157e88339815191529081556014614af560608401604085016156d6565b60ff161180614b145750614b0f60608301604084016156d6565b60ff16155b15614b325760405163b4fa3fb360e01b815260040160405180910390fd5b614b4260608301604084016156d6565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614b736040830160208401614e88565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6136d461458f565b606081471015614bc75760405163cd78605960e01b8152306004820152602401614702565b5f80856001600160a01b03168486604051614be29190615336565b5f6040518083038185875af1925050503d805f8114614c1c576040519150601f19603f3d011682016040523d82523d5f602084013e614c21565b606091505b5091509150614c31868383614c3b565b9695505050505050565b606082614c5057614c4b82614c97565b6125cc565b8151158015614c6757506001600160a01b0384163b155b15614c9057604051639996b31560e01b81526001600160a01b0385166004820152602401614702565b50806125cc565b805115614ca75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ccc90615380565b5f825580601f10614cdb575050565b601f0160209004905f5260205f2090810190611b4f9190614d33565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614d47575f8155600101614d34565b5090565b8015158114611b4f575f80fd5b803563ffffffff81168114614d6b575f80fd5b919050565b5f805f60608486031215614d82575f80fd5b833592506020840135614d9481614d4b565b9150614da260408501614d58565b90509250925092565b5f60208284031215614dbb575f80fd5b5035919050565b5f8060408385031215614dd3575f80fd5b82359150614de360208401614d58565b90509250929050565b5f60208284031215614dfc575f80fd5b6125cc82614d58565b5f8060408385031215614e16575f80fd5b614e1f83614d58565b946020939093013593505050565b5f8060408385031215614e3e575f80fd5b82356001600160401b03811115614e53575f80fd5b830160808186031215614e64575f80fd5b9150614de360208401614d58565b80356001600160401b0381168114614d6b575f80fd5b5f60208284031215614e98575f80fd5b6125cc82614e72565b5f8060408385031215614eb2575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614ef857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614f3360608401826001600160401b03169052565b506080830151614f4e60808401826001600160401b03169052565b5060a0830151614f6960a08401826001600160401b03169052565b5060c0830151612e4a60c08401826001600160401b03169052565b803561ffff81168114614d6b575f80fd5b5f805f8060808587031215614fa8575f80fd5b84356001600160401b03811115614fbd575f80fd5b850160608188031215614fce575f80fd5b9350614fdc60208601614f84565b9250614fea60408601614e72565b9396929550929360600135925050565b6001600160a01b0381168114611b4f575f80fd5b5f80828403610140811215615021575f80fd5b61012080821215615030575f80fd5b849350830135905061504181614ffa565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612e4a57612e4a61504c565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f602082840312156150ce575f80fd5b5051919050565b5f5b838110156150ef5781810151838201526020016150d7565b50505f910152565b602081525f82518060208401526151158160408501602087016150d5565b601f01601f19169190910160400192915050565b5f8261514357634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160401b03818116838216019080821115612e4a57612e4a61504c565b80820180821115610a0f57610a0f61504c565b5f6020828403121561518b575f80fd5b81356125cc81614ffa565b5f808335601e198436030181126151ab575f80fd5b8301803591506001600160401b038211156151c4575f80fd5b6020019150600581901b3603821315612575575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615203575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156152435761524361520d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156152715761527161520d565b604052919050565b5f6001600160401b038211156152915761529161520d565b50601f01601f191660200190565b5f606082360312156152af575f80fd5b6152b7615221565b8235815260206152c8818501614e72565b8183015260408401356001600160401b038111156152e4575f80fd5b840136601f8201126152f4575f80fd5b803561530761530282615279565b615249565b818152368483850101111561531a575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516152038184602087016150d5565b5f63ffffffff80831681810361535f5761535f61504c565b6001019392505050565b8082028115828204841417610a0f57610a0f61504c565b600181811c9082168061539457607f821691505b6020821081036153b257634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546153ca81615380565b806020870152604060018084165f81146153eb576001811461540757615434565b60ff19851660408a0152604084151560051b8a01019550615434565b895f5260205f205f5b8581101561542b5781548b8201860152908301908801615410565b8a016040019650505b509398975050505050505050565b8051614d6b81614d4b565b5f806040838503121561545e575f80fd5b82516001600160401b0380821115615474575f80fd5b9084019060608287031215615487575f80fd5b61548f615221565b825181526020808401516154a281614ffa565b828201526040840151838111156154b7575f80fd5b80850194505087601f8501126154cb575f80fd5b835192506154db61530284615279565b83815288828587010111156154ee575f80fd5b6154fd848383018488016150d5565b80604084015250819550615512818801615442565b9450505050509250929050565b81810381811115610a0f57610a0f61504c565b5f808335601e19843603018112615547575f80fd5b8301803591506001600160401b03821115615560575f80fd5b602001915036819003821315612575575f80fd5b6001600160401b038181168382160280821691908281146155975761559761504c565b505092915050565b5f6001600160401b0380831681810361535f5761535f61504c565b601f8211156109fa57805f5260205f20601f840160051c810160208510156155df5750805b601f840160051c820191505b81811015610c27575f81556001016155eb565b81516001600160401b038111156156175761561761520d565b61562b816156258454615380565b846155ba565b602080601f83116001811461565e575f84156156475750858301515b5f19600386901b1c1916600185901b1785556156b5565b5f85815260208120601f198616915b8281101561568c5788860151825594840194600190910190840161566d565b50858210156156a957878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156156cd575f80fd5b6125cc82614f84565b5f602082840312156156e6575f80fd5b813560ff811681146125cc575f80fd5b5f60208284031215615706575f80fd5b81516125cc81614d4b565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161576681604e8601602089016150d5565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161585638038061585683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6157098061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c80638280a25a116100fe578063ba3a4b971161009e578063df93d8de1161006e578063df93d8de14610408578063e7d14c1c14610412578063eb0acb8914610450578063f09969ae14610463575f80fd5b8063ba3a4b97146103ba578063bee0a03f146103cd578063c974d1b6146103e0578063d5f20ff6146103e8575f80fd5b80639dde029a116100d95780639dde029a1461035b5780639e1bc4ef1461036e578063a3a65e4814610381578063b771b3bc14610394575f80fd5b80638280a25a1461032d57806393e245981461033557806398f3e2b414610348575f80fd5b8063467ef06f11610174578063620658561161014457806362065856146102df57806366435abf14610300578063732214f81461031357806376f786211461031a575f80fd5b8063467ef06f146102895780635297fae61461029c57806360305d62146102af57806361e2f490146102cc575f80fd5b806325e1c776116101af57806325e1c7761461021c5780632e2194d81461022f57806335455ded1461025a5780633a1cfff614610276575f80fd5b80630118acc4146101d55780630322ed98146101ea578063151d30d1146101fd575b5f80fd5b6101e86101e3366004614c25565b610476565b005b6101e86101f8366004614c60565b61081d565b610205600a81565b60405160ff90911681526020015b60405180910390f35b6101e861022a366004614c77565b61098f565b61024261023d366004614c60565b6109ff565b6040516001600160401b039091168152602001610213565b61026361271081565b60405161ffff9091168152602001610213565b6101e8610284366004614c25565b610a15565b6101e8610297366004614ca1565b610a20565b6101e86102aa366004614cba565b610ac1565b6102b7601481565b60405163ffffffff9091168152602001610213565b6101e86102da366004614ce2565b610e94565b6102f26102ed366004614d3d565b611313565b604051908152602001610213565b61024261030e366004614c60565b61132c565b6102f25f81565b6101e8610328366004614c25565b611340565b610205603081565b6101e8610343366004614c60565b61136e565b6101e8610356366004614cba565b611425565b6101e8610369366004614c60565b6115b7565b6102f261037c366004614d56565b61182e565b6101e861038f366004614ca1565b61185a565b6103a26005600160991b0181565b6040516001600160a01b039091168152602001610213565b6101e86103c8366004614c60565b6119c7565b6101e86103db366004614c60565b611ba3565b610205601481565b6103fb6103f6366004614c60565b611cc8565b6040516102139190614d8a565b6102426202a30081565b6102f2610420366004614c60565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102f261045e366004614e4a565b611d90565b6101e8610471366004614ec3565b611dc5565b5f8381525f8051602061563d8339815191526020526040808220815160e0810190925280545f8051602061567d83398151915293929190829060ff1660038111156104c3576104c3614d76565b60038111156104d4576104d4614d76565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61054a82611cc8565b905060028351600381111561056157610561614d76565b1461057f5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105ac5760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f806002835160058111156105ca576105ca614d76565b0361061b5787156105e2576105df8488611ea4565b91505b5f856060015184608001516105f79190614f15565b905061060385826120fc565b506001600160401b031660c08701525042905061064d565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b59061067290611313565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106a29796959493929190614f35565b602060405180830381865afa1580156106bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e19190614f73565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561072057610720614d76565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061080a9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206156dd8339815191526020526040808220815160e0810190925280545f8051602061569d83398151915293929190829060ff16600581111561086a5761086a614d76565b600581111561087b5761087b614d76565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108ea576108ea614d76565b146109085760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61092d8584606001515f612253565b6040518263ffffffff1660e01b81526004016109499190614fac565b6020604051808303815f875af1158015610965573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109899190614f73565b50505050565b610998826122aa565b6109b557604051636ca57bcf60e01b815260040160405180910390fd5b60026109c083611cc8565b5160058111156109d2576109d2614d76565b146109f05760405163a36c527f60e01b815260040160405180910390fd5b6109fa8282611ea4565b505050565b5f610a0f64e8d4a5100083614fde565b92915050565b6109898383836122e5565b5f8051602061567d8339815191525f80610a39846124c3565b91509150610a46826122aa565b610a505750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610a7f57610a7f614d76565b03610aa4575f83815260078501602052604081208054919055610aa28282612753565b505b610aba81610ab58460400151611313565b6127c9565b5050505050565b5f8181525f8051602061563d8339815191526020526040808220815160e0810190925280545f8051602061567d83398151915293929190829060ff166003811115610b0e57610b0e614d76565b6003811115610b1f57610b1f614d76565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610b9690611cc8565b905060015f85815260058501602052604090205460ff166003811115610bbe57610bbe614d76565b14610bdc5760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610bf157610bf1614d76565b03610d3a57600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610c4b57610c4b614d76565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610d4f57610d4f614d76565b03610d5d57610aba846127ec565b5f80610d74610d6b886129c9565b60400151612ac9565b509150915081846040015114610d9d57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610de557505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b15610e0357604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061569d8339815191529060ff1615610ee657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4d9190614f73565b836020013514610f705760405163d040949d60e01b815260040160405180910390fd5b30610f816060850160408601614ffd565b6001600160a01b031614610fa85760405163e6c4247b60e01b815260040160405180910390fd5b5f610fb66060850185615018565b905090505f805b828163ffffffff161015611262575f610fd96060880188615018565b8363ffffffff16818110610fef57610fef61505d565b90506020028101906110019190615071565b61100a90615121565b80515f818152600888016020526040902054919250901561103e57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161106d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052611087916151b8565b602060405180830381855afa1580156110a2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110c59190614f73565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561115157611151614d76565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112049116866151c9565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061125b906151dc565b9050610fbd565b50600483018190555f611280611277866129c9565b60400151612d07565b90505f61128c87612e7c565b90508160028260405161129f91906151b8565b602060405180830381855afa1580156112ba573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112dd9190614f73565b146112fb57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610a0f6001600160401b03831664e8d4a510006151fe565b5f61133682611cc8565b6080015192915050565b5f61134c8484846122e5565b9050805f036109895760405163d802b9f360e01b815260040160405180910390fd5b5f8051602061567d833981519152600461138783611cc8565b51600581111561139957611399614d76565b146113b75760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146113ef5760405163e6c4247b60e01b815260040160405180910390fd5b5f828152600782016020908152604080832080549084905560048501909252909120546109fa906001600160a01b031682612753565b61142d613315565b5f8181525f8051602061563d8339815191526020526040808220815160e0810190925280545f8051602061567d83398151915293929190829060ff16600381111561147a5761147a614d76565b600381111561148b5761148b614d76565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f806114fd610d6b876129c9565b50915091508183604001511461152657604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b0316111561155d57604051633ab3447f60e11b815260040160405180910390fd5b60038351600381111561157257611572614d76565b146115905760405163f95c7fe160e01b815260040160405180910390fd5b611599856127ec565b505050506115b360015f805160206156bd83398151915255565b5050565b6115bf613315565b5f8181525f8051602061563d8339815191526020526040808220815160e0810190925280545f8051602061567d83398151915293929190829060ff16600381111561160c5761160c614d76565b600381111561161d5761161d614d76565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61169382611cc8565b90505f835160038111156116a9576116a9614d76565b036116c757604051631d0b665760e21b815260040160405180910390fd5b6004815160058111156116dc576116dc614d76565b146116fa5760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561170f5761170f614d76565b036117265761171d856127ec565b50505050611815565b60028351600381111561173b5761173b614d76565b0361180757600384015460608401516001600160a01b039091169063778c06b59061176590611313565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b1681526117b796959493926001600160401b0390921691908190600401614f35565b602060405180830381865afa1580156117d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f69190614f73565b5f8681526006860160205260409020555b611810856127ec565b505050505b61182b60015f805160206156bd83398151915255565b50565b5f611837613315565b61184283338461335f565b9050610a0f60015f805160206156bd83398151915255565b5f8051602061569d8339815191525f8061187f611876856129c9565b60400151613626565b91509150806118a157604051633dbcaef760e01b815260040160405180910390fd5b5f828152600684016020526040902080546118bb90615215565b90505f036118dc57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff16600581111561190257611902614d76565b146119205760405163a36c527f60e01b815260040160405180910390fd5b5f828152600684016020526040812061193891614b75565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f8051602061563d8339815191526020526040808220815160e0810190925280545f8051602061567d83398151915293929190829060ff166003811115611a1457611a14614d76565b6003811115611a2557611a25614d76565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a9e57611a9e614d76565b14158015611abf5750600381516003811115611abc57611abc614d76565b14155b15611add5760405163f95c7fe160e01b815260040160405180910390fd5b5f611aeb8260400151611cc8565b905080606001516001600160401b03165f03611b1a57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611b47846040015184606001518560800151612253565b6040518263ffffffff1660e01b8152600401611b639190614fac565b6020604051808303815f875af1158015611b7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba9190614f73565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061569d8339815191529190611bea90615215565b90505f03611c0b57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611c3157611c31614d76565b14611c4f5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c88919060040161524d565b6020604051808303815f875af1158015611ca4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109fa9190614f73565b611cd0614bac565b5f8281525f805160206156dd833981519152602052604090819020815160e0810190925280545f8051602061569d833981519152929190829060ff166005811115611d1d57611d1d614d76565b6005811115611d2e57611d2e614d76565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611d99613315565b611da5858585856137ca565b9050611dbd60015f805160206156bd83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611e0e575080546001600160401b03808416911610155b15611e2c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611e578484613968565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611eef573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f1691908101906152e2565b9150915080611f3857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9f9190614f73565b825114611fbf5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611feb5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ffa8460400151613982565b9150915081871461201e57604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260409020545f8051602061567d833981519152906001600160401b0390811690831611156120d5575f888152600882016020908152604091829020805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26120f1565b5f8881526008820160205260409020546001600160401b031691505b509695505050505050565b5f8281525f805160206156dd833981519152602052604081206002015481905f8051602061569d83398151915290600160801b90046001600160401b03166121448582613b5d565b5f61214e87613d26565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61219e8a858b612253565b6040518263ffffffff1660e01b81526004016121ba9190614fac565b6020604051808303815f875af11580156121d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fa9190614f73565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061567d833981519152816122fe86613d9b565b9050612309866122aa565b61232657604051636ca57bcf60e01b815260040160405180910390fd5b5f8681526004830160205260409020546001600160a01b0316331461235e5760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a082015161238d91600160b01b90046001600160401b0316906153b4565b6001600160401b03168160c001516001600160401b031610156123c3576040516302336bad60e51b815260040160405180910390fd5b5f85156123db576123d48786611ea4565b90506123f6565b505f8681526008830160205260409020546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061241b90611313565b60a086015160c08701516040516001600160e01b031960e086901b16815261244f939291829189905f908190600401614f35565b602060405180830381865afa15801561246a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e9190614f73565b905080846007015f8a81526020019081526020015f205f8282546124b291906151c9565b909155509098975050505050505050565b5f6124cc614bac565b5f8051602061569d8339815191525f806124e8611876876129c9565b91509150801561250b57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561253c5761253c614d76565b600581111561254d5761254d614d76565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125bc576125bc614d76565b141580156125dd57506001815160058111156125da576125da614d76565b14155b156125fb5760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561261057612610614d76565b0361261e5760048152612623565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff1916600183600581111561266857612668614d76565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561271c5761271c614d76565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f8051602061565d83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156127ae575f80fd5b505af11580156127c0573d5f803e3d5ffd5b50505050505050565b5f8051602061565d833981519152546115b3906001600160a01b03168383613fd8565b5f8181525f8051602061563d8339815191526020526040808220815160e0810190925280545f8051602061567d83398151915293929190829060ff16600381111561283957612839614d76565b600381111561284a5761284a614d76565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687018252828120805490829055848252600488019092529182205493945091926127109061291f90600160a01b900461ffff16846151fe565b6129299190614fde565b905080856007015f8581526020019081526020015f205f82825461294d91906151c9565b909155505f905061295e82846153d4565b905061296e856020015182612753565b6129838560200151610ab58760600151611313565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a2d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a5491908101906152e2565b9150915080612a7657604051636b2f19e960e01b815260040160405180910390fd5b815115612a965760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612ac25760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612aee57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b3d57612b058160016153d4565b612b109060086151fe565b61ffff16868281518110612b2657612b2661505d565b016020015160f81c901b9190911790600101612af1565b5061ffff811615612b615760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612bbc57612b788160036153d4565b612b839060086151fe565b63ffffffff1687612b958360026151c9565b81518110612ba557612ba561505d565b016020015160f81c901b9190911790600101612b64565b5063ffffffff8116600414612be457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c3957612bfb81601f6153d4565b612c069060086151fe565b88612c128360066151c9565b81518110612c2257612c2261505d565b016020015160f81c901b9190911790600101612be7565b505f805b6008811015612c9857612c518160076153d4565b612c5c9060086151fe565b6001600160401b031689612c718360266151c9565b81518110612c8157612c8161505d565b016020015160f81c901b9190911790600101612c3d565b505f805b6008811015612cf757612cb08160076153d4565b612cbb9060086151fe565b6001600160401b03168a612cd083602e6151c9565b81518110612ce057612ce061505d565b016020015160f81c901b9190911790600101612c9c565b5091989097509095509350505050565b5f8151602614612d2a57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612d7957612d418160016153d4565b612d4c9060086151fe565b61ffff16848281518110612d6257612d6261505d565b016020015160f81c901b9190911790600101612d2d565b5061ffff811615612d9d5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612df857612db48160036153d4565b612dbf9060086151fe565b63ffffffff1685612dd18360026151c9565b81518110612de157612de161505d565b016020015160f81c901b9190911790600101612da0565b5063ffffffff811615612e1e57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612e7357612e3581601f6153d4565b612e409060086151fe565b86612e4c8360066151c9565b81518110612e5c57612e5c61505d565b016020015160f81c901b9190911790600101612e21565b50949350505050565b60605f612e8b83830184615018565b612e97915060586151fe565b612ea290605c6151c9565b6001600160401b03811115612eb957612eb961508f565b6040519080825280601f01601f191660200182016040528015612ee3576020820181803683370190505b5090505f5b6020811015612f385783358160208110612f0457612f0461505d565b1a60f81b828281518110612f1a57612f1a61505d565b60200101906001600160f81b03191690815f1a905350600101612ee8565b505f5b6020811015612f985783602001358160208110612f5a57612f5a61505d565b1a60f81b82612f6a8360206151c9565b81518110612f7a57612f7a61505d565b60200101906001600160f81b03191690815f1a905350600101612f3b565b505f5b6004811015612ffb57612faf8160036153d4565b612fba9060086151fe565b6014901c60f81b82612fcd8360406151c9565b81518110612fdd57612fdd61505d565b60200101906001600160f81b03191690815f1a905350600101612f9b565b505f61300d6060850160408601614ffd565b60601b90505f5b601481101561306d5781816014811061302f5761302f61505d565b1a60f81b8361303f8360446151c9565b8151811061304f5761304f61505d565b60200101906001600160f81b03191690815f1a905350600101613014565b505f61307c6060860186615018565b905090505f5b60048110156130e7576130968160036153d4565b6130a19060086151fe565b63ffffffff8316901c60f81b846130b98360586151c9565b815181106130c9576130c961505d565b60200101906001600160f81b03191690815f1a905350600101613082565b505f5b6130f76060870187615018565b905081101561330b575f61310c8260586151fe565b61311790605c6151c9565b90505f5b60208110156131a2576131316060890189615018565b848181106131415761314161505d565b90506020028101906131539190615071565b3581602081106131655761316561505d565b1a60f81b8661317483856151c9565b815181106131845761318461505d565b60200101906001600160f81b03191690815f1a90535060010161311b565b505f5b6008811015613257576131b98160076153d4565b6131c49060086151fe565b6131d160608a018a615018565b858181106131e1576131e161505d565b90506020028101906131f39190615071565b613204906040810190602001614d3d565b6001600160401b0316901c60f81b868261321f8560206151c9565b61322991906151c9565b815181106132395761323961505d565b60200101906001600160f81b03191690815f1a9053506001016131a5565b505f5b6030811015613301576132706060890189615018565b848181106132805761328061505d565b90506020028101906132929190615071565b6132a09060408101906153e7565b828181106132b0576132b061505d565b9050013560f81c60f81b86828460286132c991906151c9565b6132d391906151c9565b815181106132e3576132e361505d565b60200101906001600160f81b03191690815f1a90535060010161325a565b50506001016130ea565b5091949350505050565b5f805160206156bd83398151915280546001190161334657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206156bd83398151915255565b5f5f8051602061567d8339815191528161337b61023d85614037565b90505f61338787611cc8565b9050613392876122aa565b6133af57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156133c4576133c4614d76565b146133e25760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516133f391906153b4565b905083600201600a9054906101000a90046001600160401b0316826040015161341c9190615429565b6001600160401b0316816001600160401b0316111561344e57604051630c192e7760e41b815260040160405180910390fd5b5f8061345a8a846120fc565b915091505f8a8360405160200161348892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561351b5761351b614d76565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461364a57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613699576136618160016153d4565b61366c9060086151fe565b61ffff168582815181106136825761368261505d565b016020015160f81c901b919091179060010161364d565b5061ffff8116156136bd5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613718576136d48160036153d4565b6136df9060086151fe565b63ffffffff16866136f18360026151c9565b815181106137015761370161505d565b016020015160f81c901b91909117906001016136c0565b5063ffffffff811660031461374057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137955761375781601f6153d4565b6137629060086151fe565b8761376e8360066151c9565b8151811061377e5761377e61505d565b016020015160f81c901b9190911790600101613743565b505f866026815181106137aa576137aa61505d565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061567d83398151915290600160401b900461ffff908116908616108061381e575061271061ffff8616115b1561383c5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561386e576040516302336bad60e51b815260040160405180910390fd5b80548310806138805750806001015483115b1561389e57604051630103be3b60e21b815260040160405180910390fd5b5f6138a884614037565b90505f6138b4826109ff565b90505f6138c1898361405a565b905060405180606001604052806138d53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613970614444565b6139798261448f565b6115b3816144fd565b5f808251602e146139a657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156139f5576139bd8160016153d4565b6139c89060086151fe565b61ffff168582815181106139de576139de61505d565b016020015160f81c901b91909117906001016139a9565b5061ffff811615613a195760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613a7457613a308160036153d4565b613a3b9060086151fe565b63ffffffff1686613a4d8360026151c9565b81518110613a5d57613a5d61505d565b016020015160f81c901b9190911790600101613a1c565b5063ffffffff8116600514613a9c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613af157613ab381601f6153d4565b613abe9060086151fe565b87613aca8360066151c9565b81518110613ada57613ada61505d565b016020015160f81c901b9190911790600101613a9f565b505f805b6008811015613b5057613b098160076153d4565b613b149060086151fe565b6001600160401b031688613b298360266151c9565b81518110613b3957613b3961505d565b016020015160f81c901b9190911790600101613af5565b5090969095509350505050565b5f8051602061569d8339815191525f6001600160401b038084169085161115613b9157613b8a8385614f15565b9050613b9e565b613b9b8484614f15565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613c00575060018401548151613bfc916001600160401b0316906151c9565b8210155b15613c26576001600160401b038316606082015281815260408101516020820152613c45565b8281606001818151613c3891906153b4565b6001600160401b03169052505b6060810151613c55906064615429565b602082015160018601546001600160401b039290921691613c809190600160401b900460ff166151fe565b1015613c9f5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613cba91906151c9565b9052506040810180516001600160401b0387169190613cda9083906153d4565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206156dd8339815191526020526040812060020180545f8051602061569d8339815191529190600890613d7090600160401b90046001600160401b0316615454565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b613da3614bac565b5f8281525f805160206156dd8339815191526020526040808220815160e0810190925280545f8051602061569d83398151915293929190829060ff166005811115613df057613df0614d76565b6005811115613e0157613e01614d76565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e7357613e73614d76565b14613e915760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ed557613ed5614d76565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f8185826120fc565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526109fa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061455a565b5f610a0f825f8051602061565d833981519152546001600160a01b0316906145c0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661409e57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061569d833981519152426140bd6040860160208701614d3d565b6001600160401b03161115806140f757506140db6202a300426151c9565b6140eb6040860160208701614d3d565b6001600160401b031610155b156141145760405162d36c8560e81b815260040160405180910390fd5b603061412360408601866153e7565b905014158061413157508335155b1561414f5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561417f57604051630eb0d31360e11b815260040160405180910390fd5b614189835f613b5d565b5f806142226040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906141cd9190614d3d565b6001600160401b031681526020016141e860408a018a6153e7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614722565b5f8281526006860160205260409020919350915061424082826154b3565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb9061427e908590600401614fac565b6020604051808303815f875af115801561429a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142be9190614f73565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561433657614336614d76565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614416918e01908e01614d3d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661448d57604051631afcd79f60e31b815260040160405180910390fd5b565b614497614444565b6144a0816147e5565b6144a86147fe565b61182b606082013560808301356144c560c0850160a08601614d3d565b6144d560e0860160c08701615572565b6144e6610100870160e0880161558b565b6144f861012088016101008901614ffd565b61480e565b614505614444565b5f8051602061565d8339815191526001600160a01b03821661453a5760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f61456e6001600160a01b0384168361492f565b905080515f1415801561459257508080602001905181019061459091906155ab565b155b156109fa57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614606573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061462a9190614f73565b90506146416001600160a01b03851633308661493c565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614685573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146a99190614f73565b905081811161470f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016145b7565b61471982826153d4565b95945050505050565b5f606082608001515160301461474b57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161477d97969594939291906155c6565b604051602081830303815290604052905060028160405161479e91906151b8565b602060405180830381855afa1580156147b9573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906147dc9190614f73565b94909350915050565b6147ed614444565b6147f5614975565b61182b8161497d565b614806614444565b61448d614a4f565b614816614444565b5f8051602061567d83398151915261ffff8416158061483a575061271061ffff8516115b156148585760405163c98d73a760e01b815260040160405180910390fd5b8587111561487957604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061488c5750600a60ff8416115b156148aa576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b60606122a383835f614a57565b6040516001600160a01b0384811660248301528381166044830152606482018390526109899186918216906323b872dd90608401614005565b61448d614444565b614985614444565b80355f8051602061569d83398151915290815560146149aa606084016040850161558b565b60ff1611806149c957506149c4606083016040840161558b565b60ff16155b156149e75760405163b4fa3fb360e01b815260040160405180910390fd5b6149f7606083016040840161558b565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a286040830160208401614d3d565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61334c614444565b606081471015614a7c5760405163cd78605960e01b81523060048201526024016145b7565b5f80856001600160a01b03168486604051614a9791906151b8565b5f6040518083038185875af1925050503d805f8114614ad1576040519150601f19603f3d011682016040523d82523d5f602084013e614ad6565b606091505b5091509150614ae6868383614af0565b9695505050505050565b606082614b0557614b0082614b4c565b6122a3565b8151158015614b1c57506001600160a01b0384163b155b15614b4557604051639996b31560e01b81526001600160a01b03851660048201526024016145b7565b50806122a3565b805115614b5c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614b8190615215565b5f825580601f10614b90575050565b601f0160209004905f5260205f209081019061182b9190614be8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614bfc575f8155600101614be9565b5090565b801515811461182b575f80fd5b803563ffffffff81168114614c20575f80fd5b919050565b5f805f60608486031215614c37575f80fd5b833592506020840135614c4981614c00565b9150614c5760408501614c0d565b90509250925092565b5f60208284031215614c70575f80fd5b5035919050565b5f8060408385031215614c88575f80fd5b82359150614c9860208401614c0d565b90509250929050565b5f60208284031215614cb1575f80fd5b6122a382614c0d565b5f8060408385031215614ccb575f80fd5b614cd483614c0d565b946020939093013593505050565b5f8060408385031215614cf3575f80fd5b82356001600160401b03811115614d08575f80fd5b830160808186031215614d19575f80fd5b9150614c9860208401614c0d565b80356001600160401b0381168114614c20575f80fd5b5f60208284031215614d4d575f80fd5b6122a382614d27565b5f8060408385031215614d67575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614dad57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614de860608401826001600160401b03169052565b506080830151614e0360808401826001600160401b03169052565b5060a0830151614e1e60a08401826001600160401b03169052565b5060c0830151612ac260c08401826001600160401b03169052565b803561ffff81168114614c20575f80fd5b5f805f8060808587031215614e5d575f80fd5b84356001600160401b03811115614e72575f80fd5b850160608188031215614e83575f80fd5b9350614e9160208601614e39565b9250614e9f60408601614d27565b9396929550929360600135925050565b6001600160a01b038116811461182b575f80fd5b5f80828403610140811215614ed6575f80fd5b61012080821215614ee5575f80fd5b8493508301359050614ef681614eaf565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612ac257612ac2614f01565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614f83575f80fd5b5051919050565b5f5b83811015614fa4578181015183820152602001614f8c565b50505f910152565b602081525f8251806020840152614fca816040850160208701614f8a565b601f01601f19169190910160400192915050565b5f82614ff857634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561500d575f80fd5b81356122a381614eaf565b5f808335601e1984360301811261502d575f80fd5b8301803591506001600160401b03821115615046575f80fd5b6020019150600581901b360382131561224c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615085575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150c5576150c561508f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150f3576150f361508f565b604052919050565b5f6001600160401b038211156151135761511361508f565b50601f01601f191660200190565b5f60608236031215615131575f80fd5b6151396150a3565b82358152602061514a818501614d27565b8183015260408401356001600160401b03811115615166575f80fd5b840136601f820112615176575f80fd5b8035615189615184826150fb565b6150cb565b818152368483850101111561519c575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615085818460208701614f8a565b80820180821115610a0f57610a0f614f01565b5f63ffffffff8083168181036151f4576151f4614f01565b6001019392505050565b8082028115828204841417610a0f57610a0f614f01565b600181811c9082168061522957607f821691505b60208210810361524757634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461525f81615215565b806020870152604060018084165f8114615280576001811461529c576152c9565b60ff19851660408a0152604084151560051b8a010195506152c9565b895f5260205f205f5b858110156152c05781548b82018601529083019088016152a5565b8a016040019650505b509398975050505050505050565b8051614c2081614c00565b5f80604083850312156152f3575f80fd5b82516001600160401b0380821115615309575f80fd5b908401906060828703121561531c575f80fd5b6153246150a3565b8251815260208084015161533781614eaf565b8282015260408401518381111561534c575f80fd5b80850194505087601f850112615360575f80fd5b83519250615370615184846150fb565b8381528882858701011115615383575f80fd5b61539284838301848801614f8a565b806040840152508195506153a78188016152d7565b9450505050509250929050565b6001600160401b03818116838216019080821115612ac257612ac2614f01565b81810381811115610a0f57610a0f614f01565b5f808335601e198436030181126153fc575f80fd5b8301803591506001600160401b03821115615415575f80fd5b60200191503681900382131561224c575f80fd5b6001600160401b0381811683821602808216919082811461544c5761544c614f01565b505092915050565b5f6001600160401b038083168181036151f4576151f4614f01565b601f8211156109fa57805f5260205f20601f840160051c810160208510156154945750805b601f840160051c820191505b81811015610aba575f81556001016154a0565b81516001600160401b038111156154cc576154cc61508f565b6154e0816154da8454615215565b8461546f565b602080601f831160018114615513575f84156154fc5750858301515b5f19600386901b1c1916600185901b17855561556a565b5f85815260208120601f198616915b8281101561554157888601518255948401946001909101908401615522565b508582101561555e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615582575f80fd5b6122a382614e39565b5f6020828403121561559b575f80fd5b813560ff811681146122a3575f80fd5b5f602082840312156155bb575f80fd5b81516122a381614c00565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161561b81604e860160208901614f8a565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 8514468d6..d961b4af0 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516156b73803806156b783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61556a8061014d5f395ff3fe6080604052600436106101d0575f3560e01c806366435abf116100fd578063b771b3bc11610092578063c974d1b611610062578063c974d1b61461053f578063d5f20ff614610553578063df93d8de1461057f578063e7d14c1c14610595575f80fd5b8063b771b3bc146104d4578063ba3a4b97146104ee578063bee0a03f1461050d578063c599e24f1461052c575f80fd5b806393e24598116100cd57806393e245981461045857806398f3e2b4146104775780639dde029a14610496578063a3a65e48146104b5575f80fd5b806366435abf146103f3578063732214f81461041257806376f78621146104255780638280a25a14610444575f80fd5b806335455ded116101735780635297fae6116101435780635297fae61461036d57806360305d621461038c57806361e2f490146103b557806362065856146103d4575f80fd5b806335455ded146102e65780633a1cfff61461030e57806340034a931461032d578063467ef06f1461034e575f80fd5b806320e55565116101ae57806320e555651461023f57806325e1c7761461025e5780632e2194d81461027d578063329c3e12146102b4575f80fd5b80630118acc4146101d45780630322ed98146101f5578063151d30d114610214575b5f80fd5b3480156101df575f80fd5b506101f36101ee366004614b23565b6105df565b005b348015610200575f80fd5b506101f361020f366004614b5e565b610986565b34801561021f575f80fd5b50610228600a81565b60405160ff90911681526020015b60405180910390f35b34801561024a575f80fd5b506101f3610259366004614b75565b610af8565b348015610269575f80fd5b506101f3610278366004614b8c565b610bd5565b348015610288575f80fd5b5061029c610297366004614b5e565b610c45565b6040516001600160401b039091168152602001610236565b3480156102bf575f80fd5b506102ce6001600160991b0181565b6040516001600160a01b039091168152602001610236565b3480156102f1575f80fd5b506102fb61271081565b60405161ffff9091168152602001610236565b348015610319575f80fd5b506101f3610328366004614b23565b610c5b565b61034061033b366004614bdd565b610dd3565b604051908152602001610236565b348015610359575f80fd5b506101f3610368366004614c31565b610e07565b348015610378575f80fd5b506101f3610387366004614c4a565b610ea8565b348015610397575f80fd5b506103a0601481565b60405163ffffffff9091168152602001610236565b3480156103c0575f80fd5b506101f36103cf366004614c72565b61127b565b3480156103df575f80fd5b506103406103ee366004614cb7565b6116fa565b3480156103fe575f80fd5b5061029c61040d366004614b5e565b611713565b34801561041d575f80fd5b506103405f81565b348015610430575f80fd5b506101f361043f366004614b23565b611727565b34801561044f575f80fd5b50610228603081565b348015610463575f80fd5b506101f3610472366004614b5e565b61190c565b348015610482575f80fd5b506101f3610491366004614c4a565b6119c3565b3480156104a1575f80fd5b506101f36104b0366004614b5e565b611b55565b3480156104c0575f80fd5b506101f36104cf366004614c31565b611dcc565b3480156104df575f80fd5b506102ce6005600160991b0181565b3480156104f9575f80fd5b506101f3610508366004614b5e565b611f39565b348015610518575f80fd5b506101f3610527366004614b5e565b612115565b61034061053a366004614b5e565b61223a565b34801561054a575f80fd5b50610228601481565b34801561055e575f80fd5b5061057261056d366004614b5e565b61226b565b6040516102369190614ce4565b34801561058a575f80fd5b5061029c6202a30081565b3480156105a0575f80fd5b506103406105af366004614b5e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206154be8339815191526020526040808220815160e0810190925280545f805160206154de83398151915293929190829060ff16600381111561062c5761062c614cd0565b600381111561063d5761063d614cd0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6106b38261226b565b90506002835160038111156106ca576106ca614cd0565b146106e85760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146107155760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f8060028351600581111561073357610733614cd0565b0361078457871561074b576107488488612333565b91505b5f856060015184608001516107609190614da7565b905061076c8582612590565b506001600160401b031660c0870152504290506107b6565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b5906107db906116fa565b8560a00151886080015185875f806040518863ffffffff1660e01b815260040161080b9796959493929190614dc7565b602060405180830381865afa158015610826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084a9190614e05565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561088957610889614cd0565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906109739085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f8051602061553e8339815191526020526040808220815160e0810190925280545f805160206154fe83398151915293929190829060ff1660058111156109d3576109d3614cd0565b60058111156109e4576109e4614cd0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a5357610a53614cd0565b14610a715760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a968584606001515f6126e7565b6040518263ffffffff1660e01b8152600401610ab29190614e3e565b6020604051808303815f875af1158015610ace573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af29190614e05565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b41575080546001600160401b03808416911610155b15610b5f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b8983612736565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610bde82612747565b610bfb57604051636ca57bcf60e01b815260040160405180910390fd5b6002610c068361226b565b516005811115610c1857610c18614cd0565b14610c365760405163a36c527f60e01b815260040160405180910390fd5b610c408282612333565b505050565b5f610c5564e8d4a5100083614e70565b92915050565b5f805160206154de8339815191525f610c7385612782565b5f86815260048401602052604090205460a0820151919250610ca691600160b01b9091046001600160401b031690614e8f565b6001600160401b03168160c001516001600160401b03161015610cdc576040516302336bad60e51b815260040160405180910390fd5b5f8415610cf457610ced8685612333565b9050610d0f565b505f8581526008830160205260409020546001600160401b03165b600383015460408301516001600160a01b039091169063778c06b590610d34906116fa565b60a085015160c08601516040516001600160e01b031960e086901b168152610d68939291829188905f908190600401614dc7565b602060405180830381865afa158015610d83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610da79190614e05565b5f87815260078501602052604081208054909190610dc6908490614eaf565b9091555050505050505050565b5f610ddc6129bf565b610de8848484346129f6565b9050610e0060015f8051602061551e83398151915255565b9392505050565b5f805160206154de8339815191525f80610e2084612b9c565b91509150610e2d82612747565b610e375750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610e6657610e66614cd0565b03610e8b575f83815260078501602052604081208054919055610e898282612e2c565b505b610ea181610e9c84604001516116fa565b612e92565b5050505050565b5f8181525f805160206154be8339815191526020526040808220815160e0810190925280545f805160206154de83398151915293929190829060ff166003811115610ef557610ef5614cd0565b6003811115610f0657610f06614cd0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610f7d9061226b565b905060015f85815260058501602052604090205460ff166003811115610fa557610fa5614cd0565b14610fc35760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610fd857610fd8614cd0565b0361112157600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff191690600190849081111561103257611032614cd0565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b60048151600581111561113657611136614cd0565b0361114457610ea184612ea5565b5f8061115b61115288613082565b60400151613182565b50915091508184604001511461118457604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b031610806111cc57505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b156111ea57604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206154fe8339815191529060ff16156112cd57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611310573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113349190614e05565b8360200135146113575760405163d040949d60e01b815260040160405180910390fd5b306113686060850160408601614ed6565b6001600160a01b03161461138f5760405163e6c4247b60e01b815260040160405180910390fd5b5f61139d6060850185614ef1565b905090505f805b828163ffffffff161015611649575f6113c06060880188614ef1565b8363ffffffff168181106113d6576113d6614f36565b90506020028101906113e89190614f4a565b6113f190614ffa565b80515f818152600888016020526040902054919250901561142557604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161145492919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261146e91615091565b602060405180830381855afa158015611489573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114ac9190614e05565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561153857611538614cd0565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516115eb911686614eaf565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611642906150a2565b90506113a4565b50600483018190555f61166761165e86613082565b604001516133c0565b90505f61167387613535565b9050816002826040516116869190615091565b602060405180830381855afa1580156116a1573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906116c49190614e05565b146116e257604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610c556001600160401b03831664e8d4a510006150c4565b5f61171d8261226b565b6080015192915050565b5f805160206154de8339815191525f61173f85612782565b905061174a85612747565b611755575050505050565b5f8581526004830160205260409020546001600160a01b0316331461178d5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516117bc91600160b01b90046001600160401b031690614e8f565b6001600160401b03168160c001516001600160401b031610156117f2576040516302336bad60e51b815260040160405180910390fd5b5f841561180a576118038685612333565b9050611825565b505f8581526008830160205260409020546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061184a906116fa565b60a086015160c08701516040516001600160e01b031960e086901b16815261187e939291829189905f908190600401614dc7565b602060405180830381865afa158015611899573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118bd9190614e05565b9050805f036118df5760405163d802b9f360e01b815260040160405180910390fd5b5f878152600785016020526040812080548392906118fe908490614eaf565b909155505050505050505050565b5f805160206154de83398151915260046119258361226b565b51600581111561193757611937614cd0565b146119555760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b0316331461198d5760405163e6c4247b60e01b815260040160405180910390fd5b5f82815260078201602090815260408083208054908490556004850190925290912054610c40906001600160a01b031682612e2c565b6119cb6129bf565b5f8181525f805160206154be8339815191526020526040808220815160e0810190925280545f805160206154de83398151915293929190829060ff166003811115611a1857611a18614cd0565b6003811115611a2957611a29614cd0565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f80611a9b61115287613082565b509150915081836040015114611ac457604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b03161115611afb57604051633ab3447f60e11b815260040160405180910390fd5b600383516003811115611b1057611b10614cd0565b14611b2e5760405163f95c7fe160e01b815260040160405180910390fd5b611b3785612ea5565b50505050611b5160015f8051602061551e83398151915255565b5050565b611b5d6129bf565b5f8181525f805160206154be8339815191526020526040808220815160e0810190925280545f805160206154de83398151915293929190829060ff166003811115611baa57611baa614cd0565b6003811115611bbb57611bbb614cd0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c318261226b565b90505f83516003811115611c4757611c47614cd0565b03611c6557604051631d0b665760e21b815260040160405180910390fd5b600481516005811115611c7a57611c7a614cd0565b14611c985760405163a36c527f60e01b815260040160405180910390fd5b600183516003811115611cad57611cad614cd0565b03611cc457611cbb85612ea5565b50505050611db3565b600283516003811115611cd957611cd9614cd0565b03611da557600384015460608401516001600160a01b039091169063778c06b590611d03906116fa565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b168152611d5596959493926001600160401b0390921691908190600401614dc7565b602060405180830381865afa158015611d70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d949190614e05565b5f8681526006860160205260409020555b611dae85612ea5565b505050505b611dc960015f8051602061551e83398151915255565b50565b5f805160206154fe8339815191525f80611df1611de885613082565b604001516139ce565b9150915080611e1357604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068401602052604090208054611e2d906150db565b90505f03611e4e57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff166005811115611e7457611e74614cd0565b14611e925760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006840160205260408120611eaa91614a78565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206154be8339815191526020526040808220815160e0810190925280545f805160206154de83398151915293929190829060ff166003811115611f8657611f86614cd0565b6003811115611f9757611f97614cd0565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561201057612010614cd0565b14158015612031575060038151600381111561202e5761202e614cd0565b14155b1561204f5760405163f95c7fe160e01b815260040160405180910390fd5b5f61205d826040015161226b565b905080606001516001600160401b03165f0361208c57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6120b98460400151846060015185608001516126e7565b6040518263ffffffff1660e01b81526004016120d59190614e3e565b6020604051808303815f875af11580156120f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ea19190614e05565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206154fe833981519152919061215c906150db565b90505f0361217d57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff1660058111156121a3576121a3614cd0565b146121c15760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916121fa919060040161510d565b6020604051808303815f875af1158015612216573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c409190614e05565b5f6122436129bf565b61224e823334613b72565b905061226660015f8051602061551e83398151915255565b919050565b612273614aaf565b5f8281525f8051602061553e833981519152602052604090819020815160e0810190925280545f805160206154fe833981519152929190829060ff1660058111156122c0576122c0614cd0565b60058111156122d1576122d1614cd0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561237e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123a591908101906151a2565b91509150806123c757604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561240a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242e9190614e05565b82511461244e5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561247a5760405163e6c4247b60e01b815260040160405180910390fd5b5f806124898460400151613e36565b915091508187146124ad57604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260409020545f805160206154de833981519152906001600160401b03908116908316111561252b575f8881526008820160205260409020805467ffffffffffffffff19166001600160401b038416179055612547565b5f8881526008820160205260409020546001600160401b031691505b6040516001600160401b038316815288907fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d04359060200160405180910390a2509695505050505050565b5f8281525f8051602061553e833981519152602052604081206002015481905f805160206154fe83398151915290600160801b90046001600160401b03166125d88582614011565b5f6125e2876141da565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6126328a858b6126e7565b6040518263ffffffff1660e01b815260040161264e9190614e3e565b6020604051808303815f875af115801561266a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061268e9190614e05565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b61273e61424f565b611dc98161429a565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b61278a614aaf565b5f8281525f8051602061553e8339815191526020526040808220815160e0810190925280545f805160206154fe83398151915293929190829060ff1660058111156127d7576127d7614cd0565b60058111156127e8576127e8614cd0565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561285a5761285a614cd0565b146128785760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156128bc576128bc614cd0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6129688582612590565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061551e8339815191528054600119016129f057604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206154de83398151915290600160401b900461ffff9081169086161080612a4a575061271061ffff8616115b15612a685760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612a9a576040516302336bad60e51b815260040160405180910390fd5b8054831080612aac5750806001015483115b15612aca57604051630103be3b60e21b815260040160405180910390fd5b825f612ad582610c45565b90505f612ae28983614308565b90506040518060600160405280612af63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061551e83398151915255565b5f612ba5614aaf565b5f805160206154fe8339815191525f80612bc1611de887613082565b915091508015612be457604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612c1557612c15614cd0565b6005811115612c2657612c26614cd0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612c9557612c95614cd0565b14158015612cb65750600181516005811115612cb357612cb3614cd0565b14155b15612cd45760405163a36c527f60e01b815260040160405180910390fd5b600381516005811115612ce957612ce9614cd0565b03612cf75760048152612cfc565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff19166001836005811115612d4157612d41614cd0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612df557612df5614cd0565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612e78575f80fd5b505af1158015612e8a573d5f803e3d5ffd5b505050505050565b611b516001600160a01b038316826146f2565b5f8181525f805160206154be8339815191526020526040808220815160e0810190925280545f805160206154de83398151915293929190829060ff166003811115612ef257612ef2614cd0565b6003811115612f0357612f03614cd0565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612fd890600160a01b900461ffff16846150c4565b612fe29190614e70565b905080856007015f8581526020019081526020015f205f8282546130069190614eaf565b909155505f90506130178284615274565b9050613027856020015182612e2c565b61303c8560200151610e9c87606001516116fa565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156130e6573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261310d91908101906151a2565b915091508061312f57604051636b2f19e960e01b815260040160405180910390fd5b81511561314f5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561317b5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146131a757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156131f6576131be816001615274565b6131c99060086150c4565b61ffff168682815181106131df576131df614f36565b016020015160f81c901b91909117906001016131aa565b5061ffff81161561321a5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561327557613231816003615274565b61323c9060086150c4565b63ffffffff168761324e836002614eaf565b8151811061325e5761325e614f36565b016020015160f81c901b919091179060010161321d565b5063ffffffff811660041461329d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156132f2576132b481601f615274565b6132bf9060086150c4565b886132cb836006614eaf565b815181106132db576132db614f36565b016020015160f81c901b91909117906001016132a0565b505f805b60088110156133515761330a816007615274565b6133159060086150c4565b6001600160401b03168961332a836026614eaf565b8151811061333a5761333a614f36565b016020015160f81c901b91909117906001016132f6565b505f805b60088110156133b057613369816007615274565b6133749060086150c4565b6001600160401b03168a61338983602e614eaf565b8151811061339957613399614f36565b016020015160f81c901b9190911790600101613355565b5091989097509095509350505050565b5f81516026146133e357604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613432576133fa816001615274565b6134059060086150c4565b61ffff1684828151811061341b5761341b614f36565b016020015160f81c901b91909117906001016133e6565b5061ffff8116156134565760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156134b15761346d816003615274565b6134789060086150c4565b63ffffffff168561348a836002614eaf565b8151811061349a5761349a614f36565b016020015160f81c901b9190911790600101613459565b5063ffffffff8116156134d757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561352c576134ee81601f615274565b6134f99060086150c4565b86613505836006614eaf565b8151811061351557613515614f36565b016020015160f81c901b91909117906001016134da565b50949350505050565b60605f61354483830184614ef1565b613550915060586150c4565b61355b90605c614eaf565b6001600160401b0381111561357257613572614f68565b6040519080825280601f01601f19166020018201604052801561359c576020820181803683370190505b5090505f5b60208110156135f157833581602081106135bd576135bd614f36565b1a60f81b8282815181106135d3576135d3614f36565b60200101906001600160f81b03191690815f1a9053506001016135a1565b505f5b6020811015613651578360200135816020811061361357613613614f36565b1a60f81b82613623836020614eaf565b8151811061363357613633614f36565b60200101906001600160f81b03191690815f1a9053506001016135f4565b505f5b60048110156136b457613668816003615274565b6136739060086150c4565b6014901c60f81b82613686836040614eaf565b8151811061369657613696614f36565b60200101906001600160f81b03191690815f1a905350600101613654565b505f6136c66060850160408601614ed6565b60601b90505f5b6014811015613726578181601481106136e8576136e8614f36565b1a60f81b836136f8836044614eaf565b8151811061370857613708614f36565b60200101906001600160f81b03191690815f1a9053506001016136cd565b505f6137356060860186614ef1565b905090505f5b60048110156137a05761374f816003615274565b61375a9060086150c4565b63ffffffff8316901c60f81b84613772836058614eaf565b8151811061378257613782614f36565b60200101906001600160f81b03191690815f1a90535060010161373b565b505f5b6137b06060870187614ef1565b90508110156139c4575f6137c58260586150c4565b6137d090605c614eaf565b90505f5b602081101561385b576137ea6060890189614ef1565b848181106137fa576137fa614f36565b905060200281019061380c9190614f4a565b35816020811061381e5761381e614f36565b1a60f81b8661382d8385614eaf565b8151811061383d5761383d614f36565b60200101906001600160f81b03191690815f1a9053506001016137d4565b505f5b600881101561391057613872816007615274565b61387d9060086150c4565b61388a60608a018a614ef1565b8581811061389a5761389a614f36565b90506020028101906138ac9190614f4a565b6138bd906040810190602001614cb7565b6001600160401b0316901c60f81b86826138d8856020614eaf565b6138e29190614eaf565b815181106138f2576138f2614f36565b60200101906001600160f81b03191690815f1a90535060010161385e565b505f5b60308110156139ba576139296060890189614ef1565b8481811061393957613939614f36565b905060200281019061394b9190614f4a565b613959906040810190615287565b8281811061396957613969614f36565b9050013560f81c60f81b86828460286139829190614eaf565b61398c9190614eaf565b8151811061399c5761399c614f36565b60200101906001600160f81b03191690815f1a905350600101613913565b50506001016137a3565b5091949350505050565b5f8082516027146139f257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613a4157613a09816001615274565b613a149060086150c4565b61ffff16858281518110613a2a57613a2a614f36565b016020015160f81c901b91909117906001016139f5565b5061ffff811615613a655760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613ac057613a7c816003615274565b613a879060086150c4565b63ffffffff1686613a99836002614eaf565b81518110613aa957613aa9614f36565b016020015160f81c901b9190911790600101613a68565b5063ffffffff8116600314613ae857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b3d57613aff81601f615274565b613b0a9060086150c4565b87613b16836006614eaf565b81518110613b2657613b26614f36565b016020015160f81c901b9190911790600101613aeb565b505f86602681518110613b5257613b52614f36565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206154de83398151915281613b8b84610c45565b90505f613b978761226b565b9050613ba287612747565b613bbf57604051636ca57bcf60e01b815260040160405180910390fd5b600281516005811115613bd457613bd4614cd0565b14613bf25760405163a36c527f60e01b815260040160405180910390fd5b5f828260800151613c039190614e8f565b905083600201600a9054906101000a90046001600160401b03168260400151613c2c91906152c9565b6001600160401b0316816001600160401b03161115613c5e57604051630c192e7760e41b815260040160405180910390fd5b5f80613c6a8a84612590565b915091505f8a83604051602001613c9892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff19166001836003811115613d2b57613d2b614cd0565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613e5a57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613ea957613e71816001615274565b613e7c9060086150c4565b61ffff16858281518110613e9257613e92614f36565b016020015160f81c901b9190911790600101613e5d565b5061ffff811615613ecd5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613f2857613ee4816003615274565b613eef9060086150c4565b63ffffffff1686613f01836002614eaf565b81518110613f1157613f11614f36565b016020015160f81c901b9190911790600101613ed0565b5063ffffffff8116600514613f5057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613fa557613f6781601f615274565b613f729060086150c4565b87613f7e836006614eaf565b81518110613f8e57613f8e614f36565b016020015160f81c901b9190911790600101613f53565b505f805b600881101561400457613fbd816007615274565b613fc89060086150c4565b6001600160401b031688613fdd836026614eaf565b81518110613fed57613fed614f36565b016020015160f81c901b9190911790600101613fa9565b5090969095509350505050565b5f805160206154fe8339815191525f6001600160401b0380841690851611156140455761403e8385614da7565b9050614052565b61404f8484614da7565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806140b45750600184015481516140b0916001600160401b031690614eaf565b8210155b156140da576001600160401b0383166060820152818152604081015160208201526140f9565b82816060018181516140ec9190614e8f565b6001600160401b03169052505b60608101516141099060646152c9565b602082015160018601546001600160401b0392909216916141349190600160401b900460ff166150c4565b10156141535760405163254d226960e01b815260040160405180910390fd5b856001600160401b03168160400181815161416e9190614eaf565b9052506040810180516001600160401b038716919061418e908390615274565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061553e8339815191526020526040812060020180545f805160206154fe833981519152919060089061422490600160401b90046001600160401b03166152f4565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661429857604051631afcd79f60e31b815260040160405180910390fd5b565b6142a261424f565b6142ab81614789565b6142b36147a2565b611dc9606082013560808301356142d060c0850160a08601614cb7565b6142e060e0860160c0870161530f565b6142f1610100870160e08801615328565b61430361012088016101008901614ed6565b6147b2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661434c57604051637fab81e560e01b815260040160405180910390fd5b5f805160206154fe8339815191524261436b6040860160208701614cb7565b6001600160401b03161115806143a557506143896202a30042614eaf565b6143996040860160208701614cb7565b6001600160401b031610155b156143c25760405162d36c8560e81b815260040160405180910390fd5b60306143d16040860186615287565b90501415806143df57508335155b156143fd5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561442d57604051630eb0d31360e11b815260040160405180910390fd5b614437835f614011565b5f806144d06040518060a00160405280855f01548152602001885f01358152602001876001600160401b0316815260200188602001602081019061447b9190614cb7565b6001600160401b0316815260200161449660408a018a615287565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506148d3565b5f828152600686016020526040902091935091506144ee828261538c565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb9061452c908590600401614e3e565b6020604051808303815f875af1158015614548573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061456c9190614e05565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156145e4576145e4614cd0565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916146c4918e01908e01614cb7565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156147195760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614762576040519150601f19603f3d011682016040523d82523d5f602084013e614767565b606091505b5050905080610c4057604051630a12f52160e11b815260040160405180910390fd5b61479161424f565b614799614996565b611dc98161499e565b6147aa61424f565b614298614a70565b6147ba61424f565b5f805160206154de83398151915261ffff841615806147de575061271061ffff8516115b156147fc5760405163c98d73a760e01b815260040160405180910390fd5b8587111561481d57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806148305750600a60ff8416115b1561484e576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146148fc57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161492e9796959493929190615447565b604051602081830303815290604052905060028160405161494f9190615091565b602060405180830381855afa15801561496a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061498d9190614e05565b94909350915050565b61429861424f565b6149a661424f565b80355f805160206154fe83398151915290815560146149cb6060840160408501615328565b60ff1611806149ea57506149e56060830160408401615328565b60ff16155b15614a085760405163b4fa3fb360e01b815260040160405180910390fd5b614a186060830160408401615328565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a496040830160208401614cb7565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b8961424f565b508054614a84906150db565b5f825580601f10614a93575050565b601f0160209004905f5260205f2090810190611dc99190614aeb565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614aff575f8155600101614aec565b5090565b8015158114611dc9575f80fd5b803563ffffffff81168114612266575f80fd5b5f805f60608486031215614b35575f80fd5b833592506020840135614b4781614b03565b9150614b5560408501614b10565b90509250925092565b5f60208284031215614b6e575f80fd5b5035919050565b5f6101208284031215614b86575f80fd5b50919050565b5f8060408385031215614b9d575f80fd5b82359150614bad60208401614b10565b90509250929050565b803561ffff81168114612266575f80fd5b80356001600160401b0381168114612266575f80fd5b5f805f60608486031215614bef575f80fd5b83356001600160401b03811115614c04575f80fd5b840160608187031215614c15575f80fd5b9250614c2360208501614bb6565b9150614b5560408501614bc7565b5f60208284031215614c41575f80fd5b610e0082614b10565b5f8060408385031215614c5b575f80fd5b614c6483614b10565b946020939093013593505050565b5f8060408385031215614c83575f80fd5b82356001600160401b03811115614c98575f80fd5b830160808186031215614ca9575f80fd5b9150614bad60208401614b10565b5f60208284031215614cc7575f80fd5b610e0082614bc7565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614d0757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614d4260608401826001600160401b03169052565b506080830151614d5d60808401826001600160401b03169052565b5060a0830151614d7860a08401826001600160401b03169052565b5060c083015161317b60c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561317b5761317b614d93565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614e15575f80fd5b5051919050565b5f5b83811015614e36578181015183820152602001614e1e565b50505f910152565b602081525f8251806020840152614e5c816040850160208701614e1c565b601f01601f19169190910160400192915050565b5f82614e8a57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160401b0381811683821601908082111561317b5761317b614d93565b80820180821115610c5557610c55614d93565b6001600160a01b0381168114611dc9575f80fd5b5f60208284031215614ee6575f80fd5b8135610e0081614ec2565b5f808335601e19843603018112614f06575f80fd5b8301803591506001600160401b03821115614f1f575f80fd5b6020019150600581901b36038213156126e0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614f5e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f9e57614f9e614f68565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614fcc57614fcc614f68565b604052919050565b5f6001600160401b03821115614fec57614fec614f68565b50601f01601f191660200190565b5f6060823603121561500a575f80fd5b615012614f7c565b823581526020615023818501614bc7565b8183015260408401356001600160401b0381111561503f575f80fd5b840136601f82011261504f575f80fd5b803561506261505d82614fd4565b614fa4565b8181523684838501011115615075575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614f5e818460208701614e1c565b5f63ffffffff8083168181036150ba576150ba614d93565b6001019392505050565b8082028115828204841417610c5557610c55614d93565b600181811c908216806150ef57607f821691505b602082108103614b8657634e487b7160e01b5f52602260045260245ffd5b5f60208083525f845461511f816150db565b806020870152604060018084165f8114615140576001811461515c57615189565b60ff19851660408a0152604084151560051b8a01019550615189565b895f5260205f205f5b858110156151805781548b8201860152908301908801615165565b8a016040019650505b509398975050505050505050565b805161226681614b03565b5f80604083850312156151b3575f80fd5b82516001600160401b03808211156151c9575f80fd5b90840190606082870312156151dc575f80fd5b6151e4614f7c565b825181526020808401516151f781614ec2565b8282015260408401518381111561520c575f80fd5b80850194505087601f850112615220575f80fd5b8351925061523061505d84614fd4565b8381528882858701011115615243575f80fd5b61525284838301848801614e1c565b80604084015250819550615267818801615197565b9450505050509250929050565b81810381811115610c5557610c55614d93565b5f808335601e1984360301811261529c575f80fd5b8301803591506001600160401b038211156152b5575f80fd5b6020019150368190038213156126e0575f80fd5b6001600160401b038181168382160280821691908281146152ec576152ec614d93565b505092915050565b5f6001600160401b038083168181036150ba576150ba614d93565b5f6020828403121561531f575f80fd5b610e0082614bb6565b5f60208284031215615338575f80fd5b813560ff81168114610e00575f80fd5b601f821115610c4057805f5260205f20601f840160051c8101602085101561536d5750805b601f840160051c820191505b81811015610ea1575f8155600101615379565b81516001600160401b038111156153a5576153a5614f68565b6153b9816153b384546150db565b84615348565b602080601f8311600181146153ec575f84156153d55750858301515b5f19600386901b1c1916600185901b178555612e8a565b5f85815260208120601f198616915b8281101561541a578886015182559484019460019091019084016153fb565b508582101561543757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161549c81604e860160208901614e1c565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161556c38038061556c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61541f8061014d5f395ff3fe6080604052600436106101d0575f3560e01c806366435abf116100fd578063b771b3bc11610092578063c974d1b611610062578063c974d1b61461053f578063d5f20ff614610553578063df93d8de1461057f578063e7d14c1c14610595575f80fd5b8063b771b3bc146104d4578063ba3a4b97146104ee578063bee0a03f1461050d578063c599e24f1461052c575f80fd5b806393e24598116100cd57806393e245981461045857806398f3e2b4146104775780639dde029a14610496578063a3a65e48146104b5575f80fd5b806366435abf146103f3578063732214f81461041257806376f78621146104255780638280a25a14610444575f80fd5b806335455ded116101735780635297fae6116101435780635297fae61461036d57806360305d621461038c57806361e2f490146103b557806362065856146103d4575f80fd5b806335455ded146102e65780633a1cfff61461030e57806340034a931461032d578063467ef06f1461034e575f80fd5b806320e55565116101ae57806320e555651461023f57806325e1c7761461025e5780632e2194d81461027d578063329c3e12146102b4575f80fd5b80630118acc4146101d45780630322ed98146101f5578063151d30d114610214575b5f80fd5b3480156101df575f80fd5b506101f36101ee3660046149d8565b6105df565b005b348015610200575f80fd5b506101f361020f366004614a13565b610986565b34801561021f575f80fd5b50610228600a81565b60405160ff90911681526020015b60405180910390f35b34801561024a575f80fd5b506101f3610259366004614a2a565b610af8565b348015610269575f80fd5b506101f3610278366004614a41565b610bd5565b348015610288575f80fd5b5061029c610297366004614a13565b610c45565b6040516001600160401b039091168152602001610236565b3480156102bf575f80fd5b506102ce6001600160991b0181565b6040516001600160a01b039091168152602001610236565b3480156102f1575f80fd5b506102fb61271081565b60405161ffff9091168152602001610236565b348015610319575f80fd5b506101f36103283660046149d8565b610c5b565b61034061033b366004614a92565b610c66565b604051908152602001610236565b348015610359575f80fd5b506101f3610368366004614ae6565b610c9a565b348015610378575f80fd5b506101f3610387366004614aff565b610d3b565b348015610397575f80fd5b506103a0601481565b60405163ffffffff9091168152602001610236565b3480156103c0575f80fd5b506101f36103cf366004614b27565b61110e565b3480156103df575f80fd5b506103406103ee366004614b6c565b61158d565b3480156103fe575f80fd5b5061029c61040d366004614a13565b6115a6565b34801561041d575f80fd5b506103405f81565b348015610430575f80fd5b506101f361043f3660046149d8565b6115ba565b34801561044f575f80fd5b50610228603081565b348015610463575f80fd5b506101f3610472366004614a13565b6115e8565b348015610482575f80fd5b506101f3610491366004614aff565b61169f565b3480156104a1575f80fd5b506101f36104b0366004614a13565b611831565b3480156104c0575f80fd5b506101f36104cf366004614ae6565b611aa8565b3480156104df575f80fd5b506102ce6005600160991b0181565b3480156104f9575f80fd5b506101f3610508366004614a13565b611c15565b348015610518575f80fd5b506101f3610527366004614a13565b611df1565b61034061053a366004614a13565b611f16565b34801561054a575f80fd5b50610228601481565b34801561055e575f80fd5b5061057261056d366004614a13565b611f47565b6040516102369190614b99565b34801561058a575f80fd5b5061029c6202a30081565b3480156105a0575f80fd5b506103406105af366004614a13565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206153738339815191526020526040808220815160e0810190925280545f8051602061539383398151915293929190829060ff16600381111561062c5761062c614b85565b600381111561063d5761063d614b85565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6106b382611f47565b90506002835160038111156106ca576106ca614b85565b146106e85760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146107155760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f8060028351600581111561073357610733614b85565b0361078457871561074b57610748848861200f565b91505b5f856060015184608001516107609190614c5c565b905061076c8582612267565b506001600160401b031660c0870152504290506107b6565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b5906107db9061158d565b8560a00151886080015185875f806040518863ffffffff1660e01b815260040161080b9796959493929190614c7c565b602060405180830381865afa158015610826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084a9190614cba565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561088957610889614b85565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906109739085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206153f38339815191526020526040808220815160e0810190925280545f805160206153b383398151915293929190829060ff1660058111156109d3576109d3614b85565b60058111156109e4576109e4614b85565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a5357610a53614b85565b14610a715760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a968584606001515f6123be565b6040518263ffffffff1660e01b8152600401610ab29190614cf3565b6020604051808303815f875af1158015610ace573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af29190614cba565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b41575080546001600160401b03808416911610155b15610b5f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b898361240d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610bde8261241e565b610bfb57604051636ca57bcf60e01b815260040160405180910390fd5b6002610c0683611f47565b516005811115610c1857610c18614b85565b14610c365760405163a36c527f60e01b815260040160405180910390fd5b610c40828261200f565b505050565b5f610c5564e8d4a5100083614d25565b92915050565b610af2838383612459565b5f610c6f612637565b610c7b8484843461266e565b9050610c9360015f805160206153d383398151915255565b9392505050565b5f805160206153938339815191525f80610cb384612814565b91509150610cc08261241e565b610cca5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610cf957610cf9614b85565b03610d1e575f83815260078501602052604081208054919055610d1c8282612aa4565b505b610d3481610d2f846040015161158d565b612b0a565b5050505050565b5f8181525f805160206153738339815191526020526040808220815160e0810190925280545f8051602061539383398151915293929190829060ff166003811115610d8857610d88614b85565b6003811115610d9957610d99614b85565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610e1090611f47565b905060015f85815260058501602052604090205460ff166003811115610e3857610e38614b85565b14610e565760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610e6b57610e6b614b85565b03610fb457600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610ec557610ec5614b85565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610fc957610fc9614b85565b03610fd757610d3484612b1d565b5f80610fee610fe588612cfa565b60400151612dfa565b50915091508184604001511461101757604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b0316108061105f57505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b1561107d57604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206153b38339815191529060ff161561116057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c79190614cba565b8360200135146111ea5760405163d040949d60e01b815260040160405180910390fd5b306111fb6060850160408601614d58565b6001600160a01b0316146112225760405163e6c4247b60e01b815260040160405180910390fd5b5f6112306060850185614d73565b905090505f805b828163ffffffff1610156114dc575f6112536060880188614d73565b8363ffffffff1681811061126957611269614db8565b905060200281019061127b9190614dcc565b61128490614e7c565b80515f81815260088801602052604090205491925090156112b857604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f0135856040516020016112e792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261130191614f13565b602060405180830381855afa15801561131c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133f9190614cba565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156113cb576113cb614b85565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161147e911686614f24565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114d590614f37565b9050611237565b50600483018190555f6114fa6114f186612cfa565b60400151613038565b90505f611506876131ad565b9050816002826040516115199190614f13565b602060405180830381855afa158015611534573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115579190614cba565b1461157557604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610c556001600160401b03831664e8d4a51000614f59565b5f6115b082611f47565b6080015192915050565b5f6115c6848484612459565b9050805f03610af25760405163d802b9f360e01b815260040160405180910390fd5b5f80516020615393833981519152600461160183611f47565b51600581111561161357611613614b85565b146116315760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146116695760405163e6c4247b60e01b815260040160405180910390fd5b5f82815260078201602090815260408083208054908490556004850190925290912054610c40906001600160a01b031682612aa4565b6116a7612637565b5f8181525f805160206153738339815191526020526040808220815160e0810190925280545f8051602061539383398151915293929190829060ff1660038111156116f4576116f4614b85565b600381111561170557611705614b85565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f80611777610fe587612cfa565b5091509150818360400151146117a057604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b031611156117d757604051633ab3447f60e11b815260040160405180910390fd5b6003835160038111156117ec576117ec614b85565b1461180a5760405163f95c7fe160e01b815260040160405180910390fd5b61181385612b1d565b5050505061182d60015f805160206153d383398151915255565b5050565b611839612637565b5f8181525f805160206153738339815191526020526040808220815160e0810190925280545f8051602061539383398151915293929190829060ff16600381111561188657611886614b85565b600381111561189757611897614b85565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61190d82611f47565b90505f8351600381111561192357611923614b85565b0361194157604051631d0b665760e21b815260040160405180910390fd5b60048151600581111561195657611956614b85565b146119745760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561198957611989614b85565b036119a05761199785612b1d565b50505050611a8f565b6002835160038111156119b5576119b5614b85565b03611a8157600384015460608401516001600160a01b039091169063778c06b5906119df9061158d565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b168152611a3196959493926001600160401b0390921691908190600401614c7c565b602060405180830381865afa158015611a4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a709190614cba565b5f8681526006860160205260409020555b611a8a85612b1d565b505050505b611aa560015f805160206153d383398151915255565b50565b5f805160206153b38339815191525f80611acd611ac485612cfa565b60400151613646565b9150915080611aef57604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068401602052604090208054611b0990614f70565b90505f03611b2a57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff166005811115611b5057611b50614b85565b14611b6e5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006840160205260408120611b869161492d565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206153738339815191526020526040808220815160e0810190925280545f8051602061539383398151915293929190829060ff166003811115611c6257611c62614b85565b6003811115611c7357611c73614b85565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611cec57611cec614b85565b14158015611d0d5750600381516003811115611d0a57611d0a614b85565b14155b15611d2b5760405163f95c7fe160e01b815260040160405180910390fd5b5f611d398260400151611f47565b905080606001516001600160401b03165f03611d6857604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611d958460400151846060015185608001516123be565b6040518263ffffffff1660e01b8152600401611db19190614cf3565b6020604051808303815f875af1158015611dcd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d349190614cba565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206153b38339815191529190611e3890614f70565b90505f03611e5957604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611e7f57611e7f614b85565b14611e9d5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ed69190600401614fa2565b6020604051808303815f875af1158015611ef2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c409190614cba565b5f611f1f612637565b611f2a8233346137ea565b9050611f4260015f805160206153d383398151915255565b919050565b611f4f614964565b5f8281525f805160206153f3833981519152602052604090819020815160e0810190925280545f805160206153b3833981519152929190829060ff166005811115611f9c57611f9c614b85565b6005811115611fad57611fad614b85565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561205a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120819190810190615037565b91509150806120a357604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210a9190614cba565b82511461212a5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156121565760405163e6c4247b60e01b815260040160405180910390fd5b5f806121658460400151613aae565b9150915081871461218957604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260409020545f80516020615393833981519152906001600160401b039081169083161115612240575f888152600882016020908152604091829020805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261225c565b5f8881526008820160205260409020546001600160401b031691505b509695505050505050565b5f8281525f805160206153f3833981519152602052604081206002015481905f805160206153b383398151915290600160801b90046001600160401b03166122af8582613c89565b5f6122b987613e52565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123098a858b6123be565b6040518263ffffffff1660e01b81526004016123259190614cf3565b6020604051808303815f875af1158015612341573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123659190614cba565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612415613ec7565b611aa581613f12565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206153938339815191528161247286613f80565b905061247d8661241e565b61249a57604051636ca57bcf60e01b815260040160405180910390fd5b5f8681526004830160205260409020546001600160a01b031633146124d25760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a082015161250191600160b01b90046001600160401b031690615109565b6001600160401b03168160c001516001600160401b03161015612537576040516302336bad60e51b815260040160405180910390fd5b5f851561254f57612548878661200f565b905061256a565b505f8681526008830160205260409020546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061258f9061158d565b60a086015160c08701516040516001600160e01b031960e086901b1681526125c3939291829189905f908190600401614c7c565b602060405180830381865afa1580156125de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126029190614cba565b905080846007015f8a81526020019081526020015f205f8282546126269190614f24565b909155509098975050505050505050565b5f805160206153d383398151915280546001190161266857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061539383398151915290600160401b900461ffff90811690861610806126c2575061271061ffff8616115b156126e05760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612712576040516302336bad60e51b815260040160405180910390fd5b80548310806127245750806001015483115b1561274257604051630103be3b60e21b815260040160405180910390fd5b825f61274d82610c45565b90505f61275a89836141bd565b9050604051806060016040528061276e3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f805160206153d383398151915255565b5f61281d614964565b5f805160206153b38339815191525f80612839611ac487612cfa565b91509150801561285c57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561288d5761288d614b85565b600581111561289e5761289e614b85565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561290d5761290d614b85565b1415801561292e575060018151600581111561292b5761292b614b85565b14155b1561294c5760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561296157612961614b85565b0361296f5760048152612974565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff191660018360058111156129b9576129b9614b85565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a6d57612a6d614b85565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612af0575f80fd5b505af1158015612b02573d5f803e3d5ffd5b505050505050565b61182d6001600160a01b038316826145a7565b5f8181525f805160206153738339815191526020526040808220815160e0810190925280545f8051602061539383398151915293929190829060ff166003811115612b6a57612b6a614b85565b6003811115612b7b57612b7b614b85565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612c5090600160a01b900461ffff1684614f59565b612c5a9190614d25565b905080856007015f8581526020019081526020015f205f828254612c7e9190614f24565b909155505f9050612c8f8284615129565b9050612c9f856020015182612aa4565b612cb48560200151610d2f876060015161158d565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612d5e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612d859190810190615037565b9150915080612da757604051636b2f19e960e01b815260040160405180910390fd5b815115612dc75760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612df35760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612e1f57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612e6e57612e36816001615129565b612e41906008614f59565b61ffff16868281518110612e5757612e57614db8565b016020015160f81c901b9190911790600101612e22565b5061ffff811615612e925760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612eed57612ea9816003615129565b612eb4906008614f59565b63ffffffff1687612ec6836002614f24565b81518110612ed657612ed6614db8565b016020015160f81c901b9190911790600101612e95565b5063ffffffff8116600414612f1557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f6a57612f2c81601f615129565b612f37906008614f59565b88612f43836006614f24565b81518110612f5357612f53614db8565b016020015160f81c901b9190911790600101612f18565b505f805b6008811015612fc957612f82816007615129565b612f8d906008614f59565b6001600160401b031689612fa2836026614f24565b81518110612fb257612fb2614db8565b016020015160f81c901b9190911790600101612f6e565b505f805b600881101561302857612fe1816007615129565b612fec906008614f59565b6001600160401b03168a61300183602e614f24565b8151811061301157613011614db8565b016020015160f81c901b9190911790600101612fcd565b5091989097509095509350505050565b5f815160261461305b57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156130aa57613072816001615129565b61307d906008614f59565b61ffff1684828151811061309357613093614db8565b016020015160f81c901b919091179060010161305e565b5061ffff8116156130ce5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613129576130e5816003615129565b6130f0906008614f59565b63ffffffff1685613102836002614f24565b8151811061311257613112614db8565b016020015160f81c901b91909117906001016130d1565b5063ffffffff81161561314f57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131a45761316681601f615129565b613171906008614f59565b8661317d836006614f24565b8151811061318d5761318d614db8565b016020015160f81c901b9190911790600101613152565b50949350505050565b60605f6131bc83830184614d73565b6131c891506058614f59565b6131d390605c614f24565b6001600160401b038111156131ea576131ea614dea565b6040519080825280601f01601f191660200182016040528015613214576020820181803683370190505b5090505f5b6020811015613269578335816020811061323557613235614db8565b1a60f81b82828151811061324b5761324b614db8565b60200101906001600160f81b03191690815f1a905350600101613219565b505f5b60208110156132c9578360200135816020811061328b5761328b614db8565b1a60f81b8261329b836020614f24565b815181106132ab576132ab614db8565b60200101906001600160f81b03191690815f1a90535060010161326c565b505f5b600481101561332c576132e0816003615129565b6132eb906008614f59565b6014901c60f81b826132fe836040614f24565b8151811061330e5761330e614db8565b60200101906001600160f81b03191690815f1a9053506001016132cc565b505f61333e6060850160408601614d58565b60601b90505f5b601481101561339e5781816014811061336057613360614db8565b1a60f81b83613370836044614f24565b8151811061338057613380614db8565b60200101906001600160f81b03191690815f1a905350600101613345565b505f6133ad6060860186614d73565b905090505f5b6004811015613418576133c7816003615129565b6133d2906008614f59565b63ffffffff8316901c60f81b846133ea836058614f24565b815181106133fa576133fa614db8565b60200101906001600160f81b03191690815f1a9053506001016133b3565b505f5b6134286060870187614d73565b905081101561363c575f61343d826058614f59565b61344890605c614f24565b90505f5b60208110156134d3576134626060890189614d73565b8481811061347257613472614db8565b90506020028101906134849190614dcc565b35816020811061349657613496614db8565b1a60f81b866134a58385614f24565b815181106134b5576134b5614db8565b60200101906001600160f81b03191690815f1a90535060010161344c565b505f5b6008811015613588576134ea816007615129565b6134f5906008614f59565b61350260608a018a614d73565b8581811061351257613512614db8565b90506020028101906135249190614dcc565b613535906040810190602001614b6c565b6001600160401b0316901c60f81b8682613550856020614f24565b61355a9190614f24565b8151811061356a5761356a614db8565b60200101906001600160f81b03191690815f1a9053506001016134d6565b505f5b6030811015613632576135a16060890189614d73565b848181106135b1576135b1614db8565b90506020028101906135c39190614dcc565b6135d190604081019061513c565b828181106135e1576135e1614db8565b9050013560f81c60f81b86828460286135fa9190614f24565b6136049190614f24565b8151811061361457613614614db8565b60200101906001600160f81b03191690815f1a90535060010161358b565b505060010161341b565b5091949350505050565b5f80825160271461366a57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136b957613681816001615129565b61368c906008614f59565b61ffff168582815181106136a2576136a2614db8565b016020015160f81c901b919091179060010161366d565b5061ffff8116156136dd5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613738576136f4816003615129565b6136ff906008614f59565b63ffffffff1686613711836002614f24565b8151811061372157613721614db8565b016020015160f81c901b91909117906001016136e0565b5063ffffffff811660031461376057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137b55761377781601f615129565b613782906008614f59565b8761378e836006614f24565b8151811061379e5761379e614db8565b016020015160f81c901b9190911790600101613763565b505f866026815181106137ca576137ca614db8565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206153938339815191528161380384610c45565b90505f61380f87611f47565b905061381a8761241e565b61383757604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561384c5761384c614b85565b1461386a5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161387b9190615109565b905083600201600a9054906101000a90046001600160401b031682604001516138a4919061517e565b6001600160401b0316816001600160401b031611156138d657604051630c192e7760e41b815260040160405180910390fd5b5f806138e28a84612267565b915091505f8a8360405160200161391092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156139a3576139a3614b85565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613ad257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613b2157613ae9816001615129565b613af4906008614f59565b61ffff16858281518110613b0a57613b0a614db8565b016020015160f81c901b9190911790600101613ad5565b5061ffff811615613b455760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613ba057613b5c816003615129565b613b67906008614f59565b63ffffffff1686613b79836002614f24565b81518110613b8957613b89614db8565b016020015160f81c901b9190911790600101613b48565b5063ffffffff8116600514613bc857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c1d57613bdf81601f615129565b613bea906008614f59565b87613bf6836006614f24565b81518110613c0657613c06614db8565b016020015160f81c901b9190911790600101613bcb565b505f805b6008811015613c7c57613c35816007615129565b613c40906008614f59565b6001600160401b031688613c55836026614f24565b81518110613c6557613c65614db8565b016020015160f81c901b9190911790600101613c21565b5090969095509350505050565b5f805160206153b38339815191525f6001600160401b038084169085161115613cbd57613cb68385614c5c565b9050613cca565b613cc78484614c5c565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613d2c575060018401548151613d28916001600160401b031690614f24565b8210155b15613d52576001600160401b038316606082015281815260408101516020820152613d71565b8281606001818151613d649190615109565b6001600160401b03169052505b6060810151613d8190606461517e565b602082015160018601546001600160401b039290921691613dac9190600160401b900460ff16614f59565b1015613dcb5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613de69190614f24565b9052506040810180516001600160401b0387169190613e06908390615129565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206153f38339815191526020526040812060020180545f805160206153b38339815191529190600890613e9c90600160401b90046001600160401b03166151a9565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f1057604051631afcd79f60e31b815260040160405180910390fd5b565b613f1a613ec7565b613f238161463e565b613f2b614657565b611aa560608201356080830135613f4860c0850160a08601614b6c565b613f5860e0860160c087016151c4565b613f69610100870160e088016151dd565b613f7b61012088016101008901614d58565b614667565b613f88614964565b5f8281525f805160206153f38339815191526020526040808220815160e0810190925280545f805160206153b383398151915293929190829060ff166005811115613fd557613fd5614b85565b6005811115613fe657613fe6614b85565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561405857614058614b85565b146140765760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156140ba576140ba614b85565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6141668582612267565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661420157604051637fab81e560e01b815260040160405180910390fd5b5f805160206153b3833981519152426142206040860160208701614b6c565b6001600160401b031611158061425a575061423e6202a30042614f24565b61424e6040860160208701614b6c565b6001600160401b031610155b156142775760405162d36c8560e81b815260040160405180910390fd5b6030614286604086018661513c565b905014158061429457508335155b156142b25760405163b4fa3fb360e01b815260040160405180910390fd5b83355f908152600882016020526040902054156142e257604051630eb0d31360e11b815260040160405180910390fd5b6142ec835f613c89565b5f806143856040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906143309190614b6c565b6001600160401b0316815260200161434b60408a018a61513c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614788565b5f828152600686016020526040902091935091506143a38282615241565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906143e1908590600401614cf3565b6020604051808303815f875af11580156143fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144219190614cba565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561449957614499614b85565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614579918e01908e01614b6c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145ce5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614617576040519150601f19603f3d011682016040523d82523d5f602084013e61461c565b606091505b5050905080610c4057604051630a12f52160e11b815260040160405180910390fd5b614646613ec7565b61464e61484b565b611aa581614853565b61465f613ec7565b613f10614925565b61466f613ec7565b5f8051602061539383398151915261ffff84161580614693575061271061ffff8516115b156146b15760405163c98d73a760e01b815260040160405180910390fd5b858711156146d257604051630103be3b60e21b815260040160405180910390fd5b60ff831615806146e55750600a60ff8416115b15614703576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146147b157604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016147e397969594939291906152fc565b60405160208183030381529060405290506002816040516148049190614f13565b602060405180830381855afa15801561481f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906148429190614cba565b94909350915050565b613f10613ec7565b61485b613ec7565b80355f805160206153b3833981519152908155601461488060608401604085016151dd565b60ff16118061489f575061489a60608301604084016151dd565b60ff16155b156148bd5760405163b4fa3fb360e01b815260040160405180910390fd5b6148cd60608301604084016151dd565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556148fe6040830160208401614b6c565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612801613ec7565b50805461493990614f70565b5f825580601f10614948575050565b601f0160209004905f5260205f2090810190611aa591906149a0565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156149b4575f81556001016149a1565b5090565b8015158114611aa5575f80fd5b803563ffffffff81168114611f42575f80fd5b5f805f606084860312156149ea575f80fd5b8335925060208401356149fc816149b8565b9150614a0a604085016149c5565b90509250925092565b5f60208284031215614a23575f80fd5b5035919050565b5f6101208284031215614a3b575f80fd5b50919050565b5f8060408385031215614a52575f80fd5b82359150614a62602084016149c5565b90509250929050565b803561ffff81168114611f42575f80fd5b80356001600160401b0381168114611f42575f80fd5b5f805f60608486031215614aa4575f80fd5b83356001600160401b03811115614ab9575f80fd5b840160608187031215614aca575f80fd5b9250614ad860208501614a6b565b9150614a0a60408501614a7c565b5f60208284031215614af6575f80fd5b610c93826149c5565b5f8060408385031215614b10575f80fd5b614b19836149c5565b946020939093013593505050565b5f8060408385031215614b38575f80fd5b82356001600160401b03811115614b4d575f80fd5b830160808186031215614b5e575f80fd5b9150614a62602084016149c5565b5f60208284031215614b7c575f80fd5b610c9382614a7c565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614bbc57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614bf760608401826001600160401b03169052565b506080830151614c1260808401826001600160401b03169052565b5060a0830151614c2d60a08401826001600160401b03169052565b5060c0830151612df360c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612df357612df3614c48565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614cca575f80fd5b5051919050565b5f5b83811015614ceb578181015183820152602001614cd3565b50505f910152565b602081525f8251806020840152614d11816040850160208701614cd1565b601f01601f19169190910160400192915050565b5f82614d3f57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114611aa5575f80fd5b5f60208284031215614d68575f80fd5b8135610c9381614d44565b5f808335601e19843603018112614d88575f80fd5b8301803591506001600160401b03821115614da1575f80fd5b6020019150600581901b36038213156123b7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614de0575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614e2057614e20614dea565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614e4e57614e4e614dea565b604052919050565b5f6001600160401b03821115614e6e57614e6e614dea565b50601f01601f191660200190565b5f60608236031215614e8c575f80fd5b614e94614dfe565b823581526020614ea5818501614a7c565b8183015260408401356001600160401b03811115614ec1575f80fd5b840136601f820112614ed1575f80fd5b8035614ee4614edf82614e56565b614e26565b8181523684838501011115614ef7575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614de0818460208701614cd1565b80820180821115610c5557610c55614c48565b5f63ffffffff808316818103614f4f57614f4f614c48565b6001019392505050565b8082028115828204841417610c5557610c55614c48565b600181811c90821680614f8457607f821691505b602082108103614a3b57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614fb481614f70565b806020870152604060018084165f8114614fd55760018114614ff15761501e565b60ff19851660408a0152604084151560051b8a0101955061501e565b895f5260205f205f5b858110156150155781548b8201860152908301908801614ffa565b8a016040019650505b509398975050505050505050565b8051611f42816149b8565b5f8060408385031215615048575f80fd5b82516001600160401b038082111561505e575f80fd5b9084019060608287031215615071575f80fd5b615079614dfe565b8251815260208084015161508c81614d44565b828201526040840151838111156150a1575f80fd5b80850194505087601f8501126150b5575f80fd5b835192506150c5614edf84614e56565b83815288828587010111156150d8575f80fd5b6150e784838301848801614cd1565b806040840152508195506150fc81880161502c565b9450505050509250929050565b6001600160401b03818116838216019080821115612df357612df3614c48565b81810381811115610c5557610c55614c48565b5f808335601e19843603018112615151575f80fd5b8301803591506001600160401b0382111561516a575f80fd5b6020019150368190038213156123b7575f80fd5b6001600160401b038181168382160280821691908281146151a1576151a1614c48565b505092915050565b5f6001600160401b03808316818103614f4f57614f4f614c48565b5f602082840312156151d4575f80fd5b610c9382614a6b565b5f602082840312156151ed575f80fd5b813560ff81168114610c93575f80fd5b601f821115610c4057805f5260205f20601f840160051c810160208510156152225750805b601f840160051c820191505b81811015610d34575f815560010161522e565b81516001600160401b0381111561525a5761525a614dea565b61526e816152688454614f70565b846151fd565b602080601f8311600181146152a1575f841561528a5750858301515b5f19600386901b1c1916600185901b178555612b02565b5f85815260208120601f198616915b828110156152cf578886015182559484019460019091019084016152b0565b50858210156152ec57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161535181604e860160208901614cd1565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 6e555fdcd..12cda8bcd 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -176,13 +176,32 @@ abstract contract PoSValidatorManager is bool includeUptimeProof, uint32 messageIndex ) external { + uint256 reward = _initializeEndPoSValidation(validationID, includeUptimeProof, messageIndex); + if (reward == 0) { + revert ValidatorIneligibleForRewards(); + } + } + + function forceInitializeEndValidation( + bytes32 validationID, + bool includeUptimeProof, + uint32 messageIndex + ) external { + _initializeEndPoSValidation(validationID, includeUptimeProof, messageIndex); + } + + function _initializeEndPoSValidation( + bytes32 validationID, + bool includeUptimeProof, + uint32 messageIndex + ) internal returns (uint256) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Validator memory validator = _initializeEndValidation(validationID); // Non-PoS validators are required to boostrap the network, but are not eligible for rewards. if (!_isPoSValidator(validationID)) { - return; + revert ValidatorNotPoS(); } // PoS validations can only be ended by their owners. @@ -215,46 +234,8 @@ abstract contract PoSValidatorManager is initialSupply: 0, endSupply: 0 }); - if (reward == 0) { - revert ValidatorIneligibleForRewards(); - } $._redeemableValidatorRewards[validationID] += reward; - } - - function forceInitializeEndValidation( - bytes32 validationID, - bool includeUptimeProof, - uint32 messageIndex - ) external { - PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - - Validator memory validator = _initializeEndValidation(validationID); - - // Check that minimum stake duration has passed - if ( - validator.endedAt - < validator.startedAt + $._posValidatorInfo[validationID].minStakeDuration - ) { - revert InvalidStakeDuration(); - } - - // Uptime proofs include the absolute number of seconds the validator has been active. - uint64 uptimeSeconds; - if (includeUptimeProof) { - uptimeSeconds = _updateUptime(validationID, messageIndex); - } else { - uptimeSeconds = $._validationUptimeSeconds[validationID]; - } - - $._redeemableValidatorRewards[validationID] += $._rewardCalculator.calculateReward({ - stakeAmount: weightToValue(validator.startingWeight), - validatorStartTime: validator.startedAt, - stakingStartTime: validator.startedAt, - stakingEndTime: validator.endedAt, - uptimeSeconds: uptimeSeconds, - initialSupply: 0, - endSupply: 0 - }); + return reward; } function completeEndValidation(uint32 messageIndex) external { @@ -305,12 +286,11 @@ abstract contract PoSValidatorManager is PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); if (uptime > $._validationUptimeSeconds[validationID]) { $._validationUptimeSeconds[validationID] = uptime; + emit UptimeUpdated(validationID, uptime); } else { uptime = $._validationUptimeSeconds[validationID]; } - emit UptimeUpdated(validationID, uptime); - return uptime; } From bb4d482bee1c2d08fd2ea2fce781fd3ae91e61d4 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 24 Sep 2024 15:11:48 -0500 Subject: [PATCH 405/545] fix e2e --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 9 ++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index b3000d5a7..295151261 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161585638038061585683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6157098061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c80638280a25a116100fe578063ba3a4b971161009e578063df93d8de1161006e578063df93d8de14610408578063e7d14c1c14610412578063eb0acb8914610450578063f09969ae14610463575f80fd5b8063ba3a4b97146103ba578063bee0a03f146103cd578063c974d1b6146103e0578063d5f20ff6146103e8575f80fd5b80639dde029a116100d95780639dde029a1461035b5780639e1bc4ef1461036e578063a3a65e4814610381578063b771b3bc14610394575f80fd5b80638280a25a1461032d57806393e245981461033557806398f3e2b414610348575f80fd5b8063467ef06f11610174578063620658561161014457806362065856146102df57806366435abf14610300578063732214f81461031357806376f786211461031a575f80fd5b8063467ef06f146102895780635297fae61461029c57806360305d62146102af57806361e2f490146102cc575f80fd5b806325e1c776116101af57806325e1c7761461021c5780632e2194d81461022f57806335455ded1461025a5780633a1cfff614610276575f80fd5b80630118acc4146101d55780630322ed98146101ea578063151d30d1146101fd575b5f80fd5b6101e86101e3366004614c25565b610476565b005b6101e86101f8366004614c60565b61081d565b610205600a81565b60405160ff90911681526020015b60405180910390f35b6101e861022a366004614c77565b61098f565b61024261023d366004614c60565b6109ff565b6040516001600160401b039091168152602001610213565b61026361271081565b60405161ffff9091168152602001610213565b6101e8610284366004614c25565b610a15565b6101e8610297366004614ca1565b610a20565b6101e86102aa366004614cba565b610ac1565b6102b7601481565b60405163ffffffff9091168152602001610213565b6101e86102da366004614ce2565b610e94565b6102f26102ed366004614d3d565b611313565b604051908152602001610213565b61024261030e366004614c60565b61132c565b6102f25f81565b6101e8610328366004614c25565b611340565b610205603081565b6101e8610343366004614c60565b61136e565b6101e8610356366004614cba565b611425565b6101e8610369366004614c60565b6115b7565b6102f261037c366004614d56565b61182e565b6101e861038f366004614ca1565b61185a565b6103a26005600160991b0181565b6040516001600160a01b039091168152602001610213565b6101e86103c8366004614c60565b6119c7565b6101e86103db366004614c60565b611ba3565b610205601481565b6103fb6103f6366004614c60565b611cc8565b6040516102139190614d8a565b6102426202a30081565b6102f2610420366004614c60565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102f261045e366004614e4a565b611d90565b6101e8610471366004614ec3565b611dc5565b5f8381525f8051602061563d8339815191526020526040808220815160e0810190925280545f8051602061567d83398151915293929190829060ff1660038111156104c3576104c3614d76565b60038111156104d4576104d4614d76565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61054a82611cc8565b905060028351600381111561056157610561614d76565b1461057f5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105ac5760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f806002835160058111156105ca576105ca614d76565b0361061b5787156105e2576105df8488611ea4565b91505b5f856060015184608001516105f79190614f15565b905061060385826120fc565b506001600160401b031660c08701525042905061064d565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b59061067290611313565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106a29796959493929190614f35565b602060405180830381865afa1580156106bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e19190614f73565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561072057610720614d76565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061080a9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206156dd8339815191526020526040808220815160e0810190925280545f8051602061569d83398151915293929190829060ff16600581111561086a5761086a614d76565b600581111561087b5761087b614d76565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108ea576108ea614d76565b146109085760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61092d8584606001515f612253565b6040518263ffffffff1660e01b81526004016109499190614fac565b6020604051808303815f875af1158015610965573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109899190614f73565b50505050565b610998826122aa565b6109b557604051636ca57bcf60e01b815260040160405180910390fd5b60026109c083611cc8565b5160058111156109d2576109d2614d76565b146109f05760405163a36c527f60e01b815260040160405180910390fd5b6109fa8282611ea4565b505050565b5f610a0f64e8d4a5100083614fde565b92915050565b6109898383836122e5565b5f8051602061567d8339815191525f80610a39846124c3565b91509150610a46826122aa565b610a505750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610a7f57610a7f614d76565b03610aa4575f83815260078501602052604081208054919055610aa28282612753565b505b610aba81610ab58460400151611313565b6127c9565b5050505050565b5f8181525f8051602061563d8339815191526020526040808220815160e0810190925280545f8051602061567d83398151915293929190829060ff166003811115610b0e57610b0e614d76565b6003811115610b1f57610b1f614d76565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610b9690611cc8565b905060015f85815260058501602052604090205460ff166003811115610bbe57610bbe614d76565b14610bdc5760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610bf157610bf1614d76565b03610d3a57600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610c4b57610c4b614d76565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610d4f57610d4f614d76565b03610d5d57610aba846127ec565b5f80610d74610d6b886129c9565b60400151612ac9565b509150915081846040015114610d9d57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610de557505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b15610e0357604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061569d8339815191529060ff1615610ee657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4d9190614f73565b836020013514610f705760405163d040949d60e01b815260040160405180910390fd5b30610f816060850160408601614ffd565b6001600160a01b031614610fa85760405163e6c4247b60e01b815260040160405180910390fd5b5f610fb66060850185615018565b905090505f805b828163ffffffff161015611262575f610fd96060880188615018565b8363ffffffff16818110610fef57610fef61505d565b90506020028101906110019190615071565b61100a90615121565b80515f818152600888016020526040902054919250901561103e57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161106d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052611087916151b8565b602060405180830381855afa1580156110a2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110c59190614f73565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561115157611151614d76565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112049116866151c9565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061125b906151dc565b9050610fbd565b50600483018190555f611280611277866129c9565b60400151612d07565b90505f61128c87612e7c565b90508160028260405161129f91906151b8565b602060405180830381855afa1580156112ba573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112dd9190614f73565b146112fb57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610a0f6001600160401b03831664e8d4a510006151fe565b5f61133682611cc8565b6080015192915050565b5f61134c8484846122e5565b9050805f036109895760405163d802b9f360e01b815260040160405180910390fd5b5f8051602061567d833981519152600461138783611cc8565b51600581111561139957611399614d76565b146113b75760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146113ef5760405163e6c4247b60e01b815260040160405180910390fd5b5f828152600782016020908152604080832080549084905560048501909252909120546109fa906001600160a01b031682612753565b61142d613315565b5f8181525f8051602061563d8339815191526020526040808220815160e0810190925280545f8051602061567d83398151915293929190829060ff16600381111561147a5761147a614d76565b600381111561148b5761148b614d76565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f806114fd610d6b876129c9565b50915091508183604001511461152657604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b0316111561155d57604051633ab3447f60e11b815260040160405180910390fd5b60038351600381111561157257611572614d76565b146115905760405163f95c7fe160e01b815260040160405180910390fd5b611599856127ec565b505050506115b360015f805160206156bd83398151915255565b5050565b6115bf613315565b5f8181525f8051602061563d8339815191526020526040808220815160e0810190925280545f8051602061567d83398151915293929190829060ff16600381111561160c5761160c614d76565b600381111561161d5761161d614d76565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61169382611cc8565b90505f835160038111156116a9576116a9614d76565b036116c757604051631d0b665760e21b815260040160405180910390fd5b6004815160058111156116dc576116dc614d76565b146116fa5760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561170f5761170f614d76565b036117265761171d856127ec565b50505050611815565b60028351600381111561173b5761173b614d76565b0361180757600384015460608401516001600160a01b039091169063778c06b59061176590611313565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b1681526117b796959493926001600160401b0390921691908190600401614f35565b602060405180830381865afa1580156117d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f69190614f73565b5f8681526006860160205260409020555b611810856127ec565b505050505b61182b60015f805160206156bd83398151915255565b50565b5f611837613315565b61184283338461335f565b9050610a0f60015f805160206156bd83398151915255565b5f8051602061569d8339815191525f8061187f611876856129c9565b60400151613626565b91509150806118a157604051633dbcaef760e01b815260040160405180910390fd5b5f828152600684016020526040902080546118bb90615215565b90505f036118dc57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff16600581111561190257611902614d76565b146119205760405163a36c527f60e01b815260040160405180910390fd5b5f828152600684016020526040812061193891614b75565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f8051602061563d8339815191526020526040808220815160e0810190925280545f8051602061567d83398151915293929190829060ff166003811115611a1457611a14614d76565b6003811115611a2557611a25614d76565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a9e57611a9e614d76565b14158015611abf5750600381516003811115611abc57611abc614d76565b14155b15611add5760405163f95c7fe160e01b815260040160405180910390fd5b5f611aeb8260400151611cc8565b905080606001516001600160401b03165f03611b1a57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611b47846040015184606001518560800151612253565b6040518263ffffffff1660e01b8152600401611b639190614fac565b6020604051808303815f875af1158015611b7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba9190614f73565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061569d8339815191529190611bea90615215565b90505f03611c0b57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611c3157611c31614d76565b14611c4f5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c88919060040161524d565b6020604051808303815f875af1158015611ca4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109fa9190614f73565b611cd0614bac565b5f8281525f805160206156dd833981519152602052604090819020815160e0810190925280545f8051602061569d833981519152929190829060ff166005811115611d1d57611d1d614d76565b6005811115611d2e57611d2e614d76565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611d99613315565b611da5858585856137ca565b9050611dbd60015f805160206156bd83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611e0e575080546001600160401b03808416911610155b15611e2c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611e578484613968565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611eef573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f1691908101906152e2565b9150915080611f3857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9f9190614f73565b825114611fbf5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611feb5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ffa8460400151613982565b9150915081871461201e57604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260409020545f8051602061567d833981519152906001600160401b0390811690831611156120d5575f888152600882016020908152604091829020805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26120f1565b5f8881526008820160205260409020546001600160401b031691505b509695505050505050565b5f8281525f805160206156dd833981519152602052604081206002015481905f8051602061569d83398151915290600160801b90046001600160401b03166121448582613b5d565b5f61214e87613d26565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61219e8a858b612253565b6040518263ffffffff1660e01b81526004016121ba9190614fac565b6020604051808303815f875af11580156121d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fa9190614f73565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061567d833981519152816122fe86613d9b565b9050612309866122aa565b61232657604051636ca57bcf60e01b815260040160405180910390fd5b5f8681526004830160205260409020546001600160a01b0316331461235e5760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a082015161238d91600160b01b90046001600160401b0316906153b4565b6001600160401b03168160c001516001600160401b031610156123c3576040516302336bad60e51b815260040160405180910390fd5b5f85156123db576123d48786611ea4565b90506123f6565b505f8681526008830160205260409020546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061241b90611313565b60a086015160c08701516040516001600160e01b031960e086901b16815261244f939291829189905f908190600401614f35565b602060405180830381865afa15801561246a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248e9190614f73565b905080846007015f8a81526020019081526020015f205f8282546124b291906151c9565b909155509098975050505050505050565b5f6124cc614bac565b5f8051602061569d8339815191525f806124e8611876876129c9565b91509150801561250b57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561253c5761253c614d76565b600581111561254d5761254d614d76565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125bc576125bc614d76565b141580156125dd57506001815160058111156125da576125da614d76565b14155b156125fb5760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561261057612610614d76565b0361261e5760048152612623565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff1916600183600581111561266857612668614d76565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561271c5761271c614d76565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f8051602061565d83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156127ae575f80fd5b505af11580156127c0573d5f803e3d5ffd5b50505050505050565b5f8051602061565d833981519152546115b3906001600160a01b03168383613fd8565b5f8181525f8051602061563d8339815191526020526040808220815160e0810190925280545f8051602061567d83398151915293929190829060ff16600381111561283957612839614d76565b600381111561284a5761284a614d76565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687018252828120805490829055848252600488019092529182205493945091926127109061291f90600160a01b900461ffff16846151fe565b6129299190614fde565b905080856007015f8581526020019081526020015f205f82825461294d91906151c9565b909155505f905061295e82846153d4565b905061296e856020015182612753565b6129838560200151610ab58760600151611313565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a2d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a5491908101906152e2565b9150915080612a7657604051636b2f19e960e01b815260040160405180910390fd5b815115612a965760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612ac25760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612aee57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b3d57612b058160016153d4565b612b109060086151fe565b61ffff16868281518110612b2657612b2661505d565b016020015160f81c901b9190911790600101612af1565b5061ffff811615612b615760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612bbc57612b788160036153d4565b612b839060086151fe565b63ffffffff1687612b958360026151c9565b81518110612ba557612ba561505d565b016020015160f81c901b9190911790600101612b64565b5063ffffffff8116600414612be457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c3957612bfb81601f6153d4565b612c069060086151fe565b88612c128360066151c9565b81518110612c2257612c2261505d565b016020015160f81c901b9190911790600101612be7565b505f805b6008811015612c9857612c518160076153d4565b612c5c9060086151fe565b6001600160401b031689612c718360266151c9565b81518110612c8157612c8161505d565b016020015160f81c901b9190911790600101612c3d565b505f805b6008811015612cf757612cb08160076153d4565b612cbb9060086151fe565b6001600160401b03168a612cd083602e6151c9565b81518110612ce057612ce061505d565b016020015160f81c901b9190911790600101612c9c565b5091989097509095509350505050565b5f8151602614612d2a57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612d7957612d418160016153d4565b612d4c9060086151fe565b61ffff16848281518110612d6257612d6261505d565b016020015160f81c901b9190911790600101612d2d565b5061ffff811615612d9d5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612df857612db48160036153d4565b612dbf9060086151fe565b63ffffffff1685612dd18360026151c9565b81518110612de157612de161505d565b016020015160f81c901b9190911790600101612da0565b5063ffffffff811615612e1e57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612e7357612e3581601f6153d4565b612e409060086151fe565b86612e4c8360066151c9565b81518110612e5c57612e5c61505d565b016020015160f81c901b9190911790600101612e21565b50949350505050565b60605f612e8b83830184615018565b612e97915060586151fe565b612ea290605c6151c9565b6001600160401b03811115612eb957612eb961508f565b6040519080825280601f01601f191660200182016040528015612ee3576020820181803683370190505b5090505f5b6020811015612f385783358160208110612f0457612f0461505d565b1a60f81b828281518110612f1a57612f1a61505d565b60200101906001600160f81b03191690815f1a905350600101612ee8565b505f5b6020811015612f985783602001358160208110612f5a57612f5a61505d565b1a60f81b82612f6a8360206151c9565b81518110612f7a57612f7a61505d565b60200101906001600160f81b03191690815f1a905350600101612f3b565b505f5b6004811015612ffb57612faf8160036153d4565b612fba9060086151fe565b6014901c60f81b82612fcd8360406151c9565b81518110612fdd57612fdd61505d565b60200101906001600160f81b03191690815f1a905350600101612f9b565b505f61300d6060850160408601614ffd565b60601b90505f5b601481101561306d5781816014811061302f5761302f61505d565b1a60f81b8361303f8360446151c9565b8151811061304f5761304f61505d565b60200101906001600160f81b03191690815f1a905350600101613014565b505f61307c6060860186615018565b905090505f5b60048110156130e7576130968160036153d4565b6130a19060086151fe565b63ffffffff8316901c60f81b846130b98360586151c9565b815181106130c9576130c961505d565b60200101906001600160f81b03191690815f1a905350600101613082565b505f5b6130f76060870187615018565b905081101561330b575f61310c8260586151fe565b61311790605c6151c9565b90505f5b60208110156131a2576131316060890189615018565b848181106131415761314161505d565b90506020028101906131539190615071565b3581602081106131655761316561505d565b1a60f81b8661317483856151c9565b815181106131845761318461505d565b60200101906001600160f81b03191690815f1a90535060010161311b565b505f5b6008811015613257576131b98160076153d4565b6131c49060086151fe565b6131d160608a018a615018565b858181106131e1576131e161505d565b90506020028101906131f39190615071565b613204906040810190602001614d3d565b6001600160401b0316901c60f81b868261321f8560206151c9565b61322991906151c9565b815181106132395761323961505d565b60200101906001600160f81b03191690815f1a9053506001016131a5565b505f5b6030811015613301576132706060890189615018565b848181106132805761328061505d565b90506020028101906132929190615071565b6132a09060408101906153e7565b828181106132b0576132b061505d565b9050013560f81c60f81b86828460286132c991906151c9565b6132d391906151c9565b815181106132e3576132e361505d565b60200101906001600160f81b03191690815f1a90535060010161325a565b50506001016130ea565b5091949350505050565b5f805160206156bd83398151915280546001190161334657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206156bd83398151915255565b5f5f8051602061567d8339815191528161337b61023d85614037565b90505f61338787611cc8565b9050613392876122aa565b6133af57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156133c4576133c4614d76565b146133e25760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516133f391906153b4565b905083600201600a9054906101000a90046001600160401b0316826040015161341c9190615429565b6001600160401b0316816001600160401b0316111561344e57604051630c192e7760e41b815260040160405180910390fd5b5f8061345a8a846120fc565b915091505f8a8360405160200161348892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561351b5761351b614d76565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461364a57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613699576136618160016153d4565b61366c9060086151fe565b61ffff168582815181106136825761368261505d565b016020015160f81c901b919091179060010161364d565b5061ffff8116156136bd5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613718576136d48160036153d4565b6136df9060086151fe565b63ffffffff16866136f18360026151c9565b815181106137015761370161505d565b016020015160f81c901b91909117906001016136c0565b5063ffffffff811660031461374057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137955761375781601f6153d4565b6137629060086151fe565b8761376e8360066151c9565b8151811061377e5761377e61505d565b016020015160f81c901b9190911790600101613743565b505f866026815181106137aa576137aa61505d565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061567d83398151915290600160401b900461ffff908116908616108061381e575061271061ffff8616115b1561383c5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561386e576040516302336bad60e51b815260040160405180910390fd5b80548310806138805750806001015483115b1561389e57604051630103be3b60e21b815260040160405180910390fd5b5f6138a884614037565b90505f6138b4826109ff565b90505f6138c1898361405a565b905060405180606001604052806138d53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613970614444565b6139798261448f565b6115b3816144fd565b5f808251602e146139a657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156139f5576139bd8160016153d4565b6139c89060086151fe565b61ffff168582815181106139de576139de61505d565b016020015160f81c901b91909117906001016139a9565b5061ffff811615613a195760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613a7457613a308160036153d4565b613a3b9060086151fe565b63ffffffff1686613a4d8360026151c9565b81518110613a5d57613a5d61505d565b016020015160f81c901b9190911790600101613a1c565b5063ffffffff8116600514613a9c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613af157613ab381601f6153d4565b613abe9060086151fe565b87613aca8360066151c9565b81518110613ada57613ada61505d565b016020015160f81c901b9190911790600101613a9f565b505f805b6008811015613b5057613b098160076153d4565b613b149060086151fe565b6001600160401b031688613b298360266151c9565b81518110613b3957613b3961505d565b016020015160f81c901b9190911790600101613af5565b5090969095509350505050565b5f8051602061569d8339815191525f6001600160401b038084169085161115613b9157613b8a8385614f15565b9050613b9e565b613b9b8484614f15565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613c00575060018401548151613bfc916001600160401b0316906151c9565b8210155b15613c26576001600160401b038316606082015281815260408101516020820152613c45565b8281606001818151613c3891906153b4565b6001600160401b03169052505b6060810151613c55906064615429565b602082015160018601546001600160401b039290921691613c809190600160401b900460ff166151fe565b1015613c9f5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613cba91906151c9565b9052506040810180516001600160401b0387169190613cda9083906153d4565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206156dd8339815191526020526040812060020180545f8051602061569d8339815191529190600890613d7090600160401b90046001600160401b0316615454565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b613da3614bac565b5f8281525f805160206156dd8339815191526020526040808220815160e0810190925280545f8051602061569d83398151915293929190829060ff166005811115613df057613df0614d76565b6005811115613e0157613e01614d76565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e7357613e73614d76565b14613e915760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ed557613ed5614d76565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f8185826120fc565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526109fa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061455a565b5f610a0f825f8051602061565d833981519152546001600160a01b0316906145c0565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661409e57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061569d833981519152426140bd6040860160208701614d3d565b6001600160401b03161115806140f757506140db6202a300426151c9565b6140eb6040860160208701614d3d565b6001600160401b031610155b156141145760405162d36c8560e81b815260040160405180910390fd5b603061412360408601866153e7565b905014158061413157508335155b1561414f5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561417f57604051630eb0d31360e11b815260040160405180910390fd5b614189835f613b5d565b5f806142226040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906141cd9190614d3d565b6001600160401b031681526020016141e860408a018a6153e7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614722565b5f8281526006860160205260409020919350915061424082826154b3565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb9061427e908590600401614fac565b6020604051808303815f875af115801561429a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142be9190614f73565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561433657614336614d76565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614416918e01908e01614d3d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661448d57604051631afcd79f60e31b815260040160405180910390fd5b565b614497614444565b6144a0816147e5565b6144a86147fe565b61182b606082013560808301356144c560c0850160a08601614d3d565b6144d560e0860160c08701615572565b6144e6610100870160e0880161558b565b6144f861012088016101008901614ffd565b61480e565b614505614444565b5f8051602061565d8339815191526001600160a01b03821661453a5760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f61456e6001600160a01b0384168361492f565b905080515f1415801561459257508080602001905181019061459091906155ab565b155b156109fa57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614606573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061462a9190614f73565b90506146416001600160a01b03851633308661493c565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614685573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146a99190614f73565b905081811161470f5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016145b7565b61471982826153d4565b95945050505050565b5f606082608001515160301461474b57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161477d97969594939291906155c6565b604051602081830303815290604052905060028160405161479e91906151b8565b602060405180830381855afa1580156147b9573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906147dc9190614f73565b94909350915050565b6147ed614444565b6147f5614975565b61182b8161497d565b614806614444565b61448d614a4f565b614816614444565b5f8051602061567d83398151915261ffff8416158061483a575061271061ffff8516115b156148585760405163c98d73a760e01b815260040160405180910390fd5b8587111561487957604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061488c5750600a60ff8416115b156148aa576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b60606122a383835f614a57565b6040516001600160a01b0384811660248301528381166044830152606482018390526109899186918216906323b872dd90608401614005565b61448d614444565b614985614444565b80355f8051602061569d83398151915290815560146149aa606084016040850161558b565b60ff1611806149c957506149c4606083016040840161558b565b60ff16155b156149e75760405163b4fa3fb360e01b815260040160405180910390fd5b6149f7606083016040840161558b565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a286040830160208401614d3d565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61334c614444565b606081471015614a7c5760405163cd78605960e01b81523060048201526024016145b7565b5f80856001600160a01b03168486604051614a9791906151b8565b5f6040518083038185875af1925050503d805f8114614ad1576040519150601f19603f3d011682016040523d82523d5f602084013e614ad6565b606091505b5091509150614ae6868383614af0565b9695505050505050565b606082614b0557614b0082614b4c565b6122a3565b8151158015614b1c57506001600160a01b0384163b155b15614b4557604051639996b31560e01b81526001600160a01b03851660048201526024016145b7565b50806122a3565b805115614b5c5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614b8190615215565b5f825580601f10614b90575050565b601f0160209004905f5260205f209081019061182b9190614be8565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614bfc575f8155600101614be9565b5090565b801515811461182b575f80fd5b803563ffffffff81168114614c20575f80fd5b919050565b5f805f60608486031215614c37575f80fd5b833592506020840135614c4981614c00565b9150614c5760408501614c0d565b90509250925092565b5f60208284031215614c70575f80fd5b5035919050565b5f8060408385031215614c88575f80fd5b82359150614c9860208401614c0d565b90509250929050565b5f60208284031215614cb1575f80fd5b6122a382614c0d565b5f8060408385031215614ccb575f80fd5b614cd483614c0d565b946020939093013593505050565b5f8060408385031215614cf3575f80fd5b82356001600160401b03811115614d08575f80fd5b830160808186031215614d19575f80fd5b9150614c9860208401614c0d565b80356001600160401b0381168114614c20575f80fd5b5f60208284031215614d4d575f80fd5b6122a382614d27565b5f8060408385031215614d67575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614dad57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614de860608401826001600160401b03169052565b506080830151614e0360808401826001600160401b03169052565b5060a0830151614e1e60a08401826001600160401b03169052565b5060c0830151612ac260c08401826001600160401b03169052565b803561ffff81168114614c20575f80fd5b5f805f8060808587031215614e5d575f80fd5b84356001600160401b03811115614e72575f80fd5b850160608188031215614e83575f80fd5b9350614e9160208601614e39565b9250614e9f60408601614d27565b9396929550929360600135925050565b6001600160a01b038116811461182b575f80fd5b5f80828403610140811215614ed6575f80fd5b61012080821215614ee5575f80fd5b8493508301359050614ef681614eaf565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612ac257612ac2614f01565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614f83575f80fd5b5051919050565b5f5b83811015614fa4578181015183820152602001614f8c565b50505f910152565b602081525f8251806020840152614fca816040850160208701614f8a565b601f01601f19169190910160400192915050565b5f82614ff857634e487b7160e01b5f52601260045260245ffd5b500490565b5f6020828403121561500d575f80fd5b81356122a381614eaf565b5f808335601e1984360301811261502d575f80fd5b8301803591506001600160401b03821115615046575f80fd5b6020019150600581901b360382131561224c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615085575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150c5576150c561508f565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150f3576150f361508f565b604052919050565b5f6001600160401b038211156151135761511361508f565b50601f01601f191660200190565b5f60608236031215615131575f80fd5b6151396150a3565b82358152602061514a818501614d27565b8183015260408401356001600160401b03811115615166575f80fd5b840136601f820112615176575f80fd5b8035615189615184826150fb565b6150cb565b818152368483850101111561519c575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615085818460208701614f8a565b80820180821115610a0f57610a0f614f01565b5f63ffffffff8083168181036151f4576151f4614f01565b6001019392505050565b8082028115828204841417610a0f57610a0f614f01565b600181811c9082168061522957607f821691505b60208210810361524757634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461525f81615215565b806020870152604060018084165f8114615280576001811461529c576152c9565b60ff19851660408a0152604084151560051b8a010195506152c9565b895f5260205f205f5b858110156152c05781548b82018601529083019088016152a5565b8a016040019650505b509398975050505050505050565b8051614c2081614c00565b5f80604083850312156152f3575f80fd5b82516001600160401b0380821115615309575f80fd5b908401906060828703121561531c575f80fd5b6153246150a3565b8251815260208084015161533781614eaf565b8282015260408401518381111561534c575f80fd5b80850194505087601f850112615360575f80fd5b83519250615370615184846150fb565b8381528882858701011115615383575f80fd5b61539284838301848801614f8a565b806040840152508195506153a78188016152d7565b9450505050509250929050565b6001600160401b03818116838216019080821115612ac257612ac2614f01565b81810381811115610a0f57610a0f614f01565b5f808335601e198436030181126153fc575f80fd5b8301803591506001600160401b03821115615415575f80fd5b60200191503681900382131561224c575f80fd5b6001600160401b0381811683821602808216919082811461544c5761544c614f01565b505092915050565b5f6001600160401b038083168181036151f4576151f4614f01565b601f8211156109fa57805f5260205f20601f840160051c810160208510156154945750805b601f840160051c820191505b81811015610aba575f81556001016154a0565b81516001600160401b038111156154cc576154cc61508f565b6154e0816154da8454615215565b8461546f565b602080601f831160018114615513575f84156154fc5750858301515b5f19600386901b1c1916600185901b17855561556a565b5f85815260208120601f198616915b8281101561554157888601518255948401946001909101908401615522565b508582101561555e57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615582575f80fd5b6122a382614e39565b5f6020828403121561559b575f80fd5b813560ff811681146122a3575f80fd5b5f602082840312156155bb575f80fd5b81516122a381614c00565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161561b81604e860160208901614f8a565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161584338038061584383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6156f68061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c80638280a25a116100fe578063ba3a4b971161009e578063df93d8de1161006e578063df93d8de14610408578063e7d14c1c14610412578063eb0acb8914610450578063f09969ae14610463575f80fd5b8063ba3a4b97146103ba578063bee0a03f146103cd578063c974d1b6146103e0578063d5f20ff6146103e8575f80fd5b80639dde029a116100d95780639dde029a1461035b5780639e1bc4ef1461036e578063a3a65e4814610381578063b771b3bc14610394575f80fd5b80638280a25a1461032d57806393e245981461033557806398f3e2b414610348575f80fd5b8063467ef06f11610174578063620658561161014457806362065856146102df57806366435abf14610300578063732214f81461031357806376f786211461031a575f80fd5b8063467ef06f146102895780635297fae61461029c57806360305d62146102af57806361e2f490146102cc575f80fd5b806325e1c776116101af57806325e1c7761461021c5780632e2194d81461022f57806335455ded1461025a5780633a1cfff614610276575f80fd5b80630118acc4146101d55780630322ed98146101ea578063151d30d1146101fd575b5f80fd5b6101e86101e3366004614c12565b610476565b005b6101e86101f8366004614c4d565b61081d565b610205600a81565b60405160ff90911681526020015b60405180910390f35b6101e861022a366004614c64565b61098f565b61024261023d366004614c4d565b6109ff565b6040516001600160401b039091168152602001610213565b61026361271081565b60405161ffff9091168152602001610213565b6101e8610284366004614c12565b610a15565b6101e8610297366004614c8e565b610a20565b6101e86102aa366004614ca7565b610ac1565b6102b7601481565b60405163ffffffff9091168152602001610213565b6101e86102da366004614ccf565b610e94565b6102f26102ed366004614d2a565b611313565b604051908152602001610213565b61024261030e366004614c4d565b61132c565b6102f25f81565b6101e8610328366004614c12565b611340565b610205603081565b6101e8610343366004614c4d565b611368565b6101e8610356366004614ca7565b61141f565b6101e8610369366004614c4d565b6115b1565b6102f261037c366004614d43565b611828565b6101e861038f366004614c8e565b611854565b6103a26005600160991b0181565b6040516001600160a01b039091168152602001610213565b6101e86103c8366004614c4d565b6119c1565b6101e86103db366004614c4d565b611b9d565b610205601481565b6103fb6103f6366004614c4d565b611cc2565b6040516102139190614d77565b6102426202a30081565b6102f2610420366004614c4d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102f261045e366004614e37565b611d8a565b6101e8610471366004614eb0565b611dbf565b5f8381525f8051602061562a8339815191526020526040808220815160e0810190925280545f8051602061566a83398151915293929190829060ff1660038111156104c3576104c3614d63565b60038111156104d4576104d4614d63565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61054a82611cc2565b905060028351600381111561056157610561614d63565b1461057f5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105ac5760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f806002835160058111156105ca576105ca614d63565b0361061b5787156105e2576105df8488611e9e565b91505b5f856060015184608001516105f79190614f02565b905061060385826120f6565b506001600160401b031660c08701525042905061064d565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b59061067290611313565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106a29796959493929190614f22565b602060405180830381865afa1580156106bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e19190614f60565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561072057610720614d63565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061080a9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206156ca8339815191526020526040808220815160e0810190925280545f8051602061568a83398151915293929190829060ff16600581111561086a5761086a614d63565b600581111561087b5761087b614d63565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108ea576108ea614d63565b146109085760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61092d8584606001515f61224d565b6040518263ffffffff1660e01b81526004016109499190614f99565b6020604051808303815f875af1158015610965573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109899190614f60565b50505050565b610998826122a4565b6109b557604051636ca57bcf60e01b815260040160405180910390fd5b60026109c083611cc2565b5160058111156109d2576109d2614d63565b146109f05760405163a36c527f60e01b815260040160405180910390fd5b6109fa8282611e9e565b505050565b5f610a0f64e8d4a5100083614fcb565b92915050565b6109898383836122df565b5f8051602061566a8339815191525f80610a39846124b0565b91509150610a46826122a4565b610a505750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610a7f57610a7f614d63565b03610aa4575f83815260078501602052604081208054919055610aa28282612740565b505b610aba81610ab58460400151611313565b6127b6565b5050505050565b5f8181525f8051602061562a8339815191526020526040808220815160e0810190925280545f8051602061566a83398151915293929190829060ff166003811115610b0e57610b0e614d63565b6003811115610b1f57610b1f614d63565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610b9690611cc2565b905060015f85815260058501602052604090205460ff166003811115610bbe57610bbe614d63565b14610bdc5760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610bf157610bf1614d63565b03610d3a57600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610c4b57610c4b614d63565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610d4f57610d4f614d63565b03610d5d57610aba846127d9565b5f80610d74610d6b886129b6565b60400151612ab6565b509150915081846040015114610d9d57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610de557505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b15610e0357604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061568a8339815191529060ff1615610ee657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4d9190614f60565b836020013514610f705760405163d040949d60e01b815260040160405180910390fd5b30610f816060850160408601614fea565b6001600160a01b031614610fa85760405163e6c4247b60e01b815260040160405180910390fd5b5f610fb66060850185615005565b905090505f805b828163ffffffff161015611262575f610fd96060880188615005565b8363ffffffff16818110610fef57610fef61504a565b9050602002810190611001919061505e565b61100a9061510e565b80515f818152600888016020526040902054919250901561103e57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161106d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052611087916151a5565b602060405180830381855afa1580156110a2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110c59190614f60565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561115157611151614d63565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112049116866151b6565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061125b906151c9565b9050610fbd565b50600483018190555f611280611277866129b6565b60400151612cf4565b90505f61128c87612e69565b90508160028260405161129f91906151a5565b602060405180830381855afa1580156112ba573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112dd9190614f60565b146112fb57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610a0f6001600160401b03831664e8d4a510006151eb565b5f61133682611cc2565b6080015192915050565b61134b8383836122df565b6109fa5760405163d802b9f360e01b815260040160405180910390fd5b5f8051602061566a833981519152600461138183611cc2565b51600581111561139357611393614d63565b146113b15760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146113e95760405163e6c4247b60e01b815260040160405180910390fd5b5f828152600782016020908152604080832080549084905560048501909252909120546109fa906001600160a01b031682612740565b611427613302565b5f8181525f8051602061562a8339815191526020526040808220815160e0810190925280545f8051602061566a83398151915293929190829060ff16600381111561147457611474614d63565b600381111561148557611485614d63565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f806114f7610d6b876129b6565b50915091508183604001511461152057604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b0316111561155757604051633ab3447f60e11b815260040160405180910390fd5b60038351600381111561156c5761156c614d63565b1461158a5760405163f95c7fe160e01b815260040160405180910390fd5b611593856127d9565b505050506115ad60015f805160206156aa83398151915255565b5050565b6115b9613302565b5f8181525f8051602061562a8339815191526020526040808220815160e0810190925280545f8051602061566a83398151915293929190829060ff16600381111561160657611606614d63565b600381111561161757611617614d63565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61168d82611cc2565b90505f835160038111156116a3576116a3614d63565b036116c157604051631d0b665760e21b815260040160405180910390fd5b6004815160058111156116d6576116d6614d63565b146116f45760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561170957611709614d63565b0361172057611717856127d9565b5050505061180f565b60028351600381111561173557611735614d63565b0361180157600384015460608401516001600160a01b039091169063778c06b59061175f90611313565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b1681526117b196959493926001600160401b0390921691908190600401614f22565b602060405180830381865afa1580156117cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f09190614f60565b5f8681526006860160205260409020555b61180a856127d9565b505050505b61182560015f805160206156aa83398151915255565b50565b5f611831613302565b61183c83338461334c565b9050610a0f60015f805160206156aa83398151915255565b5f8051602061568a8339815191525f80611879611870856129b6565b60400151613613565b915091508061189b57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600684016020526040902080546118b590615202565b90505f036118d657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff1660058111156118fc576118fc614d63565b1461191a5760405163a36c527f60e01b815260040160405180910390fd5b5f828152600684016020526040812061193291614b62565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f8051602061562a8339815191526020526040808220815160e0810190925280545f8051602061566a83398151915293929190829060ff166003811115611a0e57611a0e614d63565b6003811115611a1f57611a1f614d63565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a9857611a98614d63565b14158015611ab95750600381516003811115611ab657611ab6614d63565b14155b15611ad75760405163f95c7fe160e01b815260040160405180910390fd5b5f611ae58260400151611cc2565b905080606001516001600160401b03165f03611b1457604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611b4184604001518460600151856080015161224d565b6040518263ffffffff1660e01b8152600401611b5d9190614f99565b6020604051808303815f875af1158015611b79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba9190614f60565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061568a8339815191529190611be490615202565b90505f03611c0557604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611c2b57611c2b614d63565b14611c495760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c82919060040161523a565b6020604051808303815f875af1158015611c9e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109fa9190614f60565b611cca614b99565b5f8281525f805160206156ca833981519152602052604090819020815160e0810190925280545f8051602061568a833981519152929190829060ff166005811115611d1757611d17614d63565b6005811115611d2857611d28614d63565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611d93613302565b611d9f858585856137b7565b9050611db760015f805160206156aa83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611e08575080546001600160401b03808416911610155b15611e265760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611e518484613955565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ee9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f1091908101906152cf565b9150915080611f3257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f999190614f60565b825114611fb95760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611fe55760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ff4846040015161396f565b9150915081871461201857604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260409020545f8051602061566a833981519152906001600160401b0390811690831611156120cf575f888152600882016020908152604091829020805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26120eb565b5f8881526008820160205260409020546001600160401b031691505b509695505050505050565b5f8281525f805160206156ca833981519152602052604081206002015481905f8051602061568a83398151915290600160801b90046001600160401b031661213e8582613b4a565b5f61214887613d13565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6121988a858b61224d565b6040518263ffffffff1660e01b81526004016121b49190614f99565b6020604051808303815f875af11580156121d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121f49190614f60565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061566a833981519152816122f886613d88565b9050612303866122a4565b6123125760019250505061229d565b5f8681526004830160205260409020546001600160a01b0316331461234a5760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a082015161237991600160b01b90046001600160401b0316906153a1565b6001600160401b03168160c001516001600160401b031610156123af576040516302336bad60e51b815260040160405180910390fd5b5f85156123c7576123c08786611e9e565b90506123e2565b505f8681526008830160205260409020546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061240790611313565b60a086015160c08701516040516001600160e01b031960e086901b16815261243b939291829189905f908190600401614f22565b602060405180830381865afa158015612456573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247a9190614f60565b905080846007015f8a81526020019081526020015f205f82825461249e91906151b6565b90915550501515979650505050505050565b5f6124b9614b99565b5f8051602061568a8339815191525f806124d5611870876129b6565b9150915080156124f857604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561252957612529614d63565b600581111561253a5761253a614d63565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125a9576125a9614d63565b141580156125ca57506001815160058111156125c7576125c7614d63565b14155b156125e85760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156125fd576125fd614d63565b0361260b5760048152612610565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff1916600183600581111561265557612655614d63565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561270957612709614d63565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f8051602061564a83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561279b575f80fd5b505af11580156127ad573d5f803e3d5ffd5b50505050505050565b5f8051602061564a833981519152546115ad906001600160a01b03168383613fc5565b5f8181525f8051602061562a8339815191526020526040808220815160e0810190925280545f8051602061566a83398151915293929190829060ff16600381111561282657612826614d63565b600381111561283757612837614d63565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687018252828120805490829055848252600488019092529182205493945091926127109061290c90600160a01b900461ffff16846151eb565b6129169190614fcb565b905080856007015f8581526020019081526020015f205f82825461293a91906151b6565b909155505f905061294b82846153c1565b905061295b856020015182612740565b6129708560200151610ab58760600151611313565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a1a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a4191908101906152cf565b9150915080612a6357604051636b2f19e960e01b815260040160405180910390fd5b815115612a835760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612aaf5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612adb57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b2a57612af28160016153c1565b612afd9060086151eb565b61ffff16868281518110612b1357612b1361504a565b016020015160f81c901b9190911790600101612ade565b5061ffff811615612b4e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612ba957612b658160036153c1565b612b709060086151eb565b63ffffffff1687612b828360026151b6565b81518110612b9257612b9261504a565b016020015160f81c901b9190911790600101612b51565b5063ffffffff8116600414612bd157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c2657612be881601f6153c1565b612bf39060086151eb565b88612bff8360066151b6565b81518110612c0f57612c0f61504a565b016020015160f81c901b9190911790600101612bd4565b505f805b6008811015612c8557612c3e8160076153c1565b612c499060086151eb565b6001600160401b031689612c5e8360266151b6565b81518110612c6e57612c6e61504a565b016020015160f81c901b9190911790600101612c2a565b505f805b6008811015612ce457612c9d8160076153c1565b612ca89060086151eb565b6001600160401b03168a612cbd83602e6151b6565b81518110612ccd57612ccd61504a565b016020015160f81c901b9190911790600101612c89565b5091989097509095509350505050565b5f8151602614612d1757604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612d6657612d2e8160016153c1565b612d399060086151eb565b61ffff16848281518110612d4f57612d4f61504a565b016020015160f81c901b9190911790600101612d1a565b5061ffff811615612d8a5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612de557612da18160036153c1565b612dac9060086151eb565b63ffffffff1685612dbe8360026151b6565b81518110612dce57612dce61504a565b016020015160f81c901b9190911790600101612d8d565b5063ffffffff811615612e0b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612e6057612e2281601f6153c1565b612e2d9060086151eb565b86612e398360066151b6565b81518110612e4957612e4961504a565b016020015160f81c901b9190911790600101612e0e565b50949350505050565b60605f612e7883830184615005565b612e84915060586151eb565b612e8f90605c6151b6565b6001600160401b03811115612ea657612ea661507c565b6040519080825280601f01601f191660200182016040528015612ed0576020820181803683370190505b5090505f5b6020811015612f255783358160208110612ef157612ef161504a565b1a60f81b828281518110612f0757612f0761504a565b60200101906001600160f81b03191690815f1a905350600101612ed5565b505f5b6020811015612f855783602001358160208110612f4757612f4761504a565b1a60f81b82612f578360206151b6565b81518110612f6757612f6761504a565b60200101906001600160f81b03191690815f1a905350600101612f28565b505f5b6004811015612fe857612f9c8160036153c1565b612fa79060086151eb565b6014901c60f81b82612fba8360406151b6565b81518110612fca57612fca61504a565b60200101906001600160f81b03191690815f1a905350600101612f88565b505f612ffa6060850160408601614fea565b60601b90505f5b601481101561305a5781816014811061301c5761301c61504a565b1a60f81b8361302c8360446151b6565b8151811061303c5761303c61504a565b60200101906001600160f81b03191690815f1a905350600101613001565b505f6130696060860186615005565b905090505f5b60048110156130d4576130838160036153c1565b61308e9060086151eb565b63ffffffff8316901c60f81b846130a68360586151b6565b815181106130b6576130b661504a565b60200101906001600160f81b03191690815f1a90535060010161306f565b505f5b6130e46060870187615005565b90508110156132f8575f6130f98260586151eb565b61310490605c6151b6565b90505f5b602081101561318f5761311e6060890189615005565b8481811061312e5761312e61504a565b9050602002810190613140919061505e565b3581602081106131525761315261504a565b1a60f81b8661316183856151b6565b815181106131715761317161504a565b60200101906001600160f81b03191690815f1a905350600101613108565b505f5b6008811015613244576131a68160076153c1565b6131b19060086151eb565b6131be60608a018a615005565b858181106131ce576131ce61504a565b90506020028101906131e0919061505e565b6131f1906040810190602001614d2a565b6001600160401b0316901c60f81b868261320c8560206151b6565b61321691906151b6565b815181106132265761322661504a565b60200101906001600160f81b03191690815f1a905350600101613192565b505f5b60308110156132ee5761325d6060890189615005565b8481811061326d5761326d61504a565b905060200281019061327f919061505e565b61328d9060408101906153d4565b8281811061329d5761329d61504a565b9050013560f81c60f81b86828460286132b691906151b6565b6132c091906151b6565b815181106132d0576132d061504a565b60200101906001600160f81b03191690815f1a905350600101613247565b50506001016130d7565b5091949350505050565b5f805160206156aa83398151915280546001190161333357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206156aa83398151915255565b5f5f8051602061566a8339815191528161336861023d85614024565b90505f61337487611cc2565b905061337f876122a4565b61339c57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156133b1576133b1614d63565b146133cf5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516133e091906153a1565b905083600201600a9054906101000a90046001600160401b031682604001516134099190615416565b6001600160401b0316816001600160401b0316111561343b57604051630c192e7760e41b815260040160405180910390fd5b5f806134478a846120f6565b915091505f8a8360405160200161347592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561350857613508614d63565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461363757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136865761364e8160016153c1565b6136599060086151eb565b61ffff1685828151811061366f5761366f61504a565b016020015160f81c901b919091179060010161363a565b5061ffff8116156136aa5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613705576136c18160036153c1565b6136cc9060086151eb565b63ffffffff16866136de8360026151b6565b815181106136ee576136ee61504a565b016020015160f81c901b91909117906001016136ad565b5063ffffffff811660031461372d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137825761374481601f6153c1565b61374f9060086151eb565b8761375b8360066151b6565b8151811061376b5761376b61504a565b016020015160f81c901b9190911790600101613730565b505f866026815181106137975761379761504a565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061566a83398151915290600160401b900461ffff908116908616108061380b575061271061ffff8616115b156138295760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561385b576040516302336bad60e51b815260040160405180910390fd5b805483108061386d5750806001015483115b1561388b57604051630103be3b60e21b815260040160405180910390fd5b5f61389584614024565b90505f6138a1826109ff565b90505f6138ae8983614047565b905060405180606001604052806138c23390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b61395d614431565b6139668261447c565b6115ad816144ea565b5f808251602e1461399357604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156139e2576139aa8160016153c1565b6139b59060086151eb565b61ffff168582815181106139cb576139cb61504a565b016020015160f81c901b9190911790600101613996565b5061ffff811615613a065760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613a6157613a1d8160036153c1565b613a289060086151eb565b63ffffffff1686613a3a8360026151b6565b81518110613a4a57613a4a61504a565b016020015160f81c901b9190911790600101613a09565b5063ffffffff8116600514613a8957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613ade57613aa081601f6153c1565b613aab9060086151eb565b87613ab78360066151b6565b81518110613ac757613ac761504a565b016020015160f81c901b9190911790600101613a8c565b505f805b6008811015613b3d57613af68160076153c1565b613b019060086151eb565b6001600160401b031688613b168360266151b6565b81518110613b2657613b2661504a565b016020015160f81c901b9190911790600101613ae2565b5090969095509350505050565b5f8051602061568a8339815191525f6001600160401b038084169085161115613b7e57613b778385614f02565b9050613b8b565b613b888484614f02565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613bed575060018401548151613be9916001600160401b0316906151b6565b8210155b15613c13576001600160401b038316606082015281815260408101516020820152613c32565b8281606001818151613c2591906153a1565b6001600160401b03169052505b6060810151613c42906064615416565b602082015160018601546001600160401b039290921691613c6d9190600160401b900460ff166151eb565b1015613c8c5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613ca791906151b6565b9052506040810180516001600160401b0387169190613cc79083906153c1565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206156ca8339815191526020526040812060020180545f8051602061568a8339815191529190600890613d5d90600160401b90046001600160401b0316615441565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b613d90614b99565b5f8281525f805160206156ca8339815191526020526040808220815160e0810190925280545f8051602061568a83398151915293929190829060ff166005811115613ddd57613ddd614d63565b6005811115613dee57613dee614d63565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e6057613e60614d63565b14613e7e5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ec257613ec2614d63565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f6e85826120f6565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526109fa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614547565b5f610a0f825f8051602061564a833981519152546001600160a01b0316906145ad565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661408b57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061568a833981519152426140aa6040860160208701614d2a565b6001600160401b03161115806140e457506140c86202a300426151b6565b6140d86040860160208701614d2a565b6001600160401b031610155b156141015760405162d36c8560e81b815260040160405180910390fd5b603061411060408601866153d4565b905014158061411e57508335155b1561413c5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561416c57604051630eb0d31360e11b815260040160405180910390fd5b614176835f613b4a565b5f8061420f6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906141ba9190614d2a565b6001600160401b031681526020016141d560408a018a6153d4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061470f565b5f8281526006860160205260409020919350915061422d82826154a0565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb9061426b908590600401614f99565b6020604051808303815f875af1158015614287573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142ab9190614f60565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561432357614323614d63565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614403918e01908e01614d2a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661447a57604051631afcd79f60e31b815260040160405180910390fd5b565b614484614431565b61448d816147d2565b6144956147eb565b611825606082013560808301356144b260c0850160a08601614d2a565b6144c260e0860160c0870161555f565b6144d3610100870160e08801615578565b6144e561012088016101008901614fea565b6147fb565b6144f2614431565b5f8051602061564a8339815191526001600160a01b0382166145275760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f61455b6001600160a01b0384168361491c565b905080515f1415801561457f57508080602001905181019061457d9190615598565b155b156109fa57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156145f3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146179190614f60565b905061462e6001600160a01b038516333086614929565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614672573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146969190614f60565b90508181116146fc5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016145a4565b61470682826153c1565b95945050505050565b5f606082608001515160301461473857604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161476a97969594939291906155b3565b604051602081830303815290604052905060028160405161478b91906151a5565b602060405180830381855afa1580156147a6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906147c99190614f60565b94909350915050565b6147da614431565b6147e2614962565b6118258161496a565b6147f3614431565b61447a614a3c565b614803614431565b5f8051602061566a83398151915261ffff84161580614827575061271061ffff8516115b156148455760405163c98d73a760e01b815260040160405180910390fd5b8587111561486657604051630103be3b60e21b815260040160405180910390fd5b60ff831615806148795750600a60ff8416115b15614897576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061229d83835f614a44565b6040516001600160a01b0384811660248301528381166044830152606482018390526109899186918216906323b872dd90608401613ff2565b61447a614431565b614972614431565b80355f8051602061568a83398151915290815560146149976060840160408501615578565b60ff1611806149b657506149b16060830160408401615578565b60ff16155b156149d45760405163b4fa3fb360e01b815260040160405180910390fd5b6149e46060830160408401615578565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a156040830160208401614d2a565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613339614431565b606081471015614a695760405163cd78605960e01b81523060048201526024016145a4565b5f80856001600160a01b03168486604051614a8491906151a5565b5f6040518083038185875af1925050503d805f8114614abe576040519150601f19603f3d011682016040523d82523d5f602084013e614ac3565b606091505b5091509150614ad3868383614add565b9695505050505050565b606082614af257614aed82614b39565b61229d565b8151158015614b0957506001600160a01b0384163b155b15614b3257604051639996b31560e01b81526001600160a01b03851660048201526024016145a4565b508061229d565b805115614b495780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614b6e90615202565b5f825580601f10614b7d575050565b601f0160209004905f5260205f20908101906118259190614bd5565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614be9575f8155600101614bd6565b5090565b8015158114611825575f80fd5b803563ffffffff81168114614c0d575f80fd5b919050565b5f805f60608486031215614c24575f80fd5b833592506020840135614c3681614bed565b9150614c4460408501614bfa565b90509250925092565b5f60208284031215614c5d575f80fd5b5035919050565b5f8060408385031215614c75575f80fd5b82359150614c8560208401614bfa565b90509250929050565b5f60208284031215614c9e575f80fd5b61229d82614bfa565b5f8060408385031215614cb8575f80fd5b614cc183614bfa565b946020939093013593505050565b5f8060408385031215614ce0575f80fd5b82356001600160401b03811115614cf5575f80fd5b830160808186031215614d06575f80fd5b9150614c8560208401614bfa565b80356001600160401b0381168114614c0d575f80fd5b5f60208284031215614d3a575f80fd5b61229d82614d14565b5f8060408385031215614d54575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614d9a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614dd560608401826001600160401b03169052565b506080830151614df060808401826001600160401b03169052565b5060a0830151614e0b60a08401826001600160401b03169052565b5060c0830151612aaf60c08401826001600160401b03169052565b803561ffff81168114614c0d575f80fd5b5f805f8060808587031215614e4a575f80fd5b84356001600160401b03811115614e5f575f80fd5b850160608188031215614e70575f80fd5b9350614e7e60208601614e26565b9250614e8c60408601614d14565b9396929550929360600135925050565b6001600160a01b0381168114611825575f80fd5b5f80828403610140811215614ec3575f80fd5b61012080821215614ed2575f80fd5b8493508301359050614ee381614e9c565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612aaf57612aaf614eee565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614f70575f80fd5b5051919050565b5f5b83811015614f91578181015183820152602001614f79565b50505f910152565b602081525f8251806020840152614fb7816040850160208701614f77565b601f01601f19169190910160400192915050565b5f82614fe557634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614ffa575f80fd5b813561229d81614e9c565b5f808335601e1984360301811261501a575f80fd5b8301803591506001600160401b03821115615033575f80fd5b6020019150600581901b3603821315612246575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615072575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150b2576150b261507c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150e0576150e061507c565b604052919050565b5f6001600160401b038211156151005761510061507c565b50601f01601f191660200190565b5f6060823603121561511e575f80fd5b615126615090565b823581526020615137818501614d14565b8183015260408401356001600160401b03811115615153575f80fd5b840136601f820112615163575f80fd5b8035615176615171826150e8565b6150b8565b8181523684838501011115615189575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615072818460208701614f77565b80820180821115610a0f57610a0f614eee565b5f63ffffffff8083168181036151e1576151e1614eee565b6001019392505050565b8082028115828204841417610a0f57610a0f614eee565b600181811c9082168061521657607f821691505b60208210810361523457634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461524c81615202565b806020870152604060018084165f811461526d5760018114615289576152b6565b60ff19851660408a0152604084151560051b8a010195506152b6565b895f5260205f205f5b858110156152ad5781548b8201860152908301908801615292565b8a016040019650505b509398975050505050505050565b8051614c0d81614bed565b5f80604083850312156152e0575f80fd5b82516001600160401b03808211156152f6575f80fd5b9084019060608287031215615309575f80fd5b615311615090565b8251815260208084015161532481614e9c565b82820152604084015183811115615339575f80fd5b80850194505087601f85011261534d575f80fd5b8351925061535d615171846150e8565b8381528882858701011115615370575f80fd5b61537f84838301848801614f77565b806040840152508195506153948188016152c4565b9450505050509250929050565b6001600160401b03818116838216019080821115612aaf57612aaf614eee565b81810381811115610a0f57610a0f614eee565b5f808335601e198436030181126153e9575f80fd5b8301803591506001600160401b03821115615402575f80fd5b602001915036819003821315612246575f80fd5b6001600160401b0381811683821602808216919082811461543957615439614eee565b505092915050565b5f6001600160401b038083168181036151e1576151e1614eee565b601f8211156109fa57805f5260205f20601f840160051c810160208510156154815750805b601f840160051c820191505b81811015610aba575f815560010161548d565b81516001600160401b038111156154b9576154b961507c565b6154cd816154c78454615202565b8461545c565b602080601f831160018114615500575f84156154e95750858301515b5f19600386901b1c1916600185901b178555615557565b5f85815260208120601f198616915b8281101561552e5788860151825594840194600190910190840161550f565b508582101561554b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561556f575f80fd5b61229d82614e26565b5f60208284031215615588575f80fd5b813560ff8116811461229d575f80fd5b5f602082840312156155a8575f80fd5b815161229d81614bed565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161560881604e860160208901614f77565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 d961b4af0..b00e73431 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161556c38038061556c83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61541f8061014d5f395ff3fe6080604052600436106101d0575f3560e01c806366435abf116100fd578063b771b3bc11610092578063c974d1b611610062578063c974d1b61461053f578063d5f20ff614610553578063df93d8de1461057f578063e7d14c1c14610595575f80fd5b8063b771b3bc146104d4578063ba3a4b97146104ee578063bee0a03f1461050d578063c599e24f1461052c575f80fd5b806393e24598116100cd57806393e245981461045857806398f3e2b4146104775780639dde029a14610496578063a3a65e48146104b5575f80fd5b806366435abf146103f3578063732214f81461041257806376f78621146104255780638280a25a14610444575f80fd5b806335455ded116101735780635297fae6116101435780635297fae61461036d57806360305d621461038c57806361e2f490146103b557806362065856146103d4575f80fd5b806335455ded146102e65780633a1cfff61461030e57806340034a931461032d578063467ef06f1461034e575f80fd5b806320e55565116101ae57806320e555651461023f57806325e1c7761461025e5780632e2194d81461027d578063329c3e12146102b4575f80fd5b80630118acc4146101d45780630322ed98146101f5578063151d30d114610214575b5f80fd5b3480156101df575f80fd5b506101f36101ee3660046149d8565b6105df565b005b348015610200575f80fd5b506101f361020f366004614a13565b610986565b34801561021f575f80fd5b50610228600a81565b60405160ff90911681526020015b60405180910390f35b34801561024a575f80fd5b506101f3610259366004614a2a565b610af8565b348015610269575f80fd5b506101f3610278366004614a41565b610bd5565b348015610288575f80fd5b5061029c610297366004614a13565b610c45565b6040516001600160401b039091168152602001610236565b3480156102bf575f80fd5b506102ce6001600160991b0181565b6040516001600160a01b039091168152602001610236565b3480156102f1575f80fd5b506102fb61271081565b60405161ffff9091168152602001610236565b348015610319575f80fd5b506101f36103283660046149d8565b610c5b565b61034061033b366004614a92565b610c66565b604051908152602001610236565b348015610359575f80fd5b506101f3610368366004614ae6565b610c9a565b348015610378575f80fd5b506101f3610387366004614aff565b610d3b565b348015610397575f80fd5b506103a0601481565b60405163ffffffff9091168152602001610236565b3480156103c0575f80fd5b506101f36103cf366004614b27565b61110e565b3480156103df575f80fd5b506103406103ee366004614b6c565b61158d565b3480156103fe575f80fd5b5061029c61040d366004614a13565b6115a6565b34801561041d575f80fd5b506103405f81565b348015610430575f80fd5b506101f361043f3660046149d8565b6115ba565b34801561044f575f80fd5b50610228603081565b348015610463575f80fd5b506101f3610472366004614a13565b6115e8565b348015610482575f80fd5b506101f3610491366004614aff565b61169f565b3480156104a1575f80fd5b506101f36104b0366004614a13565b611831565b3480156104c0575f80fd5b506101f36104cf366004614ae6565b611aa8565b3480156104df575f80fd5b506102ce6005600160991b0181565b3480156104f9575f80fd5b506101f3610508366004614a13565b611c15565b348015610518575f80fd5b506101f3610527366004614a13565b611df1565b61034061053a366004614a13565b611f16565b34801561054a575f80fd5b50610228601481565b34801561055e575f80fd5b5061057261056d366004614a13565b611f47565b6040516102369190614b99565b34801561058a575f80fd5b5061029c6202a30081565b3480156105a0575f80fd5b506103406105af366004614a13565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206153738339815191526020526040808220815160e0810190925280545f8051602061539383398151915293929190829060ff16600381111561062c5761062c614b85565b600381111561063d5761063d614b85565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6106b382611f47565b90506002835160038111156106ca576106ca614b85565b146106e85760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146107155760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f8060028351600581111561073357610733614b85565b0361078457871561074b57610748848861200f565b91505b5f856060015184608001516107609190614c5c565b905061076c8582612267565b506001600160401b031660c0870152504290506107b6565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b5906107db9061158d565b8560a00151886080015185875f806040518863ffffffff1660e01b815260040161080b9796959493929190614c7c565b602060405180830381865afa158015610826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084a9190614cba565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561088957610889614b85565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906109739085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206153f38339815191526020526040808220815160e0810190925280545f805160206153b383398151915293929190829060ff1660058111156109d3576109d3614b85565b60058111156109e4576109e4614b85565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a5357610a53614b85565b14610a715760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a968584606001515f6123be565b6040518263ffffffff1660e01b8152600401610ab29190614cf3565b6020604051808303815f875af1158015610ace573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af29190614cba565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b41575080546001600160401b03808416911610155b15610b5f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b898361240d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610bde8261241e565b610bfb57604051636ca57bcf60e01b815260040160405180910390fd5b6002610c0683611f47565b516005811115610c1857610c18614b85565b14610c365760405163a36c527f60e01b815260040160405180910390fd5b610c40828261200f565b505050565b5f610c5564e8d4a5100083614d25565b92915050565b610af2838383612459565b5f610c6f612637565b610c7b8484843461266e565b9050610c9360015f805160206153d383398151915255565b9392505050565b5f805160206153938339815191525f80610cb384612814565b91509150610cc08261241e565b610cca5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610cf957610cf9614b85565b03610d1e575f83815260078501602052604081208054919055610d1c8282612aa4565b505b610d3481610d2f846040015161158d565b612b0a565b5050505050565b5f8181525f805160206153738339815191526020526040808220815160e0810190925280545f8051602061539383398151915293929190829060ff166003811115610d8857610d88614b85565b6003811115610d9957610d99614b85565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610e1090611f47565b905060015f85815260058501602052604090205460ff166003811115610e3857610e38614b85565b14610e565760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610e6b57610e6b614b85565b03610fb457600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610ec557610ec5614b85565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610fc957610fc9614b85565b03610fd757610d3484612b1d565b5f80610fee610fe588612cfa565b60400151612dfa565b50915091508184604001511461101757604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b0316108061105f57505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b1561107d57604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206153b38339815191529060ff161561116057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c79190614cba565b8360200135146111ea5760405163d040949d60e01b815260040160405180910390fd5b306111fb6060850160408601614d58565b6001600160a01b0316146112225760405163e6c4247b60e01b815260040160405180910390fd5b5f6112306060850185614d73565b905090505f805b828163ffffffff1610156114dc575f6112536060880188614d73565b8363ffffffff1681811061126957611269614db8565b905060200281019061127b9190614dcc565b61128490614e7c565b80515f81815260088801602052604090205491925090156112b857604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f0135856040516020016112e792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261130191614f13565b602060405180830381855afa15801561131c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133f9190614cba565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156113cb576113cb614b85565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161147e911686614f24565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114d590614f37565b9050611237565b50600483018190555f6114fa6114f186612cfa565b60400151613038565b90505f611506876131ad565b9050816002826040516115199190614f13565b602060405180830381855afa158015611534573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115579190614cba565b1461157557604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610c556001600160401b03831664e8d4a51000614f59565b5f6115b082611f47565b6080015192915050565b5f6115c6848484612459565b9050805f03610af25760405163d802b9f360e01b815260040160405180910390fd5b5f80516020615393833981519152600461160183611f47565b51600581111561161357611613614b85565b146116315760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146116695760405163e6c4247b60e01b815260040160405180910390fd5b5f82815260078201602090815260408083208054908490556004850190925290912054610c40906001600160a01b031682612aa4565b6116a7612637565b5f8181525f805160206153738339815191526020526040808220815160e0810190925280545f8051602061539383398151915293929190829060ff1660038111156116f4576116f4614b85565b600381111561170557611705614b85565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f80611777610fe587612cfa565b5091509150818360400151146117a057604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b031611156117d757604051633ab3447f60e11b815260040160405180910390fd5b6003835160038111156117ec576117ec614b85565b1461180a5760405163f95c7fe160e01b815260040160405180910390fd5b61181385612b1d565b5050505061182d60015f805160206153d383398151915255565b5050565b611839612637565b5f8181525f805160206153738339815191526020526040808220815160e0810190925280545f8051602061539383398151915293929190829060ff16600381111561188657611886614b85565b600381111561189757611897614b85565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61190d82611f47565b90505f8351600381111561192357611923614b85565b0361194157604051631d0b665760e21b815260040160405180910390fd5b60048151600581111561195657611956614b85565b146119745760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561198957611989614b85565b036119a05761199785612b1d565b50505050611a8f565b6002835160038111156119b5576119b5614b85565b03611a8157600384015460608401516001600160a01b039091169063778c06b5906119df9061158d565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b168152611a3196959493926001600160401b0390921691908190600401614c7c565b602060405180830381865afa158015611a4c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a709190614cba565b5f8681526006860160205260409020555b611a8a85612b1d565b505050505b611aa560015f805160206153d383398151915255565b50565b5f805160206153b38339815191525f80611acd611ac485612cfa565b60400151613646565b9150915080611aef57604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068401602052604090208054611b0990614f70565b90505f03611b2a57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff166005811115611b5057611b50614b85565b14611b6e5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006840160205260408120611b869161492d565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206153738339815191526020526040808220815160e0810190925280545f8051602061539383398151915293929190829060ff166003811115611c6257611c62614b85565b6003811115611c7357611c73614b85565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611cec57611cec614b85565b14158015611d0d5750600381516003811115611d0a57611d0a614b85565b14155b15611d2b5760405163f95c7fe160e01b815260040160405180910390fd5b5f611d398260400151611f47565b905080606001516001600160401b03165f03611d6857604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611d958460400151846060015185608001516123be565b6040518263ffffffff1660e01b8152600401611db19190614cf3565b6020604051808303815f875af1158015611dcd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d349190614cba565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206153b38339815191529190611e3890614f70565b90505f03611e5957604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611e7f57611e7f614b85565b14611e9d5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ed69190600401614fa2565b6020604051808303815f875af1158015611ef2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c409190614cba565b5f611f1f612637565b611f2a8233346137ea565b9050611f4260015f805160206153d383398151915255565b919050565b611f4f614964565b5f8281525f805160206153f3833981519152602052604090819020815160e0810190925280545f805160206153b3833981519152929190829060ff166005811115611f9c57611f9c614b85565b6005811115611fad57611fad614b85565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561205a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120819190810190615037565b91509150806120a357604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210a9190614cba565b82511461212a5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156121565760405163e6c4247b60e01b815260040160405180910390fd5b5f806121658460400151613aae565b9150915081871461218957604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260409020545f80516020615393833981519152906001600160401b039081169083161115612240575f888152600882016020908152604091829020805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261225c565b5f8881526008820160205260409020546001600160401b031691505b509695505050505050565b5f8281525f805160206153f3833981519152602052604081206002015481905f805160206153b383398151915290600160801b90046001600160401b03166122af8582613c89565b5f6122b987613e52565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123098a858b6123be565b6040518263ffffffff1660e01b81526004016123259190614cf3565b6020604051808303815f875af1158015612341573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123659190614cba565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612415613ec7565b611aa581613f12565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206153938339815191528161247286613f80565b905061247d8661241e565b61249a57604051636ca57bcf60e01b815260040160405180910390fd5b5f8681526004830160205260409020546001600160a01b031633146124d25760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a082015161250191600160b01b90046001600160401b031690615109565b6001600160401b03168160c001516001600160401b03161015612537576040516302336bad60e51b815260040160405180910390fd5b5f851561254f57612548878661200f565b905061256a565b505f8681526008830160205260409020546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061258f9061158d565b60a086015160c08701516040516001600160e01b031960e086901b1681526125c3939291829189905f908190600401614c7c565b602060405180830381865afa1580156125de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126029190614cba565b905080846007015f8a81526020019081526020015f205f8282546126269190614f24565b909155509098975050505050505050565b5f805160206153d383398151915280546001190161266857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061539383398151915290600160401b900461ffff90811690861610806126c2575061271061ffff8616115b156126e05760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612712576040516302336bad60e51b815260040160405180910390fd5b80548310806127245750806001015483115b1561274257604051630103be3b60e21b815260040160405180910390fd5b825f61274d82610c45565b90505f61275a89836141bd565b9050604051806060016040528061276e3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f805160206153d383398151915255565b5f61281d614964565b5f805160206153b38339815191525f80612839611ac487612cfa565b91509150801561285c57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561288d5761288d614b85565b600581111561289e5761289e614b85565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561290d5761290d614b85565b1415801561292e575060018151600581111561292b5761292b614b85565b14155b1561294c5760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561296157612961614b85565b0361296f5760048152612974565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff191660018360058111156129b9576129b9614b85565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a6d57612a6d614b85565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612af0575f80fd5b505af1158015612b02573d5f803e3d5ffd5b505050505050565b61182d6001600160a01b038316826145a7565b5f8181525f805160206153738339815191526020526040808220815160e0810190925280545f8051602061539383398151915293929190829060ff166003811115612b6a57612b6a614b85565b6003811115612b7b57612b7b614b85565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612c5090600160a01b900461ffff1684614f59565b612c5a9190614d25565b905080856007015f8581526020019081526020015f205f828254612c7e9190614f24565b909155505f9050612c8f8284615129565b9050612c9f856020015182612aa4565b612cb48560200151610d2f876060015161158d565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612d5e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612d859190810190615037565b9150915080612da757604051636b2f19e960e01b815260040160405180910390fd5b815115612dc75760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612df35760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612e1f57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612e6e57612e36816001615129565b612e41906008614f59565b61ffff16868281518110612e5757612e57614db8565b016020015160f81c901b9190911790600101612e22565b5061ffff811615612e925760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612eed57612ea9816003615129565b612eb4906008614f59565b63ffffffff1687612ec6836002614f24565b81518110612ed657612ed6614db8565b016020015160f81c901b9190911790600101612e95565b5063ffffffff8116600414612f1557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f6a57612f2c81601f615129565b612f37906008614f59565b88612f43836006614f24565b81518110612f5357612f53614db8565b016020015160f81c901b9190911790600101612f18565b505f805b6008811015612fc957612f82816007615129565b612f8d906008614f59565b6001600160401b031689612fa2836026614f24565b81518110612fb257612fb2614db8565b016020015160f81c901b9190911790600101612f6e565b505f805b600881101561302857612fe1816007615129565b612fec906008614f59565b6001600160401b03168a61300183602e614f24565b8151811061301157613011614db8565b016020015160f81c901b9190911790600101612fcd565b5091989097509095509350505050565b5f815160261461305b57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156130aa57613072816001615129565b61307d906008614f59565b61ffff1684828151811061309357613093614db8565b016020015160f81c901b919091179060010161305e565b5061ffff8116156130ce5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613129576130e5816003615129565b6130f0906008614f59565b63ffffffff1685613102836002614f24565b8151811061311257613112614db8565b016020015160f81c901b91909117906001016130d1565b5063ffffffff81161561314f57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131a45761316681601f615129565b613171906008614f59565b8661317d836006614f24565b8151811061318d5761318d614db8565b016020015160f81c901b9190911790600101613152565b50949350505050565b60605f6131bc83830184614d73565b6131c891506058614f59565b6131d390605c614f24565b6001600160401b038111156131ea576131ea614dea565b6040519080825280601f01601f191660200182016040528015613214576020820181803683370190505b5090505f5b6020811015613269578335816020811061323557613235614db8565b1a60f81b82828151811061324b5761324b614db8565b60200101906001600160f81b03191690815f1a905350600101613219565b505f5b60208110156132c9578360200135816020811061328b5761328b614db8565b1a60f81b8261329b836020614f24565b815181106132ab576132ab614db8565b60200101906001600160f81b03191690815f1a90535060010161326c565b505f5b600481101561332c576132e0816003615129565b6132eb906008614f59565b6014901c60f81b826132fe836040614f24565b8151811061330e5761330e614db8565b60200101906001600160f81b03191690815f1a9053506001016132cc565b505f61333e6060850160408601614d58565b60601b90505f5b601481101561339e5781816014811061336057613360614db8565b1a60f81b83613370836044614f24565b8151811061338057613380614db8565b60200101906001600160f81b03191690815f1a905350600101613345565b505f6133ad6060860186614d73565b905090505f5b6004811015613418576133c7816003615129565b6133d2906008614f59565b63ffffffff8316901c60f81b846133ea836058614f24565b815181106133fa576133fa614db8565b60200101906001600160f81b03191690815f1a9053506001016133b3565b505f5b6134286060870187614d73565b905081101561363c575f61343d826058614f59565b61344890605c614f24565b90505f5b60208110156134d3576134626060890189614d73565b8481811061347257613472614db8565b90506020028101906134849190614dcc565b35816020811061349657613496614db8565b1a60f81b866134a58385614f24565b815181106134b5576134b5614db8565b60200101906001600160f81b03191690815f1a90535060010161344c565b505f5b6008811015613588576134ea816007615129565b6134f5906008614f59565b61350260608a018a614d73565b8581811061351257613512614db8565b90506020028101906135249190614dcc565b613535906040810190602001614b6c565b6001600160401b0316901c60f81b8682613550856020614f24565b61355a9190614f24565b8151811061356a5761356a614db8565b60200101906001600160f81b03191690815f1a9053506001016134d6565b505f5b6030811015613632576135a16060890189614d73565b848181106135b1576135b1614db8565b90506020028101906135c39190614dcc565b6135d190604081019061513c565b828181106135e1576135e1614db8565b9050013560f81c60f81b86828460286135fa9190614f24565b6136049190614f24565b8151811061361457613614614db8565b60200101906001600160f81b03191690815f1a90535060010161358b565b505060010161341b565b5091949350505050565b5f80825160271461366a57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136b957613681816001615129565b61368c906008614f59565b61ffff168582815181106136a2576136a2614db8565b016020015160f81c901b919091179060010161366d565b5061ffff8116156136dd5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613738576136f4816003615129565b6136ff906008614f59565b63ffffffff1686613711836002614f24565b8151811061372157613721614db8565b016020015160f81c901b91909117906001016136e0565b5063ffffffff811660031461376057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137b55761377781601f615129565b613782906008614f59565b8761378e836006614f24565b8151811061379e5761379e614db8565b016020015160f81c901b9190911790600101613763565b505f866026815181106137ca576137ca614db8565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206153938339815191528161380384610c45565b90505f61380f87611f47565b905061381a8761241e565b61383757604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561384c5761384c614b85565b1461386a5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161387b9190615109565b905083600201600a9054906101000a90046001600160401b031682604001516138a4919061517e565b6001600160401b0316816001600160401b031611156138d657604051630c192e7760e41b815260040160405180910390fd5b5f806138e28a84612267565b915091505f8a8360405160200161391092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156139a3576139a3614b85565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613ad257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613b2157613ae9816001615129565b613af4906008614f59565b61ffff16858281518110613b0a57613b0a614db8565b016020015160f81c901b9190911790600101613ad5565b5061ffff811615613b455760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613ba057613b5c816003615129565b613b67906008614f59565b63ffffffff1686613b79836002614f24565b81518110613b8957613b89614db8565b016020015160f81c901b9190911790600101613b48565b5063ffffffff8116600514613bc857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c1d57613bdf81601f615129565b613bea906008614f59565b87613bf6836006614f24565b81518110613c0657613c06614db8565b016020015160f81c901b9190911790600101613bcb565b505f805b6008811015613c7c57613c35816007615129565b613c40906008614f59565b6001600160401b031688613c55836026614f24565b81518110613c6557613c65614db8565b016020015160f81c901b9190911790600101613c21565b5090969095509350505050565b5f805160206153b38339815191525f6001600160401b038084169085161115613cbd57613cb68385614c5c565b9050613cca565b613cc78484614c5c565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613d2c575060018401548151613d28916001600160401b031690614f24565b8210155b15613d52576001600160401b038316606082015281815260408101516020820152613d71565b8281606001818151613d649190615109565b6001600160401b03169052505b6060810151613d8190606461517e565b602082015160018601546001600160401b039290921691613dac9190600160401b900460ff16614f59565b1015613dcb5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613de69190614f24565b9052506040810180516001600160401b0387169190613e06908390615129565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206153f38339815191526020526040812060020180545f805160206153b38339815191529190600890613e9c90600160401b90046001600160401b03166151a9565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f1057604051631afcd79f60e31b815260040160405180910390fd5b565b613f1a613ec7565b613f238161463e565b613f2b614657565b611aa560608201356080830135613f4860c0850160a08601614b6c565b613f5860e0860160c087016151c4565b613f69610100870160e088016151dd565b613f7b61012088016101008901614d58565b614667565b613f88614964565b5f8281525f805160206153f38339815191526020526040808220815160e0810190925280545f805160206153b383398151915293929190829060ff166005811115613fd557613fd5614b85565b6005811115613fe657613fe6614b85565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561405857614058614b85565b146140765760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156140ba576140ba614b85565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6141668582612267565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661420157604051637fab81e560e01b815260040160405180910390fd5b5f805160206153b3833981519152426142206040860160208701614b6c565b6001600160401b031611158061425a575061423e6202a30042614f24565b61424e6040860160208701614b6c565b6001600160401b031610155b156142775760405162d36c8560e81b815260040160405180910390fd5b6030614286604086018661513c565b905014158061429457508335155b156142b25760405163b4fa3fb360e01b815260040160405180910390fd5b83355f908152600882016020526040902054156142e257604051630eb0d31360e11b815260040160405180910390fd5b6142ec835f613c89565b5f806143856040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906143309190614b6c565b6001600160401b0316815260200161434b60408a018a61513c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614788565b5f828152600686016020526040902091935091506143a38282615241565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906143e1908590600401614cf3565b6020604051808303815f875af11580156143fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144219190614cba565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561449957614499614b85565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614579918e01908e01614b6c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145ce5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614617576040519150601f19603f3d011682016040523d82523d5f602084013e61461c565b606091505b5050905080610c4057604051630a12f52160e11b815260040160405180910390fd5b614646613ec7565b61464e61484b565b611aa581614853565b61465f613ec7565b613f10614925565b61466f613ec7565b5f8051602061539383398151915261ffff84161580614693575061271061ffff8516115b156146b15760405163c98d73a760e01b815260040160405180910390fd5b858711156146d257604051630103be3b60e21b815260040160405180910390fd5b60ff831615806146e55750600a60ff8416115b15614703576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146147b157604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016147e397969594939291906152fc565b60405160208183030381529060405290506002816040516148049190614f13565b602060405180830381855afa15801561481f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906148429190614cba565b94909350915050565b613f10613ec7565b61485b613ec7565b80355f805160206153b3833981519152908155601461488060608401604085016151dd565b60ff16118061489f575061489a60608301604084016151dd565b60ff16155b156148bd5760405163b4fa3fb360e01b815260040160405180910390fd5b6148cd60608301604084016151dd565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556148fe6040830160208401614b6c565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612801613ec7565b50805461493990614f70565b5f825580601f10614948575050565b601f0160209004905f5260205f2090810190611aa591906149a0565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156149b4575f81556001016149a1565b5090565b8015158114611aa5575f80fd5b803563ffffffff81168114611f42575f80fd5b5f805f606084860312156149ea575f80fd5b8335925060208401356149fc816149b8565b9150614a0a604085016149c5565b90509250925092565b5f60208284031215614a23575f80fd5b5035919050565b5f6101208284031215614a3b575f80fd5b50919050565b5f8060408385031215614a52575f80fd5b82359150614a62602084016149c5565b90509250929050565b803561ffff81168114611f42575f80fd5b80356001600160401b0381168114611f42575f80fd5b5f805f60608486031215614aa4575f80fd5b83356001600160401b03811115614ab9575f80fd5b840160608187031215614aca575f80fd5b9250614ad860208501614a6b565b9150614a0a60408501614a7c565b5f60208284031215614af6575f80fd5b610c93826149c5565b5f8060408385031215614b10575f80fd5b614b19836149c5565b946020939093013593505050565b5f8060408385031215614b38575f80fd5b82356001600160401b03811115614b4d575f80fd5b830160808186031215614b5e575f80fd5b9150614a62602084016149c5565b5f60208284031215614b7c575f80fd5b610c9382614a7c565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614bbc57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614bf760608401826001600160401b03169052565b506080830151614c1260808401826001600160401b03169052565b5060a0830151614c2d60a08401826001600160401b03169052565b5060c0830151612df360c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612df357612df3614c48565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614cca575f80fd5b5051919050565b5f5b83811015614ceb578181015183820152602001614cd3565b50505f910152565b602081525f8251806020840152614d11816040850160208701614cd1565b601f01601f19169190910160400192915050565b5f82614d3f57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114611aa5575f80fd5b5f60208284031215614d68575f80fd5b8135610c9381614d44565b5f808335601e19843603018112614d88575f80fd5b8301803591506001600160401b03821115614da1575f80fd5b6020019150600581901b36038213156123b7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614de0575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614e2057614e20614dea565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614e4e57614e4e614dea565b604052919050565b5f6001600160401b03821115614e6e57614e6e614dea565b50601f01601f191660200190565b5f60608236031215614e8c575f80fd5b614e94614dfe565b823581526020614ea5818501614a7c565b8183015260408401356001600160401b03811115614ec1575f80fd5b840136601f820112614ed1575f80fd5b8035614ee4614edf82614e56565b614e26565b8181523684838501011115614ef7575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614de0818460208701614cd1565b80820180821115610c5557610c55614c48565b5f63ffffffff808316818103614f4f57614f4f614c48565b6001019392505050565b8082028115828204841417610c5557610c55614c48565b600181811c90821680614f8457607f821691505b602082108103614a3b57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614fb481614f70565b806020870152604060018084165f8114614fd55760018114614ff15761501e565b60ff19851660408a0152604084151560051b8a0101955061501e565b895f5260205f205f5b858110156150155781548b8201860152908301908801614ffa565b8a016040019650505b509398975050505050505050565b8051611f42816149b8565b5f8060408385031215615048575f80fd5b82516001600160401b038082111561505e575f80fd5b9084019060608287031215615071575f80fd5b615079614dfe565b8251815260208084015161508c81614d44565b828201526040840151838111156150a1575f80fd5b80850194505087601f8501126150b5575f80fd5b835192506150c5614edf84614e56565b83815288828587010111156150d8575f80fd5b6150e784838301848801614cd1565b806040840152508195506150fc81880161502c565b9450505050509250929050565b6001600160401b03818116838216019080821115612df357612df3614c48565b81810381811115610c5557610c55614c48565b5f808335601e19843603018112615151575f80fd5b8301803591506001600160401b0382111561516a575f80fd5b6020019150368190038213156123b7575f80fd5b6001600160401b038181168382160280821691908281146151a1576151a1614c48565b505092915050565b5f6001600160401b03808316818103614f4f57614f4f614c48565b5f602082840312156151d4575f80fd5b610c9382614a6b565b5f602082840312156151ed575f80fd5b813560ff81168114610c93575f80fd5b601f821115610c4057805f5260205f20601f840160051c810160208510156152225750805b601f840160051c820191505b81811015610d34575f815560010161522e565b81516001600160401b0381111561525a5761525a614dea565b61526e816152688454614f70565b846151fd565b602080601f8311600181146152a1575f841561528a5750858301515b5f19600386901b1c1916600185901b178555612b02565b5f85815260208120601f198616915b828110156152cf578886015182559484019460019091019084016152b0565b50858210156152ec57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161535181604e860160208901614cd1565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161555938038061555983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61540c8061014d5f395ff3fe6080604052600436106101d0575f3560e01c806366435abf116100fd578063b771b3bc11610092578063c974d1b611610062578063c974d1b61461053f578063d5f20ff614610553578063df93d8de1461057f578063e7d14c1c14610595575f80fd5b8063b771b3bc146104d4578063ba3a4b97146104ee578063bee0a03f1461050d578063c599e24f1461052c575f80fd5b806393e24598116100cd57806393e245981461045857806398f3e2b4146104775780639dde029a14610496578063a3a65e48146104b5575f80fd5b806366435abf146103f3578063732214f81461041257806376f78621146104255780638280a25a14610444575f80fd5b806335455ded116101735780635297fae6116101435780635297fae61461036d57806360305d621461038c57806361e2f490146103b557806362065856146103d4575f80fd5b806335455ded146102e65780633a1cfff61461030e57806340034a931461032d578063467ef06f1461034e575f80fd5b806320e55565116101ae57806320e555651461023f57806325e1c7761461025e5780632e2194d81461027d578063329c3e12146102b4575f80fd5b80630118acc4146101d45780630322ed98146101f5578063151d30d114610214575b5f80fd5b3480156101df575f80fd5b506101f36101ee3660046149c5565b6105df565b005b348015610200575f80fd5b506101f361020f366004614a00565b610986565b34801561021f575f80fd5b50610228600a81565b60405160ff90911681526020015b60405180910390f35b34801561024a575f80fd5b506101f3610259366004614a17565b610af8565b348015610269575f80fd5b506101f3610278366004614a2e565b610bd5565b348015610288575f80fd5b5061029c610297366004614a00565b610c45565b6040516001600160401b039091168152602001610236565b3480156102bf575f80fd5b506102ce6001600160991b0181565b6040516001600160a01b039091168152602001610236565b3480156102f1575f80fd5b506102fb61271081565b60405161ffff9091168152602001610236565b348015610319575f80fd5b506101f36103283660046149c5565b610c5b565b61034061033b366004614a7f565b610c66565b604051908152602001610236565b348015610359575f80fd5b506101f3610368366004614ad3565b610c9a565b348015610378575f80fd5b506101f3610387366004614aec565b610d3b565b348015610397575f80fd5b506103a0601481565b60405163ffffffff9091168152602001610236565b3480156103c0575f80fd5b506101f36103cf366004614b14565b61110e565b3480156103df575f80fd5b506103406103ee366004614b59565b61158d565b3480156103fe575f80fd5b5061029c61040d366004614a00565b6115a6565b34801561041d575f80fd5b506103405f81565b348015610430575f80fd5b506101f361043f3660046149c5565b6115ba565b34801561044f575f80fd5b50610228603081565b348015610463575f80fd5b506101f3610472366004614a00565b6115e2565b348015610482575f80fd5b506101f3610491366004614aec565b611699565b3480156104a1575f80fd5b506101f36104b0366004614a00565b61182b565b3480156104c0575f80fd5b506101f36104cf366004614ad3565b611aa2565b3480156104df575f80fd5b506102ce6005600160991b0181565b3480156104f9575f80fd5b506101f3610508366004614a00565b611c0f565b348015610518575f80fd5b506101f3610527366004614a00565b611deb565b61034061053a366004614a00565b611f10565b34801561054a575f80fd5b50610228601481565b34801561055e575f80fd5b5061057261056d366004614a00565b611f41565b6040516102369190614b86565b34801561058a575f80fd5b5061029c6202a30081565b3480156105a0575f80fd5b506103406105af366004614a00565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206153608339815191526020526040808220815160e0810190925280545f8051602061538083398151915293929190829060ff16600381111561062c5761062c614b72565b600381111561063d5761063d614b72565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6106b382611f41565b90506002835160038111156106ca576106ca614b72565b146106e85760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146107155760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f8060028351600581111561073357610733614b72565b0361078457871561074b576107488488612009565b91505b5f856060015184608001516107609190614c49565b905061076c8582612261565b506001600160401b031660c0870152504290506107b6565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b5906107db9061158d565b8560a00151886080015185875f806040518863ffffffff1660e01b815260040161080b9796959493929190614c69565b602060405180830381865afa158015610826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084a9190614ca7565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561088957610889614b72565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906109739085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206153e08339815191526020526040808220815160e0810190925280545f805160206153a083398151915293929190829060ff1660058111156109d3576109d3614b72565b60058111156109e4576109e4614b72565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a5357610a53614b72565b14610a715760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a968584606001515f6123b8565b6040518263ffffffff1660e01b8152600401610ab29190614ce0565b6020604051808303815f875af1158015610ace573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af29190614ca7565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b41575080546001600160401b03808416911610155b15610b5f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b8983612407565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610bde82612418565b610bfb57604051636ca57bcf60e01b815260040160405180910390fd5b6002610c0683611f41565b516005811115610c1857610c18614b72565b14610c365760405163a36c527f60e01b815260040160405180910390fd5b610c408282612009565b505050565b5f610c5564e8d4a5100083614d12565b92915050565b610af2838383612453565b5f610c6f612624565b610c7b8484843461265b565b9050610c9360015f805160206153c083398151915255565b9392505050565b5f805160206153808339815191525f80610cb384612801565b91509150610cc082612418565b610cca5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610cf957610cf9614b72565b03610d1e575f83815260078501602052604081208054919055610d1c8282612a91565b505b610d3481610d2f846040015161158d565b612af7565b5050505050565b5f8181525f805160206153608339815191526020526040808220815160e0810190925280545f8051602061538083398151915293929190829060ff166003811115610d8857610d88614b72565b6003811115610d9957610d99614b72565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610e1090611f41565b905060015f85815260058501602052604090205460ff166003811115610e3857610e38614b72565b14610e565760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610e6b57610e6b614b72565b03610fb457600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610ec557610ec5614b72565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610fc957610fc9614b72565b03610fd757610d3484612b0a565b5f80610fee610fe588612ce7565b60400151612de7565b50915091508184604001511461101757604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b0316108061105f57505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b1561107d57604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206153a08339815191529060ff161561116057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c79190614ca7565b8360200135146111ea5760405163d040949d60e01b815260040160405180910390fd5b306111fb6060850160408601614d45565b6001600160a01b0316146112225760405163e6c4247b60e01b815260040160405180910390fd5b5f6112306060850185614d60565b905090505f805b828163ffffffff1610156114dc575f6112536060880188614d60565b8363ffffffff1681811061126957611269614da5565b905060200281019061127b9190614db9565b61128490614e69565b80515f81815260088801602052604090205491925090156112b857604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f0135856040516020016112e792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261130191614f00565b602060405180830381855afa15801561131c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133f9190614ca7565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156113cb576113cb614b72565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161147e911686614f11565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114d590614f24565b9050611237565b50600483018190555f6114fa6114f186612ce7565b60400151613025565b90505f6115068761319a565b9050816002826040516115199190614f00565b602060405180830381855afa158015611534573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115579190614ca7565b1461157557604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610c556001600160401b03831664e8d4a51000614f46565b5f6115b082611f41565b6080015192915050565b6115c5838383612453565b610c405760405163d802b9f360e01b815260040160405180910390fd5b5f8051602061538083398151915260046115fb83611f41565b51600581111561160d5761160d614b72565b1461162b5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146116635760405163e6c4247b60e01b815260040160405180910390fd5b5f82815260078201602090815260408083208054908490556004850190925290912054610c40906001600160a01b031682612a91565b6116a1612624565b5f8181525f805160206153608339815191526020526040808220815160e0810190925280545f8051602061538083398151915293929190829060ff1660038111156116ee576116ee614b72565b60038111156116ff576116ff614b72565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f80611771610fe587612ce7565b50915091508183604001511461179a57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b031611156117d157604051633ab3447f60e11b815260040160405180910390fd5b6003835160038111156117e6576117e6614b72565b146118045760405163f95c7fe160e01b815260040160405180910390fd5b61180d85612b0a565b5050505061182760015f805160206153c083398151915255565b5050565b611833612624565b5f8181525f805160206153608339815191526020526040808220815160e0810190925280545f8051602061538083398151915293929190829060ff16600381111561188057611880614b72565b600381111561189157611891614b72565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61190782611f41565b90505f8351600381111561191d5761191d614b72565b0361193b57604051631d0b665760e21b815260040160405180910390fd5b60048151600581111561195057611950614b72565b1461196e5760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561198357611983614b72565b0361199a5761199185612b0a565b50505050611a89565b6002835160038111156119af576119af614b72565b03611a7b57600384015460608401516001600160a01b039091169063778c06b5906119d99061158d565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b168152611a2b96959493926001600160401b0390921691908190600401614c69565b602060405180830381865afa158015611a46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a6a9190614ca7565b5f8681526006860160205260409020555b611a8485612b0a565b505050505b611a9f60015f805160206153c083398151915255565b50565b5f805160206153a08339815191525f80611ac7611abe85612ce7565b60400151613633565b9150915080611ae957604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068401602052604090208054611b0390614f5d565b90505f03611b2457604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff166005811115611b4a57611b4a614b72565b14611b685760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006840160205260408120611b809161491a565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206153608339815191526020526040808220815160e0810190925280545f8051602061538083398151915293929190829060ff166003811115611c5c57611c5c614b72565b6003811115611c6d57611c6d614b72565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611ce657611ce6614b72565b14158015611d075750600381516003811115611d0457611d04614b72565b14155b15611d255760405163f95c7fe160e01b815260040160405180910390fd5b5f611d338260400151611f41565b905080606001516001600160401b03165f03611d6257604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611d8f8460400151846060015185608001516123b8565b6040518263ffffffff1660e01b8152600401611dab9190614ce0565b6020604051808303815f875af1158015611dc7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d349190614ca7565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206153a08339815191529190611e3290614f5d565b90505f03611e5357604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611e7957611e79614b72565b14611e975760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ed09190600401614f8f565b6020604051808303815f875af1158015611eec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c409190614ca7565b5f611f19612624565b611f248233346137d7565b9050611f3c60015f805160206153c083398151915255565b919050565b611f49614951565b5f8281525f805160206153e0833981519152602052604090819020815160e0810190925280545f805160206153a0833981519152929190829060ff166005811115611f9657611f96614b72565b6005811115611fa757611fa7614b72565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612054573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261207b9190810190615024565b915091508061209d57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121049190614ca7565b8251146121245760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156121505760405163e6c4247b60e01b815260040160405180910390fd5b5f8061215f8460400151613a9b565b9150915081871461218357604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260409020545f80516020615380833981519152906001600160401b03908116908316111561223a575f888152600882016020908152604091829020805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612256565b5f8881526008820160205260409020546001600160401b031691505b509695505050505050565b5f8281525f805160206153e0833981519152602052604081206002015481905f805160206153a083398151915290600160801b90046001600160401b03166122a98582613c76565b5f6122b387613e3f565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123038a858b6123b8565b6040518263ffffffff1660e01b815260040161231f9190614ce0565b6020604051808303815f875af115801561233b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061235f9190614ca7565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b61240f613eb4565b611a9f81613eff565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206153808339815191528161246c86613f6d565b905061247786612418565b61248657600192505050610c93565b5f8681526004830160205260409020546001600160a01b031633146124be5760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a08201516124ed91600160b01b90046001600160401b0316906150f6565b6001600160401b03168160c001516001600160401b03161015612523576040516302336bad60e51b815260040160405180910390fd5b5f851561253b576125348786612009565b9050612556565b505f8681526008830160205260409020546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061257b9061158d565b60a086015160c08701516040516001600160e01b031960e086901b1681526125af939291829189905f908190600401614c69565b602060405180830381865afa1580156125ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125ee9190614ca7565b905080846007015f8a81526020019081526020015f205f8282546126129190614f11565b90915550501515979650505050505050565b5f805160206153c083398151915280546001190161265557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061538083398151915290600160401b900461ffff90811690861610806126af575061271061ffff8616115b156126cd5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156126ff576040516302336bad60e51b815260040160405180910390fd5b80548310806127115750806001015483115b1561272f57604051630103be3b60e21b815260040160405180910390fd5b825f61273a82610c45565b90505f61274789836141aa565b9050604051806060016040528061275b3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f805160206153c083398151915255565b5f61280a614951565b5f805160206153a08339815191525f80612826611abe87612ce7565b91509150801561284957604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561287a5761287a614b72565b600581111561288b5761288b614b72565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156128fa576128fa614b72565b1415801561291b575060018151600581111561291857612918614b72565b14155b156129395760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561294e5761294e614b72565b0361295c5760048152612961565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff191660018360058111156129a6576129a6614b72565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a5a57612a5a614b72565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612add575f80fd5b505af1158015612aef573d5f803e3d5ffd5b505050505050565b6118276001600160a01b03831682614594565b5f8181525f805160206153608339815191526020526040808220815160e0810190925280545f8051602061538083398151915293929190829060ff166003811115612b5757612b57614b72565b6003811115612b6857612b68614b72565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612c3d90600160a01b900461ffff1684614f46565b612c479190614d12565b905080856007015f8581526020019081526020015f205f828254612c6b9190614f11565b909155505f9050612c7c8284615116565b9050612c8c856020015182612a91565b612ca18560200151610d2f876060015161158d565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612d4b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612d729190810190615024565b9150915080612d9457604051636b2f19e960e01b815260040160405180910390fd5b815115612db45760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612de05760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612e0c57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612e5b57612e23816001615116565b612e2e906008614f46565b61ffff16868281518110612e4457612e44614da5565b016020015160f81c901b9190911790600101612e0f565b5061ffff811615612e7f5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612eda57612e96816003615116565b612ea1906008614f46565b63ffffffff1687612eb3836002614f11565b81518110612ec357612ec3614da5565b016020015160f81c901b9190911790600101612e82565b5063ffffffff8116600414612f0257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f5757612f1981601f615116565b612f24906008614f46565b88612f30836006614f11565b81518110612f4057612f40614da5565b016020015160f81c901b9190911790600101612f05565b505f805b6008811015612fb657612f6f816007615116565b612f7a906008614f46565b6001600160401b031689612f8f836026614f11565b81518110612f9f57612f9f614da5565b016020015160f81c901b9190911790600101612f5b565b505f805b600881101561301557612fce816007615116565b612fd9906008614f46565b6001600160401b03168a612fee83602e614f11565b81518110612ffe57612ffe614da5565b016020015160f81c901b9190911790600101612fba565b5091989097509095509350505050565b5f815160261461304857604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156130975761305f816001615116565b61306a906008614f46565b61ffff1684828151811061308057613080614da5565b016020015160f81c901b919091179060010161304b565b5061ffff8116156130bb5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613116576130d2816003615116565b6130dd906008614f46565b63ffffffff16856130ef836002614f11565b815181106130ff576130ff614da5565b016020015160f81c901b91909117906001016130be565b5063ffffffff81161561313c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131915761315381601f615116565b61315e906008614f46565b8661316a836006614f11565b8151811061317a5761317a614da5565b016020015160f81c901b919091179060010161313f565b50949350505050565b60605f6131a983830184614d60565b6131b591506058614f46565b6131c090605c614f11565b6001600160401b038111156131d7576131d7614dd7565b6040519080825280601f01601f191660200182016040528015613201576020820181803683370190505b5090505f5b6020811015613256578335816020811061322257613222614da5565b1a60f81b82828151811061323857613238614da5565b60200101906001600160f81b03191690815f1a905350600101613206565b505f5b60208110156132b6578360200135816020811061327857613278614da5565b1a60f81b82613288836020614f11565b8151811061329857613298614da5565b60200101906001600160f81b03191690815f1a905350600101613259565b505f5b6004811015613319576132cd816003615116565b6132d8906008614f46565b6014901c60f81b826132eb836040614f11565b815181106132fb576132fb614da5565b60200101906001600160f81b03191690815f1a9053506001016132b9565b505f61332b6060850160408601614d45565b60601b90505f5b601481101561338b5781816014811061334d5761334d614da5565b1a60f81b8361335d836044614f11565b8151811061336d5761336d614da5565b60200101906001600160f81b03191690815f1a905350600101613332565b505f61339a6060860186614d60565b905090505f5b6004811015613405576133b4816003615116565b6133bf906008614f46565b63ffffffff8316901c60f81b846133d7836058614f11565b815181106133e7576133e7614da5565b60200101906001600160f81b03191690815f1a9053506001016133a0565b505f5b6134156060870187614d60565b9050811015613629575f61342a826058614f46565b61343590605c614f11565b90505f5b60208110156134c05761344f6060890189614d60565b8481811061345f5761345f614da5565b90506020028101906134719190614db9565b35816020811061348357613483614da5565b1a60f81b866134928385614f11565b815181106134a2576134a2614da5565b60200101906001600160f81b03191690815f1a905350600101613439565b505f5b6008811015613575576134d7816007615116565b6134e2906008614f46565b6134ef60608a018a614d60565b858181106134ff576134ff614da5565b90506020028101906135119190614db9565b613522906040810190602001614b59565b6001600160401b0316901c60f81b868261353d856020614f11565b6135479190614f11565b8151811061355757613557614da5565b60200101906001600160f81b03191690815f1a9053506001016134c3565b505f5b603081101561361f5761358e6060890189614d60565b8481811061359e5761359e614da5565b90506020028101906135b09190614db9565b6135be906040810190615129565b828181106135ce576135ce614da5565b9050013560f81c60f81b86828460286135e79190614f11565b6135f19190614f11565b8151811061360157613601614da5565b60200101906001600160f81b03191690815f1a905350600101613578565b5050600101613408565b5091949350505050565b5f80825160271461365757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136a65761366e816001615116565b613679906008614f46565b61ffff1685828151811061368f5761368f614da5565b016020015160f81c901b919091179060010161365a565b5061ffff8116156136ca5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613725576136e1816003615116565b6136ec906008614f46565b63ffffffff16866136fe836002614f11565b8151811061370e5761370e614da5565b016020015160f81c901b91909117906001016136cd565b5063ffffffff811660031461374d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137a25761376481601f615116565b61376f906008614f46565b8761377b836006614f11565b8151811061378b5761378b614da5565b016020015160f81c901b9190911790600101613750565b505f866026815181106137b7576137b7614da5565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615380833981519152816137f084610c45565b90505f6137fc87611f41565b905061380787612418565b61382457604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561383957613839614b72565b146138575760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161386891906150f6565b905083600201600a9054906101000a90046001600160401b03168260400151613891919061516b565b6001600160401b0316816001600160401b031611156138c357604051630c192e7760e41b815260040160405180910390fd5b5f806138cf8a84612261565b915091505f8a836040516020016138fd92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561399057613990614b72565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613abf57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613b0e57613ad6816001615116565b613ae1906008614f46565b61ffff16858281518110613af757613af7614da5565b016020015160f81c901b9190911790600101613ac2565b5061ffff811615613b325760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613b8d57613b49816003615116565b613b54906008614f46565b63ffffffff1686613b66836002614f11565b81518110613b7657613b76614da5565b016020015160f81c901b9190911790600101613b35565b5063ffffffff8116600514613bb557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c0a57613bcc81601f615116565b613bd7906008614f46565b87613be3836006614f11565b81518110613bf357613bf3614da5565b016020015160f81c901b9190911790600101613bb8565b505f805b6008811015613c6957613c22816007615116565b613c2d906008614f46565b6001600160401b031688613c42836026614f11565b81518110613c5257613c52614da5565b016020015160f81c901b9190911790600101613c0e565b5090969095509350505050565b5f805160206153a08339815191525f6001600160401b038084169085161115613caa57613ca38385614c49565b9050613cb7565b613cb48484614c49565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613d19575060018401548151613d15916001600160401b031690614f11565b8210155b15613d3f576001600160401b038316606082015281815260408101516020820152613d5e565b8281606001818151613d5191906150f6565b6001600160401b03169052505b6060810151613d6e90606461516b565b602082015160018601546001600160401b039290921691613d999190600160401b900460ff16614f46565b1015613db85760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613dd39190614f11565b9052506040810180516001600160401b0387169190613df3908390615116565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206153e08339815191526020526040812060020180545f805160206153a08339815191529190600890613e8990600160401b90046001600160401b0316615196565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613efd57604051631afcd79f60e31b815260040160405180910390fd5b565b613f07613eb4565b613f108161462b565b613f18614644565b611a9f60608201356080830135613f3560c0850160a08601614b59565b613f4560e0860160c087016151b1565b613f56610100870160e088016151ca565b613f6861012088016101008901614d45565b614654565b613f75614951565b5f8281525f805160206153e08339815191526020526040808220815160e0810190925280545f805160206153a083398151915293929190829060ff166005811115613fc257613fc2614b72565b6005811115613fd357613fd3614b72565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561404557614045614b72565b146140635760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156140a7576140a7614b72565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6141538582612261565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166141ee57604051637fab81e560e01b815260040160405180910390fd5b5f805160206153a08339815191524261420d6040860160208701614b59565b6001600160401b0316111580614247575061422b6202a30042614f11565b61423b6040860160208701614b59565b6001600160401b031610155b156142645760405162d36c8560e81b815260040160405180910390fd5b60306142736040860186615129565b905014158061428157508335155b1561429f5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f908152600882016020526040902054156142cf57604051630eb0d31360e11b815260040160405180910390fd5b6142d9835f613c76565b5f806143726040518060a00160405280855f01548152602001885f01358152602001876001600160401b0316815260200188602001602081019061431d9190614b59565b6001600160401b0316815260200161433860408a018a615129565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614775565b5f82815260068601602052604090209193509150614390828261522e565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906143ce908590600401614ce0565b6020604051808303815f875af11580156143ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061440e9190614ca7565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561448657614486614b72565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614566918e01908e01614b59565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145bb5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614604576040519150601f19603f3d011682016040523d82523d5f602084013e614609565b606091505b5050905080610c4057604051630a12f52160e11b815260040160405180910390fd5b614633613eb4565b61463b614838565b611a9f81614840565b61464c613eb4565b613efd614912565b61465c613eb4565b5f8051602061538083398151915261ffff84161580614680575061271061ffff8516115b1561469e5760405163c98d73a760e01b815260040160405180910390fd5b858711156146bf57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806146d25750600a60ff8416115b156146f0576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461479e57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016147d097969594939291906152e9565b60405160208183030381529060405290506002816040516147f19190614f00565b602060405180830381855afa15801561480c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061482f9190614ca7565b94909350915050565b613efd613eb4565b614848613eb4565b80355f805160206153a0833981519152908155601461486d60608401604085016151ca565b60ff16118061488c575061488760608301604084016151ca565b60ff16155b156148aa5760405163b4fa3fb360e01b815260040160405180910390fd5b6148ba60608301604084016151ca565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556148eb6040830160208401614b59565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6127ee613eb4565b50805461492690614f5d565b5f825580601f10614935575050565b601f0160209004905f5260205f2090810190611a9f919061498d565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156149a1575f815560010161498e565b5090565b8015158114611a9f575f80fd5b803563ffffffff81168114611f3c575f80fd5b5f805f606084860312156149d7575f80fd5b8335925060208401356149e9816149a5565b91506149f7604085016149b2565b90509250925092565b5f60208284031215614a10575f80fd5b5035919050565b5f6101208284031215614a28575f80fd5b50919050565b5f8060408385031215614a3f575f80fd5b82359150614a4f602084016149b2565b90509250929050565b803561ffff81168114611f3c575f80fd5b80356001600160401b0381168114611f3c575f80fd5b5f805f60608486031215614a91575f80fd5b83356001600160401b03811115614aa6575f80fd5b840160608187031215614ab7575f80fd5b9250614ac560208501614a58565b91506149f760408501614a69565b5f60208284031215614ae3575f80fd5b610c93826149b2565b5f8060408385031215614afd575f80fd5b614b06836149b2565b946020939093013593505050565b5f8060408385031215614b25575f80fd5b82356001600160401b03811115614b3a575f80fd5b830160808186031215614b4b575f80fd5b9150614a4f602084016149b2565b5f60208284031215614b69575f80fd5b610c9382614a69565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614ba957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614be460608401826001600160401b03169052565b506080830151614bff60808401826001600160401b03169052565b5060a0830151614c1a60a08401826001600160401b03169052565b5060c0830151612de060c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612de057612de0614c35565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614cb7575f80fd5b5051919050565b5f5b83811015614cd8578181015183820152602001614cc0565b50505f910152565b602081525f8251806020840152614cfe816040850160208701614cbe565b601f01601f19169190910160400192915050565b5f82614d2c57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114611a9f575f80fd5b5f60208284031215614d55575f80fd5b8135610c9381614d31565b5f808335601e19843603018112614d75575f80fd5b8301803591506001600160401b03821115614d8e575f80fd5b6020019150600581901b36038213156123b1575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614dcd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614e0d57614e0d614dd7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614e3b57614e3b614dd7565b604052919050565b5f6001600160401b03821115614e5b57614e5b614dd7565b50601f01601f191660200190565b5f60608236031215614e79575f80fd5b614e81614deb565b823581526020614e92818501614a69565b8183015260408401356001600160401b03811115614eae575f80fd5b840136601f820112614ebe575f80fd5b8035614ed1614ecc82614e43565b614e13565b8181523684838501011115614ee4575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614dcd818460208701614cbe565b80820180821115610c5557610c55614c35565b5f63ffffffff808316818103614f3c57614f3c614c35565b6001019392505050565b8082028115828204841417610c5557610c55614c35565b600181811c90821680614f7157607f821691505b602082108103614a2857634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614fa181614f5d565b806020870152604060018084165f8114614fc25760018114614fde5761500b565b60ff19851660408a0152604084151560051b8a0101955061500b565b895f5260205f205f5b858110156150025781548b8201860152908301908801614fe7565b8a016040019650505b509398975050505050505050565b8051611f3c816149a5565b5f8060408385031215615035575f80fd5b82516001600160401b038082111561504b575f80fd5b908401906060828703121561505e575f80fd5b615066614deb565b8251815260208084015161507981614d31565b8282015260408401518381111561508e575f80fd5b80850194505087601f8501126150a2575f80fd5b835192506150b2614ecc84614e43565b83815288828587010111156150c5575f80fd5b6150d484838301848801614cbe565b806040840152508195506150e9818801615019565b9450505050509250929050565b6001600160401b03818116838216019080821115612de057612de0614c35565b81810381811115610c5557610c55614c35565b5f808335601e1984360301811261513e575f80fd5b8301803591506001600160401b03821115615157575f80fd5b6020019150368190038213156123b1575f80fd5b6001600160401b0381811683821602808216919082811461518e5761518e614c35565b505092915050565b5f6001600160401b03808316818103614f3c57614f3c614c35565b5f602082840312156151c1575f80fd5b610c9382614a58565b5f602082840312156151da575f80fd5b813560ff81168114610c93575f80fd5b601f821115610c4057805f5260205f20601f840160051c8101602085101561520f5750805b601f840160051c820191505b81811015610d34575f815560010161521b565b81516001600160401b0381111561524757615247614dd7565b61525b816152558454614f5d565b846151ea565b602080601f83116001811461528e575f84156152775750858301515b5f19600386901b1c1916600185901b178555612aef565b5f85815260208120601f198616915b828110156152bc5788860151825594840194600190910190840161529d565b50858210156152d957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161533e81604e860160208901614cbe565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 12cda8bcd..33d95b250 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -176,8 +176,7 @@ abstract contract PoSValidatorManager is bool includeUptimeProof, uint32 messageIndex ) external { - uint256 reward = _initializeEndPoSValidation(validationID, includeUptimeProof, messageIndex); - if (reward == 0) { + if(!_initializeEndPoSValidation(validationID, includeUptimeProof, messageIndex)) { revert ValidatorIneligibleForRewards(); } } @@ -194,14 +193,14 @@ abstract contract PoSValidatorManager is bytes32 validationID, bool includeUptimeProof, uint32 messageIndex - ) internal returns (uint256) { + ) internal returns (bool) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Validator memory validator = _initializeEndValidation(validationID); // Non-PoS validators are required to boostrap the network, but are not eligible for rewards. if (!_isPoSValidator(validationID)) { - revert ValidatorNotPoS(); + return true; } // PoS validations can only be ended by their owners. @@ -235,7 +234,7 @@ abstract contract PoSValidatorManager is endSupply: 0 }); $._redeemableValidatorRewards[validationID] += reward; - return reward; + return (reward > 0); } function completeEndValidation(uint32 messageIndex) external { From a384357b5dcf69cedc89c8408b4abdec89f81fd3 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 24 Sep 2024 15:53:18 -0500 Subject: [PATCH 406/545] store uptime seconds in vdr info --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../validator-manager/PoSValidatorManager.sol | 17 ++++++------ .../validator-manager/StateTransition.md | 18 +++++++++++++ .../validator-manager/StateTransitionV2.md | 27 +++++++++++++++++++ .../interfaces/IPoSValidatorManager.sol | 1 + contracts/validator-manager/temp.md | 0 7 files changed, 56 insertions(+), 11 deletions(-) create mode 100644 contracts/validator-manager/StateTransition.md create mode 100644 contracts/validator-manager/StateTransitionV2.md create mode 100644 contracts/validator-manager/temp.md diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 295151261..2ec9deca5 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161584338038061584383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6156f68061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c80638280a25a116100fe578063ba3a4b971161009e578063df93d8de1161006e578063df93d8de14610408578063e7d14c1c14610412578063eb0acb8914610450578063f09969ae14610463575f80fd5b8063ba3a4b97146103ba578063bee0a03f146103cd578063c974d1b6146103e0578063d5f20ff6146103e8575f80fd5b80639dde029a116100d95780639dde029a1461035b5780639e1bc4ef1461036e578063a3a65e4814610381578063b771b3bc14610394575f80fd5b80638280a25a1461032d57806393e245981461033557806398f3e2b414610348575f80fd5b8063467ef06f11610174578063620658561161014457806362065856146102df57806366435abf14610300578063732214f81461031357806376f786211461031a575f80fd5b8063467ef06f146102895780635297fae61461029c57806360305d62146102af57806361e2f490146102cc575f80fd5b806325e1c776116101af57806325e1c7761461021c5780632e2194d81461022f57806335455ded1461025a5780633a1cfff614610276575f80fd5b80630118acc4146101d55780630322ed98146101ea578063151d30d1146101fd575b5f80fd5b6101e86101e3366004614c12565b610476565b005b6101e86101f8366004614c4d565b61081d565b610205600a81565b60405160ff90911681526020015b60405180910390f35b6101e861022a366004614c64565b61098f565b61024261023d366004614c4d565b6109ff565b6040516001600160401b039091168152602001610213565b61026361271081565b60405161ffff9091168152602001610213565b6101e8610284366004614c12565b610a15565b6101e8610297366004614c8e565b610a20565b6101e86102aa366004614ca7565b610ac1565b6102b7601481565b60405163ffffffff9091168152602001610213565b6101e86102da366004614ccf565b610e94565b6102f26102ed366004614d2a565b611313565b604051908152602001610213565b61024261030e366004614c4d565b61132c565b6102f25f81565b6101e8610328366004614c12565b611340565b610205603081565b6101e8610343366004614c4d565b611368565b6101e8610356366004614ca7565b61141f565b6101e8610369366004614c4d565b6115b1565b6102f261037c366004614d43565b611828565b6101e861038f366004614c8e565b611854565b6103a26005600160991b0181565b6040516001600160a01b039091168152602001610213565b6101e86103c8366004614c4d565b6119c1565b6101e86103db366004614c4d565b611b9d565b610205601481565b6103fb6103f6366004614c4d565b611cc2565b6040516102139190614d77565b6102426202a30081565b6102f2610420366004614c4d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102f261045e366004614e37565b611d8a565b6101e8610471366004614eb0565b611dbf565b5f8381525f8051602061562a8339815191526020526040808220815160e0810190925280545f8051602061566a83398151915293929190829060ff1660038111156104c3576104c3614d63565b60038111156104d4576104d4614d63565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61054a82611cc2565b905060028351600381111561056157610561614d63565b1461057f5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105ac5760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f806002835160058111156105ca576105ca614d63565b0361061b5787156105e2576105df8488611e9e565b91505b5f856060015184608001516105f79190614f02565b905061060385826120f6565b506001600160401b031660c08701525042905061064d565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b59061067290611313565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106a29796959493929190614f22565b602060405180830381865afa1580156106bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e19190614f60565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561072057610720614d63565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061080a9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206156ca8339815191526020526040808220815160e0810190925280545f8051602061568a83398151915293929190829060ff16600581111561086a5761086a614d63565b600581111561087b5761087b614d63565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108ea576108ea614d63565b146109085760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61092d8584606001515f61224d565b6040518263ffffffff1660e01b81526004016109499190614f99565b6020604051808303815f875af1158015610965573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109899190614f60565b50505050565b610998826122a4565b6109b557604051636ca57bcf60e01b815260040160405180910390fd5b60026109c083611cc2565b5160058111156109d2576109d2614d63565b146109f05760405163a36c527f60e01b815260040160405180910390fd5b6109fa8282611e9e565b505050565b5f610a0f64e8d4a5100083614fcb565b92915050565b6109898383836122df565b5f8051602061566a8339815191525f80610a39846124b0565b91509150610a46826122a4565b610a505750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610a7f57610a7f614d63565b03610aa4575f83815260078501602052604081208054919055610aa28282612740565b505b610aba81610ab58460400151611313565b6127b6565b5050505050565b5f8181525f8051602061562a8339815191526020526040808220815160e0810190925280545f8051602061566a83398151915293929190829060ff166003811115610b0e57610b0e614d63565b6003811115610b1f57610b1f614d63565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610b9690611cc2565b905060015f85815260058501602052604090205460ff166003811115610bbe57610bbe614d63565b14610bdc5760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610bf157610bf1614d63565b03610d3a57600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610c4b57610c4b614d63565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610d4f57610d4f614d63565b03610d5d57610aba846127d9565b5f80610d74610d6b886129b6565b60400151612ab6565b509150915081846040015114610d9d57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610de557505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b15610e0357604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061568a8339815191529060ff1615610ee657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f4d9190614f60565b836020013514610f705760405163d040949d60e01b815260040160405180910390fd5b30610f816060850160408601614fea565b6001600160a01b031614610fa85760405163e6c4247b60e01b815260040160405180910390fd5b5f610fb66060850185615005565b905090505f805b828163ffffffff161015611262575f610fd96060880188615005565b8363ffffffff16818110610fef57610fef61504a565b9050602002810190611001919061505e565b61100a9061510e565b80515f818152600888016020526040902054919250901561103e57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161106d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052611087916151a5565b602060405180830381855afa1580156110a2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110c59190614f60565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561115157611151614d63565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112049116866151b6565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061125b906151c9565b9050610fbd565b50600483018190555f611280611277866129b6565b60400151612cf4565b90505f61128c87612e69565b90508160028260405161129f91906151a5565b602060405180830381855afa1580156112ba573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112dd9190614f60565b146112fb57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610a0f6001600160401b03831664e8d4a510006151eb565b5f61133682611cc2565b6080015192915050565b61134b8383836122df565b6109fa5760405163d802b9f360e01b815260040160405180910390fd5b5f8051602061566a833981519152600461138183611cc2565b51600581111561139357611393614d63565b146113b15760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146113e95760405163e6c4247b60e01b815260040160405180910390fd5b5f828152600782016020908152604080832080549084905560048501909252909120546109fa906001600160a01b031682612740565b611427613302565b5f8181525f8051602061562a8339815191526020526040808220815160e0810190925280545f8051602061566a83398151915293929190829060ff16600381111561147457611474614d63565b600381111561148557611485614d63565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f806114f7610d6b876129b6565b50915091508183604001511461152057604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b0316111561155757604051633ab3447f60e11b815260040160405180910390fd5b60038351600381111561156c5761156c614d63565b1461158a5760405163f95c7fe160e01b815260040160405180910390fd5b611593856127d9565b505050506115ad60015f805160206156aa83398151915255565b5050565b6115b9613302565b5f8181525f8051602061562a8339815191526020526040808220815160e0810190925280545f8051602061566a83398151915293929190829060ff16600381111561160657611606614d63565b600381111561161757611617614d63565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61168d82611cc2565b90505f835160038111156116a3576116a3614d63565b036116c157604051631d0b665760e21b815260040160405180910390fd5b6004815160058111156116d6576116d6614d63565b146116f45760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561170957611709614d63565b0361172057611717856127d9565b5050505061180f565b60028351600381111561173557611735614d63565b0361180157600384015460608401516001600160a01b039091169063778c06b59061175f90611313565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b1681526117b196959493926001600160401b0390921691908190600401614f22565b602060405180830381865afa1580156117cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f09190614f60565b5f8681526006860160205260409020555b61180a856127d9565b505050505b61182560015f805160206156aa83398151915255565b50565b5f611831613302565b61183c83338461334c565b9050610a0f60015f805160206156aa83398151915255565b5f8051602061568a8339815191525f80611879611870856129b6565b60400151613613565b915091508061189b57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600684016020526040902080546118b590615202565b90505f036118d657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff1660058111156118fc576118fc614d63565b1461191a5760405163a36c527f60e01b815260040160405180910390fd5b5f828152600684016020526040812061193291614b62565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f8051602061562a8339815191526020526040808220815160e0810190925280545f8051602061566a83398151915293929190829060ff166003811115611a0e57611a0e614d63565b6003811115611a1f57611a1f614d63565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a9857611a98614d63565b14158015611ab95750600381516003811115611ab657611ab6614d63565b14155b15611ad75760405163f95c7fe160e01b815260040160405180910390fd5b5f611ae58260400151611cc2565b905080606001516001600160401b03165f03611b1457604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611b4184604001518460600151856080015161224d565b6040518263ffffffff1660e01b8152600401611b5d9190614f99565b6020604051808303815f875af1158015611b79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aba9190614f60565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061568a8339815191529190611be490615202565b90505f03611c0557604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611c2b57611c2b614d63565b14611c495760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c82919060040161523a565b6020604051808303815f875af1158015611c9e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109fa9190614f60565b611cca614b99565b5f8281525f805160206156ca833981519152602052604090819020815160e0810190925280545f8051602061568a833981519152929190829060ff166005811115611d1757611d17614d63565b6005811115611d2857611d28614d63565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611d93613302565b611d9f858585856137b7565b9050611db760015f805160206156aa83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611e08575080546001600160401b03808416911610155b15611e265760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611e518484613955565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ee9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f1091908101906152cf565b9150915080611f3257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f75573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f999190614f60565b825114611fb95760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611fe55760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ff4846040015161396f565b9150915081871461201857604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260409020545f8051602061566a833981519152906001600160401b0390811690831611156120cf575f888152600882016020908152604091829020805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26120eb565b5f8881526008820160205260409020546001600160401b031691505b509695505050505050565b5f8281525f805160206156ca833981519152602052604081206002015481905f8051602061568a83398151915290600160801b90046001600160401b031661213e8582613b4a565b5f61214887613d13565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6121988a858b61224d565b6040518263ffffffff1660e01b81526004016121b49190614f99565b6020604051808303815f875af11580156121d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121f49190614f60565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061566a833981519152816122f886613d88565b9050612303866122a4565b6123125760019250505061229d565b5f8681526004830160205260409020546001600160a01b0316331461234a5760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a082015161237991600160b01b90046001600160401b0316906153a1565b6001600160401b03168160c001516001600160401b031610156123af576040516302336bad60e51b815260040160405180910390fd5b5f85156123c7576123c08786611e9e565b90506123e2565b505f8681526008830160205260409020546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061240790611313565b60a086015160c08701516040516001600160e01b031960e086901b16815261243b939291829189905f908190600401614f22565b602060405180830381865afa158015612456573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247a9190614f60565b905080846007015f8a81526020019081526020015f205f82825461249e91906151b6565b90915550501515979650505050505050565b5f6124b9614b99565b5f8051602061568a8339815191525f806124d5611870876129b6565b9150915080156124f857604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561252957612529614d63565b600581111561253a5761253a614d63565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125a9576125a9614d63565b141580156125ca57506001815160058111156125c7576125c7614d63565b14155b156125e85760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156125fd576125fd614d63565b0361260b5760048152612610565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff1916600183600581111561265557612655614d63565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561270957612709614d63565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f8051602061564a83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561279b575f80fd5b505af11580156127ad573d5f803e3d5ffd5b50505050505050565b5f8051602061564a833981519152546115ad906001600160a01b03168383613fc5565b5f8181525f8051602061562a8339815191526020526040808220815160e0810190925280545f8051602061566a83398151915293929190829060ff16600381111561282657612826614d63565b600381111561283757612837614d63565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687018252828120805490829055848252600488019092529182205493945091926127109061290c90600160a01b900461ffff16846151eb565b6129169190614fcb565b905080856007015f8581526020019081526020015f205f82825461293a91906151b6565b909155505f905061294b82846153c1565b905061295b856020015182612740565b6129708560200151610ab58760600151611313565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a1a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a4191908101906152cf565b9150915080612a6357604051636b2f19e960e01b815260040160405180910390fd5b815115612a835760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612aaf5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612adb57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b2a57612af28160016153c1565b612afd9060086151eb565b61ffff16868281518110612b1357612b1361504a565b016020015160f81c901b9190911790600101612ade565b5061ffff811615612b4e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612ba957612b658160036153c1565b612b709060086151eb565b63ffffffff1687612b828360026151b6565b81518110612b9257612b9261504a565b016020015160f81c901b9190911790600101612b51565b5063ffffffff8116600414612bd157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c2657612be881601f6153c1565b612bf39060086151eb565b88612bff8360066151b6565b81518110612c0f57612c0f61504a565b016020015160f81c901b9190911790600101612bd4565b505f805b6008811015612c8557612c3e8160076153c1565b612c499060086151eb565b6001600160401b031689612c5e8360266151b6565b81518110612c6e57612c6e61504a565b016020015160f81c901b9190911790600101612c2a565b505f805b6008811015612ce457612c9d8160076153c1565b612ca89060086151eb565b6001600160401b03168a612cbd83602e6151b6565b81518110612ccd57612ccd61504a565b016020015160f81c901b9190911790600101612c89565b5091989097509095509350505050565b5f8151602614612d1757604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612d6657612d2e8160016153c1565b612d399060086151eb565b61ffff16848281518110612d4f57612d4f61504a565b016020015160f81c901b9190911790600101612d1a565b5061ffff811615612d8a5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612de557612da18160036153c1565b612dac9060086151eb565b63ffffffff1685612dbe8360026151b6565b81518110612dce57612dce61504a565b016020015160f81c901b9190911790600101612d8d565b5063ffffffff811615612e0b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612e6057612e2281601f6153c1565b612e2d9060086151eb565b86612e398360066151b6565b81518110612e4957612e4961504a565b016020015160f81c901b9190911790600101612e0e565b50949350505050565b60605f612e7883830184615005565b612e84915060586151eb565b612e8f90605c6151b6565b6001600160401b03811115612ea657612ea661507c565b6040519080825280601f01601f191660200182016040528015612ed0576020820181803683370190505b5090505f5b6020811015612f255783358160208110612ef157612ef161504a565b1a60f81b828281518110612f0757612f0761504a565b60200101906001600160f81b03191690815f1a905350600101612ed5565b505f5b6020811015612f855783602001358160208110612f4757612f4761504a565b1a60f81b82612f578360206151b6565b81518110612f6757612f6761504a565b60200101906001600160f81b03191690815f1a905350600101612f28565b505f5b6004811015612fe857612f9c8160036153c1565b612fa79060086151eb565b6014901c60f81b82612fba8360406151b6565b81518110612fca57612fca61504a565b60200101906001600160f81b03191690815f1a905350600101612f88565b505f612ffa6060850160408601614fea565b60601b90505f5b601481101561305a5781816014811061301c5761301c61504a565b1a60f81b8361302c8360446151b6565b8151811061303c5761303c61504a565b60200101906001600160f81b03191690815f1a905350600101613001565b505f6130696060860186615005565b905090505f5b60048110156130d4576130838160036153c1565b61308e9060086151eb565b63ffffffff8316901c60f81b846130a68360586151b6565b815181106130b6576130b661504a565b60200101906001600160f81b03191690815f1a90535060010161306f565b505f5b6130e46060870187615005565b90508110156132f8575f6130f98260586151eb565b61310490605c6151b6565b90505f5b602081101561318f5761311e6060890189615005565b8481811061312e5761312e61504a565b9050602002810190613140919061505e565b3581602081106131525761315261504a565b1a60f81b8661316183856151b6565b815181106131715761317161504a565b60200101906001600160f81b03191690815f1a905350600101613108565b505f5b6008811015613244576131a68160076153c1565b6131b19060086151eb565b6131be60608a018a615005565b858181106131ce576131ce61504a565b90506020028101906131e0919061505e565b6131f1906040810190602001614d2a565b6001600160401b0316901c60f81b868261320c8560206151b6565b61321691906151b6565b815181106132265761322661504a565b60200101906001600160f81b03191690815f1a905350600101613192565b505f5b60308110156132ee5761325d6060890189615005565b8481811061326d5761326d61504a565b905060200281019061327f919061505e565b61328d9060408101906153d4565b8281811061329d5761329d61504a565b9050013560f81c60f81b86828460286132b691906151b6565b6132c091906151b6565b815181106132d0576132d061504a565b60200101906001600160f81b03191690815f1a905350600101613247565b50506001016130d7565b5091949350505050565b5f805160206156aa83398151915280546001190161333357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206156aa83398151915255565b5f5f8051602061566a8339815191528161336861023d85614024565b90505f61337487611cc2565b905061337f876122a4565b61339c57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156133b1576133b1614d63565b146133cf5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516133e091906153a1565b905083600201600a9054906101000a90046001600160401b031682604001516134099190615416565b6001600160401b0316816001600160401b0316111561343b57604051630c192e7760e41b815260040160405180910390fd5b5f806134478a846120f6565b915091505f8a8360405160200161347592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561350857613508614d63565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461363757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136865761364e8160016153c1565b6136599060086151eb565b61ffff1685828151811061366f5761366f61504a565b016020015160f81c901b919091179060010161363a565b5061ffff8116156136aa5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613705576136c18160036153c1565b6136cc9060086151eb565b63ffffffff16866136de8360026151b6565b815181106136ee576136ee61504a565b016020015160f81c901b91909117906001016136ad565b5063ffffffff811660031461372d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137825761374481601f6153c1565b61374f9060086151eb565b8761375b8360066151b6565b8151811061376b5761376b61504a565b016020015160f81c901b9190911790600101613730565b505f866026815181106137975761379761504a565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061566a83398151915290600160401b900461ffff908116908616108061380b575061271061ffff8616115b156138295760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561385b576040516302336bad60e51b815260040160405180910390fd5b805483108061386d5750806001015483115b1561388b57604051630103be3b60e21b815260040160405180910390fd5b5f61389584614024565b90505f6138a1826109ff565b90505f6138ae8983614047565b905060405180606001604052806138c23390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b61395d614431565b6139668261447c565b6115ad816144ea565b5f808251602e1461399357604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156139e2576139aa8160016153c1565b6139b59060086151eb565b61ffff168582815181106139cb576139cb61504a565b016020015160f81c901b9190911790600101613996565b5061ffff811615613a065760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613a6157613a1d8160036153c1565b613a289060086151eb565b63ffffffff1686613a3a8360026151b6565b81518110613a4a57613a4a61504a565b016020015160f81c901b9190911790600101613a09565b5063ffffffff8116600514613a8957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613ade57613aa081601f6153c1565b613aab9060086151eb565b87613ab78360066151b6565b81518110613ac757613ac761504a565b016020015160f81c901b9190911790600101613a8c565b505f805b6008811015613b3d57613af68160076153c1565b613b019060086151eb565b6001600160401b031688613b168360266151b6565b81518110613b2657613b2661504a565b016020015160f81c901b9190911790600101613ae2565b5090969095509350505050565b5f8051602061568a8339815191525f6001600160401b038084169085161115613b7e57613b778385614f02565b9050613b8b565b613b888484614f02565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613bed575060018401548151613be9916001600160401b0316906151b6565b8210155b15613c13576001600160401b038316606082015281815260408101516020820152613c32565b8281606001818151613c2591906153a1565b6001600160401b03169052505b6060810151613c42906064615416565b602082015160018601546001600160401b039290921691613c6d9190600160401b900460ff166151eb565b1015613c8c5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613ca791906151b6565b9052506040810180516001600160401b0387169190613cc79083906153c1565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206156ca8339815191526020526040812060020180545f8051602061568a8339815191529190600890613d5d90600160401b90046001600160401b0316615441565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b613d90614b99565b5f8281525f805160206156ca8339815191526020526040808220815160e0810190925280545f8051602061568a83398151915293929190829060ff166005811115613ddd57613ddd614d63565b6005811115613dee57613dee614d63565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e6057613e60614d63565b14613e7e5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ec257613ec2614d63565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613f6e85826120f6565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526109fa91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614547565b5f610a0f825f8051602061564a833981519152546001600160a01b0316906145ad565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661408b57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061568a833981519152426140aa6040860160208701614d2a565b6001600160401b03161115806140e457506140c86202a300426151b6565b6140d86040860160208701614d2a565b6001600160401b031610155b156141015760405162d36c8560e81b815260040160405180910390fd5b603061411060408601866153d4565b905014158061411e57508335155b1561413c5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561416c57604051630eb0d31360e11b815260040160405180910390fd5b614176835f613b4a565b5f8061420f6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906141ba9190614d2a565b6001600160401b031681526020016141d560408a018a6153d4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061470f565b5f8281526006860160205260409020919350915061422d82826154a0565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb9061426b908590600401614f99565b6020604051808303815f875af1158015614287573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142ab9190614f60565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561432357614323614d63565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614403918e01908e01614d2a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661447a57604051631afcd79f60e31b815260040160405180910390fd5b565b614484614431565b61448d816147d2565b6144956147eb565b611825606082013560808301356144b260c0850160a08601614d2a565b6144c260e0860160c0870161555f565b6144d3610100870160e08801615578565b6144e561012088016101008901614fea565b6147fb565b6144f2614431565b5f8051602061564a8339815191526001600160a01b0382166145275760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f61455b6001600160a01b0384168361491c565b905080515f1415801561457f57508080602001905181019061457d9190615598565b155b156109fa57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156145f3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146179190614f60565b905061462e6001600160a01b038516333086614929565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614672573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146969190614f60565b90508181116146fc5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016145a4565b61470682826153c1565b95945050505050565b5f606082608001515160301461473857604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161476a97969594939291906155b3565b604051602081830303815290604052905060028160405161478b91906151a5565b602060405180830381855afa1580156147a6573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906147c99190614f60565b94909350915050565b6147da614431565b6147e2614962565b6118258161496a565b6147f3614431565b61447a614a3c565b614803614431565b5f8051602061566a83398151915261ffff84161580614827575061271061ffff8516115b156148455760405163c98d73a760e01b815260040160405180910390fd5b8587111561486657604051630103be3b60e21b815260040160405180910390fd5b60ff831615806148795750600a60ff8416115b15614897576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061229d83835f614a44565b6040516001600160a01b0384811660248301528381166044830152606482018390526109899186918216906323b872dd90608401613ff2565b61447a614431565b614972614431565b80355f8051602061568a83398151915290815560146149976060840160408501615578565b60ff1611806149b657506149b16060830160408401615578565b60ff16155b156149d45760405163b4fa3fb360e01b815260040160405180910390fd5b6149e46060830160408401615578565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a156040830160208401614d2a565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613339614431565b606081471015614a695760405163cd78605960e01b81523060048201526024016145a4565b5f80856001600160a01b03168486604051614a8491906151a5565b5f6040518083038185875af1925050503d805f8114614abe576040519150601f19603f3d011682016040523d82523d5f602084013e614ac3565b606091505b5091509150614ad3868383614add565b9695505050505050565b606082614af257614aed82614b39565b61229d565b8151158015614b0957506001600160a01b0384163b155b15614b3257604051639996b31560e01b81526001600160a01b03851660048201526024016145a4565b508061229d565b805115614b495780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614b6e90615202565b5f825580601f10614b7d575050565b601f0160209004905f5260205f20908101906118259190614bd5565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614be9575f8155600101614bd6565b5090565b8015158114611825575f80fd5b803563ffffffff81168114614c0d575f80fd5b919050565b5f805f60608486031215614c24575f80fd5b833592506020840135614c3681614bed565b9150614c4460408501614bfa565b90509250925092565b5f60208284031215614c5d575f80fd5b5035919050565b5f8060408385031215614c75575f80fd5b82359150614c8560208401614bfa565b90509250929050565b5f60208284031215614c9e575f80fd5b61229d82614bfa565b5f8060408385031215614cb8575f80fd5b614cc183614bfa565b946020939093013593505050565b5f8060408385031215614ce0575f80fd5b82356001600160401b03811115614cf5575f80fd5b830160808186031215614d06575f80fd5b9150614c8560208401614bfa565b80356001600160401b0381168114614c0d575f80fd5b5f60208284031215614d3a575f80fd5b61229d82614d14565b5f8060408385031215614d54575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614d9a57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614dd560608401826001600160401b03169052565b506080830151614df060808401826001600160401b03169052565b5060a0830151614e0b60a08401826001600160401b03169052565b5060c0830151612aaf60c08401826001600160401b03169052565b803561ffff81168114614c0d575f80fd5b5f805f8060808587031215614e4a575f80fd5b84356001600160401b03811115614e5f575f80fd5b850160608188031215614e70575f80fd5b9350614e7e60208601614e26565b9250614e8c60408601614d14565b9396929550929360600135925050565b6001600160a01b0381168114611825575f80fd5b5f80828403610140811215614ec3575f80fd5b61012080821215614ed2575f80fd5b8493508301359050614ee381614e9c565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612aaf57612aaf614eee565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614f70575f80fd5b5051919050565b5f5b83811015614f91578181015183820152602001614f79565b50505f910152565b602081525f8251806020840152614fb7816040850160208701614f77565b601f01601f19169190910160400192915050565b5f82614fe557634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614ffa575f80fd5b813561229d81614e9c565b5f808335601e1984360301811261501a575f80fd5b8301803591506001600160401b03821115615033575f80fd5b6020019150600581901b3603821315612246575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615072575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150b2576150b261507c565b60405290565b604051601f8201601f191681016001600160401b03811182821017156150e0576150e061507c565b604052919050565b5f6001600160401b038211156151005761510061507c565b50601f01601f191660200190565b5f6060823603121561511e575f80fd5b615126615090565b823581526020615137818501614d14565b8183015260408401356001600160401b03811115615153575f80fd5b840136601f820112615163575f80fd5b8035615176615171826150e8565b6150b8565b8181523684838501011115615189575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251615072818460208701614f77565b80820180821115610a0f57610a0f614eee565b5f63ffffffff8083168181036151e1576151e1614eee565b6001019392505050565b8082028115828204841417610a0f57610a0f614eee565b600181811c9082168061521657607f821691505b60208210810361523457634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461524c81615202565b806020870152604060018084165f811461526d5760018114615289576152b6565b60ff19851660408a0152604084151560051b8a010195506152b6565b895f5260205f205f5b858110156152ad5781548b8201860152908301908801615292565b8a016040019650505b509398975050505050505050565b8051614c0d81614bed565b5f80604083850312156152e0575f80fd5b82516001600160401b03808211156152f6575f80fd5b9084019060608287031215615309575f80fd5b615311615090565b8251815260208084015161532481614e9c565b82820152604084015183811115615339575f80fd5b80850194505087601f85011261534d575f80fd5b8351925061535d615171846150e8565b8381528882858701011115615370575f80fd5b61537f84838301848801614f77565b806040840152508195506153948188016152c4565b9450505050509250929050565b6001600160401b03818116838216019080821115612aaf57612aaf614eee565b81810381811115610a0f57610a0f614eee565b5f808335601e198436030181126153e9575f80fd5b8301803591506001600160401b03821115615402575f80fd5b602001915036819003821315612246575f80fd5b6001600160401b0381811683821602808216919082811461543957615439614eee565b505092915050565b5f6001600160401b038083168181036151e1576151e1614eee565b601f8211156109fa57805f5260205f20601f840160051c810160208510156154815750805b601f840160051c820191505b81811015610aba575f815560010161548d565b81516001600160401b038111156154b9576154b961507c565b6154cd816154c78454615202565b8461545c565b602080601f831160018114615500575f84156154e95750858301515b5f19600386901b1c1916600185901b178555615557565b5f85815260208120601f198616915b8281101561552e5788860151825594840194600190910190840161550f565b508582101561554b57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f6020828403121561556f575f80fd5b61229d82614e26565b5f60208284031215615588575f80fd5b813560ff8116811461229d575f80fd5b5f602082840312156155a8575f80fd5b815161229d81614bed565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161560881604e860160208901614f77565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161587b38038061587b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61572e8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c80638280a25a116100fe578063ba3a4b971161009e578063df93d8de1161006e578063df93d8de14610408578063e7d14c1c14610412578063eb0acb8914610450578063f09969ae14610463575f80fd5b8063ba3a4b97146103ba578063bee0a03f146103cd578063c974d1b6146103e0578063d5f20ff6146103e8575f80fd5b80639dde029a116100d95780639dde029a1461035b5780639e1bc4ef1461036e578063a3a65e4814610381578063b771b3bc14610394575f80fd5b80638280a25a1461032d57806393e245981461033557806398f3e2b414610348575f80fd5b8063467ef06f11610174578063620658561161014457806362065856146102df57806366435abf14610300578063732214f81461031357806376f786211461031a575f80fd5b8063467ef06f146102895780635297fae61461029c57806360305d62146102af57806361e2f490146102cc575f80fd5b806325e1c776116101af57806325e1c7761461021c5780632e2194d81461022f57806335455ded1461025a5780633a1cfff614610276575f80fd5b80630118acc4146101d55780630322ed98146101ea578063151d30d1146101fd575b5f80fd5b6101e86101e3366004614c4a565b610476565b005b6101e86101f8366004614c85565b610820565b610205600a81565b60405160ff90911681526020015b60405180910390f35b6101e861022a366004614c9c565b610992565b61024261023d366004614c85565b610a02565b6040516001600160401b039091168152602001610213565b61026361271081565b60405161ffff9091168152602001610213565b6101e8610284366004614c4a565b610a18565b6101e8610297366004614cc6565b610a23565b6101e86102aa366004614cdf565b610ac4565b6102b7601481565b60405163ffffffff9091168152602001610213565b6101e86102da366004614d07565b610e97565b6102f26102ed366004614d62565b611316565b604051908152602001610213565b61024261030e366004614c85565b61132f565b6102f25f81565b6101e8610328366004614c4a565b611343565b610205603081565b6101e8610343366004614c85565b61136b565b6101e8610356366004614cdf565b611422565b6101e8610369366004614c85565b6115b4565b6102f261037c366004614d7b565b61182c565b6101e861038f366004614cc6565b611858565b6103a26005600160991b0181565b6040516001600160a01b039091168152602001610213565b6101e86103c8366004614c85565b6119c5565b6101e86103db366004614c85565b611ba1565b610205601481565b6103fb6103f6366004614c85565b611cc6565b6040516102139190614daf565b6102426202a30081565b6102f2610420366004614c85565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102f261045e366004614e6f565b611d8e565b6101e8610471366004614ee8565b611dc3565b5f8381525f805160206156628339815191526020526040808220815160e0810190925280545f805160206156a283398151915293929190829060ff1660038111156104c3576104c3614d9b565b60038111156104d4576104d4614d9b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61054a82611cc6565b905060028351600381111561056157610561614d9b565b1461057f5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105ac5760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f806002835160058111156105ca576105ca614d9b565b0361061b5787156105e2576105df8488611ea2565b91505b5f856060015184608001516105f79190614f3a565b90506106038582612103565b506001600160401b031660c087015250429050610650565b50505f82815260048501602052604090206001015460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b59061067590611316565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106a59796959493929190614f5a565b602060405180830381865afa1580156106c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e49190614f98565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561072357610723614d9b565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061080d9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206157028339815191526020526040808220815160e0810190925280545f805160206156c283398151915293929190829060ff16600581111561086d5761086d614d9b565b600581111561087e5761087e614d9b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108ed576108ed614d9b565b1461090b5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109308584606001515f61225a565b6040518263ffffffff1660e01b815260040161094c9190614fd1565b6020604051808303815f875af1158015610968573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098c9190614f98565b50505050565b61099b826122b1565b6109b857604051636ca57bcf60e01b815260040160405180910390fd5b60026109c383611cc6565b5160058111156109d5576109d5614d9b565b146109f35760405163a36c527f60e01b815260040160405180910390fd5b6109fd8282611ea2565b505050565b5f610a1264e8d4a5100083615003565b92915050565b61098c8383836122ec565b5f805160206156a28339815191525f80610a3c846124c0565b91509150610a49826122b1565b610a535750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610a8257610a82614d9b565b03610aa7575f83815260078501602052604081208054919055610aa58282612750565b505b610abd81610ab88460400151611316565b6127c6565b5050505050565b5f8181525f805160206156628339815191526020526040808220815160e0810190925280545f805160206156a283398151915293929190829060ff166003811115610b1157610b11614d9b565b6003811115610b2257610b22614d9b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610b9990611cc6565b905060015f85815260058501602052604090205460ff166003811115610bc157610bc1614d9b565b14610bdf5760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610bf457610bf4614d9b565b03610d3d57600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610c4e57610c4e614d9b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610d5257610d52614d9b565b03610d6057610abd846127e9565b5f80610d77610d6e886129c6565b60400151612ac6565b509150915081846040015114610da057604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610de857505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b15610e0657604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206156c28339815191529060ff1615610ee957604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f509190614f98565b836020013514610f735760405163d040949d60e01b815260040160405180910390fd5b30610f846060850160408601615022565b6001600160a01b031614610fab5760405163e6c4247b60e01b815260040160405180910390fd5b5f610fb9606085018561503d565b905090505f805b828163ffffffff161015611265575f610fdc606088018861503d565b8363ffffffff16818110610ff257610ff2615082565b90506020028101906110049190615096565b61100d90615146565b80515f818152600888016020526040902054919250901561104157604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161107092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261108a916151dd565b602060405180830381855afa1580156110a5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110c89190614f98565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561115457611154614d9b565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112079116866151ee565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061125e90615201565b9050610fc0565b50600483018190555f61128361127a866129c6565b60400151612d04565b90505f61128f87612e79565b9050816002826040516112a291906151dd565b602060405180830381855afa1580156112bd573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e09190614f98565b146112fe57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610a126001600160401b03831664e8d4a51000615223565b5f61133982611cc6565b6080015192915050565b61134e8383836122ec565b6109fd5760405163d802b9f360e01b815260040160405180910390fd5b5f805160206156a2833981519152600461138483611cc6565b51600581111561139657611396614d9b565b146113b45760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146113ec5760405163e6c4247b60e01b815260040160405180910390fd5b5f828152600782016020908152604080832080549084905560048501909252909120546109fd906001600160a01b031682612750565b61142a613312565b5f8181525f805160206156628339815191526020526040808220815160e0810190925280545f805160206156a283398151915293929190829060ff16600381111561147757611477614d9b565b600381111561148857611488614d9b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f806114fa610d6e876129c6565b50915091508183604001511461152357604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b0316111561155a57604051633ab3447f60e11b815260040160405180910390fd5b60038351600381111561156f5761156f614d9b565b1461158d5760405163f95c7fe160e01b815260040160405180910390fd5b611596856127e9565b505050506115b060015f805160206156e283398151915255565b5050565b6115bc613312565b5f8181525f805160206156628339815191526020526040808220815160e0810190925280545f805160206156a283398151915293929190829060ff16600381111561160957611609614d9b565b600381111561161a5761161a614d9b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61169082611cc6565b90505f835160038111156116a6576116a6614d9b565b036116c457604051631d0b665760e21b815260040160405180910390fd5b6004815160058111156116d9576116d9614d9b565b146116f75760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561170c5761170c614d9b565b036117235761171a856127e9565b50505050611813565b60028351600381111561173857611738614d9b565b0361180557600384015460608401516001600160a01b039091169063778c06b59061176290611316565b60a0840151608087015160c08601515f8881526004808c0160205260408083206001015490516001600160e01b031960e08a901b1681526117b597969594936001600160401b0390921692829101614f5a565b602060405180830381865afa1580156117d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f49190614f98565b5f8681526006860160205260409020555b61180e856127e9565b505050505b61182960015f805160206156e283398151915255565b50565b5f611835613312565b61184083338461335c565b9050610a1260015f805160206156e283398151915255565b5f805160206156c28339815191525f8061187d611874856129c6565b60400151613623565b915091508061189f57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600684016020526040902080546118b99061523a565b90505f036118da57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff16600581111561190057611900614d9b565b1461191e5760405163a36c527f60e01b815260040160405180910390fd5b5f828152600684016020526040812061193691614b9a565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206156628339815191526020526040808220815160e0810190925280545f805160206156a283398151915293929190829060ff166003811115611a1257611a12614d9b565b6003811115611a2357611a23614d9b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a9c57611a9c614d9b565b14158015611abd5750600381516003811115611aba57611aba614d9b565b14155b15611adb5760405163f95c7fe160e01b815260040160405180910390fd5b5f611ae98260400151611cc6565b905080606001516001600160401b03165f03611b1857604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611b4584604001518460600151856080015161225a565b6040518263ffffffff1660e01b8152600401611b619190614fd1565b6020604051808303815f875af1158015611b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abd9190614f98565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206156c28339815191529190611be89061523a565b90505f03611c0957604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611c2f57611c2f614d9b565b14611c4d5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c869190600401615272565b6020604051808303815f875af1158015611ca2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109fd9190614f98565b611cce614bd1565b5f8281525f80516020615702833981519152602052604090819020815160e0810190925280545f805160206156c2833981519152929190829060ff166005811115611d1b57611d1b614d9b565b6005811115611d2c57611d2c614d9b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611d97613312565b611da3858585856137c7565b9050611dbb60015f805160206156e283398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611e0c575080546001600160401b03808416911610155b15611e2a5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611e55848461398d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611eed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f149190810190615307565b9150915080611f3657604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9d9190614f98565b825114611fbd5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611fe95760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ff884604001516139a7565b9150915081871461201c57604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f805160206156a2833981519152906001600160401b0390811690831611156120d9575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26120f8565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f8281525f80516020615702833981519152602052604081206002015481905f805160206156c283398151915290600160801b90046001600160401b031661214b8582613b82565b5f61215587613d4b565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6121a58a858b61225a565b6040518263ffffffff1660e01b81526004016121c19190614fd1565b6020604051808303815f875af11580156121dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122019190614f98565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206156a28339815191528161230586613dc0565b9050612310866122b1565b61231f576001925050506122aa565b5f8681526004830160205260409020546001600160a01b031633146123575760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a082015161238691600160b01b90046001600160401b0316906153d9565b6001600160401b03168160c001516001600160401b031610156123bc576040516302336bad60e51b815260040160405180910390fd5b5f85156123d4576123cd8786611ea2565b90506123f2565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061241790611316565b60a086015160c08701516040516001600160e01b031960e086901b16815261244b939291829189905f908190600401614f5a565b602060405180830381865afa158015612466573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248a9190614f98565b905080846007015f8a81526020019081526020015f205f8282546124ae91906151ee565b90915550501515979650505050505050565b5f6124c9614bd1565b5f805160206156c28339815191525f806124e5611874876129c6565b91509150801561250857604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561253957612539614d9b565b600581111561254a5761254a614d9b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125b9576125b9614d9b565b141580156125da57506001815160058111156125d7576125d7614d9b565b14155b156125f85760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561260d5761260d614d9b565b0361261b5760048152612620565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff1916600183600581111561266557612665614d9b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561271957612719614d9b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f8051602061568283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156127ab575f80fd5b505af11580156127bd573d5f803e3d5ffd5b50505050505050565b5f80516020615682833981519152546115b0906001600160a01b03168383613ffd565b5f8181525f805160206156628339815191526020526040808220815160e0810190925280545f805160206156a283398151915293929190829060ff16600381111561283657612836614d9b565b600381111561284757612847614d9b565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687018252828120805490829055848252600488019092529182205493945091926127109061291c90600160a01b900461ffff1684615223565b6129269190615003565b905080856007015f8581526020019081526020015f205f82825461294a91906151ee565b909155505f905061295b82846153f9565b905061296b856020015182612750565b6129808560200151610ab88760600151611316565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a2a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a519190810190615307565b9150915080612a7357604051636b2f19e960e01b815260040160405180910390fd5b815115612a935760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612abf5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612aeb57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b3a57612b028160016153f9565b612b0d906008615223565b61ffff16868281518110612b2357612b23615082565b016020015160f81c901b9190911790600101612aee565b5061ffff811615612b5e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612bb957612b758160036153f9565b612b80906008615223565b63ffffffff1687612b928360026151ee565b81518110612ba257612ba2615082565b016020015160f81c901b9190911790600101612b61565b5063ffffffff8116600414612be157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c3657612bf881601f6153f9565b612c03906008615223565b88612c0f8360066151ee565b81518110612c1f57612c1f615082565b016020015160f81c901b9190911790600101612be4565b505f805b6008811015612c9557612c4e8160076153f9565b612c59906008615223565b6001600160401b031689612c6e8360266151ee565b81518110612c7e57612c7e615082565b016020015160f81c901b9190911790600101612c3a565b505f805b6008811015612cf457612cad8160076153f9565b612cb8906008615223565b6001600160401b03168a612ccd83602e6151ee565b81518110612cdd57612cdd615082565b016020015160f81c901b9190911790600101612c99565b5091989097509095509350505050565b5f8151602614612d2757604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612d7657612d3e8160016153f9565b612d49906008615223565b61ffff16848281518110612d5f57612d5f615082565b016020015160f81c901b9190911790600101612d2a565b5061ffff811615612d9a5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612df557612db18160036153f9565b612dbc906008615223565b63ffffffff1685612dce8360026151ee565b81518110612dde57612dde615082565b016020015160f81c901b9190911790600101612d9d565b5063ffffffff811615612e1b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612e7057612e3281601f6153f9565b612e3d906008615223565b86612e498360066151ee565b81518110612e5957612e59615082565b016020015160f81c901b9190911790600101612e1e565b50949350505050565b60605f612e888383018461503d565b612e9491506058615223565b612e9f90605c6151ee565b6001600160401b03811115612eb657612eb66150b4565b6040519080825280601f01601f191660200182016040528015612ee0576020820181803683370190505b5090505f5b6020811015612f355783358160208110612f0157612f01615082565b1a60f81b828281518110612f1757612f17615082565b60200101906001600160f81b03191690815f1a905350600101612ee5565b505f5b6020811015612f955783602001358160208110612f5757612f57615082565b1a60f81b82612f678360206151ee565b81518110612f7757612f77615082565b60200101906001600160f81b03191690815f1a905350600101612f38565b505f5b6004811015612ff857612fac8160036153f9565b612fb7906008615223565b6014901c60f81b82612fca8360406151ee565b81518110612fda57612fda615082565b60200101906001600160f81b03191690815f1a905350600101612f98565b505f61300a6060850160408601615022565b60601b90505f5b601481101561306a5781816014811061302c5761302c615082565b1a60f81b8361303c8360446151ee565b8151811061304c5761304c615082565b60200101906001600160f81b03191690815f1a905350600101613011565b505f613079606086018661503d565b905090505f5b60048110156130e4576130938160036153f9565b61309e906008615223565b63ffffffff8316901c60f81b846130b68360586151ee565b815181106130c6576130c6615082565b60200101906001600160f81b03191690815f1a90535060010161307f565b505f5b6130f4606087018761503d565b9050811015613308575f613109826058615223565b61311490605c6151ee565b90505f5b602081101561319f5761312e606089018961503d565b8481811061313e5761313e615082565b90506020028101906131509190615096565b35816020811061316257613162615082565b1a60f81b8661317183856151ee565b8151811061318157613181615082565b60200101906001600160f81b03191690815f1a905350600101613118565b505f5b6008811015613254576131b68160076153f9565b6131c1906008615223565b6131ce60608a018a61503d565b858181106131de576131de615082565b90506020028101906131f09190615096565b613201906040810190602001614d62565b6001600160401b0316901c60f81b868261321c8560206151ee565b61322691906151ee565b8151811061323657613236615082565b60200101906001600160f81b03191690815f1a9053506001016131a2565b505f5b60308110156132fe5761326d606089018961503d565b8481811061327d5761327d615082565b905060200281019061328f9190615096565b61329d90604081019061540c565b828181106132ad576132ad615082565b9050013560f81c60f81b86828460286132c691906151ee565b6132d091906151ee565b815181106132e0576132e0615082565b60200101906001600160f81b03191690815f1a905350600101613257565b50506001016130e7565b5091949350505050565b5f805160206156e283398151915280546001190161334357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206156e283398151915255565b5f5f805160206156a28339815191528161337861023d8561405c565b90505f61338487611cc6565b905061338f876122b1565b6133ac57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156133c1576133c1614d9b565b146133df5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516133f091906153d9565b905083600201600a9054906101000a90046001600160401b03168260400151613419919061544e565b6001600160401b0316816001600160401b0316111561344b57604051630c192e7760e41b815260040160405180910390fd5b5f806134578a84612103565b915091505f8a8360405160200161348592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561351857613518614d9b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461364757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136965761365e8160016153f9565b613669906008615223565b61ffff1685828151811061367f5761367f615082565b016020015160f81c901b919091179060010161364a565b5061ffff8116156136ba5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613715576136d18160036153f9565b6136dc906008615223565b63ffffffff16866136ee8360026151ee565b815181106136fe576136fe615082565b016020015160f81c901b91909117906001016136bd565b5063ffffffff811660031461373d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137925761375481601f6153f9565b61375f906008615223565b8761376b8360066151ee565b8151811061377b5761377b615082565b016020015160f81c901b9190911790600101613740565b505f866026815181106137a7576137a7615082565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206156a283398151915290600160401b900461ffff908116908616108061381b575061271061ffff8616115b156138395760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561386b576040516302336bad60e51b815260040160405180910390fd5b805483108061387d5750806001015483115b1561389b57604051630103be3b60e21b815260040160405180910390fd5b5f6138a58461405c565b90505f6138b182610a02565b90505f6138be898361407f565b905060405180608001604052806138d23390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b613995614469565b61399e826144b4565b6115b081614522565b5f808251602e146139cb57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613a1a576139e28160016153f9565b6139ed906008615223565b61ffff16858281518110613a0357613a03615082565b016020015160f81c901b91909117906001016139ce565b5061ffff811615613a3e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613a9957613a558160036153f9565b613a60906008615223565b63ffffffff1686613a728360026151ee565b81518110613a8257613a82615082565b016020015160f81c901b9190911790600101613a41565b5063ffffffff8116600514613ac157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b1657613ad881601f6153f9565b613ae3906008615223565b87613aef8360066151ee565b81518110613aff57613aff615082565b016020015160f81c901b9190911790600101613ac4565b505f805b6008811015613b7557613b2e8160076153f9565b613b39906008615223565b6001600160401b031688613b4e8360266151ee565b81518110613b5e57613b5e615082565b016020015160f81c901b9190911790600101613b1a565b5090969095509350505050565b5f805160206156c28339815191525f6001600160401b038084169085161115613bb657613baf8385614f3a565b9050613bc3565b613bc08484614f3a565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613c25575060018401548151613c21916001600160401b0316906151ee565b8210155b15613c4b576001600160401b038316606082015281815260408101516020820152613c6a565b8281606001818151613c5d91906153d9565b6001600160401b03169052505b6060810151613c7a90606461544e565b602082015160018601546001600160401b039290921691613ca59190600160401b900460ff16615223565b1015613cc45760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613cdf91906151ee565b9052506040810180516001600160401b0387169190613cff9083906153f9565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206157028339815191526020526040812060020180545f805160206156c28339815191529190600890613d9590600160401b90046001600160401b0316615479565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b613dc8614bd1565b5f8281525f805160206157028339815191526020526040808220815160e0810190925280545f805160206156c283398151915293929190829060ff166005811115613e1557613e15614d9b565b6005811115613e2657613e26614d9b565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e9857613e98614d9b565b14613eb65760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613efa57613efa614d9b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613fa68582612103565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526109fd91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061457f565b5f610a12825f80516020615682833981519152546001600160a01b0316906145e5565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166140c357604051637fab81e560e01b815260040160405180910390fd5b5f805160206156c2833981519152426140e26040860160208701614d62565b6001600160401b031611158061411c57506141006202a300426151ee565b6141106040860160208701614d62565b6001600160401b031610155b156141395760405162d36c8560e81b815260040160405180910390fd5b6030614148604086018661540c565b905014158061415657508335155b156141745760405163b4fa3fb360e01b815260040160405180910390fd5b83355f908152600882016020526040902054156141a457604051630eb0d31360e11b815260040160405180910390fd5b6141ae835f613b82565b5f806142476040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906141f29190614d62565b6001600160401b0316815260200161420d60408a018a61540c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614747565b5f8281526006860160205260409020919350915061426582826154d8565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906142a3908590600401614fd1565b6020604051808303815f875af11580156142bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142e39190614f98565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561435b5761435b614d9b565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161443b918e01908e01614d62565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166144b257604051631afcd79f60e31b815260040160405180910390fd5b565b6144bc614469565b6144c58161480a565b6144cd614823565b611829606082013560808301356144ea60c0850160a08601614d62565b6144fa60e0860160c08701615597565b61450b610100870160e088016155b0565b61451d61012088016101008901615022565b614833565b61452a614469565b5f805160206156828339815191526001600160a01b03821661455f5760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6145936001600160a01b03841683614954565b905080515f141580156145b75750808060200190518101906145b591906155d0565b155b156109fd57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561462b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061464f9190614f98565b90506146666001600160a01b038516333086614961565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156146aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146ce9190614f98565b90508181116147345760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016145dc565b61473e82826153f9565b95945050505050565b5f606082608001515160301461477057604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016147a297969594939291906155eb565b60405160208183030381529060405290506002816040516147c391906151dd565b602060405180830381855afa1580156147de573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906148019190614f98565b94909350915050565b614812614469565b61481a61499a565b611829816149a2565b61482b614469565b6144b2614a74565b61483b614469565b5f805160206156a283398151915261ffff8416158061485f575061271061ffff8516115b1561487d5760405163c98d73a760e01b815260040160405180910390fd5b8587111561489e57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806148b15750600a60ff8416115b156148cf576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b60606122aa83835f614a7c565b6040516001600160a01b03848116602483015283811660448301526064820183905261098c9186918216906323b872dd9060840161402a565b6144b2614469565b6149aa614469565b80355f805160206156c283398151915290815560146149cf60608401604085016155b0565b60ff1611806149ee57506149e960608301604084016155b0565b60ff16155b15614a0c5760405163b4fa3fb360e01b815260040160405180910390fd5b614a1c60608301604084016155b0565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a4d6040830160208401614d62565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613349614469565b606081471015614aa15760405163cd78605960e01b81523060048201526024016145dc565b5f80856001600160a01b03168486604051614abc91906151dd565b5f6040518083038185875af1925050503d805f8114614af6576040519150601f19603f3d011682016040523d82523d5f602084013e614afb565b606091505b5091509150614b0b868383614b15565b9695505050505050565b606082614b2a57614b2582614b71565b6122aa565b8151158015614b4157506001600160a01b0384163b155b15614b6a57604051639996b31560e01b81526001600160a01b03851660048201526024016145dc565b50806122aa565b805115614b815780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ba69061523a565b5f825580601f10614bb5575050565b601f0160209004905f5260205f20908101906118299190614c0d565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614c21575f8155600101614c0e565b5090565b8015158114611829575f80fd5b803563ffffffff81168114614c45575f80fd5b919050565b5f805f60608486031215614c5c575f80fd5b833592506020840135614c6e81614c25565b9150614c7c60408501614c32565b90509250925092565b5f60208284031215614c95575f80fd5b5035919050565b5f8060408385031215614cad575f80fd5b82359150614cbd60208401614c32565b90509250929050565b5f60208284031215614cd6575f80fd5b6122aa82614c32565b5f8060408385031215614cf0575f80fd5b614cf983614c32565b946020939093013593505050565b5f8060408385031215614d18575f80fd5b82356001600160401b03811115614d2d575f80fd5b830160808186031215614d3e575f80fd5b9150614cbd60208401614c32565b80356001600160401b0381168114614c45575f80fd5b5f60208284031215614d72575f80fd5b6122aa82614d4c565b5f8060408385031215614d8c575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614dd257634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e0d60608401826001600160401b03169052565b506080830151614e2860808401826001600160401b03169052565b5060a0830151614e4360a08401826001600160401b03169052565b5060c0830151612abf60c08401826001600160401b03169052565b803561ffff81168114614c45575f80fd5b5f805f8060808587031215614e82575f80fd5b84356001600160401b03811115614e97575f80fd5b850160608188031215614ea8575f80fd5b9350614eb660208601614e5e565b9250614ec460408601614d4c565b9396929550929360600135925050565b6001600160a01b0381168114611829575f80fd5b5f80828403610140811215614efb575f80fd5b61012080821215614f0a575f80fd5b8493508301359050614f1b81614ed4565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612abf57612abf614f26565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614fa8575f80fd5b5051919050565b5f5b83811015614fc9578181015183820152602001614fb1565b50505f910152565b602081525f8251806020840152614fef816040850160208701614faf565b601f01601f19169190910160400192915050565b5f8261501d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215615032575f80fd5b81356122aa81614ed4565b5f808335601e19843603018112615052575f80fd5b8301803591506001600160401b0382111561506b575f80fd5b6020019150600581901b3603821315612253575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150aa575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150ea576150ea6150b4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615118576151186150b4565b604052919050565b5f6001600160401b03821115615138576151386150b4565b50601f01601f191660200190565b5f60608236031215615156575f80fd5b61515e6150c8565b82358152602061516f818501614d4c565b8183015260408401356001600160401b0381111561518b575f80fd5b840136601f82011261519b575f80fd5b80356151ae6151a982615120565b6150f0565b81815236848385010111156151c1575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516150aa818460208701614faf565b80820180821115610a1257610a12614f26565b5f63ffffffff80831681810361521957615219614f26565b6001019392505050565b8082028115828204841417610a1257610a12614f26565b600181811c9082168061524e57607f821691505b60208210810361526c57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546152848161523a565b806020870152604060018084165f81146152a557600181146152c1576152ee565b60ff19851660408a0152604084151560051b8a010195506152ee565b895f5260205f205f5b858110156152e55781548b82018601529083019088016152ca565b8a016040019650505b509398975050505050505050565b8051614c4581614c25565b5f8060408385031215615318575f80fd5b82516001600160401b038082111561532e575f80fd5b9084019060608287031215615341575f80fd5b6153496150c8565b8251815260208084015161535c81614ed4565b82820152604084015183811115615371575f80fd5b80850194505087601f850112615385575f80fd5b835192506153956151a984615120565b83815288828587010111156153a8575f80fd5b6153b784838301848801614faf565b806040840152508195506153cc8188016152fc565b9450505050509250929050565b6001600160401b03818116838216019080821115612abf57612abf614f26565b81810381811115610a1257610a12614f26565b5f808335601e19843603018112615421575f80fd5b8301803591506001600160401b0382111561543a575f80fd5b602001915036819003821315612253575f80fd5b6001600160401b0381811683821602808216919082811461547157615471614f26565b505092915050565b5f6001600160401b0380831681810361521957615219614f26565b601f8211156109fd57805f5260205f20601f840160051c810160208510156154b95750805b601f840160051c820191505b81811015610abd575f81556001016154c5565b81516001600160401b038111156154f1576154f16150b4565b615505816154ff845461523a565b84615494565b602080601f831160018114615538575f84156155215750858301515b5f19600386901b1c1916600185901b17855561558f565b5f85815260208120601f198616915b8281101561556657888601518255948401946001909101908401615547565b508582101561558357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156155a7575f80fd5b6122aa82614e5e565b5f602082840312156155c0575f80fd5b813560ff811681146122aa575f80fd5b5f602082840312156155e0575f80fd5b81516122aa81614c25565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161564081604e860160208901614faf565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 b00e73431..a2b6dc0cd 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161555938038061555983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61540c8061014d5f395ff3fe6080604052600436106101d0575f3560e01c806366435abf116100fd578063b771b3bc11610092578063c974d1b611610062578063c974d1b61461053f578063d5f20ff614610553578063df93d8de1461057f578063e7d14c1c14610595575f80fd5b8063b771b3bc146104d4578063ba3a4b97146104ee578063bee0a03f1461050d578063c599e24f1461052c575f80fd5b806393e24598116100cd57806393e245981461045857806398f3e2b4146104775780639dde029a14610496578063a3a65e48146104b5575f80fd5b806366435abf146103f3578063732214f81461041257806376f78621146104255780638280a25a14610444575f80fd5b806335455ded116101735780635297fae6116101435780635297fae61461036d57806360305d621461038c57806361e2f490146103b557806362065856146103d4575f80fd5b806335455ded146102e65780633a1cfff61461030e57806340034a931461032d578063467ef06f1461034e575f80fd5b806320e55565116101ae57806320e555651461023f57806325e1c7761461025e5780632e2194d81461027d578063329c3e12146102b4575f80fd5b80630118acc4146101d45780630322ed98146101f5578063151d30d114610214575b5f80fd5b3480156101df575f80fd5b506101f36101ee3660046149c5565b6105df565b005b348015610200575f80fd5b506101f361020f366004614a00565b610986565b34801561021f575f80fd5b50610228600a81565b60405160ff90911681526020015b60405180910390f35b34801561024a575f80fd5b506101f3610259366004614a17565b610af8565b348015610269575f80fd5b506101f3610278366004614a2e565b610bd5565b348015610288575f80fd5b5061029c610297366004614a00565b610c45565b6040516001600160401b039091168152602001610236565b3480156102bf575f80fd5b506102ce6001600160991b0181565b6040516001600160a01b039091168152602001610236565b3480156102f1575f80fd5b506102fb61271081565b60405161ffff9091168152602001610236565b348015610319575f80fd5b506101f36103283660046149c5565b610c5b565b61034061033b366004614a7f565b610c66565b604051908152602001610236565b348015610359575f80fd5b506101f3610368366004614ad3565b610c9a565b348015610378575f80fd5b506101f3610387366004614aec565b610d3b565b348015610397575f80fd5b506103a0601481565b60405163ffffffff9091168152602001610236565b3480156103c0575f80fd5b506101f36103cf366004614b14565b61110e565b3480156103df575f80fd5b506103406103ee366004614b59565b61158d565b3480156103fe575f80fd5b5061029c61040d366004614a00565b6115a6565b34801561041d575f80fd5b506103405f81565b348015610430575f80fd5b506101f361043f3660046149c5565b6115ba565b34801561044f575f80fd5b50610228603081565b348015610463575f80fd5b506101f3610472366004614a00565b6115e2565b348015610482575f80fd5b506101f3610491366004614aec565b611699565b3480156104a1575f80fd5b506101f36104b0366004614a00565b61182b565b3480156104c0575f80fd5b506101f36104cf366004614ad3565b611aa2565b3480156104df575f80fd5b506102ce6005600160991b0181565b3480156104f9575f80fd5b506101f3610508366004614a00565b611c0f565b348015610518575f80fd5b506101f3610527366004614a00565b611deb565b61034061053a366004614a00565b611f10565b34801561054a575f80fd5b50610228601481565b34801561055e575f80fd5b5061057261056d366004614a00565b611f41565b6040516102369190614b86565b34801561058a575f80fd5b5061029c6202a30081565b3480156105a0575f80fd5b506103406105af366004614a00565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206153608339815191526020526040808220815160e0810190925280545f8051602061538083398151915293929190829060ff16600381111561062c5761062c614b72565b600381111561063d5761063d614b72565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6106b382611f41565b90506002835160038111156106ca576106ca614b72565b146106e85760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146107155760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f8060028351600581111561073357610733614b72565b0361078457871561074b576107488488612009565b91505b5f856060015184608001516107609190614c49565b905061076c8582612261565b506001600160401b031660c0870152504290506107b6565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b5906107db9061158d565b8560a00151886080015185875f806040518863ffffffff1660e01b815260040161080b9796959493929190614c69565b602060405180830381865afa158015610826573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084a9190614ca7565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561088957610889614b72565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906109739085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206153e08339815191526020526040808220815160e0810190925280545f805160206153a083398151915293929190829060ff1660058111156109d3576109d3614b72565b60058111156109e4576109e4614b72565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a5357610a53614b72565b14610a715760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a968584606001515f6123b8565b6040518263ffffffff1660e01b8152600401610ab29190614ce0565b6020604051808303815f875af1158015610ace573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af29190614ca7565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b41575080546001600160401b03808416911610155b15610b5f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b8983612407565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610bde82612418565b610bfb57604051636ca57bcf60e01b815260040160405180910390fd5b6002610c0683611f41565b516005811115610c1857610c18614b72565b14610c365760405163a36c527f60e01b815260040160405180910390fd5b610c408282612009565b505050565b5f610c5564e8d4a5100083614d12565b92915050565b610af2838383612453565b5f610c6f612624565b610c7b8484843461265b565b9050610c9360015f805160206153c083398151915255565b9392505050565b5f805160206153808339815191525f80610cb384612801565b91509150610cc082612418565b610cca5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610cf957610cf9614b72565b03610d1e575f83815260078501602052604081208054919055610d1c8282612a91565b505b610d3481610d2f846040015161158d565b612af7565b5050505050565b5f8181525f805160206153608339815191526020526040808220815160e0810190925280545f8051602061538083398151915293929190829060ff166003811115610d8857610d88614b72565b6003811115610d9957610d99614b72565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610e1090611f41565b905060015f85815260058501602052604090205460ff166003811115610e3857610e38614b72565b14610e565760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610e6b57610e6b614b72565b03610fb457600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610ec557610ec5614b72565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610fc957610fc9614b72565b03610fd757610d3484612b0a565b5f80610fee610fe588612ce7565b60400151612de7565b50915091508184604001511461101757604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b0316108061105f57505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b1561107d57604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206153a08339815191529060ff161561116057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111c79190614ca7565b8360200135146111ea5760405163d040949d60e01b815260040160405180910390fd5b306111fb6060850160408601614d45565b6001600160a01b0316146112225760405163e6c4247b60e01b815260040160405180910390fd5b5f6112306060850185614d60565b905090505f805b828163ffffffff1610156114dc575f6112536060880188614d60565b8363ffffffff1681811061126957611269614da5565b905060200281019061127b9190614db9565b61128490614e69565b80515f81815260088801602052604090205491925090156112b857604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f0135856040516020016112e792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261130191614f00565b602060405180830381855afa15801561131c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061133f9190614ca7565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156113cb576113cb614b72565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161147e911686614f11565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114d590614f24565b9050611237565b50600483018190555f6114fa6114f186612ce7565b60400151613025565b90505f6115068761319a565b9050816002826040516115199190614f00565b602060405180830381855afa158015611534573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906115579190614ca7565b1461157557604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610c556001600160401b03831664e8d4a51000614f46565b5f6115b082611f41565b6080015192915050565b6115c5838383612453565b610c405760405163d802b9f360e01b815260040160405180910390fd5b5f8051602061538083398151915260046115fb83611f41565b51600581111561160d5761160d614b72565b1461162b5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146116635760405163e6c4247b60e01b815260040160405180910390fd5b5f82815260078201602090815260408083208054908490556004850190925290912054610c40906001600160a01b031682612a91565b6116a1612624565b5f8181525f805160206153608339815191526020526040808220815160e0810190925280545f8051602061538083398151915293929190829060ff1660038111156116ee576116ee614b72565b60038111156116ff576116ff614b72565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f80611771610fe587612ce7565b50915091508183604001511461179a57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b031611156117d157604051633ab3447f60e11b815260040160405180910390fd5b6003835160038111156117e6576117e6614b72565b146118045760405163f95c7fe160e01b815260040160405180910390fd5b61180d85612b0a565b5050505061182760015f805160206153c083398151915255565b5050565b611833612624565b5f8181525f805160206153608339815191526020526040808220815160e0810190925280545f8051602061538083398151915293929190829060ff16600381111561188057611880614b72565b600381111561189157611891614b72565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61190782611f41565b90505f8351600381111561191d5761191d614b72565b0361193b57604051631d0b665760e21b815260040160405180910390fd5b60048151600581111561195057611950614b72565b1461196e5760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561198357611983614b72565b0361199a5761199185612b0a565b50505050611a89565b6002835160038111156119af576119af614b72565b03611a7b57600384015460608401516001600160a01b039091169063778c06b5906119d99061158d565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b168152611a2b96959493926001600160401b0390921691908190600401614c69565b602060405180830381865afa158015611a46573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a6a9190614ca7565b5f8681526006860160205260409020555b611a8485612b0a565b505050505b611a9f60015f805160206153c083398151915255565b50565b5f805160206153a08339815191525f80611ac7611abe85612ce7565b60400151613633565b9150915080611ae957604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068401602052604090208054611b0390614f5d565b90505f03611b2457604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff166005811115611b4a57611b4a614b72565b14611b685760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006840160205260408120611b809161491a565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206153608339815191526020526040808220815160e0810190925280545f8051602061538083398151915293929190829060ff166003811115611c5c57611c5c614b72565b6003811115611c6d57611c6d614b72565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611ce657611ce6614b72565b14158015611d075750600381516003811115611d0457611d04614b72565b14155b15611d255760405163f95c7fe160e01b815260040160405180910390fd5b5f611d338260400151611f41565b905080606001516001600160401b03165f03611d6257604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611d8f8460400151846060015185608001516123b8565b6040518263ffffffff1660e01b8152600401611dab9190614ce0565b6020604051808303815f875af1158015611dc7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d349190614ca7565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206153a08339815191529190611e3290614f5d565b90505f03611e5357604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611e7957611e79614b72565b14611e975760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ed09190600401614f8f565b6020604051808303815f875af1158015611eec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c409190614ca7565b5f611f19612624565b611f248233346137d7565b9050611f3c60015f805160206153c083398151915255565b919050565b611f49614951565b5f8281525f805160206153e0833981519152602052604090819020815160e0810190925280545f805160206153a0833981519152929190829060ff166005811115611f9657611f96614b72565b6005811115611fa757611fa7614b72565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612054573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261207b9190810190615024565b915091508061209d57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121049190614ca7565b8251146121245760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156121505760405163e6c4247b60e01b815260040160405180910390fd5b5f8061215f8460400151613a9b565b9150915081871461218357604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0860205260409020545f80516020615380833981519152906001600160401b03908116908316111561223a575f888152600882016020908152604091829020805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612256565b5f8881526008820160205260409020546001600160401b031691505b509695505050505050565b5f8281525f805160206153e0833981519152602052604081206002015481905f805160206153a083398151915290600160801b90046001600160401b03166122a98582613c76565b5f6122b387613e3f565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123038a858b6123b8565b6040518263ffffffff1660e01b815260040161231f9190614ce0565b6020604051808303815f875af115801561233b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061235f9190614ca7565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b61240f613eb4565b611a9f81613eff565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206153808339815191528161246c86613f6d565b905061247786612418565b61248657600192505050610c93565b5f8681526004830160205260409020546001600160a01b031633146124be5760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a08201516124ed91600160b01b90046001600160401b0316906150f6565b6001600160401b03168160c001516001600160401b03161015612523576040516302336bad60e51b815260040160405180910390fd5b5f851561253b576125348786612009565b9050612556565b505f8681526008830160205260409020546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061257b9061158d565b60a086015160c08701516040516001600160e01b031960e086901b1681526125af939291829189905f908190600401614c69565b602060405180830381865afa1580156125ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125ee9190614ca7565b905080846007015f8a81526020019081526020015f205f8282546126129190614f11565b90915550501515979650505050505050565b5f805160206153c083398151915280546001190161265557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061538083398151915290600160401b900461ffff90811690861610806126af575061271061ffff8616115b156126cd5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156126ff576040516302336bad60e51b815260040160405180910390fd5b80548310806127115750806001015483115b1561272f57604051630103be3b60e21b815260040160405180910390fd5b825f61273a82610c45565b90505f61274789836141aa565b9050604051806060016040528061275b3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f805160206153c083398151915255565b5f61280a614951565b5f805160206153a08339815191525f80612826611abe87612ce7565b91509150801561284957604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561287a5761287a614b72565b600581111561288b5761288b614b72565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156128fa576128fa614b72565b1415801561291b575060018151600581111561291857612918614b72565b14155b156129395760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561294e5761294e614b72565b0361295c5760048152612961565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff191660018360058111156129a6576129a6614b72565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a5a57612a5a614b72565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612add575f80fd5b505af1158015612aef573d5f803e3d5ffd5b505050505050565b6118276001600160a01b03831682614594565b5f8181525f805160206153608339815191526020526040808220815160e0810190925280545f8051602061538083398151915293929190829060ff166003811115612b5757612b57614b72565b6003811115612b6857612b68614b72565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612c3d90600160a01b900461ffff1684614f46565b612c479190614d12565b905080856007015f8581526020019081526020015f205f828254612c6b9190614f11565b909155505f9050612c7c8284615116565b9050612c8c856020015182612a91565b612ca18560200151610d2f876060015161158d565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612d4b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612d729190810190615024565b9150915080612d9457604051636b2f19e960e01b815260040160405180910390fd5b815115612db45760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612de05760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612e0c57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612e5b57612e23816001615116565b612e2e906008614f46565b61ffff16868281518110612e4457612e44614da5565b016020015160f81c901b9190911790600101612e0f565b5061ffff811615612e7f5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612eda57612e96816003615116565b612ea1906008614f46565b63ffffffff1687612eb3836002614f11565b81518110612ec357612ec3614da5565b016020015160f81c901b9190911790600101612e82565b5063ffffffff8116600414612f0257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f5757612f1981601f615116565b612f24906008614f46565b88612f30836006614f11565b81518110612f4057612f40614da5565b016020015160f81c901b9190911790600101612f05565b505f805b6008811015612fb657612f6f816007615116565b612f7a906008614f46565b6001600160401b031689612f8f836026614f11565b81518110612f9f57612f9f614da5565b016020015160f81c901b9190911790600101612f5b565b505f805b600881101561301557612fce816007615116565b612fd9906008614f46565b6001600160401b03168a612fee83602e614f11565b81518110612ffe57612ffe614da5565b016020015160f81c901b9190911790600101612fba565b5091989097509095509350505050565b5f815160261461304857604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156130975761305f816001615116565b61306a906008614f46565b61ffff1684828151811061308057613080614da5565b016020015160f81c901b919091179060010161304b565b5061ffff8116156130bb5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613116576130d2816003615116565b6130dd906008614f46565b63ffffffff16856130ef836002614f11565b815181106130ff576130ff614da5565b016020015160f81c901b91909117906001016130be565b5063ffffffff81161561313c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131915761315381601f615116565b61315e906008614f46565b8661316a836006614f11565b8151811061317a5761317a614da5565b016020015160f81c901b919091179060010161313f565b50949350505050565b60605f6131a983830184614d60565b6131b591506058614f46565b6131c090605c614f11565b6001600160401b038111156131d7576131d7614dd7565b6040519080825280601f01601f191660200182016040528015613201576020820181803683370190505b5090505f5b6020811015613256578335816020811061322257613222614da5565b1a60f81b82828151811061323857613238614da5565b60200101906001600160f81b03191690815f1a905350600101613206565b505f5b60208110156132b6578360200135816020811061327857613278614da5565b1a60f81b82613288836020614f11565b8151811061329857613298614da5565b60200101906001600160f81b03191690815f1a905350600101613259565b505f5b6004811015613319576132cd816003615116565b6132d8906008614f46565b6014901c60f81b826132eb836040614f11565b815181106132fb576132fb614da5565b60200101906001600160f81b03191690815f1a9053506001016132b9565b505f61332b6060850160408601614d45565b60601b90505f5b601481101561338b5781816014811061334d5761334d614da5565b1a60f81b8361335d836044614f11565b8151811061336d5761336d614da5565b60200101906001600160f81b03191690815f1a905350600101613332565b505f61339a6060860186614d60565b905090505f5b6004811015613405576133b4816003615116565b6133bf906008614f46565b63ffffffff8316901c60f81b846133d7836058614f11565b815181106133e7576133e7614da5565b60200101906001600160f81b03191690815f1a9053506001016133a0565b505f5b6134156060870187614d60565b9050811015613629575f61342a826058614f46565b61343590605c614f11565b90505f5b60208110156134c05761344f6060890189614d60565b8481811061345f5761345f614da5565b90506020028101906134719190614db9565b35816020811061348357613483614da5565b1a60f81b866134928385614f11565b815181106134a2576134a2614da5565b60200101906001600160f81b03191690815f1a905350600101613439565b505f5b6008811015613575576134d7816007615116565b6134e2906008614f46565b6134ef60608a018a614d60565b858181106134ff576134ff614da5565b90506020028101906135119190614db9565b613522906040810190602001614b59565b6001600160401b0316901c60f81b868261353d856020614f11565b6135479190614f11565b8151811061355757613557614da5565b60200101906001600160f81b03191690815f1a9053506001016134c3565b505f5b603081101561361f5761358e6060890189614d60565b8481811061359e5761359e614da5565b90506020028101906135b09190614db9565b6135be906040810190615129565b828181106135ce576135ce614da5565b9050013560f81c60f81b86828460286135e79190614f11565b6135f19190614f11565b8151811061360157613601614da5565b60200101906001600160f81b03191690815f1a905350600101613578565b5050600101613408565b5091949350505050565b5f80825160271461365757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136a65761366e816001615116565b613679906008614f46565b61ffff1685828151811061368f5761368f614da5565b016020015160f81c901b919091179060010161365a565b5061ffff8116156136ca5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613725576136e1816003615116565b6136ec906008614f46565b63ffffffff16866136fe836002614f11565b8151811061370e5761370e614da5565b016020015160f81c901b91909117906001016136cd565b5063ffffffff811660031461374d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137a25761376481601f615116565b61376f906008614f46565b8761377b836006614f11565b8151811061378b5761378b614da5565b016020015160f81c901b9190911790600101613750565b505f866026815181106137b7576137b7614da5565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615380833981519152816137f084610c45565b90505f6137fc87611f41565b905061380787612418565b61382457604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561383957613839614b72565b146138575760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161386891906150f6565b905083600201600a9054906101000a90046001600160401b03168260400151613891919061516b565b6001600160401b0316816001600160401b031611156138c357604051630c192e7760e41b815260040160405180910390fd5b5f806138cf8a84612261565b915091505f8a836040516020016138fd92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561399057613990614b72565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613abf57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613b0e57613ad6816001615116565b613ae1906008614f46565b61ffff16858281518110613af757613af7614da5565b016020015160f81c901b9190911790600101613ac2565b5061ffff811615613b325760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613b8d57613b49816003615116565b613b54906008614f46565b63ffffffff1686613b66836002614f11565b81518110613b7657613b76614da5565b016020015160f81c901b9190911790600101613b35565b5063ffffffff8116600514613bb557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c0a57613bcc81601f615116565b613bd7906008614f46565b87613be3836006614f11565b81518110613bf357613bf3614da5565b016020015160f81c901b9190911790600101613bb8565b505f805b6008811015613c6957613c22816007615116565b613c2d906008614f46565b6001600160401b031688613c42836026614f11565b81518110613c5257613c52614da5565b016020015160f81c901b9190911790600101613c0e565b5090969095509350505050565b5f805160206153a08339815191525f6001600160401b038084169085161115613caa57613ca38385614c49565b9050613cb7565b613cb48484614c49565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613d19575060018401548151613d15916001600160401b031690614f11565b8210155b15613d3f576001600160401b038316606082015281815260408101516020820152613d5e565b8281606001818151613d5191906150f6565b6001600160401b03169052505b6060810151613d6e90606461516b565b602082015160018601546001600160401b039290921691613d999190600160401b900460ff16614f46565b1015613db85760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613dd39190614f11565b9052506040810180516001600160401b0387169190613df3908390615116565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206153e08339815191526020526040812060020180545f805160206153a08339815191529190600890613e8990600160401b90046001600160401b0316615196565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613efd57604051631afcd79f60e31b815260040160405180910390fd5b565b613f07613eb4565b613f108161462b565b613f18614644565b611a9f60608201356080830135613f3560c0850160a08601614b59565b613f4560e0860160c087016151b1565b613f56610100870160e088016151ca565b613f6861012088016101008901614d45565b614654565b613f75614951565b5f8281525f805160206153e08339815191526020526040808220815160e0810190925280545f805160206153a083398151915293929190829060ff166005811115613fc257613fc2614b72565b6005811115613fd357613fd3614b72565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561404557614045614b72565b146140635760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156140a7576140a7614b72565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6141538582612261565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166141ee57604051637fab81e560e01b815260040160405180910390fd5b5f805160206153a08339815191524261420d6040860160208701614b59565b6001600160401b0316111580614247575061422b6202a30042614f11565b61423b6040860160208701614b59565b6001600160401b031610155b156142645760405162d36c8560e81b815260040160405180910390fd5b60306142736040860186615129565b905014158061428157508335155b1561429f5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f908152600882016020526040902054156142cf57604051630eb0d31360e11b815260040160405180910390fd5b6142d9835f613c76565b5f806143726040518060a00160405280855f01548152602001885f01358152602001876001600160401b0316815260200188602001602081019061431d9190614b59565b6001600160401b0316815260200161433860408a018a615129565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614775565b5f82815260068601602052604090209193509150614390828261522e565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906143ce908590600401614ce0565b6020604051808303815f875af11580156143ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061440e9190614ca7565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561448657614486614b72565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614566918e01908e01614b59565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145bb5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614604576040519150601f19603f3d011682016040523d82523d5f602084013e614609565b606091505b5050905080610c4057604051630a12f52160e11b815260040160405180910390fd5b614633613eb4565b61463b614838565b611a9f81614840565b61464c613eb4565b613efd614912565b61465c613eb4565b5f8051602061538083398151915261ffff84161580614680575061271061ffff8516115b1561469e5760405163c98d73a760e01b815260040160405180910390fd5b858711156146bf57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806146d25750600a60ff8416115b156146f0576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461479e57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016147d097969594939291906152e9565b60405160208183030381529060405290506002816040516147f19190614f00565b602060405180830381855afa15801561480c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061482f9190614ca7565b94909350915050565b613efd613eb4565b614848613eb4565b80355f805160206153a0833981519152908155601461486d60608401604085016151ca565b60ff16118061488c575061488760608301604084016151ca565b60ff16155b156148aa5760405163b4fa3fb360e01b815260040160405180910390fd5b6148ba60608301604084016151ca565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556148eb6040830160208401614b59565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6127ee613eb4565b50805461492690614f5d565b5f825580601f10614935575050565b601f0160209004905f5260205f2090810190611a9f919061498d565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156149a1575f815560010161498e565b5090565b8015158114611a9f575f80fd5b803563ffffffff81168114611f3c575f80fd5b5f805f606084860312156149d7575f80fd5b8335925060208401356149e9816149a5565b91506149f7604085016149b2565b90509250925092565b5f60208284031215614a10575f80fd5b5035919050565b5f6101208284031215614a28575f80fd5b50919050565b5f8060408385031215614a3f575f80fd5b82359150614a4f602084016149b2565b90509250929050565b803561ffff81168114611f3c575f80fd5b80356001600160401b0381168114611f3c575f80fd5b5f805f60608486031215614a91575f80fd5b83356001600160401b03811115614aa6575f80fd5b840160608187031215614ab7575f80fd5b9250614ac560208501614a58565b91506149f760408501614a69565b5f60208284031215614ae3575f80fd5b610c93826149b2565b5f8060408385031215614afd575f80fd5b614b06836149b2565b946020939093013593505050565b5f8060408385031215614b25575f80fd5b82356001600160401b03811115614b3a575f80fd5b830160808186031215614b4b575f80fd5b9150614a4f602084016149b2565b5f60208284031215614b69575f80fd5b610c9382614a69565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614ba957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614be460608401826001600160401b03169052565b506080830151614bff60808401826001600160401b03169052565b5060a0830151614c1a60a08401826001600160401b03169052565b5060c0830151612de060c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612de057612de0614c35565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614cb7575f80fd5b5051919050565b5f5b83811015614cd8578181015183820152602001614cc0565b50505f910152565b602081525f8251806020840152614cfe816040850160208701614cbe565b601f01601f19169190910160400192915050565b5f82614d2c57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114611a9f575f80fd5b5f60208284031215614d55575f80fd5b8135610c9381614d31565b5f808335601e19843603018112614d75575f80fd5b8301803591506001600160401b03821115614d8e575f80fd5b6020019150600581901b36038213156123b1575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614dcd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614e0d57614e0d614dd7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614e3b57614e3b614dd7565b604052919050565b5f6001600160401b03821115614e5b57614e5b614dd7565b50601f01601f191660200190565b5f60608236031215614e79575f80fd5b614e81614deb565b823581526020614e92818501614a69565b8183015260408401356001600160401b03811115614eae575f80fd5b840136601f820112614ebe575f80fd5b8035614ed1614ecc82614e43565b614e13565b8181523684838501011115614ee4575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614dcd818460208701614cbe565b80820180821115610c5557610c55614c35565b5f63ffffffff808316818103614f3c57614f3c614c35565b6001019392505050565b8082028115828204841417610c5557610c55614c35565b600181811c90821680614f7157607f821691505b602082108103614a2857634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614fa181614f5d565b806020870152604060018084165f8114614fc25760018114614fde5761500b565b60ff19851660408a0152604084151560051b8a0101955061500b565b895f5260205f205f5b858110156150025781548b8201860152908301908801614fe7565b8a016040019650505b509398975050505050505050565b8051611f3c816149a5565b5f8060408385031215615035575f80fd5b82516001600160401b038082111561504b575f80fd5b908401906060828703121561505e575f80fd5b615066614deb565b8251815260208084015161507981614d31565b8282015260408401518381111561508e575f80fd5b80850194505087601f8501126150a2575f80fd5b835192506150b2614ecc84614e43565b83815288828587010111156150c5575f80fd5b6150d484838301848801614cbe565b806040840152508195506150e9818801615019565b9450505050509250929050565b6001600160401b03818116838216019080821115612de057612de0614c35565b81810381811115610c5557610c55614c35565b5f808335601e1984360301811261513e575f80fd5b8301803591506001600160401b03821115615157575f80fd5b6020019150368190038213156123b1575f80fd5b6001600160401b0381811683821602808216919082811461518e5761518e614c35565b505092915050565b5f6001600160401b03808316818103614f3c57614f3c614c35565b5f602082840312156151c1575f80fd5b610c9382614a58565b5f602082840312156151da575f80fd5b813560ff81168114610c93575f80fd5b601f821115610c4057805f5260205f20601f840160051c8101602085101561520f5750805b601f840160051c820191505b81811015610d34575f815560010161521b565b81516001600160401b0381111561524757615247614dd7565b61525b816152558454614f5d565b846151ea565b602080601f83116001811461528e575f84156152775750858301515b5f19600386901b1c1916600185901b178555612aef565b5f85815260208120601f198616915b828110156152bc5788860151825594840194600190910190840161529d565b50858210156152d957878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161533e81604e860160208901614cbe565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161559138038061559183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154448061014d5f395ff3fe6080604052600436106101d0575f3560e01c806366435abf116100fd578063b771b3bc11610092578063c974d1b611610062578063c974d1b61461053f578063d5f20ff614610553578063df93d8de1461057f578063e7d14c1c14610595575f80fd5b8063b771b3bc146104d4578063ba3a4b97146104ee578063bee0a03f1461050d578063c599e24f1461052c575f80fd5b806393e24598116100cd57806393e245981461045857806398f3e2b4146104775780639dde029a14610496578063a3a65e48146104b5575f80fd5b806366435abf146103f3578063732214f81461041257806376f78621146104255780638280a25a14610444575f80fd5b806335455ded116101735780635297fae6116101435780635297fae61461036d57806360305d621461038c57806361e2f490146103b557806362065856146103d4575f80fd5b806335455ded146102e65780633a1cfff61461030e57806340034a931461032d578063467ef06f1461034e575f80fd5b806320e55565116101ae57806320e555651461023f57806325e1c7761461025e5780632e2194d81461027d578063329c3e12146102b4575f80fd5b80630118acc4146101d45780630322ed98146101f5578063151d30d114610214575b5f80fd5b3480156101df575f80fd5b506101f36101ee3660046149fd565b6105df565b005b348015610200575f80fd5b506101f361020f366004614a38565b610989565b34801561021f575f80fd5b50610228600a81565b60405160ff90911681526020015b60405180910390f35b34801561024a575f80fd5b506101f3610259366004614a4f565b610afb565b348015610269575f80fd5b506101f3610278366004614a66565b610bd8565b348015610288575f80fd5b5061029c610297366004614a38565b610c48565b6040516001600160401b039091168152602001610236565b3480156102bf575f80fd5b506102ce6001600160991b0181565b6040516001600160a01b039091168152602001610236565b3480156102f1575f80fd5b506102fb61271081565b60405161ffff9091168152602001610236565b348015610319575f80fd5b506101f36103283660046149fd565b610c5e565b61034061033b366004614ab7565b610c69565b604051908152602001610236565b348015610359575f80fd5b506101f3610368366004614b0b565b610c9d565b348015610378575f80fd5b506101f3610387366004614b24565b610d3e565b348015610397575f80fd5b506103a0601481565b60405163ffffffff9091168152602001610236565b3480156103c0575f80fd5b506101f36103cf366004614b4c565b611111565b3480156103df575f80fd5b506103406103ee366004614b91565b611590565b3480156103fe575f80fd5b5061029c61040d366004614a38565b6115a9565b34801561041d575f80fd5b506103405f81565b348015610430575f80fd5b506101f361043f3660046149fd565b6115bd565b34801561044f575f80fd5b50610228603081565b348015610463575f80fd5b506101f3610472366004614a38565b6115e5565b348015610482575f80fd5b506101f3610491366004614b24565b61169c565b3480156104a1575f80fd5b506101f36104b0366004614a38565b61182e565b3480156104c0575f80fd5b506101f36104cf366004614b0b565b611aa6565b3480156104df575f80fd5b506102ce6005600160991b0181565b3480156104f9575f80fd5b506101f3610508366004614a38565b611c13565b348015610518575f80fd5b506101f3610527366004614a38565b611def565b61034061053a366004614a38565b611f14565b34801561054a575f80fd5b50610228601481565b34801561055e575f80fd5b5061057261056d366004614a38565b611f45565b6040516102369190614bbe565b34801561058a575f80fd5b5061029c6202a30081565b3480156105a0575f80fd5b506103406105af366004614a38565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206153988339815191526020526040808220815160e0810190925280545f805160206153b883398151915293929190829060ff16600381111561062c5761062c614baa565b600381111561063d5761063d614baa565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6106b382611f45565b90506002835160038111156106ca576106ca614baa565b146106e85760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146107155760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f8060028351600581111561073357610733614baa565b0361078457871561074b57610748848861200d565b91505b5f856060015184608001516107609190614c81565b905061076c858261226e565b506001600160401b031660c0870152504290506107b9565b50505f82815260048501602052604090206001015460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b5906107de90611590565b8560a00151886080015185875f806040518863ffffffff1660e01b815260040161080e9796959493929190614ca1565b602060405180830381865afa158015610829573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084d9190614cdf565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561088c5761088c614baa565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906109769085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206154188339815191526020526040808220815160e0810190925280545f805160206153d883398151915293929190829060ff1660058111156109d6576109d6614baa565b60058111156109e7576109e7614baa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a5657610a56614baa565b14610a745760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a998584606001515f6123c5565b6040518263ffffffff1660e01b8152600401610ab59190614d18565b6020604051808303815f875af1158015610ad1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af59190614cdf565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b44575080546001600160401b03808416911610155b15610b625760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b8c83612414565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610be182612425565b610bfe57604051636ca57bcf60e01b815260040160405180910390fd5b6002610c0983611f45565b516005811115610c1b57610c1b614baa565b14610c395760405163a36c527f60e01b815260040160405180910390fd5b610c43828261200d565b505050565b5f610c5864e8d4a5100083614d4a565b92915050565b610af5838383612460565b5f610c72612634565b610c7e8484843461266b565b9050610c9660015f805160206153f883398151915255565b9392505050565b5f805160206153b88339815191525f80610cb684612839565b91509150610cc382612425565b610ccd5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610cfc57610cfc614baa565b03610d21575f83815260078501602052604081208054919055610d1f8282612ac9565b505b610d3781610d328460400151611590565b612b2f565b5050505050565b5f8181525f805160206153988339815191526020526040808220815160e0810190925280545f805160206153b883398151915293929190829060ff166003811115610d8b57610d8b614baa565b6003811115610d9c57610d9c614baa565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610e1390611f45565b905060015f85815260058501602052604090205460ff166003811115610e3b57610e3b614baa565b14610e595760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610e6e57610e6e614baa565b03610fb757600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610ec857610ec8614baa565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610fcc57610fcc614baa565b03610fda57610d3784612b42565b5f80610ff1610fe888612d1f565b60400151612e1f565b50915091508184604001511461101a57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b0316108061106257505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b1561108057604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206153d88339815191529060ff161561116357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ca9190614cdf565b8360200135146111ed5760405163d040949d60e01b815260040160405180910390fd5b306111fe6060850160408601614d7d565b6001600160a01b0316146112255760405163e6c4247b60e01b815260040160405180910390fd5b5f6112336060850185614d98565b905090505f805b828163ffffffff1610156114df575f6112566060880188614d98565b8363ffffffff1681811061126c5761126c614ddd565b905060200281019061127e9190614df1565b61128790614ea1565b80515f81815260088801602052604090205491925090156112bb57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f0135856040516020016112ea92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261130491614f38565b602060405180830381855afa15801561131f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113429190614cdf565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156113ce576113ce614baa565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611481911686614f49565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114d890614f5c565b905061123a565b50600483018190555f6114fd6114f486612d1f565b6040015161305d565b90505f611509876131d2565b90508160028260405161151c9190614f38565b602060405180830381855afa158015611537573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061155a9190614cdf565b1461157857604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610c586001600160401b03831664e8d4a51000614f7e565b5f6115b382611f45565b6080015192915050565b6115c8838383612460565b610c435760405163d802b9f360e01b815260040160405180910390fd5b5f805160206153b883398151915260046115fe83611f45565b51600581111561161057611610614baa565b1461162e5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146116665760405163e6c4247b60e01b815260040160405180910390fd5b5f82815260078201602090815260408083208054908490556004850190925290912054610c43906001600160a01b031682612ac9565b6116a4612634565b5f8181525f805160206153988339815191526020526040808220815160e0810190925280545f805160206153b883398151915293929190829060ff1660038111156116f1576116f1614baa565b600381111561170257611702614baa565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f80611774610fe887612d1f565b50915091508183604001511461179d57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b031611156117d457604051633ab3447f60e11b815260040160405180910390fd5b6003835160038111156117e9576117e9614baa565b146118075760405163f95c7fe160e01b815260040160405180910390fd5b61181085612b42565b5050505061182a60015f805160206153f883398151915255565b5050565b611836612634565b5f8181525f805160206153988339815191526020526040808220815160e0810190925280545f805160206153b883398151915293929190829060ff16600381111561188357611883614baa565b600381111561189457611894614baa565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61190a82611f45565b90505f8351600381111561192057611920614baa565b0361193e57604051631d0b665760e21b815260040160405180910390fd5b60048151600581111561195357611953614baa565b146119715760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561198657611986614baa565b0361199d5761199485612b42565b50505050611a8d565b6002835160038111156119b2576119b2614baa565b03611a7f57600384015460608401516001600160a01b039091169063778c06b5906119dc90611590565b60a0840151608087015160c08601515f8881526004808c0160205260408083206001015490516001600160e01b031960e08a901b168152611a2f97969594936001600160401b0390921692829101614ca1565b602060405180830381865afa158015611a4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a6e9190614cdf565b5f8681526006860160205260409020555b611a8885612b42565b505050505b611aa360015f805160206153f883398151915255565b50565b5f805160206153d88339815191525f80611acb611ac285612d1f565b6040015161366b565b9150915080611aed57604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068401602052604090208054611b0790614f95565b90505f03611b2857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff166005811115611b4e57611b4e614baa565b14611b6c5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006840160205260408120611b8491614952565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206153988339815191526020526040808220815160e0810190925280545f805160206153b883398151915293929190829060ff166003811115611c6057611c60614baa565b6003811115611c7157611c71614baa565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611cea57611cea614baa565b14158015611d0b5750600381516003811115611d0857611d08614baa565b14155b15611d295760405163f95c7fe160e01b815260040160405180910390fd5b5f611d378260400151611f45565b905080606001516001600160401b03165f03611d6657604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611d938460400151846060015185608001516123c5565b6040518263ffffffff1660e01b8152600401611daf9190614d18565b6020604051808303815f875af1158015611dcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d379190614cdf565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206153d88339815191529190611e3690614f95565b90505f03611e5757604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611e7d57611e7d614baa565b14611e9b5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ed49190600401614fc7565b6020604051808303815f875af1158015611ef0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c439190614cdf565b5f611f1d612634565b611f2882333461380f565b9050611f4060015f805160206153f883398151915255565b919050565b611f4d614989565b5f8281525f80516020615418833981519152602052604090819020815160e0810190925280545f805160206153d8833981519152929190829060ff166005811115611f9a57611f9a614baa565b6005811115611fab57611fab614baa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612058573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261207f919081019061505c565b91509150806120a157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121089190614cdf565b8251146121285760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156121545760405163e6c4247b60e01b815260040160405180910390fd5b5f806121638460400151613ad3565b9150915081871461218757604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f805160206153b8833981519152906001600160401b039081169083161115612244575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612263565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f8281525f80516020615418833981519152602052604081206002015481905f805160206153d883398151915290600160801b90046001600160401b03166122b68582613cae565b5f6122c087613e77565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123108a858b6123c5565b6040518263ffffffff1660e01b815260040161232c9190614d18565b6020604051808303815f875af1158015612348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061236c9190614cdf565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b61241c613eec565b611aa381613f37565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206153b88339815191528161247986613fa5565b905061248486612425565b61249357600192505050610c96565b5f8681526004830160205260409020546001600160a01b031633146124cb5760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a08201516124fa91600160b01b90046001600160401b03169061512e565b6001600160401b03168160c001516001600160401b03161015612530576040516302336bad60e51b815260040160405180910390fd5b5f851561254857612541878661200d565b9050612566565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061258b90611590565b60a086015160c08701516040516001600160e01b031960e086901b1681526125bf939291829189905f908190600401614ca1565b602060405180830381865afa1580156125da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125fe9190614cdf565b905080846007015f8a81526020019081526020015f205f8282546126229190614f49565b90915550501515979650505050505050565b5f805160206153f883398151915280546001190161266557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153b883398151915290600160401b900461ffff90811690861610806126bf575061271061ffff8616115b156126dd5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561270f576040516302336bad60e51b815260040160405180910390fd5b80548310806127215750806001015483115b1561273f57604051630103be3b60e21b815260040160405180910390fd5b825f61274a82610c48565b90505f61275789836141e2565b9050604051806080016040528061276b3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b60015f805160206153f883398151915255565b5f612842614989565b5f805160206153d88339815191525f8061285e611ac287612d1f565b91509150801561288157604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128b2576128b2614baa565b60058111156128c3576128c3614baa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561293257612932614baa565b14158015612953575060018151600581111561295057612950614baa565b14155b156129715760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561298657612986614baa565b036129945760048152612999565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff191660018360058111156129de576129de614baa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a9257612a92614baa565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612b15575f80fd5b505af1158015612b27573d5f803e3d5ffd5b505050505050565b61182a6001600160a01b038316826145cc565b5f8181525f805160206153988339815191526020526040808220815160e0810190925280545f805160206153b883398151915293929190829060ff166003811115612b8f57612b8f614baa565b6003811115612ba057612ba0614baa565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612c7590600160a01b900461ffff1684614f7e565b612c7f9190614d4a565b905080856007015f8581526020019081526020015f205f828254612ca39190614f49565b909155505f9050612cb4828461514e565b9050612cc4856020015182612ac9565b612cd98560200151610d328760600151611590565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612d83573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612daa919081019061505c565b9150915080612dcc57604051636b2f19e960e01b815260040160405180910390fd5b815115612dec5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612e185760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612e4457604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612e9357612e5b81600161514e565b612e66906008614f7e565b61ffff16868281518110612e7c57612e7c614ddd565b016020015160f81c901b9190911790600101612e47565b5061ffff811615612eb75760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612f1257612ece81600361514e565b612ed9906008614f7e565b63ffffffff1687612eeb836002614f49565b81518110612efb57612efb614ddd565b016020015160f81c901b9190911790600101612eba565b5063ffffffff8116600414612f3a57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f8f57612f5181601f61514e565b612f5c906008614f7e565b88612f68836006614f49565b81518110612f7857612f78614ddd565b016020015160f81c901b9190911790600101612f3d565b505f805b6008811015612fee57612fa781600761514e565b612fb2906008614f7e565b6001600160401b031689612fc7836026614f49565b81518110612fd757612fd7614ddd565b016020015160f81c901b9190911790600101612f93565b505f805b600881101561304d5761300681600761514e565b613011906008614f7e565b6001600160401b03168a61302683602e614f49565b8151811061303657613036614ddd565b016020015160f81c901b9190911790600101612ff2565b5091989097509095509350505050565b5f815160261461308057604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156130cf5761309781600161514e565b6130a2906008614f7e565b61ffff168482815181106130b8576130b8614ddd565b016020015160f81c901b9190911790600101613083565b5061ffff8116156130f35760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561314e5761310a81600361514e565b613115906008614f7e565b63ffffffff1685613127836002614f49565b8151811061313757613137614ddd565b016020015160f81c901b91909117906001016130f6565b5063ffffffff81161561317457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131c95761318b81601f61514e565b613196906008614f7e565b866131a2836006614f49565b815181106131b2576131b2614ddd565b016020015160f81c901b9190911790600101613177565b50949350505050565b60605f6131e183830184614d98565b6131ed91506058614f7e565b6131f890605c614f49565b6001600160401b0381111561320f5761320f614e0f565b6040519080825280601f01601f191660200182016040528015613239576020820181803683370190505b5090505f5b602081101561328e578335816020811061325a5761325a614ddd565b1a60f81b82828151811061327057613270614ddd565b60200101906001600160f81b03191690815f1a90535060010161323e565b505f5b60208110156132ee57836020013581602081106132b0576132b0614ddd565b1a60f81b826132c0836020614f49565b815181106132d0576132d0614ddd565b60200101906001600160f81b03191690815f1a905350600101613291565b505f5b60048110156133515761330581600361514e565b613310906008614f7e565b6014901c60f81b82613323836040614f49565b8151811061333357613333614ddd565b60200101906001600160f81b03191690815f1a9053506001016132f1565b505f6133636060850160408601614d7d565b60601b90505f5b60148110156133c35781816014811061338557613385614ddd565b1a60f81b83613395836044614f49565b815181106133a5576133a5614ddd565b60200101906001600160f81b03191690815f1a90535060010161336a565b505f6133d26060860186614d98565b905090505f5b600481101561343d576133ec81600361514e565b6133f7906008614f7e565b63ffffffff8316901c60f81b8461340f836058614f49565b8151811061341f5761341f614ddd565b60200101906001600160f81b03191690815f1a9053506001016133d8565b505f5b61344d6060870187614d98565b9050811015613661575f613462826058614f7e565b61346d90605c614f49565b90505f5b60208110156134f8576134876060890189614d98565b8481811061349757613497614ddd565b90506020028101906134a99190614df1565b3581602081106134bb576134bb614ddd565b1a60f81b866134ca8385614f49565b815181106134da576134da614ddd565b60200101906001600160f81b03191690815f1a905350600101613471565b505f5b60088110156135ad5761350f81600761514e565b61351a906008614f7e565b61352760608a018a614d98565b8581811061353757613537614ddd565b90506020028101906135499190614df1565b61355a906040810190602001614b91565b6001600160401b0316901c60f81b8682613575856020614f49565b61357f9190614f49565b8151811061358f5761358f614ddd565b60200101906001600160f81b03191690815f1a9053506001016134fb565b505f5b6030811015613657576135c66060890189614d98565b848181106135d6576135d6614ddd565b90506020028101906135e89190614df1565b6135f6906040810190615161565b8281811061360657613606614ddd565b9050013560f81c60f81b868284602861361f9190614f49565b6136299190614f49565b8151811061363957613639614ddd565b60200101906001600160f81b03191690815f1a9053506001016135b0565b5050600101613440565b5091949350505050565b5f80825160271461368f57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136de576136a681600161514e565b6136b1906008614f7e565b61ffff168582815181106136c7576136c7614ddd565b016020015160f81c901b9190911790600101613692565b5061ffff8116156137025760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561375d5761371981600361514e565b613724906008614f7e565b63ffffffff1686613736836002614f49565b8151811061374657613746614ddd565b016020015160f81c901b9190911790600101613705565b5063ffffffff811660031461378557604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137da5761379c81601f61514e565b6137a7906008614f7e565b876137b3836006614f49565b815181106137c3576137c3614ddd565b016020015160f81c901b9190911790600101613788565b505f866026815181106137ef576137ef614ddd565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206153b88339815191528161382884610c48565b90505f61383487611f45565b905061383f87612425565b61385c57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561387157613871614baa565b1461388f5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516138a0919061512e565b905083600201600a9054906101000a90046001600160401b031682604001516138c991906151a3565b6001600160401b0316816001600160401b031611156138fb57604051630c192e7760e41b815260040160405180910390fd5b5f806139078a8461226e565b915091505f8a8360405160200161393592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156139c8576139c8614baa565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613af757604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613b4657613b0e81600161514e565b613b19906008614f7e565b61ffff16858281518110613b2f57613b2f614ddd565b016020015160f81c901b9190911790600101613afa565b5061ffff811615613b6a5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613bc557613b8181600361514e565b613b8c906008614f7e565b63ffffffff1686613b9e836002614f49565b81518110613bae57613bae614ddd565b016020015160f81c901b9190911790600101613b6d565b5063ffffffff8116600514613bed57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c4257613c0481601f61514e565b613c0f906008614f7e565b87613c1b836006614f49565b81518110613c2b57613c2b614ddd565b016020015160f81c901b9190911790600101613bf0565b505f805b6008811015613ca157613c5a81600761514e565b613c65906008614f7e565b6001600160401b031688613c7a836026614f49565b81518110613c8a57613c8a614ddd565b016020015160f81c901b9190911790600101613c46565b5090969095509350505050565b5f805160206153d88339815191525f6001600160401b038084169085161115613ce257613cdb8385614c81565b9050613cef565b613cec8484614c81565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613d51575060018401548151613d4d916001600160401b031690614f49565b8210155b15613d77576001600160401b038316606082015281815260408101516020820152613d96565b8281606001818151613d89919061512e565b6001600160401b03169052505b6060810151613da69060646151a3565b602082015160018601546001600160401b039290921691613dd19190600160401b900460ff16614f7e565b1015613df05760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613e0b9190614f49565b9052506040810180516001600160401b0387169190613e2b90839061514e565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206154188339815191526020526040812060020180545f805160206153d88339815191529190600890613ec190600160401b90046001600160401b03166151ce565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f3557604051631afcd79f60e31b815260040160405180910390fd5b565b613f3f613eec565b613f4881614663565b613f5061467c565b611aa360608201356080830135613f6d60c0850160a08601614b91565b613f7d60e0860160c087016151e9565b613f8e610100870160e08801615202565b613fa061012088016101008901614d7d565b61468c565b613fad614989565b5f8281525f805160206154188339815191526020526040808220815160e0810190925280545f805160206153d883398151915293929190829060ff166005811115613ffa57613ffa614baa565b600581111561400b5761400b614baa565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561407d5761407d614baa565b1461409b5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156140df576140df614baa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61418b858261226e565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661422657604051637fab81e560e01b815260040160405180910390fd5b5f805160206153d8833981519152426142456040860160208701614b91565b6001600160401b031611158061427f57506142636202a30042614f49565b6142736040860160208701614b91565b6001600160401b031610155b1561429c5760405162d36c8560e81b815260040160405180910390fd5b60306142ab6040860186615161565b90501415806142b957508335155b156142d75760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561430757604051630eb0d31360e11b815260040160405180910390fd5b614311835f613cae565b5f806143aa6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906143559190614b91565b6001600160401b0316815260200161437060408a018a615161565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506147ad565b5f828152600686016020526040902091935091506143c88282615266565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614406908590600401614d18565b6020604051808303815f875af1158015614422573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144469190614cdf565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156144be576144be614baa565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161459e918e01908e01614b91565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145f35760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461463c576040519150601f19603f3d011682016040523d82523d5f602084013e614641565b606091505b5050905080610c4357604051630a12f52160e11b815260040160405180910390fd5b61466b613eec565b614673614870565b611aa381614878565b614684613eec565b613f3561494a565b614694613eec565b5f805160206153b883398151915261ffff841615806146b8575061271061ffff8516115b156146d65760405163c98d73a760e01b815260040160405180910390fd5b858711156146f757604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061470a5750600a60ff8416115b15614728576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146147d657604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016148089796959493929190615321565b60405160208183030381529060405290506002816040516148299190614f38565b602060405180830381855afa158015614844573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906148679190614cdf565b94909350915050565b613f35613eec565b614880613eec565b80355f805160206153d883398151915290815560146148a56060840160408501615202565b60ff1611806148c457506148bf6060830160408401615202565b60ff16155b156148e25760405163b4fa3fb360e01b815260040160405180910390fd5b6148f26060830160408401615202565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556149236040830160208401614b91565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612826613eec565b50805461495e90614f95565b5f825580601f1061496d575050565b601f0160209004905f5260205f2090810190611aa391906149c5565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156149d9575f81556001016149c6565b5090565b8015158114611aa3575f80fd5b803563ffffffff81168114611f40575f80fd5b5f805f60608486031215614a0f575f80fd5b833592506020840135614a21816149dd565b9150614a2f604085016149ea565b90509250925092565b5f60208284031215614a48575f80fd5b5035919050565b5f6101208284031215614a60575f80fd5b50919050565b5f8060408385031215614a77575f80fd5b82359150614a87602084016149ea565b90509250929050565b803561ffff81168114611f40575f80fd5b80356001600160401b0381168114611f40575f80fd5b5f805f60608486031215614ac9575f80fd5b83356001600160401b03811115614ade575f80fd5b840160608187031215614aef575f80fd5b9250614afd60208501614a90565b9150614a2f60408501614aa1565b5f60208284031215614b1b575f80fd5b610c96826149ea565b5f8060408385031215614b35575f80fd5b614b3e836149ea565b946020939093013593505050565b5f8060408385031215614b5d575f80fd5b82356001600160401b03811115614b72575f80fd5b830160808186031215614b83575f80fd5b9150614a87602084016149ea565b5f60208284031215614ba1575f80fd5b610c9682614aa1565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614be157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614c1c60608401826001600160401b03169052565b506080830151614c3760808401826001600160401b03169052565b5060a0830151614c5260a08401826001600160401b03169052565b5060c0830151612e1860c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612e1857612e18614c6d565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614cef575f80fd5b5051919050565b5f5b83811015614d10578181015183820152602001614cf8565b50505f910152565b602081525f8251806020840152614d36816040850160208701614cf6565b601f01601f19169190910160400192915050565b5f82614d6457634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114611aa3575f80fd5b5f60208284031215614d8d575f80fd5b8135610c9681614d69565b5f808335601e19843603018112614dad575f80fd5b8301803591506001600160401b03821115614dc6575f80fd5b6020019150600581901b36038213156123be575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614e05575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614e4557614e45614e0f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614e7357614e73614e0f565b604052919050565b5f6001600160401b03821115614e9357614e93614e0f565b50601f01601f191660200190565b5f60608236031215614eb1575f80fd5b614eb9614e23565b823581526020614eca818501614aa1565b8183015260408401356001600160401b03811115614ee6575f80fd5b840136601f820112614ef6575f80fd5b8035614f09614f0482614e7b565b614e4b565b8181523684838501011115614f1c575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614e05818460208701614cf6565b80820180821115610c5857610c58614c6d565b5f63ffffffff808316818103614f7457614f74614c6d565b6001019392505050565b8082028115828204841417610c5857610c58614c6d565b600181811c90821680614fa957607f821691505b602082108103614a6057634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614fd981614f95565b806020870152604060018084165f8114614ffa576001811461501657615043565b60ff19851660408a0152604084151560051b8a01019550615043565b895f5260205f205f5b8581101561503a5781548b820186015290830190880161501f565b8a016040019650505b509398975050505050505050565b8051611f40816149dd565b5f806040838503121561506d575f80fd5b82516001600160401b0380821115615083575f80fd5b9084019060608287031215615096575f80fd5b61509e614e23565b825181526020808401516150b181614d69565b828201526040840151838111156150c6575f80fd5b80850194505087601f8501126150da575f80fd5b835192506150ea614f0484614e7b565b83815288828587010111156150fd575f80fd5b61510c84838301848801614cf6565b80604084015250819550615121818801615051565b9450505050509250929050565b6001600160401b03818116838216019080821115612e1857612e18614c6d565b81810381811115610c5857610c58614c6d565b5f808335601e19843603018112615176575f80fd5b8301803591506001600160401b0382111561518f575f80fd5b6020019150368190038213156123be575f80fd5b6001600160401b038181168382160280821691908281146151c6576151c6614c6d565b505092915050565b5f6001600160401b03808316818103614f7457614f74614c6d565b5f602082840312156151f9575f80fd5b610c9682614a90565b5f60208284031215615212575f80fd5b813560ff81168114610c96575f80fd5b601f821115610c4357805f5260205f20601f840160051c810160208510156152475750805b601f840160051c820191505b81811015610d37575f8155600101615253565b81516001600160401b0381111561527f5761527f614e0f565b6152938161528d8454614f95565b84615222565b602080601f8311600181146152c6575f84156152af5750858301515b5f19600386901b1c1916600185901b178555612b27565b5f85815260208120601f198616915b828110156152f4578886015182559484019460019091019084016152d5565b508582101561531157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161537681604e860160208901614cf6565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 33d95b250..f1a6386f2 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -59,8 +59,6 @@ abstract contract PoSValidatorManager is mapping(bytes32 delegationID => uint256) _redeemableDelegatorRewards; /// @notice Maps the validation ID to its pending staking rewards. mapping(bytes32 validationID => uint256) _redeemableValidatorRewards; - /// @notice Saves the largest known uptime of an active, pending completed, or completed validation period so that delegators can collect rewards. - mapping(bytes32 validationID => uint64) _validationUptimeSeconds; } // solhint-enable private-vars-leading-underscore @@ -221,7 +219,7 @@ abstract contract PoSValidatorManager is if (includeUptimeProof) { uptimeSeconds = _updateUptime(validationID, messageIndex); } else { - uptimeSeconds = $._validationUptimeSeconds[validationID]; + uptimeSeconds = $._posValidatorInfo[validationID].uptimeSeconds; } uint256 reward = $._rewardCalculator.calculateReward({ @@ -283,11 +281,11 @@ abstract contract PoSValidatorManager is } PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - if (uptime > $._validationUptimeSeconds[validationID]) { - $._validationUptimeSeconds[validationID] = uptime; + if (uptime > $._posValidatorInfo[validationID].uptimeSeconds) { + $._posValidatorInfo[validationID].uptimeSeconds = uptime; emit UptimeUpdated(validationID, uptime); } else { - uptime = $._validationUptimeSeconds[validationID]; + uptime = $._posValidatorInfo[validationID].uptimeSeconds; } return uptime; @@ -326,7 +324,8 @@ abstract contract PoSValidatorManager is $._posValidatorInfo[validationID] = PoSValidatorInfo({ owner: _msgSender(), delegationFeeBips: delegationFeeBips, - minStakeDuration: minStakeDuration + minStakeDuration: minStakeDuration, + uptimeSeconds: 0 }); return validationID; } @@ -495,7 +494,7 @@ abstract contract PoSValidatorManager is validatorStartTime: validator.startedAt, stakingStartTime: delegator.startedAt, stakingEndTime: validator.endedAt, - uptimeSeconds: $._validationUptimeSeconds[validationID], + uptimeSeconds: $._posValidatorInfo[validationID].uptimeSeconds, initialSupply: 0, endSupply: 0 }); @@ -544,7 +543,7 @@ abstract contract PoSValidatorManager is // If the validation period has already ended, we have saved the uptime. // Further, it is impossible to retrieve an uptime proof for an already ended validation, // so there's no need to check any uptime proof provided in this function call. - validatorUptimeSeconds = $._validationUptimeSeconds[validationID]; + validatorUptimeSeconds = $._posValidatorInfo[validationID].uptimeSeconds; delegator.endingNonce = validator.messageNonce; delegationEndTime = validator.endedAt; diff --git a/contracts/validator-manager/StateTransition.md b/contracts/validator-manager/StateTransition.md new file mode 100644 index 000000000..b895df85b --- /dev/null +++ b/contracts/validator-manager/StateTransition.md @@ -0,0 +1,18 @@ +```mermaid +stateDiagram-v2 + %% Happy path + [*] --> PendingAdded : V.Active + %% PendingAdded --> Active : V.Active + %% Active --> PendingRemoved : V.Active | started=delActiveTime ended=now + %% PendingRemoved --> Completed : V.Active + + %% Delegator registration, validator complete + PendingAdded --> PendingRemoved : V.PendingRemoved | started=vdrEndTime ended=vdrEndTime + PendingAdded --> Completed : V.Completed + + %% DelegatorEnding, validator complete + Active --> PendingRemoved : V.PendingRemoved | started=delActiveTime ended=vdrEndTime + Active --> Completed : V.Completed + PendingRemoved --> Completed : V.PendingRemoved | started=delActiveTime ended=vdrEndTime + PendingRemoved --> Completed : V.Completed +``` \ No newline at end of file diff --git a/contracts/validator-manager/StateTransitionV2.md b/contracts/validator-manager/StateTransitionV2.md new file mode 100644 index 000000000..b8b0d34af --- /dev/null +++ b/contracts/validator-manager/StateTransitionV2.md @@ -0,0 +1,27 @@ +```mermaid +stateDiagram-v2 + classDef myState font-weight:bold + pr: D.PendingRemoved | started=delActiveTime ended=now + c: D.Completed | started=delActiveTime ended=now + prA: D.PendingRemoved | started=vdrEndTime ended=vdrEndTime + cA: D.Completed | started=vdrEndTime ended=vdrEndTime + prB: D.PendingRemoved | started=delActiveTime ended=vdrEndTime + cB: D.Completed | started=delActiveTime ended=vdrEndTime + + %% Happy path + [*] --> D.PendingAdded : V.Active + D.PendingAdded --> D.Active : V.Active + D.Active --> pr:::myState : V.Active + pr:::myState --> c:::myState : V.Active + + %% Delegator registration, validator complete + D.PendingAdded --> prA:::myState : V.PendingRemoved + prA --> cA:::myState + D.PendingAdded --> cA:::myState : V.Completed + + %% DelegatorEnding, validator complete + D.Active --> prB:::myState : V.PendingRemoved + D.Active --> cB:::myState : V.Completed + prB:::myState --> cB:::myState + prB:::myState --> cB:::myState +``` \ No newline at end of file diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index fda2a1282..97f4ca531 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -40,6 +40,7 @@ struct PoSValidatorInfo { address owner; uint16 delegationFeeBips; uint64 minStakeDuration; + uint64 uptimeSeconds; } interface IPoSValidatorManager is IValidatorManager { diff --git a/contracts/validator-manager/temp.md b/contracts/validator-manager/temp.md new file mode 100644 index 000000000..e69de29bb From 7077a9a6d8f9476b1d328796fa9cc2f15a3ec270 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 24 Sep 2024 15:53:30 -0500 Subject: [PATCH 407/545] separate helpers --- tests/utils/validator_manager.go | 87 ++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 37 deletions(-) diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index e6a66a7cb..cc1447efc 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -887,26 +887,33 @@ func InitializeEndNativeValidation( subnet interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, validationID ids.ID, - force bool, ) *types.Receipt { opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) - var tx *types.Transaction - if force { - tx, err = stakingManager.ForceInitializeEndValidation( - opts, - validationID, - false, - 0, - ) - } else { - tx, err = stakingManager.InitializeEndValidation( - opts, - validationID, - false, - 0, - ) - } + tx, err := stakingManager.InitializeEndValidation( + opts, + validationID, + false, + 0, + ) + Expect(err).Should(BeNil()) + return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) +} + +func ForceInitializeEndNativeValidation( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, + validationID ids.ID, +) *types.Receipt { + opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := stakingManager.ForceInitializeEndValidation( + opts, + validationID, + false, + 0, + ) Expect(err).Should(BeNil()) return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) } @@ -920,22 +927,30 @@ func InitializeEndERC20Validation( ) *types.Receipt { opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) - var tx *types.Transaction - if force { - tx, err = stakingManager.ForceInitializeEndValidation( - opts, - validationID, - false, - 0, - ) - } else { - tx, err = stakingManager.InitializeEndValidation( - opts, - validationID, - false, - 0, - ) - } + tx, err := stakingManager.InitializeEndValidation( + opts, + validationID, + false, + 0, + ) + Expect(err).Should(BeNil()) + return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) +} + +func ForceInitializeEndERC20Validation( + sendingKey *ecdsa.PrivateKey, + subnet interfaces.SubnetTestInfo, + stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, + validationID ids.ID, +) *types.Receipt { + opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := stakingManager.ForceInitializeEndValidation( + opts, + validationID, + false, + 0, + ) Expect(err).Should(BeNil()) return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) } @@ -1203,12 +1218,11 @@ func InitializeAndCompleteEndNativeValidation( nonce uint64, ) { WaitMinStakeDuration(subnetInfo, fundedKey) - receipt := InitializeEndNativeValidation( + receipt := ForceInitializeEndNativeValidation( fundedKey, subnetInfo, stakingManager, validationID, - true, ) validatorRemovalEvent, err := GetEventFromLogs( receipt.Logs, @@ -1266,12 +1280,11 @@ func InitializeAndCompleteEndERC20Validation( nonce uint64, ) { WaitMinStakeDuration(subnetInfo, fundedKey) - receipt := InitializeEndERC20Validation( + receipt := ForceInitializeEndERC20Validation( fundedKey, subnetInfo, stakingManager, validationID, - true, ) validatorRemovalEvent, err := GetEventFromLogs( receipt.Logs, From 2f8e98003720431a63fa9c6a630432b4915589c8 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 24 Sep 2024 15:57:55 -0500 Subject: [PATCH 408/545] lint --- contracts/validator-manager/PoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index f1a6386f2..84627885c 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -174,7 +174,7 @@ abstract contract PoSValidatorManager is bool includeUptimeProof, uint32 messageIndex ) external { - if(!_initializeEndPoSValidation(validationID, includeUptimeProof, messageIndex)) { + if (!_initializeEndPoSValidation(validationID, includeUptimeProof, messageIndex)) { revert ValidatorIneligibleForRewards(); } } From b5ee7f4e2dfb299f02229feae8c402b3b6de93d5 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 24 Sep 2024 19:06:07 -0400 Subject: [PATCH 409/545] Review fixes --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../validator-manager/PoSValidatorManager.sol | 63 ++++++++----------- 3 files changed, 29 insertions(+), 38 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 2f41057c6..b36b161aa 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516152ac3803806152ac83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61515f8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b33660046146de565b61040d565b005b6101b86101c8366004614719565b6107bb565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004614719565b61092d565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b8610241366004614730565b610943565b6101b8610254366004614749565b6109e4565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b8610284366004614771565b610c6a565b61029c6102973660046147d5565b6110ee565b6040519081526020016101e3565b6101ff6102b8366004614719565b611107565b61029c5f81565b6101b86102d23660046146de565b61111b565b6101d5603081565b6101b86102ed366004614719565b61130d565b6101b8610300366004614749565b6113c8565b61029c6103133660046147ee565b61158f565b6101b8610326366004614730565b6115bb565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004614719565b61172d565b6101b8610372366004614719565b611909565b6101d5601481565b61039261038d366004614719565b611a33565b6040516101e39190614822565b6101ff6202a30081565b61029c6103b7366004614719565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f53660046148e2565b611afb565b6101b861040836600461495b565b611b30565b5f8381525f805160206150938339815191526020526040808220815160e0810190925280545f805160206150d383398151915293929190829060ff16600381111561045a5761045a61480e565b600381111561046b5761046b61480e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e182611a33565b90506002835160038111156104f8576104f861480e565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b6003815160058111156105585761055861480e565b036105765760405163a36c527f60e01b815260040160405180910390fd5b5f878152600585810160205260408220805460ff1916600317905582518291600291908111156105a8576105a861480e565b036106215787156105c0576105bd8488611c0f565b91505b5f856060015184608001516105d591906149ad565b90506105e18582611d93565b505f8b8152600589016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905550429050610672565b50505f82815260088501602090815260408083205460608501518b855260058901909352922060020180546001600160c01b0316600160c01b6001600160401b039384160217905560c08301519116905b600386015460608601516001600160a01b039091169063778c06b590610697906110ee565b60a086015160808901516040516001600160e01b031960e086901b16815260048101939093526001600160401b039182166024840152811660448301528085166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561070e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061073291906149cd565b5f8a81526006880160205260409020556004835160058111156107575761075761480e565b036107705761076589611eea565b505050505050505050565b6040516001600160401b038216815284908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699060200160405180910390a3505050505050505050565b5f8181525f805160206151338339815191526020526040808220815160e0810190925280545f805160206150f383398151915293929190829060ff1660058111156108085761080861480e565b60058111156108195761081961480e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108885761088861480e565b146108a65760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6108cb8584606001515f6120c5565b6040518263ffffffff1660e01b81526004016108e79190614a06565b6020604051808303815f875af1158015610903573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092791906149cd565b50505050565b5f61093d64e8d4a5100083614a38565b92915050565b5f805160206150d38339815191525f8061095c8461211c565b91509150610969826123ba565b6109735750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156109a2576109a261480e565b036109c7575f838152600785016020526040812080549190556109c582826123f5565b505b6109dd816109d884604001516110ee565b61246b565b5050505050565b5f8181525f805160206150938339815191526020526040808220815160e0810190925280545f805160206150d383398151915293929190829060ff166003811115610a3157610a3161480e565b6003811115610a4257610a4261480e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ab882611a33565b9050600183516003811115610acf57610acf61480e565b14610aed5760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610b0257610b0261480e565b03610b1857610b1085611eea565b505050505050565b5f600382516005811115610b2e57610b2e61480e565b03610b3e575060c0810151610bdc565b5f610b488861248e565b90505f80610b59836040015161258e565b5091509150818614610b7e57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031685606001516001600160401b03161080610bb75750806001600160401b03168760a001516001600160401b0316115b15610bd557604051633ab3447f60e11b815260040160405180910390fd5b4293505050505b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b038516600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252849188917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f691015b60405180910390a350505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206150f38339815191529060ff1615610cbc57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d2391906149cd565b836020013514610d465760405163d040949d60e01b815260040160405180910390fd5b30610d576060850160408601614a57565b6001600160a01b031614610d7e5760405163e6c4247b60e01b815260040160405180910390fd5b5f610d8c6060850185614a72565b905090505f805b828163ffffffff161015611038575f610daf6060880188614a72565b8363ffffffff16818110610dc557610dc5614ab7565b9050602002810190610dd79190614acb565b610de090614b7b565b80515f8181526008880160205260409020549192509015610e1457604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610e4392919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610e5d91614c12565b602060405180830381855afa158015610e78573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610e9b91906149cd565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610f2757610f2761480e565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610fda911686614c23565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061103190614c36565b9050610d93565b50600483018190555f61104a8561248e565b90505f61105a82604001516127cc565b90505f61106688612941565b9050816002826040516110799190614c12565b602060405180830381855afa158015611094573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110b791906149cd565b146110d557604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61093d6001600160401b03831664e8d4a51000614c58565b5f61111182611a33565b6080015192915050565b5f805160206150d38339815191525f61113385612dda565b905061113e856123ba565b611149575050505050565b5f8581526004830160205260409020546001600160a01b031633146111815760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516111b091600160b01b90046001600160401b031690614c6f565b6001600160401b03168160c001516001600160401b031610156111e6576040516302336bad60e51b815260040160405180910390fd5b83156109dd575f6111f78685611c0f565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b590611247906110ee565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156112bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112e191906149cd565b5f87815260078501602052604081208054909190611300908490614c23565b9091555050505050505050565b5f805160206150d38339815191525f61132583611a33565b905060048151600581111561133c5761133c61480e565b1461135a5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146113925760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610927906001600160a01b0316826123f5565b6113d0613017565b5f8181525f805160206150938339815191526020526040808220815160e0810190925280545f805160206150d383398151915293929190829060ff16600381111561141d5761141d61480e565b600381111561142e5761142e61480e565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156114a7576114a761480e565b146114c55760405163f95c7fe160e01b815260040160405180910390fd5b60046114d48260400151611a33565b5160058111156114e6576114e661480e565b1461156a575f6114f58561248e565b90505f80611506836040015161258e565b50915091508184604001511461152f57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561156657604051633ab3447f60e11b815260040160405180910390fd5b5050505b61157383611eea565b505061158b60015f8051602061511383398151915255565b5050565b5f611598613017565b6115a3833384613061565b905061093d60015f8051602061511383398151915255565b5f805160206150f38339815191525f6115d38361248e565b90505f806115e48360400151613328565b915091508061160657604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461162090614c8f565b90505f0361164157604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156116675761166761480e565b146116855760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061169d9161462e565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206150938339815191526020526040808220815160e0810190925280545f805160206150d383398151915293929190829060ff16600381111561177a5761177a61480e565b600381111561178b5761178b61480e565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156118045761180461480e565b1415801561182557506003815160038111156118225761182261480e565b14155b156118435760405163f95c7fe160e01b815260040160405180910390fd5b5f6118518260400151611a33565b905080606001516001600160401b03165f0361188057604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6118ad8460400151846060015185608001516120c5565b6040518263ffffffff1660e01b81526004016118c99190614a06565b6020604051808303815f875af11580156118e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109dd91906149cd565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206150f3833981519152919061195090614c8f565b90505f0361197157604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff1660058111156119975761199761480e565b146119b55760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119ee9190600401614cc7565b6020604051808303815f875af1158015611a0a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a2e91906149cd565b505050565b611a3b614665565b5f8281525f80516020615133833981519152602052604090819020815160e0810190925280545f805160206150f3833981519152929190829060ff166005811115611a8857611a8861480e565b6005811115611a9957611a9961480e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611b04613017565b611b10858585856134cc565b9050611b2860015f8051602061511383398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611b79575080546001600160401b03808416911610155b15611b975760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611bc2848461366a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c5a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c819190810190614d5c565b9150915080611ca357604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ce6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d0a91906149cd565b825114611d2a5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d565760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d658460400151613684565b91509150818714611d8957604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615133833981519152602052604081206002015481905f805160206150f383398151915290600160801b90046001600160401b0316611ddb858261385f565b5f611de587613a28565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e358a858b6120c5565b6040518263ffffffff1660e01b8152600401611e519190614a06565b6020604051808303815f875af1158015611e6d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e9191906149cd565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f805160206150938339815191526020526040808220815160e0810190925280545f805160206150d383398151915293929190829060ff166003811115611f3757611f3761480e565b6003811115611f4857611f4861480e565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612076575f8481526004870160205260409020546127109061202890600160a01b900461ffff1685614c58565b6120329190614a38565b915081866007015f8681526020019081526020015f205f8282546120569190614c23565b9091555061206690508284614e2e565b90506120768560200151826123f5565b61208b85602001516109d887606001516110ee565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc9939101610c59565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f612125614665565b5f805160206150f38339815191525f61213d8561248e565b90505f8061214e8360400151613328565b91509150801561217157604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156121a2576121a261480e565b60058111156121b3576121b361480e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156122225761222261480e565b1415801561224357506001815160058111156122405761224061480e565b14155b156122615760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156122765761227661480e565b036122845760048152612289565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156122ce576122ce61480e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156123825761238261480e565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206150b383398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612450575f80fd5b505af1158015612462573d5f803e3d5ffd5b50505050505050565b5f805160206150b38339815191525461158b906001600160a01b03168383613a9d565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156124f2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125199190810190614d5c565b915091508061253b57604051636b2f19e960e01b815260040160405180910390fd5b81511561255b5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156125875760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146125b357604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612602576125ca816001614e2e565b6125d5906008614c58565b61ffff168682815181106125eb576125eb614ab7565b016020015160f81c901b91909117906001016125b6565b5061ffff8116156126265760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156126815761263d816003614e2e565b612648906008614c58565b63ffffffff168761265a836002614c23565b8151811061266a5761266a614ab7565b016020015160f81c901b9190911790600101612629565b5063ffffffff81166004146126a957604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156126fe576126c081601f614e2e565b6126cb906008614c58565b886126d7836006614c23565b815181106126e7576126e7614ab7565b016020015160f81c901b91909117906001016126ac565b505f805b600881101561275d57612716816007614e2e565b612721906008614c58565b6001600160401b031689612736836026614c23565b8151811061274657612746614ab7565b016020015160f81c901b9190911790600101612702565b505f805b60088110156127bc57612775816007614e2e565b612780906008614c58565b6001600160401b03168a61279583602e614c23565b815181106127a5576127a5614ab7565b016020015160f81c901b9190911790600101612761565b5091989097509095509350505050565b5f81516026146127ef57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561283e57612806816001614e2e565b612811906008614c58565b61ffff1684828151811061282757612827614ab7565b016020015160f81c901b91909117906001016127f2565b5061ffff8116156128625760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156128bd57612879816003614e2e565b612884906008614c58565b63ffffffff1685612896836002614c23565b815181106128a6576128a6614ab7565b016020015160f81c901b9190911790600101612865565b5063ffffffff8116156128e357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612938576128fa81601f614e2e565b612905906008614c58565b86612911836006614c23565b8151811061292157612921614ab7565b016020015160f81c901b91909117906001016128e6565b50949350505050565b60605f61295083830184614a72565b61295c91506058614c58565b61296790605c614c23565b6001600160401b0381111561297e5761297e614ae9565b6040519080825280601f01601f1916602001820160405280156129a8576020820181803683370190505b5090505f5b60208110156129fd57833581602081106129c9576129c9614ab7565b1a60f81b8282815181106129df576129df614ab7565b60200101906001600160f81b03191690815f1a9053506001016129ad565b505f5b6020811015612a5d5783602001358160208110612a1f57612a1f614ab7565b1a60f81b82612a2f836020614c23565b81518110612a3f57612a3f614ab7565b60200101906001600160f81b03191690815f1a905350600101612a00565b505f5b6004811015612ac057612a74816003614e2e565b612a7f906008614c58565b6014901c60f81b82612a92836040614c23565b81518110612aa257612aa2614ab7565b60200101906001600160f81b03191690815f1a905350600101612a60565b505f612ad26060850160408601614a57565b60601b90505f5b6014811015612b3257818160148110612af457612af4614ab7565b1a60f81b83612b04836044614c23565b81518110612b1457612b14614ab7565b60200101906001600160f81b03191690815f1a905350600101612ad9565b505f612b416060860186614a72565b905090505f5b6004811015612bac57612b5b816003614e2e565b612b66906008614c58565b63ffffffff8316901c60f81b84612b7e836058614c23565b81518110612b8e57612b8e614ab7565b60200101906001600160f81b03191690815f1a905350600101612b47565b505f5b612bbc6060870187614a72565b9050811015612dd0575f612bd1826058614c58565b612bdc90605c614c23565b90505f5b6020811015612c6757612bf66060890189614a72565b84818110612c0657612c06614ab7565b9050602002810190612c189190614acb565b358160208110612c2a57612c2a614ab7565b1a60f81b86612c398385614c23565b81518110612c4957612c49614ab7565b60200101906001600160f81b03191690815f1a905350600101612be0565b505f5b6008811015612d1c57612c7e816007614e2e565b612c89906008614c58565b612c9660608a018a614a72565b85818110612ca657612ca6614ab7565b9050602002810190612cb89190614acb565b612cc99060408101906020016147d5565b6001600160401b0316901c60f81b8682612ce4856020614c23565b612cee9190614c23565b81518110612cfe57612cfe614ab7565b60200101906001600160f81b03191690815f1a905350600101612c6a565b505f5b6030811015612dc657612d356060890189614a72565b84818110612d4557612d45614ab7565b9050602002810190612d579190614acb565b612d65906040810190614e41565b82818110612d7557612d75614ab7565b9050013560f81c60f81b8682846028612d8e9190614c23565b612d989190614c23565b81518110612da857612da8614ab7565b60200101906001600160f81b03191690815f1a905350600101612d1f565b5050600101612baf565b5091949350505050565b612de2614665565b5f8281525f805160206151338339815191526020526040808220815160e0810190925280545f805160206150f383398151915293929190829060ff166005811115612e2f57612e2f61480e565b6005811115612e4057612e4061480e565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612eb257612eb261480e565b14612ed05760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612f1457612f1461480e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612fc08582611d93565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061511383398151915280546001190161304857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061511383398151915255565b5f5f805160206150d38339815191528161307d6101fa85613afc565b90505f61308987611a33565b9050613094876123ba565b6130b157604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156130c6576130c661480e565b146130e45760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516130f59190614c6f565b905083600201600a9054906101000a90046001600160401b0316826040015161311e9190614e83565b6001600160401b0316816001600160401b0316111561315057604051630c192e7760e41b815260040160405180910390fd5b5f8061315c8a84611d93565b915091505f8a8360405160200161318a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561321d5761321d61480e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461334c57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561339b57613363816001614e2e565b61336e906008614c58565b61ffff1685828151811061338457613384614ab7565b016020015160f81c901b919091179060010161334f565b5061ffff8116156133bf5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561341a576133d6816003614e2e565b6133e1906008614c58565b63ffffffff16866133f3836002614c23565b8151811061340357613403614ab7565b016020015160f81c901b91909117906001016133c2565b5063ffffffff811660031461344257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134975761345981601f614e2e565b613464906008614c58565b87613470836006614c23565b8151811061348057613480614ab7565b016020015160f81c901b9190911790600101613445565b505f866026815181106134ac576134ac614ab7565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206150d383398151915290600160401b900461ffff9081169086161080613520575061271061ffff8616115b1561353e5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613570576040516302336bad60e51b815260040160405180910390fd5b80548310806135825750806001015483115b156135a057604051630103be3b60e21b815260040160405180910390fd5b5f6135aa84613afc565b90505f6135b68261092d565b90505f6135c38983613b1f565b905060405180606001604052806135d73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613672613f09565b61367b82613f54565b61158b81613fc5565b5f808251602e146136a857604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136f7576136bf816001614e2e565b6136ca906008614c58565b61ffff168582815181106136e0576136e0614ab7565b016020015160f81c901b91909117906001016136ab565b5061ffff81161561371b5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561377657613732816003614e2e565b61373d906008614c58565b63ffffffff168661374f836002614c23565b8151811061375f5761375f614ab7565b016020015160f81c901b919091179060010161371e565b5063ffffffff811660051461379e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137f3576137b581601f614e2e565b6137c0906008614c58565b876137cc836006614c23565b815181106137dc576137dc614ab7565b016020015160f81c901b91909117906001016137a1565b505f805b60088110156138525761380b816007614e2e565b613816906008614c58565b6001600160401b03168861382b836026614c23565b8151811061383b5761383b614ab7565b016020015160f81c901b91909117906001016137f7565b5090969095509350505050565b5f805160206150f38339815191525f6001600160401b0380841690851611156138935761388c83856149ad565b90506138a0565b61389d84846149ad565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806139025750600184015481516138fe916001600160401b031690614c23565b8210155b15613928576001600160401b038316606082015281815260408101516020820152613947565b828160600181815161393a9190614c6f565b6001600160401b03169052505b6060810151613957906064614e83565b602082015160018601546001600160401b0392909216916139829190600160401b900460ff16614c58565b10156139a15760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516139bc9190614c23565b9052506040810180516001600160401b03871691906139dc908390614e2e565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206151338339815191526020526040812060020180545f805160206150f38339815191529190600890613a7290600160401b90046001600160401b0316614eae565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b03838116602483015260448201839052611a2e91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614022565b5f61093d825f805160206150b3833981519152546001600160a01b031690614088565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613b6357604051637fab81e560e01b815260040160405180910390fd5b5f805160206150f383398151915242613b8260408601602087016147d5565b6001600160401b0316111580613bbc5750613ba06202a30042614c23565b613bb060408601602087016147d5565b6001600160401b031610155b15613bd95760405162d36c8560e81b815260040160405180910390fd5b6030613be86040860186614e41565b9050141580613bf657508335155b15613c145760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613c4457604051630eb0d31360e11b815260040160405180910390fd5b613c4e835f61385f565b5f80613ce76040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613c9291906147d5565b6001600160401b03168152602001613cad60408a018a614e41565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141ea565b5f82815260068601602052604090209193509150613d058282614f0d565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613d43908590600401614a06565b6020604051808303815f875af1158015613d5f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d8391906149cd565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613dfb57613dfb61480e565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613edb918e01908e016147d5565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f5257604051631afcd79f60e31b815260040160405180910390fd5b565b613f5c613f09565b613f65816142ad565b613f6d6142c6565b613fc260608201356080830135613f8a60c0850160a086016147d5565b613f9a60e0860160c08701614fc8565b613fab610100870160e08801614fe1565b613fbd61012088016101008901614a57565b6142d6565b50565b613fcd613f09565b5f805160206150b38339815191526001600160a01b0382166140025760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6140366001600160a01b038416836143f7565b905080515f1415801561405a5750808060200190518101906140589190615001565b155b15611a2e57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140f291906149cd565b90506141096001600160a01b038516333086614404565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561414d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061417191906149cd565b90508181116141d75760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161407f565b6141e18282614e2e565b95945050505050565b5f606082608001515160301461421357604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614245979695949392919061501c565b60405160208183030381529060405290506002816040516142669190614c12565b602060405180830381855afa158015614281573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142a491906149cd565b94909350915050565b6142b5613f09565b6142bd61443d565b613fc281614445565b6142ce613f09565b613f52614517565b6142de613f09565b5f805160206150d383398151915261ffff84161580614302575061271061ffff8516115b156143205760405163c98d73a760e01b815260040160405180910390fd5b8587111561434157604051630103be3b60e21b815260040160405180910390fd5b60ff831615806143545750600a60ff8416115b15614372576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061211583835f61451f565b6040516001600160a01b0384811660248301528381166044830152606482018390526109279186918216906323b872dd90608401613aca565b613f52613f09565b61444d613f09565b80355f805160206150f383398151915290815560146144726060840160408501614fe1565b60ff161180614491575061448c6060830160408401614fe1565b60ff16155b156144af5760405163b4fa3fb360e01b815260040160405180910390fd5b6144bf6060830160408401614fe1565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556144f060408301602084016147d5565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61304e613f09565b6060814710156145445760405163cd78605960e01b815230600482015260240161407f565b5f80856001600160a01b0316848660405161455f9190614c12565b5f6040518083038185875af1925050503d805f8114614599576040519150601f19603f3d011682016040523d82523d5f602084013e61459e565b606091505b5091509150611d898683836060826145be576145b982614605565b612115565b81511580156145d557506001600160a01b0384163b155b156145fe57604051639996b31560e01b81526001600160a01b038516600482015260240161407f565b5080612115565b8051156146155780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461463a90614c8f565b5f825580601f10614649575050565b601f0160209004905f5260205f2090810190613fc291906146a1565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156146b5575f81556001016146a2565b5090565b8015158114613fc2575f80fd5b803563ffffffff811681146146d9575f80fd5b919050565b5f805f606084860312156146f0575f80fd5b833592506020840135614702816146b9565b9150614710604085016146c6565b90509250925092565b5f60208284031215614729575f80fd5b5035919050565b5f60208284031215614740575f80fd5b612115826146c6565b5f806040838503121561475a575f80fd5b614763836146c6565b946020939093013593505050565b5f8060408385031215614782575f80fd5b82356001600160401b03811115614797575f80fd5b8301608081860312156147a8575f80fd5b91506147b6602084016146c6565b90509250929050565b80356001600160401b03811681146146d9575f80fd5b5f602082840312156147e5575f80fd5b612115826147bf565b5f80604083850312156147ff575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061484557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161488060608401826001600160401b03169052565b50608083015161489b60808401826001600160401b03169052565b5060a08301516148b660a08401826001600160401b03169052565b5060c083015161258760c08401826001600160401b03169052565b803561ffff811681146146d9575f80fd5b5f805f80608085870312156148f5575f80fd5b84356001600160401b0381111561490a575f80fd5b85016060818803121561491b575f80fd5b9350614929602086016148d1565b9250614937604086016147bf565b9396929550929360600135925050565b6001600160a01b0381168114613fc2575f80fd5b5f8082840361014081121561496e575f80fd5b6101208082121561497d575f80fd5b849350830135905061498e81614947565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561258757612587614999565b5f602082840312156149dd575f80fd5b5051919050565b5f5b838110156149fe5781810151838201526020016149e6565b50505f910152565b602081525f8251806020840152614a248160408501602087016149e4565b601f01601f19169190910160400192915050565b5f82614a5257634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614a67575f80fd5b813561211581614947565b5f808335601e19843603018112614a87575f80fd5b8301803591506001600160401b03821115614aa0575f80fd5b6020019150600581901b3603821315611ee3575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614adf575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b1f57614b1f614ae9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b4d57614b4d614ae9565b604052919050565b5f6001600160401b03821115614b6d57614b6d614ae9565b50601f01601f191660200190565b5f60608236031215614b8b575f80fd5b614b93614afd565b823581526020614ba48185016147bf565b8183015260408401356001600160401b03811115614bc0575f80fd5b840136601f820112614bd0575f80fd5b8035614be3614bde82614b55565b614b25565b8181523684838501011115614bf6575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614adf8184602087016149e4565b8082018082111561093d5761093d614999565b5f63ffffffff808316818103614c4e57614c4e614999565b6001019392505050565b808202811582820484141761093d5761093d614999565b6001600160401b0381811683821601908082111561258757612587614999565b600181811c90821680614ca357607f821691505b602082108103614cc157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614cd981614c8f565b806020870152604060018084165f8114614cfa5760018114614d1657614d43565b60ff19851660408a0152604084151560051b8a01019550614d43565b895f5260205f205f5b85811015614d3a5781548b8201860152908301908801614d1f565b8a016040019650505b509398975050505050505050565b80516146d9816146b9565b5f8060408385031215614d6d575f80fd5b82516001600160401b0380821115614d83575f80fd5b9084019060608287031215614d96575f80fd5b614d9e614afd565b82518152602080840151614db181614947565b82820152604084015183811115614dc6575f80fd5b80850194505087601f850112614dda575f80fd5b83519250614dea614bde84614b55565b8381528882858701011115614dfd575f80fd5b614e0c848383018488016149e4565b80604084015250819550614e21818801614d51565b9450505050509250929050565b8181038181111561093d5761093d614999565b5f808335601e19843603018112614e56575f80fd5b8301803591506001600160401b03821115614e6f575f80fd5b602001915036819003821315611ee3575f80fd5b6001600160401b03818116838216028082169190828114614ea657614ea6614999565b505092915050565b5f6001600160401b03808316818103614c4e57614c4e614999565b601f821115611a2e57805f5260205f20601f840160051c81016020851015614eee5750805b601f840160051c820191505b818110156109dd575f8155600101614efa565b81516001600160401b03811115614f2657614f26614ae9565b614f3a81614f348454614c8f565b84614ec9565b602080601f831160018114614f6d575f8415614f565750858301515b5f19600386901b1c1916600185901b178555610b10565b5f85815260208120601f198616915b82811015614f9b57888601518255948401946001909101908401614f7c565b5085821015614fb857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215614fd8575f80fd5b612115826148d1565b5f60208284031215614ff1575f80fd5b813560ff81168114612115575f80fd5b5f60208284031215615011575f80fd5b8151612115816146b9565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161507181604e8601602089016149e4565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161529e38038061529e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151518061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b33660046146d0565b61040d565b005b6101b86101c836600461470b565b6107db565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa36600461470b565b61094d565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b8610241366004614722565b610963565b6101b861025436600461473b565b610a04565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b8610284366004614763565b610c50565b61029c6102973660046147c7565b6110d4565b6040519081526020016101e3565b6101ff6102b836600461470b565b6110ed565b61029c5f81565b6101b86102d23660046146d0565b611101565b6101d5603081565b6101b86102ed36600461470b565b6112f3565b6101b861030036600461473b565b6113ae565b61029c6103133660046147e0565b611575565b6101b8610326366004614722565b6115a1565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f36600461470b565b611713565b6101b861037236600461470b565b6118ef565b6101d5601481565b61039261038d36600461470b565b611a19565b6040516101e39190614814565b6101ff6202a30081565b61029c6103b736600461470b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f53660046148d4565b611ae1565b6101b861040836600461494d565b611b16565b5f8381525f805160206150858339815191526020526040808220815160e0810190925280545f805160206150c583398151915293929190829060ff16600381111561045a5761045a614800565b600381111561046b5761046b614800565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e182611a19565b90506002835160038111156104f8576104f8614800565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b60038151600581111561055857610558614800565b036105765760405163a36c527f60e01b815260040160405180910390fd5b5f878152600585810160205260408220805460ff1916600317905582518291600291908111156105a8576105a8614800565b036106215787156105c0576105bd8488611bf5565b91505b5f856060015184608001516105d5919061499f565b90506105e18582611d79565b505f8b8152600589016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905550429050610672565b50505f82815260088501602090815260408083205460608501518b855260058901909352922060020180546001600160c01b0316600160c01b6001600160401b039384160217905560c08301519116905b84608001516001600160401b0316816001600160401b0316111561076157600386015460608601516001600160a01b039091169063778c06b5906106b5906110d4565b60a086015160808901516040516001600160e01b031960e086901b16815260048101939093526001600160401b039182166024840152811660448301528085166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561072c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075091906149bf565b5f8a81526006880160205260409020555b60048351600581111561077657610776614800565b0361078f5761078489611ed0565b505050505050505050565b6040516001600160401b038216815284908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906020015b60405180910390a3505050505050505050565b5f8181525f805160206151258339815191526020526040808220815160e0810190925280545f805160206150e583398151915293929190829060ff16600581111561082857610828614800565b600581111561083957610839614800565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108a8576108a8614800565b146108c65760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6108eb8584606001515f6120b7565b6040518263ffffffff1660e01b815260040161090791906149f8565b6020604051808303815f875af1158015610923573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094791906149bf565b50505050565b5f61095d64e8d4a5100083614a2a565b92915050565b5f805160206150c58339815191525f8061097c8461210e565b91509150610989826123ac565b6109935750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156109c2576109c2614800565b036109e7575f838152600785016020526040812080549190556109e582826123e7565b505b6109fd816109f884604001516110d4565b61245d565b5050505050565b5f8181525f805160206150858339815191526020526040808220815160e0810190925280545f805160206150c583398151915293929190829060ff166003811115610a5157610a51614800565b6003811115610a6257610a62614800565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ad882611a19565b9050600183516003811115610aef57610aef614800565b14610b0d5760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610b2257610b22614800565b03610b3857610b3085611ed0565b505050505050565b5f610b4287612480565b90505f80610b538360400151612580565b5091509150818514610b7857604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610bb15750806001600160401b03168660a001516001600160401b0316115b15610bcf57604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f691016107c8565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206150e58339815191529060ff1615610ca257604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ce5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0991906149bf565b836020013514610d2c5760405163d040949d60e01b815260040160405180910390fd5b30610d3d6060850160408601614a49565b6001600160a01b031614610d645760405163e6c4247b60e01b815260040160405180910390fd5b5f610d726060850185614a64565b905090505f805b828163ffffffff16101561101e575f610d956060880188614a64565b8363ffffffff16818110610dab57610dab614aa9565b9050602002810190610dbd9190614abd565b610dc690614b6d565b80515f8181526008880160205260409020549192509015610dfa57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610e2992919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610e4391614c04565b602060405180830381855afa158015610e5e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610e8191906149bf565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610f0d57610f0d614800565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610fc0911686614c15565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061101790614c28565b9050610d79565b50600483018190555f61103085612480565b90505f61104082604001516127be565b90505f61104c88612933565b90508160028260405161105f9190614c04565b602060405180830381855afa15801561107a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061109d91906149bf565b146110bb57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61095d6001600160401b03831664e8d4a51000614c4a565b5f6110f782611a19565b6080015192915050565b5f805160206150c58339815191525f61111985612dcc565b9050611124856123ac565b61112f575050505050565b5f8581526004830160205260409020546001600160a01b031633146111675760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161119691600160b01b90046001600160401b031690614c61565b6001600160401b03168160c001516001600160401b031610156111cc576040516302336bad60e51b815260040160405180910390fd5b83156109fd575f6111dd8685611bf5565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061122d906110d4565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156112a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112c791906149bf565b5f878152600785016020526040812080549091906112e6908490614c15565b9091555050505050505050565b5f805160206150c58339815191525f61130b83611a19565b905060048151600581111561132257611322614800565b146113405760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146113785760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610947906001600160a01b0316826123e7565b6113b6613009565b5f8181525f805160206150858339815191526020526040808220815160e0810190925280545f805160206150c583398151915293929190829060ff16600381111561140357611403614800565b600381111561141457611414614800565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561148d5761148d614800565b146114ab5760405163f95c7fe160e01b815260040160405180910390fd5b60046114ba8260400151611a19565b5160058111156114cc576114cc614800565b14611550575f6114db85612480565b90505f806114ec8360400151612580565b50915091508184604001511461151557604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561154c57604051633ab3447f60e11b815260040160405180910390fd5b5050505b61155983611ed0565b505061157160015f8051602061510583398151915255565b5050565b5f61157e613009565b611589833384613053565b905061095d60015f8051602061510583398151915255565b5f805160206150e58339815191525f6115b983612480565b90505f806115ca836040015161331a565b91509150806115ec57604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461160690614c81565b90505f0361162757604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561164d5761164d614800565b1461166b5760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061168391614620565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206150858339815191526020526040808220815160e0810190925280545f805160206150c583398151915293929190829060ff16600381111561176057611760614800565b600381111561177157611771614800565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156117ea576117ea614800565b1415801561180b575060038151600381111561180857611808614800565b14155b156118295760405163f95c7fe160e01b815260040160405180910390fd5b5f6118378260400151611a19565b905080606001516001600160401b03165f0361186657604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6118938460400151846060015185608001516120b7565b6040518263ffffffff1660e01b81526004016118af91906149f8565b6020604051808303815f875af11580156118cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109fd91906149bf565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206150e5833981519152919061193690614c81565b90505f0361195757604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561197d5761197d614800565b1461199b5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119d49190600401614cb9565b6020604051808303815f875af11580156119f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a1491906149bf565b505050565b611a21614657565b5f8281525f80516020615125833981519152602052604090819020815160e0810190925280545f805160206150e5833981519152929190829060ff166005811115611a6e57611a6e614800565b6005811115611a7f57611a7f614800565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611aea613009565b611af6858585856134be565b9050611b0e60015f8051602061510583398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611b5f575080546001600160401b03808416911610155b15611b7d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611ba8848461365c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c40573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c679190810190614d4e565b9150915080611c8957604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ccc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf091906149bf565b825114611d105760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d3c5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d4b8460400151613676565b91509150818714611d6f57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615125833981519152602052604081206002015481905f805160206150e583398151915290600160801b90046001600160401b0316611dc18582613851565b5f611dcb87613a1a565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e1b8a858b6120b7565b6040518263ffffffff1660e01b8152600401611e3791906149f8565b6020604051808303815f875af1158015611e53573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e7791906149bf565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f805160206150858339815191526020526040808220815160e0810190925280545f805160206150c583398151915293929190829060ff166003811115611f1d57611f1d614800565b6003811115611f2e57611f2e614800565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870190915290812080549082905592935090919080821561205c575f8481526004870160205260409020546127109061200e90600160a01b900461ffff1685614c4a565b6120189190614a2a565b915081866007015f8681526020019081526020015f205f82825461203c9190614c15565b9091555061204c90508284614e20565b905061205c8560200151826123e7565b61207185602001516109f887606001516110d4565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f612117614657565b5f805160206150e58339815191525f61212f85612480565b90505f80612140836040015161331a565b91509150801561216357604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561219457612194614800565b60058111156121a5576121a5614800565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561221457612214614800565b14158015612235575060018151600581111561223257612232614800565b14155b156122535760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561226857612268614800565b03612276576004815261227b565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156122c0576122c0614800565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561237457612374614800565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206150a583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612442575f80fd5b505af1158015612454573d5f803e3d5ffd5b50505050505050565b5f805160206150a583398151915254611571906001600160a01b03168383613a8f565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156124e4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261250b9190810190614d4e565b915091508061252d57604051636b2f19e960e01b815260040160405180910390fd5b81511561254d5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156125795760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146125a557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156125f4576125bc816001614e20565b6125c7906008614c4a565b61ffff168682815181106125dd576125dd614aa9565b016020015160f81c901b91909117906001016125a8565b5061ffff8116156126185760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156126735761262f816003614e20565b61263a906008614c4a565b63ffffffff168761264c836002614c15565b8151811061265c5761265c614aa9565b016020015160f81c901b919091179060010161261b565b5063ffffffff811660041461269b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156126f0576126b281601f614e20565b6126bd906008614c4a565b886126c9836006614c15565b815181106126d9576126d9614aa9565b016020015160f81c901b919091179060010161269e565b505f805b600881101561274f57612708816007614e20565b612713906008614c4a565b6001600160401b031689612728836026614c15565b8151811061273857612738614aa9565b016020015160f81c901b91909117906001016126f4565b505f805b60088110156127ae57612767816007614e20565b612772906008614c4a565b6001600160401b03168a61278783602e614c15565b8151811061279757612797614aa9565b016020015160f81c901b9190911790600101612753565b5091989097509095509350505050565b5f81516026146127e157604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612830576127f8816001614e20565b612803906008614c4a565b61ffff1684828151811061281957612819614aa9565b016020015160f81c901b91909117906001016127e4565b5061ffff8116156128545760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156128af5761286b816003614e20565b612876906008614c4a565b63ffffffff1685612888836002614c15565b8151811061289857612898614aa9565b016020015160f81c901b9190911790600101612857565b5063ffffffff8116156128d557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561292a576128ec81601f614e20565b6128f7906008614c4a565b86612903836006614c15565b8151811061291357612913614aa9565b016020015160f81c901b91909117906001016128d8565b50949350505050565b60605f61294283830184614a64565b61294e91506058614c4a565b61295990605c614c15565b6001600160401b0381111561297057612970614adb565b6040519080825280601f01601f19166020018201604052801561299a576020820181803683370190505b5090505f5b60208110156129ef57833581602081106129bb576129bb614aa9565b1a60f81b8282815181106129d1576129d1614aa9565b60200101906001600160f81b03191690815f1a90535060010161299f565b505f5b6020811015612a4f5783602001358160208110612a1157612a11614aa9565b1a60f81b82612a21836020614c15565b81518110612a3157612a31614aa9565b60200101906001600160f81b03191690815f1a9053506001016129f2565b505f5b6004811015612ab257612a66816003614e20565b612a71906008614c4a565b6014901c60f81b82612a84836040614c15565b81518110612a9457612a94614aa9565b60200101906001600160f81b03191690815f1a905350600101612a52565b505f612ac46060850160408601614a49565b60601b90505f5b6014811015612b2457818160148110612ae657612ae6614aa9565b1a60f81b83612af6836044614c15565b81518110612b0657612b06614aa9565b60200101906001600160f81b03191690815f1a905350600101612acb565b505f612b336060860186614a64565b905090505f5b6004811015612b9e57612b4d816003614e20565b612b58906008614c4a565b63ffffffff8316901c60f81b84612b70836058614c15565b81518110612b8057612b80614aa9565b60200101906001600160f81b03191690815f1a905350600101612b39565b505f5b612bae6060870187614a64565b9050811015612dc2575f612bc3826058614c4a565b612bce90605c614c15565b90505f5b6020811015612c5957612be86060890189614a64565b84818110612bf857612bf8614aa9565b9050602002810190612c0a9190614abd565b358160208110612c1c57612c1c614aa9565b1a60f81b86612c2b8385614c15565b81518110612c3b57612c3b614aa9565b60200101906001600160f81b03191690815f1a905350600101612bd2565b505f5b6008811015612d0e57612c70816007614e20565b612c7b906008614c4a565b612c8860608a018a614a64565b85818110612c9857612c98614aa9565b9050602002810190612caa9190614abd565b612cbb9060408101906020016147c7565b6001600160401b0316901c60f81b8682612cd6856020614c15565b612ce09190614c15565b81518110612cf057612cf0614aa9565b60200101906001600160f81b03191690815f1a905350600101612c5c565b505f5b6030811015612db857612d276060890189614a64565b84818110612d3757612d37614aa9565b9050602002810190612d499190614abd565b612d57906040810190614e33565b82818110612d6757612d67614aa9565b9050013560f81c60f81b8682846028612d809190614c15565b612d8a9190614c15565b81518110612d9a57612d9a614aa9565b60200101906001600160f81b03191690815f1a905350600101612d11565b5050600101612ba1565b5091949350505050565b612dd4614657565b5f8281525f805160206151258339815191526020526040808220815160e0810190925280545f805160206150e583398151915293929190829060ff166005811115612e2157612e21614800565b6005811115612e3257612e32614800565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612ea457612ea4614800565b14612ec25760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612f0657612f06614800565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612fb28582611d79565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061510583398151915280546001190161303a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061510583398151915255565b5f5f805160206150c58339815191528161306f6101fa85613aee565b90505f61307b87611a19565b9050613086876123ac565b6130a357604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156130b8576130b8614800565b146130d65760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516130e79190614c61565b905083600201600a9054906101000a90046001600160401b031682604001516131109190614e75565b6001600160401b0316816001600160401b0316111561314257604051630c192e7760e41b815260040160405180910390fd5b5f8061314e8a84611d79565b915091505f8a8360405160200161317c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561320f5761320f614800565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461333e57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561338d57613355816001614e20565b613360906008614c4a565b61ffff1685828151811061337657613376614aa9565b016020015160f81c901b9190911790600101613341565b5061ffff8116156133b15760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561340c576133c8816003614e20565b6133d3906008614c4a565b63ffffffff16866133e5836002614c15565b815181106133f5576133f5614aa9565b016020015160f81c901b91909117906001016133b4565b5063ffffffff811660031461343457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134895761344b81601f614e20565b613456906008614c4a565b87613462836006614c15565b8151811061347257613472614aa9565b016020015160f81c901b9190911790600101613437565b505f8660268151811061349e5761349e614aa9565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206150c583398151915290600160401b900461ffff9081169086161080613512575061271061ffff8616115b156135305760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613562576040516302336bad60e51b815260040160405180910390fd5b80548310806135745750806001015483115b1561359257604051630103be3b60e21b815260040160405180910390fd5b5f61359c84613aee565b90505f6135a88261094d565b90505f6135b58983613b11565b905060405180606001604052806135c93390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613664613efb565b61366d82613f46565b61157181613fb7565b5f808251602e1461369a57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136e9576136b1816001614e20565b6136bc906008614c4a565b61ffff168582815181106136d2576136d2614aa9565b016020015160f81c901b919091179060010161369d565b5061ffff81161561370d5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561376857613724816003614e20565b61372f906008614c4a565b63ffffffff1686613741836002614c15565b8151811061375157613751614aa9565b016020015160f81c901b9190911790600101613710565b5063ffffffff811660051461379057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137e5576137a781601f614e20565b6137b2906008614c4a565b876137be836006614c15565b815181106137ce576137ce614aa9565b016020015160f81c901b9190911790600101613793565b505f805b6008811015613844576137fd816007614e20565b613808906008614c4a565b6001600160401b03168861381d836026614c15565b8151811061382d5761382d614aa9565b016020015160f81c901b91909117906001016137e9565b5090969095509350505050565b5f805160206150e58339815191525f6001600160401b0380841690851611156138855761387e838561499f565b9050613892565b61388f848461499f565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806138f45750600184015481516138f0916001600160401b031690614c15565b8210155b1561391a576001600160401b038316606082015281815260408101516020820152613939565b828160600181815161392c9190614c61565b6001600160401b03169052505b6060810151613949906064614e75565b602082015160018601546001600160401b0392909216916139749190600160401b900460ff16614c4a565b10156139935760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516139ae9190614c15565b9052506040810180516001600160401b03871691906139ce908390614e20565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206151258339815191526020526040812060020180545f805160206150e58339815191529190600890613a6490600160401b90046001600160401b0316614ea0565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b03838116602483015260448201839052611a1491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614014565b5f61095d825f805160206150a5833981519152546001600160a01b03169061407a565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613b5557604051637fab81e560e01b815260040160405180910390fd5b5f805160206150e583398151915242613b7460408601602087016147c7565b6001600160401b0316111580613bae5750613b926202a30042614c15565b613ba260408601602087016147c7565b6001600160401b031610155b15613bcb5760405162d36c8560e81b815260040160405180910390fd5b6030613bda6040860186614e33565b9050141580613be857508335155b15613c065760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613c3657604051630eb0d31360e11b815260040160405180910390fd5b613c40835f613851565b5f80613cd96040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613c8491906147c7565b6001600160401b03168152602001613c9f60408a018a614e33565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141dc565b5f82815260068601602052604090209193509150613cf78282614eff565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613d359085906004016149f8565b6020604051808303815f875af1158015613d51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d7591906149bf565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613ded57613ded614800565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ecd918e01908e016147c7565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f4457604051631afcd79f60e31b815260040160405180910390fd5b565b613f4e613efb565b613f578161429f565b613f5f6142b8565b613fb460608201356080830135613f7c60c0850160a086016147c7565b613f8c60e0860160c08701614fba565b613f9d610100870160e08801614fd3565b613faf61012088016101008901614a49565b6142c8565b50565b613fbf613efb565b5f805160206150a58339815191526001600160a01b038216613ff45760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6140286001600160a01b038416836143e9565b905080515f1415801561404c57508080602001905181019061404a9190614ff3565b155b15611a1457604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e491906149bf565b90506140fb6001600160a01b0385163330866143f6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561413f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061416391906149bf565b90508181116141c95760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401614071565b6141d38282614e20565b95945050505050565b5f606082608001515160301461420557604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614237979695949392919061500e565b60405160208183030381529060405290506002816040516142589190614c04565b602060405180830381855afa158015614273573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061429691906149bf565b94909350915050565b6142a7613efb565b6142af61442f565b613fb481614437565b6142c0613efb565b613f44614509565b6142d0613efb565b5f805160206150c583398151915261ffff841615806142f4575061271061ffff8516115b156143125760405163c98d73a760e01b815260040160405180910390fd5b8587111561433357604051630103be3b60e21b815260040160405180910390fd5b60ff831615806143465750600a60ff8416115b15614364576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061210783835f614511565b6040516001600160a01b0384811660248301528381166044830152606482018390526109479186918216906323b872dd90608401613abc565b613f44613efb565b61443f613efb565b80355f805160206150e583398151915290815560146144646060840160408501614fd3565b60ff161180614483575061447e6060830160408401614fd3565b60ff16155b156144a15760405163b4fa3fb360e01b815260040160405180910390fd5b6144b16060830160408401614fd3565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556144e260408301602084016147c7565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613040613efb565b6060814710156145365760405163cd78605960e01b8152306004820152602401614071565b5f80856001600160a01b031684866040516145519190614c04565b5f6040518083038185875af1925050503d805f811461458b576040519150601f19603f3d011682016040523d82523d5f602084013e614590565b606091505b5091509150611d6f8683836060826145b0576145ab826145f7565b612107565b81511580156145c757506001600160a01b0384163b155b156145f057604051639996b31560e01b81526001600160a01b0385166004820152602401614071565b5080612107565b8051156146075780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461462c90614c81565b5f825580601f1061463b575050565b601f0160209004905f5260205f2090810190613fb49190614693565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156146a7575f8155600101614694565b5090565b8015158114613fb4575f80fd5b803563ffffffff811681146146cb575f80fd5b919050565b5f805f606084860312156146e2575f80fd5b8335925060208401356146f4816146ab565b9150614702604085016146b8565b90509250925092565b5f6020828403121561471b575f80fd5b5035919050565b5f60208284031215614732575f80fd5b612107826146b8565b5f806040838503121561474c575f80fd5b614755836146b8565b946020939093013593505050565b5f8060408385031215614774575f80fd5b82356001600160401b03811115614789575f80fd5b83016080818603121561479a575f80fd5b91506147a8602084016146b8565b90509250929050565b80356001600160401b03811681146146cb575f80fd5b5f602082840312156147d7575f80fd5b612107826147b1565b5f80604083850312156147f1575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061483757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161487260608401826001600160401b03169052565b50608083015161488d60808401826001600160401b03169052565b5060a08301516148a860a08401826001600160401b03169052565b5060c083015161257960c08401826001600160401b03169052565b803561ffff811681146146cb575f80fd5b5f805f80608085870312156148e7575f80fd5b84356001600160401b038111156148fc575f80fd5b85016060818803121561490d575f80fd5b935061491b602086016148c3565b9250614929604086016147b1565b9396929550929360600135925050565b6001600160a01b0381168114613fb4575f80fd5b5f80828403610140811215614960575f80fd5b6101208082121561496f575f80fd5b849350830135905061498081614939565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156125795761257961498b565b5f602082840312156149cf575f80fd5b5051919050565b5f5b838110156149f05781810151838201526020016149d8565b50505f910152565b602081525f8251806020840152614a168160408501602087016149d6565b601f01601f19169190910160400192915050565b5f82614a4457634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614a59575f80fd5b813561210781614939565b5f808335601e19843603018112614a79575f80fd5b8301803591506001600160401b03821115614a92575f80fd5b6020019150600581901b3603821315611ec9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614ad1575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b1157614b11614adb565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b3f57614b3f614adb565b604052919050565b5f6001600160401b03821115614b5f57614b5f614adb565b50601f01601f191660200190565b5f60608236031215614b7d575f80fd5b614b85614aef565b823581526020614b968185016147b1565b8183015260408401356001600160401b03811115614bb2575f80fd5b840136601f820112614bc2575f80fd5b8035614bd5614bd082614b47565b614b17565b8181523684838501011115614be8575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614ad18184602087016149d6565b8082018082111561095d5761095d61498b565b5f63ffffffff808316818103614c4057614c4061498b565b6001019392505050565b808202811582820484141761095d5761095d61498b565b6001600160401b038181168382160190808211156125795761257961498b565b600181811c90821680614c9557607f821691505b602082108103614cb357634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614ccb81614c81565b806020870152604060018084165f8114614cec5760018114614d0857614d35565b60ff19851660408a0152604084151560051b8a01019550614d35565b895f5260205f205f5b85811015614d2c5781548b8201860152908301908801614d11565b8a016040019650505b509398975050505050505050565b80516146cb816146ab565b5f8060408385031215614d5f575f80fd5b82516001600160401b0380821115614d75575f80fd5b9084019060608287031215614d88575f80fd5b614d90614aef565b82518152602080840151614da381614939565b82820152604084015183811115614db8575f80fd5b80850194505087601f850112614dcc575f80fd5b83519250614ddc614bd084614b47565b8381528882858701011115614def575f80fd5b614dfe848383018488016149d6565b80604084015250819550614e13818801614d43565b9450505050509250929050565b8181038181111561095d5761095d61498b565b5f808335601e19843603018112614e48575f80fd5b8301803591506001600160401b03821115614e61575f80fd5b602001915036819003821315611ec9575f80fd5b6001600160401b03818116838216028082169190828114614e9857614e9861498b565b505092915050565b5f6001600160401b03808316818103614c4057614c4061498b565b601f821115611a1457805f5260205f20601f840160051c81016020851015614ee05750805b601f840160051c820191505b818110156109fd575f8155600101614eec565b81516001600160401b03811115614f1857614f18614adb565b614f2c81614f268454614c81565b84614ebb565b602080601f831160018114614f5f575f8415614f485750858301515b5f19600386901b1c1916600185901b178555610b30565b5f85815260208120601f198616915b82811015614f8d57888601518255948401946001909101908401614f6e565b5085821015614faa57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215614fca575f80fd5b612107826148c3565b5f60208284031215614fe3575f80fd5b813560ff81168114612107575f80fd5b5f60208284031215615003575f80fd5b8151612107816146ab565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161506381604e8601602089016149d6565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 3a7054959..ef4b82dd4 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614fb8380380614fb883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614e6b8061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004614483565b610561565b005b3480156101df575f80fd5b506101d26101ee3660046144be565b61090f565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d26102383660046144d5565b610a81565b348015610248575f80fd5b5061025c6102573660046144be565b610b5e565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc366004614513565b610b74565b604051908152602001610215565b3480156102fa575f80fd5b506101d2610309366004614567565b610ba8565b348015610319575f80fd5b506101d2610328366004614580565b610c49565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d26103703660046145a8565b610ecf565b348015610380575f80fd5b506102e161038f3660046145f6565b611353565b34801561039f575f80fd5b5061025c6103ae3660046144be565b61136c565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e0366004614483565b611380565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d26104133660046144be565b611572565b348015610423575f80fd5b506101d2610432366004614580565b61162d565b348015610442575f80fd5b506101d2610451366004614567565b6117f4565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a3660046144be565b611966565b34801561049a575f80fd5b506101d26104a93660046144be565b611b42565b6102e16104bc3660046144be565b611c6c565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef3660046144be565b611c9d565b6040516102159190614623565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e16105313660046144be565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614dbf8339815191526020526040808220815160e0810190925280545f80516020614ddf83398151915293929190829060ff1660038111156105ae576105ae61460f565b60038111156105bf576105bf61460f565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611c9d565b905060028351600381111561064c5761064c61460f565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b6003815160058111156106ac576106ac61460f565b036106ca5760405163a36c527f60e01b815260040160405180910390fd5b5f878152600585810160205260408220805460ff1916600317905582518291600291908111156106fc576106fc61460f565b03610775578715610714576107118488611d65565b91505b5f8560600151846080015161072991906146e6565b90506107358582611ee9565b505f8b8152600589016020526040902060020180546001600160401b03909216600160c01b026001600160c01b03909216919091179055504290506107c6565b50505f82815260088501602090815260408083205460608501518b855260058901909352922060020180546001600160c01b0316600160c01b6001600160401b039384160217905560c08301519116905b600386015460608601516001600160a01b039091169063778c06b5906107eb90611353565b60a086015160808901516040516001600160e01b031960e086901b16815260048101939093526001600160401b039182166024840152811660448301528085166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610862573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108869190614706565b5f8a81526006880160205260409020556004835160058111156108ab576108ab61460f565b036108c4576108b989612040565b505050505050505050565b6040516001600160401b038216815284908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699060200160405180910390a3505050505050505050565b5f8181525f80516020614e3f8339815191526020526040808220815160e0810190925280545f80516020614dff83398151915293929190829060ff16600581111561095c5761095c61460f565b600581111561096d5761096d61460f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109dc576109dc61460f565b146109fa5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a1f8584606001515f61221b565b6040518263ffffffff1660e01b8152600401610a3b919061473f565b6020604051808303815f875af1158015610a57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a7b9190614706565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aca575080546001600160401b03808416911610155b15610ae85760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b128361226a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b6e64e8d4a5100083614771565b92915050565b5f610b7d61227e565b610b89848484346122b5565b9050610ba160015f80516020614e1f83398151915255565b9392505050565b5f80516020614ddf8339815191525f80610bc18461245b565b91509150610bce826126f9565b610bd85750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c0757610c0761460f565b03610c2c575f83815260078501602052604081208054919055610c2a8282612734565b505b610c4281610c3d8460400151611353565b612792565b5050505050565b5f8181525f80516020614dbf8339815191526020526040808220815160e0810190925280545f80516020614ddf83398151915293929190829060ff166003811115610c9657610c9661460f565b6003811115610ca757610ca761460f565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610d1d82611c9d565b9050600183516003811115610d3457610d3461460f565b14610d525760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610d6757610d6761460f565b03610d7d57610d7585612040565b505050505050565b5f600382516005811115610d9357610d9361460f565b03610da3575060c0810151610e41565b5f610dad886127a5565b90505f80610dbe83604001516128a5565b5091509150818614610de357604051636990657d60e01b815260040160405180910390fd5b806001600160401b031685606001516001600160401b03161080610e1c5750806001600160401b03168760a001516001600160401b0316115b15610e3a57604051633ab3447f60e11b815260040160405180910390fd5b4293505050505b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b038516600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252849188917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f691015b60405180910390a350505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614dff8339815191529060ff1615610f2157604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f889190614706565b836020013514610fab5760405163d040949d60e01b815260040160405180910390fd5b30610fbc60608501604086016147a4565b6001600160a01b031614610fe35760405163e6c4247b60e01b815260040160405180910390fd5b5f610ff160608501856147bf565b905090505f805b828163ffffffff16101561129d575f61101460608801886147bf565b8363ffffffff1681811061102a5761102a614804565b905060200281019061103c9190614818565b611045906148c8565b80515f818152600888016020526040902054919250901561107957604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f0135856040516020016110a892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526110c29161495f565b602060405180830381855afa1580156110dd573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111009190614706565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561118c5761118c61460f565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161123f911686614970565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061129690614983565b9050610ff8565b50600483018190555f6112af856127a5565b90505f6112bf8260400151612ae3565b90505f6112cb88612c58565b9050816002826040516112de919061495f565b602060405180830381855afa1580156112f9573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061131c9190614706565b1461133a57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610b6e6001600160401b03831664e8d4a510006149a5565b5f61137682611c9d565b6080015192915050565b5f80516020614ddf8339815191525f611398856130f1565b90506113a3856126f9565b6113ae575050505050565b5f8581526004830160205260409020546001600160a01b031633146113e65760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161141591600160b01b90046001600160401b0316906149bc565b6001600160401b03168160c001516001600160401b0316101561144b576040516302336bad60e51b815260040160405180910390fd5b8315610c42575f61145c8685611d65565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906114ac90611353565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611522573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115469190614706565b5f87815260078501602052604081208054909190611565908490614970565b9091555050505050505050565b5f80516020614ddf8339815191525f61158a83611c9d565b90506004815160058111156115a1576115a161460f565b146115bf5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146115f75760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610a7b906001600160a01b031682612734565b61163561227e565b5f8181525f80516020614dbf8339815191526020526040808220815160e0810190925280545f80516020614ddf83398151915293929190829060ff1660038111156116825761168261460f565b60038111156116935761169361460f565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561170c5761170c61460f565b1461172a5760405163f95c7fe160e01b815260040160405180910390fd5b60046117398260400151611c9d565b51600581111561174b5761174b61460f565b146117cf575f61175a856127a5565b90505f8061176b83604001516128a5565b50915091508184604001511461179457604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156117cb57604051633ab3447f60e11b815260040160405180910390fd5b5050505b6117d883612040565b50506117f060015f80516020614e1f83398151915255565b5050565b5f80516020614dff8339815191525f61180c836127a5565b90505f8061181d836040015161332e565b915091508061183f57604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068501602052604090208054611859906149dc565b90505f0361187a57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156118a0576118a061460f565b146118be5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206118d6916143d8565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614dbf8339815191526020526040808220815160e0810190925280545f80516020614ddf83398151915293929190829060ff1660038111156119b3576119b361460f565b60038111156119c4576119c461460f565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a3d57611a3d61460f565b14158015611a5e5750600381516003811115611a5b57611a5b61460f565b14155b15611a7c5760405163f95c7fe160e01b815260040160405180910390fd5b5f611a8a8260400151611c9d565b905080606001516001600160401b03165f03611ab957604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611ae684604001518460600151856080015161221b565b6040518263ffffffff1660e01b8152600401611b02919061473f565b6020604051808303815f875af1158015611b1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c429190614706565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614dff8339815191529190611b89906149dc565b90505f03611baa57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611bd057611bd061460f565b14611bee5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c279190600401614a0e565b6020604051808303815f875af1158015611c43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c679190614706565b505050565b5f611c7561227e565b611c808233346134d2565b9050611c9860015f80516020614e1f83398151915255565b919050565b611ca561440f565b5f8281525f80516020614e3f833981519152602052604090819020815160e0810190925280545f80516020614dff833981519152929190829060ff166005811115611cf257611cf261460f565b6005811115611d0357611d0361460f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611db0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611dd79190810190614aa3565b9150915080611df957604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e609190614706565b825114611e805760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611eac5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ebb8460400151613796565b91509150818714611edf57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e3f833981519152602052604081206002015481905f80516020614dff83398151915290600160801b90046001600160401b0316611f318582613971565b5f611f3b87613b3a565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611f8b8a858b61221b565b6040518263ffffffff1660e01b8152600401611fa7919061473f565b6020604051808303815f875af1158015611fc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe79190614706565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f80516020614dbf8339815191526020526040808220815160e0810190925280545f80516020614ddf83398151915293929190829060ff16600381111561208d5761208d61460f565b600381111561209e5761209e61460f565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156121cc575f8481526004870160205260409020546127109061217e90600160a01b900461ffff16856149a5565b6121889190614771565b915081866007015f8681526020019081526020015f205f8282546121ac9190614970565b909155506121bc90508284614b75565b90506121cc856020015182612734565b6121e18560200151610c3d8760600151611353565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc9939101610ebe565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612272613baf565b61227b81613bfa565b50565b5f80516020614e1f8339815191528054600119016122af57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ddf83398151915290600160401b900461ffff9081169086161080612309575061271061ffff8616115b156123275760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612359576040516302336bad60e51b815260040160405180910390fd5b805483108061236b5750806001015483115b1561238957604051630103be3b60e21b815260040160405180910390fd5b825f61239482610b5e565b90505f6123a18983613c68565b905060405180606001604052806123b53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e1f83398151915255565b5f61246461440f565b5f80516020614dff8339815191525f61247c856127a5565b90505f8061248d836040015161332e565b9150915080156124b057604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156124e1576124e161460f565b60058111156124f2576124f261460f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125615761256161460f565b14158015612582575060018151600581111561257f5761257f61460f565b14155b156125a05760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156125b5576125b561460f565b036125c357600481526125c8565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561260d5761260d61460f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156126c1576126c161460f565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612780575f80fd5b505af1158015610d75573d5f803e3d5ffd5b6117f06001600160a01b03831682614052565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612809573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128309190810190614aa3565b915091508061285257604051636b2f19e960e01b815260040160405180910390fd5b8151156128725760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561289e5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146128ca57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612919576128e1816001614b75565b6128ec9060086149a5565b61ffff1686828151811061290257612902614804565b016020015160f81c901b91909117906001016128cd565b5061ffff81161561293d5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561299857612954816003614b75565b61295f9060086149a5565b63ffffffff1687612971836002614970565b8151811061298157612981614804565b016020015160f81c901b9190911790600101612940565b5063ffffffff81166004146129c057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a15576129d781601f614b75565b6129e29060086149a5565b886129ee836006614970565b815181106129fe576129fe614804565b016020015160f81c901b91909117906001016129c3565b505f805b6008811015612a7457612a2d816007614b75565b612a389060086149a5565b6001600160401b031689612a4d836026614970565b81518110612a5d57612a5d614804565b016020015160f81c901b9190911790600101612a19565b505f805b6008811015612ad357612a8c816007614b75565b612a979060086149a5565b6001600160401b03168a612aac83602e614970565b81518110612abc57612abc614804565b016020015160f81c901b9190911790600101612a78565b5091989097509095509350505050565b5f8151602614612b0657604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b5557612b1d816001614b75565b612b289060086149a5565b61ffff16848281518110612b3e57612b3e614804565b016020015160f81c901b9190911790600101612b09565b5061ffff811615612b795760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612bd457612b90816003614b75565b612b9b9060086149a5565b63ffffffff1685612bad836002614970565b81518110612bbd57612bbd614804565b016020015160f81c901b9190911790600101612b7c565b5063ffffffff811615612bfa57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c4f57612c1181601f614b75565b612c1c9060086149a5565b86612c28836006614970565b81518110612c3857612c38614804565b016020015160f81c901b9190911790600101612bfd565b50949350505050565b60605f612c67838301846147bf565b612c73915060586149a5565b612c7e90605c614970565b6001600160401b03811115612c9557612c95614836565b6040519080825280601f01601f191660200182016040528015612cbf576020820181803683370190505b5090505f5b6020811015612d145783358160208110612ce057612ce0614804565b1a60f81b828281518110612cf657612cf6614804565b60200101906001600160f81b03191690815f1a905350600101612cc4565b505f5b6020811015612d745783602001358160208110612d3657612d36614804565b1a60f81b82612d46836020614970565b81518110612d5657612d56614804565b60200101906001600160f81b03191690815f1a905350600101612d17565b505f5b6004811015612dd757612d8b816003614b75565b612d969060086149a5565b6014901c60f81b82612da9836040614970565b81518110612db957612db9614804565b60200101906001600160f81b03191690815f1a905350600101612d77565b505f612de960608501604086016147a4565b60601b90505f5b6014811015612e4957818160148110612e0b57612e0b614804565b1a60f81b83612e1b836044614970565b81518110612e2b57612e2b614804565b60200101906001600160f81b03191690815f1a905350600101612df0565b505f612e5860608601866147bf565b905090505f5b6004811015612ec357612e72816003614b75565b612e7d9060086149a5565b63ffffffff8316901c60f81b84612e95836058614970565b81518110612ea557612ea5614804565b60200101906001600160f81b03191690815f1a905350600101612e5e565b505f5b612ed360608701876147bf565b90508110156130e7575f612ee88260586149a5565b612ef390605c614970565b90505f5b6020811015612f7e57612f0d60608901896147bf565b84818110612f1d57612f1d614804565b9050602002810190612f2f9190614818565b358160208110612f4157612f41614804565b1a60f81b86612f508385614970565b81518110612f6057612f60614804565b60200101906001600160f81b03191690815f1a905350600101612ef7565b505f5b600881101561303357612f95816007614b75565b612fa09060086149a5565b612fad60608a018a6147bf565b85818110612fbd57612fbd614804565b9050602002810190612fcf9190614818565b612fe09060408101906020016145f6565b6001600160401b0316901c60f81b8682612ffb856020614970565b6130059190614970565b8151811061301557613015614804565b60200101906001600160f81b03191690815f1a905350600101612f81565b505f5b60308110156130dd5761304c60608901896147bf565b8481811061305c5761305c614804565b905060200281019061306e9190614818565b61307c906040810190614b88565b8281811061308c5761308c614804565b9050013560f81c60f81b86828460286130a59190614970565b6130af9190614970565b815181106130bf576130bf614804565b60200101906001600160f81b03191690815f1a905350600101613036565b5050600101612ec6565b5091949350505050565b6130f961440f565b5f8281525f80516020614e3f8339815191526020526040808220815160e0810190925280545f80516020614dff83398151915293929190829060ff1660058111156131465761314661460f565b60058111156131575761315761460f565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131c9576131c961460f565b146131e75760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561322b5761322b61460f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132d78582611ee9565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461335257604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133a157613369816001614b75565b6133749060086149a5565b61ffff1685828151811061338a5761338a614804565b016020015160f81c901b9190911790600101613355565b5061ffff8116156133c55760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613420576133dc816003614b75565b6133e79060086149a5565b63ffffffff16866133f9836002614970565b8151811061340957613409614804565b016020015160f81c901b91909117906001016133c8565b5063ffffffff811660031461344857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561349d5761345f81601f614b75565b61346a9060086149a5565b87613476836006614970565b8151811061348657613486614804565b016020015160f81c901b919091179060010161344b565b505f866026815181106134b2576134b2614804565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614ddf833981519152816134eb84610b5e565b90505f6134f787611c9d565b9050613502876126f9565b61351f57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156135345761353461460f565b146135525760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161356391906149bc565b905083600201600a9054906101000a90046001600160401b0316826040015161358c9190614bca565b6001600160401b0316816001600160401b031611156135be57604051630c192e7760e41b815260040160405180910390fd5b5f806135ca8a84611ee9565b915091505f8a836040516020016135f892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561368b5761368b61460f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146137ba57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613809576137d1816001614b75565b6137dc9060086149a5565b61ffff168582815181106137f2576137f2614804565b016020015160f81c901b91909117906001016137bd565b5061ffff81161561382d5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561388857613844816003614b75565b61384f9060086149a5565b63ffffffff1686613861836002614970565b8151811061387157613871614804565b016020015160f81c901b9190911790600101613830565b5063ffffffff81166005146138b057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613905576138c781601f614b75565b6138d29060086149a5565b876138de836006614970565b815181106138ee576138ee614804565b016020015160f81c901b91909117906001016138b3565b505f805b60088110156139645761391d816007614b75565b6139289060086149a5565b6001600160401b03168861393d836026614970565b8151811061394d5761394d614804565b016020015160f81c901b9190911790600101613909565b5090969095509350505050565b5f80516020614dff8339815191525f6001600160401b0380841690851611156139a55761399e83856146e6565b90506139b2565b6139af84846146e6565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a14575060018401548151613a10916001600160401b031690614970565b8210155b15613a3a576001600160401b038316606082015281815260408101516020820152613a59565b8281606001818151613a4c91906149bc565b6001600160401b03169052505b6060810151613a69906064614bca565b602082015160018601546001600160401b039290921691613a949190600160401b900460ff166149a5565b1015613ab35760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613ace9190614970565b9052506040810180516001600160401b0387169190613aee908390614b75565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e3f8339815191526020526040812060020180545f80516020614dff8339815191529190600890613b8490600160401b90046001600160401b0316614bf5565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613bf857604051631afcd79f60e31b815260040160405180910390fd5b565b613c02613baf565b613c0b816140e9565b613c13614102565b61227b60608201356080830135613c3060c0850160a086016145f6565b613c4060e0860160c08701614c10565b613c51610100870160e08801614c29565b613c63610120880161010089016147a4565b614112565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613cac57604051637fab81e560e01b815260040160405180910390fd5b5f80516020614dff83398151915242613ccb60408601602087016145f6565b6001600160401b0316111580613d055750613ce96202a30042614970565b613cf960408601602087016145f6565b6001600160401b031610155b15613d225760405162d36c8560e81b815260040160405180910390fd5b6030613d316040860186614b88565b9050141580613d3f57508335155b15613d5d5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613d8d57604051630eb0d31360e11b815260040160405180910390fd5b613d97835f613971565b5f80613e306040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ddb91906145f6565b6001600160401b03168152602001613df660408a018a614b88565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614233565b5f82815260068601602052604090209193509150613e4e8282614c8d565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613e8c90859060040161473f565b6020604051808303815f875af1158015613ea8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ecc9190614706565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613f4457613f4461460f565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614024918e01908e016145f6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156140795760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146140c2576040519150601f19603f3d011682016040523d82523d5f602084013e6140c7565b606091505b5050905080611c6757604051630a12f52160e11b815260040160405180910390fd5b6140f1613baf565b6140f96142f6565b61227b816142fe565b61410a613baf565b613bf86143d0565b61411a613baf565b5f80516020614ddf83398151915261ffff8416158061413e575061271061ffff8516115b1561415c5760405163c98d73a760e01b815260040160405180910390fd5b8587111561417d57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806141905750600a60ff8416115b156141ae576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461425c57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161428e9796959493929190614d48565b60405160208183030381529060405290506002816040516142af919061495f565b602060405180830381855afa1580156142ca573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142ed9190614706565b94909350915050565b613bf8613baf565b614306613baf565b80355f80516020614dff833981519152908155601461432b6060840160408501614c29565b60ff16118061434a57506143456060830160408401614c29565b60ff16155b156143685760405163b4fa3fb360e01b815260040160405180910390fd5b6143786060830160408401614c29565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556143a960408301602084016145f6565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612448613baf565b5080546143e4906149dc565b5f825580601f106143f3575050565b601f0160209004905f5260205f209081019061227b919061444b565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561445f575f815560010161444c565b5090565b801515811461227b575f80fd5b803563ffffffff81168114611c98575f80fd5b5f805f60608486031215614495575f80fd5b8335925060208401356144a781614463565b91506144b560408501614470565b90509250925092565b5f602082840312156144ce575f80fd5b5035919050565b5f61012082840312156144e6575f80fd5b50919050565b803561ffff81168114611c98575f80fd5b80356001600160401b0381168114611c98575f80fd5b5f805f60608486031215614525575f80fd5b83356001600160401b0381111561453a575f80fd5b84016060818703121561454b575f80fd5b9250614559602085016144ec565b91506144b5604085016144fd565b5f60208284031215614577575f80fd5b610ba182614470565b5f8060408385031215614591575f80fd5b61459a83614470565b946020939093013593505050565b5f80604083850312156145b9575f80fd5b82356001600160401b038111156145ce575f80fd5b8301608081860312156145df575f80fd5b91506145ed60208401614470565b90509250929050565b5f60208284031215614606575f80fd5b610ba1826144fd565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061464657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161468160608401826001600160401b03169052565b50608083015161469c60808401826001600160401b03169052565b5060a08301516146b760a08401826001600160401b03169052565b5060c083015161289e60c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561289e5761289e6146d2565b5f60208284031215614716575f80fd5b5051919050565b5f5b8381101561473757818101518382015260200161471f565b50505f910152565b602081525f825180602084015261475d81604085016020870161471d565b601f01601f19169190910160400192915050565b5f8261478b57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b038116811461227b575f80fd5b5f602082840312156147b4575f80fd5b8135610ba181614790565b5f808335601e198436030181126147d4575f80fd5b8301803591506001600160401b038211156147ed575f80fd5b6020019150600581901b3603821315612039575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261482c575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561486c5761486c614836565b60405290565b604051601f8201601f191681016001600160401b038111828210171561489a5761489a614836565b604052919050565b5f6001600160401b038211156148ba576148ba614836565b50601f01601f191660200190565b5f606082360312156148d8575f80fd5b6148e061484a565b8235815260206148f18185016144fd565b8183015260408401356001600160401b0381111561490d575f80fd5b840136601f82011261491d575f80fd5b803561493061492b826148a2565b614872565b8181523684838501011115614943575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f825161482c81846020870161471d565b80820180821115610b6e57610b6e6146d2565b5f63ffffffff80831681810361499b5761499b6146d2565b6001019392505050565b8082028115828204841417610b6e57610b6e6146d2565b6001600160401b0381811683821601908082111561289e5761289e6146d2565b600181811c908216806149f057607f821691505b6020821081036144e657634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614a20816149dc565b806020870152604060018084165f8114614a415760018114614a5d57614a8a565b60ff19851660408a0152604084151560051b8a01019550614a8a565b895f5260205f205f5b85811015614a815781548b8201860152908301908801614a66565b8a016040019650505b509398975050505050505050565b8051611c9881614463565b5f8060408385031215614ab4575f80fd5b82516001600160401b0380821115614aca575f80fd5b9084019060608287031215614add575f80fd5b614ae561484a565b82518152602080840151614af881614790565b82820152604084015183811115614b0d575f80fd5b80850194505087601f850112614b21575f80fd5b83519250614b3161492b846148a2565b8381528882858701011115614b44575f80fd5b614b538483830184880161471d565b80604084015250819550614b68818801614a98565b9450505050509250929050565b81810381811115610b6e57610b6e6146d2565b5f808335601e19843603018112614b9d575f80fd5b8301803591506001600160401b03821115614bb6575f80fd5b602001915036819003821315612039575f80fd5b6001600160401b03818116838216028082169190828114614bed57614bed6146d2565b505092915050565b5f6001600160401b0380831681810361499b5761499b6146d2565b5f60208284031215614c20575f80fd5b610ba1826144ec565b5f60208284031215614c39575f80fd5b813560ff81168114610ba1575f80fd5b601f821115611c6757805f5260205f20601f840160051c81016020851015614c6e5750805b601f840160051c820191505b81811015610c42575f8155600101614c7a565b81516001600160401b03811115614ca657614ca6614836565b614cba81614cb484546149dc565b84614c49565b602080601f831160018114614ced575f8415614cd65750858301515b5f19600386901b1c1916600185901b178555610d75565b5f85815260208120601f198616915b82811015614d1b57888601518255948401946001909101908401614cfc565b5085821015614d3857878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614d9d81604e86016020890161471d565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614faa380380614faa83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614e5d8061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004614475565b610561565b005b3480156101df575f80fd5b506101d26101ee3660046144b0565b61092f565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d26102383660046144c7565b610aa1565b348015610248575f80fd5b5061025c6102573660046144b0565b610b7e565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc366004614505565b610b94565b604051908152602001610215565b3480156102fa575f80fd5b506101d2610309366004614559565b610bc8565b348015610319575f80fd5b506101d2610328366004614572565b610c69565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d261037036600461459a565b610eb5565b348015610380575f80fd5b506102e161038f3660046145e8565b611339565b34801561039f575f80fd5b5061025c6103ae3660046144b0565b611352565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e0366004614475565b611366565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d26104133660046144b0565b611558565b348015610423575f80fd5b506101d2610432366004614572565b611613565b348015610442575f80fd5b506101d2610451366004614559565b6117da565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a3660046144b0565b61194c565b34801561049a575f80fd5b506101d26104a93660046144b0565b611b28565b6102e16104bc3660046144b0565b611c52565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef3660046144b0565b611c83565b6040516102159190614615565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e16105313660046144b0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614db18339815191526020526040808220815160e0810190925280545f80516020614dd183398151915293929190829060ff1660038111156105ae576105ae614601565b60038111156105bf576105bf614601565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611c83565b905060028351600381111561064c5761064c614601565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b6003815160058111156106ac576106ac614601565b036106ca5760405163a36c527f60e01b815260040160405180910390fd5b5f878152600585810160205260408220805460ff1916600317905582518291600291908111156106fc576106fc614601565b03610775578715610714576107118488611d4b565b91505b5f8560600151846080015161072991906146d8565b90506107358582611ecf565b505f8b8152600589016020526040902060020180546001600160401b03909216600160c01b026001600160c01b03909216919091179055504290506107c6565b50505f82815260088501602090815260408083205460608501518b855260058901909352922060020180546001600160c01b0316600160c01b6001600160401b039384160217905560c08301519116905b84608001516001600160401b0316816001600160401b031611156108b557600386015460608601516001600160a01b039091169063778c06b59061080990611339565b60a086015160808901516040516001600160e01b031960e086901b16815260048101939093526001600160401b039182166024840152811660448301528085166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610880573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a491906146f8565b5f8a81526006880160205260409020555b6004835160058111156108ca576108ca614601565b036108e3576108d889612026565b505050505050505050565b6040516001600160401b038216815284908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906020015b60405180910390a3505050505050505050565b5f8181525f80516020614e318339815191526020526040808220815160e0810190925280545f80516020614df183398151915293929190829060ff16600581111561097c5761097c614601565b600581111561098d5761098d614601565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109fc576109fc614601565b14610a1a5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a3f8584606001515f61220d565b6040518263ffffffff1660e01b8152600401610a5b9190614731565b6020604051808303815f875af1158015610a77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9b91906146f8565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aea575080546001600160401b03808416911610155b15610b085760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b328361225c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b8e64e8d4a5100083614763565b92915050565b5f610b9d612270565b610ba9848484346122a7565b9050610bc160015f80516020614e1183398151915255565b9392505050565b5f80516020614dd18339815191525f80610be18461244d565b91509150610bee826126eb565b610bf85750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c2757610c27614601565b03610c4c575f83815260078501602052604081208054919055610c4a8282612726565b505b610c6281610c5d8460400151611339565b612784565b5050505050565b5f8181525f80516020614db18339815191526020526040808220815160e0810190925280545f80516020614dd183398151915293929190829060ff166003811115610cb657610cb6614601565b6003811115610cc757610cc7614601565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610d3d82611c83565b9050600183516003811115610d5457610d54614601565b14610d725760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610d8757610d87614601565b03610d9d57610d9585612026565b505050505050565b5f610da787612797565b90505f80610db88360400151612897565b5091509150818514610ddd57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610e165750806001600160401b03168660a001516001600160401b0316115b15610e3457604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910161091c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614df18339815191529060ff1615610f0757604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6e91906146f8565b836020013514610f915760405163d040949d60e01b815260040160405180910390fd5b30610fa26060850160408601614796565b6001600160a01b031614610fc95760405163e6c4247b60e01b815260040160405180910390fd5b5f610fd760608501856147b1565b905090505f805b828163ffffffff161015611283575f610ffa60608801886147b1565b8363ffffffff16818110611010576110106147f6565b9050602002810190611022919061480a565b61102b906148ba565b80515f818152600888016020526040902054919250901561105f57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161108e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526110a891614951565b602060405180830381855afa1580156110c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110e691906146f8565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561117257611172614601565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611225911686614962565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061127c90614975565b9050610fde565b50600483018190555f61129585612797565b90505f6112a58260400151612ad5565b90505f6112b188612c4a565b9050816002826040516112c49190614951565b602060405180830381855afa1580156112df573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061130291906146f8565b1461132057604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610b8e6001600160401b03831664e8d4a51000614997565b5f61135c82611c83565b6080015192915050565b5f80516020614dd18339815191525f61137e856130e3565b9050611389856126eb565b611394575050505050565b5f8581526004830160205260409020546001600160a01b031633146113cc5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516113fb91600160b01b90046001600160401b0316906149ae565b6001600160401b03168160c001516001600160401b03161015611431576040516302336bad60e51b815260040160405180910390fd5b8315610c62575f6114428685611d4b565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061149290611339565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611508573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c91906146f8565b5f8781526007850160205260408120805490919061154b908490614962565b9091555050505050505050565b5f80516020614dd18339815191525f61157083611c83565b905060048151600581111561158757611587614601565b146115a55760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146115dd5760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610a9b906001600160a01b031682612726565b61161b612270565b5f8181525f80516020614db18339815191526020526040808220815160e0810190925280545f80516020614dd183398151915293929190829060ff16600381111561166857611668614601565b600381111561167957611679614601565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156116f2576116f2614601565b146117105760405163f95c7fe160e01b815260040160405180910390fd5b600461171f8260400151611c83565b51600581111561173157611731614601565b146117b5575f61174085612797565b90505f806117518360400151612897565b50915091508184604001511461177a57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156117b157604051633ab3447f60e11b815260040160405180910390fd5b5050505b6117be83612026565b50506117d660015f80516020614e1183398151915255565b5050565b5f80516020614df18339815191525f6117f283612797565b90505f806118038360400151613320565b915091508061182557604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461183f906149ce565b90505f0361186057604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561188657611886614601565b146118a45760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206118bc916143ca565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614db18339815191526020526040808220815160e0810190925280545f80516020614dd183398151915293929190829060ff16600381111561199957611999614601565b60038111156119aa576119aa614601565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a2357611a23614601565b14158015611a445750600381516003811115611a4157611a41614601565b14155b15611a625760405163f95c7fe160e01b815260040160405180910390fd5b5f611a708260400151611c83565b905080606001516001600160401b03165f03611a9f57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611acc84604001518460600151856080015161220d565b6040518263ffffffff1660e01b8152600401611ae89190614731565b6020604051808303815f875af1158015611b04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6291906146f8565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614df18339815191529190611b6f906149ce565b90505f03611b9057604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611bb657611bb6614601565b14611bd45760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c0d9190600401614a00565b6020604051808303815f875af1158015611c29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4d91906146f8565b505050565b5f611c5b612270565b611c668233346134c4565b9050611c7e60015f80516020614e1183398151915255565b919050565b611c8b614401565b5f8281525f80516020614e31833981519152602052604090819020815160e0810190925280545f80516020614df1833981519152929190829060ff166005811115611cd857611cd8614601565b6005811115611ce957611ce9614601565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d96573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611dbd9190810190614a95565b9150915080611ddf57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e4691906146f8565b825114611e665760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611e925760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ea18460400151613788565b91509150818714611ec557604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e31833981519152602052604081206002015481905f80516020614df183398151915290600160801b90046001600160401b0316611f178582613963565b5f611f2187613b2c565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611f718a858b61220d565b6040518263ffffffff1660e01b8152600401611f8d9190614731565b6020604051808303815f875af1158015611fa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcd91906146f8565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f80516020614db18339815191526020526040808220815160e0810190925280545f80516020614dd183398151915293929190829060ff16600381111561207357612073614601565b600381111561208457612084614601565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156121b2575f8481526004870160205260409020546127109061216490600160a01b900461ffff1685614997565b61216e9190614763565b915081866007015f8681526020019081526020015f205f8282546121929190614962565b909155506121a290508284614b67565b90506121b2856020015182612726565b6121c78560200151610c5d8760600151611339565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612264613ba1565b61226d81613bec565b50565b5f80516020614e118339815191528054600119016122a157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614dd183398151915290600160401b900461ffff90811690861610806122fb575061271061ffff8616115b156123195760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561234b576040516302336bad60e51b815260040160405180910390fd5b805483108061235d5750806001015483115b1561237b57604051630103be3b60e21b815260040160405180910390fd5b825f61238682610b7e565b90505f6123938983613c5a565b905060405180606001604052806123a73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e1183398151915255565b5f612456614401565b5f80516020614df18339815191525f61246e85612797565b90505f8061247f8360400151613320565b9150915080156124a257604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156124d3576124d3614601565b60058111156124e4576124e4614601565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561255357612553614601565b14158015612574575060018151600581111561257157612571614601565b14155b156125925760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156125a7576125a7614601565b036125b557600481526125ba565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156125ff576125ff614601565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156126b3576126b3614601565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612772575f80fd5b505af1158015610d95573d5f803e3d5ffd5b6117d66001600160a01b03831682614044565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156127fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128229190810190614a95565b915091508061284457604051636b2f19e960e01b815260040160405180910390fd5b8151156128645760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156128905760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146128bc57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561290b576128d3816001614b67565b6128de906008614997565b61ffff168682815181106128f4576128f46147f6565b016020015160f81c901b91909117906001016128bf565b5061ffff81161561292f5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561298a57612946816003614b67565b612951906008614997565b63ffffffff1687612963836002614962565b81518110612973576129736147f6565b016020015160f81c901b9190911790600101612932565b5063ffffffff81166004146129b257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a07576129c981601f614b67565b6129d4906008614997565b886129e0836006614962565b815181106129f0576129f06147f6565b016020015160f81c901b91909117906001016129b5565b505f805b6008811015612a6657612a1f816007614b67565b612a2a906008614997565b6001600160401b031689612a3f836026614962565b81518110612a4f57612a4f6147f6565b016020015160f81c901b9190911790600101612a0b565b505f805b6008811015612ac557612a7e816007614b67565b612a89906008614997565b6001600160401b03168a612a9e83602e614962565b81518110612aae57612aae6147f6565b016020015160f81c901b9190911790600101612a6a565b5091989097509095509350505050565b5f8151602614612af857604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b4757612b0f816001614b67565b612b1a906008614997565b61ffff16848281518110612b3057612b306147f6565b016020015160f81c901b9190911790600101612afb565b5061ffff811615612b6b5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612bc657612b82816003614b67565b612b8d906008614997565b63ffffffff1685612b9f836002614962565b81518110612baf57612baf6147f6565b016020015160f81c901b9190911790600101612b6e565b5063ffffffff811615612bec57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c4157612c0381601f614b67565b612c0e906008614997565b86612c1a836006614962565b81518110612c2a57612c2a6147f6565b016020015160f81c901b9190911790600101612bef565b50949350505050565b60605f612c59838301846147b1565b612c6591506058614997565b612c7090605c614962565b6001600160401b03811115612c8757612c87614828565b6040519080825280601f01601f191660200182016040528015612cb1576020820181803683370190505b5090505f5b6020811015612d065783358160208110612cd257612cd26147f6565b1a60f81b828281518110612ce857612ce86147f6565b60200101906001600160f81b03191690815f1a905350600101612cb6565b505f5b6020811015612d665783602001358160208110612d2857612d286147f6565b1a60f81b82612d38836020614962565b81518110612d4857612d486147f6565b60200101906001600160f81b03191690815f1a905350600101612d09565b505f5b6004811015612dc957612d7d816003614b67565b612d88906008614997565b6014901c60f81b82612d9b836040614962565b81518110612dab57612dab6147f6565b60200101906001600160f81b03191690815f1a905350600101612d69565b505f612ddb6060850160408601614796565b60601b90505f5b6014811015612e3b57818160148110612dfd57612dfd6147f6565b1a60f81b83612e0d836044614962565b81518110612e1d57612e1d6147f6565b60200101906001600160f81b03191690815f1a905350600101612de2565b505f612e4a60608601866147b1565b905090505f5b6004811015612eb557612e64816003614b67565b612e6f906008614997565b63ffffffff8316901c60f81b84612e87836058614962565b81518110612e9757612e976147f6565b60200101906001600160f81b03191690815f1a905350600101612e50565b505f5b612ec560608701876147b1565b90508110156130d9575f612eda826058614997565b612ee590605c614962565b90505f5b6020811015612f7057612eff60608901896147b1565b84818110612f0f57612f0f6147f6565b9050602002810190612f21919061480a565b358160208110612f3357612f336147f6565b1a60f81b86612f428385614962565b81518110612f5257612f526147f6565b60200101906001600160f81b03191690815f1a905350600101612ee9565b505f5b600881101561302557612f87816007614b67565b612f92906008614997565b612f9f60608a018a6147b1565b85818110612faf57612faf6147f6565b9050602002810190612fc1919061480a565b612fd29060408101906020016145e8565b6001600160401b0316901c60f81b8682612fed856020614962565b612ff79190614962565b81518110613007576130076147f6565b60200101906001600160f81b03191690815f1a905350600101612f73565b505f5b60308110156130cf5761303e60608901896147b1565b8481811061304e5761304e6147f6565b9050602002810190613060919061480a565b61306e906040810190614b7a565b8281811061307e5761307e6147f6565b9050013560f81c60f81b86828460286130979190614962565b6130a19190614962565b815181106130b1576130b16147f6565b60200101906001600160f81b03191690815f1a905350600101613028565b5050600101612eb8565b5091949350505050565b6130eb614401565b5f8281525f80516020614e318339815191526020526040808220815160e0810190925280545f80516020614df183398151915293929190829060ff16600581111561313857613138614601565b600581111561314957613149614601565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131bb576131bb614601565b146131d95760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561321d5761321d614601565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132c98582611ecf565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461334457604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133935761335b816001614b67565b613366906008614997565b61ffff1685828151811061337c5761337c6147f6565b016020015160f81c901b9190911790600101613347565b5061ffff8116156133b75760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613412576133ce816003614b67565b6133d9906008614997565b63ffffffff16866133eb836002614962565b815181106133fb576133fb6147f6565b016020015160f81c901b91909117906001016133ba565b5063ffffffff811660031461343a57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561348f5761345181601f614b67565b61345c906008614997565b87613468836006614962565b81518110613478576134786147f6565b016020015160f81c901b919091179060010161343d565b505f866026815181106134a4576134a46147f6565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614dd1833981519152816134dd84610b7e565b90505f6134e987611c83565b90506134f4876126eb565b61351157604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561352657613526614601565b146135445760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161355591906149ae565b905083600201600a9054906101000a90046001600160401b0316826040015161357e9190614bbc565b6001600160401b0316816001600160401b031611156135b057604051630c192e7760e41b815260040160405180910390fd5b5f806135bc8a84611ecf565b915091505f8a836040516020016135ea92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561367d5761367d614601565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146137ac57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137fb576137c3816001614b67565b6137ce906008614997565b61ffff168582815181106137e4576137e46147f6565b016020015160f81c901b91909117906001016137af565b5061ffff81161561381f5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561387a57613836816003614b67565b613841906008614997565b63ffffffff1686613853836002614962565b81518110613863576138636147f6565b016020015160f81c901b9190911790600101613822565b5063ffffffff81166005146138a257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138f7576138b981601f614b67565b6138c4906008614997565b876138d0836006614962565b815181106138e0576138e06147f6565b016020015160f81c901b91909117906001016138a5565b505f805b60088110156139565761390f816007614b67565b61391a906008614997565b6001600160401b03168861392f836026614962565b8151811061393f5761393f6147f6565b016020015160f81c901b91909117906001016138fb565b5090969095509350505050565b5f80516020614df18339815191525f6001600160401b0380841690851611156139975761399083856146d8565b90506139a4565b6139a184846146d8565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a06575060018401548151613a02916001600160401b031690614962565b8210155b15613a2c576001600160401b038316606082015281815260408101516020820152613a4b565b8281606001818151613a3e91906149ae565b6001600160401b03169052505b6060810151613a5b906064614bbc565b602082015160018601546001600160401b039290921691613a869190600160401b900460ff16614997565b1015613aa55760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613ac09190614962565b9052506040810180516001600160401b0387169190613ae0908390614b67565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e318339815191526020526040812060020180545f80516020614df18339815191529190600890613b7690600160401b90046001600160401b0316614be7565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613bea57604051631afcd79f60e31b815260040160405180910390fd5b565b613bf4613ba1565b613bfd816140db565b613c056140f4565b61226d60608201356080830135613c2260c0850160a086016145e8565b613c3260e0860160c08701614c02565b613c43610100870160e08801614c1b565b613c5561012088016101008901614796565b614104565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613c9e57604051637fab81e560e01b815260040160405180910390fd5b5f80516020614df183398151915242613cbd60408601602087016145e8565b6001600160401b0316111580613cf75750613cdb6202a30042614962565b613ceb60408601602087016145e8565b6001600160401b031610155b15613d145760405162d36c8560e81b815260040160405180910390fd5b6030613d236040860186614b7a565b9050141580613d3157508335155b15613d4f5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613d7f57604051630eb0d31360e11b815260040160405180910390fd5b613d89835f613963565b5f80613e226040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613dcd91906145e8565b6001600160401b03168152602001613de860408a018a614b7a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614225565b5f82815260068601602052604090209193509150613e408282614c7f565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613e7e908590600401614731565b6020604051808303815f875af1158015613e9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ebe91906146f8565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613f3657613f36614601565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614016918e01908e016145e8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561406b5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146140b4576040519150601f19603f3d011682016040523d82523d5f602084013e6140b9565b606091505b5050905080611c4d57604051630a12f52160e11b815260040160405180910390fd5b6140e3613ba1565b6140eb6142e8565b61226d816142f0565b6140fc613ba1565b613bea6143c2565b61410c613ba1565b5f80516020614dd183398151915261ffff84161580614130575061271061ffff8516115b1561414e5760405163c98d73a760e01b815260040160405180910390fd5b8587111561416f57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806141825750600a60ff8416115b156141a0576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461424e57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016142809796959493929190614d3a565b60405160208183030381529060405290506002816040516142a19190614951565b602060405180830381855afa1580156142bc573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142df91906146f8565b94909350915050565b613bea613ba1565b6142f8613ba1565b80355f80516020614df1833981519152908155601461431d6060840160408501614c1b565b60ff16118061433c57506143376060830160408401614c1b565b60ff16155b1561435a5760405163b4fa3fb360e01b815260040160405180910390fd5b61436a6060830160408401614c1b565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561439b60408301602084016145e8565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61243a613ba1565b5080546143d6906149ce565b5f825580601f106143e5575050565b601f0160209004905f5260205f209081019061226d919061443d565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614451575f815560010161443e565b5090565b801515811461226d575f80fd5b803563ffffffff81168114611c7e575f80fd5b5f805f60608486031215614487575f80fd5b83359250602084013561449981614455565b91506144a760408501614462565b90509250925092565b5f602082840312156144c0575f80fd5b5035919050565b5f61012082840312156144d8575f80fd5b50919050565b803561ffff81168114611c7e575f80fd5b80356001600160401b0381168114611c7e575f80fd5b5f805f60608486031215614517575f80fd5b83356001600160401b0381111561452c575f80fd5b84016060818703121561453d575f80fd5b925061454b602085016144de565b91506144a7604085016144ef565b5f60208284031215614569575f80fd5b610bc182614462565b5f8060408385031215614583575f80fd5b61458c83614462565b946020939093013593505050565b5f80604083850312156145ab575f80fd5b82356001600160401b038111156145c0575f80fd5b8301608081860312156145d1575f80fd5b91506145df60208401614462565b90509250929050565b5f602082840312156145f8575f80fd5b610bc1826144ef565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061463857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161467360608401826001600160401b03169052565b50608083015161468e60808401826001600160401b03169052565b5060a08301516146a960a08401826001600160401b03169052565b5060c083015161289060c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612890576128906146c4565b5f60208284031215614708575f80fd5b5051919050565b5f5b83811015614729578181015183820152602001614711565b50505f910152565b602081525f825180602084015261474f81604085016020870161470f565b601f01601f19169190910160400192915050565b5f8261477d57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b038116811461226d575f80fd5b5f602082840312156147a6575f80fd5b8135610bc181614782565b5f808335601e198436030181126147c6575f80fd5b8301803591506001600160401b038211156147df575f80fd5b6020019150600581901b360382131561201f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261481e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561485e5761485e614828565b60405290565b604051601f8201601f191681016001600160401b038111828210171561488c5761488c614828565b604052919050565b5f6001600160401b038211156148ac576148ac614828565b50601f01601f191660200190565b5f606082360312156148ca575f80fd5b6148d261483c565b8235815260206148e38185016144ef565b8183015260408401356001600160401b038111156148ff575f80fd5b840136601f82011261490f575f80fd5b803561492261491d82614894565b614864565b8181523684838501011115614935575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f825161481e81846020870161470f565b80820180821115610b8e57610b8e6146c4565b5f63ffffffff80831681810361498d5761498d6146c4565b6001019392505050565b8082028115828204841417610b8e57610b8e6146c4565b6001600160401b03818116838216019080821115612890576128906146c4565b600181811c908216806149e257607f821691505b6020821081036144d857634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614a12816149ce565b806020870152604060018084165f8114614a335760018114614a4f57614a7c565b60ff19851660408a0152604084151560051b8a01019550614a7c565b895f5260205f205f5b85811015614a735781548b8201860152908301908801614a58565b8a016040019650505b509398975050505050505050565b8051611c7e81614455565b5f8060408385031215614aa6575f80fd5b82516001600160401b0380821115614abc575f80fd5b9084019060608287031215614acf575f80fd5b614ad761483c565b82518152602080840151614aea81614782565b82820152604084015183811115614aff575f80fd5b80850194505087601f850112614b13575f80fd5b83519250614b2361491d84614894565b8381528882858701011115614b36575f80fd5b614b458483830184880161470f565b80604084015250819550614b5a818801614a8a565b9450505050509250929050565b81810381811115610b8e57610b8e6146c4565b5f808335601e19843603018112614b8f575f80fd5b8301803591506001600160401b03821115614ba8575f80fd5b60200191503681900382131561201f575f80fd5b6001600160401b03818116838216028082169190828114614bdf57614bdf6146c4565b505092915050565b5f6001600160401b0380831681810361498d5761498d6146c4565b5f60208284031215614c12575f80fd5b610bc1826144de565b5f60208284031215614c2b575f80fd5b813560ff81168114610bc1575f80fd5b601f821115611c4d57805f5260205f20601f840160051c81016020851015614c605750805b601f840160051c820191505b81811015610c62575f8155600101614c6c565b81516001600160401b03811115614c9857614c98614828565b614cac81614ca684546149ce565b84614c3b565b602080601f831160018114614cdf575f8415614cc85750858301515b5f19600386901b1c1916600185901b178555610d95565b5f85815260208120601f198616915b82811015614d0d57888601518255948401946001909101908401614cee565b5085821015614d2a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614d8f81604e86016020890161470f565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 8bf777cae..572a99c3d 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -373,43 +373,31 @@ abstract contract PoSValidatorManager is return _completeEndDelegation(delegationID); } - // In the case where the validator has initiated ending its validation period, we can no - // longer stake, but the validator's weight may not have been removed from the p-chain yet, - // so we have to wait for confirmation that the validator has been removed before returning the stake. - uint64 delegatorStartTime; - if (validator.status == ValidatorStatus.PendingRemoved) { - delegatorStartTime = validator.endedAt; - } else { - // Validator Active case - - // Unpack the Warp message - WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); - (bytes32 messageValidationID, uint64 nonce,) = - ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); + // Unpack the Warp message + WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); + (bytes32 messageValidationID, uint64 nonce,) = + ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); - if (validationID != messageValidationID) { - revert InvalidValidationID(); - } - - // The received nonce should be no greater than the highest sent nonce, and at least as high as - // the delegation's starting nonce. This allows a weight update using a higher nonce - // (which implicitly includes the delegation's weight update) to be used to complete delisting - // for an earlier delegation. This is necessary because the P-Chain is only willing to sign the latest weight update. - if (validator.messageNonce < nonce || delegator.startingNonce > nonce) { - revert InvalidNonce(); - } + if (validationID != messageValidationID) { + revert InvalidValidationID(); + } - delegatorStartTime = uint64(block.timestamp); + // The received nonce should be no greater than the highest sent nonce, and at least as high as + // the delegation's starting nonce. This allows a weight update using a higher nonce + // (which implicitly includes the delegation's weight update) to be used to complete delisting + // for an earlier delegation. This is necessary because the P-Chain is only willing to sign the latest weight update. + if (validator.messageNonce < nonce || delegator.startingNonce > nonce) { + revert InvalidNonce(); } // Update the delegation status $._delegatorStakes[delegationID].status = DelegatorStatus.Active; - $._delegatorStakes[delegationID].startedAt = delegatorStartTime; + $._delegatorStakes[delegationID].startedAt = uint64(block.timestamp); emit DelegatorRegistered({ delegationID: delegationID, validationID: validationID, - startTime: delegatorStartTime + startTime: uint64(block.timestamp) }); } @@ -464,15 +452,18 @@ abstract contract PoSValidatorManager is delegationEndTime = validator.endedAt; } - $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward({ - stakeAmount: weightToValue(delegator.weight), - validatorStartTime: validator.startedAt, - stakingStartTime: delegator.startedAt, - stakingEndTime: delegationEndTime, - uptimeSeconds: validatorUptimeSeconds, - initialSupply: 0, - endSupply: 0 - }); + // Only give rewards in the case that the delegation started before the validator exited. + if (delegationEndTime > delegator.startedAt) { + $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward({ + stakeAmount: weightToValue(delegator.weight), + validatorStartTime: validator.startedAt, + stakingStartTime: delegator.startedAt, + stakingEndTime: delegationEndTime, + uptimeSeconds: validatorUptimeSeconds, + initialSupply: 0, + endSupply: 0 + }); + } // If the validator has been completed, we don't need any more communication with the p-chain and we can // complete processing the delegator's state now. From 9dbb1faa8ebbf54013a7f92f876aa4bc3b3afa30 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 25 Sep 2024 09:07:23 -0400 Subject: [PATCH 410/545] Rewards refactor --- .../ERC20TokenStakingManager.go | 17 ++--- .../NativeTokenStakingManager.go | 17 ++--- .../validator-manager/PoSValidatorManager.sol | 74 ++++++++++--------- .../interfaces/IPoSValidatorManager.sol | 5 +- .../tests/PoSValidatorManagerTests.t.sol | 10 +-- 5 files changed, 57 insertions(+), 66 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index b36b161aa..a2859d27f 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -82,8 +82,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161529e38038061529e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151518061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b33660046146d0565b61040d565b005b6101b86101c836600461470b565b6107db565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa36600461470b565b61094d565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b8610241366004614722565b610963565b6101b861025436600461473b565b610a04565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b8610284366004614763565b610c50565b61029c6102973660046147c7565b6110d4565b6040519081526020016101e3565b6101ff6102b836600461470b565b6110ed565b61029c5f81565b6101b86102d23660046146d0565b611101565b6101d5603081565b6101b86102ed36600461470b565b6112f3565b6101b861030036600461473b565b6113ae565b61029c6103133660046147e0565b611575565b6101b8610326366004614722565b6115a1565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f36600461470b565b611713565b6101b861037236600461470b565b6118ef565b6101d5601481565b61039261038d36600461470b565b611a19565b6040516101e39190614814565b6101ff6202a30081565b61029c6103b736600461470b565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f53660046148d4565b611ae1565b6101b861040836600461494d565b611b16565b5f8381525f805160206150858339815191526020526040808220815160e0810190925280545f805160206150c583398151915293929190829060ff16600381111561045a5761045a614800565b600381111561046b5761046b614800565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e182611a19565b90506002835160038111156104f8576104f8614800565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b60038151600581111561055857610558614800565b036105765760405163a36c527f60e01b815260040160405180910390fd5b5f878152600585810160205260408220805460ff1916600317905582518291600291908111156105a8576105a8614800565b036106215787156105c0576105bd8488611bf5565b91505b5f856060015184608001516105d5919061499f565b90506105e18582611d79565b505f8b8152600589016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905550429050610672565b50505f82815260088501602090815260408083205460608501518b855260058901909352922060020180546001600160c01b0316600160c01b6001600160401b039384160217905560c08301519116905b84608001516001600160401b0316816001600160401b0316111561076157600386015460608601516001600160a01b039091169063778c06b5906106b5906110d4565b60a086015160808901516040516001600160e01b031960e086901b16815260048101939093526001600160401b039182166024840152811660448301528085166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561072c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075091906149bf565b5f8a81526006880160205260409020555b60048351600581111561077657610776614800565b0361078f5761078489611ed0565b505050505050505050565b6040516001600160401b038216815284908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906020015b60405180910390a3505050505050505050565b5f8181525f805160206151258339815191526020526040808220815160e0810190925280545f805160206150e583398151915293929190829060ff16600581111561082857610828614800565b600581111561083957610839614800565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108a8576108a8614800565b146108c65760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6108eb8584606001515f6120b7565b6040518263ffffffff1660e01b815260040161090791906149f8565b6020604051808303815f875af1158015610923573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094791906149bf565b50505050565b5f61095d64e8d4a5100083614a2a565b92915050565b5f805160206150c58339815191525f8061097c8461210e565b91509150610989826123ac565b6109935750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156109c2576109c2614800565b036109e7575f838152600785016020526040812080549190556109e582826123e7565b505b6109fd816109f884604001516110d4565b61245d565b5050505050565b5f8181525f805160206150858339815191526020526040808220815160e0810190925280545f805160206150c583398151915293929190829060ff166003811115610a5157610a51614800565b6003811115610a6257610a62614800565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610ad882611a19565b9050600183516003811115610aef57610aef614800565b14610b0d5760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610b2257610b22614800565b03610b3857610b3085611ed0565b505050505050565b5f610b4287612480565b90505f80610b538360400151612580565b5091509150818514610b7857604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610bb15750806001600160401b03168660a001516001600160401b0316115b15610bcf57604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f691016107c8565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206150e58339815191529060ff1615610ca257604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ce5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d0991906149bf565b836020013514610d2c5760405163d040949d60e01b815260040160405180910390fd5b30610d3d6060850160408601614a49565b6001600160a01b031614610d645760405163e6c4247b60e01b815260040160405180910390fd5b5f610d726060850185614a64565b905090505f805b828163ffffffff16101561101e575f610d956060880188614a64565b8363ffffffff16818110610dab57610dab614aa9565b9050602002810190610dbd9190614abd565b610dc690614b6d565b80515f8181526008880160205260409020549192509015610dfa57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610e2992919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610e4391614c04565b602060405180830381855afa158015610e5e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610e8191906149bf565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610f0d57610f0d614800565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610fc0911686614c15565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061101790614c28565b9050610d79565b50600483018190555f61103085612480565b90505f61104082604001516127be565b90505f61104c88612933565b90508160028260405161105f9190614c04565b602060405180830381855afa15801561107a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061109d91906149bf565b146110bb57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61095d6001600160401b03831664e8d4a51000614c4a565b5f6110f782611a19565b6080015192915050565b5f805160206150c58339815191525f61111985612dcc565b9050611124856123ac565b61112f575050505050565b5f8581526004830160205260409020546001600160a01b031633146111675760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161119691600160b01b90046001600160401b031690614c61565b6001600160401b03168160c001516001600160401b031610156111cc576040516302336bad60e51b815260040160405180910390fd5b83156109fd575f6111dd8685611bf5565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061122d906110d4565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156112a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112c791906149bf565b5f878152600785016020526040812080549091906112e6908490614c15565b9091555050505050505050565b5f805160206150c58339815191525f61130b83611a19565b905060048151600581111561132257611322614800565b146113405760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146113785760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610947906001600160a01b0316826123e7565b6113b6613009565b5f8181525f805160206150858339815191526020526040808220815160e0810190925280545f805160206150c583398151915293929190829060ff16600381111561140357611403614800565b600381111561141457611414614800565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561148d5761148d614800565b146114ab5760405163f95c7fe160e01b815260040160405180910390fd5b60046114ba8260400151611a19565b5160058111156114cc576114cc614800565b14611550575f6114db85612480565b90505f806114ec8360400151612580565b50915091508184604001511461151557604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561154c57604051633ab3447f60e11b815260040160405180910390fd5b5050505b61155983611ed0565b505061157160015f8051602061510583398151915255565b5050565b5f61157e613009565b611589833384613053565b905061095d60015f8051602061510583398151915255565b5f805160206150e58339815191525f6115b983612480565b90505f806115ca836040015161331a565b91509150806115ec57604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461160690614c81565b90505f0361162757604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561164d5761164d614800565b1461166b5760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061168391614620565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206150858339815191526020526040808220815160e0810190925280545f805160206150c583398151915293929190829060ff16600381111561176057611760614800565b600381111561177157611771614800565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156117ea576117ea614800565b1415801561180b575060038151600381111561180857611808614800565b14155b156118295760405163f95c7fe160e01b815260040160405180910390fd5b5f6118378260400151611a19565b905080606001516001600160401b03165f0361186657604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6118938460400151846060015185608001516120b7565b6040518263ffffffff1660e01b81526004016118af91906149f8565b6020604051808303815f875af11580156118cb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109fd91906149bf565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206150e5833981519152919061193690614c81565b90505f0361195757604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561197d5761197d614800565b1461199b5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119d49190600401614cb9565b6020604051808303815f875af11580156119f0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a1491906149bf565b505050565b611a21614657565b5f8281525f80516020615125833981519152602052604090819020815160e0810190925280545f805160206150e5833981519152929190829060ff166005811115611a6e57611a6e614800565b6005811115611a7f57611a7f614800565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611aea613009565b611af6858585856134be565b9050611b0e60015f8051602061510583398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611b5f575080546001600160401b03808416911610155b15611b7d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611ba8848461365c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c40573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c679190810190614d4e565b9150915080611c8957604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ccc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf091906149bf565b825114611d105760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d3c5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d4b8460400151613676565b91509150818714611d6f57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615125833981519152602052604081206002015481905f805160206150e583398151915290600160801b90046001600160401b0316611dc18582613851565b5f611dcb87613a1a565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e1b8a858b6120b7565b6040518263ffffffff1660e01b8152600401611e3791906149f8565b6020604051808303815f875af1158015611e53573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e7791906149bf565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f805160206150858339815191526020526040808220815160e0810190925280545f805160206150c583398151915293929190829060ff166003811115611f1d57611f1d614800565b6003811115611f2e57611f2e614800565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870190915290812080549082905592935090919080821561205c575f8481526004870160205260409020546127109061200e90600160a01b900461ffff1685614c4a565b6120189190614a2a565b915081866007015f8681526020019081526020015f205f82825461203c9190614c15565b9091555061204c90508284614e20565b905061205c8560200151826123e7565b61207185602001516109f887606001516110d4565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f612117614657565b5f805160206150e58339815191525f61212f85612480565b90505f80612140836040015161331a565b91509150801561216357604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561219457612194614800565b60058111156121a5576121a5614800565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561221457612214614800565b14158015612235575060018151600581111561223257612232614800565b14155b156122535760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561226857612268614800565b03612276576004815261227b565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156122c0576122c0614800565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561237457612374614800565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206150a583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612442575f80fd5b505af1158015612454573d5f803e3d5ffd5b50505050505050565b5f805160206150a583398151915254611571906001600160a01b03168383613a8f565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156124e4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261250b9190810190614d4e565b915091508061252d57604051636b2f19e960e01b815260040160405180910390fd5b81511561254d5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156125795760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146125a557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156125f4576125bc816001614e20565b6125c7906008614c4a565b61ffff168682815181106125dd576125dd614aa9565b016020015160f81c901b91909117906001016125a8565b5061ffff8116156126185760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156126735761262f816003614e20565b61263a906008614c4a565b63ffffffff168761264c836002614c15565b8151811061265c5761265c614aa9565b016020015160f81c901b919091179060010161261b565b5063ffffffff811660041461269b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156126f0576126b281601f614e20565b6126bd906008614c4a565b886126c9836006614c15565b815181106126d9576126d9614aa9565b016020015160f81c901b919091179060010161269e565b505f805b600881101561274f57612708816007614e20565b612713906008614c4a565b6001600160401b031689612728836026614c15565b8151811061273857612738614aa9565b016020015160f81c901b91909117906001016126f4565b505f805b60088110156127ae57612767816007614e20565b612772906008614c4a565b6001600160401b03168a61278783602e614c15565b8151811061279757612797614aa9565b016020015160f81c901b9190911790600101612753565b5091989097509095509350505050565b5f81516026146127e157604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612830576127f8816001614e20565b612803906008614c4a565b61ffff1684828151811061281957612819614aa9565b016020015160f81c901b91909117906001016127e4565b5061ffff8116156128545760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156128af5761286b816003614e20565b612876906008614c4a565b63ffffffff1685612888836002614c15565b8151811061289857612898614aa9565b016020015160f81c901b9190911790600101612857565b5063ffffffff8116156128d557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561292a576128ec81601f614e20565b6128f7906008614c4a565b86612903836006614c15565b8151811061291357612913614aa9565b016020015160f81c901b91909117906001016128d8565b50949350505050565b60605f61294283830184614a64565b61294e91506058614c4a565b61295990605c614c15565b6001600160401b0381111561297057612970614adb565b6040519080825280601f01601f19166020018201604052801561299a576020820181803683370190505b5090505f5b60208110156129ef57833581602081106129bb576129bb614aa9565b1a60f81b8282815181106129d1576129d1614aa9565b60200101906001600160f81b03191690815f1a90535060010161299f565b505f5b6020811015612a4f5783602001358160208110612a1157612a11614aa9565b1a60f81b82612a21836020614c15565b81518110612a3157612a31614aa9565b60200101906001600160f81b03191690815f1a9053506001016129f2565b505f5b6004811015612ab257612a66816003614e20565b612a71906008614c4a565b6014901c60f81b82612a84836040614c15565b81518110612a9457612a94614aa9565b60200101906001600160f81b03191690815f1a905350600101612a52565b505f612ac46060850160408601614a49565b60601b90505f5b6014811015612b2457818160148110612ae657612ae6614aa9565b1a60f81b83612af6836044614c15565b81518110612b0657612b06614aa9565b60200101906001600160f81b03191690815f1a905350600101612acb565b505f612b336060860186614a64565b905090505f5b6004811015612b9e57612b4d816003614e20565b612b58906008614c4a565b63ffffffff8316901c60f81b84612b70836058614c15565b81518110612b8057612b80614aa9565b60200101906001600160f81b03191690815f1a905350600101612b39565b505f5b612bae6060870187614a64565b9050811015612dc2575f612bc3826058614c4a565b612bce90605c614c15565b90505f5b6020811015612c5957612be86060890189614a64565b84818110612bf857612bf8614aa9565b9050602002810190612c0a9190614abd565b358160208110612c1c57612c1c614aa9565b1a60f81b86612c2b8385614c15565b81518110612c3b57612c3b614aa9565b60200101906001600160f81b03191690815f1a905350600101612bd2565b505f5b6008811015612d0e57612c70816007614e20565b612c7b906008614c4a565b612c8860608a018a614a64565b85818110612c9857612c98614aa9565b9050602002810190612caa9190614abd565b612cbb9060408101906020016147c7565b6001600160401b0316901c60f81b8682612cd6856020614c15565b612ce09190614c15565b81518110612cf057612cf0614aa9565b60200101906001600160f81b03191690815f1a905350600101612c5c565b505f5b6030811015612db857612d276060890189614a64565b84818110612d3757612d37614aa9565b9050602002810190612d499190614abd565b612d57906040810190614e33565b82818110612d6757612d67614aa9565b9050013560f81c60f81b8682846028612d809190614c15565b612d8a9190614c15565b81518110612d9a57612d9a614aa9565b60200101906001600160f81b03191690815f1a905350600101612d11565b5050600101612ba1565b5091949350505050565b612dd4614657565b5f8281525f805160206151258339815191526020526040808220815160e0810190925280545f805160206150e583398151915293929190829060ff166005811115612e2157612e21614800565b6005811115612e3257612e32614800565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612ea457612ea4614800565b14612ec25760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612f0657612f06614800565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612fb28582611d79565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061510583398151915280546001190161303a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061510583398151915255565b5f5f805160206150c58339815191528161306f6101fa85613aee565b90505f61307b87611a19565b9050613086876123ac565b6130a357604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156130b8576130b8614800565b146130d65760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516130e79190614c61565b905083600201600a9054906101000a90046001600160401b031682604001516131109190614e75565b6001600160401b0316816001600160401b0316111561314257604051630c192e7760e41b815260040160405180910390fd5b5f8061314e8a84611d79565b915091505f8a8360405160200161317c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561320f5761320f614800565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461333e57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561338d57613355816001614e20565b613360906008614c4a565b61ffff1685828151811061337657613376614aa9565b016020015160f81c901b9190911790600101613341565b5061ffff8116156133b15760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561340c576133c8816003614e20565b6133d3906008614c4a565b63ffffffff16866133e5836002614c15565b815181106133f5576133f5614aa9565b016020015160f81c901b91909117906001016133b4565b5063ffffffff811660031461343457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134895761344b81601f614e20565b613456906008614c4a565b87613462836006614c15565b8151811061347257613472614aa9565b016020015160f81c901b9190911790600101613437565b505f8660268151811061349e5761349e614aa9565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206150c583398151915290600160401b900461ffff9081169086161080613512575061271061ffff8616115b156135305760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613562576040516302336bad60e51b815260040160405180910390fd5b80548310806135745750806001015483115b1561359257604051630103be3b60e21b815260040160405180910390fd5b5f61359c84613aee565b90505f6135a88261094d565b90505f6135b58983613b11565b905060405180606001604052806135c93390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613664613efb565b61366d82613f46565b61157181613fb7565b5f808251602e1461369a57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136e9576136b1816001614e20565b6136bc906008614c4a565b61ffff168582815181106136d2576136d2614aa9565b016020015160f81c901b919091179060010161369d565b5061ffff81161561370d5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561376857613724816003614e20565b61372f906008614c4a565b63ffffffff1686613741836002614c15565b8151811061375157613751614aa9565b016020015160f81c901b9190911790600101613710565b5063ffffffff811660051461379057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137e5576137a781601f614e20565b6137b2906008614c4a565b876137be836006614c15565b815181106137ce576137ce614aa9565b016020015160f81c901b9190911790600101613793565b505f805b6008811015613844576137fd816007614e20565b613808906008614c4a565b6001600160401b03168861381d836026614c15565b8151811061382d5761382d614aa9565b016020015160f81c901b91909117906001016137e9565b5090969095509350505050565b5f805160206150e58339815191525f6001600160401b0380841690851611156138855761387e838561499f565b9050613892565b61388f848461499f565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806138f45750600184015481516138f0916001600160401b031690614c15565b8210155b1561391a576001600160401b038316606082015281815260408101516020820152613939565b828160600181815161392c9190614c61565b6001600160401b03169052505b6060810151613949906064614e75565b602082015160018601546001600160401b0392909216916139749190600160401b900460ff16614c4a565b10156139935760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516139ae9190614c15565b9052506040810180516001600160401b03871691906139ce908390614e20565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206151258339815191526020526040812060020180545f805160206150e58339815191529190600890613a6490600160401b90046001600160401b0316614ea0565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b03838116602483015260448201839052611a1491859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614014565b5f61095d825f805160206150a5833981519152546001600160a01b03169061407a565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613b5557604051637fab81e560e01b815260040160405180910390fd5b5f805160206150e583398151915242613b7460408601602087016147c7565b6001600160401b0316111580613bae5750613b926202a30042614c15565b613ba260408601602087016147c7565b6001600160401b031610155b15613bcb5760405162d36c8560e81b815260040160405180910390fd5b6030613bda6040860186614e33565b9050141580613be857508335155b15613c065760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613c3657604051630eb0d31360e11b815260040160405180910390fd5b613c40835f613851565b5f80613cd96040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613c8491906147c7565b6001600160401b03168152602001613c9f60408a018a614e33565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506141dc565b5f82815260068601602052604090209193509150613cf78282614eff565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613d359085906004016149f8565b6020604051808303815f875af1158015613d51573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d7591906149bf565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613ded57613ded614800565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613ecd918e01908e016147c7565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f4457604051631afcd79f60e31b815260040160405180910390fd5b565b613f4e613efb565b613f578161429f565b613f5f6142b8565b613fb460608201356080830135613f7c60c0850160a086016147c7565b613f8c60e0860160c08701614fba565b613f9d610100870160e08801614fd3565b613faf61012088016101008901614a49565b6142c8565b50565b613fbf613efb565b5f805160206150a58339815191526001600160a01b038216613ff45760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6140286001600160a01b038416836143e9565b905080515f1415801561404c57508080602001905181019061404a9190614ff3565b155b15611a1457604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156140c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e491906149bf565b90506140fb6001600160a01b0385163330866143f6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561413f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061416391906149bf565b90508181116141c95760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401614071565b6141d38282614e20565b95945050505050565b5f606082608001515160301461420557604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614237979695949392919061500e565b60405160208183030381529060405290506002816040516142589190614c04565b602060405180830381855afa158015614273573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061429691906149bf565b94909350915050565b6142a7613efb565b6142af61442f565b613fb481614437565b6142c0613efb565b613f44614509565b6142d0613efb565b5f805160206150c583398151915261ffff841615806142f4575061271061ffff8516115b156143125760405163c98d73a760e01b815260040160405180910390fd5b8587111561433357604051630103be3b60e21b815260040160405180910390fd5b60ff831615806143465750600a60ff8416115b15614364576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061210783835f614511565b6040516001600160a01b0384811660248301528381166044830152606482018390526109479186918216906323b872dd90608401613abc565b613f44613efb565b61443f613efb565b80355f805160206150e583398151915290815560146144646060840160408501614fd3565b60ff161180614483575061447e6060830160408401614fd3565b60ff16155b156144a15760405163b4fa3fb360e01b815260040160405180910390fd5b6144b16060830160408401614fd3565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556144e260408301602084016147c7565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613040613efb565b6060814710156145365760405163cd78605960e01b8152306004820152602401614071565b5f80856001600160a01b031684866040516145519190614c04565b5f6040518083038185875af1925050503d805f811461458b576040519150601f19603f3d011682016040523d82523d5f602084013e614590565b606091505b5091509150611d6f8683836060826145b0576145ab826145f7565b612107565b81511580156145c757506001600160a01b0384163b155b156145f057604051639996b31560e01b81526001600160a01b0385166004820152602401614071565b5080612107565b8051156146075780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461462c90614c81565b5f825580601f1061463b575050565b601f0160209004905f5260205f2090810190613fb49190614693565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156146a7575f8155600101614694565b5090565b8015158114613fb4575f80fd5b803563ffffffff811681146146cb575f80fd5b919050565b5f805f606084860312156146e2575f80fd5b8335925060208401356146f4816146ab565b9150614702604085016146b8565b90509250925092565b5f6020828403121561471b575f80fd5b5035919050565b5f60208284031215614732575f80fd5b612107826146b8565b5f806040838503121561474c575f80fd5b614755836146b8565b946020939093013593505050565b5f8060408385031215614774575f80fd5b82356001600160401b03811115614789575f80fd5b83016080818603121561479a575f80fd5b91506147a8602084016146b8565b90509250929050565b80356001600160401b03811681146146cb575f80fd5b5f602082840312156147d7575f80fd5b612107826147b1565b5f80604083850312156147f1575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061483757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161487260608401826001600160401b03169052565b50608083015161488d60808401826001600160401b03169052565b5060a08301516148a860a08401826001600160401b03169052565b5060c083015161257960c08401826001600160401b03169052565b803561ffff811681146146cb575f80fd5b5f805f80608085870312156148e7575f80fd5b84356001600160401b038111156148fc575f80fd5b85016060818803121561490d575f80fd5b935061491b602086016148c3565b9250614929604086016147b1565b9396929550929360600135925050565b6001600160a01b0381168114613fb4575f80fd5b5f80828403610140811215614960575f80fd5b6101208082121561496f575f80fd5b849350830135905061498081614939565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156125795761257961498b565b5f602082840312156149cf575f80fd5b5051919050565b5f5b838110156149f05781810151838201526020016149d8565b50505f910152565b602081525f8251806020840152614a168160408501602087016149d6565b601f01601f19169190910160400192915050565b5f82614a4457634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614a59575f80fd5b813561210781614939565b5f808335601e19843603018112614a79575f80fd5b8301803591506001600160401b03821115614a92575f80fd5b6020019150600581901b3603821315611ec9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614ad1575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b1157614b11614adb565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b3f57614b3f614adb565b604052919050565b5f6001600160401b03821115614b5f57614b5f614adb565b50601f01601f191660200190565b5f60608236031215614b7d575f80fd5b614b85614aef565b823581526020614b968185016147b1565b8183015260408401356001600160401b03811115614bb2575f80fd5b840136601f820112614bc2575f80fd5b8035614bd5614bd082614b47565b614b17565b8181523684838501011115614be8575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614ad18184602087016149d6565b8082018082111561095d5761095d61498b565b5f63ffffffff808316818103614c4057614c4061498b565b6001019392505050565b808202811582820484141761095d5761095d61498b565b6001600160401b038181168382160190808211156125795761257961498b565b600181811c90821680614c9557607f821691505b602082108103614cb357634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614ccb81614c81565b806020870152604060018084165f8114614cec5760018114614d0857614d35565b60ff19851660408a0152604084151560051b8a01019550614d35565b895f5260205f205f5b85811015614d2c5781548b8201860152908301908801614d11565b8a016040019650505b509398975050505050505050565b80516146cb816146ab565b5f8060408385031215614d5f575f80fd5b82516001600160401b0380821115614d75575f80fd5b9084019060608287031215614d88575f80fd5b614d90614aef565b82518152602080840151614da381614939565b82820152604084015183811115614db8575f80fd5b80850194505087601f850112614dcc575f80fd5b83519250614ddc614bd084614b47565b8381528882858701011115614def575f80fd5b614dfe848383018488016149d6565b80604084015250819550614e13818801614d43565b9450505050509250929050565b8181038181111561095d5761095d61498b565b5f808335601e19843603018112614e48575f80fd5b8301803591506001600160401b03821115614e61575f80fd5b602001915036819003821315611ec9575f80fd5b6001600160401b03818116838216028082169190828114614e9857614e9861498b565b505092915050565b5f6001600160401b03808316818103614c4057614c4061498b565b601f821115611a1457805f5260205f20601f840160051c81016020851015614ee05750805b601f840160051c820191505b818110156109fd575f8155600101614eec565b81516001600160401b03811115614f1857614f18614adb565b614f2c81614f268454614c81565b84614ebb565b602080601f831160018114614f5f575f8415614f485750858301515b5f19600386901b1c1916600185901b178555610b30565b5f85815260208120601f198616915b82811015614f8d57888601518255948401946001909101908401614f6e565b5085821015614faa57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215614fca575f80fd5b612107826148c3565b5f60208284031215614fe3575f80fd5b813560ff81168114612107575f80fd5b5f60208284031215615003575f80fd5b8151612107816146ab565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161506381604e8601602089016149d6565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161537e38038061537e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6152318061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b33660046147b0565b61040d565b005b6101b86101c83660046147eb565b61066f565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa3660046147eb565b6107e1565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b8610241366004614802565b6107f7565b6101b861025436600461481b565b610898565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b8610284366004614843565b610af2565b61029c6102973660046148a7565b610f76565b6040519081526020016101e3565b6101ff6102b83660046147eb565b610f8f565b61029c5f81565b6101b86102d23660046147b0565b610fa3565b6101d5603081565b6101b86102ed3660046147eb565b611195565b6101b861030036600461481b565b611250565b61029c6103133660046148c0565b611417565b6101b8610326366004614802565b611443565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f3660046147eb565b6115b5565b6101b86103723660046147eb565b611791565b6101d5601481565b61039261038d3660046147eb565b6118bb565b6040516101e391906148f4565b6101ff6202a30081565b61029c6103b73660046147eb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f53660046149b4565b611983565b6101b8610408366004614a2d565b6119b8565b5f8381525f805160206151658339815191526020526040808220815160e0810190925280545f805160206151a583398151915293929190829060ff16600381111561045a5761045a6148e0565b600381111561046b5761046b6148e0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e1826118bb565b90506002835160038111156104f8576104f86148e0565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff191660031790558151600291811115610573576105736148e0565b036105ec57851561058a576105888286611a97565b505b6105a782846060015183608001516105a29190614a7f565b611c1b565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b039092169190911790556105e787611d72565b61063a565b600481516005811115610601576106016148e0565b036106215761060f87611d72565b61061887611fb9565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f805160206152058339815191526020526040808220815160e0810190925280545f805160206151c583398151915293929190829060ff1660058111156106bc576106bc6148e0565b60058111156106cd576106cd6148e0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561073c5761073c6148e0565b1461075a5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61077f8584606001515f6121a0565b6040518263ffffffff1660e01b815260040161079b9190614ac1565b6020604051808303815f875af11580156107b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107db9190614af3565b50505050565b5f6107f164e8d4a5100083614b0a565b92915050565b5f805160206151a58339815191525f80610810846121f7565b9150915061081d82612495565b6108275750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610856576108566148e0565b0361087b575f8381526007850160205260408120805491905561087982826124d0565b505b6108918161088c8460400151610f76565b61253d565b5050505050565b5f8181525f805160206151658339815191526020526040808220815160e0810190925280545f805160206151a583398151915293929190829060ff1660038111156108e5576108e56148e0565b60038111156108f6576108f66148e0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61096c826118bb565b9050600183516003811115610983576109836148e0565b146109a15760405163f95c7fe160e01b815260040160405180910390fd5b6004815160058111156109b6576109b66148e0565b036109cc576109c485611fb9565b505050505050565b5f6109d687612560565b90505f806109e78360400151612660565b5091509150818514610a0c57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610a455750806001600160401b03168660a001516001600160401b0316115b15610a6357604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151c58339815191529060ff1615610b4457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bab9190614af3565b836020013514610bce5760405163d040949d60e01b815260040160405180910390fd5b30610bdf6060850160408601614b29565b6001600160a01b031614610c065760405163e6c4247b60e01b815260040160405180910390fd5b5f610c146060850185614b44565b905090505f805b828163ffffffff161015610ec0575f610c376060880188614b44565b8363ffffffff16818110610c4d57610c4d614b89565b9050602002810190610c5f9190614b9d565b610c6890614c4d565b80515f8181526008880160205260409020549192509015610c9c57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610ccb92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610ce591614ce4565b602060405180830381855afa158015610d00573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d239190614af3565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610daf57610daf6148e0565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610e62911686614cf5565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610eb990614d08565b9050610c1b565b50600483018190555f610ed285612560565b90505f610ee2826040015161289e565b90505f610eee88612a13565b905081600282604051610f019190614ce4565b602060405180830381855afa158015610f1c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f3f9190614af3565b14610f5d57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6107f16001600160401b03831664e8d4a51000614d2a565b5f610f99826118bb565b6080015192915050565b5f805160206151a58339815191525f610fbb85612eac565b9050610fc685612495565b610fd1575050505050565b5f8581526004830160205260409020546001600160a01b031633146110095760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161103891600160b01b90046001600160401b031690614d41565b6001600160401b03168160c001516001600160401b0316101561106e576040516302336bad60e51b815260040160405180910390fd5b8315610891575f61107f8685611a97565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906110cf90610f76565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611145573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111699190614af3565b5f87815260078501602052604081208054909190611188908490614cf5565b9091555050505050505050565b5f805160206151a58339815191525f6111ad836118bb565b90506004815160058111156111c4576111c46148e0565b146111e25760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b0316331461121a5760405163e6c4247b60e01b815260040160405180910390fd5b5f838152600783016020908152604080832080549084905560048601909252909120546107db906001600160a01b0316826124d0565b6112586130e9565b5f8181525f805160206151658339815191526020526040808220815160e0810190925280545f805160206151a583398151915293929190829060ff1660038111156112a5576112a56148e0565b60038111156112b6576112b66148e0565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561132f5761132f6148e0565b1461134d5760405163f95c7fe160e01b815260040160405180910390fd5b600461135c82604001516118bb565b51600581111561136e5761136e6148e0565b146113f2575f61137d85612560565b90505f8061138e8360400151612660565b5091509150818460400151146113b757604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156113ee57604051633ab3447f60e11b815260040160405180910390fd5b5050505b6113fb83611fb9565b505061141360015f805160206151e583398151915255565b5050565b5f6114206130e9565b61142b833384613133565b90506107f160015f805160206151e583398151915255565b5f805160206151c58339815191525f61145b83612560565b90505f8061146c83604001516133fa565b915091508061148e57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546114a890614d61565b90505f036114c957604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156114ef576114ef6148e0565b1461150d5760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061152591614700565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206151658339815191526020526040808220815160e0810190925280545f805160206151a583398151915293929190829060ff166003811115611602576116026148e0565b6003811115611613576116136148e0565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561168c5761168c6148e0565b141580156116ad57506003815160038111156116aa576116aa6148e0565b14155b156116cb5760405163f95c7fe160e01b815260040160405180910390fd5b5f6116d982604001516118bb565b905080606001516001600160401b03165f0361170857604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6117358460400151846060015185608001516121a0565b6040518263ffffffff1660e01b81526004016117519190614ac1565b6020604051808303815f875af115801561176d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108919190614af3565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206151c583398151915291906117d890614d61565b90505f036117f957604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561181f5761181f6148e0565b1461183d5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118769190600401614d99565b6020604051808303815f875af1158015611892573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118b69190614af3565b505050565b6118c3614737565b5f8281525f80516020615205833981519152602052604090819020815160e0810190925280545f805160206151c5833981519152929190829060ff166005811115611910576119106148e0565b6005811115611921576119216148e0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61198c6130e9565b6119988585858561359e565b90506119b060015f805160206151e583398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a01575080546001600160401b03808416911610155b15611a1f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a4a848461373c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ae2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b099190810190614e2e565b9150915080611b2b57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b929190614af3565b825114611bb25760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611bde5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611bed8460400151613756565b91509150818714611c1157604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615205833981519152602052604081206002015481905f805160206151c583398151915290600160801b90046001600160401b0316611c638582613931565b5f611c6d87613afa565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611cbd8a858b6121a0565b6040518263ffffffff1660e01b8152600401611cd99190614ac1565b6020604051808303815f875af1158015611cf5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d199190614af3565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f805160206151658339815191526020526040808220815160e0810190925280545f805160206151a583398151915293929190829060ff166003811115611dbf57611dbf6148e0565b6003811115611dd057611dd06148e0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611e46826118bb565b90505f600382516005811115611e5e57611e5e6148e0565b1480611e7c5750600482516005811115611e7a57611e7a6148e0565b145b15611e8c575060c0810151611ea9565b600282516005811115611ea157611ea16148e0565b036106215750425b83608001516001600160401b0316816001600160401b031611611ece57505050505050565b600385015460608501516001600160a01b039091169063778c06b590611ef390610f76565b60a085015160808801515f88815260088b01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa158015611f7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9e9190614af3565b5f968752600690950160205250506040909320919091555050565b5f8181525f805160206151658339815191526020526040808220815160e0810190925280545f805160206151a583398151915293929190829060ff166003811115612006576120066148e0565b6003811115612017576120176148e0565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612145575f848152600487016020526040902054612710906120f790600160a01b900461ffff1685614d2a565b6121019190614b0a565b915081866007015f8681526020019081526020015f205f8282546121259190614cf5565b9091555061213590508284614f00565b90506121458560200151826124d0565b61215a856020015161088c8760600151610f76565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f612200614737565b5f805160206151c58339815191525f61221885612560565b90505f8061222983604001516133fa565b91509150801561224c57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561227d5761227d6148e0565b600581111561228e5761228e6148e0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156122fd576122fd6148e0565b1415801561231e575060018151600581111561231b5761231b6148e0565b14155b1561233c5760405163a36c527f60e01b815260040160405180910390fd5b600381516005811115612351576123516148e0565b0361235f5760048152612364565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156123a9576123a96148e0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561245d5761245d6148e0565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061518583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561252b575f80fd5b505af1158015610618573d5f803e3d5ffd5b5f8051602061518583398151915254611413906001600160a01b03168383613b6f565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156125c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125eb9190810190614e2e565b915091508061260d57604051636b2f19e960e01b815260040160405180910390fd5b81511561262d5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156126595760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461268557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156126d45761269c816001614f00565b6126a7906008614d2a565b61ffff168682815181106126bd576126bd614b89565b016020015160f81c901b9190911790600101612688565b5061ffff8116156126f85760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156127535761270f816003614f00565b61271a906008614d2a565b63ffffffff168761272c836002614cf5565b8151811061273c5761273c614b89565b016020015160f81c901b91909117906001016126fb565b5063ffffffff811660041461277b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156127d05761279281601f614f00565b61279d906008614d2a565b886127a9836006614cf5565b815181106127b9576127b9614b89565b016020015160f81c901b919091179060010161277e565b505f805b600881101561282f576127e8816007614f00565b6127f3906008614d2a565b6001600160401b031689612808836026614cf5565b8151811061281857612818614b89565b016020015160f81c901b91909117906001016127d4565b505f805b600881101561288e57612847816007614f00565b612852906008614d2a565b6001600160401b03168a61286783602e614cf5565b8151811061287757612877614b89565b016020015160f81c901b9190911790600101612833565b5091989097509095509350505050565b5f81516026146128c157604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612910576128d8816001614f00565b6128e3906008614d2a565b61ffff168482815181106128f9576128f9614b89565b016020015160f81c901b91909117906001016128c4565b5061ffff8116156129345760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561298f5761294b816003614f00565b612956906008614d2a565b63ffffffff1685612968836002614cf5565b8151811061297857612978614b89565b016020015160f81c901b9190911790600101612937565b5063ffffffff8116156129b557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a0a576129cc81601f614f00565b6129d7906008614d2a565b866129e3836006614cf5565b815181106129f3576129f3614b89565b016020015160f81c901b91909117906001016129b8565b50949350505050565b60605f612a2283830184614b44565b612a2e91506058614d2a565b612a3990605c614cf5565b6001600160401b03811115612a5057612a50614bbb565b6040519080825280601f01601f191660200182016040528015612a7a576020820181803683370190505b5090505f5b6020811015612acf5783358160208110612a9b57612a9b614b89565b1a60f81b828281518110612ab157612ab1614b89565b60200101906001600160f81b03191690815f1a905350600101612a7f565b505f5b6020811015612b2f5783602001358160208110612af157612af1614b89565b1a60f81b82612b01836020614cf5565b81518110612b1157612b11614b89565b60200101906001600160f81b03191690815f1a905350600101612ad2565b505f5b6004811015612b9257612b46816003614f00565b612b51906008614d2a565b6014901c60f81b82612b64836040614cf5565b81518110612b7457612b74614b89565b60200101906001600160f81b03191690815f1a905350600101612b32565b505f612ba46060850160408601614b29565b60601b90505f5b6014811015612c0457818160148110612bc657612bc6614b89565b1a60f81b83612bd6836044614cf5565b81518110612be657612be6614b89565b60200101906001600160f81b03191690815f1a905350600101612bab565b505f612c136060860186614b44565b905090505f5b6004811015612c7e57612c2d816003614f00565b612c38906008614d2a565b63ffffffff8316901c60f81b84612c50836058614cf5565b81518110612c6057612c60614b89565b60200101906001600160f81b03191690815f1a905350600101612c19565b505f5b612c8e6060870187614b44565b9050811015612ea2575f612ca3826058614d2a565b612cae90605c614cf5565b90505f5b6020811015612d3957612cc86060890189614b44565b84818110612cd857612cd8614b89565b9050602002810190612cea9190614b9d565b358160208110612cfc57612cfc614b89565b1a60f81b86612d0b8385614cf5565b81518110612d1b57612d1b614b89565b60200101906001600160f81b03191690815f1a905350600101612cb2565b505f5b6008811015612dee57612d50816007614f00565b612d5b906008614d2a565b612d6860608a018a614b44565b85818110612d7857612d78614b89565b9050602002810190612d8a9190614b9d565b612d9b9060408101906020016148a7565b6001600160401b0316901c60f81b8682612db6856020614cf5565b612dc09190614cf5565b81518110612dd057612dd0614b89565b60200101906001600160f81b03191690815f1a905350600101612d3c565b505f5b6030811015612e9857612e076060890189614b44565b84818110612e1757612e17614b89565b9050602002810190612e299190614b9d565b612e37906040810190614f13565b82818110612e4757612e47614b89565b9050013560f81c60f81b8682846028612e609190614cf5565b612e6a9190614cf5565b81518110612e7a57612e7a614b89565b60200101906001600160f81b03191690815f1a905350600101612df1565b5050600101612c81565b5091949350505050565b612eb4614737565b5f8281525f805160206152058339815191526020526040808220815160e0810190925280545f805160206151c583398151915293929190829060ff166005811115612f0157612f016148e0565b6005811115612f1257612f126148e0565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612f8457612f846148e0565b14612fa25760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612fe657612fe66148e0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130928582611c1b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f805160206151e583398151915280546001190161311a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206151e583398151915255565b5f5f805160206151a58339815191528161314f6101fa85613bce565b90505f61315b876118bb565b905061316687612495565b61318357604051636ca57bcf60e01b815260040160405180910390fd5b600281516005811115613198576131986148e0565b146131b65760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516131c79190614d41565b905083600201600a9054906101000a90046001600160401b031682604001516131f09190614f55565b6001600160401b0316816001600160401b0316111561322257604051630c192e7760e41b815260040160405180910390fd5b5f8061322e8a84611c1b565b915091505f8a8360405160200161325c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156132ef576132ef6148e0565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461341e57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561346d57613435816001614f00565b613440906008614d2a565b61ffff1685828151811061345657613456614b89565b016020015160f81c901b9190911790600101613421565b5061ffff8116156134915760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156134ec576134a8816003614f00565b6134b3906008614d2a565b63ffffffff16866134c5836002614cf5565b815181106134d5576134d5614b89565b016020015160f81c901b9190911790600101613494565b5063ffffffff811660031461351457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135695761352b81601f614f00565b613536906008614d2a565b87613542836006614cf5565b8151811061355257613552614b89565b016020015160f81c901b9190911790600101613517565b505f8660268151811061357e5761357e614b89565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206151a583398151915290600160401b900461ffff90811690861610806135f2575061271061ffff8616115b156136105760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613642576040516302336bad60e51b815260040160405180910390fd5b80548310806136545750806001015483115b1561367257604051630103be3b60e21b815260040160405180910390fd5b5f61367c84613bce565b90505f613688826107e1565b90505f6136958983613bf1565b905060405180606001604052806136a93390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613744613fdb565b61374d82614026565b61141381614097565b5f808251602e1461377a57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137c957613791816001614f00565b61379c906008614d2a565b61ffff168582815181106137b2576137b2614b89565b016020015160f81c901b919091179060010161377d565b5061ffff8116156137ed5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561384857613804816003614f00565b61380f906008614d2a565b63ffffffff1686613821836002614cf5565b8151811061383157613831614b89565b016020015160f81c901b91909117906001016137f0565b5063ffffffff811660051461387057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138c55761388781601f614f00565b613892906008614d2a565b8761389e836006614cf5565b815181106138ae576138ae614b89565b016020015160f81c901b9190911790600101613873565b505f805b6008811015613924576138dd816007614f00565b6138e8906008614d2a565b6001600160401b0316886138fd836026614cf5565b8151811061390d5761390d614b89565b016020015160f81c901b91909117906001016138c9565b5090969095509350505050565b5f805160206151c58339815191525f6001600160401b0380841690851611156139655761395e8385614a7f565b9050613972565b61396f8484614a7f565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806139d45750600184015481516139d0916001600160401b031690614cf5565b8210155b156139fa576001600160401b038316606082015281815260408101516020820152613a19565b8281606001818151613a0c9190614d41565b6001600160401b03169052505b6060810151613a29906064614f55565b602082015160018601546001600160401b039290921691613a549190600160401b900460ff16614d2a565b1015613a735760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613a8e9190614cf5565b9052506040810180516001600160401b0387169190613aae908390614f00565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206152058339815191526020526040812060020180545f805160206151c58339815191529190600890613b4490600160401b90046001600160401b0316614f80565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b038381166024830152604482018390526118b691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506140f4565b5f6107f1825f80516020615185833981519152546001600160a01b03169061415a565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613c3557604051637fab81e560e01b815260040160405180910390fd5b5f805160206151c583398151915242613c5460408601602087016148a7565b6001600160401b0316111580613c8e5750613c726202a30042614cf5565b613c8260408601602087016148a7565b6001600160401b031610155b15613cab5760405162d36c8560e81b815260040160405180910390fd5b6030613cba6040860186614f13565b9050141580613cc857508335155b15613ce65760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613d1657604051630eb0d31360e11b815260040160405180910390fd5b613d20835f613931565b5f80613db96040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613d6491906148a7565b6001600160401b03168152602001613d7f60408a018a614f13565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506142bc565b5f82815260068601602052604090209193509150613dd78282614fdf565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613e15908590600401614ac1565b6020604051808303815f875af1158015613e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e559190614af3565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613ecd57613ecd6148e0565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613fad918e01908e016148a7565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402457604051631afcd79f60e31b815260040160405180910390fd5b565b61402e613fdb565b6140378161437f565b61403f614398565b6140946060820135608083013561405c60c0850160a086016148a7565b61406c60e0860160c0870161509a565b61407d610100870160e088016150b3565b61408f61012088016101008901614b29565b6143a8565b50565b61409f613fdb565b5f805160206151858339815191526001600160a01b0382166140d45760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6141086001600160a01b038416836144c9565b905080515f1415801561412c57508080602001905181019061412a91906150d3565b155b156118b657604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156141a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141c49190614af3565b90506141db6001600160a01b0385163330866144d6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561421f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142439190614af3565b90508181116142a95760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401614151565b6142b38282614f00565b95945050505050565b5f60608260800151516030146142e557604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161431797969594939291906150ee565b60405160208183030381529060405290506002816040516143389190614ce4565b602060405180830381855afa158015614353573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143769190614af3565b94909350915050565b614387613fdb565b61438f61450f565b61409481614517565b6143a0613fdb565b6140246145e9565b6143b0613fdb565b5f805160206151a583398151915261ffff841615806143d4575061271061ffff8516115b156143f25760405163c98d73a760e01b815260040160405180910390fd5b8587111561441357604051630103be3b60e21b815260040160405180910390fd5b60ff831615806144265750600a60ff8416115b15614444576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b60606121f083835f6145f1565b6040516001600160a01b0384811660248301528381166044830152606482018390526107db9186918216906323b872dd90608401613b9c565b614024613fdb565b61451f613fdb565b80355f805160206151c5833981519152908155601461454460608401604085016150b3565b60ff161180614563575061455e60608301604084016150b3565b60ff16155b156145815760405163b4fa3fb360e01b815260040160405180910390fd5b61459160608301604084016150b3565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556145c260408301602084016148a7565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613120613fdb565b6060814710156146165760405163cd78605960e01b8152306004820152602401614151565b5f80856001600160a01b031684866040516146319190614ce4565b5f6040518083038185875af1925050503d805f811461466b576040519150601f19603f3d011682016040523d82523d5f602084013e614670565b606091505b5091509150611c118683836060826146905761468b826146d7565b6121f0565b81511580156146a757506001600160a01b0384163b155b156146d057604051639996b31560e01b81526001600160a01b0385166004820152602401614151565b50806121f0565b8051156146e75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461470c90614d61565b5f825580601f1061471b575050565b601f0160209004905f5260205f20908101906140949190614773565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614787575f8155600101614774565b5090565b8015158114614094575f80fd5b803563ffffffff811681146147ab575f80fd5b919050565b5f805f606084860312156147c2575f80fd5b8335925060208401356147d48161478b565b91506147e260408501614798565b90509250925092565b5f602082840312156147fb575f80fd5b5035919050565b5f60208284031215614812575f80fd5b6121f082614798565b5f806040838503121561482c575f80fd5b61483583614798565b946020939093013593505050565b5f8060408385031215614854575f80fd5b82356001600160401b03811115614869575f80fd5b83016080818603121561487a575f80fd5b915061488860208401614798565b90509250929050565b80356001600160401b03811681146147ab575f80fd5b5f602082840312156148b7575f80fd5b6121f082614891565b5f80604083850312156148d1575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061491757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161495260608401826001600160401b03169052565b50608083015161496d60808401826001600160401b03169052565b5060a083015161498860a08401826001600160401b03169052565b5060c083015161265960c08401826001600160401b03169052565b803561ffff811681146147ab575f80fd5b5f805f80608085870312156149c7575f80fd5b84356001600160401b038111156149dc575f80fd5b8501606081880312156149ed575f80fd5b93506149fb602086016149a3565b9250614a0960408601614891565b9396929550929360600135925050565b6001600160a01b0381168114614094575f80fd5b5f80828403610140811215614a40575f80fd5b61012080821215614a4f575f80fd5b8493508301359050614a6081614a19565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561265957612659614a6b565b5f5b83811015614ab9578181015183820152602001614aa1565b50505f910152565b602081525f8251806020840152614adf816040850160208701614a9f565b601f01601f19169190910160400192915050565b5f60208284031215614b03575f80fd5b5051919050565b5f82614b2457634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614b39575f80fd5b81356121f081614a19565b5f808335601e19843603018112614b59575f80fd5b8301803591506001600160401b03821115614b72575f80fd5b6020019150600581901b3603821315611d6b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614bb1575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614bf157614bf1614bbb565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c1f57614c1f614bbb565b604052919050565b5f6001600160401b03821115614c3f57614c3f614bbb565b50601f01601f191660200190565b5f60608236031215614c5d575f80fd5b614c65614bcf565b823581526020614c76818501614891565b8183015260408401356001600160401b03811115614c92575f80fd5b840136601f820112614ca2575f80fd5b8035614cb5614cb082614c27565b614bf7565b8181523684838501011115614cc8575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614bb1818460208701614a9f565b808201808211156107f1576107f1614a6b565b5f63ffffffff808316818103614d2057614d20614a6b565b6001019392505050565b80820281158282048414176107f1576107f1614a6b565b6001600160401b0381811683821601908082111561265957612659614a6b565b600181811c90821680614d7557607f821691505b602082108103614d9357634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614dab81614d61565b806020870152604060018084165f8114614dcc5760018114614de857614e15565b60ff19851660408a0152604084151560051b8a01019550614e15565b895f5260205f205f5b85811015614e0c5781548b8201860152908301908801614df1565b8a016040019650505b509398975050505050505050565b80516147ab8161478b565b5f8060408385031215614e3f575f80fd5b82516001600160401b0380821115614e55575f80fd5b9084019060608287031215614e68575f80fd5b614e70614bcf565b82518152602080840151614e8381614a19565b82820152604084015183811115614e98575f80fd5b80850194505087601f850112614eac575f80fd5b83519250614ebc614cb084614c27565b8381528882858701011115614ecf575f80fd5b614ede84838301848801614a9f565b80604084015250819550614ef3818801614e23565b9450505050509250929050565b818103818111156107f1576107f1614a6b565b5f808335601e19843603018112614f28575f80fd5b8301803591506001600160401b03821115614f41575f80fd5b602001915036819003821315611d6b575f80fd5b6001600160401b03818116838216028082169190828114614f7857614f78614a6b565b505092915050565b5f6001600160401b03808316818103614d2057614d20614a6b565b601f8211156118b657805f5260205f20601f840160051c81016020851015614fc05750805b601f840160051c820191505b81811015610891575f8155600101614fcc565b81516001600160401b03811115614ff857614ff8614bbb565b61500c816150068454614d61565b84614f9b565b602080601f83116001811461503f575f84156150285750858301515b5f19600386901b1c1916600185901b1785556109c4565b5f85815260208120601f198616915b8281101561506d5788860151825594840194600190910190840161504e565b508582101561508a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156150aa575f80fd5b6121f0826149a3565b5f602082840312156150c3575f80fd5b813560ff811681146121f0575f80fd5b5f602082840312156150e3575f80fd5b81516121f08161478b565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161514381604e860160208901614a9f565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1496,13 +1496,12 @@ func (it *ERC20TokenStakingManagerDelegatorRemovalInitializedIterator) Close() e type ERC20TokenStakingManagerDelegatorRemovalInitialized struct { DelegationID [32]byte ValidationID [32]byte - EndTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*ERC20TokenStakingManagerDelegatorRemovalInitializedIterator, error) { var delegationIDRule []interface{} @@ -1521,9 +1520,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterDelegat return &ERC20TokenStakingManagerDelegatorRemovalInitializedIterator{contract: _ERC20TokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { var delegationIDRule []interface{} @@ -1567,9 +1566,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchDelegato }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*ERC20TokenStakingManagerDelegatorRemovalInitialized, error) { event := new(ERC20TokenStakingManagerDelegatorRemovalInitialized) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index ef4b82dd4..b3eafa117 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -82,8 +82,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614faa380380614faa83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614e5d8061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004614475565b610561565b005b3480156101df575f80fd5b506101d26101ee3660046144b0565b61092f565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d26102383660046144c7565b610aa1565b348015610248575f80fd5b5061025c6102573660046144b0565b610b7e565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc366004614505565b610b94565b604051908152602001610215565b3480156102fa575f80fd5b506101d2610309366004614559565b610bc8565b348015610319575f80fd5b506101d2610328366004614572565b610c69565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d261037036600461459a565b610eb5565b348015610380575f80fd5b506102e161038f3660046145e8565b611339565b34801561039f575f80fd5b5061025c6103ae3660046144b0565b611352565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e0366004614475565b611366565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d26104133660046144b0565b611558565b348015610423575f80fd5b506101d2610432366004614572565b611613565b348015610442575f80fd5b506101d2610451366004614559565b6117da565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a3660046144b0565b61194c565b34801561049a575f80fd5b506101d26104a93660046144b0565b611b28565b6102e16104bc3660046144b0565b611c52565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef3660046144b0565b611c83565b6040516102159190614615565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e16105313660046144b0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614db18339815191526020526040808220815160e0810190925280545f80516020614dd183398151915293929190829060ff1660038111156105ae576105ae614601565b60038111156105bf576105bf614601565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611c83565b905060028351600381111561064c5761064c614601565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b6003815160058111156106ac576106ac614601565b036106ca5760405163a36c527f60e01b815260040160405180910390fd5b5f878152600585810160205260408220805460ff1916600317905582518291600291908111156106fc576106fc614601565b03610775578715610714576107118488611d4b565b91505b5f8560600151846080015161072991906146d8565b90506107358582611ecf565b505f8b8152600589016020526040902060020180546001600160401b03909216600160c01b026001600160c01b03909216919091179055504290506107c6565b50505f82815260088501602090815260408083205460608501518b855260058901909352922060020180546001600160c01b0316600160c01b6001600160401b039384160217905560c08301519116905b84608001516001600160401b0316816001600160401b031611156108b557600386015460608601516001600160a01b039091169063778c06b59061080990611339565b60a086015160808901516040516001600160e01b031960e086901b16815260048101939093526001600160401b039182166024840152811660448301528085166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015610880573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a491906146f8565b5f8a81526006880160205260409020555b6004835160058111156108ca576108ca614601565b036108e3576108d889612026565b505050505050505050565b6040516001600160401b038216815284908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906020015b60405180910390a3505050505050505050565b5f8181525f80516020614e318339815191526020526040808220815160e0810190925280545f80516020614df183398151915293929190829060ff16600581111561097c5761097c614601565b600581111561098d5761098d614601565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109fc576109fc614601565b14610a1a5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a3f8584606001515f61220d565b6040518263ffffffff1660e01b8152600401610a5b9190614731565b6020604051808303815f875af1158015610a77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9b91906146f8565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aea575080546001600160401b03808416911610155b15610b085760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b328361225c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b8e64e8d4a5100083614763565b92915050565b5f610b9d612270565b610ba9848484346122a7565b9050610bc160015f80516020614e1183398151915255565b9392505050565b5f80516020614dd18339815191525f80610be18461244d565b91509150610bee826126eb565b610bf85750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c2757610c27614601565b03610c4c575f83815260078501602052604081208054919055610c4a8282612726565b505b610c6281610c5d8460400151611339565b612784565b5050505050565b5f8181525f80516020614db18339815191526020526040808220815160e0810190925280545f80516020614dd183398151915293929190829060ff166003811115610cb657610cb6614601565b6003811115610cc757610cc7614601565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610d3d82611c83565b9050600183516003811115610d5457610d54614601565b14610d725760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610d8757610d87614601565b03610d9d57610d9585612026565b505050505050565b5f610da787612797565b90505f80610db88360400151612897565b5091509150818514610ddd57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610e165750806001600160401b03168660a001516001600160401b0316115b15610e3457604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910161091c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614df18339815191529060ff1615610f0757604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f6e91906146f8565b836020013514610f915760405163d040949d60e01b815260040160405180910390fd5b30610fa26060850160408601614796565b6001600160a01b031614610fc95760405163e6c4247b60e01b815260040160405180910390fd5b5f610fd760608501856147b1565b905090505f805b828163ffffffff161015611283575f610ffa60608801886147b1565b8363ffffffff16818110611010576110106147f6565b9050602002810190611022919061480a565b61102b906148ba565b80515f818152600888016020526040902054919250901561105f57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161108e92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526110a891614951565b602060405180830381855afa1580156110c3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110e691906146f8565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561117257611172614601565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611225911686614962565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061127c90614975565b9050610fde565b50600483018190555f61129585612797565b90505f6112a58260400151612ad5565b90505f6112b188612c4a565b9050816002826040516112c49190614951565b602060405180830381855afa1580156112df573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061130291906146f8565b1461132057604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610b8e6001600160401b03831664e8d4a51000614997565b5f61135c82611c83565b6080015192915050565b5f80516020614dd18339815191525f61137e856130e3565b9050611389856126eb565b611394575050505050565b5f8581526004830160205260409020546001600160a01b031633146113cc5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516113fb91600160b01b90046001600160401b0316906149ae565b6001600160401b03168160c001516001600160401b03161015611431576040516302336bad60e51b815260040160405180910390fd5b8315610c62575f6114428685611d4b565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061149290611339565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611508573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061152c91906146f8565b5f8781526007850160205260408120805490919061154b908490614962565b9091555050505050505050565b5f80516020614dd18339815191525f61157083611c83565b905060048151600581111561158757611587614601565b146115a55760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146115dd5760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610a9b906001600160a01b031682612726565b61161b612270565b5f8181525f80516020614db18339815191526020526040808220815160e0810190925280545f80516020614dd183398151915293929190829060ff16600381111561166857611668614601565b600381111561167957611679614601565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156116f2576116f2614601565b146117105760405163f95c7fe160e01b815260040160405180910390fd5b600461171f8260400151611c83565b51600581111561173157611731614601565b146117b5575f61174085612797565b90505f806117518360400151612897565b50915091508184604001511461177a57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156117b157604051633ab3447f60e11b815260040160405180910390fd5b5050505b6117be83612026565b50506117d660015f80516020614e1183398151915255565b5050565b5f80516020614df18339815191525f6117f283612797565b90505f806118038360400151613320565b915091508061182557604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461183f906149ce565b90505f0361186057604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561188657611886614601565b146118a45760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206118bc916143ca565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614db18339815191526020526040808220815160e0810190925280545f80516020614dd183398151915293929190829060ff16600381111561199957611999614601565b60038111156119aa576119aa614601565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a2357611a23614601565b14158015611a445750600381516003811115611a4157611a41614601565b14155b15611a625760405163f95c7fe160e01b815260040160405180910390fd5b5f611a708260400151611c83565b905080606001516001600160401b03165f03611a9f57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611acc84604001518460600151856080015161220d565b6040518263ffffffff1660e01b8152600401611ae89190614731565b6020604051808303815f875af1158015611b04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6291906146f8565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614df18339815191529190611b6f906149ce565b90505f03611b9057604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611bb657611bb6614601565b14611bd45760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c0d9190600401614a00565b6020604051808303815f875af1158015611c29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c4d91906146f8565b505050565b5f611c5b612270565b611c668233346134c4565b9050611c7e60015f80516020614e1183398151915255565b919050565b611c8b614401565b5f8281525f80516020614e31833981519152602052604090819020815160e0810190925280545f80516020614df1833981519152929190829060ff166005811115611cd857611cd8614601565b6005811115611ce957611ce9614601565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d96573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611dbd9190810190614a95565b9150915080611ddf57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e4691906146f8565b825114611e665760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611e925760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ea18460400151613788565b91509150818714611ec557604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e31833981519152602052604081206002015481905f80516020614df183398151915290600160801b90046001600160401b0316611f178582613963565b5f611f2187613b2c565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611f718a858b61220d565b6040518263ffffffff1660e01b8152600401611f8d9190614731565b6020604051808303815f875af1158015611fa9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcd91906146f8565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f80516020614db18339815191526020526040808220815160e0810190925280545f80516020614dd183398151915293929190829060ff16600381111561207357612073614601565b600381111561208457612084614601565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156121b2575f8481526004870160205260409020546127109061216490600160a01b900461ffff1685614997565b61216e9190614763565b915081866007015f8681526020019081526020015f205f8282546121929190614962565b909155506121a290508284614b67565b90506121b2856020015182612726565b6121c78560200151610c5d8760600151611339565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612264613ba1565b61226d81613bec565b50565b5f80516020614e118339815191528054600119016122a157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614dd183398151915290600160401b900461ffff90811690861610806122fb575061271061ffff8616115b156123195760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561234b576040516302336bad60e51b815260040160405180910390fd5b805483108061235d5750806001015483115b1561237b57604051630103be3b60e21b815260040160405180910390fd5b825f61238682610b7e565b90505f6123938983613c5a565b905060405180606001604052806123a73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e1183398151915255565b5f612456614401565b5f80516020614df18339815191525f61246e85612797565b90505f8061247f8360400151613320565b9150915080156124a257604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156124d3576124d3614601565b60058111156124e4576124e4614601565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561255357612553614601565b14158015612574575060018151600581111561257157612571614601565b14155b156125925760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156125a7576125a7614601565b036125b557600481526125ba565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156125ff576125ff614601565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156126b3576126b3614601565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612772575f80fd5b505af1158015610d95573d5f803e3d5ffd5b6117d66001600160a01b03831682614044565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156127fb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128229190810190614a95565b915091508061284457604051636b2f19e960e01b815260040160405180910390fd5b8151156128645760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156128905760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146128bc57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561290b576128d3816001614b67565b6128de906008614997565b61ffff168682815181106128f4576128f46147f6565b016020015160f81c901b91909117906001016128bf565b5061ffff81161561292f5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561298a57612946816003614b67565b612951906008614997565b63ffffffff1687612963836002614962565b81518110612973576129736147f6565b016020015160f81c901b9190911790600101612932565b5063ffffffff81166004146129b257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a07576129c981601f614b67565b6129d4906008614997565b886129e0836006614962565b815181106129f0576129f06147f6565b016020015160f81c901b91909117906001016129b5565b505f805b6008811015612a6657612a1f816007614b67565b612a2a906008614997565b6001600160401b031689612a3f836026614962565b81518110612a4f57612a4f6147f6565b016020015160f81c901b9190911790600101612a0b565b505f805b6008811015612ac557612a7e816007614b67565b612a89906008614997565b6001600160401b03168a612a9e83602e614962565b81518110612aae57612aae6147f6565b016020015160f81c901b9190911790600101612a6a565b5091989097509095509350505050565b5f8151602614612af857604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b4757612b0f816001614b67565b612b1a906008614997565b61ffff16848281518110612b3057612b306147f6565b016020015160f81c901b9190911790600101612afb565b5061ffff811615612b6b5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612bc657612b82816003614b67565b612b8d906008614997565b63ffffffff1685612b9f836002614962565b81518110612baf57612baf6147f6565b016020015160f81c901b9190911790600101612b6e565b5063ffffffff811615612bec57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c4157612c0381601f614b67565b612c0e906008614997565b86612c1a836006614962565b81518110612c2a57612c2a6147f6565b016020015160f81c901b9190911790600101612bef565b50949350505050565b60605f612c59838301846147b1565b612c6591506058614997565b612c7090605c614962565b6001600160401b03811115612c8757612c87614828565b6040519080825280601f01601f191660200182016040528015612cb1576020820181803683370190505b5090505f5b6020811015612d065783358160208110612cd257612cd26147f6565b1a60f81b828281518110612ce857612ce86147f6565b60200101906001600160f81b03191690815f1a905350600101612cb6565b505f5b6020811015612d665783602001358160208110612d2857612d286147f6565b1a60f81b82612d38836020614962565b81518110612d4857612d486147f6565b60200101906001600160f81b03191690815f1a905350600101612d09565b505f5b6004811015612dc957612d7d816003614b67565b612d88906008614997565b6014901c60f81b82612d9b836040614962565b81518110612dab57612dab6147f6565b60200101906001600160f81b03191690815f1a905350600101612d69565b505f612ddb6060850160408601614796565b60601b90505f5b6014811015612e3b57818160148110612dfd57612dfd6147f6565b1a60f81b83612e0d836044614962565b81518110612e1d57612e1d6147f6565b60200101906001600160f81b03191690815f1a905350600101612de2565b505f612e4a60608601866147b1565b905090505f5b6004811015612eb557612e64816003614b67565b612e6f906008614997565b63ffffffff8316901c60f81b84612e87836058614962565b81518110612e9757612e976147f6565b60200101906001600160f81b03191690815f1a905350600101612e50565b505f5b612ec560608701876147b1565b90508110156130d9575f612eda826058614997565b612ee590605c614962565b90505f5b6020811015612f7057612eff60608901896147b1565b84818110612f0f57612f0f6147f6565b9050602002810190612f21919061480a565b358160208110612f3357612f336147f6565b1a60f81b86612f428385614962565b81518110612f5257612f526147f6565b60200101906001600160f81b03191690815f1a905350600101612ee9565b505f5b600881101561302557612f87816007614b67565b612f92906008614997565b612f9f60608a018a6147b1565b85818110612faf57612faf6147f6565b9050602002810190612fc1919061480a565b612fd29060408101906020016145e8565b6001600160401b0316901c60f81b8682612fed856020614962565b612ff79190614962565b81518110613007576130076147f6565b60200101906001600160f81b03191690815f1a905350600101612f73565b505f5b60308110156130cf5761303e60608901896147b1565b8481811061304e5761304e6147f6565b9050602002810190613060919061480a565b61306e906040810190614b7a565b8281811061307e5761307e6147f6565b9050013560f81c60f81b86828460286130979190614962565b6130a19190614962565b815181106130b1576130b16147f6565b60200101906001600160f81b03191690815f1a905350600101613028565b5050600101612eb8565b5091949350505050565b6130eb614401565b5f8281525f80516020614e318339815191526020526040808220815160e0810190925280545f80516020614df183398151915293929190829060ff16600581111561313857613138614601565b600581111561314957613149614601565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156131bb576131bb614601565b146131d95760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561321d5761321d614601565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6132c98582611ecf565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461334457604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133935761335b816001614b67565b613366906008614997565b61ffff1685828151811061337c5761337c6147f6565b016020015160f81c901b9190911790600101613347565b5061ffff8116156133b75760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613412576133ce816003614b67565b6133d9906008614997565b63ffffffff16866133eb836002614962565b815181106133fb576133fb6147f6565b016020015160f81c901b91909117906001016133ba565b5063ffffffff811660031461343a57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561348f5761345181601f614b67565b61345c906008614997565b87613468836006614962565b81518110613478576134786147f6565b016020015160f81c901b919091179060010161343d565b505f866026815181106134a4576134a46147f6565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614dd1833981519152816134dd84610b7e565b90505f6134e987611c83565b90506134f4876126eb565b61351157604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561352657613526614601565b146135445760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161355591906149ae565b905083600201600a9054906101000a90046001600160401b0316826040015161357e9190614bbc565b6001600160401b0316816001600160401b031611156135b057604051630c192e7760e41b815260040160405180910390fd5b5f806135bc8a84611ecf565b915091505f8a836040516020016135ea92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561367d5761367d614601565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146137ac57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137fb576137c3816001614b67565b6137ce906008614997565b61ffff168582815181106137e4576137e46147f6565b016020015160f81c901b91909117906001016137af565b5061ffff81161561381f5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561387a57613836816003614b67565b613841906008614997565b63ffffffff1686613853836002614962565b81518110613863576138636147f6565b016020015160f81c901b9190911790600101613822565b5063ffffffff81166005146138a257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138f7576138b981601f614b67565b6138c4906008614997565b876138d0836006614962565b815181106138e0576138e06147f6565b016020015160f81c901b91909117906001016138a5565b505f805b60088110156139565761390f816007614b67565b61391a906008614997565b6001600160401b03168861392f836026614962565b8151811061393f5761393f6147f6565b016020015160f81c901b91909117906001016138fb565b5090969095509350505050565b5f80516020614df18339815191525f6001600160401b0380841690851611156139975761399083856146d8565b90506139a4565b6139a184846146d8565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a06575060018401548151613a02916001600160401b031690614962565b8210155b15613a2c576001600160401b038316606082015281815260408101516020820152613a4b565b8281606001818151613a3e91906149ae565b6001600160401b03169052505b6060810151613a5b906064614bbc565b602082015160018601546001600160401b039290921691613a869190600160401b900460ff16614997565b1015613aa55760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613ac09190614962565b9052506040810180516001600160401b0387169190613ae0908390614b67565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e318339815191526020526040812060020180545f80516020614df18339815191529190600890613b7690600160401b90046001600160401b0316614be7565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613bea57604051631afcd79f60e31b815260040160405180910390fd5b565b613bf4613ba1565b613bfd816140db565b613c056140f4565b61226d60608201356080830135613c2260c0850160a086016145e8565b613c3260e0860160c08701614c02565b613c43610100870160e08801614c1b565b613c5561012088016101008901614796565b614104565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613c9e57604051637fab81e560e01b815260040160405180910390fd5b5f80516020614df183398151915242613cbd60408601602087016145e8565b6001600160401b0316111580613cf75750613cdb6202a30042614962565b613ceb60408601602087016145e8565b6001600160401b031610155b15613d145760405162d36c8560e81b815260040160405180910390fd5b6030613d236040860186614b7a565b9050141580613d3157508335155b15613d4f5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613d7f57604051630eb0d31360e11b815260040160405180910390fd5b613d89835f613963565b5f80613e226040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613dcd91906145e8565b6001600160401b03168152602001613de860408a018a614b7a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614225565b5f82815260068601602052604090209193509150613e408282614c7f565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613e7e908590600401614731565b6020604051808303815f875af1158015613e9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ebe91906146f8565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613f3657613f36614601565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614016918e01908e016145e8565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561406b5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146140b4576040519150601f19603f3d011682016040523d82523d5f602084013e6140b9565b606091505b5050905080611c4d57604051630a12f52160e11b815260040160405180910390fd5b6140e3613ba1565b6140eb6142e8565b61226d816142f0565b6140fc613ba1565b613bea6143c2565b61410c613ba1565b5f80516020614dd183398151915261ffff84161580614130575061271061ffff8516115b1561414e5760405163c98d73a760e01b815260040160405180910390fd5b8587111561416f57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806141825750600a60ff8416115b156141a0576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461424e57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016142809796959493929190614d3a565b60405160208183030381529060405290506002816040516142a19190614951565b602060405180830381855afa1580156142bc573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142df91906146f8565b94909350915050565b613bea613ba1565b6142f8613ba1565b80355f80516020614df1833981519152908155601461431d6060840160408501614c1b565b60ff16118061433c57506143376060830160408401614c1b565b60ff16155b1561435a5760405163b4fa3fb360e01b815260040160405180910390fd5b61436a6060830160408401614c1b565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561439b60408301602084016145e8565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61243a613ba1565b5080546143d6906149ce565b5f825580601f106143e5575050565b601f0160209004905f5260205f209081019061226d919061443d565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614451575f815560010161443e565b5090565b801515811461226d575f80fd5b803563ffffffff81168114611c7e575f80fd5b5f805f60608486031215614487575f80fd5b83359250602084013561449981614455565b91506144a760408501614462565b90509250925092565b5f602082840312156144c0575f80fd5b5035919050565b5f61012082840312156144d8575f80fd5b50919050565b803561ffff81168114611c7e575f80fd5b80356001600160401b0381168114611c7e575f80fd5b5f805f60608486031215614517575f80fd5b83356001600160401b0381111561452c575f80fd5b84016060818703121561453d575f80fd5b925061454b602085016144de565b91506144a7604085016144ef565b5f60208284031215614569575f80fd5b610bc182614462565b5f8060408385031215614583575f80fd5b61458c83614462565b946020939093013593505050565b5f80604083850312156145ab575f80fd5b82356001600160401b038111156145c0575f80fd5b8301608081860312156145d1575f80fd5b91506145df60208401614462565b90509250929050565b5f602082840312156145f8575f80fd5b610bc1826144ef565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061463857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161467360608401826001600160401b03169052565b50608083015161468e60808401826001600160401b03169052565b5060a08301516146a960a08401826001600160401b03169052565b5060c083015161289060c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612890576128906146c4565b5f60208284031215614708575f80fd5b5051919050565b5f5b83811015614729578181015183820152602001614711565b50505f910152565b602081525f825180602084015261474f81604085016020870161470f565b601f01601f19169190910160400192915050565b5f8261477d57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b038116811461226d575f80fd5b5f602082840312156147a6575f80fd5b8135610bc181614782565b5f808335601e198436030181126147c6575f80fd5b8301803591506001600160401b038211156147df575f80fd5b6020019150600581901b360382131561201f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261481e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561485e5761485e614828565b60405290565b604051601f8201601f191681016001600160401b038111828210171561488c5761488c614828565b604052919050565b5f6001600160401b038211156148ac576148ac614828565b50601f01601f191660200190565b5f606082360312156148ca575f80fd5b6148d261483c565b8235815260206148e38185016144ef565b8183015260408401356001600160401b038111156148ff575f80fd5b840136601f82011261490f575f80fd5b803561492261491d82614894565b614864565b8181523684838501011115614935575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f825161481e81846020870161470f565b80820180821115610b8e57610b8e6146c4565b5f63ffffffff80831681810361498d5761498d6146c4565b6001019392505050565b8082028115828204841417610b8e57610b8e6146c4565b6001600160401b03818116838216019080821115612890576128906146c4565b600181811c908216806149e257607f821691505b6020821081036144d857634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614a12816149ce565b806020870152604060018084165f8114614a335760018114614a4f57614a7c565b60ff19851660408a0152604084151560051b8a01019550614a7c565b895f5260205f205f5b85811015614a735781548b8201860152908301908801614a58565b8a016040019650505b509398975050505050505050565b8051611c7e81614455565b5f8060408385031215614aa6575f80fd5b82516001600160401b0380821115614abc575f80fd5b9084019060608287031215614acf575f80fd5b614ad761483c565b82518152602080840151614aea81614782565b82820152604084015183811115614aff575f80fd5b80850194505087601f850112614b13575f80fd5b83519250614b2361491d84614894565b8381528882858701011115614b36575f80fd5b614b458483830184880161470f565b80604084015250819550614b5a818801614a8a565b9450505050509250929050565b81810381811115610b8e57610b8e6146c4565b5f808335601e19843603018112614b8f575f80fd5b8301803591506001600160401b03821115614ba8575f80fd5b60200191503681900382131561201f575f80fd5b6001600160401b03818116838216028082169190828114614bdf57614bdf6146c4565b505092915050565b5f6001600160401b0380831681810361498d5761498d6146c4565b5f60208284031215614c12575f80fd5b610bc1826144de565b5f60208284031215614c2b575f80fd5b813560ff81168114610bc1575f80fd5b601f821115611c4d57805f5260205f20601f840160051c81016020851015614c605750805b601f840160051c820191505b81811015610c62575f8155600101614c6c565b81516001600160401b03811115614c9857614c98614828565b614cac81614ca684546149ce565b84614c3b565b602080601f831160018114614cdf575f8415614cc85750858301515b5f19600386901b1c1916600185901b178555610d95565b5f85815260208120601f198616915b82811015614d0d57888601518255948401946001909101908401614cee565b5085821015614d2a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614d8f81604e86016020890161470f565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161509338038061509383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614f468061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd36600461455e565b610561565b005b3480156101df575f80fd5b506101d26101ee366004614599565b6107c3565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d26102383660046145b0565b610935565b348015610248575f80fd5b5061025c610257366004614599565b610a12565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc3660046145ee565b610a28565b604051908152602001610215565b3480156102fa575f80fd5b506101d2610309366004614642565b610a5c565b348015610319575f80fd5b506101d261032836600461465b565b610afd565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d2610370366004614683565b610d57565b348015610380575f80fd5b506102e161038f3660046146d1565b6111db565b34801561039f575f80fd5b5061025c6103ae366004614599565b6111f4565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e036600461455e565b611208565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d2610413366004614599565b6113fa565b348015610423575f80fd5b506101d261043236600461465b565b6114b5565b348015610442575f80fd5b506101d2610451366004614642565b61167c565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a366004614599565b6117ee565b34801561049a575f80fd5b506101d26104a9366004614599565b6119ca565b6102e16104bc366004614599565b611af4565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef366004614599565b611b25565b60405161021591906146fe565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e1610531366004614599565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614e9a8339815191526020526040808220815160e0810190925280545f80516020614eba83398151915293929190829060ff1660038111156105ae576105ae6146ea565b60038111156105bf576105bf6146ea565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611b25565b905060028351600381111561064c5761064c6146ea565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156106c7576106c76146ea565b036107405785156106de576106dc8286611bed565b505b6106fb82846060015183608001516106f691906147c1565b611d71565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561073b87611ec8565b61078e565b600481516005811115610755576107556146ea565b036107755761076387611ec8565b61076c8761210f565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f80516020614f1a8339815191526020526040808220815160e0810190925280545f80516020614eda83398151915293929190829060ff166005811115610810576108106146ea565b6005811115610821576108216146ea565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610890576108906146ea565b146108ae5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6108d38584606001515f6122f6565b6040518263ffffffff1660e01b81526004016108ef9190614803565b6020604051808303815f875af115801561090b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092f9190614835565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061097e575080546001600160401b03808416911610155b1561099c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109c683612345565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a2264e8d4a510008361484c565b92915050565b5f610a31612359565b610a3d84848434612390565b9050610a5560015f80516020614efa83398151915255565b9392505050565b5f80516020614eba8339815191525f80610a7584612536565b91509150610a82826127d4565b610a8c5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610abb57610abb6146ea565b03610ae0575f83815260078501602052604081208054919055610ade828261280f565b505b610af681610af184604001516111db565b61286d565b5050505050565b5f8181525f80516020614e9a8339815191526020526040808220815160e0810190925280545f80516020614eba83398151915293929190829060ff166003811115610b4a57610b4a6146ea565b6003811115610b5b57610b5b6146ea565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610bd182611b25565b9050600183516003811115610be857610be86146ea565b14610c065760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610c1b57610c1b6146ea565b03610c3157610c298561210f565b505050505050565b5f610c3b87612880565b90505f80610c4c8360400151612980565b5091509150818514610c7157604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610caa5750806001600160401b03168660a001516001600160401b0316115b15610cc857604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614eda8339815191529060ff1615610da957604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e109190614835565b836020013514610e335760405163d040949d60e01b815260040160405180910390fd5b30610e44606085016040860161487f565b6001600160a01b031614610e6b5760405163e6c4247b60e01b815260040160405180910390fd5b5f610e79606085018561489a565b905090505f805b828163ffffffff161015611125575f610e9c606088018861489a565b8363ffffffff16818110610eb257610eb26148df565b9050602002810190610ec491906148f3565b610ecd906149a3565b80515f8181526008880160205260409020549192509015610f0157604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610f3092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610f4a91614a3a565b602060405180830381855afa158015610f65573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f889190614835565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115611014576110146146ea565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516110c7911686614a4b565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061111e90614a5e565b9050610e80565b50600483018190555f61113785612880565b90505f6111478260400151612bbe565b90505f61115388612d33565b9050816002826040516111669190614a3a565b602060405180830381855afa158015611181573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111a49190614835565b146111c257604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610a226001600160401b03831664e8d4a51000614a80565b5f6111fe82611b25565b6080015192915050565b5f80516020614eba8339815191525f611220856131cc565b905061122b856127d4565b611236575050505050565b5f8581526004830160205260409020546001600160a01b0316331461126e5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161129d91600160b01b90046001600160401b031690614a97565b6001600160401b03168160c001516001600160401b031610156112d3576040516302336bad60e51b815260040160405180910390fd5b8315610af6575f6112e48685611bed565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b590611334906111db565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156113aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ce9190614835565b5f878152600785016020526040812080549091906113ed908490614a4b565b9091555050505050505050565b5f80516020614eba8339815191525f61141283611b25565b9050600481516005811115611429576114296146ea565b146114475760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b0316331461147f5760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461092f906001600160a01b03168261280f565b6114bd612359565b5f8181525f80516020614e9a8339815191526020526040808220815160e0810190925280545f80516020614eba83398151915293929190829060ff16600381111561150a5761150a6146ea565b600381111561151b5761151b6146ea565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529050600381516003811115611594576115946146ea565b146115b25760405163f95c7fe160e01b815260040160405180910390fd5b60046115c18260400151611b25565b5160058111156115d3576115d36146ea565b14611657575f6115e285612880565b90505f806115f38360400151612980565b50915091508184604001511461161c57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561165357604051633ab3447f60e11b815260040160405180910390fd5b5050505b6116608361210f565b505061167860015f80516020614efa83398151915255565b5050565b5f80516020614eda8339815191525f61169483612880565b90505f806116a58360400151613409565b91509150806116c757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546116e190614ab7565b90505f0361170257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115611728576117286146ea565b146117465760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061175e916144b3565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614e9a8339815191526020526040808220815160e0810190925280545f80516020614eba83398151915293929190829060ff16600381111561183b5761183b6146ea565b600381111561184c5761184c6146ea565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156118c5576118c56146ea565b141580156118e657506003815160038111156118e3576118e36146ea565b14155b156119045760405163f95c7fe160e01b815260040160405180910390fd5b5f6119128260400151611b25565b905080606001516001600160401b03165f0361194157604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61196e8460400151846060015185608001516122f6565b6040518263ffffffff1660e01b815260040161198a9190614803565b6020604051808303815f875af11580156119a6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af69190614835565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614eda8339815191529190611a1190614ab7565b90505f03611a3257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611a5857611a586146ea565b14611a765760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611aaf9190600401614ae9565b6020604051808303815f875af1158015611acb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aef9190614835565b505050565b5f611afd612359565b611b088233346135ad565b9050611b2060015f80516020614efa83398151915255565b919050565b611b2d6144ea565b5f8281525f80516020614f1a833981519152602052604090819020815160e0810190925280545f80516020614eda833981519152929190829060ff166005811115611b7a57611b7a6146ea565b6005811115611b8b57611b8b6146ea565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c38573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c5f9190810190614b7e565b9150915080611c8157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cc4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce89190614835565b825114611d085760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d345760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d438460400151613871565b91509150818714611d6757604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614f1a833981519152602052604081206002015481905f80516020614eda83398151915290600160801b90046001600160401b0316611db98582613a4c565b5f611dc387613c15565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e138a858b6122f6565b6040518263ffffffff1660e01b8152600401611e2f9190614803565b6020604051808303815f875af1158015611e4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6f9190614835565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f80516020614e9a8339815191526020526040808220815160e0810190925280545f80516020614eba83398151915293929190829060ff166003811115611f1557611f156146ea565b6003811115611f2657611f266146ea565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611f9c82611b25565b90505f600382516005811115611fb457611fb46146ea565b1480611fd25750600482516005811115611fd057611fd06146ea565b145b15611fe2575060c0810151611fff565b600282516005811115611ff757611ff76146ea565b036107755750425b83608001516001600160401b0316816001600160401b03161161202457505050505050565b600385015460608501516001600160a01b039091169063778c06b590612049906111db565b60a085015160808801515f88815260088b01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa1580156120d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120f49190614835565b5f968752600690950160205250506040909320919091555050565b5f8181525f80516020614e9a8339815191526020526040808220815160e0810190925280545f80516020614eba83398151915293929190829060ff16600381111561215c5761215c6146ea565b600381111561216d5761216d6146ea565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870190915290812080549082905592935090919080821561229b575f8481526004870160205260409020546127109061224d90600160a01b900461ffff1685614a80565b612257919061484c565b915081866007015f8681526020019081526020015f205f82825461227b9190614a4b565b9091555061228b90508284614c50565b905061229b85602001518261280f565b6122b08560200151610af187606001516111db565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b61234d613c8a565b61235681613cd5565b50565b5f80516020614efa83398151915280546001190161238a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614eba83398151915290600160401b900461ffff90811690861610806123e4575061271061ffff8616115b156124025760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612434576040516302336bad60e51b815260040160405180910390fd5b80548310806124465750806001015483115b1561246457604051630103be3b60e21b815260040160405180910390fd5b825f61246f82610a12565b90505f61247c8983613d43565b905060405180606001604052806124903390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614efa83398151915255565b5f61253f6144ea565b5f80516020614eda8339815191525f61255785612880565b90505f806125688360400151613409565b91509150801561258b57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156125bc576125bc6146ea565b60058111156125cd576125cd6146ea565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561263c5761263c6146ea565b1415801561265d575060018151600581111561265a5761265a6146ea565b14155b1561267b5760405163a36c527f60e01b815260040160405180910390fd5b600381516005811115612690576126906146ea565b0361269e57600481526126a3565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156126e8576126e86146ea565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561279c5761279c6146ea565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561285b575f80fd5b505af1158015610c29573d5f803e3d5ffd5b6116786001600160a01b0383168261412d565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156128e4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261290b9190810190614b7e565b915091508061292d57604051636b2f19e960e01b815260040160405180910390fd5b81511561294d5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156129795760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146129a557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129f4576129bc816001614c50565b6129c7906008614a80565b61ffff168682815181106129dd576129dd6148df565b016020015160f81c901b91909117906001016129a8565b5061ffff811615612a185760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612a7357612a2f816003614c50565b612a3a906008614a80565b63ffffffff1687612a4c836002614a4b565b81518110612a5c57612a5c6148df565b016020015160f81c901b9190911790600101612a1b565b5063ffffffff8116600414612a9b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612af057612ab281601f614c50565b612abd906008614a80565b88612ac9836006614a4b565b81518110612ad957612ad96148df565b016020015160f81c901b9190911790600101612a9e565b505f805b6008811015612b4f57612b08816007614c50565b612b13906008614a80565b6001600160401b031689612b28836026614a4b565b81518110612b3857612b386148df565b016020015160f81c901b9190911790600101612af4565b505f805b6008811015612bae57612b67816007614c50565b612b72906008614a80565b6001600160401b03168a612b8783602e614a4b565b81518110612b9757612b976148df565b016020015160f81c901b9190911790600101612b53565b5091989097509095509350505050565b5f8151602614612be157604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612c3057612bf8816001614c50565b612c03906008614a80565b61ffff16848281518110612c1957612c196148df565b016020015160f81c901b9190911790600101612be4565b5061ffff811615612c545760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612caf57612c6b816003614c50565b612c76906008614a80565b63ffffffff1685612c88836002614a4b565b81518110612c9857612c986148df565b016020015160f81c901b9190911790600101612c57565b5063ffffffff811615612cd557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612d2a57612cec81601f614c50565b612cf7906008614a80565b86612d03836006614a4b565b81518110612d1357612d136148df565b016020015160f81c901b9190911790600101612cd8565b50949350505050565b60605f612d428383018461489a565b612d4e91506058614a80565b612d5990605c614a4b565b6001600160401b03811115612d7057612d70614911565b6040519080825280601f01601f191660200182016040528015612d9a576020820181803683370190505b5090505f5b6020811015612def5783358160208110612dbb57612dbb6148df565b1a60f81b828281518110612dd157612dd16148df565b60200101906001600160f81b03191690815f1a905350600101612d9f565b505f5b6020811015612e4f5783602001358160208110612e1157612e116148df565b1a60f81b82612e21836020614a4b565b81518110612e3157612e316148df565b60200101906001600160f81b03191690815f1a905350600101612df2565b505f5b6004811015612eb257612e66816003614c50565b612e71906008614a80565b6014901c60f81b82612e84836040614a4b565b81518110612e9457612e946148df565b60200101906001600160f81b03191690815f1a905350600101612e52565b505f612ec4606085016040860161487f565b60601b90505f5b6014811015612f2457818160148110612ee657612ee66148df565b1a60f81b83612ef6836044614a4b565b81518110612f0657612f066148df565b60200101906001600160f81b03191690815f1a905350600101612ecb565b505f612f33606086018661489a565b905090505f5b6004811015612f9e57612f4d816003614c50565b612f58906008614a80565b63ffffffff8316901c60f81b84612f70836058614a4b565b81518110612f8057612f806148df565b60200101906001600160f81b03191690815f1a905350600101612f39565b505f5b612fae606087018761489a565b90508110156131c2575f612fc3826058614a80565b612fce90605c614a4b565b90505f5b602081101561305957612fe8606089018961489a565b84818110612ff857612ff86148df565b905060200281019061300a91906148f3565b35816020811061301c5761301c6148df565b1a60f81b8661302b8385614a4b565b8151811061303b5761303b6148df565b60200101906001600160f81b03191690815f1a905350600101612fd2565b505f5b600881101561310e57613070816007614c50565b61307b906008614a80565b61308860608a018a61489a565b85818110613098576130986148df565b90506020028101906130aa91906148f3565b6130bb9060408101906020016146d1565b6001600160401b0316901c60f81b86826130d6856020614a4b565b6130e09190614a4b565b815181106130f0576130f06148df565b60200101906001600160f81b03191690815f1a90535060010161305c565b505f5b60308110156131b857613127606089018961489a565b84818110613137576131376148df565b905060200281019061314991906148f3565b613157906040810190614c63565b82818110613167576131676148df565b9050013560f81c60f81b86828460286131809190614a4b565b61318a9190614a4b565b8151811061319a5761319a6148df565b60200101906001600160f81b03191690815f1a905350600101613111565b5050600101612fa1565b5091949350505050565b6131d46144ea565b5f8281525f80516020614f1a8339815191526020526040808220815160e0810190925280545f80516020614eda83398151915293929190829060ff166005811115613221576132216146ea565b6005811115613232576132326146ea565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156132a4576132a46146ea565b146132c25760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613306576133066146ea565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133b28582611d71565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461342d57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561347c57613444816001614c50565b61344f906008614a80565b61ffff16858281518110613465576134656148df565b016020015160f81c901b9190911790600101613430565b5061ffff8116156134a05760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156134fb576134b7816003614c50565b6134c2906008614a80565b63ffffffff16866134d4836002614a4b565b815181106134e4576134e46148df565b016020015160f81c901b91909117906001016134a3565b5063ffffffff811660031461352357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135785761353a81601f614c50565b613545906008614a80565b87613551836006614a4b565b81518110613561576135616148df565b016020015160f81c901b9190911790600101613526565b505f8660268151811061358d5761358d6148df565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614eba833981519152816135c684610a12565b90505f6135d287611b25565b90506135dd876127d4565b6135fa57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561360f5761360f6146ea565b1461362d5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161363e9190614a97565b905083600201600a9054906101000a90046001600160401b031682604001516136679190614ca5565b6001600160401b0316816001600160401b0316111561369957604051630c192e7760e41b815260040160405180910390fd5b5f806136a58a84611d71565b915091505f8a836040516020016136d392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff19166001836003811115613766576137666146ea565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461389557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156138e4576138ac816001614c50565b6138b7906008614a80565b61ffff168582815181106138cd576138cd6148df565b016020015160f81c901b9190911790600101613898565b5061ffff8116156139085760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156139635761391f816003614c50565b61392a906008614a80565b63ffffffff168661393c836002614a4b565b8151811061394c5761394c6148df565b016020015160f81c901b919091179060010161390b565b5063ffffffff811660051461398b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139e0576139a281601f614c50565b6139ad906008614a80565b876139b9836006614a4b565b815181106139c9576139c96148df565b016020015160f81c901b919091179060010161398e565b505f805b6008811015613a3f576139f8816007614c50565b613a03906008614a80565b6001600160401b031688613a18836026614a4b565b81518110613a2857613a286148df565b016020015160f81c901b91909117906001016139e4565b5090969095509350505050565b5f80516020614eda8339815191525f6001600160401b038084169085161115613a8057613a7983856147c1565b9050613a8d565b613a8a84846147c1565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613aef575060018401548151613aeb916001600160401b031690614a4b565b8210155b15613b15576001600160401b038316606082015281815260408101516020820152613b34565b8281606001818151613b279190614a97565b6001600160401b03169052505b6060810151613b44906064614ca5565b602082015160018601546001600160401b039290921691613b6f9190600160401b900460ff16614a80565b1015613b8e5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613ba99190614a4b565b9052506040810180516001600160401b0387169190613bc9908390614c50565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614f1a8339815191526020526040812060020180545f80516020614eda8339815191529190600890613c5f90600160401b90046001600160401b0316614cd0565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613cd357604051631afcd79f60e31b815260040160405180910390fd5b565b613cdd613c8a565b613ce6816141c4565b613cee6141dd565b61235660608201356080830135613d0b60c0850160a086016146d1565b613d1b60e0860160c08701614ceb565b613d2c610100870160e08801614d04565b613d3e6101208801610100890161487f565b6141ed565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613d8757604051637fab81e560e01b815260040160405180910390fd5b5f80516020614eda83398151915242613da660408601602087016146d1565b6001600160401b0316111580613de05750613dc46202a30042614a4b565b613dd460408601602087016146d1565b6001600160401b031610155b15613dfd5760405162d36c8560e81b815260040160405180910390fd5b6030613e0c6040860186614c63565b9050141580613e1a57508335155b15613e385760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613e6857604051630eb0d31360e11b815260040160405180910390fd5b613e72835f613a4c565b5f80613f0b6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613eb691906146d1565b6001600160401b03168152602001613ed160408a018a614c63565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061430e565b5f82815260068601602052604090209193509150613f298282614d68565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613f67908590600401614803565b6020604051808303815f875af1158015613f83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fa79190614835565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561401f5761401f6146ea565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916140ff918e01908e016146d1565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156141545760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461419d576040519150601f19603f3d011682016040523d82523d5f602084013e6141a2565b606091505b5050905080611aef57604051630a12f52160e11b815260040160405180910390fd5b6141cc613c8a565b6141d46143d1565b612356816143d9565b6141e5613c8a565b613cd36144ab565b6141f5613c8a565b5f80516020614eba83398151915261ffff84161580614219575061271061ffff8516115b156142375760405163c98d73a760e01b815260040160405180910390fd5b8587111561425857604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061426b5750600a60ff8416115b15614289576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461433757604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016143699796959493929190614e23565b604051602081830303815290604052905060028160405161438a9190614a3a565b602060405180830381855afa1580156143a5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143c89190614835565b94909350915050565b613cd3613c8a565b6143e1613c8a565b80355f80516020614eda83398151915290815560146144066060840160408501614d04565b60ff16118061442557506144206060830160408401614d04565b60ff16155b156144435760405163b4fa3fb360e01b815260040160405180910390fd5b6144536060830160408401614d04565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561448460408301602084016146d1565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612523613c8a565b5080546144bf90614ab7565b5f825580601f106144ce575050565b601f0160209004905f5260205f20908101906123569190614526565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561453a575f8155600101614527565b5090565b8015158114612356575f80fd5b803563ffffffff81168114611b20575f80fd5b5f805f60608486031215614570575f80fd5b8335925060208401356145828161453e565b91506145906040850161454b565b90509250925092565b5f602082840312156145a9575f80fd5b5035919050565b5f61012082840312156145c1575f80fd5b50919050565b803561ffff81168114611b20575f80fd5b80356001600160401b0381168114611b20575f80fd5b5f805f60608486031215614600575f80fd5b83356001600160401b03811115614615575f80fd5b840160608187031215614626575f80fd5b9250614634602085016145c7565b9150614590604085016145d8565b5f60208284031215614652575f80fd5b610a558261454b565b5f806040838503121561466c575f80fd5b6146758361454b565b946020939093013593505050565b5f8060408385031215614694575f80fd5b82356001600160401b038111156146a9575f80fd5b8301608081860312156146ba575f80fd5b91506146c86020840161454b565b90509250929050565b5f602082840312156146e1575f80fd5b610a55826145d8565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061472157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161475c60608401826001600160401b03169052565b50608083015161477760808401826001600160401b03169052565b5060a083015161479260a08401826001600160401b03169052565b5060c083015161297960c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612979576129796147ad565b5f5b838110156147fb5781810151838201526020016147e3565b50505f910152565b602081525f82518060208401526148218160408501602087016147e1565b601f01601f19169190910160400192915050565b5f60208284031215614845575f80fd5b5051919050565b5f8261486657634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114612356575f80fd5b5f6020828403121561488f575f80fd5b8135610a558161486b565b5f808335601e198436030181126148af575f80fd5b8301803591506001600160401b038211156148c8575f80fd5b6020019150600581901b3603821315611ec1575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614907575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561494757614947614911565b60405290565b604051601f8201601f191681016001600160401b038111828210171561497557614975614911565b604052919050565b5f6001600160401b0382111561499557614995614911565b50601f01601f191660200190565b5f606082360312156149b3575f80fd5b6149bb614925565b8235815260206149cc8185016145d8565b8183015260408401356001600160401b038111156149e8575f80fd5b840136601f8201126149f8575f80fd5b8035614a0b614a068261497d565b61494d565b8181523684838501011115614a1e575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516149078184602087016147e1565b80820180821115610a2257610a226147ad565b5f63ffffffff808316818103614a7657614a766147ad565b6001019392505050565b8082028115828204841417610a2257610a226147ad565b6001600160401b03818116838216019080821115612979576129796147ad565b600181811c90821680614acb57607f821691505b6020821081036145c157634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614afb81614ab7565b806020870152604060018084165f8114614b1c5760018114614b3857614b65565b60ff19851660408a0152604084151560051b8a01019550614b65565b895f5260205f205f5b85811015614b5c5781548b8201860152908301908801614b41565b8a016040019650505b509398975050505050505050565b8051611b208161453e565b5f8060408385031215614b8f575f80fd5b82516001600160401b0380821115614ba5575f80fd5b9084019060608287031215614bb8575f80fd5b614bc0614925565b82518152602080840151614bd38161486b565b82820152604084015183811115614be8575f80fd5b80850194505087601f850112614bfc575f80fd5b83519250614c0c614a068461497d565b8381528882858701011115614c1f575f80fd5b614c2e848383018488016147e1565b80604084015250819550614c43818801614b73565b9450505050509250929050565b81810381811115610a2257610a226147ad565b5f808335601e19843603018112614c78575f80fd5b8301803591506001600160401b03821115614c91575f80fd5b602001915036819003821315611ec1575f80fd5b6001600160401b03818116838216028082169190828114614cc857614cc86147ad565b505092915050565b5f6001600160401b03808316818103614a7657614a766147ad565b5f60208284031215614cfb575f80fd5b610a55826145c7565b5f60208284031215614d14575f80fd5b813560ff81168114610a55575f80fd5b601f821115611aef57805f5260205f20601f840160051c81016020851015614d495750805b601f840160051c820191505b81811015610af6575f8155600101614d55565b81516001600160401b03811115614d8157614d81614911565b614d9581614d8f8454614ab7565b84614d24565b602080601f831160018114614dc8575f8415614db15750858301515b5f19600386901b1c1916600185901b178555610c29565b5f85815260208120601f198616915b82811015614df657888601518255948401946001909101908401614dd7565b5085821015614e1357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614e7881604e8601602089016147e1565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1527,13 +1527,12 @@ func (it *NativeTokenStakingManagerDelegatorRemovalInitializedIterator) Close() type NativeTokenStakingManagerDelegatorRemovalInitialized struct { DelegationID [32]byte ValidationID [32]byte - EndTime *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. +// FilterDelegatorRemovalInitialized is a free log retrieval operation binding the contract event 0x366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDelegatorRemovalInitialized(opts *bind.FilterOpts, delegationID [][32]byte, validationID [][32]byte) (*NativeTokenStakingManagerDelegatorRemovalInitializedIterator, error) { var delegationIDRule []interface{} @@ -1552,9 +1551,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterDeleg return &NativeTokenStakingManagerDelegatorRemovalInitializedIterator{contract: _NativeTokenStakingManager.contract, event: "DelegatorRemovalInitialized", logs: logs, sub: sub}, nil } -// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. +// WatchDelegatorRemovalInitialized is a free log subscription operation binding the contract event 0x366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelegatorRemovalInitialized(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerDelegatorRemovalInitialized, delegationID [][32]byte, validationID [][32]byte) (event.Subscription, error) { var delegationIDRule []interface{} @@ -1598,9 +1597,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchDelega }), nil } -// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69. +// ParseDelegatorRemovalInitialized is a log parse operation binding the contract event 0x366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57. // -// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime) +// Solidity: event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelegatorRemovalInitialized(log types.Log) (*NativeTokenStakingManagerDelegatorRemovalInitialized, error) { event := new(NativeTokenStakingManagerDelegatorRemovalInitialized) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "DelegatorRemovalInitialized", log); err != nil { diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 572a99c3d..b111e9168 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -420,61 +420,63 @@ abstract contract PoSValidatorManager is if (delegator.owner != _msgSender()) { revert InvalidAddress(); } - // Delegators may not initiate removal when the validator's state is pending. - if (validator.status == ValidatorStatus.PendingRemoved) { - revert InvalidValidatorStatus(); - } // Set the delegator status to pending removed, so that it can be properly removed in // the complete step, even if the delivered nonce is greater than the nonce used to // initialize the removal. $._delegatorStakes[delegationID].status = DelegatorStatus.PendingRemoved; - uint64 validatorUptimeSeconds; - uint64 delegationEndTime; if (validator.status == ValidatorStatus.Active) { if (includeUptimeProof) { // Uptime proofs include the absolute number of seconds the validator has been active. - validatorUptimeSeconds = _getUptime(validationID, messageIndex); + _getUptime(validationID, messageIndex); } - uint64 newValidatorWeight = validator.weight - delegator.weight; - ($._delegatorStakes[delegationID].endingNonce,) = - _setValidatorWeight(validationID, newValidatorWeight); - delegationEndTime = uint64(block.timestamp); + ($._delegatorStakes[delegationID].endingNonce,) = + _setValidatorWeight(validationID, validator.weight - delegator.weight); + _calculateDelegationReward(delegationID); + } else if (validator.status == ValidatorStatus.Completed) { + _calculateDelegationReward(delegationID); + return _completeEndDelegation(delegationID); } else { - // If the validation period has already ended, we have saved the uptime. - // Further, it is impossible to retrieve an uptime proof for an already ended validation, - // so there's no need to check any uptime proof provided in this function call. - validatorUptimeSeconds = $._completedValidationUptimeSeconds[validationID]; + revert InvalidValidatorStatus(); + } + + emit DelegatorRemovalInitialized({delegationID: delegationID, validationID: validationID}); + } + + function _calculateDelegationReward(bytes32 delegationID) private { + PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + + Delegator memory delegator = $._delegatorStakes[delegationID]; + bytes32 validationID = delegator.validationID; + Validator memory validator = getValidator(validationID); - $._delegatorStakes[delegationID].endingNonce = validator.messageNonce; + uint64 delegationEndTime; + if ( + validator.status == ValidatorStatus.PendingRemoved + || validator.status == ValidatorStatus.Completed + ) { delegationEndTime = validator.endedAt; + } else if (validator.status == ValidatorStatus.Active) { + delegationEndTime = uint64(block.timestamp); + } else { + revert InvalidValidatorStatus(); } // Only give rewards in the case that the delegation started before the validator exited. - if (delegationEndTime > delegator.startedAt) { - $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward({ - stakeAmount: weightToValue(delegator.weight), - validatorStartTime: validator.startedAt, - stakingStartTime: delegator.startedAt, - stakingEndTime: delegationEndTime, - uptimeSeconds: validatorUptimeSeconds, - initialSupply: 0, - endSupply: 0 - }); - } - - // If the validator has been completed, we don't need any more communication with the p-chain and we can - // complete processing the delegator's state now. - if (validator.status == ValidatorStatus.Completed) { - return _completeEndDelegation(delegationID); + if (delegationEndTime <= delegator.startedAt) { + return; } - emit DelegatorRemovalInitialized({ - delegationID: delegationID, - validationID: validationID, - endTime: delegationEndTime + $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward({ + stakeAmount: weightToValue(delegator.weight), + validatorStartTime: validator.startedAt, + stakingStartTime: delegator.startedAt, + stakingEndTime: delegationEndTime, + uptimeSeconds: $._completedValidationUptimeSeconds[validationID], + initialSupply: 0, + endSupply: 0 }); } diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index 40e9970f7..76fc04b58 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -77,11 +77,8 @@ 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 endTime The time at which the removal was initiated */ - event DelegatorRemovalInitialized( - bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime - ); + event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID); /** * @notice Event emitted when delegator removal is completed diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 79dcd2def..20261e0e8 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -55,9 +55,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 indexed delegationID, bytes32 indexed validationID, uint256 startTime ); - event DelegatorRemovalInitialized( - bytes32 indexed delegationID, bytes32 indexed validationID, uint256 endTime - ); + event DelegatorRemovalInitialized(bytes32 indexed delegationID, bytes32 indexed validationID); event ValidatorWeightUpdate( bytes32 indexed validationID, @@ -908,11 +906,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { setWeightMessageID: bytes32(0) }); vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegatorRemovalInitialized({ - delegationID: delegationID, - validationID: validationID, - endTime: endDelegationTimestamp - }); + emit DelegatorRemovalInitialized({delegationID: delegationID, validationID: validationID}); vm.prank(delegatorAddress); posValidatorManager.initializeEndDelegation(delegationID, true, 0); From d8635f3e6d056db92c9d19691b1f0c0fd7c25973 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 25 Sep 2024 09:20:03 -0400 Subject: [PATCH 411/545] Fix --- .../ERC20TokenStakingManager.go | 138 +++++++++++++++++- .../NativeTokenStakingManager.go | 138 +++++++++++++++++- .../validator-manager/PoSValidatorManager.sol | 8 +- 3 files changed, 279 insertions(+), 5 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index a2859d27f..5ba66e7f2 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -82,8 +82,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161537e38038061537e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6152318061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b33660046147b0565b61040d565b005b6101b86101c83660046147eb565b61066f565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa3660046147eb565b6107e1565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b8610241366004614802565b6107f7565b6101b861025436600461481b565b610898565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b8610284366004614843565b610af2565b61029c6102973660046148a7565b610f76565b6040519081526020016101e3565b6101ff6102b83660046147eb565b610f8f565b61029c5f81565b6101b86102d23660046147b0565b610fa3565b6101d5603081565b6101b86102ed3660046147eb565b611195565b6101b861030036600461481b565b611250565b61029c6103133660046148c0565b611417565b6101b8610326366004614802565b611443565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f3660046147eb565b6115b5565b6101b86103723660046147eb565b611791565b6101d5601481565b61039261038d3660046147eb565b6118bb565b6040516101e391906148f4565b6101ff6202a30081565b61029c6103b73660046147eb565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f53660046149b4565b611983565b6101b8610408366004614a2d565b6119b8565b5f8381525f805160206151658339815191526020526040808220815160e0810190925280545f805160206151a583398151915293929190829060ff16600381111561045a5761045a6148e0565b600381111561046b5761046b6148e0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e1826118bb565b90506002835160038111156104f8576104f86148e0565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff191660031790558151600291811115610573576105736148e0565b036105ec57851561058a576105888286611a97565b505b6105a782846060015183608001516105a29190614a7f565b611c1b565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b039092169190911790556105e787611d72565b61063a565b600481516005811115610601576106016148e0565b036106215761060f87611d72565b61061887611fb9565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f805160206152058339815191526020526040808220815160e0810190925280545f805160206151c583398151915293929190829060ff1660058111156106bc576106bc6148e0565b60058111156106cd576106cd6148e0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561073c5761073c6148e0565b1461075a5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61077f8584606001515f6121a0565b6040518263ffffffff1660e01b815260040161079b9190614ac1565b6020604051808303815f875af11580156107b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107db9190614af3565b50505050565b5f6107f164e8d4a5100083614b0a565b92915050565b5f805160206151a58339815191525f80610810846121f7565b9150915061081d82612495565b6108275750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610856576108566148e0565b0361087b575f8381526007850160205260408120805491905561087982826124d0565b505b6108918161088c8460400151610f76565b61253d565b5050505050565b5f8181525f805160206151658339815191526020526040808220815160e0810190925280545f805160206151a583398151915293929190829060ff1660038111156108e5576108e56148e0565b60038111156108f6576108f66148e0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61096c826118bb565b9050600183516003811115610983576109836148e0565b146109a15760405163f95c7fe160e01b815260040160405180910390fd5b6004815160058111156109b6576109b66148e0565b036109cc576109c485611fb9565b505050505050565b5f6109d687612560565b90505f806109e78360400151612660565b5091509150818514610a0c57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610a455750806001600160401b03168660a001516001600160401b0316115b15610a6357604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151c58339815191529060ff1615610b4457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bab9190614af3565b836020013514610bce5760405163d040949d60e01b815260040160405180910390fd5b30610bdf6060850160408601614b29565b6001600160a01b031614610c065760405163e6c4247b60e01b815260040160405180910390fd5b5f610c146060850185614b44565b905090505f805b828163ffffffff161015610ec0575f610c376060880188614b44565b8363ffffffff16818110610c4d57610c4d614b89565b9050602002810190610c5f9190614b9d565b610c6890614c4d565b80515f8181526008880160205260409020549192509015610c9c57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610ccb92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610ce591614ce4565b602060405180830381855afa158015610d00573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d239190614af3565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610daf57610daf6148e0565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610e62911686614cf5565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610eb990614d08565b9050610c1b565b50600483018190555f610ed285612560565b90505f610ee2826040015161289e565b90505f610eee88612a13565b905081600282604051610f019190614ce4565b602060405180830381855afa158015610f1c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f3f9190614af3565b14610f5d57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6107f16001600160401b03831664e8d4a51000614d2a565b5f610f99826118bb565b6080015192915050565b5f805160206151a58339815191525f610fbb85612eac565b9050610fc685612495565b610fd1575050505050565b5f8581526004830160205260409020546001600160a01b031633146110095760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161103891600160b01b90046001600160401b031690614d41565b6001600160401b03168160c001516001600160401b0316101561106e576040516302336bad60e51b815260040160405180910390fd5b8315610891575f61107f8685611a97565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906110cf90610f76565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611145573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111699190614af3565b5f87815260078501602052604081208054909190611188908490614cf5565b9091555050505050505050565b5f805160206151a58339815191525f6111ad836118bb565b90506004815160058111156111c4576111c46148e0565b146111e25760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b0316331461121a5760405163e6c4247b60e01b815260040160405180910390fd5b5f838152600783016020908152604080832080549084905560048601909252909120546107db906001600160a01b0316826124d0565b6112586130e9565b5f8181525f805160206151658339815191526020526040808220815160e0810190925280545f805160206151a583398151915293929190829060ff1660038111156112a5576112a56148e0565b60038111156112b6576112b66148e0565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561132f5761132f6148e0565b1461134d5760405163f95c7fe160e01b815260040160405180910390fd5b600461135c82604001516118bb565b51600581111561136e5761136e6148e0565b146113f2575f61137d85612560565b90505f8061138e8360400151612660565b5091509150818460400151146113b757604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156113ee57604051633ab3447f60e11b815260040160405180910390fd5b5050505b6113fb83611fb9565b505061141360015f805160206151e583398151915255565b5050565b5f6114206130e9565b61142b833384613133565b90506107f160015f805160206151e583398151915255565b5f805160206151c58339815191525f61145b83612560565b90505f8061146c83604001516133fa565b915091508061148e57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546114a890614d61565b90505f036114c957604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156114ef576114ef6148e0565b1461150d5760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061152591614700565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206151658339815191526020526040808220815160e0810190925280545f805160206151a583398151915293929190829060ff166003811115611602576116026148e0565b6003811115611613576116136148e0565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561168c5761168c6148e0565b141580156116ad57506003815160038111156116aa576116aa6148e0565b14155b156116cb5760405163f95c7fe160e01b815260040160405180910390fd5b5f6116d982604001516118bb565b905080606001516001600160401b03165f0361170857604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6117358460400151846060015185608001516121a0565b6040518263ffffffff1660e01b81526004016117519190614ac1565b6020604051808303815f875af115801561176d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108919190614af3565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206151c583398151915291906117d890614d61565b90505f036117f957604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561181f5761181f6148e0565b1461183d5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118769190600401614d99565b6020604051808303815f875af1158015611892573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118b69190614af3565b505050565b6118c3614737565b5f8281525f80516020615205833981519152602052604090819020815160e0810190925280545f805160206151c5833981519152929190829060ff166005811115611910576119106148e0565b6005811115611921576119216148e0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61198c6130e9565b6119988585858561359e565b90506119b060015f805160206151e583398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a01575080546001600160401b03808416911610155b15611a1f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a4a848461373c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ae2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b099190810190614e2e565b9150915080611b2b57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b6e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b929190614af3565b825114611bb25760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611bde5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611bed8460400151613756565b91509150818714611c1157604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615205833981519152602052604081206002015481905f805160206151c583398151915290600160801b90046001600160401b0316611c638582613931565b5f611c6d87613afa565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611cbd8a858b6121a0565b6040518263ffffffff1660e01b8152600401611cd99190614ac1565b6020604051808303815f875af1158015611cf5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d199190614af3565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f805160206151658339815191526020526040808220815160e0810190925280545f805160206151a583398151915293929190829060ff166003811115611dbf57611dbf6148e0565b6003811115611dd057611dd06148e0565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611e46826118bb565b90505f600382516005811115611e5e57611e5e6148e0565b1480611e7c5750600482516005811115611e7a57611e7a6148e0565b145b15611e8c575060c0810151611ea9565b600282516005811115611ea157611ea16148e0565b036106215750425b83608001516001600160401b0316816001600160401b031611611ece57505050505050565b600385015460608501516001600160a01b039091169063778c06b590611ef390610f76565b60a085015160808801515f88815260088b01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa158015611f7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9e9190614af3565b5f968752600690950160205250506040909320919091555050565b5f8181525f805160206151658339815191526020526040808220815160e0810190925280545f805160206151a583398151915293929190829060ff166003811115612006576120066148e0565b6003811115612017576120176148e0565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612145575f848152600487016020526040902054612710906120f790600160a01b900461ffff1685614d2a565b6121019190614b0a565b915081866007015f8681526020019081526020015f205f8282546121259190614cf5565b9091555061213590508284614f00565b90506121458560200151826124d0565b61215a856020015161088c8760600151610f76565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f612200614737565b5f805160206151c58339815191525f61221885612560565b90505f8061222983604001516133fa565b91509150801561224c57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561227d5761227d6148e0565b600581111561228e5761228e6148e0565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156122fd576122fd6148e0565b1415801561231e575060018151600581111561231b5761231b6148e0565b14155b1561233c5760405163a36c527f60e01b815260040160405180910390fd5b600381516005811115612351576123516148e0565b0361235f5760048152612364565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156123a9576123a96148e0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561245d5761245d6148e0565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061518583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561252b575f80fd5b505af1158015610618573d5f803e3d5ffd5b5f8051602061518583398151915254611413906001600160a01b03168383613b6f565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156125c4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125eb9190810190614e2e565b915091508061260d57604051636b2f19e960e01b815260040160405180910390fd5b81511561262d5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156126595760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461268557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156126d45761269c816001614f00565b6126a7906008614d2a565b61ffff168682815181106126bd576126bd614b89565b016020015160f81c901b9190911790600101612688565b5061ffff8116156126f85760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156127535761270f816003614f00565b61271a906008614d2a565b63ffffffff168761272c836002614cf5565b8151811061273c5761273c614b89565b016020015160f81c901b91909117906001016126fb565b5063ffffffff811660041461277b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156127d05761279281601f614f00565b61279d906008614d2a565b886127a9836006614cf5565b815181106127b9576127b9614b89565b016020015160f81c901b919091179060010161277e565b505f805b600881101561282f576127e8816007614f00565b6127f3906008614d2a565b6001600160401b031689612808836026614cf5565b8151811061281857612818614b89565b016020015160f81c901b91909117906001016127d4565b505f805b600881101561288e57612847816007614f00565b612852906008614d2a565b6001600160401b03168a61286783602e614cf5565b8151811061287757612877614b89565b016020015160f81c901b9190911790600101612833565b5091989097509095509350505050565b5f81516026146128c157604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612910576128d8816001614f00565b6128e3906008614d2a565b61ffff168482815181106128f9576128f9614b89565b016020015160f81c901b91909117906001016128c4565b5061ffff8116156129345760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561298f5761294b816003614f00565b612956906008614d2a565b63ffffffff1685612968836002614cf5565b8151811061297857612978614b89565b016020015160f81c901b9190911790600101612937565b5063ffffffff8116156129b557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a0a576129cc81601f614f00565b6129d7906008614d2a565b866129e3836006614cf5565b815181106129f3576129f3614b89565b016020015160f81c901b91909117906001016129b8565b50949350505050565b60605f612a2283830184614b44565b612a2e91506058614d2a565b612a3990605c614cf5565b6001600160401b03811115612a5057612a50614bbb565b6040519080825280601f01601f191660200182016040528015612a7a576020820181803683370190505b5090505f5b6020811015612acf5783358160208110612a9b57612a9b614b89565b1a60f81b828281518110612ab157612ab1614b89565b60200101906001600160f81b03191690815f1a905350600101612a7f565b505f5b6020811015612b2f5783602001358160208110612af157612af1614b89565b1a60f81b82612b01836020614cf5565b81518110612b1157612b11614b89565b60200101906001600160f81b03191690815f1a905350600101612ad2565b505f5b6004811015612b9257612b46816003614f00565b612b51906008614d2a565b6014901c60f81b82612b64836040614cf5565b81518110612b7457612b74614b89565b60200101906001600160f81b03191690815f1a905350600101612b32565b505f612ba46060850160408601614b29565b60601b90505f5b6014811015612c0457818160148110612bc657612bc6614b89565b1a60f81b83612bd6836044614cf5565b81518110612be657612be6614b89565b60200101906001600160f81b03191690815f1a905350600101612bab565b505f612c136060860186614b44565b905090505f5b6004811015612c7e57612c2d816003614f00565b612c38906008614d2a565b63ffffffff8316901c60f81b84612c50836058614cf5565b81518110612c6057612c60614b89565b60200101906001600160f81b03191690815f1a905350600101612c19565b505f5b612c8e6060870187614b44565b9050811015612ea2575f612ca3826058614d2a565b612cae90605c614cf5565b90505f5b6020811015612d3957612cc86060890189614b44565b84818110612cd857612cd8614b89565b9050602002810190612cea9190614b9d565b358160208110612cfc57612cfc614b89565b1a60f81b86612d0b8385614cf5565b81518110612d1b57612d1b614b89565b60200101906001600160f81b03191690815f1a905350600101612cb2565b505f5b6008811015612dee57612d50816007614f00565b612d5b906008614d2a565b612d6860608a018a614b44565b85818110612d7857612d78614b89565b9050602002810190612d8a9190614b9d565b612d9b9060408101906020016148a7565b6001600160401b0316901c60f81b8682612db6856020614cf5565b612dc09190614cf5565b81518110612dd057612dd0614b89565b60200101906001600160f81b03191690815f1a905350600101612d3c565b505f5b6030811015612e9857612e076060890189614b44565b84818110612e1757612e17614b89565b9050602002810190612e299190614b9d565b612e37906040810190614f13565b82818110612e4757612e47614b89565b9050013560f81c60f81b8682846028612e609190614cf5565b612e6a9190614cf5565b81518110612e7a57612e7a614b89565b60200101906001600160f81b03191690815f1a905350600101612df1565b5050600101612c81565b5091949350505050565b612eb4614737565b5f8281525f805160206152058339815191526020526040808220815160e0810190925280545f805160206151c583398151915293929190829060ff166005811115612f0157612f016148e0565b6005811115612f1257612f126148e0565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612f8457612f846148e0565b14612fa25760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612fe657612fe66148e0565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130928582611c1b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f805160206151e583398151915280546001190161311a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206151e583398151915255565b5f5f805160206151a58339815191528161314f6101fa85613bce565b90505f61315b876118bb565b905061316687612495565b61318357604051636ca57bcf60e01b815260040160405180910390fd5b600281516005811115613198576131986148e0565b146131b65760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516131c79190614d41565b905083600201600a9054906101000a90046001600160401b031682604001516131f09190614f55565b6001600160401b0316816001600160401b0316111561322257604051630c192e7760e41b815260040160405180910390fd5b5f8061322e8a84611c1b565b915091505f8a8360405160200161325c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156132ef576132ef6148e0565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461341e57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561346d57613435816001614f00565b613440906008614d2a565b61ffff1685828151811061345657613456614b89565b016020015160f81c901b9190911790600101613421565b5061ffff8116156134915760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156134ec576134a8816003614f00565b6134b3906008614d2a565b63ffffffff16866134c5836002614cf5565b815181106134d5576134d5614b89565b016020015160f81c901b9190911790600101613494565b5063ffffffff811660031461351457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135695761352b81601f614f00565b613536906008614d2a565b87613542836006614cf5565b8151811061355257613552614b89565b016020015160f81c901b9190911790600101613517565b505f8660268151811061357e5761357e614b89565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206151a583398151915290600160401b900461ffff90811690861610806135f2575061271061ffff8616115b156136105760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613642576040516302336bad60e51b815260040160405180910390fd5b80548310806136545750806001015483115b1561367257604051630103be3b60e21b815260040160405180910390fd5b5f61367c84613bce565b90505f613688826107e1565b90505f6136958983613bf1565b905060405180606001604052806136a93390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613744613fdb565b61374d82614026565b61141381614097565b5f808251602e1461377a57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137c957613791816001614f00565b61379c906008614d2a565b61ffff168582815181106137b2576137b2614b89565b016020015160f81c901b919091179060010161377d565b5061ffff8116156137ed5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561384857613804816003614f00565b61380f906008614d2a565b63ffffffff1686613821836002614cf5565b8151811061383157613831614b89565b016020015160f81c901b91909117906001016137f0565b5063ffffffff811660051461387057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138c55761388781601f614f00565b613892906008614d2a565b8761389e836006614cf5565b815181106138ae576138ae614b89565b016020015160f81c901b9190911790600101613873565b505f805b6008811015613924576138dd816007614f00565b6138e8906008614d2a565b6001600160401b0316886138fd836026614cf5565b8151811061390d5761390d614b89565b016020015160f81c901b91909117906001016138c9565b5090969095509350505050565b5f805160206151c58339815191525f6001600160401b0380841690851611156139655761395e8385614a7f565b9050613972565b61396f8484614a7f565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806139d45750600184015481516139d0916001600160401b031690614cf5565b8210155b156139fa576001600160401b038316606082015281815260408101516020820152613a19565b8281606001818151613a0c9190614d41565b6001600160401b03169052505b6060810151613a29906064614f55565b602082015160018601546001600160401b039290921691613a549190600160401b900460ff16614d2a565b1015613a735760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613a8e9190614cf5565b9052506040810180516001600160401b0387169190613aae908390614f00565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206152058339815191526020526040812060020180545f805160206151c58339815191529190600890613b4490600160401b90046001600160401b0316614f80565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b038381166024830152604482018390526118b691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506140f4565b5f6107f1825f80516020615185833981519152546001600160a01b03169061415a565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613c3557604051637fab81e560e01b815260040160405180910390fd5b5f805160206151c583398151915242613c5460408601602087016148a7565b6001600160401b0316111580613c8e5750613c726202a30042614cf5565b613c8260408601602087016148a7565b6001600160401b031610155b15613cab5760405162d36c8560e81b815260040160405180910390fd5b6030613cba6040860186614f13565b9050141580613cc857508335155b15613ce65760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613d1657604051630eb0d31360e11b815260040160405180910390fd5b613d20835f613931565b5f80613db96040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613d6491906148a7565b6001600160401b03168152602001613d7f60408a018a614f13565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506142bc565b5f82815260068601602052604090209193509150613dd78282614fdf565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613e15908590600401614ac1565b6020604051808303815f875af1158015613e31573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e559190614af3565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613ecd57613ecd6148e0565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613fad918e01908e016148a7565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661402457604051631afcd79f60e31b815260040160405180910390fd5b565b61402e613fdb565b6140378161437f565b61403f614398565b6140946060820135608083013561405c60c0850160a086016148a7565b61406c60e0860160c0870161509a565b61407d610100870160e088016150b3565b61408f61012088016101008901614b29565b6143a8565b50565b61409f613fdb565b5f805160206151858339815191526001600160a01b0382166140d45760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6141086001600160a01b038416836144c9565b905080515f1415801561412c57508080602001905181019061412a91906150d3565b155b156118b657604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156141a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141c49190614af3565b90506141db6001600160a01b0385163330866144d6565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561421f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142439190614af3565b90508181116142a95760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401614151565b6142b38282614f00565b95945050505050565b5f60608260800151516030146142e557604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161431797969594939291906150ee565b60405160208183030381529060405290506002816040516143389190614ce4565b602060405180830381855afa158015614353573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143769190614af3565b94909350915050565b614387613fdb565b61438f61450f565b61409481614517565b6143a0613fdb565b6140246145e9565b6143b0613fdb565b5f805160206151a583398151915261ffff841615806143d4575061271061ffff8516115b156143f25760405163c98d73a760e01b815260040160405180910390fd5b8587111561441357604051630103be3b60e21b815260040160405180910390fd5b60ff831615806144265750600a60ff8416115b15614444576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b60606121f083835f6145f1565b6040516001600160a01b0384811660248301528381166044830152606482018390526107db9186918216906323b872dd90608401613b9c565b614024613fdb565b61451f613fdb565b80355f805160206151c5833981519152908155601461454460608401604085016150b3565b60ff161180614563575061455e60608301604084016150b3565b60ff16155b156145815760405163b4fa3fb360e01b815260040160405180910390fd5b61459160608301604084016150b3565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556145c260408301602084016148a7565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613120613fdb565b6060814710156146165760405163cd78605960e01b8152306004820152602401614151565b5f80856001600160a01b031684866040516146319190614ce4565b5f6040518083038185875af1925050503d805f811461466b576040519150601f19603f3d011682016040523d82523d5f602084013e614670565b606091505b5091509150611c118683836060826146905761468b826146d7565b6121f0565b81511580156146a757506001600160a01b0384163b155b156146d057604051639996b31560e01b81526001600160a01b0385166004820152602401614151565b50806121f0565b8051156146e75780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461470c90614d61565b5f825580601f1061471b575050565b601f0160209004905f5260205f20908101906140949190614773565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614787575f8155600101614774565b5090565b8015158114614094575f80fd5b803563ffffffff811681146147ab575f80fd5b919050565b5f805f606084860312156147c2575f80fd5b8335925060208401356147d48161478b565b91506147e260408501614798565b90509250925092565b5f602082840312156147fb575f80fd5b5035919050565b5f60208284031215614812575f80fd5b6121f082614798565b5f806040838503121561482c575f80fd5b61483583614798565b946020939093013593505050565b5f8060408385031215614854575f80fd5b82356001600160401b03811115614869575f80fd5b83016080818603121561487a575f80fd5b915061488860208401614798565b90509250929050565b80356001600160401b03811681146147ab575f80fd5b5f602082840312156148b7575f80fd5b6121f082614891565b5f80604083850312156148d1575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061491757634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161495260608401826001600160401b03169052565b50608083015161496d60808401826001600160401b03169052565b5060a083015161498860a08401826001600160401b03169052565b5060c083015161265960c08401826001600160401b03169052565b803561ffff811681146147ab575f80fd5b5f805f80608085870312156149c7575f80fd5b84356001600160401b038111156149dc575f80fd5b8501606081880312156149ed575f80fd5b93506149fb602086016149a3565b9250614a0960408601614891565b9396929550929360600135925050565b6001600160a01b0381168114614094575f80fd5b5f80828403610140811215614a40575f80fd5b61012080821215614a4f575f80fd5b8493508301359050614a6081614a19565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561265957612659614a6b565b5f5b83811015614ab9578181015183820152602001614aa1565b50505f910152565b602081525f8251806020840152614adf816040850160208701614a9f565b601f01601f19169190910160400192915050565b5f60208284031215614b03575f80fd5b5051919050565b5f82614b2457634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614b39575f80fd5b81356121f081614a19565b5f808335601e19843603018112614b59575f80fd5b8301803591506001600160401b03821115614b72575f80fd5b6020019150600581901b3603821315611d6b575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614bb1575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614bf157614bf1614bbb565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c1f57614c1f614bbb565b604052919050565b5f6001600160401b03821115614c3f57614c3f614bbb565b50601f01601f191660200190565b5f60608236031215614c5d575f80fd5b614c65614bcf565b823581526020614c76818501614891565b8183015260408401356001600160401b03811115614c92575f80fd5b840136601f820112614ca2575f80fd5b8035614cb5614cb082614c27565b614bf7565b8181523684838501011115614cc8575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614bb1818460208701614a9f565b808201808211156107f1576107f1614a6b565b5f63ffffffff808316818103614d2057614d20614a6b565b6001019392505050565b80820281158282048414176107f1576107f1614a6b565b6001600160401b0381811683821601908082111561265957612659614a6b565b600181811c90821680614d7557607f821691505b602082108103614d9357634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614dab81614d61565b806020870152604060018084165f8114614dcc5760018114614de857614e15565b60ff19851660408a0152604084151560051b8a01019550614e15565b895f5260205f205f5b85811015614e0c5781548b8201860152908301908801614df1565b8a016040019650505b509398975050505050505050565b80516147ab8161478b565b5f8060408385031215614e3f575f80fd5b82516001600160401b0380821115614e55575f80fd5b9084019060608287031215614e68575f80fd5b614e70614bcf565b82518152602080840151614e8381614a19565b82820152604084015183811115614e98575f80fd5b80850194505087601f850112614eac575f80fd5b83519250614ebc614cb084614c27565b8381528882858701011115614ecf575f80fd5b614ede84838301848801614a9f565b80604084015250819550614ef3818801614e23565b9450505050509250929050565b818103818111156107f1576107f1614a6b565b5f808335601e19843603018112614f28575f80fd5b8301803591506001600160401b03821115614f41575f80fd5b602001915036819003821315611d6b575f80fd5b6001600160401b03818116838216028082169190828114614f7857614f78614a6b565b505092915050565b5f6001600160401b03808316818103614d2057614d20614a6b565b601f8211156118b657805f5260205f20601f840160051c81016020851015614fc05750805b601f840160051c820191505b81811015610891575f8155600101614fcc565b81516001600160401b03811115614ff857614ff8614bbb565b61500c816150068454614d61565b84614f9b565b602080601f83116001811461503f575f84156150285750858301515b5f19600386901b1c1916600185901b1785556109c4565b5f85815260208120601f198616915b8281101561506d5788860151825594840194600190910190840161504e565b508582101561508a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156150aa575f80fd5b6121f0826149a3565b5f602082840312156150c3575f80fd5b813560ff811681146121f0575f80fd5b5f602082840312156150e3575f80fd5b81516121f08161478b565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161514381604e860160208901614a9f565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"GeoffEvent\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161542938038061542983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6152dc8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b336600461485b565b61040d565b005b6101b86101c8366004614896565b61069c565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004614896565b61080e565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b86102413660046148ad565b610824565b6101b86102543660046148c6565b6108c5565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b86102843660046148ee565b610b1f565b61029c610297366004614952565b610fa3565b6040519081526020016101e3565b6101ff6102b8366004614896565b610fbc565b61029c5f81565b6101b86102d236600461485b565b610fd0565b6101d5603081565b6101b86102ed366004614896565b6111c2565b6101b86103003660046148c6565b61127d565b61029c61031336600461496b565b611444565b6101b86103263660046148ad565b611470565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004614896565b6115e2565b6101b8610372366004614896565b6117be565b6101d5601481565b61039261038d366004614896565b6118e8565b6040516101e3919061499f565b6101ff6202a30081565b61029c6103b7366004614896565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f5366004614a5f565b6119b0565b6101b8610408366004614ad8565b6119e5565b5f8381525f805160206152108339815191526020526040808220815160e0810190925280545f8051602061525083398151915293929190829060ff16600381111561045a5761045a61498b565b600381111561046b5761046b61498b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e1826118e8565b90506002835160038111156104f8576104f861498b565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156105735761057361498b565b036106195785156105b7576105888286611ac4565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b6105d482846060015183608001516105cf9190614b2a565b611c48565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561061487611d9f565b610667565b60048151600581111561062e5761062e61498b565b0361064e5761063c87611d9f565b61064587612064565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f805160206152b08339815191526020526040808220815160e0810190925280545f8051602061527083398151915293929190829060ff1660058111156106e9576106e961498b565b60058111156106fa576106fa61498b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156107695761076961498b565b146107875760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107ac8584606001515f61224b565b6040518263ffffffff1660e01b81526004016107c89190614b6c565b6020604051808303815f875af11580156107e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108089190614b9e565b50505050565b5f61081e64e8d4a5100083614bb5565b92915050565b5f805160206152508339815191525f8061083d846122a2565b9150915061084a82612540565b6108545750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156108835761088361498b565b036108a8575f838152600785016020526040812080549190556108a6828261257b565b505b6108be816108b98460400151610fa3565b6125e8565b5050505050565b5f8181525f805160206152108339815191526020526040808220815160e0810190925280545f8051602061525083398151915293929190829060ff1660038111156109125761091261498b565b60038111156109235761092361498b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610999826118e8565b90506001835160038111156109b0576109b061498b565b146109ce5760405163f95c7fe160e01b815260040160405180910390fd5b6004815160058111156109e3576109e361498b565b036109f9576109f185612064565b505050505050565b5f610a038761260b565b90505f80610a14836040015161270b565b5091509150818514610a3957604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610a725750806001600160401b03168660a001516001600160401b0316115b15610a9057604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206152708339815191529060ff1615610b7157604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd89190614b9e565b836020013514610bfb5760405163d040949d60e01b815260040160405180910390fd5b30610c0c6060850160408601614bd4565b6001600160a01b031614610c335760405163e6c4247b60e01b815260040160405180910390fd5b5f610c416060850185614bef565b905090505f805b828163ffffffff161015610eed575f610c646060880188614bef565b8363ffffffff16818110610c7a57610c7a614c34565b9050602002810190610c8c9190614c48565b610c9590614cf8565b80515f8181526008880160205260409020549192509015610cc957604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610cf892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610d1291614d8f565b602060405180830381855afa158015610d2d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d509190614b9e565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610ddc57610ddc61498b565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610e8f911686614da0565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610ee690614db3565b9050610c48565b50600483018190555f610eff8561260b565b90505f610f0f8260400151612949565b90505f610f1b88612abe565b905081600282604051610f2e9190614d8f565b602060405180830381855afa158015610f49573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f6c9190614b9e565b14610f8a57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61081e6001600160401b03831664e8d4a51000614dd5565b5f610fc6826118e8565b6080015192915050565b5f805160206152508339815191525f610fe885612f57565b9050610ff385612540565b610ffe575050505050565b5f8581526004830160205260409020546001600160a01b031633146110365760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161106591600160b01b90046001600160401b031690614dec565b6001600160401b03168160c001516001600160401b0316101561109b576040516302336bad60e51b815260040160405180910390fd5b83156108be575f6110ac8685611ac4565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906110fc90610fa3565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611172573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111969190614b9e565b5f878152600785016020526040812080549091906111b5908490614da0565b9091555050505050505050565b5f805160206152508339815191525f6111da836118e8565b90506004815160058111156111f1576111f161498b565b1461120f5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146112475760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610808906001600160a01b03168261257b565b611285613194565b5f8181525f805160206152108339815191526020526040808220815160e0810190925280545f8051602061525083398151915293929190829060ff1660038111156112d2576112d261498b565b60038111156112e3576112e361498b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561135c5761135c61498b565b1461137a5760405163f95c7fe160e01b815260040160405180910390fd5b600461138982604001516118e8565b51600581111561139b5761139b61498b565b1461141f575f6113aa8561260b565b90505f806113bb836040015161270b565b5091509150818460400151146113e457604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561141b57604051633ab3447f60e11b815260040160405180910390fd5b5050505b61142883612064565b505061144060015f8051602061529083398151915255565b5050565b5f61144d613194565b6114588333846131de565b905061081e60015f8051602061529083398151915255565b5f805160206152708339815191525f6114888361260b565b90505f8061149983604001516134a5565b91509150806114bb57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546114d590614e0c565b90505f036114f657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561151c5761151c61498b565b1461153a5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120611552916147ab565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206152108339815191526020526040808220815160e0810190925280545f8051602061525083398151915293929190829060ff16600381111561162f5761162f61498b565b60038111156116405761164061498b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116b9576116b961498b565b141580156116da57506003815160038111156116d7576116d761498b565b14155b156116f85760405163f95c7fe160e01b815260040160405180910390fd5b5f61170682604001516118e8565b905080606001516001600160401b03165f0361173557604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61176284604001518460600151856080015161224b565b6040518263ffffffff1660e01b815260040161177e9190614b6c565b6020604051808303815f875af115801561179a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108be9190614b9e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615270833981519152919061180590614e0c565b90505f0361182657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561184c5761184c61498b565b1461186a5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118a39190600401614e44565b6020604051808303815f875af11580156118bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118e39190614b9e565b505050565b6118f06147e2565b5f8281525f805160206152b0833981519152602052604090819020815160e0810190925280545f80516020615270833981519152929190829060ff16600581111561193d5761193d61498b565b600581111561194e5761194e61498b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6119b9613194565b6119c585858585613649565b90506119dd60015f8051602061529083398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a2e575080546001600160401b03808416911610155b15611a4c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a7784846137e7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611b0f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b369190810190614ed9565b9150915080611b5857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbf9190614b9e565b825114611bdf5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611c0b5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611c1a8460400151613801565b91509150818714611c3e57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f805160206152b0833981519152602052604081206002015481905f8051602061527083398151915290600160801b90046001600160401b0316611c9085826139dc565b5f611c9a87613ba5565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611cea8a858b61224b565b6040518263ffffffff1660e01b8152600401611d069190614b6c565b6020604051808303815f875af1158015611d22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d469190614b9e565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f805160206152108339815191526020526040808220815160e0810190925280545f8051602061525083398151915293929190829060ff166003811115611dec57611dec61498b565b6003811115611dfd57611dfd61498b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611e73826118e8565b90505f600382516005811115611e8b57611e8b61498b565b1480611ea95750600482516005811115611ea757611ea761498b565b145b15611eb9575060c0810151611ed6565b600282516005811115611ece57611ece61498b565b0361064e5750425b6040516001600160401b03821681527f108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e69060200160405180910390a160808401516040516001600160401b0390911681527f108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e69060200160405180910390a183608001516001600160401b0316816001600160401b031611611f7957505050505050565b600385015460608501516001600160a01b039091169063778c06b590611f9e90610fa3565b60a085015160808801515f88815260088b01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa158015612025573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120499190614b9e565b5f968752600690950160205250506040909320919091555050565b5f8181525f805160206152108339815191526020526040808220815160e0810190925280545f8051602061525083398151915293929190829060ff1660038111156120b1576120b161498b565b60038111156120c2576120c261498b565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156121f0575f848152600487016020526040902054612710906121a290600160a01b900461ffff1685614dd5565b6121ac9190614bb5565b915081866007015f8681526020019081526020015f205f8282546121d09190614da0565b909155506121e090508284614fab565b90506121f085602001518261257b565b61220585602001516108b98760600151610fa3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6122ab6147e2565b5f805160206152708339815191525f6122c38561260b565b90505f806122d483604001516134a5565b9150915080156122f757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156123285761232861498b565b60058111156123395761233961498b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156123a8576123a861498b565b141580156123c957506001815160058111156123c6576123c661498b565b14155b156123e75760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156123fc576123fc61498b565b0361240a576004815261240f565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156124545761245461498b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156125085761250861498b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061523083398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156125d6575f80fd5b505af1158015610645573d5f803e3d5ffd5b5f8051602061523083398151915254611440906001600160a01b03168383613c1a565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561266f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126969190810190614ed9565b91509150806126b857604051636b2f19e960e01b815260040160405180910390fd5b8151156126d85760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156127045760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461273057604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561277f57612747816001614fab565b612752906008614dd5565b61ffff1686828151811061276857612768614c34565b016020015160f81c901b9190911790600101612733565b5061ffff8116156127a35760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156127fe576127ba816003614fab565b6127c5906008614dd5565b63ffffffff16876127d7836002614da0565b815181106127e7576127e7614c34565b016020015160f81c901b91909117906001016127a6565b5063ffffffff811660041461282657604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561287b5761283d81601f614fab565b612848906008614dd5565b88612854836006614da0565b8151811061286457612864614c34565b016020015160f81c901b9190911790600101612829565b505f805b60088110156128da57612893816007614fab565b61289e906008614dd5565b6001600160401b0316896128b3836026614da0565b815181106128c3576128c3614c34565b016020015160f81c901b919091179060010161287f565b505f805b6008811015612939576128f2816007614fab565b6128fd906008614dd5565b6001600160401b03168a61291283602e614da0565b8151811061292257612922614c34565b016020015160f81c901b91909117906001016128de565b5091989097509095509350505050565b5f815160261461296c57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129bb57612983816001614fab565b61298e906008614dd5565b61ffff168482815181106129a4576129a4614c34565b016020015160f81c901b919091179060010161296f565b5061ffff8116156129df5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612a3a576129f6816003614fab565b612a01906008614dd5565b63ffffffff1685612a13836002614da0565b81518110612a2357612a23614c34565b016020015160f81c901b91909117906001016129e2565b5063ffffffff811615612a6057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612ab557612a7781601f614fab565b612a82906008614dd5565b86612a8e836006614da0565b81518110612a9e57612a9e614c34565b016020015160f81c901b9190911790600101612a63565b50949350505050565b60605f612acd83830184614bef565b612ad991506058614dd5565b612ae490605c614da0565b6001600160401b03811115612afb57612afb614c66565b6040519080825280601f01601f191660200182016040528015612b25576020820181803683370190505b5090505f5b6020811015612b7a5783358160208110612b4657612b46614c34565b1a60f81b828281518110612b5c57612b5c614c34565b60200101906001600160f81b03191690815f1a905350600101612b2a565b505f5b6020811015612bda5783602001358160208110612b9c57612b9c614c34565b1a60f81b82612bac836020614da0565b81518110612bbc57612bbc614c34565b60200101906001600160f81b03191690815f1a905350600101612b7d565b505f5b6004811015612c3d57612bf1816003614fab565b612bfc906008614dd5565b6014901c60f81b82612c0f836040614da0565b81518110612c1f57612c1f614c34565b60200101906001600160f81b03191690815f1a905350600101612bdd565b505f612c4f6060850160408601614bd4565b60601b90505f5b6014811015612caf57818160148110612c7157612c71614c34565b1a60f81b83612c81836044614da0565b81518110612c9157612c91614c34565b60200101906001600160f81b03191690815f1a905350600101612c56565b505f612cbe6060860186614bef565b905090505f5b6004811015612d2957612cd8816003614fab565b612ce3906008614dd5565b63ffffffff8316901c60f81b84612cfb836058614da0565b81518110612d0b57612d0b614c34565b60200101906001600160f81b03191690815f1a905350600101612cc4565b505f5b612d396060870187614bef565b9050811015612f4d575f612d4e826058614dd5565b612d5990605c614da0565b90505f5b6020811015612de457612d736060890189614bef565b84818110612d8357612d83614c34565b9050602002810190612d959190614c48565b358160208110612da757612da7614c34565b1a60f81b86612db68385614da0565b81518110612dc657612dc6614c34565b60200101906001600160f81b03191690815f1a905350600101612d5d565b505f5b6008811015612e9957612dfb816007614fab565b612e06906008614dd5565b612e1360608a018a614bef565b85818110612e2357612e23614c34565b9050602002810190612e359190614c48565b612e46906040810190602001614952565b6001600160401b0316901c60f81b8682612e61856020614da0565b612e6b9190614da0565b81518110612e7b57612e7b614c34565b60200101906001600160f81b03191690815f1a905350600101612de7565b505f5b6030811015612f4357612eb26060890189614bef565b84818110612ec257612ec2614c34565b9050602002810190612ed49190614c48565b612ee2906040810190614fbe565b82818110612ef257612ef2614c34565b9050013560f81c60f81b8682846028612f0b9190614da0565b612f159190614da0565b81518110612f2557612f25614c34565b60200101906001600160f81b03191690815f1a905350600101612e9c565b5050600101612d2c565b5091949350505050565b612f5f6147e2565b5f8281525f805160206152b08339815191526020526040808220815160e0810190925280545f8051602061527083398151915293929190829060ff166005811115612fac57612fac61498b565b6005811115612fbd57612fbd61498b565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561302f5761302f61498b565b1461304d5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156130915761309161498b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61313d8582611c48565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f805160206152908339815191528054600119016131c557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061529083398151915255565b5f5f80516020615250833981519152816131fa6101fa85613c79565b90505f613206876118e8565b905061321187612540565b61322e57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156132435761324361498b565b146132615760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516132729190614dec565b905083600201600a9054906101000a90046001600160401b0316826040015161329b9190615000565b6001600160401b0316816001600160401b031611156132cd57604051630c192e7760e41b815260040160405180910390fd5b5f806132d98a84611c48565b915091505f8a8360405160200161330792919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561339a5761339a61498b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146134c957604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613518576134e0816001614fab565b6134eb906008614dd5565b61ffff1685828151811061350157613501614c34565b016020015160f81c901b91909117906001016134cc565b5061ffff81161561353c5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561359757613553816003614fab565b61355e906008614dd5565b63ffffffff1686613570836002614da0565b8151811061358057613580614c34565b016020015160f81c901b919091179060010161353f565b5063ffffffff81166003146135bf57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613614576135d681601f614fab565b6135e1906008614dd5565b876135ed836006614da0565b815181106135fd576135fd614c34565b016020015160f81c901b91909117906001016135c2565b505f8660268151811061362957613629614c34565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061525083398151915290600160401b900461ffff908116908616108061369d575061271061ffff8616115b156136bb5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156136ed576040516302336bad60e51b815260040160405180910390fd5b80548310806136ff5750806001015483115b1561371d57604051630103be3b60e21b815260040160405180910390fd5b5f61372784613c79565b90505f6137338261080e565b90505f6137408983613c9c565b905060405180606001604052806137543390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6137ef614086565b6137f8826140d1565b61144081614142565b5f808251602e1461382557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156138745761383c816001614fab565b613847906008614dd5565b61ffff1685828151811061385d5761385d614c34565b016020015160f81c901b9190911790600101613828565b5061ffff8116156138985760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156138f3576138af816003614fab565b6138ba906008614dd5565b63ffffffff16866138cc836002614da0565b815181106138dc576138dc614c34565b016020015160f81c901b919091179060010161389b565b5063ffffffff811660051461391b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139705761393281601f614fab565b61393d906008614dd5565b87613949836006614da0565b8151811061395957613959614c34565b016020015160f81c901b919091179060010161391e565b505f805b60088110156139cf57613988816007614fab565b613993906008614dd5565b6001600160401b0316886139a8836026614da0565b815181106139b8576139b8614c34565b016020015160f81c901b9190911790600101613974565b5090969095509350505050565b5f805160206152708339815191525f6001600160401b038084169085161115613a1057613a098385614b2a565b9050613a1d565b613a1a8484614b2a565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a7f575060018401548151613a7b916001600160401b031690614da0565b8210155b15613aa5576001600160401b038316606082015281815260408101516020820152613ac4565b8281606001818151613ab79190614dec565b6001600160401b03169052505b6060810151613ad4906064615000565b602082015160018601546001600160401b039290921691613aff9190600160401b900460ff16614dd5565b1015613b1e5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613b399190614da0565b9052506040810180516001600160401b0387169190613b59908390614fab565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206152b08339815191526020526040812060020180545f805160206152708339815191529190600890613bef90600160401b90046001600160401b031661502b565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b038381166024830152604482018390526118e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061419f565b5f61081e825f80516020615230833981519152546001600160a01b031690614205565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ce057604051637fab81e560e01b815260040160405180910390fd5b5f8051602061527083398151915242613cff6040860160208701614952565b6001600160401b0316111580613d395750613d1d6202a30042614da0565b613d2d6040860160208701614952565b6001600160401b031610155b15613d565760405162d36c8560e81b815260040160405180910390fd5b6030613d656040860186614fbe565b9050141580613d7357508335155b15613d915760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613dc157604051630eb0d31360e11b815260040160405180910390fd5b613dcb835f6139dc565b5f80613e646040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e0f9190614952565b6001600160401b03168152602001613e2a60408a018a614fbe565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614367565b5f82815260068601602052604090209193509150613e82828261508a565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613ec0908590600401614b6c565b6020604051808303815f875af1158015613edc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f009190614b9e565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613f7857613f7861498b565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614058918e01908e01614952565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166140cf57604051631afcd79f60e31b815260040160405180910390fd5b565b6140d9614086565b6140e28161442a565b6140ea614443565b61413f6060820135608083013561410760c0850160a08601614952565b61411760e0860160c08701615145565b614128610100870160e0880161515e565b61413a61012088016101008901614bd4565b614453565b50565b61414a614086565b5f805160206152308339815191526001600160a01b03821661417f5760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6141b36001600160a01b03841683614574565b905080515f141580156141d75750808060200190518101906141d5919061517e565b155b156118e357604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561424b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061426f9190614b9e565b90506142866001600160a01b038516333086614581565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156142ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142ee9190614b9e565b90508181116143545760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016141fc565b61435e8282614fab565b95945050505050565b5f606082608001515160301461439057604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016143c29796959493929190615199565b60405160208183030381529060405290506002816040516143e39190614d8f565b602060405180830381855afa1580156143fe573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906144219190614b9e565b94909350915050565b614432614086565b61443a6145ba565b61413f816145c2565b61444b614086565b6140cf614694565b61445b614086565b5f8051602061525083398151915261ffff8416158061447f575061271061ffff8516115b1561449d5760405163c98d73a760e01b815260040160405180910390fd5b858711156144be57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806144d15750600a60ff8416115b156144ef576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061229b83835f61469c565b6040516001600160a01b0384811660248301528381166044830152606482018390526108089186918216906323b872dd90608401613c47565b6140cf614086565b6145ca614086565b80355f8051602061527083398151915290815560146145ef606084016040850161515e565b60ff16118061460e5750614609606083016040840161515e565b60ff16155b1561462c5760405163b4fa3fb360e01b815260040160405180910390fd5b61463c606083016040840161515e565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561466d6040830160208401614952565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6131cb614086565b6060814710156146c15760405163cd78605960e01b81523060048201526024016141fc565b5f80856001600160a01b031684866040516146dc9190614d8f565b5f6040518083038185875af1925050503d805f8114614716576040519150601f19603f3d011682016040523d82523d5f602084013e61471b565b606091505b5091509150611c3e86838360608261473b5761473682614782565b61229b565b815115801561475257506001600160a01b0384163b155b1561477b57604051639996b31560e01b81526001600160a01b03851660048201526024016141fc565b508061229b565b8051156147925780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546147b790614e0c565b5f825580601f106147c6575050565b601f0160209004905f5260205f209081019061413f919061481e565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614832575f815560010161481f565b5090565b801515811461413f575f80fd5b803563ffffffff81168114614856575f80fd5b919050565b5f805f6060848603121561486d575f80fd5b83359250602084013561487f81614836565b915061488d60408501614843565b90509250925092565b5f602082840312156148a6575f80fd5b5035919050565b5f602082840312156148bd575f80fd5b61229b82614843565b5f80604083850312156148d7575f80fd5b6148e083614843565b946020939093013593505050565b5f80604083850312156148ff575f80fd5b82356001600160401b03811115614914575f80fd5b830160808186031215614925575f80fd5b915061493360208401614843565b90509250929050565b80356001600160401b0381168114614856575f80fd5b5f60208284031215614962575f80fd5b61229b8261493c565b5f806040838503121561497c575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106149c257634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516149fd60608401826001600160401b03169052565b506080830151614a1860808401826001600160401b03169052565b5060a0830151614a3360a08401826001600160401b03169052565b5060c083015161270460c08401826001600160401b03169052565b803561ffff81168114614856575f80fd5b5f805f8060808587031215614a72575f80fd5b84356001600160401b03811115614a87575f80fd5b850160608188031215614a98575f80fd5b9350614aa660208601614a4e565b9250614ab46040860161493c565b9396929550929360600135925050565b6001600160a01b038116811461413f575f80fd5b5f80828403610140811215614aeb575f80fd5b61012080821215614afa575f80fd5b8493508301359050614b0b81614ac4565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561270457612704614b16565b5f5b83811015614b64578181015183820152602001614b4c565b50505f910152565b602081525f8251806020840152614b8a816040850160208701614b4a565b601f01601f19169190910160400192915050565b5f60208284031215614bae575f80fd5b5051919050565b5f82614bcf57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614be4575f80fd5b813561229b81614ac4565b5f808335601e19843603018112614c04575f80fd5b8301803591506001600160401b03821115614c1d575f80fd5b6020019150600581901b3603821315611d98575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614c5c575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614c9c57614c9c614c66565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614cca57614cca614c66565b604052919050565b5f6001600160401b03821115614cea57614cea614c66565b50601f01601f191660200190565b5f60608236031215614d08575f80fd5b614d10614c7a565b823581526020614d2181850161493c565b8183015260408401356001600160401b03811115614d3d575f80fd5b840136601f820112614d4d575f80fd5b8035614d60614d5b82614cd2565b614ca2565b8181523684838501011115614d73575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614c5c818460208701614b4a565b8082018082111561081e5761081e614b16565b5f63ffffffff808316818103614dcb57614dcb614b16565b6001019392505050565b808202811582820484141761081e5761081e614b16565b6001600160401b0381811683821601908082111561270457612704614b16565b600181811c90821680614e2057607f821691505b602082108103614e3e57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614e5681614e0c565b806020870152604060018084165f8114614e775760018114614e9357614ec0565b60ff19851660408a0152604084151560051b8a01019550614ec0565b895f5260205f205f5b85811015614eb75781548b8201860152908301908801614e9c565b8a016040019650505b509398975050505050505050565b805161485681614836565b5f8060408385031215614eea575f80fd5b82516001600160401b0380821115614f00575f80fd5b9084019060608287031215614f13575f80fd5b614f1b614c7a565b82518152602080840151614f2e81614ac4565b82820152604084015183811115614f43575f80fd5b80850194505087601f850112614f57575f80fd5b83519250614f67614d5b84614cd2565b8381528882858701011115614f7a575f80fd5b614f8984838301848801614b4a565b80604084015250819550614f9e818801614ece565b9450505050509250929050565b8181038181111561081e5761081e614b16565b5f808335601e19843603018112614fd3575f80fd5b8301803591506001600160401b03821115614fec575f80fd5b602001915036819003821315611d98575f80fd5b6001600160401b0381811683821602808216919082811461502357615023614b16565b505092915050565b5f6001600160401b03808316818103614dcb57614dcb614b16565b601f8211156118e357805f5260205f20601f840160051c8101602085101561506b5750805b601f840160051c820191505b818110156108be575f8155600101615077565b81516001600160401b038111156150a3576150a3614c66565b6150b7816150b18454614e0c565b84615046565b602080601f8311600181146150ea575f84156150d35750858301515b5f19600386901b1c1916600185901b1785556109f1565b5f85815260208120601f198616915b82811015615118578886015182559484019460019091019084016150f9565b508582101561513557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215615155575f80fd5b61229b82614a4e565b5f6020828403121561516e575f80fd5b813560ff8116811461229b575f80fd5b5f6020828403121561518e575f80fd5b815161229b81614836565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516151ee81604e860160208901614b4a565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1578,6 +1578,140 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegato return event, nil } +// ERC20TokenStakingManagerGeoffEventIterator is returned from FilterGeoffEvent and is used to iterate over the raw logs and unpacked data for GeoffEvent events raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerGeoffEventIterator struct { + Event *ERC20TokenStakingManagerGeoffEvent // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *ERC20TokenStakingManagerGeoffEventIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerGeoffEvent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(ERC20TokenStakingManagerGeoffEvent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *ERC20TokenStakingManagerGeoffEventIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *ERC20TokenStakingManagerGeoffEventIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// ERC20TokenStakingManagerGeoffEvent represents a GeoffEvent event raised by the ERC20TokenStakingManager contract. +type ERC20TokenStakingManagerGeoffEvent struct { + Val uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterGeoffEvent is a free log retrieval operation binding the contract event 0x108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e6. +// +// Solidity: event GeoffEvent(uint64 val) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterGeoffEvent(opts *bind.FilterOpts) (*ERC20TokenStakingManagerGeoffEventIterator, error) { + + logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "GeoffEvent") + if err != nil { + return nil, err + } + return &ERC20TokenStakingManagerGeoffEventIterator{contract: _ERC20TokenStakingManager.contract, event: "GeoffEvent", logs: logs, sub: sub}, nil +} + +// WatchGeoffEvent is a free log subscription operation binding the contract event 0x108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e6. +// +// Solidity: event GeoffEvent(uint64 val) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchGeoffEvent(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerGeoffEvent) (event.Subscription, error) { + + logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "GeoffEvent") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(ERC20TokenStakingManagerGeoffEvent) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "GeoffEvent", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseGeoffEvent is a log parse operation binding the contract event 0x108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e6. +// +// Solidity: event GeoffEvent(uint64 val) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseGeoffEvent(log types.Log) (*ERC20TokenStakingManagerGeoffEvent, error) { + event := new(ERC20TokenStakingManagerGeoffEvent) + if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "GeoffEvent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // ERC20TokenStakingManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerInitialValidatorCreatedIterator struct { Event *ERC20TokenStakingManagerInitialValidatorCreated // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index b3eafa117..44dff773b 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -82,8 +82,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161509338038061509383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614f468061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd36600461455e565b610561565b005b3480156101df575f80fd5b506101d26101ee366004614599565b6107c3565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d26102383660046145b0565b610935565b348015610248575f80fd5b5061025c610257366004614599565b610a12565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc3660046145ee565b610a28565b604051908152602001610215565b3480156102fa575f80fd5b506101d2610309366004614642565b610a5c565b348015610319575f80fd5b506101d261032836600461465b565b610afd565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d2610370366004614683565b610d57565b348015610380575f80fd5b506102e161038f3660046146d1565b6111db565b34801561039f575f80fd5b5061025c6103ae366004614599565b6111f4565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e036600461455e565b611208565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d2610413366004614599565b6113fa565b348015610423575f80fd5b506101d261043236600461465b565b6114b5565b348015610442575f80fd5b506101d2610451366004614642565b61167c565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a366004614599565b6117ee565b34801561049a575f80fd5b506101d26104a9366004614599565b6119ca565b6102e16104bc366004614599565b611af4565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef366004614599565b611b25565b60405161021591906146fe565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e1610531366004614599565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614e9a8339815191526020526040808220815160e0810190925280545f80516020614eba83398151915293929190829060ff1660038111156105ae576105ae6146ea565b60038111156105bf576105bf6146ea565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611b25565b905060028351600381111561064c5761064c6146ea565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156106c7576106c76146ea565b036107405785156106de576106dc8286611bed565b505b6106fb82846060015183608001516106f691906147c1565b611d71565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561073b87611ec8565b61078e565b600481516005811115610755576107556146ea565b036107755761076387611ec8565b61076c8761210f565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f80516020614f1a8339815191526020526040808220815160e0810190925280545f80516020614eda83398151915293929190829060ff166005811115610810576108106146ea565b6005811115610821576108216146ea565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610890576108906146ea565b146108ae5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6108d38584606001515f6122f6565b6040518263ffffffff1660e01b81526004016108ef9190614803565b6020604051808303815f875af115801561090b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061092f9190614835565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061097e575080546001600160401b03808416911610155b1561099c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109c683612345565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a2264e8d4a510008361484c565b92915050565b5f610a31612359565b610a3d84848434612390565b9050610a5560015f80516020614efa83398151915255565b9392505050565b5f80516020614eba8339815191525f80610a7584612536565b91509150610a82826127d4565b610a8c5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610abb57610abb6146ea565b03610ae0575f83815260078501602052604081208054919055610ade828261280f565b505b610af681610af184604001516111db565b61286d565b5050505050565b5f8181525f80516020614e9a8339815191526020526040808220815160e0810190925280545f80516020614eba83398151915293929190829060ff166003811115610b4a57610b4a6146ea565b6003811115610b5b57610b5b6146ea565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610bd182611b25565b9050600183516003811115610be857610be86146ea565b14610c065760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610c1b57610c1b6146ea565b03610c3157610c298561210f565b505050505050565b5f610c3b87612880565b90505f80610c4c8360400151612980565b5091509150818514610c7157604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610caa5750806001600160401b03168660a001516001600160401b0316115b15610cc857604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614eda8339815191529060ff1615610da957604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dec573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e109190614835565b836020013514610e335760405163d040949d60e01b815260040160405180910390fd5b30610e44606085016040860161487f565b6001600160a01b031614610e6b5760405163e6c4247b60e01b815260040160405180910390fd5b5f610e79606085018561489a565b905090505f805b828163ffffffff161015611125575f610e9c606088018861489a565b8363ffffffff16818110610eb257610eb26148df565b9050602002810190610ec491906148f3565b610ecd906149a3565b80515f8181526008880160205260409020549192509015610f0157604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610f3092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610f4a91614a3a565b602060405180830381855afa158015610f65573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f889190614835565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115611014576110146146ea565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516110c7911686614a4b565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061111e90614a5e565b9050610e80565b50600483018190555f61113785612880565b90505f6111478260400151612bbe565b90505f61115388612d33565b9050816002826040516111669190614a3a565b602060405180830381855afa158015611181573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111a49190614835565b146111c257604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610a226001600160401b03831664e8d4a51000614a80565b5f6111fe82611b25565b6080015192915050565b5f80516020614eba8339815191525f611220856131cc565b905061122b856127d4565b611236575050505050565b5f8581526004830160205260409020546001600160a01b0316331461126e5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161129d91600160b01b90046001600160401b031690614a97565b6001600160401b03168160c001516001600160401b031610156112d3576040516302336bad60e51b815260040160405180910390fd5b8315610af6575f6112e48685611bed565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b590611334906111db565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156113aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ce9190614835565b5f878152600785016020526040812080549091906113ed908490614a4b565b9091555050505050505050565b5f80516020614eba8339815191525f61141283611b25565b9050600481516005811115611429576114296146ea565b146114475760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b0316331461147f5760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461092f906001600160a01b03168261280f565b6114bd612359565b5f8181525f80516020614e9a8339815191526020526040808220815160e0810190925280545f80516020614eba83398151915293929190829060ff16600381111561150a5761150a6146ea565b600381111561151b5761151b6146ea565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529050600381516003811115611594576115946146ea565b146115b25760405163f95c7fe160e01b815260040160405180910390fd5b60046115c18260400151611b25565b5160058111156115d3576115d36146ea565b14611657575f6115e285612880565b90505f806115f38360400151612980565b50915091508184604001511461161c57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561165357604051633ab3447f60e11b815260040160405180910390fd5b5050505b6116608361210f565b505061167860015f80516020614efa83398151915255565b5050565b5f80516020614eda8339815191525f61169483612880565b90505f806116a58360400151613409565b91509150806116c757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546116e190614ab7565b90505f0361170257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115611728576117286146ea565b146117465760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061175e916144b3565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614e9a8339815191526020526040808220815160e0810190925280545f80516020614eba83398151915293929190829060ff16600381111561183b5761183b6146ea565b600381111561184c5761184c6146ea565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156118c5576118c56146ea565b141580156118e657506003815160038111156118e3576118e36146ea565b14155b156119045760405163f95c7fe160e01b815260040160405180910390fd5b5f6119128260400151611b25565b905080606001516001600160401b03165f0361194157604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61196e8460400151846060015185608001516122f6565b6040518263ffffffff1660e01b815260040161198a9190614803565b6020604051808303815f875af11580156119a6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af69190614835565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614eda8339815191529190611a1190614ab7565b90505f03611a3257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611a5857611a586146ea565b14611a765760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611aaf9190600401614ae9565b6020604051808303815f875af1158015611acb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611aef9190614835565b505050565b5f611afd612359565b611b088233346135ad565b9050611b2060015f80516020614efa83398151915255565b919050565b611b2d6144ea565b5f8281525f80516020614f1a833981519152602052604090819020815160e0810190925280545f80516020614eda833981519152929190829060ff166005811115611b7a57611b7a6146ea565b6005811115611b8b57611b8b6146ea565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c38573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c5f9190810190614b7e565b9150915080611c8157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cc4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce89190614835565b825114611d085760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d345760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d438460400151613871565b91509150818714611d6757604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614f1a833981519152602052604081206002015481905f80516020614eda83398151915290600160801b90046001600160401b0316611db98582613a4c565b5f611dc387613c15565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e138a858b6122f6565b6040518263ffffffff1660e01b8152600401611e2f9190614803565b6020604051808303815f875af1158015611e4b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6f9190614835565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f80516020614e9a8339815191526020526040808220815160e0810190925280545f80516020614eba83398151915293929190829060ff166003811115611f1557611f156146ea565b6003811115611f2657611f266146ea565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611f9c82611b25565b90505f600382516005811115611fb457611fb46146ea565b1480611fd25750600482516005811115611fd057611fd06146ea565b145b15611fe2575060c0810151611fff565b600282516005811115611ff757611ff76146ea565b036107755750425b83608001516001600160401b0316816001600160401b03161161202457505050505050565b600385015460608501516001600160a01b039091169063778c06b590612049906111db565b60a085015160808801515f88815260088b01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa1580156120d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120f49190614835565b5f968752600690950160205250506040909320919091555050565b5f8181525f80516020614e9a8339815191526020526040808220815160e0810190925280545f80516020614eba83398151915293929190829060ff16600381111561215c5761215c6146ea565b600381111561216d5761216d6146ea565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870190915290812080549082905592935090919080821561229b575f8481526004870160205260409020546127109061224d90600160a01b900461ffff1685614a80565b612257919061484c565b915081866007015f8681526020019081526020015f205f82825461227b9190614a4b565b9091555061228b90508284614c50565b905061229b85602001518261280f565b6122b08560200151610af187606001516111db565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b61234d613c8a565b61235681613cd5565b50565b5f80516020614efa83398151915280546001190161238a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614eba83398151915290600160401b900461ffff90811690861610806123e4575061271061ffff8616115b156124025760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612434576040516302336bad60e51b815260040160405180910390fd5b80548310806124465750806001015483115b1561246457604051630103be3b60e21b815260040160405180910390fd5b825f61246f82610a12565b90505f61247c8983613d43565b905060405180606001604052806124903390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614efa83398151915255565b5f61253f6144ea565b5f80516020614eda8339815191525f61255785612880565b90505f806125688360400151613409565b91509150801561258b57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156125bc576125bc6146ea565b60058111156125cd576125cd6146ea565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561263c5761263c6146ea565b1415801561265d575060018151600581111561265a5761265a6146ea565b14155b1561267b5760405163a36c527f60e01b815260040160405180910390fd5b600381516005811115612690576126906146ea565b0361269e57600481526126a3565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156126e8576126e86146ea565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561279c5761279c6146ea565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b15801561285b575f80fd5b505af1158015610c29573d5f803e3d5ffd5b6116786001600160a01b0383168261412d565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156128e4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261290b9190810190614b7e565b915091508061292d57604051636b2f19e960e01b815260040160405180910390fd5b81511561294d5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156129795760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146129a557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129f4576129bc816001614c50565b6129c7906008614a80565b61ffff168682815181106129dd576129dd6148df565b016020015160f81c901b91909117906001016129a8565b5061ffff811615612a185760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612a7357612a2f816003614c50565b612a3a906008614a80565b63ffffffff1687612a4c836002614a4b565b81518110612a5c57612a5c6148df565b016020015160f81c901b9190911790600101612a1b565b5063ffffffff8116600414612a9b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612af057612ab281601f614c50565b612abd906008614a80565b88612ac9836006614a4b565b81518110612ad957612ad96148df565b016020015160f81c901b9190911790600101612a9e565b505f805b6008811015612b4f57612b08816007614c50565b612b13906008614a80565b6001600160401b031689612b28836026614a4b565b81518110612b3857612b386148df565b016020015160f81c901b9190911790600101612af4565b505f805b6008811015612bae57612b67816007614c50565b612b72906008614a80565b6001600160401b03168a612b8783602e614a4b565b81518110612b9757612b976148df565b016020015160f81c901b9190911790600101612b53565b5091989097509095509350505050565b5f8151602614612be157604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612c3057612bf8816001614c50565b612c03906008614a80565b61ffff16848281518110612c1957612c196148df565b016020015160f81c901b9190911790600101612be4565b5061ffff811615612c545760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612caf57612c6b816003614c50565b612c76906008614a80565b63ffffffff1685612c88836002614a4b565b81518110612c9857612c986148df565b016020015160f81c901b9190911790600101612c57565b5063ffffffff811615612cd557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612d2a57612cec81601f614c50565b612cf7906008614a80565b86612d03836006614a4b565b81518110612d1357612d136148df565b016020015160f81c901b9190911790600101612cd8565b50949350505050565b60605f612d428383018461489a565b612d4e91506058614a80565b612d5990605c614a4b565b6001600160401b03811115612d7057612d70614911565b6040519080825280601f01601f191660200182016040528015612d9a576020820181803683370190505b5090505f5b6020811015612def5783358160208110612dbb57612dbb6148df565b1a60f81b828281518110612dd157612dd16148df565b60200101906001600160f81b03191690815f1a905350600101612d9f565b505f5b6020811015612e4f5783602001358160208110612e1157612e116148df565b1a60f81b82612e21836020614a4b565b81518110612e3157612e316148df565b60200101906001600160f81b03191690815f1a905350600101612df2565b505f5b6004811015612eb257612e66816003614c50565b612e71906008614a80565b6014901c60f81b82612e84836040614a4b565b81518110612e9457612e946148df565b60200101906001600160f81b03191690815f1a905350600101612e52565b505f612ec4606085016040860161487f565b60601b90505f5b6014811015612f2457818160148110612ee657612ee66148df565b1a60f81b83612ef6836044614a4b565b81518110612f0657612f066148df565b60200101906001600160f81b03191690815f1a905350600101612ecb565b505f612f33606086018661489a565b905090505f5b6004811015612f9e57612f4d816003614c50565b612f58906008614a80565b63ffffffff8316901c60f81b84612f70836058614a4b565b81518110612f8057612f806148df565b60200101906001600160f81b03191690815f1a905350600101612f39565b505f5b612fae606087018761489a565b90508110156131c2575f612fc3826058614a80565b612fce90605c614a4b565b90505f5b602081101561305957612fe8606089018961489a565b84818110612ff857612ff86148df565b905060200281019061300a91906148f3565b35816020811061301c5761301c6148df565b1a60f81b8661302b8385614a4b565b8151811061303b5761303b6148df565b60200101906001600160f81b03191690815f1a905350600101612fd2565b505f5b600881101561310e57613070816007614c50565b61307b906008614a80565b61308860608a018a61489a565b85818110613098576130986148df565b90506020028101906130aa91906148f3565b6130bb9060408101906020016146d1565b6001600160401b0316901c60f81b86826130d6856020614a4b565b6130e09190614a4b565b815181106130f0576130f06148df565b60200101906001600160f81b03191690815f1a90535060010161305c565b505f5b60308110156131b857613127606089018961489a565b84818110613137576131376148df565b905060200281019061314991906148f3565b613157906040810190614c63565b82818110613167576131676148df565b9050013560f81c60f81b86828460286131809190614a4b565b61318a9190614a4b565b8151811061319a5761319a6148df565b60200101906001600160f81b03191690815f1a905350600101613111565b5050600101612fa1565b5091949350505050565b6131d46144ea565b5f8281525f80516020614f1a8339815191526020526040808220815160e0810190925280545f80516020614eda83398151915293929190829060ff166005811115613221576132216146ea565b6005811115613232576132326146ea565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156132a4576132a46146ea565b146132c25760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613306576133066146ea565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133b28582611d71565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461342d57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561347c57613444816001614c50565b61344f906008614a80565b61ffff16858281518110613465576134656148df565b016020015160f81c901b9190911790600101613430565b5061ffff8116156134a05760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156134fb576134b7816003614c50565b6134c2906008614a80565b63ffffffff16866134d4836002614a4b565b815181106134e4576134e46148df565b016020015160f81c901b91909117906001016134a3565b5063ffffffff811660031461352357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135785761353a81601f614c50565b613545906008614a80565b87613551836006614a4b565b81518110613561576135616148df565b016020015160f81c901b9190911790600101613526565b505f8660268151811061358d5761358d6148df565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614eba833981519152816135c684610a12565b90505f6135d287611b25565b90506135dd876127d4565b6135fa57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561360f5761360f6146ea565b1461362d5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161363e9190614a97565b905083600201600a9054906101000a90046001600160401b031682604001516136679190614ca5565b6001600160401b0316816001600160401b0316111561369957604051630c192e7760e41b815260040160405180910390fd5b5f806136a58a84611d71565b915091505f8a836040516020016136d392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff19166001836003811115613766576137666146ea565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461389557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156138e4576138ac816001614c50565b6138b7906008614a80565b61ffff168582815181106138cd576138cd6148df565b016020015160f81c901b9190911790600101613898565b5061ffff8116156139085760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156139635761391f816003614c50565b61392a906008614a80565b63ffffffff168661393c836002614a4b565b8151811061394c5761394c6148df565b016020015160f81c901b919091179060010161390b565b5063ffffffff811660051461398b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139e0576139a281601f614c50565b6139ad906008614a80565b876139b9836006614a4b565b815181106139c9576139c96148df565b016020015160f81c901b919091179060010161398e565b505f805b6008811015613a3f576139f8816007614c50565b613a03906008614a80565b6001600160401b031688613a18836026614a4b565b81518110613a2857613a286148df565b016020015160f81c901b91909117906001016139e4565b5090969095509350505050565b5f80516020614eda8339815191525f6001600160401b038084169085161115613a8057613a7983856147c1565b9050613a8d565b613a8a84846147c1565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613aef575060018401548151613aeb916001600160401b031690614a4b565b8210155b15613b15576001600160401b038316606082015281815260408101516020820152613b34565b8281606001818151613b279190614a97565b6001600160401b03169052505b6060810151613b44906064614ca5565b602082015160018601546001600160401b039290921691613b6f9190600160401b900460ff16614a80565b1015613b8e5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613ba99190614a4b565b9052506040810180516001600160401b0387169190613bc9908390614c50565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614f1a8339815191526020526040812060020180545f80516020614eda8339815191529190600890613c5f90600160401b90046001600160401b0316614cd0565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613cd357604051631afcd79f60e31b815260040160405180910390fd5b565b613cdd613c8a565b613ce6816141c4565b613cee6141dd565b61235660608201356080830135613d0b60c0850160a086016146d1565b613d1b60e0860160c08701614ceb565b613d2c610100870160e08801614d04565b613d3e6101208801610100890161487f565b6141ed565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613d8757604051637fab81e560e01b815260040160405180910390fd5b5f80516020614eda83398151915242613da660408601602087016146d1565b6001600160401b0316111580613de05750613dc46202a30042614a4b565b613dd460408601602087016146d1565b6001600160401b031610155b15613dfd5760405162d36c8560e81b815260040160405180910390fd5b6030613e0c6040860186614c63565b9050141580613e1a57508335155b15613e385760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613e6857604051630eb0d31360e11b815260040160405180910390fd5b613e72835f613a4c565b5f80613f0b6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613eb691906146d1565b6001600160401b03168152602001613ed160408a018a614c63565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061430e565b5f82815260068601602052604090209193509150613f298282614d68565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613f67908590600401614803565b6020604051808303815f875af1158015613f83573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fa79190614835565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561401f5761401f6146ea565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916140ff918e01908e016146d1565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156141545760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461419d576040519150601f19603f3d011682016040523d82523d5f602084013e6141a2565b606091505b5050905080611aef57604051630a12f52160e11b815260040160405180910390fd5b6141cc613c8a565b6141d46143d1565b612356816143d9565b6141e5613c8a565b613cd36144ab565b6141f5613c8a565b5f80516020614eba83398151915261ffff84161580614219575061271061ffff8516115b156142375760405163c98d73a760e01b815260040160405180910390fd5b8587111561425857604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061426b5750600a60ff8416115b15614289576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461433757604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016143699796959493929190614e23565b604051602081830303815290604052905060028160405161438a9190614a3a565b602060405180830381855afa1580156143a5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143c89190614835565b94909350915050565b613cd3613c8a565b6143e1613c8a565b80355f80516020614eda83398151915290815560146144066060840160408501614d04565b60ff16118061442557506144206060830160408401614d04565b60ff16155b156144435760405163b4fa3fb360e01b815260040160405180910390fd5b6144536060830160408401614d04565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561448460408301602084016146d1565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612523613c8a565b5080546144bf90614ab7565b5f825580601f106144ce575050565b601f0160209004905f5260205f20908101906123569190614526565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561453a575f8155600101614527565b5090565b8015158114612356575f80fd5b803563ffffffff81168114611b20575f80fd5b5f805f60608486031215614570575f80fd5b8335925060208401356145828161453e565b91506145906040850161454b565b90509250925092565b5f602082840312156145a9575f80fd5b5035919050565b5f61012082840312156145c1575f80fd5b50919050565b803561ffff81168114611b20575f80fd5b80356001600160401b0381168114611b20575f80fd5b5f805f60608486031215614600575f80fd5b83356001600160401b03811115614615575f80fd5b840160608187031215614626575f80fd5b9250614634602085016145c7565b9150614590604085016145d8565b5f60208284031215614652575f80fd5b610a558261454b565b5f806040838503121561466c575f80fd5b6146758361454b565b946020939093013593505050565b5f8060408385031215614694575f80fd5b82356001600160401b038111156146a9575f80fd5b8301608081860312156146ba575f80fd5b91506146c86020840161454b565b90509250929050565b5f602082840312156146e1575f80fd5b610a55826145d8565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061472157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161475c60608401826001600160401b03169052565b50608083015161477760808401826001600160401b03169052565b5060a083015161479260a08401826001600160401b03169052565b5060c083015161297960c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612979576129796147ad565b5f5b838110156147fb5781810151838201526020016147e3565b50505f910152565b602081525f82518060208401526148218160408501602087016147e1565b601f01601f19169190910160400192915050565b5f60208284031215614845575f80fd5b5051919050565b5f8261486657634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114612356575f80fd5b5f6020828403121561488f575f80fd5b8135610a558161486b565b5f808335601e198436030181126148af575f80fd5b8301803591506001600160401b038211156148c8575f80fd5b6020019150600581901b3603821315611ec1575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614907575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561494757614947614911565b60405290565b604051601f8201601f191681016001600160401b038111828210171561497557614975614911565b604052919050565b5f6001600160401b0382111561499557614995614911565b50601f01601f191660200190565b5f606082360312156149b3575f80fd5b6149bb614925565b8235815260206149cc8185016145d8565b8183015260408401356001600160401b038111156149e8575f80fd5b840136601f8201126149f8575f80fd5b8035614a0b614a068261497d565b61494d565b8181523684838501011115614a1e575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516149078184602087016147e1565b80820180821115610a2257610a226147ad565b5f63ffffffff808316818103614a7657614a766147ad565b6001019392505050565b8082028115828204841417610a2257610a226147ad565b6001600160401b03818116838216019080821115612979576129796147ad565b600181811c90821680614acb57607f821691505b6020821081036145c157634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614afb81614ab7565b806020870152604060018084165f8114614b1c5760018114614b3857614b65565b60ff19851660408a0152604084151560051b8a01019550614b65565b895f5260205f205f5b85811015614b5c5781548b8201860152908301908801614b41565b8a016040019650505b509398975050505050505050565b8051611b208161453e565b5f8060408385031215614b8f575f80fd5b82516001600160401b0380821115614ba5575f80fd5b9084019060608287031215614bb8575f80fd5b614bc0614925565b82518152602080840151614bd38161486b565b82820152604084015183811115614be8575f80fd5b80850194505087601f850112614bfc575f80fd5b83519250614c0c614a068461497d565b8381528882858701011115614c1f575f80fd5b614c2e848383018488016147e1565b80604084015250819550614c43818801614b73565b9450505050509250929050565b81810381811115610a2257610a226147ad565b5f808335601e19843603018112614c78575f80fd5b8301803591506001600160401b03821115614c91575f80fd5b602001915036819003821315611ec1575f80fd5b6001600160401b03818116838216028082169190828114614cc857614cc86147ad565b505092915050565b5f6001600160401b03808316818103614a7657614a766147ad565b5f60208284031215614cfb575f80fd5b610a55826145c7565b5f60208284031215614d14575f80fd5b813560ff81168114610a55575f80fd5b601f821115611aef57805f5260205f20601f840160051c81016020851015614d495750805b601f840160051c820191505b81811015610af6575f8155600101614d55565b81516001600160401b03811115614d8157614d81614911565b614d9581614d8f8454614ab7565b84614d24565b602080601f831160018114614dc8575f8415614db15750858301515b5f19600386901b1c1916600185901b178555610c29565b5f85815260208120601f198616915b82811015614df657888601518255948401946001909101908401614dd7565b5085821015614e1357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614e7881604e8601602089016147e1565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"GeoffEvent\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161513e38038061513e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614ff18061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004614609565b610561565b005b3480156101df575f80fd5b506101d26101ee366004614644565b6107f0565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d261023836600461465b565b610962565b348015610248575f80fd5b5061025c610257366004614644565b610a3f565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc366004614699565b610a55565b604051908152602001610215565b3480156102fa575f80fd5b506101d26103093660046146ed565b610a89565b348015610319575f80fd5b506101d2610328366004614706565b610b2a565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d261037036600461472e565b610d84565b348015610380575f80fd5b506102e161038f36600461477c565b611208565b34801561039f575f80fd5b5061025c6103ae366004614644565b611221565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e0366004614609565b611235565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d2610413366004614644565b611427565b348015610423575f80fd5b506101d2610432366004614706565b6114e2565b348015610442575f80fd5b506101d26104513660046146ed565b6116a9565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a366004614644565b61181b565b34801561049a575f80fd5b506101d26104a9366004614644565b6119f7565b6102e16104bc366004614644565b611b21565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef366004614644565b611b52565b60405161021591906147a9565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e1610531366004614644565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614f458339815191526020526040808220815160e0810190925280545f80516020614f6583398151915293929190829060ff1660038111156105ae576105ae614795565b60038111156105bf576105bf614795565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611b52565b905060028351600381111561064c5761064c614795565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156106c7576106c7614795565b0361076d57851561070b576106dc8286611c1a565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b6107288284606001518360800151610723919061486c565b611d9e565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561076887611ef5565b6107bb565b60048151600581111561078257610782614795565b036107a25761079087611ef5565b610799876121ba565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f80516020614fc58339815191526020526040808220815160e0810190925280545f80516020614f8583398151915293929190829060ff16600581111561083d5761083d614795565b600581111561084e5761084e614795565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108bd576108bd614795565b146108db5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109008584606001515f6123a1565b6040518263ffffffff1660e01b815260040161091c91906148ae565b6020604051808303815f875af1158015610938573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095c91906148e0565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109ab575080546001600160401b03808416911610155b156109c95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109f3836123f0565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a4f64e8d4a51000836148f7565b92915050565b5f610a5e612404565b610a6a8484843461243b565b9050610a8260015f80516020614fa583398151915255565b9392505050565b5f80516020614f658339815191525f80610aa2846125e1565b91509150610aaf8261287f565b610ab95750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ae857610ae8614795565b03610b0d575f83815260078501602052604081208054919055610b0b82826128ba565b505b610b2381610b1e8460400151611208565b612918565b5050505050565b5f8181525f80516020614f458339815191526020526040808220815160e0810190925280545f80516020614f6583398151915293929190829060ff166003811115610b7757610b77614795565b6003811115610b8857610b88614795565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610bfe82611b52565b9050600183516003811115610c1557610c15614795565b14610c335760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610c4857610c48614795565b03610c5e57610c56856121ba565b505050505050565b5f610c688761292b565b90505f80610c798360400151612a2b565b5091509150818514610c9e57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610cd75750806001600160401b03168660a001516001600160401b0316115b15610cf557604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614f858339815191529060ff1615610dd657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3d91906148e0565b836020013514610e605760405163d040949d60e01b815260040160405180910390fd5b30610e71606085016040860161492a565b6001600160a01b031614610e985760405163e6c4247b60e01b815260040160405180910390fd5b5f610ea66060850185614945565b905090505f805b828163ffffffff161015611152575f610ec96060880188614945565b8363ffffffff16818110610edf57610edf61498a565b9050602002810190610ef1919061499e565b610efa90614a4e565b80515f8181526008880160205260409020549192509015610f2e57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610f5d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610f7791614ae5565b602060405180830381855afa158015610f92573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610fb591906148e0565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561104157611041614795565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516110f4911686614af6565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061114b90614b09565b9050610ead565b50600483018190555f6111648561292b565b90505f6111748260400151612c69565b90505f61118088612dde565b9050816002826040516111939190614ae5565b602060405180830381855afa1580156111ae573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111d191906148e0565b146111ef57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610a4f6001600160401b03831664e8d4a51000614b2b565b5f61122b82611b52565b6080015192915050565b5f80516020614f658339815191525f61124d85613277565b90506112588561287f565b611263575050505050565b5f8581526004830160205260409020546001600160a01b0316331461129b5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516112ca91600160b01b90046001600160401b031690614b42565b6001600160401b03168160c001516001600160401b03161015611300576040516302336bad60e51b815260040160405180910390fd5b8315610b23575f6113118685611c1a565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061136190611208565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156113d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113fb91906148e0565b5f8781526007850160205260408120805490919061141a908490614af6565b9091555050505050505050565b5f80516020614f658339815191525f61143f83611b52565b905060048151600581111561145657611456614795565b146114745760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114ac5760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461095c906001600160a01b0316826128ba565b6114ea612404565b5f8181525f80516020614f458339815191526020526040808220815160e0810190925280545f80516020614f6583398151915293929190829060ff16600381111561153757611537614795565b600381111561154857611548614795565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115c1576115c1614795565b146115df5760405163f95c7fe160e01b815260040160405180910390fd5b60046115ee8260400151611b52565b51600581111561160057611600614795565b14611684575f61160f8561292b565b90505f806116208360400151612a2b565b50915091508184604001511461164957604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561168057604051633ab3447f60e11b815260040160405180910390fd5b5050505b61168d836121ba565b50506116a560015f80516020614fa583398151915255565b5050565b5f80516020614f858339815191525f6116c18361292b565b90505f806116d283604001516134b4565b91509150806116f457604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461170e90614b62565b90505f0361172f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561175557611755614795565b146117735760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061178b9161455e565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614f458339815191526020526040808220815160e0810190925280545f80516020614f6583398151915293929190829060ff16600381111561186857611868614795565b600381111561187957611879614795565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156118f2576118f2614795565b14158015611913575060038151600381111561191057611910614795565b14155b156119315760405163f95c7fe160e01b815260040160405180910390fd5b5f61193f8260400151611b52565b905080606001516001600160401b03165f0361196e57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61199b8460400151846060015185608001516123a1565b6040518263ffffffff1660e01b81526004016119b791906148ae565b6020604051808303815f875af11580156119d3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2391906148e0565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614f858339815191529190611a3e90614b62565b90505f03611a5f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611a8557611a85614795565b14611aa35760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611adc9190600401614b94565b6020604051808303815f875af1158015611af8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1c91906148e0565b505050565b5f611b2a612404565b611b35823334613658565b9050611b4d60015f80516020614fa583398151915255565b919050565b611b5a614595565b5f8281525f80516020614fc5833981519152602052604090819020815160e0810190925280545f80516020614f85833981519152929190829060ff166005811115611ba757611ba7614795565b6005811115611bb857611bb8614795565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c8c9190810190614c29565b9150915080611cae57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1591906148e0565b825114611d355760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d615760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d70846040015161391c565b91509150818714611d9457604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614fc5833981519152602052604081206002015481905f80516020614f8583398151915290600160801b90046001600160401b0316611de68582613af7565b5f611df087613cc0565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e408a858b6123a1565b6040518263ffffffff1660e01b8152600401611e5c91906148ae565b6020604051808303815f875af1158015611e78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e9c91906148e0565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f80516020614f458339815191526020526040808220815160e0810190925280545f80516020614f6583398151915293929190829060ff166003811115611f4257611f42614795565b6003811115611f5357611f53614795565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611fc982611b52565b90505f600382516005811115611fe157611fe1614795565b1480611fff5750600482516005811115611ffd57611ffd614795565b145b1561200f575060c081015161202c565b60028251600581111561202457612024614795565b036107a25750425b6040516001600160401b03821681527f108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e69060200160405180910390a160808401516040516001600160401b0390911681527f108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e69060200160405180910390a183608001516001600160401b0316816001600160401b0316116120cf57505050505050565b600385015460608501516001600160a01b039091169063778c06b5906120f490611208565b60a085015160808801515f88815260088b01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa15801561217b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219f91906148e0565b5f968752600690950160205250506040909320919091555050565b5f8181525f80516020614f458339815191526020526040808220815160e0810190925280545f80516020614f6583398151915293929190829060ff16600381111561220757612207614795565b600381111561221857612218614795565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612346575f848152600487016020526040902054612710906122f890600160a01b900461ffff1685614b2b565b61230291906148f7565b915081866007015f8681526020019081526020015f205f8282546123269190614af6565b9091555061233690508284614cfb565b90506123468560200151826128ba565b61235b8560200151610b1e8760600151611208565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6123f8613d35565b61240181613d80565b50565b5f80516020614fa583398151915280546001190161243557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f6583398151915290600160401b900461ffff908116908616108061248f575061271061ffff8616115b156124ad5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156124df576040516302336bad60e51b815260040160405180910390fd5b80548310806124f15750806001015483115b1561250f57604051630103be3b60e21b815260040160405180910390fd5b825f61251a82610a3f565b90505f6125278983613dee565b9050604051806060016040528061253b3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614fa583398151915255565b5f6125ea614595565b5f80516020614f858339815191525f6126028561292b565b90505f8061261383604001516134b4565b91509150801561263657604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561266757612667614795565b600581111561267857612678614795565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156126e7576126e7614795565b14158015612708575060018151600581111561270557612705614795565b14155b156127265760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561273b5761273b614795565b03612749576004815261274e565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561279357612793614795565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561284757612847614795565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612906575f80fd5b505af1158015610c56573d5f803e3d5ffd5b6116a56001600160a01b038316826141d8565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561298f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129b69190810190614c29565b91509150806129d857604051636b2f19e960e01b815260040160405180910390fd5b8151156129f85760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612a245760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612a5057604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612a9f57612a67816001614cfb565b612a72906008614b2b565b61ffff16868281518110612a8857612a8861498a565b016020015160f81c901b9190911790600101612a53565b5061ffff811615612ac35760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612b1e57612ada816003614cfb565b612ae5906008614b2b565b63ffffffff1687612af7836002614af6565b81518110612b0757612b0761498a565b016020015160f81c901b9190911790600101612ac6565b5063ffffffff8116600414612b4657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612b9b57612b5d81601f614cfb565b612b68906008614b2b565b88612b74836006614af6565b81518110612b8457612b8461498a565b016020015160f81c901b9190911790600101612b49565b505f805b6008811015612bfa57612bb3816007614cfb565b612bbe906008614b2b565b6001600160401b031689612bd3836026614af6565b81518110612be357612be361498a565b016020015160f81c901b9190911790600101612b9f565b505f805b6008811015612c5957612c12816007614cfb565b612c1d906008614b2b565b6001600160401b03168a612c3283602e614af6565b81518110612c4257612c4261498a565b016020015160f81c901b9190911790600101612bfe565b5091989097509095509350505050565b5f8151602614612c8c57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612cdb57612ca3816001614cfb565b612cae906008614b2b565b61ffff16848281518110612cc457612cc461498a565b016020015160f81c901b9190911790600101612c8f565b5061ffff811615612cff5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612d5a57612d16816003614cfb565b612d21906008614b2b565b63ffffffff1685612d33836002614af6565b81518110612d4357612d4361498a565b016020015160f81c901b9190911790600101612d02565b5063ffffffff811615612d8057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612dd557612d9781601f614cfb565b612da2906008614b2b565b86612dae836006614af6565b81518110612dbe57612dbe61498a565b016020015160f81c901b9190911790600101612d83565b50949350505050565b60605f612ded83830184614945565b612df991506058614b2b565b612e0490605c614af6565b6001600160401b03811115612e1b57612e1b6149bc565b6040519080825280601f01601f191660200182016040528015612e45576020820181803683370190505b5090505f5b6020811015612e9a5783358160208110612e6657612e6661498a565b1a60f81b828281518110612e7c57612e7c61498a565b60200101906001600160f81b03191690815f1a905350600101612e4a565b505f5b6020811015612efa5783602001358160208110612ebc57612ebc61498a565b1a60f81b82612ecc836020614af6565b81518110612edc57612edc61498a565b60200101906001600160f81b03191690815f1a905350600101612e9d565b505f5b6004811015612f5d57612f11816003614cfb565b612f1c906008614b2b565b6014901c60f81b82612f2f836040614af6565b81518110612f3f57612f3f61498a565b60200101906001600160f81b03191690815f1a905350600101612efd565b505f612f6f606085016040860161492a565b60601b90505f5b6014811015612fcf57818160148110612f9157612f9161498a565b1a60f81b83612fa1836044614af6565b81518110612fb157612fb161498a565b60200101906001600160f81b03191690815f1a905350600101612f76565b505f612fde6060860186614945565b905090505f5b600481101561304957612ff8816003614cfb565b613003906008614b2b565b63ffffffff8316901c60f81b8461301b836058614af6565b8151811061302b5761302b61498a565b60200101906001600160f81b03191690815f1a905350600101612fe4565b505f5b6130596060870187614945565b905081101561326d575f61306e826058614b2b565b61307990605c614af6565b90505f5b6020811015613104576130936060890189614945565b848181106130a3576130a361498a565b90506020028101906130b5919061499e565b3581602081106130c7576130c761498a565b1a60f81b866130d68385614af6565b815181106130e6576130e661498a565b60200101906001600160f81b03191690815f1a90535060010161307d565b505f5b60088110156131b95761311b816007614cfb565b613126906008614b2b565b61313360608a018a614945565b858181106131435761314361498a565b9050602002810190613155919061499e565b61316690604081019060200161477c565b6001600160401b0316901c60f81b8682613181856020614af6565b61318b9190614af6565b8151811061319b5761319b61498a565b60200101906001600160f81b03191690815f1a905350600101613107565b505f5b6030811015613263576131d26060890189614945565b848181106131e2576131e261498a565b90506020028101906131f4919061499e565b613202906040810190614d0e565b828181106132125761321261498a565b9050013560f81c60f81b868284602861322b9190614af6565b6132359190614af6565b815181106132455761324561498a565b60200101906001600160f81b03191690815f1a9053506001016131bc565b505060010161304c565b5091949350505050565b61327f614595565b5f8281525f80516020614fc58339815191526020526040808220815160e0810190925280545f80516020614f8583398151915293929190829060ff1660058111156132cc576132cc614795565b60058111156132dd576132dd614795565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561334f5761334f614795565b1461336d5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156133b1576133b1614795565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61345d8582611d9e565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146134d857604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613527576134ef816001614cfb565b6134fa906008614b2b565b61ffff168582815181106135105761351061498a565b016020015160f81c901b91909117906001016134db565b5061ffff81161561354b5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156135a657613562816003614cfb565b61356d906008614b2b565b63ffffffff168661357f836002614af6565b8151811061358f5761358f61498a565b016020015160f81c901b919091179060010161354e565b5063ffffffff81166003146135ce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613623576135e581601f614cfb565b6135f0906008614b2b565b876135fc836006614af6565b8151811061360c5761360c61498a565b016020015160f81c901b91909117906001016135d1565b505f866026815181106136385761363861498a565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614f658339815191528161367184610a3f565b90505f61367d87611b52565b90506136888761287f565b6136a557604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156136ba576136ba614795565b146136d85760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516136e99190614b42565b905083600201600a9054906101000a90046001600160401b031682604001516137129190614d50565b6001600160401b0316816001600160401b0316111561374457604051630c192e7760e41b815260040160405180910390fd5b5f806137508a84611d9e565b915091505f8a8360405160200161377e92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561381157613811614795565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461394057604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561398f57613957816001614cfb565b613962906008614b2b565b61ffff168582815181106139785761397861498a565b016020015160f81c901b9190911790600101613943565b5061ffff8116156139b35760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613a0e576139ca816003614cfb565b6139d5906008614b2b565b63ffffffff16866139e7836002614af6565b815181106139f7576139f761498a565b016020015160f81c901b91909117906001016139b6565b5063ffffffff8116600514613a3657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a8b57613a4d81601f614cfb565b613a58906008614b2b565b87613a64836006614af6565b81518110613a7457613a7461498a565b016020015160f81c901b9190911790600101613a39565b505f805b6008811015613aea57613aa3816007614cfb565b613aae906008614b2b565b6001600160401b031688613ac3836026614af6565b81518110613ad357613ad361498a565b016020015160f81c901b9190911790600101613a8f565b5090969095509350505050565b5f80516020614f858339815191525f6001600160401b038084169085161115613b2b57613b24838561486c565b9050613b38565b613b35848461486c565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613b9a575060018401548151613b96916001600160401b031690614af6565b8210155b15613bc0576001600160401b038316606082015281815260408101516020820152613bdf565b8281606001818151613bd29190614b42565b6001600160401b03169052505b6060810151613bef906064614d50565b602082015160018601546001600160401b039290921691613c1a9190600160401b900460ff16614b2b565b1015613c395760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613c549190614af6565b9052506040810180516001600160401b0387169190613c74908390614cfb565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614fc58339815191526020526040812060020180545f80516020614f858339815191529190600890613d0a90600160401b90046001600160401b0316614d7b565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d7e57604051631afcd79f60e31b815260040160405180910390fd5b565b613d88613d35565b613d918161426f565b613d99614288565b61240160608201356080830135613db660c0850160a0860161477c565b613dc660e0860160c08701614d96565b613dd7610100870160e08801614daf565b613de96101208801610100890161492a565b614298565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e3257604051637fab81e560e01b815260040160405180910390fd5b5f80516020614f8583398151915242613e51604086016020870161477c565b6001600160401b0316111580613e8b5750613e6f6202a30042614af6565b613e7f604086016020870161477c565b6001600160401b031610155b15613ea85760405162d36c8560e81b815260040160405180910390fd5b6030613eb76040860186614d0e565b9050141580613ec557508335155b15613ee35760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613f1357604051630eb0d31360e11b815260040160405180910390fd5b613f1d835f613af7565b5f80613fb66040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f61919061477c565b6001600160401b03168152602001613f7c60408a018a614d0e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506143b9565b5f82815260068601602052604090209193509150613fd48282614e13565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906140129085906004016148ae565b6020604051808303815f875af115801561402e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061405291906148e0565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156140ca576140ca614795565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916141aa918e01908e0161477c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156141ff5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614248576040519150601f19603f3d011682016040523d82523d5f602084013e61424d565b606091505b5050905080611b1c57604051630a12f52160e11b815260040160405180910390fd5b614277613d35565b61427f61447c565b61240181614484565b614290613d35565b613d7e614556565b6142a0613d35565b5f80516020614f6583398151915261ffff841615806142c4575061271061ffff8516115b156142e25760405163c98d73a760e01b815260040160405180910390fd5b8587111561430357604051630103be3b60e21b815260040160405180910390fd5b60ff831615806143165750600a60ff8416115b15614334576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146143e257604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016144149796959493929190614ece565b60405160208183030381529060405290506002816040516144359190614ae5565b602060405180830381855afa158015614450573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061447391906148e0565b94909350915050565b613d7e613d35565b61448c613d35565b80355f80516020614f8583398151915290815560146144b16060840160408501614daf565b60ff1611806144d057506144cb6060830160408401614daf565b60ff16155b156144ee5760405163b4fa3fb360e01b815260040160405180910390fd5b6144fe6060830160408401614daf565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561452f604083016020840161477c565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6125ce613d35565b50805461456a90614b62565b5f825580601f10614579575050565b601f0160209004905f5260205f209081019061240191906145d1565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156145e5575f81556001016145d2565b5090565b8015158114612401575f80fd5b803563ffffffff81168114611b4d575f80fd5b5f805f6060848603121561461b575f80fd5b83359250602084013561462d816145e9565b915061463b604085016145f6565b90509250925092565b5f60208284031215614654575f80fd5b5035919050565b5f610120828403121561466c575f80fd5b50919050565b803561ffff81168114611b4d575f80fd5b80356001600160401b0381168114611b4d575f80fd5b5f805f606084860312156146ab575f80fd5b83356001600160401b038111156146c0575f80fd5b8401606081870312156146d1575f80fd5b92506146df60208501614672565b915061463b60408501614683565b5f602082840312156146fd575f80fd5b610a82826145f6565b5f8060408385031215614717575f80fd5b614720836145f6565b946020939093013593505050565b5f806040838503121561473f575f80fd5b82356001600160401b03811115614754575f80fd5b830160808186031215614765575f80fd5b9150614773602084016145f6565b90509250929050565b5f6020828403121561478c575f80fd5b610a8282614683565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106147cc57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161480760608401826001600160401b03169052565b50608083015161482260808401826001600160401b03169052565b5060a083015161483d60a08401826001600160401b03169052565b5060c0830151612a2460c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612a2457612a24614858565b5f5b838110156148a657818101518382015260200161488e565b50505f910152565b602081525f82518060208401526148cc81604085016020870161488c565b601f01601f19169190910160400192915050565b5f602082840312156148f0575f80fd5b5051919050565b5f8261491157634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114612401575f80fd5b5f6020828403121561493a575f80fd5b8135610a8281614916565b5f808335601e1984360301811261495a575f80fd5b8301803591506001600160401b03821115614973575f80fd5b6020019150600581901b3603821315611eee575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126149b2575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156149f2576149f26149bc565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614a2057614a206149bc565b604052919050565b5f6001600160401b03821115614a4057614a406149bc565b50601f01601f191660200190565b5f60608236031215614a5e575f80fd5b614a666149d0565b823581526020614a77818501614683565b8183015260408401356001600160401b03811115614a93575f80fd5b840136601f820112614aa3575f80fd5b8035614ab6614ab182614a28565b6149f8565b8181523684838501011115614ac9575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516149b281846020870161488c565b80820180821115610a4f57610a4f614858565b5f63ffffffff808316818103614b2157614b21614858565b6001019392505050565b8082028115828204841417610a4f57610a4f614858565b6001600160401b03818116838216019080821115612a2457612a24614858565b600181811c90821680614b7657607f821691505b60208210810361466c57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614ba681614b62565b806020870152604060018084165f8114614bc75760018114614be357614c10565b60ff19851660408a0152604084151560051b8a01019550614c10565b895f5260205f205f5b85811015614c075781548b8201860152908301908801614bec565b8a016040019650505b509398975050505050505050565b8051611b4d816145e9565b5f8060408385031215614c3a575f80fd5b82516001600160401b0380821115614c50575f80fd5b9084019060608287031215614c63575f80fd5b614c6b6149d0565b82518152602080840151614c7e81614916565b82820152604084015183811115614c93575f80fd5b80850194505087601f850112614ca7575f80fd5b83519250614cb7614ab184614a28565b8381528882858701011115614cca575f80fd5b614cd98483830184880161488c565b80604084015250819550614cee818801614c1e565b9450505050509250929050565b81810381811115610a4f57610a4f614858565b5f808335601e19843603018112614d23575f80fd5b8301803591506001600160401b03821115614d3c575f80fd5b602001915036819003821315611eee575f80fd5b6001600160401b03818116838216028082169190828114614d7357614d73614858565b505092915050565b5f6001600160401b03808316818103614b2157614b21614858565b5f60208284031215614da6575f80fd5b610a8282614672565b5f60208284031215614dbf575f80fd5b813560ff81168114610a82575f80fd5b601f821115611b1c57805f5260205f20601f840160051c81016020851015614df45750805b601f840160051c820191505b81811015610b23575f8155600101614e00565b81516001600160401b03811115614e2c57614e2c6149bc565b614e4081614e3a8454614b62565b84614dcf565b602080601f831160018114614e73575f8415614e5c5750858301515b5f19600386901b1c1916600185901b178555610c56565b5f85815260208120601f198616915b82811015614ea157888601518255948401946001909101908401614e82565b5085821015614ebe57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614f2381604e86016020890161488c565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1609,6 +1609,140 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelega return event, nil } +// NativeTokenStakingManagerGeoffEventIterator is returned from FilterGeoffEvent and is used to iterate over the raw logs and unpacked data for GeoffEvent events raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerGeoffEventIterator struct { + Event *NativeTokenStakingManagerGeoffEvent // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub interfaces.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *NativeTokenStakingManagerGeoffEventIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerGeoffEvent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(NativeTokenStakingManagerGeoffEvent) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *NativeTokenStakingManagerGeoffEventIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *NativeTokenStakingManagerGeoffEventIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// NativeTokenStakingManagerGeoffEvent represents a GeoffEvent event raised by the NativeTokenStakingManager contract. +type NativeTokenStakingManagerGeoffEvent struct { + Val uint64 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterGeoffEvent is a free log retrieval operation binding the contract event 0x108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e6. +// +// Solidity: event GeoffEvent(uint64 val) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterGeoffEvent(opts *bind.FilterOpts) (*NativeTokenStakingManagerGeoffEventIterator, error) { + + logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "GeoffEvent") + if err != nil { + return nil, err + } + return &NativeTokenStakingManagerGeoffEventIterator{contract: _NativeTokenStakingManager.contract, event: "GeoffEvent", logs: logs, sub: sub}, nil +} + +// WatchGeoffEvent is a free log subscription operation binding the contract event 0x108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e6. +// +// Solidity: event GeoffEvent(uint64 val) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchGeoffEvent(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerGeoffEvent) (event.Subscription, error) { + + logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "GeoffEvent") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(NativeTokenStakingManagerGeoffEvent) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "GeoffEvent", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseGeoffEvent is a log parse operation binding the contract event 0x108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e6. +// +// Solidity: event GeoffEvent(uint64 val) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseGeoffEvent(log types.Log) (*NativeTokenStakingManagerGeoffEvent, error) { + event := new(NativeTokenStakingManagerGeoffEvent) + if err := _NativeTokenStakingManager.contract.UnpackLog(event, "GeoffEvent", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // NativeTokenStakingManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerInitialValidatorCreatedIterator struct { Event *NativeTokenStakingManagerInitialValidatorCreated // Event containing the contract specifics and raw log diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index b111e9168..9f2a5c3b4 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -73,6 +73,8 @@ abstract contract PoSValidatorManager is uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; + event GeoffEvent(uint64 val); + error InvalidDelegatorStatus(); error InvalidNonce(); error InvalidDelegationID(); @@ -429,7 +431,8 @@ abstract contract PoSValidatorManager is if (validator.status == ValidatorStatus.Active) { if (includeUptimeProof) { // Uptime proofs include the absolute number of seconds the validator has been active. - _getUptime(validationID, messageIndex); + $._completedValidationUptimeSeconds[validationID] = + _getUptime(validationID, messageIndex); } ($._delegatorStakes[delegationID].endingNonce,) = @@ -464,6 +467,9 @@ abstract contract PoSValidatorManager is revert InvalidValidatorStatus(); } + emit GeoffEvent(delegationEndTime); + emit GeoffEvent(delegator.startedAt); + // Only give rewards in the case that the delegation started before the validator exited. if (delegationEndTime <= delegator.startedAt) { return; From c25a48a8afcc657afff88414b154fc098bf8320a Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 25 Sep 2024 11:35:16 -0400 Subject: [PATCH 412/545] Remove event --- .../ERC20TokenStakingManager.go | 138 +----------------- .../NativeTokenStakingManager.go | 138 +----------------- .../validator-manager/PoSValidatorManager.sol | 5 - 3 files changed, 4 insertions(+), 277 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 5ba66e7f2..6be54a428 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -82,8 +82,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"GeoffEvent\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161542938038061542983398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6152dc8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b336600461485b565b61040d565b005b6101b86101c8366004614896565b61069c565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004614896565b61080e565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b86102413660046148ad565b610824565b6101b86102543660046148c6565b6108c5565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b86102843660046148ee565b610b1f565b61029c610297366004614952565b610fa3565b6040519081526020016101e3565b6101ff6102b8366004614896565b610fbc565b61029c5f81565b6101b86102d236600461485b565b610fd0565b6101d5603081565b6101b86102ed366004614896565b6111c2565b6101b86103003660046148c6565b61127d565b61029c61031336600461496b565b611444565b6101b86103263660046148ad565b611470565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004614896565b6115e2565b6101b8610372366004614896565b6117be565b6101d5601481565b61039261038d366004614896565b6118e8565b6040516101e3919061499f565b6101ff6202a30081565b61029c6103b7366004614896565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f5366004614a5f565b6119b0565b6101b8610408366004614ad8565b6119e5565b5f8381525f805160206152108339815191526020526040808220815160e0810190925280545f8051602061525083398151915293929190829060ff16600381111561045a5761045a61498b565b600381111561046b5761046b61498b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e1826118e8565b90506002835160038111156104f8576104f861498b565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156105735761057361498b565b036106195785156105b7576105888286611ac4565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b6105d482846060015183608001516105cf9190614b2a565b611c48565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561061487611d9f565b610667565b60048151600581111561062e5761062e61498b565b0361064e5761063c87611d9f565b61064587612064565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f805160206152b08339815191526020526040808220815160e0810190925280545f8051602061527083398151915293929190829060ff1660058111156106e9576106e961498b565b60058111156106fa576106fa61498b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156107695761076961498b565b146107875760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107ac8584606001515f61224b565b6040518263ffffffff1660e01b81526004016107c89190614b6c565b6020604051808303815f875af11580156107e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108089190614b9e565b50505050565b5f61081e64e8d4a5100083614bb5565b92915050565b5f805160206152508339815191525f8061083d846122a2565b9150915061084a82612540565b6108545750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156108835761088361498b565b036108a8575f838152600785016020526040812080549190556108a6828261257b565b505b6108be816108b98460400151610fa3565b6125e8565b5050505050565b5f8181525f805160206152108339815191526020526040808220815160e0810190925280545f8051602061525083398151915293929190829060ff1660038111156109125761091261498b565b60038111156109235761092361498b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610999826118e8565b90506001835160038111156109b0576109b061498b565b146109ce5760405163f95c7fe160e01b815260040160405180910390fd5b6004815160058111156109e3576109e361498b565b036109f9576109f185612064565b505050505050565b5f610a038761260b565b90505f80610a14836040015161270b565b5091509150818514610a3957604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610a725750806001600160401b03168660a001516001600160401b0316115b15610a9057604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206152708339815191529060ff1615610b7157604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd89190614b9e565b836020013514610bfb5760405163d040949d60e01b815260040160405180910390fd5b30610c0c6060850160408601614bd4565b6001600160a01b031614610c335760405163e6c4247b60e01b815260040160405180910390fd5b5f610c416060850185614bef565b905090505f805b828163ffffffff161015610eed575f610c646060880188614bef565b8363ffffffff16818110610c7a57610c7a614c34565b9050602002810190610c8c9190614c48565b610c9590614cf8565b80515f8181526008880160205260409020549192509015610cc957604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610cf892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610d1291614d8f565b602060405180830381855afa158015610d2d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d509190614b9e565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610ddc57610ddc61498b565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610e8f911686614da0565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610ee690614db3565b9050610c48565b50600483018190555f610eff8561260b565b90505f610f0f8260400151612949565b90505f610f1b88612abe565b905081600282604051610f2e9190614d8f565b602060405180830381855afa158015610f49573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f6c9190614b9e565b14610f8a57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61081e6001600160401b03831664e8d4a51000614dd5565b5f610fc6826118e8565b6080015192915050565b5f805160206152508339815191525f610fe885612f57565b9050610ff385612540565b610ffe575050505050565b5f8581526004830160205260409020546001600160a01b031633146110365760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161106591600160b01b90046001600160401b031690614dec565b6001600160401b03168160c001516001600160401b0316101561109b576040516302336bad60e51b815260040160405180910390fd5b83156108be575f6110ac8685611ac4565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906110fc90610fa3565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611172573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111969190614b9e565b5f878152600785016020526040812080549091906111b5908490614da0565b9091555050505050505050565b5f805160206152508339815191525f6111da836118e8565b90506004815160058111156111f1576111f161498b565b1461120f5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146112475760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610808906001600160a01b03168261257b565b611285613194565b5f8181525f805160206152108339815191526020526040808220815160e0810190925280545f8051602061525083398151915293929190829060ff1660038111156112d2576112d261498b565b60038111156112e3576112e361498b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561135c5761135c61498b565b1461137a5760405163f95c7fe160e01b815260040160405180910390fd5b600461138982604001516118e8565b51600581111561139b5761139b61498b565b1461141f575f6113aa8561260b565b90505f806113bb836040015161270b565b5091509150818460400151146113e457604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561141b57604051633ab3447f60e11b815260040160405180910390fd5b5050505b61142883612064565b505061144060015f8051602061529083398151915255565b5050565b5f61144d613194565b6114588333846131de565b905061081e60015f8051602061529083398151915255565b5f805160206152708339815191525f6114888361260b565b90505f8061149983604001516134a5565b91509150806114bb57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546114d590614e0c565b90505f036114f657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561151c5761151c61498b565b1461153a5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120611552916147ab565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206152108339815191526020526040808220815160e0810190925280545f8051602061525083398151915293929190829060ff16600381111561162f5761162f61498b565b60038111156116405761164061498b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116b9576116b961498b565b141580156116da57506003815160038111156116d7576116d761498b565b14155b156116f85760405163f95c7fe160e01b815260040160405180910390fd5b5f61170682604001516118e8565b905080606001516001600160401b03165f0361173557604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61176284604001518460600151856080015161224b565b6040518263ffffffff1660e01b815260040161177e9190614b6c565b6020604051808303815f875af115801561179a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108be9190614b9e565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615270833981519152919061180590614e0c565b90505f0361182657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561184c5761184c61498b565b1461186a5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118a39190600401614e44565b6020604051808303815f875af11580156118bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118e39190614b9e565b505050565b6118f06147e2565b5f8281525f805160206152b0833981519152602052604090819020815160e0810190925280545f80516020615270833981519152929190829060ff16600581111561193d5761193d61498b565b600581111561194e5761194e61498b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6119b9613194565b6119c585858585613649565b90506119dd60015f8051602061529083398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a2e575080546001600160401b03808416911610155b15611a4c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a7784846137e7565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611b0f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b369190810190614ed9565b9150915080611b5857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbf9190614b9e565b825114611bdf5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611c0b5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611c1a8460400151613801565b91509150818714611c3e57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f805160206152b0833981519152602052604081206002015481905f8051602061527083398151915290600160801b90046001600160401b0316611c9085826139dc565b5f611c9a87613ba5565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611cea8a858b61224b565b6040518263ffffffff1660e01b8152600401611d069190614b6c565b6020604051808303815f875af1158015611d22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d469190614b9e565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f805160206152108339815191526020526040808220815160e0810190925280545f8051602061525083398151915293929190829060ff166003811115611dec57611dec61498b565b6003811115611dfd57611dfd61498b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611e73826118e8565b90505f600382516005811115611e8b57611e8b61498b565b1480611ea95750600482516005811115611ea757611ea761498b565b145b15611eb9575060c0810151611ed6565b600282516005811115611ece57611ece61498b565b0361064e5750425b6040516001600160401b03821681527f108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e69060200160405180910390a160808401516040516001600160401b0390911681527f108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e69060200160405180910390a183608001516001600160401b0316816001600160401b031611611f7957505050505050565b600385015460608501516001600160a01b039091169063778c06b590611f9e90610fa3565b60a085015160808801515f88815260088b01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa158015612025573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120499190614b9e565b5f968752600690950160205250506040909320919091555050565b5f8181525f805160206152108339815191526020526040808220815160e0810190925280545f8051602061525083398151915293929190829060ff1660038111156120b1576120b161498b565b60038111156120c2576120c261498b565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156121f0575f848152600487016020526040902054612710906121a290600160a01b900461ffff1685614dd5565b6121ac9190614bb5565b915081866007015f8681526020019081526020015f205f8282546121d09190614da0565b909155506121e090508284614fab565b90506121f085602001518261257b565b61220585602001516108b98760600151610fa3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6122ab6147e2565b5f805160206152708339815191525f6122c38561260b565b90505f806122d483604001516134a5565b9150915080156122f757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156123285761232861498b565b60058111156123395761233961498b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156123a8576123a861498b565b141580156123c957506001815160058111156123c6576123c661498b565b14155b156123e75760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156123fc576123fc61498b565b0361240a576004815261240f565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156124545761245461498b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156125085761250861498b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061523083398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156125d6575f80fd5b505af1158015610645573d5f803e3d5ffd5b5f8051602061523083398151915254611440906001600160a01b03168383613c1a565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561266f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126969190810190614ed9565b91509150806126b857604051636b2f19e960e01b815260040160405180910390fd5b8151156126d85760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156127045760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461273057604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561277f57612747816001614fab565b612752906008614dd5565b61ffff1686828151811061276857612768614c34565b016020015160f81c901b9190911790600101612733565b5061ffff8116156127a35760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156127fe576127ba816003614fab565b6127c5906008614dd5565b63ffffffff16876127d7836002614da0565b815181106127e7576127e7614c34565b016020015160f81c901b91909117906001016127a6565b5063ffffffff811660041461282657604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561287b5761283d81601f614fab565b612848906008614dd5565b88612854836006614da0565b8151811061286457612864614c34565b016020015160f81c901b9190911790600101612829565b505f805b60088110156128da57612893816007614fab565b61289e906008614dd5565b6001600160401b0316896128b3836026614da0565b815181106128c3576128c3614c34565b016020015160f81c901b919091179060010161287f565b505f805b6008811015612939576128f2816007614fab565b6128fd906008614dd5565b6001600160401b03168a61291283602e614da0565b8151811061292257612922614c34565b016020015160f81c901b91909117906001016128de565b5091989097509095509350505050565b5f815160261461296c57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129bb57612983816001614fab565b61298e906008614dd5565b61ffff168482815181106129a4576129a4614c34565b016020015160f81c901b919091179060010161296f565b5061ffff8116156129df5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612a3a576129f6816003614fab565b612a01906008614dd5565b63ffffffff1685612a13836002614da0565b81518110612a2357612a23614c34565b016020015160f81c901b91909117906001016129e2565b5063ffffffff811615612a6057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612ab557612a7781601f614fab565b612a82906008614dd5565b86612a8e836006614da0565b81518110612a9e57612a9e614c34565b016020015160f81c901b9190911790600101612a63565b50949350505050565b60605f612acd83830184614bef565b612ad991506058614dd5565b612ae490605c614da0565b6001600160401b03811115612afb57612afb614c66565b6040519080825280601f01601f191660200182016040528015612b25576020820181803683370190505b5090505f5b6020811015612b7a5783358160208110612b4657612b46614c34565b1a60f81b828281518110612b5c57612b5c614c34565b60200101906001600160f81b03191690815f1a905350600101612b2a565b505f5b6020811015612bda5783602001358160208110612b9c57612b9c614c34565b1a60f81b82612bac836020614da0565b81518110612bbc57612bbc614c34565b60200101906001600160f81b03191690815f1a905350600101612b7d565b505f5b6004811015612c3d57612bf1816003614fab565b612bfc906008614dd5565b6014901c60f81b82612c0f836040614da0565b81518110612c1f57612c1f614c34565b60200101906001600160f81b03191690815f1a905350600101612bdd565b505f612c4f6060850160408601614bd4565b60601b90505f5b6014811015612caf57818160148110612c7157612c71614c34565b1a60f81b83612c81836044614da0565b81518110612c9157612c91614c34565b60200101906001600160f81b03191690815f1a905350600101612c56565b505f612cbe6060860186614bef565b905090505f5b6004811015612d2957612cd8816003614fab565b612ce3906008614dd5565b63ffffffff8316901c60f81b84612cfb836058614da0565b81518110612d0b57612d0b614c34565b60200101906001600160f81b03191690815f1a905350600101612cc4565b505f5b612d396060870187614bef565b9050811015612f4d575f612d4e826058614dd5565b612d5990605c614da0565b90505f5b6020811015612de457612d736060890189614bef565b84818110612d8357612d83614c34565b9050602002810190612d959190614c48565b358160208110612da757612da7614c34565b1a60f81b86612db68385614da0565b81518110612dc657612dc6614c34565b60200101906001600160f81b03191690815f1a905350600101612d5d565b505f5b6008811015612e9957612dfb816007614fab565b612e06906008614dd5565b612e1360608a018a614bef565b85818110612e2357612e23614c34565b9050602002810190612e359190614c48565b612e46906040810190602001614952565b6001600160401b0316901c60f81b8682612e61856020614da0565b612e6b9190614da0565b81518110612e7b57612e7b614c34565b60200101906001600160f81b03191690815f1a905350600101612de7565b505f5b6030811015612f4357612eb26060890189614bef565b84818110612ec257612ec2614c34565b9050602002810190612ed49190614c48565b612ee2906040810190614fbe565b82818110612ef257612ef2614c34565b9050013560f81c60f81b8682846028612f0b9190614da0565b612f159190614da0565b81518110612f2557612f25614c34565b60200101906001600160f81b03191690815f1a905350600101612e9c565b5050600101612d2c565b5091949350505050565b612f5f6147e2565b5f8281525f805160206152b08339815191526020526040808220815160e0810190925280545f8051602061527083398151915293929190829060ff166005811115612fac57612fac61498b565b6005811115612fbd57612fbd61498b565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561302f5761302f61498b565b1461304d5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156130915761309161498b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61313d8582611c48565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f805160206152908339815191528054600119016131c557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061529083398151915255565b5f5f80516020615250833981519152816131fa6101fa85613c79565b90505f613206876118e8565b905061321187612540565b61322e57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156132435761324361498b565b146132615760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516132729190614dec565b905083600201600a9054906101000a90046001600160401b0316826040015161329b9190615000565b6001600160401b0316816001600160401b031611156132cd57604051630c192e7760e41b815260040160405180910390fd5b5f806132d98a84611c48565b915091505f8a8360405160200161330792919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561339a5761339a61498b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146134c957604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613518576134e0816001614fab565b6134eb906008614dd5565b61ffff1685828151811061350157613501614c34565b016020015160f81c901b91909117906001016134cc565b5061ffff81161561353c5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561359757613553816003614fab565b61355e906008614dd5565b63ffffffff1686613570836002614da0565b8151811061358057613580614c34565b016020015160f81c901b919091179060010161353f565b5063ffffffff81166003146135bf57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613614576135d681601f614fab565b6135e1906008614dd5565b876135ed836006614da0565b815181106135fd576135fd614c34565b016020015160f81c901b91909117906001016135c2565b505f8660268151811061362957613629614c34565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061525083398151915290600160401b900461ffff908116908616108061369d575061271061ffff8616115b156136bb5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156136ed576040516302336bad60e51b815260040160405180910390fd5b80548310806136ff5750806001015483115b1561371d57604051630103be3b60e21b815260040160405180910390fd5b5f61372784613c79565b90505f6137338261080e565b90505f6137408983613c9c565b905060405180606001604052806137543390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6137ef614086565b6137f8826140d1565b61144081614142565b5f808251602e1461382557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156138745761383c816001614fab565b613847906008614dd5565b61ffff1685828151811061385d5761385d614c34565b016020015160f81c901b9190911790600101613828565b5061ffff8116156138985760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156138f3576138af816003614fab565b6138ba906008614dd5565b63ffffffff16866138cc836002614da0565b815181106138dc576138dc614c34565b016020015160f81c901b919091179060010161389b565b5063ffffffff811660051461391b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139705761393281601f614fab565b61393d906008614dd5565b87613949836006614da0565b8151811061395957613959614c34565b016020015160f81c901b919091179060010161391e565b505f805b60088110156139cf57613988816007614fab565b613993906008614dd5565b6001600160401b0316886139a8836026614da0565b815181106139b8576139b8614c34565b016020015160f81c901b9190911790600101613974565b5090969095509350505050565b5f805160206152708339815191525f6001600160401b038084169085161115613a1057613a098385614b2a565b9050613a1d565b613a1a8484614b2a565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a7f575060018401548151613a7b916001600160401b031690614da0565b8210155b15613aa5576001600160401b038316606082015281815260408101516020820152613ac4565b8281606001818151613ab79190614dec565b6001600160401b03169052505b6060810151613ad4906064615000565b602082015160018601546001600160401b039290921691613aff9190600160401b900460ff16614dd5565b1015613b1e5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613b399190614da0565b9052506040810180516001600160401b0387169190613b59908390614fab565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206152b08339815191526020526040812060020180545f805160206152708339815191529190600890613bef90600160401b90046001600160401b031661502b565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b038381166024830152604482018390526118e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061419f565b5f61081e825f80516020615230833981519152546001600160a01b031690614205565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ce057604051637fab81e560e01b815260040160405180910390fd5b5f8051602061527083398151915242613cff6040860160208701614952565b6001600160401b0316111580613d395750613d1d6202a30042614da0565b613d2d6040860160208701614952565b6001600160401b031610155b15613d565760405162d36c8560e81b815260040160405180910390fd5b6030613d656040860186614fbe565b9050141580613d7357508335155b15613d915760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613dc157604051630eb0d31360e11b815260040160405180910390fd5b613dcb835f6139dc565b5f80613e646040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e0f9190614952565b6001600160401b03168152602001613e2a60408a018a614fbe565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614367565b5f82815260068601602052604090209193509150613e82828261508a565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613ec0908590600401614b6c565b6020604051808303815f875af1158015613edc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f009190614b9e565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613f7857613f7861498b565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614058918e01908e01614952565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166140cf57604051631afcd79f60e31b815260040160405180910390fd5b565b6140d9614086565b6140e28161442a565b6140ea614443565b61413f6060820135608083013561410760c0850160a08601614952565b61411760e0860160c08701615145565b614128610100870160e0880161515e565b61413a61012088016101008901614bd4565b614453565b50565b61414a614086565b5f805160206152308339815191526001600160a01b03821661417f5760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6141b36001600160a01b03841683614574565b905080515f141580156141d75750808060200190518101906141d5919061517e565b155b156118e357604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561424b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061426f9190614b9e565b90506142866001600160a01b038516333086614581565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156142ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142ee9190614b9e565b90508181116143545760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016141fc565b61435e8282614fab565b95945050505050565b5f606082608001515160301461439057604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016143c29796959493929190615199565b60405160208183030381529060405290506002816040516143e39190614d8f565b602060405180830381855afa1580156143fe573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906144219190614b9e565b94909350915050565b614432614086565b61443a6145ba565b61413f816145c2565b61444b614086565b6140cf614694565b61445b614086565b5f8051602061525083398151915261ffff8416158061447f575061271061ffff8516115b1561449d5760405163c98d73a760e01b815260040160405180910390fd5b858711156144be57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806144d15750600a60ff8416115b156144ef576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061229b83835f61469c565b6040516001600160a01b0384811660248301528381166044830152606482018390526108089186918216906323b872dd90608401613c47565b6140cf614086565b6145ca614086565b80355f8051602061527083398151915290815560146145ef606084016040850161515e565b60ff16118061460e5750614609606083016040840161515e565b60ff16155b1561462c5760405163b4fa3fb360e01b815260040160405180910390fd5b61463c606083016040840161515e565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561466d6040830160208401614952565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6131cb614086565b6060814710156146c15760405163cd78605960e01b81523060048201526024016141fc565b5f80856001600160a01b031684866040516146dc9190614d8f565b5f6040518083038185875af1925050503d805f8114614716576040519150601f19603f3d011682016040523d82523d5f602084013e61471b565b606091505b5091509150611c3e86838360608261473b5761473682614782565b61229b565b815115801561475257506001600160a01b0384163b155b1561477b57604051639996b31560e01b81526001600160a01b03851660048201526024016141fc565b508061229b565b8051156147925780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546147b790614e0c565b5f825580601f106147c6575050565b601f0160209004905f5260205f209081019061413f919061481e565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614832575f815560010161481f565b5090565b801515811461413f575f80fd5b803563ffffffff81168114614856575f80fd5b919050565b5f805f6060848603121561486d575f80fd5b83359250602084013561487f81614836565b915061488d60408501614843565b90509250925092565b5f602082840312156148a6575f80fd5b5035919050565b5f602082840312156148bd575f80fd5b61229b82614843565b5f80604083850312156148d7575f80fd5b6148e083614843565b946020939093013593505050565b5f80604083850312156148ff575f80fd5b82356001600160401b03811115614914575f80fd5b830160808186031215614925575f80fd5b915061493360208401614843565b90509250929050565b80356001600160401b0381168114614856575f80fd5b5f60208284031215614962575f80fd5b61229b8261493c565b5f806040838503121561497c575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106149c257634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516149fd60608401826001600160401b03169052565b506080830151614a1860808401826001600160401b03169052565b5060a0830151614a3360a08401826001600160401b03169052565b5060c083015161270460c08401826001600160401b03169052565b803561ffff81168114614856575f80fd5b5f805f8060808587031215614a72575f80fd5b84356001600160401b03811115614a87575f80fd5b850160608188031215614a98575f80fd5b9350614aa660208601614a4e565b9250614ab46040860161493c565b9396929550929360600135925050565b6001600160a01b038116811461413f575f80fd5b5f80828403610140811215614aeb575f80fd5b61012080821215614afa575f80fd5b8493508301359050614b0b81614ac4565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561270457612704614b16565b5f5b83811015614b64578181015183820152602001614b4c565b50505f910152565b602081525f8251806020840152614b8a816040850160208701614b4a565b601f01601f19169190910160400192915050565b5f60208284031215614bae575f80fd5b5051919050565b5f82614bcf57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614be4575f80fd5b813561229b81614ac4565b5f808335601e19843603018112614c04575f80fd5b8301803591506001600160401b03821115614c1d575f80fd5b6020019150600581901b3603821315611d98575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614c5c575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614c9c57614c9c614c66565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614cca57614cca614c66565b604052919050565b5f6001600160401b03821115614cea57614cea614c66565b50601f01601f191660200190565b5f60608236031215614d08575f80fd5b614d10614c7a565b823581526020614d2181850161493c565b8183015260408401356001600160401b03811115614d3d575f80fd5b840136601f820112614d4d575f80fd5b8035614d60614d5b82614cd2565b614ca2565b8181523684838501011115614d73575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614c5c818460208701614b4a565b8082018082111561081e5761081e614b16565b5f63ffffffff808316818103614dcb57614dcb614b16565b6001019392505050565b808202811582820484141761081e5761081e614b16565b6001600160401b0381811683821601908082111561270457612704614b16565b600181811c90821680614e2057607f821691505b602082108103614e3e57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614e5681614e0c565b806020870152604060018084165f8114614e775760018114614e9357614ec0565b60ff19851660408a0152604084151560051b8a01019550614ec0565b895f5260205f205f5b85811015614eb75781548b8201860152908301908801614e9c565b8a016040019650505b509398975050505050505050565b805161485681614836565b5f8060408385031215614eea575f80fd5b82516001600160401b0380821115614f00575f80fd5b9084019060608287031215614f13575f80fd5b614f1b614c7a565b82518152602080840151614f2e81614ac4565b82820152604084015183811115614f43575f80fd5b80850194505087601f850112614f57575f80fd5b83519250614f67614d5b84614cd2565b8381528882858701011115614f7a575f80fd5b614f8984838301848801614b4a565b80604084015250819550614f9e818801614ece565b9450505050509250929050565b8181038181111561081e5761081e614b16565b5f808335601e19843603018112614fd3575f80fd5b8301803591506001600160401b03821115614fec575f80fd5b602001915036819003821315611d98575f80fd5b6001600160401b0381811683821602808216919082811461502357615023614b16565b505092915050565b5f6001600160401b03808316818103614dcb57614dcb614b16565b601f8211156118e357805f5260205f20601f840160051c8101602085101561506b5750805b601f840160051c820191505b818110156108be575f8155600101615077565b81516001600160401b038111156150a3576150a3614c66565b6150b7816150b18454614e0c565b84615046565b602080601f8311600181146150ea575f84156150d35750858301515b5f19600386901b1c1916600185901b1785556109f1565b5f85815260208120601f198616915b82811015615118578886015182559484019460019091019084016150f9565b508582101561513557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215615155575f80fd5b61229b82614a4e565b5f6020828403121561516e575f80fd5b813560ff8116811461229b575f80fd5b5f6020828403121561518e575f80fd5b815161229b81614836565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516151ee81604e860160208901614b4a565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516153ab3803806153ab83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61525e8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b33660046147dd565b61040d565b005b6101b86101c8366004614818565b61069c565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004614818565b61080e565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b861024136600461482f565b610824565b6101b8610254366004614848565b6108c5565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b8610284366004614870565b610b1f565b61029c6102973660046148d4565b610fa3565b6040519081526020016101e3565b6101ff6102b8366004614818565b610fbc565b61029c5f81565b6101b86102d23660046147dd565b610fd0565b6101d5603081565b6101b86102ed366004614818565b6111c2565b6101b8610300366004614848565b61127d565b61029c6103133660046148ed565b611444565b6101b861032636600461482f565b611470565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004614818565b6115e2565b6101b8610372366004614818565b6117be565b6101d5601481565b61039261038d366004614818565b6118e8565b6040516101e39190614921565b6101ff6202a30081565b61029c6103b7366004614818565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f53660046149e1565b6119b0565b6101b8610408366004614a5a565b6119e5565b5f8381525f805160206151928339815191526020526040808220815160e0810190925280545f805160206151d283398151915293929190829060ff16600381111561045a5761045a61490d565b600381111561046b5761046b61490d565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e1826118e8565b90506002835160038111156104f8576104f861490d565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156105735761057361490d565b036106195785156105b7576105888286611ac4565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b6105d482846060015183608001516105cf9190614aac565b611c48565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561061487611d9f565b610667565b60048151600581111561062e5761062e61490d565b0361064e5761063c87611d9f565b61064587611fe6565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f805160206152328339815191526020526040808220815160e0810190925280545f805160206151f283398151915293929190829060ff1660058111156106e9576106e961490d565b60058111156106fa576106fa61490d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156107695761076961490d565b146107875760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107ac8584606001515f6121cd565b6040518263ffffffff1660e01b81526004016107c89190614aee565b6020604051808303815f875af11580156107e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108089190614b20565b50505050565b5f61081e64e8d4a5100083614b37565b92915050565b5f805160206151d28339815191525f8061083d84612224565b9150915061084a826124c2565b6108545750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156108835761088361490d565b036108a8575f838152600785016020526040812080549190556108a682826124fd565b505b6108be816108b98460400151610fa3565b61256a565b5050505050565b5f8181525f805160206151928339815191526020526040808220815160e0810190925280545f805160206151d283398151915293929190829060ff1660038111156109125761091261490d565b60038111156109235761092361490d565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610999826118e8565b90506001835160038111156109b0576109b061490d565b146109ce5760405163f95c7fe160e01b815260040160405180910390fd5b6004815160058111156109e3576109e361490d565b036109f9576109f185611fe6565b505050505050565b5f610a038761258d565b90505f80610a14836040015161268d565b5091509150818514610a3957604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610a725750806001600160401b03168660a001516001600160401b0316115b15610a9057604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151f28339815191529060ff1615610b7157604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd89190614b20565b836020013514610bfb5760405163d040949d60e01b815260040160405180910390fd5b30610c0c6060850160408601614b56565b6001600160a01b031614610c335760405163e6c4247b60e01b815260040160405180910390fd5b5f610c416060850185614b71565b905090505f805b828163ffffffff161015610eed575f610c646060880188614b71565b8363ffffffff16818110610c7a57610c7a614bb6565b9050602002810190610c8c9190614bca565b610c9590614c7a565b80515f8181526008880160205260409020549192509015610cc957604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610cf892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610d1291614d11565b602060405180830381855afa158015610d2d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d509190614b20565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610ddc57610ddc61490d565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610e8f911686614d22565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610ee690614d35565b9050610c48565b50600483018190555f610eff8561258d565b90505f610f0f82604001516128cb565b90505f610f1b88612a40565b905081600282604051610f2e9190614d11565b602060405180830381855afa158015610f49573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f6c9190614b20565b14610f8a57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61081e6001600160401b03831664e8d4a51000614d57565b5f610fc6826118e8565b6080015192915050565b5f805160206151d28339815191525f610fe885612ed9565b9050610ff3856124c2565b610ffe575050505050565b5f8581526004830160205260409020546001600160a01b031633146110365760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161106591600160b01b90046001600160401b031690614d6e565b6001600160401b03168160c001516001600160401b0316101561109b576040516302336bad60e51b815260040160405180910390fd5b83156108be575f6110ac8685611ac4565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906110fc90610fa3565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611172573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111969190614b20565b5f878152600785016020526040812080549091906111b5908490614d22565b9091555050505050505050565b5f805160206151d28339815191525f6111da836118e8565b90506004815160058111156111f1576111f161490d565b1461120f5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146112475760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610808906001600160a01b0316826124fd565b611285613116565b5f8181525f805160206151928339815191526020526040808220815160e0810190925280545f805160206151d283398151915293929190829060ff1660038111156112d2576112d261490d565b60038111156112e3576112e361490d565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561135c5761135c61490d565b1461137a5760405163f95c7fe160e01b815260040160405180910390fd5b600461138982604001516118e8565b51600581111561139b5761139b61490d565b1461141f575f6113aa8561258d565b90505f806113bb836040015161268d565b5091509150818460400151146113e457604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561141b57604051633ab3447f60e11b815260040160405180910390fd5b5050505b61142883611fe6565b505061144060015f8051602061521283398151915255565b5050565b5f61144d613116565b611458833384613160565b905061081e60015f8051602061521283398151915255565b5f805160206151f28339815191525f6114888361258d565b90505f806114998360400151613427565b91509150806114bb57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546114d590614d8e565b90505f036114f657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561151c5761151c61490d565b1461153a5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206115529161472d565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206151928339815191526020526040808220815160e0810190925280545f805160206151d283398151915293929190829060ff16600381111561162f5761162f61490d565b60038111156116405761164061490d565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116b9576116b961490d565b141580156116da57506003815160038111156116d7576116d761490d565b14155b156116f85760405163f95c7fe160e01b815260040160405180910390fd5b5f61170682604001516118e8565b905080606001516001600160401b03165f0361173557604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6117628460400151846060015185608001516121cd565b6040518263ffffffff1660e01b815260040161177e9190614aee565b6020604051808303815f875af115801561179a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108be9190614b20565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206151f2833981519152919061180590614d8e565b90505f0361182657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561184c5761184c61490d565b1461186a5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118a39190600401614dc6565b6020604051808303815f875af11580156118bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118e39190614b20565b505050565b6118f0614764565b5f8281525f80516020615232833981519152602052604090819020815160e0810190925280545f805160206151f2833981519152929190829060ff16600581111561193d5761193d61490d565b600581111561194e5761194e61490d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6119b9613116565b6119c5858585856135cb565b90506119dd60015f8051602061521283398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a2e575080546001600160401b03808416911610155b15611a4c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a778484613769565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611b0f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b369190810190614e5b565b9150915080611b5857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbf9190614b20565b825114611bdf5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611c0b5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611c1a8460400151613783565b91509150818714611c3e57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615232833981519152602052604081206002015481905f805160206151f283398151915290600160801b90046001600160401b0316611c90858261395e565b5f611c9a87613b27565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611cea8a858b6121cd565b6040518263ffffffff1660e01b8152600401611d069190614aee565b6020604051808303815f875af1158015611d22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d469190614b20565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f805160206151928339815191526020526040808220815160e0810190925280545f805160206151d283398151915293929190829060ff166003811115611dec57611dec61490d565b6003811115611dfd57611dfd61490d565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611e73826118e8565b90505f600382516005811115611e8b57611e8b61490d565b1480611ea95750600482516005811115611ea757611ea761490d565b145b15611eb9575060c0810151611ed6565b600282516005811115611ece57611ece61490d565b0361064e5750425b83608001516001600160401b0316816001600160401b031611611efb57505050505050565b600385015460608501516001600160a01b039091169063778c06b590611f2090610fa3565b60a085015160808801515f88815260088b01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa158015611fa7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcb9190614b20565b5f968752600690950160205250506040909320919091555050565b5f8181525f805160206151928339815191526020526040808220815160e0810190925280545f805160206151d283398151915293929190829060ff1660038111156120335761203361490d565b60038111156120445761204461490d565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612172575f8481526004870160205260409020546127109061212490600160a01b900461ffff1685614d57565b61212e9190614b37565b915081866007015f8681526020019081526020015f205f8282546121529190614d22565b9091555061216290508284614f2d565b90506121728560200151826124fd565b61218785602001516108b98760600151610fa3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f61222d614764565b5f805160206151f28339815191525f6122458561258d565b90505f806122568360400151613427565b91509150801561227957604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156122aa576122aa61490d565b60058111156122bb576122bb61490d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561232a5761232a61490d565b1415801561234b57506001815160058111156123485761234861490d565b14155b156123695760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561237e5761237e61490d565b0361238c5760048152612391565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156123d6576123d661490d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561248a5761248a61490d565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206151b283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612558575f80fd5b505af1158015610645573d5f803e3d5ffd5b5f805160206151b283398151915254611440906001600160a01b03168383613b9c565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156125f1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126189190810190614e5b565b915091508061263a57604051636b2f19e960e01b815260040160405180910390fd5b81511561265a5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156126865760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146126b257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612701576126c9816001614f2d565b6126d4906008614d57565b61ffff168682815181106126ea576126ea614bb6565b016020015160f81c901b91909117906001016126b5565b5061ffff8116156127255760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156127805761273c816003614f2d565b612747906008614d57565b63ffffffff1687612759836002614d22565b8151811061276957612769614bb6565b016020015160f81c901b9190911790600101612728565b5063ffffffff81166004146127a857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156127fd576127bf81601f614f2d565b6127ca906008614d57565b886127d6836006614d22565b815181106127e6576127e6614bb6565b016020015160f81c901b91909117906001016127ab565b505f805b600881101561285c57612815816007614f2d565b612820906008614d57565b6001600160401b031689612835836026614d22565b8151811061284557612845614bb6565b016020015160f81c901b9190911790600101612801565b505f805b60088110156128bb57612874816007614f2d565b61287f906008614d57565b6001600160401b03168a61289483602e614d22565b815181106128a4576128a4614bb6565b016020015160f81c901b9190911790600101612860565b5091989097509095509350505050565b5f81516026146128ee57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561293d57612905816001614f2d565b612910906008614d57565b61ffff1684828151811061292657612926614bb6565b016020015160f81c901b91909117906001016128f1565b5061ffff8116156129615760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156129bc57612978816003614f2d565b612983906008614d57565b63ffffffff1685612995836002614d22565b815181106129a5576129a5614bb6565b016020015160f81c901b9190911790600101612964565b5063ffffffff8116156129e257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a37576129f981601f614f2d565b612a04906008614d57565b86612a10836006614d22565b81518110612a2057612a20614bb6565b016020015160f81c901b91909117906001016129e5565b50949350505050565b60605f612a4f83830184614b71565b612a5b91506058614d57565b612a6690605c614d22565b6001600160401b03811115612a7d57612a7d614be8565b6040519080825280601f01601f191660200182016040528015612aa7576020820181803683370190505b5090505f5b6020811015612afc5783358160208110612ac857612ac8614bb6565b1a60f81b828281518110612ade57612ade614bb6565b60200101906001600160f81b03191690815f1a905350600101612aac565b505f5b6020811015612b5c5783602001358160208110612b1e57612b1e614bb6565b1a60f81b82612b2e836020614d22565b81518110612b3e57612b3e614bb6565b60200101906001600160f81b03191690815f1a905350600101612aff565b505f5b6004811015612bbf57612b73816003614f2d565b612b7e906008614d57565b6014901c60f81b82612b91836040614d22565b81518110612ba157612ba1614bb6565b60200101906001600160f81b03191690815f1a905350600101612b5f565b505f612bd16060850160408601614b56565b60601b90505f5b6014811015612c3157818160148110612bf357612bf3614bb6565b1a60f81b83612c03836044614d22565b81518110612c1357612c13614bb6565b60200101906001600160f81b03191690815f1a905350600101612bd8565b505f612c406060860186614b71565b905090505f5b6004811015612cab57612c5a816003614f2d565b612c65906008614d57565b63ffffffff8316901c60f81b84612c7d836058614d22565b81518110612c8d57612c8d614bb6565b60200101906001600160f81b03191690815f1a905350600101612c46565b505f5b612cbb6060870187614b71565b9050811015612ecf575f612cd0826058614d57565b612cdb90605c614d22565b90505f5b6020811015612d6657612cf56060890189614b71565b84818110612d0557612d05614bb6565b9050602002810190612d179190614bca565b358160208110612d2957612d29614bb6565b1a60f81b86612d388385614d22565b81518110612d4857612d48614bb6565b60200101906001600160f81b03191690815f1a905350600101612cdf565b505f5b6008811015612e1b57612d7d816007614f2d565b612d88906008614d57565b612d9560608a018a614b71565b85818110612da557612da5614bb6565b9050602002810190612db79190614bca565b612dc89060408101906020016148d4565b6001600160401b0316901c60f81b8682612de3856020614d22565b612ded9190614d22565b81518110612dfd57612dfd614bb6565b60200101906001600160f81b03191690815f1a905350600101612d69565b505f5b6030811015612ec557612e346060890189614b71565b84818110612e4457612e44614bb6565b9050602002810190612e569190614bca565b612e64906040810190614f40565b82818110612e7457612e74614bb6565b9050013560f81c60f81b8682846028612e8d9190614d22565b612e979190614d22565b81518110612ea757612ea7614bb6565b60200101906001600160f81b03191690815f1a905350600101612e1e565b5050600101612cae565b5091949350505050565b612ee1614764565b5f8281525f805160206152328339815191526020526040808220815160e0810190925280545f805160206151f283398151915293929190829060ff166005811115612f2e57612f2e61490d565b6005811115612f3f57612f3f61490d565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612fb157612fb161490d565b14612fcf5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156130135761301361490d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130bf8582611c48565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061521283398151915280546001190161314757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061521283398151915255565b5f5f805160206151d28339815191528161317c6101fa85613bfb565b90505f613188876118e8565b9050613193876124c2565b6131b057604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156131c5576131c561490d565b146131e35760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516131f49190614d6e565b905083600201600a9054906101000a90046001600160401b0316826040015161321d9190614f82565b6001600160401b0316816001600160401b0316111561324f57604051630c192e7760e41b815260040160405180910390fd5b5f8061325b8a84611c48565b915091505f8a8360405160200161328992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561331c5761331c61490d565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461344b57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561349a57613462816001614f2d565b61346d906008614d57565b61ffff1685828151811061348357613483614bb6565b016020015160f81c901b919091179060010161344e565b5061ffff8116156134be5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613519576134d5816003614f2d565b6134e0906008614d57565b63ffffffff16866134f2836002614d22565b8151811061350257613502614bb6565b016020015160f81c901b91909117906001016134c1565b5063ffffffff811660031461354157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135965761355881601f614f2d565b613563906008614d57565b8761356f836006614d22565b8151811061357f5761357f614bb6565b016020015160f81c901b9190911790600101613544565b505f866026815181106135ab576135ab614bb6565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206151d283398151915290600160401b900461ffff908116908616108061361f575061271061ffff8616115b1561363d5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561366f576040516302336bad60e51b815260040160405180910390fd5b80548310806136815750806001015483115b1561369f57604051630103be3b60e21b815260040160405180910390fd5b5f6136a984613bfb565b90505f6136b58261080e565b90505f6136c28983613c1e565b905060405180606001604052806136d63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613771614008565b61377a82614053565b611440816140c4565b5f808251602e146137a757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137f6576137be816001614f2d565b6137c9906008614d57565b61ffff168582815181106137df576137df614bb6565b016020015160f81c901b91909117906001016137aa565b5061ffff81161561381a5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561387557613831816003614f2d565b61383c906008614d57565b63ffffffff168661384e836002614d22565b8151811061385e5761385e614bb6565b016020015160f81c901b919091179060010161381d565b5063ffffffff811660051461389d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138f2576138b481601f614f2d565b6138bf906008614d57565b876138cb836006614d22565b815181106138db576138db614bb6565b016020015160f81c901b91909117906001016138a0565b505f805b60088110156139515761390a816007614f2d565b613915906008614d57565b6001600160401b03168861392a836026614d22565b8151811061393a5761393a614bb6565b016020015160f81c901b91909117906001016138f6565b5090969095509350505050565b5f805160206151f28339815191525f6001600160401b0380841690851611156139925761398b8385614aac565b905061399f565b61399c8484614aac565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a015750600184015481516139fd916001600160401b031690614d22565b8210155b15613a27576001600160401b038316606082015281815260408101516020820152613a46565b8281606001818151613a399190614d6e565b6001600160401b03169052505b6060810151613a56906064614f82565b602082015160018601546001600160401b039290921691613a819190600160401b900460ff16614d57565b1015613aa05760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613abb9190614d22565b9052506040810180516001600160401b0387169190613adb908390614f2d565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206152328339815191526020526040812060020180545f805160206151f28339815191529190600890613b7190600160401b90046001600160401b0316614fad565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b038381166024830152604482018390526118e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614121565b5f61081e825f805160206151b2833981519152546001600160a01b031690614187565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613c6257604051637fab81e560e01b815260040160405180910390fd5b5f805160206151f283398151915242613c8160408601602087016148d4565b6001600160401b0316111580613cbb5750613c9f6202a30042614d22565b613caf60408601602087016148d4565b6001600160401b031610155b15613cd85760405162d36c8560e81b815260040160405180910390fd5b6030613ce76040860186614f40565b9050141580613cf557508335155b15613d135760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613d4357604051630eb0d31360e11b815260040160405180910390fd5b613d4d835f61395e565b5f80613de66040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613d9191906148d4565b6001600160401b03168152602001613dac60408a018a614f40565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506142e9565b5f82815260068601602052604090209193509150613e04828261500c565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613e42908590600401614aee565b6020604051808303815f875af1158015613e5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e829190614b20565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613efa57613efa61490d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613fda918e01908e016148d4565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661405157604051631afcd79f60e31b815260040160405180910390fd5b565b61405b614008565b614064816143ac565b61406c6143c5565b6140c16060820135608083013561408960c0850160a086016148d4565b61409960e0860160c087016150c7565b6140aa610100870160e088016150e0565b6140bc61012088016101008901614b56565b6143d5565b50565b6140cc614008565b5f805160206151b28339815191526001600160a01b0382166141015760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6141356001600160a01b038416836144f6565b905080515f141580156141595750808060200190518101906141579190615100565b155b156118e357604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156141cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141f19190614b20565b90506142086001600160a01b038516333086614503565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561424c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142709190614b20565b90508181116142d65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161417e565b6142e08282614f2d565b95945050505050565b5f606082608001515160301461431257604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614344979695949392919061511b565b60405160208183030381529060405290506002816040516143659190614d11565b602060405180830381855afa158015614380573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143a39190614b20565b94909350915050565b6143b4614008565b6143bc61453c565b6140c181614544565b6143cd614008565b614051614616565b6143dd614008565b5f805160206151d283398151915261ffff84161580614401575061271061ffff8516115b1561441f5760405163c98d73a760e01b815260040160405180910390fd5b8587111561444057604051630103be3b60e21b815260040160405180910390fd5b60ff831615806144535750600a60ff8416115b15614471576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061221d83835f61461e565b6040516001600160a01b0384811660248301528381166044830152606482018390526108089186918216906323b872dd90608401613bc9565b614051614008565b61454c614008565b80355f805160206151f2833981519152908155601461457160608401604085016150e0565b60ff161180614590575061458b60608301604084016150e0565b60ff16155b156145ae5760405163b4fa3fb360e01b815260040160405180910390fd5b6145be60608301604084016150e0565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556145ef60408301602084016148d4565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61314d614008565b6060814710156146435760405163cd78605960e01b815230600482015260240161417e565b5f80856001600160a01b0316848660405161465e9190614d11565b5f6040518083038185875af1925050503d805f8114614698576040519150601f19603f3d011682016040523d82523d5f602084013e61469d565b606091505b5091509150611c3e8683836060826146bd576146b882614704565b61221d565b81511580156146d457506001600160a01b0384163b155b156146fd57604051639996b31560e01b81526001600160a01b038516600482015260240161417e565b508061221d565b8051156147145780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461473990614d8e565b5f825580601f10614748575050565b601f0160209004905f5260205f20908101906140c191906147a0565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156147b4575f81556001016147a1565b5090565b80151581146140c1575f80fd5b803563ffffffff811681146147d8575f80fd5b919050565b5f805f606084860312156147ef575f80fd5b833592506020840135614801816147b8565b915061480f604085016147c5565b90509250925092565b5f60208284031215614828575f80fd5b5035919050565b5f6020828403121561483f575f80fd5b61221d826147c5565b5f8060408385031215614859575f80fd5b614862836147c5565b946020939093013593505050565b5f8060408385031215614881575f80fd5b82356001600160401b03811115614896575f80fd5b8301608081860312156148a7575f80fd5b91506148b5602084016147c5565b90509250929050565b80356001600160401b03811681146147d8575f80fd5b5f602082840312156148e4575f80fd5b61221d826148be565b5f80604083850312156148fe575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061494457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161497f60608401826001600160401b03169052565b50608083015161499a60808401826001600160401b03169052565b5060a08301516149b560a08401826001600160401b03169052565b5060c083015161268660c08401826001600160401b03169052565b803561ffff811681146147d8575f80fd5b5f805f80608085870312156149f4575f80fd5b84356001600160401b03811115614a09575f80fd5b850160608188031215614a1a575f80fd5b9350614a28602086016149d0565b9250614a36604086016148be565b9396929550929360600135925050565b6001600160a01b03811681146140c1575f80fd5b5f80828403610140811215614a6d575f80fd5b61012080821215614a7c575f80fd5b8493508301359050614a8d81614a46565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561268657612686614a98565b5f5b83811015614ae6578181015183820152602001614ace565b50505f910152565b602081525f8251806020840152614b0c816040850160208701614acc565b601f01601f19169190910160400192915050565b5f60208284031215614b30575f80fd5b5051919050565b5f82614b5157634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614b66575f80fd5b813561221d81614a46565b5f808335601e19843603018112614b86575f80fd5b8301803591506001600160401b03821115614b9f575f80fd5b6020019150600581901b3603821315611d98575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614bde575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614c1e57614c1e614be8565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c4c57614c4c614be8565b604052919050565b5f6001600160401b03821115614c6c57614c6c614be8565b50601f01601f191660200190565b5f60608236031215614c8a575f80fd5b614c92614bfc565b823581526020614ca38185016148be565b8183015260408401356001600160401b03811115614cbf575f80fd5b840136601f820112614ccf575f80fd5b8035614ce2614cdd82614c54565b614c24565b8181523684838501011115614cf5575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614bde818460208701614acc565b8082018082111561081e5761081e614a98565b5f63ffffffff808316818103614d4d57614d4d614a98565b6001019392505050565b808202811582820484141761081e5761081e614a98565b6001600160401b0381811683821601908082111561268657612686614a98565b600181811c90821680614da257607f821691505b602082108103614dc057634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614dd881614d8e565b806020870152604060018084165f8114614df95760018114614e1557614e42565b60ff19851660408a0152604084151560051b8a01019550614e42565b895f5260205f205f5b85811015614e395781548b8201860152908301908801614e1e565b8a016040019650505b509398975050505050505050565b80516147d8816147b8565b5f8060408385031215614e6c575f80fd5b82516001600160401b0380821115614e82575f80fd5b9084019060608287031215614e95575f80fd5b614e9d614bfc565b82518152602080840151614eb081614a46565b82820152604084015183811115614ec5575f80fd5b80850194505087601f850112614ed9575f80fd5b83519250614ee9614cdd84614c54565b8381528882858701011115614efc575f80fd5b614f0b84838301848801614acc565b80604084015250819550614f20818801614e50565b9450505050509250929050565b8181038181111561081e5761081e614a98565b5f808335601e19843603018112614f55575f80fd5b8301803591506001600160401b03821115614f6e575f80fd5b602001915036819003821315611d98575f80fd5b6001600160401b03818116838216028082169190828114614fa557614fa5614a98565b505092915050565b5f6001600160401b03808316818103614d4d57614d4d614a98565b601f8211156118e357805f5260205f20601f840160051c81016020851015614fed5750805b601f840160051c820191505b818110156108be575f8155600101614ff9565b81516001600160401b0381111561502557615025614be8565b615039816150338454614d8e565b84614fc8565b602080601f83116001811461506c575f84156150555750858301515b5f19600386901b1c1916600185901b1785556109f1565b5f85815260208120601f198616915b8281101561509a5788860151825594840194600190910190840161507b565b50858210156150b757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156150d7575f80fd5b61221d826149d0565b5f602082840312156150f0575f80fd5b813560ff8116811461221d575f80fd5b5f60208284031215615110575f80fd5b815161221d816147b8565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161517081604e860160208901614acc565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1578,140 +1578,6 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseDelegato return event, nil } -// ERC20TokenStakingManagerGeoffEventIterator is returned from FilterGeoffEvent and is used to iterate over the raw logs and unpacked data for GeoffEvent events raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerGeoffEventIterator struct { - Event *ERC20TokenStakingManagerGeoffEvent // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *ERC20TokenStakingManagerGeoffEventIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerGeoffEvent) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(ERC20TokenStakingManagerGeoffEvent) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *ERC20TokenStakingManagerGeoffEventIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *ERC20TokenStakingManagerGeoffEventIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// ERC20TokenStakingManagerGeoffEvent represents a GeoffEvent event raised by the ERC20TokenStakingManager contract. -type ERC20TokenStakingManagerGeoffEvent struct { - Val uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterGeoffEvent is a free log retrieval operation binding the contract event 0x108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e6. -// -// Solidity: event GeoffEvent(uint64 val) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterGeoffEvent(opts *bind.FilterOpts) (*ERC20TokenStakingManagerGeoffEventIterator, error) { - - logs, sub, err := _ERC20TokenStakingManager.contract.FilterLogs(opts, "GeoffEvent") - if err != nil { - return nil, err - } - return &ERC20TokenStakingManagerGeoffEventIterator{contract: _ERC20TokenStakingManager.contract, event: "GeoffEvent", logs: logs, sub: sub}, nil -} - -// WatchGeoffEvent is a free log subscription operation binding the contract event 0x108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e6. -// -// Solidity: event GeoffEvent(uint64 val) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchGeoffEvent(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerGeoffEvent) (event.Subscription, error) { - - logs, sub, err := _ERC20TokenStakingManager.contract.WatchLogs(opts, "GeoffEvent") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(ERC20TokenStakingManagerGeoffEvent) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "GeoffEvent", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseGeoffEvent is a log parse operation binding the contract event 0x108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e6. -// -// Solidity: event GeoffEvent(uint64 val) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseGeoffEvent(log types.Log) (*ERC20TokenStakingManagerGeoffEvent, error) { - event := new(ERC20TokenStakingManagerGeoffEvent) - if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "GeoffEvent", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // ERC20TokenStakingManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerInitialValidatorCreatedIterator struct { Event *ERC20TokenStakingManagerInitialValidatorCreated // Event containing the contract specifics and raw log diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index 44dff773b..d74f6c3a9 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -82,8 +82,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"GeoffEvent\",\"inputs\":[{\"name\":\"val\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161513e38038061513e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614ff18061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd366004614609565b610561565b005b3480156101df575f80fd5b506101d26101ee366004614644565b6107f0565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d261023836600461465b565b610962565b348015610248575f80fd5b5061025c610257366004614644565b610a3f565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc366004614699565b610a55565b604051908152602001610215565b3480156102fa575f80fd5b506101d26103093660046146ed565b610a89565b348015610319575f80fd5b506101d2610328366004614706565b610b2a565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d261037036600461472e565b610d84565b348015610380575f80fd5b506102e161038f36600461477c565b611208565b34801561039f575f80fd5b5061025c6103ae366004614644565b611221565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e0366004614609565b611235565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d2610413366004614644565b611427565b348015610423575f80fd5b506101d2610432366004614706565b6114e2565b348015610442575f80fd5b506101d26104513660046146ed565b6116a9565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a366004614644565b61181b565b34801561049a575f80fd5b506101d26104a9366004614644565b6119f7565b6102e16104bc366004614644565b611b21565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef366004614644565b611b52565b60405161021591906147a9565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e1610531366004614644565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614f458339815191526020526040808220815160e0810190925280545f80516020614f6583398151915293929190829060ff1660038111156105ae576105ae614795565b60038111156105bf576105bf614795565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611b52565b905060028351600381111561064c5761064c614795565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156106c7576106c7614795565b0361076d57851561070b576106dc8286611c1a565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b6107288284606001518360800151610723919061486c565b611d9e565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561076887611ef5565b6107bb565b60048151600581111561078257610782614795565b036107a25761079087611ef5565b610799876121ba565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f80516020614fc58339815191526020526040808220815160e0810190925280545f80516020614f8583398151915293929190829060ff16600581111561083d5761083d614795565b600581111561084e5761084e614795565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108bd576108bd614795565b146108db5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109008584606001515f6123a1565b6040518263ffffffff1660e01b815260040161091c91906148ae565b6020604051808303815f875af1158015610938573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095c91906148e0565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109ab575080546001600160401b03808416911610155b156109c95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109f3836123f0565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a4f64e8d4a51000836148f7565b92915050565b5f610a5e612404565b610a6a8484843461243b565b9050610a8260015f80516020614fa583398151915255565b9392505050565b5f80516020614f658339815191525f80610aa2846125e1565b91509150610aaf8261287f565b610ab95750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ae857610ae8614795565b03610b0d575f83815260078501602052604081208054919055610b0b82826128ba565b505b610b2381610b1e8460400151611208565b612918565b5050505050565b5f8181525f80516020614f458339815191526020526040808220815160e0810190925280545f80516020614f6583398151915293929190829060ff166003811115610b7757610b77614795565b6003811115610b8857610b88614795565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610bfe82611b52565b9050600183516003811115610c1557610c15614795565b14610c335760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610c4857610c48614795565b03610c5e57610c56856121ba565b505050505050565b5f610c688761292b565b90505f80610c798360400151612a2b565b5091509150818514610c9e57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610cd75750806001600160401b03168660a001516001600160401b0316115b15610cf557604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614f858339815191529060ff1615610dd657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3d91906148e0565b836020013514610e605760405163d040949d60e01b815260040160405180910390fd5b30610e71606085016040860161492a565b6001600160a01b031614610e985760405163e6c4247b60e01b815260040160405180910390fd5b5f610ea66060850185614945565b905090505f805b828163ffffffff161015611152575f610ec96060880188614945565b8363ffffffff16818110610edf57610edf61498a565b9050602002810190610ef1919061499e565b610efa90614a4e565b80515f8181526008880160205260409020549192509015610f2e57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610f5d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610f7791614ae5565b602060405180830381855afa158015610f92573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610fb591906148e0565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561104157611041614795565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516110f4911686614af6565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061114b90614b09565b9050610ead565b50600483018190555f6111648561292b565b90505f6111748260400151612c69565b90505f61118088612dde565b9050816002826040516111939190614ae5565b602060405180830381855afa1580156111ae573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111d191906148e0565b146111ef57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610a4f6001600160401b03831664e8d4a51000614b2b565b5f61122b82611b52565b6080015192915050565b5f80516020614f658339815191525f61124d85613277565b90506112588561287f565b611263575050505050565b5f8581526004830160205260409020546001600160a01b0316331461129b5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516112ca91600160b01b90046001600160401b031690614b42565b6001600160401b03168160c001516001600160401b03161015611300576040516302336bad60e51b815260040160405180910390fd5b8315610b23575f6113118685611c1a565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061136190611208565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156113d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113fb91906148e0565b5f8781526007850160205260408120805490919061141a908490614af6565b9091555050505050505050565b5f80516020614f658339815191525f61143f83611b52565b905060048151600581111561145657611456614795565b146114745760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114ac5760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461095c906001600160a01b0316826128ba565b6114ea612404565b5f8181525f80516020614f458339815191526020526040808220815160e0810190925280545f80516020614f6583398151915293929190829060ff16600381111561153757611537614795565b600381111561154857611548614795565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115c1576115c1614795565b146115df5760405163f95c7fe160e01b815260040160405180910390fd5b60046115ee8260400151611b52565b51600581111561160057611600614795565b14611684575f61160f8561292b565b90505f806116208360400151612a2b565b50915091508184604001511461164957604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561168057604051633ab3447f60e11b815260040160405180910390fd5b5050505b61168d836121ba565b50506116a560015f80516020614fa583398151915255565b5050565b5f80516020614f858339815191525f6116c18361292b565b90505f806116d283604001516134b4565b91509150806116f457604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461170e90614b62565b90505f0361172f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561175557611755614795565b146117735760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061178b9161455e565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614f458339815191526020526040808220815160e0810190925280545f80516020614f6583398151915293929190829060ff16600381111561186857611868614795565b600381111561187957611879614795565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156118f2576118f2614795565b14158015611913575060038151600381111561191057611910614795565b14155b156119315760405163f95c7fe160e01b815260040160405180910390fd5b5f61193f8260400151611b52565b905080606001516001600160401b03165f0361196e57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61199b8460400151846060015185608001516123a1565b6040518263ffffffff1660e01b81526004016119b791906148ae565b6020604051808303815f875af11580156119d3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2391906148e0565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614f858339815191529190611a3e90614b62565b90505f03611a5f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611a8557611a85614795565b14611aa35760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611adc9190600401614b94565b6020604051808303815f875af1158015611af8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1c91906148e0565b505050565b5f611b2a612404565b611b35823334613658565b9050611b4d60015f80516020614fa583398151915255565b919050565b611b5a614595565b5f8281525f80516020614fc5833981519152602052604090819020815160e0810190925280545f80516020614f85833981519152929190829060ff166005811115611ba757611ba7614795565b6005811115611bb857611bb8614795565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c8c9190810190614c29565b9150915080611cae57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1591906148e0565b825114611d355760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d615760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d70846040015161391c565b91509150818714611d9457604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614fc5833981519152602052604081206002015481905f80516020614f8583398151915290600160801b90046001600160401b0316611de68582613af7565b5f611df087613cc0565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e408a858b6123a1565b6040518263ffffffff1660e01b8152600401611e5c91906148ae565b6020604051808303815f875af1158015611e78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e9c91906148e0565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f80516020614f458339815191526020526040808220815160e0810190925280545f80516020614f6583398151915293929190829060ff166003811115611f4257611f42614795565b6003811115611f5357611f53614795565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611fc982611b52565b90505f600382516005811115611fe157611fe1614795565b1480611fff5750600482516005811115611ffd57611ffd614795565b145b1561200f575060c081015161202c565b60028251600581111561202457612024614795565b036107a25750425b6040516001600160401b03821681527f108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e69060200160405180910390a160808401516040516001600160401b0390911681527f108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e69060200160405180910390a183608001516001600160401b0316816001600160401b0316116120cf57505050505050565b600385015460608501516001600160a01b039091169063778c06b5906120f490611208565b60a085015160808801515f88815260088b01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa15801561217b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219f91906148e0565b5f968752600690950160205250506040909320919091555050565b5f8181525f80516020614f458339815191526020526040808220815160e0810190925280545f80516020614f6583398151915293929190829060ff16600381111561220757612207614795565b600381111561221857612218614795565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612346575f848152600487016020526040902054612710906122f890600160a01b900461ffff1685614b2b565b61230291906148f7565b915081866007015f8681526020019081526020015f205f8282546123269190614af6565b9091555061233690508284614cfb565b90506123468560200151826128ba565b61235b8560200151610b1e8760600151611208565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6123f8613d35565b61240181613d80565b50565b5f80516020614fa583398151915280546001190161243557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614f6583398151915290600160401b900461ffff908116908616108061248f575061271061ffff8616115b156124ad5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156124df576040516302336bad60e51b815260040160405180910390fd5b80548310806124f15750806001015483115b1561250f57604051630103be3b60e21b815260040160405180910390fd5b825f61251a82610a3f565b90505f6125278983613dee565b9050604051806060016040528061253b3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614fa583398151915255565b5f6125ea614595565b5f80516020614f858339815191525f6126028561292b565b90505f8061261383604001516134b4565b91509150801561263657604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561266757612667614795565b600581111561267857612678614795565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156126e7576126e7614795565b14158015612708575060018151600581111561270557612705614795565b14155b156127265760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561273b5761273b614795565b03612749576004815261274e565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561279357612793614795565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561284757612847614795565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612906575f80fd5b505af1158015610c56573d5f803e3d5ffd5b6116a56001600160a01b038316826141d8565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561298f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129b69190810190614c29565b91509150806129d857604051636b2f19e960e01b815260040160405180910390fd5b8151156129f85760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612a245760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612a5057604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612a9f57612a67816001614cfb565b612a72906008614b2b565b61ffff16868281518110612a8857612a8861498a565b016020015160f81c901b9190911790600101612a53565b5061ffff811615612ac35760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612b1e57612ada816003614cfb565b612ae5906008614b2b565b63ffffffff1687612af7836002614af6565b81518110612b0757612b0761498a565b016020015160f81c901b9190911790600101612ac6565b5063ffffffff8116600414612b4657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612b9b57612b5d81601f614cfb565b612b68906008614b2b565b88612b74836006614af6565b81518110612b8457612b8461498a565b016020015160f81c901b9190911790600101612b49565b505f805b6008811015612bfa57612bb3816007614cfb565b612bbe906008614b2b565b6001600160401b031689612bd3836026614af6565b81518110612be357612be361498a565b016020015160f81c901b9190911790600101612b9f565b505f805b6008811015612c5957612c12816007614cfb565b612c1d906008614b2b565b6001600160401b03168a612c3283602e614af6565b81518110612c4257612c4261498a565b016020015160f81c901b9190911790600101612bfe565b5091989097509095509350505050565b5f8151602614612c8c57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612cdb57612ca3816001614cfb565b612cae906008614b2b565b61ffff16848281518110612cc457612cc461498a565b016020015160f81c901b9190911790600101612c8f565b5061ffff811615612cff5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612d5a57612d16816003614cfb565b612d21906008614b2b565b63ffffffff1685612d33836002614af6565b81518110612d4357612d4361498a565b016020015160f81c901b9190911790600101612d02565b5063ffffffff811615612d8057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612dd557612d9781601f614cfb565b612da2906008614b2b565b86612dae836006614af6565b81518110612dbe57612dbe61498a565b016020015160f81c901b9190911790600101612d83565b50949350505050565b60605f612ded83830184614945565b612df991506058614b2b565b612e0490605c614af6565b6001600160401b03811115612e1b57612e1b6149bc565b6040519080825280601f01601f191660200182016040528015612e45576020820181803683370190505b5090505f5b6020811015612e9a5783358160208110612e6657612e6661498a565b1a60f81b828281518110612e7c57612e7c61498a565b60200101906001600160f81b03191690815f1a905350600101612e4a565b505f5b6020811015612efa5783602001358160208110612ebc57612ebc61498a565b1a60f81b82612ecc836020614af6565b81518110612edc57612edc61498a565b60200101906001600160f81b03191690815f1a905350600101612e9d565b505f5b6004811015612f5d57612f11816003614cfb565b612f1c906008614b2b565b6014901c60f81b82612f2f836040614af6565b81518110612f3f57612f3f61498a565b60200101906001600160f81b03191690815f1a905350600101612efd565b505f612f6f606085016040860161492a565b60601b90505f5b6014811015612fcf57818160148110612f9157612f9161498a565b1a60f81b83612fa1836044614af6565b81518110612fb157612fb161498a565b60200101906001600160f81b03191690815f1a905350600101612f76565b505f612fde6060860186614945565b905090505f5b600481101561304957612ff8816003614cfb565b613003906008614b2b565b63ffffffff8316901c60f81b8461301b836058614af6565b8151811061302b5761302b61498a565b60200101906001600160f81b03191690815f1a905350600101612fe4565b505f5b6130596060870187614945565b905081101561326d575f61306e826058614b2b565b61307990605c614af6565b90505f5b6020811015613104576130936060890189614945565b848181106130a3576130a361498a565b90506020028101906130b5919061499e565b3581602081106130c7576130c761498a565b1a60f81b866130d68385614af6565b815181106130e6576130e661498a565b60200101906001600160f81b03191690815f1a90535060010161307d565b505f5b60088110156131b95761311b816007614cfb565b613126906008614b2b565b61313360608a018a614945565b858181106131435761314361498a565b9050602002810190613155919061499e565b61316690604081019060200161477c565b6001600160401b0316901c60f81b8682613181856020614af6565b61318b9190614af6565b8151811061319b5761319b61498a565b60200101906001600160f81b03191690815f1a905350600101613107565b505f5b6030811015613263576131d26060890189614945565b848181106131e2576131e261498a565b90506020028101906131f4919061499e565b613202906040810190614d0e565b828181106132125761321261498a565b9050013560f81c60f81b868284602861322b9190614af6565b6132359190614af6565b815181106132455761324561498a565b60200101906001600160f81b03191690815f1a9053506001016131bc565b505060010161304c565b5091949350505050565b61327f614595565b5f8281525f80516020614fc58339815191526020526040808220815160e0810190925280545f80516020614f8583398151915293929190829060ff1660058111156132cc576132cc614795565b60058111156132dd576132dd614795565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561334f5761334f614795565b1461336d5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156133b1576133b1614795565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61345d8582611d9e565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146134d857604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613527576134ef816001614cfb565b6134fa906008614b2b565b61ffff168582815181106135105761351061498a565b016020015160f81c901b91909117906001016134db565b5061ffff81161561354b5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156135a657613562816003614cfb565b61356d906008614b2b565b63ffffffff168661357f836002614af6565b8151811061358f5761358f61498a565b016020015160f81c901b919091179060010161354e565b5063ffffffff81166003146135ce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613623576135e581601f614cfb565b6135f0906008614b2b565b876135fc836006614af6565b8151811061360c5761360c61498a565b016020015160f81c901b91909117906001016135d1565b505f866026815181106136385761363861498a565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614f658339815191528161367184610a3f565b90505f61367d87611b52565b90506136888761287f565b6136a557604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156136ba576136ba614795565b146136d85760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516136e99190614b42565b905083600201600a9054906101000a90046001600160401b031682604001516137129190614d50565b6001600160401b0316816001600160401b0316111561374457604051630c192e7760e41b815260040160405180910390fd5b5f806137508a84611d9e565b915091505f8a8360405160200161377e92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561381157613811614795565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461394057604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561398f57613957816001614cfb565b613962906008614b2b565b61ffff168582815181106139785761397861498a565b016020015160f81c901b9190911790600101613943565b5061ffff8116156139b35760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613a0e576139ca816003614cfb565b6139d5906008614b2b565b63ffffffff16866139e7836002614af6565b815181106139f7576139f761498a565b016020015160f81c901b91909117906001016139b6565b5063ffffffff8116600514613a3657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a8b57613a4d81601f614cfb565b613a58906008614b2b565b87613a64836006614af6565b81518110613a7457613a7461498a565b016020015160f81c901b9190911790600101613a39565b505f805b6008811015613aea57613aa3816007614cfb565b613aae906008614b2b565b6001600160401b031688613ac3836026614af6565b81518110613ad357613ad361498a565b016020015160f81c901b9190911790600101613a8f565b5090969095509350505050565b5f80516020614f858339815191525f6001600160401b038084169085161115613b2b57613b24838561486c565b9050613b38565b613b35848461486c565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613b9a575060018401548151613b96916001600160401b031690614af6565b8210155b15613bc0576001600160401b038316606082015281815260408101516020820152613bdf565b8281606001818151613bd29190614b42565b6001600160401b03169052505b6060810151613bef906064614d50565b602082015160018601546001600160401b039290921691613c1a9190600160401b900460ff16614b2b565b1015613c395760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613c549190614af6565b9052506040810180516001600160401b0387169190613c74908390614cfb565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614fc58339815191526020526040812060020180545f80516020614f858339815191529190600890613d0a90600160401b90046001600160401b0316614d7b565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d7e57604051631afcd79f60e31b815260040160405180910390fd5b565b613d88613d35565b613d918161426f565b613d99614288565b61240160608201356080830135613db660c0850160a0860161477c565b613dc660e0860160c08701614d96565b613dd7610100870160e08801614daf565b613de96101208801610100890161492a565b614298565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e3257604051637fab81e560e01b815260040160405180910390fd5b5f80516020614f8583398151915242613e51604086016020870161477c565b6001600160401b0316111580613e8b5750613e6f6202a30042614af6565b613e7f604086016020870161477c565b6001600160401b031610155b15613ea85760405162d36c8560e81b815260040160405180910390fd5b6030613eb76040860186614d0e565b9050141580613ec557508335155b15613ee35760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613f1357604051630eb0d31360e11b815260040160405180910390fd5b613f1d835f613af7565b5f80613fb66040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613f61919061477c565b6001600160401b03168152602001613f7c60408a018a614d0e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506143b9565b5f82815260068601602052604090209193509150613fd48282614e13565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906140129085906004016148ae565b6020604051808303815f875af115801561402e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061405291906148e0565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156140ca576140ca614795565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916141aa918e01908e0161477c565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156141ff5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614248576040519150601f19603f3d011682016040523d82523d5f602084013e61424d565b606091505b5050905080611b1c57604051630a12f52160e11b815260040160405180910390fd5b614277613d35565b61427f61447c565b61240181614484565b614290613d35565b613d7e614556565b6142a0613d35565b5f80516020614f6583398151915261ffff841615806142c4575061271061ffff8516115b156142e25760405163c98d73a760e01b815260040160405180910390fd5b8587111561430357604051630103be3b60e21b815260040160405180910390fd5b60ff831615806143165750600a60ff8416115b15614334576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146143e257604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016144149796959493929190614ece565b60405160208183030381529060405290506002816040516144359190614ae5565b602060405180830381855afa158015614450573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061447391906148e0565b94909350915050565b613d7e613d35565b61448c613d35565b80355f80516020614f8583398151915290815560146144b16060840160408501614daf565b60ff1611806144d057506144cb6060830160408401614daf565b60ff16155b156144ee5760405163b4fa3fb360e01b815260040160405180910390fd5b6144fe6060830160408401614daf565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561452f604083016020840161477c565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6125ce613d35565b50805461456a90614b62565b5f825580601f10614579575050565b601f0160209004905f5260205f209081019061240191906145d1565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156145e5575f81556001016145d2565b5090565b8015158114612401575f80fd5b803563ffffffff81168114611b4d575f80fd5b5f805f6060848603121561461b575f80fd5b83359250602084013561462d816145e9565b915061463b604085016145f6565b90509250925092565b5f60208284031215614654575f80fd5b5035919050565b5f610120828403121561466c575f80fd5b50919050565b803561ffff81168114611b4d575f80fd5b80356001600160401b0381168114611b4d575f80fd5b5f805f606084860312156146ab575f80fd5b83356001600160401b038111156146c0575f80fd5b8401606081870312156146d1575f80fd5b92506146df60208501614672565b915061463b60408501614683565b5f602082840312156146fd575f80fd5b610a82826145f6565b5f8060408385031215614717575f80fd5b614720836145f6565b946020939093013593505050565b5f806040838503121561473f575f80fd5b82356001600160401b03811115614754575f80fd5b830160808186031215614765575f80fd5b9150614773602084016145f6565b90509250929050565b5f6020828403121561478c575f80fd5b610a8282614683565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106147cc57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161480760608401826001600160401b03169052565b50608083015161482260808401826001600160401b03169052565b5060a083015161483d60a08401826001600160401b03169052565b5060c0830151612a2460c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612a2457612a24614858565b5f5b838110156148a657818101518382015260200161488e565b50505f910152565b602081525f82518060208401526148cc81604085016020870161488c565b601f01601f19169190910160400192915050565b5f602082840312156148f0575f80fd5b5051919050565b5f8261491157634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114612401575f80fd5b5f6020828403121561493a575f80fd5b8135610a8281614916565b5f808335601e1984360301811261495a575f80fd5b8301803591506001600160401b03821115614973575f80fd5b6020019150600581901b3603821315611eee575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126149b2575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156149f2576149f26149bc565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614a2057614a206149bc565b604052919050565b5f6001600160401b03821115614a4057614a406149bc565b50601f01601f191660200190565b5f60608236031215614a5e575f80fd5b614a666149d0565b823581526020614a77818501614683565b8183015260408401356001600160401b03811115614a93575f80fd5b840136601f820112614aa3575f80fd5b8035614ab6614ab182614a28565b6149f8565b8181523684838501011115614ac9575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516149b281846020870161488c565b80820180821115610a4f57610a4f614858565b5f63ffffffff808316818103614b2157614b21614858565b6001019392505050565b8082028115828204841417610a4f57610a4f614858565b6001600160401b03818116838216019080821115612a2457612a24614858565b600181811c90821680614b7657607f821691505b60208210810361466c57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614ba681614b62565b806020870152604060018084165f8114614bc75760018114614be357614c10565b60ff19851660408a0152604084151560051b8a01019550614c10565b895f5260205f205f5b85811015614c075781548b8201860152908301908801614bec565b8a016040019650505b509398975050505050505050565b8051611b4d816145e9565b5f8060408385031215614c3a575f80fd5b82516001600160401b0380821115614c50575f80fd5b9084019060608287031215614c63575f80fd5b614c6b6149d0565b82518152602080840151614c7e81614916565b82820152604084015183811115614c93575f80fd5b80850194505087601f850112614ca7575f80fd5b83519250614cb7614ab184614a28565b8381528882858701011115614cca575f80fd5b614cd98483830184880161488c565b80604084015250819550614cee818801614c1e565b9450505050509250929050565b81810381811115610a4f57610a4f614858565b5f808335601e19843603018112614d23575f80fd5b8301803591506001600160401b03821115614d3c575f80fd5b602001915036819003821315611eee575f80fd5b6001600160401b03818116838216028082169190828114614d7357614d73614858565b505092915050565b5f6001600160401b03808316818103614b2157614b21614858565b5f60208284031215614da6575f80fd5b610a8282614672565b5f60208284031215614dbf575f80fd5b813560ff81168114610a82575f80fd5b601f821115611b1c57805f5260205f20601f840160051c81016020851015614df45750805b601f840160051c820191505b81811015610b23575f8155600101614e00565b81516001600160401b03811115614e2c57614e2c6149bc565b614e4081614e3a8454614b62565b84614dcf565b602080601f831160018114614e73575f8415614e5c5750858301515b5f19600386901b1c1916600185901b178555610c56565b5f85815260208120601f198616915b82811015614ea157888601518255948401946001909101908401614e82565b5085821015614ebe57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614f2381604e86016020890161488c565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516150c03803806150c083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614f738061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd36600461458b565b610561565b005b3480156101df575f80fd5b506101d26101ee3660046145c6565b6107f0565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d26102383660046145dd565b610962565b348015610248575f80fd5b5061025c6102573660046145c6565b610a3f565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc36600461461b565b610a55565b604051908152602001610215565b3480156102fa575f80fd5b506101d261030936600461466f565b610a89565b348015610319575f80fd5b506101d2610328366004614688565b610b2a565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d26103703660046146b0565b610d84565b348015610380575f80fd5b506102e161038f3660046146fe565b611208565b34801561039f575f80fd5b5061025c6103ae3660046145c6565b611221565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e036600461458b565b611235565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d26104133660046145c6565b611427565b348015610423575f80fd5b506101d2610432366004614688565b6114e2565b348015610442575f80fd5b506101d261045136600461466f565b6116a9565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a3660046145c6565b61181b565b34801561049a575f80fd5b506101d26104a93660046145c6565b6119f7565b6102e16104bc3660046145c6565b611b21565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef3660046145c6565b611b52565b604051610215919061472b565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e16105313660046145c6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614ec78339815191526020526040808220815160e0810190925280545f80516020614ee783398151915293929190829060ff1660038111156105ae576105ae614717565b60038111156105bf576105bf614717565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611b52565b905060028351600381111561064c5761064c614717565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156106c7576106c7614717565b0361076d57851561070b576106dc8286611c1a565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b610728828460600151836080015161072391906147ee565b611d9e565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561076887611ef5565b6107bb565b60048151600581111561078257610782614717565b036107a25761079087611ef5565b6107998761213c565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f80516020614f478339815191526020526040808220815160e0810190925280545f80516020614f0783398151915293929190829060ff16600581111561083d5761083d614717565b600581111561084e5761084e614717565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108bd576108bd614717565b146108db5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109008584606001515f612323565b6040518263ffffffff1660e01b815260040161091c9190614830565b6020604051808303815f875af1158015610938573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095c9190614862565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109ab575080546001600160401b03808416911610155b156109c95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109f383612372565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a4f64e8d4a5100083614879565b92915050565b5f610a5e612386565b610a6a848484346123bd565b9050610a8260015f80516020614f2783398151915255565b9392505050565b5f80516020614ee78339815191525f80610aa284612563565b91509150610aaf82612801565b610ab95750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ae857610ae8614717565b03610b0d575f83815260078501602052604081208054919055610b0b828261283c565b505b610b2381610b1e8460400151611208565b61289a565b5050505050565b5f8181525f80516020614ec78339815191526020526040808220815160e0810190925280545f80516020614ee783398151915293929190829060ff166003811115610b7757610b77614717565b6003811115610b8857610b88614717565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610bfe82611b52565b9050600183516003811115610c1557610c15614717565b14610c335760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610c4857610c48614717565b03610c5e57610c568561213c565b505050505050565b5f610c68876128ad565b90505f80610c7983604001516129ad565b5091509150818514610c9e57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610cd75750806001600160401b03168660a001516001600160401b0316115b15610cf557604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614f078339815191529060ff1615610dd657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3d9190614862565b836020013514610e605760405163d040949d60e01b815260040160405180910390fd5b30610e7160608501604086016148ac565b6001600160a01b031614610e985760405163e6c4247b60e01b815260040160405180910390fd5b5f610ea660608501856148c7565b905090505f805b828163ffffffff161015611152575f610ec960608801886148c7565b8363ffffffff16818110610edf57610edf61490c565b9050602002810190610ef19190614920565b610efa906149d0565b80515f8181526008880160205260409020549192509015610f2e57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610f5d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610f7791614a67565b602060405180830381855afa158015610f92573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610fb59190614862565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561104157611041614717565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516110f4911686614a78565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061114b90614a8b565b9050610ead565b50600483018190555f611164856128ad565b90505f6111748260400151612beb565b90505f61118088612d60565b9050816002826040516111939190614a67565b602060405180830381855afa1580156111ae573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111d19190614862565b146111ef57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610a4f6001600160401b03831664e8d4a51000614aad565b5f61122b82611b52565b6080015192915050565b5f80516020614ee78339815191525f61124d856131f9565b905061125885612801565b611263575050505050565b5f8581526004830160205260409020546001600160a01b0316331461129b5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516112ca91600160b01b90046001600160401b031690614ac4565b6001600160401b03168160c001516001600160401b03161015611300576040516302336bad60e51b815260040160405180910390fd5b8315610b23575f6113118685611c1a565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061136190611208565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156113d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113fb9190614862565b5f8781526007850160205260408120805490919061141a908490614a78565b9091555050505050505050565b5f80516020614ee78339815191525f61143f83611b52565b905060048151600581111561145657611456614717565b146114745760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114ac5760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461095c906001600160a01b03168261283c565b6114ea612386565b5f8181525f80516020614ec78339815191526020526040808220815160e0810190925280545f80516020614ee783398151915293929190829060ff16600381111561153757611537614717565b600381111561154857611548614717565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115c1576115c1614717565b146115df5760405163f95c7fe160e01b815260040160405180910390fd5b60046115ee8260400151611b52565b51600581111561160057611600614717565b14611684575f61160f856128ad565b90505f8061162083604001516129ad565b50915091508184604001511461164957604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561168057604051633ab3447f60e11b815260040160405180910390fd5b5050505b61168d8361213c565b50506116a560015f80516020614f2783398151915255565b5050565b5f80516020614f078339815191525f6116c1836128ad565b90505f806116d28360400151613436565b91509150806116f457604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461170e90614ae4565b90505f0361172f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561175557611755614717565b146117735760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061178b916144e0565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614ec78339815191526020526040808220815160e0810190925280545f80516020614ee783398151915293929190829060ff16600381111561186857611868614717565b600381111561187957611879614717565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156118f2576118f2614717565b14158015611913575060038151600381111561191057611910614717565b14155b156119315760405163f95c7fe160e01b815260040160405180910390fd5b5f61193f8260400151611b52565b905080606001516001600160401b03165f0361196e57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61199b846040015184606001518560800151612323565b6040518263ffffffff1660e01b81526004016119b79190614830565b6020604051808303815f875af11580156119d3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b239190614862565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614f078339815191529190611a3e90614ae4565b90505f03611a5f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611a8557611a85614717565b14611aa35760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611adc9190600401614b16565b6020604051808303815f875af1158015611af8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1c9190614862565b505050565b5f611b2a612386565b611b358233346135da565b9050611b4d60015f80516020614f2783398151915255565b919050565b611b5a614517565b5f8281525f80516020614f47833981519152602052604090819020815160e0810190925280545f80516020614f07833981519152929190829060ff166005811115611ba757611ba7614717565b6005811115611bb857611bb8614717565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c8c9190810190614bab565b9150915080611cae57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d159190614862565b825114611d355760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d615760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d70846040015161389e565b91509150818714611d9457604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614f47833981519152602052604081206002015481905f80516020614f0783398151915290600160801b90046001600160401b0316611de68582613a79565b5f611df087613c42565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e408a858b612323565b6040518263ffffffff1660e01b8152600401611e5c9190614830565b6020604051808303815f875af1158015611e78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e9c9190614862565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f80516020614ec78339815191526020526040808220815160e0810190925280545f80516020614ee783398151915293929190829060ff166003811115611f4257611f42614717565b6003811115611f5357611f53614717565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611fc982611b52565b90505f600382516005811115611fe157611fe1614717565b1480611fff5750600482516005811115611ffd57611ffd614717565b145b1561200f575060c081015161202c565b60028251600581111561202457612024614717565b036107a25750425b83608001516001600160401b0316816001600160401b03161161205157505050505050565b600385015460608501516001600160a01b039091169063778c06b59061207690611208565b60a085015160808801515f88815260088b01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa1580156120fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121219190614862565b5f968752600690950160205250506040909320919091555050565b5f8181525f80516020614ec78339815191526020526040808220815160e0810190925280545f80516020614ee783398151915293929190829060ff16600381111561218957612189614717565b600381111561219a5761219a614717565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156122c8575f8481526004870160205260409020546127109061227a90600160a01b900461ffff1685614aad565b6122849190614879565b915081866007015f8681526020019081526020015f205f8282546122a89190614a78565b909155506122b890508284614c7d565b90506122c885602001518261283c565b6122dd8560200151610b1e8760600151611208565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b61237a613cb7565b61238381613d02565b50565b5f80516020614f278339815191528054600119016123b757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ee783398151915290600160401b900461ffff9081169086161080612411575061271061ffff8616115b1561242f5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612461576040516302336bad60e51b815260040160405180910390fd5b80548310806124735750806001015483115b1561249157604051630103be3b60e21b815260040160405180910390fd5b825f61249c82610a3f565b90505f6124a98983613d70565b905060405180606001604052806124bd3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614f2783398151915255565b5f61256c614517565b5f80516020614f078339815191525f612584856128ad565b90505f806125958360400151613436565b9150915080156125b857604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156125e9576125e9614717565b60058111156125fa576125fa614717565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561266957612669614717565b1415801561268a575060018151600581111561268757612687614717565b14155b156126a85760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156126bd576126bd614717565b036126cb57600481526126d0565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561271557612715614717565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156127c9576127c9614717565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612888575f80fd5b505af1158015610c56573d5f803e3d5ffd5b6116a56001600160a01b0383168261415a565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612911573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129389190810190614bab565b915091508061295a57604051636b2f19e960e01b815260040160405180910390fd5b81511561297a5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156129a65760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146129d257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612a21576129e9816001614c7d565b6129f4906008614aad565b61ffff16868281518110612a0a57612a0a61490c565b016020015160f81c901b91909117906001016129d5565b5061ffff811615612a455760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612aa057612a5c816003614c7d565b612a67906008614aad565b63ffffffff1687612a79836002614a78565b81518110612a8957612a8961490c565b016020015160f81c901b9190911790600101612a48565b5063ffffffff8116600414612ac857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612b1d57612adf81601f614c7d565b612aea906008614aad565b88612af6836006614a78565b81518110612b0657612b0661490c565b016020015160f81c901b9190911790600101612acb565b505f805b6008811015612b7c57612b35816007614c7d565b612b40906008614aad565b6001600160401b031689612b55836026614a78565b81518110612b6557612b6561490c565b016020015160f81c901b9190911790600101612b21565b505f805b6008811015612bdb57612b94816007614c7d565b612b9f906008614aad565b6001600160401b03168a612bb483602e614a78565b81518110612bc457612bc461490c565b016020015160f81c901b9190911790600101612b80565b5091989097509095509350505050565b5f8151602614612c0e57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612c5d57612c25816001614c7d565b612c30906008614aad565b61ffff16848281518110612c4657612c4661490c565b016020015160f81c901b9190911790600101612c11565b5061ffff811615612c815760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612cdc57612c98816003614c7d565b612ca3906008614aad565b63ffffffff1685612cb5836002614a78565b81518110612cc557612cc561490c565b016020015160f81c901b9190911790600101612c84565b5063ffffffff811615612d0257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612d5757612d1981601f614c7d565b612d24906008614aad565b86612d30836006614a78565b81518110612d4057612d4061490c565b016020015160f81c901b9190911790600101612d05565b50949350505050565b60605f612d6f838301846148c7565b612d7b91506058614aad565b612d8690605c614a78565b6001600160401b03811115612d9d57612d9d61493e565b6040519080825280601f01601f191660200182016040528015612dc7576020820181803683370190505b5090505f5b6020811015612e1c5783358160208110612de857612de861490c565b1a60f81b828281518110612dfe57612dfe61490c565b60200101906001600160f81b03191690815f1a905350600101612dcc565b505f5b6020811015612e7c5783602001358160208110612e3e57612e3e61490c565b1a60f81b82612e4e836020614a78565b81518110612e5e57612e5e61490c565b60200101906001600160f81b03191690815f1a905350600101612e1f565b505f5b6004811015612edf57612e93816003614c7d565b612e9e906008614aad565b6014901c60f81b82612eb1836040614a78565b81518110612ec157612ec161490c565b60200101906001600160f81b03191690815f1a905350600101612e7f565b505f612ef160608501604086016148ac565b60601b90505f5b6014811015612f5157818160148110612f1357612f1361490c565b1a60f81b83612f23836044614a78565b81518110612f3357612f3361490c565b60200101906001600160f81b03191690815f1a905350600101612ef8565b505f612f6060608601866148c7565b905090505f5b6004811015612fcb57612f7a816003614c7d565b612f85906008614aad565b63ffffffff8316901c60f81b84612f9d836058614a78565b81518110612fad57612fad61490c565b60200101906001600160f81b03191690815f1a905350600101612f66565b505f5b612fdb60608701876148c7565b90508110156131ef575f612ff0826058614aad565b612ffb90605c614a78565b90505f5b60208110156130865761301560608901896148c7565b848181106130255761302561490c565b90506020028101906130379190614920565b3581602081106130495761304961490c565b1a60f81b866130588385614a78565b815181106130685761306861490c565b60200101906001600160f81b03191690815f1a905350600101612fff565b505f5b600881101561313b5761309d816007614c7d565b6130a8906008614aad565b6130b560608a018a6148c7565b858181106130c5576130c561490c565b90506020028101906130d79190614920565b6130e89060408101906020016146fe565b6001600160401b0316901c60f81b8682613103856020614a78565b61310d9190614a78565b8151811061311d5761311d61490c565b60200101906001600160f81b03191690815f1a905350600101613089565b505f5b60308110156131e55761315460608901896148c7565b848181106131645761316461490c565b90506020028101906131769190614920565b613184906040810190614c90565b828181106131945761319461490c565b9050013560f81c60f81b86828460286131ad9190614a78565b6131b79190614a78565b815181106131c7576131c761490c565b60200101906001600160f81b03191690815f1a90535060010161313e565b5050600101612fce565b5091949350505050565b613201614517565b5f8281525f80516020614f478339815191526020526040808220815160e0810190925280545f80516020614f0783398151915293929190829060ff16600581111561324e5761324e614717565b600581111561325f5761325f614717565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156132d1576132d1614717565b146132ef5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561333357613333614717565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133df8582611d9e565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461345a57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156134a957613471816001614c7d565b61347c906008614aad565b61ffff168582815181106134925761349261490c565b016020015160f81c901b919091179060010161345d565b5061ffff8116156134cd5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613528576134e4816003614c7d565b6134ef906008614aad565b63ffffffff1686613501836002614a78565b815181106135115761351161490c565b016020015160f81c901b91909117906001016134d0565b5063ffffffff811660031461355057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135a55761356781601f614c7d565b613572906008614aad565b8761357e836006614a78565b8151811061358e5761358e61490c565b016020015160f81c901b9190911790600101613553565b505f866026815181106135ba576135ba61490c565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614ee7833981519152816135f384610a3f565b90505f6135ff87611b52565b905061360a87612801565b61362757604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561363c5761363c614717565b1461365a5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161366b9190614ac4565b905083600201600a9054906101000a90046001600160401b031682604001516136949190614cd2565b6001600160401b0316816001600160401b031611156136c657604051630c192e7760e41b815260040160405180910390fd5b5f806136d28a84611d9e565b915091505f8a8360405160200161370092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561379357613793614717565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146138c257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613911576138d9816001614c7d565b6138e4906008614aad565b61ffff168582815181106138fa576138fa61490c565b016020015160f81c901b91909117906001016138c5565b5061ffff8116156139355760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156139905761394c816003614c7d565b613957906008614aad565b63ffffffff1686613969836002614a78565b815181106139795761397961490c565b016020015160f81c901b9190911790600101613938565b5063ffffffff81166005146139b857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a0d576139cf81601f614c7d565b6139da906008614aad565b876139e6836006614a78565b815181106139f6576139f661490c565b016020015160f81c901b91909117906001016139bb565b505f805b6008811015613a6c57613a25816007614c7d565b613a30906008614aad565b6001600160401b031688613a45836026614a78565b81518110613a5557613a5561490c565b016020015160f81c901b9190911790600101613a11565b5090969095509350505050565b5f80516020614f078339815191525f6001600160401b038084169085161115613aad57613aa683856147ee565b9050613aba565b613ab784846147ee565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613b1c575060018401548151613b18916001600160401b031690614a78565b8210155b15613b42576001600160401b038316606082015281815260408101516020820152613b61565b8281606001818151613b549190614ac4565b6001600160401b03169052505b6060810151613b71906064614cd2565b602082015160018601546001600160401b039290921691613b9c9190600160401b900460ff16614aad565b1015613bbb5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613bd69190614a78565b9052506040810180516001600160401b0387169190613bf6908390614c7d565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614f478339815191526020526040812060020180545f80516020614f078339815191529190600890613c8c90600160401b90046001600160401b0316614cfd565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d0057604051631afcd79f60e31b815260040160405180910390fd5b565b613d0a613cb7565b613d13816141f1565b613d1b61420a565b61238360608201356080830135613d3860c0850160a086016146fe565b613d4860e0860160c08701614d18565b613d59610100870160e08801614d31565b613d6b610120880161010089016148ac565b61421a565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613db457604051637fab81e560e01b815260040160405180910390fd5b5f80516020614f0783398151915242613dd360408601602087016146fe565b6001600160401b0316111580613e0d5750613df16202a30042614a78565b613e0160408601602087016146fe565b6001600160401b031610155b15613e2a5760405162d36c8560e81b815260040160405180910390fd5b6030613e396040860186614c90565b9050141580613e4757508335155b15613e655760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613e9557604051630eb0d31360e11b815260040160405180910390fd5b613e9f835f613a79565b5f80613f386040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ee391906146fe565b6001600160401b03168152602001613efe60408a018a614c90565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061433b565b5f82815260068601602052604090209193509150613f568282614d95565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613f94908590600401614830565b6020604051808303815f875af1158015613fb0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fd49190614862565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561404c5761404c614717565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161412c918e01908e016146fe565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156141815760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146141ca576040519150601f19603f3d011682016040523d82523d5f602084013e6141cf565b606091505b5050905080611b1c57604051630a12f52160e11b815260040160405180910390fd5b6141f9613cb7565b6142016143fe565b61238381614406565b614212613cb7565b613d006144d8565b614222613cb7565b5f80516020614ee783398151915261ffff84161580614246575061271061ffff8516115b156142645760405163c98d73a760e01b815260040160405180910390fd5b8587111561428557604051630103be3b60e21b815260040160405180910390fd5b60ff831615806142985750600a60ff8416115b156142b6576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461436457604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016143969796959493929190614e50565b60405160208183030381529060405290506002816040516143b79190614a67565b602060405180830381855afa1580156143d2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143f59190614862565b94909350915050565b613d00613cb7565b61440e613cb7565b80355f80516020614f0783398151915290815560146144336060840160408501614d31565b60ff161180614452575061444d6060830160408401614d31565b60ff16155b156144705760405163b4fa3fb360e01b815260040160405180910390fd5b6144806060830160408401614d31565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556144b160408301602084016146fe565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612550613cb7565b5080546144ec90614ae4565b5f825580601f106144fb575050565b601f0160209004905f5260205f20908101906123839190614553565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614567575f8155600101614554565b5090565b8015158114612383575f80fd5b803563ffffffff81168114611b4d575f80fd5b5f805f6060848603121561459d575f80fd5b8335925060208401356145af8161456b565b91506145bd60408501614578565b90509250925092565b5f602082840312156145d6575f80fd5b5035919050565b5f61012082840312156145ee575f80fd5b50919050565b803561ffff81168114611b4d575f80fd5b80356001600160401b0381168114611b4d575f80fd5b5f805f6060848603121561462d575f80fd5b83356001600160401b03811115614642575f80fd5b840160608187031215614653575f80fd5b9250614661602085016145f4565b91506145bd60408501614605565b5f6020828403121561467f575f80fd5b610a8282614578565b5f8060408385031215614699575f80fd5b6146a283614578565b946020939093013593505050565b5f80604083850312156146c1575f80fd5b82356001600160401b038111156146d6575f80fd5b8301608081860312156146e7575f80fd5b91506146f560208401614578565b90509250929050565b5f6020828403121561470e575f80fd5b610a8282614605565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061474e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161478960608401826001600160401b03169052565b5060808301516147a460808401826001600160401b03169052565b5060a08301516147bf60a08401826001600160401b03169052565b5060c08301516129a660c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156129a6576129a66147da565b5f5b83811015614828578181015183820152602001614810565b50505f910152565b602081525f825180602084015261484e81604085016020870161480e565b601f01601f19169190910160400192915050565b5f60208284031215614872575f80fd5b5051919050565b5f8261489357634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114612383575f80fd5b5f602082840312156148bc575f80fd5b8135610a8281614898565b5f808335601e198436030181126148dc575f80fd5b8301803591506001600160401b038211156148f5575f80fd5b6020019150600581901b3603821315611eee575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614934575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156149745761497461493e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156149a2576149a261493e565b604052919050565b5f6001600160401b038211156149c2576149c261493e565b50601f01601f191660200190565b5f606082360312156149e0575f80fd5b6149e8614952565b8235815260206149f9818501614605565b8183015260408401356001600160401b03811115614a15575f80fd5b840136601f820112614a25575f80fd5b8035614a38614a33826149aa565b61497a565b8181523684838501011115614a4b575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f825161493481846020870161480e565b80820180821115610a4f57610a4f6147da565b5f63ffffffff808316818103614aa357614aa36147da565b6001019392505050565b8082028115828204841417610a4f57610a4f6147da565b6001600160401b038181168382160190808211156129a6576129a66147da565b600181811c90821680614af857607f821691505b6020821081036145ee57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614b2881614ae4565b806020870152604060018084165f8114614b495760018114614b6557614b92565b60ff19851660408a0152604084151560051b8a01019550614b92565b895f5260205f205f5b85811015614b895781548b8201860152908301908801614b6e565b8a016040019650505b509398975050505050505050565b8051611b4d8161456b565b5f8060408385031215614bbc575f80fd5b82516001600160401b0380821115614bd2575f80fd5b9084019060608287031215614be5575f80fd5b614bed614952565b82518152602080840151614c0081614898565b82820152604084015183811115614c15575f80fd5b80850194505087601f850112614c29575f80fd5b83519250614c39614a33846149aa565b8381528882858701011115614c4c575f80fd5b614c5b8483830184880161480e565b80604084015250819550614c70818801614ba0565b9450505050509250929050565b81810381811115610a4f57610a4f6147da565b5f808335601e19843603018112614ca5575f80fd5b8301803591506001600160401b03821115614cbe575f80fd5b602001915036819003821315611eee575f80fd5b6001600160401b03818116838216028082169190828114614cf557614cf56147da565b505092915050565b5f6001600160401b03808316818103614aa357614aa36147da565b5f60208284031215614d28575f80fd5b610a82826145f4565b5f60208284031215614d41575f80fd5b813560ff81168114610a82575f80fd5b601f821115611b1c57805f5260205f20601f840160051c81016020851015614d765750805b601f840160051c820191505b81811015610b23575f8155600101614d82565b81516001600160401b03811115614dae57614dae61493e565b614dc281614dbc8454614ae4565b84614d51565b602080601f831160018114614df5575f8415614dde5750858301515b5f19600386901b1c1916600185901b178555610c56565b5f85815260208120601f198616915b82811015614e2357888601518255948401946001909101908401614e04565b5085821015614e4057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614ea581604e86016020890161480e565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -1609,140 +1609,6 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseDelega return event, nil } -// NativeTokenStakingManagerGeoffEventIterator is returned from FilterGeoffEvent and is used to iterate over the raw logs and unpacked data for GeoffEvent events raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerGeoffEventIterator struct { - Event *NativeTokenStakingManagerGeoffEvent // Event containing the contract specifics and raw log - - contract *bind.BoundContract // Generic contract to use for unpacking event data - event string // Event name to use for unpacking event data - - logs chan types.Log // Log channel receiving the found contract events - sub interfaces.Subscription // Subscription for errors, completion and termination - done bool // Whether the subscription completed delivering logs - fail error // Occurred error to stop iteration -} - -// Next advances the iterator to the subsequent event, returning whether there -// are any more events found. In case of a retrieval or parsing error, false is -// returned and Error() can be queried for the exact failure. -func (it *NativeTokenStakingManagerGeoffEventIterator) Next() bool { - // If the iterator failed, stop iterating - if it.fail != nil { - return false - } - // If the iterator completed, deliver directly whatever's available - if it.done { - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerGeoffEvent) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - default: - return false - } - } - // Iterator still in progress, wait for either a data or an error event - select { - case log := <-it.logs: - it.Event = new(NativeTokenStakingManagerGeoffEvent) - if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { - it.fail = err - return false - } - it.Event.Raw = log - return true - - case err := <-it.sub.Err(): - it.done = true - it.fail = err - return it.Next() - } -} - -// Error returns any retrieval or parsing error occurred during filtering. -func (it *NativeTokenStakingManagerGeoffEventIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *NativeTokenStakingManagerGeoffEventIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// NativeTokenStakingManagerGeoffEvent represents a GeoffEvent event raised by the NativeTokenStakingManager contract. -type NativeTokenStakingManagerGeoffEvent struct { - Val uint64 - Raw types.Log // Blockchain specific contextual infos -} - -// FilterGeoffEvent is a free log retrieval operation binding the contract event 0x108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e6. -// -// Solidity: event GeoffEvent(uint64 val) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterGeoffEvent(opts *bind.FilterOpts) (*NativeTokenStakingManagerGeoffEventIterator, error) { - - logs, sub, err := _NativeTokenStakingManager.contract.FilterLogs(opts, "GeoffEvent") - if err != nil { - return nil, err - } - return &NativeTokenStakingManagerGeoffEventIterator{contract: _NativeTokenStakingManager.contract, event: "GeoffEvent", logs: logs, sub: sub}, nil -} - -// WatchGeoffEvent is a free log subscription operation binding the contract event 0x108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e6. -// -// Solidity: event GeoffEvent(uint64 val) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchGeoffEvent(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerGeoffEvent) (event.Subscription, error) { - - logs, sub, err := _NativeTokenStakingManager.contract.WatchLogs(opts, "GeoffEvent") - if err != nil { - return nil, err - } - return event.NewSubscription(func(quit <-chan struct{}) error { - defer sub.Unsubscribe() - for { - select { - case log := <-logs: - // New log arrived, parse the event and forward to the user - event := new(NativeTokenStakingManagerGeoffEvent) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "GeoffEvent", log); err != nil { - return err - } - event.Raw = log - - select { - case sink <- event: - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - case err := <-sub.Err(): - return err - case <-quit: - return nil - } - } - }), nil -} - -// ParseGeoffEvent is a log parse operation binding the contract event 0x108523a49a8e0fd347895dc7931dace35b698ccef4a16f247acf341566df59e6. -// -// Solidity: event GeoffEvent(uint64 val) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseGeoffEvent(log types.Log) (*NativeTokenStakingManagerGeoffEvent, error) { - event := new(NativeTokenStakingManagerGeoffEvent) - if err := _NativeTokenStakingManager.contract.UnpackLog(event, "GeoffEvent", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // NativeTokenStakingManagerInitialValidatorCreatedIterator is returned from FilterInitialValidatorCreated and is used to iterate over the raw logs and unpacked data for InitialValidatorCreated events raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerInitialValidatorCreatedIterator struct { Event *NativeTokenStakingManagerInitialValidatorCreated // Event containing the contract specifics and raw log diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 9f2a5c3b4..a0cbee59c 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -73,8 +73,6 @@ abstract contract PoSValidatorManager is uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; - event GeoffEvent(uint64 val); - error InvalidDelegatorStatus(); error InvalidNonce(); error InvalidDelegationID(); @@ -467,9 +465,6 @@ abstract contract PoSValidatorManager is revert InvalidValidatorStatus(); } - emit GeoffEvent(delegationEndTime); - emit GeoffEvent(delegator.startedAt); - // Only give rewards in the case that the delegation started before the validator exited. if (delegationEndTime <= delegator.startedAt) { return; From 81edf430bc13d05b38cdff75b8ff60b748f22e5e Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 25 Sep 2024 11:46:08 -0400 Subject: [PATCH 413/545] Refactor tests --- .../tests/PoSValidatorManagerTests.t.sol | 494 +++++++----------- .../tests/ValidatorManagerTests.t.sol | 117 ++--- 2 files changed, 237 insertions(+), 374 deletions(-) diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index f4dbfc027..375274781 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -151,27 +151,15 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInvalidInitializeEndTime() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + bytes32 validationID = _registerDefaultValidator(); + vm.expectRevert(PoSValidatorManager.InvalidStakeDuration.selector); posValidatorManager.initializeEndValidation(validationID, false, 0); } function testInvalidUptimeWarpMessage() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + bytes32 validationID = _registerDefaultValidator(); + _mockGetUptimeWarpMessage(new bytes(0), false); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); vm.expectRevert(ValidatorManager.InvalidWarpMessage.selector); @@ -179,14 +167,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInvalidUptimeChainID() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + bytes32 validationID = _registerDefaultValidator(); _mockGetUptimeWarpMessage(new bytes(0), true); _mockGetBlockchainID(posValidatorManager.P_CHAIN_BLOCKCHAIN_ID()); @@ -196,14 +177,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInvalidUptimeSenderAddress() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + bytes32 validationID = _registerDefaultValidator(); _mockGetBlockchainID(); vm.mockCall( @@ -228,14 +202,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInvalidUptimeValidationID() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + bytes32 validationID = _registerDefaultValidator(); _mockGetBlockchainID(); vm.mockCall( @@ -260,14 +227,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInitializeDelegatorRegistration() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + bytes32 validationID = _registerDefaultValidator(); + _setUpInitializeDelegatorRegistration({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, @@ -279,14 +240,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testResendDelegatorRegistration() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, @@ -304,40 +259,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteDelegatorRegistration() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); - bytes32 delegationID = _setUpInitializeDelegatorRegistration({ - validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, - weight: DEFAULT_DELEGATOR_WEIGHT, - registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 - }); - _setUpCompleteDelegatorRegistration( - validationID, - delegationID, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + bytes32 validationID = _registerDefaultValidator(); + + _registerDefaultDelegator(validationID); } function testCompleteDelegatorRegistrationWrongNonce() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + bytes32 validationID = _registerDefaultValidator(); + // Initialize two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; _setUpInitializeDelegatorRegistration({ @@ -373,14 +302,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteDelegatorRegistrationImplicitNonce() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + bytes32 validationID = _registerDefaultValidator(); + // Initialize two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ @@ -412,44 +335,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInitializeEndValidationNotOwner() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + bytes32 validationID = _registerDefaultValidator(); + vm.prank(address(1)); vm.expectRevert(ValidatorManager.InvalidAddress.selector); posValidatorManager.initializeEndValidation(validationID, false, 0); } function testInitializeEndDelegation() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); - bytes32 delegationID = _setUpInitializeDelegatorRegistration({ - validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, - weight: DEFAULT_DELEGATOR_WEIGHT, - registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 - }); - _setUpCompleteDelegatorRegistration( - validationID, - delegationID, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); - _setUpInitializeEndDelegation({ + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, @@ -461,30 +358,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testResendEndDelegation() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); - bytes32 delegationID = _setUpInitializeDelegatorRegistration({ - validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, - weight: DEFAULT_DELEGATOR_WEIGHT, - registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 - }); - _setUpCompleteDelegatorRegistration( - validationID, - delegationID, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); - _setUpInitializeEndDelegation({ + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, @@ -500,16 +377,15 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testResendEndValidation() public override { - bytes32 validationID = _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + bytes32 validationID = _registerDefaultValidator(); + _initializeEndValidation({ + validationID: validationID, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + expectedNonce: 1, includeUptime: true }); + bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); @@ -517,32 +393,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndDelegation() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); - bytes32 delegationID = _setUpInitializeDelegatorRegistration({ - validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, - weight: DEFAULT_DELEGATOR_WEIGHT, - registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 - }); - _setUpCompleteDelegatorRegistration({ - validationID: validationID, - delegationID: delegationID, - completeRegistrationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 1 - }); + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + uint64 delgationEndTime = DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; - _setUpInitializeEndDelegation({ + _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, @@ -562,16 +418,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endSupply: 0 }); - uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; - uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; - - _setUpCompleteEndDelegation({ + _completeEndDelegationWithChecks({ validationID: validationID, delegationID: delegationID, delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedReward: expectedDelegatorReward, - expectedFees: expectedValidatorFees, + expectedTotalReward: expectedTotalReward, + delegationFeeBips: DEFAULT_DELEGATION_FEE_BIPS, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 @@ -579,51 +432,32 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndDelegationWrongNonce() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + bytes32 validationID = _registerDefaultValidator(); // Register two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID1 = _registerDelegator({ validationID: validationID, delegatorAddress: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, - registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + initRegistrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + completeRegistrationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); - _setUpCompleteDelegatorRegistration( - validationID, - delegationID1, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + address delegator2 = address(0x5678567856785678567856785678567856785678); - bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID2 = _registerDelegator({ validationID: validationID, delegatorAddress: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, - registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, - expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT - + DEFAULT_WEIGHT, + initRegistrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, + completeRegistrationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT * 2 + DEFAULT_WEIGHT, expectedNonce: 2 }); - _setUpCompleteDelegatorRegistration( - validationID, - delegationID2, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 2 - ); // Initialize end delegation for both delegators - _setUpInitializeEndDelegation({ + _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, delegatorAddress: delegator1, delegationID: delegationID1, @@ -632,7 +466,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 3 }); - _setUpInitializeEndDelegation({ + _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, delegatorAddress: delegator2, delegationID: delegationID2, @@ -655,51 +489,33 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndDelegationImplicitNonce() public { - bytes32 validationID = _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + bytes32 validationID = _registerDefaultValidator(); + // Register two delegations address delegator1 = DEFAULT_DELEGATOR_ADDRESS; - bytes32 delegationID1 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID1 = _registerDelegator({ validationID: validationID, delegatorAddress: delegator1, weight: DEFAULT_DELEGATOR_WEIGHT, - registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + initRegistrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + completeRegistrationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); - _setUpCompleteDelegatorRegistration( - validationID, - delegationID1, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 1 - ); + address delegator2 = address(0x5678567856785678567856785678567856785678); - bytes32 delegationID2 = _setUpInitializeDelegatorRegistration({ + bytes32 delegationID2 = _registerDelegator({ validationID: validationID, delegatorAddress: delegator2, weight: DEFAULT_DELEGATOR_WEIGHT, - registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, - expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT - + DEFAULT_WEIGHT, + initRegistrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1, + completeRegistrationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT * 2 + DEFAULT_WEIGHT, expectedNonce: 2 }); - _setUpCompleteDelegatorRegistration( - validationID, - delegationID2, - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - DEFAULT_DELEGATOR_WEIGHT + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - 2 - ); // Initialize end delegation for both delegators - _setUpInitializeEndDelegation({ + _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, delegatorAddress: delegator1, delegationID: delegationID1, @@ -708,7 +524,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 3 }); - _setUpInitializeEndDelegation({ + _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, delegatorAddress: delegator2, delegationID: delegationID2, @@ -728,17 +544,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endSupply: 0 }); - uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; - uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; - // Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce) - _setUpCompleteEndDelegation({ + _completeEndDelegationWithChecks({ validationID: validationID, delegationID: delegationID1, delegator: DEFAULT_DELEGATOR_ADDRESS, delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, - expectedReward: expectedDelegatorReward, - expectedFees: expectedValidatorFees, + expectedTotalReward: expectedTotalReward, + delegationFeeBips: DEFAULT_DELEGATION_FEE_BIPS, validatorWeight: DEFAULT_WEIGHT, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 4 @@ -746,14 +559,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testCompleteEndValidation() public virtual override { - bytes32 validationID = _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + bytes32 validationID = _registerDefaultValidator(); + _initializeEndValidation({ + validationID: validationID, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + expectedNonce: 1, includeUptime: true }); @@ -767,7 +578,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endSupply: 0 }); - _setUpCompleteEndValidation({ + _completeEndValidationWithChecks({ validationID: validationID, validatorOwner: address(this), expectedReward: expectedReward, @@ -776,14 +587,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInitializeEndValidation() public virtual override { - _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + bytes32 validationID = _registerDefaultValidator(); + _initializeEndValidation({ + validationID: validationID, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + expectedNonce: 1, includeUptime: true }); } @@ -866,7 +675,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 completeRegistrationTimestamp, uint64 expectedValidatorWeight, uint64 expectedNonce - ) internal returns (bytes32) { + ) internal { bytes memory setValidatorWeightPayload = ValidatorMessages .packSubnetValidatorWeightUpdateMessage( validationID, expectedNonce, expectedValidatorWeight @@ -882,10 +691,51 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { startTime: completeRegistrationTimestamp }); posValidatorManager.completeDelegatorRegistration(0, delegationID); + } + + function _registerDefaultDelegator(bytes32 validationID) + internal + returns (bytes32 delegationID) + { + return _registerDelegator({ + validationID: validationID, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + weight: DEFAULT_DELEGATOR_WEIGHT, + initRegistrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + completeRegistrationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); + } + + function _registerDelegator( + bytes32 validationID, + address delegatorAddress, + uint64 weight, + uint64 initRegistrationTimestamp, + uint64 completeRegistrationTimestamp, + uint64 expectedValidatorWeight, + uint64 expectedNonce + ) internal returns (bytes32) { + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegatorAddress: delegatorAddress, + weight: weight, + registrationTimestamp: initRegistrationTimestamp, + expectedValidatorWeight: expectedValidatorWeight, + expectedNonce: expectedNonce + }); + _setUpCompleteDelegatorRegistration( + validationID, + delegationID, + completeRegistrationTimestamp, + expectedValidatorWeight, + expectedNonce + ); return delegationID; } - function _setUpInitializeEndDelegation( + function _initializeEndDelegationValidatorActiveWithChecks( bytes32 validationID, address delegatorAddress, bytes32 delegationID, @@ -893,17 +743,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 endDelegationTimestamp, uint64 expectedValidatorWeight, uint64 expectedNonce - ) internal returns (bytes32) { - vm.warp(endDelegationTimestamp); - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, expectedNonce, expectedValidatorWeight); - _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); - bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( - validationID, endDelegationTimestamp - startDelegationTimestamp - ); - _mockGetUptimeWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(); - + ) internal { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit ValidatorWeightUpdate({ validationID: validationID, @@ -911,6 +751,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validatorWeight: expectedValidatorWeight, setWeightMessageID: bytes32(0) }); + vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorRemovalInitialized({ delegationID: delegationID, @@ -918,22 +759,54 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { endTime: endDelegationTimestamp }); + _initializeEndDelegationValidatorActive({ + validationID: validationID, + delegatorAddress: delegatorAddress, + delegationID: delegationID, + startDelegationTimestamp: startDelegationTimestamp, + endDelegationTimestamp: endDelegationTimestamp, + expectedValidatorWeight: expectedValidatorWeight, + expectedNonce: expectedNonce + }); + } + + function _initializeEndDelegationValidatorActive( + bytes32 validationID, + address delegatorAddress, + bytes32 delegationID, + uint64 startDelegationTimestamp, + uint64 endDelegationTimestamp, + uint64 expectedValidatorWeight, + uint64 expectedNonce + ) internal { + bytes memory setValidatorWeightPayload = ValidatorMessages + .packSetSubnetValidatorWeightMessage(validationID, expectedNonce, expectedValidatorWeight); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( + validationID, endDelegationTimestamp - startDelegationTimestamp + ); + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); + + _initializeEndDelegation(delegatorAddress, delegationID, endDelegationTimestamp); + } + + function _initializeEndDelegation( + address delegatorAddress, + bytes32 delegationID, + uint64 endDelegationTimestamp + ) internal { + vm.warp(endDelegationTimestamp); vm.prank(delegatorAddress); posValidatorManager.initializeEndDelegation(delegationID, true, 0); - return delegationID; } - function _setUpCompleteEndValidation( + function _completeEndValidationWithChecks( bytes32 validationID, address validatorOwner, uint256 expectedReward, uint64 validatorWeight ) internal { - bytes memory subnetValidatorRegistrationMessage = - ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); - - _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); - vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit ValidationPeriodEnded(validationID, ValidatorStatus.Completed); uint256 balanceBefore = _getStakeAssetBalance(validatorOwner); @@ -941,7 +814,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _expectStakeUnlock(validatorOwner, _weightToValue(validatorWeight)); _expectRewardIssuance(validatorOwner, expectedReward); - posValidatorManager.completeEndValidation(0); + _completeEndValidation(validationID); assertEq( _getStakeAssetBalance(validatorOwner), @@ -949,37 +822,58 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); } - function _setUpCompleteEndDelegation( + function _completeEndValidation(bytes32 validationID) internal { + bytes memory subnetValidatorRegistrationMessage = + ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); + _mockGetPChainWarpMessage(subnetValidatorRegistrationMessage, true); + + posValidatorManager.completeEndValidation(0); + } + + function _completeEndDelegationWithChecks( bytes32 validationID, bytes32 delegationID, address delegator, uint64 delegatorWeight, - uint256 expectedReward, - uint256 expectedFees, + uint256 expectedTotalReward, + uint64 delegationFeeBips, uint64 validatorWeight, uint64 expectedValidatorWeight, uint64 expectedNonce - ) internal returns (bytes32) { - bytes memory weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( - validationID, expectedNonce, validatorWeight - ); - _mockGetPChainWarpMessage(weightUpdateMessage, true); + ) internal { + uint256 expectedValidatorFees = expectedTotalReward * delegationFeeBips / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; vm.expectEmit(true, true, true, true, address(posValidatorManager)); - emit DelegationEnded(delegationID, validationID, expectedReward, expectedFees); + emit DelegationEnded( + delegationID, validationID, expectedDelegatorReward, expectedValidatorFees + ); uint256 balanceBefore = _getStakeAssetBalance(delegator); _expectStakeUnlock(delegator, _weightToValue(delegatorWeight)); - _expectRewardIssuance(delegator, expectedReward); + _expectRewardIssuance(delegator, expectedDelegatorReward); - posValidatorManager.completeEndDelegation(0, delegationID); + _completeEndDelegation(validationID, delegationID, validatorWeight, expectedNonce); assertEq(posValidatorManager.getWeight(validationID), expectedValidatorWeight); assertEq( _getStakeAssetBalance(delegator), - balanceBefore + _weightToValue(delegatorWeight) + expectedReward + balanceBefore + _weightToValue(delegatorWeight) + expectedDelegatorReward ); - return delegationID; + } + + function _completeEndDelegation( + bytes32 validationID, + bytes32 delegationID, + uint64 validatorWeight, + uint64 expectedNonce + ) internal { + bytes memory weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( + validationID, expectedNonce, validatorWeight + ); + _mockGetPChainWarpMessage(weightUpdateMessage, true); + + posValidatorManager.completeEndDelegation(0, delegationID); } function _getStakeAssetBalance(address account) internal virtual returns (uint256); diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index 373acd357..49204750e 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -125,38 +125,30 @@ abstract contract ValidatorManagerTest is Test { } function testCompleteValidatorRegistration() public { - _setUpCompleteValidatorRegistration({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, - registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP - }); + _registerDefaultValidator(); } function testInitializeEndValidation() public virtual { - _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + bytes32 validationID = _registerDefaultValidator(); + _initializeEndValidation({ + validationID: validationID, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + expectedNonce: 1, + includeUptime: false }); } function testResendEndValidation() public virtual { - bytes32 validationID = _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + bytes32 validationID = _registerDefaultValidator(); + _initializeEndValidation({ + validationID: validationID, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + expectedNonce: 1, + includeUptime: false }); + bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); @@ -164,15 +156,15 @@ abstract contract ValidatorManagerTest is Test { } function testCompleteEndValidation() public virtual { - bytes32 validationID = _setUpInitializeEndValidation({ - nodeID: DEFAULT_NODE_ID, - subnetID: DEFAULT_SUBNET_ID, - weight: DEFAULT_WEIGHT, - registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + bytes32 validationID = _registerDefaultValidator(); + _initializeEndValidation({ + validationID: validationID, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, - completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + expectedNonce: 1, + includeUptime: false }); + bytes memory subnetValidatorRegistrationMessage = ValidatorMessages.packSubnetValidatorRegistrationMessage(validationID, false); @@ -209,7 +201,7 @@ abstract contract ValidatorManagerTest is Test { _beforeSend(_weightToValue(churnThreshold), address(this)); // First registration should succeed - _setUpCompleteValidatorRegistration({ + _registerValidator({ nodeID: _newNodeID(), subnetID: DEFAULT_SUBNET_ID, weight: churnThreshold, @@ -234,7 +226,7 @@ abstract contract ValidatorManagerTest is Test { function testCummulativeChurnRegistrationAndEndValidation() public { // Registration should succeed - bytes32 validationID = _setUpCompleteValidatorRegistration({ + bytes32 validationID = _registerValidator({ nodeID: DEFAULT_NODE_ID, subnetID: DEFAULT_SUBNET_ID, weight: _valueToWeight(DEFAULT_MINIMUM_STAKE_AMOUNT), @@ -248,7 +240,7 @@ abstract contract ValidatorManagerTest is Test { _beforeSend(_weightToValue(churnThreshold), address(this)); // Registration should succeed - _setUpCompleteValidatorRegistration({ + _registerValidator({ nodeID: _newNodeID(), subnetID: DEFAULT_SUBNET_ID, weight: churnThreshold, @@ -310,7 +302,7 @@ abstract contract ValidatorManagerTest is Test { ); } - function _setUpCompleteValidatorRegistration( + function _registerValidator( bytes32 nodeID, bytes32 subnetID, uint64 weight, @@ -333,50 +325,17 @@ abstract contract ValidatorManagerTest is Test { validatorManager.completeValidatorRegistration(0); } - function _setUpInitializeEndValidation( - bytes32 nodeID, - bytes32 subnetID, - uint64 weight, - uint64 registrationExpiry, - bytes memory blsPublicKey, - uint64 registrationTimestamp, - uint64 completionTimestamp - ) internal returns (bytes32 validationID) { - return _setUpInitializeEndValidation({ - nodeID: nodeID, - subnetID: subnetID, - weight: weight, - registrationExpiry: registrationExpiry, - blsPublicKey: blsPublicKey, - registrationTimestamp: registrationTimestamp, - completionTimestamp: completionTimestamp, - includeUptime: false - }); - } - - function _setUpInitializeEndValidation( - bytes32 nodeID, - bytes32 subnetID, - uint64 weight, - uint64 registrationExpiry, - bytes memory blsPublicKey, + function _initializeEndValidation( + bytes32 validationID, uint64 registrationTimestamp, uint64 completionTimestamp, + uint64 expectedNonce, bool includeUptime - ) internal returns (bytes32 validationID) { - validationID = _setUpCompleteValidatorRegistration({ - nodeID: nodeID, - subnetID: subnetID, - weight: weight, - registrationExpiry: registrationExpiry, - blsPublicKey: blsPublicKey, - registrationTimestamp: registrationTimestamp - }); - - vm.warp(completionTimestamp); + ) internal { bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, expectedNonce, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + if (includeUptime) { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, completionTimestamp - registrationTimestamp @@ -384,12 +343,22 @@ abstract contract ValidatorManagerTest is Test { _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); } - vm.expectEmit(true, true, true, true, address(validatorManager)); - emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); + vm.warp(completionTimestamp); _initializeEndValidation(validationID, includeUptime); } + function _registerDefaultValidator() internal returns (bytes32 validationID) { + return _registerValidator({ + nodeID: DEFAULT_NODE_ID, + subnetID: DEFAULT_SUBNET_ID, + weight: DEFAULT_WEIGHT, + registrationExpiry: DEFAULT_EXPIRY, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + }); + } + function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { vm.mockCall( WARP_PRECOMPILE_ADDRESS, From 98ff484bddf57587f0d9250bdabda8e0d5b392ba Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 25 Sep 2024 14:06:35 -0400 Subject: [PATCH 414/545] errors with params and storage slot tests --- .../ERC20TokenStakingManager.go | 4 +- .../NativeTokenStakingManager.go | 4 +- .../PoAValidatorManager.go | 4 +- .../ERC20TokenStakingManager.sol | 4 +- .../validator-manager/PoSValidatorManager.sol | 38 +++++++++--------- .../validator-manager/ValidatorManager.sol | 39 ++++++++++--------- .../validator-manager/ValidatorMessages.sol | 2 +- .../interfaces/IValidatorManager.sol | 2 +- .../tests/ERC20TokenStakingManagerTests.t.sol | 7 ++++ .../tests/PoSValidatorManagerTests.t.sol | 17 ++++++-- .../tests/ValidatorManagerTests.t.sol | 33 ++++++++++++++-- 11 files changed, 99 insertions(+), 55 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6f9461ea6..d9e119994 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -82,8 +82,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161568e38038061568e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6155418061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd366004614a7e565b61043a565b005b6101d26101e2366004614ab9565b6107e1565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b610219610214366004614ab9565b610953565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004614ad0565b610969565b6101d261026e366004614ae9565b610a0a565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004614b11565b610de2565b6102b66102b1366004614b75565b611266565b6040519081526020016101fd565b6102196102d2366004614ab9565b61127f565b6102b65f81565b6101d26102ec366004614a7e565b611293565b6101ef603081565b6101d2610307366004614ab9565b61145e565b6101d261031a366004614ae9565b611519565b6101d261032d366004614ab9565b6116b9565b6102b6610340366004614b8e565b611930565b6101d2610353366004614ad0565b61195c565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c366004614ab9565b611ace565b6101d261039f366004614ab9565b611caa565b6101ef601481565b6103bf6103ba366004614ab9565b611dd4565b6040516101fd9190614bc2565b6102196202a30081565b6102b66103e4366004614ab9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004614c82565b611e9c565b6101d2610435366004614cfb565b611ed1565b5f8381525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff16600381111561048757610487614bae565b600381111561049857610498614bae565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61050e82611dd4565b905060028351600381111561052557610525614bae565b146105435760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105705760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f8060028351600581111561058e5761058e614bae565b036105df5787156105a6576105a38488611fb0565b91505b5f856060015184608001516105bb9190614d4d565b90506105c78582612134565b506001600160401b031660c087015250429050610611565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b59061063690611266565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106669796959493929190614d6d565b602060405180830381865afa158015610681573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a59190614dab565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff191660018360038111156106e4576106e4614bae565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906107ce9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206155158339815191526020526040808220815160e0810190925280545f805160206154d583398151915293929190829060ff16600581111561082e5761082e614bae565b600581111561083f5761083f614bae565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108ae576108ae614bae565b146108cc5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6108f18584606001515f61228b565b6040518263ffffffff1660e01b815260040161090d9190614de4565b6020604051808303815f875af1158015610929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094d9190614dab565b50505050565b5f61096364e8d4a5100083614e16565b92915050565b5f805160206154b58339815191525f80610982846122e2565b9150915061098f82612580565b6109995750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156109c8576109c8614bae565b036109ed575f838152600785016020526040812080549190556109eb82826125bb565b505b610a03816109fe8460400151611266565b612631565b5050505050565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff166003811115610a5757610a57614bae565b6003811115610a6857610a68614bae565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610adf90611dd4565b905060015f85815260058501602052604090205460ff166003811115610b0757610b07614bae565b14610b255760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610b3a57610b3a614bae565b03610c8357600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610b9457610b94614bae565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610c9857610c98614bae565b03610ca657610a0384612654565b5f610cb086612831565b90505f80610cc18360400151612931565b509150915081856040015114610cea57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610d3257505f8781526005870160205260409020600201546001600160401b03808316600160801b90920416115b15610d5057604051633ab3447f60e11b815260040160405180910390fd5b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206154d58339815191529060ff1615610e3457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9b9190614dab565b836020013514610ebe5760405163d040949d60e01b815260040160405180910390fd5b30610ecf6060850160408601614e35565b6001600160a01b031614610ef65760405163e6c4247b60e01b815260040160405180910390fd5b5f610f046060850185614e50565b905090505f805b828163ffffffff1610156111b0575f610f276060880188614e50565b8363ffffffff16818110610f3d57610f3d614e95565b9050602002810190610f4f9190614ea9565b610f5890614f59565b80515f8181526008880160205260409020549192509015610f8c57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610fbb92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610fd591614ff0565b602060405180830381855afa158015610ff0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110139190614dab565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561109f5761109f614bae565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611152911686615001565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806111a990615014565b9050610f0b565b50600483018190555f6111c285612831565b90505f6111d28260400151612b6f565b90505f6111de88612ce4565b9050816002826040516111f19190614ff0565b602060405180830381855afa15801561120c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061122f9190614dab565b1461124d57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6109636001600160401b03831664e8d4a51000615036565b5f61128982611dd4565b6080015192915050565b5f805160206154b58339815191525f6112ab8561317d565b90506112b685612580565b6112c1575050505050565b5f8581526004830160205260409020546001600160a01b031633146112f95760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161132891600160b01b90046001600160401b03169061504d565b6001600160401b03168160c001516001600160401b0316101561135e576040516302336bad60e51b815260040160405180910390fd5b8315610a03575f61136f8685611fb0565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906113bf90611266565b60a085015160c08601516040516001600160e01b031960e086901b1681526113f3939291829188905f908190600401614d6d565b602060405180830381865afa15801561140e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114329190614dab565b5f87815260078501602052604081208054909190611451908490615001565b9091555050505050505050565b5f805160206154b58339815191525f61147683611dd4565b905060048151600581111561148d5761148d614bae565b146114ab5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114e35760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461094d906001600160a01b0316826125bb565b6115216133ba565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff16600381111561156e5761156e614bae565b600381111561157f5761157f614bae565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f6115ed85612831565b90505f806115fe8360400151612931565b50915091508184604001511461162757604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561165e57604051633ab3447f60e11b815260040160405180910390fd5b60038451600381111561167357611673614bae565b146116915760405163f95c7fe160e01b815260040160405180910390fd5b61169a86612654565b50505050506116b560015f805160206154f583398151915255565b5050565b6116c16133ba565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff16600381111561170e5761170e614bae565b600381111561171f5761171f614bae565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61179582611dd4565b90505f835160038111156117ab576117ab614bae565b036117c957604051631d0b665760e21b815260040160405180910390fd5b6004815160058111156117de576117de614bae565b146117fc5760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561181157611811614bae565b036118285761181f85612654565b50505050611917565b60028351600381111561183d5761183d614bae565b0361190957600384015460608401516001600160a01b039091169063778c06b59061186790611266565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b1681526118b996959493926001600160401b0390921691908190600401614d6d565b602060405180830381865afa1580156118d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f89190614dab565b5f8681526006860160205260409020555b61191285612654565b505050505b61192d60015f805160206154f583398151915255565b50565b5f6119396133ba565b611944833384613404565b905061096360015f805160206154f583398151915255565b5f805160206154d58339815191525f61197483612831565b90505f8061198583604001516136cb565b91509150806119a757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546119c19061506d565b90505f036119e257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115611a0857611a08614bae565b14611a265760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120611a3e916149ce565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff166003811115611b1b57611b1b614bae565b6003811115611b2c57611b2c614bae565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611ba557611ba5614bae565b14158015611bc65750600381516003811115611bc357611bc3614bae565b14155b15611be45760405163f95c7fe160e01b815260040160405180910390fd5b5f611bf28260400151611dd4565b905080606001516001600160401b03165f03611c2157604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611c4e84604001518460600151856080015161228b565b6040518263ffffffff1660e01b8152600401611c6a9190614de4565b6020604051808303815f875af1158015611c86573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a039190614dab565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206154d58339815191529190611cf19061506d565b90505f03611d1257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611d3857611d38614bae565b14611d565760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d8f91906004016150a5565b6020604051808303815f875af1158015611dab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dcf9190614dab565b505050565b611ddc614a05565b5f8281525f80516020615515833981519152602052604090819020815160e0810190925280545f805160206154d5833981519152929190829060ff166005811115611e2957611e29614bae565b6005811115611e3a57611e3a614bae565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611ea56133ba565b611eb18585858561386f565b9050611ec960015f805160206154f583398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611f1a575080546001600160401b03808416911610155b15611f385760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611f638484613a0d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ffb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612022919081019061513a565b915091508061204457604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612087573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ab9190614dab565b8251146120cb5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156120f75760405163e6c4247b60e01b815260040160405180910390fd5b5f806121068460400151613a27565b9150915081871461212a57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615515833981519152602052604081206002015481905f805160206154d583398151915290600160801b90046001600160401b031661217c8582613c02565b5f61218687613dcb565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6121d68a858b61228b565b6040518263ffffffff1660e01b81526004016121f29190614de4565b6020604051808303815f875af115801561220e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122329190614dab565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6122eb614a05565b5f805160206154d58339815191525f61230385612831565b90505f8061231483604001516136cb565b91509150801561233757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561236857612368614bae565b600581111561237957612379614bae565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156123e8576123e8614bae565b14158015612409575060018151600581111561240657612406614bae565b14155b156124275760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561243c5761243c614bae565b0361244a576004815261244f565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561249457612494614bae565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561254857612548614bae565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061549583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612616575f80fd5b505af1158015612628573d5f803e3d5ffd5b50505050505050565b5f80516020615495833981519152546116b5906001600160a01b03168383613e40565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff1660038111156126a1576126a1614bae565b60038111156126b2576126b2614bae565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687018252828120805490829055848252600488019092529182205493945091926127109061278790600160a01b900461ffff1684615036565b6127919190614e16565b905080856007015f8581526020019081526020015f205f8282546127b59190615001565b909155505f90506127c6828461520c565b90506127d68560200151826125bb565b6127eb85602001516109fe8760600151611266565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612895573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128bc919081019061513a565b91509150806128de57604051636b2f19e960e01b815260040160405180910390fd5b8151156128fe5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561292a5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461295657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129a55761296d81600161520c565b612978906008615036565b61ffff1686828151811061298e5761298e614e95565b016020015160f81c901b9190911790600101612959565b5061ffff8116156129c95760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612a24576129e081600361520c565b6129eb906008615036565b63ffffffff16876129fd836002615001565b81518110612a0d57612a0d614e95565b016020015160f81c901b91909117906001016129cc565b5063ffffffff8116600414612a4c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612aa157612a6381601f61520c565b612a6e906008615036565b88612a7a836006615001565b81518110612a8a57612a8a614e95565b016020015160f81c901b9190911790600101612a4f565b505f805b6008811015612b0057612ab981600761520c565b612ac4906008615036565b6001600160401b031689612ad9836026615001565b81518110612ae957612ae9614e95565b016020015160f81c901b9190911790600101612aa5565b505f805b6008811015612b5f57612b1881600761520c565b612b23906008615036565b6001600160401b03168a612b3883602e615001565b81518110612b4857612b48614e95565b016020015160f81c901b9190911790600101612b04565b5091989097509095509350505050565b5f8151602614612b9257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612be157612ba981600161520c565b612bb4906008615036565b61ffff16848281518110612bca57612bca614e95565b016020015160f81c901b9190911790600101612b95565b5061ffff811615612c055760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612c6057612c1c81600361520c565b612c27906008615036565b63ffffffff1685612c39836002615001565b81518110612c4957612c49614e95565b016020015160f81c901b9190911790600101612c08565b5063ffffffff811615612c8657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612cdb57612c9d81601f61520c565b612ca8906008615036565b86612cb4836006615001565b81518110612cc457612cc4614e95565b016020015160f81c901b9190911790600101612c89565b50949350505050565b60605f612cf383830184614e50565b612cff91506058615036565b612d0a90605c615001565b6001600160401b03811115612d2157612d21614ec7565b6040519080825280601f01601f191660200182016040528015612d4b576020820181803683370190505b5090505f5b6020811015612da05783358160208110612d6c57612d6c614e95565b1a60f81b828281518110612d8257612d82614e95565b60200101906001600160f81b03191690815f1a905350600101612d50565b505f5b6020811015612e005783602001358160208110612dc257612dc2614e95565b1a60f81b82612dd2836020615001565b81518110612de257612de2614e95565b60200101906001600160f81b03191690815f1a905350600101612da3565b505f5b6004811015612e6357612e1781600361520c565b612e22906008615036565b6014901c60f81b82612e35836040615001565b81518110612e4557612e45614e95565b60200101906001600160f81b03191690815f1a905350600101612e03565b505f612e756060850160408601614e35565b60601b90505f5b6014811015612ed557818160148110612e9757612e97614e95565b1a60f81b83612ea7836044615001565b81518110612eb757612eb7614e95565b60200101906001600160f81b03191690815f1a905350600101612e7c565b505f612ee46060860186614e50565b905090505f5b6004811015612f4f57612efe81600361520c565b612f09906008615036565b63ffffffff8316901c60f81b84612f21836058615001565b81518110612f3157612f31614e95565b60200101906001600160f81b03191690815f1a905350600101612eea565b505f5b612f5f6060870187614e50565b9050811015613173575f612f74826058615036565b612f7f90605c615001565b90505f5b602081101561300a57612f996060890189614e50565b84818110612fa957612fa9614e95565b9050602002810190612fbb9190614ea9565b358160208110612fcd57612fcd614e95565b1a60f81b86612fdc8385615001565b81518110612fec57612fec614e95565b60200101906001600160f81b03191690815f1a905350600101612f83565b505f5b60088110156130bf5761302181600761520c565b61302c906008615036565b61303960608a018a614e50565b8581811061304957613049614e95565b905060200281019061305b9190614ea9565b61306c906040810190602001614b75565b6001600160401b0316901c60f81b8682613087856020615001565b6130919190615001565b815181106130a1576130a1614e95565b60200101906001600160f81b03191690815f1a90535060010161300d565b505f5b6030811015613169576130d86060890189614e50565b848181106130e8576130e8614e95565b90506020028101906130fa9190614ea9565b61310890604081019061521f565b8281811061311857613118614e95565b9050013560f81c60f81b86828460286131319190615001565b61313b9190615001565b8151811061314b5761314b614e95565b60200101906001600160f81b03191690815f1a9053506001016130c2565b5050600101612f52565b5091949350505050565b613185614a05565b5f8281525f805160206155158339815191526020526040808220815160e0810190925280545f805160206154d583398151915293929190829060ff1660058111156131d2576131d2614bae565b60058111156131e3576131e3614bae565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561325557613255614bae565b146132735760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156132b7576132b7614bae565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133638582612134565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f805160206154f58339815191528054600119016133eb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206154f583398151915255565b5f5f805160206154b58339815191528161342061021485613e9f565b90505f61342c87611dd4565b905061343787612580565b61345457604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561346957613469614bae565b146134875760405163a36c527f60e01b815260040160405180910390fd5b5f828260800151613498919061504d565b905083600201600a9054906101000a90046001600160401b031682604001516134c19190615261565b6001600160401b0316816001600160401b031611156134f357604051630c192e7760e41b815260040160405180910390fd5b5f806134ff8a84612134565b915091505f8a8360405160200161352d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156135c0576135c0614bae565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146136ef57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561373e5761370681600161520c565b613711906008615036565b61ffff1685828151811061372757613727614e95565b016020015160f81c901b91909117906001016136f2565b5061ffff8116156137625760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137bd5761377981600361520c565b613784906008615036565b63ffffffff1686613796836002615001565b815181106137a6576137a6614e95565b016020015160f81c901b9190911790600101613765565b5063ffffffff81166003146137e557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561383a576137fc81601f61520c565b613807906008615036565b87613813836006615001565b8151811061382357613823614e95565b016020015160f81c901b91909117906001016137e8565b505f8660268151811061384f5761384f614e95565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206154b583398151915290600160401b900461ffff90811690861610806138c3575061271061ffff8616115b156138e15760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613913576040516302336bad60e51b815260040160405180910390fd5b80548310806139255750806001015483115b1561394357604051630103be3b60e21b815260040160405180910390fd5b5f61394d84613e9f565b90505f61395982610953565b90505f6139668983613ec2565b9050604051806060016040528061397a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613a156142ac565b613a1e826142f7565b6116b581614365565b5f808251602e14613a4b57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613a9a57613a6281600161520c565b613a6d906008615036565b61ffff16858281518110613a8357613a83614e95565b016020015160f81c901b9190911790600101613a4e565b5061ffff811615613abe5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613b1957613ad581600361520c565b613ae0906008615036565b63ffffffff1686613af2836002615001565b81518110613b0257613b02614e95565b016020015160f81c901b9190911790600101613ac1565b5063ffffffff8116600514613b4157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b9657613b5881601f61520c565b613b63906008615036565b87613b6f836006615001565b81518110613b7f57613b7f614e95565b016020015160f81c901b9190911790600101613b44565b505f805b6008811015613bf557613bae81600761520c565b613bb9906008615036565b6001600160401b031688613bce836026615001565b81518110613bde57613bde614e95565b016020015160f81c901b9190911790600101613b9a565b5090969095509350505050565b5f805160206154d58339815191525f6001600160401b038084169085161115613c3657613c2f8385614d4d565b9050613c43565b613c408484614d4d565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613ca5575060018401548151613ca1916001600160401b031690615001565b8210155b15613ccb576001600160401b038316606082015281815260408101516020820152613cea565b8281606001818151613cdd919061504d565b6001600160401b03169052505b6060810151613cfa906064615261565b602082015160018601546001600160401b039290921691613d259190600160401b900460ff16615036565b1015613d445760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613d5f9190615001565b9052506040810180516001600160401b0387169190613d7f90839061520c565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206155158339815191526020526040812060020180545f805160206154d58339815191529190600890613e1590600160401b90046001600160401b031661528c565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b03838116602483015260448201839052611dcf91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506143c2565b5f610963825f80516020615495833981519152546001600160a01b031690614428565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613f0657604051637fab81e560e01b815260040160405180910390fd5b5f805160206154d583398151915242613f256040860160208701614b75565b6001600160401b0316111580613f5f5750613f436202a30042615001565b613f536040860160208701614b75565b6001600160401b031610155b15613f7c5760405162d36c8560e81b815260040160405180910390fd5b6030613f8b604086018661521f565b9050141580613f9957508335155b15613fb75760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613fe757604051630eb0d31360e11b815260040160405180910390fd5b613ff1835f613c02565b5f8061408a6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906140359190614b75565b6001600160401b0316815260200161405060408a018a61521f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061458a565b5f828152600686016020526040902091935091506140a882826152eb565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906140e6908590600401614de4565b6020604051808303815f875af1158015614102573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141269190614dab565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561419e5761419e614bae565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161427e918e01908e01614b75565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166142f557604051631afcd79f60e31b815260040160405180910390fd5b565b6142ff6142ac565b6143088161464d565b614310614666565b61192d6060820135608083013561432d60c0850160a08601614b75565b61433d60e0860160c087016153aa565b61434e610100870160e088016153c3565b61436061012088016101008901614e35565b614676565b61436d6142ac565b5f805160206154958339815191526001600160a01b0382166143a25760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6143d66001600160a01b03841683614797565b905080515f141580156143fa5750808060200190518101906143f891906153e3565b155b15611dcf57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561446e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144929190614dab565b90506144a96001600160a01b0385163330866147a4565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156144ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145119190614dab565b90508181116145775760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161441f565b614581828261520c565b95945050505050565b5f60608260800151516030146145b357604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016145e597969594939291906153fe565b60405160208183030381529060405290506002816040516146069190614ff0565b602060405180830381855afa158015614621573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906146449190614dab565b94909350915050565b6146556142ac565b61465d6147dd565b61192d816147e5565b61466e6142ac565b6142f56148b7565b61467e6142ac565b5f805160206154b583398151915261ffff841615806146a2575061271061ffff8516115b156146c05760405163c98d73a760e01b815260040160405180910390fd5b858711156146e157604051630103be3b60e21b815260040160405180910390fd5b60ff831615806146f45750600a60ff8416115b15614712576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b60606122db83835f6148bf565b6040516001600160a01b03848116602483015283811660448301526064820183905261094d9186918216906323b872dd90608401613e6d565b6142f56142ac565b6147ed6142ac565b80355f805160206154d5833981519152908155601461481260608401604085016153c3565b60ff161180614831575061482c60608301604084016153c3565b60ff16155b1561484f5760405163b4fa3fb360e01b815260040160405180910390fd5b61485f60608301604084016153c3565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556148906040830160208401614b75565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6133f16142ac565b6060814710156148e45760405163cd78605960e01b815230600482015260240161441f565b5f80856001600160a01b031684866040516148ff9190614ff0565b5f6040518083038185875af1925050503d805f8114614939576040519150601f19603f3d011682016040523d82523d5f602084013e61493e565b606091505b509150915061212a86838360608261495e57614959826149a5565b6122db565b815115801561497557506001600160a01b0384163b155b1561499e57604051639996b31560e01b81526001600160a01b038516600482015260240161441f565b50806122db565b8051156149b55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546149da9061506d565b5f825580601f106149e9575050565b601f0160209004905f5260205f209081019061192d9190614a41565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614a55575f8155600101614a42565b5090565b801515811461192d575f80fd5b803563ffffffff81168114614a79575f80fd5b919050565b5f805f60608486031215614a90575f80fd5b833592506020840135614aa281614a59565b9150614ab060408501614a66565b90509250925092565b5f60208284031215614ac9575f80fd5b5035919050565b5f60208284031215614ae0575f80fd5b6122db82614a66565b5f8060408385031215614afa575f80fd5b614b0383614a66565b946020939093013593505050565b5f8060408385031215614b22575f80fd5b82356001600160401b03811115614b37575f80fd5b830160808186031215614b48575f80fd5b9150614b5660208401614a66565b90509250929050565b80356001600160401b0381168114614a79575f80fd5b5f60208284031215614b85575f80fd5b6122db82614b5f565b5f8060408385031215614b9f575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614be557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614c2060608401826001600160401b03169052565b506080830151614c3b60808401826001600160401b03169052565b5060a0830151614c5660a08401826001600160401b03169052565b5060c083015161292a60c08401826001600160401b03169052565b803561ffff81168114614a79575f80fd5b5f805f8060808587031215614c95575f80fd5b84356001600160401b03811115614caa575f80fd5b850160608188031215614cbb575f80fd5b9350614cc960208601614c71565b9250614cd760408601614b5f565b9396929550929360600135925050565b6001600160a01b038116811461192d575f80fd5b5f80828403610140811215614d0e575f80fd5b61012080821215614d1d575f80fd5b8493508301359050614d2e81614ce7565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561292a5761292a614d39565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614dbb575f80fd5b5051919050565b5f5b83811015614ddc578181015183820152602001614dc4565b50505f910152565b602081525f8251806020840152614e02816040850160208701614dc2565b601f01601f19169190910160400192915050565b5f82614e3057634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614e45575f80fd5b81356122db81614ce7565b5f808335601e19843603018112614e65575f80fd5b8301803591506001600160401b03821115614e7e575f80fd5b6020019150600581901b3603821315612284575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614ebd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614efd57614efd614ec7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2b57614f2b614ec7565b604052919050565b5f6001600160401b03821115614f4b57614f4b614ec7565b50601f01601f191660200190565b5f60608236031215614f69575f80fd5b614f71614edb565b823581526020614f82818501614b5f565b8183015260408401356001600160401b03811115614f9e575f80fd5b840136601f820112614fae575f80fd5b8035614fc1614fbc82614f33565b614f03565b8181523684838501011115614fd4575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614ebd818460208701614dc2565b8082018082111561096357610963614d39565b5f63ffffffff80831681810361502c5761502c614d39565b6001019392505050565b808202811582820484141761096357610963614d39565b6001600160401b0381811683821601908082111561292a5761292a614d39565b600181811c9082168061508157607f821691505b60208210810361509f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546150b78161506d565b806020870152604060018084165f81146150d857600181146150f457615121565b60ff19851660408a0152604084151560051b8a01019550615121565b895f5260205f205f5b858110156151185781548b82018601529083019088016150fd565b8a016040019650505b509398975050505050505050565b8051614a7981614a59565b5f806040838503121561514b575f80fd5b82516001600160401b0380821115615161575f80fd5b9084019060608287031215615174575f80fd5b61517c614edb565b8251815260208084015161518f81614ce7565b828201526040840151838111156151a4575f80fd5b80850194505087601f8501126151b8575f80fd5b835192506151c8614fbc84614f33565b83815288828587010111156151db575f80fd5b6151ea84838301848801614dc2565b806040840152508195506151ff81880161512f565b9450505050509250929050565b8181038181111561096357610963614d39565b5f808335601e19843603018112615234575f80fd5b8301803591506001600160401b0382111561524d575f80fd5b602001915036819003821315612284575f80fd5b6001600160401b0381811683821602808216919082811461528457615284614d39565b505092915050565b5f6001600160401b0380831681810361502c5761502c614d39565b601f821115611dcf57805f5260205f20601f840160051c810160208510156152cc5750805b601f840160051c820191505b81811015610a03575f81556001016152d8565b81516001600160401b0381111561530457615304614ec7565b61531881615312845461506d565b846152a7565b602080601f83116001811461534b575f84156153345750858301515b5f19600386901b1c1916600185901b1785556153a2565b5f85815260208120601f198616915b828110156153795788860151825594840194600190910190840161535a565b508582101561539657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156153ba575f80fd5b6122db82614c71565b5f602082840312156153d3575f80fd5b813560ff811681146122db575f80fd5b5f602082840312156153f3575f80fd5b81516122db81614a59565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161545381604e860160208901614dc2565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"subnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"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\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161571d38038061571d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6155d08061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd366004614b17565b61043a565b005b6101d26101e2366004614b52565b6107ed565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b610219610214366004614b52565b610974565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004614b69565b61098a565b6101d261026e366004614b82565b610a2b565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004614baa565b610e00565b6102b66102b1366004614c0e565b61128c565b6040519081526020016101fd565b6102196102d2366004614b52565b6112a5565b6102b65f81565b6101d26102ec366004614b17565b6112b9565b6101ef603081565b6101d2610307366004614b52565b611484565b6101d261031a366004614b82565b611542565b6101d261032d366004614b52565b6116f0565b6102b6610340366004614c27565b61196a565b6101d2610353366004614b69565b611996565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c366004614b52565b611b1d565b6101d261039f366004614b52565b611cfc565b6101ef601481565b6103bf6103ba366004614b52565b611e3b565b6040516101fd9190614c6f565b6102196202a30081565b6102b66103e4366004614b52565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004614ce9565b611f03565b6101d2610435366004614d62565b611f38565b5f8381525f805160206155048339815191526020526040808220815160e0810190925280545f8051602061554483398151915293929190829060ff16600381111561048757610487614c47565b600381111561049857610498614c47565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61050e82611e3b565b905060028351600381111561052557610525614c47565b1461054f578251604051633b0d540d60e21b81526105469190600401614da0565b60405180910390fd5b60208301516001600160a01b0316331461057c5760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f8060028351600581111561059a5761059a614c47565b036105eb5787156105b2576105af8488612017565b91505b5f856060015184608001516105c79190614dce565b90506105d3858261219b565b506001600160401b031660c08701525042905061061d565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b5906106429061128c565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106729796959493929190614dee565b602060405180830381865afa15801561068d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106b19190614e2c565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff191660018360038111156106f0576106f0614c47565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906107da9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206155a48339815191526020526040808220815160e0810190925280545f8051602061556483398151915293929190829060ff16600581111561083a5761083a614c47565b600581111561084b5761084b614c47565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108ba576108ba614c47565b146108ed575f8381526007830160205260409081902054905163170cc93360e21b81526105469160ff1690600401614e43565b6005600160991b016001600160a01b031663ee5b48eb6109128584606001515f6122f2565b6040518263ffffffff1660e01b815260040161092e9190614e73565b6020604051808303815f875af115801561094a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096e9190614e2c565b50505050565b5f61098464e8d4a5100083614ea5565b92915050565b5f805160206155448339815191525f806109a384612349565b915091506109b0826125ea565b6109ba5750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156109e9576109e9614c47565b03610a0e575f83815260078501602052604081208054919055610a0c8282612625565b505b610a2481610a1f846040015161128c565b61269b565b5050505050565b5f8181525f805160206155048339815191526020526040808220815160e0810190925280545f8051602061554483398151915293929190829060ff166003811115610a7857610a78614c47565b6003811115610a8957610a89614c47565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610b0090611e3b565b9050600182516003811115610b1757610b17614c47565b14610b38578151604051633b0d540d60e21b81526105469190600401614da0565b600381516005811115610b4d57610b4d614c47565b03610c9657600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610ba757610ba7614c47565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610cab57610cab614c47565b03610cb957610a24846126be565b5f610cc38661289b565b90505f80610cd4836040015161299b565b509150915081856040015114610cfd57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610d4557505f8781526005870160205260409020600201546001600160401b03808316600160801b90920416115b15610d6e57604051632e19bc2d60e11b81526001600160401b0382166004820152602401610546565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206155648339815191529060ff1615610e5257604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610eb99190614e2c565b836020013514610edc5760405163d040949d60e01b815260040160405180910390fd5b30610eed6060850160408601614ec4565b6001600160a01b031614610f145760405163e6c4247b60e01b815260040160405180910390fd5b5f610f226060850185614edf565b905090505f805b828163ffffffff1610156111ce575f610f456060880188614edf565b8363ffffffff16818110610f5b57610f5b614f24565b9050602002810190610f6d9190614f38565b610f7690614fe8565b80515f8181526008880160205260409020549192509015610faa57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610fd992919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610ff39161507f565b602060405180830381855afa15801561100e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110319190614e2c565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156110bd576110bd614c47565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611170911686615090565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806111c7906150a3565b9050610f29565b50600483018190555f6111e08561289b565b90505f6111f08260400151612bd9565b90505f6111fc88612d4e565b90505f60028260405161120f919061507f565b602060405180830381855afa15801561122a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061124d9190614e2c565b90508281146112725760405163884eab3360e01b815260048101829052602401610546565b5050506009909301805460ff191660011790555050505050565b5f6109846001600160401b03831664e8d4a510006150c5565b5f6112af82611e3b565b6080015192915050565b5f805160206155448339815191525f6112d1856131e7565b90506112dc856125ea565b6112e7575050505050565b5f8581526004830160205260409020546001600160a01b0316331461131f5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161134e91600160b01b90046001600160401b0316906150dc565b6001600160401b03168160c001516001600160401b03161015611384576040516302336bad60e51b815260040160405180910390fd5b8315610a24575f6113958685612017565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906113e59061128c565b60a085015160c08601516040516001600160e01b031960e086901b168152611419939291829188905f908190600401614dee565b602060405180830381865afa158015611434573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114589190614e2c565b5f87815260078501602052604081208054909190611477908490615090565b9091555050505050505050565b5f805160206155448339815191525f61149c83611e3b565b90506004815160058111156114b3576114b3614c47565b146114d457805160405163170cc93360e21b81526105469190600401614e43565b5f8381526004830160205260409020546001600160a01b0316331461150c5760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461096e906001600160a01b031682612625565b61154a613439565b5f8181525f805160206155048339815191526020526040808220815160e0810190925280545f8051602061554483398151915293929190829060ff16600381111561159757611597614c47565b60038111156115a8576115a8614c47565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f6116168561289b565b90505f80611627836040015161299b565b50915091508184604001511461165057604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561169257604051632e19bc2d60e11b81526001600160401b0382166004820152602401610546565b6003845160038111156116a7576116a7614c47565b146116c8578351604051633b0d540d60e21b81526105469190600401614da0565b6116d1866126be565b50505050506116ec60015f8051602061558483398151915255565b5050565b6116f8613439565b5f8181525f805160206155048339815191526020526040808220815160e0810190925280545f8051602061554483398151915293929190829060ff16600381111561174557611745614c47565b600381111561175657611756614c47565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6117cc82611e3b565b90505f835160038111156117e2576117e2614c47565b0361180057604051631d0b665760e21b815260040160405180910390fd5b60048151600581111561181557611815614c47565b1461183657805160405163170cc93360e21b81526105469190600401614e43565b60018351600381111561184b5761184b614c47565b0361186257611859856126be565b50505050611951565b60028351600381111561187757611877614c47565b0361194357600384015460608401516001600160a01b039091169063778c06b5906118a19061128c565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b1681526118f396959493926001600160401b0390921691908190600401614dee565b602060405180830381865afa15801561190e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119329190614e2c565b5f8681526006860160205260409020555b61194c856126be565b505050505b61196760015f8051602061558483398151915255565b50565b5f611973613439565b61197e833384613483565b905061098460015f8051602061558483398151915255565b5f805160206155648339815191525f6119ae8361289b565b90505f806119bf8360400151613758565b91509150806119e157604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546119fb906150fc565b90505f03611a1c57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115611a4257611a42614c47565b14611a75575f8281526007850160205260409081902054905163170cc93360e21b81526105469160ff1690600401614e43565b5f8281526006850160205260408120611a8d91614a67565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206155048339815191526020526040808220815160e0810190925280545f8051602061554483398151915293929190829060ff166003811115611b6a57611b6a614c47565b6003811115611b7b57611b7b614c47565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611bf457611bf4614c47565b14158015611c155750600381516003811115611c1257611c12614c47565b14155b15611c36578051604051633b0d540d60e21b81526105469190600401614da0565b5f611c448260400151611e3b565b905080606001516001600160401b03165f03611c7357604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611ca08460400151846060015185608001516122f2565b6040518263ffffffff1660e01b8152600401611cbc9190614e73565b6020604051808303815f875af1158015611cd8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a249190614e2c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206155648339815191529190611d43906150fc565b90505f03611d6457604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611d8a57611d8a614c47565b14611dbd575f8281526007820160205260409081902054905163170cc93360e21b81526105469160ff1690600401614e43565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611df69190600401615134565b6020604051808303815f875af1158015611e12573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e369190614e2c565b505050565b611e43614a9e565b5f8281525f805160206155a4833981519152602052604090819020815160e0810190925280545f80516020615564833981519152929190829060ff166005811115611e9057611e90614c47565b6005811115611ea157611ea1614c47565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611f0c613439565b611f18858585856138fc565b9050611f3060015f8051602061558483398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611f81575080546001600160401b03808416911610155b15611f9f5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611fca8484613a9a565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612062573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261208991908101906151c9565b91509150806120ab57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121129190614e2c565b8251146121325760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561215e5760405163e6c4247b60e01b815260040160405180910390fd5b5f8061216d8460400151613ab4565b9150915081871461219157604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f805160206155a4833981519152602052604081206002015481905f8051602061556483398151915290600160801b90046001600160401b03166121e38582613c8f565b5f6121ed87613e69565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61223d8a858b6122f2565b6040518263ffffffff1660e01b81526004016122599190614e73565b6020604051808303815f875af1158015612275573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122999190614e2c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f612352614a9e565b5f805160206155648339815191525f61236a8561289b565b90505f8061237b8360400151613758565b91509150801561239e57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156123cf576123cf614c47565b60058111156123e0576123e0614c47565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561244f5761244f614c47565b14158015612470575060018151600581111561246d5761246d614c47565b14155b1561249157805160405163170cc93360e21b81526105469190600401614e43565b6003815160058111156124a6576124a6614c47565b036124b457600481526124b9565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156124fe576124fe614c47565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156125b2576125b2614c47565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061552483398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612680575f80fd5b505af1158015612692573d5f803e3d5ffd5b50505050505050565b5f80516020615524833981519152546116ec906001600160a01b03168383613ede565b5f8181525f805160206155048339815191526020526040808220815160e0810190925280545f8051602061554483398151915293929190829060ff16600381111561270b5761270b614c47565b600381111561271c5761271c614c47565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701825282812080549082905584825260048801909252918220549394509192612710906127f190600160a01b900461ffff16846150c5565b6127fb9190614ea5565b905080856007015f8581526020019081526020015f205f82825461281f9190615090565b909155505f9050612830828461529b565b9050612840856020015182612625565b6128558560200151610a1f876060015161128c565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156128ff573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261292691908101906151c9565b915091508061294857604051636b2f19e960e01b815260040160405180910390fd5b8151156129685760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156129945760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146129c057604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612a0f576129d781600161529b565b6129e29060086150c5565b61ffff168682815181106129f8576129f8614f24565b016020015160f81c901b91909117906001016129c3565b5061ffff811615612a335760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612a8e57612a4a81600361529b565b612a559060086150c5565b63ffffffff1687612a67836002615090565b81518110612a7757612a77614f24565b016020015160f81c901b9190911790600101612a36565b5063ffffffff8116600414612ab657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612b0b57612acd81601f61529b565b612ad89060086150c5565b88612ae4836006615090565b81518110612af457612af4614f24565b016020015160f81c901b9190911790600101612ab9565b505f805b6008811015612b6a57612b2381600761529b565b612b2e9060086150c5565b6001600160401b031689612b43836026615090565b81518110612b5357612b53614f24565b016020015160f81c901b9190911790600101612b0f565b505f805b6008811015612bc957612b8281600761529b565b612b8d9060086150c5565b6001600160401b03168a612ba283602e615090565b81518110612bb257612bb2614f24565b016020015160f81c901b9190911790600101612b6e565b5091989097509095509350505050565b5f8151602614612bfc57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612c4b57612c1381600161529b565b612c1e9060086150c5565b61ffff16848281518110612c3457612c34614f24565b016020015160f81c901b9190911790600101612bff565b5061ffff811615612c6f5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612cca57612c8681600361529b565b612c919060086150c5565b63ffffffff1685612ca3836002615090565b81518110612cb357612cb3614f24565b016020015160f81c901b9190911790600101612c72565b5063ffffffff811615612cf057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612d4557612d0781601f61529b565b612d129060086150c5565b86612d1e836006615090565b81518110612d2e57612d2e614f24565b016020015160f81c901b9190911790600101612cf3565b50949350505050565b60605f612d5d83830184614edf565b612d69915060586150c5565b612d7490605c615090565b6001600160401b03811115612d8b57612d8b614f56565b6040519080825280601f01601f191660200182016040528015612db5576020820181803683370190505b5090505f5b6020811015612e0a5783358160208110612dd657612dd6614f24565b1a60f81b828281518110612dec57612dec614f24565b60200101906001600160f81b03191690815f1a905350600101612dba565b505f5b6020811015612e6a5783602001358160208110612e2c57612e2c614f24565b1a60f81b82612e3c836020615090565b81518110612e4c57612e4c614f24565b60200101906001600160f81b03191690815f1a905350600101612e0d565b505f5b6004811015612ecd57612e8181600361529b565b612e8c9060086150c5565b6014901c60f81b82612e9f836040615090565b81518110612eaf57612eaf614f24565b60200101906001600160f81b03191690815f1a905350600101612e6d565b505f612edf6060850160408601614ec4565b60601b90505f5b6014811015612f3f57818160148110612f0157612f01614f24565b1a60f81b83612f11836044615090565b81518110612f2157612f21614f24565b60200101906001600160f81b03191690815f1a905350600101612ee6565b505f612f4e6060860186614edf565b905090505f5b6004811015612fb957612f6881600361529b565b612f739060086150c5565b63ffffffff8316901c60f81b84612f8b836058615090565b81518110612f9b57612f9b614f24565b60200101906001600160f81b03191690815f1a905350600101612f54565b505f5b612fc96060870187614edf565b90508110156131dd575f612fde8260586150c5565b612fe990605c615090565b90505f5b6020811015613074576130036060890189614edf565b8481811061301357613013614f24565b90506020028101906130259190614f38565b35816020811061303757613037614f24565b1a60f81b866130468385615090565b8151811061305657613056614f24565b60200101906001600160f81b03191690815f1a905350600101612fed565b505f5b60088110156131295761308b81600761529b565b6130969060086150c5565b6130a360608a018a614edf565b858181106130b3576130b3614f24565b90506020028101906130c59190614f38565b6130d6906040810190602001614c0e565b6001600160401b0316901c60f81b86826130f1856020615090565b6130fb9190615090565b8151811061310b5761310b614f24565b60200101906001600160f81b03191690815f1a905350600101613077565b505f5b60308110156131d3576131426060890189614edf565b8481811061315257613152614f24565b90506020028101906131649190614f38565b6131729060408101906152ae565b8281811061318257613182614f24565b9050013560f81c60f81b868284602861319b9190615090565b6131a59190615090565b815181106131b5576131b5614f24565b60200101906001600160f81b03191690815f1a90535060010161312c565b5050600101612fbc565b5091949350505050565b6131ef614a9e565b5f8281525f805160206155a48339815191526020526040808220815160e0810190925280545f8051602061556483398151915293929190829060ff16600581111561323c5761323c614c47565b600581111561324d5761324d614c47565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156132bf576132bf614c47565b146132f2575f8481526007830160205260409081902054905163170cc93360e21b81526105469160ff1690600401614e43565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561333657613336614c47565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133e2858261219b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061558483398151915280546001190161346a57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061558483398151915255565b5f5f805160206155448339815191528161349f61021485613f3d565b90505f6134ab87611e3b565b90506134b6876125ea565b6134d357604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156134e8576134e8614c47565b1461350957805160405163170cc93360e21b81526105469190600401614e43565b5f82826080015161351a91906150dc565b905083600201600a9054906101000a90046001600160401b0316826040015161354391906152f0565b6001600160401b0316816001600160401b0316111561358057604051636d51fe0560e11b81526001600160401b0382166004820152602401610546565b5f8061358c8a8461219b565b915091505f8a836040516020016135ba92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561364d5761364d614c47565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461377c57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137cb5761379381600161529b565b61379e9060086150c5565b61ffff168582815181106137b4576137b4614f24565b016020015160f81c901b919091179060010161377f565b5061ffff8116156137ef5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561384a5761380681600361529b565b6138119060086150c5565b63ffffffff1686613823836002615090565b8151811061383357613833614f24565b016020015160f81c901b91909117906001016137f2565b5063ffffffff811660031461387257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138c75761388981601f61529b565b6138949060086150c5565b876138a0836006615090565b815181106138b0576138b0614f24565b016020015160f81c901b9190911790600101613875565b505f866026815181106138dc576138dc614f24565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061554483398151915290600160401b900461ffff9081169086161080613950575061271061ffff8616115b1561396e5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156139a0576040516302336bad60e51b815260040160405180910390fd5b80548310806139b25750806001015483115b156139d057604051630103be3b60e21b815260040160405180910390fd5b5f6139da84613f3d565b90505f6139e682610974565b90505f6139f38983613f60565b90506040518060600160405280613a073390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613aa261434a565b613aab82614395565b6116ec81614403565b5f808251602e14613ad857604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613b2757613aef81600161529b565b613afa9060086150c5565b61ffff16858281518110613b1057613b10614f24565b016020015160f81c901b9190911790600101613adb565b5061ffff811615613b4b5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613ba657613b6281600361529b565b613b6d9060086150c5565b63ffffffff1686613b7f836002615090565b81518110613b8f57613b8f614f24565b016020015160f81c901b9190911790600101613b4e565b5063ffffffff8116600514613bce57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c2357613be581601f61529b565b613bf09060086150c5565b87613bfc836006615090565b81518110613c0c57613c0c614f24565b016020015160f81c901b9190911790600101613bd1565b505f805b6008811015613c8257613c3b81600761529b565b613c469060086150c5565b6001600160401b031688613c5b836026615090565b81518110613c6b57613c6b614f24565b016020015160f81c901b9190911790600101613c27565b5090969095509350505050565b5f805160206155648339815191525f6001600160401b038084169085161115613cc357613cbc8385614dce565b9050613cd0565b613ccd8484614dce565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613d32575060018401548151613d2e916001600160401b031690615090565b8210155b15613d58576001600160401b038316606082015281815260408101516020820152613d77565b8281606001818151613d6a91906150dc565b6001600160401b03169052505b6060810151613d879060646152f0565b602082015160018601546001600160401b039290921691613db29190600160401b900460ff166150c5565b1015613de257606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610546565b856001600160401b031681604001818151613dfd9190615090565b9052506040810180516001600160401b0387169190613e1d90839061529b565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206155a48339815191526020526040812060020180545f805160206155648339815191529190600890613eb390600160401b90046001600160401b031661531b565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b03838116602483015260448201839052611e3691859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614460565b5f610984825f80516020615524833981519152546001600160a01b0316906144c1565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fa457604051637fab81e560e01b815260040160405180910390fd5b5f8051602061556483398151915242613fc36040860160208701614c0e565b6001600160401b0316111580613ffd5750613fe16202a30042615090565b613ff16040860160208701614c0e565b6001600160401b031610155b1561401a5760405162d36c8560e81b815260040160405180910390fd5b603061402960408601866152ae565b905014158061403757508335155b156140555760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561408557604051630eb0d31360e11b815260040160405180910390fd5b61408f835f613c8f565b5f806141286040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906140d39190614c0e565b6001600160401b031681526020016140ee60408a018a6152ae565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614623565b5f82815260068601602052604090209193509150614146828261537a565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614184908590600401614e73565b6020604051808303815f875af11580156141a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141c49190614e2c565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561423c5761423c614c47565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161431c918e01908e01614c0e565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661439357604051631afcd79f60e31b815260040160405180910390fd5b565b61439d61434a565b6143a6816146e6565b6143ae6146ff565b611967606082013560808301356143cb60c0850160a08601614c0e565b6143db60e0860160c08701615439565b6143ec610100870160e08801615452565b6143fe61012088016101008901614ec4565b61470f565b61440b61434a565b5f805160206155248339815191526001600160a01b0382166144405760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6144746001600160a01b03841683614830565b905080515f141580156144985750808060200190518101906144969190615472565b155b15611e3657604051635274afe760e01b81526001600160a01b0384166004820152602401610546565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614507573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061452b9190614e2c565b90506145426001600160a01b03851633308661483d565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614586573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145aa9190614e2c565b90508181116146105760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401610546565b61461a828261529b565b95945050505050565b5f606082608001515160301461464c57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161467e979695949392919061548d565b604051602081830303815290604052905060028160405161469f919061507f565b602060405180830381855afa1580156146ba573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906146dd9190614e2c565b94909350915050565b6146ee61434a565b6146f6614876565b6119678161487e565b61470761434a565b614393614950565b61471761434a565b5f8051602061554483398151915261ffff8416158061473b575061271061ffff8516115b156147595760405163c98d73a760e01b815260040160405180910390fd5b8587111561477a57604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061478d5750600a60ff8416115b156147ab576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061234283835f614958565b6040516001600160a01b03848116602483015283811660448301526064820183905261096e9186918216906323b872dd90608401613f0b565b61439361434a565b61488661434a565b80355f8051602061556483398151915290815560146148ab6060840160408501615452565b60ff1611806148ca57506148c56060830160408401615452565b60ff16155b156148e85760405163b4fa3fb360e01b815260040160405180910390fd5b6148f86060830160408401615452565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556149296040830160208401614c0e565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61347061434a565b60608147101561497d5760405163cd78605960e01b8152306004820152602401610546565b5f80856001600160a01b03168486604051614998919061507f565b5f6040518083038185875af1925050503d805f81146149d2576040519150601f19603f3d011682016040523d82523d5f602084013e6149d7565b606091505b50915091506121918683836060826149f7576149f282614a3e565b612342565b8151158015614a0e57506001600160a01b0384163b155b15614a3757604051639996b31560e01b81526001600160a01b0385166004820152602401610546565b5080612342565b805115614a4e5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614a73906150fc565b5f825580601f10614a82575050565b601f0160209004905f5260205f20908101906119679190614ada565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614aee575f8155600101614adb565b5090565b8015158114611967575f80fd5b803563ffffffff81168114614b12575f80fd5b919050565b5f805f60608486031215614b29575f80fd5b833592506020840135614b3b81614af2565b9150614b4960408501614aff565b90509250925092565b5f60208284031215614b62575f80fd5b5035919050565b5f60208284031215614b79575f80fd5b61234282614aff565b5f8060408385031215614b93575f80fd5b614b9c83614aff565b946020939093013593505050565b5f8060408385031215614bbb575f80fd5b82356001600160401b03811115614bd0575f80fd5b830160808186031215614be1575f80fd5b9150614bef60208401614aff565b90509250929050565b80356001600160401b0381168114614b12575f80fd5b5f60208284031215614c1e575f80fd5b61234282614bf8565b5f8060408385031215614c38575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b60068110614c6b57614c6b614c47565b9052565b5f60e082019050614c81828451614c5b565b6020830151602083015260408301516001600160401b0380821660408501528060608601511660608501528060808601511660808501528060a08601511660a08501528060c08601511660c0850152505092915050565b803561ffff81168114614b12575f80fd5b5f805f8060808587031215614cfc575f80fd5b84356001600160401b03811115614d11575f80fd5b850160608188031215614d22575f80fd5b9350614d3060208601614cd8565b9250614d3e60408601614bf8565b9396929550929360600135925050565b6001600160a01b0381168114611967575f80fd5b5f80828403610140811215614d75575f80fd5b61012080821215614d84575f80fd5b8493508301359050614d9581614d4e565b809150509250929050565b6020810160048310614db457614db4614c47565b91905290565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561299457612994614dba565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614e3c575f80fd5b5051919050565b602081016109848284614c5b565b5f5b83811015614e6b578181015183820152602001614e53565b50505f910152565b602081525f8251806020840152614e91816040850160208701614e51565b601f01601f19169190910160400192915050565b5f82614ebf57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614ed4575f80fd5b813561234281614d4e565b5f808335601e19843603018112614ef4575f80fd5b8301803591506001600160401b03821115614f0d575f80fd5b6020019150600581901b36038213156122eb575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614f4c575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614f8c57614f8c614f56565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614fba57614fba614f56565b604052919050565b5f6001600160401b03821115614fda57614fda614f56565b50601f01601f191660200190565b5f60608236031215614ff8575f80fd5b615000614f6a565b823581526020615011818501614bf8565b8183015260408401356001600160401b0381111561502d575f80fd5b840136601f82011261503d575f80fd5b803561505061504b82614fc2565b614f92565b8181523684838501011115615063575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614f4c818460208701614e51565b8082018082111561098457610984614dba565b5f63ffffffff8083168181036150bb576150bb614dba565b6001019392505050565b808202811582820484141761098457610984614dba565b6001600160401b0381811683821601908082111561299457612994614dba565b600181811c9082168061511057607f821691505b60208210810361512e57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454615146816150fc565b806020870152604060018084165f81146151675760018114615183576151b0565b60ff19851660408a0152604084151560051b8a010195506151b0565b895f5260205f205f5b858110156151a75781548b820186015290830190880161518c565b8a016040019650505b509398975050505050505050565b8051614b1281614af2565b5f80604083850312156151da575f80fd5b82516001600160401b03808211156151f0575f80fd5b9084019060608287031215615203575f80fd5b61520b614f6a565b8251815260208084015161521e81614d4e565b82820152604084015183811115615233575f80fd5b80850194505087601f850112615247575f80fd5b8351925061525761504b84614fc2565b838152888285870101111561526a575f80fd5b61527984838301848801614e51565b8060408401525081955061528e8188016151be565b9450505050509250929050565b8181038181111561098457610984614dba565b5f808335601e198436030181126152c3575f80fd5b8301803591506001600160401b038211156152dc575f80fd5b6020019150368190038213156122eb575f80fd5b6001600160401b0381811683821602808216919082811461531357615313614dba565b505092915050565b5f6001600160401b038083168181036150bb576150bb614dba565b601f821115611e3657805f5260205f20601f840160051c8101602085101561535b5750805b601f840160051c820191505b81811015610a24575f8155600101615367565b81516001600160401b0381111561539357615393614f56565b6153a7816153a184546150fc565b84615336565b602080601f8311600181146153da575f84156153c35750858301515b5f19600386901b1c1916600185901b178555615431565b5f85815260208120601f198616915b82811015615408578886015182559484019460019091019084016153e9565b508582101561542557878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f60208284031215615449575f80fd5b61234282614cd8565b5f60208284031215615462575f80fd5b813560ff81168114612342575f80fd5b5f60208284031215615482575f80fd5b815161234281614af2565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516154e281604e860160208901614e51565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 7e43fb0dc..8ac090a8d 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -82,8 +82,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161539b38038061539b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61524e8061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004614828565b61058b565b005b3480156101ea575f80fd5b506101dd6101f9366004614863565b610932565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd61024336600461487a565b610aa4565b348015610253575f80fd5b50610267610262366004614863565b610b81565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046148b8565b610b97565b604051908152602001610220565b348015610305575f80fd5b506101dd61031436600461490c565b610bcb565b348015610324575f80fd5b506101dd610333366004614925565b610c6c565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b36600461494d565b611044565b34801561038b575f80fd5b506102ec61039a36600461499b565b6114c8565b3480156103aa575f80fd5b506102676103b9366004614863565b6114e1565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb366004614828565b6114f5565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e366004614863565b6116c0565b34801561042e575f80fd5b506101dd61043d366004614925565b61177b565b34801561044d575f80fd5b506101dd61045c366004614863565b61191b565b34801561046c575f80fd5b506101dd61047b36600461490c565b611b92565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b4366004614863565b611d04565b3480156104c4575f80fd5b506101dd6104d3366004614863565b611ee0565b6102ec6104e6366004614863565b61200a565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e610519366004614863565b61203b565b60405161022091906149c8565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b366004614863565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff1660038111156105d8576105d86149b4565b60038111156105e9576105e96149b4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61065f8261203b565b9050600283516003811115610676576106766149b4565b146106945760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106c15760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f806002835160058111156106df576106df6149b4565b036107305787156106f7576106f48488612103565b91505b5f8560600151846080015161070c9190614a8b565b90506107188582612287565b506001600160401b031660c087015250429050610762565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b590610787906114c8565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016107b79796959493929190614aab565b602060405180830381865afa1580156107d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f69190614ae9565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff19166001836003811115610835576108356149b4565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061091f9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206152228339815191526020526040808220815160e0810190925280545f805160206151e283398151915293929190829060ff16600581111561097f5761097f6149b4565b6005811115610990576109906149b4565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109ff576109ff6149b4565b14610a1d5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a428584606001515f6123de565b6040518263ffffffff1660e01b8152600401610a5e9190614b22565b6020604051808303815f875af1158015610a7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9e9190614ae9565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aed575080546001600160401b03808416911610155b15610b0b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b358361242d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b9164e8d4a5100083614b54565b92915050565b5f610ba061243e565b610bac84848434612475565b9050610bc460015f8051602061520283398151915255565b9392505050565b5f805160206151c28339815191525f80610be48461261b565b91509150610bf1826128b9565b610bfb5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c2a57610c2a6149b4565b03610c4f575f83815260078501602052604081208054919055610c4d82826128f4565b505b610c6581610c6084604001516114c8565b61295a565b5050505050565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff166003811115610cb957610cb96149b4565b6003811115610cca57610cca6149b4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610d419061203b565b905060015f85815260058501602052604090205460ff166003811115610d6957610d696149b4565b14610d875760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610d9c57610d9c6149b4565b03610ee557600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610df657610df66149b4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610efa57610efa6149b4565b03610f0857610c658461296d565b5f610f1286612b4a565b90505f80610f238360400151612c4a565b509150915081856040015114610f4c57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610f9457505f8781526005870160205260409020600201546001600160401b03808316600160801b90920416115b15610fb257604051633ab3447f60e11b815260040160405180910390fd5b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151e28339815191529060ff161561109657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110fd9190614ae9565b8360200135146111205760405163d040949d60e01b815260040160405180910390fd5b306111316060850160408601614b87565b6001600160a01b0316146111585760405163e6c4247b60e01b815260040160405180910390fd5b5f6111666060850185614ba2565b905090505f805b828163ffffffff161015611412575f6111896060880188614ba2565b8363ffffffff1681811061119f5761119f614be7565b90506020028101906111b19190614bfb565b6111ba90614cab565b80515f81815260088801602052604090205491925090156111ee57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161121d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261123791614d42565b602060405180830381855afa158015611252573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112759190614ae9565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115611301576113016149b4565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113b4911686614d53565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061140b90614d66565b905061116d565b50600483018190555f61142485612b4a565b90505f6114348260400151612e88565b90505f61144088612ffd565b9050816002826040516114539190614d42565b602060405180830381855afa15801561146e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114919190614ae9565b146114af57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610b916001600160401b03831664e8d4a51000614d88565b5f6114eb8261203b565b6080015192915050565b5f805160206151c28339815191525f61150d85613496565b9050611518856128b9565b611523575050505050565b5f8581526004830160205260409020546001600160a01b0316331461155b5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161158a91600160b01b90046001600160401b031690614d9f565b6001600160401b03168160c001516001600160401b031610156115c0576040516302336bad60e51b815260040160405180910390fd5b8315610c65575f6115d18685612103565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b590611621906114c8565b60a085015160c08601516040516001600160e01b031960e086901b168152611655939291829188905f908190600401614aab565b602060405180830381865afa158015611670573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116949190614ae9565b5f878152600785016020526040812080549091906116b3908490614d53565b9091555050505050505050565b5f805160206151c28339815191525f6116d88361203b565b90506004815160058111156116ef576116ef6149b4565b1461170d5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146117455760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610a9e906001600160a01b0316826128f4565b61178361243e565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff1660038111156117d0576117d06149b4565b60038111156117e1576117e16149b4565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f61184f85612b4a565b90505f806118608360400151612c4a565b50915091508184604001511461188957604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156118c057604051633ab3447f60e11b815260040160405180910390fd5b6003845160038111156118d5576118d56149b4565b146118f35760405163f95c7fe160e01b815260040160405180910390fd5b6118fc8661296d565b505050505061191760015f8051602061520283398151915255565b5050565b61192361243e565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff166003811115611970576119706149b4565b6003811115611981576119816149b4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6119f78261203b565b90505f83516003811115611a0d57611a0d6149b4565b03611a2b57604051631d0b665760e21b815260040160405180910390fd5b600481516005811115611a4057611a406149b4565b14611a5e5760405163a36c527f60e01b815260040160405180910390fd5b600183516003811115611a7357611a736149b4565b03611a8a57611a818561296d565b50505050611b79565b600283516003811115611a9f57611a9f6149b4565b03611b6b57600384015460608401516001600160a01b039091169063778c06b590611ac9906114c8565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b168152611b1b96959493926001600160401b0390921691908190600401614aab565b602060405180830381865afa158015611b36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b5a9190614ae9565b5f8681526006860160205260409020555b611b748561296d565b505050505b611b8f60015f8051602061520283398151915255565b50565b5f805160206151e28339815191525f611baa83612b4a565b90505f80611bbb83604001516136d3565b9150915080611bdd57604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068501602052604090208054611bf790614dbf565b90505f03611c1857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115611c3e57611c3e6149b4565b14611c5c5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120611c749161477d565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff166003811115611d5157611d516149b4565b6003811115611d6257611d626149b4565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611ddb57611ddb6149b4565b14158015611dfc5750600381516003811115611df957611df96149b4565b14155b15611e1a5760405163f95c7fe160e01b815260040160405180910390fd5b5f611e28826040015161203b565b905080606001516001600160401b03165f03611e5757604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611e848460400151846060015185608001516123de565b6040518263ffffffff1660e01b8152600401611ea09190614b22565b6020604051808303815f875af1158015611ebc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c659190614ae9565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206151e28339815191529190611f2790614dbf565b90505f03611f4857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611f6e57611f6e6149b4565b14611f8c5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fc59190600401614df1565b6020604051808303815f875af1158015611fe1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120059190614ae9565b505050565b5f61201361243e565b61201e823334613877565b905061203660015f8051602061520283398151915255565b919050565b6120436147b4565b5f8281525f80516020615222833981519152602052604090819020815160e0810190925280545f805160206151e2833981519152929190829060ff166005811115612090576120906149b4565b60058111156120a1576120a16149b4565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561214e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121759190810190614e86565b915091508061219757604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fe9190614ae9565b82511461221e5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561224a5760405163e6c4247b60e01b815260040160405180910390fd5b5f806122598460400151613b3b565b9150915081871461227d57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615222833981519152602052604081206002015481905f805160206151e283398151915290600160801b90046001600160401b03166122cf8582613d16565b5f6122d987613edf565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123298a858b6123de565b6040518263ffffffff1660e01b81526004016123459190614b22565b6020604051808303815f875af1158015612361573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123859190614ae9565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612435613f54565b611b8f81613f9f565b5f8051602061520283398151915280546001190161246f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206151c283398151915290600160401b900461ffff90811690861610806124c9575061271061ffff8616115b156124e75760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612519576040516302336bad60e51b815260040160405180910390fd5b805483108061252b5750806001015483115b1561254957604051630103be3b60e21b815260040160405180910390fd5b825f61255482610b81565b90505f612561898361400d565b905060405180606001604052806125753390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061520283398151915255565b5f6126246147b4565b5f805160206151e28339815191525f61263c85612b4a565b90505f8061264d83604001516136d3565b91509150801561267057604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156126a1576126a16149b4565b60058111156126b2576126b26149b4565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612721576127216149b4565b14158015612742575060018151600581111561273f5761273f6149b4565b14155b156127605760405163a36c527f60e01b815260040160405180910390fd5b600381516005811115612775576127756149b4565b036127835760048152612788565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156127cd576127cd6149b4565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612881576128816149b4565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612940575f80fd5b505af1158015612952573d5f803e3d5ffd5b505050505050565b6119176001600160a01b038316826143f7565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff1660038111156129ba576129ba6149b4565b60038111156129cb576129cb6149b4565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612aa090600160a01b900461ffff1684614d88565b612aaa9190614b54565b905080856007015f8581526020019081526020015f205f828254612ace9190614d53565b909155505f9050612adf8284614f58565b9050612aef8560200151826128f4565b612b048560200151610c6087606001516114c8565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bae573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bd59190810190614e86565b9150915080612bf757604051636b2f19e960e01b815260040160405180910390fd5b815115612c175760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612c435760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612c6f57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612cbe57612c86816001614f58565b612c91906008614d88565b61ffff16868281518110612ca757612ca7614be7565b016020015160f81c901b9190911790600101612c72565b5061ffff811615612ce25760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612d3d57612cf9816003614f58565b612d04906008614d88565b63ffffffff1687612d16836002614d53565b81518110612d2657612d26614be7565b016020015160f81c901b9190911790600101612ce5565b5063ffffffff8116600414612d6557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612dba57612d7c81601f614f58565b612d87906008614d88565b88612d93836006614d53565b81518110612da357612da3614be7565b016020015160f81c901b9190911790600101612d68565b505f805b6008811015612e1957612dd2816007614f58565b612ddd906008614d88565b6001600160401b031689612df2836026614d53565b81518110612e0257612e02614be7565b016020015160f81c901b9190911790600101612dbe565b505f805b6008811015612e7857612e31816007614f58565b612e3c906008614d88565b6001600160401b03168a612e5183602e614d53565b81518110612e6157612e61614be7565b016020015160f81c901b9190911790600101612e1d565b5091989097509095509350505050565b5f8151602614612eab57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612efa57612ec2816001614f58565b612ecd906008614d88565b61ffff16848281518110612ee357612ee3614be7565b016020015160f81c901b9190911790600101612eae565b5061ffff811615612f1e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612f7957612f35816003614f58565b612f40906008614d88565b63ffffffff1685612f52836002614d53565b81518110612f6257612f62614be7565b016020015160f81c901b9190911790600101612f21565b5063ffffffff811615612f9f57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612ff457612fb681601f614f58565b612fc1906008614d88565b86612fcd836006614d53565b81518110612fdd57612fdd614be7565b016020015160f81c901b9190911790600101612fa2565b50949350505050565b60605f61300c83830184614ba2565b61301891506058614d88565b61302390605c614d53565b6001600160401b0381111561303a5761303a614c19565b6040519080825280601f01601f191660200182016040528015613064576020820181803683370190505b5090505f5b60208110156130b9578335816020811061308557613085614be7565b1a60f81b82828151811061309b5761309b614be7565b60200101906001600160f81b03191690815f1a905350600101613069565b505f5b602081101561311957836020013581602081106130db576130db614be7565b1a60f81b826130eb836020614d53565b815181106130fb576130fb614be7565b60200101906001600160f81b03191690815f1a9053506001016130bc565b505f5b600481101561317c57613130816003614f58565b61313b906008614d88565b6014901c60f81b8261314e836040614d53565b8151811061315e5761315e614be7565b60200101906001600160f81b03191690815f1a90535060010161311c565b505f61318e6060850160408601614b87565b60601b90505f5b60148110156131ee578181601481106131b0576131b0614be7565b1a60f81b836131c0836044614d53565b815181106131d0576131d0614be7565b60200101906001600160f81b03191690815f1a905350600101613195565b505f6131fd6060860186614ba2565b905090505f5b600481101561326857613217816003614f58565b613222906008614d88565b63ffffffff8316901c60f81b8461323a836058614d53565b8151811061324a5761324a614be7565b60200101906001600160f81b03191690815f1a905350600101613203565b505f5b6132786060870187614ba2565b905081101561348c575f61328d826058614d88565b61329890605c614d53565b90505f5b6020811015613323576132b26060890189614ba2565b848181106132c2576132c2614be7565b90506020028101906132d49190614bfb565b3581602081106132e6576132e6614be7565b1a60f81b866132f58385614d53565b8151811061330557613305614be7565b60200101906001600160f81b03191690815f1a90535060010161329c565b505f5b60088110156133d85761333a816007614f58565b613345906008614d88565b61335260608a018a614ba2565b8581811061336257613362614be7565b90506020028101906133749190614bfb565b61338590604081019060200161499b565b6001600160401b0316901c60f81b86826133a0856020614d53565b6133aa9190614d53565b815181106133ba576133ba614be7565b60200101906001600160f81b03191690815f1a905350600101613326565b505f5b6030811015613482576133f16060890189614ba2565b8481811061340157613401614be7565b90506020028101906134139190614bfb565b613421906040810190614f6b565b8281811061343157613431614be7565b9050013560f81c60f81b868284602861344a9190614d53565b6134549190614d53565b8151811061346457613464614be7565b60200101906001600160f81b03191690815f1a9053506001016133db565b505060010161326b565b5091949350505050565b61349e6147b4565b5f8281525f805160206152228339815191526020526040808220815160e0810190925280545f805160206151e283398151915293929190829060ff1660058111156134eb576134eb6149b4565b60058111156134fc576134fc6149b4565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561356e5761356e6149b4565b1461358c5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156135d0576135d06149b4565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61367c8582612287565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146136f757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137465761370e816001614f58565b613719906008614d88565b61ffff1685828151811061372f5761372f614be7565b016020015160f81c901b91909117906001016136fa565b5061ffff81161561376a5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137c557613781816003614f58565b61378c906008614d88565b63ffffffff168661379e836002614d53565b815181106137ae576137ae614be7565b016020015160f81c901b919091179060010161376d565b5063ffffffff81166003146137ed57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138425761380481601f614f58565b61380f906008614d88565b8761381b836006614d53565b8151811061382b5761382b614be7565b016020015160f81c901b91909117906001016137f0565b505f8660268151811061385757613857614be7565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206151c28339815191528161389084610b81565b90505f61389c8761203b565b90506138a7876128b9565b6138c457604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156138d9576138d96149b4565b146138f75760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516139089190614d9f565b905083600201600a9054906101000a90046001600160401b031682604001516139319190614fad565b6001600160401b0316816001600160401b0316111561396357604051630c192e7760e41b815260040160405180910390fd5b5f8061396f8a84612287565b915091505f8a8360405160200161399d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff19166001836003811115613a3057613a306149b4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613b5f57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613bae57613b76816001614f58565b613b81906008614d88565b61ffff16858281518110613b9757613b97614be7565b016020015160f81c901b9190911790600101613b62565b5061ffff811615613bd25760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613c2d57613be9816003614f58565b613bf4906008614d88565b63ffffffff1686613c06836002614d53565b81518110613c1657613c16614be7565b016020015160f81c901b9190911790600101613bd5565b5063ffffffff8116600514613c5557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613caa57613c6c81601f614f58565b613c77906008614d88565b87613c83836006614d53565b81518110613c9357613c93614be7565b016020015160f81c901b9190911790600101613c58565b505f805b6008811015613d0957613cc2816007614f58565b613ccd906008614d88565b6001600160401b031688613ce2836026614d53565b81518110613cf257613cf2614be7565b016020015160f81c901b9190911790600101613cae565b5090969095509350505050565b5f805160206151e28339815191525f6001600160401b038084169085161115613d4a57613d438385614a8b565b9050613d57565b613d548484614a8b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613db9575060018401548151613db5916001600160401b031690614d53565b8210155b15613ddf576001600160401b038316606082015281815260408101516020820152613dfe565b8281606001818151613df19190614d9f565b6001600160401b03169052505b6060810151613e0e906064614fad565b602082015160018601546001600160401b039290921691613e399190600160401b900460ff16614d88565b1015613e585760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613e739190614d53565b9052506040810180516001600160401b0387169190613e93908390614f58565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206152228339815191526020526040812060020180545f805160206151e28339815191529190600890613f2990600160401b90046001600160401b0316614fd8565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f9d57604051631afcd79f60e31b815260040160405180910390fd5b565b613fa7613f54565b613fb08161448e565b613fb86144a7565b611b8f60608201356080830135613fd560c0850160a0860161499b565b613fe560e0860160c08701614ff3565b613ff6610100870160e0880161500c565b61400861012088016101008901614b87565b6144b7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661405157604051637fab81e560e01b815260040160405180910390fd5b5f805160206151e283398151915242614070604086016020870161499b565b6001600160401b03161115806140aa575061408e6202a30042614d53565b61409e604086016020870161499b565b6001600160401b031610155b156140c75760405162d36c8560e81b815260040160405180910390fd5b60306140d66040860186614f6b565b90501415806140e457508335155b156141025760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561413257604051630eb0d31360e11b815260040160405180910390fd5b61413c835f613d16565b5f806141d56040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614180919061499b565b6001600160401b0316815260200161419b60408a018a614f6b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506145d8565b5f828152600686016020526040902091935091506141f38282615070565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614231908590600401614b22565b6020604051808303815f875af115801561424d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142719190614ae9565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156142e9576142e96149b4565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916143c9918e01908e0161499b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561441e5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614467576040519150601f19603f3d011682016040523d82523d5f602084013e61446c565b606091505b505090508061200557604051630a12f52160e11b815260040160405180910390fd5b614496613f54565b61449e61469b565b611b8f816146a3565b6144af613f54565b613f9d614775565b6144bf613f54565b5f805160206151c283398151915261ffff841615806144e3575061271061ffff8516115b156145015760405163c98d73a760e01b815260040160405180910390fd5b8587111561452257604051630103be3b60e21b815260040160405180910390fd5b60ff831615806145355750600a60ff8416115b15614553576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461460157604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614633979695949392919061512b565b60405160208183030381529060405290506002816040516146549190614d42565b602060405180830381855afa15801561466f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906146929190614ae9565b94909350915050565b613f9d613f54565b6146ab613f54565b80355f805160206151e283398151915290815560146146d0606084016040850161500c565b60ff1611806146ef57506146ea606083016040840161500c565b60ff16155b1561470d5760405163b4fa3fb360e01b815260040160405180910390fd5b61471d606083016040840161500c565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561474e604083016020840161499b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612608613f54565b50805461478990614dbf565b5f825580601f10614798575050565b601f0160209004905f5260205f2090810190611b8f91906147f0565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614804575f81556001016147f1565b5090565b8015158114611b8f575f80fd5b803563ffffffff81168114612036575f80fd5b5f805f6060848603121561483a575f80fd5b83359250602084013561484c81614808565b915061485a60408501614815565b90509250925092565b5f60208284031215614873575f80fd5b5035919050565b5f610120828403121561488b575f80fd5b50919050565b803561ffff81168114612036575f80fd5b80356001600160401b0381168114612036575f80fd5b5f805f606084860312156148ca575f80fd5b83356001600160401b038111156148df575f80fd5b8401606081870312156148f0575f80fd5b92506148fe60208501614891565b915061485a604085016148a2565b5f6020828403121561491c575f80fd5b610bc482614815565b5f8060408385031215614936575f80fd5b61493f83614815565b946020939093013593505050565b5f806040838503121561495e575f80fd5b82356001600160401b03811115614973575f80fd5b830160808186031215614984575f80fd5b915061499260208401614815565b90509250929050565b5f602082840312156149ab575f80fd5b610bc4826148a2565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106149eb57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614a2660608401826001600160401b03169052565b506080830151614a4160808401826001600160401b03169052565b5060a0830151614a5c60a08401826001600160401b03169052565b5060c0830151612c4360c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612c4357612c43614a77565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614af9575f80fd5b5051919050565b5f5b83811015614b1a578181015183820152602001614b02565b50505f910152565b602081525f8251806020840152614b40816040850160208701614b00565b601f01601f19169190910160400192915050565b5f82614b6e57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114611b8f575f80fd5b5f60208284031215614b97575f80fd5b8135610bc481614b73565b5f808335601e19843603018112614bb7575f80fd5b8301803591506001600160401b03821115614bd0575f80fd5b6020019150600581901b36038213156123d7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614c0f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614c4f57614c4f614c19565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c7d57614c7d614c19565b604052919050565b5f6001600160401b03821115614c9d57614c9d614c19565b50601f01601f191660200190565b5f60608236031215614cbb575f80fd5b614cc3614c2d565b823581526020614cd48185016148a2565b8183015260408401356001600160401b03811115614cf0575f80fd5b840136601f820112614d00575f80fd5b8035614d13614d0e82614c85565b614c55565b8181523684838501011115614d26575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614c0f818460208701614b00565b80820180821115610b9157610b91614a77565b5f63ffffffff808316818103614d7e57614d7e614a77565b6001019392505050565b8082028115828204841417610b9157610b91614a77565b6001600160401b03818116838216019080821115612c4357612c43614a77565b600181811c90821680614dd357607f821691505b60208210810361488b57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614e0381614dbf565b806020870152604060018084165f8114614e245760018114614e4057614e6d565b60ff19851660408a0152604084151560051b8a01019550614e6d565b895f5260205f205f5b85811015614e645781548b8201860152908301908801614e49565b8a016040019650505b509398975050505050505050565b805161203681614808565b5f8060408385031215614e97575f80fd5b82516001600160401b0380821115614ead575f80fd5b9084019060608287031215614ec0575f80fd5b614ec8614c2d565b82518152602080840151614edb81614b73565b82820152604084015183811115614ef0575f80fd5b80850194505087601f850112614f04575f80fd5b83519250614f14614d0e84614c85565b8381528882858701011115614f27575f80fd5b614f3684838301848801614b00565b80604084015250819550614f4b818801614e7b565b9450505050509250929050565b81810381811115610b9157610b91614a77565b5f808335601e19843603018112614f80575f80fd5b8301803591506001600160401b03821115614f99575f80fd5b6020019150368190038213156123d7575f80fd5b6001600160401b03818116838216028082169190828114614fd057614fd0614a77565b505092915050565b5f6001600160401b03808316818103614d7e57614d7e614a77565b5f60208284031215615003575f80fd5b610bc482614891565b5f6020828403121561501c575f80fd5b813560ff81168114610bc4575f80fd5b601f82111561200557805f5260205f20601f840160051c810160208510156150515750805b601f840160051c820191505b81811015610c65575f815560010161505d565b81516001600160401b0381111561508957615089614c19565b61509d816150978454614dbf565b8461502c565b602080601f8311600181146150d0575f84156150b95750858301515b5f19600386901b1c1916600185901b178555612952565b5f85815260208120601f198616915b828110156150fe578886015182559484019460019091019084016150df565b508582101561511b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161518081604e860160208901614b00565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumDelegatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"subnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"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\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b5060405161542b38038061542b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6152de8061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d83660046148c2565b61058b565b005b3480156101ea575f80fd5b506101dd6101f93660046148fd565b61093e565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd610243366004614914565b610ac5565b348015610253575f80fd5b506102676102623660046148fd565b610ba2565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e7366004614952565b610bb8565b604051908152602001610220565b348015610305575f80fd5b506101dd6103143660046149a6565b610bec565b348015610324575f80fd5b506101dd6103333660046149bf565b610c8d565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b3660046149e7565b611062565b34801561038b575f80fd5b506102ec61039a366004614a35565b6114ee565b3480156103aa575f80fd5b506102676103b93660046148fd565b611507565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb3660046148c2565b61151b565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e3660046148fd565b6116e6565b34801561042e575f80fd5b506101dd61043d3660046149bf565b6117a4565b34801561044d575f80fd5b506101dd61045c3660046148fd565b611952565b34801561046c575f80fd5b506101dd61047b3660046149a6565b611bcc565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b43660046148fd565b611d53565b3480156104c4575f80fd5b506101dd6104d33660046148fd565b611f32565b6102ec6104e63660046148fd565b612071565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e6105193660046148fd565b6120a2565b6040516102209190614a76565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b3660046148fd565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206152328339815191526020526040808220815160e0810190925280545f8051602061525283398151915293929190829060ff1660038111156105d8576105d8614a4e565b60038111156105e9576105e9614a4e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61065f826120a2565b905060028351600381111561067657610676614a4e565b146106a0578251604051633b0d540d60e21b81526106979190600401614adf565b60405180910390fd5b60208301516001600160a01b031633146106cd5760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f806002835160058111156106eb576106eb614a4e565b0361073c57871561070357610700848861216a565b91505b5f856060015184608001516107189190614b0d565b905061072485826122ee565b506001600160401b031660c08701525042905061076e565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b590610793906114ee565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016107c39796959493929190614b2d565b602060405180830381865afa1580156107de573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108029190614b6b565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561084157610841614a4e565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061092b9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206152b28339815191526020526040808220815160e0810190925280545f8051602061527283398151915293929190829060ff16600581111561098b5761098b614a4e565b600581111561099c5761099c614a4e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a0b57610a0b614a4e565b14610a3e575f8381526007830160205260409081902054905163170cc93360e21b81526106979160ff1690600401614b82565b6005600160991b016001600160a01b031663ee5b48eb610a638584606001515f612445565b6040518263ffffffff1660e01b8152600401610a7f9190614bb2565b6020604051808303815f875af1158015610a9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abf9190614b6b565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b0e575080546001600160401b03808416911610155b15610b2c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b5683612494565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610bb264e8d4a5100083614be4565b92915050565b5f610bc16124a5565b610bcd848484346124dc565b9050610be560015f8051602061529283398151915255565b9392505050565b5f805160206152528339815191525f80610c0584612682565b91509150610c1282612923565b610c1c5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c4b57610c4b614a4e565b03610c70575f83815260078501602052604081208054919055610c6e828261295e565b505b610c8681610c8184604001516114ee565b6129c4565b5050505050565b5f8181525f805160206152328339815191526020526040808220815160e0810190925280545f8051602061525283398151915293929190829060ff166003811115610cda57610cda614a4e565b6003811115610ceb57610ceb614a4e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610d62906120a2565b9050600182516003811115610d7957610d79614a4e565b14610d9a578151604051633b0d540d60e21b81526106979190600401614adf565b600381516005811115610daf57610daf614a4e565b03610ef857600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610e0957610e09614a4e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610f0d57610f0d614a4e565b03610f1b57610c86846129d7565b5f610f2586612bb4565b90505f80610f368360400151612cb4565b509150915081856040015114610f5f57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610fa757505f8781526005870160205260409020600201546001600160401b03808316600160801b90920416115b15610fd057604051632e19bc2d60e11b81526001600160401b0382166004820152602401610697565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206152728339815191529060ff16156110b457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111b9190614b6b565b83602001351461113e5760405163d040949d60e01b815260040160405180910390fd5b3061114f6060850160408601614c17565b6001600160a01b0316146111765760405163e6c4247b60e01b815260040160405180910390fd5b5f6111846060850185614c32565b905090505f805b828163ffffffff161015611430575f6111a76060880188614c32565b8363ffffffff168181106111bd576111bd614c77565b90506020028101906111cf9190614c8b565b6111d890614d3b565b80515f818152600888016020526040902054919250901561120c57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161123b92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261125591614dd2565b602060405180830381855afa158015611270573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112939190614b6b565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561131f5761131f614a4e565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113d2911686614de3565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061142990614df6565b905061118b565b50600483018190555f61144285612bb4565b90505f6114528260400151612ef2565b90505f61145e88613067565b90505f6002826040516114719190614dd2565b602060405180830381855afa15801561148c573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114af9190614b6b565b90508281146114d45760405163884eab3360e01b815260048101829052602401610697565b5050506009909301805460ff191660011790555050505050565b5f610bb26001600160401b03831664e8d4a51000614e18565b5f611511826120a2565b6080015192915050565b5f805160206152528339815191525f61153385613500565b905061153e85612923565b611549575050505050565b5f8581526004830160205260409020546001600160a01b031633146115815760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516115b091600160b01b90046001600160401b031690614e2f565b6001600160401b03168160c001516001600160401b031610156115e6576040516302336bad60e51b815260040160405180910390fd5b8315610c86575f6115f7868561216a565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b590611647906114ee565b60a085015160c08601516040516001600160e01b031960e086901b16815261167b939291829188905f908190600401614b2d565b602060405180830381865afa158015611696573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ba9190614b6b565b5f878152600785016020526040812080549091906116d9908490614de3565b9091555050505050505050565b5f805160206152528339815191525f6116fe836120a2565b905060048151600581111561171557611715614a4e565b1461173657805160405163170cc93360e21b81526106979190600401614b82565b5f8381526004830160205260409020546001600160a01b0316331461176e5760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610abf906001600160a01b03168261295e565b6117ac6124a5565b5f8181525f805160206152328339815191526020526040808220815160e0810190925280545f8051602061525283398151915293929190829060ff1660038111156117f9576117f9614a4e565b600381111561180a5761180a614a4e565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f61187885612bb4565b90505f806118898360400151612cb4565b5091509150818460400151146118b257604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156118f457604051632e19bc2d60e11b81526001600160401b0382166004820152602401610697565b60038451600381111561190957611909614a4e565b1461192a578351604051633b0d540d60e21b81526106979190600401614adf565b611933866129d7565b505050505061194e60015f8051602061529283398151915255565b5050565b61195a6124a5565b5f8181525f805160206152328339815191526020526040808220815160e0810190925280545f8051602061525283398151915293929190829060ff1660038111156119a7576119a7614a4e565b60038111156119b8576119b8614a4e565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611a2e826120a2565b90505f83516003811115611a4457611a44614a4e565b03611a6257604051631d0b665760e21b815260040160405180910390fd5b600481516005811115611a7757611a77614a4e565b14611a9857805160405163170cc93360e21b81526106979190600401614b82565b600183516003811115611aad57611aad614a4e565b03611ac457611abb856129d7565b50505050611bb3565b600283516003811115611ad957611ad9614a4e565b03611ba557600384015460608401516001600160a01b039091169063778c06b590611b03906114ee565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b168152611b5596959493926001600160401b0390921691908190600401614b2d565b602060405180830381865afa158015611b70573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b949190614b6b565b5f8681526006860160205260409020555b611bae856129d7565b505050505b611bc960015f8051602061529283398151915255565b50565b5f805160206152728339815191525f611be483612bb4565b90505f80611bf58360400151613752565b9150915080611c1757604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068501602052604090208054611c3190614e4f565b90505f03611c5257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115611c7857611c78614a4e565b14611cab575f8281526007850160205260409081902054905163170cc93360e21b81526106979160ff1690600401614b82565b5f8281526006850160205260408120611cc391614817565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206152328339815191526020526040808220815160e0810190925280545f8051602061525283398151915293929190829060ff166003811115611da057611da0614a4e565b6003811115611db157611db1614a4e565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611e2a57611e2a614a4e565b14158015611e4b5750600381516003811115611e4857611e48614a4e565b14155b15611e6c578051604051633b0d540d60e21b81526106979190600401614adf565b5f611e7a82604001516120a2565b905080606001516001600160401b03165f03611ea957604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611ed6846040015184606001518560800151612445565b6040518263ffffffff1660e01b8152600401611ef29190614bb2565b6020604051808303815f875af1158015611f0e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c869190614b6b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206152728339815191529190611f7990614e4f565b90505f03611f9a57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611fc057611fc0614a4e565b14611ff3575f8281526007820160205260409081902054905163170cc93360e21b81526106979160ff1690600401614b82565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161202c9190600401614e81565b6020604051808303815f875af1158015612048573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061206c9190614b6b565b505050565b5f61207a6124a5565b6120858233346138f6565b905061209d60015f8051602061529283398151915255565b919050565b6120aa61484e565b5f8281525f805160206152b2833981519152602052604090819020815160e0810190925280545f80516020615272833981519152929190829060ff1660058111156120f7576120f7614a4e565b600581111561210857612108614a4e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156121b5573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121dc9190810190614f16565b91509150806121fe57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612241573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122659190614b6b565b8251146122855760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156122b15760405163e6c4247b60e01b815260040160405180910390fd5b5f806122c08460400151613bc8565b915091508187146122e457604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f805160206152b2833981519152602052604081206002015481905f8051602061527283398151915290600160801b90046001600160401b03166123368582613da3565b5f61234087613f7d565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123908a858b612445565b6040518263ffffffff1660e01b81526004016123ac9190614bb2565b6020604051808303815f875af11580156123c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123ec9190614b6b565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b61249c613ff2565b611bc98161403d565b5f805160206152928339815191528054600119016124d657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061525283398151915290600160401b900461ffff9081169086161080612530575061271061ffff8616115b1561254e5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612580576040516302336bad60e51b815260040160405180910390fd5b80548310806125925750806001015483115b156125b057604051630103be3b60e21b815260040160405180910390fd5b825f6125bb82610ba2565b90505f6125c889836140ab565b905060405180606001604052806125dc3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061529283398151915255565b5f61268b61484e565b5f805160206152728339815191525f6126a385612bb4565b90505f806126b48360400151613752565b9150915080156126d757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561270857612708614a4e565b600581111561271957612719614a4e565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561278857612788614a4e565b141580156127a957506001815160058111156127a6576127a6614a4e565b14155b156127ca57805160405163170cc93360e21b81526106979190600401614b82565b6003815160058111156127df576127df614a4e565b036127ed57600481526127f2565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561283757612837614a4e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156128eb576128eb614a4e565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156129aa575f80fd5b505af11580156129bc573d5f803e3d5ffd5b505050505050565b61194e6001600160a01b03831682614495565b5f8181525f805160206152328339815191526020526040808220815160e0810190925280545f8051602061525283398151915293929190829060ff166003811115612a2457612a24614a4e565b6003811115612a3557612a35614a4e565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612b0a90600160a01b900461ffff1684614e18565b612b149190614be4565b905080856007015f8581526020019081526020015f205f828254612b389190614de3565b909155505f9050612b498284614fe8565b9050612b5985602001518261295e565b612b6e8560200151610c8187606001516114ee565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612c18573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612c3f9190810190614f16565b9150915080612c6157604051636b2f19e960e01b815260040160405180910390fd5b815115612c815760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612cad5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612cd957604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612d2857612cf0816001614fe8565b612cfb906008614e18565b61ffff16868281518110612d1157612d11614c77565b016020015160f81c901b9190911790600101612cdc565b5061ffff811615612d4c5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612da757612d63816003614fe8565b612d6e906008614e18565b63ffffffff1687612d80836002614de3565b81518110612d9057612d90614c77565b016020015160f81c901b9190911790600101612d4f565b5063ffffffff8116600414612dcf57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612e2457612de681601f614fe8565b612df1906008614e18565b88612dfd836006614de3565b81518110612e0d57612e0d614c77565b016020015160f81c901b9190911790600101612dd2565b505f805b6008811015612e8357612e3c816007614fe8565b612e47906008614e18565b6001600160401b031689612e5c836026614de3565b81518110612e6c57612e6c614c77565b016020015160f81c901b9190911790600101612e28565b505f805b6008811015612ee257612e9b816007614fe8565b612ea6906008614e18565b6001600160401b03168a612ebb83602e614de3565b81518110612ecb57612ecb614c77565b016020015160f81c901b9190911790600101612e87565b5091989097509095509350505050565b5f8151602614612f1557604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612f6457612f2c816001614fe8565b612f37906008614e18565b61ffff16848281518110612f4d57612f4d614c77565b016020015160f81c901b9190911790600101612f18565b5061ffff811615612f885760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612fe357612f9f816003614fe8565b612faa906008614e18565b63ffffffff1685612fbc836002614de3565b81518110612fcc57612fcc614c77565b016020015160f81c901b9190911790600101612f8b565b5063ffffffff81161561300957604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561305e5761302081601f614fe8565b61302b906008614e18565b86613037836006614de3565b8151811061304757613047614c77565b016020015160f81c901b919091179060010161300c565b50949350505050565b60605f61307683830184614c32565b61308291506058614e18565b61308d90605c614de3565b6001600160401b038111156130a4576130a4614ca9565b6040519080825280601f01601f1916602001820160405280156130ce576020820181803683370190505b5090505f5b602081101561312357833581602081106130ef576130ef614c77565b1a60f81b82828151811061310557613105614c77565b60200101906001600160f81b03191690815f1a9053506001016130d3565b505f5b6020811015613183578360200135816020811061314557613145614c77565b1a60f81b82613155836020614de3565b8151811061316557613165614c77565b60200101906001600160f81b03191690815f1a905350600101613126565b505f5b60048110156131e65761319a816003614fe8565b6131a5906008614e18565b6014901c60f81b826131b8836040614de3565b815181106131c8576131c8614c77565b60200101906001600160f81b03191690815f1a905350600101613186565b505f6131f86060850160408601614c17565b60601b90505f5b60148110156132585781816014811061321a5761321a614c77565b1a60f81b8361322a836044614de3565b8151811061323a5761323a614c77565b60200101906001600160f81b03191690815f1a9053506001016131ff565b505f6132676060860186614c32565b905090505f5b60048110156132d257613281816003614fe8565b61328c906008614e18565b63ffffffff8316901c60f81b846132a4836058614de3565b815181106132b4576132b4614c77565b60200101906001600160f81b03191690815f1a90535060010161326d565b505f5b6132e26060870187614c32565b90508110156134f6575f6132f7826058614e18565b61330290605c614de3565b90505f5b602081101561338d5761331c6060890189614c32565b8481811061332c5761332c614c77565b905060200281019061333e9190614c8b565b35816020811061335057613350614c77565b1a60f81b8661335f8385614de3565b8151811061336f5761336f614c77565b60200101906001600160f81b03191690815f1a905350600101613306565b505f5b6008811015613442576133a4816007614fe8565b6133af906008614e18565b6133bc60608a018a614c32565b858181106133cc576133cc614c77565b90506020028101906133de9190614c8b565b6133ef906040810190602001614a35565b6001600160401b0316901c60f81b868261340a856020614de3565b6134149190614de3565b8151811061342457613424614c77565b60200101906001600160f81b03191690815f1a905350600101613390565b505f5b60308110156134ec5761345b6060890189614c32565b8481811061346b5761346b614c77565b905060200281019061347d9190614c8b565b61348b906040810190614ffb565b8281811061349b5761349b614c77565b9050013560f81c60f81b86828460286134b49190614de3565b6134be9190614de3565b815181106134ce576134ce614c77565b60200101906001600160f81b03191690815f1a905350600101613445565b50506001016132d5565b5091949350505050565b61350861484e565b5f8281525f805160206152b28339815191526020526040808220815160e0810190925280545f8051602061527283398151915293929190829060ff16600581111561355557613555614a4e565b600581111561356657613566614a4e565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156135d8576135d8614a4e565b1461360b575f8481526007830160205260409081902054905163170cc93360e21b81526106979160ff1690600401614b82565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561364f5761364f614a4e565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6136fb85826122ee565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461377657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137c55761378d816001614fe8565b613798906008614e18565b61ffff168582815181106137ae576137ae614c77565b016020015160f81c901b9190911790600101613779565b5061ffff8116156137e95760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561384457613800816003614fe8565b61380b906008614e18565b63ffffffff168661381d836002614de3565b8151811061382d5761382d614c77565b016020015160f81c901b91909117906001016137ec565b5063ffffffff811660031461386c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138c15761388381601f614fe8565b61388e906008614e18565b8761389a836006614de3565b815181106138aa576138aa614c77565b016020015160f81c901b919091179060010161386f565b505f866026815181106138d6576138d6614c77565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206152528339815191528161390f84610ba2565b90505f61391b876120a2565b905061392687612923565b61394357604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561395857613958614a4e565b1461397957805160405163170cc93360e21b81526106979190600401614b82565b5f82826080015161398a9190614e2f565b905083600201600a9054906101000a90046001600160401b031682604001516139b3919061503d565b6001600160401b0316816001600160401b031611156139f057604051636d51fe0560e11b81526001600160401b0382166004820152602401610697565b5f806139fc8a846122ee565b915091505f8a83604051602001613a2a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff19166001836003811115613abd57613abd614a4e565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613bec57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613c3b57613c03816001614fe8565b613c0e906008614e18565b61ffff16858281518110613c2457613c24614c77565b016020015160f81c901b9190911790600101613bef565b5061ffff811615613c5f5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613cba57613c76816003614fe8565b613c81906008614e18565b63ffffffff1686613c93836002614de3565b81518110613ca357613ca3614c77565b016020015160f81c901b9190911790600101613c62565b5063ffffffff8116600514613ce257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613d3757613cf981601f614fe8565b613d04906008614e18565b87613d10836006614de3565b81518110613d2057613d20614c77565b016020015160f81c901b9190911790600101613ce5565b505f805b6008811015613d9657613d4f816007614fe8565b613d5a906008614e18565b6001600160401b031688613d6f836026614de3565b81518110613d7f57613d7f614c77565b016020015160f81c901b9190911790600101613d3b565b5090969095509350505050565b5f805160206152728339815191525f6001600160401b038084169085161115613dd757613dd08385614b0d565b9050613de4565b613de18484614b0d565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613e46575060018401548151613e42916001600160401b031690614de3565b8210155b15613e6c576001600160401b038316606082015281815260408101516020820152613e8b565b8281606001818151613e7e9190614e2f565b6001600160401b03169052505b6060810151613e9b90606461503d565b602082015160018601546001600160401b039290921691613ec69190600160401b900460ff16614e18565b1015613ef657606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610697565b856001600160401b031681604001818151613f119190614de3565b9052506040810180516001600160401b0387169190613f31908390614fe8565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206152b28339815191526020526040812060020180545f805160206152728339815191529190600890613fc790600160401b90046001600160401b0316615068565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661403b57604051631afcd79f60e31b815260040160405180910390fd5b565b614045613ff2565b61404e81614528565b614056614541565b611bc96060820135608083013561407360c0850160a08601614a35565b61408360e0860160c08701615083565b614094610100870160e0880161509c565b6140a661012088016101008901614c17565b614551565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166140ef57604051637fab81e560e01b815260040160405180910390fd5b5f805160206152728339815191524261410e6040860160208701614a35565b6001600160401b0316111580614148575061412c6202a30042614de3565b61413c6040860160208701614a35565b6001600160401b031610155b156141655760405162d36c8560e81b815260040160405180910390fd5b60306141746040860186614ffb565b905014158061418257508335155b156141a05760405163b4fa3fb360e01b815260040160405180910390fd5b83355f908152600882016020526040902054156141d057604051630eb0d31360e11b815260040160405180910390fd5b6141da835f613da3565b5f806142736040518060a00160405280855f01548152602001885f01358152602001876001600160401b0316815260200188602001602081019061421e9190614a35565b6001600160401b0316815260200161423960408a018a614ffb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614672565b5f828152600686016020526040902091935091506142918282615100565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906142cf908590600401614bb2565b6020604051808303815f875af11580156142eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061430f9190614b6b565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561438757614387614a4e565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614467918e01908e01614a35565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156144b85760405163cd78605960e01b8152306004820152602401610697565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614501576040519150601f19603f3d011682016040523d82523d5f602084013e614506565b606091505b505090508061206c57604051630a12f52160e11b815260040160405180910390fd5b614530613ff2565b614538614735565b611bc98161473d565b614549613ff2565b61403b61480f565b614559613ff2565b5f8051602061525283398151915261ffff8416158061457d575061271061ffff8516115b1561459b5760405163c98d73a760e01b815260040160405180910390fd5b858711156145bc57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806145cf5750600a60ff8416115b156145ed576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461469b57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016146cd97969594939291906151bb565b60405160208183030381529060405290506002816040516146ee9190614dd2565b602060405180830381855afa158015614709573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061472c9190614b6b565b94909350915050565b61403b613ff2565b614745613ff2565b80355f80516020615272833981519152908155601461476a606084016040850161509c565b60ff1611806147895750614784606083016040840161509c565b60ff16155b156147a75760405163b4fa3fb360e01b815260040160405180910390fd5b6147b7606083016040840161509c565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556147e86040830160208401614a35565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61266f613ff2565b50805461482390614e4f565b5f825580601f10614832575050565b601f0160209004905f5260205f2090810190611bc9919061488a565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561489e575f815560010161488b565b5090565b8015158114611bc9575f80fd5b803563ffffffff8116811461209d575f80fd5b5f805f606084860312156148d4575f80fd5b8335925060208401356148e6816148a2565b91506148f4604085016148af565b90509250925092565b5f6020828403121561490d575f80fd5b5035919050565b5f6101208284031215614925575f80fd5b50919050565b803561ffff8116811461209d575f80fd5b80356001600160401b038116811461209d575f80fd5b5f805f60608486031215614964575f80fd5b83356001600160401b03811115614979575f80fd5b84016060818703121561498a575f80fd5b92506149986020850161492b565b91506148f46040850161493c565b5f602082840312156149b6575f80fd5b610be5826148af565b5f80604083850312156149d0575f80fd5b6149d9836148af565b946020939093013593505050565b5f80604083850312156149f8575f80fd5b82356001600160401b03811115614a0d575f80fd5b830160808186031215614a1e575f80fd5b9150614a2c602084016148af565b90509250929050565b5f60208284031215614a45575f80fd5b610be58261493c565b634e487b7160e01b5f52602160045260245ffd5b60068110614a7257614a72614a4e565b9052565b5f60e082019050614a88828451614a62565b6020830151602083015260408301516001600160401b0380821660408501528060608601511660608501528060808601511660808501528060a08601511660a08501528060c08601511660c0850152505092915050565b6020810160048310614af357614af3614a4e565b91905290565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612cad57612cad614af9565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614b7b575f80fd5b5051919050565b60208101610bb28284614a62565b5f5b83811015614baa578181015183820152602001614b92565b50505f910152565b602081525f8251806020840152614bd0816040850160208701614b90565b601f01601f19169190910160400192915050565b5f82614bfe57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114611bc9575f80fd5b5f60208284031215614c27575f80fd5b8135610be581614c03565b5f808335601e19843603018112614c47575f80fd5b8301803591506001600160401b03821115614c60575f80fd5b6020019150600581901b360382131561243e575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614c9f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614cdf57614cdf614ca9565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614d0d57614d0d614ca9565b604052919050565b5f6001600160401b03821115614d2d57614d2d614ca9565b50601f01601f191660200190565b5f60608236031215614d4b575f80fd5b614d53614cbd565b823581526020614d6481850161493c565b8183015260408401356001600160401b03811115614d80575f80fd5b840136601f820112614d90575f80fd5b8035614da3614d9e82614d15565b614ce5565b8181523684838501011115614db6575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614c9f818460208701614b90565b80820180821115610bb257610bb2614af9565b5f63ffffffff808316818103614e0e57614e0e614af9565b6001019392505050565b8082028115828204841417610bb257610bb2614af9565b6001600160401b03818116838216019080821115612cad57612cad614af9565b600181811c90821680614e6357607f821691505b60208210810361492557634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614e9381614e4f565b806020870152604060018084165f8114614eb45760018114614ed057614efd565b60ff19851660408a0152604084151560051b8a01019550614efd565b895f5260205f205f5b85811015614ef45781548b8201860152908301908801614ed9565b8a016040019650505b509398975050505050505050565b805161209d816148a2565b5f8060408385031215614f27575f80fd5b82516001600160401b0380821115614f3d575f80fd5b9084019060608287031215614f50575f80fd5b614f58614cbd565b82518152602080840151614f6b81614c03565b82820152604084015183811115614f80575f80fd5b80850194505087601f850112614f94575f80fd5b83519250614fa4614d9e84614d15565b8381528882858701011115614fb7575f80fd5b614fc684838301848801614b90565b80604084015250819550614fdb818801614f0b565b9450505050509250929050565b81810381811115610bb257610bb2614af9565b5f808335601e19843603018112615010575f80fd5b8301803591506001600160401b03821115615029575f80fd5b60200191503681900382131561243e575f80fd5b6001600160401b0381811683821602808216919082811461506057615060614af9565b505092915050565b5f6001600160401b03808316818103614e0e57614e0e614af9565b5f60208284031215615093575f80fd5b610be58261492b565b5f602082840312156150ac575f80fd5b813560ff81168114610be5575f80fd5b601f82111561206c57805f5260205f20601f840160051c810160208510156150e15750805b601f840160051c820191505b81811015610c86575f81556001016150ed565b81516001600160401b0381111561511957615119614ca9565b61512d816151278454614e4f565b846150bc565b602080601f831160018114615160575f84156151495750858301515b5f19600386901b1c1916600185901b1785556129bc565b5f85815260208120601f198616915b8281101561518e5788860151825594840194600190910190840161516f565b50858210156151ab57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161521081604e860160208901614b90565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 a59f4e021..b98a7d957 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -71,8 +71,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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"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\":\"UnexpectedRegistrationStatus\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161318538038061318583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130388061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806397fb70d4116100a9578063d588c18f1161006e578063d588c18f14610290578063d5f20ff6146102a3578063df93d8de146102c3578063e7d14c1c146102cd578063f2fde38b1461030b575f80fd5b806397fb70d414610241578063a3a65e4814610254578063b771b3bc14610267578063bee0a03f14610275578063c974d1b614610288575f80fd5b8063715018a6116100ef578063715018a6146101b3578063732214f8146101bb5780638280a25a146101d05780638994ab49146101ea5780638da5cb5b146101fd575f80fd5b80630322ed981461012b578063467ef06f1461014057806360305d621461015357806361e2f4901461017557806366435abf14610188575b5f80fd5b61013e61013936600461270c565b61031e565b005b61013e61014e36600461273b565b610490565b61015b601481565b60405163ffffffff90911681526020015b60405180910390f35b61013e610183366004612754565b61049e565b61019b61019636600461270c565b610922565b6040516001600160401b03909116815260200161016c565b61013e610936565b6101c25f81565b60405190815260200161016c565b6101d8603081565b60405160ff909116815260200161016c565b6101c26101f83660046127ce565b610949565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161016c565b61013e61024f36600461270c565b610965565b61013e61026236600461273b565b61097a565b6102296005600160991b0181565b61013e61028336600461270c565b610aec565b6101d8601481565b61013e61029e366004612823565b610c11565b6102b66102b136600461270c565b610d1f565b60405161016c919061286d565b61019b6202a30081565b6101c26102db36600461270c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61013e61031936600461291c565b610de7565b5f8181525f8051602061300c8339815191526020526040808220815160e0810190925280545f80516020612fec83398151915293929190829060ff16600581111561036b5761036b612859565b600581111561037c5761037c612859565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb612859565b146104095760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042e8584606001515f610e29565b6040518263ffffffff1660e01b815260040161044a9190612960565b6020604051808303815f875af1158015610466573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048a9190612992565b50505050565b61049981610e78565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020612fec8339815191529060ff16156104f057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610533573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105579190612992565b83602001351461057a5760405163d040949d60e01b815260040160405180910390fd5b3061058b606085016040860161291c565b6001600160a01b0316146105b25760405163e6c4247b60e01b815260040160405180910390fd5b5f6105c060608501856129a9565b905090505f805b828163ffffffff16101561086c575f6105e360608801886129a9565b8363ffffffff168181106105f9576105f96129ee565b905060200281019061060b9190612a02565b61061490612ab2565b80515f818152600888016020526040902054919250901561064857604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161067792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261069191612b49565b602060405180830381855afa1580156106ac573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906106cf9190612992565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561075b5761075b612859565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161080e911686612b6e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061086590612b81565b90506105c7565b50600483018190555f61087e85611116565b90505f61088e8260400151611216565b90505f61089a8861138b565b9050816002826040516108ad9190612b49565b602060405180830381855afa1580156108c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108eb9190612992565b1461090957604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61092c82610d1f565b6080015192915050565b61093e611824565b6109475f61187f565b565b5f610952611824565b61095c83836118ef565b90505b92915050565b61096d611824565b61097681611cd9565b5050565b5f80516020612fec8339815191525f61099283611116565b90505f806109a38360400151611f16565b91509150806109c557604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546109df90612ba3565b90505f03610a0057604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115610a2657610a26612859565b14610a445760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120610a5c91612681565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020612fec8339815191529190610b3390612ba3565b90505f03610b5457604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115610b7a57610b7a612859565b14610b985760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bd19190600401612bd5565b6020604051808303815f875af1158015610bed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104999190612992565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610c555750825b90505f826001600160401b03166001148015610c705750303b155b905081158015610c7e575080155b15610c9c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cc657845460ff60401b1916600160401b1785555b610cd087876120ba565b8315610d1657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610d276126b8565b5f8281525f8051602061300c833981519152602052604090819020815160e0810190925280545f80516020612fec833981519152929190829060ff166005811115610d7457610d74612859565b6005811115610d8557610d85612859565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610def611824565b6001600160a01b038116610e1d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610e268161187f565b50565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f610e816126b8565b5f80516020612fec8339815191525f610e9985611116565b90505f80610eaa8360400151611f16565b915091508015610ecd57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610efe57610efe612859565b6005811115610f0f57610f0f612859565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610f7e57610f7e612859565b14158015610f9f5750600181516005811115610f9c57610f9c612859565b14155b15610fbd5760405163a36c527f60e01b815260040160405180910390fd5b600381516005811115610fd257610fd2612859565b03610fe05760048152610fe5565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561102a5761102a612859565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156110de576110de612859565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561117a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111a19190810190612c6e565b91509150806111c357604051636b2f19e960e01b815260040160405180910390fd5b8151156111e35760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561120f5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f815160261461123957604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561128857611250816001612d40565b61125b906008612d53565b61ffff16848281518110611271576112716129ee565b016020015160f81c901b919091179060010161123c565b5061ffff8116156112ac5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015611307576112c3816003612d40565b6112ce906008612d53565b63ffffffff16856112e0836002612b6e565b815181106112f0576112f06129ee565b016020015160f81c901b91909117906001016112af565b5063ffffffff81161561132d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156113825761134481601f612d40565b61134f906008612d53565b8661135b836006612b6e565b8151811061136b5761136b6129ee565b016020015160f81c901b9190911790600101611330565b50949350505050565b60605f61139a838301846129a9565b6113a691506058612d53565b6113b190605c612b6e565b6001600160401b038111156113c8576113c8612a20565b6040519080825280601f01601f1916602001820160405280156113f2576020820181803683370190505b5090505f5b60208110156114475783358160208110611413576114136129ee565b1a60f81b828281518110611429576114296129ee565b60200101906001600160f81b03191690815f1a9053506001016113f7565b505f5b60208110156114a75783602001358160208110611469576114696129ee565b1a60f81b82611479836020612b6e565b81518110611489576114896129ee565b60200101906001600160f81b03191690815f1a90535060010161144a565b505f5b600481101561150a576114be816003612d40565b6114c9906008612d53565b6014901c60f81b826114dc836040612b6e565b815181106114ec576114ec6129ee565b60200101906001600160f81b03191690815f1a9053506001016114aa565b505f61151c606085016040860161291c565b60601b90505f5b601481101561157c5781816014811061153e5761153e6129ee565b1a60f81b8361154e836044612b6e565b8151811061155e5761155e6129ee565b60200101906001600160f81b03191690815f1a905350600101611523565b505f61158b60608601866129a9565b905090505f5b60048110156115f6576115a5816003612d40565b6115b0906008612d53565b63ffffffff8316901c60f81b846115c8836058612b6e565b815181106115d8576115d86129ee565b60200101906001600160f81b03191690815f1a905350600101611591565b505f5b61160660608701876129a9565b905081101561181a575f61161b826058612d53565b61162690605c612b6e565b90505f5b60208110156116b15761164060608901896129a9565b84818110611650576116506129ee565b90506020028101906116629190612a02565b358160208110611674576116746129ee565b1a60f81b866116838385612b6e565b81518110611693576116936129ee565b60200101906001600160f81b03191690815f1a90535060010161162a565b505f5b6008811015611766576116c8816007612d40565b6116d3906008612d53565b6116e060608a018a6129a9565b858181106116f0576116f06129ee565b90506020028101906117029190612a02565b611713906040810190602001612d6a565b6001600160401b0316901c60f81b868261172e856020612b6e565b6117389190612b6e565b81518110611748576117486129ee565b60200101906001600160f81b03191690815f1a9053506001016116b4565b505f5b60308110156118105761177f60608901896129a9565b8481811061178f5761178f6129ee565b90506020028101906117a19190612a02565b6117af906040810190612d83565b828181106117bf576117bf6129ee565b9050013560f81c60f81b86828460286117d89190612b6e565b6117e29190612b6e565b815181106117f2576117f26129ee565b60200101906001600160f81b03191690815f1a905350600101611769565b50506001016115f9565b5091949350505050565b336118567f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109475760405163118cdaa760e01b8152336004820152602401610e14565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661193357604051637fab81e560e01b815260040160405180910390fd5b5f80516020612fec833981519152426119526040860160208701612d6a565b6001600160401b031611158061198c57506119706202a30042612b6e565b6119806040860160208701612d6a565b6001600160401b031610155b156119a95760405162d36c8560e81b815260040160405180910390fd5b60306119b86040860186612d83565b90501415806119c657508335155b156119e45760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415611a1457604051630eb0d31360e11b815260040160405180910390fd5b611a1e835f6120d4565b5f80611ab76040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611a629190612d6a565b6001600160401b03168152602001611a7d60408a018a612d83565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061229d565b5f82815260068601602052604090209193509150611ad58282612e10565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90611b13908590600401612960565b6020604051808303815f875af1158015611b2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b539190612992565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115611bcb57611bcb612859565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611cab918e01908e01612d6a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611ce16126b8565b5f8281525f8051602061300c8339815191526020526040808220815160e0810190925280545f80516020612fec83398151915293929190829060ff166005811115611d2e57611d2e612859565b6005811115611d3f57611d3f612859565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611db157611db1612859565b14611dcf5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611e1357611e13612859565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611ebf8582612360565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714611f3a57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015611f8957611f51816001612d40565b611f5c906008612d53565b61ffff16858281518110611f7257611f726129ee565b016020015160f81c901b9190911790600101611f3d565b5061ffff811615611fad5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561200857611fc4816003612d40565b611fcf906008612d53565b63ffffffff1686611fe1836002612b6e565b81518110611ff157611ff16129ee565b016020015160f81c901b9190911790600101611fb0565b5063ffffffff811660031461203057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120855761204781601f612d40565b612052906008612d53565b8761205e836006612b6e565b8151811061206e5761206e6129ee565b016020015160f81c901b9190911790600101612033565b505f8660268151811061209a5761209a6129ee565b016020015191976001600160f81b03199092161515965090945050505050565b6120c26124b7565b6120cb82612500565b61097681612519565b5f80516020612fec8339815191525f6001600160401b038084169085161115612108576121018385612ecf565b9050612115565b6121128484612ecf565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580612177575060018401548151612173916001600160401b031690612b6e565b8210155b1561219d576001600160401b0383166060820152818152604081015160208201526121bc565b82816060018181516121af9190612eef565b6001600160401b03169052505b60608101516121cc906064612f0f565b602082015160018601546001600160401b0392909216916121f79190600160401b900460ff16612d53565b10156122165760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516122319190612b6e565b9052506040810180516001600160401b0387169190612251908390612d40565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146122c657604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016122f89796959493929190612f3a565b60405160208183030381529060405290506002816040516123199190612b49565b602060405180830381855afa158015612334573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906123579190612992565b94909350915050565b5f8281525f8051602061300c833981519152602052604081206002015481905f80516020612fec83398151915290600160801b90046001600160401b03166123a885826120d4565b5f6123b28761252a565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124028a858b610e29565b6040518263ffffffff1660e01b815260040161241e9190612960565b6020604051808303815f875af115801561243a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061245e9190612992565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661094757604051631afcd79f60e31b815260040160405180910390fd5b6125086124b7565b61251061259f565b610e26816125a7565b6125216124b7565b610e2681612679565b5f8181525f8051602061300c8339815191526020526040812060020180545f80516020612fec833981519152919060089061257490600160401b90046001600160401b0316612fb0565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6109476124b7565b6125af6124b7565b80355f80516020612fec83398151915290815560146125d46060840160408501612fcb565b60ff1611806125f357506125ee6060830160408401612fcb565b60ff16155b156126115760405163b4fa3fb360e01b815260040160405180910390fd5b6126216060830160408401612fcb565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556126526040830160208401612d6a565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610def6124b7565b50805461268d90612ba3565b5f825580601f1061269c575050565b601f0160209004905f5260205f2090810190610e2691906126f4565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612708575f81556001016126f5565b5090565b5f6020828403121561271c575f80fd5b5035919050565b803563ffffffff81168114612736575f80fd5b919050565b5f6020828403121561274b575f80fd5b61095c82612723565b5f8060408385031215612765575f80fd5b82356001600160401b0381111561277a575f80fd5b83016080818603121561278b575f80fd5b915061279960208401612723565b90509250929050565b5f606082840312156127b2575f80fd5b50919050565b80356001600160401b0381168114612736575f80fd5b5f80604083850312156127df575f80fd5b82356001600160401b038111156127f4575f80fd5b612800858286016127a2565b925050612799602084016127b8565b6001600160a01b0381168114610e26575f80fd5b5f8060808385031215612834575f80fd5b61283e84846127a2565b9150606083013561284e8161280f565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061289057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516128cb60608401826001600160401b03169052565b5060808301516128e660808401826001600160401b03169052565b5060a083015161290160a08401826001600160401b03169052565b5060c083015161120f60c08401826001600160401b03169052565b5f6020828403121561292c575f80fd5b81356129378161280f565b9392505050565b5f5b83811015612958578181015183820152602001612940565b50505f910152565b602081525f825180602084015261297e81604085016020870161293e565b601f01601f19169190910160400192915050565b5f602082840312156129a2575f80fd5b5051919050565b5f808335601e198436030181126129be575f80fd5b8301803591506001600160401b038211156129d7575f80fd5b6020019150600581901b36038213156124b0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612a16575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612a5657612a56612a20565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612a8457612a84612a20565b604052919050565b5f6001600160401b03821115612aa457612aa4612a20565b50601f01601f191660200190565b5f60608236031215612ac2575f80fd5b612aca612a34565b823581526020612adb8185016127b8565b8183015260408401356001600160401b03811115612af7575f80fd5b840136601f820112612b07575f80fd5b8035612b1a612b1582612a8c565b612a5c565b8181523684838501011115612b2d575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251612a1681846020870161293e565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561095f5761095f612b5a565b5f63ffffffff808316818103612b9957612b99612b5a565b6001019392505050565b600181811c90821680612bb757607f821691505b6020821081036127b257634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454612be781612ba3565b806020870152604060018084165f8114612c085760018114612c2457612c51565b60ff19851660408a0152604084151560051b8a01019550612c51565b895f5260205f205f5b85811015612c485781548b8201860152908301908801612c2d565b8a016040019650505b509398975050505050505050565b80518015158114612736575f80fd5b5f8060408385031215612c7f575f80fd5b82516001600160401b0380821115612c95575f80fd5b9084019060608287031215612ca8575f80fd5b612cb0612a34565b82518152602080840151612cc38161280f565b82820152604084015183811115612cd8575f80fd5b80850194505087601f850112612cec575f80fd5b83519250612cfc612b1584612a8c565b8381528882858701011115612d0f575f80fd5b612d1e8483830184880161293e565b80604084015250819550612d33818801612c5f565b9450505050509250929050565b8181038181111561095f5761095f612b5a565b808202811582820484141761095f5761095f612b5a565b5f60208284031215612d7a575f80fd5b61095c826127b8565b5f808335601e19843603018112612d98575f80fd5b8301803591506001600160401b03821115612db1575f80fd5b6020019150368190038213156124b0575f80fd5b601f82111561049957805f5260205f20601f840160051c81016020851015612dea5750805b601f840160051c820191505b81811015612e09575f8155600101612df6565b5050505050565b81516001600160401b03811115612e2957612e29612a20565b612e3d81612e378454612ba3565b84612dc5565b602080601f831160018114612e70575f8415612e595750858301515b5f19600386901b1c1916600185901b178555612ec7565b5f85815260208120601f198616915b82811015612e9e57888601518255948401946001909101908401612e7f565b5085821015612ebb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0382811682821603908082111561120f5761120f612b5a565b6001600160401b0381811683821601908082111561120f5761120f612b5a565b6001600160401b03818116838216028082169190828114612f3257612f32612b5a565b505092915050565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451612f8f81604e86016020890161293e565b60c09490941b1691909201604e810191909152605601979650505050505050565b5f6001600160401b03808316818103612b9957612b99612b5a565b5f60208284031215612fdb575f80fd5b813560ff81168114612937575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[{\"name\":\"subnetConversionID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"}]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[{\"name\":\"churnAmount\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"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\":\"UnexpectedRegistrationStatus\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516131e13803806131e183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130948061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806397fb70d4116100a9578063d588c18f1161006e578063d588c18f14610290578063d5f20ff6146102a3578063df93d8de146102c3578063e7d14c1c146102cd578063f2fde38b1461030b575f80fd5b806397fb70d414610241578063a3a65e4814610254578063b771b3bc14610267578063bee0a03f14610275578063c974d1b614610288575f80fd5b8063715018a6116100ef578063715018a6146101b3578063732214f8146101bb5780638280a25a146101d05780638994ab49146101ea5780638da5cb5b146101fd575f80fd5b80630322ed981461012b578063467ef06f1461014057806360305d621461015357806361e2f4901461017557806366435abf14610188575b5f80fd5b61013e610139366004612780565b61031e565b005b61013e61014e3660046127af565b6104ae565b61015b601481565b60405163ffffffff90911681526020015b60405180910390f35b61013e6101833660046127c8565b6104bc565b61019b610196366004612780565b610948565b6040516001600160401b03909116815260200161016c565b61013e61095c565b6101c25f81565b60405190815260200161016c565b6101d8603081565b60405160ff909116815260200161016c565b6101c26101f8366004612842565b61096f565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161016c565b61013e61024f366004612780565b61098b565b61013e6102623660046127af565b6109a0565b6102296005600160991b0181565b61013e610283366004612780565b610b27565b6101d8601481565b61013e61029e366004612897565b610c61565b6102b66102b1366004612780565b610d6f565b60405161016c9190612901565b61019b6202a30081565b6101c26102db366004612780565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61013e61031936600461296a565b610e37565b5f8181525f805160206130688339815191526020526040808220815160e0810190925280545f8051602061304883398151915293929190829060ff16600581111561036b5761036b6128cd565b600581111561037c5761037c6128cd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb6128cd565b14610427575f8381526007830160205260409081902054905163170cc93360e21b815261041e9160ff169060040161298c565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61044c8584606001515f610e74565b6040518263ffffffff1660e01b815260040161046891906129bc565b6020604051808303815f875af1158015610484573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a891906129ee565b50505050565b6104b781610ec3565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206130488339815191529060ff161561050e57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610551573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061057591906129ee565b8360200135146105985760405163d040949d60e01b815260040160405180910390fd5b306105a9606085016040860161296a565b6001600160a01b0316146105d05760405163e6c4247b60e01b815260040160405180910390fd5b5f6105de6060850185612a05565b905090505f805b828163ffffffff16101561088a575f6106016060880188612a05565b8363ffffffff1681811061061757610617612a4a565b90506020028101906106299190612a5e565b61063290612b0e565b80515f818152600888016020526040902054919250901561066657604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161069592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526106af91612ba5565b602060405180830381855afa1580156106ca573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906106ed91906129ee565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610779576107796128cd565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161082c911686612bca565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061088390612bdd565b90506105e5565b50600483018190555f61089c85611164565b90505f6108ac8260400151611264565b90505f6108b8886113d9565b90505f6002826040516108cb9190612ba5565b602060405180830381855afa1580156108e6573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061090991906129ee565b905082811461092e5760405163884eab3360e01b81526004810182905260240161041e565b5050506009909301805460ff191660011790555050505050565b5f61095282610d6f565b6080015192915050565b610964611872565b61096d5f6118cd565b565b5f610978611872565b610982838361193d565b90505b92915050565b610993611872565b61099c81611d27565b5050565b5f805160206130488339815191525f6109b883611164565b90505f806109c98360400151611f79565b91509150806109eb57604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068501602052604090208054610a0590612bff565b90505f03610a2657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115610a4c57610a4c6128cd565b14610a7f575f8281526007850160205260409081902054905163170cc93360e21b815261041e9160ff169060040161298c565b5f8281526006850160205260408120610a97916126f5565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206130488339815191529190610b6e90612bff565b90505f03610b8f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115610bb557610bb56128cd565b14610be8575f8281526007820160205260409081902054905163170cc93360e21b815261041e9160ff169060040161298c565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c219190600401612c31565b6020604051808303815f875af1158015610c3d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104b791906129ee565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610ca55750825b90505f826001600160401b03166001148015610cc05750303b155b905081158015610cce575080155b15610cec5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610d1657845460ff60401b1916600160401b1785555b610d20878761211d565b8315610d6657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610d7761272c565b5f8281525f80516020613068833981519152602052604090819020815160e0810190925280545f80516020613048833981519152929190829060ff166005811115610dc457610dc46128cd565b6005811115610dd557610dd56128cd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610e3f611872565b6001600160a01b038116610e6857604051631e4fbdf760e01b81525f600482015260240161041e565b610e71816118cd565b50565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f610ecc61272c565b5f805160206130488339815191525f610ee485611164565b90505f80610ef58360400151611f79565b915091508015610f1857604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610f4957610f496128cd565b6005811115610f5a57610f5a6128cd565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610fc957610fc96128cd565b14158015610fea5750600181516005811115610fe757610fe76128cd565b14155b1561100b57805160405163170cc93360e21b815261041e919060040161298c565b600381516005811115611020576110206128cd565b0361102e5760048152611033565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff19166001836005811115611078576110786128cd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561112c5761112c6128cd565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156111c8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111ef9190810190612cca565b915091508061121157604051636b2f19e960e01b815260040160405180910390fd5b8151156112315760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561125d5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f815160261461128757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156112d65761129e816001612d9c565b6112a9906008612daf565b61ffff168482815181106112bf576112bf612a4a565b016020015160f81c901b919091179060010161128a565b5061ffff8116156112fa5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561135557611311816003612d9c565b61131c906008612daf565b63ffffffff168561132e836002612bca565b8151811061133e5761133e612a4a565b016020015160f81c901b91909117906001016112fd565b5063ffffffff81161561137b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156113d05761139281601f612d9c565b61139d906008612daf565b866113a9836006612bca565b815181106113b9576113b9612a4a565b016020015160f81c901b919091179060010161137e565b50949350505050565b60605f6113e883830184612a05565b6113f491506058612daf565b6113ff90605c612bca565b6001600160401b0381111561141657611416612a7c565b6040519080825280601f01601f191660200182016040528015611440576020820181803683370190505b5090505f5b6020811015611495578335816020811061146157611461612a4a565b1a60f81b82828151811061147757611477612a4a565b60200101906001600160f81b03191690815f1a905350600101611445565b505f5b60208110156114f557836020013581602081106114b7576114b7612a4a565b1a60f81b826114c7836020612bca565b815181106114d7576114d7612a4a565b60200101906001600160f81b03191690815f1a905350600101611498565b505f5b60048110156115585761150c816003612d9c565b611517906008612daf565b6014901c60f81b8261152a836040612bca565b8151811061153a5761153a612a4a565b60200101906001600160f81b03191690815f1a9053506001016114f8565b505f61156a606085016040860161296a565b60601b90505f5b60148110156115ca5781816014811061158c5761158c612a4a565b1a60f81b8361159c836044612bca565b815181106115ac576115ac612a4a565b60200101906001600160f81b03191690815f1a905350600101611571565b505f6115d96060860186612a05565b905090505f5b6004811015611644576115f3816003612d9c565b6115fe906008612daf565b63ffffffff8316901c60f81b84611616836058612bca565b8151811061162657611626612a4a565b60200101906001600160f81b03191690815f1a9053506001016115df565b505f5b6116546060870187612a05565b9050811015611868575f611669826058612daf565b61167490605c612bca565b90505f5b60208110156116ff5761168e6060890189612a05565b8481811061169e5761169e612a4a565b90506020028101906116b09190612a5e565b3581602081106116c2576116c2612a4a565b1a60f81b866116d18385612bca565b815181106116e1576116e1612a4a565b60200101906001600160f81b03191690815f1a905350600101611678565b505f5b60088110156117b457611716816007612d9c565b611721906008612daf565b61172e60608a018a612a05565b8581811061173e5761173e612a4a565b90506020028101906117509190612a5e565b611761906040810190602001612dc6565b6001600160401b0316901c60f81b868261177c856020612bca565b6117869190612bca565b8151811061179657611796612a4a565b60200101906001600160f81b03191690815f1a905350600101611702565b505f5b603081101561185e576117cd6060890189612a05565b848181106117dd576117dd612a4a565b90506020028101906117ef9190612a5e565b6117fd906040810190612ddf565b8281811061180d5761180d612a4a565b9050013560f81c60f81b86828460286118269190612bca565b6118309190612bca565b8151811061184057611840612a4a565b60200101906001600160f81b03191690815f1a9053506001016117b7565b5050600101611647565b5091949350505050565b336118a47f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461096d5760405163118cdaa760e01b815233600482015260240161041e565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661198157604051637fab81e560e01b815260040160405180910390fd5b5f80516020613048833981519152426119a06040860160208701612dc6565b6001600160401b03161115806119da57506119be6202a30042612bca565b6119ce6040860160208701612dc6565b6001600160401b031610155b156119f75760405162d36c8560e81b815260040160405180910390fd5b6030611a066040860186612ddf565b9050141580611a1457508335155b15611a325760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415611a6257604051630eb0d31360e11b815260040160405180910390fd5b611a6c835f612137565b5f80611b056040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611ab09190612dc6565b6001600160401b03168152602001611acb60408a018a612ddf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250612311565b5f82815260068601602052604090209193509150611b238282612e6c565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90611b619085906004016129bc565b6020604051808303815f875af1158015611b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ba191906129ee565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115611c1957611c196128cd565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611cf9918e01908e01612dc6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611d2f61272c565b5f8281525f805160206130688339815191526020526040808220815160e0810190925280545f8051602061304883398151915293929190829060ff166005811115611d7c57611d7c6128cd565b6005811115611d8d57611d8d6128cd565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611dff57611dff6128cd565b14611e32575f8481526007830160205260409081902054905163170cc93360e21b815261041e9160ff169060040161298c565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611e7657611e766128cd565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611f2285826123d4565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714611f9d57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015611fec57611fb4816001612d9c565b611fbf906008612daf565b61ffff16858281518110611fd557611fd5612a4a565b016020015160f81c901b9190911790600101611fa0565b5061ffff8116156120105760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561206b57612027816003612d9c565b612032906008612daf565b63ffffffff1686612044836002612bca565b8151811061205457612054612a4a565b016020015160f81c901b9190911790600101612013565b5063ffffffff811660031461209357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120e8576120aa81601f612d9c565b6120b5906008612daf565b876120c1836006612bca565b815181106120d1576120d1612a4a565b016020015160f81c901b9190911790600101612096565b505f866026815181106120fd576120fd612a4a565b016020015191976001600160f81b03199092161515965090945050505050565b61212561252b565b61212e82612574565b61099c8161258d565b5f805160206130488339815191525f6001600160401b03808416908516111561216b576121648385612f2b565b9050612178565b6121758484612f2b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806121da5750600184015481516121d6916001600160401b031690612bca565b8210155b15612200576001600160401b03831660608201528181526040810151602082015261221f565b82816060018181516122129190612f4b565b6001600160401b03169052505b606081015161222f906064612f6b565b602082015160018601546001600160401b03929092169161225a9190600160401b900460ff16612daf565b101561228a57606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161041e565b856001600160401b0316816040018181516122a59190612bca565b9052506040810180516001600160401b03871691906122c5908390612d9c565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f606082608001515160301461233a57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161236c9796959493929190612f96565b604051602081830303815290604052905060028160405161238d9190612ba5565b602060405180830381855afa1580156123a8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906123cb91906129ee565b94909350915050565b5f8281525f80516020613068833981519152602052604081206002015481905f8051602061304883398151915290600160801b90046001600160401b031661241c8582612137565b5f6124268761259e565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124768a858b610e74565b6040518263ffffffff1660e01b815260040161249291906129bc565b6020604051808303815f875af11580156124ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124d291906129ee565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661096d57604051631afcd79f60e31b815260040160405180910390fd5b61257c61252b565b612584612613565b610e718161261b565b61259561252b565b610e71816126ed565b5f8181525f805160206130688339815191526020526040812060020180545f8051602061304883398151915291906008906125e890600160401b90046001600160401b031661300c565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61096d61252b565b61262361252b565b80355f8051602061304883398151915290815560146126486060840160408501613027565b60ff16118061266757506126626060830160408401613027565b60ff16155b156126855760405163b4fa3fb360e01b815260040160405180910390fd5b6126956060830160408401613027565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556126c66040830160208401612dc6565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610e3f61252b565b50805461270190612bff565b5f825580601f10612710575050565b601f0160209004905f5260205f2090810190610e719190612768565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561277c575f8155600101612769565b5090565b5f60208284031215612790575f80fd5b5035919050565b803563ffffffff811681146127aa575f80fd5b919050565b5f602082840312156127bf575f80fd5b61098282612797565b5f80604083850312156127d9575f80fd5b82356001600160401b038111156127ee575f80fd5b8301608081860312156127ff575f80fd5b915061280d60208401612797565b90509250929050565b5f60608284031215612826575f80fd5b50919050565b80356001600160401b03811681146127aa575f80fd5b5f8060408385031215612853575f80fd5b82356001600160401b03811115612868575f80fd5b61287485828601612816565b92505061280d6020840161282c565b6001600160a01b0381168114610e71575f80fd5b5f80608083850312156128a8575f80fd5b6128b28484612816565b915060608301356128c281612883565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b600681106128fd57634e487b7160e01b5f52602160045260245ffd5b9052565b5f60e0820190506129138284516128e1565b6020830151602083015260408301516001600160401b0380821660408501528060608601511660608501528060808601511660808501528060a08601511660a08501528060c08601511660c0850152505092915050565b5f6020828403121561297a575f80fd5b813561298581612883565b9392505050565b6020810161098582846128e1565b5f5b838110156129b457818101518382015260200161299c565b50505f910152565b602081525f82518060208401526129da81604085016020870161299a565b601f01601f19169190910160400192915050565b5f602082840312156129fe575f80fd5b5051919050565b5f808335601e19843603018112612a1a575f80fd5b8301803591506001600160401b03821115612a33575f80fd5b6020019150600581901b3603821315612524575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612a72575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612ab257612ab2612a7c565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612ae057612ae0612a7c565b604052919050565b5f6001600160401b03821115612b0057612b00612a7c565b50601f01601f191660200190565b5f60608236031215612b1e575f80fd5b612b26612a90565b823581526020612b3781850161282c565b8183015260408401356001600160401b03811115612b53575f80fd5b840136601f820112612b63575f80fd5b8035612b76612b7182612ae8565b612ab8565b8181523684838501011115612b89575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251612a7281846020870161299a565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561098557610985612bb6565b5f63ffffffff808316818103612bf557612bf5612bb6565b6001019392505050565b600181811c90821680612c1357607f821691505b60208210810361282657634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454612c4381612bff565b806020870152604060018084165f8114612c645760018114612c8057612cad565b60ff19851660408a0152604084151560051b8a01019550612cad565b895f5260205f205f5b85811015612ca45781548b8201860152908301908801612c89565b8a016040019650505b509398975050505050505050565b805180151581146127aa575f80fd5b5f8060408385031215612cdb575f80fd5b82516001600160401b0380821115612cf1575f80fd5b9084019060608287031215612d04575f80fd5b612d0c612a90565b82518152602080840151612d1f81612883565b82820152604084015183811115612d34575f80fd5b80850194505087601f850112612d48575f80fd5b83519250612d58612b7184612ae8565b8381528882858701011115612d6b575f80fd5b612d7a8483830184880161299a565b80604084015250819550612d8f818801612cbb565b9450505050509250929050565b8181038181111561098557610985612bb6565b808202811582820484141761098557610985612bb6565b5f60208284031215612dd6575f80fd5b6109828261282c565b5f808335601e19843603018112612df4575f80fd5b8301803591506001600160401b03821115612e0d575f80fd5b602001915036819003821315612524575f80fd5b601f8211156104b757805f5260205f20601f840160051c81016020851015612e465750805b601f840160051c820191505b81811015612e65575f8155600101612e52565b5050505050565b81516001600160401b03811115612e8557612e85612a7c565b612e9981612e938454612bff565b84612e21565b602080601f831160018114612ecc575f8415612eb55750858301515b5f19600386901b1c1916600185901b178555612f23565b5f85815260208120601f198616915b82811015612efa57888601518255948401946001909101908401612edb565b5085821015612f1757878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0382811682821603908082111561125d5761125d612bb6565b6001600160401b0381811683821601908082111561125d5761125d612bb6565b6001600160401b03818116838216028082169190828114612f8e57612f8e612bb6565b505092915050565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451612feb81604e86016020890161299a565b60c09490941b1691909201604e810191909152605601979650505050505050565b5f6001600160401b03808316818103612bf557612bf5612bb6565b5f60208284031215613037575f80fd5b813560ff81168114612985575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/ERC20TokenStakingManager.sol b/contracts/validator-manager/ERC20TokenStakingManager.sol index 16af3c64c..afddabec6 100644 --- a/contracts/validator-manager/ERC20TokenStakingManager.sol +++ b/contracts/validator-manager/ERC20TokenStakingManager.sol @@ -34,7 +34,7 @@ contract ERC20TokenStakingManager is // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.ERC20TokenStakingManager")) - 1)) & ~bytes32(uint256(0xff)); // TODO: Update to correct storage slot - bytes32 private constant _ERC20_STAKING_MANAGER_STORAGE_LOCATION = + bytes32 public constant ERC20_STAKING_MANAGER_STORAGE_LOCATION = 0x6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00; // solhint-disable ordering @@ -45,7 +45,7 @@ contract ERC20TokenStakingManager is { // solhint-disable-next-line no-inline-assembly assembly { - $.slot := _ERC20_STAKING_MANAGER_STORAGE_LOCATION + $.slot := ERC20_STAKING_MANAGER_STORAGE_LOCATION } } diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index ba51178f3..5286cde93 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -66,22 +66,22 @@ abstract contract PoSValidatorManager is // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.PoSValidatorManager")) - 1)) & ~bytes32(uint256(0xff)); // TODO: Unit test for storage slot and update slot - bytes32 private constant _POS_VALIDATOR_MANAGER_STORAGE_LOCATION = + bytes32 public constant POS_VALIDATOR_MANAGER_STORAGE_LOCATION = 0x4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00; uint8 public constant MAXIMUM_STAKE_MULTIPLIER_LIMIT = 10; uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; - error InvalidDelegatorStatus(); - error InvalidNonce(); - error InvalidDelegationID(); - error ValidatorNotPoS(); - error MaxWeightExceeded(); error InvalidDelegationFee(); - error InvalidStakeDuration(); + error InvalidDelegationID(); + error InvalidDelegatorStatus(DelegatorStatus status); + error InvalidNonce(uint64 nonce); error InvalidStakeAmount(); + error InvalidStakeDuration(); error InvalidStakeMultiplier(); + error MaxWeightExceeded(uint64 newValidatorWeight); + error ValidatorNotPoS(); // solhint-disable ordering function _getPoSValidatorManagerStorage() @@ -91,7 +91,7 @@ abstract contract PoSValidatorManager is { // solhint-disable-next-line no-inline-assembly assembly { - $.slot := _POS_VALIDATOR_MANAGER_STORAGE_LOCATION + $.slot := POS_VALIDATOR_MANAGER_STORAGE_LOCATION } } @@ -148,7 +148,7 @@ abstract contract PoSValidatorManager is Validator memory validator = getValidator(validationID); if (validator.status != ValidatorStatus.Completed) { - revert InvalidValidatorStatus(); + revert InvalidValidatorStatus(validator.status); } if ($._posValidatorInfo[validationID].owner != _msgSender()) { @@ -315,13 +315,13 @@ abstract contract PoSValidatorManager is revert ValidatorNotPoS(); } if (validator.status != ValidatorStatus.Active) { - revert InvalidValidatorStatus(); + revert InvalidValidatorStatus(validator.status); } // Update the validator weight uint64 newValidatorWeight = validator.weight + weight; if (newValidatorWeight > validator.startingWeight * $._maximumStakeMultiplier) { - revert MaxWeightExceeded(); + revert MaxWeightExceeded(newValidatorWeight); } (uint64 nonce, bytes32 messageID) = _setValidatorWeight(validationID, newValidatorWeight); @@ -362,8 +362,8 @@ abstract contract PoSValidatorManager is // Ensure the delegator is pending added. Since anybody can call this function once // delegator registration has been initialized, we need to make sure that this function is only // callable after that has been done. - if ($._delegatorStakes[delegationID].status != DelegatorStatus.PendingAdded) { - revert InvalidDelegatorStatus(); + if (delegator.status != DelegatorStatus.PendingAdded) { + revert InvalidDelegatorStatus(delegator.status); } // In the case where the validator has initiated ending its validation period, we can no @@ -409,7 +409,7 @@ abstract contract PoSValidatorManager is if ( validator.messageNonce < nonce || $._delegatorStakes[delegationID].startingNonce > nonce ) { - revert InvalidNonce(); + revert InvalidNonce(nonce); } // Update the delegation status @@ -438,7 +438,7 @@ abstract contract PoSValidatorManager is // Ensure the validation is completed if (validator.status != ValidatorStatus.Completed) { - revert InvalidValidatorStatus(); + revert InvalidValidatorStatus(validator.status); } // If the validator completes before the delegator is added, let them exit from here. @@ -476,7 +476,7 @@ abstract contract PoSValidatorManager is // Ensure the delegator is active if (delegator.status != DelegatorStatus.Active) { - revert InvalidDelegatorStatus(); + revert InvalidDelegatorStatus(delegator.status); } // Only the delegation owner can end the delegation. if (delegator.owner != _msgSender()) { @@ -539,7 +539,7 @@ abstract contract PoSValidatorManager is delegator.status != DelegatorStatus.PendingAdded && delegator.status != DelegatorStatus.PendingRemoved ) { - revert InvalidDelegatorStatus(); + revert InvalidDelegatorStatus(delegator.status); } Validator memory validator = getValidator(delegator.validationID); @@ -576,14 +576,14 @@ abstract contract PoSValidatorManager is // complete delisting for an earlier delegation. This is necessary because the P-Chain is only willing // to sign the latest weight update. if (delegator.endingNonce > nonce) { - revert InvalidNonce(); + revert InvalidNonce(nonce); } // Ensure the delegator is pending removed. Since anybody can call this function once // end delegation has been initialized, we need to make sure that this function is only // callable after that has been done. if (delegator.status != DelegatorStatus.PendingRemoved) { - revert InvalidDelegatorStatus(); + revert InvalidDelegatorStatus(delegator.status); } _completeEndDelegation(delegationID); diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index d480697bf..61049193b 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -53,7 +53,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.ValidatorManager")) - 1)) & ~bytes32(uint256(0xff)); // TODO: Unit test for storage slot and update slot - bytes32 private constant _VALIDATOR_MANAGER_STORAGE_LOCATION = + bytes32 public constant VALIDATOR_MANAGER_STORAGE_LOCATION = 0xe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00; uint8 public constant MAXIMUM_CHURN_PERCENTAGE_LIMIT = 20; @@ -62,18 +62,18 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida uint8 public constant BLS_PUBLIC_KEY_LENGTH = 48; bytes32 public constant P_CHAIN_BLOCKCHAIN_ID = bytes32(0); - error MaxChurnRateExceeded(); - error InvalidWarpMessage(); - error InvalidBlockchainID(); error InvalidAddress(); - error UnexpectedRegistrationStatus(); - error InvalidValidatorStatus(); - error InvalidValidationID(); - error NodeAlreadyRegistered(); - error InvalidSubnetConversionID(); - error InvalidInput(); + error InvalidBlockchainID(); error InvalidExpiry(); error InvalidInitializationStatus(); + error InvalidInput(); + error InvalidSubnetConversionID(bytes32 subnetConversionID); + error InvalidValidationID(); + error InvalidValidatorStatus(ValidatorStatus status); + error InvalidWarpMessage(); + error MaxChurnRateExceeded(uint64 churnAmount); + error NodeAlreadyRegistered(); + error UnexpectedRegistrationStatus(); // solhint-disable ordering function _getValidatorManagerStorage() @@ -83,7 +83,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida { // solhint-disable-next-line no-inline-assembly assembly { - $.slot := _VALIDATOR_MANAGER_STORAGE_LOCATION + $.slot := VALIDATOR_MANAGER_STORAGE_LOCATION } } @@ -191,8 +191,9 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ValidatorMessages.unpackSubnetConversionMessage(warpMessage.payload); bytes memory encodedConversion = ValidatorMessages.packSubnetConversionData(subnetConversionData); - if (sha256(encodedConversion) != subnetConversionID) { - revert InvalidSubnetConversionID(); + bytes32 encodedSubnetConversionID = sha256(encodedConversion); + if (encodedSubnetConversionID != subnetConversionID) { + revert InvalidSubnetConversionID(encodedSubnetConversionID); } $._initializedValidatorSet = true; @@ -273,7 +274,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida revert InvalidValidationID(); } if ($._validationPeriods[validationID].status != ValidatorStatus.PendingAdded) { - revert InvalidValidatorStatus(); + revert InvalidValidatorStatus($._validationPeriods[validationID].status); } // Submit the message to the Warp precompile. @@ -299,7 +300,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida revert InvalidValidationID(); } if ($._validationPeriods[validationID].status != ValidatorStatus.PendingAdded) { - revert InvalidValidatorStatus(); + revert InvalidValidatorStatus($._validationPeriods[validationID].status); } delete $._pendingRegisterValidationMessages[validationID]; @@ -337,7 +338,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // The initial validator set must have been set already to have active validators. Validator memory validator = $._validationPeriods[validationID]; if (validator.status != ValidatorStatus.Active) { - revert InvalidValidatorStatus(); + revert InvalidValidatorStatus($._validationPeriods[validationID].status); } // Update the validator status to pending removal. @@ -371,7 +372,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // The initial validator set must have been set already to have pending end validation messages. if (validator.status != ValidatorStatus.PendingRemoved) { - revert InvalidValidatorStatus(); + revert InvalidValidatorStatus($._validationPeriods[validationID].status); } WARP_MESSENGER.sendWarpMessage( @@ -413,7 +414,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida validator.status != ValidatorStatus.PendingRemoved && validator.status != ValidatorStatus.PendingAdded ) { - revert InvalidValidatorStatus(); + revert InvalidValidatorStatus(validator.status); } if (validator.status == ValidatorStatus.PendingRemoved) { @@ -532,7 +533,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Rearranged equation of maximumChurnPercentage >= currentChurnPercentage to avoid integer division truncation. if ($._maximumChurnPercentage * churnTracker.initialWeight < churnTracker.churnAmount * 100) { - revert MaxChurnRateExceeded(); + revert MaxChurnRateExceeded(churnTracker.churnAmount); } // Two separate calculations because we're using uints and (newValidatorWeight - oldValidatorWeight) could underflow. diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index a59981932..e09a33ad4 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -345,7 +345,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 validationID and whether or the validation period was registered + * @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. */ function unpackSubnetValidatorRegistrationMessage(bytes memory input) diff --git a/contracts/validator-manager/interfaces/IValidatorManager.sol b/contracts/validator-manager/interfaces/IValidatorManager.sol index a505f5605..d30388d11 100644 --- a/contracts/validator-manager/interfaces/IValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IValidatorManager.sol @@ -27,7 +27,7 @@ struct Validator { struct ValidatorChurnPeriod { uint256 startedAt; uint256 initialWeight; - uint256 totalWeight; // TODO add initial validator set to total weight. + uint256 totalWeight; uint64 churnAmount; } diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index fee9cde4b..83cb77da9 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -174,6 +174,13 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ); } + function testERC20TokenStakingManagerStorageSlot() public view { + assertEq( + _erc7201StorageSlot("ERC20TokenStakingManager"), + app.ERC20_STAKING_MANAGER_STORAGE_LOCATION() + ); + } + function _initializeValidatorRegistration( ValidatorRegistrationInput memory registrationInput, uint16 delegationFeeBips, diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index f4dbfc027..738424cc7 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -361,14 +361,15 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Complete registration of delegator2 with delegator1's nonce // Note that registering delegator1 with delegator2's nonce is valid + uint64 nonce = 1; bytes memory setValidatorWeightPayload = ValidatorMessages .packSubnetValidatorWeightUpdateMessage( - validationID, 1, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT + validationID, nonce, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT ); _mockGetPChainWarpMessage(setValidatorWeightPayload, true); vm.warp(DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP); - vm.expectRevert(PoSValidatorManager.InvalidNonce.selector); + vm.expectRevert(abi.encodeWithSelector(PoSValidatorManager.InvalidNonce.selector, nonce)); posValidatorManager.completeDelegatorRegistration(0, delegationID2); } @@ -644,13 +645,14 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Complete ending delegator2 with delegator1's nonce // Note that ending delegator1 with delegator2's nonce is valid + uint64 nonce = 3; bytes memory setValidatorWeightPayload = ValidatorMessages .packSubnetValidatorWeightUpdateMessage( - validationID, 3, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT + validationID, nonce, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT ); _mockGetPChainWarpMessage(setValidatorWeightPayload, true); - vm.expectRevert(PoSValidatorManager.InvalidNonce.selector); + vm.expectRevert(abi.encodeWithSelector(PoSValidatorManager.InvalidNonce.selector, nonce)); posValidatorManager.completeEndDelegation(0, delegationID2); } @@ -808,6 +810,13 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { assertEq(v3, 1e27); } + function testPoSValidatorManagerStorageSlot() public view { + assertEq( + _erc7201StorageSlot("PoSValidatorManager"), + posValidatorManager.POS_VALIDATOR_MANAGER_STORAGE_LOCATION() + ); + } + function _initializeValidatorRegistration( ValidatorRegistrationInput memory registrationInput, uint16 delegationFeeBips, diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index 373acd357..7dc124508 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -218,10 +218,15 @@ abstract contract ValidatorManagerTest is Test { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - _beforeSend(DEFAULT_MINIMUM_STAKE_AMOUNT, address(this)); // TODO may need to be updated with minimum stake amount + _beforeSend(DEFAULT_MINIMUM_STAKE_AMOUNT, address(this)); // Second call should fail - vm.expectRevert(ValidatorManager.MaxChurnRateExceeded.selector); + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.MaxChurnRateExceeded.selector, + churnThreshold + _valueToWeight(DEFAULT_MINIMUM_STAKE_AMOUNT) + ) + ); _initializeValidatorRegistration( ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, @@ -258,10 +263,24 @@ abstract contract ValidatorManagerTest is Test { }); // Second call should fail - vm.expectRevert(ValidatorManager.MaxChurnRateExceeded.selector); + // The first registration churn amount is not part of the new churn amount since + // a new churn period has started. + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.MaxChurnRateExceeded.selector, + _valueToWeight(DEFAULT_MINIMUM_STAKE_AMOUNT) + churnThreshold + ) + ); _initializeEndValidation(validationID, false); } + function testValidatorManagerStorageSlot() public view { + assertEq( + _erc7201StorageSlot("ValidatorManager"), + validatorManager.VALIDATOR_MANAGER_STORAGE_LOCATION() + ); + } + function _newNodeID() internal returns (bytes32) { nodeIDCounter++; return sha256(new bytes(nodeIDCounter)); @@ -495,5 +514,13 @@ abstract contract ValidatorManagerTest is Test { function _weightToValue(uint64 weight) internal pure returns (uint256) { return uint256(weight) * 1e12; } + + function _erc7201StorageSlot(bytes memory storageName) internal pure returns (bytes32) { + return keccak256( + abi.encode( + uint256(keccak256(abi.encodePacked("avalanche-icm.storage.", storageName))) - 1 + ) + ) & ~bytes32(uint256(0xff)); + } } // solhint-enable no-empty-blocks From fd7cf4919b772700cb3dc671caec2594f5cf8591 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 25 Sep 2024 14:12:11 -0400 Subject: [PATCH 415/545] separate invalid input error --- contracts/validator-manager/ValidatorManager.sol | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 61049193b..962b3a387 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -66,7 +66,9 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida error InvalidBlockchainID(); error InvalidExpiry(); error InvalidInitializationStatus(); - error InvalidInput(); + error InvalidMaximumChurnPercentage(); + error InvalidBLSKey(); + error InvalidNodeID(); error InvalidSubnetConversionID(bytes32 subnetConversionID); error InvalidValidationID(); error InvalidValidatorStatus(ValidatorStatus status); @@ -114,7 +116,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida settings.maximumChurnPercentage > MAXIMUM_CHURN_PERCENTAGE_LIMIT || settings.maximumChurnPercentage == 0 ) { - revert InvalidInput(); + revert InvalidMaximumChurnPercentage(); } $._maximumChurnPercentage = settings.maximumChurnPercentage; @@ -221,8 +223,11 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Ensure the nodeID is not the zero address, and is not already an active validator. - if (input.blsPublicKey.length != BLS_PUBLIC_KEY_LENGTH || input.nodeID == bytes32(0)) { - revert InvalidInput(); + if (input.blsPublicKey.length != BLS_PUBLIC_KEY_LENGTH) { + revert InvalidBLSKey(); + } + if (input.nodeID == bytes32(0)) { + revert InvalidNodeID(); } if ($._registeredValidators[input.nodeID] != bytes32(0)) { revert NodeAlreadyRegistered(); From d5771d02a436f52e067320827b6c9aaea1b2a036 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Wed, 25 Sep 2024 14:54:59 -0400 Subject: [PATCH 416/545] adding params to errors and passing unit tests --- .../ERC20TokenStakingManager.sol | 4 +- .../validator-manager/PoSValidatorManager.sol | 50 ++++++++-------- .../validator-manager/ValidatorManager.sol | 58 +++++++++++-------- .../tests/ERC20TokenStakingManagerTests.t.sol | 33 +++++++++-- .../NativeTokenStakingManagerTests.t.sol | 26 +++++++-- .../tests/PoSValidatorManagerTests.t.sol | 58 +++++++++++++++---- 6 files changed, 158 insertions(+), 71 deletions(-) diff --git a/contracts/validator-manager/ERC20TokenStakingManager.sol b/contracts/validator-manager/ERC20TokenStakingManager.sol index afddabec6..850ffc6a2 100644 --- a/contracts/validator-manager/ERC20TokenStakingManager.sol +++ b/contracts/validator-manager/ERC20TokenStakingManager.sol @@ -37,6 +37,8 @@ contract ERC20TokenStakingManager is bytes32 public constant ERC20_STAKING_MANAGER_STORAGE_LOCATION = 0x6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00; + error InvalidTokenAddress(address tokenAddress); + // solhint-disable ordering function _getERC20StakingManagerStorage() private @@ -84,7 +86,7 @@ contract ERC20TokenStakingManager is { ERC20TokenStakingManagerStorage storage $ = _getERC20StakingManagerStorage(); if (address(token) == address(0)) { - revert InvalidAddress(); + revert InvalidTokenAddress(address(token)); } $._token = token; } diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 5286cde93..f3a170f9c 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -73,15 +73,17 @@ abstract contract PoSValidatorManager is uint16 public constant MAXIMUM_DELEGATION_FEE_BIPS = 10000; - error InvalidDelegationFee(); - error InvalidDelegationID(); + error InvalidDelegationFee(uint16 delegationFeeBips); + error InvalidDelegationID(bytes32 delegationID); error InvalidDelegatorStatus(DelegatorStatus status); error InvalidNonce(uint64 nonce); - error InvalidStakeAmount(); - error InvalidStakeDuration(); - error InvalidStakeMultiplier(); + error InvalidStakeAmount(uint256 stakeAmount); + error InvalidMinStakeDuration(uint64 minStakeDuration); + error InvalidStakeMultiplier(uint8 maximumStakeMultiplier); error MaxWeightExceeded(uint64 newValidatorWeight); - error ValidatorNotPoS(); + error MinStakeDurationNotPassed(uint64 endTime); + error UnauthorizedOwner(address sender); + error ValidatorNotPoS(bytes32 validationID); // solhint-disable ordering function _getPoSValidatorManagerStorage() @@ -124,14 +126,14 @@ abstract contract PoSValidatorManager is PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); if (minimumDelegationFeeBips == 0 || minimumDelegationFeeBips > MAXIMUM_DELEGATION_FEE_BIPS) { - revert InvalidDelegationFee(); + revert InvalidDelegationFee(minimumDelegationFeeBips); } if (minimumStakeAmount > maximumStakeAmount) { - revert InvalidStakeAmount(); + revert InvalidStakeAmount(minimumStakeAmount); } if (maximumStakeMultiplier == 0 || maximumStakeMultiplier > MAXIMUM_STAKE_MULTIPLIER_LIMIT) { - revert InvalidStakeMultiplier(); + revert InvalidStakeMultiplier(maximumStakeMultiplier); } $._minimumStakeAmount = minimumStakeAmount; @@ -152,7 +154,7 @@ abstract contract PoSValidatorManager is } if ($._posValidatorInfo[validationID].owner != _msgSender()) { - revert InvalidAddress(); + revert UnauthorizedOwner(_msgSender()); } uint256 rewards = $._redeemableValidatorRewards[validationID]; @@ -176,7 +178,7 @@ abstract contract PoSValidatorManager is // PoS validations can only be ended by their owners. if ($._posValidatorInfo[validationID].owner != _msgSender()) { - revert InvalidAddress(); + revert UnauthorizedOwner(_msgSender()); } // Check that minimum stake duration has passed. @@ -184,7 +186,7 @@ abstract contract PoSValidatorManager is validator.endedAt < validator.startedAt + $._posValidatorInfo[validationID].minStakeDuration ) { - revert InvalidStakeDuration(); + revert MinStakeDurationNotPassed(validator.endedAt); } if (includeUptimeProof) { @@ -236,16 +238,16 @@ abstract contract PoSValidatorManager is } if (warpMessage.sourceChainID != WARP_MESSENGER.getBlockchainID()) { - revert InvalidBlockchainID(); + revert InvalidWarpSourceChainID(warpMessage.sourceChainID); } if (warpMessage.originSenderAddress != address(0)) { - revert InvalidAddress(); + revert InvalidWarpOriginSenderAddress(warpMessage.originSenderAddress); } (bytes32 uptimeValidationID, uint64 uptime) = ValidatorMessages.unpackValidationUptimeMessage(warpMessage.payload); if (validationID != uptimeValidationID) { - revert InvalidValidationID(); + revert InvalidValidationID(validationID); } return uptime; @@ -263,16 +265,16 @@ abstract contract PoSValidatorManager is delegationFeeBips < $._minimumDelegationFeeBips || delegationFeeBips > MAXIMUM_DELEGATION_FEE_BIPS ) { - revert InvalidDelegationFee(); + revert InvalidDelegationFee(delegationFeeBips); } if (minStakeDuration < $._minimumStakeDuration) { - revert InvalidStakeDuration(); + revert InvalidMinStakeDuration(minStakeDuration); } // Ensure the weight is within the valid range. if (stakeAmount < $._minimumStakeAmount || stakeAmount > $._maximumStakeAmount) { - revert InvalidStakeAmount(); + revert InvalidStakeAmount(stakeAmount); } // Lock the stake in the contract. @@ -312,7 +314,7 @@ abstract contract PoSValidatorManager is Validator memory validator = getValidator(validationID); // Check that the validation ID is a PoS validator if (!_isPoSValidator(validationID)) { - revert ValidatorNotPoS(); + revert ValidatorNotPoS(validationID); } if (validator.status != ValidatorStatus.Active) { revert InvalidValidatorStatus(validator.status); @@ -399,7 +401,7 @@ abstract contract PoSValidatorManager is ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); if (delegator.validationID != validationID) { - revert InvalidValidationID(); + revert InvalidValidationID(delegator.validationID); } // The received nonce should be no greater than the highest sent nonce, and at least as high as @@ -433,7 +435,7 @@ abstract contract PoSValidatorManager is // Ensure the delegation is found if (delegator.status == DelegatorStatus.Unknown) { - revert InvalidDelegationID(); + revert InvalidDelegationID(delegationID); } // Ensure the validation is completed @@ -480,7 +482,7 @@ abstract contract PoSValidatorManager is } // Only the delegation owner can end the delegation. if (delegator.owner != _msgSender()) { - revert InvalidAddress(); + revert UnauthorizedOwner(_msgSender()); } // Set the delegator status to pending removed, so that it can be properly removed in @@ -544,7 +546,7 @@ abstract contract PoSValidatorManager is Validator memory validator = getValidator(delegator.validationID); if (validator.messageNonce == 0) { - revert InvalidDelegationID(); + revert InvalidDelegationID(delegationID); } // Submit the message to the Warp precompile. @@ -568,7 +570,7 @@ abstract contract PoSValidatorManager is ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); if (delegator.validationID != validationID) { - revert InvalidValidationID(); + revert InvalidValidationID(delegator.validationID); } // The received nonce should be at least as high as the delegation's ending nonce. This allows a weight diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 962b3a387..4698e917f 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -62,20 +62,24 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida uint8 public constant BLS_PUBLIC_KEY_LENGTH = 48; bytes32 public constant P_CHAIN_BLOCKCHAIN_ID = bytes32(0); - error InvalidAddress(); - error InvalidBlockchainID(); - error InvalidExpiry(); + error InvalidValidatorManagerAddress(address validatorManagerAddress); + error InvalidWarpOriginSenderAddress(address senderAddress); + error InvalidValidatorManagerBlockchainID(bytes32 blockchainID); + error InvalidWarpSourceChainID(bytes32 sourceChainID); + error InvalidRegistrationExpiry(uint64 registrationExpiry); error InvalidInitializationStatus(); - error InvalidMaximumChurnPercentage(); - error InvalidBLSKey(); - error InvalidNodeID(); - error InvalidSubnetConversionID(bytes32 subnetConversionID); - error InvalidValidationID(); + error InvalidMaximumChurnPercentage(uint8 maximumChurnPercentage); + error InvalidBLSKeyLength(uint256 length); + error InvalidNodeID(bytes32 nodeID); + error InvalidSubnetConversionID( + bytes32 encodedSubnetConversionID, bytes32 expectedSubnetConversionID + ); + error InvalidValidationID(bytes32 validationID); error InvalidValidatorStatus(ValidatorStatus status); error InvalidWarpMessage(); error MaxChurnRateExceeded(uint64 churnAmount); - error NodeAlreadyRegistered(); - error UnexpectedRegistrationStatus(); + error NodeAlreadyRegistered(bytes32 nodeID); + error UnexpectedRegistrationStatus(bool validRegistration); // solhint-disable ordering function _getValidatorManagerStorage() @@ -116,7 +120,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida settings.maximumChurnPercentage > MAXIMUM_CHURN_PERCENTAGE_LIMIT || settings.maximumChurnPercentage == 0 ) { - revert InvalidMaximumChurnPercentage(); + revert InvalidMaximumChurnPercentage(settings.maximumChurnPercentage); } $._maximumChurnPercentage = settings.maximumChurnPercentage; @@ -144,10 +148,14 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Check that the blockchainID and validator manager address in the subnetConversionData correspond to this contract. // Other validation checks are done by the P-Chain when converting the subnet, so are not required here. if (subnetConversionData.validatorManagerBlockchainID != WARP_MESSENGER.getBlockchainID()) { - revert InvalidBlockchainID(); + revert InvalidValidatorManagerBlockchainID( + subnetConversionData.validatorManagerBlockchainID + ); } if (address(subnetConversionData.validatorManagerAddress) != address(this)) { - revert InvalidAddress(); + revert InvalidValidatorManagerAddress( + address(subnetConversionData.validatorManagerAddress) + ); } uint256 numInitialValidators = subnetConversionData.initialValidators.length; @@ -158,7 +166,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida bytes32 nodeID = initialValidator.nodeID; if ($._registeredValidators[nodeID] != bytes32(0)) { - revert NodeAlreadyRegistered(); + revert NodeAlreadyRegistered(nodeID); } // Validation ID of the initial validators is the sha256 hash of the @@ -195,7 +203,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ValidatorMessages.packSubnetConversionData(subnetConversionData); bytes32 encodedSubnetConversionID = sha256(encodedConversion); if (encodedSubnetConversionID != subnetConversionID) { - revert InvalidSubnetConversionID(encodedSubnetConversionID); + revert InvalidSubnetConversionID(encodedSubnetConversionID, subnetConversionID); } $._initializedValidatorSet = true; @@ -218,19 +226,19 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida input.registrationExpiry <= block.timestamp || input.registrationExpiry >= block.timestamp + MAXIMUM_REGISTRATION_EXPIRY_LENGTH ) { - revert InvalidExpiry(); + revert InvalidRegistrationExpiry(input.registrationExpiry); } // Ensure the nodeID is not the zero address, and is not already an active validator. if (input.blsPublicKey.length != BLS_PUBLIC_KEY_LENGTH) { - revert InvalidBLSKey(); + revert InvalidBLSKeyLength(input.blsPublicKey.length); } if (input.nodeID == bytes32(0)) { - revert InvalidNodeID(); + revert InvalidNodeID(input.nodeID); } if ($._registeredValidators[input.nodeID] != bytes32(0)) { - revert NodeAlreadyRegistered(); + revert NodeAlreadyRegistered(input.nodeID); } // Check that adding this validator would not exceed the maximum churn rate. @@ -276,7 +284,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); // The initial validator set must have been set already to have pending register validation messages. if ($._pendingRegisterValidationMessages[validationID].length == 0) { - revert InvalidValidationID(); + revert InvalidValidationID(validationID); } if ($._validationPeriods[validationID].status != ValidatorStatus.PendingAdded) { revert InvalidValidatorStatus($._validationPeriods[validationID].status); @@ -298,11 +306,11 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); if (!validRegistration) { - revert UnexpectedRegistrationStatus(); + revert UnexpectedRegistrationStatus(validRegistration); } // The initial validator set must have been set already to have pending register validation messages. if ($._pendingRegisterValidationMessages[validationID].length == 0) { - revert InvalidValidationID(); + revert InvalidValidationID(validationID); } if ($._validationPeriods[validationID].status != ValidatorStatus.PendingAdded) { revert InvalidValidatorStatus($._validationPeriods[validationID].status); @@ -407,7 +415,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida (bytes32 validationID, bool validRegistration) = ValidatorMessages.unpackSubnetValidatorRegistrationMessage(warpMessage.payload); if (validRegistration) { - revert UnexpectedRegistrationStatus(); + revert UnexpectedRegistrationStatus(validRegistration); } Validator memory validator = $._validationPeriods[validationID]; @@ -464,10 +472,10 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida } // Must match to P-Chain blockchain id, which is 0. if (warpMessage.sourceChainID != P_CHAIN_BLOCKCHAIN_ID) { - revert InvalidBlockchainID(); + revert InvalidWarpSourceChainID(warpMessage.sourceChainID); } if (warpMessage.originSenderAddress != address(0)) { - revert InvalidAddress(); + revert InvalidWarpOriginSenderAddress(warpMessage.originSenderAddress); } return warpMessage; diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index 83cb77da9..858333183 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -59,7 +59,9 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMinimumDelegationFee() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(PoSValidatorManager.InvalidDelegationFee.selector); + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.InvalidDelegationFee.selector, 0) + ); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -81,7 +83,11 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testMaxMinimumDelegationFee() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); uint16 minimumDelegationFeeBips = app.MAXIMUM_DELEGATION_FEE_BIPS() + 1; - vm.expectRevert(PoSValidatorManager.InvalidDelegationFee.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidDelegationFee.selector, minimumDelegationFeeBips + ) + ); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -102,7 +108,11 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testInvalidStakeAmountRange() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(PoSValidatorManager.InvalidStakeAmount.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidStakeAmount.selector, DEFAULT_MAXIMUM_STAKE_AMOUNT + ) + ); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -123,7 +133,9 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMaxStakeMultiplier() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(PoSValidatorManager.InvalidStakeMultiplier.selector); + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.InvalidStakeMultiplier.selector, 0) + ); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -145,7 +157,11 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { function testMaxStakeMultiplierOverLimit() public { app = new ERC20TokenStakingManager(ICMInitializable.Allowed); uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; - vm.expectRevert(PoSValidatorManager.InvalidStakeMultiplier.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidStakeMultiplier.selector, maximumStakeMultiplier + ) + ); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -168,7 +184,12 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ValidatorRegistrationInput memory input = ValidatorRegistrationInput(DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY); uint256 stakeAmount = _weightToValue(DEFAULT_WEIGHT); - vm.expectRevert(PoSValidatorManager.InvalidStakeDuration.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidMinStakeDuration.selector, + DEFAULT_MINIMUM_STAKE_DURATION - 1 + ) + ); app.initializeValidatorRegistration( input, DEFAULT_DELEGATION_FEE_BIPS, DEFAULT_MINIMUM_STAKE_DURATION - 1, stakeAmount ); diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index 78ba2629c..935b4cbe4 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -52,7 +52,9 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(PoSValidatorManager.InvalidDelegationFee.selector); + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.InvalidDelegationFee.selector, 0) + ); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -73,7 +75,11 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testMaxMinimumDelegationFee() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); uint16 minimumDelegationFeeBips = app.MAXIMUM_DELEGATION_FEE_BIPS() + 1; - vm.expectRevert(PoSValidatorManager.InvalidDelegationFee.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidDelegationFee.selector, minimumDelegationFeeBips + ) + ); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -93,7 +99,11 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testInvalidStakeAmountRange() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(PoSValidatorManager.InvalidStakeAmount.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidStakeAmount.selector, DEFAULT_MAXIMUM_STAKE_AMOUNT + ) + ); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -113,7 +123,9 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testZeroMaxStakeMultiplier() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); - vm.expectRevert(PoSValidatorManager.InvalidStakeMultiplier.selector); + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.InvalidStakeMultiplier.selector, 0) + ); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ @@ -134,7 +146,11 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { function testMaxStakeMultiplierOverLimit() public { app = new NativeTokenStakingManager(ICMInitializable.Allowed); uint8 maximumStakeMultiplier = app.MAXIMUM_STAKE_MULTIPLIER_LIMIT() + 1; - vm.expectRevert(PoSValidatorManager.InvalidStakeMultiplier.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidStakeMultiplier.selector, maximumStakeMultiplier + ) + ); app.initialize( PoSValidatorManagerSettings({ baseSettings: ValidatorManagerSettings({ diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 738424cc7..e53c5ccf3 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -79,7 +79,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(PoSValidatorManager.InvalidDelegationFee.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidDelegationFee.selector, + DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1 + ) + ); _initializeValidatorRegistration( registrationInput, DEFAULT_MINIMUM_DELEGATION_FEE_BIPS - 1, @@ -95,7 +100,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); uint16 delegationFeeBips = posValidatorManager.MAXIMUM_DELEGATION_FEE_BIPS() + 1; - vm.expectRevert(PoSValidatorManager.InvalidDelegationFee.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidDelegationFee.selector, delegationFeeBips + ) + ); _initializeValidatorRegistration( registrationInput, @@ -111,7 +120,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(PoSValidatorManager.InvalidStakeDuration.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidMinStakeDuration.selector, + DEFAULT_MINIMUM_STAKE_DURATION - 1 + ) + ); _initializeValidatorRegistration( registrationInput, DEFAULT_DELEGATION_FEE_BIPS, @@ -126,7 +140,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(PoSValidatorManager.InvalidStakeAmount.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidStakeAmount.selector, DEFAULT_MINIMUM_STAKE_AMOUNT - 1 + ) + ); _initializeValidatorRegistration( registrationInput, DEFAULT_DELEGATION_FEE_BIPS, @@ -141,7 +159,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationExpiry: DEFAULT_EXPIRY, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); - vm.expectRevert(PoSValidatorManager.InvalidStakeAmount.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.InvalidStakeAmount.selector, DEFAULT_MAXIMUM_STAKE_AMOUNT + 1 + ) + ); _initializeValidatorRegistration( registrationInput, DEFAULT_DELEGATION_FEE_BIPS, @@ -159,7 +181,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); - vm.expectRevert(PoSValidatorManager.InvalidStakeDuration.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.MinStakeDurationNotPassed.selector, block.timestamp + ) + ); posValidatorManager.initializeEndValidation(validationID, false, 0); } @@ -191,7 +217,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetUptimeWarpMessage(new bytes(0), true); _mockGetBlockchainID(posValidatorManager.P_CHAIN_BLOCKCHAIN_ID()); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); - vm.expectRevert(ValidatorManager.InvalidBlockchainID.selector); + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.InvalidWarpSourceChainID.selector, DEFAULT_SOURCE_BLOCKCHAIN_ID + ) + ); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -223,7 +253,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); - vm.expectRevert(ValidatorManager.InvalidAddress.selector); + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.InvalidWarpOriginSenderAddress.selector, address(this) + ) + ); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -255,7 +289,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { ); vm.warp(DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION); - vm.expectRevert(ValidatorManager.InvalidValidationID.selector); + vm.expectRevert( + abi.encodeWithSelector(ValidatorManager.InvalidValidationID.selector, validationID) + ); posValidatorManager.initializeEndValidation(validationID, true, 0); } @@ -422,7 +458,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP }); vm.prank(address(1)); - vm.expectRevert(ValidatorManager.InvalidAddress.selector); + vm.expectRevert( + abi.encodeWithSelector(PoSValidatorManager.UnauthorizedOwner.selector, address(1)) + ); posValidatorManager.initializeEndValidation(validationID, false, 0); } From 2b7acc6e9d86c7cfb39efc4a2b26129627ea52d8 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 25 Sep 2024 14:14:34 -0500 Subject: [PATCH 417/545] add comments --- contracts/validator-manager/PoSValidatorManager.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 84627885c..27e4a7240 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -184,9 +184,13 @@ abstract contract PoSValidatorManager is bool includeUptimeProof, uint32 messageIndex ) external { + // Ignore the return value here to force end validation, regardless of possible missed rewards _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. function _initializeEndPoSValidation( bytes32 validationID, bool includeUptimeProof, From 8532f145b704183f88bfa88a24eb7ac3de42d0ca Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 25 Sep 2024 15:41:48 -0400 Subject: [PATCH 418/545] Update contracts/validator-manager/PoSValidatorManager.sol Co-authored-by: Michael Kaplan <55204436+michaelkaplan13@users.noreply.github.com> Signed-off-by: Geoff Stuart --- contracts/validator-manager/PoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index a0cbee59c..95bae8de1 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -358,7 +358,7 @@ abstract contract PoSValidatorManager is Delegator memory delegator = $._delegatorStakes[delegationID]; bytes32 validationID = delegator.validationID; - Validator memory validator = getValidator(delegator.validationID); + Validator memory validator = getValidator(validationID); // Ensure the delegator is pending added. Since anybody can call this function once // delegator registration has been initialized, we need to make sure that this function is only From ff9e06e53c063d19132fd263479c010e2f3fed40 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 25 Sep 2024 15:33:06 -0500 Subject: [PATCH 419/545] remove former poa validator unit test --- .../tests/PoSValidatorManagerTests.t.sol | 15 +++++++++++++ .../tests/ValidatorManagerTests.t.sol | 21 ++++++++++++++----- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index ca3c36d59..ac8ef5641 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -867,6 +867,21 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndValidation(validationID, true, false); } + function testInitializeEndValidationPoAValidator() public { + bytes32 defaultInitialValidationID = sha256(abi.encodePacked(bytes32(0), uint32(1))); + + vm.warp(DEFAULT_COMPLETION_TIMESTAMP); + bytes memory setValidatorWeightPayload = + ValidatorMessages.packSetSubnetValidatorWeightMessage(defaultInitialValidationID, 1, 0); + _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit ValidatorRemovalInitialized( + defaultInitialValidationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP + ); + + _initializeEndValidation(defaultInitialValidationID, false, false); + } + function testForceInitializeEndValidation() public { _setUpInitializeEndValidation({ nodeID: DEFAULT_NODE_ID, diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index 2b1357b46..cae278912 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -21,18 +21,21 @@ abstract contract ValidatorManagerTest is Test { bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes32 public constant DEFAULT_NODE_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); - bytes32 public constant DEFAULT_INITIAL_VALIDATOR_NODE_ID = + bytes32 public constant DEFAULT_INITIAL_VALIDATOR_NODE_ID_1 = bytes32(hex"2345678123456781234567812345678123456781234567812345678123456781"); + bytes32 public constant DEFAULT_INITIAL_VALIDATOR_NODE_ID_2 = + bytes32(hex"1345678123456781234567812345678123456781234567812345678123456781"); bytes public constant DEFAULT_BLS_PUBLIC_KEY = bytes( hex"123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); bytes32 public constant DEFAULT_SOURCE_BLOCKCHAIN_ID = bytes32(hex"abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd"); bytes32 public constant DEFAULT_SUBNET_CONVERSION_TX_ID = - bytes32(hex"1fa884c03c55ff866c210963db9100dd14964615da464c6b9871854374bb6026"); + bytes32(hex"b4836b329538fa9ca7b5bcaabc443ade2b4825246455c5c3932672d083f6b976"); address public constant WARP_PRECOMPILE_ADDRESS = 0x0200000000000000000000000000000000000005; uint64 public constant DEFAULT_WEIGHT = 1e6; + // Set the default weight to 1e10 to avoid churn issues uint64 public constant DEFAULT_INITIAL_VALIDATOR_WEIGHT = DEFAULT_WEIGHT * 1e4; uint256 public constant DEFAULT_MINIMUM_STAKE_AMOUNT = 20e12; uint256 public constant DEFAULT_MAXIMUM_STAKE_AMOUNT = 1e22; @@ -41,7 +44,7 @@ abstract contract ValidatorManagerTest is Test { uint64 public constant DEFAULT_EXPIRY = 1000; uint8 public constant DEFAULT_MAXIMUM_HOURLY_CHURN = 0; uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; - uint256 public constant DEFAULT_STARTING_TOTAL_WEIGHT = 1e10; + uint256 public constant DEFAULT_STARTING_TOTAL_WEIGHT = 1e10 + DEFAULT_WEIGHT; uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = 100_000; ValidatorManager public validatorManager; @@ -459,12 +462,20 @@ abstract contract ValidatorManagerTest is Test { function _beforeSend(uint256 amount, address spender) internal virtual; function _defaultSubnetConversionData() internal view returns (SubnetConversionData memory) { - InitialValidator[] memory initialValidators = new InitialValidator[](1); + InitialValidator[] memory initialValidators = new InitialValidator[](2); + // The first initial validator has a high weight relative to the default PoS validator weight + // to avoid churn issues initialValidators[0] = InitialValidator({ - nodeID: DEFAULT_INITIAL_VALIDATOR_NODE_ID, + nodeID: DEFAULT_INITIAL_VALIDATOR_NODE_ID_1, weight: DEFAULT_INITIAL_VALIDATOR_WEIGHT, blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); + // The second initial validator has a low weight so that it can be safely removed in tests + initialValidators[1] = InitialValidator({ + nodeID: DEFAULT_INITIAL_VALIDATOR_NODE_ID_2, + weight: DEFAULT_WEIGHT, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + }); return SubnetConversionData({ convertSubnetTxID: bytes32(0), validatorManagerBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, From c1e1b95ecf97fce29469bd4b7c800ca1eb179628 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 25 Sep 2024 15:39:24 -0500 Subject: [PATCH 420/545] refactor force helpers --- .../tests/PoAValidatorManagerTests.t.sol | 6 ++++- .../tests/PoSValidatorManagerTests.t.sol | 25 +++++++++++-------- .../tests/ValidatorManagerTests.t.sol | 16 +++++++++--- 3 files changed, 31 insertions(+), 16 deletions(-) diff --git a/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol index fedac34d4..a6360df10 100644 --- a/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol @@ -56,7 +56,11 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { return app.initializeValidatorRegistration(input, weight); } - function _initializeEndValidation(bytes32 validationID, bool, bool) internal virtual override { + function _initializeEndValidation(bytes32 validationID, bool) internal virtual override { + return app.initializeEndValidation(validationID); + } + + function _forceInitializeEndValidation(bytes32 validationID, bool) internal virtual override { return app.initializeEndValidation(validationID); } diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index ac8ef5641..816f81f9e 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -836,7 +836,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP ); - _initializeEndValidation(validationID, true, false); + _initializeEndValidation(validationID, true); } function testInitializeEndValidationInsufficientUptime() public { @@ -864,7 +864,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.expectRevert(PoSValidatorManager.ValidatorIneligibleForRewards.selector); - _initializeEndValidation(validationID, true, false); + _initializeEndValidation(validationID, true); } function testInitializeEndValidationPoAValidator() public { @@ -879,7 +879,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { defaultInitialValidationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP ); - _initializeEndValidation(defaultInitialValidationID, false, false); + _initializeEndValidation(defaultInitialValidationID, false); } function testForceInitializeEndValidation() public { @@ -924,7 +924,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { validationID, bytes32(0), DEFAULT_WEIGHT, DEFAULT_COMPLETION_TIMESTAMP ); - _initializeEndValidation(validationID, true, true); + _forceInitializeEndValidation(validationID, true); } function testValueToWeight() public view { @@ -956,14 +956,17 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _initializeEndValidation( bytes32 validationID, - bool includeUptime, - bool force + bool includeUptime ) internal virtual override { - if (force) { - posValidatorManager.forceInitializeEndValidation(validationID, includeUptime, 0); - } else { - posValidatorManager.initializeEndValidation(validationID, includeUptime, 0); - } + posValidatorManager.initializeEndValidation(validationID, includeUptime, 0); + + } + + function _forceInitializeEndValidation( + bytes32 validationID, + bool includeUptime + ) internal virtual override { + posValidatorManager.forceInitializeEndValidation(validationID, includeUptime, 0); } function _initializeDelegatorRegistration( diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index cae278912..af396671a 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -268,7 +268,7 @@ abstract contract ValidatorManagerTest is Test { // Second call should fail vm.expectRevert(ValidatorManager.MaxChurnRateExceeded.selector); - _initializeEndValidation(validationID, false, false); + _initializeEndValidation(validationID, false); } function _newNodeID() internal returns (bytes32) { @@ -377,7 +377,11 @@ abstract contract ValidatorManagerTest is Test { vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized(validationID, bytes32(0), weight, completionTimestamp); - _initializeEndValidation(validationID, includeUptime, force); + if (force) { + _forceInitializeEndValidation(validationID, includeUptime); + } else { + _initializeEndValidation(validationID, includeUptime); + } } function _mockSendWarpMessage(bytes memory payload, bytes32 expectedMessageID) internal { @@ -455,8 +459,12 @@ abstract contract ValidatorManagerTest is Test { function _initializeEndValidation( bytes32 validationID, - bool includeUptime, - bool force + bool includeUptime + ) internal virtual; + + function _forceInitializeEndValidation( + bytes32 validationID, + bool includeUptime ) internal virtual; function _beforeSend(uint256 amount, address spender) internal virtual; From 14003d2c2ce5301cb70014a19a4eb22e4b11584b Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 25 Sep 2024 17:39:26 -0400 Subject: [PATCH 421/545] Make _calculateDelegationReward view --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../validator-manager/PoSValidatorManager.sol | 16 ++++++++++------ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6be54a428..3b897780c 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516153ab3803806153ab83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61525e8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b33660046147dd565b61040d565b005b6101b86101c8366004614818565b61069c565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004614818565b61080e565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b861024136600461482f565b610824565b6101b8610254366004614848565b6108c5565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b8610284366004614870565b610b1f565b61029c6102973660046148d4565b610fa3565b6040519081526020016101e3565b6101ff6102b8366004614818565b610fbc565b61029c5f81565b6101b86102d23660046147dd565b610fd0565b6101d5603081565b6101b86102ed366004614818565b6111c2565b6101b8610300366004614848565b61127d565b61029c6103133660046148ed565b611444565b6101b861032636600461482f565b611470565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004614818565b6115e2565b6101b8610372366004614818565b6117be565b6101d5601481565b61039261038d366004614818565b6118e8565b6040516101e39190614921565b6101ff6202a30081565b61029c6103b7366004614818565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f53660046149e1565b6119b0565b6101b8610408366004614a5a565b6119e5565b5f8381525f805160206151928339815191526020526040808220815160e0810190925280545f805160206151d283398151915293929190829060ff16600381111561045a5761045a61490d565b600381111561046b5761046b61490d565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e1826118e8565b90506002835160038111156104f8576104f861490d565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156105735761057361490d565b036106195785156105b7576105888286611ac4565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b6105d482846060015183608001516105cf9190614aac565b611c48565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561061487611d9f565b610667565b60048151600581111561062e5761062e61490d565b0361064e5761063c87611d9f565b61064587611fe6565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f805160206152328339815191526020526040808220815160e0810190925280545f805160206151f283398151915293929190829060ff1660058111156106e9576106e961490d565b60058111156106fa576106fa61490d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156107695761076961490d565b146107875760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107ac8584606001515f6121cd565b6040518263ffffffff1660e01b81526004016107c89190614aee565b6020604051808303815f875af11580156107e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108089190614b20565b50505050565b5f61081e64e8d4a5100083614b37565b92915050565b5f805160206151d28339815191525f8061083d84612224565b9150915061084a826124c2565b6108545750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156108835761088361490d565b036108a8575f838152600785016020526040812080549190556108a682826124fd565b505b6108be816108b98460400151610fa3565b61256a565b5050505050565b5f8181525f805160206151928339815191526020526040808220815160e0810190925280545f805160206151d283398151915293929190829060ff1660038111156109125761091261490d565b60038111156109235761092361490d565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610999826118e8565b90506001835160038111156109b0576109b061490d565b146109ce5760405163f95c7fe160e01b815260040160405180910390fd5b6004815160058111156109e3576109e361490d565b036109f9576109f185611fe6565b505050505050565b5f610a038761258d565b90505f80610a14836040015161268d565b5091509150818514610a3957604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610a725750806001600160401b03168660a001516001600160401b0316115b15610a9057604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151f28339815191529060ff1615610b7157604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bb4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bd89190614b20565b836020013514610bfb5760405163d040949d60e01b815260040160405180910390fd5b30610c0c6060850160408601614b56565b6001600160a01b031614610c335760405163e6c4247b60e01b815260040160405180910390fd5b5f610c416060850185614b71565b905090505f805b828163ffffffff161015610eed575f610c646060880188614b71565b8363ffffffff16818110610c7a57610c7a614bb6565b9050602002810190610c8c9190614bca565b610c9590614c7a565b80515f8181526008880160205260409020549192509015610cc957604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610cf892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610d1291614d11565b602060405180830381855afa158015610d2d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d509190614b20565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610ddc57610ddc61490d565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610e8f911686614d22565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610ee690614d35565b9050610c48565b50600483018190555f610eff8561258d565b90505f610f0f82604001516128cb565b90505f610f1b88612a40565b905081600282604051610f2e9190614d11565b602060405180830381855afa158015610f49573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f6c9190614b20565b14610f8a57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61081e6001600160401b03831664e8d4a51000614d57565b5f610fc6826118e8565b6080015192915050565b5f805160206151d28339815191525f610fe885612ed9565b9050610ff3856124c2565b610ffe575050505050565b5f8581526004830160205260409020546001600160a01b031633146110365760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161106591600160b01b90046001600160401b031690614d6e565b6001600160401b03168160c001516001600160401b0316101561109b576040516302336bad60e51b815260040160405180910390fd5b83156108be575f6110ac8685611ac4565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906110fc90610fa3565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611172573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111969190614b20565b5f878152600785016020526040812080549091906111b5908490614d22565b9091555050505050505050565b5f805160206151d28339815191525f6111da836118e8565b90506004815160058111156111f1576111f161490d565b1461120f5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146112475760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610808906001600160a01b0316826124fd565b611285613116565b5f8181525f805160206151928339815191526020526040808220815160e0810190925280545f805160206151d283398151915293929190829060ff1660038111156112d2576112d261490d565b60038111156112e3576112e361490d565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561135c5761135c61490d565b1461137a5760405163f95c7fe160e01b815260040160405180910390fd5b600461138982604001516118e8565b51600581111561139b5761139b61490d565b1461141f575f6113aa8561258d565b90505f806113bb836040015161268d565b5091509150818460400151146113e457604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561141b57604051633ab3447f60e11b815260040160405180910390fd5b5050505b61142883611fe6565b505061144060015f8051602061521283398151915255565b5050565b5f61144d613116565b611458833384613160565b905061081e60015f8051602061521283398151915255565b5f805160206151f28339815191525f6114888361258d565b90505f806114998360400151613427565b91509150806114bb57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546114d590614d8e565b90505f036114f657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561151c5761151c61490d565b1461153a5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206115529161472d565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206151928339815191526020526040808220815160e0810190925280545f805160206151d283398151915293929190829060ff16600381111561162f5761162f61490d565b60038111156116405761164061490d565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116b9576116b961490d565b141580156116da57506003815160038111156116d7576116d761490d565b14155b156116f85760405163f95c7fe160e01b815260040160405180910390fd5b5f61170682604001516118e8565b905080606001516001600160401b03165f0361173557604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6117628460400151846060015185608001516121cd565b6040518263ffffffff1660e01b815260040161177e9190614aee565b6020604051808303815f875af115801561179a573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108be9190614b20565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206151f2833981519152919061180590614d8e565b90505f0361182657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561184c5761184c61490d565b1461186a5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118a39190600401614dc6565b6020604051808303815f875af11580156118bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118e39190614b20565b505050565b6118f0614764565b5f8281525f80516020615232833981519152602052604090819020815160e0810190925280545f805160206151f2833981519152929190829060ff16600581111561193d5761193d61490d565b600581111561194e5761194e61490d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6119b9613116565b6119c5858585856135cb565b90506119dd60015f8051602061521283398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a2e575080546001600160401b03808416911610155b15611a4c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a778484613769565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611b0f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b369190810190614e5b565b9150915080611b5857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bbf9190614b20565b825114611bdf5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611c0b5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611c1a8460400151613783565b91509150818714611c3e57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615232833981519152602052604081206002015481905f805160206151f283398151915290600160801b90046001600160401b0316611c90858261395e565b5f611c9a87613b27565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611cea8a858b6121cd565b6040518263ffffffff1660e01b8152600401611d069190614aee565b6020604051808303815f875af1158015611d22573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d469190614b20565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f805160206151928339815191526020526040808220815160e0810190925280545f805160206151d283398151915293929190829060ff166003811115611dec57611dec61490d565b6003811115611dfd57611dfd61490d565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611e73826118e8565b90505f600382516005811115611e8b57611e8b61490d565b1480611ea95750600482516005811115611ea757611ea761490d565b145b15611eb9575060c0810151611ed6565b600282516005811115611ece57611ece61490d565b0361064e5750425b83608001516001600160401b0316816001600160401b031611611efb57505050505050565b600385015460608501516001600160a01b039091169063778c06b590611f2090610fa3565b60a085015160808801515f88815260088b01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa158015611fa7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fcb9190614b20565b5f968752600690950160205250506040909320919091555050565b5f8181525f805160206151928339815191526020526040808220815160e0810190925280545f805160206151d283398151915293929190829060ff1660038111156120335761203361490d565b60038111156120445761204461490d565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612172575f8481526004870160205260409020546127109061212490600160a01b900461ffff1685614d57565b61212e9190614b37565b915081866007015f8681526020019081526020015f205f8282546121529190614d22565b9091555061216290508284614f2d565b90506121728560200151826124fd565b61218785602001516108b98760600151610fa3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f61222d614764565b5f805160206151f28339815191525f6122458561258d565b90505f806122568360400151613427565b91509150801561227957604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156122aa576122aa61490d565b60058111156122bb576122bb61490d565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561232a5761232a61490d565b1415801561234b57506001815160058111156123485761234861490d565b14155b156123695760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561237e5761237e61490d565b0361238c5760048152612391565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156123d6576123d661490d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561248a5761248a61490d565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206151b283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612558575f80fd5b505af1158015610645573d5f803e3d5ffd5b5f805160206151b283398151915254611440906001600160a01b03168383613b9c565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156125f1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126189190810190614e5b565b915091508061263a57604051636b2f19e960e01b815260040160405180910390fd5b81511561265a5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156126865760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146126b257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612701576126c9816001614f2d565b6126d4906008614d57565b61ffff168682815181106126ea576126ea614bb6565b016020015160f81c901b91909117906001016126b5565b5061ffff8116156127255760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156127805761273c816003614f2d565b612747906008614d57565b63ffffffff1687612759836002614d22565b8151811061276957612769614bb6565b016020015160f81c901b9190911790600101612728565b5063ffffffff81166004146127a857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156127fd576127bf81601f614f2d565b6127ca906008614d57565b886127d6836006614d22565b815181106127e6576127e6614bb6565b016020015160f81c901b91909117906001016127ab565b505f805b600881101561285c57612815816007614f2d565b612820906008614d57565b6001600160401b031689612835836026614d22565b8151811061284557612845614bb6565b016020015160f81c901b9190911790600101612801565b505f805b60088110156128bb57612874816007614f2d565b61287f906008614d57565b6001600160401b03168a61289483602e614d22565b815181106128a4576128a4614bb6565b016020015160f81c901b9190911790600101612860565b5091989097509095509350505050565b5f81516026146128ee57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561293d57612905816001614f2d565b612910906008614d57565b61ffff1684828151811061292657612926614bb6565b016020015160f81c901b91909117906001016128f1565b5061ffff8116156129615760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156129bc57612978816003614f2d565b612983906008614d57565b63ffffffff1685612995836002614d22565b815181106129a5576129a5614bb6565b016020015160f81c901b9190911790600101612964565b5063ffffffff8116156129e257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a37576129f981601f614f2d565b612a04906008614d57565b86612a10836006614d22565b81518110612a2057612a20614bb6565b016020015160f81c901b91909117906001016129e5565b50949350505050565b60605f612a4f83830184614b71565b612a5b91506058614d57565b612a6690605c614d22565b6001600160401b03811115612a7d57612a7d614be8565b6040519080825280601f01601f191660200182016040528015612aa7576020820181803683370190505b5090505f5b6020811015612afc5783358160208110612ac857612ac8614bb6565b1a60f81b828281518110612ade57612ade614bb6565b60200101906001600160f81b03191690815f1a905350600101612aac565b505f5b6020811015612b5c5783602001358160208110612b1e57612b1e614bb6565b1a60f81b82612b2e836020614d22565b81518110612b3e57612b3e614bb6565b60200101906001600160f81b03191690815f1a905350600101612aff565b505f5b6004811015612bbf57612b73816003614f2d565b612b7e906008614d57565b6014901c60f81b82612b91836040614d22565b81518110612ba157612ba1614bb6565b60200101906001600160f81b03191690815f1a905350600101612b5f565b505f612bd16060850160408601614b56565b60601b90505f5b6014811015612c3157818160148110612bf357612bf3614bb6565b1a60f81b83612c03836044614d22565b81518110612c1357612c13614bb6565b60200101906001600160f81b03191690815f1a905350600101612bd8565b505f612c406060860186614b71565b905090505f5b6004811015612cab57612c5a816003614f2d565b612c65906008614d57565b63ffffffff8316901c60f81b84612c7d836058614d22565b81518110612c8d57612c8d614bb6565b60200101906001600160f81b03191690815f1a905350600101612c46565b505f5b612cbb6060870187614b71565b9050811015612ecf575f612cd0826058614d57565b612cdb90605c614d22565b90505f5b6020811015612d6657612cf56060890189614b71565b84818110612d0557612d05614bb6565b9050602002810190612d179190614bca565b358160208110612d2957612d29614bb6565b1a60f81b86612d388385614d22565b81518110612d4857612d48614bb6565b60200101906001600160f81b03191690815f1a905350600101612cdf565b505f5b6008811015612e1b57612d7d816007614f2d565b612d88906008614d57565b612d9560608a018a614b71565b85818110612da557612da5614bb6565b9050602002810190612db79190614bca565b612dc89060408101906020016148d4565b6001600160401b0316901c60f81b8682612de3856020614d22565b612ded9190614d22565b81518110612dfd57612dfd614bb6565b60200101906001600160f81b03191690815f1a905350600101612d69565b505f5b6030811015612ec557612e346060890189614b71565b84818110612e4457612e44614bb6565b9050602002810190612e569190614bca565b612e64906040810190614f40565b82818110612e7457612e74614bb6565b9050013560f81c60f81b8682846028612e8d9190614d22565b612e979190614d22565b81518110612ea757612ea7614bb6565b60200101906001600160f81b03191690815f1a905350600101612e1e565b5050600101612cae565b5091949350505050565b612ee1614764565b5f8281525f805160206152328339815191526020526040808220815160e0810190925280545f805160206151f283398151915293929190829060ff166005811115612f2e57612f2e61490d565b6005811115612f3f57612f3f61490d565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612fb157612fb161490d565b14612fcf5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156130135761301361490d565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130bf8582611c48565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061521283398151915280546001190161314757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061521283398151915255565b5f5f805160206151d28339815191528161317c6101fa85613bfb565b90505f613188876118e8565b9050613193876124c2565b6131b057604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156131c5576131c561490d565b146131e35760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516131f49190614d6e565b905083600201600a9054906101000a90046001600160401b0316826040015161321d9190614f82565b6001600160401b0316816001600160401b0316111561324f57604051630c192e7760e41b815260040160405180910390fd5b5f8061325b8a84611c48565b915091505f8a8360405160200161328992919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561331c5761331c61490d565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461344b57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561349a57613462816001614f2d565b61346d906008614d57565b61ffff1685828151811061348357613483614bb6565b016020015160f81c901b919091179060010161344e565b5061ffff8116156134be5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613519576134d5816003614f2d565b6134e0906008614d57565b63ffffffff16866134f2836002614d22565b8151811061350257613502614bb6565b016020015160f81c901b91909117906001016134c1565b5063ffffffff811660031461354157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135965761355881601f614f2d565b613563906008614d57565b8761356f836006614d22565b8151811061357f5761357f614bb6565b016020015160f81c901b9190911790600101613544565b505f866026815181106135ab576135ab614bb6565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206151d283398151915290600160401b900461ffff908116908616108061361f575061271061ffff8616115b1561363d5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561366f576040516302336bad60e51b815260040160405180910390fd5b80548310806136815750806001015483115b1561369f57604051630103be3b60e21b815260040160405180910390fd5b5f6136a984613bfb565b90505f6136b58261080e565b90505f6136c28983613c1e565b905060405180606001604052806136d63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613771614008565b61377a82614053565b611440816140c4565b5f808251602e146137a757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137f6576137be816001614f2d565b6137c9906008614d57565b61ffff168582815181106137df576137df614bb6565b016020015160f81c901b91909117906001016137aa565b5061ffff81161561381a5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561387557613831816003614f2d565b61383c906008614d57565b63ffffffff168661384e836002614d22565b8151811061385e5761385e614bb6565b016020015160f81c901b919091179060010161381d565b5063ffffffff811660051461389d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138f2576138b481601f614f2d565b6138bf906008614d57565b876138cb836006614d22565b815181106138db576138db614bb6565b016020015160f81c901b91909117906001016138a0565b505f805b60088110156139515761390a816007614f2d565b613915906008614d57565b6001600160401b03168861392a836026614d22565b8151811061393a5761393a614bb6565b016020015160f81c901b91909117906001016138f6565b5090969095509350505050565b5f805160206151f28339815191525f6001600160401b0380841690851611156139925761398b8385614aac565b905061399f565b61399c8484614aac565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a015750600184015481516139fd916001600160401b031690614d22565b8210155b15613a27576001600160401b038316606082015281815260408101516020820152613a46565b8281606001818151613a399190614d6e565b6001600160401b03169052505b6060810151613a56906064614f82565b602082015160018601546001600160401b039290921691613a819190600160401b900460ff16614d57565b1015613aa05760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613abb9190614d22565b9052506040810180516001600160401b0387169190613adb908390614f2d565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206152328339815191526020526040812060020180545f805160206151f28339815191529190600890613b7190600160401b90046001600160401b0316614fad565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b038381166024830152604482018390526118e391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614121565b5f61081e825f805160206151b2833981519152546001600160a01b031690614187565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613c6257604051637fab81e560e01b815260040160405180910390fd5b5f805160206151f283398151915242613c8160408601602087016148d4565b6001600160401b0316111580613cbb5750613c9f6202a30042614d22565b613caf60408601602087016148d4565b6001600160401b031610155b15613cd85760405162d36c8560e81b815260040160405180910390fd5b6030613ce76040860186614f40565b9050141580613cf557508335155b15613d135760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613d4357604051630eb0d31360e11b815260040160405180910390fd5b613d4d835f61395e565b5f80613de66040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613d9191906148d4565b6001600160401b03168152602001613dac60408a018a614f40565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506142e9565b5f82815260068601602052604090209193509150613e04828261500c565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613e42908590600401614aee565b6020604051808303815f875af1158015613e5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e829190614b20565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613efa57613efa61490d565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613fda918e01908e016148d4565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661405157604051631afcd79f60e31b815260040160405180910390fd5b565b61405b614008565b614064816143ac565b61406c6143c5565b6140c16060820135608083013561408960c0850160a086016148d4565b61409960e0860160c087016150c7565b6140aa610100870160e088016150e0565b6140bc61012088016101008901614b56565b6143d5565b50565b6140cc614008565b5f805160206151b28339815191526001600160a01b0382166141015760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6141356001600160a01b038416836144f6565b905080515f141580156141595750808060200190518101906141579190615100565b155b156118e357604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156141cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141f19190614b20565b90506142086001600160a01b038516333086614503565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561424c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142709190614b20565b90508181116142d65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161417e565b6142e08282614f2d565b95945050505050565b5f606082608001515160301461431257604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614344979695949392919061511b565b60405160208183030381529060405290506002816040516143659190614d11565b602060405180830381855afa158015614380573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143a39190614b20565b94909350915050565b6143b4614008565b6143bc61453c565b6140c181614544565b6143cd614008565b614051614616565b6143dd614008565b5f805160206151d283398151915261ffff84161580614401575061271061ffff8516115b1561441f5760405163c98d73a760e01b815260040160405180910390fd5b8587111561444057604051630103be3b60e21b815260040160405180910390fd5b60ff831615806144535750600a60ff8416115b15614471576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061221d83835f61461e565b6040516001600160a01b0384811660248301528381166044830152606482018390526108089186918216906323b872dd90608401613bc9565b614051614008565b61454c614008565b80355f805160206151f2833981519152908155601461457160608401604085016150e0565b60ff161180614590575061458b60608301604084016150e0565b60ff16155b156145ae5760405163b4fa3fb360e01b815260040160405180910390fd5b6145be60608301604084016150e0565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556145ef60408301602084016148d4565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61314d614008565b6060814710156146435760405163cd78605960e01b815230600482015260240161417e565b5f80856001600160a01b0316848660405161465e9190614d11565b5f6040518083038185875af1925050503d805f8114614698576040519150601f19603f3d011682016040523d82523d5f602084013e61469d565b606091505b5091509150611c3e8683836060826146bd576146b882614704565b61221d565b81511580156146d457506001600160a01b0384163b155b156146fd57604051639996b31560e01b81526001600160a01b038516600482015260240161417e565b508061221d565b8051156147145780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461473990614d8e565b5f825580601f10614748575050565b601f0160209004905f5260205f20908101906140c191906147a0565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156147b4575f81556001016147a1565b5090565b80151581146140c1575f80fd5b803563ffffffff811681146147d8575f80fd5b919050565b5f805f606084860312156147ef575f80fd5b833592506020840135614801816147b8565b915061480f604085016147c5565b90509250925092565b5f60208284031215614828575f80fd5b5035919050565b5f6020828403121561483f575f80fd5b61221d826147c5565b5f8060408385031215614859575f80fd5b614862836147c5565b946020939093013593505050565b5f8060408385031215614881575f80fd5b82356001600160401b03811115614896575f80fd5b8301608081860312156148a7575f80fd5b91506148b5602084016147c5565b90509250929050565b80356001600160401b03811681146147d8575f80fd5b5f602082840312156148e4575f80fd5b61221d826148be565b5f80604083850312156148fe575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061494457634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161497f60608401826001600160401b03169052565b50608083015161499a60808401826001600160401b03169052565b5060a08301516149b560a08401826001600160401b03169052565b5060c083015161268660c08401826001600160401b03169052565b803561ffff811681146147d8575f80fd5b5f805f80608085870312156149f4575f80fd5b84356001600160401b03811115614a09575f80fd5b850160608188031215614a1a575f80fd5b9350614a28602086016149d0565b9250614a36604086016148be565b9396929550929360600135925050565b6001600160a01b03811681146140c1575f80fd5b5f80828403610140811215614a6d575f80fd5b61012080821215614a7c575f80fd5b8493508301359050614a8d81614a46565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561268657612686614a98565b5f5b83811015614ae6578181015183820152602001614ace565b50505f910152565b602081525f8251806020840152614b0c816040850160208701614acc565b601f01601f19169190910160400192915050565b5f60208284031215614b30575f80fd5b5051919050565b5f82614b5157634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614b66575f80fd5b813561221d81614a46565b5f808335601e19843603018112614b86575f80fd5b8301803591506001600160401b03821115614b9f575f80fd5b6020019150600581901b3603821315611d98575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614bde575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614c1e57614c1e614be8565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c4c57614c4c614be8565b604052919050565b5f6001600160401b03821115614c6c57614c6c614be8565b50601f01601f191660200190565b5f60608236031215614c8a575f80fd5b614c92614bfc565b823581526020614ca38185016148be565b8183015260408401356001600160401b03811115614cbf575f80fd5b840136601f820112614ccf575f80fd5b8035614ce2614cdd82614c54565b614c24565b8181523684838501011115614cf5575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614bde818460208701614acc565b8082018082111561081e5761081e614a98565b5f63ffffffff808316818103614d4d57614d4d614a98565b6001019392505050565b808202811582820484141761081e5761081e614a98565b6001600160401b0381811683821601908082111561268657612686614a98565b600181811c90821680614da257607f821691505b602082108103614dc057634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614dd881614d8e565b806020870152604060018084165f8114614df95760018114614e1557614e42565b60ff19851660408a0152604084151560051b8a01019550614e42565b895f5260205f205f5b85811015614e395781548b8201860152908301908801614e1e565b8a016040019650505b509398975050505050505050565b80516147d8816147b8565b5f8060408385031215614e6c575f80fd5b82516001600160401b0380821115614e82575f80fd5b9084019060608287031215614e95575f80fd5b614e9d614bfc565b82518152602080840151614eb081614a46565b82820152604084015183811115614ec5575f80fd5b80850194505087601f850112614ed9575f80fd5b83519250614ee9614cdd84614c54565b8381528882858701011115614efc575f80fd5b614f0b84838301848801614acc565b80604084015250819550614f20818801614e50565b9450505050509250929050565b8181038181111561081e5761081e614a98565b5f808335601e19843603018112614f55575f80fd5b8301803591506001600160401b03821115614f6e575f80fd5b602001915036819003821315611d98575f80fd5b6001600160401b03818116838216028082169190828114614fa557614fa5614a98565b505092915050565b5f6001600160401b03808316818103614d4d57614d4d614a98565b601f8211156118e357805f5260205f20601f840160051c81016020851015614fed5750805b601f840160051c820191505b818110156108be575f8155600101614ff9565b81516001600160401b0381111561502557615025614be8565b615039816150338454614d8e565b84614fc8565b602080601f83116001811461506c575f84156150555750858301515b5f19600386901b1c1916600185901b1785556109f1565b5f85815260208120601f198616915b8281101561509a5788860151825594840194600190910190840161507b565b50858210156150b757878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156150d7575f80fd5b61221d826149d0565b5f602082840312156150f0575f80fd5b813560ff8116811461221d575f80fd5b5f60208284031215615110575f80fd5b815161221d816147b8565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161517081604e860160208901614acc565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516152ff3803806152ff83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151b28061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b3366004614731565b61040d565b005b6101b86101c836600461476c565b6106bc565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa36600461476c565b61082e565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b8610241366004614783565b610844565b6101b861025436600461479c565b6108e5565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b86102843660046147c4565b610b3f565b61029c610297366004614828565b610fc3565b6040519081526020016101e3565b6101ff6102b836600461476c565b610fdc565b61029c5f81565b6101b86102d2366004614731565b610ff0565b6101d5603081565b6101b86102ed36600461476c565b6111e2565b6101b861030036600461479c565b61129d565b61029c610313366004614841565b611464565b6101b8610326366004614783565b611490565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f36600461476c565b611602565b6101b861037236600461476c565b6117de565b6101d5601481565b61039261038d36600461476c565b611908565b6040516101e39190614875565b6101ff6202a30081565b61029c6103b736600461476c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f5366004614935565b6119d0565b6101b86104083660046149ae565b611a05565b5f8381525f805160206150e68339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff16600381111561045a5761045a614861565b600381111561046b5761046b614861565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e182611908565b90506002835160038111156104f8576104f8614861565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff19166003179055815160029181111561057357610573614861565b036106295785156105b7576105888286611ae4565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b6105d482846060015183608001516105cf9190614a00565b611c68565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561061483611dbf565b5f888152600686016020526040902055610687565b60048151600581111561063e5761063e614861565b0361066e5761064c83611dbf565b5f88815260068601602052604090205561066587611f3a565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f805160206151868339815191526020526040808220815160e0810190925280545f8051602061514683398151915293929190829060ff16600581111561070957610709614861565b600581111561071a5761071a614861565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561078957610789614861565b146107a75760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107cc8584606001515f612121565b6040518263ffffffff1660e01b81526004016107e89190614a42565b6020604051808303815f875af1158015610804573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108289190614a74565b50505050565b5f61083e64e8d4a5100083614a8b565b92915050565b5f805160206151268339815191525f8061085d84612178565b9150915061086a82612416565b6108745750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156108a3576108a3614861565b036108c8575f838152600785016020526040812080549190556108c68282612451565b505b6108de816108d98460400151610fc3565b6124be565b5050505050565b5f8181525f805160206150e68339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff16600381111561093257610932614861565b600381111561094357610943614861565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6109b982611908565b90506001835160038111156109d0576109d0614861565b146109ee5760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610a0357610a03614861565b03610a1957610a1185611f3a565b505050505050565b5f610a23876124e1565b90505f80610a3483604001516125e1565b5091509150818514610a5957604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610a925750806001600160401b03168660a001516001600160401b0316115b15610ab057604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151468339815191529060ff1615610b9157604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf89190614a74565b836020013514610c1b5760405163d040949d60e01b815260040160405180910390fd5b30610c2c6060850160408601614aaa565b6001600160a01b031614610c535760405163e6c4247b60e01b815260040160405180910390fd5b5f610c616060850185614ac5565b905090505f805b828163ffffffff161015610f0d575f610c846060880188614ac5565b8363ffffffff16818110610c9a57610c9a614b0a565b9050602002810190610cac9190614b1e565b610cb590614bce565b80515f8181526008880160205260409020549192509015610ce957604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610d1892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610d3291614c65565b602060405180830381855afa158015610d4d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d709190614a74565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610dfc57610dfc614861565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610eaf911686614c76565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610f0690614c89565b9050610c68565b50600483018190555f610f1f856124e1565b90505f610f2f826040015161281f565b90505f610f3b88612994565b905081600282604051610f4e9190614c65565b602060405180830381855afa158015610f69573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f8c9190614a74565b14610faa57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61083e6001600160401b03831664e8d4a51000614cab565b5f610fe682611908565b6080015192915050565b5f805160206151268339815191525f61100885612e2d565b905061101385612416565b61101e575050505050565b5f8581526004830160205260409020546001600160a01b031633146110565760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161108591600160b01b90046001600160401b031690614cc2565b6001600160401b03168160c001516001600160401b031610156110bb576040516302336bad60e51b815260040160405180910390fd5b83156108de575f6110cc8685611ae4565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061111c90610fc3565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611192573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b69190614a74565b5f878152600785016020526040812080549091906111d5908490614c76565b9091555050505050505050565b5f805160206151268339815191525f6111fa83611908565b905060048151600581111561121157611211614861565b1461122f5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146112675760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610828906001600160a01b031682612451565b6112a561306a565b5f8181525f805160206150e68339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff1660038111156112f2576112f2614861565b600381111561130357611303614861565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561137c5761137c614861565b1461139a5760405163f95c7fe160e01b815260040160405180910390fd5b60046113a98260400151611908565b5160058111156113bb576113bb614861565b1461143f575f6113ca856124e1565b90505f806113db83604001516125e1565b50915091508184604001511461140457604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561143b57604051633ab3447f60e11b815260040160405180910390fd5b5050505b61144883611f3a565b505061146060015f8051602061516683398151915255565b5050565b5f61146d61306a565b6114788333846130b4565b905061083e60015f8051602061516683398151915255565b5f805160206151468339815191525f6114a8836124e1565b90505f806114b9836040015161337b565b91509150806114db57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546114f590614ce2565b90505f0361151657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561153c5761153c614861565b1461155a5760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061157291614681565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206150e68339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff16600381111561164f5761164f614861565b600381111561166057611660614861565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116d9576116d9614861565b141580156116fa57506003815160038111156116f7576116f7614861565b14155b156117185760405163f95c7fe160e01b815260040160405180910390fd5b5f6117268260400151611908565b905080606001516001600160401b03165f0361175557604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611782846040015184606001518560800151612121565b6040518263ffffffff1660e01b815260040161179e9190614a42565b6020604051808303815f875af11580156117ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108de9190614a74565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615146833981519152919061182590614ce2565b90505f0361184657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561186c5761186c614861565b1461188a5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118c39190600401614d1a565b6020604051808303815f875af11580156118df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119039190614a74565b505050565b6119106146b8565b5f8281525f80516020615186833981519152602052604090819020815160e0810190925280545f80516020615146833981519152929190829060ff16600581111561195d5761195d614861565b600581111561196e5761196e614861565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6119d961306a565b6119e58585858561351f565b90506119fd60015f8051602061516683398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a4e575080546001600160401b03808416911610155b15611a6c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a9784846136bd565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611b2f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b569190810190614daf565b9150915080611b7857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bdf9190614a74565b825114611bff5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611c2b5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611c3a84604001516136d7565b91509150818714611c5e57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615186833981519152602052604081206002015481905f8051602061514683398151915290600160801b90046001600160401b0316611cb085826138b2565b5f611cba87613a7b565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611d0a8a858b612121565b6040518263ffffffff1660e01b8152600401611d269190614a42565b6020604051808303815f875af1158015611d42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d669190614a74565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408101515f905f805160206151268339815191529082611ddf82611908565b90505f600382516005811115611df757611df7614861565b1480611e155750600482516005811115611e1357611e13614861565b145b15611e25575060c0810151611e42565b600282516005811115611e3a57611e3a614861565b0361066e5750425b85608001516001600160401b0316816001600160401b031611611e6a57505f95945050505050565b600384015460608701516001600160a01b039091169063778c06b590611e8f90610fc3565b60a085015160808a01515f88815260088a01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa158015611f16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c5e9190614a74565b5f8181525f805160206150e68339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff166003811115611f8757611f87614861565b6003811115611f9857611f98614861565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156120c6575f8481526004870160205260409020546127109061207890600160a01b900461ffff1685614cab565b6120829190614a8b565b915081866007015f8681526020019081526020015f205f8282546120a69190614c76565b909155506120b690508284614e81565b90506120c6856020015182612451565b6120db85602001516108d98760600151610fc3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6121816146b8565b5f805160206151468339815191525f612199856124e1565b90505f806121aa836040015161337b565b9150915080156121cd57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156121fe576121fe614861565b600581111561220f5761220f614861565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561227e5761227e614861565b1415801561229f575060018151600581111561229c5761229c614861565b14155b156122bd5760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156122d2576122d2614861565b036122e057600481526122e5565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561232a5761232a614861565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156123de576123de614861565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061510683398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156124ac575f80fd5b505af1158015610665573d5f803e3d5ffd5b5f8051602061510683398151915254611460906001600160a01b03168383613af0565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612545573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261256c9190810190614daf565b915091508061258e57604051636b2f19e960e01b815260040160405180910390fd5b8151156125ae5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156125da5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461260657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156126555761261d816001614e81565b612628906008614cab565b61ffff1686828151811061263e5761263e614b0a565b016020015160f81c901b9190911790600101612609565b5061ffff8116156126795760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156126d457612690816003614e81565b61269b906008614cab565b63ffffffff16876126ad836002614c76565b815181106126bd576126bd614b0a565b016020015160f81c901b919091179060010161267c565b5063ffffffff81166004146126fc57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156127515761271381601f614e81565b61271e906008614cab565b8861272a836006614c76565b8151811061273a5761273a614b0a565b016020015160f81c901b91909117906001016126ff565b505f805b60088110156127b057612769816007614e81565b612774906008614cab565b6001600160401b031689612789836026614c76565b8151811061279957612799614b0a565b016020015160f81c901b9190911790600101612755565b505f805b600881101561280f576127c8816007614e81565b6127d3906008614cab565b6001600160401b03168a6127e883602e614c76565b815181106127f8576127f8614b0a565b016020015160f81c901b91909117906001016127b4565b5091989097509095509350505050565b5f815160261461284257604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561289157612859816001614e81565b612864906008614cab565b61ffff1684828151811061287a5761287a614b0a565b016020015160f81c901b9190911790600101612845565b5061ffff8116156128b55760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612910576128cc816003614e81565b6128d7906008614cab565b63ffffffff16856128e9836002614c76565b815181106128f9576128f9614b0a565b016020015160f81c901b91909117906001016128b8565b5063ffffffff81161561293657604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561298b5761294d81601f614e81565b612958906008614cab565b86612964836006614c76565b8151811061297457612974614b0a565b016020015160f81c901b9190911790600101612939565b50949350505050565b60605f6129a383830184614ac5565b6129af91506058614cab565b6129ba90605c614c76565b6001600160401b038111156129d1576129d1614b3c565b6040519080825280601f01601f1916602001820160405280156129fb576020820181803683370190505b5090505f5b6020811015612a505783358160208110612a1c57612a1c614b0a565b1a60f81b828281518110612a3257612a32614b0a565b60200101906001600160f81b03191690815f1a905350600101612a00565b505f5b6020811015612ab05783602001358160208110612a7257612a72614b0a565b1a60f81b82612a82836020614c76565b81518110612a9257612a92614b0a565b60200101906001600160f81b03191690815f1a905350600101612a53565b505f5b6004811015612b1357612ac7816003614e81565b612ad2906008614cab565b6014901c60f81b82612ae5836040614c76565b81518110612af557612af5614b0a565b60200101906001600160f81b03191690815f1a905350600101612ab3565b505f612b256060850160408601614aaa565b60601b90505f5b6014811015612b8557818160148110612b4757612b47614b0a565b1a60f81b83612b57836044614c76565b81518110612b6757612b67614b0a565b60200101906001600160f81b03191690815f1a905350600101612b2c565b505f612b946060860186614ac5565b905090505f5b6004811015612bff57612bae816003614e81565b612bb9906008614cab565b63ffffffff8316901c60f81b84612bd1836058614c76565b81518110612be157612be1614b0a565b60200101906001600160f81b03191690815f1a905350600101612b9a565b505f5b612c0f6060870187614ac5565b9050811015612e23575f612c24826058614cab565b612c2f90605c614c76565b90505f5b6020811015612cba57612c496060890189614ac5565b84818110612c5957612c59614b0a565b9050602002810190612c6b9190614b1e565b358160208110612c7d57612c7d614b0a565b1a60f81b86612c8c8385614c76565b81518110612c9c57612c9c614b0a565b60200101906001600160f81b03191690815f1a905350600101612c33565b505f5b6008811015612d6f57612cd1816007614e81565b612cdc906008614cab565b612ce960608a018a614ac5565b85818110612cf957612cf9614b0a565b9050602002810190612d0b9190614b1e565b612d1c906040810190602001614828565b6001600160401b0316901c60f81b8682612d37856020614c76565b612d419190614c76565b81518110612d5157612d51614b0a565b60200101906001600160f81b03191690815f1a905350600101612cbd565b505f5b6030811015612e1957612d886060890189614ac5565b84818110612d9857612d98614b0a565b9050602002810190612daa9190614b1e565b612db8906040810190614e94565b82818110612dc857612dc8614b0a565b9050013560f81c60f81b8682846028612de19190614c76565b612deb9190614c76565b81518110612dfb57612dfb614b0a565b60200101906001600160f81b03191690815f1a905350600101612d72565b5050600101612c02565b5091949350505050565b612e356146b8565b5f8281525f805160206151868339815191526020526040808220815160e0810190925280545f8051602061514683398151915293929190829060ff166005811115612e8257612e82614861565b6005811115612e9357612e93614861565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612f0557612f05614861565b14612f235760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612f6757612f67614861565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130138582611c68565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061516683398151915280546001190161309b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061516683398151915255565b5f5f80516020615126833981519152816130d06101fa85613b4f565b90505f6130dc87611908565b90506130e787612416565b61310457604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561311957613119614861565b146131375760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516131489190614cc2565b905083600201600a9054906101000a90046001600160401b031682604001516131719190614ed6565b6001600160401b0316816001600160401b031611156131a357604051630c192e7760e41b815260040160405180910390fd5b5f806131af8a84611c68565b915091505f8a836040516020016131dd92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561327057613270614861565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461339f57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133ee576133b6816001614e81565b6133c1906008614cab565b61ffff168582815181106133d7576133d7614b0a565b016020015160f81c901b91909117906001016133a2565b5061ffff8116156134125760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561346d57613429816003614e81565b613434906008614cab565b63ffffffff1686613446836002614c76565b8151811061345657613456614b0a565b016020015160f81c901b9190911790600101613415565b5063ffffffff811660031461349557604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134ea576134ac81601f614e81565b6134b7906008614cab565b876134c3836006614c76565b815181106134d3576134d3614b0a565b016020015160f81c901b9190911790600101613498565b505f866026815181106134ff576134ff614b0a565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061512683398151915290600160401b900461ffff9081169086161080613573575061271061ffff8616115b156135915760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156135c3576040516302336bad60e51b815260040160405180910390fd5b80548310806135d55750806001015483115b156135f357604051630103be3b60e21b815260040160405180910390fd5b5f6135fd84613b4f565b90505f6136098261082e565b90505f6136168983613b72565b9050604051806060016040528061362a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6136c5613f5c565b6136ce82613fa7565b61146081614018565b5f808251602e146136fb57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561374a57613712816001614e81565b61371d906008614cab565b61ffff1685828151811061373357613733614b0a565b016020015160f81c901b91909117906001016136fe565b5061ffff81161561376e5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137c957613785816003614e81565b613790906008614cab565b63ffffffff16866137a2836002614c76565b815181106137b2576137b2614b0a565b016020015160f81c901b9190911790600101613771565b5063ffffffff81166005146137f157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138465761380881601f614e81565b613813906008614cab565b8761381f836006614c76565b8151811061382f5761382f614b0a565b016020015160f81c901b91909117906001016137f4565b505f805b60088110156138a55761385e816007614e81565b613869906008614cab565b6001600160401b03168861387e836026614c76565b8151811061388e5761388e614b0a565b016020015160f81c901b919091179060010161384a565b5090969095509350505050565b5f805160206151468339815191525f6001600160401b0380841690851611156138e6576138df8385614a00565b90506138f3565b6138f08484614a00565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613955575060018401548151613951916001600160401b031690614c76565b8210155b1561397b576001600160401b03831660608201528181526040810151602082015261399a565b828160600181815161398d9190614cc2565b6001600160401b03169052505b60608101516139aa906064614ed6565b602082015160018601546001600160401b0392909216916139d59190600160401b900460ff16614cab565b10156139f45760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613a0f9190614c76565b9052506040810180516001600160401b0387169190613a2f908390614e81565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206151868339815191526020526040812060020180545f805160206151468339815191529190600890613ac590600160401b90046001600160401b0316614f01565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b0383811660248301526044820183905261190391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614075565b5f61083e825f80516020615106833981519152546001600160a01b0316906140db565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613bb657604051637fab81e560e01b815260040160405180910390fd5b5f8051602061514683398151915242613bd56040860160208701614828565b6001600160401b0316111580613c0f5750613bf36202a30042614c76565b613c036040860160208701614828565b6001600160401b031610155b15613c2c5760405162d36c8560e81b815260040160405180910390fd5b6030613c3b6040860186614e94565b9050141580613c4957508335155b15613c675760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613c9757604051630eb0d31360e11b815260040160405180910390fd5b613ca1835f6138b2565b5f80613d3a6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ce59190614828565b6001600160401b03168152602001613d0060408a018a614e94565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061423d565b5f82815260068601602052604090209193509150613d588282614f60565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613d96908590600401614a42565b6020604051808303815f875af1158015613db2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dd69190614a74565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e4e57613e4e614861565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f2e918e01908e01614828565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613fa557604051631afcd79f60e31b815260040160405180910390fd5b565b613faf613f5c565b613fb881614300565b613fc0614319565b61401560608201356080830135613fdd60c0850160a08601614828565b613fed60e0860160c0870161501b565b613ffe610100870160e08801615034565b61401061012088016101008901614aaa565b614329565b50565b614020613f5c565b5f805160206151068339815191526001600160a01b0382166140555760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6140896001600160a01b0384168361444a565b905080515f141580156140ad5750808060200190518101906140ab9190615054565b155b1561190357604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614121573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141459190614a74565b905061415c6001600160a01b038516333086614457565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156141a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141c49190614a74565b905081811161422a5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016140d2565b6142348282614e81565b95945050505050565b5f606082608001515160301461426657604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614298979695949392919061506f565b60405160208183030381529060405290506002816040516142b99190614c65565b602060405180830381855afa1580156142d4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142f79190614a74565b94909350915050565b614308613f5c565b614310614490565b61401581614498565b614321613f5c565b613fa561456a565b614331613f5c565b5f8051602061512683398151915261ffff84161580614355575061271061ffff8516115b156143735760405163c98d73a760e01b815260040160405180910390fd5b8587111561439457604051630103be3b60e21b815260040160405180910390fd5b60ff831615806143a75750600a60ff8416115b156143c5576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061217183835f614572565b6040516001600160a01b0384811660248301528381166044830152606482018390526108289186918216906323b872dd90608401613b1d565b613fa5613f5c565b6144a0613f5c565b80355f8051602061514683398151915290815560146144c56060840160408501615034565b60ff1611806144e457506144df6060830160408401615034565b60ff16155b156145025760405163b4fa3fb360e01b815260040160405180910390fd5b6145126060830160408401615034565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556145436040830160208401614828565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6130a1613f5c565b6060814710156145975760405163cd78605960e01b81523060048201526024016140d2565b5f80856001600160a01b031684866040516145b29190614c65565b5f6040518083038185875af1925050503d805f81146145ec576040519150601f19603f3d011682016040523d82523d5f602084013e6145f1565b606091505b5091509150611c5e8683836060826146115761460c82614658565b612171565b815115801561462857506001600160a01b0384163b155b1561465157604051639996b31560e01b81526001600160a01b03851660048201526024016140d2565b5080612171565b8051156146685780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461468d90614ce2565b5f825580601f1061469c575050565b601f0160209004905f5260205f209081019061401591906146f4565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614708575f81556001016146f5565b5090565b8015158114614015575f80fd5b803563ffffffff8116811461472c575f80fd5b919050565b5f805f60608486031215614743575f80fd5b8335925060208401356147558161470c565b915061476360408501614719565b90509250925092565b5f6020828403121561477c575f80fd5b5035919050565b5f60208284031215614793575f80fd5b61217182614719565b5f80604083850312156147ad575f80fd5b6147b683614719565b946020939093013593505050565b5f80604083850312156147d5575f80fd5b82356001600160401b038111156147ea575f80fd5b8301608081860312156147fb575f80fd5b915061480960208401614719565b90509250929050565b80356001600160401b038116811461472c575f80fd5b5f60208284031215614838575f80fd5b61217182614812565b5f8060408385031215614852575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061489857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516148d360608401826001600160401b03169052565b5060808301516148ee60808401826001600160401b03169052565b5060a083015161490960a08401826001600160401b03169052565b5060c08301516125da60c08401826001600160401b03169052565b803561ffff8116811461472c575f80fd5b5f805f8060808587031215614948575f80fd5b84356001600160401b0381111561495d575f80fd5b85016060818803121561496e575f80fd5b935061497c60208601614924565b925061498a60408601614812565b9396929550929360600135925050565b6001600160a01b0381168114614015575f80fd5b5f808284036101408112156149c1575f80fd5b610120808212156149d0575f80fd5b84935083013590506149e18161499a565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156125da576125da6149ec565b5f5b83811015614a3a578181015183820152602001614a22565b50505f910152565b602081525f8251806020840152614a60816040850160208701614a20565b601f01601f19169190910160400192915050565b5f60208284031215614a84575f80fd5b5051919050565b5f82614aa557634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614aba575f80fd5b81356121718161499a565b5f808335601e19843603018112614ada575f80fd5b8301803591506001600160401b03821115614af3575f80fd5b6020019150600581901b3603821315611db8575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614b32575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b7257614b72614b3c565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614ba057614ba0614b3c565b604052919050565b5f6001600160401b03821115614bc057614bc0614b3c565b50601f01601f191660200190565b5f60608236031215614bde575f80fd5b614be6614b50565b823581526020614bf7818501614812565b8183015260408401356001600160401b03811115614c13575f80fd5b840136601f820112614c23575f80fd5b8035614c36614c3182614ba8565b614b78565b8181523684838501011115614c49575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614b32818460208701614a20565b8082018082111561083e5761083e6149ec565b5f63ffffffff808316818103614ca157614ca16149ec565b6001019392505050565b808202811582820484141761083e5761083e6149ec565b6001600160401b038181168382160190808211156125da576125da6149ec565b600181811c90821680614cf657607f821691505b602082108103614d1457634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614d2c81614ce2565b806020870152604060018084165f8114614d4d5760018114614d6957614d96565b60ff19851660408a0152604084151560051b8a01019550614d96565b895f5260205f205f5b85811015614d8d5781548b8201860152908301908801614d72565b8a016040019650505b509398975050505050505050565b805161472c8161470c565b5f8060408385031215614dc0575f80fd5b82516001600160401b0380821115614dd6575f80fd5b9084019060608287031215614de9575f80fd5b614df1614b50565b82518152602080840151614e048161499a565b82820152604084015183811115614e19575f80fd5b80850194505087601f850112614e2d575f80fd5b83519250614e3d614c3184614ba8565b8381528882858701011115614e50575f80fd5b614e5f84838301848801614a20565b80604084015250819550614e74818801614da4565b9450505050509250929050565b8181038181111561083e5761083e6149ec565b5f808335601e19843603018112614ea9575f80fd5b8301803591506001600160401b03821115614ec2575f80fd5b602001915036819003821315611db8575f80fd5b6001600160401b03818116838216028082169190828114614ef957614ef96149ec565b505092915050565b5f6001600160401b03808316818103614ca157614ca16149ec565b601f82111561190357805f5260205f20601f840160051c81016020851015614f415750805b601f840160051c820191505b818110156108de575f8155600101614f4d565b81516001600160401b03811115614f7957614f79614b3c565b614f8d81614f878454614ce2565b84614f1c565b602080601f831160018114614fc0575f8415614fa95750858301515b5f19600386901b1c1916600185901b178555610a11565b5f85815260208120601f198616915b82811015614fee57888601518255948401946001909101908401614fcf565b508582101561500b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561502b575f80fd5b61217182614924565b5f60208284031215615044575f80fd5b813560ff81168114612171575f80fd5b5f60208284031215615064575f80fd5b81516121718161470c565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516150c481604e860160208901614a20565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 d74f6c3a9..e4c87905f 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516150c03803806150c083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614f738061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd36600461458b565b610561565b005b3480156101df575f80fd5b506101d26101ee3660046145c6565b6107f0565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d26102383660046145dd565b610962565b348015610248575f80fd5b5061025c6102573660046145c6565b610a3f565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc36600461461b565b610a55565b604051908152602001610215565b3480156102fa575f80fd5b506101d261030936600461466f565b610a89565b348015610319575f80fd5b506101d2610328366004614688565b610b2a565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d26103703660046146b0565b610d84565b348015610380575f80fd5b506102e161038f3660046146fe565b611208565b34801561039f575f80fd5b5061025c6103ae3660046145c6565b611221565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e036600461458b565b611235565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d26104133660046145c6565b611427565b348015610423575f80fd5b506101d2610432366004614688565b6114e2565b348015610442575f80fd5b506101d261045136600461466f565b6116a9565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a3660046145c6565b61181b565b34801561049a575f80fd5b506101d26104a93660046145c6565b6119f7565b6102e16104bc3660046145c6565b611b21565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef3660046145c6565b611b52565b604051610215919061472b565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e16105313660046145c6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614ec78339815191526020526040808220815160e0810190925280545f80516020614ee783398151915293929190829060ff1660038111156105ae576105ae614717565b60038111156105bf576105bf614717565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611b52565b905060028351600381111561064c5761064c614717565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156106c7576106c7614717565b0361076d57851561070b576106dc8286611c1a565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b610728828460600151836080015161072391906147ee565b611d9e565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561076887611ef5565b6107bb565b60048151600581111561078257610782614717565b036107a25761079087611ef5565b6107998761213c565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f80516020614f478339815191526020526040808220815160e0810190925280545f80516020614f0783398151915293929190829060ff16600581111561083d5761083d614717565b600581111561084e5761084e614717565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108bd576108bd614717565b146108db5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109008584606001515f612323565b6040518263ffffffff1660e01b815260040161091c9190614830565b6020604051808303815f875af1158015610938573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061095c9190614862565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109ab575080546001600160401b03808416911610155b156109c95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109f383612372565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a4f64e8d4a5100083614879565b92915050565b5f610a5e612386565b610a6a848484346123bd565b9050610a8260015f80516020614f2783398151915255565b9392505050565b5f80516020614ee78339815191525f80610aa284612563565b91509150610aaf82612801565b610ab95750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ae857610ae8614717565b03610b0d575f83815260078501602052604081208054919055610b0b828261283c565b505b610b2381610b1e8460400151611208565b61289a565b5050505050565b5f8181525f80516020614ec78339815191526020526040808220815160e0810190925280545f80516020614ee783398151915293929190829060ff166003811115610b7757610b77614717565b6003811115610b8857610b88614717565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610bfe82611b52565b9050600183516003811115610c1557610c15614717565b14610c335760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610c4857610c48614717565b03610c5e57610c568561213c565b505050505050565b5f610c68876128ad565b90505f80610c7983604001516129ad565b5091509150818514610c9e57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610cd75750806001600160401b03168660a001516001600160401b0316115b15610cf557604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614f078339815191529060ff1615610dd657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e3d9190614862565b836020013514610e605760405163d040949d60e01b815260040160405180910390fd5b30610e7160608501604086016148ac565b6001600160a01b031614610e985760405163e6c4247b60e01b815260040160405180910390fd5b5f610ea660608501856148c7565b905090505f805b828163ffffffff161015611152575f610ec960608801886148c7565b8363ffffffff16818110610edf57610edf61490c565b9050602002810190610ef19190614920565b610efa906149d0565b80515f8181526008880160205260409020549192509015610f2e57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610f5d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610f7791614a67565b602060405180830381855afa158015610f92573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610fb59190614862565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561104157611041614717565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516110f4911686614a78565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061114b90614a8b565b9050610ead565b50600483018190555f611164856128ad565b90505f6111748260400151612beb565b90505f61118088612d60565b9050816002826040516111939190614a67565b602060405180830381855afa1580156111ae573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111d19190614862565b146111ef57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610a4f6001600160401b03831664e8d4a51000614aad565b5f61122b82611b52565b6080015192915050565b5f80516020614ee78339815191525f61124d856131f9565b905061125885612801565b611263575050505050565b5f8581526004830160205260409020546001600160a01b0316331461129b5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516112ca91600160b01b90046001600160401b031690614ac4565b6001600160401b03168160c001516001600160401b03161015611300576040516302336bad60e51b815260040160405180910390fd5b8315610b23575f6113118685611c1a565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061136190611208565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156113d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113fb9190614862565b5f8781526007850160205260408120805490919061141a908490614a78565b9091555050505050505050565b5f80516020614ee78339815191525f61143f83611b52565b905060048151600581111561145657611456614717565b146114745760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114ac5760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461095c906001600160a01b03168261283c565b6114ea612386565b5f8181525f80516020614ec78339815191526020526040808220815160e0810190925280545f80516020614ee783398151915293929190829060ff16600381111561153757611537614717565b600381111561154857611548614717565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115c1576115c1614717565b146115df5760405163f95c7fe160e01b815260040160405180910390fd5b60046115ee8260400151611b52565b51600581111561160057611600614717565b14611684575f61160f856128ad565b90505f8061162083604001516129ad565b50915091508184604001511461164957604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561168057604051633ab3447f60e11b815260040160405180910390fd5b5050505b61168d8361213c565b50506116a560015f80516020614f2783398151915255565b5050565b5f80516020614f078339815191525f6116c1836128ad565b90505f806116d28360400151613436565b91509150806116f457604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461170e90614ae4565b90505f0361172f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561175557611755614717565b146117735760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061178b916144e0565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614ec78339815191526020526040808220815160e0810190925280545f80516020614ee783398151915293929190829060ff16600381111561186857611868614717565b600381111561187957611879614717565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156118f2576118f2614717565b14158015611913575060038151600381111561191057611910614717565b14155b156119315760405163f95c7fe160e01b815260040160405180910390fd5b5f61193f8260400151611b52565b905080606001516001600160401b03165f0361196e57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61199b846040015184606001518560800151612323565b6040518263ffffffff1660e01b81526004016119b79190614830565b6020604051808303815f875af11580156119d3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b239190614862565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614f078339815191529190611a3e90614ae4565b90505f03611a5f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611a8557611a85614717565b14611aa35760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611adc9190600401614b16565b6020604051808303815f875af1158015611af8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1c9190614862565b505050565b5f611b2a612386565b611b358233346135da565b9050611b4d60015f80516020614f2783398151915255565b919050565b611b5a614517565b5f8281525f80516020614f47833981519152602052604090819020815160e0810190925280545f80516020614f07833981519152929190829060ff166005811115611ba757611ba7614717565b6005811115611bb857611bb8614717565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c65573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c8c9190810190614bab565b9150915080611cae57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d159190614862565b825114611d355760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d615760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d70846040015161389e565b91509150818714611d9457604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614f47833981519152602052604081206002015481905f80516020614f0783398151915290600160801b90046001600160401b0316611de68582613a79565b5f611df087613c42565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e408a858b612323565b6040518263ffffffff1660e01b8152600401611e5c9190614830565b6020604051808303815f875af1158015611e78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e9c9190614862565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8181525f80516020614ec78339815191526020526040808220815160e0810190925280545f80516020614ee783398151915293929190829060ff166003811115611f4257611f42614717565b6003811115611f5357611f53614717565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611fc982611b52565b90505f600382516005811115611fe157611fe1614717565b1480611fff5750600482516005811115611ffd57611ffd614717565b145b1561200f575060c081015161202c565b60028251600581111561202457612024614717565b036107a25750425b83608001516001600160401b0316816001600160401b03161161205157505050505050565b600385015460608501516001600160a01b039091169063778c06b59061207690611208565b60a085015160808801515f88815260088b01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa1580156120fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121219190614862565b5f968752600690950160205250506040909320919091555050565b5f8181525f80516020614ec78339815191526020526040808220815160e0810190925280545f80516020614ee783398151915293929190829060ff16600381111561218957612189614717565b600381111561219a5761219a614717565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156122c8575f8481526004870160205260409020546127109061227a90600160a01b900461ffff1685614aad565b6122849190614879565b915081866007015f8681526020019081526020015f205f8282546122a89190614a78565b909155506122b890508284614c7d565b90506122c885602001518261283c565b6122dd8560200151610b1e8760600151611208565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b61237a613cb7565b61238381613d02565b50565b5f80516020614f278339815191528054600119016123b757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ee783398151915290600160401b900461ffff9081169086161080612411575061271061ffff8616115b1561242f5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612461576040516302336bad60e51b815260040160405180910390fd5b80548310806124735750806001015483115b1561249157604051630103be3b60e21b815260040160405180910390fd5b825f61249c82610a3f565b90505f6124a98983613d70565b905060405180606001604052806124bd3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614f2783398151915255565b5f61256c614517565b5f80516020614f078339815191525f612584856128ad565b90505f806125958360400151613436565b9150915080156125b857604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156125e9576125e9614717565b60058111156125fa576125fa614717565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561266957612669614717565b1415801561268a575060018151600581111561268757612687614717565b14155b156126a85760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156126bd576126bd614717565b036126cb57600481526126d0565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561271557612715614717565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156127c9576127c9614717565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612888575f80fd5b505af1158015610c56573d5f803e3d5ffd5b6116a56001600160a01b0383168261415a565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612911573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129389190810190614bab565b915091508061295a57604051636b2f19e960e01b815260040160405180910390fd5b81511561297a5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156129a65760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146129d257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612a21576129e9816001614c7d565b6129f4906008614aad565b61ffff16868281518110612a0a57612a0a61490c565b016020015160f81c901b91909117906001016129d5565b5061ffff811615612a455760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612aa057612a5c816003614c7d565b612a67906008614aad565b63ffffffff1687612a79836002614a78565b81518110612a8957612a8961490c565b016020015160f81c901b9190911790600101612a48565b5063ffffffff8116600414612ac857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612b1d57612adf81601f614c7d565b612aea906008614aad565b88612af6836006614a78565b81518110612b0657612b0661490c565b016020015160f81c901b9190911790600101612acb565b505f805b6008811015612b7c57612b35816007614c7d565b612b40906008614aad565b6001600160401b031689612b55836026614a78565b81518110612b6557612b6561490c565b016020015160f81c901b9190911790600101612b21565b505f805b6008811015612bdb57612b94816007614c7d565b612b9f906008614aad565b6001600160401b03168a612bb483602e614a78565b81518110612bc457612bc461490c565b016020015160f81c901b9190911790600101612b80565b5091989097509095509350505050565b5f8151602614612c0e57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612c5d57612c25816001614c7d565b612c30906008614aad565b61ffff16848281518110612c4657612c4661490c565b016020015160f81c901b9190911790600101612c11565b5061ffff811615612c815760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612cdc57612c98816003614c7d565b612ca3906008614aad565b63ffffffff1685612cb5836002614a78565b81518110612cc557612cc561490c565b016020015160f81c901b9190911790600101612c84565b5063ffffffff811615612d0257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612d5757612d1981601f614c7d565b612d24906008614aad565b86612d30836006614a78565b81518110612d4057612d4061490c565b016020015160f81c901b9190911790600101612d05565b50949350505050565b60605f612d6f838301846148c7565b612d7b91506058614aad565b612d8690605c614a78565b6001600160401b03811115612d9d57612d9d61493e565b6040519080825280601f01601f191660200182016040528015612dc7576020820181803683370190505b5090505f5b6020811015612e1c5783358160208110612de857612de861490c565b1a60f81b828281518110612dfe57612dfe61490c565b60200101906001600160f81b03191690815f1a905350600101612dcc565b505f5b6020811015612e7c5783602001358160208110612e3e57612e3e61490c565b1a60f81b82612e4e836020614a78565b81518110612e5e57612e5e61490c565b60200101906001600160f81b03191690815f1a905350600101612e1f565b505f5b6004811015612edf57612e93816003614c7d565b612e9e906008614aad565b6014901c60f81b82612eb1836040614a78565b81518110612ec157612ec161490c565b60200101906001600160f81b03191690815f1a905350600101612e7f565b505f612ef160608501604086016148ac565b60601b90505f5b6014811015612f5157818160148110612f1357612f1361490c565b1a60f81b83612f23836044614a78565b81518110612f3357612f3361490c565b60200101906001600160f81b03191690815f1a905350600101612ef8565b505f612f6060608601866148c7565b905090505f5b6004811015612fcb57612f7a816003614c7d565b612f85906008614aad565b63ffffffff8316901c60f81b84612f9d836058614a78565b81518110612fad57612fad61490c565b60200101906001600160f81b03191690815f1a905350600101612f66565b505f5b612fdb60608701876148c7565b90508110156131ef575f612ff0826058614aad565b612ffb90605c614a78565b90505f5b60208110156130865761301560608901896148c7565b848181106130255761302561490c565b90506020028101906130379190614920565b3581602081106130495761304961490c565b1a60f81b866130588385614a78565b815181106130685761306861490c565b60200101906001600160f81b03191690815f1a905350600101612fff565b505f5b600881101561313b5761309d816007614c7d565b6130a8906008614aad565b6130b560608a018a6148c7565b858181106130c5576130c561490c565b90506020028101906130d79190614920565b6130e89060408101906020016146fe565b6001600160401b0316901c60f81b8682613103856020614a78565b61310d9190614a78565b8151811061311d5761311d61490c565b60200101906001600160f81b03191690815f1a905350600101613089565b505f5b60308110156131e55761315460608901896148c7565b848181106131645761316461490c565b90506020028101906131769190614920565b613184906040810190614c90565b828181106131945761319461490c565b9050013560f81c60f81b86828460286131ad9190614a78565b6131b79190614a78565b815181106131c7576131c761490c565b60200101906001600160f81b03191690815f1a90535060010161313e565b5050600101612fce565b5091949350505050565b613201614517565b5f8281525f80516020614f478339815191526020526040808220815160e0810190925280545f80516020614f0783398151915293929190829060ff16600581111561324e5761324e614717565b600581111561325f5761325f614717565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156132d1576132d1614717565b146132ef5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561333357613333614717565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133df8582611d9e565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461345a57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156134a957613471816001614c7d565b61347c906008614aad565b61ffff168582815181106134925761349261490c565b016020015160f81c901b919091179060010161345d565b5061ffff8116156134cd5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613528576134e4816003614c7d565b6134ef906008614aad565b63ffffffff1686613501836002614a78565b815181106135115761351161490c565b016020015160f81c901b91909117906001016134d0565b5063ffffffff811660031461355057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135a55761356781601f614c7d565b613572906008614aad565b8761357e836006614a78565b8151811061358e5761358e61490c565b016020015160f81c901b9190911790600101613553565b505f866026815181106135ba576135ba61490c565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614ee7833981519152816135f384610a3f565b90505f6135ff87611b52565b905061360a87612801565b61362757604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561363c5761363c614717565b1461365a5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161366b9190614ac4565b905083600201600a9054906101000a90046001600160401b031682604001516136949190614cd2565b6001600160401b0316816001600160401b031611156136c657604051630c192e7760e41b815260040160405180910390fd5b5f806136d28a84611d9e565b915091505f8a8360405160200161370092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561379357613793614717565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146138c257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613911576138d9816001614c7d565b6138e4906008614aad565b61ffff168582815181106138fa576138fa61490c565b016020015160f81c901b91909117906001016138c5565b5061ffff8116156139355760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156139905761394c816003614c7d565b613957906008614aad565b63ffffffff1686613969836002614a78565b815181106139795761397961490c565b016020015160f81c901b9190911790600101613938565b5063ffffffff81166005146139b857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a0d576139cf81601f614c7d565b6139da906008614aad565b876139e6836006614a78565b815181106139f6576139f661490c565b016020015160f81c901b91909117906001016139bb565b505f805b6008811015613a6c57613a25816007614c7d565b613a30906008614aad565b6001600160401b031688613a45836026614a78565b81518110613a5557613a5561490c565b016020015160f81c901b9190911790600101613a11565b5090969095509350505050565b5f80516020614f078339815191525f6001600160401b038084169085161115613aad57613aa683856147ee565b9050613aba565b613ab784846147ee565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613b1c575060018401548151613b18916001600160401b031690614a78565b8210155b15613b42576001600160401b038316606082015281815260408101516020820152613b61565b8281606001818151613b549190614ac4565b6001600160401b03169052505b6060810151613b71906064614cd2565b602082015160018601546001600160401b039290921691613b9c9190600160401b900460ff16614aad565b1015613bbb5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613bd69190614a78565b9052506040810180516001600160401b0387169190613bf6908390614c7d565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614f478339815191526020526040812060020180545f80516020614f078339815191529190600890613c8c90600160401b90046001600160401b0316614cfd565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613d0057604051631afcd79f60e31b815260040160405180910390fd5b565b613d0a613cb7565b613d13816141f1565b613d1b61420a565b61238360608201356080830135613d3860c0850160a086016146fe565b613d4860e0860160c08701614d18565b613d59610100870160e08801614d31565b613d6b610120880161010089016148ac565b61421a565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613db457604051637fab81e560e01b815260040160405180910390fd5b5f80516020614f0783398151915242613dd360408601602087016146fe565b6001600160401b0316111580613e0d5750613df16202a30042614a78565b613e0160408601602087016146fe565b6001600160401b031610155b15613e2a5760405162d36c8560e81b815260040160405180910390fd5b6030613e396040860186614c90565b9050141580613e4757508335155b15613e655760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613e9557604051630eb0d31360e11b815260040160405180910390fd5b613e9f835f613a79565b5f80613f386040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ee391906146fe565b6001600160401b03168152602001613efe60408a018a614c90565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061433b565b5f82815260068601602052604090209193509150613f568282614d95565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613f94908590600401614830565b6020604051808303815f875af1158015613fb0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fd49190614862565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561404c5761404c614717565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161412c918e01908e016146fe565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156141815760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146141ca576040519150601f19603f3d011682016040523d82523d5f602084013e6141cf565b606091505b5050905080611b1c57604051630a12f52160e11b815260040160405180910390fd5b6141f9613cb7565b6142016143fe565b61238381614406565b614212613cb7565b613d006144d8565b614222613cb7565b5f80516020614ee783398151915261ffff84161580614246575061271061ffff8516115b156142645760405163c98d73a760e01b815260040160405180910390fd5b8587111561428557604051630103be3b60e21b815260040160405180910390fd5b60ff831615806142985750600a60ff8416115b156142b6576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461436457604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016143969796959493929190614e50565b60405160208183030381529060405290506002816040516143b79190614a67565b602060405180830381855afa1580156143d2573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143f59190614862565b94909350915050565b613d00613cb7565b61440e613cb7565b80355f80516020614f0783398151915290815560146144336060840160408501614d31565b60ff161180614452575061444d6060830160408401614d31565b60ff16155b156144705760405163b4fa3fb360e01b815260040160405180910390fd5b6144806060830160408401614d31565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556144b160408301602084016146fe565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612550613cb7565b5080546144ec90614ae4565b5f825580601f106144fb575050565b601f0160209004905f5260205f20908101906123839190614553565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614567575f8155600101614554565b5090565b8015158114612383575f80fd5b803563ffffffff81168114611b4d575f80fd5b5f805f6060848603121561459d575f80fd5b8335925060208401356145af8161456b565b91506145bd60408501614578565b90509250925092565b5f602082840312156145d6575f80fd5b5035919050565b5f61012082840312156145ee575f80fd5b50919050565b803561ffff81168114611b4d575f80fd5b80356001600160401b0381168114611b4d575f80fd5b5f805f6060848603121561462d575f80fd5b83356001600160401b03811115614642575f80fd5b840160608187031215614653575f80fd5b9250614661602085016145f4565b91506145bd60408501614605565b5f6020828403121561467f575f80fd5b610a8282614578565b5f8060408385031215614699575f80fd5b6146a283614578565b946020939093013593505050565b5f80604083850312156146c1575f80fd5b82356001600160401b038111156146d6575f80fd5b8301608081860312156146e7575f80fd5b91506146f560208401614578565b90509250929050565b5f6020828403121561470e575f80fd5b610a8282614605565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061474e57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161478960608401826001600160401b03169052565b5060808301516147a460808401826001600160401b03169052565b5060a08301516147bf60a08401826001600160401b03169052565b5060c08301516129a660c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156129a6576129a66147da565b5f5b83811015614828578181015183820152602001614810565b50505f910152565b602081525f825180602084015261484e81604085016020870161480e565b601f01601f19169190910160400192915050565b5f60208284031215614872575f80fd5b5051919050565b5f8261489357634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114612383575f80fd5b5f602082840312156148bc575f80fd5b8135610a8281614898565b5f808335601e198436030181126148dc575f80fd5b8301803591506001600160401b038211156148f5575f80fd5b6020019150600581901b3603821315611eee575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614934575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156149745761497461493e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156149a2576149a261493e565b604052919050565b5f6001600160401b038211156149c2576149c261493e565b50601f01601f191660200190565b5f606082360312156149e0575f80fd5b6149e8614952565b8235815260206149f9818501614605565b8183015260408401356001600160401b03811115614a15575f80fd5b840136601f820112614a25575f80fd5b8035614a38614a33826149aa565b61497a565b8181523684838501011115614a4b575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f825161493481846020870161480e565b80820180821115610a4f57610a4f6147da565b5f63ffffffff808316818103614aa357614aa36147da565b6001019392505050565b8082028115828204841417610a4f57610a4f6147da565b6001600160401b038181168382160190808211156129a6576129a66147da565b600181811c90821680614af857607f821691505b6020821081036145ee57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614b2881614ae4565b806020870152604060018084165f8114614b495760018114614b6557614b92565b60ff19851660408a0152604084151560051b8a01019550614b92565b895f5260205f205f5b85811015614b895781548b8201860152908301908801614b6e565b8a016040019650505b509398975050505050505050565b8051611b4d8161456b565b5f8060408385031215614bbc575f80fd5b82516001600160401b0380821115614bd2575f80fd5b9084019060608287031215614be5575f80fd5b614bed614952565b82518152602080840151614c0081614898565b82820152604084015183811115614c15575f80fd5b80850194505087601f850112614c29575f80fd5b83519250614c39614a33846149aa565b8381528882858701011115614c4c575f80fd5b614c5b8483830184880161480e565b80604084015250819550614c70818801614ba0565b9450505050509250929050565b81810381811115610a4f57610a4f6147da565b5f808335601e19843603018112614ca5575f80fd5b8301803591506001600160401b03821115614cbe575f80fd5b602001915036819003821315611eee575f80fd5b6001600160401b03818116838216028082169190828114614cf557614cf56147da565b505092915050565b5f6001600160401b03808316818103614aa357614aa36147da565b5f60208284031215614d28575f80fd5b610a82826145f4565b5f60208284031215614d41575f80fd5b813560ff81168114610a82575f80fd5b601f821115611b1c57805f5260205f20601f840160051c81016020851015614d765750805b601f840160051c820191505b81811015610b23575f8155600101614d82565b81516001600160401b03811115614dae57614dae61493e565b614dc281614dbc8454614ae4565b84614d51565b602080601f831160018114614df5575f8415614dde5750858301515b5f19600386901b1c1916600185901b178555610c56565b5f85815260208120601f198616915b82811015614e2357888601518255948401946001909101908401614e04565b5085821015614e4057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614ea581604e86016020890161480e565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161501438038061501483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614ec78061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd3660046144df565b610561565b005b3480156101df575f80fd5b506101d26101ee36600461451a565b610810565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d2610238366004614531565b610982565b348015610248575f80fd5b5061025c61025736600461451a565b610a5f565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc36600461456f565b610a75565b604051908152602001610215565b3480156102fa575f80fd5b506101d26103093660046145c3565b610aa9565b348015610319575f80fd5b506101d26103283660046145dc565b610b4a565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d2610370366004614604565b610da4565b348015610380575f80fd5b506102e161038f366004614652565b611228565b34801561039f575f80fd5b5061025c6103ae36600461451a565b611241565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e03660046144df565b611255565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d261041336600461451a565b611447565b348015610423575f80fd5b506101d26104323660046145dc565b611502565b348015610442575f80fd5b506101d26104513660046145c3565b6116c9565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a36600461451a565b61183b565b34801561049a575f80fd5b506101d26104a936600461451a565b611a17565b6102e16104bc36600461451a565b611b41565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef36600461451a565b611b72565b604051610215919061467f565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e161053136600461451a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff1660038111156105ae576105ae61466b565b60038111156105bf576105bf61466b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611b72565b905060028351600381111561064c5761064c61466b565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156106c7576106c761466b565b0361077d57851561070b576106dc8286611c3a565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b61072882846060015183608001516107239190614742565b611dbe565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561076883611f15565b5f8881526006860160205260409020556107db565b6004815160058111156107925761079261466b565b036107c2576107a083611f15565b5f8881526006860160205260409020556107b987612090565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f80516020614e9b8339815191526020526040808220815160e0810190925280545f80516020614e5b83398151915293929190829060ff16600581111561085d5761085d61466b565b600581111561086e5761086e61466b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108dd576108dd61466b565b146108fb5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109208584606001515f612277565b6040518263ffffffff1660e01b815260040161093c9190614784565b6020604051808303815f875af1158015610958573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097c91906147b6565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109cb575080546001600160401b03808416911610155b156109e95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a13836122c6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a6f64e8d4a51000836147cd565b92915050565b5f610a7e6122da565b610a8a84848434612311565b9050610aa260015f80516020614e7b83398151915255565b9392505050565b5f80516020614e3b8339815191525f80610ac2846124b7565b91509150610acf82612755565b610ad95750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610b0857610b0861466b565b03610b2d575f83815260078501602052604081208054919055610b2b8282612790565b505b610b4381610b3e8460400151611228565b6127ee565b5050505050565b5f8181525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff166003811115610b9757610b9761466b565b6003811115610ba857610ba861466b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610c1e82611b72565b9050600183516003811115610c3557610c3561466b565b14610c535760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610c6857610c6861466b565b03610c7e57610c7685612090565b505050505050565b5f610c8887612801565b90505f80610c998360400151612901565b5091509150818514610cbe57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610cf75750806001600160401b03168660a001516001600160401b0316115b15610d1557604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614e5b8339815191529060ff1615610df657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5d91906147b6565b836020013514610e805760405163d040949d60e01b815260040160405180910390fd5b30610e916060850160408601614800565b6001600160a01b031614610eb85760405163e6c4247b60e01b815260040160405180910390fd5b5f610ec6606085018561481b565b905090505f805b828163ffffffff161015611172575f610ee9606088018861481b565b8363ffffffff16818110610eff57610eff614860565b9050602002810190610f119190614874565b610f1a90614924565b80515f8181526008880160205260409020549192509015610f4e57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610f7d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610f97916149bb565b602060405180830381855afa158015610fb2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610fd591906147b6565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156110615761106161466b565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111149116866149cc565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061116b906149df565b9050610ecd565b50600483018190555f61118485612801565b90505f6111948260400151612b3f565b90505f6111a088612cb4565b9050816002826040516111b391906149bb565b602060405180830381855afa1580156111ce573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111f191906147b6565b1461120f57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610a6f6001600160401b03831664e8d4a51000614a01565b5f61124b82611b72565b6080015192915050565b5f80516020614e3b8339815191525f61126d8561314d565b905061127885612755565b611283575050505050565b5f8581526004830160205260409020546001600160a01b031633146112bb5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516112ea91600160b01b90046001600160401b031690614a18565b6001600160401b03168160c001516001600160401b03161015611320576040516302336bad60e51b815260040160405180910390fd5b8315610b43575f6113318685611c3a565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061138190611228565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156113f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061141b91906147b6565b5f8781526007850160205260408120805490919061143a9084906149cc565b9091555050505050505050565b5f80516020614e3b8339815191525f61145f83611b72565b90506004815160058111156114765761147661466b565b146114945760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114cc5760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461097c906001600160a01b031682612790565b61150a6122da565b5f8181525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff1660038111156115575761155761466b565b60038111156115685761156861466b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115e1576115e161466b565b146115ff5760405163f95c7fe160e01b815260040160405180910390fd5b600461160e8260400151611b72565b5160058111156116205761162061466b565b146116a4575f61162f85612801565b90505f806116408360400151612901565b50915091508184604001511461166957604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156116a057604051633ab3447f60e11b815260040160405180910390fd5b5050505b6116ad83612090565b50506116c560015f80516020614e7b83398151915255565b5050565b5f80516020614e5b8339815191525f6116e183612801565b90505f806116f2836040015161338a565b915091508061171457604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461172e90614a38565b90505f0361174f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156117755761177561466b565b146117935760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206117ab91614434565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff1660038111156118885761188861466b565b60038111156118995761189961466b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156119125761191261466b565b1415801561193357506003815160038111156119305761193061466b565b14155b156119515760405163f95c7fe160e01b815260040160405180910390fd5b5f61195f8260400151611b72565b905080606001516001600160401b03165f0361198e57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6119bb846040015184606001518560800151612277565b6040518263ffffffff1660e01b81526004016119d79190614784565b6020604051808303815f875af11580156119f3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4391906147b6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614e5b8339815191529190611a5e90614a38565b90505f03611a7f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611aa557611aa561466b565b14611ac35760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611afc9190600401614a6a565b6020604051808303815f875af1158015611b18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3c91906147b6565b505050565b5f611b4a6122da565b611b5582333461352e565b9050611b6d60015f80516020614e7b83398151915255565b919050565b611b7a61446b565b5f8281525f80516020614e9b833981519152602052604090819020815160e0810190925280545f80516020614e5b833981519152929190829060ff166005811115611bc757611bc761466b565b6005811115611bd857611bd861466b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c85573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cac9190810190614aff565b9150915080611cce57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3591906147b6565b825114611d555760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d815760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d9084604001516137f2565b91509150818714611db457604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e9b833981519152602052604081206002015481905f80516020614e5b83398151915290600160801b90046001600160401b0316611e0685826139cd565b5f611e1087613b96565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e608a858b612277565b6040518263ffffffff1660e01b8152600401611e7c9190614784565b6020604051808303815f875af1158015611e98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ebc91906147b6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408101515f905f80516020614e3b8339815191529082611f3582611b72565b90505f600382516005811115611f4d57611f4d61466b565b1480611f6b5750600482516005811115611f6957611f6961466b565b145b15611f7b575060c0810151611f98565b600282516005811115611f9057611f9061466b565b036107c25750425b85608001516001600160401b0316816001600160401b031611611fc057505f95945050505050565b600384015460608701516001600160a01b039091169063778c06b590611fe590611228565b60a085015160808a01515f88815260088a01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa15801561206c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db491906147b6565b5f8181525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff1660038111156120dd576120dd61466b565b60038111156120ee576120ee61466b565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870190915290812080549082905592935090919080821561221c575f848152600487016020526040902054612710906121ce90600160a01b900461ffff1685614a01565b6121d891906147cd565b915081866007015f8681526020019081526020015f205f8282546121fc91906149cc565b9091555061220c90508284614bd1565b905061221c856020015182612790565b6122318560200151610b3e8760600151611228565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6122ce613c0b565b6122d781613c56565b50565b5f80516020614e7b83398151915280546001190161230b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614e3b83398151915290600160401b900461ffff9081169086161080612365575061271061ffff8616115b156123835760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156123b5576040516302336bad60e51b815260040160405180910390fd5b80548310806123c75750806001015483115b156123e557604051630103be3b60e21b815260040160405180910390fd5b825f6123f082610a5f565b90505f6123fd8983613cc4565b905060405180606001604052806124113390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e7b83398151915255565b5f6124c061446b565b5f80516020614e5b8339815191525f6124d885612801565b90505f806124e9836040015161338a565b91509150801561250c57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561253d5761253d61466b565b600581111561254e5761254e61466b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125bd576125bd61466b565b141580156125de57506001815160058111156125db576125db61466b565b14155b156125fc5760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156126115761261161466b565b0361261f5760048152612624565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156126695761266961466b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561271d5761271d61466b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156127dc575f80fd5b505af1158015610c76573d5f803e3d5ffd5b6116c56001600160a01b038316826140ae565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612865573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261288c9190810190614aff565b91509150806128ae57604051636b2f19e960e01b815260040160405180910390fd5b8151156128ce5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156128fa5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461292657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129755761293d816001614bd1565b612948906008614a01565b61ffff1686828151811061295e5761295e614860565b016020015160f81c901b9190911790600101612929565b5061ffff8116156129995760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156129f4576129b0816003614bd1565b6129bb906008614a01565b63ffffffff16876129cd8360026149cc565b815181106129dd576129dd614860565b016020015160f81c901b919091179060010161299c565b5063ffffffff8116600414612a1c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a7157612a3381601f614bd1565b612a3e906008614a01565b88612a4a8360066149cc565b81518110612a5a57612a5a614860565b016020015160f81c901b9190911790600101612a1f565b505f805b6008811015612ad057612a89816007614bd1565b612a94906008614a01565b6001600160401b031689612aa98360266149cc565b81518110612ab957612ab9614860565b016020015160f81c901b9190911790600101612a75565b505f805b6008811015612b2f57612ae8816007614bd1565b612af3906008614a01565b6001600160401b03168a612b0883602e6149cc565b81518110612b1857612b18614860565b016020015160f81c901b9190911790600101612ad4565b5091989097509095509350505050565b5f8151602614612b6257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612bb157612b79816001614bd1565b612b84906008614a01565b61ffff16848281518110612b9a57612b9a614860565b016020015160f81c901b9190911790600101612b65565b5061ffff811615612bd55760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612c3057612bec816003614bd1565b612bf7906008614a01565b63ffffffff1685612c098360026149cc565b81518110612c1957612c19614860565b016020015160f81c901b9190911790600101612bd8565b5063ffffffff811615612c5657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612cab57612c6d81601f614bd1565b612c78906008614a01565b86612c848360066149cc565b81518110612c9457612c94614860565b016020015160f81c901b9190911790600101612c59565b50949350505050565b60605f612cc38383018461481b565b612ccf91506058614a01565b612cda90605c6149cc565b6001600160401b03811115612cf157612cf1614892565b6040519080825280601f01601f191660200182016040528015612d1b576020820181803683370190505b5090505f5b6020811015612d705783358160208110612d3c57612d3c614860565b1a60f81b828281518110612d5257612d52614860565b60200101906001600160f81b03191690815f1a905350600101612d20565b505f5b6020811015612dd05783602001358160208110612d9257612d92614860565b1a60f81b82612da28360206149cc565b81518110612db257612db2614860565b60200101906001600160f81b03191690815f1a905350600101612d73565b505f5b6004811015612e3357612de7816003614bd1565b612df2906008614a01565b6014901c60f81b82612e058360406149cc565b81518110612e1557612e15614860565b60200101906001600160f81b03191690815f1a905350600101612dd3565b505f612e456060850160408601614800565b60601b90505f5b6014811015612ea557818160148110612e6757612e67614860565b1a60f81b83612e778360446149cc565b81518110612e8757612e87614860565b60200101906001600160f81b03191690815f1a905350600101612e4c565b505f612eb4606086018661481b565b905090505f5b6004811015612f1f57612ece816003614bd1565b612ed9906008614a01565b63ffffffff8316901c60f81b84612ef18360586149cc565b81518110612f0157612f01614860565b60200101906001600160f81b03191690815f1a905350600101612eba565b505f5b612f2f606087018761481b565b9050811015613143575f612f44826058614a01565b612f4f90605c6149cc565b90505f5b6020811015612fda57612f69606089018961481b565b84818110612f7957612f79614860565b9050602002810190612f8b9190614874565b358160208110612f9d57612f9d614860565b1a60f81b86612fac83856149cc565b81518110612fbc57612fbc614860565b60200101906001600160f81b03191690815f1a905350600101612f53565b505f5b600881101561308f57612ff1816007614bd1565b612ffc906008614a01565b61300960608a018a61481b565b8581811061301957613019614860565b905060200281019061302b9190614874565b61303c906040810190602001614652565b6001600160401b0316901c60f81b86826130578560206149cc565b61306191906149cc565b8151811061307157613071614860565b60200101906001600160f81b03191690815f1a905350600101612fdd565b505f5b6030811015613139576130a8606089018961481b565b848181106130b8576130b8614860565b90506020028101906130ca9190614874565b6130d8906040810190614be4565b828181106130e8576130e8614860565b9050013560f81c60f81b868284602861310191906149cc565b61310b91906149cc565b8151811061311b5761311b614860565b60200101906001600160f81b03191690815f1a905350600101613092565b5050600101612f22565b5091949350505050565b61315561446b565b5f8281525f80516020614e9b8339815191526020526040808220815160e0810190925280545f80516020614e5b83398151915293929190829060ff1660058111156131a2576131a261466b565b60058111156131b3576131b361466b565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156132255761322561466b565b146132435760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156132875761328761466b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133338582611dbe565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146133ae57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133fd576133c5816001614bd1565b6133d0906008614a01565b61ffff168582815181106133e6576133e6614860565b016020015160f81c901b91909117906001016133b1565b5061ffff8116156134215760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561347c57613438816003614bd1565b613443906008614a01565b63ffffffff16866134558360026149cc565b8151811061346557613465614860565b016020015160f81c901b9190911790600101613424565b5063ffffffff81166003146134a457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134f9576134bb81601f614bd1565b6134c6906008614a01565b876134d28360066149cc565b815181106134e2576134e2614860565b016020015160f81c901b91909117906001016134a7565b505f8660268151811061350e5761350e614860565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614e3b8339815191528161354784610a5f565b90505f61355387611b72565b905061355e87612755565b61357b57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156135905761359061466b565b146135ae5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516135bf9190614a18565b905083600201600a9054906101000a90046001600160401b031682604001516135e89190614c26565b6001600160401b0316816001600160401b0316111561361a57604051630c192e7760e41b815260040160405180910390fd5b5f806136268a84611dbe565b915091505f8a8360405160200161365492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156136e7576136e761466b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461381657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156138655761382d816001614bd1565b613838906008614a01565b61ffff1685828151811061384e5761384e614860565b016020015160f81c901b9190911790600101613819565b5061ffff8116156138895760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156138e4576138a0816003614bd1565b6138ab906008614a01565b63ffffffff16866138bd8360026149cc565b815181106138cd576138cd614860565b016020015160f81c901b919091179060010161388c565b5063ffffffff811660051461390c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139615761392381601f614bd1565b61392e906008614a01565b8761393a8360066149cc565b8151811061394a5761394a614860565b016020015160f81c901b919091179060010161390f565b505f805b60088110156139c057613979816007614bd1565b613984906008614a01565b6001600160401b0316886139998360266149cc565b815181106139a9576139a9614860565b016020015160f81c901b9190911790600101613965565b5090969095509350505050565b5f80516020614e5b8339815191525f6001600160401b038084169085161115613a01576139fa8385614742565b9050613a0e565b613a0b8484614742565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a70575060018401548151613a6c916001600160401b0316906149cc565b8210155b15613a96576001600160401b038316606082015281815260408101516020820152613ab5565b8281606001818151613aa89190614a18565b6001600160401b03169052505b6060810151613ac5906064614c26565b602082015160018601546001600160401b039290921691613af09190600160401b900460ff16614a01565b1015613b0f5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613b2a91906149cc565b9052506040810180516001600160401b0387169190613b4a908390614bd1565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e9b8339815191526020526040812060020180545f80516020614e5b8339815191529190600890613be090600160401b90046001600160401b0316614c51565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c5457604051631afcd79f60e31b815260040160405180910390fd5b565b613c5e613c0b565b613c6781614145565b613c6f61415e565b6122d760608201356080830135613c8c60c0850160a08601614652565b613c9c60e0860160c08701614c6c565b613cad610100870160e08801614c85565b613cbf61012088016101008901614800565b61416e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613d0857604051637fab81e560e01b815260040160405180910390fd5b5f80516020614e5b83398151915242613d276040860160208701614652565b6001600160401b0316111580613d615750613d456202a300426149cc565b613d556040860160208701614652565b6001600160401b031610155b15613d7e5760405162d36c8560e81b815260040160405180910390fd5b6030613d8d6040860186614be4565b9050141580613d9b57508335155b15613db95760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613de957604051630eb0d31360e11b815260040160405180910390fd5b613df3835f6139cd565b5f80613e8c6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e379190614652565b6001600160401b03168152602001613e5260408a018a614be4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061428f565b5f82815260068601602052604090209193509150613eaa8282614ce9565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613ee8908590600401614784565b6020604051808303815f875af1158015613f04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f2891906147b6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613fa057613fa061466b565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614080918e01908e01614652565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156140d55760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461411e576040519150601f19603f3d011682016040523d82523d5f602084013e614123565b606091505b5050905080611b3c57604051630a12f52160e11b815260040160405180910390fd5b61414d613c0b565b614155614352565b6122d78161435a565b614166613c0b565b613c5461442c565b614176613c0b565b5f80516020614e3b83398151915261ffff8416158061419a575061271061ffff8516115b156141b85760405163c98d73a760e01b815260040160405180910390fd5b858711156141d957604051630103be3b60e21b815260040160405180910390fd5b60ff831615806141ec5750600a60ff8416115b1561420a576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146142b857604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016142ea9796959493929190614da4565b604051602081830303815290604052905060028160405161430b91906149bb565b602060405180830381855afa158015614326573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061434991906147b6565b94909350915050565b613c54613c0b565b614362613c0b565b80355f80516020614e5b83398151915290815560146143876060840160408501614c85565b60ff1611806143a657506143a16060830160408401614c85565b60ff16155b156143c45760405163b4fa3fb360e01b815260040160405180910390fd5b6143d46060830160408401614c85565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556144056040830160208401614652565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6124a4613c0b565b50805461444090614a38565b5f825580601f1061444f575050565b601f0160209004905f5260205f20908101906122d791906144a7565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156144bb575f81556001016144a8565b5090565b80151581146122d7575f80fd5b803563ffffffff81168114611b6d575f80fd5b5f805f606084860312156144f1575f80fd5b833592506020840135614503816144bf565b9150614511604085016144cc565b90509250925092565b5f6020828403121561452a575f80fd5b5035919050565b5f6101208284031215614542575f80fd5b50919050565b803561ffff81168114611b6d575f80fd5b80356001600160401b0381168114611b6d575f80fd5b5f805f60608486031215614581575f80fd5b83356001600160401b03811115614596575f80fd5b8401606081870312156145a7575f80fd5b92506145b560208501614548565b915061451160408501614559565b5f602082840312156145d3575f80fd5b610aa2826144cc565b5f80604083850312156145ed575f80fd5b6145f6836144cc565b946020939093013593505050565b5f8060408385031215614615575f80fd5b82356001600160401b0381111561462a575f80fd5b83016080818603121561463b575f80fd5b9150614649602084016144cc565b90509250929050565b5f60208284031215614662575f80fd5b610aa282614559565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106146a257634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516146dd60608401826001600160401b03169052565b5060808301516146f860808401826001600160401b03169052565b5060a083015161471360a08401826001600160401b03169052565b5060c08301516128fa60c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156128fa576128fa61472e565b5f5b8381101561477c578181015183820152602001614764565b50505f910152565b602081525f82518060208401526147a2816040850160208701614762565b601f01601f19169190910160400192915050565b5f602082840312156147c6575f80fd5b5051919050565b5f826147e757634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03811681146122d7575f80fd5b5f60208284031215614810575f80fd5b8135610aa2816147ec565b5f808335601e19843603018112614830575f80fd5b8301803591506001600160401b03821115614849575f80fd5b6020019150600581901b3603821315611f0e575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614888575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156148c8576148c8614892565b60405290565b604051601f8201601f191681016001600160401b03811182821017156148f6576148f6614892565b604052919050565b5f6001600160401b0382111561491657614916614892565b50601f01601f191660200190565b5f60608236031215614934575f80fd5b61493c6148a6565b82358152602061494d818501614559565b8183015260408401356001600160401b03811115614969575f80fd5b840136601f820112614979575f80fd5b803561498c614987826148fe565b6148ce565b818152368483850101111561499f575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614888818460208701614762565b80820180821115610a6f57610a6f61472e565b5f63ffffffff8083168181036149f7576149f761472e565b6001019392505050565b8082028115828204841417610a6f57610a6f61472e565b6001600160401b038181168382160190808211156128fa576128fa61472e565b600181811c90821680614a4c57607f821691505b60208210810361454257634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614a7c81614a38565b806020870152604060018084165f8114614a9d5760018114614ab957614ae6565b60ff19851660408a0152604084151560051b8a01019550614ae6565b895f5260205f205f5b85811015614add5781548b8201860152908301908801614ac2565b8a016040019650505b509398975050505050505050565b8051611b6d816144bf565b5f8060408385031215614b10575f80fd5b82516001600160401b0380821115614b26575f80fd5b9084019060608287031215614b39575f80fd5b614b416148a6565b82518152602080840151614b54816147ec565b82820152604084015183811115614b69575f80fd5b80850194505087601f850112614b7d575f80fd5b83519250614b8d614987846148fe565b8381528882858701011115614ba0575f80fd5b614baf84838301848801614762565b80604084015250819550614bc4818801614af4565b9450505050509250929050565b81810381811115610a6f57610a6f61472e565b5f808335601e19843603018112614bf9575f80fd5b8301803591506001600160401b03821115614c12575f80fd5b602001915036819003821315611f0e575f80fd5b6001600160401b03818116838216028082169190828114614c4957614c4961472e565b505092915050565b5f6001600160401b038083168181036149f7576149f761472e565b5f60208284031215614c7c575f80fd5b610aa282614548565b5f60208284031215614c95575f80fd5b813560ff81168114610aa2575f80fd5b601f821115611b3c57805f5260205f20601f840160051c81016020851015614cca5750805b601f840160051c820191505b81811015610b43575f8155600101614cd6565b81516001600160401b03811115614d0257614d02614892565b614d1681614d108454614a38565b84614ca5565b602080601f831160018114614d49575f8415614d325750858301515b5f19600386901b1c1916600185901b178555610c76565b5f85815260208120601f198616915b82811015614d7757888601518255948401946001909101908401614d58565b5085821015614d9457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614df981604e860160208901614762565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 95bae8de1..5e50a0b3c 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -435,9 +435,9 @@ abstract contract PoSValidatorManager is ($._delegatorStakes[delegationID].endingNonce,) = _setValidatorWeight(validationID, validator.weight - delegator.weight); - _calculateDelegationReward(delegationID); + $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator); } else if (validator.status == ValidatorStatus.Completed) { - _calculateDelegationReward(delegationID); + $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator); return _completeEndDelegation(delegationID); } else { revert InvalidValidatorStatus(); @@ -446,10 +446,14 @@ abstract contract PoSValidatorManager is emit DelegatorRemovalInitialized({delegationID: delegationID, validationID: validationID}); } - function _calculateDelegationReward(bytes32 delegationID) private { + /// @dev Calculates the reward owed to the delegator based on the state of the delegator and its corresponding validator. + function _calculateDelegationReward(Delegator memory delegator) + private + view + returns (uint256) + { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - Delegator memory delegator = $._delegatorStakes[delegationID]; bytes32 validationID = delegator.validationID; Validator memory validator = getValidator(validationID); @@ -467,10 +471,10 @@ abstract contract PoSValidatorManager is // Only give rewards in the case that the delegation started before the validator exited. if (delegationEndTime <= delegator.startedAt) { - return; + return 0; } - $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward({ + return $._rewardCalculator.calculateReward({ stakeAmount: weightToValue(delegator.weight), validatorStartTime: validator.startedAt, stakingStartTime: delegator.startedAt, From fadf58f1283ebc0fb289af3fa9c9636c8a87dd49 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 26 Sep 2024 00:54:07 -0700 Subject: [PATCH 422/545] Fix out of gas error --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- contracts/validator-manager/PoSValidatorManager.sol | 11 ++++------- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 3b897780c..adcfe03b1 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516152ff3803806152ff83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151b28061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b3366004614731565b61040d565b005b6101b86101c836600461476c565b6106bc565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa36600461476c565b61082e565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b8610241366004614783565b610844565b6101b861025436600461479c565b6108e5565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b86102843660046147c4565b610b3f565b61029c610297366004614828565b610fc3565b6040519081526020016101e3565b6101ff6102b836600461476c565b610fdc565b61029c5f81565b6101b86102d2366004614731565b610ff0565b6101d5603081565b6101b86102ed36600461476c565b6111e2565b6101b861030036600461479c565b61129d565b61029c610313366004614841565b611464565b6101b8610326366004614783565b611490565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f36600461476c565b611602565b6101b861037236600461476c565b6117de565b6101d5601481565b61039261038d36600461476c565b611908565b6040516101e39190614875565b6101ff6202a30081565b61029c6103b736600461476c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f5366004614935565b6119d0565b6101b86104083660046149ae565b611a05565b5f8381525f805160206150e68339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff16600381111561045a5761045a614861565b600381111561046b5761046b614861565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e182611908565b90506002835160038111156104f8576104f8614861565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff19166003179055815160029181111561057357610573614861565b036106295785156105b7576105888286611ae4565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b6105d482846060015183608001516105cf9190614a00565b611c68565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561061483611dbf565b5f888152600686016020526040902055610687565b60048151600581111561063e5761063e614861565b0361066e5761064c83611dbf565b5f88815260068601602052604090205561066587611f3a565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f805160206151868339815191526020526040808220815160e0810190925280545f8051602061514683398151915293929190829060ff16600581111561070957610709614861565b600581111561071a5761071a614861565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561078957610789614861565b146107a75760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107cc8584606001515f612121565b6040518263ffffffff1660e01b81526004016107e89190614a42565b6020604051808303815f875af1158015610804573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108289190614a74565b50505050565b5f61083e64e8d4a5100083614a8b565b92915050565b5f805160206151268339815191525f8061085d84612178565b9150915061086a82612416565b6108745750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156108a3576108a3614861565b036108c8575f838152600785016020526040812080549190556108c68282612451565b505b6108de816108d98460400151610fc3565b6124be565b5050505050565b5f8181525f805160206150e68339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff16600381111561093257610932614861565b600381111561094357610943614861565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6109b982611908565b90506001835160038111156109d0576109d0614861565b146109ee5760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610a0357610a03614861565b03610a1957610a1185611f3a565b505050505050565b5f610a23876124e1565b90505f80610a3483604001516125e1565b5091509150818514610a5957604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610a925750806001600160401b03168660a001516001600160401b0316115b15610ab057604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151468339815191529060ff1615610b9157604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf89190614a74565b836020013514610c1b5760405163d040949d60e01b815260040160405180910390fd5b30610c2c6060850160408601614aaa565b6001600160a01b031614610c535760405163e6c4247b60e01b815260040160405180910390fd5b5f610c616060850185614ac5565b905090505f805b828163ffffffff161015610f0d575f610c846060880188614ac5565b8363ffffffff16818110610c9a57610c9a614b0a565b9050602002810190610cac9190614b1e565b610cb590614bce565b80515f8181526008880160205260409020549192509015610ce957604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610d1892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610d3291614c65565b602060405180830381855afa158015610d4d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d709190614a74565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610dfc57610dfc614861565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610eaf911686614c76565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610f0690614c89565b9050610c68565b50600483018190555f610f1f856124e1565b90505f610f2f826040015161281f565b90505f610f3b88612994565b905081600282604051610f4e9190614c65565b602060405180830381855afa158015610f69573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f8c9190614a74565b14610faa57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61083e6001600160401b03831664e8d4a51000614cab565b5f610fe682611908565b6080015192915050565b5f805160206151268339815191525f61100885612e2d565b905061101385612416565b61101e575050505050565b5f8581526004830160205260409020546001600160a01b031633146110565760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161108591600160b01b90046001600160401b031690614cc2565b6001600160401b03168160c001516001600160401b031610156110bb576040516302336bad60e51b815260040160405180910390fd5b83156108de575f6110cc8685611ae4565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061111c90610fc3565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611192573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b69190614a74565b5f878152600785016020526040812080549091906111d5908490614c76565b9091555050505050505050565b5f805160206151268339815191525f6111fa83611908565b905060048151600581111561121157611211614861565b1461122f5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146112675760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610828906001600160a01b031682612451565b6112a561306a565b5f8181525f805160206150e68339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff1660038111156112f2576112f2614861565b600381111561130357611303614861565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561137c5761137c614861565b1461139a5760405163f95c7fe160e01b815260040160405180910390fd5b60046113a98260400151611908565b5160058111156113bb576113bb614861565b1461143f575f6113ca856124e1565b90505f806113db83604001516125e1565b50915091508184604001511461140457604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561143b57604051633ab3447f60e11b815260040160405180910390fd5b5050505b61144883611f3a565b505061146060015f8051602061516683398151915255565b5050565b5f61146d61306a565b6114788333846130b4565b905061083e60015f8051602061516683398151915255565b5f805160206151468339815191525f6114a8836124e1565b90505f806114b9836040015161337b565b91509150806114db57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546114f590614ce2565b90505f0361151657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561153c5761153c614861565b1461155a5760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061157291614681565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206150e68339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff16600381111561164f5761164f614861565b600381111561166057611660614861565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116d9576116d9614861565b141580156116fa57506003815160038111156116f7576116f7614861565b14155b156117185760405163f95c7fe160e01b815260040160405180910390fd5b5f6117268260400151611908565b905080606001516001600160401b03165f0361175557604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611782846040015184606001518560800151612121565b6040518263ffffffff1660e01b815260040161179e9190614a42565b6020604051808303815f875af11580156117ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108de9190614a74565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615146833981519152919061182590614ce2565b90505f0361184657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561186c5761186c614861565b1461188a5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118c39190600401614d1a565b6020604051808303815f875af11580156118df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119039190614a74565b505050565b6119106146b8565b5f8281525f80516020615186833981519152602052604090819020815160e0810190925280545f80516020615146833981519152929190829060ff16600581111561195d5761195d614861565b600581111561196e5761196e614861565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6119d961306a565b6119e58585858561351f565b90506119fd60015f8051602061516683398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a4e575080546001600160401b03808416911610155b15611a6c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a9784846136bd565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611b2f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b569190810190614daf565b9150915080611b7857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bdf9190614a74565b825114611bff5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611c2b5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611c3a84604001516136d7565b91509150818714611c5e57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615186833981519152602052604081206002015481905f8051602061514683398151915290600160801b90046001600160401b0316611cb085826138b2565b5f611cba87613a7b565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611d0a8a858b612121565b6040518263ffffffff1660e01b8152600401611d269190614a42565b6020604051808303815f875af1158015611d42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d669190614a74565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408101515f905f805160206151268339815191529082611ddf82611908565b90505f600382516005811115611df757611df7614861565b1480611e155750600482516005811115611e1357611e13614861565b145b15611e25575060c0810151611e42565b600282516005811115611e3a57611e3a614861565b0361066e5750425b85608001516001600160401b0316816001600160401b031611611e6a57505f95945050505050565b600384015460608701516001600160a01b039091169063778c06b590611e8f90610fc3565b60a085015160808a01515f88815260088a01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa158015611f16573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c5e9190614a74565b5f8181525f805160206150e68339815191526020526040808220815160e0810190925280545f8051602061512683398151915293929190829060ff166003811115611f8757611f87614861565b6003811115611f9857611f98614861565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156120c6575f8481526004870160205260409020546127109061207890600160a01b900461ffff1685614cab565b6120829190614a8b565b915081866007015f8681526020019081526020015f205f8282546120a69190614c76565b909155506120b690508284614e81565b90506120c6856020015182612451565b6120db85602001516108d98760600151610fc3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6121816146b8565b5f805160206151468339815191525f612199856124e1565b90505f806121aa836040015161337b565b9150915080156121cd57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156121fe576121fe614861565b600581111561220f5761220f614861565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561227e5761227e614861565b1415801561229f575060018151600581111561229c5761229c614861565b14155b156122bd5760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156122d2576122d2614861565b036122e057600481526122e5565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561232a5761232a614861565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156123de576123de614861565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061510683398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156124ac575f80fd5b505af1158015610665573d5f803e3d5ffd5b5f8051602061510683398151915254611460906001600160a01b03168383613af0565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612545573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261256c9190810190614daf565b915091508061258e57604051636b2f19e960e01b815260040160405180910390fd5b8151156125ae5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156125da5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461260657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156126555761261d816001614e81565b612628906008614cab565b61ffff1686828151811061263e5761263e614b0a565b016020015160f81c901b9190911790600101612609565b5061ffff8116156126795760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156126d457612690816003614e81565b61269b906008614cab565b63ffffffff16876126ad836002614c76565b815181106126bd576126bd614b0a565b016020015160f81c901b919091179060010161267c565b5063ffffffff81166004146126fc57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156127515761271381601f614e81565b61271e906008614cab565b8861272a836006614c76565b8151811061273a5761273a614b0a565b016020015160f81c901b91909117906001016126ff565b505f805b60088110156127b057612769816007614e81565b612774906008614cab565b6001600160401b031689612789836026614c76565b8151811061279957612799614b0a565b016020015160f81c901b9190911790600101612755565b505f805b600881101561280f576127c8816007614e81565b6127d3906008614cab565b6001600160401b03168a6127e883602e614c76565b815181106127f8576127f8614b0a565b016020015160f81c901b91909117906001016127b4565b5091989097509095509350505050565b5f815160261461284257604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561289157612859816001614e81565b612864906008614cab565b61ffff1684828151811061287a5761287a614b0a565b016020015160f81c901b9190911790600101612845565b5061ffff8116156128b55760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612910576128cc816003614e81565b6128d7906008614cab565b63ffffffff16856128e9836002614c76565b815181106128f9576128f9614b0a565b016020015160f81c901b91909117906001016128b8565b5063ffffffff81161561293657604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561298b5761294d81601f614e81565b612958906008614cab565b86612964836006614c76565b8151811061297457612974614b0a565b016020015160f81c901b9190911790600101612939565b50949350505050565b60605f6129a383830184614ac5565b6129af91506058614cab565b6129ba90605c614c76565b6001600160401b038111156129d1576129d1614b3c565b6040519080825280601f01601f1916602001820160405280156129fb576020820181803683370190505b5090505f5b6020811015612a505783358160208110612a1c57612a1c614b0a565b1a60f81b828281518110612a3257612a32614b0a565b60200101906001600160f81b03191690815f1a905350600101612a00565b505f5b6020811015612ab05783602001358160208110612a7257612a72614b0a565b1a60f81b82612a82836020614c76565b81518110612a9257612a92614b0a565b60200101906001600160f81b03191690815f1a905350600101612a53565b505f5b6004811015612b1357612ac7816003614e81565b612ad2906008614cab565b6014901c60f81b82612ae5836040614c76565b81518110612af557612af5614b0a565b60200101906001600160f81b03191690815f1a905350600101612ab3565b505f612b256060850160408601614aaa565b60601b90505f5b6014811015612b8557818160148110612b4757612b47614b0a565b1a60f81b83612b57836044614c76565b81518110612b6757612b67614b0a565b60200101906001600160f81b03191690815f1a905350600101612b2c565b505f612b946060860186614ac5565b905090505f5b6004811015612bff57612bae816003614e81565b612bb9906008614cab565b63ffffffff8316901c60f81b84612bd1836058614c76565b81518110612be157612be1614b0a565b60200101906001600160f81b03191690815f1a905350600101612b9a565b505f5b612c0f6060870187614ac5565b9050811015612e23575f612c24826058614cab565b612c2f90605c614c76565b90505f5b6020811015612cba57612c496060890189614ac5565b84818110612c5957612c59614b0a565b9050602002810190612c6b9190614b1e565b358160208110612c7d57612c7d614b0a565b1a60f81b86612c8c8385614c76565b81518110612c9c57612c9c614b0a565b60200101906001600160f81b03191690815f1a905350600101612c33565b505f5b6008811015612d6f57612cd1816007614e81565b612cdc906008614cab565b612ce960608a018a614ac5565b85818110612cf957612cf9614b0a565b9050602002810190612d0b9190614b1e565b612d1c906040810190602001614828565b6001600160401b0316901c60f81b8682612d37856020614c76565b612d419190614c76565b81518110612d5157612d51614b0a565b60200101906001600160f81b03191690815f1a905350600101612cbd565b505f5b6030811015612e1957612d886060890189614ac5565b84818110612d9857612d98614b0a565b9050602002810190612daa9190614b1e565b612db8906040810190614e94565b82818110612dc857612dc8614b0a565b9050013560f81c60f81b8682846028612de19190614c76565b612deb9190614c76565b81518110612dfb57612dfb614b0a565b60200101906001600160f81b03191690815f1a905350600101612d72565b5050600101612c02565b5091949350505050565b612e356146b8565b5f8281525f805160206151868339815191526020526040808220815160e0810190925280545f8051602061514683398151915293929190829060ff166005811115612e8257612e82614861565b6005811115612e9357612e93614861565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612f0557612f05614861565b14612f235760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612f6757612f67614861565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130138582611c68565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061516683398151915280546001190161309b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061516683398151915255565b5f5f80516020615126833981519152816130d06101fa85613b4f565b90505f6130dc87611908565b90506130e787612416565b61310457604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561311957613119614861565b146131375760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516131489190614cc2565b905083600201600a9054906101000a90046001600160401b031682604001516131719190614ed6565b6001600160401b0316816001600160401b031611156131a357604051630c192e7760e41b815260040160405180910390fd5b5f806131af8a84611c68565b915091505f8a836040516020016131dd92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561327057613270614861565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461339f57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133ee576133b6816001614e81565b6133c1906008614cab565b61ffff168582815181106133d7576133d7614b0a565b016020015160f81c901b91909117906001016133a2565b5061ffff8116156134125760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561346d57613429816003614e81565b613434906008614cab565b63ffffffff1686613446836002614c76565b8151811061345657613456614b0a565b016020015160f81c901b9190911790600101613415565b5063ffffffff811660031461349557604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134ea576134ac81601f614e81565b6134b7906008614cab565b876134c3836006614c76565b815181106134d3576134d3614b0a565b016020015160f81c901b9190911790600101613498565b505f866026815181106134ff576134ff614b0a565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061512683398151915290600160401b900461ffff9081169086161080613573575061271061ffff8616115b156135915760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156135c3576040516302336bad60e51b815260040160405180910390fd5b80548310806135d55750806001015483115b156135f357604051630103be3b60e21b815260040160405180910390fd5b5f6135fd84613b4f565b90505f6136098261082e565b90505f6136168983613b72565b9050604051806060016040528061362a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6136c5613f5c565b6136ce82613fa7565b61146081614018565b5f808251602e146136fb57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561374a57613712816001614e81565b61371d906008614cab565b61ffff1685828151811061373357613733614b0a565b016020015160f81c901b91909117906001016136fe565b5061ffff81161561376e5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137c957613785816003614e81565b613790906008614cab565b63ffffffff16866137a2836002614c76565b815181106137b2576137b2614b0a565b016020015160f81c901b9190911790600101613771565b5063ffffffff81166005146137f157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138465761380881601f614e81565b613813906008614cab565b8761381f836006614c76565b8151811061382f5761382f614b0a565b016020015160f81c901b91909117906001016137f4565b505f805b60088110156138a55761385e816007614e81565b613869906008614cab565b6001600160401b03168861387e836026614c76565b8151811061388e5761388e614b0a565b016020015160f81c901b919091179060010161384a565b5090969095509350505050565b5f805160206151468339815191525f6001600160401b0380841690851611156138e6576138df8385614a00565b90506138f3565b6138f08484614a00565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613955575060018401548151613951916001600160401b031690614c76565b8210155b1561397b576001600160401b03831660608201528181526040810151602082015261399a565b828160600181815161398d9190614cc2565b6001600160401b03169052505b60608101516139aa906064614ed6565b602082015160018601546001600160401b0392909216916139d59190600160401b900460ff16614cab565b10156139f45760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613a0f9190614c76565b9052506040810180516001600160401b0387169190613a2f908390614e81565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206151868339815191526020526040812060020180545f805160206151468339815191529190600890613ac590600160401b90046001600160401b0316614f01565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b0383811660248301526044820183905261190391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614075565b5f61083e825f80516020615106833981519152546001600160a01b0316906140db565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613bb657604051637fab81e560e01b815260040160405180910390fd5b5f8051602061514683398151915242613bd56040860160208701614828565b6001600160401b0316111580613c0f5750613bf36202a30042614c76565b613c036040860160208701614828565b6001600160401b031610155b15613c2c5760405162d36c8560e81b815260040160405180910390fd5b6030613c3b6040860186614e94565b9050141580613c4957508335155b15613c675760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613c9757604051630eb0d31360e11b815260040160405180910390fd5b613ca1835f6138b2565b5f80613d3a6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ce59190614828565b6001600160401b03168152602001613d0060408a018a614e94565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061423d565b5f82815260068601602052604090209193509150613d588282614f60565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613d96908590600401614a42565b6020604051808303815f875af1158015613db2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dd69190614a74565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e4e57613e4e614861565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f2e918e01908e01614828565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613fa557604051631afcd79f60e31b815260040160405180910390fd5b565b613faf613f5c565b613fb881614300565b613fc0614319565b61401560608201356080830135613fdd60c0850160a08601614828565b613fed60e0860160c0870161501b565b613ffe610100870160e08801615034565b61401061012088016101008901614aaa565b614329565b50565b614020613f5c565b5f805160206151068339815191526001600160a01b0382166140555760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6140896001600160a01b0384168361444a565b905080515f141580156140ad5750808060200190518101906140ab9190615054565b155b1561190357604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614121573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141459190614a74565b905061415c6001600160a01b038516333086614457565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156141a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141c49190614a74565b905081811161422a5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016140d2565b6142348282614e81565b95945050505050565b5f606082608001515160301461426657604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614298979695949392919061506f565b60405160208183030381529060405290506002816040516142b99190614c65565b602060405180830381855afa1580156142d4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142f79190614a74565b94909350915050565b614308613f5c565b614310614490565b61401581614498565b614321613f5c565b613fa561456a565b614331613f5c565b5f8051602061512683398151915261ffff84161580614355575061271061ffff8516115b156143735760405163c98d73a760e01b815260040160405180910390fd5b8587111561439457604051630103be3b60e21b815260040160405180910390fd5b60ff831615806143a75750600a60ff8416115b156143c5576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061217183835f614572565b6040516001600160a01b0384811660248301528381166044830152606482018390526108289186918216906323b872dd90608401613b1d565b613fa5613f5c565b6144a0613f5c565b80355f8051602061514683398151915290815560146144c56060840160408501615034565b60ff1611806144e457506144df6060830160408401615034565b60ff16155b156145025760405163b4fa3fb360e01b815260040160405180910390fd5b6145126060830160408401615034565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556145436040830160208401614828565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6130a1613f5c565b6060814710156145975760405163cd78605960e01b81523060048201526024016140d2565b5f80856001600160a01b031684866040516145b29190614c65565b5f6040518083038185875af1925050503d805f81146145ec576040519150601f19603f3d011682016040523d82523d5f602084013e6145f1565b606091505b5091509150611c5e8683836060826146115761460c82614658565b612171565b815115801561462857506001600160a01b0384163b155b1561465157604051639996b31560e01b81526001600160a01b03851660048201526024016140d2565b5080612171565b8051156146685780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461468d90614ce2565b5f825580601f1061469c575050565b601f0160209004905f5260205f209081019061401591906146f4565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614708575f81556001016146f5565b5090565b8015158114614015575f80fd5b803563ffffffff8116811461472c575f80fd5b919050565b5f805f60608486031215614743575f80fd5b8335925060208401356147558161470c565b915061476360408501614719565b90509250925092565b5f6020828403121561477c575f80fd5b5035919050565b5f60208284031215614793575f80fd5b61217182614719565b5f80604083850312156147ad575f80fd5b6147b683614719565b946020939093013593505050565b5f80604083850312156147d5575f80fd5b82356001600160401b038111156147ea575f80fd5b8301608081860312156147fb575f80fd5b915061480960208401614719565b90509250929050565b80356001600160401b038116811461472c575f80fd5b5f60208284031215614838575f80fd5b61217182614812565b5f8060408385031215614852575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061489857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516148d360608401826001600160401b03169052565b5060808301516148ee60808401826001600160401b03169052565b5060a083015161490960a08401826001600160401b03169052565b5060c08301516125da60c08401826001600160401b03169052565b803561ffff8116811461472c575f80fd5b5f805f8060808587031215614948575f80fd5b84356001600160401b0381111561495d575f80fd5b85016060818803121561496e575f80fd5b935061497c60208601614924565b925061498a60408601614812565b9396929550929360600135925050565b6001600160a01b0381168114614015575f80fd5b5f808284036101408112156149c1575f80fd5b610120808212156149d0575f80fd5b84935083013590506149e18161499a565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156125da576125da6149ec565b5f5b83811015614a3a578181015183820152602001614a22565b50505f910152565b602081525f8251806020840152614a60816040850160208701614a20565b601f01601f19169190910160400192915050565b5f60208284031215614a84575f80fd5b5051919050565b5f82614aa557634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614aba575f80fd5b81356121718161499a565b5f808335601e19843603018112614ada575f80fd5b8301803591506001600160401b03821115614af3575f80fd5b6020019150600581901b3603821315611db8575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614b32575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b7257614b72614b3c565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614ba057614ba0614b3c565b604052919050565b5f6001600160401b03821115614bc057614bc0614b3c565b50601f01601f191660200190565b5f60608236031215614bde575f80fd5b614be6614b50565b823581526020614bf7818501614812565b8183015260408401356001600160401b03811115614c13575f80fd5b840136601f820112614c23575f80fd5b8035614c36614c3182614ba8565b614b78565b8181523684838501011115614c49575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614b32818460208701614a20565b8082018082111561083e5761083e6149ec565b5f63ffffffff808316818103614ca157614ca16149ec565b6001019392505050565b808202811582820484141761083e5761083e6149ec565b6001600160401b038181168382160190808211156125da576125da6149ec565b600181811c90821680614cf657607f821691505b602082108103614d1457634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614d2c81614ce2565b806020870152604060018084165f8114614d4d5760018114614d6957614d96565b60ff19851660408a0152604084151560051b8a01019550614d96565b895f5260205f205f5b85811015614d8d5781548b8201860152908301908801614d72565b8a016040019650505b509398975050505050505050565b805161472c8161470c565b5f8060408385031215614dc0575f80fd5b82516001600160401b0380821115614dd6575f80fd5b9084019060608287031215614de9575f80fd5b614df1614b50565b82518152602080840151614e048161499a565b82820152604084015183811115614e19575f80fd5b80850194505087601f850112614e2d575f80fd5b83519250614e3d614c3184614ba8565b8381528882858701011115614e50575f80fd5b614e5f84838301848801614a20565b80604084015250819550614e74818801614da4565b9450505050509250929050565b8181038181111561083e5761083e6149ec565b5f808335601e19843603018112614ea9575f80fd5b8301803591506001600160401b03821115614ec2575f80fd5b602001915036819003821315611db8575f80fd5b6001600160401b03818116838216028082169190828114614ef957614ef96149ec565b505092915050565b5f6001600160401b03808316818103614ca157614ca16149ec565b601f82111561190357805f5260205f20601f840160051c81016020851015614f415750805b601f840160051c820191505b818110156108de575f8155600101614f4d565b81516001600160401b03811115614f7957614f79614b3c565b614f8d81614f878454614ce2565b84614f1c565b602080601f831160018114614fc0575f8415614fa95750858301515b5f19600386901b1c1916600185901b178555610a11565b5f85815260208120601f198616915b82811015614fee57888601518255948401946001909101908401614fcf565b508582101561500b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561502b575f80fd5b61217182614924565b5f60208284031215615044575f80fd5b813560ff81168114612171575f80fd5b5f60208284031215615064575f80fd5b81516121718161470c565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516150c481604e860160208901614a20565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516152e63803806152e683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151998061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b3366004614718565b61040d565b005b6101b86101c8366004614753565b6106a3565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004614753565b610815565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b861024136600461476a565b61082b565b6101b8610254366004614783565b6108cc565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b86102843660046147ab565b610b26565b61029c61029736600461480f565b610faa565b6040519081526020016101e3565b6101ff6102b8366004614753565b610fc3565b61029c5f81565b6101b86102d2366004614718565b610fd7565b6101d5603081565b6101b86102ed366004614753565b6111c9565b6101b8610300366004614783565b611284565b61029c610313366004614828565b61144b565b6101b861032636600461476a565b611477565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004614753565b6115e9565b6101b8610372366004614753565b6117c5565b6101d5601481565b61039261038d366004614753565b6118ef565b6040516101e3919061485c565b6101ff6202a30081565b61029c6103b7366004614753565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f536600461491c565b6119b7565b6101b8610408366004614995565b6119ec565b5f8381525f805160206150cd8339815191526020526040808220815160e0810190925280545f8051602061510d83398151915293929190829060ff16600381111561045a5761045a614848565b600381111561046b5761046b614848565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e1826118ef565b90506002835160038111156104f8576104f8614848565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff19166003179055815160029181111561057357610573614848565b036106105785156105b7576105888286611acb565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b6105d482846060015183608001516105cf91906149e7565b611c4f565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561066e565b60048151600581111561062557610625614848565b036106555761063383611da6565b5f88815260068601602052604090205561064c87611f21565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f8051602061516d8339815191526020526040808220815160e0810190925280545f8051602061512d83398151915293929190829060ff1660058111156106f0576106f0614848565b600581111561070157610701614848565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561077057610770614848565b1461078e5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107b38584606001515f612108565b6040518263ffffffff1660e01b81526004016107cf9190614a29565b6020604051808303815f875af11580156107eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080f9190614a5b565b50505050565b5f61082564e8d4a5100083614a72565b92915050565b5f8051602061510d8339815191525f806108448461215f565b91509150610851826123fd565b61085b5750505050565b5f82815260048085016020526040909120546001600160a01b0316908251600581111561088a5761088a614848565b036108af575f838152600785016020526040812080549190556108ad8282612438565b505b6108c5816108c08460400151610faa565b6124a5565b5050505050565b5f8181525f805160206150cd8339815191526020526040808220815160e0810190925280545f8051602061510d83398151915293929190829060ff16600381111561091957610919614848565b600381111561092a5761092a614848565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6109a0826118ef565b90506001835160038111156109b7576109b7614848565b146109d55760405163f95c7fe160e01b815260040160405180910390fd5b6004815160058111156109ea576109ea614848565b03610a00576109f885611f21565b505050505050565b5f610a0a876124c8565b90505f80610a1b83604001516125c8565b5091509150818514610a4057604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610a795750806001600160401b03168660a001516001600160401b0316115b15610a9757604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061512d8339815191529060ff1615610b7857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bdf9190614a5b565b836020013514610c025760405163d040949d60e01b815260040160405180910390fd5b30610c136060850160408601614a91565b6001600160a01b031614610c3a5760405163e6c4247b60e01b815260040160405180910390fd5b5f610c486060850185614aac565b905090505f805b828163ffffffff161015610ef4575f610c6b6060880188614aac565b8363ffffffff16818110610c8157610c81614af1565b9050602002810190610c939190614b05565b610c9c90614bb5565b80515f8181526008880160205260409020549192509015610cd057604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610cff92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610d1991614c4c565b602060405180830381855afa158015610d34573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d579190614a5b565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610de357610de3614848565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610e96911686614c5d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610eed90614c70565b9050610c4f565b50600483018190555f610f06856124c8565b90505f610f168260400151612806565b90505f610f228861297b565b905081600282604051610f359190614c4c565b602060405180830381855afa158015610f50573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f739190614a5b565b14610f9157604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6108256001600160401b03831664e8d4a51000614c92565b5f610fcd826118ef565b6080015192915050565b5f8051602061510d8339815191525f610fef85612e14565b9050610ffa856123fd565b611005575050505050565b5f8581526004830160205260409020546001600160a01b0316331461103d5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161106c91600160b01b90046001600160401b031690614ca9565b6001600160401b03168160c001516001600160401b031610156110a2576040516302336bad60e51b815260040160405180910390fd5b83156108c5575f6110b38685611acb565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061110390610faa565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611179573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119d9190614a5b565b5f878152600785016020526040812080549091906111bc908490614c5d565b9091555050505050505050565b5f8051602061510d8339815191525f6111e1836118ef565b90506004815160058111156111f8576111f8614848565b146112165760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b0316331461124e5760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461080f906001600160a01b031682612438565b61128c613051565b5f8181525f805160206150cd8339815191526020526040808220815160e0810190925280545f8051602061510d83398151915293929190829060ff1660038111156112d9576112d9614848565b60038111156112ea576112ea614848565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561136357611363614848565b146113815760405163f95c7fe160e01b815260040160405180910390fd5b600461139082604001516118ef565b5160058111156113a2576113a2614848565b14611426575f6113b1856124c8565b90505f806113c283604001516125c8565b5091509150818460400151146113eb57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561142257604051633ab3447f60e11b815260040160405180910390fd5b5050505b61142f83611f21565b505061144760015f8051602061514d83398151915255565b5050565b5f611454613051565b61145f83338461309b565b905061082560015f8051602061514d83398151915255565b5f8051602061512d8339815191525f61148f836124c8565b90505f806114a08360400151613362565b91509150806114c257604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546114dc90614cc9565b90505f036114fd57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561152357611523614848565b146115415760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061155991614668565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206150cd8339815191526020526040808220815160e0810190925280545f8051602061510d83398151915293929190829060ff16600381111561163657611636614848565b600381111561164757611647614848565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116c0576116c0614848565b141580156116e157506003815160038111156116de576116de614848565b14155b156116ff5760405163f95c7fe160e01b815260040160405180910390fd5b5f61170d82604001516118ef565b905080606001516001600160401b03165f0361173c57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611769846040015184606001518560800151612108565b6040518263ffffffff1660e01b81526004016117859190614a29565b6020604051808303815f875af11580156117a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c59190614a5b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061512d833981519152919061180c90614cc9565b90505f0361182d57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561185357611853614848565b146118715760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118aa9190600401614d01565b6020604051808303815f875af11580156118c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ea9190614a5b565b505050565b6118f761469f565b5f8281525f8051602061516d833981519152602052604090819020815160e0810190925280545f8051602061512d833981519152929190829060ff16600581111561194457611944614848565b600581111561195557611955614848565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6119c0613051565b6119cc85858585613506565b90506119e460015f8051602061514d83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a35575080546001600160401b03808416911610155b15611a535760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a7e84846136a4565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611b16573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b3d9190810190614d96565b9150915080611b5f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ba2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc69190614a5b565b825114611be65760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611c125760405163e6c4247b60e01b815260040160405180910390fd5b5f80611c2184604001516136be565b91509150818714611c4557604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f8051602061516d833981519152602052604081206002015481905f8051602061512d83398151915290600160801b90046001600160401b0316611c978582613899565b5f611ca187613a62565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611cf18a858b612108565b6040518263ffffffff1660e01b8152600401611d0d9190614a29565b6020604051808303815f875af1158015611d29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4d9190614a5b565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408101515f905f8051602061510d8339815191529082611dc6826118ef565b90505f600382516005811115611dde57611dde614848565b1480611dfc5750600482516005811115611dfa57611dfa614848565b145b15611e0c575060c0810151611e29565b600282516005811115611e2157611e21614848565b036106555750425b85608001516001600160401b0316816001600160401b031611611e5157505f95945050505050565b600384015460608701516001600160a01b039091169063778c06b590611e7690610faa565b60a085015160808a01515f88815260088a01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa158015611efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c459190614a5b565b5f8181525f805160206150cd8339815191526020526040808220815160e0810190925280545f8051602061510d83398151915293929190829060ff166003811115611f6e57611f6e614848565b6003811115611f7f57611f7f614848565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156120ad575f8481526004870160205260409020546127109061205f90600160a01b900461ffff1685614c92565b6120699190614a72565b915081866007015f8681526020019081526020015f205f82825461208d9190614c5d565b9091555061209d90508284614e68565b90506120ad856020015182612438565b6120c285602001516108c08760600151610faa565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f61216861469f565b5f8051602061512d8339815191525f612180856124c8565b90505f806121918360400151613362565b9150915080156121b457604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156121e5576121e5614848565b60058111156121f6576121f6614848565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561226557612265614848565b14158015612286575060018151600581111561228357612283614848565b14155b156122a45760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156122b9576122b9614848565b036122c757600481526122cc565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561231157612311614848565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156123c5576123c5614848565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206150ed83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612493575f80fd5b505af115801561064c573d5f803e3d5ffd5b5f805160206150ed83398151915254611447906001600160a01b03168383613ad7565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561252c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125539190810190614d96565b915091508061257557604051636b2f19e960e01b815260040160405180910390fd5b8151156125955760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156125c15760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146125ed57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561263c57612604816001614e68565b61260f906008614c92565b61ffff1686828151811061262557612625614af1565b016020015160f81c901b91909117906001016125f0565b5061ffff8116156126605760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156126bb57612677816003614e68565b612682906008614c92565b63ffffffff1687612694836002614c5d565b815181106126a4576126a4614af1565b016020015160f81c901b9190911790600101612663565b5063ffffffff81166004146126e357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612738576126fa81601f614e68565b612705906008614c92565b88612711836006614c5d565b8151811061272157612721614af1565b016020015160f81c901b91909117906001016126e6565b505f805b600881101561279757612750816007614e68565b61275b906008614c92565b6001600160401b031689612770836026614c5d565b8151811061278057612780614af1565b016020015160f81c901b919091179060010161273c565b505f805b60088110156127f6576127af816007614e68565b6127ba906008614c92565b6001600160401b03168a6127cf83602e614c5d565b815181106127df576127df614af1565b016020015160f81c901b919091179060010161279b565b5091989097509095509350505050565b5f815160261461282957604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561287857612840816001614e68565b61284b906008614c92565b61ffff1684828151811061286157612861614af1565b016020015160f81c901b919091179060010161282c565b5061ffff81161561289c5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156128f7576128b3816003614e68565b6128be906008614c92565b63ffffffff16856128d0836002614c5d565b815181106128e0576128e0614af1565b016020015160f81c901b919091179060010161289f565b5063ffffffff81161561291d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156129725761293481601f614e68565b61293f906008614c92565b8661294b836006614c5d565b8151811061295b5761295b614af1565b016020015160f81c901b9190911790600101612920565b50949350505050565b60605f61298a83830184614aac565b61299691506058614c92565b6129a190605c614c5d565b6001600160401b038111156129b8576129b8614b23565b6040519080825280601f01601f1916602001820160405280156129e2576020820181803683370190505b5090505f5b6020811015612a375783358160208110612a0357612a03614af1565b1a60f81b828281518110612a1957612a19614af1565b60200101906001600160f81b03191690815f1a9053506001016129e7565b505f5b6020811015612a975783602001358160208110612a5957612a59614af1565b1a60f81b82612a69836020614c5d565b81518110612a7957612a79614af1565b60200101906001600160f81b03191690815f1a905350600101612a3a565b505f5b6004811015612afa57612aae816003614e68565b612ab9906008614c92565b6014901c60f81b82612acc836040614c5d565b81518110612adc57612adc614af1565b60200101906001600160f81b03191690815f1a905350600101612a9a565b505f612b0c6060850160408601614a91565b60601b90505f5b6014811015612b6c57818160148110612b2e57612b2e614af1565b1a60f81b83612b3e836044614c5d565b81518110612b4e57612b4e614af1565b60200101906001600160f81b03191690815f1a905350600101612b13565b505f612b7b6060860186614aac565b905090505f5b6004811015612be657612b95816003614e68565b612ba0906008614c92565b63ffffffff8316901c60f81b84612bb8836058614c5d565b81518110612bc857612bc8614af1565b60200101906001600160f81b03191690815f1a905350600101612b81565b505f5b612bf66060870187614aac565b9050811015612e0a575f612c0b826058614c92565b612c1690605c614c5d565b90505f5b6020811015612ca157612c306060890189614aac565b84818110612c4057612c40614af1565b9050602002810190612c529190614b05565b358160208110612c6457612c64614af1565b1a60f81b86612c738385614c5d565b81518110612c8357612c83614af1565b60200101906001600160f81b03191690815f1a905350600101612c1a565b505f5b6008811015612d5657612cb8816007614e68565b612cc3906008614c92565b612cd060608a018a614aac565b85818110612ce057612ce0614af1565b9050602002810190612cf29190614b05565b612d0390604081019060200161480f565b6001600160401b0316901c60f81b8682612d1e856020614c5d565b612d289190614c5d565b81518110612d3857612d38614af1565b60200101906001600160f81b03191690815f1a905350600101612ca4565b505f5b6030811015612e0057612d6f6060890189614aac565b84818110612d7f57612d7f614af1565b9050602002810190612d919190614b05565b612d9f906040810190614e7b565b82818110612daf57612daf614af1565b9050013560f81c60f81b8682846028612dc89190614c5d565b612dd29190614c5d565b81518110612de257612de2614af1565b60200101906001600160f81b03191690815f1a905350600101612d59565b5050600101612be9565b5091949350505050565b612e1c61469f565b5f8281525f8051602061516d8339815191526020526040808220815160e0810190925280545f8051602061512d83398151915293929190829060ff166005811115612e6957612e69614848565b6005811115612e7a57612e7a614848565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612eec57612eec614848565b14612f0a5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612f4e57612f4e614848565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612ffa8582611c4f565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061514d83398151915280546001190161308257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061514d83398151915255565b5f5f8051602061510d833981519152816130b76101fa85613b36565b90505f6130c3876118ef565b90506130ce876123fd565b6130eb57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561310057613100614848565b1461311e5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161312f9190614ca9565b905083600201600a9054906101000a90046001600160401b031682604001516131589190614ebd565b6001600160401b0316816001600160401b0316111561318a57604051630c192e7760e41b815260040160405180910390fd5b5f806131968a84611c4f565b915091505f8a836040516020016131c492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561325757613257614848565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461338657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133d55761339d816001614e68565b6133a8906008614c92565b61ffff168582815181106133be576133be614af1565b016020015160f81c901b9190911790600101613389565b5061ffff8116156133f95760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561345457613410816003614e68565b61341b906008614c92565b63ffffffff168661342d836002614c5d565b8151811061343d5761343d614af1565b016020015160f81c901b91909117906001016133fc565b5063ffffffff811660031461347c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134d15761349381601f614e68565b61349e906008614c92565b876134aa836006614c5d565b815181106134ba576134ba614af1565b016020015160f81c901b919091179060010161347f565b505f866026815181106134e6576134e6614af1565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061510d83398151915290600160401b900461ffff908116908616108061355a575061271061ffff8616115b156135785760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156135aa576040516302336bad60e51b815260040160405180910390fd5b80548310806135bc5750806001015483115b156135da57604051630103be3b60e21b815260040160405180910390fd5b5f6135e484613b36565b90505f6135f082610815565b90505f6135fd8983613b59565b905060405180606001604052806136113390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6136ac613f43565b6136b582613f8e565b61144781613fff565b5f808251602e146136e257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613731576136f9816001614e68565b613704906008614c92565b61ffff1685828151811061371a5761371a614af1565b016020015160f81c901b91909117906001016136e5565b5061ffff8116156137555760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137b05761376c816003614e68565b613777906008614c92565b63ffffffff1686613789836002614c5d565b8151811061379957613799614af1565b016020015160f81c901b9190911790600101613758565b5063ffffffff81166005146137d857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561382d576137ef81601f614e68565b6137fa906008614c92565b87613806836006614c5d565b8151811061381657613816614af1565b016020015160f81c901b91909117906001016137db565b505f805b600881101561388c57613845816007614e68565b613850906008614c92565b6001600160401b031688613865836026614c5d565b8151811061387557613875614af1565b016020015160f81c901b9190911790600101613831565b5090969095509350505050565b5f8051602061512d8339815191525f6001600160401b0380841690851611156138cd576138c683856149e7565b90506138da565b6138d784846149e7565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061393c575060018401548151613938916001600160401b031690614c5d565b8210155b15613962576001600160401b038316606082015281815260408101516020820152613981565b82816060018181516139749190614ca9565b6001600160401b03169052505b6060810151613991906064614ebd565b602082015160018601546001600160401b0392909216916139bc9190600160401b900460ff16614c92565b10156139db5760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516139f69190614c5d565b9052506040810180516001600160401b0387169190613a16908390614e68565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061516d8339815191526020526040812060020180545f8051602061512d8339815191529190600890613aac90600160401b90046001600160401b0316614ee8565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b038381166024830152604482018390526118ea91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061405c565b5f610825825f805160206150ed833981519152546001600160a01b0316906140c2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613b9d57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061512d83398151915242613bbc604086016020870161480f565b6001600160401b0316111580613bf65750613bda6202a30042614c5d565b613bea604086016020870161480f565b6001600160401b031610155b15613c135760405162d36c8560e81b815260040160405180910390fd5b6030613c226040860186614e7b565b9050141580613c3057508335155b15613c4e5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613c7e57604051630eb0d31360e11b815260040160405180910390fd5b613c88835f613899565b5f80613d216040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ccc919061480f565b6001600160401b03168152602001613ce760408a018a614e7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614224565b5f82815260068601602052604090209193509150613d3f8282614f47565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613d7d908590600401614a29565b6020604051808303815f875af1158015613d99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dbd9190614a5b565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e3557613e35614848565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f15918e01908e0161480f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f8c57604051631afcd79f60e31b815260040160405180910390fd5b565b613f96613f43565b613f9f816142e7565b613fa7614300565b613ffc60608201356080830135613fc460c0850160a0860161480f565b613fd460e0860160c08701615002565b613fe5610100870160e0880161501b565b613ff761012088016101008901614a91565b614310565b50565b614007613f43565b5f805160206150ed8339815191526001600160a01b03821661403c5760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6140706001600160a01b03841683614431565b905080515f14158015614094575080806020019051810190614092919061503b565b155b156118ea57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614108573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061412c9190614a5b565b90506141436001600160a01b03851633308661443e565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614187573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141ab9190614a5b565b90508181116142115760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016140b9565b61421b8282614e68565b95945050505050565b5f606082608001515160301461424d57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161427f9796959493929190615056565b60405160208183030381529060405290506002816040516142a09190614c4c565b602060405180830381855afa1580156142bb573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142de9190614a5b565b94909350915050565b6142ef613f43565b6142f7614477565b613ffc8161447f565b614308613f43565b613f8c614551565b614318613f43565b5f8051602061510d83398151915261ffff8416158061433c575061271061ffff8516115b1561435a5760405163c98d73a760e01b815260040160405180910390fd5b8587111561437b57604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061438e5750600a60ff8416115b156143ac576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061215883835f614559565b6040516001600160a01b03848116602483015283811660448301526064820183905261080f9186918216906323b872dd90608401613b04565b613f8c613f43565b614487613f43565b80355f8051602061512d83398151915290815560146144ac606084016040850161501b565b60ff1611806144cb57506144c6606083016040840161501b565b60ff16155b156144e95760405163b4fa3fb360e01b815260040160405180910390fd5b6144f9606083016040840161501b565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561452a604083016020840161480f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613088613f43565b60608147101561457e5760405163cd78605960e01b81523060048201526024016140b9565b5f80856001600160a01b031684866040516145999190614c4c565b5f6040518083038185875af1925050503d805f81146145d3576040519150601f19603f3d011682016040523d82523d5f602084013e6145d8565b606091505b5091509150611c458683836060826145f8576145f38261463f565b612158565b815115801561460f57506001600160a01b0384163b155b1561463857604051639996b31560e01b81526001600160a01b03851660048201526024016140b9565b5080612158565b80511561464f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461467490614cc9565b5f825580601f10614683575050565b601f0160209004905f5260205f2090810190613ffc91906146db565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156146ef575f81556001016146dc565b5090565b8015158114613ffc575f80fd5b803563ffffffff81168114614713575f80fd5b919050565b5f805f6060848603121561472a575f80fd5b83359250602084013561473c816146f3565b915061474a60408501614700565b90509250925092565b5f60208284031215614763575f80fd5b5035919050565b5f6020828403121561477a575f80fd5b61215882614700565b5f8060408385031215614794575f80fd5b61479d83614700565b946020939093013593505050565b5f80604083850312156147bc575f80fd5b82356001600160401b038111156147d1575f80fd5b8301608081860312156147e2575f80fd5b91506147f060208401614700565b90509250929050565b80356001600160401b0381168114614713575f80fd5b5f6020828403121561481f575f80fd5b612158826147f9565b5f8060408385031215614839575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061487f57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516148ba60608401826001600160401b03169052565b5060808301516148d560808401826001600160401b03169052565b5060a08301516148f060a08401826001600160401b03169052565b5060c08301516125c160c08401826001600160401b03169052565b803561ffff81168114614713575f80fd5b5f805f806080858703121561492f575f80fd5b84356001600160401b03811115614944575f80fd5b850160608188031215614955575f80fd5b93506149636020860161490b565b9250614971604086016147f9565b9396929550929360600135925050565b6001600160a01b0381168114613ffc575f80fd5b5f808284036101408112156149a8575f80fd5b610120808212156149b7575f80fd5b84935083013590506149c881614981565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156125c1576125c16149d3565b5f5b83811015614a21578181015183820152602001614a09565b50505f910152565b602081525f8251806020840152614a47816040850160208701614a07565b601f01601f19169190910160400192915050565b5f60208284031215614a6b575f80fd5b5051919050565b5f82614a8c57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614aa1575f80fd5b813561215881614981565b5f808335601e19843603018112614ac1575f80fd5b8301803591506001600160401b03821115614ada575f80fd5b6020019150600581901b3603821315611d9f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614b19575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b5957614b59614b23565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b8757614b87614b23565b604052919050565b5f6001600160401b03821115614ba757614ba7614b23565b50601f01601f191660200190565b5f60608236031215614bc5575f80fd5b614bcd614b37565b823581526020614bde8185016147f9565b8183015260408401356001600160401b03811115614bfa575f80fd5b840136601f820112614c0a575f80fd5b8035614c1d614c1882614b8f565b614b5f565b8181523684838501011115614c30575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614b19818460208701614a07565b80820180821115610825576108256149d3565b5f63ffffffff808316818103614c8857614c886149d3565b6001019392505050565b8082028115828204841417610825576108256149d3565b6001600160401b038181168382160190808211156125c1576125c16149d3565b600181811c90821680614cdd57607f821691505b602082108103614cfb57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614d1381614cc9565b806020870152604060018084165f8114614d345760018114614d5057614d7d565b60ff19851660408a0152604084151560051b8a01019550614d7d565b895f5260205f205f5b85811015614d745781548b8201860152908301908801614d59565b8a016040019650505b509398975050505050505050565b8051614713816146f3565b5f8060408385031215614da7575f80fd5b82516001600160401b0380821115614dbd575f80fd5b9084019060608287031215614dd0575f80fd5b614dd8614b37565b82518152602080840151614deb81614981565b82820152604084015183811115614e00575f80fd5b80850194505087601f850112614e14575f80fd5b83519250614e24614c1884614b8f565b8381528882858701011115614e37575f80fd5b614e4684838301848801614a07565b80604084015250819550614e5b818801614d8b565b9450505050509250929050565b81810381811115610825576108256149d3565b5f808335601e19843603018112614e90575f80fd5b8301803591506001600160401b03821115614ea9575f80fd5b602001915036819003821315611d9f575f80fd5b6001600160401b03818116838216028082169190828114614ee057614ee06149d3565b505092915050565b5f6001600160401b03808316818103614c8857614c886149d3565b601f8211156118ea57805f5260205f20601f840160051c81016020851015614f285750805b601f840160051c820191505b818110156108c5575f8155600101614f34565b81516001600160401b03811115614f6057614f60614b23565b614f7481614f6e8454614cc9565b84614f03565b602080601f831160018114614fa7575f8415614f905750858301515b5f19600386901b1c1916600185901b1785556109f8565b5f85815260208120601f198616915b82811015614fd557888601518255948401946001909101908401614fb6565b5085821015614ff257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215615012575f80fd5b6121588261490b565b5f6020828403121561502b575f80fd5b813560ff81168114612158575f80fd5b5f6020828403121561504b575f80fd5b8151612158816146f3565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516150ab81604e860160208901614a07565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 e4c87905f..f283af7f9 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161501438038061501483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614ec78061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd3660046144df565b610561565b005b3480156101df575f80fd5b506101d26101ee36600461451a565b610810565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d2610238366004614531565b610982565b348015610248575f80fd5b5061025c61025736600461451a565b610a5f565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc36600461456f565b610a75565b604051908152602001610215565b3480156102fa575f80fd5b506101d26103093660046145c3565b610aa9565b348015610319575f80fd5b506101d26103283660046145dc565b610b4a565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d2610370366004614604565b610da4565b348015610380575f80fd5b506102e161038f366004614652565b611228565b34801561039f575f80fd5b5061025c6103ae36600461451a565b611241565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e03660046144df565b611255565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d261041336600461451a565b611447565b348015610423575f80fd5b506101d26104323660046145dc565b611502565b348015610442575f80fd5b506101d26104513660046145c3565b6116c9565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a36600461451a565b61183b565b34801561049a575f80fd5b506101d26104a936600461451a565b611a17565b6102e16104bc36600461451a565b611b41565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef36600461451a565b611b72565b604051610215919061467f565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e161053136600461451a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff1660038111156105ae576105ae61466b565b60038111156105bf576105bf61466b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611b72565b905060028351600381111561064c5761064c61466b565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156106c7576106c761466b565b0361077d57851561070b576106dc8286611c3a565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b61072882846060015183608001516107239190614742565b611dbe565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561076883611f15565b5f8881526006860160205260409020556107db565b6004815160058111156107925761079261466b565b036107c2576107a083611f15565b5f8881526006860160205260409020556107b987612090565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f80516020614e9b8339815191526020526040808220815160e0810190925280545f80516020614e5b83398151915293929190829060ff16600581111561085d5761085d61466b565b600581111561086e5761086e61466b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108dd576108dd61466b565b146108fb5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109208584606001515f612277565b6040518263ffffffff1660e01b815260040161093c9190614784565b6020604051808303815f875af1158015610958573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097c91906147b6565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109cb575080546001600160401b03808416911610155b156109e95760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a13836122c6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a6f64e8d4a51000836147cd565b92915050565b5f610a7e6122da565b610a8a84848434612311565b9050610aa260015f80516020614e7b83398151915255565b9392505050565b5f80516020614e3b8339815191525f80610ac2846124b7565b91509150610acf82612755565b610ad95750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610b0857610b0861466b565b03610b2d575f83815260078501602052604081208054919055610b2b8282612790565b505b610b4381610b3e8460400151611228565b6127ee565b5050505050565b5f8181525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff166003811115610b9757610b9761466b565b6003811115610ba857610ba861466b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610c1e82611b72565b9050600183516003811115610c3557610c3561466b565b14610c535760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610c6857610c6861466b565b03610c7e57610c7685612090565b505050505050565b5f610c8887612801565b90505f80610c998360400151612901565b5091509150818514610cbe57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610cf75750806001600160401b03168660a001516001600160401b0316115b15610d1557604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614e5b8339815191529060ff1615610df657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e39573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5d91906147b6565b836020013514610e805760405163d040949d60e01b815260040160405180910390fd5b30610e916060850160408601614800565b6001600160a01b031614610eb85760405163e6c4247b60e01b815260040160405180910390fd5b5f610ec6606085018561481b565b905090505f805b828163ffffffff161015611172575f610ee9606088018861481b565b8363ffffffff16818110610eff57610eff614860565b9050602002810190610f119190614874565b610f1a90614924565b80515f8181526008880160205260409020549192509015610f4e57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610f7d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610f97916149bb565b602060405180830381855afa158015610fb2573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610fd591906147b6565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156110615761106161466b565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111149116866149cc565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061116b906149df565b9050610ecd565b50600483018190555f61118485612801565b90505f6111948260400151612b3f565b90505f6111a088612cb4565b9050816002826040516111b391906149bb565b602060405180830381855afa1580156111ce573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111f191906147b6565b1461120f57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610a6f6001600160401b03831664e8d4a51000614a01565b5f61124b82611b72565b6080015192915050565b5f80516020614e3b8339815191525f61126d8561314d565b905061127885612755565b611283575050505050565b5f8581526004830160205260409020546001600160a01b031633146112bb5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516112ea91600160b01b90046001600160401b031690614a18565b6001600160401b03168160c001516001600160401b03161015611320576040516302336bad60e51b815260040160405180910390fd5b8315610b43575f6113318685611c3a565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061138190611228565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156113f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061141b91906147b6565b5f8781526007850160205260408120805490919061143a9084906149cc565b9091555050505050505050565b5f80516020614e3b8339815191525f61145f83611b72565b90506004815160058111156114765761147661466b565b146114945760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114cc5760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461097c906001600160a01b031682612790565b61150a6122da565b5f8181525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff1660038111156115575761155761466b565b60038111156115685761156861466b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115e1576115e161466b565b146115ff5760405163f95c7fe160e01b815260040160405180910390fd5b600461160e8260400151611b72565b5160058111156116205761162061466b565b146116a4575f61162f85612801565b90505f806116408360400151612901565b50915091508184604001511461166957604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156116a057604051633ab3447f60e11b815260040160405180910390fd5b5050505b6116ad83612090565b50506116c560015f80516020614e7b83398151915255565b5050565b5f80516020614e5b8339815191525f6116e183612801565b90505f806116f2836040015161338a565b915091508061171457604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461172e90614a38565b90505f0361174f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156117755761177561466b565b146117935760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206117ab91614434565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff1660038111156118885761188861466b565b60038111156118995761189961466b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156119125761191261466b565b1415801561193357506003815160038111156119305761193061466b565b14155b156119515760405163f95c7fe160e01b815260040160405180910390fd5b5f61195f8260400151611b72565b905080606001516001600160401b03165f0361198e57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6119bb846040015184606001518560800151612277565b6040518263ffffffff1660e01b81526004016119d79190614784565b6020604051808303815f875af11580156119f3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4391906147b6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614e5b8339815191529190611a5e90614a38565b90505f03611a7f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611aa557611aa561466b565b14611ac35760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611afc9190600401614a6a565b6020604051808303815f875af1158015611b18573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3c91906147b6565b505050565b5f611b4a6122da565b611b5582333461352e565b9050611b6d60015f80516020614e7b83398151915255565b919050565b611b7a61446b565b5f8281525f80516020614e9b833981519152602052604090819020815160e0810190925280545f80516020614e5b833981519152929190829060ff166005811115611bc757611bc761466b565b6005811115611bd857611bd861466b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c85573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cac9190810190614aff565b9150915080611cce57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3591906147b6565b825114611d555760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d815760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d9084604001516137f2565b91509150818714611db457604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e9b833981519152602052604081206002015481905f80516020614e5b83398151915290600160801b90046001600160401b0316611e0685826139cd565b5f611e1087613b96565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e608a858b612277565b6040518263ffffffff1660e01b8152600401611e7c9190614784565b6020604051808303815f875af1158015611e98573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ebc91906147b6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408101515f905f80516020614e3b8339815191529082611f3582611b72565b90505f600382516005811115611f4d57611f4d61466b565b1480611f6b5750600482516005811115611f6957611f6961466b565b145b15611f7b575060c0810151611f98565b600282516005811115611f9057611f9061466b565b036107c25750425b85608001516001600160401b0316816001600160401b031611611fc057505f95945050505050565b600384015460608701516001600160a01b039091169063778c06b590611fe590611228565b60a085015160808a01515f88815260088a01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa15801561206c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611db491906147b6565b5f8181525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff1660038111156120dd576120dd61466b565b60038111156120ee576120ee61466b565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870190915290812080549082905592935090919080821561221c575f848152600487016020526040902054612710906121ce90600160a01b900461ffff1685614a01565b6121d891906147cd565b915081866007015f8681526020019081526020015f205f8282546121fc91906149cc565b9091555061220c90508284614bd1565b905061221c856020015182612790565b6122318560200151610b3e8760600151611228565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6122ce613c0b565b6122d781613c56565b50565b5f80516020614e7b83398151915280546001190161230b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614e3b83398151915290600160401b900461ffff9081169086161080612365575061271061ffff8616115b156123835760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156123b5576040516302336bad60e51b815260040160405180910390fd5b80548310806123c75750806001015483115b156123e557604051630103be3b60e21b815260040160405180910390fd5b825f6123f082610a5f565b90505f6123fd8983613cc4565b905060405180606001604052806124113390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e7b83398151915255565b5f6124c061446b565b5f80516020614e5b8339815191525f6124d885612801565b90505f806124e9836040015161338a565b91509150801561250c57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561253d5761253d61466b565b600581111561254e5761254e61466b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125bd576125bd61466b565b141580156125de57506001815160058111156125db576125db61466b565b14155b156125fc5760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156126115761261161466b565b0361261f5760048152612624565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156126695761266961466b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561271d5761271d61466b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156127dc575f80fd5b505af1158015610c76573d5f803e3d5ffd5b6116c56001600160a01b038316826140ae565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612865573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261288c9190810190614aff565b91509150806128ae57604051636b2f19e960e01b815260040160405180910390fd5b8151156128ce5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156128fa5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461292657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129755761293d816001614bd1565b612948906008614a01565b61ffff1686828151811061295e5761295e614860565b016020015160f81c901b9190911790600101612929565b5061ffff8116156129995760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156129f4576129b0816003614bd1565b6129bb906008614a01565b63ffffffff16876129cd8360026149cc565b815181106129dd576129dd614860565b016020015160f81c901b919091179060010161299c565b5063ffffffff8116600414612a1c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a7157612a3381601f614bd1565b612a3e906008614a01565b88612a4a8360066149cc565b81518110612a5a57612a5a614860565b016020015160f81c901b9190911790600101612a1f565b505f805b6008811015612ad057612a89816007614bd1565b612a94906008614a01565b6001600160401b031689612aa98360266149cc565b81518110612ab957612ab9614860565b016020015160f81c901b9190911790600101612a75565b505f805b6008811015612b2f57612ae8816007614bd1565b612af3906008614a01565b6001600160401b03168a612b0883602e6149cc565b81518110612b1857612b18614860565b016020015160f81c901b9190911790600101612ad4565b5091989097509095509350505050565b5f8151602614612b6257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612bb157612b79816001614bd1565b612b84906008614a01565b61ffff16848281518110612b9a57612b9a614860565b016020015160f81c901b9190911790600101612b65565b5061ffff811615612bd55760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612c3057612bec816003614bd1565b612bf7906008614a01565b63ffffffff1685612c098360026149cc565b81518110612c1957612c19614860565b016020015160f81c901b9190911790600101612bd8565b5063ffffffff811615612c5657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612cab57612c6d81601f614bd1565b612c78906008614a01565b86612c848360066149cc565b81518110612c9457612c94614860565b016020015160f81c901b9190911790600101612c59565b50949350505050565b60605f612cc38383018461481b565b612ccf91506058614a01565b612cda90605c6149cc565b6001600160401b03811115612cf157612cf1614892565b6040519080825280601f01601f191660200182016040528015612d1b576020820181803683370190505b5090505f5b6020811015612d705783358160208110612d3c57612d3c614860565b1a60f81b828281518110612d5257612d52614860565b60200101906001600160f81b03191690815f1a905350600101612d20565b505f5b6020811015612dd05783602001358160208110612d9257612d92614860565b1a60f81b82612da28360206149cc565b81518110612db257612db2614860565b60200101906001600160f81b03191690815f1a905350600101612d73565b505f5b6004811015612e3357612de7816003614bd1565b612df2906008614a01565b6014901c60f81b82612e058360406149cc565b81518110612e1557612e15614860565b60200101906001600160f81b03191690815f1a905350600101612dd3565b505f612e456060850160408601614800565b60601b90505f5b6014811015612ea557818160148110612e6757612e67614860565b1a60f81b83612e778360446149cc565b81518110612e8757612e87614860565b60200101906001600160f81b03191690815f1a905350600101612e4c565b505f612eb4606086018661481b565b905090505f5b6004811015612f1f57612ece816003614bd1565b612ed9906008614a01565b63ffffffff8316901c60f81b84612ef18360586149cc565b81518110612f0157612f01614860565b60200101906001600160f81b03191690815f1a905350600101612eba565b505f5b612f2f606087018761481b565b9050811015613143575f612f44826058614a01565b612f4f90605c6149cc565b90505f5b6020811015612fda57612f69606089018961481b565b84818110612f7957612f79614860565b9050602002810190612f8b9190614874565b358160208110612f9d57612f9d614860565b1a60f81b86612fac83856149cc565b81518110612fbc57612fbc614860565b60200101906001600160f81b03191690815f1a905350600101612f53565b505f5b600881101561308f57612ff1816007614bd1565b612ffc906008614a01565b61300960608a018a61481b565b8581811061301957613019614860565b905060200281019061302b9190614874565b61303c906040810190602001614652565b6001600160401b0316901c60f81b86826130578560206149cc565b61306191906149cc565b8151811061307157613071614860565b60200101906001600160f81b03191690815f1a905350600101612fdd565b505f5b6030811015613139576130a8606089018961481b565b848181106130b8576130b8614860565b90506020028101906130ca9190614874565b6130d8906040810190614be4565b828181106130e8576130e8614860565b9050013560f81c60f81b868284602861310191906149cc565b61310b91906149cc565b8151811061311b5761311b614860565b60200101906001600160f81b03191690815f1a905350600101613092565b5050600101612f22565b5091949350505050565b61315561446b565b5f8281525f80516020614e9b8339815191526020526040808220815160e0810190925280545f80516020614e5b83398151915293929190829060ff1660058111156131a2576131a261466b565b60058111156131b3576131b361466b565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156132255761322561466b565b146132435760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156132875761328761466b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133338582611dbe565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146133ae57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133fd576133c5816001614bd1565b6133d0906008614a01565b61ffff168582815181106133e6576133e6614860565b016020015160f81c901b91909117906001016133b1565b5061ffff8116156134215760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561347c57613438816003614bd1565b613443906008614a01565b63ffffffff16866134558360026149cc565b8151811061346557613465614860565b016020015160f81c901b9190911790600101613424565b5063ffffffff81166003146134a457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134f9576134bb81601f614bd1565b6134c6906008614a01565b876134d28360066149cc565b815181106134e2576134e2614860565b016020015160f81c901b91909117906001016134a7565b505f8660268151811061350e5761350e614860565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614e3b8339815191528161354784610a5f565b90505f61355387611b72565b905061355e87612755565b61357b57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156135905761359061466b565b146135ae5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516135bf9190614a18565b905083600201600a9054906101000a90046001600160401b031682604001516135e89190614c26565b6001600160401b0316816001600160401b0316111561361a57604051630c192e7760e41b815260040160405180910390fd5b5f806136268a84611dbe565b915091505f8a8360405160200161365492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156136e7576136e761466b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461381657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156138655761382d816001614bd1565b613838906008614a01565b61ffff1685828151811061384e5761384e614860565b016020015160f81c901b9190911790600101613819565b5061ffff8116156138895760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156138e4576138a0816003614bd1565b6138ab906008614a01565b63ffffffff16866138bd8360026149cc565b815181106138cd576138cd614860565b016020015160f81c901b919091179060010161388c565b5063ffffffff811660051461390c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139615761392381601f614bd1565b61392e906008614a01565b8761393a8360066149cc565b8151811061394a5761394a614860565b016020015160f81c901b919091179060010161390f565b505f805b60088110156139c057613979816007614bd1565b613984906008614a01565b6001600160401b0316886139998360266149cc565b815181106139a9576139a9614860565b016020015160f81c901b9190911790600101613965565b5090969095509350505050565b5f80516020614e5b8339815191525f6001600160401b038084169085161115613a01576139fa8385614742565b9050613a0e565b613a0b8484614742565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a70575060018401548151613a6c916001600160401b0316906149cc565b8210155b15613a96576001600160401b038316606082015281815260408101516020820152613ab5565b8281606001818151613aa89190614a18565b6001600160401b03169052505b6060810151613ac5906064614c26565b602082015160018601546001600160401b039290921691613af09190600160401b900460ff16614a01565b1015613b0f5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613b2a91906149cc565b9052506040810180516001600160401b0387169190613b4a908390614bd1565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e9b8339815191526020526040812060020180545f80516020614e5b8339815191529190600890613be090600160401b90046001600160401b0316614c51565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c5457604051631afcd79f60e31b815260040160405180910390fd5b565b613c5e613c0b565b613c6781614145565b613c6f61415e565b6122d760608201356080830135613c8c60c0850160a08601614652565b613c9c60e0860160c08701614c6c565b613cad610100870160e08801614c85565b613cbf61012088016101008901614800565b61416e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613d0857604051637fab81e560e01b815260040160405180910390fd5b5f80516020614e5b83398151915242613d276040860160208701614652565b6001600160401b0316111580613d615750613d456202a300426149cc565b613d556040860160208701614652565b6001600160401b031610155b15613d7e5760405162d36c8560e81b815260040160405180910390fd5b6030613d8d6040860186614be4565b9050141580613d9b57508335155b15613db95760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613de957604051630eb0d31360e11b815260040160405180910390fd5b613df3835f6139cd565b5f80613e8c6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e379190614652565b6001600160401b03168152602001613e5260408a018a614be4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061428f565b5f82815260068601602052604090209193509150613eaa8282614ce9565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613ee8908590600401614784565b6020604051808303815f875af1158015613f04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f2891906147b6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613fa057613fa061466b565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614080918e01908e01614652565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156140d55760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461411e576040519150601f19603f3d011682016040523d82523d5f602084013e614123565b606091505b5050905080611b3c57604051630a12f52160e11b815260040160405180910390fd5b61414d613c0b565b614155614352565b6122d78161435a565b614166613c0b565b613c5461442c565b614176613c0b565b5f80516020614e3b83398151915261ffff8416158061419a575061271061ffff8516115b156141b85760405163c98d73a760e01b815260040160405180910390fd5b858711156141d957604051630103be3b60e21b815260040160405180910390fd5b60ff831615806141ec5750600a60ff8416115b1561420a576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146142b857604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016142ea9796959493929190614da4565b604051602081830303815290604052905060028160405161430b91906149bb565b602060405180830381855afa158015614326573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061434991906147b6565b94909350915050565b613c54613c0b565b614362613c0b565b80355f80516020614e5b83398151915290815560146143876060840160408501614c85565b60ff1611806143a657506143a16060830160408401614c85565b60ff16155b156143c45760405163b4fa3fb360e01b815260040160405180910390fd5b6143d46060830160408401614c85565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556144056040830160208401614652565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6124a4613c0b565b50805461444090614a38565b5f825580601f1061444f575050565b601f0160209004905f5260205f20908101906122d791906144a7565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156144bb575f81556001016144a8565b5090565b80151581146122d7575f80fd5b803563ffffffff81168114611b6d575f80fd5b5f805f606084860312156144f1575f80fd5b833592506020840135614503816144bf565b9150614511604085016144cc565b90509250925092565b5f6020828403121561452a575f80fd5b5035919050565b5f6101208284031215614542575f80fd5b50919050565b803561ffff81168114611b6d575f80fd5b80356001600160401b0381168114611b6d575f80fd5b5f805f60608486031215614581575f80fd5b83356001600160401b03811115614596575f80fd5b8401606081870312156145a7575f80fd5b92506145b560208501614548565b915061451160408501614559565b5f602082840312156145d3575f80fd5b610aa2826144cc565b5f80604083850312156145ed575f80fd5b6145f6836144cc565b946020939093013593505050565b5f8060408385031215614615575f80fd5b82356001600160401b0381111561462a575f80fd5b83016080818603121561463b575f80fd5b9150614649602084016144cc565b90509250929050565b5f60208284031215614662575f80fd5b610aa282614559565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106146a257634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516146dd60608401826001600160401b03169052565b5060808301516146f860808401826001600160401b03169052565b5060a083015161471360a08401826001600160401b03169052565b5060c08301516128fa60c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156128fa576128fa61472e565b5f5b8381101561477c578181015183820152602001614764565b50505f910152565b602081525f82518060208401526147a2816040850160208701614762565b601f01601f19169190910160400192915050565b5f602082840312156147c6575f80fd5b5051919050565b5f826147e757634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03811681146122d7575f80fd5b5f60208284031215614810575f80fd5b8135610aa2816147ec565b5f808335601e19843603018112614830575f80fd5b8301803591506001600160401b03821115614849575f80fd5b6020019150600581901b3603821315611f0e575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614888575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156148c8576148c8614892565b60405290565b604051601f8201601f191681016001600160401b03811182821017156148f6576148f6614892565b604052919050565b5f6001600160401b0382111561491657614916614892565b50601f01601f191660200190565b5f60608236031215614934575f80fd5b61493c6148a6565b82358152602061494d818501614559565b8183015260408401356001600160401b03811115614969575f80fd5b840136601f820112614979575f80fd5b803561498c614987826148fe565b6148ce565b818152368483850101111561499f575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614888818460208701614762565b80820180821115610a6f57610a6f61472e565b5f63ffffffff8083168181036149f7576149f761472e565b6001019392505050565b8082028115828204841417610a6f57610a6f61472e565b6001600160401b038181168382160190808211156128fa576128fa61472e565b600181811c90821680614a4c57607f821691505b60208210810361454257634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614a7c81614a38565b806020870152604060018084165f8114614a9d5760018114614ab957614ae6565b60ff19851660408a0152604084151560051b8a01019550614ae6565b895f5260205f205f5b85811015614add5781548b8201860152908301908801614ac2565b8a016040019650505b509398975050505050505050565b8051611b6d816144bf565b5f8060408385031215614b10575f80fd5b82516001600160401b0380821115614b26575f80fd5b9084019060608287031215614b39575f80fd5b614b416148a6565b82518152602080840151614b54816147ec565b82820152604084015183811115614b69575f80fd5b80850194505087601f850112614b7d575f80fd5b83519250614b8d614987846148fe565b8381528882858701011115614ba0575f80fd5b614baf84838301848801614762565b80604084015250819550614bc4818801614af4565b9450505050509250929050565b81810381811115610a6f57610a6f61472e565b5f808335601e19843603018112614bf9575f80fd5b8301803591506001600160401b03821115614c12575f80fd5b602001915036819003821315611f0e575f80fd5b6001600160401b03818116838216028082169190828114614c4957614c4961472e565b505092915050565b5f6001600160401b038083168181036149f7576149f761472e565b5f60208284031215614c7c575f80fd5b610aa282614548565b5f60208284031215614c95575f80fd5b813560ff81168114610aa2575f80fd5b601f821115611b3c57805f5260205f20601f840160051c81016020851015614cca5750805b601f840160051c820191505b81811015610b43575f8155600101614cd6565b81516001600160401b03811115614d0257614d02614892565b614d1681614d108454614a38565b84614ca5565b602080601f831160018114614d49575f8415614d325750858301515b5f19600386901b1c1916600185901b178555610c76565b5f85815260208120601f198616915b82811015614d7757888601518255948401946001909101908401614d58565b5085821015614d9457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614df981604e860160208901614762565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051614ffb380380614ffb83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614eae8061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd3660046144c6565b610561565b005b3480156101df575f80fd5b506101d26101ee366004614501565b6107f7565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d2610238366004614518565b610969565b348015610248575f80fd5b5061025c610257366004614501565b610a46565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc366004614556565b610a5c565b604051908152602001610215565b3480156102fa575f80fd5b506101d26103093660046145aa565b610a90565b348015610319575f80fd5b506101d26103283660046145c3565b610b31565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d26103703660046145eb565b610d8b565b348015610380575f80fd5b506102e161038f366004614639565b61120f565b34801561039f575f80fd5b5061025c6103ae366004614501565b611228565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e03660046144c6565b61123c565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d2610413366004614501565b61142e565b348015610423575f80fd5b506101d26104323660046145c3565b6114e9565b348015610442575f80fd5b506101d26104513660046145aa565b6116b0565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a366004614501565b611822565b34801561049a575f80fd5b506101d26104a9366004614501565b6119fe565b6102e16104bc366004614501565b611b28565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef366004614501565b611b59565b6040516102159190614666565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e1610531366004614501565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614e028339815191526020526040808220815160e0810190925280545f80516020614e2283398151915293929190829060ff1660038111156105ae576105ae614652565b60038111156105bf576105bf614652565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611b59565b905060028351600381111561064c5761064c614652565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156106c7576106c7614652565b0361076457851561070b576106dc8286611c21565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b61072882846060015183608001516107239190614729565b611da5565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b039092169190911790556107c2565b60048151600581111561077957610779614652565b036107a95761078783611efc565b5f8881526006860160205260409020556107a087612077565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f80516020614e828339815191526020526040808220815160e0810190925280545f80516020614e4283398151915293929190829060ff16600581111561084457610844614652565b600581111561085557610855614652565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108c4576108c4614652565b146108e25760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109078584606001515f61225e565b6040518263ffffffff1660e01b8152600401610923919061476b565b6020604051808303815f875af115801561093f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610963919061479d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109b2575080546001600160401b03808416911610155b156109d05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109fa836122ad565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a5664e8d4a51000836147b4565b92915050565b5f610a656122c1565b610a71848484346122f8565b9050610a8960015f80516020614e6283398151915255565b9392505050565b5f80516020614e228339815191525f80610aa98461249e565b91509150610ab68261273c565b610ac05750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610aef57610aef614652565b03610b14575f83815260078501602052604081208054919055610b128282612777565b505b610b2a81610b25846040015161120f565b6127d5565b5050505050565b5f8181525f80516020614e028339815191526020526040808220815160e0810190925280545f80516020614e2283398151915293929190829060ff166003811115610b7e57610b7e614652565b6003811115610b8f57610b8f614652565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610c0582611b59565b9050600183516003811115610c1c57610c1c614652565b14610c3a5760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610c4f57610c4f614652565b03610c6557610c5d85612077565b505050505050565b5f610c6f876127e8565b90505f80610c8083604001516128e8565b5091509150818514610ca557604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610cde5750806001600160401b03168660a001516001600160401b0316115b15610cfc57604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614e428339815191529060ff1615610ddd57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e44919061479d565b836020013514610e675760405163d040949d60e01b815260040160405180910390fd5b30610e7860608501604086016147e7565b6001600160a01b031614610e9f5760405163e6c4247b60e01b815260040160405180910390fd5b5f610ead6060850185614802565b905090505f805b828163ffffffff161015611159575f610ed06060880188614802565b8363ffffffff16818110610ee657610ee6614847565b9050602002810190610ef8919061485b565b610f019061490b565b80515f8181526008880160205260409020549192509015610f3557604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610f6492919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610f7e916149a2565b602060405180830381855afa158015610f99573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610fbc919061479d565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561104857611048614652565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516110fb9116866149b3565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611152906149c6565b9050610eb4565b50600483018190555f61116b856127e8565b90505f61117b8260400151612b26565b90505f61118788612c9b565b90508160028260405161119a91906149a2565b602060405180830381855afa1580156111b5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111d8919061479d565b146111f657604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610a566001600160401b03831664e8d4a510006149e8565b5f61123282611b59565b6080015192915050565b5f80516020614e228339815191525f61125485613134565b905061125f8561273c565b61126a575050505050565b5f8581526004830160205260409020546001600160a01b031633146112a25760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516112d191600160b01b90046001600160401b0316906149ff565b6001600160401b03168160c001516001600160401b03161015611307576040516302336bad60e51b815260040160405180910390fd5b8315610b2a575f6113188685611c21565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906113689061120f565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156113de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611402919061479d565b5f878152600785016020526040812080549091906114219084906149b3565b9091555050505050505050565b5f80516020614e228339815191525f61144683611b59565b905060048151600581111561145d5761145d614652565b1461147b5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114b35760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610963906001600160a01b031682612777565b6114f16122c1565b5f8181525f80516020614e028339815191526020526040808220815160e0810190925280545f80516020614e2283398151915293929190829060ff16600381111561153e5761153e614652565b600381111561154f5761154f614652565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115c8576115c8614652565b146115e65760405163f95c7fe160e01b815260040160405180910390fd5b60046115f58260400151611b59565b51600581111561160757611607614652565b1461168b575f611616856127e8565b90505f8061162783604001516128e8565b50915091508184604001511461165057604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561168757604051633ab3447f60e11b815260040160405180910390fd5b5050505b61169483612077565b50506116ac60015f80516020614e6283398151915255565b5050565b5f80516020614e428339815191525f6116c8836127e8565b90505f806116d98360400151613371565b91509150806116fb57604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461171590614a1f565b90505f0361173657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561175c5761175c614652565b1461177a5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206117929161441b565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614e028339815191526020526040808220815160e0810190925280545f80516020614e2283398151915293929190829060ff16600381111561186f5761186f614652565b600381111561188057611880614652565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156118f9576118f9614652565b1415801561191a575060038151600381111561191757611917614652565b14155b156119385760405163f95c7fe160e01b815260040160405180910390fd5b5f6119468260400151611b59565b905080606001516001600160401b03165f0361197557604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6119a284604001518460600151856080015161225e565b6040518263ffffffff1660e01b81526004016119be919061476b565b6020604051808303815f875af11580156119da573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2a919061479d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614e428339815191529190611a4590614a1f565b90505f03611a6657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611a8c57611a8c614652565b14611aaa5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ae39190600401614a51565b6020604051808303815f875af1158015611aff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b23919061479d565b505050565b5f611b316122c1565b611b3c823334613515565b9050611b5460015f80516020614e6283398151915255565b919050565b611b61614452565b5f8281525f80516020614e82833981519152602052604090819020815160e0810190925280545f80516020614e42833981519152929190829060ff166005811115611bae57611bae614652565b6005811115611bbf57611bbf614652565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c6c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c939190810190614ae6565b9150915080611cb557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1c919061479d565b825114611d3c5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d685760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d7784604001516137d9565b91509150818714611d9b57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e82833981519152602052604081206002015481905f80516020614e4283398151915290600160801b90046001600160401b0316611ded85826139b4565b5f611df787613b7d565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e478a858b61225e565b6040518263ffffffff1660e01b8152600401611e63919061476b565b6020604051808303815f875af1158015611e7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea3919061479d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408101515f905f80516020614e228339815191529082611f1c82611b59565b90505f600382516005811115611f3457611f34614652565b1480611f525750600482516005811115611f5057611f50614652565b145b15611f62575060c0810151611f7f565b600282516005811115611f7757611f77614652565b036107a95750425b85608001516001600160401b0316816001600160401b031611611fa757505f95945050505050565b600384015460608701516001600160a01b039091169063778c06b590611fcc9061120f565b60a085015160808a01515f88815260088a01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa158015612053573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9b919061479d565b5f8181525f80516020614e028339815191526020526040808220815160e0810190925280545f80516020614e2283398151915293929190829060ff1660038111156120c4576120c4614652565b60038111156120d5576120d5614652565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612203575f848152600487016020526040902054612710906121b590600160a01b900461ffff16856149e8565b6121bf91906147b4565b915081866007015f8681526020019081526020015f205f8282546121e391906149b3565b909155506121f390508284614bb8565b9050612203856020015182612777565b6122188560200151610b25876060015161120f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6122b5613bf2565b6122be81613c3d565b50565b5f80516020614e628339815191528054600119016122f257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614e2283398151915290600160401b900461ffff908116908616108061234c575061271061ffff8616115b1561236a5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561239c576040516302336bad60e51b815260040160405180910390fd5b80548310806123ae5750806001015483115b156123cc57604051630103be3b60e21b815260040160405180910390fd5b825f6123d782610a46565b90505f6123e48983613cab565b905060405180606001604052806123f83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e6283398151915255565b5f6124a7614452565b5f80516020614e428339815191525f6124bf856127e8565b90505f806124d08360400151613371565b9150915080156124f357604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561252457612524614652565b600581111561253557612535614652565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125a4576125a4614652565b141580156125c557506001815160058111156125c2576125c2614652565b14155b156125e35760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156125f8576125f8614652565b03612606576004815261260b565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561265057612650614652565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561270457612704614652565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156127c3575f80fd5b505af1158015610c5d573d5f803e3d5ffd5b6116ac6001600160a01b03831682614095565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561284c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128739190810190614ae6565b915091508061289557604051636b2f19e960e01b815260040160405180910390fd5b8151156128b55760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156128e15760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461290d57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561295c57612924816001614bb8565b61292f9060086149e8565b61ffff1686828151811061294557612945614847565b016020015160f81c901b9190911790600101612910565b5061ffff8116156129805760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156129db57612997816003614bb8565b6129a29060086149e8565b63ffffffff16876129b48360026149b3565b815181106129c4576129c4614847565b016020015160f81c901b9190911790600101612983565b5063ffffffff8116600414612a0357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a5857612a1a81601f614bb8565b612a259060086149e8565b88612a318360066149b3565b81518110612a4157612a41614847565b016020015160f81c901b9190911790600101612a06565b505f805b6008811015612ab757612a70816007614bb8565b612a7b9060086149e8565b6001600160401b031689612a908360266149b3565b81518110612aa057612aa0614847565b016020015160f81c901b9190911790600101612a5c565b505f805b6008811015612b1657612acf816007614bb8565b612ada9060086149e8565b6001600160401b03168a612aef83602e6149b3565b81518110612aff57612aff614847565b016020015160f81c901b9190911790600101612abb565b5091989097509095509350505050565b5f8151602614612b4957604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b9857612b60816001614bb8565b612b6b9060086149e8565b61ffff16848281518110612b8157612b81614847565b016020015160f81c901b9190911790600101612b4c565b5061ffff811615612bbc5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612c1757612bd3816003614bb8565b612bde9060086149e8565b63ffffffff1685612bf08360026149b3565b81518110612c0057612c00614847565b016020015160f81c901b9190911790600101612bbf565b5063ffffffff811615612c3d57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c9257612c5481601f614bb8565b612c5f9060086149e8565b86612c6b8360066149b3565b81518110612c7b57612c7b614847565b016020015160f81c901b9190911790600101612c40565b50949350505050565b60605f612caa83830184614802565b612cb6915060586149e8565b612cc190605c6149b3565b6001600160401b03811115612cd857612cd8614879565b6040519080825280601f01601f191660200182016040528015612d02576020820181803683370190505b5090505f5b6020811015612d575783358160208110612d2357612d23614847565b1a60f81b828281518110612d3957612d39614847565b60200101906001600160f81b03191690815f1a905350600101612d07565b505f5b6020811015612db75783602001358160208110612d7957612d79614847565b1a60f81b82612d898360206149b3565b81518110612d9957612d99614847565b60200101906001600160f81b03191690815f1a905350600101612d5a565b505f5b6004811015612e1a57612dce816003614bb8565b612dd99060086149e8565b6014901c60f81b82612dec8360406149b3565b81518110612dfc57612dfc614847565b60200101906001600160f81b03191690815f1a905350600101612dba565b505f612e2c60608501604086016147e7565b60601b90505f5b6014811015612e8c57818160148110612e4e57612e4e614847565b1a60f81b83612e5e8360446149b3565b81518110612e6e57612e6e614847565b60200101906001600160f81b03191690815f1a905350600101612e33565b505f612e9b6060860186614802565b905090505f5b6004811015612f0657612eb5816003614bb8565b612ec09060086149e8565b63ffffffff8316901c60f81b84612ed88360586149b3565b81518110612ee857612ee8614847565b60200101906001600160f81b03191690815f1a905350600101612ea1565b505f5b612f166060870187614802565b905081101561312a575f612f2b8260586149e8565b612f3690605c6149b3565b90505f5b6020811015612fc157612f506060890189614802565b84818110612f6057612f60614847565b9050602002810190612f72919061485b565b358160208110612f8457612f84614847565b1a60f81b86612f9383856149b3565b81518110612fa357612fa3614847565b60200101906001600160f81b03191690815f1a905350600101612f3a565b505f5b600881101561307657612fd8816007614bb8565b612fe39060086149e8565b612ff060608a018a614802565b8581811061300057613000614847565b9050602002810190613012919061485b565b613023906040810190602001614639565b6001600160401b0316901c60f81b868261303e8560206149b3565b61304891906149b3565b8151811061305857613058614847565b60200101906001600160f81b03191690815f1a905350600101612fc4565b505f5b60308110156131205761308f6060890189614802565b8481811061309f5761309f614847565b90506020028101906130b1919061485b565b6130bf906040810190614bcb565b828181106130cf576130cf614847565b9050013560f81c60f81b86828460286130e891906149b3565b6130f291906149b3565b8151811061310257613102614847565b60200101906001600160f81b03191690815f1a905350600101613079565b5050600101612f09565b5091949350505050565b61313c614452565b5f8281525f80516020614e828339815191526020526040808220815160e0810190925280545f80516020614e4283398151915293929190829060ff16600581111561318957613189614652565b600581111561319a5761319a614652565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561320c5761320c614652565b1461322a5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561326e5761326e614652565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61331a8582611da5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461339557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133e4576133ac816001614bb8565b6133b79060086149e8565b61ffff168582815181106133cd576133cd614847565b016020015160f81c901b9190911790600101613398565b5061ffff8116156134085760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156134635761341f816003614bb8565b61342a9060086149e8565b63ffffffff168661343c8360026149b3565b8151811061344c5761344c614847565b016020015160f81c901b919091179060010161340b565b5063ffffffff811660031461348b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134e0576134a281601f614bb8565b6134ad9060086149e8565b876134b98360066149b3565b815181106134c9576134c9614847565b016020015160f81c901b919091179060010161348e565b505f866026815181106134f5576134f5614847565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614e228339815191528161352e84610a46565b90505f61353a87611b59565b90506135458761273c565b61356257604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561357757613577614652565b146135955760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516135a691906149ff565b905083600201600a9054906101000a90046001600160401b031682604001516135cf9190614c0d565b6001600160401b0316816001600160401b0316111561360157604051630c192e7760e41b815260040160405180910390fd5b5f8061360d8a84611da5565b915091505f8a8360405160200161363b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156136ce576136ce614652565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146137fd57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561384c57613814816001614bb8565b61381f9060086149e8565b61ffff1685828151811061383557613835614847565b016020015160f81c901b9190911790600101613800565b5061ffff8116156138705760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156138cb57613887816003614bb8565b6138929060086149e8565b63ffffffff16866138a48360026149b3565b815181106138b4576138b4614847565b016020015160f81c901b9190911790600101613873565b5063ffffffff81166005146138f357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139485761390a81601f614bb8565b6139159060086149e8565b876139218360066149b3565b8151811061393157613931614847565b016020015160f81c901b91909117906001016138f6565b505f805b60088110156139a757613960816007614bb8565b61396b9060086149e8565b6001600160401b0316886139808360266149b3565b8151811061399057613990614847565b016020015160f81c901b919091179060010161394c565b5090969095509350505050565b5f80516020614e428339815191525f6001600160401b0380841690851611156139e8576139e18385614729565b90506139f5565b6139f28484614729565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a57575060018401548151613a53916001600160401b0316906149b3565b8210155b15613a7d576001600160401b038316606082015281815260408101516020820152613a9c565b8281606001818151613a8f91906149ff565b6001600160401b03169052505b6060810151613aac906064614c0d565b602082015160018601546001600160401b039290921691613ad79190600160401b900460ff166149e8565b1015613af65760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613b1191906149b3565b9052506040810180516001600160401b0387169190613b31908390614bb8565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e828339815191526020526040812060020180545f80516020614e428339815191529190600890613bc790600160401b90046001600160401b0316614c38565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c3b57604051631afcd79f60e31b815260040160405180910390fd5b565b613c45613bf2565b613c4e8161412c565b613c56614145565b6122be60608201356080830135613c7360c0850160a08601614639565b613c8360e0860160c08701614c53565b613c94610100870160e08801614c6c565b613ca6610120880161010089016147e7565b614155565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613cef57604051637fab81e560e01b815260040160405180910390fd5b5f80516020614e4283398151915242613d0e6040860160208701614639565b6001600160401b0316111580613d485750613d2c6202a300426149b3565b613d3c6040860160208701614639565b6001600160401b031610155b15613d655760405162d36c8560e81b815260040160405180910390fd5b6030613d746040860186614bcb565b9050141580613d8257508335155b15613da05760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613dd057604051630eb0d31360e11b815260040160405180910390fd5b613dda835f6139b4565b5f80613e736040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e1e9190614639565b6001600160401b03168152602001613e3960408a018a614bcb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614276565b5f82815260068601602052604090209193509150613e918282614cd0565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613ecf90859060040161476b565b6020604051808303815f875af1158015613eeb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f0f919061479d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613f8757613f87614652565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614067918e01908e01614639565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156140bc5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614105576040519150601f19603f3d011682016040523d82523d5f602084013e61410a565b606091505b5050905080611b2357604051630a12f52160e11b815260040160405180910390fd5b614134613bf2565b61413c614339565b6122be81614341565b61414d613bf2565b613c3b614413565b61415d613bf2565b5f80516020614e2283398151915261ffff84161580614181575061271061ffff8516115b1561419f5760405163c98d73a760e01b815260040160405180910390fd5b858711156141c057604051630103be3b60e21b815260040160405180910390fd5b60ff831615806141d35750600a60ff8416115b156141f1576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461429f57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016142d19796959493929190614d8b565b60405160208183030381529060405290506002816040516142f291906149a2565b602060405180830381855afa15801561430d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614330919061479d565b94909350915050565b613c3b613bf2565b614349613bf2565b80355f80516020614e42833981519152908155601461436e6060840160408501614c6c565b60ff16118061438d57506143886060830160408401614c6c565b60ff16155b156143ab5760405163b4fa3fb360e01b815260040160405180910390fd5b6143bb6060830160408401614c6c565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556143ec6040830160208401614639565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61248b613bf2565b50805461442790614a1f565b5f825580601f10614436575050565b601f0160209004905f5260205f20908101906122be919061448e565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156144a2575f815560010161448f565b5090565b80151581146122be575f80fd5b803563ffffffff81168114611b54575f80fd5b5f805f606084860312156144d8575f80fd5b8335925060208401356144ea816144a6565b91506144f8604085016144b3565b90509250925092565b5f60208284031215614511575f80fd5b5035919050565b5f6101208284031215614529575f80fd5b50919050565b803561ffff81168114611b54575f80fd5b80356001600160401b0381168114611b54575f80fd5b5f805f60608486031215614568575f80fd5b83356001600160401b0381111561457d575f80fd5b84016060818703121561458e575f80fd5b925061459c6020850161452f565b91506144f860408501614540565b5f602082840312156145ba575f80fd5b610a89826144b3565b5f80604083850312156145d4575f80fd5b6145dd836144b3565b946020939093013593505050565b5f80604083850312156145fc575f80fd5b82356001600160401b03811115614611575f80fd5b830160808186031215614622575f80fd5b9150614630602084016144b3565b90509250929050565b5f60208284031215614649575f80fd5b610a8982614540565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061468957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516146c460608401826001600160401b03169052565b5060808301516146df60808401826001600160401b03169052565b5060a08301516146fa60a08401826001600160401b03169052565b5060c08301516128e160c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156128e1576128e1614715565b5f5b8381101561476357818101518382015260200161474b565b50505f910152565b602081525f8251806020840152614789816040850160208701614749565b601f01601f19169190910160400192915050565b5f602082840312156147ad575f80fd5b5051919050565b5f826147ce57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03811681146122be575f80fd5b5f602082840312156147f7575f80fd5b8135610a89816147d3565b5f808335601e19843603018112614817575f80fd5b8301803591506001600160401b03821115614830575f80fd5b6020019150600581901b3603821315611ef5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261486f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156148af576148af614879565b60405290565b604051601f8201601f191681016001600160401b03811182821017156148dd576148dd614879565b604052919050565b5f6001600160401b038211156148fd576148fd614879565b50601f01601f191660200190565b5f6060823603121561491b575f80fd5b61492361488d565b823581526020614934818501614540565b8183015260408401356001600160401b03811115614950575f80fd5b840136601f820112614960575f80fd5b803561497361496e826148e5565b6148b5565b8181523684838501011115614986575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f825161486f818460208701614749565b80820180821115610a5657610a56614715565b5f63ffffffff8083168181036149de576149de614715565b6001019392505050565b8082028115828204841417610a5657610a56614715565b6001600160401b038181168382160190808211156128e1576128e1614715565b600181811c90821680614a3357607f821691505b60208210810361452957634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614a6381614a1f565b806020870152604060018084165f8114614a845760018114614aa057614acd565b60ff19851660408a0152604084151560051b8a01019550614acd565b895f5260205f205f5b85811015614ac45781548b8201860152908301908801614aa9565b8a016040019650505b509398975050505050505050565b8051611b54816144a6565b5f8060408385031215614af7575f80fd5b82516001600160401b0380821115614b0d575f80fd5b9084019060608287031215614b20575f80fd5b614b2861488d565b82518152602080840151614b3b816147d3565b82820152604084015183811115614b50575f80fd5b80850194505087601f850112614b64575f80fd5b83519250614b7461496e846148e5565b8381528882858701011115614b87575f80fd5b614b9684838301848801614749565b80604084015250819550614bab818801614adb565b9450505050509250929050565b81810381811115610a5657610a56614715565b5f808335601e19843603018112614be0575f80fd5b8301803591506001600160401b03821115614bf9575f80fd5b602001915036819003821315611ef5575f80fd5b6001600160401b03818116838216028082169190828114614c3057614c30614715565b505092915050565b5f6001600160401b038083168181036149de576149de614715565b5f60208284031215614c63575f80fd5b610a898261452f565b5f60208284031215614c7c575f80fd5b813560ff81168114610a89575f80fd5b601f821115611b2357805f5260205f20601f840160051c81016020851015614cb15750805b601f840160051c820191505b81811015610b2a575f8155600101614cbd565b81516001600160401b03811115614ce957614ce9614879565b614cfd81614cf78454614a1f565b84614c8c565b602080601f831160018114614d30575f8415614d195750858301515b5f19600386901b1c1916600185901b178555610c5d565b5f85815260208120601f198616915b82811015614d5e57888601518255948401946001909101908401614d3f565b5085821015614d7b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614de081604e860160208901614749565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 5e50a0b3c..31d061609 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -435,9 +435,9 @@ abstract contract PoSValidatorManager is ($._delegatorStakes[delegationID].endingNonce,) = _setValidatorWeight(validationID, validator.weight - delegator.weight); - $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator); + $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator, validator); } else if (validator.status == ValidatorStatus.Completed) { - $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator); + $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator, validator); return _completeEndDelegation(delegationID); } else { revert InvalidValidatorStatus(); @@ -447,16 +447,13 @@ abstract contract PoSValidatorManager is } /// @dev Calculates the reward owed to the delegator based on the state of the delegator and its corresponding validator. - function _calculateDelegationReward(Delegator memory delegator) + function _calculateDelegationReward(Delegator memory delegator, Validator memory validator) private view returns (uint256) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); - bytes32 validationID = delegator.validationID; - Validator memory validator = getValidator(validationID); - uint64 delegationEndTime; if ( validator.status == ValidatorStatus.PendingRemoved @@ -479,7 +476,7 @@ abstract contract PoSValidatorManager is validatorStartTime: validator.startedAt, stakingStartTime: delegator.startedAt, stakingEndTime: delegationEndTime, - uptimeSeconds: $._completedValidationUptimeSeconds[validationID], + uptimeSeconds: $._completedValidationUptimeSeconds[delegator.validationID], initialSupply: 0, endSupply: 0 }); From a3ba8812be36ba6affefd0af46d218130e83d4aa Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 26 Sep 2024 06:58:22 -0700 Subject: [PATCH 423/545] Bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index adcfe03b1..052257a3f 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516152e63803806152e683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151998061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b3366004614718565b61040d565b005b6101b86101c8366004614753565b6106a3565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004614753565b610815565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b861024136600461476a565b61082b565b6101b8610254366004614783565b6108cc565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b86102843660046147ab565b610b26565b61029c61029736600461480f565b610faa565b6040519081526020016101e3565b6101ff6102b8366004614753565b610fc3565b61029c5f81565b6101b86102d2366004614718565b610fd7565b6101d5603081565b6101b86102ed366004614753565b6111c9565b6101b8610300366004614783565b611284565b61029c610313366004614828565b61144b565b6101b861032636600461476a565b611477565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004614753565b6115e9565b6101b8610372366004614753565b6117c5565b6101d5601481565b61039261038d366004614753565b6118ef565b6040516101e3919061485c565b6101ff6202a30081565b61029c6103b7366004614753565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f536600461491c565b6119b7565b6101b8610408366004614995565b6119ec565b5f8381525f805160206150cd8339815191526020526040808220815160e0810190925280545f8051602061510d83398151915293929190829060ff16600381111561045a5761045a614848565b600381111561046b5761046b614848565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e1826118ef565b90506002835160038111156104f8576104f8614848565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff19166003179055815160029181111561057357610573614848565b036106105785156105b7576105888286611acb565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b6105d482846060015183608001516105cf91906149e7565b611c4f565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561066e565b60048151600581111561062557610625614848565b036106555761063383611da6565b5f88815260068601602052604090205561064c87611f21565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f8051602061516d8339815191526020526040808220815160e0810190925280545f8051602061512d83398151915293929190829060ff1660058111156106f0576106f0614848565b600581111561070157610701614848565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561077057610770614848565b1461078e5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107b38584606001515f612108565b6040518263ffffffff1660e01b81526004016107cf9190614a29565b6020604051808303815f875af11580156107eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080f9190614a5b565b50505050565b5f61082564e8d4a5100083614a72565b92915050565b5f8051602061510d8339815191525f806108448461215f565b91509150610851826123fd565b61085b5750505050565b5f82815260048085016020526040909120546001600160a01b0316908251600581111561088a5761088a614848565b036108af575f838152600785016020526040812080549190556108ad8282612438565b505b6108c5816108c08460400151610faa565b6124a5565b5050505050565b5f8181525f805160206150cd8339815191526020526040808220815160e0810190925280545f8051602061510d83398151915293929190829060ff16600381111561091957610919614848565b600381111561092a5761092a614848565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6109a0826118ef565b90506001835160038111156109b7576109b7614848565b146109d55760405163f95c7fe160e01b815260040160405180910390fd5b6004815160058111156109ea576109ea614848565b03610a00576109f885611f21565b505050505050565b5f610a0a876124c8565b90505f80610a1b83604001516125c8565b5091509150818514610a4057604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610a795750806001600160401b03168660a001516001600160401b0316115b15610a9757604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061512d8339815191529060ff1615610b7857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bbb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bdf9190614a5b565b836020013514610c025760405163d040949d60e01b815260040160405180910390fd5b30610c136060850160408601614a91565b6001600160a01b031614610c3a5760405163e6c4247b60e01b815260040160405180910390fd5b5f610c486060850185614aac565b905090505f805b828163ffffffff161015610ef4575f610c6b6060880188614aac565b8363ffffffff16818110610c8157610c81614af1565b9050602002810190610c939190614b05565b610c9c90614bb5565b80515f8181526008880160205260409020549192509015610cd057604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610cff92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610d1991614c4c565b602060405180830381855afa158015610d34573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d579190614a5b565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610de357610de3614848565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610e96911686614c5d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610eed90614c70565b9050610c4f565b50600483018190555f610f06856124c8565b90505f610f168260400151612806565b90505f610f228861297b565b905081600282604051610f359190614c4c565b602060405180830381855afa158015610f50573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f739190614a5b565b14610f9157604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6108256001600160401b03831664e8d4a51000614c92565b5f610fcd826118ef565b6080015192915050565b5f8051602061510d8339815191525f610fef85612e14565b9050610ffa856123fd565b611005575050505050565b5f8581526004830160205260409020546001600160a01b0316331461103d5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161106c91600160b01b90046001600160401b031690614ca9565b6001600160401b03168160c001516001600160401b031610156110a2576040516302336bad60e51b815260040160405180910390fd5b83156108c5575f6110b38685611acb565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061110390610faa565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611179573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119d9190614a5b565b5f878152600785016020526040812080549091906111bc908490614c5d565b9091555050505050505050565b5f8051602061510d8339815191525f6111e1836118ef565b90506004815160058111156111f8576111f8614848565b146112165760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b0316331461124e5760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461080f906001600160a01b031682612438565b61128c613051565b5f8181525f805160206150cd8339815191526020526040808220815160e0810190925280545f8051602061510d83398151915293929190829060ff1660038111156112d9576112d9614848565b60038111156112ea576112ea614848565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561136357611363614848565b146113815760405163f95c7fe160e01b815260040160405180910390fd5b600461139082604001516118ef565b5160058111156113a2576113a2614848565b14611426575f6113b1856124c8565b90505f806113c283604001516125c8565b5091509150818460400151146113eb57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561142257604051633ab3447f60e11b815260040160405180910390fd5b5050505b61142f83611f21565b505061144760015f8051602061514d83398151915255565b5050565b5f611454613051565b61145f83338461309b565b905061082560015f8051602061514d83398151915255565b5f8051602061512d8339815191525f61148f836124c8565b90505f806114a08360400151613362565b91509150806114c257604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546114dc90614cc9565b90505f036114fd57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561152357611523614848565b146115415760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061155991614668565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206150cd8339815191526020526040808220815160e0810190925280545f8051602061510d83398151915293929190829060ff16600381111561163657611636614848565b600381111561164757611647614848565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116c0576116c0614848565b141580156116e157506003815160038111156116de576116de614848565b14155b156116ff5760405163f95c7fe160e01b815260040160405180910390fd5b5f61170d82604001516118ef565b905080606001516001600160401b03165f0361173c57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611769846040015184606001518560800151612108565b6040518263ffffffff1660e01b81526004016117859190614a29565b6020604051808303815f875af11580156117a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c59190614a5b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061512d833981519152919061180c90614cc9565b90505f0361182d57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561185357611853614848565b146118715760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118aa9190600401614d01565b6020604051808303815f875af11580156118c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118ea9190614a5b565b505050565b6118f761469f565b5f8281525f8051602061516d833981519152602052604090819020815160e0810190925280545f8051602061512d833981519152929190829060ff16600581111561194457611944614848565b600581111561195557611955614848565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6119c0613051565b6119cc85858585613506565b90506119e460015f8051602061514d83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a35575080546001600160401b03808416911610155b15611a535760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a7e84846136a4565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611b16573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b3d9190810190614d96565b9150915080611b5f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ba2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bc69190614a5b565b825114611be65760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611c125760405163e6c4247b60e01b815260040160405180910390fd5b5f80611c2184604001516136be565b91509150818714611c4557604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f8051602061516d833981519152602052604081206002015481905f8051602061512d83398151915290600160801b90046001600160401b0316611c978582613899565b5f611ca187613a62565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611cf18a858b612108565b6040518263ffffffff1660e01b8152600401611d0d9190614a29565b6020604051808303815f875af1158015611d29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d4d9190614a5b565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408101515f905f8051602061510d8339815191529082611dc6826118ef565b90505f600382516005811115611dde57611dde614848565b1480611dfc5750600482516005811115611dfa57611dfa614848565b145b15611e0c575060c0810151611e29565b600282516005811115611e2157611e21614848565b036106555750425b85608001516001600160401b0316816001600160401b031611611e5157505f95945050505050565b600384015460608701516001600160a01b039091169063778c06b590611e7690610faa565b60a085015160808a01515f88815260088a01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa158015611efd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c459190614a5b565b5f8181525f805160206150cd8339815191526020526040808220815160e0810190925280545f8051602061510d83398151915293929190829060ff166003811115611f6e57611f6e614848565b6003811115611f7f57611f7f614848565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156120ad575f8481526004870160205260409020546127109061205f90600160a01b900461ffff1685614c92565b6120699190614a72565b915081866007015f8681526020019081526020015f205f82825461208d9190614c5d565b9091555061209d90508284614e68565b90506120ad856020015182612438565b6120c285602001516108c08760600151610faa565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f61216861469f565b5f8051602061512d8339815191525f612180856124c8565b90505f806121918360400151613362565b9150915080156121b457604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156121e5576121e5614848565b60058111156121f6576121f6614848565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561226557612265614848565b14158015612286575060018151600581111561228357612283614848565b14155b156122a45760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156122b9576122b9614848565b036122c757600481526122cc565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561231157612311614848565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156123c5576123c5614848565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206150ed83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612493575f80fd5b505af115801561064c573d5f803e3d5ffd5b5f805160206150ed83398151915254611447906001600160a01b03168383613ad7565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561252c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125539190810190614d96565b915091508061257557604051636b2f19e960e01b815260040160405180910390fd5b8151156125955760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156125c15760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146125ed57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561263c57612604816001614e68565b61260f906008614c92565b61ffff1686828151811061262557612625614af1565b016020015160f81c901b91909117906001016125f0565b5061ffff8116156126605760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156126bb57612677816003614e68565b612682906008614c92565b63ffffffff1687612694836002614c5d565b815181106126a4576126a4614af1565b016020015160f81c901b9190911790600101612663565b5063ffffffff81166004146126e357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612738576126fa81601f614e68565b612705906008614c92565b88612711836006614c5d565b8151811061272157612721614af1565b016020015160f81c901b91909117906001016126e6565b505f805b600881101561279757612750816007614e68565b61275b906008614c92565b6001600160401b031689612770836026614c5d565b8151811061278057612780614af1565b016020015160f81c901b919091179060010161273c565b505f805b60088110156127f6576127af816007614e68565b6127ba906008614c92565b6001600160401b03168a6127cf83602e614c5d565b815181106127df576127df614af1565b016020015160f81c901b919091179060010161279b565b5091989097509095509350505050565b5f815160261461282957604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561287857612840816001614e68565b61284b906008614c92565b61ffff1684828151811061286157612861614af1565b016020015160f81c901b919091179060010161282c565b5061ffff81161561289c5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156128f7576128b3816003614e68565b6128be906008614c92565b63ffffffff16856128d0836002614c5d565b815181106128e0576128e0614af1565b016020015160f81c901b919091179060010161289f565b5063ffffffff81161561291d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156129725761293481601f614e68565b61293f906008614c92565b8661294b836006614c5d565b8151811061295b5761295b614af1565b016020015160f81c901b9190911790600101612920565b50949350505050565b60605f61298a83830184614aac565b61299691506058614c92565b6129a190605c614c5d565b6001600160401b038111156129b8576129b8614b23565b6040519080825280601f01601f1916602001820160405280156129e2576020820181803683370190505b5090505f5b6020811015612a375783358160208110612a0357612a03614af1565b1a60f81b828281518110612a1957612a19614af1565b60200101906001600160f81b03191690815f1a9053506001016129e7565b505f5b6020811015612a975783602001358160208110612a5957612a59614af1565b1a60f81b82612a69836020614c5d565b81518110612a7957612a79614af1565b60200101906001600160f81b03191690815f1a905350600101612a3a565b505f5b6004811015612afa57612aae816003614e68565b612ab9906008614c92565b6014901c60f81b82612acc836040614c5d565b81518110612adc57612adc614af1565b60200101906001600160f81b03191690815f1a905350600101612a9a565b505f612b0c6060850160408601614a91565b60601b90505f5b6014811015612b6c57818160148110612b2e57612b2e614af1565b1a60f81b83612b3e836044614c5d565b81518110612b4e57612b4e614af1565b60200101906001600160f81b03191690815f1a905350600101612b13565b505f612b7b6060860186614aac565b905090505f5b6004811015612be657612b95816003614e68565b612ba0906008614c92565b63ffffffff8316901c60f81b84612bb8836058614c5d565b81518110612bc857612bc8614af1565b60200101906001600160f81b03191690815f1a905350600101612b81565b505f5b612bf66060870187614aac565b9050811015612e0a575f612c0b826058614c92565b612c1690605c614c5d565b90505f5b6020811015612ca157612c306060890189614aac565b84818110612c4057612c40614af1565b9050602002810190612c529190614b05565b358160208110612c6457612c64614af1565b1a60f81b86612c738385614c5d565b81518110612c8357612c83614af1565b60200101906001600160f81b03191690815f1a905350600101612c1a565b505f5b6008811015612d5657612cb8816007614e68565b612cc3906008614c92565b612cd060608a018a614aac565b85818110612ce057612ce0614af1565b9050602002810190612cf29190614b05565b612d0390604081019060200161480f565b6001600160401b0316901c60f81b8682612d1e856020614c5d565b612d289190614c5d565b81518110612d3857612d38614af1565b60200101906001600160f81b03191690815f1a905350600101612ca4565b505f5b6030811015612e0057612d6f6060890189614aac565b84818110612d7f57612d7f614af1565b9050602002810190612d919190614b05565b612d9f906040810190614e7b565b82818110612daf57612daf614af1565b9050013560f81c60f81b8682846028612dc89190614c5d565b612dd29190614c5d565b81518110612de257612de2614af1565b60200101906001600160f81b03191690815f1a905350600101612d59565b5050600101612be9565b5091949350505050565b612e1c61469f565b5f8281525f8051602061516d8339815191526020526040808220815160e0810190925280545f8051602061512d83398151915293929190829060ff166005811115612e6957612e69614848565b6005811115612e7a57612e7a614848565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612eec57612eec614848565b14612f0a5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612f4e57612f4e614848565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f612ffa8582611c4f565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061514d83398151915280546001190161308257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061514d83398151915255565b5f5f8051602061510d833981519152816130b76101fa85613b36565b90505f6130c3876118ef565b90506130ce876123fd565b6130eb57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561310057613100614848565b1461311e5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161312f9190614ca9565b905083600201600a9054906101000a90046001600160401b031682604001516131589190614ebd565b6001600160401b0316816001600160401b0316111561318a57604051630c192e7760e41b815260040160405180910390fd5b5f806131968a84611c4f565b915091505f8a836040516020016131c492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561325757613257614848565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461338657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133d55761339d816001614e68565b6133a8906008614c92565b61ffff168582815181106133be576133be614af1565b016020015160f81c901b9190911790600101613389565b5061ffff8116156133f95760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561345457613410816003614e68565b61341b906008614c92565b63ffffffff168661342d836002614c5d565b8151811061343d5761343d614af1565b016020015160f81c901b91909117906001016133fc565b5063ffffffff811660031461347c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134d15761349381601f614e68565b61349e906008614c92565b876134aa836006614c5d565b815181106134ba576134ba614af1565b016020015160f81c901b919091179060010161347f565b505f866026815181106134e6576134e6614af1565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061510d83398151915290600160401b900461ffff908116908616108061355a575061271061ffff8616115b156135785760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156135aa576040516302336bad60e51b815260040160405180910390fd5b80548310806135bc5750806001015483115b156135da57604051630103be3b60e21b815260040160405180910390fd5b5f6135e484613b36565b90505f6135f082610815565b90505f6135fd8983613b59565b905060405180606001604052806136113390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6136ac613f43565b6136b582613f8e565b61144781613fff565b5f808251602e146136e257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613731576136f9816001614e68565b613704906008614c92565b61ffff1685828151811061371a5761371a614af1565b016020015160f81c901b91909117906001016136e5565b5061ffff8116156137555760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137b05761376c816003614e68565b613777906008614c92565b63ffffffff1686613789836002614c5d565b8151811061379957613799614af1565b016020015160f81c901b9190911790600101613758565b5063ffffffff81166005146137d857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561382d576137ef81601f614e68565b6137fa906008614c92565b87613806836006614c5d565b8151811061381657613816614af1565b016020015160f81c901b91909117906001016137db565b505f805b600881101561388c57613845816007614e68565b613850906008614c92565b6001600160401b031688613865836026614c5d565b8151811061387557613875614af1565b016020015160f81c901b9190911790600101613831565b5090969095509350505050565b5f8051602061512d8339815191525f6001600160401b0380841690851611156138cd576138c683856149e7565b90506138da565b6138d784846149e7565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061393c575060018401548151613938916001600160401b031690614c5d565b8210155b15613962576001600160401b038316606082015281815260408101516020820152613981565b82816060018181516139749190614ca9565b6001600160401b03169052505b6060810151613991906064614ebd565b602082015160018601546001600160401b0392909216916139bc9190600160401b900460ff16614c92565b10156139db5760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516139f69190614c5d565b9052506040810180516001600160401b0387169190613a16908390614e68565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061516d8339815191526020526040812060020180545f8051602061512d8339815191529190600890613aac90600160401b90046001600160401b0316614ee8565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b038381166024830152604482018390526118ea91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061405c565b5f610825825f805160206150ed833981519152546001600160a01b0316906140c2565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613b9d57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061512d83398151915242613bbc604086016020870161480f565b6001600160401b0316111580613bf65750613bda6202a30042614c5d565b613bea604086016020870161480f565b6001600160401b031610155b15613c135760405162d36c8560e81b815260040160405180910390fd5b6030613c226040860186614e7b565b9050141580613c3057508335155b15613c4e5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613c7e57604051630eb0d31360e11b815260040160405180910390fd5b613c88835f613899565b5f80613d216040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ccc919061480f565b6001600160401b03168152602001613ce760408a018a614e7b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614224565b5f82815260068601602052604090209193509150613d3f8282614f47565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613d7d908590600401614a29565b6020604051808303815f875af1158015613d99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dbd9190614a5b565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e3557613e35614848565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f15918e01908e0161480f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f8c57604051631afcd79f60e31b815260040160405180910390fd5b565b613f96613f43565b613f9f816142e7565b613fa7614300565b613ffc60608201356080830135613fc460c0850160a0860161480f565b613fd460e0860160c08701615002565b613fe5610100870160e0880161501b565b613ff761012088016101008901614a91565b614310565b50565b614007613f43565b5f805160206150ed8339815191526001600160a01b03821661403c5760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6140706001600160a01b03841683614431565b905080515f14158015614094575080806020019051810190614092919061503b565b155b156118ea57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614108573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061412c9190614a5b565b90506141436001600160a01b03851633308661443e565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614187573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141ab9190614a5b565b90508181116142115760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016140b9565b61421b8282614e68565b95945050505050565b5f606082608001515160301461424d57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161427f9796959493929190615056565b60405160208183030381529060405290506002816040516142a09190614c4c565b602060405180830381855afa1580156142bb573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142de9190614a5b565b94909350915050565b6142ef613f43565b6142f7614477565b613ffc8161447f565b614308613f43565b613f8c614551565b614318613f43565b5f8051602061510d83398151915261ffff8416158061433c575061271061ffff8516115b1561435a5760405163c98d73a760e01b815260040160405180910390fd5b8587111561437b57604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061438e5750600a60ff8416115b156143ac576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061215883835f614559565b6040516001600160a01b03848116602483015283811660448301526064820183905261080f9186918216906323b872dd90608401613b04565b613f8c613f43565b614487613f43565b80355f8051602061512d83398151915290815560146144ac606084016040850161501b565b60ff1611806144cb57506144c6606083016040840161501b565b60ff16155b156144e95760405163b4fa3fb360e01b815260040160405180910390fd5b6144f9606083016040840161501b565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561452a604083016020840161480f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613088613f43565b60608147101561457e5760405163cd78605960e01b81523060048201526024016140b9565b5f80856001600160a01b031684866040516145999190614c4c565b5f6040518083038185875af1925050503d805f81146145d3576040519150601f19603f3d011682016040523d82523d5f602084013e6145d8565b606091505b5091509150611c458683836060826145f8576145f38261463f565b612158565b815115801561460f57506001600160a01b0384163b155b1561463857604051639996b31560e01b81526001600160a01b03851660048201526024016140b9565b5080612158565b80511561464f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461467490614cc9565b5f825580601f10614683575050565b601f0160209004905f5260205f2090810190613ffc91906146db565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156146ef575f81556001016146dc565b5090565b8015158114613ffc575f80fd5b803563ffffffff81168114614713575f80fd5b919050565b5f805f6060848603121561472a575f80fd5b83359250602084013561473c816146f3565b915061474a60408501614700565b90509250925092565b5f60208284031215614763575f80fd5b5035919050565b5f6020828403121561477a575f80fd5b61215882614700565b5f8060408385031215614794575f80fd5b61479d83614700565b946020939093013593505050565b5f80604083850312156147bc575f80fd5b82356001600160401b038111156147d1575f80fd5b8301608081860312156147e2575f80fd5b91506147f060208401614700565b90509250929050565b80356001600160401b0381168114614713575f80fd5b5f6020828403121561481f575f80fd5b612158826147f9565b5f8060408385031215614839575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061487f57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516148ba60608401826001600160401b03169052565b5060808301516148d560808401826001600160401b03169052565b5060a08301516148f060a08401826001600160401b03169052565b5060c08301516125c160c08401826001600160401b03169052565b803561ffff81168114614713575f80fd5b5f805f806080858703121561492f575f80fd5b84356001600160401b03811115614944575f80fd5b850160608188031215614955575f80fd5b93506149636020860161490b565b9250614971604086016147f9565b9396929550929360600135925050565b6001600160a01b0381168114613ffc575f80fd5b5f808284036101408112156149a8575f80fd5b610120808212156149b7575f80fd5b84935083013590506149c881614981565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156125c1576125c16149d3565b5f5b83811015614a21578181015183820152602001614a09565b50505f910152565b602081525f8251806020840152614a47816040850160208701614a07565b601f01601f19169190910160400192915050565b5f60208284031215614a6b575f80fd5b5051919050565b5f82614a8c57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614aa1575f80fd5b813561215881614981565b5f808335601e19843603018112614ac1575f80fd5b8301803591506001600160401b03821115614ada575f80fd5b6020019150600581901b3603821315611d9f575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614b19575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b5957614b59614b23565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b8757614b87614b23565b604052919050565b5f6001600160401b03821115614ba757614ba7614b23565b50601f01601f191660200190565b5f60608236031215614bc5575f80fd5b614bcd614b37565b823581526020614bde8185016147f9565b8183015260408401356001600160401b03811115614bfa575f80fd5b840136601f820112614c0a575f80fd5b8035614c1d614c1882614b8f565b614b5f565b8181523684838501011115614c30575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614b19818460208701614a07565b80820180821115610825576108256149d3565b5f63ffffffff808316818103614c8857614c886149d3565b6001019392505050565b8082028115828204841417610825576108256149d3565b6001600160401b038181168382160190808211156125c1576125c16149d3565b600181811c90821680614cdd57607f821691505b602082108103614cfb57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614d1381614cc9565b806020870152604060018084165f8114614d345760018114614d5057614d7d565b60ff19851660408a0152604084151560051b8a01019550614d7d565b895f5260205f205f5b85811015614d745781548b8201860152908301908801614d59565b8a016040019650505b509398975050505050505050565b8051614713816146f3565b5f8060408385031215614da7575f80fd5b82516001600160401b0380821115614dbd575f80fd5b9084019060608287031215614dd0575f80fd5b614dd8614b37565b82518152602080840151614deb81614981565b82820152604084015183811115614e00575f80fd5b80850194505087601f850112614e14575f80fd5b83519250614e24614c1884614b8f565b8381528882858701011115614e37575f80fd5b614e4684838301848801614a07565b80604084015250819550614e5b818801614d8b565b9450505050509250929050565b81810381811115610825576108256149d3565b5f808335601e19843603018112614e90575f80fd5b8301803591506001600160401b03821115614ea9575f80fd5b602001915036819003821315611d9f575f80fd5b6001600160401b03818116838216028082169190828114614ee057614ee06149d3565b505092915050565b5f6001600160401b03808316818103614c8857614c886149d3565b601f8211156118ea57805f5260205f20601f840160051c81016020851015614f285750805b601f840160051c820191505b818110156108c5575f8155600101614f34565b81516001600160401b03811115614f6057614f60614b23565b614f7481614f6e8454614cc9565b84614f03565b602080601f831160018114614fa7575f8415614f905750858301515b5f19600386901b1c1916600185901b1785556109f8565b5f85815260208120601f198616915b82811015614fd557888601518255948401946001909101908401614fb6565b5085821015614ff257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215615012575f80fd5b6121588261490b565b5f6020828403121561502b575f80fd5b813560ff81168114612158575f80fd5b5f6020828403121561504b575f80fd5b8151612158816146f3565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516150ab81604e860160208901614a07565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516152f63803806152f683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6151a98061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101a1575f3560e01c80638280a25a116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de1461039f578063e7d14c1c146103a9578063eb0acb89146103e7578063f09969ae146103fa575f80fd5b8063bee0a03f14610364578063c974d1b614610377578063d5f20ff61461037f575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610305578063a3a65e4814610318578063b771b3bc1461032b578063ba3a4b9714610351575f80fd5b80638280a25a146102d757806393e24598146102df57806398f3e2b4146102f2575f80fd5b80635297fae61161015e5780636206585611610139578063620658561461028957806366435abf146102aa578063732214f8146102bd57806376f78621146102c4575f80fd5b80635297fae61461024657806360305d621461025957806361e2f49014610276575f80fd5b80630118acc4146101a55780630322ed98146101ba578063151d30d1146101cd5780632e2194d8146101ec57806335455ded14610217578063467ef06f14610233575b5f80fd5b6101b86101b3366004614728565b61040d565b005b6101b86101c8366004614763565b6106be565b6101d5600a81565b60405160ff90911681526020015b60405180910390f35b6101ff6101fa366004614763565b610830565b6040516001600160401b0390911681526020016101e3565b61022061271081565b60405161ffff90911681526020016101e3565b6101b861024136600461477a565b610846565b6101b8610254366004614793565b6108e7565b610261601481565b60405163ffffffff90911681526020016101e3565b6101b86102843660046147bb565b610b41565b61029c61029736600461481f565b610fc5565b6040519081526020016101e3565b6101ff6102b8366004614763565b610fde565b61029c5f81565b6101b86102d2366004614728565b610ff2565b6101d5603081565b6101b86102ed366004614763565b6111e4565b6101b8610300366004614793565b61129f565b61029c610313366004614838565b611466565b6101b861032636600461477a565b611492565b6103396005600160991b0181565b6040516001600160a01b0390911681526020016101e3565b6101b861035f366004614763565b611604565b6101b8610372366004614763565b6117e0565b6101d5601481565b61039261038d366004614763565b61190a565b6040516101e3919061486c565b6101ff6202a30081565b61029c6103b7366004614763565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61029c6103f536600461492c565b6119d2565b6101b86104083660046149a5565b611a07565b5f8381525f805160206150dd8339815191526020526040808220815160e0810190925280545f8051602061511d83398151915293929190829060ff16600381111561045a5761045a614858565b600381111561046b5761046b614858565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6104e18261190a565b90506002835160038111156104f8576104f8614858565b146105165760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105435760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff19166003179055815160029181111561057357610573614858565b0361062a5785156105b7576105888286611ae6565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b6105d482846060015183608001516105cf91906149f7565b611c6a565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b039092169190911790556106158382611dc1565b5f888152600686016020526040902055610689565b60048151600581111561063f5761063f614858565b036106705761064e8382611dc1565b5f88815260068601602052604090205561066787611f3a565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f8051602061517d8339815191526020526040808220815160e0810190925280545f8051602061513d83398151915293929190829060ff16600581111561070b5761070b614858565b600581111561071c5761071c614858565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561078b5761078b614858565b146107a95760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107ce8584606001515f612121565b6040518263ffffffff1660e01b81526004016107ea9190614a39565b6020604051808303815f875af1158015610806573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061082a9190614a6b565b50505050565b5f61084064e8d4a5100083614a82565b92915050565b5f8051602061511d8339815191525f8061085f84612178565b9150915061086c82612416565b6108765750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156108a5576108a5614858565b036108ca575f838152600785016020526040812080549190556108c88282612451565b505b6108e0816108db8460400151610fc5565b6124be565b5050505050565b5f8181525f805160206150dd8339815191526020526040808220815160e0810190925280545f8051602061511d83398151915293929190829060ff16600381111561093457610934614858565b600381111561094557610945614858565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6109bb8261190a565b90506001835160038111156109d2576109d2614858565b146109f05760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610a0557610a05614858565b03610a1b57610a1385611f3a565b505050505050565b5f610a25876124e1565b90505f80610a3683604001516125e1565b5091509150818514610a5b57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610a945750806001600160401b03168660a001516001600160401b0316115b15610ab257604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061513d8339815191529060ff1615610b9357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bfa9190614a6b565b836020013514610c1d5760405163d040949d60e01b815260040160405180910390fd5b30610c2e6060850160408601614aa1565b6001600160a01b031614610c555760405163e6c4247b60e01b815260040160405180910390fd5b5f610c636060850185614abc565b905090505f805b828163ffffffff161015610f0f575f610c866060880188614abc565b8363ffffffff16818110610c9c57610c9c614b01565b9050602002810190610cae9190614b15565b610cb790614bc5565b80515f8181526008880160205260409020549192509015610ceb57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610d1a92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610d3491614c5c565b602060405180830381855afa158015610d4f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d729190614a6b565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610dfe57610dfe614858565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610eb1911686614c6d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610f0890614c80565b9050610c6a565b50600483018190555f610f21856124e1565b90505f610f31826040015161281f565b90505f610f3d88612994565b905081600282604051610f509190614c5c565b602060405180830381855afa158015610f6b573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f8e9190614a6b565b14610fac57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6108406001600160401b03831664e8d4a51000614ca2565b5f610fe88261190a565b6080015192915050565b5f8051602061511d8339815191525f61100a85612e2d565b905061101585612416565b611020575050505050565b5f8581526004830160205260409020546001600160a01b031633146110585760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161108791600160b01b90046001600160401b031690614cb9565b6001600160401b03168160c001516001600160401b031610156110bd576040516302336bad60e51b815260040160405180910390fd5b83156108e0575f6110ce8685611ae6565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b59061111e90610fc5565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611194573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111b89190614a6b565b5f878152600785016020526040812080549091906111d7908490614c6d565b9091555050505050505050565b5f8051602061511d8339815191525f6111fc8361190a565b905060048151600581111561121357611213614858565b146112315760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146112695760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461082a906001600160a01b031682612451565b6112a761306a565b5f8181525f805160206150dd8339815191526020526040808220815160e0810190925280545f8051602061511d83398151915293929190829060ff1660038111156112f4576112f4614858565b600381111561130557611305614858565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561137e5761137e614858565b1461139c5760405163f95c7fe160e01b815260040160405180910390fd5b60046113ab826040015161190a565b5160058111156113bd576113bd614858565b14611441575f6113cc856124e1565b90505f806113dd83604001516125e1565b50915091508184604001511461140657604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561143d57604051633ab3447f60e11b815260040160405180910390fd5b5050505b61144a83611f3a565b505061146260015f8051602061515d83398151915255565b5050565b5f61146f61306a565b61147a8333846130b4565b905061084060015f8051602061515d83398151915255565b5f8051602061513d8339815191525f6114aa836124e1565b90505f806114bb836040015161337b565b91509150806114dd57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546114f790614cd9565b90505f0361151857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561153e5761153e614858565b1461155c5760405163a36c527f60e01b815260040160405180910390fd5b5f828152600685016020526040812061157491614678565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206150dd8339815191526020526040808220815160e0810190925280545f8051602061511d83398151915293929190829060ff16600381111561165157611651614858565b600381111561166257611662614858565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116db576116db614858565b141580156116fc57506003815160038111156116f9576116f9614858565b14155b1561171a5760405163f95c7fe160e01b815260040160405180910390fd5b5f611728826040015161190a565b905080606001516001600160401b03165f0361175757604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611784846040015184606001518560800151612121565b6040518263ffffffff1660e01b81526004016117a09190614a39565b6020604051808303815f875af11580156117bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108e09190614a6b565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061513d833981519152919061182790614cd9565b90505f0361184857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561186e5761186e614858565b1461188c5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118c59190600401614d11565b6020604051808303815f875af11580156118e1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119059190614a6b565b505050565b6119126146af565b5f8281525f8051602061517d833981519152602052604090819020815160e0810190925280545f8051602061513d833981519152929190829060ff16600581111561195f5761195f614858565b600581111561197057611970614858565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6119db61306a565b6119e78585858561351f565b90506119ff60015f8051602061515d83398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611a50575080546001600160401b03808416911610155b15611a6e5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611a9984846136bd565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611b31573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b589190810190614da6565b9150915080611b7a57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bbd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611be19190614a6b565b825114611c015760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611c2d5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611c3c84604001516136d7565b91509150818714611c6057604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f8051602061517d833981519152602052604081206002015481905f8051602061513d83398151915290600160801b90046001600160401b0316611cb285826138b2565b5f611cbc87613a7b565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611d0c8a858b612121565b6040518263ffffffff1660e01b8152600401611d289190614a39565b6020604051808303815f875af1158015611d44573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d689190614a6b565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f8051602061511d83398151915290505f600384516005811115611de957611de9614858565b1480611e075750600484516005811115611e0557611e05614858565b145b15611e17575060c0830151611e34565b600284516005811115611e2c57611e2c614858565b036106705750425b84608001516001600160401b0316816001600160401b031611611e5b575f92505050610840565b600382015460608601516001600160a01b039091169063778c06b590611e8090610fc5565b60a087015160808901516040808b01515f9081526008890160205281812054915160e087901b6001600160e01b031916815260048101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015611f0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f319190614a6b565b95945050505050565b5f8181525f805160206150dd8339815191526020526040808220815160e0810190925280545f8051602061511d83398151915293929190829060ff166003811115611f8757611f87614858565b6003811115611f9857611f98614858565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156120c6575f8481526004870160205260409020546127109061207890600160a01b900461ffff1685614ca2565b6120829190614a82565b915081866007015f8681526020019081526020015f205f8282546120a69190614c6d565b909155506120b690508284614e78565b90506120c6856020015182612451565b6120db85602001516108db8760600151610fc5565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6121816146af565b5f8051602061513d8339815191525f612199856124e1565b90505f806121aa836040015161337b565b9150915080156121cd57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156121fe576121fe614858565b600581111561220f5761220f614858565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561227e5761227e614858565b1415801561229f575060018151600581111561229c5761229c614858565b14155b156122bd5760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156122d2576122d2614858565b036122e057600481526122e5565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561232a5761232a614858565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156123de576123de614858565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206150fd83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156124ac575f80fd5b505af1158015610667573d5f803e3d5ffd5b5f805160206150fd83398151915254611462906001600160a01b03168383613af0565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612545573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261256c9190810190614da6565b915091508061258e57604051636b2f19e960e01b815260040160405180910390fd5b8151156125ae5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156125da5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461260657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156126555761261d816001614e78565b612628906008614ca2565b61ffff1686828151811061263e5761263e614b01565b016020015160f81c901b9190911790600101612609565b5061ffff8116156126795760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156126d457612690816003614e78565b61269b906008614ca2565b63ffffffff16876126ad836002614c6d565b815181106126bd576126bd614b01565b016020015160f81c901b919091179060010161267c565b5063ffffffff81166004146126fc57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156127515761271381601f614e78565b61271e906008614ca2565b8861272a836006614c6d565b8151811061273a5761273a614b01565b016020015160f81c901b91909117906001016126ff565b505f805b60088110156127b057612769816007614e78565b612774906008614ca2565b6001600160401b031689612789836026614c6d565b8151811061279957612799614b01565b016020015160f81c901b9190911790600101612755565b505f805b600881101561280f576127c8816007614e78565b6127d3906008614ca2565b6001600160401b03168a6127e883602e614c6d565b815181106127f8576127f8614b01565b016020015160f81c901b91909117906001016127b4565b5091989097509095509350505050565b5f815160261461284257604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561289157612859816001614e78565b612864906008614ca2565b61ffff1684828151811061287a5761287a614b01565b016020015160f81c901b9190911790600101612845565b5061ffff8116156128b55760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612910576128cc816003614e78565b6128d7906008614ca2565b63ffffffff16856128e9836002614c6d565b815181106128f9576128f9614b01565b016020015160f81c901b91909117906001016128b8565b5063ffffffff81161561293657604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561298b5761294d81601f614e78565b612958906008614ca2565b86612964836006614c6d565b8151811061297457612974614b01565b016020015160f81c901b9190911790600101612939565b50949350505050565b60605f6129a383830184614abc565b6129af91506058614ca2565b6129ba90605c614c6d565b6001600160401b038111156129d1576129d1614b33565b6040519080825280601f01601f1916602001820160405280156129fb576020820181803683370190505b5090505f5b6020811015612a505783358160208110612a1c57612a1c614b01565b1a60f81b828281518110612a3257612a32614b01565b60200101906001600160f81b03191690815f1a905350600101612a00565b505f5b6020811015612ab05783602001358160208110612a7257612a72614b01565b1a60f81b82612a82836020614c6d565b81518110612a9257612a92614b01565b60200101906001600160f81b03191690815f1a905350600101612a53565b505f5b6004811015612b1357612ac7816003614e78565b612ad2906008614ca2565b6014901c60f81b82612ae5836040614c6d565b81518110612af557612af5614b01565b60200101906001600160f81b03191690815f1a905350600101612ab3565b505f612b256060850160408601614aa1565b60601b90505f5b6014811015612b8557818160148110612b4757612b47614b01565b1a60f81b83612b57836044614c6d565b81518110612b6757612b67614b01565b60200101906001600160f81b03191690815f1a905350600101612b2c565b505f612b946060860186614abc565b905090505f5b6004811015612bff57612bae816003614e78565b612bb9906008614ca2565b63ffffffff8316901c60f81b84612bd1836058614c6d565b81518110612be157612be1614b01565b60200101906001600160f81b03191690815f1a905350600101612b9a565b505f5b612c0f6060870187614abc565b9050811015612e23575f612c24826058614ca2565b612c2f90605c614c6d565b90505f5b6020811015612cba57612c496060890189614abc565b84818110612c5957612c59614b01565b9050602002810190612c6b9190614b15565b358160208110612c7d57612c7d614b01565b1a60f81b86612c8c8385614c6d565b81518110612c9c57612c9c614b01565b60200101906001600160f81b03191690815f1a905350600101612c33565b505f5b6008811015612d6f57612cd1816007614e78565b612cdc906008614ca2565b612ce960608a018a614abc565b85818110612cf957612cf9614b01565b9050602002810190612d0b9190614b15565b612d1c90604081019060200161481f565b6001600160401b0316901c60f81b8682612d37856020614c6d565b612d419190614c6d565b81518110612d5157612d51614b01565b60200101906001600160f81b03191690815f1a905350600101612cbd565b505f5b6030811015612e1957612d886060890189614abc565b84818110612d9857612d98614b01565b9050602002810190612daa9190614b15565b612db8906040810190614e8b565b82818110612dc857612dc8614b01565b9050013560f81c60f81b8682846028612de19190614c6d565b612deb9190614c6d565b81518110612dfb57612dfb614b01565b60200101906001600160f81b03191690815f1a905350600101612d72565b5050600101612c02565b5091949350505050565b612e356146af565b5f8281525f8051602061517d8339815191526020526040808220815160e0810190925280545f8051602061513d83398151915293929190829060ff166005811115612e8257612e82614858565b6005811115612e9357612e93614858565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612f0557612f05614858565b14612f235760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612f6757612f67614858565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130138582611c6a565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8051602061515d83398151915280546001190161309b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061515d83398151915255565b5f5f8051602061511d833981519152816130d06101fa85613b4f565b90505f6130dc8761190a565b90506130e787612416565b61310457604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561311957613119614858565b146131375760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516131489190614cb9565b905083600201600a9054906101000a90046001600160401b031682604001516131719190614ecd565b6001600160401b0316816001600160401b031611156131a357604051630c192e7760e41b815260040160405180910390fd5b5f806131af8a84611c6a565b915091505f8a836040516020016131dd92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561327057613270614858565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461339f57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133ee576133b6816001614e78565b6133c1906008614ca2565b61ffff168582815181106133d7576133d7614b01565b016020015160f81c901b91909117906001016133a2565b5061ffff8116156134125760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561346d57613429816003614e78565b613434906008614ca2565b63ffffffff1686613446836002614c6d565b8151811061345657613456614b01565b016020015160f81c901b9190911790600101613415565b5063ffffffff811660031461349557604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134ea576134ac81601f614e78565b6134b7906008614ca2565b876134c3836006614c6d565b815181106134d3576134d3614b01565b016020015160f81c901b9190911790600101613498565b505f866026815181106134ff576134ff614b01565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061511d83398151915290600160401b900461ffff9081169086161080613573575061271061ffff8616115b156135915760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156135c3576040516302336bad60e51b815260040160405180910390fd5b80548310806135d55750806001015483115b156135f357604051630103be3b60e21b815260040160405180910390fd5b5f6135fd84613b4f565b90505f61360982610830565b90505f6136168983613b72565b9050604051806060016040528061362a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b6136c5613f5c565b6136ce82613fa7565b61146281614018565b5f808251602e146136fb57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561374a57613712816001614e78565b61371d906008614ca2565b61ffff1685828151811061373357613733614b01565b016020015160f81c901b91909117906001016136fe565b5061ffff81161561376e5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137c957613785816003614e78565b613790906008614ca2565b63ffffffff16866137a2836002614c6d565b815181106137b2576137b2614b01565b016020015160f81c901b9190911790600101613771565b5063ffffffff81166005146137f157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138465761380881601f614e78565b613813906008614ca2565b8761381f836006614c6d565b8151811061382f5761382f614b01565b016020015160f81c901b91909117906001016137f4565b505f805b60088110156138a55761385e816007614e78565b613869906008614ca2565b6001600160401b03168861387e836026614c6d565b8151811061388e5761388e614b01565b016020015160f81c901b919091179060010161384a565b5090969095509350505050565b5f8051602061513d8339815191525f6001600160401b0380841690851611156138e6576138df83856149f7565b90506138f3565b6138f084846149f7565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613955575060018401548151613951916001600160401b031690614c6d565b8210155b1561397b576001600160401b03831660608201528181526040810151602082015261399a565b828160600181815161398d9190614cb9565b6001600160401b03169052505b60608101516139aa906064614ecd565b602082015160018601546001600160401b0392909216916139d59190600160401b900460ff16614ca2565b10156139f45760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613a0f9190614c6d565b9052506040810180516001600160401b0387169190613a2f908390614e78565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061517d8339815191526020526040812060020180545f8051602061513d8339815191529190600890613ac590600160401b90046001600160401b0316614ef8565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b0383811660248301526044820183905261190591859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614075565b5f610840825f805160206150fd833981519152546001600160a01b0316906140db565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613bb657604051637fab81e560e01b815260040160405180910390fd5b5f8051602061513d83398151915242613bd5604086016020870161481f565b6001600160401b0316111580613c0f5750613bf36202a30042614c6d565b613c03604086016020870161481f565b6001600160401b031610155b15613c2c5760405162d36c8560e81b815260040160405180910390fd5b6030613c3b6040860186614e8b565b9050141580613c4957508335155b15613c675760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613c9757604051630eb0d31360e11b815260040160405180910390fd5b613ca1835f6138b2565b5f80613d3a6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ce5919061481f565b6001600160401b03168152602001613d0060408a018a614e8b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614234565b5f82815260068601602052604090209193509150613d588282614f57565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613d96908590600401614a39565b6020604051808303815f875af1158015613db2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dd69190614a6b565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e4e57613e4e614858565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f2e918e01908e0161481f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613fa557604051631afcd79f60e31b815260040160405180910390fd5b565b613faf613f5c565b613fb8816142f7565b613fc0614310565b61401560608201356080830135613fdd60c0850160a0860161481f565b613fed60e0860160c08701615012565b613ffe610100870160e0880161502b565b61401061012088016101008901614aa1565b614320565b50565b614020613f5c565b5f805160206150fd8339815191526001600160a01b0382166140555760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6140896001600160a01b03841683614441565b905080515f141580156140ad5750808060200190518101906140ab919061504b565b155b1561190557604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614121573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141459190614a6b565b905061415c6001600160a01b03851633308661444e565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156141a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141c49190614a6b565b905081811161422a5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016140d2565b611f318282614e78565b5f606082608001515160301461425d57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161428f9796959493929190615066565b60405160208183030381529060405290506002816040516142b09190614c5c565b602060405180830381855afa1580156142cb573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906142ee9190614a6b565b94909350915050565b6142ff613f5c565b614307614487565b6140158161448f565b614318613f5c565b613fa5614561565b614328613f5c565b5f8051602061511d83398151915261ffff8416158061434c575061271061ffff8516115b1561436a5760405163c98d73a760e01b815260040160405180910390fd5b8587111561438b57604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061439e5750600a60ff8416115b156143bc576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061217183835f614569565b6040516001600160a01b03848116602483015283811660448301526064820183905261082a9186918216906323b872dd90608401613b1d565b613fa5613f5c565b614497613f5c565b80355f8051602061513d83398151915290815560146144bc606084016040850161502b565b60ff1611806144db57506144d6606083016040840161502b565b60ff16155b156144f95760405163b4fa3fb360e01b815260040160405180910390fd5b614509606083016040840161502b565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561453a604083016020840161481f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6130a1613f5c565b60608147101561458e5760405163cd78605960e01b81523060048201526024016140d2565b5f80856001600160a01b031684866040516145a99190614c5c565b5f6040518083038185875af1925050503d805f81146145e3576040519150601f19603f3d011682016040523d82523d5f602084013e6145e8565b606091505b5091509150611c60868383606082614608576146038261464f565b612171565b815115801561461f57506001600160a01b0384163b155b1561464857604051639996b31560e01b81526001600160a01b03851660048201526024016140d2565b5080612171565b80511561465f5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461468490614cd9565b5f825580601f10614693575050565b601f0160209004905f5260205f209081019061401591906146eb565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156146ff575f81556001016146ec565b5090565b8015158114614015575f80fd5b803563ffffffff81168114614723575f80fd5b919050565b5f805f6060848603121561473a575f80fd5b83359250602084013561474c81614703565b915061475a60408501614710565b90509250925092565b5f60208284031215614773575f80fd5b5035919050565b5f6020828403121561478a575f80fd5b61217182614710565b5f80604083850312156147a4575f80fd5b6147ad83614710565b946020939093013593505050565b5f80604083850312156147cc575f80fd5b82356001600160401b038111156147e1575f80fd5b8301608081860312156147f2575f80fd5b915061480060208401614710565b90509250929050565b80356001600160401b0381168114614723575f80fd5b5f6020828403121561482f575f80fd5b61217182614809565b5f8060408385031215614849575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061488f57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516148ca60608401826001600160401b03169052565b5060808301516148e560808401826001600160401b03169052565b5060a083015161490060a08401826001600160401b03169052565b5060c08301516125da60c08401826001600160401b03169052565b803561ffff81168114614723575f80fd5b5f805f806080858703121561493f575f80fd5b84356001600160401b03811115614954575f80fd5b850160608188031215614965575f80fd5b93506149736020860161491b565b925061498160408601614809565b9396929550929360600135925050565b6001600160a01b0381168114614015575f80fd5b5f808284036101408112156149b8575f80fd5b610120808212156149c7575f80fd5b84935083013590506149d881614991565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156125da576125da6149e3565b5f5b83811015614a31578181015183820152602001614a19565b50505f910152565b602081525f8251806020840152614a57816040850160208701614a17565b601f01601f19169190910160400192915050565b5f60208284031215614a7b575f80fd5b5051919050565b5f82614a9c57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614ab1575f80fd5b813561217181614991565b5f808335601e19843603018112614ad1575f80fd5b8301803591506001600160401b03821115614aea575f80fd5b6020019150600581901b3603821315611dba575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614b29575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614b6957614b69614b33565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614b9757614b97614b33565b604052919050565b5f6001600160401b03821115614bb757614bb7614b33565b50601f01601f191660200190565b5f60608236031215614bd5575f80fd5b614bdd614b47565b823581526020614bee818501614809565b8183015260408401356001600160401b03811115614c0a575f80fd5b840136601f820112614c1a575f80fd5b8035614c2d614c2882614b9f565b614b6f565b8181523684838501011115614c40575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614b29818460208701614a17565b80820180821115610840576108406149e3565b5f63ffffffff808316818103614c9857614c986149e3565b6001019392505050565b8082028115828204841417610840576108406149e3565b6001600160401b038181168382160190808211156125da576125da6149e3565b600181811c90821680614ced57607f821691505b602082108103614d0b57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614d2381614cd9565b806020870152604060018084165f8114614d445760018114614d6057614d8d565b60ff19851660408a0152604084151560051b8a01019550614d8d565b895f5260205f205f5b85811015614d845781548b8201860152908301908801614d69565b8a016040019650505b509398975050505050505050565b805161472381614703565b5f8060408385031215614db7575f80fd5b82516001600160401b0380821115614dcd575f80fd5b9084019060608287031215614de0575f80fd5b614de8614b47565b82518152602080840151614dfb81614991565b82820152604084015183811115614e10575f80fd5b80850194505087601f850112614e24575f80fd5b83519250614e34614c2884614b9f565b8381528882858701011115614e47575f80fd5b614e5684838301848801614a17565b80604084015250819550614e6b818801614d9b565b9450505050509250929050565b81810381811115610840576108406149e3565b5f808335601e19843603018112614ea0575f80fd5b8301803591506001600160401b03821115614eb9575f80fd5b602001915036819003821315611dba575f80fd5b6001600160401b03818116838216028082169190828114614ef057614ef06149e3565b505092915050565b5f6001600160401b03808316818103614c9857614c986149e3565b601f82111561190557805f5260205f20601f840160051c81016020851015614f385750805b601f840160051c820191505b818110156108e0575f8155600101614f44565b81516001600160401b03811115614f7057614f70614b33565b614f8481614f7e8454614cd9565b84614f13565b602080601f831160018114614fb7575f8415614fa05750858301515b5f19600386901b1c1916600185901b178555610a13565b5f85815260208120601f198616915b82811015614fe557888601518255948401946001909101908401614fc6565b508582101561500257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215615022575f80fd5b6121718261491b565b5f6020828403121561503b575f80fd5b813560ff81168114612171575f80fd5b5f6020828403121561505b575f80fd5b815161217181614703565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516150bb81604e860160208901614a17565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 f283af7f9..b48a3d5ea 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"getValidator\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[{\"name\":\"\",\"type\":\"tuple\",\"internalType\":\"structValidator\",\"components\":[{\"name\":\"status\",\"type\":\"uint8\",\"internalType\":\"enumValidatorStatus\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051614ffb380380614ffb83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614eae8061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd3660046144c6565b610561565b005b3480156101df575f80fd5b506101d26101ee366004614501565b6107f7565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d2610238366004614518565b610969565b348015610248575f80fd5b5061025c610257366004614501565b610a46565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc366004614556565b610a5c565b604051908152602001610215565b3480156102fa575f80fd5b506101d26103093660046145aa565b610a90565b348015610319575f80fd5b506101d26103283660046145c3565b610b31565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d26103703660046145eb565b610d8b565b348015610380575f80fd5b506102e161038f366004614639565b61120f565b34801561039f575f80fd5b5061025c6103ae366004614501565b611228565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e03660046144c6565b61123c565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d2610413366004614501565b61142e565b348015610423575f80fd5b506101d26104323660046145c3565b6114e9565b348015610442575f80fd5b506101d26104513660046145aa565b6116b0565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a366004614501565b611822565b34801561049a575f80fd5b506101d26104a9366004614501565b6119fe565b6102e16104bc366004614501565b611b28565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef366004614501565b611b59565b6040516102159190614666565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e1610531366004614501565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614e028339815191526020526040808220815160e0810190925280545f80516020614e2283398151915293929190829060ff1660038111156105ae576105ae614652565b60038111156105bf576105bf614652565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611b59565b905060028351600381111561064c5761064c614652565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156106c7576106c7614652565b0361076457851561070b576106dc8286611c21565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b61072882846060015183608001516107239190614729565b611da5565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b039092169190911790556107c2565b60048151600581111561077957610779614652565b036107a95761078783611efc565b5f8881526006860160205260409020556107a087612077565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f80516020614e828339815191526020526040808220815160e0810190925280545f80516020614e4283398151915293929190829060ff16600581111561084457610844614652565b600581111561085557610855614652565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108c4576108c4614652565b146108e25760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109078584606001515f61225e565b6040518263ffffffff1660e01b8152600401610923919061476b565b6020604051808303815f875af115801561093f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610963919061479d565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109b2575080546001600160401b03808416911610155b156109d05760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556109fa836122ad565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a5664e8d4a51000836147b4565b92915050565b5f610a656122c1565b610a71848484346122f8565b9050610a8960015f80516020614e6283398151915255565b9392505050565b5f80516020614e228339815191525f80610aa98461249e565b91509150610ab68261273c565b610ac05750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610aef57610aef614652565b03610b14575f83815260078501602052604081208054919055610b128282612777565b505b610b2a81610b25846040015161120f565b6127d5565b5050505050565b5f8181525f80516020614e028339815191526020526040808220815160e0810190925280545f80516020614e2283398151915293929190829060ff166003811115610b7e57610b7e614652565b6003811115610b8f57610b8f614652565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610c0582611b59565b9050600183516003811115610c1c57610c1c614652565b14610c3a5760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610c4f57610c4f614652565b03610c6557610c5d85612077565b505050505050565b5f610c6f876127e8565b90505f80610c8083604001516128e8565b5091509150818514610ca557604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610cde5750806001600160401b03168660a001516001600160401b0316115b15610cfc57604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614e428339815191529060ff1615610ddd57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e20573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e44919061479d565b836020013514610e675760405163d040949d60e01b815260040160405180910390fd5b30610e7860608501604086016147e7565b6001600160a01b031614610e9f5760405163e6c4247b60e01b815260040160405180910390fd5b5f610ead6060850185614802565b905090505f805b828163ffffffff161015611159575f610ed06060880188614802565b8363ffffffff16818110610ee657610ee6614847565b9050602002810190610ef8919061485b565b610f019061490b565b80515f8181526008880160205260409020549192509015610f3557604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610f6492919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610f7e916149a2565b602060405180830381855afa158015610f99573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610fbc919061479d565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561104857611048614652565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516110fb9116866149b3565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080611152906149c6565b9050610eb4565b50600483018190555f61116b856127e8565b90505f61117b8260400151612b26565b90505f61118788612c9b565b90508160028260405161119a91906149a2565b602060405180830381855afa1580156111b5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111d8919061479d565b146111f657604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610a566001600160401b03831664e8d4a510006149e8565b5f61123282611b59565b6080015192915050565b5f80516020614e228339815191525f61125485613134565b905061125f8561273c565b61126a575050505050565b5f8581526004830160205260409020546001600160a01b031633146112a25760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516112d191600160b01b90046001600160401b0316906149ff565b6001600160401b03168160c001516001600160401b03161015611307576040516302336bad60e51b815260040160405180910390fd5b8315610b2a575f6113188685611c21565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906113689061120f565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156113de573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611402919061479d565b5f878152600785016020526040812080549091906114219084906149b3565b9091555050505050505050565b5f80516020614e228339815191525f61144683611b59565b905060048151600581111561145d5761145d614652565b1461147b5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114b35760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610963906001600160a01b031682612777565b6114f16122c1565b5f8181525f80516020614e028339815191526020526040808220815160e0810190925280545f80516020614e2283398151915293929190829060ff16600381111561153e5761153e614652565b600381111561154f5761154f614652565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115c8576115c8614652565b146115e65760405163f95c7fe160e01b815260040160405180910390fd5b60046115f58260400151611b59565b51600581111561160757611607614652565b1461168b575f611616856127e8565b90505f8061162783604001516128e8565b50915091508184604001511461165057604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561168757604051633ab3447f60e11b815260040160405180910390fd5b5050505b61169483612077565b50506116ac60015f80516020614e6283398151915255565b5050565b5f80516020614e428339815191525f6116c8836127e8565b90505f806116d98360400151613371565b91509150806116fb57604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461171590614a1f565b90505f0361173657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff16600581111561175c5761175c614652565b1461177a5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206117929161441b565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614e028339815191526020526040808220815160e0810190925280545f80516020614e2283398151915293929190829060ff16600381111561186f5761186f614652565b600381111561188057611880614652565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156118f9576118f9614652565b1415801561191a575060038151600381111561191757611917614652565b14155b156119385760405163f95c7fe160e01b815260040160405180910390fd5b5f6119468260400151611b59565b905080606001516001600160401b03165f0361197557604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6119a284604001518460600151856080015161225e565b6040518263ffffffff1660e01b81526004016119be919061476b565b6020604051808303815f875af11580156119da573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2a919061479d565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614e428339815191529190611a4590614a1f565b90505f03611a6657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611a8c57611a8c614652565b14611aaa5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ae39190600401614a51565b6020604051808303815f875af1158015611aff573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b23919061479d565b505050565b5f611b316122c1565b611b3c823334613515565b9050611b5460015f80516020614e6283398151915255565b919050565b611b61614452565b5f8281525f80516020614e82833981519152602052604090819020815160e0810190925280545f80516020614e42833981519152929190829060ff166005811115611bae57611bae614652565b6005811115611bbf57611bbf614652565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c6c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c939190810190614ae6565b9150915080611cb557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cf8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d1c919061479d565b825114611d3c5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d685760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d7784604001516137d9565b91509150818714611d9b57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e82833981519152602052604081206002015481905f80516020614e4283398151915290600160801b90046001600160401b0316611ded85826139b4565b5f611df787613b7d565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e478a858b61225e565b6040518263ffffffff1660e01b8152600401611e63919061476b565b6020604051808303815f875af1158015611e7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ea3919061479d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b60408101515f905f80516020614e228339815191529082611f1c82611b59565b90505f600382516005811115611f3457611f34614652565b1480611f525750600482516005811115611f5057611f50614652565b145b15611f62575060c0810151611f7f565b600282516005811115611f7757611f77614652565b036107a95750425b85608001516001600160401b0316816001600160401b031611611fa757505f95945050505050565b600384015460608701516001600160a01b039091169063778c06b590611fcc9061120f565b60a085015160808a01515f88815260088a01602052604080822054905160e087901b6001600160e01b031916815260048101959095526001600160401b039384166024860152918316604485015282871660648501529116608483015260a4820181905260c482015260e401602060405180830381865afa158015612053573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9b919061479d565b5f8181525f80516020614e028339815191526020526040808220815160e0810190925280545f80516020614e2283398151915293929190829060ff1660038111156120c4576120c4614652565b60038111156120d5576120d5614652565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612203575f848152600487016020526040902054612710906121b590600160a01b900461ffff16856149e8565b6121bf91906147b4565b915081866007015f8681526020019081526020015f205f8282546121e391906149b3565b909155506121f390508284614bb8565b9050612203856020015182612777565b6122188560200151610b25876060015161120f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6122b5613bf2565b6122be81613c3d565b50565b5f80516020614e628339815191528054600119016122f257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614e2283398151915290600160401b900461ffff908116908616108061234c575061271061ffff8616115b1561236a5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561239c576040516302336bad60e51b815260040160405180910390fd5b80548310806123ae5750806001015483115b156123cc57604051630103be3b60e21b815260040160405180910390fd5b825f6123d782610a46565b90505f6123e48983613cab565b905060405180606001604052806123f83390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e6283398151915255565b5f6124a7614452565b5f80516020614e428339815191525f6124bf856127e8565b90505f806124d08360400151613371565b9150915080156124f357604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561252457612524614652565b600581111561253557612535614652565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125a4576125a4614652565b141580156125c557506001815160058111156125c2576125c2614652565b14155b156125e35760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156125f8576125f8614652565b03612606576004815261260b565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561265057612650614652565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561270457612704614652565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156127c3575f80fd5b505af1158015610c5d573d5f803e3d5ffd5b6116ac6001600160a01b03831682614095565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561284c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128739190810190614ae6565b915091508061289557604051636b2f19e960e01b815260040160405180910390fd5b8151156128b55760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156128e15760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461290d57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561295c57612924816001614bb8565b61292f9060086149e8565b61ffff1686828151811061294557612945614847565b016020015160f81c901b9190911790600101612910565b5061ffff8116156129805760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156129db57612997816003614bb8565b6129a29060086149e8565b63ffffffff16876129b48360026149b3565b815181106129c4576129c4614847565b016020015160f81c901b9190911790600101612983565b5063ffffffff8116600414612a0357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a5857612a1a81601f614bb8565b612a259060086149e8565b88612a318360066149b3565b81518110612a4157612a41614847565b016020015160f81c901b9190911790600101612a06565b505f805b6008811015612ab757612a70816007614bb8565b612a7b9060086149e8565b6001600160401b031689612a908360266149b3565b81518110612aa057612aa0614847565b016020015160f81c901b9190911790600101612a5c565b505f805b6008811015612b1657612acf816007614bb8565b612ada9060086149e8565b6001600160401b03168a612aef83602e6149b3565b81518110612aff57612aff614847565b016020015160f81c901b9190911790600101612abb565b5091989097509095509350505050565b5f8151602614612b4957604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b9857612b60816001614bb8565b612b6b9060086149e8565b61ffff16848281518110612b8157612b81614847565b016020015160f81c901b9190911790600101612b4c565b5061ffff811615612bbc5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612c1757612bd3816003614bb8565b612bde9060086149e8565b63ffffffff1685612bf08360026149b3565b81518110612c0057612c00614847565b016020015160f81c901b9190911790600101612bbf565b5063ffffffff811615612c3d57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c9257612c5481601f614bb8565b612c5f9060086149e8565b86612c6b8360066149b3565b81518110612c7b57612c7b614847565b016020015160f81c901b9190911790600101612c40565b50949350505050565b60605f612caa83830184614802565b612cb6915060586149e8565b612cc190605c6149b3565b6001600160401b03811115612cd857612cd8614879565b6040519080825280601f01601f191660200182016040528015612d02576020820181803683370190505b5090505f5b6020811015612d575783358160208110612d2357612d23614847565b1a60f81b828281518110612d3957612d39614847565b60200101906001600160f81b03191690815f1a905350600101612d07565b505f5b6020811015612db75783602001358160208110612d7957612d79614847565b1a60f81b82612d898360206149b3565b81518110612d9957612d99614847565b60200101906001600160f81b03191690815f1a905350600101612d5a565b505f5b6004811015612e1a57612dce816003614bb8565b612dd99060086149e8565b6014901c60f81b82612dec8360406149b3565b81518110612dfc57612dfc614847565b60200101906001600160f81b03191690815f1a905350600101612dba565b505f612e2c60608501604086016147e7565b60601b90505f5b6014811015612e8c57818160148110612e4e57612e4e614847565b1a60f81b83612e5e8360446149b3565b81518110612e6e57612e6e614847565b60200101906001600160f81b03191690815f1a905350600101612e33565b505f612e9b6060860186614802565b905090505f5b6004811015612f0657612eb5816003614bb8565b612ec09060086149e8565b63ffffffff8316901c60f81b84612ed88360586149b3565b81518110612ee857612ee8614847565b60200101906001600160f81b03191690815f1a905350600101612ea1565b505f5b612f166060870187614802565b905081101561312a575f612f2b8260586149e8565b612f3690605c6149b3565b90505f5b6020811015612fc157612f506060890189614802565b84818110612f6057612f60614847565b9050602002810190612f72919061485b565b358160208110612f8457612f84614847565b1a60f81b86612f9383856149b3565b81518110612fa357612fa3614847565b60200101906001600160f81b03191690815f1a905350600101612f3a565b505f5b600881101561307657612fd8816007614bb8565b612fe39060086149e8565b612ff060608a018a614802565b8581811061300057613000614847565b9050602002810190613012919061485b565b613023906040810190602001614639565b6001600160401b0316901c60f81b868261303e8560206149b3565b61304891906149b3565b8151811061305857613058614847565b60200101906001600160f81b03191690815f1a905350600101612fc4565b505f5b60308110156131205761308f6060890189614802565b8481811061309f5761309f614847565b90506020028101906130b1919061485b565b6130bf906040810190614bcb565b828181106130cf576130cf614847565b9050013560f81c60f81b86828460286130e891906149b3565b6130f291906149b3565b8151811061310257613102614847565b60200101906001600160f81b03191690815f1a905350600101613079565b5050600101612f09565b5091949350505050565b61313c614452565b5f8281525f80516020614e828339815191526020526040808220815160e0810190925280545f80516020614e4283398151915293929190829060ff16600581111561318957613189614652565b600581111561319a5761319a614652565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561320c5761320c614652565b1461322a5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561326e5761326e614652565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61331a8582611da5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f80825160271461339557604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133e4576133ac816001614bb8565b6133b79060086149e8565b61ffff168582815181106133cd576133cd614847565b016020015160f81c901b9190911790600101613398565b5061ffff8116156134085760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156134635761341f816003614bb8565b61342a9060086149e8565b63ffffffff168661343c8360026149b3565b8151811061344c5761344c614847565b016020015160f81c901b919091179060010161340b565b5063ffffffff811660031461348b57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134e0576134a281601f614bb8565b6134ad9060086149e8565b876134b98360066149b3565b815181106134c9576134c9614847565b016020015160f81c901b919091179060010161348e565b505f866026815181106134f5576134f5614847565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614e228339815191528161352e84610a46565b90505f61353a87611b59565b90506135458761273c565b61356257604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561357757613577614652565b146135955760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516135a691906149ff565b905083600201600a9054906101000a90046001600160401b031682604001516135cf9190614c0d565b6001600160401b0316816001600160401b0316111561360157604051630c192e7760e41b815260040160405180910390fd5b5f8061360d8a84611da5565b915091505f8a8360405160200161363b92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156136ce576136ce614652565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e146137fd57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561384c57613814816001614bb8565b61381f9060086149e8565b61ffff1685828151811061383557613835614847565b016020015160f81c901b9190911790600101613800565b5061ffff8116156138705760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156138cb57613887816003614bb8565b6138929060086149e8565b63ffffffff16866138a48360026149b3565b815181106138b4576138b4614847565b016020015160f81c901b9190911790600101613873565b5063ffffffff81166005146138f357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139485761390a81601f614bb8565b6139159060086149e8565b876139218360066149b3565b8151811061393157613931614847565b016020015160f81c901b91909117906001016138f6565b505f805b60088110156139a757613960816007614bb8565b61396b9060086149e8565b6001600160401b0316886139808360266149b3565b8151811061399057613990614847565b016020015160f81c901b919091179060010161394c565b5090969095509350505050565b5f80516020614e428339815191525f6001600160401b0380841690851611156139e8576139e18385614729565b90506139f5565b6139f28484614729565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a57575060018401548151613a53916001600160401b0316906149b3565b8210155b15613a7d576001600160401b038316606082015281815260408101516020820152613a9c565b8281606001818151613a8f91906149ff565b6001600160401b03169052505b6060810151613aac906064614c0d565b602082015160018601546001600160401b039290921691613ad79190600160401b900460ff166149e8565b1015613af65760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613b1191906149b3565b9052506040810180516001600160401b0387169190613b31908390614bb8565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e828339815191526020526040812060020180545f80516020614e428339815191529190600890613bc790600160401b90046001600160401b0316614c38565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c3b57604051631afcd79f60e31b815260040160405180910390fd5b565b613c45613bf2565b613c4e8161412c565b613c56614145565b6122be60608201356080830135613c7360c0850160a08601614639565b613c8360e0860160c08701614c53565b613c94610100870160e08801614c6c565b613ca6610120880161010089016147e7565b614155565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613cef57604051637fab81e560e01b815260040160405180910390fd5b5f80516020614e4283398151915242613d0e6040860160208701614639565b6001600160401b0316111580613d485750613d2c6202a300426149b3565b613d3c6040860160208701614639565b6001600160401b031610155b15613d655760405162d36c8560e81b815260040160405180910390fd5b6030613d746040860186614bcb565b9050141580613d8257508335155b15613da05760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613dd057604051630eb0d31360e11b815260040160405180910390fd5b613dda835f6139b4565b5f80613e736040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e1e9190614639565b6001600160401b03168152602001613e3960408a018a614bcb565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614276565b5f82815260068601602052604090209193509150613e918282614cd0565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613ecf90859060040161476b565b6020604051808303815f875af1158015613eeb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f0f919061479d565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613f8757613f87614652565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614067918e01908e01614639565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156140bc5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614105576040519150601f19603f3d011682016040523d82523d5f602084013e61410a565b606091505b5050905080611b2357604051630a12f52160e11b815260040160405180910390fd5b614134613bf2565b61413c614339565b6122be81614341565b61414d613bf2565b613c3b614413565b61415d613bf2565b5f80516020614e2283398151915261ffff84161580614181575061271061ffff8516115b1561419f5760405163c98d73a760e01b815260040160405180910390fd5b858711156141c057604051630103be3b60e21b815260040160405180910390fd5b60ff831615806141d35750600a60ff8416115b156141f1576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461429f57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016142d19796959493929190614d8b565b60405160208183030381529060405290506002816040516142f291906149a2565b602060405180830381855afa15801561430d573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614330919061479d565b94909350915050565b613c3b613bf2565b614349613bf2565b80355f80516020614e42833981519152908155601461436e6060840160408501614c6c565b60ff16118061438d57506143886060830160408401614c6c565b60ff16155b156143ab5760405163b4fa3fb360e01b815260040160405180910390fd5b6143bb6060830160408401614c6c565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556143ec6040830160208401614639565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61248b613bf2565b50805461442790614a1f565b5f825580601f10614436575050565b601f0160209004905f5260205f20908101906122be919061448e565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156144a2575f815560010161448f565b5090565b80151581146122be575f80fd5b803563ffffffff81168114611b54575f80fd5b5f805f606084860312156144d8575f80fd5b8335925060208401356144ea816144a6565b91506144f8604085016144b3565b90509250925092565b5f60208284031215614511575f80fd5b5035919050565b5f6101208284031215614529575f80fd5b50919050565b803561ffff81168114611b54575f80fd5b80356001600160401b0381168114611b54575f80fd5b5f805f60608486031215614568575f80fd5b83356001600160401b0381111561457d575f80fd5b84016060818703121561458e575f80fd5b925061459c6020850161452f565b91506144f860408501614540565b5f602082840312156145ba575f80fd5b610a89826144b3565b5f80604083850312156145d4575f80fd5b6145dd836144b3565b946020939093013593505050565b5f80604083850312156145fc575f80fd5b82356001600160401b03811115614611575f80fd5b830160808186031215614622575f80fd5b9150614630602084016144b3565b90509250929050565b5f60208284031215614649575f80fd5b610a8982614540565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061468957634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516146c460608401826001600160401b03169052565b5060808301516146df60808401826001600160401b03169052565b5060a08301516146fa60a08401826001600160401b03169052565b5060c08301516128e160c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156128e1576128e1614715565b5f5b8381101561476357818101518382015260200161474b565b50505f910152565b602081525f8251806020840152614789816040850160208701614749565b601f01601f19169190910160400192915050565b5f602082840312156147ad575f80fd5b5051919050565b5f826147ce57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03811681146122be575f80fd5b5f602082840312156147f7575f80fd5b8135610a89816147d3565b5f808335601e19843603018112614817575f80fd5b8301803591506001600160401b03821115614830575f80fd5b6020019150600581901b3603821315611ef5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261486f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156148af576148af614879565b60405290565b604051601f8201601f191681016001600160401b03811182821017156148dd576148dd614879565b604052919050565b5f6001600160401b038211156148fd576148fd614879565b50601f01601f191660200190565b5f6060823603121561491b575f80fd5b61492361488d565b823581526020614934818501614540565b8183015260408401356001600160401b03811115614950575f80fd5b840136601f820112614960575f80fd5b803561497361496e826148e5565b6148b5565b8181523684838501011115614986575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f825161486f818460208701614749565b80820180821115610a5657610a56614715565b5f63ffffffff8083168181036149de576149de614715565b6001019392505050565b8082028115828204841417610a5657610a56614715565b6001600160401b038181168382160190808211156128e1576128e1614715565b600181811c90821680614a3357607f821691505b60208210810361452957634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614a6381614a1f565b806020870152604060018084165f8114614a845760018114614aa057614acd565b60ff19851660408a0152604084151560051b8a01019550614acd565b895f5260205f205f5b85811015614ac45781548b8201860152908301908801614aa9565b8a016040019650505b509398975050505050505050565b8051611b54816144a6565b5f8060408385031215614af7575f80fd5b82516001600160401b0380821115614b0d575f80fd5b9084019060608287031215614b20575f80fd5b614b2861488d565b82518152602080840151614b3b816147d3565b82820152604084015183811115614b50575f80fd5b80850194505087601f850112614b64575f80fd5b83519250614b7461496e846148e5565b8381528882858701011115614b87575f80fd5b614b9684838301848801614749565b80604084015250819550614bab818801614adb565b9450505050509250929050565b81810381811115610a5657610a56614715565b5f808335601e19843603018112614be0575f80fd5b8301803591506001600160401b03821115614bf9575f80fd5b602001915036819003821315611ef5575f80fd5b6001600160401b03818116838216028082169190828114614c3057614c30614715565b505092915050565b5f6001600160401b038083168181036149de576149de614715565b5f60208284031215614c63575f80fd5b610a898261452f565b5f60208284031215614c7c575f80fd5b813560ff81168114610a89575f80fd5b601f821115611b2357805f5260205f20601f840160051c81016020851015614cb15750805b601f840160051c820191505b81811015610b2a575f8155600101614cbd565b81516001600160401b03811115614ce957614ce9614879565b614cfd81614cf78454614a1f565b84614c8c565b602080601f831160018114614d30575f8415614d195750858301515b5f19600386901b1c1916600185901b178555610c5d565b5f85815260208120601f198616915b82811015614d5e57888601518255948401946001909101908401614d3f565b5085821015614d7b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614de081604e860160208901614749565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161501438038061501483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614ec78061014d5f395ff3fe6080604052600436106101af575f3560e01c8063732214f8116100e7578063ba3a4b9711610087578063c974d1b611610062578063c974d1b6146104c1578063d5f20ff6146104d5578063df93d8de14610501578063e7d14c1c14610517575f80fd5b8063ba3a4b9714610470578063bee0a03f1461048f578063c599e24f146104ae575f80fd5b806393e24598116100c257806393e24598146103f957806398f3e2b414610418578063a3a65e4814610437578063b771b3bc14610456575f80fd5b8063732214f8146103b357806376f78621146103c65780638280a25a146103e5575f80fd5b806340034a931161015257806360305d621161012d57806360305d621461032d57806361e2f49014610356578063620658561461037557806366435abf14610394575f80fd5b806340034a93146102ce578063467ef06f146102ef5780635297fae61461030e575f80fd5b806320e555651161018d57806320e555651461021e5780632e2194d81461023d578063329c3e121461027457806335455ded146102a6575f80fd5b80630118acc4146101b35780630322ed98146101d4578063151d30d1146101f3575b5f80fd5b3480156101be575f80fd5b506101d26101cd3660046144df565b610561565b005b3480156101df575f80fd5b506101d26101ee36600461451a565b610812565b3480156101fe575f80fd5b50610207600a81565b60405160ff90911681526020015b60405180910390f35b348015610229575f80fd5b506101d2610238366004614531565b610984565b348015610248575f80fd5b5061025c61025736600461451a565b610a61565b6040516001600160401b039091168152602001610215565b34801561027f575f80fd5b5061028e6001600160991b0181565b6040516001600160a01b039091168152602001610215565b3480156102b1575f80fd5b506102bb61271081565b60405161ffff9091168152602001610215565b6102e16102dc36600461456f565b610a77565b604051908152602001610215565b3480156102fa575f80fd5b506101d26103093660046145c3565b610aab565b348015610319575f80fd5b506101d26103283660046145dc565b610b4c565b348015610338575f80fd5b50610341601481565b60405163ffffffff9091168152602001610215565b348015610361575f80fd5b506101d2610370366004614604565b610da6565b348015610380575f80fd5b506102e161038f366004614652565b61122a565b34801561039f575f80fd5b5061025c6103ae36600461451a565b611243565b3480156103be575f80fd5b506102e15f81565b3480156103d1575f80fd5b506101d26103e03660046144df565b611257565b3480156103f0575f80fd5b50610207603081565b348015610404575f80fd5b506101d261041336600461451a565b611449565b348015610423575f80fd5b506101d26104323660046145dc565b611504565b348015610442575f80fd5b506101d26104513660046145c3565b6116cb565b348015610461575f80fd5b5061028e6005600160991b0181565b34801561047b575f80fd5b506101d261048a36600461451a565b61183d565b34801561049a575f80fd5b506101d26104a936600461451a565b611a19565b6102e16104bc36600461451a565b611b43565b3480156104cc575f80fd5b50610207601481565b3480156104e0575f80fd5b506104f46104ef36600461451a565b611b74565b604051610215919061467f565b34801561050c575f80fd5b5061025c6202a30081565b348015610522575f80fd5b506102e161053136600461451a565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff1660038111156105ae576105ae61466b565b60038111156105bf576105bf61466b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61063582611b74565b905060028351600381111561064c5761064c61466b565b1461066a5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106975760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156106c7576106c761466b565b0361077e57851561070b576106dc8286611c3c565b5f8381526008860160205260409020805467ffffffffffffffff19166001600160401b03929092169190911790555b61072882846060015183608001516107239190614742565b611dc0565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b039092169190911790556107698382611f17565b5f8881526006860160205260409020556107dd565b6004815160058111156107935761079361466b565b036107c4576107a28382611f17565b5f8881526006860160205260409020556107bb87612090565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f80516020614e9b8339815191526020526040808220815160e0810190925280545f80516020614e5b83398151915293929190829060ff16600581111561085f5761085f61466b565b60058111156108705761087061466b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108df576108df61466b565b146108fd5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109228584606001515f612277565b6040518263ffffffff1660e01b815260040161093e9190614784565b6020604051808303815f875af115801561095a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061097e91906147b6565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109cd575080546001600160401b03808416911610155b156109eb5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a15836122c6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610a7164e8d4a51000836147cd565b92915050565b5f610a806122da565b610a8c84848434612311565b9050610aa460015f80516020614e7b83398151915255565b9392505050565b5f80516020614e3b8339815191525f80610ac4846124b7565b91509150610ad182612755565b610adb5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610b0a57610b0a61466b565b03610b2f575f83815260078501602052604081208054919055610b2d8282612790565b505b610b4581610b40846040015161122a565b6127ee565b5050505050565b5f8181525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff166003811115610b9957610b9961466b565b6003811115610baa57610baa61466b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610c2082611b74565b9050600183516003811115610c3757610c3761466b565b14610c555760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610c6a57610c6a61466b565b03610c8057610c7885612090565b505050505050565b5f610c8a87612801565b90505f80610c9b8360400151612901565b5091509150818514610cc057604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610cf95750806001600160401b03168660a001516001600160401b0316115b15610d1757604051633ab3447f60e11b815260040160405180910390fd5b5f888152600588016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff00000000000000001990921691909117909155915191825286918a917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a3505050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614e5b8339815191529060ff1615610df857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e5f91906147b6565b836020013514610e825760405163d040949d60e01b815260040160405180910390fd5b30610e936060850160408601614800565b6001600160a01b031614610eba5760405163e6c4247b60e01b815260040160405180910390fd5b5f610ec8606085018561481b565b905090505f805b828163ffffffff161015611174575f610eeb606088018861481b565b8363ffffffff16818110610f0157610f01614860565b9050602002810190610f139190614874565b610f1c90614924565b80515f8181526008880160205260409020549192509015610f5057604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610f7f92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610f99916149bb565b602060405180830381855afa158015610fb4573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610fd791906147b6565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156110635761106361466b565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111169116866149cc565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061116d906149df565b9050610ecf565b50600483018190555f61118685612801565b90505f6111968260400151612b3f565b90505f6111a288612cb4565b9050816002826040516111b591906149bb565b602060405180830381855afa1580156111d0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906111f391906147b6565b1461121157604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610a716001600160401b03831664e8d4a51000614a01565b5f61124d82611b74565b6080015192915050565b5f80516020614e3b8339815191525f61126f8561314d565b905061127a85612755565b611285575050505050565b5f8581526004830160205260409020546001600160a01b031633146112bd5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a08201516112ec91600160b01b90046001600160401b031690614a18565b6001600160401b03168160c001516001600160401b03161015611322576040516302336bad60e51b815260040160405180910390fd5b8315610b45575f6113338685611c3c565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906113839061122a565b60a085015160c086015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152841660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156113f9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061141d91906147b6565b5f8781526007850160205260408120805490919061143c9084906149cc565b9091555050505050505050565b5f80516020614e3b8339815191525f61146183611b74565b90506004815160058111156114785761147861466b565b146114965760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114ce5760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461097e906001600160a01b031682612790565b61150c6122da565b5f8181525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff1660038111156115595761155961466b565b600381111561156a5761156a61466b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156115e3576115e361466b565b146116015760405163f95c7fe160e01b815260040160405180910390fd5b60046116108260400151611b74565b5160058111156116225761162261466b565b146116a6575f61163185612801565b90505f806116428360400151612901565b50915091508184604001511461166b57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156116a257604051633ab3447f60e11b815260040160405180910390fd5b5050505b6116af83612090565b50506116c760015f80516020614e7b83398151915255565b5050565b5f80516020614e5b8339815191525f6116e383612801565b90505f806116f4836040015161338a565b915091508061171657604051633dbcaef760e01b815260040160405180910390fd5b5f8281526006850160205260409020805461173090614a38565b90505f0361175157604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff1660058111156117775761177761466b565b146117955760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068501602052604081206117ad91614434565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff16600381111561188a5761188a61466b565b600381111561189b5761189b61466b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156119145761191461466b565b1415801561193557506003815160038111156119325761193261466b565b14155b156119535760405163f95c7fe160e01b815260040160405180910390fd5b5f6119618260400151611b74565b905080606001516001600160401b03165f0361199057604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6119bd846040015184606001518560800151612277565b6040518263ffffffff1660e01b81526004016119d99190614784565b6020604051808303815f875af11580156119f5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b4591906147b6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614e5b8339815191529190611a6090614a38565b90505f03611a8157604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611aa757611aa761466b565b14611ac55760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611afe9190600401614a6a565b6020604051808303815f875af1158015611b1a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b3e91906147b6565b505050565b5f611b4c6122da565b611b5782333461352e565b9050611b6f60015f80516020614e7b83398151915255565b919050565b611b7c61446b565b5f8281525f80516020614e9b833981519152602052604090819020815160e0810190925280545f80516020614e5b833981519152929190829060ff166005811115611bc957611bc961466b565b6005811115611bda57611bda61466b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c87573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611cae9190810190614aff565b9150915080611cd057604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611d13573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d3791906147b6565b825114611d575760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611d835760405163e6c4247b60e01b815260040160405180910390fd5b5f80611d9284604001516137f2565b91509150818714611db657604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614e9b833981519152602052604081206002015481905f80516020614e5b83398151915290600160801b90046001600160401b0316611e0885826139cd565b5f611e1287613b96565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611e628a858b612277565b6040518263ffffffff1660e01b8152600401611e7e9190614784565b6020604051808303815f875af1158015611e9a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ebe91906147b6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020614e3b83398151915290505f600384516005811115611f3f57611f3f61466b565b1480611f5d5750600484516005811115611f5b57611f5b61466b565b145b15611f6d575060c0830151611f8a565b600284516005811115611f8257611f8261466b565b036107c45750425b84608001516001600160401b0316816001600160401b031611611fb1575f92505050610a71565b600382015460608601516001600160a01b039091169063778c06b590611fd69061122a565b60a087015160808901516040808b01515f9081526008890160205281812054915160e087901b6001600160e01b031916815260048101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015612063573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061208791906147b6565b95945050505050565b5f8181525f80516020614e1b8339815191526020526040808220815160e0810190925280545f80516020614e3b83398151915293929190829060ff1660038111156120dd576120dd61466b565b60038111156120ee576120ee61466b565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870190915290812080549082905592935090919080821561221c575f848152600487016020526040902054612710906121ce90600160a01b900461ffff1685614a01565b6121d891906147cd565b915081866007015f8681526020019081526020015f205f8282546121fc91906149cc565b9091555061220c90508284614bd1565b905061221c856020015182612790565b6122318560200151610b40876060015161122a565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6122ce613c0b565b6122d781613c56565b50565b5f80516020614e7b83398151915280546001190161230b57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614e3b83398151915290600160401b900461ffff9081169086161080612365575061271061ffff8616115b156123835760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b0390811690851610156123b5576040516302336bad60e51b815260040160405180910390fd5b80548310806123c75750806001015483115b156123e557604051630103be3b60e21b815260040160405180910390fd5b825f6123f082610a61565b90505f6123fd8983613cc4565b905060405180606001604052806124113390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614e7b83398151915255565b5f6124c061446b565b5f80516020614e5b8339815191525f6124d885612801565b90505f806124e9836040015161338a565b91509150801561250c57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561253d5761253d61466b565b600581111561254e5761254e61466b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125bd576125bd61466b565b141580156125de57506001815160058111156125db576125db61466b565b14155b156125fc5760405163a36c527f60e01b815260040160405180910390fd5b6003815160058111156126115761261161466b565b0361261f5760048152612624565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156126695761266961466b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561271d5761271d61466b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156127dc575f80fd5b505af1158015610c78573d5f803e3d5ffd5b6116c76001600160a01b038316826140ae565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612865573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261288c9190810190614aff565b91509150806128ae57604051636b2f19e960e01b815260040160405180910390fd5b8151156128ce5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156128fa5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461292657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129755761293d816001614bd1565b612948906008614a01565b61ffff1686828151811061295e5761295e614860565b016020015160f81c901b9190911790600101612929565b5061ffff8116156129995760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156129f4576129b0816003614bd1565b6129bb906008614a01565b63ffffffff16876129cd8360026149cc565b815181106129dd576129dd614860565b016020015160f81c901b919091179060010161299c565b5063ffffffff8116600414612a1c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a7157612a3381601f614bd1565b612a3e906008614a01565b88612a4a8360066149cc565b81518110612a5a57612a5a614860565b016020015160f81c901b9190911790600101612a1f565b505f805b6008811015612ad057612a89816007614bd1565b612a94906008614a01565b6001600160401b031689612aa98360266149cc565b81518110612ab957612ab9614860565b016020015160f81c901b9190911790600101612a75565b505f805b6008811015612b2f57612ae8816007614bd1565b612af3906008614a01565b6001600160401b03168a612b0883602e6149cc565b81518110612b1857612b18614860565b016020015160f81c901b9190911790600101612ad4565b5091989097509095509350505050565b5f8151602614612b6257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612bb157612b79816001614bd1565b612b84906008614a01565b61ffff16848281518110612b9a57612b9a614860565b016020015160f81c901b9190911790600101612b65565b5061ffff811615612bd55760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612c3057612bec816003614bd1565b612bf7906008614a01565b63ffffffff1685612c098360026149cc565b81518110612c1957612c19614860565b016020015160f81c901b9190911790600101612bd8565b5063ffffffff811615612c5657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612cab57612c6d81601f614bd1565b612c78906008614a01565b86612c848360066149cc565b81518110612c9457612c94614860565b016020015160f81c901b9190911790600101612c59565b50949350505050565b60605f612cc38383018461481b565b612ccf91506058614a01565b612cda90605c6149cc565b6001600160401b03811115612cf157612cf1614892565b6040519080825280601f01601f191660200182016040528015612d1b576020820181803683370190505b5090505f5b6020811015612d705783358160208110612d3c57612d3c614860565b1a60f81b828281518110612d5257612d52614860565b60200101906001600160f81b03191690815f1a905350600101612d20565b505f5b6020811015612dd05783602001358160208110612d9257612d92614860565b1a60f81b82612da28360206149cc565b81518110612db257612db2614860565b60200101906001600160f81b03191690815f1a905350600101612d73565b505f5b6004811015612e3357612de7816003614bd1565b612df2906008614a01565b6014901c60f81b82612e058360406149cc565b81518110612e1557612e15614860565b60200101906001600160f81b03191690815f1a905350600101612dd3565b505f612e456060850160408601614800565b60601b90505f5b6014811015612ea557818160148110612e6757612e67614860565b1a60f81b83612e778360446149cc565b81518110612e8757612e87614860565b60200101906001600160f81b03191690815f1a905350600101612e4c565b505f612eb4606086018661481b565b905090505f5b6004811015612f1f57612ece816003614bd1565b612ed9906008614a01565b63ffffffff8316901c60f81b84612ef18360586149cc565b81518110612f0157612f01614860565b60200101906001600160f81b03191690815f1a905350600101612eba565b505f5b612f2f606087018761481b565b9050811015613143575f612f44826058614a01565b612f4f90605c6149cc565b90505f5b6020811015612fda57612f69606089018961481b565b84818110612f7957612f79614860565b9050602002810190612f8b9190614874565b358160208110612f9d57612f9d614860565b1a60f81b86612fac83856149cc565b81518110612fbc57612fbc614860565b60200101906001600160f81b03191690815f1a905350600101612f53565b505f5b600881101561308f57612ff1816007614bd1565b612ffc906008614a01565b61300960608a018a61481b565b8581811061301957613019614860565b905060200281019061302b9190614874565b61303c906040810190602001614652565b6001600160401b0316901c60f81b86826130578560206149cc565b61306191906149cc565b8151811061307157613071614860565b60200101906001600160f81b03191690815f1a905350600101612fdd565b505f5b6030811015613139576130a8606089018961481b565b848181106130b8576130b8614860565b90506020028101906130ca9190614874565b6130d8906040810190614be4565b828181106130e8576130e8614860565b9050013560f81c60f81b868284602861310191906149cc565b61310b91906149cc565b8151811061311b5761311b614860565b60200101906001600160f81b03191690815f1a905350600101613092565b5050600101612f22565b5091949350505050565b61315561446b565b5f8281525f80516020614e9b8339815191526020526040808220815160e0810190925280545f80516020614e5b83398151915293929190829060ff1660058111156131a2576131a261466b565b60058111156131b3576131b361466b565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156132255761322561466b565b146132435760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156132875761328761466b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133338582611dc0565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146133ae57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133fd576133c5816001614bd1565b6133d0906008614a01565b61ffff168582815181106133e6576133e6614860565b016020015160f81c901b91909117906001016133b1565b5061ffff8116156134215760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561347c57613438816003614bd1565b613443906008614a01565b63ffffffff16866134558360026149cc565b8151811061346557613465614860565b016020015160f81c901b9190911790600101613424565b5063ffffffff81166003146134a457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134f9576134bb81601f614bd1565b6134c6906008614a01565b876134d28360066149cc565b815181106134e2576134e2614860565b016020015160f81c901b91909117906001016134a7565b505f8660268151811061350e5761350e614860565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614e3b8339815191528161354784610a61565b90505f61355387611b74565b905061355e87612755565b61357b57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156135905761359061466b565b146135ae5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516135bf9190614a18565b905083600201600a9054906101000a90046001600160401b031682604001516135e89190614c26565b6001600160401b0316816001600160401b0316111561361a57604051630c192e7760e41b815260040160405180910390fd5b5f806136268a84611dc0565b915091505f8a8360405160200161365492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156136e7576136e761466b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461381657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156138655761382d816001614bd1565b613838906008614a01565b61ffff1685828151811061384e5761384e614860565b016020015160f81c901b9190911790600101613819565b5061ffff8116156138895760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156138e4576138a0816003614bd1565b6138ab906008614a01565b63ffffffff16866138bd8360026149cc565b815181106138cd576138cd614860565b016020015160f81c901b919091179060010161388c565b5063ffffffff811660051461390c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139615761392381601f614bd1565b61392e906008614a01565b8761393a8360066149cc565b8151811061394a5761394a614860565b016020015160f81c901b919091179060010161390f565b505f805b60088110156139c057613979816007614bd1565b613984906008614a01565b6001600160401b0316886139998360266149cc565b815181106139a9576139a9614860565b016020015160f81c901b9190911790600101613965565b5090969095509350505050565b5f80516020614e5b8339815191525f6001600160401b038084169085161115613a01576139fa8385614742565b9050613a0e565b613a0b8484614742565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613a70575060018401548151613a6c916001600160401b0316906149cc565b8210155b15613a96576001600160401b038316606082015281815260408101516020820152613ab5565b8281606001818151613aa89190614a18565b6001600160401b03169052505b6060810151613ac5906064614c26565b602082015160018601546001600160401b039290921691613af09190600160401b900460ff16614a01565b1015613b0f5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613b2a91906149cc565b9052506040810180516001600160401b0387169190613b4a908390614bd1565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614e9b8339815191526020526040812060020180545f80516020614e5b8339815191529190600890613be090600160401b90046001600160401b0316614c51565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c5457604051631afcd79f60e31b815260040160405180910390fd5b565b613c5e613c0b565b613c6781614145565b613c6f61415e565b6122d760608201356080830135613c8c60c0850160a08601614652565b613c9c60e0860160c08701614c6c565b613cad610100870160e08801614c85565b613cbf61012088016101008901614800565b61416e565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613d0857604051637fab81e560e01b815260040160405180910390fd5b5f80516020614e5b83398151915242613d276040860160208701614652565b6001600160401b0316111580613d615750613d456202a300426149cc565b613d556040860160208701614652565b6001600160401b031610155b15613d7e5760405162d36c8560e81b815260040160405180910390fd5b6030613d8d6040860186614be4565b9050141580613d9b57508335155b15613db95760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613de957604051630eb0d31360e11b815260040160405180910390fd5b613df3835f6139cd565b5f80613e8c6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e379190614652565b6001600160401b03168152602001613e5260408a018a614be4565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061428f565b5f82815260068601602052604090209193509150613eaa8282614ce9565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613ee8908590600401614784565b6020604051808303815f875af1158015613f04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f2891906147b6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613fa057613fa061466b565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614080918e01908e01614652565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156140d55760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461411e576040519150601f19603f3d011682016040523d82523d5f602084013e614123565b606091505b5050905080611b3e57604051630a12f52160e11b815260040160405180910390fd5b61414d613c0b565b614155614352565b6122d78161435a565b614166613c0b565b613c5461442c565b614176613c0b565b5f80516020614e3b83398151915261ffff8416158061419a575061271061ffff8516115b156141b85760405163c98d73a760e01b815260040160405180910390fd5b858711156141d957604051630103be3b60e21b815260040160405180910390fd5b60ff831615806141ec5750600a60ff8416115b1561420a576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146142b857604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016142ea9796959493929190614da4565b604051602081830303815290604052905060028160405161430b91906149bb565b602060405180830381855afa158015614326573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061434991906147b6565b94909350915050565b613c54613c0b565b614362613c0b565b80355f80516020614e5b83398151915290815560146143876060840160408501614c85565b60ff1611806143a657506143a16060830160408401614c85565b60ff16155b156143c45760405163b4fa3fb360e01b815260040160405180910390fd5b6143d46060830160408401614c85565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556144056040830160208401614652565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6124a4613c0b565b50805461444090614a38565b5f825580601f1061444f575050565b601f0160209004905f5260205f20908101906122d791906144a7565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156144bb575f81556001016144a8565b5090565b80151581146122d7575f80fd5b803563ffffffff81168114611b6f575f80fd5b5f805f606084860312156144f1575f80fd5b833592506020840135614503816144bf565b9150614511604085016144cc565b90509250925092565b5f6020828403121561452a575f80fd5b5035919050565b5f6101208284031215614542575f80fd5b50919050565b803561ffff81168114611b6f575f80fd5b80356001600160401b0381168114611b6f575f80fd5b5f805f60608486031215614581575f80fd5b83356001600160401b03811115614596575f80fd5b8401606081870312156145a7575f80fd5b92506145b560208501614548565b915061451160408501614559565b5f602082840312156145d3575f80fd5b610aa4826144cc565b5f80604083850312156145ed575f80fd5b6145f6836144cc565b946020939093013593505050565b5f8060408385031215614615575f80fd5b82356001600160401b0381111561462a575f80fd5b83016080818603121561463b575f80fd5b9150614649602084016144cc565b90509250929050565b5f60208284031215614662575f80fd5b610aa482614559565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106146a257634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516146dd60608401826001600160401b03169052565b5060808301516146f860808401826001600160401b03169052565b5060a083015161471360a08401826001600160401b03169052565b5060c08301516128fa60c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b038281168282160390808211156128fa576128fa61472e565b5f5b8381101561477c578181015183820152602001614764565b50505f910152565b602081525f82518060208401526147a2816040850160208701614762565b601f01601f19169190910160400192915050565b5f602082840312156147c6575f80fd5b5051919050565b5f826147e757634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b03811681146122d7575f80fd5b5f60208284031215614810575f80fd5b8135610aa4816147ec565b5f808335601e19843603018112614830575f80fd5b8301803591506001600160401b03821115614849575f80fd5b6020019150600581901b3603821315611f10575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614888575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156148c8576148c8614892565b60405290565b604051601f8201601f191681016001600160401b03811182821017156148f6576148f6614892565b604052919050565b5f6001600160401b0382111561491657614916614892565b50601f01601f191660200190565b5f60608236031215614934575f80fd5b61493c6148a6565b82358152602061494d818501614559565b8183015260408401356001600160401b03811115614969575f80fd5b840136601f820112614979575f80fd5b803561498c614987826148fe565b6148ce565b818152368483850101111561499f575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614888818460208701614762565b80820180821115610a7157610a7161472e565b5f63ffffffff8083168181036149f7576149f761472e565b6001019392505050565b8082028115828204841417610a7157610a7161472e565b6001600160401b038181168382160190808211156128fa576128fa61472e565b600181811c90821680614a4c57607f821691505b60208210810361454257634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614a7c81614a38565b806020870152604060018084165f8114614a9d5760018114614ab957614ae6565b60ff19851660408a0152604084151560051b8a01019550614ae6565b895f5260205f205f5b85811015614add5781548b8201860152908301908801614ac2565b8a016040019650505b509398975050505050505050565b8051611b6f816144bf565b5f8060408385031215614b10575f80fd5b82516001600160401b0380821115614b26575f80fd5b9084019060608287031215614b39575f80fd5b614b416148a6565b82518152602080840151614b54816147ec565b82820152604084015183811115614b69575f80fd5b80850194505087601f850112614b7d575f80fd5b83519250614b8d614987846148fe565b8381528882858701011115614ba0575f80fd5b614baf84838301848801614762565b80604084015250819550614bc4818801614af4565b9450505050509250929050565b81810381811115610a7157610a7161472e565b5f808335601e19843603018112614bf9575f80fd5b8301803591506001600160401b03821115614c12575f80fd5b602001915036819003821315611f10575f80fd5b6001600160401b03818116838216028082169190828114614c4957614c4961472e565b505092915050565b5f6001600160401b038083168181036149f7576149f761472e565b5f60208284031215614c7c575f80fd5b610aa482614548565b5f60208284031215614c95575f80fd5b813560ff81168114610aa4575f80fd5b601f821115611b3e57805f5260205f20601f840160051c81016020851015614cca5750805b601f840160051c820191505b81811015610b45575f8155600101614cd6565b81516001600160401b03811115614d0257614d02614892565b614d1681614d108454614a38565b84614ca5565b602080601f831160018114614d49575f8415614d325750858301515b5f19600386901b1c1916600185901b178555610c78565b5f85815260208120601f198616915b82811015614d7757888601518255948401946001909101908401614d58565b5085821015614d9457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614df981604e860160208901614762565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. From 890ae476e67bdf149080c1c814618057b513320e Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 26 Sep 2024 06:59:02 -0700 Subject: [PATCH 424/545] lint --- .../validator-manager/PoSValidatorManager.sol | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 31d061609..595d72b3a 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -435,9 +435,11 @@ abstract contract PoSValidatorManager is ($._delegatorStakes[delegationID].endingNonce,) = _setValidatorWeight(validationID, validator.weight - delegator.weight); - $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator, validator); + $._redeemableDelegatorRewards[delegationID] = + _calculateDelegationReward(delegator, validator); } else if (validator.status == ValidatorStatus.Completed) { - $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator, validator); + $._redeemableDelegatorRewards[delegationID] = + _calculateDelegationReward(delegator, validator); return _completeEndDelegation(delegationID); } else { revert InvalidValidatorStatus(); @@ -447,11 +449,10 @@ abstract contract PoSValidatorManager is } /// @dev Calculates the reward owed to the delegator based on the state of the delegator and its corresponding validator. - function _calculateDelegationReward(Delegator memory delegator, Validator memory validator) - private - view - returns (uint256) - { + function _calculateDelegationReward( + Delegator memory delegator, + Validator memory validator + ) private view returns (uint256) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); uint64 delegationEndTime; From d1304e9ae0c8ca39f8e52099c32199d90841a0db Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 26 Sep 2024 08:33:03 -0700 Subject: [PATCH 425/545] Fix out of gas error --- tests/utils/validator_manager.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index cc1447efc..361437537 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -1090,6 +1090,7 @@ func InitializeEndERC20Delegation( stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, delegationID ids.ID, ) *types.Receipt { + WaitMinStakeDuration(subnet, sendingKey) opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndDelegation( @@ -1122,7 +1123,8 @@ func CompleteEndERC20Delegation( ) } -func InitializeNativeDelegatorRegistration(senderKey *ecdsa.PrivateKey, +func InitializeNativeDelegatorRegistration( + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validationID ids.ID, delegationAmount *big.Int, @@ -1173,6 +1175,7 @@ func InitializeEndNativeDelegation( stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, delegationID ids.ID, ) *types.Receipt { + WaitMinStakeDuration(subnet, sendingKey) opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndDelegation( From 18b0a1175455179f2d3a5141847e14c55b6fe6dd Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 26 Sep 2024 08:42:23 -0700 Subject: [PATCH 426/545] Fix out of gas error --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../validator-manager/PoSValidatorManager.sol | 36 +++++++++++-------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 940ab44c6..612cb4fba 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516154d23803806154d283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6153858061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c806376f78621116100fe578063ba3a4b971161009e578063df93d8de1161006e578063df93d8de146103ea578063e7d14c1c146103f4578063eb0acb8914610432578063f09969ae14610445575f80fd5b8063ba3a4b971461039c578063bee0a03f146103af578063c974d1b6146103c2578063d5f20ff6146103ca575f80fd5b806398f3e2b4116100d957806398f3e2b41461033d5780639e1bc4ef14610350578063a3a65e4814610363578063b771b3bc14610376575f80fd5b806376f786211461030f5780638280a25a1461032257806393e245981461032a575f80fd5b8063467ef06f1161016957806361e2f4901161014457806361e2f490146102c157806362065856146102d457806366435abf146102f5578063732214f814610308575f80fd5b8063467ef06f1461027e5780635297fae61461029157806360305d62146102a4575f80fd5b806325e1c776116101a457806325e1c776146102115780632e2194d81461022457806335455ded1461024f5780633a1cfff61461026b575f80fd5b80630118acc4146101ca5780630322ed98146101df578063151d30d1146101f2575b5f80fd5b6101dd6101d83660046148e3565b610458565b005b6101dd6101ed36600461491e565b6106dc565b6101fa600a81565b60405160ff90911681526020015b60405180910390f35b6101dd61021f366004614935565b61084e565b61023761023236600461491e565b6108be565b6040516001600160401b039091168152602001610208565b61025861271081565b60405161ffff9091168152602001610208565b6101dd6102793660046148e3565b6108d4565b6101dd61028c36600461495f565b6108df565b6101dd61029f366004614978565b610980565b6102ac601481565b60405163ffffffff9091168152602001610208565b6101dd6102cf3660046149a0565b610bd5565b6102e76102e23660046149fb565b611054565b604051908152602001610208565b61023761030336600461491e565b61106d565b6102e75f81565b6101dd61031d3660046148e3565b611081565b6101fa603081565b6101dd61033836600461491e565b6110a9565b6101dd61034b366004614978565b611160565b6102e761035e366004614a14565b611327565b6101dd61037136600461495f565b611353565b6103846005600160991b0181565b6040516001600160a01b039091168152602001610208565b6101dd6103aa36600461491e565b6114c0565b6101dd6103bd36600461491e565b61169c565b6101fa601481565b6103dd6103d836600461491e565b6117c1565b6040516102089190614a48565b6102376202a30081565b6102e761040236600461491e565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102e7610440366004614b08565b611889565b6101dd610453366004614b81565b6118be565b5f8381525f805160206152b98339815191526020526040808220815160e0810190925280545f805160206152f983398151915293929190829060ff1660038111156104a5576104a5614a34565b60038111156104b6576104b6614a34565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61052c826117c1565b905060028351600381111561054357610543614a34565b146105615760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b0316331461058e5760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff1916600317905581516002918111156105be576105be614a34565b036106485785156105d5576105d3828661199d565b505b6105f282846060015183608001516105ed9190614bd3565b611bfe565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b039092169190911790556106338382611d55565b5f8881526006860160205260409020556106a7565b60048151600581111561065d5761065d614a34565b0361068e5761066c8382611d55565b5f88815260068601602052604090205561068587611ed1565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f805160206153598339815191526020526040808220815160e0810190925280545f8051602061531983398151915293929190829060ff16600581111561072957610729614a34565b600581111561073a5761073a614a34565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156107a9576107a9614a34565b146107c75760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107ec8584606001515f6120b8565b6040518263ffffffff1660e01b81526004016108089190614c15565b6020604051808303815f875af1158015610824573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108489190614c47565b50505050565b6108578261210f565b61087457604051636ca57bcf60e01b815260040160405180910390fd5b600261087f836117c1565b51600581111561089157610891614a34565b146108af5760405163a36c527f60e01b815260040160405180910390fd5b6108b9828261199d565b505050565b5f6108ce64e8d4a5100083614c5e565b92915050565b61084883838361214a565b5f805160206152f98339815191525f806108f884612345565b915091506109058261210f565b61090f5750505050565b5f82815260048085016020526040909120546001600160a01b0316908251600581111561093e5761093e614a34565b03610963575f8381526007850160205260408120805491905561096182826125d5565b505b610979816109748460400151611054565b612642565b5050505050565b5f8181525f805160206152b98339815191526020526040808220815160e0810190925280545f805160206152f983398151915293929190829060ff1660038111156109cd576109cd614a34565b60038111156109de576109de614a34565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610a54826117c1565b9050600183516003811115610a6b57610a6b614a34565b14610a895760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610a9e57610a9e614a34565b03610ab457610aac85611ed1565b505050505050565b5f80610acb610ac289612665565b60400151612765565b5091509150818414610af057604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610b295750806001600160401b03168560a001516001600160401b0316115b15610b4757604051633ab3447f60e11b815260040160405180910390fd5b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206153198339815191529060ff1615610c2757604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8e9190614c47565b836020013514610cb15760405163d040949d60e01b815260040160405180910390fd5b30610cc26060850160408601614c7d565b6001600160a01b031614610ce95760405163e6c4247b60e01b815260040160405180910390fd5b5f610cf76060850185614c98565b905090505f805b828163ffffffff161015610fa3575f610d1a6060880188614c98565b8363ffffffff16818110610d3057610d30614cdd565b9050602002810190610d429190614cf1565b610d4b90614da1565b80515f8181526008880160205260409020549192509015610d7f57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610dae92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610dc891614e38565b602060405180830381855afa158015610de3573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610e069190614c47565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610e9257610e92614a34565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610f45911686614e49565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610f9c90614e5c565b9050610cfe565b50600483018190555f610fc1610fb886612665565b604001516129a3565b90505f610fcd87612b18565b905081600282604051610fe09190614e38565b602060405180830381855afa158015610ffb573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061101e9190614c47565b1461103c57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f6108ce6001600160401b03831664e8d4a51000614e7e565b5f611077826117c1565b6080015192915050565b61108c83838361214a565b6108b95760405163d802b9f360e01b815260040160405180910390fd5b5f805160206152f983398151915260046110c2836117c1565b5160058111156110d4576110d4614a34565b146110f25760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b0316331461112a5760405163e6c4247b60e01b815260040160405180910390fd5b5f828152600782016020908152604080832080549084905560048501909252909120546108b9906001600160a01b0316826125d5565b611168612fb1565b5f8181525f805160206152b98339815191526020526040808220815160e0810190925280545f805160206152f983398151915293929190829060ff1660038111156111b5576111b5614a34565b60038111156111c6576111c6614a34565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561123f5761123f614a34565b1461125d5760405163f95c7fe160e01b815260040160405180910390fd5b600461126c82604001516117c1565b51600581111561127e5761127e614a34565b14611302575f61128d85612665565b90505f8061129e8360400151612765565b5091509150818460400151146112c757604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156112fe57604051633ab3447f60e11b815260040160405180910390fd5b5050505b61130b83611ed1565b505061132360015f8051602061533983398151915255565b5050565b5f611330612fb1565b61133b833384612ffb565b90506108ce60015f8051602061533983398151915255565b5f805160206153198339815191525f8061137861136f85612665565b604001516132c2565b915091508061139a57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600684016020526040902080546113b490614e95565b90505f036113d557604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff1660058111156113fb576113fb614a34565b146114195760405163a36c527f60e01b815260040160405180910390fd5b5f828152600684016020526040812061143191614833565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206152b98339815191526020526040808220815160e0810190925280545f805160206152f983398151915293929190829060ff16600381111561150d5761150d614a34565b600381111561151e5761151e614a34565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561159757611597614a34565b141580156115b857506003815160038111156115b5576115b5614a34565b14155b156115d65760405163f95c7fe160e01b815260040160405180910390fd5b5f6115e482604001516117c1565b905080606001516001600160401b03165f0361161357604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6116408460400151846060015185608001516120b8565b6040518263ffffffff1660e01b815260040161165c9190614c15565b6020604051808303815f875af1158015611678573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109799190614c47565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061531983398151915291906116e390614e95565b90505f0361170457604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561172a5761172a614a34565b146117485760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117819190600401614ecd565b6020604051808303815f875af115801561179d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b99190614c47565b6117c961486a565b5f8281525f80516020615359833981519152602052604090819020815160e0810190925280545f80516020615319833981519152929190829060ff16600581111561181657611816614a34565b600581111561182757611827614a34565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611892612fb1565b61189e85858585613466565b90506118b660015f8051602061533983398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611907575080546001600160401b03808416911610155b156119255760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611950848461362c565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156119e8573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a0f9190810190614f62565b9150915080611a3157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a74573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a989190614c47565b825114611ab85760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611ae45760405163e6c4247b60e01b815260040160405180910390fd5b5f80611af38460400151613646565b91509150818714611b1757604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f805160206152f9833981519152906001600160401b039081169083161115611bd4575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611bf3565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f8281525f80516020615359833981519152602052604081206002015481905f8051602061531983398151915290600160801b90046001600160401b0316611c468582613821565b5f611c50876139ea565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611ca08a858b6120b8565b6040518263ffffffff1660e01b8152600401611cbc9190614c15565b6020604051808303815f875af1158015611cd8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cfc9190614c47565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f805160206152f983398151915290505f600384516005811115611d7d57611d7d614a34565b1480611d9b5750600484516005811115611d9957611d99614a34565b145b15611dab575060c0830151611dc8565b600284516005811115611dc057611dc0614a34565b0361068e5750425b84608001516001600160401b0316816001600160401b031611611def575f925050506108ce565b600382015460608601516001600160a01b039091169063778c06b590611e1490611054565b60a087015160808901516040808b01515f908152600489810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015611ea4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ec89190614c47565b95945050505050565b5f8181525f805160206152b98339815191526020526040808220815160e0810190925280545f805160206152f983398151915293929190829060ff166003811115611f1e57611f1e614a34565b6003811115611f2f57611f2f614a34565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870190915290812080549082905592935090919080821561205d575f8481526004870160205260409020546127109061200f90600160a01b900461ffff1685614e7e565b6120199190614c5e565b915081866007015f8681526020019081526020015f205f82825461203d9190614e49565b9091555061204d90508284615034565b905061205d8560200151826125d5565b61207285602001516109748760600151611054565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206152f98339815191528161216386613a5f565b905061216e8661210f565b61217d57600192505050612108565b5f8681526004830160205260409020546001600160a01b031633146121b55760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a08201516121e491600160b01b90046001600160401b031690615047565b6001600160401b03168160c001516001600160401b0316101561221a576040516302336bad60e51b815260040160405180910390fd5b5f85156122325761222b878661199d565b9050612250565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061227590611054565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156122eb573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061230f9190614c47565b905080846007015f8a81526020019081526020015f205f8282546123339190614e49565b90915550501515979650505050505050565b5f61234e61486a565b5f805160206153198339815191525f8061236a61136f87612665565b91509150801561238d57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156123be576123be614a34565b60058111156123cf576123cf614a34565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561243e5761243e614a34565b1415801561245f575060018151600581111561245c5761245c614a34565b14155b1561247d5760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561249257612492614a34565b036124a057600481526124a5565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff191660018360058111156124ea576124ea614a34565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561259e5761259e614a34565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f805160206152d983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612630575f80fd5b505af1158015610685573d5f803e3d5ffd5b5f805160206152d983398151915254611323906001600160a01b03168383613c9c565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156126c9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126f09190810190614f62565b915091508061271257604051636b2f19e960e01b815260040160405180910390fd5b8151156127325760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561275e5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461278a57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156127d9576127a1816001615034565b6127ac906008614e7e565b61ffff168682815181106127c2576127c2614cdd565b016020015160f81c901b919091179060010161278d565b5061ffff8116156127fd5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561285857612814816003615034565b61281f906008614e7e565b63ffffffff1687612831836002614e49565b8151811061284157612841614cdd565b016020015160f81c901b9190911790600101612800565b5063ffffffff811660041461288057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156128d55761289781601f615034565b6128a2906008614e7e565b886128ae836006614e49565b815181106128be576128be614cdd565b016020015160f81c901b9190911790600101612883565b505f805b6008811015612934576128ed816007615034565b6128f8906008614e7e565b6001600160401b03168961290d836026614e49565b8151811061291d5761291d614cdd565b016020015160f81c901b91909117906001016128d9565b505f805b60088110156129935761294c816007615034565b612957906008614e7e565b6001600160401b03168a61296c83602e614e49565b8151811061297c5761297c614cdd565b016020015160f81c901b9190911790600101612938565b5091989097509095509350505050565b5f81516026146129c657604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612a15576129dd816001615034565b6129e8906008614e7e565b61ffff168482815181106129fe576129fe614cdd565b016020015160f81c901b91909117906001016129c9565b5061ffff811615612a395760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612a9457612a50816003615034565b612a5b906008614e7e565b63ffffffff1685612a6d836002614e49565b81518110612a7d57612a7d614cdd565b016020015160f81c901b9190911790600101612a3c565b5063ffffffff811615612aba57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612b0f57612ad181601f615034565b612adc906008614e7e565b86612ae8836006614e49565b81518110612af857612af8614cdd565b016020015160f81c901b9190911790600101612abd565b50949350505050565b60605f612b2783830184614c98565b612b3391506058614e7e565b612b3e90605c614e49565b6001600160401b03811115612b5557612b55614d0f565b6040519080825280601f01601f191660200182016040528015612b7f576020820181803683370190505b5090505f5b6020811015612bd45783358160208110612ba057612ba0614cdd565b1a60f81b828281518110612bb657612bb6614cdd565b60200101906001600160f81b03191690815f1a905350600101612b84565b505f5b6020811015612c345783602001358160208110612bf657612bf6614cdd565b1a60f81b82612c06836020614e49565b81518110612c1657612c16614cdd565b60200101906001600160f81b03191690815f1a905350600101612bd7565b505f5b6004811015612c9757612c4b816003615034565b612c56906008614e7e565b6014901c60f81b82612c69836040614e49565b81518110612c7957612c79614cdd565b60200101906001600160f81b03191690815f1a905350600101612c37565b505f612ca96060850160408601614c7d565b60601b90505f5b6014811015612d0957818160148110612ccb57612ccb614cdd565b1a60f81b83612cdb836044614e49565b81518110612ceb57612ceb614cdd565b60200101906001600160f81b03191690815f1a905350600101612cb0565b505f612d186060860186614c98565b905090505f5b6004811015612d8357612d32816003615034565b612d3d906008614e7e565b63ffffffff8316901c60f81b84612d55836058614e49565b81518110612d6557612d65614cdd565b60200101906001600160f81b03191690815f1a905350600101612d1e565b505f5b612d936060870187614c98565b9050811015612fa7575f612da8826058614e7e565b612db390605c614e49565b90505f5b6020811015612e3e57612dcd6060890189614c98565b84818110612ddd57612ddd614cdd565b9050602002810190612def9190614cf1565b358160208110612e0157612e01614cdd565b1a60f81b86612e108385614e49565b81518110612e2057612e20614cdd565b60200101906001600160f81b03191690815f1a905350600101612db7565b505f5b6008811015612ef357612e55816007615034565b612e60906008614e7e565b612e6d60608a018a614c98565b85818110612e7d57612e7d614cdd565b9050602002810190612e8f9190614cf1565b612ea09060408101906020016149fb565b6001600160401b0316901c60f81b8682612ebb856020614e49565b612ec59190614e49565b81518110612ed557612ed5614cdd565b60200101906001600160f81b03191690815f1a905350600101612e41565b505f5b6030811015612f9d57612f0c6060890189614c98565b84818110612f1c57612f1c614cdd565b9050602002810190612f2e9190614cf1565b612f3c906040810190615067565b82818110612f4c57612f4c614cdd565b9050013560f81c60f81b8682846028612f659190614e49565b612f6f9190614e49565b81518110612f7f57612f7f614cdd565b60200101906001600160f81b03191690815f1a905350600101612ef6565b5050600101612d86565b5091949350505050565b5f80516020615339833981519152805460011901612fe257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061533983398151915255565b5f5f805160206152f98339815191528161301761023285613cfb565b90505f613023876117c1565b905061302e8761210f565b61304b57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561306057613060614a34565b1461307e5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161308f9190615047565b905083600201600a9054906101000a90046001600160401b031682604001516130b891906150a9565b6001600160401b0316816001600160401b031611156130ea57604051630c192e7760e41b815260040160405180910390fd5b5f806130f68a84611bfe565b915091505f8a8360405160200161312492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156131b7576131b7614a34565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146132e657604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613335576132fd816001615034565b613308906008614e7e565b61ffff1685828151811061331e5761331e614cdd565b016020015160f81c901b91909117906001016132e9565b5061ffff8116156133595760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156133b457613370816003615034565b61337b906008614e7e565b63ffffffff168661338d836002614e49565b8151811061339d5761339d614cdd565b016020015160f81c901b919091179060010161335c565b5063ffffffff81166003146133dc57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613431576133f381601f615034565b6133fe906008614e7e565b8761340a836006614e49565b8151811061341a5761341a614cdd565b016020015160f81c901b91909117906001016133df565b505f8660268151811061344657613446614cdd565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206152f983398151915290600160401b900461ffff90811690861610806134ba575061271061ffff8616115b156134d85760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561350a576040516302336bad60e51b815260040160405180910390fd5b805483108061351c5750806001015483115b1561353a57604051630103be3b60e21b815260040160405180910390fd5b5f61354484613cfb565b90505f613550826108be565b90505f61355d8983613d1e565b905060405180608001604052806135713390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b613634614108565b61363d82614153565b611323816141c4565b5f808251602e1461366a57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136b957613681816001615034565b61368c906008614e7e565b61ffff168582815181106136a2576136a2614cdd565b016020015160f81c901b919091179060010161366d565b5061ffff8116156136dd5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613738576136f4816003615034565b6136ff906008614e7e565b63ffffffff1686613711836002614e49565b8151811061372157613721614cdd565b016020015160f81c901b91909117906001016136e0565b5063ffffffff811660051461376057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137b55761377781601f615034565b613782906008614e7e565b8761378e836006614e49565b8151811061379e5761379e614cdd565b016020015160f81c901b9190911790600101613763565b505f805b6008811015613814576137cd816007615034565b6137d8906008614e7e565b6001600160401b0316886137ed836026614e49565b815181106137fd576137fd614cdd565b016020015160f81c901b91909117906001016137b9565b5090969095509350505050565b5f805160206153198339815191525f6001600160401b0380841690851611156138555761384e8385614bd3565b9050613862565b61385f8484614bd3565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806138c45750600184015481516138c0916001600160401b031690614e49565b8210155b156138ea576001600160401b038316606082015281815260408101516020820152613909565b82816060018181516138fc9190615047565b6001600160401b03169052505b60608101516139199060646150a9565b602082015160018601546001600160401b0392909216916139449190600160401b900460ff16614e7e565b10156139635760405163254d226960e01b815260040160405180910390fd5b856001600160401b03168160400181815161397e9190614e49565b9052506040810180516001600160401b038716919061399e908390615034565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206153598339815191526020526040812060020180545f805160206153198339815191529190600890613a3490600160401b90046001600160401b03166150d4565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b613a6761486a565b5f8281525f805160206153598339815191526020526040808220815160e0810190925280545f8051602061531983398151915293929190829060ff166005811115613ab457613ab4614a34565b6005811115613ac557613ac5614a34565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613b3757613b37614a34565b14613b555760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613b9957613b99614a34565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613c458582611bfe565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526108b991859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614221565b5f6108ce825f805160206152d9833981519152546001600160a01b031690614287565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613d6257604051637fab81e560e01b815260040160405180910390fd5b5f8051602061531983398151915242613d8160408601602087016149fb565b6001600160401b0316111580613dbb5750613d9f6202a30042614e49565b613daf60408601602087016149fb565b6001600160401b031610155b15613dd85760405162d36c8560e81b815260040160405180910390fd5b6030613de76040860186615067565b9050141580613df557508335155b15613e135760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613e4357604051630eb0d31360e11b815260040160405180910390fd5b613e4d835f613821565b5f80613ee66040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e9191906149fb565b6001600160401b03168152602001613eac60408a018a615067565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506143e0565b5f82815260068601602052604090209193509150613f048282615133565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613f42908590600401614c15565b6020604051808303815f875af1158015613f5e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f829190614c47565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613ffa57613ffa614a34565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916140da918e01908e016149fb565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661415157604051631afcd79f60e31b815260040160405180910390fd5b565b61415b614108565b614164816144a3565b61416c6144bc565b6141c16060820135608083013561418960c0850160a086016149fb565b61419960e0860160c087016151ee565b6141aa610100870160e08801615207565b6141bc61012088016101008901614c7d565b6144cc565b50565b6141cc614108565b5f805160206152d98339815191526001600160a01b0382166142015760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6142356001600160a01b038416836145ed565b905080515f141580156142595750808060200190518101906142579190615227565b155b156108b957604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156142cd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142f19190614c47565b90506143086001600160a01b0385163330866145fa565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561434c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143709190614c47565b90508181116143d65760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161427e565b611ec88282615034565b5f606082608001515160301461440957604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161443b9796959493929190615242565b604051602081830303815290604052905060028160405161445c9190614e38565b602060405180830381855afa158015614477573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061449a9190614c47565b94909350915050565b6144ab614108565b6144b3614633565b6141c18161463b565b6144c4614108565b61415161470d565b6144d4614108565b5f805160206152f983398151915261ffff841615806144f8575061271061ffff8516115b156145165760405163c98d73a760e01b815260040160405180910390fd5b8587111561453757604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061454a5750600a60ff8416115b15614568576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061210883835f614715565b6040516001600160a01b0384811660248301528381166044830152606482018390526108489186918216906323b872dd90608401613cc9565b614151614108565b614643614108565b80355f8051602061531983398151915290815560146146686060840160408501615207565b60ff16118061468757506146826060830160408401615207565b60ff16155b156146a55760405163b4fa3fb360e01b815260040160405180910390fd5b6146b56060830160408401615207565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556146e660408301602084016149fb565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612fe8614108565b60608147101561473a5760405163cd78605960e01b815230600482015260240161427e565b5f80856001600160a01b031684866040516147559190614e38565b5f6040518083038185875af1925050503d805f811461478f576040519150601f19603f3d011682016040523d82523d5f602084013e614794565b606091505b50915091506147a48683836147ae565b9695505050505050565b6060826147c3576147be8261480a565b612108565b81511580156147da57506001600160a01b0384163b155b1561480357604051639996b31560e01b81526001600160a01b038516600482015260240161427e565b5080612108565b80511561481a5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461483f90614e95565b5f825580601f1061484e575050565b601f0160209004905f5260205f20908101906141c191906148a6565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156148ba575f81556001016148a7565b5090565b80151581146141c1575f80fd5b803563ffffffff811681146148de575f80fd5b919050565b5f805f606084860312156148f5575f80fd5b833592506020840135614907816148be565b9150614915604085016148cb565b90509250925092565b5f6020828403121561492e575f80fd5b5035919050565b5f8060408385031215614946575f80fd5b82359150614956602084016148cb565b90509250929050565b5f6020828403121561496f575f80fd5b612108826148cb565b5f8060408385031215614989575f80fd5b614992836148cb565b946020939093013593505050565b5f80604083850312156149b1575f80fd5b82356001600160401b038111156149c6575f80fd5b8301608081860312156149d7575f80fd5b9150614956602084016148cb565b80356001600160401b03811681146148de575f80fd5b5f60208284031215614a0b575f80fd5b612108826149e5565b5f8060408385031215614a25575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614a6b57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614aa660608401826001600160401b03169052565b506080830151614ac160808401826001600160401b03169052565b5060a0830151614adc60a08401826001600160401b03169052565b5060c083015161275e60c08401826001600160401b03169052565b803561ffff811681146148de575f80fd5b5f805f8060808587031215614b1b575f80fd5b84356001600160401b03811115614b30575f80fd5b850160608188031215614b41575f80fd5b9350614b4f60208601614af7565b9250614b5d604086016149e5565b9396929550929360600135925050565b6001600160a01b03811681146141c1575f80fd5b5f80828403610140811215614b94575f80fd5b61012080821215614ba3575f80fd5b8493508301359050614bb481614b6d565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561275e5761275e614bbf565b5f5b83811015614c0d578181015183820152602001614bf5565b50505f910152565b602081525f8251806020840152614c33816040850160208701614bf3565b601f01601f19169190910160400192915050565b5f60208284031215614c57575f80fd5b5051919050565b5f82614c7857634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614c8d575f80fd5b813561210881614b6d565b5f808335601e19843603018112614cad575f80fd5b8301803591506001600160401b03821115614cc6575f80fd5b6020019150600581901b3603821315611d4e575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614d05575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614d4557614d45614d0f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614d7357614d73614d0f565b604052919050565b5f6001600160401b03821115614d9357614d93614d0f565b50601f01601f191660200190565b5f60608236031215614db1575f80fd5b614db9614d23565b823581526020614dca8185016149e5565b8183015260408401356001600160401b03811115614de6575f80fd5b840136601f820112614df6575f80fd5b8035614e09614e0482614d7b565b614d4b565b8181523684838501011115614e1c575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614d05818460208701614bf3565b808201808211156108ce576108ce614bbf565b5f63ffffffff808316818103614e7457614e74614bbf565b6001019392505050565b80820281158282048414176108ce576108ce614bbf565b600181811c90821680614ea957607f821691505b602082108103614ec757634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614edf81614e95565b806020870152604060018084165f8114614f005760018114614f1c57614f49565b60ff19851660408a0152604084151560051b8a01019550614f49565b895f5260205f205f5b85811015614f405781548b8201860152908301908801614f25565b8a016040019650505b509398975050505050505050565b80516148de816148be565b5f8060408385031215614f73575f80fd5b82516001600160401b0380821115614f89575f80fd5b9084019060608287031215614f9c575f80fd5b614fa4614d23565b82518152602080840151614fb781614b6d565b82820152604084015183811115614fcc575f80fd5b80850194505087601f850112614fe0575f80fd5b83519250614ff0614e0484614d7b565b8381528882858701011115615003575f80fd5b61501284838301848801614bf3565b80604084015250819550615027818801614f57565b9450505050509250929050565b818103818111156108ce576108ce614bbf565b6001600160401b0381811683821601908082111561275e5761275e614bbf565b5f808335601e1984360301811261507c575f80fd5b8301803591506001600160401b03821115615095575f80fd5b602001915036819003821315611d4e575f80fd5b6001600160401b038181168382160280821691908281146150cc576150cc614bbf565b505092915050565b5f6001600160401b03808316818103614e7457614e74614bbf565b601f8211156108b957805f5260205f20601f840160051c810160208510156151145750805b601f840160051c820191505b81811015610979575f8155600101615120565b81516001600160401b0381111561514c5761514c614d0f565b6151608161515a8454614e95565b846150ef565b602080601f831160018114615193575f841561517c5750858301515b5f19600386901b1c1916600185901b178555610aac565b5f85815260208120601f198616915b828110156151c1578886015182559484019460019091019084016151a2565b50858210156151de57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156151fe575f80fd5b61210882614af7565b5f60208284031215615217575f80fd5b813560ff81168114612108575f80fd5b5f60208284031215615237575f80fd5b8151612108816148be565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161529781604e860160208901614bf3565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516154da3803806154da83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61538d8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c806376f78621116100fe578063ba3a4b971161009e578063df93d8de1161006e578063df93d8de146103ea578063e7d14c1c146103f4578063eb0acb8914610432578063f09969ae14610445575f80fd5b8063ba3a4b971461039c578063bee0a03f146103af578063c974d1b6146103c2578063d5f20ff6146103ca575f80fd5b806398f3e2b4116100d957806398f3e2b41461033d5780639e1bc4ef14610350578063a3a65e4814610363578063b771b3bc14610376575f80fd5b806376f786211461030f5780638280a25a1461032257806393e245981461032a575f80fd5b8063467ef06f1161016957806361e2f4901161014457806361e2f490146102c157806362065856146102d457806366435abf146102f5578063732214f814610308575f80fd5b8063467ef06f1461027e5780635297fae61461029157806360305d62146102a4575f80fd5b806325e1c776116101a457806325e1c776146102115780632e2194d81461022457806335455ded1461024f5780633a1cfff61461026b575f80fd5b80630118acc4146101ca5780630322ed98146101df578063151d30d1146101f2575b5f80fd5b6101dd6101d83660046148eb565b610458565b005b6101dd6101ed366004614926565b6106d4565b6101fa600a81565b60405160ff90911681526020015b60405180910390f35b6101dd61021f36600461493d565b610846565b610237610232366004614926565b6108b6565b6040516001600160401b039091168152602001610208565b61025861271081565b60405161ffff9091168152602001610208565b6101dd6102793660046148eb565b6108cc565b6101dd61028c366004614967565b6108d7565b6101dd61029f366004614980565b610978565b6102ac601481565b60405163ffffffff9091168152602001610208565b6101dd6102cf3660046149a8565b610bcd565b6102e76102e2366004614a03565b61104c565b604051908152602001610208565b610237610303366004614926565b611065565b6102e75f81565b6101dd61031d3660046148eb565b611079565b6101fa603081565b6101dd610338366004614926565b6110a1565b6101dd61034b366004614980565b611158565b6102e761035e366004614a1c565b61131f565b6101dd610371366004614967565b61134b565b6103846005600160991b0181565b6040516001600160a01b039091168152602001610208565b6101dd6103aa366004614926565b6114b8565b6101dd6103bd366004614926565b611694565b6101fa601481565b6103dd6103d8366004614926565b6117b9565b6040516102089190614a50565b6102376202a30081565b6102e7610402366004614926565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102e7610440366004614b10565b611881565b6101dd610453366004614b89565b6118b6565b5f8381525f805160206152c18339815191526020526040808220815160e0810190925280545f8051602061530183398151915293929190829060ff1660038111156104a5576104a5614a3c565b60038111156104b6576104b6614a3c565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61052c826117b9565b905060028351600381111561054357610543614a3c565b146105615760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b0316331461058e5760405163e6c4247b60e01b815260040160405180910390fd5b6002815160058111156105a3576105a3614a3c565b036106765785156105ba576105b88286611995565b505b5f8781526005850160205260409020805460ff19166003179055606083015160808201516105f39184916105ee9190614bdb565b611bf6565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561063383611d4d565b5f888152600686016020526040808220929092559051839189917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed579190a36106b2565b60048151600581111561068b5761068b614a3c565b036106bb5761069983611d4d565b5f8881526006860160205260409020556106b287611ed9565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b5f8181525f805160206153618339815191526020526040808220815160e0810190925280545f8051602061532183398151915293929190829060ff16600581111561072157610721614a3c565b600581111561073257610732614a3c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156107a1576107a1614a3c565b146107bf5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107e48584606001515f6120c0565b6040518263ffffffff1660e01b81526004016108009190614c1d565b6020604051808303815f875af115801561081c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108409190614c4f565b50505050565b61084f82612117565b61086c57604051636ca57bcf60e01b815260040160405180910390fd5b6002610877836117b9565b51600581111561088957610889614a3c565b146108a75760405163a36c527f60e01b815260040160405180910390fd5b6108b18282611995565b505050565b5f6108c664e8d4a5100083614c66565b92915050565b610840838383612152565b5f805160206153018339815191525f806108f08461234d565b915091506108fd82612117565b6109075750505050565b5f82815260048085016020526040909120546001600160a01b0316908251600581111561093657610936614a3c565b0361095b575f8381526007850160205260408120805491905561095982826125dd565b505b6109718161096c846040015161104c565b61264a565b5050505050565b5f8181525f805160206152c18339815191526020526040808220815160e0810190925280545f8051602061530183398151915293929190829060ff1660038111156109c5576109c5614a3c565b60038111156109d6576109d6614a3c565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610a4c826117b9565b9050600183516003811115610a6357610a63614a3c565b14610a815760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610a9657610a96614a3c565b03610aac57610aa485611ed9565b505050505050565b5f80610ac3610aba8961266d565b6040015161276d565b5091509150818414610ae857604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610b215750806001600160401b03168560a001516001600160401b0316115b15610b3f57604051633ab3447f60e11b815260040160405180910390fd5b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206153218339815191529060ff1615610c1f57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c869190614c4f565b836020013514610ca95760405163d040949d60e01b815260040160405180910390fd5b30610cba6060850160408601614c85565b6001600160a01b031614610ce15760405163e6c4247b60e01b815260040160405180910390fd5b5f610cef6060850185614ca0565b905090505f805b828163ffffffff161015610f9b575f610d126060880188614ca0565b8363ffffffff16818110610d2857610d28614ce5565b9050602002810190610d3a9190614cf9565b610d4390614da9565b80515f8181526008880160205260409020549192509015610d7757604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610da692919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610dc091614e40565b602060405180830381855afa158015610ddb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610dfe9190614c4f565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610e8a57610e8a614a3c565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610f3d911686614e51565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610f9490614e64565b9050610cf6565b50600483018190555f610fb9610fb08661266d565b604001516129ab565b90505f610fc587612b20565b905081600282604051610fd89190614e40565b602060405180830381855afa158015610ff3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110169190614c4f565b1461103457604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f6108c66001600160401b03831664e8d4a51000614e86565b5f61106f826117b9565b6080015192915050565b611084838383612152565b6108b15760405163d802b9f360e01b815260040160405180910390fd5b5f8051602061530183398151915260046110ba836117b9565b5160058111156110cc576110cc614a3c565b146110ea5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146111225760405163e6c4247b60e01b815260040160405180910390fd5b5f828152600782016020908152604080832080549084905560048501909252909120546108b1906001600160a01b0316826125dd565b611160612fb9565b5f8181525f805160206152c18339815191526020526040808220815160e0810190925280545f8051602061530183398151915293929190829060ff1660038111156111ad576111ad614a3c565b60038111156111be576111be614a3c565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561123757611237614a3c565b146112555760405163f95c7fe160e01b815260040160405180910390fd5b600461126482604001516117b9565b51600581111561127657611276614a3c565b146112fa575f6112858561266d565b90505f80611296836040015161276d565b5091509150818460400151146112bf57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156112f657604051633ab3447f60e11b815260040160405180910390fd5b5050505b61130383611ed9565b505061131b60015f8051602061534183398151915255565b5050565b5f611328612fb9565b611333833384613003565b90506108c660015f8051602061534183398151915255565b5f805160206153218339815191525f806113706113678561266d565b604001516132ca565b915091508061139257604051633dbcaef760e01b815260040160405180910390fd5b5f828152600684016020526040902080546113ac90614e9d565b90505f036113cd57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff1660058111156113f3576113f3614a3c565b146114115760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068401602052604081206114299161483b565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206152c18339815191526020526040808220815160e0810190925280545f8051602061530183398151915293929190829060ff16600381111561150557611505614a3c565b600381111561151657611516614a3c565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561158f5761158f614a3c565b141580156115b057506003815160038111156115ad576115ad614a3c565b14155b156115ce5760405163f95c7fe160e01b815260040160405180910390fd5b5f6115dc82604001516117b9565b905080606001516001600160401b03165f0361160b57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6116388460400151846060015185608001516120c0565b6040518263ffffffff1660e01b81526004016116549190614c1d565b6020604051808303815f875af1158015611670573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109719190614c4f565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061532183398151915291906116db90614e9d565b90505f036116fc57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561172257611722614a3c565b146117405760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916117799190600401614ed5565b6020604051808303815f875af1158015611795573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108b19190614c4f565b6117c1614872565b5f8281525f80516020615361833981519152602052604090819020815160e0810190925280545f80516020615321833981519152929190829060ff16600581111561180e5761180e614a3c565b600581111561181f5761181f614a3c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61188a612fb9565b6118968585858561346e565b90506118ae60015f8051602061534183398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806118ff575080546001600160401b03808416911610155b1561191d5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119488484613634565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156119e0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a079190810190614f6a565b9150915080611a2957604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a6c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a909190614c4f565b825114611ab05760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611adc5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611aeb846040015161364e565b91509150818714611b0f57604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615301833981519152906001600160401b039081169083161115611bcc575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611beb565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f8281525f80516020615361833981519152602052604081206002015481905f8051602061532183398151915290600160801b90046001600160401b0316611c3e8582613829565b5f611c48876139f2565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611c988a858b6120c0565b6040518263ffffffff1660e01b8152600401611cb49190614c1d565b6020604051808303815f875af1158015611cd0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611cf49190614c4f565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f8051602061530183398151915290505f611d6d84604001516117b9565b90505f600382516005811115611d8557611d85614a3c565b1480611da35750600482516005811115611da157611da1614a3c565b145b15611db3575060c0810151611dd0565b600282516005811115611dc857611dc8614a3c565b036106bb5750425b84608001516001600160401b0316816001600160401b031611611df757505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590611e1c9061104c565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015611eac573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ed09190614c4f565b95945050505050565b5f8181525f805160206152c18339815191526020526040808220815160e0810190925280545f8051602061530183398151915293929190829060ff166003811115611f2657611f26614a3c565b6003811115611f3757611f37614a3c565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612065575f8481526004870160205260409020546127109061201790600160a01b900461ffff1685614e86565b6120219190614c66565b915081866007015f8681526020019081526020015f205f8282546120459190614e51565b909155506120559050828461503c565b90506120658560200151826125dd565b61207a856020015161096c876060015161104c565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206153018339815191528161216b86613a67565b905061217686612117565b61218557600192505050612110565b5f8681526004830160205260409020546001600160a01b031633146121bd5760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a08201516121ec91600160b01b90046001600160401b03169061504f565b6001600160401b03168160c001516001600160401b03161015612222576040516302336bad60e51b815260040160405180910390fd5b5f851561223a576122338786611995565b9050612258565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061227d9061104c565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156122f3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123179190614c4f565b905080846007015f8a81526020019081526020015f205f82825461233b9190614e51565b90915550501515979650505050505050565b5f612356614872565b5f805160206153218339815191525f806123726113678761266d565b91509150801561239557604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156123c6576123c6614a3c565b60058111156123d7576123d7614a3c565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561244657612446614a3c565b14158015612467575060018151600581111561246457612464614a3c565b14155b156124855760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561249a5761249a614a3c565b036124a857600481526124ad565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff191660018360058111156124f2576124f2614a3c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156125a6576125a6614a3c565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f805160206152e183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612638575f80fd5b505af11580156106b2573d5f803e3d5ffd5b5f805160206152e18339815191525461131b906001600160a01b03168383613ca4565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156126d1573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526126f89190810190614f6a565b915091508061271a57604051636b2f19e960e01b815260040160405180910390fd5b81511561273a5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156127665760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461279257604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156127e1576127a981600161503c565b6127b4906008614e86565b61ffff168682815181106127ca576127ca614ce5565b016020015160f81c901b9190911790600101612795565b5061ffff8116156128055760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156128605761281c81600361503c565b612827906008614e86565b63ffffffff1687612839836002614e51565b8151811061284957612849614ce5565b016020015160f81c901b9190911790600101612808565b5063ffffffff811660041461288857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156128dd5761289f81601f61503c565b6128aa906008614e86565b886128b6836006614e51565b815181106128c6576128c6614ce5565b016020015160f81c901b919091179060010161288b565b505f805b600881101561293c576128f581600761503c565b612900906008614e86565b6001600160401b031689612915836026614e51565b8151811061292557612925614ce5565b016020015160f81c901b91909117906001016128e1565b505f805b600881101561299b5761295481600761503c565b61295f906008614e86565b6001600160401b03168a61297483602e614e51565b8151811061298457612984614ce5565b016020015160f81c901b9190911790600101612940565b5091989097509095509350505050565b5f81516026146129ce57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612a1d576129e581600161503c565b6129f0906008614e86565b61ffff16848281518110612a0657612a06614ce5565b016020015160f81c901b91909117906001016129d1565b5061ffff811615612a415760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612a9c57612a5881600361503c565b612a63906008614e86565b63ffffffff1685612a75836002614e51565b81518110612a8557612a85614ce5565b016020015160f81c901b9190911790600101612a44565b5063ffffffff811615612ac257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612b1757612ad981601f61503c565b612ae4906008614e86565b86612af0836006614e51565b81518110612b0057612b00614ce5565b016020015160f81c901b9190911790600101612ac5565b50949350505050565b60605f612b2f83830184614ca0565b612b3b91506058614e86565b612b4690605c614e51565b6001600160401b03811115612b5d57612b5d614d17565b6040519080825280601f01601f191660200182016040528015612b87576020820181803683370190505b5090505f5b6020811015612bdc5783358160208110612ba857612ba8614ce5565b1a60f81b828281518110612bbe57612bbe614ce5565b60200101906001600160f81b03191690815f1a905350600101612b8c565b505f5b6020811015612c3c5783602001358160208110612bfe57612bfe614ce5565b1a60f81b82612c0e836020614e51565b81518110612c1e57612c1e614ce5565b60200101906001600160f81b03191690815f1a905350600101612bdf565b505f5b6004811015612c9f57612c5381600361503c565b612c5e906008614e86565b6014901c60f81b82612c71836040614e51565b81518110612c8157612c81614ce5565b60200101906001600160f81b03191690815f1a905350600101612c3f565b505f612cb16060850160408601614c85565b60601b90505f5b6014811015612d1157818160148110612cd357612cd3614ce5565b1a60f81b83612ce3836044614e51565b81518110612cf357612cf3614ce5565b60200101906001600160f81b03191690815f1a905350600101612cb8565b505f612d206060860186614ca0565b905090505f5b6004811015612d8b57612d3a81600361503c565b612d45906008614e86565b63ffffffff8316901c60f81b84612d5d836058614e51565b81518110612d6d57612d6d614ce5565b60200101906001600160f81b03191690815f1a905350600101612d26565b505f5b612d9b6060870187614ca0565b9050811015612faf575f612db0826058614e86565b612dbb90605c614e51565b90505f5b6020811015612e4657612dd56060890189614ca0565b84818110612de557612de5614ce5565b9050602002810190612df79190614cf9565b358160208110612e0957612e09614ce5565b1a60f81b86612e188385614e51565b81518110612e2857612e28614ce5565b60200101906001600160f81b03191690815f1a905350600101612dbf565b505f5b6008811015612efb57612e5d81600761503c565b612e68906008614e86565b612e7560608a018a614ca0565b85818110612e8557612e85614ce5565b9050602002810190612e979190614cf9565b612ea8906040810190602001614a03565b6001600160401b0316901c60f81b8682612ec3856020614e51565b612ecd9190614e51565b81518110612edd57612edd614ce5565b60200101906001600160f81b03191690815f1a905350600101612e49565b505f5b6030811015612fa557612f146060890189614ca0565b84818110612f2457612f24614ce5565b9050602002810190612f369190614cf9565b612f4490604081019061506f565b82818110612f5457612f54614ce5565b9050013560f81c60f81b8682846028612f6d9190614e51565b612f779190614e51565b81518110612f8757612f87614ce5565b60200101906001600160f81b03191690815f1a905350600101612efe565b5050600101612d8e565b5091949350505050565b5f80516020615341833981519152805460011901612fea57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061534183398151915255565b5f5f805160206153018339815191528161301f61023285613d03565b90505f61302b876117b9565b905061303687612117565b61305357604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561306857613068614a3c565b146130865760405163a36c527f60e01b815260040160405180910390fd5b5f828260800151613097919061504f565b905083600201600a9054906101000a90046001600160401b031682604001516130c091906150b1565b6001600160401b0316816001600160401b031611156130f257604051630c192e7760e41b815260040160405180910390fd5b5f806130fe8a84611bf6565b915091505f8a8360405160200161312c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156131bf576131bf614a3c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146132ee57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561333d5761330581600161503c565b613310906008614e86565b61ffff1685828151811061332657613326614ce5565b016020015160f81c901b91909117906001016132f1565b5061ffff8116156133615760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156133bc5761337881600361503c565b613383906008614e86565b63ffffffff1686613395836002614e51565b815181106133a5576133a5614ce5565b016020015160f81c901b9190911790600101613364565b5063ffffffff81166003146133e457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613439576133fb81601f61503c565b613406906008614e86565b87613412836006614e51565b8151811061342257613422614ce5565b016020015160f81c901b91909117906001016133e7565b505f8660268151811061344e5761344e614ce5565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061530183398151915290600160401b900461ffff90811690861610806134c2575061271061ffff8616115b156134e05760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613512576040516302336bad60e51b815260040160405180910390fd5b80548310806135245750806001015483115b1561354257604051630103be3b60e21b815260040160405180910390fd5b5f61354c84613d03565b90505f613558826108b6565b90505f6135658983613d26565b905060405180608001604052806135793390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b61363c614110565b6136458261415b565b61131b816141cc565b5f808251602e1461367257604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136c15761368981600161503c565b613694906008614e86565b61ffff168582815181106136aa576136aa614ce5565b016020015160f81c901b9190911790600101613675565b5061ffff8116156136e55760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613740576136fc81600361503c565b613707906008614e86565b63ffffffff1686613719836002614e51565b8151811061372957613729614ce5565b016020015160f81c901b91909117906001016136e8565b5063ffffffff811660051461376857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137bd5761377f81601f61503c565b61378a906008614e86565b87613796836006614e51565b815181106137a6576137a6614ce5565b016020015160f81c901b919091179060010161376b565b505f805b600881101561381c576137d581600761503c565b6137e0906008614e86565b6001600160401b0316886137f5836026614e51565b8151811061380557613805614ce5565b016020015160f81c901b91909117906001016137c1565b5090969095509350505050565b5f805160206153218339815191525f6001600160401b03808416908516111561385d576138568385614bdb565b905061386a565b6138678484614bdb565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806138cc5750600184015481516138c8916001600160401b031690614e51565b8210155b156138f2576001600160401b038316606082015281815260408101516020820152613911565b8281606001818151613904919061504f565b6001600160401b03169052505b60608101516139219060646150b1565b602082015160018601546001600160401b03929092169161394c9190600160401b900460ff16614e86565b101561396b5760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516139869190614e51565b9052506040810180516001600160401b03871691906139a690839061503c565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206153618339815191526020526040812060020180545f805160206153218339815191529190600890613a3c90600160401b90046001600160401b03166150dc565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b613a6f614872565b5f8281525f805160206153618339815191526020526040808220815160e0810190925280545f8051602061532183398151915293929190829060ff166005811115613abc57613abc614a3c565b6005811115613acd57613acd614a3c565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613b3f57613b3f614a3c565b14613b5d5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ba157613ba1614a3c565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613c4d8582611bf6565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526108b191859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614229565b5f6108c6825f805160206152e1833981519152546001600160a01b03169061428f565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613d6a57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061532183398151915242613d896040860160208701614a03565b6001600160401b0316111580613dc35750613da76202a30042614e51565b613db76040860160208701614a03565b6001600160401b031610155b15613de05760405162d36c8560e81b815260040160405180910390fd5b6030613def604086018661506f565b9050141580613dfd57508335155b15613e1b5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613e4b57604051630eb0d31360e11b815260040160405180910390fd5b613e55835f613829565b5f80613eee6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e999190614a03565b6001600160401b03168152602001613eb460408a018a61506f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506143e8565b5f82815260068601602052604090209193509150613f0c828261513b565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613f4a908590600401614c1d565b6020604051808303815f875af1158015613f66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f8a9190614c4f565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561400257614002614a3c565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916140e2918e01908e01614a03565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661415957604051631afcd79f60e31b815260040160405180910390fd5b565b614163614110565b61416c816144ab565b6141746144c4565b6141c96060820135608083013561419160c0850160a08601614a03565b6141a160e0860160c087016151f6565b6141b2610100870160e0880161520f565b6141c461012088016101008901614c85565b6144d4565b50565b6141d4614110565b5f805160206152e18339815191526001600160a01b0382166142095760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f61423d6001600160a01b038416836145f5565b905080515f1415801561426157508080602001905181019061425f919061522f565b155b156108b157604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156142d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142f99190614c4f565b90506143106001600160a01b038516333086614602565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614354573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143789190614c4f565b90508181116143de5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b6064820152608401614286565b611ed0828261503c565b5f606082608001515160301461441157604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614443979695949392919061524a565b60405160208183030381529060405290506002816040516144649190614e40565b602060405180830381855afa15801561447f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906144a29190614c4f565b94909350915050565b6144b3614110565b6144bb61463b565b6141c981614643565b6144cc614110565b614159614715565b6144dc614110565b5f8051602061530183398151915261ffff84161580614500575061271061ffff8516115b1561451e5760405163c98d73a760e01b815260040160405180910390fd5b8587111561453f57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806145525750600a60ff8416115b15614570576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b606061211083835f61471d565b6040516001600160a01b0384811660248301528381166044830152606482018390526108409186918216906323b872dd90608401613cd1565b614159614110565b61464b614110565b80355f805160206153218339815191529081556014614670606084016040850161520f565b60ff16118061468f575061468a606083016040840161520f565b60ff16155b156146ad5760405163b4fa3fb360e01b815260040160405180910390fd5b6146bd606083016040840161520f565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556146ee6040830160208401614a03565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ff0614110565b6060814710156147425760405163cd78605960e01b8152306004820152602401614286565b5f80856001600160a01b0316848660405161475d9190614e40565b5f6040518083038185875af1925050503d805f8114614797576040519150601f19603f3d011682016040523d82523d5f602084013e61479c565b606091505b50915091506147ac8683836147b6565b9695505050505050565b6060826147cb576147c682614812565b612110565b81511580156147e257506001600160a01b0384163b155b1561480b57604051639996b31560e01b81526001600160a01b0385166004820152602401614286565b5080612110565b8051156148225780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b50805461484790614e9d565b5f825580601f10614856575050565b601f0160209004905f5260205f20908101906141c991906148ae565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156148c2575f81556001016148af565b5090565b80151581146141c9575f80fd5b803563ffffffff811681146148e6575f80fd5b919050565b5f805f606084860312156148fd575f80fd5b83359250602084013561490f816148c6565b915061491d604085016148d3565b90509250925092565b5f60208284031215614936575f80fd5b5035919050565b5f806040838503121561494e575f80fd5b8235915061495e602084016148d3565b90509250929050565b5f60208284031215614977575f80fd5b612110826148d3565b5f8060408385031215614991575f80fd5b61499a836148d3565b946020939093013593505050565b5f80604083850312156149b9575f80fd5b82356001600160401b038111156149ce575f80fd5b8301608081860312156149df575f80fd5b915061495e602084016148d3565b80356001600160401b03811681146148e6575f80fd5b5f60208284031215614a13575f80fd5b612110826149ed565b5f8060408385031215614a2d575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614a7357634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614aae60608401826001600160401b03169052565b506080830151614ac960808401826001600160401b03169052565b5060a0830151614ae460a08401826001600160401b03169052565b5060c083015161276660c08401826001600160401b03169052565b803561ffff811681146148e6575f80fd5b5f805f8060808587031215614b23575f80fd5b84356001600160401b03811115614b38575f80fd5b850160608188031215614b49575f80fd5b9350614b5760208601614aff565b9250614b65604086016149ed565b9396929550929360600135925050565b6001600160a01b03811681146141c9575f80fd5b5f80828403610140811215614b9c575f80fd5b61012080821215614bab575f80fd5b8493508301359050614bbc81614b75565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561276657612766614bc7565b5f5b83811015614c15578181015183820152602001614bfd565b50505f910152565b602081525f8251806020840152614c3b816040850160208701614bfb565b601f01601f19169190910160400192915050565b5f60208284031215614c5f575f80fd5b5051919050565b5f82614c8057634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614c95575f80fd5b813561211081614b75565b5f808335601e19843603018112614cb5575f80fd5b8301803591506001600160401b03821115614cce575f80fd5b6020019150600581901b3603821315611d46575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614d0d575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614d4d57614d4d614d17565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614d7b57614d7b614d17565b604052919050565b5f6001600160401b03821115614d9b57614d9b614d17565b50601f01601f191660200190565b5f60608236031215614db9575f80fd5b614dc1614d2b565b823581526020614dd28185016149ed565b8183015260408401356001600160401b03811115614dee575f80fd5b840136601f820112614dfe575f80fd5b8035614e11614e0c82614d83565b614d53565b8181523684838501011115614e24575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614d0d818460208701614bfb565b808201808211156108c6576108c6614bc7565b5f63ffffffff808316818103614e7c57614e7c614bc7565b6001019392505050565b80820281158282048414176108c6576108c6614bc7565b600181811c90821680614eb157607f821691505b602082108103614ecf57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614ee781614e9d565b806020870152604060018084165f8114614f085760018114614f2457614f51565b60ff19851660408a0152604084151560051b8a01019550614f51565b895f5260205f205f5b85811015614f485781548b8201860152908301908801614f2d565b8a016040019650505b509398975050505050505050565b80516148e6816148c6565b5f8060408385031215614f7b575f80fd5b82516001600160401b0380821115614f91575f80fd5b9084019060608287031215614fa4575f80fd5b614fac614d2b565b82518152602080840151614fbf81614b75565b82820152604084015183811115614fd4575f80fd5b80850194505087601f850112614fe8575f80fd5b83519250614ff8614e0c84614d83565b838152888285870101111561500b575f80fd5b61501a84838301848801614bfb565b8060408401525081955061502f818801614f5f565b9450505050509250929050565b818103818111156108c6576108c6614bc7565b6001600160401b0381811683821601908082111561276657612766614bc7565b5f808335601e19843603018112615084575f80fd5b8301803591506001600160401b0382111561509d575f80fd5b602001915036819003821315611d46575f80fd5b6001600160401b038181168382160280821691908281146150d4576150d4614bc7565b505092915050565b5f6001600160401b03808316818103614e7c57614e7c614bc7565b601f8211156108b157805f5260205f20601f840160051c8101602085101561511c5750805b601f840160051c820191505b81811015610971575f8155600101615128565b81516001600160401b0381111561515457615154614d17565b615168816151628454614e9d565b846150f7565b602080601f83116001811461519b575f84156151845750858301515b5f19600386901b1c1916600185901b178555610aa4565b5f85815260208120601f198616915b828110156151c9578886015182559484019460019091019084016151aa565b50858210156151e657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215615206575f80fd5b61211082614aff565b5f6020828403121561521f575f80fd5b813560ff81168114612110575f80fd5b5f6020828403121561523f575f80fd5b8151612110816148c6565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161529f81604e860160208901614bfb565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 43bc12358..7a96594f4 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516151ea3803806151ea83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61509d8061014d5f395ff3fe6080604052600436106101c5575f3560e01c806366435abf116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b614610515578063d5f20ff614610529578063df93d8de14610555578063e7d14c1c1461056b575f80fd5b8063b771b3bc146104aa578063ba3a4b97146104c4578063bee0a03f146104e3578063c599e24f14610502575f80fd5b80638280a25a116100cd5780638280a25a1461043957806393e245981461044d57806398f3e2b41461046c578063a3a65e481461048b575f80fd5b806366435abf146103e8578063732214f81461040757806376f786211461041a575f80fd5b806335455ded116101685780635297fae6116101385780635297fae61461036257806360305d621461038157806361e2f490146103aa57806362065856146103c9575f80fd5b806335455ded146102db5780633a1cfff61461030357806340034a9314610322578063467ef06f14610343575f80fd5b806320e55565116101a357806320e555651461023457806325e1c776146102535780632e2194d814610272578063329c3e12146102a9575f80fd5b80630118acc4146101c95780630322ed98146101ea578063151d30d114610209575b5f80fd5b3480156101d4575f80fd5b506101e86101e3366004614694565b6105b5565b005b3480156101f5575f80fd5b506101e86102043660046146cf565b610839565b348015610214575f80fd5b5061021d600a81565b60405160ff90911681526020015b60405180910390f35b34801561023f575f80fd5b506101e861024e3660046146e6565b6109ab565b34801561025e575f80fd5b506101e861026d3660046146fd565b610a88565b34801561027d575f80fd5b5061029161028c3660046146cf565b610af8565b6040516001600160401b03909116815260200161022b565b3480156102b4575f80fd5b506102c36001600160991b0181565b6040516001600160a01b03909116815260200161022b565b3480156102e6575f80fd5b506102f061271081565b60405161ffff909116815260200161022b565b34801561030e575f80fd5b506101e861031d366004614694565b610b0e565b61033561033036600461474e565b610b19565b60405190815260200161022b565b34801561034e575f80fd5b506101e861035d3660046147a2565b610b4d565b34801561036d575f80fd5b506101e861037c3660046147bb565b610bee565b34801561038c575f80fd5b50610395601481565b60405163ffffffff909116815260200161022b565b3480156103b5575f80fd5b506101e86103c43660046147e3565b610e43565b3480156103d4575f80fd5b506103356103e3366004614828565b6112c2565b3480156103f3575f80fd5b506102916104023660046146cf565b6112db565b348015610412575f80fd5b506103355f81565b348015610425575f80fd5b506101e8610434366004614694565b6112ef565b348015610444575f80fd5b5061021d603081565b348015610458575f80fd5b506101e86104673660046146cf565b611317565b348015610477575f80fd5b506101e86104863660046147bb565b6113ce565b348015610496575f80fd5b506101e86104a53660046147a2565b611595565b3480156104b5575f80fd5b506102c36005600160991b0181565b3480156104cf575f80fd5b506101e86104de3660046146cf565b611702565b3480156104ee575f80fd5b506101e86104fd3660046146cf565b6118de565b6103356105103660046146cf565b611a03565b348015610520575f80fd5b5061021d601481565b348015610534575f80fd5b506105486105433660046146cf565b611a34565b60405161022b9190614855565b348015610560575f80fd5b506102916202a30081565b348015610576575f80fd5b506103356105853660046146cf565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614ff18339815191526020526040808220815160e0810190925280545f8051602061501183398151915293929190829060ff16600381111561060257610602614841565b600381111561061357610613614841565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61068982611a34565b90506002835160038111156106a0576106a0614841565b146106be5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106eb5760405163e6c4247b60e01b815260040160405180910390fd5b5f87815260058581016020526040909120805460ff19166003179055815160029181111561071b5761071b614841565b036107a5578515610732576107308286611afc565b505b61074f828460600151836080015161074a9190614918565b611d5d565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b039092169190911790556107908382611eb4565b5f888152600686016020526040902055610804565b6004815160058111156107ba576107ba614841565b036107eb576107c98382611eb4565b5f8881526006860160205260409020556107e287612030565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b604051829088907f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed57905f90a350505050505050565b5f8181525f805160206150718339815191526020526040808220815160e0810190925280545f8051602061503183398151915293929190829060ff16600581111561088657610886614841565b600581111561089757610897614841565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561090657610906614841565b146109245760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109498584606001515f612217565b6040518263ffffffff1660e01b8152600401610965919061495a565b6020604051808303815f875af1158015610981573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109a5919061498c565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109f4575080546001600160401b03808416911610155b15610a125760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a3c83612266565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610a918261227a565b610aae57604051636ca57bcf60e01b815260040160405180910390fd5b6002610ab983611a34565b516005811115610acb57610acb614841565b14610ae95760405163a36c527f60e01b815260040160405180910390fd5b610af38282611afc565b505050565b5f610b0864e8d4a51000836149a3565b92915050565b6109a58383836122b5565b5f610b226124b0565b610b2e848484346124e7565b9050610b4660015f8051602061505183398151915255565b9392505050565b5f805160206150118339815191525f80610b66846126b5565b91509150610b738261227a565b610b7d5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610bac57610bac614841565b03610bd1575f83815260078501602052604081208054919055610bcf8282612945565b505b610be781610be284604001516112c2565b6129a3565b5050505050565b5f8181525f80516020614ff18339815191526020526040808220815160e0810190925280545f8051602061501183398151915293929190829060ff166003811115610c3b57610c3b614841565b6003811115610c4c57610c4c614841565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610cc282611a34565b9050600183516003811115610cd957610cd9614841565b14610cf75760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610d0c57610d0c614841565b03610d2257610d1a85612030565b505050505050565b5f80610d39610d30896129b6565b60400151612ab6565b5091509150818414610d5e57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610d975750806001600160401b03168560a001516001600160401b0316115b15610db557604051633ab3447f60e11b815260040160405180910390fd5b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206150318339815191529060ff1615610e9557604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610efc919061498c565b836020013514610f1f5760405163d040949d60e01b815260040160405180910390fd5b30610f3060608501604086016149d6565b6001600160a01b031614610f575760405163e6c4247b60e01b815260040160405180910390fd5b5f610f6560608501856149f1565b905090505f805b828163ffffffff161015611211575f610f8860608801886149f1565b8363ffffffff16818110610f9e57610f9e614a36565b9050602002810190610fb09190614a4a565b610fb990614afa565b80515f8181526008880160205260409020549192509015610fed57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161101c92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261103691614b91565b602060405180830381855afa158015611051573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190611074919061498c565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561110057611100614841565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111b3911686614ba2565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061120a90614bb5565b9050610f6c565b50600483018190555f61122f611226866129b6565b60400151612cf4565b90505f61123b87612e69565b90508160028260405161124e9190614b91565b602060405180830381855afa158015611269573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061128c919061498c565b146112aa57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610b086001600160401b03831664e8d4a51000614bd7565b5f6112e582611a34565b6080015192915050565b6112fa8383836122b5565b610af35760405163d802b9f360e01b815260040160405180910390fd5b5f80516020615011833981519152600461133083611a34565b51600581111561134257611342614841565b146113605760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146113985760405163e6c4247b60e01b815260040160405180910390fd5b5f82815260078201602090815260408083208054908490556004850190925290912054610af3906001600160a01b031682612945565b6113d66124b0565b5f8181525f80516020614ff18339815191526020526040808220815160e0810190925280545f8051602061501183398151915293929190829060ff16600381111561142357611423614841565b600381111561143457611434614841565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156114ad576114ad614841565b146114cb5760405163f95c7fe160e01b815260040160405180910390fd5b60046114da8260400151611a34565b5160058111156114ec576114ec614841565b14611570575f6114fb856129b6565b90505f8061150c8360400151612ab6565b50915091508184604001511461153557604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561156c57604051633ab3447f60e11b815260040160405180910390fd5b5050505b61157983612030565b505061159160015f8051602061505183398151915255565b5050565b5f805160206150318339815191525f806115ba6115b1856129b6565b60400151613302565b91509150806115dc57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600684016020526040902080546115f690614bee565b90505f0361161757604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff16600581111561163d5761163d614841565b1461165b5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006840160205260408120611673916145e9565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020614ff18339815191526020526040808220815160e0810190925280545f8051602061501183398151915293929190829060ff16600381111561174f5761174f614841565b600381111561176057611760614841565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156117d9576117d9614841565b141580156117fa57506003815160038111156117f7576117f7614841565b14155b156118185760405163f95c7fe160e01b815260040160405180910390fd5b5f6118268260400151611a34565b905080606001516001600160401b03165f0361185557604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611882846040015184606001518560800151612217565b6040518263ffffffff1660e01b815260040161189e919061495a565b6020604051808303815f875af11580156118ba573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610be7919061498c565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615031833981519152919061192590614bee565b90505f0361194657604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561196c5761196c614841565b1461198a5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119c39190600401614c20565b6020604051808303815f875af11580156119df573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af3919061498c565b5f611a0c6124b0565b611a178233346134a6565b9050611a2f60015f8051602061505183398151915255565b919050565b611a3c614620565b5f8281525f80516020615071833981519152602052604090819020815160e0810190925280545f80516020615031833981519152929190829060ff166005811115611a8957611a89614841565b6005811115611a9a57611a9a614841565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611b47573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b6e9190810190614cb5565b9150915080611b9057604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bd3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bf7919061498c565b825114611c175760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611c435760405163e6c4247b60e01b815260040160405180910390fd5b5f80611c52846040015161376a565b91509150818714611c7657604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615011833981519152906001600160401b039081169083161115611d33575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611d52565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f8281525f80516020615071833981519152602052604081206002015481905f8051602061503183398151915290600160801b90046001600160401b0316611da58582613945565b5f611daf87613b0e565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611dff8a858b612217565b6040518263ffffffff1660e01b8152600401611e1b919061495a565b6020604051808303815f875af1158015611e37573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e5b919061498c565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f8051602061501183398151915290505f600384516005811115611edc57611edc614841565b1480611efa5750600484516005811115611ef857611ef8614841565b145b15611f0a575060c0830151611f27565b600284516005811115611f1f57611f1f614841565b036107eb5750425b84608001516001600160401b0316816001600160401b031611611f4e575f92505050610b08565b600382015460608601516001600160a01b039091169063778c06b590611f73906112c2565b60a087015160808901516040808b01515f908152600489810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015612003573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612027919061498c565b95945050505050565b5f8181525f80516020614ff18339815191526020526040808220815160e0810190925280545f8051602061501183398151915293929190829060ff16600381111561207d5761207d614841565b600381111561208e5761208e614841565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156121bc575f8481526004870160205260409020546127109061216e90600160a01b900461ffff1685614bd7565b61217891906149a3565b915081866007015f8681526020019081526020015f205f82825461219c9190614ba2565b909155506121ac90508284614d87565b90506121bc856020015182612945565b6121d18560200151610be287606001516112c2565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b61226e613b83565b61227781613bce565b50565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f80516020615011833981519152816122ce86613c3c565b90506122d98661227a565b6122e857600192505050610b46565b5f8681526004830160205260409020546001600160a01b031633146123205760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a082015161234f91600160b01b90046001600160401b031690614d9a565b6001600160401b03168160c001516001600160401b03161015612385576040516302336bad60e51b815260040160405180910390fd5b5f851561239d576123968786611afc565b90506123bb565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906123e0906112c2565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015612456573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061247a919061498c565b905080846007015f8a81526020019081526020015f205f82825461249e9190614ba2565b90915550501515979650505050505050565b5f805160206150518339815191528054600119016124e157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061501183398151915290600160401b900461ffff908116908616108061253b575061271061ffff8616115b156125595760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561258b576040516302336bad60e51b815260040160405180910390fd5b805483108061259d5750806001015483115b156125bb57604051630103be3b60e21b815260040160405180910390fd5b825f6125c682610af8565b90505f6125d38983613e79565b905060405180608001604052806125e73390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b60015f8051602061505183398151915255565b5f6126be614620565b5f805160206150318339815191525f806126da6115b1876129b6565b9150915080156126fd57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561272e5761272e614841565b600581111561273f5761273f614841565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156127ae576127ae614841565b141580156127cf57506001815160058111156127cc576127cc614841565b14155b156127ed5760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561280257612802614841565b036128105760048152612815565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff1916600183600581111561285a5761285a614841565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561290e5761290e614841565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612991575f80fd5b505af1158015610d1a573d5f803e3d5ffd5b6115916001600160a01b03831682614263565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a1a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a419190810190614cb5565b9150915080612a6357604051636b2f19e960e01b815260040160405180910390fd5b815115612a835760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612aaf5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612adb57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b2a57612af2816001614d87565b612afd906008614bd7565b61ffff16868281518110612b1357612b13614a36565b016020015160f81c901b9190911790600101612ade565b5061ffff811615612b4e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612ba957612b65816003614d87565b612b70906008614bd7565b63ffffffff1687612b82836002614ba2565b81518110612b9257612b92614a36565b016020015160f81c901b9190911790600101612b51565b5063ffffffff8116600414612bd157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c2657612be881601f614d87565b612bf3906008614bd7565b88612bff836006614ba2565b81518110612c0f57612c0f614a36565b016020015160f81c901b9190911790600101612bd4565b505f805b6008811015612c8557612c3e816007614d87565b612c49906008614bd7565b6001600160401b031689612c5e836026614ba2565b81518110612c6e57612c6e614a36565b016020015160f81c901b9190911790600101612c2a565b505f805b6008811015612ce457612c9d816007614d87565b612ca8906008614bd7565b6001600160401b03168a612cbd83602e614ba2565b81518110612ccd57612ccd614a36565b016020015160f81c901b9190911790600101612c89565b5091989097509095509350505050565b5f8151602614612d1757604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612d6657612d2e816001614d87565b612d39906008614bd7565b61ffff16848281518110612d4f57612d4f614a36565b016020015160f81c901b9190911790600101612d1a565b5061ffff811615612d8a5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612de557612da1816003614d87565b612dac906008614bd7565b63ffffffff1685612dbe836002614ba2565b81518110612dce57612dce614a36565b016020015160f81c901b9190911790600101612d8d565b5063ffffffff811615612e0b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612e6057612e2281601f614d87565b612e2d906008614bd7565b86612e39836006614ba2565b81518110612e4957612e49614a36565b016020015160f81c901b9190911790600101612e0e565b50949350505050565b60605f612e78838301846149f1565b612e8491506058614bd7565b612e8f90605c614ba2565b6001600160401b03811115612ea657612ea6614a68565b6040519080825280601f01601f191660200182016040528015612ed0576020820181803683370190505b5090505f5b6020811015612f255783358160208110612ef157612ef1614a36565b1a60f81b828281518110612f0757612f07614a36565b60200101906001600160f81b03191690815f1a905350600101612ed5565b505f5b6020811015612f855783602001358160208110612f4757612f47614a36565b1a60f81b82612f57836020614ba2565b81518110612f6757612f67614a36565b60200101906001600160f81b03191690815f1a905350600101612f28565b505f5b6004811015612fe857612f9c816003614d87565b612fa7906008614bd7565b6014901c60f81b82612fba836040614ba2565b81518110612fca57612fca614a36565b60200101906001600160f81b03191690815f1a905350600101612f88565b505f612ffa60608501604086016149d6565b60601b90505f5b601481101561305a5781816014811061301c5761301c614a36565b1a60f81b8361302c836044614ba2565b8151811061303c5761303c614a36565b60200101906001600160f81b03191690815f1a905350600101613001565b505f61306960608601866149f1565b905090505f5b60048110156130d457613083816003614d87565b61308e906008614bd7565b63ffffffff8316901c60f81b846130a6836058614ba2565b815181106130b6576130b6614a36565b60200101906001600160f81b03191690815f1a90535060010161306f565b505f5b6130e460608701876149f1565b90508110156132f8575f6130f9826058614bd7565b61310490605c614ba2565b90505f5b602081101561318f5761311e60608901896149f1565b8481811061312e5761312e614a36565b90506020028101906131409190614a4a565b35816020811061315257613152614a36565b1a60f81b866131618385614ba2565b8151811061317157613171614a36565b60200101906001600160f81b03191690815f1a905350600101613108565b505f5b6008811015613244576131a6816007614d87565b6131b1906008614bd7565b6131be60608a018a6149f1565b858181106131ce576131ce614a36565b90506020028101906131e09190614a4a565b6131f1906040810190602001614828565b6001600160401b0316901c60f81b868261320c856020614ba2565b6132169190614ba2565b8151811061322657613226614a36565b60200101906001600160f81b03191690815f1a905350600101613192565b505f5b60308110156132ee5761325d60608901896149f1565b8481811061326d5761326d614a36565b905060200281019061327f9190614a4a565b61328d906040810190614dba565b8281811061329d5761329d614a36565b9050013560f81c60f81b86828460286132b69190614ba2565b6132c09190614ba2565b815181106132d0576132d0614a36565b60200101906001600160f81b03191690815f1a905350600101613247565b50506001016130d7565b5091949350505050565b5f80825160271461332657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156133755761333d816001614d87565b613348906008614bd7565b61ffff1685828151811061335e5761335e614a36565b016020015160f81c901b9190911790600101613329565b5061ffff8116156133995760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156133f4576133b0816003614d87565b6133bb906008614bd7565b63ffffffff16866133cd836002614ba2565b815181106133dd576133dd614a36565b016020015160f81c901b919091179060010161339c565b5063ffffffff811660031461341c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134715761343381601f614d87565b61343e906008614bd7565b8761344a836006614ba2565b8151811061345a5761345a614a36565b016020015160f81c901b919091179060010161341f565b505f8660268151811061348657613486614a36565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615011833981519152816134bf84610af8565b90505f6134cb87611a34565b90506134d68761227a565b6134f357604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561350857613508614841565b146135265760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516135379190614d9a565b905083600201600a9054906101000a90046001600160401b031682604001516135609190614dfc565b6001600160401b0316816001600160401b0316111561359257604051630c192e7760e41b815260040160405180910390fd5b5f8061359e8a84611d5d565b915091505f8a836040516020016135cc92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561365f5761365f614841565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461378e57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137dd576137a5816001614d87565b6137b0906008614bd7565b61ffff168582815181106137c6576137c6614a36565b016020015160f81c901b9190911790600101613791565b5061ffff8116156138015760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561385c57613818816003614d87565b613823906008614bd7565b63ffffffff1686613835836002614ba2565b8151811061384557613845614a36565b016020015160f81c901b9190911790600101613804565b5063ffffffff811660051461388457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138d95761389b81601f614d87565b6138a6906008614bd7565b876138b2836006614ba2565b815181106138c2576138c2614a36565b016020015160f81c901b9190911790600101613887565b505f805b6008811015613938576138f1816007614d87565b6138fc906008614bd7565b6001600160401b031688613911836026614ba2565b8151811061392157613921614a36565b016020015160f81c901b91909117906001016138dd565b5090969095509350505050565b5f805160206150318339815191525f6001600160401b038084169085161115613979576139728385614918565b9050613986565b6139838484614918565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806139e85750600184015481516139e4916001600160401b031690614ba2565b8210155b15613a0e576001600160401b038316606082015281815260408101516020820152613a2d565b8281606001818151613a209190614d9a565b6001600160401b03169052505b6060810151613a3d906064614dfc565b602082015160018601546001600160401b039290921691613a689190600160401b900460ff16614bd7565b1015613a875760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613aa29190614ba2565b9052506040810180516001600160401b0387169190613ac2908390614d87565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206150718339815191526020526040812060020180545f805160206150318339815191529190600890613b5890600160401b90046001600160401b0316614e27565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613bcc57604051631afcd79f60e31b815260040160405180910390fd5b565b613bd6613b83565b613bdf816142fa565b613be7614313565b61227760608201356080830135613c0460c0850160a08601614828565b613c1460e0860160c08701614e42565b613c25610100870160e08801614e5b565b613c37610120880161010089016149d6565b614323565b613c44614620565b5f8281525f805160206150718339815191526020526040808220815160e0810190925280545f8051602061503183398151915293929190829060ff166005811115613c9157613c91614841565b6005811115613ca257613ca2614841565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613d1457613d14614841565b14613d325760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613d7657613d76614841565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e228582611d5d565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ebd57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061503183398151915242613edc6040860160208701614828565b6001600160401b0316111580613f165750613efa6202a30042614ba2565b613f0a6040860160208701614828565b6001600160401b031610155b15613f335760405162d36c8560e81b815260040160405180910390fd5b6030613f426040860186614dba565b9050141580613f5057508335155b15613f6e5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613f9e57604051630eb0d31360e11b815260040160405180910390fd5b613fa8835f613945565b5f806140416040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613fec9190614828565b6001600160401b0316815260200161400760408a018a614dba565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614444565b5f8281526006860160205260409020919350915061405f8282614ebf565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb9061409d90859060040161495a565b6020604051808303815f875af11580156140b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140dd919061498c565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561415557614155614841565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614235918e01908e01614828565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561428a5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146142d3576040519150601f19603f3d011682016040523d82523d5f602084013e6142d8565b606091505b5050905080610af357604051630a12f52160e11b815260040160405180910390fd5b614302613b83565b61430a614507565b6122778161450f565b61431b613b83565b613bcc6145e1565b61432b613b83565b5f8051602061501183398151915261ffff8416158061434f575061271061ffff8516115b1561436d5760405163c98d73a760e01b815260040160405180910390fd5b8587111561438e57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806143a15750600a60ff8416115b156143bf576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461446d57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161449f9796959493929190614f7a565b60405160208183030381529060405290506002816040516144c09190614b91565b602060405180830381855afa1580156144db573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906144fe919061498c565b94909350915050565b613bcc613b83565b614517613b83565b80355f80516020615031833981519152908155601461453c6060840160408501614e5b565b60ff16118061455b57506145566060830160408401614e5b565b60ff16155b156145795760405163b4fa3fb360e01b815260040160405180910390fd5b6145896060830160408401614e5b565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556145ba6040830160208401614828565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6126a2613b83565b5080546145f590614bee565b5f825580601f10614604575050565b601f0160209004905f5260205f2090810190612277919061465c565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614670575f815560010161465d565b5090565b8015158114612277575f80fd5b803563ffffffff81168114611a2f575f80fd5b5f805f606084860312156146a6575f80fd5b8335925060208401356146b881614674565b91506146c660408501614681565b90509250925092565b5f602082840312156146df575f80fd5b5035919050565b5f61012082840312156146f7575f80fd5b50919050565b5f806040838503121561470e575f80fd5b8235915061471e60208401614681565b90509250929050565b803561ffff81168114611a2f575f80fd5b80356001600160401b0381168114611a2f575f80fd5b5f805f60608486031215614760575f80fd5b83356001600160401b03811115614775575f80fd5b840160608187031215614786575f80fd5b925061479460208501614727565b91506146c660408501614738565b5f602082840312156147b2575f80fd5b610b4682614681565b5f80604083850312156147cc575f80fd5b6147d583614681565b946020939093013593505050565b5f80604083850312156147f4575f80fd5b82356001600160401b03811115614809575f80fd5b83016080818603121561481a575f80fd5b915061471e60208401614681565b5f60208284031215614838575f80fd5b610b4682614738565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061487857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516148b360608401826001600160401b03169052565b5060808301516148ce60808401826001600160401b03169052565b5060a08301516148e960a08401826001600160401b03169052565b5060c0830151612aaf60c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612aaf57612aaf614904565b5f5b8381101561495257818101518382015260200161493a565b50505f910152565b602081525f8251806020840152614978816040850160208701614938565b601f01601f19169190910160400192915050565b5f6020828403121561499c575f80fd5b5051919050565b5f826149bd57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114612277575f80fd5b5f602082840312156149e6575f80fd5b8135610b46816149c2565b5f808335601e19843603018112614a06575f80fd5b8301803591506001600160401b03821115614a1f575f80fd5b6020019150600581901b3603821315611ead575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614a5e575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614a9e57614a9e614a68565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614acc57614acc614a68565b604052919050565b5f6001600160401b03821115614aec57614aec614a68565b50601f01601f191660200190565b5f60608236031215614b0a575f80fd5b614b12614a7c565b823581526020614b23818501614738565b8183015260408401356001600160401b03811115614b3f575f80fd5b840136601f820112614b4f575f80fd5b8035614b62614b5d82614ad4565b614aa4565b8181523684838501011115614b75575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614a5e818460208701614938565b80820180821115610b0857610b08614904565b5f63ffffffff808316818103614bcd57614bcd614904565b6001019392505050565b8082028115828204841417610b0857610b08614904565b600181811c90821680614c0257607f821691505b6020821081036146f757634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614c3281614bee565b806020870152604060018084165f8114614c535760018114614c6f57614c9c565b60ff19851660408a0152604084151560051b8a01019550614c9c565b895f5260205f205f5b85811015614c935781548b8201860152908301908801614c78565b8a016040019650505b509398975050505050505050565b8051611a2f81614674565b5f8060408385031215614cc6575f80fd5b82516001600160401b0380821115614cdc575f80fd5b9084019060608287031215614cef575f80fd5b614cf7614a7c565b82518152602080840151614d0a816149c2565b82820152604084015183811115614d1f575f80fd5b80850194505087601f850112614d33575f80fd5b83519250614d43614b5d84614ad4565b8381528882858701011115614d56575f80fd5b614d6584838301848801614938565b80604084015250819550614d7a818801614caa565b9450505050509250929050565b81810381811115610b0857610b08614904565b6001600160401b03818116838216019080821115612aaf57612aaf614904565b5f808335601e19843603018112614dcf575f80fd5b8301803591506001600160401b03821115614de8575f80fd5b602001915036819003821315611ead575f80fd5b6001600160401b03818116838216028082169190828114614e1f57614e1f614904565b505092915050565b5f6001600160401b03808316818103614bcd57614bcd614904565b5f60208284031215614e52575f80fd5b610b4682614727565b5f60208284031215614e6b575f80fd5b813560ff81168114610b46575f80fd5b601f821115610af357805f5260205f20601f840160051c81016020851015614ea05750805b601f840160051c820191505b81811015610be7575f8155600101614eac565b81516001600160401b03811115614ed857614ed8614a68565b614eec81614ee68454614bee565b84614e7b565b602080601f831160018114614f1f575f8415614f085750858301515b5f19600386901b1c1916600185901b178555610d1a565b5f85815260208120601f198616915b82811015614f4d57888601518255948401946001909101908401614f2e565b5085821015614f6a57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614fcf81604e860160208901614938565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516151f23803806151f283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6150a58061014d5f395ff3fe6080604052600436106101c5575f3560e01c806366435abf116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b614610515578063d5f20ff614610529578063df93d8de14610555578063e7d14c1c1461056b575f80fd5b8063b771b3bc146104aa578063ba3a4b97146104c4578063bee0a03f146104e3578063c599e24f14610502575f80fd5b80638280a25a116100cd5780638280a25a1461043957806393e245981461044d57806398f3e2b41461046c578063a3a65e481461048b575f80fd5b806366435abf146103e8578063732214f81461040757806376f786211461041a575f80fd5b806335455ded116101685780635297fae6116101385780635297fae61461036257806360305d621461038157806361e2f490146103aa57806362065856146103c9575f80fd5b806335455ded146102db5780633a1cfff61461030357806340034a9314610322578063467ef06f14610343575f80fd5b806320e55565116101a357806320e555651461023457806325e1c776146102535780632e2194d814610272578063329c3e12146102a9575f80fd5b80630118acc4146101c95780630322ed98146101ea578063151d30d114610209575b5f80fd5b3480156101d4575f80fd5b506101e86101e336600461469c565b6105b5565b005b3480156101f5575f80fd5b506101e86102043660046146d7565b610831565b348015610214575f80fd5b5061021d600a81565b60405160ff90911681526020015b60405180910390f35b34801561023f575f80fd5b506101e861024e3660046146ee565b6109a3565b34801561025e575f80fd5b506101e861026d366004614705565b610a80565b34801561027d575f80fd5b5061029161028c3660046146d7565b610af0565b6040516001600160401b03909116815260200161022b565b3480156102b4575f80fd5b506102c36001600160991b0181565b6040516001600160a01b03909116815260200161022b565b3480156102e6575f80fd5b506102f061271081565b60405161ffff909116815260200161022b565b34801561030e575f80fd5b506101e861031d36600461469c565b610b06565b610335610330366004614756565b610b11565b60405190815260200161022b565b34801561034e575f80fd5b506101e861035d3660046147aa565b610b45565b34801561036d575f80fd5b506101e861037c3660046147c3565b610be6565b34801561038c575f80fd5b50610395601481565b60405163ffffffff909116815260200161022b565b3480156103b5575f80fd5b506101e86103c43660046147eb565b610e3b565b3480156103d4575f80fd5b506103356103e3366004614830565b6112ba565b3480156103f3575f80fd5b506102916104023660046146d7565b6112d3565b348015610412575f80fd5b506103355f81565b348015610425575f80fd5b506101e861043436600461469c565b6112e7565b348015610444575f80fd5b5061021d603081565b348015610458575f80fd5b506101e86104673660046146d7565b61130f565b348015610477575f80fd5b506101e86104863660046147c3565b6113c6565b348015610496575f80fd5b506101e86104a53660046147aa565b61158d565b3480156104b5575f80fd5b506102c36005600160991b0181565b3480156104cf575f80fd5b506101e86104de3660046146d7565b6116fa565b3480156104ee575f80fd5b506101e86104fd3660046146d7565b6118d6565b6103356105103660046146d7565b6119fb565b348015610520575f80fd5b5061021d601481565b348015610534575f80fd5b506105486105433660046146d7565b611a2c565b60405161022b919061485d565b348015610560575f80fd5b506102916202a30081565b348015610576575f80fd5b506103356105853660046146d7565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614ff98339815191526020526040808220815160e0810190925280545f8051602061501983398151915293929190829060ff16600381111561060257610602614849565b600381111561061357610613614849565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61068982611a2c565b90506002835160038111156106a0576106a0614849565b146106be5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106eb5760405163e6c4247b60e01b815260040160405180910390fd5b60028151600581111561070057610700614849565b036107d3578515610717576107158286611af4565b505b5f8781526005850160205260409020805460ff191660031790556060830151608082015161075091849161074b9190614920565b611d55565b505f888152600586016020526040902060020180546001600160401b03909216600160c01b026001600160c01b0390921691909117905561079083611eac565b5f888152600686016020526040808220929092559051839189917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed579190a361080f565b6004815160058111156107e8576107e8614849565b03610818576107f683611eac565b5f88815260068601602052604090205561080f87612038565b50505050505050565b60405163a36c527f60e01b815260040160405180910390fd5b5f8181525f805160206150798339815191526020526040808220815160e0810190925280545f8051602061503983398151915293929190829060ff16600581111561087e5761087e614849565b600581111561088f5761088f614849565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108fe576108fe614849565b1461091c5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109418584606001515f61221f565b6040518263ffffffff1660e01b815260040161095d9190614962565b6020604051808303815f875af1158015610979573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061099d9190614994565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806109ec575080546001600160401b03808416911610155b15610a0a5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610a348361226e565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610a8982612282565b610aa657604051636ca57bcf60e01b815260040160405180910390fd5b6002610ab183611a2c565b516005811115610ac357610ac3614849565b14610ae15760405163a36c527f60e01b815260040160405180910390fd5b610aeb8282611af4565b505050565b5f610b0064e8d4a51000836149ab565b92915050565b61099d8383836122bd565b5f610b1a6124b8565b610b26848484346124ef565b9050610b3e60015f8051602061505983398151915255565b9392505050565b5f805160206150198339815191525f80610b5e846126bd565b91509150610b6b82612282565b610b755750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ba457610ba4614849565b03610bc9575f83815260078501602052604081208054919055610bc7828261294d565b505b610bdf81610bda84604001516112ba565b6129ab565b5050505050565b5f8181525f80516020614ff98339815191526020526040808220815160e0810190925280545f8051602061501983398151915293929190829060ff166003811115610c3357610c33614849565b6003811115610c4457610c44614849565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610cba82611a2c565b9050600183516003811115610cd157610cd1614849565b14610cef5760405163f95c7fe160e01b815260040160405180910390fd5b600481516005811115610d0457610d04614849565b03610d1a57610d1285612038565b505050505050565b5f80610d31610d28896129be565b60400151612abe565b5091509150818414610d5657604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610d8f5750806001600160401b03168560a001516001600160401b0316115b15610dad57604051633ab3447f60e11b815260040160405180910390fd5b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206150398339815191529060ff1615610e8d57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ed0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ef49190614994565b836020013514610f175760405163d040949d60e01b815260040160405180910390fd5b30610f2860608501604086016149de565b6001600160a01b031614610f4f5760405163e6c4247b60e01b815260040160405180910390fd5b5f610f5d60608501856149f9565b905090505f805b828163ffffffff161015611209575f610f8060608801886149f9565b8363ffffffff16818110610f9657610f96614a3e565b9050602002810190610fa89190614a52565b610fb190614b02565b80515f8181526008880160205260409020549192509015610fe557604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161101492919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261102e91614b99565b602060405180830381855afa158015611049573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061106c9190614994565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156110f8576110f8614849565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516111ab911686614baa565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061120290614bbd565b9050610f64565b50600483018190555f61122761121e866129be565b60400151612cfc565b90505f61123387612e71565b9050816002826040516112469190614b99565b602060405180830381855afa158015611261573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112849190614994565b146112a257604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610b006001600160401b03831664e8d4a51000614bdf565b5f6112dd82611a2c565b6080015192915050565b6112f28383836122bd565b610aeb5760405163d802b9f360e01b815260040160405180910390fd5b5f80516020615019833981519152600461132883611a2c565b51600581111561133a5761133a614849565b146113585760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146113905760405163e6c4247b60e01b815260040160405180910390fd5b5f82815260078201602090815260408083208054908490556004850190925290912054610aeb906001600160a01b03168261294d565b6113ce6124b8565b5f8181525f80516020614ff98339815191526020526040808220815160e0810190925280545f8051602061501983398151915293929190829060ff16600381111561141b5761141b614849565b600381111561142c5761142c614849565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156114a5576114a5614849565b146114c35760405163f95c7fe160e01b815260040160405180910390fd5b60046114d28260400151611a2c565b5160058111156114e4576114e4614849565b14611568575f6114f3856129be565b90505f806115048360400151612abe565b50915091508184604001511461152d57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561156457604051633ab3447f60e11b815260040160405180910390fd5b5050505b61157183612038565b505061158960015f8051602061505983398151915255565b5050565b5f805160206150398339815191525f806115b26115a9856129be565b6040015161330a565b91509150806115d457604051633dbcaef760e01b815260040160405180910390fd5b5f828152600684016020526040902080546115ee90614bf6565b90505f0361160f57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff16600581111561163557611635614849565b146116535760405163a36c527f60e01b815260040160405180910390fd5b5f828152600684016020526040812061166b916145f1565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020614ff98339815191526020526040808220815160e0810190925280545f8051602061501983398151915293929190829060ff16600381111561174757611747614849565b600381111561175857611758614849565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156117d1576117d1614849565b141580156117f257506003815160038111156117ef576117ef614849565b14155b156118105760405163f95c7fe160e01b815260040160405180910390fd5b5f61181e8260400151611a2c565b905080606001516001600160401b03165f0361184d57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61187a84604001518460600151856080015161221f565b6040518263ffffffff1660e01b81526004016118969190614962565b6020604051808303815f875af11580156118b2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bdf9190614994565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615039833981519152919061191d90614bf6565b90505f0361193e57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff16600581111561196457611964614849565b146119825760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119bb9190600401614c28565b6020604051808303815f875af11580156119d7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aeb9190614994565b5f611a046124b8565b611a0f8233346134ae565b9050611a2760015f8051602061505983398151915255565b919050565b611a34614628565b5f8281525f80516020615079833981519152602052604090819020815160e0810190925280545f80516020615039833981519152929190829060ff166005811115611a8157611a81614849565b6005811115611a9257611a92614849565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611b3f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611b669190810190614cbd565b9150915080611b8857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bef9190614994565b825114611c0f5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611c3b5760405163e6c4247b60e01b815260040160405180910390fd5b5f80611c4a8460400151613772565b91509150818714611c6e57604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615019833981519152906001600160401b039081169083161115611d2b575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611d4a565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f8281525f80516020615079833981519152602052604081206002015481905f8051602061503983398151915290600160801b90046001600160401b0316611d9d858261394d565b5f611da787613b16565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb611df78a858b61221f565b6040518263ffffffff1660e01b8152600401611e139190614962565b6020604051808303815f875af1158015611e2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e539190614994565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f8051602061501983398151915290505f611ecc8460400151611a2c565b90505f600382516005811115611ee457611ee4614849565b1480611f025750600482516005811115611f0057611f00614849565b145b15611f12575060c0810151611f2f565b600282516005811115611f2757611f27614849565b036108185750425b84608001516001600160401b0316816001600160401b031611611f5657505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590611f7b906112ba565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa15801561200b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061202f9190614994565b95945050505050565b5f8181525f80516020614ff98339815191526020526040808220815160e0810190925280545f8051602061501983398151915293929190829060ff16600381111561208557612085614849565b600381111561209657612096614849565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156121c4575f8481526004870160205260409020546127109061217690600160a01b900461ffff1685614bdf565b61218091906149ab565b915081866007015f8681526020019081526020015f205f8282546121a49190614baa565b909155506121b490508284614d8f565b90506121c485602001518261294d565b6121d98560200151610bda87606001516112ba565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612276613b8b565b61227f81613bd6565b50565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f80516020615019833981519152816122d686613c44565b90506122e186612282565b6122f057600192505050610b3e565b5f8681526004830160205260409020546001600160a01b031633146123285760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a082015161235791600160b01b90046001600160401b031690614da2565b6001600160401b03168160c001516001600160401b0316101561238d576040516302336bad60e51b815260040160405180910390fd5b5f85156123a55761239e8786611af4565b90506123c3565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906123e8906112ba565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561245e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124829190614994565b905080846007015f8a81526020019081526020015f205f8282546124a69190614baa565b90915550501515979650505050505050565b5f805160206150598339815191528054600119016124e957604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061501983398151915290600160401b900461ffff9081169086161080612543575061271061ffff8616115b156125615760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612593576040516302336bad60e51b815260040160405180910390fd5b80548310806125a55750806001015483115b156125c357604051630103be3b60e21b815260040160405180910390fd5b825f6125ce82610af0565b90505f6125db8983613e81565b905060405180608001604052806125ef3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b60015f8051602061505983398151915255565b5f6126c6614628565b5f805160206150398339815191525f806126e26115a9876129be565b91509150801561270557604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561273657612736614849565b600581111561274757612747614849565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156127b6576127b6614849565b141580156127d757506001815160058111156127d4576127d4614849565b14155b156127f55760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561280a5761280a614849565b03612818576004815261281d565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff1916600183600581111561286257612862614849565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561291657612916614849565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612999575f80fd5b505af1158015610d12573d5f803e3d5ffd5b6115896001600160a01b0383168261426b565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a22573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a499190810190614cbd565b9150915080612a6b57604051636b2f19e960e01b815260040160405180910390fd5b815115612a8b5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612ab75760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612ae357604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b3257612afa816001614d8f565b612b05906008614bdf565b61ffff16868281518110612b1b57612b1b614a3e565b016020015160f81c901b9190911790600101612ae6565b5061ffff811615612b565760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612bb157612b6d816003614d8f565b612b78906008614bdf565b63ffffffff1687612b8a836002614baa565b81518110612b9a57612b9a614a3e565b016020015160f81c901b9190911790600101612b59565b5063ffffffff8116600414612bd957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c2e57612bf081601f614d8f565b612bfb906008614bdf565b88612c07836006614baa565b81518110612c1757612c17614a3e565b016020015160f81c901b9190911790600101612bdc565b505f805b6008811015612c8d57612c46816007614d8f565b612c51906008614bdf565b6001600160401b031689612c66836026614baa565b81518110612c7657612c76614a3e565b016020015160f81c901b9190911790600101612c32565b505f805b6008811015612cec57612ca5816007614d8f565b612cb0906008614bdf565b6001600160401b03168a612cc583602e614baa565b81518110612cd557612cd5614a3e565b016020015160f81c901b9190911790600101612c91565b5091989097509095509350505050565b5f8151602614612d1f57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612d6e57612d36816001614d8f565b612d41906008614bdf565b61ffff16848281518110612d5757612d57614a3e565b016020015160f81c901b9190911790600101612d22565b5061ffff811615612d925760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612ded57612da9816003614d8f565b612db4906008614bdf565b63ffffffff1685612dc6836002614baa565b81518110612dd657612dd6614a3e565b016020015160f81c901b9190911790600101612d95565b5063ffffffff811615612e1357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612e6857612e2a81601f614d8f565b612e35906008614bdf565b86612e41836006614baa565b81518110612e5157612e51614a3e565b016020015160f81c901b9190911790600101612e16565b50949350505050565b60605f612e80838301846149f9565b612e8c91506058614bdf565b612e9790605c614baa565b6001600160401b03811115612eae57612eae614a70565b6040519080825280601f01601f191660200182016040528015612ed8576020820181803683370190505b5090505f5b6020811015612f2d5783358160208110612ef957612ef9614a3e565b1a60f81b828281518110612f0f57612f0f614a3e565b60200101906001600160f81b03191690815f1a905350600101612edd565b505f5b6020811015612f8d5783602001358160208110612f4f57612f4f614a3e565b1a60f81b82612f5f836020614baa565b81518110612f6f57612f6f614a3e565b60200101906001600160f81b03191690815f1a905350600101612f30565b505f5b6004811015612ff057612fa4816003614d8f565b612faf906008614bdf565b6014901c60f81b82612fc2836040614baa565b81518110612fd257612fd2614a3e565b60200101906001600160f81b03191690815f1a905350600101612f90565b505f61300260608501604086016149de565b60601b90505f5b60148110156130625781816014811061302457613024614a3e565b1a60f81b83613034836044614baa565b8151811061304457613044614a3e565b60200101906001600160f81b03191690815f1a905350600101613009565b505f61307160608601866149f9565b905090505f5b60048110156130dc5761308b816003614d8f565b613096906008614bdf565b63ffffffff8316901c60f81b846130ae836058614baa565b815181106130be576130be614a3e565b60200101906001600160f81b03191690815f1a905350600101613077565b505f5b6130ec60608701876149f9565b9050811015613300575f613101826058614bdf565b61310c90605c614baa565b90505f5b60208110156131975761312660608901896149f9565b8481811061313657613136614a3e565b90506020028101906131489190614a52565b35816020811061315a5761315a614a3e565b1a60f81b866131698385614baa565b8151811061317957613179614a3e565b60200101906001600160f81b03191690815f1a905350600101613110565b505f5b600881101561324c576131ae816007614d8f565b6131b9906008614bdf565b6131c660608a018a6149f9565b858181106131d6576131d6614a3e565b90506020028101906131e89190614a52565b6131f9906040810190602001614830565b6001600160401b0316901c60f81b8682613214856020614baa565b61321e9190614baa565b8151811061322e5761322e614a3e565b60200101906001600160f81b03191690815f1a90535060010161319a565b505f5b60308110156132f65761326560608901896149f9565b8481811061327557613275614a3e565b90506020028101906132879190614a52565b613295906040810190614dc2565b828181106132a5576132a5614a3e565b9050013560f81c60f81b86828460286132be9190614baa565b6132c89190614baa565b815181106132d8576132d8614a3e565b60200101906001600160f81b03191690815f1a90535060010161324f565b50506001016130df565b5091949350505050565b5f80825160271461332e57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561337d57613345816001614d8f565b613350906008614bdf565b61ffff1685828151811061336657613366614a3e565b016020015160f81c901b9190911790600101613331565b5061ffff8116156133a15760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156133fc576133b8816003614d8f565b6133c3906008614bdf565b63ffffffff16866133d5836002614baa565b815181106133e5576133e5614a3e565b016020015160f81c901b91909117906001016133a4565b5063ffffffff811660031461342457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134795761343b81601f614d8f565b613446906008614bdf565b87613452836006614baa565b8151811061346257613462614a3e565b016020015160f81c901b9190911790600101613427565b505f8660268151811061348e5761348e614a3e565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020615019833981519152816134c784610af0565b90505f6134d387611a2c565b90506134de87612282565b6134fb57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561351057613510614849565b1461352e5760405163a36c527f60e01b815260040160405180910390fd5b5f82826080015161353f9190614da2565b905083600201600a9054906101000a90046001600160401b031682604001516135689190614e04565b6001600160401b0316816001600160401b0316111561359a57604051630c192e7760e41b815260040160405180910390fd5b5f806135a68a84611d55565b915091505f8a836040516020016135d492919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561366757613667614849565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461379657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137e5576137ad816001614d8f565b6137b8906008614bdf565b61ffff168582815181106137ce576137ce614a3e565b016020015160f81c901b9190911790600101613799565b5061ffff8116156138095760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561386457613820816003614d8f565b61382b906008614bdf565b63ffffffff168661383d836002614baa565b8151811061384d5761384d614a3e565b016020015160f81c901b919091179060010161380c565b5063ffffffff811660051461388c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138e1576138a381601f614d8f565b6138ae906008614bdf565b876138ba836006614baa565b815181106138ca576138ca614a3e565b016020015160f81c901b919091179060010161388f565b505f805b6008811015613940576138f9816007614d8f565b613904906008614bdf565b6001600160401b031688613919836026614baa565b8151811061392957613929614a3e565b016020015160f81c901b91909117906001016138e5565b5090969095509350505050565b5f805160206150398339815191525f6001600160401b0380841690851611156139815761397a8385614920565b905061398e565b61398b8484614920565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806139f05750600184015481516139ec916001600160401b031690614baa565b8210155b15613a16576001600160401b038316606082015281815260408101516020820152613a35565b8281606001818151613a289190614da2565b6001600160401b03169052505b6060810151613a45906064614e04565b602082015160018601546001600160401b039290921691613a709190600160401b900460ff16614bdf565b1015613a8f5760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613aaa9190614baa565b9052506040810180516001600160401b0387169190613aca908390614d8f565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206150798339815191526020526040812060020180545f805160206150398339815191529190600890613b6090600160401b90046001600160401b0316614e2f565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613bd457604051631afcd79f60e31b815260040160405180910390fd5b565b613bde613b8b565b613be781614302565b613bef61431b565b61227f60608201356080830135613c0c60c0850160a08601614830565b613c1c60e0860160c08701614e4a565b613c2d610100870160e08801614e63565b613c3f610120880161010089016149de565b61432b565b613c4c614628565b5f8281525f805160206150798339815191526020526040808220815160e0810190925280545f8051602061503983398151915293929190829060ff166005811115613c9957613c99614849565b6005811115613caa57613caa614849565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613d1c57613d1c614849565b14613d3a5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613d7e57613d7e614849565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e2a8582611d55565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ec557604051637fab81e560e01b815260040160405180910390fd5b5f8051602061503983398151915242613ee46040860160208701614830565b6001600160401b0316111580613f1e5750613f026202a30042614baa565b613f126040860160208701614830565b6001600160401b031610155b15613f3b5760405162d36c8560e81b815260040160405180910390fd5b6030613f4a6040860186614dc2565b9050141580613f5857508335155b15613f765760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613fa657604051630eb0d31360e11b815260040160405180910390fd5b613fb0835f61394d565b5f806140496040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ff49190614830565b6001600160401b0316815260200161400f60408a018a614dc2565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061444c565b5f828152600686016020526040902091935091506140678282614ec7565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906140a5908590600401614962565b6020604051808303815f875af11580156140c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e59190614994565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561415d5761415d614849565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161423d918e01908e01614830565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156142925760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146142db576040519150601f19603f3d011682016040523d82523d5f602084013e6142e0565b606091505b5050905080610aeb57604051630a12f52160e11b815260040160405180910390fd5b61430a613b8b565b61431261450f565b61227f81614517565b614323613b8b565b613bd46145e9565b614333613b8b565b5f8051602061501983398151915261ffff84161580614357575061271061ffff8516115b156143755760405163c98d73a760e01b815260040160405180910390fd5b8587111561439657604051630103be3b60e21b815260040160405180910390fd5b60ff831615806143a95750600a60ff8416115b156143c7576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461447557604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016144a79796959493929190614f82565b60405160208183030381529060405290506002816040516144c89190614b99565b602060405180830381855afa1580156144e3573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906145069190614994565b94909350915050565b613bd4613b8b565b61451f613b8b565b80355f8051602061503983398151915290815560146145446060840160408501614e63565b60ff161180614563575061455e6060830160408401614e63565b60ff16155b156145815760405163b4fa3fb360e01b815260040160405180910390fd5b6145916060830160408401614e63565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556145c26040830160208401614830565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6126aa613b8b565b5080546145fd90614bf6565b5f825580601f1061460c575050565b601f0160209004905f5260205f209081019061227f9190614664565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614678575f8155600101614665565b5090565b801515811461227f575f80fd5b803563ffffffff81168114611a27575f80fd5b5f805f606084860312156146ae575f80fd5b8335925060208401356146c08161467c565b91506146ce60408501614689565b90509250925092565b5f602082840312156146e7575f80fd5b5035919050565b5f61012082840312156146ff575f80fd5b50919050565b5f8060408385031215614716575f80fd5b8235915061472660208401614689565b90509250929050565b803561ffff81168114611a27575f80fd5b80356001600160401b0381168114611a27575f80fd5b5f805f60608486031215614768575f80fd5b83356001600160401b0381111561477d575f80fd5b84016060818703121561478e575f80fd5b925061479c6020850161472f565b91506146ce60408501614740565b5f602082840312156147ba575f80fd5b610b3e82614689565b5f80604083850312156147d4575f80fd5b6147dd83614689565b946020939093013593505050565b5f80604083850312156147fc575f80fd5b82356001600160401b03811115614811575f80fd5b830160808186031215614822575f80fd5b915061472660208401614689565b5f60208284031215614840575f80fd5b610b3e82614740565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061488057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516148bb60608401826001600160401b03169052565b5060808301516148d660808401826001600160401b03169052565b5060a08301516148f160a08401826001600160401b03169052565b5060c0830151612ab760c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612ab757612ab761490c565b5f5b8381101561495a578181015183820152602001614942565b50505f910152565b602081525f8251806020840152614980816040850160208701614940565b601f01601f19169190910160400192915050565b5f602082840312156149a4575f80fd5b5051919050565b5f826149c557634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b038116811461227f575f80fd5b5f602082840312156149ee575f80fd5b8135610b3e816149ca565b5f808335601e19843603018112614a0e575f80fd5b8301803591506001600160401b03821115614a27575f80fd5b6020019150600581901b3603821315611ea5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614a66575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614aa657614aa6614a70565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614ad457614ad4614a70565b604052919050565b5f6001600160401b03821115614af457614af4614a70565b50601f01601f191660200190565b5f60608236031215614b12575f80fd5b614b1a614a84565b823581526020614b2b818501614740565b8183015260408401356001600160401b03811115614b47575f80fd5b840136601f820112614b57575f80fd5b8035614b6a614b6582614adc565b614aac565b8181523684838501011115614b7d575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614a66818460208701614940565b80820180821115610b0057610b0061490c565b5f63ffffffff808316818103614bd557614bd561490c565b6001019392505050565b8082028115828204841417610b0057610b0061490c565b600181811c90821680614c0a57607f821691505b6020821081036146ff57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614c3a81614bf6565b806020870152604060018084165f8114614c5b5760018114614c7757614ca4565b60ff19851660408a0152604084151560051b8a01019550614ca4565b895f5260205f205f5b85811015614c9b5781548b8201860152908301908801614c80565b8a016040019650505b509398975050505050505050565b8051611a278161467c565b5f8060408385031215614cce575f80fd5b82516001600160401b0380821115614ce4575f80fd5b9084019060608287031215614cf7575f80fd5b614cff614a84565b82518152602080840151614d12816149ca565b82820152604084015183811115614d27575f80fd5b80850194505087601f850112614d3b575f80fd5b83519250614d4b614b6584614adc565b8381528882858701011115614d5e575f80fd5b614d6d84838301848801614940565b80604084015250819550614d82818801614cb2565b9450505050509250929050565b81810381811115610b0057610b0061490c565b6001600160401b03818116838216019080821115612ab757612ab761490c565b5f808335601e19843603018112614dd7575f80fd5b8301803591506001600160401b03821115614df0575f80fd5b602001915036819003821315611ea5575f80fd5b6001600160401b03818116838216028082169190828114614e2757614e2761490c565b505092915050565b5f6001600160401b03808316818103614bd557614bd561490c565b5f60208284031215614e5a575f80fd5b610b3e8261472f565b5f60208284031215614e73575f80fd5b813560ff81168114610b3e575f80fd5b601f821115610aeb57805f5260205f20601f840160051c81016020851015614ea85750805b601f840160051c820191505b81811015610bdf575f8155600101614eb4565b81516001600160401b03811115614ee057614ee0614a70565b614ef481614eee8454614bf6565b84614e83565b602080601f831160018114614f27575f8415614f105750858301515b5f19600386901b1c1916600185901b178555610d12565b5f85815260208120601f198616915b82811015614f5557888601518255948401946001909101908401614f36565b5085821015614f7257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614fd781604e860160208901614940565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 019217324..4dff5938a 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -465,39 +465,45 @@ abstract contract PoSValidatorManager is revert InvalidAddress(); } - // Set the delegator status to pending removed, so that it can be properly removed in - // the complete step, even if the delivered nonce is greater than the nonce used to - // initialize the removal. - $._delegatorStakes[delegationID].status = DelegatorStatus.PendingRemoved; - if (validator.status == ValidatorStatus.Active) { if (includeUptimeProof) { // Uptime proofs include the absolute number of seconds the validator has been active. _updateUptime(validationID, messageIndex); } + // Set the delegator status to pending removed, so that it can be properly removed in + // the complete step, even if the delivered nonce is greater than the nonce used to + // initialize the removal. + $._delegatorStakes[delegationID].status = DelegatorStatus.PendingRemoved; + ($._delegatorStakes[delegationID].endingNonce,) = _setValidatorWeight(validationID, validator.weight - delegator.weight); - $._redeemableDelegatorRewards[delegationID] = - _calculateDelegationReward(delegator, validator); + + $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator); + + emit DelegatorRemovalInitialized({ + delegationID: delegationID, + validationID: validationID + }); } else if (validator.status == ValidatorStatus.Completed) { - $._redeemableDelegatorRewards[delegationID] = - _calculateDelegationReward(delegator, validator); + $._redeemableDelegatorRewards[delegationID] = _calculateDelegationReward(delegator); + return _completeEndDelegation(delegationID); } else { revert InvalidValidatorStatus(); } - - emit DelegatorRemovalInitialized({delegationID: delegationID, validationID: validationID}); } /// @dev Calculates the reward owed to the delegator based on the state of the delegator and its corresponding validator. - function _calculateDelegationReward( - Delegator memory delegator, - Validator memory validator - ) private view returns (uint256) { + function _calculateDelegationReward(Delegator memory delegator) + private + view + returns (uint256) + { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); + Validator memory validator = getValidator(delegator.validationID); + uint64 delegationEndTime; if ( validator.status == ValidatorStatus.PendingRemoved From d69a789fd67658da8d9dfa2860d3492268acb950 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 26 Sep 2024 08:45:47 -0700 Subject: [PATCH 427/545] Add context to validator manager functions --- .../validator-manager/erc20_delegation.go | 5 + .../validator-manager/erc20_token_staking.go | 2 + .../validator-manager/native_delegation.go | 5 + .../validator-manager/native_token_staking.go | 2 + tests/flows/validator-manager/poa_to_pos.go | 4 + .../poa_validator_manager.go | 2 + tests/utils/validator_manager.go | 114 +++++++++++++----- 7 files changed, 107 insertions(+), 27 deletions(-) diff --git a/tests/flows/validator-manager/erc20_delegation.go b/tests/flows/validator-manager/erc20_delegation.go index 4dd2cdc5e..e8323de05 100644 --- a/tests/flows/validator-manager/erc20_delegation.go +++ b/tests/flows/validator-manager/erc20_delegation.go @@ -69,6 +69,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) validationID = utils.InitializeAndCompleteERC20ValidatorRegistration( + ctx, network, signatureAggregator, fundedKey, @@ -96,6 +97,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { nonce := uint64(1) receipt := utils.InitializeERC20DelegatorRegistration( + ctx, fundedKey, subnetAInfo, validationID, @@ -136,6 +138,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteERC20DelegatorRegistration( + ctx, fundedKey, delegationID, subnetAInfo, @@ -157,6 +160,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { { nonce := uint64(2) receipt := utils.InitializeEndERC20Delegation( + ctx, fundedKey, subnetAInfo, stakingManager, @@ -191,6 +195,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteEndERC20Delegation( + ctx, fundedKey, delegationID, subnetAInfo, diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index a6c3f9b72..6b2465f4d 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -73,6 +73,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) validationID := utils.InitializeAndCompleteERC20ValidatorRegistration( + ctx, network, signatureAggregator, fundedKey, @@ -88,6 +89,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // Delist the validator // utils.InitializeAndCompleteEndERC20Validation( + ctx, network, signatureAggregator, fundedKey, diff --git a/tests/flows/validator-manager/native_delegation.go b/tests/flows/validator-manager/native_delegation.go index cda020dcc..952852abc 100644 --- a/tests/flows/validator-manager/native_delegation.go +++ b/tests/flows/validator-manager/native_delegation.go @@ -72,6 +72,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) stakeAmount := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) validationID = utils.InitializeAndCompleteNativeValidatorRegistration( + ctx, network, signatureAggregator, fundedKey, @@ -97,6 +98,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { nonce := uint64(1) receipt := utils.InitializeNativeDelegatorRegistration( + ctx, fundedKey, subnetAInfo, validationID, @@ -136,6 +138,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteNativeDelegatorRegistration( + ctx, fundedKey, delegationID, subnetAInfo, @@ -157,6 +160,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { { nonce := uint64(2) receipt := utils.InitializeEndNativeDelegation( + ctx, fundedKey, subnetAInfo, stakingManager, @@ -191,6 +195,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // Deliver the Warp message to the subnet receipt = utils.CompleteEndNativeDelegation( + ctx, fundedKey, delegationID, subnetAInfo, diff --git a/tests/flows/validator-manager/native_token_staking.go b/tests/flows/validator-manager/native_token_staking.go index 9a0974e61..f5035097f 100644 --- a/tests/flows/validator-manager/native_token_staking.go +++ b/tests/flows/validator-manager/native_token_staking.go @@ -76,6 +76,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) // Iniatiate validator registration validationID := utils.InitializeAndCompleteNativeValidatorRegistration( + ctx, network, signatureAggregator, fundedKey, @@ -90,6 +91,7 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { // Delist the validator // utils.InitializeAndCompleteEndNativeValidation( + ctx, network, signatureAggregator, fundedKey, diff --git a/tests/flows/validator-manager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go index 21ab63680..6f50a384b 100644 --- a/tests/flows/validator-manager/poa_to_pos.go +++ b/tests/flows/validator-manager/poa_to_pos.go @@ -112,6 +112,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { // Register a validator poaWeight := uint64(1) poaValidationID := utils.InitializeAndCompletePoAValidatorRegistration( + ctx, network, signatureAggregator, ownerKey, @@ -193,6 +194,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) posValidationID := utils.InitializeAndCompleteNativeValidatorRegistration( + ctx, network, signatureAggregator, fundedKey, @@ -205,6 +207,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { // Delist the previous PoA validator utils.InitializeAndCompleteEndNativeValidation( + ctx, network, signatureAggregator, ownerKey, @@ -219,6 +222,7 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { // Delist the PoS validator utils.InitializeAndCompleteEndNativeValidation( + ctx, network, signatureAggregator, fundedKey, diff --git a/tests/flows/validator-manager/poa_validator_manager.go b/tests/flows/validator-manager/poa_validator_manager.go index 28866d58d..7694866aa 100644 --- a/tests/flows/validator-manager/poa_validator_manager.go +++ b/tests/flows/validator-manager/poa_validator_manager.go @@ -107,6 +107,7 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { // Initiate validator registration validationID = utils.InitializeAndCompletePoAValidatorRegistration( + ctx, network, signatureAggregator, ownerKey, @@ -133,6 +134,7 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { Expect(err).ShouldNot(BeNil()) utils.InitializeAndCompleteEndPoAValidation( + ctx, network, signatureAggregator, ownerKey, diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index f39c11e24..c462a7e32 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -103,7 +103,7 @@ func DeployAndInitializeNativeTokenStakingManager( }, ) Expect(err).Should(BeNil()) - WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) return stakingManagerContractAddress, stakingManager } @@ -172,7 +172,7 @@ func DeployAndInitializeERC20TokenStakingManager( erc20Address, ) Expect(err).Should(BeNil()) - WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) return stakingManagerContractAddress, stakingManager, erc20Address, erc20 } @@ -221,7 +221,7 @@ func DeployAndInitializePoAValidatorManager( ownerAddress, ) Expect(err).Should(BeNil()) - WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) return validatorManagerAddress, validatorManager } @@ -288,6 +288,7 @@ func InitializeNativeTokenValidatorSet( ) // Deliver the Warp message to the subnet receipt := DeliverNativeTokenSubnetConversion( + ctx, sendingKey, subnetInfo, validatorManagerAddress, @@ -346,6 +347,7 @@ func InitializeERC20TokenValidatorSet( ) // Deliver the Warp message to the subnet receipt := DeliverERC20TokenSubnetConversion( + ctx, sendingKey, subnetInfo, validatorManagerAddress, @@ -405,6 +407,7 @@ func InitializePoAValidatorSet( ) // Deliver the Warp message to the subnet receipt := DeliverPoASubnetConversion( + ctx, sendingKey, subnetInfo, validatorManagerAddress, @@ -427,6 +430,7 @@ func InitializePoAValidatorSet( } func DeliverNativeTokenSubnetConversion( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validatorManagerAddress common.Address, @@ -438,6 +442,7 @@ func DeliverNativeTokenSubnetConversion( callData, err := abi.Pack("initializeValidatorSet", subnetConversionData, uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -447,6 +452,7 @@ func DeliverNativeTokenSubnetConversion( } func DeliverERC20TokenSubnetConversion( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validatorManagerAddress common.Address, @@ -458,6 +464,7 @@ func DeliverERC20TokenSubnetConversion( callData, err := abi.Pack("initializeValidatorSet", subnetConversionData, uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -467,6 +474,7 @@ func DeliverERC20TokenSubnetConversion( } func DeliverPoASubnetConversion( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validatorManagerAddress common.Address, @@ -478,6 +486,7 @@ func DeliverPoASubnetConversion( callData, err := abi.Pack("initializeValidatorSet", subnetConversionData, uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -491,6 +500,7 @@ func DeliverPoASubnetConversion( // func InitializeNativeValidatorRegistration( + ctx context.Context, senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakeAmount *big.Int, @@ -513,7 +523,7 @@ func InitializeNativeValidatorRegistration( DefaultMinStakeDurationSeconds, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) registrationInitiatedEvent, err := GetEventFromLogs( receipt.Logs, stakingManager.ParseValidationPeriodCreated, @@ -523,6 +533,7 @@ func InitializeNativeValidatorRegistration( } func InitializeERC20ValidatorRegistration( + ctx context.Context, senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakeAmount *big.Int, @@ -533,7 +544,7 @@ func InitializeERC20ValidatorRegistration( stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, ) (*types.Receipt, ids.ID) { ERC20Approve( - context.Background(), + ctx, token, stakingManagerAddress, stakeAmount, @@ -556,7 +567,7 @@ func InitializeERC20ValidatorRegistration( stakeAmount, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) registrationInitiatedEvent, err := GetEventFromLogs( receipt.Logs, stakingManager.ParseValidationPeriodCreated, @@ -566,6 +577,7 @@ func InitializeERC20ValidatorRegistration( } func InitializePoAValidatorRegistration( + ctx context.Context, senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, weight uint64, @@ -586,7 +598,7 @@ func InitializePoAValidatorRegistration( weight, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) registrationInitiatedEvent, err := GetEventFromLogs( receipt.Logs, validatorManager.ParseValidationPeriodCreated, @@ -596,6 +608,7 @@ func InitializePoAValidatorRegistration( } func CompleteNativeValidatorRegistration( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -606,6 +619,7 @@ func CompleteNativeValidatorRegistration( callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -615,6 +629,7 @@ func CompleteNativeValidatorRegistration( } func CompleteERC20ValidatorRegistration( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -625,6 +640,7 @@ func CompleteERC20ValidatorRegistration( callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -634,6 +650,7 @@ func CompleteERC20ValidatorRegistration( } func CompletePoAValidatorRegistration( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validatorManagerAddress common.Address, @@ -644,6 +661,7 @@ func CompletePoAValidatorRegistration( callData, err := abi.Pack("completeValidatorRegistration", uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -654,13 +672,14 @@ func CompletePoAValidatorRegistration( // Calls a method that retreived a signed Warp message from the transaction's access list func CallWarpReceiver( + ctx context.Context, callData []byte, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, contract common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { - gasFeeCap, gasTipCap, nonce := CalculateTxParams(context.Background(), subnet, PrivateKeyToAddress(sendingKey)) + gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnet, PrivateKeyToAddress(sendingKey)) registrationTx := predicateutils.NewPredicateTx( subnet.EVMChainID, nonce, @@ -675,10 +694,11 @@ func CallWarpReceiver( signedMessage.Bytes(), ) signedRegistrationTx := SignTransaction(registrationTx, sendingKey, subnet.EVMChainID) - return SendTransactionAndWaitForSuccess(context.Background(), subnet, signedRegistrationTx) + return SendTransactionAndWaitForSuccess(ctx, subnet, signedRegistrationTx) } func InitializeAndCompleteNativeValidatorRegistration( + ctx context.Context, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, fundedKey *ecdsa.PrivateKey, @@ -692,6 +712,7 @@ func InitializeAndCompleteNativeValidatorRegistration( nodeID := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} receipt, validationID := InitializeNativeValidatorRegistration( + ctx, fundedKey, subnetInfo, stakeAmount, @@ -702,7 +723,7 @@ func InitializeAndCompleteNativeValidatorRegistration( // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) weight, err := stakingManager.ValueToWeight( &bind.CallOpts{}, @@ -730,6 +751,7 @@ func InitializeAndCompleteNativeValidatorRegistration( // Deliver the Warp message to the subnet receipt = CompleteNativeValidatorRegistration( + ctx, fundedKey, subnetInfo, stakingManagerContractAddress, @@ -747,6 +769,7 @@ func InitializeAndCompleteNativeValidatorRegistration( } func InitializeAndCompleteERC20ValidatorRegistration( + ctx context.Context, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, fundedKey *ecdsa.PrivateKey, @@ -762,6 +785,7 @@ func InitializeAndCompleteERC20ValidatorRegistration( blsPublicKey := [bls.PublicKeyLen]byte{} var receipt *types.Receipt receipt, validationID := InitializeERC20ValidatorRegistration( + ctx, fundedKey, subnetInfo, stakeAmount, @@ -774,7 +798,7 @@ func InitializeAndCompleteERC20ValidatorRegistration( // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) weight, err := stakingManager.ValueToWeight( &bind.CallOpts{}, @@ -802,6 +826,7 @@ func InitializeAndCompleteERC20ValidatorRegistration( // Deliver the Warp message to the subnet receipt = CompleteERC20ValidatorRegistration( + ctx, fundedKey, subnetInfo, stakingManagerAddress, @@ -819,6 +844,7 @@ func InitializeAndCompleteERC20ValidatorRegistration( } func InitializeAndCompletePoAValidatorRegistration( + ctx context.Context, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, ownerKey *ecdsa.PrivateKey, @@ -833,6 +859,7 @@ func InitializeAndCompletePoAValidatorRegistration( nodeID := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} receipt, validationID := InitializePoAValidatorRegistration( + ctx, ownerKey, subnetInfo, weight, @@ -843,7 +870,7 @@ func InitializeAndCompletePoAValidatorRegistration( // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) // Validate the Warp message, (this will be done on the P-Chain in the future) ValidateRegisterSubnetValidatorMessage( @@ -866,6 +893,7 @@ func InitializeAndCompletePoAValidatorRegistration( // Deliver the Warp message to the subnet receipt = CompletePoAValidatorRegistration( + ctx, fundedKey, subnetInfo, validatorManagerAddress, @@ -883,6 +911,7 @@ func InitializeAndCompletePoAValidatorRegistration( } func InitializeEndNativeValidation( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, @@ -897,10 +926,11 @@ func InitializeEndNativeValidation( 0, ) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + return WaitForTransactionSuccess(ctx, subnet, tx.Hash()) } func InitializeEndERC20Validation( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, @@ -915,10 +945,11 @@ func InitializeEndERC20Validation( 0, ) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + return WaitForTransactionSuccess(ctx, subnet, tx.Hash()) } func InitializeEndPoAValidation( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validatorManager *poavalidatormanager.PoAValidatorManager, @@ -931,10 +962,11 @@ func InitializeEndPoAValidation( validationID, ) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + return WaitForTransactionSuccess(ctx, subnet, tx.Hash()) } func CompleteEndNativeValidation( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -945,6 +977,7 @@ func CompleteEndNativeValidation( callData, err := abi.Pack("completeEndValidation", uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -954,6 +987,7 @@ func CompleteEndNativeValidation( } func CompleteEndERC20Validation( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -964,6 +998,7 @@ func CompleteEndERC20Validation( callData, err := abi.Pack("completeEndValidation", uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -973,6 +1008,7 @@ func CompleteEndERC20Validation( } func CompleteEndPoAValidation( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validatorManagerAddress common.Address, @@ -983,6 +1019,7 @@ func CompleteEndPoAValidation( callData, err := abi.Pack("completeEndValidation", uint32(0)) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -992,6 +1029,7 @@ func CompleteEndPoAValidation( } func InitializeERC20DelegatorRegistration( + ctx context.Context, senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validationID ids.ID, @@ -1001,7 +1039,7 @@ func InitializeERC20DelegatorRegistration( stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, ) *types.Receipt { ERC20Approve( - context.Background(), + ctx, token, stakingManagerAddress, delegationAmount, @@ -1018,7 +1056,7 @@ func InitializeERC20DelegatorRegistration( delegationAmount, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) _, err = GetEventFromLogs( receipt.Logs, stakingManager.ParseDelegatorAdded, @@ -1028,6 +1066,7 @@ func InitializeERC20DelegatorRegistration( } func CompleteERC20DelegatorRegistration( + ctx context.Context, sendingKey *ecdsa.PrivateKey, delegationID ids.ID, subnet interfaces.SubnetTestInfo, @@ -1039,6 +1078,7 @@ func CompleteERC20DelegatorRegistration( callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegationID) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -1048,6 +1088,7 @@ func CompleteERC20DelegatorRegistration( } func InitializeEndERC20Delegation( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, @@ -1062,10 +1103,11 @@ func InitializeEndERC20Delegation( 0, ) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + return WaitForTransactionSuccess(ctx, subnet, tx.Hash()) } func CompleteEndERC20Delegation( + ctx context.Context, sendingKey *ecdsa.PrivateKey, delegationID ids.ID, subnet interfaces.SubnetTestInfo, @@ -1077,6 +1119,7 @@ func CompleteEndERC20Delegation( callData, err := abi.Pack("completeEndDelegation", uint32(0), delegationID) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -1085,7 +1128,9 @@ func CompleteEndERC20Delegation( ) } -func InitializeNativeDelegatorRegistration(senderKey *ecdsa.PrivateKey, +func InitializeNativeDelegatorRegistration( + ctx context.Context, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validationID ids.ID, delegationAmount *big.Int, @@ -1101,7 +1146,7 @@ func InitializeNativeDelegatorRegistration(senderKey *ecdsa.PrivateKey, validationID, ) Expect(err).Should(BeNil()) - receipt := WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) _, err = GetEventFromLogs( receipt.Logs, stakingManager.ParseDelegatorAdded, @@ -1111,6 +1156,7 @@ func InitializeNativeDelegatorRegistration(senderKey *ecdsa.PrivateKey, } func CompleteNativeDelegatorRegistration( + ctx context.Context, sendingKey *ecdsa.PrivateKey, delegationID ids.ID, subnet interfaces.SubnetTestInfo, @@ -1122,6 +1168,7 @@ func CompleteNativeDelegatorRegistration( callData, err := abi.Pack("completeDelegatorRegistration", uint32(0), delegationID) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -1131,6 +1178,7 @@ func CompleteNativeDelegatorRegistration( } func InitializeEndNativeDelegation( + ctx context.Context, sendingKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, @@ -1145,10 +1193,11 @@ func InitializeEndNativeDelegation( 0, ) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) + return WaitForTransactionSuccess(ctx, subnet, tx.Hash()) } func CompleteEndNativeDelegation( + ctx context.Context, sendingKey *ecdsa.PrivateKey, delegationID ids.ID, subnet interfaces.SubnetTestInfo, @@ -1160,6 +1209,7 @@ func CompleteEndNativeDelegation( callData, err := abi.Pack("completeEndDelegation", uint32(0), delegationID) Expect(err).Should(BeNil()) return CallWarpReceiver( + ctx, callData, sendingKey, subnet, @@ -1169,6 +1219,7 @@ func CompleteEndNativeDelegation( } func InitializeAndCompleteEndNativeValidation( + ctx context.Context, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, fundedKey *ecdsa.PrivateKey, @@ -1180,8 +1231,9 @@ func InitializeAndCompleteEndNativeValidation( weight uint64, nonce uint64, ) { - WaitMinStakeDuration(subnetInfo, fundedKey) + WaitMinStakeDuration(ctx, subnetInfo, fundedKey) receipt := InitializeEndNativeValidation( + ctx, fundedKey, subnetInfo, stakingManager, @@ -1197,7 +1249,7 @@ func InitializeAndCompleteEndNativeValidation( // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) @@ -1215,6 +1267,7 @@ func InitializeAndCompleteEndNativeValidation( // Deliver the Warp message to the subnet receipt = CompleteEndNativeValidation( + ctx, fundedKey, subnetInfo, stakingManagerAddress, @@ -1231,6 +1284,7 @@ func InitializeAndCompleteEndNativeValidation( } func InitializeAndCompleteEndERC20Validation( + ctx context.Context, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, fundedKey *ecdsa.PrivateKey, @@ -1242,8 +1296,9 @@ func InitializeAndCompleteEndERC20Validation( weight uint64, nonce uint64, ) { - WaitMinStakeDuration(subnetInfo, fundedKey) + WaitMinStakeDuration(ctx, subnetInfo, fundedKey) receipt := InitializeEndERC20Validation( + ctx, fundedKey, subnetInfo, stakingManager, @@ -1259,7 +1314,7 @@ func InitializeAndCompleteEndERC20Validation( // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) @@ -1277,6 +1332,7 @@ func InitializeAndCompleteEndERC20Validation( // Deliver the Warp message to the subnet receipt = CompleteEndERC20Validation( + ctx, fundedKey, subnetInfo, stakingManagerAddress, @@ -1293,6 +1349,7 @@ func InitializeAndCompleteEndERC20Validation( } func InitializeAndCompleteEndPoAValidation( + ctx context.Context, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, ownerKey *ecdsa.PrivateKey, @@ -1306,6 +1363,7 @@ func InitializeAndCompleteEndPoAValidation( nonce uint64, ) { receipt := InitializeEndPoAValidation( + ctx, ownerKey, subnetInfo, validatorManager, @@ -1321,7 +1379,7 @@ func InitializeAndCompleteEndPoAValidation( // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetInfo, pChainInfo) + signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) @@ -1339,6 +1397,7 @@ func InitializeAndCompleteEndPoAValidation( // Deliver the Warp message to the subnet receipt = CompleteEndPoAValidation( + ctx, ownerKey, subnetInfo, validatorManagerAddress, @@ -1499,6 +1558,7 @@ func ValidateSetSubnetValidatorWeightMessage( } func WaitMinStakeDuration( + ctx context.Context, subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey, ) { @@ -1508,7 +1568,7 @@ func WaitMinStakeDuration( // Send a loopback transaction to self to force a block production // before delisting the validator. SendNativeTransfer( - context.Background(), + ctx, subnet, fundedKey, common.Address{}, From 3a61c5a8c943d906673de9018c1e3d84e9cd42bf Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 26 Sep 2024 08:46:10 -0700 Subject: [PATCH 428/545] Rename sendingKey to senderKey --- tests/utils/validator_manager.go | 90 ++++++++++++++++---------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index c462a7e32..f3efd5bb2 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -253,7 +253,7 @@ func DeployExampleRewardCalculator( func InitializeNativeTokenValidatorSet( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnetInfo interfaces.SubnetTestInfo, pChainInfo interfaces.SubnetTestInfo, validatorManager *nativetokenstakingmanager.NativeTokenStakingManager, @@ -289,7 +289,7 @@ func InitializeNativeTokenValidatorSet( // Deliver the Warp message to the subnet receipt := DeliverNativeTokenSubnetConversion( ctx, - sendingKey, + senderKey, subnetInfo, validatorManagerAddress, subnetConversionSignedMessage, @@ -312,7 +312,7 @@ func InitializeNativeTokenValidatorSet( func InitializeERC20TokenValidatorSet( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnetInfo interfaces.SubnetTestInfo, pChainInfo interfaces.SubnetTestInfo, validatorManager *erc20tokenstakingmanager.ERC20TokenStakingManager, @@ -348,7 +348,7 @@ func InitializeERC20TokenValidatorSet( // Deliver the Warp message to the subnet receipt := DeliverERC20TokenSubnetConversion( ctx, - sendingKey, + senderKey, subnetInfo, validatorManagerAddress, subnetConversionSignedMessage, @@ -371,7 +371,7 @@ func InitializeERC20TokenValidatorSet( func InitializePoAValidatorSet( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnetInfo interfaces.SubnetTestInfo, pChainInfo interfaces.SubnetTestInfo, validatorManager *poavalidatormanager.PoAValidatorManager, @@ -408,7 +408,7 @@ func InitializePoAValidatorSet( // Deliver the Warp message to the subnet receipt := DeliverPoASubnetConversion( ctx, - sendingKey, + senderKey, subnetInfo, validatorManagerAddress, subnetConversionSignedMessage, @@ -431,7 +431,7 @@ func InitializePoAValidatorSet( func DeliverNativeTokenSubnetConversion( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validatorManagerAddress common.Address, subnetConversionSignedMessage *avalancheWarp.Message, @@ -444,7 +444,7 @@ func DeliverNativeTokenSubnetConversion( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, validatorManagerAddress, subnetConversionSignedMessage, @@ -453,7 +453,7 @@ func DeliverNativeTokenSubnetConversion( func DeliverERC20TokenSubnetConversion( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validatorManagerAddress common.Address, subnetConversionSignedMessage *avalancheWarp.Message, @@ -466,7 +466,7 @@ func DeliverERC20TokenSubnetConversion( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, validatorManagerAddress, subnetConversionSignedMessage, @@ -475,7 +475,7 @@ func DeliverERC20TokenSubnetConversion( func DeliverPoASubnetConversion( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validatorManagerAddress common.Address, subnetConversionSignedMessage *avalancheWarp.Message, @@ -488,7 +488,7 @@ func DeliverPoASubnetConversion( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, validatorManagerAddress, subnetConversionSignedMessage, @@ -609,7 +609,7 @@ func InitializePoAValidatorRegistration( func CompleteNativeValidatorRegistration( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, registrationSignedMessage *avalancheWarp.Message, @@ -621,7 +621,7 @@ func CompleteNativeValidatorRegistration( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, stakingManagerContractAddress, registrationSignedMessage, @@ -630,7 +630,7 @@ func CompleteNativeValidatorRegistration( func CompleteERC20ValidatorRegistration( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, registrationSignedMessage *avalancheWarp.Message, @@ -642,7 +642,7 @@ func CompleteERC20ValidatorRegistration( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, stakingManagerContractAddress, registrationSignedMessage, @@ -651,7 +651,7 @@ func CompleteERC20ValidatorRegistration( func CompletePoAValidatorRegistration( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validatorManagerAddress common.Address, registrationSignedMessage *avalancheWarp.Message, @@ -663,7 +663,7 @@ func CompletePoAValidatorRegistration( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, validatorManagerAddress, registrationSignedMessage, @@ -674,12 +674,12 @@ func CompletePoAValidatorRegistration( func CallWarpReceiver( ctx context.Context, callData []byte, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, contract common.Address, signedMessage *avalancheWarp.Message, ) *types.Receipt { - gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnet, PrivateKeyToAddress(sendingKey)) + gasFeeCap, gasTipCap, nonce := CalculateTxParams(ctx, subnet, PrivateKeyToAddress(senderKey)) registrationTx := predicateutils.NewPredicateTx( subnet.EVMChainID, nonce, @@ -693,7 +693,7 @@ func CallWarpReceiver( warp.ContractAddress, signedMessage.Bytes(), ) - signedRegistrationTx := SignTransaction(registrationTx, sendingKey, subnet.EVMChainID) + signedRegistrationTx := SignTransaction(registrationTx, senderKey, subnet.EVMChainID) return SendTransactionAndWaitForSuccess(ctx, subnet, signedRegistrationTx) } @@ -912,12 +912,12 @@ func InitializeAndCompletePoAValidatorRegistration( func InitializeEndNativeValidation( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, validationID ids.ID, ) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndValidation( opts, @@ -931,12 +931,12 @@ func InitializeEndNativeValidation( func InitializeEndERC20Validation( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, validationID ids.ID, ) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndValidation( opts, @@ -950,12 +950,12 @@ func InitializeEndERC20Validation( func InitializeEndPoAValidation( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validatorManager *poavalidatormanager.PoAValidatorManager, validationID ids.ID, ) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := validatorManager.InitializeEndValidation( opts, @@ -967,7 +967,7 @@ func InitializeEndPoAValidation( func CompleteEndNativeValidation( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, registrationSignedMessage *avalancheWarp.Message, @@ -979,7 +979,7 @@ func CompleteEndNativeValidation( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, stakingManagerContractAddress, registrationSignedMessage, @@ -988,7 +988,7 @@ func CompleteEndNativeValidation( func CompleteEndERC20Validation( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, registrationSignedMessage *avalancheWarp.Message, @@ -1000,7 +1000,7 @@ func CompleteEndERC20Validation( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, stakingManagerContractAddress, registrationSignedMessage, @@ -1009,7 +1009,7 @@ func CompleteEndERC20Validation( func CompleteEndPoAValidation( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, validatorManagerAddress common.Address, registrationSignedMessage *avalancheWarp.Message, @@ -1021,7 +1021,7 @@ func CompleteEndPoAValidation( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, validatorManagerAddress, registrationSignedMessage, @@ -1067,7 +1067,7 @@ func InitializeERC20DelegatorRegistration( func CompleteERC20DelegatorRegistration( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, delegationID ids.ID, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -1080,7 +1080,7 @@ func CompleteERC20DelegatorRegistration( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, stakingManagerContractAddress, signedMessage, @@ -1089,12 +1089,12 @@ func CompleteERC20DelegatorRegistration( func InitializeEndERC20Delegation( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, delegationID ids.ID, ) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndDelegation( opts, @@ -1108,7 +1108,7 @@ func InitializeEndERC20Delegation( func CompleteEndERC20Delegation( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, delegationID ids.ID, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -1121,7 +1121,7 @@ func CompleteEndERC20Delegation( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, stakingManagerContractAddress, signedMessage, @@ -1157,7 +1157,7 @@ func InitializeNativeDelegatorRegistration( func CompleteNativeDelegatorRegistration( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, delegationID ids.ID, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -1170,7 +1170,7 @@ func CompleteNativeDelegatorRegistration( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, stakingManagerContractAddress, signedMessage, @@ -1179,12 +1179,12 @@ func CompleteNativeDelegatorRegistration( func InitializeEndNativeDelegation( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, delegationID ids.ID, ) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(sendingKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) tx, err := stakingManager.InitializeEndDelegation( opts, @@ -1198,7 +1198,7 @@ func InitializeEndNativeDelegation( func CompleteEndNativeDelegation( ctx context.Context, - sendingKey *ecdsa.PrivateKey, + senderKey *ecdsa.PrivateKey, delegationID ids.ID, subnet interfaces.SubnetTestInfo, stakingManagerContractAddress common.Address, @@ -1211,7 +1211,7 @@ func CompleteEndNativeDelegation( return CallWarpReceiver( ctx, callData, - sendingKey, + senderKey, subnet, stakingManagerContractAddress, signedMessage, From 3798c23d2d2b4a611866915c4afa3fdb6bd0c821 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 26 Sep 2024 15:32:19 -0500 Subject: [PATCH 429/545] revamp validator manager docs --- contracts/validator-manager/Delegation.md | 37 --- contracts/validator-manager/MessageSpec.md | 127 +++++++++ contracts/validator-manager/README.md | 243 +++++++----------- .../validator-manager/StateTransition.md | 33 +++ 4 files changed, 259 insertions(+), 181 deletions(-) delete mode 100644 contracts/validator-manager/Delegation.md create mode 100644 contracts/validator-manager/MessageSpec.md create mode 100644 contracts/validator-manager/StateTransition.md diff --git a/contracts/validator-manager/Delegation.md b/contracts/validator-manager/Delegation.md deleted file mode 100644 index 73d08c6c3..000000000 --- a/contracts/validator-manager/Delegation.md +++ /dev/null @@ -1,37 +0,0 @@ -## Delegation - -`PoSValidatorManager` supports Delegation to an active Validator as a way for users to earn staking rewards without having to validate the chain. Delegators pay a configurable percentage fee on any earned staking rewards to the host Validator. Delegations are reflected on the P-Chain by adjusting the Validator's registered weight via a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The weight change acknowledgement is delivered to the `PoSValidatorManager` via a [`SubnetValidatorWeightUpdateMessage`](./README.md#subnetvalidatorweightupdatemessage). - -> [!NOTE] -> The P-Chain is only willing to sign a `SubnetValidatorWeightUpdateMessage` for an active Validator. Once Validator exit has been initiated (via a call to `initializeEndValidation`), the `PoSValidatorManager` must assume that the Validator has been deactivated on the P-Chain, and will therefore not sign any further weight updates. Therefore, it is invalid to _initiate_ adding or removing a Delegator when the Validator is in this state, though it _may be_ valid to _complete_ an already initiated Delegator action, depending on the order of delivery to the P-Chain. If the Delegator weight change was submitted (and a Warp signature on the acknowledgement retrieved) before the Validator was removed, then the Delegator action may be completed. Otherwise, the acknowledgement of the Validation end must first be delivered before completing the Delegator action. - -The following state transition diagram illustrates the relationship between Validator and Delegator state. `Validator` is abbreviated as `V`, `Delegator` is abbreviated as `D`, and function names are shortened to improve readability. `Delegator.Completed` is omitted to show equivalance between the Validator's initial state and the state after a Delegation completes. -```mermaid -stateDiagram-v2 - % Happy path - [*] --> V.PendingAdded : initAddVdr - V.PendingAdded --> V.Active : completeVdrReg - V.Active --> V.Active,D.PendingAdded : initAddDel - V.Active,D.PendingAdded --> V.Active,D.Active : completeAddDel - V.Active,D.Active --> V.Active,D.PendingRemoved : initEndDel - V.Active,D.PendingRemoved --> V.Active : completeEndDel - V.Active --> V.PendingRemoved : initEndVdr - V.PendingRemoved --> V.Completed : completeEndVdr - - % Validator/Delegator state changes do not affect the Delegator/Validator state - V.Active,D.PendingRemoved --> V.PendingRemoved,D.PendingRemoved : initEndVdr - V.Active,D.PendingAdded --> V.PendingRemoved,D.PendingAdded : initEndVdr - V.Active,D.Active --> V.PendingRemoved,D.Active: initEndVdr - - % When the Validator is in PendingRemoved or Completed, in general Delegator actions - % may be completed, but not initialized. - V.PendingRemoved,D.PendingAdded --> V.Completed,D.PendingAdded : completeEndVdr - V.PendingRemoved,D.PendingRemoved --> V.Completed,D.PendingRemoved : completeEndVdr - V.PendingRemoved,D.PendingRemoved --> V.PendingRemoved : completeEndDel - V.PendingRemoved,D.Active --> V.Completed,D.Active : completeEndVdr - % This is a no-op - V.PendingRemoved,D.PendingAdded --> V.PendingRemoved,D.Active : completeAddDel - V.Completed,D.PendingRemoved --> V.Completed : endDelegationCompletedValidator - V.Completed,D.Active --> V.Completed : endDelegationCompletedValidator - V.Completed,D.PendingAdded --> V.Completed : endDelegationCompletedValidator -``` \ No newline at end of file diff --git a/contracts/validator-manager/MessageSpec.md b/contracts/validator-manager/MessageSpec.md new file mode 100644 index 000000000..4eae196ec --- /dev/null +++ b/contracts/validator-manager/MessageSpec.md @@ -0,0 +1,127 @@ +## Warp Message Format Reference + +### `RegisterSubnetValidatorMessage` + +Description: Issued by the Validator Manager contract in order to register a Subnet validator + +Signed by: Subnet +Consumed by: P-Chain + +Specification: + +``` ++--------------+----------+-----------+ +| codecID : uint16 | 2 bytes | ++--------------+----------+-----------+ +| typeID : uint32 | 4 bytes | ++--------------+----------+-----------+ +| subnetID : [32]byte | 32 bytes | ++--------------+----------+-----------+ +| nodeID : [32]byte | 32 bytes | ++--------------+----------+-----------+ +| weight : uint64 | 8 bytes | ++--------------+----------+-----------+ +| blsPublicKey : [48]byte | 48 bytes | ++--------------+----------+-----------+ +| expiry : uint64 | 8 bytes | ++--------------+----------+-----------+ + | 134 bytes | + +-----------+ + +``` + +### `SubnetValidatorRegistrationMessage` + +Description: Issued by the P-Chain in order to confirm Subnet validator registration + +Signed by: P-Chain +Consumed by: Validator Manager contract + +Specification: + +``` ++--------------+----------+----------+ +| codecID : uint16 | 2 bytes | ++--------------+----------+----------+ +| typeID : uint32 | 4 bytes | ++--------------+----------+----------+ +| validationID : [32]byte | 32 bytes | ++--------------+----------+----------+ +| valid : bool | 1 byte | ++--------------+----------+----------+ + | 39 bytes | + +----------+ +``` + +### `ValidationUptimeMessage` + +Description: Issued by the Subnet in order to provide validator uptime to the Subnet to calculate staking rewards + +Signed by: Subnet +Consumed by: Validator Manager contract + +Specification: + +``` ++--------------+----------+----------+ +| codecID : uint16 | 2 bytes | ++--------------+----------+----------+ +| typeID : uint32 | 4 bytes | ++--------------+----------+----------+ +| validationID : [32]byte | 32 bytes | ++--------------+----------+----------+ +| uptime : uint64 | 8 bytes | ++--------------+----------+----------+ + | 46 bytes | + +----------+ +``` + +### `SetSubnetValidatorWeightMessage` + +Description: Used to set a validator's stake weight on another chain + +Signed by: Subnet +Consumed by: P-Chain + +Specification: + +``` ++--------------+----------+----------+ +| codecID : uint16 | 2 bytes | ++--------------+----------+----------+ +| typeID : uint32 | 4 bytes | ++--------------+----------+----------+ +| validationID : [32]byte | 32 bytes | ++--------------+----------+----------+ +| nonce : uint64 | 8 bytes | ++--------------+----------+----------+ +| weight : uint64 | 8 bytes | ++--------------+----------+----------+ + | 54 bytes | + +----------+ +``` + +### `SubnetValidatorWeightUpdateMessage` + +Description: Acknowledges a validator weight update + +Signed by: P-Chain +Consumed by: Validator Manager contract + +Specification: + +``` ++--------------+----------+----------+ +| codecID : uint16 | 2 bytes | ++--------------+----------+----------+ +| typeID : uint32 | 4 bytes | ++--------------+----------+----------+ +| validationID : [32]byte | 32 bytes | ++--------------+----------+----------+ +| nonce : uint64 | 8 bytes | ++--------------+----------+----------+ +| weight : uint64 | 8 bytes | ++--------------+----------+----------+ + | 54 bytes | + +----------+ +``` \ No newline at end of file diff --git a/contracts/validator-manager/README.md b/contracts/validator-manager/README.md index 6f3a820d8..2b9dea2cf 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -1,179 +1,134 @@ # Validator Manager Contract -`ValidatorManager.sol` defines the abstract staking contract used to manage subnet-only validators, as defined in [ACP-77](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets). - -_Disclaimer:_ The contracts in this directory are still under active development, are unaudited, and should not be used in production. - -## Usage - -The common case for adding or removing a validator from a Subnet's validator set follows these general steps: - -1. Initiate the change through the Validator Manager contract. The Validator Manager contract will construct a Warp message attesting to the change in the validator set. -2. Deliver the Warp message containing the validator set change to the P-Chain. The P-Chain will construct a Warp message acknowledging the change to the validator set. -3. Deliver the Warp message containing the P-Chain acknowledgement back to the Validator Manager contract on the Subnet. The Validator Manager contract finalizes the validator set change. - -### Initializing a Validator Set - -If the Subnet has no validators registered on the P-Chain, then it will not be able to sign a Warp message to add a validator (step 1 above). In this case, Subnet recovery must be performed on the P-Chain, which allows an initial validator set to be specified, along with each validator's expiry. These validators are *not* registered with the Subnet's Validator Manager, and are only used to bootstrap subnet consensus and Warp message signing. The following steps describe how to register validators with the Subnet's Validator Manager, after which the initial validator set specified during Subnet recovery may safely exit the validator set or expire. - -### Registering a Validator - -Validator registration is initiated with a call to `initializeValidatorRegistration` on the concrete Validator Manager contract. The Validator Manager contract constructs a [`RegisterSubnetValidatorMessage`](#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each validator registration request includes all of the information needed to identify the validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. - -The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a [`RegisterSubnetValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#registersubnetvalidatortx). Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a [`SubnetValidatorRegistrationMessage`](#subnetvalidatorregistrationmessage) Warp message indicating that the specified validator was successfully registered on the P-Chain. - -The `SubnetValidatorRegistrationMessage` is delivered to the Validator Manager contract via a call to `completeValidatorRegistration`. For PoS Validator Managers, staking rewards begin accruing at this time. - -#### Handling a Missed Expiry - -In the case of a missed expiry, the `RegisterSubnetValidatorTx` will result in a `SubnetValidatorRegistrationMessage` Warp message with `valid=0`. This serves as proof that the corresponding validation has not started and may never start. The `SubnetValidatorRegistrationMessage` can be provided to the Validator Manager contract by calling `completeEndValidation` with `setWeightMessageType=false`. - -### Exiting the Validator Set - -Validator exit is initiated with a call to `initializeEndValidation` on the Validator Manager contract. For PoS Validator Managers, a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message may optionally be provided in order to calculate the staking rewards; otherwise the validator's uptime will be set to `0`. This proof may be requested directly from the Subnet validators, which will provide it in a `ValidationUptimeMessage` Warp message. Once `initializeEndValidation` is called, staking rewards cease accruing for PoS Validator Managers: the Validator Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. - -The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The P-Chain acknowledges validator exit by signing a `SubnetValidatorRegistrationMessage` with `valid=0`, which is delivered to the Validator Manager by calling `completeEndValidation`. The validation is removed from the contract's state, and for PoS Validator Managers, staking rewards are disbursed and stake is returned. - -#### Disable a Validator Directly on the P-Chain - -ACP-77 also provides a method to disable a validator without interacting with the Subnet directly. The P-Chain transaction [`DisableValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#disablevalidatortx) disables the validator on the P-Chain. The disabled validator's weight will still count towards the Subnet's total weight. +> [!CAUTION] +> The contracts in this directory are still under active development, are unaudited, and should not be used in production. + +The contracts in this directory define the Validator Manager used to manage Subnet-only Validators, as defined in [ACP-77](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets). `ValidatorManager.sol` is the top-level abstract contract that provides the basic functionality. The other contracts are related as follows: + +```mermaid +classDiagram +class ValidatorManager { + initializeValidatorSet() + completeValidatorRegistration() + completeEndValidation() + +} +<> ValidatorManager +class PoSValidatorManager { + initializeEndValidation() + completeDelegatorRegistration() + initializeEndDelegation() + completeEndDelegation() +} +<> PoSValidatorManager +class ERC20TokenStakingManager { + initializeValidatorRegistration() + initializeDelegatorRegistration() +} +class NativeTokenStakingManager { + initializeValidatorRegistration() payable + initializeDelegatorRegistration() payable +} +class PoAValidatorManager { + initializeValidatorRegistration() + initializeEndValidation() +} + +ValidatorManager <|-- PoSValidatorManager +ValidatorManager <|-- PoAValidatorManager +PoSValidatorManager <|-- ERC20TokenStakingManager +PoSValidatorManager <|-- NativeTokenStakingManager +``` -Disabled Subnet validators can re-activate at any time by increasing their balance with an `IncreaseBalanceTx`. Anyone can call `IncreaseBalanceTx` for any validator on the P-Chain. A disabled validator can only be totally removed from the validator set by a call to `initializeEndValidation`. +## Deploying -## Warp Message Format Reference +Three concrete `ValidatorManager` contracts are provided - `PoAValidatorManager`, `NativeTokenStakingManager`, and `ERC20TokenStakingManager`. `NativeTokenStakingManager`, and `ERC20TokenStakingManager` implement `PoSValidatorManager`, which itself implements `ValidatorManager`. These are implemented as [upgradeable](https://github.com/OpenZeppelin/openzeppelin-contracts-upgradeable/blob/main/contracts/proxy/utils/Initializable.sol#L56) contracts. There are numerous [guides](https://blog.chain.link/upgradable-smart-contracts/) for deploying upgradeable smart contracts, but the general steps are as follows: +1. Deploy the implementation contract +2. Deploy the proxy contract +3. Call the implementation contract's `initialize` function + - Each flavor of `ValidatorManager`` requires different settings. For example, `ValidatorManagerSettings` specifies the churn parameters, while `PoSValidatorManagerSettings` specifies the staking and rewards parameters. +4. Initialize the Validator set by calling `initializeValidatorSet` + - When a Subnet is first created on the P-Chain, it must be explicitly converted to a Subnet-only Validator compatible Subnet via [`ConvertSubnetTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setting-a-subnet-manager). The resulting `SubnetConversionMessage` Warp message is provided in the call to `initializeValidatorSet` to specify the starting Validator set in the `ValidatorManager`. Regardless of the implementation, these initial Validators are treated as PoA and are not eligible for staking rewards. -### `RegisterSubnetValidatorMessage` +### PoAValidatorManager -Description: Issued by the Validator Manager contract in order to register a Subnet validator +Proof-of-Authority Validator management is provided via `PoAValidatorManager`, which restricts modification of the Validator set to an owner address. After deploying `PoAValidatorManager.sol` and a proxy, the `initialize` function takes the owner address, in addition to standard `ValidatorManagerSettings`. -Signed by: Subnet -Consumed by: P-Chain +### NativeTokenStakingManager -Specification: +`NativeTokenStakingManager` implements `PoSValidatorManager`, and 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. ``` -+--------------+----------+-----------+ -| codecID : uint16 | 2 bytes | -+--------------+----------+-----------+ -| typeID : uint32 | 4 bytes | -+--------------+----------+-----------+ -| subnetID : [32]byte | 32 bytes | -+--------------+----------+-----------+ -| nodeID : [32]byte | 32 bytes | -+--------------+----------+-----------+ -| weight : uint64 | 8 bytes | -+--------------+----------+-----------+ -| blsPublicKey : [48]byte | 48 bytes | -+--------------+----------+-----------+ -| expiry : uint64 | 8 bytes | -+--------------+----------+-----------+ - | 134 bytes | - +-----------+ - +{ + "config" : { + ... + "contractNativeMinterConfig": { + "blockTimestamp": 0, + "adminAddresses": [ + "0xffffffffffffffffffffffffffffffffffffffff" + ] + } + }, + "alloc": { + "0xffffffffffffffffffffffffffffffffffffffff": { + "balance": "0x0", + "code": "", + "nonce": 1 + } + } +} ``` -### `SubnetValidatorRegistrationMessage` - -Description: Issued by the P-Chain in order to confirm Subnet validator registration +### ERC20TokenStakingManager +`ERC20TokenStakingManager` also implements `PoSValidatorManager`, and allows permissionless addition and removal of Validators that post the an ERC20 token as stake. The ERC20 is specified in the call to `initialize`, and must implement [`IERC20Mintable`](./interfaces/IERC20Mintable.sol). Care should be taken to enforce that only authorized users are able to call `mint`. -Signed by: P-Chain -Consumed by: Validator Manager contract +### Convert PoA to PoS -Specification: +A `PoAValidatorManager` can later be converted to a `PoSValidatorManager` by upgrading the implementation contract pointed to by the proxy. After performing the upgrade, the `PoSValidatorManager` contract should be initialized by calling `initialize` as described above. The Validator set contained in the `PoAValidatorManager` will be tracked by the `PoSValidatorManager` after the upgrade, but will not be eligible to earn staking rewards, nor are they able to be delegated to. -``` -+--------------+----------+----------+ -| codecID : uint16 | 2 bytes | -+--------------+----------+----------+ -| typeID : uint32 | 4 bytes | -+--------------+----------+----------+ -| validationID : [32]byte | 32 bytes | -+--------------+----------+----------+ -| valid : bool | 1 byte | -+--------------+----------+----------+ - | 39 bytes | - +----------+ -``` +## Usage +### Register a Validator +Validator registration is initiated with a call to `initializeValidatorRegistration`. Churn limitations are checked - only a certain percentage of the total weight is allowed to be added or removed in a given period of time. The `ValidatorManager` then constructs a [`RegisterSubnetValidatorMessage`](./MessageSpec.md#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each Validator registration request includes all of the information needed to identify the Validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. If the Validator is not registered on the P-Chain before the `expiry`, then the Validator may be removed from the contract state by calling `completeEndValidation`. -### `ValidationUptimeMessage` +The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a [`RegisterSubnetValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#registersubnetvalidatortx). Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a [`SubnetValidatorRegistrationMessage`](./MessageSpec.md#subnetvalidatorregistrationmessage) Warp message indicating that the specified Validator was successfully registered on the P-Chain. -Description: Issued by the Subnet in order to provide validator uptime to the Subnet to calculate staking rewards +The `SubnetValidatorRegistrationMessage` is delivered to the `ValidatorManager` via a call to `completeValidatorRegistration`. For PoS Validator Managers, staking rewards begin accruing at this time. -Signed by: Subnet -Consumed by: Validator Manager contract +### Remove a Validator +Validator exit is initiated with a call to `initializeEndValidation` on the `ValidatorManager` , For `PoSValidatorManagers` a [`ValidationUptimeMessage`](./MessageSpec.md#validationuptimemessage) Warp message may optionally be provided in order to calculate the staking rewards; otherwise the latest received uptime will be used (see [(PoS only) Submit and Uptime Proof](#pos-only-submit-an-uptime-proof)). This proof may be requested directly from the Subnet Validators, which will provide it in a `ValidationUptimeMessage` Warp message. If the uptime is not sufficient to earn Validation rewards, the call to `initializeEndValidation` will fail. `forceInitializeEndValidation` acts the same as `initializeEndValidation`, but bypasses the uptime-based rewards check. Once `initializeEndValidation` or `forceInitializeEndValidation` is called, staking rewards cease accruing for `PoSValidatorManagers`. -Specification: +The `ValidatorManager` contructs a [`SetSubnetValidatorWeightMessage`](./MessageSpec.md#setsubnetvalidatorweightmessage) Warp message with the weight set to `0`. This is delivered to the P-Chain as the payload of a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The P-Chain acknowledges Validator exit by signing a `SubnetValidatorRegistrationMessage` with `valid=0`, which is delivered to the `ValidatorManager` by calling `completeEndValidation`. The Validation is removed from the contract's state, and for `PoSValidatorManagers`, staking rewards are disbursed and stake is returned. -``` -+--------------+----------+----------+ -| codecID : uint16 | 2 bytes | -+--------------+----------+----------+ -| typeID : uint32 | 4 bytes | -+--------------+----------+----------+ -| validationID : [32]byte | 32 bytes | -+--------------+----------+----------+ -| uptime : uint64 | 8 bytes | -+--------------+----------+----------+ - | 46 bytes | - +----------+ -``` +#### Disable a Validator Directly on the P-Chain -### `SetSubnetValidatorWeightMessage` +ACP-77 also provides a method to disable a Validator without interacting with the Subnet directly. The P-Chain transaction [`DisableValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#disablevalidatortx) disables the Validator on the P-Chain. The disabled Validator's weight will still count towards the Subnet's total weight. -Description: Used to set a validator's stake weight on another chain +Disabled Subnet Validators can re-activate at any time by increasing their balance with an `IncreaseBalanceTx`. Anyone can call `IncreaseBalanceTx` for any Validator on the P-Chain. A disabled Validator can only be totally removed from the Validator set by a call to `initializeEndValidation`. -Signed by: Subnet -Consumed by: P-Chain +### (PoS only) Register a Delegator -Specification: +`PoSValidatorManager` supports Delegation to an active Validator as a way for users to earn staking rewards without having to validate the chain. Delegators pay a configurable percentage fee on any earned staking rewards to the host Validator. A Delegator may be registered by calling `initializeDelegatorRegistration` and providing an amount to stake. The Delegator will be registered as long as churn restrictions are not violated. The Delegator is reflected on the P-Chain by adjusting the Validator's registered weight via a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The weight change acknowledgement is delivered to the `PoSValidatorManager` via a [`SubnetValidatorWeightUpdateMessage`](./MessageSpec.md#subnetvalidatorweightupdatemessage), which is provided by calling `completeDelegatorRegistration`. -``` -+--------------+----------+----------+ -| codecID : uint16 | 2 bytes | -+--------------+----------+----------+ -| typeID : uint32 | 4 bytes | -+--------------+----------+----------+ -| validationID : [32]byte | 32 bytes | -+--------------+----------+----------+ -| nonce : uint64 | 8 bytes | -+--------------+----------+----------+ -| weight : uint64 | 8 bytes | -+--------------+----------+----------+ - | 54 bytes | - +----------+ -``` +> [!NOTE] +> The P-Chain is only willing to sign a `SubnetValidatorWeightUpdateMessage` for an active Validator. Once Validator exit has been initiated (via a call to `initializeEndValidation`), the `PoSValidatorManager` must assume that the Validator has been deactivated on the P-Chain, and will therefore not sign any further weight updates. Therefore, it is invalid to _initiate_ adding or removing a Delegator when the Validator is in this state, though it _may be_ valid to _complete_ an already initiated Delegator action, depending on the order of delivery to the P-Chain. If the Delegator weight change was submitted (and a Warp signature on the acknowledgement retrieved) before the Validator was removed, then the Delegator action may be completed. Otherwise, the acknowledgement of the Validation end must first be delivered before completing the Delegator action. -### `SubnetValidatorWeightUpdateMessage` +### (PoS only) Remove a Delegator -Description: Acknowledges a validator weight update +Delegators removal may be initiated by calling `initializeEndDelegation`, as long as churn restrictions are not violated. Similar to `initializeEndValidation`, an uptime proof may be provided to be used to determine Delegator rewards eligibility. If no proof is provided, the latest known uptime will be used (see [(PoS only) Submit and Uptime Proof](#pos-only-submit-an-uptime-proof)). The Validator's weight is updated on the P-Chain by the same mechanism used to register a Delegator. The `SubnetValidatorWeightUpdateMessage` from the P-Chain is delivered to the `PoSValidatorManager` in the call to `completeEndDelegation`. -Signed by: P-Chain -Consumed by: Validator Manager contract +### (PoS only) Submit an Uptime Proof -Specification: +The [rewards calculater](./interfaces/IRewardCalculator.sol) is a function of uptime seconds since the Validator's start time. In addition to doing so in the calls to `initializeEndValidation` and `initializeEndDelegation` as described above, uptime proofs may also be supplied by calling `submitUptimeProof`. Unlike `initializeEndValidation` and `initializeEndDelegation`, `submitUptimeProof` may be called by anyone, decreasing the likelihood of a Validation or Delegation not being able to claim rewards that it deserved based on its actual uptime. -``` -+--------------+----------+----------+ -| codecID : uint16 | 2 bytes | -+--------------+----------+----------+ -| typeID : uint32 | 4 bytes | -+--------------+----------+----------+ -| validationID : [32]byte | 32 bytes | -+--------------+----------+----------+ -| nonce : uint64 | 8 bytes | -+--------------+----------+----------+ -| weight : uint64 | 8 bytes | -+--------------+----------+----------+ - | 54 bytes | - +----------+ -``` +### (PoS only) Collect Staking Rewards +#### Validation Rewards -## Types of Validator Managers +Validation rewards are distributed in the call to `completeEndValidation`. -### Proof of Authority +#### Delegation Rewards -The Proof of Authority (PoA) validator manager is ownable, and only allows the owner to modify changes to the validator set of the Subnet. Validators are given a weight by the owner, but do not accrue staking rewards. +Delegation rewards are distributed in the call to `completeEndDelegation`. -### Proof of Stake +#### Delegation Fees -The Proof of Stake (PoS) validator manager allows any validator to register and exit the Subnet validator set. Validators are given a weight based on the amount of stake they provide, and accrue staking rewards based on their uptime. The staking rewards can be either native or erc20 tokens. +Delegation fees owed to Validators are _not_ distributed when the Validation ends as to bound the amount of gas consumed in the call to `completeEndValidation`. Instead, `claimDelegationFees` may be called after the Validation is completed. diff --git a/contracts/validator-manager/StateTransition.md b/contracts/validator-manager/StateTransition.md new file mode 100644 index 000000000..9dd3c8de5 --- /dev/null +++ b/contracts/validator-manager/StateTransition.md @@ -0,0 +1,33 @@ +## State Transitions + +The following state transition diagram illustrates the relationship between Validator and Delegator state. `Validator` is abbreviated as `V`, `Delegator` is abbreviated as `D`, and function names are shortened to improve readability. `Delegator.Completed` is omitted to show equivalance between the Validator's initial state and the state after a Delegation completes. +```mermaid +stateDiagram-v2 + % Happy path + [*] --> V.PendingAdded : initVdrReg + V.PendingAdded --> V.Active : completeVdrReg + V.PendingAdded --> V.Completed : completeVdrReg (expiry passed) + V.Active --> V.Active,D.PendingAdded : initDelReg + V.Active,D.PendingAdded --> V.Active,D.Active : completeDelReg + V.Active,D.Active --> V.Active,D.PendingRemoved : initEndDel + V.Active,D.PendingRemoved --> V.Active : completeEndDel + V.Active --> V.PendingRemoved : initEndVdr + V.PendingRemoved --> V.Completed : completeEndVdr + + % Validator/Delegator state changes do not affect the Delegator/Validator state + V.Active,D.PendingRemoved --> V.PendingRemoved,D.PendingRemoved : initEndVdr + V.Active,D.PendingAdded --> V.PendingRemoved,D.PendingAdded : initEndVdr + V.Active,D.Active --> V.PendingRemoved,D.Active: initEndVdr + + % When the Validator is in PendingRemoved or Completed, in general Delegator actions + % may be completed, but not initialized. + V.PendingRemoved,D.PendingAdded --> V.Completed,D.PendingAdded : completeEndVdr + V.PendingRemoved,D.PendingRemoved --> V.Completed,D.PendingRemoved : completeEndVdr + V.PendingRemoved,D.PendingRemoved --> V.PendingRemoved : completeEndDel + V.PendingRemoved,D.Active --> V.Completed,D.Active : completeEndVdr + % This is a no-op + V.PendingRemoved,D.PendingAdded --> V.PendingRemoved,D.Active : completeDelReg + V.Completed,D.PendingRemoved --> V.Completed : completeEndDel + V.Completed,D.Active --> V.Completed : initEndDel + V.Completed,D.PendingAdded --> V.Completed : completeDelReg +``` From 080824e97a0befb72913dfb353f434d64a0d7d0b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 26 Sep 2024 16:55:18 -0500 Subject: [PATCH 430/545] minor rewordings for clarify --- contracts/validator-manager/MessageSpec.md | 10 +++++----- contracts/validator-manager/README.md | 18 +++++++++++------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/contracts/validator-manager/MessageSpec.md b/contracts/validator-manager/MessageSpec.md index 4eae196ec..62a063b92 100644 --- a/contracts/validator-manager/MessageSpec.md +++ b/contracts/validator-manager/MessageSpec.md @@ -2,7 +2,7 @@ ### `RegisterSubnetValidatorMessage` -Description: Issued by the Validator Manager contract in order to register a Subnet validator +Description: Register a Subnet Validator on the P-Chain Signed by: Subnet Consumed by: P-Chain @@ -32,7 +32,7 @@ Specification: ### `SubnetValidatorRegistrationMessage` -Description: Issued by the P-Chain in order to confirm Subnet validator registration +Description: Confirms a Subnet Validator's registration validity on the P-Chain Signed by: P-Chain Consumed by: Validator Manager contract @@ -55,7 +55,7 @@ Specification: ### `ValidationUptimeMessage` -Description: Issued by the Subnet in order to provide validator uptime to the Subnet to calculate staking rewards +Description: Provides a Validator's uptime for calculating staking rewards Signed by: Subnet Consumed by: Validator Manager contract @@ -78,7 +78,7 @@ Specification: ### `SetSubnetValidatorWeightMessage` -Description: Used to set a validator's stake weight on another chain +Description: Used to set a Validator's stake weight on another chain Signed by: Subnet Consumed by: P-Chain @@ -103,7 +103,7 @@ Specification: ### `SubnetValidatorWeightUpdateMessage` -Description: Acknowledges a validator weight update +Description: Acknowledges a Validator weight update Signed by: P-Chain Consumed by: Validator Manager contract diff --git a/contracts/validator-manager/README.md b/contracts/validator-manager/README.md index 2b9dea2cf..b371c0b7f 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -46,7 +46,7 @@ Three concrete `ValidatorManager` contracts are provided - `PoAValidatorManager` 1. Deploy the implementation contract 2. Deploy the proxy contract 3. Call the implementation contract's `initialize` function - - Each flavor of `ValidatorManager`` requires different settings. For example, `ValidatorManagerSettings` specifies the churn parameters, while `PoSValidatorManagerSettings` specifies the staking and rewards parameters. + - Each flavor of `ValidatorManager` requires different settings. For example, `ValidatorManagerSettings` specifies the churn parameters, while `PoSValidatorManagerSettings` specifies the staking and rewards parameters. 4. Initialize the Validator set by calling `initializeValidatorSet` - When a Subnet is first created on the P-Chain, it must be explicitly converted to a Subnet-only Validator compatible Subnet via [`ConvertSubnetTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setting-a-subnet-manager). The resulting `SubnetConversionMessage` Warp message is provided in the call to `initializeValidatorSet` to specify the starting Validator set in the `ValidatorManager`. Regardless of the implementation, these initial Validators are treated as PoA and are not eligible for staking rewards. @@ -54,9 +54,13 @@ Three concrete `ValidatorManager` contracts are provided - `PoAValidatorManager` Proof-of-Authority Validator management is provided via `PoAValidatorManager`, which restricts modification of the Validator set to an owner address. After deploying `PoAValidatorManager.sol` and a proxy, the `initialize` function takes the owner address, in addition to standard `ValidatorManagerSettings`. -### NativeTokenStakingManager +### PoSValidatorManagerr -`NativeTokenStakingManager` implements `PoSValidatorManager`, and 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. +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. + +#### 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. ``` { @@ -79,8 +83,8 @@ Proof-of-Authority Validator management is provided via `PoAValidatorManager`, w } ``` -### ERC20TokenStakingManager -`ERC20TokenStakingManager` also implements `PoSValidatorManager`, and allows permissionless addition and removal of Validators that post the an ERC20 token as stake. The ERC20 is specified in the call to `initialize`, and must implement [`IERC20Mintable`](./interfaces/IERC20Mintable.sol). Care should be taken to enforce that only authorized users are able to call `mint`. +#### ERC20TokenStakingManager +`ERC20TokenStakingManager` allows permissionless addition and removal of Validators that post the an ERC20 token as stake. The ERC20 is specified in the call to `initialize`, and must implement [`IERC20Mintable`](./interfaces/IERC20Mintable.sol). Care should be taken to enforce that only authorized users are able to call `mint`. ### Convert PoA to PoS @@ -88,9 +92,9 @@ A `PoAValidatorManager` can later be converted to a `PoSValidatorManager` by upg ## Usage ### Register a Validator -Validator registration is initiated with a call to `initializeValidatorRegistration`. Churn limitations are checked - only a certain percentage of the total weight is allowed to be added or removed in a given period of time. The `ValidatorManager` then constructs a [`RegisterSubnetValidatorMessage`](./MessageSpec.md#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each Validator registration request includes all of the information needed to identify the Validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. If the Validator is not registered on the P-Chain before the `expiry`, then the Validator may be removed from the contract state by calling `completeEndValidation`. +Validator registration is initiated with a call to `initializeValidatorRegistration`. Churn limitations are checked - only a certain (configurable) percentage of the total weight is allowed to be added or removed in a (configurable) period of time. The `ValidatorManager` then constructs a [`RegisterSubnetValidatorMessage`](./MessageSpec.md#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each Validator registration request includes all of the information needed to identify the Validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. If the Validator is not registered on the P-Chain before the `expiry`, then the Validator may be removed from the contract state by calling `completeEndValidation`. -The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a [`RegisterSubnetValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#registersubnetvalidatortx). Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a [`SubnetValidatorRegistrationMessage`](./MessageSpec.md#subnetvalidatorregistrationmessage) Warp message indicating that the specified Validator was successfully registered on the P-Chain. +The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a [`RegisterSubnetValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#registersubnetvalidatortx). Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The P-Chain then signs a [`SubnetValidatorRegistrationMessage`](./MessageSpec.md#subnetvalidatorregistrationmessage) Warp message indicating that the specified Validator was successfully registered on the P-Chain. The `SubnetValidatorRegistrationMessage` is delivered to the `ValidatorManager` via a call to `completeValidatorRegistration`. For PoS Validator Managers, staking rewards begin accruing at this time. From 0de33815ca7f4f2810bf0c3702ad424e7d3ddb76 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 26 Sep 2024 15:35:21 -0700 Subject: [PATCH 431/545] Add tests --- .../tests/PoSValidatorManagerTests.t.sol | 347 +++++++++++++++++- 1 file changed, 341 insertions(+), 6 deletions(-) diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 2f67158d9..0c7585810 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -394,14 +394,12 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _registerDefaultDelegator(validationID); - uint64 delgationEndTime = - DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, - endDelegationTimestamp: delgationEndTime, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, expectedNonce: 2 }); @@ -410,8 +408,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), validatorStartTime: DEFAULT_REGISTRATION_TIMESTAMP, stakingStartTime: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, - stakingEndTime: delgationEndTime, - uptimeSeconds: delgationEndTime - DEFAULT_REGISTRATION_TIMESTAMP, + stakingEndTime: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + uptimeSeconds: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP - DEFAULT_REGISTRATION_TIMESTAMP, initialSupply: 0, endSupply: 0 }); @@ -429,6 +427,254 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); } + // Delegator registration is not allowed when Validator is pending removed. + function testInitializeDelegatorRegistrationValidatorPendingRemoved() public { + bytes32 validationID = _registerDefaultValidator(); + + _initializeEndValidation({ + validationID: validationID, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION, + expectedNonce: 1, + includeUptime: true, + force: false + }); + + _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); + + vm.expectRevert(ValidatorManager.InvalidValidatorStatus.selector); + _initializeDelegatorRegistration( + validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT + ); + } + + // Complete delegator registration may be called when validator is pending removed. + function testCompleteRegisterDelegatorValidatorPendingRemoved() public { + bytes32 validationID = _registerDefaultValidator(); + + bytes32 delegationID = _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); + + uint64 validatorEndTime = DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION; + _initializeEndValidation({ + validationID: validationID, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: validatorEndTime, + expectedNonce: 2, + includeUptime: true, + force: false + }); + + _setUpCompleteDelegatorRegistrationWithChecks( + validationID, + delegationID, + validatorEndTime + 1, + DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + 1 + ); + } + + // Delegator cannot initialize end delegation when validator is pending removed. + function testInitializeEndDelegationValidatorPendingRemoved() public { + bytes32 validationID = _registerDefaultValidator(); + + _initializeEndValidation({ + validationID: validationID, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_REGISTRATION_TIMESTAMP + DEFAULT_MINIMUM_STAKE_DURATION, + expectedNonce: 1, + includeUptime: true, + force: false + }); + + _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); + + vm.expectRevert(ValidatorManager.InvalidValidatorStatus.selector); + _initializeDelegatorRegistration( + validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT + ); + } + + // Delegator may complete end delegation while validator is pending removed. + function testCompleteEndDelegationValidatorPendingRemoved() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _initializeEndDelegationValidatorActiveWithChecks({ + validationID: validationID, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); + + uint64 validationEndTime = DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1; + _initializeEndValidation({ + validationID: validationID, + registrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: validationEndTime, + expectedNonce: 3, + includeUptime: true, + force: false + }); + + uint256 expectedTotalReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + 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 + }); + + _completeEndDelegationWithChecks({ + validationID: validationID, + delegationID: delegationID, + delegator: DEFAULT_DELEGATOR_ADDRESS, + delegatorWeight: DEFAULT_DELEGATOR_WEIGHT, + expectedTotalReward: expectedTotalReward, + delegationFeeBips: DEFAULT_DELEGATION_FEE_BIPS, + validatorWeight: DEFAULT_WEIGHT, + expectedValidatorWeight: 0, + expectedNonce: 2 + }); + } + + function testInitializeDelegatorRegistrationValidatorCompleted() public { + bytes32 validationID = _registerDefaultValidator(); + _endDefaultValidator(validationID, 1); + + _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); + + vm.warp(DEFAULT_COMPLETION_TIMESTAMP + 1); + vm.expectRevert(ValidatorManager.InvalidValidatorStatus.selector); + _initializeDelegatorRegistration( + validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT + ); + } + + function testCompleteDelegatorRegistrationValidatorCompleted() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _initializeDefaultDelegatorRegistration(validationID); + + _endDefaultValidator(validationID, 2); + + // completeDelegatorRegistration should fall through to _completeEndDelegation and refund the stake + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit DelegationEnded(delegationID, validationID, 0, 0); + + uint256 balanceBefore = _getStakeAssetBalance(DEFAULT_DELEGATOR_ADDRESS); + + _expectStakeUnlock(DEFAULT_DELEGATOR_ADDRESS, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); + + // warp to right after validator ended + vm.warp(DEFAULT_COMPLETION_TIMESTAMP + 1); + posValidatorManager.completeDelegatorRegistration(0, delegationID); + + assertEq( + _getStakeAssetBalance(DEFAULT_DELEGATOR_ADDRESS), + balanceBefore + _weightToValue(DEFAULT_DELEGATOR_WEIGHT) + ); + } + + function testInitializeEndDelegationValidatorCompleted() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _endDefaultValidator(validationID, 2); + + uint64 delegationEndTime = DEFAULT_COMPLETION_TIMESTAMP + 1; + + uint256 expectedTotalReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + 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 + }); + + uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; + + // completeDelegatorRegistration should fall through to _completeEndDelegation and refund the stake + vm.expectEmit(true, true, true, true, address(validatorManager)); + emit DelegationEnded( + delegationID, validationID, expectedDelegatorReward, expectedValidatorFees + ); + + uint256 balanceBefore = _getStakeAssetBalance(DEFAULT_DELEGATOR_ADDRESS); + + _expectStakeUnlock(DEFAULT_DELEGATOR_ADDRESS, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); + _expectRewardIssuance(DEFAULT_DELEGATOR_ADDRESS, expectedDelegatorReward); + + // warp to right after validator ended + vm.warp(delegationEndTime); + vm.prank(DEFAULT_DELEGATOR_ADDRESS); + posValidatorManager.initializeEndDelegation(delegationID, false, 0); + + assertEq( + _getStakeAssetBalance(DEFAULT_DELEGATOR_ADDRESS), + balanceBefore + _weightToValue(DEFAULT_DELEGATOR_WEIGHT) + expectedDelegatorReward + ); + } + + function testCompleteEndDelegationValidatorCompleted() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _initializeEndDelegationValidatorActiveWithChecks({ + validationID: validationID, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2 + }); + + _endDefaultValidator(validationID, 3); + + uint256 expectedTotalReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(DEFAULT_DELEGATOR_WEIGHT), + 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 + }); + + uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000; + uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees; + + vm.expectEmit(true, true, true, true, address(posValidatorManager)); + emit DelegationEnded( + delegationID, validationID, expectedDelegatorReward, expectedValidatorFees + ); + uint256 balanceBefore = _getStakeAssetBalance(DEFAULT_DELEGATOR_ADDRESS); + + _expectStakeUnlock(DEFAULT_DELEGATOR_ADDRESS, _weightToValue(DEFAULT_DELEGATOR_WEIGHT)); + _expectRewardIssuance(DEFAULT_DELEGATOR_ADDRESS, expectedDelegatorReward); + + posValidatorManager.completeEndDelegation(0, delegationID); + + assertEq( + _getStakeAssetBalance(DEFAULT_DELEGATOR_ADDRESS), + balanceBefore + _weightToValue(DEFAULT_DELEGATOR_WEIGHT) + expectedDelegatorReward + ); + } + function testCompleteEndDelegationWrongNonce() public { bytes32 validationID = _registerDefaultValidator(); // Register two delegations @@ -801,13 +1047,29 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetPChainWarpMessage(setValidatorWeightPayload, true); vm.warp(completeRegistrationTimestamp); + posValidatorManager.completeDelegatorRegistration(0, delegationID); + } + + function _setUpCompleteDelegatorRegistrationWithChecks( + bytes32 validationID, + bytes32 delegationID, + uint64 completeRegistrationTimestamp, + uint64 expectedValidatorWeight, + uint64 expectedNonce + ) internal { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit DelegatorRegistered({ delegationID: delegationID, validationID: validationID, startTime: completeRegistrationTimestamp }); - posValidatorManager.completeDelegatorRegistration(0, delegationID); + _setUpCompleteDelegatorRegistration( + validationID, + delegationID, + completeRegistrationTimestamp, + expectedValidatorWeight, + expectedNonce + ); } function _registerDefaultDelegator(bytes32 validationID) @@ -825,6 +1087,33 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); } + function _initializeDefaultDelegatorRegistration(bytes32 validationID) + internal + returns (bytes32) + { + return _setUpInitializeDelegatorRegistration({ + validationID: validationID, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + weight: DEFAULT_DELEGATOR_WEIGHT, + registrationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); + } + + function _completeDefaultDelegatorRegistration( + bytes32 validationID, + bytes32 delegationID + ) internal { + _setUpCompleteDelegatorRegistration({ + validationID: validationID, + delegationID: delegationID, + completeRegistrationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, + expectedNonce: 1 + }); + } + function _registerDelegator( bytes32 validationID, address delegatorAddress, @@ -914,6 +1203,52 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { posValidatorManager.initializeEndDelegation(delegationID, true, 0); } + function _endDefaultValidator(bytes32 validationID, uint64 expectedNonce) internal { + _endValidationWithChecks({ + validationID: validationID, + validatorOwner: address(this), + completeRegistrationTimestamp: DEFAULT_REGISTRATION_TIMESTAMP, + completionTimestamp: DEFAULT_COMPLETION_TIMESTAMP, + validatorWeight: DEFAULT_WEIGHT, + expectedNonce: expectedNonce + }); + } + + function _endValidationWithChecks( + bytes32 validationID, + address validatorOwner, + uint64 completeRegistrationTimestamp, + uint64 completionTimestamp, + uint64 validatorWeight, + uint64 expectedNonce + ) internal { + _initializeEndValidation({ + validationID: validationID, + registrationTimestamp: completeRegistrationTimestamp, + completionTimestamp: completionTimestamp, + expectedNonce: expectedNonce, + includeUptime: true, + force: false + }); + + uint256 expectedReward = rewardCalculator.calculateReward({ + stakeAmount: _weightToValue(validatorWeight), + validatorStartTime: completeRegistrationTimestamp, + stakingStartTime: completeRegistrationTimestamp, + stakingEndTime: completionTimestamp, + uptimeSeconds: completionTimestamp - completeRegistrationTimestamp, + initialSupply: 0, + endSupply: 0 + }); + + _completeEndValidationWithChecks({ + validationID: validationID, + validatorOwner: validatorOwner, + expectedReward: expectedReward, + validatorWeight: validatorWeight + }); + } + function _completeEndValidationWithChecks( bytes32 validationID, address validatorOwner, From 454157e9b84cf681c9e2cd209138e30a0fcfc15d Mon Sep 17 00:00:00 2001 From: cam-schultz <78878559+cam-schultz@users.noreply.github.com> Date: Fri, 27 Sep 2024 09:06:28 -0500 Subject: [PATCH 432/545] Update contracts/validator-manager/README.md Co-authored-by: Ian Suvak 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 b371c0b7f..18e5d5e4e 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -54,7 +54,7 @@ Three concrete `ValidatorManager` contracts are provided - `PoAValidatorManager` Proof-of-Authority Validator management is provided via `PoAValidatorManager`, which restricts modification of the Validator set to an owner address. After deploying `PoAValidatorManager.sol` and a proxy, the `initialize` function takes the owner address, in addition to standard `ValidatorManagerSettings`. -### PoSValidatorManagerr +### PoSValidatorManager 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. From f11918043ae69ef18ee4947815a710bd20e99511 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Fri, 27 Sep 2024 11:52:50 -0400 Subject: [PATCH 433/545] revert to using abi.encodePacked for packSubnetConversionData --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager.go | 2 +- .../validator-manager/ValidatorMessages.sol | 54 +++++-------------- 4 files changed, 16 insertions(+), 44 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 6f9461ea6..689ce463f 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161568e38038061568e83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6155418061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd366004614a7e565b61043a565b005b6101d26101e2366004614ab9565b6107e1565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b610219610214366004614ab9565b610953565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b366004614ad0565b610969565b6101d261026e366004614ae9565b610a0a565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e366004614b11565b610de2565b6102b66102b1366004614b75565b611266565b6040519081526020016101fd565b6102196102d2366004614ab9565b61127f565b6102b65f81565b6101d26102ec366004614a7e565b611293565b6101ef603081565b6101d2610307366004614ab9565b61145e565b6101d261031a366004614ae9565b611519565b6101d261032d366004614ab9565b6116b9565b6102b6610340366004614b8e565b611930565b6101d2610353366004614ad0565b61195c565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c366004614ab9565b611ace565b6101d261039f366004614ab9565b611caa565b6101ef601481565b6103bf6103ba366004614ab9565b611dd4565b6040516101fd9190614bc2565b6102196202a30081565b6102b66103e4366004614ab9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b6610422366004614c82565b611e9c565b6101d2610435366004614cfb565b611ed1565b5f8381525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff16600381111561048757610487614bae565b600381111561049857610498614bae565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61050e82611dd4565b905060028351600381111561052557610525614bae565b146105435760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105705760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f8060028351600581111561058e5761058e614bae565b036105df5787156105a6576105a38488611fb0565b91505b5f856060015184608001516105bb9190614d4d565b90506105c78582612134565b506001600160401b031660c087015250429050610611565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b59061063690611266565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106669796959493929190614d6d565b602060405180830381865afa158015610681573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a59190614dab565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff191660018360038111156106e4576106e4614bae565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906107ce9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206155158339815191526020526040808220815160e0810190925280545f805160206154d583398151915293929190829060ff16600581111561082e5761082e614bae565b600581111561083f5761083f614bae565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108ae576108ae614bae565b146108cc5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6108f18584606001515f61228b565b6040518263ffffffff1660e01b815260040161090d9190614de4565b6020604051808303815f875af1158015610929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094d9190614dab565b50505050565b5f61096364e8d4a5100083614e16565b92915050565b5f805160206154b58339815191525f80610982846122e2565b9150915061098f82612580565b6109995750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156109c8576109c8614bae565b036109ed575f838152600785016020526040812080549190556109eb82826125bb565b505b610a03816109fe8460400151611266565b612631565b5050505050565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff166003811115610a5757610a57614bae565b6003811115610a6857610a68614bae565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610adf90611dd4565b905060015f85815260058501602052604090205460ff166003811115610b0757610b07614bae565b14610b255760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610b3a57610b3a614bae565b03610c8357600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610b9457610b94614bae565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610c9857610c98614bae565b03610ca657610a0384612654565b5f610cb086612831565b90505f80610cc18360400151612931565b509150915081856040015114610cea57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610d3257505f8781526005870160205260409020600201546001600160401b03808316600160801b90920416115b15610d5057604051633ab3447f60e11b815260040160405180910390fd5b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206154d58339815191529060ff1615610e3457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9b9190614dab565b836020013514610ebe5760405163d040949d60e01b815260040160405180910390fd5b30610ecf6060850160408601614e35565b6001600160a01b031614610ef65760405163e6c4247b60e01b815260040160405180910390fd5b5f610f046060850185614e50565b905090505f805b828163ffffffff1610156111b0575f610f276060880188614e50565b8363ffffffff16818110610f3d57610f3d614e95565b9050602002810190610f4f9190614ea9565b610f5890614f59565b80515f8181526008880160205260409020549192509015610f8c57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610fbb92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610fd591614ff0565b602060405180830381855afa158015610ff0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110139190614dab565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561109f5761109f614bae565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611152911686615001565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806111a990615014565b9050610f0b565b50600483018190555f6111c285612831565b90505f6111d28260400151612b6f565b90505f6111de88612ce4565b9050816002826040516111f19190614ff0565b602060405180830381855afa15801561120c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061122f9190614dab565b1461124d57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6109636001600160401b03831664e8d4a51000615036565b5f61128982611dd4565b6080015192915050565b5f805160206154b58339815191525f6112ab8561317d565b90506112b685612580565b6112c1575050505050565b5f8581526004830160205260409020546001600160a01b031633146112f95760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161132891600160b01b90046001600160401b03169061504d565b6001600160401b03168160c001516001600160401b0316101561135e576040516302336bad60e51b815260040160405180910390fd5b8315610a03575f61136f8685611fb0565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906113bf90611266565b60a085015160c08601516040516001600160e01b031960e086901b1681526113f3939291829188905f908190600401614d6d565b602060405180830381865afa15801561140e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114329190614dab565b5f87815260078501602052604081208054909190611451908490615001565b9091555050505050505050565b5f805160206154b58339815191525f61147683611dd4565b905060048151600581111561148d5761148d614bae565b146114ab5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114e35760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461094d906001600160a01b0316826125bb565b6115216133ba565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff16600381111561156e5761156e614bae565b600381111561157f5761157f614bae565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f6115ed85612831565b90505f806115fe8360400151612931565b50915091508184604001511461162757604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561165e57604051633ab3447f60e11b815260040160405180910390fd5b60038451600381111561167357611673614bae565b146116915760405163f95c7fe160e01b815260040160405180910390fd5b61169a86612654565b50505050506116b560015f805160206154f583398151915255565b5050565b6116c16133ba565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff16600381111561170e5761170e614bae565b600381111561171f5761171f614bae565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61179582611dd4565b90505f835160038111156117ab576117ab614bae565b036117c957604051631d0b665760e21b815260040160405180910390fd5b6004815160058111156117de576117de614bae565b146117fc5760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561181157611811614bae565b036118285761181f85612654565b50505050611917565b60028351600381111561183d5761183d614bae565b0361190957600384015460608401516001600160a01b039091169063778c06b59061186790611266565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b1681526118b996959493926001600160401b0390921691908190600401614d6d565b602060405180830381865afa1580156118d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f89190614dab565b5f8681526006860160205260409020555b61191285612654565b505050505b61192d60015f805160206154f583398151915255565b50565b5f6119396133ba565b611944833384613404565b905061096360015f805160206154f583398151915255565b5f805160206154d58339815191525f61197483612831565b90505f8061198583604001516136cb565b91509150806119a757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546119c19061506d565b90505f036119e257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115611a0857611a08614bae565b14611a265760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120611a3e916149ce565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff166003811115611b1b57611b1b614bae565b6003811115611b2c57611b2c614bae565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611ba557611ba5614bae565b14158015611bc65750600381516003811115611bc357611bc3614bae565b14155b15611be45760405163f95c7fe160e01b815260040160405180910390fd5b5f611bf28260400151611dd4565b905080606001516001600160401b03165f03611c2157604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611c4e84604001518460600151856080015161228b565b6040518263ffffffff1660e01b8152600401611c6a9190614de4565b6020604051808303815f875af1158015611c86573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a039190614dab565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206154d58339815191529190611cf19061506d565b90505f03611d1257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611d3857611d38614bae565b14611d565760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d8f91906004016150a5565b6020604051808303815f875af1158015611dab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dcf9190614dab565b505050565b611ddc614a05565b5f8281525f80516020615515833981519152602052604090819020815160e0810190925280545f805160206154d5833981519152929190829060ff166005811115611e2957611e29614bae565b6005811115611e3a57611e3a614bae565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611ea56133ba565b611eb18585858561386f565b9050611ec960015f805160206154f583398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611f1a575080546001600160401b03808416911610155b15611f385760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611f638484613a0d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ffb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612022919081019061513a565b915091508061204457604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612087573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ab9190614dab565b8251146120cb5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156120f75760405163e6c4247b60e01b815260040160405180910390fd5b5f806121068460400151613a27565b9150915081871461212a57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615515833981519152602052604081206002015481905f805160206154d583398151915290600160801b90046001600160401b031661217c8582613c02565b5f61218687613dcb565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6121d68a858b61228b565b6040518263ffffffff1660e01b81526004016121f29190614de4565b6020604051808303815f875af115801561220e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122329190614dab565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6122eb614a05565b5f805160206154d58339815191525f61230385612831565b90505f8061231483604001516136cb565b91509150801561233757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff16600581111561236857612368614bae565b600581111561237957612379614bae565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156123e8576123e8614bae565b14158015612409575060018151600581111561240657612406614bae565b14155b156124275760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561243c5761243c614bae565b0361244a576004815261244f565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561249457612494614bae565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561254857612548614bae565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f8051602061549583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612616575f80fd5b505af1158015612628573d5f803e3d5ffd5b50505050505050565b5f80516020615495833981519152546116b5906001600160a01b03168383613e40565b5f8181525f805160206154758339815191526020526040808220815160e0810190925280545f805160206154b583398151915293929190829060ff1660038111156126a1576126a1614bae565b60038111156126b2576126b2614bae565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687018252828120805490829055848252600488019092529182205493945091926127109061278790600160a01b900461ffff1684615036565b6127919190614e16565b905080856007015f8581526020019081526020015f205f8282546127b59190615001565b909155505f90506127c6828461520c565b90506127d68560200151826125bb565b6127eb85602001516109fe8760600151611266565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612895573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128bc919081019061513a565b91509150806128de57604051636b2f19e960e01b815260040160405180910390fd5b8151156128fe5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561292a5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461295657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129a55761296d81600161520c565b612978906008615036565b61ffff1686828151811061298e5761298e614e95565b016020015160f81c901b9190911790600101612959565b5061ffff8116156129c95760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612a24576129e081600361520c565b6129eb906008615036565b63ffffffff16876129fd836002615001565b81518110612a0d57612a0d614e95565b016020015160f81c901b91909117906001016129cc565b5063ffffffff8116600414612a4c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612aa157612a6381601f61520c565b612a6e906008615036565b88612a7a836006615001565b81518110612a8a57612a8a614e95565b016020015160f81c901b9190911790600101612a4f565b505f805b6008811015612b0057612ab981600761520c565b612ac4906008615036565b6001600160401b031689612ad9836026615001565b81518110612ae957612ae9614e95565b016020015160f81c901b9190911790600101612aa5565b505f805b6008811015612b5f57612b1881600761520c565b612b23906008615036565b6001600160401b03168a612b3883602e615001565b81518110612b4857612b48614e95565b016020015160f81c901b9190911790600101612b04565b5091989097509095509350505050565b5f8151602614612b9257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612be157612ba981600161520c565b612bb4906008615036565b61ffff16848281518110612bca57612bca614e95565b016020015160f81c901b9190911790600101612b95565b5061ffff811615612c055760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612c6057612c1c81600361520c565b612c27906008615036565b63ffffffff1685612c39836002615001565b81518110612c4957612c49614e95565b016020015160f81c901b9190911790600101612c08565b5063ffffffff811615612c8657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612cdb57612c9d81601f61520c565b612ca8906008615036565b86612cb4836006615001565b81518110612cc457612cc4614e95565b016020015160f81c901b9190911790600101612c89565b50949350505050565b60605f612cf383830184614e50565b612cff91506058615036565b612d0a90605c615001565b6001600160401b03811115612d2157612d21614ec7565b6040519080825280601f01601f191660200182016040528015612d4b576020820181803683370190505b5090505f5b6020811015612da05783358160208110612d6c57612d6c614e95565b1a60f81b828281518110612d8257612d82614e95565b60200101906001600160f81b03191690815f1a905350600101612d50565b505f5b6020811015612e005783602001358160208110612dc257612dc2614e95565b1a60f81b82612dd2836020615001565b81518110612de257612de2614e95565b60200101906001600160f81b03191690815f1a905350600101612da3565b505f5b6004811015612e6357612e1781600361520c565b612e22906008615036565b6014901c60f81b82612e35836040615001565b81518110612e4557612e45614e95565b60200101906001600160f81b03191690815f1a905350600101612e03565b505f612e756060850160408601614e35565b60601b90505f5b6014811015612ed557818160148110612e9757612e97614e95565b1a60f81b83612ea7836044615001565b81518110612eb757612eb7614e95565b60200101906001600160f81b03191690815f1a905350600101612e7c565b505f612ee46060860186614e50565b905090505f5b6004811015612f4f57612efe81600361520c565b612f09906008615036565b63ffffffff8316901c60f81b84612f21836058615001565b81518110612f3157612f31614e95565b60200101906001600160f81b03191690815f1a905350600101612eea565b505f5b612f5f6060870187614e50565b9050811015613173575f612f74826058615036565b612f7f90605c615001565b90505f5b602081101561300a57612f996060890189614e50565b84818110612fa957612fa9614e95565b9050602002810190612fbb9190614ea9565b358160208110612fcd57612fcd614e95565b1a60f81b86612fdc8385615001565b81518110612fec57612fec614e95565b60200101906001600160f81b03191690815f1a905350600101612f83565b505f5b60088110156130bf5761302181600761520c565b61302c906008615036565b61303960608a018a614e50565b8581811061304957613049614e95565b905060200281019061305b9190614ea9565b61306c906040810190602001614b75565b6001600160401b0316901c60f81b8682613087856020615001565b6130919190615001565b815181106130a1576130a1614e95565b60200101906001600160f81b03191690815f1a90535060010161300d565b505f5b6030811015613169576130d86060890189614e50565b848181106130e8576130e8614e95565b90506020028101906130fa9190614ea9565b61310890604081019061521f565b8281811061311857613118614e95565b9050013560f81c60f81b86828460286131319190615001565b61313b9190615001565b8151811061314b5761314b614e95565b60200101906001600160f81b03191690815f1a9053506001016130c2565b5050600101612f52565b5091949350505050565b613185614a05565b5f8281525f805160206155158339815191526020526040808220815160e0810190925280545f805160206154d583398151915293929190829060ff1660058111156131d2576131d2614bae565b60058111156131e3576131e3614bae565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561325557613255614bae565b146132735760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156132b7576132b7614bae565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133638582612134565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f805160206154f58339815191528054600119016133eb57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206154f583398151915255565b5f5f805160206154b58339815191528161342061021485613e9f565b90505f61342c87611dd4565b905061343787612580565b61345457604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561346957613469614bae565b146134875760405163a36c527f60e01b815260040160405180910390fd5b5f828260800151613498919061504d565b905083600201600a9054906101000a90046001600160401b031682604001516134c19190615261565b6001600160401b0316816001600160401b031611156134f357604051630c192e7760e41b815260040160405180910390fd5b5f806134ff8a84612134565b915091505f8a8360405160200161352d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156135c0576135c0614bae565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146136ef57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561373e5761370681600161520c565b613711906008615036565b61ffff1685828151811061372757613727614e95565b016020015160f81c901b91909117906001016136f2565b5061ffff8116156137625760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137bd5761377981600361520c565b613784906008615036565b63ffffffff1686613796836002615001565b815181106137a6576137a6614e95565b016020015160f81c901b9190911790600101613765565b5063ffffffff81166003146137e557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561383a576137fc81601f61520c565b613807906008615036565b87613813836006615001565b8151811061382357613823614e95565b016020015160f81c901b91909117906001016137e8565b505f8660268151811061384f5761384f614e95565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206154b583398151915290600160401b900461ffff90811690861610806138c3575061271061ffff8616115b156138e15760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613913576040516302336bad60e51b815260040160405180910390fd5b80548310806139255750806001015483115b1561394357604051630103be3b60e21b815260040160405180910390fd5b5f61394d84613e9f565b90505f61395982610953565b90505f6139668983613ec2565b9050604051806060016040528061397a3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613a156142ac565b613a1e826142f7565b6116b581614365565b5f808251602e14613a4b57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613a9a57613a6281600161520c565b613a6d906008615036565b61ffff16858281518110613a8357613a83614e95565b016020015160f81c901b9190911790600101613a4e565b5061ffff811615613abe5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613b1957613ad581600361520c565b613ae0906008615036565b63ffffffff1686613af2836002615001565b81518110613b0257613b02614e95565b016020015160f81c901b9190911790600101613ac1565b5063ffffffff8116600514613b4157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b9657613b5881601f61520c565b613b63906008615036565b87613b6f836006615001565b81518110613b7f57613b7f614e95565b016020015160f81c901b9190911790600101613b44565b505f805b6008811015613bf557613bae81600761520c565b613bb9906008615036565b6001600160401b031688613bce836026615001565b81518110613bde57613bde614e95565b016020015160f81c901b9190911790600101613b9a565b5090969095509350505050565b5f805160206154d58339815191525f6001600160401b038084169085161115613c3657613c2f8385614d4d565b9050613c43565b613c408484614d4d565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613ca5575060018401548151613ca1916001600160401b031690615001565b8210155b15613ccb576001600160401b038316606082015281815260408101516020820152613cea565b8281606001818151613cdd919061504d565b6001600160401b03169052505b6060810151613cfa906064615261565b602082015160018601546001600160401b039290921691613d259190600160401b900460ff16615036565b1015613d445760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613d5f9190615001565b9052506040810180516001600160401b0387169190613d7f90839061520c565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206155158339815191526020526040812060020180545f805160206154d58339815191529190600890613e1590600160401b90046001600160401b031661528c565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b03838116602483015260448201839052611dcf91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506143c2565b5f610963825f80516020615495833981519152546001600160a01b031690614428565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613f0657604051637fab81e560e01b815260040160405180910390fd5b5f805160206154d583398151915242613f256040860160208701614b75565b6001600160401b0316111580613f5f5750613f436202a30042615001565b613f536040860160208701614b75565b6001600160401b031610155b15613f7c5760405162d36c8560e81b815260040160405180910390fd5b6030613f8b604086018661521f565b9050141580613f9957508335155b15613fb75760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613fe757604051630eb0d31360e11b815260040160405180910390fd5b613ff1835f613c02565b5f8061408a6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906140359190614b75565b6001600160401b0316815260200161405060408a018a61521f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061458a565b5f828152600686016020526040902091935091506140a882826152eb565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906140e6908590600401614de4565b6020604051808303815f875af1158015614102573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141269190614dab565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561419e5761419e614bae565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161427e918e01908e01614b75565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166142f557604051631afcd79f60e31b815260040160405180910390fd5b565b6142ff6142ac565b6143088161464d565b614310614666565b61192d6060820135608083013561432d60c0850160a08601614b75565b61433d60e0860160c087016153aa565b61434e610100870160e088016153c3565b61436061012088016101008901614e35565b614676565b61436d6142ac565b5f805160206154958339815191526001600160a01b0382166143a25760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6143d66001600160a01b03841683614797565b905080515f141580156143fa5750808060200190518101906143f891906153e3565b155b15611dcf57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561446e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144929190614dab565b90506144a96001600160a01b0385163330866147a4565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156144ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145119190614dab565b90508181116145775760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161441f565b614581828261520c565b95945050505050565b5f60608260800151516030146145b357604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016145e597969594939291906153fe565b60405160208183030381529060405290506002816040516146069190614ff0565b602060405180830381855afa158015614621573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906146449190614dab565b94909350915050565b6146556142ac565b61465d6147dd565b61192d816147e5565b61466e6142ac565b6142f56148b7565b61467e6142ac565b5f805160206154b583398151915261ffff841615806146a2575061271061ffff8516115b156146c05760405163c98d73a760e01b815260040160405180910390fd5b858711156146e157604051630103be3b60e21b815260040160405180910390fd5b60ff831615806146f45750600a60ff8416115b15614712576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b60606122db83835f6148bf565b6040516001600160a01b03848116602483015283811660448301526064820183905261094d9186918216906323b872dd90608401613e6d565b6142f56142ac565b6147ed6142ac565b80355f805160206154d5833981519152908155601461481260608401604085016153c3565b60ff161180614831575061482c60608301604084016153c3565b60ff16155b1561484f5760405163b4fa3fb360e01b815260040160405180910390fd5b61485f60608301604084016153c3565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556148906040830160208401614b75565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6133f16142ac565b6060814710156148e45760405163cd78605960e01b815230600482015260240161441f565b5f80856001600160a01b031684866040516148ff9190614ff0565b5f6040518083038185875af1925050503d805f8114614939576040519150601f19603f3d011682016040523d82523d5f602084013e61493e565b606091505b509150915061212a86838360608261495e57614959826149a5565b6122db565b815115801561497557506001600160a01b0384163b155b1561499e57604051639996b31560e01b81526001600160a01b038516600482015260240161441f565b50806122db565b8051156149b55780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546149da9061506d565b5f825580601f106149e9575050565b601f0160209004905f5260205f209081019061192d9190614a41565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614a55575f8155600101614a42565b5090565b801515811461192d575f80fd5b803563ffffffff81168114614a79575f80fd5b919050565b5f805f60608486031215614a90575f80fd5b833592506020840135614aa281614a59565b9150614ab060408501614a66565b90509250925092565b5f60208284031215614ac9575f80fd5b5035919050565b5f60208284031215614ae0575f80fd5b6122db82614a66565b5f8060408385031215614afa575f80fd5b614b0383614a66565b946020939093013593505050565b5f8060408385031215614b22575f80fd5b82356001600160401b03811115614b37575f80fd5b830160808186031215614b48575f80fd5b9150614b5660208401614a66565b90509250929050565b80356001600160401b0381168114614a79575f80fd5b5f60208284031215614b85575f80fd5b6122db82614b5f565b5f8060408385031215614b9f575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614be557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614c2060608401826001600160401b03169052565b506080830151614c3b60808401826001600160401b03169052565b5060a0830151614c5660a08401826001600160401b03169052565b5060c083015161292a60c08401826001600160401b03169052565b803561ffff81168114614a79575f80fd5b5f805f8060808587031215614c95575f80fd5b84356001600160401b03811115614caa575f80fd5b850160608188031215614cbb575f80fd5b9350614cc960208601614c71565b9250614cd760408601614b5f565b9396929550929360600135925050565b6001600160a01b038116811461192d575f80fd5b5f80828403610140811215614d0e575f80fd5b61012080821215614d1d575f80fd5b8493508301359050614d2e81614ce7565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561292a5761292a614d39565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614dbb575f80fd5b5051919050565b5f5b83811015614ddc578181015183820152602001614dc4565b50505f910152565b602081525f8251806020840152614e02816040850160208701614dc2565b601f01601f19169190910160400192915050565b5f82614e3057634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614e45575f80fd5b81356122db81614ce7565b5f808335601e19843603018112614e65575f80fd5b8301803591506001600160401b03821115614e7e575f80fd5b6020019150600581901b3603821315612284575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614ebd575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614efd57614efd614ec7565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614f2b57614f2b614ec7565b604052919050565b5f6001600160401b03821115614f4b57614f4b614ec7565b50601f01601f191660200190565b5f60608236031215614f69575f80fd5b614f71614edb565b823581526020614f82818501614b5f565b8183015260408401356001600160401b03811115614f9e575f80fd5b840136601f820112614fae575f80fd5b8035614fc1614fbc82614f33565b614f03565b8181523684838501011115614fd4575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614ebd818460208701614dc2565b8082018082111561096357610963614d39565b5f63ffffffff80831681810361502c5761502c614d39565b6001019392505050565b808202811582820484141761096357610963614d39565b6001600160401b0381811683821601908082111561292a5761292a614d39565b600181811c9082168061508157607f821691505b60208210810361509f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546150b78161506d565b806020870152604060018084165f81146150d857600181146150f457615121565b60ff19851660408a0152604084151560051b8a01019550615121565b895f5260205f205f5b858110156151185781548b82018601529083019088016150fd565b8a016040019650505b509398975050505050505050565b8051614a7981614a59565b5f806040838503121561514b575f80fd5b82516001600160401b0380821115615161575f80fd5b9084019060608287031215615174575f80fd5b61517c614edb565b8251815260208084015161518f81614ce7565b828201526040840151838111156151a4575f80fd5b80850194505087601f8501126151b8575f80fd5b835192506151c8614fbc84614f33565b83815288828587010111156151db575f80fd5b6151ea84838301848801614dc2565b806040840152508195506151ff81880161512f565b9450505050509250929050565b8181038181111561096357610963614d39565b5f808335601e19843603018112615234575f80fd5b8301803591506001600160401b0382111561524d575f80fd5b602001915036819003821315612284575f80fd5b6001600160401b0381811683821602808216919082811461528457615284614d39565b505092915050565b5f6001600160401b0380831681810361502c5761502c614d39565b601f821115611dcf57805f5260205f20601f840160051c810160208510156152cc5750805b601f840160051c820191505b81811015610a03575f81556001016152d8565b81516001600160401b0381111561530457615304614ec7565b61531881615312845461506d565b846152a7565b602080601f83116001811461534b575f84156153345750858301515b5f19600386901b1c1916600185901b1785556153a2565b5f85815260208120601f198616915b828110156153795788860151825594840194600190910190840161535a565b508582101561539657878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156153ba575f80fd5b6122db82614c71565b5f602082840312156153d3575f80fd5b813560ff811681146122db575f80fd5b5f602082840312156153f3575f80fd5b81516122db81614a59565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161545381604e860160208901614dc2565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516153c03803806153c083398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6152738061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101bb575f3560e01c806393e24598116100f3578063bee0a03f11610093578063df93d8de1161006e578063df93d8de146103cc578063e7d14c1c146103d6578063eb0acb8914610414578063f09969ae14610427575f80fd5b8063bee0a03f14610391578063c974d1b6146103a4578063d5f20ff6146103ac575f80fd5b80639e1bc4ef116100ce5780639e1bc4ef14610332578063a3a65e4814610345578063b771b3bc14610358578063ba3a4b971461037e575f80fd5b806393e24598146102f957806398f3e2b41461030c5780639dde029a1461031f575f80fd5b806360305d621161015e57806366435abf1161013957806366435abf146102c4578063732214f8146102d757806376f78621146102de5780638280a25a146102f1575f80fd5b806360305d621461027357806361e2f4901461029057806362065856146102a3575f80fd5b80632e2194d8116101995780632e2194d81461020657806335455ded14610231578063467ef06f1461024d5780635297fae614610260575f80fd5b80630118acc4146101bf5780630322ed98146101d4578063151d30d1146101e7575b5f80fd5b6101d26101cd36600461476b565b61043a565b005b6101d26101e23660046147a6565b6107e1565b6101ef600a81565b60405160ff90911681526020015b60405180910390f35b6102196102143660046147a6565b610953565b6040516001600160401b0390911681526020016101fd565b61023a61271081565b60405161ffff90911681526020016101fd565b6101d261025b3660046147bd565b610969565b6101d261026e3660046147d6565b610a0a565b61027b601481565b60405163ffffffff90911681526020016101fd565b6101d261029e3660046147fe565b610de2565b6102b66102b1366004614862565b611266565b6040519081526020016101fd565b6102196102d23660046147a6565b61127f565b6102b65f81565b6101d26102ec36600461476b565b611293565b6101ef603081565b6101d26103073660046147a6565b61145e565b6101d261031a3660046147d6565b611519565b6101d261032d3660046147a6565b6116b9565b6102b661034036600461487b565b611930565b6101d26103533660046147bd565b61195c565b6103666005600160991b0181565b6040516001600160a01b0390911681526020016101fd565b6101d261038c3660046147a6565b611ace565b6101d261039f3660046147a6565b611caa565b6101ef601481565b6103bf6103ba3660046147a6565b611dd4565b6040516101fd91906148af565b6102196202a30081565b6102b66103e43660046147a6565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102b661042236600461496f565b611e9c565b6101d26104353660046149e8565b611ed1565b5f8381525f805160206151a78339815191526020526040808220815160e0810190925280545f805160206151e783398151915293929190829060ff1660038111156104875761048761489b565b60038111156104985761049861489b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61050e82611dd4565b90506002835160038111156105255761052561489b565b146105435760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105705760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f8060028351600581111561058e5761058e61489b565b036105df5787156105a6576105a38488611fb0565b91505b5f856060015184608001516105bb9190614a3a565b90506105c78582612134565b506001600160401b031660c087015250429050610611565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b59061063690611266565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106669796959493929190614a5a565b602060405180830381865afa158015610681573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a59190614a98565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff191660018360038111156106e4576106e461489b565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906107ce9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206152478339815191526020526040808220815160e0810190925280545f8051602061520783398151915293929190829060ff16600581111561082e5761082e61489b565b600581111561083f5761083f61489b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108ae576108ae61489b565b146108cc5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6108f18584606001515f61228b565b6040518263ffffffff1660e01b815260040161090d9190614ad1565b6020604051808303815f875af1158015610929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094d9190614a98565b50505050565b5f61096364e8d4a5100083614b03565b92915050565b5f805160206151e78339815191525f80610982846122e2565b9150915061098f82612580565b6109995750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156109c8576109c861489b565b036109ed575f838152600785016020526040812080549190556109eb82826125bb565b505b610a03816109fe8460400151611266565b612631565b5050505050565b5f8181525f805160206151a78339815191526020526040808220815160e0810190925280545f805160206151e783398151915293929190829060ff166003811115610a5757610a5761489b565b6003811115610a6857610a6861489b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610adf90611dd4565b905060015f85815260058501602052604090205460ff166003811115610b0757610b0761489b565b14610b255760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610b3a57610b3a61489b565b03610c8357600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610b9457610b9461489b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610c9857610c9861489b565b03610ca657610a0384612654565b5f610cb086612831565b90505f80610cc18360400151612931565b509150915081856040015114610cea57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610d3257505f8781526005870160205260409020600201546001600160401b03808316600160801b90920416115b15610d5057604051633ab3447f60e11b815260040160405180910390fd5b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206152078339815191529060ff1615610e3457604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e77573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e9b9190614a98565b836020013514610ebe5760405163d040949d60e01b815260040160405180910390fd5b30610ecf6060850160408601614b22565b6001600160a01b031614610ef65760405163e6c4247b60e01b815260040160405180910390fd5b5f610f046060850185614b3d565b905090505f805b828163ffffffff1610156111b0575f610f276060880188614b3d565b8363ffffffff16818110610f3d57610f3d614b82565b9050602002810190610f4f9190614b96565b610f5890614c46565b80515f8181526008880160205260409020549192509015610f8c57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610fbb92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610fd591614cdd565b602060405180830381855afa158015610ff0573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110139190614a98565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561109f5761109f61489b565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611152911686614cee565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806111a990614d01565b9050610f0b565b50600483018190555f6111c285612831565b90505f6111d28260400151612b6f565b90505f6111de88612ce4565b9050816002826040516111f19190614cdd565b602060405180830381855afa15801561120c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061122f9190614a98565b1461124d57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f6109636001600160401b03831664e8d4a51000614d23565b5f61128982611dd4565b6080015192915050565b5f805160206151e78339815191525f6112ab85612e6a565b90506112b685612580565b6112c1575050505050565b5f8581526004830160205260409020546001600160a01b031633146112f95760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161132891600160b01b90046001600160401b031690614d3a565b6001600160401b03168160c001516001600160401b0316101561135e576040516302336bad60e51b815260040160405180910390fd5b8315610a03575f61136f8685611fb0565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b5906113bf90611266565b60a085015160c08601516040516001600160e01b031960e086901b1681526113f3939291829188905f908190600401614a5a565b602060405180830381865afa15801561140e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114329190614a98565b5f87815260078501602052604081208054909190611451908490614cee565b9091555050505050505050565b5f805160206151e78339815191525f61147683611dd4565b905060048151600581111561148d5761148d61489b565b146114ab5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146114e35760405163e6c4247b60e01b815260040160405180910390fd5b5f8381526007830160209081526040808320805490849055600486019092529091205461094d906001600160a01b0316826125bb565b6115216130a7565b5f8181525f805160206151a78339815191526020526040808220815160e0810190925280545f805160206151e783398151915293929190829060ff16600381111561156e5761156e61489b565b600381111561157f5761157f61489b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f6115ed85612831565b90505f806115fe8360400151612931565b50915091508184604001511461162757604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b0316111561165e57604051633ab3447f60e11b815260040160405180910390fd5b6003845160038111156116735761167361489b565b146116915760405163f95c7fe160e01b815260040160405180910390fd5b61169a86612654565b50505050506116b560015f8051602061522783398151915255565b5050565b6116c16130a7565b5f8181525f805160206151a78339815191526020526040808220815160e0810190925280545f805160206151e783398151915293929190829060ff16600381111561170e5761170e61489b565b600381111561171f5761171f61489b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61179582611dd4565b90505f835160038111156117ab576117ab61489b565b036117c957604051631d0b665760e21b815260040160405180910390fd5b6004815160058111156117de576117de61489b565b146117fc5760405163a36c527f60e01b815260040160405180910390fd5b6001835160038111156118115761181161489b565b036118285761181f85612654565b50505050611917565b60028351600381111561183d5761183d61489b565b0361190957600384015460608401516001600160a01b039091169063778c06b59061186790611266565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b1681526118b996959493926001600160401b0390921691908190600401614a5a565b602060405180830381865afa1580156118d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f89190614a98565b5f8681526006860160205260409020555b61191285612654565b505050505b61192d60015f8051602061522783398151915255565b50565b5f6119396130a7565b6119448333846130f1565b905061096360015f8051602061522783398151915255565b5f805160206152078339815191525f61197483612831565b90505f8061198583604001516133b8565b91509150806119a757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546119c190614d5a565b90505f036119e257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115611a0857611a0861489b565b14611a265760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120611a3e916146bb565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206151a78339815191526020526040808220815160e0810190925280545f805160206151e783398151915293929190829060ff166003811115611b1b57611b1b61489b565b6003811115611b2c57611b2c61489b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611ba557611ba561489b565b14158015611bc65750600381516003811115611bc357611bc361489b565b14155b15611be45760405163f95c7fe160e01b815260040160405180910390fd5b5f611bf28260400151611dd4565b905080606001516001600160401b03165f03611c2157604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611c4e84604001518460600151856080015161228b565b6040518263ffffffff1660e01b8152600401611c6a9190614ad1565b6020604051808303815f875af1158015611c86573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a039190614a98565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206152078339815191529190611cf190614d5a565b90505f03611d1257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611d3857611d3861489b565b14611d565760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611d8f9190600401614d92565b6020604051808303815f875af1158015611dab573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dcf9190614a98565b505050565b611ddc6146f2565b5f8281525f80516020615247833981519152602052604090819020815160e0810190925280545f80516020615207833981519152929190829060ff166005811115611e2957611e2961489b565b6005811115611e3a57611e3a61489b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611ea56130a7565b611eb18585858561355c565b9050611ec960015f8051602061522783398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611f1a575080546001600160401b03808416911610155b15611f385760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611f6384846136fa565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611ffb573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526120229190810190614e27565b915091508061204457604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612087573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120ab9190614a98565b8251146120cb5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156120f75760405163e6c4247b60e01b815260040160405180910390fd5b5f806121068460400151613714565b9150915081871461212a57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615247833981519152602052604081206002015481905f8051602061520783398151915290600160801b90046001600160401b031661217c85826138ef565b5f61218687613ab8565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6121d68a858b61228b565b6040518263ffffffff1660e01b81526004016121f29190614ad1565b6020604051808303815f875af115801561220e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122329190614a98565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f6122eb6146f2565b5f805160206152078339815191525f61230385612831565b90505f8061231483604001516133b8565b91509150801561233757604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156123685761236861489b565b60058111156123795761237961489b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156123e8576123e861489b565b1415801561240957506001815160058111156124065761240661489b565b14155b156124275760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561243c5761243c61489b565b0361244a576004815261244f565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156124945761249461489b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156125485761254861489b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206151c783398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612616575f80fd5b505af1158015612628573d5f803e3d5ffd5b50505050505050565b5f805160206151c7833981519152546116b5906001600160a01b03168383613b2d565b5f8181525f805160206151a78339815191526020526040808220815160e0810190925280545f805160206151e783398151915293929190829060ff1660038111156126a1576126a161489b565b60038111156126b2576126b261489b565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687018252828120805490829055848252600488019092529182205493945091926127109061278790600160a01b900461ffff1684614d23565b6127919190614b03565b905080856007015f8581526020019081526020015f205f8282546127b59190614cee565b909155505f90506127c68284614ef9565b90506127d68560200151826125bb565b6127eb85602001516109fe8760600151611266565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612895573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526128bc9190810190614e27565b91509150806128de57604051636b2f19e960e01b815260040160405180910390fd5b8151156128fe5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561292a5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f835160361461295657604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156129a55761296d816001614ef9565b612978906008614d23565b61ffff1686828151811061298e5761298e614b82565b016020015160f81c901b9190911790600101612959565b5061ffff8116156129c95760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612a24576129e0816003614ef9565b6129eb906008614d23565b63ffffffff16876129fd836002614cee565b81518110612a0d57612a0d614b82565b016020015160f81c901b91909117906001016129cc565b5063ffffffff8116600414612a4c57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612aa157612a6381601f614ef9565b612a6e906008614d23565b88612a7a836006614cee565b81518110612a8a57612a8a614b82565b016020015160f81c901b9190911790600101612a4f565b505f805b6008811015612b0057612ab9816007614ef9565b612ac4906008614d23565b6001600160401b031689612ad9836026614cee565b81518110612ae957612ae9614b82565b016020015160f81c901b9190911790600101612aa5565b505f805b6008811015612b5f57612b18816007614ef9565b612b23906008614d23565b6001600160401b03168a612b3883602e614cee565b81518110612b4857612b48614b82565b016020015160f81c901b9190911790600101612b04565b5091989097509095509350505050565b5f8151602614612b9257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612be157612ba9816001614ef9565b612bb4906008614d23565b61ffff16848281518110612bca57612bca614b82565b016020015160f81c901b9190911790600101612b95565b5061ffff811615612c055760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612c6057612c1c816003614ef9565b612c27906008614d23565b63ffffffff1685612c39836002614cee565b81518110612c4957612c49614b82565b016020015160f81c901b9190911790600101612c08565b5063ffffffff811615612c8657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612cdb57612c9d81601f614ef9565b612ca8906008614d23565b86612cb4836006614cee565b81518110612cc457612cc4614b82565b016020015160f81c901b9190911790600101612c89565b50949350505050565b60605f823560208401356014612cff86860160408801614b22565b612d0c6060880188614b3d565b604051612d65969594939250602001948552602085019390935260e091821b6001600160e01b0319908116604086015260609190911b6bffffffffffffffffffffffff1916604485015291901b166058820152605c0190565b60405160208183030381529060405290505f5b612d856060850185614b3d565b905081101561292a5781612d9c6060860186614b3d565b83818110612dac57612dac614b82565b9050602002810190612dbe9190614b96565b35612dcc6060870187614b3d565b84818110612ddc57612ddc614b82565b9050602002810190612dee9190614b96565b612dff906040810190602001614862565b612e0c6060880188614b3d565b85818110612e1c57612e1c614b82565b9050602002810190612e2e9190614b96565b612e3c906040810190614f0c565b604051602001612e50959493929190614f4e565b60408051601f198184030181529190529150600101612d78565b612e726146f2565b5f8281525f805160206152478339815191526020526040808220815160e0810190925280545f8051602061520783398151915293929190829060ff166005811115612ebf57612ebf61489b565b6005811115612ed057612ed061489b565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115612f4257612f4261489b565b14612f605760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115612fa457612fa461489b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6130508582612134565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f805160206152278339815191528054600119016130d857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061522783398151915255565b5f5f805160206151e78339815191528161310d61021485613b8c565b90505f61311987611dd4565b905061312487612580565b61314157604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156131565761315661489b565b146131745760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516131859190614d3a565b905083600201600a9054906101000a90046001600160401b031682604001516131ae9190614f93565b6001600160401b0316816001600160401b031611156131e057604051630c192e7760e41b815260040160405180910390fd5b5f806131ec8a84612134565b915091505f8a8360405160200161321a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156132ad576132ad61489b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146133dc57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561342b576133f3816001614ef9565b6133fe906008614d23565b61ffff1685828151811061341457613414614b82565b016020015160f81c901b91909117906001016133df565b5061ffff81161561344f5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156134aa57613466816003614ef9565b613471906008614d23565b63ffffffff1686613483836002614cee565b8151811061349357613493614b82565b016020015160f81c901b9190911790600101613452565b5063ffffffff81166003146134d257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613527576134e981601f614ef9565b6134f4906008614d23565b87613500836006614cee565b8151811061351057613510614b82565b016020015160f81c901b91909117906001016134d5565b505f8660268151811061353c5761353c614b82565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206151e783398151915290600160401b900461ffff90811690861610806135b0575061271061ffff8616115b156135ce5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613600576040516302336bad60e51b815260040160405180910390fd5b80548310806136125750806001015483115b1561363057604051630103be3b60e21b815260040160405180910390fd5b5f61363a84613b8c565b90505f61364682610953565b90505f6136538983613baf565b905060405180606001604052806136673390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b613702613f99565b61370b82613fe4565b6116b581614052565b5f808251602e1461373857604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137875761374f816001614ef9565b61375a906008614d23565b61ffff1685828151811061377057613770614b82565b016020015160f81c901b919091179060010161373b565b5061ffff8116156137ab5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613806576137c2816003614ef9565b6137cd906008614d23565b63ffffffff16866137df836002614cee565b815181106137ef576137ef614b82565b016020015160f81c901b91909117906001016137ae565b5063ffffffff811660051461382e57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138835761384581601f614ef9565b613850906008614d23565b8761385c836006614cee565b8151811061386c5761386c614b82565b016020015160f81c901b9190911790600101613831565b505f805b60088110156138e25761389b816007614ef9565b6138a6906008614d23565b6001600160401b0316886138bb836026614cee565b815181106138cb576138cb614b82565b016020015160f81c901b9190911790600101613887565b5090969095509350505050565b5f805160206152078339815191525f6001600160401b0380841690851611156139235761391c8385614a3a565b9050613930565b61392d8484614a3a565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061399257506001840154815161398e916001600160401b031690614cee565b8210155b156139b8576001600160401b0383166060820152818152604081015160208201526139d7565b82816060018181516139ca9190614d3a565b6001600160401b03169052505b60608101516139e7906064614f93565b602082015160018601546001600160401b039290921691613a129190600160401b900460ff16614d23565b1015613a315760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613a4c9190614cee565b9052506040810180516001600160401b0387169190613a6c908390614ef9565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206152478339815191526020526040812060020180545f805160206152078339815191529190600890613b0290600160401b90046001600160401b0316614fbe565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6040516001600160a01b03838116602483015260448201839052611dcf91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506140af565b5f610963825f805160206151c7833981519152546001600160a01b031690614115565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613bf357604051637fab81e560e01b815260040160405180910390fd5b5f8051602061520783398151915242613c126040860160208701614862565b6001600160401b0316111580613c4c5750613c306202a30042614cee565b613c406040860160208701614862565b6001600160401b031610155b15613c695760405162d36c8560e81b815260040160405180910390fd5b6030613c786040860186614f0c565b9050141580613c8657508335155b15613ca45760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613cd457604051630eb0d31360e11b815260040160405180910390fd5b613cde835f6138ef565b5f80613d776040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613d229190614862565b6001600160401b03168152602001613d3d60408a018a614f0c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614277565b5f82815260068601602052604090209193509150613d95828261501d565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613dd3908590600401614ad1565b6020604051808303815f875af1158015613def573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e139190614a98565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e8b57613e8b61489b565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f6b918e01908e01614862565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613fe257604051631afcd79f60e31b815260040160405180910390fd5b565b613fec613f99565b613ff58161433a565b613ffd614353565b61192d6060820135608083013561401a60c0850160a08601614862565b61402a60e0860160c087016150dc565b61403b610100870160e088016150f5565b61404d61012088016101008901614b22565b614363565b61405a613f99565b5f805160206151c78339815191526001600160a01b03821661408f5760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6140c36001600160a01b03841683614484565b905080515f141580156140e75750808060200190518101906140e59190615115565b155b15611dcf57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561415b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061417f9190614a98565b90506141966001600160a01b038516333086614491565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156141da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141fe9190614a98565b90508181116142645760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161410c565b61426e8282614ef9565b95945050505050565b5f60608260800151516030146142a057604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016142d29796959493929190615130565b60405160208183030381529060405290506002816040516142f39190614cdd565b602060405180830381855afa15801561430e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906143319190614a98565b94909350915050565b614342613f99565b61434a6144ca565b61192d816144d2565b61435b613f99565b613fe26145a4565b61436b613f99565b5f805160206151e783398151915261ffff8416158061438f575061271061ffff8516115b156143ad5760405163c98d73a760e01b815260040160405180910390fd5b858711156143ce57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806143e15750600a60ff8416115b156143ff576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b60606122db83835f6145ac565b6040516001600160a01b03848116602483015283811660448301526064820183905261094d9186918216906323b872dd90608401613b5a565b613fe2613f99565b6144da613f99565b80355f8051602061520783398151915290815560146144ff60608401604085016150f5565b60ff16118061451e575061451960608301604084016150f5565b60ff16155b1561453c5760405163b4fa3fb360e01b815260040160405180910390fd5b61454c60608301604084016150f5565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561457d6040830160208401614862565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6130de613f99565b6060814710156145d15760405163cd78605960e01b815230600482015260240161410c565b5f80856001600160a01b031684866040516145ec9190614cdd565b5f6040518083038185875af1925050503d805f8114614626576040519150601f19603f3d011682016040523d82523d5f602084013e61462b565b606091505b509150915061212a86838360608261464b5761464682614692565b6122db565b815115801561466257506001600160a01b0384163b155b1561468b57604051639996b31560e01b81526001600160a01b038516600482015260240161410c565b50806122db565b8051156146a25780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546146c790614d5a565b5f825580601f106146d6575050565b601f0160209004905f5260205f209081019061192d919061472e565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614742575f815560010161472f565b5090565b801515811461192d575f80fd5b803563ffffffff81168114614766575f80fd5b919050565b5f805f6060848603121561477d575f80fd5b83359250602084013561478f81614746565b915061479d60408501614753565b90509250925092565b5f602082840312156147b6575f80fd5b5035919050565b5f602082840312156147cd575f80fd5b6122db82614753565b5f80604083850312156147e7575f80fd5b6147f083614753565b946020939093013593505050565b5f806040838503121561480f575f80fd5b82356001600160401b03811115614824575f80fd5b830160808186031215614835575f80fd5b915061484360208401614753565b90509250929050565b80356001600160401b0381168114614766575f80fd5b5f60208284031215614872575f80fd5b6122db8261484c565b5f806040838503121561488c575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106148d257634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161490d60608401826001600160401b03169052565b50608083015161492860808401826001600160401b03169052565b5060a083015161494360a08401826001600160401b03169052565b5060c083015161292a60c08401826001600160401b03169052565b803561ffff81168114614766575f80fd5b5f805f8060808587031215614982575f80fd5b84356001600160401b03811115614997575f80fd5b8501606081880312156149a8575f80fd5b93506149b66020860161495e565b92506149c46040860161484c565b9396929550929360600135925050565b6001600160a01b038116811461192d575f80fd5b5f808284036101408112156149fb575f80fd5b61012080821215614a0a575f80fd5b8493508301359050614a1b816149d4565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b0382811682821603908082111561292a5761292a614a26565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614aa8575f80fd5b5051919050565b5f5b83811015614ac9578181015183820152602001614ab1565b50505f910152565b602081525f8251806020840152614aef816040850160208701614aaf565b601f01601f19169190910160400192915050565b5f82614b1d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215614b32575f80fd5b81356122db816149d4565b5f808335601e19843603018112614b52575f80fd5b8301803591506001600160401b03821115614b6b575f80fd5b6020019150600581901b3603821315612284575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614baa575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614bea57614bea614bb4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c1857614c18614bb4565b604052919050565b5f6001600160401b03821115614c3857614c38614bb4565b50601f01601f191660200190565b5f60608236031215614c56575f80fd5b614c5e614bc8565b823581526020614c6f81850161484c565b8183015260408401356001600160401b03811115614c8b575f80fd5b840136601f820112614c9b575f80fd5b8035614cae614ca982614c20565b614bf0565b8181523684838501011115614cc1575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614baa818460208701614aaf565b8082018082111561096357610963614a26565b5f63ffffffff808316818103614d1957614d19614a26565b6001019392505050565b808202811582820484141761096357610963614a26565b6001600160401b0381811683821601908082111561292a5761292a614a26565b600181811c90821680614d6e57607f821691505b602082108103614d8c57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614da481614d5a565b806020870152604060018084165f8114614dc55760018114614de157614e0e565b60ff19851660408a0152604084151560051b8a01019550614e0e565b895f5260205f205f5b85811015614e055781548b8201860152908301908801614dea565b8a016040019650505b509398975050505050505050565b805161476681614746565b5f8060408385031215614e38575f80fd5b82516001600160401b0380821115614e4e575f80fd5b9084019060608287031215614e61575f80fd5b614e69614bc8565b82518152602080840151614e7c816149d4565b82820152604084015183811115614e91575f80fd5b80850194505087601f850112614ea5575f80fd5b83519250614eb5614ca984614c20565b8381528882858701011115614ec8575f80fd5b614ed784838301848801614aaf565b80604084015250819550614eec818801614e1c565b9450505050509250929050565b8181038181111561096357610963614a26565b5f808335601e19843603018112614f21575f80fd5b8301803591506001600160401b03821115614f3a575f80fd5b602001915036819003821315612284575f80fd5b5f8651614f5f818460208b01614aaf565b820186815260c086901b6001600160c01b0319166020820152838560288301375f9301602801928352509095945050505050565b6001600160401b03818116838216028082169190828114614fb657614fb6614a26565b505092915050565b5f6001600160401b03808316818103614d1957614d19614a26565b601f821115611dcf57805f5260205f20601f840160051c81016020851015614ffe5750805b601f840160051c820191505b81811015610a03575f815560010161500a565b81516001600160401b0381111561503657615036614bb4565b61504a816150448454614d5a565b84614fd9565b602080601f83116001811461507d575f84156150665750858301515b5f19600386901b1c1916600185901b1785556150d4565b5f85815260208120601f198616915b828110156150ab5788860151825594840194600190910190840161508c565b50858210156150c857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156150ec575f80fd5b6122db8261495e565b5f60208284031215615105575f80fd5b813560ff811681146122db575f80fd5b5f60208284031215615125575f80fd5b81516122db81614746565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161518581604e860160208901614aaf565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 7e43fb0dc..2107668cf 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"ValidationPeriodCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161539b38038061539b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61524e8061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004614828565b61058b565b005b3480156101ea575f80fd5b506101dd6101f9366004614863565b610932565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd61024336600461487a565b610aa4565b348015610253575f80fd5b50610267610262366004614863565b610b81565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046148b8565b610b97565b604051908152602001610220565b348015610305575f80fd5b506101dd61031436600461490c565b610bcb565b348015610324575f80fd5b506101dd610333366004614925565b610c6c565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b36600461494d565b611044565b34801561038b575f80fd5b506102ec61039a36600461499b565b6114c8565b3480156103aa575f80fd5b506102676103b9366004614863565b6114e1565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb366004614828565b6114f5565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e366004614863565b6116c0565b34801561042e575f80fd5b506101dd61043d366004614925565b61177b565b34801561044d575f80fd5b506101dd61045c366004614863565b61191b565b34801561046c575f80fd5b506101dd61047b36600461490c565b611b92565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b4366004614863565b611d04565b3480156104c4575f80fd5b506101dd6104d3366004614863565b611ee0565b6102ec6104e6366004614863565b61200a565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e610519366004614863565b61203b565b60405161022091906149c8565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b366004614863565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff1660038111156105d8576105d86149b4565b60038111156105e9576105e96149b4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61065f8261203b565b9050600283516003811115610676576106766149b4565b146106945760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106c15760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f806002835160058111156106df576106df6149b4565b036107305787156106f7576106f48488612103565b91505b5f8560600151846080015161070c9190614a8b565b90506107188582612287565b506001600160401b031660c087015250429050610762565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b590610787906114c8565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016107b79796959493929190614aab565b602060405180830381865afa1580156107d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f69190614ae9565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff19166001836003811115610835576108356149b4565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061091f9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206152228339815191526020526040808220815160e0810190925280545f805160206151e283398151915293929190829060ff16600581111561097f5761097f6149b4565b6005811115610990576109906149b4565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109ff576109ff6149b4565b14610a1d5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a428584606001515f6123de565b6040518263ffffffff1660e01b8152600401610a5e9190614b22565b6020604051808303815f875af1158015610a7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9e9190614ae9565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aed575080546001600160401b03808416911610155b15610b0b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b358361242d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b9164e8d4a5100083614b54565b92915050565b5f610ba061243e565b610bac84848434612475565b9050610bc460015f8051602061520283398151915255565b9392505050565b5f805160206151c28339815191525f80610be48461261b565b91509150610bf1826128b9565b610bfb5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c2a57610c2a6149b4565b03610c4f575f83815260078501602052604081208054919055610c4d82826128f4565b505b610c6581610c6084604001516114c8565b61295a565b5050505050565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff166003811115610cb957610cb96149b4565b6003811115610cca57610cca6149b4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610d419061203b565b905060015f85815260058501602052604090205460ff166003811115610d6957610d696149b4565b14610d875760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610d9c57610d9c6149b4565b03610ee557600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610df657610df66149b4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610efa57610efa6149b4565b03610f0857610c658461296d565b5f610f1286612b4a565b90505f80610f238360400151612c4a565b509150915081856040015114610f4c57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610f9457505f8781526005870160205260409020600201546001600160401b03808316600160801b90920416115b15610fb257604051633ab3447f60e11b815260040160405180910390fd5b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206151e28339815191529060ff161561109657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110fd9190614ae9565b8360200135146111205760405163d040949d60e01b815260040160405180910390fd5b306111316060850160408601614b87565b6001600160a01b0316146111585760405163e6c4247b60e01b815260040160405180910390fd5b5f6111666060850185614ba2565b905090505f805b828163ffffffff161015611412575f6111896060880188614ba2565b8363ffffffff1681811061119f5761119f614be7565b90506020028101906111b19190614bfb565b6111ba90614cab565b80515f81815260088801602052604090205491925090156111ee57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161121d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261123791614d42565b602060405180830381855afa158015611252573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112759190614ae9565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115611301576113016149b4565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113b4911686614d53565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061140b90614d66565b905061116d565b50600483018190555f61142485612b4a565b90505f6114348260400151612e88565b90505f61144088612ffd565b9050816002826040516114539190614d42565b602060405180830381855afa15801561146e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906114919190614ae9565b146114af57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610b916001600160401b03831664e8d4a51000614d88565b5f6114eb8261203b565b6080015192915050565b5f805160206151c28339815191525f61150d85613496565b9050611518856128b9565b611523575050505050565b5f8581526004830160205260409020546001600160a01b0316331461155b5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161158a91600160b01b90046001600160401b031690614d9f565b6001600160401b03168160c001516001600160401b031610156115c0576040516302336bad60e51b815260040160405180910390fd5b8315610c65575f6115d18685612103565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b590611621906114c8565b60a085015160c08601516040516001600160e01b031960e086901b168152611655939291829188905f908190600401614aab565b602060405180830381865afa158015611670573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116949190614ae9565b5f878152600785016020526040812080549091906116b3908490614d53565b9091555050505050505050565b5f805160206151c28339815191525f6116d88361203b565b90506004815160058111156116ef576116ef6149b4565b1461170d5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146117455760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610a9e906001600160a01b0316826128f4565b61178361243e565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff1660038111156117d0576117d06149b4565b60038111156117e1576117e16149b4565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f61184f85612b4a565b90505f806118608360400151612c4a565b50915091508184604001511461188957604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156118c057604051633ab3447f60e11b815260040160405180910390fd5b6003845160038111156118d5576118d56149b4565b146118f35760405163f95c7fe160e01b815260040160405180910390fd5b6118fc8661296d565b505050505061191760015f8051602061520283398151915255565b5050565b61192361243e565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff166003811115611970576119706149b4565b6003811115611981576119816149b4565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6119f78261203b565b90505f83516003811115611a0d57611a0d6149b4565b03611a2b57604051631d0b665760e21b815260040160405180910390fd5b600481516005811115611a4057611a406149b4565b14611a5e5760405163a36c527f60e01b815260040160405180910390fd5b600183516003811115611a7357611a736149b4565b03611a8a57611a818561296d565b50505050611b79565b600283516003811115611a9f57611a9f6149b4565b03611b6b57600384015460608401516001600160a01b039091169063778c06b590611ac9906114c8565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b168152611b1b96959493926001600160401b0390921691908190600401614aab565b602060405180830381865afa158015611b36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b5a9190614ae9565b5f8681526006860160205260409020555b611b748561296d565b505050505b611b8f60015f8051602061520283398151915255565b50565b5f805160206151e28339815191525f611baa83612b4a565b90505f80611bbb83604001516136d3565b9150915080611bdd57604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068501602052604090208054611bf790614dbf565b90505f03611c1857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115611c3e57611c3e6149b4565b14611c5c5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120611c749161477d565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff166003811115611d5157611d516149b4565b6003811115611d6257611d626149b4565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611ddb57611ddb6149b4565b14158015611dfc5750600381516003811115611df957611df96149b4565b14155b15611e1a5760405163f95c7fe160e01b815260040160405180910390fd5b5f611e28826040015161203b565b905080606001516001600160401b03165f03611e5757604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611e848460400151846060015185608001516123de565b6040518263ffffffff1660e01b8152600401611ea09190614b22565b6020604051808303815f875af1158015611ebc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c659190614ae9565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206151e28339815191529190611f2790614dbf565b90505f03611f4857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611f6e57611f6e6149b4565b14611f8c5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fc59190600401614df1565b6020604051808303815f875af1158015611fe1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120059190614ae9565b505050565b5f61201361243e565b61201e823334613877565b905061203660015f8051602061520283398151915255565b919050565b6120436147b4565b5f8281525f80516020615222833981519152602052604090819020815160e0810190925280545f805160206151e2833981519152929190829060ff166005811115612090576120906149b4565b60058111156120a1576120a16149b4565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561214e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121759190810190614e86565b915091508061219757604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fe9190614ae9565b82511461221e5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561224a5760405163e6c4247b60e01b815260040160405180910390fd5b5f806122598460400151613b3b565b9150915081871461227d57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020615222833981519152602052604081206002015481905f805160206151e283398151915290600160801b90046001600160401b03166122cf8582613d16565b5f6122d987613edf565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123298a858b6123de565b6040518263ffffffff1660e01b81526004016123459190614b22565b6020604051808303815f875af1158015612361573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123859190614ae9565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612435613f54565b611b8f81613f9f565b5f8051602061520283398151915280546001190161246f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206151c283398151915290600160401b900461ffff90811690861610806124c9575061271061ffff8616115b156124e75760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612519576040516302336bad60e51b815260040160405180910390fd5b805483108061252b5750806001015483115b1561254957604051630103be3b60e21b815260040160405180910390fd5b825f61255482610b81565b90505f612561898361400d565b905060405180606001604052806125753390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f8051602061520283398151915255565b5f6126246147b4565b5f805160206151e28339815191525f61263c85612b4a565b90505f8061264d83604001516136d3565b91509150801561267057604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156126a1576126a16149b4565b60058111156126b2576126b26149b4565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612721576127216149b4565b14158015612742575060018151600581111561273f5761273f6149b4565b14155b156127605760405163a36c527f60e01b815260040160405180910390fd5b600381516005811115612775576127756149b4565b036127835760048152612788565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156127cd576127cd6149b4565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612881576128816149b4565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612940575f80fd5b505af1158015612952573d5f803e3d5ffd5b505050505050565b6119176001600160a01b038316826143f7565b5f8181525f805160206151a28339815191526020526040808220815160e0810190925280545f805160206151c283398151915293929190829060ff1660038111156129ba576129ba6149b4565b60038111156129cb576129cb6149b4565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612aa090600160a01b900461ffff1684614d88565b612aaa9190614b54565b905080856007015f8581526020019081526020015f205f828254612ace9190614d53565b909155505f9050612adf8284614f58565b9050612aef8560200151826128f4565b612b048560200151610c6087606001516114c8565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bae573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bd59190810190614e86565b9150915080612bf757604051636b2f19e960e01b815260040160405180910390fd5b815115612c175760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612c435760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612c6f57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612cbe57612c86816001614f58565b612c91906008614d88565b61ffff16868281518110612ca757612ca7614be7565b016020015160f81c901b9190911790600101612c72565b5061ffff811615612ce25760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612d3d57612cf9816003614f58565b612d04906008614d88565b63ffffffff1687612d16836002614d53565b81518110612d2657612d26614be7565b016020015160f81c901b9190911790600101612ce5565b5063ffffffff8116600414612d6557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612dba57612d7c81601f614f58565b612d87906008614d88565b88612d93836006614d53565b81518110612da357612da3614be7565b016020015160f81c901b9190911790600101612d68565b505f805b6008811015612e1957612dd2816007614f58565b612ddd906008614d88565b6001600160401b031689612df2836026614d53565b81518110612e0257612e02614be7565b016020015160f81c901b9190911790600101612dbe565b505f805b6008811015612e7857612e31816007614f58565b612e3c906008614d88565b6001600160401b03168a612e5183602e614d53565b81518110612e6157612e61614be7565b016020015160f81c901b9190911790600101612e1d565b5091989097509095509350505050565b5f8151602614612eab57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612efa57612ec2816001614f58565b612ecd906008614d88565b61ffff16848281518110612ee357612ee3614be7565b016020015160f81c901b9190911790600101612eae565b5061ffff811615612f1e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612f7957612f35816003614f58565b612f40906008614d88565b63ffffffff1685612f52836002614d53565b81518110612f6257612f62614be7565b016020015160f81c901b9190911790600101612f21565b5063ffffffff811615612f9f57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612ff457612fb681601f614f58565b612fc1906008614d88565b86612fcd836006614d53565b81518110612fdd57612fdd614be7565b016020015160f81c901b9190911790600101612fa2565b50949350505050565b60605f61300c83830184614ba2565b61301891506058614d88565b61302390605c614d53565b6001600160401b0381111561303a5761303a614c19565b6040519080825280601f01601f191660200182016040528015613064576020820181803683370190505b5090505f5b60208110156130b9578335816020811061308557613085614be7565b1a60f81b82828151811061309b5761309b614be7565b60200101906001600160f81b03191690815f1a905350600101613069565b505f5b602081101561311957836020013581602081106130db576130db614be7565b1a60f81b826130eb836020614d53565b815181106130fb576130fb614be7565b60200101906001600160f81b03191690815f1a9053506001016130bc565b505f5b600481101561317c57613130816003614f58565b61313b906008614d88565b6014901c60f81b8261314e836040614d53565b8151811061315e5761315e614be7565b60200101906001600160f81b03191690815f1a90535060010161311c565b505f61318e6060850160408601614b87565b60601b90505f5b60148110156131ee578181601481106131b0576131b0614be7565b1a60f81b836131c0836044614d53565b815181106131d0576131d0614be7565b60200101906001600160f81b03191690815f1a905350600101613195565b505f6131fd6060860186614ba2565b905090505f5b600481101561326857613217816003614f58565b613222906008614d88565b63ffffffff8316901c60f81b8461323a836058614d53565b8151811061324a5761324a614be7565b60200101906001600160f81b03191690815f1a905350600101613203565b505f5b6132786060870187614ba2565b905081101561348c575f61328d826058614d88565b61329890605c614d53565b90505f5b6020811015613323576132b26060890189614ba2565b848181106132c2576132c2614be7565b90506020028101906132d49190614bfb565b3581602081106132e6576132e6614be7565b1a60f81b866132f58385614d53565b8151811061330557613305614be7565b60200101906001600160f81b03191690815f1a90535060010161329c565b505f5b60088110156133d85761333a816007614f58565b613345906008614d88565b61335260608a018a614ba2565b8581811061336257613362614be7565b90506020028101906133749190614bfb565b61338590604081019060200161499b565b6001600160401b0316901c60f81b86826133a0856020614d53565b6133aa9190614d53565b815181106133ba576133ba614be7565b60200101906001600160f81b03191690815f1a905350600101613326565b505f5b6030811015613482576133f16060890189614ba2565b8481811061340157613401614be7565b90506020028101906134139190614bfb565b613421906040810190614f6b565b8281811061343157613431614be7565b9050013560f81c60f81b868284602861344a9190614d53565b6134549190614d53565b8151811061346457613464614be7565b60200101906001600160f81b03191690815f1a9053506001016133db565b505060010161326b565b5091949350505050565b61349e6147b4565b5f8281525f805160206152228339815191526020526040808220815160e0810190925280545f805160206151e283398151915293929190829060ff1660058111156134eb576134eb6149b4565b60058111156134fc576134fc6149b4565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561356e5761356e6149b4565b1461358c5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156135d0576135d06149b4565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61367c8582612287565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146136f757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137465761370e816001614f58565b613719906008614d88565b61ffff1685828151811061372f5761372f614be7565b016020015160f81c901b91909117906001016136fa565b5061ffff81161561376a5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156137c557613781816003614f58565b61378c906008614d88565b63ffffffff168661379e836002614d53565b815181106137ae576137ae614be7565b016020015160f81c901b919091179060010161376d565b5063ffffffff81166003146137ed57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138425761380481601f614f58565b61380f906008614d88565b8761381b836006614d53565b8151811061382b5761382b614be7565b016020015160f81c901b91909117906001016137f0565b505f8660268151811061385757613857614be7565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206151c28339815191528161389084610b81565b90505f61389c8761203b565b90506138a7876128b9565b6138c457604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156138d9576138d96149b4565b146138f75760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516139089190614d9f565b905083600201600a9054906101000a90046001600160401b031682604001516139319190614fad565b6001600160401b0316816001600160401b0316111561396357604051630c192e7760e41b815260040160405180910390fd5b5f8061396f8a84612287565b915091505f8a8360405160200161399d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff19166001836003811115613a3057613a306149b4565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613b5f57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613bae57613b76816001614f58565b613b81906008614d88565b61ffff16858281518110613b9757613b97614be7565b016020015160f81c901b9190911790600101613b62565b5061ffff811615613bd25760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613c2d57613be9816003614f58565b613bf4906008614d88565b63ffffffff1686613c06836002614d53565b81518110613c1657613c16614be7565b016020015160f81c901b9190911790600101613bd5565b5063ffffffff8116600514613c5557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613caa57613c6c81601f614f58565b613c77906008614d88565b87613c83836006614d53565b81518110613c9357613c93614be7565b016020015160f81c901b9190911790600101613c58565b505f805b6008811015613d0957613cc2816007614f58565b613ccd906008614d88565b6001600160401b031688613ce2836026614d53565b81518110613cf257613cf2614be7565b016020015160f81c901b9190911790600101613cae565b5090969095509350505050565b5f805160206151e28339815191525f6001600160401b038084169085161115613d4a57613d438385614a8b565b9050613d57565b613d548484614a8b565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613db9575060018401548151613db5916001600160401b031690614d53565b8210155b15613ddf576001600160401b038316606082015281815260408101516020820152613dfe565b8281606001818151613df19190614d9f565b6001600160401b03169052505b6060810151613e0e906064614fad565b602082015160018601546001600160401b039290921691613e399190600160401b900460ff16614d88565b1015613e585760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613e739190614d53565b9052506040810180516001600160401b0387169190613e93908390614f58565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206152228339815191526020526040812060020180545f805160206151e28339815191529190600890613f2990600160401b90046001600160401b0316614fd8565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f9d57604051631afcd79f60e31b815260040160405180910390fd5b565b613fa7613f54565b613fb08161448e565b613fb86144a7565b611b8f60608201356080830135613fd560c0850160a0860161499b565b613fe560e0860160c08701614ff3565b613ff6610100870160e0880161500c565b61400861012088016101008901614b87565b6144b7565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661405157604051637fab81e560e01b815260040160405180910390fd5b5f805160206151e283398151915242614070604086016020870161499b565b6001600160401b03161115806140aa575061408e6202a30042614d53565b61409e604086016020870161499b565b6001600160401b031610155b156140c75760405162d36c8560e81b815260040160405180910390fd5b60306140d66040860186614f6b565b90501415806140e457508335155b156141025760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561413257604051630eb0d31360e11b815260040160405180910390fd5b61413c835f613d16565b5f806141d56040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190614180919061499b565b6001600160401b0316815260200161419b60408a018a614f6b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506145d8565b5f828152600686016020526040902091935091506141f38282615070565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614231908590600401614b22565b6020604051808303815f875af115801561424d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142719190614ae9565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156142e9576142e96149b4565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916143c9918e01908e0161499b565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561441e5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614467576040519150601f19603f3d011682016040523d82523d5f602084013e61446c565b606091505b505090508061200557604051630a12f52160e11b815260040160405180910390fd5b614496613f54565b61449e61469b565b611b8f816146a3565b6144af613f54565b613f9d614775565b6144bf613f54565b5f805160206151c283398151915261ffff841615806144e3575061271061ffff8516115b156145015760405163c98d73a760e01b815260040160405180910390fd5b8587111561452257604051630103be3b60e21b815260040160405180910390fd5b60ff831615806145355750600a60ff8416115b15614553576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461460157604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614633979695949392919061512b565b60405160208183030381529060405290506002816040516146549190614d42565b602060405180830381855afa15801561466f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906146929190614ae9565b94909350915050565b613f9d613f54565b6146ab613f54565b80355f805160206151e283398151915290815560146146d0606084016040850161500c565b60ff1611806146ef57506146ea606083016040840161500c565b60ff16155b1561470d5760405163b4fa3fb360e01b815260040160405180910390fd5b61471d606083016040840161500c565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561474e604083016020840161499b565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612608613f54565b50805461478990614dbf565b5f825580601f10614798575050565b601f0160209004905f5260205f2090810190611b8f91906147f0565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614804575f81556001016147f1565b5090565b8015158114611b8f575f80fd5b803563ffffffff81168114612036575f80fd5b5f805f6060848603121561483a575f80fd5b83359250602084013561484c81614808565b915061485a60408501614815565b90509250925092565b5f60208284031215614873575f80fd5b5035919050565b5f610120828403121561488b575f80fd5b50919050565b803561ffff81168114612036575f80fd5b80356001600160401b0381168114612036575f80fd5b5f805f606084860312156148ca575f80fd5b83356001600160401b038111156148df575f80fd5b8401606081870312156148f0575f80fd5b92506148fe60208501614891565b915061485a604085016148a2565b5f6020828403121561491c575f80fd5b610bc482614815565b5f8060408385031215614936575f80fd5b61493f83614815565b946020939093013593505050565b5f806040838503121561495e575f80fd5b82356001600160401b03811115614973575f80fd5b830160808186031215614984575f80fd5b915061499260208401614815565b90509250929050565b5f602082840312156149ab575f80fd5b610bc4826148a2565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106149eb57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614a2660608401826001600160401b03169052565b506080830151614a4160808401826001600160401b03169052565b5060a0830151614a5c60a08401826001600160401b03169052565b5060c0830151612c4360c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612c4357612c43614a77565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614af9575f80fd5b5051919050565b5f5b83811015614b1a578181015183820152602001614b02565b50505f910152565b602081525f8251806020840152614b40816040850160208701614b00565b601f01601f19169190910160400192915050565b5f82614b6e57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114611b8f575f80fd5b5f60208284031215614b97575f80fd5b8135610bc481614b73565b5f808335601e19843603018112614bb7575f80fd5b8301803591506001600160401b03821115614bd0575f80fd5b6020019150600581901b36038213156123d7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614c0f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614c4f57614c4f614c19565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614c7d57614c7d614c19565b604052919050565b5f6001600160401b03821115614c9d57614c9d614c19565b50601f01601f191660200190565b5f60608236031215614cbb575f80fd5b614cc3614c2d565b823581526020614cd48185016148a2565b8183015260408401356001600160401b03811115614cf0575f80fd5b840136601f820112614d00575f80fd5b8035614d13614d0e82614c85565b614c55565b8181523684838501011115614d26575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614c0f818460208701614b00565b80820180821115610b9157610b91614a77565b5f63ffffffff808316818103614d7e57614d7e614a77565b6001019392505050565b8082028115828204841417610b9157610b91614a77565b6001600160401b03818116838216019080821115612c4357612c43614a77565b600181811c90821680614dd357607f821691505b60208210810361488b57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614e0381614dbf565b806020870152604060018084165f8114614e245760018114614e4057614e6d565b60ff19851660408a0152604084151560051b8a01019550614e6d565b895f5260205f205f5b85811015614e645781548b8201860152908301908801614e49565b8a016040019650505b509398975050505050505050565b805161203681614808565b5f8060408385031215614e97575f80fd5b82516001600160401b0380821115614ead575f80fd5b9084019060608287031215614ec0575f80fd5b614ec8614c2d565b82518152602080840151614edb81614b73565b82820152604084015183811115614ef0575f80fd5b80850194505087601f850112614f04575f80fd5b83519250614f14614d0e84614c85565b8381528882858701011115614f27575f80fd5b614f3684838301848801614b00565b80604084015250819550614f4b818801614e7b565b9450505050509250929050565b81810381811115610b9157610b91614a77565b5f808335601e19843603018112614f80575f80fd5b8301803591506001600160401b03821115614f99575f80fd5b6020019150368190038213156123d7575f80fd5b6001600160401b03818116838216028082169190828114614fd057614fd0614a77565b505092915050565b5f6001600160401b03808316818103614d7e57614d7e614a77565b5f60208284031215615003575f80fd5b610bc482614891565b5f6020828403121561501c575f80fd5b813560ff81168114610bc4575f80fd5b601f82111561200557805f5260205f20601f840160051c810160208510156150515750805b601f840160051c820191505b81811015610c65575f815560010161505d565b81516001600160401b0381111561508957615089614c19565b61509d816150978454614dbf565b8461502c565b602080601f8311600181146150d0575f84156150b95750858301515b5f19600386901b1c1916600185901b178555612952565b5f85815260208120601f198616915b828110156150fe578886015182559484019460019091019084016150df565b508582101561511b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161518081604e860160208901614b00565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b506040516150cd3803806150cd83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b614f808061014d5f395ff3fe6080604052600436106101ba575f3560e01c8063732214f8116100f2578063b771b3bc11610092578063c974d1b611610062578063c974d1b6146104eb578063d5f20ff6146104ff578063df93d8de1461052b578063e7d14c1c14610541575f80fd5b8063b771b3bc14610480578063ba3a4b971461049a578063bee0a03f146104b9578063c599e24f146104d8575f80fd5b806393e24598116100cd57806393e245981461040457806398f3e2b4146104235780639dde029a14610442578063a3a65e4814610461575f80fd5b8063732214f8146103be57806376f78621146103d15780638280a25a146103f0575f80fd5b806340034a931161015d57806360305d621161013857806360305d621461033857806361e2f49014610361578063620658561461038057806366435abf1461039f575f80fd5b806340034a93146102d9578063467ef06f146102fa5780635297fae614610319575f80fd5b806320e555651161019857806320e55565146102295780632e2194d814610248578063329c3e121461027f57806335455ded146102b1575f80fd5b80630118acc4146101be5780630322ed98146101df578063151d30d1146101fe575b5f80fd5b3480156101c9575f80fd5b506101dd6101d8366004614515565b61058b565b005b3480156101ea575f80fd5b506101dd6101f9366004614550565b610932565b348015610209575f80fd5b50610212600a81565b60405160ff90911681526020015b60405180910390f35b348015610234575f80fd5b506101dd610243366004614567565b610aa4565b348015610253575f80fd5b50610267610262366004614550565b610b81565b6040516001600160401b039091168152602001610220565b34801561028a575f80fd5b506102996001600160991b0181565b6040516001600160a01b039091168152602001610220565b3480156102bc575f80fd5b506102c661271081565b60405161ffff9091168152602001610220565b6102ec6102e73660046145a5565b610b97565b604051908152602001610220565b348015610305575f80fd5b506101dd6103143660046145f9565b610bcb565b348015610324575f80fd5b506101dd610333366004614612565b610c6c565b348015610343575f80fd5b5061034c601481565b60405163ffffffff9091168152602001610220565b34801561036c575f80fd5b506101dd61037b36600461463a565b611044565b34801561038b575f80fd5b506102ec61039a366004614688565b6114c8565b3480156103aa575f80fd5b506102676103b9366004614550565b6114e1565b3480156103c9575f80fd5b506102ec5f81565b3480156103dc575f80fd5b506101dd6103eb366004614515565b6114f5565b3480156103fb575f80fd5b50610212603081565b34801561040f575f80fd5b506101dd61041e366004614550565b6116c0565b34801561042e575f80fd5b506101dd61043d366004614612565b61177b565b34801561044d575f80fd5b506101dd61045c366004614550565b61191b565b34801561046c575f80fd5b506101dd61047b3660046145f9565b611b92565b34801561048b575f80fd5b506102996005600160991b0181565b3480156104a5575f80fd5b506101dd6104b4366004614550565b611d04565b3480156104c4575f80fd5b506101dd6104d3366004614550565b611ee0565b6102ec6104e6366004614550565b61200a565b3480156104f6575f80fd5b50610212601481565b34801561050a575f80fd5b5061051e610519366004614550565b61203b565b60405161022091906146b5565b348015610536575f80fd5b506102676202a30081565b34801561054c575f80fd5b506102ec61055b366004614550565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f80516020614ed48339815191526020526040808220815160e0810190925280545f80516020614ef483398151915293929190829060ff1660038111156105d8576105d86146a1565b60038111156105e9576105e96146a1565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61065f8261203b565b9050600283516003811115610676576106766146a1565b146106945760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146106c15760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f806002835160058111156106df576106df6146a1565b036107305787156106f7576106f48488612103565b91505b5f8560600151846080015161070c9190614778565b90506107188582612287565b506001600160401b031660c087015250429050610762565b50505f82815260088501602052604090205460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b590610787906114c8565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016107b79796959493929190614798565b602060405180830381865afa1580156107d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f691906147d6565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff19166001836003811115610835576108356146a1565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061091f9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f80516020614f548339815191526020526040808220815160e0810190925280545f80516020614f1483398151915293929190829060ff16600581111561097f5761097f6146a1565b6005811115610990576109906146a1565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156109ff576109ff6146a1565b14610a1d5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a428584606001515f6123de565b6040518263ffffffff1660e01b8152600401610a5e919061480f565b6020604051808303815f875af1158015610a7a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9e91906147d6565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610aed575080546001600160401b03808416911610155b15610b0b5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b358361242d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b5f610b9164e8d4a5100083614841565b92915050565b5f610ba061243e565b610bac84848434612475565b9050610bc460015f80516020614f3483398151915255565b9392505050565b5f80516020614ef48339815191525f80610be48461261b565b91509150610bf1826128b9565b610bfb5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610c2a57610c2a6146a1565b03610c4f575f83815260078501602052604081208054919055610c4d82826128f4565b505b610c6581610c6084604001516114c8565b61295a565b5050505050565b5f8181525f80516020614ed48339815191526020526040808220815160e0810190925280545f80516020614ef483398151915293929190829060ff166003811115610cb957610cb96146a1565b6003811115610cca57610cca6146a1565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610d419061203b565b905060015f85815260058501602052604090205460ff166003811115610d6957610d696146a1565b14610d875760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610d9c57610d9c6146a1565b03610ee557600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610df657610df66146a1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610efa57610efa6146a1565b03610f0857610c658461296d565b5f610f1286612b4a565b90505f80610f238360400151612c4a565b509150915081856040015114610f4c57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031684606001516001600160401b03161080610f9457505f8781526005870160205260409020600201546001600160401b03808316600160801b90920416115b15610fb257604051633ab3447f60e11b815260040160405180910390fd5b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff00000000000000001990931692909217909255925192835283169184918a917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a45050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020614f148339815191529060ff161561109657604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110d9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110fd91906147d6565b8360200135146111205760405163d040949d60e01b815260040160405180910390fd5b306111316060850160408601614874565b6001600160a01b0316146111585760405163e6c4247b60e01b815260040160405180910390fd5b5f611166606085018561488f565b905090505f805b828163ffffffff161015611412575f611189606088018861488f565b8363ffffffff1681811061119f5761119f6148d4565b90506020028101906111b191906148e8565b6111ba90614998565b80515f81815260088801602052604090205491925090156111ee57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161121d92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261123791614a2f565b602060405180830381855afa158015611252573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061127591906147d6565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115611301576113016146a1565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516113b4911686614a40565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061140b90614a53565b905061116d565b50600483018190555f61142485612b4a565b90505f6114348260400151612e88565b90505f61144088612ffd565b9050816002826040516114539190614a2f565b602060405180830381855afa15801561146e573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061149191906147d6565b146114af57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f610b916001600160401b03831664e8d4a51000614a75565b5f6114eb8261203b565b6080015192915050565b5f80516020614ef48339815191525f61150d85613183565b9050611518856128b9565b611523575050505050565b5f8581526004830160205260409020546001600160a01b0316331461155b5760405163e6c4247b60e01b815260040160405180910390fd5b5f85815260048301602052604090205460a082015161158a91600160b01b90046001600160401b031690614a8c565b6001600160401b03168160c001516001600160401b031610156115c0576040516302336bad60e51b815260040160405180910390fd5b8315610c65575f6115d18685612103565b5f87815260088501602052604090819020805467ffffffffffffffff19166001600160401b0384161790556003850154908401519192506001600160a01b03169063778c06b590611621906114c8565b60a085015160c08601516040516001600160e01b031960e086901b168152611655939291829188905f908190600401614798565b602060405180830381865afa158015611670573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061169491906147d6565b5f878152600785016020526040812080549091906116b3908490614a40565b9091555050505050505050565b5f80516020614ef48339815191525f6116d88361203b565b90506004815160058111156116ef576116ef6146a1565b1461170d5760405163a36c527f60e01b815260040160405180910390fd5b5f8381526004830160205260409020546001600160a01b031633146117455760405163e6c4247b60e01b815260040160405180910390fd5b5f83815260078301602090815260408083208054908490556004860190925290912054610a9e906001600160a01b0316826128f4565b61178361243e565b5f8181525f80516020614ed48339815191526020526040808220815160e0810190925280545f80516020614ef483398151915293929190829060ff1660038111156117d0576117d06146a1565b60038111156117e1576117e16146a1565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f61184f85612b4a565b90505f806118608360400151612c4a565b50915091508184604001511461188957604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168460c001516001600160401b031611156118c057604051633ab3447f60e11b815260040160405180910390fd5b6003845160038111156118d5576118d56146a1565b146118f35760405163f95c7fe160e01b815260040160405180910390fd5b6118fc8661296d565b505050505061191760015f80516020614f3483398151915255565b5050565b61192361243e565b5f8181525f80516020614ed48339815191526020526040808220815160e0810190925280545f80516020614ef483398151915293929190829060ff166003811115611970576119706146a1565b6003811115611981576119816146a1565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6119f78261203b565b90505f83516003811115611a0d57611a0d6146a1565b03611a2b57604051631d0b665760e21b815260040160405180910390fd5b600481516005811115611a4057611a406146a1565b14611a5e5760405163a36c527f60e01b815260040160405180910390fd5b600183516003811115611a7357611a736146a1565b03611a8a57611a818561296d565b50505050611b79565b600283516003811115611a9f57611a9f6146a1565b03611b6b57600384015460608401516001600160a01b039091169063778c06b590611ac9906114c8565b60a0840151608087015160c08601515f88815260088b0160205260408082205490516001600160e01b031960e089901b168152611b1b96959493926001600160401b0390921691908190600401614798565b602060405180830381865afa158015611b36573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b5a91906147d6565b5f8681526006860160205260409020555b611b748561296d565b505050505b611b8f60015f80516020614f3483398151915255565b50565b5f80516020614f148339815191525f611baa83612b4a565b90505f80611bbb83604001516133c0565b9150915080611bdd57604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068501602052604090208054611bf790614aac565b90505f03611c1857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115611c3e57611c3e6146a1565b14611c5c5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120611c749161446a565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181525f80516020614ed48339815191526020526040808220815160e0810190925280545f80516020614ef483398151915293929190829060ff166003811115611d5157611d516146a1565b6003811115611d6257611d626146a1565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611ddb57611ddb6146a1565b14158015611dfc5750600381516003811115611df957611df96146a1565b14155b15611e1a5760405163f95c7fe160e01b815260040160405180910390fd5b5f611e28826040015161203b565b905080606001516001600160401b03165f03611e5757604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611e848460400151846060015185608001516123de565b6040518263ffffffff1660e01b8152600401611ea0919061480f565b6020604051808303815f875af1158015611ebc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6591906147d6565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020614f148339815191529190611f2790614aac565b90505f03611f4857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611f6e57611f6e6146a1565b14611f8c5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611fc59190600401614ade565b6020604051808303815f875af1158015611fe1573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061200591906147d6565b505050565b5f61201361243e565b61201e823334613564565b905061203660015f80516020614f3483398151915255565b919050565b6120436144a1565b5f8281525f80516020614f54833981519152602052604090819020815160e0810190925280545f80516020614f14833981519152929190829060ff166005811115612090576120906146a1565b60058111156120a1576120a16146a1565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561214e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526121759190810190614b73565b915091508061219757604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121fe91906147d6565b82511461221e5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561224a5760405163e6c4247b60e01b815260040160405180910390fd5b5f806122598460400151613828565b9150915081871461227d57604051636990657d60e01b815260040160405180910390fd5b9695505050505050565b5f8281525f80516020614f54833981519152602052604081206002015481905f80516020614f1483398151915290600160801b90046001600160401b03166122cf8582613a03565b5f6122d987613bcc565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123298a858b6123de565b6040518263ffffffff1660e01b8152600401612345919061480f565b6020604051808303815f875af1158015612361573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061238591906147d6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b612435613c41565b611b8f81613c8c565b5f80516020614f3483398151915280546001190161246f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ef483398151915290600160401b900461ffff90811690861610806124c9575061271061ffff8616115b156124e75760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015612519576040516302336bad60e51b815260040160405180910390fd5b805483108061252b5750806001015483115b1561254957604051630103be3b60e21b815260040160405180910390fd5b825f61255482610b81565b90505f6125618983613cfa565b905060405180606001604052806125753390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040958601525f8781526004909a0182529884902085518154928701519690950151909916600160b01b0267ffffffffffffffff60b01b1995909216600160a01b026001600160b01b031990911693909216929092171791909116179093555090915050949350505050565b60015f80516020614f3483398151915255565b5f6126246144a1565b5f80516020614f148339815191525f61263c85612b4a565b90505f8061264d83604001516133c0565b91509150801561267057604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff1660058111156126a1576126a16146a1565b60058111156126b2576126b26146a1565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612721576127216146a1565b14158015612742575060018151600581111561273f5761273f6146a1565b14155b156127605760405163a36c527f60e01b815260040160405180910390fd5b600381516005811115612775576127756146a1565b036127835760048152612788565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff191660018360058111156127cd576127cd6146a1565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612881576128816146a1565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612940575f80fd5b505af1158015612952573d5f803e3d5ffd5b505050505050565b6119176001600160a01b038316826140e4565b5f8181525f80516020614ed48339815191526020526040808220815160e0810190925280545f80516020614ef483398151915293929190829060ff1660038111156129ba576129ba6146a1565b60038111156129cb576129cb6146a1565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612aa090600160a01b900461ffff1684614a75565b612aaa9190614841565b905080856007015f8581526020019081526020015f205f828254612ace9190614a40565b909155505f9050612adf8284614c45565b9050612aef8560200151826128f4565b612b048560200151610c6087606001516114c8565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612bae573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612bd59190810190614b73565b9150915080612bf757604051636b2f19e960e01b815260040160405180910390fd5b815115612c175760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612c435760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612c6f57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612cbe57612c86816001614c45565b612c91906008614a75565b61ffff16868281518110612ca757612ca76148d4565b016020015160f81c901b9190911790600101612c72565b5061ffff811615612ce25760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612d3d57612cf9816003614c45565b612d04906008614a75565b63ffffffff1687612d16836002614a40565b81518110612d2657612d266148d4565b016020015160f81c901b9190911790600101612ce5565b5063ffffffff8116600414612d6557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612dba57612d7c81601f614c45565b612d87906008614a75565b88612d93836006614a40565b81518110612da357612da36148d4565b016020015160f81c901b9190911790600101612d68565b505f805b6008811015612e1957612dd2816007614c45565b612ddd906008614a75565b6001600160401b031689612df2836026614a40565b81518110612e0257612e026148d4565b016020015160f81c901b9190911790600101612dbe565b505f805b6008811015612e7857612e31816007614c45565b612e3c906008614a75565b6001600160401b03168a612e5183602e614a40565b81518110612e6157612e616148d4565b016020015160f81c901b9190911790600101612e1d565b5091989097509095509350505050565b5f8151602614612eab57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612efa57612ec2816001614c45565b612ecd906008614a75565b61ffff16848281518110612ee357612ee36148d4565b016020015160f81c901b9190911790600101612eae565b5061ffff811615612f1e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612f7957612f35816003614c45565b612f40906008614a75565b63ffffffff1685612f52836002614a40565b81518110612f6257612f626148d4565b016020015160f81c901b9190911790600101612f21565b5063ffffffff811615612f9f57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612ff457612fb681601f614c45565b612fc1906008614a75565b86612fcd836006614a40565b81518110612fdd57612fdd6148d4565b016020015160f81c901b9190911790600101612fa2565b50949350505050565b60605f82356020840135601461301886860160408801614874565b613025606088018861488f565b60405161307e969594939250602001948552602085019390935260e091821b6001600160e01b0319908116604086015260609190911b6bffffffffffffffffffffffff1916604485015291901b166058820152605c0190565b60405160208183030381529060405290505f5b61309e606085018561488f565b9050811015612c4357816130b5606086018661488f565b838181106130c5576130c56148d4565b90506020028101906130d791906148e8565b356130e5606087018761488f565b848181106130f5576130f56148d4565b905060200281019061310791906148e8565b613118906040810190602001614688565b613125606088018861488f565b85818110613135576131356148d4565b905060200281019061314791906148e8565b613155906040810190614c58565b604051602001613169959493929190614c9a565b60408051601f198184030181529190529150600101613091565b61318b6144a1565b5f8281525f80516020614f548339815191526020526040808220815160e0810190925280545f80516020614f1483398151915293929190829060ff1660058111156131d8576131d86146a1565b60058111156131e9576131e96146a1565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561325b5761325b6146a1565b146132795760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156132bd576132bd6146a1565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f6133698582612287565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f8082516027146133e457604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613433576133fb816001614c45565b613406906008614a75565b61ffff1685828151811061341c5761341c6148d4565b016020015160f81c901b91909117906001016133e7565b5061ffff8116156134575760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156134b25761346e816003614c45565b613479906008614a75565b63ffffffff168661348b836002614a40565b8151811061349b5761349b6148d4565b016020015160f81c901b919091179060010161345a565b5063ffffffff81166003146134da57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561352f576134f181601f614c45565b6134fc906008614a75565b87613508836006614a40565b81518110613518576135186148d4565b016020015160f81c901b91909117906001016134dd565b505f86602681518110613544576135446148d4565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614ef48339815191528161357d84610b81565b90505f6135898761203b565b9050613594876128b9565b6135b157604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156135c6576135c66146a1565b146135e45760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516135f59190614a8c565b905083600201600a9054906101000a90046001600160401b0316826040015161361e9190614cdf565b6001600160401b0316816001600160401b0316111561365057604051630c192e7760e41b815260040160405180910390fd5b5f8061365c8a84612287565b915091505f8a8360405160200161368a92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561371d5761371d6146a1565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e1461384c57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561389b57613863816001614c45565b61386e906008614a75565b61ffff16858281518110613884576138846148d4565b016020015160f81c901b919091179060010161384f565b5061ffff8116156138bf5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561391a576138d6816003614c45565b6138e1906008614a75565b63ffffffff16866138f3836002614a40565b81518110613903576139036148d4565b016020015160f81c901b91909117906001016138c2565b5063ffffffff811660051461394257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139975761395981601f614c45565b613964906008614a75565b87613970836006614a40565b81518110613980576139806148d4565b016020015160f81c901b9190911790600101613945565b505f805b60088110156139f6576139af816007614c45565b6139ba906008614a75565b6001600160401b0316886139cf836026614a40565b815181106139df576139df6148d4565b016020015160f81c901b919091179060010161399b565b5090969095509350505050565b5f80516020614f148339815191525f6001600160401b038084169085161115613a3757613a308385614778565b9050613a44565b613a418484614778565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613aa6575060018401548151613aa2916001600160401b031690614a40565b8210155b15613acc576001600160401b038316606082015281815260408101516020820152613aeb565b8281606001818151613ade9190614a8c565b6001600160401b03169052505b6060810151613afb906064614cdf565b602082015160018601546001600160401b039290921691613b269190600160401b900460ff16614a75565b1015613b455760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613b609190614a40565b9052506040810180516001600160401b0387169190613b80908390614c45565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020614f548339815191526020526040812060020180545f80516020614f148339815191529190600890613c1690600160401b90046001600160401b0316614d0a565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613c8a57604051631afcd79f60e31b815260040160405180910390fd5b565b613c94613c41565b613c9d8161417b565b613ca5614194565b611b8f60608201356080830135613cc260c0850160a08601614688565b613cd260e0860160c08701614d25565b613ce3610100870160e08801614d3e565b613cf561012088016101008901614874565b6141a4565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613d3e57604051637fab81e560e01b815260040160405180910390fd5b5f80516020614f1483398151915242613d5d6040860160208701614688565b6001600160401b0316111580613d975750613d7b6202a30042614a40565b613d8b6040860160208701614688565b6001600160401b031610155b15613db45760405162d36c8560e81b815260040160405180910390fd5b6030613dc36040860186614c58565b9050141580613dd157508335155b15613def5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613e1f57604051630eb0d31360e11b815260040160405180910390fd5b613e29835f613a03565b5f80613ec26040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613e6d9190614688565b6001600160401b03168152602001613e8860408a018a614c58565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506142c5565b5f82815260068601602052604090209193509150613ee08282614da2565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613f1e90859060040161480f565b6020604051808303815f875af1158015613f3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f5e91906147d6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613fd657613fd66146a1565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916140b6918e01908e01614688565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561410b5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614154576040519150601f19603f3d011682016040523d82523d5f602084013e614159565b606091505b505090508061200557604051630a12f52160e11b815260040160405180910390fd5b614183613c41565b61418b614388565b611b8f81614390565b61419c613c41565b613c8a614462565b6141ac613c41565b5f80516020614ef483398151915261ffff841615806141d0575061271061ffff8516115b156141ee5760405163c98d73a760e01b815260040160405180910390fd5b8587111561420f57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806142225750600a60ff8416115b15614240576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146142ee57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016143209796959493929190614e5d565b60405160208183030381529060405290506002816040516143419190614a2f565b602060405180830381855afa15801561435c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061437f91906147d6565b94909350915050565b613c8a613c41565b614398613c41565b80355f80516020614f1483398151915290815560146143bd6060840160408501614d3e565b60ff1611806143dc57506143d76060830160408401614d3e565b60ff16155b156143fa5760405163b4fa3fb360e01b815260040160405180910390fd5b61440a6060830160408401614d3e565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561443b6040830160208401614688565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612608613c41565b50805461447690614aac565b5f825580601f10614485575050565b601f0160209004905f5260205f2090810190611b8f91906144dd565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156144f1575f81556001016144de565b5090565b8015158114611b8f575f80fd5b803563ffffffff81168114612036575f80fd5b5f805f60608486031215614527575f80fd5b833592506020840135614539816144f5565b915061454760408501614502565b90509250925092565b5f60208284031215614560575f80fd5b5035919050565b5f6101208284031215614578575f80fd5b50919050565b803561ffff81168114612036575f80fd5b80356001600160401b0381168114612036575f80fd5b5f805f606084860312156145b7575f80fd5b83356001600160401b038111156145cc575f80fd5b8401606081870312156145dd575f80fd5b92506145eb6020850161457e565b91506145476040850161458f565b5f60208284031215614609575f80fd5b610bc482614502565b5f8060408385031215614623575f80fd5b61462c83614502565b946020939093013593505050565b5f806040838503121561464b575f80fd5b82356001600160401b03811115614660575f80fd5b830160808186031215614671575f80fd5b915061467f60208401614502565b90509250929050565b5f60208284031215614698575f80fd5b610bc48261458f565b634e487b7160e01b5f52602160045260245ffd5b815160e0820190600681106146d857634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b036040840151166040830152606083015161471360608401826001600160401b03169052565b50608083015161472e60808401826001600160401b03169052565b5060a083015161474960a08401826001600160401b03169052565b5060c0830151612c4360c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612c4357612c43614764565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f602082840312156147e6575f80fd5b5051919050565b5f5b838110156148075781810151838201526020016147ef565b50505f910152565b602081525f825180602084015261482d8160408501602087016147ed565b601f01601f19169190910160400192915050565b5f8261485b57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114611b8f575f80fd5b5f60208284031215614884575f80fd5b8135610bc481614860565b5f808335601e198436030181126148a4575f80fd5b8301803591506001600160401b038211156148bd575f80fd5b6020019150600581901b36038213156123d7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126148fc575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561493c5761493c614906565b60405290565b604051601f8201601f191681016001600160401b038111828210171561496a5761496a614906565b604052919050565b5f6001600160401b0382111561498a5761498a614906565b50601f01601f191660200190565b5f606082360312156149a8575f80fd5b6149b061491a565b8235815260206149c181850161458f565b8183015260408401356001600160401b038111156149dd575f80fd5b840136601f8201126149ed575f80fd5b8035614a006149fb82614972565b614942565b8181523684838501011115614a13575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516148fc8184602087016147ed565b80820180821115610b9157610b91614764565b5f63ffffffff808316818103614a6b57614a6b614764565b6001019392505050565b8082028115828204841417610b9157610b91614764565b6001600160401b03818116838216019080821115612c4357612c43614764565b600181811c90821680614ac057607f821691505b60208210810361457857634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614af081614aac565b806020870152604060018084165f8114614b115760018114614b2d57614b5a565b60ff19851660408a0152604084151560051b8a01019550614b5a565b895f5260205f205f5b85811015614b515781548b8201860152908301908801614b36565b8a016040019650505b509398975050505050505050565b8051612036816144f5565b5f8060408385031215614b84575f80fd5b82516001600160401b0380821115614b9a575f80fd5b9084019060608287031215614bad575f80fd5b614bb561491a565b82518152602080840151614bc881614860565b82820152604084015183811115614bdd575f80fd5b80850194505087601f850112614bf1575f80fd5b83519250614c016149fb84614972565b8381528882858701011115614c14575f80fd5b614c23848383018488016147ed565b80604084015250819550614c38818801614b68565b9450505050509250929050565b81810381811115610b9157610b91614764565b5f808335601e19843603018112614c6d575f80fd5b8301803591506001600160401b03821115614c86575f80fd5b6020019150368190038213156123d7575f80fd5b5f8651614cab818460208b016147ed565b820186815260c086901b6001600160c01b0319166020820152838560288301375f9301602801928352509095945050505050565b6001600160401b03818116838216028082169190828114614d0257614d02614764565b505092915050565b5f6001600160401b03808316818103614a6b57614a6b614764565b5f60208284031215614d35575f80fd5b610bc48261457e565b5f60208284031215614d4e575f80fd5b813560ff81168114610bc4575f80fd5b601f82111561200557805f5260205f20601f840160051c81016020851015614d835750805b601f840160051c820191505b81811015610c65575f8155600101614d8f565b81516001600160401b03811115614dbb57614dbb614906565b614dcf81614dc98454614aac565b84614d5e565b602080601f831160018114614e02575f8415614deb5750858301515b5f19600386901b1c1916600185901b178555612952565b5f85815260208120601f198616915b82811015614e3057888601518255948401946001909101908401614e11565b5085821015614e4d57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614eb281604e8601602089016147ed565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 a59f4e021..91a807bb4 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -72,7 +72,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\":\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"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\":\"UnexpectedRegistrationStatus\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161318538038061318583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6130388061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806397fb70d4116100a9578063d588c18f1161006e578063d588c18f14610290578063d5f20ff6146102a3578063df93d8de146102c3578063e7d14c1c146102cd578063f2fde38b1461030b575f80fd5b806397fb70d414610241578063a3a65e4814610254578063b771b3bc14610267578063bee0a03f14610275578063c974d1b614610288575f80fd5b8063715018a6116100ef578063715018a6146101b3578063732214f8146101bb5780638280a25a146101d05780638994ab49146101ea5780638da5cb5b146101fd575f80fd5b80630322ed981461012b578063467ef06f1461014057806360305d621461015357806361e2f4901461017557806366435abf14610188575b5f80fd5b61013e61013936600461270c565b61031e565b005b61013e61014e36600461273b565b610490565b61015b601481565b60405163ffffffff90911681526020015b60405180910390f35b61013e610183366004612754565b61049e565b61019b61019636600461270c565b610922565b6040516001600160401b03909116815260200161016c565b61013e610936565b6101c25f81565b60405190815260200161016c565b6101d8603081565b60405160ff909116815260200161016c565b6101c26101f83660046127ce565b610949565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161016c565b61013e61024f36600461270c565b610965565b61013e61026236600461273b565b61097a565b6102296005600160991b0181565b61013e61028336600461270c565b610aec565b6101d8601481565b61013e61029e366004612823565b610c11565b6102b66102b136600461270c565b610d1f565b60405161016c919061286d565b61019b6202a30081565b6101c26102db36600461270c565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61013e61031936600461291c565b610de7565b5f8181525f8051602061300c8339815191526020526040808220815160e0810190925280545f80516020612fec83398151915293929190829060ff16600581111561036b5761036b612859565b600581111561037c5761037c612859565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb612859565b146104095760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042e8584606001515f610e29565b6040518263ffffffff1660e01b815260040161044a9190612960565b6020604051808303815f875af1158015610466573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048a9190612992565b50505050565b61049981610e78565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020612fec8339815191529060ff16156104f057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610533573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105579190612992565b83602001351461057a5760405163d040949d60e01b815260040160405180910390fd5b3061058b606085016040860161291c565b6001600160a01b0316146105b25760405163e6c4247b60e01b815260040160405180910390fd5b5f6105c060608501856129a9565b905090505f805b828163ffffffff16101561086c575f6105e360608801886129a9565b8363ffffffff168181106105f9576105f96129ee565b905060200281019061060b9190612a02565b61061490612ab2565b80515f818152600888016020526040902054919250901561064857604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161067792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261069191612b49565b602060405180830381855afa1580156106ac573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906106cf9190612992565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561075b5761075b612859565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161080e911686612b6e565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061086590612b81565b90506105c7565b50600483018190555f61087e85611116565b90505f61088e8260400151611216565b90505f61089a8861138b565b9050816002826040516108ad9190612b49565b602060405180830381855afa1580156108c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108eb9190612992565b1461090957604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61092c82610d1f565b6080015192915050565b61093e611824565b6109475f61187f565b565b5f610952611824565b61095c83836118ef565b90505b92915050565b61096d611824565b61097681611cd9565b5050565b5f80516020612fec8339815191525f61099283611116565b90505f806109a38360400151611f16565b91509150806109c557604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546109df90612ba3565b90505f03610a0057604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115610a2657610a26612859565b14610a445760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120610a5c91612681565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020612fec8339815191529190610b3390612ba3565b90505f03610b5457604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115610b7a57610b7a612859565b14610b985760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bd19190600401612bd5565b6020604051808303815f875af1158015610bed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104999190612992565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610c555750825b90505f826001600160401b03166001148015610c705750303b155b905081158015610c7e575080155b15610c9c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cc657845460ff60401b1916600160401b1785555b610cd087876120ba565b8315610d1657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610d276126b8565b5f8281525f8051602061300c833981519152602052604090819020815160e0810190925280545f80516020612fec833981519152929190829060ff166005811115610d7457610d74612859565b6005811115610d8557610d85612859565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610def611824565b6001600160a01b038116610e1d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610e268161187f565b50565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f610e816126b8565b5f80516020612fec8339815191525f610e9985611116565b90505f80610eaa8360400151611f16565b915091508015610ecd57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610efe57610efe612859565b6005811115610f0f57610f0f612859565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610f7e57610f7e612859565b14158015610f9f5750600181516005811115610f9c57610f9c612859565b14155b15610fbd5760405163a36c527f60e01b815260040160405180910390fd5b600381516005811115610fd257610fd2612859565b03610fe05760048152610fe5565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561102a5761102a612859565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156110de576110de612859565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561117a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111a19190810190612c6e565b91509150806111c357604051636b2f19e960e01b815260040160405180910390fd5b8151156111e35760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561120f5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f815160261461123957604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561128857611250816001612d40565b61125b906008612d53565b61ffff16848281518110611271576112716129ee565b016020015160f81c901b919091179060010161123c565b5061ffff8116156112ac5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015611307576112c3816003612d40565b6112ce906008612d53565b63ffffffff16856112e0836002612b6e565b815181106112f0576112f06129ee565b016020015160f81c901b91909117906001016112af565b5063ffffffff81161561132d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156113825761134481601f612d40565b61134f906008612d53565b8661135b836006612b6e565b8151811061136b5761136b6129ee565b016020015160f81c901b9190911790600101611330565b50949350505050565b60605f61139a838301846129a9565b6113a691506058612d53565b6113b190605c612b6e565b6001600160401b038111156113c8576113c8612a20565b6040519080825280601f01601f1916602001820160405280156113f2576020820181803683370190505b5090505f5b60208110156114475783358160208110611413576114136129ee565b1a60f81b828281518110611429576114296129ee565b60200101906001600160f81b03191690815f1a9053506001016113f7565b505f5b60208110156114a75783602001358160208110611469576114696129ee565b1a60f81b82611479836020612b6e565b81518110611489576114896129ee565b60200101906001600160f81b03191690815f1a90535060010161144a565b505f5b600481101561150a576114be816003612d40565b6114c9906008612d53565b6014901c60f81b826114dc836040612b6e565b815181106114ec576114ec6129ee565b60200101906001600160f81b03191690815f1a9053506001016114aa565b505f61151c606085016040860161291c565b60601b90505f5b601481101561157c5781816014811061153e5761153e6129ee565b1a60f81b8361154e836044612b6e565b8151811061155e5761155e6129ee565b60200101906001600160f81b03191690815f1a905350600101611523565b505f61158b60608601866129a9565b905090505f5b60048110156115f6576115a5816003612d40565b6115b0906008612d53565b63ffffffff8316901c60f81b846115c8836058612b6e565b815181106115d8576115d86129ee565b60200101906001600160f81b03191690815f1a905350600101611591565b505f5b61160660608701876129a9565b905081101561181a575f61161b826058612d53565b61162690605c612b6e565b90505f5b60208110156116b15761164060608901896129a9565b84818110611650576116506129ee565b90506020028101906116629190612a02565b358160208110611674576116746129ee565b1a60f81b866116838385612b6e565b81518110611693576116936129ee565b60200101906001600160f81b03191690815f1a90535060010161162a565b505f5b6008811015611766576116c8816007612d40565b6116d3906008612d53565b6116e060608a018a6129a9565b858181106116f0576116f06129ee565b90506020028101906117029190612a02565b611713906040810190602001612d6a565b6001600160401b0316901c60f81b868261172e856020612b6e565b6117389190612b6e565b81518110611748576117486129ee565b60200101906001600160f81b03191690815f1a9053506001016116b4565b505f5b60308110156118105761177f60608901896129a9565b8481811061178f5761178f6129ee565b90506020028101906117a19190612a02565b6117af906040810190612d83565b828181106117bf576117bf6129ee565b9050013560f81c60f81b86828460286117d89190612b6e565b6117e29190612b6e565b815181106117f2576117f26129ee565b60200101906001600160f81b03191690815f1a905350600101611769565b50506001016115f9565b5091949350505050565b336118567f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109475760405163118cdaa760e01b8152336004820152602401610e14565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661193357604051637fab81e560e01b815260040160405180910390fd5b5f80516020612fec833981519152426119526040860160208701612d6a565b6001600160401b031611158061198c57506119706202a30042612b6e565b6119806040860160208701612d6a565b6001600160401b031610155b156119a95760405162d36c8560e81b815260040160405180910390fd5b60306119b86040860186612d83565b90501415806119c657508335155b156119e45760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415611a1457604051630eb0d31360e11b815260040160405180910390fd5b611a1e835f6120d4565b5f80611ab76040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190611a629190612d6a565b6001600160401b03168152602001611a7d60408a018a612d83565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061229d565b5f82815260068601602052604090209193509150611ad58282612e10565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90611b13908590600401612960565b6020604051808303815f875af1158015611b2f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b539190612992565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115611bcb57611bcb612859565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611cab918e01908e01612d6a565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611ce16126b8565b5f8281525f8051602061300c8339815191526020526040808220815160e0810190925280545f80516020612fec83398151915293929190829060ff166005811115611d2e57611d2e612859565b6005811115611d3f57611d3f612859565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611db157611db1612859565b14611dcf5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611e1357611e13612859565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611ebf8582612360565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714611f3a57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015611f8957611f51816001612d40565b611f5c906008612d53565b61ffff16858281518110611f7257611f726129ee565b016020015160f81c901b9190911790600101611f3d565b5061ffff811615611fad5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561200857611fc4816003612d40565b611fcf906008612d53565b63ffffffff1686611fe1836002612b6e565b81518110611ff157611ff16129ee565b016020015160f81c901b9190911790600101611fb0565b5063ffffffff811660031461203057604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156120855761204781601f612d40565b612052906008612d53565b8761205e836006612b6e565b8151811061206e5761206e6129ee565b016020015160f81c901b9190911790600101612033565b505f8660268151811061209a5761209a6129ee565b016020015191976001600160f81b03199092161515965090945050505050565b6120c26124b7565b6120cb82612500565b61097681612519565b5f80516020612fec8339815191525f6001600160401b038084169085161115612108576121018385612ecf565b9050612115565b6121128484612ecf565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580612177575060018401548151612173916001600160401b031690612b6e565b8210155b1561219d576001600160401b0383166060820152818152604081015160208201526121bc565b82816060018181516121af9190612eef565b6001600160401b03169052505b60608101516121cc906064612f0f565b602082015160018601546001600160401b0392909216916121f79190600160401b900460ff16612d53565b10156122165760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516122319190612b6e565b9052506040810180516001600160401b0387169190612251908390612d40565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146122c657604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016122f89796959493929190612f3a565b60405160208183030381529060405290506002816040516123199190612b49565b602060405180830381855afa158015612334573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906123579190612992565b94909350915050565b5f8281525f8051602061300c833981519152602052604081206002015481905f80516020612fec83398151915290600160801b90046001600160401b03166123a885826120d4565b5f6123b28761252a565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124028a858b610e29565b6040518263ffffffff1660e01b815260040161241e9190612960565b6020604051808303815f875af115801561243a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061245e9190612992565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661094757604051631afcd79f60e31b815260040160405180910390fd5b6125086124b7565b61251061259f565b610e26816125a7565b6125216124b7565b610e2681612679565b5f8181525f8051602061300c8339815191526020526040812060020180545f80516020612fec833981519152919060089061257490600160401b90046001600160401b0316612fb0565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6109476124b7565b6125af6124b7565b80355f80516020612fec83398151915290815560146125d46060840160408501612fcb565b60ff1611806125f357506125ee6060830160408401612fcb565b60ff16155b156126115760405163b4fa3fb360e01b815260040160405180910390fd5b6126216060830160408401612fcb565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556126526040830160208401612d6a565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610def6124b7565b50805461268d90612ba3565b5f825580601f1061269c575050565b601f0160209004905f5260205f2090810190610e2691906126f4565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115612708575f81556001016126f5565b5090565b5f6020828403121561271c575f80fd5b5035919050565b803563ffffffff81168114612736575f80fd5b919050565b5f6020828403121561274b575f80fd5b61095c82612723565b5f8060408385031215612765575f80fd5b82356001600160401b0381111561277a575f80fd5b83016080818603121561278b575f80fd5b915061279960208401612723565b90509250929050565b5f606082840312156127b2575f80fd5b50919050565b80356001600160401b0381168114612736575f80fd5b5f80604083850312156127df575f80fd5b82356001600160401b038111156127f4575f80fd5b612800858286016127a2565b925050612799602084016127b8565b6001600160a01b0381168114610e26575f80fd5b5f8060808385031215612834575f80fd5b61283e84846127a2565b9150606083013561284e8161280f565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061289057634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516128cb60608401826001600160401b03169052565b5060808301516128e660808401826001600160401b03169052565b5060a083015161290160a08401826001600160401b03169052565b5060c083015161120f60c08401826001600160401b03169052565b5f6020828403121561292c575f80fd5b81356129378161280f565b9392505050565b5f5b83811015612958578181015183820152602001612940565b50505f910152565b602081525f825180602084015261297e81604085016020870161293e565b601f01601f19169190910160400192915050565b5f602082840312156129a2575f80fd5b5051919050565b5f808335601e198436030181126129be575f80fd5b8301803591506001600160401b038211156129d7575f80fd5b6020019150600581901b36038213156124b0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612a16575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612a5657612a56612a20565b60405290565b604051601f8201601f191681016001600160401b0381118282101715612a8457612a84612a20565b604052919050565b5f6001600160401b03821115612aa457612aa4612a20565b50601f01601f191660200190565b5f60608236031215612ac2575f80fd5b612aca612a34565b823581526020612adb8185016127b8565b8183015260408401356001600160401b03811115612af7575f80fd5b840136601f820112612b07575f80fd5b8035612b1a612b1582612a8c565b612a5c565b8181523684838501011115612b2d575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251612a1681846020870161293e565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561095f5761095f612b5a565b5f63ffffffff808316818103612b9957612b99612b5a565b6001019392505050565b600181811c90821680612bb757607f821691505b6020821081036127b257634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454612be781612ba3565b806020870152604060018084165f8114612c085760018114612c2457612c51565b60ff19851660408a0152604084151560051b8a01019550612c51565b895f5260205f205f5b85811015612c485781548b8201860152908301908801612c2d565b8a016040019650505b509398975050505050505050565b80518015158114612736575f80fd5b5f8060408385031215612c7f575f80fd5b82516001600160401b0380821115612c95575f80fd5b9084019060608287031215612ca8575f80fd5b612cb0612a34565b82518152602080840151612cc38161280f565b82820152604084015183811115612cd8575f80fd5b80850194505087601f850112612cec575f80fd5b83519250612cfc612b1584612a8c565b8381528882858701011115612d0f575f80fd5b612d1e8483830184880161293e565b80604084015250819550612d33818801612c5f565b9450505050509250929050565b8181038181111561095f5761095f612b5a565b808202811582820484141761095f5761095f612b5a565b5f60208284031215612d7a575f80fd5b61095c826127b8565b5f808335601e19843603018112612d98575f80fd5b8301803591506001600160401b03821115612db1575f80fd5b6020019150368190038213156124b0575f80fd5b601f82111561049957805f5260205f20601f840160051c81016020851015612dea5750805b601f840160051c820191505b81811015612e09575f8155600101612df6565b5050505050565b81516001600160401b03811115612e2957612e29612a20565b612e3d81612e378454612ba3565b84612dc5565b602080601f831160018114612e70575f8415612e595750858301515b5f19600386901b1c1916600185901b178555612ec7565b5f85815260208120601f198616915b82811015612e9e57888601518255948401946001909101908401612e7f565b5085821015612ebb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0382811682821603908082111561120f5761120f612b5a565b6001600160401b0381811683821601908082111561120f5761120f612b5a565b6001600160401b03818116838216028082169190828114612f3257612f32612b5a565b505092915050565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451612f8f81604e86016020890161293e565b60c09490941b1691909201604e810191909152605601979650505050505050565b5f6001600160401b03808316818103612b9957612b99612b5a565b5f60208284031215612fdb575f80fd5b813560ff81168114612937575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051612eb7380380612eb783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612d6a8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610127575f3560e01c806397fb70d4116100a9578063d588c18f1161006e578063d588c18f14610290578063d5f20ff6146102a3578063df93d8de146102c3578063e7d14c1c146102cd578063f2fde38b1461030b575f80fd5b806397fb70d414610241578063a3a65e4814610254578063b771b3bc14610267578063bee0a03f14610275578063c974d1b614610288575f80fd5b8063715018a6116100ef578063715018a6146101b3578063732214f8146101bb5780638280a25a146101d05780638994ab49146101ea5780638da5cb5b146101fd575f80fd5b80630322ed981461012b578063467ef06f1461014057806360305d621461015357806361e2f4901461017557806366435abf14610188575b5f80fd5b61013e6101393660046123f9565b61031e565b005b61013e61014e366004612428565b610490565b61015b601481565b60405163ffffffff90911681526020015b60405180910390f35b61013e610183366004612441565b61049e565b61019b6101963660046123f9565b610922565b6040516001600160401b03909116815260200161016c565b61013e610936565b6101c25f81565b60405190815260200161016c565b6101d8603081565b60405160ff909116815260200161016c565b6101c26101f83660046124bb565b610949565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161016c565b61013e61024f3660046123f9565b610965565b61013e610262366004612428565b61097a565b6102296005600160991b0181565b61013e6102833660046123f9565b610aec565b6101d8601481565b61013e61029e366004612510565b610c11565b6102b66102b13660046123f9565b610d1f565b60405161016c919061255a565b61019b6202a30081565b6101c26102db3660046123f9565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61013e610319366004612609565b610de7565b5f8181525f80516020612d3e8339815191526020526040808220815160e0810190925280545f80516020612d1e83398151915293929190829060ff16600581111561036b5761036b612546565b600581111561037c5761037c612546565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156103eb576103eb612546565b146104095760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61042e8584606001515f610e29565b6040518263ffffffff1660e01b815260040161044a919061264d565b6020604051808303815f875af1158015610466573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061048a919061267f565b50505050565b61049981610e78565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020612d1e8339815191529060ff16156104f057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610533573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610557919061267f565b83602001351461057a5760405163d040949d60e01b815260040160405180910390fd5b3061058b6060850160408601612609565b6001600160a01b0316146105b25760405163e6c4247b60e01b815260040160405180910390fd5b5f6105c06060850185612696565b905090505f805b828163ffffffff16101561086c575f6105e36060880188612696565b8363ffffffff168181106105f9576105f96126db565b905060200281019061060b91906126ef565b6106149061279f565b80515f818152600888016020526040902054919250901561064857604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161067792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261069191612836565b602060405180830381855afa1580156106ac573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906106cf919061267f565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561075b5761075b612546565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161080e91168661285b565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806108659061286e565b90506105c7565b50600483018190555f61087e85611116565b90505f61088e8260400151611216565b90505f61089a8861138b565b9050816002826040516108ad9190612836565b602060405180830381855afa1580156108c8573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906108eb919061267f565b1461090957604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909201805460ff1916600117905550505050565b5f61092c82610d1f565b6080015192915050565b61093e611511565b6109475f61156c565b565b5f610952611511565b61095c83836115dc565b90505b92915050565b61096d611511565b610976816119c6565b5050565b5f80516020612d1e8339815191525f61099283611116565b90505f806109a38360400151611c03565b91509150806109c557604051633dbcaef760e01b815260040160405180910390fd5b5f828152600685016020526040902080546109df90612890565b90505f03610a0057604051636990657d60e01b815260040160405180910390fd5b60015f83815260078601602052604090205460ff166005811115610a2657610a26612546565b14610a445760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006850160205260408120610a5c9161236e565b5f828152600785016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a25050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020612d1e8339815191529190610b3390612890565b90505f03610b5457604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115610b7a57610b7a612546565b14610b985760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610bd191906004016128c2565b6020604051808303815f875af1158015610bed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610499919061267f565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610c555750825b90505f826001600160401b03166001148015610c705750303b155b905081158015610c7e575080155b15610c9c5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610cc657845460ff60401b1916600160401b1785555b610cd08787611da7565b8315610d1657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610d276123a5565b5f8281525f80516020612d3e833981519152602052604090819020815160e0810190925280545f80516020612d1e833981519152929190829060ff166005811115610d7457610d74612546565b6005811115610d8557610d85612546565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610def611511565b6001600160a01b038116610e1d57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b610e268161156c565b50565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f610e816123a5565b5f80516020612d1e8339815191525f610e9985611116565b90505f80610eaa8360400151611c03565b915091508015610ecd57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600785016020526040808220815160e081019092528054829060ff166005811115610efe57610efe612546565b6005811115610f0f57610f0f612546565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610f7e57610f7e612546565b14158015610f9f5750600181516005811115610f9c57610f9c612546565b14155b15610fbd5760405163a36c527f60e01b815260040160405180910390fd5b600381516005811115610fd257610fd2612546565b03610fe05760048152610fe5565b600581525b6020808201515f908152600887018252604080822082905585825260078801909252208151815483929190829060ff1916600183600581111561102a5761102a612546565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156110de576110de612546565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a3919791965090945050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561117a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111a1919081019061295b565b91509150806111c357604051636b2f19e960e01b815260040160405180910390fd5b8151156111e35760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b03161561120f5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f815160261461123957604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561128857611250816001612a2d565b61125b906008612a40565b61ffff16848281518110611271576112716126db565b016020015160f81c901b919091179060010161123c565b5061ffff8116156112ac5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015611307576112c3816003612a2d565b6112ce906008612a40565b63ffffffff16856112e083600261285b565b815181106112f0576112f06126db565b016020015160f81c901b91909117906001016112af565b5063ffffffff81161561132d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156113825761134481601f612a2d565b61134f906008612a40565b8661135b83600661285b565b8151811061136b5761136b6126db565b016020015160f81c901b9190911790600101611330565b50949350505050565b60605f8235602084013560146113a686860160408801612609565b6113b36060880188612696565b60405161140c969594939250602001948552602085019390935260e091821b6001600160e01b0319908116604086015260609190911b6bffffffffffffffffffffffff1916604485015291901b166058820152605c0190565b60405160208183030381529060405290505f5b61142c6060850185612696565b905081101561120f57816114436060860186612696565b83818110611453576114536126db565b905060200281019061146591906126ef565b356114736060870187612696565b84818110611483576114836126db565b905060200281019061149591906126ef565b6114a6906040810190602001612a57565b6114b36060880188612696565b858181106114c3576114c36126db565b90506020028101906114d591906126ef565b6114e3906040810190612a70565b6040516020016114f7959493929190612ab2565b60408051601f19818403018152919052915060010161141f565b336115437f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109475760405163118cdaa760e01b8152336004820152602401610e14565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661162057604051637fab81e560e01b815260040160405180910390fd5b5f80516020612d1e8339815191524261163f6040860160208701612a57565b6001600160401b0316111580611679575061165d6202a3004261285b565b61166d6040860160208701612a57565b6001600160401b031610155b156116965760405162d36c8560e81b815260040160405180910390fd5b60306116a56040860186612a70565b90501415806116b357508335155b156116d15760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561170157604051630eb0d31360e11b815260040160405180910390fd5b61170b835f611dc1565b5f806117a46040518060a00160405280855f01548152602001885f01358152602001876001600160401b0316815260200188602001602081019061174f9190612a57565b6001600160401b0316815260200161176a60408a018a612a70565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250611f8a565b5f828152600686016020526040902091935091506117c28282612b42565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb9061180090859060040161264d565b6020604051808303815f875af115801561181c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611840919061267f565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156118b8576118b8612546565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611998918e01908e01612a57565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b6119ce6123a5565b5f8281525f80516020612d3e8339815191526020526040808220815160e0810190925280545f80516020612d1e83398151915293929190829060ff166005811115611a1b57611a1b612546565b6005811115611a2c57611a2c612546565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611a9e57611a9e612546565b14611abc5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611b0057611b00612546565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611bac858261204d565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714611c2757604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015611c7657611c3e816001612a2d565b611c49906008612a40565b61ffff16858281518110611c5f57611c5f6126db565b016020015160f81c901b9190911790600101611c2a565b5061ffff811615611c9a5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015611cf557611cb1816003612a2d565b611cbc906008612a40565b63ffffffff1686611cce83600261285b565b81518110611cde57611cde6126db565b016020015160f81c901b9190911790600101611c9d565b5063ffffffff8116600314611d1d57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015611d7257611d3481601f612a2d565b611d3f906008612a40565b87611d4b83600661285b565b81518110611d5b57611d5b6126db565b016020015160f81c901b9190911790600101611d20565b505f86602681518110611d8757611d876126db565b016020015191976001600160f81b03199092161515965090945050505050565b611daf6121a4565b611db8826121ed565b61097681612206565b5f80516020612d1e8339815191525f6001600160401b038084169085161115611df557611dee8385612c01565b9050611e02565b611dff8484612c01565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580611e64575060018401548151611e60916001600160401b03169061285b565b8210155b15611e8a576001600160401b038316606082015281815260408101516020820152611ea9565b8281606001818151611e9c9190612c21565b6001600160401b03169052505b6060810151611eb9906064612c41565b602082015160018601546001600160401b039290921691611ee49190600160401b900460ff16612a40565b1015611f035760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151611f1e919061285b565b9052506040810180516001600160401b0387169190611f3e908390612a2d565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f6060826080015151603014611fb357604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001611fe59796959493929190612c6c565b60405160208183030381529060405290506002816040516120069190612836565b602060405180830381855afa158015612021573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190612044919061267f565b94909350915050565b5f8281525f80516020612d3e833981519152602052604081206002015481905f80516020612d1e83398151915290600160801b90046001600160401b03166120958582611dc1565b5f61209f87612217565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6120ef8a858b610e29565b6040518263ffffffff1660e01b815260040161210b919061264d565b6020604051808303815f875af1158015612127573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061214b919061267f565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661094757604051631afcd79f60e31b815260040160405180910390fd5b6121f56121a4565b6121fd61228c565b610e2681612294565b61220e6121a4565b610e2681612366565b5f8181525f80516020612d3e8339815191526020526040812060020180545f80516020612d1e833981519152919060089061226190600160401b90046001600160401b0316612ce2565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6109476121a4565b61229c6121a4565b80355f80516020612d1e83398151915290815560146122c16060840160408501612cfd565b60ff1611806122e057506122db6060830160408401612cfd565b60ff16155b156122fe5760405163b4fa3fb360e01b815260040160405180910390fd5b61230e6060830160408401612cfd565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561233f6040830160208401612a57565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610def6121a4565b50805461237a90612890565b5f825580601f10612389575050565b601f0160209004905f5260205f2090810190610e2691906123e1565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156123f5575f81556001016123e2565b5090565b5f60208284031215612409575f80fd5b5035919050565b803563ffffffff81168114612423575f80fd5b919050565b5f60208284031215612438575f80fd5b61095c82612410565b5f8060408385031215612452575f80fd5b82356001600160401b03811115612467575f80fd5b830160808186031215612478575f80fd5b915061248660208401612410565b90509250929050565b5f6060828403121561249f575f80fd5b50919050565b80356001600160401b0381168114612423575f80fd5b5f80604083850312156124cc575f80fd5b82356001600160401b038111156124e1575f80fd5b6124ed8582860161248f565b925050612486602084016124a5565b6001600160a01b0381168114610e26575f80fd5b5f8060808385031215612521575f80fd5b61252b848461248f565b9150606083013561253b816124fc565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b815160e08201906006811061257d57634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b03604084015116604083015260608301516125b860608401826001600160401b03169052565b5060808301516125d360808401826001600160401b03169052565b5060a08301516125ee60a08401826001600160401b03169052565b5060c083015161120f60c08401826001600160401b03169052565b5f60208284031215612619575f80fd5b8135612624816124fc565b9392505050565b5f5b8381101561264557818101518382015260200161262d565b50505f910152565b602081525f825180602084015261266b81604085016020870161262b565b601f01601f19169190910160400192915050565b5f6020828403121561268f575f80fd5b5051919050565b5f808335601e198436030181126126ab575f80fd5b8301803591506001600160401b038211156126c4575f80fd5b6020019150600581901b360382131561219d575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612703575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156127435761274361270d565b60405290565b604051601f8201601f191681016001600160401b03811182821017156127715761277161270d565b604052919050565b5f6001600160401b038211156127915761279161270d565b50601f01601f191660200190565b5f606082360312156127af575f80fd5b6127b7612721565b8235815260206127c88185016124a5565b8183015260408401356001600160401b038111156127e4575f80fd5b840136601f8201126127f4575f80fd5b803561280761280282612779565b612749565b818152368483850101111561281a575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f825161270381846020870161262b565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561095f5761095f612847565b5f63ffffffff80831681810361288657612886612847565b6001019392505050565b600181811c908216806128a457607f821691505b60208210810361249f57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f84546128d481612890565b806020870152604060018084165f81146128f557600181146129115761293e565b60ff19851660408a0152604084151560051b8a0101955061293e565b895f5260205f205f5b858110156129355781548b820186015290830190880161291a565b8a016040019650505b509398975050505050505050565b80518015158114612423575f80fd5b5f806040838503121561296c575f80fd5b82516001600160401b0380821115612982575f80fd5b9084019060608287031215612995575f80fd5b61299d612721565b825181526020808401516129b0816124fc565b828201526040840151838111156129c5575f80fd5b80850194505087601f8501126129d9575f80fd5b835192506129e961280284612779565b83815288828587010111156129fc575f80fd5b612a0b8483830184880161262b565b80604084015250819550612a2081880161294c565b9450505050509250929050565b8181038181111561095f5761095f612847565b808202811582820484141761095f5761095f612847565b5f60208284031215612a67575f80fd5b61095c826124a5565b5f808335601e19843603018112612a85575f80fd5b8301803591506001600160401b03821115612a9e575f80fd5b60200191503681900382131561219d575f80fd5b5f8651612ac3818460208b0161262b565b820186815260c086901b6001600160c01b0319166020820152838560288301375f9301602801928352509095945050505050565b601f82111561049957805f5260205f20601f840160051c81016020851015612b1c5750805b601f840160051c820191505b81811015612b3b575f8155600101612b28565b5050505050565b81516001600160401b03811115612b5b57612b5b61270d565b612b6f81612b698454612890565b84612af7565b602080601f831160018114612ba2575f8415612b8b5750858301515b5f19600386901b1c1916600185901b178555612bf9565b5f85815260208120601f198616915b82811015612bd057888601518255948401946001909101908401612bb1565b5085821015612bed57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b0382811682821603908082111561120f5761120f612847565b6001600160401b0381811683821601908082111561120f5761120f612847565b6001600160401b03818116838216028082169190828114612c6457612c64612847565b505092915050565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451612cc181604e86016020890161262b565b60c09490941b1691909201604e810191909152605601979650505050505050565b5f6001600160401b0380831681810361288657612886612847565b5f60208284031215612d0d575f80fd5b813560ff81168114612624575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index a59981932..adc7a64cd 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -146,48 +146,20 @@ library ValidatorMessages { pure returns (bytes memory) { - // The formula for the length in the comment above is VM agnostic, but in EVM - // the address length is always 20 bytes so the constant term is 72 + 20 = 92. - bytes memory res = new bytes(92 + subnetConversionData.initialValidators.length * 88); - // Pack the convertSubnetTx ID - for (uint256 i; i < 32; ++i) { - res[i] = subnetConversionData.convertSubnetTxID[i]; - } - // Pack the validatorManagerBlockchainID - for (uint256 i; i < 32; ++i) { - res[i + 32] = subnetConversionData.validatorManagerBlockchainID[i]; - } - // Pack the ADDRESS_LENGTH - for (uint256 i; i < 4; ++i) { - res[i + 64] = bytes1(uint8(20 >> (8 * (3 - i)))); - } - // Pack the address - bytes20 addrBytes = bytes20(subnetConversionData.validatorManagerAddress); - for (uint256 i = 0; i < 20; ++i) { - res[i + 68] = addrBytes[i]; - } - - // Pack the initial validators length - uint32 ivLength = uint32(subnetConversionData.initialValidators.length); - for (uint256 i; i < 4; ++i) { - res[i + 88] = bytes1(uint8(ivLength >> (8 * (3 - i)))); - } - + bytes memory res = abi.encodePacked( + subnetConversionData.convertSubnetTxID, + subnetConversionData.validatorManagerBlockchainID, + uint32(20), + subnetConversionData.validatorManagerAddress, + uint32(subnetConversionData.initialValidators.length) + ); for (uint256 i = 0; i < subnetConversionData.initialValidators.length; i++) { - uint256 offset = 92 + i * 88; - // Pack the nodeID - for (uint256 j; j < 32; ++j) { - res[offset + j] = subnetConversionData.initialValidators[i].nodeID[j]; - } - // Pack the weight - for (uint256 j; j < 8; ++j) { - res[offset + 32 + j] = - bytes1(uint8(subnetConversionData.initialValidators[i].weight >> (8 * (7 - j)))); - } - // Pack the blsPublicKey - for (uint256 j; j < 48; ++j) { - res[offset + 40 + j] = subnetConversionData.initialValidators[i].blsPublicKey[j]; - } + res = abi.encodePacked( + res, + subnetConversionData.initialValidators[i].nodeID, + subnetConversionData.initialValidators[i].weight, + subnetConversionData.initialValidators[i].blsPublicKey + ); } return res; } From 6492e9d794ff2e41e0ae58c113647c0547e0b70a Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Fri, 27 Sep 2024 12:11:38 -0400 Subject: [PATCH 434/545] Add comment line --- contracts/validator-manager/ValidatorMessages.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index adc7a64cd..213470d66 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -146,6 +146,7 @@ library ValidatorMessages { pure returns (bytes memory) { + // Hardcoded 20 is for length of the managerAddress bytes memory res = abi.encodePacked( subnetConversionData.convertSubnetTxID, subnetConversionData.validatorManagerBlockchainID, From c4a34bce5696bcf4a28908ca83c216451430b554 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 27 Sep 2024 11:45:09 -0500 Subject: [PATCH 435/545] forceInitEndDelegation --- .../ERC20TokenStakingManager.go | 25 ++++- .../NativeTokenStakingManager.go | 25 ++++- .../validator-manager/PoSValidatorManager.sol | 26 ++++- .../interfaces/IPoSValidatorManager.sol | 29 ++++- .../tests/PoSValidatorManagerTests.t.sol | 105 +++++++++++++++--- tests/utils/validator_manager.go | 4 +- 6 files changed, 186 insertions(+), 28 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 2ec9deca5..f3f65d761 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -82,8 +82,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\":\"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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161587b38038061587b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61572e8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101d1575f3560e01c80638280a25a116100fe578063ba3a4b971161009e578063df93d8de1161006e578063df93d8de14610408578063e7d14c1c14610412578063eb0acb8914610450578063f09969ae14610463575f80fd5b8063ba3a4b97146103ba578063bee0a03f146103cd578063c974d1b6146103e0578063d5f20ff6146103e8575f80fd5b80639dde029a116100d95780639dde029a1461035b5780639e1bc4ef1461036e578063a3a65e4814610381578063b771b3bc14610394575f80fd5b80638280a25a1461032d57806393e245981461033557806398f3e2b414610348575f80fd5b8063467ef06f11610174578063620658561161014457806362065856146102df57806366435abf14610300578063732214f81461031357806376f786211461031a575f80fd5b8063467ef06f146102895780635297fae61461029c57806360305d62146102af57806361e2f490146102cc575f80fd5b806325e1c776116101af57806325e1c7761461021c5780632e2194d81461022f57806335455ded1461025a5780633a1cfff614610276575f80fd5b80630118acc4146101d55780630322ed98146101ea578063151d30d1146101fd575b5f80fd5b6101e86101e3366004614c4a565b610476565b005b6101e86101f8366004614c85565b610820565b610205600a81565b60405160ff90911681526020015b60405180910390f35b6101e861022a366004614c9c565b610992565b61024261023d366004614c85565b610a02565b6040516001600160401b039091168152602001610213565b61026361271081565b60405161ffff9091168152602001610213565b6101e8610284366004614c4a565b610a18565b6101e8610297366004614cc6565b610a23565b6101e86102aa366004614cdf565b610ac4565b6102b7601481565b60405163ffffffff9091168152602001610213565b6101e86102da366004614d07565b610e97565b6102f26102ed366004614d62565b611316565b604051908152602001610213565b61024261030e366004614c85565b61132f565b6102f25f81565b6101e8610328366004614c4a565b611343565b610205603081565b6101e8610343366004614c85565b61136b565b6101e8610356366004614cdf565b611422565b6101e8610369366004614c85565b6115b4565b6102f261037c366004614d7b565b61182c565b6101e861038f366004614cc6565b611858565b6103a26005600160991b0181565b6040516001600160a01b039091168152602001610213565b6101e86103c8366004614c85565b6119c5565b6101e86103db366004614c85565b611ba1565b610205601481565b6103fb6103f6366004614c85565b611cc6565b6040516102139190614daf565b6102426202a30081565b6102f2610420366004614c85565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6102f261045e366004614e6f565b611d8e565b6101e8610471366004614ee8565b611dc3565b5f8381525f805160206156628339815191526020526040808220815160e0810190925280545f805160206156a283398151915293929190829060ff1660038111156104c3576104c3614d9b565b60038111156104d4576104d4614d9b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61054a82611cc6565b905060028351600381111561056157610561614d9b565b1461057f5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146105ac5760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f806002835160058111156105ca576105ca614d9b565b0361061b5787156105e2576105df8488611ea2565b91505b5f856060015184608001516105f79190614f3a565b90506106038582612103565b506001600160401b031660c087015250429050610650565b50505f82815260048501602052604090206001015460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b59061067590611316565b8560a00151886080015185875f806040518863ffffffff1660e01b81526004016106a59796959493929190614f5a565b602060405180830381865afa1580156106c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e49190614f98565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561072357610723614d9b565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061080d9085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206157028339815191526020526040808220815160e0810190925280545f805160206156c283398151915293929190829060ff16600581111561086d5761086d614d9b565b600581111561087e5761087e614d9b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156108ed576108ed614d9b565b1461090b5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6109308584606001515f61225a565b6040518263ffffffff1660e01b815260040161094c9190614fd1565b6020604051808303815f875af1158015610968573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061098c9190614f98565b50505050565b61099b826122b1565b6109b857604051636ca57bcf60e01b815260040160405180910390fd5b60026109c383611cc6565b5160058111156109d5576109d5614d9b565b146109f35760405163a36c527f60e01b815260040160405180910390fd5b6109fd8282611ea2565b505050565b5f610a1264e8d4a5100083615003565b92915050565b61098c8383836122ec565b5f805160206156a28339815191525f80610a3c846124c0565b91509150610a49826122b1565b610a535750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610a8257610a82614d9b565b03610aa7575f83815260078501602052604081208054919055610aa58282612750565b505b610abd81610ab88460400151611316565b6127c6565b5050505050565b5f8181525f805160206156628339815191526020526040808220815160e0810190925280545f805160206156a283398151915293929190829060ff166003811115610b1157610b11614d9b565b6003811115610b2257610b22614d9b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610b9990611cc6565b905060015f85815260058501602052604090205460ff166003811115610bc157610bc1614d9b565b14610bdf5760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610bf457610bf4614d9b565b03610d3d57600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610c4e57610c4e614d9b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610d5257610d52614d9b565b03610d6057610abd846127e9565b5f80610d77610d6e886129c6565b60400151612ac6565b509150915081846040015114610da057604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610de857505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b15610e0657604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206156c28339815191529060ff1615610ee957604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f2c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f509190614f98565b836020013514610f735760405163d040949d60e01b815260040160405180910390fd5b30610f846060850160408601615022565b6001600160a01b031614610fab5760405163e6c4247b60e01b815260040160405180910390fd5b5f610fb9606085018561503d565b905090505f805b828163ffffffff161015611265575f610fdc606088018861503d565b8363ffffffff16818110610ff257610ff2615082565b90506020028101906110049190615096565b61100d90615146565b80515f818152600888016020526040902054919250901561104157604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f01358560405160200161107092919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261108a916151dd565b602060405180830381855afa1580156110a5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906110c89190614f98565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561115457611154614d9b565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558401516112079116866151ee565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061125e90615201565b9050610fc0565b50600483018190555f61128361127a866129c6565b60400151612d04565b90505f61128f87612e79565b9050816002826040516112a291906151dd565b602060405180830381855afa1580156112bd573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906112e09190614f98565b146112fe57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610a126001600160401b03831664e8d4a51000615223565b5f61133982611cc6565b6080015192915050565b61134e8383836122ec565b6109fd5760405163d802b9f360e01b815260040160405180910390fd5b5f805160206156a2833981519152600461138483611cc6565b51600581111561139657611396614d9b565b146113b45760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146113ec5760405163e6c4247b60e01b815260040160405180910390fd5b5f828152600782016020908152604080832080549084905560048501909252909120546109fd906001600160a01b031682612750565b61142a613312565b5f8181525f805160206156628339815191526020526040808220815160e0810190925280545f805160206156a283398151915293929190829060ff16600381111561147757611477614d9b565b600381111561148857611488614d9b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f806114fa610d6e876129c6565b50915091508183604001511461152357604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b0316111561155a57604051633ab3447f60e11b815260040160405180910390fd5b60038351600381111561156f5761156f614d9b565b1461158d5760405163f95c7fe160e01b815260040160405180910390fd5b611596856127e9565b505050506115b060015f805160206156e283398151915255565b5050565b6115bc613312565b5f8181525f805160206156628339815191526020526040808220815160e0810190925280545f805160206156a283398151915293929190829060ff16600381111561160957611609614d9b565b600381111561161a5761161a614d9b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61169082611cc6565b90505f835160038111156116a6576116a6614d9b565b036116c457604051631d0b665760e21b815260040160405180910390fd5b6004815160058111156116d9576116d9614d9b565b146116f75760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561170c5761170c614d9b565b036117235761171a856127e9565b50505050611813565b60028351600381111561173857611738614d9b565b0361180557600384015460608401516001600160a01b039091169063778c06b59061176290611316565b60a0840151608087015160c08601515f8881526004808c0160205260408083206001015490516001600160e01b031960e08a901b1681526117b597969594936001600160401b0390921692829101614f5a565b602060405180830381865afa1580156117d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117f49190614f98565b5f8681526006860160205260409020555b61180e856127e9565b505050505b61182960015f805160206156e283398151915255565b50565b5f611835613312565b61184083338461335c565b9050610a1260015f805160206156e283398151915255565b5f805160206156c28339815191525f8061187d611874856129c6565b60400151613623565b915091508061189f57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600684016020526040902080546118b99061523a565b90505f036118da57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff16600581111561190057611900614d9b565b1461191e5760405163a36c527f60e01b815260040160405180910390fd5b5f828152600684016020526040812061193691614b9a565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206156628339815191526020526040808220815160e0810190925280545f805160206156a283398151915293929190829060ff166003811115611a1257611a12614d9b565b6003811115611a2357611a23614d9b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611a9c57611a9c614d9b565b14158015611abd5750600381516003811115611aba57611aba614d9b565b14155b15611adb5760405163f95c7fe160e01b815260040160405180910390fd5b5f611ae98260400151611cc6565b905080606001516001600160401b03165f03611b1857604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611b4584604001518460600151856080015161225a565b6040518263ffffffff1660e01b8152600401611b619190614fd1565b6020604051808303815f875af1158015611b7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610abd9190614f98565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206156c28339815191529190611be89061523a565b90505f03611c0957604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611c2f57611c2f614d9b565b14611c4d5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611c869190600401615272565b6020604051808303815f875af1158015611ca2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109fd9190614f98565b611cce614bd1565b5f8281525f80516020615702833981519152602052604090819020815160e0810190925280545f805160206156c2833981519152929190829060ff166005811115611d1b57611d1b614d9b565b6005811115611d2c57611d2c614d9b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611d97613312565b611da3858585856137c7565b9050611dbb60015f805160206156e283398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611e0c575080546001600160401b03808416911610155b15611e2a5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611e55848461398d565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611eed573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f149190810190615307565b9150915080611f3657604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f79573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f9d9190614f98565b825114611fbd5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615611fe95760405163e6c4247b60e01b815260040160405180910390fd5b5f80611ff884604001516139a7565b9150915081871461201c57604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f805160206156a2833981519152906001600160401b0390811690831611156120d9575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26120f8565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f8281525f80516020615702833981519152602052604081206002015481905f805160206156c283398151915290600160801b90046001600160401b031661214b8582613b82565b5f61215587613d4b565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6121a58a858b61225a565b6040518263ffffffff1660e01b81526004016121c19190614fd1565b6020604051808303815f875af11580156121dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122019190614f98565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b6040515f6020820152600160e11b6022820152602681018490526001600160c01b031960c084811b8216604684015283901b16604e82015260609060560160405160208183030381529060405290505b9392505050565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206156a28339815191528161230586613dc0565b9050612310866122b1565b61231f576001925050506122aa565b5f8681526004830160205260409020546001600160a01b031633146123575760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a082015161238691600160b01b90046001600160401b0316906153d9565b6001600160401b03168160c001516001600160401b031610156123bc576040516302336bad60e51b815260040160405180910390fd5b5f85156123d4576123cd8786611ea2565b90506123f2565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061241790611316565b60a086015160c08701516040516001600160e01b031960e086901b16815261244b939291829189905f908190600401614f5a565b602060405180830381865afa158015612466573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248a9190614f98565b905080846007015f8a81526020019081526020015f205f8282546124ae91906151ee565b90915550501515979650505050505050565b5f6124c9614bd1565b5f805160206156c28339815191525f806124e5611874876129c6565b91509150801561250857604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561253957612539614d9b565b600581111561254a5761254a614d9b565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156125b9576125b9614d9b565b141580156125da57506001815160058111156125d7576125d7614d9b565b14155b156125f85760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561260d5761260d614d9b565b0361261b5760048152612620565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff1916600183600581111561266557612665614d9b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561271957612719614d9b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f8051602061568283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156127ab575f80fd5b505af11580156127bd573d5f803e3d5ffd5b50505050505050565b5f80516020615682833981519152546115b0906001600160a01b03168383613ffd565b5f8181525f805160206156628339815191526020526040808220815160e0810190925280545f805160206156a283398151915293929190829060ff16600381111561283657612836614d9b565b600381111561284757612847614d9b565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687018252828120805490829055848252600488019092529182205493945091926127109061291c90600160a01b900461ffff1684615223565b6129269190615003565b905080856007015f8581526020019081526020015f205f82825461294a91906151ee565b909155505f905061295b82846153f9565b905061296b856020015182612750565b6129808560200151610ab88760600151611316565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612a2a573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612a519190810190615307565b9150915080612a7357604051636b2f19e960e01b815260040160405180910390fd5b815115612a935760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612abf5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612aeb57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612b3a57612b028160016153f9565b612b0d906008615223565b61ffff16868281518110612b2357612b23615082565b016020015160f81c901b9190911790600101612aee565b5061ffff811615612b5e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612bb957612b758160036153f9565b612b80906008615223565b63ffffffff1687612b928360026151ee565b81518110612ba257612ba2615082565b016020015160f81c901b9190911790600101612b61565b5063ffffffff8116600414612be157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612c3657612bf881601f6153f9565b612c03906008615223565b88612c0f8360066151ee565b81518110612c1f57612c1f615082565b016020015160f81c901b9190911790600101612be4565b505f805b6008811015612c9557612c4e8160076153f9565b612c59906008615223565b6001600160401b031689612c6e8360266151ee565b81518110612c7e57612c7e615082565b016020015160f81c901b9190911790600101612c3a565b505f805b6008811015612cf457612cad8160076153f9565b612cb8906008615223565b6001600160401b03168a612ccd83602e6151ee565b81518110612cdd57612cdd615082565b016020015160f81c901b9190911790600101612c99565b5091989097509095509350505050565b5f8151602614612d2757604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612d7657612d3e8160016153f9565b612d49906008615223565b61ffff16848281518110612d5f57612d5f615082565b016020015160f81c901b9190911790600101612d2a565b5061ffff811615612d9a5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612df557612db18160036153f9565b612dbc906008615223565b63ffffffff1685612dce8360026151ee565b81518110612dde57612dde615082565b016020015160f81c901b9190911790600101612d9d565b5063ffffffff811615612e1b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612e7057612e3281601f6153f9565b612e3d906008615223565b86612e498360066151ee565b81518110612e5957612e59615082565b016020015160f81c901b9190911790600101612e1e565b50949350505050565b60605f612e888383018461503d565b612e9491506058615223565b612e9f90605c6151ee565b6001600160401b03811115612eb657612eb66150b4565b6040519080825280601f01601f191660200182016040528015612ee0576020820181803683370190505b5090505f5b6020811015612f355783358160208110612f0157612f01615082565b1a60f81b828281518110612f1757612f17615082565b60200101906001600160f81b03191690815f1a905350600101612ee5565b505f5b6020811015612f955783602001358160208110612f5757612f57615082565b1a60f81b82612f678360206151ee565b81518110612f7757612f77615082565b60200101906001600160f81b03191690815f1a905350600101612f38565b505f5b6004811015612ff857612fac8160036153f9565b612fb7906008615223565b6014901c60f81b82612fca8360406151ee565b81518110612fda57612fda615082565b60200101906001600160f81b03191690815f1a905350600101612f98565b505f61300a6060850160408601615022565b60601b90505f5b601481101561306a5781816014811061302c5761302c615082565b1a60f81b8361303c8360446151ee565b8151811061304c5761304c615082565b60200101906001600160f81b03191690815f1a905350600101613011565b505f613079606086018661503d565b905090505f5b60048110156130e4576130938160036153f9565b61309e906008615223565b63ffffffff8316901c60f81b846130b68360586151ee565b815181106130c6576130c6615082565b60200101906001600160f81b03191690815f1a90535060010161307f565b505f5b6130f4606087018761503d565b9050811015613308575f613109826058615223565b61311490605c6151ee565b90505f5b602081101561319f5761312e606089018961503d565b8481811061313e5761313e615082565b90506020028101906131509190615096565b35816020811061316257613162615082565b1a60f81b8661317183856151ee565b8151811061318157613181615082565b60200101906001600160f81b03191690815f1a905350600101613118565b505f5b6008811015613254576131b68160076153f9565b6131c1906008615223565b6131ce60608a018a61503d565b858181106131de576131de615082565b90506020028101906131f09190615096565b613201906040810190602001614d62565b6001600160401b0316901c60f81b868261321c8560206151ee565b61322691906151ee565b8151811061323657613236615082565b60200101906001600160f81b03191690815f1a9053506001016131a2565b505f5b60308110156132fe5761326d606089018961503d565b8481811061327d5761327d615082565b905060200281019061328f9190615096565b61329d90604081019061540c565b828181106132ad576132ad615082565b9050013560f81c60f81b86828460286132c691906151ee565b6132d091906151ee565b815181106132e0576132e0615082565b60200101906001600160f81b03191690815f1a905350600101613257565b50506001016130e7565b5091949350505050565b5f805160206156e283398151915280546001190161334357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206156e283398151915255565b5f5f805160206156a28339815191528161337861023d8561405c565b90505f61338487611cc6565b905061338f876122b1565b6133ac57604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156133c1576133c1614d9b565b146133df5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516133f091906153d9565b905083600201600a9054906101000a90046001600160401b03168260400151613419919061544e565b6001600160401b0316816001600160401b0316111561344b57604051630c192e7760e41b815260040160405180910390fd5b5f806134578a84612103565b915091505f8a8360405160200161348592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561351857613518614d9b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461364757604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136965761365e8160016153f9565b613669906008615223565b61ffff1685828151811061367f5761367f615082565b016020015160f81c901b919091179060010161364a565b5061ffff8116156136ba5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613715576136d18160036153f9565b6136dc906008615223565b63ffffffff16866136ee8360026151ee565b815181106136fe576136fe615082565b016020015160f81c901b91909117906001016136bd565b5063ffffffff811660031461373d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137925761375481601f6153f9565b61375f906008615223565b8761376b8360066151ee565b8151811061377b5761377b615082565b016020015160f81c901b9190911790600101613740565b505f866026815181106137a7576137a7615082565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206156a283398151915290600160401b900461ffff908116908616108061381b575061271061ffff8616115b156138395760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561386b576040516302336bad60e51b815260040160405180910390fd5b805483108061387d5750806001015483115b1561389b57604051630103be3b60e21b815260040160405180910390fd5b5f6138a58461405c565b90505f6138b182610a02565b90505f6138be898361407f565b905060405180608001604052806138d23390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b613995614469565b61399e826144b4565b6115b081614522565b5f808251602e146139cb57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613a1a576139e28160016153f9565b6139ed906008615223565b61ffff16858281518110613a0357613a03615082565b016020015160f81c901b91909117906001016139ce565b5061ffff811615613a3e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613a9957613a558160036153f9565b613a60906008615223565b63ffffffff1686613a728360026151ee565b81518110613a8257613a82615082565b016020015160f81c901b9190911790600101613a41565b5063ffffffff8116600514613ac157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b1657613ad881601f6153f9565b613ae3906008615223565b87613aef8360066151ee565b81518110613aff57613aff615082565b016020015160f81c901b9190911790600101613ac4565b505f805b6008811015613b7557613b2e8160076153f9565b613b39906008615223565b6001600160401b031688613b4e8360266151ee565b81518110613b5e57613b5e615082565b016020015160f81c901b9190911790600101613b1a565b5090969095509350505050565b5f805160206156c28339815191525f6001600160401b038084169085161115613bb657613baf8385614f3a565b9050613bc3565b613bc08484614f3a565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613c25575060018401548151613c21916001600160401b0316906151ee565b8210155b15613c4b576001600160401b038316606082015281815260408101516020820152613c6a565b8281606001818151613c5d91906153d9565b6001600160401b03169052505b6060810151613c7a90606461544e565b602082015160018601546001600160401b039290921691613ca59190600160401b900460ff16615223565b1015613cc45760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613cdf91906151ee565b9052506040810180516001600160401b0387169190613cff9083906153f9565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206157028339815191526020526040812060020180545f805160206156c28339815191529190600890613d9590600160401b90046001600160401b0316615479565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b613dc8614bd1565b5f8281525f805160206157028339815191526020526040808220815160e0810190925280545f805160206156c283398151915293929190829060ff166005811115613e1557613e15614d9b565b6005811115613e2657613e26614d9b565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613e9857613e98614d9b565b14613eb65760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613efa57613efa614d9b565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613fa68582612103565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526109fd91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061457f565b5f610a12825f80516020615682833981519152546001600160a01b0316906145e5565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166140c357604051637fab81e560e01b815260040160405180910390fd5b5f805160206156c2833981519152426140e26040860160208701614d62565b6001600160401b031611158061411c57506141006202a300426151ee565b6141106040860160208701614d62565b6001600160401b031610155b156141395760405162d36c8560e81b815260040160405180910390fd5b6030614148604086018661540c565b905014158061415657508335155b156141745760405163b4fa3fb360e01b815260040160405180910390fd5b83355f908152600882016020526040902054156141a457604051630eb0d31360e11b815260040160405180910390fd5b6141ae835f613b82565b5f806142476040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906141f29190614d62565b6001600160401b0316815260200161420d60408a018a61540c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614747565b5f8281526006860160205260409020919350915061426582826154d8565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906142a3908590600401614fd1565b6020604051808303815f875af11580156142bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142e39190614f98565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561435b5761435b614d9b565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161443b918e01908e01614d62565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166144b257604051631afcd79f60e31b815260040160405180910390fd5b565b6144bc614469565b6144c58161480a565b6144cd614823565b611829606082013560808301356144ea60c0850160a08601614d62565b6144fa60e0860160c08701615597565b61450b610100870160e088016155b0565b61451d61012088016101008901615022565b614833565b61452a614469565b5f805160206156828339815191526001600160a01b03821661455f5760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f6145936001600160a01b03841683614954565b905080515f141580156145b75750808060200190518101906145b591906155d0565b155b156109fd57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561462b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061464f9190614f98565b90506146666001600160a01b038516333086614961565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156146aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146ce9190614f98565b90508181116147345760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016145dc565b61473e82826153f9565b95945050505050565b5f606082608001515160301461477057604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016147a297969594939291906155eb565b60405160208183030381529060405290506002816040516147c391906151dd565b602060405180830381855afa1580156147de573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906148019190614f98565b94909350915050565b614812614469565b61481a61499a565b611829816149a2565b61482b614469565b6144b2614a74565b61483b614469565b5f805160206156a283398151915261ffff8416158061485f575061271061ffff8516115b1561487d5760405163c98d73a760e01b815260040160405180910390fd5b8587111561489e57604051630103be3b60e21b815260040160405180910390fd5b60ff831615806148b15750600a60ff8416115b156148cf576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b60606122aa83835f614a7c565b6040516001600160a01b03848116602483015283811660448301526064820183905261098c9186918216906323b872dd9060840161402a565b6144b2614469565b6149aa614469565b80355f805160206156c283398151915290815560146149cf60608401604085016155b0565b60ff1611806149ee57506149e960608301604084016155b0565b60ff16155b15614a0c5760405163b4fa3fb360e01b815260040160405180910390fd5b614a1c60608301604084016155b0565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614a4d6040830160208401614d62565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b613349614469565b606081471015614aa15760405163cd78605960e01b81523060048201526024016145dc565b5f80856001600160a01b03168486604051614abc91906151dd565b5f6040518083038185875af1925050503d805f8114614af6576040519150601f19603f3d011682016040523d82523d5f602084013e614afb565b606091505b5091509150614b0b868383614b15565b9695505050505050565b606082614b2a57614b2582614b71565b6122aa565b8151158015614b4157506001600160a01b0384163b155b15614b6a57604051639996b31560e01b81526001600160a01b03851660048201526024016145dc565b50806122aa565b805115614b815780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ba69061523a565b5f825580601f10614bb5575050565b601f0160209004905f5260205f20908101906118299190614c0d565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614c21575f8155600101614c0e565b5090565b8015158114611829575f80fd5b803563ffffffff81168114614c45575f80fd5b919050565b5f805f60608486031215614c5c575f80fd5b833592506020840135614c6e81614c25565b9150614c7c60408501614c32565b90509250925092565b5f60208284031215614c95575f80fd5b5035919050565b5f8060408385031215614cad575f80fd5b82359150614cbd60208401614c32565b90509250929050565b5f60208284031215614cd6575f80fd5b6122aa82614c32565b5f8060408385031215614cf0575f80fd5b614cf983614c32565b946020939093013593505050565b5f8060408385031215614d18575f80fd5b82356001600160401b03811115614d2d575f80fd5b830160808186031215614d3e575f80fd5b9150614cbd60208401614c32565b80356001600160401b0381168114614c45575f80fd5b5f60208284031215614d72575f80fd5b6122aa82614d4c565b5f8060408385031215614d8c575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614dd257634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e0d60608401826001600160401b03169052565b506080830151614e2860808401826001600160401b03169052565b5060a0830151614e4360a08401826001600160401b03169052565b5060c0830151612abf60c08401826001600160401b03169052565b803561ffff81168114614c45575f80fd5b5f805f8060808587031215614e82575f80fd5b84356001600160401b03811115614e97575f80fd5b850160608188031215614ea8575f80fd5b9350614eb660208601614e5e565b9250614ec460408601614d4c565b9396929550929360600135925050565b6001600160a01b0381168114611829575f80fd5b5f80828403610140811215614efb575f80fd5b61012080821215614f0a575f80fd5b8493508301359050614f1b81614ed4565b809150509250929050565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612abf57612abf614f26565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614fa8575f80fd5b5051919050565b5f5b83811015614fc9578181015183820152602001614fb1565b50505f910152565b602081525f8251806020840152614fef816040850160208701614faf565b601f01601f19169190910160400192915050565b5f8261501d57634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215615032575f80fd5b81356122aa81614ed4565b5f808335601e19843603018112615052575f80fd5b8301803591506001600160401b0382111561506b575f80fd5b6020019150600581901b3603821315612253575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126150aa575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150ea576150ea6150b4565b60405290565b604051601f8201601f191681016001600160401b0381118282101715615118576151186150b4565b604052919050565b5f6001600160401b03821115615138576151386150b4565b50601f01601f191660200190565b5f60608236031215615156575f80fd5b61515e6150c8565b82358152602061516f818501614d4c565b8183015260408401356001600160401b0381111561518b575f80fd5b840136601f82011261519b575f80fd5b80356151ae6151a982615120565b6150f0565b81815236848385010111156151c1575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516150aa818460208701614faf565b80820180821115610a1257610a12614f26565b5f63ffffffff80831681810361521957615219614f26565b6001019392505050565b8082028115828204841417610a1257610a12614f26565b600181811c9082168061524e57607f821691505b60208210810361526c57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546152848161523a565b806020870152604060018084165f81146152a557600181146152c1576152ee565b60ff19851660408a0152604084151560051b8a010195506152ee565b895f5260205f205f5b858110156152e55781548b82018601529083019088016152ca565b8a016040019650505b509398975050505050505050565b8051614c4581614c25565b5f8060408385031215615318575f80fd5b82516001600160401b038082111561532e575f80fd5b9084019060608287031215615341575f80fd5b6153496150c8565b8251815260208084015161535c81614ed4565b82820152604084015183811115615371575f80fd5b80850194505087601f850112615385575f80fd5b835192506153956151a984615120565b83815288828587010111156153a8575f80fd5b6153b784838301848801614faf565b806040840152508195506153cc8188016152fc565b9450505050509250929050565b6001600160401b03818116838216019080821115612abf57612abf614f26565b81810381811115610a1257610a12614f26565b5f808335601e19843603018112615421575f80fd5b8301803591506001600160401b0382111561543a575f80fd5b602001915036819003821315612253575f80fd5b6001600160401b0381811683821602808216919082811461547157615471614f26565b505092915050565b5f6001600160401b0380831681810361521957615219614f26565b601f8211156109fd57805f5260205f20601f840160051c810160208510156154b95750805b601f840160051c820191505b81811015610abd575f81556001016154c5565b81516001600160401b038111156154f1576154f16150b4565b615505816154ff845461523a565b84615494565b602080601f831160018114615538575f84156155215750858301515b5f19600386901b1c1916600185901b17855561558f565b5f85815260208120601f198616915b8281101561556657888601518255948401946001909101908401615547565b508582101561558357878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156155a7575f80fd5b6122aa82614e5e565b5f602082840312156155c0575f80fd5b813560ff811681146122aa575f80fd5b5f602082840312156155e0575f80fd5b81516122aa81614c25565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161564081604e860160208901614faf565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"SafeERC20FailedOperation\",\"inputs\":[{\"name\":\"token\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516158ce3803806158ce83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6157818061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101dc575f3560e01c806376f7862111610109578063ba3a4b971161009e578063df93d8de1161006e578063df93d8de14610426578063e7d14c1c14610430578063eb0acb891461046e578063f09969ae14610481575f80fd5b8063ba3a4b97146103d8578063bee0a03f146103eb578063c974d1b6146103fe578063d5f20ff614610406575f80fd5b80639dde029a116100d95780639dde029a146103795780639e1bc4ef1461038c578063a3a65e481461039f578063b771b3bc146103b2575f80fd5b806376f78621146103385780638280a25a1461034b57806393e245981461035357806398f3e2b414610366575f80fd5b80633a1cfff61161017f57806361e2f4901161014f57806361e2f490146102ea57806362065856146102fd57806366435abf1461031e578063732214f814610331575f80fd5b80633a1cfff614610294578063467ef06f146102a75780635297fae6146102ba57806360305d62146102cd575f80fd5b80631ec44724116101ba5780631ec447241461022757806325e1c7761461023a5780632e2194d81461024d57806335455ded14610278575f80fd5b80630118acc4146101e05780630322ed98146101f5578063151d30d114610208575b5f80fd5b6101f36101ee366004614c9d565b610494565b005b6101f3610203366004614cd8565b6104c3565b610210600a81565b60405160ff90911681526020015b60405180910390f35b6101f3610235366004614c9d565b610635565b6101f3610248366004614cef565b610640565b61026061025b366004614cd8565b6106ab565b6040516001600160401b03909116815260200161021e565b61028161271081565b60405161ffff909116815260200161021e565b6101f36102a2366004614c9d565b6106c1565b6101f36102b5366004614d19565b6106cc565b6101f36102c8366004614d32565b61076d565b6102d5601481565b60405163ffffffff909116815260200161021e565b6101f36102f8366004614d5a565b610b40565b61031061030b366004614db5565b610fbf565b60405190815260200161021e565b61026061032c366004614cd8565b610fd8565b6103105f81565b6101f3610346366004614c9d565b610fec565b610210603081565b6101f3610361366004614cd8565b611014565b6101f3610374366004614d32565b6110cb565b6101f3610387366004614cd8565b61125d565b61031061039a366004614dce565b6114d5565b6101f36103ad366004614d19565b611501565b6103c06005600160991b0181565b6040516001600160a01b03909116815260200161021e565b6101f36103e6366004614cd8565b61166e565b6101f36103f9366004614cd8565b61184a565b610210601481565b610419610414366004614cd8565b61196f565b60405161021e9190614e02565b6102606202a30081565b61031061043e366004614cd8565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61031061047c366004614ec2565b611a37565b6101f361048f366004614f3b565b611a6c565b61049f838383611b4b565b5f036104be57604051637ca5e29d60e01b815260040160405180910390fd5b505050565b5f8181525f805160206157558339815191526020526040808220815160e0810190925280545f8051602061571583398151915293929190829060ff16600581111561051057610510614dee565b600581111561052157610521614dee565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561059057610590614dee565b146105ae5760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6105d38584606001515f611efd565b6040518263ffffffff1660e01b81526004016105ef9190614f9b565b6020604051808303815f875af115801561060b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062f9190614fcd565b50505050565b61062f838383611b4b565b61064982611f4c565b61066657604051636ca57bcf60e01b815260040160405180910390fd5b60026106718361196f565b51600581111561068357610683614dee565b146106a15760405163a36c527f60e01b815260040160405180910390fd5b6104be8282611f87565b5f6106bb64e8d4a5100083614ff8565b92915050565b61062f8383836121e8565b5f805160206156f58339815191525f806106e5846123bc565b915091506106f282611f4c565b6106fc5750505050565b5f82815260048085016020526040909120546001600160a01b0316908251600581111561072b5761072b614dee565b03610750575f8381526007850160205260408120805491905561074e828261264c565b505b610766816107618460400151610fbf565b6126c2565b5050505050565b5f8181525f805160206156b58339815191526020526040808220815160e0810190925280545f805160206156f583398151915293929190829060ff1660038111156107ba576107ba614dee565b60038111156107cb576107cb614dee565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f906108429061196f565b905060015f85815260058501602052604090205460ff16600381111561086a5761086a614dee565b146108885760405163f95c7fe160e01b815260040160405180910390fd5b60038151600581111561089d5761089d614dee565b036109e657600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff19169060019084908111156108f7576108f7614dee565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b6004815160058111156109fb576109fb614dee565b03610a0957610766846126e5565b5f80610a20610a17886128c2565b604001516129c2565b509150915081846040015114610a4957604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610a9157505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b15610aaf57604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206157158339815191529060ff1615610b9257604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bd5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bf99190614fcd565b836020013514610c1c5760405163d040949d60e01b815260040160405180910390fd5b30610c2d6060850160408601615017565b6001600160a01b031614610c545760405163e6c4247b60e01b815260040160405180910390fd5b5f610c626060850185615032565b905090505f805b828163ffffffff161015610f0e575f610c856060880188615032565b8363ffffffff16818110610c9b57610c9b615077565b9050602002810190610cad919061508b565b610cb69061513b565b80515f8181526008880160205260409020549192509015610cea57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610d1992919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610d33916151d2565b602060405180830381855afa158015610d4e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610d719190614fcd565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610dfd57610dfd614dee565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610eb09116866151e3565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610f07906151f6565b9050610c69565b50600483018190555f610f2c610f23866128c2565b60400151612c00565b90505f610f3887612d75565b905081600282604051610f4b91906151d2565b602060405180830381855afa158015610f66573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f899190614fcd565b14610fa757604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f6106bb6001600160401b03831664e8d4a51000615218565b5f610fe28261196f565b6080015192915050565b610ff78383836121e8565b6104be5760405163d802b9f360e01b815260040160405180910390fd5b5f805160206156f5833981519152600461102d8361196f565b51600581111561103f5761103f614dee565b1461105d5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146110955760405163e6c4247b60e01b815260040160405180910390fd5b5f828152600782016020908152604080832080549084905560048501909252909120546104be906001600160a01b03168261264c565b6110d361320e565b5f8181525f805160206156b58339815191526020526040808220815160e0810190925280545f805160206156f583398151915293929190829060ff16600381111561112057611120614dee565b600381111561113157611131614dee565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f806111a3610a17876128c2565b5091509150818360400151146111cc57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b0316111561120357604051633ab3447f60e11b815260040160405180910390fd5b60038351600381111561121857611218614dee565b146112365760405163f95c7fe160e01b815260040160405180910390fd5b61123f856126e5565b5050505061125960015f8051602061573583398151915255565b5050565b61126561320e565b5f8181525f805160206156b58339815191526020526040808220815160e0810190925280545f805160206156f583398151915293929190829060ff1660038111156112b2576112b2614dee565b60038111156112c3576112c3614dee565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6113398261196f565b90505f8351600381111561134f5761134f614dee565b0361136d57604051631d0b665760e21b815260040160405180910390fd5b60048151600581111561138257611382614dee565b146113a05760405163a36c527f60e01b815260040160405180910390fd5b6001835160038111156113b5576113b5614dee565b036113cc576113c3856126e5565b505050506114bc565b6002835160038111156113e1576113e1614dee565b036114ae57600384015460608401516001600160a01b039091169063778c06b59061140b90610fbf565b60a0840151608087015160c08601515f8881526004808c0160205260408083206001015490516001600160e01b031960e08a901b16815261145e97969594936001600160401b039092169282910161522f565b602060405180830381865afa158015611479573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061149d9190614fcd565b5f8681526006860160205260409020555b6114b7856126e5565b505050505b6114d260015f8051602061573583398151915255565b50565b5f6114de61320e565b6114e9833384613258565b90506106bb60015f8051602061573583398151915255565b5f805160206157158339815191525f8061152661151d856128c2565b6040015161351f565b915091508061154857604051633dbcaef760e01b815260040160405180910390fd5b5f828152600684016020526040902080546115629061526d565b90505f0361158357604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff1660058111156115a9576115a9614dee565b146115c75760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068401602052604081206115df91614bed565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206156b58339815191526020526040808220815160e0810190925280545f805160206156f583398151915293929190829060ff1660038111156116bb576116bb614dee565b60038111156116cc576116cc614dee565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561174557611745614dee565b14158015611766575060038151600381111561176357611763614dee565b14155b156117845760405163f95c7fe160e01b815260040160405180910390fd5b5f611792826040015161196f565b905080606001516001600160401b03165f036117c157604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6117ee846040015184606001518560800151611efd565b6040518263ffffffff1660e01b815260040161180a9190614f9b565b6020604051808303815f875af1158015611826573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107669190614fcd565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061571583398151915291906118919061526d565b90505f036118b257604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff1660058111156118d8576118d8614dee565b146118f65760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161192f91906004016152a5565b6020604051808303815f875af115801561194b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104be9190614fcd565b611977614c24565b5f8281525f80516020615755833981519152602052604090819020815160e0810190925280545f80516020615715833981519152929190829060ff1660058111156119c4576119c4614dee565b60058111156119d5576119d5614dee565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f611a4061320e565b611a4c858585856136c3565b9050611a6460015f8051602061573583398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611ab5575080546001600160401b03808416911610155b15611ad35760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611afe8484613889565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f8381525f805160206156b58339815191526020526040808220815160e0810190925280545f805160206156f58339815191529284929091829060ff166003811115611b9957611b99614dee565b6003811115611baa57611baa614dee565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c208261196f565b9050600283516003811115611c3757611c37614dee565b14611c555760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b03163314611c825760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f80600283516005811115611ca057611ca0614dee565b03611cf1578815611cb857611cb58489611f87565b91505b5f85606001518460800151611ccd919061532f565b9050611cd985826138a3565b506001600160401b031660c087015250429050611d26565b50505f82815260048501602052604090206001015460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601515f916001600160a01b03169063778c06b590611d4b90610fbf565b8660a00151896080015186885f806040518863ffffffff1660e01b8152600401611d7b979695949392919061522f565b602060405180830381865afa158015611d96573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dba9190614fcd565b5f8c8152600689016020908152604080832084905560058b019091529020875181549293508892829060ff19166001836003811115611dfb57611dfb614dee565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555185908c907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c6990611ee59086906001600160401b0391909116815260200190565b60405180910390a396505050505050505b9392505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611fd2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ff9919081019061535a565b915091508061201b57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561205e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120829190614fcd565b8251146120a25760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156120ce5760405163e6c4247b60e01b815260040160405180910390fd5b5f806120dd84604001516139fa565b9150915081871461210157604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f805160206156f5833981519152906001600160401b0390811690831611156121be575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26121dd565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f805160206156f58339815191528161220186613bd5565b905061220c86611f4c565b61221b57600192505050611ef6565b5f8681526004830160205260409020546001600160a01b031633146122535760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a082015161228291600160b01b90046001600160401b03169061542c565b6001600160401b03168160c001516001600160401b031610156122b8576040516302336bad60e51b815260040160405180910390fd5b5f85156122d0576122c98786611f87565b90506122ee565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061231390610fbf565b60a086015160c08701516040516001600160e01b031960e086901b168152612347939291829189905f90819060040161522f565b602060405180830381865afa158015612362573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123869190614fcd565b905080846007015f8a81526020019081526020015f205f8282546123aa91906151e3565b90915550501515979650505050505050565b5f6123c5614c24565b5f805160206157158339815191525f806123e161151d876128c2565b91509150801561240457604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561243557612435614dee565b600581111561244657612446614dee565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156124b5576124b5614dee565b141580156124d657506001815160058111156124d3576124d3614dee565b14155b156124f45760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561250957612509614dee565b03612517576004815261251c565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff1916600183600581111561256157612561614dee565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561261557612615614dee565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f805160206156d583398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b1580156126a7575f80fd5b505af11580156126b9573d5f803e3d5ffd5b50505050505050565b5f805160206156d583398151915254611259906001600160a01b03168383613e12565b5f8181525f805160206156b58339815191526020526040808220815160e0810190925280545f805160206156f583398151915293929190829060ff16600381111561273257612732614dee565b600381111561274357612743614dee565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687018252828120805490829055848252600488019092529182205493945091926127109061281890600160a01b900461ffff1684615218565b6128229190614ff8565b905080856007015f8581526020019081526020015f205f82825461284691906151e3565b909155505f9050612857828461544c565b905061286785602001518261264c565b61287c85602001516107618760600151610fbf565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612926573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261294d919081019061535a565b915091508061296f57604051636b2f19e960e01b815260040160405180910390fd5b81511561298f5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156129bb5760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f83516036146129e757604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612a36576129fe81600161544c565b612a09906008615218565b61ffff16868281518110612a1f57612a1f615077565b016020015160f81c901b91909117906001016129ea565b5061ffff811615612a5a5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612ab557612a7181600361544c565b612a7c906008615218565b63ffffffff1687612a8e8360026151e3565b81518110612a9e57612a9e615077565b016020015160f81c901b9190911790600101612a5d565b5063ffffffff8116600414612add57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612b3257612af481601f61544c565b612aff906008615218565b88612b0b8360066151e3565b81518110612b1b57612b1b615077565b016020015160f81c901b9190911790600101612ae0565b505f805b6008811015612b9157612b4a81600761544c565b612b55906008615218565b6001600160401b031689612b6a8360266151e3565b81518110612b7a57612b7a615077565b016020015160f81c901b9190911790600101612b36565b505f805b6008811015612bf057612ba981600761544c565b612bb4906008615218565b6001600160401b03168a612bc983602e6151e3565b81518110612bd957612bd9615077565b016020015160f81c901b9190911790600101612b95565b5091989097509095509350505050565b5f8151602614612c2357604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612c7257612c3a81600161544c565b612c45906008615218565b61ffff16848281518110612c5b57612c5b615077565b016020015160f81c901b9190911790600101612c26565b5061ffff811615612c965760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612cf157612cad81600361544c565b612cb8906008615218565b63ffffffff1685612cca8360026151e3565b81518110612cda57612cda615077565b016020015160f81c901b9190911790600101612c99565b5063ffffffff811615612d1757604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612d6c57612d2e81601f61544c565b612d39906008615218565b86612d458360066151e3565b81518110612d5557612d55615077565b016020015160f81c901b9190911790600101612d1a565b50949350505050565b60605f612d8483830184615032565b612d9091506058615218565b612d9b90605c6151e3565b6001600160401b03811115612db257612db26150a9565b6040519080825280601f01601f191660200182016040528015612ddc576020820181803683370190505b5090505f5b6020811015612e315783358160208110612dfd57612dfd615077565b1a60f81b828281518110612e1357612e13615077565b60200101906001600160f81b03191690815f1a905350600101612de1565b505f5b6020811015612e915783602001358160208110612e5357612e53615077565b1a60f81b82612e638360206151e3565b81518110612e7357612e73615077565b60200101906001600160f81b03191690815f1a905350600101612e34565b505f5b6004811015612ef457612ea881600361544c565b612eb3906008615218565b6014901c60f81b82612ec68360406151e3565b81518110612ed657612ed6615077565b60200101906001600160f81b03191690815f1a905350600101612e94565b505f612f066060850160408601615017565b60601b90505f5b6014811015612f6657818160148110612f2857612f28615077565b1a60f81b83612f388360446151e3565b81518110612f4857612f48615077565b60200101906001600160f81b03191690815f1a905350600101612f0d565b505f612f756060860186615032565b905090505f5b6004811015612fe057612f8f81600361544c565b612f9a906008615218565b63ffffffff8316901c60f81b84612fb28360586151e3565b81518110612fc257612fc2615077565b60200101906001600160f81b03191690815f1a905350600101612f7b565b505f5b612ff06060870187615032565b9050811015613204575f613005826058615218565b61301090605c6151e3565b90505f5b602081101561309b5761302a6060890189615032565b8481811061303a5761303a615077565b905060200281019061304c919061508b565b35816020811061305e5761305e615077565b1a60f81b8661306d83856151e3565b8151811061307d5761307d615077565b60200101906001600160f81b03191690815f1a905350600101613014565b505f5b6008811015613150576130b281600761544c565b6130bd906008615218565b6130ca60608a018a615032565b858181106130da576130da615077565b90506020028101906130ec919061508b565b6130fd906040810190602001614db5565b6001600160401b0316901c60f81b86826131188560206151e3565b61312291906151e3565b8151811061313257613132615077565b60200101906001600160f81b03191690815f1a90535060010161309e565b505f5b60308110156131fa576131696060890189615032565b8481811061317957613179615077565b905060200281019061318b919061508b565b61319990604081019061545f565b828181106131a9576131a9615077565b9050013560f81c60f81b86828460286131c291906151e3565b6131cc91906151e3565b815181106131dc576131dc615077565b60200101906001600160f81b03191690815f1a905350600101613153565b5050600101612fe3565b5091949350505050565b5f8051602061573583398151915280546001190161323f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f8051602061573583398151915255565b5f5f805160206156f58339815191528161327461025b85613e71565b90505f6132808761196f565b905061328b87611f4c565b6132a857604051636ca57bcf60e01b815260040160405180910390fd5b6002815160058111156132bd576132bd614dee565b146132db5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516132ec919061542c565b905083600201600a9054906101000a90046001600160401b0316826040015161331591906154a1565b6001600160401b0316816001600160401b0316111561334757604051630c192e7760e41b815260040160405180910390fd5b5f806133538a846138a3565b915091505f8a8360405160200161338192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561341457613414614dee565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461354357604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156135925761355a81600161544c565b613565906008615218565b61ffff1685828151811061357b5761357b615077565b016020015160f81c901b9190911790600101613546565b5061ffff8116156135b65760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613611576135cd81600361544c565b6135d8906008615218565b63ffffffff16866135ea8360026151e3565b815181106135fa576135fa615077565b016020015160f81c901b91909117906001016135b9565b5063ffffffff811660031461363957604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561368e5761365081601f61544c565b61365b906008615218565b876136678360066151e3565b8151811061367757613677615077565b016020015160f81c901b919091179060010161363c565b505f866026815181106136a3576136a3615077565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206156f583398151915290600160401b900461ffff9081169086161080613717575061271061ffff8616115b156137355760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b039081169085161015613767576040516302336bad60e51b815260040160405180910390fd5b80548310806137795750806001015483115b1561379757604051630103be3b60e21b815260040160405180910390fd5b5f6137a184613e71565b90505f6137ad826106ab565b90505f6137ba8983613e94565b905060405180608001604052806137ce3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b61389161427e565b61389a826142c9565b61125981614337565b5f8281525f80516020615755833981519152602052604081206002015481905f8051602061571583398151915290600160801b90046001600160401b03166138eb8582614394565b5f6138f58761455d565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6139458a858b611efd565b6040518263ffffffff1660e01b81526004016139619190614f9b565b6020604051808303815f875af115801561397d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139a19190614fcd565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f808251602e14613a1e57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613a6d57613a3581600161544c565b613a40906008615218565b61ffff16858281518110613a5657613a56615077565b016020015160f81c901b9190911790600101613a21565b5061ffff811615613a915760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613aec57613aa881600361544c565b613ab3906008615218565b63ffffffff1686613ac58360026151e3565b81518110613ad557613ad5615077565b016020015160f81c901b9190911790600101613a94565b5063ffffffff8116600514613b1457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b6957613b2b81601f61544c565b613b36906008615218565b87613b428360066151e3565b81518110613b5257613b52615077565b016020015160f81c901b9190911790600101613b17565b505f805b6008811015613bc857613b8181600761544c565b613b8c906008615218565b6001600160401b031688613ba18360266151e3565b81518110613bb157613bb1615077565b016020015160f81c901b9190911790600101613b6d565b5090969095509350505050565b613bdd614c24565b5f8281525f805160206157558339815191526020526040808220815160e0810190925280545f8051602061571583398151915293929190829060ff166005811115613c2a57613c2a614dee565b6005811115613c3b57613c3b614dee565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613cad57613cad614dee565b14613ccb5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613d0f57613d0f614dee565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613dbb85826138a3565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104be91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506145d2565b5f6106bb825f805160206156d5833981519152546001600160a01b031690614638565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ed857604051637fab81e560e01b815260040160405180910390fd5b5f8051602061571583398151915242613ef76040860160208701614db5565b6001600160401b0316111580613f315750613f156202a300426151e3565b613f256040860160208701614db5565b6001600160401b031610155b15613f4e5760405162d36c8560e81b815260040160405180910390fd5b6030613f5d604086018661545f565b9050141580613f6b57508335155b15613f895760405163b4fa3fb360e01b815260040160405180910390fd5b83355f90815260088201602052604090205415613fb957604051630eb0d31360e11b815260040160405180910390fd5b613fc3835f614394565b5f8061405c6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906140079190614db5565b6001600160401b0316815260200161402260408a018a61545f565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061479a565b5f8281526006860160205260409020919350915061407a8282615510565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906140b8908590600401614f9b565b6020604051808303815f875af11580156140d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140f89190614fcd565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561417057614170614dee565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614250918e01908e01614db5565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166142c757604051631afcd79f60e31b815260040160405180910390fd5b565b6142d161427e565b6142da8161485d565b6142e2614876565b6114d2606082013560808301356142ff60c0850160a08601614db5565b61430f60e0860160c087016155cf565b614320610100870160e088016155e8565b61433261012088016101008901615017565b614886565b61433f61427e565b5f805160206156d58339815191526001600160a01b0382166143745760405163e6c4247b60e01b815260040160405180910390fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f805160206157158339815191525f6001600160401b0380841690851611156143c8576143c1838561532f565b90506143d5565b6143d2848461532f565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614437575060018401548151614433916001600160401b0316906151e3565b8210155b1561445d576001600160401b03831660608201528181526040810151602082015261447c565b828160600181815161446f919061542c565b6001600160401b03169052505b606081015161448c9060646154a1565b602082015160018601546001600160401b0392909216916144b79190600160401b900460ff16615218565b10156144d65760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516144f191906151e3565b9052506040810180516001600160401b038716919061451190839061544c565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206157558339815191526020526040812060020180545f8051602061571583398151915291906008906145a790600160401b90046001600160401b0316615608565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6145e66001600160a01b038416836149a7565b905080515f1415801561460a5750808060200190518101906146089190615623565b155b156104be57604051635274afe760e01b81526001600160a01b03841660048201526024015b60405180910390fd5b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561467e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146a29190614fcd565b90506146b96001600160a01b0385163330866149b4565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156146fd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147219190614fcd565b90508181116147875760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b606482015260840161462f565b614791828261544c565b95945050505050565b5f60608260800151516030146147c357604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016147f5979695949392919061563e565b604051602081830303815290604052905060028160405161481691906151d2565b602060405180830381855afa158015614831573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906148549190614fcd565b94909350915050565b61486561427e565b61486d6149ed565b6114d2816149f5565b61487e61427e565b6142c7614ac7565b61488e61427e565b5f805160206156f583398151915261ffff841615806148b2575061271061ffff8516115b156148d05760405163c98d73a760e01b815260040160405180910390fd5b858711156148f157604051630103be3b60e21b815260040160405180910390fd5b60ff831615806149045750600a60ff8416115b15614922576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611ef683835f614acf565b6040516001600160a01b03848116602483015283811660448301526064820183905261062f9186918216906323b872dd90608401613e3f565b6142c761427e565b6149fd61427e565b80355f805160206157158339815191529081556014614a2260608401604085016155e8565b60ff161180614a415750614a3c60608301604084016155e8565b60ff16155b15614a5f5760405163b4fa3fb360e01b815260040160405180910390fd5b614a6f60608301604084016155e8565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614aa06040830160208401614db5565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b61324561427e565b606081471015614af45760405163cd78605960e01b815230600482015260240161462f565b5f80856001600160a01b03168486604051614b0f91906151d2565b5f6040518083038185875af1925050503d805f8114614b49576040519150601f19603f3d011682016040523d82523d5f602084013e614b4e565b606091505b5091509150614b5e868383614b68565b9695505050505050565b606082614b7d57614b7882614bc4565b611ef6565b8151158015614b9457506001600160a01b0384163b155b15614bbd57604051639996b31560e01b81526001600160a01b038516600482015260240161462f565b5080611ef6565b805115614bd45780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614bf99061526d565b5f825580601f10614c08575050565b601f0160209004905f5260205f20908101906114d29190614c60565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614c74575f8155600101614c61565b5090565b80151581146114d2575f80fd5b803563ffffffff81168114614c98575f80fd5b919050565b5f805f60608486031215614caf575f80fd5b833592506020840135614cc181614c78565b9150614ccf60408501614c85565b90509250925092565b5f60208284031215614ce8575f80fd5b5035919050565b5f8060408385031215614d00575f80fd5b82359150614d1060208401614c85565b90509250929050565b5f60208284031215614d29575f80fd5b611ef682614c85565b5f8060408385031215614d43575f80fd5b614d4c83614c85565b946020939093013593505050565b5f8060408385031215614d6b575f80fd5b82356001600160401b03811115614d80575f80fd5b830160808186031215614d91575f80fd5b9150614d1060208401614c85565b80356001600160401b0381168114614c98575f80fd5b5f60208284031215614dc5575f80fd5b611ef682614d9f565b5f8060408385031215614ddf575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614e2557634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614e6060608401826001600160401b03169052565b506080830151614e7b60808401826001600160401b03169052565b5060a0830151614e9660a08401826001600160401b03169052565b5060c08301516129bb60c08401826001600160401b03169052565b803561ffff81168114614c98575f80fd5b5f805f8060808587031215614ed5575f80fd5b84356001600160401b03811115614eea575f80fd5b850160608188031215614efb575f80fd5b9350614f0960208601614eb1565b9250614f1760408601614d9f565b9396929550929360600135925050565b6001600160a01b03811681146114d2575f80fd5b5f80828403610140811215614f4e575f80fd5b61012080821215614f5d575f80fd5b8493508301359050614f6e81614f27565b809150509250929050565b5f5b83811015614f93578181015183820152602001614f7b565b50505f910152565b602081525f8251806020840152614fb9816040850160208701614f79565b601f01601f19169190910160400192915050565b5f60208284031215614fdd575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f8261501257634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215615027575f80fd5b8135611ef681614f27565b5f808335601e19843603018112615047575f80fd5b8301803591506001600160401b03821115615060575f80fd5b6020019150600581901b36038213156139f3575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261509f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156150df576150df6150a9565b60405290565b604051601f8201601f191681016001600160401b038111828210171561510d5761510d6150a9565b604052919050565b5f6001600160401b0382111561512d5761512d6150a9565b50601f01601f191660200190565b5f6060823603121561514b575f80fd5b6151536150bd565b823581526020615164818501614d9f565b8183015260408401356001600160401b03811115615180575f80fd5b840136601f820112615190575f80fd5b80356151a361519e82615115565b6150e5565b81815236848385010111156151b6575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f825161509f818460208701614f79565b808201808211156106bb576106bb614fe4565b5f63ffffffff80831681810361520e5761520e614fe4565b6001019392505050565b80820281158282048414176106bb576106bb614fe4565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b600181811c9082168061528157607f821691505b60208210810361529f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546152b78161526d565b806020870152604060018084165f81146152d857600181146152f457615321565b60ff19851660408a0152604084151560051b8a01019550615321565b895f5260205f205f5b858110156153185781548b82018601529083019088016152fd565b8a016040019650505b509398975050505050505050565b6001600160401b038281168282160390808211156129bb576129bb614fe4565b8051614c9881614c78565b5f806040838503121561536b575f80fd5b82516001600160401b0380821115615381575f80fd5b9084019060608287031215615394575f80fd5b61539c6150bd565b825181526020808401516153af81614f27565b828201526040840151838111156153c4575f80fd5b80850194505087601f8501126153d8575f80fd5b835192506153e861519e84615115565b83815288828587010111156153fb575f80fd5b61540a84838301848801614f79565b8060408401525081955061541f81880161534f565b9450505050509250929050565b6001600160401b038181168382160190808211156129bb576129bb614fe4565b818103818111156106bb576106bb614fe4565b5f808335601e19843603018112615474575f80fd5b8301803591506001600160401b0382111561548d575f80fd5b6020019150368190038213156139f3575f80fd5b6001600160401b038181168382160280821691908281146154c4576154c4614fe4565b505092915050565b601f8211156104be57805f5260205f20601f840160051c810160208510156154f15750805b601f840160051c820191505b81811015610766575f81556001016154fd565b81516001600160401b03811115615529576155296150a9565b61553d81615537845461526d565b846154cc565b602080601f831160018114615570575f84156155595750858301515b5f19600386901b1c1916600185901b1785556155c7565b5f85815260208120601f198616915b8281101561559e5788860151825594840194600190910190840161557f565b50858210156155bb57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b5f602082840312156155df575f80fd5b611ef682614eb1565b5f602082840312156155f8575f80fd5b813560ff81168114611ef6575f80fd5b5f6001600160401b0380831681810361520e5761520e614fe4565b5f60208284031215615633575f80fd5b8151611ef681614c78565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161569381604e860160208901614f79565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -782,6 +782,27 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) EndD return _ERC20TokenStakingManager.Contract.EndDelegationCompletedValidator(&_ERC20TokenStakingManager.TransactOpts, delegationID) } +// ForceInitializeEndDelegation is a paid mutator transaction binding the contract method 0x1ec44724. +// +// Solidity: function forceInitializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) ForceInitializeEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.contract.Transact(opts, "forceInitializeEndDelegation", delegationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndDelegation is a paid mutator transaction binding the contract method 0x1ec44724. +// +// Solidity: function forceInitializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) ForceInitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ForceInitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndDelegation is a paid mutator transaction binding the contract method 0x1ec44724. +// +// Solidity: function forceInitializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) ForceInitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _ERC20TokenStakingManager.Contract.ForceInitializeEndDelegation(&_ERC20TokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) +} + // ForceInitializeEndValidation is a paid mutator transaction binding the contract method 0x3a1cfff6. // // Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index a2b6dc0cd..3dfa6f796 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -82,8 +82,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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161559138038061559183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154448061014d5f395ff3fe6080604052600436106101d0575f3560e01c806366435abf116100fd578063b771b3bc11610092578063c974d1b611610062578063c974d1b61461053f578063d5f20ff614610553578063df93d8de1461057f578063e7d14c1c14610595575f80fd5b8063b771b3bc146104d4578063ba3a4b97146104ee578063bee0a03f1461050d578063c599e24f1461052c575f80fd5b806393e24598116100cd57806393e245981461045857806398f3e2b4146104775780639dde029a14610496578063a3a65e48146104b5575f80fd5b806366435abf146103f3578063732214f81461041257806376f78621146104255780638280a25a14610444575f80fd5b806335455ded116101735780635297fae6116101435780635297fae61461036d57806360305d621461038c57806361e2f490146103b557806362065856146103d4575f80fd5b806335455ded146102e65780633a1cfff61461030e57806340034a931461032d578063467ef06f1461034e575f80fd5b806320e55565116101ae57806320e555651461023f57806325e1c7761461025e5780632e2194d81461027d578063329c3e12146102b4575f80fd5b80630118acc4146101d45780630322ed98146101f5578063151d30d114610214575b5f80fd5b3480156101df575f80fd5b506101f36101ee3660046149fd565b6105df565b005b348015610200575f80fd5b506101f361020f366004614a38565b610989565b34801561021f575f80fd5b50610228600a81565b60405160ff90911681526020015b60405180910390f35b34801561024a575f80fd5b506101f3610259366004614a4f565b610afb565b348015610269575f80fd5b506101f3610278366004614a66565b610bd8565b348015610288575f80fd5b5061029c610297366004614a38565b610c48565b6040516001600160401b039091168152602001610236565b3480156102bf575f80fd5b506102ce6001600160991b0181565b6040516001600160a01b039091168152602001610236565b3480156102f1575f80fd5b506102fb61271081565b60405161ffff9091168152602001610236565b348015610319575f80fd5b506101f36103283660046149fd565b610c5e565b61034061033b366004614ab7565b610c69565b604051908152602001610236565b348015610359575f80fd5b506101f3610368366004614b0b565b610c9d565b348015610378575f80fd5b506101f3610387366004614b24565b610d3e565b348015610397575f80fd5b506103a0601481565b60405163ffffffff9091168152602001610236565b3480156103c0575f80fd5b506101f36103cf366004614b4c565b611111565b3480156103df575f80fd5b506103406103ee366004614b91565b611590565b3480156103fe575f80fd5b5061029c61040d366004614a38565b6115a9565b34801561041d575f80fd5b506103405f81565b348015610430575f80fd5b506101f361043f3660046149fd565b6115bd565b34801561044f575f80fd5b50610228603081565b348015610463575f80fd5b506101f3610472366004614a38565b6115e5565b348015610482575f80fd5b506101f3610491366004614b24565b61169c565b3480156104a1575f80fd5b506101f36104b0366004614a38565b61182e565b3480156104c0575f80fd5b506101f36104cf366004614b0b565b611aa6565b3480156104df575f80fd5b506102ce6005600160991b0181565b3480156104f9575f80fd5b506101f3610508366004614a38565b611c13565b348015610518575f80fd5b506101f3610527366004614a38565b611def565b61034061053a366004614a38565b611f14565b34801561054a575f80fd5b50610228601481565b34801561055e575f80fd5b5061057261056d366004614a38565b611f45565b6040516102369190614bbe565b34801561058a575f80fd5b5061029c6202a30081565b3480156105a0575f80fd5b506103406105af366004614a38565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b5f8381525f805160206153988339815191526020526040808220815160e0810190925280545f805160206153b883398151915293929190829060ff16600381111561062c5761062c614baa565b600381111561063d5761063d614baa565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6106b382611f45565b90506002835160038111156106ca576106ca614baa565b146106e85760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b031633146107155760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f8060028351600581111561073357610733614baa565b0361078457871561074b57610748848861200d565b91505b5f856060015184608001516107609190614c81565b905061076c858261226e565b506001600160401b031660c0870152504290506107b9565b50505f82815260048501602052604090206001015460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601516001600160a01b039091169063778c06b5906107de90611590565b8560a00151886080015185875f806040518863ffffffff1660e01b815260040161080e9796959493929190614ca1565b602060405180830381865afa158015610829573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084d9190614cdf565b5f8a8152600688016020908152604080832093909355600589019052208551815487929190829060ff1916600183600381111561088c5761088c614baa565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555184908a907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69906109769085906001600160401b0391909116815260200190565b60405180910390a3505050505050505050565b5f8181525f805160206154188339815191526020526040808220815160e0810190925280545f805160206153d883398151915293929190829060ff1660058111156109d6576109d6614baa565b60058111156109e7576109e7614baa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610a5657610a56614baa565b14610a745760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb610a998584606001515f6123c5565b6040518263ffffffff1660e01b8152600401610ab59190614d18565b6020604051808303815f875af1158015610ad1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af59190614cdf565b50505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610b44575080546001600160401b03808416911610155b15610b625760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610b8c83612414565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610be182612425565b610bfe57604051636ca57bcf60e01b815260040160405180910390fd5b6002610c0983611f45565b516005811115610c1b57610c1b614baa565b14610c395760405163a36c527f60e01b815260040160405180910390fd5b610c43828261200d565b505050565b5f610c5864e8d4a5100083614d4a565b92915050565b610af5838383612460565b5f610c72612634565b610c7e8484843461266b565b9050610c9660015f805160206153f883398151915255565b9392505050565b5f805160206153b88339815191525f80610cb684612839565b91509150610cc382612425565b610ccd5750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610cfc57610cfc614baa565b03610d21575f83815260078501602052604081208054919055610d1f8282612ac9565b505b610d3781610d328460400151611590565b612b2f565b5050505050565b5f8181525f805160206153988339815191526020526040808220815160e0810190925280545f805160206153b883398151915293929190829060ff166003811115610d8b57610d8b614baa565b6003811115610d9c57610d9c614baa565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610e1390611f45565b905060015f85815260058501602052604090205460ff166003811115610e3b57610e3b614baa565b14610e595760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610e6e57610e6e614baa565b03610fb757600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610ec857610ec8614baa565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610fcc57610fcc614baa565b03610fda57610d3784612b42565b5f80610ff1610fe888612d1f565b60400151612e1f565b50915091508184604001511461101a57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b0316108061106257505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b1561108057604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206153d88339815191529060ff161561116357604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111a6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ca9190614cdf565b8360200135146111ed5760405163d040949d60e01b815260040160405180910390fd5b306111fe6060850160408601614d7d565b6001600160a01b0316146112255760405163e6c4247b60e01b815260040160405180910390fd5b5f6112336060850185614d98565b905090505f805b828163ffffffff1610156114df575f6112566060880188614d98565b8363ffffffff1681811061126c5761126c614ddd565b905060200281019061127e9190614df1565b61128790614ea1565b80515f81815260088801602052604090205491925090156112bb57604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f0135856040516020016112ea92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261130491614f38565b602060405180830381855afa15801561131f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906113429190614cdf565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156113ce576113ce614baa565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611481911686614f49565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806114d890614f5c565b905061123a565b50600483018190555f6114fd6114f486612d1f565b6040015161305d565b90505f611509876131d2565b90508160028260405161151c9190614f38565b602060405180830381855afa158015611537573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061155a9190614cdf565b1461157857604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f610c586001600160401b03831664e8d4a51000614f7e565b5f6115b382611f45565b6080015192915050565b6115c8838383612460565b610c435760405163d802b9f360e01b815260040160405180910390fd5b5f805160206153b883398151915260046115fe83611f45565b51600581111561161057611610614baa565b1461162e5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b031633146116665760405163e6c4247b60e01b815260040160405180910390fd5b5f82815260078201602090815260408083208054908490556004850190925290912054610c43906001600160a01b031682612ac9565b6116a4612634565b5f8181525f805160206153988339815191526020526040808220815160e0810190925280545f805160206153b883398151915293929190829060ff1660038111156116f1576116f1614baa565b600381111561170257611702614baa565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f80611774610fe887612d1f565b50915091508183604001511461179d57604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b031611156117d457604051633ab3447f60e11b815260040160405180910390fd5b6003835160038111156117e9576117e9614baa565b146118075760405163f95c7fe160e01b815260040160405180910390fd5b61181085612b42565b5050505061182a60015f805160206153f883398151915255565b5050565b611836612634565b5f8181525f805160206153988339815191526020526040808220815160e0810190925280545f805160206153b883398151915293929190829060ff16600381111561188357611883614baa565b600381111561189457611894614baa565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61190a82611f45565b90505f8351600381111561192057611920614baa565b0361193e57604051631d0b665760e21b815260040160405180910390fd5b60048151600581111561195357611953614baa565b146119715760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561198657611986614baa565b0361199d5761199485612b42565b50505050611a8d565b6002835160038111156119b2576119b2614baa565b03611a7f57600384015460608401516001600160a01b039091169063778c06b5906119dc90611590565b60a0840151608087015160c08601515f8881526004808c0160205260408083206001015490516001600160e01b031960e08a901b168152611a2f97969594936001600160401b0390921692829101614ca1565b602060405180830381865afa158015611a4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a6e9190614cdf565b5f8681526006860160205260409020555b611a8885612b42565b505050505b611aa360015f805160206153f883398151915255565b50565b5f805160206153d88339815191525f80611acb611ac285612d1f565b6040015161366b565b9150915080611aed57604051633dbcaef760e01b815260040160405180910390fd5b5f82815260068401602052604090208054611b0790614f95565b90505f03611b2857604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff166005811115611b4e57611b4e614baa565b14611b6c5760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006840160205260408120611b8491614952565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206153988339815191526020526040808220815160e0810190925280545f805160206153b883398151915293929190829060ff166003811115611c6057611c60614baa565b6003811115611c7157611c71614baa565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611cea57611cea614baa565b14158015611d0b5750600381516003811115611d0857611d08614baa565b14155b15611d295760405163f95c7fe160e01b815260040160405180910390fd5b5f611d378260400151611f45565b905080606001516001600160401b03165f03611d6657604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611d938460400151846060015185608001516123c5565b6040518263ffffffff1660e01b8152600401611daf9190614d18565b6020604051808303815f875af1158015611dcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d379190614cdf565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206153d88339815191529190611e3690614f95565b90505f03611e5757604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611e7d57611e7d614baa565b14611e9b5760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611ed49190600401614fc7565b6020604051808303815f875af1158015611ef0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c439190614cdf565b5f611f1d612634565b611f2882333461380f565b9050611f4060015f805160206153f883398151915255565b919050565b611f4d614989565b5f8281525f80516020615418833981519152602052604090819020815160e0810190925280545f805160206153d8833981519152929190829060ff166005811115611f9a57611f9a614baa565b6005811115611fab57611fab614baa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612058573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261207f919081019061505c565b91509150806120a157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156120e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121089190614cdf565b8251146121285760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156121545760405163e6c4247b60e01b815260040160405180910390fd5b5f806121638460400151613ad3565b9150915081871461218757604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f805160206153b8833981519152906001600160401b039081169083161115612244575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612263565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f8281525f80516020615418833981519152602052604081206002015481905f805160206153d883398151915290600160801b90046001600160401b03166122b68582613cae565b5f6122c087613e77565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123108a858b6123c5565b6040518263ffffffff1660e01b815260040161232c9190614d18565b6020604051808303815f875af1158015612348573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061236c9190614cdf565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b61241c613eec565b611aa381613f37565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b5f5f805160206153b88339815191528161247986613fa5565b905061248486612425565b61249357600192505050610c96565b5f8681526004830160205260409020546001600160a01b031633146124cb5760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a08201516124fa91600160b01b90046001600160401b03169061512e565b6001600160401b03168160c001516001600160401b03161015612530576040516302336bad60e51b815260040160405180910390fd5b5f851561254857612541878661200d565b9050612566565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061258b90611590565b60a086015160c08701516040516001600160e01b031960e086901b1681526125bf939291829189905f908190600401614ca1565b602060405180830381865afa1580156125da573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125fe9190614cdf565b905080846007015f8a81526020019081526020015f205f8282546126229190614f49565b90915550501515979650505050505050565b5f805160206153f883398151915280546001190161266557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206153b883398151915290600160401b900461ffff90811690861610806126bf575061271061ffff8616115b156126dd5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561270f576040516302336bad60e51b815260040160405180910390fd5b80548310806127215750806001015483115b1561273f57604051630103be3b60e21b815260040160405180910390fd5b825f61274a82610c48565b90505f61275789836141e2565b9050604051806080016040528061276b3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b60015f805160206153f883398151915255565b5f612842614989565b5f805160206153d88339815191525f8061285e611ac287612d1f565b91509150801561288157604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128b2576128b2614baa565b60058111156128c3576128c3614baa565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561293257612932614baa565b14158015612953575060018151600581111561295057612950614baa565b14155b156129715760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561298657612986614baa565b036129945760048152612999565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff191660018360058111156129de576129de614baa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612a9257612a92614baa565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612b15575f80fd5b505af1158015612b27573d5f803e3d5ffd5b505050505050565b61182a6001600160a01b038316826145cc565b5f8181525f805160206153988339815191526020526040808220815160e0810190925280545f805160206153b883398151915293929190829060ff166003811115612b8f57612b8f614baa565b6003811115612ba057612ba0614baa565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612c7590600160a01b900461ffff1684614f7e565b612c7f9190614d4a565b905080856007015f8581526020019081526020015f205f828254612ca39190614f49565b909155505f9050612cb4828461514e565b9050612cc4856020015182612ac9565b612cd98560200151610d328760600151611590565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612d83573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612daa919081019061505c565b9150915080612dcc57604051636b2f19e960e01b815260040160405180910390fd5b815115612dec5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612e185760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612e4457604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612e9357612e5b81600161514e565b612e66906008614f7e565b61ffff16868281518110612e7c57612e7c614ddd565b016020015160f81c901b9190911790600101612e47565b5061ffff811615612eb75760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612f1257612ece81600361514e565b612ed9906008614f7e565b63ffffffff1687612eeb836002614f49565b81518110612efb57612efb614ddd565b016020015160f81c901b9190911790600101612eba565b5063ffffffff8116600414612f3a57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f8f57612f5181601f61514e565b612f5c906008614f7e565b88612f68836006614f49565b81518110612f7857612f78614ddd565b016020015160f81c901b9190911790600101612f3d565b505f805b6008811015612fee57612fa781600761514e565b612fb2906008614f7e565b6001600160401b031689612fc7836026614f49565b81518110612fd757612fd7614ddd565b016020015160f81c901b9190911790600101612f93565b505f805b600881101561304d5761300681600761514e565b613011906008614f7e565b6001600160401b03168a61302683602e614f49565b8151811061303657613036614ddd565b016020015160f81c901b9190911790600101612ff2565b5091989097509095509350505050565b5f815160261461308057604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156130cf5761309781600161514e565b6130a2906008614f7e565b61ffff168482815181106130b8576130b8614ddd565b016020015160f81c901b9190911790600101613083565b5061ffff8116156130f35760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561314e5761310a81600361514e565b613115906008614f7e565b63ffffffff1685613127836002614f49565b8151811061313757613137614ddd565b016020015160f81c901b91909117906001016130f6565b5063ffffffff81161561317457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131c95761318b81601f61514e565b613196906008614f7e565b866131a2836006614f49565b815181106131b2576131b2614ddd565b016020015160f81c901b9190911790600101613177565b50949350505050565b60605f6131e183830184614d98565b6131ed91506058614f7e565b6131f890605c614f49565b6001600160401b0381111561320f5761320f614e0f565b6040519080825280601f01601f191660200182016040528015613239576020820181803683370190505b5090505f5b602081101561328e578335816020811061325a5761325a614ddd565b1a60f81b82828151811061327057613270614ddd565b60200101906001600160f81b03191690815f1a90535060010161323e565b505f5b60208110156132ee57836020013581602081106132b0576132b0614ddd565b1a60f81b826132c0836020614f49565b815181106132d0576132d0614ddd565b60200101906001600160f81b03191690815f1a905350600101613291565b505f5b60048110156133515761330581600361514e565b613310906008614f7e565b6014901c60f81b82613323836040614f49565b8151811061333357613333614ddd565b60200101906001600160f81b03191690815f1a9053506001016132f1565b505f6133636060850160408601614d7d565b60601b90505f5b60148110156133c35781816014811061338557613385614ddd565b1a60f81b83613395836044614f49565b815181106133a5576133a5614ddd565b60200101906001600160f81b03191690815f1a90535060010161336a565b505f6133d26060860186614d98565b905090505f5b600481101561343d576133ec81600361514e565b6133f7906008614f7e565b63ffffffff8316901c60f81b8461340f836058614f49565b8151811061341f5761341f614ddd565b60200101906001600160f81b03191690815f1a9053506001016133d8565b505f5b61344d6060870187614d98565b9050811015613661575f613462826058614f7e565b61346d90605c614f49565b90505f5b60208110156134f8576134876060890189614d98565b8481811061349757613497614ddd565b90506020028101906134a99190614df1565b3581602081106134bb576134bb614ddd565b1a60f81b866134ca8385614f49565b815181106134da576134da614ddd565b60200101906001600160f81b03191690815f1a905350600101613471565b505f5b60088110156135ad5761350f81600761514e565b61351a906008614f7e565b61352760608a018a614d98565b8581811061353757613537614ddd565b90506020028101906135499190614df1565b61355a906040810190602001614b91565b6001600160401b0316901c60f81b8682613575856020614f49565b61357f9190614f49565b8151811061358f5761358f614ddd565b60200101906001600160f81b03191690815f1a9053506001016134fb565b505f5b6030811015613657576135c66060890189614d98565b848181106135d6576135d6614ddd565b90506020028101906135e89190614df1565b6135f6906040810190615161565b8281811061360657613606614ddd565b9050013560f81c60f81b868284602861361f9190614f49565b6136299190614f49565b8151811061363957613639614ddd565b60200101906001600160f81b03191690815f1a9053506001016135b0565b5050600101613440565b5091949350505050565b5f80825160271461368f57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156136de576136a681600161514e565b6136b1906008614f7e565b61ffff168582815181106136c7576136c7614ddd565b016020015160f81c901b9190911790600101613692565b5061ffff8116156137025760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561375d5761371981600361514e565b613724906008614f7e565b63ffffffff1686613736836002614f49565b8151811061374657613746614ddd565b016020015160f81c901b9190911790600101613705565b5063ffffffff811660031461378557604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156137da5761379c81601f61514e565b6137a7906008614f7e565b876137b3836006614f49565b815181106137c3576137c3614ddd565b016020015160f81c901b9190911790600101613788565b505f866026815181106137ef576137ef614ddd565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206153b88339815191528161382884610c48565b90505f61383487611f45565b905061383f87612425565b61385c57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561387157613871614baa565b1461388f5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516138a0919061512e565b905083600201600a9054906101000a90046001600160401b031682604001516138c991906151a3565b6001600160401b0316816001600160401b031611156138fb57604051630c192e7760e41b815260040160405180910390fd5b5f806139078a8461226e565b915091505f8a8360405160200161393592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156139c8576139c8614baa565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602e14613af757604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613b4657613b0e81600161514e565b613b19906008614f7e565b61ffff16858281518110613b2f57613b2f614ddd565b016020015160f81c901b9190911790600101613afa565b5061ffff811615613b6a5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613bc557613b8181600361514e565b613b8c906008614f7e565b63ffffffff1686613b9e836002614f49565b81518110613bae57613bae614ddd565b016020015160f81c901b9190911790600101613b6d565b5063ffffffff8116600514613bed57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c4257613c0481601f61514e565b613c0f906008614f7e565b87613c1b836006614f49565b81518110613c2b57613c2b614ddd565b016020015160f81c901b9190911790600101613bf0565b505f805b6008811015613ca157613c5a81600761514e565b613c65906008614f7e565b6001600160401b031688613c7a836026614f49565b81518110613c8a57613c8a614ddd565b016020015160f81c901b9190911790600101613c46565b5090969095509350505050565b5f805160206153d88339815191525f6001600160401b038084169085161115613ce257613cdb8385614c81565b9050613cef565b613cec8484614c81565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580613d51575060018401548151613d4d916001600160401b031690614f49565b8210155b15613d77576001600160401b038316606082015281815260408101516020820152613d96565b8281606001818151613d89919061512e565b6001600160401b03169052505b6060810151613da69060646151a3565b602082015160018601546001600160401b039290921691613dd19190600160401b900460ff16614f7e565b1015613df05760405163254d226960e01b815260040160405180910390fd5b856001600160401b031681604001818151613e0b9190614f49565b9052506040810180516001600160401b0387169190613e2b90839061514e565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206154188339815191526020526040812060020180545f805160206153d88339815191529190600890613ec190600160401b90046001600160401b03166151ce565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613f3557604051631afcd79f60e31b815260040160405180910390fd5b565b613f3f613eec565b613f4881614663565b613f5061467c565b611aa360608201356080830135613f6d60c0850160a08601614b91565b613f7d60e0860160c087016151e9565b613f8e610100870160e08801615202565b613fa061012088016101008901614d7d565b61468c565b613fad614989565b5f8281525f805160206154188339815191526020526040808220815160e0810190925280545f805160206153d883398151915293929190829060ff166005811115613ffa57613ffa614baa565b600581111561400b5761400b614baa565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c0909101529091508151600581111561407d5761407d614baa565b1461409b5760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff191660018360058111156140df576140df614baa565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61418b858261226e565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661422657604051637fab81e560e01b815260040160405180910390fd5b5f805160206153d8833981519152426142456040860160208701614b91565b6001600160401b031611158061427f57506142636202a30042614f49565b6142736040860160208701614b91565b6001600160401b031610155b1561429c5760405162d36c8560e81b815260040160405180910390fd5b60306142ab6040860186615161565b90501415806142b957508335155b156142d75760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561430757604051630eb0d31360e11b815260040160405180910390fd5b614311835f613cae565b5f806143aa6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906143559190614b91565b6001600160401b0316815260200161437060408a018a615161565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506147ad565b5f828152600686016020526040902091935091506143c88282615266565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90614406908590600401614d18565b6020604051808303815f875af1158015614422573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144469190614cdf565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156144be576144be614baa565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161459e918e01908e01614b91565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156145f35760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461463c576040519150601f19603f3d011682016040523d82523d5f602084013e614641565b606091505b5050905080610c4357604051630a12f52160e11b815260040160405180910390fd5b61466b613eec565b614673614870565b611aa381614878565b614684613eec565b613f3561494a565b614694613eec565b5f805160206153b883398151915261ffff841615806146b8575061271061ffff8516115b156146d65760405163c98d73a760e01b815260040160405180910390fd5b858711156146f757604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061470a5750600a60ff8416115b15614728576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146147d657604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016148089796959493929190615321565b60405160208183030381529060405290506002816040516148299190614f38565b602060405180830381855afa158015614844573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906148679190614cdf565b94909350915050565b613f35613eec565b614880613eec565b80355f805160206153d883398151915290815560146148a56060840160408501615202565b60ff1611806148c457506148bf6060830160408401615202565b60ff16155b156148e25760405163b4fa3fb360e01b815260040160405180910390fd5b6148f26060830160408401615202565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556149236040830160208401614b91565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612826613eec565b50805461495e90614f95565b5f825580601f1061496d575050565b601f0160209004905f5260205f2090810190611aa391906149c5565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b808211156149d9575f81556001016149c6565b5090565b8015158114611aa3575f80fd5b803563ffffffff81168114611f40575f80fd5b5f805f60608486031215614a0f575f80fd5b833592506020840135614a21816149dd565b9150614a2f604085016149ea565b90509250925092565b5f60208284031215614a48575f80fd5b5035919050565b5f6101208284031215614a60575f80fd5b50919050565b5f8060408385031215614a77575f80fd5b82359150614a87602084016149ea565b90509250929050565b803561ffff81168114611f40575f80fd5b80356001600160401b0381168114611f40575f80fd5b5f805f60608486031215614ac9575f80fd5b83356001600160401b03811115614ade575f80fd5b840160608187031215614aef575f80fd5b9250614afd60208501614a90565b9150614a2f60408501614aa1565b5f60208284031215614b1b575f80fd5b610c96826149ea565b5f8060408385031215614b35575f80fd5b614b3e836149ea565b946020939093013593505050565b5f8060408385031215614b5d575f80fd5b82356001600160401b03811115614b72575f80fd5b830160808186031215614b83575f80fd5b9150614a87602084016149ea565b5f60208284031215614ba1575f80fd5b610c9682614aa1565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614be157634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614c1c60608401826001600160401b03169052565b506080830151614c3760808401826001600160401b03169052565b5060a0830151614c5260a08401826001600160401b03169052565b5060c0830151612e1860c08401826001600160401b03169052565b634e487b7160e01b5f52601160045260245ffd5b6001600160401b03828116828216039080821115612e1857612e18614c6d565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b5f60208284031215614cef575f80fd5b5051919050565b5f5b83811015614d10578181015183820152602001614cf8565b50505f910152565b602081525f8251806020840152614d36816040850160208701614cf6565b601f01601f19169190910160400192915050565b5f82614d6457634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114611aa3575f80fd5b5f60208284031215614d8d575f80fd5b8135610c9681614d69565b5f808335601e19843603018112614dad575f80fd5b8301803591506001600160401b03821115614dc6575f80fd5b6020019150600581901b36038213156123be575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614e05575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614e4557614e45614e0f565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614e7357614e73614e0f565b604052919050565b5f6001600160401b03821115614e9357614e93614e0f565b50601f01601f191660200190565b5f60608236031215614eb1575f80fd5b614eb9614e23565b823581526020614eca818501614aa1565b8183015260408401356001600160401b03811115614ee6575f80fd5b840136601f820112614ef6575f80fd5b8035614f09614f0482614e7b565b614e4b565b8181523684838501011115614f1c575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614e05818460208701614cf6565b80820180821115610c5857610c58614c6d565b5f63ffffffff808316818103614f7457614f74614c6d565b6001019392505050565b8082028115828204841417610c5857610c58614c6d565b600181811c90821680614fa957607f821691505b602082108103614a6057634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614fd981614f95565b806020870152604060018084165f8114614ffa576001811461501657615043565b60ff19851660408a0152604084151560051b8a01019550615043565b895f5260205f205f5b8581101561503a5781548b820186015290830190880161501f565b8a016040019650505b509398975050505050505050565b8051611f40816149dd565b5f806040838503121561506d575f80fd5b82516001600160401b0380821115615083575f80fd5b9084019060608287031215615096575f80fd5b61509e614e23565b825181526020808401516150b181614d69565b828201526040840151838111156150c6575f80fd5b80850194505087601f8501126150da575f80fd5b835192506150ea614f0484614e7b565b83815288828587010111156150fd575f80fd5b61510c84838301848801614cf6565b80604084015250819550615121818801615051565b9450505050509250929050565b6001600160401b03818116838216019080821115612e1857612e18614c6d565b81810381811115610c5857610c58614c6d565b5f808335601e19843603018112615176575f80fd5b8301803591506001600160401b0382111561518f575f80fd5b6020019150368190038213156123be575f80fd5b6001600160401b038181168382160280821691908281146151c6576151c6614c6d565b505092915050565b5f6001600160401b03808316818103614f7457614f74614c6d565b5f602082840312156151f9575f80fd5b610c9682614a90565b5f60208284031215615212575f80fd5b813560ff81168114610c96575f80fd5b601f821115610c4357805f5260205f20601f840160051c810160208510156152475750805b601f840160051c820191505b81811015610d37575f8155600101615253565b81516001600160401b0381111561527f5761527f614e0f565b6152938161528d8454614f95565b84615222565b602080601f8311600181146152c6575f84156152af5750858301515b5f19600386901b1c1916600185901b178555612b27565b5f85815260208120601f198616915b828110156152f4578886015182559484019460019091019084016152d5565b508582101561531157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161537681604e860160208901614cf6565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"P_CHAIN_BLOCKCHAIN_ID\",\"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\":\"endDelegationCompletedValidator\",\"inputs\":[{\"name\":\"delegationID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"nonce\",\"type\":\"uint64\",\"indexed\":true,\"internalType\":\"uint64\"},{\"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\"},{\"name\":\"endTime\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"InitialValidatorCreated\",\"inputs\":[{\"name\":\"validationID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"name\":\"nodeID\",\"type\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidAddress\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidBlockchainID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidCodecID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationFee\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDelegatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidExpiry\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitialization\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInitializationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidInput\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageLength\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeAmount\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeDuration\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidStakeMultiplier\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSubnetConversionID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidationID\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidWarpMessage\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxChurnRateExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MaxWeightExceeded\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NodeAlreadyRegistered\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ReentrancyGuardReentrantCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UnexpectedRegistrationStatus\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorIneligibleForRewards\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ValidatorNotPoS\",\"inputs\":[]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516155f63803806155f683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6154a98061014d5f395ff3fe6080604052600436106101db575f3560e01c806366435abf116100fd578063b771b3bc11610092578063c974d1b611610062578063c974d1b614610569578063d5f20ff61461057d578063df93d8de146105a9578063e7d14c1c146105bf575f80fd5b8063b771b3bc146104fe578063ba3a4b9714610518578063bee0a03f14610537578063c599e24f14610556575f80fd5b806393e24598116100cd57806393e245981461048257806398f3e2b4146104a15780639dde029a146104c0578063a3a65e48146104df575f80fd5b806366435abf1461041d578063732214f81461043c57806376f786211461044f5780638280a25a1461046e575f80fd5b806335455ded116101735780635297fae6116101435780635297fae61461039757806360305d62146103b657806361e2f490146103df57806362065856146103fe575f80fd5b806335455ded146103105780633a1cfff61461033857806340034a9314610357578063467ef06f14610378575f80fd5b806320e55565116101ae57806320e555651461026957806325e1c776146102885780632e2194d8146102a7578063329c3e12146102de575f80fd5b80630118acc4146101df5780630322ed9814610200578063151d30d11461021f5780631ec447241461024a575b5f80fd5b3480156101ea575f80fd5b506101fe6101f9366004614a62565b610609565b005b34801561020b575f80fd5b506101fe61021a366004614a9d565b610638565b34801561022a575f80fd5b50610233600a81565b60405160ff90911681526020015b60405180910390f35b348015610255575f80fd5b506101fe610264366004614a62565b6107aa565b348015610274575f80fd5b506101fe610283366004614ab4565b6107b5565b348015610293575f80fd5b506101fe6102a2366004614acb565b610892565b3480156102b2575f80fd5b506102c66102c1366004614a9d565b6108fd565b6040516001600160401b039091168152602001610241565b3480156102e9575f80fd5b506102f86001600160991b0181565b6040516001600160a01b039091168152602001610241565b34801561031b575f80fd5b5061032561271081565b60405161ffff9091168152602001610241565b348015610343575f80fd5b506101fe610352366004614a62565b610913565b61036a610365366004614b1c565b61091e565b604051908152602001610241565b348015610383575f80fd5b506101fe610392366004614b70565b610952565b3480156103a2575f80fd5b506101fe6103b1366004614b89565b6109f3565b3480156103c1575f80fd5b506103ca601481565b60405163ffffffff9091168152602001610241565b3480156103ea575f80fd5b506101fe6103f9366004614bb1565b610dc6565b348015610409575f80fd5b5061036a610418366004614bf6565b611245565b348015610428575f80fd5b506102c6610437366004614a9d565b61125e565b348015610447575f80fd5b5061036a5f81565b34801561045a575f80fd5b506101fe610469366004614a62565b611272565b348015610479575f80fd5b50610233603081565b34801561048d575f80fd5b506101fe61049c366004614a9d565b61129a565b3480156104ac575f80fd5b506101fe6104bb366004614b89565b611351565b3480156104cb575f80fd5b506101fe6104da366004614a9d565b6114e3565b3480156104ea575f80fd5b506101fe6104f9366004614b70565b61175b565b348015610509575f80fd5b506102f86005600160991b0181565b348015610523575f80fd5b506101fe610532366004614a9d565b6118c8565b348015610542575f80fd5b506101fe610551366004614a9d565b611aa4565b61036a610564366004614a9d565b611bc9565b348015610574575f80fd5b50610233601481565b348015610588575f80fd5b5061059c610597366004614a9d565b611bfa565b6040516102419190614c23565b3480156105b4575f80fd5b506102c66202a30081565b3480156105ca575f80fd5b5061036a6105d9366004614a9d565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b610614838383611cc2565b5f0361063357604051637ca5e29d60e01b815260040160405180910390fd5b505050565b5f8181525f8051602061547d8339815191526020526040808220815160e0810190925280545f8051602061543d83398151915293929190829060ff16600581111561068557610685614c0f565b600581111561069657610696614c0f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561070557610705614c0f565b146107235760405163a36c527f60e01b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6107488584606001515f612072565b6040518263ffffffff1660e01b81526004016107649190614cf4565b6020604051808303815f875af1158015610780573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107a49190614d26565b50505050565b6107a4838383611cc2565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff16806107fe575080546001600160401b03808416911610155b1561081c5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610846836120c1565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b61089b826120d2565b6108b857604051636ca57bcf60e01b815260040160405180910390fd5b60026108c383611bfa565b5160058111156108d5576108d5614c0f565b146108f35760405163a36c527f60e01b815260040160405180910390fd5b610633828261210d565b5f61090d64e8d4a5100083614d51565b92915050565b6107a483838361236e565b5f610927612542565b61093384848434612579565b905061094b60015f8051602061545d83398151915255565b9392505050565b5f8051602061541d8339815191525f8061096b84612747565b91509150610978826120d2565b6109825750505050565b5f82815260048085016020526040909120546001600160a01b031690825160058111156109b1576109b1614c0f565b036109d6575f838152600785016020526040812080549190556109d482826129d7565b505b6109ec816109e78460400151611245565b612a3d565b5050505050565b5f8181525f805160206153fd8339815191526020526040808220815160e0810190925280545f8051602061541d83398151915293929190829060ff166003811115610a4057610a40614c0f565b6003811115610a5157610a51614c0f565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f90610ac890611bfa565b905060015f85815260058501602052604090205460ff166003811115610af057610af0614c0f565b14610b0e5760405163f95c7fe160e01b815260040160405180910390fd5b600381516005811115610b2357610b23614c0f565b03610c6c57600380835260c0828101516001600160401b039081166080860152606084015116908401525f8581526005850160205260409020835181548593839160ff1916906001908490811115610b7d57610b7d614c0f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b03909216919091021782556040808401516001840155606084015160029093018054608086015160a087015160c0978801516001600160401b039788166001600160801b031990941693909317600160401b92881692909202919091176001600160801b0316600160801b918716919091026001600160c01b031617600160c01b91861691909102179055858101519385015190519216825286917f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c69910160405180910390a35050505050565b600481516005811115610c8157610c81614c0f565b03610c8f576109ec84612a50565b5f80610ca6610c9d88612c2d565b60400151612d2d565b509150915081846040015114610ccf57604051636990657d60e01b815260040160405180910390fd5b806001600160401b031683606001516001600160401b03161080610d1757505f8681526005860160205260409020600201546001600160401b03808316600160801b90920416115b15610d3557604051633ab3447f60e11b815260040160405180910390fd5b5f868152600586016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160401b026fffffffffffffffff000000000000000019909316929092179092559251928352831691849189917f245fc69b36e168426e0306fc8d8300661b9af297c7958820dbf804f9f63e7064910160405180910390a450505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061543d8339815191529060ff1615610e1857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610e5b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e7f9190614d26565b836020013514610ea25760405163d040949d60e01b815260040160405180910390fd5b30610eb36060850160408601614d84565b6001600160a01b031614610eda5760405163e6c4247b60e01b815260040160405180910390fd5b5f610ee86060850185614d9f565b905090505f805b828163ffffffff161015611194575f610f0b6060880188614d9f565b8363ffffffff16818110610f2157610f21614de4565b9050602002810190610f339190614df8565b610f3c90614ea8565b80515f8181526008880160205260409020549192509015610f7057604051630eb0d31360e11b815260040160405180910390fd5b5f6002895f013585604051602001610f9f92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610fb991614f3f565b602060405180830381855afa158015610fd4573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ff79190614d26565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff1916600183600581111561108357611083614c0f565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611136911686614f50565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061118d90614f63565b9050610eef565b50600483018190555f6111b26111a986612c2d565b60400151612f6b565b90505f6111be876130e0565b9050816002826040516111d19190614f3f565b602060405180830381855afa1580156111ec573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061120f9190614d26565b1461122d57604051631e0e8fbd60e21b815260040160405180910390fd5b5050506009909101805460ff19166001179055505050565b5f61090d6001600160401b03831664e8d4a51000614f85565b5f61126882611bfa565b6080015192915050565b61127d83838361236e565b6106335760405163d802b9f360e01b815260040160405180910390fd5b5f8051602061541d83398151915260046112b383611bfa565b5160058111156112c5576112c5614c0f565b146112e35760405163a36c527f60e01b815260040160405180910390fd5b5f8281526004820160205260409020546001600160a01b0316331461131b5760405163e6c4247b60e01b815260040160405180910390fd5b5f82815260078201602090815260408083208054908490556004850190925290912054610633906001600160a01b0316826129d7565b611359612542565b5f8181525f805160206153fd8339815191526020526040808220815160e0810190925280545f8051602061541d83398151915293929190829060ff1660038111156113a6576113a6614c0f565b60038111156113b7576113b7614c0f565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290505f80611429610c9d87612c2d565b50915091508183604001511461145257604051636990657d60e01b815260040160405180910390fd5b806001600160401b03168360c001516001600160401b0316111561148957604051633ab3447f60e11b815260040160405180910390fd5b60038351600381111561149e5761149e614c0f565b146114bc5760405163f95c7fe160e01b815260040160405180910390fd5b6114c585612a50565b505050506114df60015f8051602061545d83398151915255565b5050565b6114eb612542565b5f8181525f805160206153fd8339815191526020526040808220815160e0810190925280545f8051602061541d83398151915293929190829060ff16600381111561153857611538614c0f565b600381111561154957611549614c0f565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6115bf82611bfa565b90505f835160038111156115d5576115d5614c0f565b036115f357604051631d0b665760e21b815260040160405180910390fd5b60048151600581111561160857611608614c0f565b146116265760405163a36c527f60e01b815260040160405180910390fd5b60018351600381111561163b5761163b614c0f565b036116525761164985612a50565b50505050611742565b60028351600381111561166757611667614c0f565b0361173457600384015460608401516001600160a01b039091169063778c06b59061169190611245565b60a0840151608087015160c08601515f8881526004808c0160205260408083206001015490516001600160e01b031960e08a901b1681526116e497969594936001600160401b0390921692829101614f9c565b602060405180830381865afa1580156116ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117239190614d26565b5f8681526006860160205260409020555b61173d85612a50565b505050505b61175860015f8051602061545d83398151915255565b50565b5f8051602061543d8339815191525f8061178061177785612c2d565b60400151613579565b91509150806117a257604051633dbcaef760e01b815260040160405180910390fd5b5f828152600684016020526040902080546117bc90614fda565b90505f036117dd57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078501602052604090205460ff16600581111561180357611803614c0f565b146118215760405163a36c527f60e01b815260040160405180910390fd5b5f8281526006840160205260408120611839916149b7565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206153fd8339815191526020526040808220815160e0810190925280545f8051602061541d83398151915293929190829060ff16600381111561191557611915614c0f565b600381111561192657611926614c0f565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561199f5761199f614c0f565b141580156119c057506003815160038111156119bd576119bd614c0f565b14155b156119de5760405163f95c7fe160e01b815260040160405180910390fd5b5f6119ec8260400151611bfa565b905080606001516001600160401b03165f03611a1b57604051631d0b665760e21b815260040160405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb611a48846040015184606001518560800151612072565b6040518263ffffffff1660e01b8152600401611a649190614cf4565b6020604051808303815f875af1158015611a80573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ec9190614d26565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061543d8339815191529190611aeb90614fda565b90505f03611b0c57604051636990657d60e01b815260040160405180910390fd5b60015f83815260078301602052604090205460ff166005811115611b3257611b32614c0f565b14611b505760405163a36c527f60e01b815260040160405180910390fd5b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611b89919060040161500c565b6020604051808303815f875af1158015611ba5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106339190614d26565b5f611bd2612542565b611bdd82333461371d565b9050611bf560015f8051602061545d83398151915255565b919050565b611c026149ee565b5f8281525f8051602061547d833981519152602052604090819020815160e0810190925280545f8051602061543d833981519152929190829060ff166005811115611c4f57611c4f614c0f565b6005811115611c6057611c60614c0f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f8381525f805160206153fd8339815191526020526040808220815160e0810190925280545f8051602061541d8339815191529284929091829060ff166003811115611d1057611d10614c0f565b6003811115611d2157611d21614c0f565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611d9782611bfa565b9050600283516003811115611dae57611dae614c0f565b14611dcc5760405163f95c7fe160e01b815260040160405180910390fd5b60208301516001600160a01b03163314611df95760405163e6c4247b60e01b815260040160405180910390fd5b600383819052505f80600283516005811115611e1757611e17614c0f565b03611e68578815611e2f57611e2c848961210d565b91505b5f85606001518460800151611e449190615096565b9050611e5085826139e1565b506001600160401b031660c087015250429050611e9d565b50505f82815260048501602052604090206001015460608201516001600160401b0390811660c0808701919091528301519116905b600386015460608601515f916001600160a01b03169063778c06b590611ec290611245565b8660a00151896080015186885f806040518863ffffffff1660e01b8152600401611ef29796959493929190614f9c565b602060405180830381865afa158015611f0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f319190614d26565b5f8c8152600689016020908152604080832084905560058b019091529020875181549293508892829060ff19166001836003811115611f7257611f72614c0f565b0217905550602082015181546001600160a01b0390911661010002610100600160a81b03199091161781556040808301516001830155606083015160029092018054608085015160a086015160c0909601516001600160401b03908116600160c01b026001600160c01b03978216600160801b02979097166001600160801b03928216600160401b026001600160801b031990941691909616179190911716929092179290921790555185908c907f5cd7ff518ea5cf079cc34b155d074410ae8c095910ebea921240641508658c699061205c9086906001600160401b0391909116815260200190565b60405180910390a39a9950505050505050505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b6120c9613b38565b61175881613b83565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612158573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261217f91908101906150c1565b91509150806121a157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122089190614d26565b8251146122285760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b0316156122545760405163e6c4247b60e01b815260040160405180910390fd5b5f806122638460400151613bf1565b9150915081871461228757604051636990657d60e01b815260040160405180910390fd5b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f8051602061541d833981519152906001600160401b039081169083161115612344575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612363565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f8051602061541d8339815191528161238786613dcc565b9050612392866120d2565b6123a15760019250505061094b565b5f8681526004830160205260409020546001600160a01b031633146123d95760405163e6c4247b60e01b815260040160405180910390fd5b5f86815260048301602052604090205460a082015161240891600160b01b90046001600160401b031690615193565b6001600160401b03168160c001516001600160401b0316101561243e576040516302336bad60e51b815260040160405180910390fd5b5f85156124565761244f878661210d565b9050612474565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061249990611245565b60a086015160c08701516040516001600160e01b031960e086901b1681526124cd939291829189905f908190600401614f9c565b602060405180830381865afa1580156124e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061250c9190614d26565b905080846007015f8a81526020019081526020015f205f8282546125309190614f50565b90915550501515979650505050505050565b5f8051602061545d83398151915280546001190161257357604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061541d83398151915290600160401b900461ffff90811690861610806125cd575061271061ffff8616115b156125eb5760405163c98d73a760e01b815260040160405180910390fd5b60028101546001600160401b03908116908516101561261d576040516302336bad60e51b815260040160405180910390fd5b805483108061262f5750806001015483115b1561264d57604051630103be3b60e21b815260040160405180910390fd5b825f612658826108fd565b90505f6126658983614009565b905060405180608001604052806126793390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b60015f8051602061545d83398151915255565b5f6127506149ee565b5f8051602061543d8339815191525f8061276c61177787612c2d565b91509150801561278f57604051633dbcaef760e01b815260040160405180910390fd5b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156127c0576127c0614c0f565b60058111156127d1576127d1614c0f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561284057612840614c0f565b14158015612861575060018151600581111561285e5761285e614c0f565b14155b1561287f5760405163a36c527f60e01b815260040160405180910390fd5b60038151600581111561289457612894614c0f565b036128a257600481526128a7565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff191660018360058111156128ec576128ec614c0f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129a0576129a0614c0f565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612a23575f80fd5b505af1158015612a35573d5f803e3d5ffd5b505050505050565b6114df6001600160a01b038316826143f3565b5f8181525f805160206153fd8339815191526020526040808220815160e0810190925280545f8051602061541d83398151915293929190829060ff166003811115612a9d57612a9d614c0f565b6003811115612aae57612aae614c0f565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870182528281208054908290558482526004880190925291822054939450919261271090612b8390600160a01b900461ffff1684614f85565b612b8d9190614d51565b905080856007015f8581526020019081526020015f205f828254612bb19190614f50565b909155505f9050612bc282846151b3565b9050612bd28560200151826129d7565b612be785602001516109e78760600151611245565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612c91573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612cb891908101906150c1565b9150915080612cda57604051636b2f19e960e01b815260040160405180910390fd5b815115612cfa5760405163d040949d60e01b815260040160405180910390fd5b60208201516001600160a01b031615612d265760405163e6c4247b60e01b815260040160405180910390fd5b5092915050565b5f805f8351603614612d5257604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612da157612d698160016151b3565b612d74906008614f85565b61ffff16868281518110612d8a57612d8a614de4565b016020015160f81c901b9190911790600101612d55565b5061ffff811615612dc55760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612e2057612ddc8160036151b3565b612de7906008614f85565b63ffffffff1687612df9836002614f50565b81518110612e0957612e09614de4565b016020015160f81c901b9190911790600101612dc8565b5063ffffffff8116600414612e4857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612e9d57612e5f81601f6151b3565b612e6a906008614f85565b88612e76836006614f50565b81518110612e8657612e86614de4565b016020015160f81c901b9190911790600101612e4b565b505f805b6008811015612efc57612eb58160076151b3565b612ec0906008614f85565b6001600160401b031689612ed5836026614f50565b81518110612ee557612ee5614de4565b016020015160f81c901b9190911790600101612ea1565b505f805b6008811015612f5b57612f148160076151b3565b612f1f906008614f85565b6001600160401b03168a612f3483602e614f50565b81518110612f4457612f44614de4565b016020015160f81c901b9190911790600101612f00565b5091989097509095509350505050565b5f8151602614612f8e57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612fdd57612fa58160016151b3565b612fb0906008614f85565b61ffff16848281518110612fc657612fc6614de4565b016020015160f81c901b9190911790600101612f91565b5061ffff8116156130015760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561305c576130188160036151b3565b613023906008614f85565b63ffffffff1685613035836002614f50565b8151811061304557613045614de4565b016020015160f81c901b9190911790600101613004565b5063ffffffff81161561308257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130d75761309981601f6151b3565b6130a4906008614f85565b866130b0836006614f50565b815181106130c0576130c0614de4565b016020015160f81c901b9190911790600101613085565b50949350505050565b60605f6130ef83830184614d9f565b6130fb91506058614f85565b61310690605c614f50565b6001600160401b0381111561311d5761311d614e16565b6040519080825280601f01601f191660200182016040528015613147576020820181803683370190505b5090505f5b602081101561319c578335816020811061316857613168614de4565b1a60f81b82828151811061317e5761317e614de4565b60200101906001600160f81b03191690815f1a90535060010161314c565b505f5b60208110156131fc57836020013581602081106131be576131be614de4565b1a60f81b826131ce836020614f50565b815181106131de576131de614de4565b60200101906001600160f81b03191690815f1a90535060010161319f565b505f5b600481101561325f576132138160036151b3565b61321e906008614f85565b6014901c60f81b82613231836040614f50565b8151811061324157613241614de4565b60200101906001600160f81b03191690815f1a9053506001016131ff565b505f6132716060850160408601614d84565b60601b90505f5b60148110156132d15781816014811061329357613293614de4565b1a60f81b836132a3836044614f50565b815181106132b3576132b3614de4565b60200101906001600160f81b03191690815f1a905350600101613278565b505f6132e06060860186614d9f565b905090505f5b600481101561334b576132fa8160036151b3565b613305906008614f85565b63ffffffff8316901c60f81b8461331d836058614f50565b8151811061332d5761332d614de4565b60200101906001600160f81b03191690815f1a9053506001016132e6565b505f5b61335b6060870187614d9f565b905081101561356f575f613370826058614f85565b61337b90605c614f50565b90505f5b6020811015613406576133956060890189614d9f565b848181106133a5576133a5614de4565b90506020028101906133b79190614df8565b3581602081106133c9576133c9614de4565b1a60f81b866133d88385614f50565b815181106133e8576133e8614de4565b60200101906001600160f81b03191690815f1a90535060010161337f565b505f5b60088110156134bb5761341d8160076151b3565b613428906008614f85565b61343560608a018a614d9f565b8581811061344557613445614de4565b90506020028101906134579190614df8565b613468906040810190602001614bf6565b6001600160401b0316901c60f81b8682613483856020614f50565b61348d9190614f50565b8151811061349d5761349d614de4565b60200101906001600160f81b03191690815f1a905350600101613409565b505f5b6030811015613565576134d46060890189614d9f565b848181106134e4576134e4614de4565b90506020028101906134f69190614df8565b6135049060408101906151c6565b8281811061351457613514614de4565b9050013560f81c60f81b868284602861352d9190614f50565b6135379190614f50565b8151811061354757613547614de4565b60200101906001600160f81b03191690815f1a9053506001016134be565b505060010161334e565b5091949350505050565b5f80825160271461359d57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156135ec576135b48160016151b3565b6135bf906008614f85565b61ffff168582815181106135d5576135d5614de4565b016020015160f81c901b91909117906001016135a0565b5061ffff8116156136105760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561366b576136278160036151b3565b613632906008614f85565b63ffffffff1686613644836002614f50565b8151811061365457613654614de4565b016020015160f81c901b9190911790600101613613565b5063ffffffff811660031461369357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156136e8576136aa81601f6151b3565b6136b5906008614f85565b876136c1836006614f50565b815181106136d1576136d1614de4565b016020015160f81c901b9190911790600101613696565b505f866026815181106136fd576136fd614de4565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f8051602061541d83398151915281613736846108fd565b90505f61374287611bfa565b905061374d876120d2565b61376a57604051636ca57bcf60e01b815260040160405180910390fd5b60028151600581111561377f5761377f614c0f565b1461379d5760405163a36c527f60e01b815260040160405180910390fd5b5f8282608001516137ae9190615193565b905083600201600a9054906101000a90046001600160401b031682604001516137d79190615208565b6001600160401b0316816001600160401b0316111561380957604051630c192e7760e41b815260040160405180910390fd5b5f806138158a846139e1565b915091505f8a8360405160200161384392919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156138d6576138d6614c0f565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f8051602061547d833981519152602052604081206002015481905f8051602061543d83398151915290600160801b90046001600160401b0316613a29858261448a565b5f613a3387614653565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb613a838a858b612072565b6040518263ffffffff1660e01b8152600401613a9f9190614cf4565b6020604051808303815f875af1158015613abb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613adf9190614d26565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613b8157604051631afcd79f60e31b815260040160405180910390fd5b565b613b8b613b38565b613b94816146c8565b613b9c6146e1565b61175860608201356080830135613bb960c0850160a08601614bf6565b613bc960e0860160c08701615233565b613bda610100870160e0880161524c565b613bec61012088016101008901614d84565b6146f1565b5f808251602e14613c1557604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613c6457613c2c8160016151b3565b613c37906008614f85565b61ffff16858281518110613c4d57613c4d614de4565b016020015160f81c901b9190911790600101613c18565b5061ffff811615613c885760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613ce357613c9f8160036151b3565b613caa906008614f85565b63ffffffff1686613cbc836002614f50565b81518110613ccc57613ccc614de4565b016020015160f81c901b9190911790600101613c8b565b5063ffffffff8116600514613d0b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613d6057613d2281601f6151b3565b613d2d906008614f85565b87613d39836006614f50565b81518110613d4957613d49614de4565b016020015160f81c901b9190911790600101613d0e565b505f805b6008811015613dbf57613d788160076151b3565b613d83906008614f85565b6001600160401b031688613d98836026614f50565b81518110613da857613da8614de4565b016020015160f81c901b9190911790600101613d64565b5090969095509350505050565b613dd46149ee565b5f8281525f8051602061547d8339815191526020526040808220815160e0810190925280545f8051602061543d83398151915293929190829060ff166005811115613e2157613e21614c0f565b6005811115613e3257613e32614c0f565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613ea457613ea4614c0f565b14613ec25760405163a36c527f60e01b815260040160405180910390fd5b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613f0657613f06614c0f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613fb285826139e1565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661404d57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061543d8339815191524261406c6040860160208701614bf6565b6001600160401b03161115806140a6575061408a6202a30042614f50565b61409a6040860160208701614bf6565b6001600160401b031610155b156140c35760405162d36c8560e81b815260040160405180910390fd5b60306140d260408601866151c6565b90501415806140e057508335155b156140fe5760405163b4fa3fb360e01b815260040160405180910390fd5b83355f9081526008820160205260409020541561412e57604051630eb0d31360e11b815260040160405180910390fd5b614138835f61448a565b5f806141d16040518060a00160405280855f01548152602001885f01358152602001876001600160401b0316815260200188602001602081019061417c9190614bf6565b6001600160401b0316815260200161419760408a018a6151c6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614812565b5f828152600686016020526040902091935091506141ef82826152b0565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb9061422d908590600401614cf4565b6020604051808303815f875af1158015614249573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061426d9190614d26565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156142e5576142e5614c0f565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b916143c5918e01908e01614bf6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b8047101561441a5760405163cd78605960e01b815230600482015260240160405180910390fd5b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614463576040519150601f19603f3d011682016040523d82523d5f602084013e614468565b606091505b505090508061063357604051630a12f52160e11b815260040160405180910390fd5b5f8051602061543d8339815191525f6001600160401b0380841690851611156144be576144b78385615096565b90506144cb565b6144c88484615096565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061452d575060018401548151614529916001600160401b031690614f50565b8210155b15614553576001600160401b038316606082015281815260408101516020820152614572565b82816060018181516145659190615193565b6001600160401b03169052505b6060810151614582906064615208565b602082015160018601546001600160401b0392909216916145ad9190600160401b900460ff16614f85565b10156145cc5760405163254d226960e01b815260040160405180910390fd5b856001600160401b0316816040018181516145e79190614f50565b9052506040810180516001600160401b03871691906146079083906151b3565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f8051602061547d8339815191526020526040812060020180545f8051602061543d833981519152919060089061469d90600160401b90046001600160401b031661536b565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6146d0613b38565b6146d86148d5565b611758816148dd565b6146e9613b38565b613b816149af565b6146f9613b38565b5f8051602061541d83398151915261ffff8416158061471d575061271061ffff8516115b1561473b5760405163c98d73a760e01b815260040160405180910390fd5b8587111561475c57604051630103be3b60e21b815260040160405180910390fd5b60ff8316158061476f5750600a60ff8416115b1561478d576040516373c01c8d60e01b815260040160405180910390fd5b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461483b57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161486d9796959493929190615386565b604051602081830303815290604052905060028160405161488e9190614f3f565b602060405180830381855afa1580156148a9573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906148cc9190614d26565b94909350915050565b613b81613b38565b6148e5613b38565b80355f8051602061543d833981519152908155601461490a606084016040850161524c565b60ff1611806149295750614924606083016040840161524c565b60ff16155b156149475760405163b4fa3fb360e01b815260040160405180910390fd5b614957606083016040840161524c565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556149886040830160208401614bf6565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612734613b38565b5080546149c390614fda565b5f825580601f106149d2575050565b601f0160209004905f5260205f20908101906117589190614a2a565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614a3e575f8155600101614a2b565b5090565b8015158114611758575f80fd5b803563ffffffff81168114611bf5575f80fd5b5f805f60608486031215614a74575f80fd5b833592506020840135614a8681614a42565b9150614a9460408501614a4f565b90509250925092565b5f60208284031215614aad575f80fd5b5035919050565b5f6101208284031215614ac5575f80fd5b50919050565b5f8060408385031215614adc575f80fd5b82359150614aec60208401614a4f565b90509250929050565b803561ffff81168114611bf5575f80fd5b80356001600160401b0381168114611bf5575f80fd5b5f805f60608486031215614b2e575f80fd5b83356001600160401b03811115614b43575f80fd5b840160608187031215614b54575f80fd5b9250614b6260208501614af5565b9150614a9460408501614b06565b5f60208284031215614b80575f80fd5b61094b82614a4f565b5f8060408385031215614b9a575f80fd5b614ba383614a4f565b946020939093013593505050565b5f8060408385031215614bc2575f80fd5b82356001600160401b03811115614bd7575f80fd5b830160808186031215614be8575f80fd5b9150614aec60208401614a4f565b5f60208284031215614c06575f80fd5b61094b82614b06565b634e487b7160e01b5f52602160045260245ffd5b815160e082019060068110614c4657634e487b7160e01b5f52602160045260245ffd5b80835250602083015160208301526001600160401b0360408401511660408301526060830151614c8160608401826001600160401b03169052565b506080830151614c9c60808401826001600160401b03169052565b5060a0830151614cb760a08401826001600160401b03169052565b5060c0830151612d2660c08401826001600160401b03169052565b5f5b83811015614cec578181015183820152602001614cd4565b50505f910152565b602081525f8251806020840152614d12816040850160208701614cd2565b601f01601f19169190910160400192915050565b5f60208284031215614d36575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f82614d6b57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b0381168114611758575f80fd5b5f60208284031215614d94575f80fd5b813561094b81614d70565b5f808335601e19843603018112614db4575f80fd5b8301803591506001600160401b03821115614dcd575f80fd5b6020019150600581901b3603821315613b31575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614e0c575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614e4c57614e4c614e16565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614e7a57614e7a614e16565b604052919050565b5f6001600160401b03821115614e9a57614e9a614e16565b50601f01601f191660200190565b5f60608236031215614eb8575f80fd5b614ec0614e2a565b823581526020614ed1818501614b06565b8183015260408401356001600160401b03811115614eed575f80fd5b840136601f820112614efd575f80fd5b8035614f10614f0b82614e82565b614e52565b8181523684838501011115614f23575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614e0c818460208701614cd2565b8082018082111561090d5761090d614d3d565b5f63ffffffff808316818103614f7b57614f7b614d3d565b6001019392505050565b808202811582820484141761090d5761090d614d3d565b9687526001600160401b03958616602088015293851660408701529184166060860152909216608084015260a083019190915260c082015260e00190565b600181811c90821680614fee57607f821691505b602082108103614ac557634e487b7160e01b5f52602260045260245ffd5b5f60208083525f845461501e81614fda565b806020870152604060018084165f811461503f576001811461505b57615088565b60ff19851660408a0152604084151560051b8a01019550615088565b895f5260205f205f5b8581101561507f5781548b8201860152908301908801615064565b8a016040019650505b509398975050505050505050565b6001600160401b03828116828216039080821115612d2657612d26614d3d565b8051611bf581614a42565b5f80604083850312156150d2575f80fd5b82516001600160401b03808211156150e8575f80fd5b90840190606082870312156150fb575f80fd5b615103614e2a565b8251815260208084015161511681614d70565b8282015260408401518381111561512b575f80fd5b80850194505087601f85011261513f575f80fd5b8351925061514f614f0b84614e82565b8381528882858701011115615162575f80fd5b61517184838301848801614cd2565b806040840152508195506151868188016150b6565b9450505050509250929050565b6001600160401b03818116838216019080821115612d2657612d26614d3d565b8181038181111561090d5761090d614d3d565b5f808335601e198436030181126151db575f80fd5b8301803591506001600160401b038211156151f4575f80fd5b602001915036819003821315613b31575f80fd5b6001600160401b0381811683821602808216919082811461522b5761522b614d3d565b505092915050565b5f60208284031215615243575f80fd5b61094b82614af5565b5f6020828403121561525c575f80fd5b813560ff8116811461094b575f80fd5b601f82111561063357805f5260205f20601f840160051c810160208510156152915750805b601f840160051c820191505b818110156109ec575f815560010161529d565b81516001600160401b038111156152c9576152c9614e16565b6152dd816152d78454614fda565b8461526c565b602080601f831160018114615310575f84156152f95750858301515b5f19600386901b1c1916600185901b178555612a35565b5f85815260208120601f198616915b8281101561533e5788860151825594840194600190910190840161531f565b508582101561535b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160401b03808316818103614f7b57614f7b614d3d565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b16604684015284516153db81604e860160208901614cd2565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -813,6 +813,27 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) En return _NativeTokenStakingManager.Contract.EndDelegationCompletedValidator(&_NativeTokenStakingManager.TransactOpts, delegationID) } +// ForceInitializeEndDelegation is a paid mutator transaction binding the contract method 0x1ec44724. +// +// Solidity: function forceInitializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) ForceInitializeEndDelegation(opts *bind.TransactOpts, delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.contract.Transact(opts, "forceInitializeEndDelegation", delegationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndDelegation is a paid mutator transaction binding the contract method 0x1ec44724. +// +// Solidity: function forceInitializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) ForceInitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ForceInitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) +} + +// ForceInitializeEndDelegation is a paid mutator transaction binding the contract method 0x1ec44724. +// +// Solidity: function forceInitializeEndDelegation(bytes32 delegationID, bool includeUptimeProof, uint32 messageIndex) returns() +func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) ForceInitializeEndDelegation(delegationID [32]byte, includeUptimeProof bool, messageIndex uint32) (*types.Transaction, error) { + return _NativeTokenStakingManager.Contract.ForceInitializeEndDelegation(&_NativeTokenStakingManager.TransactOpts, delegationID, includeUptimeProof, messageIndex) +} + // ForceInitializeEndValidation is a paid mutator transaction binding the contract method 0x3a1cfff6. // // Solidity: function forceInitializeEndValidation(bytes32 validationID, bool includeUptimeProof, uint32 messageIndex) returns() diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 27e4a7240..eee9c17ba 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -81,6 +81,7 @@ abstract contract PoSValidatorManager is error InvalidStakeAmount(); error InvalidStakeMultiplier(); error ValidatorIneligibleForRewards(); + error DelegatorIneligibleForRewards(); // solhint-disable ordering function _getPoSValidatorManagerStorage() @@ -512,6 +513,25 @@ abstract contract PoSValidatorManager is bool includeUptimeProof, uint32 messageIndex ) external { + if (_initializeEndDelegation(delegationID, includeUptimeProof, messageIndex) == 0) { + revert DelegatorIneligibleForRewards(); + } + } + + function forceInitializeEndDelegation( + bytes32 delegationID, + bool includeUptimeProof, + uint32 messageIndex + ) external { + // Ignore the return value here to force end delegation, regardless of possible missed rewards + _initializeEndDelegation(delegationID, includeUptimeProof, messageIndex); + } + + function _initializeEndDelegation( + bytes32 delegationID, + bool includeUptimeProof, + uint32 messageIndex + ) internal returns (uint256) { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); Delegator memory delegator = $._delegatorStakes[delegationID]; @@ -553,7 +573,7 @@ abstract contract PoSValidatorManager is delegationEndTime = validator.endedAt; } - $._redeemableDelegatorRewards[delegationID] = $._rewardCalculator.calculateReward({ + uint256 reward = $._rewardCalculator.calculateReward({ stakeAmount: weightToValue(delegator.weight), validatorStartTime: validator.startedAt, stakingStartTime: delegator.startedAt, @@ -562,7 +582,7 @@ abstract contract PoSValidatorManager is initialSupply: 0, endSupply: 0 }); - + $._redeemableDelegatorRewards[delegationID] = reward; $._delegatorStakes[delegationID] = delegator; emit DelegatorRemovalInitialized({ @@ -570,6 +590,8 @@ abstract contract PoSValidatorManager is validationID: validationID, endTime: delegationEndTime }); + + return reward; } /** diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index 97f4ca531..f9dc480fe 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -170,15 +170,16 @@ interface IPoSValidatorManager is IValidatorManager { function endDelegationCompletedValidator(bytes32 delegationID) external; /** - * @notice Begins the process of removing a delegator from a validation period. 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. In order to be eligible for rewards, an uptime proof must be provided. + * @notice Begins the process of removing a delegator from a validation period, and reverts if the delegation is not eligible for rewards. + * 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. * @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} * will be ignored and can be set to false. If the validator has not completed its validation period and no uptime proof - * is provided, the validation uptime for the delegation period will be assumed to be 0. + * is provided, the latest known uptime will be used. * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the * uptime proof. */ @@ -188,6 +189,26 @@ interface IPoSValidatorManager is IValidatorManager { uint32 messageIndex ) external; + /** + * @notice Begins the process of removing a delegator from a validation period, but does not revert if the delegation is not eligible for rewards. + * 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. + * @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} + * will be ignored and can be set to false. If the validator has not completed its validation period and no uptime proof + * is provided, the latest known uptime will be used. + * @param messageIndex If {includeUptimeProof} is true, the index of the Warp message to be received providing the + * uptime proof. + */ + function forceInitializeEndDelegation( + bytes32 delegationID, + bool includeUptimeProof, + uint32 messageIndex + ) external; + /** * @notice Resubmits a delegator registration or delegator end message to be sent to the P-Chain. * Only necessary if the original message can't be delivered due to validator churn. diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 6b621b0ed..8d200a7db 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -355,7 +355,53 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2 + expectedNonce: 2, + includeUptime: true, + force: false + }); + } + + function testInitializeEndDelegationInsufficientUptime() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + vm.expectRevert(PoSValidatorManager.DelegatorIneligibleForRewards.selector); + vm.warp(DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP); + vm.prank(DEFAULT_DELEGATOR_ADDRESS); + posValidatorManager.initializeEndDelegation(delegationID, false, 0); + } + + function testForceInitializeEndDelegation() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _initializeEndDelegationValidatorActiveWithChecks({ + validationID: validationID, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2, + includeUptime: true, + force: true + }); + } + + function testForceInitializeEndDelegationInsufficientUptime() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _initializeEndDelegationValidatorActiveWithChecks({ + validationID: validationID, + delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2, + includeUptime: false, + force: true }); } @@ -370,7 +416,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2 + expectedNonce: 2, + includeUptime: true, + force: false }); bytes memory setValidatorWeightPayload = ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); @@ -408,7 +456,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: delgationEndTime, expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 2 + expectedNonce: 2, + includeUptime: true, + force: false }); uint256 expectedTotalReward = rewardCalculator.calculateReward({ @@ -467,7 +517,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 3 + expectedNonce: 3, + includeUptime: true, + force: false }); _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, @@ -476,7 +528,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 4 + expectedNonce: 4, + includeUptime: true, + force: false }); // Complete ending delegator2 with delegator1's nonce @@ -525,7 +579,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { startDelegationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, - expectedNonce: 3 + expectedNonce: 3, + includeUptime: true, + force: false }); _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, @@ -534,7 +590,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { startDelegationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, expectedValidatorWeight: DEFAULT_WEIGHT, - expectedNonce: 4 + expectedNonce: 4, + includeUptime: true, + force: false }); uint256 expectedTotalReward = rewardCalculator.calculateReward({ @@ -865,7 +923,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 startDelegationTimestamp, uint64 endDelegationTimestamp, uint64 expectedValidatorWeight, - uint64 expectedNonce + uint64 expectedNonce, + bool includeUptime, + bool force ) internal { vm.expectEmit(true, true, true, true, address(posValidatorManager)); emit ValidatorWeightUpdate({ @@ -889,7 +949,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { startDelegationTimestamp: startDelegationTimestamp, endDelegationTimestamp: endDelegationTimestamp, expectedValidatorWeight: expectedValidatorWeight, - expectedNonce: expectedNonce + expectedNonce: expectedNonce, + includeUptime: includeUptime, + force: force }); } @@ -900,7 +962,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 startDelegationTimestamp, uint64 endDelegationTimestamp, uint64 expectedValidatorWeight, - uint64 expectedNonce + uint64 expectedNonce, + bool includeUptime, + bool force ) internal { bytes memory setValidatorWeightPayload = ValidatorMessages .packSetSubnetValidatorWeightMessage(validationID, expectedNonce, expectedValidatorWeight); @@ -908,20 +972,29 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, endDelegationTimestamp - startDelegationTimestamp ); - _mockGetUptimeWarpMessage(uptimeMsg, true); - _mockGetBlockchainID(); - - _initializeEndDelegation(delegatorAddress, delegationID, endDelegationTimestamp); + if (includeUptime) { + _mockGetUptimeWarpMessage(uptimeMsg, true); + _mockGetBlockchainID(); + } + _initializeEndDelegation( + delegatorAddress, delegationID, endDelegationTimestamp, includeUptime, force + ); } function _initializeEndDelegation( address delegatorAddress, bytes32 delegationID, - uint64 endDelegationTimestamp + uint64 endDelegationTimestamp, + bool includeUptime, + bool force ) internal { vm.warp(endDelegationTimestamp); vm.prank(delegatorAddress); - posValidatorManager.initializeEndDelegation(delegationID, true, 0); + if (force) { + posValidatorManager.forceInitializeEndDelegation(delegationID, includeUptime, 0); + } else { + posValidatorManager.initializeEndDelegation(delegationID, includeUptime, 0); + } } function _completeEndValidationWithChecks( diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index f5bc82bca..fbbe499f5 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -1135,7 +1135,7 @@ func InitializeEndERC20Delegation( ) *types.Receipt { opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) - tx, err := stakingManager.InitializeEndDelegation( + tx, err := stakingManager.ForceInitializeEndDelegation( opts, delegationID, false, @@ -1225,7 +1225,7 @@ func InitializeEndNativeDelegation( ) *types.Receipt { opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) Expect(err).Should(BeNil()) - tx, err := stakingManager.InitializeEndDelegation( + tx, err := stakingManager.ForceInitializeEndDelegation( opts, delegationID, false, From 3f155781d6334d883cde70b848b3f274b6a23f40 Mon Sep 17 00:00:00 2001 From: Ian Suvak Date: Fri, 27 Sep 2024 13:20:56 -0400 Subject: [PATCH 436/545] add comment --- contracts/validator-manager/ValidatorMessages.sol | 3 +++ 1 file changed, 3 insertions(+) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 213470d66..138863fe6 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -154,6 +154,9 @@ library ValidatorMessages { subnetConversionData.validatorManagerAddress, uint32(subnetConversionData.initialValidators.length) ); + // 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++) { res = abi.encodePacked( res, From 46acf6bb3fb6947dde262bf765dad4d54bea9df1 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 27 Sep 2024 13:19:28 -0500 Subject: [PATCH 437/545] remove temp files --- .../validator-manager/StateTransition.md | 18 ------------- .../validator-manager/StateTransitionV2.md | 27 ------------------- contracts/validator-manager/temp.md | 0 3 files changed, 45 deletions(-) delete mode 100644 contracts/validator-manager/StateTransition.md delete mode 100644 contracts/validator-manager/StateTransitionV2.md delete mode 100644 contracts/validator-manager/temp.md diff --git a/contracts/validator-manager/StateTransition.md b/contracts/validator-manager/StateTransition.md deleted file mode 100644 index b895df85b..000000000 --- a/contracts/validator-manager/StateTransition.md +++ /dev/null @@ -1,18 +0,0 @@ -```mermaid -stateDiagram-v2 - %% Happy path - [*] --> PendingAdded : V.Active - %% PendingAdded --> Active : V.Active - %% Active --> PendingRemoved : V.Active | started=delActiveTime ended=now - %% PendingRemoved --> Completed : V.Active - - %% Delegator registration, validator complete - PendingAdded --> PendingRemoved : V.PendingRemoved | started=vdrEndTime ended=vdrEndTime - PendingAdded --> Completed : V.Completed - - %% DelegatorEnding, validator complete - Active --> PendingRemoved : V.PendingRemoved | started=delActiveTime ended=vdrEndTime - Active --> Completed : V.Completed - PendingRemoved --> Completed : V.PendingRemoved | started=delActiveTime ended=vdrEndTime - PendingRemoved --> Completed : V.Completed -``` \ No newline at end of file diff --git a/contracts/validator-manager/StateTransitionV2.md b/contracts/validator-manager/StateTransitionV2.md deleted file mode 100644 index b8b0d34af..000000000 --- a/contracts/validator-manager/StateTransitionV2.md +++ /dev/null @@ -1,27 +0,0 @@ -```mermaid -stateDiagram-v2 - classDef myState font-weight:bold - pr: D.PendingRemoved | started=delActiveTime ended=now - c: D.Completed | started=delActiveTime ended=now - prA: D.PendingRemoved | started=vdrEndTime ended=vdrEndTime - cA: D.Completed | started=vdrEndTime ended=vdrEndTime - prB: D.PendingRemoved | started=delActiveTime ended=vdrEndTime - cB: D.Completed | started=delActiveTime ended=vdrEndTime - - %% Happy path - [*] --> D.PendingAdded : V.Active - D.PendingAdded --> D.Active : V.Active - D.Active --> pr:::myState : V.Active - pr:::myState --> c:::myState : V.Active - - %% Delegator registration, validator complete - D.PendingAdded --> prA:::myState : V.PendingRemoved - prA --> cA:::myState - D.PendingAdded --> cA:::myState : V.Completed - - %% DelegatorEnding, validator complete - D.Active --> prB:::myState : V.PendingRemoved - D.Active --> cB:::myState : V.Completed - prB:::myState --> cB:::myState - prB:::myState --> cB:::myState -``` \ No newline at end of file diff --git a/contracts/validator-manager/temp.md b/contracts/validator-manager/temp.md deleted file mode 100644 index e69de29bb..000000000 From 414f9a9685ed156f0402bdcba11fb8ee12702969 Mon Sep 17 00:00:00 2001 From: Matthew Lam Date: Fri, 27 Sep 2024 15:30:26 -0400 Subject: [PATCH 438/545] fix unit tests --- .../tests/PoSValidatorManagerTests.t.sol | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 4dca26cd2..2a2b3a11d 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -399,7 +399,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _registerDefaultDelegator(validationID); - vm.expectRevert(PoSValidatorManager.DelegatorIneligibleForRewards.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.DelegatorIneligibleForRewards.selector, delegationID + ) + ); vm.warp(DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP); vm.prank(DEFAULT_DELEGATOR_ADDRESS); posValidatorManager.initializeEndDelegation(delegationID, false, 0); @@ -531,7 +535,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); - vm.expectRevert(ValidatorManager.InvalidValidatorStatus.selector); + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.InvalidValidatorStatus.selector, ValidatorStatus.PendingRemoved + ) + ); _initializeDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT ); @@ -584,7 +592,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); - vm.expectRevert(ValidatorManager.InvalidValidatorStatus.selector); + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.InvalidValidatorStatus.selector, ValidatorStatus.PendingRemoved + ) + ); _initializeDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT ); @@ -647,7 +659,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _beforeSend(_weightToValue(DEFAULT_DELEGATOR_WEIGHT), DEFAULT_DELEGATOR_ADDRESS); vm.warp(DEFAULT_COMPLETION_TIMESTAMP + 1); - vm.expectRevert(ValidatorManager.InvalidValidatorStatus.selector); + vm.expectRevert( + abi.encodeWithSelector( + ValidatorManager.InvalidValidatorStatus.selector, ValidatorStatus.Completed + ) + ); _initializeDelegatorRegistration( validationID, DEFAULT_DELEGATOR_ADDRESS, DEFAULT_DELEGATOR_WEIGHT ); @@ -1000,7 +1016,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); - vm.expectRevert(PoSValidatorManager.ValidatorIneligibleForRewards.selector); + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.ValidatorIneligibleForRewards.selector, validationID + ) + ); _initializeEndValidation(validationID, true); } From fed2329dad01c4ede1ed353b652b1fe3236b707b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 27 Sep 2024 15:03:35 -0500 Subject: [PATCH 439/545] remove todos --- contracts/validator-manager/ValidatorManager.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 11ebe7e63..73258ebf8 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -52,7 +52,6 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // solhint-enable private-vars-leading-underscore // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.ValidatorManager")) - 1)) & ~bytes32(uint256(0xff)); - // TODO: Unit test for storage slot and update slot bytes32 public constant VALIDATOR_MANAGER_STORAGE_LOCATION = 0xe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00; From 14be1a84090b2cb11c55578f2cec09910b3cf260 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 27 Sep 2024 15:04:58 -0500 Subject: [PATCH 440/545] move event inside interface def --- .../validator-manager/ValidatorManager.sol | 1 - .../interfaces/IValidatorManager.sol | 28 +++++++++---------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 73258ebf8..bf6418252 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -12,7 +12,6 @@ import { ValidatorStatus, Validator, ValidatorChurnPeriod, - ValidatorWeightUpdate, SubnetConversionData, InitialValidator, ValidatorRegistrationInput diff --git a/contracts/validator-manager/interfaces/IValidatorManager.sol b/contracts/validator-manager/interfaces/IValidatorManager.sol index d30388d11..703050f75 100644 --- a/contracts/validator-manager/interfaces/IValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IValidatorManager.sol @@ -31,20 +31,6 @@ struct ValidatorChurnPeriod { uint64 churnAmount; } -/** - * @notice Event emitted when validator weight is updated. - * @param validationID The ID of the validation period - * @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 - */ -event ValidatorWeightUpdate( - bytes32 indexed validationID, - uint64 indexed nonce, - uint64 validatorWeight, - bytes32 setWeightMessageID -); - struct ValidatorManagerSettings { bytes32 subnetID; uint64 churnPeriodSeconds; @@ -130,6 +116,20 @@ interface IValidatorManager { */ event ValidationPeriodEnded(bytes32 indexed validationID, ValidatorStatus indexed status); + /** + * @notice Event emitted when validator weight is updated. + * @param validationID The ID of the validation period + * @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 + */ + event ValidatorWeightUpdate( + bytes32 indexed validationID, + uint64 indexed nonce, + uint64 validatorWeight, + bytes32 setWeightMessageID + ); + /** * @notice Verifies and sets the initial validator set for the chain through a P-Chain * SubnetConversionMessage. From 6c729e7f2840bca897821153e60df4589a75dc2b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 27 Sep 2024 15:08:26 -0500 Subject: [PATCH 441/545] remove more todos --- .../interfaces/IPoSValidatorManager.sol | 1 - .../interfaces/IValidatorManager.sol | 12 ++++++------ .../tests/ERC20TokenStakingManagerTests.t.sol | 2 -- .../tests/NativeTokenStakingManagerTests.t.sol | 6 ++---- 4 files changed, 8 insertions(+), 13 deletions(-) diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index d43180280..c22b2de98 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -15,7 +15,6 @@ enum DelegatorStatus { PendingRemoved } -// TODO: visit types of these fields, for example uint64 might be too big for stake duration seconds. struct PoSValidatorManagerSettings { ValidatorManagerSettings baseSettings; uint256 minimumStakeAmount; diff --git a/contracts/validator-manager/interfaces/IValidatorManager.sol b/contracts/validator-manager/interfaces/IValidatorManager.sol index 703050f75..f75517225 100644 --- a/contracts/validator-manager/interfaces/IValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IValidatorManager.sol @@ -117,12 +117,12 @@ interface IValidatorManager { event ValidationPeriodEnded(bytes32 indexed validationID, ValidatorStatus indexed status); /** - * @notice Event emitted when validator weight is updated. - * @param validationID The ID of the validation period - * @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 - */ + * @notice Event emitted when validator weight is updated. + * @param validationID The ID of the validation period + * @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 + */ event ValidatorWeightUpdate( bytes32 indexed validationID, uint64 indexed nonce, diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index 858333183..c2927d876 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -21,8 +21,6 @@ import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; import {IERC20Mintable} from "../interfaces/IERC20Mintable.sol"; import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; -// TODO: Remove this once all unit tests implemented -// solhint-disable no-empty-blocks contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { using SafeERC20 for IERC20Mintable; diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index 935b4cbe4..7a56521fe 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -19,8 +19,6 @@ import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {INativeMinter} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/INativeMinter.sol"; -// TODO: Remove this once all unit tests implemented -// solhint-disable no-empty-blocks contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { NativeTokenStakingManager public app; @@ -200,9 +198,11 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { return app.initializeDelegatorRegistration{value: value}(validationID); } + // solhint-disable no-empty-blocks function _beforeSend(uint256 amount, address spender) internal override { // Native tokens no need pre approve } + // solhint-enable no-empty-blocks function _expectStakeUnlock(address account, uint256 amount) internal override { // empty calldata implies the receive function will be called @@ -230,5 +230,3 @@ contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { return account.balance; } } -// TODO: Remove this once all unit tests implemented -// solhint-enable no-empty-blocks From 7e5a0230fae2c91bec2c882a7ab7d81d7b832c0d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 27 Sep 2024 15:32:34 -0500 Subject: [PATCH 442/545] add doccomments --- .../ERC20TokenStakingManager.sol | 11 +++++--- .../NativeTokenStakingManager.sol | 5 ++++ .../validator-manager/PoAValidatorManager.sol | 5 ++++ .../validator-manager/PoSValidatorManager.sol | 6 ++++- .../validator-manager/ValidatorManager.sol | 5 ++++ .../validator-manager/ValidatorMessages.sol | 4 +++ .../interfaces/IERC20Mintable.sol | 5 +++- .../interfaces/IERC20TokenStakingManager.sol | 5 +++- .../interfaces/INativeTokenStakingManager.sol | 5 +++- .../interfaces/IPoAValidatorManager.sol | 3 +++ .../interfaces/IPoSValidatorManager.sol | 15 +++++++++++ .../interfaces/IRewardCalculator.sol | 13 +++++++++ .../interfaces/IValidatorManager.sol | 27 +++++++++++++++++++ 13 files changed, 102 insertions(+), 7 deletions(-) diff --git a/contracts/validator-manager/ERC20TokenStakingManager.sol b/contracts/validator-manager/ERC20TokenStakingManager.sol index 850ffc6a2..f4e12e8cb 100644 --- a/contracts/validator-manager/ERC20TokenStakingManager.sol +++ b/contracts/validator-manager/ERC20TokenStakingManager.sol @@ -16,6 +16,11 @@ import {PoSValidatorManager} from "./PoSValidatorManager.sol"; import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; import {ValidatorRegistrationInput} from "./interfaces/IValidatorManager.sol"; +/** + * @dev Implementation of the {IERC20TokenStakingManager} interface. + * + * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + */ contract ERC20TokenStakingManager is Initializable, PoSValidatorManager, @@ -33,7 +38,6 @@ contract ERC20TokenStakingManager is // solhint-enable private-vars-leading-underscore // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.ERC20TokenStakingManager")) - 1)) & ~bytes32(uint256(0xff)); - // TODO: Update to correct storage slot bytes32 public constant ERC20_STAKING_MANAGER_STORAGE_LOCATION = 0x6e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab00; @@ -70,7 +74,7 @@ contract ERC20TokenStakingManager is __ERC20TokenStakingManager_init(settings, token); } - // solhint-disable func-name-mixedcase + // solhint-disable-next-line func-name-mixedcase function __ERC20TokenStakingManager_init( PoSValidatorManagerSettings calldata settings, IERC20Mintable token @@ -79,7 +83,7 @@ contract ERC20TokenStakingManager is __ERC20TokenStakingManager_init_unchained(token); } - // solhint-disable func-name-mixedcase + // solhint-disable-next-line func-name-mixedcase function __ERC20TokenStakingManager_init_unchained(IERC20Mintable token) internal onlyInitializing @@ -123,6 +127,7 @@ contract ERC20TokenStakingManager is return _getERC20StakingManagerStorage()._token.safeTransferFrom(value); } + // Must be guarded with reentrancy guard for safe transfer from function _unlock(address to, uint256 value) internal virtual override { _getERC20StakingManagerStorage()._token.safeTransfer(to, value); } diff --git a/contracts/validator-manager/NativeTokenStakingManager.sol b/contracts/validator-manager/NativeTokenStakingManager.sol index 9209ef83f..bc0a80bdb 100644 --- a/contracts/validator-manager/NativeTokenStakingManager.sol +++ b/contracts/validator-manager/NativeTokenStakingManager.sol @@ -16,6 +16,11 @@ import {PoSValidatorManager} from "./PoSValidatorManager.sol"; import {PoSValidatorManagerSettings} from "./interfaces/IPoSValidatorManager.sol"; import {ValidatorRegistrationInput} from "./interfaces/IValidatorManager.sol"; +/** + * @dev Implementation of the {INativeTokenStakingManager} interface. + * + * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + */ contract NativeTokenStakingManager is Initializable, PoSValidatorManager, diff --git a/contracts/validator-manager/PoAValidatorManager.sol b/contracts/validator-manager/PoAValidatorManager.sol index 43d5e5aaf..d45a196a6 100644 --- a/contracts/validator-manager/PoAValidatorManager.sol +++ b/contracts/validator-manager/PoAValidatorManager.sol @@ -15,6 +15,11 @@ import { } from "./interfaces/IValidatorManager.sol"; import {ValidatorManager} from "./ValidatorManager.sol"; +/** + * @dev Implementation of the {IPoAValidatorManager} interface. + * + * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + */ contract PoAValidatorManager is IPoAValidatorManager, ValidatorManager, OwnableUpgradeable { constructor(ICMInitializable init) { if (init == ICMInitializable.Disallowed) { diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 4bccd116c..48dddc3f2 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -25,6 +25,11 @@ import {IRewardCalculator} from "./interfaces/IRewardCalculator.sol"; import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/utils/ReentrancyGuardUpgradeable.sol"; +/** + * @dev Implementation of the {IPoSValidatorManager} interface. + * + * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + */ abstract contract PoSValidatorManager is IPoSValidatorManager, ValidatorManager, @@ -63,7 +68,6 @@ abstract contract PoSValidatorManager is // solhint-enable private-vars-leading-underscore // keccak256(abi.encode(uint256(keccak256("avalanche-icm.storage.PoSValidatorManager")) - 1)) & ~bytes32(uint256(0xff)); - // TODO: Unit test for storage slot and update slot bytes32 public constant POS_VALIDATOR_MANAGER_STORAGE_LOCATION = 0x4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00; diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index bf6418252..8881d7812 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -26,6 +26,11 @@ import {ContextUpgradeable} from import {Initializable} from "@openzeppelin/contracts-upgradeable@5.0.2/proxy/utils/Initializable.sol"; +/** + * @dev Implementation of the {IValidatorManager} interface. + * + * @custom:security-contact https://github.com/ava-labs/teleporter/blob/main/SECURITY.md + */ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValidatorManager { // solhint-disable private-vars-leading-underscore /// @custom:storage-location erc7201:avalanche-icm.storage.ValidatorManager diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index e09a33ad4..cf651abdf 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -6,6 +6,10 @@ pragma solidity 0.8.25; import {SubnetConversionData} from "./interfaces/IValidatorManager.sol"; +/** + @dev Packing utilities for the Warp message types used by the Validator Manager contracts, as specified in ACP-77: + * https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets + */ library ValidatorMessages { // The information that uniquely identifies a subnet validation period. // The validationID is the SHA-256 hash of the concatenation of the CODEC_ID, diff --git a/contracts/validator-manager/interfaces/IERC20Mintable.sol b/contracts/validator-manager/interfaces/IERC20Mintable.sol index dd2225ceb..f3524de3e 100644 --- a/contracts/validator-manager/interfaces/IERC20Mintable.sol +++ b/contracts/validator-manager/interfaces/IERC20Mintable.sol @@ -7,12 +7,15 @@ pragma solidity 0.8.25; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; +/** + * @notice Extension of the ERC20 standard that allows for minting new tokens. + */ interface IERC20Mintable is IERC20 { /** * @notice Mint tokens to the specified address. * @param account The address to mint tokens to. * @param amount How many tokens to mint. - * @dev This function should have appropriate user controls to ensure that only the staking contract can mint. + * @dev This function should have appropriate user controls to ensure that only authorized users can mint. */ function mint(address account, uint256 amount) external; } diff --git a/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol b/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol index 88a903d14..cb5ffb866 100644 --- a/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol +++ b/contracts/validator-manager/interfaces/IERC20TokenStakingManager.sol @@ -8,12 +8,15 @@ pragma solidity 0.8.25; import {ValidatorRegistrationInput} from "./IValidatorManager.sol"; import {IPoSValidatorManager} from "./IPoSValidatorManager.sol"; +/** + * Proof of Stake Validator Manager that stakes ERC20 tokens. + */ interface IERC20TokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the {stakeAmount} of the managers specified ERC20 token. * @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. + * @param minStakeDuration The minimum amount of time this validator must be staked for in seconds. */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, diff --git a/contracts/validator-manager/interfaces/INativeTokenStakingManager.sol b/contracts/validator-manager/interfaces/INativeTokenStakingManager.sol index f46d6e649..13d5ad760 100644 --- a/contracts/validator-manager/interfaces/INativeTokenStakingManager.sol +++ b/contracts/validator-manager/interfaces/INativeTokenStakingManager.sol @@ -8,12 +8,15 @@ pragma solidity 0.8.25; import {ValidatorRegistrationInput} from "./IValidatorManager.sol"; import {IPoSValidatorManager} from "./IPoSValidatorManager.sol"; +/** + * Proof of Stake Validator Manager that stakes the blockchain's native tokens. + */ interface INativeTokenStakingManager is IPoSValidatorManager { /** * @notice Begins the validator registration process. Locks the provided native asset 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. + * @param minStakeDuration The minimum amount of time this validator must be staked for in seconds. */ function initializeValidatorRegistration( ValidatorRegistrationInput calldata registrationInput, diff --git a/contracts/validator-manager/interfaces/IPoAValidatorManager.sol b/contracts/validator-manager/interfaces/IPoAValidatorManager.sol index 9418a8331..39d2b12e9 100644 --- a/contracts/validator-manager/interfaces/IPoAValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoAValidatorManager.sol @@ -7,6 +7,9 @@ pragma solidity 0.8.25; import {IValidatorManager, ValidatorRegistrationInput} from "./IValidatorManager.sol"; +/** + * @notice Interface for Proof of Authority Validator Manager contracts + */ interface IPoAValidatorManager is IValidatorManager { /** * @notice Begins the validator registration process, and sets the {weight} of the validator. diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index c22b2de98..cf6e00abe 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -8,6 +8,9 @@ pragma solidity 0.8.25; import {IValidatorManager, ValidatorManagerSettings} from "./IValidatorManager.sol"; import {IRewardCalculator} from "./IRewardCalculator.sol"; +/** + * @dev Delegator status + */ enum DelegatorStatus { Unknown, PendingAdded, @@ -15,6 +18,9 @@ enum DelegatorStatus { PendingRemoved } +/** + * @dev PoS Validator Manager settings, used to initialize the PoS Validator Manager + */ struct PoSValidatorManagerSettings { ValidatorManagerSettings baseSettings; uint256 minimumStakeAmount; @@ -25,6 +31,9 @@ struct PoSValidatorManagerSettings { IRewardCalculator rewardCalculator; } +/** + * @dev Contains the active state of a Delegator + */ struct Delegator { DelegatorStatus status; address owner; @@ -35,6 +44,9 @@ struct Delegator { uint64 endingNonce; } +/** + * @dev Describes the active state of a PoS Validator. Extends {IValidatorManager-Validator} + */ struct PoSValidatorInfo { address owner; uint16 delegationFeeBips; @@ -42,6 +54,9 @@ struct PoSValidatorInfo { uint64 uptimeSeconds; } +/** + * @notice Interface for Proof of Stake Validator Managers + */ interface IPoSValidatorManager is IValidatorManager { /** * @notice Event emitted when a delegator registration is initiated diff --git a/contracts/validator-manager/interfaces/IRewardCalculator.sol b/contracts/validator-manager/interfaces/IRewardCalculator.sol index b7f9a35c4..5ed55458c 100644 --- a/contracts/validator-manager/interfaces/IRewardCalculator.sol +++ b/contracts/validator-manager/interfaces/IRewardCalculator.sol @@ -5,7 +5,20 @@ pragma solidity 0.8.25; +/** + * @notice Interface for Validation and Delegation reward calculators + */ interface IRewardCalculator { + /** + * @notice Calculate the reward for a staker (validator or delegator) + * @param stakeAmount The amount of tokens staked + * @param validatorStartTime The time the validator started validating + * @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, diff --git a/contracts/validator-manager/interfaces/IValidatorManager.sol b/contracts/validator-manager/interfaces/IValidatorManager.sol index f75517225..33b5810a0 100644 --- a/contracts/validator-manager/interfaces/IValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IValidatorManager.sol @@ -5,6 +5,9 @@ pragma solidity 0.8.25; +/** + * @dev Validator status + */ enum ValidatorStatus { Unknown, PendingAdded, @@ -14,6 +17,9 @@ enum ValidatorStatus { Invalidated } +/** + * @dev Contains the active state of a Validator + */ struct Validator { ValidatorStatus status; bytes32 nodeID; @@ -24,6 +30,9 @@ struct Validator { uint64 endedAt; } +/** + * @dev Describes the current churn period + */ struct ValidatorChurnPeriod { uint256 startedAt; uint256 initialWeight; @@ -31,12 +40,21 @@ struct ValidatorChurnPeriod { uint64 churnAmount; } +/** + * @dev Validator Manager settings, used to initialize the Validator Manager + */ struct ValidatorManagerSettings { bytes32 subnetID; uint64 churnPeriodSeconds; uint8 maximumChurnPercentage; } +/** + * @dev Description of the subnet conversion data used to convert + * a subnet to a permissionless subnet on the P-Chain. + * This data is the pre-image of a hash that is authenticated by the P-Chain + * and verified by the Validator Manager. + */ struct SubnetConversionData { bytes32 convertSubnetTxID; bytes32 validatorManagerBlockchainID; @@ -44,18 +62,27 @@ struct SubnetConversionData { InitialValidator[] initialValidators; } +/** + * @dev Specifies an initial validator, used in the subnet conversion data. + */ struct InitialValidator { bytes32 nodeID; uint64 weight; bytes blsPublicKey; } +/** + * @dev Specifies a validator to register. + */ struct ValidatorRegistrationInput { bytes32 nodeID; uint64 registrationExpiry; bytes blsPublicKey; } +/** + * @notice Interface for Validator Manager contracts that implement Subnet-only Validator management. + */ interface IValidatorManager { /** * @notice Emitted when a new validation period is created by stake being locked in the manager contract. From 8b01977a2d9b93a2946059a8f40b719e929b0a6c Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 27 Sep 2024 15:32:51 -0500 Subject: [PATCH 443/545] completeEndValidation nonReentrant --- contracts/validator-manager/PoSValidatorManager.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index 48dddc3f2..a078d086f 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -248,7 +248,7 @@ abstract contract PoSValidatorManager is return (reward > 0); } - function completeEndValidation(uint32 messageIndex) external { + function completeEndValidation(uint32 messageIndex) external nonReentrant { PoSValidatorManagerStorage storage $ = _getPoSValidatorManagerStorage(); (bytes32 validationID, Validator memory validator) = _completeEndValidation(messageIndex); From debe23453581426c2f35bc7a8ad8a3aab6ce86ca Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 27 Sep 2024 15:33:21 -0500 Subject: [PATCH 444/545] update bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 0c0176500..3e1abbaae 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -83,7 +83,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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"InvalidCodecID\",\"inputs\":[]},{\"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\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"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: "0x608060405234801561000f575f80fd5b5060405161576a38038061576a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61561d8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c80638280a25a11610114578063bc5fbfec116100a9578063df93d8de11610079578063df93d8de14610451578063e4a63c401461045b578063e7d14c1c1461046f578063eb0acb89146104ad578063f09969ae146104c0575f80fd5b8063bc5fbfec14610402578063bee0a03f14610416578063c974d1b614610429578063d5f20ff614610431575f80fd5b8063a3a65e48116100e4578063a3a65e48146103a2578063afb98096146103b5578063b771b3bc146103c9578063ba3a4b97146103ef575f80fd5b80638280a25a1461036157806393e245981461036957806398f3e2b41461037c5780639e1bc4ef1461038f575f80fd5b8063467ef06f1161018a578063620658561161015a578063620658561461031357806366435abf14610334578063732214f81461034757806376f786211461034e575f80fd5b8063467ef06f146102bd5780635297fae6146102d057806360305d62146102e357806361e2f49014610300575f80fd5b806325e1c776116101c557806325e1c776146102505780632e2194d81461026357806335455ded1461028e5780633a1cfff6146102aa575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b610209610204366004614b85565b6104d3565b005b610209610219366004614bc0565b610508565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b366004614b85565b61068f565b61020961025e366004614bd7565b61069a565b610276610271366004614bc0565b61070e565b6040516001600160401b039091168152602001610234565b61029761271081565b60405161ffff9091168152602001610234565b6102096102b8366004614b85565b610724565b6102096102cb366004614c01565b61072f565b6102096102de366004614c1a565b6107d0565b6102eb601481565b60405163ffffffff9091168152602001610234565b61020961030e366004614c42565b610a3b565b610326610321366004614c9d565b610eee565b604051908152602001610234565b610276610342366004614bc0565b610f07565b6103265f81565b61020961035c366004614b85565b610f1b565b610226603081565b610209610377366004614bc0565b610f46565b61020961038a366004614c1a565b611011565b61032661039d366004614cb6565b6111e9565b6102096103b0366004614c01565b611215565b6103265f8051602061559183398151915281565b6103d76005600160991b0181565b6040516001600160a01b039091168152602001610234565b6102096103fd366004614bc0565b61139e565b6103265f805160206155b183398151915281565b610209610424366004614bc0565b611580565b610226601481565b61044461043f366004614bc0565b6116bd565b6040516102349190614cfe565b6102766202a30081565b6103265f8051602061557183398151915281565b61032661047d366004614bc0565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6103266104bb366004614d78565b611785565b6102096104ce366004614df1565b6117ba565b6104de838383611899565b61050357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206155f18339815191526020526040808220815160e0810190925280545f805160206155b183398151915293929190829060ff16600581111561055557610555614cd6565b600581111561056657610566614cd6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156105d5576105d5614cd6565b14610608575f8381526007830160205260409081902054905163170cc93360e21b81526104fa9160ff1690600401614e2f565b6005600160991b016001600160a01b031663ee5b48eb61062d8584606001515f611b1e565b6040518263ffffffff1660e01b81526004016106499190614e5f565b6020604051808303815f875af1158015610665573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106899190614e91565b50505050565b610689838383611899565b6106a382611b6d565b6106c3576040516330efa98b60e01b8152600481018390526024016104fa565b5f6106cd836116bd565b51905060028160058111156106e4576106e4614cd6565b14610704578060405163170cc93360e21b81526004016104fa9190614e2f565b6106898383611ba8565b5f61071e64e8d4a5100083614ebc565b92915050565b610689838383611e22565b5f805160206155918339815191525f806107488461201b565b9150915061075582611b6d565b61075f5750505050565b5f82815260048085016020526040909120546001600160a01b0316908251600581111561078e5761078e614cd6565b036107b3575f838152600785016020526040812080549190556107b182826122b2565b505b6107c9816107c48460400151610eee565b612328565b5050505050565b5f8181525f805160206155518339815191526020526040808220815160e0810190925280545f8051602061559183398151915293929190829060ff16600381111561081d5761081d614cd6565b600381111561082e5761082e614cd6565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6108a4826116bd565b90506001835160038111156108bb576108bb614cd6565b146108dc578251604051633b0d540d60e21b81526104fa9190600401614edb565b6004815160058111156108f1576108f1614cd6565b03610907576108ff8561234b565b505050505050565b5f8061091e61091589612532565b60400151612648565b509150915081841461094b57846040015160405163089938b360e11b81526004016104fa91815260200190565b806001600160401b031683606001516001600160401b031610806109845750806001600160401b03168560a001516001600160401b0316115b156109ad57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104fa565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206155b18339815191529060ff1615610a8d57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ad0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610af49190614e91565b836020013514610b1d576040516372b0a7e760e11b8152602084013560048201526024016104fa565b30610b2e6060850160408601614ef5565b6001600160a01b031614610b7157610b4c6060840160408501614ef5565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104fa565b5f610b7f6060850185614f10565b905090505f805b828163ffffffff161015610e2e575f610ba26060880188614f10565b8363ffffffff16818110610bb857610bb8614f55565b9050602002810190610bca9190614f69565b610bd390615019565b80515f8181526008880160205260409020549192509015610c0a57604051631ec583cb60e11b8152600481018290526024016104fa565b5f6002895f013585604051602001610c3992919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610c53916150b0565b602060405180830381855afa158015610c6e573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610c919190614e91565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610d1d57610d1d614cd6565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610dd09116866150c1565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610e27906150d4565b9050610b86565b50600483018190555f610e4c610e4386612532565b60400151612886565b90505f610e58876129fb565b90505f600282604051610e6b91906150b0565b602060405180830381855afa158015610e86573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610ea99190614e91565b9050828114610ed557604051631872fc8d60e01b815260048101829052602481018490526044016104fa565b5050506009909201805460ff1916600117905550505050565b5f61071e6001600160401b03831664e8d4a510006150f6565b5f610f11826116bd565b6080015192915050565b610f26838383611e22565b61050357604051635bff683f60e11b8152600481018490526024016104fa565b5f805160206155918339815191525f610f5e836116bd565b5190506004816005811115610f7557610f75614cd6565b14610f95578060405163170cc93360e21b81526004016104fa9190614e2f565b5f8381526004830160205260409020546001600160a01b03163314610fdb57335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104fa565b5f83815260078301602090815260408083208054908490556004860190925290912054610689906001600160a01b0316826122b2565b611019612e94565b5f8181525f805160206155518339815191526020526040808220815160e0810190925280545f8051602061559183398151915293929190829060ff16600381111561106657611066614cd6565b600381111561107757611077614cd6565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156110f0576110f0614cd6565b14611111578051604051633b0d540d60e21b81526104fa9190600401614edb565b600461112082604001516116bd565b51600581111561113257611132614cd6565b146111c4575f61114185612532565b90505f806111528360400151612648565b50915091508184604001511461117e5760405163089938b360e11b8152600481018390526024016104fa565b806001600160401b03168460c001516001600160401b031611156111c057604051632e19bc2d60e11b81526001600160401b03821660048201526024016104fa565b5050505b6111cd8361234b565b50506111e560015f805160206155d183398151915255565b5050565b5f6111f2612e94565b6111fd833384612ede565b905061071e60015f805160206155d183398151915255565b5f805160206155b18339815191525f8061123a61123185612532565b604001516131b6565b915091508061126057604051632d07135360e01b815281151560048201526024016104fa565b5f8281526006840160205260409020805461127a9061510d565b90505f0361129e5760405163089938b360e11b8152600481018390526024016104fa565b60015f83815260078501602052604090205460ff1660058111156112c4576112c4614cd6565b146112f7575f8281526007840160205260409081902054905163170cc93360e21b81526104fa9160ff1690600401614e2f565b5f828152600684016020526040812061130f91614ad5565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206155518339815191526020526040808220815160e0810190925280545f8051602061559183398151915293929190829060ff1660038111156113eb576113eb614cd6565b60038111156113fc576113fc614cd6565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561147557611475614cd6565b14158015611496575060038151600381111561149357611493614cd6565b14155b156114b7578051604051633b0d540d60e21b81526104fa9190600401614edb565b5f6114c582604001516116bd565b905080606001516001600160401b03165f036114f7576040516339b894f960e21b8152600481018590526024016104fa565b6005600160991b016001600160a01b031663ee5b48eb611524846040015184606001518560800151611b1e565b6040518263ffffffff1660e01b81526004016115409190614e5f565b6020604051808303815f875af115801561155c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107c99190614e91565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206155b183398151915291906115c79061510d565b90505f036115eb5760405163089938b360e11b8152600481018390526024016104fa565b60015f83815260078301602052604090205460ff16600581111561161157611611614cd6565b14611644575f8281526007820160205260409081902054905163170cc93360e21b81526104fa9160ff1690600401614e2f565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161167d9190600401615145565b6020604051808303815f875af1158015611699573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105039190614e91565b6116c5614b0c565b5f8281525f805160206155f1833981519152602052604090819020815160e0810190925280545f805160206155b1833981519152929190829060ff16600581111561171257611712614cd6565b600581111561172357611723614cd6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f61178e612e94565b61179a8585858561335a565b90506117b260015f805160206155d183398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611803575080546001600160401b03808416911610155b156118215760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561184c8484613533565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f8381525f805160206155518339815191526020526040808220815160e0810190925280545f805160206155918339815191529284929091829060ff1660038111156118e7576118e7614cd6565b60038111156118f8576118f8614cd6565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61196e826116bd565b905060028351600381111561198557611985614cd6565b146119a6578251604051633b0d540d60e21b81526104fa9190600401614edb565b60208301516001600160a01b031633146119c05733610fb6565b6002815160058111156119d5576119d5614cd6565b03611ab25786156119ec576119ea8287611ba8565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611a25918491611a2091906151cf565b61354d565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611a66846136a4565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611b179350505050565b600481516005811115611ac757611ac7614cd6565b03611afb57611ad5836136a4565b5f898152600686016020526040902055611aee8861234b565b6001945050505050611b17565b805160405163170cc93360e21b81526104fa9190600401614e2f565b9392505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611bf3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c1a91908101906151fa565b9150915080611c3c57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c7f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ca39190614e91565b825114611cc9578151604051636ba589a560e01b815260048101919091526024016104fa565b60208201516001600160a01b031615611d05576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104fa565b5f80611d148460400151613850565b91509150818714611d3b5760405163089938b360e11b8152600481018890526024016104fa565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615591833981519152906001600160401b039081169083161115611df8575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611e17565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f8051602061559183398151915281611e3b86613a2b565b9050611e4686611b6d565b611e5557600192505050611b17565b5f8681526004830160205260409020546001600160a01b03163314611e7a5733610fb6565b5f86815260048301602052604090205460a0820151611ea991600160b01b90046001600160401b0316906152cc565b6001600160401b03168160c001516001600160401b03161015611ef05760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104fa565b5f8515611f0857611f018786611ba8565b9050611f26565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b590611f4b90610eee565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611fc1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fe59190614e91565b905080846007015f8a81526020019081526020015f205f82825461200991906150c1565b90915550501515979650505050505050565b5f612024614b0c565b5f805160206155b18339815191525f8061204061123187612532565b91509150801561206757604051632d07135360e01b815281151560048201526024016104fa565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561209857612098614cd6565b60058111156120a9576120a9614cd6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561211857612118614cd6565b14158015612139575060018151600581111561213657612136614cd6565b14155b1561215a57805160405163170cc93360e21b81526104fa9190600401614e2f565b60038151600581111561216f5761216f614cd6565b0361217d5760048152612182565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff191660018360058111156121c7576121c7614cd6565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561227b5761227b614cd6565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f8051602061557183398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561230d575f80fd5b505af115801561231f573d5f803e3d5ffd5b50505050505050565b5f80516020615571833981519152546111e5906001600160a01b03168383613c7d565b5f8181525f805160206155518339815191526020526040808220815160e0810190925280545f8051602061559183398151915293929190829060ff16600381111561239857612398614cd6565b60038111156123a9576123a9614cd6565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b031916815592830181905591909401819055600687019091529081208054908290559293509091908082156124d7575f8481526004870160205260409020546127109061248990600160a01b900461ffff16856150f6565b6124939190614ebc565b915081866007015f8681526020019081526020015f205f8282546124b791906150c1565b909155506124c7905082846152ec565b90506124d78560200151826122b2565b6124ec85602001516107c48760600151610eee565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612596573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526125bd91908101906151fa565b91509150806125df57604051636b2f19e960e01b815260040160405180910390fd5b815115612605578151604051636ba589a560e01b815260048101919091526024016104fa565b60208201516001600160a01b031615612641576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104fa565b5092915050565b5f805f835160361461266d57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156126bc576126848160016152ec565b61268f9060086150f6565b61ffff168682815181106126a5576126a5614f55565b016020015160f81c901b9190911790600101612670565b5061ffff8116156126e05760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561273b576126f78160036152ec565b6127029060086150f6565b63ffffffff16876127148360026150c1565b8151811061272457612724614f55565b016020015160f81c901b91909117906001016126e3565b5063ffffffff811660041461276357604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156127b85761277a81601f6152ec565b6127859060086150f6565b886127918360066150c1565b815181106127a1576127a1614f55565b016020015160f81c901b9190911790600101612766565b505f805b6008811015612817576127d08160076152ec565b6127db9060086150f6565b6001600160401b0316896127f08360266150c1565b8151811061280057612800614f55565b016020015160f81c901b91909117906001016127bc565b505f805b60088110156128765761282f8160076152ec565b61283a9060086150f6565b6001600160401b03168a61284f83602e6150c1565b8151811061285f5761285f614f55565b016020015160f81c901b919091179060010161281b565b5091989097509095509350505050565b5f81516026146128a957604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156128f8576128c08160016152ec565b6128cb9060086150f6565b61ffff168482815181106128e1576128e1614f55565b016020015160f81c901b91909117906001016128ac565b5061ffff81161561291c5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612977576129338160036152ec565b61293e9060086150f6565b63ffffffff16856129508360026150c1565b8151811061296057612960614f55565b016020015160f81c901b919091179060010161291f565b5063ffffffff81161561299d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156129f2576129b481601f6152ec565b6129bf9060086150f6565b866129cb8360066150c1565b815181106129db576129db614f55565b016020015160f81c901b91909117906001016129a0565b50949350505050565b60605f612a0a83830184614f10565b612a16915060586150f6565b612a2190605c6150c1565b6001600160401b03811115612a3857612a38614f87565b6040519080825280601f01601f191660200182016040528015612a62576020820181803683370190505b5090505f5b6020811015612ab75783358160208110612a8357612a83614f55565b1a60f81b828281518110612a9957612a99614f55565b60200101906001600160f81b03191690815f1a905350600101612a67565b505f5b6020811015612b175783602001358160208110612ad957612ad9614f55565b1a60f81b82612ae98360206150c1565b81518110612af957612af9614f55565b60200101906001600160f81b03191690815f1a905350600101612aba565b505f5b6004811015612b7a57612b2e8160036152ec565b612b399060086150f6565b6014901c60f81b82612b4c8360406150c1565b81518110612b5c57612b5c614f55565b60200101906001600160f81b03191690815f1a905350600101612b1a565b505f612b8c6060850160408601614ef5565b60601b90505f5b6014811015612bec57818160148110612bae57612bae614f55565b1a60f81b83612bbe8360446150c1565b81518110612bce57612bce614f55565b60200101906001600160f81b03191690815f1a905350600101612b93565b505f612bfb6060860186614f10565b905090505f5b6004811015612c6657612c158160036152ec565b612c209060086150f6565b63ffffffff8316901c60f81b84612c388360586150c1565b81518110612c4857612c48614f55565b60200101906001600160f81b03191690815f1a905350600101612c01565b505f5b612c766060870187614f10565b9050811015612e8a575f612c8b8260586150f6565b612c9690605c6150c1565b90505f5b6020811015612d2157612cb06060890189614f10565b84818110612cc057612cc0614f55565b9050602002810190612cd29190614f69565b358160208110612ce457612ce4614f55565b1a60f81b86612cf383856150c1565b81518110612d0357612d03614f55565b60200101906001600160f81b03191690815f1a905350600101612c9a565b505f5b6008811015612dd657612d388160076152ec565b612d439060086150f6565b612d5060608a018a614f10565b85818110612d6057612d60614f55565b9050602002810190612d729190614f69565b612d83906040810190602001614c9d565b6001600160401b0316901c60f81b8682612d9e8560206150c1565b612da891906150c1565b81518110612db857612db8614f55565b60200101906001600160f81b03191690815f1a905350600101612d24565b505f5b6030811015612e8057612def6060890189614f10565b84818110612dff57612dff614f55565b9050602002810190612e119190614f69565b612e1f9060408101906152ff565b82818110612e2f57612e2f614f55565b9050013560f81c60f81b8682846028612e4891906150c1565b612e5291906150c1565b81518110612e6257612e62614f55565b60200101906001600160f81b03191690815f1a905350600101612dd9565b5050600101612c69565b5091949350505050565b5f805160206155d1833981519152805460011901612ec557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b60015f805160206155d183398151915255565b5f5f8051602061559183398151915281612efa61027185613cdc565b90505f612f06876116bd565b9050612f1187611b6d565b612f31576040516330efa98b60e01b8152600481018890526024016104fa565b600281516005811115612f4657612f46614cd6565b14612f6757805160405163170cc93360e21b81526104fa9190600401614e2f565b5f828260800151612f7891906152cc565b905083600201600a9054906101000a90046001600160401b03168260400151612fa19190615341565b6001600160401b0316816001600160401b03161115612fde57604051636d51fe0560e11b81526001600160401b03821660048201526024016104fa565b5f80612fea8a8461354d565b915091505f8a8360405160200161301892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156130ab576130ab614cd6565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146131da57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613229576131f18160016152ec565b6131fc9060086150f6565b61ffff1685828151811061321257613212614f55565b016020015160f81c901b91909117906001016131dd565b5061ffff81161561324d5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156132a8576132648160036152ec565b61326f9060086150f6565b63ffffffff16866132818360026150c1565b8151811061329157613291614f55565b016020015160f81c901b9190911790600101613250565b5063ffffffff81166003146132d057604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613325576132e781601f6152ec565b6132f29060086150f6565b876132fe8360066150c1565b8151811061330e5761330e614f55565b016020015160f81c901b91909117906001016132d3565b505f8660268151811061333a5761333a614f55565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061559183398151915290600160401b900461ffff90811690861610806133ae575061271061ffff8616115b156133d257604051635f12e6c360e11b815261ffff861660048201526024016104fa565b60028101546001600160401b03908116908516101561340e576040516202a06d60e11b81526001600160401b03851660048201526024016104fa565b80548310806134205750806001015483115b156134415760405163222d164360e21b8152600481018490526024016104fa565b5f61344b84613cdc565b90505f6134578261070e565b90505f6134648983613cff565b905060405180608001604052806134783390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b61353b614131565b6135448261417c565b6111e5816141ed565b5f8281525f805160206155f1833981519152602052604081206002015481905f805160206155b183398151915290600160801b90046001600160401b03166135958582614255565b5f61359f8761442f565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6135ef8a858b611b1e565b6040518263ffffffff1660e01b815260040161360b9190614e5f565b6020604051808303815f875af1158015613627573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061364b9190614e91565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f8051602061559183398151915290505f6136c484604001516116bd565b90505f6003825160058111156136dc576136dc614cd6565b14806136fa57506004825160058111156136f8576136f8614cd6565b145b1561370a575060c0810151613747565b60028251600581111561371f5761371f614cd6565b0361372b575042613747565b815160405163170cc93360e21b81526104fa9190600401614e2f565b84608001516001600160401b0316816001600160401b03161161376e57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b59061379390610eee565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613823573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138479190614e91565b95945050505050565b5f808251602e1461387457604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156138c35761388b8160016152ec565b6138969060086150f6565b61ffff168582815181106138ac576138ac614f55565b016020015160f81c901b9190911790600101613877565b5061ffff8116156138e75760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613942576138fe8160036152ec565b6139099060086150f6565b63ffffffff168661391b8360026150c1565b8151811061392b5761392b614f55565b016020015160f81c901b91909117906001016138ea565b5063ffffffff811660051461396a57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139bf5761398181601f6152ec565b61398c9060086150f6565b876139988360066150c1565b815181106139a8576139a8614f55565b016020015160f81c901b919091179060010161396d565b505f805b6008811015613a1e576139d78160076152ec565b6139e29060086150f6565b6001600160401b0316886139f78360266150c1565b81518110613a0757613a07614f55565b016020015160f81c901b91909117906001016139c3565b5090969095509350505050565b613a33614b0c565b5f8281525f805160206155f18339815191526020526040808220815160e0810190925280545f805160206155b183398151915293929190829060ff166005811115613a8057613a80614cd6565b6005811115613a9157613a91614cd6565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613b0357613b03614cd6565b14613b36575f8481526007830160205260409081902054905163170cc93360e21b81526104fa9160ff1690600401614e2f565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613b7a57613b7a614cd6565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613c26858261354d565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b0383811660248301526044820183905261050391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506144a4565b5f61071e825f80516020615571833981519152546001600160a01b031690614505565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613d4357604051637fab81e560e01b815260040160405180910390fd5b5f805160206155b183398151915242613d626040860160208701614c9d565b6001600160401b0316111580613d9c5750613d806202a300426150c1565b613d906040860160208701614c9d565b6001600160401b031610155b15613dd657613db16040850160208601614c9d565b604051635879da1360e11b81526001600160401b0390911660048201526024016104fa565b6030613de560408601866152ff565b905014613e1757613df960408501856152ff565b6040516326475b2f60e11b81526104fa925060040190815260200190565b8335613e395760405163099e922360e21b8152843560048201526024016104fa565b83355f90815260088201602052604090205415613e6c57604051631ec583cb60e11b8152843560048201526024016104fa565b613e76835f614255565b5f80613f0f6040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613eba9190614c9d565b6001600160401b03168152602001613ed560408a018a6152ff565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061465e565b5f82815260068601602052604090209193509150613f2d82826153b0565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613f6b908590600401614e5f565b6020604051808303815f875af1158015613f87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fab9190614e91565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561402357614023614cd6565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614103918e01908e01614c9d565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661417a57604051631afcd79f60e31b815260040160405180910390fd5b565b614184614131565b61418d81614721565b61419561473a565b6141ea606082013560808301356141b260c0850160a08601614c9d565b6141c260e0860160c0870161546b565b6141d3610100870160e08801615484565b6141e561012088016101008901614ef5565b61474a565b50565b6141f5614131565b5f805160206155718339815191526001600160a01b03821661423557604051637330680360e01b81526001600160a01b03831660048201526024016104fa565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f805160206155b18339815191525f6001600160401b0380841690851611156142895761428283856151cf565b9050614296565b61429384846151cf565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806142f85750600184015481516142f4916001600160401b0316906150c1565b8210155b1561431e576001600160401b03831660608201528181526040810151602082015261433d565b828160600181815161433091906152cc565b6001600160401b03169052505b606081015161434d906064615341565b602082015160018601546001600160401b0392909216916143789190600160401b900460ff166150f6565b10156143a857606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104fa565b856001600160401b0316816040018181516143c391906150c1565b9052506040810180516001600160401b03871691906143e39083906152ec565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206155f18339815191526020526040812060020180545f805160206155b1833981519152919060089061447990600160401b90046001600160401b03166154a4565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6144b86001600160a01b03841683614879565b905080515f141580156144dc5750808060200190518101906144da91906154bf565b155b1561050357604051635274afe760e01b81526001600160a01b03841660048201526024016104fa565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561454b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061456f9190614e91565b90506145866001600160a01b038516333086614886565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156145ca573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145ee9190614e91565b90508181116146545760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104fa565b61384782826152ec565b5f606082608001515160301461468757604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016146b997969594939291906154da565b60405160208183030381529060405290506002816040516146da91906150b0565b602060405180830381855afa1580156146f5573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906147189190614e91565b94909350915050565b614729614131565b6147316148bf565b6141ea816148c7565b614742614131565b61417a6149af565b614752614131565b5f8051602061559183398151915261ffff84161580614776575061271061ffff8516115b1561479a57604051635f12e6c360e11b815261ffff851660048201526024016104fa565b858711156147be5760405163222d164360e21b8152600481018890526024016104fa565b60ff831615806147d15750600a60ff8416115b156147f45760405163170db35960e31b815260ff841660048201526024016104fa565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611b1783835f6149b7565b6040516001600160a01b0384811660248301528381166044830152606482018390526106899186918216906323b872dd90608401613caa565b61417a614131565b6148cf614131565b80355f805160206155b183398151915290815560146148f46060840160408501615484565b60ff161180614913575061490e6060830160408401615484565b60ff16155b15614947576149286060830160408401615484565b604051634a59bbff60e11b815260ff90911660048201526024016104fa565b6149576060830160408401615484565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556149886040830160208401614c9d565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ecb614131565b6060814710156149dc5760405163cd78605960e01b81523060048201526024016104fa565b5f80856001600160a01b031684866040516149f791906150b0565b5f6040518083038185875af1925050503d805f8114614a31576040519150601f19603f3d011682016040523d82523d5f602084013e614a36565b606091505b5091509150614a46868383614a50565b9695505050505050565b606082614a6557614a6082614aac565b611b17565b8151158015614a7c57506001600160a01b0384163b155b15614aa557604051639996b31560e01b81526001600160a01b03851660048201526024016104fa565b5080611b17565b805115614abc5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614ae19061510d565b5f825580601f10614af0575050565b601f0160209004905f5260205f20908101906141ea9190614b48565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614b5c575f8155600101614b49565b5090565b80151581146141ea575f80fd5b803563ffffffff81168114614b80575f80fd5b919050565b5f805f60608486031215614b97575f80fd5b833592506020840135614ba981614b60565b9150614bb760408501614b6d565b90509250925092565b5f60208284031215614bd0575f80fd5b5035919050565b5f8060408385031215614be8575f80fd5b82359150614bf860208401614b6d565b90509250929050565b5f60208284031215614c11575f80fd5b611b1782614b6d565b5f8060408385031215614c2b575f80fd5b614c3483614b6d565b946020939093013593505050565b5f8060408385031215614c53575f80fd5b82356001600160401b03811115614c68575f80fd5b830160808186031215614c79575f80fd5b9150614bf860208401614b6d565b80356001600160401b0381168114614b80575f80fd5b5f60208284031215614cad575f80fd5b611b1782614c87565b5f8060408385031215614cc7575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b60068110614cfa57614cfa614cd6565b9052565b5f60e082019050614d10828451614cea565b6020830151602083015260408301516001600160401b0380821660408501528060608601511660608501528060808601511660808501528060a08601511660a08501528060c08601511660c0850152505092915050565b803561ffff81168114614b80575f80fd5b5f805f8060808587031215614d8b575f80fd5b84356001600160401b03811115614da0575f80fd5b850160608188031215614db1575f80fd5b9350614dbf60208601614d67565b9250614dcd60408601614c87565b9396929550929360600135925050565b6001600160a01b03811681146141ea575f80fd5b5f80828403610140811215614e04575f80fd5b61012080821215614e13575f80fd5b8493508301359050614e2481614ddd565b809150509250929050565b6020810161071e8284614cea565b5f5b83811015614e57578181015183820152602001614e3f565b50505f910152565b602081525f8251806020840152614e7d816040850160208701614e3d565b601f01601f19169190910160400192915050565b5f60208284031215614ea1575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f82614ed657634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310614eef57614eef614cd6565b91905290565b5f60208284031215614f05575f80fd5b8135611b1781614ddd565b5f808335601e19843603018112614f25575f80fd5b8301803591506001600160401b03821115614f3e575f80fd5b6020019150600581901b360382131561369d575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614f7d575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614fbd57614fbd614f87565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614feb57614feb614f87565b604052919050565b5f6001600160401b0382111561500b5761500b614f87565b50601f01601f191660200190565b5f60608236031215615029575f80fd5b615031614f9b565b823581526020615042818501614c87565b8183015260408401356001600160401b0381111561505e575f80fd5b840136601f82011261506e575f80fd5b803561508161507c82614ff3565b614fc3565b8181523684838501011115615094575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614f7d818460208701614e3d565b8082018082111561071e5761071e614ea8565b5f63ffffffff8083168181036150ec576150ec614ea8565b6001019392505050565b808202811582820484141761071e5761071e614ea8565b600181811c9082168061512157607f821691505b60208210810361513f57634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f84546151578161510d565b806020870152604060018084165f81146151785760018114615194576151c1565b60ff19851660408a0152604084151560051b8a010195506151c1565b895f5260205f205f5b858110156151b85781548b820186015290830190880161519d565b8a016040019650505b509398975050505050505050565b6001600160401b0382811682821603908082111561264157612641614ea8565b8051614b8081614b60565b5f806040838503121561520b575f80fd5b82516001600160401b0380821115615221575f80fd5b9084019060608287031215615234575f80fd5b61523c614f9b565b8251815260208084015161524f81614ddd565b82820152604084015183811115615264575f80fd5b80850194505087601f850112615278575f80fd5b8351925061528861507c84614ff3565b838152888285870101111561529b575f80fd5b6152aa84838301848801614e3d565b806040840152508195506152bf8188016151ef565b9450505050509250929050565b6001600160401b0381811683821601908082111561264157612641614ea8565b8181038181111561071e5761071e614ea8565b5f808335601e19843603018112615314575f80fd5b8301803591506001600160401b0382111561532d575f80fd5b60200191503681900382131561369d575f80fd5b6001600160401b0381811683821602808216919082811461536457615364614ea8565b505092915050565b601f82111561050357805f5260205f20601f840160051c810160208510156153915750805b601f840160051c820191505b818110156107c9575f815560010161539d565b81516001600160401b038111156153c9576153c9614f87565b6153dd816153d7845461510d565b8461536c565b602080601f831160018114615410575f84156153f95750858301515b5f19600386901b1c1916600185901b1785556108ff565b5f85815260208120601f198616915b8281101561543e5788860151825594840194600190910190840161541f565b508582101561545b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6020828403121561547b575f80fd5b611b1782614d67565b5f60208284031215615494575f80fd5b813560ff81168114611b17575f80fd5b5f6001600160401b038083168181036150ec576150ec614ea8565b5f602082840312156154cf575f80fd5b8151611b1781614b60565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161552f81604e860160208901614e3d565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161578f38038061578f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6156428061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c80638280a25a11610114578063bc5fbfec116100a9578063df93d8de11610079578063df93d8de14610451578063e4a63c401461045b578063e7d14c1c1461046f578063eb0acb89146104ad578063f09969ae146104c0575f80fd5b8063bc5fbfec14610402578063bee0a03f14610416578063c974d1b614610429578063d5f20ff614610431575f80fd5b8063a3a65e48116100e4578063a3a65e48146103a2578063afb98096146103b5578063b771b3bc146103c9578063ba3a4b97146103ef575f80fd5b80638280a25a1461036157806393e245981461036957806398f3e2b41461037c5780639e1bc4ef1461038f575f80fd5b8063467ef06f1161018a578063620658561161015a578063620658561461031357806366435abf14610334578063732214f81461034757806376f786211461034e575f80fd5b8063467ef06f146102bd5780635297fae6146102d057806360305d62146102e357806361e2f49014610300575f80fd5b806325e1c776116101c557806325e1c776146102505780632e2194d81461026357806335455ded1461028e5780633a1cfff6146102aa575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b610209610204366004614baa565b6104d3565b005b610209610219366004614be5565b610508565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b366004614baa565b61068f565b61020961025e366004614bfc565b61069a565b610276610271366004614be5565b61070e565b6040516001600160401b039091168152602001610234565b61029761271081565b60405161ffff9091168152602001610234565b6102096102b8366004614baa565b610724565b6102096102cb366004614c26565b61072f565b6102096102de366004614c3f565b6107f1565b6102eb601481565b60405163ffffffff9091168152602001610234565b61020961030e366004614c67565b610a5c565b610326610321366004614cc2565b610f0f565b604051908152602001610234565b610276610342366004614be5565b610f28565b6103265f81565b61020961035c366004614baa565b610f3c565b610226603081565b610209610377366004614be5565b610f67565b61020961038a366004614c3f565b611032565b61032661039d366004614cdb565b61120a565b6102096103b0366004614c26565b611236565b6103265f805160206155b683398151915281565b6103d76005600160991b0181565b6040516001600160a01b039091168152602001610234565b6102096103fd366004614be5565b6113bf565b6103265f805160206155d683398151915281565b610209610424366004614be5565b6115a8565b610226601481565b61044461043f366004614be5565b6116e5565b6040516102349190614d23565b6102766202a30081565b6103265f8051602061559683398151915281565b61032661047d366004614be5565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6103266104bb366004614d9d565b6117ad565b6102096104ce366004614e16565b6117e2565b6104de8383836118c1565b61050357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206156168339815191526020526040808220815160e0810190925280545f805160206155d683398151915293929190829060ff16600581111561055557610555614cfb565b600581111561056657610566614cfb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156105d5576105d5614cfb565b14610608575f8381526007830160205260409081902054905163170cc93360e21b81526104fa9160ff1690600401614e54565b6005600160991b016001600160a01b031663ee5b48eb61062d8584606001515f611b46565b6040518263ffffffff1660e01b81526004016106499190614e84565b6020604051808303815f875af1158015610665573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106899190614eb6565b50505050565b6106898383836118c1565b6106a382611b95565b6106c3576040516330efa98b60e01b8152600481018390526024016104fa565b5f6106cd836116e5565b51905060028160058111156106e4576106e4614cfb565b14610704578060405163170cc93360e21b81526004016104fa9190614e54565b6106898383611bd0565b5f61071e64e8d4a5100083614ee1565b92915050565b610689838383611e4a565b610737612043565b5f805160206155b68339815191525f806107508461207a565b9150915061075d82611b95565b610769575050506107d8565b5f82815260048085016020526040909120546001600160a01b0316908251600581111561079857610798614cfb565b036107bd575f838152600785016020526040812080549190556107bb8282612311565b505b6107d3816107ce8460400151610f0f565b612387565b505050505b6107ee60015f805160206155f683398151915255565b50565b5f8181525f805160206155768339815191526020526040808220815160e0810190925280545f805160206155b683398151915293929190829060ff16600381111561083e5761083e614cfb565b600381111561084f5761084f614cfb565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6108c5826116e5565b90506001835160038111156108dc576108dc614cfb565b146108fd578251604051633b0d540d60e21b81526104fa9190600401614f00565b60048151600581111561091257610912614cfb565b0361092857610920856123bd565b505050505050565b5f8061093f610936896125a4565b604001516126ba565b509150915081841461096c57846040015160405163089938b360e11b81526004016104fa91815260200190565b806001600160401b031683606001516001600160401b031610806109a55750806001600160401b03168560a001516001600160401b0316115b156109ce57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104fa565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206155d68339815191529060ff1615610aae57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610af1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b159190614eb6565b836020013514610b3e576040516372b0a7e760e11b8152602084013560048201526024016104fa565b30610b4f6060850160408601614f1a565b6001600160a01b031614610b9257610b6d6060840160408501614f1a565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104fa565b5f610ba06060850185614f35565b905090505f805b828163ffffffff161015610e4f575f610bc36060880188614f35565b8363ffffffff16818110610bd957610bd9614f7a565b9050602002810190610beb9190614f8e565b610bf49061503e565b80515f8181526008880160205260409020549192509015610c2b57604051631ec583cb60e11b8152600481018290526024016104fa565b5f6002895f013585604051602001610c5a92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610c74916150d5565b602060405180830381855afa158015610c8f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cb29190614eb6565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610d3e57610d3e614cfb565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610df19116866150e6565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610e48906150f9565b9050610ba7565b50600483018190555f610e6d610e64866125a4565b604001516128f8565b90505f610e7987612a6d565b90505f600282604051610e8c91906150d5565b602060405180830381855afa158015610ea7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610eca9190614eb6565b9050828114610ef657604051631872fc8d60e01b815260048101829052602481018490526044016104fa565b5050506009909201805460ff1916600117905550505050565b5f61071e6001600160401b03831664e8d4a5100061511b565b5f610f32826116e5565b6080015192915050565b610f47838383611e4a565b61050357604051635bff683f60e11b8152600481018490526024016104fa565b5f805160206155b68339815191525f610f7f836116e5565b5190506004816005811115610f9657610f96614cfb565b14610fb6578060405163170cc93360e21b81526004016104fa9190614e54565b5f8381526004830160205260409020546001600160a01b03163314610ffc57335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104fa565b5f83815260078301602090815260408083208054908490556004860190925290912054610689906001600160a01b031682612311565b61103a612043565b5f8181525f805160206155768339815191526020526040808220815160e0810190925280545f805160206155b683398151915293929190829060ff16600381111561108757611087614cfb565b600381111561109857611098614cfb565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561111157611111614cfb565b14611132578051604051633b0d540d60e21b81526104fa9190600401614f00565b600461114182604001516116e5565b51600581111561115357611153614cfb565b146111e5575f611162856125a4565b90505f8061117383604001516126ba565b50915091508184604001511461119f5760405163089938b360e11b8152600481018390526024016104fa565b806001600160401b03168460c001516001600160401b031611156111e157604051632e19bc2d60e11b81526001600160401b03821660048201526024016104fa565b5050505b6111ee836123bd565b505061120660015f805160206155f683398151915255565b5050565b5f611213612043565b61121e833384612f06565b905061071e60015f805160206155f683398151915255565b5f805160206155d68339815191525f8061125b611252856125a4565b604001516131de565b915091508061128157604051632d07135360e01b815281151560048201526024016104fa565b5f8281526006840160205260409020805461129b90615132565b90505f036112bf5760405163089938b360e11b8152600481018390526024016104fa565b60015f83815260078501602052604090205460ff1660058111156112e5576112e5614cfb565b14611318575f8281526007840160205260409081902054905163170cc93360e21b81526104fa9160ff1690600401614e54565b5f828152600684016020526040812061133091614afa565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206155768339815191526020526040808220815160e0810190925280545f805160206155b683398151915293929190829060ff16600381111561140c5761140c614cfb565b600381111561141d5761141d614cfb565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561149657611496614cfb565b141580156114b757506003815160038111156114b4576114b4614cfb565b14155b156114d8578051604051633b0d540d60e21b81526104fa9190600401614f00565b5f6114e682604001516116e5565b905080606001516001600160401b03165f03611518576040516339b894f960e21b8152600481018590526024016104fa565b6005600160991b016001600160a01b031663ee5b48eb611545846040015184606001518560800151611b46565b6040518263ffffffff1660e01b81526004016115619190614e84565b6020604051808303815f875af115801561157d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a19190614eb6565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206155d683398151915291906115ef90615132565b90505f036116135760405163089938b360e11b8152600481018390526024016104fa565b60015f83815260078301602052604090205460ff16600581111561163957611639614cfb565b1461166c575f8281526007820160205260409081902054905163170cc93360e21b81526104fa9160ff1690600401614e54565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916116a5919060040161516a565b6020604051808303815f875af11580156116c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105039190614eb6565b6116ed614b31565b5f8281525f80516020615616833981519152602052604090819020815160e0810190925280545f805160206155d6833981519152929190829060ff16600581111561173a5761173a614cfb565b600581111561174b5761174b614cfb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6117b6612043565b6117c285858585613382565b90506117da60015f805160206155f683398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061182b575080546001600160401b03808416911610155b156118495760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611874848461355b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f8381525f805160206155768339815191526020526040808220815160e0810190925280545f805160206155b68339815191529284929091829060ff16600381111561190f5761190f614cfb565b600381111561192057611920614cfb565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611996826116e5565b90506002835160038111156119ad576119ad614cfb565b146119ce578251604051633b0d540d60e21b81526104fa9190600401614f00565b60208301516001600160a01b031633146119e85733610fd7565b6002815160058111156119fd576119fd614cfb565b03611ada578615611a1457611a128287611bd0565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611a4d918491611a4891906151f4565b613575565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611a8e846136cc565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611b3f9350505050565b600481516005811115611aef57611aef614cfb565b03611b2357611afd836136cc565b5f898152600686016020526040902055611b16886123bd565b6001945050505050611b3f565b805160405163170cc93360e21b81526104fa9190600401614e54565b9392505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c1b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c42919081019061521f565b9150915080611c6457604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ca7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ccb9190614eb6565b825114611cf1578151604051636ba589a560e01b815260048101919091526024016104fa565b60208201516001600160a01b031615611d2d576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104fa565b5f80611d3c8460400151613878565b91509150818714611d635760405163089938b360e11b8152600481018890526024016104fa565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f805160206155b6833981519152906001600160401b039081169083161115611e20575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611e3f565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f805160206155b683398151915281611e6386613a53565b9050611e6e86611b95565b611e7d57600192505050611b3f565b5f8681526004830160205260409020546001600160a01b03163314611ea25733610fd7565b5f86815260048301602052604090205460a0820151611ed191600160b01b90046001600160401b0316906152f1565b6001600160401b03168160c001516001600160401b03161015611f185760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104fa565b5f8515611f3057611f298786611bd0565b9050611f4e565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b590611f7390610f0f565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611fe9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061200d9190614eb6565b905080846007015f8a81526020019081526020015f205f82825461203191906150e6565b90915550501515979650505050505050565b5f805160206155f683398151915280546001190161207457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612083614b31565b5f805160206155d68339815191525f8061209f611252876125a4565b9150915080156120c657604051632d07135360e01b815281151560048201526024016104fa565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156120f7576120f7614cfb565b600581111561210857612108614cfb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561217757612177614cfb565b14158015612198575060018151600581111561219557612195614cfb565b14155b156121b957805160405163170cc93360e21b81526104fa9190600401614e54565b6003815160058111156121ce576121ce614cfb565b036121dc57600481526121e1565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff1916600183600581111561222657612226614cfb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156122da576122da614cfb565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f8051602061559683398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561236c575f80fd5b505af115801561237e573d5f803e3d5ffd5b50505050505050565b5f8051602061559683398151915254611206906001600160a01b03168383613ca5565b60015f805160206155f683398151915255565b5f8181525f805160206155768339815191526020526040808220815160e0810190925280545f805160206155b683398151915293929190829060ff16600381111561240a5761240a614cfb565b600381111561241b5761241b614cfb565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612549575f848152600487016020526040902054612710906124fb90600160a01b900461ffff168561511b565b6125059190614ee1565b915081866007015f8681526020019081526020015f205f82825461252991906150e6565b9091555061253990508284615311565b9050612549856020015182612311565b61255e85602001516107ce8760600151610f0f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612608573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262f919081019061521f565b915091508061265157604051636b2f19e960e01b815260040160405180910390fd5b815115612677578151604051636ba589a560e01b815260048101919091526024016104fa565b60208201516001600160a01b0316156126b3576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104fa565b5092915050565b5f805f83516036146126df57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561272e576126f6816001615311565b61270190600861511b565b61ffff1686828151811061271757612717614f7a565b016020015160f81c901b91909117906001016126e2565b5061ffff8116156127525760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156127ad57612769816003615311565b61277490600861511b565b63ffffffff16876127868360026150e6565b8151811061279657612796614f7a565b016020015160f81c901b9190911790600101612755565b5063ffffffff81166004146127d557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561282a576127ec81601f615311565b6127f790600861511b565b886128038360066150e6565b8151811061281357612813614f7a565b016020015160f81c901b91909117906001016127d8565b505f805b600881101561288957612842816007615311565b61284d90600861511b565b6001600160401b0316896128628360266150e6565b8151811061287257612872614f7a565b016020015160f81c901b919091179060010161282e565b505f805b60088110156128e8576128a1816007615311565b6128ac90600861511b565b6001600160401b03168a6128c183602e6150e6565b815181106128d1576128d1614f7a565b016020015160f81c901b919091179060010161288d565b5091989097509095509350505050565b5f815160261461291b57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561296a57612932816001615311565b61293d90600861511b565b61ffff1684828151811061295357612953614f7a565b016020015160f81c901b919091179060010161291e565b5061ffff81161561298e5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156129e9576129a5816003615311565b6129b090600861511b565b63ffffffff16856129c28360026150e6565b815181106129d2576129d2614f7a565b016020015160f81c901b9190911790600101612991565b5063ffffffff811615612a0f57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a6457612a2681601f615311565b612a3190600861511b565b86612a3d8360066150e6565b81518110612a4d57612a4d614f7a565b016020015160f81c901b9190911790600101612a12565b50949350505050565b60605f612a7c83830184614f35565b612a889150605861511b565b612a9390605c6150e6565b6001600160401b03811115612aaa57612aaa614fac565b6040519080825280601f01601f191660200182016040528015612ad4576020820181803683370190505b5090505f5b6020811015612b295783358160208110612af557612af5614f7a565b1a60f81b828281518110612b0b57612b0b614f7a565b60200101906001600160f81b03191690815f1a905350600101612ad9565b505f5b6020811015612b895783602001358160208110612b4b57612b4b614f7a565b1a60f81b82612b5b8360206150e6565b81518110612b6b57612b6b614f7a565b60200101906001600160f81b03191690815f1a905350600101612b2c565b505f5b6004811015612bec57612ba0816003615311565b612bab90600861511b565b6014901c60f81b82612bbe8360406150e6565b81518110612bce57612bce614f7a565b60200101906001600160f81b03191690815f1a905350600101612b8c565b505f612bfe6060850160408601614f1a565b60601b90505f5b6014811015612c5e57818160148110612c2057612c20614f7a565b1a60f81b83612c308360446150e6565b81518110612c4057612c40614f7a565b60200101906001600160f81b03191690815f1a905350600101612c05565b505f612c6d6060860186614f35565b905090505f5b6004811015612cd857612c87816003615311565b612c9290600861511b565b63ffffffff8316901c60f81b84612caa8360586150e6565b81518110612cba57612cba614f7a565b60200101906001600160f81b03191690815f1a905350600101612c73565b505f5b612ce86060870187614f35565b9050811015612efc575f612cfd82605861511b565b612d0890605c6150e6565b90505f5b6020811015612d9357612d226060890189614f35565b84818110612d3257612d32614f7a565b9050602002810190612d449190614f8e565b358160208110612d5657612d56614f7a565b1a60f81b86612d6583856150e6565b81518110612d7557612d75614f7a565b60200101906001600160f81b03191690815f1a905350600101612d0c565b505f5b6008811015612e4857612daa816007615311565b612db590600861511b565b612dc260608a018a614f35565b85818110612dd257612dd2614f7a565b9050602002810190612de49190614f8e565b612df5906040810190602001614cc2565b6001600160401b0316901c60f81b8682612e108560206150e6565b612e1a91906150e6565b81518110612e2a57612e2a614f7a565b60200101906001600160f81b03191690815f1a905350600101612d96565b505f5b6030811015612ef257612e616060890189614f35565b84818110612e7157612e71614f7a565b9050602002810190612e839190614f8e565b612e91906040810190615324565b82818110612ea157612ea1614f7a565b9050013560f81c60f81b8682846028612eba91906150e6565b612ec491906150e6565b81518110612ed457612ed4614f7a565b60200101906001600160f81b03191690815f1a905350600101612e4b565b5050600101612cdb565b5091949350505050565b5f5f805160206155b683398151915281612f2261027185613d04565b90505f612f2e876116e5565b9050612f3987611b95565b612f59576040516330efa98b60e01b8152600481018890526024016104fa565b600281516005811115612f6e57612f6e614cfb565b14612f8f57805160405163170cc93360e21b81526104fa9190600401614e54565b5f828260800151612fa091906152f1565b905083600201600a9054906101000a90046001600160401b03168260400151612fc99190615366565b6001600160401b0316816001600160401b0316111561300657604051636d51fe0560e11b81526001600160401b03821660048201526024016104fa565b5f806130128a84613575565b915091505f8a8360405160200161304092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156130d3576130d3614cfb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461320257604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561325157613219816001615311565b61322490600861511b565b61ffff1685828151811061323a5761323a614f7a565b016020015160f81c901b9190911790600101613205565b5061ffff8116156132755760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156132d05761328c816003615311565b61329790600861511b565b63ffffffff16866132a98360026150e6565b815181106132b9576132b9614f7a565b016020015160f81c901b9190911790600101613278565b5063ffffffff81166003146132f857604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561334d5761330f81601f615311565b61331a90600861511b565b876133268360066150e6565b8151811061333657613336614f7a565b016020015160f81c901b91909117906001016132fb565b505f8660268151811061336257613362614f7a565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206155b683398151915290600160401b900461ffff90811690861610806133d6575061271061ffff8616115b156133fa57604051635f12e6c360e11b815261ffff861660048201526024016104fa565b60028101546001600160401b039081169085161015613436576040516202a06d60e11b81526001600160401b03851660048201526024016104fa565b80548310806134485750806001015483115b156134695760405163222d164360e21b8152600481018490526024016104fa565b5f61347384613d04565b90505f61347f8261070e565b90505f61348c8983613d27565b905060405180608001604052806134a03390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b613563614159565b61356c826141a4565b61120681614212565b5f8281525f80516020615616833981519152602052604081206002015481905f805160206155d683398151915290600160801b90046001600160401b03166135bd858261427a565b5f6135c787614454565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136178a858b611b46565b6040518263ffffffff1660e01b81526004016136339190614e84565b6020604051808303815f875af115801561364f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136739190614eb6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f805160206155b683398151915290505f6136ec84604001516116e5565b90505f60038251600581111561370457613704614cfb565b1480613722575060048251600581111561372057613720614cfb565b145b15613732575060c081015161376f565b60028251600581111561374757613747614cfb565b0361375357504261376f565b815160405163170cc93360e21b81526104fa9190600401614e54565b84608001516001600160401b0316816001600160401b03161161379657505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906137bb90610f0f565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa15801561384b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061386f9190614eb6565b95945050505050565b5f808251602e1461389c57604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156138eb576138b3816001615311565b6138be90600861511b565b61ffff168582815181106138d4576138d4614f7a565b016020015160f81c901b919091179060010161389f565b5061ffff81161561390f5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561396a57613926816003615311565b61393190600861511b565b63ffffffff16866139438360026150e6565b8151811061395357613953614f7a565b016020015160f81c901b9190911790600101613912565b5063ffffffff811660051461399257604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139e7576139a981601f615311565b6139b490600861511b565b876139c08360066150e6565b815181106139d0576139d0614f7a565b016020015160f81c901b9190911790600101613995565b505f805b6008811015613a46576139ff816007615311565b613a0a90600861511b565b6001600160401b031688613a1f8360266150e6565b81518110613a2f57613a2f614f7a565b016020015160f81c901b91909117906001016139eb565b5090969095509350505050565b613a5b614b31565b5f8281525f805160206156168339815191526020526040808220815160e0810190925280545f805160206155d683398151915293929190829060ff166005811115613aa857613aa8614cfb565b6005811115613ab957613ab9614cfb565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613b2b57613b2b614cfb565b14613b5e575f8481526007830160205260409081902054905163170cc93360e21b81526104fa9160ff1690600401614e54565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613ba257613ba2614cfb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613c4e8582613575565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b0383811660248301526044820183905261050391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506144c9565b5f61071e825f80516020615596833981519152546001600160a01b03169061452a565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613d6b57604051637fab81e560e01b815260040160405180910390fd5b5f805160206155d683398151915242613d8a6040860160208701614cc2565b6001600160401b0316111580613dc45750613da86202a300426150e6565b613db86040860160208701614cc2565b6001600160401b031610155b15613dfe57613dd96040850160208601614cc2565b604051635879da1360e11b81526001600160401b0390911660048201526024016104fa565b6030613e0d6040860186615324565b905014613e3f57613e216040850185615324565b6040516326475b2f60e11b81526104fa925060040190815260200190565b8335613e615760405163099e922360e21b8152843560048201526024016104fa565b83355f90815260088201602052604090205415613e9457604051631ec583cb60e11b8152843560048201526024016104fa565b613e9e835f61427a565b5f80613f376040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613ee29190614cc2565b6001600160401b03168152602001613efd60408a018a615324565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614683565b5f82815260068601602052604090209193509150613f5582826153d5565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613f93908590600401614e84565b6020604051808303815f875af1158015613faf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fd39190614eb6565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561404b5761404b614cfb565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161412b918e01908e01614cc2565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166141a257604051631afcd79f60e31b815260040160405180910390fd5b565b6141ac614159565b6141b581614746565b6141bd61475f565b6107ee606082013560808301356141da60c0850160a08601614cc2565b6141ea60e0860160c08701615490565b6141fb610100870160e088016154a9565b61420d61012088016101008901614f1a565b61476f565b61421a614159565b5f805160206155968339815191526001600160a01b03821661425a57604051637330680360e01b81526001600160a01b03831660048201526024016104fa565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f805160206155d68339815191525f6001600160401b0380841690851611156142ae576142a783856151f4565b90506142bb565b6142b884846151f4565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061431d575060018401548151614319916001600160401b0316906150e6565b8210155b15614343576001600160401b038316606082015281815260408101516020820152614362565b828160600181815161435591906152f1565b6001600160401b03169052505b6060810151614372906064615366565b602082015160018601546001600160401b03929092169161439d9190600160401b900460ff1661511b565b10156143cd57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104fa565b856001600160401b0316816040018181516143e891906150e6565b9052506040810180516001600160401b0387169190614408908390615311565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206156168339815191526020526040812060020180545f805160206155d6833981519152919060089061449e90600160401b90046001600160401b03166154c9565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6144dd6001600160a01b0384168361489e565b905080515f141580156145015750808060200190518101906144ff91906154e4565b155b1561050357604051635274afe760e01b81526001600160a01b03841660048201526024016104fa565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614570573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906145949190614eb6565b90506145ab6001600160a01b0385163330866148ab565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156145ef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906146139190614eb6565b90508181116146795760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104fa565b61386f8282615311565b5f60608260800151516030146146ac57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016146de97969594939291906154ff565b60405160208183030381529060405290506002816040516146ff91906150d5565b602060405180830381855afa15801561471a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061473d9190614eb6565b94909350915050565b61474e614159565b6147566148e4565b6107ee816148ec565b614767614159565b6141a26149d4565b614777614159565b5f805160206155b683398151915261ffff8416158061479b575061271061ffff8516115b156147bf57604051635f12e6c360e11b815261ffff851660048201526024016104fa565b858711156147e35760405163222d164360e21b8152600481018890526024016104fa565b60ff831615806147f65750600a60ff8416115b156148195760405163170db35960e31b815260ff841660048201526024016104fa565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611b3f83835f6149dc565b6040516001600160a01b0384811660248301528381166044830152606482018390526106899186918216906323b872dd90608401613cd2565b6141a2614159565b6148f4614159565b80355f805160206155d6833981519152908155601461491960608401604085016154a9565b60ff161180614938575061493360608301604084016154a9565b60ff16155b1561496c5761494d60608301604084016154a9565b604051634a59bbff60e11b815260ff90911660048201526024016104fa565b61497c60608301604084016154a9565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556149ad6040830160208401614cc2565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6123aa614159565b606081471015614a015760405163cd78605960e01b81523060048201526024016104fa565b5f80856001600160a01b03168486604051614a1c91906150d5565b5f6040518083038185875af1925050503d805f8114614a56576040519150601f19603f3d011682016040523d82523d5f602084013e614a5b565b606091505b5091509150614a6b868383614a75565b9695505050505050565b606082614a8a57614a8582614ad1565b611b3f565b8151158015614aa157506001600160a01b0384163b155b15614aca57604051639996b31560e01b81526001600160a01b03851660048201526024016104fa565b5080611b3f565b805115614ae15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614b0690615132565b5f825580601f10614b15575050565b601f0160209004905f5260205f20908101906107ee9190614b6d565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614b81575f8155600101614b6e565b5090565b80151581146107ee575f80fd5b803563ffffffff81168114614ba5575f80fd5b919050565b5f805f60608486031215614bbc575f80fd5b833592506020840135614bce81614b85565b9150614bdc60408501614b92565b90509250925092565b5f60208284031215614bf5575f80fd5b5035919050565b5f8060408385031215614c0d575f80fd5b82359150614c1d60208401614b92565b90509250929050565b5f60208284031215614c36575f80fd5b611b3f82614b92565b5f8060408385031215614c50575f80fd5b614c5983614b92565b946020939093013593505050565b5f8060408385031215614c78575f80fd5b82356001600160401b03811115614c8d575f80fd5b830160808186031215614c9e575f80fd5b9150614c1d60208401614b92565b80356001600160401b0381168114614ba5575f80fd5b5f60208284031215614cd2575f80fd5b611b3f82614cac565b5f8060408385031215614cec575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b60068110614d1f57614d1f614cfb565b9052565b5f60e082019050614d35828451614d0f565b6020830151602083015260408301516001600160401b0380821660408501528060608601511660608501528060808601511660808501528060a08601511660a08501528060c08601511660c0850152505092915050565b803561ffff81168114614ba5575f80fd5b5f805f8060808587031215614db0575f80fd5b84356001600160401b03811115614dc5575f80fd5b850160608188031215614dd6575f80fd5b9350614de460208601614d8c565b9250614df260408601614cac565b9396929550929360600135925050565b6001600160a01b03811681146107ee575f80fd5b5f80828403610140811215614e29575f80fd5b61012080821215614e38575f80fd5b8493508301359050614e4981614e02565b809150509250929050565b6020810161071e8284614d0f565b5f5b83811015614e7c578181015183820152602001614e64565b50505f910152565b602081525f8251806020840152614ea2816040850160208701614e62565b601f01601f19169190910160400192915050565b5f60208284031215614ec6575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f82614efb57634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310614f1457614f14614cfb565b91905290565b5f60208284031215614f2a575f80fd5b8135611b3f81614e02565b5f808335601e19843603018112614f4a575f80fd5b8301803591506001600160401b03821115614f63575f80fd5b6020019150600581901b36038213156136c5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614fa2575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614fe257614fe2614fac565b60405290565b604051601f8201601f191681016001600160401b038111828210171561501057615010614fac565b604052919050565b5f6001600160401b0382111561503057615030614fac565b50601f01601f191660200190565b5f6060823603121561504e575f80fd5b615056614fc0565b823581526020615067818501614cac565b8183015260408401356001600160401b03811115615083575f80fd5b840136601f820112615093575f80fd5b80356150a66150a182615018565b614fe8565b81815236848385010111156150b9575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614fa2818460208701614e62565b8082018082111561071e5761071e614ecd565b5f63ffffffff80831681810361511157615111614ecd565b6001019392505050565b808202811582820484141761071e5761071e614ecd565b600181811c9082168061514657607f821691505b60208210810361516457634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f845461517c81615132565b806020870152604060018084165f811461519d57600181146151b9576151e6565b60ff19851660408a0152604084151560051b8a010195506151e6565b895f5260205f205f5b858110156151dd5781548b82018601529083019088016151c2565b8a016040019650505b509398975050505050505050565b6001600160401b038281168282160390808211156126b3576126b3614ecd565b8051614ba581614b85565b5f8060408385031215615230575f80fd5b82516001600160401b0380821115615246575f80fd5b9084019060608287031215615259575f80fd5b615261614fc0565b8251815260208084015161527481614e02565b82820152604084015183811115615289575f80fd5b80850194505087601f85011261529d575f80fd5b835192506152ad6150a184615018565b83815288828587010111156152c0575f80fd5b6152cf84838301848801614e62565b806040840152508195506152e4818801615214565b9450505050509250929050565b6001600160401b038181168382160190808211156126b3576126b3614ecd565b8181038181111561071e5761071e614ecd565b5f808335601e19843603018112615339575f80fd5b8301803591506001600160401b03821115615352575f80fd5b6020019150368190038213156136c5575f80fd5b6001600160401b0381811683821602808216919082811461538957615389614ecd565b505092915050565b601f82111561050357805f5260205f20601f840160051c810160208510156153b65750805b601f840160051c820191505b818110156115a1575f81556001016153c2565b81516001600160401b038111156153ee576153ee614fac565b615402816153fc8454615132565b84615391565b602080601f831160018114615435575f841561541e5750858301515b5f19600386901b1c1916600185901b178555610920565b5f85815260208120601f198616915b8281101561546357888601518255948401946001909101908401615444565b508582101561548057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156154a0575f80fd5b611b3f82614d8c565b5f602082840312156154b9575f80fd5b813560ff81168114611b3f575f80fd5b5f6001600160401b0380831681810361511157615111614ecd565b5f602082840312156154f4575f80fd5b8151611b3f81614b85565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161555481604e860160208901614e62565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 5dc110044..2102456e4 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -83,7 +83,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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"InvalidCodecID\",\"inputs\":[]},{\"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\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"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: "0x608060405234801561000f575f80fd5b5060405161547538038061547583398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6153288061014d5f395ff3fe6080604052600436106101e6575f3560e01c806366435abf11610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063e7d14c1c146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806393e24598116100d857806393e245981461048d57806398f3e2b4146104ac578063a3a65e48146104cb578063afb98096146104ea575f80fd5b806366435abf14610428578063732214f81461044757806376f786211461045a5780638280a25a14610479575f80fd5b806335455ded1161017e5780635297fae61161014e5780635297fae6146103a257806360305d62146103c157806361e2f490146103ea5780636206585614610409575f80fd5b806335455ded1461031b5780633a1cfff61461034357806340034a9314610362578063467ef06f14610383575f80fd5b806320e55565116101b957806320e555651461027457806325e1c776146102935780632e2194d8146102b2578063329c3e12146102e9575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614929565b610635565b005b348015610216575f80fd5b50610209610225366004614964565b61066a565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614929565b6107f1565b34801561027f575f80fd5b5061020961028e36600461497b565b6107fc565b34801561029e575f80fd5b506102096102ad366004614992565b6108d9565b3480156102bd575f80fd5b506102d16102cc366004614964565b61094d565b6040516001600160401b03909116815260200161024c565b3480156102f4575f80fd5b506103036001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610326575f80fd5b5061033061271081565b60405161ffff909116815260200161024c565b34801561034e575f80fd5b5061020961035d366004614929565b610963565b6103756103703660046149e3565b61096e565b60405190815260200161024c565b34801561038e575f80fd5b5061020961039d366004614a37565b6109a2565b3480156103ad575f80fd5b506102096103bc366004614a50565b610a43565b3480156103cc575f80fd5b506103d5601481565b60405163ffffffff909116815260200161024c565b3480156103f5575f80fd5b50610209610404366004614a78565b610cae565b348015610414575f80fd5b50610375610423366004614abd565b611161565b348015610433575f80fd5b506102d1610442366004614964565b61117a565b348015610452575f80fd5b506103755f81565b348015610465575f80fd5b50610209610474366004614929565b61118e565b348015610484575f80fd5b5061023e603081565b348015610498575f80fd5b506102096104a7366004614964565b6111b9565b3480156104b7575f80fd5b506102096104c6366004614a50565b611284565b3480156104d6575f80fd5b506102096104e5366004614a37565b61145c565b3480156104f5575f80fd5b506103755f8051602061529c83398151915281565b348015610515575f80fd5b506103036005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614964565b6115e5565b34801561054e575f80fd5b506103755f805160206152bc83398151915281565b34801561056e575f80fd5b5061020961057d366004614964565b6117c7565b610375610590366004614964565b611904565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614964565b611935565b60405161024c9190614afe565b3480156105e0575f80fd5b506102d16202a30081565b3480156105f6575f80fd5b50610375610605366004614964565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6106408383836119fd565b61066557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206152fc8339815191526020526040808220815160e0810190925280545f805160206152bc83398151915293929190829060ff1660058111156106b7576106b7614ad6565b60058111156106c8576106c8614ad6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561073757610737614ad6565b1461076a575f8381526007830160205260409081902054905163170cc93360e21b815261065c9160ff1690600401614b67565b6005600160991b016001600160a01b031663ee5b48eb61078f8584606001515f611c7b565b6040518263ffffffff1660e01b81526004016107ab9190614b97565b6020604051808303815f875af11580156107c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107eb9190614bc9565b50505050565b6107eb8383836119fd565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610845575080546001600160401b03808416911610155b156108635760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561088d83611cca565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6108e282611cde565b610902576040516330efa98b60e01b81526004810183905260240161065c565b5f61090c83611935565b519050600281600581111561092357610923614ad6565b14610943578060405163170cc93360e21b815260040161065c9190614b67565b6107eb8383611d19565b5f61095d64e8d4a5100083614bf4565b92915050565b6107eb838383611f93565b5f61097761218c565b610983848484346121c3565b905061099b60015f805160206152dc83398151915255565b9392505050565b5f8051602061529c8339815191525f806109bb846123a4565b915091506109c882611cde565b6109d25750505050565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610a0157610a01614ad6565b03610a26575f83815260078501602052604081208054919055610a24828261263b565b505b610a3c81610a378460400151611161565b612699565b5050505050565b5f8181525f8051602061527c8339815191526020526040808220815160e0810190925280545f8051602061529c83398151915293929190829060ff166003811115610a9057610a90614ad6565b6003811115610aa157610aa1614ad6565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610b1782611935565b9050600183516003811115610b2e57610b2e614ad6565b14610b4f578251604051633b0d540d60e21b815261065c9190600401614c13565b600481516005811115610b6457610b64614ad6565b03610b7a57610b72856126ac565b505050505050565b5f80610b91610b8889612893565b604001516129a9565b5091509150818414610bbe57846040015160405163089938b360e11b815260040161065c91815260200190565b806001600160401b031683606001516001600160401b03161080610bf75750806001600160401b03168560a001516001600160401b0316115b15610c2057604051632e19bc2d60e11b81526001600160401b038216600482015260240161065c565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206152bc8339815191529060ff1615610d0057604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d43573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d679190614bc9565b836020013514610d90576040516372b0a7e760e11b81526020840135600482015260240161065c565b30610da16060850160408601614c41565b6001600160a01b031614610de457610dbf6060840160408501614c41565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161065c565b5f610df26060850185614c5c565b905090505f805b828163ffffffff1610156110a1575f610e156060880188614c5c565b8363ffffffff16818110610e2b57610e2b614ca1565b9050602002810190610e3d9190614cb5565b610e4690614d65565b80515f8181526008880160205260409020549192509015610e7d57604051631ec583cb60e11b81526004810182905260240161065c565b5f6002895f013585604051602001610eac92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610ec691614dfc565b602060405180830381855afa158015610ee1573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f049190614bc9565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610f9057610f90614ad6565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611043911686614e0d565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a35050508061109a90614e20565b9050610df9565b50600483018190555f6110bf6110b686612893565b60400151612be7565b90505f6110cb87612d5c565b90505f6002826040516110de9190614dfc565b602060405180830381855afa1580156110f9573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061111c9190614bc9565b905082811461114857604051631872fc8d60e01b8152600481018290526024810184905260440161065c565b5050506009909201805460ff1916600117905550505050565b5f61095d6001600160401b03831664e8d4a51000614e42565b5f61118482611935565b6080015192915050565b611199838383611f93565b61066557604051635bff683f60e11b81526004810184905260240161065c565b5f8051602061529c8339815191525f6111d183611935565b51905060048160058111156111e8576111e8614ad6565b14611208578060405163170cc93360e21b815260040161065c9190614b67565b5f8381526004830160205260409020546001600160a01b0316331461124e57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161065c565b5f838152600783016020908152604080832080549084905560048601909252909120546107eb906001600160a01b03168261263b565b61128c61218c565b5f8181525f8051602061527c8339815191526020526040808220815160e0810190925280545f8051602061529c83398151915293929190829060ff1660038111156112d9576112d9614ad6565b60038111156112ea576112ea614ad6565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561136357611363614ad6565b14611384578051604051633b0d540d60e21b815261065c9190600401614c13565b60046113938260400151611935565b5160058111156113a5576113a5614ad6565b14611437575f6113b485612893565b90505f806113c583604001516129a9565b5091509150818460400151146113f15760405163089938b360e11b81526004810183905260240161065c565b806001600160401b03168460c001516001600160401b0316111561143357604051632e19bc2d60e11b81526001600160401b038216600482015260240161065c565b5050505b611440836126ac565b505061145860015f805160206152dc83398151915255565b5050565b5f805160206152bc8339815191525f8061148161147885612893565b604001516131f5565b91509150806114a757604051632d07135360e01b8152811515600482015260240161065c565b5f828152600684016020526040902080546114c190614e59565b90505f036114e55760405163089938b360e11b81526004810183905260240161065c565b60015f83815260078501602052604090205460ff16600581111561150b5761150b614ad6565b1461153e575f8281526007840160205260409081902054905163170cc93360e21b815261065c9160ff1690600401614b67565b5f82815260068401602052604081206115569161487e565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f8051602061527c8339815191526020526040808220815160e0810190925280545f8051602061529c83398151915293929190829060ff16600381111561163257611632614ad6565b600381111561164357611643614ad6565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116bc576116bc614ad6565b141580156116dd57506003815160038111156116da576116da614ad6565b14155b156116fe578051604051633b0d540d60e21b815261065c9190600401614c13565b5f61170c8260400151611935565b905080606001516001600160401b03165f0361173e576040516339b894f960e21b81526004810185905260240161065c565b6005600160991b016001600160a01b031663ee5b48eb61176b846040015184606001518560800151611c7b565b6040518263ffffffff1660e01b81526004016117879190614b97565b6020604051808303815f875af11580156117a3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a3c9190614bc9565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206152bc833981519152919061180e90614e59565b90505f036118325760405163089938b360e11b81526004810183905260240161065c565b60015f83815260078301602052604090205460ff16600581111561185857611858614ad6565b1461188b575f8281526007820160205260409081902054905163170cc93360e21b815261065c9160ff1690600401614b67565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118c49190600401614e8b565b6020604051808303815f875af11580156118e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106659190614bc9565b5f61190d61218c565b611918823334613399565b905061193060015f805160206152dc83398151915255565b919050565b61193d6148b5565b5f8281525f805160206152fc833981519152602052604090819020815160e0810190925280545f805160206152bc833981519152929190829060ff16600581111561198a5761198a614ad6565b600581111561199b5761199b614ad6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f8381525f8051602061527c8339815191526020526040808220815160e0810190925280545f8051602061529c8339815191529284929091829060ff166003811115611a4b57611a4b614ad6565b6003811115611a5c57611a5c614ad6565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611ad282611935565b9050600283516003811115611ae957611ae9614ad6565b14611b0a578251604051633b0d540d60e21b815261065c9190600401614c13565b60208301516001600160a01b03163314611b245733611229565b600281516005811115611b3957611b39614ad6565b03611c16578615611b5057611b4e8287611d19565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611b89918491611b849190614f15565b61366e565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611bca846137c5565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a31515945061099b9350505050565b600481516005811115611c2b57611c2b614ad6565b03611c5f57611c39836137c5565b5f898152600686016020526040902055611c52886126ac565b600194505050505061099b565b805160405163170cc93360e21b815261065c9190600401614b67565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b611cd2613971565b611cdb816139bc565b50565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d64573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d8b9190810190614f40565b9150915080611dad57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611df0573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e149190614bc9565b825114611e3a578151604051636ba589a560e01b8152600481019190915260240161065c565b60208201516001600160a01b031615611e76576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161065c565b5f80611e858460400151613a2a565b91509150818714611eac5760405163089938b360e11b81526004810188905260240161065c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f8051602061529c833981519152906001600160401b039081169083161115611f69575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611f88565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f8051602061529c83398151915281611fac86613c05565b9050611fb786611cde565b611fc65760019250505061099b565b5f8681526004830160205260409020546001600160a01b03163314611feb5733611229565b5f86815260048301602052604090205460a082015161201a91600160b01b90046001600160401b031690615012565b6001600160401b03168160c001516001600160401b031610156120615760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161065c565b5f8515612079576120728786611d19565b9050612097565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906120bc90611161565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015612132573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121569190614bc9565b905080846007015f8a81526020019081526020015f205f82825461217a9190614e0d565b90915550501515979650505050505050565b5f805160206152dc8339815191528054600119016121bd57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061529c83398151915290600160401b900461ffff9081169086161080612217575061271061ffff8616115b1561223b57604051635f12e6c360e11b815261ffff8616600482015260240161065c565b60028101546001600160401b039081169085161015612277576040516202a06d60e11b81526001600160401b038516600482015260240161065c565b80548310806122895750806001015483115b156122aa5760405163222d164360e21b81526004810184905260240161065c565b825f6122b58261094d565b90505f6122c28983613e57565b905060405180608001604052806122d63390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b60015f805160206152dc83398151915255565b5f6123ad6148b5565b5f805160206152bc8339815191525f806123c961147887612893565b9150915080156123f057604051632d07135360e01b8152811515600482015260240161065c565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561242157612421614ad6565b600581111561243257612432614ad6565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156124a1576124a1614ad6565b141580156124c257506001815160058111156124bf576124bf614ad6565b14155b156124e357805160405163170cc93360e21b815261065c9190600401614b67565b6003815160058111156124f8576124f8614ad6565b03612506576004815261250b565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff1916600183600581111561255057612550614ad6565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561260457612604614ad6565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612687575f80fd5b505af1158015610b72573d5f803e3d5ffd5b6114586001600160a01b03831682614289565b5f8181525f8051602061527c8339815191526020526040808220815160e0810190925280545f8051602061529c83398151915293929190829060ff1660038111156126f9576126f9614ad6565b600381111561270a5761270a614ad6565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612838575f848152600487016020526040902054612710906127ea90600160a01b900461ffff1685614e42565b6127f49190614bf4565b915081866007015f8681526020019081526020015f205f8282546128189190614e0d565b9091555061282890508284615032565b905061283885602001518261263b565b61284d8560200151610a378760600151611161565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156128f7573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261291e9190810190614f40565b915091508061294057604051636b2f19e960e01b815260040160405180910390fd5b815115612966578151604051636ba589a560e01b8152600481019190915260240161065c565b60208201516001600160a01b0316156129a2576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161065c565b5092915050565b5f805f83516036146129ce57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612a1d576129e5816001615032565b6129f0906008614e42565b61ffff16868281518110612a0657612a06614ca1565b016020015160f81c901b91909117906001016129d1565b5061ffff811615612a415760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612a9c57612a58816003615032565b612a63906008614e42565b63ffffffff1687612a75836002614e0d565b81518110612a8557612a85614ca1565b016020015160f81c901b9190911790600101612a44565b5063ffffffff8116600414612ac457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612b1957612adb81601f615032565b612ae6906008614e42565b88612af2836006614e0d565b81518110612b0257612b02614ca1565b016020015160f81c901b9190911790600101612ac7565b505f805b6008811015612b7857612b31816007615032565b612b3c906008614e42565b6001600160401b031689612b51836026614e0d565b81518110612b6157612b61614ca1565b016020015160f81c901b9190911790600101612b1d565b505f805b6008811015612bd757612b90816007615032565b612b9b906008614e42565b6001600160401b03168a612bb083602e614e0d565b81518110612bc057612bc0614ca1565b016020015160f81c901b9190911790600101612b7c565b5091989097509095509350505050565b5f8151602614612c0a57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612c5957612c21816001615032565b612c2c906008614e42565b61ffff16848281518110612c4257612c42614ca1565b016020015160f81c901b9190911790600101612c0d565b5061ffff811615612c7d5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612cd857612c94816003615032565b612c9f906008614e42565b63ffffffff1685612cb1836002614e0d565b81518110612cc157612cc1614ca1565b016020015160f81c901b9190911790600101612c80565b5063ffffffff811615612cfe57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612d5357612d1581601f615032565b612d20906008614e42565b86612d2c836006614e0d565b81518110612d3c57612d3c614ca1565b016020015160f81c901b9190911790600101612d01565b50949350505050565b60605f612d6b83830184614c5c565b612d7791506058614e42565b612d8290605c614e0d565b6001600160401b03811115612d9957612d99614cd3565b6040519080825280601f01601f191660200182016040528015612dc3576020820181803683370190505b5090505f5b6020811015612e185783358160208110612de457612de4614ca1565b1a60f81b828281518110612dfa57612dfa614ca1565b60200101906001600160f81b03191690815f1a905350600101612dc8565b505f5b6020811015612e785783602001358160208110612e3a57612e3a614ca1565b1a60f81b82612e4a836020614e0d565b81518110612e5a57612e5a614ca1565b60200101906001600160f81b03191690815f1a905350600101612e1b565b505f5b6004811015612edb57612e8f816003615032565b612e9a906008614e42565b6014901c60f81b82612ead836040614e0d565b81518110612ebd57612ebd614ca1565b60200101906001600160f81b03191690815f1a905350600101612e7b565b505f612eed6060850160408601614c41565b60601b90505f5b6014811015612f4d57818160148110612f0f57612f0f614ca1565b1a60f81b83612f1f836044614e0d565b81518110612f2f57612f2f614ca1565b60200101906001600160f81b03191690815f1a905350600101612ef4565b505f612f5c6060860186614c5c565b905090505f5b6004811015612fc757612f76816003615032565b612f81906008614e42565b63ffffffff8316901c60f81b84612f99836058614e0d565b81518110612fa957612fa9614ca1565b60200101906001600160f81b03191690815f1a905350600101612f62565b505f5b612fd76060870187614c5c565b90508110156131eb575f612fec826058614e42565b612ff790605c614e0d565b90505f5b6020811015613082576130116060890189614c5c565b8481811061302157613021614ca1565b90506020028101906130339190614cb5565b35816020811061304557613045614ca1565b1a60f81b866130548385614e0d565b8151811061306457613064614ca1565b60200101906001600160f81b03191690815f1a905350600101612ffb565b505f5b600881101561313757613099816007615032565b6130a4906008614e42565b6130b160608a018a614c5c565b858181106130c1576130c1614ca1565b90506020028101906130d39190614cb5565b6130e4906040810190602001614abd565b6001600160401b0316901c60f81b86826130ff856020614e0d565b6131099190614e0d565b8151811061311957613119614ca1565b60200101906001600160f81b03191690815f1a905350600101613085565b505f5b60308110156131e1576131506060890189614c5c565b8481811061316057613160614ca1565b90506020028101906131729190614cb5565b613180906040810190615045565b8281811061319057613190614ca1565b9050013560f81c60f81b86828460286131a99190614e0d565b6131b39190614e0d565b815181106131c3576131c3614ca1565b60200101906001600160f81b03191690815f1a90535060010161313a565b5050600101612fca565b5091949350505050565b5f80825160271461321957604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561326857613230816001615032565b61323b906008614e42565b61ffff1685828151811061325157613251614ca1565b016020015160f81c901b919091179060010161321c565b5061ffff81161561328c5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156132e7576132a3816003615032565b6132ae906008614e42565b63ffffffff16866132c0836002614e0d565b815181106132d0576132d0614ca1565b016020015160f81c901b919091179060010161328f565b5063ffffffff811660031461330f57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156133645761332681601f615032565b613331906008614e42565b8761333d836006614e0d565b8151811061334d5761334d614ca1565b016020015160f81c901b9190911790600101613312565b505f8660268151811061337957613379614ca1565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f8051602061529c833981519152816133b28461094d565b90505f6133be87611935565b90506133c987611cde565b6133e9576040516330efa98b60e01b81526004810188905260240161065c565b6002815160058111156133fe576133fe614ad6565b1461341f57805160405163170cc93360e21b815261065c9190600401614b67565b5f8282608001516134309190615012565b905083600201600a9054906101000a90046001600160401b031682604001516134599190615087565b6001600160401b0316816001600160401b0316111561349657604051636d51fe0560e11b81526001600160401b038216600482015260240161065c565b5f806134a28a8461366e565b915091505f8a836040516020016134d092919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561356357613563614ad6565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f805160206152fc833981519152602052604081206002015481905f805160206152bc83398151915290600160801b90046001600160401b03166136b6858261431c565b5f6136c0876144f6565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137108a858b611c7b565b6040518263ffffffff1660e01b815260040161372c9190614b97565b6020604051808303815f875af1158015613748573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061376c9190614bc9565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f8051602061529c83398151915290505f6137e58460400151611935565b90505f6003825160058111156137fd576137fd614ad6565b148061381b575060048251600581111561381957613819614ad6565b145b1561382b575060c0810151613868565b60028251600581111561384057613840614ad6565b0361384c575042613868565b815160405163170cc93360e21b815261065c9190600401614b67565b84608001516001600160401b0316816001600160401b03161161388f57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906138b490611161565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613944573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139689190614bc9565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166139ba57604051631afcd79f60e31b815260040160405180910390fd5b565b6139c4613971565b6139cd8161456b565b6139d5614584565b611cdb606082013560808301356139f260c0850160a08601614abd565b613a0260e0860160c087016150b2565b613a13610100870160e088016150cb565b613a2561012088016101008901614c41565b614594565b5f808251602e14613a4e57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613a9d57613a65816001615032565b613a70906008614e42565b61ffff16858281518110613a8657613a86614ca1565b016020015160f81c901b9190911790600101613a51565b5061ffff811615613ac15760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613b1c57613ad8816003615032565b613ae3906008614e42565b63ffffffff1686613af5836002614e0d565b81518110613b0557613b05614ca1565b016020015160f81c901b9190911790600101613ac4565b5063ffffffff8116600514613b4457604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b9957613b5b81601f615032565b613b66906008614e42565b87613b72836006614e0d565b81518110613b8257613b82614ca1565b016020015160f81c901b9190911790600101613b47565b505f805b6008811015613bf857613bb1816007615032565b613bbc906008614e42565b6001600160401b031688613bd1836026614e0d565b81518110613be157613be1614ca1565b016020015160f81c901b9190911790600101613b9d565b5090969095509350505050565b613c0d6148b5565b5f8281525f805160206152fc8339815191526020526040808220815160e0810190925280545f805160206152bc83398151915293929190829060ff166005811115613c5a57613c5a614ad6565b6005811115613c6b57613c6b614ad6565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613cdd57613cdd614ad6565b14613d10575f8481526007830160205260409081902054905163170cc93360e21b815261065c9160ff1690600401614b67565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613d5457613d54614ad6565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e00858261366e565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e9b57604051637fab81e560e01b815260040160405180910390fd5b5f805160206152bc83398151915242613eba6040860160208701614abd565b6001600160401b0316111580613ef45750613ed86202a30042614e0d565b613ee86040860160208701614abd565b6001600160401b031610155b15613f2e57613f096040850160208601614abd565b604051635879da1360e11b81526001600160401b03909116600482015260240161065c565b6030613f3d6040860186615045565b905014613f6f57613f516040850185615045565b6040516326475b2f60e11b815261065c925060040190815260200190565b8335613f915760405163099e922360e21b81528435600482015260240161065c565b83355f90815260088201602052604090205415613fc457604051631ec583cb60e11b81528435600482015260240161065c565b613fce835f61431c565b5f806140676040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906140129190614abd565b6001600160401b0316815260200161402d60408a018a615045565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506146c3565b5f82815260068601602052604090209193509150614085828261512f565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906140c3908590600401614b97565b6020604051808303815f875af11580156140df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141039190614bc9565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff1916600183600581111561417b5761417b614ad6565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b9161425b918e01908e01614abd565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156142ac5760405163cd78605960e01b815230600482015260240161065c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146142f5576040519150601f19603f3d011682016040523d82523d5f602084013e6142fa565b606091505b505090508061066557604051630a12f52160e11b815260040160405180910390fd5b5f805160206152bc8339815191525f6001600160401b038084169085161115614350576143498385614f15565b905061435d565b61435a8484614f15565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806143bf5750600184015481516143bb916001600160401b031690614e0d565b8210155b156143e5576001600160401b038316606082015281815260408101516020820152614404565b82816060018181516143f79190615012565b6001600160401b03169052505b6060810151614414906064615087565b602082015160018601546001600160401b03929092169161443f9190600160401b900460ff16614e42565b101561446f57606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161065c565b856001600160401b03168160400181815161448a9190614e0d565b9052506040810180516001600160401b03871691906144aa908390615032565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206152fc8339815191526020526040812060020180545f805160206152bc833981519152919060089061454090600160401b90046001600160401b03166151ea565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b614573613971565b61457b614786565b611cdb8161478e565b61458c613971565b6139ba614876565b61459c613971565b5f8051602061529c83398151915261ffff841615806145c0575061271061ffff8516115b156145e457604051635f12e6c360e11b815261ffff8516600482015260240161065c565b858711156146085760405163222d164360e21b81526004810188905260240161065c565b60ff8316158061461b5750600a60ff8416115b1561463e5760405163170db35960e31b815260ff8416600482015260240161065c565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146146ec57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f0151866020015187604001518860800151896060015160405160200161471e9796959493929190615205565b604051602081830303815290604052905060028160405161473f9190614dfc565b602060405180830381855afa15801561475a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061477d9190614bc9565b94909350915050565b6139ba613971565b614796613971565b80355f805160206152bc83398151915290815560146147bb60608401604085016150cb565b60ff1611806147da57506147d560608301604084016150cb565b60ff16155b1561480e576147ef60608301604084016150cb565b604051634a59bbff60e11b815260ff909116600482015260240161065c565b61481e60608301604084016150cb565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561484f6040830160208401614abd565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612391613971565b50805461488a90614e59565b5f825580601f10614899575050565b601f0160209004905f5260205f2090810190611cdb91906148f1565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614905575f81556001016148f2565b5090565b8015158114611cdb575f80fd5b803563ffffffff81168114611930575f80fd5b5f805f6060848603121561493b575f80fd5b83359250602084013561494d81614909565b915061495b60408501614916565b90509250925092565b5f60208284031215614974575f80fd5b5035919050565b5f610120828403121561498c575f80fd5b50919050565b5f80604083850312156149a3575f80fd5b823591506149b360208401614916565b90509250929050565b803561ffff81168114611930575f80fd5b80356001600160401b0381168114611930575f80fd5b5f805f606084860312156149f5575f80fd5b83356001600160401b03811115614a0a575f80fd5b840160608187031215614a1b575f80fd5b9250614a29602085016149bc565b915061495b604085016149cd565b5f60208284031215614a47575f80fd5b61099b82614916565b5f8060408385031215614a61575f80fd5b614a6a83614916565b946020939093013593505050565b5f8060408385031215614a89575f80fd5b82356001600160401b03811115614a9e575f80fd5b830160808186031215614aaf575f80fd5b91506149b360208401614916565b5f60208284031215614acd575f80fd5b61099b826149cd565b634e487b7160e01b5f52602160045260245ffd5b60068110614afa57614afa614ad6565b9052565b5f60e082019050614b10828451614aea565b6020830151602083015260408301516001600160401b0380821660408501528060608601511660608501528060808601511660808501528060a08601511660a08501528060c08601511660c0850152505092915050565b6020810161095d8284614aea565b5f5b83811015614b8f578181015183820152602001614b77565b50505f910152565b602081525f8251806020840152614bb5816040850160208701614b75565b601f01601f19169190910160400192915050565b5f60208284031215614bd9575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f82614c0e57634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310614c2757614c27614ad6565b91905290565b6001600160a01b0381168114611cdb575f80fd5b5f60208284031215614c51575f80fd5b813561099b81614c2d565b5f808335601e19843603018112614c71575f80fd5b8301803591506001600160401b03821115614c8a575f80fd5b6020019150600581901b36038213156137be575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614cc9575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614d0957614d09614cd3565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614d3757614d37614cd3565b604052919050565b5f6001600160401b03821115614d5757614d57614cd3565b50601f01601f191660200190565b5f60608236031215614d75575f80fd5b614d7d614ce7565b823581526020614d8e8185016149cd565b8183015260408401356001600160401b03811115614daa575f80fd5b840136601f820112614dba575f80fd5b8035614dcd614dc882614d3f565b614d0f565b8181523684838501011115614de0575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614cc9818460208701614b75565b8082018082111561095d5761095d614be0565b5f63ffffffff808316818103614e3857614e38614be0565b6001019392505050565b808202811582820484141761095d5761095d614be0565b600181811c90821680614e6d57607f821691505b60208210810361498c57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614e9d81614e59565b806020870152604060018084165f8114614ebe5760018114614eda57614f07565b60ff19851660408a0152604084151560051b8a01019550614f07565b895f5260205f205f5b85811015614efe5781548b8201860152908301908801614ee3565b8a016040019650505b509398975050505050505050565b6001600160401b038281168282160390808211156129a2576129a2614be0565b805161193081614909565b5f8060408385031215614f51575f80fd5b82516001600160401b0380821115614f67575f80fd5b9084019060608287031215614f7a575f80fd5b614f82614ce7565b82518152602080840151614f9581614c2d565b82820152604084015183811115614faa575f80fd5b80850194505087601f850112614fbe575f80fd5b83519250614fce614dc884614d3f565b8381528882858701011115614fe1575f80fd5b614ff084838301848801614b75565b80604084015250819550615005818801614f35565b9450505050509250929050565b6001600160401b038181168382160190808211156129a2576129a2614be0565b8181038181111561095d5761095d614be0565b5f808335601e1984360301811261505a575f80fd5b8301803591506001600160401b03821115615073575f80fd5b6020019150368190038213156137be575f80fd5b6001600160401b038181168382160280821691908281146150aa576150aa614be0565b505092915050565b5f602082840312156150c2575f80fd5b61099b826149bc565b5f602082840312156150db575f80fd5b813560ff8116811461099b575f80fd5b601f82111561066557805f5260205f20601f840160051c810160208510156151105750805b601f840160051c820191505b81811015610a3c575f815560010161511c565b81516001600160401b0381111561514857615148614cd3565b61515c816151568454614e59565b846150eb565b602080601f83116001811461518f575f84156151785750858301515b5f19600386901b1c1916600185901b178555610b72565b5f85815260208120601f198616915b828110156151bd5788860151825594840194600190910190840161519e565b50858210156151da57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160401b03808316818103614e3857614e38614be0565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161525a81604e860160208901614b75565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161549a38038061549a83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61534d8061014d5f395ff3fe6080604052600436106101e6575f3560e01c806366435abf11610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063e7d14c1c146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806393e24598116100d857806393e245981461048d57806398f3e2b4146104ac578063a3a65e48146104cb578063afb98096146104ea575f80fd5b806366435abf14610428578063732214f81461044757806376f786211461045a5780638280a25a14610479575f80fd5b806335455ded1161017e5780635297fae61161014e5780635297fae6146103a257806360305d62146103c157806361e2f490146103ea5780636206585614610409575f80fd5b806335455ded1461031b5780633a1cfff61461034357806340034a9314610362578063467ef06f14610383575f80fd5b806320e55565116101b957806320e555651461027457806325e1c776146102935780632e2194d8146102b2578063329c3e12146102e9575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b5061020961020436600461494e565b610635565b005b348015610216575f80fd5b50610209610225366004614989565b61066a565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f36600461494e565b6107f1565b34801561027f575f80fd5b5061020961028e3660046149a0565b6107fc565b34801561029e575f80fd5b506102096102ad3660046149b7565b6108d9565b3480156102bd575f80fd5b506102d16102cc366004614989565b61094d565b6040516001600160401b03909116815260200161024c565b3480156102f4575f80fd5b506103036001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610326575f80fd5b5061033061271081565b60405161ffff909116815260200161024c565b34801561034e575f80fd5b5061020961035d36600461494e565b610963565b610375610370366004614a08565b61096e565b60405190815260200161024c565b34801561038e575f80fd5b5061020961039d366004614a5c565b6109a2565b3480156103ad575f80fd5b506102096103bc366004614a75565b610a64565b3480156103cc575f80fd5b506103d5601481565b60405163ffffffff909116815260200161024c565b3480156103f5575f80fd5b50610209610404366004614a9d565b610ccf565b348015610414575f80fd5b50610375610423366004614ae2565b611182565b348015610433575f80fd5b506102d1610442366004614989565b61119b565b348015610452575f80fd5b506103755f81565b348015610465575f80fd5b5061020961047436600461494e565b6111af565b348015610484575f80fd5b5061023e603081565b348015610498575f80fd5b506102096104a7366004614989565b6111da565b3480156104b7575f80fd5b506102096104c6366004614a75565b6112a5565b3480156104d6575f80fd5b506102096104e5366004614a5c565b61147d565b3480156104f5575f80fd5b506103755f805160206152c183398151915281565b348015610515575f80fd5b506103036005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614989565b611606565b34801561054e575f80fd5b506103755f805160206152e183398151915281565b34801561056e575f80fd5b5061020961057d366004614989565b6117ef565b610375610590366004614989565b61192c565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614989565b61195d565b60405161024c9190614b23565b3480156105e0575f80fd5b506102d16202a30081565b3480156105f6575f80fd5b50610375610605366004614989565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b610640838383611a25565b61066557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206153218339815191526020526040808220815160e0810190925280545f805160206152e183398151915293929190829060ff1660058111156106b7576106b7614afb565b60058111156106c8576106c8614afb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561073757610737614afb565b1461076a575f8381526007830160205260409081902054905163170cc93360e21b815261065c9160ff1690600401614b8c565b6005600160991b016001600160a01b031663ee5b48eb61078f8584606001515f611ca3565b6040518263ffffffff1660e01b81526004016107ab9190614bbc565b6020604051808303815f875af11580156107c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107eb9190614bee565b50505050565b6107eb838383611a25565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610845575080546001600160401b03808416911610155b156108635760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561088d83611cf2565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6108e282611d03565b610902576040516330efa98b60e01b81526004810183905260240161065c565b5f61090c8361195d565b519050600281600581111561092357610923614afb565b14610943578060405163170cc93360e21b815260040161065c9190614b8c565b6107eb8383611d3e565b5f61095d64e8d4a5100083614c19565b92915050565b6107eb838383611fb8565b5f6109776121b1565b610983848484346121e8565b905061099b60015f8051602061530183398151915255565b9392505050565b6109aa6121b1565b5f805160206152c18339815191525f806109c3846123c9565b915091506109d082611d03565b6109dc57505050610a4b565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610a0b57610a0b614afb565b03610a30575f83815260078501602052604081208054919055610a2e8282612660565b505b610a4681610a418460400151611182565b6126be565b505050505b610a6160015f8051602061530183398151915255565b50565b5f8181525f805160206152a18339815191526020526040808220815160e0810190925280545f805160206152c183398151915293929190829060ff166003811115610ab157610ab1614afb565b6003811115610ac257610ac2614afb565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610b388261195d565b9050600183516003811115610b4f57610b4f614afb565b14610b70578251604051633b0d540d60e21b815261065c9190600401614c38565b600481516005811115610b8557610b85614afb565b03610b9b57610b93856126d1565b505050505050565b5f80610bb2610ba9896128b8565b604001516129ce565b5091509150818414610bdf57846040015160405163089938b360e11b815260040161065c91815260200190565b806001600160401b031683606001516001600160401b03161080610c185750806001600160401b03168560a001516001600160401b0316115b15610c4157604051632e19bc2d60e11b81526001600160401b038216600482015260240161065c565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206152e18339815191529060ff1615610d2157604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d889190614bee565b836020013514610db1576040516372b0a7e760e11b81526020840135600482015260240161065c565b30610dc26060850160408601614c66565b6001600160a01b031614610e0557610de06060840160408501614c66565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161065c565b5f610e136060850185614c81565b905090505f805b828163ffffffff1610156110c2575f610e366060880188614c81565b8363ffffffff16818110610e4c57610e4c614cc6565b9050602002810190610e5e9190614cda565b610e6790614d8a565b80515f8181526008880160205260409020549192509015610e9e57604051631ec583cb60e11b81526004810182905260240161065c565b5f6002895f013585604051602001610ecd92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610ee791614e21565b602060405180830381855afa158015610f02573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f259190614bee565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610fb157610fb1614afb565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611064911686614e32565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806110bb90614e45565b9050610e1a565b50600483018190555f6110e06110d7866128b8565b60400151612c0c565b90505f6110ec87612d81565b90505f6002826040516110ff9190614e21565b602060405180830381855afa15801561111a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061113d9190614bee565b905082811461116957604051631872fc8d60e01b8152600481018290526024810184905260440161065c565b5050506009909201805460ff1916600117905550505050565b5f61095d6001600160401b03831664e8d4a51000614e67565b5f6111a58261195d565b6080015192915050565b6111ba838383611fb8565b61066557604051635bff683f60e11b81526004810184905260240161065c565b5f805160206152c18339815191525f6111f28361195d565b519050600481600581111561120957611209614afb565b14611229578060405163170cc93360e21b815260040161065c9190614b8c565b5f8381526004830160205260409020546001600160a01b0316331461126f57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161065c565b5f838152600783016020908152604080832080549084905560048601909252909120546107eb906001600160a01b031682612660565b6112ad6121b1565b5f8181525f805160206152a18339815191526020526040808220815160e0810190925280545f805160206152c183398151915293929190829060ff1660038111156112fa576112fa614afb565b600381111561130b5761130b614afb565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152905060038151600381111561138457611384614afb565b146113a5578051604051633b0d540d60e21b815261065c9190600401614c38565b60046113b4826040015161195d565b5160058111156113c6576113c6614afb565b14611458575f6113d5856128b8565b90505f806113e683604001516129ce565b5091509150818460400151146114125760405163089938b360e11b81526004810183905260240161065c565b806001600160401b03168460c001516001600160401b0316111561145457604051632e19bc2d60e11b81526001600160401b038216600482015260240161065c565b5050505b611461836126d1565b505061147960015f8051602061530183398151915255565b5050565b5f805160206152e18339815191525f806114a2611499856128b8565b6040015161321a565b91509150806114c857604051632d07135360e01b8152811515600482015260240161065c565b5f828152600684016020526040902080546114e290614e7e565b90505f036115065760405163089938b360e11b81526004810183905260240161065c565b60015f83815260078501602052604090205460ff16600581111561152c5761152c614afb565b1461155f575f8281526007840160205260409081902054905163170cc93360e21b815261065c9160ff1690600401614b8c565b5f8281526006840160205260408120611577916148a3565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206152a18339815191526020526040808220815160e0810190925280545f805160206152c183398151915293929190829060ff16600381111561165357611653614afb565b600381111561166457611664614afb565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116dd576116dd614afb565b141580156116fe57506003815160038111156116fb576116fb614afb565b14155b1561171f578051604051633b0d540d60e21b815261065c9190600401614c38565b5f61172d826040015161195d565b905080606001516001600160401b03165f0361175f576040516339b894f960e21b81526004810185905260240161065c565b6005600160991b016001600160a01b031663ee5b48eb61178c846040015184606001518560800151611ca3565b6040518263ffffffff1660e01b81526004016117a89190614bbc565b6020604051808303815f875af11580156117c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117e89190614bee565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206152e1833981519152919061183690614e7e565b90505f0361185a5760405163089938b360e11b81526004810183905260240161065c565b60015f83815260078301602052604090205460ff16600581111561188057611880614afb565b146118b3575f8281526007820160205260409081902054905163170cc93360e21b815261065c9160ff1690600401614b8c565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118ec9190600401614eb0565b6020604051808303815f875af1158015611908573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106659190614bee565b5f6119356121b1565b6119408233346133be565b905061195860015f8051602061530183398151915255565b919050565b6119656148da565b5f8281525f80516020615321833981519152602052604090819020815160e0810190925280545f805160206152e1833981519152929190829060ff1660058111156119b2576119b2614afb565b60058111156119c3576119c3614afb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f8381525f805160206152a18339815191526020526040808220815160e0810190925280545f805160206152c18339815191529284929091829060ff166003811115611a7357611a73614afb565b6003811115611a8457611a84614afb565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611afa8261195d565b9050600283516003811115611b1157611b11614afb565b14611b32578251604051633b0d540d60e21b815261065c9190600401614c38565b60208301516001600160a01b03163314611b4c573361124a565b600281516005811115611b6157611b61614afb565b03611c3e578615611b7857611b768287611d3e565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611bb1918491611bac9190614f3a565b613693565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611bf2846137ea565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a31515945061099b9350505050565b600481516005811115611c5357611c53614afb565b03611c8757611c61836137ea565b5f898152600686016020526040902055611c7a886126d1565b600194505050505061099b565b805160405163170cc93360e21b815261065c9190600401614b8c565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b611cfa613996565b610a61816139e1565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d89573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611db09190810190614f65565b9150915080611dd257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e399190614bee565b825114611e5f578151604051636ba589a560e01b8152600481019190915260240161065c565b60208201516001600160a01b031615611e9b576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161065c565b5f80611eaa8460400151613a4f565b91509150818714611ed15760405163089938b360e11b81526004810188905260240161065c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f805160206152c1833981519152906001600160401b039081169083161115611f8e575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611fad565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f805160206152c183398151915281611fd186613c2a565b9050611fdc86611d03565b611feb5760019250505061099b565b5f8681526004830160205260409020546001600160a01b03163314612010573361124a565b5f86815260048301602052604090205460a082015161203f91600160b01b90046001600160401b031690615037565b6001600160401b03168160c001516001600160401b031610156120865760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161065c565b5f851561209e576120978786611d3e565b90506120bc565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906120e190611182565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015612157573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061217b9190614bee565b905080846007015f8a81526020019081526020015f205f82825461219f9190614e32565b90915550501515979650505050505050565b5f805160206153018339815191528054600119016121e257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206152c183398151915290600160401b900461ffff908116908616108061223c575061271061ffff8616115b1561226057604051635f12e6c360e11b815261ffff8616600482015260240161065c565b60028101546001600160401b03908116908516101561229c576040516202a06d60e11b81526001600160401b038516600482015260240161065c565b80548310806122ae5750806001015483115b156122cf5760405163222d164360e21b81526004810184905260240161065c565b825f6122da8261094d565b90505f6122e78983613e7c565b905060405180608001604052806122fb3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b60015f8051602061530183398151915255565b5f6123d26148da565b5f805160206152e18339815191525f806123ee611499876128b8565b91509150801561241557604051632d07135360e01b8152811515600482015260240161065c565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561244657612446614afb565b600581111561245757612457614afb565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156124c6576124c6614afb565b141580156124e757506001815160058111156124e4576124e4614afb565b14155b1561250857805160405163170cc93360e21b815261065c9190600401614b8c565b60038151600581111561251d5761251d614afb565b0361252b5760048152612530565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff1916600183600581111561257557612575614afb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561262957612629614afb565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156126ac575f80fd5b505af1158015610b93573d5f803e3d5ffd5b6114796001600160a01b038316826142ae565b5f8181525f805160206152a18339815191526020526040808220815160e0810190925280545f805160206152c183398151915293929190829060ff16600381111561271e5761271e614afb565b600381111561272f5761272f614afb565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870190915290812080549082905592935090919080821561285d575f8481526004870160205260409020546127109061280f90600160a01b900461ffff1685614e67565b6128199190614c19565b915081866007015f8681526020019081526020015f205f82825461283d9190614e32565b9091555061284d90508284615057565b905061285d856020015182612660565b6128728560200151610a418760600151611182565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561291c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129439190810190614f65565b915091508061296557604051636b2f19e960e01b815260040160405180910390fd5b81511561298b578151604051636ba589a560e01b8152600481019190915260240161065c565b60208201516001600160a01b0316156129c7576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161065c565b5092915050565b5f805f83516036146129f357604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612a4257612a0a816001615057565b612a15906008614e67565b61ffff16868281518110612a2b57612a2b614cc6565b016020015160f81c901b91909117906001016129f6565b5061ffff811615612a665760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612ac157612a7d816003615057565b612a88906008614e67565b63ffffffff1687612a9a836002614e32565b81518110612aaa57612aaa614cc6565b016020015160f81c901b9190911790600101612a69565b5063ffffffff8116600414612ae957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612b3e57612b0081601f615057565b612b0b906008614e67565b88612b17836006614e32565b81518110612b2757612b27614cc6565b016020015160f81c901b9190911790600101612aec565b505f805b6008811015612b9d57612b56816007615057565b612b61906008614e67565b6001600160401b031689612b76836026614e32565b81518110612b8657612b86614cc6565b016020015160f81c901b9190911790600101612b42565b505f805b6008811015612bfc57612bb5816007615057565b612bc0906008614e67565b6001600160401b03168a612bd583602e614e32565b81518110612be557612be5614cc6565b016020015160f81c901b9190911790600101612ba1565b5091989097509095509350505050565b5f8151602614612c2f57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612c7e57612c46816001615057565b612c51906008614e67565b61ffff16848281518110612c6757612c67614cc6565b016020015160f81c901b9190911790600101612c32565b5061ffff811615612ca25760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612cfd57612cb9816003615057565b612cc4906008614e67565b63ffffffff1685612cd6836002614e32565b81518110612ce657612ce6614cc6565b016020015160f81c901b9190911790600101612ca5565b5063ffffffff811615612d2357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612d7857612d3a81601f615057565b612d45906008614e67565b86612d51836006614e32565b81518110612d6157612d61614cc6565b016020015160f81c901b9190911790600101612d26565b50949350505050565b60605f612d9083830184614c81565b612d9c91506058614e67565b612da790605c614e32565b6001600160401b03811115612dbe57612dbe614cf8565b6040519080825280601f01601f191660200182016040528015612de8576020820181803683370190505b5090505f5b6020811015612e3d5783358160208110612e0957612e09614cc6565b1a60f81b828281518110612e1f57612e1f614cc6565b60200101906001600160f81b03191690815f1a905350600101612ded565b505f5b6020811015612e9d5783602001358160208110612e5f57612e5f614cc6565b1a60f81b82612e6f836020614e32565b81518110612e7f57612e7f614cc6565b60200101906001600160f81b03191690815f1a905350600101612e40565b505f5b6004811015612f0057612eb4816003615057565b612ebf906008614e67565b6014901c60f81b82612ed2836040614e32565b81518110612ee257612ee2614cc6565b60200101906001600160f81b03191690815f1a905350600101612ea0565b505f612f126060850160408601614c66565b60601b90505f5b6014811015612f7257818160148110612f3457612f34614cc6565b1a60f81b83612f44836044614e32565b81518110612f5457612f54614cc6565b60200101906001600160f81b03191690815f1a905350600101612f19565b505f612f816060860186614c81565b905090505f5b6004811015612fec57612f9b816003615057565b612fa6906008614e67565b63ffffffff8316901c60f81b84612fbe836058614e32565b81518110612fce57612fce614cc6565b60200101906001600160f81b03191690815f1a905350600101612f87565b505f5b612ffc6060870187614c81565b9050811015613210575f613011826058614e67565b61301c90605c614e32565b90505f5b60208110156130a7576130366060890189614c81565b8481811061304657613046614cc6565b90506020028101906130589190614cda565b35816020811061306a5761306a614cc6565b1a60f81b866130798385614e32565b8151811061308957613089614cc6565b60200101906001600160f81b03191690815f1a905350600101613020565b505f5b600881101561315c576130be816007615057565b6130c9906008614e67565b6130d660608a018a614c81565b858181106130e6576130e6614cc6565b90506020028101906130f89190614cda565b613109906040810190602001614ae2565b6001600160401b0316901c60f81b8682613124856020614e32565b61312e9190614e32565b8151811061313e5761313e614cc6565b60200101906001600160f81b03191690815f1a9053506001016130aa565b505f5b6030811015613206576131756060890189614c81565b8481811061318557613185614cc6565b90506020028101906131979190614cda565b6131a590604081019061506a565b828181106131b5576131b5614cc6565b9050013560f81c60f81b86828460286131ce9190614e32565b6131d89190614e32565b815181106131e8576131e8614cc6565b60200101906001600160f81b03191690815f1a90535060010161315f565b5050600101612fef565b5091949350505050565b5f80825160271461323e57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561328d57613255816001615057565b613260906008614e67565b61ffff1685828151811061327657613276614cc6565b016020015160f81c901b9190911790600101613241565b5061ffff8116156132b15760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561330c576132c8816003615057565b6132d3906008614e67565b63ffffffff16866132e5836002614e32565b815181106132f5576132f5614cc6565b016020015160f81c901b91909117906001016132b4565b5063ffffffff811660031461333457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156133895761334b81601f615057565b613356906008614e67565b87613362836006614e32565b8151811061337257613372614cc6565b016020015160f81c901b9190911790600101613337565b505f8660268151811061339e5761339e614cc6565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f805160206152c1833981519152816133d78461094d565b90505f6133e38761195d565b90506133ee87611d03565b61340e576040516330efa98b60e01b81526004810188905260240161065c565b60028151600581111561342357613423614afb565b1461344457805160405163170cc93360e21b815261065c9190600401614b8c565b5f8282608001516134559190615037565b905083600201600a9054906101000a90046001600160401b0316826040015161347e91906150ac565b6001600160401b0316816001600160401b031611156134bb57604051636d51fe0560e11b81526001600160401b038216600482015260240161065c565b5f806134c78a84613693565b915091505f8a836040516020016134f592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561358857613588614afb565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615321833981519152602052604081206002015481905f805160206152e183398151915290600160801b90046001600160401b03166136db8582614341565b5f6136e58761451b565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137358a858b611ca3565b6040518263ffffffff1660e01b81526004016137519190614bbc565b6020604051808303815f875af115801561376d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137919190614bee565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f805160206152c183398151915290505f61380a846040015161195d565b90505f60038251600581111561382257613822614afb565b1480613840575060048251600581111561383e5761383e614afb565b145b15613850575060c081015161388d565b60028251600581111561386557613865614afb565b0361387157504261388d565b815160405163170cc93360e21b815261065c9190600401614b8c565b84608001516001600160401b0316816001600160401b0316116138b457505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906138d990611182565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613969573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061398d9190614bee565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166139df57604051631afcd79f60e31b815260040160405180910390fd5b565b6139e9613996565b6139f281614590565b6139fa6145a9565b610a6160608201356080830135613a1760c0850160a08601614ae2565b613a2760e0860160c087016150d7565b613a38610100870160e088016150f0565b613a4a61012088016101008901614c66565b6145b9565b5f808251602e14613a7357604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015613ac257613a8a816001615057565b613a95906008614e67565b61ffff16858281518110613aab57613aab614cc6565b016020015160f81c901b9190911790600101613a76565b5061ffff811615613ae65760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015613b4157613afd816003615057565b613b08906008614e67565b63ffffffff1686613b1a836002614e32565b81518110613b2a57613b2a614cc6565b016020015160f81c901b9190911790600101613ae9565b5063ffffffff8116600514613b6957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613bbe57613b8081601f615057565b613b8b906008614e67565b87613b97836006614e32565b81518110613ba757613ba7614cc6565b016020015160f81c901b9190911790600101613b6c565b505f805b6008811015613c1d57613bd6816007615057565b613be1906008614e67565b6001600160401b031688613bf6836026614e32565b81518110613c0657613c06614cc6565b016020015160f81c901b9190911790600101613bc2565b5090969095509350505050565b613c326148da565b5f8281525f805160206153218339815191526020526040808220815160e0810190925280545f805160206152e183398151915293929190829060ff166005811115613c7f57613c7f614afb565b6005811115613c9057613c90614afb565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613d0257613d02614afb565b14613d35575f8481526007830160205260409081902054905163170cc93360e21b815261065c9160ff1690600401614b8c565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613d7957613d79614afb565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e258582613693565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613ec057604051637fab81e560e01b815260040160405180910390fd5b5f805160206152e183398151915242613edf6040860160208701614ae2565b6001600160401b0316111580613f195750613efd6202a30042614e32565b613f0d6040860160208701614ae2565b6001600160401b031610155b15613f5357613f2e6040850160208601614ae2565b604051635879da1360e11b81526001600160401b03909116600482015260240161065c565b6030613f62604086018661506a565b905014613f9457613f76604085018561506a565b6040516326475b2f60e11b815261065c925060040190815260200190565b8335613fb65760405163099e922360e21b81528435600482015260240161065c565b83355f90815260088201602052604090205415613fe957604051631ec583cb60e11b81528435600482015260240161065c565b613ff3835f614341565b5f8061408c6040518060a00160405280855f01548152602001885f01358152602001876001600160401b031681526020018860200160208101906140379190614ae2565b6001600160401b0316815260200161405260408a018a61506a565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506146e8565b5f828152600686016020526040902091935091506140aa8282615154565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906140e8908590600401614bbc565b6020604051808303815f875af1158015614104573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141289190614bee565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156141a0576141a0614afb565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91614280918e01908e01614ae2565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b804710156142d15760405163cd78605960e01b815230600482015260240161065c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461431a576040519150601f19603f3d011682016040523d82523d5f602084013e61431f565b606091505b505090508061066557604051630a12f52160e11b815260040160405180910390fd5b5f805160206152e18339815191525f6001600160401b0380841690851611156143755761436e8385614f3a565b9050614382565b61437f8484614f3a565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806143e45750600184015481516143e0916001600160401b031690614e32565b8210155b1561440a576001600160401b038316606082015281815260408101516020820152614429565b828160600181815161441c9190615037565b6001600160401b03169052505b60608101516144399060646150ac565b602082015160018601546001600160401b0392909216916144649190600160401b900460ff16614e67565b101561449457606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161065c565b856001600160401b0316816040018181516144af9190614e32565b9052506040810180516001600160401b03871691906144cf908390615057565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206153218339815191526020526040812060020180545f805160206152e1833981519152919060089061456590600160401b90046001600160401b031661520f565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b614598613996565b6145a06147ab565b610a61816147b3565b6145b1613996565b6139df61489b565b6145c1613996565b5f805160206152c183398151915261ffff841615806145e5575061271061ffff8516115b1561460957604051635f12e6c360e11b815261ffff8516600482015260240161065c565b8587111561462d5760405163222d164360e21b81526004810188905260240161065c565b60ff831615806146405750600a60ff8416115b156146635760405163170db35960e31b815260ff8416600482015260240161065c565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f606082608001515160301461471157604051638d0242c960e01b815260040160405180910390fd5b5f806001855f01518660200151876040015188608001518960600151604051602001614743979695949392919061522a565b60405160208183030381529060405290506002816040516147649190614e21565b602060405180830381855afa15801561477f573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906147a29190614bee565b94909350915050565b6139df613996565b6147bb613996565b80355f805160206152e183398151915290815560146147e060608401604085016150f0565b60ff1611806147ff57506147fa60608301604084016150f0565b60ff16155b156148335761481460608301604084016150f0565b604051634a59bbff60e11b815260ff909116600482015260240161065c565b61484360608301604084016150f0565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556148746040830160208401614ae2565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6123b6613996565b5080546148af90614e7e565b5f825580601f106148be575050565b601f0160209004905f5260205f2090810190610a619190614916565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561492a575f8155600101614917565b5090565b8015158114610a61575f80fd5b803563ffffffff81168114611958575f80fd5b5f805f60608486031215614960575f80fd5b8335925060208401356149728161492e565b91506149806040850161493b565b90509250925092565b5f60208284031215614999575f80fd5b5035919050565b5f61012082840312156149b1575f80fd5b50919050565b5f80604083850312156149c8575f80fd5b823591506149d86020840161493b565b90509250929050565b803561ffff81168114611958575f80fd5b80356001600160401b0381168114611958575f80fd5b5f805f60608486031215614a1a575f80fd5b83356001600160401b03811115614a2f575f80fd5b840160608187031215614a40575f80fd5b9250614a4e602085016149e1565b9150614980604085016149f2565b5f60208284031215614a6c575f80fd5b61099b8261493b565b5f8060408385031215614a86575f80fd5b614a8f8361493b565b946020939093013593505050565b5f8060408385031215614aae575f80fd5b82356001600160401b03811115614ac3575f80fd5b830160808186031215614ad4575f80fd5b91506149d86020840161493b565b5f60208284031215614af2575f80fd5b61099b826149f2565b634e487b7160e01b5f52602160045260245ffd5b60068110614b1f57614b1f614afb565b9052565b5f60e082019050614b35828451614b0f565b6020830151602083015260408301516001600160401b0380821660408501528060608601511660608501528060808601511660808501528060a08601511660a08501528060c08601511660c0850152505092915050565b6020810161095d8284614b0f565b5f5b83811015614bb4578181015183820152602001614b9c565b50505f910152565b602081525f8251806020840152614bda816040850160208701614b9a565b601f01601f19169190910160400192915050565b5f60208284031215614bfe575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f82614c3357634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310614c4c57614c4c614afb565b91905290565b6001600160a01b0381168114610a61575f80fd5b5f60208284031215614c76575f80fd5b813561099b81614c52565b5f808335601e19843603018112614c96575f80fd5b8301803591506001600160401b03821115614caf575f80fd5b6020019150600581901b36038213156137e3575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614cee575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614d2e57614d2e614cf8565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614d5c57614d5c614cf8565b604052919050565b5f6001600160401b03821115614d7c57614d7c614cf8565b50601f01601f191660200190565b5f60608236031215614d9a575f80fd5b614da2614d0c565b823581526020614db38185016149f2565b8183015260408401356001600160401b03811115614dcf575f80fd5b840136601f820112614ddf575f80fd5b8035614df2614ded82614d64565b614d34565b8181523684838501011115614e05575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614cee818460208701614b9a565b8082018082111561095d5761095d614c05565b5f63ffffffff808316818103614e5d57614e5d614c05565b6001019392505050565b808202811582820484141761095d5761095d614c05565b600181811c90821680614e9257607f821691505b6020821081036149b157634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614ec281614e7e565b806020870152604060018084165f8114614ee35760018114614eff57614f2c565b60ff19851660408a0152604084151560051b8a01019550614f2c565b895f5260205f205f5b85811015614f235781548b8201860152908301908801614f08565b8a016040019650505b509398975050505050505050565b6001600160401b038281168282160390808211156129c7576129c7614c05565b80516119588161492e565b5f8060408385031215614f76575f80fd5b82516001600160401b0380821115614f8c575f80fd5b9084019060608287031215614f9f575f80fd5b614fa7614d0c565b82518152602080840151614fba81614c52565b82820152604084015183811115614fcf575f80fd5b80850194505087601f850112614fe3575f80fd5b83519250614ff3614ded84614d64565b8381528882858701011115615006575f80fd5b61501584838301848801614b9a565b8060408401525081955061502a818801614f5a565b9450505050509250929050565b6001600160401b038181168382160190808211156129c7576129c7614c05565b8181038181111561095d5761095d614c05565b5f808335601e1984360301811261507f575f80fd5b8301803591506001600160401b03821115615098575f80fd5b6020019150368190038213156137e3575f80fd5b6001600160401b038181168382160280821691908281146150cf576150cf614c05565b505092915050565b5f602082840312156150e7575f80fd5b61099b826149e1565b5f60208284031215615100575f80fd5b813560ff8116811461099b575f80fd5b601f82111561066557805f5260205f20601f840160051c810160208510156151355750805b601f840160051c820191505b818110156117e8575f8155600101615141565b81516001600160401b0381111561516d5761516d614cf8565b6151818161517b8454614e7e565b84615110565b602080601f8311600181146151b4575f841561519d5750858301515b5f19600386901b1c1916600185901b178555610b93565b5f85815260208120601f198616915b828110156151e2578886015182559484019460019091019084016151c3565b50858210156151ff57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160401b03808316818103614e5d57614e5d614c05565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161527f81604e860160208901614b9a565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. From 9229121c0945f54904171c3991258d84ef4c9ab5 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 27 Sep 2024 15:34:03 -0500 Subject: [PATCH 445/545] format --- contracts/validator-manager/ValidatorMessages.sol | 2 +- contracts/validator-manager/interfaces/IPoSValidatorManager.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index cf651abdf..b3edbc36c 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -7,7 +7,7 @@ pragma solidity 0.8.25; import {SubnetConversionData} from "./interfaces/IValidatorManager.sol"; /** - @dev Packing utilities for the Warp message types used by the Validator Manager contracts, as specified in ACP-77: + * @dev Packing utilities for the Warp message types used by the Validator Manager contracts, as specified in ACP-77: * https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets */ library ValidatorMessages { diff --git a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol index cf6e00abe..7a2eb9dbd 100644 --- a/contracts/validator-manager/interfaces/IPoSValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IPoSValidatorManager.sol @@ -54,7 +54,7 @@ struct PoSValidatorInfo { uint64 uptimeSeconds; } -/** +/** * @notice Interface for Proof of Stake Validator Managers */ interface IPoSValidatorManager is IValidatorManager { From 6121347c0f2b6e33484b38164534ea1e5960a567 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 1 Oct 2024 14:25:44 -0500 Subject: [PATCH 446/545] cleanup message spec --- contracts/validator-manager/MessageSpec.md | 59 +++++++++++++++------- 1 file changed, 42 insertions(+), 17 deletions(-) diff --git a/contracts/validator-manager/MessageSpec.md b/contracts/validator-manager/MessageSpec.md index 62a063b92..95b051574 100644 --- a/contracts/validator-manager/MessageSpec.md +++ b/contracts/validator-manager/MessageSpec.md @@ -1,10 +1,31 @@ ## Warp Message Format Reference +### `SubnetConversionMessage` + +Description: Confirms conversion to a Permissionless Subnet on the P-Chain + +Signed by: P-Chain + +Consumed by: Validator Manager contract + +Specification: + ++--------------------+----------+----------+ +| codecID : uint16 | 2 bytes | ++--------------------+----------+----------+ +| typeID : uint32 | 4 bytes | ++--------------------+----------+----------+ +| subnetConversionID : [32]byte | 32 bytes | ++--------------------+----------+----------+ + | 38 bytes | + +----------+ + ### `RegisterSubnetValidatorMessage` -Description: Register a Subnet Validator on the P-Chain +Description: Registers a Subnet Validator on the P-Chain Signed by: Subnet + Consumed by: P-Chain Specification: @@ -35,6 +56,7 @@ Specification: Description: Confirms a Subnet Validator's registration validity on the P-Chain Signed by: P-Chain + Consumed by: Validator Manager contract Specification: @@ -53,12 +75,13 @@ Specification: +----------+ ``` -### `ValidationUptimeMessage` +### `SetSubnetValidatorWeightMessage` -Description: Provides a Validator's uptime for calculating staking rewards +Description: Used to set a Validator's stake weight on another chain Signed by: Subnet -Consumed by: Validator Manager contract + +Consumed by: P-Chain Specification: @@ -70,18 +93,21 @@ Specification: +--------------+----------+----------+ | validationID : [32]byte | 32 bytes | +--------------+----------+----------+ -| uptime : uint64 | 8 bytes | +| nonce : uint64 | 8 bytes | +--------------+----------+----------+ - | 46 bytes | +| weight : uint64 | 8 bytes | ++--------------+----------+----------+ + | 54 bytes | +----------+ ``` -### `SetSubnetValidatorWeightMessage` +### `SubnetValidatorWeightUpdateMessage` -Description: Used to set a Validator's stake weight on another chain +Description: Acknowledges a Validator weight update -Signed by: Subnet -Consumed by: P-Chain +Signed by: P-Chain + +Consumed by: Validator Manager contract Specification: @@ -101,11 +127,12 @@ Specification: +----------+ ``` -### `SubnetValidatorWeightUpdateMessage` +### `ValidationUptimeMessage` -Description: Acknowledges a Validator weight update +Description: Provides a Validator's uptime for calculating staking rewards + +Signed by: Subnet -Signed by: P-Chain Consumed by: Validator Manager contract Specification: @@ -118,10 +145,8 @@ Specification: +--------------+----------+----------+ | validationID : [32]byte | 32 bytes | +--------------+----------+----------+ -| nonce : uint64 | 8 bytes | -+--------------+----------+----------+ -| weight : uint64 | 8 bytes | +| uptime : uint64 | 8 bytes | +--------------+----------+----------+ - | 54 bytes | + | 46 bytes | +----------+ ``` \ No newline at end of file From 6e8fa6bb1c84d6c26524dd7b17788d18a5112f58 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 1 Oct 2024 14:26:03 -0500 Subject: [PATCH 447/545] use correct type ids --- contracts/validator-manager/ValidatorMessages.sol | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 3f8fcd949..3c716ccdb 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -31,13 +31,13 @@ library ValidatorMessages { // Subnets send a RegisterSubnetValidator message to the P-Chain to register a validator. uint32 internal constant REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID = 1; - // Subnets can send a SetSubnetValidatorWeight message to the P-Chain to update a validator's weight. - // The P-Chain responds with a SetSubnetValidatorWeight message acknowledging the weight update. - uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID = 2; - // The P-Chain responds with a RegisterSubnetValidator message indicating whether the registration was successful // for the given validation ID. - uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 3; + uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 2; + + // Subnets can send a SetSubnetValidatorWeight message to the P-Chain to update a validator's weight. + // The P-Chain responds with a SetSubnetValidatorWeight message acknowledging the weight update. + uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID = 3; // The P-Chain responds with a SubnetValidatorWeightUpdateMessage message indicating whether the weight update was successful // for the given validation ID. @@ -45,7 +45,7 @@ library ValidatorMessages { // The Subnet will self-sign a ValidationUptimeMessage to be provided when a validator is initiating // the end of their validation period. - uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 5; + uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 0; error InvalidMessageLength(); error InvalidCodecID(); From f1a5147216e28ec78e041077e0812aeb8ae35da1 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 1 Oct 2024 14:29:14 -0500 Subject: [PATCH 448/545] code block formatting --- contracts/validator-manager/MessageSpec.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/validator-manager/MessageSpec.md b/contracts/validator-manager/MessageSpec.md index 95b051574..6fffe5821 100644 --- a/contracts/validator-manager/MessageSpec.md +++ b/contracts/validator-manager/MessageSpec.md @@ -10,6 +10,7 @@ Consumed by: Validator Manager contract Specification: +``` +--------------------+----------+----------+ | codecID : uint16 | 2 bytes | +--------------------+----------+----------+ @@ -19,6 +20,7 @@ Specification: +--------------------+----------+----------+ | 38 bytes | +----------+ +``` ### `RegisterSubnetValidatorMessage` From b412e4863b8f922702d6beaca97c7072f99019ed Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 1 Oct 2024 16:34:30 -0500 Subject: [PATCH 449/545] update to latest spec --- contracts/validator-manager/MessageSpec.md | 137 ++++--- .../validator-manager/PoSValidatorManager.sol | 6 +- .../validator-manager/ValidatorManager.sol | 30 +- .../validator-manager/ValidatorMessages.sol | 361 ++++++++++-------- .../interfaces/IValidatorManager.sol | 27 +- 5 files changed, 323 insertions(+), 238 deletions(-) diff --git a/contracts/validator-manager/MessageSpec.md b/contracts/validator-manager/MessageSpec.md index 6fffe5821..0e5de3063 100644 --- a/contracts/validator-manager/MessageSpec.md +++ b/contracts/validator-manager/MessageSpec.md @@ -2,15 +2,16 @@ ### `SubnetConversionMessage` -Description: Confirms conversion to a Permissionless Subnet on the P-Chain +- Description: Confirms conversion to a Permissionless Subnet on the P-Chain -Signed by: P-Chain +- Signed by: P-Chain -Consumed by: Validator Manager contract +- Consumed by: Validator Manager contract Specification: ``` +SubnetConversionMessage +--------------------+----------+----------+ | codecID : uint16 | 2 bytes | +--------------------+----------+----------+ @@ -22,48 +23,93 @@ Specification: +----------+ ``` +where `subnetConversionID` is defined as the `sha256` hash of the serialization of the `SubnetConversionData`, defined as follows: + +``` +ValidatorData ++--------------+----------+------------------------+ +| nodeID : []byte | 4 + len(nodeID) bytes | ++--------------+----------+------------------------+ +| blsPublicKey : [48]byte | 48 bytes | ++--------------+----------+------------------------+ +| weight : uint64 | 8 bytes | ++--------------+----------+------------------------+ + | 60 + len(nodeID) bytes | + +------------------------+ + +SubnetConversionData ++----------------+-----------------+--------------------------------------------------------+ +| codecID : uint16 | 2 bytes | ++----------------+-----------------+--------------------------------------------------------+ +| subnetID : [32]byte | 32 bytes | ++----------------+-----------------+--------------------------------------------------------+ +| managerChainID : [32]byte | 32 bytes | ++----------------+-----------------+--------------------------------------------------------+ +| managerAddress : []byte | 4 + len(managerAddress) bytes | ++----------------+-----------------+--------------------------------------------------------+ +| validators : []ValidatorData | 4 + sum(validatorLengths) bytes | ++----------------+-----------------+--------------------------------------------------------+ + | 74 + len(managerAddress) + len(validatorLengths) bytes | + +--------------------------------------------------------+ +``` + ### `RegisterSubnetValidatorMessage` -Description: Registers a Subnet Validator on the P-Chain +- Description: Registers a Subnet Validator on the P-Chain -Signed by: Subnet +- Signed by: Subnet Consumed by: P-Chain Specification: ``` -+--------------+----------+-----------+ -| codecID : uint16 | 2 bytes | -+--------------+----------+-----------+ -| typeID : uint32 | 4 bytes | -+--------------+----------+-----------+ -| subnetID : [32]byte | 32 bytes | -+--------------+----------+-----------+ -| nodeID : [32]byte | 32 bytes | -+--------------+----------+-----------+ -| weight : uint64 | 8 bytes | -+--------------+----------+-----------+ -| blsPublicKey : [48]byte | 48 bytes | -+--------------+----------+-----------+ -| expiry : uint64 | 8 bytes | -+--------------+----------+-----------+ - | 134 bytes | - +-----------+ +PChainOwner ++-----------+------------+-------------------------------+ +| threshold : uint32 | 4 bytes | ++-----------+------------+-------------------------------+ +| addresses : [][20]byte | 4 + len(addresses) * 20 bytes | ++-----------+------------+-------------------------------+ + | 8 + len(addresses) * 20 bytes | + +-------------------------------+ + +RegisterSubnetValidatorMessage ++-----------------------+-------------+--------------------------------------------------------------------+ +| codecID : uint16 | 2 bytes | ++-----------------------+-------------+--------------------------------------------------------------------+ +| typeID : uint32 | 4 bytes | ++-----------------------+-------------+-------------------------------------------------------------------+ +| subnetID : [32]byte | 32 bytes | ++-----------------------+-------------+--------------------------------------------------------------------+ +| nodeID : []byte | 4 + len(nodeID) bytes | ++-----------------------+-------------+--------------------------------------------------------------------+ +| blsPublicKey : [48]byte | 48 bytes | ++-----------------------+-------------+--------------------------------------------------------------------+ +| expiry : uint64 | 8 bytes | ++-----------------------+-------------+--------------------------------------------------------------------+ +| remainingBalanceOwner : PChainOwner | 4 + len(addresses) * 20 bytes | ++-----------------------+-------------+--------------------------------------------------------------------+ +| disableOwner : PChainOwner | 4 + len(addresses) * 20 bytes | ++-----------------------+-------------+--------------------------------------------------------------------+ +| weight : uint64 | 8 bytes | ++-----------------------+-------------+--------------------------------------------------------------------+ + | 114 + len(nodeID) + (len(addresses1) + len(addresses2)) * 20 bytes | + +--------------------------------------------------------------------+ ``` ### `SubnetValidatorRegistrationMessage` -Description: Confirms a Subnet Validator's registration validity on the P-Chain +- Description: Confirms a Subnet Validator's registration validity on the P-Chain -Signed by: P-Chain +- Signed by: P-Chain -Consumed by: Validator Manager contract +- Consumed by: Validator Manager contract Specification: ``` +SubnetValidatorRegistrationMessage +--------------+----------+----------+ | codecID : uint16 | 2 bytes | +--------------+----------+----------+ @@ -77,43 +123,27 @@ Specification: +----------+ ``` -### `SetSubnetValidatorWeightMessage` +### `SubnetValidatorWeightMessage` -Description: Used to set a Validator's stake weight on another chain +- Description: Used to set and acknowledge a Validator's stake weight on another chain -Signed by: Subnet +- To effect a weight change: -Consumed by: P-Chain + - Signed by: Subnet -Specification: - -``` -+--------------+----------+----------+ -| codecID : uint16 | 2 bytes | -+--------------+----------+----------+ -| typeID : uint32 | 4 bytes | -+--------------+----------+----------+ -| validationID : [32]byte | 32 bytes | -+--------------+----------+----------+ -| nonce : uint64 | 8 bytes | -+--------------+----------+----------+ -| weight : uint64 | 8 bytes | -+--------------+----------+----------+ - | 54 bytes | - +----------+ -``` + - Consumed by: P-Chain -### `SubnetValidatorWeightUpdateMessage` +- To acknowledge the weight change: -Description: Acknowledges a Validator weight update + - Signed by P-Chain -Signed by: P-Chain -Consumed by: Validator Manager contract + - Consumed by Subnet Specification: ``` +SubnetValidatorWeightMessage +--------------+----------+----------+ | codecID : uint16 | 2 bytes | +--------------+----------+----------+ @@ -131,15 +161,16 @@ Specification: ### `ValidationUptimeMessage` -Description: Provides a Validator's uptime for calculating staking rewards +- Description: Provides a Validator's uptime for calculating staking rewards -Signed by: Subnet +- Signed by: Subnet -Consumed by: Validator Manager contract +- Consumed by: Validator Manager contract Specification: ``` +ValidationUptimeMessage +--------------+----------+----------+ | codecID : uint16 | 2 bytes | +--------------+----------+----------+ diff --git a/contracts/validator-manager/PoSValidatorManager.sol b/contracts/validator-manager/PoSValidatorManager.sol index a078d086f..e9f598152 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -429,7 +429,7 @@ abstract contract PoSValidatorManager is // Unpack the Warp message (bytes32 messageValidationID, uint64 nonce,) = ValidatorMessages - .unpackSubnetValidatorWeightUpdateMessage(_getPChainWarpMessage(messageIndex).payload); + .unpackSubnetValidatorWeightMessage(_getPChainWarpMessage(messageIndex).payload); if (validationID != messageValidationID) { revert InvalidValidationID(delegator.validationID); @@ -589,7 +589,7 @@ abstract contract PoSValidatorManager is // Submit the message to the Warp precompile. WARP_MESSENGER.sendWarpMessage( - ValidatorMessages.packSetSubnetValidatorWeightMessage( + ValidatorMessages.packSubnetValidatorWeightMessage( delegator.validationID, validator.messageNonce, validator.weight ) ); @@ -613,7 +613,7 @@ abstract contract PoSValidatorManager is // Unpack the Warp message WarpMessage memory warpMessage = _getPChainWarpMessage(messageIndex); (bytes32 validationID, uint64 nonce,) = - ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(warpMessage.payload); + ValidatorMessages.unpackSubnetValidatorWeightMessage(warpMessage.payload); if (delegator.validationID != validationID) { revert InvalidValidationID(validationID); diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 8881d7812..5a9f8004a 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -49,7 +49,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida /// @notice Maps the validationID to the validator information. mapping(bytes32 => Validator) _validationPeriods; /// @notice Maps the nodeID to the validationID for validation periods that have not ended. - mapping(bytes32 => bytes32) _registeredValidators; + mapping(bytes => bytes32) _registeredValidators; /// @notice Boolean that indicates if the initial validator set has been set. bool _initializedValidatorSet; } @@ -73,7 +73,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida error InvalidInitializationStatus(); error InvalidMaximumChurnPercentage(uint8 maximumChurnPercentage); error InvalidBLSKeyLength(uint256 length); - error InvalidNodeID(bytes32 nodeID); + error InvalidNodeID(bytes nodeID); error InvalidSubnetConversionID( bytes32 encodedSubnetConversionID, bytes32 expectedSubnetConversionID ); @@ -81,7 +81,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida error InvalidValidatorStatus(ValidatorStatus status); error InvalidWarpMessage(); error MaxChurnRateExceeded(uint64 churnAmount); - error NodeAlreadyRegistered(bytes32 nodeID); + error NodeAlreadyRegistered(bytes nodeID); error UnexpectedRegistrationStatus(bool validRegistration); // solhint-disable ordering @@ -166,20 +166,18 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida uint256 totalWeight; for (uint32 i; i < numInitialValidators; ++i) { InitialValidator memory initialValidator = subnetConversionData.initialValidators[i]; - bytes32 nodeID = initialValidator.nodeID; - - if ($._registeredValidators[nodeID] != bytes32(0)) { - revert NodeAlreadyRegistered(nodeID); + if ($._registeredValidators[initialValidator.nodeID] != bytes32(0)) { + revert NodeAlreadyRegistered(initialValidator.nodeID); } // Validation ID of the initial validators is the sha256 hash of the // convert Subnet tx ID and the index of the initial validator. bytes32 validationID = - sha256(abi.encodePacked(subnetConversionData.convertSubnetTxID, i)); + sha256(abi.encodePacked(subnetConversionData.subnetID, i)); // Save the initial validator as an active validator. - $._registeredValidators[nodeID] = validationID; + $._registeredValidators[initialValidator.nodeID] = validationID; $._validationPeriods[validationID] = Validator({ status: ValidatorStatus.Active, nodeID: initialValidator.nodeID, @@ -236,7 +234,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida if (input.blsPublicKey.length != BLS_PUBLIC_KEY_LENGTH) { revert InvalidBLSKeyLength(input.blsPublicKey.length); } - if (input.nodeID == bytes32(0)) { + if (input.nodeID.length == 0) { revert InvalidNodeID(input.nodeID); } if ($._registeredValidators[input.nodeID] != bytes32(0)) { @@ -251,9 +249,11 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ValidatorMessages.ValidationPeriod({ subnetID: $._subnetID, nodeID: input.nodeID, - weight: weight, blsPublicKey: input.blsPublicKey, - registrationExpiry: input.registrationExpiry + remainingBalanceOwner: input.remainingBalanceOwner, + disableOwner: input.disableOwner, + registrationExpiry: input.registrationExpiry, + weight: weight }) ); $._pendingRegisterValidationMessages[validationID] = registerSubnetValidatorMessage; @@ -325,7 +325,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida ); } - function registeredValidators(bytes32 nodeID) public view returns (bytes32) { + function registeredValidators(bytes calldata nodeID) public view returns (bytes32) { ValidatorManagerStorage storage $ = _getValidatorManagerStorage(); return $._registeredValidators[nodeID]; } @@ -390,7 +390,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida } WARP_MESSENGER.sendWarpMessage( - ValidatorMessages.packSetSubnetValidatorWeightMessage( + ValidatorMessages.packSubnetValidatorWeightMessage( validationID, validator.messageNonce, 0 ) ); @@ -496,7 +496,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Submit the message to the Warp precompile. bytes32 messageID = WARP_MESSENGER.sendWarpMessage( - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, nonce, newWeight) + ValidatorMessages.packSubnetValidatorWeightMessage(validationID, nonce, newWeight) ); emit ValidatorWeightUpdate({ diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 3c716ccdb..544484bc9 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} from "./interfaces/IValidatorManager.sol"; +import {SubnetConversionData, PChainOwner} from "./interfaces/IValidatorManager.sol"; /** * @dev Packing utilities for the Warp message types used by the Validator Manager contracts, as specified in ACP-77: @@ -16,10 +16,12 @@ library ValidatorMessages { // REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID, and the concatenated ValidationPeriod fields. struct ValidationPeriod { bytes32 subnetID; - bytes32 nodeID; - uint64 weight; - uint64 registrationExpiry; + bytes nodeID; bytes blsPublicKey; + uint64 registrationExpiry; + PChainOwner remainingBalanceOwner; + PChainOwner disableOwner; + uint64 weight; } // The P-Chain uses a hardcoded codecID of 0 for all messages. @@ -35,13 +37,9 @@ library ValidatorMessages { // for the given validation ID. uint32 internal constant SUBNET_VALIDATOR_REGISTRATION_MESSAGE_TYPE_ID = 2; - // Subnets can send a SetSubnetValidatorWeight message to the P-Chain to update a validator's weight. - // The P-Chain responds with a SetSubnetValidatorWeight message acknowledging the weight update. - uint32 internal constant SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID = 3; - - // The P-Chain responds with a SubnetValidatorWeightUpdateMessage message indicating whether the weight update was successful - // for the given validation ID. - uint32 internal constant SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID = 4; + // Subnets can send a SubnetValidatorWeight message to the P-Chain to update a validator's weight. + // The P-Chain responds with another SubnetValidatorWeight message acknowledging the weight update. + uint32 internal constant SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID = 3; // The Subnet will self-sign a ValidationUptimeMessage to be provided when a validator is initiating // the end of their validation period. @@ -51,6 +49,7 @@ library ValidatorMessages { error InvalidCodecID(); error InvalidMessageType(); error InvalidSignatureLength(); + error InvalidNodeID(); /** * @notice Packs a SubnetConversionMessage message into a byte array. @@ -120,27 +119,30 @@ library ValidatorMessages { * This byte array is the SHA256 pre-image of the subnetConversionID hash * The message format specification is: * - * +-------------------+---------------+---------------------------------------------------------+ - * | convertSubnetTxID : [32]byte | 32 bytes | - * +-------------------+-----------------+-------------------------------------------------------+ - * | managerChainID : [32]byte | 32 bytes | - * +-------------------+-----------------+-------------------------------------------------------+ - * | managerAddress : []byte | 4 + len(managerAddress) bytes | - * +-------------------+-----------------+-------------------------------------------------------+ - * | validators : []ValidatorData | 4 + len(validators) * 88 bytes | - * +-------------------+-----------------+-------------------------------------------------------+ - * | 72 + len(managerAddress) + len(validators) * 88 bytes | - * +-------------------------------------------------------+ - * And ValidatorData: - * +--------------+----------+-----------+ - * | nodeID : [32]byte | 32 bytes | - * +--------------+----------+-----------+ - * | weight : uint64 | 8 bytes | - * +--------------+----------+-----------+ - * | blsPublicKey : [48]byte | 48 bytes | - * +--------------+----------+-----------+ - * | 88 bytes | - * +-----------+ + * SubnetConversionData: + * +----------------+-----------------+--------------------------------------------------------+ + * | codecID : uint16 | 2 bytes | + * +----------------+-----------------+--------------------------------------------------------+ + * | subnetID : [32]byte | 32 bytes | + * +----------------+-----------------+--------------------------------------------------------+ + * | managerChainID : [32]byte | 32 bytes | + * +----------------+-----------------+--------------------------------------------------------+ + * | managerAddress : []byte | 4 + len(managerAddress) bytes | + * +----------------+-----------------+--------------------------------------------------------+ + * | validators : []ValidatorData | 4 + sum(validatorLengths) bytes | + * +----------------+-----------------+--------------------------------------------------------+ + * | 74 + len(managerAddress) + len(validatorLengths) bytes | + * +--------------------------------------------------------+ + * ValidatorData: + * +--------------+----------+------------------------+ + * | nodeID : []byte | 4 + len(nodeID) bytes | + * +--------------+----------+------------------------+ + * | blsPublicKey : [48]byte | 48 bytes | + * +--------------+----------+------------------------+ + * | weight : uint64 | 8 bytes | + * +--------------+----------+------------------------+ + * | 60 + len(nodeID) bytes | + * +------------------------+ * * @param subnetConversionData The struct representing data to pack into the message. * @return The packed message. @@ -150,9 +152,11 @@ library ValidatorMessages { pure returns (bytes memory) { - // Hardcoded 20 is for length of the managerAddress + // Hardcoded 20 is for length of the managerAddress on EVM chains + // solhint-disable-next-line func-named-parameters bytes memory res = abi.encodePacked( - subnetConversionData.convertSubnetTxID, + CODEC_ID, + subnetConversionData.subnetID, subnetConversionData.validatorManagerBlockchainID, uint32(20), subnetConversionData.validatorManagerAddress, @@ -162,11 +166,18 @@ library ValidatorMessages { // 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++) { + if (subnetConversionData.initialValidators[i].nodeID.length != 32) { + revert InvalidNodeID(); + } + if (subnetConversionData.initialValidators[i].blsPublicKey.length != 48) { + revert InvalidSignatureLength(); + } res = abi.encodePacked( res, + subnetConversionData.initialValidators[i].nodeID.length, subnetConversionData.initialValidators[i].nodeID, - subnetConversionData.initialValidators[i].weight, - subnetConversionData.initialValidators[i].blsPublicKey + subnetConversionData.initialValidators[i].blsPublicKey, + subnetConversionData.initialValidators[i].weight ); } return res; @@ -175,23 +186,38 @@ library ValidatorMessages { /** * @notice Packs a RegisterSubnetValidatorMessage message into a byte array. * The message format specification is: - * +--------------+----------+-----------+ - * | codecID : uint16 | 2 bytes | - * +--------------+----------+-----------+ - * | typeID : uint32 | 4 bytes | - * +--------------+----------+-----------+ - * | subnetID : [32]byte | 32 bytes | - * +--------------+----------+-----------+ - * | nodeID : [32]byte | 32 bytes | - * +--------------+----------+-----------+ - * | weight : uint64 | 8 bytes | - * +--------------+----------+-----------+ - * | blsPublicKey : [48]byte | 48 bytes | - * +--------------+----------+-----------+ - * | expiry : uint64 | 8 bytes | - * +--------------+----------+-----------+ - * | 134 bytes | - * +-----------+ + * + * RegisterSubnetValidatorMessage: + * +-----------------------+-------------+--------------------------------------------------------------------+ + * | codecID : uint16 | 2 bytes | + * +-----------------------+-------------+--------------------------------------------------------------------+ + * | typeID : uint32 | 4 bytes | + * +-----------------------+-------------+-------------------------------------------------------------------+ + * | subnetID : [32]byte | 32 bytes | + * +-----------------------+-------------+--------------------------------------------------------------------+ + * | nodeID : []byte | 4 + len(nodeID) bytes | + * +-----------------------+-------------+--------------------------------------------------------------------+ + * | blsPublicKey : [48]byte | 48 bytes | + * +-----------------------+-------------+--------------------------------------------------------------------+ + * | expiry : uint64 | 8 bytes | + * +-----------------------+-------------+--------------------------------------------------------------------+ + * | remainingBalanceOwner : PChainOwner | 4 + len(addresses) * 20 bytes | + * +-----------------------+-------------+--------------------------------------------------------------------+ + * | disableOwner : PChainOwner | 4 + len(addresses) * 20 bytes | + * +-----------------------+-------------+--------------------------------------------------------------------+ + * | weight : uint64 | 8 bytes | + * +-----------------------+-------------+--------------------------------------------------------------------+ + * | 114 + len(nodeID) + (len(addresses1) + len(addresses2)) * 20 bytes | + * +--------------------------------------------------------------------+ + * + * PChainOwner: + * +-----------+------------+-------------------------------+ + * | threshold : uint32 | 4 bytes | + * +-----------+------------+-------------------------------+ + * | addresses : [][20]byte | 4 + len(addresses) * 20 bytes | + * +-----------+------------+-------------------------------+ + * | 8 + len(addresses) * 20 bytes | + * +-------------------------------+ * * @param validationPeriod The information to pack into the message. * @return The validationID and the packed message. @@ -210,11 +236,26 @@ library ValidatorMessages { CODEC_ID, REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID, validationPeriod.subnetID, + validationPeriod.nodeID.length, validationPeriod.nodeID, - validationPeriod.weight, validationPeriod.blsPublicKey, - validationPeriod.registrationExpiry + validationPeriod.registrationExpiry, + validationPeriod.remainingBalanceOwner.threshold, + uint32(validationPeriod.remainingBalanceOwner.addresses.length) ); + for (uint256 i = 0; i < validationPeriod.remainingBalanceOwner.addresses.length; i++) { + res = abi.encodePacked(res, validationPeriod.remainingBalanceOwner.addresses[i]); + } + res = abi.encodePacked( + res, + validationPeriod.disableOwner.threshold, + uint32(validationPeriod.disableOwner.addresses.length) + ); + for (uint256 i = 0; i < validationPeriod.disableOwner.addresses.length; i++) { + res = abi.encodePacked(res, validationPeriod.disableOwner.addresses[i]); + } + res = abi.encodePacked(res, validationPeriod.weight); + return (sha256(res), res); } @@ -233,61 +274,146 @@ library ValidatorMessages { if (input.length != 134) { revert InvalidMessageLength(); } + uint32 index = 0; // Unpack the codec ID uint16 codecID; for (uint256 i; i < 2; ++i) { - codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); + codecID |= uint16(uint8(input[i + index])) << uint16((8 * (1 - i))); } if (codecID != CODEC_ID) { revert InvalidCodecID(); } + index += 2; // Unpack the type ID uint32 typeID; for (uint256 i; i < 4; ++i) { - typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); + typeID |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); } if (typeID != REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID) { revert InvalidMessageType(); } + index += 4; // Unpack the subnetID bytes32 subnetID; for (uint256 i; i < 32; ++i) { - subnetID |= bytes32(uint256(uint8(input[i + 6])) << (8 * (31 - i))); + subnetID |= bytes32(uint256(uint8(input[i + index])) << (8 * (31 - i))); } + index += 32; - // Unpack the nodeID - bytes32 nodeID; - for (uint256 i; i < 32; ++i) { - nodeID |= bytes32(uint256(uint8(input[i + 38])) << (8 * (31 - i))); + // Unpack the nodeID length + uint32 nodeIDLength; + for (uint256 i; i < 4; ++i) { + nodeIDLength |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); } + index += 4; - // Unpack the weight - uint64 weight; - for (uint256 i; i < 8; ++i) { - weight |= uint64(uint8(input[i + 70])) << uint64((8 * (7 - i))); + // Unpack the nodeID + bytes memory nodeID = new bytes(nodeIDLength); + for (uint256 i; i < nodeIDLength; ++i) { + nodeID[i] = input[i + index]; } + index += nodeIDLength; // Unpack the blsPublicKey bytes memory blsPublicKey = new bytes(48); for (uint256 i; i < 48; ++i) { - blsPublicKey[i] = input[i + 78]; + blsPublicKey[i] = input[i + index]; } + index += 48; // Unpack the registration expiry uint64 expiry; for (uint256 i; i < 8; ++i) { - expiry |= uint64(uint8(input[i + 126])) << uint64((8 * (7 - i))); + expiry |= uint64(uint8(input[i + index])) << uint64((8 * (7 - i))); + } + index += 8; + + // Unpack the remainingBalanceOwner threshold + uint32 remainingBalanceOwnerThreshold; + for (uint256 i; i < 4; ++i) { + remainingBalanceOwnerThreshold |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); + } + index += 4; + + // Unpack the remainingBalanceOwner addresses length + uint32 remainingBalanceOwnerAddressesLength; + for (uint256 i; i < 4; ++i) { + remainingBalanceOwnerAddressesLength |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); + } + index += 4; + + // Unpack the remainingBalanceOwner addresses + address[] memory remainingBalanceOwnerAddresses = new address[](remainingBalanceOwnerAddressesLength); + for (uint256 i; i < remainingBalanceOwnerAddressesLength; ++i) { + bytes memory addrBytes = new bytes(20); + for (uint256 j; j < 20; ++j) { + addrBytes[j] = input[j + index]; + } + address addr; + assembly { + addr := mload(add(addrBytes, 20)) + } + remainingBalanceOwnerAddresses[i] = addr; + index += 20; + } + + // Unpack the disableOwner threshold + uint32 disableOwnerThreshold; + for (uint256 i; i < 4; ++i) { + disableOwnerThreshold |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); + } + index += 4; + + // Unpack the disableOwner addresses length + uint32 disableOwnerAddressesLength; + for (uint256 i; i < 4; ++i) { + disableOwnerAddressesLength |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); + } + index += 4; + + // Now that we have all the lengths, validate the input length + if (input.length != 114 + nodeIDLength + (remainingBalanceOwnerAddressesLength + disableOwnerAddressesLength) * 20) { + revert InvalidMessageLength(); + } + + // Unpack the disableOwner addresses + address[] memory disableOwnerAddresses = new address[](disableOwnerAddressesLength); + for (uint256 i; i < disableOwnerAddressesLength; ++i) { + bytes memory addrBytes = new bytes(20); + for (uint256 j; j < 20; ++j) { + addrBytes[j] = input[j + index]; + } + address addr; + assembly { + addr := mload(add(addrBytes, 20)) + } + remainingBalanceOwnerAddresses[i] = addr; + index += 20; + } + + // Unpack the weight + uint64 weight; + for (uint256 i; i < 8; ++i) { + weight |= uint64(uint8(input[i + index])) << uint64((8 * (7 - i))); } return ValidationPeriod({ subnetID: subnetID, nodeID: nodeID, - weight: weight, registrationExpiry: expiry, - blsPublicKey: blsPublicKey + blsPublicKey: blsPublicKey, + remainingBalanceOwner: PChainOwner({ + threshold: remainingBalanceOwnerThreshold, + addresses: remainingBalanceOwnerAddresses + }), + disableOwner: PChainOwner({ + threshold: disableOwnerThreshold, + addresses: disableOwnerAddresses + }), + weight: weight }); } @@ -367,7 +493,7 @@ library ValidatorMessages { } /** - * @notice Packs a SetSubnetValidatorWeightMessage message into a byte array. + * @notice Packs a SubnetValidatorWeightMessage message into a byte array. * The message format specification is: * +--------------+----------+----------+ * | codecID : uint16 | 2 bytes | @@ -388,24 +514,24 @@ library ValidatorMessages { * @param weight The new weight of the validator. * @return The packed message. */ - function packSetSubnetValidatorWeightMessage( + function packSubnetValidatorWeightMessage( bytes32 validationID, uint64 nonce, uint64 weight ) internal pure returns (bytes memory) { return abi.encodePacked( - CODEC_ID, SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID, validationID, nonce, weight + CODEC_ID, SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID, validationID, nonce, weight ); } /** - * @notice Unpacks a byte array as a SetSubnetValidatorWeight message. + * @notice Unpacks a byte array as a SubnetValidatorWeight message. * 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, nonce, and weight. */ - function unpackSetSubnetValidatorWeightMessage(bytes memory input) + function unpackSubnetValidatorWeightMessage(bytes memory input) internal pure returns (bytes32, uint64, uint64) @@ -428,90 +554,7 @@ library ValidatorMessages { for (uint256 i; i < 4; ++i) { typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); } - if (typeID != SET_SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID) { - revert InvalidMessageType(); - } - - // Unpack the validation ID. - bytes32 validationID; - for (uint256 i; i < 32; ++i) { - validationID |= bytes32(uint256(uint8(input[i + 6])) << (8 * (31 - i))); - } - - // Unpack the nonce. - uint64 nonce; - for (uint256 i; i < 8; ++i) { - nonce |= uint64(uint8(input[i + 38])) << uint64((8 * (7 - i))); - } - - // Unpack the weight. - uint64 weight; - for (uint256 i; i < 8; ++i) { - weight |= uint64(uint8(input[i + 46])) << uint64((8 * (7 - i))); - } - - return (validationID, nonce, weight); - } - - /** - * @notice Packs a SubnetValidatorWeightUpdateMessage into a byte array. - * The message format specification is: - * +--------------+----------+----------+ - * | codecID : uint16 | 2 bytes | - * +--------------+----------+----------+ - * | typeID : uint32 | 4 bytes | - * +--------------+----------+----------+ - * | validationID : [32]byte | 32 bytes | - * +--------------+----------+----------+ - * | nonce : uint64 | 8 bytes | - * +--------------+----------+----------+ - * | weight : uint64 | 8 bytes | - * +--------------+----------+----------+ - * | 54 bytes | - * +----------+ - */ - function packSubnetValidatorWeightUpdateMessage( - bytes32 validationID, - uint64 nonce, - uint64 weight - ) internal pure returns (bytes memory) { - return abi.encodePacked( - CODEC_ID, SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID, validationID, nonce, weight - ); - } - - /** - * @notice Unpacks a byte array as a SubnetValidatorWeightUpdateMessag. - * 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, weight, and nonce. - */ - function unpackSubnetValidatorWeightUpdateMessage(bytes memory input) - internal - pure - returns (bytes32, uint64, uint64) - { - if (input.length != 54) { - revert InvalidMessageLength(); - } - - // Unpack the codec ID. - uint16 codecID; - for (uint256 i; i < 2; ++i) { - codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); - } - if (codecID != CODEC_ID) { - revert InvalidCodecID(); - } - - // Unpack the type ID. - uint32 typeID; - for (uint256 i; i < 4; ++i) { - typeID |= uint32(uint8(input[i + 2])) << uint32((8 * (3 - i))); - } - - if (typeID != SUBNET_VALIDATOR_WEIGHT_UPDATE_MESSAGE_TYPE_ID) { + if (typeID != SUBNET_VALIDATOR_WEIGHT_MESSAGE_TYPE_ID) { revert InvalidMessageType(); } diff --git a/contracts/validator-manager/interfaces/IValidatorManager.sol b/contracts/validator-manager/interfaces/IValidatorManager.sol index 33b5810a0..a2cb5cbd5 100644 --- a/contracts/validator-manager/interfaces/IValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IValidatorManager.sol @@ -17,12 +17,21 @@ enum ValidatorStatus { Invalidated } + /** + * @dev Specifies the owner of a validator's remaining balance or disable owner on the P-Chain. + * P-Chain addresses are also 20-bytes, so we use the address type to represent them. + */ +struct PChainOwner { + uint32 threshold; + address[] addresses; +} + /** * @dev Contains the active state of a Validator */ struct Validator { ValidatorStatus status; - bytes32 nodeID; + bytes nodeID; uint64 startingWeight; uint64 messageNonce; uint64 weight; @@ -56,7 +65,7 @@ struct ValidatorManagerSettings { * and verified by the Validator Manager. */ struct SubnetConversionData { - bytes32 convertSubnetTxID; + bytes32 subnetID; bytes32 validatorManagerBlockchainID; address validatorManagerAddress; InitialValidator[] initialValidators; @@ -66,18 +75,20 @@ struct SubnetConversionData { * @dev Specifies an initial validator, used in the subnet conversion data. */ struct InitialValidator { - bytes32 nodeID; - uint64 weight; + bytes nodeID; bytes blsPublicKey; + uint64 weight; } /** * @dev Specifies a validator to register. */ struct ValidatorRegistrationInput { - bytes32 nodeID; - uint64 registrationExpiry; + bytes nodeID; bytes blsPublicKey; + PChainOwner remainingBalanceOwner; + PChainOwner disableOwner; + uint64 registrationExpiry; } /** @@ -98,14 +109,14 @@ interface IValidatorManager { */ event ValidationPeriodCreated( bytes32 indexed validationID, - bytes32 indexed nodeID, + bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry ); event InitialValidatorCreated( - bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight + bytes32 indexed validationID, bytes indexed nodeID, uint256 weight ); /** From 951584174006a40734560d2834ea9b5d04d2aef6 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 2 Oct 2024 11:01:55 -0500 Subject: [PATCH 450/545] pack lengths as uint32 --- contracts/validator-manager/ValidatorMessages.sol | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 544484bc9..c0b1915ae 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -49,7 +49,6 @@ library ValidatorMessages { error InvalidCodecID(); error InvalidMessageType(); error InvalidSignatureLength(); - error InvalidNodeID(); /** * @notice Packs a SubnetConversionMessage message into a byte array. @@ -166,15 +165,12 @@ library ValidatorMessages { // 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++) { - if (subnetConversionData.initialValidators[i].nodeID.length != 32) { - revert InvalidNodeID(); - } if (subnetConversionData.initialValidators[i].blsPublicKey.length != 48) { revert InvalidSignatureLength(); } res = abi.encodePacked( res, - subnetConversionData.initialValidators[i].nodeID.length, + uint32(subnetConversionData.initialValidators[i].nodeID.length), subnetConversionData.initialValidators[i].nodeID, subnetConversionData.initialValidators[i].blsPublicKey, subnetConversionData.initialValidators[i].weight @@ -236,7 +232,7 @@ library ValidatorMessages { CODEC_ID, REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID, validationPeriod.subnetID, - validationPeriod.nodeID.length, + uint32(validationPeriod.nodeID.length), validationPeriod.nodeID, validationPeriod.blsPublicKey, validationPeriod.registrationExpiry, From 3b06b234ef94d33d01d63560d94fa504ce771cd5 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 2 Oct 2024 11:49:57 -0500 Subject: [PATCH 451/545] scope local vars to bypass stack limit --- .../validator-manager/ValidatorMessages.sol | 267 ++++++++++-------- 1 file changed, 143 insertions(+), 124 deletions(-) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index c0b1915ae..b87678be2 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -45,10 +45,10 @@ library ValidatorMessages { // the end of their validation period. uint32 internal constant VALIDATION_UPTIME_MESSAGE_TYPE_ID = 0; - error InvalidMessageLength(); - error InvalidCodecID(); + error InvalidMessageLength(uint32 actual, uint32 expected); + error InvalidCodecID(uint32 id); error InvalidMessageType(); - error InvalidSignatureLength(); + error InvalidBLSPublicKey(); /** * @notice Packs a SubnetConversionMessage message into a byte array. @@ -83,7 +83,7 @@ library ValidatorMessages { */ function unpackSubnetConversionMessage(bytes memory input) internal pure returns (bytes32) { if (input.length != 38) { - revert InvalidMessageLength(); + revert InvalidMessageLength(uint32(input.length), 38); } // Unpack the codec ID @@ -92,7 +92,7 @@ library ValidatorMessages { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } if (codecID != CODEC_ID) { - revert InvalidCodecID(); + revert InvalidCodecID(codecID); } // Unpack the type ID @@ -131,7 +131,7 @@ library ValidatorMessages { * | validators : []ValidatorData | 4 + sum(validatorLengths) bytes | * +----------------+-----------------+--------------------------------------------------------+ * | 74 + len(managerAddress) + len(validatorLengths) bytes | - * +--------------------------------------------------------+ + * +--------------------------------------------------------+ * ValidatorData: * +--------------+----------+------------------------+ * | nodeID : []byte | 4 + len(nodeID) bytes | @@ -166,7 +166,7 @@ library ValidatorMessages { // it was found to be more gas efficient. for (uint256 i = 0; i < subnetConversionData.initialValidators.length; i++) { if (subnetConversionData.initialValidators[i].blsPublicKey.length != 48) { - revert InvalidSignatureLength(); + revert InvalidBLSPublicKey(); } res = abi.encodePacked( res, @@ -182,7 +182,7 @@ library ValidatorMessages { /** * @notice Packs a RegisterSubnetValidatorMessage message into a byte array. * The message format specification is: - * + * * RegisterSubnetValidatorMessage: * +-----------------------+-------------+--------------------------------------------------------------------+ * | codecID : uint16 | 2 bytes | @@ -203,9 +203,9 @@ library ValidatorMessages { * +-----------------------+-------------+--------------------------------------------------------------------+ * | weight : uint64 | 8 bytes | * +-----------------------+-------------+--------------------------------------------------------------------+ - * | 114 + len(nodeID) + (len(addresses1) + len(addresses2)) * 20 bytes | + * | 122 + len(nodeID) + (len(addresses1) + len(addresses2)) * 20 bytes | * +--------------------------------------------------------------------+ - * + * * PChainOwner: * +-----------+------------+-------------------------------+ * | threshold : uint32 | 4 bytes | @@ -213,7 +213,7 @@ library ValidatorMessages { * | addresses : [][20]byte | 4 + len(addresses) * 20 bytes | * +-----------+------------+-------------------------------+ * | 8 + len(addresses) * 20 bytes | - * +-------------------------------+ + * +-------------------------------+ * * @param validationPeriod The information to pack into the message. * @return The validationID and the packed message. @@ -224,7 +224,7 @@ library ValidatorMessages { returns (bytes32, bytes memory) { if (validationPeriod.blsPublicKey.length != 48) { - revert InvalidMessageLength(); + revert InvalidBLSPublicKey(); } // solhint-disable-next-line func-named-parameters @@ -267,150 +267,169 @@ library ValidatorMessages { pure returns (ValidationPeriod memory) { - if (input.length != 134) { - revert InvalidMessageLength(); - } uint32 index = 0; + ValidationPeriod memory validation; // Unpack the codec ID - uint16 codecID; - for (uint256 i; i < 2; ++i) { - codecID |= uint16(uint8(input[i + index])) << uint16((8 * (1 - i))); - } - if (codecID != CODEC_ID) { - revert InvalidCodecID(); + { + uint16 codecID; + for (uint256 i; i < 2; ++i) { + codecID |= uint16(uint8(input[i + index])) << uint16((8 * (1 - i))); + } + if (codecID != CODEC_ID) { + revert InvalidCodecID(codecID); + } + index += 2; } - index += 2; // Unpack the type ID - uint32 typeID; - for (uint256 i; i < 4; ++i) { - typeID |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); - } - if (typeID != REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID) { - revert InvalidMessageType(); + { + uint32 typeID; + for (uint256 i; i < 4; ++i) { + typeID |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); + } + if (typeID != REGISTER_SUBNET_VALIDATOR_MESSAGE_TYPE_ID) { + revert InvalidMessageType(); + } + index += 4; } - index += 4; // Unpack the subnetID - bytes32 subnetID; - for (uint256 i; i < 32; ++i) { - subnetID |= bytes32(uint256(uint8(input[i + index])) << (8 * (31 - i))); + { + bytes32 subnetID; + for (uint256 i; i < 32; ++i) { + subnetID |= bytes32(uint256(uint8(input[i + index])) << (8 * (31 - i))); + } + validation.subnetID = subnetID; + index += 32; } - index += 32; // Unpack the nodeID length uint32 nodeIDLength; - for (uint256 i; i < 4; ++i) { - nodeIDLength |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); - } - index += 4; + { + for (uint256 i; i < 4; ++i) { + nodeIDLength |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); + } + index += 4; - // Unpack the nodeID - bytes memory nodeID = new bytes(nodeIDLength); - for (uint256 i; i < nodeIDLength; ++i) { - nodeID[i] = input[i + index]; + // Unpack the nodeID + bytes memory nodeID = new bytes(nodeIDLength); + for (uint256 i; i < nodeIDLength; ++i) { + nodeID[i] = input[i + index]; + } + validation.nodeID = nodeID; + index += nodeIDLength; } - index += nodeIDLength; // Unpack the blsPublicKey - bytes memory blsPublicKey = new bytes(48); - for (uint256 i; i < 48; ++i) { - blsPublicKey[i] = input[i + index]; + { + bytes memory blsPublicKey = new bytes(48); + for (uint256 i; i < 48; ++i) { + blsPublicKey[i] = input[i + index]; + } + validation.blsPublicKey = blsPublicKey; + index += 48; } - index += 48; // Unpack the registration expiry - uint64 expiry; - for (uint256 i; i < 8; ++i) { - expiry |= uint64(uint8(input[i + index])) << uint64((8 * (7 - i))); + { + uint64 expiry; + for (uint256 i; i < 8; ++i) { + expiry |= uint64(uint8(input[i + index])) << uint64((8 * (7 - i))); + } + validation.registrationExpiry = expiry; + index += 8; } - index += 8; // Unpack the remainingBalanceOwner threshold - uint32 remainingBalanceOwnerThreshold; - for (uint256 i; i < 4; ++i) { - remainingBalanceOwnerThreshold |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); - } - index += 4; - - // Unpack the remainingBalanceOwner addresses length uint32 remainingBalanceOwnerAddressesLength; - for (uint256 i; i < 4; ++i) { - remainingBalanceOwnerAddressesLength |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); - } - index += 4; + { + uint32 remainingBalanceOwnerThreshold; + for (uint256 i; i < 4; ++i) { + remainingBalanceOwnerThreshold |= + uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); + } + index += 4; - // Unpack the remainingBalanceOwner addresses - address[] memory remainingBalanceOwnerAddresses = new address[](remainingBalanceOwnerAddressesLength); - for (uint256 i; i < remainingBalanceOwnerAddressesLength; ++i) { - bytes memory addrBytes = new bytes(20); - for (uint256 j; j < 20; ++j) { - addrBytes[j] = input[j + index]; + // Unpack the remainingBalanceOwner addresses length + for (uint256 i; i < 4; ++i) { + remainingBalanceOwnerAddressesLength |= + uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); } - address addr; - assembly { - addr := mload(add(addrBytes, 20)) + index += 4; + + // Unpack the remainingBalanceOwner addresses + address[] memory remainingBalanceOwnerAddresses = + new address[](remainingBalanceOwnerAddressesLength); + for (uint256 i; i < remainingBalanceOwnerAddressesLength; ++i) { + bytes memory addrBytes = new bytes(20); + for (uint256 j; j < 20; ++j) { + addrBytes[j] = input[j + index]; + } + address addr; + // solhint-disable-next-line no-inline-assembly + assembly { + addr := mload(add(addrBytes, 20)) + } + remainingBalanceOwnerAddresses[i] = addr; + index += 20; } - remainingBalanceOwnerAddresses[i] = addr; - index += 20; + validation.remainingBalanceOwner = PChainOwner({ + threshold: remainingBalanceOwnerThreshold, + addresses: remainingBalanceOwnerAddresses + }); } // Unpack the disableOwner threshold - uint32 disableOwnerThreshold; - for (uint256 i; i < 4; ++i) { - disableOwnerThreshold |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); - } - index += 4; - - // Unpack the disableOwner addresses length uint32 disableOwnerAddressesLength; - for (uint256 i; i < 4; ++i) { - disableOwnerAddressesLength |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); - } - index += 4; - - // Now that we have all the lengths, validate the input length - if (input.length != 114 + nodeIDLength + (remainingBalanceOwnerAddressesLength + disableOwnerAddressesLength) * 20) { - revert InvalidMessageLength(); - } + { + uint32 disableOwnerThreshold; + for (uint256 i; i < 4; ++i) { + disableOwnerThreshold |= uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); + } + index += 4; - // Unpack the disableOwner addresses - address[] memory disableOwnerAddresses = new address[](disableOwnerAddressesLength); - for (uint256 i; i < disableOwnerAddressesLength; ++i) { - bytes memory addrBytes = new bytes(20); - for (uint256 j; j < 20; ++j) { - addrBytes[j] = input[j + index]; + // Unpack the disableOwner addresses length + for (uint256 i; i < 4; ++i) { + disableOwnerAddressesLength |= + uint32(uint8(input[i + index])) << uint32((8 * (3 - i))); } - address addr; - assembly { - addr := mload(add(addrBytes, 20)) + index += 4; + + // Unpack the disableOwner addresses + address[] memory disableOwnerAddresses = new address[](disableOwnerAddressesLength); + for (uint256 i; i < disableOwnerAddressesLength; ++i) { + bytes memory addrBytes = new bytes(20); + for (uint256 j; j < 20; ++j) { + addrBytes[j] = input[j + index]; + } + address addr; + // solhint-disable-next-line no-inline-assembly + assembly { + addr := mload(add(addrBytes, 20)) + } + disableOwnerAddresses[i] = addr; + index += 20; } - remainingBalanceOwnerAddresses[i] = addr; - index += 20; + validation.disableOwner = + PChainOwner({threshold: disableOwnerThreshold, addresses: disableOwnerAddresses}); + } + // Now that we have all the variable lengths, validate the input length + uint32 expectedLength = 122 + nodeIDLength + + (remainingBalanceOwnerAddressesLength + disableOwnerAddressesLength) * 20; + if (input.length != expectedLength) { + revert InvalidMessageLength(uint32(input.length), expectedLength); } - // Unpack the weight - uint64 weight; - for (uint256 i; i < 8; ++i) { - weight |= uint64(uint8(input[i + index])) << uint64((8 * (7 - i))); + { + uint64 weight; + for (uint256 i; i < 8; ++i) { + weight |= uint64(uint8(input[i + index])) << uint64((8 * (7 - i))); + } + validation.weight = weight; } - return ValidationPeriod({ - subnetID: subnetID, - nodeID: nodeID, - registrationExpiry: expiry, - blsPublicKey: blsPublicKey, - remainingBalanceOwner: PChainOwner({ - threshold: remainingBalanceOwnerThreshold, - addresses: remainingBalanceOwnerAddresses - }), - disableOwner: PChainOwner({ - threshold: disableOwnerThreshold, - addresses: disableOwnerAddresses - }), - weight: weight - }); + return validation; } /** @@ -456,7 +475,7 @@ library ValidatorMessages { returns (bytes32, bool) { if (input.length != 39) { - revert InvalidMessageLength(); + revert InvalidMessageLength(uint32(input.length), 39); } // Unpack the codec ID uint16 codecID; @@ -464,7 +483,7 @@ library ValidatorMessages { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } if (codecID != CODEC_ID) { - revert InvalidCodecID(); + revert InvalidCodecID(codecID); } // Unpack the type ID @@ -533,7 +552,7 @@ library ValidatorMessages { returns (bytes32, uint64, uint64) { if (input.length != 54) { - revert InvalidMessageLength(); + revert InvalidMessageLength(uint32(input.length), 54); } // Unpack the codec ID. @@ -542,7 +561,7 @@ library ValidatorMessages { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } if (codecID != CODEC_ID) { - revert InvalidCodecID(); + revert InvalidCodecID(codecID); } // Unpack the type ID. @@ -614,7 +633,7 @@ library ValidatorMessages { returns (bytes32, uint64) { if (input.length != 46) { - revert InvalidMessageLength(); + revert InvalidMessageLength(uint32(input.length), 46); } // Unpack the codec ID. @@ -623,7 +642,7 @@ library ValidatorMessages { codecID |= uint16(uint8(input[i])) << uint16((8 * (1 - i))); } if (codecID != CODEC_ID) { - revert InvalidCodecID(); + revert InvalidCodecID(codecID); } // Unpack the type ID. From 80902f0064832901c525d411f31534a95aca75f1 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 2 Oct 2024 11:50:27 -0500 Subject: [PATCH 452/545] fix init vdr validationID --- contracts/validator-manager/ValidatorManager.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/validator-manager/ValidatorManager.sol b/contracts/validator-manager/ValidatorManager.sol index 5a9f8004a..ac653e1f4 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -172,8 +172,7 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida // Validation ID of the initial validators is the sha256 hash of the // convert Subnet tx ID and the index of the initial validator. - bytes32 validationID = - sha256(abi.encodePacked(subnetConversionData.subnetID, i)); + bytes32 validationID = sha256(abi.encodePacked(subnetConversionData.subnetID, i)); // Save the initial validator as an active validator. From b0158563a2ce2fdb57334a38c48bbbd8dab5456d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 2 Oct 2024 11:50:59 -0500 Subject: [PATCH 453/545] reorder fields --- .../validator-manager/interfaces/IValidatorManager.sol | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/contracts/validator-manager/interfaces/IValidatorManager.sol b/contracts/validator-manager/interfaces/IValidatorManager.sol index a2cb5cbd5..6d1b25c1f 100644 --- a/contracts/validator-manager/interfaces/IValidatorManager.sol +++ b/contracts/validator-manager/interfaces/IValidatorManager.sol @@ -17,10 +17,10 @@ enum ValidatorStatus { Invalidated } - /** - * @dev Specifies the owner of a validator's remaining balance or disable owner on the P-Chain. - * P-Chain addresses are also 20-bytes, so we use the address type to represent them. - */ +/** + * @dev Specifies the owner of a validator's remaining balance or disable owner on the P-Chain. + * P-Chain addresses are also 20-bytes, so we use the address type to represent them. + */ struct PChainOwner { uint32 threshold; address[] addresses; @@ -86,9 +86,9 @@ struct InitialValidator { struct ValidatorRegistrationInput { bytes nodeID; bytes blsPublicKey; + uint64 registrationExpiry; PChainOwner remainingBalanceOwner; PChainOwner disableOwner; - uint64 registrationExpiry; } /** From 54e0c7665f0f91949b4c847094341ef4beeb8643 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 2 Oct 2024 11:51:15 -0500 Subject: [PATCH 454/545] unit tests working --- contracts/validator-manager/README_OLD.md | 51 ++++++++++++ .../tests/ERC20TokenStakingManagerTests.t.sol | 14 +++- .../NativeTokenStakingManagerTests.t.sol | 5 +- .../tests/PoAValidatorManagerTests.t.sol | 13 +++- .../tests/PoSValidatorManagerTests.t.sol | 58 ++++++++------ .../tests/ValidatorManagerTests.t.sol | 78 ++++++++++++------- .../tests/ValidatorMessagesTests.t.sol | 29 ++++--- 7 files changed, 180 insertions(+), 68 deletions(-) create mode 100644 contracts/validator-manager/README_OLD.md diff --git a/contracts/validator-manager/README_OLD.md b/contracts/validator-manager/README_OLD.md new file mode 100644 index 000000000..4c6b7f921 --- /dev/null +++ b/contracts/validator-manager/README_OLD.md @@ -0,0 +1,51 @@ +# Validator Manager Contract + +`ValidatorManager.sol` defines the abstract staking contract used to manage subnet-only validators, as defined in [ACP-77](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets). + +_Disclaimer:_ The contracts in this directory are still under active development, are unaudited, and should not be used in production. + +## Usage + +The common case for adding or removing a validator from a Subnet's validator set follows these general steps: + +1. Initiate the change through the Validator Manager contract. The Validator Manager contract will construct a Warp message attesting to the change in the validator set. +2. Deliver the Warp message containing the validator set change to the P-Chain. The P-Chain will construct a Warp message acknowledging the change to the validator set. +3. Deliver the Warp message containing the P-Chain acknowledgement back to the Validator Manager contract on the Subnet. The Validator Manager contract finalizes the validator set change. + +### Initializing a Validator Set + +If the Subnet has no validators registered on the P-Chain, then it will not be able to sign a Warp message to add a validator (step 1 above). In this case, Subnet recovery must be performed on the P-Chain, which allows an initial validator set to be specified, along with each validator's expiry. These validators are *not* registered with the Subnet's Validator Manager, and are only used to bootstrap subnet consensus and Warp message signing. The following steps describe how to register validators with the Subnet's Validator Manager, after which the initial validator set specified during Subnet recovery may safely exit the validator set or expire. + +### Registering a Validator + +Validator registration is initiated with a call to `initializeValidatorRegistration` on the concrete Validator Manager contract. The Validator Manager contract constructs a [`RegisterSubnetValidatorMessage`](#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each validator registration request includes all of the information needed to identify the validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. + +The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a [`RegisterSubnetValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#registersubnetvalidatortx). Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a [`SubnetValidatorRegistrationMessage`](#subnetvalidatorregistrationmessage) Warp message indicating that the specified validator was successfully registered on the P-Chain. + +The `SubnetValidatorRegistrationMessage` is delivered to the Validator Manager contract via a call to `completeValidatorRegistration`. For PoS Validator Managers, staking rewards begin accruing at this time. + +#### Handling a Missed Expiry + +In the case of a missed expiry, the `RegisterSubnetValidatorTx` will result in a `SubnetValidatorRegistrationMessage` Warp message with `valid=0`. This serves as proof that the corresponding validation has not started and may never start. The `SubnetValidatorRegistrationMessage` can be provided to the Validator Manager contract by calling `completeEndValidation` with `setWeightMessageType=false`. + +### Exiting the Validator Set + +Validator exit is initiated with a call to `initializeEndValidation` on the Validator Manager contract. For PoS Validator Managers, a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message may optionally be provided in order to calculate the staking rewards; otherwise the validator's uptime will be set to `0`. This proof may be requested directly from the Subnet validators, which will provide it in a `ValidationUptimeMessage` Warp message. Once `initializeEndValidation` is called, staking rewards cease accruing for PoS Validator Managers: the Validator Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. + +The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The P-Chain acknowledges validator exit by signing a `SubnetValidatorRegistrationMessage` with `valid=0`, which is delivered to the Validator Manager by calling `completeEndValidation`. The validation is removed from the contract's state, and for PoS Validator Managers, staking rewards are disbursed and stake is returned. + +#### Disable a Validator Directly on the P-Chain + +ACP-77 also provides a method to disable a validator without interacting with the Subnet directly. The P-Chain transaction [`DisableValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#disablevalidatortx) disables the validator on the P-Chain. The disabled validator's weight will still count towards the Subnet's total weight. + +Disabled Subnet validators can re-activate at any time by increasing their balance with an `IncreaseBalanceTx`. Anyone can call `IncreaseBalanceTx` for any validator on the P-Chain. A disabled validator can only be totally removed from the validator set by a call to `initializeEndValidation`. + +## Types of Validator Managers + +### Proof of Authority + +The Proof of Authority (PoA) validator manager is ownable, and only allows the owner to modify changes to the validator set of the Subnet. Validators are given a weight by the owner, but do not accrue staking rewards. + +### Proof of Stake + +The Proof of Stake (PoS) validator manager allows any validator to register and exit the Subnet validator set. Validators are given a weight based on the amount of stake they provide, and accrue staking rewards based on their uptime. The staking rewards can be either native or erc20 tokens. diff --git a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol index c2927d876..c85356bc9 100644 --- a/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/ERC20TokenStakingManagerTests.t.sol @@ -20,6 +20,7 @@ import {ExampleERC20} from "@mocks/ExampleERC20.sol"; import {IERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/IERC20.sol"; import {IERC20Mintable} from "../interfaces/IERC20Mintable.sol"; import {SafeERC20} from "@openzeppelin/contracts@5.0.2/token/ERC20/utils/SafeERC20.sol"; +import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { using SafeERC20 for IERC20Mintable; @@ -27,7 +28,9 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { ERC20TokenStakingManager public app; IERC20Mintable public token; - function setUp() public virtual { + function setUp() public override { + ValidatorManagerTest.setUp(); + // Construct the object under test app = new ERC20TokenStakingManager(ICMInitializable.Allowed); token = new ExampleERC20(); @@ -179,8 +182,13 @@ contract ERC20TokenStakingManagerTest is PoSValidatorManagerTest { } function testInvalidValidatorMinStakeDuration() public { - ValidatorRegistrationInput memory input = - ValidatorRegistrationInput(DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY); + ValidatorRegistrationInput memory input = ValidatorRegistrationInput({ + nodeID: DEFAULT_NODE_ID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationExpiry: DEFAULT_EXPIRY, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER + }); uint256 stakeAmount = _weightToValue(DEFAULT_WEIGHT); vm.expectRevert( abi.encodeWithSelector( diff --git a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol index 7a56521fe..fd748830e 100644 --- a/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol +++ b/contracts/validator-manager/tests/NativeTokenStakingManagerTests.t.sol @@ -18,11 +18,14 @@ import {ExampleRewardCalculator} from "../ExampleRewardCalculator.sol"; import {ICMInitializable} from "../../utilities/ICMInitializable.sol"; import {INativeMinter} from "@avalabs/subnet-evm-contracts@1.2.0/contracts/interfaces/INativeMinter.sol"; +import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; contract NativeTokenStakingManagerTest is PoSValidatorManagerTest { NativeTokenStakingManager public app; - function setUp() public virtual { + function setUp() public override { + ValidatorManagerTest.setUp(); + // Construct the object under test app = new NativeTokenStakingManager(ICMInitializable.Allowed); rewardCalculator = new ExampleRewardCalculator(DEFAULT_REWARD_RATE); diff --git a/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol index a6360df10..6de971209 100644 --- a/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoAValidatorManagerTests.t.sol @@ -14,13 +14,16 @@ import { } from "../interfaces/IValidatorManager.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable@5.0.2/access/OwnableUpgradeable.sol"; +import {ValidatorManagerTest} from "./ValidatorManagerTests.t.sol"; contract PoAValidatorManagerTest is ValidatorManagerTest { PoAValidatorManager public app; address public constant DEFAULT_OWNER = address(0x1); - function setUp() public { + function setUp() public override { + ValidatorManagerTest.setUp(); + app = new PoAValidatorManager(ICMInitializable.Allowed); app.initialize( ValidatorManagerSettings({ @@ -44,7 +47,13 @@ contract PoAValidatorManagerTest is ValidatorManagerTest { ) ); _initializeValidatorRegistration( - ValidatorRegistrationInput(DEFAULT_NODE_ID, DEFAULT_EXPIRY, DEFAULT_BLS_PUBLIC_KEY), + ValidatorRegistrationInput({ + nodeID: DEFAULT_NODE_ID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + registrationExpiry: DEFAULT_EXPIRY, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER + }), DEFAULT_WEIGHT ); } diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index 2a2b3a11d..dc083471e 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -73,8 +73,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testDelegationFeeBipsTooLow() public { ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER }); vm.expectRevert( abi.encodeWithSelector( @@ -93,8 +95,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testDelegationFeeBipsTooHigh() public { ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER }); uint16 delegationFeeBips = posValidatorManager.MAXIMUM_DELEGATION_FEE_BIPS() + 1; vm.expectRevert( @@ -114,8 +118,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testInvalidMinStakeDuration() public { ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER }); vm.expectRevert( abi.encodeWithSelector( @@ -134,8 +140,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testStakeAmountTooLow() public { ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER }); vm.expectRevert( abi.encodeWithSelector( @@ -153,8 +161,10 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function testStakeAmountTooHigh() public { ValidatorRegistrationInput memory registrationInput = ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER }); vm.expectRevert( abi.encodeWithSelector( @@ -283,8 +293,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { expectedValidatorWeight: DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT, expectedNonce: 1 }); - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage( + bytes memory setValidatorWeightPayload = ValidatorMessages.packSubnetValidatorWeightMessage( validationID, 1, DEFAULT_WEIGHT + DEFAULT_DELEGATOR_WEIGHT ); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); @@ -324,8 +333,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Complete registration of delegator2 with delegator1's nonce // Note that registering delegator1 with delegator2's nonce is valid uint64 nonce = 1; - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSubnetValidatorWeightUpdateMessage( + bytes memory setValidatorWeightPayload = ValidatorMessages.packSubnetValidatorWeightMessage( validationID, nonce, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT ); _mockGetPChainWarpMessage(setValidatorWeightPayload, true); @@ -459,7 +467,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { force: false }); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); + ValidatorMessages.packSubnetValidatorWeightMessage(validationID, 2, DEFAULT_WEIGHT); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); posValidatorManager.resendUpdateDelegation(delegationID); } @@ -476,7 +484,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + ValidatorMessages.packSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); validatorManager.resendEndValidatorMessage(validationID); } @@ -836,8 +844,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Complete ending delegator2 with delegator1's nonce // Note that ending delegator1 with delegator2's nonce is valid uint64 nonce = 3; - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSubnetValidatorWeightUpdateMessage( + bytes memory setValidatorWeightPayload = ValidatorMessages.packSubnetValidatorWeightMessage( validationID, nonce, DEFAULT_DELEGATOR_WEIGHT + DEFAULT_WEIGHT ); _mockGetPChainWarpMessage(setValidatorWeightPayload, true); @@ -966,7 +973,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_COMPLETION_TIMESTAMP); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + ValidatorMessages.packSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); // Submit an uptime proof via submitUptime @@ -1006,7 +1013,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_COMPLETION_TIMESTAMP); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + ValidatorMessages.packSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( @@ -1026,11 +1033,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { } function testInitializeEndValidationPoAValidator() public { - bytes32 defaultInitialValidationID = sha256(abi.encodePacked(bytes32(0), uint32(1))); + bytes32 defaultInitialValidationID = sha256(abi.encodePacked(DEFAULT_SUBNET_ID, uint32(1))); vm.warp(DEFAULT_COMPLETION_TIMESTAMP); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(defaultInitialValidationID, 1, 0); + ValidatorMessages.packSubnetValidatorWeightMessage(defaultInitialValidationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.expectEmit(true, true, true, true, address(validatorManager)); emit ValidatorRemovalInitialized( @@ -1058,7 +1065,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { vm.warp(DEFAULT_COMPLETION_TIMESTAMP); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + ValidatorMessages.packSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( @@ -1141,8 +1148,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 expectedValidatorWeight, uint64 expectedNonce ) internal returns (bytes32) { - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, expectedNonce, expectedValidatorWeight); + bytes memory setValidatorWeightPayload = ValidatorMessages.packSubnetValidatorWeightMessage( + validationID, expectedNonce, expectedValidatorWeight + ); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); vm.warp(registrationTimestamp); @@ -1169,8 +1177,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 expectedValidatorWeight, uint64 expectedNonce ) internal { - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSubnetValidatorWeightUpdateMessage( + bytes memory setValidatorWeightPayload = ValidatorMessages.packSubnetValidatorWeightMessage( validationID, expectedNonce, expectedValidatorWeight ); _mockGetPChainWarpMessage(setValidatorWeightPayload, true); @@ -1316,8 +1323,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { bool includeUptime, bool force ) internal { - bytes memory setValidatorWeightPayload = ValidatorMessages - .packSetSubnetValidatorWeightMessage(validationID, expectedNonce, expectedValidatorWeight); + bytes memory setValidatorWeightPayload = ValidatorMessages.packSubnetValidatorWeightMessage( + validationID, expectedNonce, expectedValidatorWeight + ); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); bytes memory uptimeMsg = ValidatorMessages.packValidationUptimeMessage( validationID, endDelegationTimestamp - startDelegationTimestamp @@ -1460,7 +1468,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { uint64 validatorWeight, uint64 expectedNonce ) internal { - bytes memory weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( + bytes memory weightUpdateMessage = ValidatorMessages.packSubnetValidatorWeightMessage( validationID, expectedNonce, validatorWeight ); _mockGetPChainWarpMessage(weightUpdateMessage, true); diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index f1623ffa3..20d3fda4e 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -8,7 +8,11 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {ValidatorManager, SubnetConversionData, InitialValidator} from "../ValidatorManager.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; -import {ValidatorStatus, ValidatorRegistrationInput} from "../interfaces/IValidatorManager.sol"; +import { + ValidatorStatus, + ValidatorRegistrationInput, + PChainOwner +} from "../interfaces/IValidatorManager.sol"; import { WarpMessage, IWarpMessenger @@ -19,19 +23,19 @@ import { abstract contract ValidatorManagerTest is Test { bytes32 public constant DEFAULT_SUBNET_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); - bytes32 public constant DEFAULT_NODE_ID = - bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); - bytes32 public constant DEFAULT_INITIAL_VALIDATOR_NODE_ID_1 = - bytes32(hex"2345678123456781234567812345678123456781234567812345678123456781"); - bytes32 public constant DEFAULT_INITIAL_VALIDATOR_NODE_ID_2 = - bytes32(hex"1345678123456781234567812345678123456781234567812345678123456781"); + bytes public constant DEFAULT_NODE_ID = + bytes(hex"1234567812345678123456781234567812345678123456781234567812345678"); + bytes public constant DEFAULT_INITIAL_VALIDATOR_NODE_ID_1 = + bytes(hex"2345678123456781234567812345678123456781234567812345678123456781"); + bytes public constant DEFAULT_INITIAL_VALIDATOR_NODE_ID_2 = + bytes(hex"1345678123456781234567812345678123456781234567812345678123456781"); bytes public constant DEFAULT_BLS_PUBLIC_KEY = bytes( hex"123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); bytes32 public constant DEFAULT_SOURCE_BLOCKCHAIN_ID = bytes32(hex"abcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd"); - bytes32 public constant DEFAULT_SUBNET_CONVERSION_TX_ID = - bytes32(hex"b4836b329538fa9ca7b5bcaabc443ade2b4825246455c5c3932672d083f6b976"); + bytes32 public constant DEFAULT_SUBNET_CONVERSION_ID = + bytes32(hex"76a386628f079b7b00452f8cab0925740363fcd52b721a8cf91773e857327b36"); address public constant WARP_PRECOMPILE_ADDRESS = 0x0200000000000000000000000000000000000005; uint64 public constant DEFAULT_WEIGHT = 1e6; @@ -46,6 +50,8 @@ abstract contract ValidatorManagerTest is Test { uint64 public constant DEFAULT_REGISTRATION_TIMESTAMP = 1000; uint256 public constant DEFAULT_STARTING_TOTAL_WEIGHT = 1e10 + DEFAULT_WEIGHT; uint64 public constant DEFAULT_COMPLETION_TIMESTAMP = 100_000; + // solhint-disable-next-line var-name-mixedcase + PChainOwner public DEFAULT_P_CHAIN_OWNER; ValidatorManager public validatorManager; @@ -54,7 +60,7 @@ abstract contract ValidatorManagerTest is Test { event ValidationPeriodCreated( bytes32 indexed validationID, - bytes32 indexed nodeID, + bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry @@ -76,6 +82,12 @@ abstract contract ValidatorManagerTest is Test { receive() external payable {} fallback() external payable {} + function setUp() public virtual { + address[] memory addresses = new address[](1); + addresses[0] = 0x1234567812345678123456781234567812345678; + DEFAULT_P_CHAIN_OWNER = PChainOwner({threshold: 1, addresses: addresses}); + } + function testInitializeValidatorRegistrationSuccess() public { _setUpInitializeValidatorRegistration( DEFAULT_NODE_ID, @@ -118,9 +130,11 @@ abstract contract ValidatorManagerTest is Test { ValidatorMessages.ValidationPeriod({ subnetID: DEFAULT_SUBNET_ID, nodeID: DEFAULT_NODE_ID, - weight: DEFAULT_WEIGHT, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + weight: DEFAULT_WEIGHT }) ); _mockSendWarpMessage(registerSubnetValidatorMessage, bytes32(0)); @@ -155,7 +169,7 @@ abstract contract ValidatorManagerTest is Test { }); bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, 1, 0); + ValidatorMessages.packSubnetValidatorWeightMessage(validationID, 1, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); validatorManager.resendEndValidatorMessage(validationID); } @@ -228,8 +242,10 @@ abstract contract ValidatorManagerTest is Test { _initializeValidatorRegistration( ValidatorRegistrationInput({ nodeID: DEFAULT_NODE_ID, - registrationExpiry: DEFAULT_REGISTRATION_TIMESTAMP + 1, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + registrationExpiry: DEFAULT_REGISTRATION_TIMESTAMP + 1 }), _valueToWeight(DEFAULT_MINIMUM_STAKE_AMOUNT) ); @@ -279,13 +295,13 @@ abstract contract ValidatorManagerTest is Test { ); } - function _newNodeID() internal returns (bytes32) { + function _newNodeID() internal returns (bytes memory) { nodeIDCounter++; - return sha256(new bytes(nodeIDCounter)); + return abi.encodePacked(sha256(new bytes(nodeIDCounter))); } function _setUpInitializeValidatorRegistration( - bytes32 nodeID, + bytes memory nodeID, bytes32 subnetID, uint64 weight, uint64 registrationExpiry, @@ -295,9 +311,11 @@ abstract contract ValidatorManagerTest is Test { ValidatorMessages.ValidationPeriod({ nodeID: nodeID, subnetID: subnetID, - weight: weight, + blsPublicKey: blsPublicKey, registrationExpiry: registrationExpiry, - blsPublicKey: blsPublicKey + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + weight: weight }) ); (, bytes memory registerSubnetValidatorMessage) = ValidatorMessages @@ -305,9 +323,11 @@ abstract contract ValidatorManagerTest is Test { ValidatorMessages.ValidationPeriod({ subnetID: subnetID, nodeID: nodeID, - weight: weight, + blsPublicKey: blsPublicKey, registrationExpiry: registrationExpiry, - blsPublicKey: blsPublicKey + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + weight: weight }) ); vm.warp(registrationExpiry - 1); @@ -320,15 +340,17 @@ abstract contract ValidatorManagerTest is Test { _initializeValidatorRegistration( ValidatorRegistrationInput({ nodeID: nodeID, - registrationExpiry: registrationExpiry, - blsPublicKey: blsPublicKey + blsPublicKey: blsPublicKey, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + registrationExpiry: registrationExpiry }), weight ); } function _registerValidator( - bytes32 nodeID, + bytes memory nodeID, bytes32 subnetID, uint64 weight, uint64 registrationExpiry, @@ -359,7 +381,7 @@ abstract contract ValidatorManagerTest is Test { bool force ) internal { bytes memory setValidatorWeightPayload = - ValidatorMessages.packSetSubnetValidatorWeightMessage(validationID, expectedNonce, 0); + ValidatorMessages.packSubnetValidatorWeightMessage(validationID, expectedNonce, 0); _mockSendWarpMessage(setValidatorWeightPayload, bytes32(0)); if (includeUptime) { @@ -453,7 +475,7 @@ abstract contract ValidatorManagerTest is Test { function _mockInitializeValidatorSet() internal { _mockGetPChainWarpMessage( - ValidatorMessages.packSubnetConversionMessage(DEFAULT_SUBNET_CONVERSION_TX_ID), true + ValidatorMessages.packSubnetConversionMessage(DEFAULT_SUBNET_CONVERSION_ID), true ); } @@ -487,7 +509,7 @@ abstract contract ValidatorManagerTest is Test { blsPublicKey: DEFAULT_BLS_PUBLIC_KEY }); return SubnetConversionData({ - convertSubnetTxID: bytes32(0), + subnetID: DEFAULT_SUBNET_ID, validatorManagerBlockchainID: DEFAULT_SOURCE_BLOCKCHAIN_ID, validatorManagerAddress: address(validatorManager), initialValidators: initialValidators diff --git a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol index b8fb9e1a2..12fe198c9 100644 --- a/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorMessagesTests.t.sol @@ -7,12 +7,13 @@ pragma solidity 0.8.25; import {Test} from "@forge-std/Test.sol"; import {ValidatorMessages} from "../ValidatorMessages.sol"; +import {PChainOwner} from "../interfaces/IValidatorManager.sol"; contract ValidatorMessagesTest is Test { bytes32 public constant DEFAULT_SUBNET_ID = bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); - bytes32 public constant DEFAULT_NODE_ID = - bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); + bytes public constant DEFAULT_NODE_ID = + bytes(hex"1234567812345678123456781234567812345678123456781234567812345678"); bytes public constant DEFAULT_BLS_PUBLIC_KEY = bytes( hex"123456781234567812345678123456781234567812345678123456781234567812345678123456781234567812345678" ); @@ -20,16 +21,26 @@ contract ValidatorMessagesTest is Test { bytes32(hex"1234567812345678123456781234567812345678123456781234567812345678"); uint64 public constant DEFAULT_WEIGHT = 1e6; uint64 public constant DEFAULT_EXPIRY = 1000; + // solhint-disable-next-line var-name-mixedcase + PChainOwner public DEFAULT_P_CHAIN_OWNER; + + function setUp() public { + address[] memory addresses = new address[](1); + addresses[0] = 0x1234567812345678123456781234567812345678; + DEFAULT_P_CHAIN_OWNER = PChainOwner({threshold: 1, addresses: addresses}); + } - function testRegisterSubnetValidatorMessage() public pure { + function testRegisterSubnetValidatorMessage() public view { (bytes32 validationID, bytes memory packed) = ValidatorMessages .packRegisterSubnetValidatorMessage( ValidatorMessages.ValidationPeriod({ subnetID: DEFAULT_SUBNET_ID, nodeID: DEFAULT_NODE_ID, - weight: DEFAULT_WEIGHT, registrationExpiry: DEFAULT_EXPIRY, - blsPublicKey: DEFAULT_BLS_PUBLIC_KEY + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + remainingBalanceOwner: DEFAULT_P_CHAIN_OWNER, + disableOwner: DEFAULT_P_CHAIN_OWNER, + weight: DEFAULT_WEIGHT }) ); @@ -55,22 +66,22 @@ contract ValidatorMessagesTest is Test { } function testSetSubnetValidatorWeightMessage() public pure { - bytes memory packed = ValidatorMessages.packSetSubnetValidatorWeightMessage( + bytes memory packed = ValidatorMessages.packSubnetValidatorWeightMessage( DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT ); (bytes32 validationID, uint64 nonce, uint64 weight) = - ValidatorMessages.unpackSetSubnetValidatorWeightMessage(packed); + ValidatorMessages.unpackSubnetValidatorWeightMessage(packed); assertEq(validationID, DEFAULT_VALIDATION_ID); assertEq(nonce, 100); assertEq(weight, DEFAULT_WEIGHT); } function testSubnetValidatorWeightUpdateMessag() public pure { - bytes memory packed = ValidatorMessages.packSubnetValidatorWeightUpdateMessage( + bytes memory packed = ValidatorMessages.packSubnetValidatorWeightMessage( DEFAULT_VALIDATION_ID, 100, DEFAULT_WEIGHT ); (bytes32 validationID, uint64 nonce, uint64 weight) = - ValidatorMessages.unpackSubnetValidatorWeightUpdateMessage(packed); + ValidatorMessages.unpackSubnetValidatorWeightMessage(packed); assertEq(validationID, DEFAULT_VALIDATION_ID); assertEq(nonce, 100); assertEq(weight, DEFAULT_WEIGHT); From e6ffd3bab2d3c9f096ba12561cca3f29118fde55 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 2 Oct 2024 11:51:55 -0500 Subject: [PATCH 455/545] update bindings --- .../ERC20TokenStakingManager.go | 110 ++++++++++-------- .../NativeTokenStakingManager.go | 110 ++++++++++-------- .../PoAValidatorManager.go | 110 ++++++++++-------- 3 files changed, 177 insertions(+), 153 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 8da6be672..88d5180a7 100644 --- a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go +++ b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go @@ -31,9 +31,15 @@ var ( // InitialValidator is an auto generated low-level Go binding around an user-defined struct. type InitialValidator struct { - NodeID [32]byte - Weight uint64 + NodeID []byte BlsPublicKey []byte + Weight uint64 +} + +// PChainOwner is an auto generated low-level Go binding around an user-defined struct. +type PChainOwner struct { + Threshold uint32 + Addresses []common.Address } // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. @@ -49,7 +55,7 @@ type PoSValidatorManagerSettings struct { // SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. type SubnetConversionData struct { - ConvertSubnetTxID [32]byte + SubnetID [32]byte ValidatorManagerBlockchainID [32]byte ValidatorManagerAddress common.Address InitialValidators []InitialValidator @@ -58,7 +64,7 @@ type SubnetConversionData struct { // Validator is an auto generated low-level Go binding around an user-defined struct. type Validator struct { Status uint8 - NodeID [32]byte + NodeID []byte StartingWeight uint64 MessageNonce uint64 Weight uint64 @@ -75,15 +81,17 @@ type ValidatorManagerSettings struct { // ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. type ValidatorRegistrationInput struct { - NodeID [32]byte - RegistrationExpiry uint64 - BlsPublicKey []byte + NodeID []byte + BlsPublicKey []byte + RegistrationExpiry uint64 + RemainingBalanceOwner PChainOwner + DisableOwner PChainOwner } // 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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"InvalidCodecID\",\"inputs\":[]},{\"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\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"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: "0x608060405234801561000f575f80fd5b506040516154c13803806154c183398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6153748061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c80638280a25a11610114578063bc5fbfec116100a9578063df93d8de11610079578063df93d8de14610451578063e4a63c401461045b578063e7d14c1c1461046f578063eb0acb89146104ad578063f09969ae146104c0575f80fd5b8063bc5fbfec14610402578063bee0a03f14610416578063c974d1b614610429578063d5f20ff614610431575f80fd5b8063a3a65e48116100e4578063a3a65e48146103a2578063afb98096146103b5578063b771b3bc146103c9578063ba3a4b97146103ef575f80fd5b80638280a25a1461036157806393e245981461036957806398f3e2b41461037c5780639e1bc4ef1461038f575f80fd5b8063467ef06f1161018a578063620658561161015a578063620658561461031357806366435abf14610334578063732214f81461034757806376f786211461034e575f80fd5b8063467ef06f146102bd5780635297fae6146102d057806360305d62146102e357806361e2f49014610300575f80fd5b806325e1c776116101c557806325e1c776146102505780632e2194d81461026357806335455ded1461028e5780633a1cfff6146102aa575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b610209610204366004614897565b6104d3565b005b6102096102193660046148d2565b610508565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b366004614897565b61068f565b61020961025e3660046148e9565b61069a565b6102766102713660046148d2565b61070e565b6040516001600160401b039091168152602001610234565b61029761271081565b60405161ffff9091168152602001610234565b6102096102b8366004614897565b610724565b6102096102cb366004614913565b61072f565b6102096102de36600461492c565b6107f1565b6102eb601481565b60405163ffffffff9091168152602001610234565b61020961030e366004614954565b610a5c565b6103266103213660046149af565b610f0f565b604051908152602001610234565b6102766103423660046148d2565b610f28565b6103265f81565b61020961035c366004614897565b610f3c565b610226603081565b6102096103773660046148d2565b610f67565b61020961038a36600461492c565b611032565b61032661039d3660046149c8565b61120a565b6102096103b0366004614913565b611236565b6103265f805160206152e883398151915281565b6103d76005600160991b0181565b6040516001600160a01b039091168152602001610234565b6102096103fd3660046148d2565b6113bf565b6103265f8051602061530883398151915281565b6102096104243660046148d2565b6115a8565b610226601481565b61044461043f3660046148d2565b6116e5565b6040516102349190614a10565b6102766202a30081565b6103265f805160206152c883398151915281565b61032661047d3660046148d2565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b6103266104bb366004614a8a565b6117ad565b6102096104ce366004614b03565b6117e2565b6104de8383836118c1565b61050357604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206153488339815191526020526040808220815160e0810190925280545f8051602061530883398151915293929190829060ff166005811115610555576105556149e8565b6005811115610566576105666149e8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156105d5576105d56149e8565b14610608575f8381526007830160205260409081902054905163170cc93360e21b81526104fa9160ff1690600401614b41565b6005600160991b016001600160a01b031663ee5b48eb61062d8584606001515f611b46565b6040518263ffffffff1660e01b81526004016106499190614b71565b6020604051808303815f875af1158015610665573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106899190614ba3565b50505050565b6106898383836118c1565b6106a382611b95565b6106c3576040516330efa98b60e01b8152600481018390526024016104fa565b5f6106cd836116e5565b51905060028160058111156106e4576106e46149e8565b14610704578060405163170cc93360e21b81526004016104fa9190614b41565b6106898383611bd0565b5f61071e64e8d4a5100083614bce565b92915050565b610689838383611e4a565b610737612043565b5f805160206152e88339815191525f806107508461207a565b9150915061075d82611b95565b610769575050506107d8565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610798576107986149e8565b036107bd575f838152600785016020526040812080549190556107bb8282612311565b505b6107d3816107ce8460400151610f0f565b612387565b505050505b6107ee60015f8051602061532883398151915255565b50565b5f8181525f805160206152a88339815191526020526040808220815160e0810190925280545f805160206152e883398151915293929190829060ff16600381111561083e5761083e6149e8565b600381111561084f5761084f6149e8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f6108c5826116e5565b90506001835160038111156108dc576108dc6149e8565b146108fd578251604051633b0d540d60e21b81526104fa9190600401614bed565b600481516005811115610912576109126149e8565b0361092857610920856123bd565b505050505050565b5f8061093f610936896125a4565b604001516126ba565b509150915081841461096c57846040015160405163089938b360e11b81526004016104fa91815260200190565b806001600160401b031683606001516001600160401b031610806109a55750806001600160401b03168560a001516001600160401b0316115b156109ce57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104fa565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206153088339815191529060ff1615610aae57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610af1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b159190614ba3565b836020013514610b3e576040516372b0a7e760e11b8152602084013560048201526024016104fa565b30610b4f6060850160408601614c07565b6001600160a01b031614610b9257610b6d6060840160408501614c07565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104fa565b5f610ba06060850185614c22565b905090505f805b828163ffffffff161015610e4f575f610bc36060880188614c22565b8363ffffffff16818110610bd957610bd9614c67565b9050602002810190610beb9190614c7b565b610bf490614d2b565b80515f8181526008880160205260409020549192509015610c2b57604051631ec583cb60e11b8152600481018290526024016104fa565b5f6002895f013585604051602001610c5a92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610c7491614dc2565b602060405180830381855afa158015610c8f573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cb29190614ba3565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610d3e57610d3e6149e8565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151610df1911686614dd3565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a350505080610e4890614de6565b9050610ba7565b50600483018190555f610e6d610e64866125a4565b604001516128f8565b90505f610e7987612a6d565b90505f600282604051610e8c9190614dc2565b602060405180830381855afa158015610ea7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610eca9190614ba3565b9050828114610ef657604051631872fc8d60e01b815260048101829052602481018490526044016104fa565b5050506009909201805460ff1916600117905550505050565b5f61071e6001600160401b03831664e8d4a51000614e08565b5f610f32826116e5565b6080015192915050565b610f47838383611e4a565b61050357604051635bff683f60e11b8152600481018490526024016104fa565b5f805160206152e88339815191525f610f7f836116e5565b5190506004816005811115610f9657610f966149e8565b14610fb6578060405163170cc93360e21b81526004016104fa9190614b41565b5f8381526004830160205260409020546001600160a01b03163314610ffc57335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104fa565b5f83815260078301602090815260408083208054908490556004860190925290912054610689906001600160a01b031682612311565b61103a612043565b5f8181525f805160206152a88339815191526020526040808220815160e0810190925280545f805160206152e883398151915293929190829060ff166003811115611087576110876149e8565b6003811115611098576110986149e8565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529050600381516003811115611111576111116149e8565b14611132578051604051633b0d540d60e21b81526104fa9190600401614bed565b600461114182604001516116e5565b516005811115611153576111536149e8565b146111e5575f611162856125a4565b90505f8061117383604001516126ba565b50915091508184604001511461119f5760405163089938b360e11b8152600481018390526024016104fa565b806001600160401b03168460c001516001600160401b031611156111e157604051632e19bc2d60e11b81526001600160401b03821660048201526024016104fa565b5050505b6111ee836123bd565b505061120660015f8051602061532883398151915255565b5050565b5f611213612043565b61121e833384612bf3565b905061071e60015f8051602061532883398151915255565b5f805160206153088339815191525f8061125b611252856125a4565b60400151612ecb565b915091508061128157604051632d07135360e01b815281151560048201526024016104fa565b5f8281526006840160205260409020805461129b90614e1f565b90505f036112bf5760405163089938b360e11b8152600481018390526024016104fa565b60015f83815260078501602052604090205460ff1660058111156112e5576112e56149e8565b14611318575f8281526007840160205260409081902054905163170cc93360e21b81526104fa9160ff1690600401614b41565b5f8281526006840160205260408120611330916147e7565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f805160206152a88339815191526020526040808220815160e0810190925280545f805160206152e883398151915293929190829060ff16600381111561140c5761140c6149e8565b600381111561141d5761141d6149e8565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290915081516003811115611496576114966149e8565b141580156114b757506003815160038111156114b4576114b46149e8565b14155b156114d8578051604051633b0d540d60e21b81526104fa9190600401614bed565b5f6114e682604001516116e5565b905080606001516001600160401b03165f03611518576040516339b894f960e21b8152600481018590526024016104fa565b6005600160991b016001600160a01b031663ee5b48eb611545846040015184606001518560800151611b46565b6040518263ffffffff1660e01b81526004016115619190614b71565b6020604051808303815f875af115801561157d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115a19190614ba3565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061530883398151915291906115ef90614e1f565b90505f036116135760405163089938b360e11b8152600481018390526024016104fa565b60015f83815260078301602052604090205460ff166005811115611639576116396149e8565b1461166c575f8281526007820160205260409081902054905163170cc93360e21b81526104fa9160ff1690600401614b41565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916116a59190600401614e57565b6020604051808303815f875af11580156116c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105039190614ba3565b6116ed61481e565b5f8281525f80516020615348833981519152602052604090819020815160e0810190925280545f80516020615308833981519152929190829060ff16600581111561173a5761173a6149e8565b600581111561174b5761174b6149e8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f6117b6612043565b6117c28585858561306f565b90506117da60015f8051602061532883398151915255565b949350505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff168061182b575080546001600160401b03808416911610155b156118495760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556118748484613248565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b5f8381525f805160206152a88339815191526020526040808220815160e0810190925280545f805160206152e88339815191529284929091829060ff16600381111561190f5761190f6149e8565b6003811115611920576119206149e8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611996826116e5565b90506002835160038111156119ad576119ad6149e8565b146119ce578251604051633b0d540d60e21b81526104fa9190600401614bed565b60208301516001600160a01b031633146119e85733610fd7565b6002815160058111156119fd576119fd6149e8565b03611ada578615611a1457611a128287611bd0565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611a4d918491611a489190614ee1565b613262565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611a8e846133b9565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611b3f9350505050565b600481516005811115611aef57611aef6149e8565b03611b2357611afd836133b9565b5f898152600686016020526040902055611b16886123bd565b6001945050505050611b3f565b805160405163170cc93360e21b81526104fa9190600401614b41565b9392505050565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611c1b573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c429190810190614f0c565b9150915080611c6457604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ca7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ccb9190614ba3565b825114611cf1578151604051636ba589a560e01b815260048101919091526024016104fa565b60208201516001600160a01b031615611d2d576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104fa565b5f80611d3c8460400151613565565b91509150818714611d635760405163089938b360e11b8152600481018890526024016104fa565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f805160206152e8833981519152906001600160401b039081169083161115611e20575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611e3f565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f805160206152e883398151915281611e6386613740565b9050611e6e86611b95565b611e7d57600192505050611b3f565b5f8681526004830160205260409020546001600160a01b03163314611ea25733610fd7565b5f86815260048301602052604090205460a0820151611ed191600160b01b90046001600160401b031690614fde565b6001600160401b03168160c001516001600160401b03161015611f185760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104fa565b5f8515611f3057611f298786611bd0565b9050611f4e565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b590611f7390610f0f565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015611fe9573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061200d9190614ba3565b905080846007015f8a81526020019081526020015f205f8282546120319190614dd3565b90915550501515979650505050505050565b5f8051602061532883398151915280546001190161207457604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61208361481e565b5f805160206153088339815191525f8061209f611252876125a4565b9150915080156120c657604051632d07135360e01b815281151560048201526024016104fa565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156120f7576120f76149e8565b6005811115612108576121086149e8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115612177576121776149e8565b141580156121985750600181516005811115612195576121956149e8565b14155b156121b957805160405163170cc93360e21b81526104fa9190600401614b41565b6003815160058111156121ce576121ce6149e8565b036121dc57600481526121e1565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff19166001836005811115612226576122266149e8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156122da576122da6149e8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f805160206152c883398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b15801561236c575f80fd5b505af115801561237e573d5f803e3d5ffd5b50505050505050565b5f805160206152c883398151915254611206906001600160a01b03168383613992565b60015f8051602061532883398151915255565b5f8181525f805160206152a88339815191526020526040808220815160e0810190925280545f805160206152e883398151915293929190829060ff16600381111561240a5761240a6149e8565b600381111561241b5761241b6149e8565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612549575f848152600487016020526040902054612710906124fb90600160a01b900461ffff1685614e08565b6125059190614bce565b915081866007015f8681526020019081526020015f205f8282546125299190614dd3565b9091555061253990508284614ffe565b9050612549856020015182612311565b61255e85602001516107ce8760600151610f0f565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015612608573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261262f9190810190614f0c565b915091508061265157604051636b2f19e960e01b815260040160405180910390fd5b815115612677578151604051636ba589a560e01b815260048101919091526024016104fa565b60208201516001600160a01b0316156126b3576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104fa565b5092915050565b5f805f83516036146126df57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561272e576126f6816001614ffe565b612701906008614e08565b61ffff1686828151811061271757612717614c67565b016020015160f81c901b91909117906001016126e2565b5061ffff8116156127525760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156127ad57612769816003614ffe565b612774906008614e08565b63ffffffff1687612786836002614dd3565b8151811061279657612796614c67565b016020015160f81c901b9190911790600101612755565b5063ffffffff81166004146127d557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561282a576127ec81601f614ffe565b6127f7906008614e08565b88612803836006614dd3565b8151811061281357612813614c67565b016020015160f81c901b91909117906001016127d8565b505f805b600881101561288957612842816007614ffe565b61284d906008614e08565b6001600160401b031689612862836026614dd3565b8151811061287257612872614c67565b016020015160f81c901b919091179060010161282e565b505f805b60088110156128e8576128a1816007614ffe565b6128ac906008614e08565b6001600160401b03168a6128c183602e614dd3565b815181106128d1576128d1614c67565b016020015160f81c901b919091179060010161288d565b5091989097509095509350505050565b5f815160261461291b57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561296a57612932816001614ffe565b61293d906008614e08565b61ffff1684828151811061295357612953614c67565b016020015160f81c901b919091179060010161291e565b5061ffff81161561298e5760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156129e9576129a5816003614ffe565b6129b0906008614e08565b63ffffffff16856129c2836002614dd3565b815181106129d2576129d2614c67565b016020015160f81c901b9190911790600101612991565b5063ffffffff811615612a0f57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612a6457612a2681601f614ffe565b612a31906008614e08565b86612a3d836006614dd3565b81518110612a4d57612a4d614c67565b016020015160f81c901b9190911790600101612a12565b50949350505050565b60605f823560208401356014612a8886860160408801614c07565b612a956060880188614c22565b604051612aee969594939250602001948552602085019390935260e091821b6001600160e01b0319908116604086015260609190911b6bffffffffffffffffffffffff1916604485015291901b166058820152605c0190565b60405160208183030381529060405290505f5b612b0e6060850185614c22565b90508110156126b35781612b256060860186614c22565b83818110612b3557612b35614c67565b9050602002810190612b479190614c7b565b35612b556060870187614c22565b84818110612b6557612b65614c67565b9050602002810190612b779190614c7b565b612b889060408101906020016149af565b612b956060880188614c22565b85818110612ba557612ba5614c67565b9050602002810190612bb79190614c7b565b612bc5906040810190615011565b604051602001612bd9959493929190615053565b60408051601f198184030181529190529150600101612b01565b5f5f805160206152e883398151915281612c0f610271856139f1565b90505f612c1b876116e5565b9050612c2687611b95565b612c46576040516330efa98b60e01b8152600481018890526024016104fa565b600281516005811115612c5b57612c5b6149e8565b14612c7c57805160405163170cc93360e21b81526104fa9190600401614b41565b5f828260800151612c8d9190614fde565b905083600201600a9054906101000a90046001600160401b03168260400151612cb69190615098565b6001600160401b0316816001600160401b03161115612cf357604051636d51fe0560e11b81526001600160401b03821660048201526024016104fa565b5f80612cff8a84613262565b915091505f8a83604051602001612d2d92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff19166001836003811115612dc057612dc06149e8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f808251602714612eef57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612f3e57612f06816001614ffe565b612f11906008614e08565b61ffff16858281518110612f2757612f27614c67565b016020015160f81c901b9190911790600101612ef2565b5061ffff811615612f625760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612fbd57612f79816003614ffe565b612f84906008614e08565b63ffffffff1686612f96836002614dd3565b81518110612fa657612fa6614c67565b016020015160f81c901b9190911790600101612f65565b5063ffffffff8116600314612fe557604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561303a57612ffc81601f614ffe565b613007906008614e08565b87613013836006614dd3565b8151811061302357613023614c67565b016020015160f81c901b9190911790600101612fe8565b505f8660268151811061304f5761304f614c67565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206152e883398151915290600160401b900461ffff90811690861610806130c3575061271061ffff8616115b156130e757604051635f12e6c360e11b815261ffff861660048201526024016104fa565b60028101546001600160401b039081169085161015613123576040516202a06d60e11b81526001600160401b03851660048201526024016104fa565b80548310806131355750806001015483115b156131565760405163222d164360e21b8152600481018490526024016104fa565b5f613160846139f1565b90505f61316c8261070e565b90505f6131798983613a14565b9050604051806080016040528061318d3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b613250613e46565b61325982613e91565b61120681613eff565b5f8281525f80516020615348833981519152602052604081206002015481905f8051602061530883398151915290600160801b90046001600160401b03166132aa8582613f67565b5f6132b487614141565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6133048a858b611b46565b6040518263ffffffff1660e01b81526004016133209190614b71565b6020604051808303815f875af115801561333c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133609190614ba3565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f805160206152e883398151915290505f6133d984604001516116e5565b90505f6003825160058111156133f1576133f16149e8565b148061340f575060048251600581111561340d5761340d6149e8565b145b1561341f575060c081015161345c565b600282516005811115613434576134346149e8565b0361344057504261345c565b815160405163170cc93360e21b81526104fa9190600401614b41565b84608001516001600160401b0316816001600160401b03161161348357505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906134a890610f0f565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613538573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061355c9190614ba3565b95945050505050565b5f808251602e1461358957604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156135d8576135a0816001614ffe565b6135ab906008614e08565b61ffff168582815181106135c1576135c1614c67565b016020015160f81c901b919091179060010161358c565b5061ffff8116156135fc5760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561365757613613816003614ffe565b61361e906008614e08565b63ffffffff1686613630836002614dd3565b8151811061364057613640614c67565b016020015160f81c901b91909117906001016135ff565b5063ffffffff811660051461367f57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156136d45761369681601f614ffe565b6136a1906008614e08565b876136ad836006614dd3565b815181106136bd576136bd614c67565b016020015160f81c901b9190911790600101613682565b505f805b6008811015613733576136ec816007614ffe565b6136f7906008614e08565b6001600160401b03168861370c836026614dd3565b8151811061371c5761371c614c67565b016020015160f81c901b91909117906001016136d8565b5090969095509350505050565b61374861481e565b5f8281525f805160206153488339815191526020526040808220815160e0810190925280545f8051602061530883398151915293929190829060ff166005811115613795576137956149e8565b60058111156137a6576137a66149e8565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115613818576138186149e8565b1461384b575f8481526007830160205260409081902054905163170cc93360e21b81526104fa9160ff1690600401614b41565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff1916600183600581111561388f5761388f6149e8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f61393b8582613262565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b0383811660248301526044820183905261050391859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506141b6565b5f61071e825f805160206152c8833981519152546001600160a01b031690614217565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613a5857604051637fab81e560e01b815260040160405180910390fd5b5f8051602061530883398151915242613a7760408601602087016149af565b6001600160401b0316111580613ab15750613a956202a30042614dd3565b613aa560408601602087016149af565b6001600160401b031610155b15613aeb57613ac660408501602086016149af565b604051635879da1360e11b81526001600160401b0390911660048201526024016104fa565b6030613afa6040860186615011565b905014613b2c57613b0e6040850185615011565b6040516326475b2f60e11b81526104fa925060040190815260200190565b8335613b4e5760405163099e922360e21b8152843560048201526024016104fa565b83355f90815260088201602052604090205415613b8157604051631ec583cb60e11b8152843560048201526024016104fa565b613b8b835f613f67565b5f80613c246040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613bcf91906149af565b6001600160401b03168152602001613bea60408a018a615011565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050915250614370565b5f82815260068601602052604090209193509150613c428282615107565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613c80908590600401614b71565b6020604051808303815f875af1158015613c9c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613cc09190614ba3565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613d3857613d386149e8565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613e18918e01908e016149af565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613e8f57604051631afcd79f60e31b815260040160405180910390fd5b565b613e99613e46565b613ea281614433565b613eaa61444c565b6107ee60608201356080830135613ec760c0850160a086016149af565b613ed760e0860160c087016151c2565b613ee8610100870160e088016151db565b613efa61012088016101008901614c07565b61445c565b613f07613e46565b5f805160206152c88339815191526001600160a01b038216613f4757604051637330680360e01b81526001600160a01b03831660048201526024016104fa565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f805160206153088339815191525f6001600160401b038084169085161115613f9b57613f948385614ee1565b9050613fa8565b613fa58484614ee1565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061400a575060018401548151614006916001600160401b031690614dd3565b8210155b15614030576001600160401b03831660608201528181526040810151602082015261404f565b82816060018181516140429190614fde565b6001600160401b03169052505b606081015161405f906064615098565b602082015160018601546001600160401b03929092169161408a9190600160401b900460ff16614e08565b10156140ba57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104fa565b856001600160401b0316816040018181516140d59190614dd3565b9052506040810180516001600160401b03871691906140f5908390614ffe565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206153488339815191526020526040812060020180545f80516020615308833981519152919060089061418b90600160401b90046001600160401b03166151fb565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6141ca6001600160a01b0384168361458b565b905080515f141580156141ee5750808060200190518101906141ec9190615216565b155b1561050357604051635274afe760e01b81526001600160a01b03841660048201526024016104fa565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561425d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142819190614ba3565b90506142986001600160a01b038516333086614598565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156142dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143009190614ba3565b90508181116143665760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104fa565b61355c8282614ffe565b5f606082608001515160301461439957604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016143cb9796959493929190615231565b60405160208183030381529060405290506002816040516143ec9190614dc2565b602060405180830381855afa158015614407573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061442a9190614ba3565b94909350915050565b61443b613e46565b6144436145d1565b6107ee816145d9565b614454613e46565b613e8f6146c1565b614464613e46565b5f805160206152e883398151915261ffff84161580614488575061271061ffff8516115b156144ac57604051635f12e6c360e11b815261ffff851660048201526024016104fa565b858711156144d05760405163222d164360e21b8152600481018890526024016104fa565b60ff831615806144e35750600a60ff8416115b156145065760405163170db35960e31b815260ff841660048201526024016104fa565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611b3f83835f6146c9565b6040516001600160a01b0384811660248301528381166044830152606482018390526106899186918216906323b872dd906084016139bf565b613e8f613e46565b6145e1613e46565b80355f80516020615308833981519152908155601461460660608401604085016151db565b60ff161180614625575061462060608301604084016151db565b60ff16155b156146595761463a60608301604084016151db565b604051634a59bbff60e11b815260ff90911660048201526024016104fa565b61466960608301604084016151db565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561469a60408301602084016149af565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6123aa613e46565b6060814710156146ee5760405163cd78605960e01b81523060048201526024016104fa565b5f80856001600160a01b031684866040516147099190614dc2565b5f6040518083038185875af1925050503d805f8114614743576040519150601f19603f3d011682016040523d82523d5f602084013e614748565b606091505b5091509150614758868383614762565b9695505050505050565b60608261477757614772826147be565b611b3f565b815115801561478e57506001600160a01b0384163b155b156147b757604051639996b31560e01b81526001600160a01b03851660048201526024016104fa565b5080611b3f565b8051156147ce5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b5080546147f390614e1f565b5f825580601f10614802575050565b601f0160209004905f5260205f20908101906107ee919061485a565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561486e575f815560010161485b565b5090565b80151581146107ee575f80fd5b803563ffffffff81168114614892575f80fd5b919050565b5f805f606084860312156148a9575f80fd5b8335925060208401356148bb81614872565b91506148c96040850161487f565b90509250925092565b5f602082840312156148e2575f80fd5b5035919050565b5f80604083850312156148fa575f80fd5b8235915061490a6020840161487f565b90509250929050565b5f60208284031215614923575f80fd5b611b3f8261487f565b5f806040838503121561493d575f80fd5b6149468361487f565b946020939093013593505050565b5f8060408385031215614965575f80fd5b82356001600160401b0381111561497a575f80fd5b83016080818603121561498b575f80fd5b915061490a6020840161487f565b80356001600160401b0381168114614892575f80fd5b5f602082840312156149bf575f80fd5b611b3f82614999565b5f80604083850312156149d9575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b60068110614a0c57614a0c6149e8565b9052565b5f60e082019050614a228284516149fc565b6020830151602083015260408301516001600160401b0380821660408501528060608601511660608501528060808601511660808501528060a08601511660a08501528060c08601511660c0850152505092915050565b803561ffff81168114614892575f80fd5b5f805f8060808587031215614a9d575f80fd5b84356001600160401b03811115614ab2575f80fd5b850160608188031215614ac3575f80fd5b9350614ad160208601614a79565b9250614adf60408601614999565b9396929550929360600135925050565b6001600160a01b03811681146107ee575f80fd5b5f80828403610140811215614b16575f80fd5b61012080821215614b25575f80fd5b8493508301359050614b3681614aef565b809150509250929050565b6020810161071e82846149fc565b5f5b83811015614b69578181015183820152602001614b51565b50505f910152565b602081525f8251806020840152614b8f816040850160208701614b4f565b601f01601f19169190910160400192915050565b5f60208284031215614bb3575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f82614be857634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310614c0157614c016149e8565b91905290565b5f60208284031215614c17575f80fd5b8135611b3f81614aef565b5f808335601e19843603018112614c37575f80fd5b8301803591506001600160401b03821115614c50575f80fd5b6020019150600581901b36038213156133b2575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614c8f575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614ccf57614ccf614c99565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614cfd57614cfd614c99565b604052919050565b5f6001600160401b03821115614d1d57614d1d614c99565b50601f01601f191660200190565b5f60608236031215614d3b575f80fd5b614d43614cad565b823581526020614d54818501614999565b8183015260408401356001600160401b03811115614d70575f80fd5b840136601f820112614d80575f80fd5b8035614d93614d8e82614d05565b614cd5565b8181523684838501011115614da6575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f8251614c8f818460208701614b4f565b8082018082111561071e5761071e614bba565b5f63ffffffff808316818103614dfe57614dfe614bba565b6001019392505050565b808202811582820484141761071e5761071e614bba565b600181811c90821680614e3357607f821691505b602082108103614e5157634e487b7160e01b5f52602260045260245ffd5b50919050565b5f60208083525f8454614e6981614e1f565b806020870152604060018084165f8114614e8a5760018114614ea657614ed3565b60ff19851660408a0152604084151560051b8a01019550614ed3565b895f5260205f205f5b85811015614eca5781548b8201860152908301908801614eaf565b8a016040019650505b509398975050505050505050565b6001600160401b038281168282160390808211156126b3576126b3614bba565b805161489281614872565b5f8060408385031215614f1d575f80fd5b82516001600160401b0380821115614f33575f80fd5b9084019060608287031215614f46575f80fd5b614f4e614cad565b82518152602080840151614f6181614aef565b82820152604084015183811115614f76575f80fd5b80850194505087601f850112614f8a575f80fd5b83519250614f9a614d8e84614d05565b8381528882858701011115614fad575f80fd5b614fbc84838301848801614b4f565b80604084015250819550614fd1818801614f01565b9450505050509250929050565b6001600160401b038181168382160190808211156126b3576126b3614bba565b8181038181111561071e5761071e614bba565b5f808335601e19843603018112615026575f80fd5b8301803591506001600160401b0382111561503f575f80fd5b6020019150368190038213156133b2575f80fd5b5f8651615064818460208b01614b4f565b820186815260c086901b6001600160c01b0319166020820152838560288301375f9301602801928352509095945050505050565b6001600160401b038181168382160280821691908281146150bb576150bb614bba565b505092915050565b601f82111561050357805f5260205f20601f840160051c810160208510156150e85750805b601f840160051c820191505b818110156115a1575f81556001016150f4565b81516001600160401b0381111561512057615120614c99565b6151348161512e8454614e1f565b846150c3565b602080601f831160018114615167575f84156151505750858301515b5f19600386901b1c1916600185901b178555610920565b5f85815260208120601f198616915b8281101561519557888601518255948401946001909101908401615176565b50858210156151b257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f602082840312156151d2575f80fd5b611b3f82614a79565b5f602082840312156151eb575f80fd5b813560ff81168114611b3f575f80fd5b5f6001600160401b03808316818103614dfe57614dfe614bba565b5f60208284031215615226575f80fd5b8151611b3f81614872565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b166046840152845161528681604e860160208901614b4f565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"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\":\"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: "0x608060405234801561000f575f80fd5b50604051615dd3380380615dd383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c868061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b610209610204366004614ea4565b6104a8565b005b610209610219366004614edf565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b366004614ea4565b6106eb565b61020961025e366004614ef6565b6106f6565b610209610271366004614f44565b610be2565b610289610284366004614edf565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb366004614ea4565b610c6c565b6102096102de366004614f65565b610c77565b6102f66102f1366004614fa5565b610d39565b604051908152602001610234565b61020961031236600461500a565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f6610342366004615032565b610fd9565b610289610355366004614edf565b610ff2565b6102f65f81565b61020961036f366004614ea4565b611006565b610226603081565b61020961038a366004614edf565b611031565b61020961039d36600461500a565b6110fc565b6102f66103b036600461504b565b6112d4565b6102096103c3366004614f65565b611300565b6102f65f80516020615bfa83398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b610209610410366004614edf565b611489565b6102f65f80516020615c1a83398151915281565b610209610437366004614edf565b611672565b610226601481565b610457610452366004614edf565b6117af565b60405161023491906150e0565b6102896202a30081565b6102f65f80516020615bda83398151915281565b610209610490366004615174565b6118fe565b6102f66104a33660046151b2565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615c5a8339815191526020526040808220815160e0810190925280545f80516020615c1a83398151915293929190829060ff16600581111561052a5761052a61506b565b600581111561053b5761053b61506b565b815260200160018201805461054f9061521d565b80601f016020809104026020016040519081016040528092919081815260200182805461057b9061521d565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156106315761063161506b565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615255565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611cbd565b6040518263ffffffff1660e01b81526004016106a59190615263565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e59190615275565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615c1a8339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af9190615275565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e9606085016040860161528c565b6001600160a01b03161461082c57610807606084016040850161528c565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a60608501856152a7565b905090505f805b828163ffffffff161015610b22575f61085d60608801886152a7565b8363ffffffff16818110610873576108736152ec565b90506020028101906108859190615300565b61088e90615424565b80516040519192505f9160088801916108a69161549d565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf9190600401615263565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f9161549d565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d9190615275565b90508086600801835f0151604051610975919061549d565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f761506b565b021790555060208201516001820190610a1090826154f2565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab59116856155c1565b8251604051919550610ac69161549d565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b906155d4565b9050610841565b50600483018190555f610b40610b3786611d0c565b60400151611e22565b90505f610b4c87611faf565b90505f600282604051610b5f919061549d565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190615275565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb826121e8565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c61506b565b14610c4c578060405163170cc93360e21b81526004016104cf9190615255565b6106e58383612223565b5f610c6664e8d4a51000836155f6565b92915050565b6106e583838361249d565b610c7f612696565b5f80516020615bfa8339815191525f80610c98846126cd565b91509150610ca5826121e8565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce061506b565b03610d05575f83815260078501602052604081208054919055610d038282612a0b565b505b610d1b81610d168460400151610fd9565b612a81565b505050505b610d3660015f80516020615c3a83398151915255565b50565b5f610d42612696565b610d4e85858585612ab7565b9050610d6660015f80516020615c3a83398151915255565b949350505050565b5f8181525f80516020615bba8339815191526020526040808220815160e0810190925280545f80516020615bfa83398151915293929190829060ff166003811115610dbb57610dbb61506b565b6003811115610dcc57610dcc61506b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e5961506b565b14610e7a578251604051633b0d540d60e21b81526104cf9190600401615615565b600481516005811115610e8f57610e8f61506b565b03610ea557610e9d85612c90565b505050505050565b5f80610ebc610eb389611d0c565b60400151612e77565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a5100061562f565b5f610ffc826117af565b6080015192915050565b61101183838361249d565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615bfa8339815191525f611049836117af565b51905060048160058111156110605761106061506b565b14611080578060405163170cc93360e21b81526004016104cf9190615255565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b031682612a0b565b611104612696565b5f8181525f80516020615bba8339815191526020526040808220815160e0810190925280545f80516020615bfa83398151915293929190829060ff1660038111156111515761115161506b565b60038111156111625761116261506b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db61506b565b146111fc578051604051633b0d540d60e21b81526104cf9190600401615615565b600461120b82604001516117af565b51600581111561121d5761121d61506b565b146112af575f61122c85611d0c565b90505f8061123d8360400151612e77565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612c90565b50506112d060015f80516020615c3a83398151915255565b5050565b5f6112dd612696565b6112e88333846130cd565b9050610c6660015f80516020615c3a83398151915255565b5f80516020615c1a8339815191525f8061132561131c85611d0c565b604001516133a5565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600684016020526040902080546113659061521d565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af61506b565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615255565b5f82815260068401602052604081206113fa91614df3565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615bba8339815191526020526040808220815160e0810190925280545f80516020615bfa83398151915293929190829060ff1660038111156114d6576114d661506b565b60038111156114e7576114e761506b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156115605761156061506b565b14158015611581575060038151600381111561157e5761157e61506b565b14155b156115a2578051604051633b0d540d60e21b81526104cf9190600401615615565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611cbd565b6040518263ffffffff1660e01b815260040161162b9190615263565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b9190615275565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615c1a83398151915291906116b99061521d565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff1660058111156117035761170361506b565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615255565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f9190600401615646565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d89190615275565b6117b7614e2a565b5f8281525f80516020615c5a833981519152602052604090819020815160e0810190925280545f80516020615c1a833981519152929190829060ff1660058111156118045761180461506b565b60058111156118155761181561506b565b81526020016001820180546118299061521d565b80601f01602080910402602001604051908101604052809291908181526020018280546118559061521d565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119908484613561565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615c1a833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a2090869086906156d0565b90815260200160405180910390205491505092915050565b5f8381525f80516020615bba8339815191526020526040808220815160e0810190925280545f80516020615bfa8339815191529284929091829060ff166003811115611a8657611a8661506b565b6003811115611a9757611a9761506b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b2461506b565b14611b45578251604051633b0d540d60e21b81526104cf9190600401615615565b60208301516001600160a01b03163314611b5f57336110a1565b600281516005811115611b7457611b7461506b565b03611c51578615611b8b57611b898287612223565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611bc4918491611bbf91906156df565b61357b565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c05846136d2565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611cb69350505050565b600481516005811115611c6657611c6661506b565b03611c9a57611c74836136d2565b5f898152600686016020526040902055611c8d88612c90565b6001945050505050611cb6565b805160405163170cc93360e21b81526104cf9190600401615255565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d70573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d97919081019061570a565b9150915080611db957604051636b2f19e960e01b815260040160405180910390fd5b815115611ddf578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611e1b576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611e5757815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611ea657611e6e8160016157dc565b611e7990600861562f565b61ffff16848281518110611e8f57611e8f6152ec565b016020015160f81c901b9190911790600101611e5a565b5061ffff811615611ed05760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611f2b57611ee78160036157dc565b611ef290600861562f565b63ffffffff1685611f048360026155c1565b81518110611f1457611f146152ec565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff811615611f5157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015611fa657611f6881601f6157dc565b611f7390600861562f565b86611f7f8360066155c1565b81518110611f8f57611f8f6152ec565b016020015160f81c901b9190911790600101611f54565b50949350505050565b60605f80833560208501356014611fcb8787016040890161528c565b611fd860608901896152a7565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61205e60608501856152a7565b9050811015611e1b5761207460608501856152a7565b82818110612084576120846152ec565b90506020028101906120969190615300565b6120a49060208101906157ef565b90506030146120c65760405163180ffa0d60e01b815260040160405180910390fd5b816120d460608601866152a7565b838181106120e4576120e46152ec565b90506020028101906120f69190615300565b61210090806157ef565b905061210f60608701876152a7565b8481811061211f5761211f6152ec565b90506020028101906121319190615300565b61213b90806157ef565b61214860608901896152a7565b86818110612158576121586152ec565b905060200281019061216a9190615300565b6121789060208101906157ef565b61218560608b018b6152a7565b88818110612195576121956152ec565b90506020028101906121a79190615300565b6121b8906060810190604001615032565b6040516020016121ce9796959493929190615831565b60408051601f198184030181529190529150600101612051565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561226e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612295919081019061570a565b91509150806122b757604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061231e9190615275565b825114612344578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615612380576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f8061238f846040015161387e565b915091508187146123b65760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615bfa833981519152906001600160401b039081169083161115612473575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612492565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615bfa833981519152816124b686613a6f565b90506124c1866121e8565b6124d057600192505050611cb6565b5f8681526004830160205260409020546001600160a01b031633146124f557336110a1565b5f86815260048301602052604090205460a082015161252491600160b01b90046001600160401b03169061589a565b6001600160401b03168160c001516001600160401b0316101561256b5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125835761257c8786612223565b90506125a1565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906125c690610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561263c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126609190615275565b905080846007015f8a81526020019081526020015f205f82825461268491906155c1565b90915550501515979650505050505050565b5f80516020615c3a8339815191528054600119016126c757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6126d6614e2a565b5f80516020615c1a8339815191525f806126f261131c87611d0c565b91509150801561271957604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561274a5761274a61506b565b600581111561275b5761275b61506b565b815260200160018201805461276f9061521d565b80601f016020809104026020016040519081016040528092919081815260200182805461279b9061521d565b80156127e65780601f106127bd576101008083540402835291602001916127e6565b820191905f5260205f20905b8154815290600101906020018083116127c957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128515761285161506b565b14158015612872575060018151600581111561286f5761286f61506b565b14155b1561289357805160405163170cc93360e21b81526104cf9190600401615255565b6003815160058111156128a8576128a861506b565b036128b657600481526128bb565b600581525b8360080181602001516040516128d1919061549d565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156129155761291561506b565b02179055506020820151600182019061292e90826154f2565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129d4576129d461506b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615bda83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a66575f80fd5b505af1158015612a78573d5f803e3d5ffd5b50505050505050565b5f80516020615bda833981519152546112d0906001600160a01b03168383613d53565b60015f80516020615c3a83398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615bfa83398151915290600160401b900461ffff9081169086161080612b0b575061271061ffff8616115b15612b2f57604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b6b576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612b7d5750806001015483115b15612b9e5760405163222d164360e21b8152600481018490526024016104cf565b5f612ba884613db2565b90505f612bb482610c56565b90505f612bc18983613dd5565b90506040518060800160405280612bd53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615bba8339815191526020526040808220815160e0810190925280545f80516020615bfa83398151915293929190829060ff166003811115612cdd57612cdd61506b565b6003811115612cee57612cee61506b565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e1c575f84815260048701602052604090205461271090612dce90600160a01b900461ffff168561562f565b612dd891906155f6565b915081866007015f8681526020019081526020015f205f828254612dfc91906155c1565b90915550612e0c905082846157dc565b9050612e1c856020015182612a0b565b612e318560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612eae57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612efd57612ec58160016157dc565b612ed090600861562f565b61ffff16868281518110612ee657612ee66152ec565b016020015160f81c901b9190911790600101612eb1565b5061ffff811615612f275760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612f8257612f3e8160036157dc565b612f4990600861562f565b63ffffffff1687612f5b8360026155c1565b81518110612f6b57612f6b6152ec565b016020015160f81c901b9190911790600101612f2a565b5063ffffffff8116600314612faa57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fff57612fc181601f6157dc565b612fcc90600861562f565b88612fd88360066155c1565b81518110612fe857612fe86152ec565b016020015160f81c901b9190911790600101612fad565b505f805b600881101561305e576130178160076157dc565b61302290600861562f565b6001600160401b0316896130378360266155c1565b81518110613047576130476152ec565b016020015160f81c901b9190911790600101613003565b505f805b60088110156130bd576130768160076157dc565b61308190600861562f565b6001600160401b03168a61309683602e6155c1565b815181106130a6576130a66152ec565b016020015160f81c901b9190911790600101613062565b5091989097509095509350505050565b5f5f80516020615bfa833981519152816130e961028485613db2565b90505f6130f5876117af565b9050613100876121e8565b613120576040516330efa98b60e01b8152600481018890526024016104cf565b6002815160058111156131355761313561506b565b1461315657805160405163170cc93360e21b81526104cf9190600401615255565b5f828260800151613167919061589a565b905083600201600a9054906101000a90046001600160401b0316826040015161319091906158ba565b6001600160401b0316816001600160401b031611156131cd57604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f806131d98a8461357b565b915091505f8a8360405160200161320792919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561329a5761329a61506b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146133db57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b600281101561342a576133f28160016157dc565b6133fd90600861562f565b61ffff16858281518110613413576134136152ec565b016020015160f81c901b91909117906001016133de565b5061ffff8116156134545760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134af5761346b8160036157dc565b61347690600861562f565b63ffffffff16866134888360026155c1565b81518110613498576134986152ec565b016020015160f81c901b9190911790600101613457565b5063ffffffff81166002146134d757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561352c576134ee81601f6157dc565b6134f990600861562f565b876135058360066155c1565b81518110613515576135156152ec565b016020015160f81c901b91909117906001016134da565b505f86602681518110613541576135416152ec565b016020015191976001600160f81b03199092161515965090945050505050565b613569614328565b61357282614373565b6112d0816143e1565b5f8281525f80516020615c5a833981519152602052604081206002015481905f80516020615c1a83398151915290600160801b90046001600160401b03166135c38582614449565b5f6135cd87614623565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61361d8a858b611cbd565b6040518263ffffffff1660e01b81526004016136399190615263565b6020604051808303815f875af1158015613655573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136799190615275565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615bfa83398151915290505f6136f284604001516117af565b90505f60038251600581111561370a5761370a61506b565b148061372857506004825160058111156137265761372661506b565b145b15613738575060c0810151613775565b60028251600581111561374d5761374d61506b565b03613759575042613775565b815160405163170cc93360e21b81526104cf9190600401615255565b84608001516001600160401b0316816001600160401b03161161379c57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906137c190610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613851573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138759190615275565b95945050505050565b5f808251602e146138b457825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b6002811015613903576138cb8160016157dc565b6138d690600861562f565b61ffff168582815181106138ec576138ec6152ec565b016020015160f81c901b91909117906001016138b7565b5061ffff81161561392d5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015613988576139448160036157dc565b61394f90600861562f565b63ffffffff16866139618360026155c1565b81518110613971576139716152ec565b016020015160f81c901b9190911790600101613930565b5063ffffffff8116156139ae57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a03576139c581601f6157dc565b6139d090600861562f565b876139dc8360066155c1565b815181106139ec576139ec6152ec565b016020015160f81c901b91909117906001016139b1565b505f805b6008811015613a6257613a1b8160076157dc565b613a2690600861562f565b6001600160401b031688613a3b8360266155c1565b81518110613a4b57613a4b6152ec565b016020015160f81c901b9190911790600101613a07565b5090969095509350505050565b613a77614e2a565b5f8281525f80516020615c5a8339815191526020526040808220815160e0810190925280545f80516020615c1a83398151915293929190829060ff166005811115613ac457613ac461506b565b6005811115613ad557613ad561506b565b8152602001600182018054613ae99061521d565b80601f0160208091040260200160405190810160405280929190818152602001828054613b159061521d565b8015613b605780601f10613b3757610100808354040283529160200191613b60565b820191905f5260205f20905b815481529060010190602001808311613b4357829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613bce57613bce61506b565b14613c01575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615255565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613c4557613c4561506b565b021790555060208201516001820190613c5e90826154f2565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613cfc858261357b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614698565b5f610c66825f80516020615bda833981519152546001600160a01b0316906146f9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e1957604051637fab81e560e01b815260040160405180910390fd5b5f80516020615c1a83398151915242613e386060860160408701615032565b6001600160401b0316111580613e725750613e566202a300426155c1565b613e666060860160408701615032565b6001600160401b031610155b15613eac57613e876060850160408601615032565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b6030613ebb60208601866157ef565b905014613eed57613ecf60208501856157ef565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613ef784806157ef565b90505f03613f2457613f0984806157ef565b604051633e08a12560e11b81526004016104cf9291906158e5565b5f60088201613f3386806157ef565b604051613f419291906156d0565b90815260200160405180910390205414613f7a57613f5f84806157ef565b60405163a41f772f60e01b81526004016104cf9291906158e5565b613f84835f614449565b6040805160e08101909152815481525f9081906140909060208101613fa989806157ef565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190613ff1908a018a6157ef565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161403a60608a0160408b01615032565b6001600160401b0316815260200161405560608a018a615913565b61405e90615927565b815260200161407060808a018a615913565b61407990615927565b8152602001876001600160401b0316815250614852565b5f828152600686016020526040902091935091506140ae82826154f2565b5081600884016140be88806157ef565b6040516140cc9291906156d0565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614108908590600401615263565b6020604051808303815f875af1158015614124573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141489190615275565b6040805160e08101909152909150806001815260200161416889806157ef565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156141f7576141f761506b565b02179055506020820151600182019061421090826154f2565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806142ae88806157ef565b6040516142bc9291906156d0565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906142fa9190615032565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661437157604051631afcd79f60e31b815260040160405180910390fd5b565b61437b614328565b61438481614a3f565b61438c614a58565b610d36606082013560808301356143a960c0850160a08601615032565b6143b960e0860160c087016159ee565b6143ca610100870160e08801615a07565b6143dc6101208801610100890161528c565b614a68565b6143e9614328565b5f80516020615bda8339815191526001600160a01b03821661442957604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615c1a8339815191525f6001600160401b03808416908516111561447d5761447683856156df565b905061448a565b61448784846156df565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806144ec5750600184015481516144e8916001600160401b0316906155c1565b8210155b15614512576001600160401b038316606082015281815260408101516020820152614531565b8281606001818151614524919061589a565b6001600160401b03169052505b60608101516145419060646158ba565b602082015160018601546001600160401b03929092169161456c9190600160401b900460ff1661562f565b101561459c57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b0316816040018181516145b791906155c1565b9052506040810180516001600160401b03871691906145d79083906157dc565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c5a8339815191526020526040812060020180545f80516020615c1a833981519152919060089061466d90600160401b90046001600160401b0316615a27565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6146ac6001600160a01b03841683614b97565b905080515f141580156146d05750808060200190518101906146ce9190615a42565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561473f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147639190615275565b905061477a6001600160a01b038516333086614ba4565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e29190615275565b90508181116148485760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b61387582826157dc565b5f606082604001515160301461487b5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986148bc988a986001989297929690959094909390929101615a5d565b60405160208183030381529060405290505f5b8460800151602001515181101561492e578185608001516020015182815181106148fb576148fb6152ec565b6020026020010151604051602001614914929190615b17565b60408051601f1981840301815291905291506001016148cf565b5060a084015180516020918201515160405161494e938593929101615b4d565b60405160208183030381529060405290505f5b8460a0015160200151518110156149c057818560a0015160200151828151811061498d5761498d6152ec565b60200260200101516040516020016149a6929190615b17565b60408051601f198184030181529190529150600101614961565b5060c08401516040516149d7918391602001615b88565b60405160208183030381529060405290506002816040516149f8919061549d565b602060405180830381855afa158015614a13573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a369190615275565b94909350915050565b614a47614328565b614a4f614bdd565b610d3681614be5565b614a60614328565b614371614ccd565b614a70614328565b5f80516020615bfa83398151915261ffff84161580614a94575061271061ffff8516115b15614ab857604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614adc5760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614aef5750600a60ff8416115b15614b125760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611cb683835f614cd5565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613d80565b614371614328565b614bed614328565b80355f80516020615c1a8339815191529081556014614c126060840160408501615a07565b60ff161180614c315750614c2c6060830160408401615a07565b60ff16155b15614c6557614c466060830160408401615a07565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614c756060830160408401615a07565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614ca66040830160208401615032565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612aa4614328565b606081471015614cfa5760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614d15919061549d565b5f6040518083038185875af1925050503d805f8114614d4f576040519150601f19603f3d011682016040523d82523d5f602084013e614d54565b606091505b5091509150614d64868383614d6e565b9695505050505050565b606082614d8357614d7e82614dca565b611cb6565b8151158015614d9a57506001600160a01b0384163b155b15614dc357604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611cb6565b805115614dda5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614dff9061521d565b5f825580601f10614e0e575050565b601f0160209004905f5260205f2090810190610d369190614e67565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614e7b575f8155600101614e68565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114614e9f575f80fd5b919050565b5f805f60608486031215614eb6575f80fd5b833592506020840135614ec881614e7f565b9150614ed660408501614e8c565b90509250925092565b5f60208284031215614eef575f80fd5b5035919050565b5f8060408385031215614f07575f80fd5b82356001600160401b03811115614f1c575f80fd5b830160808186031215614f2d575f80fd5b9150614f3b60208401614e8c565b90509250929050565b5f8060408385031215614f55575f80fd5b82359150614f3b60208401614e8c565b5f60208284031215614f75575f80fd5b611cb682614e8c565b803561ffff81168114614e9f575f80fd5b80356001600160401b0381168114614e9f575f80fd5b5f805f8060808587031215614fb8575f80fd5b84356001600160401b03811115614fcd575f80fd5b850160a08188031215614fde575f80fd5b9350614fec60208601614f7e565b9250614ffa60408601614f8f565b9396929550929360600135925050565b5f806040838503121561501b575f80fd5b61502483614e8c565b946020939093013593505050565b5f60208284031215615042575f80fd5b611cb682614f8f565b5f806040838503121561505c575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061508f5761508f61506b565b9052565b5f5b838110156150ad578181015183820152602001615095565b50505f910152565b5f81518084526150cc816020860160208601615093565b601f01601f19169290920160200192915050565b602081526150f260208201835161507f565b5f602083015160e0604084015261510d6101008401826150b5565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f80828403610140811215615187575f80fd5b61012080821215615196575f80fd5b84935083013590506151a781615160565b809150509250929050565b5f80602083850312156151c3575f80fd5b82356001600160401b03808211156151d9575f80fd5b818501915085601f8301126151ec575f80fd5b8135818111156151fa575f80fd5b86602082850101111561520b575f80fd5b60209290920196919550909350505050565b600181811c9082168061523157607f821691505b60208210810361524f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c66828461507f565b602081525f611cb660208301846150b5565b5f60208284031215615285575f80fd5b5051919050565b5f6020828403121561529c575f80fd5b8135611cb681615160565b5f808335601e198436030181126152bc575f80fd5b8301803591506001600160401b038211156152d5575f80fd5b6020019150600581901b36038213156136cb575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615314575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156153545761535461531e565b60405290565b604080519081016001600160401b03811182821017156153545761535461531e565b604051601f8201601f191681016001600160401b03811182821017156153a4576153a461531e565b604052919050565b5f6001600160401b038211156153c4576153c461531e565b50601f01601f191660200190565b5f82601f8301126153e1575f80fd5b81356153f46153ef826153ac565b61537c565b818152846020838601011115615408575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615434575f80fd5b61543c615332565b82356001600160401b0380821115615452575f80fd5b61545e368387016153d2565b83526020850135915080821115615473575f80fd5b50615480368286016153d2565b60208301525061549260408401614f8f565b604082015292915050565b5f8251615314818460208701615093565b601f8211156104d857805f5260205f20601f840160051c810160208510156154d35750805b601f840160051c820191505b8181101561166b575f81556001016154df565b81516001600160401b0381111561550b5761550b61531e565b61551f81615519845461521d565b846154ae565b602080601f831160018114615552575f841561553b5750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b8281101561558057888601518255948401946001909101908401615561565b508582101561559d57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c666155ad565b5f63ffffffff8083168181036155ec576155ec6155ad565b6001019392505050565b5f8261561057634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106156295761562961506b565b91905290565b8082028115828204841417610c6657610c666155ad565b5f60208083525f84546156588161521d565b806020870152604060018084165f81146156795760018114615695576156c2565b60ff19851660408a0152604084151560051b8a010195506156c2565b895f5260205f205f5b858110156156b95781548b820186015290830190880161569e565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611e1b57611e1b6155ad565b8051614e9f81614e7f565b5f806040838503121561571b575f80fd5b82516001600160401b0380821115615731575f80fd5b9084019060608287031215615744575f80fd5b61574c615332565b8251815260208084015161575f81615160565b82820152604084015183811115615774575f80fd5b80850194505087601f850112615788575f80fd5b835192506157986153ef846153ac565b83815288828587010111156157ab575f80fd5b6157ba84838301848801615093565b806040840152508195506157cf8188016156ff565b9450505050509250929050565b81810381811115610c6657610c666155ad565b5f808335601e19843603018112615804575f80fd5b8301803591506001600160401b0382111561581d575f80fd5b6020019150368190038213156136cb575f80fd5b5f8851615842818460208d01615093565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611e1b57611e1b6155ad565b6001600160401b038181168382160280821691908281146158dd576158dd6155ad565b505092915050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f8235603e19833603018112615314575f80fd5b5f60408236031215615937575f80fd5b61593f61535a565b61594883614e8c565b81526020808401356001600160401b0380821115615964575f80fd5b9085019036601f830112615976575f80fd5b8135818111156159885761598861531e565b8060051b915061599984830161537c565b81815291830184019184810190368411156159b2575f80fd5b938501935b838510156159dc57843592506159cc83615160565b82825293850193908501906159b7565b94860194909452509295945050505050565b5f602082840312156159fe575f80fd5b611cb682614f7e565b5f60208284031215615a17575f80fd5b813560ff81168114611cb6575f80fd5b5f6001600160401b038083168181036155ec576155ec6155ad565b5f60208284031215615a52575f80fd5b8151611cb681614e7f565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615aa381602a850160208b01615093565b865190830190615aba81602a840160208b01615093565b60c087901b6001600160c01b031916602a9290910191820152615aec603282018660e01b6001600160e01b0319169052565b615b05603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615b28818460208801615093565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615b5e818460208901615093565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b99818460208801615093565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // ERC20TokenStakingManagerABI is the input ABI used to generate the binding from. @@ -596,7 +604,7 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) WARPMESS // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { var out []interface{} err := _ERC20TokenStakingManager.contract.Call(opts, &out, "getValidator", validationID) @@ -613,14 +621,14 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) GetValidator(op // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) GetValidator(validationID [32]byte) (Validator, error) { return _ERC20TokenStakingManager.Contract.GetValidator(&_ERC20TokenStakingManager.CallOpts, validationID) } // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { return _ERC20TokenStakingManager.Contract.GetValidator(&_ERC20TokenStakingManager.CallOpts, validationID) } @@ -656,10 +664,10 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) GetWeigh return _ERC20TokenStakingManager.Contract.GetWeight(&_ERC20TokenStakingManager.CallOpts, validationID) } -// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// RegisteredValidators is a free data retrieval call binding the contract method 0xfd7ac5e7. // -// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) RegisteredValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { +// Solidity: function registeredValidators(bytes nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) RegisteredValidators(opts *bind.CallOpts, nodeID []byte) ([32]byte, error) { var out []interface{} err := _ERC20TokenStakingManager.contract.Call(opts, &out, "registeredValidators", nodeID) @@ -673,17 +681,17 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCaller) RegisteredValid } -// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// RegisteredValidators is a free data retrieval call binding the contract method 0xfd7ac5e7. // -// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) RegisteredValidators(nodeID [32]byte) ([32]byte, error) { +// Solidity: function registeredValidators(bytes nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) RegisteredValidators(nodeID []byte) ([32]byte, error) { return _ERC20TokenStakingManager.Contract.RegisteredValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) } -// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// RegisteredValidators is a free data retrieval call binding the contract method 0xfd7ac5e7. // -// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) RegisteredValidators(nodeID [32]byte) ([32]byte, error) { +// Solidity: function registeredValidators(bytes nodeID) view returns(bytes32) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerCallerSession) RegisteredValidators(nodeID []byte) ([32]byte, error) { return _ERC20TokenStakingManager.Contract.RegisteredValidators(&_ERC20TokenStakingManager.CallOpts, nodeID) } @@ -980,44 +988,44 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) Init return _ERC20TokenStakingManager.Contract.InitializeEndValidation(&_ERC20TokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x4bee0040. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) +// Solidity: function initializeValidatorRegistration((bytes,bytes,uint64,(uint32,address[]),(uint32,address[])) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x4bee0040. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) +// Solidity: function initializeValidatorRegistration((bytes,bytes,uint64,(uint32,address[]),(uint32,address[])) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xeb0acb89. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x4bee0040. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) +// Solidity: function initializeValidatorRegistration((bytes,bytes,uint64,(uint32,address[]),(uint32,address[])) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration, uint256 stakeAmount) returns(bytes32 validationID) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64, stakeAmount *big.Int) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.InitializeValidatorRegistration(&_ERC20TokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration, stakeAmount) } -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. // -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) subnetConversionData, uint32 messageIndex) returns() func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { return _ERC20TokenStakingManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) } -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. // -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) subnetConversionData, uint32 messageIndex) returns() func (_ERC20TokenStakingManager *ERC20TokenStakingManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.InitializeValidatorSet(&_ERC20TokenStakingManager.TransactOpts, subnetConversionData, messageIndex) } -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. // -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) subnetConversionData, uint32 messageIndex) returns() func (_ERC20TokenStakingManager *ERC20TokenStakingManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { return _ERC20TokenStakingManager.Contract.InitializeValidatorSet(&_ERC20TokenStakingManager.TransactOpts, subnetConversionData, messageIndex) } @@ -1804,15 +1812,15 @@ func (it *ERC20TokenStakingManagerInitialValidatorCreatedIterator) Close() error // ERC20TokenStakingManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerInitialValidatorCreated struct { ValidationID [32]byte - NodeID [32]byte + NodeID common.Hash Weight *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*ERC20TokenStakingManagerInitialValidatorCreatedIterator, error) { +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte) (*ERC20TokenStakingManagerInitialValidatorCreatedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1830,10 +1838,10 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterInitial return &ERC20TokenStakingManagerInitialValidatorCreatedIterator{contract: _ERC20TokenStakingManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil } -// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1876,9 +1884,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchInitialV }), nil } -// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*ERC20TokenStakingManagerInitialValidatorCreated, error) { event := new(ERC20TokenStakingManagerInitialValidatorCreated) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { @@ -2237,17 +2245,17 @@ func (it *ERC20TokenStakingManagerValidationPeriodCreatedIterator) Close() error // ERC20TokenStakingManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the ERC20TokenStakingManager contract. type ERC20TokenStakingManagerValidationPeriodCreated struct { ValidationID [32]byte - NodeID [32]byte + NodeID common.Hash RegisterValidationMessageID [32]byte Weight *big.Int RegistrationExpiry uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodCreatedIterator, error) { +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (*ERC20TokenStakingManagerValidationPeriodCreatedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -2269,10 +2277,10 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) FilterValidat return &ERC20TokenStakingManagerValidationPeriodCreatedIterator{contract: _ERC20TokenStakingManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil } -// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *ERC20TokenStakingManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -2319,9 +2327,9 @@ func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) WatchValidati }), nil } -// ParseValidationPeriodCreated is a log parse operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) func (_ERC20TokenStakingManager *ERC20TokenStakingManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*ERC20TokenStakingManagerValidationPeriodCreated, error) { event := new(ERC20TokenStakingManagerValidationPeriodCreated) if err := _ERC20TokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { diff --git a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go index fb6167c3d..17aff4e96 100644 --- a/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go +++ b/abi-bindings/go/validator-manager/NativeTokenStakingManager/NativeTokenStakingManager.go @@ -31,9 +31,15 @@ var ( // InitialValidator is an auto generated low-level Go binding around an user-defined struct. type InitialValidator struct { - NodeID [32]byte - Weight uint64 + NodeID []byte BlsPublicKey []byte + Weight uint64 +} + +// PChainOwner is an auto generated low-level Go binding around an user-defined struct. +type PChainOwner struct { + Threshold uint32 + Addresses []common.Address } // PoSValidatorManagerSettings is an auto generated low-level Go binding around an user-defined struct. @@ -49,7 +55,7 @@ type PoSValidatorManagerSettings struct { // SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. type SubnetConversionData struct { - ConvertSubnetTxID [32]byte + SubnetID [32]byte ValidatorManagerBlockchainID [32]byte ValidatorManagerAddress common.Address InitialValidators []InitialValidator @@ -58,7 +64,7 @@ type SubnetConversionData struct { // Validator is an auto generated low-level Go binding around an user-defined struct. type Validator struct { Status uint8 - NodeID [32]byte + NodeID []byte StartingWeight uint64 MessageNonce uint64 Weight uint64 @@ -75,15 +81,17 @@ type ValidatorManagerSettings struct { // ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. type ValidatorRegistrationInput struct { - NodeID [32]byte - RegistrationExpiry uint64 - BlsPublicKey []byte + NodeID []byte + BlsPublicKey []byte + RegistrationExpiry uint64 + RemainingBalanceOwner PChainOwner + DisableOwner PChainOwner } // 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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"name\":\"messageIndex\",\"type\":\"uint32\",\"internalType\":\"uint32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"registeredValidators\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"InvalidCodecID\",\"inputs\":[]},{\"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\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidMinStakeDuration\",\"inputs\":[{\"name\":\"minStakeDuration\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"InvalidNonce\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint64\",\"internalType\":\"uint64\"}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"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: "0x608060405234801561000f575f80fd5b506040516151cc3803806151cc83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b61507f8061014d5f395ff3fe6080604052600436106101e6575f3560e01c806366435abf11610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063e7d14c1c146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806393e24598116100d857806393e245981461048d57806398f3e2b4146104ac578063a3a65e48146104cb578063afb98096146104ea575f80fd5b806366435abf14610428578063732214f81461044757806376f786211461045a5780638280a25a14610479575f80fd5b806335455ded1161017e5780635297fae61161014e5780635297fae6146103a257806360305d62146103c157806361e2f490146103ea5780636206585614610409575f80fd5b806335455ded1461031b5780633a1cfff61461034357806340034a9314610362578063467ef06f14610383575f80fd5b806320e55565116101b957806320e555651461027457806325e1c776146102935780632e2194d8146102b2578063329c3e12146102e9575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b5061020961020436600461463b565b610635565b005b348015610216575f80fd5b50610209610225366004614676565b61066a565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f36600461463b565b6107f1565b34801561027f575f80fd5b5061020961028e36600461468d565b6107fc565b34801561029e575f80fd5b506102096102ad3660046146a4565b6108d9565b3480156102bd575f80fd5b506102d16102cc366004614676565b61094d565b6040516001600160401b03909116815260200161024c565b3480156102f4575f80fd5b506103036001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610326575f80fd5b5061033061271081565b60405161ffff909116815260200161024c565b34801561034e575f80fd5b5061020961035d36600461463b565b610963565b6103756103703660046146f5565b61096e565b60405190815260200161024c565b34801561038e575f80fd5b5061020961039d366004614749565b6109a2565b3480156103ad575f80fd5b506102096103bc366004614762565b610a64565b3480156103cc575f80fd5b506103d5601481565b60405163ffffffff909116815260200161024c565b3480156103f5575f80fd5b5061020961040436600461478a565b610ccf565b348015610414575f80fd5b506103756104233660046147cf565b611182565b348015610433575f80fd5b506102d1610442366004614676565b61119b565b348015610452575f80fd5b506103755f81565b348015610465575f80fd5b5061020961047436600461463b565b6111af565b348015610484575f80fd5b5061023e603081565b348015610498575f80fd5b506102096104a7366004614676565b6111da565b3480156104b7575f80fd5b506102096104c6366004614762565b6112a5565b3480156104d6575f80fd5b506102096104e5366004614749565b61147d565b3480156104f5575f80fd5b506103755f80516020614ff383398151915281565b348015610515575f80fd5b506103036005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614676565b611606565b34801561054e575f80fd5b506103755f8051602061501383398151915281565b34801561056e575f80fd5b5061020961057d366004614676565b6117ef565b610375610590366004614676565b61192c565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614676565b61195d565b60405161024c9190614810565b3480156105e0575f80fd5b506102d16202a30081565b3480156105f6575f80fd5b50610375610605366004614676565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b610640838383611a25565b61066557604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206150538339815191526020526040808220815160e0810190925280545f8051602061501383398151915293929190829060ff1660058111156106b7576106b76147e8565b60058111156106c8576106c86147e8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c09091015290915081516005811115610737576107376147e8565b1461076a575f8381526007830160205260409081902054905163170cc93360e21b815261065c9160ff1690600401614879565b6005600160991b016001600160a01b031663ee5b48eb61078f8584606001515f611ca3565b6040518263ffffffff1660e01b81526004016107ab91906148a9565b6020604051808303815f875af11580156107c7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107eb91906148db565b50505050565b6107eb838383611a25565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610845575080546001600160401b03808416911610155b156108635760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b17815561088d83611cf2565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b6108e282611d03565b610902576040516330efa98b60e01b81526004810183905260240161065c565b5f61090c8361195d565b5190506002816005811115610923576109236147e8565b14610943578060405163170cc93360e21b815260040161065c9190614879565b6107eb8383611d3e565b5f61095d64e8d4a5100083614906565b92915050565b6107eb838383611fb8565b5f6109776121b1565b610983848484346121e8565b905061099b60015f8051602061503383398151915255565b9392505050565b6109aa6121b1565b5f80516020614ff38339815191525f806109c3846123c9565b915091506109d082611d03565b6109dc57505050610a4b565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610a0b57610a0b6147e8565b03610a30575f83815260078501602052604081208054919055610a2e8282612660565b505b610a4681610a418460400151611182565b6126be565b505050505b610a6160015f8051602061503383398151915255565b50565b5f8181525f80516020614fd38339815191526020526040808220815160e0810190925280545f80516020614ff383398151915293929190829060ff166003811115610ab157610ab16147e8565b6003811115610ac257610ac26147e8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610b388261195d565b9050600183516003811115610b4f57610b4f6147e8565b14610b70578251604051633b0d540d60e21b815261065c9190600401614925565b600481516005811115610b8557610b856147e8565b03610b9b57610b93856126d1565b505050505050565b5f80610bb2610ba9896128b8565b604001516129ce565b5091509150818414610bdf57846040015160405163089938b360e11b815260040161065c91815260200190565b806001600160401b031683606001516001600160401b03161080610c185750806001600160401b03168560a001516001600160401b0316115b15610c4157604051632e19bc2d60e11b81526001600160401b038216600482015260240161065c565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206150138339815191529060ff1615610d2157604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d64573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d8891906148db565b836020013514610db1576040516372b0a7e760e11b81526020840135600482015260240161065c565b30610dc26060850160408601614953565b6001600160a01b031614610e0557610de06060840160408501614953565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161065c565b5f610e13606085018561496e565b905090505f805b828163ffffffff1610156110c2575f610e36606088018861496e565b8363ffffffff16818110610e4c57610e4c6149b3565b9050602002810190610e5e91906149c7565b610e6790614a77565b80515f8181526008880160205260409020549192509015610e9e57604051631ec583cb60e11b81526004810182905260240161065c565b5f6002895f013585604051602001610ecd92919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610ee791614b0e565b602060405180830381855afa158015610f02573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610f2591906148db565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff19166001836005811115610fb157610fb16147e8565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155840151611064911686614b1f565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806110bb90614b32565b9050610e1a565b50600483018190555f6110e06110d7866128b8565b60400151612c0c565b90505f6110ec87612d81565b90505f6002826040516110ff9190614b0e565b602060405180830381855afa15801561111a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061113d91906148db565b905082811461116957604051631872fc8d60e01b8152600481018290526024810184905260440161065c565b5050506009909201805460ff1916600117905550505050565b5f61095d6001600160401b03831664e8d4a51000614b54565b5f6111a58261195d565b6080015192915050565b6111ba838383611fb8565b61066557604051635bff683f60e11b81526004810184905260240161065c565b5f80516020614ff38339815191525f6111f28361195d565b5190506004816005811115611209576112096147e8565b14611229578060405163170cc93360e21b815260040161065c9190614879565b5f8381526004830160205260409020546001600160a01b0316331461126f57335b604051636e2ccd7560e11b81526001600160a01b03909116600482015260240161065c565b5f838152600783016020908152604080832080549084905560048601909252909120546107eb906001600160a01b031682612660565b6112ad6121b1565b5f8181525f80516020614fd38339815191526020526040808220815160e0810190925280545f80516020614ff383398151915293929190829060ff1660038111156112fa576112fa6147e8565b600381111561130b5761130b6147e8565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529050600381516003811115611384576113846147e8565b146113a5578051604051633b0d540d60e21b815261065c9190600401614925565b60046113b4826040015161195d565b5160058111156113c6576113c66147e8565b14611458575f6113d5856128b8565b90505f806113e683604001516129ce565b5091509150818460400151146114125760405163089938b360e11b81526004810183905260240161065c565b806001600160401b03168460c001516001600160401b0316111561145457604051632e19bc2d60e11b81526001600160401b038216600482015260240161065c565b5050505b611461836126d1565b505061147960015f8051602061503383398151915255565b5050565b5f805160206150138339815191525f806114a2611499856128b8565b60400151612f07565b91509150806114c857604051632d07135360e01b8152811515600482015260240161065c565b5f828152600684016020526040902080546114e290614b6b565b90505f036115065760405163089938b360e11b81526004810183905260240161065c565b60015f83815260078501602052604090205460ff16600581111561152c5761152c6147e8565b1461155f575f8281526007840160205260409081902054905163170cc93360e21b815261065c9160ff1690600401614879565b5f828152600684016020526040812061157791614590565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020614fd38339815191526020526040808220815160e0810190925280545f80516020614ff383398151915293929190829060ff166003811115611653576116536147e8565b6003811115611664576116646147e8565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156116dd576116dd6147e8565b141580156116fe57506003815160038111156116fb576116fb6147e8565b14155b1561171f578051604051633b0d540d60e21b815261065c9190600401614925565b5f61172d826040015161195d565b905080606001516001600160401b03165f0361175f576040516339b894f960e21b81526004810185905260240161065c565b6005600160991b016001600160a01b031663ee5b48eb61178c846040015184606001518560800151611ca3565b6040518263ffffffff1660e01b81526004016117a891906148a9565b6020604051808303815f875af11580156117c4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117e891906148db565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615013833981519152919061183690614b6b565b90505f0361185a5760405163089938b360e11b81526004810183905260240161065c565b60015f83815260078301602052604090205460ff166005811115611880576118806147e8565b146118b3575f8281526007820160205260409081902054905163170cc93360e21b815261065c9160ff1690600401614879565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916118ec9190600401614b9d565b6020604051808303815f875af1158015611908573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061066591906148db565b5f6119356121b1565b6119408233346130ab565b905061195860015f8051602061503383398151915255565b919050565b6119656145c7565b5f8281525f80516020615053833981519152602052604090819020815160e0810190925280545f80516020615013833981519152929190829060ff1660058111156119b2576119b26147e8565b60058111156119c3576119c36147e8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b5f8381525f80516020614fd38339815191526020526040808220815160e0810190925280545f80516020614ff38339815191529284929091829060ff166003811115611a7357611a736147e8565b6003811115611a8457611a846147e8565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611afa8261195d565b9050600283516003811115611b1157611b116147e8565b14611b32578251604051633b0d540d60e21b815261065c9190600401614925565b60208301516001600160a01b03163314611b4c573361124a565b600281516005811115611b6157611b616147e8565b03611c3e578615611b7857611b768287611d3e565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611bb1918491611bac9190614c27565b613380565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611bf2846134d7565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a31515945061099b9350505050565b600481516005811115611c5357611c536147e8565b03611c8757611c61836134d7565b5f898152600686016020526040902055611c7a886126d1565b600194505050505061099b565b805160405163170cc93360e21b815261065c9190600401614879565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b611cfa613683565b610a61816136ce565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015611d89573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611db09190810190614c52565b9150915080611dd257604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3991906148db565b825114611e5f578151604051636ba589a560e01b8152600481019190915260240161065c565b60208201516001600160a01b031615611e9b576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161065c565b5f80611eaa846040015161373c565b91509150818714611ed15760405163089938b360e11b81526004810188905260240161065c565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020614ff3833981519152906001600160401b039081169083161115611f8e575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2611fad565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020614ff383398151915281611fd186613917565b9050611fdc86611d03565b611feb5760019250505061099b565b5f8681526004830160205260409020546001600160a01b03163314612010573361124a565b5f86815260048301602052604090205460a082015161203f91600160b01b90046001600160401b031690614d24565b6001600160401b03168160c001516001600160401b031610156120865760c081015160405163fb6ce63f60e01b81526001600160401b03909116600482015260240161065c565b5f851561209e576120978786611d3e565b90506120bc565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906120e190611182565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015612157573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061217b91906148db565b905080846007015f8a81526020019081526020015f205f82825461219f9190614b1f565b90915550501515979650505050505050565b5f805160206150338339815191528054600119016121e257604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020614ff383398151915290600160401b900461ffff908116908616108061223c575061271061ffff8616115b1561226057604051635f12e6c360e11b815261ffff8616600482015260240161065c565b60028101546001600160401b03908116908516101561229c576040516202a06d60e11b81526001600160401b038516600482015260240161065c565b80548310806122ae5750806001015483115b156122cf5760405163222d164360e21b81526004810184905260240161065c565b825f6122da8261094d565b90505f6122e78983613b69565b905060405180608001604052806122fb3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b60015f8051602061503383398151915255565b5f6123d26145c7565b5f805160206150138339815191525f806123ee611499876128b8565b91509150801561241557604051632d07135360e01b8152811515600482015260240161065c565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115612446576124466147e8565b6005811115612457576124576147e8565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c090910152909150815160058111156124c6576124c66147e8565b141580156124e757506001815160058111156124e4576124e46147e8565b14155b1561250857805160405163170cc93360e21b815261065c9190600401614879565b60038151600581111561251d5761251d6147e8565b0361252b5760048152612530565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff19166001836005811115612575576125756147e8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612629576126296147e8565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b1580156126ac575f80fd5b505af1158015610b93573d5f803e3d5ffd5b6114796001600160a01b03831682613f9b565b5f8181525f80516020614fd38339815191526020526040808220815160e0810190925280545f80516020614ff383398151915293929190829060ff16600381111561271e5761271e6147e8565b600381111561272f5761272f6147e8565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b0319168155928301819055919094018190556006870190915290812080549082905592935090919080821561285d575f8481526004870160205260409020546127109061280f90600160a01b900461ffff1685614b54565b6128199190614906565b915081866007015f8681526020019081526020015f205f82825461283d9190614b1f565b9091555061284d90508284614d44565b905061285d856020015182612660565b6128728560200151610a418760600151611182565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa15801561291c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526129439190810190614c52565b915091508061296557604051636b2f19e960e01b815260040160405180910390fd5b81511561298b578151604051636ba589a560e01b8152600481019190915260240161065c565b60208201516001600160a01b0316156129c7576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161065c565b5092915050565b5f805f83516036146129f357604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612a4257612a0a816001614d44565b612a15906008614b54565b61ffff16868281518110612a2b57612a2b6149b3565b016020015160f81c901b91909117906001016129f6565b5061ffff811615612a665760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612ac157612a7d816003614d44565b612a88906008614b54565b63ffffffff1687612a9a836002614b1f565b81518110612aaa57612aaa6149b3565b016020015160f81c901b9190911790600101612a69565b5063ffffffff8116600414612ae957604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612b3e57612b0081601f614d44565b612b0b906008614b54565b88612b17836006614b1f565b81518110612b2757612b276149b3565b016020015160f81c901b9190911790600101612aec565b505f805b6008811015612b9d57612b56816007614d44565b612b61906008614b54565b6001600160401b031689612b76836026614b1f565b81518110612b8657612b866149b3565b016020015160f81c901b9190911790600101612b42565b505f805b6008811015612bfc57612bb5816007614d44565b612bc0906008614b54565b6001600160401b03168a612bd583602e614b1f565b81518110612be557612be56149b3565b016020015160f81c901b9190911790600101612ba1565b5091989097509095509350505050565b5f8151602614612c2f57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612c7e57612c46816001614d44565b612c51906008614b54565b61ffff16848281518110612c6757612c676149b3565b016020015160f81c901b9190911790600101612c32565b5061ffff811615612ca25760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612cfd57612cb9816003614d44565b612cc4906008614b54565b63ffffffff1685612cd6836002614b1f565b81518110612ce657612ce66149b3565b016020015160f81c901b9190911790600101612ca5565b5063ffffffff811615612d2357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612d7857612d3a81601f614d44565b612d45906008614b54565b86612d51836006614b1f565b81518110612d6157612d616149b3565b016020015160f81c901b9190911790600101612d26565b50949350505050565b60605f823560208401356014612d9c86860160408801614953565b612da9606088018861496e565b604051612e02969594939250602001948552602085019390935260e091821b6001600160e01b0319908116604086015260609190911b6bffffffffffffffffffffffff1916604485015291901b166058820152605c0190565b60405160208183030381529060405290505f5b612e22606085018561496e565b90508110156129c75781612e39606086018661496e565b83818110612e4957612e496149b3565b9050602002810190612e5b91906149c7565b35612e69606087018761496e565b84818110612e7957612e796149b3565b9050602002810190612e8b91906149c7565b612e9c9060408101906020016147cf565b612ea9606088018861496e565b85818110612eb957612eb96149b3565b9050602002810190612ecb91906149c7565b612ed9906040810190614d57565b604051602001612eed959493929190614d99565b60408051601f198184030181529190529150600101612e15565b5f808251602714612f2b57604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015612f7a57612f42816001614d44565b612f4d906008614b54565b61ffff16858281518110612f6357612f636149b3565b016020015160f81c901b9190911790600101612f2e565b5061ffff811615612f9e5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015612ff957612fb5816003614d44565b612fc0906008614b54565b63ffffffff1686612fd2836002614b1f565b81518110612fe257612fe26149b3565b016020015160f81c901b9190911790600101612fa1565b5063ffffffff811660031461302157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156130765761303881601f614d44565b613043906008614b54565b8761304f836006614b1f565b8151811061305f5761305f6149b3565b016020015160f81c901b9190911790600101613024565b505f8660268151811061308b5761308b6149b3565b016020015191976001600160f81b03199092161515965090945050505050565b5f5f80516020614ff3833981519152816130c48461094d565b90505f6130d08761195d565b90506130db87611d03565b6130fb576040516330efa98b60e01b81526004810188905260240161065c565b600281516005811115613110576131106147e8565b1461313157805160405163170cc93360e21b815261065c9190600401614879565b5f8282608001516131429190614d24565b905083600201600a9054906101000a90046001600160401b0316826040015161316b9190614dde565b6001600160401b0316816001600160401b031611156131a857604051636d51fe0560e11b81526001600160401b038216600482015260240161065c565b5f806131b48a84613380565b915091505f8a836040516020016131e292919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff19166001836003811115613275576132756147e8565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615053833981519152602052604081206002015481905f8051602061501383398151915290600160801b90046001600160401b03166133c8858261402e565b5f6133d287614208565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6134228a858b611ca3565b6040518263ffffffff1660e01b815260040161343e91906148a9565b6020604051808303815f875af115801561345a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061347e91906148db565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020614ff383398151915290505f6134f7846040015161195d565b90505f60038251600581111561350f5761350f6147e8565b148061352d575060048251600581111561352b5761352b6147e8565b145b1561353d575060c081015161357a565b600282516005811115613552576135526147e8565b0361355e57504261357a565b815160405163170cc93360e21b815261065c9190600401614879565b84608001516001600160401b0316816001600160401b0316116135a157505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906135c690611182565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613656573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061367a91906148db565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166136cc57604051631afcd79f60e31b815260040160405180910390fd5b565b6136d6613683565b6136df8161427d565b6136e7614296565b610a616060820135608083013561370460c0850160a086016147cf565b61371460e0860160c08701614e09565b613725610100870160e08801614e22565b61373761012088016101008901614953565b6142a6565b5f808251602e1461376057604051638d0242c960e01b815260040160405180910390fd5b5f805b60028110156137af57613777816001614d44565b613782906008614b54565b61ffff16858281518110613798576137986149b3565b016020015160f81c901b9190911790600101613763565b5061ffff8116156137d35760405163059510e360e31b815260040160405180910390fd5b5f805b600481101561382e576137ea816003614d44565b6137f5906008614b54565b63ffffffff1686613807836002614b1f565b81518110613817576138176149b3565b016020015160f81c901b91909117906001016137d6565b5063ffffffff811660051461385657604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156138ab5761386d81601f614d44565b613878906008614b54565b87613884836006614b1f565b81518110613894576138946149b3565b016020015160f81c901b9190911790600101613859565b505f805b600881101561390a576138c3816007614d44565b6138ce906008614b54565b6001600160401b0316886138e3836026614b1f565b815181106138f3576138f36149b3565b016020015160f81c901b91909117906001016138af565b5090969095509350505050565b61391f6145c7565b5f8281525f805160206150538339815191526020526040808220815160e0810190925280545f8051602061501383398151915293929190829060ff16600581111561396c5761396c6147e8565b600581111561397d5761397d6147e8565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c090910152909150815160058111156139ef576139ef6147e8565b14613a22575f8481526007830160205260409081902054905163170cc93360e21b815261065c9160ff1690600401614879565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613a6657613a666147e8565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613b128582613380565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613bad57604051637fab81e560e01b815260040160405180910390fd5b5f8051602061501383398151915242613bcc60408601602087016147cf565b6001600160401b0316111580613c065750613bea6202a30042614b1f565b613bfa60408601602087016147cf565b6001600160401b031610155b15613c4057613c1b60408501602086016147cf565b604051635879da1360e11b81526001600160401b03909116600482015260240161065c565b6030613c4f6040860186614d57565b905014613c8157613c636040850185614d57565b6040516326475b2f60e11b815261065c925060040190815260200190565b8335613ca35760405163099e922360e21b81528435600482015260240161065c565b83355f90815260088201602052604090205415613cd657604051631ec583cb60e11b81528435600482015260240161065c565b613ce0835f61402e565b5f80613d796040518060a00160405280855f01548152602001885f01358152602001876001600160401b03168152602001886020016020810190613d2491906147cf565b6001600160401b03168152602001613d3f60408a018a614d57565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509152506143d5565b5f82815260068601602052604090209193509150613d978282614e86565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb90613dd59085906004016148a9565b6020604051808303815f875af1158015613df1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e1591906148db565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff19166001836005811115613e8d57613e8d6147e8565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91613f6d918e01908e016147cf565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b80471015613fbe5760405163cd78605960e01b815230600482015260240161065c565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114614007576040519150601f19603f3d011682016040523d82523d5f602084013e61400c565b606091505b505090508061066557604051630a12f52160e11b815260040160405180910390fd5b5f805160206150138339815191525f6001600160401b0380841690851611156140625761405b8385614c27565b905061406f565b61406c8484614c27565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806140d15750600184015481516140cd916001600160401b031690614b1f565b8210155b156140f7576001600160401b038316606082015281815260408101516020820152614116565b82816060018181516141099190614d24565b6001600160401b03169052505b6060810151614126906064614dde565b602082015160018601546001600160401b0392909216916141519190600160401b900460ff16614b54565b101561418157606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161065c565b856001600160401b03168160400181815161419c9190614b1f565b9052506040810180516001600160401b03871691906141bc908390614d44565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206150538339815191526020526040812060020180545f80516020615013833981519152919060089061425290600160401b90046001600160401b0316614f41565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b614285613683565b61428d614498565b610a61816144a0565b61429e613683565b6136cc614588565b6142ae613683565b5f80516020614ff383398151915261ffff841615806142d2575061271061ffff8516115b156142f657604051635f12e6c360e11b815261ffff8516600482015260240161065c565b8587111561431a5760405163222d164360e21b81526004810188905260240161065c565b60ff8316158061432d5750600a60ff8416115b156143505760405163170db35960e31b815260ff8416600482015260240161065c565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260800151516030146143fe57604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016144309796959493929190614f5c565b60405160208183030381529060405290506002816040516144519190614b0e565b602060405180830381855afa15801561446c573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061448f91906148db565b94909350915050565b6136cc613683565b6144a8613683565b80355f8051602061501383398151915290815560146144cd6060840160408501614e22565b60ff1611806144ec57506144e76060830160408401614e22565b60ff16155b15614520576145016060830160408401614e22565b604051634a59bbff60e11b815260ff909116600482015260240161065c565b6145306060830160408401614e22565b60018201805460ff92909216600160401b0260ff60401b1990921691909117905561456160408301602084016147cf565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b6123b6613683565b50805461459c90614b6b565b5f825580601f106145ab575050565b601f0160209004905f5260205f2090810190610a619190614603565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b80821115614617575f8155600101614604565b5090565b8015158114610a61575f80fd5b803563ffffffff81168114611958575f80fd5b5f805f6060848603121561464d575f80fd5b83359250602084013561465f8161461b565b915061466d60408501614628565b90509250925092565b5f60208284031215614686575f80fd5b5035919050565b5f610120828403121561469e575f80fd5b50919050565b5f80604083850312156146b5575f80fd5b823591506146c560208401614628565b90509250929050565b803561ffff81168114611958575f80fd5b80356001600160401b0381168114611958575f80fd5b5f805f60608486031215614707575f80fd5b83356001600160401b0381111561471c575f80fd5b84016060818703121561472d575f80fd5b925061473b602085016146ce565b915061466d604085016146df565b5f60208284031215614759575f80fd5b61099b82614628565b5f8060408385031215614773575f80fd5b61477c83614628565b946020939093013593505050565b5f806040838503121561479b575f80fd5b82356001600160401b038111156147b0575f80fd5b8301608081860312156147c1575f80fd5b91506146c560208401614628565b5f602082840312156147df575f80fd5b61099b826146df565b634e487b7160e01b5f52602160045260245ffd5b6006811061480c5761480c6147e8565b9052565b5f60e0820190506148228284516147fc565b6020830151602083015260408301516001600160401b0380821660408501528060608601511660608501528060808601511660808501528060a08601511660a08501528060c08601511660c0850152505092915050565b6020810161095d82846147fc565b5f5b838110156148a1578181015183820152602001614889565b50505f910152565b602081525f82518060208401526148c7816040850160208701614887565b601f01601f19169190910160400192915050565b5f602082840312156148eb575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f8261492057634e487b7160e01b5f52601260045260245ffd5b500490565b6020810160048310614939576149396147e8565b91905290565b6001600160a01b0381168114610a61575f80fd5b5f60208284031215614963575f80fd5b813561099b8161493f565b5f808335601e19843603018112614983575f80fd5b8301803591506001600160401b0382111561499c575f80fd5b6020019150600581901b36038213156134d0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126149db575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715614a1b57614a1b6149e5565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614a4957614a496149e5565b604052919050565b5f6001600160401b03821115614a6957614a696149e5565b50601f01601f191660200190565b5f60608236031215614a87575f80fd5b614a8f6149f9565b823581526020614aa08185016146df565b8183015260408401356001600160401b03811115614abc575f80fd5b840136601f820112614acc575f80fd5b8035614adf614ada82614a51565b614a21565b8181523684838501011115614af2575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f82516149db818460208701614887565b8082018082111561095d5761095d6148f2565b5f63ffffffff808316818103614b4a57614b4a6148f2565b6001019392505050565b808202811582820484141761095d5761095d6148f2565b600181811c90821680614b7f57607f821691505b60208210810361469e57634e487b7160e01b5f52602260045260245ffd5b5f60208083525f8454614baf81614b6b565b806020870152604060018084165f8114614bd05760018114614bec57614c19565b60ff19851660408a0152604084151560051b8a01019550614c19565b895f5260205f205f5b85811015614c105781548b8201860152908301908801614bf5565b8a016040019650505b509398975050505050505050565b6001600160401b038281168282160390808211156129c7576129c76148f2565b80516119588161461b565b5f8060408385031215614c63575f80fd5b82516001600160401b0380821115614c79575f80fd5b9084019060608287031215614c8c575f80fd5b614c946149f9565b82518152602080840151614ca78161493f565b82820152604084015183811115614cbc575f80fd5b80850194505087601f850112614cd0575f80fd5b83519250614ce0614ada84614a51565b8381528882858701011115614cf3575f80fd5b614d0284838301848801614887565b80604084015250819550614d17818801614c47565b9450505050509250929050565b6001600160401b038181168382160190808211156129c7576129c76148f2565b8181038181111561095d5761095d6148f2565b5f808335601e19843603018112614d6c575f80fd5b8301803591506001600160401b03821115614d85575f80fd5b6020019150368190038213156134d0575f80fd5b5f8651614daa818460208b01614887565b820186815260c086901b6001600160c01b0319166020820152838560288301375f9301602801928352509095945050505050565b6001600160401b03818116838216028082169190828114614e0157614e016148f2565b505092915050565b5f60208284031215614e19575f80fd5b61099b826146ce565b5f60208284031215614e32575f80fd5b813560ff8116811461099b575f80fd5b601f82111561066557805f5260205f20601f840160051c81016020851015614e675750805b601f840160051c820191505b818110156117e8575f8155600101614e73565b81516001600160401b03811115614e9f57614e9f6149e5565b614eb381614ead8454614b6b565b84614e42565b602080601f831160018114614ee6575f8415614ecf5750858301515b5f19600386901b1c1916600185901b178555610b93565b5f85815260208120601f198616915b82811015614f1457888601518255948401946001909101908401614ef5565b5085821015614f3157878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f6001600160401b03808316818103614b4a57614b4a6148f2565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451614fb181604e860160208901614887565b60c09490941b1691909201604e81019190915260560197965050505050505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"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\":\"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: "0x608060405234801561000f575f80fd5b50604051615ade380380615ade83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159918061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614c48565b61060a565b005b348015610216575f80fd5b50610209610225366004614c83565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614c48565b61084d565b34801561027f575f80fd5b5061020961028e366004614c9a565b610858565b34801561029e575f80fd5b506102096102ad366004614ce8565b610d44565b3480156102bd575f80fd5b506102096102cc366004614cff565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614c83565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614c48565b610eab565b34801561038c575f80fd5b5061020961039b366004614d20565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614d39565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614d77565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614c83565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614c48565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614c83565b61123b565b3480156104a4575f80fd5b506102096104b3366004614d39565b611306565b3480156104c3575f80fd5b506102096104d2366004614d20565b6114de565b6104076104e5366004614da1565b611667565b3480156104f5575f80fd5b506104075f8051602061590583398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614c83565b61169b565b34801561054e575f80fd5b506104075f8051602061592583398151915281565b34801561056e575f80fd5b5061020961057d366004614c83565b611884565b610407610590366004614c83565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614c83565b6119f2565b60405161024c9190614e6a565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b50610407610605366004614eea565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206159658339815191526020526040808220815160e0810190925280545f8051602061592583398151915293929190829060ff16600581111561068c5761068c614df5565b600581111561069d5761069d614df5565b81526020016001820180546106b190614f55565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd90614f55565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614df5565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f87565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611e1a565b6040518263ffffffff1660e01b81526004016108079190614f95565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108479190614fa7565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206159258339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109119190614fa7565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b6060850160408601614fd2565b6001600160a01b03161461098e576109696060840160408501614fd2565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c6060850185614fed565b905090505f805b828163ffffffff161015610c84575f6109bf6060880188614fed565b8363ffffffff168181106109d5576109d5615032565b90506020028101906109e79190615046565b6109f09061516a565b80516040519192505f916008880191610a08916151e3565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b81526106319190600401614f95565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a81916151e3565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf9190614fa7565b90508086600801835f0151604051610ad791906151e3565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614df5565b021790555060208201516001820190610b729082615238565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c17911685615307565b8251604051919550610c28916151e3565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d9061531a565b90506109a3565b50600483018190555f610ca2610c9986611e69565b60400151611f7f565b90505f610cae8761210c565b90505f600282604051610cc191906151e3565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff9190614fa7565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd583612345565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a82612356565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614df5565b14610e8b578060405163170cc93360e21b81526004016106319190614f87565b6108478383612391565b5f610ea564e8d4a510008361533c565b92915050565b61084783838361260b565b610ebe612804565b5f805160206159058339815191525f80610ed78461283b565b91509150610ee482612356565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614df5565b03610f44575f83815260078501602052604081208054919055610f428282612b79565b505b610f5a81610f5584604001516111e3565b612bd7565b505050505b610f7560015f8051602061594583398151915255565b50565b5f8181525f805160206158e58339815191526020526040808220815160e0810190925280545f8051602061590583398151915293929190829060ff166003811115610fc557610fc5614df5565b6003811115610fd657610fd6614df5565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614df5565b14611084578251604051633b0d540d60e21b8152610631919060040161535b565b60048151600581111561109957611099614df5565b036110af576110a785612bfd565b505050505050565b5f806110c66110bd89611e69565b60400151612de4565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a51000615375565b5f611206826119f2565b6080015192915050565b61121b83838361260b565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f805160206159058339815191525f611253836119f2565b519050600481600581111561126a5761126a614df5565b1461128a578060405163170cc93360e21b81526004016106319190614f87565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612b79565b61130e612804565b5f8181525f805160206158e58339815191526020526040808220815160e0810190925280545f8051602061590583398151915293929190829060ff16600381111561135b5761135b614df5565b600381111561136c5761136c614df5565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614df5565b14611406578051604051633b0d540d60e21b8152610631919060040161535b565b600461141582604001516119f2565b51600581111561142757611427614df5565b146114b9575f61143685611e69565b90505f806114478360400151612de4565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612bfd565b50506114da60015f8051602061594583398151915255565b5050565b5f805160206159258339815191525f806115036114fa85611e69565b6040015161303a565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f8281526006840160205260409020805461154390614f55565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614df5565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f87565b5f82815260068401602052604081206115d891614b9c565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f611670612804565b61167c848484346131f6565b905061169460015f8051602061594583398151915255565b9392505050565b5f8181525f805160206158e58339815191526020526040808220815160e0810190925280545f8051602061590583398151915293929190829060ff1660038111156116e8576116e8614df5565b60038111156116f9576116f9614df5565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614df5565b14158015611793575060038151600381111561179057611790614df5565b14155b156117b4578051604051633b0d540d60e21b8152610631919060040161535b565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611e1a565b6040518263ffffffff1660e01b815260040161183d9190614f95565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d9190614fa7565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061592583398151915291906118cb90614f55565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614df5565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f87565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611981919060040161538c565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a9190614fa7565b5f6119ca612804565b6119d58233346133c4565b90506119ed60015f8051602061594583398151915255565b919050565b6119fa614bd3565b5f8281525f80516020615965833981519152602052604090819020815160e0810190925280545f80516020615925833981519152929190829060ff166005811115611a4757611a47614df5565b6005811115611a5857611a58614df5565b8152602001600182018054611a6c90614f55565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9890614f55565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615925833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b849086908690615416565b90815260200160405180910390205491505092915050565b5f8381525f805160206158e58339815191526020526040808220815160e0810190925280545f805160206159058339815191529284929091829060ff166003811115611bea57611bea614df5565b6003811115611bfb57611bfb614df5565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614df5565b14611ca9578251604051633b0d540d60e21b8152610631919060040161535b565b60208301516001600160a01b03163314611cc357336112ab565b600281516005811115611cd857611cd8614df5565b03611db5578615611cef57611ced8287612391565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611d28918491611d239190615425565b613699565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d69846137f0565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611dca57611dca614df5565b03611dfe57611dd8836137f0565b5f898152600686016020526040902055611df188612bfd565b6001945050505050611694565b805160405163170cc93360e21b81526106319190600401614f87565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ecd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ef49190810190615450565b9150915080611f1657604051636b2f19e960e01b815260040160405180910390fd5b815115611f3c578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615611f78576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f8151602614611fb457815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561200357611fcb816001615522565b611fd6906008615375565b61ffff16848281518110611fec57611fec615032565b016020015160f81c901b9190911790600101611fb7565b5061ffff81161561202d5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561208857612044816003615522565b61204f906008615375565b63ffffffff1685612061836002615307565b8151811061207157612071615032565b016020015160f81c901b9190911790600101612030565b5063ffffffff8116156120ae57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612103576120c581601f615522565b6120d0906008615375565b866120dc836006615307565b815181106120ec576120ec615032565b016020015160f81c901b91909117906001016120b1565b50949350505050565b60605f8083356020850135601461212887870160408901614fd2565b6121356060890189614fed565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121bb6060850185614fed565b9050811015611f78576121d16060850185614fed565b828181106121e1576121e1615032565b90506020028101906121f39190615046565b612201906020810190615535565b90506030146122235760405163180ffa0d60e01b815260040160405180910390fd5b816122316060860186614fed565b8381811061224157612241615032565b90506020028101906122539190615046565b61225d9080615535565b905061226c6060870187614fed565b8481811061227c5761227c615032565b905060200281019061228e9190615046565b6122989080615535565b6122a56060890189614fed565b868181106122b5576122b5615032565b90506020028101906122c79190615046565b6122d5906020810190615535565b6122e260608b018b614fed565b888181106122f2576122f2615032565b90506020028101906123049190615046565b612315906060810190604001614d77565b60405160200161232b9796959493929190615577565b60408051601f1981840301815291905291506001016121ae565b61234d61399c565b610f75816139e7565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156123dc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124039190810190615450565b915091508061242557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612468573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248c9190614fa7565b8251146124b2578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b0316156124ee576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f806124fd8460400151613a55565b915091508187146125245760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615905833981519152906001600160401b0390811690831611156125e1575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612600565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f805160206159058339815191528161262486613c46565b905061262f86612356565b61263e57600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461266357336112ab565b5f86815260048301602052604090205460a082015161269291600160b01b90046001600160401b0316906155e0565b6001600160401b03168160c001516001600160401b031610156126d95760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f85156126f1576126ea8786612391565b905061270f565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b590612734906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156127aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127ce9190614fa7565b905080846007015f8a81526020019081526020015f205f8282546127f29190615307565b90915550501515979650505050505050565b5f8051602061594583398151915280546001190161283557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612844614bd3565b5f805160206159258339815191525f806128606114fa87611e69565b91509150801561288757604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128b8576128b8614df5565b60058111156128c9576128c9614df5565b81526020016001820180546128dd90614f55565b80601f016020809104026020016040519081016040528092919081815260200182805461290990614f55565b80156129545780601f1061292b57610100808354040283529160200191612954565b820191905f5260205f20905b81548152906001019060200180831161293757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129bf576129bf614df5565b141580156129e057506001815160058111156129dd576129dd614df5565b14155b15612a0157805160405163170cc93360e21b81526106319190600401614f87565b600381516005811115612a1657612a16614df5565b03612a245760048152612a29565b600581525b836008018160200151604051612a3f91906151e3565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a8357612a83614df5565b021790555060208201516001820190612a9c9082615238565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b4257612b42614df5565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612bc5575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613f2a565b60015f8051602061594583398151915255565b5f8181525f805160206158e58339815191526020526040808220815160e0810190925280545f8051602061590583398151915293929190829060ff166003811115612c4a57612c4a614df5565b6003811115612c5b57612c5b614df5565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612d89575f84815260048701602052604090205461271090612d3b90600160a01b900461ffff1685615375565b612d45919061533c565b915081866007015f8681526020019081526020015f205f828254612d699190615307565b90915550612d7990508284615522565b9050612d89856020015182612b79565b612d9e8560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e1b57835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e6a57612e32816001615522565b612e3d906008615375565b61ffff16868281518110612e5357612e53615032565b016020015160f81c901b9190911790600101612e1e565b5061ffff811615612e945760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612eef57612eab816003615522565b612eb6906008615375565b63ffffffff1687612ec8836002615307565b81518110612ed857612ed8615032565b016020015160f81c901b9190911790600101612e97565b5063ffffffff8116600314612f1757604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f6c57612f2e81601f615522565b612f39906008615375565b88612f45836006615307565b81518110612f5557612f55615032565b016020015160f81c901b9190911790600101612f1a565b505f805b6008811015612fcb57612f84816007615522565b612f8f906008615375565b6001600160401b031689612fa4836026615307565b81518110612fb457612fb4615032565b016020015160f81c901b9190911790600101612f70565b505f805b600881101561302a57612fe3816007615522565b612fee906008615375565b6001600160401b03168a61300383602e615307565b8151811061301357613013615032565b016020015160f81c901b9190911790600101612fcf565b5091989097509095509350505050565b5f80825160271461307057825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b60028110156130bf57613087816001615522565b613092906008615375565b61ffff168582815181106130a8576130a8615032565b016020015160f81c901b9190911790600101613073565b5061ffff8116156130e95760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561314457613100816003615522565b61310b906008615375565b63ffffffff168661311d836002615307565b8151811061312d5761312d615032565b016020015160f81c901b91909117906001016130ec565b5063ffffffff811660021461316c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131c15761318381601f615522565b61318e906008615375565b8761319a836006615307565b815181106131aa576131aa615032565b016020015160f81c901b919091179060010161316f565b505f866026815181106131d6576131d6615032565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061590583398151915290600160401b900461ffff908116908616108061324a575061271061ffff8616115b1561326e57604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b0390811690851610156132aa576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b80548310806132bc5750806001015483115b156132dd5760405163222d164360e21b815260048101849052602401610631565b825f6132e882610e95565b90505f6132f58983613fbd565b905060405180608001604052806133093390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615905833981519152816133dd84610e95565b90505f6133e9876119f2565b90506133f487612356565b613414576040516330efa98b60e01b815260048101889052602401610631565b60028151600581111561342957613429614df5565b1461344a57805160405163170cc93360e21b81526106319190600401614f87565b5f82826080015161345b91906155e0565b905083600201600a9054906101000a90046001600160401b031682604001516134849190615600565b6001600160401b0316816001600160401b031611156134c157604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f806134cd8a84613699565b915091505f8a836040516020016134fb92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561358e5761358e614df5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615965833981519152602052604081206002015481905f8051602061592583398151915290600160801b90046001600160401b03166136e18582614510565b5f6136eb876146ea565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61373b8a858b611e1a565b6040518263ffffffff1660e01b81526004016137579190614f95565b6020604051808303815f875af1158015613773573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137979190614fa7565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f8051602061590583398151915290505f61381084604001516119f2565b90505f60038251600581111561382857613828614df5565b1480613846575060048251600581111561384457613844614df5565b145b15613856575060c0810151613893565b60028251600581111561386b5761386b614df5565b03613877575042613893565b815160405163170cc93360e21b81526106319190600401614f87565b84608001516001600160401b0316816001600160401b0316116138ba57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906138df906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa15801561396f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139939190614fa7565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166139e557604051631afcd79f60e31b815260040160405180910390fd5b565b6139ef61399c565b6139f88161475f565b613a00614778565b610f7560608201356080830135613a1d60c0850160a08601614d77565b613a2d60e0860160c0870161562b565b613a3e610100870160e08801615644565b613a5061012088016101008901614fd2565b614788565b5f808251602e14613a8b57825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613ada57613aa2816001615522565b613aad906008615375565b61ffff16858281518110613ac357613ac3615032565b016020015160f81c901b9190911790600101613a8e565b5061ffff811615613b045760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b5f57613b1b816003615522565b613b26906008615375565b63ffffffff1686613b38836002615307565b81518110613b4857613b48615032565b016020015160f81c901b9190911790600101613b07565b5063ffffffff811615613b8557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613bda57613b9c81601f615522565b613ba7906008615375565b87613bb3836006615307565b81518110613bc357613bc3615032565b016020015160f81c901b9190911790600101613b88565b505f805b6008811015613c3957613bf2816007615522565b613bfd906008615375565b6001600160401b031688613c12836026615307565b81518110613c2257613c22615032565b016020015160f81c901b9190911790600101613bde565b5090969095509350505050565b613c4e614bd3565b5f8281525f805160206159658339815191526020526040808220815160e0810190925280545f8051602061592583398151915293929190829060ff166005811115613c9b57613c9b614df5565b6005811115613cac57613cac614df5565b8152602001600182018054613cc090614f55565b80601f0160208091040260200160405190810160405280929190818152602001828054613cec90614f55565b8015613d375780601f10613d0e57610100808354040283529160200191613d37565b820191905f5260205f20905b815481529060010190602001808311613d1a57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613da557613da5614df5565b14613dd8575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f87565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e1c57613e1c614df5565b021790555060208201516001820190613e359082615238565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613ed38582613699565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f4d5760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f96576040519150601f19603f3d011682016040523d82523d5f602084013e613f9b565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661400157604051637fab81e560e01b815260040160405180910390fd5b5f80516020615925833981519152426140206060860160408701614d77565b6001600160401b031611158061405a575061403e6202a30042615307565b61404e6060860160408701614d77565b6001600160401b031610155b156140945761406f6060850160408601614d77565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b60306140a36020860186615535565b9050146140d5576140b76020850185615535565b6040516326475b2f60e11b8152610631925060040190815260200190565b6140df8480615535565b90505f0361410c576140f18480615535565b604051633e08a12560e11b8152600401610631929190615664565b5f6008820161411b8680615535565b604051614129929190615416565b90815260200160405180910390205414614162576141478480615535565b60405163a41f772f60e01b8152600401610631929190615664565b61416c835f614510565b6040805160e08101909152815481525f90819061427890602081016141918980615535565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906141d9908a018a615535565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161422260608a0160408b01614d77565b6001600160401b0316815260200161423d60608a018a615692565b614246906156a6565b815260200161425860808a018a615692565b614261906156a6565b8152602001876001600160401b03168152506148b7565b5f828152600686016020526040902091935091506142968282615238565b5081600884016142a68880615535565b6040516142b4929190615416565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906142f0908590600401614f95565b6020604051808303815f875af115801561430c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143309190614fa7565b6040805160e0810190915290915080600181526020016143508980615535565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143df576143df614df5565b0217905550602082015160018201906143f89082615238565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144968880615535565b6040516144a4929190615416565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144e29190614d77565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f805160206159258339815191525f6001600160401b0380841690851611156145445761453d8385615425565b9050614551565b61454e8484615425565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806145b35750600184015481516145af916001600160401b031690615307565b8210155b156145d9576001600160401b0383166060820152818152604081015160208201526145f8565b82816060018181516145eb91906155e0565b6001600160401b03169052505b6060810151614608906064615600565b602082015160018601546001600160401b0392909216916146339190600160401b900460ff16615375565b101561466357606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b03168160400181815161467e9190615307565b9052506040810180516001600160401b038716919061469e908390615522565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206159658339815191526020526040812060020180545f80516020615925833981519152919060089061473490600160401b90046001600160401b031661576d565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61476761399c565b61476f614aa4565b610f7581614aac565b61478061399c565b6139e5614b94565b61479061399c565b5f8051602061590583398151915261ffff841615806147b4575061271061ffff8516115b156147d857604051635f12e6c360e11b815261ffff85166004820152602401610631565b858711156147fc5760405163222d164360e21b815260048101889052602401610631565b60ff8316158061480f5750600a60ff8416115b156148325760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260400151516030146148e05760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614921988a986001989297929690959094909390929101615788565b60405160208183030381529060405290505f5b846080015160200151518110156149935781856080015160200151828151811061496057614960615032565b6020026020010151604051602001614979929190615842565b60408051601f198184030181529190529150600101614934565b5060a08401518051602091820151516040516149b3938593929101615878565b60405160208183030381529060405290505f5b8460a001516020015151811015614a2557818560a001516020015182815181106149f2576149f2615032565b6020026020010151604051602001614a0b929190615842565b60408051601f1981840301815291905291506001016149c6565b5060c0840151604051614a3c9183916020016158b3565b6040516020818303038152906040529050600281604051614a5d91906151e3565b602060405180830381855afa158015614a78573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a9b9190614fa7565b94909350915050565b6139e561399c565b614ab461399c565b80355f805160206159258339815191529081556014614ad96060840160408501615644565b60ff161180614af85750614af36060830160408401615644565b60ff16155b15614b2c57614b0d6060830160408401615644565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614b3c6060830160408401615644565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614b6d6040830160208401614d77565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612bea61399c565b508054614ba890614f55565b5f825580601f10614bb7575050565b601f0160209004905f5260205f2090810190610f759190614c10565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614c24575f8155600101614c11565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614c5a575f80fd5b833592506020840135614c6c81614c28565b9150614c7a60408501614c35565b90509250925092565b5f60208284031215614c93575f80fd5b5035919050565b5f8060408385031215614cab575f80fd5b82356001600160401b03811115614cc0575f80fd5b830160808186031215614cd1575f80fd5b9150614cdf60208401614c35565b90509250929050565b5f6101208284031215614cf9575f80fd5b50919050565b5f8060408385031215614d10575f80fd5b82359150614cdf60208401614c35565b5f60208284031215614d30575f80fd5b61169482614c35565b5f8060408385031215614d4a575f80fd5b614d5383614c35565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614d87575f80fd5b61169482614d61565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614db3575f80fd5b83356001600160401b03811115614dc8575f80fd5b840160a08187031215614dd9575f80fd5b9250614de760208501614d90565b9150614c7a60408501614d61565b634e487b7160e01b5f52602160045260245ffd5b60068110614e1957614e19614df5565b9052565b5f5b83811015614e37578181015183820152602001614e1f565b50505f910152565b5f8151808452614e56816020860160208601614e1d565b601f01601f19169290920160200192915050565b60208152614e7c602082018351614e09565b5f602083015160e06040840152614e97610100840182614e3f565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215614efb575f80fd5b82356001600160401b0380821115614f11575f80fd5b818501915085601f830112614f24575f80fd5b813581811115614f32575f80fd5b866020828501011115614f43575f80fd5b60209290920196919550909350505050565b600181811c90821680614f6957607f821691505b602082108103614cf957634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614e09565b602081525f6116946020830184614e3f565b5f60208284031215614fb7575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f60208284031215614fe2575f80fd5b813561169481614fbe565b5f808335601e19843603018112615002575f80fd5b8301803591506001600160401b0382111561501b575f80fd5b6020019150600581901b36038213156137e9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261505a575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561509a5761509a615064565b60405290565b604080519081016001600160401b038111828210171561509a5761509a615064565b604051601f8201601f191681016001600160401b03811182821017156150ea576150ea615064565b604052919050565b5f6001600160401b0382111561510a5761510a615064565b50601f01601f191660200190565b5f82601f830112615127575f80fd5b813561513a615135826150f2565b6150c2565b81815284602083860101111561514e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561517a575f80fd5b615182615078565b82356001600160401b0380821115615198575f80fd5b6151a436838701615118565b835260208501359150808211156151b9575f80fd5b506151c636828601615118565b6020830152506151d860408401614d61565b604082015292915050565b5f825161505a818460208701614e1d565b601f82111561063a57805f5260205f20601f840160051c810160208510156152195750805b601f840160051c820191505b8181101561187d575f8155600101615225565b81516001600160401b0381111561525157615251615064565b6152658161525f8454614f55565b846151f4565b602080601f831160018114615298575f84156152815750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b828110156152c6578886015182559484019460019091019084016152a7565b50858210156152e357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea56152f3565b5f63ffffffff808316818103615332576153326152f3565b6001019392505050565b5f8261535657634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061536f5761536f614df5565b91905290565b8082028115828204841417610ea557610ea56152f3565b5f60208083525f845461539e81614f55565b806020870152604060018084165f81146153bf57600181146153db57615408565b60ff19851660408a0152604084151560051b8a01019550615408565b895f5260205f205f5b858110156153ff5781548b82018601529083019088016153e4565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611f7857611f786152f3565b80516119ed81614c28565b5f8060408385031215615461575f80fd5b82516001600160401b0380821115615477575f80fd5b908401906060828703121561548a575f80fd5b615492615078565b825181526020808401516154a581614fbe565b828201526040840151838111156154ba575f80fd5b80850194505087601f8501126154ce575f80fd5b835192506154de615135846150f2565b83815288828587010111156154f1575f80fd5b61550084838301848801614e1d565b80604084015250819550615515818801615445565b9450505050509250929050565b81810381811115610ea557610ea56152f3565b5f808335601e1984360301811261554a575f80fd5b8301803591506001600160401b03821115615563575f80fd5b6020019150368190038213156137e9575f80fd5b5f8851615588818460208d01614e1d565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611f7857611f786152f3565b6001600160401b03818116838216028082169190828114615623576156236152f3565b505092915050565b5f6020828403121561563b575f80fd5b61169482614d90565b5f60208284031215615654575f80fd5b813560ff81168114611694575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f8235603e1983360301811261505a575f80fd5b5f604082360312156156b6575f80fd5b6156be6150a0565b6156c783614c35565b81526020808401356001600160401b03808211156156e3575f80fd5b9085019036601f8301126156f5575f80fd5b81358181111561570757615707615064565b8060051b91506157188483016150c2565b8181529183018401918481019036841115615731575f80fd5b938501935b8385101561575b578435925061574b83614fbe565b8282529385019390850190615736565b94860194909452509295945050505050565b5f6001600160401b03808316818103615332576153326152f3565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516157ce81602a850160208b01614e1d565b8651908301906157e581602a840160208b01614e1d565b60c087901b6001600160c01b031916602a9290910191820152615817603282018660e01b6001600160e01b0319169052565b615830603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615853818460208801614e1d565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615889818460208901614e1d565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516158c4818460208801614e1d565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // NativeTokenStakingManagerABI is the input ABI used to generate the binding from. @@ -596,7 +604,7 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) WARPME // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { var out []interface{} err := _NativeTokenStakingManager.contract.Call(opts, &out, "getValidator", validationID) @@ -613,14 +621,14 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) GetValidator( // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) GetValidator(validationID [32]byte) (Validator, error) { return _NativeTokenStakingManager.Contract.GetValidator(&_NativeTokenStakingManager.CallOpts, validationID) } // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { return _NativeTokenStakingManager.Contract.GetValidator(&_NativeTokenStakingManager.CallOpts, validationID) } @@ -656,10 +664,10 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) GetWei return _NativeTokenStakingManager.Contract.GetWeight(&_NativeTokenStakingManager.CallOpts, validationID) } -// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// RegisteredValidators is a free data retrieval call binding the contract method 0xfd7ac5e7. // -// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) RegisteredValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { +// Solidity: function registeredValidators(bytes nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) RegisteredValidators(opts *bind.CallOpts, nodeID []byte) ([32]byte, error) { var out []interface{} err := _NativeTokenStakingManager.contract.Call(opts, &out, "registeredValidators", nodeID) @@ -673,17 +681,17 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerCaller) RegisteredVal } -// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// RegisteredValidators is a free data retrieval call binding the contract method 0xfd7ac5e7. // -// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) RegisteredValidators(nodeID [32]byte) ([32]byte, error) { +// Solidity: function registeredValidators(bytes nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) RegisteredValidators(nodeID []byte) ([32]byte, error) { return _NativeTokenStakingManager.Contract.RegisteredValidators(&_NativeTokenStakingManager.CallOpts, nodeID) } -// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// RegisteredValidators is a free data retrieval call binding the contract method 0xfd7ac5e7. // -// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) -func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) RegisteredValidators(nodeID [32]byte) ([32]byte, error) { +// Solidity: function registeredValidators(bytes nodeID) view returns(bytes32) +func (_NativeTokenStakingManager *NativeTokenStakingManagerCallerSession) RegisteredValidators(nodeID []byte) ([32]byte, error) { return _NativeTokenStakingManager.Contract.RegisteredValidators(&_NativeTokenStakingManager.CallOpts, nodeID) } @@ -980,44 +988,44 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) In return _NativeTokenStakingManager.Contract.InitializeEndValidation(&_NativeTokenStakingManager.TransactOpts, validationID, includeUptimeProof, messageIndex) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xaf2f5feb. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) +// Solidity: function initializeValidatorRegistration((bytes,bytes,uint64,(uint32,address[]),(uint32,address[])) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, delegationFeeBips, minStakeDuration) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xaf2f5feb. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) +// Solidity: function initializeValidatorRegistration((bytes,bytes,uint64,(uint32,address[]),(uint32,address[])) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x40034a93. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0xaf2f5feb. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) +// Solidity: function initializeValidatorRegistration((bytes,bytes,uint64,(uint32,address[]),(uint32,address[])) registrationInput, uint16 delegationFeeBips, uint64 minStakeDuration) payable returns(bytes32) func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, delegationFeeBips uint16, minStakeDuration uint64) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.InitializeValidatorRegistration(&_NativeTokenStakingManager.TransactOpts, registrationInput, delegationFeeBips, minStakeDuration) } -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. // -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) subnetConversionData, uint32 messageIndex) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { return _NativeTokenStakingManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) } -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. // -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) subnetConversionData, uint32 messageIndex) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.InitializeValidatorSet(&_NativeTokenStakingManager.TransactOpts, subnetConversionData, messageIndex) } -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. // -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) subnetConversionData, uint32 messageIndex) returns() func (_NativeTokenStakingManager *NativeTokenStakingManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { return _NativeTokenStakingManager.Contract.InitializeValidatorSet(&_NativeTokenStakingManager.TransactOpts, subnetConversionData, messageIndex) } @@ -1804,15 +1812,15 @@ func (it *NativeTokenStakingManagerInitialValidatorCreatedIterator) Close() erro // NativeTokenStakingManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerInitialValidatorCreated struct { ValidationID [32]byte - NodeID [32]byte + NodeID common.Hash Weight *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*NativeTokenStakingManagerInitialValidatorCreatedIterator, error) { +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte) (*NativeTokenStakingManagerInitialValidatorCreatedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1830,10 +1838,10 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterIniti return &NativeTokenStakingManagerInitialValidatorCreatedIterator{contract: _NativeTokenStakingManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil } -// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1876,9 +1884,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchInitia }), nil } -// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*NativeTokenStakingManagerInitialValidatorCreated, error) { event := new(NativeTokenStakingManagerInitialValidatorCreated) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { @@ -2237,17 +2245,17 @@ func (it *NativeTokenStakingManagerValidationPeriodCreatedIterator) Close() erro // NativeTokenStakingManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the NativeTokenStakingManager contract. type NativeTokenStakingManagerValidationPeriodCreated struct { ValidationID [32]byte - NodeID [32]byte + NodeID common.Hash RegisterValidationMessageID [32]byte Weight *big.Int RegistrationExpiry uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (*NativeTokenStakingManagerValidationPeriodCreatedIterator, error) { +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (*NativeTokenStakingManagerValidationPeriodCreatedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -2269,10 +2277,10 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) FilterValid return &NativeTokenStakingManagerValidationPeriodCreatedIterator{contract: _NativeTokenStakingManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil } -// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *NativeTokenStakingManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -2319,9 +2327,9 @@ func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) WatchValida }), nil } -// ParseValidationPeriodCreated is a log parse operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) func (_NativeTokenStakingManager *NativeTokenStakingManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*NativeTokenStakingManagerValidationPeriodCreated, error) { event := new(NativeTokenStakingManagerValidationPeriodCreated) if err := _NativeTokenStakingManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { diff --git a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go index 307bd6449..4bc8229d1 100644 --- a/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go +++ b/abi-bindings/go/validator-manager/PoAValidatorManager/PoAValidatorManager.go @@ -31,14 +31,20 @@ var ( // InitialValidator is an auto generated low-level Go binding around an user-defined struct. type InitialValidator struct { - NodeID [32]byte - Weight uint64 + NodeID []byte BlsPublicKey []byte + Weight uint64 +} + +// PChainOwner is an auto generated low-level Go binding around an user-defined struct. +type PChainOwner struct { + Threshold uint32 + Addresses []common.Address } // SubnetConversionData is an auto generated low-level Go binding around an user-defined struct. type SubnetConversionData struct { - ConvertSubnetTxID [32]byte + SubnetID [32]byte ValidatorManagerBlockchainID [32]byte ValidatorManagerAddress common.Address InitialValidators []InitialValidator @@ -47,7 +53,7 @@ type SubnetConversionData struct { // Validator is an auto generated low-level Go binding around an user-defined struct. type Validator struct { Status uint8 - NodeID [32]byte + NodeID []byte StartingWeight uint64 MessageNonce uint64 Weight uint64 @@ -64,15 +70,17 @@ type ValidatorManagerSettings struct { // ValidatorRegistrationInput is an auto generated low-level Go binding around an user-defined struct. type ValidatorRegistrationInput struct { - NodeID [32]byte - RegistrationExpiry uint64 - BlsPublicKey []byte + NodeID []byte + BlsPublicKey []byte + RegistrationExpiry uint64 + RemainingBalanceOwner PChainOwner + DisableOwner PChainOwner } // 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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"registrationExpiry\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]},{\"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\":\"convertSubnetTxID\",\"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\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"weight\",\"type\":\"uint64\",\"internalType\":\"uint64\"},{\"name\":\"blsPublicKey\",\"type\":\"bytes\",\"internalType\":\"bytes\"}]}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"}],\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"bytes32\",\"indexed\":true,\"internalType\":\"bytes32\"},{\"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\":\"InvalidCodecID\",\"inputs\":[]},{\"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\":[]},{\"type\":\"error\",\"name\":\"InvalidMessageType\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidNodeID\",\"inputs\":[{\"name\":\"nodeID\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"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\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"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\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b50604051612fc8380380612fc883398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b612e7b8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c806397fb70d4116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063e7d14c1c146102ec578063f2fde38b1461032a575f80fd5b806397fb70d41461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638994ab49146101f55780638da5cb5b14610208575f80fd5b80630322ed9814610136578063467ef06f1461014b57806360305d621461015e57806361e2f4901461018057806366435abf14610193575b5f80fd5b610149610144366004612522565b61033d565b005b610149610159366004612551565b6104cd565b610166601481565b60405163ffffffff90911681526020015b60405180910390f35b61014961018e36600461256a565b6104db565b6101a66101a1366004612522565b61098e565b6040516001600160401b039091168152602001610177565b6101496109a2565b6101cd5f81565b604051908152602001610177565b6101e3603081565b60405160ff9091168152602001610177565b6101cd6102033660046125e4565b6109b5565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b039091168152602001610177565b61014961025a366004612522565b6109d1565b61014961026d366004612551565b6109e6565b6102346005600160991b0181565b6101cd5f80516020612e2f83398151915281565b6101496102a2366004612522565b610b6f565b6101e3601481565b6101496102bd366004612639565b610cac565b6102d56102d0366004612522565b610dba565b60405161017791906126a3565b6101a66202a30081565b6101cd6102fa366004612522565b5f9081527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb08602052604090205490565b61014961033836600461270c565b610e82565b5f8181525f80516020612e4f8339815191526020526040808220815160e0810190925280545f80516020612e2f83398151915293929190829060ff16600581111561038a5761038a61266f565b600581111561039b5761039b61266f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561040a5761040a61266f565b14610446575f8381526007830160205260409081902054905163170cc93360e21b815261043d9160ff169060040161272e565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb61046b8584606001515f610ebf565b6040518263ffffffff1660e01b8152600401610487919061275e565b6020604051808303815f875af11580156104a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104c79190612790565b50505050565b6104d681610f0e565b505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020612e2f8339815191529060ff161561052d57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015610570573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105949190612790565b8360200135146105bd576040516372b0a7e760e11b81526020840135600482015260240161043d565b306105ce606085016040860161270c565b6001600160a01b031614610611576105ec606084016040850161270c565b604051632f88120d60e21b81526001600160a01b03909116600482015260240161043d565b5f61061f60608501856127a7565b905090505f805b828163ffffffff1610156108ce575f61064260608801886127a7565b8363ffffffff16818110610658576106586127ec565b905060200281019061066a9190612800565b610673906128b0565b80515f81815260088801602052604090205491925090156106aa57604051631ec583cb60e11b81526004810182905260240161043d565b5f6002895f0135856040516020016106d992919091825260e01b6001600160e01b031916602082015260240190565b60408051601f19818403018152908290526106f391612947565b602060405180830381855afa15801561070e573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107319190612790565b5f8381526008890160209081526040808320849055805160e0810182526002815287518184015287830180516001600160401b039081168385015260608301869052905181166080830152421660a082015260c0810184905284845260078c01909252909120815181549394509192909190829060ff191660018360058111156107bd576107bd61266f565b0217905550602082810151600183015560408301516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff19169284169290921790915584015161087091168661296c565b83516020808601516040516001600160401b039091168152929750909183917fb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014910160405180910390a3505050806108c79061297f565b9050610626565b50600483018190555f6108ec6108e3866111a5565b604001516112bb565b90505f6108f887611430565b90505f60028260405161090b9190612947565b602060405180830381855afa158015610926573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109499190612790565b905082811461097557604051631872fc8d60e01b8152600481018290526024810184905260440161043d565b5050506009909201805460ff1916600117905550505050565b5f61099882610dba565b6080015192915050565b6109aa6115b6565b6109b35f611611565b565b5f6109be6115b6565b6109c88383611681565b90505b92915050565b6109d96115b6565b6109e281611ab3565b5050565b5f80516020612e2f8339815191525f80610a0b610a02856111a5565b60400151611d05565b9150915080610a3157604051632d07135360e01b8152811515600482015260240161043d565b5f82815260068401602052604090208054610a4b906129a1565b90505f03610a6f5760405163089938b360e11b81526004810183905260240161043d565b60015f83815260078501602052604090205460ff166005811115610a9557610a9561266f565b14610ac8575f8281526007840160205260409081902054905163170cc93360e21b815261043d9160ff169060040161272e565b5f8281526006840160205260408120610ae091612497565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020612e2f8339815191529190610bb6906129a1565b90505f03610bda5760405163089938b360e11b81526004810183905260240161043d565b60015f83815260078301602052604090205460ff166005811115610c0057610c0061266f565b14610c33575f8281526007820160205260409081902054905163170cc93360e21b815261043d9160ff169060040161272e565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610c6c91906004016129d3565b6020604051808303815f875af1158015610c88573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d69190612790565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610cf05750825b90505f826001600160401b03166001148015610d0b5750303b155b905081158015610d19575080155b15610d375760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610d6157845460ff60401b1916600160401b1785555b610d6b8787611ea9565b8315610db157845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610dc26124ce565b5f8281525f80516020612e4f833981519152602052604090819020815160e0810190925280545f80516020612e2f833981519152929190829060ff166005811115610e0f57610e0f61266f565b6005811115610e2057610e2061266f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a083015260039092015490911660c0909101529392505050565b610e8a6115b6565b6001600160a01b038116610eb357604051631e4fbdf760e01b81525f600482015260240161043d565b610ebc81611611565b50565b604080515f6020820152600160e11b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b5f610f176124ce565b5f80516020612e2f8339815191525f80610f33610a02876111a5565b915091508015610f5a57604051632d07135360e01b8152811515600482015260240161043d565b5f828152600784016020526040808220815160e081019092528054829060ff166005811115610f8b57610f8b61266f565b6005811115610f9c57610f9c61266f565b81526001820154602082015260028201546001600160401b038082166040840152600160401b820481166060840152600160801b820481166080840152600160c01b909104811660a08301526003928301541660c0909101529091508151600581111561100b5761100b61266f565b1415801561102c57506001815160058111156110295761102961266f565b14155b1561104d57805160405163170cc93360e21b815261043d919060040161272e565b6003815160058111156110625761106261266f565b036110705760048152611075565b600581525b6020808201515f908152600886018252604080822082905585825260078701909252208151815483929190829060ff191660018360058111156110ba576110ba61266f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561116e5761116e61266f565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611209573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112309190810190612a6c565b915091508061125257604051636b2f19e960e01b815260040160405180910390fd5b815115611278578151604051636ba589a560e01b8152600481019190915260240161043d565b60208201516001600160a01b0316156112b4576020820151604051624de75d60e31b81526001600160a01b03909116600482015260240161043d565b5092915050565b5f81516026146112de57604051638d0242c960e01b815260040160405180910390fd5b5f805b600281101561132d576112f5816001612b3e565b611300906008612b51565b61ffff16848281518110611316576113166127ec565b016020015160f81c901b91909117906001016112e1565b5061ffff8116156113515760405163059510e360e31b815260040160405180910390fd5b5f805b60048110156113ac57611368816003612b3e565b611373906008612b51565b63ffffffff168561138583600261296c565b81518110611395576113956127ec565b016020015160f81c901b9190911790600101611354565b5063ffffffff8116156113d257604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015611427576113e981601f612b3e565b6113f4906008612b51565b8661140083600661296c565b81518110611410576114106127ec565b016020015160f81c901b91909117906001016113d5565b50949350505050565b60605f82356020840135601461144b8686016040880161270c565b61145860608801886127a7565b6040516114b1969594939250602001948552602085019390935260e091821b6001600160e01b0319908116604086015260609190911b6bffffffffffffffffffffffff1916604485015291901b166058820152605c0190565b60405160208183030381529060405290505f5b6114d160608501856127a7565b90508110156112b457816114e860608601866127a7565b838181106114f8576114f86127ec565b905060200281019061150a9190612800565b3561151860608701876127a7565b84818110611528576115286127ec565b905060200281019061153a9190612800565b61154b906040810190602001612b68565b61155860608801886127a7565b85818110611568576115686127ec565b905060200281019061157a9190612800565b611588906040810190612b81565b60405160200161159c959493929190612bc3565b60408051601f1981840301815291905291506001016114c4565b336115e87f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b0316146109b35760405163118cdaa760e01b815233600482015260240161043d565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff166116c557604051637fab81e560e01b815260040160405180910390fd5b5f80516020612e2f833981519152426116e46040860160208701612b68565b6001600160401b031611158061171e57506117026202a3004261296c565b6117126040860160208701612b68565b6001600160401b031610155b15611758576117336040850160208601612b68565b604051635879da1360e11b81526001600160401b03909116600482015260240161043d565b60306117676040860186612b81565b9050146117995761177b6040850185612b81565b6040516326475b2f60e11b815261043d925060040190815260200190565b83356117bb5760405163099e922360e21b81528435600482015260240161043d565b83355f908152600882016020526040902054156117ee57604051631ec583cb60e11b81528435600482015260240161043d565b6117f8835f611ec3565b5f806118916040518060a00160405280855f01548152602001885f01358152602001876001600160401b0316815260200188602001602081019061183c9190612b68565b6001600160401b0316815260200161185760408a018a612b81565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505091525061209d565b5f828152600686016020526040902091935091506118af8282612c53565b5085355f9081526008840160205260408082208490555163ee5b48eb60e01b81526005600160991b019063ee5b48eb906118ed90859060040161275e565b6020604051808303815f875af1158015611909573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061192d9190612790565b6040805160e08101909152909150806001815288356020808301919091526001600160401b03891660408084018290525f60608501819052608085019290925260a0840182905260c0909301819052868152600788019091522081518154829060ff191660018360058111156119a5576119a561266f565b021790555060208281015160018301556040808401516002840180546060870151608088015160a08901516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909401516003909301805467ffffffffffffffff19169390941692909217909255829189359186917f79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e918b91611a85918e01908e01612b68565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b611abb6124ce565b5f8281525f80516020612e4f8339815191526020526040808220815160e0810190925280545f80516020612e2f83398151915293929190829060ff166005811115611b0857611b0861266f565b6005811115611b1957611b1961266f565b8152600182015460208201526002808301546001600160401b038082166040850152600160401b820481166060850152600160801b820481166080850152600160c01b909104811660a084015260039093015490921660c09091015290915081516005811115611b8b57611b8b61266f565b14611bbe575f8481526007830160205260409081902054905163170cc93360e21b815261043d9160ff169060040161272e565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611c0257611c0261266f565b02179055506020820151600182015560408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611cae8582612160565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b5f808251602714611d2957604051638d0242c960e01b815260040160405180910390fd5b5f805b6002811015611d7857611d40816001612b3e565b611d4b906008612b51565b61ffff16858281518110611d6157611d616127ec565b016020015160f81c901b9190911790600101611d2c565b5061ffff811615611d9c5760405163059510e360e31b815260040160405180910390fd5b5f805b6004811015611df757611db3816003612b3e565b611dbe906008612b51565b63ffffffff1686611dd083600261296c565b81518110611de057611de06127ec565b016020015160f81c901b9190911790600101611d9f565b5063ffffffff8116600314611e1f57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015611e7457611e3681601f612b3e565b611e41906008612b51565b87611e4d83600661296c565b81518110611e5d57611e5d6127ec565b016020015160f81c901b9190911790600101611e22565b505f86602681518110611e8957611e896127ec565b016020015191976001600160f81b03199092161515965090945050505050565b611eb16122b7565b611eba82612300565b6109e281612319565b5f80516020612e2f8339815191525f6001600160401b038084169085161115611ef757611ef08385612d12565b9050611f04565b611f018484612d12565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580611f66575060018401548151611f62916001600160401b03169061296c565b8210155b15611f8c576001600160401b038316606082015281815260408101516020820152611fab565b8281606001818151611f9e9190612d32565b6001600160401b03169052505b6060810151611fbb906064612d52565b602082015160018601546001600160401b039290921691611fe69190600160401b900460ff16612b51565b101561201657606081015160405163dfae880160e01b81526001600160401b03909116600482015260240161043d565b856001600160401b031681604001818151612031919061296c565b9052506040810180516001600160401b0387169190612051908390612b3e565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260800151516030146120c657604051638d0242c960e01b815260040160405180910390fd5b5f806001855f015186602001518760400151886080015189606001516040516020016120f89796959493929190612d7d565b60405160208183030381529060405290506002816040516121199190612947565b602060405180830381855afa158015612134573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906121579190612790565b94909350915050565b5f8281525f80516020612e4f833981519152602052604081206002015481905f80516020612e2f83398151915290600160801b90046001600160401b03166121a88582611ec3565b5f6121b28761232a565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6122028a858b610ebf565b6040518263ffffffff1660e01b815260040161221e919061275e565b6020604051808303815f875af115801561223a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061225e9190612790565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166109b357604051631afcd79f60e31b815260040160405180910390fd5b6123086122b7565b61231061239f565b610ebc816123a7565b6123216122b7565b610ebc8161248f565b5f8181525f80516020612e4f8339815191526020526040812060020180545f80516020612e2f833981519152919060089061237490600160401b90046001600160401b0316612df3565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6109b36122b7565b6123af6122b7565b80355f80516020612e2f83398151915290815560146123d46060840160408501612e0e565b60ff1611806123f357506123ee6060830160408401612e0e565b60ff16155b15612427576124086060830160408401612e0e565b604051634a59bbff60e11b815260ff909116600482015260240161043d565b6124376060830160408401612e0e565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556124686040830160208401612b68565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610e8a6122b7565b5080546124a3906129a1565b5f825580601f106124b2575050565b601f0160209004905f5260205f2090810190610ebc919061250a565b6040805160e08101909152805f81525f6020820181905260408201819052606082018190526080820181905260a0820181905260c09091015290565b5b8082111561251e575f815560010161250b565b5090565b5f60208284031215612532575f80fd5b5035919050565b803563ffffffff8116811461254c575f80fd5b919050565b5f60208284031215612561575f80fd5b6109c882612539565b5f806040838503121561257b575f80fd5b82356001600160401b03811115612590575f80fd5b8301608081860312156125a1575f80fd5b91506125af60208401612539565b90509250929050565b5f606082840312156125c8575f80fd5b50919050565b80356001600160401b038116811461254c575f80fd5b5f80604083850312156125f5575f80fd5b82356001600160401b0381111561260a575f80fd5b612616858286016125b8565b9250506125af602084016125ce565b6001600160a01b0381168114610ebc575f80fd5b5f806080838503121561264a575f80fd5b61265484846125b8565b9150606083013561266481612625565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b6006811061269f57634e487b7160e01b5f52602160045260245ffd5b9052565b5f60e0820190506126b5828451612683565b6020830151602083015260408301516001600160401b0380821660408501528060608601511660608501528060808601511660808501528060a08601511660a08501528060c08601511660c0850152505092915050565b5f6020828403121561271c575f80fd5b813561272781612625565b9392505050565b602081016109cb8284612683565b5f5b8381101561275657818101518382015260200161273e565b50505f910152565b602081525f825180602084015261277c81604085016020870161273c565b601f01601f19169190910160400192915050565b5f602082840312156127a0575f80fd5b5051919050565b5f808335601e198436030181126127bc575f80fd5b8301803591506001600160401b038211156127d5575f80fd5b6020019150600581901b36038213156122b0575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612814575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156128545761285461281e565b60405290565b604051601f8201601f191681016001600160401b03811182821017156128825761288261281e565b604052919050565b5f6001600160401b038211156128a2576128a261281e565b50601f01601f191660200190565b5f606082360312156128c0575f80fd5b6128c8612832565b8235815260206128d98185016125ce565b8183015260408401356001600160401b038111156128f5575f80fd5b840136601f820112612905575f80fd5b80356129186129138261288a565b61285a565b818152368483850101111561292b575f80fd5b81848401858301375f9181019093015250604082015292915050565b5f825161281481846020870161273c565b634e487b7160e01b5f52601160045260245ffd5b808201808211156109cb576109cb612958565b5f63ffffffff80831681810361299757612997612958565b6001019392505050565b600181811c908216806129b557607f821691505b6020821081036125c857634e487b7160e01b5f52602260045260245ffd5b5f60208083525f84546129e5816129a1565b806020870152604060018084165f8114612a065760018114612a2257612a4f565b60ff19851660408a0152604084151560051b8a01019550612a4f565b895f5260205f205f5b85811015612a465781548b8201860152908301908801612a2b565b8a016040019650505b509398975050505050505050565b8051801515811461254c575f80fd5b5f8060408385031215612a7d575f80fd5b82516001600160401b0380821115612a93575f80fd5b9084019060608287031215612aa6575f80fd5b612aae612832565b82518152602080840151612ac181612625565b82820152604084015183811115612ad6575f80fd5b80850194505087601f850112612aea575f80fd5b83519250612afa6129138461288a565b8381528882858701011115612b0d575f80fd5b612b1c8483830184880161273c565b80604084015250819550612b31818801612a5d565b9450505050509250929050565b818103818111156109cb576109cb612958565b80820281158282048414176109cb576109cb612958565b5f60208284031215612b78575f80fd5b6109c8826125ce565b5f808335601e19843603018112612b96575f80fd5b8301803591506001600160401b03821115612baf575f80fd5b6020019150368190038213156122b0575f80fd5b5f8651612bd4818460208b0161273c565b820186815260c086901b6001600160c01b0319166020820152838560288301375f9301602801928352509095945050505050565b601f8211156104d657805f5260205f20601f840160051c81016020851015612c2d5750805b601f840160051c820191505b81811015612c4c575f8155600101612c39565b5050505050565b81516001600160401b03811115612c6c57612c6c61281e565b612c8081612c7a84546129a1565b84612c08565b602080601f831160018114612cb3575f8415612c9c5750858301515b5f19600386901b1c1916600185901b178555612d0a565b5f85815260208120601f198616915b82811015612ce157888601518255948401946001909101908401612cc2565b5085821015612cfe57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160401b038281168282160390808211156112b4576112b4612958565b6001600160401b038181168382160190808211156112b4576112b4612958565b6001600160401b03818116838216028082169190828114612d7557612d75612958565b505092915050565b61ffff60f01b8860f01b16815263ffffffff60e01b8760e01b1660028201528560068201528460268201525f6001600160401b0360c01b808660c01b1660468401528451612dd281604e86016020890161273c565b60c09490941b1691909201604e810191909152605601979650505050505050565b5f6001600160401b0380831681810361299757612997612958565b5f60208284031215612e1e575f80fd5b813560ff81168114612727575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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\":\"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\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]", + Bin: "0x608060405234801561000f575f80fd5b506040516138a63803806138a683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6137598061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612b01565b610312565b005b610149610159366004612b30565b610529565b61014961016c366004612b7e565b610a15565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612b01565b610a23565b6040516001600160401b03909116815260200161018a565b610149610a37565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612b01565b610a4a565b6101cd61025a366004612bad565b610a5f565b61014961026d366004612b7e565b610a7b565b6102216005600160991b0181565b6101cd5f8051602061370d83398151915281565b6101496102a2366004612b01565b610c04565b6101e3601481565b6101496102bd366004612c06565b610d41565b6102d56102d0366004612b01565b610e4f565b60405161018a9190612cc3565b6101a66202a30081565b6101496102fa366004612d43565b610f9e565b6101cd61030d366004612d65565b610fdb565b5f8181525f8051602061372d8339815191526020526040808220815160e0810190925280545f8051602061370d83398151915293929190829060ff16600581111561035f5761035f612c42565b600581111561037057610370612c42565b815260200160018201805461038490612dd0565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612dd0565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612c42565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612e08565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f611036565b6040518263ffffffff1660e01b81526004016104e39190612e16565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612e28565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061370d8339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612e28565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612d43565b6001600160a01b03161461065f5761063a6060840160408501612d43565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612e3f565b905090505f805b828163ffffffff161015610955575f6106906060880188612e3f565b8363ffffffff168181106106a6576106a6612e84565b90506020028101906106b89190612e98565b6106c190612fbc565b80516040519192505f9160088801916106d991613035565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612e16565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261075291613035565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612e28565b90508086600801835f01516040516107a89190613035565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612c42565b0217905550602082015160018201906108439082613091565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e8911685613164565b82516040519195506108f991613035565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e90613177565b9050610674565b50600483018190555f61097361096a86611085565b6040015161119b565b90505f61097f87611328565b90505f6002826040516109929190613035565b602060405180830381855afa1580156109ad573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109d09190612e28565b90508281146109fc57604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a1e81611561565b505050565b5f610a2d82610e4f565b6080015192915050565b610a3f61189f565b610a485f6118fa565b565b610a5261189f565b610a5b8161196a565b5050565b5f610a6861189f565b610a728383611c4e565b90505b92915050565b5f8051602061370d8339815191525f80610aa0610a9785611085565b604001516121a1565b9150915080610ac657604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610ae090612dd0565b90505f03610b045760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b2a57610b2a612c42565b14610b5d575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612e08565b5f8281526006840160205260408120610b7591612a75565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061370d8339815191529190610c4b90612dd0565b90505f03610c6f5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610c9557610c95612c42565b14610cc8575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612e08565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d019190600401613199565b6020604051808303815f875af1158015610d1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1e9190612e28565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610d855750825b90505f826001600160401b03166001148015610da05750303b155b905081158015610dae575080155b15610dcc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610df657845460ff60401b1916600160401b1785555b610e00878761235d565b8315610e4657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e57612aac565b5f8281525f8051602061372d833981519152602052604090819020815160e0810190925280545f8051602061370d833981519152929190829060ff166005811115610ea457610ea4612c42565b6005811115610eb557610eb5612c42565b8152602001600182018054610ec990612dd0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef590612dd0565b8015610f405780601f10610f1757610100808354040283529160200191610f40565b820191905f5260205f20905b815481529060010190602001808311610f2357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fa661189f565b6001600160a01b038116610fcf57604051631e4fbdf760e01b81525f6004820152602401610499565b610fd8816118fa565b50565b6040515f905f8051602061370d833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb089061101e9086908690613223565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156110e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111109190810190613241565b915091508061113257604051636b2f19e960e01b815260040160405180910390fd5b815115611158578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b031615611194576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f81516026146111d057815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b600281101561121f576111e7816001613313565b6111f2906008613326565b61ffff1684828151811061120857611208612e84565b016020015160f81c901b91909117906001016111d3565b5061ffff8116156112495760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112a457611260816003613313565b61126b906008613326565b63ffffffff168561127d836002613164565b8151811061128d5761128d612e84565b016020015160f81c901b919091179060010161124c565b5063ffffffff8116156112ca57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561131f576112e181601f613313565b6112ec906008613326565b866112f8836006613164565b8151811061130857611308612e84565b016020015160f81c901b91909117906001016112cd565b50949350505050565b60605f8083356020850135601461134487870160408901612d43565b6113516060890189612e3f565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6113d76060850185612e3f565b9050811015611194576113ed6060850185612e3f565b828181106113fd576113fd612e84565b905060200281019061140f9190612e98565b61141d90602081019061333d565b905060301461143f5760405163180ffa0d60e01b815260040160405180910390fd5b8161144d6060860186612e3f565b8381811061145d5761145d612e84565b905060200281019061146f9190612e98565b611479908061333d565b90506114886060870187612e3f565b8481811061149857611498612e84565b90506020028101906114aa9190612e98565b6114b4908061333d565b6114c16060890189612e3f565b868181106114d1576114d1612e84565b90506020028101906114e39190612e98565b6114f190602081019061333d565b6114fe60608b018b612e3f565b8881811061150e5761150e612e84565b90506020028101906115209190612e98565b61153190606081019060400161337f565b6040516020016115479796959493929190613398565b60408051601f1981840301815291905291506001016113ca565b5f61156a612aac565b5f8051602061370d8339815191525f80611586610a9787611085565b9150915080156115ad57604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156115de576115de612c42565b60058111156115ef576115ef612c42565b815260200160018201805461160390612dd0565b80601f016020809104026020016040519081016040528092919081815260200182805461162f90612dd0565b801561167a5780601f106116515761010080835404028352916020019161167a565b820191905f5260205f20905b81548152906001019060200180831161165d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156116e5576116e5612c42565b14158015611706575060018151600581111561170357611703612c42565b14155b1561172757805160405163170cc93360e21b81526104999190600401612e08565b60038151600581111561173c5761173c612c42565b0361174a576004815261174f565b600581525b8360080181602001516040516117659190613035565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156117a9576117a9612c42565b0217905550602082015160018201906117c29082613091565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561186857611868612c42565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118d17f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a485760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611972612aac565b5f8281525f8051602061372d8339815191526020526040808220815160e0810190925280545f8051602061370d83398151915293929190829060ff1660058111156119bf576119bf612c42565b60058111156119d0576119d0612c42565b81526020016001820180546119e490612dd0565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1090612dd0565b8015611a5b5780601f10611a3257610100808354040283529160200191611a5b565b820191905f5260205f20905b815481529060010190602001808311611a3e57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611ac957611ac9612c42565b14611afc575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612e08565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611b4057611b40612c42565b021790555060208201516001820190611b599082613091565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611bf78582612377565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611c9257604051637fab81e560e01b815260040160405180910390fd5b5f8051602061370d83398151915242611cb1606086016040870161337f565b6001600160401b0316111580611ceb5750611ccf6202a30042613164565b611cdf606086016040870161337f565b6001600160401b031610155b15611d2557611d00606085016040860161337f565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b6030611d34602086018661333d565b905014611d6657611d48602085018561333d565b6040516326475b2f60e11b8152610499925060040190815260200190565b611d70848061333d565b90505f03611d9d57611d82848061333d565b604051633e08a12560e11b8152600401610499929190613401565b5f60088201611dac868061333d565b604051611dba929190613223565b90815260200160405180910390205414611df357611dd8848061333d565b60405163a41f772f60e01b8152600401610499929190613401565b611dfd835f6124ce565b6040805160e08101909152815481525f908190611f099060208101611e22898061333d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611e6a908a018a61333d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611eb360608a0160408b0161337f565b6001600160401b03168152602001611ece60608a018a61342f565b611ed790613443565b8152602001611ee960808a018a61342f565b611ef290613443565b8152602001876001600160401b03168152506126a8565b5f82815260068601602052604090209193509150611f278282613091565b508160088401611f37888061333d565b604051611f45929190613223565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611f81908590600401612e16565b6020604051808303815f875af1158015611f9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc19190612e28565b6040805160e081019091529091508060018152602001611fe1898061333d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561207057612070612c42565b0217905550602082015160018201906120899082613091565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580612127888061333d565b604051612135929190613223565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190612173919061337f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8082516027146121d757825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b6002811015612226576121ee816001613313565b6121f9906008613326565b61ffff1685828151811061220f5761220f612e84565b016020015160f81c901b91909117906001016121da565b5061ffff8116156122505760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156122ab57612267816003613313565b612272906008613326565b63ffffffff1686612284836002613164565b8151811061229457612294612e84565b016020015160f81c901b9190911790600101612253565b5063ffffffff81166002146122d357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612328576122ea81601f613313565b6122f5906008613326565b87612301836006613164565b8151811061231157612311612e84565b016020015160f81c901b91909117906001016122d6565b505f8660268151811061233d5761233d612e84565b016020015191976001600160f81b03199092161515965090945050505050565b612365612895565b61236e826128de565b610a5b816128f7565b5f8281525f8051602061372d833981519152602052604081206002015481905f8051602061370d83398151915290600160801b90046001600160401b03166123bf85826124ce565b5f6123c987612908565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124198a858b611036565b6040518263ffffffff1660e01b81526004016124359190612e16565b6020604051808303815f875af1158015612451573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124759190612e28565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8051602061370d8339815191525f6001600160401b038084169085161115612502576124fb838561350a565b905061250f565b61250c848461350a565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061257157506001840154815161256d916001600160401b031690613164565b8210155b15612597576001600160401b0383166060820152818152604081015160208201526125b6565b82816060018181516125a9919061352a565b6001600160401b03169052505b60608101516125c690606461354a565b602082015160018601546001600160401b0392909216916125f19190600160401b900460ff16613326565b101561262157606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b03168160400181815161263c9190613164565b9052506040810180516001600160401b038716919061265c908390613313565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146126d15760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98612712988a986001989297929690959094909390929101613575565b60405160208183030381529060405290505f5b846080015160200151518110156127845781856080015160200151828151811061275157612751612e84565b602002602001015160405160200161276a92919061362f565b60408051601f198184030181529190529150600101612725565b5060a08401518051602091820151516040516127a4938593929101613665565b60405160208183030381529060405290505f5b8460a00151602001515181101561281657818560a001516020015182815181106127e3576127e3612e84565b60200260200101516040516020016127fc92919061362f565b60408051601f1981840301815291905291506001016127b7565b5060c084015160405161282d9183916020016136a0565b604051602081830303815290604052905060028160405161284e9190613035565b602060405180830381855afa158015612869573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061288c9190612e28565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a4857604051631afcd79f60e31b815260040160405180910390fd5b6128e6612895565b6128ee61297d565b610fd881612985565b6128ff612895565b610fd881612a6d565b5f8181525f8051602061372d8339815191526020526040812060020180545f8051602061370d833981519152919060089061295290600160401b90046001600160401b03166136d1565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a48612895565b61298d612895565b80355f8051602061370d83398151915290815560146129b260608401604085016136ec565b60ff1611806129d157506129cc60608301604084016136ec565b60ff16155b15612a05576129e660608301604084016136ec565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b612a1560608301604084016136ec565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612a46604083016020840161337f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fa6612895565b508054612a8190612dd0565b5f825580601f10612a90575050565b601f0160209004905f5260205f2090810190610fd89190612ae9565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612afd575f8155600101612aea565b5090565b5f60208284031215612b11575f80fd5b5035919050565b803563ffffffff81168114612b2b575f80fd5b919050565b5f8060408385031215612b41575f80fd5b82356001600160401b03811115612b56575f80fd5b830160808186031215612b67575f80fd5b9150612b7560208401612b18565b90509250929050565b5f60208284031215612b8e575f80fd5b610a7282612b18565b80356001600160401b0381168114612b2b575f80fd5b5f8060408385031215612bbe575f80fd5b82356001600160401b03811115612bd3575f80fd5b830160a08186031215612be4575f80fd5b9150612b7560208401612b97565b6001600160a01b0381168114610fd8575f80fd5b5f808284036080811215612c18575f80fd5b6060811215612c25575f80fd5b508291506060830135612c3781612bf2565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612c7257634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612c90578181015183820152602001612c78565b50505f910152565b5f8151808452612caf816020860160208601612c76565b601f01601f19169290920160200192915050565b60208152612cd5602082018351612c56565b5f602083015160e06040840152612cf0610100840182612c98565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612d53575f80fd5b8135612d5e81612bf2565b9392505050565b5f8060208385031215612d76575f80fd5b82356001600160401b0380821115612d8c575f80fd5b818501915085601f830112612d9f575f80fd5b813581811115612dad575f80fd5b866020828501011115612dbe575f80fd5b60209290920196919550909350505050565b600181811c90821680612de457607f821691505b602082108103612e0257634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610a758284612c56565b602081525f610a726020830184612c98565b5f60208284031215612e38575f80fd5b5051919050565b5f808335601e19843603018112612e54575f80fd5b8301803591506001600160401b03821115612e6d575f80fd5b6020019150600581901b36038213156124c7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612eac575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612eec57612eec612eb6565b60405290565b604080519081016001600160401b0381118282101715612eec57612eec612eb6565b604051601f8201601f191681016001600160401b0381118282101715612f3c57612f3c612eb6565b604052919050565b5f6001600160401b03821115612f5c57612f5c612eb6565b50601f01601f191660200190565b5f82601f830112612f79575f80fd5b8135612f8c612f8782612f44565b612f14565b818152846020838601011115612fa0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215612fcc575f80fd5b612fd4612eca565b82356001600160401b0380821115612fea575f80fd5b612ff636838701612f6a565b8352602085013591508082111561300b575f80fd5b5061301836828601612f6a565b60208301525061302a60408401612b97565b604082015292915050565b5f8251612eac818460208701612c76565b601f821115610a1e57805f5260205f20601f840160051c8101602085101561306b5750805b601f840160051c820191505b8181101561308a575f8155600101613077565b5050505050565b81516001600160401b038111156130aa576130aa612eb6565b6130be816130b88454612dd0565b84613046565b602080601f8311600181146130f1575f84156130da5750858301515b5f19600386901b1c1916600185901b178555613148565b5f85815260208120601f198616915b8281101561311f57888601518255948401946001909101908401613100565b508582101561313c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a7557610a75613150565b5f63ffffffff80831681810361318f5761318f613150565b6001019392505050565b5f60208083525f84546131ab81612dd0565b806020870152604060018084165f81146131cc57600181146131e857613215565b60ff19851660408a0152604084151560051b8a01019550613215565b895f5260205f205f5b8581101561320c5781548b82018601529083019088016131f1565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612b2b575f80fd5b5f8060408385031215613252575f80fd5b82516001600160401b0380821115613268575f80fd5b908401906060828703121561327b575f80fd5b613283612eca565b8251815260208084015161329681612bf2565b828201526040840151838111156132ab575f80fd5b80850194505087601f8501126132bf575f80fd5b835192506132cf612f8784612f44565b83815288828587010111156132e2575f80fd5b6132f184838301848801612c76565b80604084015250819550613306818801613232565b9450505050509250929050565b81810381811115610a7557610a75613150565b8082028115828204841417610a7557610a75613150565b5f808335601e19843603018112613352575f80fd5b8301803591506001600160401b0382111561336b575f80fd5b6020019150368190038213156124c7575f80fd5b5f6020828403121561338f575f80fd5b610a7282612b97565b5f88516133a9818460208d01612c76565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f8235603e19833603018112612eac575f80fd5b5f60408236031215613453575f80fd5b61345b612ef2565b61346483612b18565b81526020808401356001600160401b0380821115613480575f80fd5b9085019036601f830112613492575f80fd5b8135818111156134a4576134a4612eb6565b8060051b91506134b5848301612f14565b81815291830184019184810190368411156134ce575f80fd5b938501935b838510156134f857843592506134e883612bf2565b82825293850193908501906134d3565b94860194909452509295945050505050565b6001600160401b0382811682821603908082111561119457611194613150565b6001600160401b0381811683821601908082111561119457611194613150565b6001600160401b0381811683821602808216919082811461356d5761356d613150565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516135bb81602a850160208b01612c76565b8651908301906135d281602a840160208b01612c76565b60c087901b6001600160c01b031916602a9290910191820152613604603282018660e01b6001600160e01b0319169052565b61361d603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351613640818460208801612c76565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451613676818460208901612c76565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516136b1818460208801612c76565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b0380831681810361318f5761318f613150565b5f602082840312156136fc575f80fd5b813560ff81168114612d5e575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. @@ -461,7 +469,7 @@ func (_PoAValidatorManager *PoAValidatorManagerCallerSession) WARPMESSENGER() (c // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) func (_PoAValidatorManager *PoAValidatorManagerCaller) GetValidator(opts *bind.CallOpts, validationID [32]byte) (Validator, error) { var out []interface{} err := _PoAValidatorManager.contract.Call(opts, &out, "getValidator", validationID) @@ -478,14 +486,14 @@ func (_PoAValidatorManager *PoAValidatorManagerCaller) GetValidator(opts *bind.C // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) func (_PoAValidatorManager *PoAValidatorManagerSession) GetValidator(validationID [32]byte) (Validator, error) { return _PoAValidatorManager.Contract.GetValidator(&_PoAValidatorManager.CallOpts, validationID) } // GetValidator is a free data retrieval call binding the contract method 0xd5f20ff6. // -// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes32,uint64,uint64,uint64,uint64,uint64)) +// Solidity: function getValidator(bytes32 validationID) view returns((uint8,bytes,uint64,uint64,uint64,uint64,uint64)) func (_PoAValidatorManager *PoAValidatorManagerCallerSession) GetValidator(validationID [32]byte) (Validator, error) { return _PoAValidatorManager.Contract.GetValidator(&_PoAValidatorManager.CallOpts, validationID) } @@ -552,10 +560,10 @@ func (_PoAValidatorManager *PoAValidatorManagerCallerSession) Owner() (common.Ad return _PoAValidatorManager.Contract.Owner(&_PoAValidatorManager.CallOpts) } -// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// RegisteredValidators is a free data retrieval call binding the contract method 0xfd7ac5e7. // -// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) -func (_PoAValidatorManager *PoAValidatorManagerCaller) RegisteredValidators(opts *bind.CallOpts, nodeID [32]byte) ([32]byte, error) { +// Solidity: function registeredValidators(bytes nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCaller) RegisteredValidators(opts *bind.CallOpts, nodeID []byte) ([32]byte, error) { var out []interface{} err := _PoAValidatorManager.contract.Call(opts, &out, "registeredValidators", nodeID) @@ -569,17 +577,17 @@ func (_PoAValidatorManager *PoAValidatorManagerCaller) RegisteredValidators(opts } -// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// RegisteredValidators is a free data retrieval call binding the contract method 0xfd7ac5e7. // -// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) -func (_PoAValidatorManager *PoAValidatorManagerSession) RegisteredValidators(nodeID [32]byte) ([32]byte, error) { +// Solidity: function registeredValidators(bytes nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerSession) RegisteredValidators(nodeID []byte) ([32]byte, error) { return _PoAValidatorManager.Contract.RegisteredValidators(&_PoAValidatorManager.CallOpts, nodeID) } -// RegisteredValidators is a free data retrieval call binding the contract method 0xe7d14c1c. +// RegisteredValidators is a free data retrieval call binding the contract method 0xfd7ac5e7. // -// Solidity: function registeredValidators(bytes32 nodeID) view returns(bytes32) -func (_PoAValidatorManager *PoAValidatorManagerCallerSession) RegisteredValidators(nodeID [32]byte) ([32]byte, error) { +// Solidity: function registeredValidators(bytes nodeID) view returns(bytes32) +func (_PoAValidatorManager *PoAValidatorManagerCallerSession) RegisteredValidators(nodeID []byte) ([32]byte, error) { return _PoAValidatorManager.Contract.RegisteredValidators(&_PoAValidatorManager.CallOpts, nodeID) } @@ -667,44 +675,44 @@ func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeEndV return _PoAValidatorManager.Contract.InitializeEndValidation(&_PoAValidatorManager.TransactOpts, validationID) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8994ab49. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x9ba96b86. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint64 weight) returns(bytes32 validationID) +// Solidity: function initializeValidatorRegistration((bytes,bytes,uint64,(uint32,address[]),(uint32,address[])) registrationInput, uint64 weight) returns(bytes32 validationID) func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorRegistration(opts *bind.TransactOpts, registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorRegistration", registrationInput, weight) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8994ab49. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x9ba96b86. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint64 weight) returns(bytes32 validationID) +// Solidity: function initializeValidatorRegistration((bytes,bytes,uint64,(uint32,address[]),(uint32,address[])) registrationInput, uint64 weight) returns(bytes32 validationID) func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, registrationInput, weight) } -// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x8994ab49. +// InitializeValidatorRegistration is a paid mutator transaction binding the contract method 0x9ba96b86. // -// Solidity: function initializeValidatorRegistration((bytes32,uint64,bytes) registrationInput, uint64 weight) returns(bytes32 validationID) +// Solidity: function initializeValidatorRegistration((bytes,bytes,uint64,(uint32,address[]),(uint32,address[])) registrationInput, uint64 weight) returns(bytes32 validationID) func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorRegistration(registrationInput ValidatorRegistrationInput, weight uint64) (*types.Transaction, error) { return _PoAValidatorManager.Contract.InitializeValidatorRegistration(&_PoAValidatorManager.TransactOpts, registrationInput, weight) } -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. // -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) subnetConversionData, uint32 messageIndex) returns() func (_PoAValidatorManager *PoAValidatorManagerTransactor) InitializeValidatorSet(opts *bind.TransactOpts, subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { return _PoAValidatorManager.contract.Transact(opts, "initializeValidatorSet", subnetConversionData, messageIndex) } -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. // -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) subnetConversionData, uint32 messageIndex) returns() func (_PoAValidatorManager *PoAValidatorManagerSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { return _PoAValidatorManager.Contract.InitializeValidatorSet(&_PoAValidatorManager.TransactOpts, subnetConversionData, messageIndex) } -// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x61e2f490. +// InitializeValidatorSet is a paid mutator transaction binding the contract method 0x20d91b7a. // -// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes32,uint64,bytes)[]) subnetConversionData, uint32 messageIndex) returns() +// Solidity: function initializeValidatorSet((bytes32,bytes32,address,(bytes,bytes,uint64)[]) subnetConversionData, uint32 messageIndex) returns() func (_PoAValidatorManager *PoAValidatorManagerTransactorSession) InitializeValidatorSet(subnetConversionData SubnetConversionData, messageIndex uint32) (*types.Transaction, error) { return _PoAValidatorManager.Contract.InitializeValidatorSet(&_PoAValidatorManager.TransactOpts, subnetConversionData, messageIndex) } @@ -863,15 +871,15 @@ func (it *PoAValidatorManagerInitialValidatorCreatedIterator) Close() error { // PoAValidatorManagerInitialValidatorCreated represents a InitialValidatorCreated event raised by the PoAValidatorManager contract. type PoAValidatorManagerInitialValidatorCreated struct { ValidationID [32]byte - NodeID [32]byte + NodeID common.Hash Weight *big.Int Raw types.Log // Blockchain specific contextual infos } -// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// FilterInitialValidatorCreated is a free log retrieval operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte) (*PoAValidatorManagerInitialValidatorCreatedIterator, error) { +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialValidatorCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte) (*PoAValidatorManagerInitialValidatorCreatedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -889,10 +897,10 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterInitialValidatorC return &PoAValidatorManagerInitialValidatorCreatedIterator{contract: _PoAValidatorManager.contract, event: "InitialValidatorCreated", logs: logs, sub: sub}, nil } -// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// WatchInitialValidatorCreated is a free log subscription operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][32]byte) (event.Subscription, error) { +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialValidatorCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerInitialValidatorCreated, validationID [][32]byte, nodeID [][]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -935,9 +943,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchInitialValidatorCr }), nil } -// ParseInitialValidatorCreated is a log parse operation binding the contract event 0xb815f891730222788b3f8d66249b3a287ce680c3df13866fd9a4f37743ae1014. +// ParseInitialValidatorCreated is a log parse operation binding the contract event 0x9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf. // -// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes32 indexed nodeID, uint256 weight) +// Solidity: event InitialValidatorCreated(bytes32 indexed validationID, bytes indexed nodeID, uint256 weight) func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseInitialValidatorCreated(log types.Log) (*PoAValidatorManagerInitialValidatorCreated, error) { event := new(PoAValidatorManagerInitialValidatorCreated) if err := _PoAValidatorManager.contract.UnpackLog(event, "InitialValidatorCreated", log); err != nil { @@ -1304,17 +1312,17 @@ func (it *PoAValidatorManagerValidationPeriodCreatedIterator) Close() error { // PoAValidatorManagerValidationPeriodCreated represents a ValidationPeriodCreated event raised by the PoAValidatorManager contract. type PoAValidatorManagerValidationPeriodCreated struct { ValidationID [32]byte - NodeID [32]byte + NodeID common.Hash RegisterValidationMessageID [32]byte Weight *big.Int RegistrationExpiry uint64 Raw types.Log // Blockchain specific contextual infos } -// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// FilterValidationPeriodCreated is a free log retrieval operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (*PoAValidatorManagerValidationPeriodCreatedIterator, error) { +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodCreated(opts *bind.FilterOpts, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (*PoAValidatorManagerValidationPeriodCreatedIterator, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1336,10 +1344,10 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) FilterValidationPeriodC return &PoAValidatorManagerValidationPeriodCreatedIterator{contract: _PoAValidatorManager.contract, event: "ValidationPeriodCreated", logs: logs, sub: sub}, nil } -// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// WatchValidationPeriodCreated is a free log subscription operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) -func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][32]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodCreated(opts *bind.WatchOpts, sink chan<- *PoAValidatorManagerValidationPeriodCreated, validationID [][32]byte, nodeID [][]byte, registerValidationMessageID [][32]byte) (event.Subscription, error) { var validationIDRule []interface{} for _, validationIDItem := range validationID { @@ -1386,9 +1394,9 @@ func (_PoAValidatorManager *PoAValidatorManagerFilterer) WatchValidationPeriodCr }), nil } -// ParseValidationPeriodCreated is a log parse operation binding the contract event 0x79b81620b81daf2c08cd5bb3dbb79e75d2d7a87f52171fde5aadc8c47823026e. +// ParseValidationPeriodCreated is a log parse operation binding the contract event 0xb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430. // -// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes32 indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) +// Solidity: event ValidationPeriodCreated(bytes32 indexed validationID, bytes indexed nodeID, bytes32 indexed registerValidationMessageID, uint256 weight, uint64 registrationExpiry) func (_PoAValidatorManager *PoAValidatorManagerFilterer) ParseValidationPeriodCreated(log types.Log) (*PoAValidatorManagerValidationPeriodCreated, error) { event := new(PoAValidatorManagerValidationPeriodCreated) if err := _PoAValidatorManager.contract.UnpackLog(event, "ValidationPeriodCreated", log); err != nil { From 90967aa0f98fe9a55b824c54e7d4804d3f4066c9 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 2 Oct 2024 12:05:05 -0500 Subject: [PATCH 456/545] remove unused file --- contracts/validator-manager/README_OLD.md | 51 ----------------------- 1 file changed, 51 deletions(-) delete mode 100644 contracts/validator-manager/README_OLD.md diff --git a/contracts/validator-manager/README_OLD.md b/contracts/validator-manager/README_OLD.md deleted file mode 100644 index 4c6b7f921..000000000 --- a/contracts/validator-manager/README_OLD.md +++ /dev/null @@ -1,51 +0,0 @@ -# Validator Manager Contract - -`ValidatorManager.sol` defines the abstract staking contract used to manage subnet-only validators, as defined in [ACP-77](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets). - -_Disclaimer:_ The contracts in this directory are still under active development, are unaudited, and should not be used in production. - -## Usage - -The common case for adding or removing a validator from a Subnet's validator set follows these general steps: - -1. Initiate the change through the Validator Manager contract. The Validator Manager contract will construct a Warp message attesting to the change in the validator set. -2. Deliver the Warp message containing the validator set change to the P-Chain. The P-Chain will construct a Warp message acknowledging the change to the validator set. -3. Deliver the Warp message containing the P-Chain acknowledgement back to the Validator Manager contract on the Subnet. The Validator Manager contract finalizes the validator set change. - -### Initializing a Validator Set - -If the Subnet has no validators registered on the P-Chain, then it will not be able to sign a Warp message to add a validator (step 1 above). In this case, Subnet recovery must be performed on the P-Chain, which allows an initial validator set to be specified, along with each validator's expiry. These validators are *not* registered with the Subnet's Validator Manager, and are only used to bootstrap subnet consensus and Warp message signing. The following steps describe how to register validators with the Subnet's Validator Manager, after which the initial validator set specified during Subnet recovery may safely exit the validator set or expire. - -### Registering a Validator - -Validator registration is initiated with a call to `initializeValidatorRegistration` on the concrete Validator Manager contract. The Validator Manager contract constructs a [`RegisterSubnetValidatorMessage`](#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each validator registration request includes all of the information needed to identify the validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. - -The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a [`RegisterSubnetValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#registersubnetvalidatortx). Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The successful `RegisterSubnetValidatorTx` results in a [`SubnetValidatorRegistrationMessage`](#subnetvalidatorregistrationmessage) Warp message indicating that the specified validator was successfully registered on the P-Chain. - -The `SubnetValidatorRegistrationMessage` is delivered to the Validator Manager contract via a call to `completeValidatorRegistration`. For PoS Validator Managers, staking rewards begin accruing at this time. - -#### Handling a Missed Expiry - -In the case of a missed expiry, the `RegisterSubnetValidatorTx` will result in a `SubnetValidatorRegistrationMessage` Warp message with `valid=0`. This serves as proof that the corresponding validation has not started and may never start. The `SubnetValidatorRegistrationMessage` can be provided to the Validator Manager contract by calling `completeEndValidation` with `setWeightMessageType=false`. - -### Exiting the Validator Set - -Validator exit is initiated with a call to `initializeEndValidation` on the Validator Manager contract. For PoS Validator Managers, a [`ValidationUptimeMessage`](#validationuptimemessage) Warp message may optionally be provided in order to calculate the staking rewards; otherwise the validator's uptime will be set to `0`. This proof may be requested directly from the Subnet validators, which will provide it in a `ValidationUptimeMessage` Warp message. Once `initializeEndValidation` is called, staking rewards cease accruing for PoS Validator Managers: the Validator Manager contract constructs a [`SetSubnetValidatorWeightMessage`](#setsubnetvalidatorweightmessage) Warp message, setting the weight to `0`. - -The `SetSubnetValidatorWeightMessage` is delivered to the P-Chain as the payload of a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The P-Chain acknowledges validator exit by signing a `SubnetValidatorRegistrationMessage` with `valid=0`, which is delivered to the Validator Manager by calling `completeEndValidation`. The validation is removed from the contract's state, and for PoS Validator Managers, staking rewards are disbursed and stake is returned. - -#### Disable a Validator Directly on the P-Chain - -ACP-77 also provides a method to disable a validator without interacting with the Subnet directly. The P-Chain transaction [`DisableValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#disablevalidatortx) disables the validator on the P-Chain. The disabled validator's weight will still count towards the Subnet's total weight. - -Disabled Subnet validators can re-activate at any time by increasing their balance with an `IncreaseBalanceTx`. Anyone can call `IncreaseBalanceTx` for any validator on the P-Chain. A disabled validator can only be totally removed from the validator set by a call to `initializeEndValidation`. - -## Types of Validator Managers - -### Proof of Authority - -The Proof of Authority (PoA) validator manager is ownable, and only allows the owner to modify changes to the validator set of the Subnet. Validators are given a weight by the owner, but do not accrue staking rewards. - -### Proof of Stake - -The Proof of Stake (PoS) validator manager allows any validator to register and exit the Subnet validator set. Validators are given a weight based on the amount of stake they provide, and accrue staking rewards based on their uptime. The staking rewards can be either native or erc20 tokens. From 907e41d9a181bfb7c2c81af5de4d1ca468873624 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 3 Oct 2024 13:59:08 -0500 Subject: [PATCH 457/545] use updated bindings --- .../poa_validator_manager.go | 2 +- tests/utils/validator_manager.go | 34 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/tests/flows/validator-manager/poa_validator_manager.go b/tests/flows/validator-manager/poa_validator_manager.go index 7694866aa..28f2afa89 100644 --- a/tests/flows/validator-manager/poa_validator_manager.go +++ b/tests/flows/validator-manager/poa_validator_manager.go @@ -97,7 +97,7 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { _, err = validatorManager.InitializeValidatorRegistration( opts, poavalidatormanager.ValidatorRegistrationInput{ - NodeID: nodeID, + NodeID: nodeID[:], RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), BlsPublicKey: blsPublicKey[:], }, diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 33806a007..e9eeb7ab3 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -262,15 +262,15 @@ func InitializeNativeTokenValidatorSet( signatureAggregator *aggregator.SignatureAggregator, initialValidatorWeight uint64, ) ids.ID { - convertSubnetTxId := ids.GenerateTestID() + nodeID := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} subnetConversionData := nativetokenstakingmanager.SubnetConversionData{ - ConvertSubnetTxID: convertSubnetTxId, + SubnetID: subnetInfo.SubnetID, ValidatorManagerBlockchainID: subnetInfo.BlockchainID, ValidatorManagerAddress: validatorManagerAddress, InitialValidators: []nativetokenstakingmanager.InitialValidator{ { - NodeID: ids.GenerateTestID(), + NodeID: nodeID[:], Weight: initialValidatorWeight, BlsPublicKey: blsPublicKey[:], }, @@ -303,7 +303,7 @@ func InitializeNativeTokenValidatorSet( Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(initialValidatorWeight))) - expectedValidationID := CalculateSubnetConversionValidationId(convertSubnetTxId, 0) + expectedValidationID := CalculateSubnetConversionValidationId(subnetInfo.SubnetID, 0) emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) Expect(emittedValidationID).Should(Equal(expectedValidationID)) @@ -321,15 +321,15 @@ func InitializeERC20TokenValidatorSet( signatureAggregator *aggregator.SignatureAggregator, initialValidatorWeight uint64, ) ids.ID { - convertSubnetTxId := ids.GenerateTestID() + nodeID := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} subnetConversionData := erc20tokenstakingmanager.SubnetConversionData{ - ConvertSubnetTxID: convertSubnetTxId, + SubnetID: subnetInfo.SubnetID, ValidatorManagerBlockchainID: subnetInfo.BlockchainID, ValidatorManagerAddress: validatorManagerAddress, InitialValidators: []erc20tokenstakingmanager.InitialValidator{ { - NodeID: ids.GenerateTestID(), + NodeID: nodeID[:], Weight: initialValidatorWeight, BlsPublicKey: blsPublicKey[:], }, @@ -362,7 +362,7 @@ func InitializeERC20TokenValidatorSet( Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(initialValidatorWeight))) - expectedValidationID := CalculateSubnetConversionValidationId(convertSubnetTxId, 0) + expectedValidationID := CalculateSubnetConversionValidationId(subnetInfo.SubnetID, 0) emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) Expect(emittedValidationID).Should(Equal(expectedValidationID)) @@ -380,15 +380,15 @@ func InitializePoAValidatorSet( signatureAggregator *aggregator.SignatureAggregator, initialValidatorWeight uint64, ) ids.ID { - convertSubnetTxId := ids.GenerateTestID() + nodeID := ids.GenerateTestID() blsPublicKey := [bls.PublicKeyLen]byte{} subnetConversionData := poavalidatormanager.SubnetConversionData{ - ConvertSubnetTxID: convertSubnetTxId, + SubnetID: subnetInfo.SubnetID, ValidatorManagerBlockchainID: subnetInfo.BlockchainID, ValidatorManagerAddress: validatorManagerAddress, InitialValidators: []poavalidatormanager.InitialValidator{ { - NodeID: ids.GenerateTestID(), + NodeID: nodeID[:], Weight: initialValidatorWeight, BlsPublicKey: blsPublicKey[:], }, @@ -422,7 +422,7 @@ func InitializePoAValidatorSet( Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(initialValidatorWeight))) - expectedValidationID := CalculateSubnetConversionValidationId(convertSubnetTxId, 0) + expectedValidationID := CalculateSubnetConversionValidationId(subnetInfo.SubnetID, 0) emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) Expect(emittedValidationID).Should(Equal(expectedValidationID)) @@ -515,7 +515,7 @@ func InitializeNativeValidatorRegistration( tx, err := stakingManager.InitializeValidatorRegistration( opts, nativetokenstakingmanager.ValidatorRegistrationInput{ - NodeID: nodeID, + NodeID: nodeID[:], RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), BlsPublicKey: blsPublicKey[:], }, @@ -558,7 +558,7 @@ func InitializeERC20ValidatorRegistration( tx, err := stakingManager.InitializeValidatorRegistration( opts, erc20tokenstakingmanager.ValidatorRegistrationInput{ - NodeID: nodeID, + NodeID: nodeID[:], RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), BlsPublicKey: blsPublicKey[:], }, @@ -591,7 +591,7 @@ func InitializePoAValidatorRegistration( tx, err := validatorManager.InitializeValidatorRegistration( opts, poavalidatormanager.ValidatorRegistrationInput{ - NodeID: nodeID, + NodeID: nodeID[:], RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), BlsPublicKey: blsPublicKey[:], }, @@ -1617,9 +1617,9 @@ func WaitMinStakeDuration( ) } -func CalculateSubnetConversionValidationId(convertSubnetTxID ids.ID, validatorIdx uint32) ids.ID { +func CalculateSubnetConversionValidationId(subnetID ids.ID, validatorIdx uint32) ids.ID { preImage := make([]byte, 36) - copy(preImage[0:32], convertSubnetTxID[:]) + copy(preImage[0:32], subnetID[:]) binary.BigEndian.PutUint32(preImage[32:36], validatorIdx) return sha256.Sum256(preImage) } From 506c603973a77fa8106754a29f268311061cf8ab Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 3 Oct 2024 14:17:26 -0500 Subject: [PATCH 458/545] bump avago --- go.mod | 39 +++++----- go.sum | 76 ++++++++++--------- .../validator-manager/erc20_delegation.go | 4 +- .../validator-manager/native_delegation.go | 4 +- tests/utils/chain.go | 9 ++- tests/utils/validator_manager.go | 32 ++++---- 6 files changed, 90 insertions(+), 74 deletions(-) diff --git a/go.mod b/go.mod index da15b08a4..291674ef2 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,20 @@ module github.com/ava-labs/teleporter -go 1.22.6 +go 1.22.8 require ( - github.com/ava-labs/avalanchego v1.11.11-0.20240916181957-b328a0503042 + github.com/ava-labs/avalanchego v1.12.0-initial-poc.2 github.com/supranational/blst v0.3.11 // indirect ) require ( - github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814200841-1c435873fd12 - github.com/ava-labs/subnet-evm v0.6.9-0.20240813192818-4d5aebb6decc - github.com/ethereum/go-ethereum v1.13.8 + github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6 + github.com/ava-labs/subnet-evm v0.6.10 + github.com/ethereum/go-ethereum v1.13.14 github.com/onsi/ginkgo/v2 v2.20.2 github.com/onsi/gomega v1.34.2 github.com/pkg/errors v0.9.1 - github.com/prometheus/client_golang v1.19.1 + github.com/prometheus/client_golang v1.20.4 github.com/spf13/cobra v1.8.1 github.com/stretchr/testify v1.9.0 go.uber.org/zap v1.27.0 @@ -25,7 +25,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-fix-genesis-upgrade // 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 @@ -48,7 +48,7 @@ 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.0-20190710130421-bcb5799ab5e5 // 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 @@ -56,7 +56,7 @@ require ( github.com/go-cmd/cmd v1.4.1 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-sourcemap/sourcemap v2.1.3+incompatible // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect @@ -68,20 +68,21 @@ 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.18.0 // indirect github.com/hashicorp/go-bexpr v0.1.10 // indirect github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect + github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.4 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackpal/gateway v1.0.6 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect - github.com/klauspost/compress v1.15.15 // indirect + github.com/klauspost/compress v1.17.9 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -92,14 +93,16 @@ require ( github.com/mitchellh/pointerstructure v1.2.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/mr-tron/base58 v1.2.0 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/pingcap/errors v0.11.4 // indirect github.com/pires/go-proxyproto v0.6.2 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.48.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/procfs v0.15.1 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/rs/cors v1.7.0 // indirect @@ -139,9 +142,9 @@ require ( golang.org/x/text v0.17.0 // indirect golang.org/x/time v0.3.0 // indirect gonum.org/v1/gonum v0.11.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect - google.golang.org/grpc v1.65.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect + google.golang.org/grpc v1.67.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect diff --git a/go.sum b/go.sum index e3aceb38b..ad1172fc2 100644 --- a/go.sum +++ b/go.sum @@ -56,14 +56,14 @@ 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-0.20240916181957-b328a0503042 h1:Hk9sK9TPPXoVyIvl4rC+v1HF2M2BvjINCLtLmkbqWMo= -github.com/ava-labs/avalanchego v1.11.11-0.20240916181957-b328a0503042/go.mod h1:8pnf2At/q0LRq5dvYJYn3CkhKzZNHRd5pjARC9psu+g= -github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814200841-1c435873fd12 h1:vcCa4wZTDPObQFauhjtkAqbHWty3vXQaoPJMFgptnWM= -github.com/ava-labs/awm-relayer v1.4.0-rc.2.0.20240814200841-1c435873fd12/go.mod h1:cpfI3E4g0NsEjhJ9VHJ4xMLyOOAqqL1by0MhTIito/c= -github.com/ava-labs/coreth v0.13.8-fix-genesis-upgrade h1:xWsvSGtZcGna3B2BLU2BvK3qskbcc9ZNtgC0ck91CkI= -github.com/ava-labs/coreth v0.13.8-fix-genesis-upgrade/go.mod h1:Ouul9dJouniUIJVX1gDqx8CrHyGvmwZkK28mrgKb/4I= -github.com/ava-labs/subnet-evm v0.6.9-0.20240813192818-4d5aebb6decc h1:FZ09oIkRnrI+FLTReCKfWqNHFDrNQVr629NTkdfr22Y= -github.com/ava-labs/subnet-evm v0.6.9-0.20240813192818-4d5aebb6decc/go.mod h1:nWP5feXpdvF4Kv10V0vrP9bYqt5yYvp2I5bBXY2xa7U= +github.com/ava-labs/avalanchego v1.12.0-initial-poc.2 h1:Xsb9XUXW1wjtP2yULhpknW9Ghobm2U3PW3z1MqP0SkY= +github.com/ava-labs/avalanchego v1.12.0-initial-poc.2/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= +github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6 h1:v7k5wQxcvnYcMaz+zoO1OLAcU8REDD1EhfPZdl4Q+aI= +github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6/go.mod h1:sSXpQtgiduMdZw5IVTSa1v418VCjb8GDLyrcGwJZ/HE= +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.10 h1:uIh6bFMA4GCMVMQ3agBPxTMlYHL8FBR5FrhMR+drfKI= +github.com/ava-labs/subnet-evm v0.6.10/go.mod h1:dw4kg0o58dvYlndj2ZcwB7hioRc1kjg00yXYrcSmnj8= 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= @@ -175,12 +175,12 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= github.com/ethereum/c-kzg-4844 v0.4.0 h1:3MS1s4JtA868KpJxroZoepdV0ZKBp3u/O5HcZ7R3nlY= github.com/ethereum/c-kzg-4844 v0.4.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.13.8 h1:1od+thJel3tM52ZUNQwvpYOeRHlbkVFZ5S8fhi0Lgsg= -github.com/ethereum/go-ethereum v1.13.8/go.mod h1:sc48XYQxCzH3fG9BcrXCOOgQk2JfZzNAmIKnceogzsA= +github.com/ethereum/go-ethereum v1.13.14 h1:EwiY3FZP94derMCIam1iW4HFVrSgIcpsu0HwTQtm6CQ= +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.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= -github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +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= @@ -213,8 +213,9 @@ github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= @@ -233,8 +234,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= -github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.2 h1:1+mZ9upx1Dh6FmUTFR1naJ77miKiXgALjWOZ3NVFPmY= +github.com/golang/glog v1.2.2/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -318,8 +319,8 @@ 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= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= @@ -331,10 +332,12 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw= -github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6wn4Ej8vjuVGxeHdan+bRb2ebyv4= +github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= @@ -378,8 +381,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= +github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -436,6 +439,8 @@ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3Rllmb github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= @@ -480,15 +485,15 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= -github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= +github.com/prometheus/client_golang v1.20.4 h1:Tgh3Yr67PaOv/uTqloMsCEdeuFTatm5zIq5+qNN23vI= +github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= -github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= +github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= +github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -808,6 +813,7 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -963,10 +969,10 @@ google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= -google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 h1:wKguEg1hsxI2/L3hUYrpo1RVi48K+uTyzKqprwLXsb8= +google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= @@ -985,8 +991,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw= +google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/tests/flows/validator-manager/erc20_delegation.go b/tests/flows/validator-manager/erc20_delegation.go index e8323de05..6e557cb71 100644 --- a/tests/flows/validator-manager/erc20_delegation.go +++ b/tests/flows/validator-manager/erc20_delegation.go @@ -118,7 +118,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSetSubnetValidatorWeightMessage( + utils.ValidateSubnetValidatorWeightMessage( signedWarpMessage, validationID, newValidatorWeight, @@ -180,7 +180,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, validatorWeight, 2) + utils.ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, validatorWeight, 2) // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( diff --git a/tests/flows/validator-manager/native_delegation.go b/tests/flows/validator-manager/native_delegation.go index 952852abc..d43d1f95f 100644 --- a/tests/flows/validator-manager/native_delegation.go +++ b/tests/flows/validator-manager/native_delegation.go @@ -118,7 +118,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSetSubnetValidatorWeightMessage( + utils.ValidateSubnetValidatorWeightMessage( signedWarpMessage, validationID, newValidatorWeight, @@ -180,7 +180,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, validatorWeight, 2) + utils.ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, validatorWeight, 2) // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( diff --git a/tests/utils/chain.go b/tests/utils/chain.go index ac75d4d02..dfa3e991c 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -24,6 +24,7 @@ import ( "github.com/ava-labs/awm-relayer/peers" "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" sigAggConfig "github.com/ava-labs/awm-relayer/signature-aggregator/config" + "github.com/ava-labs/awm-relayer/signature-aggregator/metrics" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/eth/tracers" @@ -559,11 +560,17 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu constants.DefaultNetworkMaximumInboundTimeout, ) Expect(err).Should(BeNil()) - return aggregator.NewSignatureAggregator( + agg, err := aggregator.NewSignatureAggregator( appRequestNetwork, logger, + 1024, + metrics.NewSignatureAggregatorMetrics(prometheus.DefaultRegisterer), messageCreator, + // Setting the etnaTime to a minute ago so that the post-etna code path is used in the test + time.Now().Add(-1*time.Minute), ) + Expect(err).Should(BeNil()) + return agg } // Funded key must have admin access to set new admin. diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index e9eeb7ab3..e23acd7a3 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -13,7 +13,7 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" - warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/messages" + warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" "github.com/ava-labs/subnet-evm/accounts/abi/bind" @@ -1294,7 +1294,7 @@ func InitializeAndCompleteEndNativeValidation( Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) - ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, nonce) + ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, nonce) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( @@ -1359,7 +1359,7 @@ func InitializeAndCompleteEndERC20Validation( Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) - ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, nonce) + ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, nonce) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( @@ -1424,7 +1424,7 @@ func InitializeAndCompleteEndPoAValidation( Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) - ValidateSetSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, nonce) + ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, nonce) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( @@ -1496,9 +1496,9 @@ func ConstructSubnetValidatorWeightUpdateMessage( network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { - updatePayload, err := warpMessages.NewSubnetValidatorWeightUpdate(validationID, nonce, weight) + payload, err := warpMessages.NewSubnetValidatorWeight(validationID, nonce, weight) Expect(err).Should(BeNil()) - updateAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), updatePayload.Bytes()) + updateAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), payload.Bytes()) Expect(err).Should(BeNil()) updateUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( network.GetNetworkID(), @@ -1567,17 +1567,17 @@ func ValidateRegisterSubnetValidatorMessage( var payloadInterface warpMessages.Payload ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) Expect(err).Should(BeNil()) - registerValidatorPayload, ok := payloadInterface.(*warpMessages.RegisterSubnetValidator) + payload, ok := payloadInterface.(*warpMessages.RegisterSubnetValidator) Expect(ok).Should(BeTrue()) Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) - Expect(registerValidatorPayload.NodeID).Should(Equal(nodeID)) - Expect(registerValidatorPayload.Weight).Should(Equal(weight)) - Expect(registerValidatorPayload.SubnetID).Should(Equal(subnetID)) - Expect(registerValidatorPayload.BlsPubKey[:]).Should(Equal(blsPublicKey[:])) + Expect(payload.NodeID).Should(Equal(nodeID)) + Expect(payload.Weight).Should(Equal(weight)) + Expect(payload.SubnetID).Should(Equal(subnetID)) + Expect(payload.BLSPublicKey[:]).Should(Equal(blsPublicKey[:])) } -func ValidateSetSubnetValidatorWeightMessage( +func ValidateSubnetValidatorWeightMessage( signedWarpMessage *avalancheWarp.Message, validationID ids.ID, weight uint64, @@ -1589,13 +1589,13 @@ func ValidateSetSubnetValidatorWeightMessage( var payloadInterface warpMessages.Payload ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) Expect(err).Should(BeNil()) - registerValidatorPayload, ok := payloadInterface.(*warpMessages.SetSubnetValidatorWeight) + payload, ok := payloadInterface.(*warpMessages.SubnetValidatorWeight) Expect(ok).Should(BeTrue()) Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) - Expect(registerValidatorPayload.ValidationID).Should(Equal(validationID)) - Expect(registerValidatorPayload.Weight).Should(Equal(weight)) - Expect(registerValidatorPayload.Nonce).Should(Equal(nonce)) + Expect(payload.ValidationID).Should(Equal(validationID)) + Expect(payload.Weight).Should(Equal(weight)) + Expect(payload.Nonce).Should(Equal(nonce)) } func WaitMinStakeDuration( From 29214d21ed6039474b0ccb3c3c0c5e03cc7ccf24 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 3 Oct 2024 14:42:38 -0500 Subject: [PATCH 459/545] version extracts rc tags --- scripts/versions.sh | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/versions.sh b/scripts/versions.sh index fe3fbd81a..efe3fb248 100755 --- a/scripts/versions.sh +++ b/scripts/versions.sh @@ -18,9 +18,13 @@ function getDepVersion() { function extract_commit() { local version=$1 - if [[ $version == *-* ]]; then + + # Regex for a commit hash (assumed to be a 12+ character hex string) + commit_hash_regex="-([0-9a-f]{12,})$" + + if [[ "$version" =~ $commit_hash_regex ]]; then # Extract the substring after the last '-' - version=${version##*-} + version=${BASH_REMATCH[1]} fi echo "$version" } From 85daef070b20923c92c56ec65ca05d053a71bfa6 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 3 Oct 2024 15:09:44 -0500 Subject: [PATCH 460/545] increase timeout to 120s --- tests/local/network.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/local/network.go b/tests/local/network.go index d2d4ce28b..b8714cd73 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -55,7 +55,7 @@ type LocalNetwork struct { const ( fundedKeyStr = "56289e99c94b6912bfc12adc093c9b51124f0dc54ac7a766b2bc5ccf558d8027" - timeout = 60 * time.Second + timeout = 120 * time.Second ) type SubnetSpec struct { From 3f0b28719c3aa4edcbfea1cfca852543f0d85ec4 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 4 Oct 2024 16:42:14 -0500 Subject: [PATCH 461/545] wip: convertsubnet working --- go.mod | 2 +- go.sum | 4 +- .../validator-manager/erc20_delegation.go | 23 +- .../validator-manager/erc20_token_staking.go | 205 ++++++++++++++- .../validator-manager/native_delegation.go | 1 - .../validator-manager/native_token_staking.go | 1 - tests/flows/validator-manager/poa_to_pos.go | 1 - .../poa_validator_manager.go | 1 - tests/interfaces/local_network.go | 2 + tests/local/e2e_test.go | 237 +++++++++--------- tests/local/network.go | 67 ++++- tests/utils/chain.go | 6 + tests/utils/validator_manager.go | 139 ++++++---- 13 files changed, 490 insertions(+), 199 deletions(-) diff --git a/go.mod b/go.mod index 8e8d60871..b5f26550b 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/ava-labs/teleporter go 1.22.8 require ( - github.com/ava-labs/avalanchego v1.12.0-initial-poc.2 + github.com/ava-labs/avalanchego v1.12.0-initial-poc.3 github.com/supranational/blst v0.3.11 // indirect ) diff --git a/go.sum b/go.sum index 401eb95f2..2cbb2c7e3 100644 --- a/go.sum +++ b/go.sum @@ -56,8 +56,8 @@ 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.12.0-initial-poc.2 h1:Xsb9XUXW1wjtP2yULhpknW9Ghobm2U3PW3z1MqP0SkY= -github.com/ava-labs/avalanchego v1.12.0-initial-poc.2/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= +github.com/ava-labs/avalanchego v1.12.0-initial-poc.3 h1:JfVooBCdMzpeGUT9/phJNl2GHflkGehlMJokXeWKa2A= +github.com/ava-labs/avalanchego v1.12.0-initial-poc.3/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6 h1:v7k5wQxcvnYcMaz+zoO1OLAcU8REDD1EhfPZdl4Q+aI= github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6/go.mod h1:sSXpQtgiduMdZw5IVTSa1v418VCjb8GDLyrcGwJZ/HE= github.com/ava-labs/coreth v0.13.8 h1:f14X3KgwHl9LwzfxlN6S4bbn5VA2rhEsNnHaRLSTo/8= diff --git a/tests/flows/validator-manager/erc20_delegation.go b/tests/flows/validator-manager/erc20_delegation.go index 6e557cb71..cbaa3f828 100644 --- a/tests/flows/validator-manager/erc20_delegation.go +++ b/tests/flows/validator-manager/erc20_delegation.go @@ -33,7 +33,6 @@ func ERC20Delegation(network interfaces.LocalNetwork) { cChainInfo.NodeURIs[0], []ids.ID{ subnetAInfo.SubnetID, - ids.Empty, // Primary network subnet ID }, ) ctx := context.Background() @@ -46,17 +45,17 @@ func ERC20Delegation(network interfaces.LocalNetwork) { pChainInfo, ) - _ = utils.InitializeERC20TokenValidatorSet( - ctx, - fundedKey, - subnetAInfo, - pChainInfo, - stakingManager, - stakingManagerAddress, - network, - signatureAggregator, - utils.DefaultMinStakeAmount*10, - ) + // _ = utils.InitializeERC20TokenValidatorSet( + // ctx, + // fundedKey, + // subnetAInfo, + // pChainInfo, + // stakingManager, + // stakingManagerAddress, + // network, + // signatureAggregator, + // utils.DefaultMinStakeAmount*10, + // ) // // Register a validator diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index 6b2465f4d..fa44aa0dd 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -2,9 +2,20 @@ package staking import ( "context" + "log" "math/big" + "sort" + "time" + "github.com/ava-labs/avalanchego/api/info" "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/utils/formatting/address" + "github.com/ava-labs/avalanchego/utils/units" + "github.com/ava-labs/avalanchego/vms/components/avax" + "github.com/ava-labs/avalanchego/vms/platformvm/stakeable" + "github.com/ava-labs/avalanchego/vms/platformvm/txs" + "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" + "github.com/ava-labs/avalanchego/vms/secp256k1fx" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" @@ -38,7 +49,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { cChainInfo.NodeURIs[0], []ids.ID{ subnetAInfo.SubnetID, - ids.Empty, // Primary network subnet ID }, ) ctx := context.Background() @@ -51,6 +61,191 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { pChainInfo, ) + var nodes []utils.Node + var weights []uint64 + for _, uri := range subnetAInfo.NodeURIs { + infoClient := info.NewClient(uri) + nodeID, nodePoP, err := infoClient.GetNodeID(ctx) + Expect(err).Should(BeNil()) + nodes = append(nodes, utils.Node{ + NodeID: nodeID, + NodePoP: nodePoP, + }) + weights = append(weights, units.Schmeckle) + + // Remove the current validators before converting the subnet + _, err = network.GetPChainWallet().IssueRemoveSubnetValidatorTx( + nodeID, + subnetAInfo.SubnetID, + ) + Expect(err).Should(BeNil()) + } + + // Sort the nodeIDs so that the subnet conversion ID matches the P-Chain + log.Println("nodes before sorting") + log.Println("nodeID1: ", nodes[0].NodeID.Bytes()) + log.Println("nodeID2: ", nodes[1].NodeID.Bytes()) + sort.Slice(nodes, func(i, j int) bool { + return string(nodes[i].NodeID.Bytes()) < string(nodes[j].NodeID.Bytes()) + }) + log.Println("nodes after sorting") + log.Println("nodeID1: ", nodes[0].NodeID.Bytes()) + log.Println("nodeID2: ", nodes[1].NodeID.Bytes()) + + // TODONOW: issue a P-Chain ConvertSubnetTx + destAddrStr := "P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u" + destAddr, err := address.ParseToID(destAddrStr) + Expect(err).Should(BeNil()) + // vdrs := make([]*txs.ConvertSubnetValidator, len(nodes)) + // for i, node := range nodes { + // vdrs[i] = &txs.ConvertSubnetValidator{ + // NodeID: node.NodeID.Bytes(), + // Weight: weights[i], + // Balance: units.Avax * 100, + // Signer: *node.NodePoP, + // RemainingBalanceOwner: message.PChainOwner{ + // Threshold: 1, + // Addresses: []ids.ShortID{destAddr}, + // }, + // DeactivationOwner: message.PChainOwner{ + // Threshold: 1, + // Addresses: []ids.ShortID{destAddr}, + // }, + // } + // } + vdrs := []*txs.ConvertSubnetValidator{ + { + NodeID: nodes[0].NodeID.Bytes(), + Weight: weights[0], + Balance: units.Avax * 100, + Signer: *nodes[0].NodePoP, + RemainingBalanceOwner: message.PChainOwner{ + Threshold: 1, + Addresses: []ids.ShortID{destAddr}, + }, + DeactivationOwner: message.PChainOwner{ + Threshold: 1, + Addresses: []ids.ShortID{destAddr}, + }, + }, + { + NodeID: nodes[1].NodeID.Bytes(), + Weight: weights[1], + Balance: units.Avax * 100, + Signer: *nodes[1].NodePoP, + RemainingBalanceOwner: message.PChainOwner{ + Threshold: 1, + Addresses: []ids.ShortID{destAddr}, + }, + DeactivationOwner: message.PChainOwner{ + Threshold: 1, + Addresses: []ids.ShortID{destAddr}, + }, + }, + } + _, err = network.GetPChainWallet().IssueConvertSubnetTx( + subnetAInfo.SubnetID, + subnetAInfo.BlockchainID, + stakingManagerAddress[:], + vdrs, + ) + Expect(err).Should(BeNil()) + + // DEBUG + log.Println("convert subnet tx info") + data := message.SubnetConversionData{ + SubnetID: subnetAInfo.SubnetID, + ManagerChainID: subnetAInfo.BlockchainID, + ManagerAddress: stakingManagerAddress[:], + Validators: []message.SubnetConversionValidatorData{ + { + NodeID: nodes[0].NodeID.Bytes(), + BLSPublicKey: nodes[0].NodePoP.PublicKey, + Weight: weights[0], + }, + { + NodeID: nodes[1].NodeID.Bytes(), + BLSPublicKey: nodes[1].NodePoP.PublicKey, + Weight: weights[1], + }, + }, + } + conversionID, _ := message.SubnetConversionID(data) + log.Println(data) + log.Printf("conversionID: %s\n", conversionID.String()) + data = message.SubnetConversionData{ + SubnetID: subnetAInfo.SubnetID, + ManagerChainID: subnetAInfo.BlockchainID, + ManagerAddress: stakingManagerAddress[:], + Validators: []message.SubnetConversionValidatorData{ + { + NodeID: nodes[1].NodeID.Bytes(), + BLSPublicKey: nodes[1].NodePoP.PublicKey, + Weight: weights[1], + }, + { + NodeID: nodes[0].NodeID.Bytes(), + BLSPublicKey: nodes[0].NodePoP.PublicKey, + Weight: weights[0], + }, + }, + } + conversionID, _ = message.SubnetConversionID(data) + log.Println(data) + log.Printf("conversionID: %s\n", conversionID.String()) + // END DEBUG + + // // Workaround current block map rules + time.Sleep(30 * time.Second) + + pBuilder := network.GetPChainWallet().Builder() + pContext := pBuilder.Context() + avaxAssetID := pContext.AVAXAssetID + locktime := uint64(time.Date(2030, 1, 1, 0, 0, 0, 0, time.UTC).Unix()) + amount := 500 * units.MilliAvax + _, err = network.GetPChainWallet().IssueBaseTx([]*avax.TransferableOutput{ + { + Asset: avax.Asset{ + ID: avaxAssetID, + }, + Out: &stakeable.LockOut{ + Locktime: locktime, + TransferableOut: &secp256k1fx.TransferOutput{ + Amt: amount, + OutputOwners: secp256k1fx.OutputOwners{ + Threshold: 1, + Addrs: []ids.ShortID{ + destAddr, + }, + }, + }, + }, + }, + }) + Expect(err).Should(BeNil()) + _, err = network.GetPChainWallet().IssueBaseTx([]*avax.TransferableOutput{ + { + Asset: avax.Asset{ + ID: avaxAssetID, + }, + Out: &stakeable.LockOut{ + Locktime: locktime, + TransferableOut: &secp256k1fx.TransferOutput{ + Amt: amount, + OutputOwners: secp256k1fx.OutputOwners{ + Threshold: 1, + Addrs: []ids.ShortID{ + destAddr, + }, + }, + }, + }, + }, + }) + Expect(err).Should(BeNil()) + // End workaround + + // Initialize the validator set on the subnet _ = utils.InitializeERC20TokenValidatorSet( ctx, fundedKey, @@ -60,9 +255,15 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakingManagerAddress, network, signatureAggregator, - utils.DefaultMinStakeAmount*10, + nodes, + weights, ) + // + // Delist all initial validators + // + Expect(false).Should(BeTrue()) + // // Register a validator // diff --git a/tests/flows/validator-manager/native_delegation.go b/tests/flows/validator-manager/native_delegation.go index d43d1f95f..d584064d2 100644 --- a/tests/flows/validator-manager/native_delegation.go +++ b/tests/flows/validator-manager/native_delegation.go @@ -33,7 +33,6 @@ func NativeDelegation(network interfaces.LocalNetwork) { cChainInfo.NodeURIs[0], []ids.ID{ subnetAInfo.SubnetID, - ids.Empty, // Primary network subnet ID }, ) ctx := context.Background() diff --git a/tests/flows/validator-manager/native_token_staking.go b/tests/flows/validator-manager/native_token_staking.go index f5035097f..f6ec14ba3 100644 --- a/tests/flows/validator-manager/native_token_staking.go +++ b/tests/flows/validator-manager/native_token_staking.go @@ -38,7 +38,6 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { cChainInfo.NodeURIs[0], []ids.ID{ subnetAInfo.SubnetID, - ids.Empty, // Primary network subnet ID }, ) ctx := context.Background() diff --git a/tests/flows/validator-manager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go index 6f50a384b..af2bb8072 100644 --- a/tests/flows/validator-manager/poa_to_pos.go +++ b/tests/flows/validator-manager/poa_to_pos.go @@ -44,7 +44,6 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { cChainInfo.NodeURIs[0], []ids.ID{ subnetAInfo.SubnetID, - ids.Empty, // Primary network subnet ID }, ) diff --git a/tests/flows/validator-manager/poa_validator_manager.go b/tests/flows/validator-manager/poa_validator_manager.go index 28f2afa89..a7733b449 100644 --- a/tests/flows/validator-manager/poa_validator_manager.go +++ b/tests/flows/validator-manager/poa_validator_manager.go @@ -45,7 +45,6 @@ func PoAValidatorManager(network interfaces.LocalNetwork) { cChainInfo.NodeURIs[0], []ids.ID{ subnetAInfo.SubnetID, - ids.Empty, // Primary network subnet ID }, ) diff --git a/tests/interfaces/local_network.go b/tests/interfaces/local_network.go index 3206ee3c4..dc7235593 100644 --- a/tests/interfaces/local_network.go +++ b/tests/interfaces/local_network.go @@ -6,6 +6,7 @@ import ( "github.com/ava-labs/avalanchego/ids" avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" + pwallet "github.com/ava-labs/avalanchego/wallet/chain/p/wallet" "github.com/ava-labs/subnet-evm/core/types" "github.com/ethereum/go-ethereum/common" ) @@ -36,4 +37,5 @@ type LocalNetwork interface { ) GetNetworkID() uint32 Dir() string + GetPChainWallet() pwallet.Wallet } diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go index 8939df42c..aad4ccefa 100644 --- a/tests/local/e2e_test.go +++ b/tests/local/e2e_test.go @@ -9,9 +9,6 @@ import ( "testing" "time" - "github.com/ava-labs/teleporter/tests/flows/governance" - "github.com/ava-labs/teleporter/tests/flows/teleporter" - "github.com/ava-labs/teleporter/tests/flows/teleporter/registry" validatorManager "github.com/ava-labs/teleporter/tests/flows/validator-manager" deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" "github.com/ethereum/go-ethereum/log" @@ -110,126 +107,126 @@ var _ = ginkgo.AfterSuite(func() { }) var _ = ginkgo.Describe("[Teleporter integration tests]", func() { - // Teleporter tests - ginkgo.It("Send a message from Subnet A to Subnet B, and one from B to A", - ginkgo.Label(teleporterMessengerLabel), - func() { - teleporter.BasicSendReceive(LocalNetworkInstance) - }) - ginkgo.It("Deliver to the wrong chain", - ginkgo.Label(teleporterMessengerLabel), - func() { - teleporter.DeliverToWrongChain(LocalNetworkInstance) - }) - ginkgo.It("Deliver to non-existent contract", - ginkgo.Label(teleporterMessengerLabel), - func() { - teleporter.DeliverToNonExistentContract(LocalNetworkInstance) - }) - ginkgo.It("Retry successful execution", - ginkgo.Label(teleporterMessengerLabel), - func() { - teleporter.RetrySuccessfulExecution(LocalNetworkInstance) - }) - ginkgo.It("Unallowed relayer", - ginkgo.Label(teleporterMessengerLabel), - func() { - teleporter.UnallowedRelayer(LocalNetworkInstance) - }) - ginkgo.It("Relay message twice", - ginkgo.Label(teleporterMessengerLabel), - func() { - teleporter.RelayMessageTwice(LocalNetworkInstance) - }) - ginkgo.It("Add additional fee amount", - ginkgo.Label(teleporterMessengerLabel), - func() { - teleporter.AddFeeAmount(LocalNetworkInstance) - }) - ginkgo.It("Send specific receipts", - ginkgo.Label(teleporterMessengerLabel), - func() { - teleporter.SendSpecificReceipts(LocalNetworkInstance) - }) - ginkgo.It("Insufficient gas", - ginkgo.Label(teleporterMessengerLabel), - func() { - teleporter.InsufficientGas(LocalNetworkInstance) - }) - ginkgo.It("Resubmit altered message", - ginkgo.Label(teleporterMessengerLabel), - func() { - teleporter.ResubmitAlteredMessage(LocalNetworkInstance) - }) - ginkgo.It("Calculate Teleporter message IDs", - ginkgo.Label(utilsLabel), - func() { - teleporter.CalculateMessageID(LocalNetworkInstance) - }) - ginkgo.It("Relayer modifies message", - ginkgo.Label(teleporterMessengerLabel), - func() { - teleporter.RelayerModifiesMessage(LocalNetworkInstance) - }) - ginkgo.It("Validator churn", - ginkgo.Label(teleporterMessengerLabel), - func() { - teleporter.ValidatorChurn(LocalNetworkInstance) - }) - - // Teleporter Registry tests - ginkgo.It("Teleporter registry", - ginkgo.Label(upgradabilityLabel), - func() { - registry.TeleporterRegistry(LocalNetworkInstance) - }) - ginkgo.It("Check upgrade access", - ginkgo.Label(upgradabilityLabel), - func() { - registry.CheckUpgradeAccess(LocalNetworkInstance) - }) - ginkgo.It("Pause and Unpause Teleporter", - ginkgo.Label(upgradabilityLabel), - func() { - registry.PauseTeleporter(LocalNetworkInstance) - }) - - // Governance tests - ginkgo.It("Deliver ValidatorSetSig signed message", - ginkgo.Label(validatorSetSigLabel), - func() { - governance.ValidatorSetSig(LocalNetworkInstance) - }) - - // Validator Manager tests - ginkgo.It("Native token staking manager", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManager.NativeTokenStakingManager(LocalNetworkInstance) - }) + // // Teleporter tests + // ginkgo.It("Send a message from Subnet A to Subnet B, and one from B to A", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // teleporter.BasicSendReceive(LocalNetworkInstance) + // }) + // ginkgo.It("Deliver to the wrong chain", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // teleporter.DeliverToWrongChain(LocalNetworkInstance) + // }) + // ginkgo.It("Deliver to non-existent contract", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // teleporter.DeliverToNonExistentContract(LocalNetworkInstance) + // }) + // ginkgo.It("Retry successful execution", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // teleporter.RetrySuccessfulExecution(LocalNetworkInstance) + // }) + // ginkgo.It("Unallowed relayer", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // teleporter.UnallowedRelayer(LocalNetworkInstance) + // }) + // ginkgo.It("Relay message twice", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // teleporter.RelayMessageTwice(LocalNetworkInstance) + // }) + // ginkgo.It("Add additional fee amount", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // teleporter.AddFeeAmount(LocalNetworkInstance) + // }) + // ginkgo.It("Send specific receipts", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // teleporter.SendSpecificReceipts(LocalNetworkInstance) + // }) + // ginkgo.It("Insufficient gas", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // teleporter.InsufficientGas(LocalNetworkInstance) + // }) + // ginkgo.It("Resubmit altered message", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // teleporter.ResubmitAlteredMessage(LocalNetworkInstance) + // }) + // ginkgo.It("Calculate Teleporter message IDs", + // ginkgo.Label(utilsLabel), + // func() { + // teleporter.CalculateMessageID(LocalNetworkInstance) + // }) + // ginkgo.It("Relayer modifies message", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // teleporter.RelayerModifiesMessage(LocalNetworkInstance) + // }) + // ginkgo.It("Validator churn", + // ginkgo.Label(teleporterMessengerLabel), + // func() { + // teleporter.ValidatorChurn(LocalNetworkInstance) + // }) + + // // Teleporter Registry tests + // ginkgo.It("Teleporter registry", + // ginkgo.Label(upgradabilityLabel), + // func() { + // registry.TeleporterRegistry(LocalNetworkInstance) + // }) + // ginkgo.It("Check upgrade access", + // ginkgo.Label(upgradabilityLabel), + // func() { + // registry.CheckUpgradeAccess(LocalNetworkInstance) + // }) + // ginkgo.It("Pause and Unpause Teleporter", + // ginkgo.Label(upgradabilityLabel), + // func() { + // registry.PauseTeleporter(LocalNetworkInstance) + // }) + + // // Governance tests + // ginkgo.It("Deliver ValidatorSetSig signed message", + // ginkgo.Label(validatorSetSigLabel), + // func() { + // governance.ValidatorSetSig(LocalNetworkInstance) + // }) + + // // Validator Manager tests + // ginkgo.It("Native token staking manager", + // ginkgo.Label(validatorManagerLabel), + // func() { + // validatorManager.NativeTokenStakingManager(LocalNetworkInstance) + // }) ginkgo.It("ERC20 token staking manager", ginkgo.Label(validatorManagerLabel), func() { validatorManager.ERC20TokenStakingManager(LocalNetworkInstance) }) - ginkgo.It("PoA validator manager", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManager.PoAValidatorManager(LocalNetworkInstance) - }) - ginkgo.It("ERC20 delegation", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManager.ERC20Delegation(LocalNetworkInstance) - }) - ginkgo.It("Native token delegation", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManager.NativeDelegation(LocalNetworkInstance) - }) - ginkgo.It("PoA migration to PoS", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManager.PoAMigrationToPoS(LocalNetworkInstance) - }) + // ginkgo.It("PoA validator manager", + // ginkgo.Label(validatorManagerLabel), + // func() { + // validatorManager.PoAValidatorManager(LocalNetworkInstance) + // }) + // ginkgo.It("ERC20 delegation", + // ginkgo.Label(validatorManagerLabel), + // func() { + // validatorManager.ERC20Delegation(LocalNetworkInstance) + // }) + // ginkgo.It("Native token delegation", + // ginkgo.Label(validatorManagerLabel), + // func() { + // validatorManager.NativeDelegation(LocalNetworkInstance) + // }) + // ginkgo.It("PoA migration to PoS", + // ginkgo.Label(validatorManagerLabel), + // func() { + // validatorManager.PoAMigrationToPoS(LocalNetworkInstance) + // }) }) diff --git a/tests/local/network.go b/tests/local/network.go index 385cbd52c..0ebbbd1bf 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -3,6 +3,8 @@ package local import ( "context" "crypto/ecdsa" + "encoding/base64" + "encoding/hex" "encoding/json" "math/big" "os" @@ -14,9 +16,14 @@ import ( "github.com/ava-labs/avalanchego/config" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/tests/fixture/tmpnet" + "github.com/ava-labs/avalanchego/upgrade" "github.com/ava-labs/avalanchego/utils/constants" + "github.com/ava-labs/avalanchego/utils/crypto/secp256k1" "github.com/ava-labs/avalanchego/vms/platformvm" avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" + "github.com/ava-labs/avalanchego/vms/secp256k1fx" + pwallet "github.com/ava-labs/avalanchego/wallet/chain/p/wallet" + "github.com/ava-labs/avalanchego/wallet/subnet/primary" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/ethclient" @@ -25,7 +32,6 @@ import ( "github.com/ava-labs/subnet-evm/rpc" subnetEvmTestUtils "github.com/ava-labs/subnet-evm/tests/utils" warpBackend "github.com/ava-labs/subnet-evm/warp" - teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" teleporterregistry "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/registry/TeleporterRegistry" "github.com/ava-labs/teleporter/tests/interfaces" @@ -48,6 +54,7 @@ type LocalNetwork struct { extraNodes []*tmpnet.Node // to add as more subnet validators in the tests globalFundedKey *ecdsa.PrivateKey + pChainWallet pwallet.Wallet // Internal vars only used to set up the local network tmpnet *tmpnet.Network @@ -82,6 +89,23 @@ func NewLocalNetwork( var allNodes []*tmpnet.Node allNodes = append(allNodes, extraNodes...) // to be appended w/ subnet validators + fundedKey, err := hex.DecodeString(fundedKeyStr) + Expect(err).Should(BeNil()) + globalFundedKey, err := secp256k1.ToPrivateKey(fundedKey) + Expect(err).Should(BeNil()) + + globalFundedECDSAKey := globalFundedKey.ToECDSA() + Expect(err).Should(BeNil()) + + g, err := crypto.HexToECDSA(fundedKeyStr) + Expect(err).Should(BeNil()) + // TODONOW: remove these once txs are verified + Expect(g.PublicKey.X).Should(Equal(globalFundedECDSAKey.PublicKey.X)) + Expect(g.PublicKey.Y).Should(Equal(globalFundedECDSAKey.PublicKey.Y)) + Expect(g.X).Should(Equal(globalFundedECDSAKey.X)) + Expect(g.Y).Should(Equal(globalFundedECDSAKey.Y)) + Expect(g.D).Should(Equal(globalFundedECDSAKey.D)) + var subnets []*tmpnet.Subnet for _, subnetSpec := range subnetSpecs { nodes := subnetEvmTestUtils.NewTmpnetNodes(subnetSpec.NodeCount) @@ -99,6 +123,7 @@ func NewLocalNetwork( utils.WarpEnabledChainConfig, nodes..., ) + subnet.OwningKey = globalFundedKey subnets = append(subnets, subnet) } @@ -110,6 +135,17 @@ func NewLocalNetwork( ) Expect(network).ShouldNot(BeNil()) + // Activate Etna + upgrades := upgrade.Default + upgrades.EtnaTime = time.Now().Add(-1 * time.Minute) + upgradeJSON, err := json.Marshal(upgrades) + Expect(err).Should(BeNil()) + + upgradeBase64 := base64.StdEncoding.EncodeToString(upgradeJSON) + network.DefaultFlags.SetDefaults(tmpnet.FlagsMap{ + config.UpgradeFileContentKey: upgradeBase64, + }) + avalancheGoBuildPath, ok := os.LookupEnv("AVALANCHEGO_BUILD_PATH") Expect(ok).Should(Equal(true)) @@ -125,25 +161,40 @@ func NewLocalNetwork( ) Expect(err).Should(BeNil()) - globalFundedKey, err := crypto.HexToECDSA(fundedKeyStr) - Expect(err).Should(BeNil()) - // Issue transactions to activate the proposerVM fork on the chains for _, subnet := range network.Subnets { - setupProposerVM(ctx, globalFundedKey, network, subnet.SubnetID) + setupProposerVM(ctx, globalFundedECDSAKey, network, subnet.SubnetID) } + // TODONOW: add Wallet LocalNetwork struct localNetwork := &LocalNetwork{ primaryNetworkInfo: &interfaces.SubnetTestInfo{}, subnetsInfo: make(map[ids.ID]*interfaces.SubnetTestInfo), extraNodes: extraNodes, - globalFundedKey: globalFundedKey, + globalFundedKey: globalFundedECDSAKey, tmpnet: network, } for _, subnet := range network.Subnets { localNetwork.setSubnetValues(subnet) } localNetwork.setPrimaryNetworkValues() + + // Create the P-Chain wallet to issue transactions + kc := secp256k1fx.NewKeychain(globalFundedKey) + localNetwork.GetSubnetsInfo() + var subnetIDs []ids.ID + for _, subnet := range localNetwork.GetSubnetsInfo() { + subnetIDs = append(subnetIDs, subnet.SubnetID) + } + wallet, err := primary.MakeWallet(ctx, &primary.WalletConfig{ + URI: localNetwork.GetPrimaryNetworkInfo().NodeURIs[0], + AVAXKeychain: kc, + EthKeychain: kc, + SubnetIDs: subnetIDs, + }) + Expect(err).Should(BeNil()) + localNetwork.pChainWallet = wallet.P() + return localNetwork } @@ -674,3 +725,7 @@ func (n *LocalNetwork) GetNetworkID() uint32 { func (n *LocalNetwork) Dir() string { return n.tmpnet.Dir } + +func (n *LocalNetwork) GetPChainWallet() pwallet.Wallet { + return n.pChainWallet +} diff --git a/tests/utils/chain.go b/tests/utils/chain.go index dfa3e991c..5469d8f10 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -19,6 +19,7 @@ import ( "github.com/ava-labs/avalanchego/utils/constants" "github.com/ava-labs/avalanchego/utils/logging" "github.com/ava-labs/avalanchego/utils/set" + "github.com/ava-labs/avalanchego/vms/platformvm/signer" avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" relayerConfig "github.com/ava-labs/awm-relayer/config" "github.com/ava-labs/awm-relayer/peers" @@ -71,6 +72,11 @@ var WarpEnabledChainConfig = tmpnet.FlagsMap{ }, } +type Node struct { + NodeID ids.NodeID + NodePoP *signer.ProofOfPossession +} + // // URL utils // diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index e23acd7a3..bafaad609 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -6,6 +6,7 @@ import ( "crypto/sha256" "encoding/binary" "fmt" + "log" "math/big" "reflect" "time" @@ -39,8 +40,6 @@ const ( DefaultMaxStakeMultiplier uint8 = 4 DefaultMaxChurnPercentage uint8 = 20 DefaultChurnPeriodSeconds uint64 = 1 - - initialValidatorPackedLen = 88 ) // @@ -319,25 +318,45 @@ func InitializeERC20TokenValidatorSet( validatorManagerAddress common.Address, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, - initialValidatorWeight uint64, -) ids.ID { - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} - subnetConversionData := erc20tokenstakingmanager.SubnetConversionData{ + nodes []Node, + initialValidatorWeights []uint64, +) []ids.ID { + Expect(len(nodes)).Should(Equal(len(initialValidatorWeights))) + initialValidators := make([]warpMessages.SubnetConversionValidatorData, len(nodes)) + initialValidatorsABI := make([]erc20tokenstakingmanager.InitialValidator, len(nodes)) + for i, node := range nodes { + initialValidators[i] = warpMessages.SubnetConversionValidatorData{ + NodeID: node.NodeID.Bytes(), + BLSPublicKey: node.NodePoP.PublicKey, + Weight: initialValidatorWeights[i], + } + initialValidatorsABI[i] = erc20tokenstakingmanager.InitialValidator{ + NodeID: node.NodeID.Bytes(), + BlsPublicKey: node.NodePoP.PublicKey[:], + Weight: initialValidatorWeights[i], + } + } + + subnetConversionData := warpMessages.SubnetConversionData{ + SubnetID: subnetInfo.SubnetID, + ManagerChainID: subnetInfo.BlockchainID, + ManagerAddress: validatorManagerAddress[:], + Validators: initialValidators, + } + subnetConversionDataABI := erc20tokenstakingmanager.SubnetConversionData{ SubnetID: subnetInfo.SubnetID, ValidatorManagerBlockchainID: subnetInfo.BlockchainID, ValidatorManagerAddress: validatorManagerAddress, - InitialValidators: []erc20tokenstakingmanager.InitialValidator{ - { - NodeID: nodeID[:], - Weight: initialValidatorWeight, - BlsPublicKey: blsPublicKey[:], - }, - }, + InitialValidators: initialValidatorsABI, } - subnetConversionDataBytes, err := PackSubnetConversionData(subnetConversionData) - Expect(err).Should(BeNil()) - subnetConversionID := sha256.Sum256(subnetConversionDataBytes) + subnetConversionID, err := warpMessages.SubnetConversionID(subnetConversionData) + log.Println("Reconstructed SubnetConversionID") + log.Println(subnetConversionData) + log.Printf("conversionID: %s\n", subnetConversionID.String()) + Expect(err).Should(BeNil()) + // subnetConversionDataBytes, err := PackSubnetConversionData(subnetConversionData) + // Expect(err).Should(BeNil()) + // subnetConversionID := sha256.Sum256(subnetConversionDataBytes) subnetConversionSignedMessage := ConstructSubnetConversionMessage( subnetConversionID, subnetInfo, @@ -352,21 +371,31 @@ func InitializeERC20TokenValidatorSet( subnetInfo, validatorManagerAddress, subnetConversionSignedMessage, - subnetConversionData, + subnetConversionDataABI, ) initialValidatorCreatedEvent, err := GetEventFromLogs( receipt.Logs, validatorManager.ParseInitialValidatorCreated, ) Expect(err).Should(BeNil()) - Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) - Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(initialValidatorWeight))) + var validationIDs []ids.ID + for i := range nodes { + validationIDs = append(validationIDs, CalculateSubnetConversionValidationId(subnetInfo.SubnetID, uint32(i))) + } - expectedValidationID := CalculateSubnetConversionValidationId(subnetInfo.SubnetID, 0) - emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) - Expect(emittedValidationID).Should(Equal(expectedValidationID)) + // TODONOW: Validate all nodes + // for i := range nodes { + // TODONOW: Fix this validation + // Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.Validators[i].NodeID)) + Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(initialValidatorWeights[0]))) - return emittedValidationID + emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) + Expect(emittedValidationID).Should(Equal(validationIDs[0])) + log.Println("Expected Validation ID", validationIDs[0]) + log.Println("Emitted Validation ID", emittedValidationID) + // } + log.Println("Validation IDs", validationIDs) + return validationIDs } func InitializePoAValidatorSet( @@ -798,6 +827,7 @@ func InitializeAndCompleteERC20ValidatorRegistration( // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) + // TODONOW: construct the pre-image of the validationID as the justification signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) weight, err := stakingManager.ValueToWeight( @@ -1468,7 +1498,7 @@ func ConstructSubnetValidatorRegistrationMessage( ) *avalancheWarp.Message { registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, valid) Expect(err).Should(BeNil()) - registrationAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), registrationPayload.Bytes()) + registrationAddressedCall, err := warpPayload.NewAddressedCall(nil, registrationPayload.Bytes()) Expect(err).Should(BeNil()) registrationUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( network.GetNetworkID(), @@ -1498,7 +1528,7 @@ func ConstructSubnetValidatorWeightUpdateMessage( ) *avalancheWarp.Message { payload, err := warpMessages.NewSubnetValidatorWeight(validationID, nonce, weight) Expect(err).Should(BeNil()) - updateAddressedCall, err := warpPayload.NewAddressedCall(common.Address{}.Bytes(), payload.Bytes()) + updateAddressedCall, err := warpPayload.NewAddressedCall(nil, payload.Bytes()) Expect(err).Should(BeNil()) updateUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( network.GetNetworkID(), @@ -1527,7 +1557,7 @@ func ConstructSubnetConversionMessage( subnetConversionPayload, err := warpMessages.NewSubnetConversion(subnetConversionID) Expect(err).Should(BeNil()) subnetConversionAddressedCall, err := warpPayload.NewAddressedCall( - common.Address{}.Bytes(), + nil, subnetConversionPayload.Bytes(), ) Expect(err).Should(BeNil()) @@ -1540,7 +1570,7 @@ func ConstructSubnetConversionMessage( subnetConversionSignedMessage, err := signatureAggregator.CreateSignedMessage( subnetConversionUnsignedMessage, - nil, + subnet.SubnetID[:], subnet.SubnetID, 67, ) @@ -1634,7 +1664,7 @@ func PackSubnetConversionData(data interface{}) ([]byte, error) { } // Define required fields and their expected types requiredFields := map[string]reflect.Type{ - "ConvertSubnetTxID": reflect.TypeOf([32]byte{}), + "SubnetID": reflect.TypeOf([32]byte{}), "ValidatorManagerBlockchainID": reflect.TypeOf([32]byte{}), "ValidatorManagerAddress": reflect.TypeOf(common.Address{}), // InitialValidators is a slice of structs and handled separately @@ -1659,35 +1689,39 @@ func PackSubnetConversionData(data interface{}) ([]byte, error) { } } - convertSubnetTxID := v.FieldByName("ConvertSubnetTxID").Interface().([32]byte) + subnetID := v.FieldByName("SubnetID").Interface().([32]byte) validatorManagerBlockchainID := v.FieldByName("ValidatorManagerBlockchainID").Interface().([32]byte) validatorManagerAddress := v.FieldByName("ValidatorManagerAddress").Interface().(common.Address) initialValidators := v.FieldByName("InitialValidators") - packedLen := 92 + initialValidatorPackedLen*initialValidators.Len() - b := make([]byte, packedLen) - copy(b[0:32], convertSubnetTxID[:]) - copy(b[32:64], validatorManagerBlockchainID[:]) - // These are evm addresses and have lengths of 20 so hardcoding here - binary.BigEndian.PutUint32(b[64:68], uint32(20)) - copy(b[68:88], validatorManagerAddress.Bytes()) - binary.BigEndian.PutUint32(b[88:92], uint32(initialValidators.Len())) // Pack each InitialValidator struct + packedInitialValidators := make([][]byte, initialValidators.Len()) + var packedInitialValidatorsLen uint32 for i := 0; i < initialValidators.Len(); i++ { iv := initialValidators.Index(i).Interface() ivPacked, err := PackInitialValidator(iv) if err != nil { return nil, fmt.Errorf("failed to pack InitialValidator: %w", err) } - if len(ivPacked) != initialValidatorPackedLen { - return nil, fmt.Errorf( - "expected packed InitialValidator to be %d bytes, got %d", - initialValidatorPackedLen, - len(ivPacked), - ) - } - copy(b[92+i*initialValidatorPackedLen:92+(i+1)*initialValidatorPackedLen], ivPacked) + + packedInitialValidators[i] = ivPacked + packedInitialValidatorsLen += uint32(len(ivPacked)) } + + b := make([]byte, 94+packedInitialValidatorsLen) + binary.BigEndian.PutUint16(b[0:2], uint16(warpMessages.CodecVersion)) + copy(b[2:34], subnetID[:]) + copy(b[34:66], validatorManagerBlockchainID[:]) + // These are evm addresses and have lengths of 20 so hardcoding here + binary.BigEndian.PutUint32(b[66:70], uint32(20)) + copy(b[70:90], validatorManagerAddress.Bytes()) + binary.BigEndian.PutUint32(b[90:94], uint32(initialValidators.Len())) + offset := 94 + for _, ivPacked := range packedInitialValidators { + copy(b[offset:offset+len(ivPacked)], ivPacked) + offset += len(ivPacked) + } + return b, nil } @@ -1704,7 +1738,7 @@ func PackInitialValidator(iv interface{}) ([]byte, error) { // Define required fields and their expected types requiredFields := map[string]reflect.Type{ - "NodeID": reflect.TypeOf([32]byte{}), + "NodeID": reflect.TypeOf([]byte{}), "Weight": reflect.TypeOf(uint64(0)), "BlsPublicKey": reflect.TypeOf([]byte{}), } @@ -1724,13 +1758,14 @@ func PackInitialValidator(iv interface{}) ([]byte, error) { // At this point, we know the struct has all required fields with correct types // Use reflection to retrieve field values and perform canonical packing - nodeID := v.FieldByName("NodeID").Interface().([32]byte) + nodeID := v.FieldByName("NodeID").Interface().([]byte) weight := v.FieldByName("Weight").Interface().(uint64) blsPublicKey := v.FieldByName("BlsPublicKey").Interface().([]byte) - b := make([]byte, initialValidatorPackedLen) - copy(b[0:32], nodeID[:]) - binary.BigEndian.PutUint64(b[32:40], weight) - copy(b[40:88], blsPublicKey) + b := make([]byte, 60+len(nodeID)) + binary.BigEndian.PutUint32(b[0:4], uint32(len(nodeID))) + copy(b[4:4+len(nodeID)], nodeID[:]) + binary.BigEndian.PutUint64(b[4+len(nodeID):4+len(nodeID)+8], weight) + copy(b[4+len(nodeID)+8:4+len(nodeID)+8+48], blsPublicKey) return b, nil } From f74c57515227282eda2925f554a0638597627f00 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 4 Oct 2024 19:42:53 -0500 Subject: [PATCH 462/545] wip: flaky p-chain warp verification --- .gitignore | 1 + .../validator-manager/erc20_delegation.go | 26 +-- .../validator-manager/erc20_token_staking.go | 182 +++++------------- tests/interfaces/local_network.go | 5 + tests/local/network.go | 15 +- tests/utils/validator_manager.go | 176 ++++++++++++++--- 6 files changed, 233 insertions(+), 172 deletions(-) diff --git a/.gitignore b/.gitignore index 922ef3288..babc5dac1 100644 --- a/.gitignore +++ b/.gitignore @@ -44,3 +44,4 @@ server.log # Forge documentation docs/ +coverage/ diff --git a/tests/flows/validator-manager/erc20_delegation.go b/tests/flows/validator-manager/erc20_delegation.go index cbaa3f828..5e1b25009 100644 --- a/tests/flows/validator-manager/erc20_delegation.go +++ b/tests/flows/validator-manager/erc20_delegation.go @@ -67,20 +67,20 @@ func ERC20Delegation(network interfaces.LocalNetwork) { validatorStake, ) Expect(err).Should(BeNil()) - validationID = utils.InitializeAndCompleteERC20ValidatorRegistration( - ctx, - network, - signatureAggregator, - fundedKey, - subnetAInfo, - pChainInfo, - stakingManager, - stakingManagerAddress, - erc20, - validatorStake, - ) + // validationID = utils.InitializeAndCompleteERC20ValidatorRegistration( + // ctx, + // network, + // signatureAggregator, + // fundedKey, + // subnetAInfo, + // pChainInfo, + // stakingManager, + // stakingManagerAddress, + // erc20, + // validatorStake, + // ) - // + // // // Register a delegator // var delegationID ids.ID diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index fa44aa0dd..71292725f 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -2,8 +2,6 @@ package staking import ( "context" - "log" - "math/big" "sort" "time" @@ -11,12 +9,10 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/formatting/address" "github.com/ava-labs/avalanchego/utils/units" - "github.com/ava-labs/avalanchego/vms/components/avax" - "github.com/ava-labs/avalanchego/vms/platformvm/stakeable" "github.com/ava-labs/avalanchego/vms/platformvm/txs" "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" - "github.com/ava-labs/avalanchego/vms/secp256k1fx" "github.com/ava-labs/subnet-evm/accounts/abi/bind" + subnetEvmUtils "github.com/ava-labs/subnet-evm/tests/utils" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" . "github.com/onsi/gomega" @@ -62,7 +58,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { ) var nodes []utils.Node - var weights []uint64 + for _, uri := range subnetAInfo.NodeURIs { infoClient := info.NewClient(uri) nodeID, nodePoP, err := infoClient.GetNodeID(ctx) @@ -71,7 +67,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { NodeID: nodeID, NodePoP: nodePoP, }) - weights = append(weights, units.Schmeckle) // Remove the current validators before converting the subnet _, err = network.GetPChainWallet().IssueRemoveSubnetValidatorTx( @@ -82,15 +77,18 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { } // Sort the nodeIDs so that the subnet conversion ID matches the P-Chain - log.Println("nodes before sorting") - log.Println("nodeID1: ", nodes[0].NodeID.Bytes()) - log.Println("nodeID2: ", nodes[1].NodeID.Bytes()) sort.Slice(nodes, func(i, j int) bool { return string(nodes[i].NodeID.Bytes()) < string(nodes[j].NodeID.Bytes()) }) - log.Println("nodes after sorting") - log.Println("nodeID1: ", nodes[0].NodeID.Bytes()) - log.Println("nodeID2: ", nodes[1].NodeID.Bytes()) + + weights := make([]uint64, len(nodes)) + totalWeight := uint64(len(nodes)-1) * units.Schmeckle + for i := 0; i < len(nodes)-1; i++ { + weights[i] = units.Schmeckle + totalWeight += units.Schmeckle + } + // Set the last node's weight such that removing any other node will not violate the churn limit + weights[len(nodes)-1] = 4 * totalWeight // TODONOW: issue a P-Chain ConvertSubnetTx destAddrStr := "P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u" @@ -113,26 +111,14 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // }, // } // } + + // Set just the last node (with a high weight) to the initial validator list vdrs := []*txs.ConvertSubnetValidator{ { - NodeID: nodes[0].NodeID.Bytes(), - Weight: weights[0], + NodeID: nodes[len(nodes)-1].NodeID.Bytes(), + Weight: weights[len(nodes)-1], Balance: units.Avax * 100, - Signer: *nodes[0].NodePoP, - RemainingBalanceOwner: message.PChainOwner{ - Threshold: 1, - Addresses: []ids.ShortID{destAddr}, - }, - DeactivationOwner: message.PChainOwner{ - Threshold: 1, - Addresses: []ids.ShortID{destAddr}, - }, - }, - { - NodeID: nodes[1].NodeID.Bytes(), - Weight: weights[1], - Balance: units.Avax * 100, - Signer: *nodes[1].NodePoP, + Signer: *nodes[len(nodes)-1].NodePoP, RemainingBalanceOwner: message.PChainOwner{ Threshold: 1, Addresses: []ids.ShortID{destAddr}, @@ -143,6 +129,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { }, }, } + _, err = network.GetPChainWallet().IssueConvertSubnetTx( subnetAInfo.SubnetID, subnetAInfo.BlockchainID, @@ -151,99 +138,15 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) - // DEBUG - log.Println("convert subnet tx info") - data := message.SubnetConversionData{ - SubnetID: subnetAInfo.SubnetID, - ManagerChainID: subnetAInfo.BlockchainID, - ManagerAddress: stakingManagerAddress[:], - Validators: []message.SubnetConversionValidatorData{ - { - NodeID: nodes[0].NodeID.Bytes(), - BLSPublicKey: nodes[0].NodePoP.PublicKey, - Weight: weights[0], - }, - { - NodeID: nodes[1].NodeID.Bytes(), - BLSPublicKey: nodes[1].NodePoP.PublicKey, - Weight: weights[1], - }, - }, - } - conversionID, _ := message.SubnetConversionID(data) - log.Println(data) - log.Printf("conversionID: %s\n", conversionID.String()) - data = message.SubnetConversionData{ - SubnetID: subnetAInfo.SubnetID, - ManagerChainID: subnetAInfo.BlockchainID, - ManagerAddress: stakingManagerAddress[:], - Validators: []message.SubnetConversionValidatorData{ - { - NodeID: nodes[1].NodeID.Bytes(), - BLSPublicKey: nodes[1].NodePoP.PublicKey, - Weight: weights[1], - }, - { - NodeID: nodes[0].NodeID.Bytes(), - BLSPublicKey: nodes[0].NodePoP.PublicKey, - Weight: weights[0], - }, - }, - } - conversionID, _ = message.SubnetConversionID(data) - log.Println(data) - log.Printf("conversionID: %s\n", conversionID.String()) - // END DEBUG + utils.PChainProposerVMWorkaround(network) - // // Workaround current block map rules - time.Sleep(30 * time.Second) - - pBuilder := network.GetPChainWallet().Builder() - pContext := pBuilder.Context() - avaxAssetID := pContext.AVAXAssetID - locktime := uint64(time.Date(2030, 1, 1, 0, 0, 0, 0, time.UTC).Unix()) - amount := 500 * units.MilliAvax - _, err = network.GetPChainWallet().IssueBaseTx([]*avax.TransferableOutput{ - { - Asset: avax.Asset{ - ID: avaxAssetID, - }, - Out: &stakeable.LockOut{ - Locktime: locktime, - TransferableOut: &secp256k1fx.TransferOutput{ - Amt: amount, - OutputOwners: secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ - destAddr, - }, - }, - }, - }, - }, - }) - Expect(err).Should(BeNil()) - _, err = network.GetPChainWallet().IssueBaseTx([]*avax.TransferableOutput{ - { - Asset: avax.Asset{ - ID: avaxAssetID, - }, - Out: &stakeable.LockOut{ - Locktime: locktime, - TransferableOut: &secp256k1fx.TransferOutput{ - Amt: amount, - OutputOwners: secp256k1fx.OutputOwners{ - Threshold: 1, - Addrs: []ids.ShortID{ - destAddr, - }, - }, - }, - }, - }, - }) - Expect(err).Should(BeNil()) - // End workaround + // Issue txs on the subnet to advance the proposer vm + for i := 0; i < 5; i++ { + err = subnetEvmUtils.IssueTxsToActivateProposerVMFork( + ctx, subnetAInfo.EVMChainID, fundedKey, subnetAInfo.WSClient, + ) + Expect(err).Should(BeNil()) + } // Initialize the validator set on the subnet _ = utils.InitializeERC20TokenValidatorSet( @@ -255,24 +158,38 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakingManagerAddress, network, signatureAggregator, - nodes, - weights, + nodes[len(nodes)-1:], + weights[len(nodes)-1:], ) + // Delisting an initial validator does not work due to the way Warp signatures are requested for inital validators // - // Delist all initial validators + // Delist one initial validators // - Expect(false).Should(BeTrue()) + // utils.InitializeAndCompleteEndERC20Validation( + // ctx, + // network, + // signatureAggregator, + // fundedKey, + // subnetAInfo, + // pChainInfo, + // stakingManager, + // stakingManagerAddress, + // initialValidationIDs[0], + // weights[0], + // 1, + // ) // // Register a validator // - stakeAmount := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) - weight, err := stakingManager.ValueToWeight( + stakeAmount, err := stakingManager.WeightToValue( &bind.CallOpts{}, - stakeAmount, + weights[0], ) Expect(err).Should(BeNil()) + // TODONOW: pass the validatorID pre image to the signature aggregator + expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) validationID := utils.InitializeAndCompleteERC20ValidatorRegistration( ctx, network, @@ -284,6 +201,9 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakingManagerAddress, erc20, stakeAmount, + weights[0], + expiry, + nodes[0], ) // @@ -299,7 +219,9 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakingManager, stakingManagerAddress, validationID, - weight, + expiry, + nodes[0], + weights[0], 1, ) } diff --git a/tests/interfaces/local_network.go b/tests/interfaces/local_network.go index dc7235593..80b72f095 100644 --- a/tests/interfaces/local_network.go +++ b/tests/interfaces/local_network.go @@ -14,6 +14,11 @@ import ( type LocalNetwork interface { Network AddSubnetValidators(ctx context.Context, subnetID ids.ID, count uint) + ExtractWarpMessageFromLog( + ctx context.Context, + sourceReceipt *types.Receipt, + source SubnetTestInfo, + ) *avalancheWarp.UnsignedMessage ConstructSignedWarpMessage( ctx context.Context, sourceReceipt *types.Receipt, diff --git a/tests/local/network.go b/tests/local/network.go index 0ebbbd1bf..f97770193 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -649,12 +649,11 @@ func (n *LocalNetwork) SetChainConfigs(chainConfigs map[string]string) { } } -func (n *LocalNetwork) ConstructSignedWarpMessage( +func (n *LocalNetwork) ExtractWarpMessageFromLog( ctx context.Context, sourceReceipt *types.Receipt, source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, -) *avalancheWarp.Message { +) *avalancheWarp.UnsignedMessage { log.Info("Fetching relevant warp logs from the newly produced block") logs, err := source.RPCClient.FilterLogs(ctx, subnetEvmInterfaces.FilterQuery{ BlockHash: &sourceReceipt.BlockHash, @@ -669,6 +668,16 @@ func (n *LocalNetwork) ConstructSignedWarpMessage( log.Info("Parsing logData as unsigned warp message") unsignedMsg, err := warp.UnpackSendWarpEventDataToMessage(txLog.Data) Expect(err).Should(BeNil()) + return unsignedMsg +} + +func (n *LocalNetwork) ConstructSignedWarpMessage( + ctx context.Context, + sourceReceipt *types.Receipt, + source interfaces.SubnetTestInfo, + destination interfaces.SubnetTestInfo, +) *avalancheWarp.Message { + unsignedMsg := n.ExtractWarpMessageFromLog(ctx, sourceReceipt, source) // Set local variables for the duration of the test unsignedWarpMessageID := unsignedMsg.ID() diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index bafaad609..0dcac85b1 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -13,9 +13,14 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/utils/crypto/bls" + "github.com/ava-labs/avalanchego/utils/formatting/address" + "github.com/ava-labs/avalanchego/utils/units" + "github.com/ava-labs/avalanchego/vms/components/avax" + "github.com/ava-labs/avalanchego/vms/platformvm/stakeable" avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" + "github.com/ava-labs/avalanchego/vms/secp256k1fx" "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" @@ -35,7 +40,7 @@ import ( const ( DefaultMinDelegateFeeBips uint16 = 1 DefaultMinStakeDurationSeconds uint64 = 1 - DefaultMinStakeAmount uint64 = 1e18 + DefaultMinStakeAmount uint64 = 1e16 DefaultMaxStakeAmount uint64 = 10e18 DefaultMaxStakeMultiplier uint8 = 4 DefaultMaxChurnPercentage uint8 = 20 @@ -364,6 +369,10 @@ func InitializeERC20TokenValidatorSet( network, signatureAggregator, ) + log.Println("SubnetConversionSignedMessage") + log.Println(subnetConversionSignedMessage.Signature.NumSigners()) + log.Println(subnetConversionSignedMessage.Signature.String()) + log.Println(subnetConversionSignedMessage.SourceChainID.String()) // Deliver the Warp message to the subnet receipt := DeliverERC20TokenSubnetConversion( ctx, @@ -568,8 +577,8 @@ func InitializeERC20ValidatorRegistration( stakeAmount *big.Int, token *exampleerc20.ExampleERC20, stakingManagerAddress common.Address, - nodeID ids.ID, - blsPublicKey [bls.PublicKeyLen]byte, + node Node, + expiry uint64, stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, ) (*types.Receipt, ids.ID) { ERC20Approve( @@ -587,9 +596,9 @@ func InitializeERC20ValidatorRegistration( tx, err := stakingManager.InitializeValidatorRegistration( opts, erc20tokenstakingmanager.ValidatorRegistrationInput{ - NodeID: nodeID[:], - RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), - BlsPublicKey: blsPublicKey[:], + NodeID: node.NodeID[:], + RegistrationExpiry: expiry, + BlsPublicKey: node.NodePoP.PublicKey[:], }, DefaultMinDelegateFeeBips, DefaultMinStakeDurationSeconds, @@ -771,6 +780,9 @@ func InitializeAndCompleteNativeValidatorRegistration( // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, + 0, + Node{}, + 0, true, subnetInfo, pChainInfo, @@ -808,10 +820,12 @@ func InitializeAndCompleteERC20ValidatorRegistration( stakingManagerAddress common.Address, erc20 *exampleerc20.ExampleERC20, stakeAmount *big.Int, + weight uint64, + expiry uint64, + node Node, ) ids.ID { + // Initiate validator registration - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} var receipt *types.Receipt receipt, validationID := InitializeERC20ValidatorRegistration( ctx, @@ -820,8 +834,8 @@ func InitializeAndCompleteERC20ValidatorRegistration( stakeAmount, erc20, stakingManagerAddress, - nodeID, - blsPublicKey, + node, + expiry, stakingManager, ) @@ -830,23 +844,33 @@ func InitializeAndCompleteERC20ValidatorRegistration( // TODONOW: construct the pre-image of the validationID as the justification signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) - weight, err := stakingManager.ValueToWeight( - &bind.CallOpts{}, - stakeAmount, - ) - Expect(err).Should(BeNil()) + // weight, err := stakingManager.ValueToWeight( + // &bind.CallOpts{}, + // stakeAmount, + // ) + // Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) - ValidateRegisterSubnetValidatorMessage( - signedWarpMessage, - nodeID, - weight, - subnetInfo.SubnetID, - blsPublicKey, + // ValidateRegisterSubnetValidatorMessage( + // signedWarpMessage, + // nodeID, + // weight, + // subnetInfo.SubnetID, + // blsPublicKey, + // ) + _, err := network.GetPChainWallet().IssueRegisterSubnetValidatorTx( + units.Avax, + node.NodePoP.ProofOfPossession, + signedWarpMessage.Bytes(), ) + Expect(err).Should(BeNil()) + PChainProposerVMWorkaround(network) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, + expiry, + node, + weight, true, subnetInfo, pChainInfo, @@ -914,6 +938,9 @@ func InitializeAndCompletePoAValidatorRegistration( // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, + 0, + Node{}, + 0, true, subnetInfo, pChainInfo, @@ -1329,6 +1356,9 @@ func InitializeAndCompleteEndNativeValidation( // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, + 0, + Node{}, + 0, false, subnetInfo, pChainInfo, @@ -1364,6 +1394,8 @@ func InitializeAndCompleteEndERC20Validation( stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, stakingManagerAddress common.Address, validationID ids.ID, + expiry uint64, + node Node, weight uint64, nonce uint64, ) { @@ -1385,15 +1417,28 @@ func InitializeAndCompleteEndERC20Validation( // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) + unsignedMessage := network.ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) + signedWarpMessage, err := signatureAggregator.CreateSignedMessage( + unsignedMessage, + nil, + subnetInfo.SubnetID, + 67, + ) Expect(err).Should(BeNil()) + log.Println("SetSubnetValidatorWeightMessage") + log.Println(signedWarpMessage.Signature.NumSigners()) + log.Println(signedWarpMessage.Signature.String()) + log.Println(signedWarpMessage.SourceChainID.String()) - // Validate the Warp message, (this will be done on the P-Chain in the future) - ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, nonce) - + // Deliver the Warp message to the P-Chain + network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + PChainProposerVMWorkaround(network) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, + expiry, + node, + weight, false, subnetInfo, pChainInfo, @@ -1459,6 +1504,9 @@ func InitializeAndCompleteEndPoAValidation( // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, + 0, + Node{}, + 0, false, subnetInfo, pChainInfo, @@ -1490,12 +1538,26 @@ func InitializeAndCompleteEndPoAValidation( func ConstructSubnetValidatorRegistrationMessage( validationID ids.ID, + expiry uint64, + node Node, + weight uint64, valid bool, subnet interfaces.SubnetTestInfo, pChainInfo interfaces.SubnetTestInfo, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { + justification, err := warpMessages.NewRegisterSubnetValidator( + subnet.SubnetID, + node.NodeID, + node.NodePoP.PublicKey, + expiry, + warpMessages.PChainOwner{}, + warpMessages.PChainOwner{}, + weight, + ) + Expect(err).Should(BeNil()) + registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, valid) Expect(err).Should(BeNil()) registrationAddressedCall, err := warpPayload.NewAddressedCall(nil, registrationPayload.Bytes()) @@ -1509,10 +1571,14 @@ func ConstructSubnetValidatorRegistrationMessage( registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( registrationUnsignedMessage, - nil, + justification.Bytes(), subnet.SubnetID, 67, ) + log.Println("registrationSignedMessage") + log.Println(registrationSignedMessage.Signature.NumSigners()) + log.Println(registrationSignedMessage.Signature.String()) + log.Println(registrationSignedMessage.SourceChainID.String()) Expect(err).Should(BeNil()) return registrationSignedMessage } @@ -1769,3 +1835,61 @@ func PackInitialValidator(iv interface{}) ([]byte, error) { copy(b[4+len(nodeID)+8:4+len(nodeID)+8+48], blsPublicKey) return b, nil } + +func PChainProposerVMWorkaround( + network interfaces.LocalNetwork, +) { + // // Workaround current block map rules + destAddrStr := "P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u" + destAddr, err := address.ParseToID(destAddrStr) + Expect(err).Should(BeNil()) + log.Println("Waiting for P-Chain...") + time.Sleep(30 * time.Second) + + pBuilder := network.GetPChainWallet().Builder() + pContext := pBuilder.Context() + avaxAssetID := pContext.AVAXAssetID + locktime := uint64(time.Date(2030, 1, 1, 0, 0, 0, 0, time.UTC).Unix()) + amount := 500 * units.MilliAvax + _, err = network.GetPChainWallet().IssueBaseTx([]*avax.TransferableOutput{ + { + Asset: avax.Asset{ + ID: avaxAssetID, + }, + Out: &stakeable.LockOut{ + Locktime: locktime, + TransferableOut: &secp256k1fx.TransferOutput{ + Amt: amount, + OutputOwners: secp256k1fx.OutputOwners{ + Threshold: 1, + Addrs: []ids.ShortID{ + destAddr, + }, + }, + }, + }, + }, + }) + Expect(err).Should(BeNil()) + _, err = network.GetPChainWallet().IssueBaseTx([]*avax.TransferableOutput{ + { + Asset: avax.Asset{ + ID: avaxAssetID, + }, + Out: &stakeable.LockOut{ + Locktime: locktime, + TransferableOut: &secp256k1fx.TransferOutput{ + Amt: amount, + OutputOwners: secp256k1fx.OutputOwners{ + Threshold: 1, + Addrs: []ids.ShortID{ + destAddr, + }, + }, + }, + }, + }, + }) + Expect(err).Should(BeNil()) + // End workaround +} From 0ca3a5334fc08eec67259bbd612d9e1d2ed02735 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 7 Oct 2024 17:22:44 -0500 Subject: [PATCH 463/545] wip --- scripts/local/e2e_test.sh | 3 +- .../validator-manager/erc20_token_staking.go | 12 ++--- tests/utils/chain.go | 11 ++++- tests/utils/validator_manager.go | 47 ++++++++++++++----- 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index f45c931d2..16ddc818b 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -20,7 +20,8 @@ rm -rf $BASEDIR/avalanchego BASEDIR=$BASEDIR AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego "${TELEPORTER_PATH}/scripts/install_avalanchego_release.sh" BASEDIR=$BASEDIR "${TELEPORTER_PATH}/scripts/install_subnetevm_release.sh" -cp ${BASEDIR}/subnet-evm/subnet-evm ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy +# cp ${BASEDIR}/subnet-evm/subnet-evm ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy +cp /Users/cameron.schultz/.avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy echo "Copied ${BASEDIR}/subnet-evm/subnet-evm binary to ${BASEDIR}/avalanchego/plugins/" export AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index 71292725f..3abb97f18 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -2,6 +2,7 @@ package staking import ( "context" + "log" "sort" "time" @@ -12,7 +13,6 @@ import ( "github.com/ava-labs/avalanchego/vms/platformvm/txs" "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" "github.com/ava-labs/subnet-evm/accounts/abi/bind" - subnetEvmUtils "github.com/ava-labs/subnet-evm/tests/utils" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" . "github.com/onsi/gomega" @@ -130,6 +130,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { }, } + log.Println("Issuing ConvertSubnetTx") _, err = network.GetPChainWallet().IssueConvertSubnetTx( subnetAInfo.SubnetID, subnetAInfo.BlockchainID, @@ -140,15 +141,10 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { utils.PChainProposerVMWorkaround(network) - // Issue txs on the subnet to advance the proposer vm - for i := 0; i < 5; i++ { - err = subnetEvmUtils.IssueTxsToActivateProposerVMFork( - ctx, subnetAInfo.EVMChainID, fundedKey, subnetAInfo.WSClient, - ) - Expect(err).Should(BeNil()) - } + utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) // Initialize the validator set on the subnet + log.Println("Initializing validator set") _ = utils.InitializeERC20TokenValidatorSet( ctx, fundedKey, diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 5469d8f10..61b3d33eb 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -539,7 +539,14 @@ func InstantiateGenesisTemplate( // func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.SignatureAggregator { - logger := logging.NoLog{} + logger := logging.NewLogger( + "test-debug", + logging.NewWrappedCore( + logging.Debug, + os.Stdout, + logging.JSON.ConsoleEncoder(), + ), + ) cfg := sigAggConfig.Config{ PChainAPI: &relayerConfig.APIConfig{ BaseURL: apiUri, @@ -560,7 +567,7 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu Expect(err).Should(BeNil()) messageCreator, err := message.NewCreator( - logger, + logging.NoLog{}, registry, constants.DefaultNetworkCompressionType, constants.DefaultNetworkMaximumInboundTimeout, diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 0dcac85b1..92fd128c6 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -26,6 +26,7 @@ import ( "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/precompile/contracts/warp" predicateutils "github.com/ava-labs/subnet-evm/predicate" + subnetEvmUtils "github.com/ava-labs/subnet-evm/tests/utils" exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" erc20tokenstakingmanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/ERC20TokenStakingManager" examplerewardcalculator "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/ExampleRewardCalculator" @@ -827,6 +828,7 @@ func InitializeAndCompleteERC20ValidatorRegistration( // Initiate validator registration var receipt *types.Receipt + log.Println("Initializing validator registration") receipt, validationID := InitializeERC20ValidatorRegistration( ctx, fundedKey, @@ -858,14 +860,15 @@ func InitializeAndCompleteERC20ValidatorRegistration( // blsPublicKey, // ) _, err := network.GetPChainWallet().IssueRegisterSubnetValidatorTx( - units.Avax, + 100*units.Avax, node.NodePoP.ProofOfPossession, signedWarpMessage.Bytes(), ) Expect(err).Should(BeNil()) PChainProposerVMWorkaround(network) - + AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + log.Println("Completing validator registration") registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, expiry, @@ -1399,6 +1402,7 @@ func InitializeAndCompleteEndERC20Validation( weight uint64, nonce uint64, ) { + log.Println("Initializing validator removal") WaitMinStakeDuration(ctx, subnetInfo, fundedKey) receipt := ForceInitializeEndERC20Validation( ctx, @@ -1422,7 +1426,7 @@ func InitializeAndCompleteEndERC20Validation( unsignedMessage, nil, subnetInfo.SubnetID, - 67, + 100, ) Expect(err).Should(BeNil()) log.Println("SetSubnetValidatorWeightMessage") @@ -1433,7 +1437,11 @@ func InitializeAndCompleteEndERC20Validation( // Deliver the Warp message to the P-Chain network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) PChainProposerVMWorkaround(network) + PChainProposerVMWorkaround(network) + AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + log.Println("Completing validator removal") registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, expiry, @@ -1456,12 +1464,12 @@ func InitializeAndCompleteEndERC20Validation( ) // Check that the validator is has been delisted from the staking contract - registrationEvent, err := GetEventFromLogs( + validationEndedEvent, err := GetEventFromLogs( receipt.Logs, stakingManager.ParseValidationPeriodEnded, ) Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(validationEndedEvent.ValidationID[:]).Should(Equal(validationID[:])) } func InitializeAndCompleteEndPoAValidation( @@ -1573,13 +1581,16 @@ func ConstructSubnetValidatorRegistrationMessage( registrationUnsignedMessage, justification.Bytes(), subnet.SubnetID, - 67, + 100, ) - log.Println("registrationSignedMessage") - log.Println(registrationSignedMessage.Signature.NumSigners()) - log.Println(registrationSignedMessage.Signature.String()) - log.Println(registrationSignedMessage.SourceChainID.String()) Expect(err).Should(BeNil()) + log.Println("SubnetValidatorRegistrationMessage") + log.Printf("valid=%t", valid) + numSigners, err := registrationSignedMessage.Signature.NumSigners() + Expect(err).Should(BeNil()) + log.Println("numSigners", numSigners) + log.Println("signature", registrationSignedMessage.Signature.String()) + log.Println("sourceChain", registrationSignedMessage.SourceChainID.String()) return registrationSignedMessage } @@ -1638,7 +1649,7 @@ func ConstructSubnetConversionMessage( subnetConversionUnsignedMessage, subnet.SubnetID[:], subnet.SubnetID, - 67, + 100, ) Expect(err).Should(BeNil()) return subnetConversionSignedMessage @@ -1893,3 +1904,17 @@ func PChainProposerVMWorkaround( Expect(err).Should(BeNil()) // End workaround } + +func AdvanceProposerVM( + ctx context.Context, + subnet interfaces.SubnetTestInfo, + fundedKey *ecdsa.PrivateKey, + blocks int, +) { + for i := 0; i < blocks; i++ { + err := subnetEvmUtils.IssueTxsToActivateProposerVMFork( + ctx, subnet.EVMChainID, fundedKey, subnet.WSClient, + ) + Expect(err).Should(BeNil()) + } +} From 2207e65cb2b4d8e5de7841661f12aa6db7376b21 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 8 Oct 2024 06:17:16 -0500 Subject: [PATCH 464/545] use tagged subnet-evm --- scripts/local/e2e_test.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index 16ddc818b..f45c931d2 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -20,8 +20,7 @@ rm -rf $BASEDIR/avalanchego BASEDIR=$BASEDIR AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego "${TELEPORTER_PATH}/scripts/install_avalanchego_release.sh" BASEDIR=$BASEDIR "${TELEPORTER_PATH}/scripts/install_subnetevm_release.sh" -# cp ${BASEDIR}/subnet-evm/subnet-evm ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy -cp /Users/cameron.schultz/.avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy +cp ${BASEDIR}/subnet-evm/subnet-evm ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy echo "Copied ${BASEDIR}/subnet-evm/subnet-evm binary to ${BASEDIR}/avalanchego/plugins/" export AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego From b553d96094bff5c5f695aa2506ee061165e28823 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 8 Oct 2024 13:41:33 -0500 Subject: [PATCH 465/545] lengthen timeout --- tests/utils/chain.go | 9 +++------ tests/utils/validator_manager.go | 1 - 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 61b3d33eb..4244a4bf0 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -214,7 +214,7 @@ func waitForTransaction( txHash common.Hash, success bool, ) *types.Receipt { - cctx, cancel := context.WithTimeout(ctx, 10*time.Second) + cctx, cancel := context.WithTimeout(ctx, 20*time.Second) defer cancel() receipt, err := WaitMined(cctx, subnetInfo.RPCClient, txHash) @@ -317,10 +317,7 @@ func TraceTransaction(ctx context.Context, rpcClient ethclient.Client, txHash co // Takes a tx hash instead of the full tx in the subnet-evm version of this function. // Copied and modified from https://github.com/ava-labs/subnet-evm/blob/v0.6.0-fuji/accounts/abi/bind/util.go#L42 func WaitMined(ctx context.Context, rpcClient ethclient.Client, txHash common.Hash) (*types.Receipt, error) { - cctx, cancel := context.WithTimeout(ctx, 20*time.Second) - defer cancel() - - receipt, err := waitForTransactionReceipt(cctx, rpcClient, txHash) + receipt, err := waitForTransactionReceipt(ctx, rpcClient, txHash) if err != nil { return nil, err } @@ -332,7 +329,7 @@ func WaitMined(ctx context.Context, rpcClient ethclient.Client, txHash common.Ha // configured to return the lowest value currently returned by any node behind the load balancer, so waiting for // it to be at least as high as the block height specified in the receipt should provide a relatively strong // indication that the transaction has been seen widely throughout the network. - err = waitForBlockHeight(cctx, rpcClient, receipt.BlockNumber.Uint64()) + err = waitForBlockHeight(ctx, rpcClient, receipt.BlockNumber.Uint64()) if err != nil { return nil, err } diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 92fd128c6..e678d57a0 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -1437,7 +1437,6 @@ func InitializeAndCompleteEndERC20Validation( // Deliver the Warp message to the P-Chain network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) PChainProposerVMWorkaround(network) - PChainProposerVMWorkaround(network) AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain From f90c70d9d5822d9e41f7c33d802ed4af242622e5 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 8 Oct 2024 17:23:14 -0500 Subject: [PATCH 466/545] new justification format --- go.mod | 2 +- go.sum | 2 + scripts/local/e2e_test.sh | 3 +- .../validator-manager/erc20_token_staking.go | 88 +++++----- tests/utils/chain.go | 4 + tests/utils/validator_manager.go | 151 ++++++++++++++++-- 6 files changed, 194 insertions(+), 56 deletions(-) diff --git a/go.mod b/go.mod index b5f26550b..2bb91e6ad 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/ava-labs/teleporter go 1.22.8 require ( - github.com/ava-labs/avalanchego v1.12.0-initial-poc.3 + github.com/ava-labs/avalanchego v1.12.0-initial-poc.4 github.com/supranational/blst v0.3.11 // indirect ) diff --git a/go.sum b/go.sum index 2cbb2c7e3..06a4b5cce 100644 --- a/go.sum +++ b/go.sum @@ -58,6 +58,8 @@ 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.12.0-initial-poc.3 h1:JfVooBCdMzpeGUT9/phJNl2GHflkGehlMJokXeWKa2A= github.com/ava-labs/avalanchego v1.12.0-initial-poc.3/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= +github.com/ava-labs/avalanchego v1.12.0-initial-poc.4 h1:0g1+aJS6f4I2m8oEF3djlfyNbL9UrQTS+6A0eXbRLtM= +github.com/ava-labs/avalanchego v1.12.0-initial-poc.4/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6 h1:v7k5wQxcvnYcMaz+zoO1OLAcU8REDD1EhfPZdl4Q+aI= github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6/go.mod h1:sSXpQtgiduMdZw5IVTSa1v418VCjb8GDLyrcGwJZ/HE= github.com/ava-labs/coreth v0.13.8 h1:f14X3KgwHl9LwzfxlN6S4bbn5VA2rhEsNnHaRLSTo/8= diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index f45c931d2..16ddc818b 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -20,7 +20,8 @@ rm -rf $BASEDIR/avalanchego BASEDIR=$BASEDIR AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego "${TELEPORTER_PATH}/scripts/install_avalanchego_release.sh" BASEDIR=$BASEDIR "${TELEPORTER_PATH}/scripts/install_subnetevm_release.sh" -cp ${BASEDIR}/subnet-evm/subnet-evm ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy +# cp ${BASEDIR}/subnet-evm/subnet-evm ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy +cp /Users/cameron.schultz/.avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy echo "Copied ${BASEDIR}/subnet-evm/subnet-evm binary to ${BASEDIR}/avalanchego/plugins/" export AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index 3abb97f18..10c57baa0 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -94,31 +94,13 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { destAddrStr := "P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u" destAddr, err := address.ParseToID(destAddrStr) Expect(err).Should(BeNil()) - // vdrs := make([]*txs.ConvertSubnetValidator, len(nodes)) - // for i, node := range nodes { - // vdrs[i] = &txs.ConvertSubnetValidator{ - // NodeID: node.NodeID.Bytes(), - // Weight: weights[i], - // Balance: units.Avax * 100, - // Signer: *node.NodePoP, - // RemainingBalanceOwner: message.PChainOwner{ - // Threshold: 1, - // Addresses: []ids.ShortID{destAddr}, - // }, - // DeactivationOwner: message.PChainOwner{ - // Threshold: 1, - // Addresses: []ids.ShortID{destAddr}, - // }, - // } - // } - - // Set just the last node (with a high weight) to the initial validator list - vdrs := []*txs.ConvertSubnetValidator{ - { - NodeID: nodes[len(nodes)-1].NodeID.Bytes(), - Weight: weights[len(nodes)-1], + vdrs := make([]*txs.ConvertSubnetValidator, len(nodes)) + for i, node := range nodes { + vdrs[i] = &txs.ConvertSubnetValidator{ + NodeID: node.NodeID.Bytes(), + Weight: weights[i], Balance: units.Avax * 100, - Signer: *nodes[len(nodes)-1].NodePoP, + Signer: *node.NodePoP, RemainingBalanceOwner: message.PChainOwner{ Threshold: 1, Addresses: []ids.ShortID{destAddr}, @@ -127,9 +109,27 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { Threshold: 1, Addresses: []ids.ShortID{destAddr}, }, - }, + } } + // Set just the last node (with a high weight) to the initial validator list + // vdrs := []*txs.ConvertSubnetValidator{ + // { + // NodeID: nodes[len(nodes)-1].NodeID.Bytes(), + // Weight: weights[len(nodes)-1], + // Balance: units.Avax * 100, + // Signer: *nodes[len(nodes)-1].NodePoP, + // RemainingBalanceOwner: message.PChainOwner{ + // Threshold: 1, + // Addresses: []ids.ShortID{destAddr}, + // }, + // DeactivationOwner: message.PChainOwner{ + // Threshold: 1, + // Addresses: []ids.ShortID{destAddr}, + // }, + // }, + // } + log.Println("Issuing ConvertSubnetTx") _, err = network.GetPChainWallet().IssueConvertSubnetTx( subnetAInfo.SubnetID, @@ -145,7 +145,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // Initialize the validator set on the subnet log.Println("Initializing validator set") - _ = utils.InitializeERC20TokenValidatorSet( + initialValidationIDs := utils.InitializeERC20TokenValidatorSet( ctx, fundedKey, subnetAInfo, @@ -154,27 +154,31 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakingManagerAddress, network, signatureAggregator, - nodes[len(nodes)-1:], - weights[len(nodes)-1:], + nodes, + weights, ) // Delisting an initial validator does not work due to the way Warp signatures are requested for inital validators // // Delist one initial validators // - // utils.InitializeAndCompleteEndERC20Validation( - // ctx, - // network, - // signatureAggregator, - // fundedKey, - // subnetAInfo, - // pChainInfo, - // stakingManager, - // stakingManagerAddress, - // initialValidationIDs[0], - // weights[0], - // 1, - // ) + expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) + utils.InitializeAndCompleteEndInitialERC20Validation( + ctx, + network, + signatureAggregator, + fundedKey, + subnetAInfo, + pChainInfo, + stakingManager, + stakingManagerAddress, + initialValidationIDs[0], + 0, + expiry, + nodes[0], + weights[0], + 1, + ) // // Register a validator @@ -185,7 +189,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { ) Expect(err).Should(BeNil()) // TODONOW: pass the validatorID pre image to the signature aggregator - expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) + // expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) validationID := utils.InitializeAndCompleteERC20ValidatorRegistration( ctx, network, diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 4244a4bf0..dada1a2ec 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + goLog "log" "math/big" "os" "strconv" @@ -317,10 +318,13 @@ func TraceTransaction(ctx context.Context, rpcClient ethclient.Client, txHash co // Takes a tx hash instead of the full tx in the subnet-evm version of this function. // Copied and modified from https://github.com/ava-labs/subnet-evm/blob/v0.6.0-fuji/accounts/abi/bind/util.go#L42 func WaitMined(ctx context.Context, rpcClient ethclient.Client, txHash common.Hash) (*types.Receipt, error) { + now := time.Now() receipt, err := waitForTransactionReceipt(ctx, rpcClient, txHash) if err != nil { return nil, err } + since := time.Since(now) + goLog.Println("Transaction mined", "txHash", txHash.Hex(), "duration", since) // Check that the block height endpoint returns a block height as high as the block number that the transaction was // included in. This is to workaround the issue where multiple nodes behind a public RPC endpoint see diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index e678d57a0..acca033e0 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -12,6 +12,7 @@ import ( "time" "github.com/ava-labs/avalanchego/ids" + "github.com/ava-labs/avalanchego/proto/pb/platformvm" "github.com/ava-labs/avalanchego/utils/crypto/bls" "github.com/ava-labs/avalanchego/utils/formatting/address" "github.com/ava-labs/avalanchego/utils/units" @@ -34,6 +35,7 @@ import ( poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/PoAValidatorManager" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ethereum/go-ethereum/common" + "google.golang.org/protobuf/proto" . "github.com/onsi/gomega" ) @@ -390,7 +392,7 @@ func InitializeERC20TokenValidatorSet( Expect(err).Should(BeNil()) var validationIDs []ids.ID for i := range nodes { - validationIDs = append(validationIDs, CalculateSubnetConversionValidationId(subnetInfo.SubnetID, uint32(i))) + validationIDs = append(validationIDs, subnetInfo.SubnetID.Append(uint32(i))) } // TODONOW: Validate all nodes @@ -781,6 +783,8 @@ func InitializeAndCompleteNativeValidatorRegistration( // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, + false, + 0, 0, Node{}, 0, @@ -871,6 +875,8 @@ func InitializeAndCompleteERC20ValidatorRegistration( log.Println("Completing validator registration") registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, + false, + 0, expiry, node, weight, @@ -941,6 +947,8 @@ func InitializeAndCompletePoAValidatorRegistration( // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, + false, + 0, 0, Node{}, 0, @@ -1359,6 +1367,8 @@ func InitializeAndCompleteEndNativeValidation( // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, + false, + 0, 0, Node{}, 0, @@ -1387,6 +1397,93 @@ func InitializeAndCompleteEndNativeValidation( Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) } +func InitializeAndCompleteEndInitialERC20Validation( + ctx context.Context, + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, + fundedKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, + stakingManagerAddress common.Address, + validationID ids.ID, + index uint32, + expiry uint64, + node Node, + weight uint64, + nonce uint64, +) { + log.Println("Initializing initial validator removal") + WaitMinStakeDuration(ctx, subnetInfo, fundedKey) + receipt := ForceInitializeEndERC20Validation( + ctx, + fundedKey, + subnetInfo, + stakingManager, + validationID, + ) + validatorRemovalEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + unsignedMessage := network.ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) + signedWarpMessage, err := signatureAggregator.CreateSignedMessage( + unsignedMessage, + nil, + subnetInfo.SubnetID, + 100, + ) + Expect(err).Should(BeNil()) + log.Println("SetSubnetValidatorWeightMessage") + log.Println(signedWarpMessage.Signature.NumSigners()) + log.Println(signedWarpMessage.Signature.String()) + log.Println(signedWarpMessage.SourceChainID.String()) + + // Deliver the Warp message to the P-Chain + network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + PChainProposerVMWorkaround(network) + AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + log.Println("Completing validator removal") + registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + validationID, + true, + index, + expiry, + node, + weight, + false, + subnetInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = CompleteEndERC20Validation( + ctx, + fundedKey, + subnetInfo, + stakingManagerAddress, + registrationSignedMessage, + ) + + // Check that the validator is has been delisted from the staking contract + validationEndedEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodEnded, + ) + Expect(err).Should(BeNil()) + Expect(validationEndedEvent.ValidationID[:]).Should(Equal(validationID[:])) +} + func InitializeAndCompleteEndERC20Validation( ctx context.Context, network interfaces.LocalNetwork, @@ -1443,6 +1540,8 @@ func InitializeAndCompleteEndERC20Validation( log.Println("Completing validator removal") registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, + false, + 0, expiry, node, weight, @@ -1511,6 +1610,8 @@ func InitializeAndCompleteEndPoAValidation( // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, + false, + 0, 0, Node{}, 0, @@ -1545,6 +1646,8 @@ func InitializeAndCompleteEndPoAValidation( func ConstructSubnetValidatorRegistrationMessage( validationID ids.ID, + initialValidator bool, + index uint32, expiry uint64, node Node, weight uint64, @@ -1554,16 +1657,40 @@ func ConstructSubnetValidatorRegistrationMessage( network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { - justification, err := warpMessages.NewRegisterSubnetValidator( - subnet.SubnetID, - node.NodeID, - node.NodePoP.PublicKey, - expiry, - warpMessages.PChainOwner{}, - warpMessages.PChainOwner{}, - weight, - ) - Expect(err).Should(BeNil()) + var ( + justificationBytes []byte + err error + ) + if !initialValidator { + msg, err := warpMessages.NewRegisterSubnetValidator( + subnet.SubnetID, + node.NodeID, + node.NodePoP.PublicKey, + expiry, + warpMessages.PChainOwner{}, + warpMessages.PChainOwner{}, + weight, + ) + Expect(err).Should(BeNil()) + justification := platformvm.SubnetValidatorRegistrationJustification{ + Preimage: &platformvm.SubnetValidatorRegistrationJustification_RegisterSubnetValidatorMessage{ + RegisterSubnetValidatorMessage: msg.Bytes(), + }, + } + justificationBytes, err = proto.Marshal(&justification) + Expect(err).Should(BeNil()) + } else { + justification := platformvm.SubnetValidatorRegistrationJustification{ + Preimage: &platformvm.SubnetValidatorRegistrationJustification_ConvertSubnetTxData{ + ConvertSubnetTxData: &platformvm.SubnetIDIndex{ + SubnetId: subnet.SubnetID[:], + Index: index, + }, + }, + } + justificationBytes, err = proto.Marshal(&justification) + Expect(err).Should(BeNil()) + } registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, valid) Expect(err).Should(BeNil()) @@ -1578,7 +1705,7 @@ func ConstructSubnetValidatorRegistrationMessage( registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( registrationUnsignedMessage, - justification.Bytes(), + justificationBytes, subnet.SubnetID, 100, ) From f4bb683ec129ef3094b6ccfd3021aeeb918b48ef Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 09:06:53 -0500 Subject: [PATCH 467/545] bump avago --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 2bb91e6ad..9f5fc6f72 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module github.com/ava-labs/teleporter go 1.22.8 require ( - github.com/ava-labs/avalanchego v1.12.0-initial-poc.4 + github.com/ava-labs/avalanchego v1.12.0-initial-poc.5 github.com/supranational/blst v0.3.11 // indirect ) diff --git a/go.sum b/go.sum index 06a4b5cce..28835e100 100644 --- a/go.sum +++ b/go.sum @@ -60,6 +60,8 @@ github.com/ava-labs/avalanchego v1.12.0-initial-poc.3 h1:JfVooBCdMzpeGUT9/phJNl2 github.com/ava-labs/avalanchego v1.12.0-initial-poc.3/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= github.com/ava-labs/avalanchego v1.12.0-initial-poc.4 h1:0g1+aJS6f4I2m8oEF3djlfyNbL9UrQTS+6A0eXbRLtM= github.com/ava-labs/avalanchego v1.12.0-initial-poc.4/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= +github.com/ava-labs/avalanchego v1.12.0-initial-poc.5 h1:gW4xAqZNvkA4gP8M9yDyd7YUzuwfQbbCR+hgd1ztOto= +github.com/ava-labs/avalanchego v1.12.0-initial-poc.5/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6 h1:v7k5wQxcvnYcMaz+zoO1OLAcU8REDD1EhfPZdl4Q+aI= github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6/go.mod h1:sSXpQtgiduMdZw5IVTSa1v418VCjb8GDLyrcGwJZ/HE= github.com/ava-labs/coreth v0.13.8 h1:f14X3KgwHl9LwzfxlN6S4bbn5VA2rhEsNnHaRLSTo/8= From f28117952f94061a696a657497aed4fb68168a97 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 13:40:53 -0500 Subject: [PATCH 468/545] add delegation to erc20 staking flow --- .../validator-manager/erc20_token_staking.go | 147 ++++++++++++++++++ 1 file changed, 147 insertions(+) diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index 10c57baa0..564cce850 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -3,6 +3,7 @@ package staking import ( "context" "log" + "math/big" "sort" "time" @@ -206,6 +207,152 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { nodes[0], ) + // // + // Register a delegator + // + var delegationID ids.ID + { + // delegatorStake := big.NewInt(1e17) + log.Println("Registering delegator") + delegatorStake, err := stakingManager.WeightToValue( + &bind.CallOpts{}, + weights[0], + ) + Expect(err).Should(BeNil()) + delegatorStake.Div(delegatorStake, big.NewInt(10)) + delegatorWeight, err := stakingManager.ValueToWeight( + &bind.CallOpts{}, + delegatorStake, + ) + Expect(err).Should(BeNil()) + newValidatorWeight := weights[0] + delegatorWeight + + nonce := uint64(1) + + receipt := utils.InitializeERC20DelegatorRegistration( + ctx, + fundedKey, + subnetAInfo, + validationID, + delegatorStake, + erc20, + stakingManagerAddress, + stakingManager, + ) + initRegistrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorAdded, + ) + Expect(err).Should(BeNil()) + delegationID = initRegistrationEvent.DelegationID + + // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + // utils.ValidateSubnetValidatorWeightMessage( + // signedWarpMessage, + // validationID, + // newValidatorWeight, + // nonce, + // ) + network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + utils.PChainProposerVMWorkaround(network) + utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) + + // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + validationID, + nonce, + newValidatorWeight, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CompleteERC20DelegatorRegistration( + ctx, + fundedKey, + delegationID, + subnetAInfo, + stakingManagerAddress, + registrationSignedMessage, + ) + // Check that the validator is registered in the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) + } + // + // Delist the delegator + // + { + log.Println("Delisting delegator") + nonce := uint64(2) + receipt := utils.InitializeEndERC20Delegation( + ctx, + fundedKey, + subnetAInfo, + stakingManager, + delegationID, + ) + delegatorRemovalEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(delegatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(delegatorRemovalEvent.DelegationID[:]).Should(Equal(delegationID[:])) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + Expect(err).Should(BeNil()) + + // Validate the Warp message, (this will be done on the P-Chain in the future) + // utils.ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, weights[0], 2) + network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + utils.PChainProposerVMWorkaround(network) + utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) + + // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain + signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + validationID, + nonce, + weights[0], + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CompleteEndERC20Delegation( + ctx, + fundedKey, + delegationID, + subnetAInfo, + stakingManagerAddress, + signedMessage, + ) + + // Check that the delegator has been delisted from the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegationEnded, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) + } + // // Delist the validator // From 06a244e0b422e4e9d02775730eb0610f44c4410b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 13:46:01 -0500 Subject: [PATCH 469/545] resolve todos --- .../validator-manager/erc20_token_staking.go | 47 ++++--------------- tests/local/network.go | 10 ---- tests/utils/validator_manager.go | 24 ++-------- 3 files changed, 12 insertions(+), 69 deletions(-) diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index 564cce850..2b39e129d 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -60,6 +60,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { var nodes []utils.Node + // Remove the current validators before converting the subnet for _, uri := range subnetAInfo.NodeURIs { infoClient := info.NewClient(uri) nodeID, nodePoP, err := infoClient.GetNodeID(ctx) @@ -69,7 +70,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { NodePoP: nodePoP, }) - // Remove the current validators before converting the subnet _, err = network.GetPChainWallet().IssueRemoveSubnetValidatorTx( nodeID, subnetAInfo.SubnetID, @@ -91,9 +91,8 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // Set the last node's weight such that removing any other node will not violate the churn limit weights[len(nodes)-1] = 4 * totalWeight - // TODONOW: issue a P-Chain ConvertSubnetTx - destAddrStr := "P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u" - destAddr, err := address.ParseToID(destAddrStr) + // Construct the convert subnet info + destAddr, err := address.ParseToID(utils.DefaultPChainAddress) Expect(err).Should(BeNil()) vdrs := make([]*txs.ConvertSubnetValidator, len(nodes)) for i, node := range nodes { @@ -113,24 +112,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { } } - // Set just the last node (with a high weight) to the initial validator list - // vdrs := []*txs.ConvertSubnetValidator{ - // { - // NodeID: nodes[len(nodes)-1].NodeID.Bytes(), - // Weight: weights[len(nodes)-1], - // Balance: units.Avax * 100, - // Signer: *nodes[len(nodes)-1].NodePoP, - // RemainingBalanceOwner: message.PChainOwner{ - // Threshold: 1, - // Addresses: []ids.ShortID{destAddr}, - // }, - // DeactivationOwner: message.PChainOwner{ - // Threshold: 1, - // Addresses: []ids.ShortID{destAddr}, - // }, - // }, - // } - log.Println("Issuing ConvertSubnetTx") _, err = network.GetPChainWallet().IssueConvertSubnetTx( subnetAInfo.SubnetID, @@ -141,7 +122,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) utils.PChainProposerVMWorkaround(network) - utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) // Initialize the validator set on the subnet @@ -159,7 +139,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { weights, ) - // Delisting an initial validator does not work due to the way Warp signatures are requested for inital validators // // Delist one initial validators // @@ -182,15 +161,13 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { ) // - // Register a validator + // Register the validator as PoS // stakeAmount, err := stakingManager.WeightToValue( &bind.CallOpts{}, weights[0], ) Expect(err).Should(BeNil()) - // TODONOW: pass the validatorID pre image to the signature aggregator - // expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) validationID := utils.InitializeAndCompleteERC20ValidatorRegistration( ctx, network, @@ -207,12 +184,11 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { nodes[0], ) - // // + // // Register a delegator // var delegationID ids.ID { - // delegatorStake := big.NewInt(1e17) log.Println("Registering delegator") delegatorStake, err := stakingManager.WeightToValue( &bind.CallOpts{}, @@ -250,13 +226,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // (Sending to the P-Chain will be skipped for now) signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - // Validate the Warp message, (this will be done on the P-Chain in the future) - // utils.ValidateSubnetValidatorWeightMessage( - // signedWarpMessage, - // validationID, - // newValidatorWeight, - // nonce, - // ) + // Issue a tx to update the validator's weight on the P-Chain network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) utils.PChainProposerVMWorkaround(network) utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) @@ -290,6 +260,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) } + // // Delist the delegator // @@ -316,9 +287,9 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) Expect(err).Should(BeNil()) - // Validate the Warp message, (this will be done on the P-Chain in the future) - // utils.ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, weights[0], 2) + // Issue a tx to update the validator's weight on the P-Chain network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + utils.PChainProposerVMWorkaround(network) utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) diff --git a/tests/local/network.go b/tests/local/network.go index f97770193..8ef2cb9de 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -97,15 +97,6 @@ func NewLocalNetwork( globalFundedECDSAKey := globalFundedKey.ToECDSA() Expect(err).Should(BeNil()) - g, err := crypto.HexToECDSA(fundedKeyStr) - Expect(err).Should(BeNil()) - // TODONOW: remove these once txs are verified - Expect(g.PublicKey.X).Should(Equal(globalFundedECDSAKey.PublicKey.X)) - Expect(g.PublicKey.Y).Should(Equal(globalFundedECDSAKey.PublicKey.Y)) - Expect(g.X).Should(Equal(globalFundedECDSAKey.X)) - Expect(g.Y).Should(Equal(globalFundedECDSAKey.Y)) - Expect(g.D).Should(Equal(globalFundedECDSAKey.D)) - var subnets []*tmpnet.Subnet for _, subnetSpec := range subnetSpecs { nodes := subnetEvmTestUtils.NewTmpnetNodes(subnetSpec.NodeCount) @@ -166,7 +157,6 @@ func NewLocalNetwork( setupProposerVM(ctx, globalFundedECDSAKey, network, subnet.SubnetID) } - // TODONOW: add Wallet LocalNetwork struct localNetwork := &LocalNetwork{ primaryNetworkInfo: &interfaces.SubnetTestInfo{}, subnetsInfo: make(map[ids.ID]*interfaces.SubnetTestInfo), diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index acca033e0..9c6616307 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -48,6 +48,7 @@ const ( DefaultMaxStakeMultiplier uint8 = 4 DefaultMaxChurnPercentage uint8 = 20 DefaultChurnPeriodSeconds uint64 = 1 + DefaultPChainAddress string = "P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u" ) // @@ -395,10 +396,6 @@ func InitializeERC20TokenValidatorSet( validationIDs = append(validationIDs, subnetInfo.SubnetID.Append(uint32(i))) } - // TODONOW: Validate all nodes - // for i := range nodes { - // TODONOW: Fix this validation - // Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.Validators[i].NodeID)) Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(initialValidatorWeights[0]))) emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) @@ -847,22 +844,8 @@ func InitializeAndCompleteERC20ValidatorRegistration( // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - // TODONOW: construct the pre-image of the validationID as the justification signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) - // weight, err := stakingManager.ValueToWeight( - // &bind.CallOpts{}, - // stakeAmount, - // ) - // Expect(err).Should(BeNil()) - // Validate the Warp message, (this will be done on the P-Chain in the future) - // ValidateRegisterSubnetValidatorMessage( - // signedWarpMessage, - // nodeID, - // weight, - // subnetInfo.SubnetID, - // blsPublicKey, - // ) _, err := network.GetPChainWallet().IssueRegisterSubnetValidatorTx( 100*units.Avax, node.NodePoP.ProofOfPossession, @@ -1976,9 +1959,8 @@ func PackInitialValidator(iv interface{}) ([]byte, error) { func PChainProposerVMWorkaround( network interfaces.LocalNetwork, ) { - // // Workaround current block map rules - destAddrStr := "P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u" - destAddr, err := address.ParseToID(destAddrStr) + // Workaround current block map rules + destAddr, err := address.ParseToID(DefaultPChainAddress) Expect(err).Should(BeNil()) log.Println("Waiting for P-Chain...") time.Sleep(30 * time.Second) From d6e063238a479296cea9365ab172ad3776fbf395 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 14:03:20 -0500 Subject: [PATCH 470/545] separate init vdr helpers --- .../validator-manager/erc20_token_staking.go | 5 +- tests/utils/validator_manager.go | 145 ++++++++---------- 2 files changed, 64 insertions(+), 86 deletions(-) diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index 2b39e129d..4279d8e96 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -142,7 +142,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // // Delist one initial validators // - expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) utils.InitializeAndCompleteEndInitialERC20Validation( ctx, network, @@ -154,10 +153,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakingManagerAddress, initialValidationIDs[0], 0, - expiry, - nodes[0], weights[0], - 1, ) // @@ -168,6 +164,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { weights[0], ) Expect(err).Should(BeNil()) + expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) validationID := utils.InitializeAndCompleteERC20ValidatorRegistration( ctx, network, diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 9c6616307..43630b8db 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -359,9 +359,6 @@ func InitializeERC20TokenValidatorSet( InitialValidators: initialValidatorsABI, } subnetConversionID, err := warpMessages.SubnetConversionID(subnetConversionData) - log.Println("Reconstructed SubnetConversionID") - log.Println(subnetConversionData) - log.Printf("conversionID: %s\n", subnetConversionID.String()) Expect(err).Should(BeNil()) // subnetConversionDataBytes, err := PackSubnetConversionData(subnetConversionData) // Expect(err).Should(BeNil()) @@ -373,10 +370,7 @@ func InitializeERC20TokenValidatorSet( network, signatureAggregator, ) - log.Println("SubnetConversionSignedMessage") - log.Println(subnetConversionSignedMessage.Signature.NumSigners()) - log.Println(subnetConversionSignedMessage.Signature.String()) - log.Println(subnetConversionSignedMessage.SourceChainID.String()) + // Deliver the Warp message to the subnet receipt := DeliverERC20TokenSubnetConversion( ctx, @@ -400,10 +394,7 @@ func InitializeERC20TokenValidatorSet( emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) Expect(emittedValidationID).Should(Equal(validationIDs[0])) - log.Println("Expected Validation ID", validationIDs[0]) - log.Println("Emitted Validation ID", emittedValidationID) - // } - log.Println("Validation IDs", validationIDs) + return validationIDs } @@ -780,8 +771,6 @@ func InitializeAndCompleteNativeValidatorRegistration( // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, - false, - 0, 0, Node{}, 0, @@ -858,8 +847,6 @@ func InitializeAndCompleteERC20ValidatorRegistration( log.Println("Completing validator registration") registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, - false, - 0, expiry, node, weight, @@ -930,8 +917,6 @@ func InitializeAndCompletePoAValidatorRegistration( // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, - false, - 0, 0, Node{}, 0, @@ -1350,8 +1335,6 @@ func InitializeAndCompleteEndNativeValidation( // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, - false, - 0, 0, Node{}, 0, @@ -1391,10 +1374,7 @@ func InitializeAndCompleteEndInitialERC20Validation( stakingManagerAddress common.Address, validationID ids.ID, index uint32, - expiry uint64, - node Node, weight uint64, - nonce uint64, ) { log.Println("Initializing initial validator removal") WaitMinStakeDuration(ctx, subnetInfo, fundedKey) @@ -1423,10 +1403,6 @@ func InitializeAndCompleteEndInitialERC20Validation( 100, ) Expect(err).Should(BeNil()) - log.Println("SetSubnetValidatorWeightMessage") - log.Println(signedWarpMessage.Signature.NumSigners()) - log.Println(signedWarpMessage.Signature.String()) - log.Println(signedWarpMessage.SourceChainID.String()) // Deliver the Warp message to the P-Chain network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) @@ -1434,14 +1410,10 @@ func InitializeAndCompleteEndInitialERC20Validation( AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain - log.Println("Completing validator removal") - registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( + log.Println("Completing initial validator removal") + registrationSignedMessage := ConstructSubnetValidatorRegistrationMessageForInitialValidator( validationID, - true, index, - expiry, - node, - weight, false, subnetInfo, pChainInfo, @@ -1509,10 +1481,6 @@ func InitializeAndCompleteEndERC20Validation( 100, ) Expect(err).Should(BeNil()) - log.Println("SetSubnetValidatorWeightMessage") - log.Println(signedWarpMessage.Signature.NumSigners()) - log.Println(signedWarpMessage.Signature.String()) - log.Println(signedWarpMessage.SourceChainID.String()) // Deliver the Warp message to the P-Chain network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) @@ -1523,8 +1491,6 @@ func InitializeAndCompleteEndERC20Validation( log.Println("Completing validator removal") registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, - false, - 0, expiry, node, weight, @@ -1593,8 +1559,6 @@ func InitializeAndCompleteEndPoAValidation( // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, - false, - 0, 0, Node{}, 0, @@ -1627,10 +1591,50 @@ func InitializeAndCompleteEndPoAValidation( // P-Chain utils // -func ConstructSubnetValidatorRegistrationMessage( +func ConstructSubnetValidatorRegistrationMessageForInitialValidator( validationID ids.ID, - initialValidator bool, index uint32, + valid bool, + subnet interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, +) *avalancheWarp.Message { + justification := platformvm.SubnetValidatorRegistrationJustification{ + Preimage: &platformvm.SubnetValidatorRegistrationJustification_ConvertSubnetTxData{ + ConvertSubnetTxData: &platformvm.SubnetIDIndex{ + SubnetId: subnet.SubnetID[:], + Index: index, + }, + }, + } + justificationBytes, err := proto.Marshal(&justification) + Expect(err).Should(BeNil()) + + registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, valid) + Expect(err).Should(BeNil()) + registrationAddressedCall, err := warpPayload.NewAddressedCall(nil, registrationPayload.Bytes()) + Expect(err).Should(BeNil()) + registrationUnsignedMessage, err := avalancheWarp.NewUnsignedMessage( + network.GetNetworkID(), + pChainInfo.BlockchainID, + registrationAddressedCall.Bytes(), + ) + Expect(err).Should(BeNil()) + + registrationSignedMessage, err := signatureAggregator.CreateSignedMessage( + registrationUnsignedMessage, + justificationBytes, + subnet.SubnetID, + 100, + ) + Expect(err).Should(BeNil()) + + return registrationSignedMessage +} + +func ConstructSubnetValidatorRegistrationMessage( + validationID ids.ID, expiry uint64, node Node, weight uint64, @@ -1640,40 +1644,23 @@ func ConstructSubnetValidatorRegistrationMessage( network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { - var ( - justificationBytes []byte - err error - ) - if !initialValidator { - msg, err := warpMessages.NewRegisterSubnetValidator( - subnet.SubnetID, - node.NodeID, - node.NodePoP.PublicKey, - expiry, - warpMessages.PChainOwner{}, - warpMessages.PChainOwner{}, - weight, - ) - Expect(err).Should(BeNil()) - justification := platformvm.SubnetValidatorRegistrationJustification{ - Preimage: &platformvm.SubnetValidatorRegistrationJustification_RegisterSubnetValidatorMessage{ - RegisterSubnetValidatorMessage: msg.Bytes(), - }, - } - justificationBytes, err = proto.Marshal(&justification) - Expect(err).Should(BeNil()) - } else { - justification := platformvm.SubnetValidatorRegistrationJustification{ - Preimage: &platformvm.SubnetValidatorRegistrationJustification_ConvertSubnetTxData{ - ConvertSubnetTxData: &platformvm.SubnetIDIndex{ - SubnetId: subnet.SubnetID[:], - Index: index, - }, - }, - } - justificationBytes, err = proto.Marshal(&justification) - Expect(err).Should(BeNil()) + msg, err := warpMessages.NewRegisterSubnetValidator( + subnet.SubnetID, + node.NodeID, + node.NodePoP.PublicKey, + expiry, + warpMessages.PChainOwner{}, + warpMessages.PChainOwner{}, + weight, + ) + Expect(err).Should(BeNil()) + justification := platformvm.SubnetValidatorRegistrationJustification{ + Preimage: &platformvm.SubnetValidatorRegistrationJustification_RegisterSubnetValidatorMessage{ + RegisterSubnetValidatorMessage: msg.Bytes(), + }, } + justificationBytes, err := proto.Marshal(&justification) + Expect(err).Should(BeNil()) registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, valid) Expect(err).Should(BeNil()) @@ -1693,13 +1680,7 @@ func ConstructSubnetValidatorRegistrationMessage( 100, ) Expect(err).Should(BeNil()) - log.Println("SubnetValidatorRegistrationMessage") - log.Printf("valid=%t", valid) - numSigners, err := registrationSignedMessage.Signature.NumSigners() - Expect(err).Should(BeNil()) - log.Println("numSigners", numSigners) - log.Println("signature", registrationSignedMessage.Signature.String()) - log.Println("sourceChain", registrationSignedMessage.SourceChainID.String()) + return registrationSignedMessage } From ead93bcaec9fe540584e2c080777f5647a4c3a43 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 14:10:50 -0500 Subject: [PATCH 471/545] reduce to 67 quorum --- tests/utils/validator_manager.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 43630b8db..389e760da 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -1400,7 +1400,7 @@ func InitializeAndCompleteEndInitialERC20Validation( unsignedMessage, nil, subnetInfo.SubnetID, - 100, + 67, ) Expect(err).Should(BeNil()) @@ -1478,7 +1478,7 @@ func InitializeAndCompleteEndERC20Validation( unsignedMessage, nil, subnetInfo.SubnetID, - 100, + 67, ) Expect(err).Should(BeNil()) @@ -1626,7 +1626,7 @@ func ConstructSubnetValidatorRegistrationMessageForInitialValidator( registrationUnsignedMessage, justificationBytes, subnet.SubnetID, - 100, + 67, ) Expect(err).Should(BeNil()) @@ -1677,7 +1677,7 @@ func ConstructSubnetValidatorRegistrationMessage( registrationUnsignedMessage, justificationBytes, subnet.SubnetID, - 100, + 67, ) Expect(err).Should(BeNil()) @@ -1739,7 +1739,7 @@ func ConstructSubnetConversionMessage( subnetConversionUnsignedMessage, subnet.SubnetID[:], subnet.SubnetID, - 100, + 67, ) Expect(err).Should(BeNil()) return subnetConversionSignedMessage From 7c1e007b72c05ea24aeb99db4ea2de8c03823da4 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 15:07:39 -0500 Subject: [PATCH 472/545] separate e2e suites --- scripts/local/e2e_test.sh | 54 +++- tests/local/e2e_test.go | 232 ------------------ .../local/governance/governance_suite_test.go | 114 +++++++++ tests/local/network.go | 5 + .../local/teleporter/teleporter_suite_test.go | 192 +++++++++++++++ .../validator_manager_suite_test.go | 139 +++++++++++ 6 files changed, 500 insertions(+), 236 deletions(-) delete mode 100644 tests/local/e2e_test.go create mode 100644 tests/local/governance/governance_suite_test.go create mode 100644 tests/local/teleporter/teleporter_suite_test.go create mode 100644 tests/local/validator-manager/validator_manager_suite_test.go diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index 16ddc818b..a7d0beffc 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -9,6 +9,53 @@ TELEPORTER_PATH=$( cd ../.. && pwd ) +function printHelp() { + echo "Usage: ./scripts/local/e2e_test.sh [--component component]" + echo "" + printUsage +} + +function printUsage() { + cat << EOF +Arguments: + --component Component test suite to run. If omitted, runs all tests. +Options: + --help Print this help message +EOF +} + +valid_components="teleporter governance validator-manager" +component= + +while [ $# -gt 0 ]; do + case "$1" in + --component) + if [[ $2 != --* ]]; then + component=$2 + else + echo "Invalid component $2" && printHelp && exit 1 + fi + shift;; + --help) + printHelp && exit 0 ;; + *) + echo "Invalid option: $1" && printHelp && exit 1;; + esac + shift +done + +# Exit if no component is provided +# TODONOW: Run all tests if no component is provided +if [ -z "$component" ]; then + echo "No component provided" && exit 1 +fi + +if echo "$valid_components" | grep -q "\b$component\b"; then + echo "" > /dev/null +else + echo "Invalid component" && exit 1 +fi + source "$TELEPORTER_PATH"/scripts/constants.sh source "$TELEPORTER_PATH"/scripts/versions.sh @@ -20,8 +67,7 @@ rm -rf $BASEDIR/avalanchego BASEDIR=$BASEDIR AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego "${TELEPORTER_PATH}/scripts/install_avalanchego_release.sh" BASEDIR=$BASEDIR "${TELEPORTER_PATH}/scripts/install_subnetevm_release.sh" -# cp ${BASEDIR}/subnet-evm/subnet-evm ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy -cp /Users/cameron.schultz/.avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy +cp ${BASEDIR}/subnet-evm/subnet-evm ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy echo "Copied ${BASEDIR}/subnet-evm/subnet-evm binary to ${BASEDIR}/avalanchego/plugins/" export AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego @@ -39,11 +85,11 @@ cd "$TELEPORTER_PATH" # to install the ginkgo binary (required for test build and run) go install -v github.com/onsi/ginkgo/v2/ginkgo@${GINKGO_VERSION} -ginkgo build ./tests/local/ +ginkgo build ./tests/local/$component # Run the tests echo "Running e2e tests $RUN_E2E" -RUN_E2E=true ./tests/local/local.test \ +RUN_E2E=true ./tests/local//$component/$component.test \ --ginkgo.vv \ --ginkgo.label-filter=${GINKGO_LABEL_FILTER:-""} \ --ginkgo.focus=${GINKGO_FOCUS:-""} \ diff --git a/tests/local/e2e_test.go b/tests/local/e2e_test.go deleted file mode 100644 index aad4ccefa..000000000 --- a/tests/local/e2e_test.go +++ /dev/null @@ -1,232 +0,0 @@ -// Copyright (C) 2023, Ava Labs, Inc. All rights reserved. -// See the file LICENSE for licensing terms. - -package local - -import ( - "context" - "os" - "testing" - "time" - - validatorManager "github.com/ava-labs/teleporter/tests/flows/validator-manager" - deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" - "github.com/ethereum/go-ethereum/log" - "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -const ( - teleporterByteCodeFile = "./out/TeleporterMessenger.sol/TeleporterMessenger.json" - warpGenesisTemplateFile = "./tests/utils/warp-genesis-template.json" - - teleporterMessengerLabel = "TeleporterMessenger" - upgradabilityLabel = "upgradability" - utilsLabel = "utils" - validatorSetSigLabel = "ValidatorSetSig" - validatorManagerLabel = "ValidatorManager" -) - -var ( - LocalNetworkInstance *LocalNetwork -) - -func TestE2E(t *testing.T) { - if os.Getenv("RUN_E2E") == "" { - t.Skip("Environment variable RUN_E2E not set; skipping E2E tests") - } - - RegisterFailHandler(ginkgo.Fail) - ginkgo.RunSpecs(t, "Teleporter e2e test") -} - -// Define the Teleporter before and after suite functions. -var _ = ginkgo.BeforeSuite(func() { - // Generate the Teleporter deployment values - teleporterDeployerTransaction, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := - deploymentUtils.ConstructKeylessTransaction( - teleporterByteCodeFile, - false, - deploymentUtils.GetDefaultContractCreationGasPrice(), - ) - Expect(err).Should(BeNil()) - - // Create the local network instance - ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) - defer cancel() - LocalNetworkInstance = NewLocalNetwork( - ctx, - "teleporter-test-local-network", - warpGenesisTemplateFile, - []SubnetSpec{ - { - Name: "A", - EVMChainID: 12345, - TeleporterContractAddress: teleporterContractAddress, - TeleporterDeployedBytecode: teleporterDeployedBytecode, - TeleporterDeployerAddress: teleporterDeployerAddress, - NodeCount: 2, - }, - { - Name: "B", - EVMChainID: 54321, - TeleporterContractAddress: teleporterContractAddress, - TeleporterDeployedBytecode: teleporterDeployedBytecode, - TeleporterDeployerAddress: teleporterDeployerAddress, - NodeCount: 2, - }, - }, - 2, - ) - log.Info("Started local network") - - // Only need to deploy Teleporter on the C-Chain since it is included in the genesis of the subnet chains. - _, fundedKey := LocalNetworkInstance.GetFundedAccountInfo() - LocalNetworkInstance.DeployTeleporterContractToCChain( - teleporterDeployerTransaction, - teleporterDeployerAddress, - teleporterContractAddress, - fundedKey, - ) - LocalNetworkInstance.SetTeleporterContractAddress(teleporterContractAddress) - - // Deploy the Teleporter registry contracts to all subnets and the C-Chain. - LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) - - ginkgo.AddReportEntry( - "network directory with node logs & configs; useful in the case of failures", - LocalNetworkInstance.tmpnet.Dir, - ginkgo.ReportEntryVisibilityFailureOrVerbose, - ) - - log.Info("Set up ginkgo before suite") -}) - -var _ = ginkgo.AfterSuite(func() { - LocalNetworkInstance.TearDownNetwork() -}) - -var _ = ginkgo.Describe("[Teleporter integration tests]", func() { - // // Teleporter tests - // ginkgo.It("Send a message from Subnet A to Subnet B, and one from B to A", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // teleporter.BasicSendReceive(LocalNetworkInstance) - // }) - // ginkgo.It("Deliver to the wrong chain", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // teleporter.DeliverToWrongChain(LocalNetworkInstance) - // }) - // ginkgo.It("Deliver to non-existent contract", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // teleporter.DeliverToNonExistentContract(LocalNetworkInstance) - // }) - // ginkgo.It("Retry successful execution", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // teleporter.RetrySuccessfulExecution(LocalNetworkInstance) - // }) - // ginkgo.It("Unallowed relayer", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // teleporter.UnallowedRelayer(LocalNetworkInstance) - // }) - // ginkgo.It("Relay message twice", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // teleporter.RelayMessageTwice(LocalNetworkInstance) - // }) - // ginkgo.It("Add additional fee amount", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // teleporter.AddFeeAmount(LocalNetworkInstance) - // }) - // ginkgo.It("Send specific receipts", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // teleporter.SendSpecificReceipts(LocalNetworkInstance) - // }) - // ginkgo.It("Insufficient gas", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // teleporter.InsufficientGas(LocalNetworkInstance) - // }) - // ginkgo.It("Resubmit altered message", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // teleporter.ResubmitAlteredMessage(LocalNetworkInstance) - // }) - // ginkgo.It("Calculate Teleporter message IDs", - // ginkgo.Label(utilsLabel), - // func() { - // teleporter.CalculateMessageID(LocalNetworkInstance) - // }) - // ginkgo.It("Relayer modifies message", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // teleporter.RelayerModifiesMessage(LocalNetworkInstance) - // }) - // ginkgo.It("Validator churn", - // ginkgo.Label(teleporterMessengerLabel), - // func() { - // teleporter.ValidatorChurn(LocalNetworkInstance) - // }) - - // // Teleporter Registry tests - // ginkgo.It("Teleporter registry", - // ginkgo.Label(upgradabilityLabel), - // func() { - // registry.TeleporterRegistry(LocalNetworkInstance) - // }) - // ginkgo.It("Check upgrade access", - // ginkgo.Label(upgradabilityLabel), - // func() { - // registry.CheckUpgradeAccess(LocalNetworkInstance) - // }) - // ginkgo.It("Pause and Unpause Teleporter", - // ginkgo.Label(upgradabilityLabel), - // func() { - // registry.PauseTeleporter(LocalNetworkInstance) - // }) - - // // Governance tests - // ginkgo.It("Deliver ValidatorSetSig signed message", - // ginkgo.Label(validatorSetSigLabel), - // func() { - // governance.ValidatorSetSig(LocalNetworkInstance) - // }) - - // // Validator Manager tests - // ginkgo.It("Native token staking manager", - // ginkgo.Label(validatorManagerLabel), - // func() { - // validatorManager.NativeTokenStakingManager(LocalNetworkInstance) - // }) - ginkgo.It("ERC20 token staking manager", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManager.ERC20TokenStakingManager(LocalNetworkInstance) - }) - // ginkgo.It("PoA validator manager", - // ginkgo.Label(validatorManagerLabel), - // func() { - // validatorManager.PoAValidatorManager(LocalNetworkInstance) - // }) - // ginkgo.It("ERC20 delegation", - // ginkgo.Label(validatorManagerLabel), - // func() { - // validatorManager.ERC20Delegation(LocalNetworkInstance) - // }) - // ginkgo.It("Native token delegation", - // ginkgo.Label(validatorManagerLabel), - // func() { - // validatorManager.NativeDelegation(LocalNetworkInstance) - // }) - // ginkgo.It("PoA migration to PoS", - // ginkgo.Label(validatorManagerLabel), - // func() { - // validatorManager.PoAMigrationToPoS(LocalNetworkInstance) - // }) -}) diff --git a/tests/local/governance/governance_suite_test.go b/tests/local/governance/governance_suite_test.go new file mode 100644 index 000000000..31da93101 --- /dev/null +++ b/tests/local/governance/governance_suite_test.go @@ -0,0 +1,114 @@ +package governance_test + +import ( + "context" + "os" + "testing" + "time" + + governanceFlows "github.com/ava-labs/teleporter/tests/flows/governance" + "github.com/ava-labs/teleporter/tests/local" + deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" + "github.com/ethereum/go-ethereum/log" + "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +const ( + teleporterByteCodeFile = "./out/TeleporterMessenger.sol/TeleporterMessenger.json" + warpGenesisTemplateFile = "./tests/utils/warp-genesis-template.json" + + teleporterMessengerLabel = "TeleporterMessenger" + upgradabilityLabel = "upgradability" + utilsLabel = "utils" + validatorSetSigLabel = "ValidatorSetSig" + validatorManagerLabel = "ValidatorManager" +) + +var ( + LocalNetworkInstance *local.LocalNetwork +) + +func TestGovernance(t *testing.T) { + if os.Getenv("RUN_E2E") == "" { + t.Skip("Environment variable RUN_E2E not set; skipping E2E tests") + } + + RegisterFailHandler(ginkgo.Fail) + ginkgo.RunSpecs(t, "Teleporter e2e test") +} + +// Define the Teleporter before and after suite functions. +var _ = ginkgo.BeforeSuite(func() { + // Generate the Teleporter deployment values + teleporterDeployerTransaction, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := + deploymentUtils.ConstructKeylessTransaction( + teleporterByteCodeFile, + false, + deploymentUtils.GetDefaultContractCreationGasPrice(), + ) + Expect(err).Should(BeNil()) + + // Create the local network instance + ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) + defer cancel() + LocalNetworkInstance = local.NewLocalNetwork( + ctx, + "teleporter-test-local-network", + warpGenesisTemplateFile, + []local.SubnetSpec{ + { + Name: "A", + EVMChainID: 12345, + TeleporterContractAddress: teleporterContractAddress, + TeleporterDeployedBytecode: teleporterDeployedBytecode, + TeleporterDeployerAddress: teleporterDeployerAddress, + NodeCount: 2, + }, + { + Name: "B", + EVMChainID: 54321, + TeleporterContractAddress: teleporterContractAddress, + TeleporterDeployedBytecode: teleporterDeployedBytecode, + TeleporterDeployerAddress: teleporterDeployerAddress, + NodeCount: 2, + }, + }, + 2, + ) + log.Info("Started local network") + + // Only need to deploy Teleporter on the C-Chain since it is included in the genesis of the subnet chains. + _, fundedKey := LocalNetworkInstance.GetFundedAccountInfo() + LocalNetworkInstance.DeployTeleporterContractToCChain( + teleporterDeployerTransaction, + teleporterDeployerAddress, + teleporterContractAddress, + fundedKey, + ) + LocalNetworkInstance.SetTeleporterContractAddress(teleporterContractAddress) + + // Deploy the Teleporter registry contracts to all subnets and the C-Chain. + LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) + + ginkgo.AddReportEntry( + "network directory with node logs & configs; useful in the case of failures", + LocalNetworkInstance.TmpNet().Dir, + ginkgo.ReportEntryVisibilityFailureOrVerbose, + ) + + log.Info("Set up ginkgo before suite") +}) + +var _ = ginkgo.AfterSuite(func() { + LocalNetworkInstance.TearDownNetwork() +}) + +var _ = ginkgo.Describe("[Governance integration tests]", func() { + // Governance tests + ginkgo.It("Deliver ValidatorSetSig signed message", + ginkgo.Label(validatorSetSigLabel), + func() { + governanceFlows.ValidatorSetSig(LocalNetworkInstance) + }) +}) diff --git a/tests/local/network.go b/tests/local/network.go index 8ef2cb9de..6f667082f 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -74,6 +74,7 @@ type SubnetSpec struct { NodeCount int } +// TODONOW: Decouple Teleporter from the network interface func NewLocalNetwork( ctx context.Context, name string, @@ -188,6 +189,10 @@ func NewLocalNetwork( return localNetwork } +func (n *LocalNetwork) TmpNet() *tmpnet.Network { + return n.tmpnet +} + // Should be called after setSubnetValues for all subnets func (n *LocalNetwork) setPrimaryNetworkValues() { // Get the C-Chain node URIs. diff --git a/tests/local/teleporter/teleporter_suite_test.go b/tests/local/teleporter/teleporter_suite_test.go new file mode 100644 index 000000000..c93a07541 --- /dev/null +++ b/tests/local/teleporter/teleporter_suite_test.go @@ -0,0 +1,192 @@ +package teleporter_test + +import ( + "context" + "os" + "testing" + "time" + + teleporterFlows "github.com/ava-labs/teleporter/tests/flows/teleporter" + registryFlows "github.com/ava-labs/teleporter/tests/flows/teleporter/registry" + "github.com/ava-labs/teleporter/tests/local" + deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" + "github.com/ethereum/go-ethereum/log" + "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +const ( + teleporterByteCodeFile = "./out/TeleporterMessenger.sol/TeleporterMessenger.json" + warpGenesisTemplateFile = "./tests/utils/warp-genesis-template.json" + + teleporterMessengerLabel = "TeleporterMessenger" + upgradabilityLabel = "upgradability" + utilsLabel = "utils" + validatorSetSigLabel = "ValidatorSetSig" + validatorManagerLabel = "ValidatorManager" +) + +var ( + LocalNetworkInstance *local.LocalNetwork +) + +func TestTeleporter(t *testing.T) { + if os.Getenv("RUN_E2E") == "" { + t.Skip("Environment variable RUN_E2E not set; skipping E2E tests") + } + + RegisterFailHandler(ginkgo.Fail) + ginkgo.RunSpecs(t, "Teleporter e2e test") +} + +// Define the Teleporter before and after suite functions. +var _ = ginkgo.BeforeSuite(func() { + // Generate the Teleporter deployment values + teleporterDeployerTransaction, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := + deploymentUtils.ConstructKeylessTransaction( + teleporterByteCodeFile, + false, + deploymentUtils.GetDefaultContractCreationGasPrice(), + ) + Expect(err).Should(BeNil()) + + // Create the local network instance + ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) + defer cancel() + LocalNetworkInstance = local.NewLocalNetwork( + ctx, + "teleporter-test-local-network", + warpGenesisTemplateFile, + []local.SubnetSpec{ + { + Name: "A", + EVMChainID: 12345, + TeleporterContractAddress: teleporterContractAddress, + TeleporterDeployedBytecode: teleporterDeployedBytecode, + TeleporterDeployerAddress: teleporterDeployerAddress, + NodeCount: 2, + }, + { + Name: "B", + EVMChainID: 54321, + TeleporterContractAddress: teleporterContractAddress, + TeleporterDeployedBytecode: teleporterDeployedBytecode, + TeleporterDeployerAddress: teleporterDeployerAddress, + NodeCount: 2, + }, + }, + 2, + ) + log.Info("Started local network") + + // Only need to deploy Teleporter on the C-Chain since it is included in the genesis of the subnet chains. + _, fundedKey := LocalNetworkInstance.GetFundedAccountInfo() + LocalNetworkInstance.DeployTeleporterContractToCChain( + teleporterDeployerTransaction, + teleporterDeployerAddress, + teleporterContractAddress, + fundedKey, + ) + LocalNetworkInstance.SetTeleporterContractAddress(teleporterContractAddress) + + // Deploy the Teleporter registry contracts to all subnets and the C-Chain. + LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) + + ginkgo.AddReportEntry( + "network directory with node logs & configs; useful in the case of failures", + LocalNetworkInstance.TmpNet().Dir, + ginkgo.ReportEntryVisibilityFailureOrVerbose, + ) + + log.Info("Set up ginkgo before suite") +}) + +var _ = ginkgo.AfterSuite(func() { + LocalNetworkInstance.TearDownNetwork() +}) + +var _ = ginkgo.Describe("[Teleporter integration tests]", func() { + // Teleporter tests + ginkgo.It("Send a message from Subnet A to Subnet B, and one from B to A", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporterFlows.BasicSendReceive(LocalNetworkInstance) + }) + ginkgo.It("Deliver to the wrong chain", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporterFlows.DeliverToWrongChain(LocalNetworkInstance) + }) + ginkgo.It("Deliver to non-existent contract", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporterFlows.DeliverToNonExistentContract(LocalNetworkInstance) + }) + ginkgo.It("Retry successful execution", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporterFlows.RetrySuccessfulExecution(LocalNetworkInstance) + }) + ginkgo.It("Unallowed relayer", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporterFlows.UnallowedRelayer(LocalNetworkInstance) + }) + ginkgo.It("Relay message twice", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporterFlows.RelayMessageTwice(LocalNetworkInstance) + }) + ginkgo.It("Add additional fee amount", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporterFlows.AddFeeAmount(LocalNetworkInstance) + }) + ginkgo.It("Send specific receipts", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporterFlows.SendSpecificReceipts(LocalNetworkInstance) + }) + ginkgo.It("Insufficient gas", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporterFlows.InsufficientGas(LocalNetworkInstance) + }) + ginkgo.It("Resubmit altered message", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporterFlows.ResubmitAlteredMessage(LocalNetworkInstance) + }) + ginkgo.It("Calculate Teleporter message IDs", + ginkgo.Label(utilsLabel), + func() { + teleporterFlows.CalculateMessageID(LocalNetworkInstance) + }) + ginkgo.It("Relayer modifies message", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporterFlows.RelayerModifiesMessage(LocalNetworkInstance) + }) + ginkgo.It("Validator churn", + ginkgo.Label(teleporterMessengerLabel), + func() { + teleporterFlows.ValidatorChurn(LocalNetworkInstance) + }) + + // Teleporter Registry tests + ginkgo.It("Teleporter registry", + ginkgo.Label(upgradabilityLabel), + func() { + registryFlows.TeleporterRegistry(LocalNetworkInstance) + }) + ginkgo.It("Check upgrade access", + ginkgo.Label(upgradabilityLabel), + func() { + registryFlows.CheckUpgradeAccess(LocalNetworkInstance) + }) + ginkgo.It("Pause and Unpause Teleporter", + ginkgo.Label(upgradabilityLabel), + func() { + registryFlows.PauseTeleporter(LocalNetworkInstance) + }) +}) diff --git a/tests/local/validator-manager/validator_manager_suite_test.go b/tests/local/validator-manager/validator_manager_suite_test.go new file mode 100644 index 000000000..ce273c69d --- /dev/null +++ b/tests/local/validator-manager/validator_manager_suite_test.go @@ -0,0 +1,139 @@ +package validator_manager_test + +import ( + "context" + "os" + "testing" + "time" + + validatorManagerFlows "github.com/ava-labs/teleporter/tests/flows/validator-manager" + "github.com/ava-labs/teleporter/tests/local" + deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" + "github.com/ethereum/go-ethereum/log" + "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +const ( + teleporterByteCodeFile = "./out/TeleporterMessenger.sol/TeleporterMessenger.json" + warpGenesisTemplateFile = "./tests/utils/warp-genesis-template.json" + + teleporterMessengerLabel = "TeleporterMessenger" + upgradabilityLabel = "upgradability" + utilsLabel = "utils" + validatorSetSigLabel = "ValidatorSetSig" + validatorManagerLabel = "ValidatorManager" +) + +var ( + LocalNetworkInstance *local.LocalNetwork +) + +func TestValidatorManager(t *testing.T) { + if os.Getenv("RUN_E2E") == "" { + t.Skip("Environment variable RUN_E2E not set; skipping E2E tests") + } + + RegisterFailHandler(ginkgo.Fail) + ginkgo.RunSpecs(t, "Teleporter e2e test") +} + +// Define the Teleporter before and after suite functions. +var _ = ginkgo.BeforeSuite(func() { + // Generate the Teleporter deployment values + teleporterDeployerTransaction, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := + deploymentUtils.ConstructKeylessTransaction( + teleporterByteCodeFile, + false, + deploymentUtils.GetDefaultContractCreationGasPrice(), + ) + Expect(err).Should(BeNil()) + + // Create the local network instance + ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) + defer cancel() + LocalNetworkInstance = local.NewLocalNetwork( + ctx, + "teleporter-test-local-network", + warpGenesisTemplateFile, + []local.SubnetSpec{ + { + Name: "A", + EVMChainID: 12345, + TeleporterContractAddress: teleporterContractAddress, + TeleporterDeployedBytecode: teleporterDeployedBytecode, + TeleporterDeployerAddress: teleporterDeployerAddress, + NodeCount: 2, + }, + { + Name: "B", + EVMChainID: 54321, + TeleporterContractAddress: teleporterContractAddress, + TeleporterDeployedBytecode: teleporterDeployedBytecode, + TeleporterDeployerAddress: teleporterDeployerAddress, + NodeCount: 2, + }, + }, + 2, + ) + log.Info("Started local network") + + // Only need to deploy Teleporter on the C-Chain since it is included in the genesis of the subnet chains. + _, fundedKey := LocalNetworkInstance.GetFundedAccountInfo() + LocalNetworkInstance.DeployTeleporterContractToCChain( + teleporterDeployerTransaction, + teleporterDeployerAddress, + teleporterContractAddress, + fundedKey, + ) + LocalNetworkInstance.SetTeleporterContractAddress(teleporterContractAddress) + + // Deploy the Teleporter registry contracts to all subnets and the C-Chain. + LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) + + ginkgo.AddReportEntry( + "network directory with node logs & configs; useful in the case of failures", + LocalNetworkInstance.TmpNet().Dir, + ginkgo.ReportEntryVisibilityFailureOrVerbose, + ) + + log.Info("Set up ginkgo before suite") +}) + +var _ = ginkgo.AfterSuite(func() { + LocalNetworkInstance.TearDownNetwork() +}) + +var _ = ginkgo.Describe("[Validator manager integration tests]", func() { + // Validator Manager tests + ginkgo.It("Native token staking manager", + ginkgo.Label(validatorManagerLabel), + func() { + validatorManagerFlows.NativeTokenStakingManager(LocalNetworkInstance) + }) + ginkgo.It("ERC20 token staking manager", + ginkgo.Label(validatorManagerLabel), + func() { + validatorManagerFlows.ERC20TokenStakingManager(LocalNetworkInstance) + }) + ginkgo.It("PoA validator manager", + ginkgo.Label(validatorManagerLabel), + func() { + validatorManagerFlows.PoAValidatorManager(LocalNetworkInstance) + }) + ginkgo.It("ERC20 delegation", + ginkgo.Label(validatorManagerLabel), + func() { + validatorManagerFlows.ERC20Delegation(LocalNetworkInstance) + }) + ginkgo.It("Native token delegation", + ginkgo.Label(validatorManagerLabel), + func() { + validatorManagerFlows.NativeDelegation(LocalNetworkInstance) + }) + ginkgo.It("PoA migration to PoS", + ginkgo.Label(validatorManagerLabel), + func() { + validatorManagerFlows.PoAMigrationToPoS(LocalNetworkInstance) + }) +}) From 72ea62d60e30b7924743f70d8c3f0169fd1a272b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 15:48:51 -0500 Subject: [PATCH 473/545] init chainid before tests --- tests/local/network.go | 14 ++++++++++++++ tests/local/teleporter/teleporter_suite_test.go | 2 ++ .../validator_manager_suite_test.go | 2 ++ utils/deployment-utils/deployment_utils.go | 2 -- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/local/network.go b/tests/local/network.go index 6f667082f..23c03fbd3 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -360,6 +360,20 @@ func (n *LocalNetwork) DeployTeleporterContractToAllChains( log.Info("Deployed Teleporter contracts to C-Chain and all subnets") } +func (n *LocalNetwork) InitializeBlockchainIDOnAllChains( + fundedKey *ecdsa.PrivateKey, +) { + log.Info("Initializing blockchainID on C-Chain and all subnets") + ctx := context.Background() + for _, subnetInfo := range n.GetAllSubnetsInfo() { + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetInfo.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := subnetInfo.TeleporterMessenger.InitializeBlockchainID(opts) + Expect(err).Should(BeNil()) + utils.WaitForTransactionSuccess(ctx, subnetInfo, tx.Hash()) + } +} + func (n *LocalNetwork) DeployTeleporterRegistryContracts( teleporterAddress common.Address, deployerKey *ecdsa.PrivateKey, diff --git a/tests/local/teleporter/teleporter_suite_test.go b/tests/local/teleporter/teleporter_suite_test.go index c93a07541..923ee6c4d 100644 --- a/tests/local/teleporter/teleporter_suite_test.go +++ b/tests/local/teleporter/teleporter_suite_test.go @@ -88,6 +88,7 @@ var _ = ginkgo.BeforeSuite(func() { fundedKey, ) LocalNetworkInstance.SetTeleporterContractAddress(teleporterContractAddress) + LocalNetworkInstance.InitializeBlockchainIDOnAllChains(fundedKey) // Deploy the Teleporter registry contracts to all subnets and the C-Chain. LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) @@ -103,6 +104,7 @@ var _ = ginkgo.BeforeSuite(func() { var _ = ginkgo.AfterSuite(func() { LocalNetworkInstance.TearDownNetwork() + LocalNetworkInstance = nil }) var _ = ginkgo.Describe("[Teleporter integration tests]", func() { diff --git a/tests/local/validator-manager/validator_manager_suite_test.go b/tests/local/validator-manager/validator_manager_suite_test.go index ce273c69d..50e360da3 100644 --- a/tests/local/validator-manager/validator_manager_suite_test.go +++ b/tests/local/validator-manager/validator_manager_suite_test.go @@ -39,6 +39,7 @@ func TestValidatorManager(t *testing.T) { } // Define the Teleporter before and after suite functions. +// TODONOW: Tear down the network in between each spec so that we start with a fresh subnet each time. var _ = ginkgo.BeforeSuite(func() { // Generate the Teleporter deployment values teleporterDeployerTransaction, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := @@ -87,6 +88,7 @@ var _ = ginkgo.BeforeSuite(func() { fundedKey, ) LocalNetworkInstance.SetTeleporterContractAddress(teleporterContractAddress) + LocalNetworkInstance.InitializeBlockchainIDOnAllChains(fundedKey) // Deploy the Teleporter registry contracts to all subnets and the C-Chain. LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) diff --git a/utils/deployment-utils/deployment_utils.go b/utils/deployment-utils/deployment_utils.go index a12dbaf12..3f0ba81ca 100644 --- a/utils/deployment-utils/deployment_utils.go +++ b/utils/deployment-utils/deployment_utils.go @@ -126,8 +126,6 @@ func ConstructKeylessTransaction( contractAddress := crypto.CreateAddress(senderAddress, 0) contractAddressString := contractAddress.Hex() // "0x" prepended by Hex() already. - log.Println("Raw Teleporter Contract Creation Transaction:") - log.Println(contractCreationTxString) log.Println("Teleporter Contract Keyless Deployer Address: ", senderAddressString) log.Println("Teleporter Messenger Universal Contract Address: ", contractAddressString) From 63bad1afb0e689236735805716d28e026bd9735d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 16:04:23 -0500 Subject: [PATCH 474/545] init chainid before tests --- tests/local/governance/governance_suite_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/local/governance/governance_suite_test.go b/tests/local/governance/governance_suite_test.go index 31da93101..ac2314aa3 100644 --- a/tests/local/governance/governance_suite_test.go +++ b/tests/local/governance/governance_suite_test.go @@ -87,6 +87,7 @@ var _ = ginkgo.BeforeSuite(func() { fundedKey, ) LocalNetworkInstance.SetTeleporterContractAddress(teleporterContractAddress) + LocalNetworkInstance.InitializeBlockchainIDOnAllChains(fundedKey) // Deploy the Teleporter registry contracts to all subnets and the C-Chain. LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) From 406caf7ffd00e1700bf64d2545213b0b3e948de5 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 16:29:58 -0500 Subject: [PATCH 475/545] simplify local network --- .../teleporter/relayer_modifies_message.go | 2 +- tests/flows/teleporter/validator_churn.go | 2 +- .../validator-manager/erc20_delegation.go | 4 +- .../validator-manager/erc20_token_staking.go | 4 +- .../validator-manager/native_delegation.go | 4 +- tests/interfaces/local_network.go | 14 -- tests/interfaces/network.go | 10 -- .../local/governance/governance_suite_test.go | 6 - tests/local/network.go | 88 +----------- tests/local/network_utils.go | 62 --------- .../local/teleporter/teleporter_suite_test.go | 6 - .../validator_manager_suite_test.go | 6 - tests/utils/chain.go | 131 ++++++++++++++++++ tests/utils/governance.go | 2 +- tests/utils/teleporter.go | 2 +- tests/utils/validator_manager.go | 14 +- 16 files changed, 149 insertions(+), 208 deletions(-) delete mode 100644 tests/local/network_utils.go diff --git a/tests/flows/teleporter/relayer_modifies_message.go b/tests/flows/teleporter/relayer_modifies_message.go index 4011ebc6f..df9a77d43 100644 --- a/tests/flows/teleporter/relayer_modifies_message.go +++ b/tests/flows/teleporter/relayer_modifies_message.go @@ -71,7 +71,7 @@ func relayAlteredMessage( sendEvent, err := utils.GetEventFromLogs(sourceReceipt.Logs, source.TeleporterMessenger.ParseSendCrossChainMessage) Expect(err).Should(BeNil()) - signedWarpMessage := network.ConstructSignedWarpMessage(ctx, sourceReceipt, source, destination) + signedWarpMessage := utils.ConstructSignedWarpMessage(ctx, sourceReceipt, source, destination) // Construct the transaction to send the Warp message to the destination chain _, fundedKey := network.GetFundedAccountInfo() diff --git a/tests/flows/teleporter/validator_churn.go b/tests/flows/teleporter/validator_churn.go index 2f84c7552..8737c8770 100644 --- a/tests/flows/teleporter/validator_churn.go +++ b/tests/flows/teleporter/validator_churn.go @@ -53,7 +53,7 @@ func ValidatorChurn(network interfaces.LocalNetwork) { sentTeleporterMessage := sendEvent.Message // Construct the signed warp message - signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetAInfo, subnetBInfo) + signedWarpMessage := utils.ConstructSignedWarpMessage(ctx, receipt, subnetAInfo, subnetBInfo) // // Modify the validator set on Subnet A diff --git a/tests/flows/validator-manager/erc20_delegation.go b/tests/flows/validator-manager/erc20_delegation.go index 5e1b25009..125b5548a 100644 --- a/tests/flows/validator-manager/erc20_delegation.go +++ b/tests/flows/validator-manager/erc20_delegation.go @@ -114,7 +114,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) // Validate the Warp message, (this will be done on the P-Chain in the future) utils.ValidateSubnetValidatorWeightMessage( @@ -175,7 +175,7 @@ func ERC20Delegation(network interfaces.LocalNetwork) { // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index 4279d8e96..6f5c7fc04 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -221,7 +221,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) // Issue a tx to update the validator's weight on the P-Chain network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) @@ -281,7 +281,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) Expect(err).Should(BeNil()) // Issue a tx to update the validator's weight on the P-Chain diff --git a/tests/flows/validator-manager/native_delegation.go b/tests/flows/validator-manager/native_delegation.go index d584064d2..280be4af6 100644 --- a/tests/flows/validator-manager/native_delegation.go +++ b/tests/flows/validator-manager/native_delegation.go @@ -114,7 +114,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) // Validate the Warp message, (this will be done on the P-Chain in the future) utils.ValidateSubnetValidatorWeightMessage( @@ -175,7 +175,7 @@ func NativeDelegation(network interfaces.LocalNetwork) { // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) diff --git a/tests/interfaces/local_network.go b/tests/interfaces/local_network.go index 80b72f095..96c41751e 100644 --- a/tests/interfaces/local_network.go +++ b/tests/interfaces/local_network.go @@ -5,26 +5,13 @@ import ( "crypto/ecdsa" "github.com/ava-labs/avalanchego/ids" - avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" pwallet "github.com/ava-labs/avalanchego/wallet/chain/p/wallet" - "github.com/ava-labs/subnet-evm/core/types" "github.com/ethereum/go-ethereum/common" ) type LocalNetwork interface { Network AddSubnetValidators(ctx context.Context, subnetID ids.ID, count uint) - ExtractWarpMessageFromLog( - ctx context.Context, - sourceReceipt *types.Receipt, - source SubnetTestInfo, - ) *avalancheWarp.UnsignedMessage - ConstructSignedWarpMessage( - ctx context.Context, - sourceReceipt *types.Receipt, - source SubnetTestInfo, - destination SubnetTestInfo, - ) *avalancheWarp.Message GetAllNodeIDs() []ids.NodeID SetChainConfigs(chainConfigs map[string]string) RestartNodes(ctx context.Context, nodeIDs []ids.NodeID) @@ -41,6 +28,5 @@ type LocalNetwork interface { fundedKey *ecdsa.PrivateKey, ) GetNetworkID() uint32 - Dir() string GetPChainWallet() pwallet.Wallet } diff --git a/tests/interfaces/network.go b/tests/interfaces/network.go index f71afdfef..7bd84b60c 100644 --- a/tests/interfaces/network.go +++ b/tests/interfaces/network.go @@ -4,8 +4,6 @@ import ( "context" "crypto/ecdsa" - "github.com/ava-labs/avalanchego/ids" - avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" "github.com/ava-labs/subnet-evm/core/types" "github.com/ethereum/go-ethereum/common" ) @@ -41,14 +39,6 @@ type Network interface { // connections with each validator. SupportsIndependentRelaying() bool - // GetSignedMessage returns the signed Warp message for the specified Warp message ID. - GetSignedMessage( - ctx context.Context, - source SubnetTestInfo, - destination SubnetTestInfo, - messageID ids.ID, - ) *avalancheWarp.Message - // For implementations where SupportsIndependentRelaying() is true, relays the specified message between the // two subnets,and returns the receipt of the transaction the message was delivered in. // For implementations where SupportsIndependentRelaying() is false, waits for the specific message to be relayed diff --git a/tests/local/governance/governance_suite_test.go b/tests/local/governance/governance_suite_test.go index ac2314aa3..add3d0e57 100644 --- a/tests/local/governance/governance_suite_test.go +++ b/tests/local/governance/governance_suite_test.go @@ -92,12 +92,6 @@ var _ = ginkgo.BeforeSuite(func() { // Deploy the Teleporter registry contracts to all subnets and the C-Chain. LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) - ginkgo.AddReportEntry( - "network directory with node logs & configs; useful in the case of failures", - LocalNetworkInstance.TmpNet().Dir, - ginkgo.ReportEntryVisibilityFailureOrVerbose, - ) - log.Info("Set up ginkgo before suite") }) diff --git a/tests/local/network.go b/tests/local/network.go index 23c03fbd3..1b38e6bad 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -20,18 +20,14 @@ import ( "github.com/ava-labs/avalanchego/utils/constants" "github.com/ava-labs/avalanchego/utils/crypto/secp256k1" "github.com/ava-labs/avalanchego/vms/platformvm" - avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" "github.com/ava-labs/avalanchego/vms/secp256k1fx" pwallet "github.com/ava-labs/avalanchego/wallet/chain/p/wallet" "github.com/ava-labs/avalanchego/wallet/subnet/primary" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/ethclient" - subnetEvmInterfaces "github.com/ava-labs/subnet-evm/interfaces" - "github.com/ava-labs/subnet-evm/precompile/contracts/warp" "github.com/ava-labs/subnet-evm/rpc" subnetEvmTestUtils "github.com/ava-labs/subnet-evm/tests/utils" - warpBackend "github.com/ava-labs/subnet-evm/warp" teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" teleporterregistry "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/registry/TeleporterRegistry" "github.com/ava-labs/teleporter/tests/interfaces" @@ -155,7 +151,7 @@ func NewLocalNetwork( // Issue transactions to activate the proposerVM fork on the chains for _, subnet := range network.Subnets { - setupProposerVM(ctx, globalFundedECDSAKey, network, subnet.SubnetID) + utils.SetupProposerVM(ctx, globalFundedECDSAKey, network, subnet.SubnetID) } localNetwork := &LocalNetwork{ @@ -189,10 +185,6 @@ func NewLocalNetwork( return localNetwork } -func (n *LocalNetwork) TmpNet() *tmpnet.Network { - return n.tmpnet -} - // Should be called after setSubnetValues for all subnets func (n *LocalNetwork) setPrimaryNetworkValues() { // Get the C-Chain node URIs. @@ -658,84 +650,6 @@ func (n *LocalNetwork) SetChainConfigs(chainConfigs map[string]string) { } } -func (n *LocalNetwork) ExtractWarpMessageFromLog( - ctx context.Context, - sourceReceipt *types.Receipt, - source interfaces.SubnetTestInfo, -) *avalancheWarp.UnsignedMessage { - log.Info("Fetching relevant warp logs from the newly produced block") - logs, err := source.RPCClient.FilterLogs(ctx, subnetEvmInterfaces.FilterQuery{ - BlockHash: &sourceReceipt.BlockHash, - Addresses: []common.Address{warp.Module.Address}, - }) - Expect(err).Should(BeNil()) - Expect(len(logs)).Should(Equal(1)) - - // Check for relevant warp log from subscription and ensure that it matches - // the log extracted from the last block. - txLog := logs[0] - log.Info("Parsing logData as unsigned warp message") - unsignedMsg, err := warp.UnpackSendWarpEventDataToMessage(txLog.Data) - Expect(err).Should(BeNil()) - return unsignedMsg -} - -func (n *LocalNetwork) ConstructSignedWarpMessage( - ctx context.Context, - sourceReceipt *types.Receipt, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, -) *avalancheWarp.Message { - unsignedMsg := n.ExtractWarpMessageFromLog(ctx, sourceReceipt, source) - - // Set local variables for the duration of the test - unsignedWarpMessageID := unsignedMsg.ID() - log.Info( - "Parsed unsignedWarpMsg", - "unsignedWarpMessageID", unsignedWarpMessageID, - "unsignedWarpMessage", unsignedMsg, - ) - - // Loop over each client on source chain to ensure they all have time to accept the block. - // Note: if we did not confirm this here, the next stage could be racy since it assumes every node - // has accepted the block. - waitForAllValidatorsToAcceptBlock(ctx, source.NodeURIs, source.BlockchainID, sourceReceipt.BlockNumber.Uint64()) - - // Get the aggregate signature for the Warp message - log.Info("Fetching aggregate signature from the source chain validators") - return n.GetSignedMessage(ctx, source, destination, unsignedWarpMessageID) -} - -func (n *LocalNetwork) GetSignedMessage( - ctx context.Context, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, - unsignedWarpMessageID ids.ID, -) *avalancheWarp.Message { - Expect(len(source.NodeURIs)).Should(BeNumerically(">", 0)) - warpClient, err := warpBackend.NewClient(source.NodeURIs[0], source.BlockchainID.String()) - Expect(err).Should(BeNil()) - - signingSubnetID := source.SubnetID - if source.SubnetID == constants.PrimaryNetworkID { - signingSubnetID = destination.SubnetID - } - - // Get the aggregate signature for the Warp message - signedWarpMessageBytes, err := warpClient.GetMessageAggregateSignature( - ctx, - unsignedWarpMessageID, - warp.WarpDefaultQuorumNumerator, - signingSubnetID.String(), - ) - Expect(err).Should(BeNil()) - - signedWarpMsg, err := avalancheWarp.ParseMessage(signedWarpMessageBytes) - Expect(err).Should(BeNil()) - - return signedWarpMsg -} - func (n *LocalNetwork) GetNetworkID() uint32 { return n.tmpnet.Genesis.NetworkID } diff --git a/tests/local/network_utils.go b/tests/local/network_utils.go deleted file mode 100644 index da166a6e0..000000000 --- a/tests/local/network_utils.go +++ /dev/null @@ -1,62 +0,0 @@ -package local - -import ( - "context" - "crypto/ecdsa" - "slices" - "time" - - "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/tests/fixture/tmpnet" - "github.com/ava-labs/subnet-evm/ethclient" - subnetEvmUtils "github.com/ava-labs/subnet-evm/tests/utils" - "github.com/ava-labs/teleporter/tests/utils" - "github.com/ethereum/go-ethereum/log" - - . "github.com/onsi/gomega" -) - -// Issues txs to activate the proposer VM fork on the specified subnet index in the manager -func setupProposerVM(ctx context.Context, fundedKey *ecdsa.PrivateKey, network *tmpnet.Network, subnetID ids.ID) { - subnetDetails := network.Subnets[slices.IndexFunc( - network.Subnets, - func(s *tmpnet.Subnet) bool { return s.SubnetID == subnetID }, - )] - - chainID := subnetDetails.Chains[0].ChainID - - nodeURI, err := network.GetURIForNodeID(subnetDetails.ValidatorIDs[0]) - Expect(err).Should(BeNil()) - uri := utils.HttpToWebsocketURI(nodeURI, chainID.String()) - - client, err := ethclient.Dial(uri) - Expect(err).Should(BeNil()) - chainIDInt, err := client.ChainID(ctx) - Expect(err).Should(BeNil()) - - err = subnetEvmUtils.IssueTxsToActivateProposerVMFork(ctx, chainIDInt, fundedKey, client) - Expect(err).Should(BeNil()) -} - -// Blocks until all validators specified in nodeURIs have reached the specified block height -func waitForAllValidatorsToAcceptBlock(ctx context.Context, nodeURIs []string, blockchainID ids.ID, height uint64) { - cctx, cancel := context.WithTimeout(ctx, 10*time.Second) - defer cancel() - for i, uri := range nodeURIs { - chainAWSURI := utils.HttpToWebsocketURI(uri, blockchainID.String()) - log.Debug("Creating ethclient for blockchain", "blockchainID", blockchainID.String(), "wsURI", chainAWSURI) - client, err := ethclient.Dial(chainAWSURI) - Expect(err).Should(BeNil()) - defer client.Close() - - // Loop until each node has advanced to >= the height of the block that emitted the warp log - for { - block, err := client.BlockByNumber(cctx, nil) - Expect(err).Should(BeNil()) - if block.NumberU64() >= height { - log.Debug("Client accepted the block containing SendWarpMessage", "client", i, "height", block.NumberU64()) - break - } - } - } -} diff --git a/tests/local/teleporter/teleporter_suite_test.go b/tests/local/teleporter/teleporter_suite_test.go index 923ee6c4d..34d646f6b 100644 --- a/tests/local/teleporter/teleporter_suite_test.go +++ b/tests/local/teleporter/teleporter_suite_test.go @@ -93,12 +93,6 @@ var _ = ginkgo.BeforeSuite(func() { // Deploy the Teleporter registry contracts to all subnets and the C-Chain. LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) - ginkgo.AddReportEntry( - "network directory with node logs & configs; useful in the case of failures", - LocalNetworkInstance.TmpNet().Dir, - ginkgo.ReportEntryVisibilityFailureOrVerbose, - ) - log.Info("Set up ginkgo before suite") }) diff --git a/tests/local/validator-manager/validator_manager_suite_test.go b/tests/local/validator-manager/validator_manager_suite_test.go index 50e360da3..b2a4539b6 100644 --- a/tests/local/validator-manager/validator_manager_suite_test.go +++ b/tests/local/validator-manager/validator_manager_suite_test.go @@ -93,12 +93,6 @@ var _ = ginkgo.BeforeSuite(func() { // Deploy the Teleporter registry contracts to all subnets and the C-Chain. LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) - ginkgo.AddReportEntry( - "network directory with node logs & configs; useful in the case of failures", - LocalNetworkInstance.TmpNet().Dir, - ginkgo.ReportEntryVisibilityFailureOrVerbose, - ) - log.Info("Set up ginkgo before suite") }) diff --git a/tests/utils/chain.go b/tests/utils/chain.go index dada1a2ec..1ba071c9b 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -9,6 +9,7 @@ import ( goLog "log" "math/big" "os" + "slices" "strconv" "strings" "time" @@ -33,6 +34,9 @@ import ( "github.com/ava-labs/subnet-evm/ethclient" subnetEvmInterfaces "github.com/ava-labs/subnet-evm/interfaces" "github.com/ava-labs/subnet-evm/precompile/contracts/nativeminter" + "github.com/ava-labs/subnet-evm/precompile/contracts/warp" + subnetEvmUtils "github.com/ava-labs/subnet-evm/tests/utils" + warpBackend "github.com/ava-labs/subnet-evm/warp" nativeMinter "github.com/ava-labs/teleporter/abi-bindings/go/INativeMinter" "github.com/ava-labs/teleporter/tests/interfaces" gasUtils "github.com/ava-labs/teleporter/utils/gas-utils" @@ -587,6 +591,10 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu return agg } +// +// Native minter utils +// + // Funded key must have admin access to set new admin. func AddNativeMinterAdmin( ctx context.Context, @@ -603,3 +611,126 @@ func AddNativeMinterAdmin( Expect(err).Should(BeNil()) WaitForTransactionSuccess(ctx, subnet, tx.Hash()) } + +// Blocks until all validators specified in nodeURIs have reached the specified block height +func WaitForAllValidatorsToAcceptBlock(ctx context.Context, nodeURIs []string, blockchainID ids.ID, height uint64) { + cctx, cancel := context.WithTimeout(ctx, 10*time.Second) + defer cancel() + for i, uri := range nodeURIs { + chainAWSURI := HttpToWebsocketURI(uri, blockchainID.String()) + log.Debug("Creating ethclient for blockchain", "blockchainID", blockchainID.String(), "wsURI", chainAWSURI) + client, err := ethclient.Dial(chainAWSURI) + Expect(err).Should(BeNil()) + defer client.Close() + + // Loop until each node has advanced to >= the height of the block that emitted the warp log + for { + block, err := client.BlockByNumber(cctx, nil) + Expect(err).Should(BeNil()) + if block.NumberU64() >= height { + log.Debug("Client accepted the block containing SendWarpMessage", "client", i, "height", block.NumberU64()) + break + } + } + } +} + +func ExtractWarpMessageFromLog( + ctx context.Context, + sourceReceipt *types.Receipt, + source interfaces.SubnetTestInfo, +) *avalancheWarp.UnsignedMessage { + log.Info("Fetching relevant warp logs from the newly produced block") + logs, err := source.RPCClient.FilterLogs(ctx, subnetEvmInterfaces.FilterQuery{ + BlockHash: &sourceReceipt.BlockHash, + Addresses: []common.Address{warp.Module.Address}, + }) + Expect(err).Should(BeNil()) + Expect(len(logs)).Should(Equal(1)) + + // Check for relevant warp log from subscription and ensure that it matches + // the log extracted from the last block. + txLog := logs[0] + log.Info("Parsing logData as unsigned warp message") + unsignedMsg, err := warp.UnpackSendWarpEventDataToMessage(txLog.Data) + Expect(err).Should(BeNil()) + return unsignedMsg +} + +func ConstructSignedWarpMessage( + ctx context.Context, + sourceReceipt *types.Receipt, + source interfaces.SubnetTestInfo, + destination interfaces.SubnetTestInfo, +) *avalancheWarp.Message { + unsignedMsg := ExtractWarpMessageFromLog(ctx, sourceReceipt, source) + + // Set local variables for the duration of the test + unsignedWarpMessageID := unsignedMsg.ID() + log.Info( + "Parsed unsignedWarpMsg", + "unsignedWarpMessageID", unsignedWarpMessageID, + "unsignedWarpMessage", unsignedMsg, + ) + + // Loop over each client on source chain to ensure they all have time to accept the block. + // Note: if we did not confirm this here, the next stage could be racy since it assumes every node + // has accepted the block. + WaitForAllValidatorsToAcceptBlock(ctx, source.NodeURIs, source.BlockchainID, sourceReceipt.BlockNumber.Uint64()) + + // Get the aggregate signature for the Warp message + log.Info("Fetching aggregate signature from the source chain validators") + return GetSignedMessage(ctx, source, destination, unsignedWarpMessageID) +} + +func GetSignedMessage( + ctx context.Context, + source interfaces.SubnetTestInfo, + destination interfaces.SubnetTestInfo, + unsignedWarpMessageID ids.ID, +) *avalancheWarp.Message { + Expect(len(source.NodeURIs)).Should(BeNumerically(">", 0)) + warpClient, err := warpBackend.NewClient(source.NodeURIs[0], source.BlockchainID.String()) + Expect(err).Should(BeNil()) + + signingSubnetID := source.SubnetID + if source.SubnetID == constants.PrimaryNetworkID { + signingSubnetID = destination.SubnetID + } + + // Get the aggregate signature for the Warp message + // TODONOW: use signature aggregator + signedWarpMessageBytes, err := warpClient.GetMessageAggregateSignature( + ctx, + unsignedWarpMessageID, + warp.WarpDefaultQuorumNumerator, + signingSubnetID.String(), + ) + Expect(err).Should(BeNil()) + + signedWarpMsg, err := avalancheWarp.ParseMessage(signedWarpMessageBytes) + Expect(err).Should(BeNil()) + + return signedWarpMsg +} + +func SetupProposerVM(ctx context.Context, fundedKey *ecdsa.PrivateKey, network *tmpnet.Network, subnetID ids.ID) { + subnetDetails := network.Subnets[slices.IndexFunc( + network.Subnets, + func(s *tmpnet.Subnet) bool { return s.SubnetID == subnetID }, + )] + + chainID := subnetDetails.Chains[0].ChainID + + nodeURI, err := network.GetURIForNodeID(subnetDetails.ValidatorIDs[0]) + Expect(err).Should(BeNil()) + uri := HttpToWebsocketURI(nodeURI, chainID.String()) + + client, err := ethclient.Dial(uri) + Expect(err).Should(BeNil()) + chainIDInt, err := client.ChainID(ctx) + Expect(err).Should(BeNil()) + + err = subnetEvmUtils.IssueTxsToActivateProposerVMFork(ctx, chainIDInt, fundedKey, client) + Expect(err).Should(BeNil()) +} diff --git a/tests/utils/governance.go b/tests/utils/governance.go index 177d3f017..96d03555d 100644 --- a/tests/utils/governance.go +++ b/tests/utils/governance.go @@ -48,7 +48,7 @@ func ExecuteValidatorSetSigCallAndVerify( unsignedMessage *avalancheWarp.UnsignedMessage, expectSuccess bool, ) *types.Receipt { - signedWarpMsg := network.GetSignedMessage(ctx, source, destination, unsignedMessage.ID()) + signedWarpMsg := GetSignedMessage(ctx, source, destination, unsignedMessage.ID()) log.Info("Got signed warp message", "messageID", signedWarpMsg.ID()) signedPredicateTx := CreateExecuteCallPredicateTransaction( diff --git a/tests/utils/teleporter.go b/tests/utils/teleporter.go index 1647bd0fa..7f9840824 100644 --- a/tests/utils/teleporter.go +++ b/tests/utils/teleporter.go @@ -250,7 +250,7 @@ func AddProtocolVersionAndWaitForAcceptance( senderKey *ecdsa.PrivateKey, unsignedMessage *avalancheWarp.UnsignedMessage, ) { - signedWarpMsg := network.GetSignedMessage(ctx, subnet, subnet, unsignedMessage.ID()) + signedWarpMsg := GetSignedMessage(ctx, subnet, subnet, unsignedMessage.ID()) log.Info("Got signed warp message", "messageID", signedWarpMsg.ID()) // Construct tx to add protocol version and send to destination chain diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 389e760da..9c13bccdc 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -752,7 +752,7 @@ func InitializeAndCompleteNativeValidatorRegistration( // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) weight, err := stakingManager.ValueToWeight( &bind.CallOpts{}, @@ -833,7 +833,7 @@ func InitializeAndCompleteERC20ValidatorRegistration( // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) _, err := network.GetPChainWallet().IssueRegisterSubnetValidatorTx( 100*units.Avax, @@ -903,7 +903,7 @@ func InitializeAndCompletePoAValidatorRegistration( // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) // Validate the Warp message, (this will be done on the P-Chain in the future) ValidateRegisterSubnetValidatorMessage( @@ -1326,7 +1326,7 @@ func InitializeAndCompleteEndNativeValidation( // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) @@ -1395,7 +1395,7 @@ func InitializeAndCompleteEndInitialERC20Validation( // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - unsignedMessage := network.ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) + unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) signedWarpMessage, err := signatureAggregator.CreateSignedMessage( unsignedMessage, nil, @@ -1473,7 +1473,7 @@ func InitializeAndCompleteEndERC20Validation( // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - unsignedMessage := network.ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) + unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) signedWarpMessage, err := signatureAggregator.CreateSignedMessage( unsignedMessage, nil, @@ -1550,7 +1550,7 @@ func InitializeAndCompleteEndPoAValidation( // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := network.ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) + signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) Expect(err).Should(BeNil()) // Validate the Warp message, (this will be done on the P-Chain in the future) From 2d5bbb35fedfcfd71f4d621b1eac38f6835cb189 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 17:27:48 -0500 Subject: [PATCH 476/545] cleanup --- tests/flows/governance/validator_set_sig.go | 2 +- .../registry/teleporter_registry.go | 2 +- tests/interfaces/local_network.go | 1 - .../local/governance/governance_suite_test.go | 44 +++---------------- tests/local/network.go | 26 +++++------ 5 files changed, 19 insertions(+), 56 deletions(-) diff --git a/tests/flows/governance/validator_set_sig.go b/tests/flows/governance/validator_set_sig.go index c715c02f3..cb32a09e8 100644 --- a/tests/flows/governance/validator_set_sig.go +++ b/tests/flows/governance/validator_set_sig.go @@ -143,7 +143,7 @@ func ValidatorSetSig(network interfaces.LocalNetwork) { network.SetChainConfigs(chainConfigs) restartCtx, cancel := context.WithTimeout(ctx, time.Second*30) defer cancel() - network.RestartNodes(restartCtx, network.GetAllNodeIDs()) + network.RestartNodes(restartCtx, nil) // ************************************************************************************************ // Test Case 1: validatorChain (subnetB) != targetChain (subnetA) diff --git a/tests/flows/teleporter/registry/teleporter_registry.go b/tests/flows/teleporter/registry/teleporter_registry.go index bca4de651..d6d6c14dc 100644 --- a/tests/flows/teleporter/registry/teleporter_registry.go +++ b/tests/flows/teleporter/registry/teleporter_registry.go @@ -79,7 +79,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork) { network.SetChainConfigs(chainConfigs) restartCtx, cancel := context.WithTimeout(ctx, 30*time.Second) defer cancel() - network.RestartNodes(restartCtx, network.GetAllNodeIDs()) + network.RestartNodes(restartCtx, nil) // Call addProtocolVersion on subnetB to register the new Teleporter version utils.AddProtocolVersionAndWaitForAcceptance( diff --git a/tests/interfaces/local_network.go b/tests/interfaces/local_network.go index 96c41751e..7b9e6aa7e 100644 --- a/tests/interfaces/local_network.go +++ b/tests/interfaces/local_network.go @@ -12,7 +12,6 @@ import ( type LocalNetwork interface { Network AddSubnetValidators(ctx context.Context, subnetID ids.ID, count uint) - GetAllNodeIDs() []ids.NodeID SetChainConfigs(chainConfigs map[string]string) RestartNodes(ctx context.Context, nodeIDs []ids.NodeID) DeployTeleporterContractToCChain( diff --git a/tests/local/governance/governance_suite_test.go b/tests/local/governance/governance_suite_test.go index add3d0e57..731b61330 100644 --- a/tests/local/governance/governance_suite_test.go +++ b/tests/local/governance/governance_suite_test.go @@ -8,7 +8,6 @@ import ( governanceFlows "github.com/ava-labs/teleporter/tests/flows/governance" "github.com/ava-labs/teleporter/tests/local" - deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" "github.com/ethereum/go-ethereum/log" "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -40,15 +39,6 @@ func TestGovernance(t *testing.T) { // Define the Teleporter before and after suite functions. var _ = ginkgo.BeforeSuite(func() { - // Generate the Teleporter deployment values - teleporterDeployerTransaction, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := - deploymentUtils.ConstructKeylessTransaction( - teleporterByteCodeFile, - false, - deploymentUtils.GetDefaultContractCreationGasPrice(), - ) - Expect(err).Should(BeNil()) - // Create the local network instance ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) defer cancel() @@ -58,41 +48,19 @@ var _ = ginkgo.BeforeSuite(func() { warpGenesisTemplateFile, []local.SubnetSpec{ { - Name: "A", - EVMChainID: 12345, - TeleporterContractAddress: teleporterContractAddress, - TeleporterDeployedBytecode: teleporterDeployedBytecode, - TeleporterDeployerAddress: teleporterDeployerAddress, - NodeCount: 2, + Name: "A", + EVMChainID: 12345, + NodeCount: 2, }, { - Name: "B", - EVMChainID: 54321, - TeleporterContractAddress: teleporterContractAddress, - TeleporterDeployedBytecode: teleporterDeployedBytecode, - TeleporterDeployerAddress: teleporterDeployerAddress, - NodeCount: 2, + Name: "B", + EVMChainID: 54321, + NodeCount: 2, }, }, 2, ) log.Info("Started local network") - - // Only need to deploy Teleporter on the C-Chain since it is included in the genesis of the subnet chains. - _, fundedKey := LocalNetworkInstance.GetFundedAccountInfo() - LocalNetworkInstance.DeployTeleporterContractToCChain( - teleporterDeployerTransaction, - teleporterDeployerAddress, - teleporterContractAddress, - fundedKey, - ) - LocalNetworkInstance.SetTeleporterContractAddress(teleporterContractAddress) - LocalNetworkInstance.InitializeBlockchainIDOnAllChains(fundedKey) - - // Deploy the Teleporter registry contracts to all subnets and the C-Chain. - LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) - - log.Info("Set up ginkgo before suite") }) var _ = ginkgo.AfterSuite(func() { diff --git a/tests/local/network.go b/tests/local/network.go index 1b38e6bad..2157a74ae 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -65,7 +65,7 @@ type SubnetSpec struct { Name string EVMChainID uint64 TeleporterContractAddress common.Address - TeleporterDeployedBytecode string + TeleporterDeployedBytecode []byte TeleporterDeployerAddress common.Address NodeCount int } @@ -475,7 +475,7 @@ func (n *LocalNetwork) RelayMessage(ctx context.Context, sendEvent, err := utils.GetEventFromLogs(sourceReceipt.Logs, source.TeleporterMessenger.ParseSendCrossChainMessage) Expect(err).Should(BeNil()) - signedWarpMessage := n.ConstructSignedWarpMessage(ctx, sourceReceipt, source, destination) + signedWarpMessage := utils.ConstructSignedWarpMessage(ctx, sourceReceipt, source, destination) // Construct the transaction to send the Warp message to the destination chain signedTx := utils.CreateReceiveCrossChainMessageTransaction( @@ -570,22 +570,18 @@ func (n *LocalNetwork) AddSubnetValidators(ctx context.Context, subnetID ids.ID, n.setAllSubnetValues() } -// GetAllNodeIDs returns a slice that copies the NodeID's of all nodes in the network -func (n *LocalNetwork) GetAllNodeIDs() []ids.NodeID { - nodeIDs := make([]ids.NodeID, len(n.tmpnet.Nodes)) - for i, node := range n.tmpnet.Nodes { - nodeIDs[i] = node.NodeID - } - return nodeIDs -} - +// Restarts the nodes with the given nodeIDs. If nodeIDs is empty, restarts all nodes. func (n *LocalNetwork) RestartNodes(ctx context.Context, nodeIDs []ids.NodeID) { log.Info("Restarting nodes", "nodeIDs", nodeIDs) var nodes []*tmpnet.Node - for _, nodeID := range nodeIDs { - for _, node := range n.tmpnet.Nodes { - if node.NodeID == nodeID { - nodes = append(nodes, node) + if len(nodeIDs) == 0 { + nodes = n.tmpnet.Nodes + } else { + for _, nodeID := range nodeIDs { + for _, node := range n.tmpnet.Nodes { + if node.NodeID == nodeID { + nodes = append(nodes, node) + } } } } From 3b62b9be710a6611b77e02d89a5e89bf4bbb7c6e Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 17:31:28 -0500 Subject: [PATCH 477/545] build fix --- tests/local/network.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/local/network.go b/tests/local/network.go index 2157a74ae..0909cd42f 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -65,7 +65,7 @@ type SubnetSpec struct { Name string EVMChainID uint64 TeleporterContractAddress common.Address - TeleporterDeployedBytecode []byte + TeleporterDeployedBytecode string TeleporterDeployerAddress common.Address NodeCount int } From c8ebfd262f1fe171933d1c441a476584f02aff71 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 18:02:24 -0500 Subject: [PATCH 478/545] add back in teleporter setup --- .../local/governance/governance_suite_test.go | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/tests/local/governance/governance_suite_test.go b/tests/local/governance/governance_suite_test.go index 731b61330..f157dc224 100644 --- a/tests/local/governance/governance_suite_test.go +++ b/tests/local/governance/governance_suite_test.go @@ -8,6 +8,7 @@ import ( governanceFlows "github.com/ava-labs/teleporter/tests/flows/governance" "github.com/ava-labs/teleporter/tests/local" + deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" "github.com/ethereum/go-ethereum/log" "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -39,6 +40,15 @@ func TestGovernance(t *testing.T) { // Define the Teleporter before and after suite functions. var _ = ginkgo.BeforeSuite(func() { + // Generate the Teleporter deployment values + _, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := + deploymentUtils.ConstructKeylessTransaction( + teleporterByteCodeFile, + false, + deploymentUtils.GetDefaultContractCreationGasPrice(), + ) + Expect(err).Should(BeNil()) + // Create the local network instance ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) defer cancel() @@ -48,14 +58,20 @@ var _ = ginkgo.BeforeSuite(func() { warpGenesisTemplateFile, []local.SubnetSpec{ { - Name: "A", - EVMChainID: 12345, - NodeCount: 2, + Name: "A", + EVMChainID: 12345, + TeleporterContractAddress: teleporterContractAddress, + TeleporterDeployedBytecode: teleporterDeployedBytecode, + TeleporterDeployerAddress: teleporterDeployerAddress, + NodeCount: 2, }, { - Name: "B", - EVMChainID: 54321, - NodeCount: 2, + Name: "B", + EVMChainID: 54321, + TeleporterContractAddress: teleporterContractAddress, + TeleporterDeployedBytecode: teleporterDeployedBytecode, + TeleporterDeployerAddress: teleporterDeployerAddress, + NodeCount: 2, }, }, 2, From 5a76c0742383c2a0e11224e6a0ee9a9a76a1e71d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Wed, 9 Oct 2024 18:26:24 -0500 Subject: [PATCH 479/545] recover subnet helper --- .../validator-manager/erc20_token_staking.go | 91 ++---------- .../validator_manager_suite_test.go | 40 ++--- tests/utils/chain.go | 1 + tests/utils/validator_manager.go | 140 +++++++++++++----- 4 files changed, 131 insertions(+), 141 deletions(-) diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index 6f5c7fc04..d960f1726 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -4,15 +4,9 @@ import ( "context" "log" "math/big" - "sort" "time" - "github.com/ava-labs/avalanchego/api/info" "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/formatting/address" - "github.com/ava-labs/avalanchego/utils/units" - "github.com/ava-labs/avalanchego/vms/platformvm/txs" - "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" @@ -58,71 +52,13 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { pChainInfo, ) - var nodes []utils.Node - - // Remove the current validators before converting the subnet - for _, uri := range subnetAInfo.NodeURIs { - infoClient := info.NewClient(uri) - nodeID, nodePoP, err := infoClient.GetNodeID(ctx) - Expect(err).Should(BeNil()) - nodes = append(nodes, utils.Node{ - NodeID: nodeID, - NodePoP: nodePoP, - }) - - _, err = network.GetPChainWallet().IssueRemoveSubnetValidatorTx( - nodeID, - subnetAInfo.SubnetID, - ) - Expect(err).Should(BeNil()) - } - - // Sort the nodeIDs so that the subnet conversion ID matches the P-Chain - sort.Slice(nodes, func(i, j int) bool { - return string(nodes[i].NodeID.Bytes()) < string(nodes[j].NodeID.Bytes()) - }) - - weights := make([]uint64, len(nodes)) - totalWeight := uint64(len(nodes)-1) * units.Schmeckle - for i := 0; i < len(nodes)-1; i++ { - weights[i] = units.Schmeckle - totalWeight += units.Schmeckle - } - // Set the last node's weight such that removing any other node will not violate the churn limit - weights[len(nodes)-1] = 4 * totalWeight - - // Construct the convert subnet info - destAddr, err := address.ParseToID(utils.DefaultPChainAddress) - Expect(err).Should(BeNil()) - vdrs := make([]*txs.ConvertSubnetValidator, len(nodes)) - for i, node := range nodes { - vdrs[i] = &txs.ConvertSubnetValidator{ - NodeID: node.NodeID.Bytes(), - Weight: weights[i], - Balance: units.Avax * 100, - Signer: *node.NodePoP, - RemainingBalanceOwner: message.PChainOwner{ - Threshold: 1, - Addresses: []ids.ShortID{destAddr}, - }, - DeactivationOwner: message.PChainOwner{ - Threshold: 1, - Addresses: []ids.ShortID{destAddr}, - }, - } - } - - log.Println("Issuing ConvertSubnetTx") - _, err = network.GetPChainWallet().IssueConvertSubnetTx( - subnetAInfo.SubnetID, - subnetAInfo.BlockchainID, - stakingManagerAddress[:], - vdrs, + nodes := utils.ConvertSubnet( + ctx, + subnetAInfo, + network, + stakingManagerAddress, + fundedKey, ) - Expect(err).Should(BeNil()) - - utils.PChainProposerVMWorkaround(network) - utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) // Initialize the validator set on the subnet log.Println("Initializing validator set") @@ -136,11 +72,10 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { network, signatureAggregator, nodes, - weights, ) // - // Delist one initial validators + // Delist one initial validator // utils.InitializeAndCompleteEndInitialERC20Validation( ctx, @@ -153,7 +88,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakingManagerAddress, initialValidationIDs[0], 0, - weights[0], + nodes[0].Weight, ) // @@ -161,7 +96,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // stakeAmount, err := stakingManager.WeightToValue( &bind.CallOpts{}, - weights[0], + nodes[0].Weight, ) Expect(err).Should(BeNil()) expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) @@ -176,7 +111,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakingManagerAddress, erc20, stakeAmount, - weights[0], expiry, nodes[0], ) @@ -189,7 +123,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { log.Println("Registering delegator") delegatorStake, err := stakingManager.WeightToValue( &bind.CallOpts{}, - weights[0], + nodes[0].Weight, ) Expect(err).Should(BeNil()) delegatorStake.Div(delegatorStake, big.NewInt(10)) @@ -198,7 +132,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { delegatorStake, ) Expect(err).Should(BeNil()) - newValidatorWeight := weights[0] + delegatorWeight + newValidatorWeight := nodes[0].Weight + delegatorWeight nonce := uint64(1) @@ -294,7 +228,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( validationID, nonce, - weights[0], + nodes[0].Weight, subnetAInfo, pChainInfo, network, @@ -336,7 +270,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { validationID, expiry, nodes[0], - weights[0], 1, ) } diff --git a/tests/local/validator-manager/validator_manager_suite_test.go b/tests/local/validator-manager/validator_manager_suite_test.go index b2a4539b6..f7b169b34 100644 --- a/tests/local/validator-manager/validator_manager_suite_test.go +++ b/tests/local/validator-manager/validator_manager_suite_test.go @@ -102,34 +102,24 @@ var _ = ginkgo.AfterSuite(func() { var _ = ginkgo.Describe("[Validator manager integration tests]", func() { // Validator Manager tests - ginkgo.It("Native token staking manager", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManagerFlows.NativeTokenStakingManager(LocalNetworkInstance) - }) + // ginkgo.It("Native token staking manager", + // ginkgo.Label(validatorManagerLabel), + // func() { + // validatorManagerFlows.NativeTokenStakingManager(LocalNetworkInstance) + // }) ginkgo.It("ERC20 token staking manager", ginkgo.Label(validatorManagerLabel), func() { validatorManagerFlows.ERC20TokenStakingManager(LocalNetworkInstance) }) - ginkgo.It("PoA validator manager", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManagerFlows.PoAValidatorManager(LocalNetworkInstance) - }) - ginkgo.It("ERC20 delegation", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManagerFlows.ERC20Delegation(LocalNetworkInstance) - }) - ginkgo.It("Native token delegation", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManagerFlows.NativeDelegation(LocalNetworkInstance) - }) - ginkgo.It("PoA migration to PoS", - ginkgo.Label(validatorManagerLabel), - func() { - validatorManagerFlows.PoAMigrationToPoS(LocalNetworkInstance) - }) + // ginkgo.It("PoA validator manager", + // ginkgo.Label(validatorManagerLabel), + // func() { + // validatorManagerFlows.PoAValidatorManager(LocalNetworkInstance) + // }) + // ginkgo.It("PoA migration to PoS", + // ginkgo.Label(validatorManagerLabel), + // func() { + // validatorManagerFlows.PoAMigrationToPoS(LocalNetworkInstance) + // }) }) diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 1ba071c9b..d6f185810 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -80,6 +80,7 @@ var WarpEnabledChainConfig = tmpnet.FlagsMap{ type Node struct { NodeID ids.NodeID NodePoP *signer.ProofOfPossession + Weight uint64 } // diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 9c13bccdc..431be0a49 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -9,8 +9,10 @@ import ( "log" "math/big" "reflect" + "sort" "time" + "github.com/ava-labs/avalanchego/api/info" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/avalanchego/proto/pb/platformvm" "github.com/ava-labs/avalanchego/utils/crypto/bls" @@ -18,8 +20,9 @@ import ( "github.com/ava-labs/avalanchego/utils/units" "github.com/ava-labs/avalanchego/vms/components/avax" "github.com/ava-labs/avalanchego/vms/platformvm/stakeable" + "github.com/ava-labs/avalanchego/vms/platformvm/txs" avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" - warpMessages "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" + warpMessage "github.com/ava-labs/avalanchego/vms/platformvm/warp/message" warpPayload "github.com/ava-labs/avalanchego/vms/platformvm/warp/payload" "github.com/ava-labs/avalanchego/vms/secp256k1fx" "github.com/ava-labs/awm-relayer/signature-aggregator/aggregator" @@ -328,25 +331,23 @@ func InitializeERC20TokenValidatorSet( network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, nodes []Node, - initialValidatorWeights []uint64, ) []ids.ID { - Expect(len(nodes)).Should(Equal(len(initialValidatorWeights))) - initialValidators := make([]warpMessages.SubnetConversionValidatorData, len(nodes)) + initialValidators := make([]warpMessage.SubnetConversionValidatorData, len(nodes)) initialValidatorsABI := make([]erc20tokenstakingmanager.InitialValidator, len(nodes)) for i, node := range nodes { - initialValidators[i] = warpMessages.SubnetConversionValidatorData{ + initialValidators[i] = warpMessage.SubnetConversionValidatorData{ NodeID: node.NodeID.Bytes(), BLSPublicKey: node.NodePoP.PublicKey, - Weight: initialValidatorWeights[i], + Weight: nodes[i].Weight, } initialValidatorsABI[i] = erc20tokenstakingmanager.InitialValidator{ NodeID: node.NodeID.Bytes(), BlsPublicKey: node.NodePoP.PublicKey[:], - Weight: initialValidatorWeights[i], + Weight: nodes[i].Weight, } } - subnetConversionData := warpMessages.SubnetConversionData{ + subnetConversionData := warpMessage.SubnetConversionData{ SubnetID: subnetInfo.SubnetID, ManagerChainID: subnetInfo.BlockchainID, ManagerAddress: validatorManagerAddress[:], @@ -358,7 +359,7 @@ func InitializeERC20TokenValidatorSet( ValidatorManagerAddress: validatorManagerAddress, InitialValidators: initialValidatorsABI, } - subnetConversionID, err := warpMessages.SubnetConversionID(subnetConversionData) + subnetConversionID, err := warpMessage.SubnetConversionID(subnetConversionData) Expect(err).Should(BeNil()) // subnetConversionDataBytes, err := PackSubnetConversionData(subnetConversionData) // Expect(err).Should(BeNil()) @@ -390,7 +391,7 @@ func InitializeERC20TokenValidatorSet( validationIDs = append(validationIDs, subnetInfo.SubnetID.Append(uint32(i))) } - Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(initialValidatorWeights[0]))) + Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(nodes[0].Weight))) emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) Expect(emittedValidationID).Should(Equal(validationIDs[0])) @@ -773,7 +774,6 @@ func InitializeAndCompleteNativeValidatorRegistration( validationID, 0, Node{}, - 0, true, subnetInfo, pChainInfo, @@ -811,7 +811,6 @@ func InitializeAndCompleteERC20ValidatorRegistration( stakingManagerAddress common.Address, erc20 *exampleerc20.ExampleERC20, stakeAmount *big.Int, - weight uint64, expiry uint64, node Node, ) ids.ID { @@ -849,7 +848,6 @@ func InitializeAndCompleteERC20ValidatorRegistration( validationID, expiry, node, - weight, true, subnetInfo, pChainInfo, @@ -919,7 +917,6 @@ func InitializeAndCompletePoAValidatorRegistration( validationID, 0, Node{}, - 0, true, subnetInfo, pChainInfo, @@ -1337,7 +1334,6 @@ func InitializeAndCompleteEndNativeValidation( validationID, 0, Node{}, - 0, false, subnetInfo, pChainInfo, @@ -1451,7 +1447,6 @@ func InitializeAndCompleteEndERC20Validation( validationID ids.ID, expiry uint64, node Node, - weight uint64, nonce uint64, ) { log.Println("Initializing validator removal") @@ -1469,7 +1464,7 @@ func InitializeAndCompleteEndERC20Validation( ) Expect(err).Should(BeNil()) Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) + Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(node.Weight)) // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) @@ -1493,7 +1488,6 @@ func InitializeAndCompleteEndERC20Validation( validationID, expiry, node, - weight, false, subnetInfo, pChainInfo, @@ -1561,7 +1555,6 @@ func InitializeAndCompleteEndPoAValidation( validationID, 0, Node{}, - 0, false, subnetInfo, pChainInfo, @@ -1611,7 +1604,7 @@ func ConstructSubnetValidatorRegistrationMessageForInitialValidator( justificationBytes, err := proto.Marshal(&justification) Expect(err).Should(BeNil()) - registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, valid) + registrationPayload, err := warpMessage.NewSubnetValidatorRegistration(validationID, valid) Expect(err).Should(BeNil()) registrationAddressedCall, err := warpPayload.NewAddressedCall(nil, registrationPayload.Bytes()) Expect(err).Should(BeNil()) @@ -1637,21 +1630,20 @@ func ConstructSubnetValidatorRegistrationMessage( validationID ids.ID, expiry uint64, node Node, - weight uint64, valid bool, subnet interfaces.SubnetTestInfo, pChainInfo interfaces.SubnetTestInfo, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { - msg, err := warpMessages.NewRegisterSubnetValidator( + msg, err := warpMessage.NewRegisterSubnetValidator( subnet.SubnetID, node.NodeID, node.NodePoP.PublicKey, expiry, - warpMessages.PChainOwner{}, - warpMessages.PChainOwner{}, - weight, + warpMessage.PChainOwner{}, + warpMessage.PChainOwner{}, + node.Weight, ) Expect(err).Should(BeNil()) justification := platformvm.SubnetValidatorRegistrationJustification{ @@ -1662,7 +1654,7 @@ func ConstructSubnetValidatorRegistrationMessage( justificationBytes, err := proto.Marshal(&justification) Expect(err).Should(BeNil()) - registrationPayload, err := warpMessages.NewSubnetValidatorRegistration(validationID, valid) + registrationPayload, err := warpMessage.NewSubnetValidatorRegistration(validationID, valid) Expect(err).Should(BeNil()) registrationAddressedCall, err := warpPayload.NewAddressedCall(nil, registrationPayload.Bytes()) Expect(err).Should(BeNil()) @@ -1693,7 +1685,7 @@ func ConstructSubnetValidatorWeightUpdateMessage( network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { - payload, err := warpMessages.NewSubnetValidatorWeight(validationID, nonce, weight) + payload, err := warpMessage.NewSubnetValidatorWeight(validationID, nonce, weight) Expect(err).Should(BeNil()) updateAddressedCall, err := warpPayload.NewAddressedCall(nil, payload.Bytes()) Expect(err).Should(BeNil()) @@ -1721,7 +1713,7 @@ func ConstructSubnetConversionMessage( network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, ) *avalancheWarp.Message { - subnetConversionPayload, err := warpMessages.NewSubnetConversion(subnetConversionID) + subnetConversionPayload, err := warpMessage.NewSubnetConversion(subnetConversionID) Expect(err).Should(BeNil()) subnetConversionAddressedCall, err := warpPayload.NewAddressedCall( nil, @@ -1761,13 +1753,13 @@ func ValidateRegisterSubnetValidatorMessage( msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) Expect(err).Should(BeNil()) // Check that the addressed call payload is a registered Warp message type - var payloadInterface warpMessages.Payload - ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) + var payloadInterface warpMessage.Payload + ver, err := warpMessage.Codec.Unmarshal(msg.Payload, &payloadInterface) Expect(err).Should(BeNil()) - payload, ok := payloadInterface.(*warpMessages.RegisterSubnetValidator) + payload, ok := payloadInterface.(*warpMessage.RegisterSubnetValidator) Expect(ok).Should(BeTrue()) - Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) + Expect(ver).Should(Equal(uint16(warpMessage.CodecVersion))) Expect(payload.NodeID).Should(Equal(nodeID)) Expect(payload.Weight).Should(Equal(weight)) Expect(payload.SubnetID).Should(Equal(subnetID)) @@ -1783,13 +1775,13 @@ func ValidateSubnetValidatorWeightMessage( msg, err := warpPayload.ParseAddressedCall(signedWarpMessage.UnsignedMessage.Payload) Expect(err).Should(BeNil()) // Check that the addressed call payload is a registered Warp message type - var payloadInterface warpMessages.Payload - ver, err := warpMessages.Codec.Unmarshal(msg.Payload, &payloadInterface) + var payloadInterface warpMessage.Payload + ver, err := warpMessage.Codec.Unmarshal(msg.Payload, &payloadInterface) Expect(err).Should(BeNil()) - payload, ok := payloadInterface.(*warpMessages.SubnetValidatorWeight) + payload, ok := payloadInterface.(*warpMessage.SubnetValidatorWeight) Expect(ok).Should(BeTrue()) - Expect(ver).Should(Equal(uint16(warpMessages.CodecVersion))) + Expect(ver).Should(Equal(uint16(warpMessage.CodecVersion))) Expect(payload.ValidationID).Should(Equal(validationID)) Expect(payload.Weight).Should(Equal(weight)) Expect(payload.Nonce).Should(Equal(nonce)) @@ -1876,7 +1868,7 @@ func PackSubnetConversionData(data interface{}) ([]byte, error) { } b := make([]byte, 94+packedInitialValidatorsLen) - binary.BigEndian.PutUint16(b[0:2], uint16(warpMessages.CodecVersion)) + binary.BigEndian.PutUint16(b[0:2], uint16(warpMessage.CodecVersion)) copy(b[2:34], subnetID[:]) copy(b[34:66], validatorManagerBlockchainID[:]) // These are evm addresses and have lengths of 20 so hardcoding here @@ -2007,3 +1999,77 @@ func AdvanceProposerVM( Expect(err).Should(BeNil()) } } + +func ConvertSubnet( + ctx context.Context, + subnetInfo interfaces.SubnetTestInfo, + network interfaces.LocalNetwork, + stakingManagerAddress common.Address, + fundedKey *ecdsa.PrivateKey, +) []Node { + // Remove the current validators before converting the subnet + var nodes []Node + for _, uri := range subnetInfo.NodeURIs { + infoClient := info.NewClient(uri) + nodeID, nodePoP, err := infoClient.GetNodeID(ctx) + Expect(err).Should(BeNil()) + nodes = append(nodes, Node{ + NodeID: nodeID, + NodePoP: nodePoP, + }) + + _, err = network.GetPChainWallet().IssueRemoveSubnetValidatorTx( + nodeID, + subnetInfo.SubnetID, + ) + Expect(err).Should(BeNil()) + } + + // Sort the nodeIDs so that the subnet conversion ID matches the P-Chain + sort.Slice(nodes, func(i, j int) bool { + return string(nodes[i].NodeID.Bytes()) < string(nodes[j].NodeID.Bytes()) + }) + + totalWeight := uint64(len(nodes)-1) * units.Schmeckle + for i := 0; i < len(nodes)-1; i++ { + nodes[i].Weight = units.Schmeckle + totalWeight += units.Schmeckle + } + // Set the last node's weight such that removing any other node will not violate the churn limit + nodes[len(nodes)-1].Weight = 4 * totalWeight + + // Construct the convert subnet info + destAddr, err := address.ParseToID(DefaultPChainAddress) + Expect(err).Should(BeNil()) + vdrs := make([]*txs.ConvertSubnetValidator, len(nodes)) + for i, node := range nodes { + vdrs[i] = &txs.ConvertSubnetValidator{ + NodeID: node.NodeID.Bytes(), + Weight: nodes[i].Weight, + Balance: units.Avax * 100, + Signer: *node.NodePoP, + RemainingBalanceOwner: warpMessage.PChainOwner{ + Threshold: 1, + Addresses: []ids.ShortID{destAddr}, + }, + DeactivationOwner: warpMessage.PChainOwner{ + Threshold: 1, + Addresses: []ids.ShortID{destAddr}, + }, + } + } + + log.Println("Issuing ConvertSubnetTx") + _, err = network.GetPChainWallet().IssueConvertSubnetTx( + subnetInfo.SubnetID, + subnetInfo.BlockchainID, + stakingManagerAddress[:], + vdrs, + ) + Expect(err).Should(BeNil()) + + PChainProposerVMWorkaround(network) + AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) + + return nodes +} From 0fa2ae8fc1d9e6d461543410a4fbceb468e4519e Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 09:09:39 -0500 Subject: [PATCH 480/545] native staking e2e --- .../validator-manager/erc20_token_staking.go | 8 - .../validator-manager/native_token_staking.go | 193 ++++++++++++++-- tests/utils/validator_manager.go | 214 +++++++++++++----- 3 files changed, 334 insertions(+), 81 deletions(-) diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index d960f1726..b720b475b 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -94,11 +94,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // // Register the validator as PoS // - stakeAmount, err := stakingManager.WeightToValue( - &bind.CallOpts{}, - nodes[0].Weight, - ) - Expect(err).Should(BeNil()) expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) validationID := utils.InitializeAndCompleteERC20ValidatorRegistration( ctx, @@ -110,7 +105,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { stakingManager, stakingManagerAddress, erc20, - stakeAmount, expiry, nodes[0], ) @@ -154,7 +148,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { delegationID = initRegistrationEvent.DelegationID // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) // Issue a tx to update the validator's weight on the P-Chain @@ -220,7 +213,6 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { // Issue a tx to update the validator's weight on the P-Chain network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) - utils.PChainProposerVMWorkaround(network) utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) diff --git a/tests/flows/validator-manager/native_token_staking.go b/tests/flows/validator-manager/native_token_staking.go index f6ec14ba3..80a7961b0 100644 --- a/tests/flows/validator-manager/native_token_staking.go +++ b/tests/flows/validator-manager/native_token_staking.go @@ -2,7 +2,9 @@ package staking import ( "context" + "log" "math/big" + "time" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/subnet-evm/accounts/abi/bind" @@ -43,37 +45,58 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { ctx := context.Background() // Deploy the staking manager contract - stakingManagerContractAddress, stakingManager := utils.DeployAndInitializeNativeTokenStakingManager( + stakingManagerAddress, stakingManager := utils.DeployAndInitializeNativeTokenStakingManager( ctx, fundedKey, subnetAInfo, pChainInfo, ) - utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, stakingManagerContractAddress) + utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, stakingManagerAddress) - _ = utils.InitializeNativeTokenValidatorSet( + nodes := utils.ConvertSubnet( + ctx, + subnetAInfo, + network, + stakingManagerAddress, + fundedKey, + ) + + // Initialize the validator set on the subnet + log.Println("Initializing validator set") + initialValidationIDs := utils.InitializeNativeTokenValidatorSet( ctx, fundedKey, subnetAInfo, pChainInfo, stakingManager, - stakingManagerContractAddress, + stakingManagerAddress, network, signatureAggregator, - utils.DefaultMinStakeAmount*10, + nodes, ) // - // Register a validator + // Delist one initial validator // - stakeAmount := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) - weight, err := stakingManager.ValueToWeight( - &bind.CallOpts{}, - stakeAmount, + utils.InitializeAndCompleteEndInitialNativeValidation( + ctx, + network, + signatureAggregator, + fundedKey, + subnetAInfo, + pChainInfo, + stakingManager, + stakingManagerAddress, + initialValidationIDs[0], + 0, + nodes[0].Weight, ) - Expect(err).Should(BeNil()) - // Iniatiate validator registration + + // + // Register the validator as PoS + // + expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) validationID := utils.InitializeAndCompleteNativeValidatorRegistration( ctx, network, @@ -82,10 +105,147 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { subnetAInfo, pChainInfo, stakingManager, - stakingManagerContractAddress, - stakeAmount, + stakingManagerAddress, + expiry, + nodes[0], ) + // + // Register a delegator + // + var delegationID ids.ID + { + log.Println("Registering delegator") + delegatorStake, err := stakingManager.WeightToValue( + &bind.CallOpts{}, + nodes[0].Weight, + ) + Expect(err).Should(BeNil()) + delegatorStake.Div(delegatorStake, big.NewInt(10)) + delegatorWeight, err := stakingManager.ValueToWeight( + &bind.CallOpts{}, + delegatorStake, + ) + Expect(err).Should(BeNil()) + newValidatorWeight := nodes[0].Weight + delegatorWeight + + nonce := uint64(1) + + receipt := utils.InitializeNativeDelegatorRegistration( + ctx, + fundedKey, + subnetAInfo, + validationID, + delegatorStake, + stakingManagerAddress, + stakingManager, + ) + initRegistrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorAdded, + ) + Expect(err).Should(BeNil()) + delegationID = initRegistrationEvent.DelegationID + + // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain + signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + + // Issue a tx to update the validator's weight on the P-Chain + network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + utils.PChainProposerVMWorkaround(network) + utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) + + // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain + registrationSignedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + validationID, + nonce, + newValidatorWeight, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CompleteNativeDelegatorRegistration( + ctx, + fundedKey, + delegationID, + subnetAInfo, + stakingManagerAddress, + registrationSignedMessage, + ) + // Check that the validator is registered in the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorRegistered, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) + } + // + // Delist the delegator + // + { + log.Println("Delisting delegator") + nonce := uint64(2) + receipt := utils.InitializeEndNativeDelegation( + ctx, + fundedKey, + subnetAInfo, + stakingManager, + delegationID, + ) + delegatorRemovalEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(delegatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(delegatorRemovalEvent.DelegationID[:]).Should(Equal(delegationID[:])) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) + Expect(err).Should(BeNil()) + + // Issue a tx to update the validator's weight on the P-Chain + network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + utils.PChainProposerVMWorkaround(network) + utils.AdvanceProposerVM(ctx, subnetAInfo, fundedKey, 5) + + // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain + signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( + validationID, + nonce, + nodes[0].Weight, + subnetAInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = utils.CompleteEndNativeDelegation( + ctx, + fundedKey, + delegationID, + subnetAInfo, + stakingManagerAddress, + signedMessage, + ) + + // Check that the delegator has been delisted from the staking contract + registrationEvent, err := utils.GetEventFromLogs( + receipt.Logs, + stakingManager.ParseDelegationEnded, + ) + Expect(err).Should(BeNil()) + Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) + } + // // Delist the validator // @@ -97,9 +257,10 @@ func NativeTokenStakingManager(network interfaces.LocalNetwork) { subnetAInfo, pChainInfo, stakingManager, - stakingManagerContractAddress, + stakingManagerAddress, validationID, - weight, + expiry, + nodes[0], 1, ) } diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 431be0a49..b2fc10efb 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -271,25 +271,37 @@ func InitializeNativeTokenValidatorSet( validatorManagerAddress common.Address, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, - initialValidatorWeight uint64, -) ids.ID { - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} - subnetConversionData := nativetokenstakingmanager.SubnetConversionData{ + nodes []Node, +) []ids.ID { + initialValidators := make([]warpMessage.SubnetConversionValidatorData, len(nodes)) + initialValidatorsABI := make([]nativetokenstakingmanager.InitialValidator, len(nodes)) + for i, node := range nodes { + initialValidators[i] = warpMessage.SubnetConversionValidatorData{ + NodeID: node.NodeID.Bytes(), + BLSPublicKey: node.NodePoP.PublicKey, + Weight: nodes[i].Weight, + } + initialValidatorsABI[i] = nativetokenstakingmanager.InitialValidator{ + NodeID: node.NodeID.Bytes(), + BlsPublicKey: node.NodePoP.PublicKey[:], + Weight: nodes[i].Weight, + } + } + + subnetConversionData := warpMessage.SubnetConversionData{ + SubnetID: subnetInfo.SubnetID, + ManagerChainID: subnetInfo.BlockchainID, + ManagerAddress: validatorManagerAddress[:], + Validators: initialValidators, + } + subnetConversionDataABI := nativetokenstakingmanager.SubnetConversionData{ SubnetID: subnetInfo.SubnetID, ValidatorManagerBlockchainID: subnetInfo.BlockchainID, ValidatorManagerAddress: validatorManagerAddress, - InitialValidators: []nativetokenstakingmanager.InitialValidator{ - { - NodeID: nodeID[:], - Weight: initialValidatorWeight, - BlsPublicKey: blsPublicKey[:], - }, - }, + InitialValidators: initialValidatorsABI, } - subnetConversionDataBytes, err := PackSubnetConversionData(subnetConversionData) + subnetConversionID, err := warpMessage.SubnetConversionID(subnetConversionData) Expect(err).Should(BeNil()) - subnetConversionID := sha256.Sum256(subnetConversionDataBytes) subnetConversionSignedMessage := ConstructSubnetConversionMessage( subnetConversionID, subnetInfo, @@ -304,21 +316,24 @@ func InitializeNativeTokenValidatorSet( subnetInfo, validatorManagerAddress, subnetConversionSignedMessage, - subnetConversionData, + subnetConversionDataABI, ) initialValidatorCreatedEvent, err := GetEventFromLogs( receipt.Logs, validatorManager.ParseInitialValidatorCreated, ) Expect(err).Should(BeNil()) - Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) - Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(initialValidatorWeight))) + var validationIDs []ids.ID + for i := range nodes { + validationIDs = append(validationIDs, subnetInfo.SubnetID.Append(uint32(i))) + } + + Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(nodes[0].Weight))) - expectedValidationID := CalculateSubnetConversionValidationId(subnetInfo.SubnetID, 0) emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) - Expect(emittedValidationID).Should(Equal(expectedValidationID)) + Expect(emittedValidationID).Should(Equal(validationIDs[0])) - return emittedValidationID + return validationIDs } func InitializeERC20TokenValidatorSet( @@ -361,9 +376,6 @@ func InitializeERC20TokenValidatorSet( } subnetConversionID, err := warpMessage.SubnetConversionID(subnetConversionData) Expect(err).Should(BeNil()) - // subnetConversionDataBytes, err := PackSubnetConversionData(subnetConversionData) - // Expect(err).Should(BeNil()) - // subnetConversionID := sha256.Sum256(subnetConversionDataBytes) subnetConversionSignedMessage := ConstructSubnetConversionMessage( subnetConversionID, subnetInfo, @@ -534,8 +546,8 @@ func InitializeNativeValidatorRegistration( senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, stakeAmount *big.Int, - nodeID ids.ID, - blsPublicKey [bls.PublicKeyLen]byte, + node Node, + expiry uint64, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, ) (*types.Receipt, ids.ID) { opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) @@ -545,9 +557,9 @@ func InitializeNativeValidatorRegistration( tx, err := stakingManager.InitializeValidatorRegistration( opts, nativetokenstakingmanager.ValidatorRegistrationInput{ - NodeID: nodeID[:], - RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), - BlsPublicKey: blsPublicKey[:], + NodeID: node.NodeID[:], + RegistrationExpiry: expiry, + BlsPublicKey: node.NodePoP.PublicKey[:], }, DefaultMinDelegateFeeBips, DefaultMinStakeDurationSeconds, @@ -736,18 +748,22 @@ func InitializeAndCompleteNativeValidatorRegistration( pChainInfo interfaces.SubnetTestInfo, stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, stakingManagerContractAddress common.Address, - stakeAmount *big.Int, + expiry uint64, + node Node, ) ids.ID { + stakeAmount, err := stakingManager.WeightToValue( + &bind.CallOpts{}, + node.Weight, + ) + Expect(err).Should(BeNil()) // Initiate validator registration - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} receipt, validationID := InitializeNativeValidatorRegistration( ctx, fundedKey, subnetInfo, stakeAmount, - nodeID, - blsPublicKey, + node, + expiry, stakingManager, ) @@ -755,25 +771,21 @@ func InitializeAndCompleteNativeValidatorRegistration( // (Sending to the P-Chain will be skipped for now) signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) - weight, err := stakingManager.ValueToWeight( - &bind.CallOpts{}, - stakeAmount, + _, err = network.GetPChainWallet().IssueRegisterSubnetValidatorTx( + 100*units.Avax, + node.NodePoP.ProofOfPossession, + signedWarpMessage.Bytes(), ) Expect(err).Should(BeNil()) - // Validate the Warp message, (this will be done on the P-Chain in the future) - ValidateRegisterSubnetValidatorMessage( - signedWarpMessage, - nodeID, - weight, - subnetInfo.SubnetID, - blsPublicKey, - ) + PChainProposerVMWorkaround(network) + AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + log.Println("Completing validator registration") registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, - 0, - Node{}, + expiry, + node, true, subnetInfo, pChainInfo, @@ -810,11 +822,14 @@ func InitializeAndCompleteERC20ValidatorRegistration( stakingManager *erc20tokenstakingmanager.ERC20TokenStakingManager, stakingManagerAddress common.Address, erc20 *exampleerc20.ExampleERC20, - stakeAmount *big.Int, expiry uint64, node Node, ) ids.ID { - + stakeAmount, err := stakingManager.WeightToValue( + &bind.CallOpts{}, + node.Weight, + ) + Expect(err).Should(BeNil()) // Initiate validator registration var receipt *types.Receipt log.Println("Initializing validator registration") @@ -834,7 +849,7 @@ func InitializeAndCompleteERC20ValidatorRegistration( // (Sending to the P-Chain will be skipped for now) signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) - _, err := network.GetPChainWallet().IssueRegisterSubnetValidatorTx( + _, err = network.GetPChainWallet().IssueRegisterSubnetValidatorTx( 100*units.Avax, node.NodePoP.ProofOfPossession, signedWarpMessage.Bytes(), @@ -1292,7 +1307,7 @@ func CompleteEndNativeDelegation( ) } -func InitializeAndCompleteEndNativeValidation( +func InitializeAndCompleteEndInitialNativeValidation( ctx context.Context, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, @@ -1302,9 +1317,10 @@ func InitializeAndCompleteEndNativeValidation( stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, stakingManagerAddress common.Address, validationID ids.ID, + index uint32, weight uint64, - nonce uint64, ) { + log.Println("Initializing initial validator removal") WaitMinStakeDuration(ctx, subnetInfo, fundedKey) receipt := ForceInitializeEndNativeValidation( ctx, @@ -1323,17 +1339,102 @@ func InitializeAndCompleteEndNativeValidation( // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) + unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) + signedWarpMessage, err := signatureAggregator.CreateSignedMessage( + unsignedMessage, + nil, + subnetInfo.SubnetID, + 67, + ) Expect(err).Should(BeNil()) - // Validate the Warp message, (this will be done on the P-Chain in the future) - ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, 0, nonce) + // Deliver the Warp message to the P-Chain + network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + PChainProposerVMWorkaround(network) + AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + log.Println("Completing initial validator removal") + registrationSignedMessage := ConstructSubnetValidatorRegistrationMessageForInitialValidator( + validationID, + index, + false, + subnetInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = CompleteEndNativeValidation( + ctx, + fundedKey, + subnetInfo, + stakingManagerAddress, + registrationSignedMessage, + ) + + // Check that the validator is has been delisted from the staking contract + validationEndedEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodEnded, + ) + Expect(err).Should(BeNil()) + Expect(validationEndedEvent.ValidationID[:]).Should(Equal(validationID[:])) +} + +func InitializeAndCompleteEndNativeValidation( + ctx context.Context, + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, + fundedKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + stakingManager *nativetokenstakingmanager.NativeTokenStakingManager, + stakingManagerAddress common.Address, + validationID ids.ID, + expiry uint64, + node Node, + nonce uint64, +) { + log.Println("Initializing validator removal") + WaitMinStakeDuration(ctx, subnetInfo, fundedKey) + receipt := ForceInitializeEndNativeValidation( + ctx, + fundedKey, + subnetInfo, + stakingManager, + validationID, + ) + validatorRemovalEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(node.Weight)) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) + signedWarpMessage, err := signatureAggregator.CreateSignedMessage( + unsignedMessage, + nil, + subnetInfo.SubnetID, + 67, + ) + Expect(err).Should(BeNil()) + + // Deliver the Warp message to the P-Chain + network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + PChainProposerVMWorkaround(network) + AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + log.Println("Completing validator removal") registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, - 0, - Node{}, + expiry, + node, false, subnetInfo, pChainInfo, @@ -1467,7 +1568,6 @@ func InitializeAndCompleteEndERC20Validation( Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(node.Weight)) // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) signedWarpMessage, err := signatureAggregator.CreateSignedMessage( unsignedMessage, From c3a06404f545f278533e094fb637eac79753be8b Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 09:10:06 -0500 Subject: [PATCH 481/545] remove delegation flows --- .../validator-manager/erc20_delegation.go | 214 ------------------ .../validator-manager/native_delegation.go | 214 ------------------ 2 files changed, 428 deletions(-) delete mode 100644 tests/flows/validator-manager/erc20_delegation.go delete mode 100644 tests/flows/validator-manager/native_delegation.go diff --git a/tests/flows/validator-manager/erc20_delegation.go b/tests/flows/validator-manager/erc20_delegation.go deleted file mode 100644 index 125b5548a..000000000 --- a/tests/flows/validator-manager/erc20_delegation.go +++ /dev/null @@ -1,214 +0,0 @@ -package staking - -import ( - "context" - "math/big" - - "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/teleporter/tests/interfaces" - "github.com/ava-labs/teleporter/tests/utils" - . "github.com/onsi/gomega" -) - -/* - * Registers a delegator with an ERC20 token staking validator on a subnet. The steps are as follows: - * - Deploy the ERCTokenStakingManager - * - Register a validator - * - Register a delegator - * - Deleist the delegator - * - * TODO: as delegation gets built out, this test will need to be updated to cover: - * - Delegator rewards - * - Implicit delegation end at validation end - */ -func ERC20Delegation(network interfaces.LocalNetwork) { - // Get the subnets info - cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := utils.GetTwoSubnets(network) - _, fundedKey := network.GetFundedAccountInfo() - pChainInfo := utils.GetPChainInfo(cChainInfo) - - signatureAggregator := utils.NewSignatureAggregator( - cChainInfo.NodeURIs[0], - []ids.ID{ - subnetAInfo.SubnetID, - }, - ) - ctx := context.Background() - - // Deploy the staking manager contract - stakingManagerAddress, stakingManager, _, erc20 := utils.DeployAndInitializeERC20TokenStakingManager( - ctx, - fundedKey, - subnetAInfo, - pChainInfo, - ) - - // _ = utils.InitializeERC20TokenValidatorSet( - // ctx, - // fundedKey, - // subnetAInfo, - // pChainInfo, - // stakingManager, - // stakingManagerAddress, - // network, - // signatureAggregator, - // utils.DefaultMinStakeAmount*10, - // ) - - // - // Register a validator - // - var validationID ids.ID // To be used in the delisting step - validatorStake := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) - validatorWeight, err := stakingManager.ValueToWeight( - &bind.CallOpts{}, - validatorStake, - ) - Expect(err).Should(BeNil()) - // validationID = utils.InitializeAndCompleteERC20ValidatorRegistration( - // ctx, - // network, - // signatureAggregator, - // fundedKey, - // subnetAInfo, - // pChainInfo, - // stakingManager, - // stakingManagerAddress, - // erc20, - // validatorStake, - // ) - - // // - // Register a delegator - // - var delegationID ids.ID - { - delegatorStake := big.NewInt(1e17) - delegatorWeight, err := stakingManager.ValueToWeight( - &bind.CallOpts{}, - delegatorStake, - ) - Expect(err).Should(BeNil()) - newValidatorWeight := validatorWeight + delegatorWeight - - nonce := uint64(1) - - receipt := utils.InitializeERC20DelegatorRegistration( - ctx, - fundedKey, - subnetAInfo, - validationID, - delegatorStake, - erc20, - stakingManagerAddress, - stakingManager, - ) - initRegistrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseDelegatorAdded, - ) - Expect(err).Should(BeNil()) - delegationID = initRegistrationEvent.DelegationID - - // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - - // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSubnetValidatorWeightMessage( - signedWarpMessage, - validationID, - newValidatorWeight, - nonce, - ) - - // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( - validationID, - nonce, - newValidatorWeight, - subnetAInfo, - pChainInfo, - network, - signatureAggregator, - ) - - // Deliver the Warp message to the subnet - receipt = utils.CompleteERC20DelegatorRegistration( - ctx, - fundedKey, - delegationID, - subnetAInfo, - stakingManagerAddress, - registrationSignedMessage, - ) - // Check that the validator is registered in the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseDelegatorRegistered, - ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) - } - // - // Delist the delegator - // - { - nonce := uint64(2) - receipt := utils.InitializeEndERC20Delegation( - ctx, - fundedKey, - subnetAInfo, - stakingManager, - delegationID, - ) - delegatorRemovalEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseDelegatorRemovalInitialized, - ) - Expect(err).Should(BeNil()) - Expect(delegatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(delegatorRemovalEvent.DelegationID[:]).Should(Equal(delegationID[:])) - - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - Expect(err).Should(BeNil()) - - // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, validatorWeight, 2) - - // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( - validationID, - nonce, - validatorWeight, - subnetAInfo, - pChainInfo, - network, - signatureAggregator, - ) - - // Deliver the Warp message to the subnet - receipt = utils.CompleteEndERC20Delegation( - ctx, - fundedKey, - delegationID, - subnetAInfo, - stakingManagerAddress, - signedMessage, - ) - - // Check that the delegator has been delisted from the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseDelegationEnded, - ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) - } -} diff --git a/tests/flows/validator-manager/native_delegation.go b/tests/flows/validator-manager/native_delegation.go deleted file mode 100644 index 280be4af6..000000000 --- a/tests/flows/validator-manager/native_delegation.go +++ /dev/null @@ -1,214 +0,0 @@ -package staking - -import ( - "context" - "math/big" - - "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/teleporter/tests/interfaces" - "github.com/ava-labs/teleporter/tests/utils" - . "github.com/onsi/gomega" -) - -/* - * Registers a delegator with a native token staking validator on a subnet. The steps are as follows: - * - Deploy the NativeTokenStakingManager - * - Register a validator - * - Register a delegator - * - Deleist the delegator - * - * TODO: as delegation gets built out, this test will need to be updated to cover: - * - Delegator rewards - * - Implicit delegation end at validation end - */ -func NativeDelegation(network interfaces.LocalNetwork) { - // Get the subnets info - cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := utils.GetTwoSubnets(network) - _, fundedKey := network.GetFundedAccountInfo() - pChainInfo := utils.GetPChainInfo(cChainInfo) - - signatureAggregator := utils.NewSignatureAggregator( - cChainInfo.NodeURIs[0], - []ids.ID{ - subnetAInfo.SubnetID, - }, - ) - ctx := context.Background() - - // Deploy the staking manager contract - stakingManagerAddress, stakingManager := utils.DeployAndInitializeNativeTokenStakingManager( - ctx, - fundedKey, - subnetAInfo, - pChainInfo, - ) - - utils.AddNativeMinterAdmin(ctx, subnetAInfo, fundedKey, stakingManagerAddress) - - _ = utils.InitializeNativeTokenValidatorSet( - ctx, - fundedKey, - subnetAInfo, - pChainInfo, - stakingManager, - stakingManagerAddress, - network, - signatureAggregator, - utils.DefaultMinStakeAmount*10, - ) - - // - // Register a validator - // - var validationID ids.ID // To be used in the delisting step - validatorStake := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) - validatorWeight, err := stakingManager.ValueToWeight( - &bind.CallOpts{}, - validatorStake, - ) - Expect(err).Should(BeNil()) - stakeAmount := new(big.Int).SetUint64(utils.DefaultMinStakeAmount) - validationID = utils.InitializeAndCompleteNativeValidatorRegistration( - ctx, - network, - signatureAggregator, - fundedKey, - subnetAInfo, - pChainInfo, - stakingManager, - stakingManagerAddress, - stakeAmount, - ) - // - // Register a delegator - // - var delegationID ids.ID - { - delegatorStake := big.NewInt(1e17) - delegatorWeight, err := stakingManager.ValueToWeight( - &bind.CallOpts{}, - delegatorStake, - ) - Expect(err).Should(BeNil()) - newValidatorWeight := validatorWeight + delegatorWeight - - nonce := uint64(1) - - receipt := utils.InitializeNativeDelegatorRegistration( - ctx, - fundedKey, - subnetAInfo, - validationID, - delegatorStake, - stakingManagerAddress, - stakingManager, - ) - initRegistrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseDelegatorAdded, - ) - Expect(err).Should(BeNil()) - delegationID = initRegistrationEvent.DelegationID - - // Gather subnet-evm Warp signatures for the SubnetValidatorWeightUpdateMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - - // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSubnetValidatorWeightMessage( - signedWarpMessage, - validationID, - newValidatorWeight, - nonce, - ) - - // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - registrationSignedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( - validationID, - nonce, - newValidatorWeight, - subnetAInfo, - pChainInfo, - network, - signatureAggregator, - ) - - // Deliver the Warp message to the subnet - receipt = utils.CompleteNativeDelegatorRegistration( - ctx, - fundedKey, - delegationID, - subnetAInfo, - stakingManagerAddress, - registrationSignedMessage, - ) - // Check that the validator is registered in the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseDelegatorRegistered, - ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) - } - // - // Delist the delegator - // - { - nonce := uint64(2) - receipt := utils.InitializeEndNativeDelegation( - ctx, - fundedKey, - subnetAInfo, - stakingManager, - delegationID, - ) - delegatorRemovalEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseDelegatorRemovalInitialized, - ) - Expect(err).Should(BeNil()) - Expect(delegatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(delegatorRemovalEvent.DelegationID[:]).Should(Equal(delegationID[:])) - - // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) - signedWarpMessage := utils.ConstructSignedWarpMessage(context.Background(), receipt, subnetAInfo, pChainInfo) - Expect(err).Should(BeNil()) - - // Validate the Warp message, (this will be done on the P-Chain in the future) - utils.ValidateSubnetValidatorWeightMessage(signedWarpMessage, validationID, validatorWeight, 2) - - // Construct a SubnetValidatorWeightUpdateMessage Warp message from the P-Chain - signedMessage := utils.ConstructSubnetValidatorWeightUpdateMessage( - validationID, - nonce, - validatorWeight, - subnetAInfo, - pChainInfo, - network, - signatureAggregator, - ) - - // Deliver the Warp message to the subnet - receipt = utils.CompleteEndNativeDelegation( - ctx, - fundedKey, - delegationID, - subnetAInfo, - stakingManagerAddress, - signedMessage, - ) - - // Check that the delegator has been delisted from the staking contract - registrationEvent, err := utils.GetEventFromLogs( - receipt.Logs, - stakingManager.ParseDelegationEnded, - ) - Expect(err).Should(BeNil()) - Expect(registrationEvent.ValidationID[:]).Should(Equal(validationID[:])) - Expect(registrationEvent.DelegationID[:]).Should(Equal(delegationID[:])) - } -} From 70b85e935d12487f511e5fa7844f8f44039d2014 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 10:55:38 -0500 Subject: [PATCH 482/545] tear down network between validator manager tests --- .../local/validator-manager/validator_manager_suite_test.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/local/validator-manager/validator_manager_suite_test.go b/tests/local/validator-manager/validator_manager_suite_test.go index f7b169b34..c6403aa43 100644 --- a/tests/local/validator-manager/validator_manager_suite_test.go +++ b/tests/local/validator-manager/validator_manager_suite_test.go @@ -40,7 +40,7 @@ func TestValidatorManager(t *testing.T) { // Define the Teleporter before and after suite functions. // TODONOW: Tear down the network in between each spec so that we start with a fresh subnet each time. -var _ = ginkgo.BeforeSuite(func() { +var _ = ginkgo.BeforeEach(func() { // Generate the Teleporter deployment values teleporterDeployerTransaction, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := deploymentUtils.ConstructKeylessTransaction( @@ -96,8 +96,9 @@ var _ = ginkgo.BeforeSuite(func() { log.Info("Set up ginkgo before suite") }) -var _ = ginkgo.AfterSuite(func() { +var _ = ginkgo.AfterEach(func() { LocalNetworkInstance.TearDownNetwork() + LocalNetworkInstance = nil }) var _ = ginkgo.Describe("[Validator manager integration tests]", func() { From b4710e511b88c476beb04408d79ba8dc43d029a5 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 10:55:55 -0500 Subject: [PATCH 483/545] create new default registerer at runtime --- tests/utils/chain.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/utils/chain.go b/tests/utils/chain.go index d6f185810..869fc70fd 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -583,7 +583,7 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu appRequestNetwork, logger, 1024, - metrics.NewSignatureAggregatorMetrics(prometheus.DefaultRegisterer), + metrics.NewSignatureAggregatorMetrics(prometheus.NewRegistry()), messageCreator, // Setting the etnaTime to a minute ago so that the post-etna code path is used in the test time.Now().Add(-1*time.Minute), From c9320a9cbcd012468ceee25210daac0fcb15def3 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 14:13:51 -0500 Subject: [PATCH 484/545] bump awm-relayer --- go.mod | 6 +++--- go.sum | 16 ++++++---------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 9f5fc6f72..2f5799829 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( ) require ( - github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6 + github.com/ava-labs/awm-relayer v1.4.1-0.20241010161724-2db445c994d6 github.com/ava-labs/subnet-evm v0.6.10 github.com/ethereum/go-ethereum v1.13.14 github.com/onsi/ginkgo/v2 v2.20.2 @@ -19,6 +19,7 @@ require ( github.com/stretchr/testify v1.9.0 go.uber.org/zap v1.27.0 golang.org/x/tools v0.25.0 + google.golang.org/protobuf v1.35.1 ) require ( @@ -144,8 +145,7 @@ require ( gonum.org/v1/gonum v0.11.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect - google.golang.org/grpc v1.67.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect + google.golang.org/grpc v1.67.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 28835e100..d1eee2ad6 100644 --- a/go.sum +++ b/go.sum @@ -56,14 +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.12.0-initial-poc.3 h1:JfVooBCdMzpeGUT9/phJNl2GHflkGehlMJokXeWKa2A= -github.com/ava-labs/avalanchego v1.12.0-initial-poc.3/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= -github.com/ava-labs/avalanchego v1.12.0-initial-poc.4 h1:0g1+aJS6f4I2m8oEF3djlfyNbL9UrQTS+6A0eXbRLtM= -github.com/ava-labs/avalanchego v1.12.0-initial-poc.4/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= github.com/ava-labs/avalanchego v1.12.0-initial-poc.5 h1:gW4xAqZNvkA4gP8M9yDyd7YUzuwfQbbCR+hgd1ztOto= github.com/ava-labs/avalanchego v1.12.0-initial-poc.5/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= -github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6 h1:v7k5wQxcvnYcMaz+zoO1OLAcU8REDD1EhfPZdl4Q+aI= -github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6/go.mod h1:sSXpQtgiduMdZw5IVTSa1v418VCjb8GDLyrcGwJZ/HE= +github.com/ava-labs/awm-relayer v1.4.1-0.20241010161724-2db445c994d6 h1:WdFWoZ8clWfTPp3cKyWYTsveMKW/0SQzWk8U1aCcdnw= +github.com/ava-labs/awm-relayer v1.4.1-0.20241010161724-2db445c994d6/go.mod h1:6eqh3V1Og40gXmZUOP6tCrlmMEcVuj9l737yYh1s8uw= 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.10 h1:uIh6bFMA4GCMVMQ3agBPxTMlYHL8FBR5FrhMR+drfKI= @@ -995,8 +991,8 @@ google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw= -google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= +google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= +google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1009,8 +1005,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= +google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 713666908e3ce2b6e733b8b6cb860ed7a70b60fb Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 14:14:03 -0500 Subject: [PATCH 485/545] poa->pos migration e2e --- tests/flows/validator-manager/poa_to_pos.go | 94 ++++++--- .../poa_validator_manager.go | 150 --------------- .../validator_manager_suite_test.go | 26 +-- tests/utils/validator_manager.go | 178 +++++++++++++----- 4 files changed, 214 insertions(+), 234 deletions(-) delete mode 100644 tests/flows/validator-manager/poa_validator_manager.go diff --git a/tests/flows/validator-manager/poa_to_pos.go b/tests/flows/validator-manager/poa_to_pos.go index af2bb8072..9cce8b401 100644 --- a/tests/flows/validator-manager/poa_to_pos.go +++ b/tests/flows/validator-manager/poa_to_pos.go @@ -2,7 +2,9 @@ package staking import ( "context" + "log" "math/big" + "time" "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/subnet-evm/accounts/abi/bind" @@ -54,7 +56,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { // Transfer native assets to the owner account ctx := context.Background() - fundAmount := big.NewInt(1e18) // 1avax + fundAmount := big.NewInt(1e18) // 10avax + fundAmount.Mul(fundAmount, big.NewInt(10)) utils.SendNativeTransfer( ctx, subnetAInfo, @@ -96,7 +99,17 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) utils.WaitForTransactionSuccess(context.Background(), subnetAInfo, tx.Hash()) - _ = utils.InitializePoAValidatorSet( + nodes := utils.ConvertSubnet( + ctx, + subnetAInfo, + network, + proxyAddress, + fundedKey, + ) + + // Initialize the validator set on the subnet + log.Println("Initializing validator set") + initialValidationIDs := utils.InitializePoAValidatorSet( ctx, fundedKey, subnetAInfo, @@ -105,11 +118,46 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { proxyAddress, network, signatureAggregator, - utils.DefaultMinStakeAmount*10, + nodes, + ) + + // + // Delist one initial validator + // + utils.InitializeAndCompleteEndInitialPoAValidation( + ctx, + network, + signatureAggregator, + ownerKey, + fundedKey, + subnetAInfo, + pChainInfo, + poaValidatorManager, + proxyAddress, + initialValidationIDs[0], + 0, + nodes[0].Weight, + ) + + // Try to call with invalid owner + opts, err = bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) + Expect(err).Should(BeNil()) + + _, err = poaValidatorManager.InitializeValidatorRegistration( + opts, + poavalidatormanager.ValidatorRegistrationInput{ + NodeID: nodes[0].NodeID[:], + RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), + BlsPublicKey: nodes[0].NodePoP.PublicKey[:], + }, + nodes[0].Weight, ) + Expect(err).ShouldNot(BeNil()) - // Register a validator - poaWeight := uint64(1) + // + // Re-register the validator as a SoV validator + // + expiry := uint64(time.Now().Add(24 * time.Hour).Unix()) poaValidationID := utils.InitializeAndCompletePoAValidatorRegistration( ctx, network, @@ -120,7 +168,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { pChainInfo, poaValidatorManager, proxyAddress, - poaWeight, + expiry, + nodes[0], ) poaValidator, err := poaValidatorManager.GetValidator(&bind.CallOpts{}, poaValidationID) Expect(err).Should(BeNil()) @@ -184,39 +233,37 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { Expect(err).Should(BeNil()) Expect(validationID[:]).Should(Equal(poaValidationID[:])) - // Register a PoS validator - stakeAmount := big.NewInt(1e18) - posWeight, err := posValidatorManager.ValueToWeight( - &bind.CallOpts{}, - stakeAmount, - ) - Expect(err).Should(BeNil()) + // + // Remove the PoA validator and re-register as a PoS validator + // - posValidationID := utils.InitializeAndCompleteNativeValidatorRegistration( + utils.InitializeAndCompleteEndNativeValidation( ctx, network, signatureAggregator, - fundedKey, + ownerKey, subnetAInfo, pChainInfo, posValidatorManager, proxyAddress, - stakeAmount, + poaValidationID, + expiry, + nodes[0], + 1, ) - // Delist the previous PoA validator - utils.InitializeAndCompleteEndNativeValidation( + expiry2 := uint64(time.Now().Add(24 * time.Hour).Unix()) + posValidationID := utils.InitializeAndCompleteNativeValidatorRegistration( ctx, network, signatureAggregator, - ownerKey, + fundedKey, subnetAInfo, pChainInfo, posValidatorManager, proxyAddress, - poaValidationID, - poaWeight, - 1, + expiry2, + nodes[0], ) // Delist the PoS validator @@ -230,7 +277,8 @@ func PoAMigrationToPoS(network interfaces.LocalNetwork) { posValidatorManager, proxyAddress, posValidationID, - posWeight, + expiry2, + nodes[0], 1, ) } diff --git a/tests/flows/validator-manager/poa_validator_manager.go b/tests/flows/validator-manager/poa_validator_manager.go deleted file mode 100644 index a7733b449..000000000 --- a/tests/flows/validator-manager/poa_validator_manager.go +++ /dev/null @@ -1,150 +0,0 @@ -package staking - -import ( - "context" - "math/big" - "time" - - "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/crypto/bls" - "github.com/ava-labs/subnet-evm/accounts/abi/bind" - poavalidatormanager "github.com/ava-labs/teleporter/abi-bindings/go/validator-manager/PoAValidatorManager" - "github.com/ava-labs/teleporter/tests/interfaces" - "github.com/ava-labs/teleporter/tests/utils" - "github.com/ethereum/go-ethereum/crypto" - . "github.com/onsi/gomega" -) - -/* - * Register a PoA validator manager on a L1. The steps are as follows: - * - Generate random address to be the owner address - * - Fund native assets to the owner address - * - Deploy the PoAValidatorManager contract - * - Attempt to initiate with non owner and check that it fails - * - Initiate validator registration - * - Deliver the Warp message to the P-Chain (not implemented) - * - Aggregate P-Chain signatures on the response Warp message - * - Deliver the Warp message to the L1 - * - Verify that the validator is registered in the validator manager contract - * - * Delists the validator from the L1. The steps are as follows: - * - Attempt to initiate with non owner and check that it fails - * - Initiate validator delisting - * - Deliver the Warp message to the P-Chain (not implemented) - * - Aggregate P-Chain signatures on the response Warp message - * - Deliver the Warp message to the L1 - * - Verify that the validator is delisted from the validator manager contract - */ -func PoAValidatorManager(network interfaces.LocalNetwork) { - cChainInfo := network.GetPrimaryNetworkInfo() - subnetAInfo, _ := utils.GetTwoSubnets(network) - _, fundedKey := network.GetFundedAccountInfo() - pChainInfo := utils.GetPChainInfo(cChainInfo) - - signatureAggregator := utils.NewSignatureAggregator( - cChainInfo.NodeURIs[0], - []ids.ID{ - subnetAInfo.SubnetID, - }, - ) - - // Generate random address to be the owner address - ownerKey, err := crypto.GenerateKey() - Expect(err).Should(BeNil()) - ownerAddress := crypto.PubkeyToAddress(ownerKey.PublicKey) - - // Transfer native assets to the owner account - ctx := context.Background() - fundAmount := big.NewInt(1e18) // 1avax - utils.SendNativeTransfer( - ctx, - subnetAInfo, - fundedKey, - ownerAddress, - fundAmount, - ) - - validatorManagerAddress, validatorManager := utils.DeployAndInitializePoAValidatorManager( - ctx, - fundedKey, - subnetAInfo, - pChainInfo, - ownerAddress, - ) - _ = utils.InitializePoAValidatorSet( - ctx, - fundedKey, - subnetAInfo, - pChainInfo, - validatorManager, - validatorManagerAddress, - network, - signatureAggregator, - 5, - ) - - var validationID ids.ID // To be used in the delisting step - weight := uint64(1) - - { - // Try to call with invalid owner - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) - Expect(err).Should(BeNil()) - - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} - _, err = validatorManager.InitializeValidatorRegistration( - opts, - poavalidatormanager.ValidatorRegistrationInput{ - NodeID: nodeID[:], - RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), - BlsPublicKey: blsPublicKey[:], - }, - weight, - ) - Expect(err).ShouldNot(BeNil()) - - // Initiate validator registration - validationID = utils.InitializeAndCompletePoAValidatorRegistration( - ctx, - network, - signatureAggregator, - ownerKey, - fundedKey, - subnetAInfo, - pChainInfo, - validatorManager, - validatorManagerAddress, - weight, - ) - } - - // - // Delist the validator - // - { - // Try with invalid validator owner - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) - Expect(err).Should(BeNil()) - _, err = validatorManager.InitializeEndValidation( - opts, - validationID, - ) - Expect(err).ShouldNot(BeNil()) - - utils.InitializeAndCompleteEndPoAValidation( - ctx, - network, - signatureAggregator, - ownerKey, - fundedKey, - subnetAInfo, - pChainInfo, - validatorManager, - validatorManagerAddress, - validationID, - weight, - 1, - ) - } -} diff --git a/tests/local/validator-manager/validator_manager_suite_test.go b/tests/local/validator-manager/validator_manager_suite_test.go index c6403aa43..25d780c21 100644 --- a/tests/local/validator-manager/validator_manager_suite_test.go +++ b/tests/local/validator-manager/validator_manager_suite_test.go @@ -39,7 +39,6 @@ func TestValidatorManager(t *testing.T) { } // Define the Teleporter before and after suite functions. -// TODONOW: Tear down the network in between each spec so that we start with a fresh subnet each time. var _ = ginkgo.BeforeEach(func() { // Generate the Teleporter deployment values teleporterDeployerTransaction, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := @@ -103,24 +102,19 @@ var _ = ginkgo.AfterEach(func() { var _ = ginkgo.Describe("[Validator manager integration tests]", func() { // Validator Manager tests - // ginkgo.It("Native token staking manager", - // ginkgo.Label(validatorManagerLabel), - // func() { - // validatorManagerFlows.NativeTokenStakingManager(LocalNetworkInstance) - // }) + ginkgo.It("Native token staking manager", + ginkgo.Label(validatorManagerLabel), + func() { + validatorManagerFlows.NativeTokenStakingManager(LocalNetworkInstance) + }) ginkgo.It("ERC20 token staking manager", ginkgo.Label(validatorManagerLabel), func() { validatorManagerFlows.ERC20TokenStakingManager(LocalNetworkInstance) }) - // ginkgo.It("PoA validator manager", - // ginkgo.Label(validatorManagerLabel), - // func() { - // validatorManagerFlows.PoAValidatorManager(LocalNetworkInstance) - // }) - // ginkgo.It("PoA migration to PoS", - // ginkgo.Label(validatorManagerLabel), - // func() { - // validatorManagerFlows.PoAMigrationToPoS(LocalNetworkInstance) - // }) + ginkgo.It("PoA migration to PoS", + ginkgo.Label(validatorManagerLabel), + func() { + validatorManagerFlows.PoAMigrationToPoS(LocalNetworkInstance) + }) }) diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index b2fc10efb..b856d8aa8 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -420,26 +420,37 @@ func InitializePoAValidatorSet( validatorManagerAddress common.Address, network interfaces.LocalNetwork, signatureAggregator *aggregator.SignatureAggregator, - initialValidatorWeight uint64, -) ids.ID { - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} - subnetConversionData := poavalidatormanager.SubnetConversionData{ + nodes []Node, +) []ids.ID { + initialValidators := make([]warpMessage.SubnetConversionValidatorData, len(nodes)) + initialValidatorsABI := make([]poavalidatormanager.InitialValidator, len(nodes)) + for i, node := range nodes { + initialValidators[i] = warpMessage.SubnetConversionValidatorData{ + NodeID: node.NodeID.Bytes(), + BLSPublicKey: node.NodePoP.PublicKey, + Weight: nodes[i].Weight, + } + initialValidatorsABI[i] = poavalidatormanager.InitialValidator{ + NodeID: node.NodeID.Bytes(), + BlsPublicKey: node.NodePoP.PublicKey[:], + Weight: nodes[i].Weight, + } + } + + subnetConversionData := warpMessage.SubnetConversionData{ + SubnetID: subnetInfo.SubnetID, + ManagerChainID: subnetInfo.BlockchainID, + ManagerAddress: validatorManagerAddress[:], + Validators: initialValidators, + } + subnetConversionDataABI := poavalidatormanager.SubnetConversionData{ SubnetID: subnetInfo.SubnetID, ValidatorManagerBlockchainID: subnetInfo.BlockchainID, ValidatorManagerAddress: validatorManagerAddress, - InitialValidators: []poavalidatormanager.InitialValidator{ - { - NodeID: nodeID[:], - Weight: initialValidatorWeight, - BlsPublicKey: blsPublicKey[:], - }, - }, + InitialValidators: initialValidatorsABI, } - - subnetConversionDataBytes, err := PackSubnetConversionData(subnetConversionData) + subnetConversionID, err := warpMessage.SubnetConversionID(subnetConversionData) Expect(err).Should(BeNil()) - subnetConversionID := sha256.Sum256(subnetConversionDataBytes) subnetConversionSignedMessage := ConstructSubnetConversionMessage( subnetConversionID, subnetInfo, @@ -454,21 +465,24 @@ func InitializePoAValidatorSet( subnetInfo, validatorManagerAddress, subnetConversionSignedMessage, - subnetConversionData, + subnetConversionDataABI, ) initialValidatorCreatedEvent, err := GetEventFromLogs( receipt.Logs, validatorManager.ParseInitialValidatorCreated, ) Expect(err).Should(BeNil()) - Expect(initialValidatorCreatedEvent.NodeID).Should(Equal(subnetConversionData.InitialValidators[0].NodeID)) - Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(initialValidatorWeight))) + var validationIDs []ids.ID + for i := range nodes { + validationIDs = append(validationIDs, subnetInfo.SubnetID.Append(uint32(i))) + } + + Expect(initialValidatorCreatedEvent.Weight).Should(Equal(new(big.Int).SetUint64(nodes[0].Weight))) - expectedValidationID := CalculateSubnetConversionValidationId(subnetInfo.SubnetID, 0) emittedValidationID := ids.ID(initialValidatorCreatedEvent.ValidationID) - Expect(emittedValidationID).Should(Equal(expectedValidationID)) + Expect(emittedValidationID).Should(Equal(validationIDs[0])) - return emittedValidationID + return validationIDs } func DeliverNativeTokenSubnetConversion( @@ -622,9 +636,8 @@ func InitializePoAValidatorRegistration( ctx context.Context, senderKey *ecdsa.PrivateKey, subnet interfaces.SubnetTestInfo, - weight uint64, - nodeID ids.ID, - blsPublicKey [bls.PublicKeyLen]byte, + node Node, + expiry uint64, validatorManager *poavalidatormanager.PoAValidatorManager, ) (*types.Receipt, ids.ID) { opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) @@ -633,11 +646,11 @@ func InitializePoAValidatorRegistration( tx, err := validatorManager.InitializeValidatorRegistration( opts, poavalidatormanager.ValidatorRegistrationInput{ - NodeID: nodeID[:], - RegistrationExpiry: uint64(time.Now().Add(24 * time.Hour).Unix()), - BlsPublicKey: blsPublicKey[:], + NodeID: node.NodeID[:], + RegistrationExpiry: expiry, + BlsPublicKey: node.NodePoP.PublicKey[:], }, - weight, + node.Weight, ) Expect(err).Should(BeNil()) receipt := WaitForTransactionSuccess(ctx, subnet, tx.Hash()) @@ -846,7 +859,6 @@ func InitializeAndCompleteERC20ValidatorRegistration( ) // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) _, err = network.GetPChainWallet().IssueRegisterSubnetValidatorTx( @@ -857,6 +869,7 @@ func InitializeAndCompleteERC20ValidatorRegistration( Expect(err).Should(BeNil()) PChainProposerVMWorkaround(network) AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain log.Println("Completing validator registration") registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( @@ -899,39 +912,37 @@ func InitializeAndCompletePoAValidatorRegistration( pChainInfo interfaces.SubnetTestInfo, validatorManager *poavalidatormanager.PoAValidatorManager, validatorManagerAddress common.Address, - weight uint64, + expiry uint64, + node Node, ) ids.ID { // Initiate validator registration - nodeID := ids.GenerateTestID() - blsPublicKey := [bls.PublicKeyLen]byte{} receipt, validationID := InitializePoAValidatorRegistration( ctx, ownerKey, subnetInfo, - weight, - nodeID, - blsPublicKey, + node, + expiry, validatorManager, ) // Gather subnet-evm Warp signatures for the RegisterSubnetValidatorMessage & relay to the P-Chain - // (Sending to the P-Chain will be skipped for now) signedWarpMessage := ConstructSignedWarpMessage(ctx, receipt, subnetInfo, pChainInfo) - // Validate the Warp message, (this will be done on the P-Chain in the future) - ValidateRegisterSubnetValidatorMessage( - signedWarpMessage, - nodeID, - weight, - subnetInfo.SubnetID, - blsPublicKey, + _, err := network.GetPChainWallet().IssueRegisterSubnetValidatorTx( + 100*units.Avax, + node.NodePoP.ProofOfPossession, + signedWarpMessage.Bytes(), ) + Expect(err).Should(BeNil()) + PChainProposerVMWorkaround(network) + AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + log.Println("Completing validator registration") registrationSignedMessage := ConstructSubnetValidatorRegistrationMessage( validationID, - 0, - Node{}, + expiry, + node, true, subnetInfo, pChainInfo, @@ -1613,6 +1624,83 @@ func InitializeAndCompleteEndERC20Validation( Expect(validationEndedEvent.ValidationID[:]).Should(Equal(validationID[:])) } +func InitializeAndCompleteEndInitialPoAValidation( + ctx context.Context, + network interfaces.LocalNetwork, + signatureAggregator *aggregator.SignatureAggregator, + ownerKey *ecdsa.PrivateKey, + fundedKey *ecdsa.PrivateKey, + subnetInfo interfaces.SubnetTestInfo, + pChainInfo interfaces.SubnetTestInfo, + stakingManager *poavalidatormanager.PoAValidatorManager, + stakingManagerAddress common.Address, + validationID ids.ID, + index uint32, + weight uint64, +) { + log.Println("Initializing initial validator removal") + WaitMinStakeDuration(ctx, subnetInfo, fundedKey) + receipt := InitializeEndPoAValidation( + ctx, + ownerKey, + subnetInfo, + stakingManager, + validationID, + ) + validatorRemovalEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidatorRemovalInitialized, + ) + Expect(err).Should(BeNil()) + Expect(validatorRemovalEvent.ValidationID[:]).Should(Equal(validationID[:])) + Expect(validatorRemovalEvent.Weight.Uint64()).Should(Equal(weight)) + + // Gather subnet-evm Warp signatures for the SetSubnetValidatorWeightMessage & relay to the P-Chain + // (Sending to the P-Chain will be skipped for now) + unsignedMessage := ExtractWarpMessageFromLog(ctx, receipt, subnetInfo) + signedWarpMessage, err := signatureAggregator.CreateSignedMessage( + unsignedMessage, + nil, + subnetInfo.SubnetID, + 67, + ) + Expect(err).Should(BeNil()) + + // Deliver the Warp message to the P-Chain + network.GetPChainWallet().IssueSetSubnetValidatorWeightTx(signedWarpMessage.Bytes()) + PChainProposerVMWorkaround(network) + AdvanceProposerVM(ctx, subnetInfo, fundedKey, 5) + + // Construct a SubnetValidatorRegistrationMessage Warp message from the P-Chain + log.Println("Completing initial validator removal") + registrationSignedMessage := ConstructSubnetValidatorRegistrationMessageForInitialValidator( + validationID, + index, + false, + subnetInfo, + pChainInfo, + network, + signatureAggregator, + ) + + // Deliver the Warp message to the subnet + receipt = CompleteEndPoAValidation( + ctx, + fundedKey, + subnetInfo, + stakingManagerAddress, + registrationSignedMessage, + ) + + // Check that the validator is has been delisted from the staking contract + validationEndedEvent, err := GetEventFromLogs( + receipt.Logs, + stakingManager.ParseValidationPeriodEnded, + ) + Expect(err).Should(BeNil()) + Expect(validationEndedEvent.ValidationID[:]).Should(Equal(validationID[:])) +} + func InitializeAndCompleteEndPoAValidation( ctx context.Context, network interfaces.LocalNetwork, From 3ecdb462ee47c77cf6c016319c4758e625ab0aa3 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 14:26:20 -0500 Subject: [PATCH 486/545] remove debug logs --- tests/utils/chain.go | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 869fc70fd..1e8bedb8c 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -545,14 +545,6 @@ func InstantiateGenesisTemplate( // func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.SignatureAggregator { - logger := logging.NewLogger( - "test-debug", - logging.NewWrappedCore( - logging.Debug, - os.Stdout, - logging.JSON.ConsoleEncoder(), - ), - ) cfg := sigAggConfig.Config{ PChainAPI: &relayerConfig.APIConfig{ BaseURL: apiUri, @@ -565,7 +557,7 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu trackedSubnets.Add(subnets...) registry := prometheus.NewRegistry() appRequestNetwork, err := peers.NewNetwork( - logging.Debug, + logging.Info, registry, trackedSubnets, &cfg, @@ -581,7 +573,7 @@ func NewSignatureAggregator(apiUri string, subnets []ids.ID) *aggregator.Signatu Expect(err).Should(BeNil()) agg, err := aggregator.NewSignatureAggregator( appRequestNetwork, - logger, + logging.NoLog{}, 1024, metrics.NewSignatureAggregatorMetrics(prometheus.NewRegistry()), messageCreator, From 2f3390ad9c6ae40b09859d34a9d24f441ea95e15 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 14:26:31 -0500 Subject: [PATCH 487/545] add todo --- tests/local/network.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/local/network.go b/tests/local/network.go index 0909cd42f..3fda50c8a 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -182,6 +182,8 @@ func NewLocalNetwork( Expect(err).Should(BeNil()) localNetwork.pChainWallet = wallet.P() + // TODONOW: Convert all subnets to permissionless validation + return localNetwork } From e033da049df964f87986aa5161f3724554407c05 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 14:26:56 -0500 Subject: [PATCH 488/545] component-wise e2e test jobs --- .github/workflows/test.yml | 74 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 198badfc5..7ee649b52 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -45,7 +45,7 @@ jobs: source scripts/constants.sh go test ./... - e2e_tests: + teleporter_e2e: name: e2e_tests runs-on: ubuntu-22.04 steps: @@ -67,7 +67,7 @@ jobs: run: | export PATH=$PATH:$HOME/.foundry/bin export PATH="$PATH:$GOPATH/bin" - ./scripts/local/e2e_test.sh + ./scripts/local/e2e_test.sh --component teleporter - name: Upload tmpnet network dir uses: actions/upload-artifact@v4 @@ -79,3 +79,73 @@ jobs: ~/.tmpnet/prometheus/prometheus.log ~/.tmpnet/promtail/promtail.log if-no-files-found: error + + governance_e2e: + name: e2e_tests + runs-on: ubuntu-22.04 + steps: + - name: Checkout repositories and submodules + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: 'go.mod' + + - name: Install Foundry + run: ./scripts/install_foundry.sh + + - name: Run E2E Tests + # Forge installs to BASE_DIR, but updates the PATH definition in $HOME/.bashrc + run: | + export PATH=$PATH:$HOME/.foundry/bin + export PATH="$PATH:$GOPATH/bin" + ./scripts/local/e2e_test.sh --component governance + + - name: Upload tmpnet network dir + uses: actions/upload-artifact@v4 + if: always() + with: + name: e2e-tmpnet-data + path: | + ~/.tmpnet/networks + ~/.tmpnet/prometheus/prometheus.log + ~/.tmpnet/promtail/promtail.log + if-no-files-found: error + + validator_manager_e2e: + name: e2e_tests + runs-on: ubuntu-22.04 + steps: + - name: Checkout repositories and submodules + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Setup Go + uses: actions/setup-go@v5 + with: + go-version-file: 'go.mod' + + - name: Install Foundry + run: ./scripts/install_foundry.sh + + - name: Run E2E Tests + # Forge installs to BASE_DIR, but updates the PATH definition in $HOME/.bashrc + run: | + export PATH=$PATH:$HOME/.foundry/bin + export PATH="$PATH:$GOPATH/bin" + ./scripts/local/e2e_test.sh --component validator-manager + + - name: Upload tmpnet network dir + uses: actions/upload-artifact@v4 + if: always() + with: + name: e2e-tmpnet-data + path: | + ~/.tmpnet/networks + ~/.tmpnet/prometheus/prometheus.log + ~/.tmpnet/promtail/promtail.log + if-no-files-found: error \ No newline at end of file From e0e108b4105bdf50fced85671ef9852aef652c34 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 14:29:48 -0500 Subject: [PATCH 489/545] update job names --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 7ee649b52..2151c40af 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -46,7 +46,7 @@ jobs: go test ./... teleporter_e2e: - name: e2e_tests + name: teleporter-e2e-tests runs-on: ubuntu-22.04 steps: - name: Checkout repositories and submodules @@ -81,7 +81,7 @@ jobs: if-no-files-found: error governance_e2e: - name: e2e_tests + name: governance-e2e-tests runs-on: ubuntu-22.04 steps: - name: Checkout repositories and submodules @@ -116,7 +116,7 @@ jobs: if-no-files-found: error validator_manager_e2e: - name: e2e_tests + name: validator-manager-e2e-tests runs-on: ubuntu-22.04 steps: - name: Checkout repositories and submodules From f57c8601b8bde8a692312ad9e538406940391b90 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 14:37:22 -0500 Subject: [PATCH 490/545] remove upload artifact --- .github/workflows/test.yml | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 2151c40af..fa69605e1 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -69,17 +69,6 @@ jobs: export PATH="$PATH:$GOPATH/bin" ./scripts/local/e2e_test.sh --component teleporter - - name: Upload tmpnet network dir - uses: actions/upload-artifact@v4 - if: always() - with: - name: e2e-tmpnet-data - path: | - ~/.tmpnet/networks - ~/.tmpnet/prometheus/prometheus.log - ~/.tmpnet/promtail/promtail.log - if-no-files-found: error - governance_e2e: name: governance-e2e-tests runs-on: ubuntu-22.04 @@ -104,17 +93,6 @@ jobs: export PATH="$PATH:$GOPATH/bin" ./scripts/local/e2e_test.sh --component governance - - name: Upload tmpnet network dir - uses: actions/upload-artifact@v4 - if: always() - with: - name: e2e-tmpnet-data - path: | - ~/.tmpnet/networks - ~/.tmpnet/prometheus/prometheus.log - ~/.tmpnet/promtail/promtail.log - if-no-files-found: error - validator_manager_e2e: name: validator-manager-e2e-tests runs-on: ubuntu-22.04 @@ -138,14 +116,3 @@ jobs: export PATH=$PATH:$HOME/.foundry/bin export PATH="$PATH:$GOPATH/bin" ./scripts/local/e2e_test.sh --component validator-manager - - - name: Upload tmpnet network dir - uses: actions/upload-artifact@v4 - if: always() - with: - name: e2e-tmpnet-data - path: | - ~/.tmpnet/networks - ~/.tmpnet/prometheus/prometheus.log - ~/.tmpnet/promtail/promtail.log - if-no-files-found: error \ No newline at end of file From 11e8a39d7a45a1d930816a00a151398506455ed5 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 15:37:08 -0500 Subject: [PATCH 491/545] lint fixes --- go.mod | 2 +- go.sum | 4 ---- scripts/local/e2e_test.sh | 3 +-- tests/utils/validator_manager.go | 1 - 4 files changed, 2 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 9f5fc6f72..f2c8f350b 100644 --- a/go.mod +++ b/go.mod @@ -19,6 +19,7 @@ require ( github.com/stretchr/testify v1.9.0 go.uber.org/zap v1.27.0 golang.org/x/tools v0.25.0 + google.golang.org/protobuf v1.34.2 ) require ( @@ -145,7 +146,6 @@ require ( google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect google.golang.org/grpc v1.67.0 // indirect - google.golang.org/protobuf v1.34.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 28835e100..09117774e 100644 --- a/go.sum +++ b/go.sum @@ -56,10 +56,6 @@ 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.12.0-initial-poc.3 h1:JfVooBCdMzpeGUT9/phJNl2GHflkGehlMJokXeWKa2A= -github.com/ava-labs/avalanchego v1.12.0-initial-poc.3/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= -github.com/ava-labs/avalanchego v1.12.0-initial-poc.4 h1:0g1+aJS6f4I2m8oEF3djlfyNbL9UrQTS+6A0eXbRLtM= -github.com/ava-labs/avalanchego v1.12.0-initial-poc.4/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= github.com/ava-labs/avalanchego v1.12.0-initial-poc.5 h1:gW4xAqZNvkA4gP8M9yDyd7YUzuwfQbbCR+hgd1ztOto= github.com/ava-labs/avalanchego v1.12.0-initial-poc.5/go.mod h1:qSHmog3wMVjo/ruIAQo0ppXAilyni07NIu5K88RyhWE= github.com/ava-labs/awm-relayer v1.4.1-0.20241003183820-366b0dc8cea6 h1:v7k5wQxcvnYcMaz+zoO1OLAcU8REDD1EhfPZdl4Q+aI= diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index 16ddc818b..f45c931d2 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -20,8 +20,7 @@ rm -rf $BASEDIR/avalanchego BASEDIR=$BASEDIR AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego "${TELEPORTER_PATH}/scripts/install_avalanchego_release.sh" BASEDIR=$BASEDIR "${TELEPORTER_PATH}/scripts/install_subnetevm_release.sh" -# cp ${BASEDIR}/subnet-evm/subnet-evm ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy -cp /Users/cameron.schultz/.avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy +cp ${BASEDIR}/subnet-evm/subnet-evm ${BASEDIR}/avalanchego/plugins/srEXiWaHuhNyGwPUi444Tu47ZEDwxTWrbQiuD7FmgSAQ6X7Dy echo "Copied ${BASEDIR}/subnet-evm/subnet-evm binary to ${BASEDIR}/avalanchego/plugins/" export AVALANCHEGO_BUILD_PATH=$BASEDIR/avalanchego diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 389e760da..949f6754e 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -815,7 +815,6 @@ func InitializeAndCompleteERC20ValidatorRegistration( expiry uint64, node Node, ) ids.ID { - // Initiate validator registration var receipt *types.Receipt log.Println("Initializing validator registration") From 380fc9a731866b62cc513f6a1d2ab58c26563b9c Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 15:41:06 -0500 Subject: [PATCH 492/545] resolve todos --- scripts/local/e2e_test.sh | 8 ++++---- tests/local/network.go | 5 ++--- tests/utils/chain.go | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index a7d0beffc..948f1a8a8 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -15,16 +15,17 @@ function printHelp() { printUsage } +valid_components="teleporter governance validator-manager" + function printUsage() { cat << EOF Arguments: - --component Component test suite to run. If omitted, runs all tests. + --component Component test suite to run. Valid components are: $valid_components Options: --help Print this help message EOF } -valid_components="teleporter governance validator-manager" component= while [ $# -gt 0 ]; do @@ -45,7 +46,6 @@ while [ $# -gt 0 ]; do done # Exit if no component is provided -# TODONOW: Run all tests if no component is provided if [ -z "$component" ]; then echo "No component provided" && exit 1 fi @@ -53,7 +53,7 @@ fi if echo "$valid_components" | grep -q "\b$component\b"; then echo "" > /dev/null else - echo "Invalid component" && exit 1 + echo "Invalid component" && printHelp && exit 1 fi source "$TELEPORTER_PATH"/scripts/constants.sh diff --git a/tests/local/network.go b/tests/local/network.go index 3fda50c8a..a8a574c63 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -70,7 +70,7 @@ type SubnetSpec struct { NodeCount int } -// TODONOW: Decouple Teleporter from the network interface +// TODO: Decouple Teleporter from the network interface func NewLocalNetwork( ctx context.Context, name string, @@ -182,8 +182,7 @@ func NewLocalNetwork( Expect(err).Should(BeNil()) localNetwork.pChainWallet = wallet.P() - // TODONOW: Convert all subnets to permissionless validation - + // TODO: Convert all subnets to permissionless validation return localNetwork } diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 1e8bedb8c..27778d27b 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -692,7 +692,7 @@ func GetSignedMessage( } // Get the aggregate signature for the Warp message - // TODONOW: use signature aggregator + // TODO: use signature aggregator signedWarpMessageBytes, err := warpClient.GetMessageAggregateSignature( ctx, unsignedWarpMessageID, From a3b77b091040fb8142a7321b054a722591a40abc Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 15:43:04 -0500 Subject: [PATCH 493/545] fix typo --- contracts/validator-manager/MessageSpec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator-manager/MessageSpec.md b/contracts/validator-manager/MessageSpec.md index 0e5de3063..f4b44d2ed 100644 --- a/contracts/validator-manager/MessageSpec.md +++ b/contracts/validator-manager/MessageSpec.md @@ -59,7 +59,7 @@ SubnetConversionData - Signed by: Subnet -Consumed by: P-Chain +- Consumed by: P-Chain Specification: From 9123f1512e3d339a58194e6d1e3ed3e767648576 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 15:47:00 -0500 Subject: [PATCH 494/545] remove unneeded input validation --- contracts/validator-manager/ValidatorMessages.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index b87678be2..8a783494f 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -143,6 +143,8 @@ library ValidatorMessages { * | 60 + len(nodeID) bytes | * +------------------------+ * + * @dev Input validation is skipped, since the returned value is intended to be compared + * directly with an authenticated Warp message. * @param subnetConversionData The struct representing data to pack into the message. * @return The packed message. */ @@ -165,9 +167,6 @@ library ValidatorMessages { // 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++) { - if (subnetConversionData.initialValidators[i].blsPublicKey.length != 48) { - revert InvalidBLSPublicKey(); - } res = abi.encodePacked( res, uint32(subnetConversionData.initialValidators[i].nodeID.length), From ec11cd1028c4d5558219d061f3f19a959ce0a0eb Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 15:47:11 -0500 Subject: [PATCH 495/545] update bindings --- .../ERC20TokenStakingManager/ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager/NativeTokenStakingManager.go | 2 +- .../PoAValidatorManager/PoAValidatorManager.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index 88d5180a7..a6abacdd7 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\":\"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\":\"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: "0x608060405234801561000f575f80fd5b50604051615dd3380380615dd383398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c868061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b610209610204366004614ea4565b6104a8565b005b610209610219366004614edf565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b366004614ea4565b6106eb565b61020961025e366004614ef6565b6106f6565b610209610271366004614f44565b610be2565b610289610284366004614edf565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb366004614ea4565b610c6c565b6102096102de366004614f65565b610c77565b6102f66102f1366004614fa5565b610d39565b604051908152602001610234565b61020961031236600461500a565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f6610342366004615032565b610fd9565b610289610355366004614edf565b610ff2565b6102f65f81565b61020961036f366004614ea4565b611006565b610226603081565b61020961038a366004614edf565b611031565b61020961039d36600461500a565b6110fc565b6102f66103b036600461504b565b6112d4565b6102096103c3366004614f65565b611300565b6102f65f80516020615bfa83398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b610209610410366004614edf565b611489565b6102f65f80516020615c1a83398151915281565b610209610437366004614edf565b611672565b610226601481565b610457610452366004614edf565b6117af565b60405161023491906150e0565b6102896202a30081565b6102f65f80516020615bda83398151915281565b610209610490366004615174565b6118fe565b6102f66104a33660046151b2565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615c5a8339815191526020526040808220815160e0810190925280545f80516020615c1a83398151915293929190829060ff16600581111561052a5761052a61506b565b600581111561053b5761053b61506b565b815260200160018201805461054f9061521d565b80601f016020809104026020016040519081016040528092919081815260200182805461057b9061521d565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156106315761063161506b565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615255565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611cbd565b6040518263ffffffff1660e01b81526004016106a59190615263565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e59190615275565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615c1a8339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af9190615275565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e9606085016040860161528c565b6001600160a01b03161461082c57610807606084016040850161528c565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a60608501856152a7565b905090505f805b828163ffffffff161015610b22575f61085d60608801886152a7565b8363ffffffff16818110610873576108736152ec565b90506020028101906108859190615300565b61088e90615424565b80516040519192505f9160088801916108a69161549d565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf9190600401615263565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f9161549d565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d9190615275565b90508086600801835f0151604051610975919061549d565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f761506b565b021790555060208201516001820190610a1090826154f2565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab59116856155c1565b8251604051919550610ac69161549d565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b906155d4565b9050610841565b50600483018190555f610b40610b3786611d0c565b60400151611e22565b90505f610b4c87611faf565b90505f600282604051610b5f919061549d565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190615275565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb826121e8565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c61506b565b14610c4c578060405163170cc93360e21b81526004016104cf9190615255565b6106e58383612223565b5f610c6664e8d4a51000836155f6565b92915050565b6106e583838361249d565b610c7f612696565b5f80516020615bfa8339815191525f80610c98846126cd565b91509150610ca5826121e8565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce061506b565b03610d05575f83815260078501602052604081208054919055610d038282612a0b565b505b610d1b81610d168460400151610fd9565b612a81565b505050505b610d3660015f80516020615c3a83398151915255565b50565b5f610d42612696565b610d4e85858585612ab7565b9050610d6660015f80516020615c3a83398151915255565b949350505050565b5f8181525f80516020615bba8339815191526020526040808220815160e0810190925280545f80516020615bfa83398151915293929190829060ff166003811115610dbb57610dbb61506b565b6003811115610dcc57610dcc61506b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e5961506b565b14610e7a578251604051633b0d540d60e21b81526104cf9190600401615615565b600481516005811115610e8f57610e8f61506b565b03610ea557610e9d85612c90565b505050505050565b5f80610ebc610eb389611d0c565b60400151612e77565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a5100061562f565b5f610ffc826117af565b6080015192915050565b61101183838361249d565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615bfa8339815191525f611049836117af565b51905060048160058111156110605761106061506b565b14611080578060405163170cc93360e21b81526004016104cf9190615255565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b031682612a0b565b611104612696565b5f8181525f80516020615bba8339815191526020526040808220815160e0810190925280545f80516020615bfa83398151915293929190829060ff1660038111156111515761115161506b565b60038111156111625761116261506b565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db61506b565b146111fc578051604051633b0d540d60e21b81526104cf9190600401615615565b600461120b82604001516117af565b51600581111561121d5761121d61506b565b146112af575f61122c85611d0c565b90505f8061123d8360400151612e77565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612c90565b50506112d060015f80516020615c3a83398151915255565b5050565b5f6112dd612696565b6112e88333846130cd565b9050610c6660015f80516020615c3a83398151915255565b5f80516020615c1a8339815191525f8061132561131c85611d0c565b604001516133a5565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600684016020526040902080546113659061521d565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af61506b565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615255565b5f82815260068401602052604081206113fa91614df3565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615bba8339815191526020526040808220815160e0810190925280545f80516020615bfa83398151915293929190829060ff1660038111156114d6576114d661506b565b60038111156114e7576114e761506b565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156115605761156061506b565b14158015611581575060038151600381111561157e5761157e61506b565b14155b156115a2578051604051633b0d540d60e21b81526104cf9190600401615615565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611cbd565b6040518263ffffffff1660e01b815260040161162b9190615263565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b9190615275565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615c1a83398151915291906116b99061521d565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff1660058111156117035761170361506b565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615255565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f9190600401615646565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d89190615275565b6117b7614e2a565b5f8281525f80516020615c5a833981519152602052604090819020815160e0810190925280545f80516020615c1a833981519152929190829060ff1660058111156118045761180461506b565b60058111156118155761181561506b565b81526020016001820180546118299061521d565b80601f01602080910402602001604051908101604052809291908181526020018280546118559061521d565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119908484613561565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615c1a833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a2090869086906156d0565b90815260200160405180910390205491505092915050565b5f8381525f80516020615bba8339815191526020526040808220815160e0810190925280545f80516020615bfa8339815191529284929091829060ff166003811115611a8657611a8661506b565b6003811115611a9757611a9761506b565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b2461506b565b14611b45578251604051633b0d540d60e21b81526104cf9190600401615615565b60208301516001600160a01b03163314611b5f57336110a1565b600281516005811115611b7457611b7461506b565b03611c51578615611b8b57611b898287612223565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611bc4918491611bbf91906156df565b61357b565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c05846136d2565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611cb69350505050565b600481516005811115611c6657611c6661506b565b03611c9a57611c74836136d2565b5f898152600686016020526040902055611c8d88612c90565b6001945050505050611cb6565b805160405163170cc93360e21b81526104cf9190600401615255565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d70573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d97919081019061570a565b9150915080611db957604051636b2f19e960e01b815260040160405180910390fd5b815115611ddf578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611e1b576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611e5757815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611ea657611e6e8160016157dc565b611e7990600861562f565b61ffff16848281518110611e8f57611e8f6152ec565b016020015160f81c901b9190911790600101611e5a565b5061ffff811615611ed05760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611f2b57611ee78160036157dc565b611ef290600861562f565b63ffffffff1685611f048360026155c1565b81518110611f1457611f146152ec565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff811615611f5157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015611fa657611f6881601f6157dc565b611f7390600861562f565b86611f7f8360066155c1565b81518110611f8f57611f8f6152ec565b016020015160f81c901b9190911790600101611f54565b50949350505050565b60605f80833560208501356014611fcb8787016040890161528c565b611fd860608901896152a7565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61205e60608501856152a7565b9050811015611e1b5761207460608501856152a7565b82818110612084576120846152ec565b90506020028101906120969190615300565b6120a49060208101906157ef565b90506030146120c65760405163180ffa0d60e01b815260040160405180910390fd5b816120d460608601866152a7565b838181106120e4576120e46152ec565b90506020028101906120f69190615300565b61210090806157ef565b905061210f60608701876152a7565b8481811061211f5761211f6152ec565b90506020028101906121319190615300565b61213b90806157ef565b61214860608901896152a7565b86818110612158576121586152ec565b905060200281019061216a9190615300565b6121789060208101906157ef565b61218560608b018b6152a7565b88818110612195576121956152ec565b90506020028101906121a79190615300565b6121b8906060810190604001615032565b6040516020016121ce9796959493929190615831565b60408051601f198184030181529190529150600101612051565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561226e573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052612295919081019061570a565b91509150806122b757604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122fa573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061231e9190615275565b825114612344578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615612380576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f8061238f846040015161387e565b915091508187146123b65760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615bfa833981519152906001600160401b039081169083161115612473575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612492565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615bfa833981519152816124b686613a6f565b90506124c1866121e8565b6124d057600192505050611cb6565b5f8681526004830160205260409020546001600160a01b031633146124f557336110a1565b5f86815260048301602052604090205460a082015161252491600160b01b90046001600160401b03169061589a565b6001600160401b03168160c001516001600160401b0316101561256b5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125835761257c8786612223565b90506125a1565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906125c690610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561263c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126609190615275565b905080846007015f8a81526020019081526020015f205f82825461268491906155c1565b90915550501515979650505050505050565b5f80516020615c3a8339815191528054600119016126c757604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6126d6614e2a565b5f80516020615c1a8339815191525f806126f261131c87611d0c565b91509150801561271957604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561274a5761274a61506b565b600581111561275b5761275b61506b565b815260200160018201805461276f9061521d565b80601f016020809104026020016040519081016040528092919081815260200182805461279b9061521d565b80156127e65780601f106127bd576101008083540402835291602001916127e6565b820191905f5260205f20905b8154815290600101906020018083116127c957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156128515761285161506b565b14158015612872575060018151600581111561286f5761286f61506b565b14155b1561289357805160405163170cc93360e21b81526104cf9190600401615255565b6003815160058111156128a8576128a861506b565b036128b657600481526128bb565b600581525b8360080181602001516040516128d1919061549d565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156129155761291561506b565b02179055506020820151600182019061292e90826154f2565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129d4576129d461506b565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615bda83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a66575f80fd5b505af1158015612a78573d5f803e3d5ffd5b50505050505050565b5f80516020615bda833981519152546112d0906001600160a01b03168383613d53565b60015f80516020615c3a83398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615bfa83398151915290600160401b900461ffff9081169086161080612b0b575061271061ffff8616115b15612b2f57604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b6b576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612b7d5750806001015483115b15612b9e5760405163222d164360e21b8152600481018490526024016104cf565b5f612ba884613db2565b90505f612bb482610c56565b90505f612bc18983613dd5565b90506040518060800160405280612bd53390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615bba8339815191526020526040808220815160e0810190925280545f80516020615bfa83398151915293929190829060ff166003811115612cdd57612cdd61506b565b6003811115612cee57612cee61506b565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e1c575f84815260048701602052604090205461271090612dce90600160a01b900461ffff168561562f565b612dd891906155f6565b915081866007015f8681526020019081526020015f205f828254612dfc91906155c1565b90915550612e0c905082846157dc565b9050612e1c856020015182612a0b565b612e318560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612eae57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612efd57612ec58160016157dc565b612ed090600861562f565b61ffff16868281518110612ee657612ee66152ec565b016020015160f81c901b9190911790600101612eb1565b5061ffff811615612f275760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612f8257612f3e8160036157dc565b612f4990600861562f565b63ffffffff1687612f5b8360026155c1565b81518110612f6b57612f6b6152ec565b016020015160f81c901b9190911790600101612f2a565b5063ffffffff8116600314612faa57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fff57612fc181601f6157dc565b612fcc90600861562f565b88612fd88360066155c1565b81518110612fe857612fe86152ec565b016020015160f81c901b9190911790600101612fad565b505f805b600881101561305e576130178160076157dc565b61302290600861562f565b6001600160401b0316896130378360266155c1565b81518110613047576130476152ec565b016020015160f81c901b9190911790600101613003565b505f805b60088110156130bd576130768160076157dc565b61308190600861562f565b6001600160401b03168a61309683602e6155c1565b815181106130a6576130a66152ec565b016020015160f81c901b9190911790600101613062565b5091989097509095509350505050565b5f5f80516020615bfa833981519152816130e961028485613db2565b90505f6130f5876117af565b9050613100876121e8565b613120576040516330efa98b60e01b8152600481018890526024016104cf565b6002815160058111156131355761313561506b565b1461315657805160405163170cc93360e21b81526104cf9190600401615255565b5f828260800151613167919061589a565b905083600201600a9054906101000a90046001600160401b0316826040015161319091906158ba565b6001600160401b0316816001600160401b031611156131cd57604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f806131d98a8461357b565b915091505f8a8360405160200161320792919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561329a5761329a61506b565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8082516027146133db57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b600281101561342a576133f28160016157dc565b6133fd90600861562f565b61ffff16858281518110613413576134136152ec565b016020015160f81c901b91909117906001016133de565b5061ffff8116156134545760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134af5761346b8160036157dc565b61347690600861562f565b63ffffffff16866134888360026155c1565b81518110613498576134986152ec565b016020015160f81c901b9190911790600101613457565b5063ffffffff81166002146134d757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561352c576134ee81601f6157dc565b6134f990600861562f565b876135058360066155c1565b81518110613515576135156152ec565b016020015160f81c901b91909117906001016134da565b505f86602681518110613541576135416152ec565b016020015191976001600160f81b03199092161515965090945050505050565b613569614328565b61357282614373565b6112d0816143e1565b5f8281525f80516020615c5a833981519152602052604081206002015481905f80516020615c1a83398151915290600160801b90046001600160401b03166135c38582614449565b5f6135cd87614623565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61361d8a858b611cbd565b6040518263ffffffff1660e01b81526004016136399190615263565b6020604051808303815f875af1158015613655573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136799190615275565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615bfa83398151915290505f6136f284604001516117af565b90505f60038251600581111561370a5761370a61506b565b148061372857506004825160058111156137265761372661506b565b145b15613738575060c0810151613775565b60028251600581111561374d5761374d61506b565b03613759575042613775565b815160405163170cc93360e21b81526104cf9190600401615255565b84608001516001600160401b0316816001600160401b03161161379c57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906137c190610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613851573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138759190615275565b95945050505050565b5f808251602e146138b457825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b6002811015613903576138cb8160016157dc565b6138d690600861562f565b61ffff168582815181106138ec576138ec6152ec565b016020015160f81c901b91909117906001016138b7565b5061ffff81161561392d5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015613988576139448160036157dc565b61394f90600861562f565b63ffffffff16866139618360026155c1565b81518110613971576139716152ec565b016020015160f81c901b9190911790600101613930565b5063ffffffff8116156139ae57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a03576139c581601f6157dc565b6139d090600861562f565b876139dc8360066155c1565b815181106139ec576139ec6152ec565b016020015160f81c901b91909117906001016139b1565b505f805b6008811015613a6257613a1b8160076157dc565b613a2690600861562f565b6001600160401b031688613a3b8360266155c1565b81518110613a4b57613a4b6152ec565b016020015160f81c901b9190911790600101613a07565b5090969095509350505050565b613a77614e2a565b5f8281525f80516020615c5a8339815191526020526040808220815160e0810190925280545f80516020615c1a83398151915293929190829060ff166005811115613ac457613ac461506b565b6005811115613ad557613ad561506b565b8152602001600182018054613ae99061521d565b80601f0160208091040260200160405190810160405280929190818152602001828054613b159061521d565b8015613b605780601f10613b3757610100808354040283529160200191613b60565b820191905f5260205f20905b815481529060010190602001808311613b4357829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613bce57613bce61506b565b14613c01575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615255565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613c4557613c4561506b565b021790555060208201516001820190613c5e90826154f2565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613cfc858261357b565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614698565b5f610c66825f80516020615bda833981519152546001600160a01b0316906146f9565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e1957604051637fab81e560e01b815260040160405180910390fd5b5f80516020615c1a83398151915242613e386060860160408701615032565b6001600160401b0316111580613e725750613e566202a300426155c1565b613e666060860160408701615032565b6001600160401b031610155b15613eac57613e876060850160408601615032565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b6030613ebb60208601866157ef565b905014613eed57613ecf60208501856157ef565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613ef784806157ef565b90505f03613f2457613f0984806157ef565b604051633e08a12560e11b81526004016104cf9291906158e5565b5f60088201613f3386806157ef565b604051613f419291906156d0565b90815260200160405180910390205414613f7a57613f5f84806157ef565b60405163a41f772f60e01b81526004016104cf9291906158e5565b613f84835f614449565b6040805160e08101909152815481525f9081906140909060208101613fa989806157ef565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190613ff1908a018a6157ef565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161403a60608a0160408b01615032565b6001600160401b0316815260200161405560608a018a615913565b61405e90615927565b815260200161407060808a018a615913565b61407990615927565b8152602001876001600160401b0316815250614852565b5f828152600686016020526040902091935091506140ae82826154f2565b5081600884016140be88806157ef565b6040516140cc9291906156d0565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614108908590600401615263565b6020604051808303815f875af1158015614124573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141489190615275565b6040805160e08101909152909150806001815260200161416889806157ef565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156141f7576141f761506b565b02179055506020820151600182019061421090826154f2565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806142ae88806157ef565b6040516142bc9291906156d0565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906142fa9190615032565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661437157604051631afcd79f60e31b815260040160405180910390fd5b565b61437b614328565b61438481614a3f565b61438c614a58565b610d36606082013560808301356143a960c0850160a08601615032565b6143b960e0860160c087016159ee565b6143ca610100870160e08801615a07565b6143dc6101208801610100890161528c565b614a68565b6143e9614328565b5f80516020615bda8339815191526001600160a01b03821661442957604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615c1a8339815191525f6001600160401b03808416908516111561447d5761447683856156df565b905061448a565b61448784846156df565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806144ec5750600184015481516144e8916001600160401b0316906155c1565b8210155b15614512576001600160401b038316606082015281815260408101516020820152614531565b8281606001818151614524919061589a565b6001600160401b03169052505b60608101516145419060646158ba565b602082015160018601546001600160401b03929092169161456c9190600160401b900460ff1661562f565b101561459c57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b0316816040018181516145b791906155c1565b9052506040810180516001600160401b03871691906145d79083906157dc565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615c5a8339815191526020526040812060020180545f80516020615c1a833981519152919060089061466d90600160401b90046001600160401b0316615a27565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6146ac6001600160a01b03841683614b97565b905080515f141580156146d05750808060200190518101906146ce9190615a42565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561473f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147639190615275565b905061477a6001600160a01b038516333086614ba4565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa1580156147be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147e29190615275565b90508181116148485760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b61387582826157dc565b5f606082604001515160301461487b5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986148bc988a986001989297929690959094909390929101615a5d565b60405160208183030381529060405290505f5b8460800151602001515181101561492e578185608001516020015182815181106148fb576148fb6152ec565b6020026020010151604051602001614914929190615b17565b60408051601f1981840301815291905291506001016148cf565b5060a084015180516020918201515160405161494e938593929101615b4d565b60405160208183030381529060405290505f5b8460a0015160200151518110156149c057818560a0015160200151828151811061498d5761498d6152ec565b60200260200101516040516020016149a6929190615b17565b60408051601f198184030181529190529150600101614961565b5060c08401516040516149d7918391602001615b88565b60405160208183030381529060405290506002816040516149f8919061549d565b602060405180830381855afa158015614a13573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a369190615275565b94909350915050565b614a47614328565b614a4f614bdd565b610d3681614be5565b614a60614328565b614371614ccd565b614a70614328565b5f80516020615bfa83398151915261ffff84161580614a94575061271061ffff8516115b15614ab857604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614adc5760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614aef5750600a60ff8416115b15614b125760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611cb683835f614cd5565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613d80565b614371614328565b614bed614328565b80355f80516020615c1a8339815191529081556014614c126060840160408501615a07565b60ff161180614c315750614c2c6060830160408401615a07565b60ff16155b15614c6557614c466060830160408401615a07565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614c756060830160408401615a07565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614ca66040830160208401615032565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612aa4614328565b606081471015614cfa5760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614d15919061549d565b5f6040518083038185875af1925050503d805f8114614d4f576040519150601f19603f3d011682016040523d82523d5f602084013e614d54565b606091505b5091509150614d64868383614d6e565b9695505050505050565b606082614d8357614d7e82614dca565b611cb6565b8151158015614d9a57506001600160a01b0384163b155b15614dc357604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611cb6565b805115614dda5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614dff9061521d565b5f825580601f10614e0e575050565b601f0160209004905f5260205f2090810190610d369190614e67565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614e7b575f8155600101614e68565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114614e9f575f80fd5b919050565b5f805f60608486031215614eb6575f80fd5b833592506020840135614ec881614e7f565b9150614ed660408501614e8c565b90509250925092565b5f60208284031215614eef575f80fd5b5035919050565b5f8060408385031215614f07575f80fd5b82356001600160401b03811115614f1c575f80fd5b830160808186031215614f2d575f80fd5b9150614f3b60208401614e8c565b90509250929050565b5f8060408385031215614f55575f80fd5b82359150614f3b60208401614e8c565b5f60208284031215614f75575f80fd5b611cb682614e8c565b803561ffff81168114614e9f575f80fd5b80356001600160401b0381168114614e9f575f80fd5b5f805f8060808587031215614fb8575f80fd5b84356001600160401b03811115614fcd575f80fd5b850160a08188031215614fde575f80fd5b9350614fec60208601614f7e565b9250614ffa60408601614f8f565b9396929550929360600135925050565b5f806040838503121561501b575f80fd5b61502483614e8c565b946020939093013593505050565b5f60208284031215615042575f80fd5b611cb682614f8f565b5f806040838503121561505c575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061508f5761508f61506b565b9052565b5f5b838110156150ad578181015183820152602001615095565b50505f910152565b5f81518084526150cc816020860160208601615093565b601f01601f19169290920160200192915050565b602081526150f260208201835161507f565b5f602083015160e0604084015261510d6101008401826150b5565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f80828403610140811215615187575f80fd5b61012080821215615196575f80fd5b84935083013590506151a781615160565b809150509250929050565b5f80602083850312156151c3575f80fd5b82356001600160401b03808211156151d9575f80fd5b818501915085601f8301126151ec575f80fd5b8135818111156151fa575f80fd5b86602082850101111561520b575f80fd5b60209290920196919550909350505050565b600181811c9082168061523157607f821691505b60208210810361524f57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c66828461507f565b602081525f611cb660208301846150b5565b5f60208284031215615285575f80fd5b5051919050565b5f6020828403121561529c575f80fd5b8135611cb681615160565b5f808335601e198436030181126152bc575f80fd5b8301803591506001600160401b038211156152d5575f80fd5b6020019150600581901b36038213156136cb575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615314575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156153545761535461531e565b60405290565b604080519081016001600160401b03811182821017156153545761535461531e565b604051601f8201601f191681016001600160401b03811182821017156153a4576153a461531e565b604052919050565b5f6001600160401b038211156153c4576153c461531e565b50601f01601f191660200190565b5f82601f8301126153e1575f80fd5b81356153f46153ef826153ac565b61537c565b818152846020838601011115615408575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615434575f80fd5b61543c615332565b82356001600160401b0380821115615452575f80fd5b61545e368387016153d2565b83526020850135915080821115615473575f80fd5b50615480368286016153d2565b60208301525061549260408401614f8f565b604082015292915050565b5f8251615314818460208701615093565b601f8211156104d857805f5260205f20601f840160051c810160208510156154d35750805b601f840160051c820191505b8181101561166b575f81556001016154df565b81516001600160401b0381111561550b5761550b61531e565b61551f81615519845461521d565b846154ae565b602080601f831160018114615552575f841561553b5750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b8281101561558057888601518255948401946001909101908401615561565b508582101561559d57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c666155ad565b5f63ffffffff8083168181036155ec576155ec6155ad565b6001019392505050565b5f8261561057634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106156295761562961506b565b91905290565b8082028115828204841417610c6657610c666155ad565b5f60208083525f84546156588161521d565b806020870152604060018084165f81146156795760018114615695576156c2565b60ff19851660408a0152604084151560051b8a010195506156c2565b895f5260205f205f5b858110156156b95781548b820186015290830190880161569e565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611e1b57611e1b6155ad565b8051614e9f81614e7f565b5f806040838503121561571b575f80fd5b82516001600160401b0380821115615731575f80fd5b9084019060608287031215615744575f80fd5b61574c615332565b8251815260208084015161575f81615160565b82820152604084015183811115615774575f80fd5b80850194505087601f850112615788575f80fd5b835192506157986153ef846153ac565b83815288828587010111156157ab575f80fd5b6157ba84838301848801615093565b806040840152508195506157cf8188016156ff565b9450505050509250929050565b81810381811115610c6657610c666155ad565b5f808335601e19843603018112615804575f80fd5b8301803591506001600160401b0382111561581d575f80fd5b6020019150368190038213156136cb575f80fd5b5f8851615842818460208d01615093565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611e1b57611e1b6155ad565b6001600160401b038181168382160280821691908281146158dd576158dd6155ad565b505092915050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f8235603e19833603018112615314575f80fd5b5f60408236031215615937575f80fd5b61593f61535a565b61594883614e8c565b81526020808401356001600160401b0380821115615964575f80fd5b9085019036601f830112615976575f80fd5b8135818111156159885761598861531e565b8060051b915061599984830161537c565b81815291830184019184810190368411156159b2575f80fd5b938501935b838510156159dc57843592506159cc83615160565b82825293850193908501906159b7565b94860194909452509295945050505050565b5f602082840312156159fe575f80fd5b611cb682614f7e565b5f60208284031215615a17575f80fd5b813560ff81168114611cb6575f80fd5b5f6001600160401b038083168181036155ec576155ec6155ad565b5f60208284031215615a52575f80fd5b8151611cb681614e7f565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615aa381602a850160208b01615093565b865190830190615aba81602a840160208b01615093565b60c087901b6001600160c01b031916602a9290910191820152615aec603282018660e01b6001600160e01b0319169052565b615b05603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615b28818460208801615093565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615b5e818460208901615093565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b99818460208801615093565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615d74380380615d7483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c278061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b610209610204366004614e45565b6104a8565b005b610209610219366004614e80565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b366004614e45565b6106eb565b61020961025e366004614e97565b6106f6565b610209610271366004614ee5565b610be2565b610289610284366004614e80565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb366004614e45565b610c6c565b6102096102de366004614f06565b610c77565b6102f66102f1366004614f46565b610d39565b604051908152602001610234565b610209610312366004614fab565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f6610342366004614fd3565b610fd9565b610289610355366004614e80565b610ff2565b6102f65f81565b61020961036f366004614e45565b611006565b610226603081565b61020961038a366004614e80565b611031565b61020961039d366004614fab565b6110fc565b6102f66103b0366004614fec565b6112d4565b6102096103c3366004614f06565b611300565b6102f65f80516020615b9b83398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b610209610410366004614e80565b611489565b6102f65f80516020615bbb83398151915281565b610209610437366004614e80565b611672565b610226601481565b610457610452366004614e80565b6117af565b6040516102349190615081565b6102896202a30081565b6102f65f80516020615b7b83398151915281565b610209610490366004615115565b6118fe565b6102f66104a3366004615153565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615bfb8339815191526020526040808220815160e0810190925280545f80516020615bbb83398151915293929190829060ff16600581111561052a5761052a61500c565b600581111561053b5761053b61500c565b815260200160018201805461054f906151be565b80601f016020809104026020016040519081016040528092919081815260200182805461057b906151be565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156106315761063161500c565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016151f6565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611cbd565b6040518263ffffffff1660e01b81526004016106a59190615204565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e59190615216565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615bbb8339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af9190615216565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e9606085016040860161522d565b6001600160a01b03161461082c57610807606084016040850161522d565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a6060850185615248565b905090505f805b828163ffffffff161015610b22575f61085d6060880188615248565b8363ffffffff168181106108735761087361528d565b905060200281019061088591906152a1565b61088e906153c5565b80516040519192505f9160088801916108a69161543e565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf9190600401615204565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f9161543e565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d9190615216565b90508086600801835f0151604051610975919061543e565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f761500c565b021790555060208201516001820190610a109082615493565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab5911685615562565b8251604051919550610ac69161543e565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b90615575565b9050610841565b50600483018190555f610b40610b3786611d0c565b60400151611e22565b90505f610b4c87611faf565b90505f600282604051610b5f919061543e565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190615216565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb82612189565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c61500c565b14610c4c578060405163170cc93360e21b81526004016104cf91906151f6565b6106e583836121c4565b5f610c6664e8d4a5100083615597565b92915050565b6106e583838361243e565b610c7f612637565b5f80516020615b9b8339815191525f80610c988461266e565b91509150610ca582612189565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce061500c565b03610d05575f83815260078501602052604081208054919055610d0382826129ac565b505b610d1b81610d168460400151610fd9565b612a22565b505050505b610d3660015f80516020615bdb83398151915255565b50565b5f610d42612637565b610d4e85858585612a58565b9050610d6660015f80516020615bdb83398151915255565b949350505050565b5f8181525f80516020615b5b8339815191526020526040808220815160e0810190925280545f80516020615b9b83398151915293929190829060ff166003811115610dbb57610dbb61500c565b6003811115610dcc57610dcc61500c565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e5961500c565b14610e7a578251604051633b0d540d60e21b81526104cf91906004016155b6565b600481516005811115610e8f57610e8f61500c565b03610ea557610e9d85612c31565b505050505050565b5f80610ebc610eb389611d0c565b60400151612e18565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a510006155d0565b5f610ffc826117af565b6080015192915050565b61101183838361243e565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615b9b8339815191525f611049836117af565b51905060048160058111156110605761106061500c565b14611080578060405163170cc93360e21b81526004016104cf91906151f6565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b0316826129ac565b611104612637565b5f8181525f80516020615b5b8339815191526020526040808220815160e0810190925280545f80516020615b9b83398151915293929190829060ff1660038111156111515761115161500c565b60038111156111625761116261500c565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db61500c565b146111fc578051604051633b0d540d60e21b81526104cf91906004016155b6565b600461120b82604001516117af565b51600581111561121d5761121d61500c565b146112af575f61122c85611d0c565b90505f8061123d8360400151612e18565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612c31565b50506112d060015f80516020615bdb83398151915255565b5050565b5f6112dd612637565b6112e883338461306e565b9050610c6660015f80516020615bdb83398151915255565b5f80516020615bbb8339815191525f8061132561131c85611d0c565b60400151613346565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f82815260068401602052604090208054611365906151be565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af61500c565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016151f6565b5f82815260068401602052604081206113fa91614d94565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615b5b8339815191526020526040808220815160e0810190925280545f80516020615b9b83398151915293929190829060ff1660038111156114d6576114d661500c565b60038111156114e7576114e761500c565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156115605761156061500c565b14158015611581575060038151600381111561157e5761157e61500c565b14155b156115a2578051604051633b0d540d60e21b81526104cf91906004016155b6565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611cbd565b6040518263ffffffff1660e01b815260040161162b9190615204565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b9190615216565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615bbb83398151915291906116b9906151be565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff1660058111156117035761170361500c565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016151f6565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f91906004016155e7565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d89190615216565b6117b7614dcb565b5f8281525f80516020615bfb833981519152602052604090819020815160e0810190925280545f80516020615bbb833981519152929190829060ff1660058111156118045761180461500c565b60058111156118155761181561500c565b8152602001600182018054611829906151be565b80601f0160208091040260200160405190810160405280929190818152602001828054611855906151be565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119908484613502565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615bbb833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a209086908690615671565b90815260200160405180910390205491505092915050565b5f8381525f80516020615b5b8339815191526020526040808220815160e0810190925280545f80516020615b9b8339815191529284929091829060ff166003811115611a8657611a8661500c565b6003811115611a9757611a9761500c565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b2461500c565b14611b45578251604051633b0d540d60e21b81526104cf91906004016155b6565b60208301516001600160a01b03163314611b5f57336110a1565b600281516005811115611b7457611b7461500c565b03611c51578615611b8b57611b8982876121c4565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611bc4918491611bbf9190615680565b61351c565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c0584613673565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611cb69350505050565b600481516005811115611c6657611c6661500c565b03611c9a57611c7483613673565b5f898152600686016020526040902055611c8d88612c31565b6001945050505050611cb6565b805160405163170cc93360e21b81526104cf91906004016151f6565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d70573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d9791908101906156ab565b9150915080611db957604051636b2f19e960e01b815260040160405180910390fd5b815115611ddf578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611e1b576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611e5757815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611ea657611e6e81600161577d565b611e799060086155d0565b61ffff16848281518110611e8f57611e8f61528d565b016020015160f81c901b9190911790600101611e5a565b5061ffff811615611ed05760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611f2b57611ee781600361577d565b611ef29060086155d0565b63ffffffff1685611f04836002615562565b81518110611f1457611f1461528d565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff811615611f5157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015611fa657611f6881601f61577d565b611f739060086155d0565b86611f7f836006615562565b81518110611f8f57611f8f61528d565b016020015160f81c901b9190911790600101611f54565b50949350505050565b60605f80833560208501356014611fcb8787016040890161522d565b611fd86060890189615248565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61205e6060850185615248565b9050811015611e1b57816120756060860186615248565b838181106120855761208561528d565b905060200281019061209791906152a1565b6120a19080615790565b90506120b06060870187615248565b848181106120c0576120c061528d565b90506020028101906120d291906152a1565b6120dc9080615790565b6120e96060890189615248565b868181106120f9576120f961528d565b905060200281019061210b91906152a1565b612119906020810190615790565b61212660608b018b615248565b888181106121365761213661528d565b905060200281019061214891906152a1565b612159906060810190604001614fd3565b60405160200161216f97969594939291906157d2565b60408051601f198184030181529190529150600101612051565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561220f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261223691908101906156ab565b915091508061225857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561229b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122bf9190615216565b8251146122e5578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615612321576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f80612330846040015161381f565b915091508187146123575760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615b9b833981519152906001600160401b039081169083161115612414575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612433565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615b9b8339815191528161245786613a10565b905061246286612189565b61247157600192505050611cb6565b5f8681526004830160205260409020546001600160a01b0316331461249657336110a1565b5f86815260048301602052604090205460a08201516124c591600160b01b90046001600160401b03169061583b565b6001600160401b03168160c001516001600160401b0316101561250c5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125245761251d87866121c4565b9050612542565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061256790610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156125dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126019190615216565b905080846007015f8a81526020019081526020015f205f8282546126259190615562565b90915550501515979650505050505050565b5f80516020615bdb83398151915280546001190161266857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612677614dcb565b5f80516020615bbb8339815191525f8061269361131c87611d0c565b9150915080156126ba57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156126eb576126eb61500c565b60058111156126fc576126fc61500c565b8152602001600182018054612710906151be565b80601f016020809104026020016040519081016040528092919081815260200182805461273c906151be565b80156127875780601f1061275e57610100808354040283529160200191612787565b820191905f5260205f20905b81548152906001019060200180831161276a57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156127f2576127f261500c565b1415801561281357506001815160058111156128105761281061500c565b14155b1561283457805160405163170cc93360e21b81526104cf91906004016151f6565b6003815160058111156128495761284961500c565b03612857576004815261285c565b600581525b836008018160200151604051612872919061543e565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156128b6576128b661500c565b0217905550602082015160018201906128cf9082615493565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129755761297561500c565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615b7b83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a07575f80fd5b505af1158015612a19573d5f803e3d5ffd5b50505050505050565b5f80516020615b7b833981519152546112d0906001600160a01b03168383613cf4565b60015f80516020615bdb83398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615b9b83398151915290600160401b900461ffff9081169086161080612aac575061271061ffff8616115b15612ad057604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b0c576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612b1e5750806001015483115b15612b3f5760405163222d164360e21b8152600481018490526024016104cf565b5f612b4984613d53565b90505f612b5582610c56565b90505f612b628983613d76565b90506040518060800160405280612b763390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615b5b8339815191526020526040808220815160e0810190925280545f80516020615b9b83398151915293929190829060ff166003811115612c7e57612c7e61500c565b6003811115612c8f57612c8f61500c565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612dbd575f84815260048701602052604090205461271090612d6f90600160a01b900461ffff16856155d0565b612d799190615597565b915081866007015f8681526020019081526020015f205f828254612d9d9190615562565b90915550612dad9050828461577d565b9050612dbd8560200151826129ac565b612dd28560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e4f57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612e9e57612e6681600161577d565b612e719060086155d0565b61ffff16868281518110612e8757612e8761528d565b016020015160f81c901b9190911790600101612e52565b5061ffff811615612ec85760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612f2357612edf81600361577d565b612eea9060086155d0565b63ffffffff1687612efc836002615562565b81518110612f0c57612f0c61528d565b016020015160f81c901b9190911790600101612ecb565b5063ffffffff8116600314612f4b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fa057612f6281601f61577d565b612f6d9060086155d0565b88612f79836006615562565b81518110612f8957612f8961528d565b016020015160f81c901b9190911790600101612f4e565b505f805b6008811015612fff57612fb881600761577d565b612fc39060086155d0565b6001600160401b031689612fd8836026615562565b81518110612fe857612fe861528d565b016020015160f81c901b9190911790600101612fa4565b505f805b600881101561305e5761301781600761577d565b6130229060086155d0565b6001600160401b03168a61303783602e615562565b815181106130475761304761528d565b016020015160f81c901b9190911790600101613003565b5091989097509095509350505050565b5f5f80516020615b9b8339815191528161308a61028485613d53565b90505f613096876117af565b90506130a187612189565b6130c1576040516330efa98b60e01b8152600481018890526024016104cf565b6002815160058111156130d6576130d661500c565b146130f757805160405163170cc93360e21b81526104cf91906004016151f6565b5f828260800151613108919061583b565b905083600201600a9054906101000a90046001600160401b03168260400151613131919061585b565b6001600160401b0316816001600160401b0316111561316e57604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f8061317a8a8461351c565b915091505f8a836040516020016131a892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561323b5761323b61500c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461337c57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b60028110156133cb5761339381600161577d565b61339e9060086155d0565b61ffff168582815181106133b4576133b461528d565b016020015160f81c901b919091179060010161337f565b5061ffff8116156133f55760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134505761340c81600361577d565b6134179060086155d0565b63ffffffff1686613429836002615562565b815181106134395761343961528d565b016020015160f81c901b91909117906001016133f8565b5063ffffffff811660021461347857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134cd5761348f81601f61577d565b61349a9060086155d0565b876134a6836006615562565b815181106134b6576134b661528d565b016020015160f81c901b919091179060010161347b565b505f866026815181106134e2576134e261528d565b016020015191976001600160f81b03199092161515965090945050505050565b61350a6142c9565b61351382614314565b6112d081614382565b5f8281525f80516020615bfb833981519152602052604081206002015481905f80516020615bbb83398151915290600160801b90046001600160401b031661356485826143ea565b5f61356e876145c4565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6135be8a858b611cbd565b6040518263ffffffff1660e01b81526004016135da9190615204565b6020604051808303815f875af11580156135f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061361a9190615216565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615b9b83398151915290505f61369384604001516117af565b90505f6003825160058111156136ab576136ab61500c565b14806136c957506004825160058111156136c7576136c761500c565b145b156136d9575060c0810151613716565b6002825160058111156136ee576136ee61500c565b036136fa575042613716565b815160405163170cc93360e21b81526104cf91906004016151f6565b84608001516001600160401b0316816001600160401b03161161373d57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b59061376290610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156137f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138169190615216565b95945050505050565b5f808251602e1461385557825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b60028110156138a45761386c81600161577d565b6138779060086155d0565b61ffff1685828151811061388d5761388d61528d565b016020015160f81c901b9190911790600101613858565b5061ffff8116156138ce5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015613929576138e581600361577d565b6138f09060086155d0565b63ffffffff1686613902836002615562565b815181106139125761391261528d565b016020015160f81c901b91909117906001016138d1565b5063ffffffff81161561394f57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139a45761396681601f61577d565b6139719060086155d0565b8761397d836006615562565b8151811061398d5761398d61528d565b016020015160f81c901b9190911790600101613952565b505f805b6008811015613a03576139bc81600761577d565b6139c79060086155d0565b6001600160401b0316886139dc836026615562565b815181106139ec576139ec61528d565b016020015160f81c901b91909117906001016139a8565b5090969095509350505050565b613a18614dcb565b5f8281525f80516020615bfb8339815191526020526040808220815160e0810190925280545f80516020615bbb83398151915293929190829060ff166005811115613a6557613a6561500c565b6005811115613a7657613a7661500c565b8152602001600182018054613a8a906151be565b80601f0160208091040260200160405190810160405280929190818152602001828054613ab6906151be565b8015613b015780601f10613ad857610100808354040283529160200191613b01565b820191905f5260205f20905b815481529060010190602001808311613ae457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613b6f57613b6f61500c565b14613ba2575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016151f6565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613be657613be661500c565b021790555060208201516001820190613bff9082615493565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613c9d858261351c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614639565b5f610c66825f80516020615b7b833981519152546001600160a01b03169061469a565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613dba57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615bbb83398151915242613dd96060860160408701614fd3565b6001600160401b0316111580613e135750613df76202a30042615562565b613e076060860160408701614fd3565b6001600160401b031610155b15613e4d57613e286060850160408601614fd3565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b6030613e5c6020860186615790565b905014613e8e57613e706020850185615790565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613e988480615790565b90505f03613ec557613eaa8480615790565b604051633e08a12560e11b81526004016104cf929190615886565b5f60088201613ed48680615790565b604051613ee2929190615671565b90815260200160405180910390205414613f1b57613f008480615790565b60405163a41f772f60e01b81526004016104cf929190615886565b613f25835f6143ea565b6040805160e08101909152815481525f9081906140319060208101613f4a8980615790565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190613f92908a018a615790565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001613fdb60608a0160408b01614fd3565b6001600160401b03168152602001613ff660608a018a6158b4565b613fff906158c8565b815260200161401160808a018a6158b4565b61401a906158c8565b8152602001876001600160401b03168152506147f3565b5f8281526006860160205260409020919350915061404f8282615493565b50816008840161405f8880615790565b60405161406d929190615671565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906140a9908590600401615204565b6020604051808303815f875af11580156140c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e99190615216565b6040805160e0810190915290915080600181526020016141098980615790565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156141985761419861500c565b0217905550602082015160018201906141b19082615493565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061424f8880615790565b60405161425d929190615671565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061429b9190614fd3565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661431257604051631afcd79f60e31b815260040160405180910390fd5b565b61431c6142c9565b614325816149e0565b61432d6149f9565b610d366060820135608083013561434a60c0850160a08601614fd3565b61435a60e0860160c0870161598f565b61436b610100870160e088016159a8565b61437d6101208801610100890161522d565b614a09565b61438a6142c9565b5f80516020615b7b8339815191526001600160a01b0382166143ca57604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615bbb8339815191525f6001600160401b03808416908516111561441e576144178385615680565b905061442b565b6144288484615680565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061448d575060018401548151614489916001600160401b031690615562565b8210155b156144b3576001600160401b0383166060820152818152604081015160208201526144d2565b82816060018181516144c5919061583b565b6001600160401b03169052505b60608101516144e290606461585b565b602082015160018601546001600160401b03929092169161450d9190600160401b900460ff166155d0565b101561453d57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b0316816040018181516145589190615562565b9052506040810180516001600160401b038716919061457890839061577d565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615bfb8339815191526020526040812060020180545f80516020615bbb833981519152919060089061460e90600160401b90046001600160401b03166159c8565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f61464d6001600160a01b03841683614b38565b905080515f1415801561467157508080602001905181019061466f91906159e3565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156146e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147049190615216565b905061471b6001600160a01b038516333086614b45565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561475f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147839190615216565b90508181116147e95760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b613816828261577d565b5f606082604001515160301461481c5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861485d988a9860019892979296909590949093909291016159fe565b60405160208183030381529060405290505f5b846080015160200151518110156148cf5781856080015160200151828151811061489c5761489c61528d565b60200260200101516040516020016148b5929190615ab8565b60408051601f198184030181529190529150600101614870565b5060a08401518051602091820151516040516148ef938593929101615aee565b60405160208183030381529060405290505f5b8460a00151602001515181101561496157818560a0015160200151828151811061492e5761492e61528d565b6020026020010151604051602001614947929190615ab8565b60408051601f198184030181529190529150600101614902565b5060c0840151604051614978918391602001615b29565b6040516020818303038152906040529050600281604051614999919061543e565b602060405180830381855afa1580156149b4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906149d79190615216565b94909350915050565b6149e86142c9565b6149f0614b7e565b610d3681614b86565b614a016142c9565b614312614c6e565b614a116142c9565b5f80516020615b9b83398151915261ffff84161580614a35575061271061ffff8516115b15614a5957604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614a7d5760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614a905750600a60ff8416115b15614ab35760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611cb683835f614c76565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613d21565b6143126142c9565b614b8e6142c9565b80355f80516020615bbb8339815191529081556014614bb360608401604085016159a8565b60ff161180614bd25750614bcd60608301604084016159a8565b60ff16155b15614c0657614be760608301604084016159a8565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614c1660608301604084016159a8565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614c476040830160208401614fd3565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612a456142c9565b606081471015614c9b5760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614cb6919061543e565b5f6040518083038185875af1925050503d805f8114614cf0576040519150601f19603f3d011682016040523d82523d5f602084013e614cf5565b606091505b5091509150614d05868383614d0f565b9695505050505050565b606082614d2457614d1f82614d6b565b611cb6565b8151158015614d3b57506001600160a01b0384163b155b15614d6457604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611cb6565b805115614d7b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614da0906151be565b5f825580601f10614daf575050565b601f0160209004905f5260205f2090810190610d369190614e08565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614e1c575f8155600101614e09565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114614e40575f80fd5b919050565b5f805f60608486031215614e57575f80fd5b833592506020840135614e6981614e20565b9150614e7760408501614e2d565b90509250925092565b5f60208284031215614e90575f80fd5b5035919050565b5f8060408385031215614ea8575f80fd5b82356001600160401b03811115614ebd575f80fd5b830160808186031215614ece575f80fd5b9150614edc60208401614e2d565b90509250929050565b5f8060408385031215614ef6575f80fd5b82359150614edc60208401614e2d565b5f60208284031215614f16575f80fd5b611cb682614e2d565b803561ffff81168114614e40575f80fd5b80356001600160401b0381168114614e40575f80fd5b5f805f8060808587031215614f59575f80fd5b84356001600160401b03811115614f6e575f80fd5b850160a08188031215614f7f575f80fd5b9350614f8d60208601614f1f565b9250614f9b60408601614f30565b9396929550929360600135925050565b5f8060408385031215614fbc575f80fd5b614fc583614e2d565b946020939093013593505050565b5f60208284031215614fe3575f80fd5b611cb682614f30565b5f8060408385031215614ffd575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106150305761503061500c565b9052565b5f5b8381101561504e578181015183820152602001615036565b50505f910152565b5f815180845261506d816020860160208601615034565b601f01601f19169290920160200192915050565b60208152615093602082018351615020565b5f602083015160e060408401526150ae610100840182615056565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f80828403610140811215615128575f80fd5b61012080821215615137575f80fd5b849350830135905061514881615101565b809150509250929050565b5f8060208385031215615164575f80fd5b82356001600160401b038082111561517a575f80fd5b818501915085601f83011261518d575f80fd5b81358181111561519b575f80fd5b8660208285010111156151ac575f80fd5b60209290920196919550909350505050565b600181811c908216806151d257607f821691505b6020821081036151f057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c668284615020565b602081525f611cb66020830184615056565b5f60208284031215615226575f80fd5b5051919050565b5f6020828403121561523d575f80fd5b8135611cb681615101565b5f808335601e1984360301811261525d575f80fd5b8301803591506001600160401b03821115615276575f80fd5b6020019150600581901b360382131561366c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126152b5575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156152f5576152f56152bf565b60405290565b604080519081016001600160401b03811182821017156152f5576152f56152bf565b604051601f8201601f191681016001600160401b0381118282101715615345576153456152bf565b604052919050565b5f6001600160401b03821115615365576153656152bf565b50601f01601f191660200190565b5f82601f830112615382575f80fd5b81356153956153908261534d565b61531d565b8181528460208386010111156153a9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156153d5575f80fd5b6153dd6152d3565b82356001600160401b03808211156153f3575f80fd5b6153ff36838701615373565b83526020850135915080821115615414575f80fd5b5061542136828601615373565b60208301525061543360408401614f30565b604082015292915050565b5f82516152b5818460208701615034565b601f8211156104d857805f5260205f20601f840160051c810160208510156154745750805b601f840160051c820191505b8181101561166b575f8155600101615480565b81516001600160401b038111156154ac576154ac6152bf565b6154c0816154ba84546151be565b8461544f565b602080601f8311600181146154f3575f84156154dc5750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b8281101561552157888601518255948401946001909101908401615502565b508582101561553e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c6661554e565b5f63ffffffff80831681810361558d5761558d61554e565b6001019392505050565b5f826155b157634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106155ca576155ca61500c565b91905290565b8082028115828204841417610c6657610c6661554e565b5f60208083525f84546155f9816151be565b806020870152604060018084165f811461561a576001811461563657615663565b60ff19851660408a0152604084151560051b8a01019550615663565b895f5260205f205f5b8581101561565a5781548b820186015290830190880161563f565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611e1b57611e1b61554e565b8051614e4081614e20565b5f80604083850312156156bc575f80fd5b82516001600160401b03808211156156d2575f80fd5b90840190606082870312156156e5575f80fd5b6156ed6152d3565b8251815260208084015161570081615101565b82820152604084015183811115615715575f80fd5b80850194505087601f850112615729575f80fd5b835192506157396153908461534d565b838152888285870101111561574c575f80fd5b61575b84838301848801615034565b806040840152508195506157708188016156a0565b9450505050509250929050565b81810381811115610c6657610c6661554e565b5f808335601e198436030181126157a5575f80fd5b8301803591506001600160401b038211156157be575f80fd5b60200191503681900382131561366c575f80fd5b5f88516157e3818460208d01615034565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611e1b57611e1b61554e565b6001600160401b0381811683821602808216919082811461587e5761587e61554e565b505092915050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f8235603e198336030181126152b5575f80fd5b5f604082360312156158d8575f80fd5b6158e06152fb565b6158e983614e2d565b81526020808401356001600160401b0380821115615905575f80fd5b9085019036601f830112615917575f80fd5b813581811115615929576159296152bf565b8060051b915061593a84830161531d565b8181529183018401918481019036841115615953575f80fd5b938501935b8385101561597d578435925061596d83615101565b8282529385019390850190615958565b94860194909452509295945050505050565b5f6020828403121561599f575f80fd5b611cb682614f1f565b5f602082840312156159b8575f80fd5b813560ff81168114611cb6575f80fd5b5f6001600160401b0380831681810361558d5761558d61554e565b5f602082840312156159f3575f80fd5b8151611cb681614e20565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615a4481602a850160208b01615034565b865190830190615a5b81602a840160208b01615034565b60c087901b6001600160c01b031916602a9290910191820152615a8d603282018660e01b6001600160e01b0319169052565b615aa6603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615ac9818460208801615034565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615aff818460208901615034565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b3a818460208801615034565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 17aff4e96..531206df4 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\":\"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\":\"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: "0x608060405234801561000f575f80fd5b50604051615ade380380615ade83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159918061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614c48565b61060a565b005b348015610216575f80fd5b50610209610225366004614c83565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614c48565b61084d565b34801561027f575f80fd5b5061020961028e366004614c9a565b610858565b34801561029e575f80fd5b506102096102ad366004614ce8565b610d44565b3480156102bd575f80fd5b506102096102cc366004614cff565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614c83565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614c48565b610eab565b34801561038c575f80fd5b5061020961039b366004614d20565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614d39565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614d77565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614c83565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614c48565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614c83565b61123b565b3480156104a4575f80fd5b506102096104b3366004614d39565b611306565b3480156104c3575f80fd5b506102096104d2366004614d20565b6114de565b6104076104e5366004614da1565b611667565b3480156104f5575f80fd5b506104075f8051602061590583398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614c83565b61169b565b34801561054e575f80fd5b506104075f8051602061592583398151915281565b34801561056e575f80fd5b5061020961057d366004614c83565b611884565b610407610590366004614c83565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614c83565b6119f2565b60405161024c9190614e6a565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b50610407610605366004614eea565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206159658339815191526020526040808220815160e0810190925280545f8051602061592583398151915293929190829060ff16600581111561068c5761068c614df5565b600581111561069d5761069d614df5565b81526020016001820180546106b190614f55565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd90614f55565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614df5565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f87565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611e1a565b6040518263ffffffff1660e01b81526004016108079190614f95565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108479190614fa7565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206159258339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109119190614fa7565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b6060850160408601614fd2565b6001600160a01b03161461098e576109696060840160408501614fd2565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c6060850185614fed565b905090505f805b828163ffffffff161015610c84575f6109bf6060880188614fed565b8363ffffffff168181106109d5576109d5615032565b90506020028101906109e79190615046565b6109f09061516a565b80516040519192505f916008880191610a08916151e3565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b81526106319190600401614f95565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a81916151e3565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf9190614fa7565b90508086600801835f0151604051610ad791906151e3565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614df5565b021790555060208201516001820190610b729082615238565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c17911685615307565b8251604051919550610c28916151e3565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d9061531a565b90506109a3565b50600483018190555f610ca2610c9986611e69565b60400151611f7f565b90505f610cae8761210c565b90505f600282604051610cc191906151e3565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff9190614fa7565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd583612345565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a82612356565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614df5565b14610e8b578060405163170cc93360e21b81526004016106319190614f87565b6108478383612391565b5f610ea564e8d4a510008361533c565b92915050565b61084783838361260b565b610ebe612804565b5f805160206159058339815191525f80610ed78461283b565b91509150610ee482612356565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614df5565b03610f44575f83815260078501602052604081208054919055610f428282612b79565b505b610f5a81610f5584604001516111e3565b612bd7565b505050505b610f7560015f8051602061594583398151915255565b50565b5f8181525f805160206158e58339815191526020526040808220815160e0810190925280545f8051602061590583398151915293929190829060ff166003811115610fc557610fc5614df5565b6003811115610fd657610fd6614df5565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614df5565b14611084578251604051633b0d540d60e21b8152610631919060040161535b565b60048151600581111561109957611099614df5565b036110af576110a785612bfd565b505050505050565b5f806110c66110bd89611e69565b60400151612de4565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a51000615375565b5f611206826119f2565b6080015192915050565b61121b83838361260b565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f805160206159058339815191525f611253836119f2565b519050600481600581111561126a5761126a614df5565b1461128a578060405163170cc93360e21b81526004016106319190614f87565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612b79565b61130e612804565b5f8181525f805160206158e58339815191526020526040808220815160e0810190925280545f8051602061590583398151915293929190829060ff16600381111561135b5761135b614df5565b600381111561136c5761136c614df5565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614df5565b14611406578051604051633b0d540d60e21b8152610631919060040161535b565b600461141582604001516119f2565b51600581111561142757611427614df5565b146114b9575f61143685611e69565b90505f806114478360400151612de4565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612bfd565b50506114da60015f8051602061594583398151915255565b5050565b5f805160206159258339815191525f806115036114fa85611e69565b6040015161303a565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f8281526006840160205260409020805461154390614f55565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614df5565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f87565b5f82815260068401602052604081206115d891614b9c565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f611670612804565b61167c848484346131f6565b905061169460015f8051602061594583398151915255565b9392505050565b5f8181525f805160206158e58339815191526020526040808220815160e0810190925280545f8051602061590583398151915293929190829060ff1660038111156116e8576116e8614df5565b60038111156116f9576116f9614df5565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614df5565b14158015611793575060038151600381111561179057611790614df5565b14155b156117b4578051604051633b0d540d60e21b8152610631919060040161535b565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611e1a565b6040518263ffffffff1660e01b815260040161183d9190614f95565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d9190614fa7565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061592583398151915291906118cb90614f55565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614df5565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f87565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611981919060040161538c565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a9190614fa7565b5f6119ca612804565b6119d58233346133c4565b90506119ed60015f8051602061594583398151915255565b919050565b6119fa614bd3565b5f8281525f80516020615965833981519152602052604090819020815160e0810190925280545f80516020615925833981519152929190829060ff166005811115611a4757611a47614df5565b6005811115611a5857611a58614df5565b8152602001600182018054611a6c90614f55565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9890614f55565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615925833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b849086908690615416565b90815260200160405180910390205491505092915050565b5f8381525f805160206158e58339815191526020526040808220815160e0810190925280545f805160206159058339815191529284929091829060ff166003811115611bea57611bea614df5565b6003811115611bfb57611bfb614df5565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614df5565b14611ca9578251604051633b0d540d60e21b8152610631919060040161535b565b60208301516001600160a01b03163314611cc357336112ab565b600281516005811115611cd857611cd8614df5565b03611db5578615611cef57611ced8287612391565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611d28918491611d239190615425565b613699565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d69846137f0565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611dca57611dca614df5565b03611dfe57611dd8836137f0565b5f898152600686016020526040902055611df188612bfd565b6001945050505050611694565b805160405163170cc93360e21b81526106319190600401614f87565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ecd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ef49190810190615450565b9150915080611f1657604051636b2f19e960e01b815260040160405180910390fd5b815115611f3c578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615611f78576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f8151602614611fb457815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561200357611fcb816001615522565b611fd6906008615375565b61ffff16848281518110611fec57611fec615032565b016020015160f81c901b9190911790600101611fb7565b5061ffff81161561202d5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561208857612044816003615522565b61204f906008615375565b63ffffffff1685612061836002615307565b8151811061207157612071615032565b016020015160f81c901b9190911790600101612030565b5063ffffffff8116156120ae57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612103576120c581601f615522565b6120d0906008615375565b866120dc836006615307565b815181106120ec576120ec615032565b016020015160f81c901b91909117906001016120b1565b50949350505050565b60605f8083356020850135601461212887870160408901614fd2565b6121356060890189614fed565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121bb6060850185614fed565b9050811015611f78576121d16060850185614fed565b828181106121e1576121e1615032565b90506020028101906121f39190615046565b612201906020810190615535565b90506030146122235760405163180ffa0d60e01b815260040160405180910390fd5b816122316060860186614fed565b8381811061224157612241615032565b90506020028101906122539190615046565b61225d9080615535565b905061226c6060870187614fed565b8481811061227c5761227c615032565b905060200281019061228e9190615046565b6122989080615535565b6122a56060890189614fed565b868181106122b5576122b5615032565b90506020028101906122c79190615046565b6122d5906020810190615535565b6122e260608b018b614fed565b888181106122f2576122f2615032565b90506020028101906123049190615046565b612315906060810190604001614d77565b60405160200161232b9796959493929190615577565b60408051601f1981840301815291905291506001016121ae565b61234d61399c565b610f75816139e7565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa1580156123dc573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526124039190810190615450565b915091508061242557604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612468573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061248c9190614fa7565b8251146124b2578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b0316156124ee576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f806124fd8460400151613a55565b915091508187146125245760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615905833981519152906001600160401b0390811690831611156125e1575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612600565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f805160206159058339815191528161262486613c46565b905061262f86612356565b61263e57600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461266357336112ab565b5f86815260048301602052604090205460a082015161269291600160b01b90046001600160401b0316906155e0565b6001600160401b03168160c001516001600160401b031610156126d95760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f85156126f1576126ea8786612391565b905061270f565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b590612734906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156127aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127ce9190614fa7565b905080846007015f8a81526020019081526020015f205f8282546127f29190615307565b90915550501515979650505050505050565b5f8051602061594583398151915280546001190161283557604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612844614bd3565b5f805160206159258339815191525f806128606114fa87611e69565b91509150801561288757604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128b8576128b8614df5565b60058111156128c9576128c9614df5565b81526020016001820180546128dd90614f55565b80601f016020809104026020016040519081016040528092919081815260200182805461290990614f55565b80156129545780601f1061292b57610100808354040283529160200191612954565b820191905f5260205f20905b81548152906001019060200180831161293757829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129bf576129bf614df5565b141580156129e057506001815160058111156129dd576129dd614df5565b14155b15612a0157805160405163170cc93360e21b81526106319190600401614f87565b600381516005811115612a1657612a16614df5565b03612a245760048152612a29565b600581525b836008018160200151604051612a3f91906151e3565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a8357612a83614df5565b021790555060208201516001820190612a9c9082615238565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b4257612b42614df5565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612bc5575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613f2a565b60015f8051602061594583398151915255565b5f8181525f805160206158e58339815191526020526040808220815160e0810190925280545f8051602061590583398151915293929190829060ff166003811115612c4a57612c4a614df5565b6003811115612c5b57612c5b614df5565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612d89575f84815260048701602052604090205461271090612d3b90600160a01b900461ffff1685615375565b612d45919061533c565b915081866007015f8681526020019081526020015f205f828254612d699190615307565b90915550612d7990508284615522565b9050612d89856020015182612b79565b612d9e8560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e1b57835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e6a57612e32816001615522565b612e3d906008615375565b61ffff16868281518110612e5357612e53615032565b016020015160f81c901b9190911790600101612e1e565b5061ffff811615612e945760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612eef57612eab816003615522565b612eb6906008615375565b63ffffffff1687612ec8836002615307565b81518110612ed857612ed8615032565b016020015160f81c901b9190911790600101612e97565b5063ffffffff8116600314612f1757604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f6c57612f2e81601f615522565b612f39906008615375565b88612f45836006615307565b81518110612f5557612f55615032565b016020015160f81c901b9190911790600101612f1a565b505f805b6008811015612fcb57612f84816007615522565b612f8f906008615375565b6001600160401b031689612fa4836026615307565b81518110612fb457612fb4615032565b016020015160f81c901b9190911790600101612f70565b505f805b600881101561302a57612fe3816007615522565b612fee906008615375565b6001600160401b03168a61300383602e615307565b8151811061301357613013615032565b016020015160f81c901b9190911790600101612fcf565b5091989097509095509350505050565b5f80825160271461307057825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b60028110156130bf57613087816001615522565b613092906008615375565b61ffff168582815181106130a8576130a8615032565b016020015160f81c901b9190911790600101613073565b5061ffff8116156130e95760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561314457613100816003615522565b61310b906008615375565b63ffffffff168661311d836002615307565b8151811061312d5761312d615032565b016020015160f81c901b91909117906001016130ec565b5063ffffffff811660021461316c57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131c15761318381601f615522565b61318e906008615375565b8761319a836006615307565b815181106131aa576131aa615032565b016020015160f81c901b919091179060010161316f565b505f866026815181106131d6576131d6615032565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f8051602061590583398151915290600160401b900461ffff908116908616108061324a575061271061ffff8616115b1561326e57604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b0390811690851610156132aa576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b80548310806132bc5750806001015483115b156132dd5760405163222d164360e21b815260048101849052602401610631565b825f6132e882610e95565b90505f6132f58983613fbd565b905060405180608001604052806133093390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615905833981519152816133dd84610e95565b90505f6133e9876119f2565b90506133f487612356565b613414576040516330efa98b60e01b815260048101889052602401610631565b60028151600581111561342957613429614df5565b1461344a57805160405163170cc93360e21b81526106319190600401614f87565b5f82826080015161345b91906155e0565b905083600201600a9054906101000a90046001600160401b031682604001516134849190615600565b6001600160401b0316816001600160401b031611156134c157604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f806134cd8a84613699565b915091505f8a836040516020016134fb92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561358e5761358e614df5565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615965833981519152602052604081206002015481905f8051602061592583398151915290600160801b90046001600160401b03166136e18582614510565b5f6136eb876146ea565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb61373b8a858b611e1a565b6040518263ffffffff1660e01b81526004016137579190614f95565b6020604051808303815f875af1158015613773573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137979190614fa7565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f8051602061590583398151915290505f61381084604001516119f2565b90505f60038251600581111561382857613828614df5565b1480613846575060048251600581111561384457613844614df5565b145b15613856575060c0810151613893565b60028251600581111561386b5761386b614df5565b03613877575042613893565b815160405163170cc93360e21b81526106319190600401614f87565b84608001516001600160401b0316816001600160401b0316116138ba57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906138df906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa15801561396f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139939190614fa7565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166139e557604051631afcd79f60e31b815260040160405180910390fd5b565b6139ef61399c565b6139f88161475f565b613a00614778565b610f7560608201356080830135613a1d60c0850160a08601614d77565b613a2d60e0860160c0870161562b565b613a3e610100870160e08801615644565b613a5061012088016101008901614fd2565b614788565b5f808251602e14613a8b57825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613ada57613aa2816001615522565b613aad906008615375565b61ffff16858281518110613ac357613ac3615032565b016020015160f81c901b9190911790600101613a8e565b5061ffff811615613b045760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b5f57613b1b816003615522565b613b26906008615375565b63ffffffff1686613b38836002615307565b81518110613b4857613b48615032565b016020015160f81c901b9190911790600101613b07565b5063ffffffff811615613b8557604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613bda57613b9c81601f615522565b613ba7906008615375565b87613bb3836006615307565b81518110613bc357613bc3615032565b016020015160f81c901b9190911790600101613b88565b505f805b6008811015613c3957613bf2816007615522565b613bfd906008615375565b6001600160401b031688613c12836026615307565b81518110613c2257613c22615032565b016020015160f81c901b9190911790600101613bde565b5090969095509350505050565b613c4e614bd3565b5f8281525f805160206159658339815191526020526040808220815160e0810190925280545f8051602061592583398151915293929190829060ff166005811115613c9b57613c9b614df5565b6005811115613cac57613cac614df5565b8152602001600182018054613cc090614f55565b80601f0160208091040260200160405190810160405280929190818152602001828054613cec90614f55565b8015613d375780601f10613d0e57610100808354040283529160200191613d37565b820191905f5260205f20905b815481529060010190602001808311613d1a57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613da557613da5614df5565b14613dd8575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f87565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e1c57613e1c614df5565b021790555060208201516001820190613e359082615238565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613ed38582613699565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f4d5760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f96576040519150601f19603f3d011682016040523d82523d5f602084013e613f9b565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661400157604051637fab81e560e01b815260040160405180910390fd5b5f80516020615925833981519152426140206060860160408701614d77565b6001600160401b031611158061405a575061403e6202a30042615307565b61404e6060860160408701614d77565b6001600160401b031610155b156140945761406f6060850160408601614d77565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b60306140a36020860186615535565b9050146140d5576140b76020850185615535565b6040516326475b2f60e11b8152610631925060040190815260200190565b6140df8480615535565b90505f0361410c576140f18480615535565b604051633e08a12560e11b8152600401610631929190615664565b5f6008820161411b8680615535565b604051614129929190615416565b90815260200160405180910390205414614162576141478480615535565b60405163a41f772f60e01b8152600401610631929190615664565b61416c835f614510565b6040805160e08101909152815481525f90819061427890602081016141918980615535565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020908101906141d9908a018a615535565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161422260608a0160408b01614d77565b6001600160401b0316815260200161423d60608a018a615692565b614246906156a6565b815260200161425860808a018a615692565b614261906156a6565b8152602001876001600160401b03168152506148b7565b5f828152600686016020526040902091935091506142968282615238565b5081600884016142a68880615535565b6040516142b4929190615416565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906142f0908590600401614f95565b6020604051808303815f875af115801561430c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143309190614fa7565b6040805160e0810190915290915080600181526020016143508980615535565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143df576143df614df5565b0217905550602082015160018201906143f89082615238565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144968880615535565b6040516144a4929190615416565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144e29190614d77565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f805160206159258339815191525f6001600160401b0380841690851611156145445761453d8385615425565b9050614551565b61454e8484615425565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806145b35750600184015481516145af916001600160401b031690615307565b8210155b156145d9576001600160401b0383166060820152818152604081015160208201526145f8565b82816060018181516145eb91906155e0565b6001600160401b03169052505b6060810151614608906064615600565b602082015160018601546001600160401b0392909216916146339190600160401b900460ff16615375565b101561466357606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b03168160400181815161467e9190615307565b9052506040810180516001600160401b038716919061469e908390615522565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206159658339815191526020526040812060020180545f80516020615925833981519152919060089061473490600160401b90046001600160401b031661576d565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61476761399c565b61476f614aa4565b610f7581614aac565b61478061399c565b6139e5614b94565b61479061399c565b5f8051602061590583398151915261ffff841615806147b4575061271061ffff8516115b156147d857604051635f12e6c360e11b815261ffff85166004820152602401610631565b858711156147fc5760405163222d164360e21b815260048101889052602401610631565b60ff8316158061480f5750600a60ff8416115b156148325760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260400151516030146148e05760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614921988a986001989297929690959094909390929101615788565b60405160208183030381529060405290505f5b846080015160200151518110156149935781856080015160200151828151811061496057614960615032565b6020026020010151604051602001614979929190615842565b60408051601f198184030181529190529150600101614934565b5060a08401518051602091820151516040516149b3938593929101615878565b60405160208183030381529060405290505f5b8460a001516020015151811015614a2557818560a001516020015182815181106149f2576149f2615032565b6020026020010151604051602001614a0b929190615842565b60408051601f1981840301815291905291506001016149c6565b5060c0840151604051614a3c9183916020016158b3565b6040516020818303038152906040529050600281604051614a5d91906151e3565b602060405180830381855afa158015614a78573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a9b9190614fa7565b94909350915050565b6139e561399c565b614ab461399c565b80355f805160206159258339815191529081556014614ad96060840160408501615644565b60ff161180614af85750614af36060830160408401615644565b60ff16155b15614b2c57614b0d6060830160408401615644565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614b3c6060830160408401615644565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614b6d6040830160208401614d77565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612bea61399c565b508054614ba890614f55565b5f825580601f10614bb7575050565b601f0160209004905f5260205f2090810190610f759190614c10565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614c24575f8155600101614c11565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614c5a575f80fd5b833592506020840135614c6c81614c28565b9150614c7a60408501614c35565b90509250925092565b5f60208284031215614c93575f80fd5b5035919050565b5f8060408385031215614cab575f80fd5b82356001600160401b03811115614cc0575f80fd5b830160808186031215614cd1575f80fd5b9150614cdf60208401614c35565b90509250929050565b5f6101208284031215614cf9575f80fd5b50919050565b5f8060408385031215614d10575f80fd5b82359150614cdf60208401614c35565b5f60208284031215614d30575f80fd5b61169482614c35565b5f8060408385031215614d4a575f80fd5b614d5383614c35565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614d87575f80fd5b61169482614d61565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614db3575f80fd5b83356001600160401b03811115614dc8575f80fd5b840160a08187031215614dd9575f80fd5b9250614de760208501614d90565b9150614c7a60408501614d61565b634e487b7160e01b5f52602160045260245ffd5b60068110614e1957614e19614df5565b9052565b5f5b83811015614e37578181015183820152602001614e1f565b50505f910152565b5f8151808452614e56816020860160208601614e1d565b601f01601f19169290920160200192915050565b60208152614e7c602082018351614e09565b5f602083015160e06040840152614e97610100840182614e3f565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215614efb575f80fd5b82356001600160401b0380821115614f11575f80fd5b818501915085601f830112614f24575f80fd5b813581811115614f32575f80fd5b866020828501011115614f43575f80fd5b60209290920196919550909350505050565b600181811c90821680614f6957607f821691505b602082108103614cf957634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614e09565b602081525f6116946020830184614e3f565b5f60208284031215614fb7575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f60208284031215614fe2575f80fd5b813561169481614fbe565b5f808335601e19843603018112615002575f80fd5b8301803591506001600160401b0382111561501b575f80fd5b6020019150600581901b36038213156137e9575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e1983360301811261505a575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561509a5761509a615064565b60405290565b604080519081016001600160401b038111828210171561509a5761509a615064565b604051601f8201601f191681016001600160401b03811182821017156150ea576150ea615064565b604052919050565b5f6001600160401b0382111561510a5761510a615064565b50601f01601f191660200190565b5f82601f830112615127575f80fd5b813561513a615135826150f2565b6150c2565b81815284602083860101111561514e575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561517a575f80fd5b615182615078565b82356001600160401b0380821115615198575f80fd5b6151a436838701615118565b835260208501359150808211156151b9575f80fd5b506151c636828601615118565b6020830152506151d860408401614d61565b604082015292915050565b5f825161505a818460208701614e1d565b601f82111561063a57805f5260205f20601f840160051c810160208510156152195750805b601f840160051c820191505b8181101561187d575f8155600101615225565b81516001600160401b0381111561525157615251615064565b6152658161525f8454614f55565b846151f4565b602080601f831160018114615298575f84156152815750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b828110156152c6578886015182559484019460019091019084016152a7565b50858210156152e357878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea56152f3565b5f63ffffffff808316818103615332576153326152f3565b6001019392505050565b5f8261535657634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061536f5761536f614df5565b91905290565b8082028115828204841417610ea557610ea56152f3565b5f60208083525f845461539e81614f55565b806020870152604060018084165f81146153bf57600181146153db57615408565b60ff19851660408a0152604084151560051b8a01019550615408565b895f5260205f205f5b858110156153ff5781548b82018601529083019088016153e4565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611f7857611f786152f3565b80516119ed81614c28565b5f8060408385031215615461575f80fd5b82516001600160401b0380821115615477575f80fd5b908401906060828703121561548a575f80fd5b615492615078565b825181526020808401516154a581614fbe565b828201526040840151838111156154ba575f80fd5b80850194505087601f8501126154ce575f80fd5b835192506154de615135846150f2565b83815288828587010111156154f1575f80fd5b61550084838301848801614e1d565b80604084015250819550615515818801615445565b9450505050509250929050565b81810381811115610ea557610ea56152f3565b5f808335601e1984360301811261554a575f80fd5b8301803591506001600160401b03821115615563575f80fd5b6020019150368190038213156137e9575f80fd5b5f8851615588818460208d01614e1d565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611f7857611f786152f3565b6001600160401b03818116838216028082169190828114615623576156236152f3565b505092915050565b5f6020828403121561563b575f80fd5b61169482614d90565b5f60208284031215615654575f80fd5b813560ff81168114611694575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f8235603e1983360301811261505a575f80fd5b5f604082360312156156b6575f80fd5b6156be6150a0565b6156c783614c35565b81526020808401356001600160401b03808211156156e3575f80fd5b9085019036601f8301126156f5575f80fd5b81358181111561570757615707615064565b8060051b91506157188483016150c2565b8181529183018401918481019036841115615731575f80fd5b938501935b8385101561575b578435925061574b83614fbe565b8282529385019390850190615736565b94860194909452509295945050505050565b5f6001600160401b03808316818103615332576153326152f3565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516157ce81602a850160208b01614e1d565b8651908301906157e581602a840160208b01614e1d565b60c087901b6001600160c01b031916602a9290910191820152615817603282018660e01b6001600160e01b0319169052565b615830603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615853818460208801614e1d565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615889818460208901614e1d565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516158c4818460208801614e1d565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615a7f380380615a7f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159328061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614be9565b61060a565b005b348015610216575f80fd5b50610209610225366004614c24565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614be9565b61084d565b34801561027f575f80fd5b5061020961028e366004614c3b565b610858565b34801561029e575f80fd5b506102096102ad366004614c89565b610d44565b3480156102bd575f80fd5b506102096102cc366004614ca0565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614c24565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614be9565b610eab565b34801561038c575f80fd5b5061020961039b366004614cc1565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614cda565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614d18565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614c24565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614be9565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614c24565b61123b565b3480156104a4575f80fd5b506102096104b3366004614cda565b611306565b3480156104c3575f80fd5b506102096104d2366004614cc1565b6114de565b6104076104e5366004614d42565b611667565b3480156104f5575f80fd5b506104075f805160206158a683398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614c24565b61169b565b34801561054e575f80fd5b506104075f805160206158c683398151915281565b34801561056e575f80fd5b5061020961057d366004614c24565b611884565b610407610590366004614c24565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614c24565b6119f2565b60405161024c9190614e0b565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b50610407610605366004614e8b565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206159068339815191526020526040808220815160e0810190925280545f805160206158c683398151915293929190829060ff16600581111561068c5761068c614d96565b600581111561069d5761069d614d96565b81526020016001820180546106b190614ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd90614ef6565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614d96565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f28565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611e1a565b6040518263ffffffff1660e01b81526004016108079190614f36565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108479190614f48565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206158c68339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109119190614f48565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b6060850160408601614f73565b6001600160a01b03161461098e576109696060840160408501614f73565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c6060850185614f8e565b905090505f805b828163ffffffff161015610c84575f6109bf6060880188614f8e565b8363ffffffff168181106109d5576109d5614fd3565b90506020028101906109e79190614fe7565b6109f09061510b565b80516040519192505f916008880191610a0891615184565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b81526106319190600401614f36565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8191615184565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf9190614f48565b90508086600801835f0151604051610ad79190615184565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614d96565b021790555060208201516001820190610b7290826151d9565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c179116856152a8565b8251604051919550610c2891615184565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d906152bb565b90506109a3565b50600483018190555f610ca2610c9986611e69565b60400151611f7f565b90505f610cae8761210c565b90505f600282604051610cc19190615184565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff9190614f48565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd5836122e6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a826122f7565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614d96565b14610e8b578060405163170cc93360e21b81526004016106319190614f28565b6108478383612332565b5f610ea564e8d4a51000836152dd565b92915050565b6108478383836125ac565b610ebe6127a5565b5f805160206158a68339815191525f80610ed7846127dc565b91509150610ee4826122f7565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614d96565b03610f44575f83815260078501602052604081208054919055610f428282612b1a565b505b610f5a81610f5584604001516111e3565b612b78565b505050505b610f7560015f805160206158e683398151915255565b50565b5f8181525f805160206158868339815191526020526040808220815160e0810190925280545f805160206158a683398151915293929190829060ff166003811115610fc557610fc5614d96565b6003811115610fd657610fd6614d96565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614d96565b14611084578251604051633b0d540d60e21b815261063191906004016152fc565b60048151600581111561109957611099614d96565b036110af576110a785612b9e565b505050505050565b5f806110c66110bd89611e69565b60400151612d85565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a51000615316565b5f611206826119f2565b6080015192915050565b61121b8383836125ac565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f805160206158a68339815191525f611253836119f2565b519050600481600581111561126a5761126a614d96565b1461128a578060405163170cc93360e21b81526004016106319190614f28565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612b1a565b61130e6127a5565b5f8181525f805160206158868339815191526020526040808220815160e0810190925280545f805160206158a683398151915293929190829060ff16600381111561135b5761135b614d96565b600381111561136c5761136c614d96565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614d96565b14611406578051604051633b0d540d60e21b815261063191906004016152fc565b600461141582604001516119f2565b51600581111561142757611427614d96565b146114b9575f61143685611e69565b90505f806114478360400151612d85565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612b9e565b50506114da60015f805160206158e683398151915255565b5050565b5f805160206158c68339815191525f806115036114fa85611e69565b60400151612fdb565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f8281526006840160205260409020805461154390614ef6565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614d96565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f28565b5f82815260068401602052604081206115d891614b3d565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6116706127a5565b61167c84848434613197565b905061169460015f805160206158e683398151915255565b9392505050565b5f8181525f805160206158868339815191526020526040808220815160e0810190925280545f805160206158a683398151915293929190829060ff1660038111156116e8576116e8614d96565b60038111156116f9576116f9614d96565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614d96565b14158015611793575060038151600381111561179057611790614d96565b14155b156117b4578051604051633b0d540d60e21b815261063191906004016152fc565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611e1a565b6040518263ffffffff1660e01b815260040161183d9190614f36565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d9190614f48565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206158c683398151915291906118cb90614ef6565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614d96565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f28565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611981919060040161532d565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a9190614f48565b5f6119ca6127a5565b6119d5823334613365565b90506119ed60015f805160206158e683398151915255565b919050565b6119fa614b74565b5f8281525f80516020615906833981519152602052604090819020815160e0810190925280545f805160206158c6833981519152929190829060ff166005811115611a4757611a47614d96565b6005811115611a5857611a58614d96565b8152602001600182018054611a6c90614ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9890614ef6565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f805160206158c6833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b8490869086906153b7565b90815260200160405180910390205491505092915050565b5f8381525f805160206158868339815191526020526040808220815160e0810190925280545f805160206158a68339815191529284929091829060ff166003811115611bea57611bea614d96565b6003811115611bfb57611bfb614d96565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614d96565b14611ca9578251604051633b0d540d60e21b815261063191906004016152fc565b60208301516001600160a01b03163314611cc357336112ab565b600281516005811115611cd857611cd8614d96565b03611db5578615611cef57611ced8287612332565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611d28918491611d2391906153c6565b61363a565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d6984613791565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611dca57611dca614d96565b03611dfe57611dd883613791565b5f898152600686016020526040902055611df188612b9e565b6001945050505050611694565b805160405163170cc93360e21b81526106319190600401614f28565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ecd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ef491908101906153f1565b9150915080611f1657604051636b2f19e960e01b815260040160405180910390fd5b815115611f3c578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615611f78576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f8151602614611fb457815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561200357611fcb8160016154c3565b611fd6906008615316565b61ffff16848281518110611fec57611fec614fd3565b016020015160f81c901b9190911790600101611fb7565b5061ffff81161561202d5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612088576120448160036154c3565b61204f906008615316565b63ffffffff16856120618360026152a8565b8151811061207157612071614fd3565b016020015160f81c901b9190911790600101612030565b5063ffffffff8116156120ae57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612103576120c581601f6154c3565b6120d0906008615316565b866120dc8360066152a8565b815181106120ec576120ec614fd3565b016020015160f81c901b91909117906001016120b1565b50949350505050565b60605f8083356020850135601461212887870160408901614f73565b6121356060890189614f8e565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121bb6060850185614f8e565b9050811015611f7857816121d26060860186614f8e565b838181106121e2576121e2614fd3565b90506020028101906121f49190614fe7565b6121fe90806154d6565b905061220d6060870187614f8e565b8481811061221d5761221d614fd3565b905060200281019061222f9190614fe7565b61223990806154d6565b6122466060890189614f8e565b8681811061225657612256614fd3565b90506020028101906122689190614fe7565b6122769060208101906154d6565b61228360608b018b614f8e565b8881811061229357612293614fd3565b90506020028101906122a59190614fe7565b6122b6906060810190604001614d18565b6040516020016122cc9796959493929190615518565b60408051601f1981840301815291905291506001016121ae565b6122ee61393d565b610f7581613988565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561237d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123a491908101906153f1565b91509150806123c657604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612409573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242d9190614f48565b825114612453578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b03161561248f576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f8061249e84604001516139f6565b915091508187146124c55760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f805160206158a6833981519152906001600160401b039081169083161115612582575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26125a1565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f805160206158a6833981519152816125c586613be7565b90506125d0866122f7565b6125df57600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461260457336112ab565b5f86815260048301602052604090205460a082015161263391600160b01b90046001600160401b031690615581565b6001600160401b03168160c001516001600160401b0316101561267a5760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f85156126925761268b8786612332565b90506126b0565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906126d5906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561274b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061276f9190614f48565b905080846007015f8a81526020019081526020015f205f82825461279391906152a8565b90915550501515979650505050505050565b5f805160206158e68339815191528054600119016127d657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127e5614b74565b5f805160206158c68339815191525f806128016114fa87611e69565b91509150801561282857604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561285957612859614d96565b600581111561286a5761286a614d96565b815260200160018201805461287e90614ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546128aa90614ef6565b80156128f55780601f106128cc576101008083540402835291602001916128f5565b820191905f5260205f20905b8154815290600101906020018083116128d857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561296057612960614d96565b14158015612981575060018151600581111561297e5761297e614d96565b14155b156129a257805160405163170cc93360e21b81526106319190600401614f28565b6003815160058111156129b7576129b7614d96565b036129c557600481526129ca565b600581525b8360080181602001516040516129e09190615184565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a2457612a24614d96565b021790555060208201516001820190612a3d90826151d9565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ae357612ae3614d96565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612b66575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613ecb565b60015f805160206158e683398151915255565b5f8181525f805160206158868339815191526020526040808220815160e0810190925280545f805160206158a683398151915293929190829060ff166003811115612beb57612beb614d96565b6003811115612bfc57612bfc614d96565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612d2a575f84815260048701602052604090205461271090612cdc90600160a01b900461ffff1685615316565b612ce691906152dd565b915081866007015f8681526020019081526020015f205f828254612d0a91906152a8565b90915550612d1a905082846154c3565b9050612d2a856020015182612b1a565b612d3f8560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612dbc57835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e0b57612dd38160016154c3565b612dde906008615316565b61ffff16868281518110612df457612df4614fd3565b016020015160f81c901b9190911790600101612dbf565b5061ffff811615612e355760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612e9057612e4c8160036154c3565b612e57906008615316565b63ffffffff1687612e698360026152a8565b81518110612e7957612e79614fd3565b016020015160f81c901b9190911790600101612e38565b5063ffffffff8116600314612eb857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f0d57612ecf81601f6154c3565b612eda906008615316565b88612ee68360066152a8565b81518110612ef657612ef6614fd3565b016020015160f81c901b9190911790600101612ebb565b505f805b6008811015612f6c57612f258160076154c3565b612f30906008615316565b6001600160401b031689612f458360266152a8565b81518110612f5557612f55614fd3565b016020015160f81c901b9190911790600101612f11565b505f805b6008811015612fcb57612f848160076154c3565b612f8f906008615316565b6001600160401b03168a612fa483602e6152a8565b81518110612fb457612fb4614fd3565b016020015160f81c901b9190911790600101612f70565b5091989097509095509350505050565b5f80825160271461301157825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b6002811015613060576130288160016154c3565b613033906008615316565b61ffff1685828151811061304957613049614fd3565b016020015160f81c901b9190911790600101613014565b5061ffff81161561308a5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b60048110156130e5576130a18160036154c3565b6130ac906008615316565b63ffffffff16866130be8360026152a8565b815181106130ce576130ce614fd3565b016020015160f81c901b919091179060010161308d565b5063ffffffff811660021461310d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131625761312481601f6154c3565b61312f906008615316565b8761313b8360066152a8565b8151811061314b5761314b614fd3565b016020015160f81c901b9190911790600101613110565b505f8660268151811061317757613177614fd3565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206158a683398151915290600160401b900461ffff90811690861610806131eb575061271061ffff8616115b1561320f57604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b03908116908516101561324b576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b805483108061325d5750806001015483115b1561327e5760405163222d164360e21b815260048101849052602401610631565b825f61328982610e95565b90505f6132968983613f5e565b905060405180608001604052806132aa3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f805160206158a68339815191528161337e84610e95565b90505f61338a876119f2565b9050613395876122f7565b6133b5576040516330efa98b60e01b815260048101889052602401610631565b6002815160058111156133ca576133ca614d96565b146133eb57805160405163170cc93360e21b81526106319190600401614f28565b5f8282608001516133fc9190615581565b905083600201600a9054906101000a90046001600160401b0316826040015161342591906155a1565b6001600160401b0316816001600160401b0316111561346257604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f8061346e8a8461363a565b915091505f8a8360405160200161349c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561352f5761352f614d96565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615906833981519152602052604081206002015481905f805160206158c683398151915290600160801b90046001600160401b031661368285826144b1565b5f61368c8761468b565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136dc8a858b611e1a565b6040518263ffffffff1660e01b81526004016136f89190614f36565b6020604051808303815f875af1158015613714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137389190614f48565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f805160206158a683398151915290505f6137b184604001516119f2565b90505f6003825160058111156137c9576137c9614d96565b14806137e757506004825160058111156137e5576137e5614d96565b145b156137f7575060c0810151613834565b60028251600581111561380c5761380c614d96565b03613818575042613834565b815160405163170cc93360e21b81526106319190600401614f28565b84608001516001600160401b0316816001600160401b03161161385b57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613880906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613910573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139349190614f48565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661398657604051631afcd79f60e31b815260040160405180910390fd5b565b61399061393d565b61399981614700565b6139a1614719565b610f75606082013560808301356139be60c0850160a08601614d18565b6139ce60e0860160c087016155cc565b6139df610100870160e088016155e5565b6139f161012088016101008901614f73565b614729565b5f808251602e14613a2c57825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613a7b57613a438160016154c3565b613a4e906008615316565b61ffff16858281518110613a6457613a64614fd3565b016020015160f81c901b9190911790600101613a2f565b5061ffff811615613aa55760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b0057613abc8160036154c3565b613ac7906008615316565b63ffffffff1686613ad98360026152a8565b81518110613ae957613ae9614fd3565b016020015160f81c901b9190911790600101613aa8565b5063ffffffff811615613b2657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b7b57613b3d81601f6154c3565b613b48906008615316565b87613b548360066152a8565b81518110613b6457613b64614fd3565b016020015160f81c901b9190911790600101613b29565b505f805b6008811015613bda57613b938160076154c3565b613b9e906008615316565b6001600160401b031688613bb38360266152a8565b81518110613bc357613bc3614fd3565b016020015160f81c901b9190911790600101613b7f565b5090969095509350505050565b613bef614b74565b5f8281525f805160206159068339815191526020526040808220815160e0810190925280545f805160206158c683398151915293929190829060ff166005811115613c3c57613c3c614d96565b6005811115613c4d57613c4d614d96565b8152602001600182018054613c6190614ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054613c8d90614ef6565b8015613cd85780601f10613caf57610100808354040283529160200191613cd8565b820191905f5260205f20905b815481529060010190602001808311613cbb57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d4657613d46614d96565b14613d79575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f28565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613dbd57613dbd614d96565b021790555060208201516001820190613dd690826151d9565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e74858261363a565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613eee5760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f37576040519150601f19603f3d011682016040523d82523d5f602084013e613f3c565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fa257604051637fab81e560e01b815260040160405180910390fd5b5f805160206158c683398151915242613fc16060860160408701614d18565b6001600160401b0316111580613ffb5750613fdf6202a300426152a8565b613fef6060860160408701614d18565b6001600160401b031610155b15614035576140106060850160408601614d18565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b603061404460208601866154d6565b9050146140765761405860208501856154d6565b6040516326475b2f60e11b8152610631925060040190815260200190565b61408084806154d6565b90505f036140ad5761409284806154d6565b604051633e08a12560e11b8152600401610631929190615605565b5f600882016140bc86806154d6565b6040516140ca9291906153b7565b90815260200160405180910390205414614103576140e884806154d6565b60405163a41f772f60e01b8152600401610631929190615605565b61410d835f6144b1565b6040805160e08101909152815481525f908190614219906020810161413289806154d6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061417a908a018a6154d6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016141c360608a0160408b01614d18565b6001600160401b031681526020016141de60608a018a615633565b6141e790615647565b81526020016141f960808a018a615633565b61420290615647565b8152602001876001600160401b0316815250614858565b5f8281526006860160205260409020919350915061423782826151d9565b50816008840161424788806154d6565b6040516142559291906153b7565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614291908590600401614f36565b6020604051808303815f875af11580156142ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142d19190614f48565b6040805160e0810190915290915080600181526020016142f189806154d6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561438057614380614d96565b02179055506020820151600182019061439990826151d9565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061443788806154d6565b6040516144459291906153b7565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144839190614d18565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f805160206158c68339815191525f6001600160401b0380841690851611156144e5576144de83856153c6565b90506144f2565b6144ef84846153c6565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614554575060018401548151614550916001600160401b0316906152a8565b8210155b1561457a576001600160401b038316606082015281815260408101516020820152614599565b828160600181815161458c9190615581565b6001600160401b03169052505b60608101516145a99060646155a1565b602082015160018601546001600160401b0392909216916145d49190600160401b900460ff16615316565b101561460457606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b03168160400181815161461f91906152a8565b9052506040810180516001600160401b038716919061463f9083906154c3565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206159068339815191526020526040812060020180545f805160206158c683398151915291906008906146d590600160401b90046001600160401b031661570e565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61470861393d565b614710614a45565b610f7581614a4d565b61472161393d565b613986614b35565b61473161393d565b5f805160206158a683398151915261ffff84161580614755575061271061ffff8516115b1561477957604051635f12e6c360e11b815261ffff85166004820152602401610631565b8587111561479d5760405163222d164360e21b815260048101889052602401610631565b60ff831615806147b05750600a60ff8416115b156147d35760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260400151516030146148815760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986148c2988a986001989297929690959094909390929101615729565b60405160208183030381529060405290505f5b846080015160200151518110156149345781856080015160200151828151811061490157614901614fd3565b602002602001015160405160200161491a9291906157e3565b60408051601f1981840301815291905291506001016148d5565b5060a0840151805160209182015151604051614954938593929101615819565b60405160208183030381529060405290505f5b8460a0015160200151518110156149c657818560a0015160200151828151811061499357614993614fd3565b60200260200101516040516020016149ac9291906157e3565b60408051601f198184030181529190529150600101614967565b5060c08401516040516149dd918391602001615854565b60405160208183030381529060405290506002816040516149fe9190615184565b602060405180830381855afa158015614a19573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a3c9190614f48565b94909350915050565b61398661393d565b614a5561393d565b80355f805160206158c68339815191529081556014614a7a60608401604085016155e5565b60ff161180614a995750614a9460608301604084016155e5565b60ff16155b15614acd57614aae60608301604084016155e5565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614add60608301604084016155e5565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614b0e6040830160208401614d18565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b8b61393d565b508054614b4990614ef6565b5f825580601f10614b58575050565b601f0160209004905f5260205f2090810190610f759190614bb1565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614bc5575f8155600101614bb2565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614bfb575f80fd5b833592506020840135614c0d81614bc9565b9150614c1b60408501614bd6565b90509250925092565b5f60208284031215614c34575f80fd5b5035919050565b5f8060408385031215614c4c575f80fd5b82356001600160401b03811115614c61575f80fd5b830160808186031215614c72575f80fd5b9150614c8060208401614bd6565b90509250929050565b5f6101208284031215614c9a575f80fd5b50919050565b5f8060408385031215614cb1575f80fd5b82359150614c8060208401614bd6565b5f60208284031215614cd1575f80fd5b61169482614bd6565b5f8060408385031215614ceb575f80fd5b614cf483614bd6565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614d28575f80fd5b61169482614d02565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614d54575f80fd5b83356001600160401b03811115614d69575f80fd5b840160a08187031215614d7a575f80fd5b9250614d8860208501614d31565b9150614c1b60408501614d02565b634e487b7160e01b5f52602160045260245ffd5b60068110614dba57614dba614d96565b9052565b5f5b83811015614dd8578181015183820152602001614dc0565b50505f910152565b5f8151808452614df7816020860160208601614dbe565b601f01601f19169290920160200192915050565b60208152614e1d602082018351614daa565b5f602083015160e06040840152614e38610100840182614de0565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215614e9c575f80fd5b82356001600160401b0380821115614eb2575f80fd5b818501915085601f830112614ec5575f80fd5b813581811115614ed3575f80fd5b866020828501011115614ee4575f80fd5b60209290920196919550909350505050565b600181811c90821680614f0a57607f821691505b602082108103614c9a57634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614daa565b602081525f6116946020830184614de0565b5f60208284031215614f58575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f60208284031215614f83575f80fd5b813561169481614f5f565b5f808335601e19843603018112614fa3575f80fd5b8301803591506001600160401b03821115614fbc575f80fd5b6020019150600581901b360382131561378a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614ffb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561503b5761503b615005565b60405290565b604080519081016001600160401b038111828210171561503b5761503b615005565b604051601f8201601f191681016001600160401b038111828210171561508b5761508b615005565b604052919050565b5f6001600160401b038211156150ab576150ab615005565b50601f01601f191660200190565b5f82601f8301126150c8575f80fd5b81356150db6150d682615093565b615063565b8181528460208386010111156150ef575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561511b575f80fd5b615123615019565b82356001600160401b0380821115615139575f80fd5b615145368387016150b9565b8352602085013591508082111561515a575f80fd5b50615167368286016150b9565b60208301525061517960408401614d02565b604082015292915050565b5f8251614ffb818460208701614dbe565b601f82111561063a57805f5260205f20601f840160051c810160208510156151ba5750805b601f840160051c820191505b8181101561187d575f81556001016151c6565b81516001600160401b038111156151f2576151f2615005565b615206816152008454614ef6565b84615195565b602080601f831160018114615239575f84156152225750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b8281101561526757888601518255948401946001909101908401615248565b508582101561528457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea5615294565b5f63ffffffff8083168181036152d3576152d3615294565b6001019392505050565b5f826152f757634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061531057615310614d96565b91905290565b8082028115828204841417610ea557610ea5615294565b5f60208083525f845461533f81614ef6565b806020870152604060018084165f8114615360576001811461537c576153a9565b60ff19851660408a0152604084151560051b8a010195506153a9565b895f5260205f205f5b858110156153a05781548b8201860152908301908801615385565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611f7857611f78615294565b80516119ed81614bc9565b5f8060408385031215615402575f80fd5b82516001600160401b0380821115615418575f80fd5b908401906060828703121561542b575f80fd5b615433615019565b8251815260208084015161544681614f5f565b8282015260408401518381111561545b575f80fd5b80850194505087601f85011261546f575f80fd5b8351925061547f6150d684615093565b8381528882858701011115615492575f80fd5b6154a184838301848801614dbe565b806040840152508195506154b68188016153e6565b9450505050509250929050565b81810381811115610ea557610ea5615294565b5f808335601e198436030181126154eb575f80fd5b8301803591506001600160401b03821115615504575f80fd5b60200191503681900382131561378a575f80fd5b5f8851615529818460208d01614dbe565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611f7857611f78615294565b6001600160401b038181168382160280821691908281146155c4576155c4615294565b505092915050565b5f602082840312156155dc575f80fd5b61169482614d31565b5f602082840312156155f5575f80fd5b813560ff81168114611694575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f8235603e19833603018112614ffb575f80fd5b5f60408236031215615657575f80fd5b61565f615041565b61566883614bd6565b81526020808401356001600160401b0380821115615684575f80fd5b9085019036601f830112615696575f80fd5b8135818111156156a8576156a8615005565b8060051b91506156b9848301615063565b81815291830184019184810190368411156156d2575f80fd5b938501935b838510156156fc57843592506156ec83614f5f565b82825293850193908501906156d7565b94860194909452509295945050505050565b5f6001600160401b038083168181036152d3576152d3615294565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161576f81602a850160208b01614dbe565b86519083019061578681602a840160208b01614dbe565b60c087901b6001600160c01b031916602a92909101918201526157b8603282018660e01b6001600160e01b0319169052565b6157d1603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516157f4818460208801614dbe565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f845161582a818460208901614dbe565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615865818460208801614dbe565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 4bc8229d1..dad6a49ad 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\":\"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\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b506040516138a63803806138a683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6137598061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612b01565b610312565b005b610149610159366004612b30565b610529565b61014961016c366004612b7e565b610a15565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612b01565b610a23565b6040516001600160401b03909116815260200161018a565b610149610a37565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612b01565b610a4a565b6101cd61025a366004612bad565b610a5f565b61014961026d366004612b7e565b610a7b565b6102216005600160991b0181565b6101cd5f8051602061370d83398151915281565b6101496102a2366004612b01565b610c04565b6101e3601481565b6101496102bd366004612c06565b610d41565b6102d56102d0366004612b01565b610e4f565b60405161018a9190612cc3565b6101a66202a30081565b6101496102fa366004612d43565b610f9e565b6101cd61030d366004612d65565b610fdb565b5f8181525f8051602061372d8339815191526020526040808220815160e0810190925280545f8051602061370d83398151915293929190829060ff16600581111561035f5761035f612c42565b600581111561037057610370612c42565b815260200160018201805461038490612dd0565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612dd0565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612c42565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612e08565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f611036565b6040518263ffffffff1660e01b81526004016104e39190612e16565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612e28565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f8051602061370d8339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612e28565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612d43565b6001600160a01b03161461065f5761063a6060840160408501612d43565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612e3f565b905090505f805b828163ffffffff161015610955575f6106906060880188612e3f565b8363ffffffff168181106106a6576106a6612e84565b90506020028101906106b89190612e98565b6106c190612fbc565b80516040519192505f9160088801916106d991613035565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612e16565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261075291613035565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612e28565b90508086600801835f01516040516107a89190613035565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612c42565b0217905550602082015160018201906108439082613091565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e8911685613164565b82516040519195506108f991613035565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e90613177565b9050610674565b50600483018190555f61097361096a86611085565b6040015161119b565b90505f61097f87611328565b90505f6002826040516109929190613035565b602060405180830381855afa1580156109ad573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109d09190612e28565b90508281146109fc57604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a1e81611561565b505050565b5f610a2d82610e4f565b6080015192915050565b610a3f61189f565b610a485f6118fa565b565b610a5261189f565b610a5b8161196a565b5050565b5f610a6861189f565b610a728383611c4e565b90505b92915050565b5f8051602061370d8339815191525f80610aa0610a9785611085565b604001516121a1565b9150915080610ac657604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610ae090612dd0565b90505f03610b045760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b2a57610b2a612c42565b14610b5d575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612e08565b5f8281526006840160205260408120610b7591612a75565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f8051602061370d8339815191529190610c4b90612dd0565b90505f03610c6f5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610c9557610c95612c42565b14610cc8575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612e08565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d019190600401613199565b6020604051808303815f875af1158015610d1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1e9190612e28565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610d855750825b90505f826001600160401b03166001148015610da05750303b155b905081158015610dae575080155b15610dcc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610df657845460ff60401b1916600160401b1785555b610e00878761235d565b8315610e4657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e57612aac565b5f8281525f8051602061372d833981519152602052604090819020815160e0810190925280545f8051602061370d833981519152929190829060ff166005811115610ea457610ea4612c42565b6005811115610eb557610eb5612c42565b8152602001600182018054610ec990612dd0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef590612dd0565b8015610f405780601f10610f1757610100808354040283529160200191610f40565b820191905f5260205f20905b815481529060010190602001808311610f2357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fa661189f565b6001600160a01b038116610fcf57604051631e4fbdf760e01b81525f6004820152602401610499565b610fd8816118fa565b50565b6040515f905f8051602061370d833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb089061101e9086908690613223565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156110e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526111109190810190613241565b915091508061113257604051636b2f19e960e01b815260040160405180910390fd5b815115611158578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b031615611194576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f81516026146111d057815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b600281101561121f576111e7816001613313565b6111f2906008613326565b61ffff1684828151811061120857611208612e84565b016020015160f81c901b91909117906001016111d3565b5061ffff8116156112495760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112a457611260816003613313565b61126b906008613326565b63ffffffff168561127d836002613164565b8151811061128d5761128d612e84565b016020015160f81c901b919091179060010161124c565b5063ffffffff8116156112ca57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561131f576112e181601f613313565b6112ec906008613326565b866112f8836006613164565b8151811061130857611308612e84565b016020015160f81c901b91909117906001016112cd565b50949350505050565b60605f8083356020850135601461134487870160408901612d43565b6113516060890189612e3f565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6113d76060850185612e3f565b9050811015611194576113ed6060850185612e3f565b828181106113fd576113fd612e84565b905060200281019061140f9190612e98565b61141d90602081019061333d565b905060301461143f5760405163180ffa0d60e01b815260040160405180910390fd5b8161144d6060860186612e3f565b8381811061145d5761145d612e84565b905060200281019061146f9190612e98565b611479908061333d565b90506114886060870187612e3f565b8481811061149857611498612e84565b90506020028101906114aa9190612e98565b6114b4908061333d565b6114c16060890189612e3f565b868181106114d1576114d1612e84565b90506020028101906114e39190612e98565b6114f190602081019061333d565b6114fe60608b018b612e3f565b8881811061150e5761150e612e84565b90506020028101906115209190612e98565b61153190606081019060400161337f565b6040516020016115479796959493929190613398565b60408051601f1981840301815291905291506001016113ca565b5f61156a612aac565b5f8051602061370d8339815191525f80611586610a9787611085565b9150915080156115ad57604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156115de576115de612c42565b60058111156115ef576115ef612c42565b815260200160018201805461160390612dd0565b80601f016020809104026020016040519081016040528092919081815260200182805461162f90612dd0565b801561167a5780601f106116515761010080835404028352916020019161167a565b820191905f5260205f20905b81548152906001019060200180831161165d57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156116e5576116e5612c42565b14158015611706575060018151600581111561170357611703612c42565b14155b1561172757805160405163170cc93360e21b81526104999190600401612e08565b60038151600581111561173c5761173c612c42565b0361174a576004815261174f565b600581525b8360080181602001516040516117659190613035565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156117a9576117a9612c42565b0217905550602082015160018201906117c29082613091565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561186857611868612c42565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118d17f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a485760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611972612aac565b5f8281525f8051602061372d8339815191526020526040808220815160e0810190925280545f8051602061370d83398151915293929190829060ff1660058111156119bf576119bf612c42565b60058111156119d0576119d0612c42565b81526020016001820180546119e490612dd0565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1090612dd0565b8015611a5b5780601f10611a3257610100808354040283529160200191611a5b565b820191905f5260205f20905b815481529060010190602001808311611a3e57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611ac957611ac9612c42565b14611afc575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612e08565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611b4057611b40612c42565b021790555060208201516001820190611b599082613091565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611bf78582612377565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611c9257604051637fab81e560e01b815260040160405180910390fd5b5f8051602061370d83398151915242611cb1606086016040870161337f565b6001600160401b0316111580611ceb5750611ccf6202a30042613164565b611cdf606086016040870161337f565b6001600160401b031610155b15611d2557611d00606085016040860161337f565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b6030611d34602086018661333d565b905014611d6657611d48602085018561333d565b6040516326475b2f60e11b8152610499925060040190815260200190565b611d70848061333d565b90505f03611d9d57611d82848061333d565b604051633e08a12560e11b8152600401610499929190613401565b5f60088201611dac868061333d565b604051611dba929190613223565b90815260200160405180910390205414611df357611dd8848061333d565b60405163a41f772f60e01b8152600401610499929190613401565b611dfd835f6124ce565b6040805160e08101909152815481525f908190611f099060208101611e22898061333d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611e6a908a018a61333d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611eb360608a0160408b0161337f565b6001600160401b03168152602001611ece60608a018a61342f565b611ed790613443565b8152602001611ee960808a018a61342f565b611ef290613443565b8152602001876001600160401b03168152506126a8565b5f82815260068601602052604090209193509150611f278282613091565b508160088401611f37888061333d565b604051611f45929190613223565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611f81908590600401612e16565b6020604051808303815f875af1158015611f9d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611fc19190612e28565b6040805160e081019091529091508060018152602001611fe1898061333d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561207057612070612c42565b0217905550602082015160018201906120899082613091565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580612127888061333d565b604051612135929190613223565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b6040016020810190612173919061337f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f8082516027146121d757825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b6002811015612226576121ee816001613313565b6121f9906008613326565b61ffff1685828151811061220f5761220f612e84565b016020015160f81c901b91909117906001016121da565b5061ffff8116156122505760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156122ab57612267816003613313565b612272906008613326565b63ffffffff1686612284836002613164565b8151811061229457612294612e84565b016020015160f81c901b9190911790600101612253565b5063ffffffff81166002146122d357604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612328576122ea81601f613313565b6122f5906008613326565b87612301836006613164565b8151811061231157612311612e84565b016020015160f81c901b91909117906001016122d6565b505f8660268151811061233d5761233d612e84565b016020015191976001600160f81b03199092161515965090945050505050565b612365612895565b61236e826128de565b610a5b816128f7565b5f8281525f8051602061372d833981519152602052604081206002015481905f8051602061370d83398151915290600160801b90046001600160401b03166123bf85826124ce565b5f6123c987612908565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6124198a858b611036565b6040518263ffffffff1660e01b81526004016124359190612e16565b6020604051808303815f875af1158015612451573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124759190612e28565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f8051602061370d8339815191525f6001600160401b038084169085161115612502576124fb838561350a565b905061250f565b61250c848461350a565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061257157506001840154815161256d916001600160401b031690613164565b8210155b15612597576001600160401b0383166060820152818152604081015160208201526125b6565b82816060018181516125a9919061352a565b6001600160401b03169052505b60608101516125c690606461354a565b602082015160018601546001600160401b0392909216916125f19190600160401b900460ff16613326565b101561262157606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b03168160400181815161263c9190613164565b9052506040810180516001600160401b038716919061265c908390613313565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146126d15760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98612712988a986001989297929690959094909390929101613575565b60405160208183030381529060405290505f5b846080015160200151518110156127845781856080015160200151828151811061275157612751612e84565b602002602001015160405160200161276a92919061362f565b60408051601f198184030181529190529150600101612725565b5060a08401518051602091820151516040516127a4938593929101613665565b60405160208183030381529060405290505f5b8460a00151602001515181101561281657818560a001516020015182815181106127e3576127e3612e84565b60200260200101516040516020016127fc92919061362f565b60408051601f1981840301815291905291506001016127b7565b5060c084015160405161282d9183916020016136a0565b604051602081830303815290604052905060028160405161284e9190613035565b602060405180830381855afa158015612869573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061288c9190612e28565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a4857604051631afcd79f60e31b815260040160405180910390fd5b6128e6612895565b6128ee61297d565b610fd881612985565b6128ff612895565b610fd881612a6d565b5f8181525f8051602061372d8339815191526020526040812060020180545f8051602061370d833981519152919060089061295290600160401b90046001600160401b03166136d1565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a48612895565b61298d612895565b80355f8051602061370d83398151915290815560146129b260608401604085016136ec565b60ff1611806129d157506129cc60608301604084016136ec565b60ff16155b15612a05576129e660608301604084016136ec565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b612a1560608301604084016136ec565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055612a46604083016020840161337f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fa6612895565b508054612a8190612dd0565b5f825580601f10612a90575050565b601f0160209004905f5260205f2090810190610fd89190612ae9565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612afd575f8155600101612aea565b5090565b5f60208284031215612b11575f80fd5b5035919050565b803563ffffffff81168114612b2b575f80fd5b919050565b5f8060408385031215612b41575f80fd5b82356001600160401b03811115612b56575f80fd5b830160808186031215612b67575f80fd5b9150612b7560208401612b18565b90509250929050565b5f60208284031215612b8e575f80fd5b610a7282612b18565b80356001600160401b0381168114612b2b575f80fd5b5f8060408385031215612bbe575f80fd5b82356001600160401b03811115612bd3575f80fd5b830160a08186031215612be4575f80fd5b9150612b7560208401612b97565b6001600160a01b0381168114610fd8575f80fd5b5f808284036080811215612c18575f80fd5b6060811215612c25575f80fd5b508291506060830135612c3781612bf2565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612c7257634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612c90578181015183820152602001612c78565b50505f910152565b5f8151808452612caf816020860160208601612c76565b601f01601f19169290920160200192915050565b60208152612cd5602082018351612c56565b5f602083015160e06040840152612cf0610100840182612c98565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612d53575f80fd5b8135612d5e81612bf2565b9392505050565b5f8060208385031215612d76575f80fd5b82356001600160401b0380821115612d8c575f80fd5b818501915085601f830112612d9f575f80fd5b813581811115612dad575f80fd5b866020828501011115612dbe575f80fd5b60209290920196919550909350505050565b600181811c90821680612de457607f821691505b602082108103612e0257634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610a758284612c56565b602081525f610a726020830184612c98565b5f60208284031215612e38575f80fd5b5051919050565b5f808335601e19843603018112612e54575f80fd5b8301803591506001600160401b03821115612e6d575f80fd5b6020019150600581901b36038213156124c7575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612eac575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612eec57612eec612eb6565b60405290565b604080519081016001600160401b0381118282101715612eec57612eec612eb6565b604051601f8201601f191681016001600160401b0381118282101715612f3c57612f3c612eb6565b604052919050565b5f6001600160401b03821115612f5c57612f5c612eb6565b50601f01601f191660200190565b5f82601f830112612f79575f80fd5b8135612f8c612f8782612f44565b612f14565b818152846020838601011115612fa0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215612fcc575f80fd5b612fd4612eca565b82356001600160401b0380821115612fea575f80fd5b612ff636838701612f6a565b8352602085013591508082111561300b575f80fd5b5061301836828601612f6a565b60208301525061302a60408401612b97565b604082015292915050565b5f8251612eac818460208701612c76565b601f821115610a1e57805f5260205f20601f840160051c8101602085101561306b5750805b601f840160051c820191505b8181101561308a575f8155600101613077565b5050505050565b81516001600160401b038111156130aa576130aa612eb6565b6130be816130b88454612dd0565b84613046565b602080601f8311600181146130f1575f84156130da5750858301515b5f19600386901b1c1916600185901b178555613148565b5f85815260208120601f198616915b8281101561311f57888601518255948401946001909101908401613100565b508582101561313c57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a7557610a75613150565b5f63ffffffff80831681810361318f5761318f613150565b6001019392505050565b5f60208083525f84546131ab81612dd0565b806020870152604060018084165f81146131cc57600181146131e857613215565b60ff19851660408a0152604084151560051b8a01019550613215565b895f5260205f205f5b8581101561320c5781548b82018601529083019088016131f1565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612b2b575f80fd5b5f8060408385031215613252575f80fd5b82516001600160401b0380821115613268575f80fd5b908401906060828703121561327b575f80fd5b613283612eca565b8251815260208084015161329681612bf2565b828201526040840151838111156132ab575f80fd5b80850194505087601f8501126132bf575f80fd5b835192506132cf612f8784612f44565b83815288828587010111156132e2575f80fd5b6132f184838301848801612c76565b80604084015250819550613306818801613232565b9450505050509250929050565b81810381811115610a7557610a75613150565b8082028115828204841417610a7557610a75613150565b5f808335601e19843603018112613352575f80fd5b8301803591506001600160401b0382111561336b575f80fd5b6020019150368190038213156124c7575f80fd5b5f6020828403121561338f575f80fd5b610a7282612b97565b5f88516133a9818460208d01612c76565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f8235603e19833603018112612eac575f80fd5b5f60408236031215613453575f80fd5b61345b612ef2565b61346483612b18565b81526020808401356001600160401b0380821115613480575f80fd5b9085019036601f830112613492575f80fd5b8135818111156134a4576134a4612eb6565b8060051b91506134b5848301612f14565b81815291830184019184810190368411156134ce575f80fd5b938501935b838510156134f857843592506134e883612bf2565b82825293850193908501906134d3565b94860194909452509295945050505050565b6001600160401b0382811682821603908082111561119457611194613150565b6001600160401b0381811683821601908082111561119457611194613150565b6001600160401b0381811683821602808216919082811461356d5761356d613150565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516135bb81602a850160208b01612c76565b8651908301906135d281602a840160208b01612c76565b60c087901b6001600160c01b031916602a9290910191820152613604603282018660e01b6001600160e01b0319169052565b61361d603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351613640818460208801612c76565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451613676818460208901612c76565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516136b1818460208801612c76565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b0380831681810361318f5761318f613150565b5f602082840312156136fc575f80fd5b813560ff81168114612d5e575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b5060405161384738038061384783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6136fa8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612aa2565b610312565b005b610149610159366004612ad1565b610529565b61014961016c366004612b1f565b610a15565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612aa2565b610a23565b6040516001600160401b03909116815260200161018a565b610149610a37565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612aa2565b610a4a565b6101cd61025a366004612b4e565b610a5f565b61014961026d366004612b1f565b610a7b565b6102216005600160991b0181565b6101cd5f805160206136ae83398151915281565b6101496102a2366004612aa2565b610c04565b6101e3601481565b6101496102bd366004612ba7565b610d41565b6102d56102d0366004612aa2565b610e4f565b60405161018a9190612c64565b6101a66202a30081565b6101496102fa366004612ce4565b610f9e565b6101cd61030d366004612d06565b610fdb565b5f8181525f805160206136ce8339815191526020526040808220815160e0810190925280545f805160206136ae83398151915293929190829060ff16600581111561035f5761035f612be3565b600581111561037057610370612be3565b815260200160018201805461038490612d71565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612d71565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612be3565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612da9565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f611036565b6040518263ffffffff1660e01b81526004016104e39190612db7565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612dc9565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206136ae8339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612dc9565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612ce4565b6001600160a01b03161461065f5761063a6060840160408501612ce4565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612de0565b905090505f805b828163ffffffff161015610955575f6106906060880188612de0565b8363ffffffff168181106106a6576106a6612e25565b90506020028101906106b89190612e39565b6106c190612f5d565b80516040519192505f9160088801916106d991612fd6565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612db7565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261075291612fd6565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612dc9565b90508086600801835f01516040516107a89190612fd6565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612be3565b0217905550602082015160018201906108439082613032565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e8911685613105565b82516040519195506108f991612fd6565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e90613118565b9050610674565b50600483018190555f61097361096a86611085565b6040015161119b565b90505f61097f87611328565b90505f6002826040516109929190612fd6565b602060405180830381855afa1580156109ad573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109d09190612dc9565b90508281146109fc57604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a1e81611502565b505050565b5f610a2d82610e4f565b6080015192915050565b610a3f611840565b610a485f61189b565b565b610a52611840565b610a5b8161190b565b5050565b5f610a68611840565b610a728383611bef565b90505b92915050565b5f805160206136ae8339815191525f80610aa0610a9785611085565b60400151612142565b9150915080610ac657604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610ae090612d71565b90505f03610b045760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b2a57610b2a612be3565b14610b5d575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612da9565b5f8281526006840160205260408120610b7591612a16565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206136ae8339815191529190610c4b90612d71565b90505f03610c6f5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610c9557610c95612be3565b14610cc8575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612da9565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d01919060040161313a565b6020604051808303815f875af1158015610d1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1e9190612dc9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610d855750825b90505f826001600160401b03166001148015610da05750303b155b905081158015610dae575080155b15610dcc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610df657845460ff60401b1916600160401b1785555b610e0087876122fe565b8315610e4657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e57612a4d565b5f8281525f805160206136ce833981519152602052604090819020815160e0810190925280545f805160206136ae833981519152929190829060ff166005811115610ea457610ea4612be3565b6005811115610eb557610eb5612be3565b8152602001600182018054610ec990612d71565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef590612d71565b8015610f405780601f10610f1757610100808354040283529160200191610f40565b820191905f5260205f20905b815481529060010190602001808311610f2357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fa6611840565b6001600160a01b038116610fcf57604051631e4fbdf760e01b81525f6004820152602401610499565b610fd88161189b565b50565b6040515f905f805160206136ae833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb089061101e90869086906131c4565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156110e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261111091908101906131e2565b915091508061113257604051636b2f19e960e01b815260040160405180910390fd5b815115611158578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b031615611194576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f81516026146111d057815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b600281101561121f576111e78160016132b4565b6111f29060086132c7565b61ffff1684828151811061120857611208612e25565b016020015160f81c901b91909117906001016111d3565b5061ffff8116156112495760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112a4576112608160036132b4565b61126b9060086132c7565b63ffffffff168561127d836002613105565b8151811061128d5761128d612e25565b016020015160f81c901b919091179060010161124c565b5063ffffffff8116156112ca57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561131f576112e181601f6132b4565b6112ec9060086132c7565b866112f8836006613105565b8151811061130857611308612e25565b016020015160f81c901b91909117906001016112cd565b50949350505050565b60605f8083356020850135601461134487870160408901612ce4565b6113516060890189612de0565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6113d76060850185612de0565b905081101561119457816113ee6060860186612de0565b838181106113fe576113fe612e25565b90506020028101906114109190612e39565b61141a90806132de565b90506114296060870187612de0565b8481811061143957611439612e25565b905060200281019061144b9190612e39565b61145590806132de565b6114626060890189612de0565b8681811061147257611472612e25565b90506020028101906114849190612e39565b6114929060208101906132de565b61149f60608b018b612de0565b888181106114af576114af612e25565b90506020028101906114c19190612e39565b6114d2906060810190604001613320565b6040516020016114e89796959493929190613339565b60408051601f1981840301815291905291506001016113ca565b5f61150b612a4d565b5f805160206136ae8339815191525f80611527610a9787611085565b91509150801561154e57604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561157f5761157f612be3565b600581111561159057611590612be3565b81526020016001820180546115a490612d71565b80601f01602080910402602001604051908101604052809291908181526020018280546115d090612d71565b801561161b5780601f106115f25761010080835404028352916020019161161b565b820191905f5260205f20905b8154815290600101906020018083116115fe57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561168657611686612be3565b141580156116a757506001815160058111156116a4576116a4612be3565b14155b156116c857805160405163170cc93360e21b81526104999190600401612da9565b6003815160058111156116dd576116dd612be3565b036116eb57600481526116f0565b600581525b8360080181602001516040516117069190612fd6565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561174a5761174a612be3565b0217905550602082015160018201906117639082613032565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561180957611809612be3565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118727f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a485760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611913612a4d565b5f8281525f805160206136ce8339815191526020526040808220815160e0810190925280545f805160206136ae83398151915293929190829060ff16600581111561196057611960612be3565b600581111561197157611971612be3565b815260200160018201805461198590612d71565b80601f01602080910402602001604051908101604052809291908181526020018280546119b190612d71565b80156119fc5780601f106119d3576101008083540402835291602001916119fc565b820191905f5260205f20905b8154815290600101906020018083116119df57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611a6a57611a6a612be3565b14611a9d575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612da9565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611ae157611ae1612be3565b021790555060208201516001820190611afa9082613032565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611b988582612318565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611c3357604051637fab81e560e01b815260040160405180910390fd5b5f805160206136ae83398151915242611c526060860160408701613320565b6001600160401b0316111580611c8c5750611c706202a30042613105565b611c806060860160408701613320565b6001600160401b031610155b15611cc657611ca16060850160408601613320565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b6030611cd560208601866132de565b905014611d0757611ce960208501856132de565b6040516326475b2f60e11b8152610499925060040190815260200190565b611d1184806132de565b90505f03611d3e57611d2384806132de565b604051633e08a12560e11b81526004016104999291906133a2565b5f60088201611d4d86806132de565b604051611d5b9291906131c4565b90815260200160405180910390205414611d9457611d7984806132de565b60405163a41f772f60e01b81526004016104999291906133a2565b611d9e835f61246f565b6040805160e08101909152815481525f908190611eaa9060208101611dc389806132de565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611e0b908a018a6132de565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611e5460608a0160408b01613320565b6001600160401b03168152602001611e6f60608a018a6133d0565b611e78906133e4565b8152602001611e8a60808a018a6133d0565b611e93906133e4565b8152602001876001600160401b0316815250612649565b5f82815260068601602052604090209193509150611ec88282613032565b508160088401611ed888806132de565b604051611ee69291906131c4565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611f22908590600401612db7565b6020604051808303815f875af1158015611f3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f629190612dc9565b6040805160e081019091529091508060018152602001611f8289806132de565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561201157612011612be3565b02179055506020820151600182019061202a9082613032565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806120c888806132de565b6040516120d69291906131c4565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906121149190613320565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80825160271461217857825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b60028110156121c75761218f8160016132b4565b61219a9060086132c7565b61ffff168582815181106121b0576121b0612e25565b016020015160f81c901b919091179060010161217b565b5061ffff8116156121f15760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b600481101561224c576122088160036132b4565b6122139060086132c7565b63ffffffff1686612225836002613105565b8151811061223557612235612e25565b016020015160f81c901b91909117906001016121f4565b5063ffffffff811660021461227457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122c95761228b81601f6132b4565b6122969060086132c7565b876122a2836006613105565b815181106122b2576122b2612e25565b016020015160f81c901b9190911790600101612277565b505f866026815181106122de576122de612e25565b016020015191976001600160f81b03199092161515965090945050505050565b612306612836565b61230f8261287f565b610a5b81612898565b5f8281525f805160206136ce833981519152602052604081206002015481905f805160206136ae83398151915290600160801b90046001600160401b0316612360858261246f565b5f61236a876128a9565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123ba8a858b611036565b6040518263ffffffff1660e01b81526004016123d69190612db7565b6020604051808303815f875af11580156123f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124169190612dc9565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805160206136ae8339815191525f6001600160401b0380841690851611156124a35761249c83856134ab565b90506124b0565b6124ad84846134ab565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061251257506001840154815161250e916001600160401b031690613105565b8210155b15612538576001600160401b038316606082015281815260408101516020820152612557565b828160600181815161254a91906134cb565b6001600160401b03169052505b60608101516125679060646134eb565b602082015160018601546001600160401b0392909216916125929190600160401b900460ff166132c7565b10156125c257606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b0316816040018181516125dd9190613105565b9052506040810180516001600160401b03871691906125fd9083906132b4565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146126725760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986126b3988a986001989297929690959094909390929101613516565b60405160208183030381529060405290505f5b84608001516020015151811015612725578185608001516020015182815181106126f2576126f2612e25565b602002602001015160405160200161270b9291906135d0565b60408051601f1981840301815291905291506001016126c6565b5060a0840151805160209182015151604051612745938593929101613606565b60405160208183030381529060405290505f5b8460a0015160200151518110156127b757818560a0015160200151828151811061278457612784612e25565b602002602001015160405160200161279d9291906135d0565b60408051601f198184030181529190529150600101612758565b5060c08401516040516127ce918391602001613641565b60405160208183030381529060405290506002816040516127ef9190612fd6565b602060405180830381855afa15801561280a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061282d9190612dc9565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a4857604051631afcd79f60e31b815260040160405180910390fd5b612887612836565b61288f61291e565b610fd881612926565b6128a0612836565b610fd881612a0e565b5f8181525f805160206136ce8339815191526020526040812060020180545f805160206136ae83398151915291906008906128f390600160401b90046001600160401b0316613672565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a48612836565b61292e612836565b80355f805160206136ae8339815191529081556014612953606084016040850161368d565b60ff161180612972575061296d606083016040840161368d565b60ff16155b156129a657612987606083016040840161368d565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b6129b6606083016040840161368d565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556129e76040830160208401613320565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fa6612836565b508054612a2290612d71565b5f825580601f10612a31575050565b601f0160209004905f5260205f2090810190610fd89190612a8a565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612a9e575f8155600101612a8b565b5090565b5f60208284031215612ab2575f80fd5b5035919050565b803563ffffffff81168114612acc575f80fd5b919050565b5f8060408385031215612ae2575f80fd5b82356001600160401b03811115612af7575f80fd5b830160808186031215612b08575f80fd5b9150612b1660208401612ab9565b90509250929050565b5f60208284031215612b2f575f80fd5b610a7282612ab9565b80356001600160401b0381168114612acc575f80fd5b5f8060408385031215612b5f575f80fd5b82356001600160401b03811115612b74575f80fd5b830160a08186031215612b85575f80fd5b9150612b1660208401612b38565b6001600160a01b0381168114610fd8575f80fd5b5f808284036080811215612bb9575f80fd5b6060811215612bc6575f80fd5b508291506060830135612bd881612b93565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612c1357634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612c31578181015183820152602001612c19565b50505f910152565b5f8151808452612c50816020860160208601612c17565b601f01601f19169290920160200192915050565b60208152612c76602082018351612bf7565b5f602083015160e06040840152612c91610100840182612c39565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612cf4575f80fd5b8135612cff81612b93565b9392505050565b5f8060208385031215612d17575f80fd5b82356001600160401b0380821115612d2d575f80fd5b818501915085601f830112612d40575f80fd5b813581811115612d4e575f80fd5b866020828501011115612d5f575f80fd5b60209290920196919550909350505050565b600181811c90821680612d8557607f821691505b602082108103612da357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610a758284612bf7565b602081525f610a726020830184612c39565b5f60208284031215612dd9575f80fd5b5051919050565b5f808335601e19843603018112612df5575f80fd5b8301803591506001600160401b03821115612e0e575f80fd5b6020019150600581901b3603821315612468575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612e4d575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612e8d57612e8d612e57565b60405290565b604080519081016001600160401b0381118282101715612e8d57612e8d612e57565b604051601f8201601f191681016001600160401b0381118282101715612edd57612edd612e57565b604052919050565b5f6001600160401b03821115612efd57612efd612e57565b50601f01601f191660200190565b5f82601f830112612f1a575f80fd5b8135612f2d612f2882612ee5565b612eb5565b818152846020838601011115612f41575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215612f6d575f80fd5b612f75612e6b565b82356001600160401b0380821115612f8b575f80fd5b612f9736838701612f0b565b83526020850135915080821115612fac575f80fd5b50612fb936828601612f0b565b602083015250612fcb60408401612b38565b604082015292915050565b5f8251612e4d818460208701612c17565b601f821115610a1e57805f5260205f20601f840160051c8101602085101561300c5750805b601f840160051c820191505b8181101561302b575f8155600101613018565b5050505050565b81516001600160401b0381111561304b5761304b612e57565b61305f816130598454612d71565b84612fe7565b602080601f831160018114613092575f841561307b5750858301515b5f19600386901b1c1916600185901b1785556130e9565b5f85815260208120601f198616915b828110156130c0578886015182559484019460019091019084016130a1565b50858210156130dd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a7557610a756130f1565b5f63ffffffff808316818103613130576131306130f1565b6001019392505050565b5f60208083525f845461314c81612d71565b806020870152604060018084165f811461316d5760018114613189576131b6565b60ff19851660408a0152604084151560051b8a010195506131b6565b895f5260205f205f5b858110156131ad5781548b8201860152908301908801613192565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612acc575f80fd5b5f80604083850312156131f3575f80fd5b82516001600160401b0380821115613209575f80fd5b908401906060828703121561321c575f80fd5b613224612e6b565b8251815260208084015161323781612b93565b8282015260408401518381111561324c575f80fd5b80850194505087601f850112613260575f80fd5b83519250613270612f2884612ee5565b8381528882858701011115613283575f80fd5b61329284838301848801612c17565b806040840152508195506132a78188016131d3565b9450505050509250929050565b81810381811115610a7557610a756130f1565b8082028115828204841417610a7557610a756130f1565b5f808335601e198436030181126132f3575f80fd5b8301803591506001600160401b0382111561330c575f80fd5b602001915036819003821315612468575f80fd5b5f60208284031215613330575f80fd5b610a7282612b38565b5f885161334a818460208d01612c17565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f8235603e19833603018112612e4d575f80fd5b5f604082360312156133f4575f80fd5b6133fc612e93565b61340583612ab9565b81526020808401356001600160401b0380821115613421575f80fd5b9085019036601f830112613433575f80fd5b81358181111561344557613445612e57565b8060051b9150613456848301612eb5565b818152918301840191848101903684111561346f575f80fd5b938501935b83851015613499578435925061348983612b93565b8282529385019390850190613474565b94860194909452509295945050505050565b6001600160401b03828116828216039080821115611194576111946130f1565b6001600160401b03818116838216019080821115611194576111946130f1565b6001600160401b0381811683821602808216919082811461350e5761350e6130f1565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161355c81602a850160208b01612c17565b86519083019061357381602a840160208b01612c17565b60c087901b6001600160c01b031916602a92909101918201526135a5603282018660e01b6001600160e01b0319169052565b6135be603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516135e1818460208801612c17565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451613617818460208901612c17565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351613652818460208801612c17565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b03808316818103613130576131306130f1565b5f6020828403121561369d575f80fd5b813560ff81168114612cff575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // PoAValidatorManagerABI is the input ABI used to generate the binding from. From 9a962ed25a598cb52bbc60a5db116b4636084881 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 15:49:29 -0500 Subject: [PATCH 496/545] clarify stack too deep workaround --- contracts/validator-manager/ValidatorMessages.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 8a783494f..630c05bcb 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -257,6 +257,7 @@ library ValidatorMessages { /** * @notice Unpacks a byte array as a RegisterSubnetValidatorMessage message. * The message format specification is the same as the one used in above for packing. + * @dev Individual fields are unpacked in their own scopes to avoid stack too deep errors. * * @param input The byte array to unpack. * @return the unpacked ValidationPeriod. From f49fe5f1ec06bca6746f45f978fb7f7b6d170037 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 15:50:12 -0500 Subject: [PATCH 497/545] clarify stack too deep workaround - round 2 --- contracts/validator-manager/ValidatorMessages.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/validator-manager/ValidatorMessages.sol b/contracts/validator-manager/ValidatorMessages.sol index 630c05bcb..272edf795 100644 --- a/contracts/validator-manager/ValidatorMessages.sol +++ b/contracts/validator-manager/ValidatorMessages.sol @@ -257,7 +257,6 @@ library ValidatorMessages { /** * @notice Unpacks a byte array as a RegisterSubnetValidatorMessage message. * The message format specification is the same as the one used in above for packing. - * @dev Individual fields are unpacked in their own scopes to avoid stack too deep errors. * * @param input The byte array to unpack. * @return the unpacked ValidationPeriod. @@ -271,6 +270,7 @@ library ValidatorMessages { ValidationPeriod memory validation; // Unpack the codec ID + // Individual fields are unpacked in their own scopes to avoid stack too deep errors. { uint16 codecID; for (uint256 i; i < 2; ++i) { From 6ec27ccd47b8ee39a383f7bcc66447a9841da85d Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Thu, 10 Oct 2024 16:10:10 -0500 Subject: [PATCH 498/545] lint --- tests/flows/validator-manager/erc20_token_staking.go | 2 +- tests/utils/validator_manager.go | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/flows/validator-manager/erc20_token_staking.go b/tests/flows/validator-manager/erc20_token_staking.go index 71292725f..7b34c9a06 100644 --- a/tests/flows/validator-manager/erc20_token_staking.go +++ b/tests/flows/validator-manager/erc20_token_staking.go @@ -162,7 +162,7 @@ func ERC20TokenStakingManager(network interfaces.LocalNetwork) { weights[len(nodes)-1:], ) - // Delisting an initial validator does not work due to the way Warp signatures are requested for inital validators + // Delisting an initial validator does not work due to the way Warp signatures are requested for initial validators // // Delist one initial validators // diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 0dcac85b1..867fca929 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -824,7 +824,6 @@ func InitializeAndCompleteERC20ValidatorRegistration( expiry uint64, node Node, ) ids.ID { - // Initiate validator registration var receipt *types.Receipt receipt, validationID := InitializeERC20ValidatorRegistration( From 6f73651458936e7124449cdbf27856312ff077c3 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 11 Oct 2024 16:03:02 -0500 Subject: [PATCH 499/545] remove teleporter from local network interface --- tests/flows/teleporter/add_fee_amount.go | 37 +- tests/flows/teleporter/basic_send_receive.go | 22 +- .../deliver_to_nonexistent_contract.go | 17 +- .../teleporter/deliver_to_wrong_chain.go | 11 +- tests/flows/teleporter/insufficient_gas.go | 15 +- .../registry/check_upgrade_access.go | 5 +- .../teleporter/registry/pause_teleporter.go | 10 +- .../registry/teleporter_registry.go | 42 +- tests/flows/teleporter/relay_message_twice.go | 10 +- .../teleporter/relayer_modifies_message.go | 12 +- .../teleporter/resubmit_altered_message.go | 12 +- .../teleporter/retry_successful_execution.go | 14 +- .../teleporter/send_specific_receipts.go | 54 +- .../teleporter/teleporter_message_ids.go | 11 +- tests/flows/teleporter/unallowed_relayer.go | 8 +- tests/flows/teleporter/validator_churn.go | 15 +- tests/interfaces/local_network.go | 14 - tests/interfaces/network.go | 20 - tests/interfaces/subnet_test_info.go | 22 +- tests/local/network.go | 217 +---- .../local/teleporter/teleporter_suite_test.go | 49 +- .../validator_manager_suite_test.go | 18 +- tests/testnet/main/run_testnet_flows.go | 104 +-- tests/testnet/network.go | 740 +++++++++--------- tests/utils/chain.go | 3 +- tests/utils/teleporter.go | 216 ++++- tests/utils/validator_manager.go | 2 + 27 files changed, 818 insertions(+), 882 deletions(-) diff --git a/tests/flows/teleporter/add_fee_amount.go b/tests/flows/teleporter/add_fee_amount.go index 1a05e6e81..e8cb9cdd8 100644 --- a/tests/flows/teleporter/add_fee_amount.go +++ b/tests/flows/teleporter/add_fee_amount.go @@ -12,10 +12,10 @@ import ( . "github.com/onsi/gomega" ) -func AddFeeAmount(network interfaces.Network) { +func AddFeeAmount(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) - teleporterContractAddress := network.GetTeleporterContractAddress() + teleporterContractAddress := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessengerAddress fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -50,7 +50,13 @@ func AddFeeAmount(network interfaces.Network) { } sendCrossChainMsgReceipt, messageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, + subnetAInfo, + subnetBInfo, + sendCrossChainMessageInput, + fundedKey, + ) // Add a fee amount to the message. additionalFeeAmount := big.NewInt(2) @@ -62,23 +68,23 @@ func AddFeeAmount(network interfaces.Network) { additionalFeeAmount, mockTokenAddress, fundedKey, - subnetAInfo.TeleporterMessenger, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, ) // Relay message from Subnet A to Subnet B - deliveryReceipt := network.RelayMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true) + deliveryReceipt := teleporterInfo.RelayTeleporterMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true, fundedKey) receiveEvent, err := utils.GetEventFromLogs( deliveryReceipt.Logs, - subnetBInfo.TeleporterMessenger.ParseReceiveCrossChainMessage) + teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) // Check Teleporter message received on the destination (Subnet B) - delivered, err := subnetBInfo.TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) + delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Check the initial relayer reward amount on Subnet A. - initialRewardAmount, err := subnetAInfo.TeleporterMessenger.CheckRelayerRewardAmount( + initialRewardAmount, err := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent.RewardRedeemer, mockTokenAddress) @@ -87,6 +93,7 @@ func AddFeeAmount(network interfaces.Network) { // Send a message from Subnet B back to Subnet A that includes the specific receipt for the message. sendSpecificReceiptsReceipt, sendSpecificReceiptsMessageID := utils.SendSpecifiedReceiptsAndWaitForAcceptance( ctx, + teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger, subnetBInfo, subnetAInfo.BlockchainID, [][32]byte{receiveEvent.MessageID}, @@ -98,16 +105,16 @@ func AddFeeAmount(network interfaces.Network) { fundedKey) // Relay message containing the specific receipt from Subnet B to Subnet A - network.RelayMessage(ctx, sendSpecificReceiptsReceipt, subnetBInfo, subnetAInfo, true) + teleporterInfo.RelayTeleporterMessage(ctx, sendSpecificReceiptsReceipt, subnetBInfo, subnetAInfo, true, fundedKey) // Check message delivered - delivered, err = subnetAInfo.TeleporterMessenger.MessageReceived(&bind.CallOpts{}, sendSpecificReceiptsMessageID) + delivered, err = teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, sendSpecificReceiptsMessageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Check the updated relayer reward amount expectedIncrease := new(big.Int).Add(initFeeAmount, additionalFeeAmount) - newRewardAmount, err := subnetAInfo.TeleporterMessenger.CheckRelayerRewardAmount( + newRewardAmount, err := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent.RewardRedeemer, mockTokenAddress) @@ -117,7 +124,13 @@ func AddFeeAmount(network interfaces.Network) { // If the funded address is the one able to redeem the rewards, do so and check the reward amount is reset. if fundedAddress == receiveEvent.RewardRedeemer { utils.RedeemRelayerRewardsAndConfirm( - ctx, subnetAInfo, mockToken, mockTokenAddress, fundedKey, newRewardAmount, + ctx, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, + subnetAInfo, + mockToken, + mockTokenAddress, + fundedKey, + newRewardAmount, ) } } diff --git a/tests/flows/teleporter/basic_send_receive.go b/tests/flows/teleporter/basic_send_receive.go index fe31746c5..367ade88d 100644 --- a/tests/flows/teleporter/basic_send_receive.go +++ b/tests/flows/teleporter/basic_send_receive.go @@ -13,10 +13,10 @@ import ( ) // Tests basic one-way send from Subnet A to Subnet B and vice versa -func BasicSendReceive(network interfaces.Network) { +func BasicSendReceive(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) - teleporterContractAddress := network.GetTeleporterContractAddress() + teleporterContractAddress := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessengerAddress fundedAddress, fundedKey := network.GetFundedAccountInfo() // Send a transaction to Subnet A to issue a Warp Message from the Teleporter contract to Subnet B @@ -26,7 +26,7 @@ func BasicSendReceive(network interfaces.Network) { // This is only done if the test non-external networks because external networks may have // an arbitrarily high number of receipts to be cleared from a given queue from unrelated messages. if !network.IsExternalNetwork() { - utils.ClearReceiptQueue(ctx, network, fundedKey, subnetBInfo, subnetAInfo) + utils.ClearReceiptQueue(ctx, teleporterInfo, subnetBInfo, subnetAInfo, fundedKey) } feeAmount := big.NewInt(1) @@ -59,6 +59,7 @@ func BasicSendReceive(network interfaces.Network) { receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, @@ -67,14 +68,14 @@ func BasicSendReceive(network interfaces.Network) { expectedReceiptID := teleporterMessageID // Relay the message to the destination - deliveryReceipt := network.RelayMessage(ctx, receipt, subnetAInfo, subnetBInfo, true) + deliveryReceipt := teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) receiveEvent, err := utils.GetEventFromLogs( deliveryReceipt.Logs, - subnetBInfo.TeleporterMessenger.ParseReceiveCrossChainMessage) + teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) // Check Teleporter message received on the destination - delivered, err := subnetBInfo.TeleporterMessenger.MessageReceived( + delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -85,6 +86,7 @@ func BasicSendReceive(network interfaces.Network) { sendCrossChainMessageInput.FeeInfo.Amount = big.NewInt(0) receipt, teleporterMessageID = utils.SendCrossChainMessageAndWaitForAcceptance( ctx, + teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger, subnetBInfo, subnetAInfo, sendCrossChainMessageInput, @@ -92,7 +94,7 @@ func BasicSendReceive(network interfaces.Network) { ) // Relay the message to the destination - deliveryReceipt = network.RelayMessage(ctx, receipt, subnetBInfo, subnetAInfo, true) + deliveryReceipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetBInfo, subnetAInfo, true, fundedKey) // Check that the receipt was received for expected Teleporter message ID // This check is not performed for external networks because the specific receipt for this message @@ -101,11 +103,11 @@ func BasicSendReceive(network interfaces.Network) { Expect(utils.CheckReceiptReceived( deliveryReceipt, expectedReceiptID, - subnetAInfo.TeleporterMessenger)).Should(BeTrue()) + teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger)).Should(BeTrue()) } // Check Teleporter message received on the destination - delivered, err = subnetAInfo.TeleporterMessenger.MessageReceived( + delivered, err = teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -116,7 +118,7 @@ func BasicSendReceive(network interfaces.Network) { // networks since the specific receipt may not have been included in the message, as noted above. if !network.IsExternalNetwork() && receiveEvent.RewardRedeemer == fundedAddress { utils.RedeemRelayerRewardsAndConfirm( - ctx, subnetAInfo, feeToken, feeTokenAddress, fundedKey, feeAmount, + ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, feeToken, feeTokenAddress, fundedKey, feeAmount, ) } } diff --git a/tests/flows/teleporter/deliver_to_nonexistent_contract.go b/tests/flows/teleporter/deliver_to_nonexistent_contract.go index ce54899bb..934069588 100644 --- a/tests/flows/teleporter/deliver_to_nonexistent_contract.go +++ b/tests/flows/teleporter/deliver_to_nonexistent_contract.go @@ -14,7 +14,7 @@ import ( . "github.com/onsi/gomega" ) -func DeliverToNonExistentContract(network interfaces.Network) { +func DeliverToNonExistentContract(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -44,6 +44,7 @@ func DeliverToNonExistentContract(network interfaces.Network) { ctx, fundedKey, fundedAddress, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterRegistryAddress, subnetAInfo, ) @@ -74,7 +75,7 @@ func DeliverToNonExistentContract(network interfaces.Network) { // Wait for the transaction to be mined receipt := utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) - sendEvent, err := utils.GetEventFromLogs(receipt.Logs, subnetAInfo.TeleporterMessenger.ParseSendCrossChainMessage) + sendEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) Expect(err).Should(BeNil()) Expect(sendEvent.DestinationBlockchainID[:]).Should(Equal(subnetBInfo.BlockchainID[:])) @@ -84,16 +85,16 @@ func DeliverToNonExistentContract(network interfaces.Network) { // Relay the message to the destination // log.Info("Relaying the message to the destination") - receipt = network.RelayMessage(ctx, receipt, subnetAInfo, subnetBInfo, true) + receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) receiveEvent, err := - utils.GetEventFromLogs(receipt.Logs, subnetAInfo.TeleporterMessenger.ParseReceiveCrossChainMessage) + utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) // // Check that the message was successfully relayed // log.Info("Checking the message was successfully relayed") - delivered, err := subnetBInfo.TeleporterMessenger.MessageReceived( + delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) @@ -106,7 +107,7 @@ func DeliverToNonExistentContract(network interfaces.Network) { log.Info("Checking the message was not successfully executed") executionFailedEvent, err := utils.GetEventFromLogs( receipt.Logs, - subnetBInfo.TeleporterMessenger.ParseMessageExecutionFailed, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseMessageExecutionFailed, ) Expect(err).Should(BeNil()) Expect(executionFailedEvent.MessageID).Should(Equal(receiveEvent.MessageID)) @@ -119,6 +120,7 @@ func DeliverToNonExistentContract(network interfaces.Network) { ctx, deployerKey, deployerAddress, + teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistryAddress, subnetBInfo, ) @@ -132,6 +134,7 @@ func DeliverToNonExistentContract(network interfaces.Network) { receipt = utils.RetryMessageExecutionAndWaitForAcceptance( ctx, subnetAInfo.BlockchainID, + teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger, subnetBInfo, receiveEvent.Message, fundedKey, @@ -139,7 +142,7 @@ func DeliverToNonExistentContract(network interfaces.Network) { log.Info("Checking the message was successfully executed") messageExecutedEvent, err := utils.GetEventFromLogs( receipt.Logs, - subnetBInfo.TeleporterMessenger.ParseMessageExecuted, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseMessageExecuted, ) Expect(err).Should(BeNil()) Expect(messageExecutedEvent.MessageID).Should(Equal(receiveEvent.MessageID)) diff --git a/tests/flows/teleporter/deliver_to_wrong_chain.go b/tests/flows/teleporter/deliver_to_wrong_chain.go index cbd83754c..db749c629 100644 --- a/tests/flows/teleporter/deliver_to_wrong_chain.go +++ b/tests/flows/teleporter/deliver_to_wrong_chain.go @@ -15,7 +15,7 @@ import ( . "github.com/onsi/gomega" ) -func DeliverToWrongChain(network interfaces.Network) { +func DeliverToWrongChain(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, subnetCInfo := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -23,7 +23,7 @@ func DeliverToWrongChain(network interfaces.Network) { // // Get the expected teleporter message ID for Subnet C // - expectedAtoCMessageID, err := subnetAInfo.TeleporterMessenger.GetNextMessageID( + expectedAtoCMessageID, err := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.GetNextMessageID( &bind.CallOpts{}, subnetCInfo.BlockchainID, ) @@ -52,6 +52,7 @@ func DeliverToWrongChain(network interfaces.Network) { receipt, _ := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, @@ -62,12 +63,12 @@ func DeliverToWrongChain(network interfaces.Network) { // // Try to relay the message to subnet C, should fail // - network.RelayMessage(ctx, receipt, subnetAInfo, subnetCInfo, false) + teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetCInfo, false, fundedKey) } else { // // Wait for external relayer to properly deliver the message to subnet B // - deliveryReceipt := network.RelayMessage(ctx, receipt, subnetAInfo, subnetBInfo, true) + deliveryReceipt := teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) deliveryTx, isPending, err := subnetBInfo.RPCClient.TransactionByHash(ctx, deliveryReceipt.TxHash) Expect(err).Should(BeNil()) Expect(isPending).Should(BeFalse()) @@ -83,7 +84,7 @@ func DeliverToWrongChain(network interfaces.Network) { // // Check that the message was not received on the Subnet C // - delivered, err := subnetCInfo.TeleporterMessenger.MessageReceived( + delivered, err := teleporterInfo[subnetCInfo.BlockchainID].TeleporterMessenger.MessageReceived( &bind.CallOpts{}, expectedAtoCMessageID, ) Expect(err).Should(BeNil()) diff --git a/tests/flows/teleporter/insufficient_gas.go b/tests/flows/teleporter/insufficient_gas.go index 0ce3b1ca6..2ad7cb1db 100644 --- a/tests/flows/teleporter/insufficient_gas.go +++ b/tests/flows/teleporter/insufficient_gas.go @@ -10,7 +10,7 @@ import ( . "github.com/onsi/gomega" ) -func InsufficientGas(network interfaces.Network) { +func InsufficientGas(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -21,6 +21,7 @@ func InsufficientGas(network interfaces.Network) { ctx, fundedKey, fundedAddress, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterRegistryAddress, subnetAInfo, ) // Deploy TestMessenger to Subnets B @@ -28,6 +29,7 @@ func InsufficientGas(network interfaces.Network) { ctx, fundedKey, fundedAddress, + teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistryAddress, subnetBInfo, ) @@ -44,24 +46,24 @@ func InsufficientGas(network interfaces.Network) { // Wait for the transaction to be mined receipt := utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) - event, err := utils.GetEventFromLogs(receipt.Logs, subnetAInfo.TeleporterMessenger.ParseSendCrossChainMessage) + event, err := utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) Expect(err).Should(BeNil()) Expect(event.DestinationBlockchainID[:]).Should(Equal(subnetBInfo.BlockchainID[:])) messageID := event.MessageID // Relay message from SubnetA to SubnetB - receipt = network.RelayMessage(ctx, receipt, subnetAInfo, subnetBInfo, true) + receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) // Check Teleporter message received on the destination delivered, err := - subnetBInfo.TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) + teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Check message execution failed event failedMessageExecutionEvent, err := utils.GetEventFromLogs( - receipt.Logs, subnetBInfo.TeleporterMessenger.ParseMessageExecutionFailed, + receipt.Logs, teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseMessageExecutionFailed, ) Expect(err).Should(BeNil()) Expect(failedMessageExecutionEvent.MessageID[:]).Should(Equal(messageID[:])) @@ -72,11 +74,12 @@ func InsufficientGas(network interfaces.Network) { receipt = utils.RetryMessageExecutionAndWaitForAcceptance( ctx, subnetAInfo.BlockchainID, + teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger, subnetBInfo, failedMessageExecutionEvent.Message, fundedKey, ) - executedEvent, err := utils.GetEventFromLogs(receipt.Logs, subnetBInfo.TeleporterMessenger.ParseMessageExecuted) + executedEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseMessageExecuted) Expect(err).Should(BeNil()) Expect(executedEvent.MessageID[:]).Should(Equal(messageID[:])) Expect(executedEvent.SourceBlockchainID[:]).Should(Equal(subnetAInfo.BlockchainID[:])) diff --git a/tests/flows/teleporter/registry/check_upgrade_access.go b/tests/flows/teleporter/registry/check_upgrade_access.go index 61f9b1683..0c5770497 100644 --- a/tests/flows/teleporter/registry/check_upgrade_access.go +++ b/tests/flows/teleporter/registry/check_upgrade_access.go @@ -13,7 +13,7 @@ import ( . "github.com/onsi/gomega" ) -func CheckUpgradeAccess(network interfaces.Network) { +func CheckUpgradeAccess(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetInfo := network.GetPrimaryNetworkInfo() fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -21,11 +21,12 @@ func CheckUpgradeAccess(network interfaces.Network) { // Deploy TestMessenger to the subnet // ctx := context.Background() - teleporterAddress := network.GetTeleporterContractAddress() + teleporterAddress := teleporterInfo[subnetInfo.BlockchainID].TeleporterMessengerAddress _, testMessenger := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, + teleporterInfo[subnetInfo.BlockchainID].TeleporterRegistryAddress, subnetInfo, ) diff --git a/tests/flows/teleporter/registry/pause_teleporter.go b/tests/flows/teleporter/registry/pause_teleporter.go index 41b44849d..cebfb7852 100644 --- a/tests/flows/teleporter/registry/pause_teleporter.go +++ b/tests/flows/teleporter/registry/pause_teleporter.go @@ -9,7 +9,7 @@ import ( . "github.com/onsi/gomega" ) -func PauseTeleporter(network interfaces.Network) { +func PauseTeleporter(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -18,17 +18,19 @@ func PauseTeleporter(network interfaces.Network) { // Deploy TestMessenger to Subnets A and B // ctx := context.Background() - teleporterAddress := network.GetTeleporterContractAddress() + teleporterAddress := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessengerAddress _, testMessengerA := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterRegistryAddress, subnetAInfo, ) testMessengerAddressB, testMessengerB := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, + teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistryAddress, subnetBInfo, ) @@ -51,7 +53,7 @@ func PauseTeleporter(network interfaces.Network) { // Send a message from subnet A to subnet B, which should fail utils.SendExampleCrossChainMessageAndVerify( ctx, - network, + teleporterInfo, subnetAInfo, testMessengerA, subnetBInfo, @@ -77,7 +79,7 @@ func PauseTeleporter(network interfaces.Network) { // Send a message from subnet A to subnet B again, which should now succeed utils.SendExampleCrossChainMessageAndVerify( ctx, - network, + teleporterInfo, subnetAInfo, testMessengerA, subnetBInfo, diff --git a/tests/flows/teleporter/registry/teleporter_registry.go b/tests/flows/teleporter/registry/teleporter_registry.go index d6d6c14dc..0e4f44092 100644 --- a/tests/flows/teleporter/registry/teleporter_registry.go +++ b/tests/flows/teleporter/registry/teleporter_registry.go @@ -7,6 +7,7 @@ import ( "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" + "github.com/ethereum/go-ethereum/common" . "github.com/onsi/gomega" ) @@ -14,7 +15,7 @@ const ( teleporterByteCodeFile = "./out/TeleporterMessenger.sol/TeleporterMessenger.json" ) -func TeleporterRegistry(network interfaces.LocalNetwork) { +func TeleporterRegistry(network interfaces.LocalNetwork, teleporterInfo utils.TeleporterTestInfo) { // Deploy dApp on both chains that use Teleporter Registry // Deploy version 2 of Teleporter to both chains // Construct AddProtocolVersion txs for both chains @@ -37,34 +38,42 @@ func TeleporterRegistry(network interfaces.LocalNetwork) { ctx, fundedKey, fundedAddress, + teleporterInfo[cChainInfo.BlockchainID].TeleporterRegistryAddress, cChainInfo, ) testMessengerContractB, testMessengerB := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, + teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistryAddress, subnetBInfo, ) // Deploy the new version of Teleporter to both chains - newTeleporterAddress := utils.DeployNewTeleporterVersion(ctx, network, fundedKey, teleporterByteCodeFile) + var newTeleporterAddress common.Address + for _, subnet := range network.GetAllSubnetsInfo() { + newTeleporterAddress = utils.DeployNewTeleporterVersion(ctx, teleporterInfo, subnet, fundedKey, teleporterByteCodeFile) + } networkID := network.GetNetworkID() // Create chain config file with off chain message for each chain offchainMessageC, warpEnabledChainConfigC := utils.InitOffChainMessageChainConfig( networkID, cChainInfo, + teleporterInfo[cChainInfo.BlockchainID].TeleporterRegistryAddress, newTeleporterAddress, 2, ) offchainMessageB, warpEnabledChainConfigB := utils.InitOffChainMessageChainConfig( networkID, subnetBInfo, + teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistryAddress, newTeleporterAddress, 2, ) offchainMessageA, warpEnabledChainConfigA := utils.InitOffChainMessageChainConfig( networkID, subnetAInfo, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterRegistryAddress, newTeleporterAddress, 2, ) @@ -84,7 +93,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork) { // Call addProtocolVersion on subnetB to register the new Teleporter version utils.AddProtocolVersionAndWaitForAcceptance( ctx, - network, + *teleporterInfo[subnetBInfo.BlockchainID], subnetBInfo, newTeleporterAddress, fundedKey, @@ -95,7 +104,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork) { // Message should be received successfully since we haven't updated mininum Teleporter version yet. utils.SendExampleCrossChainMessageAndVerify( ctx, - network, + teleporterInfo, cChainInfo, testMessengerC, subnetBInfo, @@ -110,7 +119,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork) { opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetBInfo.EVMChainID) Expect(err).Should(BeNil()) - latestVersionB, err := subnetBInfo.TeleporterRegistry.LatestVersion(&bind.CallOpts{}) + latestVersionB, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistry.LatestVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) minTeleporterVersion, err := testMessengerB.GetMinTeleporterVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) @@ -132,7 +141,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork) { // Message should fail since we updated minimum Teleporter version. utils.SendExampleCrossChainMessageAndVerify( ctx, - network, + teleporterInfo, cChainInfo, testMessengerC, subnetBInfo, @@ -143,14 +152,15 @@ func TeleporterRegistry(network interfaces.LocalNetwork) { false, ) - // Update the subnets to use new Teleporter messengers - network.SetTeleporterContractAddress(newTeleporterAddress) - cChainInfo = network.GetPrimaryNetworkInfo() - subnetAInfo, subnetBInfo = utils.GetTwoSubnets(network) + // Update teleporterInfo with the new TeleporterMessengers + for _, subnet := range network.GetAllSubnetsInfo() { + teleporterInfo.SetTeleporter(newTeleporterAddress, subnet) + teleporterInfo.InitializeBlockchainID(subnet, fundedKey) + } utils.SendExampleCrossChainMessageAndVerify( ctx, - network, + teleporterInfo, subnetBInfo, testMessengerB, cChainInfo, @@ -164,7 +174,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork) { // Call addProtocolVersion on subnetA to register the new Teleporter version utils.AddProtocolVersionAndWaitForAcceptance( ctx, - network, + *teleporterInfo[cChainInfo.BlockchainID], cChainInfo, newTeleporterAddress, fundedKey, @@ -175,7 +185,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork) { // Teleporter versions should match, so message should be received successfully. utils.SendExampleCrossChainMessageAndVerify( ctx, - network, + teleporterInfo, subnetBInfo, testMessengerB, cChainInfo, @@ -190,18 +200,18 @@ func TeleporterRegistry(network interfaces.LocalNetwork) { // to register the new Teleporter version utils.AddProtocolVersionAndWaitForAcceptance( ctx, - network, + *teleporterInfo[subnetAInfo.BlockchainID], subnetAInfo, newTeleporterAddress, fundedKey, offchainMessageA, ) - latestVersionA, err := subnetAInfo.TeleporterRegistry.LatestVersion(&bind.CallOpts{}) + latestVersionA, err := teleporterInfo[subnetAInfo.BlockchainID].TeleporterRegistry.LatestVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) Expect(latestVersionA.Cmp(latestVersionB)).Should(Equal(0)) - latestVersionC, err := cChainInfo.TeleporterRegistry.LatestVersion(&bind.CallOpts{}) + latestVersionC, err := teleporterInfo[cChainInfo.BlockchainID].TeleporterRegistry.LatestVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) Expect(latestVersionC.Cmp(latestVersionB)).Should(Equal(0)) } diff --git a/tests/flows/teleporter/relay_message_twice.go b/tests/flows/teleporter/relay_message_twice.go index fec7100c4..3abc99393 100644 --- a/tests/flows/teleporter/relay_message_twice.go +++ b/tests/flows/teleporter/relay_message_twice.go @@ -14,7 +14,7 @@ import ( . "github.com/onsi/gomega" ) -func RelayMessageTwice(network interfaces.Network) { +func RelayMessageTwice(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -41,19 +41,19 @@ func RelayMessageTwice(network interfaces.Network) { "destinationBlockchainID", subnetBInfo.BlockchainID, ) receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey, + ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey, ) // // Relay the message to the destination // - network.RelayMessage(ctx, receipt, subnetAInfo, subnetBInfo, true) + teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) // // Check Teleporter message received on the destination // log.Info("Checking the message was received on the destination") - delivered, err := subnetBInfo.TeleporterMessenger.MessageReceived( + delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -63,5 +63,5 @@ func RelayMessageTwice(network interfaces.Network) { // Attempt to send the same message again, should fail // log.Info("Relaying the same Teleporter message again on the destination") - network.RelayMessage(ctx, receipt, subnetAInfo, subnetBInfo, false) + teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, false, fundedKey) } diff --git a/tests/flows/teleporter/relayer_modifies_message.go b/tests/flows/teleporter/relayer_modifies_message.go index df9a77d43..9cf2e3732 100644 --- a/tests/flows/teleporter/relayer_modifies_message.go +++ b/tests/flows/teleporter/relayer_modifies_message.go @@ -22,7 +22,7 @@ import ( ) // Disallow this test from being run on anything but a local network, since it requires special behavior by the relayer -func RelayerModifiesMessage(network interfaces.LocalNetwork) { +func RelayerModifiesMessage(network interfaces.LocalNetwork, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -43,32 +43,34 @@ func RelayerModifiesMessage(network interfaces.LocalNetwork) { } receipt, messageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) // Relay the message to the destination // Relayer modifies the message in flight relayAlteredMessage( ctx, + teleporterInfo, receipt, subnetAInfo, subnetBInfo, network) // Check Teleporter message was not received on the destination - delivered, err := subnetBInfo.TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) + delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeFalse()) } func relayAlteredMessage( ctx context.Context, + teleporterInfo utils.TeleporterTestInfo, sourceReceipt *types.Receipt, source interfaces.SubnetTestInfo, destination interfaces.SubnetTestInfo, network interfaces.LocalNetwork, ) { // Fetch the Teleporter message from the logs - sendEvent, err := utils.GetEventFromLogs(sourceReceipt.Logs, source.TeleporterMessenger.ParseSendCrossChainMessage) + sendEvent, err := utils.GetEventFromLogs(sourceReceipt.Logs, teleporterInfo[source.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) Expect(err).Should(BeNil()) signedWarpMessage := utils.ConstructSignedWarpMessage(ctx, sourceReceipt, source, destination) @@ -80,7 +82,7 @@ func relayAlteredMessage( signedWarpMessage, &sendEvent.Message, sendEvent.Message.RequiredGasLimit, - network.GetTeleporterContractAddress(), + teleporterInfo[source.BlockchainID].TeleporterMessengerAddress, fundedKey, destination, ) diff --git a/tests/flows/teleporter/resubmit_altered_message.go b/tests/flows/teleporter/resubmit_altered_message.go index 268c8b6cf..d64131512 100644 --- a/tests/flows/teleporter/resubmit_altered_message.go +++ b/tests/flows/teleporter/resubmit_altered_message.go @@ -13,7 +13,7 @@ import ( . "github.com/onsi/gomega" ) -func ResubmitAlteredMessage(network interfaces.Network) { +func ResubmitAlteredMessage(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -34,18 +34,18 @@ func ResubmitAlteredMessage(network interfaces.Network) { } receipt, messageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) // Relay the message to the destination - receipt = network.RelayMessage(ctx, receipt, subnetAInfo, subnetBInfo, true) + receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) log.Info("Checking the message was received on the destination") - delivered, err := subnetBInfo.TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) + delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Get the Teleporter message from receive event - event, err := utils.GetEventFromLogs(receipt.Logs, subnetBInfo.TeleporterMessenger.ParseReceiveCrossChainMessage) + event, err := utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) Expect(event.MessageID[:]).Should(Equal(messageID[:])) teleporterMessage := event.Message @@ -61,7 +61,7 @@ func ResubmitAlteredMessage(network interfaces.Network) { log.Info("Submitting the altered Teleporter message on the source chain") opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err := subnetAInfo.TeleporterMessenger.RetrySendCrossChainMessage(opts, teleporterMessage) + tx, err := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.RetrySendCrossChainMessage(opts, teleporterMessage) Expect(err).ShouldNot(BeNil()) // We expect the tx to be nil because the Warp message failed verification, which happens in the predicate diff --git a/tests/flows/teleporter/retry_successful_execution.go b/tests/flows/teleporter/retry_successful_execution.go index d75439e0f..422c781aa 100644 --- a/tests/flows/teleporter/retry_successful_execution.go +++ b/tests/flows/teleporter/retry_successful_execution.go @@ -11,7 +11,7 @@ import ( . "github.com/onsi/gomega" ) -func RetrySuccessfulExecution(network interfaces.Network) { +func RetrySuccessfulExecution(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -25,12 +25,14 @@ func RetrySuccessfulExecution(network interfaces.Network) { ctx, fundedKey, fundedAddress, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterRegistryAddress, subnetAInfo, ) testMessengerContractAddressB, subnetBTestMessenger := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, + teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistryAddress, subnetBInfo, ) @@ -54,7 +56,7 @@ func RetrySuccessfulExecution(network interfaces.Network) { // Wait for the transaction to be mined receipt := utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) - event, err := utils.GetEventFromLogs(receipt.Logs, subnetAInfo.TeleporterMessenger.ParseSendCrossChainMessage) + event, err := utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) Expect(err).Should(BeNil()) Expect(event.DestinationBlockchainID[:]).Should(Equal(subnetBInfo.BlockchainID[:])) @@ -63,16 +65,16 @@ func RetrySuccessfulExecution(network interfaces.Network) { // // Relay the message to the destination // - receipt = network.RelayMessage(ctx, receipt, subnetAInfo, subnetBInfo, true) + receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) receiveEvent, err := - utils.GetEventFromLogs(receipt.Logs, subnetBInfo.TeleporterMessenger.ParseReceiveCrossChainMessage) + utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) deliveredTeleporterMessage := receiveEvent.Message // // Check Teleporter message received on the destination // - delivered, err := subnetBInfo.TeleporterMessenger.MessageReceived( + delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -91,7 +93,7 @@ func RetrySuccessfulExecution(network interfaces.Network) { optsB, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetBInfo.EVMChainID) Expect(err).Should(BeNil()) tx, err = - subnetBInfo.TeleporterMessenger.RetryMessageExecution(optsB, subnetAInfo.BlockchainID, deliveredTeleporterMessage) + teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.RetryMessageExecution(optsB, subnetAInfo.BlockchainID, deliveredTeleporterMessage) Expect(err).Should(Not(BeNil())) Expect(tx).Should(BeNil()) } diff --git a/tests/flows/teleporter/send_specific_receipts.go b/tests/flows/teleporter/send_specific_receipts.go index 603074fe5..4b4192f3a 100644 --- a/tests/flows/teleporter/send_specific_receipts.go +++ b/tests/flows/teleporter/send_specific_receipts.go @@ -16,10 +16,10 @@ import ( . "github.com/onsi/gomega" ) -func SendSpecificReceipts(network interfaces.Network) { +func SendSpecificReceipts(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) - teleporterContractAddress := network.GetTeleporterContractAddress() + teleporterContractAddress := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessengerAddress _, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -27,7 +27,7 @@ func SendSpecificReceipts(network interfaces.Network) { // This is only done if the test non-external networks because external networks may have // an arbitrarily high number of receipts to be cleared from a given queue from unrelated messages. if !network.IsExternalNetwork() { - utils.ClearReceiptQueue(ctx, network, fundedKey, subnetBInfo, subnetAInfo) + utils.ClearReceiptQueue(ctx, teleporterInfo, subnetBInfo, subnetAInfo, fundedKey) } // Use mock token as the fee token @@ -61,41 +61,42 @@ func SendSpecificReceipts(network interfaces.Network) { // Send first message from Subnet A to Subnet B with fee amount 5 sendCrossChainMsgReceipt, messageID1 := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) // Relay the message from SubnetA to SubnetB - deliveryReceipt1 := network.RelayMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true) + deliveryReceipt1 := teleporterInfo.RelayTeleporterMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true, fundedKey) receiveEvent1, err := utils.GetEventFromLogs( deliveryReceipt1.Logs, - subnetBInfo.TeleporterMessenger.ParseReceiveCrossChainMessage) + teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) Expect(receiveEvent1.MessageID[:]).Should(Equal(messageID1[:])) // Check that the first message was delivered - delivered, err := subnetBInfo.TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID1) + delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID1) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Send second message from Subnet A to Subnet B with fee amount 5 sendCrossChainMsgReceipt, messageID2 := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) // Relay the message from SubnetA to SubnetB - deliveryReceipt2 := network.RelayMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true) + deliveryReceipt2 := teleporterInfo.RelayTeleporterMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true, fundedKey) receiveEvent2, err := utils.GetEventFromLogs( deliveryReceipt2.Logs, - subnetBInfo.TeleporterMessenger.ParseReceiveCrossChainMessage) + teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) Expect(receiveEvent2.MessageID[:]).Should(Equal(messageID2[:])) // Check that the second message was delivered - delivered, err = subnetBInfo.TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID2) + delivered, err = teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID2) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Call send specific receipts to get reward of relaying two messages receipt, messageID := utils.SendSpecifiedReceiptsAndWaitForAcceptance( ctx, + teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger, subnetBInfo, subnetAInfo.BlockchainID, [][32]byte{messageID1, messageID2}, @@ -108,21 +109,21 @@ func SendSpecificReceipts(network interfaces.Network) { ) // Relay message from Subnet B to Subnet A - receipt = network.RelayMessage(ctx, receipt, subnetBInfo, subnetAInfo, true) + receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetBInfo, subnetAInfo, true, fundedKey) // Check that the message back to Subnet A was delivered - delivered, err = subnetAInfo.TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) + delivered, err = teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Check that the expected receipts were received and emitted ReceiptReceived - Expect(utils.CheckReceiptReceived(receipt, messageID1, subnetAInfo.TeleporterMessenger)).Should(BeTrue()) - Expect(utils.CheckReceiptReceived(receipt, messageID2, subnetAInfo.TeleporterMessenger)).Should(BeTrue()) + Expect(utils.CheckReceiptReceived(receipt, messageID1, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger)).Should(BeTrue()) + Expect(utils.CheckReceiptReceived(receipt, messageID2, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger)).Should(BeTrue()) // Check the reward amounts. // Even on external networks, the relayer should only have the expected fee amount // for this asset because the asset contract was newly deployed by this test. - checkExpectedRewardAmounts(subnetAInfo, receiveEvent1, receiveEvent2, mockTokenAddress, relayerFeePerMessage) + checkExpectedRewardAmounts(teleporterInfo, subnetAInfo, receiveEvent1, receiveEvent2, mockTokenAddress, relayerFeePerMessage) // If the network is internal to the test application, send a message from Subnet B to Subnet A to trigger // the "regular" method of delivering receipts. The next message from B->A will contain the same receipts @@ -144,12 +145,12 @@ func SendSpecificReceipts(network interfaces.Network) { // This message will also have the same receipts as the previous message receipt, messageID = utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, subnetBInfo, subnetAInfo, sendCrossChainMessageInput, fundedKey) + ctx, teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger, subnetBInfo, subnetAInfo, sendCrossChainMessageInput, fundedKey) // Relay message from Subnet B to Subnet A - receipt = network.RelayMessage(ctx, receipt, subnetBInfo, subnetAInfo, true) + receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetBInfo, subnetAInfo, true, fundedKey) // Check delivered - delivered, err = subnetAInfo.TeleporterMessenger.MessageReceived( + delivered, err = teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.MessageReceived( &bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) @@ -157,12 +158,12 @@ func SendSpecificReceipts(network interfaces.Network) { // Check that the expected receipts were included in the message but did not emit ReceiptReceived // because they were previously received - Expect(utils.CheckReceiptReceived(receipt, messageID1, subnetAInfo.TeleporterMessenger)).Should(BeFalse()) - Expect(utils.CheckReceiptReceived(receipt, messageID2, subnetAInfo.TeleporterMessenger)).Should(BeFalse()) + Expect(utils.CheckReceiptReceived(receipt, messageID1, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger)).Should(BeFalse()) + Expect(utils.CheckReceiptReceived(receipt, messageID2, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger)).Should(BeFalse()) receiveEvent, err := utils.GetEventFromLogs( receipt.Logs, - subnetAInfo.TeleporterMessenger.ParseReceiveCrossChainMessage, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage, ) Expect(err).Should(BeNil()) log.Info("Receipt included", "count", len(receiveEvent.Message.Receipts), "receipts", receiveEvent.Message.Receipts) @@ -180,7 +181,7 @@ func SendSpecificReceipts(network interfaces.Network) { receiveEvent.Message.Receipts)).Should(BeTrue()) // Check the reward amount remains the same - checkExpectedRewardAmounts(subnetAInfo, receiveEvent1, receiveEvent2, mockTokenAddress, relayerFeePerMessage) + checkExpectedRewardAmounts(teleporterInfo, subnetAInfo, receiveEvent1, receiveEvent2, mockTokenAddress, relayerFeePerMessage) } } @@ -212,6 +213,7 @@ func receiptIncluded( // assumed that the {tokenAddress} was used as the fee asset for each of the messages, // and that each message individually had a fee of {feePerMessage}. func checkExpectedRewardAmounts( + teleporterInfo utils.TeleporterTestInfo, sourceSubnet interfaces.SubnetTestInfo, receiveEvent1 *teleportermessenger.TeleporterMessengerReceiveCrossChainMessage, receiveEvent2 *teleportermessenger.TeleporterMessengerReceiveCrossChainMessage, @@ -223,20 +225,20 @@ func checkExpectedRewardAmounts( // it should be able to redeem {feePerMessage}*2. Otherwise, // each distinct reward redeemer should be able to redeem {feePerMessage}. if receiveEvent1.RewardRedeemer == receiveEvent2.RewardRedeemer { - amount, err := sourceSubnet.TeleporterMessenger.CheckRelayerRewardAmount( + amount, err := teleporterInfo[sourceSubnet.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent1.RewardRedeemer, tokenAddress) Expect(err).Should(BeNil()) Expect(amount).Should(Equal(new(big.Int).Mul(feePerMessage, big.NewInt(2)))) } else { - amount1, err := sourceSubnet.TeleporterMessenger.CheckRelayerRewardAmount( + amount1, err := teleporterInfo[sourceSubnet.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent1.RewardRedeemer, tokenAddress) Expect(err).Should(BeNil()) Expect(amount1).Should(Equal(feePerMessage)) - amount2, err := sourceSubnet.TeleporterMessenger.CheckRelayerRewardAmount( + amount2, err := teleporterInfo[sourceSubnet.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent2.RewardRedeemer, tokenAddress) diff --git a/tests/flows/teleporter/teleporter_message_ids.go b/tests/flows/teleporter/teleporter_message_ids.go index f0005c8a1..563a156bd 100644 --- a/tests/flows/teleporter/teleporter_message_ids.go +++ b/tests/flows/teleporter/teleporter_message_ids.go @@ -1,5 +1,5 @@ -// (c) 2024, Ava Labs, Inc. All rights reserved. -// See the file LICENSE for licensing terms. +// // (c) 2024, Ava Labs, Inc. All rights reserved. +// // See the file LICENSE for licensing terms. package teleporter @@ -9,21 +9,22 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/subnet-evm/accounts/abi/bind" "github.com/ava-labs/teleporter/tests/interfaces" + "github.com/ava-labs/teleporter/tests/utils" teleporterutils "github.com/ava-labs/teleporter/utils/teleporter-utils" "github.com/ethereum/go-ethereum/common" . "github.com/onsi/gomega" ) // Tests Teleporter message ID calculation -func CalculateMessageID(network interfaces.Network) { +func CalculateMessageID(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetInfo := network.GetPrimaryNetworkInfo() - teleporterContractAddress := network.GetTeleporterContractAddress() + teleporterContractAddress := teleporterInfo[subnetInfo.BlockchainID].TeleporterMessengerAddress sourceBlockchainID := common.HexToHash("0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd") destinationBlockchainID := common.HexToHash("0x1234567812345678123456781234567812345678123456781234567812345678") nonce := big.NewInt(42) - expectedMessageID, err := subnetInfo.TeleporterMessenger.CalculateMessageID( + expectedMessageID, err := teleporterInfo[subnetInfo.BlockchainID].TeleporterMessenger.CalculateMessageID( &bind.CallOpts{}, sourceBlockchainID, destinationBlockchainID, diff --git a/tests/flows/teleporter/unallowed_relayer.go b/tests/flows/teleporter/unallowed_relayer.go index fe9ba6c1e..3b7c8ceb6 100644 --- a/tests/flows/teleporter/unallowed_relayer.go +++ b/tests/flows/teleporter/unallowed_relayer.go @@ -13,7 +13,7 @@ import ( . "github.com/onsi/gomega" ) -func UnallowedRelayer(network interfaces.Network) { +func UnallowedRelayer(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -43,18 +43,18 @@ func UnallowedRelayer(network interfaces.Network) { "destinationBlockchainID", subnetBInfo.BlockchainID, ) receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey, + ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey, ) // // Relay the message to the destination // - network.RelayMessage(ctx, receipt, subnetAInfo, subnetBInfo, false) + teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, false, fundedKey) // // Check Teleporter message was not received on the destination // - delivered, err := subnetBInfo.TeleporterMessenger.MessageReceived( + delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) diff --git a/tests/flows/teleporter/validator_churn.go b/tests/flows/teleporter/validator_churn.go index 8737c8770..8b353c96f 100644 --- a/tests/flows/teleporter/validator_churn.go +++ b/tests/flows/teleporter/validator_churn.go @@ -17,9 +17,9 @@ import ( const newNodeCount = 2 -func ValidatorChurn(network interfaces.LocalNetwork) { +func ValidatorChurn(network interfaces.LocalNetwork, teleporterInfo utils.TeleporterTestInfo) { subnetAInfo, subnetBInfo := utils.GetTwoSubnets(network) - teleporterContractAddress := network.GetTeleporterContractAddress() + teleporterContractAddress := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessengerAddress fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -42,13 +42,14 @@ func ValidatorChurn(network interfaces.LocalNetwork) { receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, + teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey, ) - sendEvent, err := utils.GetEventFromLogs(receipt.Logs, subnetAInfo.TeleporterMessenger.ParseSendCrossChainMessage) + sendEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) Expect(err).Should(BeNil()) sentTeleporterMessage := sendEvent.Message @@ -94,7 +95,7 @@ func ValidatorChurn(network interfaces.LocalNetwork) { utils.SendTransactionAndWaitForFailure(ctx, subnetBInfo, signedTx) // Verify the message was not delivered - delivered, err := subnetBInfo.TeleporterMessenger.MessageReceived( + delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -106,7 +107,7 @@ func ValidatorChurn(network interfaces.LocalNetwork) { log.Info("Retrying message sending on source chain") optsA, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err := subnetAInfo.TeleporterMessenger.RetrySendCrossChainMessage( + tx, err := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.RetrySendCrossChainMessage( optsA, sentTeleporterMessage, ) Expect(err).Should(BeNil()) @@ -114,10 +115,10 @@ func ValidatorChurn(network interfaces.LocalNetwork) { // Wait for the transaction to be mined receipt = utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) - network.RelayMessage(ctx, receipt, subnetAInfo, subnetBInfo, true) + teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) // Verify the message was delivered - delivered, err = subnetBInfo.TeleporterMessenger.MessageReceived( + delivered, err = teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) diff --git a/tests/interfaces/local_network.go b/tests/interfaces/local_network.go index 7b9e6aa7e..2639cc662 100644 --- a/tests/interfaces/local_network.go +++ b/tests/interfaces/local_network.go @@ -2,11 +2,9 @@ package interfaces import ( "context" - "crypto/ecdsa" "github.com/ava-labs/avalanchego/ids" pwallet "github.com/ava-labs/avalanchego/wallet/chain/p/wallet" - "github.com/ethereum/go-ethereum/common" ) type LocalNetwork interface { @@ -14,18 +12,6 @@ type LocalNetwork interface { AddSubnetValidators(ctx context.Context, subnetID ids.ID, count uint) SetChainConfigs(chainConfigs map[string]string) RestartNodes(ctx context.Context, nodeIDs []ids.NodeID) - DeployTeleporterContractToCChain( - transactionBytes []byte, - deployerAddress common.Address, - contractAddress common.Address, - fundedKey *ecdsa.PrivateKey, - ) - DeployTeleporterContractToAllChains( - transactionBytes []byte, - deployerAddress common.Address, - contractAddress common.Address, - fundedKey *ecdsa.PrivateKey, - ) GetNetworkID() uint32 GetPChainWallet() pwallet.Wallet } diff --git a/tests/interfaces/network.go b/tests/interfaces/network.go index 7bd84b60c..204813dfb 100644 --- a/tests/interfaces/network.go +++ b/tests/interfaces/network.go @@ -1,10 +1,8 @@ package interfaces import ( - "context" "crypto/ecdsa" - "github.com/ava-labs/subnet-evm/core/types" "github.com/ethereum/go-ethereum/common" ) @@ -21,12 +19,6 @@ type Network interface { // use GetPrimaryNetworkInfo() and GetSubnetsInfo() instead. GetAllSubnetsInfo() []SubnetTestInfo - // Returns the Teleporter contract address for all subnets in this network. - GetTeleporterContractAddress() common.Address - - // Sets the Teleporter contract address for all subnets in this network. - SetTeleporterContractAddress(address common.Address) - // An address and corresponding key that has native tokens on each of the subnets in this network. GetFundedAccountInfo() (common.Address, *ecdsa.PrivateKey) @@ -38,16 +30,4 @@ type Network interface { // BLS signatures, and false for testnet networks where test application does not necessarily have // connections with each validator. SupportsIndependentRelaying() bool - - // For implementations where SupportsIndependentRelaying() is true, relays the specified message between the - // two subnets,and returns the receipt of the transaction the message was delivered in. - // For implementations where SupportsIndependentRelaying() is false, waits for the specific message to be relayed - // by an external relayer, and returns the receipt of the transaction the message was delivered in. - RelayMessage( - ctx context.Context, - sourceReceipt *types.Receipt, - source SubnetTestInfo, - destination SubnetTestInfo, - expectSuccess bool, - ) *types.Receipt } diff --git a/tests/interfaces/subnet_test_info.go b/tests/interfaces/subnet_test_info.go index 10fa3f8a4..0ab8e6807 100644 --- a/tests/interfaces/subnet_test_info.go +++ b/tests/interfaces/subnet_test_info.go @@ -5,23 +5,15 @@ import ( "github.com/ava-labs/avalanchego/ids" "github.com/ava-labs/subnet-evm/ethclient" - teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" - teleporterregistry "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/registry/TeleporterRegistry" - "github.com/ethereum/go-ethereum/common" ) // Tracks information about a test subnet used for executing tests against. type SubnetTestInfo struct { - SubnetName string - SubnetID ids.ID - BlockchainID ids.ID - NodeURIs []string - WSClient ethclient.Client - RPCClient ethclient.Client - EVMChainID *big.Int - TeleporterRegistry *teleporterregistry.TeleporterRegistry - TeleporterMessenger *teleportermessenger.TeleporterMessenger - - // TeleporterRegistryAddress is unique across subnets. - TeleporterRegistryAddress common.Address + SubnetName string + SubnetID ids.ID + BlockchainID ids.ID + NodeURIs []string + WSClient ethclient.Client + RPCClient ethclient.Client + EVMChainID *big.Int } diff --git a/tests/local/network.go b/tests/local/network.go index a8a574c63..7c252ed27 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -6,7 +6,6 @@ import ( "encoding/base64" "encoding/hex" "encoding/json" - "math/big" "os" "slices" "sort" @@ -23,17 +22,11 @@ import ( "github.com/ava-labs/avalanchego/vms/secp256k1fx" pwallet "github.com/ava-labs/avalanchego/wallet/chain/p/wallet" "github.com/ava-labs/avalanchego/wallet/subnet/primary" - "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/ethclient" - "github.com/ava-labs/subnet-evm/rpc" subnetEvmTestUtils "github.com/ava-labs/subnet-evm/tests/utils" - teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" - teleporterregistry "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/registry/TeleporterRegistry" "github.com/ava-labs/teleporter/tests/interfaces" "github.com/ava-labs/teleporter/tests/utils" "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" . "github.com/onsi/gomega" @@ -43,9 +36,8 @@ var _ interfaces.LocalNetwork = &LocalNetwork{} // Implements Network, pointing to the network setup in local_network_setup.go type LocalNetwork struct { - teleporterContractAddress common.Address - primaryNetworkInfo *interfaces.SubnetTestInfo - subnetsInfo map[ids.ID]*interfaces.SubnetTestInfo + primaryNetworkInfo *interfaces.SubnetTestInfo + subnetsInfo map[ids.ID]*interfaces.SubnetTestInfo extraNodes []*tmpnet.Node // to add as more subnet validators in the tests @@ -61,6 +53,7 @@ const ( timeout = 120 * time.Second ) +// TODONOW: Make the Teleporter info optional type SubnetSpec struct { Name string EVMChainID uint64 @@ -70,7 +63,6 @@ type SubnetSpec struct { NodeCount int } -// TODO: Decouple Teleporter from the network interface func NewLocalNetwork( ctx context.Context, name string, @@ -182,7 +174,7 @@ func NewLocalNetwork( Expect(err).Should(BeNil()) localNetwork.pChainWallet = wallet.P() - // TODO: Convert all subnets to permissionless validation + // TODONOW: Convert all subnets to permissionless validation return localNetwork } @@ -226,8 +218,6 @@ func (n *LocalNetwork) setPrimaryNetworkValues() { n.primaryNetworkInfo.RPCClient = chainRPCClient n.primaryNetworkInfo.EVMChainID = chainIDInt - // TeleporterMessenger is set in SetTeleporterContractAddress - // TeleporterRegistryAddress is set in DeployTeleporterRegistryContracts } func (n *LocalNetwork) setSubnetValues(subnet *tmpnet.Subnet) { @@ -270,143 +260,6 @@ func (n *LocalNetwork) setSubnetValues(subnet *tmpnet.Subnet) { n.subnetsInfo[subnetID].WSClient = chainWSClient n.subnetsInfo[subnetID].RPCClient = chainRPCClient n.subnetsInfo[subnetID].EVMChainID = chainIDInt - - // TeleporterMessenger is set in SetTeleporterContractAddress - // TeleporterRegistryAddress is set in DeployTeleporterRegistryContracts -} - -func (n *LocalNetwork) deployTeleporterToChain( - ctx context.Context, - subnetInfo interfaces.SubnetTestInfo, - transactionBytes []byte, - deployerAddress common.Address, - contractAddress common.Address, - fundedKey *ecdsa.PrivateKey, -) { - // Fund the deployer address - fundAmount := big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(11)) // 11 AVAX - fundDeployerTx := utils.CreateNativeTransferTransaction( - ctx, subnetInfo, fundedKey, deployerAddress, fundAmount, - ) - utils.SendTransactionAndWaitForSuccess(ctx, subnetInfo, fundDeployerTx) - - log.Info("Finished funding Teleporter deployer", "blockchainID", subnetInfo.BlockchainID.Hex()) - - // Deploy Teleporter contract - rpcClient, err := rpc.DialContext( - ctx, - utils.HttpToRPCURI(subnetInfo.NodeURIs[0], subnetInfo.BlockchainID.String()), - ) - Expect(err).Should(BeNil()) - defer rpcClient.Close() - - txHash := common.Hash{} - err = rpcClient.CallContext(ctx, &txHash, "eth_sendRawTransaction", hexutil.Encode(transactionBytes)) - Expect(err).Should(BeNil()) - utils.WaitForTransactionSuccess(ctx, subnetInfo, txHash) - - teleporterCode, err := subnetInfo.RPCClient.CodeAt(ctx, contractAddress, nil) - Expect(err).Should(BeNil()) - Expect(len(teleporterCode)).Should(BeNumerically(">", 2)) // 0x is an EOA, contract returns the bytecode - - log.Info("Finished deploying Teleporter contract", "blockchainID", subnetInfo.BlockchainID.Hex()) -} - -// DeployTeleporterContractToCChain deploys the Teleporter contract to the C-Chain. -// The caller is responsible for generating the deployment transaction information -func (n *LocalNetwork) DeployTeleporterContractToCChain( - transactionBytes []byte, - deployerAddress common.Address, - contractAddress common.Address, - fundedKey *ecdsa.PrivateKey, -) { - log.Info("Deploying Teleporter contract to C-Chain", "contractAddress", contractAddress.String()) - - ctx := context.Background() - n.deployTeleporterToChain( - ctx, - n.GetPrimaryNetworkInfo(), - transactionBytes, - deployerAddress, - contractAddress, - fundedKey, - ) - - log.Info("Deployed Teleporter contracts to C-Chain") -} - -// DeployTeleporterContractToAllChains deploys the Teleporter contract to the C-Chain and all subnets. -// The caller is responsible for generating the deployment transaction information -func (n *LocalNetwork) DeployTeleporterContractToAllChains( - transactionBytes []byte, - deployerAddress common.Address, - contractAddress common.Address, - fundedKey *ecdsa.PrivateKey, -) { - log.Info("Deploying Teleporter contract to C-Chain and all subnets", "contractAddress", contractAddress.String()) - - ctx := context.Background() - for _, subnetInfo := range n.GetAllSubnetsInfo() { - n.deployTeleporterToChain(ctx, subnetInfo, transactionBytes, deployerAddress, contractAddress, fundedKey) - } - - log.Info("Deployed Teleporter contracts to C-Chain and all subnets") -} - -func (n *LocalNetwork) InitializeBlockchainIDOnAllChains( - fundedKey *ecdsa.PrivateKey, -) { - log.Info("Initializing blockchainID on C-Chain and all subnets") - ctx := context.Background() - for _, subnetInfo := range n.GetAllSubnetsInfo() { - opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetInfo.EVMChainID) - Expect(err).Should(BeNil()) - tx, err := subnetInfo.TeleporterMessenger.InitializeBlockchainID(opts) - Expect(err).Should(BeNil()) - utils.WaitForTransactionSuccess(ctx, subnetInfo, tx.Hash()) - } -} - -func (n *LocalNetwork) DeployTeleporterRegistryContracts( - teleporterAddress common.Address, - deployerKey *ecdsa.PrivateKey, -) { - log.Info("Deploying TeleporterRegistry contract to subnets") - ctx := context.Background() - - entries := []teleporterregistry.ProtocolRegistryEntry{ - { - Version: big.NewInt(1), - ProtocolAddress: teleporterAddress, - }, - } - - subnets := n.GetAllSubnetsInfo() - for _, subnetInfo := range subnets { - opts, err := bind.NewKeyedTransactorWithChainID(deployerKey, subnetInfo.EVMChainID) - Expect(err).Should(BeNil()) - teleporterRegistryAddress, tx, teleporterRegistry, err := teleporterregistry.DeployTeleporterRegistry( - opts, subnetInfo.RPCClient, entries, - ) - Expect(err).Should(BeNil()) - // Wait for the transaction to be mined - utils.WaitForTransactionSuccess(ctx, subnetInfo, tx.Hash()) - - if subnetInfo.SubnetID == constants.PrimaryNetworkID { - n.primaryNetworkInfo.TeleporterRegistryAddress = teleporterRegistryAddress - n.primaryNetworkInfo.TeleporterRegistry = teleporterRegistry - } else { - n.subnetsInfo[subnetInfo.SubnetID].TeleporterRegistryAddress = teleporterRegistryAddress - n.subnetsInfo[subnetInfo.SubnetID].TeleporterRegistry = teleporterRegistry - } - - log.Info("Deployed TeleporterRegistry contract", - "subnet", subnetInfo.SubnetID.Hex(), - "address", teleporterRegistryAddress.Hex(), - ) - } - - log.Info("Deployed TeleporterRegistry contracts to all subnets") } // Returns all subnet info sorted in lexicographic order of SubnetName. @@ -431,26 +284,6 @@ func (n *LocalNetwork) GetAllSubnetsInfo() []interfaces.SubnetTestInfo { return append(subnets, n.GetPrimaryNetworkInfo()) } -func (n *LocalNetwork) GetTeleporterContractAddress() common.Address { - return n.teleporterContractAddress -} - -func (n *LocalNetwork) SetTeleporterContractAddress(newTeleporterAddress common.Address) { - n.teleporterContractAddress = newTeleporterAddress - subnets := n.GetAllSubnetsInfo() - for _, subnetInfo := range subnets { - teleporterMessenger, err := teleportermessenger.NewTeleporterMessenger( - n.teleporterContractAddress, subnetInfo.RPCClient, - ) - Expect(err).Should(BeNil()) - if subnetInfo.SubnetID == constants.PrimaryNetworkID { - n.primaryNetworkInfo.TeleporterMessenger = teleporterMessenger - } else { - n.subnetsInfo[subnetInfo.SubnetID].TeleporterMessenger = teleporterMessenger - } - } -} - func (n *LocalNetwork) GetFundedAccountInfo() (common.Address, *ecdsa.PrivateKey) { fundedAddress := crypto.PubkeyToAddress(n.globalFundedKey.PublicKey) return fundedAddress, n.globalFundedKey @@ -466,45 +299,6 @@ func (n *LocalNetwork) SupportsIndependentRelaying() bool { return true } -func (n *LocalNetwork) RelayMessage(ctx context.Context, - sourceReceipt *types.Receipt, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, - expectSuccess bool, -) *types.Receipt { - // Fetch the Teleporter message from the logs - sendEvent, err := utils.GetEventFromLogs(sourceReceipt.Logs, source.TeleporterMessenger.ParseSendCrossChainMessage) - Expect(err).Should(BeNil()) - - signedWarpMessage := utils.ConstructSignedWarpMessage(ctx, sourceReceipt, source, destination) - - // Construct the transaction to send the Warp message to the destination chain - signedTx := utils.CreateReceiveCrossChainMessageTransaction( - ctx, - signedWarpMessage, - sendEvent.Message.RequiredGasLimit, - n.teleporterContractAddress, - n.globalFundedKey, - destination, - ) - - log.Info("Sending transaction to destination chain") - if !expectSuccess { - return utils.SendTransactionAndWaitForFailure(ctx, destination, signedTx) - } - - receipt := utils.SendTransactionAndWaitForSuccess(ctx, destination, signedTx) - - // Check the transaction logs for the ReceiveCrossChainMessage event emitted by the Teleporter contract - receiveEvent, err := utils.GetEventFromLogs( - receipt.Logs, - destination.TeleporterMessenger.ParseReceiveCrossChainMessage, - ) - Expect(err).Should(BeNil()) - Expect(receiveEvent.SourceBlockchainID[:]).Should(Equal(source.BlockchainID[:])) - return receipt -} - func (n *LocalNetwork) setAllSubnetValues() { subnetIDs := n.GetSubnetsInfo() Expect(len(subnetIDs)).Should(Equal(2)) @@ -525,6 +319,9 @@ func (n *LocalNetwork) TearDownNetwork() { Expect(n.tmpnet.Stop(context.Background())).Should(BeNil()) } +// TODONOW: Rename to AddPermissionedSubnetValidators +// TODONOW: Move to chain utils +// TODONOW: Add an AddPermissionlessSubnetValidators function func (n *LocalNetwork) AddSubnetValidators(ctx context.Context, subnetID ids.ID, count uint) { Expect(count > 0).Should(BeTrue(), "can't add 0 validators") Expect(uint(len(n.extraNodes)) >= count).Should( diff --git a/tests/local/teleporter/teleporter_suite_test.go b/tests/local/teleporter/teleporter_suite_test.go index 34d646f6b..17fe35e1a 100644 --- a/tests/local/teleporter/teleporter_suite_test.go +++ b/tests/local/teleporter/teleporter_suite_test.go @@ -9,6 +9,7 @@ import ( teleporterFlows "github.com/ava-labs/teleporter/tests/flows/teleporter" registryFlows "github.com/ava-labs/teleporter/tests/flows/teleporter/registry" "github.com/ava-labs/teleporter/tests/local" + "github.com/ava-labs/teleporter/tests/utils" deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" "github.com/ethereum/go-ethereum/log" "github.com/onsi/ginkgo/v2" @@ -28,6 +29,7 @@ const ( var ( LocalNetworkInstance *local.LocalNetwork + TeleporterInfo utils.TeleporterTestInfo ) func TestTeleporter(t *testing.T) { @@ -77,21 +79,24 @@ var _ = ginkgo.BeforeSuite(func() { }, 2, ) + TeleporterInfo = utils.NewTeleporterTestInfo(LocalNetworkInstance.GetAllSubnetsInfo()) log.Info("Started local network") // Only need to deploy Teleporter on the C-Chain since it is included in the genesis of the subnet chains. _, fundedKey := LocalNetworkInstance.GetFundedAccountInfo() - LocalNetworkInstance.DeployTeleporterContractToCChain( + TeleporterInfo.DeployTeleporterMessenger( + ctx, + LocalNetworkInstance.GetPrimaryNetworkInfo(), teleporterDeployerTransaction, teleporterDeployerAddress, teleporterContractAddress, fundedKey, ) - LocalNetworkInstance.SetTeleporterContractAddress(teleporterContractAddress) - LocalNetworkInstance.InitializeBlockchainIDOnAllChains(fundedKey) - - // Deploy the Teleporter registry contracts to all subnets and the C-Chain. - LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) + for _, subnet := range LocalNetworkInstance.GetAllSubnetsInfo() { + TeleporterInfo.SetTeleporter(teleporterContractAddress, subnet) + TeleporterInfo.InitializeBlockchainID(subnet, fundedKey) + TeleporterInfo.DeployTeleporterRegistry(subnet, fundedKey) + } log.Info("Set up ginkgo before suite") }) @@ -106,83 +111,83 @@ var _ = ginkgo.Describe("[Teleporter integration tests]", func() { ginkgo.It("Send a message from Subnet A to Subnet B, and one from B to A", ginkgo.Label(teleporterMessengerLabel), func() { - teleporterFlows.BasicSendReceive(LocalNetworkInstance) + teleporterFlows.BasicSendReceive(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Deliver to the wrong chain", ginkgo.Label(teleporterMessengerLabel), func() { - teleporterFlows.DeliverToWrongChain(LocalNetworkInstance) + teleporterFlows.DeliverToWrongChain(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Deliver to non-existent contract", ginkgo.Label(teleporterMessengerLabel), func() { - teleporterFlows.DeliverToNonExistentContract(LocalNetworkInstance) + teleporterFlows.DeliverToNonExistentContract(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Retry successful execution", ginkgo.Label(teleporterMessengerLabel), func() { - teleporterFlows.RetrySuccessfulExecution(LocalNetworkInstance) + teleporterFlows.RetrySuccessfulExecution(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Unallowed relayer", ginkgo.Label(teleporterMessengerLabel), func() { - teleporterFlows.UnallowedRelayer(LocalNetworkInstance) + teleporterFlows.UnallowedRelayer(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Relay message twice", ginkgo.Label(teleporterMessengerLabel), func() { - teleporterFlows.RelayMessageTwice(LocalNetworkInstance) + teleporterFlows.RelayMessageTwice(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Add additional fee amount", ginkgo.Label(teleporterMessengerLabel), func() { - teleporterFlows.AddFeeAmount(LocalNetworkInstance) + teleporterFlows.AddFeeAmount(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Send specific receipts", ginkgo.Label(teleporterMessengerLabel), func() { - teleporterFlows.SendSpecificReceipts(LocalNetworkInstance) + teleporterFlows.SendSpecificReceipts(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Insufficient gas", ginkgo.Label(teleporterMessengerLabel), func() { - teleporterFlows.InsufficientGas(LocalNetworkInstance) + teleporterFlows.InsufficientGas(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Resubmit altered message", ginkgo.Label(teleporterMessengerLabel), func() { - teleporterFlows.ResubmitAlteredMessage(LocalNetworkInstance) + teleporterFlows.ResubmitAlteredMessage(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Calculate Teleporter message IDs", ginkgo.Label(utilsLabel), func() { - teleporterFlows.CalculateMessageID(LocalNetworkInstance) + teleporterFlows.CalculateMessageID(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Relayer modifies message", ginkgo.Label(teleporterMessengerLabel), func() { - teleporterFlows.RelayerModifiesMessage(LocalNetworkInstance) + teleporterFlows.RelayerModifiesMessage(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Validator churn", ginkgo.Label(teleporterMessengerLabel), func() { - teleporterFlows.ValidatorChurn(LocalNetworkInstance) + teleporterFlows.ValidatorChurn(LocalNetworkInstance, TeleporterInfo) }) // Teleporter Registry tests ginkgo.It("Teleporter registry", ginkgo.Label(upgradabilityLabel), func() { - registryFlows.TeleporterRegistry(LocalNetworkInstance) + registryFlows.TeleporterRegistry(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Check upgrade access", ginkgo.Label(upgradabilityLabel), func() { - registryFlows.CheckUpgradeAccess(LocalNetworkInstance) + registryFlows.CheckUpgradeAccess(LocalNetworkInstance, TeleporterInfo) }) ginkgo.It("Pause and Unpause Teleporter", ginkgo.Label(upgradabilityLabel), func() { - registryFlows.PauseTeleporter(LocalNetworkInstance) + registryFlows.PauseTeleporter(LocalNetworkInstance, TeleporterInfo) }) }) diff --git a/tests/local/validator-manager/validator_manager_suite_test.go b/tests/local/validator-manager/validator_manager_suite_test.go index 25d780c21..76d0b9f8f 100644 --- a/tests/local/validator-manager/validator_manager_suite_test.go +++ b/tests/local/validator-manager/validator_manager_suite_test.go @@ -41,7 +41,7 @@ func TestValidatorManager(t *testing.T) { // Define the Teleporter before and after suite functions. var _ = ginkgo.BeforeEach(func() { // Generate the Teleporter deployment values - teleporterDeployerTransaction, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := + _, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := deploymentUtils.ConstructKeylessTransaction( teleporterByteCodeFile, false, @@ -77,22 +77,6 @@ var _ = ginkgo.BeforeEach(func() { 2, ) log.Info("Started local network") - - // Only need to deploy Teleporter on the C-Chain since it is included in the genesis of the subnet chains. - _, fundedKey := LocalNetworkInstance.GetFundedAccountInfo() - LocalNetworkInstance.DeployTeleporterContractToCChain( - teleporterDeployerTransaction, - teleporterDeployerAddress, - teleporterContractAddress, - fundedKey, - ) - LocalNetworkInstance.SetTeleporterContractAddress(teleporterContractAddress) - LocalNetworkInstance.InitializeBlockchainIDOnAllChains(fundedKey) - - // Deploy the Teleporter registry contracts to all subnets and the C-Chain. - LocalNetworkInstance.DeployTeleporterRegistryContracts(teleporterContractAddress, fundedKey) - - log.Info("Set up ginkgo before suite") }) var _ = ginkgo.AfterEach(func() { diff --git a/tests/testnet/main/run_testnet_flows.go b/tests/testnet/main/run_testnet_flows.go index 5721537e1..728c75ca3 100644 --- a/tests/testnet/main/run_testnet_flows.go +++ b/tests/testnet/main/run_testnet_flows.go @@ -1,54 +1,54 @@ package main -import ( - "github.com/ethereum/go-ethereum/log" - - "github.com/ava-labs/teleporter/tests/flows/teleporter" - "github.com/ava-labs/teleporter/tests/flows/teleporter/registry" - - "github.com/ava-labs/teleporter/tests/interfaces" - "github.com/ava-labs/teleporter/tests/testnet" - "github.com/onsi/gomega" -) - -func runFlow(flowName string, flow func(interfaces.Network), network interfaces.Network) { - log.Info("Running test", "flowName", flowName) - flow(network) - log.Info("Finished running test", "flowName", flowName) -} - -func main() { - // Register a failure handler that panics - gomega.RegisterFailHandler(func(message string, callerSkip ...int) { - panic(message) - }) - - // Create the new network instances - network, err := testnet.NewTestNetwork() - if err != nil { - panic(err) - } - - // Run the Teleporter test flows. - // Note that the following flows are not able to run against testnet because they - // require the tests to be able to relay messages independently or modifying validator sets. - // - RelayerModifiesMessage - // - UnallowedRelayer - // - ValidatorSetChrun - // - TeleporterRegistry - runFlow("AddFeeAmount", teleporter.AddFeeAmount, network) - runFlow("BasicSendRecevie", teleporter.BasicSendReceive, network) - runFlow("DeliverToNonExistentContract", teleporter.DeliverToNonExistentContract, network) - runFlow("DeliverToWrongChain", teleporter.DeliverToWrongChain, network) - runFlow("InsufficientGas", teleporter.InsufficientGas, network) - runFlow("RelayMessageTwice", teleporter.RelayMessageTwice, network) - runFlow("ResubmitAlteredMessage", teleporter.ResubmitAlteredMessage, network) - runFlow("RetrySuccessfulExecution", teleporter.RetrySuccessfulExecution, network) - runFlow("SendSpecificReceipts", teleporter.SendSpecificReceipts, network) - log.Info("Finished Teleporter test flows") - - // Run the upgradability test flows - runFlow("CheckUpgradeAccess", registry.CheckUpgradeAccess, network) - runFlow("PauseTeleporter", registry.PauseTeleporter, network) - log.Info("Finished upgradability test flows") -} +// import ( +// "github.com/ethereum/go-ethereum/log" + +// "github.com/ava-labs/teleporter/tests/flows/teleporter" +// "github.com/ava-labs/teleporter/tests/flows/teleporter/registry" + +// "github.com/ava-labs/teleporter/tests/interfaces" +// "github.com/ava-labs/teleporter/tests/testnet" +// "github.com/onsi/gomega" +// ) + +// func runFlow(flowName string, flow func(interfaces.Network), network interfaces.Network) { +// log.Info("Running test", "flowName", flowName) +// flow(network) +// log.Info("Finished running test", "flowName", flowName) +// } + +// func main() { +// // Register a failure handler that panics +// gomega.RegisterFailHandler(func(message string, callerSkip ...int) { +// panic(message) +// }) + +// // Create the new network instances +// network, err := testnet.NewTestNetwork() +// if err != nil { +// panic(err) +// } + +// // Run the Teleporter test flows. +// // Note that the following flows are not able to run against testnet because they +// // require the tests to be able to relay messages independently or modifying validator sets. +// // - RelayerModifiesMessage +// // - UnallowedRelayer +// // - ValidatorSetChrun +// // - TeleporterRegistry +// runFlow("AddFeeAmount", teleporter.AddFeeAmount, network) +// runFlow("BasicSendRecevie", teleporter.BasicSendReceive, network) +// runFlow("DeliverToNonExistentContract", teleporter.DeliverToNonExistentContract, network) +// runFlow("DeliverToWrongChain", teleporter.DeliverToWrongChain, network) +// runFlow("InsufficientGas", teleporter.InsufficientGas, network) +// runFlow("RelayMessageTwice", teleporter.RelayMessageTwice, network) +// runFlow("ResubmitAlteredMessage", teleporter.ResubmitAlteredMessage, network) +// runFlow("RetrySuccessfulExecution", teleporter.RetrySuccessfulExecution, network) +// runFlow("SendSpecificReceipts", teleporter.SendSpecificReceipts, network) +// log.Info("Finished Teleporter test flows") + +// // Run the upgradability test flows +// runFlow("CheckUpgradeAccess", registry.CheckUpgradeAccess, network) +// runFlow("PauseTeleporter", registry.PauseTeleporter, network) +// log.Info("Finished upgradability test flows") +// } diff --git a/tests/testnet/network.go b/tests/testnet/network.go index 4a29710ee..bdd54580c 100644 --- a/tests/testnet/network.go +++ b/tests/testnet/network.go @@ -1,372 +1,372 @@ package testnet -import ( - "context" - "crypto/ecdsa" - "errors" - "net/http" - "net/http/cookiejar" - "os" - "time" - - "github.com/ava-labs/avalanchego/ids" - "github.com/ava-labs/avalanchego/utils/constants" - avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" - "github.com/ava-labs/subnet-evm/accounts/abi/bind" - "github.com/ava-labs/subnet-evm/core/types" - "github.com/ava-labs/subnet-evm/ethclient" - "github.com/ava-labs/subnet-evm/precompile/contracts/warp" - "github.com/ava-labs/subnet-evm/rpc" - warpBackend "github.com/ava-labs/subnet-evm/warp" - teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" - teleporterregistry "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/registry/TeleporterRegistry" - "github.com/ava-labs/teleporter/tests/interfaces" - "github.com/ava-labs/teleporter/tests/utils" - "github.com/ethereum/go-ethereum/common" - "github.com/ethereum/go-ethereum/crypto" - "github.com/ethereum/go-ethereum/log" - - . "github.com/onsi/gomega" -) - -const ( - subnetAPrefix = "subnet_a" - subnetBPrefix = "subnet_b" - subnetCPrefix = "subnet_c" - cChainPrefix = "c_chain" - teleporterContractAddress = "teleporter_contract_address" - teleporterRegistryAddressSuffix = "_teleporter_registry_address" - subnetIDSuffix = "_subnet_id" - blockchainIDSuffix = "_blockchain_id" - rpcURLSuffix = "_rpc_url" - wsURLSuffix = "_ws_url" - userAddress = "user_address" - userPrivateKey = "user_private_key" - - receiveCrossChainMessageEventName = "ReceiveCrossChainMessage" - receiveCrossChainMessageLookBackBlocks = 500 - - privateKeyHexLength = 64 -) - -var errInvalidPrivateKeyString = errors.New("invalid private key string") - -var _ interfaces.Network = &testNetwork{} - -type testNetwork struct { - teleporterContractAddress common.Address - primaryNetwork *interfaces.SubnetTestInfo - subnetsInfo map[ids.ID]*interfaces.SubnetTestInfo - fundedAddress common.Address - fundedKey *ecdsa.PrivateKey -} - -func initializeSubnetInfo( - subnetPrefix string, - teleporterContractAddress common.Address, -) (interfaces.SubnetTestInfo, error) { - subnetIDStr := os.Getenv(subnetPrefix + subnetIDSuffix) - subnetID, err := ids.FromString(subnetIDStr) - if err != nil { - log.Info("Error decoding subnet ID", "subnetPrefix", subnetPrefix) - return interfaces.SubnetTestInfo{}, err - } - - blockchainIDStr := os.Getenv(subnetPrefix + blockchainIDSuffix) - blockchainID, err := ids.FromString(blockchainIDStr) - if err != nil { - log.Info("Error decoding blockchain ID", "subnetPrefix", subnetPrefix) - return interfaces.SubnetTestInfo{}, err - } - - rpcURLStr := os.Getenv(subnetPrefix + rpcURLSuffix) - - // Create the client using a cookiejar to try to use the same node for each - // request when using public RPC endpoints. Having requests routed to different - // nodes behind a load balancer may cause issues with nodes serving slightly stale - // data from before they see recently accepted transactions. Responses generally - // have cookies identifying which node served the request, and those cookies can - // be added to the cookiejar to be included on future requests to attempt to have - // the same node serve it. - // See here: https://docs.avax.network/tooling/rpc-providers#sticky-sessions - jar, err := cookiejar.New(nil) - if err != nil { - return interfaces.SubnetTestInfo{}, err - } - - httpClient := &http.Client{ - Jar: jar, - } - - rpcClient, err := rpc.DialOptions( - context.Background(), - rpcURLStr, - rpc.WithHTTPClient(httpClient), - ) - if err != nil { - return interfaces.SubnetTestInfo{}, err - } - - ethClient := ethclient.NewClient(rpcClient) - - evmChainID, err := ethClient.ChainID(context.Background()) - if err != nil { - return interfaces.SubnetTestInfo{}, err - } - - teleporterRegistryAddressStr := os.Getenv(subnetPrefix + teleporterRegistryAddressSuffix) - if !common.IsHexAddress(teleporterRegistryAddressStr) { - return interfaces.SubnetTestInfo{}, errors.New("invalid teleporter regirstry address") - } - teleporterRegistryAddress := common.HexToAddress(teleporterRegistryAddressStr) - - teleporterMessenger, err := teleportermessenger.NewTeleporterMessenger( - teleporterContractAddress, ethClient, - ) - if err != nil { - return interfaces.SubnetTestInfo{}, err - } - - teleporterRegistry, err := teleporterregistry.NewTeleporterRegistry(teleporterRegistryAddress, ethClient) - if err != nil { - return interfaces.SubnetTestInfo{}, err - } - - return interfaces.SubnetTestInfo{ - SubnetID: subnetID, - BlockchainID: blockchainID, - NodeURIs: []string{}, // no specific node URIs for a testnet subnet, only RPC endpoints. - RPCClient: ethClient, - WSClient: nil, - EVMChainID: evmChainID, - TeleporterRegistryAddress: teleporterRegistryAddress, - TeleporterRegistry: teleporterRegistry, - TeleporterMessenger: teleporterMessenger, - }, nil -} - -func NewTestNetwork() (*testNetwork, error) { - teleporterContractAddressStr := os.Getenv(teleporterContractAddress) - teleporterContractAddress := common.HexToAddress(teleporterContractAddressStr) - log.Info("Set teleporter contract address", "teleporterContractAddress", teleporterContractAddressStr) - - subnetAInfo, err := initializeSubnetInfo(subnetAPrefix, teleporterContractAddress) - if err != nil { - return nil, err - } - - subnetBInfo, err := initializeSubnetInfo(subnetBPrefix, teleporterContractAddress) - if err != nil { - return nil, err - } - - cChainInfo, err := initializeSubnetInfo(cChainPrefix, teleporterContractAddress) - if err != nil { - return nil, err - } - log.Info("Set testnet subnet info", subnetAPrefix, subnetAInfo, subnetBPrefix, subnetBInfo) - - fundedAddressStr := os.Getenv(userAddress) - fundedKeyStr := os.Getenv(userPrivateKey) - if len(fundedKeyStr) >= 2 && fundedKeyStr[0:2] == "0x" { - fundedKeyStr = fundedKeyStr[2:] - } - if len(fundedKeyStr) != privateKeyHexLength { - return nil, errInvalidPrivateKeyString - } - fundedKey, err := crypto.HexToECDSA(fundedKeyStr) - if err != nil { - return nil, err - } - log.Info("Set user funded address", "address", fundedAddressStr) - - subnetsInfo := make(map[ids.ID]*interfaces.SubnetTestInfo) - subnetsInfo[subnetAInfo.SubnetID] = &subnetAInfo - subnetsInfo[subnetBInfo.SubnetID] = &subnetBInfo - return &testNetwork{ - teleporterContractAddress: teleporterContractAddress, - primaryNetwork: &cChainInfo, - subnetsInfo: subnetsInfo, - fundedAddress: common.HexToAddress(fundedAddressStr), - fundedKey: fundedKey, - }, nil -} - -func (n *testNetwork) GetPrimaryNetworkInfo() interfaces.SubnetTestInfo { - return *n.primaryNetwork -} - -func (n *testNetwork) GetSubnetsInfo() []interfaces.SubnetTestInfo { - subnetsInfo := make([]interfaces.SubnetTestInfo, 0, len(n.subnetsInfo)) - for _, subnetInfo := range n.subnetsInfo { - subnetsInfo = append(subnetsInfo, *subnetInfo) - } - return subnetsInfo -} - -// Returns subnet info for all subnets, including the primary network -func (n *testNetwork) GetAllSubnetsInfo() []interfaces.SubnetTestInfo { - subnets := n.GetSubnetsInfo() - return append(subnets, n.GetPrimaryNetworkInfo()) -} - -func (n *testNetwork) GetTeleporterContractAddress() common.Address { - return n.teleporterContractAddress -} - -func (n *testNetwork) SetTeleporterContractAddress(newTeleporterAddress common.Address) { - n.teleporterContractAddress = newTeleporterAddress - subnets := n.GetAllSubnetsInfo() - for _, subnetInfo := range subnets { - teleporterMessenger, err := teleportermessenger.NewTeleporterMessenger( - n.teleporterContractAddress, subnetInfo.RPCClient, - ) - Expect(err).Should(BeNil()) - if subnetInfo.SubnetID == constants.PrimaryNetworkID { - n.primaryNetwork.TeleporterMessenger = teleporterMessenger - } else { - n.subnetsInfo[subnetInfo.SubnetID].TeleporterMessenger = teleporterMessenger - } - } -} - -func (n *testNetwork) GetFundedAccountInfo() (common.Address, *ecdsa.PrivateKey) { - return n.fundedAddress, n.fundedKey -} - -func (n *testNetwork) IsExternalNetwork() bool { - return true -} - -func (n *testNetwork) SupportsIndependentRelaying() bool { - // The test application cannot relay its own messages on testnets - // because it can't query validators directly for their BLS signatures. - return false -} - -// For testnet messages, rely on a separately deployed relayer to relay the message. -// The implementation checks for the deliver of the given message on the destination -// within a time window of {relayWaitTime} seconds, and returns the receipt of the -// transaction that delivered the message. -func (n *testNetwork) RelayMessage( - ctx context.Context, - sourceReceipt *types.Receipt, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, - expectSuccess bool, -) *types.Receipt { - // Get the Teleporter message ID from the receipt - sendEvent, err := utils.GetEventFromLogs( - sourceReceipt.Logs, source.TeleporterMessenger.ParseSendCrossChainMessage, - ) - Expect(err).Should(BeNil()) - - teleporterMessageID := sendEvent.MessageID - - receipt, err := n.getMessageDeliveryTransactionReceipt(ctx, source.BlockchainID, destination, teleporterMessageID) - Expect(err).Should(BeNil()) - Expect(receipt).ShouldNot(BeNil()) - Expect(receipt.Status).Should(Equal(types.ReceiptStatusSuccessful)) - return receipt -} - -func (n *testNetwork) getMessageDeliveryTransactionReceipt( - ctx context.Context, - sourceBlockchainID ids.ID, - destination interfaces.SubnetTestInfo, - teleporterMessageID ids.ID, -) (*types.Receipt, error) { - // Wait until the message is delivered. - queryTicker := time.NewTicker(time.Millisecond * 500) - defer queryTicker.Stop() - - // Wait a maximum of 20 seconds. - cctx, cancel := context.WithTimeout(ctx, 20*time.Second) - defer cancel() - - for { - delivered, err := destination.TeleporterMessenger.MessageReceived(&bind.CallOpts{}, teleporterMessageID) - if err != nil { - return nil, err - } - if delivered { - break - } - - // Wait for the next round. - select { - case <-cctx.Done(): - return nil, cctx.Err() - case <-queryTicker.C: - } - } - - // Get the latest block height - currentBlockHeight, err := destination.RPCClient.BlockNumber(ctx) - if err != nil { - return nil, err - } - - var startBlock uint64 - if currentBlockHeight > receiveCrossChainMessageLookBackBlocks { - startBlock = currentBlockHeight - receiveCrossChainMessageLookBackBlocks - } else { - startBlock = 0 - } - - // Get the log event of the delivery. The log must be in the last {receiveCrossChainMessageLookBackBlocks} blocks. - logIter, err := destination.TeleporterMessenger.FilterReceiveCrossChainMessage( - &bind.FilterOpts{ - Start: startBlock, - Context: cctx, - }, - [][32]byte{teleporterMessageID}, - [][32]byte{sourceBlockchainID}, - nil, - ) - if err != nil { - return nil, err - } - - // There should be exactly one matching event. - if !logIter.Next() { - return nil, errors.New("failed to find ReceiveCrossChainMessage log for relayed message") - } - receiveEvent := logIter.Event - if logIter.Next() { - return nil, errors.New("found multiple ReceiveCrossChainMessage logs for relayed message") - } - - // The transaction should already be mined, but WaitMined will also wait for the eth_blockNumber - // endpoint to reflect the block that the transaction has been included in. - return utils.WaitMined(ctx, destination.RPCClient, receiveEvent.Raw.TxHash) -} - -func (n *testNetwork) GetSignedMessage( - ctx context.Context, - source interfaces.SubnetTestInfo, - destination interfaces.SubnetTestInfo, - unsignedWarpMessageID ids.ID, -) *avalancheWarp.Message { - Expect(len(source.NodeURIs)).Should(BeNumerically(">", 0)) - warpClient, err := warpBackend.NewClient(source.NodeURIs[0], source.BlockchainID.String()) - Expect(err).Should(BeNil()) - - signingSubnetID := source.SubnetID - if source.SubnetID == constants.PrimaryNetworkID { - signingSubnetID = destination.SubnetID - } - - signedWarpMessageBytes, err := warpClient.GetMessageAggregateSignature( - ctx, - unsignedWarpMessageID, - warp.WarpDefaultQuorumNumerator, - signingSubnetID.String(), - ) - Expect(err).Should(BeNil()) - - signedWarpMsg, err := avalancheWarp.ParseMessage(signedWarpMessageBytes) - Expect(err).Should(BeNil()) - - return signedWarpMsg -} +// import ( +// "context" +// "crypto/ecdsa" +// "errors" +// "net/http" +// "net/http/cookiejar" +// "os" +// "time" + +// "github.com/ava-labs/avalanchego/ids" +// "github.com/ava-labs/avalanchego/utils/constants" +// avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" +// "github.com/ava-labs/subnet-evm/accounts/abi/bind" +// "github.com/ava-labs/subnet-evm/core/types" +// "github.com/ava-labs/subnet-evm/ethclient" +// "github.com/ava-labs/subnet-evm/precompile/contracts/warp" +// "github.com/ava-labs/subnet-evm/rpc" +// warpBackend "github.com/ava-labs/subnet-evm/warp" +// teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" +// teleporterregistry "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/registry/TeleporterRegistry" +// "github.com/ava-labs/teleporter/tests/interfaces" +// "github.com/ava-labs/teleporter/tests/utils" +// "github.com/ethereum/go-ethereum/common" +// "github.com/ethereum/go-ethereum/crypto" +// "github.com/ethereum/go-ethereum/log" + +// . "github.com/onsi/gomega" +// ) + +// const ( +// subnetAPrefix = "subnet_a" +// subnetBPrefix = "subnet_b" +// subnetCPrefix = "subnet_c" +// cChainPrefix = "c_chain" +// teleporterContractAddress = "teleporter_contract_address" +// teleporterRegistryAddressSuffix = "_teleporter_registry_address" +// subnetIDSuffix = "_subnet_id" +// blockchainIDSuffix = "_blockchain_id" +// rpcURLSuffix = "_rpc_url" +// wsURLSuffix = "_ws_url" +// userAddress = "user_address" +// userPrivateKey = "user_private_key" + +// receiveCrossChainMessageEventName = "ReceiveCrossChainMessage" +// receiveCrossChainMessageLookBackBlocks = 500 + +// privateKeyHexLength = 64 +// ) + +// var errInvalidPrivateKeyString = errors.New("invalid private key string") + +// var _ interfaces.Network = &testNetwork{} + +// type testNetwork struct { +// teleporterContractAddress common.Address +// primaryNetwork *interfaces.SubnetTestInfo +// subnetsInfo map[ids.ID]*interfaces.SubnetTestInfo +// fundedAddress common.Address +// fundedKey *ecdsa.PrivateKey +// } + +// func initializeSubnetInfo( +// subnetPrefix string, +// teleporterContractAddress common.Address, +// ) (interfaces.SubnetTestInfo, error) { +// subnetIDStr := os.Getenv(subnetPrefix + subnetIDSuffix) +// subnetID, err := ids.FromString(subnetIDStr) +// if err != nil { +// log.Info("Error decoding subnet ID", "subnetPrefix", subnetPrefix) +// return interfaces.SubnetTestInfo{}, err +// } + +// blockchainIDStr := os.Getenv(subnetPrefix + blockchainIDSuffix) +// blockchainID, err := ids.FromString(blockchainIDStr) +// if err != nil { +// log.Info("Error decoding blockchain ID", "subnetPrefix", subnetPrefix) +// return interfaces.SubnetTestInfo{}, err +// } + +// rpcURLStr := os.Getenv(subnetPrefix + rpcURLSuffix) + +// // Create the client using a cookiejar to try to use the same node for each +// // request when using public RPC endpoints. Having requests routed to different +// // nodes behind a load balancer may cause issues with nodes serving slightly stale +// // data from before they see recently accepted transactions. Responses generally +// // have cookies identifying which node served the request, and those cookies can +// // be added to the cookiejar to be included on future requests to attempt to have +// // the same node serve it. +// // See here: https://docs.avax.network/tooling/rpc-providers#sticky-sessions +// jar, err := cookiejar.New(nil) +// if err != nil { +// return interfaces.SubnetTestInfo{}, err +// } + +// httpClient := &http.Client{ +// Jar: jar, +// } + +// rpcClient, err := rpc.DialOptions( +// context.Background(), +// rpcURLStr, +// rpc.WithHTTPClient(httpClient), +// ) +// if err != nil { +// return interfaces.SubnetTestInfo{}, err +// } + +// ethClient := ethclient.NewClient(rpcClient) + +// evmChainID, err := ethClient.ChainID(context.Background()) +// if err != nil { +// return interfaces.SubnetTestInfo{}, err +// } + +// teleporterRegistryAddressStr := os.Getenv(subnetPrefix + teleporterRegistryAddressSuffix) +// if !common.IsHexAddress(teleporterRegistryAddressStr) { +// return interfaces.SubnetTestInfo{}, errors.New("invalid teleporter regirstry address") +// } +// teleporterRegistryAddress := common.HexToAddress(teleporterRegistryAddressStr) + +// teleporterMessenger, err := teleportermessenger.NewTeleporterMessenger( +// teleporterContractAddress, ethClient, +// ) +// if err != nil { +// return interfaces.SubnetTestInfo{}, err +// } + +// teleporterRegistry, err := teleporterregistry.NewTeleporterRegistry(teleporterRegistryAddress, ethClient) +// if err != nil { +// return interfaces.SubnetTestInfo{}, err +// } + +// return interfaces.SubnetTestInfo{ +// SubnetID: subnetID, +// BlockchainID: blockchainID, +// NodeURIs: []string{}, // no specific node URIs for a testnet subnet, only RPC endpoints. +// RPCClient: ethClient, +// WSClient: nil, +// EVMChainID: evmChainID, +// TeleporterRegistryAddress: teleporterRegistryAddress, +// TeleporterRegistry: teleporterRegistry, +// TeleporterMessenger: teleporterMessenger, +// }, nil +// } + +// func NewTestNetwork() (*testNetwork, error) { +// teleporterContractAddressStr := os.Getenv(teleporterContractAddress) +// teleporterContractAddress := common.HexToAddress(teleporterContractAddressStr) +// log.Info("Set teleporter contract address", "teleporterContractAddress", teleporterContractAddressStr) + +// subnetAInfo, err := initializeSubnetInfo(subnetAPrefix, teleporterContractAddress) +// if err != nil { +// return nil, err +// } + +// subnetBInfo, err := initializeSubnetInfo(subnetBPrefix, teleporterContractAddress) +// if err != nil { +// return nil, err +// } + +// cChainInfo, err := initializeSubnetInfo(cChainPrefix, teleporterContractAddress) +// if err != nil { +// return nil, err +// } +// log.Info("Set testnet subnet info", subnetAPrefix, subnetAInfo, subnetBPrefix, subnetBInfo) + +// fundedAddressStr := os.Getenv(userAddress) +// fundedKeyStr := os.Getenv(userPrivateKey) +// if len(fundedKeyStr) >= 2 && fundedKeyStr[0:2] == "0x" { +// fundedKeyStr = fundedKeyStr[2:] +// } +// if len(fundedKeyStr) != privateKeyHexLength { +// return nil, errInvalidPrivateKeyString +// } +// fundedKey, err := crypto.HexToECDSA(fundedKeyStr) +// if err != nil { +// return nil, err +// } +// log.Info("Set user funded address", "address", fundedAddressStr) + +// subnetsInfo := make(map[ids.ID]*interfaces.SubnetTestInfo) +// subnetsInfo[subnetAInfo.SubnetID] = &subnetAInfo +// subnetsInfo[subnetBInfo.SubnetID] = &subnetBInfo +// return &testNetwork{ +// teleporterContractAddress: teleporterContractAddress, +// primaryNetwork: &cChainInfo, +// subnetsInfo: subnetsInfo, +// fundedAddress: common.HexToAddress(fundedAddressStr), +// fundedKey: fundedKey, +// }, nil +// } + +// func (n *testNetwork) GetPrimaryNetworkInfo() interfaces.SubnetTestInfo { +// return *n.primaryNetwork +// } + +// func (n *testNetwork) GetSubnetsInfo() []interfaces.SubnetTestInfo { +// subnetsInfo := make([]interfaces.SubnetTestInfo, 0, len(n.subnetsInfo)) +// for _, subnetInfo := range n.subnetsInfo { +// subnetsInfo = append(subnetsInfo, *subnetInfo) +// } +// return subnetsInfo +// } + +// // Returns subnet info for all subnets, including the primary network +// func (n *testNetwork) GetAllSubnetsInfo() []interfaces.SubnetTestInfo { +// subnets := n.GetSubnetsInfo() +// return append(subnets, n.GetPrimaryNetworkInfo()) +// } + +// func (n *testNetwork) GetTeleporterContractAddress() common.Address { +// return n.teleporterContractAddress +// } + +// func (n *testNetwork) SetTeleporterContractAddress(newTeleporterAddress common.Address) { +// n.teleporterContractAddress = newTeleporterAddress +// subnets := n.GetAllSubnetsInfo() +// for _, subnetInfo := range subnets { +// teleporterMessenger, err := teleportermessenger.NewTeleporterMessenger( +// n.teleporterContractAddress, subnetInfo.RPCClient, +// ) +// Expect(err).Should(BeNil()) +// if subnetInfo.SubnetID == constants.PrimaryNetworkID { +// n.primaryNetwork.TeleporterMessenger = teleporterMessenger +// } else { +// n.subnetsInfo[subnetInfo.SubnetID].TeleporterMessenger = teleporterMessenger +// } +// } +// } + +// func (n *testNetwork) GetFundedAccountInfo() (common.Address, *ecdsa.PrivateKey) { +// return n.fundedAddress, n.fundedKey +// } + +// func (n *testNetwork) IsExternalNetwork() bool { +// return true +// } + +// func (n *testNetwork) SupportsIndependentRelaying() bool { +// // The test application cannot relay its own messages on testnets +// // because it can't query validators directly for their BLS signatures. +// return false +// } + +// // For testnet messages, rely on a separately deployed relayer to relay the message. +// // The implementation checks for the deliver of the given message on the destination +// // within a time window of {relayWaitTime} seconds, and returns the receipt of the +// // transaction that delivered the message. +// func (n *testNetwork) RelayMessage( +// ctx context.Context, +// sourceReceipt *types.Receipt, +// source interfaces.SubnetTestInfo, +// destination interfaces.SubnetTestInfo, +// expectSuccess bool, +// ) *types.Receipt { +// // Get the Teleporter message ID from the receipt +// sendEvent, err := utils.GetEventFromLogs( +// sourceReceipt.Logs, source.TeleporterMessenger.ParseSendCrossChainMessage, +// ) +// Expect(err).Should(BeNil()) + +// teleporterMessageID := sendEvent.MessageID + +// receipt, err := n.getMessageDeliveryTransactionReceipt(ctx, source.BlockchainID, destination, teleporterMessageID) +// Expect(err).Should(BeNil()) +// Expect(receipt).ShouldNot(BeNil()) +// Expect(receipt.Status).Should(Equal(types.ReceiptStatusSuccessful)) +// return receipt +// } + +// func (n *testNetwork) getMessageDeliveryTransactionReceipt( +// ctx context.Context, +// sourceBlockchainID ids.ID, +// destination interfaces.SubnetTestInfo, +// teleporterMessageID ids.ID, +// ) (*types.Receipt, error) { +// // Wait until the message is delivered. +// queryTicker := time.NewTicker(time.Millisecond * 500) +// defer queryTicker.Stop() + +// // Wait a maximum of 20 seconds. +// cctx, cancel := context.WithTimeout(ctx, 20*time.Second) +// defer cancel() + +// for { +// delivered, err := destination.TeleporterMessenger.MessageReceived(&bind.CallOpts{}, teleporterMessageID) +// if err != nil { +// return nil, err +// } +// if delivered { +// break +// } + +// // Wait for the next round. +// select { +// case <-cctx.Done(): +// return nil, cctx.Err() +// case <-queryTicker.C: +// } +// } + +// // Get the latest block height +// currentBlockHeight, err := destination.RPCClient.BlockNumber(ctx) +// if err != nil { +// return nil, err +// } + +// var startBlock uint64 +// if currentBlockHeight > receiveCrossChainMessageLookBackBlocks { +// startBlock = currentBlockHeight - receiveCrossChainMessageLookBackBlocks +// } else { +// startBlock = 0 +// } + +// // Get the log event of the delivery. The log must be in the last {receiveCrossChainMessageLookBackBlocks} blocks. +// logIter, err := destination.TeleporterMessenger.FilterReceiveCrossChainMessage( +// &bind.FilterOpts{ +// Start: startBlock, +// Context: cctx, +// }, +// [][32]byte{teleporterMessageID}, +// [][32]byte{sourceBlockchainID}, +// nil, +// ) +// if err != nil { +// return nil, err +// } + +// // There should be exactly one matching event. +// if !logIter.Next() { +// return nil, errors.New("failed to find ReceiveCrossChainMessage log for relayed message") +// } +// receiveEvent := logIter.Event +// if logIter.Next() { +// return nil, errors.New("found multiple ReceiveCrossChainMessage logs for relayed message") +// } + +// // The transaction should already be mined, but WaitMined will also wait for the eth_blockNumber +// // endpoint to reflect the block that the transaction has been included in. +// return utils.WaitMined(ctx, destination.RPCClient, receiveEvent.Raw.TxHash) +// } + +// func (n *testNetwork) GetSignedMessage( +// ctx context.Context, +// source interfaces.SubnetTestInfo, +// destination interfaces.SubnetTestInfo, +// unsignedWarpMessageID ids.ID, +// ) *avalancheWarp.Message { +// Expect(len(source.NodeURIs)).Should(BeNumerically(">", 0)) +// warpClient, err := warpBackend.NewClient(source.NodeURIs[0], source.BlockchainID.String()) +// Expect(err).Should(BeNil()) + +// signingSubnetID := source.SubnetID +// if source.SubnetID == constants.PrimaryNetworkID { +// signingSubnetID = destination.SubnetID +// } + +// signedWarpMessageBytes, err := warpClient.GetMessageAggregateSignature( +// ctx, +// unsignedWarpMessageID, +// warp.WarpDefaultQuorumNumerator, +// signingSubnetID.String(), +// ) +// Expect(err).Should(BeNil()) + +// signedWarpMsg, err := avalancheWarp.ParseMessage(signedWarpMessageBytes) +// Expect(err).Should(BeNil()) + +// return signedWarpMsg +// } diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 27778d27b..659d15bfb 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -493,6 +493,7 @@ func GetChainConfigWithOffChainMessages(offChainMessages []avalancheWarp.Unsigne // read in the template file, make the substitutions declared at the beginning // of the function, write out the instantiation to a temp file, and then return // the path to that temp file. +// TODONOW: Make Teleporter options optional func InstantiateGenesisTemplate( templateFileName string, chainID uint64, @@ -692,7 +693,7 @@ func GetSignedMessage( } // Get the aggregate signature for the Warp message - // TODO: use signature aggregator + // TODONOW: use signature aggregator signedWarpMessageBytes, err := warpClient.GetMessageAggregateSignature( ctx, unsignedWarpMessageID, diff --git a/tests/utils/teleporter.go b/tests/utils/teleporter.go index 7f9840824..5864f946c 100644 --- a/tests/utils/teleporter.go +++ b/tests/utils/teleporter.go @@ -13,6 +13,7 @@ import ( "github.com/ava-labs/subnet-evm/core/types" "github.com/ava-labs/subnet-evm/precompile/contracts/warp" predicateutils "github.com/ava-labs/subnet-evm/predicate" + "github.com/ava-labs/subnet-evm/rpc" validatorsetsig "github.com/ava-labs/teleporter/abi-bindings/go/governance/ValidatorSetSig" exampleerc20 "github.com/ava-labs/teleporter/abi-bindings/go/mocks/ExampleERC20" teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" @@ -22,6 +23,7 @@ import ( deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" gasUtils "github.com/ava-labs/teleporter/utils/gas-utils" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/hexutil" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" . "github.com/onsi/gomega" @@ -32,6 +34,140 @@ var ( DefaultTeleporterTransactionValue = common.Big0 ) +type ChainTeleporterInfo struct { + TeleporterRegistry *teleporterregistry.TeleporterRegistry + TeleporterRegistryAddress common.Address + + TeleporterMessenger *teleportermessenger.TeleporterMessenger + TeleporterMessengerAddress common.Address +} + +type TeleporterTestInfo map[ids.ID]*ChainTeleporterInfo + +func NewTeleporterTestInfo(subnets []interfaces.SubnetTestInfo) TeleporterTestInfo { + t := make(TeleporterTestInfo) + for _, subnet := range subnets { + t[subnet.BlockchainID] = &ChainTeleporterInfo{} + } + return t +} + +func (t TeleporterTestInfo) SetTeleporter(address common.Address, subnet interfaces.SubnetTestInfo) { + teleporterMessenger, err := teleportermessenger.NewTeleporterMessenger( + address, subnet.RPCClient, + ) + Expect(err).Should(BeNil()) + info := t[subnet.BlockchainID] + info.TeleporterMessengerAddress = address + info.TeleporterMessenger = teleporterMessenger +} + +func (t TeleporterTestInfo) InitializeBlockchainID(subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey) { + opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + tx, err := t[subnet.BlockchainID].TeleporterMessenger.InitializeBlockchainID(opts) + Expect(err).Should(BeNil()) + WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) +} + +func (t TeleporterTestInfo) DeployTeleporterRegistry(subnet interfaces.SubnetTestInfo, deployerKey *ecdsa.PrivateKey) { + ctx := context.Background() + entries := []teleporterregistry.ProtocolRegistryEntry{ + { + Version: big.NewInt(1), + ProtocolAddress: t[subnet.BlockchainID].TeleporterMessengerAddress, + }, + } + opts, err := bind.NewKeyedTransactorWithChainID(deployerKey, subnet.EVMChainID) + Expect(err).Should(BeNil()) + teleporterRegistryAddress, tx, teleporterRegistry, err := teleporterregistry.DeployTeleporterRegistry( + opts, subnet.RPCClient, entries, + ) + Expect(err).Should(BeNil()) + // Wait for the transaction to be mined + WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + + info := t[subnet.BlockchainID] + info.TeleporterRegistryAddress = teleporterRegistryAddress + info.TeleporterRegistry = teleporterRegistry +} + +func (t TeleporterTestInfo) DeployTeleporterMessenger( + ctx context.Context, + subnet interfaces.SubnetTestInfo, + transactionBytes []byte, + deployerAddress common.Address, + contractAddress common.Address, + fundedKey *ecdsa.PrivateKey, +) { + // Fund the deployer address + fundAmount := big.NewInt(0).Mul(big.NewInt(1e18), big.NewInt(11)) // 11 AVAX + fundDeployerTx := CreateNativeTransferTransaction( + ctx, subnet, fundedKey, deployerAddress, fundAmount, + ) + SendTransactionAndWaitForSuccess(ctx, subnet, fundDeployerTx) + + log.Info("Finished funding Teleporter deployer", "blockchainID", subnet.BlockchainID.Hex()) + + // Deploy Teleporter contract + rpcClient, err := rpc.DialContext( + ctx, + HttpToRPCURI(subnet.NodeURIs[0], subnet.BlockchainID.String()), + ) + Expect(err).Should(BeNil()) + defer rpcClient.Close() + + txHash := common.Hash{} + err = rpcClient.CallContext(ctx, &txHash, "eth_sendRawTransaction", hexutil.Encode(transactionBytes)) + Expect(err).Should(BeNil()) + WaitForTransactionSuccess(ctx, subnet, txHash) + + teleporterCode, err := subnet.RPCClient.CodeAt(ctx, contractAddress, nil) + Expect(err).Should(BeNil()) + Expect(len(teleporterCode)).Should(BeNumerically(">", 2)) // 0x is an EOA, contract returns the bytecode +} + +func (t TeleporterTestInfo) RelayTeleporterMessage( + ctx context.Context, + sourceReceipt *types.Receipt, + source interfaces.SubnetTestInfo, + destination interfaces.SubnetTestInfo, + expectSuccess bool, + fundedKey *ecdsa.PrivateKey, +) *types.Receipt { + // Fetch the Teleporter message from the logs + sendEvent, err := GetEventFromLogs(sourceReceipt.Logs, t[source.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) + Expect(err).Should(BeNil()) + + signedWarpMessage := ConstructSignedWarpMessage(ctx, sourceReceipt, source, destination) + + // Construct the transaction to send the Warp message to the destination chain + signedTx := CreateReceiveCrossChainMessageTransaction( + ctx, + signedWarpMessage, + sendEvent.Message.RequiredGasLimit, + t[source.BlockchainID].TeleporterMessengerAddress, + fundedKey, + destination, + ) + + log.Info("Sending transaction to destination chain") + if !expectSuccess { + return SendTransactionAndWaitForFailure(ctx, destination, signedTx) + } + + receipt := SendTransactionAndWaitForSuccess(ctx, destination, signedTx) + + // Check the transaction logs for the ReceiveCrossChainMessage event emitted by the Teleporter contract + receiveEvent, err := GetEventFromLogs( + receipt.Logs, + t[destination.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage, + ) + Expect(err).Should(BeNil()) + Expect(receiveEvent.SourceBlockchainID[:]).Should(Equal(source.BlockchainID[:])) + return receipt +} + // // Deployment utils // @@ -40,7 +176,8 @@ var ( // Does NOT modify the global Teleporter contract address to provide greater testing flexibility. func DeployNewTeleporterVersion( ctx context.Context, - network interfaces.LocalNetwork, + teleporterInfo TeleporterTestInfo, + subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey, teleporterByteCodeFile string, ) common.Address { @@ -56,12 +193,15 @@ func DeployNewTeleporterVersion( ) Expect(err).Should(BeNil()) - network.DeployTeleporterContractToAllChains( + teleporterInfo.DeployTeleporterMessenger( + ctx, + subnet, teleporterDeployerTransaction, teleporterDeployerAddress, teleporterContractAddress, fundedKey, ) + return teleporterContractAddress } @@ -69,6 +209,7 @@ func DeployTestMessenger( ctx context.Context, senderKey *ecdsa.PrivateKey, teleporterManager common.Address, + registryAddress common.Address, subnet interfaces.SubnetTestInfo, ) (common.Address, *testmessenger.TestMessenger) { opts, err := bind.NewKeyedTransactorWithChainID( @@ -79,7 +220,7 @@ func DeployTestMessenger( address, tx, exampleMessenger, err := testmessenger.DeployTestMessenger( opts, subnet.RPCClient, - subnet.TeleporterRegistryAddress, + registryAddress, teleporterManager, big.NewInt(1), ) @@ -147,21 +288,23 @@ func SendAddFeeAmountAndWaitForAcceptance( func RetryMessageExecutionAndWaitForAcceptance( ctx context.Context, sourceBlockchainID ids.ID, - subnet interfaces.SubnetTestInfo, + destinationTeleporterMessenger *teleportermessenger.TeleporterMessenger, + destinationSubnet interfaces.SubnetTestInfo, message teleportermessenger.TeleporterMessage, senderKey *ecdsa.PrivateKey, ) *types.Receipt { - opts, err := bind.NewKeyedTransactorWithChainID(senderKey, subnet.EVMChainID) + opts, err := bind.NewKeyedTransactorWithChainID(senderKey, destinationSubnet.EVMChainID) Expect(err).Should(BeNil()) - tx, err := subnet.TeleporterMessenger.RetryMessageExecution(opts, sourceBlockchainID, message) + tx, err := destinationTeleporterMessenger.RetryMessageExecution(opts, sourceBlockchainID, message) Expect(err).Should(BeNil()) - return WaitForTransactionSuccess(ctx, subnet, tx.Hash()) + return WaitForTransactionSuccess(ctx, destinationSubnet, tx.Hash()) } func RedeemRelayerRewardsAndConfirm( ctx context.Context, + teleporterMessenger *teleportermessenger.TeleporterMessenger, subnet interfaces.SubnetTestInfo, feeToken *exampleerc20.ExampleERC20, feeTokenAddress common.Address, @@ -181,7 +324,7 @@ func RedeemRelayerRewardsAndConfirm( redeemerKey, subnet.EVMChainID, ) Expect(err).Should(BeNil()) - tx, err := subnet.TeleporterMessenger.RedeemRelayerRewards( + tx, err := teleporterMessenger.RedeemRelayerRewards( txOpts, feeTokenAddress, ) Expect(err).Should(BeNil()) @@ -201,7 +344,7 @@ func RedeemRelayerRewardsAndConfirm( ) // Check that the redeemable rewards amount is now zero. - updatedRewardAmount, err := subnet.TeleporterMessenger.CheckRelayerRewardAmount( + updatedRewardAmount, err := teleporterMessenger.CheckRelayerRewardAmount( &bind.CallOpts{}, redeemerAddress, feeTokenAddress, @@ -214,6 +357,7 @@ func RedeemRelayerRewardsAndConfirm( func SendSpecifiedReceiptsAndWaitForAcceptance( ctx context.Context, + sourceTeleporterMessenger *teleportermessenger.TeleporterMessenger, source interfaces.SubnetTestInfo, destinationBlockchainID ids.ID, messageIDs [][32]byte, @@ -224,14 +368,14 @@ func SendSpecifiedReceiptsAndWaitForAcceptance( opts, err := bind.NewKeyedTransactorWithChainID(senderKey, source.EVMChainID) Expect(err).Should(BeNil()) - tx, err := source.TeleporterMessenger.SendSpecifiedReceipts( + tx, err := sourceTeleporterMessenger.SendSpecifiedReceipts( opts, destinationBlockchainID, messageIDs, feeInfo, allowedRelayerAddresses) Expect(err).Should(BeNil()) receipt := WaitForTransactionSuccess(ctx, source, tx.Hash()) // Check the transaction logs for the SendCrossChainMessage event emitted by the Teleporter contract - event, err := GetEventFromLogs(receipt.Logs, source.TeleporterMessenger.ParseSendCrossChainMessage) + event, err := GetEventFromLogs(receipt.Logs, sourceTeleporterMessenger.ParseSendCrossChainMessage) Expect(err).Should(BeNil()) Expect(event.DestinationBlockchainID[:]).Should(Equal(destinationBlockchainID[:])) @@ -244,7 +388,7 @@ func SendSpecifiedReceiptsAndWaitForAcceptance( func AddProtocolVersionAndWaitForAcceptance( ctx context.Context, - network interfaces.Network, + sourceTeleporterInfo ChainTeleporterInfo, subnet interfaces.SubnetTestInfo, newTeleporterAddress common.Address, senderKey *ecdsa.PrivateKey, @@ -257,23 +401,23 @@ func AddProtocolVersionAndWaitForAcceptance( signedTx := CreateAddProtocolVersionTransaction( ctx, signedWarpMsg, - subnet.TeleporterRegistryAddress, + sourceTeleporterInfo.TeleporterRegistryAddress, senderKey, subnet, ) - curLatestVersion, err := subnet.TeleporterRegistry.LatestVersion(&bind.CallOpts{}) + curLatestVersion, err := sourceTeleporterInfo.TeleporterRegistry.LatestVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) expectedLatestVersion := big.NewInt(curLatestVersion.Int64() + 1) // Wait for tx to be accepted, and verify events emitted receipt := SendTransactionAndWaitForSuccess(ctx, subnet, signedTx) - addProtocolVersionEvent, err := GetEventFromLogs(receipt.Logs, subnet.TeleporterRegistry.ParseAddProtocolVersion) + addProtocolVersionEvent, err := GetEventFromLogs(receipt.Logs, sourceTeleporterInfo.TeleporterRegistry.ParseAddProtocolVersion) Expect(err).Should(BeNil()) Expect(addProtocolVersionEvent.Version.Cmp(expectedLatestVersion)).Should(Equal(0)) Expect(addProtocolVersionEvent.ProtocolAddress).Should(Equal(newTeleporterAddress)) - versionUpdatedEvent, err := GetEventFromLogs(receipt.Logs, subnet.TeleporterRegistry.ParseLatestVersionUpdated) + versionUpdatedEvent, err := GetEventFromLogs(receipt.Logs, sourceTeleporterInfo.TeleporterRegistry.ParseLatestVersionUpdated) Expect(err).Should(BeNil()) Expect(versionUpdatedEvent.OldVersion.Cmp(curLatestVersion)).Should(Equal(0)) Expect(versionUpdatedEvent.NewVersion.Cmp(expectedLatestVersion)).Should(Equal(0)) @@ -281,6 +425,7 @@ func AddProtocolVersionAndWaitForAcceptance( func SendCrossChainMessageAndWaitForAcceptance( ctx context.Context, + sourceTeleporterMessenger *teleportermessenger.TeleporterMessenger, source interfaces.SubnetTestInfo, destination interfaces.SubnetTestInfo, input teleportermessenger.TeleporterMessageInput, @@ -290,14 +435,14 @@ func SendCrossChainMessageAndWaitForAcceptance( Expect(err).Should(BeNil()) // Send a transaction to the Teleporter contract - tx, err := source.TeleporterMessenger.SendCrossChainMessage(opts, input) + tx, err := sourceTeleporterMessenger.SendCrossChainMessage(opts, input) Expect(err).Should(BeNil()) // Wait for the transaction to be accepted receipt := WaitForTransactionSuccess(ctx, source, tx.Hash()) // Check the transaction logs for the SendCrossChainMessage event emitted by the Teleporter contract - event, err := GetEventFromLogs(receipt.Logs, source.TeleporterMessenger.ParseSendCrossChainMessage) + event, err := GetEventFromLogs(receipt.Logs, sourceTeleporterMessenger.ParseSendCrossChainMessage) Expect(err).Should(BeNil()) log.Info("Sending SendCrossChainMessage transaction on source chain", @@ -325,13 +470,12 @@ func CheckReceiptReceived( func ClearReceiptQueue( ctx context.Context, - network interfaces.Network, - fundedKey *ecdsa.PrivateKey, + teleporterInfo TeleporterTestInfo, source interfaces.SubnetTestInfo, destination interfaces.SubnetTestInfo, + fundedKey *ecdsa.PrivateKey, ) { - Expect(network.IsExternalNetwork()).Should(BeFalse()) - outstandReceiptCount := GetOutstandingReceiptCount(source, destination.BlockchainID) + outstandReceiptCount := GetOutstandingReceiptCount(teleporterInfo[source.BlockchainID].TeleporterMessenger, destination.BlockchainID) for outstandReceiptCount.Cmp(big.NewInt(0)) != 0 { log.Info("Emptying receipt queue", "remainingReceipts", outstandReceiptCount.String()) // Send message from Subnet B to Subnet A to trigger the "regular" method of delivering receipts. @@ -351,25 +495,25 @@ func ClearReceiptQueue( // This message will also have the same receipts as the previous message receipt, _ := SendCrossChainMessageAndWaitForAcceptance( - ctx, source, destination, sendCrossChainMessageInput, fundedKey) + ctx, teleporterInfo[source.BlockchainID].TeleporterMessenger, source, destination, sendCrossChainMessageInput, fundedKey) // Relay message - network.RelayMessage(ctx, receipt, source, destination, true) + teleporterInfo.RelayTeleporterMessage(ctx, receipt, source, destination, true, fundedKey) - outstandReceiptCount = GetOutstandingReceiptCount(source, destination.BlockchainID) + outstandReceiptCount = GetOutstandingReceiptCount(teleporterInfo[source.BlockchainID].TeleporterMessenger, destination.BlockchainID) } log.Info("Receipt queue emptied") } -func GetOutstandingReceiptCount(source interfaces.SubnetTestInfo, destinationBlockchainID ids.ID) *big.Int { - size, err := source.TeleporterMessenger.GetReceiptQueueSize(&bind.CallOpts{}, destinationBlockchainID) +func GetOutstandingReceiptCount(teleporterMessenger *teleportermessenger.TeleporterMessenger, destinationBlockchainID ids.ID) *big.Int { + size, err := teleporterMessenger.GetReceiptQueueSize(&bind.CallOpts{}, destinationBlockchainID) Expect(err).Should(BeNil()) return size } func SendExampleCrossChainMessageAndVerify( ctx context.Context, - network interfaces.Network, + teleporterInfo TeleporterTestInfo, source interfaces.SubnetTestInfo, sourceExampleMessenger *testmessenger.TestMessenger, destination interfaces.SubnetTestInfo, @@ -396,7 +540,7 @@ func SendExampleCrossChainMessageAndVerify( // Wait for the transaction to be mined receipt := WaitForTransactionSuccess(ctx, source, tx.Hash()) - event, err := GetEventFromLogs(receipt.Logs, source.TeleporterMessenger.ParseSendCrossChainMessage) + event, err := GetEventFromLogs(receipt.Logs, teleporterInfo[source.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) Expect(err).Should(BeNil()) Expect(event.DestinationBlockchainID[:]).Should(Equal(destination.BlockchainID[:])) @@ -405,12 +549,12 @@ func SendExampleCrossChainMessageAndVerify( // // Relay the message to the destination // - receipt = network.RelayMessage(ctx, receipt, source, destination, true) + receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, source, destination, true, senderKey) // // Check Teleporter message received on the destination // - delivered, err := destination.TeleporterMessenger.MessageReceived( + delivered, err := teleporterInfo[destination.BlockchainID].TeleporterMessenger.MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -418,14 +562,14 @@ func SendExampleCrossChainMessageAndVerify( if expectSuccess { // Check that message execution was successful - messageExecutedEvent, err := GetEventFromLogs(receipt.Logs, destination.TeleporterMessenger.ParseMessageExecuted) + messageExecutedEvent, err := GetEventFromLogs(receipt.Logs, teleporterInfo[destination.BlockchainID].TeleporterMessenger.ParseMessageExecuted) Expect(err).Should(BeNil()) Expect(messageExecutedEvent.MessageID[:]).Should(Equal(teleporterMessageID[:])) } else { // Check that message execution failed messageExecutionFailedEvent, err := GetEventFromLogs( receipt.Logs, - destination.TeleporterMessenger.ParseMessageExecutionFailed, + teleporterInfo[destination.BlockchainID].TeleporterMessenger.ParseMessageExecutionFailed, ) Expect(err).Should(BeNil()) Expect(messageExecutionFailedEvent.MessageID[:]).Should(Equal(teleporterMessageID[:])) @@ -597,10 +741,11 @@ func CreateExecuteCallPredicateTransaction( func InitOffChainMessageChainConfig( networkID uint32, subnet interfaces.SubnetTestInfo, + registryAddress common.Address, teleporterAddress common.Address, version uint64, ) (*avalancheWarp.UnsignedMessage, string) { - unsignedMessage := CreateOffChainRegistryMessage(networkID, subnet, teleporterregistry.ProtocolRegistryEntry{ + unsignedMessage := CreateOffChainRegistryMessage(networkID, subnet, registryAddress, teleporterregistry.ProtocolRegistryEntry{ Version: big.NewInt(int64(version)), ProtocolAddress: teleporterAddress, }) @@ -616,10 +761,11 @@ func InitOffChainMessageChainConfig( func CreateOffChainRegistryMessage( networkID uint32, subnet interfaces.SubnetTestInfo, + registryAddress common.Address, entry teleporterregistry.ProtocolRegistryEntry, ) *avalancheWarp.UnsignedMessage { sourceAddress := []byte{} - payloadBytes, err := teleporterregistry.PackTeleporterRegistryWarpPayload(entry, subnet.TeleporterRegistryAddress) + payloadBytes, err := teleporterregistry.PackTeleporterRegistryWarpPayload(entry, registryAddress) Expect(err).Should(BeNil()) addressedPayload, err := payload.NewAddressedCall(sourceAddress, payloadBytes) diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index b856d8aa8..5324e3e9c 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -54,6 +54,8 @@ const ( DefaultPChainAddress string = "P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u" ) +// TODONOW: Consolidate/generalize all of the repeated methods for ERC20, Native , and POA + // // Deployment utils // From f6c5e23c543bc87d4d6571ef916ccd0bb4bd10bf Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Fri, 11 Oct 2024 16:27:09 -0500 Subject: [PATCH 500/545] optional teleporter genesis spec --- .../local/governance/governance_suite_test.go | 28 ++++--------------- tests/local/network.go | 9 +++--- .../validator_manager_suite_test.go | 28 ++++--------------- tests/utils/chain.go | 10 +++++++ 4 files changed, 27 insertions(+), 48 deletions(-) diff --git a/tests/local/governance/governance_suite_test.go b/tests/local/governance/governance_suite_test.go index f157dc224..731b61330 100644 --- a/tests/local/governance/governance_suite_test.go +++ b/tests/local/governance/governance_suite_test.go @@ -8,7 +8,6 @@ import ( governanceFlows "github.com/ava-labs/teleporter/tests/flows/governance" "github.com/ava-labs/teleporter/tests/local" - deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" "github.com/ethereum/go-ethereum/log" "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -40,15 +39,6 @@ func TestGovernance(t *testing.T) { // Define the Teleporter before and after suite functions. var _ = ginkgo.BeforeSuite(func() { - // Generate the Teleporter deployment values - _, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := - deploymentUtils.ConstructKeylessTransaction( - teleporterByteCodeFile, - false, - deploymentUtils.GetDefaultContractCreationGasPrice(), - ) - Expect(err).Should(BeNil()) - // Create the local network instance ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) defer cancel() @@ -58,20 +48,14 @@ var _ = ginkgo.BeforeSuite(func() { warpGenesisTemplateFile, []local.SubnetSpec{ { - Name: "A", - EVMChainID: 12345, - TeleporterContractAddress: teleporterContractAddress, - TeleporterDeployedBytecode: teleporterDeployedBytecode, - TeleporterDeployerAddress: teleporterDeployerAddress, - NodeCount: 2, + Name: "A", + EVMChainID: 12345, + NodeCount: 2, }, { - Name: "B", - EVMChainID: 54321, - TeleporterContractAddress: teleporterContractAddress, - TeleporterDeployedBytecode: teleporterDeployedBytecode, - TeleporterDeployerAddress: teleporterDeployerAddress, - NodeCount: 2, + Name: "B", + EVMChainID: 54321, + NodeCount: 2, }, }, 2, diff --git a/tests/local/network.go b/tests/local/network.go index 7c252ed27..3359f22b1 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -53,14 +53,15 @@ const ( timeout = 120 * time.Second ) -// TODONOW: Make the Teleporter info optional type SubnetSpec struct { - Name string - EVMChainID uint64 + Name string + EVMChainID uint64 + NodeCount int + + // Optional fields TeleporterContractAddress common.Address TeleporterDeployedBytecode string TeleporterDeployerAddress common.Address - NodeCount int } func NewLocalNetwork( diff --git a/tests/local/validator-manager/validator_manager_suite_test.go b/tests/local/validator-manager/validator_manager_suite_test.go index 76d0b9f8f..1b2ab223f 100644 --- a/tests/local/validator-manager/validator_manager_suite_test.go +++ b/tests/local/validator-manager/validator_manager_suite_test.go @@ -8,7 +8,6 @@ import ( validatorManagerFlows "github.com/ava-labs/teleporter/tests/flows/validator-manager" "github.com/ava-labs/teleporter/tests/local" - deploymentUtils "github.com/ava-labs/teleporter/utils/deployment-utils" "github.com/ethereum/go-ethereum/log" "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -40,15 +39,6 @@ func TestValidatorManager(t *testing.T) { // Define the Teleporter before and after suite functions. var _ = ginkgo.BeforeEach(func() { - // Generate the Teleporter deployment values - _, teleporterDeployedBytecode, teleporterDeployerAddress, teleporterContractAddress, err := - deploymentUtils.ConstructKeylessTransaction( - teleporterByteCodeFile, - false, - deploymentUtils.GetDefaultContractCreationGasPrice(), - ) - Expect(err).Should(BeNil()) - // Create the local network instance ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) defer cancel() @@ -58,20 +48,14 @@ var _ = ginkgo.BeforeEach(func() { warpGenesisTemplateFile, []local.SubnetSpec{ { - Name: "A", - EVMChainID: 12345, - TeleporterContractAddress: teleporterContractAddress, - TeleporterDeployedBytecode: teleporterDeployedBytecode, - TeleporterDeployerAddress: teleporterDeployerAddress, - NodeCount: 2, + Name: "A", + EVMChainID: 12345, + NodeCount: 2, }, { - Name: "B", - EVMChainID: 54321, - TeleporterContractAddress: teleporterContractAddress, - TeleporterDeployedBytecode: teleporterDeployedBytecode, - TeleporterDeployerAddress: teleporterDeployerAddress, - NodeCount: 2, + Name: "B", + EVMChainID: 54321, + NodeCount: 2, }, }, 2, diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 659d15bfb..726dcabb4 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -501,6 +501,16 @@ func InstantiateGenesisTemplate( teleporterDeployedBytecode string, teleporterDeployerAddress common.Address, ) string { + if teleporterContractAddress.Big().Cmp(big.NewInt(0)) == 0 { + teleporterContractAddress = common.HexToAddress("0xffffffffffffffffffffffffffffffffffffffff") + } + if teleporterDeployerAddress.Big().Cmp(big.NewInt(0)) == 0 { + teleporterDeployerAddress = common.HexToAddress("0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") + } + if teleporterDeployedBytecode == "" { + teleporterDeployedBytecode = "0x00" + } + substitutions := []struct { Target string Value string From 944591af2cdd7601b66d5dd49b8ac621a8404e59 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 14 Oct 2024 09:05:34 -0500 Subject: [PATCH 501/545] Remove todo --- tests/utils/chain.go | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/utils/chain.go b/tests/utils/chain.go index 726dcabb4..dbc347015 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -493,7 +493,6 @@ func GetChainConfigWithOffChainMessages(offChainMessages []avalancheWarp.Unsigne // read in the template file, make the substitutions declared at the beginning // of the function, write out the instantiation to a temp file, and then return // the path to that temp file. -// TODONOW: Make Teleporter options optional func InstantiateGenesisTemplate( templateFileName string, chainID uint64, From 33d624ef8cf7405f06ffb087c0f0daecce00986a Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 14 Oct 2024 09:31:16 -0500 Subject: [PATCH 502/545] remove todos --- tests/local/network.go | 4 ---- tests/utils/chain.go | 1 - tests/utils/validator_manager.go | 2 -- 3 files changed, 7 deletions(-) diff --git a/tests/local/network.go b/tests/local/network.go index 3359f22b1..f1797f318 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -175,7 +175,6 @@ func NewLocalNetwork( Expect(err).Should(BeNil()) localNetwork.pChainWallet = wallet.P() - // TODONOW: Convert all subnets to permissionless validation return localNetwork } @@ -320,9 +319,6 @@ func (n *LocalNetwork) TearDownNetwork() { Expect(n.tmpnet.Stop(context.Background())).Should(BeNil()) } -// TODONOW: Rename to AddPermissionedSubnetValidators -// TODONOW: Move to chain utils -// TODONOW: Add an AddPermissionlessSubnetValidators function func (n *LocalNetwork) AddSubnetValidators(ctx context.Context, subnetID ids.ID, count uint) { Expect(count > 0).Should(BeTrue(), "can't add 0 validators") Expect(uint(len(n.extraNodes)) >= count).Should( diff --git a/tests/utils/chain.go b/tests/utils/chain.go index dbc347015..2d872fdc2 100644 --- a/tests/utils/chain.go +++ b/tests/utils/chain.go @@ -702,7 +702,6 @@ func GetSignedMessage( } // Get the aggregate signature for the Warp message - // TODONOW: use signature aggregator signedWarpMessageBytes, err := warpClient.GetMessageAggregateSignature( ctx, unsignedWarpMessageID, diff --git a/tests/utils/validator_manager.go b/tests/utils/validator_manager.go index 5324e3e9c..b856d8aa8 100644 --- a/tests/utils/validator_manager.go +++ b/tests/utils/validator_manager.go @@ -54,8 +54,6 @@ const ( DefaultPChainAddress string = "P-local18jma8ppw3nhx5r4ap8clazz0dps7rv5u00z96u" ) -// TODONOW: Consolidate/generalize all of the repeated methods for ERC20, Native , and POA - // // Deployment utils // From cbe7a7e0ac3ba0ee8dc9a43bfa28c715b1049eb1 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 14 Oct 2024 14:36:21 -0500 Subject: [PATCH 503/545] validate p chain owner --- .../ERC20TokenStakingManager.go | 4 +- .../NativeTokenStakingManager.go | 4 +- .../PoAValidatorManager.go | 4 +- .../validator-manager/ValidatorManager.sol | 26 ++++++- .../tests/ValidatorManagerTests.t.sol | 69 ++++++++++++++++++- 5 files changed, 98 insertions(+), 9 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index a6abacdd7..f62018b5b 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\":\"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\":\"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: "0x608060405234801561000f575f80fd5b50604051615d74380380615d7483398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615c278061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b610209610204366004614e45565b6104a8565b005b610209610219366004614e80565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b366004614e45565b6106eb565b61020961025e366004614e97565b6106f6565b610209610271366004614ee5565b610be2565b610289610284366004614e80565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb366004614e45565b610c6c565b6102096102de366004614f06565b610c77565b6102f66102f1366004614f46565b610d39565b604051908152602001610234565b610209610312366004614fab565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f6610342366004614fd3565b610fd9565b610289610355366004614e80565b610ff2565b6102f65f81565b61020961036f366004614e45565b611006565b610226603081565b61020961038a366004614e80565b611031565b61020961039d366004614fab565b6110fc565b6102f66103b0366004614fec565b6112d4565b6102096103c3366004614f06565b611300565b6102f65f80516020615b9b83398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b610209610410366004614e80565b611489565b6102f65f80516020615bbb83398151915281565b610209610437366004614e80565b611672565b610226601481565b610457610452366004614e80565b6117af565b6040516102349190615081565b6102896202a30081565b6102f65f80516020615b7b83398151915281565b610209610490366004615115565b6118fe565b6102f66104a3366004615153565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615bfb8339815191526020526040808220815160e0810190925280545f80516020615bbb83398151915293929190829060ff16600581111561052a5761052a61500c565b600581111561053b5761053b61500c565b815260200160018201805461054f906151be565b80601f016020809104026020016040519081016040528092919081815260200182805461057b906151be565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156106315761063161500c565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016151f6565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611cbd565b6040518263ffffffff1660e01b81526004016106a59190615204565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e59190615216565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615bbb8339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af9190615216565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e9606085016040860161522d565b6001600160a01b03161461082c57610807606084016040850161522d565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a6060850185615248565b905090505f805b828163ffffffff161015610b22575f61085d6060880188615248565b8363ffffffff168181106108735761087361528d565b905060200281019061088591906152a1565b61088e906153c5565b80516040519192505f9160088801916108a69161543e565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf9190600401615204565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f9161543e565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d9190615216565b90508086600801835f0151604051610975919061543e565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f761500c565b021790555060208201516001820190610a109082615493565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab5911685615562565b8251604051919550610ac69161543e565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b90615575565b9050610841565b50600483018190555f610b40610b3786611d0c565b60400151611e22565b90505f610b4c87611faf565b90505f600282604051610b5f919061543e565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d9190615216565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb82612189565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c61500c565b14610c4c578060405163170cc93360e21b81526004016104cf91906151f6565b6106e583836121c4565b5f610c6664e8d4a5100083615597565b92915050565b6106e583838361243e565b610c7f612637565b5f80516020615b9b8339815191525f80610c988461266e565b91509150610ca582612189565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce061500c565b03610d05575f83815260078501602052604081208054919055610d0382826129ac565b505b610d1b81610d168460400151610fd9565b612a22565b505050505b610d3660015f80516020615bdb83398151915255565b50565b5f610d42612637565b610d4e85858585612a58565b9050610d6660015f80516020615bdb83398151915255565b949350505050565b5f8181525f80516020615b5b8339815191526020526040808220815160e0810190925280545f80516020615b9b83398151915293929190829060ff166003811115610dbb57610dbb61500c565b6003811115610dcc57610dcc61500c565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e5961500c565b14610e7a578251604051633b0d540d60e21b81526104cf91906004016155b6565b600481516005811115610e8f57610e8f61500c565b03610ea557610e9d85612c31565b505050505050565b5f80610ebc610eb389611d0c565b60400151612e18565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a510006155d0565b5f610ffc826117af565b6080015192915050565b61101183838361243e565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615b9b8339815191525f611049836117af565b51905060048160058111156110605761106061500c565b14611080578060405163170cc93360e21b81526004016104cf91906151f6565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b0316826129ac565b611104612637565b5f8181525f80516020615b5b8339815191526020526040808220815160e0810190925280545f80516020615b9b83398151915293929190829060ff1660038111156111515761115161500c565b60038111156111625761116261500c565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db61500c565b146111fc578051604051633b0d540d60e21b81526104cf91906004016155b6565b600461120b82604001516117af565b51600581111561121d5761121d61500c565b146112af575f61122c85611d0c565b90505f8061123d8360400151612e18565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612c31565b50506112d060015f80516020615bdb83398151915255565b5050565b5f6112dd612637565b6112e883338461306e565b9050610c6660015f80516020615bdb83398151915255565b5f80516020615bbb8339815191525f8061132561131c85611d0c565b60400151613346565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f82815260068401602052604090208054611365906151be565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af61500c565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016151f6565b5f82815260068401602052604081206113fa91614d94565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615b5b8339815191526020526040808220815160e0810190925280545f80516020615b9b83398151915293929190829060ff1660038111156114d6576114d661500c565b60038111156114e7576114e761500c565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156115605761156061500c565b14158015611581575060038151600381111561157e5761157e61500c565b14155b156115a2578051604051633b0d540d60e21b81526104cf91906004016155b6565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611cbd565b6040518263ffffffff1660e01b815260040161162b9190615204565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b9190615216565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615bbb83398151915291906116b9906151be565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff1660058111156117035761170361500c565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016151f6565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f91906004016155e7565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d89190615216565b6117b7614dcb565b5f8281525f80516020615bfb833981519152602052604090819020815160e0810190925280545f80516020615bbb833981519152929190829060ff1660058111156118045761180461500c565b60058111156118155761181561500c565b8152602001600182018054611829906151be565b80601f0160208091040260200160405190810160405280929190818152602001828054611855906151be565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119908484613502565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615bbb833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a209086908690615671565b90815260200160405180910390205491505092915050565b5f8381525f80516020615b5b8339815191526020526040808220815160e0810190925280545f80516020615b9b8339815191529284929091829060ff166003811115611a8657611a8661500c565b6003811115611a9757611a9761500c565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b2461500c565b14611b45578251604051633b0d540d60e21b81526104cf91906004016155b6565b60208301516001600160a01b03163314611b5f57336110a1565b600281516005811115611b7457611b7461500c565b03611c51578615611b8b57611b8982876121c4565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611bc4918491611bbf9190615680565b61351c565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c0584613673565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611cb69350505050565b600481516005811115611c6657611c6661500c565b03611c9a57611c7483613673565b5f898152600686016020526040902055611c8d88612c31565b6001945050505050611cb6565b805160405163170cc93360e21b81526104cf91906004016151f6565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d70573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d9791908101906156ab565b9150915080611db957604051636b2f19e960e01b815260040160405180910390fd5b815115611ddf578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611e1b576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611e5757815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611ea657611e6e81600161577d565b611e799060086155d0565b61ffff16848281518110611e8f57611e8f61528d565b016020015160f81c901b9190911790600101611e5a565b5061ffff811615611ed05760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611f2b57611ee781600361577d565b611ef29060086155d0565b63ffffffff1685611f04836002615562565b81518110611f1457611f1461528d565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff811615611f5157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015611fa657611f6881601f61577d565b611f739060086155d0565b86611f7f836006615562565b81518110611f8f57611f8f61528d565b016020015160f81c901b9190911790600101611f54565b50949350505050565b60605f80833560208501356014611fcb8787016040890161522d565b611fd86060890189615248565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61205e6060850185615248565b9050811015611e1b57816120756060860186615248565b838181106120855761208561528d565b905060200281019061209791906152a1565b6120a19080615790565b90506120b06060870187615248565b848181106120c0576120c061528d565b90506020028101906120d291906152a1565b6120dc9080615790565b6120e96060890189615248565b868181106120f9576120f961528d565b905060200281019061210b91906152a1565b612119906020810190615790565b61212660608b018b615248565b888181106121365761213661528d565b905060200281019061214891906152a1565b612159906060810190604001614fd3565b60405160200161216f97969594939291906157d2565b60408051601f198184030181529190529150600101612051565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561220f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261223691908101906156ab565b915091508061225857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561229b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122bf9190615216565b8251146122e5578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615612321576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f80612330846040015161381f565b915091508187146123575760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615b9b833981519152906001600160401b039081169083161115612414575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612433565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615b9b8339815191528161245786613a10565b905061246286612189565b61247157600192505050611cb6565b5f8681526004830160205260409020546001600160a01b0316331461249657336110a1565b5f86815260048301602052604090205460a08201516124c591600160b01b90046001600160401b03169061583b565b6001600160401b03168160c001516001600160401b0316101561250c5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125245761251d87866121c4565b9050612542565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061256790610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156125dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126019190615216565b905080846007015f8a81526020019081526020015f205f8282546126259190615562565b90915550501515979650505050505050565b5f80516020615bdb83398151915280546001190161266857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612677614dcb565b5f80516020615bbb8339815191525f8061269361131c87611d0c565b9150915080156126ba57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156126eb576126eb61500c565b60058111156126fc576126fc61500c565b8152602001600182018054612710906151be565b80601f016020809104026020016040519081016040528092919081815260200182805461273c906151be565b80156127875780601f1061275e57610100808354040283529160200191612787565b820191905f5260205f20905b81548152906001019060200180831161276a57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156127f2576127f261500c565b1415801561281357506001815160058111156128105761281061500c565b14155b1561283457805160405163170cc93360e21b81526104cf91906004016151f6565b6003815160058111156128495761284961500c565b03612857576004815261285c565b600581525b836008018160200151604051612872919061543e565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156128b6576128b661500c565b0217905550602082015160018201906128cf9082615493565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129755761297561500c565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615b7b83398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a07575f80fd5b505af1158015612a19573d5f803e3d5ffd5b50505050505050565b5f80516020615b7b833981519152546112d0906001600160a01b03168383613cf4565b60015f80516020615bdb83398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615b9b83398151915290600160401b900461ffff9081169086161080612aac575061271061ffff8616115b15612ad057604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b0c576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612b1e5750806001015483115b15612b3f5760405163222d164360e21b8152600481018490526024016104cf565b5f612b4984613d53565b90505f612b5582610c56565b90505f612b628983613d76565b90506040518060800160405280612b763390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615b5b8339815191526020526040808220815160e0810190925280545f80516020615b9b83398151915293929190829060ff166003811115612c7e57612c7e61500c565b6003811115612c8f57612c8f61500c565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612dbd575f84815260048701602052604090205461271090612d6f90600160a01b900461ffff16856155d0565b612d799190615597565b915081866007015f8681526020019081526020015f205f828254612d9d9190615562565b90915550612dad9050828461577d565b9050612dbd8560200151826129ac565b612dd28560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e4f57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612e9e57612e6681600161577d565b612e719060086155d0565b61ffff16868281518110612e8757612e8761528d565b016020015160f81c901b9190911790600101612e52565b5061ffff811615612ec85760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612f2357612edf81600361577d565b612eea9060086155d0565b63ffffffff1687612efc836002615562565b81518110612f0c57612f0c61528d565b016020015160f81c901b9190911790600101612ecb565b5063ffffffff8116600314612f4b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fa057612f6281601f61577d565b612f6d9060086155d0565b88612f79836006615562565b81518110612f8957612f8961528d565b016020015160f81c901b9190911790600101612f4e565b505f805b6008811015612fff57612fb881600761577d565b612fc39060086155d0565b6001600160401b031689612fd8836026615562565b81518110612fe857612fe861528d565b016020015160f81c901b9190911790600101612fa4565b505f805b600881101561305e5761301781600761577d565b6130229060086155d0565b6001600160401b03168a61303783602e615562565b815181106130475761304761528d565b016020015160f81c901b9190911790600101613003565b5091989097509095509350505050565b5f5f80516020615b9b8339815191528161308a61028485613d53565b90505f613096876117af565b90506130a187612189565b6130c1576040516330efa98b60e01b8152600481018890526024016104cf565b6002815160058111156130d6576130d661500c565b146130f757805160405163170cc93360e21b81526104cf91906004016151f6565b5f828260800151613108919061583b565b905083600201600a9054906101000a90046001600160401b03168260400151613131919061585b565b6001600160401b0316816001600160401b0316111561316e57604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f8061317a8a8461351c565b915091505f8a836040516020016131a892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561323b5761323b61500c565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461337c57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b60028110156133cb5761339381600161577d565b61339e9060086155d0565b61ffff168582815181106133b4576133b461528d565b016020015160f81c901b919091179060010161337f565b5061ffff8116156133f55760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134505761340c81600361577d565b6134179060086155d0565b63ffffffff1686613429836002615562565b815181106134395761343961528d565b016020015160f81c901b91909117906001016133f8565b5063ffffffff811660021461347857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134cd5761348f81601f61577d565b61349a9060086155d0565b876134a6836006615562565b815181106134b6576134b661528d565b016020015160f81c901b919091179060010161347b565b505f866026815181106134e2576134e261528d565b016020015191976001600160f81b03199092161515965090945050505050565b61350a6142c9565b61351382614314565b6112d081614382565b5f8281525f80516020615bfb833981519152602052604081206002015481905f80516020615bbb83398151915290600160801b90046001600160401b031661356485826143ea565b5f61356e876145c4565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6135be8a858b611cbd565b6040518263ffffffff1660e01b81526004016135da9190615204565b6020604051808303815f875af11580156135f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061361a9190615216565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615b9b83398151915290505f61369384604001516117af565b90505f6003825160058111156136ab576136ab61500c565b14806136c957506004825160058111156136c7576136c761500c565b145b156136d9575060c0810151613716565b6002825160058111156136ee576136ee61500c565b036136fa575042613716565b815160405163170cc93360e21b81526104cf91906004016151f6565b84608001516001600160401b0316816001600160401b03161161373d57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b59061376290610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156137f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906138169190615216565b95945050505050565b5f808251602e1461385557825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b60028110156138a45761386c81600161577d565b6138779060086155d0565b61ffff1685828151811061388d5761388d61528d565b016020015160f81c901b9190911790600101613858565b5061ffff8116156138ce5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015613929576138e581600361577d565b6138f09060086155d0565b63ffffffff1686613902836002615562565b815181106139125761391261528d565b016020015160f81c901b91909117906001016138d1565b5063ffffffff81161561394f57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139a45761396681601f61577d565b6139719060086155d0565b8761397d836006615562565b8151811061398d5761398d61528d565b016020015160f81c901b9190911790600101613952565b505f805b6008811015613a03576139bc81600761577d565b6139c79060086155d0565b6001600160401b0316886139dc836026615562565b815181106139ec576139ec61528d565b016020015160f81c901b91909117906001016139a8565b5090969095509350505050565b613a18614dcb565b5f8281525f80516020615bfb8339815191526020526040808220815160e0810190925280545f80516020615bbb83398151915293929190829060ff166005811115613a6557613a6561500c565b6005811115613a7657613a7661500c565b8152602001600182018054613a8a906151be565b80601f0160208091040260200160405190810160405280929190818152602001828054613ab6906151be565b8015613b015780601f10613ad857610100808354040283529160200191613b01565b820191905f5260205f20905b815481529060010190602001808311613ae457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613b6f57613b6f61500c565b14613ba2575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff16906004016151f6565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613be657613be661500c565b021790555060208201516001820190613bff9082615493565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613c9d858261351c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050614639565b5f610c66825f80516020615b7b833981519152546001600160a01b03169061469a565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613dba57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615bbb83398151915242613dd96060860160408701614fd3565b6001600160401b0316111580613e135750613df76202a30042615562565b613e076060860160408701614fd3565b6001600160401b031610155b15613e4d57613e286060850160408601614fd3565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b6030613e5c6020860186615790565b905014613e8e57613e706020850185615790565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613e988480615790565b90505f03613ec557613eaa8480615790565b604051633e08a12560e11b81526004016104cf929190615886565b5f60088201613ed48680615790565b604051613ee2929190615671565b90815260200160405180910390205414613f1b57613f008480615790565b60405163a41f772f60e01b81526004016104cf929190615886565b613f25835f6143ea565b6040805160e08101909152815481525f9081906140319060208101613f4a8980615790565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190613f92908a018a615790565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001613fdb60608a0160408b01614fd3565b6001600160401b03168152602001613ff660608a018a6158b4565b613fff906158c8565b815260200161401160808a018a6158b4565b61401a906158c8565b8152602001876001600160401b03168152506147f3565b5f8281526006860160205260409020919350915061404f8282615493565b50816008840161405f8880615790565b60405161406d929190615671565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906140a9908590600401615204565b6020604051808303815f875af11580156140c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140e99190615216565b6040805160e0810190915290915080600181526020016141098980615790565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156141985761419861500c565b0217905550602082015160018201906141b19082615493565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061424f8880615790565b60405161425d929190615671565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061429b9190614fd3565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661431257604051631afcd79f60e31b815260040160405180910390fd5b565b61431c6142c9565b614325816149e0565b61432d6149f9565b610d366060820135608083013561434a60c0850160a08601614fd3565b61435a60e0860160c0870161598f565b61436b610100870160e088016159a8565b61437d6101208801610100890161522d565b614a09565b61438a6142c9565b5f80516020615b7b8339815191526001600160a01b0382166143ca57604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615bbb8339815191525f6001600160401b03808416908516111561441e576144178385615680565b905061442b565b6144288484615680565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061448d575060018401548151614489916001600160401b031690615562565b8210155b156144b3576001600160401b0383166060820152818152604081015160208201526144d2565b82816060018181516144c5919061583b565b6001600160401b03169052505b60608101516144e290606461585b565b602082015160018601546001600160401b03929092169161450d9190600160401b900460ff166155d0565b101561453d57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b0316816040018181516145589190615562565b9052506040810180516001600160401b038716919061457890839061577d565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615bfb8339815191526020526040812060020180545f80516020615bbb833981519152919060089061460e90600160401b90046001600160401b03166159c8565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f61464d6001600160a01b03841683614b38565b905080515f1415801561467157508080602001905181019061466f91906159e3565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa1580156146e0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147049190615216565b905061471b6001600160a01b038516333086614b45565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561475f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147839190615216565b90508181116147e95760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b613816828261577d565b5f606082604001515160301461481c5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f9861485d988a9860019892979296909590949093909291016159fe565b60405160208183030381529060405290505f5b846080015160200151518110156148cf5781856080015160200151828151811061489c5761489c61528d565b60200260200101516040516020016148b5929190615ab8565b60408051601f198184030181529190529150600101614870565b5060a08401518051602091820151516040516148ef938593929101615aee565b60405160208183030381529060405290505f5b8460a00151602001515181101561496157818560a0015160200151828151811061492e5761492e61528d565b6020026020010151604051602001614947929190615ab8565b60408051601f198184030181529190529150600101614902565b5060c0840151604051614978918391602001615b29565b6040516020818303038152906040529050600281604051614999919061543e565b602060405180830381855afa1580156149b4573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906149d79190615216565b94909350915050565b6149e86142c9565b6149f0614b7e565b610d3681614b86565b614a016142c9565b614312614c6e565b614a116142c9565b5f80516020615b9b83398151915261ffff84161580614a35575061271061ffff8516115b15614a5957604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614a7d5760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614a905750600a60ff8416115b15614ab35760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611cb683835f614c76565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613d21565b6143126142c9565b614b8e6142c9565b80355f80516020615bbb8339815191529081556014614bb360608401604085016159a8565b60ff161180614bd25750614bcd60608301604084016159a8565b60ff16155b15614c0657614be760608301604084016159a8565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614c1660608301604084016159a8565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614c476040830160208401614fd3565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612a456142c9565b606081471015614c9b5760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614cb6919061543e565b5f6040518083038185875af1925050503d805f8114614cf0576040519150601f19603f3d011682016040523d82523d5f602084013e614cf5565b606091505b5091509150614d05868383614d0f565b9695505050505050565b606082614d2457614d1f82614d6b565b611cb6565b8151158015614d3b57506001600160a01b0384163b155b15614d6457604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611cb6565b805115614d7b5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614da0906151be565b5f825580601f10614daf575050565b601f0160209004905f5260205f2090810190610d369190614e08565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614e1c575f8155600101614e09565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114614e40575f80fd5b919050565b5f805f60608486031215614e57575f80fd5b833592506020840135614e6981614e20565b9150614e7760408501614e2d565b90509250925092565b5f60208284031215614e90575f80fd5b5035919050565b5f8060408385031215614ea8575f80fd5b82356001600160401b03811115614ebd575f80fd5b830160808186031215614ece575f80fd5b9150614edc60208401614e2d565b90509250929050565b5f8060408385031215614ef6575f80fd5b82359150614edc60208401614e2d565b5f60208284031215614f16575f80fd5b611cb682614e2d565b803561ffff81168114614e40575f80fd5b80356001600160401b0381168114614e40575f80fd5b5f805f8060808587031215614f59575f80fd5b84356001600160401b03811115614f6e575f80fd5b850160a08188031215614f7f575f80fd5b9350614f8d60208601614f1f565b9250614f9b60408601614f30565b9396929550929360600135925050565b5f8060408385031215614fbc575f80fd5b614fc583614e2d565b946020939093013593505050565b5f60208284031215614fe3575f80fd5b611cb682614f30565b5f8060408385031215614ffd575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106150305761503061500c565b9052565b5f5b8381101561504e578181015183820152602001615036565b50505f910152565b5f815180845261506d816020860160208601615034565b601f01601f19169290920160200192915050565b60208152615093602082018351615020565b5f602083015160e060408401526150ae610100840182615056565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f80828403610140811215615128575f80fd5b61012080821215615137575f80fd5b849350830135905061514881615101565b809150509250929050565b5f8060208385031215615164575f80fd5b82356001600160401b038082111561517a575f80fd5b818501915085601f83011261518d575f80fd5b81358181111561519b575f80fd5b8660208285010111156151ac575f80fd5b60209290920196919550909350505050565b600181811c908216806151d257607f821691505b6020821081036151f057634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c668284615020565b602081525f611cb66020830184615056565b5f60208284031215615226575f80fd5b5051919050565b5f6020828403121561523d575f80fd5b8135611cb681615101565b5f808335601e1984360301811261525d575f80fd5b8301803591506001600160401b03821115615276575f80fd5b6020019150600581901b360382131561366c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126152b5575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156152f5576152f56152bf565b60405290565b604080519081016001600160401b03811182821017156152f5576152f56152bf565b604051601f8201601f191681016001600160401b0381118282101715615345576153456152bf565b604052919050565b5f6001600160401b03821115615365576153656152bf565b50601f01601f191660200190565b5f82601f830112615382575f80fd5b81356153956153908261534d565b61531d565b8181528460208386010111156153a9575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156153d5575f80fd5b6153dd6152d3565b82356001600160401b03808211156153f3575f80fd5b6153ff36838701615373565b83526020850135915080821115615414575f80fd5b5061542136828601615373565b60208301525061543360408401614f30565b604082015292915050565b5f82516152b5818460208701615034565b601f8211156104d857805f5260205f20601f840160051c810160208510156154745750805b601f840160051c820191505b8181101561166b575f8155600101615480565b81516001600160401b038111156154ac576154ac6152bf565b6154c0816154ba84546151be565b8461544f565b602080601f8311600181146154f3575f84156154dc5750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b8281101561552157888601518255948401946001909101908401615502565b508582101561553e57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c6661554e565b5f63ffffffff80831681810361558d5761558d61554e565b6001019392505050565b5f826155b157634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106155ca576155ca61500c565b91905290565b8082028115828204841417610c6657610c6661554e565b5f60208083525f84546155f9816151be565b806020870152604060018084165f811461561a576001811461563657615663565b60ff19851660408a0152604084151560051b8a01019550615663565b895f5260205f205f5b8581101561565a5781548b820186015290830190880161563f565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611e1b57611e1b61554e565b8051614e4081614e20565b5f80604083850312156156bc575f80fd5b82516001600160401b03808211156156d2575f80fd5b90840190606082870312156156e5575f80fd5b6156ed6152d3565b8251815260208084015161570081615101565b82820152604084015183811115615715575f80fd5b80850194505087601f850112615729575f80fd5b835192506157396153908461534d565b838152888285870101111561574c575f80fd5b61575b84838301848801615034565b806040840152508195506157708188016156a0565b9450505050509250929050565b81810381811115610c6657610c6661554e565b5f808335601e198436030181126157a5575f80fd5b8301803591506001600160401b038211156157be575f80fd5b60200191503681900382131561366c575f80fd5b5f88516157e3818460208d01615034565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611e1b57611e1b61554e565b6001600160401b0381811683821602808216919082811461587e5761587e61554e565b505092915050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f8235603e198336030181126152b5575f80fd5b5f604082360312156158d8575f80fd5b6158e06152fb565b6158e983614e2d565b81526020808401356001600160401b0380821115615905575f80fd5b9085019036601f830112615917575f80fd5b813581811115615929576159296152bf565b8060051b915061593a84830161531d565b8181529183018401918481019036841115615953575f80fd5b938501935b8385101561597d578435925061596d83615101565b8282529385019390850190615958565b94860194909452509295945050505050565b5f6020828403121561599f575f80fd5b611cb682614f1f565b5f602082840312156159b8575f80fd5b813560ff81168114611cb6575f80fd5b5f6001600160401b0380831681810361558d5761558d61554e565b5f602082840312156159f3575f80fd5b8151611cb681614e20565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615a4481602a850160208b01615034565b865190830190615a5b81602a840160208b01615034565b60c087901b6001600160c01b031916602a9290910191820152615a8d603282018660e01b6001600160e01b0319169052565b615aa6603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615ac9818460208801615034565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615aff818460208901615034565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615b3a818460208801615034565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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: "0x608060405234801561000f575f80fd5b50604051615f02380380615f0283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615db58061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b610209610204366004614fd3565b6104a8565b005b61020961021936600461500e565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b366004614fd3565b6106eb565b61020961025e366004615025565b6106f6565b610209610271366004615073565b610be2565b61028961028436600461500e565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb366004614fd3565b610c6c565b6102096102de366004615094565b610c77565b6102f66102f13660046150d4565b610d39565b604051908152602001610234565b610209610312366004615139565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f6610342366004615161565b610fd9565b61028961035536600461500e565b610ff2565b6102f65f81565b61020961036f366004614fd3565b611006565b610226603081565b61020961038a36600461500e565b611031565b61020961039d366004615139565b6110fc565b6102f66103b036600461517a565b6112d4565b6102096103c3366004615094565b611300565b6102f65f80516020615d2983398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b61020961041036600461500e565b611489565b6102f65f80516020615d4983398151915281565b61020961043736600461500e565b611672565b610226601481565b61045761045236600461500e565b6117af565b604051610234919061520f565b6102896202a30081565b6102f65f80516020615d0983398151915281565b6102096104903660046152a3565b6118fe565b6102f66104a33660046152e1565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615d898339815191526020526040808220815160e0810190925280545f80516020615d4983398151915293929190829060ff16600581111561052a5761052a61519a565b600581111561053b5761053b61519a565b815260200160018201805461054f9061534c565b80601f016020809104026020016040519081016040528092919081815260200182805461057b9061534c565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156106315761063161519a565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615384565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611cbd565b6040518263ffffffff1660e01b81526004016106a59190615392565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e591906153a4565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615d498339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af91906153a4565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e960608501604086016153bb565b6001600160a01b03161461082c5761080760608401604085016153bb565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a60608501856153d6565b905090505f805b828163ffffffff161015610b22575f61085d60608801886153d6565b8363ffffffff168181106108735761087361541b565b9050602002810190610885919061542f565b61088e90615553565b80516040519192505f9160088801916108a6916155cc565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf9190600401615392565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f916155cc565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d91906153a4565b90508086600801835f015160405161097591906155cc565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f761519a565b021790555060208201516001820190610a109082615621565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab59116856156f0565b8251604051919550610ac6916155cc565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b90615703565b9050610841565b50600483018190555f610b40610b3786611d0c565b60400151611e22565b90505f610b4c87611faf565b90505f600282604051610b5f91906155cc565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d91906153a4565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb82612189565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c61519a565b14610c4c578060405163170cc93360e21b81526004016104cf9190615384565b6106e583836121c4565b5f610c6664e8d4a5100083615725565b92915050565b6106e583838361243e565b610c7f612637565b5f80516020615d298339815191525f80610c988461266e565b91509150610ca582612189565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce061519a565b03610d05575f83815260078501602052604081208054919055610d0382826129ac565b505b610d1b81610d168460400151610fd9565b612a22565b505050505b610d3660015f80516020615d6983398151915255565b50565b5f610d42612637565b610d4e85858585612a58565b9050610d6660015f80516020615d6983398151915255565b949350505050565b5f8181525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d2983398151915293929190829060ff166003811115610dbb57610dbb61519a565b6003811115610dcc57610dcc61519a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e5961519a565b14610e7a578251604051633b0d540d60e21b81526104cf9190600401615744565b600481516005811115610e8f57610e8f61519a565b03610ea557610e9d85612c31565b505050505050565b5f80610ebc610eb389611d0c565b60400151612e18565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a5100061575e565b5f610ffc826117af565b6080015192915050565b61101183838361243e565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615d298339815191525f611049836117af565b51905060048160058111156110605761106061519a565b14611080578060405163170cc93360e21b81526004016104cf9190615384565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b0316826129ac565b611104612637565b5f8181525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d2983398151915293929190829060ff1660038111156111515761115161519a565b60038111156111625761116261519a565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db61519a565b146111fc578051604051633b0d540d60e21b81526104cf9190600401615744565b600461120b82604001516117af565b51600581111561121d5761121d61519a565b146112af575f61122c85611d0c565b90505f8061123d8360400151612e18565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612c31565b50506112d060015f80516020615d6983398151915255565b5050565b5f6112dd612637565b6112e883338461306e565b9050610c6660015f80516020615d6983398151915255565b5f80516020615d498339815191525f8061132561131c85611d0c565b60400151613346565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600684016020526040902080546113659061534c565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af61519a565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615384565b5f82815260068401602052604081206113fa91614f22565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d2983398151915293929190829060ff1660038111156114d6576114d661519a565b60038111156114e7576114e761519a565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156115605761156061519a565b14158015611581575060038151600381111561157e5761157e61519a565b14155b156115a2578051604051633b0d540d60e21b81526104cf9190600401615744565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611cbd565b6040518263ffffffff1660e01b815260040161162b9190615392565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b91906153a4565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615d4983398151915291906116b99061534c565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff1660058111156117035761170361519a565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615384565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f9190600401615775565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906153a4565b6117b7614f59565b5f8281525f80516020615d89833981519152602052604090819020815160e0810190925280545f80516020615d49833981519152929190829060ff1660058111156118045761180461519a565b60058111156118155761181561519a565b81526020016001820180546118299061534c565b80601f01602080910402602001604051908101604052809291908181526020018280546118559061534c565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119908484613502565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615d49833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a2090869086906157ff565b90815260200160405180910390205491505092915050565b5f8381525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d298339815191529284929091829060ff166003811115611a8657611a8661519a565b6003811115611a9757611a9761519a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b2461519a565b14611b45578251604051633b0d540d60e21b81526104cf9190600401615744565b60208301516001600160a01b03163314611b5f57336110a1565b600281516005811115611b7457611b7461519a565b03611c51578615611b8b57611b8982876121c4565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611bc4918491611bbf919061580e565b61351c565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c0584613673565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611cb69350505050565b600481516005811115611c6657611c6661519a565b03611c9a57611c7483613673565b5f898152600686016020526040902055611c8d88612c31565b6001945050505050611cb6565b805160405163170cc93360e21b81526104cf9190600401615384565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d70573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d979190810190615839565b9150915080611db957604051636b2f19e960e01b815260040160405180910390fd5b815115611ddf578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611e1b576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611e5757815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611ea657611e6e81600161590b565b611e7990600861575e565b61ffff16848281518110611e8f57611e8f61541b565b016020015160f81c901b9190911790600101611e5a565b5061ffff811615611ed05760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611f2b57611ee781600361590b565b611ef290600861575e565b63ffffffff1685611f048360026156f0565b81518110611f1457611f1461541b565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff811615611f5157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015611fa657611f6881601f61590b565b611f7390600861575e565b86611f7f8360066156f0565b81518110611f8f57611f8f61541b565b016020015160f81c901b9190911790600101611f54565b50949350505050565b60605f80833560208501356014611fcb878701604089016153bb565b611fd860608901896153d6565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61205e60608501856153d6565b9050811015611e1b578161207560608601866153d6565b838181106120855761208561541b565b9050602002810190612097919061542f565b6120a1908061591e565b90506120b060608701876153d6565b848181106120c0576120c061541b565b90506020028101906120d2919061542f565b6120dc908061591e565b6120e960608901896153d6565b868181106120f9576120f961541b565b905060200281019061210b919061542f565b61211990602081019061591e565b61212660608b018b6153d6565b888181106121365761213661541b565b9050602002810190612148919061542f565b612159906060810190604001615161565b60405160200161216f9796959493929190615960565b60408051601f198184030181529190529150600101612051565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561220f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122369190810190615839565b915091508061225857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561229b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122bf91906153a4565b8251146122e5578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615612321576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f80612330846040015161381f565b915091508187146123575760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615d29833981519152906001600160401b039081169083161115612414575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612433565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615d298339815191528161245786613a10565b905061246286612189565b61247157600192505050611cb6565b5f8681526004830160205260409020546001600160a01b0316331461249657336110a1565b5f86815260048301602052604090205460a08201516124c591600160b01b90046001600160401b0316906159c9565b6001600160401b03168160c001516001600160401b0316101561250c5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125245761251d87866121c4565b9050612542565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061256790610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156125dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061260191906153a4565b905080846007015f8a81526020019081526020015f205f82825461262591906156f0565b90915550501515979650505050505050565b5f80516020615d6983398151915280546001190161266857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612677614f59565b5f80516020615d498339815191525f8061269361131c87611d0c565b9150915080156126ba57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156126eb576126eb61519a565b60058111156126fc576126fc61519a565b81526020016001820180546127109061534c565b80601f016020809104026020016040519081016040528092919081815260200182805461273c9061534c565b80156127875780601f1061275e57610100808354040283529160200191612787565b820191905f5260205f20905b81548152906001019060200180831161276a57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156127f2576127f261519a565b1415801561281357506001815160058111156128105761281061519a565b14155b1561283457805160405163170cc93360e21b81526104cf9190600401615384565b6003815160058111156128495761284961519a565b03612857576004815261285c565b600581525b83600801816020015160405161287291906155cc565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156128b6576128b661519a565b0217905550602082015160018201906128cf9082615621565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129755761297561519a565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615d0983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a07575f80fd5b505af1158015612a19573d5f803e3d5ffd5b50505050505050565b5f80516020615d09833981519152546112d0906001600160a01b03168383613cf4565b60015f80516020615d6983398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615d2983398151915290600160401b900461ffff9081169086161080612aac575061271061ffff8616115b15612ad057604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b0c576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612b1e5750806001015483115b15612b3f5760405163222d164360e21b8152600481018490526024016104cf565b5f612b4984613d53565b90505f612b5582610c56565b90505f612b628983613d76565b90506040518060800160405280612b763390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d2983398151915293929190829060ff166003811115612c7e57612c7e61519a565b6003811115612c8f57612c8f61519a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612dbd575f84815260048701602052604090205461271090612d6f90600160a01b900461ffff168561575e565b612d799190615725565b915081866007015f8681526020019081526020015f205f828254612d9d91906156f0565b90915550612dad9050828461590b565b9050612dbd8560200151826129ac565b612dd28560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e4f57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612e9e57612e6681600161590b565b612e7190600861575e565b61ffff16868281518110612e8757612e8761541b565b016020015160f81c901b9190911790600101612e52565b5061ffff811615612ec85760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612f2357612edf81600361590b565b612eea90600861575e565b63ffffffff1687612efc8360026156f0565b81518110612f0c57612f0c61541b565b016020015160f81c901b9190911790600101612ecb565b5063ffffffff8116600314612f4b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fa057612f6281601f61590b565b612f6d90600861575e565b88612f798360066156f0565b81518110612f8957612f8961541b565b016020015160f81c901b9190911790600101612f4e565b505f805b6008811015612fff57612fb881600761590b565b612fc390600861575e565b6001600160401b031689612fd88360266156f0565b81518110612fe857612fe861541b565b016020015160f81c901b9190911790600101612fa4565b505f805b600881101561305e5761301781600761590b565b61302290600861575e565b6001600160401b03168a61303783602e6156f0565b815181106130475761304761541b565b016020015160f81c901b9190911790600101613003565b5091989097509095509350505050565b5f5f80516020615d298339815191528161308a61028485613d53565b90505f613096876117af565b90506130a187612189565b6130c1576040516330efa98b60e01b8152600481018890526024016104cf565b6002815160058111156130d6576130d661519a565b146130f757805160405163170cc93360e21b81526104cf9190600401615384565b5f82826080015161310891906159c9565b905083600201600a9054906101000a90046001600160401b0316826040015161313191906159e9565b6001600160401b0316816001600160401b0316111561316e57604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f8061317a8a8461351c565b915091505f8a836040516020016131a892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561323b5761323b61519a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461337c57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b60028110156133cb5761339381600161590b565b61339e90600861575e565b61ffff168582815181106133b4576133b461541b565b016020015160f81c901b919091179060010161337f565b5061ffff8116156133f55760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134505761340c81600361590b565b61341790600861575e565b63ffffffff16866134298360026156f0565b815181106134395761343961541b565b016020015160f81c901b91909117906001016133f8565b5063ffffffff811660021461347857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134cd5761348f81601f61590b565b61349a90600861575e565b876134a68360066156f0565b815181106134b6576134b661541b565b016020015160f81c901b919091179060010161347b565b505f866026815181106134e2576134e261541b565b016020015191976001600160f81b03199092161515965090945050505050565b61350a6142ee565b61351382614339565b6112d0816143a7565b5f8281525f80516020615d89833981519152602052604081206002015481905f80516020615d4983398151915290600160801b90046001600160401b0316613564858261440f565b5f61356e876145e9565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6135be8a858b611cbd565b6040518263ffffffff1660e01b81526004016135da9190615392565b6020604051808303815f875af11580156135f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061361a91906153a4565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615d2983398151915290505f61369384604001516117af565b90505f6003825160058111156136ab576136ab61519a565b14806136c957506004825160058111156136c7576136c761519a565b145b156136d9575060c0810151613716565b6002825160058111156136ee576136ee61519a565b036136fa575042613716565b815160405163170cc93360e21b81526104cf9190600401615384565b84608001516001600160401b0316816001600160401b03161161373d57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b59061376290610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156137f2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061381691906153a4565b95945050505050565b5f808251602e1461385557825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b60028110156138a45761386c81600161590b565b61387790600861575e565b61ffff1685828151811061388d5761388d61541b565b016020015160f81c901b9190911790600101613858565b5061ffff8116156138ce5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015613929576138e581600361590b565b6138f090600861575e565b63ffffffff16866139028360026156f0565b815181106139125761391261541b565b016020015160f81c901b91909117906001016138d1565b5063ffffffff81161561394f57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139a45761396681601f61590b565b61397190600861575e565b8761397d8360066156f0565b8151811061398d5761398d61541b565b016020015160f81c901b9190911790600101613952565b505f805b6008811015613a03576139bc81600761590b565b6139c790600861575e565b6001600160401b0316886139dc8360266156f0565b815181106139ec576139ec61541b565b016020015160f81c901b91909117906001016139a8565b5090969095509350505050565b613a18614f59565b5f8281525f80516020615d898339815191526020526040808220815160e0810190925280545f80516020615d4983398151915293929190829060ff166005811115613a6557613a6561519a565b6005811115613a7657613a7661519a565b8152602001600182018054613a8a9061534c565b80601f0160208091040260200160405190810160405280929190818152602001828054613ab69061534c565b8015613b015780601f10613ad857610100808354040283529160200191613b01565b820191905f5260205f20905b815481529060010190602001808311613ae457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613b6f57613b6f61519a565b14613ba2575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615384565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613be657613be661519a565b021790555060208201516001820190613bff9082615621565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613c9d858261351c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061465e565b5f610c66825f80516020615d09833981519152546001600160a01b0316906146bf565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613dba57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615d4983398151915242613dd96060860160408701615161565b6001600160401b0316111580613e135750613df76202a300426156f0565b613e076060860160408701615161565b6001600160401b031610155b15613e4d57613e286060850160408601615161565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613e62613e5d6060860186615a14565b614818565b613e72613e5d6080860186615a14565b6030613e81602086018661591e565b905014613eb357613e95602085018561591e565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613ebd848061591e565b90505f03613eea57613ecf848061591e565b604051633e08a12560e11b81526004016104cf929190615a28565b5f60088201613ef9868061591e565b604051613f079291906157ff565b90815260200160405180910390205414613f4057613f25848061591e565b60405163a41f772f60e01b81526004016104cf929190615a28565b613f4a835f61440f565b6040805160e08101909152815481525f9081906140569060208101613f6f898061591e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190613fb7908a018a61591e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161400060608a0160408b01615161565b6001600160401b0316815260200161401b60608a018a615a14565b61402490615a56565b815260200161403660808a018a615a14565b61403f90615a56565b8152602001876001600160401b0316815250614981565b5f828152600686016020526040902091935091506140748282615621565b508160088401614084888061591e565b6040516140929291906157ff565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906140ce908590600401615392565b6020604051808303815f875af11580156140ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061410e91906153a4565b6040805160e08101909152909150806001815260200161412e898061591e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156141bd576141bd61519a565b0217905550602082015160018201906141d69082615621565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580614274888061591e565b6040516142829291906157ff565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906142c09190615161565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661433757604051631afcd79f60e31b815260040160405180910390fd5b565b6143416142ee565b61434a81614b6e565b614352614b87565b610d366060820135608083013561436f60c0850160a08601615161565b61437f60e0860160c08701615b1d565b614390610100870160e08801615b36565b6143a2610120880161010089016153bb565b614b97565b6143af6142ee565b5f80516020615d098339815191526001600160a01b0382166143ef57604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615d498339815191525f6001600160401b0380841690851611156144435761443c838561580e565b9050614450565b61444d848461580e565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806144b25750600184015481516144ae916001600160401b0316906156f0565b8210155b156144d8576001600160401b0383166060820152818152604081015160208201526144f7565b82816060018181516144ea91906159c9565b6001600160401b03169052505b60608101516145079060646159e9565b602082015160018601546001600160401b0392909216916145329190600160401b900460ff1661575e565b101561456257606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b03168160400181815161457d91906156f0565b9052506040810180516001600160401b038716919061459d90839061590b565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d898339815191526020526040812060020180545f80516020615d49833981519152919060089061463390600160401b90046001600160401b0316615b56565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6146726001600160a01b03841683614cc6565b905080515f141580156146965750808060200190518101906146949190615b71565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614705573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061472991906153a4565b90506147406001600160a01b038516333086614cd3565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147a891906153a4565b905081811161480e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b613816828261590b565b6148256020820182615094565b63ffffffff16158015614845575061484060208201826153d6565b151590505b1561488c576148576020820182615094565b61486460208301836153d6565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b61489960208201826153d6565b90506148a86020830183615094565b63ffffffff1611156148c1576148576020820182615094565b60015b6148d160208301836153d6565b90508110156112d0576148e760208301836153d6565b6148f260018461590b565b8181106149015761490161541b565b905060200201602081019061491691906153bb565b6001600160a01b031661492c60208401846153d6565b8381811061493c5761493c61541b565b905060200201602081019061495191906153bb565b6001600160a01b0316101561497957604051630dbc8d5f60e31b815260040160405180910390fd5b6001016148c4565b5f60608260400151516030146149aa5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986149eb988a986001989297929690959094909390929101615b8c565b60405160208183030381529060405290505f5b84608001516020015151811015614a5d57818560800151602001518281518110614a2a57614a2a61541b565b6020026020010151604051602001614a43929190615c46565b60408051601f1981840301815291905291506001016149fe565b5060a0840151805160209182015151604051614a7d938593929101615c7c565b60405160208183030381529060405290505f5b8460a001516020015151811015614aef57818560a00151602001518281518110614abc57614abc61541b565b6020026020010151604051602001614ad5929190615c46565b60408051601f198184030181529190529150600101614a90565b5060c0840151604051614b06918391602001615cb7565b6040516020818303038152906040529050600281604051614b2791906155cc565b602060405180830381855afa158015614b42573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614b6591906153a4565b94909350915050565b614b766142ee565b614b7e614d0c565b610d3681614d14565b614b8f6142ee565b614337614dfc565b614b9f6142ee565b5f80516020615d2983398151915261ffff84161580614bc3575061271061ffff8516115b15614be757604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614c0b5760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614c1e5750600a60ff8416115b15614c415760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611cb683835f614e04565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613d21565b6143376142ee565b614d1c6142ee565b80355f80516020615d498339815191529081556014614d416060840160408501615b36565b60ff161180614d605750614d5b6060830160408401615b36565b60ff16155b15614d9457614d756060830160408401615b36565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614da46060830160408401615b36565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614dd56040830160208401615161565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612a456142ee565b606081471015614e295760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614e4491906155cc565b5f6040518083038185875af1925050503d805f8114614e7e576040519150601f19603f3d011682016040523d82523d5f602084013e614e83565b606091505b5091509150614e93868383614e9d565b9695505050505050565b606082614eb257614ead82614ef9565b611cb6565b8151158015614ec957506001600160a01b0384163b155b15614ef257604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611cb6565b805115614f095780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614f2e9061534c565b5f825580601f10614f3d575050565b601f0160209004905f5260205f2090810190610d369190614f96565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614faa575f8155600101614f97565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114614fce575f80fd5b919050565b5f805f60608486031215614fe5575f80fd5b833592506020840135614ff781614fae565b915061500560408501614fbb565b90509250925092565b5f6020828403121561501e575f80fd5b5035919050565b5f8060408385031215615036575f80fd5b82356001600160401b0381111561504b575f80fd5b83016080818603121561505c575f80fd5b915061506a60208401614fbb565b90509250929050565b5f8060408385031215615084575f80fd5b8235915061506a60208401614fbb565b5f602082840312156150a4575f80fd5b611cb682614fbb565b803561ffff81168114614fce575f80fd5b80356001600160401b0381168114614fce575f80fd5b5f805f80608085870312156150e7575f80fd5b84356001600160401b038111156150fc575f80fd5b850160a0818803121561510d575f80fd5b935061511b602086016150ad565b9250615129604086016150be565b9396929550929360600135925050565b5f806040838503121561514a575f80fd5b61515383614fbb565b946020939093013593505050565b5f60208284031215615171575f80fd5b611cb6826150be565b5f806040838503121561518b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106151be576151be61519a565b9052565b5f5b838110156151dc5781810151838201526020016151c4565b50505f910152565b5f81518084526151fb8160208601602086016151c2565b601f01601f19169290920160200192915050565b602081526152216020820183516151ae565b5f602083015160e0604084015261523c6101008401826151e4565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f808284036101408112156152b6575f80fd5b610120808212156152c5575f80fd5b84935083013590506152d68161528f565b809150509250929050565b5f80602083850312156152f2575f80fd5b82356001600160401b0380821115615308575f80fd5b818501915085601f83011261531b575f80fd5b813581811115615329575f80fd5b86602082850101111561533a575f80fd5b60209290920196919550909350505050565b600181811c9082168061536057607f821691505b60208210810361537e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c6682846151ae565b602081525f611cb660208301846151e4565b5f602082840312156153b4575f80fd5b5051919050565b5f602082840312156153cb575f80fd5b8135611cb68161528f565b5f808335601e198436030181126153eb575f80fd5b8301803591506001600160401b03821115615404575f80fd5b6020019150600581901b360382131561366c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615443575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154835761548361544d565b60405290565b604080519081016001600160401b03811182821017156154835761548361544d565b604051601f8201601f191681016001600160401b03811182821017156154d3576154d361544d565b604052919050565b5f6001600160401b038211156154f3576154f361544d565b50601f01601f191660200190565b5f82601f830112615510575f80fd5b813561552361551e826154db565b6154ab565b818152846020838601011115615537575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615563575f80fd5b61556b615461565b82356001600160401b0380821115615581575f80fd5b61558d36838701615501565b835260208501359150808211156155a2575f80fd5b506155af36828601615501565b6020830152506155c1604084016150be565b604082015292915050565b5f82516154438184602087016151c2565b601f8211156104d857805f5260205f20601f840160051c810160208510156156025750805b601f840160051c820191505b8181101561166b575f815560010161560e565b81516001600160401b0381111561563a5761563a61544d565b61564e81615648845461534c565b846155dd565b602080601f831160018114615681575f841561566a5750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b828110156156af57888601518255948401946001909101908401615690565b50858210156156cc57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c666156dc565b5f63ffffffff80831681810361571b5761571b6156dc565b6001019392505050565b5f8261573f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157585761575861519a565b91905290565b8082028115828204841417610c6657610c666156dc565b5f60208083525f84546157878161534c565b806020870152604060018084165f81146157a857600181146157c4576157f1565b60ff19851660408a0152604084151560051b8a010195506157f1565b895f5260205f205f5b858110156157e85781548b82018601529083019088016157cd565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611e1b57611e1b6156dc565b8051614fce81614fae565b5f806040838503121561584a575f80fd5b82516001600160401b0380821115615860575f80fd5b9084019060608287031215615873575f80fd5b61587b615461565b8251815260208084015161588e8161528f565b828201526040840151838111156158a3575f80fd5b80850194505087601f8501126158b7575f80fd5b835192506158c761551e846154db565b83815288828587010111156158da575f80fd5b6158e9848383018488016151c2565b806040840152508195506158fe81880161582e565b9450505050509250929050565b81810381811115610c6657610c666156dc565b5f808335601e19843603018112615933575f80fd5b8301803591506001600160401b0382111561594c575f80fd5b60200191503681900382131561366c575f80fd5b5f8851615971818460208d016151c2565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611e1b57611e1b6156dc565b6001600160401b03818116838216028082169190828114615a0c57615a0c6156dc565b505092915050565b5f8235603e19833603018112615443575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615a66575f80fd5b615a6e615489565b615a7783614fbb565b81526020808401356001600160401b0380821115615a93575f80fd5b9085019036601f830112615aa5575f80fd5b813581811115615ab757615ab761544d565b8060051b9150615ac88483016154ab565b8181529183018401918481019036841115615ae1575f80fd5b938501935b83851015615b0b5784359250615afb8361528f565b8282529385019390850190615ae6565b94860194909452509295945050505050565b5f60208284031215615b2d575f80fd5b611cb6826150ad565b5f60208284031215615b46575f80fd5b813560ff81168114611cb6575f80fd5b5f6001600160401b0380831681810361571b5761571b6156dc565b5f60208284031215615b81575f80fd5b8151611cb681614fae565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615bd281602a850160208b016151c2565b865190830190615be981602a840160208b016151c2565b60c087901b6001600160c01b031916602a9290910191820152615c1b603282018660e01b6001600160e01b0319169052565b615c34603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615c578184602088016151c2565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615c8d8184602089016151c2565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615cc88184602088016151c2565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 531206df4..7abdb2216 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\":\"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\":\"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: "0x608060405234801561000f575f80fd5b50604051615a7f380380615a7f83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6159328061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614be9565b61060a565b005b348015610216575f80fd5b50610209610225366004614c24565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614be9565b61084d565b34801561027f575f80fd5b5061020961028e366004614c3b565b610858565b34801561029e575f80fd5b506102096102ad366004614c89565b610d44565b3480156102bd575f80fd5b506102096102cc366004614ca0565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614c24565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614be9565b610eab565b34801561038c575f80fd5b5061020961039b366004614cc1565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614cda565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614d18565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614c24565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614be9565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614c24565b61123b565b3480156104a4575f80fd5b506102096104b3366004614cda565b611306565b3480156104c3575f80fd5b506102096104d2366004614cc1565b6114de565b6104076104e5366004614d42565b611667565b3480156104f5575f80fd5b506104075f805160206158a683398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614c24565b61169b565b34801561054e575f80fd5b506104075f805160206158c683398151915281565b34801561056e575f80fd5b5061020961057d366004614c24565b611884565b610407610590366004614c24565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614c24565b6119f2565b60405161024c9190614e0b565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b50610407610605366004614e8b565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f805160206159068339815191526020526040808220815160e0810190925280545f805160206158c683398151915293929190829060ff16600581111561068c5761068c614d96565b600581111561069d5761069d614d96565b81526020016001820180546106b190614ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd90614ef6565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614d96565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f28565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611e1a565b6040518263ffffffff1660e01b81526004016108079190614f36565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108479190614f48565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206158c68339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109119190614f48565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b6060850160408601614f73565b6001600160a01b03161461098e576109696060840160408501614f73565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c6060850185614f8e565b905090505f805b828163ffffffff161015610c84575f6109bf6060880188614f8e565b8363ffffffff168181106109d5576109d5614fd3565b90506020028101906109e79190614fe7565b6109f09061510b565b80516040519192505f916008880191610a0891615184565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b81526106319190600401614f36565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8191615184565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf9190614f48565b90508086600801835f0151604051610ad79190615184565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614d96565b021790555060208201516001820190610b7290826151d9565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c179116856152a8565b8251604051919550610c2891615184565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d906152bb565b90506109a3565b50600483018190555f610ca2610c9986611e69565b60400151611f7f565b90505f610cae8761210c565b90505f600282604051610cc19190615184565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff9190614f48565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd5836122e6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a826122f7565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614d96565b14610e8b578060405163170cc93360e21b81526004016106319190614f28565b6108478383612332565b5f610ea564e8d4a51000836152dd565b92915050565b6108478383836125ac565b610ebe6127a5565b5f805160206158a68339815191525f80610ed7846127dc565b91509150610ee4826122f7565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614d96565b03610f44575f83815260078501602052604081208054919055610f428282612b1a565b505b610f5a81610f5584604001516111e3565b612b78565b505050505b610f7560015f805160206158e683398151915255565b50565b5f8181525f805160206158868339815191526020526040808220815160e0810190925280545f805160206158a683398151915293929190829060ff166003811115610fc557610fc5614d96565b6003811115610fd657610fd6614d96565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614d96565b14611084578251604051633b0d540d60e21b815261063191906004016152fc565b60048151600581111561109957611099614d96565b036110af576110a785612b9e565b505050505050565b5f806110c66110bd89611e69565b60400151612d85565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a51000615316565b5f611206826119f2565b6080015192915050565b61121b8383836125ac565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f805160206158a68339815191525f611253836119f2565b519050600481600581111561126a5761126a614d96565b1461128a578060405163170cc93360e21b81526004016106319190614f28565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612b1a565b61130e6127a5565b5f8181525f805160206158868339815191526020526040808220815160e0810190925280545f805160206158a683398151915293929190829060ff16600381111561135b5761135b614d96565b600381111561136c5761136c614d96565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614d96565b14611406578051604051633b0d540d60e21b815261063191906004016152fc565b600461141582604001516119f2565b51600581111561142757611427614d96565b146114b9575f61143685611e69565b90505f806114478360400151612d85565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612b9e565b50506114da60015f805160206158e683398151915255565b5050565b5f805160206158c68339815191525f806115036114fa85611e69565b60400151612fdb565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f8281526006840160205260409020805461154390614ef6565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614d96565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f28565b5f82815260068401602052604081206115d891614b3d565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6116706127a5565b61167c84848434613197565b905061169460015f805160206158e683398151915255565b9392505050565b5f8181525f805160206158868339815191526020526040808220815160e0810190925280545f805160206158a683398151915293929190829060ff1660038111156116e8576116e8614d96565b60038111156116f9576116f9614d96565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614d96565b14158015611793575060038151600381111561179057611790614d96565b14155b156117b4578051604051633b0d540d60e21b815261063191906004016152fc565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611e1a565b6040518263ffffffff1660e01b815260040161183d9190614f36565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d9190614f48565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206158c683398151915291906118cb90614ef6565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614d96565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f28565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91611981919060040161532d565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a9190614f48565b5f6119ca6127a5565b6119d5823334613365565b90506119ed60015f805160206158e683398151915255565b919050565b6119fa614b74565b5f8281525f80516020615906833981519152602052604090819020815160e0810190925280545f805160206158c6833981519152929190829060ff166005811115611a4757611a47614d96565b6005811115611a5857611a58614d96565b8152602001600182018054611a6c90614ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9890614ef6565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f805160206158c6833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b8490869086906153b7565b90815260200160405180910390205491505092915050565b5f8381525f805160206158868339815191526020526040808220815160e0810190925280545f805160206158a68339815191529284929091829060ff166003811115611bea57611bea614d96565b6003811115611bfb57611bfb614d96565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614d96565b14611ca9578251604051633b0d540d60e21b815261063191906004016152fc565b60208301516001600160a01b03163314611cc357336112ab565b600281516005811115611cd857611cd8614d96565b03611db5578615611cef57611ced8287612332565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611d28918491611d2391906153c6565b61363a565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d6984613791565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611dca57611dca614d96565b03611dfe57611dd883613791565b5f898152600686016020526040902055611df188612b9e565b6001945050505050611694565b805160405163170cc93360e21b81526106319190600401614f28565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ecd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ef491908101906153f1565b9150915080611f1657604051636b2f19e960e01b815260040160405180910390fd5b815115611f3c578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615611f78576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f8151602614611fb457815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561200357611fcb8160016154c3565b611fd6906008615316565b61ffff16848281518110611fec57611fec614fd3565b016020015160f81c901b9190911790600101611fb7565b5061ffff81161561202d5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612088576120448160036154c3565b61204f906008615316565b63ffffffff16856120618360026152a8565b8151811061207157612071614fd3565b016020015160f81c901b9190911790600101612030565b5063ffffffff8116156120ae57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612103576120c581601f6154c3565b6120d0906008615316565b866120dc8360066152a8565b815181106120ec576120ec614fd3565b016020015160f81c901b91909117906001016120b1565b50949350505050565b60605f8083356020850135601461212887870160408901614f73565b6121356060890189614f8e565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121bb6060850185614f8e565b9050811015611f7857816121d26060860186614f8e565b838181106121e2576121e2614fd3565b90506020028101906121f49190614fe7565b6121fe90806154d6565b905061220d6060870187614f8e565b8481811061221d5761221d614fd3565b905060200281019061222f9190614fe7565b61223990806154d6565b6122466060890189614f8e565b8681811061225657612256614fd3565b90506020028101906122689190614fe7565b6122769060208101906154d6565b61228360608b018b614f8e565b8881811061229357612293614fd3565b90506020028101906122a59190614fe7565b6122b6906060810190604001614d18565b6040516020016122cc9796959493929190615518565b60408051601f1981840301815291905291506001016121ae565b6122ee61393d565b610f7581613988565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561237d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123a491908101906153f1565b91509150806123c657604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612409573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242d9190614f48565b825114612453578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b03161561248f576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f8061249e84604001516139f6565b915091508187146124c55760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f805160206158a6833981519152906001600160401b039081169083161115612582575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26125a1565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f805160206158a6833981519152816125c586613be7565b90506125d0866122f7565b6125df57600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461260457336112ab565b5f86815260048301602052604090205460a082015161263391600160b01b90046001600160401b031690615581565b6001600160401b03168160c001516001600160401b0316101561267a5760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f85156126925761268b8786612332565b90506126b0565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906126d5906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561274b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061276f9190614f48565b905080846007015f8a81526020019081526020015f205f82825461279391906152a8565b90915550501515979650505050505050565b5f805160206158e68339815191528054600119016127d657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127e5614b74565b5f805160206158c68339815191525f806128016114fa87611e69565b91509150801561282857604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561285957612859614d96565b600581111561286a5761286a614d96565b815260200160018201805461287e90614ef6565b80601f01602080910402602001604051908101604052809291908181526020018280546128aa90614ef6565b80156128f55780601f106128cc576101008083540402835291602001916128f5565b820191905f5260205f20905b8154815290600101906020018083116128d857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561296057612960614d96565b14158015612981575060018151600581111561297e5761297e614d96565b14155b156129a257805160405163170cc93360e21b81526106319190600401614f28565b6003815160058111156129b7576129b7614d96565b036129c557600481526129ca565b600581525b8360080181602001516040516129e09190615184565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a2457612a24614d96565b021790555060208201516001820190612a3d90826151d9565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ae357612ae3614d96565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612b66575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613ecb565b60015f805160206158e683398151915255565b5f8181525f805160206158868339815191526020526040808220815160e0810190925280545f805160206158a683398151915293929190829060ff166003811115612beb57612beb614d96565b6003811115612bfc57612bfc614d96565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612d2a575f84815260048701602052604090205461271090612cdc90600160a01b900461ffff1685615316565b612ce691906152dd565b915081866007015f8681526020019081526020015f205f828254612d0a91906152a8565b90915550612d1a905082846154c3565b9050612d2a856020015182612b1a565b612d3f8560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612dbc57835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e0b57612dd38160016154c3565b612dde906008615316565b61ffff16868281518110612df457612df4614fd3565b016020015160f81c901b9190911790600101612dbf565b5061ffff811615612e355760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612e9057612e4c8160036154c3565b612e57906008615316565b63ffffffff1687612e698360026152a8565b81518110612e7957612e79614fd3565b016020015160f81c901b9190911790600101612e38565b5063ffffffff8116600314612eb857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f0d57612ecf81601f6154c3565b612eda906008615316565b88612ee68360066152a8565b81518110612ef657612ef6614fd3565b016020015160f81c901b9190911790600101612ebb565b505f805b6008811015612f6c57612f258160076154c3565b612f30906008615316565b6001600160401b031689612f458360266152a8565b81518110612f5557612f55614fd3565b016020015160f81c901b9190911790600101612f11565b505f805b6008811015612fcb57612f848160076154c3565b612f8f906008615316565b6001600160401b03168a612fa483602e6152a8565b81518110612fb457612fb4614fd3565b016020015160f81c901b9190911790600101612f70565b5091989097509095509350505050565b5f80825160271461301157825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b6002811015613060576130288160016154c3565b613033906008615316565b61ffff1685828151811061304957613049614fd3565b016020015160f81c901b9190911790600101613014565b5061ffff81161561308a5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b60048110156130e5576130a18160036154c3565b6130ac906008615316565b63ffffffff16866130be8360026152a8565b815181106130ce576130ce614fd3565b016020015160f81c901b919091179060010161308d565b5063ffffffff811660021461310d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131625761312481601f6154c3565b61312f906008615316565b8761313b8360066152a8565b8151811061314b5761314b614fd3565b016020015160f81c901b9190911790600101613110565b505f8660268151811061317757613177614fd3565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f805160206158a683398151915290600160401b900461ffff90811690861610806131eb575061271061ffff8616115b1561320f57604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b03908116908516101561324b576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b805483108061325d5750806001015483115b1561327e5760405163222d164360e21b815260048101849052602401610631565b825f61328982610e95565b90505f6132968983613f5e565b905060405180608001604052806132aa3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f805160206158a68339815191528161337e84610e95565b90505f61338a876119f2565b9050613395876122f7565b6133b5576040516330efa98b60e01b815260048101889052602401610631565b6002815160058111156133ca576133ca614d96565b146133eb57805160405163170cc93360e21b81526106319190600401614f28565b5f8282608001516133fc9190615581565b905083600201600a9054906101000a90046001600160401b0316826040015161342591906155a1565b6001600160401b0316816001600160401b0316111561346257604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f8061346e8a8461363a565b915091505f8a8360405160200161349c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561352f5761352f614d96565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615906833981519152602052604081206002015481905f805160206158c683398151915290600160801b90046001600160401b031661368285826144b1565b5f61368c8761468b565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136dc8a858b611e1a565b6040518263ffffffff1660e01b81526004016136f89190614f36565b6020604051808303815f875af1158015613714573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137389190614f48565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f805160206158a683398151915290505f6137b184604001516119f2565b90505f6003825160058111156137c9576137c9614d96565b14806137e757506004825160058111156137e5576137e5614d96565b145b156137f7575060c0810151613834565b60028251600581111561380c5761380c614d96565b03613818575042613834565b815160405163170cc93360e21b81526106319190600401614f28565b84608001516001600160401b0316816001600160401b03161161385b57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613880906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613910573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139349190614f48565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661398657604051631afcd79f60e31b815260040160405180910390fd5b565b61399061393d565b61399981614700565b6139a1614719565b610f75606082013560808301356139be60c0850160a08601614d18565b6139ce60e0860160c087016155cc565b6139df610100870160e088016155e5565b6139f161012088016101008901614f73565b614729565b5f808251602e14613a2c57825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613a7b57613a438160016154c3565b613a4e906008615316565b61ffff16858281518110613a6457613a64614fd3565b016020015160f81c901b9190911790600101613a2f565b5061ffff811615613aa55760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b0057613abc8160036154c3565b613ac7906008615316565b63ffffffff1686613ad98360026152a8565b81518110613ae957613ae9614fd3565b016020015160f81c901b9190911790600101613aa8565b5063ffffffff811615613b2657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b7b57613b3d81601f6154c3565b613b48906008615316565b87613b548360066152a8565b81518110613b6457613b64614fd3565b016020015160f81c901b9190911790600101613b29565b505f805b6008811015613bda57613b938160076154c3565b613b9e906008615316565b6001600160401b031688613bb38360266152a8565b81518110613bc357613bc3614fd3565b016020015160f81c901b9190911790600101613b7f565b5090969095509350505050565b613bef614b74565b5f8281525f805160206159068339815191526020526040808220815160e0810190925280545f805160206158c683398151915293929190829060ff166005811115613c3c57613c3c614d96565b6005811115613c4d57613c4d614d96565b8152602001600182018054613c6190614ef6565b80601f0160208091040260200160405190810160405280929190818152602001828054613c8d90614ef6565b8015613cd85780601f10613caf57610100808354040283529160200191613cd8565b820191905f5260205f20905b815481529060010190602001808311613cbb57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d4657613d46614d96565b14613d79575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff1690600401614f28565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613dbd57613dbd614d96565b021790555060208201516001820190613dd690826151d9565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e74858261363a565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613eee5760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f37576040519150601f19603f3d011682016040523d82523d5f602084013e613f3c565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fa257604051637fab81e560e01b815260040160405180910390fd5b5f805160206158c683398151915242613fc16060860160408701614d18565b6001600160401b0316111580613ffb5750613fdf6202a300426152a8565b613fef6060860160408701614d18565b6001600160401b031610155b15614035576140106060850160408601614d18565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b603061404460208601866154d6565b9050146140765761405860208501856154d6565b6040516326475b2f60e11b8152610631925060040190815260200190565b61408084806154d6565b90505f036140ad5761409284806154d6565b604051633e08a12560e11b8152600401610631929190615605565b5f600882016140bc86806154d6565b6040516140ca9291906153b7565b90815260200160405180910390205414614103576140e884806154d6565b60405163a41f772f60e01b8152600401610631929190615605565b61410d835f6144b1565b6040805160e08101909152815481525f908190614219906020810161413289806154d6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061417a908a018a6154d6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016141c360608a0160408b01614d18565b6001600160401b031681526020016141de60608a018a615633565b6141e790615647565b81526020016141f960808a018a615633565b61420290615647565b8152602001876001600160401b0316815250614858565b5f8281526006860160205260409020919350915061423782826151d9565b50816008840161424788806154d6565b6040516142559291906153b7565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90614291908590600401614f36565b6020604051808303815f875af11580156142ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142d19190614f48565b6040805160e0810190915290915080600181526020016142f189806154d6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561438057614380614d96565b02179055506020820151600182019061439990826151d9565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061443788806154d6565b6040516144459291906153b7565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144839190614d18565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f805160206158c68339815191525f6001600160401b0380841690851611156144e5576144de83856153c6565b90506144f2565b6144ef84846153c6565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614554575060018401548151614550916001600160401b0316906152a8565b8210155b1561457a576001600160401b038316606082015281815260408101516020820152614599565b828160600181815161458c9190615581565b6001600160401b03169052505b60608101516145a99060646155a1565b602082015160018601546001600160401b0392909216916145d49190600160401b900460ff16615316565b101561460457606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b03168160400181815161461f91906152a8565b9052506040810180516001600160401b038716919061463f9083906154c3565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f805160206159068339815191526020526040812060020180545f805160206158c683398151915291906008906146d590600160401b90046001600160401b031661570e565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61470861393d565b614710614a45565b610f7581614a4d565b61472161393d565b613986614b35565b61473161393d565b5f805160206158a683398151915261ffff84161580614755575061271061ffff8516115b1561477957604051635f12e6c360e11b815261ffff85166004820152602401610631565b8587111561479d5760405163222d164360e21b815260048101889052602401610631565b60ff831615806147b05750600a60ff8416115b156147d35760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b5f60608260400151516030146148815760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986148c2988a986001989297929690959094909390929101615729565b60405160208183030381529060405290505f5b846080015160200151518110156149345781856080015160200151828151811061490157614901614fd3565b602002602001015160405160200161491a9291906157e3565b60408051601f1981840301815291905291506001016148d5565b5060a0840151805160209182015151604051614954938593929101615819565b60405160208183030381529060405290505f5b8460a0015160200151518110156149c657818560a0015160200151828151811061499357614993614fd3565b60200260200101516040516020016149ac9291906157e3565b60408051601f198184030181529190529150600101614967565b5060c08401516040516149dd918391602001615854565b60405160208183030381529060405290506002816040516149fe9190615184565b602060405180830381855afa158015614a19573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614a3c9190614f48565b94909350915050565b61398661393d565b614a5561393d565b80355f805160206158c68339815191529081556014614a7a60608401604085016155e5565b60ff161180614a995750614a9460608301604084016155e5565b60ff16155b15614acd57614aae60608301604084016155e5565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614add60608301604084016155e5565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614b0e6040830160208401614d18565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b8b61393d565b508054614b4990614ef6565b5f825580601f10614b58575050565b601f0160209004905f5260205f2090810190610f759190614bb1565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614bc5575f8155600101614bb2565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614bfb575f80fd5b833592506020840135614c0d81614bc9565b9150614c1b60408501614bd6565b90509250925092565b5f60208284031215614c34575f80fd5b5035919050565b5f8060408385031215614c4c575f80fd5b82356001600160401b03811115614c61575f80fd5b830160808186031215614c72575f80fd5b9150614c8060208401614bd6565b90509250929050565b5f6101208284031215614c9a575f80fd5b50919050565b5f8060408385031215614cb1575f80fd5b82359150614c8060208401614bd6565b5f60208284031215614cd1575f80fd5b61169482614bd6565b5f8060408385031215614ceb575f80fd5b614cf483614bd6565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614d28575f80fd5b61169482614d02565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614d54575f80fd5b83356001600160401b03811115614d69575f80fd5b840160a08187031215614d7a575f80fd5b9250614d8860208501614d31565b9150614c1b60408501614d02565b634e487b7160e01b5f52602160045260245ffd5b60068110614dba57614dba614d96565b9052565b5f5b83811015614dd8578181015183820152602001614dc0565b50505f910152565b5f8151808452614df7816020860160208601614dbe565b601f01601f19169290920160200192915050565b60208152614e1d602082018351614daa565b5f602083015160e06040840152614e38610100840182614de0565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f8060208385031215614e9c575f80fd5b82356001600160401b0380821115614eb2575f80fd5b818501915085601f830112614ec5575f80fd5b813581811115614ed3575f80fd5b866020828501011115614ee4575f80fd5b60209290920196919550909350505050565b600181811c90821680614f0a57607f821691505b602082108103614c9a57634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614daa565b602081525f6116946020830184614de0565b5f60208284031215614f58575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f60208284031215614f83575f80fd5b813561169481614f5f565b5f808335601e19843603018112614fa3575f80fd5b8301803591506001600160401b03821115614fbc575f80fd5b6020019150600581901b360382131561378a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112614ffb575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561503b5761503b615005565b60405290565b604080519081016001600160401b038111828210171561503b5761503b615005565b604051601f8201601f191681016001600160401b038111828210171561508b5761508b615005565b604052919050565b5f6001600160401b038211156150ab576150ab615005565b50601f01601f191660200190565b5f82601f8301126150c8575f80fd5b81356150db6150d682615093565b615063565b8181528460208386010111156150ef575f80fd5b816020850160208301375f918101602001919091529392505050565b5f6060823603121561511b575f80fd5b615123615019565b82356001600160401b0380821115615139575f80fd5b615145368387016150b9565b8352602085013591508082111561515a575f80fd5b50615167368286016150b9565b60208301525061517960408401614d02565b604082015292915050565b5f8251614ffb818460208701614dbe565b601f82111561063a57805f5260205f20601f840160051c810160208510156151ba5750805b601f840160051c820191505b8181101561187d575f81556001016151c6565b81516001600160401b038111156151f2576151f2615005565b615206816152008454614ef6565b84615195565b602080601f831160018114615239575f84156152225750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b8281101561526757888601518255948401946001909101908401615248565b508582101561528457878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea5615294565b5f63ffffffff8083168181036152d3576152d3615294565b6001019392505050565b5f826152f757634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061531057615310614d96565b91905290565b8082028115828204841417610ea557610ea5615294565b5f60208083525f845461533f81614ef6565b806020870152604060018084165f8114615360576001811461537c576153a9565b60ff19851660408a0152604084151560051b8a010195506153a9565b895f5260205f205f5b858110156153a05781548b8201860152908301908801615385565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611f7857611f78615294565b80516119ed81614bc9565b5f8060408385031215615402575f80fd5b82516001600160401b0380821115615418575f80fd5b908401906060828703121561542b575f80fd5b615433615019565b8251815260208084015161544681614f5f565b8282015260408401518381111561545b575f80fd5b80850194505087601f85011261546f575f80fd5b8351925061547f6150d684615093565b8381528882858701011115615492575f80fd5b6154a184838301848801614dbe565b806040840152508195506154b68188016153e6565b9450505050509250929050565b81810381811115610ea557610ea5615294565b5f808335601e198436030181126154eb575f80fd5b8301803591506001600160401b03821115615504575f80fd5b60200191503681900382131561378a575f80fd5b5f8851615529818460208d01614dbe565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611f7857611f78615294565b6001600160401b038181168382160280821691908281146155c4576155c4615294565b505092915050565b5f602082840312156155dc575f80fd5b61169482614d31565b5f602082840312156155f5575f80fd5b813560ff81168114611694575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f8235603e19833603018112614ffb575f80fd5b5f60408236031215615657575f80fd5b61565f615041565b61566883614bd6565b81526020808401356001600160401b0380821115615684575f80fd5b9085019036601f830112615696575f80fd5b8135818111156156a8576156a8615005565b8060051b91506156b9848301615063565b81815291830184019184810190368411156156d2575f80fd5b938501935b838510156156fc57843592506156ec83614f5f565b82825293850193908501906156d7565b94860194909452509295945050505050565b5f6001600160401b038083168181036152d3576152d3615294565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161576f81602a850160208b01614dbe565b86519083019061578681602a840160208b01614dbe565b60c087901b6001600160c01b031916602a92909101918201526157b8603282018660e01b6001600160e01b0319169052565b6157d1603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516157f4818460208801614dbe565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f845161582a818460208901614dbe565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615865818460208801614dbe565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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: "0x608060405234801561000f575f80fd5b50604051615c0d380380615c0d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615ac08061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614d77565b61060a565b005b348015610216575f80fd5b50610209610225366004614db2565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614d77565b61084d565b34801561027f575f80fd5b5061020961028e366004614dc9565b610858565b34801561029e575f80fd5b506102096102ad366004614e17565b610d44565b3480156102bd575f80fd5b506102096102cc366004614e2e565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614db2565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614d77565b610eab565b34801561038c575f80fd5b5061020961039b366004614e4f565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614e68565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614ea6565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614db2565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614d77565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614db2565b61123b565b3480156104a4575f80fd5b506102096104b3366004614e68565b611306565b3480156104c3575f80fd5b506102096104d2366004614e4f565b6114de565b6104076104e5366004614ed0565b611667565b3480156104f5575f80fd5b506104075f80516020615a3483398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614db2565b61169b565b34801561054e575f80fd5b506104075f80516020615a5483398151915281565b34801561056e575f80fd5b5061020961057d366004614db2565b611884565b610407610590366004614db2565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614db2565b6119f2565b60405161024c9190614f99565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b50610407610605366004615019565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615a948339815191526020526040808220815160e0810190925280545f80516020615a5483398151915293929190829060ff16600581111561068c5761068c614f24565b600581111561069d5761069d614f24565b81526020016001820180546106b190615084565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd90615084565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614f24565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016150b6565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611e1a565b6040518263ffffffff1660e01b815260040161080791906150c4565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084791906150d6565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615a548339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091191906150d6565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b6060850160408601615101565b6001600160a01b03161461098e576109696060840160408501615101565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c606085018561511c565b905090505f805b828163ffffffff161015610c84575f6109bf606088018861511c565b8363ffffffff168181106109d5576109d5615161565b90506020028101906109e79190615175565b6109f090615299565b80516040519192505f916008880191610a0891615312565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b815261063191906004016150c4565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8191615312565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf91906150d6565b90508086600801835f0151604051610ad79190615312565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614f24565b021790555060208201516001820190610b729082615367565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c17911685615436565b8251604051919550610c2891615312565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d90615449565b90506109a3565b50600483018190555f610ca2610c9986611e69565b60400151611f7f565b90505f610cae8761210c565b90505f600282604051610cc19190615312565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff91906150d6565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd5836122e6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a826122f7565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614f24565b14610e8b578060405163170cc93360e21b815260040161063191906150b6565b6108478383612332565b5f610ea564e8d4a510008361546b565b92915050565b6108478383836125ac565b610ebe6127a5565b5f80516020615a348339815191525f80610ed7846127dc565b91509150610ee4826122f7565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614f24565b03610f44575f83815260078501602052604081208054919055610f428282612b1a565b505b610f5a81610f5584604001516111e3565b612b78565b505050505b610f7560015f80516020615a7483398151915255565b50565b5f8181525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a3483398151915293929190829060ff166003811115610fc557610fc5614f24565b6003811115610fd657610fd6614f24565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614f24565b14611084578251604051633b0d540d60e21b8152610631919060040161548a565b60048151600581111561109957611099614f24565b036110af576110a785612b9e565b505050505050565b5f806110c66110bd89611e69565b60400151612d85565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a510006154a4565b5f611206826119f2565b6080015192915050565b61121b8383836125ac565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615a348339815191525f611253836119f2565b519050600481600581111561126a5761126a614f24565b1461128a578060405163170cc93360e21b815260040161063191906150b6565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612b1a565b61130e6127a5565b5f8181525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a3483398151915293929190829060ff16600381111561135b5761135b614f24565b600381111561136c5761136c614f24565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614f24565b14611406578051604051633b0d540d60e21b8152610631919060040161548a565b600461141582604001516119f2565b51600581111561142757611427614f24565b146114b9575f61143685611e69565b90505f806114478360400151612d85565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612b9e565b50506114da60015f80516020615a7483398151915255565b5050565b5f80516020615a548339815191525f806115036114fa85611e69565b60400151612fdb565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f8281526006840160205260409020805461154390615084565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614f24565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff16906004016150b6565b5f82815260068401602052604081206115d891614ccb565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6116706127a5565b61167c84848434613197565b905061169460015f80516020615a7483398151915255565b9392505050565b5f8181525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a3483398151915293929190829060ff1660038111156116e8576116e8614f24565b60038111156116f9576116f9614f24565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614f24565b14158015611793575060038151600381111561179057611790614f24565b14155b156117b4578051604051633b0d540d60e21b8152610631919060040161548a565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611e1a565b6040518263ffffffff1660e01b815260040161183d91906150c4565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d91906150d6565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615a5483398151915291906118cb90615084565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614f24565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff16906004016150b6565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161198191906004016154bb565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a91906150d6565b5f6119ca6127a5565b6119d5823334613365565b90506119ed60015f80516020615a7483398151915255565b919050565b6119fa614d02565b5f8281525f80516020615a94833981519152602052604090819020815160e0810190925280545f80516020615a54833981519152929190829060ff166005811115611a4757611a47614f24565b6005811115611a5857611a58614f24565b8152602001600182018054611a6c90615084565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9890615084565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615a54833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b849086908690615545565b90815260200160405180910390205491505092915050565b5f8381525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a348339815191529284929091829060ff166003811115611bea57611bea614f24565b6003811115611bfb57611bfb614f24565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614f24565b14611ca9578251604051633b0d540d60e21b8152610631919060040161548a565b60208301516001600160a01b03163314611cc357336112ab565b600281516005811115611cd857611cd8614f24565b03611db5578615611cef57611ced8287612332565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611d28918491611d239190615554565b61363a565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d6984613791565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611dca57611dca614f24565b03611dfe57611dd883613791565b5f898152600686016020526040902055611df188612b9e565b6001945050505050611694565b805160405163170cc93360e21b815261063191906004016150b6565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ecd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ef4919081019061557f565b9150915080611f1657604051636b2f19e960e01b815260040160405180910390fd5b815115611f3c578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615611f78576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f8151602614611fb457815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561200357611fcb816001615651565b611fd69060086154a4565b61ffff16848281518110611fec57611fec615161565b016020015160f81c901b9190911790600101611fb7565b5061ffff81161561202d5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561208857612044816003615651565b61204f9060086154a4565b63ffffffff1685612061836002615436565b8151811061207157612071615161565b016020015160f81c901b9190911790600101612030565b5063ffffffff8116156120ae57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612103576120c581601f615651565b6120d09060086154a4565b866120dc836006615436565b815181106120ec576120ec615161565b016020015160f81c901b91909117906001016120b1565b50949350505050565b60605f8083356020850135601461212887870160408901615101565b612135606089018961511c565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121bb606085018561511c565b9050811015611f7857816121d2606086018661511c565b838181106121e2576121e2615161565b90506020028101906121f49190615175565b6121fe9080615664565b905061220d606087018761511c565b8481811061221d5761221d615161565b905060200281019061222f9190615175565b6122399080615664565b612246606089018961511c565b8681811061225657612256615161565b90506020028101906122689190615175565b612276906020810190615664565b61228360608b018b61511c565b8881811061229357612293615161565b90506020028101906122a59190615175565b6122b6906060810190604001614ea6565b6040516020016122cc97969594939291906156a6565b60408051601f1981840301815291905291506001016121ae565b6122ee61393d565b610f7581613988565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561237d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123a4919081019061557f565b91509150806123c657604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612409573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242d91906150d6565b825114612453578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b03161561248f576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f8061249e84604001516139f6565b915091508187146124c55760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615a34833981519152906001600160401b039081169083161115612582575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26125a1565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615a34833981519152816125c586613be7565b90506125d0866122f7565b6125df57600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461260457336112ab565b5f86815260048301602052604090205460a082015161263391600160b01b90046001600160401b03169061570f565b6001600160401b03168160c001516001600160401b0316101561267a5760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f85156126925761268b8786612332565b90506126b0565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906126d5906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561274b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061276f91906150d6565b905080846007015f8a81526020019081526020015f205f8282546127939190615436565b90915550501515979650505050505050565b5f80516020615a748339815191528054600119016127d657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127e5614d02565b5f80516020615a548339815191525f806128016114fa87611e69565b91509150801561282857604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561285957612859614f24565b600581111561286a5761286a614f24565b815260200160018201805461287e90615084565b80601f01602080910402602001604051908101604052809291908181526020018280546128aa90615084565b80156128f55780601f106128cc576101008083540402835291602001916128f5565b820191905f5260205f20905b8154815290600101906020018083116128d857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561296057612960614f24565b14158015612981575060018151600581111561297e5761297e614f24565b14155b156129a257805160405163170cc93360e21b815261063191906004016150b6565b6003815160058111156129b7576129b7614f24565b036129c557600481526129ca565b600581525b8360080181602001516040516129e09190615312565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a2457612a24614f24565b021790555060208201516001820190612a3d9082615367565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ae357612ae3614f24565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612b66575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613ecb565b60015f80516020615a7483398151915255565b5f8181525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a3483398151915293929190829060ff166003811115612beb57612beb614f24565b6003811115612bfc57612bfc614f24565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612d2a575f84815260048701602052604090205461271090612cdc90600160a01b900461ffff16856154a4565b612ce6919061546b565b915081866007015f8681526020019081526020015f205f828254612d0a9190615436565b90915550612d1a90508284615651565b9050612d2a856020015182612b1a565b612d3f8560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612dbc57835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e0b57612dd3816001615651565b612dde9060086154a4565b61ffff16868281518110612df457612df4615161565b016020015160f81c901b9190911790600101612dbf565b5061ffff811615612e355760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612e9057612e4c816003615651565b612e579060086154a4565b63ffffffff1687612e69836002615436565b81518110612e7957612e79615161565b016020015160f81c901b9190911790600101612e38565b5063ffffffff8116600314612eb857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f0d57612ecf81601f615651565b612eda9060086154a4565b88612ee6836006615436565b81518110612ef657612ef6615161565b016020015160f81c901b9190911790600101612ebb565b505f805b6008811015612f6c57612f25816007615651565b612f309060086154a4565b6001600160401b031689612f45836026615436565b81518110612f5557612f55615161565b016020015160f81c901b9190911790600101612f11565b505f805b6008811015612fcb57612f84816007615651565b612f8f9060086154a4565b6001600160401b03168a612fa483602e615436565b81518110612fb457612fb4615161565b016020015160f81c901b9190911790600101612f70565b5091989097509095509350505050565b5f80825160271461301157825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b600281101561306057613028816001615651565b6130339060086154a4565b61ffff1685828151811061304957613049615161565b016020015160f81c901b9190911790600101613014565b5061ffff81161561308a5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b60048110156130e5576130a1816003615651565b6130ac9060086154a4565b63ffffffff16866130be836002615436565b815181106130ce576130ce615161565b016020015160f81c901b919091179060010161308d565b5063ffffffff811660021461310d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131625761312481601f615651565b61312f9060086154a4565b8761313b836006615436565b8151811061314b5761314b615161565b016020015160f81c901b9190911790600101613110565b505f8660268151811061317757613177615161565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615a3483398151915290600160401b900461ffff90811690861610806131eb575061271061ffff8616115b1561320f57604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b03908116908516101561324b576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b805483108061325d5750806001015483115b1561327e5760405163222d164360e21b815260048101849052602401610631565b825f61328982610e95565b90505f6132968983613f5e565b905060405180608001604052806132aa3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615a348339815191528161337e84610e95565b90505f61338a876119f2565b9050613395876122f7565b6133b5576040516330efa98b60e01b815260048101889052602401610631565b6002815160058111156133ca576133ca614f24565b146133eb57805160405163170cc93360e21b815261063191906004016150b6565b5f8282608001516133fc919061570f565b905083600201600a9054906101000a90046001600160401b03168260400151613425919061572f565b6001600160401b0316816001600160401b0316111561346257604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f8061346e8a8461363a565b915091505f8a8360405160200161349c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561352f5761352f614f24565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615a94833981519152602052604081206002015481905f80516020615a5483398151915290600160801b90046001600160401b031661368285826144d6565b5f61368c876146b0565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136dc8a858b611e1a565b6040518263ffffffff1660e01b81526004016136f891906150c4565b6020604051808303815f875af1158015613714573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061373891906150d6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615a3483398151915290505f6137b184604001516119f2565b90505f6003825160058111156137c9576137c9614f24565b14806137e757506004825160058111156137e5576137e5614f24565b145b156137f7575060c0810151613834565b60028251600581111561380c5761380c614f24565b03613818575042613834565b815160405163170cc93360e21b815261063191906004016150b6565b84608001516001600160401b0316816001600160401b03161161385b57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613880906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613910573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061393491906150d6565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661398657604051631afcd79f60e31b815260040160405180910390fd5b565b61399061393d565b61399981614725565b6139a161473e565b610f75606082013560808301356139be60c0850160a08601614ea6565b6139ce60e0860160c0870161575a565b6139df610100870160e08801615773565b6139f161012088016101008901615101565b61474e565b5f808251602e14613a2c57825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613a7b57613a43816001615651565b613a4e9060086154a4565b61ffff16858281518110613a6457613a64615161565b016020015160f81c901b9190911790600101613a2f565b5061ffff811615613aa55760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b0057613abc816003615651565b613ac79060086154a4565b63ffffffff1686613ad9836002615436565b81518110613ae957613ae9615161565b016020015160f81c901b9190911790600101613aa8565b5063ffffffff811615613b2657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b7b57613b3d81601f615651565b613b489060086154a4565b87613b54836006615436565b81518110613b6457613b64615161565b016020015160f81c901b9190911790600101613b29565b505f805b6008811015613bda57613b93816007615651565b613b9e9060086154a4565b6001600160401b031688613bb3836026615436565b81518110613bc357613bc3615161565b016020015160f81c901b9190911790600101613b7f565b5090969095509350505050565b613bef614d02565b5f8281525f80516020615a948339815191526020526040808220815160e0810190925280545f80516020615a5483398151915293929190829060ff166005811115613c3c57613c3c614f24565b6005811115613c4d57613c4d614f24565b8152602001600182018054613c6190615084565b80601f0160208091040260200160405190810160405280929190818152602001828054613c8d90615084565b8015613cd85780601f10613caf57610100808354040283529160200191613cd8565b820191905f5260205f20905b815481529060010190602001808311613cbb57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d4657613d46614f24565b14613d79575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016150b6565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613dbd57613dbd614f24565b021790555060208201516001820190613dd69082615367565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e74858261363a565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613eee5760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f37576040519150601f19603f3d011682016040523d82523d5f602084013e613f3c565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fa257604051637fab81e560e01b815260040160405180910390fd5b5f80516020615a5483398151915242613fc16060860160408701614ea6565b6001600160401b0316111580613ffb5750613fdf6202a30042615436565b613fef6060860160408701614ea6565b6001600160401b031610155b15614035576140106060850160408601614ea6565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b61404a6140456060860186615793565b61487d565b61405a6140456080860186615793565b60306140696020860186615664565b90501461409b5761407d6020850185615664565b6040516326475b2f60e11b8152610631925060040190815260200190565b6140a58480615664565b90505f036140d2576140b78480615664565b604051633e08a12560e11b81526004016106319291906157a7565b5f600882016140e18680615664565b6040516140ef929190615545565b908152602001604051809103902054146141285761410d8480615664565b60405163a41f772f60e01b81526004016106319291906157a7565b614132835f6144d6565b6040805160e08101909152815481525f90819061423e90602081016141578980615664565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061419f908a018a615664565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016141e860608a0160408b01614ea6565b6001600160401b0316815260200161420360608a018a615793565b61420c906157d5565b815260200161421e60808a018a615793565b614227906157d5565b8152602001876001600160401b03168152506149e6565b5f8281526006860160205260409020919350915061425c8282615367565b50816008840161426c8880615664565b60405161427a929190615545565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906142b69085906004016150c4565b6020604051808303815f875af11580156142d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142f691906150d6565b6040805160e0810190915290915080600181526020016143168980615664565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143a5576143a5614f24565b0217905550602082015160018201906143be9082615367565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061445c8880615664565b60405161446a929190615545565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144a89190614ea6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615a548339815191525f6001600160401b03808416908516111561450a576145038385615554565b9050614517565b6145148484615554565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614579575060018401548151614575916001600160401b031690615436565b8210155b1561459f576001600160401b0383166060820152818152604081015160208201526145be565b82816060018181516145b1919061570f565b6001600160401b03169052505b60608101516145ce90606461572f565b602082015160018601546001600160401b0392909216916145f99190600160401b900460ff166154a4565b101561462957606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b0316816040018181516146449190615436565b9052506040810180516001600160401b0387169190614664908390615651565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615a948339815191526020526040812060020180545f80516020615a5483398151915291906008906146fa90600160401b90046001600160401b031661589c565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61472d61393d565b614735614bd3565b610f7581614bdb565b61474661393d565b613986614cc3565b61475661393d565b5f80516020615a3483398151915261ffff8416158061477a575061271061ffff8516115b1561479e57604051635f12e6c360e11b815261ffff85166004820152602401610631565b858711156147c25760405163222d164360e21b815260048101889052602401610631565b60ff831615806147d55750600a60ff8416115b156147f85760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b61488a6020820182614e4f565b63ffffffff161580156148aa57506148a5602082018261511c565b151590505b156148f1576148bc6020820182614e4f565b6148c9602083018361511c565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b6148fe602082018261511c565b905061490d6020830183614e4f565b63ffffffff161115614926576148bc6020820182614e4f565b60015b614936602083018361511c565b90508110156114da5761494c602083018361511c565b614957600184615651565b81811061496657614966615161565b905060200201602081019061497b9190615101565b6001600160a01b0316614991602084018461511c565b838181106149a1576149a1615161565b90506020020160208101906149b69190615101565b6001600160a01b031610156149de57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614929565b5f6060826040015151603014614a0f5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a50988a9860019892979296909590949093909291016158b7565b60405160208183030381529060405290505f5b84608001516020015151811015614ac257818560800151602001518281518110614a8f57614a8f615161565b6020026020010151604051602001614aa8929190615971565b60408051601f198184030181529190529150600101614a63565b5060a0840151805160209182015151604051614ae29385939291016159a7565b60405160208183030381529060405290505f5b8460a001516020015151811015614b5457818560a00151602001518281518110614b2157614b21615161565b6020026020010151604051602001614b3a929190615971565b60408051601f198184030181529190529150600101614af5565b5060c0840151604051614b6b9183916020016159e2565b6040516020818303038152906040529050600281604051614b8c9190615312565b602060405180830381855afa158015614ba7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bca91906150d6565b94909350915050565b61398661393d565b614be361393d565b80355f80516020615a548339815191529081556014614c086060840160408501615773565b60ff161180614c275750614c226060830160408401615773565b60ff16155b15614c5b57614c3c6060830160408401615773565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614c6b6060830160408401615773565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614c9c6040830160208401614ea6565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b8b61393d565b508054614cd790615084565b5f825580601f10614ce6575050565b601f0160209004905f5260205f2090810190610f759190614d3f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614d53575f8155600101614d40565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614d89575f80fd5b833592506020840135614d9b81614d57565b9150614da960408501614d64565b90509250925092565b5f60208284031215614dc2575f80fd5b5035919050565b5f8060408385031215614dda575f80fd5b82356001600160401b03811115614def575f80fd5b830160808186031215614e00575f80fd5b9150614e0e60208401614d64565b90509250929050565b5f6101208284031215614e28575f80fd5b50919050565b5f8060408385031215614e3f575f80fd5b82359150614e0e60208401614d64565b5f60208284031215614e5f575f80fd5b61169482614d64565b5f8060408385031215614e79575f80fd5b614e8283614d64565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614eb6575f80fd5b61169482614e90565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614ee2575f80fd5b83356001600160401b03811115614ef7575f80fd5b840160a08187031215614f08575f80fd5b9250614f1660208501614ebf565b9150614da960408501614e90565b634e487b7160e01b5f52602160045260245ffd5b60068110614f4857614f48614f24565b9052565b5f5b83811015614f66578181015183820152602001614f4e565b50505f910152565b5f8151808452614f85816020860160208601614f4c565b601f01601f19169290920160200192915050565b60208152614fab602082018351614f38565b5f602083015160e06040840152614fc6610100840182614f6e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f806020838503121561502a575f80fd5b82356001600160401b0380821115615040575f80fd5b818501915085601f830112615053575f80fd5b813581811115615061575f80fd5b866020828501011115615072575f80fd5b60209290920196919550909350505050565b600181811c9082168061509857607f821691505b602082108103614e2857634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614f38565b602081525f6116946020830184614f6e565b5f602082840312156150e6575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f60208284031215615111575f80fd5b8135611694816150ed565b5f808335601e19843603018112615131575f80fd5b8301803591506001600160401b0382111561514a575f80fd5b6020019150600581901b360382131561378a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615189575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156151c9576151c9615193565b60405290565b604080519081016001600160401b03811182821017156151c9576151c9615193565b604051601f8201601f191681016001600160401b038111828210171561521957615219615193565b604052919050565b5f6001600160401b0382111561523957615239615193565b50601f01601f191660200190565b5f82601f830112615256575f80fd5b813561526961526482615221565b6151f1565b81815284602083860101111561527d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156152a9575f80fd5b6152b16151a7565b82356001600160401b03808211156152c7575f80fd5b6152d336838701615247565b835260208501359150808211156152e8575f80fd5b506152f536828601615247565b60208301525061530760408401614e90565b604082015292915050565b5f8251615189818460208701614f4c565b601f82111561063a57805f5260205f20601f840160051c810160208510156153485750805b601f840160051c820191505b8181101561187d575f8155600101615354565b81516001600160401b0381111561538057615380615193565b6153948161538e8454615084565b84615323565b602080601f8311600181146153c7575f84156153b05750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b828110156153f5578886015182559484019460019091019084016153d6565b508582101561541257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea5615422565b5f63ffffffff80831681810361546157615461615422565b6001019392505050565b5f8261548557634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061549e5761549e614f24565b91905290565b8082028115828204841417610ea557610ea5615422565b5f60208083525f84546154cd81615084565b806020870152604060018084165f81146154ee576001811461550a57615537565b60ff19851660408a0152604084151560051b8a01019550615537565b895f5260205f205f5b8581101561552e5781548b8201860152908301908801615513565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611f7857611f78615422565b80516119ed81614d57565b5f8060408385031215615590575f80fd5b82516001600160401b03808211156155a6575f80fd5b90840190606082870312156155b9575f80fd5b6155c16151a7565b825181526020808401516155d4816150ed565b828201526040840151838111156155e9575f80fd5b80850194505087601f8501126155fd575f80fd5b8351925061560d61526484615221565b8381528882858701011115615620575f80fd5b61562f84838301848801614f4c565b80604084015250819550615644818801615574565b9450505050509250929050565b81810381811115610ea557610ea5615422565b5f808335601e19843603018112615679575f80fd5b8301803591506001600160401b03821115615692575f80fd5b60200191503681900382131561378a575f80fd5b5f88516156b7818460208d01614f4c565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611f7857611f78615422565b6001600160401b0381811683821602808216919082811461575257615752615422565b505092915050565b5f6020828403121561576a575f80fd5b61169482614ebf565b5f60208284031215615783575f80fd5b813560ff81168114611694575f80fd5b5f8235603e19833603018112615189575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156157e5575f80fd5b6157ed6151cf565b6157f683614d64565b81526020808401356001600160401b0380821115615812575f80fd5b9085019036601f830112615824575f80fd5b81358181111561583657615836615193565b8060051b91506158478483016151f1565b8181529183018401918481019036841115615860575f80fd5b938501935b8385101561588a578435925061587a836150ed565b8282529385019390850190615865565b94860194909452509295945050505050565b5f6001600160401b0380831681810361546157615461615422565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516158fd81602a850160208b01614f4c565b86519083019061591481602a840160208b01614f4c565b60c087901b6001600160c01b031916602a9290910191820152615946603282018660e01b6001600160e01b0319169052565b61595f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615982818460208801614f4c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516159b8818460208901614f4c565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516159f3818460208801614f4c565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 dad6a49ad..6db96b902 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\":\"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\":\"UnexpectedRegistrationStatus\",\"inputs\":[{\"name\":\"validRegistration\",\"type\":\"bool\",\"internalType\":\"bool\"}]}]", - Bin: "0x608060405234801561000f575f80fd5b5060405161384738038061384783398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b6136fa8061014d5f395ff3fe608060405234801561000f575f80fd5b5060043610610132575f3560e01c80639ba96b86116100b4578063c974d1b611610079578063c974d1b6146102a7578063d588c18f146102af578063d5f20ff6146102c2578063df93d8de146102e2578063f2fde38b146102ec578063fd7ac5e7146102ff575f80fd5b80639ba96b861461024c578063a3a65e481461025f578063b771b3bc14610272578063bc5fbfec14610280578063bee0a03f14610294575f80fd5b8063715018a6116100fa578063715018a6146101be578063732214f8146101c65780638280a25a146101db5780638da5cb5b146101f557806397fb70d414610239575f80fd5b80630322ed981461013657806320d91b7a1461014b578063467ef06f1461015e57806360305d621461017157806366435abf14610193575b5f80fd5b610149610144366004612aa2565b610312565b005b610149610159366004612ad1565b610529565b61014961016c366004612b1f565b610a15565b610179601481565b60405163ffffffff90911681526020015b60405180910390f35b6101a66101a1366004612aa2565b610a23565b6040516001600160401b03909116815260200161018a565b610149610a37565b6101cd5f81565b60405190815260200161018a565b6101e3603081565b60405160ff909116815260200161018a565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b03165b6040516001600160a01b03909116815260200161018a565b610149610247366004612aa2565b610a4a565b6101cd61025a366004612b4e565b610a5f565b61014961026d366004612b1f565b610a7b565b6102216005600160991b0181565b6101cd5f805160206136ae83398151915281565b6101496102a2366004612aa2565b610c04565b6101e3601481565b6101496102bd366004612ba7565b610d41565b6102d56102d0366004612aa2565b610e4f565b60405161018a9190612c64565b6101a66202a30081565b6101496102fa366004612ce4565b610f9e565b6101cd61030d366004612d06565b610fdb565b5f8181525f805160206136ce8339815191526020526040808220815160e0810190925280545f805160206136ae83398151915293929190829060ff16600581111561035f5761035f612be3565b600581111561037057610370612be3565b815260200160018201805461038490612d71565b80601f01602080910402602001604051908101604052809291908181526020018280546103b090612d71565b80156103fb5780601f106103d2576101008083540402835291602001916103fb565b820191905f5260205f20905b8154815290600101906020018083116103de57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561046657610466612be3565b146104a2575f8381526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612da9565b60405180910390fd5b6005600160991b016001600160a01b031663ee5b48eb6104c78584606001515f611036565b6040518263ffffffff1660e01b81526004016104e39190612db7565b6020604051808303815f875af11580156104ff573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105239190612dc9565b50505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f805160206136ae8339815191529060ff161561057b57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105e29190612dc9565b83602001351461060b576040516372b0a7e760e11b815260208401356004820152602401610499565b3061061c6060850160408601612ce4565b6001600160a01b03161461065f5761063a6060840160408501612ce4565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610499565b5f61066d6060850185612de0565b905090505f805b828163ffffffff161015610955575f6106906060880188612de0565b8363ffffffff168181106106a6576106a6612e25565b90506020028101906106b89190612e39565b6106c190612f5d565b80516040519192505f9160088801916106d991612fd6565b9081526020016040518091039020541461070957805160405163a41f772f60e01b81526104999190600401612db7565b5f6002885f01358460405160200161073892919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261075291612fd6565b602060405180830381855afa15801561076d573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906107909190612dc9565b90508086600801835f01516040516107a89190612fd6565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff1916600183600581111561082a5761082a612be3565b0217905550602082015160018201906108439082613032565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff1916928416929092179091558301516108e8911685613105565b82516040519195506108f991612fd6565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a350508061094e90613118565b9050610674565b50600483018190555f61097361096a86611085565b6040015161119b565b90505f61097f87611328565b90505f6002826040516109929190612fd6565b602060405180830381855afa1580156109ad573d5f803e3d5ffd5b5050506040513d601f19601f820116820180604052508101906109d09190612dc9565b90508281146109fc57604051631872fc8d60e01b81526004810182905260248101849052604401610499565b5050506009909201805460ff1916600117905550505050565b610a1e81611502565b505050565b5f610a2d82610e4f565b6080015192915050565b610a3f611840565b610a485f61189b565b565b610a52611840565b610a5b8161190b565b5050565b5f610a68611840565b610a728383611bef565b90505b92915050565b5f805160206136ae8339815191525f80610aa0610a9785611085565b60400151612142565b9150915080610ac657604051632d07135360e01b81528115156004820152602401610499565b5f82815260068401602052604090208054610ae090612d71565b90505f03610b045760405163089938b360e11b815260048101839052602401610499565b60015f83815260078501602052604090205460ff166005811115610b2a57610b2a612be3565b14610b5d575f8281526007840160205260409081902054905163170cc93360e21b81526104999160ff1690600401612da9565b5f8281526006840160205260408120610b7591612a16565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f805160206136ae8339815191529190610c4b90612d71565b90505f03610c6f5760405163089938b360e11b815260048101839052602401610499565b60015f83815260078301602052604090205460ff166005811115610c9557610c95612be3565b14610cc8575f8281526007820160205260409081902054905163170cc93360e21b81526104999160ff1690600401612da9565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb91610d01919060040161313a565b6020604051808303815f875af1158015610d1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a1e9190612dc9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f81158015610d855750825b90505f826001600160401b03166001148015610da05750303b155b905081158015610dae575080155b15610dcc5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610df657845460ff60401b1916600160401b1785555b610e0087876122fe565b8315610e4657845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050565b610e57612a4d565b5f8281525f805160206136ce833981519152602052604090819020815160e0810190925280545f805160206136ae833981519152929190829060ff166005811115610ea457610ea4612be3565b6005811115610eb557610eb5612be3565b8152602001600182018054610ec990612d71565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef590612d71565b8015610f405780601f10610f1757610100808354040283529160200191610f40565b820191905f5260205f20905b815481529060010190602001808311610f2357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b610fa6611840565b6001600160a01b038116610fcf57604051631e4fbdf760e01b81525f6004820152602401610499565b610fd88161189b565b50565b6040515f905f805160206136ae833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb089061101e90869086906131c4565b90815260200160405180910390205491505092915050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa1580156110e9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261111091908101906131e2565b915091508061113257604051636b2f19e960e01b815260040160405180910390fd5b815115611158578151604051636ba589a560e01b81526004810191909152602401610499565b60208201516001600160a01b031615611194576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610499565b5092915050565b5f81516026146111d057815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610499565b5f805b600281101561121f576111e78160016132b4565b6111f29060086132c7565b61ffff1684828151811061120857611208612e25565b016020015160f81c901b91909117906001016111d3565b5061ffff8116156112495760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b60048110156112a4576112608160036132b4565b61126b9060086132c7565b63ffffffff168561127d836002613105565b8151811061128d5761128d612e25565b016020015160f81c901b919091179060010161124c565b5063ffffffff8116156112ca57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561131f576112e181601f6132b4565b6112ec9060086132c7565b866112f8836006613105565b8151811061130857611308612e25565b016020015160f81c901b91909117906001016112cd565b50949350505050565b60605f8083356020850135601461134487870160408901612ce4565b6113516060890189612de0565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6113d76060850185612de0565b905081101561119457816113ee6060860186612de0565b838181106113fe576113fe612e25565b90506020028101906114109190612e39565b61141a90806132de565b90506114296060870187612de0565b8481811061143957611439612e25565b905060200281019061144b9190612e39565b61145590806132de565b6114626060890189612de0565b8681811061147257611472612e25565b90506020028101906114849190612e39565b6114929060208101906132de565b61149f60608b018b612de0565b888181106114af576114af612e25565b90506020028101906114c19190612e39565b6114d2906060810190604001613320565b6040516020016114e89796959493929190613339565b60408051601f1981840301815291905291506001016113ca565b5f61150b612a4d565b5f805160206136ae8339815191525f80611527610a9787611085565b91509150801561154e57604051632d07135360e01b81528115156004820152602401610499565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561157f5761157f612be3565b600581111561159057611590612be3565b81526020016001820180546115a490612d71565b80601f01602080910402602001604051908101604052809291908181526020018280546115d090612d71565b801561161b5780601f106115f25761010080835404028352916020019161161b565b820191905f5260205f20905b8154815290600101906020018083116115fe57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561168657611686612be3565b141580156116a757506001815160058111156116a4576116a4612be3565b14155b156116c857805160405163170cc93360e21b81526104999190600401612da9565b6003815160058111156116dd576116dd612be3565b036116eb57600481526116f0565b600581525b8360080181602001516040516117069190612fd6565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561174a5761174a612be3565b0217905550602082015160018201906117639082613032565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558051600581111561180957611809612be3565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b336118727f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610a485760405163118cdaa760e01b8152336004820152602401610499565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b611913612a4d565b5f8281525f805160206136ce8339815191526020526040808220815160e0810190925280545f805160206136ae83398151915293929190829060ff16600581111561196057611960612be3565b600581111561197157611971612be3565b815260200160018201805461198590612d71565b80601f01602080910402602001604051908101604052809291908181526020018280546119b190612d71565b80156119fc5780601f106119d3576101008083540402835291602001916119fc565b820191905f5260205f20905b8154815290600101906020018083116119df57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115611a6a57611a6a612be3565b14611a9d575f8481526007830160205260409081902054905163170cc93360e21b81526104999160ff1690600401612da9565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115611ae157611ae1612be3565b021790555060208201516001820190611afa9082613032565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f611b988582612318565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16611c3357604051637fab81e560e01b815260040160405180910390fd5b5f805160206136ae83398151915242611c526060860160408701613320565b6001600160401b0316111580611c8c5750611c706202a30042613105565b611c806060860160408701613320565b6001600160401b031610155b15611cc657611ca16060850160408601613320565b604051635879da1360e11b81526001600160401b039091166004820152602401610499565b6030611cd560208601866132de565b905014611d0757611ce960208501856132de565b6040516326475b2f60e11b8152610499925060040190815260200190565b611d1184806132de565b90505f03611d3e57611d2384806132de565b604051633e08a12560e11b81526004016104999291906133a2565b5f60088201611d4d86806132de565b604051611d5b9291906131c4565b90815260200160405180910390205414611d9457611d7984806132de565b60405163a41f772f60e01b81526004016104999291906133a2565b611d9e835f61246f565b6040805160e08101909152815481525f908190611eaa9060208101611dc389806132de565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190611e0b908a018a6132de565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602001611e5460608a0160408b01613320565b6001600160401b03168152602001611e6f60608a018a6133d0565b611e78906133e4565b8152602001611e8a60808a018a6133d0565b611e93906133e4565b8152602001876001600160401b0316815250612649565b5f82815260068601602052604090209193509150611ec88282613032565b508160088401611ed888806132de565b604051611ee69291906131c4565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb90611f22908590600401612db7565b6020604051808303815f875af1158015611f3e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f629190612dc9565b6040805160e081019091529091508060018152602001611f8289806132de565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561201157612011612be3565b02179055506020820151600182019061202a9082613032565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806120c888806132de565b6040516120d69291906131c4565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906121149190613320565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80825160271461217857825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610499565b5f805b60028110156121c75761218f8160016132b4565b61219a9060086132c7565b61ffff168582815181106121b0576121b0612e25565b016020015160f81c901b919091179060010161217b565b5061ffff8116156121f15760405163407b587360e01b815261ffff82166004820152602401610499565b5f805b600481101561224c576122088160036132b4565b6122139060086132c7565b63ffffffff1686612225836002613105565b8151811061223557612235612e25565b016020015160f81c901b91909117906001016121f4565b5063ffffffff811660021461227457604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156122c95761228b81601f6132b4565b6122969060086132c7565b876122a2836006613105565b815181106122b2576122b2612e25565b016020015160f81c901b9190911790600101612277565b505f866026815181106122de576122de612e25565b016020015191976001600160f81b03199092161515965090945050505050565b612306612836565b61230f8261287f565b610a5b81612898565b5f8281525f805160206136ce833981519152602052604081206002015481905f805160206136ae83398151915290600160801b90046001600160401b0316612360858261246f565b5f61236a876128a9565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6123ba8a858b611036565b6040518263ffffffff1660e01b81526004016123d69190612db7565b6020604051808303815f875af11580156123f2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124169190612dc9565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805160206136ae8339815191525f6001600160401b0380841690851611156124a35761249c83856134ab565b90506124b0565b6124ad84846134ab565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061251257506001840154815161250e916001600160401b031690613105565b8210155b15612538576001600160401b038316606082015281815260408101516020820152612557565b828160600181815161254a91906134cb565b6001600160401b03169052505b60608101516125679060646134eb565b602082015160018601546001600160401b0392909216916125929190600160401b900460ff166132c7565b10156125c257606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610499565b856001600160401b0316816040018181516125dd9190613105565b9052506040810180516001600160401b03871691906125fd9083906132b4565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f60608260400151516030146126725760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986126b3988a986001989297929690959094909390929101613516565b60405160208183030381529060405290505f5b84608001516020015151811015612725578185608001516020015182815181106126f2576126f2612e25565b602002602001015160405160200161270b9291906135d0565b60408051601f1981840301815291905291506001016126c6565b5060a0840151805160209182015151604051612745938593929101613606565b60405160208183030381529060405290505f5b8460a0015160200151518110156127b757818560a0015160200151828151811061278457612784612e25565b602002602001015160405160200161279d9291906135d0565b60408051601f198184030181529190529150600101612758565b5060c08401516040516127ce918391602001613641565b60405160208183030381529060405290506002816040516127ef9190612fd6565b602060405180830381855afa15801561280a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061282d9190612dc9565b94909350915050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610a4857604051631afcd79f60e31b815260040160405180910390fd5b612887612836565b61288f61291e565b610fd881612926565b6128a0612836565b610fd881612a0e565b5f8181525f805160206136ce8339815191526020526040812060020180545f805160206136ae83398151915291906008906128f390600160401b90046001600160401b0316613672565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b610a48612836565b61292e612836565b80355f805160206136ae8339815191529081556014612953606084016040850161368d565b60ff161180612972575061296d606083016040840161368d565b60ff16155b156129a657612987606083016040840161368d565b604051634a59bbff60e11b815260ff9091166004820152602401610499565b6129b6606083016040840161368d565b60018201805460ff92909216600160401b0260ff60401b199092169190911790556129e76040830160208401613320565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b610fa6612836565b508054612a2290612d71565b5f825580601f10612a31575050565b601f0160209004905f5260205f2090810190610fd89190612a8a565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115612a9e575f8155600101612a8b565b5090565b5f60208284031215612ab2575f80fd5b5035919050565b803563ffffffff81168114612acc575f80fd5b919050565b5f8060408385031215612ae2575f80fd5b82356001600160401b03811115612af7575f80fd5b830160808186031215612b08575f80fd5b9150612b1660208401612ab9565b90509250929050565b5f60208284031215612b2f575f80fd5b610a7282612ab9565b80356001600160401b0381168114612acc575f80fd5b5f8060408385031215612b5f575f80fd5b82356001600160401b03811115612b74575f80fd5b830160a08186031215612b85575f80fd5b9150612b1660208401612b38565b6001600160a01b0381168114610fd8575f80fd5b5f808284036080811215612bb9575f80fd5b6060811215612bc6575f80fd5b508291506060830135612bd881612b93565b809150509250929050565b634e487b7160e01b5f52602160045260245ffd5b60068110612c1357634e487b7160e01b5f52602160045260245ffd5b9052565b5f5b83811015612c31578181015183820152602001612c19565b50505f910152565b5f8151808452612c50816020860160208601612c17565b601f01601f19169290920160200192915050565b60208152612c76602082018351612bf7565b5f602083015160e06040840152612c91610100840182612c39565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f60208284031215612cf4575f80fd5b8135612cff81612b93565b9392505050565b5f8060208385031215612d17575f80fd5b82356001600160401b0380821115612d2d575f80fd5b818501915085601f830112612d40575f80fd5b813581811115612d4e575f80fd5b866020828501011115612d5f575f80fd5b60209290920196919550909350505050565b600181811c90821680612d8557607f821691505b602082108103612da357634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610a758284612bf7565b602081525f610a726020830184612c39565b5f60208284031215612dd9575f80fd5b5051919050565b5f808335601e19843603018112612df5575f80fd5b8301803591506001600160401b03821115612e0e575f80fd5b6020019150600581901b3603821315612468575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112612e4d575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b0381118282101715612e8d57612e8d612e57565b60405290565b604080519081016001600160401b0381118282101715612e8d57612e8d612e57565b604051601f8201601f191681016001600160401b0381118282101715612edd57612edd612e57565b604052919050565b5f6001600160401b03821115612efd57612efd612e57565b50601f01601f191660200190565b5f82601f830112612f1a575f80fd5b8135612f2d612f2882612ee5565b612eb5565b818152846020838601011115612f41575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215612f6d575f80fd5b612f75612e6b565b82356001600160401b0380821115612f8b575f80fd5b612f9736838701612f0b565b83526020850135915080821115612fac575f80fd5b50612fb936828601612f0b565b602083015250612fcb60408401612b38565b604082015292915050565b5f8251612e4d818460208701612c17565b601f821115610a1e57805f5260205f20601f840160051c8101602085101561300c5750805b601f840160051c820191505b8181101561302b575f8155600101613018565b5050505050565b81516001600160401b0381111561304b5761304b612e57565b61305f816130598454612d71565b84612fe7565b602080601f831160018114613092575f841561307b5750858301515b5f19600386901b1c1916600185901b1785556130e9565b5f85815260208120601f198616915b828110156130c0578886015182559484019460019091019084016130a1565b50858210156130dd57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610a7557610a756130f1565b5f63ffffffff808316818103613130576131306130f1565b6001019392505050565b5f60208083525f845461314c81612d71565b806020870152604060018084165f811461316d5760018114613189576131b6565b60ff19851660408a0152604084151560051b8a010195506131b6565b895f5260205f205f5b858110156131ad5781548b8201860152908301908801613192565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b80518015158114612acc575f80fd5b5f80604083850312156131f3575f80fd5b82516001600160401b0380821115613209575f80fd5b908401906060828703121561321c575f80fd5b613224612e6b565b8251815260208084015161323781612b93565b8282015260408401518381111561324c575f80fd5b80850194505087601f850112613260575f80fd5b83519250613270612f2884612ee5565b8381528882858701011115613283575f80fd5b61329284838301848801612c17565b806040840152508195506132a78188016131d3565b9450505050509250929050565b81810381811115610a7557610a756130f1565b8082028115828204841417610a7557610a756130f1565b5f808335601e198436030181126132f3575f80fd5b8301803591506001600160401b0382111561330c575f80fd5b602001915036819003821315612468575f80fd5b5f60208284031215613330575f80fd5b610a7282612b38565b5f885161334a818460208d01612c17565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f8235603e19833603018112612e4d575f80fd5b5f604082360312156133f4575f80fd5b6133fc612e93565b61340583612ab9565b81526020808401356001600160401b0380821115613421575f80fd5b9085019036601f830112613433575f80fd5b81358181111561344557613445612e57565b8060051b9150613456848301612eb5565b818152918301840191848101903684111561346f575f80fd5b938501935b83851015613499578435925061348983612b93565b8282529385019390850190613474565b94860194909452509295945050505050565b6001600160401b03828116828216039080821115611194576111946130f1565b6001600160401b03818116838216019080821115611194576111946130f1565b6001600160401b0381811683821602808216919082811461350e5761350e6130f1565b505092915050565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161355c81602a850160208b01612c17565b86519083019061357381602a840160208b01612c17565b60c087901b6001600160c01b031916602a92909101918201526135a5603282018660e01b6001600160e01b0319169052565b6135be603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f83516135e1818460208801612c17565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451613617818460208901612c17565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351613652818460208801612c17565b60c09390931b6001600160c01b0319169190920190815260080192915050565b5f6001600160401b03808316818103613130576131306130f1565b5f6020828403121561369d575f80fd5b813560ff81168114612cff575f80fdfee92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + 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", } // 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 ac653e1f4..03c87e8f2 100644 --- a/contracts/validator-manager/ValidatorManager.sol +++ b/contracts/validator-manager/ValidatorManager.sol @@ -14,7 +14,8 @@ import { ValidatorChurnPeriod, SubnetConversionData, InitialValidator, - ValidatorRegistrationInput + ValidatorRegistrationInput, + PChainOwner } from "./interfaces/IValidatorManager.sol"; import { WarpMessage, @@ -83,6 +84,8 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida error MaxChurnRateExceeded(uint64 churnAmount); error NodeAlreadyRegistered(bytes nodeID); error UnexpectedRegistrationStatus(bool validRegistration); + error InvalidPChainOwnerThreshold(uint256 threshold, uint256 addressesLength); + error PChainOwnerAddressesNotSorted(); // solhint-disable ordering function _getValidatorManagerStorage() @@ -208,6 +211,24 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida $._initializedValidatorSet = true; } + function _validatePChainOwner(PChainOwner calldata pChainOwner) internal pure { + // If threshold is 0, addresses must be empty. + if (pChainOwner.threshold == 0 && pChainOwner.addresses.length != 0) { + revert InvalidPChainOwnerThreshold(pChainOwner.threshold, pChainOwner.addresses.length); + } + // Threshold must be less than or equal to the number of addresses. + if (pChainOwner.threshold > pChainOwner.addresses.length) { + revert InvalidPChainOwnerThreshold(pChainOwner.threshold, pChainOwner.addresses.length); + } + // Addresses must be sorted in ascending order + for (uint256 i = 1; i < pChainOwner.addresses.length; i++) { + // Compare current address with the previous one + if (pChainOwner.addresses[i] < pChainOwner.addresses[i - 1]) { + revert PChainOwnerAddressesNotSorted(); + } + } + } + /** * @notice Begins the validator registration process, and sets the initial weight for the validator. * This is the only method related to validator registration and removal that needs the initializedValidatorSet @@ -228,6 +249,9 @@ abstract contract ValidatorManager is Initializable, ContextUpgradeable, IValida revert InvalidRegistrationExpiry(input.registrationExpiry); } + _validatePChainOwner(input.remainingBalanceOwner); + _validatePChainOwner(input.disableOwner); + // Ensure the nodeID is not the zero address, and is not already an active validator. if (input.blsPublicKey.length != BLS_PUBLIC_KEY_LENGTH) { diff --git a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol index 20d3fda4e..6de1e94f5 100644 --- a/contracts/validator-manager/tests/ValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/ValidatorManagerTests.t.sol @@ -114,6 +114,71 @@ abstract contract ValidatorManagerTest is Test { // TODO: implement } + function testInitializeValidatorRegistrationPChainOwnerThresholdTooLarge() public { + // Threshold too large + address[] memory addresses = new address[](1); + addresses[0] = 0x1234567812345678123456781234567812345678; + PChainOwner memory invalidPChainOwner1 = PChainOwner({threshold: 2, addresses: addresses}); + _beforeSend(_weightToValue(DEFAULT_WEIGHT), address(this)); + vm.expectRevert( + abi.encodeWithSelector(ValidatorManager.InvalidPChainOwnerThreshold.selector, 2, 1) + ); + _initializeValidatorRegistration( + ValidatorRegistrationInput({ + nodeID: DEFAULT_NODE_ID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + remainingBalanceOwner: invalidPChainOwner1, + disableOwner: DEFAULT_P_CHAIN_OWNER, + registrationExpiry: DEFAULT_EXPIRY + }), + DEFAULT_WEIGHT + ); + } + + function testInitializeValidatorRegistrationZeroPChainOwnerThreshold() public { + // Zero threshold for non-zero address + address[] memory addresses = new address[](1); + addresses[0] = 0x1234567812345678123456781234567812345678; + PChainOwner memory invalidPChainOwner1 = PChainOwner({threshold: 0, addresses: addresses}); + _beforeSend(_weightToValue(DEFAULT_WEIGHT), address(this)); + vm.expectRevert( + abi.encodeWithSelector(ValidatorManager.InvalidPChainOwnerThreshold.selector, 0, 1) + ); + _initializeValidatorRegistration( + ValidatorRegistrationInput({ + nodeID: DEFAULT_NODE_ID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + remainingBalanceOwner: invalidPChainOwner1, + disableOwner: DEFAULT_P_CHAIN_OWNER, + registrationExpiry: DEFAULT_EXPIRY + }), + DEFAULT_WEIGHT + ); + } + + function testInitializeValidatorRegistrationPChainOwnerAddressesUnsorted() public { + // Addresses not sorted + address[] memory addresses = new address[](2); + addresses[0] = 0x1234567812345678123456781234567812345678; + addresses[1] = 0x0123456781234567812345678123456781234567; + PChainOwner memory invalidPChainOwner1 = PChainOwner({threshold: 1, addresses: addresses}); + + _beforeSend(_weightToValue(DEFAULT_WEIGHT), address(this)); + vm.expectRevert( + abi.encodeWithSelector(ValidatorManager.PChainOwnerAddressesNotSorted.selector) + ); + _initializeValidatorRegistration( + ValidatorRegistrationInput({ + nodeID: DEFAULT_NODE_ID, + blsPublicKey: DEFAULT_BLS_PUBLIC_KEY, + remainingBalanceOwner: invalidPChainOwner1, + disableOwner: DEFAULT_P_CHAIN_OWNER, + registrationExpiry: DEFAULT_EXPIRY + }), + DEFAULT_WEIGHT + ); + } + // The following tests call functions that are implemented in ValidatorManager, but access state that's // only set in NativeTokenValidatorManager. Therefore we call them via the concrete type, rather than a // reference to the abstract type. @@ -215,7 +280,7 @@ abstract contract ValidatorManagerTest is Test { validatorManager.completeEndValidation(0); } - function testCummulativeChurnRegistration() public { + function testCumulativeChurnRegistration() public { uint64 churnThreshold = uint64(DEFAULT_STARTING_TOTAL_WEIGHT) * DEFAULT_MAXIMUM_CHURN_PERCENTAGE / 100; _beforeSend(_weightToValue(churnThreshold), address(this)); @@ -251,7 +316,7 @@ abstract contract ValidatorManagerTest is Test { ); } - function testCummulativeChurnRegistrationAndEndValidation() public { + function testCumulativeChurnRegistrationAndEndValidation() public { // Registration should succeed bytes32 validationID = _registerValidator({ nodeID: DEFAULT_NODE_ID, From 4bd2158b08efa2768ee53476d1e270d9e43642fc Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 14 Oct 2024 14:43:34 -0500 Subject: [PATCH 504/545] simplify component check --- scripts/local/e2e_test.sh | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index 948f1a8a8..6927b6eb6 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -15,8 +15,6 @@ function printHelp() { printUsage } -valid_components="teleporter governance validator-manager" - function printUsage() { cat << EOF Arguments: @@ -50,10 +48,8 @@ if [ -z "$component" ]; then echo "No component provided" && exit 1 fi -if echo "$valid_components" | grep -q "\b$component\b"; then - echo "" > /dev/null -else - echo "Invalid component" && printHelp && exit 1 +if [ ! -d "./tests/local/$component" ]; then + echo "Component test suite not found" && exit 1 fi source "$TELEPORTER_PATH"/scripts/constants.sh @@ -89,7 +85,7 @@ ginkgo build ./tests/local/$component # Run the tests echo "Running e2e tests $RUN_E2E" -RUN_E2E=true ./tests/local//$component/$component.test \ +RUN_E2E=true ./tests/local/$component/$component.test \ --ginkgo.vv \ --ginkgo.label-filter=${GINKGO_LABEL_FILTER:-""} \ --ginkgo.focus=${GINKGO_FOCUS:-""} \ From 52524eadf61a1a18069894465353837ce1630aa7 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 14 Oct 2024 17:12:55 -0500 Subject: [PATCH 505/545] delete testnet test code --- tests/testnet/main/run_testnet_flows.go | 54 ---- tests/testnet/network.go | 372 ------------------------ 2 files changed, 426 deletions(-) delete mode 100644 tests/testnet/main/run_testnet_flows.go delete mode 100644 tests/testnet/network.go diff --git a/tests/testnet/main/run_testnet_flows.go b/tests/testnet/main/run_testnet_flows.go deleted file mode 100644 index 728c75ca3..000000000 --- a/tests/testnet/main/run_testnet_flows.go +++ /dev/null @@ -1,54 +0,0 @@ -package main - -// import ( -// "github.com/ethereum/go-ethereum/log" - -// "github.com/ava-labs/teleporter/tests/flows/teleporter" -// "github.com/ava-labs/teleporter/tests/flows/teleporter/registry" - -// "github.com/ava-labs/teleporter/tests/interfaces" -// "github.com/ava-labs/teleporter/tests/testnet" -// "github.com/onsi/gomega" -// ) - -// func runFlow(flowName string, flow func(interfaces.Network), network interfaces.Network) { -// log.Info("Running test", "flowName", flowName) -// flow(network) -// log.Info("Finished running test", "flowName", flowName) -// } - -// func main() { -// // Register a failure handler that panics -// gomega.RegisterFailHandler(func(message string, callerSkip ...int) { -// panic(message) -// }) - -// // Create the new network instances -// network, err := testnet.NewTestNetwork() -// if err != nil { -// panic(err) -// } - -// // Run the Teleporter test flows. -// // Note that the following flows are not able to run against testnet because they -// // require the tests to be able to relay messages independently or modifying validator sets. -// // - RelayerModifiesMessage -// // - UnallowedRelayer -// // - ValidatorSetChrun -// // - TeleporterRegistry -// runFlow("AddFeeAmount", teleporter.AddFeeAmount, network) -// runFlow("BasicSendRecevie", teleporter.BasicSendReceive, network) -// runFlow("DeliverToNonExistentContract", teleporter.DeliverToNonExistentContract, network) -// runFlow("DeliverToWrongChain", teleporter.DeliverToWrongChain, network) -// runFlow("InsufficientGas", teleporter.InsufficientGas, network) -// runFlow("RelayMessageTwice", teleporter.RelayMessageTwice, network) -// runFlow("ResubmitAlteredMessage", teleporter.ResubmitAlteredMessage, network) -// runFlow("RetrySuccessfulExecution", teleporter.RetrySuccessfulExecution, network) -// runFlow("SendSpecificReceipts", teleporter.SendSpecificReceipts, network) -// log.Info("Finished Teleporter test flows") - -// // Run the upgradability test flows -// runFlow("CheckUpgradeAccess", registry.CheckUpgradeAccess, network) -// runFlow("PauseTeleporter", registry.PauseTeleporter, network) -// log.Info("Finished upgradability test flows") -// } diff --git a/tests/testnet/network.go b/tests/testnet/network.go deleted file mode 100644 index bdd54580c..000000000 --- a/tests/testnet/network.go +++ /dev/null @@ -1,372 +0,0 @@ -package testnet - -// import ( -// "context" -// "crypto/ecdsa" -// "errors" -// "net/http" -// "net/http/cookiejar" -// "os" -// "time" - -// "github.com/ava-labs/avalanchego/ids" -// "github.com/ava-labs/avalanchego/utils/constants" -// avalancheWarp "github.com/ava-labs/avalanchego/vms/platformvm/warp" -// "github.com/ava-labs/subnet-evm/accounts/abi/bind" -// "github.com/ava-labs/subnet-evm/core/types" -// "github.com/ava-labs/subnet-evm/ethclient" -// "github.com/ava-labs/subnet-evm/precompile/contracts/warp" -// "github.com/ava-labs/subnet-evm/rpc" -// warpBackend "github.com/ava-labs/subnet-evm/warp" -// teleportermessenger "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/TeleporterMessenger" -// teleporterregistry "github.com/ava-labs/teleporter/abi-bindings/go/teleporter/registry/TeleporterRegistry" -// "github.com/ava-labs/teleporter/tests/interfaces" -// "github.com/ava-labs/teleporter/tests/utils" -// "github.com/ethereum/go-ethereum/common" -// "github.com/ethereum/go-ethereum/crypto" -// "github.com/ethereum/go-ethereum/log" - -// . "github.com/onsi/gomega" -// ) - -// const ( -// subnetAPrefix = "subnet_a" -// subnetBPrefix = "subnet_b" -// subnetCPrefix = "subnet_c" -// cChainPrefix = "c_chain" -// teleporterContractAddress = "teleporter_contract_address" -// teleporterRegistryAddressSuffix = "_teleporter_registry_address" -// subnetIDSuffix = "_subnet_id" -// blockchainIDSuffix = "_blockchain_id" -// rpcURLSuffix = "_rpc_url" -// wsURLSuffix = "_ws_url" -// userAddress = "user_address" -// userPrivateKey = "user_private_key" - -// receiveCrossChainMessageEventName = "ReceiveCrossChainMessage" -// receiveCrossChainMessageLookBackBlocks = 500 - -// privateKeyHexLength = 64 -// ) - -// var errInvalidPrivateKeyString = errors.New("invalid private key string") - -// var _ interfaces.Network = &testNetwork{} - -// type testNetwork struct { -// teleporterContractAddress common.Address -// primaryNetwork *interfaces.SubnetTestInfo -// subnetsInfo map[ids.ID]*interfaces.SubnetTestInfo -// fundedAddress common.Address -// fundedKey *ecdsa.PrivateKey -// } - -// func initializeSubnetInfo( -// subnetPrefix string, -// teleporterContractAddress common.Address, -// ) (interfaces.SubnetTestInfo, error) { -// subnetIDStr := os.Getenv(subnetPrefix + subnetIDSuffix) -// subnetID, err := ids.FromString(subnetIDStr) -// if err != nil { -// log.Info("Error decoding subnet ID", "subnetPrefix", subnetPrefix) -// return interfaces.SubnetTestInfo{}, err -// } - -// blockchainIDStr := os.Getenv(subnetPrefix + blockchainIDSuffix) -// blockchainID, err := ids.FromString(blockchainIDStr) -// if err != nil { -// log.Info("Error decoding blockchain ID", "subnetPrefix", subnetPrefix) -// return interfaces.SubnetTestInfo{}, err -// } - -// rpcURLStr := os.Getenv(subnetPrefix + rpcURLSuffix) - -// // Create the client using a cookiejar to try to use the same node for each -// // request when using public RPC endpoints. Having requests routed to different -// // nodes behind a load balancer may cause issues with nodes serving slightly stale -// // data from before they see recently accepted transactions. Responses generally -// // have cookies identifying which node served the request, and those cookies can -// // be added to the cookiejar to be included on future requests to attempt to have -// // the same node serve it. -// // See here: https://docs.avax.network/tooling/rpc-providers#sticky-sessions -// jar, err := cookiejar.New(nil) -// if err != nil { -// return interfaces.SubnetTestInfo{}, err -// } - -// httpClient := &http.Client{ -// Jar: jar, -// } - -// rpcClient, err := rpc.DialOptions( -// context.Background(), -// rpcURLStr, -// rpc.WithHTTPClient(httpClient), -// ) -// if err != nil { -// return interfaces.SubnetTestInfo{}, err -// } - -// ethClient := ethclient.NewClient(rpcClient) - -// evmChainID, err := ethClient.ChainID(context.Background()) -// if err != nil { -// return interfaces.SubnetTestInfo{}, err -// } - -// teleporterRegistryAddressStr := os.Getenv(subnetPrefix + teleporterRegistryAddressSuffix) -// if !common.IsHexAddress(teleporterRegistryAddressStr) { -// return interfaces.SubnetTestInfo{}, errors.New("invalid teleporter regirstry address") -// } -// teleporterRegistryAddress := common.HexToAddress(teleporterRegistryAddressStr) - -// teleporterMessenger, err := teleportermessenger.NewTeleporterMessenger( -// teleporterContractAddress, ethClient, -// ) -// if err != nil { -// return interfaces.SubnetTestInfo{}, err -// } - -// teleporterRegistry, err := teleporterregistry.NewTeleporterRegistry(teleporterRegistryAddress, ethClient) -// if err != nil { -// return interfaces.SubnetTestInfo{}, err -// } - -// return interfaces.SubnetTestInfo{ -// SubnetID: subnetID, -// BlockchainID: blockchainID, -// NodeURIs: []string{}, // no specific node URIs for a testnet subnet, only RPC endpoints. -// RPCClient: ethClient, -// WSClient: nil, -// EVMChainID: evmChainID, -// TeleporterRegistryAddress: teleporterRegistryAddress, -// TeleporterRegistry: teleporterRegistry, -// TeleporterMessenger: teleporterMessenger, -// }, nil -// } - -// func NewTestNetwork() (*testNetwork, error) { -// teleporterContractAddressStr := os.Getenv(teleporterContractAddress) -// teleporterContractAddress := common.HexToAddress(teleporterContractAddressStr) -// log.Info("Set teleporter contract address", "teleporterContractAddress", teleporterContractAddressStr) - -// subnetAInfo, err := initializeSubnetInfo(subnetAPrefix, teleporterContractAddress) -// if err != nil { -// return nil, err -// } - -// subnetBInfo, err := initializeSubnetInfo(subnetBPrefix, teleporterContractAddress) -// if err != nil { -// return nil, err -// } - -// cChainInfo, err := initializeSubnetInfo(cChainPrefix, teleporterContractAddress) -// if err != nil { -// return nil, err -// } -// log.Info("Set testnet subnet info", subnetAPrefix, subnetAInfo, subnetBPrefix, subnetBInfo) - -// fundedAddressStr := os.Getenv(userAddress) -// fundedKeyStr := os.Getenv(userPrivateKey) -// if len(fundedKeyStr) >= 2 && fundedKeyStr[0:2] == "0x" { -// fundedKeyStr = fundedKeyStr[2:] -// } -// if len(fundedKeyStr) != privateKeyHexLength { -// return nil, errInvalidPrivateKeyString -// } -// fundedKey, err := crypto.HexToECDSA(fundedKeyStr) -// if err != nil { -// return nil, err -// } -// log.Info("Set user funded address", "address", fundedAddressStr) - -// subnetsInfo := make(map[ids.ID]*interfaces.SubnetTestInfo) -// subnetsInfo[subnetAInfo.SubnetID] = &subnetAInfo -// subnetsInfo[subnetBInfo.SubnetID] = &subnetBInfo -// return &testNetwork{ -// teleporterContractAddress: teleporterContractAddress, -// primaryNetwork: &cChainInfo, -// subnetsInfo: subnetsInfo, -// fundedAddress: common.HexToAddress(fundedAddressStr), -// fundedKey: fundedKey, -// }, nil -// } - -// func (n *testNetwork) GetPrimaryNetworkInfo() interfaces.SubnetTestInfo { -// return *n.primaryNetwork -// } - -// func (n *testNetwork) GetSubnetsInfo() []interfaces.SubnetTestInfo { -// subnetsInfo := make([]interfaces.SubnetTestInfo, 0, len(n.subnetsInfo)) -// for _, subnetInfo := range n.subnetsInfo { -// subnetsInfo = append(subnetsInfo, *subnetInfo) -// } -// return subnetsInfo -// } - -// // Returns subnet info for all subnets, including the primary network -// func (n *testNetwork) GetAllSubnetsInfo() []interfaces.SubnetTestInfo { -// subnets := n.GetSubnetsInfo() -// return append(subnets, n.GetPrimaryNetworkInfo()) -// } - -// func (n *testNetwork) GetTeleporterContractAddress() common.Address { -// return n.teleporterContractAddress -// } - -// func (n *testNetwork) SetTeleporterContractAddress(newTeleporterAddress common.Address) { -// n.teleporterContractAddress = newTeleporterAddress -// subnets := n.GetAllSubnetsInfo() -// for _, subnetInfo := range subnets { -// teleporterMessenger, err := teleportermessenger.NewTeleporterMessenger( -// n.teleporterContractAddress, subnetInfo.RPCClient, -// ) -// Expect(err).Should(BeNil()) -// if subnetInfo.SubnetID == constants.PrimaryNetworkID { -// n.primaryNetwork.TeleporterMessenger = teleporterMessenger -// } else { -// n.subnetsInfo[subnetInfo.SubnetID].TeleporterMessenger = teleporterMessenger -// } -// } -// } - -// func (n *testNetwork) GetFundedAccountInfo() (common.Address, *ecdsa.PrivateKey) { -// return n.fundedAddress, n.fundedKey -// } - -// func (n *testNetwork) IsExternalNetwork() bool { -// return true -// } - -// func (n *testNetwork) SupportsIndependentRelaying() bool { -// // The test application cannot relay its own messages on testnets -// // because it can't query validators directly for their BLS signatures. -// return false -// } - -// // For testnet messages, rely on a separately deployed relayer to relay the message. -// // The implementation checks for the deliver of the given message on the destination -// // within a time window of {relayWaitTime} seconds, and returns the receipt of the -// // transaction that delivered the message. -// func (n *testNetwork) RelayMessage( -// ctx context.Context, -// sourceReceipt *types.Receipt, -// source interfaces.SubnetTestInfo, -// destination interfaces.SubnetTestInfo, -// expectSuccess bool, -// ) *types.Receipt { -// // Get the Teleporter message ID from the receipt -// sendEvent, err := utils.GetEventFromLogs( -// sourceReceipt.Logs, source.TeleporterMessenger.ParseSendCrossChainMessage, -// ) -// Expect(err).Should(BeNil()) - -// teleporterMessageID := sendEvent.MessageID - -// receipt, err := n.getMessageDeliveryTransactionReceipt(ctx, source.BlockchainID, destination, teleporterMessageID) -// Expect(err).Should(BeNil()) -// Expect(receipt).ShouldNot(BeNil()) -// Expect(receipt.Status).Should(Equal(types.ReceiptStatusSuccessful)) -// return receipt -// } - -// func (n *testNetwork) getMessageDeliveryTransactionReceipt( -// ctx context.Context, -// sourceBlockchainID ids.ID, -// destination interfaces.SubnetTestInfo, -// teleporterMessageID ids.ID, -// ) (*types.Receipt, error) { -// // Wait until the message is delivered. -// queryTicker := time.NewTicker(time.Millisecond * 500) -// defer queryTicker.Stop() - -// // Wait a maximum of 20 seconds. -// cctx, cancel := context.WithTimeout(ctx, 20*time.Second) -// defer cancel() - -// for { -// delivered, err := destination.TeleporterMessenger.MessageReceived(&bind.CallOpts{}, teleporterMessageID) -// if err != nil { -// return nil, err -// } -// if delivered { -// break -// } - -// // Wait for the next round. -// select { -// case <-cctx.Done(): -// return nil, cctx.Err() -// case <-queryTicker.C: -// } -// } - -// // Get the latest block height -// currentBlockHeight, err := destination.RPCClient.BlockNumber(ctx) -// if err != nil { -// return nil, err -// } - -// var startBlock uint64 -// if currentBlockHeight > receiveCrossChainMessageLookBackBlocks { -// startBlock = currentBlockHeight - receiveCrossChainMessageLookBackBlocks -// } else { -// startBlock = 0 -// } - -// // Get the log event of the delivery. The log must be in the last {receiveCrossChainMessageLookBackBlocks} blocks. -// logIter, err := destination.TeleporterMessenger.FilterReceiveCrossChainMessage( -// &bind.FilterOpts{ -// Start: startBlock, -// Context: cctx, -// }, -// [][32]byte{teleporterMessageID}, -// [][32]byte{sourceBlockchainID}, -// nil, -// ) -// if err != nil { -// return nil, err -// } - -// // There should be exactly one matching event. -// if !logIter.Next() { -// return nil, errors.New("failed to find ReceiveCrossChainMessage log for relayed message") -// } -// receiveEvent := logIter.Event -// if logIter.Next() { -// return nil, errors.New("found multiple ReceiveCrossChainMessage logs for relayed message") -// } - -// // The transaction should already be mined, but WaitMined will also wait for the eth_blockNumber -// // endpoint to reflect the block that the transaction has been included in. -// return utils.WaitMined(ctx, destination.RPCClient, receiveEvent.Raw.TxHash) -// } - -// func (n *testNetwork) GetSignedMessage( -// ctx context.Context, -// source interfaces.SubnetTestInfo, -// destination interfaces.SubnetTestInfo, -// unsignedWarpMessageID ids.ID, -// ) *avalancheWarp.Message { -// Expect(len(source.NodeURIs)).Should(BeNumerically(">", 0)) -// warpClient, err := warpBackend.NewClient(source.NodeURIs[0], source.BlockchainID.String()) -// Expect(err).Should(BeNil()) - -// signingSubnetID := source.SubnetID -// if source.SubnetID == constants.PrimaryNetworkID { -// signingSubnetID = destination.SubnetID -// } - -// signedWarpMessageBytes, err := warpClient.GetMessageAggregateSignature( -// ctx, -// unsignedWarpMessageID, -// warp.WarpDefaultQuorumNumerator, -// signingSubnetID.String(), -// ) -// Expect(err).Should(BeNil()) - -// signedWarpMsg, err := avalancheWarp.ParseMessage(signedWarpMessageBytes) -// Expect(err).Should(BeNil()) - -// return signedWarpMsg -// } From c12941bad064b77bd202e7a5f6e62a537e743de1 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 14 Oct 2024 17:33:42 -0500 Subject: [PATCH 506/545] teleporter info getters --- tests/flows/teleporter/add_fee_amount.go | 26 ++++----- tests/flows/teleporter/basic_send_receive.go | 24 ++++---- .../deliver_to_nonexistent_contract.go | 20 +++---- .../teleporter/deliver_to_wrong_chain.go | 12 ++-- tests/flows/teleporter/insufficient_gas.go | 18 +++--- .../registry/check_upgrade_access.go | 6 +- .../teleporter/registry/pause_teleporter.go | 12 ++-- .../registry/teleporter_registry.go | 40 ++++++------- tests/flows/teleporter/relay_message_twice.go | 10 ++-- .../teleporter/relayer_modifies_message.go | 14 ++--- .../teleporter/resubmit_altered_message.go | 12 ++-- .../teleporter/retry_successful_execution.go | 16 +++--- .../teleporter/send_specific_receipts.go | 56 +++++++++---------- .../teleporter/teleporter_message_ids.go | 6 +- tests/flows/teleporter/unallowed_relayer.go | 8 +-- tests/flows/teleporter/validator_churn.go | 16 +++--- tests/utils/teleporter.go | 43 ++++++++++---- 17 files changed, 179 insertions(+), 160 deletions(-) diff --git a/tests/flows/teleporter/add_fee_amount.go b/tests/flows/teleporter/add_fee_amount.go index e8cb9cdd8..5f8c9e33c 100644 --- a/tests/flows/teleporter/add_fee_amount.go +++ b/tests/flows/teleporter/add_fee_amount.go @@ -12,10 +12,10 @@ import ( . "github.com/onsi/gomega" ) -func AddFeeAmount(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func AddFeeAmount(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) - teleporterContractAddress := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessengerAddress + teleporterContractAddress := teleporter.TeleporterMessengerAddress(subnetAInfo) fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -51,7 +51,7 @@ func AddFeeAmount(network interfaces.Network, teleporterInfo utils.TeleporterTes sendCrossChainMsgReceipt, messageID := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, + teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, @@ -68,23 +68,23 @@ func AddFeeAmount(network interfaces.Network, teleporterInfo utils.TeleporterTes additionalFeeAmount, mockTokenAddress, fundedKey, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, + teleporter.TeleporterMessenger(subnetAInfo), ) // Relay message from Subnet A to Subnet B - deliveryReceipt := teleporterInfo.RelayTeleporterMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true, fundedKey) + deliveryReceipt := teleporter.RelayTeleporterMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true, fundedKey) receiveEvent, err := utils.GetEventFromLogs( deliveryReceipt.Logs, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) + teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) // Check Teleporter message received on the destination (Subnet B) - delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) + delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Check the initial relayer reward amount on Subnet A. - initialRewardAmount, err := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( + initialRewardAmount, err := teleporter.TeleporterMessenger(subnetAInfo).CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent.RewardRedeemer, mockTokenAddress) @@ -93,7 +93,7 @@ func AddFeeAmount(network interfaces.Network, teleporterInfo utils.TeleporterTes // Send a message from Subnet B back to Subnet A that includes the specific receipt for the message. sendSpecificReceiptsReceipt, sendSpecificReceiptsMessageID := utils.SendSpecifiedReceiptsAndWaitForAcceptance( ctx, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger, + teleporter.TeleporterMessenger(subnetBInfo), subnetBInfo, subnetAInfo.BlockchainID, [][32]byte{receiveEvent.MessageID}, @@ -105,16 +105,16 @@ func AddFeeAmount(network interfaces.Network, teleporterInfo utils.TeleporterTes fundedKey) // Relay message containing the specific receipt from Subnet B to Subnet A - teleporterInfo.RelayTeleporterMessage(ctx, sendSpecificReceiptsReceipt, subnetBInfo, subnetAInfo, true, fundedKey) + teleporter.RelayTeleporterMessage(ctx, sendSpecificReceiptsReceipt, subnetBInfo, subnetAInfo, true, fundedKey) // Check message delivered - delivered, err = teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, sendSpecificReceiptsMessageID) + delivered, err = teleporter.TeleporterMessenger(subnetAInfo).MessageReceived(&bind.CallOpts{}, sendSpecificReceiptsMessageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Check the updated relayer reward amount expectedIncrease := new(big.Int).Add(initFeeAmount, additionalFeeAmount) - newRewardAmount, err := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( + newRewardAmount, err := teleporter.TeleporterMessenger(subnetAInfo).CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent.RewardRedeemer, mockTokenAddress) @@ -125,7 +125,7 @@ func AddFeeAmount(network interfaces.Network, teleporterInfo utils.TeleporterTes if fundedAddress == receiveEvent.RewardRedeemer { utils.RedeemRelayerRewardsAndConfirm( ctx, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, + teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, mockToken, mockTokenAddress, diff --git a/tests/flows/teleporter/basic_send_receive.go b/tests/flows/teleporter/basic_send_receive.go index 367ade88d..c75f24a5a 100644 --- a/tests/flows/teleporter/basic_send_receive.go +++ b/tests/flows/teleporter/basic_send_receive.go @@ -13,10 +13,10 @@ import ( ) // Tests basic one-way send from Subnet A to Subnet B and vice versa -func BasicSendReceive(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func BasicSendReceive(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) - teleporterContractAddress := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessengerAddress + teleporterContractAddress := teleporter.TeleporterMessengerAddress(subnetAInfo) fundedAddress, fundedKey := network.GetFundedAccountInfo() // Send a transaction to Subnet A to issue a Warp Message from the Teleporter contract to Subnet B @@ -26,7 +26,7 @@ func BasicSendReceive(network interfaces.Network, teleporterInfo utils.Teleporte // This is only done if the test non-external networks because external networks may have // an arbitrarily high number of receipts to be cleared from a given queue from unrelated messages. if !network.IsExternalNetwork() { - utils.ClearReceiptQueue(ctx, teleporterInfo, subnetBInfo, subnetAInfo, fundedKey) + utils.ClearReceiptQueue(ctx, teleporter, subnetBInfo, subnetAInfo, fundedKey) } feeAmount := big.NewInt(1) @@ -59,7 +59,7 @@ func BasicSendReceive(network interfaces.Network, teleporterInfo utils.Teleporte receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, + teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, @@ -68,14 +68,14 @@ func BasicSendReceive(network interfaces.Network, teleporterInfo utils.Teleporte expectedReceiptID := teleporterMessageID // Relay the message to the destination - deliveryReceipt := teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) + deliveryReceipt := teleporter.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) receiveEvent, err := utils.GetEventFromLogs( deliveryReceipt.Logs, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) + teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) // Check Teleporter message received on the destination - delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( + delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -86,7 +86,7 @@ func BasicSendReceive(network interfaces.Network, teleporterInfo utils.Teleporte sendCrossChainMessageInput.FeeInfo.Amount = big.NewInt(0) receipt, teleporterMessageID = utils.SendCrossChainMessageAndWaitForAcceptance( ctx, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger, + teleporter.TeleporterMessenger(subnetBInfo), subnetBInfo, subnetAInfo, sendCrossChainMessageInput, @@ -94,7 +94,7 @@ func BasicSendReceive(network interfaces.Network, teleporterInfo utils.Teleporte ) // Relay the message to the destination - deliveryReceipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetBInfo, subnetAInfo, true, fundedKey) + deliveryReceipt = teleporter.RelayTeleporterMessage(ctx, receipt, subnetBInfo, subnetAInfo, true, fundedKey) // Check that the receipt was received for expected Teleporter message ID // This check is not performed for external networks because the specific receipt for this message @@ -103,11 +103,11 @@ func BasicSendReceive(network interfaces.Network, teleporterInfo utils.Teleporte Expect(utils.CheckReceiptReceived( deliveryReceipt, expectedReceiptID, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger)).Should(BeTrue()) + teleporter.TeleporterMessenger(subnetAInfo))).Should(BeTrue()) } // Check Teleporter message received on the destination - delivered, err = teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.MessageReceived( + delivered, err = teleporter.TeleporterMessenger(subnetAInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -118,7 +118,7 @@ func BasicSendReceive(network interfaces.Network, teleporterInfo utils.Teleporte // networks since the specific receipt may not have been included in the message, as noted above. if !network.IsExternalNetwork() && receiveEvent.RewardRedeemer == fundedAddress { utils.RedeemRelayerRewardsAndConfirm( - ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, feeToken, feeTokenAddress, fundedKey, feeAmount, + ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, feeToken, feeTokenAddress, fundedKey, feeAmount, ) } } diff --git a/tests/flows/teleporter/deliver_to_nonexistent_contract.go b/tests/flows/teleporter/deliver_to_nonexistent_contract.go index 934069588..abc7b483d 100644 --- a/tests/flows/teleporter/deliver_to_nonexistent_contract.go +++ b/tests/flows/teleporter/deliver_to_nonexistent_contract.go @@ -14,7 +14,7 @@ import ( . "github.com/onsi/gomega" ) -func DeliverToNonExistentContract(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func DeliverToNonExistentContract(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -44,7 +44,7 @@ func DeliverToNonExistentContract(network interfaces.Network, teleporterInfo uti ctx, fundedKey, fundedAddress, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(subnetAInfo), subnetAInfo, ) @@ -75,7 +75,7 @@ func DeliverToNonExistentContract(network interfaces.Network, teleporterInfo uti // Wait for the transaction to be mined receipt := utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) - sendEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) + sendEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage) Expect(err).Should(BeNil()) Expect(sendEvent.DestinationBlockchainID[:]).Should(Equal(subnetBInfo.BlockchainID[:])) @@ -85,16 +85,16 @@ func DeliverToNonExistentContract(network interfaces.Network, teleporterInfo uti // Relay the message to the destination // log.Info("Relaying the message to the destination") - receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) + receipt = teleporter.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) receiveEvent, err := - utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) + utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetAInfo).ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) // // Check that the message was successfully relayed // log.Info("Checking the message was successfully relayed") - delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( + delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) @@ -107,7 +107,7 @@ func DeliverToNonExistentContract(network interfaces.Network, teleporterInfo uti log.Info("Checking the message was not successfully executed") executionFailedEvent, err := utils.GetEventFromLogs( receipt.Logs, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseMessageExecutionFailed, + teleporter.TeleporterMessenger(subnetAInfo).ParseMessageExecutionFailed, ) Expect(err).Should(BeNil()) Expect(executionFailedEvent.MessageID).Should(Equal(receiveEvent.MessageID)) @@ -120,7 +120,7 @@ func DeliverToNonExistentContract(network interfaces.Network, teleporterInfo uti ctx, deployerKey, deployerAddress, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(subnetBInfo), subnetBInfo, ) @@ -134,7 +134,7 @@ func DeliverToNonExistentContract(network interfaces.Network, teleporterInfo uti receipt = utils.RetryMessageExecutionAndWaitForAcceptance( ctx, subnetAInfo.BlockchainID, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger, + teleporter.TeleporterMessenger(subnetBInfo), subnetBInfo, receiveEvent.Message, fundedKey, @@ -142,7 +142,7 @@ func DeliverToNonExistentContract(network interfaces.Network, teleporterInfo uti log.Info("Checking the message was successfully executed") messageExecutedEvent, err := utils.GetEventFromLogs( receipt.Logs, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseMessageExecuted, + teleporter.TeleporterMessenger(subnetAInfo).ParseMessageExecuted, ) Expect(err).Should(BeNil()) Expect(messageExecutedEvent.MessageID).Should(Equal(receiveEvent.MessageID)) diff --git a/tests/flows/teleporter/deliver_to_wrong_chain.go b/tests/flows/teleporter/deliver_to_wrong_chain.go index db749c629..1c87ccdd2 100644 --- a/tests/flows/teleporter/deliver_to_wrong_chain.go +++ b/tests/flows/teleporter/deliver_to_wrong_chain.go @@ -15,7 +15,7 @@ import ( . "github.com/onsi/gomega" ) -func DeliverToWrongChain(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func DeliverToWrongChain(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, subnetCInfo := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -23,7 +23,7 @@ func DeliverToWrongChain(network interfaces.Network, teleporterInfo utils.Telepo // // Get the expected teleporter message ID for Subnet C // - expectedAtoCMessageID, err := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.GetNextMessageID( + expectedAtoCMessageID, err := teleporter.TeleporterMessenger(subnetAInfo).GetNextMessageID( &bind.CallOpts{}, subnetCInfo.BlockchainID, ) @@ -52,7 +52,7 @@ func DeliverToWrongChain(network interfaces.Network, teleporterInfo utils.Telepo receipt, _ := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, + teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, @@ -63,12 +63,12 @@ func DeliverToWrongChain(network interfaces.Network, teleporterInfo utils.Telepo // // Try to relay the message to subnet C, should fail // - teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetCInfo, false, fundedKey) + teleporter.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetCInfo, false, fundedKey) } else { // // Wait for external relayer to properly deliver the message to subnet B // - deliveryReceipt := teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) + deliveryReceipt := teleporter.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) deliveryTx, isPending, err := subnetBInfo.RPCClient.TransactionByHash(ctx, deliveryReceipt.TxHash) Expect(err).Should(BeNil()) Expect(isPending).Should(BeFalse()) @@ -84,7 +84,7 @@ func DeliverToWrongChain(network interfaces.Network, teleporterInfo utils.Telepo // // Check that the message was not received on the Subnet C // - delivered, err := teleporterInfo[subnetCInfo.BlockchainID].TeleporterMessenger.MessageReceived( + delivered, err := teleporter.TeleporterMessenger(subnetCInfo).MessageReceived( &bind.CallOpts{}, expectedAtoCMessageID, ) Expect(err).Should(BeNil()) diff --git a/tests/flows/teleporter/insufficient_gas.go b/tests/flows/teleporter/insufficient_gas.go index 2ad7cb1db..f2df271a2 100644 --- a/tests/flows/teleporter/insufficient_gas.go +++ b/tests/flows/teleporter/insufficient_gas.go @@ -10,7 +10,7 @@ import ( . "github.com/onsi/gomega" ) -func InsufficientGas(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func InsufficientGas(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -21,7 +21,7 @@ func InsufficientGas(network interfaces.Network, teleporterInfo utils.Teleporter ctx, fundedKey, fundedAddress, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(subnetAInfo), subnetAInfo, ) // Deploy TestMessenger to Subnets B @@ -29,7 +29,7 @@ func InsufficientGas(network interfaces.Network, teleporterInfo utils.Teleporter ctx, fundedKey, fundedAddress, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(subnetBInfo), subnetBInfo, ) @@ -46,24 +46,24 @@ func InsufficientGas(network interfaces.Network, teleporterInfo utils.Teleporter // Wait for the transaction to be mined receipt := utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) - event, err := utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) + event, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage) Expect(err).Should(BeNil()) Expect(event.DestinationBlockchainID[:]).Should(Equal(subnetBInfo.BlockchainID[:])) messageID := event.MessageID // Relay message from SubnetA to SubnetB - receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) + receipt = teleporter.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) // Check Teleporter message received on the destination delivered, err := - teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) + teleporter.TeleporterMessenger(subnetBInfo).MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Check message execution failed event failedMessageExecutionEvent, err := utils.GetEventFromLogs( - receipt.Logs, teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseMessageExecutionFailed, + receipt.Logs, teleporter.TeleporterMessenger(subnetBInfo).ParseMessageExecutionFailed, ) Expect(err).Should(BeNil()) Expect(failedMessageExecutionEvent.MessageID[:]).Should(Equal(messageID[:])) @@ -74,12 +74,12 @@ func InsufficientGas(network interfaces.Network, teleporterInfo utils.Teleporter receipt = utils.RetryMessageExecutionAndWaitForAcceptance( ctx, subnetAInfo.BlockchainID, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger, + teleporter.TeleporterMessenger(subnetBInfo), subnetBInfo, failedMessageExecutionEvent.Message, fundedKey, ) - executedEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseMessageExecuted) + executedEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetBInfo).ParseMessageExecuted) Expect(err).Should(BeNil()) Expect(executedEvent.MessageID[:]).Should(Equal(messageID[:])) Expect(executedEvent.SourceBlockchainID[:]).Should(Equal(subnetAInfo.BlockchainID[:])) diff --git a/tests/flows/teleporter/registry/check_upgrade_access.go b/tests/flows/teleporter/registry/check_upgrade_access.go index 0c5770497..027db6017 100644 --- a/tests/flows/teleporter/registry/check_upgrade_access.go +++ b/tests/flows/teleporter/registry/check_upgrade_access.go @@ -13,7 +13,7 @@ import ( . "github.com/onsi/gomega" ) -func CheckUpgradeAccess(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func CheckUpgradeAccess(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetInfo := network.GetPrimaryNetworkInfo() fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -21,12 +21,12 @@ func CheckUpgradeAccess(network interfaces.Network, teleporterInfo utils.Telepor // Deploy TestMessenger to the subnet // ctx := context.Background() - teleporterAddress := teleporterInfo[subnetInfo.BlockchainID].TeleporterMessengerAddress + teleporterAddress := teleporter.TeleporterMessengerAddress(subnetInfo) _, testMessenger := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporterInfo[subnetInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(subnetInfo), subnetInfo, ) diff --git a/tests/flows/teleporter/registry/pause_teleporter.go b/tests/flows/teleporter/registry/pause_teleporter.go index cebfb7852..58fd4ded2 100644 --- a/tests/flows/teleporter/registry/pause_teleporter.go +++ b/tests/flows/teleporter/registry/pause_teleporter.go @@ -9,7 +9,7 @@ import ( . "github.com/onsi/gomega" ) -func PauseTeleporter(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func PauseTeleporter(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -18,19 +18,19 @@ func PauseTeleporter(network interfaces.Network, teleporterInfo utils.Teleporter // Deploy TestMessenger to Subnets A and B // ctx := context.Background() - teleporterAddress := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessengerAddress + teleporterAddress := teleporter.TeleporterMessengerAddress(subnetAInfo) _, testMessengerA := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(subnetAInfo), subnetAInfo, ) testMessengerAddressB, testMessengerB := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(subnetBInfo), subnetBInfo, ) @@ -53,7 +53,7 @@ func PauseTeleporter(network interfaces.Network, teleporterInfo utils.Teleporter // Send a message from subnet A to subnet B, which should fail utils.SendExampleCrossChainMessageAndVerify( ctx, - teleporterInfo, + teleporter, subnetAInfo, testMessengerA, subnetBInfo, @@ -79,7 +79,7 @@ func PauseTeleporter(network interfaces.Network, teleporterInfo utils.Teleporter // Send a message from subnet A to subnet B again, which should now succeed utils.SendExampleCrossChainMessageAndVerify( ctx, - teleporterInfo, + teleporter, subnetAInfo, testMessengerA, subnetBInfo, diff --git a/tests/flows/teleporter/registry/teleporter_registry.go b/tests/flows/teleporter/registry/teleporter_registry.go index 0e4f44092..a43ae276b 100644 --- a/tests/flows/teleporter/registry/teleporter_registry.go +++ b/tests/flows/teleporter/registry/teleporter_registry.go @@ -15,7 +15,7 @@ const ( teleporterByteCodeFile = "./out/TeleporterMessenger.sol/TeleporterMessenger.json" ) -func TeleporterRegistry(network interfaces.LocalNetwork, teleporterInfo utils.TeleporterTestInfo) { +func TeleporterRegistry(network interfaces.LocalNetwork, teleporter utils.TeleporterTestInfo) { // Deploy dApp on both chains that use Teleporter Registry // Deploy version 2 of Teleporter to both chains // Construct AddProtocolVersion txs for both chains @@ -38,42 +38,42 @@ func TeleporterRegistry(network interfaces.LocalNetwork, teleporterInfo utils.Te ctx, fundedKey, fundedAddress, - teleporterInfo[cChainInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(cChainInfo), cChainInfo, ) testMessengerContractB, testMessengerB := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(subnetBInfo), subnetBInfo, ) // Deploy the new version of Teleporter to both chains var newTeleporterAddress common.Address for _, subnet := range network.GetAllSubnetsInfo() { - newTeleporterAddress = utils.DeployNewTeleporterVersion(ctx, teleporterInfo, subnet, fundedKey, teleporterByteCodeFile) + newTeleporterAddress = utils.DeployNewTeleporterVersion(ctx, teleporter, subnet, fundedKey, teleporterByteCodeFile) } networkID := network.GetNetworkID() // Create chain config file with off chain message for each chain offchainMessageC, warpEnabledChainConfigC := utils.InitOffChainMessageChainConfig( networkID, cChainInfo, - teleporterInfo[cChainInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(cChainInfo), newTeleporterAddress, 2, ) offchainMessageB, warpEnabledChainConfigB := utils.InitOffChainMessageChainConfig( networkID, subnetBInfo, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(subnetBInfo), newTeleporterAddress, 2, ) offchainMessageA, warpEnabledChainConfigA := utils.InitOffChainMessageChainConfig( networkID, subnetAInfo, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(subnetAInfo), newTeleporterAddress, 2, ) @@ -93,7 +93,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork, teleporterInfo utils.Te // Call addProtocolVersion on subnetB to register the new Teleporter version utils.AddProtocolVersionAndWaitForAcceptance( ctx, - *teleporterInfo[subnetBInfo.BlockchainID], + *teleporter[subnetBInfo.BlockchainID], subnetBInfo, newTeleporterAddress, fundedKey, @@ -104,7 +104,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork, teleporterInfo utils.Te // Message should be received successfully since we haven't updated mininum Teleporter version yet. utils.SendExampleCrossChainMessageAndVerify( ctx, - teleporterInfo, + teleporter, cChainInfo, testMessengerC, subnetBInfo, @@ -119,7 +119,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork, teleporterInfo utils.Te opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetBInfo.EVMChainID) Expect(err).Should(BeNil()) - latestVersionB, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistry.LatestVersion(&bind.CallOpts{}) + latestVersionB, err := teleporter.TeleporterRegistry(subnetBInfo).LatestVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) minTeleporterVersion, err := testMessengerB.GetMinTeleporterVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) @@ -141,7 +141,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork, teleporterInfo utils.Te // Message should fail since we updated minimum Teleporter version. utils.SendExampleCrossChainMessageAndVerify( ctx, - teleporterInfo, + teleporter, cChainInfo, testMessengerC, subnetBInfo, @@ -152,15 +152,15 @@ func TeleporterRegistry(network interfaces.LocalNetwork, teleporterInfo utils.Te false, ) - // Update teleporterInfo with the new TeleporterMessengers + // Update teleporter with the new TeleporterMessengers for _, subnet := range network.GetAllSubnetsInfo() { - teleporterInfo.SetTeleporter(newTeleporterAddress, subnet) - teleporterInfo.InitializeBlockchainID(subnet, fundedKey) + teleporter.SetTeleporter(newTeleporterAddress, subnet) + teleporter.InitializeBlockchainID(subnet, fundedKey) } utils.SendExampleCrossChainMessageAndVerify( ctx, - teleporterInfo, + teleporter, subnetBInfo, testMessengerB, cChainInfo, @@ -174,7 +174,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork, teleporterInfo utils.Te // Call addProtocolVersion on subnetA to register the new Teleporter version utils.AddProtocolVersionAndWaitForAcceptance( ctx, - *teleporterInfo[cChainInfo.BlockchainID], + *teleporter[cChainInfo.BlockchainID], cChainInfo, newTeleporterAddress, fundedKey, @@ -185,7 +185,7 @@ func TeleporterRegistry(network interfaces.LocalNetwork, teleporterInfo utils.Te // Teleporter versions should match, so message should be received successfully. utils.SendExampleCrossChainMessageAndVerify( ctx, - teleporterInfo, + teleporter, subnetBInfo, testMessengerB, cChainInfo, @@ -200,18 +200,18 @@ func TeleporterRegistry(network interfaces.LocalNetwork, teleporterInfo utils.Te // to register the new Teleporter version utils.AddProtocolVersionAndWaitForAcceptance( ctx, - *teleporterInfo[subnetAInfo.BlockchainID], + *teleporter[subnetAInfo.BlockchainID], subnetAInfo, newTeleporterAddress, fundedKey, offchainMessageA, ) - latestVersionA, err := teleporterInfo[subnetAInfo.BlockchainID].TeleporterRegistry.LatestVersion(&bind.CallOpts{}) + latestVersionA, err := teleporter.TeleporterRegistry(subnetAInfo).LatestVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) Expect(latestVersionA.Cmp(latestVersionB)).Should(Equal(0)) - latestVersionC, err := teleporterInfo[cChainInfo.BlockchainID].TeleporterRegistry.LatestVersion(&bind.CallOpts{}) + latestVersionC, err := teleporter.TeleporterRegistry(cChainInfo).LatestVersion(&bind.CallOpts{}) Expect(err).Should(BeNil()) Expect(latestVersionC.Cmp(latestVersionB)).Should(Equal(0)) } diff --git a/tests/flows/teleporter/relay_message_twice.go b/tests/flows/teleporter/relay_message_twice.go index 3abc99393..dc28cc763 100644 --- a/tests/flows/teleporter/relay_message_twice.go +++ b/tests/flows/teleporter/relay_message_twice.go @@ -14,7 +14,7 @@ import ( . "github.com/onsi/gomega" ) -func RelayMessageTwice(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func RelayMessageTwice(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -41,19 +41,19 @@ func RelayMessageTwice(network interfaces.Network, teleporterInfo utils.Teleport "destinationBlockchainID", subnetBInfo.BlockchainID, ) receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey, + ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey, ) // // Relay the message to the destination // - teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) + teleporter.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) // // Check Teleporter message received on the destination // log.Info("Checking the message was received on the destination") - delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( + delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -63,5 +63,5 @@ func RelayMessageTwice(network interfaces.Network, teleporterInfo utils.Teleport // Attempt to send the same message again, should fail // log.Info("Relaying the same Teleporter message again on the destination") - teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, false, fundedKey) + teleporter.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, false, fundedKey) } diff --git a/tests/flows/teleporter/relayer_modifies_message.go b/tests/flows/teleporter/relayer_modifies_message.go index 9cf2e3732..cadafb5f7 100644 --- a/tests/flows/teleporter/relayer_modifies_message.go +++ b/tests/flows/teleporter/relayer_modifies_message.go @@ -22,7 +22,7 @@ import ( ) // Disallow this test from being run on anything but a local network, since it requires special behavior by the relayer -func RelayerModifiesMessage(network interfaces.LocalNetwork, teleporterInfo utils.TeleporterTestInfo) { +func RelayerModifiesMessage(network interfaces.LocalNetwork, teleporter utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -43,34 +43,34 @@ func RelayerModifiesMessage(network interfaces.LocalNetwork, teleporterInfo util } receipt, messageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) // Relay the message to the destination // Relayer modifies the message in flight relayAlteredMessage( ctx, - teleporterInfo, + teleporter, receipt, subnetAInfo, subnetBInfo, network) // Check Teleporter message was not received on the destination - delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) + delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeFalse()) } func relayAlteredMessage( ctx context.Context, - teleporterInfo utils.TeleporterTestInfo, + teleporter utils.TeleporterTestInfo, sourceReceipt *types.Receipt, source interfaces.SubnetTestInfo, destination interfaces.SubnetTestInfo, network interfaces.LocalNetwork, ) { // Fetch the Teleporter message from the logs - sendEvent, err := utils.GetEventFromLogs(sourceReceipt.Logs, teleporterInfo[source.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) + sendEvent, err := utils.GetEventFromLogs(sourceReceipt.Logs, teleporter.TeleporterMessenger(source).ParseSendCrossChainMessage) Expect(err).Should(BeNil()) signedWarpMessage := utils.ConstructSignedWarpMessage(ctx, sourceReceipt, source, destination) @@ -82,7 +82,7 @@ func relayAlteredMessage( signedWarpMessage, &sendEvent.Message, sendEvent.Message.RequiredGasLimit, - teleporterInfo[source.BlockchainID].TeleporterMessengerAddress, + teleporter.TeleporterMessengerAddress(source), fundedKey, destination, ) diff --git a/tests/flows/teleporter/resubmit_altered_message.go b/tests/flows/teleporter/resubmit_altered_message.go index d64131512..591393b4c 100644 --- a/tests/flows/teleporter/resubmit_altered_message.go +++ b/tests/flows/teleporter/resubmit_altered_message.go @@ -13,7 +13,7 @@ import ( . "github.com/onsi/gomega" ) -func ResubmitAlteredMessage(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func ResubmitAlteredMessage(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -34,18 +34,18 @@ func ResubmitAlteredMessage(network interfaces.Network, teleporterInfo utils.Tel } receipt, messageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) // Relay the message to the destination - receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) + receipt = teleporter.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) log.Info("Checking the message was received on the destination") - delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) + delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Get the Teleporter message from receive event - event, err := utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) + event, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) Expect(event.MessageID[:]).Should(Equal(messageID[:])) teleporterMessage := event.Message @@ -61,7 +61,7 @@ func ResubmitAlteredMessage(network interfaces.Network, teleporterInfo utils.Tel log.Info("Submitting the altered Teleporter message on the source chain") opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.RetrySendCrossChainMessage(opts, teleporterMessage) + tx, err := teleporter.TeleporterMessenger(subnetAInfo).RetrySendCrossChainMessage(opts, teleporterMessage) Expect(err).ShouldNot(BeNil()) // We expect the tx to be nil because the Warp message failed verification, which happens in the predicate diff --git a/tests/flows/teleporter/retry_successful_execution.go b/tests/flows/teleporter/retry_successful_execution.go index 422c781aa..1a3df6895 100644 --- a/tests/flows/teleporter/retry_successful_execution.go +++ b/tests/flows/teleporter/retry_successful_execution.go @@ -11,7 +11,7 @@ import ( . "github.com/onsi/gomega" ) -func RetrySuccessfulExecution(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func RetrySuccessfulExecution(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -25,14 +25,14 @@ func RetrySuccessfulExecution(network interfaces.Network, teleporterInfo utils.T ctx, fundedKey, fundedAddress, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(subnetAInfo), subnetAInfo, ) testMessengerContractAddressB, subnetBTestMessenger := utils.DeployTestMessenger( ctx, fundedKey, fundedAddress, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterRegistryAddress, + teleporter.TeleporterRegistryAddress(subnetBInfo), subnetBInfo, ) @@ -56,7 +56,7 @@ func RetrySuccessfulExecution(network interfaces.Network, teleporterInfo utils.T // Wait for the transaction to be mined receipt := utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) - event, err := utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) + event, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage) Expect(err).Should(BeNil()) Expect(event.DestinationBlockchainID[:]).Should(Equal(subnetBInfo.BlockchainID[:])) @@ -65,16 +65,16 @@ func RetrySuccessfulExecution(network interfaces.Network, teleporterInfo utils.T // // Relay the message to the destination // - receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) + receipt = teleporter.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) receiveEvent, err := - utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) + utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) deliveredTeleporterMessage := receiveEvent.Message // // Check Teleporter message received on the destination // - delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( + delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -93,7 +93,7 @@ func RetrySuccessfulExecution(network interfaces.Network, teleporterInfo utils.T optsB, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetBInfo.EVMChainID) Expect(err).Should(BeNil()) tx, err = - teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.RetryMessageExecution(optsB, subnetAInfo.BlockchainID, deliveredTeleporterMessage) + teleporter.TeleporterMessenger(subnetBInfo).RetryMessageExecution(optsB, subnetAInfo.BlockchainID, deliveredTeleporterMessage) Expect(err).Should(Not(BeNil())) Expect(tx).Should(BeNil()) } diff --git a/tests/flows/teleporter/send_specific_receipts.go b/tests/flows/teleporter/send_specific_receipts.go index 4b4192f3a..5a75f3487 100644 --- a/tests/flows/teleporter/send_specific_receipts.go +++ b/tests/flows/teleporter/send_specific_receipts.go @@ -16,10 +16,10 @@ import ( . "github.com/onsi/gomega" ) -func SendSpecificReceipts(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func SendSpecificReceipts(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) - teleporterContractAddress := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessengerAddress + teleporterContractAddress := teleporter.TeleporterMessengerAddress(subnetAInfo) _, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -27,7 +27,7 @@ func SendSpecificReceipts(network interfaces.Network, teleporterInfo utils.Telep // This is only done if the test non-external networks because external networks may have // an arbitrarily high number of receipts to be cleared from a given queue from unrelated messages. if !network.IsExternalNetwork() { - utils.ClearReceiptQueue(ctx, teleporterInfo, subnetBInfo, subnetAInfo, fundedKey) + utils.ClearReceiptQueue(ctx, teleporter, subnetBInfo, subnetAInfo, fundedKey) } // Use mock token as the fee token @@ -61,42 +61,42 @@ func SendSpecificReceipts(network interfaces.Network, teleporterInfo utils.Telep // Send first message from Subnet A to Subnet B with fee amount 5 sendCrossChainMsgReceipt, messageID1 := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) // Relay the message from SubnetA to SubnetB - deliveryReceipt1 := teleporterInfo.RelayTeleporterMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true, fundedKey) + deliveryReceipt1 := teleporter.RelayTeleporterMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true, fundedKey) receiveEvent1, err := utils.GetEventFromLogs( deliveryReceipt1.Logs, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) + teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) Expect(receiveEvent1.MessageID[:]).Should(Equal(messageID1[:])) // Check that the first message was delivered - delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID1) + delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived(&bind.CallOpts{}, messageID1) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Send second message from Subnet A to Subnet B with fee amount 5 sendCrossChainMsgReceipt, messageID2 := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) + ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) // Relay the message from SubnetA to SubnetB - deliveryReceipt2 := teleporterInfo.RelayTeleporterMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true, fundedKey) + deliveryReceipt2 := teleporter.RelayTeleporterMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true, fundedKey) receiveEvent2, err := utils.GetEventFromLogs( deliveryReceipt2.Logs, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage) + teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) Expect(err).Should(BeNil()) Expect(receiveEvent2.MessageID[:]).Should(Equal(messageID2[:])) // Check that the second message was delivered - delivered, err = teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID2) + delivered, err = teleporter.TeleporterMessenger(subnetBInfo).MessageReceived(&bind.CallOpts{}, messageID2) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Call send specific receipts to get reward of relaying two messages receipt, messageID := utils.SendSpecifiedReceiptsAndWaitForAcceptance( ctx, - teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger, + teleporter.TeleporterMessenger(subnetBInfo), subnetBInfo, subnetAInfo.BlockchainID, [][32]byte{messageID1, messageID2}, @@ -109,21 +109,21 @@ func SendSpecificReceipts(network interfaces.Network, teleporterInfo utils.Telep ) // Relay message from Subnet B to Subnet A - receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetBInfo, subnetAInfo, true, fundedKey) + receipt = teleporter.RelayTeleporterMessage(ctx, receipt, subnetBInfo, subnetAInfo, true, fundedKey) // Check that the message back to Subnet A was delivered - delivered, err = teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.MessageReceived(&bind.CallOpts{}, messageID) + delivered, err = teleporter.TeleporterMessenger(subnetAInfo).MessageReceived(&bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) // Check that the expected receipts were received and emitted ReceiptReceived - Expect(utils.CheckReceiptReceived(receipt, messageID1, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger)).Should(BeTrue()) - Expect(utils.CheckReceiptReceived(receipt, messageID2, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger)).Should(BeTrue()) + Expect(utils.CheckReceiptReceived(receipt, messageID1, teleporter.TeleporterMessenger(subnetAInfo))).Should(BeTrue()) + Expect(utils.CheckReceiptReceived(receipt, messageID2, teleporter.TeleporterMessenger(subnetAInfo))).Should(BeTrue()) // Check the reward amounts. // Even on external networks, the relayer should only have the expected fee amount // for this asset because the asset contract was newly deployed by this test. - checkExpectedRewardAmounts(teleporterInfo, subnetAInfo, receiveEvent1, receiveEvent2, mockTokenAddress, relayerFeePerMessage) + checkExpectedRewardAmounts(teleporter, subnetAInfo, receiveEvent1, receiveEvent2, mockTokenAddress, relayerFeePerMessage) // If the network is internal to the test application, send a message from Subnet B to Subnet A to trigger // the "regular" method of delivering receipts. The next message from B->A will contain the same receipts @@ -145,12 +145,12 @@ func SendSpecificReceipts(network interfaces.Network, teleporterInfo utils.Telep // This message will also have the same receipts as the previous message receipt, messageID = utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger, subnetBInfo, subnetAInfo, sendCrossChainMessageInput, fundedKey) + ctx, teleporter.TeleporterMessenger(subnetBInfo), subnetBInfo, subnetAInfo, sendCrossChainMessageInput, fundedKey) // Relay message from Subnet B to Subnet A - receipt = teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetBInfo, subnetAInfo, true, fundedKey) + receipt = teleporter.RelayTeleporterMessage(ctx, receipt, subnetBInfo, subnetAInfo, true, fundedKey) // Check delivered - delivered, err = teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.MessageReceived( + delivered, err = teleporter.TeleporterMessenger(subnetAInfo).MessageReceived( &bind.CallOpts{}, messageID) Expect(err).Should(BeNil()) @@ -158,12 +158,12 @@ func SendSpecificReceipts(network interfaces.Network, teleporterInfo utils.Telep // Check that the expected receipts were included in the message but did not emit ReceiptReceived // because they were previously received - Expect(utils.CheckReceiptReceived(receipt, messageID1, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger)).Should(BeFalse()) - Expect(utils.CheckReceiptReceived(receipt, messageID2, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger)).Should(BeFalse()) + Expect(utils.CheckReceiptReceived(receipt, messageID1, teleporter.TeleporterMessenger(subnetAInfo))).Should(BeFalse()) + Expect(utils.CheckReceiptReceived(receipt, messageID2, teleporter.TeleporterMessenger(subnetAInfo))).Should(BeFalse()) receiveEvent, err := utils.GetEventFromLogs( receipt.Logs, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage, + teleporter.TeleporterMessenger(subnetAInfo).ParseReceiveCrossChainMessage, ) Expect(err).Should(BeNil()) log.Info("Receipt included", "count", len(receiveEvent.Message.Receipts), "receipts", receiveEvent.Message.Receipts) @@ -181,7 +181,7 @@ func SendSpecificReceipts(network interfaces.Network, teleporterInfo utils.Telep receiveEvent.Message.Receipts)).Should(BeTrue()) // Check the reward amount remains the same - checkExpectedRewardAmounts(teleporterInfo, subnetAInfo, receiveEvent1, receiveEvent2, mockTokenAddress, relayerFeePerMessage) + checkExpectedRewardAmounts(teleporter, subnetAInfo, receiveEvent1, receiveEvent2, mockTokenAddress, relayerFeePerMessage) } } @@ -213,7 +213,7 @@ func receiptIncluded( // assumed that the {tokenAddress} was used as the fee asset for each of the messages, // and that each message individually had a fee of {feePerMessage}. func checkExpectedRewardAmounts( - teleporterInfo utils.TeleporterTestInfo, + teleporter utils.TeleporterTestInfo, sourceSubnet interfaces.SubnetTestInfo, receiveEvent1 *teleportermessenger.TeleporterMessengerReceiveCrossChainMessage, receiveEvent2 *teleportermessenger.TeleporterMessengerReceiveCrossChainMessage, @@ -225,20 +225,20 @@ func checkExpectedRewardAmounts( // it should be able to redeem {feePerMessage}*2. Otherwise, // each distinct reward redeemer should be able to redeem {feePerMessage}. if receiveEvent1.RewardRedeemer == receiveEvent2.RewardRedeemer { - amount, err := teleporterInfo[sourceSubnet.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( + amount, err := teleporter[sourceSubnet.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent1.RewardRedeemer, tokenAddress) Expect(err).Should(BeNil()) Expect(amount).Should(Equal(new(big.Int).Mul(feePerMessage, big.NewInt(2)))) } else { - amount1, err := teleporterInfo[sourceSubnet.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( + amount1, err := teleporter[sourceSubnet.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent1.RewardRedeemer, tokenAddress) Expect(err).Should(BeNil()) Expect(amount1).Should(Equal(feePerMessage)) - amount2, err := teleporterInfo[sourceSubnet.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( + amount2, err := teleporter[sourceSubnet.BlockchainID].TeleporterMessenger.CheckRelayerRewardAmount( &bind.CallOpts{}, receiveEvent2.RewardRedeemer, tokenAddress) diff --git a/tests/flows/teleporter/teleporter_message_ids.go b/tests/flows/teleporter/teleporter_message_ids.go index 563a156bd..a00d0cf17 100644 --- a/tests/flows/teleporter/teleporter_message_ids.go +++ b/tests/flows/teleporter/teleporter_message_ids.go @@ -16,15 +16,15 @@ import ( ) // Tests Teleporter message ID calculation -func CalculateMessageID(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func CalculateMessageID(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetInfo := network.GetPrimaryNetworkInfo() - teleporterContractAddress := teleporterInfo[subnetInfo.BlockchainID].TeleporterMessengerAddress + teleporterContractAddress := teleporter.TeleporterMessengerAddress(subnetInfo) sourceBlockchainID := common.HexToHash("0xabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcdefabcd") destinationBlockchainID := common.HexToHash("0x1234567812345678123456781234567812345678123456781234567812345678") nonce := big.NewInt(42) - expectedMessageID, err := teleporterInfo[subnetInfo.BlockchainID].TeleporterMessenger.CalculateMessageID( + expectedMessageID, err := teleporter.TeleporterMessenger(subnetInfo).CalculateMessageID( &bind.CallOpts{}, sourceBlockchainID, destinationBlockchainID, diff --git a/tests/flows/teleporter/unallowed_relayer.go b/tests/flows/teleporter/unallowed_relayer.go index 3b7c8ceb6..0da726cee 100644 --- a/tests/flows/teleporter/unallowed_relayer.go +++ b/tests/flows/teleporter/unallowed_relayer.go @@ -13,7 +13,7 @@ import ( . "github.com/onsi/gomega" ) -func UnallowedRelayer(network interfaces.Network, teleporterInfo utils.TeleporterTestInfo) { +func UnallowedRelayer(network interfaces.Network, teleporter utils.TeleporterTestInfo) { subnetAInfo := network.GetPrimaryNetworkInfo() subnetBInfo, _ := utils.GetTwoSubnets(network) fundedAddress, fundedKey := network.GetFundedAccountInfo() @@ -43,18 +43,18 @@ func UnallowedRelayer(network interfaces.Network, teleporterInfo utils.Teleporte "destinationBlockchainID", subnetBInfo.BlockchainID, ) receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( - ctx, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey, + ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey, ) // // Relay the message to the destination // - teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, false, fundedKey) + teleporter.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, false, fundedKey) // // Check Teleporter message was not received on the destination // - delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( + delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) diff --git a/tests/flows/teleporter/validator_churn.go b/tests/flows/teleporter/validator_churn.go index 8b353c96f..8541feee7 100644 --- a/tests/flows/teleporter/validator_churn.go +++ b/tests/flows/teleporter/validator_churn.go @@ -17,9 +17,9 @@ import ( const newNodeCount = 2 -func ValidatorChurn(network interfaces.LocalNetwork, teleporterInfo utils.TeleporterTestInfo) { +func ValidatorChurn(network interfaces.LocalNetwork, teleporter utils.TeleporterTestInfo) { subnetAInfo, subnetBInfo := utils.GetTwoSubnets(network) - teleporterContractAddress := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessengerAddress + teleporterContractAddress := teleporter.TeleporterMessengerAddress(subnetAInfo) fundedAddress, fundedKey := network.GetFundedAccountInfo() ctx := context.Background() @@ -42,14 +42,14 @@ func ValidatorChurn(network interfaces.LocalNetwork, teleporterInfo utils.Telepo receipt, teleporterMessageID := utils.SendCrossChainMessageAndWaitForAcceptance( ctx, - teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger, + teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey, ) - sendEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) + sendEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage) Expect(err).Should(BeNil()) sentTeleporterMessage := sendEvent.Message @@ -95,7 +95,7 @@ func ValidatorChurn(network interfaces.LocalNetwork, teleporterInfo utils.Telepo utils.SendTransactionAndWaitForFailure(ctx, subnetBInfo, signedTx) // Verify the message was not delivered - delivered, err := teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( + delivered, err := teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -107,7 +107,7 @@ func ValidatorChurn(network interfaces.LocalNetwork, teleporterInfo utils.Telepo log.Info("Retrying message sending on source chain") optsA, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetAInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err := teleporterInfo[subnetAInfo.BlockchainID].TeleporterMessenger.RetrySendCrossChainMessage( + tx, err := teleporter.TeleporterMessenger(subnetAInfo).RetrySendCrossChainMessage( optsA, sentTeleporterMessage, ) Expect(err).Should(BeNil()) @@ -115,10 +115,10 @@ func ValidatorChurn(network interfaces.LocalNetwork, teleporterInfo utils.Telepo // Wait for the transaction to be mined receipt = utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) - teleporterInfo.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) + teleporter.RelayTeleporterMessage(ctx, receipt, subnetAInfo, subnetBInfo, true, fundedKey) // Verify the message was delivered - delivered, err = teleporterInfo[subnetBInfo.BlockchainID].TeleporterMessenger.MessageReceived( + delivered, err = teleporter.TeleporterMessenger(subnetBInfo).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) diff --git a/tests/utils/teleporter.go b/tests/utils/teleporter.go index 5864f946c..3bda07938 100644 --- a/tests/utils/teleporter.go +++ b/tests/utils/teleporter.go @@ -52,6 +52,22 @@ func NewTeleporterTestInfo(subnets []interfaces.SubnetTestInfo) TeleporterTestIn return t } +func (t TeleporterTestInfo) TeleporterMessenger(subnet interfaces.SubnetTestInfo) *teleportermessenger.TeleporterMessenger { + return t[subnet.BlockchainID].TeleporterMessenger +} + +func (t TeleporterTestInfo) TeleporterMessengerAddress(subnet interfaces.SubnetTestInfo) common.Address { + return t[subnet.BlockchainID].TeleporterMessengerAddress +} + +func (t TeleporterTestInfo) TeleporterRegistry(subnet interfaces.SubnetTestInfo) *teleporterregistry.TeleporterRegistry { + return t[subnet.BlockchainID].TeleporterRegistry +} + +func (t TeleporterTestInfo) TeleporterRegistryAddress(subnet interfaces.SubnetTestInfo) common.Address { + return t[subnet.BlockchainID].TeleporterRegistryAddress +} + func (t TeleporterTestInfo) SetTeleporter(address common.Address, subnet interfaces.SubnetTestInfo) { teleporterMessenger, err := teleportermessenger.NewTeleporterMessenger( address, subnet.RPCClient, @@ -65,7 +81,7 @@ func (t TeleporterTestInfo) SetTeleporter(address common.Address, subnet interfa func (t TeleporterTestInfo) InitializeBlockchainID(subnet interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey) { opts, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnet.EVMChainID) Expect(err).Should(BeNil()) - tx, err := t[subnet.BlockchainID].TeleporterMessenger.InitializeBlockchainID(opts) + tx, err := t.TeleporterMessenger(subnet).InitializeBlockchainID(opts) Expect(err).Should(BeNil()) WaitForTransactionSuccess(context.Background(), subnet, tx.Hash()) } @@ -75,7 +91,7 @@ func (t TeleporterTestInfo) DeployTeleporterRegistry(subnet interfaces.SubnetTes entries := []teleporterregistry.ProtocolRegistryEntry{ { Version: big.NewInt(1), - ProtocolAddress: t[subnet.BlockchainID].TeleporterMessengerAddress, + ProtocolAddress: t.TeleporterMessengerAddress(subnet), }, } opts, err := bind.NewKeyedTransactorWithChainID(deployerKey, subnet.EVMChainID) @@ -136,7 +152,7 @@ func (t TeleporterTestInfo) RelayTeleporterMessage( fundedKey *ecdsa.PrivateKey, ) *types.Receipt { // Fetch the Teleporter message from the logs - sendEvent, err := GetEventFromLogs(sourceReceipt.Logs, t[source.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) + sendEvent, err := GetEventFromLogs(sourceReceipt.Logs, t.TeleporterMessenger(source).ParseSendCrossChainMessage) Expect(err).Should(BeNil()) signedWarpMessage := ConstructSignedWarpMessage(ctx, sourceReceipt, source, destination) @@ -146,7 +162,7 @@ func (t TeleporterTestInfo) RelayTeleporterMessage( ctx, signedWarpMessage, sendEvent.Message.RequiredGasLimit, - t[source.BlockchainID].TeleporterMessengerAddress, + t.TeleporterMessengerAddress(source), fundedKey, destination, ) @@ -161,7 +177,7 @@ func (t TeleporterTestInfo) RelayTeleporterMessage( // Check the transaction logs for the ReceiveCrossChainMessage event emitted by the Teleporter contract receiveEvent, err := GetEventFromLogs( receipt.Logs, - t[destination.BlockchainID].TeleporterMessenger.ParseReceiveCrossChainMessage, + t.TeleporterMessenger(destination).ParseReceiveCrossChainMessage, ) Expect(err).Should(BeNil()) Expect(receiveEvent.SourceBlockchainID[:]).Should(Equal(source.BlockchainID[:])) @@ -475,7 +491,10 @@ func ClearReceiptQueue( destination interfaces.SubnetTestInfo, fundedKey *ecdsa.PrivateKey, ) { - outstandReceiptCount := GetOutstandingReceiptCount(teleporterInfo[source.BlockchainID].TeleporterMessenger, destination.BlockchainID) + outstandReceiptCount := GetOutstandingReceiptCount( + teleporterInfo.TeleporterMessenger(source), + destination.BlockchainID, + ) for outstandReceiptCount.Cmp(big.NewInt(0)) != 0 { log.Info("Emptying receipt queue", "remainingReceipts", outstandReceiptCount.String()) // Send message from Subnet B to Subnet A to trigger the "regular" method of delivering receipts. @@ -495,12 +514,12 @@ func ClearReceiptQueue( // This message will also have the same receipts as the previous message receipt, _ := SendCrossChainMessageAndWaitForAcceptance( - ctx, teleporterInfo[source.BlockchainID].TeleporterMessenger, source, destination, sendCrossChainMessageInput, fundedKey) + ctx, teleporterInfo.TeleporterMessenger(source), source, destination, sendCrossChainMessageInput, fundedKey) // Relay message teleporterInfo.RelayTeleporterMessage(ctx, receipt, source, destination, true, fundedKey) - outstandReceiptCount = GetOutstandingReceiptCount(teleporterInfo[source.BlockchainID].TeleporterMessenger, destination.BlockchainID) + outstandReceiptCount = GetOutstandingReceiptCount(teleporterInfo.TeleporterMessenger(source), destination.BlockchainID) } log.Info("Receipt queue emptied") } @@ -540,7 +559,7 @@ func SendExampleCrossChainMessageAndVerify( // Wait for the transaction to be mined receipt := WaitForTransactionSuccess(ctx, source, tx.Hash()) - event, err := GetEventFromLogs(receipt.Logs, teleporterInfo[source.BlockchainID].TeleporterMessenger.ParseSendCrossChainMessage) + event, err := GetEventFromLogs(receipt.Logs, teleporterInfo.TeleporterMessenger(source).ParseSendCrossChainMessage) Expect(err).Should(BeNil()) Expect(event.DestinationBlockchainID[:]).Should(Equal(destination.BlockchainID[:])) @@ -554,7 +573,7 @@ func SendExampleCrossChainMessageAndVerify( // // Check Teleporter message received on the destination // - delivered, err := teleporterInfo[destination.BlockchainID].TeleporterMessenger.MessageReceived( + delivered, err := teleporterInfo.TeleporterMessenger(destination).MessageReceived( &bind.CallOpts{}, teleporterMessageID, ) Expect(err).Should(BeNil()) @@ -562,14 +581,14 @@ func SendExampleCrossChainMessageAndVerify( if expectSuccess { // Check that message execution was successful - messageExecutedEvent, err := GetEventFromLogs(receipt.Logs, teleporterInfo[destination.BlockchainID].TeleporterMessenger.ParseMessageExecuted) + messageExecutedEvent, err := GetEventFromLogs(receipt.Logs, teleporterInfo.TeleporterMessenger(destination).ParseMessageExecuted) Expect(err).Should(BeNil()) Expect(messageExecutedEvent.MessageID[:]).Should(Equal(teleporterMessageID[:])) } else { // Check that message execution failed messageExecutionFailedEvent, err := GetEventFromLogs( receipt.Logs, - teleporterInfo[destination.BlockchainID].TeleporterMessenger.ParseMessageExecutionFailed, + teleporterInfo.TeleporterMessenger(destination).ParseMessageExecutionFailed, ) Expect(err).Should(BeNil()) Expect(messageExecutionFailedEvent.MessageID[:]).Should(Equal(teleporterMessageID[:])) From 75ecd7cfff847da93a30207823069a16d991a583 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Mon, 14 Oct 2024 17:40:49 -0500 Subject: [PATCH 507/545] lint --- tests/flows/teleporter/add_fee_amount.go | 14 +++++- .../deliver_to_nonexistent_contract.go | 5 +- tests/flows/teleporter/insufficient_gas.go | 10 +++- .../teleporter/relayer_modifies_message.go | 5 +- .../teleporter/resubmit_altered_message.go | 5 +- .../teleporter/retry_successful_execution.go | 12 +++-- .../teleporter/send_specific_receipts.go | 36 +++++++++++++-- tests/flows/teleporter/validator_churn.go | 5 +- tests/local/network.go | 1 - tests/utils/teleporter.go | 46 ++++++++++++++----- 10 files changed, 112 insertions(+), 27 deletions(-) diff --git a/tests/flows/teleporter/add_fee_amount.go b/tests/flows/teleporter/add_fee_amount.go index 5f8c9e33c..abf6c7932 100644 --- a/tests/flows/teleporter/add_fee_amount.go +++ b/tests/flows/teleporter/add_fee_amount.go @@ -72,7 +72,14 @@ func AddFeeAmount(network interfaces.Network, teleporter utils.TeleporterTestInf ) // Relay message from Subnet A to Subnet B - deliveryReceipt := teleporter.RelayTeleporterMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true, fundedKey) + deliveryReceipt := teleporter.RelayTeleporterMessage( + ctx, + sendCrossChainMsgReceipt, + subnetAInfo, + subnetBInfo, + true, + fundedKey, + ) receiveEvent, err := utils.GetEventFromLogs( deliveryReceipt.Logs, teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) @@ -108,7 +115,10 @@ func AddFeeAmount(network interfaces.Network, teleporter utils.TeleporterTestInf teleporter.RelayTeleporterMessage(ctx, sendSpecificReceiptsReceipt, subnetBInfo, subnetAInfo, true, fundedKey) // Check message delivered - delivered, err = teleporter.TeleporterMessenger(subnetAInfo).MessageReceived(&bind.CallOpts{}, sendSpecificReceiptsMessageID) + delivered, err = teleporter.TeleporterMessenger(subnetAInfo).MessageReceived( + &bind.CallOpts{}, + sendSpecificReceiptsMessageID, + ) Expect(err).Should(BeNil()) Expect(delivered).Should(BeTrue()) diff --git a/tests/flows/teleporter/deliver_to_nonexistent_contract.go b/tests/flows/teleporter/deliver_to_nonexistent_contract.go index abc7b483d..e5787f999 100644 --- a/tests/flows/teleporter/deliver_to_nonexistent_contract.go +++ b/tests/flows/teleporter/deliver_to_nonexistent_contract.go @@ -75,7 +75,10 @@ func DeliverToNonExistentContract(network interfaces.Network, teleporter utils.T // Wait for the transaction to be mined receipt := utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) - sendEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage) + sendEvent, err := utils.GetEventFromLogs( + receipt.Logs, + teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage, + ) Expect(err).Should(BeNil()) Expect(sendEvent.DestinationBlockchainID[:]).Should(Equal(subnetBInfo.BlockchainID[:])) diff --git a/tests/flows/teleporter/insufficient_gas.go b/tests/flows/teleporter/insufficient_gas.go index f2df271a2..5af9f4ddb 100644 --- a/tests/flows/teleporter/insufficient_gas.go +++ b/tests/flows/teleporter/insufficient_gas.go @@ -46,7 +46,10 @@ func InsufficientGas(network interfaces.Network, teleporter utils.TeleporterTest // Wait for the transaction to be mined receipt := utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) - event, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage) + event, err := utils.GetEventFromLogs( + receipt.Logs, + teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage, + ) Expect(err).Should(BeNil()) Expect(event.DestinationBlockchainID[:]).Should(Equal(subnetBInfo.BlockchainID[:])) @@ -79,7 +82,10 @@ func InsufficientGas(network interfaces.Network, teleporter utils.TeleporterTest failedMessageExecutionEvent.Message, fundedKey, ) - executedEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetBInfo).ParseMessageExecuted) + executedEvent, err := utils.GetEventFromLogs( + receipt.Logs, + teleporter.TeleporterMessenger(subnetBInfo).ParseMessageExecuted, + ) Expect(err).Should(BeNil()) Expect(executedEvent.MessageID[:]).Should(Equal(messageID[:])) Expect(executedEvent.SourceBlockchainID[:]).Should(Equal(subnetAInfo.BlockchainID[:])) diff --git a/tests/flows/teleporter/relayer_modifies_message.go b/tests/flows/teleporter/relayer_modifies_message.go index cadafb5f7..32c1385d4 100644 --- a/tests/flows/teleporter/relayer_modifies_message.go +++ b/tests/flows/teleporter/relayer_modifies_message.go @@ -70,7 +70,10 @@ func relayAlteredMessage( network interfaces.LocalNetwork, ) { // Fetch the Teleporter message from the logs - sendEvent, err := utils.GetEventFromLogs(sourceReceipt.Logs, teleporter.TeleporterMessenger(source).ParseSendCrossChainMessage) + sendEvent, err := utils.GetEventFromLogs( + sourceReceipt.Logs, + teleporter.TeleporterMessenger(source).ParseSendCrossChainMessage, + ) Expect(err).Should(BeNil()) signedWarpMessage := utils.ConstructSignedWarpMessage(ctx, sourceReceipt, source, destination) diff --git a/tests/flows/teleporter/resubmit_altered_message.go b/tests/flows/teleporter/resubmit_altered_message.go index 591393b4c..dcc47c75f 100644 --- a/tests/flows/teleporter/resubmit_altered_message.go +++ b/tests/flows/teleporter/resubmit_altered_message.go @@ -45,7 +45,10 @@ func ResubmitAlteredMessage(network interfaces.Network, teleporter utils.Telepor Expect(delivered).Should(BeTrue()) // Get the Teleporter message from receive event - event, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) + event, err := utils.GetEventFromLogs( + receipt.Logs, + teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage, + ) Expect(err).Should(BeNil()) Expect(event.MessageID[:]).Should(Equal(messageID[:])) teleporterMessage := event.Message diff --git a/tests/flows/teleporter/retry_successful_execution.go b/tests/flows/teleporter/retry_successful_execution.go index 1a3df6895..a90cb5305 100644 --- a/tests/flows/teleporter/retry_successful_execution.go +++ b/tests/flows/teleporter/retry_successful_execution.go @@ -56,7 +56,10 @@ func RetrySuccessfulExecution(network interfaces.Network, teleporter utils.Telep // Wait for the transaction to be mined receipt := utils.WaitForTransactionSuccess(ctx, subnetAInfo, tx.Hash()) - event, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage) + event, err := utils.GetEventFromLogs( + receipt.Logs, + teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage, + ) Expect(err).Should(BeNil()) Expect(event.DestinationBlockchainID[:]).Should(Equal(subnetBInfo.BlockchainID[:])) @@ -92,8 +95,11 @@ func RetrySuccessfulExecution(network interfaces.Network, teleporter utils.Telep // optsB, err := bind.NewKeyedTransactorWithChainID(fundedKey, subnetBInfo.EVMChainID) Expect(err).Should(BeNil()) - tx, err = - teleporter.TeleporterMessenger(subnetBInfo).RetryMessageExecution(optsB, subnetAInfo.BlockchainID, deliveredTeleporterMessage) + tx, err = teleporter.TeleporterMessenger(subnetBInfo).RetryMessageExecution( + optsB, + subnetAInfo.BlockchainID, + deliveredTeleporterMessage, + ) Expect(err).Should(Not(BeNil())) Expect(tx).Should(BeNil()) } diff --git a/tests/flows/teleporter/send_specific_receipts.go b/tests/flows/teleporter/send_specific_receipts.go index 5a75f3487..baf958f9c 100644 --- a/tests/flows/teleporter/send_specific_receipts.go +++ b/tests/flows/teleporter/send_specific_receipts.go @@ -64,7 +64,14 @@ func SendSpecificReceipts(network interfaces.Network, teleporter utils.Teleporte ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) // Relay the message from SubnetA to SubnetB - deliveryReceipt1 := teleporter.RelayTeleporterMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true, fundedKey) + deliveryReceipt1 := teleporter.RelayTeleporterMessage( + ctx, + sendCrossChainMsgReceipt, + subnetAInfo, + subnetBInfo, + true, + fundedKey, + ) receiveEvent1, err := utils.GetEventFromLogs( deliveryReceipt1.Logs, teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) @@ -81,7 +88,14 @@ func SendSpecificReceipts(network interfaces.Network, teleporter utils.Teleporte ctx, teleporter.TeleporterMessenger(subnetAInfo), subnetAInfo, subnetBInfo, sendCrossChainMessageInput, fundedKey) // Relay the message from SubnetA to SubnetB - deliveryReceipt2 := teleporter.RelayTeleporterMessage(ctx, sendCrossChainMsgReceipt, subnetAInfo, subnetBInfo, true, fundedKey) + deliveryReceipt2 := teleporter.RelayTeleporterMessage( + ctx, + sendCrossChainMsgReceipt, + subnetAInfo, + subnetBInfo, + true, + fundedKey, + ) receiveEvent2, err := utils.GetEventFromLogs( deliveryReceipt2.Logs, teleporter.TeleporterMessenger(subnetBInfo).ParseReceiveCrossChainMessage) @@ -123,7 +137,14 @@ func SendSpecificReceipts(network interfaces.Network, teleporter utils.Teleporte // Check the reward amounts. // Even on external networks, the relayer should only have the expected fee amount // for this asset because the asset contract was newly deployed by this test. - checkExpectedRewardAmounts(teleporter, subnetAInfo, receiveEvent1, receiveEvent2, mockTokenAddress, relayerFeePerMessage) + checkExpectedRewardAmounts( + teleporter, + subnetAInfo, + receiveEvent1, + receiveEvent2, + mockTokenAddress, + relayerFeePerMessage, + ) // If the network is internal to the test application, send a message from Subnet B to Subnet A to trigger // the "regular" method of delivering receipts. The next message from B->A will contain the same receipts @@ -181,7 +202,14 @@ func SendSpecificReceipts(network interfaces.Network, teleporter utils.Teleporte receiveEvent.Message.Receipts)).Should(BeTrue()) // Check the reward amount remains the same - checkExpectedRewardAmounts(teleporter, subnetAInfo, receiveEvent1, receiveEvent2, mockTokenAddress, relayerFeePerMessage) + checkExpectedRewardAmounts( + teleporter, + subnetAInfo, + receiveEvent1, + receiveEvent2, + mockTokenAddress, + relayerFeePerMessage, + ) } } diff --git a/tests/flows/teleporter/validator_churn.go b/tests/flows/teleporter/validator_churn.go index 8541feee7..da7ec7016 100644 --- a/tests/flows/teleporter/validator_churn.go +++ b/tests/flows/teleporter/validator_churn.go @@ -49,7 +49,10 @@ func ValidatorChurn(network interfaces.LocalNetwork, teleporter utils.Teleporter fundedKey, ) - sendEvent, err := utils.GetEventFromLogs(receipt.Logs, teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage) + sendEvent, err := utils.GetEventFromLogs( + receipt.Logs, + teleporter.TeleporterMessenger(subnetAInfo).ParseSendCrossChainMessage, + ) Expect(err).Should(BeNil()) sentTeleporterMessage := sendEvent.Message diff --git a/tests/local/network.go b/tests/local/network.go index f1797f318..2839b082c 100644 --- a/tests/local/network.go +++ b/tests/local/network.go @@ -217,7 +217,6 @@ func (n *LocalNetwork) setPrimaryNetworkValues() { n.primaryNetworkInfo.WSClient = chainWSClient n.primaryNetworkInfo.RPCClient = chainRPCClient n.primaryNetworkInfo.EVMChainID = chainIDInt - } func (n *LocalNetwork) setSubnetValues(subnet *tmpnet.Subnet) { diff --git a/tests/utils/teleporter.go b/tests/utils/teleporter.go index 3bda07938..3c92413b7 100644 --- a/tests/utils/teleporter.go +++ b/tests/utils/teleporter.go @@ -52,7 +52,9 @@ func NewTeleporterTestInfo(subnets []interfaces.SubnetTestInfo) TeleporterTestIn return t } -func (t TeleporterTestInfo) TeleporterMessenger(subnet interfaces.SubnetTestInfo) *teleportermessenger.TeleporterMessenger { +func (t TeleporterTestInfo) TeleporterMessenger( + subnet interfaces.SubnetTestInfo, +) *teleportermessenger.TeleporterMessenger { return t[subnet.BlockchainID].TeleporterMessenger } @@ -60,7 +62,9 @@ func (t TeleporterTestInfo) TeleporterMessengerAddress(subnet interfaces.SubnetT return t[subnet.BlockchainID].TeleporterMessengerAddress } -func (t TeleporterTestInfo) TeleporterRegistry(subnet interfaces.SubnetTestInfo) *teleporterregistry.TeleporterRegistry { +func (t TeleporterTestInfo) TeleporterRegistry( + subnet interfaces.SubnetTestInfo, +) *teleporterregistry.TeleporterRegistry { return t[subnet.BlockchainID].TeleporterRegistry } @@ -428,12 +432,18 @@ func AddProtocolVersionAndWaitForAcceptance( // Wait for tx to be accepted, and verify events emitted receipt := SendTransactionAndWaitForSuccess(ctx, subnet, signedTx) - addProtocolVersionEvent, err := GetEventFromLogs(receipt.Logs, sourceTeleporterInfo.TeleporterRegistry.ParseAddProtocolVersion) + addProtocolVersionEvent, err := GetEventFromLogs( + receipt.Logs, + sourceTeleporterInfo.TeleporterRegistry.ParseAddProtocolVersion, + ) Expect(err).Should(BeNil()) Expect(addProtocolVersionEvent.Version.Cmp(expectedLatestVersion)).Should(Equal(0)) Expect(addProtocolVersionEvent.ProtocolAddress).Should(Equal(newTeleporterAddress)) - versionUpdatedEvent, err := GetEventFromLogs(receipt.Logs, sourceTeleporterInfo.TeleporterRegistry.ParseLatestVersionUpdated) + versionUpdatedEvent, err := GetEventFromLogs( + receipt.Logs, + sourceTeleporterInfo.TeleporterRegistry.ParseLatestVersionUpdated, + ) Expect(err).Should(BeNil()) Expect(versionUpdatedEvent.OldVersion.Cmp(curLatestVersion)).Should(Equal(0)) Expect(versionUpdatedEvent.NewVersion.Cmp(expectedLatestVersion)).Should(Equal(0)) @@ -519,12 +529,18 @@ func ClearReceiptQueue( // Relay message teleporterInfo.RelayTeleporterMessage(ctx, receipt, source, destination, true, fundedKey) - outstandReceiptCount = GetOutstandingReceiptCount(teleporterInfo.TeleporterMessenger(source), destination.BlockchainID) + outstandReceiptCount = GetOutstandingReceiptCount( + teleporterInfo.TeleporterMessenger(source), + destination.BlockchainID, + ) } log.Info("Receipt queue emptied") } -func GetOutstandingReceiptCount(teleporterMessenger *teleportermessenger.TeleporterMessenger, destinationBlockchainID ids.ID) *big.Int { +func GetOutstandingReceiptCount( + teleporterMessenger *teleportermessenger.TeleporterMessenger, + destinationBlockchainID ids.ID, +) *big.Int { size, err := teleporterMessenger.GetReceiptQueueSize(&bind.CallOpts{}, destinationBlockchainID) Expect(err).Should(BeNil()) return size @@ -581,7 +597,10 @@ func SendExampleCrossChainMessageAndVerify( if expectSuccess { // Check that message execution was successful - messageExecutedEvent, err := GetEventFromLogs(receipt.Logs, teleporterInfo.TeleporterMessenger(destination).ParseMessageExecuted) + messageExecutedEvent, err := GetEventFromLogs( + receipt.Logs, + teleporterInfo.TeleporterMessenger(destination).ParseMessageExecuted, + ) Expect(err).Should(BeNil()) Expect(messageExecutedEvent.MessageID[:]).Should(Equal(teleporterMessageID[:])) } else { @@ -764,10 +783,15 @@ func InitOffChainMessageChainConfig( teleporterAddress common.Address, version uint64, ) (*avalancheWarp.UnsignedMessage, string) { - unsignedMessage := CreateOffChainRegistryMessage(networkID, subnet, registryAddress, teleporterregistry.ProtocolRegistryEntry{ - Version: big.NewInt(int64(version)), - ProtocolAddress: teleporterAddress, - }) + unsignedMessage := CreateOffChainRegistryMessage( + networkID, + subnet, + registryAddress, + teleporterregistry.ProtocolRegistryEntry{ + Version: big.NewInt(int64(version)), + ProtocolAddress: teleporterAddress, + }, + ) log.Info("Adding off-chain message to Warp chain config", "messageID", unsignedMessage.ID(), "blockchainID", subnet.BlockchainID.String(), From 098442e22f22738d5033f28c8cf455cfe616c390 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 15 Oct 2024 08:48:52 -0500 Subject: [PATCH 508/545] remove ref to unused var --- 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 6927b6eb6..7bd5acbbc 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -18,7 +18,7 @@ function printHelp() { function printUsage() { cat << EOF Arguments: - --component Component test suite to run. Valid components are: $valid_components + --component Component test suite to run. Must be a valid directory in tests/local/ Options: --help Print this help message EOF From 646e4ddd10f67cb1dbd36f499bf8f7183a65fd12 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 15 Oct 2024 09:39:39 -0500 Subject: [PATCH 509/545] test all suites by default --- scripts/local/e2e_test.sh | 51 +++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/scripts/local/e2e_test.sh b/scripts/local/e2e_test.sh index 7bd5acbbc..783a898f2 100755 --- a/scripts/local/e2e_test.sh +++ b/scripts/local/e2e_test.sh @@ -18,21 +18,24 @@ function printHelp() { function printUsage() { cat << EOF Arguments: - --component Component test suite to run. Must be a valid directory in tests/local/ + --components component1,component2 Comma separated list of test suites to run. Valid components are: + $(echo $valid_components | tr ' ' '\n' | sort | tr '\n' ' ') + (default: all) Options: - --help Print this help message + --help Print this help message EOF } -component= +valid_components=$(ls -d $TELEPORTER_PATH/tests/local/*/ | xargs -n 1 basename) +components= while [ $# -gt 0 ]; do case "$1" in - --component) + --components) if [[ $2 != --* ]]; then - component=$2 + components=$2 else - echo "Invalid component $2" && printHelp && exit 1 + echo "Invalid components $2" && printHelp && exit 1 fi shift;; --help) @@ -43,14 +46,17 @@ while [ $# -gt 0 ]; do shift done -# Exit if no component is provided -if [ -z "$component" ]; then - echo "No component provided" && exit 1 +# Run all suites if no component is provided +if [ -z "$components" ]; then + components=$valid_components fi -if [ ! -d "./tests/local/$component" ]; then - echo "Component test suite not found" && exit 1 -fi +# Exit if invalid component is provided +for component in $(echo $components | tr ',' ' '); do + if [[ $valid_components != *$component* ]]; then + echo "Invalid component $component" && exit 1 + fi +done source "$TELEPORTER_PATH"/scripts/constants.sh source "$TELEPORTER_PATH"/scripts/versions.sh @@ -81,15 +87,18 @@ cd "$TELEPORTER_PATH" # to install the ginkgo binary (required for test build and run) go install -v github.com/onsi/ginkgo/v2/ginkgo@${GINKGO_VERSION} -ginkgo build ./tests/local/$component +for component in $(echo $components | tr ',' ' '); do + echo "Building e2e tests for $component" + ginkgo build ./tests/local/$component -# Run the tests -echo "Running e2e tests $RUN_E2E" -RUN_E2E=true ./tests/local/$component/$component.test \ - --ginkgo.vv \ - --ginkgo.label-filter=${GINKGO_LABEL_FILTER:-""} \ - --ginkgo.focus=${GINKGO_FOCUS:-""} \ - --ginkgo.trace + echo "Running e2e tests for $component" + RUN_E2E=true ./tests/local/$component/$component.test \ + --ginkgo.vv \ + --ginkgo.label-filter=${GINKGO_LABEL_FILTER:-""} \ + --ginkgo.focus=${GINKGO_FOCUS:-""} \ + --ginkgo.trace -echo "e2e tests passed" + echo "$component e2e tests passed" + echo "" +done exit 0 From 4cbde546ff4c7726dffe3ea145f3a0e7e44fdb73 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 15 Oct 2024 09:42:13 -0500 Subject: [PATCH 510/545] correct arg --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fa69605e1..a5edf0aed 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -67,7 +67,7 @@ jobs: run: | export PATH=$PATH:$HOME/.foundry/bin export PATH="$PATH:$GOPATH/bin" - ./scripts/local/e2e_test.sh --component teleporter + ./scripts/local/e2e_test.sh --components teleporter governance_e2e: name: governance-e2e-tests @@ -91,7 +91,7 @@ jobs: run: | export PATH=$PATH:$HOME/.foundry/bin export PATH="$PATH:$GOPATH/bin" - ./scripts/local/e2e_test.sh --component governance + ./scripts/local/e2e_test.sh --components governance validator_manager_e2e: name: validator-manager-e2e-tests @@ -115,4 +115,4 @@ jobs: run: | export PATH=$PATH:$HOME/.foundry/bin export PATH="$PATH:$GOPATH/bin" - ./scripts/local/e2e_test.sh --component validator-manager + ./scripts/local/e2e_test.sh --components validator-manager From 7bcb3e31b839eecd122995a47fd0ba2d8bd348f8 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 15 Oct 2024 11:54:23 -0500 Subject: [PATCH 511/545] validators can remove their delegations --- .../ERC20TokenStakingManager.go | 2 +- .../NativeTokenStakingManager.go | 2 +- .../validator-manager/PoSValidatorManager.sol | 14 +++- .../tests/PoSValidatorManagerTests.t.sol | 72 ++++++++++++++----- 4 files changed, 67 insertions(+), 23 deletions(-) diff --git a/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go b/abi-bindings/go/validator-manager/ERC20TokenStakingManager/ERC20TokenStakingManager.go index f62018b5b..c6cd32649 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: "0x608060405234801561000f575f80fd5b50604051615f02380380615f0283398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615db58061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b610209610204366004614fd3565b6104a8565b005b61020961021936600461500e565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b366004614fd3565b6106eb565b61020961025e366004615025565b6106f6565b610209610271366004615073565b610be2565b61028961028436600461500e565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb366004614fd3565b610c6c565b6102096102de366004615094565b610c77565b6102f66102f13660046150d4565b610d39565b604051908152602001610234565b610209610312366004615139565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f6610342366004615161565b610fd9565b61028961035536600461500e565b610ff2565b6102f65f81565b61020961036f366004614fd3565b611006565b610226603081565b61020961038a36600461500e565b611031565b61020961039d366004615139565b6110fc565b6102f66103b036600461517a565b6112d4565b6102096103c3366004615094565b611300565b6102f65f80516020615d2983398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b61020961041036600461500e565b611489565b6102f65f80516020615d4983398151915281565b61020961043736600461500e565b611672565b610226601481565b61045761045236600461500e565b6117af565b604051610234919061520f565b6102896202a30081565b6102f65f80516020615d0983398151915281565b6102096104903660046152a3565b6118fe565b6102f66104a33660046152e1565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615d898339815191526020526040808220815160e0810190925280545f80516020615d4983398151915293929190829060ff16600581111561052a5761052a61519a565b600581111561053b5761053b61519a565b815260200160018201805461054f9061534c565b80601f016020809104026020016040519081016040528092919081815260200182805461057b9061534c565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156106315761063161519a565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615384565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611cbd565b6040518263ffffffff1660e01b81526004016106a59190615392565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e591906153a4565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615d498339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af91906153a4565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e960608501604086016153bb565b6001600160a01b03161461082c5761080760608401604085016153bb565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a60608501856153d6565b905090505f805b828163ffffffff161015610b22575f61085d60608801886153d6565b8363ffffffff168181106108735761087361541b565b9050602002810190610885919061542f565b61088e90615553565b80516040519192505f9160088801916108a6916155cc565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf9190600401615392565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f916155cc565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d91906153a4565b90508086600801835f015160405161097591906155cc565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f761519a565b021790555060208201516001820190610a109082615621565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab59116856156f0565b8251604051919550610ac6916155cc565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b90615703565b9050610841565b50600483018190555f610b40610b3786611d0c565b60400151611e22565b90505f610b4c87611faf565b90505f600282604051610b5f91906155cc565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d91906153a4565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb82612189565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c61519a565b14610c4c578060405163170cc93360e21b81526004016104cf9190615384565b6106e583836121c4565b5f610c6664e8d4a5100083615725565b92915050565b6106e583838361243e565b610c7f612637565b5f80516020615d298339815191525f80610c988461266e565b91509150610ca582612189565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce061519a565b03610d05575f83815260078501602052604081208054919055610d0382826129ac565b505b610d1b81610d168460400151610fd9565b612a22565b505050505b610d3660015f80516020615d6983398151915255565b50565b5f610d42612637565b610d4e85858585612a58565b9050610d6660015f80516020615d6983398151915255565b949350505050565b5f8181525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d2983398151915293929190829060ff166003811115610dbb57610dbb61519a565b6003811115610dcc57610dcc61519a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e5961519a565b14610e7a578251604051633b0d540d60e21b81526104cf9190600401615744565b600481516005811115610e8f57610e8f61519a565b03610ea557610e9d85612c31565b505050505050565b5f80610ebc610eb389611d0c565b60400151612e18565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a5100061575e565b5f610ffc826117af565b6080015192915050565b61101183838361243e565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615d298339815191525f611049836117af565b51905060048160058111156110605761106061519a565b14611080578060405163170cc93360e21b81526004016104cf9190615384565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b0316826129ac565b611104612637565b5f8181525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d2983398151915293929190829060ff1660038111156111515761115161519a565b60038111156111625761116261519a565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db61519a565b146111fc578051604051633b0d540d60e21b81526104cf9190600401615744565b600461120b82604001516117af565b51600581111561121d5761121d61519a565b146112af575f61122c85611d0c565b90505f8061123d8360400151612e18565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612c31565b50506112d060015f80516020615d6983398151915255565b5050565b5f6112dd612637565b6112e883338461306e565b9050610c6660015f80516020615d6983398151915255565b5f80516020615d498339815191525f8061132561131c85611d0c565b60400151613346565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600684016020526040902080546113659061534c565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af61519a565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615384565b5f82815260068401602052604081206113fa91614f22565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d2983398151915293929190829060ff1660038111156114d6576114d661519a565b60038111156114e7576114e761519a565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c090910152909150815160038111156115605761156061519a565b14158015611581575060038151600381111561157e5761157e61519a565b14155b156115a2578051604051633b0d540d60e21b81526104cf9190600401615744565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611cbd565b6040518263ffffffff1660e01b815260040161162b9190615392565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b91906153a4565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615d4983398151915291906116b99061534c565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff1660058111156117035761170361519a565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615384565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f9190600401615775565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d891906153a4565b6117b7614f59565b5f8281525f80516020615d89833981519152602052604090819020815160e0810190925280545f80516020615d49833981519152929190829060ff1660058111156118045761180461519a565b60058111156118155761181561519a565b81526020016001820180546118299061534c565b80601f01602080910402602001604051908101604052809291908181526020018280546118559061534c565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b1781556119908484613502565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615d49833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a2090869086906157ff565b90815260200160405180910390205491505092915050565b5f8381525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d298339815191529284929091829060ff166003811115611a8657611a8661519a565b6003811115611a9757611a9761519a565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b2461519a565b14611b45578251604051633b0d540d60e21b81526104cf9190600401615744565b60208301516001600160a01b03163314611b5f57336110a1565b600281516005811115611b7457611b7461519a565b03611c51578615611b8b57611b8982876121c4565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611bc4918491611bbf919061580e565b61351c565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c0584613673565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611cb69350505050565b600481516005811115611c6657611c6661519a565b03611c9a57611c7483613673565b5f898152600686016020526040902055611c8d88612c31565b6001945050505050611cb6565b805160405163170cc93360e21b81526104cf9190600401615384565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611d70573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611d979190810190615839565b9150915080611db957604051636b2f19e960e01b815260040160405180910390fd5b815115611ddf578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611e1b576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611e5757815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611ea657611e6e81600161590b565b611e7990600861575e565b61ffff16848281518110611e8f57611e8f61541b565b016020015160f81c901b9190911790600101611e5a565b5061ffff811615611ed05760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611f2b57611ee781600361590b565b611ef290600861575e565b63ffffffff1685611f048360026156f0565b81518110611f1457611f1461541b565b016020015160f81c901b9190911790600101611ed3565b5063ffffffff811615611f5157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015611fa657611f6881601f61590b565b611f7390600861575e565b86611f7f8360066156f0565b81518110611f8f57611f8f61541b565b016020015160f81c901b9190911790600101611f54565b50949350505050565b60605f80833560208501356014611fcb878701604089016153bb565b611fd860608901896153d6565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61205e60608501856153d6565b9050811015611e1b578161207560608601866153d6565b838181106120855761208561541b565b9050602002810190612097919061542f565b6120a1908061591e565b90506120b060608701876153d6565b848181106120c0576120c061541b565b90506020028101906120d2919061542f565b6120dc908061591e565b6120e960608901896153d6565b868181106120f9576120f961541b565b905060200281019061210b919061542f565b61211990602081019061591e565b61212660608b018b6153d6565b888181106121365761213661541b565b9050602002810190612148919061542f565b612159906060810190604001615161565b60405160200161216f9796959493929190615960565b60408051601f198184030181529190529150600101612051565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561220f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122369190810190615839565b915091508061225857604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561229b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122bf91906153a4565b8251146122e5578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615612321576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f80612330846040015161381f565b915091508187146123575760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615d29833981519152906001600160401b039081169083161115612414575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a2612433565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615d298339815191528161245786613a10565b905061246286612189565b61247157600192505050611cb6565b5f8681526004830160205260409020546001600160a01b0316331461249657336110a1565b5f86815260048301602052604090205460a08201516124c591600160b01b90046001600160401b0316906159c9565b6001600160401b03168160c001516001600160401b0316101561250c5760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125245761251d87866121c4565b9050612542565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061256790610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156125dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061260191906153a4565b905080846007015f8a81526020019081526020015f205f82825461262591906156f0565b90915550501515979650505050505050565b5f80516020615d6983398151915280546001190161266857604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612677614f59565b5f80516020615d498339815191525f8061269361131c87611d0c565b9150915080156126ba57604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156126eb576126eb61519a565b60058111156126fc576126fc61519a565b81526020016001820180546127109061534c565b80601f016020809104026020016040519081016040528092919081815260200182805461273c9061534c565b80156127875780601f1061275e57610100808354040283529160200191612787565b820191905f5260205f20905b81548152906001019060200180831161276a57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156127f2576127f261519a565b1415801561281357506001815160058111156128105761281061519a565b14155b1561283457805160405163170cc93360e21b81526104cf9190600401615384565b6003815160058111156128495761284961519a565b03612857576004815261285c565b600581525b83600801816020015160405161287291906155cc565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff191660018360058111156128b6576128b661519a565b0217905550602082015160018201906128cf9082615621565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129755761297561519a565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615d0983398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a07575f80fd5b505af1158015612a19573d5f803e3d5ffd5b50505050505050565b5f80516020615d09833981519152546112d0906001600160a01b03168383613cf4565b60015f80516020615d6983398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615d2983398151915290600160401b900461ffff9081169086161080612aac575061271061ffff8616115b15612ad057604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b0c576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612b1e5750806001015483115b15612b3f5760405163222d164360e21b8152600481018490526024016104cf565b5f612b4984613d53565b90505f612b5582610c56565b90505f612b628983613d76565b90506040518060800160405280612b763390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615ce98339815191526020526040808220815160e0810190925280545f80516020615d2983398151915293929190829060ff166003811115612c7e57612c7e61519a565b6003811115612c8f57612c8f61519a565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612dbd575f84815260048701602052604090205461271090612d6f90600160a01b900461ffff168561575e565b612d799190615725565b915081866007015f8681526020019081526020015f205f828254612d9d91906156f0565b90915550612dad9050828461590b565b9050612dbd8560200151826129ac565b612dd28560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e4f57835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612e9e57612e6681600161590b565b612e7190600861575e565b61ffff16868281518110612e8757612e8761541b565b016020015160f81c901b9190911790600101612e52565b5061ffff811615612ec85760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612f2357612edf81600361590b565b612eea90600861575e565b63ffffffff1687612efc8360026156f0565b81518110612f0c57612f0c61541b565b016020015160f81c901b9190911790600101612ecb565b5063ffffffff8116600314612f4b57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612fa057612f6281601f61590b565b612f6d90600861575e565b88612f798360066156f0565b81518110612f8957612f8961541b565b016020015160f81c901b9190911790600101612f4e565b505f805b6008811015612fff57612fb881600761590b565b612fc390600861575e565b6001600160401b031689612fd88360266156f0565b81518110612fe857612fe861541b565b016020015160f81c901b9190911790600101612fa4565b505f805b600881101561305e5761301781600761590b565b61302290600861575e565b6001600160401b03168a61303783602e6156f0565b815181106130475761304761541b565b016020015160f81c901b9190911790600101613003565b5091989097509095509350505050565b5f5f80516020615d298339815191528161308a61028485613d53565b90505f613096876117af565b90506130a187612189565b6130c1576040516330efa98b60e01b8152600481018890526024016104cf565b6002815160058111156130d6576130d661519a565b146130f757805160405163170cc93360e21b81526104cf9190600401615384565b5f82826080015161310891906159c9565b905083600201600a9054906101000a90046001600160401b0316826040015161313191906159e9565b6001600160401b0316816001600160401b0316111561316e57604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f8061317a8a8461351c565b915091505f8a836040516020016131a892919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561323b5761323b61519a565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461337c57825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b60028110156133cb5761339381600161590b565b61339e90600861575e565b61ffff168582815181106133b4576133b461541b565b016020015160f81c901b919091179060010161337f565b5061ffff8116156133f55760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134505761340c81600361590b565b61341790600861575e565b63ffffffff16866134298360026156f0565b815181106134395761343961541b565b016020015160f81c901b91909117906001016133f8565b5063ffffffff811660021461347857604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156134cd5761348f81601f61590b565b61349a90600861575e565b876134a68360066156f0565b815181106134b6576134b661541b565b016020015160f81c901b919091179060010161347b565b505f866026815181106134e2576134e261541b565b016020015191976001600160f81b03199092161515965090945050505050565b61350a6142ee565b61351382614339565b6112d0816143a7565b5f8281525f80516020615d89833981519152602052604081206002015481905f80516020615d4983398151915290600160801b90046001600160401b0316613564858261440f565b5f61356e876145e9565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6135be8a858b611cbd565b6040518263ffffffff1660e01b81526004016135da9190615392565b6020604051808303815f875af11580156135f6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061361a91906153a4565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615d2983398151915290505f61369384604001516117af565b90505f6003825160058111156136ab576136ab61519a565b14806136c957506004825160058111156136c7576136c761519a565b145b156136d9575060c0810151613716565b6002825160058111156136ee576136ee61519a565b036136fa575042613716565b815160405163170cc93360e21b81526104cf9190600401615384565b84608001516001600160401b0316816001600160401b03161161373d57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b59061376290610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa1580156137f2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061381691906153a4565b95945050505050565b5f808251602e1461385557825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b60028110156138a45761386c81600161590b565b61387790600861575e565b61ffff1685828151811061388d5761388d61541b565b016020015160f81c901b9190911790600101613858565b5061ffff8116156138ce5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015613929576138e581600361590b565b6138f090600861575e565b63ffffffff16866139028360026156f0565b815181106139125761391261541b565b016020015160f81c901b91909117906001016138d1565b5063ffffffff81161561394f57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156139a45761396681601f61590b565b61397190600861575e565b8761397d8360066156f0565b8151811061398d5761398d61541b565b016020015160f81c901b9190911790600101613952565b505f805b6008811015613a03576139bc81600761590b565b6139c790600861575e565b6001600160401b0316886139dc8360266156f0565b815181106139ec576139ec61541b565b016020015160f81c901b91909117906001016139a8565b5090969095509350505050565b613a18614f59565b5f8281525f80516020615d898339815191526020526040808220815160e0810190925280545f80516020615d4983398151915293929190829060ff166005811115613a6557613a6561519a565b6005811115613a7657613a7661519a565b8152602001600182018054613a8a9061534c565b80601f0160208091040260200160405190810160405280929190818152602001828054613ab69061534c565b8015613b015780601f10613ad857610100808354040283529160200191613b01565b820191905f5260205f20905b815481529060010190602001808311613ae457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613b6f57613b6f61519a565b14613ba2575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff1690600401615384565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613be657613be661519a565b021790555060208201516001820190613bff9082615621565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613c9d858261351c565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b03838183161783525050505061465e565b5f610c66825f80516020615d09833981519152546001600160a01b0316906146bf565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613dba57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615d4983398151915242613dd96060860160408701615161565b6001600160401b0316111580613e135750613df76202a300426156f0565b613e076060860160408701615161565b6001600160401b031610155b15613e4d57613e286060850160408601615161565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613e62613e5d6060860186615a14565b614818565b613e72613e5d6080860186615a14565b6030613e81602086018661591e565b905014613eb357613e95602085018561591e565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613ebd848061591e565b90505f03613eea57613ecf848061591e565b604051633e08a12560e11b81526004016104cf929190615a28565b5f60088201613ef9868061591e565b604051613f079291906157ff565b90815260200160405180910390205414613f4057613f25848061591e565b60405163a41f772f60e01b81526004016104cf929190615a28565b613f4a835f61440f565b6040805160e08101909152815481525f9081906140569060208101613f6f898061591e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190613fb7908a018a61591e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161400060608a0160408b01615161565b6001600160401b0316815260200161401b60608a018a615a14565b61402490615a56565b815260200161403660808a018a615a14565b61403f90615a56565b8152602001876001600160401b0316815250614981565b5f828152600686016020526040902091935091506140748282615621565b508160088401614084888061591e565b6040516140929291906157ff565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906140ce908590600401615392565b6020604051808303815f875af11580156140ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061410e91906153a4565b6040805160e08101909152909150806001815260200161412e898061591e565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156141bd576141bd61519a565b0217905550602082015160018201906141d69082615621565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580614274888061591e565b6040516142829291906157ff565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906142c09190615161565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661433757604051631afcd79f60e31b815260040160405180910390fd5b565b6143416142ee565b61434a81614b6e565b614352614b87565b610d366060820135608083013561436f60c0850160a08601615161565b61437f60e0860160c08701615b1d565b614390610100870160e08801615b36565b6143a2610120880161010089016153bb565b614b97565b6143af6142ee565b5f80516020615d098339815191526001600160a01b0382166143ef57604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615d498339815191525f6001600160401b0380841690851611156144435761443c838561580e565b9050614450565b61444d848461580e565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806144b25750600184015481516144ae916001600160401b0316906156f0565b8210155b156144d8576001600160401b0383166060820152818152604081015160208201526144f7565b82816060018181516144ea91906159c9565b6001600160401b03169052505b60608101516145079060646159e9565b602082015160018601546001600160401b0392909216916145329190600160401b900460ff1661575e565b101561456257606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b03168160400181815161457d91906156f0565b9052506040810180516001600160401b038716919061459d90839061590b565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615d898339815191526020526040812060020180545f80516020615d49833981519152919060089061463390600160401b90046001600160401b0316615b56565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6146726001600160a01b03841683614cc6565b905080515f141580156146965750808060200190518101906146949190615b71565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015614705573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061472991906153a4565b90506147406001600160a01b038516333086614cd3565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa158015614784573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147a891906153a4565b905081811161480e5760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b613816828261590b565b6148256020820182615094565b63ffffffff16158015614845575061484060208201826153d6565b151590505b1561488c576148576020820182615094565b61486460208301836153d6565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b61489960208201826153d6565b90506148a86020830183615094565b63ffffffff1611156148c1576148576020820182615094565b60015b6148d160208301836153d6565b90508110156112d0576148e760208301836153d6565b6148f260018461590b565b8181106149015761490161541b565b905060200201602081019061491691906153bb565b6001600160a01b031661492c60208401846153d6565b8381811061493c5761493c61541b565b905060200201602081019061495191906153bb565b6001600160a01b0316101561497957604051630dbc8d5f60e31b815260040160405180910390fd5b6001016148c4565b5f60608260400151516030146149aa5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f986149eb988a986001989297929690959094909390929101615b8c565b60405160208183030381529060405290505f5b84608001516020015151811015614a5d57818560800151602001518281518110614a2a57614a2a61541b565b6020026020010151604051602001614a43929190615c46565b60408051601f1981840301815291905291506001016149fe565b5060a0840151805160209182015151604051614a7d938593929101615c7c565b60405160208183030381529060405290505f5b8460a001516020015151811015614aef57818560a00151602001518281518110614abc57614abc61541b565b6020026020010151604051602001614ad5929190615c46565b60408051601f198184030181529190529150600101614a90565b5060c0840151604051614b06918391602001615cb7565b6040516020818303038152906040529050600281604051614b2791906155cc565b602060405180830381855afa158015614b42573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614b6591906153a4565b94909350915050565b614b766142ee565b614b7e614d0c565b610d3681614d14565b614b8f6142ee565b614337614dfc565b614b9f6142ee565b5f80516020615d2983398151915261ffff84161580614bc3575061271061ffff8516115b15614be757604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614c0b5760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614c1e5750600a60ff8416115b15614c415760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611cb683835f614e04565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613d21565b6143376142ee565b614d1c6142ee565b80355f80516020615d498339815191529081556014614d416060840160408501615b36565b60ff161180614d605750614d5b6060830160408401615b36565b60ff16155b15614d9457614d756060830160408401615b36565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614da46060830160408401615b36565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614dd56040830160208401615161565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612a456142ee565b606081471015614e295760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614e4491906155cc565b5f6040518083038185875af1925050503d805f8114614e7e576040519150601f19603f3d011682016040523d82523d5f602084013e614e83565b606091505b5091509150614e93868383614e9d565b9695505050505050565b606082614eb257614ead82614ef9565b611cb6565b8151158015614ec957506001600160a01b0384163b155b15614ef257604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611cb6565b805115614f095780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614f2e9061534c565b5f825580601f10614f3d575050565b601f0160209004905f5260205f2090810190610d369190614f96565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614faa575f8155600101614f97565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114614fce575f80fd5b919050565b5f805f60608486031215614fe5575f80fd5b833592506020840135614ff781614fae565b915061500560408501614fbb565b90509250925092565b5f6020828403121561501e575f80fd5b5035919050565b5f8060408385031215615036575f80fd5b82356001600160401b0381111561504b575f80fd5b83016080818603121561505c575f80fd5b915061506a60208401614fbb565b90509250929050565b5f8060408385031215615084575f80fd5b8235915061506a60208401614fbb565b5f602082840312156150a4575f80fd5b611cb682614fbb565b803561ffff81168114614fce575f80fd5b80356001600160401b0381168114614fce575f80fd5b5f805f80608085870312156150e7575f80fd5b84356001600160401b038111156150fc575f80fd5b850160a0818803121561510d575f80fd5b935061511b602086016150ad565b9250615129604086016150be565b9396929550929360600135925050565b5f806040838503121561514a575f80fd5b61515383614fbb565b946020939093013593505050565b5f60208284031215615171575f80fd5b611cb6826150be565b5f806040838503121561518b575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b600681106151be576151be61519a565b9052565b5f5b838110156151dc5781810151838201526020016151c4565b50505f910152565b5f81518084526151fb8160208601602086016151c2565b601f01601f19169290920160200192915050565b602081526152216020820183516151ae565b5f602083015160e0604084015261523c6101008401826151e4565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f808284036101408112156152b6575f80fd5b610120808212156152c5575f80fd5b84935083013590506152d68161528f565b809150509250929050565b5f80602083850312156152f2575f80fd5b82356001600160401b0380821115615308575f80fd5b818501915085601f83011261531b575f80fd5b813581811115615329575f80fd5b86602082850101111561533a575f80fd5b60209290920196919550909350505050565b600181811c9082168061536057607f821691505b60208210810361537e57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c6682846151ae565b602081525f611cb660208301846151e4565b5f602082840312156153b4575f80fd5b5051919050565b5f602082840312156153cb575f80fd5b8135611cb68161528f565b5f808335601e198436030181126153eb575f80fd5b8301803591506001600160401b03821115615404575f80fd5b6020019150600581901b360382131561366c575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615443575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156154835761548361544d565b60405290565b604080519081016001600160401b03811182821017156154835761548361544d565b604051601f8201601f191681016001600160401b03811182821017156154d3576154d361544d565b604052919050565b5f6001600160401b038211156154f3576154f361544d565b50601f01601f191660200190565b5f82601f830112615510575f80fd5b813561552361551e826154db565b6154ab565b818152846020838601011115615537575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615563575f80fd5b61556b615461565b82356001600160401b0380821115615581575f80fd5b61558d36838701615501565b835260208501359150808211156155a2575f80fd5b506155af36828601615501565b6020830152506155c1604084016150be565b604082015292915050565b5f82516154438184602087016151c2565b601f8211156104d857805f5260205f20601f840160051c810160208510156156025750805b601f840160051c820191505b8181101561166b575f815560010161560e565b81516001600160401b0381111561563a5761563a61544d565b61564e81615648845461534c565b846155dd565b602080601f831160018114615681575f841561566a5750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b828110156156af57888601518255948401946001909101908401615690565b50858210156156cc57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c666156dc565b5f63ffffffff80831681810361571b5761571b6156dc565b6001019392505050565b5f8261573f57634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157585761575861519a565b91905290565b8082028115828204841417610c6657610c666156dc565b5f60208083525f84546157878161534c565b806020870152604060018084165f81146157a857600181146157c4576157f1565b60ff19851660408a0152604084151560051b8a010195506157f1565b895f5260205f205f5b858110156157e85781548b82018601529083019088016157cd565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611e1b57611e1b6156dc565b8051614fce81614fae565b5f806040838503121561584a575f80fd5b82516001600160401b0380821115615860575f80fd5b9084019060608287031215615873575f80fd5b61587b615461565b8251815260208084015161588e8161528f565b828201526040840151838111156158a3575f80fd5b80850194505087601f8501126158b7575f80fd5b835192506158c761551e846154db565b83815288828587010111156158da575f80fd5b6158e9848383018488016151c2565b806040840152508195506158fe81880161582e565b9450505050509250929050565b81810381811115610c6657610c666156dc565b5f808335601e19843603018112615933575f80fd5b8301803591506001600160401b0382111561594c575f80fd5b60200191503681900382131561366c575f80fd5b5f8851615971818460208d016151c2565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611e1b57611e1b6156dc565b6001600160401b03818116838216028082169190828114615a0c57615a0c6156dc565b505092915050565b5f8235603e19833603018112615443575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615a66575f80fd5b615a6e615489565b615a7783614fbb565b81526020808401356001600160401b0380821115615a93575f80fd5b9085019036601f830112615aa5575f80fd5b813581811115615ab757615ab761544d565b8060051b9150615ac88483016154ab565b8181529183018401918481019036841115615ae1575f80fd5b938501935b83851015615b0b5784359250615afb8361528f565b8282529385019390850190615ae6565b94860194909452509295945050505050565b5f60208284031215615b2d575f80fd5b611cb6826150ad565b5f60208284031215615b46575f80fd5b813560ff81168114611cb6575f80fd5b5f6001600160401b0380831681810361571b5761571b6156dc565b5f60208284031215615b81575f80fd5b8151611cb681614fae565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615bd281602a850160208b016151c2565b865190830190615be981602a840160208b016151c2565b60c087901b6001600160c01b031916602a9290910191820152615c1b603282018660e01b6001600160e01b0319169052565b615c34603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615c578184602088016151c2565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615c8d8184602089016151c2565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615cc88184602088016151c2565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615f8b380380615f8b83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615e3e8061014d5f395ff3fe608060405234801561000f575f80fd5b50600436106101f2575f3560e01c806376f7862111610114578063ba3a4b97116100a9578063d5f20ff611610079578063d5f20ff614610444578063df93d8de14610464578063e4a63c401461046e578063f09969ae14610482578063fd7ac5e714610495575f80fd5b8063ba3a4b9714610402578063bc5fbfec14610415578063bee0a03f14610429578063c974d1b61461043c575f80fd5b80639e1bc4ef116100e45780639e1bc4ef146103a2578063a3a65e48146103b5578063afb98096146103c8578063b771b3bc146103dc575f80fd5b806376f78621146103615780638280a25a1461037457806393e245981461037c57806398f3e2b41461038f575f80fd5b80633a1cfff61161018a57806360305d621161015a57806360305d6214610317578063620658561461033457806366435abf14610347578063732214f81461035a575f80fd5b80633a1cfff6146102bd578063467ef06f146102d05780634bee0040146102e35780635297fae614610304575f80fd5b806320d91b7a116101c557806320d91b7a1461025057806325e1c776146102635780632e2194d81461027657806335455ded146102a1575f80fd5b80630118acc4146101f65780630322ed981461020b578063151d30d11461021e5780631ec447241461023d575b5f80fd5b61020961020436600461505c565b6104a8565b005b610209610219366004615097565b6104dd565b610226600a81565b60405160ff90911681526020015b60405180910390f35b61020961024b36600461505c565b6106eb565b61020961025e3660046150ae565b6106f6565b6102096102713660046150fc565b610be2565b610289610284366004615097565b610c56565b6040516001600160401b039091168152602001610234565b6102aa61271081565b60405161ffff9091168152602001610234565b6102096102cb36600461505c565b610c6c565b6102096102de36600461511d565b610c77565b6102f66102f136600461515d565b610d39565b604051908152602001610234565b6102096103123660046151c2565b610d6e565b61031f601481565b60405163ffffffff9091168152602001610234565b6102f66103423660046151ea565b610fd9565b610289610355366004615097565b610ff2565b6102f65f81565b61020961036f36600461505c565b611006565b610226603081565b61020961038a366004615097565b611031565b61020961039d3660046151c2565b6110fc565b6102f66103b0366004615203565b6112d4565b6102096103c336600461511d565b611300565b6102f65f80516020615db283398151915281565b6103ea6005600160991b0181565b6040516001600160a01b039091168152602001610234565b610209610410366004615097565b611489565b6102f65f80516020615dd283398151915281565b610209610437366004615097565b611672565b610226601481565b610457610452366004615097565b6117af565b6040516102349190615298565b6102896202a30081565b6102f65f80516020615d9283398151915281565b61020961049036600461532c565b6118fe565b6102f66104a336600461536a565b6119dd565b6104b3838383611a38565b6104d857604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615e128339815191526020526040808220815160e0810190925280545f80516020615dd283398151915293929190829060ff16600581111561052a5761052a615223565b600581111561053b5761053b615223565b815260200160018201805461054f906153d5565b80601f016020809104026020016040519081016040528092919081815260200182805461057b906153d5565b80156105c65780601f1061059d576101008083540402835291602001916105c6565b820191905f5260205f20905b8154815290600101906020018083116105a957829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561063157610631615223565b14610664575f8381526007830160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b6005600160991b016001600160a01b031663ee5b48eb6106898584606001515f611d46565b6040518263ffffffff1660e01b81526004016106a5919061541b565b6020604051808303815f875af11580156106c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106e5919061542d565b50505050565b6106e5838383611a38565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615dd28339815191529060ff161561074857604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107af919061542d565b8360200135146107d8576040516372b0a7e760e11b8152602084013560048201526024016104cf565b306107e96060850160408601615444565b6001600160a01b03161461082c576108076060840160408501615444565b604051632f88120d60e21b81526001600160a01b0390911660048201526024016104cf565b5f61083a606085018561545f565b905090505f805b828163ffffffff161015610b22575f61085d606088018861545f565b8363ffffffff16818110610873576108736154a4565b905060200281019061088591906154b8565b61088e906155dc565b80516040519192505f9160088801916108a691615655565b908152602001604051809103902054146108d657805160405163a41f772f60e01b81526104cf919060040161541b565b5f6002885f01358460405160200161090592919091825260e01b6001600160e01b031916602082015260240190565b60408051601f198184030181529082905261091f91615655565b602060405180830381855afa15801561093a573d5f803e3d5ffd5b5050506040513d601f19601f8201168201806040525081019061095d919061542d565b90508086600801835f01516040516109759190615655565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff191660018360058111156109f7576109f7615223565b021790555060208201516001820190610a1090826156aa565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610ab5911685615779565b8251604051919550610ac691615655565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610b1b9061578c565b9050610841565b50600483018190555f610b40610b3786611d95565b60400151611eab565b90505f610b4c87612038565b90505f600282604051610b5f9190615655565b602060405180830381855afa158015610b7a573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610b9d919061542d565b9050828114610bc957604051631872fc8d60e01b815260048101829052602481018490526044016104cf565b5050506009909201805460ff1916600117905550505050565b610beb82612212565b610c0b576040516330efa98b60e01b8152600481018390526024016104cf565b5f610c15836117af565b5190506002816005811115610c2c57610c2c615223565b14610c4c578060405163170cc93360e21b81526004016104cf919061540d565b6106e5838361224d565b5f610c6664e8d4a51000836157ae565b92915050565b6106e58383836124c7565b610c7f6126c0565b5f80516020615db28339815191525f80610c98846126f7565b91509150610ca582612212565b610cb157505050610d20565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610ce057610ce0615223565b03610d05575f83815260078501602052604081208054919055610d038282612a35565b505b610d1b81610d168460400151610fd9565b612aab565b505050505b610d3660015f80516020615df283398151915255565b50565b5f610d426126c0565b610d4e85858585612ae1565b9050610d6660015f80516020615df283398151915255565b949350505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff166003811115610dbb57610dbb615223565b6003811115610dcc57610dcc615223565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f610e42826117af565b9050600183516003811115610e5957610e59615223565b14610e7a578251604051633b0d540d60e21b81526104cf91906004016157cd565b600481516005811115610e8f57610e8f615223565b03610ea557610e9d85612cba565b505050505050565b5f80610ebc610eb389611d95565b60400151612ea1565b5091509150818414610ee957846040015160405163089938b360e11b81526004016104cf91815260200190565b806001600160401b031683606001516001600160401b03161080610f225750806001600160401b03168560a001516001600160401b0316115b15610f4b57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610c666001600160401b03831664e8d4a510006157e7565b5f610ffc826117af565b6080015192915050565b6110118383836124c7565b6104d857604051635bff683f60e11b8152600481018490526024016104cf565b5f80516020615db28339815191525f611049836117af565b519050600481600581111561106057611060615223565b14611080578060405163170cc93360e21b81526004016104cf919061540d565b5f8381526004830160205260409020546001600160a01b031633146110c657335b604051636e2ccd7560e11b81526001600160a01b0390911660048201526024016104cf565b5f838152600783016020908152604080832080549084905560048601909252909120546106e5906001600160a01b031682612a35565b6111046126c0565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff16600381111561115157611151615223565b600381111561116257611162615223565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156111db576111db615223565b146111fc578051604051633b0d540d60e21b81526104cf91906004016157cd565b600461120b82604001516117af565b51600581111561121d5761121d615223565b146112af575f61122c85611d95565b90505f8061123d8360400151612ea1565b5091509150818460400151146112695760405163089938b360e11b8152600481018390526024016104cf565b806001600160401b03168460c001516001600160401b031611156112ab57604051632e19bc2d60e11b81526001600160401b03821660048201526024016104cf565b5050505b6112b883612cba565b50506112d060015f80516020615df283398151915255565b5050565b5f6112dd6126c0565b6112e88333846130f7565b9050610c6660015f80516020615df283398151915255565b5f80516020615dd28339815191525f8061132561131c85611d95565b604001516133cf565b915091508061134b57604051632d07135360e01b815281151560048201526024016104cf565b5f82815260068401602052604090208054611365906153d5565b90505f036113895760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078501602052604090205460ff1660058111156113af576113af615223565b146113e2575f8281526007840160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b5f82815260068401602052604081206113fa91614fab565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff1660038111156114d6576114d6615223565b60038111156114e7576114e7615223565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561156057611560615223565b14158015611581575060038151600381111561157e5761157e615223565b14155b156115a2578051604051633b0d540d60e21b81526104cf91906004016157cd565b5f6115b082604001516117af565b905080606001516001600160401b03165f036115e2576040516339b894f960e21b8152600481018590526024016104cf565b6005600160991b016001600160a01b031663ee5b48eb61160f846040015184606001518560800151611d46565b6040518263ffffffff1660e01b815260040161162b919061541b565b6020604051808303815f875af1158015611647573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166b919061542d565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615dd283398151915291906116b9906153d5565b90505f036116dd5760405163089938b360e11b8152600481018390526024016104cf565b60015f83815260078301602052604090205460ff16600581111561170357611703615223565b14611736575f8281526007820160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161176f91906004016157fe565b6020604051808303815f875af115801561178b573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d8919061542d565b6117b7614fe2565b5f8281525f80516020615e12833981519152602052604090819020815160e0810190925280545f80516020615dd2833981519152929190829060ff16600581111561180457611804615223565b600581111561181557611815615223565b8152602001600182018054611829906153d5565b80601f0160208091040260200160405190810160405280929190818152602001828054611855906153d5565b80156118a05780601f10611877576101008083540402835291602001916118a0565b820191905f5260205f20905b81548152906001019060200180831161188357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680611947575080546001600160401b03808416911610155b156119655760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155611990848461358b565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a150505050565b6040515f905f80516020615dd2833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611a209086908690615888565b90815260200160405180910390205491505092915050565b5f8381525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db28339815191529284929091829060ff166003811115611a8657611a86615223565b6003811115611a9757611a97615223565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611b0d826117af565b9050600283516003811115611b2457611b24615223565b14611b45578251604051633b0d540d60e21b81526104cf91906004016157cd565b60208301516001600160a01b03163314611be8575f828152600485016020526040902054336001600160a01b0390911603611be2575f82815260048501602052604090205460a0820151611ba991600160b01b90046001600160401b031690615897565b6001600160401b0316421015611bdd5760405163fb6ce63f60e01b81526001600160401b03421660048201526024016104cf565b611be8565b336110a1565b600281516005811115611bfd57611bfd615223565b03611cda578615611c1457611c12828761224d565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611c4d918491611c4891906158b7565b6135a5565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611c8e846136fc565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a315159450611d3f9350505050565b600481516005811115611cef57611cef615223565b03611d2357611cfd836136fc565b5f898152600686016020526040902055611d1688612cba565b6001945050505050611d3f565b805160405163170cc93360e21b81526104cf919060040161540d565b9392505050565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611df9573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611e2091908101906158e2565b9150915080611e4257604051636b2f19e960e01b815260040160405180910390fd5b815115611e68578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b031615611ea4576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5092915050565b5f8151602614611ee057815160405163cc92daa160e01b815263ffffffff9091166004820152602660248201526044016104cf565b5f805b6002811015611f2f57611ef78160016159b4565b611f029060086157e7565b61ffff16848281518110611f1857611f186154a4565b016020015160f81c901b9190911790600101611ee3565b5061ffff811615611f595760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015611fb457611f708160036159b4565b611f7b9060086157e7565b63ffffffff1685611f8d836002615779565b81518110611f9d57611f9d6154a4565b016020015160f81c901b9190911790600101611f5c565b5063ffffffff811615611fda57604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561202f57611ff181601f6159b4565b611ffc9060086157e7565b86612008836006615779565b81518110612018576120186154a4565b016020015160f81c901b9190911790600101611fdd565b50949350505050565b60605f8083356020850135601461205487870160408901615444565b612061606089018961545f565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6120e7606085018561545f565b9050811015611ea457816120fe606086018661545f565b8381811061210e5761210e6154a4565b905060200281019061212091906154b8565b61212a90806159c7565b9050612139606087018761545f565b84818110612149576121496154a4565b905060200281019061215b91906154b8565b61216590806159c7565b612172606089018961545f565b86818110612182576121826154a4565b905060200281019061219491906154b8565b6121a29060208101906159c7565b6121af60608b018b61545f565b888181106121bf576121bf6154a4565b90506020028101906121d191906154b8565b6121e29060608101906040016151ea565b6040516020016121f89796959493929190615a09565b60408051601f1981840301815291905291506001016120da565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612298573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526122bf91908101906158e2565b91509150806122e157604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612324573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612348919061542d565b82511461236e578151604051636ba589a560e01b815260048101919091526024016104cf565b60208201516001600160a01b0316156123aa576020820151604051624de75d60e31b81526001600160a01b0390911660048201526024016104cf565b5f806123b984604001516138a8565b915091508187146123e05760405163089938b360e11b8152600481018890526024016104cf565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615db2833981519152906001600160401b03908116908316111561249d575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26124bc565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615db2833981519152816124e086613a99565b90506124eb86612212565b6124fa57600192505050611d3f565b5f8681526004830160205260409020546001600160a01b0316331461251f57336110a1565b5f86815260048301602052604090205460a082015161254e91600160b01b90046001600160401b031690615897565b6001600160401b03168160c001516001600160401b031610156125955760c081015160405163fb6ce63f60e01b81526001600160401b0390911660048201526024016104cf565b5f85156125ad576125a6878661224d565b90506125cb565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906125f090610fd9565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa158015612666573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061268a919061542d565b905080846007015f8a81526020019081526020015f205f8282546126ae9190615779565b90915550501515979650505050505050565b5f80516020615df28339815191528054600119016126f157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f612700614fe2565b5f80516020615dd28339815191525f8061271c61131c87611d95565b91509150801561274357604051632d07135360e01b815281151560048201526024016104cf565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561277457612774615223565b600581111561278557612785615223565b8152602001600182018054612799906153d5565b80601f01602080910402602001604051908101604052809291908181526020018280546127c5906153d5565b80156128105780601f106127e757610100808354040283529160200191612810565b820191905f5260205f20905b8154815290600101906020018083116127f357829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561287b5761287b615223565b1415801561289c575060018151600581111561289957612899615223565b14155b156128bd57805160405163170cc93360e21b81526104cf919060040161540d565b6003815160058111156128d2576128d2615223565b036128e057600481526128e5565b600581525b8360080181602001516040516128fb9190615655565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff1916600183600581111561293f5761293f615223565b02179055506020820151600182019061295890826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055805160058111156129fe576129fe615223565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b5f5f80516020615d9283398151915280546040516340c10f1960e01b81526001600160a01b038681166004830152602482018690529293509116906340c10f19906044015f604051808303815f87803b158015612a90575f80fd5b505af1158015612aa2573d5f803e3d5ffd5b50505050505050565b5f80516020615d92833981519152546112d0906001600160a01b03168383613d7d565b60015f80516020615df283398151915255565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615db283398151915290600160401b900461ffff9081169086161080612b35575061271061ffff8616115b15612b5957604051635f12e6c360e11b815261ffff861660048201526024016104cf565b60028101546001600160401b039081169085161015612b95576040516202a06d60e11b81526001600160401b03851660048201526024016104cf565b8054831080612ba75750806001015483115b15612bc85760405163222d164360e21b8152600481018490526024016104cf565b5f612bd284613ddc565b90505f612bde82610c56565b90505f612beb8983613dff565b90506040518060800160405280612bff3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f8181525f80516020615d728339815191526020526040808220815160e0810190925280545f80516020615db283398151915293929190829060ff166003811115612d0757612d07615223565b6003811115612d1857612d18615223565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612e46575f84815260048701602052604090205461271090612df890600160a01b900461ffff16856157e7565b612e0291906157ae565b915081866007015f8681526020019081526020015f205f828254612e269190615779565b90915550612e36905082846159b4565b9050612e46856020015182612a35565b612e5b8560200151610d168760600151610fd9565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612ed857835160405163cc92daa160e01b815263ffffffff9091166004820152603660248201526044016104cf565b5f805b6002811015612f2757612eef8160016159b4565b612efa9060086157e7565b61ffff16868281518110612f1057612f106154a4565b016020015160f81c901b9190911790600101612edb565b5061ffff811615612f515760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b6004811015612fac57612f688160036159b4565b612f739060086157e7565b63ffffffff1687612f85836002615779565b81518110612f9557612f956154a4565b016020015160f81c901b9190911790600101612f54565b5063ffffffff8116600314612fd457604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561302957612feb81601f6159b4565b612ff69060086157e7565b88613002836006615779565b81518110613012576130126154a4565b016020015160f81c901b9190911790600101612fd7565b505f805b6008811015613088576130418160076159b4565b61304c9060086157e7565b6001600160401b031689613061836026615779565b81518110613071576130716154a4565b016020015160f81c901b919091179060010161302d565b505f805b60088110156130e7576130a08160076159b4565b6130ab9060086157e7565b6001600160401b03168a6130c083602e615779565b815181106130d0576130d06154a4565b016020015160f81c901b919091179060010161308c565b5091989097509095509350505050565b5f5f80516020615db28339815191528161311361028485613ddc565b90505f61311f876117af565b905061312a87612212565b61314a576040516330efa98b60e01b8152600481018890526024016104cf565b60028151600581111561315f5761315f615223565b1461318057805160405163170cc93360e21b81526104cf919060040161540d565b5f8282608001516131919190615897565b905083600201600a9054906101000a90046001600160401b031682604001516131ba9190615a72565b6001600160401b0316816001600160401b031611156131f757604051636d51fe0560e11b81526001600160401b03821660048201526024016104cf565b5f806132038a846135a5565b915091505f8a8360405160200161323192919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156132c4576132c4615223565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f80825160271461340557825160405163cc92daa160e01b815263ffffffff9091166004820152602760248201526044016104cf565b5f805b60028110156134545761341c8160016159b4565b6134279060086157e7565b61ffff1685828151811061343d5761343d6154a4565b016020015160f81c901b9190911790600101613408565b5061ffff81161561347e5760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156134d9576134958160036159b4565b6134a09060086157e7565b63ffffffff16866134b2836002615779565b815181106134c2576134c26154a4565b016020015160f81c901b9190911790600101613481565b5063ffffffff811660021461350157604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156135565761351881601f6159b4565b6135239060086157e7565b8761352f836006615779565b8151811061353f5761353f6154a4565b016020015160f81c901b9190911790600101613504565b505f8660268151811061356b5761356b6154a4565b016020015191976001600160f81b03199092161515965090945050505050565b613593614377565b61359c826143c2565b6112d081614430565b5f8281525f80516020615e12833981519152602052604081206002015481905f80516020615dd283398151915290600160801b90046001600160401b03166135ed8582614498565b5f6135f787614672565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136478a858b611d46565b6040518263ffffffff1660e01b8152600401613663919061541b565b6020604051808303815f875af115801561367f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136a3919061542d565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615db283398151915290505f61371c84604001516117af565b90505f60038251600581111561373457613734615223565b1480613752575060048251600581111561375057613750615223565b145b15613762575060c081015161379f565b60028251600581111561377757613777615223565b0361378357504261379f565b815160405163170cc93360e21b81526104cf919060040161540d565b84608001516001600160401b0316816001600160401b0316116137c657505f949350505050565b600383015460608601516001600160a01b039091169063778c06b5906137eb90610fd9565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa15801561387b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061389f919061542d565b95945050505050565b5f808251602e146138de57825160405163cc92daa160e01b815263ffffffff9091166004820152602e60248201526044016104cf565b5f805b600281101561392d576138f58160016159b4565b6139009060086157e7565b61ffff16858281518110613916576139166154a4565b016020015160f81c901b91909117906001016138e1565b5061ffff8116156139575760405163407b587360e01b815261ffff821660048201526024016104cf565b5f805b60048110156139b25761396e8160036159b4565b6139799060086157e7565b63ffffffff168661398b836002615779565b8151811061399b5761399b6154a4565b016020015160f81c901b919091179060010161395a565b5063ffffffff8116156139d857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613a2d576139ef81601f6159b4565b6139fa9060086157e7565b87613a06836006615779565b81518110613a1657613a166154a4565b016020015160f81c901b91909117906001016139db565b505f805b6008811015613a8c57613a458160076159b4565b613a509060086157e7565b6001600160401b031688613a65836026615779565b81518110613a7557613a756154a4565b016020015160f81c901b9190911790600101613a31565b5090969095509350505050565b613aa1614fe2565b5f8281525f80516020615e128339815191526020526040808220815160e0810190925280545f80516020615dd283398151915293929190829060ff166005811115613aee57613aee615223565b6005811115613aff57613aff615223565b8152602001600182018054613b13906153d5565b80601f0160208091040260200160405190810160405280929190818152602001828054613b3f906153d5565b8015613b8a5780601f10613b6157610100808354040283529160200191613b8a565b820191905f5260205f20905b815481529060010190602001808311613b6d57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613bf857613bf8615223565b14613c2b575f8481526007830160205260409081902054905163170cc93360e21b81526104cf9160ff169060040161540d565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613c6f57613c6f615223565b021790555060208201516001820190613c8890826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613d2685826135a5565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b6040516001600160a01b038381166024830152604482018390526104d891859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506146e7565b5f610c66825f80516020615d92833981519152546001600160a01b031690614748565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613e4357604051637fab81e560e01b815260040160405180910390fd5b5f80516020615dd283398151915242613e6260608601604087016151ea565b6001600160401b0316111580613e9c5750613e806202a30042615779565b613e9060608601604087016151ea565b6001600160401b031610155b15613ed657613eb160608501604086016151ea565b604051635879da1360e11b81526001600160401b0390911660048201526024016104cf565b613eeb613ee66060860186615a9d565b6148a1565b613efb613ee66080860186615a9d565b6030613f0a60208601866159c7565b905014613f3c57613f1e60208501856159c7565b6040516326475b2f60e11b81526104cf925060040190815260200190565b613f4684806159c7565b90505f03613f7357613f5884806159c7565b604051633e08a12560e11b81526004016104cf929190615ab1565b5f60088201613f8286806159c7565b604051613f90929190615888565b90815260200160405180910390205414613fc957613fae84806159c7565b60405163a41f772f60e01b81526004016104cf929190615ab1565b613fd3835f614498565b6040805160e08101909152815481525f9081906140df9060208101613ff889806159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614040908a018a6159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161408960608a0160408b016151ea565b6001600160401b031681526020016140a460608a018a615a9d565b6140ad90615adf565b81526020016140bf60808a018a615a9d565b6140c890615adf565b8152602001876001600160401b0316815250614a0a565b5f828152600686016020526040902091935091506140fd82826156aa565b50816008840161410d88806159c7565b60405161411b929190615888565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061415790859060040161541b565b6020604051808303815f875af1158015614173573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614197919061542d565b6040805160e0810190915290915080600181526020016141b789806159c7565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561424657614246615223565b02179055506020820151600182019061425f90826156aa565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806142fd88806159c7565b60405161430b929190615888565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b604001602081019061434991906151ea565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff166143c057604051631afcd79f60e31b815260040160405180910390fd5b565b6143ca614377565b6143d381614bf7565b6143db614c10565b610d36606082013560808301356143f860c0850160a086016151ea565b61440860e0860160c08701615ba6565b614419610100870160e08801615bbf565b61442b61012088016101008901615444565b614c20565b614438614377565b5f80516020615d928339815191526001600160a01b03821661447857604051637330680360e01b81526001600160a01b03831660048201526024016104cf565b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f80516020615dd28339815191525f6001600160401b0380841690851611156144cc576144c583856158b7565b90506144d9565b6144d684846158b7565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b031660608201524291158061453b575060018401548151614537916001600160401b031690615779565b8210155b15614561576001600160401b038316606082015281815260408101516020820152614580565b82816060018181516145739190615897565b6001600160401b03169052505b6060810151614590906064615a72565b602082015160018601546001600160401b0392909216916145bb9190600160401b900460ff166157e7565b10156145eb57606081015160405163dfae880160e01b81526001600160401b0390911660048201526024016104cf565b856001600160401b0316816040018181516146069190615779565b9052506040810180516001600160401b03871691906146269083906159b4565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615e128339815191526020526040812060020180545f80516020615dd283398151915291906008906146bc90600160401b90046001600160401b0316615bdf565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b5f6146fb6001600160a01b03841683614d4f565b905080515f1415801561471f57508080602001905181019061471d9190615bfa565b155b156104d857604051635274afe760e01b81526001600160a01b03841660048201526024016104cf565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa15801561478e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147b2919061542d565b90506147c96001600160a01b038516333086614d5c565b6040516370a0823160e01b81523060048201525f906001600160a01b038616906370a0823190602401602060405180830381865afa15801561480d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614831919061542d565b90508181116148975760405162461bcd60e51b815260206004820152602c60248201527f5361666545524332305472616e7366657246726f6d3a2062616c616e6365206e60448201526b1bdd081a5b98dc99585cd95960a21b60648201526084016104cf565b61389f82826159b4565b6148ae602082018261511d565b63ffffffff161580156148ce57506148c9602082018261545f565b151590505b15614915576148e0602082018261511d565b6148ed602083018361545f565b60405163c08a0f1d60e01b815263ffffffff90931660048401526024830152506044016104cf565b614922602082018261545f565b9050614931602083018361511d565b63ffffffff16111561494a576148e0602082018261511d565b60015b61495a602083018361545f565b90508110156112d057614970602083018361545f565b61497b6001846159b4565b81811061498a5761498a6154a4565b905060200201602081019061499f9190615444565b6001600160a01b03166149b5602084018461545f565b838181106149c5576149c56154a4565b90506020020160208101906149da9190615444565b6001600160a01b03161015614a0257604051630dbc8d5f60e31b815260040160405180910390fd5b60010161494d565b5f6060826040015151603014614a335760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a74988a986001989297929690959094909390929101615c15565b60405160208183030381529060405290505f5b84608001516020015151811015614ae657818560800151602001518281518110614ab357614ab36154a4565b6020026020010151604051602001614acc929190615ccf565b60408051601f198184030181529190529150600101614a87565b5060a0840151805160209182015151604051614b06938593929101615d05565b60405160208183030381529060405290505f5b8460a001516020015151811015614b7857818560a00151602001518281518110614b4557614b456154a4565b6020026020010151604051602001614b5e929190615ccf565b60408051601f198184030181529190529150600101614b19565b5060c0840151604051614b8f918391602001615d40565b6040516020818303038152906040529050600281604051614bb09190615655565b602060405180830381855afa158015614bcb573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bee919061542d565b94909350915050565b614bff614377565b614c07614d95565b610d3681614d9d565b614c18614377565b6143c0614e85565b614c28614377565b5f80516020615db283398151915261ffff84161580614c4c575061271061ffff8516115b15614c7057604051635f12e6c360e11b815261ffff851660048201526024016104cf565b85871115614c945760405163222d164360e21b8152600481018890526024016104cf565b60ff83161580614ca75750600a60ff8416115b15614cca5760405163170db35960e31b815260ff841660048201526024016104cf565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6060611d3f83835f614e8d565b6040516001600160a01b0384811660248301528381166044830152606482018390526106e59186918216906323b872dd90608401613daa565b6143c0614377565b614da5614377565b80355f80516020615dd28339815191529081556014614dca6060840160408501615bbf565b60ff161180614de95750614de46060830160408401615bbf565b60ff16155b15614e1d57614dfe6060830160408401615bbf565b604051634a59bbff60e11b815260ff90911660048201526024016104cf565b614e2d6060830160408401615bbf565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614e5e60408301602084016151ea565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612ace614377565b606081471015614eb25760405163cd78605960e01b81523060048201526024016104cf565b5f80856001600160a01b03168486604051614ecd9190615655565b5f6040518083038185875af1925050503d805f8114614f07576040519150601f19603f3d011682016040523d82523d5f602084013e614f0c565b606091505b5091509150614f1c868383614f26565b9695505050505050565b606082614f3b57614f3682614f82565b611d3f565b8151158015614f5257506001600160a01b0384163b155b15614f7b57604051639996b31560e01b81526001600160a01b03851660048201526024016104cf565b5080611d3f565b805115614f925780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b508054614fb7906153d5565b5f825580601f10614fc6575050565b601f0160209004905f5260205f2090810190610d36919061501f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115615033575f8155600101615020565b5090565b8015158114610d36575f80fd5b803563ffffffff81168114615057575f80fd5b919050565b5f805f6060848603121561506e575f80fd5b83359250602084013561508081615037565b915061508e60408501615044565b90509250925092565b5f602082840312156150a7575f80fd5b5035919050565b5f80604083850312156150bf575f80fd5b82356001600160401b038111156150d4575f80fd5b8301608081860312156150e5575f80fd5b91506150f360208401615044565b90509250929050565b5f806040838503121561510d575f80fd5b823591506150f360208401615044565b5f6020828403121561512d575f80fd5b611d3f82615044565b803561ffff81168114615057575f80fd5b80356001600160401b0381168114615057575f80fd5b5f805f8060808587031215615170575f80fd5b84356001600160401b03811115615185575f80fd5b850160a08188031215615196575f80fd5b93506151a460208601615136565b92506151b260408601615147565b9396929550929360600135925050565b5f80604083850312156151d3575f80fd5b6151dc83615044565b946020939093013593505050565b5f602082840312156151fa575f80fd5b611d3f82615147565b5f8060408385031215615214575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52602160045260245ffd5b6006811061524757615247615223565b9052565b5f5b8381101561526557818101518382015260200161524d565b50505f910152565b5f815180845261528481602086016020860161524b565b601f01601f19169290920160200192915050565b602081526152aa602082018351615237565b5f602083015160e060408401526152c561010084018261526d565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b6001600160a01b0381168114610d36575f80fd5b5f8082840361014081121561533f575f80fd5b6101208082121561534e575f80fd5b849350830135905061535f81615318565b809150509250929050565b5f806020838503121561537b575f80fd5b82356001600160401b0380821115615391575f80fd5b818501915085601f8301126153a4575f80fd5b8135818111156153b2575f80fd5b8660208285010111156153c3575f80fd5b60209290920196919550909350505050565b600181811c908216806153e957607f821691505b60208210810361540757634e487b7160e01b5f52602260045260245ffd5b50919050565b60208101610c668284615237565b602081525f611d3f602083018461526d565b5f6020828403121561543d575f80fd5b5051919050565b5f60208284031215615454575f80fd5b8135611d3f81615318565b5f808335601e19843603018112615474575f80fd5b8301803591506001600160401b0382111561548d575f80fd5b6020019150600581901b36038213156136f5575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e198336030181126154cc575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b038111828210171561550c5761550c6154d6565b60405290565b604080519081016001600160401b038111828210171561550c5761550c6154d6565b604051601f8201601f191681016001600160401b038111828210171561555c5761555c6154d6565b604052919050565b5f6001600160401b0382111561557c5761557c6154d6565b50601f01601f191660200190565b5f82601f830112615599575f80fd5b81356155ac6155a782615564565b615534565b8181528460208386010111156155c0575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156155ec575f80fd5b6155f46154ea565b82356001600160401b038082111561560a575f80fd5b6156163683870161558a565b8352602085013591508082111561562b575f80fd5b506156383682860161558a565b60208301525061564a60408401615147565b604082015292915050565b5f82516154cc81846020870161524b565b601f8211156104d857805f5260205f20601f840160051c8101602085101561568b5750805b601f840160051c820191505b8181101561166b575f8155600101615697565b81516001600160401b038111156156c3576156c36154d6565b6156d7816156d184546153d5565b84615666565b602080601f83116001811461570a575f84156156f35750858301515b5f19600386901b1c1916600185901b178555610e9d565b5f85815260208120601f198616915b8281101561573857888601518255948401946001909101908401615719565b508582101561575557878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610c6657610c66615765565b5f63ffffffff8083168181036157a4576157a4615765565b6001019392505050565b5f826157c857634e487b7160e01b5f52601260045260245ffd5b500490565b60208101600483106157e1576157e1615223565b91905290565b8082028115828204841417610c6657610c66615765565b5f60208083525f8454615810816153d5565b806020870152604060018084165f8114615831576001811461584d5761587a565b60ff19851660408a0152604084151560051b8a0101955061587a565b895f5260205f205f5b858110156158715781548b8201860152908301908801615856565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115611ea457611ea4615765565b6001600160401b03828116828216039080821115611ea457611ea4615765565b805161505781615037565b5f80604083850312156158f3575f80fd5b82516001600160401b0380821115615909575f80fd5b908401906060828703121561591c575f80fd5b6159246154ea565b8251815260208084015161593781615318565b8282015260408401518381111561594c575f80fd5b80850194505087601f850112615960575f80fd5b835192506159706155a784615564565b8381528882858701011115615983575f80fd5b6159928483830184880161524b565b806040840152508195506159a78188016158d7565b9450505050509250929050565b81810381811115610c6657610c66615765565b5f808335601e198436030181126159dc575f80fd5b8301803591506001600160401b038211156159f5575f80fd5b6020019150368190038213156136f5575f80fd5b5f8851615a1a818460208d0161524b565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216028082169190828114615a9557615a95615765565b505092915050565b5f8235603e198336030181126154cc575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f60408236031215615aef575f80fd5b615af7615512565b615b0083615044565b81526020808401356001600160401b0380821115615b1c575f80fd5b9085019036601f830112615b2e575f80fd5b813581811115615b4057615b406154d6565b8060051b9150615b51848301615534565b8181529183018401918481019036841115615b6a575f80fd5b938501935b83851015615b945784359250615b8483615318565b8282529385019390850190615b6f565b94860194909452509295945050505050565b5f60208284031215615bb6575f80fd5b611d3f82615136565b5f60208284031215615bcf575f80fd5b813560ff81168114611d3f575f80fd5b5f6001600160401b038083168181036157a4576157a4615765565b5f60208284031215615c0a575f80fd5b8151611d3f81615037565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b166026840152508651615c5b81602a850160208b0161524b565b865190830190615c7281602a840160208b0161524b565b60c087901b6001600160c01b031916602a9290910191820152615ca4603282018660e01b6001600160e01b0319169052565b615cbd603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615ce081846020880161524b565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615d1681846020890161524b565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615d5181846020880161524b565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d056e5bdfcce15e53c3406ea67bfce37dcd26f5152d5492824e43fd5e3c8ac5ab004317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 7abdb2216..9bff585a9 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: "0x608060405234801561000f575f80fd5b50604051615c0d380380615c0d83398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615ac08061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614d77565b61060a565b005b348015610216575f80fd5b50610209610225366004614db2565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614d77565b61084d565b34801561027f575f80fd5b5061020961028e366004614dc9565b610858565b34801561029e575f80fd5b506102096102ad366004614e17565b610d44565b3480156102bd575f80fd5b506102096102cc366004614e2e565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614db2565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614d77565b610eab565b34801561038c575f80fd5b5061020961039b366004614e4f565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614e68565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614ea6565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614db2565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614d77565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614db2565b61123b565b3480156104a4575f80fd5b506102096104b3366004614e68565b611306565b3480156104c3575f80fd5b506102096104d2366004614e4f565b6114de565b6104076104e5366004614ed0565b611667565b3480156104f5575f80fd5b506104075f80516020615a3483398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614db2565b61169b565b34801561054e575f80fd5b506104075f80516020615a5483398151915281565b34801561056e575f80fd5b5061020961057d366004614db2565b611884565b610407610590366004614db2565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614db2565b6119f2565b60405161024c9190614f99565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b50610407610605366004615019565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615a948339815191526020526040808220815160e0810190925280545f80516020615a5483398151915293929190829060ff16600581111561068c5761068c614f24565b600581111561069d5761069d614f24565b81526020016001820180546106b190615084565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd90615084565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614f24565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016150b6565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611e1a565b6040518263ffffffff1660e01b815260040161080791906150c4565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061084791906150d6565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615a548339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061091191906150d6565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b6060850160408601615101565b6001600160a01b03161461098e576109696060840160408501615101565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c606085018561511c565b905090505f805b828163ffffffff161015610c84575f6109bf606088018861511c565b8363ffffffff168181106109d5576109d5615161565b90506020028101906109e79190615175565b6109f090615299565b80516040519192505f916008880191610a0891615312565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b815261063191906004016150c4565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a8191615312565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf91906150d6565b90508086600801835f0151604051610ad79190615312565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614f24565b021790555060208201516001820190610b729082615367565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c17911685615436565b8251604051919550610c2891615312565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d90615449565b90506109a3565b50600483018190555f610ca2610c9986611e69565b60400151611f7f565b90505f610cae8761210c565b90505f600282604051610cc19190615312565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff91906150d6565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd5836122e6565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a826122f7565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614f24565b14610e8b578060405163170cc93360e21b815260040161063191906150b6565b6108478383612332565b5f610ea564e8d4a510008361546b565b92915050565b6108478383836125ac565b610ebe6127a5565b5f80516020615a348339815191525f80610ed7846127dc565b91509150610ee4826122f7565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614f24565b03610f44575f83815260078501602052604081208054919055610f428282612b1a565b505b610f5a81610f5584604001516111e3565b612b78565b505050505b610f7560015f80516020615a7483398151915255565b50565b5f8181525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a3483398151915293929190829060ff166003811115610fc557610fc5614f24565b6003811115610fd657610fd6614f24565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614f24565b14611084578251604051633b0d540d60e21b8152610631919060040161548a565b60048151600581111561109957611099614f24565b036110af576110a785612b9e565b505050505050565b5f806110c66110bd89611e69565b60400151612d85565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a510006154a4565b5f611206826119f2565b6080015192915050565b61121b8383836125ac565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615a348339815191525f611253836119f2565b519050600481600581111561126a5761126a614f24565b1461128a578060405163170cc93360e21b815260040161063191906150b6565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612b1a565b61130e6127a5565b5f8181525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a3483398151915293929190829060ff16600381111561135b5761135b614f24565b600381111561136c5761136c614f24565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614f24565b14611406578051604051633b0d540d60e21b8152610631919060040161548a565b600461141582604001516119f2565b51600581111561142757611427614f24565b146114b9575f61143685611e69565b90505f806114478360400151612d85565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612b9e565b50506114da60015f80516020615a7483398151915255565b5050565b5f80516020615a548339815191525f806115036114fa85611e69565b60400151612fdb565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f8281526006840160205260409020805461154390615084565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614f24565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff16906004016150b6565b5f82815260068401602052604081206115d891614ccb565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f6116706127a5565b61167c84848434613197565b905061169460015f80516020615a7483398151915255565b9392505050565b5f8181525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a3483398151915293929190829060ff1660038111156116e8576116e8614f24565b60038111156116f9576116f9614f24565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614f24565b14158015611793575060038151600381111561179057611790614f24565b14155b156117b4578051604051633b0d540d60e21b8152610631919060040161548a565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611e1a565b6040518263ffffffff1660e01b815260040161183d91906150c4565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d91906150d6565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615a5483398151915291906118cb90615084565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614f24565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff16906004016150b6565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb9161198191906004016154bb565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a91906150d6565b5f6119ca6127a5565b6119d5823334613365565b90506119ed60015f80516020615a7483398151915255565b919050565b6119fa614d02565b5f8281525f80516020615a94833981519152602052604090819020815160e0810190925280545f80516020615a54833981519152929190829060ff166005811115611a4757611a47614f24565b6005811115611a5857611a58614f24565b8152602001600182018054611a6c90615084565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9890615084565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615a54833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b849086908690615545565b90815260200160405180910390205491505092915050565b5f8381525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a348339815191529284929091829060ff166003811115611bea57611bea614f24565b6003811115611bfb57611bfb614f24565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614f24565b14611ca9578251604051633b0d540d60e21b8152610631919060040161548a565b60208301516001600160a01b03163314611cc357336112ab565b600281516005811115611cd857611cd8614f24565b03611db5578615611cef57611ced8287612332565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611d28918491611d239190615554565b61363a565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611d6984613791565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611dca57611dca614f24565b03611dfe57611dd883613791565b5f898152600686016020526040902055611df188612b9e565b6001945050505050611694565b805160405163170cc93360e21b815261063191906004016150b6565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611ecd573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611ef4919081019061557f565b9150915080611f1657604051636b2f19e960e01b815260040160405180910390fd5b815115611f3c578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615611f78576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f8151602614611fb457815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561200357611fcb816001615651565b611fd69060086154a4565b61ffff16848281518110611fec57611fec615161565b016020015160f81c901b9190911790600101611fb7565b5061ffff81161561202d5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561208857612044816003615651565b61204f9060086154a4565b63ffffffff1685612061836002615436565b8151811061207157612071615161565b016020015160f81c901b9190911790600101612030565b5063ffffffff8116156120ae57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612103576120c581601f615651565b6120d09060086154a4565b866120dc836006615436565b815181106120ec576120ec615161565b016020015160f81c901b91909117906001016120b1565b50949350505050565b60605f8083356020850135601461212887870160408901615101565b612135606089018961511c565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b6121bb606085018561511c565b9050811015611f7857816121d2606086018661511c565b838181106121e2576121e2615161565b90506020028101906121f49190615175565b6121fe9080615664565b905061220d606087018761511c565b8481811061221d5761221d615161565b905060200281019061222f9190615175565b6122399080615664565b612246606089018961511c565b8681811061225657612256615161565b90506020028101906122689190615175565b612276906020810190615664565b61228360608b018b61511c565b8881811061229357612293615161565b90506020028101906122a59190615175565b6122b6906060810190604001614ea6565b6040516020016122cc97969594939291906156a6565b60408051601f1981840301815291905291506001016121ae565b6122ee61393d565b610f7581613988565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa15801561237d573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526123a4919081019061557f565b91509150806123c657604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612409573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061242d91906150d6565b825114612453578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b03161561248f576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f8061249e84604001516139f6565b915091508187146124c55760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615a34833981519152906001600160401b039081169083161115612582575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a26125a1565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615a34833981519152816125c586613be7565b90506125d0866122f7565b6125df57600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461260457336112ab565b5f86815260048301602052604090205460a082015161263391600160b01b90046001600160401b03169061570f565b6001600160401b03168160c001516001600160401b0316101561267a5760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f85156126925761268b8786612332565b90506126b0565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b5906126d5906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa15801561274b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061276f91906150d6565b905080846007015f8a81526020019081526020015f205f8282546127939190615436565b90915550501515979650505050505050565b5f80516020615a748339815191528054600119016127d657604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f6127e5614d02565b5f80516020615a548339815191525f806128016114fa87611e69565b91509150801561282857604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff16600581111561285957612859614f24565b600581111561286a5761286a614f24565b815260200160018201805461287e90615084565b80601f01602080910402602001604051908101604052809291908181526020018280546128aa90615084565b80156128f55780601f106128cc576101008083540402835291602001916128f5565b820191905f5260205f20905b8154815290600101906020018083116128d857829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561296057612960614f24565b14158015612981575060018151600581111561297e5761297e614f24565b14155b156129a257805160405163170cc93360e21b815261063191906004016150b6565b6003815160058111156129b7576129b7614f24565b036129c557600481526129ca565b600581525b8360080181602001516040516129e09190615312565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612a2457612a24614f24565b021790555060208201516001820190612a3d9082615367565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612ae357612ae3614f24565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612b66575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613ecb565b60015f80516020615a7483398151915255565b5f8181525f80516020615a148339815191526020526040808220815160e0810190925280545f80516020615a3483398151915293929190829060ff166003811115612beb57612beb614f24565b6003811115612bfc57612bfc614f24565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612d2a575f84815260048701602052604090205461271090612cdc90600160a01b900461ffff16856154a4565b612ce6919061546b565b915081866007015f8681526020019081526020015f205f828254612d0a9190615436565b90915550612d1a90508284615651565b9050612d2a856020015182612b1a565b612d3f8560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612dbc57835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e0b57612dd3816001615651565b612dde9060086154a4565b61ffff16868281518110612df457612df4615161565b016020015160f81c901b9190911790600101612dbf565b5061ffff811615612e355760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612e9057612e4c816003615651565b612e579060086154a4565b63ffffffff1687612e69836002615436565b81518110612e7957612e79615161565b016020015160f81c901b9190911790600101612e38565b5063ffffffff8116600314612eb857604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f0d57612ecf81601f615651565b612eda9060086154a4565b88612ee6836006615436565b81518110612ef657612ef6615161565b016020015160f81c901b9190911790600101612ebb565b505f805b6008811015612f6c57612f25816007615651565b612f309060086154a4565b6001600160401b031689612f45836026615436565b81518110612f5557612f55615161565b016020015160f81c901b9190911790600101612f11565b505f805b6008811015612fcb57612f84816007615651565b612f8f9060086154a4565b6001600160401b03168a612fa483602e615436565b81518110612fb457612fb4615161565b016020015160f81c901b9190911790600101612f70565b5091989097509095509350505050565b5f80825160271461301157825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b600281101561306057613028816001615651565b6130339060086154a4565b61ffff1685828151811061304957613049615161565b016020015160f81c901b9190911790600101613014565b5061ffff81161561308a5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b60048110156130e5576130a1816003615651565b6130ac9060086154a4565b63ffffffff16866130be836002615436565b815181106130ce576130ce615161565b016020015160f81c901b919091179060010161308d565b5063ffffffff811660021461310d57604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131625761312481601f615651565b61312f9060086154a4565b8761313b836006615436565b8151811061314b5761314b615161565b016020015160f81c901b9190911790600101613110565b505f8660268151811061317757613177615161565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615a3483398151915290600160401b900461ffff90811690861610806131eb575061271061ffff8616115b1561320f57604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b03908116908516101561324b576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b805483108061325d5750806001015483115b1561327e5760405163222d164360e21b815260048101849052602401610631565b825f61328982610e95565b90505f6132968983613f5e565b905060405180608001604052806132aa3390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615a348339815191528161337e84610e95565b90505f61338a876119f2565b9050613395876122f7565b6133b5576040516330efa98b60e01b815260048101889052602401610631565b6002815160058111156133ca576133ca614f24565b146133eb57805160405163170cc93360e21b815261063191906004016150b6565b5f8282608001516133fc919061570f565b905083600201600a9054906101000a90046001600160401b03168260400151613425919061572f565b6001600160401b0316816001600160401b0316111561346257604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f8061346e8a8461363a565b915091505f8a8360405160200161349c92919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff1916600183600381111561352f5761352f614f24565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615a94833981519152602052604081206002015481905f80516020615a5483398151915290600160801b90046001600160401b031661368285826144d6565b5f61368c876146b0565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6136dc8a858b611e1a565b6040518263ffffffff1660e01b81526004016136f891906150c4565b6020604051808303815f875af1158015613714573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061373891906150d6565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615a3483398151915290505f6137b184604001516119f2565b90505f6003825160058111156137c9576137c9614f24565b14806137e757506004825160058111156137e5576137e5614f24565b145b156137f7575060c0810151613834565b60028251600581111561380c5761380c614f24565b03613818575042613834565b815160405163170cc93360e21b815261063191906004016150b6565b84608001516001600160401b0316816001600160401b03161161385b57505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613880906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613910573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061393491906150d6565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661398657604051631afcd79f60e31b815260040160405180910390fd5b565b61399061393d565b61399981614725565b6139a161473e565b610f75606082013560808301356139be60c0850160a08601614ea6565b6139ce60e0860160c0870161575a565b6139df610100870160e08801615773565b6139f161012088016101008901615101565b61474e565b5f808251602e14613a2c57825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613a7b57613a43816001615651565b613a4e9060086154a4565b61ffff16858281518110613a6457613a64615161565b016020015160f81c901b9190911790600101613a2f565b5061ffff811615613aa55760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b0057613abc816003615651565b613ac79060086154a4565b63ffffffff1686613ad9836002615436565b81518110613ae957613ae9615161565b016020015160f81c901b9190911790600101613aa8565b5063ffffffff811615613b2657604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613b7b57613b3d81601f615651565b613b489060086154a4565b87613b54836006615436565b81518110613b6457613b64615161565b016020015160f81c901b9190911790600101613b29565b505f805b6008811015613bda57613b93816007615651565b613b9e9060086154a4565b6001600160401b031688613bb3836026615436565b81518110613bc357613bc3615161565b016020015160f81c901b9190911790600101613b7f565b5090969095509350505050565b613bef614d02565b5f8281525f80516020615a948339815191526020526040808220815160e0810190925280545f80516020615a5483398151915293929190829060ff166005811115613c3c57613c3c614f24565b6005811115613c4d57613c4d614f24565b8152602001600182018054613c6190615084565b80601f0160208091040260200160405190810160405280929190818152602001828054613c8d90615084565b8015613cd85780601f10613caf57610100808354040283529160200191613cd8565b820191905f5260205f20905b815481529060010190602001808311613cbb57829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613d4657613d46614f24565b14613d79575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff16906004016150b6565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613dbd57613dbd614f24565b021790555060208201516001820190613dd69082615367565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613e74858261363a565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613eee5760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613f37576040519150601f19603f3d011682016040523d82523d5f602084013e613f3c565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff16613fa257604051637fab81e560e01b815260040160405180910390fd5b5f80516020615a5483398151915242613fc16060860160408701614ea6565b6001600160401b0316111580613ffb5750613fdf6202a30042615436565b613fef6060860160408701614ea6565b6001600160401b031610155b15614035576140106060850160408601614ea6565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b61404a6140456060860186615793565b61487d565b61405a6140456080860186615793565b60306140696020860186615664565b90501461409b5761407d6020850185615664565b6040516326475b2f60e11b8152610631925060040190815260200190565b6140a58480615664565b90505f036140d2576140b78480615664565b604051633e08a12560e11b81526004016106319291906157a7565b5f600882016140e18680615664565b6040516140ef929190615545565b908152602001604051809103902054146141285761410d8480615664565b60405163a41f772f60e01b81526004016106319291906157a7565b614132835f6144d6565b6040805160e08101909152815481525f90819061423e90602081016141578980615664565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060209081019061419f908a018a615664565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152505050908252506020016141e860608a0160408b01614ea6565b6001600160401b0316815260200161420360608a018a615793565b61420c906157d5565b815260200161421e60808a018a615793565b614227906157d5565b8152602001876001600160401b03168152506149e6565b5f8281526006860160205260409020919350915061425c8282615367565b50816008840161426c8880615664565b60405161427a929190615545565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb906142b69085906004016150c4565b6020604051808303815f875af11580156142d2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142f691906150d6565b6040805160e0810190915290915080600181526020016143168980615664565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff191660018360058111156143a5576143a5614f24565b0217905550602082015160018201906143be9082615367565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790558061445c8880615664565b60405161446a929190615545565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906144a89190614ea6565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615a548339815191525f6001600160401b03808416908516111561450a576145038385615554565b9050614517565b6145148484615554565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b0316606082015242911580614579575060018401548151614575916001600160401b031690615436565b8210155b1561459f576001600160401b0383166060820152818152604081015160208201526145be565b82816060018181516145b1919061570f565b6001600160401b03169052505b60608101516145ce90606461572f565b602082015160018601546001600160401b0392909216916145f99190600160401b900460ff166154a4565b101561462957606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b0316816040018181516146449190615436565b9052506040810180516001600160401b0387169190614664908390615651565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615a948339815191526020526040812060020180545f80516020615a5483398151915291906008906146fa90600160401b90046001600160401b031661589c565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b61472d61393d565b614735614bd3565b610f7581614bdb565b61474661393d565b613986614cc3565b61475661393d565b5f80516020615a3483398151915261ffff8416158061477a575061271061ffff8516115b1561479e57604051635f12e6c360e11b815261ffff85166004820152602401610631565b858711156147c25760405163222d164360e21b815260048101889052602401610631565b60ff831615806147d55750600a60ff8416115b156147f85760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b61488a6020820182614e4f565b63ffffffff161580156148aa57506148a5602082018261511c565b151590505b156148f1576148bc6020820182614e4f565b6148c9602083018361511c565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b6148fe602082018261511c565b905061490d6020830183614e4f565b63ffffffff161115614926576148bc6020820182614e4f565b60015b614936602083018361511c565b90508110156114da5761494c602083018361511c565b614957600184615651565b81811061496657614966615161565b905060200201602081019061497b9190615101565b6001600160a01b0316614991602084018461511c565b838181106149a1576149a1615161565b90506020020160208101906149b69190615101565b6001600160a01b031610156149de57604051630dbc8d5f60e31b815260040160405180910390fd5b600101614929565b5f6060826040015151603014614a0f5760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614a50988a9860019892979296909590949093909291016158b7565b60405160208183030381529060405290505f5b84608001516020015151811015614ac257818560800151602001518281518110614a8f57614a8f615161565b6020026020010151604051602001614aa8929190615971565b60408051601f198184030181529190529150600101614a63565b5060a0840151805160209182015151604051614ae29385939291016159a7565b60405160208183030381529060405290505f5b8460a001516020015151811015614b5457818560a00151602001518281518110614b2157614b21615161565b6020026020010151604051602001614b3a929190615971565b60408051601f198184030181529190529150600101614af5565b5060c0840151604051614b6b9183916020016159e2565b6040516020818303038152906040529050600281604051614b8c9190615312565b602060405180830381855afa158015614ba7573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614bca91906150d6565b94909350915050565b61398661393d565b614be361393d565b80355f80516020615a548339815191529081556014614c086060840160408501615773565b60ff161180614c275750614c226060830160408401615773565b60ff16155b15614c5b57614c3c6060830160408401615773565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614c6b6060830160408401615773565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614c9c6040830160208401614ea6565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612b8b61393d565b508054614cd790615084565b5f825580601f10614ce6575050565b601f0160209004905f5260205f2090810190610f759190614d3f565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614d53575f8155600101614d40565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614d89575f80fd5b833592506020840135614d9b81614d57565b9150614da960408501614d64565b90509250925092565b5f60208284031215614dc2575f80fd5b5035919050565b5f8060408385031215614dda575f80fd5b82356001600160401b03811115614def575f80fd5b830160808186031215614e00575f80fd5b9150614e0e60208401614d64565b90509250929050565b5f6101208284031215614e28575f80fd5b50919050565b5f8060408385031215614e3f575f80fd5b82359150614e0e60208401614d64565b5f60208284031215614e5f575f80fd5b61169482614d64565b5f8060408385031215614e79575f80fd5b614e8283614d64565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614eb6575f80fd5b61169482614e90565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614ee2575f80fd5b83356001600160401b03811115614ef7575f80fd5b840160a08187031215614f08575f80fd5b9250614f1660208501614ebf565b9150614da960408501614e90565b634e487b7160e01b5f52602160045260245ffd5b60068110614f4857614f48614f24565b9052565b5f5b83811015614f66578181015183820152602001614f4e565b50505f910152565b5f8151808452614f85816020860160208601614f4c565b601f01601f19169290920160200192915050565b60208152614fab602082018351614f38565b5f602083015160e06040840152614fc6610100840182614f6e565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f806020838503121561502a575f80fd5b82356001600160401b0380821115615040575f80fd5b818501915085601f830112615053575f80fd5b813581811115615061575f80fd5b866020828501011115615072575f80fd5b60209290920196919550909350505050565b600181811c9082168061509857607f821691505b602082108103614e2857634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614f38565b602081525f6116946020830184614f6e565b5f602082840312156150e6575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f60208284031215615111575f80fd5b8135611694816150ed565b5f808335601e19843603018112615131575f80fd5b8301803591506001600160401b0382111561514a575f80fd5b6020019150600581901b360382131561378a575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615189575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156151c9576151c9615193565b60405290565b604080519081016001600160401b03811182821017156151c9576151c9615193565b604051601f8201601f191681016001600160401b038111828210171561521957615219615193565b604052919050565b5f6001600160401b0382111561523957615239615193565b50601f01601f191660200190565b5f82601f830112615256575f80fd5b813561526961526482615221565b6151f1565b81815284602083860101111561527d575f80fd5b816020850160208301375f918101602001919091529392505050565b5f606082360312156152a9575f80fd5b6152b16151a7565b82356001600160401b03808211156152c7575f80fd5b6152d336838701615247565b835260208501359150808211156152e8575f80fd5b506152f536828601615247565b60208301525061530760408401614e90565b604082015292915050565b5f8251615189818460208701614f4c565b601f82111561063a57805f5260205f20601f840160051c810160208510156153485750805b601f840160051c820191505b8181101561187d575f8155600101615354565b81516001600160401b0381111561538057615380615193565b6153948161538e8454615084565b84615323565b602080601f8311600181146153c7575f84156153b05750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b828110156153f5578886015182559484019460019091019084016153d6565b508582101561541257878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea5615422565b5f63ffffffff80831681810361546157615461615422565b6001019392505050565b5f8261548557634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061549e5761549e614f24565b91905290565b8082028115828204841417610ea557610ea5615422565b5f60208083525f84546154cd81615084565b806020870152604060018084165f81146154ee576001811461550a57615537565b60ff19851660408a0152604084151560051b8a01019550615537565b895f5260205f205f5b8581101561552e5781548b8201860152908301908801615513565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03828116828216039080821115611f7857611f78615422565b80516119ed81614d57565b5f8060408385031215615590575f80fd5b82516001600160401b03808211156155a6575f80fd5b90840190606082870312156155b9575f80fd5b6155c16151a7565b825181526020808401516155d4816150ed565b828201526040840151838111156155e9575f80fd5b80850194505087601f8501126155fd575f80fd5b8351925061560d61526484615221565b8381528882858701011115615620575f80fd5b61562f84838301848801614f4c565b80604084015250819550615644818801615574565b9450505050509250929050565b81810381811115610ea557610ea5615422565b5f808335601e19843603018112615679575f80fd5b8301803591506001600160401b03821115615692575f80fd5b60200191503681900382131561378a575f80fd5b5f88516156b7818460208d01614f4c565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b03818116838216019080821115611f7857611f78615422565b6001600160401b0381811683821602808216919082811461575257615752615422565b505092915050565b5f6020828403121561576a575f80fd5b61169482614ebf565b5f60208284031215615783575f80fd5b813560ff81168114611694575f80fd5b5f8235603e19833603018112615189575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f604082360312156157e5575f80fd5b6157ed6151cf565b6157f683614d64565b81526020808401356001600160401b0380821115615812575f80fd5b9085019036601f830112615824575f80fd5b81358181111561583657615836615193565b8060051b91506158478483016151f1565b8181529183018401918481019036841115615860575f80fd5b938501935b8385101561588a578435925061587a836150ed565b8282529385019390850190615865565b94860194909452509295945050505050565b5f6001600160401b0380831681810361546157615461615422565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b1660268401525086516158fd81602a850160208b01614f4c565b86519083019061591481602a840160208b01614f4c565b60c087901b6001600160c01b031916602a9290910191820152615946603282018660e01b6001600160e01b0319169052565b61595f603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615982818460208801614f4c565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f84516159b8818460208901614f4c565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f83516159f3818460208801614f4c565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", + Bin: "0x608060405234801561000f575f80fd5b50604051615c96380380615c9683398101604081905261002e91610107565b60018160018111156100425761004261012c565b0361004f5761004f610055565b50610140565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100a55760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146101045780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b5f60208284031215610117575f80fd5b815160028110610125575f80fd5b9392505050565b634e487b7160e01b5f52602160045260245ffd5b615b498061014d5f395ff3fe6080604052600436106101e6575f3560e01c8063732214f811610108578063b771b3bc1161009d578063c599e24f1161006d578063c599e24f14610582578063c974d1b614610595578063d5f20ff6146105a9578063df93d8de146105d5578063fd7ac5e7146105eb575f80fd5b8063b771b3bc1461050a578063ba3a4b9714610524578063bc5fbfec14610543578063bee0a03f14610563575f80fd5b806398f3e2b4116100d857806398f3e2b414610499578063a3a65e48146104b8578063af2f5feb146104d7578063afb98096146104ea575f80fd5b8063732214f81461043457806376f78621146104475780638280a25a1461046657806393e245981461047a575f80fd5b8063329c3e121161017e5780635297fae61161014e5780635297fae6146103a057806360305d62146103bf57806362065856146103e857806366435abf14610415575f80fd5b8063329c3e121461030857806335455ded1461033a5780633a1cfff614610362578063467ef06f14610381575f80fd5b806320d91b7a116101b957806320d91b7a1461027457806320e555651461029357806325e1c776146102b25780632e2194d8146102d1575f80fd5b80630118acc4146101ea5780630322ed981461020b578063151d30d11461022a5780631ec4472414610255575b5f80fd5b3480156101f5575f80fd5b50610209610204366004614e00565b61060a565b005b348015610216575f80fd5b50610209610225366004614e3b565b61063f565b348015610235575f80fd5b5061023e600a81565b60405160ff90911681526020015b60405180910390f35b348015610260575f80fd5b5061020961026f366004614e00565b61084d565b34801561027f575f80fd5b5061020961028e366004614e52565b610858565b34801561029e575f80fd5b506102096102ad366004614ea0565b610d44565b3480156102bd575f80fd5b506102096102cc366004614eb7565b610e21565b3480156102dc575f80fd5b506102f06102eb366004614e3b565b610e95565b6040516001600160401b03909116815260200161024c565b348015610313575f80fd5b506103226001600160991b0181565b6040516001600160a01b03909116815260200161024c565b348015610345575f80fd5b5061034f61271081565b60405161ffff909116815260200161024c565b34801561036d575f80fd5b5061020961037c366004614e00565b610eab565b34801561038c575f80fd5b5061020961039b366004614ed8565b610eb6565b3480156103ab575f80fd5b506102096103ba366004614ef1565b610f78565b3480156103ca575f80fd5b506103d3601481565b60405163ffffffff909116815260200161024c565b3480156103f3575f80fd5b50610407610402366004614f2f565b6111e3565b60405190815260200161024c565b348015610420575f80fd5b506102f061042f366004614e3b565b6111fc565b34801561043f575f80fd5b506104075f81565b348015610452575f80fd5b50610209610461366004614e00565b611210565b348015610471575f80fd5b5061023e603081565b348015610485575f80fd5b50610209610494366004614e3b565b61123b565b3480156104a4575f80fd5b506102096104b3366004614ef1565b611306565b3480156104c3575f80fd5b506102096104d2366004614ed8565b6114de565b6104076104e5366004614f59565b611667565b3480156104f5575f80fd5b506104075f80516020615abd83398151915281565b348015610515575f80fd5b506103226005600160991b0181565b34801561052f575f80fd5b5061020961053e366004614e3b565b61169b565b34801561054e575f80fd5b506104075f80516020615add83398151915281565b34801561056e575f80fd5b5061020961057d366004614e3b565b611884565b610407610590366004614e3b565b6119c1565b3480156105a0575f80fd5b5061023e601481565b3480156105b4575f80fd5b506105c86105c3366004614e3b565b6119f2565b60405161024c9190615022565b3480156105e0575f80fd5b506102f06202a30081565b3480156105f6575f80fd5b506104076106053660046150a2565b611b41565b610615838383611b9c565b61063a57604051631036cf9160e11b8152600481018490526024015b60405180910390fd5b505050565b5f8181525f80516020615b1d8339815191526020526040808220815160e0810190925280545f80516020615add83398151915293929190829060ff16600581111561068c5761068c614fad565b600581111561069d5761069d614fad565b81526020016001820180546106b19061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546106dd9061510d565b80156107285780601f106106ff57610100808354040283529160200191610728565b820191905f5260205f20905b81548152906001019060200180831161070b57829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a0909101529091508151600581111561079357610793614fad565b146107c6575f8381526007830160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b6005600160991b016001600160a01b031663ee5b48eb6107eb8584606001515f611ea3565b6040518263ffffffff1660e01b8152600401610807919061514d565b6020604051808303815f875af1158015610823573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610847919061515f565b50505050565b610847838383611b9c565b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f80516020615add8339815191529060ff16156108aa57604051637fab81e560e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610911919061515f565b83602001351461093a576040516372b0a7e760e11b815260208401356004820152602401610631565b3061094b606085016040860161518a565b6001600160a01b03161461098e57610969606084016040850161518a565b604051632f88120d60e21b81526001600160a01b039091166004820152602401610631565b5f61099c60608501856151a5565b905090505f805b828163ffffffff161015610c84575f6109bf60608801886151a5565b8363ffffffff168181106109d5576109d56151ea565b90506020028101906109e791906151fe565b6109f090615322565b80516040519192505f916008880191610a089161539b565b90815260200160405180910390205414610a3857805160405163a41f772f60e01b8152610631919060040161514d565b5f6002885f013584604051602001610a6792919091825260e01b6001600160e01b031916602082015260240190565b60408051601f1981840301815290829052610a819161539b565b602060405180830381855afa158015610a9c573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610abf919061515f565b90508086600801835f0151604051610ad7919061539b565b90815260408051602092819003830181209390935560e0830181526002835284518284015284810180516001600160401b03908116858401525f60608601819052915181166080860152421660a085015260c0840181905284815260078a01909252902081518154829060ff19166001836005811115610b5957610b59614fad565b021790555060208201516001820190610b7290826153f0565b506040828101516002830180546060860151608087015160a08801516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909301516003909201805467ffffffffffffffff191692841692909217909155830151610c179116856154bf565b8251604051919550610c289161539b565b60408051918290038220908401516001600160401b031682529082907f9d47fef9da077661546e646d61830bfcbda90506c2e5eed38195e82c4eb1cbdf9060200160405180910390a3505080610c7d906154d2565b90506109a3565b50600483018190555f610ca2610c9986611ef2565b60400151612008565b90505f610cae87612195565b90505f600282604051610cc1919061539b565b602060405180830381855afa158015610cdc573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190610cff919061515f565b9050828114610d2b57604051631872fc8d60e01b81526004810182905260248101849052604401610631565b5050506009909201805460ff1916600117905550505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805460029190600160401b900460ff1680610d8d575080546001600160401b03808416911610155b15610dab5760405163f92ee8a960e01b815260040160405180910390fd5b805468ffffffffffffffffff19166001600160401b03831617600160401b178155610dd58361236f565b805460ff60401b191681556040516001600160401b03831681527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a1505050565b610e2a82612380565b610e4a576040516330efa98b60e01b815260048101839052602401610631565b5f610e54836119f2565b5190506002816005811115610e6b57610e6b614fad565b14610e8b578060405163170cc93360e21b8152600401610631919061513f565b61084783836123bb565b5f610ea564e8d4a51000836154f4565b92915050565b610847838383612635565b610ebe61282e565b5f80516020615abd8339815191525f80610ed784612865565b91509150610ee482612380565b610ef057505050610f5f565b5f82815260048085016020526040909120546001600160a01b03169082516005811115610f1f57610f1f614fad565b03610f44575f83815260078501602052604081208054919055610f428282612ba3565b505b610f5a81610f5584604001516111e3565b612c01565b505050505b610f7560015f80516020615afd83398151915255565b50565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff166003811115610fc557610fc5614fad565b6003811115610fd657610fd6614fad565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f61104c826119f2565b905060018351600381111561106357611063614fad565b14611084578251604051633b0d540d60e21b81526106319190600401615513565b60048151600581111561109957611099614fad565b036110af576110a785612c27565b505050505050565b5f806110c66110bd89611ef2565b60400151612e0e565b50915091508184146110f357846040015160405163089938b360e11b815260040161063191815260200190565b806001600160401b031683606001516001600160401b0316108061112c5750806001600160401b03168560a001516001600160401b0316115b1561115557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5f878152600587016020908152604091829020805460ff1916600290811782550180546001600160401b034216600160401b81026fffffffffffffffff000000000000000019909216919091179091559151918252859189917f047059b465069b8b751836b41f9f1d83daff583d2238cc7fbb461437ec23a4f6910160405180910390a35050505050505050565b5f610ea56001600160401b03831664e8d4a5100061552d565b5f611206826119f2565b6080015192915050565b61121b838383612635565b61063a57604051635bff683f60e11b815260048101849052602401610631565b5f80516020615abd8339815191525f611253836119f2565b519050600481600581111561126a5761126a614fad565b1461128a578060405163170cc93360e21b8152600401610631919061513f565b5f8381526004830160205260409020546001600160a01b031633146112d057335b604051636e2ccd7560e11b81526001600160a01b039091166004820152602401610631565b5f83815260078301602090815260408083208054908490556004860190925290912054610847906001600160a01b031682612ba3565b61130e61282e565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff16600381111561135b5761135b614fad565b600381111561136c5761136c614fad565b8152815461010090046001600160a01b03166020820152600182015460408201526002909101546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c09091015290506003815160038111156113e5576113e5614fad565b14611406578051604051633b0d540d60e21b81526106319190600401615513565b600461141582604001516119f2565b51600581111561142757611427614fad565b146114b9575f61143685611ef2565b90505f806114478360400151612e0e565b5091509150818460400151146114735760405163089938b360e11b815260048101839052602401610631565b806001600160401b03168460c001516001600160401b031611156114b557604051632e19bc2d60e11b81526001600160401b0382166004820152602401610631565b5050505b6114c283612c27565b50506114da60015f80516020615afd83398151915255565b5050565b5f80516020615add8339815191525f806115036114fa85611ef2565b60400151613064565b915091508061152957604051632d07135360e01b81528115156004820152602401610631565b5f828152600684016020526040902080546115439061510d565b90505f036115675760405163089938b360e11b815260048101839052602401610631565b60015f83815260078501602052604090205460ff16600581111561158d5761158d614fad565b146115c0575f8281526007840160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b5f82815260068401602052604081206115d891614d54565b5f828152600784016020908152604091829020805460ff1916600290811782550180546001600160401b0342818116600160c01b026001600160c01b0390931692909217928390558451600160801b9093041682529181019190915283917ff8fd1c90fb9cfa2ca2358fdf5806b086ad43315d92b221c929efc7f105ce7568910160405180910390a250505050565b5f61167061282e565b61167c84848434613220565b905061169460015f80516020615afd83398151915255565b9392505050565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff1660038111156116e8576116e8614fad565b60038111156116f9576116f9614fad565b8152815461010090046001600160a01b0316602082015260018083015460408301526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101529091508151600381111561177257611772614fad565b14158015611793575060038151600381111561179057611790614fad565b14155b156117b4578051604051633b0d540d60e21b81526106319190600401615513565b5f6117c282604001516119f2565b905080606001516001600160401b03165f036117f4576040516339b894f960e21b815260048101859052602401610631565b6005600160991b016001600160a01b031663ee5b48eb611821846040015184606001518560800151611ea3565b6040518263ffffffff1660e01b815260040161183d919061514d565b6020604051808303815f875af1158015611859573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187d919061515f565b5050505050565b5f8181527fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb066020526040902080545f80516020615add83398151915291906118cb9061510d565b90505f036118ef5760405163089938b360e11b815260048101839052602401610631565b60015f83815260078301602052604090205460ff16600581111561191557611915614fad565b14611948575f8281526007820160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b5f82815260068201602052604090819020905163ee5b48eb60e01b81526005600160991b019163ee5b48eb916119819190600401615544565b6020604051808303815f875af115801561199d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063a919061515f565b5f6119ca61282e565b6119d58233346133ee565b90506119ed60015f80516020615afd83398151915255565b919050565b6119fa614d8b565b5f8281525f80516020615b1d833981519152602052604090819020815160e0810190925280545f80516020615add833981519152929190829060ff166005811115611a4757611a47614fad565b6005811115611a5857611a58614fad565b8152602001600182018054611a6c9061510d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a989061510d565b8015611ae35780601f10611aba57610100808354040283529160200191611ae3565b820191905f5260205f20905b815481529060010190602001808311611ac657829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b9091048116608083015260039092015490911660a0909101529392505050565b6040515f905f80516020615add833981519152907fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb0890611b8490869086906155ce565b90815260200160405180910390205491505092915050565b5f8381525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd8339815191529284929091829060ff166003811115611bea57611bea614fad565b6003811115611bfb57611bfb614fad565b8152815461010090046001600160a01b0316602082015260018201546040808301919091526002909201546001600160401b038082166060840152600160401b820481166080840152600160801b8204811660a0840152600160c01b9091041660c0909101528101519091505f611c71826119f2565b9050600283516003811115611c8857611c88614fad565b14611ca9578251604051633b0d540d60e21b81526106319190600401615513565b60208301516001600160a01b03163314611d4c575f828152600485016020526040902054336001600160a01b0390911603611d46575f82815260048501602052604090205460a0820151611d0d91600160b01b90046001600160401b0316906155dd565b6001600160401b0316421015611d415760405163fb6ce63f60e01b81526001600160401b0342166004820152602401610631565b611d4c565b336112ab565b600281516005811115611d6157611d61614fad565b03611e3e578615611d7857611d7682876123bb565b505b5f8881526005850160205260409020805460ff1916600317905560608301516080820151611db1918491611dac91906155fd565b6136c3565b505f898152600586016020526040812060020180546001600160401b03909316600160c01b026001600160c01b0390931692909217909155611df28461381a565b5f8a81526006870160205260408082208390555191925084918b917f366d336c0ab380dc799f095a6f82a26326585c52909cc698b09ba4540709ed5791a3151594506116949350505050565b600481516005811115611e5357611e53614fad565b03611e8757611e618361381a565b5f898152600686016020526040902055611e7a88612c27565b6001945050505050611694565b805160405163170cc93360e21b8152610631919060040161513f565b604080515f6020820152600360e01b602282015260268101949094526001600160c01b031960c093841b811660468601529190921b16604e830152805180830360360181526056909201905290565b60408051606080820183525f8083526020830152918101919091526040516306f8253560e41b815263ffffffff831660048201525f9081906005600160991b0190636f825350906024015f60405180830381865afa158015611f56573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611f7d9190810190615628565b9150915080611f9f57604051636b2f19e960e01b815260040160405180910390fd5b815115611fc5578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612001576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5092915050565b5f815160261461203d57815160405163cc92daa160e01b815263ffffffff909116600482015260266024820152604401610631565b5f805b600281101561208c576120548160016156fa565b61205f90600861552d565b61ffff16848281518110612075576120756151ea565b016020015160f81c901b9190911790600101612040565b5061ffff8116156120b65760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612111576120cd8160036156fa565b6120d890600861552d565b63ffffffff16856120ea8360026154bf565b815181106120fa576120fa6151ea565b016020015160f81c901b91909117906001016120b9565b5063ffffffff81161561213757604051635b60892f60e01b815260040160405180910390fd5b5f805b602081101561218c5761214e81601f6156fa565b61215990600861552d565b866121658360066154bf565b81518110612175576121756151ea565b016020015160f81c901b919091179060010161213a565b50949350505050565b60605f808335602085013560146121b18787016040890161518a565b6121be60608901896151a5565b60405160f09790971b6001600160f01b0319166020880152602287019590955250604285019290925260e090811b6001600160e01b0319908116606286015260609290921b6bffffffffffffffffffffffff191660668501529190911b16607a820152607e0160405160208183030381529060405290505f5b61224460608501856151a5565b9050811015612001578161225b60608601866151a5565b8381811061226b5761226b6151ea565b905060200281019061227d91906151fe565b612287908061570d565b905061229660608701876151a5565b848181106122a6576122a66151ea565b90506020028101906122b891906151fe565b6122c2908061570d565b6122cf60608901896151a5565b868181106122df576122df6151ea565b90506020028101906122f191906151fe565b6122ff90602081019061570d565b61230c60608b018b6151a5565b8881811061231c5761231c6151ea565b905060200281019061232e91906151fe565b61233f906060810190604001614f2f565b604051602001612355979695949392919061574f565b60408051601f198184030181529190529150600101612237565b6123776139c6565b610f7581613a11565b5f9081527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020546001600160a01b0316151590565b6040516306f8253560e41b815263ffffffff821660048201525f90819081906005600160991b0190636f825350906024015f60405180830381865afa158015612406573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261242d9190810190615628565b915091508061244f57604051636b2f19e960e01b815260040160405180910390fd5b6005600160991b016001600160a01b0316634213cf786040518163ffffffff1660e01b8152600401602060405180830381865afa158015612492573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906124b6919061515f565b8251146124dc578151604051636ba589a560e01b81526004810191909152602401610631565b60208201516001600160a01b031615612518576020820151604051624de75d60e31b81526001600160a01b039091166004820152602401610631565b5f806125278460400151613a7f565b9150915081871461254e5760405163089938b360e11b815260048101889052602401610631565b5f8781527f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d0460205260409020600101545f80516020615abd833981519152906001600160401b03908116908316111561260b575f888152600482016020908152604091829020600101805467ffffffffffffffff19166001600160401b038616908117909155915191825289917fec44148e8ff271f2d0bacef1142154abacb0abb3a29eb3eb50e2ca97e86d0435910160405180910390a261262a565b5f8881526004820160205260409020600101546001600160401b031691505b509695505050505050565b5f5f80516020615abd8339815191528161264e86613c70565b905061265986612380565b61266857600192505050611694565b5f8681526004830160205260409020546001600160a01b0316331461268d57336112ab565b5f86815260048301602052604090205460a08201516126bc91600160b01b90046001600160401b0316906155dd565b6001600160401b03168160c001516001600160401b031610156127035760c081015160405163fb6ce63f60e01b81526001600160401b039091166004820152602401610631565b5f851561271b5761271487866123bb565b9050612739565b505f8681526004830160205260409020600101546001600160401b03165b600383015460408301515f916001600160a01b03169063778c06b59061275e906111e3565b60a086015160c087015160405160e085901b6001600160e01b031916815260048101939093526001600160401b0391821660248401819052604484015281166064830152851660848201525f60a4820181905260c482015260e401602060405180830381865afa1580156127d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127f8919061515f565b905080846007015f8a81526020019081526020015f205f82825461281c91906154bf565b90915550501515979650505050505050565b5f80516020615afd83398151915280546001190161285f57604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b5f61286e614d8b565b5f80516020615add8339815191525f8061288a6114fa87611ef2565b9150915080156128b157604051632d07135360e01b81528115156004820152602401610631565b5f828152600784016020526040808220815160e081019092528054829060ff1660058111156128e2576128e2614fad565b60058111156128f3576128f3614fad565b81526020016001820180546129079061510d565b80601f01602080910402602001604051908101604052809291908181526020018280546129339061510d565b801561297e5780601f106129555761010080835404028352916020019161297e565b820191905f5260205f20905b81548152906001019060200180831161296157829003601f168201915b505050918352505060028201546001600160401b038082166020840152600160401b820481166040840152600160801b820481166060840152600160c01b909104811660808301526003928301541660a090910152909150815160058111156129e9576129e9614fad565b14158015612a0a5750600181516005811115612a0757612a07614fad565b14155b15612a2b57805160405163170cc93360e21b8152610631919060040161513f565b600381516005811115612a4057612a40614fad565b03612a4e5760048152612a53565b600581525b836008018160200151604051612a69919061539b565b90815260408051602092819003830190205f908190558581526007870190925290208151815483929190829060ff19166001836005811115612aad57612aad614fad565b021790555060208201516001820190612ac690826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff19169190921617905580516005811115612b6c57612b6c614fad565b60405184907f1c08e59656f1a18dc2da76826cdc52805c43e897a17c50faefb8ab3c1526cc16905f90a39196919550909350505050565b6040516327ad555d60e11b81526001600160a01b0383166004820152602481018290526001600160991b0190634f5aaaba906044015f604051808303815f87803b158015612bef575f80fd5b505af11580156110a7573d5f803e3d5ffd5b6114da6001600160a01b03831682613f54565b60015f80516020615afd83398151915255565b5f8181525f80516020615a9d8339815191526020526040808220815160e0810190925280545f80516020615abd83398151915293929190829060ff166003811115612c7457612c74614fad565b6003811115612c8557612c85614fad565b8152815461010090046001600160a01b03166020808301919091526001808401546040808501919091526002948501546001600160401b038082166060870152600160401b820481166080870152600160801b8204811660a0870152600160c01b9091041660c090940193909352848301515f89815260058901845284812080546001600160a81b03191681559283018190559190940181905560068701909152908120805490829055929350909190808215612db3575f84815260048701602052604090205461271090612d6590600160a01b900461ffff168561552d565b612d6f91906154f4565b915081866007015f8681526020019081526020015f205f828254612d9391906154bf565b90915550612da3905082846156fa565b9050612db3856020015182612ba3565b612dc88560200151610f5587606001516111e3565b6040805182815260208101849052859189917f8ececf510070c320d9a55323ffabe350e294ae505fc0c509dc5736da6f5cc993910160405180910390a350505050505050565b5f805f8351603614612e4557835160405163cc92daa160e01b815263ffffffff909116600482015260366024820152604401610631565b5f805b6002811015612e9457612e5c8160016156fa565b612e6790600861552d565b61ffff16868281518110612e7d57612e7d6151ea565b016020015160f81c901b9190911790600101612e48565b5061ffff811615612ebe5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015612f1957612ed58160036156fa565b612ee090600861552d565b63ffffffff1687612ef28360026154bf565b81518110612f0257612f026151ea565b016020015160f81c901b9190911790600101612ec1565b5063ffffffff8116600314612f4157604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015612f9657612f5881601f6156fa565b612f6390600861552d565b88612f6f8360066154bf565b81518110612f7f57612f7f6151ea565b016020015160f81c901b9190911790600101612f44565b505f805b6008811015612ff557612fae8160076156fa565b612fb990600861552d565b6001600160401b031689612fce8360266154bf565b81518110612fde57612fde6151ea565b016020015160f81c901b9190911790600101612f9a565b505f805b60088110156130545761300d8160076156fa565b61301890600861552d565b6001600160401b03168a61302d83602e6154bf565b8151811061303d5761303d6151ea565b016020015160f81c901b9190911790600101612ff9565b5091989097509095509350505050565b5f80825160271461309a57825160405163cc92daa160e01b815263ffffffff909116600482015260276024820152604401610631565b5f805b60028110156130e9576130b18160016156fa565b6130bc90600861552d565b61ffff168582815181106130d2576130d26151ea565b016020015160f81c901b919091179060010161309d565b5061ffff8116156131135760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b600481101561316e5761312a8160036156fa565b61313590600861552d565b63ffffffff16866131478360026154bf565b81518110613157576131576151ea565b016020015160f81c901b9190911790600101613116565b5063ffffffff811660021461319657604051635b60892f60e01b815260040160405180910390fd5b5f805b60208110156131eb576131ad81601f6156fa565b6131b890600861552d565b876131c48360066154bf565b815181106131d4576131d46151ea565b016020015160f81c901b9190911790600101613199565b505f86602681518110613200576132006151ea565b016020015191976001600160f81b03199092161515965090945050505050565b7f4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d02545f905f80516020615abd83398151915290600160401b900461ffff9081169086161080613274575061271061ffff8616115b1561329857604051635f12e6c360e11b815261ffff86166004820152602401610631565b60028101546001600160401b0390811690851610156132d4576040516202a06d60e11b81526001600160401b0385166004820152602401610631565b80548310806132e65750806001015483115b156133075760405163222d164360e21b815260048101849052602401610631565b825f61331282610e95565b90505f61331f8983613fe7565b905060405180608001604052806133333390565b6001600160a01b03908116825261ffff808c166020808501919091526001600160401b03808d166040808701919091525f60609687018190528881526004909b018352998a902086518154938801519b8801518316600160b01b0267ffffffffffffffff60b01b199c909516600160a01b026001600160b01b03199094169516949094179190911798909816178155910151600190910180549190951667ffffffffffffffff19909116179093555090915050949350505050565b5f5f80516020615abd8339815191528161340784610e95565b90505f613413876119f2565b905061341e87612380565b61343e576040516330efa98b60e01b815260048101889052602401610631565b60028151600581111561345357613453614fad565b1461347457805160405163170cc93360e21b8152610631919060040161513f565b5f82826080015161348591906155dd565b905083600201600a9054906101000a90046001600160401b031682604001516134ae91906157b8565b6001600160401b0316816001600160401b031611156134eb57604051636d51fe0560e11b81526001600160401b0382166004820152602401610631565b5f806134f78a846136c3565b915091505f8a8360405160200161352592919091825260c01b6001600160c01b031916602082015260280190565b60408051601f19818403018152828252805160209091012060e08301909152915080600181526001600160a01b038c1660208083019190915260408083018f90526001600160401b03808b1660608501525f6080850181905290881660a085015260c090930183905284835260058b01909152902081518154829060ff191660018360038111156135b8576135b8614fad565b02179055506020828101518254610100600160a81b0319166101006001600160a01b039283160217835560408085015160018501556060808601516002909501805460808089015160a08a015160c0909a01516001600160401b03998a166001600160801b031990941693909317600160401b918a1691909102176001600160801b0316600160801b998916999099026001600160c01b031698909817600160c01b91881691909102179055815189861681528a861694810194909452938b1690830152918101859052908c16918d9184917fb0024b263bc3a0b728a6edea50a69efa841189f8d32ee8af9d1c2b1a1a223426910160405180910390a49a9950505050505050505050565b5f8281525f80516020615b1d833981519152602052604081206002015481905f80516020615add83398151915290600160801b90046001600160401b031661370b858261455f565b5f61371587614739565b5f8881526007850160205260408120600201805467ffffffffffffffff60801b1916600160801b6001600160401b038b16021790559091506005600160991b0163ee5b48eb6137658a858b611ea3565b6040518263ffffffff1660e01b8152600401613781919061514d565b6020604051808303815f875af115801561379d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137c1919061515f565b604080516001600160401b038a811682526020820184905282519394508516928b927f07de5ff35a674a8005e661f3333c907ca6333462808762d19dc7b3abb1a8c1df928290030190a3909450925050505b9250929050565b5f805f80516020615abd83398151915290505f61383a84604001516119f2565b90505f60038251600581111561385257613852614fad565b1480613870575060048251600581111561386e5761386e614fad565b145b15613880575060c08101516138bd565b60028251600581111561389557613895614fad565b036138a15750426138bd565b815160405163170cc93360e21b8152610631919060040161513f565b84608001516001600160401b0316816001600160401b0316116138e457505f949350505050565b600383015460608601516001600160a01b039091169063778c06b590613909906111e3565b60a085015160808901516040808b01515f90815260048a810160205282822060010154925160e088901b6001600160e01b0319168152908101959095526001600160401b0393841660248601529183166044850152828716606485015291909116608483015260a4820181905260c482015260e401602060405180830381865afa158015613999573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139bd919061515f565b95945050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16613a0f57604051631afcd79f60e31b815260040160405180910390fd5b565b613a196139c6565b613a22816147ae565b613a2a6147c7565b610f7560608201356080830135613a4760c0850160a08601614f2f565b613a5760e0860160c087016157e3565b613a68610100870160e088016157fc565b613a7a6101208801610100890161518a565b6147d7565b5f808251602e14613ab557825160405163cc92daa160e01b815263ffffffff9091166004820152602e6024820152604401610631565b5f805b6002811015613b0457613acc8160016156fa565b613ad790600861552d565b61ffff16858281518110613aed57613aed6151ea565b016020015160f81c901b9190911790600101613ab8565b5061ffff811615613b2e5760405163407b587360e01b815261ffff82166004820152602401610631565b5f805b6004811015613b8957613b458160036156fa565b613b5090600861552d565b63ffffffff1686613b628360026154bf565b81518110613b7257613b726151ea565b016020015160f81c901b9190911790600101613b31565b5063ffffffff811615613baf57604051635b60892f60e01b815260040160405180910390fd5b5f805b6020811015613c0457613bc681601f6156fa565b613bd190600861552d565b87613bdd8360066154bf565b81518110613bed57613bed6151ea565b016020015160f81c901b9190911790600101613bb2565b505f805b6008811015613c6357613c1c8160076156fa565b613c2790600861552d565b6001600160401b031688613c3c8360266154bf565b81518110613c4c57613c4c6151ea565b016020015160f81c901b9190911790600101613c08565b5090969095509350505050565b613c78614d8b565b5f8281525f80516020615b1d8339815191526020526040808220815160e0810190925280545f80516020615add83398151915293929190829060ff166005811115613cc557613cc5614fad565b6005811115613cd657613cd6614fad565b8152602001600182018054613cea9061510d565b80601f0160208091040260200160405190810160405280929190818152602001828054613d169061510d565b8015613d615780601f10613d3857610100808354040283529160200191613d61565b820191905f5260205f20905b815481529060010190602001808311613d4457829003601f168201915b50505091835250506002828101546001600160401b038082166020850152600160401b820481166040850152600160801b820481166060850152600160c01b9091048116608084015260039093015490921660a09091015290915081516005811115613dcf57613dcf614fad565b14613e02575f8481526007830160205260409081902054905163170cc93360e21b81526106319160ff169060040161513f565b60038152426001600160401b031660c08201525f84815260078301602052604090208151815483929190829060ff19166001836005811115613e4657613e46614fad565b021790555060208201516001820190613e5f90826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff1916919092161790555f613efd85826136c3565b6080840151604080516001600160401b03909216825242602083015291935083925087917f13d58394cf269d48bcf927959a29a5ffee7c9924dafff8927ecdf3c48ffa7c67910160405180910390a3509392505050565b80471015613f775760405163cd78605960e01b8152306004820152602401610631565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613fc0576040519150601f19603f3d011682016040523d82523d5f602084013e613fc5565b606091505b505090508061063a57604051630a12f52160e11b815260040160405180910390fd5b7fe92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb09545f9060ff1661402b57604051637fab81e560e01b815260040160405180910390fd5b5f80516020615add8339815191524261404a6060860160408701614f2f565b6001600160401b031611158061408457506140686202a300426154bf565b6140786060860160408701614f2f565b6001600160401b031610155b156140be576140996060850160408601614f2f565b604051635879da1360e11b81526001600160401b039091166004820152602401610631565b6140d36140ce606086018661581c565b614906565b6140e36140ce608086018661581c565b60306140f2602086018661570d565b90501461412457614106602085018561570d565b6040516326475b2f60e11b8152610631925060040190815260200190565b61412e848061570d565b90505f0361415b57614140848061570d565b604051633e08a12560e11b8152600401610631929190615830565b5f6008820161416a868061570d565b6040516141789291906155ce565b908152602001604051809103902054146141b157614196848061570d565b60405163a41f772f60e01b8152600401610631929190615830565b6141bb835f61455f565b6040805160e08101909152815481525f9081906142c790602081016141e0898061570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250505090825250602090810190614228908a018a61570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525050509082525060200161427160608a0160408b01614f2f565b6001600160401b0316815260200161428c60608a018a61581c565b6142959061585e565b81526020016142a760808a018a61581c565b6142b09061585e565b8152602001876001600160401b0316815250614a6f565b5f828152600686016020526040902091935091506142e582826153f0565b5081600884016142f5888061570d565b6040516143039291906155ce565b9081526040519081900360200181209190915563ee5b48eb60e01b81525f906005600160991b019063ee5b48eb9061433f90859060040161514d565b6020604051808303815f875af115801561435b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061437f919061515f565b6040805160e08101909152909150806001815260200161439f898061570d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509385525050506001600160401b0389166020808401829052604080850184905260608501929092526080840183905260a0909301829052868252600788019092522081518154829060ff1916600183600581111561442e5761442e614fad565b02179055506020820151600182019061444790826153f0565b5060408201516002820180546060850151608086015160a08701516001600160401b039586166001600160801b031990941693909317600160401b92861692909202919091176001600160801b0316600160801b918516919091026001600160c01b031617600160c01b9184169190910217905560c0909201516003909101805467ffffffffffffffff191691909216179055806144e5888061570d565b6040516144f39291906155ce565b6040518091039020847fb77297e3befc691bfc864a81e241f83e2ef722b6e7becaa2ecec250c6d52b430898b60400160208101906145319190614f2f565b604080516001600160401b0393841681529290911660208301520160405180910390a4509095945050505050565b5f80516020615add8339815191525f6001600160401b0380841690851611156145935761458c83856155fd565b90506145a0565b61459d84846155fd565b90505b6040805160808101825260028401548082526003850154602083015260048501549282019290925260058401546001600160401b03166060820152429115806146025750600184015481516145fe916001600160401b0316906154bf565b8210155b15614628576001600160401b038316606082015281815260408101516020820152614647565b828160600181815161463a91906155dd565b6001600160401b03169052505b60608101516146579060646157b8565b602082015160018601546001600160401b0392909216916146829190600160401b900460ff1661552d565b10156146b257606081015160405163dfae880160e01b81526001600160401b039091166004820152602401610631565b856001600160401b0316816040018181516146cd91906154bf565b9052506040810180516001600160401b03871691906146ed9083906156fa565b905250805160028501556020810151600385015560408101516004850155606001516005909301805467ffffffffffffffff19166001600160401b039094169390931790925550505050565b5f8181525f80516020615b1d8339815191526020526040812060020180545f80516020615add833981519152919060089061478390600160401b90046001600160401b0316615925565b91906101000a8154816001600160401b0302191690836001600160401b031602179055915050919050565b6147b66139c6565b6147be614c5c565b610f7581614c64565b6147cf6139c6565b613a0f614d4c565b6147df6139c6565b5f80516020615abd83398151915261ffff84161580614803575061271061ffff8516115b1561482757604051635f12e6c360e11b815261ffff85166004820152602401610631565b8587111561484b5760405163222d164360e21b815260048101889052602401610631565b60ff8316158061485e5750600a60ff8416115b156148815760405163170db35960e31b815260ff84166004820152602401610631565b95865560018601949094556002850180546001600160401b039490941669ffffffffffffffffffff1990941693909317600160401b61ffff93909316929092029190911767ffffffffffffffff60501b191660ff91909116600160501b02179055600390910180546001600160a01b0319166001600160a01b03909216919091179055565b6149136020820182614ed8565b63ffffffff16158015614933575061492e60208201826151a5565b151590505b1561497a576149456020820182614ed8565b61495260208301836151a5565b60405163c08a0f1d60e01b815263ffffffff9093166004840152602483015250604401610631565b61498760208201826151a5565b90506149966020830183614ed8565b63ffffffff1611156149af576149456020820182614ed8565b60015b6149bf60208301836151a5565b90508110156114da576149d560208301836151a5565b6149e06001846156fa565b8181106149ef576149ef6151ea565b9050602002016020810190614a04919061518a565b6001600160a01b0316614a1a60208401846151a5565b83818110614a2a57614a2a6151ea565b9050602002016020810190614a3f919061518a565b6001600160a01b03161015614a6757604051630dbc8d5f60e31b815260040160405180910390fd5b6001016149b2565b5f6060826040015151603014614a985760405163180ffa0d60e01b815260040160405180910390fd5b82516020808501518051604080880151606089015160808a01518051908701515193515f98614ad9988a986001989297929690959094909390929101615940565b60405160208183030381529060405290505f5b84608001516020015151811015614b4b57818560800151602001518281518110614b1857614b186151ea565b6020026020010151604051602001614b319291906159fa565b60408051601f198184030181529190529150600101614aec565b5060a0840151805160209182015151604051614b6b938593929101615a30565b60405160208183030381529060405290505f5b8460a001516020015151811015614bdd57818560a00151602001518281518110614baa57614baa6151ea565b6020026020010151604051602001614bc39291906159fa565b60408051601f198184030181529190529150600101614b7e565b5060c0840151604051614bf4918391602001615a6b565b6040516020818303038152906040529050600281604051614c15919061539b565b602060405180830381855afa158015614c30573d5f803e3d5ffd5b5050506040513d601f19601f82011682018060405250810190614c53919061515f565b94909350915050565b613a0f6139c6565b614c6c6139c6565b80355f80516020615add8339815191529081556014614c9160608401604085016157fc565b60ff161180614cb05750614cab60608301604084016157fc565b60ff16155b15614ce457614cc560608301604084016157fc565b604051634a59bbff60e11b815260ff9091166004820152602401610631565b614cf460608301604084016157fc565b60018201805460ff92909216600160401b0260ff60401b19909216919091179055614d256040830160208401614f2f565b600191909101805467ffffffffffffffff19166001600160401b0390921691909117905550565b612c146139c6565b508054614d609061510d565b5f825580601f10614d6f575050565b601f0160209004905f5260205f2090810190610f759190614dc8565b6040805160e08101909152805f81526060602082018190525f604083018190529082018190526080820181905260a0820181905260c09091015290565b5b80821115614ddc575f8155600101614dc9565b5090565b8015158114610f75575f80fd5b803563ffffffff811681146119ed575f80fd5b5f805f60608486031215614e12575f80fd5b833592506020840135614e2481614de0565b9150614e3260408501614ded565b90509250925092565b5f60208284031215614e4b575f80fd5b5035919050565b5f8060408385031215614e63575f80fd5b82356001600160401b03811115614e78575f80fd5b830160808186031215614e89575f80fd5b9150614e9760208401614ded565b90509250929050565b5f6101208284031215614eb1575f80fd5b50919050565b5f8060408385031215614ec8575f80fd5b82359150614e9760208401614ded565b5f60208284031215614ee8575f80fd5b61169482614ded565b5f8060408385031215614f02575f80fd5b614f0b83614ded565b946020939093013593505050565b80356001600160401b03811681146119ed575f80fd5b5f60208284031215614f3f575f80fd5b61169482614f19565b803561ffff811681146119ed575f80fd5b5f805f60608486031215614f6b575f80fd5b83356001600160401b03811115614f80575f80fd5b840160a08187031215614f91575f80fd5b9250614f9f60208501614f48565b9150614e3260408501614f19565b634e487b7160e01b5f52602160045260245ffd5b60068110614fd157614fd1614fad565b9052565b5f5b83811015614fef578181015183820152602001614fd7565b50505f910152565b5f815180845261500e816020860160208601614fd5565b601f01601f19169290920160200192915050565b60208152615034602082018351614fc1565b5f602083015160e0604084015261504f610100840182614ff7565b905060408401516001600160401b0380821660608601528060608701511660808601528060808701511660a08601528060a08701511660c08601528060c08701511660e086015250508091505092915050565b5f80602083850312156150b3575f80fd5b82356001600160401b03808211156150c9575f80fd5b818501915085601f8301126150dc575f80fd5b8135818111156150ea575f80fd5b8660208285010111156150fb575f80fd5b60209290920196919550909350505050565b600181811c9082168061512157607f821691505b602082108103614eb157634e487b7160e01b5f52602260045260245ffd5b60208101610ea58284614fc1565b602081525f6116946020830184614ff7565b5f6020828403121561516f575f80fd5b5051919050565b6001600160a01b0381168114610f75575f80fd5b5f6020828403121561519a575f80fd5b813561169481615176565b5f808335601e198436030181126151ba575f80fd5b8301803591506001600160401b038211156151d3575f80fd5b6020019150600581901b3603821315613813575f80fd5b634e487b7160e01b5f52603260045260245ffd5b5f8235605e19833603018112615212575f80fd5b9190910192915050565b634e487b7160e01b5f52604160045260245ffd5b604051606081016001600160401b03811182821017156152525761525261521c565b60405290565b604080519081016001600160401b03811182821017156152525761525261521c565b604051601f8201601f191681016001600160401b03811182821017156152a2576152a261521c565b604052919050565b5f6001600160401b038211156152c2576152c261521c565b50601f01601f191660200190565b5f82601f8301126152df575f80fd5b81356152f26152ed826152aa565b61527a565b818152846020838601011115615306575f80fd5b816020850160208301375f918101602001919091529392505050565b5f60608236031215615332575f80fd5b61533a615230565b82356001600160401b0380821115615350575f80fd5b61535c368387016152d0565b83526020850135915080821115615371575f80fd5b5061537e368286016152d0565b60208301525061539060408401614f19565b604082015292915050565b5f8251615212818460208701614fd5565b601f82111561063a57805f5260205f20601f840160051c810160208510156153d15750805b601f840160051c820191505b8181101561187d575f81556001016153dd565b81516001600160401b038111156154095761540961521c565b61541d81615417845461510d565b846153ac565b602080601f831160018114615450575f84156154395750858301515b5f19600386901b1c1916600185901b1785556110a7565b5f85815260208120601f198616915b8281101561547e5788860151825594840194600190910190840161545f565b508582101561549b57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ea557610ea56154ab565b5f63ffffffff8083168181036154ea576154ea6154ab565b6001019392505050565b5f8261550e57634e487b7160e01b5f52601260045260245ffd5b500490565b602081016004831061552757615527614fad565b91905290565b8082028115828204841417610ea557610ea56154ab565b5f60208083525f84546155568161510d565b806020870152604060018084165f81146155775760018114615593576155c0565b60ff19851660408a0152604084151560051b8a010195506155c0565b895f5260205f205f5b858110156155b75781548b820186015290830190880161559c565b8a016040019650505b509398975050505050505050565b818382375f9101908152919050565b6001600160401b03818116838216019080821115612001576120016154ab565b6001600160401b03828116828216039080821115612001576120016154ab565b80516119ed81614de0565b5f8060408385031215615639575f80fd5b82516001600160401b038082111561564f575f80fd5b9084019060608287031215615662575f80fd5b61566a615230565b8251815260208084015161567d81615176565b82820152604084015183811115615692575f80fd5b80850194505087601f8501126156a6575f80fd5b835192506156b66152ed846152aa565b83815288828587010111156156c9575f80fd5b6156d884838301848801614fd5565b806040840152508195506156ed81880161561d565b9450505050509250929050565b81810381811115610ea557610ea56154ab565b5f808335601e19843603018112615722575f80fd5b8301803591506001600160401b0382111561573b575f80fd5b602001915036819003821315613813575f80fd5b5f8851615760818460208d01614fd5565b60e089901b6001600160e01b031916908301908152868860048301378681019050600481015f8152858782375060c09390931b6001600160c01b0319166004939094019283019390935250600c019695505050505050565b6001600160401b038181168382160280821691908281146157db576157db6154ab565b505092915050565b5f602082840312156157f3575f80fd5b61169482614f48565b5f6020828403121561580c575f80fd5b813560ff81168114611694575f80fd5b5f8235603e19833603018112615212575f80fd5b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f6040823603121561586e575f80fd5b615876615258565b61587f83614ded565b81526020808401356001600160401b038082111561589b575f80fd5b9085019036601f8301126158ad575f80fd5b8135818111156158bf576158bf61521c565b8060051b91506158d084830161527a565b81815291830184019184810190368411156158e9575f80fd5b938501935b83851015615913578435925061590383615176565b82825293850193908501906158ee565b94860194909452509295945050505050565b5f6001600160401b038083168181036154ea576154ea6154ab565b61ffff60f01b8a60f01b1681525f63ffffffff60e01b808b60e01b166002840152896006840152808960e01b16602684015250865161598681602a850160208b01614fd5565b86519083019061599d81602a840160208b01614fd5565b60c087901b6001600160c01b031916602a92909101918201526159cf603282018660e01b6001600160e01b0319169052565b6159e8603682018560e01b6001600160e01b0319169052565b603a019b9a5050505050505050505050565b5f8351615a0b818460208801614fd5565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b5f8451615a41818460208901614fd5565b6001600160e01b031960e095861b8116919093019081529290931b16600482015260080192915050565b5f8351615a7c818460208801614fd5565b60c09390931b6001600160c01b031916919092019081526008019291505056fe4317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d054317713f7ecbdddd4bc99e95d903adedaa883b2e7c2551610bd13e2c7e473d00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00e92546d698950ddd38910d2e15ed1d923cd0a7b3dde9e2a6a3f380565559cb07a164736f6c6343000819000a", } // 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 e9f598152..20f8f3cf6 100644 --- a/contracts/validator-manager/PoSValidatorManager.sol +++ b/contracts/validator-manager/PoSValidatorManager.sol @@ -491,9 +491,19 @@ abstract contract PoSValidatorManager is if (delegator.status != DelegatorStatus.Active) { revert InvalidDelegatorStatus(delegator.status); } - // Only the delegation owner can end the delegation. + // Only the delegation owner or parent validator can end the delegation. if (delegator.owner != _msgSender()) { - revert UnauthorizedOwner(_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 { + revert UnauthorizedOwner(_msgSender()); + } } if (validator.status == ValidatorStatus.Active) { diff --git a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol index dc083471e..645b5f99e 100644 --- a/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol +++ b/contracts/validator-manager/tests/PoSValidatorManagerTests.t.sol @@ -392,7 +392,24 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + sender: DEFAULT_DELEGATOR_ADDRESS, + delegationID: delegationID, + startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, + endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, + expectedValidatorWeight: DEFAULT_WEIGHT, + expectedNonce: 2, + includeUptime: true, + force: false + }); + } + + function testInitializeEndDelegationByValidator() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + _initializeEndDelegationValidatorActiveWithChecks({ + validationID: validationID, + sender: address(this), delegationID: delegationID, startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, @@ -403,6 +420,25 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); } + function testInitializeEndDelegationByValidatorMinStakeDurationNotPassed() public { + bytes32 validationID = _registerDefaultValidator(); + bytes32 delegationID = _registerDefaultDelegator(validationID); + + uint64 invalidEndTime = DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP + 1 hours; + vm.expectRevert( + abi.encodeWithSelector( + PoSValidatorManager.MinStakeDurationNotPassed.selector, invalidEndTime + ) + ); + _initializeEndDelegation({ + sender: address(this), + delegationID: delegationID, + endDelegationTimestamp: invalidEndTime, + includeUptime: false, + force: false + }); + } + function testInitializeEndDelegationInsufficientUptime() public { bytes32 validationID = _registerDefaultValidator(); bytes32 delegationID = _registerDefaultDelegator(validationID); @@ -423,7 +459,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + sender: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, @@ -440,7 +476,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + sender: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, @@ -457,7 +493,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + sender: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, @@ -495,7 +531,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + sender: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, @@ -617,7 +653,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + sender: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, @@ -750,7 +786,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, - delegatorAddress: DEFAULT_DELEGATOR_ADDRESS, + sender: DEFAULT_DELEGATOR_ADDRESS, delegationID: delegationID, startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, @@ -820,7 +856,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Initialize end delegation for both delegators _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, - delegatorAddress: delegator1, + sender: delegator1, delegationID: delegationID1, startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, @@ -831,7 +867,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, - delegatorAddress: delegator2, + sender: delegator2, delegationID: delegationID2, startDelegationTimestamp: DEFAULT_DELEGATOR_INIT_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, @@ -882,7 +918,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { // Initialize end delegation for both delegators _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, - delegatorAddress: delegator1, + sender: delegator1, delegationID: delegationID1, startDelegationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP, @@ -893,7 +929,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { }); _initializeEndDelegationValidatorActiveWithChecks({ validationID: validationID, - delegatorAddress: delegator2, + sender: delegator2, delegationID: delegationID2, startDelegationTimestamp: DEFAULT_DELEGATOR_COMPLETE_REGISTRATION_TIMESTAMP, endDelegationTimestamp: DEFAULT_DELEGATOR_END_DELEGATION_TIMESTAMP + 1, @@ -1279,7 +1315,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _initializeEndDelegationValidatorActiveWithChecks( bytes32 validationID, - address delegatorAddress, + address sender, bytes32 delegationID, uint64 startDelegationTimestamp, uint64 endDelegationTimestamp, @@ -1301,7 +1337,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _initializeEndDelegationValidatorActive({ validationID: validationID, - delegatorAddress: delegatorAddress, + sender: sender, delegationID: delegationID, startDelegationTimestamp: startDelegationTimestamp, endDelegationTimestamp: endDelegationTimestamp, @@ -1314,7 +1350,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { function _initializeEndDelegationValidatorActive( bytes32 validationID, - address delegatorAddress, + address sender, bytes32 delegationID, uint64 startDelegationTimestamp, uint64 endDelegationTimestamp, @@ -1334,20 +1370,18 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest { _mockGetUptimeWarpMessage(uptimeMsg, true); _mockGetBlockchainID(); } - _initializeEndDelegation( - delegatorAddress, delegationID, endDelegationTimestamp, includeUptime, force - ); + _initializeEndDelegation(sender, delegationID, endDelegationTimestamp, includeUptime, force); } function _initializeEndDelegation( - address delegatorAddress, + address sender, bytes32 delegationID, uint64 endDelegationTimestamp, bool includeUptime, bool force ) internal { vm.warp(endDelegationTimestamp); - vm.prank(delegatorAddress); + vm.prank(sender); if (force) { posValidatorManager.forceInitializeEndDelegation(delegationID, includeUptime, 0); } else { From 2c756cddb724f854f03ec09947cefb2c26c23a93 Mon Sep 17 00:00:00 2001 From: cam-schultz Date: Tue, 15 Oct 2024 11:59:39 -0500 Subject: [PATCH 512/545] describe validator/delegator owner roles --- contracts/validator-manager/README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/contracts/validator-manager/README.md b/contracts/validator-manager/README.md index 18e5d5e4e..b618b0402 100644 --- a/contracts/validator-manager/README.md +++ b/contracts/validator-manager/README.md @@ -92,14 +92,14 @@ A `PoAValidatorManager` can later be converted to a `PoSValidatorManager` by upg ## Usage ### Register a Validator -Validator registration is initiated with a call to `initializeValidatorRegistration`. Churn limitations are checked - only a certain (configurable) percentage of the total weight is allowed to be added or removed in a (configurable) period of time. The `ValidatorManager` then constructs a [`RegisterSubnetValidatorMessage`](./MessageSpec.md#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each Validator registration request includes all of the information needed to identify the Validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. If the Validator is not registered on the P-Chain before the `expiry`, then the Validator may be removed from the contract state by calling `completeEndValidation`. +Validator registration is initiated with a call to `initializeValidatorRegistration`. The sender of this transaction is registered as the Validator owner. Churn limitations are checked - only a certain (configurable) percentage of the total weight is allowed to be added or removed in a (configurable) period of time. The `ValidatorManager` then constructs a [`RegisterSubnetValidatorMessage`](./MessageSpec.md#registersubnetvalidatormessage) Warp message to be sent to the P-Chain. Each Validator registration request includes all of the information needed to identify the Validator and its stake weight, as well as an `expiry` timestamp before which the `RegisterSubnetValidatorMessage` must be delivered to the P-Chain. If the Validator is not registered on the P-Chain before the `expiry`, then the Validator may be removed from the contract state by calling `completeEndValidation`. The `RegisterSubnetValidatorMessage` is delivered to the P-Chain as the Warp message payload of a [`RegisterSubnetValidatorTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#registersubnetvalidatortx). Please see the transaction [specification](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#step-2-issue-a-registersubnetvalidatortx-on-the-p-chain) for validity requirements. The P-Chain then signs a [`SubnetValidatorRegistrationMessage`](./MessageSpec.md#subnetvalidatorregistrationmessage) Warp message indicating that the specified Validator was successfully registered on the P-Chain. The `SubnetValidatorRegistrationMessage` is delivered to the `ValidatorManager` via a call to `completeValidatorRegistration`. For PoS Validator Managers, staking rewards begin accruing at this time. ### Remove a Validator -Validator exit is initiated with a call to `initializeEndValidation` on the `ValidatorManager` , For `PoSValidatorManagers` a [`ValidationUptimeMessage`](./MessageSpec.md#validationuptimemessage) Warp message may optionally be provided in order to calculate the staking rewards; otherwise the latest received uptime will be used (see [(PoS only) Submit and Uptime Proof](#pos-only-submit-an-uptime-proof)). This proof may be requested directly from the Subnet Validators, which will provide it in a `ValidationUptimeMessage` Warp message. If the uptime is not sufficient to earn Validation rewards, the call to `initializeEndValidation` will fail. `forceInitializeEndValidation` acts the same as `initializeEndValidation`, but bypasses the uptime-based rewards check. Once `initializeEndValidation` or `forceInitializeEndValidation` is called, staking rewards cease accruing for `PoSValidatorManagers`. +Validator exit is initiated with a call to `initializeEndValidation` on the `ValidatorManager`. Only the Validator owner may initiate exit. For `PoSValidatorManagers` a [`ValidationUptimeMessage`](./MessageSpec.md#validationuptimemessage) Warp message may optionally be provided in order to calculate the staking rewards; otherwise the latest received uptime will be used (see [(PoS only) Submit and Uptime Proof](#pos-only-submit-an-uptime-proof)). This proof may be requested directly from the Subnet Validators, which will provide it in a `ValidationUptimeMessage` Warp message. If the uptime is not sufficient to earn Validation rewards, the call to `initializeEndValidation` will fail. `forceInitializeEndValidation` acts the same as `initializeEndValidation`, but bypasses the uptime-based rewards check. Once `initializeEndValidation` or `forceInitializeEndValidation` is called, staking rewards cease accruing for `PoSValidatorManagers`. The `ValidatorManager` contructs a [`SetSubnetValidatorWeightMessage`](./MessageSpec.md#setsubnetvalidatorweightmessage) Warp message with the weight set to `0`. This is delivered to the P-Chain as the payload of a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The P-Chain acknowledges Validator exit by signing a `SubnetValidatorRegistrationMessage` with `valid=0`, which is delivered to the `ValidatorManager` by calling `completeEndValidation`. The Validation is removed from the contract's state, and for `PoSValidatorManagers`, staking rewards are disbursed and stake is returned. @@ -111,7 +111,7 @@ Disabled Subnet Validators can re-activate at any time by increasing their balan ### (PoS only) Register a Delegator -`PoSValidatorManager` supports Delegation to an active Validator as a way for users to earn staking rewards without having to validate the chain. Delegators pay a configurable percentage fee on any earned staking rewards to the host Validator. A Delegator may be registered by calling `initializeDelegatorRegistration` and providing an amount to stake. The Delegator will be registered as long as churn restrictions are not violated. The Delegator is reflected on the P-Chain by adjusting the Validator's registered weight via a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The weight change acknowledgement is delivered to the `PoSValidatorManager` via a [`SubnetValidatorWeightUpdateMessage`](./MessageSpec.md#subnetvalidatorweightupdatemessage), which is provided by calling `completeDelegatorRegistration`. +`PoSValidatorManager` supports Delegation to an active Validator as a way for users to earn staking rewards without having to validate the chain. Delegators pay a configurable percentage fee on any earned staking rewards to the host Validator. A Delegator may be registered by calling `initializeDelegatorRegistration` and providing an amount to stake. The sender of this transaction is registered as the Delegator owner. The Delegator will be registered as long as churn restrictions are not violated. The Delegator is reflected on the P-Chain by adjusting the Validator's registered weight via a [`SetSubnetValidatorWeightTx`](https://github.com/avalanche-foundation/ACPs/tree/main/ACPs/77-reinventing-subnets#setsubnetvalidatorweighttx). The weight change acknowledgement is delivered to the `PoSValidatorManager` via a [`SubnetValidatorWeightUpdateMessage`](./MessageSpec.md#subnetvalidatorweightupdatemessage), which is provided by calling `completeDelegatorRegistration`. > [!NOTE] > The P-Chain is only willing to sign a `SubnetValidatorWeightUpdateMessage` for an active Validator. Once Validator exit has been initiated (via a call to `initializeEndValidation`), the `PoSValidatorManager` must assume that the Validator has been deactivated on the P-Chain, and will therefore not sign any further weight updates. Therefore, it is invalid to _initiate_ adding or removing a Delegator when the Validator is in this state, though it _may be_ valid to _complete_ an already initiated Delegator action, depending on the order of delivery to the P-Chain. If the Delegator weight change was submitted (and a Warp signature on the acknowledgement retrieved) before the Validator was removed, then the Delegator action may be completed. Otherwise, the acknowledgement of the Validation end must first be delivered before completing the Delegator action. @@ -120,6 +120,8 @@ Disabled Subnet Validators can re-activate at any time by increasing their balan Delegators removal may be initiated by calling `initializeEndDelegation`, as long as churn restrictions are not violated. Similar to `initializeEndValidation`, an uptime proof may be provided to be used to determine Delegator rewards eligibility. If no proof is provided, the latest known uptime will be used (see [(PoS only) Submit and Uptime Proof](#pos-only-submit-an-uptime-proof)). The Validator's weight is updated on the P-Chain by the same mechanism used to register a Delegator. The `SubnetValidatorWeightUpdateMessage` from the P-Chain is delivered to the `PoSValidatorManager` in the call to `completeEndDelegation`. +Either the Delegator owner or the Validator owner may initiate removing a Delegator. This is to prevent the Validator from being unable to remove itself due to churn limitations if it is has too high a proportion of the Subnet's total weight due to Delegator additions. The Validator owner may only remove Delegators after the minimum stake duration has elapsed. + ### (PoS only) Submit an Uptime Proof The [rewards calculater](./interfaces/IRewardCalculator.sol) is a function of uptime seconds since the Validator's start time. In addition to doing so in the calls to `initializeEndValidation` and `initializeEndDelegation` as described above, uptime proofs may also be supplied by calling `submitUptimeProof`. Unlike `initializeEndValidation` and `initializeEndDelegation`, `submitUptimeProof` may be called by anyone, decreasing the likelihood of a Validation or Delegation not being able to claim rewards that it deserved based on its actual uptime. From 59114e5fd5469d508ded39ebeeb257837df4e31f Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 17 Oct 2024 20:59:02 -0400 Subject: [PATCH 513/545] 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 514/545] 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 515/545] 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 516/545] 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 517/545] 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 518/545] 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 519/545] 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 520/545] 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 521/545] 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 522/545] 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 523/545] 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 524/545] 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 525/545] 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 526/545] 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 527/545] 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 528/545] 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 529/545] 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 530/545] 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 531/545] 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 532/545] 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 533/545] 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 534/545] 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 535/545] 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 536/545] 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 537/545] 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 538/545] 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 539/545] 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 540/545] 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 541/545] 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 542/545] 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 543/545] 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 544/545] 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 545/545] 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